diff --git a/.gitmodules b/.gitmodules index d3824a75ff8..8a1e0cc6aa4 100644 --- a/.gitmodules +++ b/.gitmodules @@ -2,33 +2,28 @@ update = none path = lib/linux_x64 url = https://projects.blender.org/blender/lib-linux_x64.git - branch = main + branch = blender-v4.1-release [submodule "lib/macos_arm64"] update = none path = lib/macos_arm64 url = https://projects.blender.org/blender/lib-macos_arm64.git - branch = main + branch = blender-v4.1-release [submodule "lib/macos_x64"] update = none path = lib/macos_x64 url = https://projects.blender.org/blender/lib-macos_x64.git - branch = main + branch = blender-v4.1-release [submodule "lib/windows_x64"] update = none path = lib/windows_x64 url = https://projects.blender.org/blender/lib-windows_x64.git - branch = main -[submodule "lib/windows_arm64"] - update = none - path = lib/windows_arm64 - url = https://projects.blender.org/blender/lib-windows_arm64.git - branch = main + branch = blender-v4.1-release [submodule "release/datafiles/assets"] path = release/datafiles/assets url = https://projects.blender.org/blender/blender-assets.git - branch = main + branch = blender-v4.1-release [submodule "tests/data"] update = none path = tests/data url = https://projects.blender.org/blender/blender-test-data.git - branch = main + branch = blender-v4.1-release diff --git a/AUTHORS b/AUTHORS index 2ec143438b9..86b4fae9188 100644 --- a/AUTHORS +++ b/AUTHORS @@ -29,7 +29,6 @@ Aditya Y Jeppu Adrian Bibby Walther Adrian Newton AgAmemnno -Ahmad Rifai Aidan Davey Aidan Haile Alan Babu @@ -103,7 +102,6 @@ Aurel Wildfellner Aurelien Jarno Azeem Bande-Ali Baardaap -Bartosz Kosiorek Bartosz Moniewski Bassam Kurdali Bastien Montagne @@ -237,7 +235,6 @@ Fulk33 Fynn Grotehans Félix Gaia Clary -Gangneron Garry R. Osgood Gavin Li Geoffrey Bantle @@ -546,7 +543,6 @@ Pierre Risch Pierrick Bouvier Piotr Makal Piotr Ostrowski -Prakhar Singh Chouhan Pratik Borhade Prikshit singh Quentin Wenger @@ -587,7 +583,6 @@ Ryan Inch S J Bennett (quollism) Sahar A. Kashi Sam Miller -Samuel Bilek Sandy Carter Sayak Biswas Scott Petrovic @@ -695,7 +690,6 @@ Willian Padovani Germano Wouter Wouter van Heyst Wybren van Keulen -XDzZyq Xavier Cho Xavier Hallade Xavier Thomas @@ -739,7 +733,6 @@ nBurn nutti ok_what persun -rifai.id swann unclezeiv yves diff --git a/CMakeLists.txt b/CMakeLists.txt index c98b2d6a3e2..b53a5d42e9b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -84,11 +84,6 @@ if(POLICY CMP0074) cmake_policy(SET CMP0074 NEW) endif() -# find_package() uses uppercase _ROOT variables. -if(POLICY CMP0144) - cmake_policy(SET CMP0144 NEW) -endif() - # Install CODE|SCRIPT allow the use of generator expressions. if(POLICY CMP0087) cmake_policy(SET CMP0087 NEW) @@ -129,7 +124,7 @@ elseif(CMAKE_C_COMPILER_ID MATCHES "Clang") The minimum supported version of CLANG is 8.0, found ${CMAKE_C_COMPILER_VERSION}" ) endif() -elseif(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") +elseif(CMAKE_CXX_COMPILER_ID MATCHES MSVC) if(MSVC_VERSION VERSION_LESS "1928") # MSVC_VERSION is an internal version number, it doesn't map to something # the end user would recognize as a version. Because of this, for MSVC we do @@ -264,28 +259,6 @@ else() set(WITH_UNITY_BUILD OFF) endif() -if(COMMAND target_precompile_headers) - # Disabling is needed for `./tools/utils_maintenance/code_clean.py` to function. - option(WITH_COMPILER_PRECOMPILED_HEADERS "\ -Use pre-compiled headers to speed up compilation." - ON - ) - mark_as_advanced(WITH_COMPILER_PRECOMPILED_HEADERS) - - if(WITH_CLANG_TIDY AND CMAKE_COMPILER_IS_GNUCC) - if(WITH_COMPILER_PRECOMPILED_HEADERS) - message(STATUS - "Clang-Tidy and GCC precompiled headers are incompatible, disabling precompiled headers" - ) - set(WITH_COMPILER_PRECOMPILED_HEADERS OFF) - endif() - endif() - - if(NOT WITH_COMPILER_PRECOMPILED_HEADERS) - set(CMAKE_DISABLE_PRECOMPILE_HEADERS ON) - endif() -endif() - option(WITH_IK_ITASC "\ Enable ITASC IK solver (only disable for development & for incompatible C++ compilers)" ON @@ -414,18 +387,6 @@ else() set(WITH_SYSTEM_EIGEN3 OFF) endif() -if((NOT WITH_PYTHON_MODULE) AND ( - (WIN32 AND (CMAKE_SYSTEM_PROCESSOR STREQUAL "AMD64")) OR - ((UNIX AND NOT APPLE) AND (CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64")))) - option(WITH_CPU_CHECK "\ -Report when a CPU is not compatible on startup \ -instead of failing to start with an inscrutable error." - ON - ) - mark_as_advanced(WITH_CPU_CHECK) -else() - set(WITH_CPU_CHECK OFF) -endif() # Modifiers option(WITH_MOD_FLUID "Enable Mantaflow Fluid Simulation Framework" ON) @@ -439,6 +400,7 @@ option(WITH_IMAGE_CINEON "Enable CINEON and DPX Image Support" ON) option(WITH_IMAGE_WEBP "Enable WebP Image Support" ON) # Audio/Video format support +option(WITH_CODEC_AVI "Enable Blenders own AVI file support (raw/jpeg)" ON) option(WITH_CODEC_FFMPEG "Enable FFMPeg Support (http://ffmpeg.org)" ON) option(WITH_CODEC_SNDFILE "Enable libsndfile Support (http://www.mega-nerd.com/libsndfile)" ON) @@ -645,7 +607,7 @@ mark_as_advanced(WITH_CYCLES_PRECOMPUTE) mark_as_advanced(CYCLES_TEST_DEVICES) # NVIDIA CUDA & OptiX -if(NOT APPLE AND NOT (WIN32 AND CMAKE_SYSTEM_PROCESSOR STREQUAL "ARM64")) +if(NOT APPLE) option(WITH_CYCLES_DEVICE_CUDA "Enable Cycles NVIDIA CUDA compute support" ON) option(WITH_CYCLES_DEVICE_OPTIX "Enable Cycles NVIDIA OptiX support" ON) mark_as_advanced(WITH_CYCLES_DEVICE_CUDA) @@ -680,7 +642,7 @@ When set, this path will be used at runtime to compile OptiX kernels." endif() # AMD HIP -if(NOT APPLE AND NOT (WIN32 AND CMAKE_SYSTEM_PROCESSOR STREQUAL "ARM64")) +if(NOT APPLE) option(WITH_CYCLES_DEVICE_HIP "Enable Cycles AMD HIP support" ON) option(WITH_CYCLES_HIP_BINARIES "Build Cycles AMD HIP binaries" OFF) # Radeon VII (gfx906) not currently working with HIP SDK, so left out of the list. @@ -707,7 +669,7 @@ if(APPLE) endif() # oneAPI -if(NOT APPLE AND NOT (WIN32 AND CMAKE_SYSTEM_PROCESSOR STREQUAL "ARM64")) +if(NOT APPLE) option(WITH_CYCLES_DEVICE_ONEAPI "Enable Cycles oneAPI compute support" OFF) option(WITH_CYCLES_ONEAPI_BINARIES "\ Enable Ahead-Of-Time compilation for Cycles oneAPI device" @@ -786,10 +748,8 @@ if(WIN32) option(WITH_TBB_MALLOC_PROXY "Enable the TBB malloc replacement" ON) endif() -option(WITH_EXPERIMENTAL_FEATURES "Enable experimental features" ON) - # This should be turned off when Blender enter beta/rc/release -if("${BLENDER_VERSION_CYCLE}" STREQUAL "alpha" AND WITH_EXPERIMENTAL_FEATURES) +if("${BLENDER_VERSION_CYCLE}" STREQUAL "alpha") set(WITH_EXPERIMENTAL_FEATURES ON) else() set(WITH_EXPERIMENTAL_FEATURES OFF) @@ -797,19 +757,9 @@ endif() # Unit testing option(WITH_GTESTS "Enable GTest unit testing" OFF) -option(WITH_GPU_RENDER_TESTS "\ -Enable GPU render related unit testing (EEVEE, Workbench and Grease Pencil)" - OFF -) -option(WITH_GPU_RENDER_TESTS_SILENT "\ -Run GPU render tests silently (finished tests will pass). \ -Generated report will show failing tests" - ON -) -option(WITH_GPU_DRAW_TESTS "\ -Enable GPU drawing related unit testing (GPU backends and draw manager)" - OFF -) +option(WITH_GPU_RENDER_TESTS "Enable GPU render related unit testing (EEVEE, Workbench and Grease Pencil)" OFF) +option(WITH_GPU_RENDER_TESTS_SILENT "Run GPU render tests silently (finished tests will pass). Generated report will show failing tests" ON) +option(WITH_GPU_DRAW_TESTS "Enable GPU drawing related unit testing (GPU backends and draw manager)" OFF) option(WITH_COMPOSITOR_REALTIME_TESTS "Enable regression testing for realtime compositor" OFF) if(UNIX AND NOT (APPLE OR HAIKU)) option(WITH_UI_TESTS "\ @@ -826,10 +776,7 @@ endif() # Enabled by default for typical use cases to speed up development cycles. However, when looking # into threading or memory related issues (in dependency graph, out-of-bounds, etc) forcing single # test per Blender instance could give much better clues about the root of the problem. -option(WITH_TESTS_BATCHED "\ -Run multiple tests in a single Blender invocation, for faster test execution" - ON -) +option(WITH_TESTS_BATCHED "Run multiple tests in a single Blender invocation, for faster test execution" ON) mark_as_advanced(WITH_TESTS_BATCHED) option(WITH_TESTS_SINGLE_BINARY "\ @@ -1367,7 +1314,7 @@ if(NOT CMAKE_BUILD_TYPE MATCHES "Release") # affect on the printed backtrace, and exception handling was correct as well. # # Related discussion: - # https://stackoverflow.com/questions/26300819 + # https://stackoverflow.com/questions/26300819/why-gcc-compiled-c-program-needs-eh-frame-section add_compile_options("$<${_is_CONFIG_DEBUG}:-fno-unwind-tables>") add_compile_options("$<${_is_CONFIG_DEBUG}:-fno-asynchronous-unwind-tables>") @@ -1688,14 +1635,12 @@ if("${CMAKE_GENERATOR}" MATCHES "Ninja" AND WITH_NINJA_POOL_JOBS) # but this also accounts for the part of the physical RAM being used by other unrelated # processes on the system, and the part being used by the 'regular' compile and linking jobs. # - # Also always cap heavy jobs amount to `number of available threads - 1`, - # to ensure that even if there would be enough RAM, the machine never ends up - # handling only heavy jobs at some point. - # This can have annoying sides effects, like lack of output in the console for several - # minutes, which can lead to a wrong detection of 'unresponsive' state by the build-bots e.g. + # Also always cap heavy jobs amount to `number of available threads - 1`, to ensure that even if + # there would be enough RAM, the machine never ends up handling only heavy jobs at some point. + # This can have annoying sides effects, like lack of output in the console for several minutes, + # which can lead to a wrong detection of 'unresponsive' state by the buildbots e.g. # - # Currently, these settings applied to a 64GB/16threads linux machine will use, - # for a full build: + # Currently, these settings applied to a 64GB/16threads linux machine will use, for a full build: # - release build: # * RAM: typically less than 20%, with some peaks at 25%. # * CPU: over 90% of usage on average over the whole build time. @@ -1942,7 +1887,6 @@ if(CMAKE_COMPILER_IS_GNUCC) endif() elseif(CMAKE_C_COMPILER_ID MATCHES "Clang") - # Matches both "Clang" & "AppleClang" on macOS. add_check_c_compiler_flags( C_WARNINGS @@ -2050,7 +1994,7 @@ elseif(CMAKE_C_COMPILER_ID MATCHES "Clang") CXX_WARN_NO_UNDEF_PREFIX -Wno-undef-prefix ) -elseif(CMAKE_C_COMPILER_ID STREQUAL "Intel") +elseif(CMAKE_C_COMPILER_ID MATCHES "Intel") add_check_c_compiler_flags( C_WARNINGS @@ -2071,7 +2015,7 @@ elseif(CMAKE_C_COMPILER_ID STREQUAL "Intel") # Disable numbered, false positives. string(APPEND C_WARNINGS " -wd188,186,144,913,556,858,597,177,1292,167,279,592,94,2722,3199") string(APPEND CXX_WARNINGS " -wd188,186,144,913,556,858,597,177,1292,167,279,592,94,2722,3199") -elseif(CMAKE_C_COMPILER_ID STREQUAL "MSVC") +elseif(CMAKE_C_COMPILER_ID MATCHES "MSVC") # most msvc warnings are C & C++ set(_WARNINGS # warning level: @@ -2158,12 +2102,19 @@ set(CMAKE_CXX_STANDARD_REQUIRED ON) # Do not enable compiler specific language extensions. set(CMAKE_CXX_EXTENSIONS OFF) +# Make MSVC properly report the value of the __cplusplus preprocessor macro +# Available MSVC 15.7 (1914) and up, without this it reports 199711L regardless +# of the C++ standard chosen above. +if(MSVC) + string(APPEND CMAKE_CXX_FLAGS " /Zc:__cplusplus") +endif() + # Visual Studio has all standards it supports available by default # Clang on windows copies this behavior and does not support these switches if( CMAKE_COMPILER_IS_GNUCC OR (CMAKE_C_COMPILER_ID MATCHES "Clang" AND (NOT MSVC)) OR - (CMAKE_C_COMPILER_ID STREQUAL "Intel") + (CMAKE_C_COMPILER_ID MATCHES "Intel") ) # Use C11 + GNU extensions, works with GCC, Clang, ICC string(APPEND CMAKE_C_FLAGS " -std=gnu11") @@ -2429,6 +2380,7 @@ if(FIRST_RUN) info_cfg_option(WITH_IMAGE_OPENJPEG) info_cfg_text("Audio:") + info_cfg_option(WITH_CODEC_AVI) info_cfg_option(WITH_CODEC_FFMPEG) info_cfg_option(WITH_CODEC_SNDFILE) info_cfg_option(WITH_COREAUDIO) diff --git a/GNUmakefile b/GNUmakefile index 2f569df144a..7e7a0922aea 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -532,7 +532,7 @@ check_spelling_shaders: .FORCE "$(BLENDER_DIR)/source/" check_descriptions: .FORCE - @$(BLENDER_BIN) --background --factory-startup --python \ + @$(BLENDER_BIN) --background -noaudio --factory-startup --python \ "$(BLENDER_DIR)/tools/check_source/check_descriptions.py" check_deprecated: .FORCE @@ -595,7 +595,7 @@ format: .FORCE doc_py: .FORCE @ASAN_OPTIONS=halt_on_error=0:${ASAN_OPTIONS} \ $(BLENDER_BIN) \ - --background --factory-startup \ + --background -noaudio --factory-startup \ --python doc/python_api/sphinx_doc_gen.py @sphinx-build -b html -j $(NPROCS) doc/python_api/sphinx-in doc/python_api/sphinx-out @echo "docs written into: '$(BLENDER_DIR)/doc/python_api/sphinx-out/index.html'" @@ -606,7 +606,7 @@ doc_doxy: .FORCE doc_dna: .FORCE @$(BLENDER_BIN) \ - --background --factory-startup \ + --background -noaudio --factory-startup \ --python doc/blender_file_format/BlendFileDnaExporter_25.py @echo "docs written into: '$(BLENDER_DIR)/doc/blender_file_format/dna.html'" diff --git a/build_files/build_environment/CMakeLists.txt b/build_files/build_environment/CMakeLists.txt index 2e3f922a63f..e2098186d34 100644 --- a/build_files/build_environment/CMakeLists.txt +++ b/build_files/build_environment/CMakeLists.txt @@ -100,10 +100,8 @@ include(cmake/fribidi.cmake) include(cmake/harfbuzz.cmake) if(NOT APPLE) include(cmake/xr_openxr.cmake) - if(NOT BLENDER_PLATFORM_WINDOWS_ARM) - include(cmake/dpcpp.cmake) - include(cmake/dpcpp_deps.cmake) - endif() + include(cmake/dpcpp.cmake) + include(cmake/dpcpp_deps.cmake) if(NOT WIN32) include(cmake/igc.cmake) include(cmake/gmmlib.cmake) @@ -111,20 +109,13 @@ if(NOT APPLE) endif() endif() include(cmake/ispc.cmake) -if(NOT BLENDER_PLATFORM_WINDOWS_ARM) - include(cmake/openpgl.cmake) -endif() # Embree needs to be included after dpcpp as it uses it for compiling with GPU support -if(BLENDER_PLATFORM_WINDOWS_ARM) - # WoA needs embree to be built with the VS Generator + LLVM, - # put it in its own file to avoid clutter. - include(cmake/embree_windows_arm.cmake) -else() - include(cmake/embree.cmake) -endif() +include(cmake/embree.cmake) +include(cmake/openpgl.cmake) include(cmake/fmt.cmake) include(cmake/robinmap.cmake) include(cmake/xml2.cmake) + # OpenColorIO and dependencies. include(cmake/expat.cmake) include(cmake/pystring.cmake) diff --git a/build_files/build_environment/cmake/alembic.cmake b/build_files/build_environment/cmake/alembic.cmake index 42241c3ce9a..af36b977e4b 100644 --- a/build_files/build_environment/cmake/alembic.cmake +++ b/build_files/build_environment/cmake/alembic.cmake @@ -21,32 +21,20 @@ ExternalProject_Add(external_alembic URL_HASH ${ALEMBIC_HASH_TYPE}=${ALEMBIC_HASH} CMAKE_GENERATOR ${PLATFORM_ALT_GENERATOR} PREFIX ${BUILD_DIR}/alembic - - CMAKE_ARGS - -DCMAKE_INSTALL_PREFIX=${LIBDIR}/alembic - -Wno-dev - ${DEFAULT_CMAKE_FLAGS} - ${ALEMBIC_EXTRA_ARGS} - + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/alembic -Wno-dev ${DEFAULT_CMAKE_FLAGS} ${ALEMBIC_EXTRA_ARGS} INSTALL_DIR ${LIBDIR}/alembic ) if(WIN32) if(BUILD_MODE STREQUAL Release) ExternalProject_Add_Step(external_alembic after_install - COMMAND ${CMAKE_COMMAND} -E copy_directory - ${LIBDIR}/alembic - ${HARVEST_TARGET}/alembic - + COMMAND ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/alembic ${HARVEST_TARGET}/alembic DEPENDEES install ) endif() if(BUILD_MODE STREQUAL Debug) ExternalProject_Add_Step(external_alembic after_install - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/alembic/lib/alembic.lib - ${HARVEST_TARGET}/alembic/lib/alembic_d.lib - + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/alembic/lib/alembic.lib ${HARVEST_TARGET}/alembic/lib/alembic_d.lib DEPENDEES install ) endif() diff --git a/build_files/build_environment/cmake/aom.cmake b/build_files/build_environment/cmake/aom.cmake index 8f65c7afd4b..91db1cd5253 100644 --- a/build_files/build_environment/cmake/aom.cmake +++ b/build_files/build_environment/cmake/aom.cmake @@ -2,9 +2,7 @@ # # SPDX-License-Identifier: GPL-2.0-or-later -if(BLENDER_PLATFORM_WINDOWS_ARM) - set(AOM_EXTRA_ARGS_WIN32 -DAOM_TARGET_CPU=generic) -else() +if(NOT WIN32) set(AOM_CMAKE_FLAGS ${DEFAULT_CMAKE_FLAGS}) endif() @@ -26,19 +24,10 @@ ExternalProject_Add(external_aom DOWNLOAD_DIR ${DOWNLOAD_DIR} URL_HASH ${AOM_HASH_TYPE}=${AOM_HASH} PREFIX ${BUILD_DIR}/aom - - PATCH_COMMAND ${PATCH_CMD} --verbose -p 1 -N -d - ${BUILD_DIR}/aom/src/external_aom < - ${PATCH_DIR}/aom.diff - + PATCH_COMMAND ${PATCH_CMD} --verbose -p 1 -N -d ${BUILD_DIR}/aom/src/external_aom < ${PATCH_DIR}/aom.diff CONFIGURE_COMMAND ${CONFIGURE_ENV} && cd ${BUILD_DIR}/aom/src/external_aom-build/ && - ${CMAKE_COMMAND} - -DCMAKE_INSTALL_PREFIX=${LIBDIR}/aom - ${AOM_CMAKE_FLAGS} - ${AOM_EXTRA_ARGS} - ${BUILD_DIR}/aom/src/external_aom/ - + ${CMAKE_COMMAND} -DCMAKE_INSTALL_PREFIX=${LIBDIR}/aom ${AOM_CMAKE_FLAGS} ${AOM_EXTRA_ARGS} ${BUILD_DIR}/aom/src/external_aom/ BUILD_COMMAND ${CMAKE_COMMAND} --build . INSTALL_COMMAND ${CMAKE_COMMAND} --build . --target install INSTALL_DIR ${LIBDIR}/aom diff --git a/build_files/build_environment/cmake/blosc.cmake b/build_files/build_environment/cmake/blosc.cmake index d84f652e698..42679f8d4eb 100644 --- a/build_files/build_environment/cmake/blosc.cmake +++ b/build_files/build_environment/cmake/blosc.cmake @@ -26,12 +26,7 @@ ExternalProject_Add(external_blosc DOWNLOAD_DIR ${DOWNLOAD_DIR} URL_HASH ${BLOSC_HASH_TYPE}=${BLOSC_HASH} PREFIX ${BUILD_DIR}/blosc - - CMAKE_ARGS - -DCMAKE_INSTALL_PREFIX=${LIBDIR}/blosc - ${DEFAULT_CMAKE_FLAGS} - ${BLOSC_EXTRA_ARGS} - + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/blosc ${DEFAULT_CMAKE_FLAGS} ${BLOSC_EXTRA_ARGS} INSTALL_DIR ${LIBDIR}/blosc ) diff --git a/build_files/build_environment/cmake/boost.cmake b/build_files/build_environment/cmake/boost.cmake index a09775112c0..03182d4e679 100644 --- a/build_files/build_environment/cmake/boost.cmake +++ b/build_files/build_environment/cmake/boost.cmake @@ -16,29 +16,14 @@ if(WIN32) else() list(APPEND BOOST_BUILD_OPTIONS variant=release) endif() - set(BOOST_HARVEST_CMD - ${CMAKE_COMMAND} -E copy_directory - ${LIBDIR}/boost/lib/ - ${HARVEST_TARGET}/boost/lib/ - ) + set(BOOST_HARVEST_CMD ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/boost/lib/ ${HARVEST_TARGET}/boost/lib/) if(BUILD_MODE STREQUAL Release) - set(BOOST_HARVEST_CMD - ${BOOST_HARVEST_CMD} && - ${CMAKE_COMMAND} -E copy_directory - ${LIBDIR}/boost/include/boost-${BOOST_VERSION_NODOTS_SHORT}/ - ${HARVEST_TARGET}/boost/include/ - ) + set(BOOST_HARVEST_CMD ${BOOST_HARVEST_CMD} && ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/boost/include/boost-${BOOST_VERSION_NODOTS_SHORT}/ ${HARVEST_TARGET}/boost/include/) endif() elseif(APPLE) set(BOOST_CONFIGURE_COMMAND ./bootstrap.sh) set(BOOST_BUILD_COMMAND ./b2) - set(BOOST_BUILD_OPTIONS - toolset=clang-darwin - cxxflags=${PLATFORM_CXXFLAGS} - linkflags=${PLATFORM_LDFLAGS} - visibility=global - --disable-icu boost.locale.icu=off - ) + set(BOOST_BUILD_OPTIONS toolset=clang-darwin cxxflags=${PLATFORM_CXXFLAGS} linkflags=${PLATFORM_LDFLAGS} visibility=global --disable-icu boost.locale.icu=off) set(BOOST_HARVEST_CMD echo .) else() set(BOOST_HARVEST_CMD echo .) @@ -87,25 +72,9 @@ ExternalProject_Add(external_boost URL_HASH ${BOOST_HASH_TYPE}=${BOOST_HASH} PREFIX ${BUILD_DIR}/boost UPDATE_COMMAND "" - - PATCH_COMMAND ${PATCH_CMD} -p 1 -d - ${BUILD_DIR}/boost/src/external_boost < - ${PATCH_DIR}/boost.diff - + PATCH_COMMAND ${PATCH_CMD} -p 1 -d ${BUILD_DIR}/boost/src/external_boost < ${PATCH_DIR}/boost.diff CONFIGURE_COMMAND ${BOOST_CONFIGURE_COMMAND} - - BUILD_COMMAND - ${BOOST_BUILD_COMMAND} - ${BOOST_BUILD_OPTIONS} - -j${MAKE_THREADS} - architecture=${BOOST_ARCHITECTURE} - address-model=${BOOST_ADDRESS_MODEL} - link=shared - threading=multi - ${BOOST_OPTIONS} - --prefix=${LIBDIR}/boost - install - + BUILD_COMMAND ${BOOST_BUILD_COMMAND} ${BOOST_BUILD_OPTIONS} -j${MAKE_THREADS} architecture=${BOOST_ARCHITECTURE} address-model=${BOOST_ADDRESS_MODEL} link=shared threading=multi ${BOOST_OPTIONS} --prefix=${LIBDIR}/boost install BUILD_IN_SOURCE 1 INSTALL_COMMAND "${BOOST_HARVEST_CMD}" ) diff --git a/build_files/build_environment/cmake/boost_build_options.cmake b/build_files/build_environment/cmake/boost_build_options.cmake index b4fe14b9b97..656827bec4b 100644 --- a/build_files/build_environment/cmake/boost_build_options.cmake +++ b/build_files/build_environment/cmake/boost_build_options.cmake @@ -10,10 +10,7 @@ else() endif() if(WIN32) - if(MSVC_TOOLSET_VERSION GREATER_EQUAL 143) # 2022 - set(BOOST_TOOLSET toolset=msvc-14.3) - set(BOOST_COMPILER_STRING -vc143) - elseif(MSVC_TOOLSET_VERSION GREATER_EQUAL 142) # 2019 + if(MSVC_VERSION GREATER_EQUAL 1920) # 2019 set(BOOST_TOOLSET toolset=msvc-14.2) set(BOOST_COMPILER_STRING -vc142) else() # 2017 diff --git a/build_files/build_environment/cmake/brotli.cmake b/build_files/build_environment/cmake/brotli.cmake index 2258804f969..495999a50e2 100644 --- a/build_files/build_environment/cmake/brotli.cmake +++ b/build_files/build_environment/cmake/brotli.cmake @@ -10,27 +10,15 @@ ExternalProject_Add(external_brotli DOWNLOAD_DIR ${DOWNLOAD_DIR} URL_HASH ${BROTLI_HASH_TYPE}=${BROTLI_HASH} PREFIX ${BUILD_DIR}/brotli - - CMAKE_ARGS - -DCMAKE_INSTALL_PREFIX=${LIBDIR}/brotli - ${DEFAULT_CMAKE_FLAGS} - ${BROTLI_EXTRA_ARGS} - + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/brotli ${DEFAULT_CMAKE_FLAGS} ${BROTLI_EXTRA_ARGS} INSTALL_DIR ${LIBDIR}/brotli ) if(BUILD_MODE STREQUAL Release AND WIN32) ExternalProject_Add_Step(external_brotli after_install - COMMAND ${CMAKE_COMMAND} -E copy_directory - ${LIBDIR}/brotli/include - ${HARVEST_TARGET}/brotli/include - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/brotli/lib/brotlidec-static${LIBEXT} - ${HARVEST_TARGET}/brotli/lib/brotlidec-static${LIBEXT} - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/brotli/lib/brotlicommon-static${LIBEXT} - ${HARVEST_TARGET}/brotli/lib/brotlicommon-static${LIBEXT} - + COMMAND ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/brotli/include ${HARVEST_TARGET}/brotli/include + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/brotli/lib/brotlidec-static${LIBEXT} ${HARVEST_TARGET}/brotli/lib/brotlidec-static${LIBEXT} + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/brotli/lib/brotlicommon-static${LIBEXT} ${HARVEST_TARGET}/brotli/lib/brotlicommon-static${LIBEXT} DEPENDEES install ) endif() diff --git a/build_files/build_environment/cmake/bzip2.cmake b/build_files/build_environment/cmake/bzip2.cmake index 75731579db1..f0a8a3c4931 100644 --- a/build_files/build_environment/cmake/bzip2.cmake +++ b/build_files/build_environment/cmake/bzip2.cmake @@ -9,12 +9,8 @@ set(BZIP2_CONFIGURATION_ARGS) if(UNIX AND NOT APPLE) set(BZIP2_LDFLAGS "-Wl,--as-needed") set(BZIP2_CFLAGS "-fPIC -Wall -Winline -O2 -g -D_FILE_OFFSET_BITS=64") - set(BZIP2_CONFIGURE_ENV - ${BZIP2_CONFIGURE_ENV} && - export LDFLAGS=${BZIP2_LDFLAGS} && - export CFLAGS=${BZIP2_CFLAGS} && - export PREFIX=${BZIP2_PREFIX} - ) + set(BZIP2_CONFIGURE_ENV ${BZIP2_CONFIGURE_ENV} && export LDFLAGS=${BZIP2_LDFLAGS} && export CFLAGS=${BZIP2_CFLAGS} + && export PREFIX=${BZIP2_PREFIX}) else() set(BZIP2_CONFIGURE_ENV ${CONFIGURE_ENV}) endif() @@ -25,14 +21,7 @@ ExternalProject_Add(external_bzip2 URL_HASH ${BZIP2_HASH_TYPE}=${BZIP2_HASH} PREFIX ${BUILD_DIR}/bzip2 CONFIGURE_COMMAND echo . - - BUILD_COMMAND ${BZIP2_CONFIGURE_ENV} && - cd ${BUILD_DIR}/bzip2/src/external_bzip2/ && - make CFLAGS=${BZIP2_CFLAGS} LDFLAGS=${BZIP2_LDFLAGS} -j${MAKE_THREADS} - - INSTALL_COMMAND ${BZIP2_CONFIGURE_ENV} && - cd ${BUILD_DIR}/bzip2/src/external_bzip2/ && - make CFLAGS=${BZIP2_CFLAGS} LDFLAGS=${BZIP2_LDFLAGS} PREFIX=${BZIP2_PREFIX} install - + BUILD_COMMAND ${BZIP2_CONFIGURE_ENV} && cd ${BUILD_DIR}/bzip2/src/external_bzip2/ && make CFLAGS=${BZIP2_CFLAGS} LDFLAGS=${BZIP2_LDFLAGS} -j${MAKE_THREADS} + INSTALL_COMMAND ${BZIP2_CONFIGURE_ENV} && cd ${BUILD_DIR}/bzip2/src/external_bzip2/ && make CFLAGS=${BZIP2_CFLAGS} LDFLAGS=${BZIP2_LDFLAGS} PREFIX=${BZIP2_PREFIX} install INSTALL_DIR ${LIBDIR}/bzip2 ) diff --git a/build_files/build_environment/cmake/deflate.cmake b/build_files/build_environment/cmake/deflate.cmake index 31e7f297f9a..ba08652c523 100644 --- a/build_files/build_environment/cmake/deflate.cmake +++ b/build_files/build_environment/cmake/deflate.cmake @@ -13,11 +13,6 @@ ExternalProject_Add(external_deflate URL_HASH ${DEFLATE_HASH_TYPE}=${DEFLATE_HASH} PREFIX ${BUILD_DIR}/deflate CMAKE_GENERATOR ${PLATFORM_ALT_GENERATOR} - - CMAKE_ARGS - -DCMAKE_INSTALL_PREFIX=${LIBDIR}/deflate - ${DEFAULT_CMAKE_FLAGS} - ${DEFLATE_EXTRA_ARGS} - + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/deflate ${DEFAULT_CMAKE_FLAGS} ${DEFLATE_EXTRA_ARGS} INSTALL_DIR ${LIBDIR}/deflate ) diff --git a/build_files/build_environment/cmake/deps_html.cmake b/build_files/build_environment/cmake/deps_html.cmake index eaa3006bbf1..e26935cc516 100644 --- a/build_files/build_environment/cmake/deps_html.cmake +++ b/build_files/build_environment/cmake/deps_html.cmake @@ -15,8 +15,7 @@ foreach(_variableName ${_variableNames}) # First see if DEP_HOMEPAGE is set, if it is use that. set(DEP_HOMEPAGE ${${DEP_NAME}_HOMEPAGE}) if(NOT DEP_HOMEPAGE) - # If the xxx_HOMEPAGE is not set but the URI for the archive is a known github format - # extract the repository/project from the URI. + # If the xxx_HOMEPAGE is not set but the URI for the archive is a known github format extract the reprository/project from the URI string(REGEX MATCH "https:\/\/(.*)github\.com\/(.+)\/(archive|releases|release|tar.gz)\/(.*)" DEP_PROJECT "${${_variableName}}") if(CMAKE_MATCH_2) set(DEP_HOMEPAGE "https://www.github.com/${CMAKE_MATCH_2}") diff --git a/build_files/build_environment/cmake/download.cmake b/build_files/build_environment/cmake/download.cmake index 26f6d908efc..f566fa520c7 100644 --- a/build_files/build_environment/cmake/download.cmake +++ b/build_files/build_environment/cmake/download.cmake @@ -3,7 +3,7 @@ # SPDX-License-Identifier: GPL-2.0-or-later ## Update and uncomment this in the release branch -# set(BLENDER_VERSION 3.1) +set(BLENDER_VERSION 4.1) function(download_source dep) set(TARGET_FILE ${${dep}_FILE}) diff --git a/build_files/build_environment/cmake/dpcpp.cmake b/build_files/build_environment/cmake/dpcpp.cmake index 6a2bad8f4d8..a689648cce9 100644 --- a/build_files/build_environment/cmake/dpcpp.cmake +++ b/build_files/build_environment/cmake/dpcpp.cmake @@ -89,23 +89,14 @@ ExternalProject_Add(external_dpcpp CMAKE_GENERATOR ${LLVM_GENERATOR} SOURCE_SUBDIR llvm LIST_SEPARATOR ^^ - - CMAKE_ARGS - -DCMAKE_INSTALL_PREFIX=${LIBDIR}/dpcpp - ${DPCPP_CMAKE_FLAGS} - ${DPCPP_EXTRA_ARGS} - + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/dpcpp ${DPCPP_CMAKE_FLAGS} ${DPCPP_EXTRA_ARGS} # CONFIGURE_COMMAND # ${PYTHON_BINARY} # ${BUILD_DIR}/dpcpp/src/external_dpcpp/buildbot/configure.py ${DPCPP_CONFIGURE_ARGS} # BUILD_COMMAND # echo "." # ${PYTHON_BINARY} ${BUILD_DIR}/dpcpp/src/external_dpcpp/buildbot/compile.py INSTALL_COMMAND ${CMAKE_COMMAND} --build . -- deploy-sycl-toolchain - - PATCH_COMMAND ${PATCH_CMD} -p 1 -d - ${BUILD_DIR}/dpcpp/src/external_dpcpp < - ${PATCH_DIR}/dpcpp.diff - + PATCH_COMMAND ${PATCH_CMD} -p 1 -d ${BUILD_DIR}/dpcpp/src/external_dpcpp < ${PATCH_DIR}/dpcpp.diff INSTALL_DIR ${LIBDIR}/dpcpp ) diff --git a/build_files/build_environment/cmake/embree.cmake b/build_files/build_environment/cmake/embree.cmake index 0c503173d05..9f462cbe3d3 100644 --- a/build_files/build_environment/cmake/embree.cmake +++ b/build_files/build_environment/cmake/embree.cmake @@ -86,16 +86,8 @@ ExternalProject_Add(external_embree URL_HASH ${EMBREE_HASH_TYPE}=${EMBREE_HASH} CMAKE_GENERATOR ${PLATFORM_ALT_GENERATOR} 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 - ${EMBREE_CMAKE_FLAGS} - ${EMBREE_EXTRA_ARGS} - + PATCH_COMMAND ${PATCH_CMD} -p 1 -d ${BUILD_DIR}/embree/src/external_embree < ${PATCH_DIR}/embree.diff + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/embree ${EMBREE_CMAKE_FLAGS} ${EMBREE_EXTRA_ARGS} INSTALL_DIR ${LIBDIR}/embree ) @@ -115,33 +107,17 @@ endif() if(WIN32) if(BUILD_MODE STREQUAL Release) ExternalProject_Add_Step(external_embree after_install - COMMAND ${CMAKE_COMMAND} -E copy_directory - ${LIBDIR}/embree/include - ${HARVEST_TARGET}/embree/include - COMMAND ${CMAKE_COMMAND} -E copy_directory - ${LIBDIR}/embree/lib - ${HARVEST_TARGET}/embree/lib - COMMAND ${CMAKE_COMMAND} -E copy_directory - ${LIBDIR}/embree/share - ${HARVEST_TARGET}/embree/share - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/embree/bin/embree4.dll - ${HARVEST_TARGET}/embree/bin/embree4.dll - + COMMAND ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/embree/include ${HARVEST_TARGET}/embree/include + COMMAND ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/embree/lib ${HARVEST_TARGET}/embree/lib + COMMAND ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/embree/share ${HARVEST_TARGET}/embree/share + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/embree/bin/embree4.dll ${HARVEST_TARGET}/embree/bin/embree4.dll DEPENDEES install ) else() ExternalProject_Add_Step(external_embree after_install - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/embree/bin/embree4_d.dll - ${HARVEST_TARGET}/embree/bin/embree4_d.dll - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/embree/lib/embree4_d.lib - ${HARVEST_TARGET}/embree/lib/embree4_d.lib - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/embree/lib/embree4_sycl_d.lib - ${HARVEST_TARGET}/embree/lib/embree4_sycl_d.lib - + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/embree/bin/embree4_d.dll ${HARVEST_TARGET}/embree/bin/embree4_d.dll + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/embree/lib/embree4_d.lib ${HARVEST_TARGET}/embree/lib/embree4_d.lib + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/embree/lib/embree4_sycl_d.lib ${HARVEST_TARGET}/embree/lib/embree4_sycl_d.lib DEPENDEES install ) endif() diff --git a/build_files/build_environment/cmake/embree_windows_arm.cmake b/build_files/build_environment/cmake/embree_windows_arm.cmake deleted file mode 100644 index c3b54ba1c5d..00000000000 --- a/build_files/build_environment/cmake/embree_windows_arm.cmake +++ /dev/null @@ -1,142 +0,0 @@ -# SPDX-FileCopyrightText: 2017-2023 Blender Authors -# -# SPDX-License-Identifier: GPL-2.0-or-later - -# Note the utility apps may use png/tiff/gif system libraries, but the -# library itself does not depend on them, so should give no problems. - -set(EMBREE_CMAKE_FLAGS ${DEFAULT_CMAKE_FLAGS}) - -set(EMBREE_EXTRA_ARGS - -DEMBREE_ISPC_SUPPORT=OFF - -DEMBREE_TUTORIALS=OFF - -DEMBREE_STATIC_LIB=OFF - -DEMBREE_RAY_MASK=ON - -DEMBREE_FILTER_FUNCTION=ON - -DEMBREE_BACKFACE_CULLING=OFF - -DEMBREE_BACKFACE_CULLING_CURVES=ON - -DEMBREE_BACKFACE_CULLING_SPHERES=ON - -DEMBREE_NO_SPLASH=ON - -DEMBREE_TASKING_SYSTEM=TBB - -DEMBREE_TBB_ROOT=${LIBDIR}/tbb - -DTBB_ROOT=${LIBDIR}/tbb -) - -set(EMBREE_EXTRA_ARGS - ${EMBREE_EXTRA_ARGS} - -DCMAKE_DEBUG_POSTFIX=_d -) - -set(EMBREE_LLVM_INSTALL_PATH ${LIBDIR}/llvm) - -set(EMBREE_CMAKE_FLAGS - -DCMAKE_BUILD_TYPE=${BUILD_MODE} -) -set(EMBREE_EXTRA_ARGS - -DCMAKE_CXX_COMPILER=${EMBREE_LLVM_INSTALL_PATH}/bin/clang-cl.exe - -DCMAKE_C_COMPILER=${EMBREE_LLVM_INSTALL_PATH}/bin/clang-cl.exe - -DCMAKE_C_FLAGS_INIT="--target=arm64-pc-windows-msvc" - -DCMAKE_CXX_FLAGS_INIT="--target=arm64-pc-windows-msvc" - -DCMAKE_SHARED_LINKER_FLAGS=-L"${LIBDIR}/llvm/lib" - ${EMBREE_EXTRA_ARGS} -) - -# We want the VS2019 tools for embree, as they are stable. -# We cannot use VS2022 easily, unless we specify an older (unsupported) toolset such as 17.35, -# as the newer toolsets mandate LLVM 16, which we cannot use currently, -# due to lack of support in OSL and ISPC. -set(EMBREE_VCTOOLS_REQUIRED_VERSION 14.29) - -# Extract the list of installed tools that match the required version from the -# `VCToolsInstallDir` env var -file(TO_CMAKE_PATH $ENV{VCToolsInstallDir} EMBREE_VCTOOLSINSTALLDIR_PATH) -cmake_path(GET EMBREE_VCTOOLSINSTALLDIR_PATH PARENT_PATH EMBREE_VCTOOLSDIR_PATH) -file(GLOB EMBREE_INSTALLED_VCTOOLS RELATIVE ${EMBREE_VCTOOLSDIR_PATH} ${EMBREE_VCTOOLSDIR_PATH}/${EMBREE_VCTOOLS_REQUIRED_VERSION}*) - -# Check that at least one the installed tool versions -# (there may be different subversions) is present. -if(NOT EMBREE_INSTALLED_VCTOOLS) - message(FATAL_ERROR "When building for Windows ARM64 platforms, embree requires VC Tools ${EMBREE_VCTOOLS_REQUIRED_VERSION} to be installed alongside the current version.") -endif() - -# Get the last item in the list (latest, when list is sorted) -list(SORT EMBREE_INSTALLED_VCTOOLS) -list(GET EMBREE_INSTALLED_VCTOOLS -1 EMBREE_VCTOOLS_VERSION) - -# Configure our in file and temporarily store it in the build dir -# (with modified extension so nothing else picks it up) -# This feels icky, but boost does something similar, and we haven't called -# `ExternalProject_Add` yet, so the embree dir does not yet exist. -configure_file( - ${PATCH_DIR}/embree_Directory.Build.Props.in - ${BUILD_DIR}/embree_Directory.Build.Props_temp -) - -# Update the patch command to copy the configured build props file in -set(EMBREE_PATCH_COMMAND - COMMAND ${CMAKE_COMMAND} -E copy - ${BUILD_DIR}/embree_Directory.Build.Props_temp - ${BUILD_DIR}/embree/src/external_embree-build/Directory.Build.Props && - ${PATCH_CMD} -p 1 -d ${BUILD_DIR}/embree/src/external_embree < ${PATCH_DIR}/embree.diff -) - -# This all only works if we use the VS generator (with `clangcl` toolset), so switch back to that -# Note: there is literally no way to get ninja to use a different toolset other than manually -# overwriting every env var, or calling a nested `vcvarsall`, both of which are *messy*. -set(EMBREE_GENERATOR ${CMAKE_GENERATOR}) -set(EMBREE_GENERATOR_TOOLSET ClangCL) - -if(TBB_STATIC_LIBRARY) - set(EMBREE_EXTRA_ARGS - ${EMBREE_EXTRA_ARGS} - -DEMBREE_TBB_COMPONENT=tbb_static - ) -endif() - -ExternalProject_Add(external_embree - URL file://${PACKAGE_DIR}/${EMBREE_FILE} - DOWNLOAD_DIR ${DOWNLOAD_DIR} - URL_HASH ${EMBREE_HASH_TYPE}=${EMBREE_HASH} - CMAKE_GENERATOR ${EMBREE_GENERATOR} - CMAKE_GENERATOR_TOOLSET ${EMBREE_GENERATOR_TOOLSET} - PREFIX ${BUILD_DIR}/embree - PATCH_COMMAND ${EMBREE_PATCH_COMMAND} - CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/embree ${EMBREE_CMAKE_FLAGS} ${EMBREE_EXTRA_ARGS} - INSTALL_DIR ${LIBDIR}/embree -) - -add_dependencies( - external_embree - external_tbb - ll -) - -if(BUILD_MODE STREQUAL Release) - ExternalProject_Add_Step(external_embree after_install - COMMAND ${CMAKE_COMMAND} -E copy_directory - ${LIBDIR}/embree/include - ${HARVEST_TARGET}/embree/include - COMMAND ${CMAKE_COMMAND} -E copy_directory - ${LIBDIR}/embree/lib - ${HARVEST_TARGET}/embree/lib - COMMAND ${CMAKE_COMMAND} -E copy_directory - ${LIBDIR}/embree/share - ${HARVEST_TARGET}/embree/share - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/embree/bin/embree4.dll - ${HARVEST_TARGET}/embree/bin/embree4.dll - - DEPENDEES install - ) -else() - ExternalProject_Add_Step(external_embree after_install - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/embree/bin/embree4_d.dll - ${HARVEST_TARGET}/embree/bin/embree4_d.dll - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/embree/lib/embree4_d.lib - ${HARVEST_TARGET}/embree/lib/embree4_d.lib - - DEPENDEES install - ) -endif() diff --git a/build_files/build_environment/cmake/epoxy.cmake b/build_files/build_environment/cmake/epoxy.cmake index f11b07bd626..cac688d6d5e 100644 --- a/build_files/build_environment/cmake/epoxy.cmake +++ b/build_files/build_environment/cmake/epoxy.cmake @@ -12,35 +12,17 @@ ExternalProject_Add(external_epoxy DOWNLOAD_DIR ${DOWNLOAD_DIR} URL_HASH ${EPOXY_HASH_TYPE}=${EPOXY_HASH} PREFIX ${BUILD_DIR}/epoxy - - PATCH_COMMAND ${PATCH_CMD} -p 1 -N -d - ${BUILD_DIR}/epoxy/src/external_epoxy/ < - ${PATCH_DIR}/epoxy.diff - - CONFIGURE_COMMAND ${CONFIGURE_ENV} && - ${MESON} setup - --prefix ${LIBDIR}/epoxy - --default-library ${EPOXY_LIB_TYPE} - --libdir lib - ${BUILD_DIR}/epoxy/src/external_epoxy-build - ${BUILD_DIR}/epoxy/src/external_epoxy - -Dtests=false ${MESON_BUILD_TYPE} - + PATCH_COMMAND ${PATCH_CMD} -p 1 -N -d ${BUILD_DIR}/epoxy/src/external_epoxy/ < ${PATCH_DIR}/epoxy.diff + CONFIGURE_COMMAND ${CONFIGURE_ENV} && ${MESON} setup --prefix ${LIBDIR}/epoxy --default-library ${EPOXY_LIB_TYPE} --libdir lib ${BUILD_DIR}/epoxy/src/external_epoxy-build ${BUILD_DIR}/epoxy/src/external_epoxy -Dtests=false ${MESON_BUILD_TYPE} BUILD_COMMAND ninja INSTALL_COMMAND ninja install ) if(BUILD_MODE STREQUAL Release AND WIN32) ExternalProject_Add_Step(external_epoxy after_install - COMMAND ${CMAKE_COMMAND} -E copy_directory - ${LIBDIR}/epoxy/include - ${HARVEST_TARGET}/epoxy/include - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/epoxy/bin/epoxy-0.dll - ${HARVEST_TARGET}/epoxy/bin/epoxy-0.dll - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/epoxy/lib/epoxy.lib - ${HARVEST_TARGET}/epoxy/lib/epoxy.lib + COMMAND ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/epoxy/include ${HARVEST_TARGET}/epoxy/include + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/epoxy/bin/epoxy-0.dll ${HARVEST_TARGET}/epoxy/bin/epoxy-0.dll + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/epoxy/lib/epoxy.lib ${HARVEST_TARGET}/epoxy/lib/epoxy.lib DEPENDEES install ) endif() diff --git a/build_files/build_environment/cmake/expat.cmake b/build_files/build_environment/cmake/expat.cmake index a8ba72828c6..da3f76ceaa8 100644 --- a/build_files/build_environment/cmake/expat.cmake +++ b/build_files/build_environment/cmake/expat.cmake @@ -15,12 +15,7 @@ ExternalProject_Add(external_expat DOWNLOAD_DIR ${DOWNLOAD_DIR} URL_HASH ${EXPAT_HASH_TYPE}=${EXPAT_HASH} PREFIX ${BUILD_DIR}/expat - - CMAKE_ARGS - -DCMAKE_INSTALL_PREFIX=${LIBDIR}/expat - ${DEFAULT_CMAKE_FLAGS} - ${EXPAT_EXTRA_ARGS} - + 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/ffi.cmake b/build_files/build_environment/cmake/ffi.cmake index aac186af961..89deb00eb50 100644 --- a/build_files/build_environment/cmake/ffi.cmake +++ b/build_files/build_environment/cmake/ffi.cmake @@ -7,36 +7,20 @@ ExternalProject_Add(external_ffi URL_HASH ${FFI_HASH_TYPE}=${FFI_HASH} DOWNLOAD_DIR ${DOWNLOAD_DIR} PREFIX ${BUILD_DIR}/ffi - - CONFIGURE_COMMAND ${CONFIGURE_ENV} && - cd ${BUILD_DIR}/ffi/src/external_ffi/ && - ${CONFIGURE_COMMAND} --prefix=${LIBDIR}/ffi - --enable-shared=no - --enable-static=yes - --with-pic - --libdir=${LIBDIR}/ffi/lib/ - - BUILD_COMMAND ${CONFIGURE_ENV} && - cd ${BUILD_DIR}/ffi/src/external_ffi/ && - make -j${MAKE_THREADS} - - INSTALL_COMMAND ${CONFIGURE_ENV} && - cd ${BUILD_DIR}/ffi/src/external_ffi/ && - make install - - PATCH_COMMAND ${PATCH_CMD} -p 0 -d - ${BUILD_DIR}/ffi/src/external_ffi < - ${PATCH_DIR}/ffi.diff - + CONFIGURE_COMMAND ${CONFIGURE_ENV} && cd ${BUILD_DIR}/ffi/src/external_ffi/ && ${CONFIGURE_COMMAND} --prefix=${LIBDIR}/ffi + --enable-shared=no + --enable-static=yes + --with-pic + --libdir=${LIBDIR}/ffi/lib/ + BUILD_COMMAND ${CONFIGURE_ENV} && cd ${BUILD_DIR}/ffi/src/external_ffi/ && make -j${MAKE_THREADS} + INSTALL_COMMAND ${CONFIGURE_ENV} && cd ${BUILD_DIR}/ffi/src/external_ffi/ && make install + PATCH_COMMAND ${PATCH_CMD} -p 0 -d ${BUILD_DIR}/ffi/src/external_ffi < ${PATCH_DIR}/ffi.diff INSTALL_DIR ${LIBDIR}/ffi ) if(UNIX AND NOT APPLE) ExternalProject_Add_Step(external_ffi after_install - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/ffi/lib/libffi.a - ${LIBDIR}/ffi/lib/libffi_pic.a - + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/ffi/lib/libffi.a ${LIBDIR}/ffi/lib/libffi_pic.a DEPENDEES install ) endif() diff --git a/build_files/build_environment/cmake/ffmpeg.cmake b/build_files/build_environment/cmake/ffmpeg.cmake index e7785c44ed2..61c6057ec56 100644 --- a/build_files/build_environment/cmake/ffmpeg.cmake +++ b/build_files/build_environment/cmake/ffmpeg.cmake @@ -149,76 +149,61 @@ ExternalProject_Add(external_ffmpeg URL file://${PACKAGE_DIR}/${FFMPEG_FILE} DOWNLOAD_DIR ${DOWNLOAD_DIR} URL_HASH ${FFMPEG_HASH_TYPE}=${FFMPEG_HASH} - - PATCH_COMMAND ${PATCH_CMD} --verbose -p 1 -N -d - ${BUILD_DIR}/ffmpeg/src/external_ffmpeg < - ${FFMPEG_PATCH_FILE} - + PATCH_COMMAND ${PATCH_CMD} --verbose -p 1 -N -d ${BUILD_DIR}/ffmpeg/src/external_ffmpeg < ${FFMPEG_PATCH_FILE} PREFIX ${BUILD_DIR}/ffmpeg - CONFIGURE_COMMAND ${FFMPEG_CONFIGURE_COMMAND} && cd ${BUILD_DIR}/ffmpeg/src/external_ffmpeg/ && ${FFMPEG_ENV} ${CONFIGURE_COMMAND_NO_TARGET} ${FFMPEG_EXTRA_FLAGS} - --disable-lzma - --disable-avfilter - --disable-vdpau - --disable-bzlib - --disable-libgsm - --disable-libspeex - --enable-libvpx - --enable-libopus - --prefix=${LIBDIR}/ffmpeg - --enable-libtheora - --enable-libvorbis - --enable-zlib - --enable-stripping - --enable-runtime-cpudetect - --disable-vaapi - --disable-nonfree - --enable-gpl - --disable-postproc - --enable-libmp3lame - --disable-librtmp - --enable-libx264 - --enable-libaom - --disable-libopencore-amrnb - --disable-libopencore-amrwb - --disable-libdc1394 - --disable-version3 - --disable-debug - --enable-optimizations - --enable-ffplay - --disable-openssl - --disable-securetransport - --disable-indev=avfoundation - --disable-indev=qtkit - --disable-sdl2 - --disable-gnutls - --disable-videotoolbox - --disable-libxcb - --disable-xlib - --disable-audiotoolbox - --disable-cuvid - --disable-nvenc - --disable-indev=jack - --disable-indev=alsa - --disable-outdev=alsa - --disable-crystalhd - --disable-sndio - --disable-doc - - BUILD_COMMAND ${FFMPEG_CONFIGURE_COMMAND} && - cd ${BUILD_DIR}/ffmpeg/src/external_ffmpeg/ && - make -j${MAKE_THREADS} - - INSTALL_COMMAND ${FFMPEG_CONFIGURE_COMMAND} && - cd ${BUILD_DIR}/ffmpeg/src/external_ffmpeg/ && - make install - - CMAKE_ARGS - -DCMAKE_INSTALL_PREFIX=${LIBDIR}/ffmpeg - ${DEFAULT_CMAKE_FLAGS} - + --disable-lzma + --disable-avfilter + --disable-vdpau + --disable-bzlib + --disable-libgsm + --disable-libspeex + --enable-libvpx + --enable-libopus + --prefix=${LIBDIR}/ffmpeg + --enable-libtheora + --enable-libvorbis + --enable-zlib + --enable-stripping + --enable-runtime-cpudetect + --disable-vaapi + --disable-nonfree + --enable-gpl + --disable-postproc + --enable-libmp3lame + --disable-librtmp + --enable-libx264 + --enable-libaom + --disable-libopencore-amrnb + --disable-libopencore-amrwb + --disable-libdc1394 + --disable-version3 + --disable-debug + --enable-optimizations + --enable-ffplay + --disable-openssl + --disable-securetransport + --disable-indev=avfoundation + --disable-indev=qtkit + --disable-sdl2 + --disable-gnutls + --disable-videotoolbox + --disable-libxcb + --disable-xlib + --disable-audiotoolbox + --disable-cuvid + --disable-nvenc + --disable-indev=jack + --disable-indev=alsa + --disable-outdev=alsa + --disable-crystalhd + --disable-sndio + --disable-doc + BUILD_COMMAND ${FFMPEG_CONFIGURE_COMMAND} && cd ${BUILD_DIR}/ffmpeg/src/external_ffmpeg/ && make -j${MAKE_THREADS} + INSTALL_COMMAND ${FFMPEG_CONFIGURE_COMMAND} && cd ${BUILD_DIR}/ffmpeg/src/external_ffmpeg/ && make install + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/ffmpeg ${DEFAULT_CMAKE_FLAGS} INSTALL_DIR ${LIBDIR}/ffmpeg ) @@ -257,13 +242,8 @@ endif() if(BUILD_MODE STREQUAL Release AND WIN32) ExternalProject_Add_Step(external_ffmpeg after_install - COMMAND ${CMAKE_COMMAND} -E copy_directory - ${LIBDIR}/ffmpeg/include - ${HARVEST_TARGET}/ffmpeg/include - COMMAND ${CMAKE_COMMAND} -E copy_directory - ${LIBDIR}/ffmpeg/bin - ${HARVEST_TARGET}/ffmpeg/lib - + COMMAND ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/ffmpeg/include ${HARVEST_TARGET}/ffmpeg/include + COMMAND ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/ffmpeg/bin ${HARVEST_TARGET}/ffmpeg/lib DEPENDEES install ) endif() diff --git a/build_files/build_environment/cmake/fftw.cmake b/build_files/build_environment/cmake/fftw.cmake index 426c4bd5096..e495c176ff0 100644 --- a/build_files/build_environment/cmake/fftw.cmake +++ b/build_files/build_environment/cmake/fftw.cmake @@ -15,11 +15,7 @@ macro(fftw_build FFTW_POSTFIX) DOWNLOAD_DIR ${DOWNLOAD_DIR} URL_HASH ${FFTW_HASH_TYPE}=${FFTW_HASH} PREFIX ${BUILD_DIR}/fftw3 - - CMAKE_ARGS - -DCMAKE_INSTALL_PREFIX=${LIBDIR}/fftw3 - ${FFTW_EXTRA_ARGS} - + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/fftw3 ${FFTW_EXTRA_ARGS} INSTALL_DIR ${LIBDIR}/fftw3 ) else() @@ -30,19 +26,9 @@ macro(fftw_build FFTW_POSTFIX) DOWNLOAD_DIR ${DOWNLOAD_DIR} URL_HASH ${FFTW_HASH_TYPE}=${FFTW_HASH} PREFIX ${BUILD_DIR}/fftw3 - - CONFIGURE_COMMAND ${CONFIGURE_ENV} && - cd ${BUILD_DIR}/fftw3/src/external_fftw3_${FFTW_POSTFIX}/ && - ${CONFIGURE_COMMAND} ${FFTW_EXTRA_ARGS} ${ARGN} --prefix=${mingw_LIBDIR}/fftw3 - - BUILD_COMMAND ${CONFIGURE_ENV} && - cd ${BUILD_DIR}/fftw3/src/external_fftw3_${FFTW_POSTFIX}/ && - make -j${MAKE_THREADS} - - INSTALL_COMMAND ${CONFIGURE_ENV} && - cd ${BUILD_DIR}/fftw3/src/external_fftw3_${FFTW_POSTFIX}/ && - make ${FFTW_INSTALL} - + CONFIGURE_COMMAND ${CONFIGURE_ENV} && cd ${BUILD_DIR}/fftw3/src/external_fftw3_${FFTW_POSTFIX}/ && ${CONFIGURE_COMMAND} ${FFTW_EXTRA_ARGS} ${ARGN} --prefix=${mingw_LIBDIR}/fftw3 + BUILD_COMMAND ${CONFIGURE_ENV} && cd ${BUILD_DIR}/fftw3/src/external_fftw3_${FFTW_POSTFIX}/ && make -j${MAKE_THREADS} + INSTALL_COMMAND ${CONFIGURE_ENV} && cd ${BUILD_DIR}/fftw3/src/external_fftw3_${FFTW_POSTFIX}/ && make ${FFTW_INSTALL} INSTALL_DIR ${LIBDIR}/fftw3 ) endif() @@ -54,24 +40,14 @@ fftw_build(float --enable-float) if(MSVC) if(BUILD_MODE STREQUAL Release) ExternalProject_Add_Step(external_fftw3_double after_install - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/fftw3/lib/fftw3.lib - ${HARVEST_TARGET}/fftw3/lib/fftw3.lib - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/fftw3/bin/fftw3.dll - ${HARVEST_TARGET}/fftw3/lib/fftw3.dll - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/fftw3/include/fftw3.h - ${HARVEST_TARGET}/fftw3/include/fftw3.h + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/fftw3/lib/fftw3.lib ${HARVEST_TARGET}/fftw3/lib/fftw3.lib + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/fftw3/bin/fftw3.dll ${HARVEST_TARGET}/fftw3/lib/fftw3.dll + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/fftw3/include/fftw3.h ${HARVEST_TARGET}/fftw3/include/fftw3.h DEPENDEES install ) ExternalProject_Add_Step(external_fftw3_float after_install - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/fftw3/lib/fftw3f.lib - ${HARVEST_TARGET}/fftw3/lib/fftw3f.lib - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/fftw3/bin/fftw3f.dll - ${HARVEST_TARGET}/fftw3/lib/fftw3f.dll + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/fftw3/lib/fftw3f.lib ${HARVEST_TARGET}/fftw3/lib/fftw3f.lib + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/fftw3/bin/fftw3f.dll ${HARVEST_TARGET}/fftw3/lib/fftw3f.dll DEPENDEES install ) endif() diff --git a/build_files/build_environment/cmake/flac.cmake b/build_files/build_environment/cmake/flac.cmake index fb50a6cd119..13c2064f5f8 100644 --- a/build_files/build_environment/cmake/flac.cmake +++ b/build_files/build_environment/cmake/flac.cmake @@ -8,19 +8,9 @@ if(NOT WIN32) DOWNLOAD_DIR ${DOWNLOAD_DIR} URL_HASH ${FLAC_HASH_TYPE}=${FLAC_HASH} PREFIX ${BUILD_DIR}/flac - - CONFIGURE_COMMAND ${CONFIGURE_ENV} && - cd ${BUILD_DIR}/flac/src/external_flac/ && - ${CONFIGURE_COMMAND} --prefix=${LIBDIR}/flac --disable-shared --enable-static - - BUILD_COMMAND ${CONFIGURE_ENV} && - cd ${BUILD_DIR}/flac/src/external_flac/ && - make -j${MAKE_THREADS} - - INSTALL_COMMAND ${CONFIGURE_ENV} && - cd ${BUILD_DIR}/flac/src/external_flac/ && - make install - + CONFIGURE_COMMAND ${CONFIGURE_ENV} && cd ${BUILD_DIR}/flac/src/external_flac/ && ${CONFIGURE_COMMAND} --prefix=${LIBDIR}/flac --disable-shared --enable-static + BUILD_COMMAND ${CONFIGURE_ENV} && cd ${BUILD_DIR}/flac/src/external_flac/ && make -j${MAKE_THREADS} + INSTALL_COMMAND ${CONFIGURE_ENV} && cd ${BUILD_DIR}/flac/src/external_flac/ && make install INSTALL_DIR ${LIBDIR}/flac ) else() @@ -44,12 +34,7 @@ else() URL_HASH ${FLAC_HASH_TYPE}=${FLAC_HASH} PREFIX ${BUILD_DIR}/flac CMAKE_GENERATOR "Ninja" - - CMAKE_ARGS - -DCMAKE_INSTALL_PREFIX=${LIBDIR}/flac - ${DEFAULT_CMAKE_FLAGS} - ${FLAC_EXTRA_ARGS} - + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/flac ${DEFAULT_CMAKE_FLAGS} ${FLAC_EXTRA_ARGS} INSTALL_DIR ${LIBDIR}/flac ) endif() diff --git a/build_files/build_environment/cmake/flex.cmake b/build_files/build_environment/cmake/flex.cmake index 6c55206ea49..edea6144305 100644 --- a/build_files/build_environment/cmake/flex.cmake +++ b/build_files/build_environment/cmake/flex.cmake @@ -3,7 +3,7 @@ # SPDX-License-Identifier: GPL-2.0-or-later # Generated configuration files use an old `aclocal-1.15` on RockyLinux8. -if(CMAKE_SYSTEM_NAME STREQUAL "Linux") +if(CMAKE_SYSTEM_NAME MATCHES "Linux") set(_autoconf_cmd_optional ./autogen.sh &&) else() set(_autoconf_cmd_optional) @@ -15,19 +15,9 @@ ExternalProject_Add(external_flex URL_HASH ${FLEX_HASH_TYPE}=${FLEX_HASH} DOWNLOAD_DIR ${DOWNLOAD_DIR} PREFIX ${BUILD_DIR}/flex - - CONFIGURE_COMMAND ${CONFIGURE_ENV} && - cd ${BUILD_DIR}/flex/src/external_flex/ && - ${_autoconf_cmd_optional} ${CONFIGURE_COMMAND} --prefix=${LIBDIR}/flex - - BUILD_COMMAND ${CONFIGURE_ENV} && - cd ${BUILD_DIR}/flex/src/external_flex/ && - make -j${MAKE_THREADS} - - INSTALL_COMMAND ${CONFIGURE_ENV} && - cd ${BUILD_DIR}/flex/src/external_flex/ && - make install - + CONFIGURE_COMMAND ${CONFIGURE_ENV} && cd ${BUILD_DIR}/flex/src/external_flex/ && ${_autoconf_cmd_optional} ${CONFIGURE_COMMAND} --prefix=${LIBDIR}/flex + BUILD_COMMAND ${CONFIGURE_ENV} && cd ${BUILD_DIR}/flex/src/external_flex/ && make -j${MAKE_THREADS} + INSTALL_COMMAND ${CONFIGURE_ENV} && cd ${BUILD_DIR}/flex/src/external_flex/ && make install INSTALL_DIR ${LIBDIR}/flex ) diff --git a/build_files/build_environment/cmake/flexbison.cmake b/build_files/build_environment/cmake/flexbison.cmake index 94c2e155135..5deac8ffa35 100644 --- a/build_files/build_environment/cmake/flexbison.cmake +++ b/build_files/build_environment/cmake/flexbison.cmake @@ -9,19 +9,9 @@ ExternalProject_Add(external_flexbison DOWNLOAD_DIR ${DOWNLOAD_DIR} URL_HASH ${FLEXBISON_HASH_TYPE}=${FLEXBISON_HASH} PREFIX ${BUILD_DIR}/flexbison - - CMAKE_ARGS - -DCMAKE_INSTALL_PREFIX=${LIBDIR}/flexbison - ${DEFAULT_CMAKE_FLAGS} - ${FLEXBISON_EXTRA_ARGS} - + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/flexbison ${DEFAULT_CMAKE_FLAGS} ${FLEXBISON_EXTRA_ARGS} CONFIGURE_COMMAND echo . BUILD_COMMAND echo . - - INSTALL_COMMAND - COMMAND ${CMAKE_COMMAND} -E copy_directory - ${BUILD_DIR}/flexbison/src/external_flexbison/ - ${LIBDIR}/flexbison/ - + INSTALL_COMMAND COMMAND ${CMAKE_COMMAND} -E copy_directory ${BUILD_DIR}/flexbison/src/external_flexbison/ ${LIBDIR}/flexbison/ INSTALL_DIR ${LIBDIR}/flexbison ) diff --git a/build_files/build_environment/cmake/fmt.cmake b/build_files/build_environment/cmake/fmt.cmake index 79ef187e895..8e2ad18a6c9 100644 --- a/build_files/build_environment/cmake/fmt.cmake +++ b/build_files/build_environment/cmake/fmt.cmake @@ -12,11 +12,6 @@ ExternalProject_Add(external_fmt DOWNLOAD_DIR ${DOWNLOAD_DIR} URL_HASH ${FMT_HASH_TYPE}=${FMT_HASH} PREFIX ${BUILD_DIR}/fmt - - CMAKE_ARGS - -DCMAKE_INSTALL_PREFIX=${LIBDIR}/fmt - ${DEFAULT_CMAKE_FLAGS} - ${FMT_EXTRA_ARGS} - + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/fmt ${DEFAULT_CMAKE_FLAGS} ${FMT_EXTRA_ARGS} INSTALL_DIR ${LIBDIR}/fmt ) diff --git a/build_files/build_environment/cmake/freetype.cmake b/build_files/build_environment/cmake/freetype.cmake index 1dcc3c11631..37878ea0b17 100644 --- a/build_files/build_environment/cmake/freetype.cmake +++ b/build_files/build_environment/cmake/freetype.cmake @@ -21,12 +21,7 @@ ExternalProject_Add(external_freetype DOWNLOAD_DIR ${DOWNLOAD_DIR} URL_HASH ${FREETYPE_HASH_TYPE}=${FREETYPE_HASH} PREFIX ${BUILD_DIR}/freetype - - CMAKE_ARGS - -DCMAKE_INSTALL_PREFIX=${LIBDIR}/freetype - ${DEFAULT_CMAKE_FLAGS} - ${FREETYPE_EXTRA_ARGS} - + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/freetype ${DEFAULT_CMAKE_FLAGS} ${FREETYPE_EXTRA_ARGS} INSTALL_DIR ${LIBDIR}/freetype ) @@ -38,15 +33,10 @@ add_dependencies( if(BUILD_MODE STREQUAL Release AND WIN32) ExternalProject_Add_Step(external_freetype after_install - COMMAND ${CMAKE_COMMAND} -E copy_directory - ${LIBDIR}/freetype - ${HARVEST_TARGET}/freetype - - # `harfbuzz` *NEEDS* to find `freetype.lib` and will not be convinced to take - # alternative names so just give it what it wants. - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/freetype/lib/freetype2st.lib - ${LIBDIR}/freetype/lib/freetype.lib + COMMAND ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/freetype ${HARVEST_TARGET}/freetype + # harfbuzz *NEEDS* to find freetype.lib and will not be conviced to take alternative names so just give it + # what it wants. + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/freetype/lib/freetype2st.lib ${LIBDIR}/freetype/lib/freetype.lib DEPENDEES install ) diff --git a/build_files/build_environment/cmake/fribidi.cmake b/build_files/build_environment/cmake/fribidi.cmake index e2adb7bae0d..e01497693fd 100644 --- a/build_files/build_environment/cmake/fribidi.cmake +++ b/build_files/build_environment/cmake/fribidi.cmake @@ -11,17 +11,7 @@ ExternalProject_Add(external_fribidi URL_HASH ${FRIBIDI_HASH_TYPE}=${FRIBIDI_HASH} DOWNLOAD_DIR ${DOWNLOAD_DIR} PREFIX ${BUILD_DIR}/fribidi - - CONFIGURE_COMMAND - ${MESON} setup - --prefix ${LIBDIR}/fribidi - ${MESON_BUILD_TYPE} - -Ddocs=false - --default-library static - --libdir lib - ${BUILD_DIR}/fribidi/src/external_fribidi-build - ${BUILD_DIR}/fribidi/src/external_fribidi - + CONFIGURE_COMMAND ${MESON} setup --prefix ${LIBDIR}/fribidi ${MESON_BUILD_TYPE} -Ddocs=false --default-library static --libdir lib ${BUILD_DIR}/fribidi/src/external_fribidi-build ${BUILD_DIR}/fribidi/src/external_fribidi BUILD_COMMAND ninja INSTALL_COMMAND ninja install INSTALL_DIR ${LIBDIR}/fribidi @@ -36,13 +26,8 @@ add_dependencies( if(BUILD_MODE STREQUAL Release AND WIN32) ExternalProject_Add_Step(external_fribidi after_install - COMMAND ${CMAKE_COMMAND} -E copy_directory - ${LIBDIR}/fribidi/include - ${HARVEST_TARGET}/fribidi/include - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/fribidi/lib/libfribidi.a - ${HARVEST_TARGET}/fribidi/lib/libfribidi.lib - + COMMAND ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/fribidi/include ${HARVEST_TARGET}/fribidi/include + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/fribidi/lib/libfribidi.a ${HARVEST_TARGET}/fribidi/lib/libfribidi.lib DEPENDEES install ) endif() diff --git a/build_files/build_environment/cmake/gmmlib.cmake b/build_files/build_environment/cmake/gmmlib.cmake index fbb7d153c98..2ba7d26bd22 100644 --- a/build_files/build_environment/cmake/gmmlib.cmake +++ b/build_files/build_environment/cmake/gmmlib.cmake @@ -10,11 +10,6 @@ ExternalProject_Add(external_gmmlib URL_HASH ${GMMLIB_HASH_TYPE}=${GMMLIB_HASH} DOWNLOAD_DIR ${DOWNLOAD_DIR} PREFIX ${BUILD_DIR}/gmmlib - - CMAKE_ARGS - -DCMAKE_INSTALL_PREFIX=${LIBDIR}/gmmlib - ${DEFAULT_CMAKE_FLAGS} - ${GMMLIB_EXTRA_ARGS} - + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/gmmlib ${DEFAULT_CMAKE_FLAGS} ${GMMLIB_EXTRA_ARGS} INSTALL_DIR ${LIBDIR}/gmmlib ) diff --git a/build_files/build_environment/cmake/gmp.cmake b/build_files/build_environment/cmake/gmp.cmake index 0fb38a4e214..0a2ad0b517b 100644 --- a/build_files/build_environment/cmake/gmp.cmake +++ b/build_files/build_environment/cmake/gmp.cmake @@ -12,44 +12,14 @@ if(WIN32) set(GMP_CC_CXX "${compilescript_path} cl") set(GMP_NM "dumpbin.exe -symbols -headers") - set(GMP_CONFIGURE_ENV - set AR=${arlib_joint_path} && - set NM=${GMP_NM} && - ${CONFIGURE_ENV_NO_PERL} && - set CC=${GMP_CC_CXX} && - set CXX=${GMP_CC_CXX} && - set CFLAGS=${GMP_CFLAGS} && - set AS=: - ) + set(GMP_CONFIGURE_ENV set AR=${arlib_joint_path} && set NM=${GMP_NM} && ${CONFIGURE_ENV_NO_PERL} && set CC=${GMP_CC_CXX} && set CXX=${GMP_CC_CXX} && set CFLAGS=${GMP_CFLAGS} && set AS=:) - set(GMP_OPTIONS - --disable-static - --enable-shared - --enable-cxx - --verbose - gmp_cv_check_libm_for_build=no - ac_cv_prog_LEX=: - ac_cv_prog_YACC=: - ac_cv_prog_ac_ct_STRIP=: - ac_cv_prog_RANLIB=: - lt_cv_to_host_file_cmd=func_convert_file_noop - lt_cv_to_tool_file_cmd=func_convert_file_noop - ) + set(GMP_OPTIONS --disable-static --enable-shared --enable-cxx --verbose gmp_cv_check_libm_for_build=no ac_cv_prog_LEX=: ac_cv_prog_YACC=: ac_cv_prog_ac_ct_STRIP=: ac_cv_prog_RANLIB=:) if(BLENDER_PLATFORM_ARM) - set(GMP_OPTIONS - ${GMP_OPTIONS} - --enable-assembly=no - --build=aarch64-pc-mingw32 - ) + set(GMP_OPTIONS ${GMP_OPTIONS} --enable-assembly=no --build=aarch64-pc-mingw32) else() - set(GMP_OPTIONS - ${GMP_OPTIONS} - --enable-assembly=no - --build=x86_64-pc-mingw32 - ac_cv_func_memset=yes - gmp_cv_asm_w32=.word - ) + set(GMP_OPTIONS ${GMP_OPTIONS} --enable-assembly=no --build=x86_64-pc-mingw32 ac_cv_func_memset=yes gmp_cv_asm_w32=.word) endif() else() set(GMP_CONFIGURE_ENV ${CONFIGURE_ENV_NO_PERL}) @@ -82,39 +52,18 @@ ExternalProject_Add(external_gmp DOWNLOAD_DIR ${DOWNLOAD_DIR} URL_HASH ${GMP_HASH_TYPE}=${GMP_HASH} PREFIX ${BUILD_DIR}/gmp - - PATCH_COMMAND ${PATCH_CMD} -p 1 -d - ${BUILD_DIR}/gmp/src/external_gmp < - ${PATCH_DIR}/gmp.diff - - CONFIGURE_COMMAND ${GMP_CONFIGURE_ENV} && - cd ${BUILD_DIR}/gmp/src/external_gmp/ && - ${CONFIGURE_COMMAND} --prefix=${LIBDIR}/gmp ${GMP_OPTIONS} ${GMP_EXTRA_ARGS} - - BUILD_COMMAND ${CONFIGURE_ENV_NO_PERL} && - cd ${BUILD_DIR}/gmp/src/external_gmp/ && - make -j${MAKE_THREADS} - - INSTALL_COMMAND ${CONFIGURE_ENV_NO_PERL} && - cd ${BUILD_DIR}/gmp/src/external_gmp/ && - make install - + PATCH_COMMAND ${PATCH_CMD} -p 1 -d ${BUILD_DIR}/gmp/src/external_gmp < ${PATCH_DIR}/gmp.diff + CONFIGURE_COMMAND ${GMP_CONFIGURE_ENV} && cd ${BUILD_DIR}/gmp/src/external_gmp/ && ${CONFIGURE_COMMAND} --prefix=${LIBDIR}/gmp ${GMP_OPTIONS} ${GMP_EXTRA_ARGS} + BUILD_COMMAND ${CONFIGURE_ENV_NO_PERL} && cd ${BUILD_DIR}/gmp/src/external_gmp/ && make -j${MAKE_THREADS} + INSTALL_COMMAND ${CONFIGURE_ENV_NO_PERL} && cd ${BUILD_DIR}/gmp/src/external_gmp/ && make install INSTALL_DIR ${LIBDIR}/gmp ) if(BUILD_MODE STREQUAL Release AND WIN32) ExternalProject_Add_Step(external_gmp after_install - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/gmp/bin/gmp-10.dll - ${HARVEST_TARGET}/gmp/lib/gmp-10.dll - - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/gmp/lib/gmp.dll.lib - ${HARVEST_TARGET}/gmp/lib/gmp.dll.lib - - COMMAND ${CMAKE_COMMAND} -E copy_directory - ${LIBDIR}/gmp/include - ${HARVEST_TARGET}/gmp/include + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/gmp/bin/gmp-10.dll ${HARVEST_TARGET}/gmp/lib/gmp-10.dll + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/gmp/lib/gmp.dll.lib ${HARVEST_TARGET}/gmp/lib/gmp.dll.lib + COMMAND ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/gmp/include ${HARVEST_TARGET}/gmp/include DEPENDEES install ) @@ -129,22 +78,9 @@ if(WIN32) DOWNLOAD_DIR ${DOWNLOAD_DIR} URL_HASH ${GMP_HASH_TYPE}=${GMP_HASH} PREFIX ${BUILD_DIR}/gmpxx - - PATCH_COMMAND COMMAND - ${CMAKE_COMMAND} -E copy - ${PATCH_DIR}/cmakelists_gmpxx.txt - ${BUILD_DIR}/gmpxx/src/external_gmpxx/CMakeLists.txt && - ${CMAKE_COMMAND} -E copy - ${PATCH_DIR}/config_gmpxx.h - ${BUILD_DIR}/gmpxx/src/external_gmpxx/config.h - - CMAKE_ARGS - -DCMAKE_INSTALL_PREFIX=${LIBDIR}/gmpxx - ${DEFAULT_CMAKE_FLAGS} - -DGMP_LIBRARY=${BUILD_DIR}/gmp/src/external_gmp/.libs/gmp.dll.lib - -DGMP_INCLUDE_DIR=${BUILD_DIR}/gmp/src/external_gmp - -DCMAKE_DEBUG_POSTFIX=_d - + PATCH_COMMAND COMMAND ${CMAKE_COMMAND} -E copy ${PATCH_DIR}/cmakelists_gmpxx.txt ${BUILD_DIR}/gmpxx/src/external_gmpxx/CMakeLists.txt && + ${CMAKE_COMMAND} -E copy ${PATCH_DIR}/config_gmpxx.h ${BUILD_DIR}/gmpxx/src/external_gmpxx/config.h + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/gmpxx ${DEFAULT_CMAKE_FLAGS} -DGMP_LIBRARY=${BUILD_DIR}/gmp/src/external_gmp/.libs/gmp.dll.lib -DGMP_INCLUDE_DIR=${BUILD_DIR}/gmp/src/external_gmp -DCMAKE_DEBUG_POSTFIX=_d INSTALL_DIR ${LIBDIR}/gmpxx ) @@ -154,10 +90,7 @@ if(WIN32) ) ExternalProject_Add_Step(external_gmpxx after_install - COMMAND ${CMAKE_COMMAND} -E copy_directory - ${LIBDIR}/gmpxx/ - ${HARVEST_TARGET}/gmp - + COMMAND ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/gmpxx/ ${HARVEST_TARGET}/gmp DEPENDEES install ) diff --git a/build_files/build_environment/cmake/harfbuzz.cmake b/build_files/build_environment/cmake/harfbuzz.cmake index ff96b0481ec..c594be67ee2 100644 --- a/build_files/build_environment/cmake/harfbuzz.cmake +++ b/build_files/build_environment/cmake/harfbuzz.cmake @@ -33,12 +33,13 @@ ExternalProject_Add(external_harfbuzz PREFIX ${BUILD_DIR}/harfbuzz CONFIGURE_COMMAND ${HARFBUZZ_CONFIGURE_ENV} && - ${CMAKE_COMMAND} -E env ${HARFBUZZ_PKG_ENV} ${MESON} setup - --prefix ${LIBDIR}/harfbuzz ${HARFBUZZ_EXTRA_OPTIONS} - --default-library static - --libdir lib - ${BUILD_DIR}/harfbuzz/src/external_harfbuzz-build - ${BUILD_DIR}/harfbuzz/src/external_harfbuzz + ${CMAKE_COMMAND} -E env ${HARFBUZZ_PKG_ENV} + ${MESON} setup + --prefix ${LIBDIR}/harfbuzz ${HARFBUZZ_EXTRA_OPTIONS} + --default-library static + --libdir lib + ${BUILD_DIR}/harfbuzz/src/external_harfbuzz-build + ${BUILD_DIR}/harfbuzz/src/external_harfbuzz BUILD_COMMAND ninja INSTALL_COMMAND ninja install @@ -55,22 +56,16 @@ add_dependencies( if(BUILD_MODE STREQUAL Release AND WIN32) ExternalProject_Add_Step(external_harfbuzz after_install - COMMAND ${CMAKE_COMMAND} -E copy_directory - ${LIBDIR}/harfbuzz/include - ${HARVEST_TARGET}/harfbuzz/include + COMMAND ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/harfbuzz/include ${HARVEST_TARGET}/harfbuzz/include # We do not use the subset API currently, so copying only the main library will suffice for now - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/harfbuzz/lib/libharfbuzz.a - ${HARVEST_TARGET}/harfbuzz/lib/libharfbuzz.lib + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/harfbuzz/lib/libharfbuzz.a ${HARVEST_TARGET}/harfbuzz/lib/libharfbuzz.lib DEPENDEES install ) endif() if(BUILD_MODE STREQUAL Debug AND WIN32) ExternalProject_Add_Step(external_harfbuzz after_install - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/harfbuzz/lib/libharfbuzz.a - ${HARVEST_TARGET}/harfbuzz/lib/libharfbuzz_d.lib + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/harfbuzz/lib/libharfbuzz.a ${HARVEST_TARGET}/harfbuzz/lib/libharfbuzz_d.lib DEPENDEES install ) endif() diff --git a/build_files/build_environment/cmake/haru.cmake b/build_files/build_environment/cmake/haru.cmake index 3da39d3da63..4bee6ba7f3a 100644 --- a/build_files/build_environment/cmake/haru.cmake +++ b/build_files/build_environment/cmake/haru.cmake @@ -14,28 +14,18 @@ ExternalProject_Add(external_haru DOWNLOAD_DIR ${DOWNLOAD_DIR} URL_HASH ${HARU_HASH_TYPE}=${HARU_HASH} PREFIX ${BUILD_DIR}/haru - - PATCH_COMMAND ${PATCH_CMD} -p 1 -d - ${BUILD_DIR}/haru/src/external_haru < - ${PATCH_DIR}/haru.diff - + PATCH_COMMAND ${PATCH_CMD} -p 1 -d ${BUILD_DIR}/haru/src/external_haru < ${PATCH_DIR}/haru.diff CMAKE_ARGS -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DCMAKE_INSTALL_PREFIX=${LIBDIR}/haru ${DEFAULT_CMAKE_FLAGS} ${HARU_EXTRA_ARGS} - INSTALL_DIR ${LIBDIR}/haru ) if(WIN32) if(BUILD_MODE STREQUAL Release) ExternalProject_Add_Step(external_haru after_install - COMMAND ${CMAKE_COMMAND} -E copy_directory - ${LIBDIR}/haru/include - ${HARVEST_TARGET}/haru/include - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/haru/lib/libhpdfs.lib - ${HARVEST_TARGET}/haru/lib/libhpdfs.lib - + COMMAND ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/haru/include ${HARVEST_TARGET}/haru/include + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/haru/lib/libhpdfs.lib ${HARVEST_TARGET}/haru/lib/libhpdfs.lib DEPENDEES install ) endif() diff --git a/build_files/build_environment/cmake/harvest.cmake b/build_files/build_environment/cmake/harvest.cmake index 1e8948e7e8d..21008a40459 100644 --- a/build_files/build_environment/cmake/harvest.cmake +++ b/build_files/build_environment/cmake/harvest.cmake @@ -16,20 +16,12 @@ if(WIN32) if(BUILD_MODE STREQUAL Release) add_custom_target(Harvest_Release_Results COMMAND # JPEG rename lib-file + copy include. - ${CMAKE_COMMAND} -E copy - ${LIBDIR}/jpeg/lib/jpeg-static.lib - ${HARVEST_TARGET}/jpeg/lib/libjpeg.lib && - ${CMAKE_COMMAND} -E copy_directory - ${LIBDIR}/jpeg/include/ - ${HARVEST_TARGET}/jpeg/include/ && - + ${CMAKE_COMMAND} -E copy ${LIBDIR}/jpeg/lib/jpeg-static.lib ${HARVEST_TARGET}/jpeg/lib/libjpeg.lib && + ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/jpeg/include/ ${HARVEST_TARGET}/jpeg/include/ && # PNG. - ${CMAKE_COMMAND} -E copy - ${LIBDIR}/png/lib/libpng16_static.lib - ${HARVEST_TARGET}/png/lib/libpng.lib && - ${CMAKE_COMMAND} -E copy_directory - ${LIBDIR}/png/include/ - ${HARVEST_TARGET}/png/include/ + ${CMAKE_COMMAND} -E copy ${LIBDIR}/png/lib/libpng16_static.lib ${HARVEST_TARGET}/png/lib/libpng.lib && + ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/png/include/ ${HARVEST_TARGET}/png/include/ && + DEPENDS ) endif() diff --git a/build_files/build_environment/cmake/iconv.cmake b/build_files/build_environment/cmake/iconv.cmake index d5fc39e4500..9a1b31680b6 100644 --- a/build_files/build_environment/cmake/iconv.cmake +++ b/build_files/build_environment/cmake/iconv.cmake @@ -9,19 +9,9 @@ ExternalProject_Add(external_iconv DOWNLOAD_DIR ${DOWNLOAD_DIR} URL_HASH ${ICONV_HASH_TYPE}=${ICONV_HASH} PREFIX ${BUILD_DIR}/iconv - - CONFIGURE_COMMAND ${CONFIGURE_ENV} && - cd ${BUILD_DIR}/iconv/src/external_iconv/ && - ${CONFIGURE_COMMAND} --enable-static --prefix=${mingw_LIBDIR}/iconv - - BUILD_COMMAND ${CONFIGURE_ENV} && - cd ${BUILD_DIR}/iconv/src/external_iconv/ && - make -j${MAKE_THREADS} - - INSTALL_COMMAND ${CONFIGURE_ENV} && - cd ${BUILD_DIR}/iconv/src/external_iconv/ && - make install - + CONFIGURE_COMMAND ${CONFIGURE_ENV} && cd ${BUILD_DIR}/iconv/src/external_iconv/ && ${CONFIGURE_COMMAND} --enable-static --prefix=${mingw_LIBDIR}/iconv + BUILD_COMMAND ${CONFIGURE_ENV} && cd ${BUILD_DIR}/iconv/src/external_iconv/ && make -j${MAKE_THREADS} + INSTALL_COMMAND ${CONFIGURE_ENV} && cd ${BUILD_DIR}/iconv/src/external_iconv/ && make install INSTALL_DIR ${LIBDIR}/iconv ) @@ -29,12 +19,8 @@ if(MSVC) set_target_properties(external_iconv PROPERTIES FOLDER Mingw) if(BUILD_MODE STREQUAL Release) ExternalProject_Add_Step(external_iconv after_install - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/iconv/lib/libiconv.a - ${HARVEST_TARGET}/iconv/lib/iconv.lib - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/iconv/include/iconv.h - ${HARVEST_TARGET}/iconv/include/iconv.h + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/iconv/lib/libiconv.a ${HARVEST_TARGET}/iconv/lib/iconv.lib + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/iconv/include/iconv.h ${HARVEST_TARGET}/iconv/include/iconv.h DEPENDEES install ) endif() diff --git a/build_files/build_environment/cmake/igc.cmake b/build_files/build_environment/cmake/igc.cmake index 86bdabca251..1727f49fd39 100644 --- a/build_files/build_environment/cmake/igc.cmake +++ b/build_files/build_environment/cmake/igc.cmake @@ -21,10 +21,7 @@ ExternalProject_Add(external_igc_opencl_clang CONFIGURE_COMMAND echo . BUILD_COMMAND echo . INSTALL_COMMAND echo . - - PATCH_COMMAND ${PATCH_CMD} -p 1 -d - ${BUILD_DIR}/igc_opencl_clang/src/external_igc_opencl_clang/ < - ${PATCH_DIR}/igc_opencl_clang.diff + PATCH_COMMAND ${PATCH_CMD} -p 1 -d ${BUILD_DIR}/igc_opencl_clang/src/external_igc_opencl_clang/ < ${PATCH_DIR}/igc_opencl_clang.diff ) set(IGC_OPENCL_CLANG_PATCH_DIR ${BUILD_DIR}/igc_opencl_clang/src/external_igc_opencl_clang/patches) @@ -39,26 +36,12 @@ ExternalProject_Add(external_igc_llvm CONFIGURE_COMMAND echo . BUILD_COMMAND echo . INSTALL_COMMAND echo . - - PATCH_COMMAND - ${PATCH_CMD} -p 1 -d - ${IGC_LLVM_SOURCE_DIR} < - ${IGC_OPENCL_CLANG_PATCH_DIR}/clang/0001-Remove-__IMAGE_SUPPORT__-macro-for-SPIR.patch && - ${PATCH_CMD} -p 1 -d - ${IGC_LLVM_SOURCE_DIR} < - ${IGC_OPENCL_CLANG_PATCH_DIR}/clang/0002-Remove-wrong-check-of-__opencl_c_images-feature-macr.patch && - ${PATCH_CMD} -p 1 -d - ${IGC_LLVM_SOURCE_DIR} < - ${IGC_OPENCL_CLANG_PATCH_DIR}/clang/0003-Fix-checking-mechanism-for-read_write-Image-type.patch && - ${PATCH_CMD} -p 1 -d - ${IGC_LLVM_SOURCE_DIR} < - ${IGC_OPENCL_CLANG_PATCH_DIR}/clang/0004-OpenCL-Allow-undefining-header-only-macros.patch && - ${PATCH_CMD} -p 1 -d - ${IGC_LLVM_SOURCE_DIR} < - ${IGC_OPENCL_CLANG_PATCH_DIR}/clang/0005-Enable-use-of-GNU-C-extension.patch && - ${PATCH_CMD} -p 1 -d - ${IGC_LLVM_SOURCE_DIR} < - ${IGC_OPENCL_CLANG_PATCH_DIR}/clang/0006-Make-globals-used-for-array-initialization-codegen-c.patch + PATCH_COMMAND ${PATCH_CMD} -p 1 -d ${IGC_LLVM_SOURCE_DIR} < ${IGC_OPENCL_CLANG_PATCH_DIR}/clang/0001-Remove-__IMAGE_SUPPORT__-macro-for-SPIR.patch && + ${PATCH_CMD} -p 1 -d ${IGC_LLVM_SOURCE_DIR} < ${IGC_OPENCL_CLANG_PATCH_DIR}/clang/0002-Remove-wrong-check-of-__opencl_c_images-feature-macr.patch && + ${PATCH_CMD} -p 1 -d ${IGC_LLVM_SOURCE_DIR} < ${IGC_OPENCL_CLANG_PATCH_DIR}/clang/0003-Fix-checking-mechanism-for-read_write-Image-type.patch && + ${PATCH_CMD} -p 1 -d ${IGC_LLVM_SOURCE_DIR} < ${IGC_OPENCL_CLANG_PATCH_DIR}/clang/0004-OpenCL-Allow-undefining-header-only-macros.patch && + ${PATCH_CMD} -p 1 -d ${IGC_LLVM_SOURCE_DIR} < ${IGC_OPENCL_CLANG_PATCH_DIR}/clang/0005-Enable-use-of-GNU-C-extension.patch && + ${PATCH_CMD} -p 1 -d ${IGC_LLVM_SOURCE_DIR} < ${IGC_OPENCL_CLANG_PATCH_DIR}/clang/0006-Make-globals-used-for-array-initialization-codegen-c.patch ) add_dependencies( external_igc_llvm @@ -103,36 +86,19 @@ ExternalProject_Add(external_igc URL file://${PACKAGE_DIR}/${IGC_FILE} DOWNLOAD_DIR ${DOWNLOAD_DIR} URL_HASH ${IGC_HASH_TYPE}=${IGC_HASH} - - CMAKE_ARGS - -DCMAKE_INSTALL_PREFIX=${LIBDIR}/igc - ${DEFAULT_CMAKE_FLAGS} - ${IGC_EXTRA_ARGS} + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/igc ${DEFAULT_CMAKE_FLAGS} ${IGC_EXTRA_ARGS} # IGC is pretty set in its way where sub projects ought to live, for some it offers - # hooks to supply alternatives folders, other are just hard-coded with no way to configure + # hooks to supply alternatives folders, other are just hardocded with no way to configure # we symlink everything here, since it's less work than trying to convince the cmake # scripts to accept alternative locations. - PATCH_COMMAND - ${CMAKE_COMMAND} -E create_symlink - ${BUILD_DIR}/igc_llvm/src/external_igc_llvm/ - ${BUILD_DIR}/igc/src/llvm-project && - ${CMAKE_COMMAND} -E create_symlink - ${BUILD_DIR}/igc_opencl_clang/src/external_igc_opencl_clang/ - ${BUILD_DIR}/igc/src/llvm-project/llvm/projects/opencl-clang && - ${CMAKE_COMMAND} -E create_symlink - ${BUILD_DIR}/igc_spirv_translator/src/external_igc_spirv_translator/ - ${BUILD_DIR}/igc/src/llvm-project/llvm/projects/llvm-spirv && - ${CMAKE_COMMAND} -E create_symlink - ${BUILD_DIR}/igc_spirv_tools/src/external_igc_spirv_tools/ - ${BUILD_DIR}/igc/src/SPIRV-Tools && - ${CMAKE_COMMAND} -E create_symlink - ${BUILD_DIR}/igc_spirv_headers/src/external_igc_spirv_headers/ - ${BUILD_DIR}/igc/src/SPIRV-Headers && - ${CMAKE_COMMAND} -E create_symlink - ${BUILD_DIR}/igc_vcintrinsics/src/external_igc_vcintrinsics/ - ${BUILD_DIR}/igc/src/vc-intrinsics - + # + PATCH_COMMAND ${CMAKE_COMMAND} -E create_symlink ${BUILD_DIR}/igc_llvm/src/external_igc_llvm/ ${BUILD_DIR}/igc/src/llvm-project && + ${CMAKE_COMMAND} -E create_symlink ${BUILD_DIR}/igc_opencl_clang/src/external_igc_opencl_clang/ ${BUILD_DIR}/igc/src/llvm-project/llvm/projects/opencl-clang && + ${CMAKE_COMMAND} -E create_symlink ${BUILD_DIR}/igc_spirv_translator/src/external_igc_spirv_translator/ ${BUILD_DIR}/igc/src/llvm-project/llvm/projects/llvm-spirv && + ${CMAKE_COMMAND} -E create_symlink ${BUILD_DIR}/igc_spirv_tools/src/external_igc_spirv_tools/ ${BUILD_DIR}/igc/src/SPIRV-Tools && + ${CMAKE_COMMAND} -E create_symlink ${BUILD_DIR}/igc_spirv_headers/src/external_igc_spirv_headers/ ${BUILD_DIR}/igc/src/SPIRV-Headers && + ${CMAKE_COMMAND} -E create_symlink ${BUILD_DIR}/igc_vcintrinsics/src/external_igc_vcintrinsics/ ${BUILD_DIR}/igc/src/vc-intrinsics PREFIX ${BUILD_DIR}/igc INSTALL_DIR ${LIBDIR}/igc INSTALL_COMMAND ${CMAKE_COMMAND} --install . --strip diff --git a/build_files/build_environment/cmake/imath.cmake b/build_files/build_environment/cmake/imath.cmake index 4eff87a70a8..c9b101216ec 100644 --- a/build_files/build_environment/cmake/imath.cmake +++ b/build_files/build_environment/cmake/imath.cmake @@ -14,31 +14,16 @@ ExternalProject_Add(external_imath URL_HASH ${IMATH_HASH_TYPE}=${IMATH_HASH} PREFIX ${BUILD_DIR}/imath CMAKE_GENERATOR ${PLATFORM_ALT_GENERATOR} - - CMAKE_ARGS - -DCMAKE_INSTALL_PREFIX=${LIBDIR}/imath - ${DEFAULT_CMAKE_FLAGS} - ${IMATH_EXTRA_ARGS} - - PATCH_COMMAND ${PATCH_CMD} -p 1 -d - ${BUILD_DIR}/imath/src/external_imath < - ${PATCH_DIR}/imath_358.diff - + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/imath ${DEFAULT_CMAKE_FLAGS} ${IMATH_EXTRA_ARGS} + PATCH_COMMAND ${PATCH_CMD} -p 1 -d ${BUILD_DIR}/imath/src/external_imath < ${PATCH_DIR}/imath_358.diff INSTALL_DIR ${LIBDIR}/imath ) if(WIN32) ExternalProject_Add_Step(external_imath after_install - COMMAND ${CMAKE_COMMAND} -E copy_directory - ${LIBDIR}/imath/lib - ${HARVEST_TARGET}/imath/lib - COMMAND ${CMAKE_COMMAND} -E copy_directory - ${LIBDIR}/imath/include - ${HARVEST_TARGET}/imath/include - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/imath/bin/imath${OPENEXR_VERSION_POSTFIX}.dll - ${HARVEST_TARGET}/imath/bin/imath${OPENEXR_VERSION_POSTFIX}.dll - + COMMAND ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/imath/lib ${HARVEST_TARGET}/imath/lib + COMMAND ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/imath/include ${HARVEST_TARGET}/imath/include + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/imath/bin/imath${OPENEXR_VERSION_POSTFIX}.dll ${HARVEST_TARGET}/imath/bin/imath${OPENEXR_VERSION_POSTFIX}.dll DEPENDEES install ) endif() diff --git a/build_files/build_environment/cmake/ispc.cmake b/build_files/build_environment/cmake/ispc.cmake index 9fd9bcfd247..450fcf65d99 100644 --- a/build_files/build_environment/cmake/ispc.cmake +++ b/build_files/build_environment/cmake/ispc.cmake @@ -7,14 +7,9 @@ if(WIN32) -DFLEX_EXECUTABLE=${LIBDIR}/flexbison/win_flex.exe -DBISON_EXECUTABLE=${LIBDIR}/flexbison/win_bison.exe -DM4_EXECUTABLE=${DOWNLOAD_DIR}/msys2/msys64/usr/bin/m4.exe + -DARM_ENABLED=Off -DPython3_FIND_REGISTRY=NEVER ) - - if(BLENDER_PLATFORM_ARM) - set(ISPC_EXTRA_ARGS_WIN ${ISPC_EXTRA_ARGS_WIN} -DARM_ENABLED=On) - else() - set(ISPC_EXTRA_ARGS_WIN ${ISPC_EXTRA_ARGS_WIN} -DARM_ENABLED=Off) - endif() elseif(APPLE) # Use bison and flex installed via Homebrew. # The ones that come with Xcode toolset are too old. @@ -65,18 +60,8 @@ ExternalProject_Add(external_ispc DOWNLOAD_DIR ${DOWNLOAD_DIR} URL_HASH ${ISPC_HASH_TYPE}=${ISPC_HASH} PREFIX ${BUILD_DIR}/ispc - - PATCH_COMMAND ${PATCH_CMD} -p 1 -d - ${BUILD_DIR}/ispc/src/external_ispc < - ${PATCH_DIR}/ispc.diff - - CMAKE_ARGS - -DCMAKE_INSTALL_PREFIX=${LIBDIR}/ispc - -Wno-dev - ${DEFAULT_CMAKE_FLAGS} - ${ISPC_EXTRA_ARGS} - ${BUILD_DIR}/ispc/src/external_ispc - + PATCH_COMMAND ${PATCH_CMD} -p 1 -d ${BUILD_DIR}/ispc/src/external_ispc < ${PATCH_DIR}/ispc.diff + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/ispc -Wno-dev ${DEFAULT_CMAKE_FLAGS} ${ISPC_EXTRA_ARGS} ${BUILD_DIR}/ispc/src/external_ispc INSTALL_DIR ${LIBDIR}/ispc ) diff --git a/build_files/build_environment/cmake/jemalloc.cmake b/build_files/build_environment/cmake/jemalloc.cmake index 25a3fade89a..be7b773aba1 100644 --- a/build_files/build_environment/cmake/jemalloc.cmake +++ b/build_files/build_environment/cmake/jemalloc.cmake @@ -7,18 +7,8 @@ ExternalProject_Add(external_jemalloc DOWNLOAD_DIR ${DOWNLOAD_DIR} URL_HASH ${JEMALLOC_HASH_TYPE}=${JEMALLOC_HASH} PREFIX ${BUILD_DIR}/jemalloc - - CONFIGURE_COMMAND ${CONFIGURE_ENV} && - cd ${BUILD_DIR}/jemalloc/src/external_jemalloc/ && - ${CONFIGURE_COMMAND} --prefix=${LIBDIR}/jemalloc --disable-shared --enable-static --with-pic - - BUILD_COMMAND ${CONFIGURE_ENV} && - cd ${BUILD_DIR}/jemalloc/src/external_jemalloc/ && - make -j${MAKE_THREADS} - - INSTALL_COMMAND ${CONFIGURE_ENV} && - cd ${BUILD_DIR}/jemalloc/src/external_jemalloc/ && - make install - + CONFIGURE_COMMAND ${CONFIGURE_ENV} && cd ${BUILD_DIR}/jemalloc/src/external_jemalloc/ && ${CONFIGURE_COMMAND} --prefix=${LIBDIR}/jemalloc --disable-shared --enable-static --with-pic + BUILD_COMMAND ${CONFIGURE_ENV} && cd ${BUILD_DIR}/jemalloc/src/external_jemalloc/ && make -j${MAKE_THREADS} + INSTALL_COMMAND ${CONFIGURE_ENV} && cd ${BUILD_DIR}/jemalloc/src/external_jemalloc/ && make install INSTALL_DIR ${LIBDIR}/jemalloc ) diff --git a/build_files/build_environment/cmake/jpeg.cmake b/build_files/build_environment/cmake/jpeg.cmake index 0ab96fcf8e8..9525938f3c8 100644 --- a/build_files/build_environment/cmake/jpeg.cmake +++ b/build_files/build_environment/cmake/jpeg.cmake @@ -30,10 +30,7 @@ if(WIN32) if(BUILD_MODE STREQUAL Release) ExternalProject_Add_Step(external_jpeg after_install - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/jpeg/lib/${JPEG_LIBRARY} - ${LIBDIR}/jpeg/lib/jpeg${LIBEXT} - + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/jpeg/lib/${JPEG_LIBRARY} ${LIBDIR}/jpeg/lib/jpeg${LIBEXT} DEPENDEES install ) endif() @@ -51,12 +48,7 @@ else() DOWNLOAD_DIR ${DOWNLOAD_DIR} URL_HASH ${JPEG_HASH_TYPE}=${JPEG_HASH} PREFIX ${BUILD_DIR}/jpeg - - CMAKE_ARGS - -DCMAKE_INSTALL_PREFIX=${LIBDIR}/jpeg - ${DEFAULT_CMAKE_FLAGS} - ${JPEG_EXTRA_ARGS} - + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/jpeg ${DEFAULT_CMAKE_FLAGS} ${JPEG_EXTRA_ARGS} INSTALL_DIR ${LIBDIR}/jpeg ) diff --git a/build_files/build_environment/cmake/lame.cmake b/build_files/build_environment/cmake/lame.cmake index 3b23640d4f5..cdea7cd6634 100644 --- a/build_files/build_environment/cmake/lame.cmake +++ b/build_files/build_environment/cmake/lame.cmake @@ -4,50 +4,24 @@ set(LAME_EXTRA_ARGS) if(MSVC) - if(BLENDER_PLATFORM_ARM) - set(LAME_ARCH ARM64) - else() - set(LAME_ARCH Win64) - endif() - set(LAME_CONFIGURE echo .) - set(LAME_BUILD - cd ${BUILD_DIR}/lame/src/external_lame/ && - nmake /F MakeFile.msvc MSVCVER=${LAME_ARCH} all - ) - set(LAME_INSTALL - cd ${BUILD_DIR}/lame/src/external_lame/ && - ${CMAKE_COMMAND} -E copy - include/lame.h - ${LIBDIR}/lame/include/lame/lame.h && - ${CMAKE_COMMAND} -E copy - output/libmp3lame-static.lib - ${LIBDIR}/lame/lib/mp3lame.lib - ) + set(LAME_ARCH Win64) + set (LAME_CONFIGURE echo .) + set (LAME_BUILD cd ${BUILD_DIR}/lame/src/external_lame/ && nmake /F MakeFile.msvc MSVCVER=${LAME_ARCH} all) + set (LAME_INSTALL cd ${BUILD_DIR}/lame/src/external_lame/ && + ${CMAKE_COMMAND} -E copy include/lame.h ${LIBDIR}/lame/include/lame/lame.h && + ${CMAKE_COMMAND} -E copy output/libmp3lame-static.lib ${LIBDIR}/lame/lib/mp3lame.lib ) else() - set(LAME_CONFIGURE - ${CONFIGURE_ENV} && - cd ${BUILD_DIR}/lame/src/external_lame/ && - ${CONFIGURE_COMMAND} - --prefix=${LIBDIR}/lame - --disable-shared - --enable-static - ${LAME_EXTRA_ARGS} - --enable-export=full - --with-fileio=sndfile - --without-vorbis - --with-pic - --disable-mp3x - --disable-mp3rtp - --disable-gtktest - --disable-frontend) - set(LAME_BUILD ${CONFIGURE_ENV} && - cd ${BUILD_DIR}/lame/src/external_lame/ && - make -j${MAKE_THREADS} - ) - set(LAME_INSTALL ${CONFIGURE_ENV} && - cd ${BUILD_DIR}/lame/src/external_lame/ && - make install - ) + set(LAME_CONFIGURE ${CONFIGURE_ENV} && cd ${BUILD_DIR}/lame/src/external_lame/ && ${CONFIGURE_COMMAND} --prefix=${LIBDIR}/lame --disable-shared --enable-static ${LAME_EXTRA_ARGS} + --enable-export=full + --with-fileio=sndfile + --without-vorbis + --with-pic + --disable-mp3x + --disable-mp3rtp + --disable-gtktest + --disable-frontend) + set(LAME_BUILD ${CONFIGURE_ENV} && cd ${BUILD_DIR}/lame/src/external_lame/ && make -j${MAKE_THREADS}) + set(LAME_INSTALL ${CONFIGURE_ENV} && cd ${BUILD_DIR}/lame/src/external_lame/ && make install) endif() ExternalProject_Add(external_lame @@ -55,11 +29,7 @@ ExternalProject_Add(external_lame DOWNLOAD_DIR ${DOWNLOAD_DIR} URL_HASH ${LAME_HASH_TYPE}=${LAME_HASH} PREFIX ${BUILD_DIR}/lame - - PATCH_COMMAND COMMAND ${PATCH_CMD} -p 1 -d - ${BUILD_DIR}/lame/src/external_lame < - ${PATCH_DIR}/lame.diff - + PATCH_COMMAND COMMAND ${PATCH_CMD} -p 1 -d ${BUILD_DIR}/lame/src/external_lame < ${PATCH_DIR}/lame.diff CONFIGURE_COMMAND ${LAME_CONFIGURE} BUILD_COMMAND ${LAME_BUILD} INSTALL_COMMAND ${LAME_INSTALL} diff --git a/build_files/build_environment/cmake/level-zero.cmake b/build_files/build_environment/cmake/level-zero.cmake index 1777a761688..5a5f3275bf5 100644 --- a/build_files/build_environment/cmake/level-zero.cmake +++ b/build_files/build_environment/cmake/level-zero.cmake @@ -10,24 +10,14 @@ ExternalProject_Add(external_level-zero DOWNLOAD_DIR ${DOWNLOAD_DIR} URL_HASH ${LEVEL_ZERO_HASH_TYPE}=${LEVEL_ZERO_HASH} PREFIX ${BUILD_DIR}/level-zero - - PATCH_COMMAND ${PATCH_CMD} -p 1 -d - ${BUILD_DIR}/level-zero/src/external_level-zero < - ${PATCH_DIR}/level-zero.diff - - CMAKE_ARGS - -DCMAKE_INSTALL_PREFIX=${LIBDIR}/level-zero - ${DEFAULT_CMAKE_FLAGS} - ${LEVEL_ZERO_EXTRA_ARGS} - + PATCH_COMMAND ${PATCH_CMD} -p 1 -d ${BUILD_DIR}/level-zero/src/external_level-zero < ${PATCH_DIR}/level-zero.diff + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/level-zero ${DEFAULT_CMAKE_FLAGS} ${LEVEL_ZERO_EXTRA_ARGS} INSTALL_DIR ${LIBDIR}/level-zero ) if(BUILD_MODE STREQUAL Release AND WIN32) ExternalProject_Add_Step(external_level-zero after_install - COMMAND ${CMAKE_COMMAND} -E copy_directory - ${LIBDIR}/level-zero - ${HARVEST_TARGET}/level-zero + COMMAND ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/level-zero ${HARVEST_TARGET}/level-zero DEPENDEES install ) endif() diff --git a/build_files/build_environment/cmake/libglu.cmake b/build_files/build_environment/cmake/libglu.cmake index e804f0e10e0..ffd493b5f0f 100644 --- a/build_files/build_environment/cmake/libglu.cmake +++ b/build_files/build_environment/cmake/libglu.cmake @@ -17,18 +17,10 @@ ExternalProject_Add(external_libglu DOWNLOAD_DIR ${DOWNLOAD_DIR} URL_HASH ${LIBGLU_HASH_TYPE}=${LIBGLU_HASH} PREFIX ${BUILD_DIR}/libglu - CONFIGURE_COMMAND ${CONFIGURE_ENV} && cd ${BUILD_DIR}/libglu/src/external_libglu/ && ${CONFIGURE_COMMAND_NO_TARGET} --prefix=${LIBDIR}/libglu ${LIBGLU_EXTRA_FLAGS} - - BUILD_COMMAND ${CONFIGURE_ENV} && - cd ${BUILD_DIR}/libglu/src/external_libglu/ && - make -j${MAKE_THREADS} - - INSTALL_COMMAND ${CONFIGURE_ENV} && - cd ${BUILD_DIR}/libglu/src/external_libglu/ && - make install - + BUILD_COMMAND ${CONFIGURE_ENV} && cd ${BUILD_DIR}/libglu/src/external_libglu/ && make -j${MAKE_THREADS} + INSTALL_COMMAND ${CONFIGURE_ENV} && cd ${BUILD_DIR}/libglu/src/external_libglu/ && make install INSTALL_DIR ${LIBDIR}/libglu ) diff --git a/build_files/build_environment/cmake/llvm.cmake b/build_files/build_environment/cmake/llvm.cmake index 68214a5208e..c400ec46d77 100644 --- a/build_files/build_environment/cmake/llvm.cmake +++ b/build_files/build_environment/cmake/llvm.cmake @@ -13,10 +13,8 @@ if(APPLE) -DLIBXML2_LIBRARY=${LIBDIR}/xml2/lib/libxml2.a -DLIBXML2_INCLUDE_DIR=${LIBDIR}/xml2/include/libxml2 ) - set(LLVM_EXTRA_PROJECTS ^^clang-tools-extra) + set(LLVM_BUILD_CLANG_TOOLS_EXTRA ^^clang-tools-extra) set(BUILD_CLANG_TOOLS ON) -elseif(MSVC AND BLENDER_PLATFORM_ARM) - set(LLVM_EXTRA_PROJECTS ^^lld) else() # NVIDIA PTX for OSL on Windows and Linux. set(LLVM_TARGETS ${LLVM_TARGETS}$NVPTX) @@ -33,7 +31,7 @@ set(LLVM_EXTRA_ARGS -DLLVM_ENABLE_UNWIND_TABLES=OFF -DLLVM_ENABLE_ZSTD=OFF -DLLVM_ENABLE_ZLIB=OFF - -DLLVM_ENABLE_PROJECTS=clang${LLVM_EXTRA_PROJECTS} + -DLLVM_ENABLE_PROJECTS=clang${LLVM_BUILD_CLANG_TOOLS_EXTRA} -DPython3_ROOT_DIR=${LIBDIR}/python/ -DPython3_EXECUTABLE=${PYTHON_BINARY} ${LLVM_XML2_ARGS} @@ -60,40 +58,22 @@ ExternalProject_Add(ll 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 - ${LLVM_CMAKE_FLAGS} - ${LLVM_EXTRA_ARGS} - + PATCH_COMMAND ${PATCH_CMD} -p 1 -d ${BUILD_DIR}/ll/src/ll < ${PATCH_DIR}/llvm.diff + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/llvm ${LLVM_CMAKE_FLAGS} ${LLVM_EXTRA_ARGS} INSTALL_DIR ${LIBDIR}/llvm ) if(MSVC) if(BUILD_MODE STREQUAL Release) set(LLVM_HARVEST_COMMAND - ${CMAKE_COMMAND} -E copy_directory - ${LIBDIR}/llvm/lib - ${HARVEST_TARGET}/llvm/lib && - ${CMAKE_COMMAND} -E copy_directory - ${LIBDIR}/llvm/include - ${HARVEST_TARGET}/llvm/include && - ${CMAKE_COMMAND} -E copy - ${LIBDIR}/llvm/bin/clang-format.exe - ${HARVEST_TARGET}/llvm/bin/clang-format.exe + ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/llvm/lib ${HARVEST_TARGET}/llvm/lib && + ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/llvm/include ${HARVEST_TARGET}/llvm/include && + ${CMAKE_COMMAND} -E copy ${LIBDIR}/llvm/bin/clang-format.exe ${HARVEST_TARGET}/llvm/bin/clang-format.exe ) else() set(LLVM_HARVEST_COMMAND - ${CMAKE_COMMAND} -E copy_directory - ${LIBDIR}/llvm/lib/ - ${HARVEST_TARGET}/llvm/debug/lib/ && - ${CMAKE_COMMAND} -E copy_directory - ${LIBDIR}/llvm/include/ - ${HARVEST_TARGET}/llvm/debug/include/ + ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/llvm/lib/ ${HARVEST_TARGET}/llvm/debug/lib/ && + ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/llvm/include/ ${HARVEST_TARGET}/llvm/debug/include/ ) endif() ExternalProject_Add_Step(ll after_install diff --git a/build_files/build_environment/cmake/lzma.cmake b/build_files/build_environment/cmake/lzma.cmake index 057d13343f7..2934e471c69 100644 --- a/build_files/build_environment/cmake/lzma.cmake +++ b/build_files/build_environment/cmake/lzma.cmake @@ -10,18 +10,9 @@ ExternalProject_Add(external_lzma URL_HASH ${LZMA_HASH_TYPE}=${LZMA_HASH} PREFIX ${BUILD_DIR}/lzma PATCH_COMMAND ${LZMA_PATCH_CMD} - - CONFIGURE_COMMAND ${CONFIGURE_ENV} && - cd ${BUILD_DIR}/lzma/src/external_lzma/ && - ${CONFIGURE_COMMAND} --prefix=${LIBDIR}/lzma --disable-shared - - BUILD_COMMAND ${CONFIGURE_ENV} && - cd ${BUILD_DIR}/lzma/src/external_lzma/ && - make -j${MAKE_THREADS} - - INSTALL_COMMAND ${CONFIGURE_ENV} && - cd ${BUILD_DIR}/lzma/src/external_lzma/ && - make install - + CONFIGURE_COMMAND ${CONFIGURE_ENV} && cd ${BUILD_DIR}/lzma/src/external_lzma/ && ${CONFIGURE_COMMAND} --prefix=${LIBDIR}/lzma + --disable-shared + BUILD_COMMAND ${CONFIGURE_ENV} && cd ${BUILD_DIR}/lzma/src/external_lzma/ && make -j${MAKE_THREADS} + INSTALL_COMMAND ${CONFIGURE_ENV} && cd ${BUILD_DIR}/lzma/src/external_lzma/ && make install INSTALL_DIR ${LIBDIR}/lzma ) diff --git a/build_files/build_environment/cmake/materialx.cmake b/build_files/build_environment/cmake/materialx.cmake index b8aa1947885..f0c3f6d8af8 100644 --- a/build_files/build_environment/cmake/materialx.cmake +++ b/build_files/build_environment/cmake/materialx.cmake @@ -27,12 +27,7 @@ ExternalProject_Add(external_materialx URL_HASH ${MATERIALX_HASH_TYPE}=${MATERIALX_HASH} PREFIX ${BUILD_DIR}/materialx CMAKE_GENERATOR ${PLATFORM_ALT_GENERATOR} - - CMAKE_ARGS - -DCMAKE_INSTALL_PREFIX=${LIBDIR}/materialx - ${DEFAULT_CMAKE_FLAGS} - ${MATERIALX_EXTRA_ARGS} - + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/materialx ${DEFAULT_CMAKE_FLAGS} ${MATERIALX_EXTRA_ARGS} INSTALL_DIR ${LIBDIR}/materialx ) @@ -41,39 +36,21 @@ if(WIN32) string(REPLACE "/" "\\" MATERIALX_PYTHON_TARGET_DOS "${MATERIALX_PYTHON_TARGET}") if(BUILD_MODE STREQUAL Release) ExternalProject_Add_Step(external_materialx after_install - COMMAND ${CMAKE_COMMAND} -E copy_directory - ${LIBDIR}/materialx/include - ${HARVEST_TARGET}/materialx/include - COMMAND ${CMAKE_COMMAND} -E copy_directory - ${LIBDIR}/materialx/libraries - ${HARVEST_TARGET}/materialx/libraries - COMMAND ${CMAKE_COMMAND} -E copy_directory - ${LIBDIR}/materialx/lib/ - ${HARVEST_TARGET}/materialx/lib/ - COMMAND ${CMAKE_COMMAND} -E copy_directory - ${LIBDIR}/materialx/bin/ - ${HARVEST_TARGET}/materialx/bin/ - COMMAND ${CMAKE_COMMAND} -E copy_directory - ${LIBDIR}/materialx/python/ - ${MATERIALX_PYTHON_TARGET} + COMMAND ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/materialx/include ${HARVEST_TARGET}/materialx/include + COMMAND ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/materialx/libraries ${HARVEST_TARGET}/materialx/libraries + COMMAND ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/materialx/lib/ ${HARVEST_TARGET}/materialx/lib/ + COMMAND ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/materialx/bin/ ${HARVEST_TARGET}/materialx/bin/ + COMMAND ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/materialx/python/ ${MATERIALX_PYTHON_TARGET} COMMAND del ${MATERIALX_PYTHON_TARGET_DOS}\\MaterialX\\*.lib - DEPENDEES install ) endif() if(BUILD_MODE STREQUAL Debug) ExternalProject_Add_Step(external_materialx after_install - COMMAND ${CMAKE_COMMAND} -E copy_directory - ${LIBDIR}/materialx/lib/ - ${HARVEST_TARGET}/materialx/lib/ - COMMAND ${CMAKE_COMMAND} -E copy_directory - ${LIBDIR}/materialx/bin/ - ${HARVEST_TARGET}/materialx/bin/ - COMMAND ${CMAKE_COMMAND} -E copy_directory - ${LIBDIR}/materialx/python/ - ${MATERIALX_PYTHON_TARGET} + COMMAND ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/materialx/lib/ ${HARVEST_TARGET}/materialx/lib/ + COMMAND ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/materialx/bin/ ${HARVEST_TARGET}/materialx/bin/ + COMMAND ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/materialx/python/ ${MATERIALX_PYTHON_TARGET} COMMAND del ${MATERIALX_PYTHON_TARGET_DOS}\\MaterialX\\*.lib - DEPENDEES install ) endif() diff --git a/build_files/build_environment/cmake/mesa.cmake b/build_files/build_environment/cmake/mesa.cmake index 2473867af69..d7533e3c598 100644 --- a/build_files/build_environment/cmake/mesa.cmake +++ b/build_files/build_environment/cmake/mesa.cmake @@ -45,22 +45,11 @@ ExternalProject_Add(external_mesa DOWNLOAD_DIR ${DOWNLOAD_DIR} URL_HASH ${MESA_HASH_TYPE}=${MESA_HASH} PREFIX ${BUILD_DIR}/mesa - CONFIGURE_COMMAND ${CONFIGURE_ENV} && cd ${BUILD_DIR}/mesa/src/external_mesa/ && - ${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 - + ${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/minizipng.cmake b/build_files/build_environment/cmake/minizipng.cmake index 48c6b415ce3..f9116eef7e4 100644 --- a/build_files/build_environment/cmake/minizipng.cmake +++ b/build_files/build_environment/cmake/minizipng.cmake @@ -28,12 +28,7 @@ ExternalProject_Add(external_minizipng URL_HASH ${MINIZIPNG_HASH_TYPE}=${MINIZIPNG_HASH} PREFIX ${BUILD_DIR}/minizipng CMAKE_GENERATOR ${PLATFORM_ALT_GENERATOR} - - CMAKE_ARGS - -DCMAKE_INSTALL_PREFIX=${LIBDIR}/minizipng - ${DEFAULT_CMAKE_FLAGS} - ${MINIZIPNG_EXTRA_ARGS} - + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/minizipng ${DEFAULT_CMAKE_FLAGS} ${MINIZIPNG_EXTRA_ARGS} INSTALL_DIR ${LIBDIR}/minizipng ) diff --git a/build_files/build_environment/cmake/nasm.cmake b/build_files/build_environment/cmake/nasm.cmake index 5004f9c0c13..2a04a6aa84c 100644 --- a/build_files/build_environment/cmake/nasm.cmake +++ b/build_files/build_environment/cmake/nasm.cmake @@ -7,25 +7,10 @@ ExternalProject_Add(external_nasm DOWNLOAD_DIR ${DOWNLOAD_DIR} URL_HASH ${NASM_HASH_TYPE}=${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/ && - ./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 - + 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/ && ./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 ) diff --git a/build_files/build_environment/cmake/numpy.cmake b/build_files/build_environment/cmake/numpy.cmake index 11f11de8470..94e1578ad5f 100644 --- a/build_files/build_environment/cmake/numpy.cmake +++ b/build_files/build_environment/cmake/numpy.cmake @@ -25,13 +25,7 @@ ExternalProject_Add(external_numpy PATCH_COMMAND ${NUMPY_PATCH} CONFIGURE_COMMAND "" LOG_BUILD 1 - - BUILD_COMMAND - ${PYTHON_BINARY} ${BUILD_DIR}/numpy/src/external_numpy/setup.py - build ${NUMPY_BUILD_OPTION} - install - --old-and-unmanageable - + BUILD_COMMAND ${PYTHON_BINARY} ${BUILD_DIR}/numpy/src/external_numpy/setup.py build ${NUMPY_BUILD_OPTION} install --old-and-unmanageable INSTALL_COMMAND "" ) diff --git a/build_files/build_environment/cmake/ocloc.cmake b/build_files/build_environment/cmake/ocloc.cmake index 231fddf9382..2d55c133e80 100644 --- a/build_files/build_environment/cmake/ocloc.cmake +++ b/build_files/build_environment/cmake/ocloc.cmake @@ -15,17 +15,9 @@ ExternalProject_Add(external_ocloc URL_HASH ${OCLOC_HASH_TYPE}=${OCLOC_HASH} DOWNLOAD_DIR ${DOWNLOAD_DIR} PREFIX ${BUILD_DIR}/ocloc - - CMAKE_ARGS - -DCMAKE_INSTALL_PREFIX=${LIBDIR}/ocloc - ${DEFAULT_CMAKE_FLAGS} - ${OCLOC_EXTRA_ARGS} - + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/ocloc ${DEFAULT_CMAKE_FLAGS} ${OCLOC_EXTRA_ARGS} INSTALL_DIR ${LIBDIR}/ocloc - - PATCH_COMMAND ${PATCH_CMD} -p 1 -d - ${BUILD_DIR}/ocloc/src/external_ocloc/ < - ${PATCH_DIR}/ocloc.diff + PATCH_COMMAND ${PATCH_CMD} -p 1 -d ${BUILD_DIR}/ocloc/src/external_ocloc/ < ${PATCH_DIR}/ocloc.diff ) add_dependencies( diff --git a/build_files/build_environment/cmake/ogg.cmake b/build_files/build_environment/cmake/ogg.cmake index 6896f5a2cd2..eff23d21f61 100644 --- a/build_files/build_environment/cmake/ogg.cmake +++ b/build_files/build_environment/cmake/ogg.cmake @@ -7,10 +7,6 @@ ExternalProject_Add(external_ogg DOWNLOAD_DIR ${DOWNLOAD_DIR} URL_HASH ${OGG_HASH_TYPE}=${OGG_HASH} PREFIX ${BUILD_DIR}/ogg - - CMAKE_ARGS - -DCMAKE_INSTALL_PREFIX=${LIBDIR}/ogg - ${DEFAULT_CMAKE_FLAGS} - + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/ogg ${DEFAULT_CMAKE_FLAGS} INSTALL_DIR ${LIBDIR}/ogg ) diff --git a/build_files/build_environment/cmake/openal.cmake b/build_files/build_environment/cmake/openal.cmake index 9ed73466f30..4287e5eb40a 100644 --- a/build_files/build_environment/cmake/openal.cmake +++ b/build_files/build_environment/cmake/openal.cmake @@ -36,27 +36,15 @@ if(BUILD_MODE STREQUAL Release) DOWNLOAD_DIR ${DOWNLOAD_DIR} URL_HASH ${OPENAL_HASH_TYPE}=${OPENAL_HASH} PREFIX ${BUILD_DIR}/openal - - CMAKE_ARGS - -DCMAKE_INSTALL_PREFIX=${LIBDIR}/openal - ${DEFAULT_CMAKE_FLAGS} - ${OPENAL_EXTRA_ARGS} - + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/openal ${DEFAULT_CMAKE_FLAGS} ${OPENAL_EXTRA_ARGS} INSTALL_DIR ${LIBDIR}/openal ) if(WIN32) ExternalProject_Add_Step(external_openal after_install - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/openal/lib/openal32.lib - ${HARVEST_TARGET}/openal/lib/openal32.lib - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/openal/bin/openal32.dll - ${HARVEST_TARGET}/openal/lib/openal32.dll - COMMAND ${CMAKE_COMMAND} -E copy_directory - ${LIBDIR}/openal/include/ - ${HARVEST_TARGET}/openal/include/ - + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/openal/lib/openal32.lib ${HARVEST_TARGET}/openal/lib/openal32.lib + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/openal/bin/openal32.dll ${HARVEST_TARGET}/openal/lib/openal32.dll + COMMAND ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/openal/include/ ${HARVEST_TARGET}/openal/include/ DEPENDEES install ) endif() diff --git a/build_files/build_environment/cmake/opencollada.cmake b/build_files/build_environment/cmake/opencollada.cmake index 986e1211b8f..b3ac65c96c5 100644 --- a/build_files/build_environment/cmake/opencollada.cmake +++ b/build_files/build_environment/cmake/opencollada.cmake @@ -40,18 +40,10 @@ ExternalProject_Add(external_opencollada DOWNLOAD_DIR ${DOWNLOAD_DIR} URL_HASH ${OPENCOLLADA_HASH_TYPE}=${OPENCOLLADA_HASH} PREFIX ${BUILD_DIR}/opencollada - PATCH_COMMAND ${PATCH_MAYBE_DOS2UNIX_CMD} - ${PATCH_CMD} -p 1 -N -d - ${BUILD_DIR}/opencollada/src/external_opencollada < - ${PATCH_DIR}/opencollada.diff - - CMAKE_ARGS - -DCMAKE_INSTALL_PREFIX=${LIBDIR}/opencollada - ${DEFAULT_CMAKE_FLAGS} - ${OPENCOLLADA_EXTRA_ARGS} - + ${PATCH_CMD} -p 1 -N -d ${BUILD_DIR}/opencollada/src/external_opencollada < ${PATCH_DIR}/opencollada.diff + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/opencollada ${DEFAULT_CMAKE_FLAGS} ${OPENCOLLADA_EXTRA_ARGS} INSTALL_DIR ${LIBDIR}/opencollada ) @@ -65,19 +57,13 @@ add_dependencies( if(WIN32) if(BUILD_MODE STREQUAL Release) ExternalProject_Add_Step(external_opencollada after_install - COMMAND ${CMAKE_COMMAND} -E copy_directory - ${LIBDIR}/opencollada/ - ${HARVEST_TARGET}/opencollada/ - + COMMAND ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/opencollada/ ${HARVEST_TARGET}/opencollada/ DEPENDEES install ) endif() if(BUILD_MODE STREQUAL Debug) ExternalProject_Add_Step(external_opencollada after_install - COMMAND ${CMAKE_COMMAND} -E copy_directory - ${LIBDIR}/opencollada/lib - ${HARVEST_TARGET}/opencollada/lib - + COMMAND ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/opencollada/lib ${HARVEST_TARGET}/opencollada/lib DEPENDEES install ) endif() diff --git a/build_files/build_environment/cmake/opencolorio.cmake b/build_files/build_environment/cmake/opencolorio.cmake index 8df5b961cea..d2ffbd82338 100644 --- a/build_files/build_environment/cmake/opencolorio.cmake +++ b/build_files/build_environment/cmake/opencolorio.cmake @@ -68,12 +68,7 @@ ExternalProject_Add(external_opencolorio URL_HASH ${OPENCOLORIO_HASH_TYPE}=${OPENCOLORIO_HASH} CMAKE_GENERATOR ${PLATFORM_ALT_GENERATOR} PREFIX ${BUILD_DIR}/opencolorio - - CMAKE_ARGS - -DCMAKE_INSTALL_PREFIX=${LIBDIR}/opencolorio - ${DEFAULT_CMAKE_FLAGS} - ${OPENCOLORIO_EXTRA_ARGS} - + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/opencolorio ${DEFAULT_CMAKE_FLAGS} ${OPENCOLORIO_EXTRA_ARGS} INSTALL_DIR ${LIBDIR}/opencolorio ) @@ -92,46 +87,25 @@ add_dependencies( if(WIN32) 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 - ${LIBDIR}/opencolorio/bin/OpenColorIO_2_3.dll - ${HARVEST_TARGET}/opencolorio/bin/OpenColorIO_2_3.dll - COMMAND ${CMAKE_COMMAND} -E copy_directory - ${LIBDIR}/opencolorio/lib - ${HARVEST_TARGET}/opencolorio/lib - + COMMAND ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/opencolorio/include ${HARVEST_TARGET}/opencolorio/include + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/opencolorio/bin/OpenColorIO_2_3.dll ${HARVEST_TARGET}/opencolorio/bin/OpenColorIO_2_3.dll + COMMAND ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/opencolorio/lib ${HARVEST_TARGET}/opencolorio/lib DEPENDEES install ) endif() if(BUILD_MODE STREQUAL Debug) ExternalProject_Add_Step(external_opencolorio after_install - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/opencolorio/bin/OpenColorIO_d_2_3.dll - ${HARVEST_TARGET}/opencolorio/bin/OpenColorIO_d_2_3.dll - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/opencolorio/lib/Opencolorio_d.lib - ${HARVEST_TARGET}/opencolorio/lib/OpenColorIO_d.lib - COMMAND ${CMAKE_COMMAND} -E copy_directory - ${LIBDIR}/opencolorio/lib/site-packages - ${HARVEST_TARGET}/opencolorio/lib/site-packages-debug - + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/opencolorio/bin/OpenColorIO_d_2_3.dll ${HARVEST_TARGET}/opencolorio/bin/OpenColorIO_d_2_3.dll + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/opencolorio/lib/Opencolorio_d.lib ${HARVEST_TARGET}/opencolorio/lib/OpenColorIO_d.lib + COMMAND ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/opencolorio/lib/site-packages ${HARVEST_TARGET}/opencolorio/lib/site-packages-debug 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 - ${LIBDIR}/pystring/lib/libpystring.a - ${LIBDIR}/opencolorio/lib/ - + COMMAND cp ${LIBDIR}/yamlcpp/lib/libyaml-cpp.a ${LIBDIR}/opencolorio/lib/ + COMMAND cp ${LIBDIR}/expat/lib/libexpat.a ${LIBDIR}/opencolorio/lib/ + COMMAND cp ${LIBDIR}/pystring/lib/libpystring.a ${LIBDIR}/opencolorio/lib/ DEPENDEES install ) endif() diff --git a/build_files/build_environment/cmake/openexr.cmake b/build_files/build_environment/cmake/openexr.cmake index ea458c1cf05..32787cde37c 100644 --- a/build_files/build_environment/cmake/openexr.cmake +++ b/build_files/build_environment/cmake/openexr.cmake @@ -28,46 +28,22 @@ ExternalProject_Add(external_openexr URL file://${PACKAGE_DIR}/${OPENEXR_FILE} DOWNLOAD_DIR ${DOWNLOAD_DIR} URL_HASH ${OPENEXR_HASH_TYPE}=${OPENEXR_HASH} - - PATCH_COMMAND ${PATCH_CMD} -p 2 -d - ${BUILD_DIR}/openexr/src/external_openexr < - ${PATCH_DIR}/openexr_deflate_1588.diff - + PATCH_COMMAND ${PATCH_CMD} -p 2 -d ${BUILD_DIR}/openexr/src/external_openexr < ${PATCH_DIR}/openexr_deflate_1588.diff CMAKE_GENERATOR ${PLATFORM_ALT_GENERATOR} PREFIX ${BUILD_DIR}/openexr - - CMAKE_ARGS - -DCMAKE_INSTALL_PREFIX=${LIBDIR}/openexr - ${DEFAULT_CMAKE_FLAGS} - ${OPENEXR_EXTRA_ARGS} - + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/openexr ${DEFAULT_CMAKE_FLAGS} ${OPENEXR_EXTRA_ARGS} INSTALL_DIR ${LIBDIR}/openexr ) if(WIN32) ExternalProject_Add_Step(external_openexr after_install - COMMAND ${CMAKE_COMMAND} -E copy_directory - ${LIBDIR}/openexr/lib - ${HARVEST_TARGET}/openexr/lib - COMMAND ${CMAKE_COMMAND} -E copy_directory - ${LIBDIR}/openexr/include - ${HARVEST_TARGET}/openexr/include - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/openexr/bin/Iex${OPENEXR_VERSION_POSTFIX}.dll - ${HARVEST_TARGET}/openexr/bin/Iex${OPENEXR_VERSION_POSTFIX}.dll - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/openexr/bin/IlmThread${OPENEXR_VERSION_POSTFIX}.dll - ${HARVEST_TARGET}/openexr/bin/IlmThread${OPENEXR_VERSION_POSTFIX}.dll - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/openexr/bin/OpenEXRCore${OPENEXR_VERSION_POSTFIX}.dll - ${HARVEST_TARGET}/openexr/bin/OpenEXRCore${OPENEXR_VERSION_POSTFIX}.dll - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/openexr/bin/OpenEXRUtil${OPENEXR_VERSION_POSTFIX}.dll - ${HARVEST_TARGET}/openexr/bin/OpenEXRUtil${OPENEXR_VERSION_POSTFIX}.dll - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/openexr/bin/OpenEXR${OPENEXR_VERSION_POSTFIX}.dll - ${HARVEST_TARGET}/openexr/bin/OpenEXR${OPENEXR_VERSION_POSTFIX}.dll - + COMMAND ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/openexr/lib ${HARVEST_TARGET}/openexr/lib + COMMAND ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/openexr/include ${HARVEST_TARGET}/openexr/include + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/openexr/bin/Iex${OPENEXR_VERSION_POSTFIX}.dll ${HARVEST_TARGET}/openexr/bin/Iex${OPENEXR_VERSION_POSTFIX}.dll + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/openexr/bin/IlmThread${OPENEXR_VERSION_POSTFIX}.dll ${HARVEST_TARGET}/openexr/bin/IlmThread${OPENEXR_VERSION_POSTFIX}.dll + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/openexr/bin/OpenEXRCore${OPENEXR_VERSION_POSTFIX}.dll ${HARVEST_TARGET}/openexr/bin/OpenEXRCore${OPENEXR_VERSION_POSTFIX}.dll + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/openexr/bin/OpenEXRUtil${OPENEXR_VERSION_POSTFIX}.dll ${HARVEST_TARGET}/openexr/bin/OpenEXRUtil${OPENEXR_VERSION_POSTFIX}.dll + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/openexr/bin/OpenEXR${OPENEXR_VERSION_POSTFIX}.dll ${HARVEST_TARGET}/openexr/bin/OpenEXR${OPENEXR_VERSION_POSTFIX}.dll DEPENDEES install ) endif() diff --git a/build_files/build_environment/cmake/openimagedenoise.cmake b/build_files/build_environment/cmake/openimagedenoise.cmake index f4e6171ac33..2163b634fdb 100644 --- a/build_files/build_environment/cmake/openimagedenoise.cmake +++ b/build_files/build_environment/cmake/openimagedenoise.cmake @@ -17,22 +17,15 @@ if(APPLE) else() set(OIDN_EXTRA_ARGS ${OIDN_EXTRA_ARGS} - -DOIDN_DEVICE_CPU=ON + -DOIDN_DEVICE_SYCL=ON + -DOIDN_DEVICE_SYCL_AOT=OFF + -DOIDN_DEVICE_CUDA=ON + -DOIDN_DEVICE_HIP=ON -DLEVEL_ZERO_ROOT=${LIBDIR}/level-zero ) - - # x64 platforms support SyCL, ARM64 don't - if(NOT BLENDER_PLATFORM_WINDOWS_ARM) - set(OIDN_EXTRA_ARGS - ${OIDN_EXTRA_ARGS} - -DOIDN_DEVICE_SYCL=ON - -DOIDN_DEVICE_SYCL_AOT=OFF - -DOIDN_DEVICE_CUDA=ON - -DOIDN_DEVICE_HIP=ON) - endif() endif() -if(WIN32 AND NOT BLENDER_PLATFORM_WINDOWS_ARM) +if(WIN32) set(OIDN_EXTRA_ARGS ${OIDN_EXTRA_ARGS} -DTBB_DEBUG_LIBRARY=${LIBDIR}/tbb/lib/tbb.lib @@ -48,7 +41,7 @@ if(WIN32 AND NOT BLENDER_PLATFORM_WINDOWS_ARM) -DCMAKE_EXE_LINKER_FLAGS=-L"${LIBDIR}/dpcpp/lib" ) else() - if(NOT (APPLE OR BLENDER_PLATFORM_WINDOWS_ARM)) + if(NOT APPLE) set(OIDN_EXTRA_ARGS ${OIDN_EXTRA_ARGS} -DCMAKE_CXX_COMPILER=${LIBDIR}/dpcpp/bin/clang++ @@ -80,12 +73,7 @@ ExternalProject_Add(external_openimagedenoise URL_HASH ${OIDN_HASH_TYPE}=${OIDN_HASH} PREFIX ${BUILD_DIR}/openimagedenoise CMAKE_GENERATOR ${PLATFORM_ALT_GENERATOR} - - CMAKE_ARGS - -DCMAKE_INSTALL_PREFIX=${LIBDIR}/openimagedenoise - ${OIDN_CMAKE_FLAGS} - ${OIDN_EXTRA_ARGS} - + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/openimagedenoise ${OIDN_CMAKE_FLAGS} ${OIDN_EXTRA_ARGS} PATCH_COMMAND ${ODIN_PATCH_COMMAND} INSTALL_DIR ${LIBDIR}/openimagedenoise ) @@ -116,16 +104,9 @@ endif() if(BUILD_MODE STREQUAL Release AND WIN32) ExternalProject_Add_Step(external_openimagedenoise after_install - COMMAND ${CMAKE_COMMAND} -E copy_directory - ${LIBDIR}/openimagedenoise/bin - ${HARVEST_TARGET}/openimagedenoise/bin - COMMAND ${CMAKE_COMMAND} -E copy_directory - ${LIBDIR}/openimagedenoise/lib - ${HARVEST_TARGET}/openimagedenoise/lib - COMMAND ${CMAKE_COMMAND} -E copy_directory - ${LIBDIR}/openimagedenoise/include - ${HARVEST_TARGET}/openimagedenoise/include - + COMMAND ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/openimagedenoise/bin ${HARVEST_TARGET}/openimagedenoise/bin + COMMAND ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/openimagedenoise/lib ${HARVEST_TARGET}/openimagedenoise/lib + COMMAND ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/openimagedenoise/include ${HARVEST_TARGET}/openimagedenoise/include DEPENDEES install ) endif() diff --git a/build_files/build_environment/cmake/openimageio.cmake b/build_files/build_environment/cmake/openimageio.cmake index c0f40f8fa7c..440ec9d1644 100644 --- a/build_files/build_environment/cmake/openimageio.cmake +++ b/build_files/build_environment/cmake/openimageio.cmake @@ -17,11 +17,7 @@ else() endif() if(WIN32) - if(BLENDER_PLATFORM_ARM) - set(OIIO_SIMD_FLAGS -DUSE_SIMD=0) - else() - set(OIIO_SIMD_FLAGS -DUSE_SIMD=sse2) - endif() + set(OIIO_SIMD_FLAGS -DUSE_SIMD=sse2) set(OPENJPEG_POSTFIX _msvc) if(BUILD_MODE STREQUAL Debug) set(TIFF_POSTFIX d) @@ -112,26 +108,11 @@ ExternalProject_Add(external_openimageio URL_HASH ${OPENIMAGEIO_HASH_TYPE}=${OPENIMAGEIO_HASH} CMAKE_GENERATOR ${PLATFORM_ALT_GENERATOR} PREFIX ${BUILD_DIR}/openimageio - - PATCH_COMMAND - ${PATCH_CMD} -p 1 -N -d - ${BUILD_DIR}/openimageio/src/external_openimageio/ < - ${PATCH_DIR}/openimageio.diff && - ${PATCH_CMD} -p 1 -N -d - ${BUILD_DIR}/openimageio/src/external_openimageio/ < - ${PATCH_DIR}/oiio_webp.diff && - ${PATCH_CMD} -p 1 -N -d - ${BUILD_DIR}/openimageio/src/external_openimageio/ < - ${PATCH_DIR}/oiio_4044.diff && - ${PATCH_CMD} -p 1 -N -d - ${BUILD_DIR}/openimageio/src/external_openimageio/ < - ${PATCH_DIR}/oiio_4062.diff - - CMAKE_ARGS - -DCMAKE_INSTALL_PREFIX=${LIBDIR}/openimageio - ${DEFAULT_CMAKE_FLAGS} - ${OPENIMAGEIO_EXTRA_ARGS} - + PATCH_COMMAND ${PATCH_CMD} -p 1 -N -d ${BUILD_DIR}/openimageio/src/external_openimageio/ < ${PATCH_DIR}/openimageio.diff && + ${PATCH_CMD} -p 1 -N -d ${BUILD_DIR}/openimageio/src/external_openimageio/ < ${PATCH_DIR}/oiio_webp.diff && + ${PATCH_CMD} -p 1 -N -d ${BUILD_DIR}/openimageio/src/external_openimageio/ < ${PATCH_DIR}/oiio_4044.diff && + ${PATCH_CMD} -p 1 -N -d ${BUILD_DIR}/openimageio/src/external_openimageio/ < ${PATCH_DIR}/oiio_4062.diff + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/openimageio ${DEFAULT_CMAKE_FLAGS} ${OPENIMAGEIO_EXTRA_ARGS} INSTALL_DIR ${LIBDIR}/openimageio ) @@ -157,58 +138,26 @@ add_dependencies( if(WIN32) if(BUILD_MODE STREQUAL Release) ExternalProject_Add_Step(external_openimageio after_install - COMMAND ${CMAKE_COMMAND} -E copy_directory - ${LIBDIR}/OpenImageIO/include - ${HARVEST_TARGET}/OpenImageIO/include - COMMAND ${CMAKE_COMMAND} -E copy_directory - ${LIBDIR}/OpenImageIO/lib - ${HARVEST_TARGET}/OpenImageIO/lib - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/OpenImageIO/bin/iconvert.exe - ${HARVEST_TARGET}/OpenImageIO/bin/iconvert.exe - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/OpenImageIO/bin/idiff.exe - ${HARVEST_TARGET}/OpenImageIO/bin/idiff.exe - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/OpenImageIO/bin/igrep.exe - ${HARVEST_TARGET}/OpenImageIO/bin/igrep.exe - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/OpenImageIO/bin/iinfo.exe - ${HARVEST_TARGET}/OpenImageIO/bin/iinfo.exe - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/OpenImageIO/bin/maketx.exe - ${HARVEST_TARGET}/OpenImageIO/bin/maketx.exe - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/OpenImageIO/bin/oiiotool.exe - ${HARVEST_TARGET}/OpenImageIO/bin/oiiotool.exe - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/OpenImageIO/bin/OpenImageIO.dll - ${HARVEST_TARGET}/OpenImageIO/bin/OpenImageIO.dll - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/OpenImageIO/bin/OpenImageIO_Util.dll - ${HARVEST_TARGET}/OpenImageIO/bin/OpenImageIO_Util.dll - + COMMAND ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/OpenImageIO/include ${HARVEST_TARGET}/OpenImageIO/include + COMMAND ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/OpenImageIO/lib ${HARVEST_TARGET}/OpenImageIO/lib + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/OpenImageIO/bin/iconvert.exe ${HARVEST_TARGET}/OpenImageIO/bin/iconvert.exe + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/OpenImageIO/bin/idiff.exe ${HARVEST_TARGET}/OpenImageIO/bin/idiff.exe + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/OpenImageIO/bin/igrep.exe ${HARVEST_TARGET}/OpenImageIO/bin/igrep.exe + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/OpenImageIO/bin/iinfo.exe ${HARVEST_TARGET}/OpenImageIO/bin/iinfo.exe + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/OpenImageIO/bin/maketx.exe ${HARVEST_TARGET}/OpenImageIO/bin/maketx.exe + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/OpenImageIO/bin/oiiotool.exe ${HARVEST_TARGET}/OpenImageIO/bin/oiiotool.exe + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/OpenImageIO/bin/OpenImageIO.dll ${HARVEST_TARGET}/OpenImageIO/bin/OpenImageIO.dll + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/OpenImageIO/bin/OpenImageIO_Util.dll ${HARVEST_TARGET}/OpenImageIO/bin/OpenImageIO_Util.dll DEPENDEES install ) endif() if(BUILD_MODE STREQUAL Debug) ExternalProject_Add_Step(external_openimageio after_install - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/openimageio/lib/OpenImageIO_d.lib - ${HARVEST_TARGET}/openimageio/lib/OpenImageIO_d.lib - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/openimageio/lib/OpenImageIO_Util_d.lib - ${HARVEST_TARGET}/openimageio/lib/OpenImageIO_Util_d.lib - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/OpenImageIO/bin/OpenImageIO_d.dll - ${HARVEST_TARGET}/OpenImageIO/bin/OpenImageIO_d.dll - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/OpenImageIO/bin/OpenImageIO_Util_d.dll - ${HARVEST_TARGET}/OpenImageIO/bin/OpenImageIO_Util_d.dll - COMMAND ${CMAKE_COMMAND} -E copy_directory - ${LIBDIR}/OpenImageIO/lib/python${PYTHON_SHORT_VERSION}/ - ${HARVEST_TARGET}/OpenImageIO/lib/python${PYTHON_SHORT_VERSION}_debug/ - + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/openimageio/lib/OpenImageIO_d.lib ${HARVEST_TARGET}/openimageio/lib/OpenImageIO_d.lib + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/openimageio/lib/OpenImageIO_Util_d.lib ${HARVEST_TARGET}/openimageio/lib/OpenImageIO_Util_d.lib + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/OpenImageIO/bin/OpenImageIO_d.dll ${HARVEST_TARGET}/OpenImageIO/bin/OpenImageIO_d.dll + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/OpenImageIO/bin/OpenImageIO_Util_d.dll ${HARVEST_TARGET}/OpenImageIO/bin/OpenImageIO_Util_d.dll + COMMAND ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/OpenImageIO/lib/python${PYTHON_SHORT_VERSION}/ ${HARVEST_TARGET}/OpenImageIO/lib/python${PYTHON_SHORT_VERSION}_debug/ DEPENDEES install ) endif() diff --git a/build_files/build_environment/cmake/openjpeg.cmake b/build_files/build_environment/cmake/openjpeg.cmake index cc3af20d18f..053e63be906 100644 --- a/build_files/build_environment/cmake/openjpeg.cmake +++ b/build_files/build_environment/cmake/openjpeg.cmake @@ -19,22 +19,9 @@ if(NOT WIN32) DOWNLOAD_DIR ${DOWNLOAD_DIR} URL_HASH ${OPENJPEG_HASH_TYPE}=${OPENJPEG_HASH} PREFIX ${BUILD_DIR}/openjpeg - - CONFIGURE_COMMAND ${CONFIGURE_ENV} && - cd ${BUILD_DIR}/openjpeg/src/external_openjpeg-build && - ${CMAKE_COMMAND} - ${OPENJPEG_EXTRA_ARGS} - -DCMAKE_INSTALL_PREFIX=${LIBDIR}/openjpeg - ${BUILD_DIR}/openjpeg/src/external_openjpeg - - BUILD_COMMAND ${CONFIGURE_ENV} && - cd ${BUILD_DIR}/openjpeg/src/external_openjpeg-build/ && - make -j${MAKE_THREADS} - - INSTALL_COMMAND ${CONFIGURE_ENV} && - cd ${BUILD_DIR}/openjpeg/src/external_openjpeg-build/ && - make install - + CONFIGURE_COMMAND ${CONFIGURE_ENV} && cd ${BUILD_DIR}/openjpeg/src/external_openjpeg-build && ${CMAKE_COMMAND} ${OPENJPEG_EXTRA_ARGS} -DCMAKE_INSTALL_PREFIX=${LIBDIR}/openjpeg ${BUILD_DIR}/openjpeg/src/external_openjpeg + BUILD_COMMAND ${CONFIGURE_ENV} && cd ${BUILD_DIR}/openjpeg/src/external_openjpeg-build/ && make -j${MAKE_THREADS} + INSTALL_COMMAND ${CONFIGURE_ENV} && cd ${BUILD_DIR}/openjpeg/src/external_openjpeg-build/ && make install INSTALL_DIR ${LIBDIR}/openjpeg ) else() @@ -43,34 +30,20 @@ else() URL file://${PACKAGE_DIR}/${OPENJPEG_FILE} DOWNLOAD_DIR ${DOWNLOAD_DIR} URL_HASH ${OPENJPEG_HASH_TYPE}=${OPENJPEG_HASH} - - PATCH_COMMAND ${PATCH_CMD} -p 1 -d - ${BUILD_DIR}/openjpeg_msvc/src/external_openjpeg_msvc < - ${PATCH_DIR}/openjpeg_msvc.diff - + PATCH_COMMAND ${PATCH_CMD} -p 1 -d ${BUILD_DIR}/openjpeg_msvc/src/external_openjpeg_msvc < ${PATCH_DIR}/openjpeg_msvc.diff PREFIX ${BUILD_DIR}/openjpeg_msvc - - CMAKE_ARGS - ${OPENJPEG_EXTRA_ARGS} - -DCMAKE_INSTALL_PREFIX=${LIBDIR}/openjpeg_msvc - -DBUILD_SHARED_LIBS=Off - -DBUILD_THIRDPARTY=OFF - + CMAKE_ARGS ${OPENJPEG_EXTRA_ARGS} -DCMAKE_INSTALL_PREFIX=${LIBDIR}/openjpeg_msvc -DBUILD_SHARED_LIBS=Off -DBUILD_THIRDPARTY=OFF INSTALL_DIR ${LIBDIR}/openjpeg_msvc ) if(BUILD_MODE STREQUAL Release) ExternalProject_Add_Step(external_openjpeg_msvc after_install COMMAND - ${CMAKE_COMMAND} -E copy_directory - ${LIBDIR}/openjpeg_msvc/lib - ${HARVEST_TARGET}/openjpeg/lib && - ${CMAKE_COMMAND} -E copy_directory - ${LIBDIR}/openjpeg_msvc/include - ${HARVEST_TARGET}/openjpeg/include + ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/openjpeg_msvc/lib ${HARVEST_TARGET}/openjpeg/lib && + ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/openjpeg_msvc/include ${HARVEST_TARGET}/openjpeg/include DEPENDEES install ) - endif() +endif() endif() set(OPENJPEG_LIBRARY libopenjp2${LIBEXT}) diff --git a/build_files/build_environment/cmake/openmp.cmake b/build_files/build_environment/cmake/openmp.cmake index bf3fd94ec0b..33825dc3b8e 100644 --- a/build_files/build_environment/cmake/openmp.cmake +++ b/build_files/build_environment/cmake/openmp.cmake @@ -3,11 +3,7 @@ # SPDX-License-Identifier: GPL-2.0-or-later if(APPLE) - set(OPENMP_PATCH_COMMAND - ${PATCH_CMD} -p 1 -d - ${BUILD_DIR}/openmp/src/external_openmp < - ${PATCH_DIR}/openmp.diff - ) + set(OPENMP_PATCH_COMMAND ${PATCH_CMD} -p 1 -d ${BUILD_DIR}/openmp/src/external_openmp < ${PATCH_DIR}/openmp.diff) else() set(OPENMP_PATCH_COMMAND) endif() @@ -18,16 +14,8 @@ ExternalProject_Add(external_openmp URL_HASH ${OPENMP_HASH_TYPE}=${OPENMP_HASH} PREFIX ${BUILD_DIR}/openmp PATCH_COMMAND ${OPENMP_PATCH_COMMAND} - - CMAKE_ARGS - -DCMAKE_INSTALL_PREFIX=${LIBDIR}/openmp - ${DEFAULT_CMAKE_FLAGS} - - INSTALL_COMMAND - cd ${BUILD_DIR}/openmp/src/external_openmp-build && - install_name_tool -id @rpath/libomp.dylib runtime/src/libomp.dylib && - make install - + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/openmp ${DEFAULT_CMAKE_FLAGS} + INSTALL_COMMAND cd ${BUILD_DIR}/openmp/src/external_openmp-build && install_name_tool -id @rpath/libomp.dylib runtime/src/libomp.dylib && make install INSTALL_DIR ${LIBDIR}/openmp ) diff --git a/build_files/build_environment/cmake/openpgl.cmake b/build_files/build_environment/cmake/openpgl.cmake index f00d9835c54..53e3daa8841 100644 --- a/build_files/build_environment/cmake/openpgl.cmake +++ b/build_files/build_environment/cmake/openpgl.cmake @@ -24,12 +24,7 @@ ExternalProject_Add(external_openpgl DOWNLOAD_DIR ${DOWNLOAD_DIR} URL_HASH ${OPENPGL_HASH_TYPE}=${OPENPGL_HASH} PREFIX ${BUILD_DIR}/openpgl - - CMAKE_ARGS - -DCMAKE_INSTALL_PREFIX=${LIBDIR}/openpgl - ${DEFAULT_CMAKE_FLAGS} - ${OPENPGL_EXTRA_ARGS} - + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/openpgl ${DEFAULT_CMAKE_FLAGS} ${OPENPGL_EXTRA_ARGS} INSTALL_DIR ${LIBDIR}/openpgl ) @@ -41,21 +36,13 @@ add_dependencies( if(WIN32) if(BUILD_MODE STREQUAL Release) ExternalProject_Add_Step(external_openpgl after_install - COMMAND ${CMAKE_COMMAND} -E copy_directory - ${LIBDIR}/openpgl - ${HARVEST_TARGET}/openpgl - + COMMAND ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/openpgl ${HARVEST_TARGET}/openpgl DEPENDEES install ) else() ExternalProject_Add_Step(external_openpgl after_install - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/openpgl/lib/openpgl_d.lib - ${HARVEST_TARGET}/openpgl/lib/openpgl_d.lib - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/openpgl/lib/cmake/openpgl-${OPENPGL_SHORT_VERSION}/openpgl_Exports-debug.cmake - ${HARVEST_TARGET}/openpgl/lib/cmake/openpgl-${OPENPGL_SHORT_VERSION}/openpgl_Exports-debug.cmake - + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/openpgl/lib/openpgl_d.lib ${HARVEST_TARGET}/openpgl/lib/openpgl_d.lib + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/openpgl/lib/cmake/openpgl-${OPENPGL_SHORT_VERSION}/openpgl_Exports-debug.cmake ${HARVEST_TARGET}/openpgl/lib/cmake/openpgl-${OPENPGL_SHORT_VERSION}/openpgl_Exports-debug.cmake DEPENDEES install ) endif() diff --git a/build_files/build_environment/cmake/opensubdiv.cmake b/build_files/build_environment/cmake/opensubdiv.cmake index c3e6613abff..4d5eff38211 100644 --- a/build_files/build_environment/cmake/opensubdiv.cmake +++ b/build_files/build_environment/cmake/opensubdiv.cmake @@ -31,37 +31,22 @@ ExternalProject_Add(external_opensubdiv URL_HASH ${OPENSUBDIV_HASH_TYPE}=${OPENSUBDIV_HASH} PREFIX ${BUILD_DIR}/opensubdiv CMAKE_GENERATOR ${PLATFORM_ALT_GENERATOR} - - CMAKE_ARGS - -DCMAKE_INSTALL_PREFIX=${LIBDIR}/opensubdiv - -Wno-dev ${DEFAULT_CMAKE_FLAGS} - ${OPENSUBDIV_EXTRA_ARGS} - + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/opensubdiv -Wno-dev ${DEFAULT_CMAKE_FLAGS} ${OPENSUBDIV_EXTRA_ARGS} INSTALL_DIR ${LIBDIR}/opensubdiv ) if(WIN32) if(BUILD_MODE STREQUAL Release) ExternalProject_Add_Step(external_opensubdiv after_install - COMMAND ${CMAKE_COMMAND} -E copy_directory - ${LIBDIR}/opensubdiv/lib - ${HARVEST_TARGET}/opensubdiv/lib - COMMAND ${CMAKE_COMMAND} -E copy_directory - ${LIBDIR}/opensubdiv/include - ${HARVEST_TARGET}/opensubdiv/include - + COMMAND ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/opensubdiv/lib ${HARVEST_TARGET}/opensubdiv/lib + COMMAND ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/opensubdiv/include ${HARVEST_TARGET}/opensubdiv/include DEPENDEES install ) endif() if(BUILD_MODE STREQUAL Debug) ExternalProject_Add_Step(external_opensubdiv after_install - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/opensubdiv/lib/osdCPU.lib - ${HARVEST_TARGET}/opensubdiv/lib/osdCPU_d.lib - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/opensubdiv/lib/osdGPU.lib - ${HARVEST_TARGET}/opensubdiv/lib/osdGPU_d.lib - + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/opensubdiv/lib/osdCPU.lib ${HARVEST_TARGET}/opensubdiv/lib/osdCPU_d.lib + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/opensubdiv/lib/osdGPU.lib ${HARVEST_TARGET}/opensubdiv/lib/osdGPU_d.lib DEPENDEES install ) endif() diff --git a/build_files/build_environment/cmake/openvdb.cmake b/build_files/build_environment/cmake/openvdb.cmake index cebdc46681d..5f5dbe00895 100644 --- a/build_files/build_environment/cmake/openvdb.cmake +++ b/build_files/build_environment/cmake/openvdb.cmake @@ -48,15 +48,9 @@ set(OPENVDB_EXTRA_ARGS ) set(OPENVDB_PATCH - ${PATCH_CMD} -p 1 -d - ${BUILD_DIR}/openvdb/src/openvdb < - ${PATCH_DIR}/openvdb.diff && - ${PATCH_CMD} -p 1 -d - ${BUILD_DIR}/openvdb/src/openvdb < - ${PATCH_DIR}/openvdb_1706.diff && - ${PATCH_CMD} -p 1 -d - ${BUILD_DIR}/openvdb/src/openvdb < - ${PATCH_DIR}/openvdb_1733.diff + ${PATCH_CMD} -p 1 -d ${BUILD_DIR}/openvdb/src/openvdb < ${PATCH_DIR}/openvdb.diff && + ${PATCH_CMD} -p 1 -d ${BUILD_DIR}/openvdb/src/openvdb < ${PATCH_DIR}/openvdb_1706.diff && + ${PATCH_CMD} -p 1 -d ${BUILD_DIR}/openvdb/src/openvdb < ${PATCH_DIR}/openvdb_1733.diff ) ExternalProject_Add(openvdb @@ -66,12 +60,7 @@ ExternalProject_Add(openvdb CMAKE_GENERATOR ${PLATFORM_ALT_GENERATOR} PREFIX ${BUILD_DIR}/openvdb PATCH_COMMAND ${OPENVDB_PATCH} - - CMAKE_ARGS - -DCMAKE_INSTALL_PREFIX=${LIBDIR}/openvdb - ${DEFAULT_CMAKE_FLAGS} - ${OPENVDB_EXTRA_ARGS} - + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/openvdb ${DEFAULT_CMAKE_FLAGS} ${OPENVDB_EXTRA_ARGS} INSTALL_DIR ${LIBDIR}/openvdb ) @@ -87,41 +76,20 @@ add_dependencies( ) if(WIN32) - if(BLENDER_PLATFORM_ARM) - set(OPENVDB_ARCH arm64) - else() - set(OPENVDB_ARCH amd64) - endif() if(BUILD_MODE STREQUAL Release) ExternalProject_Add_Step(openvdb after_install - COMMAND ${CMAKE_COMMAND} -E copy_directory - ${LIBDIR}/openvdb/include - ${HARVEST_TARGET}/openvdb/include - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/openvdb/lib/openvdb.lib - ${HARVEST_TARGET}/openvdb/lib/openvdb.lib - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/openvdb/bin/openvdb.dll - ${HARVEST_TARGET}/openvdb/bin/openvdb.dll - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/openvdb/lib/python${PYTHON_SHORT_VERSION}/site-packages/pyopenvdb.cp${PYTHON_SHORT_VERSION_NO_DOTS}-win_${OPENVDB_ARCH}.pyd - ${HARVEST_TARGET}openvdb/python/pyopenvdb.cp${PYTHON_SHORT_VERSION_NO_DOTS}-win_${OPENVDB_ARCH}.pyd - + COMMAND ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/openvdb/include ${HARVEST_TARGET}/openvdb/include + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/openvdb/lib/openvdb.lib ${HARVEST_TARGET}/openvdb/lib/openvdb.lib + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/openvdb/bin/openvdb.dll ${HARVEST_TARGET}/openvdb/bin/openvdb.dll + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/openvdb/lib/python${PYTHON_SHORT_VERSION}/site-packages/pyopenvdb.cp${PYTHON_SHORT_VERSION_NO_DOTS}-win_amd64.pyd ${HARVEST_TARGET}openvdb/python/pyopenvdb.cp${PYTHON_SHORT_VERSION_NO_DOTS}-win_amd64.pyd DEPENDEES install ) endif() if(BUILD_MODE STREQUAL Debug) ExternalProject_Add_Step(openvdb after_install - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/openvdb/lib/openvdb_d.lib - ${HARVEST_TARGET}/openvdb/lib/openvdb_d.lib - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/openvdb/bin/openvdb_d.dll - ${HARVEST_TARGET}/openvdb/bin/openvdb_d.dll - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/openvdb/lib/python${PYTHON_SHORT_VERSION}/site-packages/pyopenvdb_d.cp${PYTHON_SHORT_VERSION_NO_DOTS}-win_${OPENVDB_ARCH}.pyd - ${HARVEST_TARGET}openvdb/python/pyopenvdb_d.cp${PYTHON_SHORT_VERSION_NO_DOTS}-win_${OPENVDB_ARCH}.pyd - + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/openvdb/lib/openvdb_d.lib ${HARVEST_TARGET}/openvdb/lib/openvdb_d.lib + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/openvdb/bin/openvdb_d.dll ${HARVEST_TARGET}/openvdb/bin/openvdb_d.dll + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/openvdb/lib/python${PYTHON_SHORT_VERSION}/site-packages/pyopenvdb_d.cp${PYTHON_SHORT_VERSION_NO_DOTS}-win_amd64.pyd ${HARVEST_TARGET}openvdb/python/pyopenvdb_d.cp${PYTHON_SHORT_VERSION_NO_DOTS}-win_amd64.pyd DEPENDEES install ) endif() diff --git a/build_files/build_environment/cmake/options.cmake b/build_files/build_environment/cmake/options.cmake index 47bf54338fb..7e78e423d18 100644 --- a/build_files/build_environment/cmake/options.cmake +++ b/build_files/build_environment/cmake/options.cmake @@ -41,10 +41,6 @@ message("PATCH_DIR = ${PATCH_DIR}") message("BUILD_DIR = ${BUILD_DIR}") if(WIN32) - if(CMAKE_SYSTEM_PROCESSOR STREQUAL "ARM64") - set(BLENDER_PLATFORM_ARM ON) - set(BLENDER_PLATFORM_WINDOWS_ARM ON) - endif() set(PATCH_CMD ${DOWNLOAD_DIR}/msys2/msys64/usr/bin/patch.exe) set(LIBEXT ".lib") set(SHAREDLIBEXT ".lib") @@ -116,25 +112,7 @@ if(WIN32) set(PLATFORM_FLAGS) set(PLATFORM_CXX_FLAGS) - - if(BLENDER_PLATFORM_ARM) - # In some cases on ARM64 (unsure why), dep builds using the "Ninja" generator appear to use - # the x86 host tools (ie, x86 cl.exe producing ARM64 binaries). This is problematic when - # building things like LLVM, as memory is limited to 3GB, giving internal compiler errors. - # Here, we set CMAKE_C_COMPILER et al via PLATFORM_CMAKE_FLAGS to point to the ARM64 native - # binary, which doesn't have this issue. - # We make an assumption that the tools (ie, right now in the code) are the ones we want - set(PLATFORM_CMAKE_FLAGS - -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER} - -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER} - -DCMAKE_AR=${CMAKE_AR} - -DCMAKE_LINKER=${CMAKE_LINKER} - -DCMAKE_MT=${CMAKE_MT} - -DCMAKE_RC_COMPILER=${CMAKE_RC_COMPILER} - ) - else() - set(PLATFORM_CMAKE_FLAGS) - endif() + set(PLATFORM_CMAKE_FLAGS) set(MINGW_PATH ${DOWNLOAD_DIR}/msys2/msys64/) set(MINGW_SHELL ming64sh.cmd) diff --git a/build_files/build_environment/cmake/opus.cmake b/build_files/build_environment/cmake/opus.cmake index b9b948df60f..12a892e1803 100644 --- a/build_files/build_environment/cmake/opus.cmake +++ b/build_files/build_environment/cmake/opus.cmake @@ -16,24 +16,13 @@ if(NOT WIN32) DOWNLOAD_DIR ${DOWNLOAD_DIR} URL_HASH ${OPUS_HASH_TYPE}=${OPUS_HASH} PREFIX ${BUILD_DIR}/opus - - CONFIGURE_COMMAND ${CONFIGURE_ENV} && - cd ${BUILD_DIR}/opus/src/external_opus/ && - ${CONFIGURE_COMMAND} - --prefix=${LIBDIR}/opus - --disable-shared - --enable-static - --with-pic - --disable-maintainer-mode - - BUILD_COMMAND ${CONFIGURE_ENV} && - cd ${BUILD_DIR}/opus/src/external_opus/ && - make -j${MAKE_THREADS} - - INSTALL_COMMAND ${CONFIGURE_ENV} && - cd ${BUILD_DIR}/opus/src/external_opus/ && - make install - + CONFIGURE_COMMAND ${CONFIGURE_ENV} && cd ${BUILD_DIR}/opus/src/external_opus/ && ${CONFIGURE_COMMAND} --prefix=${LIBDIR}/opus + --disable-shared + --enable-static + --with-pic + --disable-maintainer-mode + BUILD_COMMAND ${CONFIGURE_ENV} && cd ${BUILD_DIR}/opus/src/external_opus/ && make -j${MAKE_THREADS} + INSTALL_COMMAND ${CONFIGURE_ENV} && cd ${BUILD_DIR}/opus/src/external_opus/ && make install INSTALL_DIR ${LIBDIR}/opus ) else() @@ -42,16 +31,8 @@ else() DOWNLOAD_DIR ${DOWNLOAD_DIR} URL_HASH ${OPUS_HASH_TYPE}=${OPUS_HASH} PREFIX ${BUILD_DIR}/opus - - PATCH_COMMAND COMMAND - ${PATCH_CMD} -p 1 -d - ${BUILD_DIR}/opus/src/external_opus < - ${PATCH_DIR}/opus_windows.diff - - CMAKE_ARGS - -DCMAKE_INSTALL_PREFIX=${LIBDIR}/opus - ${OPUS_CMAKE_ARGS} - + PATCH_COMMAND COMMAND ${PATCH_CMD} -p 1 -d ${BUILD_DIR}/opus/src/external_opus < ${PATCH_DIR}/opus_windows.diff + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/opus ${OPUS_CMAKE_ARGS} INSTALL_DIR ${LIBDIR}/opus ) endif() diff --git a/build_files/build_environment/cmake/osl.cmake b/build_files/build_environment/cmake/osl.cmake index 7277b102158..07be3eb0913 100644 --- a/build_files/build_environment/cmake/osl.cmake +++ b/build_files/build_environment/cmake/osl.cmake @@ -54,17 +54,8 @@ ExternalProject_Add(external_osl LIST_SEPARATOR ^^ URL_HASH ${OSL_HASH_TYPE}=${OSL_HASH} PREFIX ${BUILD_DIR}/osl - - PATCH_COMMAND ${PATCH_CMD} -p 1 -d - ${BUILD_DIR}/osl/src/external_osl < - ${PATCH_DIR}/osl.diff - - CMAKE_ARGS - -DCMAKE_INSTALL_PREFIX=${LIBDIR}/osl - -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} - ${DEFAULT_CMAKE_FLAGS} - ${OSL_EXTRA_ARGS} - + PATCH_COMMAND ${PATCH_CMD} -p 1 -d ${BUILD_DIR}/osl/src/external_osl < ${PATCH_DIR}/osl.diff + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/osl -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} ${DEFAULT_CMAKE_FLAGS} ${OSL_EXTRA_ARGS} INSTALL_DIR ${LIBDIR}/osl ) @@ -92,40 +83,20 @@ endif() if(WIN32) if(BUILD_MODE STREQUAL Release) ExternalProject_Add_Step(external_osl after_install - COMMAND ${CMAKE_COMMAND} -E copy_directory - ${LIBDIR}/osl/ - ${HARVEST_TARGET}/osl - + COMMAND ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/osl/ ${HARVEST_TARGET}/osl DEPENDEES install ) endif() if(BUILD_MODE STREQUAL Debug) ExternalProject_Add_Step(external_osl after_install - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/osl/lib/oslcomp_d.lib - ${HARVEST_TARGET}/osl/lib/oslcomp_d.lib - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/osl/lib/oslexec_d.lib - ${HARVEST_TARGET}/osl/lib/oslexec_d.lib - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/osl/lib/oslquery_d.lib - ${HARVEST_TARGET}/osl/lib/oslquery_d.lib - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/osl/lib/oslnoise_d.lib - ${HARVEST_TARGET}/osl/lib/oslnoise_d.lib - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/osl/bin/oslcomp_d.dll - ${HARVEST_TARGET}/osl/bin/oslcomp_d.dll - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/osl/bin/oslexec_d.dll - ${HARVEST_TARGET}/osl/bin/oslexec_d.dll - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/osl/bin/oslquery_d.dll - ${HARVEST_TARGET}/osl/bin/oslquery_d.dll - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/osl/bin/oslnoise_d.dll - ${HARVEST_TARGET}/osl/bin/oslnoise_d.dll - + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/osl/lib/oslcomp_d.lib ${HARVEST_TARGET}/osl/lib/oslcomp_d.lib + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/osl/lib/oslexec_d.lib ${HARVEST_TARGET}/osl/lib/oslexec_d.lib + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/osl/lib/oslquery_d.lib ${HARVEST_TARGET}/osl/lib/oslquery_d.lib + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/osl/lib/oslnoise_d.lib ${HARVEST_TARGET}/osl/lib/oslnoise_d.lib + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/osl/bin/oslcomp_d.dll ${HARVEST_TARGET}/osl/bin/oslcomp_d.dll + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/osl/bin/oslexec_d.dll ${HARVEST_TARGET}/osl/bin/oslexec_d.dll + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/osl/bin/oslquery_d.dll ${HARVEST_TARGET}/osl/bin/oslquery_d.dll + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/osl/bin/oslnoise_d.dll ${HARVEST_TARGET}/osl/bin/oslnoise_d.dll DEPENDEES install ) endif() diff --git a/build_files/build_environment/cmake/package_python.cmake b/build_files/build_environment/cmake/package_python.cmake index 8077fe36d1a..98f93fcc48a 100644 --- a/build_files/build_environment/cmake/package_python.cmake +++ b/build_files/build_environment/cmake/package_python.cmake @@ -9,92 +9,38 @@ if(MSVC) if(BUILD_MODE STREQUAL Release) add_custom_command( OUTPUT ${PYTARGET}/bin/python${PYTHON_POSTFIX}.exe - COMMAND echo packaging python COMMAND echo this should output at ${PYTARGET}/bin/python${PYTHON_POSTFIX}.exe COMMAND ${CMAKE_COMMAND} -E make_directory ${PYTARGET}/libs - COMMAND ${CMAKE_COMMAND} -E copy - ${PYSRC}/libs/python${PYTHON_SHORT_VERSION_NO_DOTS}.lib - ${PYTARGET}/libs/python${PYTHON_SHORT_VERSION_NO_DOTS}.lib - COMMAND ${CMAKE_COMMAND} -E copy - ${PYSRC}/python.exe - ${PYTARGET}/bin/python.exe - COMMAND ${CMAKE_COMMAND} -E copy - ${PYSRC}/python${PYTHON_SHORT_VERSION_NO_DOTS}.dll - ${PYTARGET}/bin/python${PYTHON_SHORT_VERSION_NO_DOTS}.dll - COMMAND ${CMAKE_COMMAND} -E copy - ${PYSRC}/python3${PYTHON_POSTFIX}.dll - ${PYTARGET}/bin/python3${PYTHON_POSTFIX}.dll - COMMAND ${CMAKE_COMMAND} -E copy - ${PYSRC}/python${PYTHON_SHORT_VERSION_NO_DOTS}.pdb - ${PYTARGET}/libs/python${PYTHON_SHORT_VERSION_NO_DOTS}.pdb - COMMAND ${CMAKE_COMMAND} -E copy_directory - ${PYSRC}/include/ - ${PYTARGET}/include/ - COMMAND ${CMAKE_COMMAND} -E copy_directory - ${PYSRC}/lib/ - ${PYTARGET}/lib/ - COMMAND ${CMAKE_COMMAND} -E copy_directory - ${PYSRC}/DLLs/ - ${PYTARGET}/DLLs/ - - COMMAND cd ${PYTARGET}/lib/ && - for /d /r . %%d in (__pycache__) do @if exist "%%d" echo "%%d" && - rd /s/q "%%d" - ) - add_custom_target(Package_Python - ALL - DEPENDS - external_python - external_numpy - external_python_site_packages - OUTPUT - ${HARVEST_TARGET}/python/${PYTHON_SHORT_VERSION_NO_DOTS}/bin/python${PYTHON_POSTFIX}.exe + COMMAND ${CMAKE_COMMAND} -E copy ${PYSRC}/libs/python${PYTHON_SHORT_VERSION_NO_DOTS}.lib ${PYTARGET}/libs/python${PYTHON_SHORT_VERSION_NO_DOTS}.lib + COMMAND ${CMAKE_COMMAND} -E copy ${PYSRC}/python.exe ${PYTARGET}/bin/python.exe + COMMAND ${CMAKE_COMMAND} -E copy ${PYSRC}/python${PYTHON_SHORT_VERSION_NO_DOTS}.dll ${PYTARGET}/bin/python${PYTHON_SHORT_VERSION_NO_DOTS}.dll + COMMAND ${CMAKE_COMMAND} -E copy ${PYSRC}/python3${PYTHON_POSTFIX}.dll ${PYTARGET}/bin/python3${PYTHON_POSTFIX}.dll + COMMAND ${CMAKE_COMMAND} -E copy ${PYSRC}/python${PYTHON_SHORT_VERSION_NO_DOTS}.pdb ${PYTARGET}/libs/python${PYTHON_SHORT_VERSION_NO_DOTS}.pdb + COMMAND ${CMAKE_COMMAND} -E copy_directory ${PYSRC}/include/ ${PYTARGET}/include/ + COMMAND ${CMAKE_COMMAND} -E copy_directory ${PYSRC}/lib/ ${PYTARGET}/lib/ + COMMAND ${CMAKE_COMMAND} -E copy_directory ${PYSRC}/DLLs/ ${PYTARGET}/DLLs/ + COMMAND cd ${PYTARGET}/lib/ && for /d /r . %%d in (__pycache__) do @if exist "%%d" echo "%%d" && rd /s/q "%%d" ) + add_custom_target(Package_Python ALL DEPENDS external_python external_numpy external_python_site_packages OUTPUT ${HARVEST_TARGET}/python/${PYTHON_SHORT_VERSION_NO_DOTS}/bin/python${PYTHON_POSTFIX}.exe) endif() if(BUILD_MODE STREQUAL Debug) add_custom_command( OUTPUT ${PYTARGET}/bin/python${PYTHON_POSTFIX}.exe - COMMAND echo packaging python COMMAND echo this should output at ${PYTARGET}/bin/python${PYTHON_POSTFIX}.exe COMMAND ${CMAKE_COMMAND} -E make_directory ${PYTARGET}/libs - COMMAND ${CMAKE_COMMAND} -E copy - ${PYSRC}/libs/python${PYTHON_SHORT_VERSION_NO_DOTS}${PYTHON_POSTFIX}.lib - ${PYTARGET}/libs/python${PYTHON_SHORT_VERSION_NO_DOTS}${PYTHON_POSTFIX}.lib - COMMAND ${CMAKE_COMMAND} -E copy - ${PYSRC}/python${PYTHON_POSTFIX}.exe - ${PYTARGET}/bin/python${PYTHON_POSTFIX}.exe - COMMAND ${CMAKE_COMMAND} -E copy - ${PYSRC}/python${PYTHON_SHORT_VERSION_NO_DOTS}${PYTHON_POSTFIX}.dll - ${PYTARGET}/bin/python${PYTHON_SHORT_VERSION_NO_DOTS}${PYTHON_POSTFIX}.dll - COMMAND ${CMAKE_COMMAND} -E copy - ${PYSRC}/python3${PYTHON_POSTFIX}.dll - ${PYTARGET}/bin/python3${PYTHON_POSTFIX}.dll - COMMAND ${CMAKE_COMMAND} -E copy - ${PYSRC}/python${PYTHON_SHORT_VERSION_NO_DOTS}${PYTHON_POSTFIX}.pdb - ${PYTARGET}/libs/python${PYTHON_SHORT_VERSION_NO_DOTS}${PYTHON_POSTFIX}.pdb - COMMAND ${CMAKE_COMMAND} -E copy_directory - ${PYSRC}/include/ - ${PYTARGET}/include/ - COMMAND ${CMAKE_COMMAND} -E copy_directory - ${PYSRC}/lib/ - ${PYTARGET}/lib/ - COMMAND ${CMAKE_COMMAND} -E copy_directory - ${PYSRC}/DLLs/ - ${PYTARGET}/DLLs/ - - COMMAND cd ${PYTARGET}/lib/ && - for /d /r . %%d in (__pycache__) do @if exist "%%d" echo "%%d" && - rd /s/q "%%d" - ) - add_custom_target(Package_Python - ALL - DEPENDS - external_python external_numpy external_python_site_packages - OUTPUT - ${PYTARGET}/bin/python${PYTHON_POSTFIX}.exe + COMMAND ${CMAKE_COMMAND} -E copy ${PYSRC}/libs/python${PYTHON_SHORT_VERSION_NO_DOTS}${PYTHON_POSTFIX}.lib ${PYTARGET}/libs/python${PYTHON_SHORT_VERSION_NO_DOTS}${PYTHON_POSTFIX}.lib + COMMAND ${CMAKE_COMMAND} -E copy ${PYSRC}/python${PYTHON_POSTFIX}.exe ${PYTARGET}/bin/python${PYTHON_POSTFIX}.exe + COMMAND ${CMAKE_COMMAND} -E copy ${PYSRC}/python${PYTHON_SHORT_VERSION_NO_DOTS}${PYTHON_POSTFIX}.dll ${PYTARGET}/bin/python${PYTHON_SHORT_VERSION_NO_DOTS}${PYTHON_POSTFIX}.dll + COMMAND ${CMAKE_COMMAND} -E copy ${PYSRC}/python3${PYTHON_POSTFIX}.dll ${PYTARGET}/bin/python3${PYTHON_POSTFIX}.dll + COMMAND ${CMAKE_COMMAND} -E copy ${PYSRC}/python${PYTHON_SHORT_VERSION_NO_DOTS}${PYTHON_POSTFIX}.pdb ${PYTARGET}/libs/python${PYTHON_SHORT_VERSION_NO_DOTS}${PYTHON_POSTFIX}.pdb + COMMAND ${CMAKE_COMMAND} -E copy_directory ${PYSRC}/include/ ${PYTARGET}/include/ + COMMAND ${CMAKE_COMMAND} -E copy_directory ${PYSRC}/lib/ ${PYTARGET}/lib/ + COMMAND ${CMAKE_COMMAND} -E copy_directory ${PYSRC}/DLLs/ ${PYTARGET}/DLLs/ + COMMAND cd ${PYTARGET}/lib/ && for /d /r . %%d in (__pycache__) do @if exist "%%d" echo "%%d" && rd /s/q "%%d" ) + add_custom_target(Package_Python ALL DEPENDS external_python external_numpy external_python_site_packages OUTPUT ${PYTARGET}/bin/python${PYTHON_POSTFIX}.exe) endif() endif() diff --git a/build_files/build_environment/cmake/png.cmake b/build_files/build_environment/cmake/png.cmake index 9cc3cc55f83..643eaa6d462 100644 --- a/build_files/build_environment/cmake/png.cmake +++ b/build_files/build_environment/cmake/png.cmake @@ -9,12 +9,7 @@ set(PNG_EXTRA_ARGS ) if(BLENDER_PLATFORM_ARM) - set(PNG_EXTRA_ARGS - ${PNG_EXTRA_ARGS} - -DPNG_HARDWARE_OPTIMIZATIONS=ON - -DPNG_ARM_NEON=on - -DCMAKE_SYSTEM_PROCESSOR="aarch64" - ) + set(PNG_EXTRA_ARGS ${PNG_EXTRA_ARGS} -DPNG_HARDWARE_OPTIMIZATIONS=ON -DPNG_ARM_NEON=on -DCMAKE_SYSTEM_PROCESSOR="aarch64") endif() ExternalProject_Add(external_png @@ -22,12 +17,7 @@ ExternalProject_Add(external_png DOWNLOAD_DIR ${DOWNLOAD_DIR} URL_HASH ${PNG_HASH_TYPE}=${PNG_HASH} PREFIX ${BUILD_DIR}/png - - CMAKE_ARGS - -DCMAKE_INSTALL_PREFIX=${LIBDIR}/png - ${DEFAULT_CMAKE_FLAGS} - ${PNG_EXTRA_ARGS} - + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/png ${DEFAULT_CMAKE_FLAGS} ${PNG_EXTRA_ARGS} INSTALL_DIR ${LIBDIR}/png ) @@ -38,23 +28,15 @@ add_dependencies( if(WIN32 AND BUILD_MODE STREQUAL Release) ExternalProject_Add_Step(external_png after_install - COMMAND ${CMAKE_COMMAND} -E copy_directory - ${LIBDIR}/png/include/ - ${HARVEST_TARGET}/png/include/ - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/png/lib/libpng16_static${LIBEXT} - ${HARVEST_TARGET}/png/lib/libpng${LIBEXT} - + COMMAND ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/png/include/ ${HARVEST_TARGET}/png/include/ + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/png/lib/libpng16_static${LIBEXT} ${HARVEST_TARGET}/png/lib/libpng${LIBEXT} DEPENDEES install ) endif() if(WIN32 AND BUILD_MODE STREQUAL Debug) ExternalProject_Add_Step(external_png after_install - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/png/lib/libpng16_staticd${LIBEXT} - ${LIBDIR}/png/lib/libpng16${LIBEXT} - + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/png/lib/libpng16_staticd${LIBEXT} ${LIBDIR}/png/lib/libpng16${LIBEXT} DEPENDEES install ) endif() diff --git a/build_files/build_environment/cmake/potrace.cmake b/build_files/build_environment/cmake/potrace.cmake index f23356a34fb..8410833c4a1 100644 --- a/build_files/build_environment/cmake/potrace.cmake +++ b/build_files/build_environment/cmake/potrace.cmake @@ -11,24 +11,13 @@ if((WIN32 AND BUILD_MODE STREQUAL Release) OR UNIX) DOWNLOAD_DIR ${DOWNLOAD_DIR} URL_HASH ${POTRACE_HASH_TYPE}=${POTRACE_HASH} PREFIX ${BUILD_DIR}/potrace - - PATCH_COMMAND ${CMAKE_COMMAND} -E copy - ${PATCH_DIR}/cmakelists_potrace.txt - ${BUILD_DIR}/potrace/src/external_potrace/CMakeLists.txt - - CMAKE_ARGS - -DCMAKE_INSTALL_PREFIX=${LIBDIR}/potrace - ${DEFAULT_CMAKE_FLAGS} - ${POTRACE_EXTRA_ARGS} - + PATCH_COMMAND ${CMAKE_COMMAND} -E copy ${PATCH_DIR}/cmakelists_potrace.txt ${BUILD_DIR}/potrace/src/external_potrace/CMakeLists.txt + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/potrace ${DEFAULT_CMAKE_FLAGS} ${POTRACE_EXTRA_ARGS} INSTALL_DIR ${LIBDIR}/potrace ) if(WIN32) ExternalProject_Add_Step(external_potrace after_install - COMMAND ${CMAKE_COMMAND} -E copy_directory - ${LIBDIR}/potrace - ${HARVEST_TARGET}/potrace - + COMMAND ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/potrace ${HARVEST_TARGET}/potrace DEPENDEES install ) endif() diff --git a/build_files/build_environment/cmake/pthreads.cmake b/build_files/build_environment/cmake/pthreads.cmake index 7384e0da614..009f766e1a1 100644 --- a/build_files/build_environment/cmake/pthreads.cmake +++ b/build_files/build_environment/cmake/pthreads.cmake @@ -10,11 +10,7 @@ if(WIN32) set(PTHREAD_CPPFLAGS "/I. /DHAVE_CONFIG_H ") endif() - set(PTHREADS_BUILD - cd ${BUILD_DIR}/pthreads/src/external_pthreads/ && - cd && - nmake VC-static /e CPPFLAGS=${PTHREAD_CPPFLAGS} - ) + set(PTHREADS_BUILD cd ${BUILD_DIR}/pthreads/src/external_pthreads/ && cd && nmake VC-static /e CPPFLAGS=${PTHREAD_CPPFLAGS}) ExternalProject_Add(external_pthreads URL file://${PACKAGE_DIR}/${PTHREADS_FILE} @@ -22,42 +18,21 @@ if(WIN32) URL_HASH ${PTHREADS_HASH_TYPE}=${PTHREADS_HASH} PREFIX ${BUILD_DIR}/pthreads CONFIGURE_COMMAND echo . - - PATCH_COMMAND COMMAND ${PATCH_CMD} -p 1 -d - ${BUILD_DIR}/pthreads/src/external_pthreads < - ${PATCH_DIR}/pthreads.diff - + PATCH_COMMAND COMMAND ${PATCH_CMD} -p 1 -d ${BUILD_DIR}/pthreads/src/external_pthreads < ${PATCH_DIR}/pthreads.diff BUILD_COMMAND ${PTHREADS_BUILD} - INSTALL_COMMAND COMMAND - ${CMAKE_COMMAND} -E copy - ${BUILD_DIR}/pthreads/src/external_pthreads/libpthreadVC3${LIBEXT} - ${LIBDIR}/pthreads/lib/pthreadVC3${LIBEXT} && - ${CMAKE_COMMAND} -E copy - ${BUILD_DIR}/pthreads/src/external_pthreads/pthread.h - ${LIBDIR}/pthreads/inc/pthread.h && - ${CMAKE_COMMAND} -E copy - ${BUILD_DIR}/pthreads/src/external_pthreads/sched.h - ${LIBDIR}/pthreads/inc/sched.h && - ${CMAKE_COMMAND} -E copy - ${BUILD_DIR}/pthreads/src/external_pthreads/semaphore.h - ${LIBDIR}/pthreads/inc/semaphore.h && - ${CMAKE_COMMAND} -E copy - ${BUILD_DIR}/pthreads/src/external_pthreads/_ptw32.h - ${LIBDIR}/pthreads/inc/_ptw32.h - + ${CMAKE_COMMAND} -E copy ${BUILD_DIR}/pthreads/src/external_pthreads/libpthreadVC3${LIBEXT} ${LIBDIR}/pthreads/lib/pthreadVC3${LIBEXT} && + ${CMAKE_COMMAND} -E copy ${BUILD_DIR}/pthreads/src/external_pthreads/pthread.h ${LIBDIR}/pthreads/inc/pthread.h && + ${CMAKE_COMMAND} -E copy ${BUILD_DIR}/pthreads/src/external_pthreads/sched.h ${LIBDIR}/pthreads/inc/sched.h && + ${CMAKE_COMMAND} -E copy ${BUILD_DIR}/pthreads/src/external_pthreads/semaphore.h ${LIBDIR}/pthreads/inc/semaphore.h && + ${CMAKE_COMMAND} -E copy ${BUILD_DIR}/pthreads/src/external_pthreads/_ptw32.h ${LIBDIR}/pthreads/inc/_ptw32.h INSTALL_DIR ${LIBDIR}/pthreads ) if(BUILD_MODE STREQUAL Release) ExternalProject_Add_Step(external_pthreads after_install - COMMAND ${CMAKE_COMMAND} -E copy_directory - ${LIBDIR}/pthreads/inc/ - ${HARVEST_TARGET}/pthreads/include/ - COMMAND ${CMAKE_COMMAND} -E copy_directory - ${LIBDIR}/pthreads/lib/ - ${HARVEST_TARGET}/pthreads/lib - + COMMAND ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/pthreads/inc/ ${HARVEST_TARGET}/pthreads/include/ + COMMAND ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/pthreads/lib/ ${HARVEST_TARGET}/pthreads/lib DEPENDEES install ) endif() diff --git a/build_files/build_environment/cmake/pugixml.cmake b/build_files/build_environment/cmake/pugixml.cmake index 6fdc8cf875f..51586aed869 100644 --- a/build_files/build_environment/cmake/pugixml.cmake +++ b/build_files/build_environment/cmake/pugixml.cmake @@ -10,30 +10,19 @@ ExternalProject_Add(external_pugixml DOWNLOAD_DIR ${DOWNLOAD_DIR} URL_HASH ${PUGIXML_HASH_TYPE}=${PUGIXML_HASH} PREFIX ${BUILD_DIR}/pugixml - - CMAKE_ARGS - -DCMAKE_INSTALL_PREFIX=${LIBDIR}/pugixml - ${DEFAULT_CMAKE_FLAGS} - ${PUGIXML_EXTRA_ARGS} - + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/pugixml ${DEFAULT_CMAKE_FLAGS} ${PUGIXML_EXTRA_ARGS} INSTALL_DIR ${LIBDIR}/pugixml ) if(WIN32) if(BUILD_MODE STREQUAL Release) ExternalProject_Add_Step(external_pugixml after_install - COMMAND ${CMAKE_COMMAND} -E copy_directory - ${LIBDIR}/pugixml - ${HARVEST_TARGET}/pugixml - + COMMAND ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/pugixml ${HARVEST_TARGET}/pugixml DEPENDEES install ) endif() if(BUILD_MODE STREQUAL Debug) ExternalProject_Add_Step(external_pugixml after_install - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/pugixml/lib/pugixml.lib - ${HARVEST_TARGET}/pugixml/lib/pugixml_d.lib - + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/pugixml/lib/pugixml.lib ${HARVEST_TARGET}/pugixml/lib/pugixml_d.lib DEPENDEES install ) endif() diff --git a/build_files/build_environment/cmake/pybind11.cmake b/build_files/build_environment/cmake/pybind11.cmake index 1c06c689c64..5167861e86c 100644 --- a/build_files/build_environment/cmake/pybind11.cmake +++ b/build_files/build_environment/cmake/pybind11.cmake @@ -13,16 +13,8 @@ ExternalProject_Add(external_pybind11 URL_HASH ${PYBIND11_HASH_TYPE}=${PYBIND11_HASH} PREFIX ${BUILD_DIR}/pybind11 CMAKE_GENERATOR ${PLATFORM_ALT_GENERATOR} - - PATCH_COMMAND ${PATCH_CMD} -p 1 -d - ${BUILD_DIR}/pybind11/src/external_pybind11 < - ${PATCH_DIR}/pybind11_4761.diff - - CMAKE_ARGS - -DCMAKE_INSTALL_PREFIX=${LIBDIR}/pybind11 - ${DEFAULT_CMAKE_FLAGS} - ${PYBIND11_EXTRA_ARGS} - + PATCH_COMMAND ${PATCH_CMD} -p 1 -d ${BUILD_DIR}/pybind11/src/external_pybind11 < ${PATCH_DIR}/pybind11_4761.diff + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/pybind11 ${DEFAULT_CMAKE_FLAGS} ${PYBIND11_EXTRA_ARGS} INSTALL_DIR ${LIBDIR}/pybind11 ) diff --git a/build_files/build_environment/cmake/pystring.cmake b/build_files/build_environment/cmake/pystring.cmake index 8fe2b95ab59..524454cd6f8 100644 --- a/build_files/build_environment/cmake/pystring.cmake +++ b/build_files/build_environment/cmake/pystring.cmake @@ -10,28 +10,15 @@ ExternalProject_Add(external_pystring DOWNLOAD_DIR ${DOWNLOAD_DIR} URL_HASH ${PYSTRING_HASH_TYPE}=${PYSTRING_HASH} PREFIX ${BUILD_DIR}/pystring - - PATCH_COMMAND ${CMAKE_COMMAND} -E copy - ${PATCH_DIR}/cmakelists_pystring.txt - ${BUILD_DIR}/pystring/src/external_pystring/CMakeLists.txt - - CMAKE_ARGS - -DCMAKE_INSTALL_PREFIX=${LIBDIR}/pystring - ${DEFAULT_CMAKE_FLAGS} - ${PYSTRING_EXTRA_ARGS} - + PATCH_COMMAND ${CMAKE_COMMAND} -E copy ${PATCH_DIR}/cmakelists_pystring.txt ${BUILD_DIR}/pystring/src/external_pystring/CMakeLists.txt + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/pystring ${DEFAULT_CMAKE_FLAGS} ${PYSTRING_EXTRA_ARGS} INSTALL_DIR ${LIBDIR}/pystring ) if(WIN32) ExternalProject_Add_Step(external_pystring after_install - COMMAND ${CMAKE_COMMAND} -E copy_directory - ${LIBDIR}/pystring/lib - ${HARVEST_TARGET}/pystring/lib - COMMAND ${CMAKE_COMMAND} -E copy_directory - ${LIBDIR}/pystring/include - ${HARVEST_TARGET}/pystring/include - + COMMAND ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/pystring/lib ${HARVEST_TARGET}/pystring/lib + COMMAND ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/pystring/include ${HARVEST_TARGET}/pystring/include DEPENDEES install ) endif() diff --git a/build_files/build_environment/cmake/python.cmake b/build_files/build_environment/cmake/python.cmake index 786cb4c4dd4..f2052f4327d 100644 --- a/build_files/build_environment/cmake/python.cmake +++ b/build_files/build_environment/cmake/python.cmake @@ -9,24 +9,13 @@ if(BUILD_MODE STREQUAL Debug) endif() if(WIN32) + set(PYTHON_BINARY_INTERNAL ${BUILD_DIR}/python/src/external_python/PCBuild/amd64/python${PYTHON_POSTFIX}.exe) set(PYTHON_BINARY ${LIBDIR}/python/python${PYTHON_POSTFIX}.exe) set(PYTHON_SRC ${BUILD_DIR}/python/src/external_python/) macro(cmake_to_dos_path MsysPath ResultingPath) string(REPLACE "/" "\\" ${ResultingPath} "${MsysPath}") endmacro() - if(BLENDER_PLATFORM_ARM) - set(PYTHON_BINARY_INTERNAL ${BUILD_DIR}/python/src/external_python/PCBuild/arm64/python${PYTHON_POSTFIX}.exe) - set(PYTHON_BAT_ARCH arm64) - set(PYTHON_INSTALL_ARCH_FOLDER ${PYTHON_SRC}/PCbuild/arm64) - set(PYTHON_PATCH_FILE python_windows_arm64.diff) - else() - set(PYTHON_BINARY_INTERNAL ${BUILD_DIR}/python/src/external_python/PCBuild/amd64/python${PYTHON_POSTFIX}.exe) - set(PYTHON_BAT_ARCH x64) - set(PYTHON_INSTALL_ARCH_FOLDER ${PYTHON_SRC}/PCbuild/amd64) - set(PYTHON_PATCH_FILE python_windows_x64.diff) - endif() - set(PYTHON_EXTERNALS_FOLDER ${BUILD_DIR}/python/src/external_python/externals) set(ZLIB_SOURCE_FOLDER ${BUILD_DIR}/zlib/src/external_zlib) set(SSL_SOURCE_FOLDER ${BUILD_DIR}/ssl/src/external_ssl) @@ -42,7 +31,6 @@ if(WIN32) DOWNLOAD_DIR ${DOWNLOAD_DIR} URL_HASH ${PYTHON_HASH_TYPE}=${PYTHON_HASH} PREFIX ${BUILD_DIR}/python - # Python will download its own deps and there's very little we can do about # that beyond placing some code in their externals dir before it tries. # the foldernames *HAVE* to match the ones inside pythons get_externals.cmd. @@ -50,35 +38,11 @@ if(WIN32) PATCH_COMMAND mkdir ${PYTHON_EXTERNALS_FOLDER_DOS} && mklink /J ${PYTHON_EXTERNALS_FOLDER_DOS}\\zlib-1.2.13 ${ZLIB_SOURCE_FOLDER_DOS} && mklink /J ${PYTHON_EXTERNALS_FOLDER_DOS}\\openssl-3.0.11 ${SSL_SOURCE_FOLDER_DOS} && - ${CMAKE_COMMAND} -E copy - ${ZLIB_SOURCE_FOLDER}/../external_zlib-build/zconf.h - ${PYTHON_EXTERNALS_FOLDER}/zlib-1.2.13/zconf.h && - ${PATCH_CMD} --verbose -p1 -d - ${BUILD_DIR}/python/src/external_python < - ${PATCH_DIR}/${PYTHON_PATCH_FILE} - + ${CMAKE_COMMAND} -E copy ${ZLIB_SOURCE_FOLDER}/../external_zlib-build/zconf.h ${PYTHON_EXTERNALS_FOLDER}/zlib-1.2.13/zconf.h && + ${PATCH_CMD} --verbose -p1 -d ${BUILD_DIR}/python/src/external_python < ${PATCH_DIR}/python_windows.diff CONFIGURE_COMMAND echo "." - - BUILD_COMMAND ${CONFIGURE_ENV_MSVC} && - cd ${BUILD_DIR}/python/src/external_python/pcbuild/ && - set IncludeTkinter=false && - set LDFLAGS=/DEBUG && - call prepare_ssl.bat && - call build.bat -e -p ${PYTHON_BAT_ARCH} -c ${BUILD_MODE} - - INSTALL_COMMAND ${PYTHON_BINARY_INTERNAL} ${PYTHON_SRC}/PC/layout/main.py - -b ${PYTHON_INSTALL_ARCH_FOLDER} - -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 + BUILD_COMMAND ${CONFIGURE_ENV_MSVC} && cd ${BUILD_DIR}/python/src/external_python/pcbuild/ && set IncludeTkinter=false && set LDFLAGS=/DEBUG && call prepare_ssl.bat && 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-stable --include-pip --include-dev --include-launchers --include-venv --include-symbols ${PYTHON_EXTRA_INSTLAL_FLAGS} --copy ${LIBDIR}/python ) add_dependencies( external_python @@ -116,14 +80,12 @@ else() endif() set(PYTHON_BINARY ${LIBDIR}/python/bin/python${PYTHON_SHORT_VERSION}) - # Various flags to convince Python to use our own versions of: - # `ffi`, `sqlite`, `ssl`, `bzip2`, `lzma` and `zlib`. + # Various flags to convince Python to use our own versions of ffi, sqlite, ssl, bzip2, lzma and zlib. # Using pkg-config is only supported for some, and even then we need to work around issues. set(PYTHON_CONFIGURE_EXTRA_ARGS --with-openssl=${LIBDIR}/ssl) set(PYTHON_CFLAGS "${PLATFORM_CFLAGS} ") - # Manually specify some library paths. For ffi there is no other way, - # for sqlite is needed because LIBSQLITE3_LIBS does not work, - # and ssl because it uses the wrong ssl/lib dir instead of ssl/lib64. + # Manually specify some library paths. For ffi there is no other way, for sqlite is needed because + # LIBSQLITE3_LIBS does not work, and ssl because it uses the wrong ssl/lib dir instead of ssl/lib64. set(PYTHON_LDFLAGS "-L${LIBDIR}/ffi/lib -L${LIBDIR}/sqlite/lib -L${LIBDIR}/ssl/lib -L${LIBDIR}/ssl/lib64 ${PLATFORM_LDFLAGS} ") set(PYTHON_CONFIGURE_EXTRA_ENV export CFLAGS=${PYTHON_CFLAGS} && @@ -138,22 +100,14 @@ else() export LIBLZMA_LIBS=${LIBDIR}/lzma/lib/${LIBPREFIX}lzma${LIBEXT} export ZLIB_CFLAGS=-I${LIBDIR}/zlib/include export ZLIB_LIBS=${LIBDIR}/zlib/lib/${ZLIB_LIBRARY} - ) + ) # This patch indludes changes to fix missing -lm for sqlite and and fix the order of # -ldl flags for ssl to avoid link errors. if(APPLE) - set(PYTHON_PATCH - ${PATCH_CMD} --verbose -p1 -d - ${BUILD_DIR}/python/src/external_python < - ${PATCH_DIR}/python_apple.diff - ) + set(PYTHON_PATCH ${PATCH_CMD} --verbose -p1 -d ${BUILD_DIR}/python/src/external_python < ${PATCH_DIR}/python_apple.diff) else() - set(PYTHON_PATCH - ${PATCH_CMD} --verbose -p1 -d - ${BUILD_DIR}/python/src/external_python < - ${PATCH_DIR}/python_unix.diff - ) + set(PYTHON_PATCH ${PATCH_CMD} --verbose -p1 -d ${BUILD_DIR}/python/src/external_python < ${PATCH_DIR}/python_unix.diff) endif() # NOTE: untested on APPLE so far. @@ -175,20 +129,9 @@ else() URL_HASH ${PYTHON_HASH_TYPE}=${PYTHON_HASH} PREFIX ${BUILD_DIR}/python PATCH_COMMAND ${PYTHON_PATCH} - - CONFIGURE_COMMAND ${PYTHON_CONFIGURE_ENV} && - ${PYTHON_CONFIGURE_EXTRA_ENV} && - cd ${BUILD_DIR}/python/src/external_python/ && - ${CONFIGURE_COMMAND} --prefix=${LIBDIR}/python ${PYTHON_CONFIGURE_EXTRA_ARGS} - - BUILD_COMMAND ${PYTHON_CONFIGURE_ENV} && - cd ${BUILD_DIR}/python/src/external_python/ && - make -j${MAKE_THREADS} - - INSTALL_COMMAND ${PYTHON_CONFIGURE_ENV} && - cd ${BUILD_DIR}/python/src/external_python/ && - make install - + CONFIGURE_COMMAND ${PYTHON_CONFIGURE_ENV} && ${PYTHON_CONFIGURE_EXTRA_ENV} && cd ${BUILD_DIR}/python/src/external_python/ && ${CONFIGURE_COMMAND} --prefix=${LIBDIR}/python ${PYTHON_CONFIGURE_EXTRA_ARGS} + BUILD_COMMAND ${PYTHON_CONFIGURE_ENV} && cd ${BUILD_DIR}/python/src/external_python/ && make -j${MAKE_THREADS} + INSTALL_COMMAND ${PYTHON_CONFIGURE_ENV} && cd ${BUILD_DIR}/python/src/external_python/ && make install INSTALL_DIR ${LIBDIR}/python) endif() @@ -215,10 +158,7 @@ if(WIN32) # correctly to instruct it to use the debug version # of python. So just copy the debug imports file over # and call it a day... - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/python/libs/python${PYTHON_SHORT_VERSION_NO_DOTS}${PYTHON_POSTFIX}.lib - ${LIBDIR}/python/libs/python${PYTHON_SHORT_VERSION_NO_DOTS}.lib - + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/python/libs/python${PYTHON_SHORT_VERSION_NO_DOTS}${PYTHON_POSTFIX}.lib ${LIBDIR}/python/libs/python${PYTHON_SHORT_VERSION_NO_DOTS}.lib DEPENDEES install ) endif() diff --git a/build_files/build_environment/cmake/robinmap.cmake b/build_files/build_environment/cmake/robinmap.cmake index 41345b81523..80e92cd198f 100644 --- a/build_files/build_environment/cmake/robinmap.cmake +++ b/build_files/build_environment/cmake/robinmap.cmake @@ -10,11 +10,6 @@ ExternalProject_Add(external_robinmap DOWNLOAD_DIR ${DOWNLOAD_DIR} URL_HASH ${ROBINMAP_HASH_TYPE}=${ROBINMAP_HASH} PREFIX ${BUILD_DIR}/robinmap - - CMAKE_ARGS - -DCMAKE_INSTALL_PREFIX=${LIBDIR}/robinmap - ${DEFAULT_CMAKE_FLAGS} - ${ROBINMAP_EXTRA_ARGS} - + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/robinmap ${DEFAULT_CMAKE_FLAGS} ${ROBINMAP_EXTRA_ARGS} INSTALL_DIR ${LIBDIR}/robinmap ) diff --git a/build_files/build_environment/cmake/sdl.cmake b/build_files/build_environment/cmake/sdl.cmake index 7c55ce0ddd2..0524e44d0e7 100644 --- a/build_files/build_environment/cmake/sdl.cmake +++ b/build_files/build_environment/cmake/sdl.cmake @@ -2,11 +2,7 @@ # # SPDX-License-Identifier: GPL-2.0-or-later -set(SDL_PATCH - ${PATCH_CMD} -p 0 -N -d - ${BUILD_DIR}/sdl/src/external_sdl < - ${PATCH_DIR}/sdl.diff -) +set(SDL_PATCH ${PATCH_CMD} -p 0 -N -d ${BUILD_DIR}/sdl/src/external_sdl < ${PATCH_DIR}/sdl.diff) if(WIN32) set(SDL_EXTRA_ARGS @@ -25,10 +21,7 @@ else() list(APPEND SDL_EXTRA_ARGS -DSDL_HAPTICS=OFF) set(SDL_PATCH ${SDL_PATCH} && - ${PATCH_CMD} -p 0 -N -d - ${BUILD_DIR}/sdl/src/external_sdl < - ${PATCH_DIR}/sdl_haptics.diff - ) + ${PATCH_CMD} -p 0 -N -d ${BUILD_DIR}/sdl/src/external_sdl < ${PATCH_DIR}/sdl_haptics.diff) endif() endif() @@ -38,27 +31,15 @@ ExternalProject_Add(external_sdl URL_HASH ${SDL_HASH_TYPE}=${SDL_HASH} PREFIX ${BUILD_DIR}/sdl PATCH_COMMAND ${SDL_PATCH} - - CMAKE_ARGS - -DCMAKE_INSTALL_PREFIX=${LIBDIR}/sdl - ${DEFAULT_CMAKE_FLAGS} - ${SDL_EXTRA_ARGS} - + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/sdl ${DEFAULT_CMAKE_FLAGS} ${SDL_EXTRA_ARGS} INSTALL_DIR ${LIBDIR}/sdl ) if(BUILD_MODE STREQUAL Release AND WIN32) ExternalProject_Add_Step(external_sdl after_install - COMMAND ${CMAKE_COMMAND} -E copy_directory - ${LIBDIR}/sdl/include/sdl2 - ${HARVEST_TARGET}/sdl/include - COMMAND ${CMAKE_COMMAND} -E copy_directory - ${LIBDIR}/sdl/lib - ${HARVEST_TARGET}/sdl/lib - COMMAND ${CMAKE_COMMAND} -E copy_directory - ${LIBDIR}/sdl/bin - ${HARVEST_TARGET}/sdl/lib - + COMMAND ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/sdl/include/sdl2 ${HARVEST_TARGET}/sdl/include + COMMAND ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/sdl/lib ${HARVEST_TARGET}/sdl/lib + COMMAND ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/sdl/bin ${HARVEST_TARGET}/sdl/lib DEPENDEES install ) endif() diff --git a/build_files/build_environment/cmake/setup_msys2.cmake b/build_files/build_environment/cmake/setup_msys2.cmake index 7a0ce17c489..d9f670c46f7 100644 --- a/build_files/build_environment/cmake/setup_msys2.cmake +++ b/build_files/build_environment/cmake/setup_msys2.cmake @@ -25,10 +25,7 @@ message("msys2_LIBDIR = ${msys2_LIBDIR}") message("Checking for msys2 base") if(NOT EXISTS "${DOWNLOAD_DIR}/msys2-base-x86_64-20221028.tar.xz") message("Downloading msys2-base") - file(DOWNLOAD - "https://repo.msys2.org/distrib/x86_64/msys2-base-x86_64-20221028.tar.xz" - "${DOWNLOAD_DIR}/msys2-base-x86_64-20221028.tar.xz" - ) + file(DOWNLOAD "https://repo.msys2.org/distrib/x86_64/msys2-base-x86_64-20221028.tar.xz" "${DOWNLOAD_DIR}/msys2-base-x86_64-20221028.tar.xz") endif() # Make msys2 root directory @@ -40,8 +37,7 @@ if(NOT EXISTS "${DOWNLOAD_DIR}/msys2") endif() # Extract msys2 -if((NOT EXISTS "${DOWNLOAD_DIR}/msys2/msys64/msys2_shell.cmd") AND - (EXISTS "${DOWNLOAD_DIR}/msys2-base-x86_64-20221028.tar.xz")) +if((NOT EXISTS "${DOWNLOAD_DIR}/msys2/msys64/msys2_shell.cmd") AND (EXISTS "${DOWNLOAD_DIR}/msys2-base-x86_64-20221028.tar.xz")) message("Extracting msys2 base") execute_process( COMMAND ${CMAKE_COMMAND} -E tar jxf ${DOWNLOAD_DIR}/msys2-base-x86_64-20221028.tar.xz @@ -58,7 +54,7 @@ if((NOT EXISTS "${DOWNLOAD_DIR}/msys2/msys64/msys2_shell.cmd") AND # Do initial upgrade of pacman packages (only required for initial setup, to get # latest packages as opposed to to what the installer comes with) execute_process( - COMMAND ${DOWNLOAD_DIR}/msys2/msys64/msys2_shell.cmd -defterm -no-start -clang64 -c "pacman -Sy --noconfirm && exit" + COMMAND ${DOWNLOAD_DIR}/msys2/msys64/msys2_shell.cmd -defterm -no-start -clang64 -c "pacman -Syu --noconfirm && exit" WORKING_DIRECTORY ${DOWNLOAD_DIR}/msys2/msys64 ) endif() @@ -87,8 +83,7 @@ if(EXISTS "${DOWNLOAD_DIR}/msys2/msys64/usr/bin/perl.exe") ) endif() -# Strip out the copy of link that comes with some packages if it exists, -# otherwise meson builds break. +# Strip out the copy of link that comes with some packages if it exists, otherwise meson builds break if(EXISTS "${DOWNLOAD_DIR}/msys2/msys64/usr/bin/link.exe") execute_process( COMMAND ${CMAKE_COMMAND} -E rm ${DOWNLOAD_DIR}/msys2/msys64/usr/bin/link.exe @@ -99,10 +94,7 @@ endif() message("Checking for nasm") if(NOT EXISTS "${DOWNLOAD_DIR}/nasm-2.13.02-win64.zip") message("Downloading nasm") - file(DOWNLOAD - "http://www.nasm.us/pub/nasm/releasebuilds/2.13.02/win64/nasm-2.13.02-win64.zip" - "${DOWNLOAD_DIR}/nasm-2.13.02-win64.zip" - ) + file(DOWNLOAD "http://www.nasm.us/pub/nasm/releasebuilds/2.13.02/win64/nasm-2.13.02-win64.zip" "${DOWNLOAD_DIR}/nasm-2.13.02-win64.zip") endif() # extract nasm @@ -113,9 +105,7 @@ if((NOT EXISTS "${DOWNLOAD_DIR}/msys2/msys64/usr/bin/nasm.exe") AND (EXISTS "${D WORKING_DIRECTORY ${DOWNLOAD_DIR}/ ) execute_process( - COMMAND ${CMAKE_COMMAND} -E copy - "${DOWNLOAD_DIR}/nasm-2.13.02/nasm.exe" - "${DOWNLOAD_DIR}/msys2/msys64/usr/bin/nasm.exe" + COMMAND ${CMAKE_COMMAND} -E copy "${DOWNLOAD_DIR}/nasm-2.13.02/nasm.exe" "${DOWNLOAD_DIR}/msys2/msys64/usr/bin/nasm.exe" ) endif() @@ -123,10 +113,7 @@ message("Checking for perl") # download perl for libvpx if(NOT EXISTS "${DOWNLOAD_DIR}/strawberry-perl-5.38.0.1-64bit-portable.zip") message("Downloading perl") - file(DOWNLOAD - "https://github.com/StrawberryPerl/Perl-Dist-Strawberry/releases/download/SP_5380_5361/strawberry-perl-5.38.0.1-64bit-portable.zip" - "${DOWNLOAD_DIR}/strawberry-perl-5.38.0.1-64bit-portable.zip" - ) + file(DOWNLOAD "https://github.com/StrawberryPerl/Perl-Dist-Strawberry/releases/download/SP_5380_5361/strawberry-perl-5.38.0.1-64bit-portable.zip" "${DOWNLOAD_DIR}/strawberry-perl-5.38.0.1-64bit-portable.zip") endif() # make perl root directory @@ -151,27 +138,19 @@ endif() message("Checking for gas-preprocessor.pl") if(NOT EXISTS "${DOWNLOAD_DIR}/msys2/msys64/usr/bin/gas-preprocessor.pl") message("Downloading gas-preprocessor.pl") - file(DOWNLOAD - "https://raw.githubusercontent.com/FFmpeg/gas-preprocessor/9309c67acb535ca6248f092e96131d8eb07eefc1/gas-preprocessor.pl" - "${DOWNLOAD_DIR}/msys2/msys64/usr/bin/gas-preprocessor.pl" - ) + file(DOWNLOAD "https://raw.githubusercontent.com/FFmpeg/gas-preprocessor/9309c67acb535ca6248f092e96131d8eb07eefc1/gas-preprocessor.pl" "${DOWNLOAD_DIR}/msys2/msys64/usr/bin/gas-preprocessor.pl") endif() # Get ar-lib message("Checking for ar-lib") if(NOT EXISTS "${DOWNLOAD_DIR}/msys2/msys64/usr/bin/ar-lib") message("Downloading ar-lib") - file(DOWNLOAD - "https://raw.githubusercontent.com/gcc-mirror/gcc/releases/gcc-12.2.0/ar-lib" - "${DOWNLOAD_DIR}/msys2/msys64/usr/bin/ar-lib" - ) + file(DOWNLOAD "https://raw.githubusercontent.com/gcc-mirror/gcc/releases/gcc-12.2.0/ar-lib" "${DOWNLOAD_DIR}/msys2/msys64/usr/bin/ar-lib") endif() if(NOT EXISTS "${DOWNLOAD_DIR}/msys2/msys64/ming64sh.cmd") message("Installing ming64sh.cmd") execute_process( - COMMAND ${CMAKE_COMMAND} -E copy - ${PATCH_DIR}/ming64sh.cmd - ${DOWNLOAD_DIR}/msys2/msys64/ming64sh.cmd + COMMAND ${CMAKE_COMMAND} -E copy ${PATCH_DIR}/ming64sh.cmd ${DOWNLOAD_DIR}/msys2/msys64/ming64sh.cmd ) endif() diff --git a/build_files/build_environment/cmake/shaderc.cmake b/build_files/build_environment/cmake/shaderc.cmake index e03d0903217..4d4226769a1 100644 --- a/build_files/build_environment/cmake/shaderc.cmake +++ b/build_files/build_environment/cmake/shaderc.cmake @@ -16,12 +16,7 @@ ExternalProject_Add(external_shaderc URL_HASH ${SHADERC_HASH_TYPE}=${SHADERC_HASH} DOWNLOAD_DIR ${DOWNLOAD_DIR} PREFIX ${BUILD_DIR}/shaderc - - CMAKE_ARGS - -DCMAKE_INSTALL_PREFIX=${LIBDIR}/shaderc - ${DEFAULT_CMAKE_FLAGS} - ${SHADERC_EXTRA_ARGS} - + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/shaderc ${DEFAULT_CMAKE_FLAGS} ${SHADERC_EXTRA_ARGS} INSTALL_DIR ${LIBDIR}/shaderc ) @@ -37,28 +32,17 @@ add_dependencies( if(WIN32) if(BUILD_MODE STREQUAL Release) ExternalProject_Add_Step(external_shaderc after_install - COMMAND ${CMAKE_COMMAND} -E copy_directory - ${LIBDIR}/shaderc/include - ${HARVEST_TARGET}/shaderc/include - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/shaderc/bin/shaderc_shared.dll - ${HARVEST_TARGET}/shaderc/bin/shaderc_shared.dll - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/shaderc/lib/shaderc_shared.lib - ${HARVEST_TARGET}/shaderc/lib/shaderc_shared.lib + COMMAND ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/shaderc/include ${HARVEST_TARGET}/shaderc/include + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/shaderc/bin/shaderc_shared.dll ${HARVEST_TARGET}/shaderc/bin/shaderc_shared.dll + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/shaderc/lib/shaderc_shared.lib ${HARVEST_TARGET}/shaderc/lib/shaderc_shared.lib DEPENDEES install ) endif() if(BUILD_MODE STREQUAL Debug) ExternalProject_Add_Step(external_shaderc after_install - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/shaderc/bin/shaderc_shared_d.dll - ${HARVEST_TARGET}/shaderc/bin/shaderc_shared_d.dll - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/shaderc/lib/shaderc_shared_d.lib - ${HARVEST_TARGET}/shaderc/lib/shaderc_shared_d.lib - + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/shaderc/bin/shaderc_shared_d.dll ${HARVEST_TARGET}/shaderc/bin/shaderc_shared_d.dll + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/shaderc/lib/shaderc_shared_d.lib ${HARVEST_TARGET}/shaderc/lib/shaderc_shared_d.lib DEPENDEES install ) endif() diff --git a/build_files/build_environment/cmake/sndfile.cmake b/build_files/build_environment/cmake/sndfile.cmake index cfd738dd116..83ab1ccd4fc 100644 --- a/build_files/build_environment/cmake/sndfile.cmake +++ b/build_files/build_environment/cmake/sndfile.cmake @@ -15,19 +15,9 @@ if(NOT WIN32) DOWNLOAD_DIR ${DOWNLOAD_DIR} URL_HASH ${SNDFILE_HASH_TYPE}=${SNDFILE_HASH} PREFIX ${BUILD_DIR}/sndfile - - CONFIGURE_COMMAND ${CONFIGURE_ENV} && - cd ${BUILD_DIR}/sndfile/src/external_sndfile/ && - ${SNDFILE_ENV} ${CONFIGURE_COMMAND} ${SNDFILE_OPTIONS} --prefix=${mingw_LIBDIR}/sndfile - - BUILD_COMMAND ${CONFIGURE_ENV} && - cd ${BUILD_DIR}/sndfile/src/external_sndfile/ && - make -j${MAKE_THREADS} - - INSTALL_COMMAND ${CONFIGURE_ENV} && - cd ${BUILD_DIR}/sndfile/src/external_sndfile/ && - make install - + CONFIGURE_COMMAND ${CONFIGURE_ENV} && cd ${BUILD_DIR}/sndfile/src/external_sndfile/ && ${SNDFILE_ENV} ${CONFIGURE_COMMAND} ${SNDFILE_OPTIONS} --prefix=${mingw_LIBDIR}/sndfile + BUILD_COMMAND ${CONFIGURE_ENV} && cd ${BUILD_DIR}/sndfile/src/external_sndfile/ && make -j${MAKE_THREADS} + INSTALL_COMMAND ${CONFIGURE_ENV} && cd ${BUILD_DIR}/sndfile/src/external_sndfile/ && make install INSTALL_DIR ${LIBDIR}/sndfile ) else() @@ -55,31 +45,17 @@ else() DOWNLOAD_DIR ${DOWNLOAD_DIR} URL_HASH ${SNDFILE_HASH_TYPE}=${SNDFILE_HASH} PREFIX ${BUILD_DIR}/sndfile - - PATCH_COMMAND ${CMAKE_COMMAND} -E copy - ${PATCH_DIR}/cmake/modules/FindLame.cmake - ${BUILD_DIR}/sndfile/src/external_sndfile/cmake/FindLame.cmake - - CMAKE_ARGS - -DCMAKE_INSTALL_PREFIX=${LIBDIR}/sndfile - ${DEFAULT_CMAKE_FLAGS} - ${SNDFILE_EXTRA_ARGS} - + PATCH_COMMAND ${CMAKE_COMMAND} -E copy ${PATCH_DIR}/cmake/modules/FindLame.cmake ${BUILD_DIR}/sndfile/src/external_sndfile/cmake/FindLame.cmake + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/sndfile ${DEFAULT_CMAKE_FLAGS} ${SNDFILE_EXTRA_ARGS} INSTALL_DIR ${LIBDIR}/sndfile ) endif() if(BUILD_MODE STREQUAL Release AND WIN32) ExternalProject_Add_Step(external_sndfile after_install - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/sndfile/bin/sndfile.dll - ${HARVEST_TARGET}/sndfile/lib/sndfile.dll - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/sndfile/lib/sndfile.lib - ${HARVEST_TARGET}/sndfile/lib/sndfile.lib - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/sndfile/include/sndfile.h - ${HARVEST_TARGET}/sndfile/include/sndfile.h + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/sndfile/bin/sndfile.dll ${HARVEST_TARGET}/sndfile/lib/sndfile.dll + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/sndfile/lib/sndfile.lib ${HARVEST_TARGET}/sndfile/lib/sndfile.lib + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/sndfile/include/sndfile.h ${HARVEST_TARGET}/sndfile/include/sndfile.h DEPENDEES install ) diff --git a/build_files/build_environment/cmake/spnav.cmake b/build_files/build_environment/cmake/spnav.cmake index 6535e0d9927..1f9d56f0b57 100644 --- a/build_files/build_environment/cmake/spnav.cmake +++ b/build_files/build_environment/cmake/spnav.cmake @@ -8,25 +8,20 @@ ExternalProject_Add(external_spnav URL_HASH ${SPNAV_HASH_TYPE}=${SPNAV_HASH} PREFIX ${BUILD_DIR}/spnav - CONFIGURE_COMMAND ${CONFIGURE_ENV} && - cd ${BUILD_DIR}/spnav/src/external_spnav/ && - ${CONFIGURE_COMMAND} - --prefix=${LIBDIR}/spnav - # X11 is not needed as Blender polls the device as part of the GHOST event loop. - # This is used to support `3dxserv`, however this is no longer supported by 3DCONNEXION. - # Disable so building without X11 is supported (WAYLAND only). - --disable-x11 - --disable-shared - --enable-static - --with-pic - - BUILD_COMMAND ${CONFIGURE_ENV} && - cd ${BUILD_DIR}/spnav/src/external_spnav/ && - make -j${MAKE_THREADS} - - INSTALL_COMMAND ${CONFIGURE_ENV} && - cd ${BUILD_DIR}/spnav/src/external_spnav/ && - make install + CONFIGURE_COMMAND + ${CONFIGURE_ENV} && + cd ${BUILD_DIR}/spnav/src/external_spnav/ && + ${CONFIGURE_COMMAND} + --prefix=${LIBDIR}/spnav + # X11 is not needed as Blender polls the device as part of the GHOST event loop. + # This is used to support `3dxserv`, however this is no longer supported by 3DCONNEXION. + # Disable so building without X11 is supported (WAYLAND only). + --disable-x11 + --disable-shared + --enable-static + --with-pic + BUILD_COMMAND ${CONFIGURE_ENV} && cd ${BUILD_DIR}/spnav/src/external_spnav/ && make -j${MAKE_THREADS} + INSTALL_COMMAND ${CONFIGURE_ENV} && cd ${BUILD_DIR}/spnav/src/external_spnav/ && make install INSTALL_DIR ${LIBDIR}/spnav ) diff --git a/build_files/build_environment/cmake/sqlite.cmake b/build_files/build_environment/cmake/sqlite.cmake index 57c3f0fb97f..fca5d9b62a7 100644 --- a/build_files/build_environment/cmake/sqlite.cmake +++ b/build_files/build_environment/cmake/sqlite.cmake @@ -32,11 +32,7 @@ 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_CONFIGURE_ENV ${SQLITE_CONFIGURE_ENV} && export LDFLAGS=${SQLITE_LDFLAGS} && export CFLAGS=${SQLITE_CFLAGS}) set(SQLITE_CONFIGURATION_ARGS ${SQLITE_CONFIGURATION_ARGS} --enable-threadsafe @@ -59,18 +55,8 @@ ExternalProject_Add(external_sqlite DOWNLOAD_DIR ${DOWNLOAD_DIR} URL_HASH ${SQLITE_HASH_TYPE}=${SQLITE_HASH} PREFIX ${BUILD_DIR}/sqlite - - CONFIGURE_COMMAND ${SQLITE_CONFIGURE_ENV} && - cd ${BUILD_DIR}/sqlite/src/external_sqlite/ && - ${CONFIGURE_COMMAND} --prefix=${LIBDIR}/sqlite ${SQLITE_CONFIGURATION_ARGS} - - BUILD_COMMAND ${CONFIGURE_ENV} && - cd ${BUILD_DIR}/sqlite/src/external_sqlite/ && - make -j${MAKE_THREADS} - - INSTALL_COMMAND ${CONFIGURE_ENV} && - cd ${BUILD_DIR}/sqlite/src/external_sqlite/ && - make install - + CONFIGURE_COMMAND ${SQLITE_CONFIGURE_ENV} && cd ${BUILD_DIR}/sqlite/src/external_sqlite/ && ${CONFIGURE_COMMAND} --prefix=${LIBDIR}/sqlite ${SQLITE_CONFIGURATION_ARGS} + BUILD_COMMAND ${CONFIGURE_ENV} && cd ${BUILD_DIR}/sqlite/src/external_sqlite/ && make -j${MAKE_THREADS} + INSTALL_COMMAND ${CONFIGURE_ENV} && cd ${BUILD_DIR}/sqlite/src/external_sqlite/ && make install INSTALL_DIR ${LIBDIR}/sqlite ) diff --git a/build_files/build_environment/cmake/sse2neon.cmake b/build_files/build_environment/cmake/sse2neon.cmake index a75c5ac1ded..7113d71e04d 100644 --- a/build_files/build_environment/cmake/sse2neon.cmake +++ b/build_files/build_environment/cmake/sse2neon.cmake @@ -9,13 +9,6 @@ ExternalProject_Add(external_sse2neon PREFIX ${BUILD_DIR}/sse2neon CONFIGURE_COMMAND echo sse2neon - Nothing to configure BUILD_COMMAND echo sse2neon - nothing to build - INSTALL_COMMAND ${CMAKE_COMMAND} -E copy ${BUILD_DIR}/sse2neon/src/external_sse2neon/sse2neon.h ${LIBDIR}/sse2neon + INSTALL_COMMAND mkdir -p ${LIBDIR}/sse2neon && cp ${BUILD_DIR}/sse2neon/src/external_sse2neon/sse2neon.h ${LIBDIR}/sse2neon INSTALL_DIR ${LIBDIR}/sse2neon ) - -if(BUILD_MODE STREQUAL Release AND WIN32) - ExternalProject_Add_Step(external_sse2neon after_install - COMMAND ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/sse2neon ${HARVEST_TARGET}/sse2neon - DEPENDEES install - ) -endif() diff --git a/build_files/build_environment/cmake/ssl.cmake b/build_files/build_environment/cmake/ssl.cmake index f2c3043682d..7ddc24a62a6 100644 --- a/build_files/build_environment/cmake/ssl.cmake +++ b/build_files/build_environment/cmake/ssl.cmake @@ -5,8 +5,7 @@ set(SSL_CONFIGURE_COMMAND ./Configure) if(WIN32) - # Python will build this with its preferred build options and patches. - # We only need to unpack openssl. + # Python will build this with its preferred build options and patches. We only need to unpack openssl ExternalProject_Add(external_ssl URL file://${PACKAGE_DIR}/${SSL_FILE} DOWNLOAD_DIR ${DOWNLOAD_DIR} @@ -36,33 +35,22 @@ else() DOWNLOAD_DIR ${DOWNLOAD_DIR} URL_HASH ${SSL_HASH_TYPE}=${SSL_HASH} PREFIX ${BUILD_DIR}/ssl - - CONFIGURE_COMMAND ${CONFIGURE_ENV} && - cd ${BUILD_DIR}/ssl/src/external_ssl/ && - ${SSL_CONFIGURE_COMMAND} - --prefix=${LIBDIR}/ssl - --openssldir=${LIBDIR}/ssl - # Without this: Python will use the build directories. - # using the system directory `/etc/ssl` might seem the obvious choice, - # there is no guarantee the version of SSL used with Blender is compatible with the systems, - # where changes to the SSL configuration format can cause SSL not to load (see #114452). - # So reference a directory known not to exist. Ideally Blender could distribute its own SSL - # directory, but this isn't compatible with hard coded paths. - # See #111132 & https://github.com/openssl/openssl/issues/20185 for details. - -DOPENSSLDIR=\\"/dev/null\\" - no-shared - no-idea no-mdc2 no-rc5 no-zlib no-ssl3 enable-unit-test no-ssl3-method enable-rfc3779 enable-cms - --config=${CMAKE_CURRENT_SOURCE_DIR}/cmake/ssl.conf - ${SSL_OS_COMPILER} - - BUILD_COMMAND ${CONFIGURE_ENV} && - cd ${BUILD_DIR}/ssl/src/external_ssl/ && - make -j${MAKE_THREADS} - - INSTALL_COMMAND ${CONFIGURE_ENV} && - cd ${BUILD_DIR}/ssl/src/external_ssl/ && - make install - + CONFIGURE_COMMAND ${CONFIGURE_ENV} && cd ${BUILD_DIR}/ssl/src/external_ssl/ && ${SSL_CONFIGURE_COMMAND} --prefix=${LIBDIR}/ssl + --openssldir=${LIBDIR}/ssl + # Without this: Python will use the build directories. + # using the system directory `/etc/ssl` might seem the obvious choice, + # there is no guarantee the version of SSL used with Blender is compatible with the systems, + # where changes to the SSL configuration format can cause SSL not to load (see #114452). + # So reference a directory known not to exist. Ideally Blender could distribute its own SSL + # directory, but this isn't compatible with hard coded paths. + # See #111132 & https://github.com/openssl/openssl/issues/20185 for details. + -DOPENSSLDIR=\\"/dev/null\\" + no-shared + no-idea no-mdc2 no-rc5 no-zlib no-ssl3 enable-unit-test no-ssl3-method enable-rfc3779 enable-cms + --config=${CMAKE_CURRENT_SOURCE_DIR}/cmake/ssl.conf + ${SSL_OS_COMPILER} + BUILD_COMMAND ${CONFIGURE_ENV} && cd ${BUILD_DIR}/ssl/src/external_ssl/ && make -j${MAKE_THREADS} + INSTALL_COMMAND ${CONFIGURE_ENV} && cd ${BUILD_DIR}/ssl/src/external_ssl/ && make install INSTALL_DIR ${LIBDIR}/ssl ) endif() diff --git a/build_files/build_environment/cmake/tbb.cmake b/build_files/build_environment/cmake/tbb.cmake index 2901d8bd4f2..27b2d7a637a 100644 --- a/build_files/build_environment/cmake/tbb.cmake +++ b/build_files/build_environment/cmake/tbb.cmake @@ -25,19 +25,9 @@ ExternalProject_Add(external_tbb DOWNLOAD_DIR ${DOWNLOAD_DIR} URL_HASH ${TBB_HASH_TYPE}=${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/build/version_string.ver.in && - - ${PATCH_CMD} -p 1 -d - ${BUILD_DIR}/tbb/src/external_tbb < - ${PATCH_DIR}/tbb.diff - + 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/build/version_string.ver.in && + ${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 ) @@ -45,72 +35,35 @@ ExternalProject_Add(external_tbb if(WIN32) if(BUILD_MODE STREQUAL Release) ExternalProject_Add_Step(external_tbb after_install - # `findtbb.cmake` in some deps *NEEDS* to find `tbb_debug.lib` even if they are not going - # to use it to make that test pass, we place a copy with the right name in the lib folder. - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/tbb/lib/tbb.lib - ${LIBDIR}/tbb/lib/tbb_debug.lib - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/tbb/lib/tbbmalloc.lib - ${LIBDIR}/tbb/lib/tbbmalloc_debug.lib - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/tbb/bin/tbb.dll - ${LIBDIR}/tbb/bin/tbb_debug.dll - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/tbb/bin/tbbmalloc.dll - ${LIBDIR}/tbb/bin/tbbmalloc_debug.dll + # findtbb.cmake in some deps *NEEDS* to find tbb_debug.lib even if they are not going to use it + # to make that test pass, we place a copy with the right name in the lib folder. + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/tbb/lib/tbb.lib ${LIBDIR}/tbb/lib/tbb_debug.lib + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/tbb/lib/tbbmalloc.lib ${LIBDIR}/tbb/lib/tbbmalloc_debug.lib + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/tbb/bin/tbb.dll ${LIBDIR}/tbb/bin/tbb_debug.dll + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/tbb/bin/tbbmalloc.dll ${LIBDIR}/tbb/bin/tbbmalloc_debug.dll # Normal collection of build artifacts - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/tbb/lib/tbb.lib - ${HARVEST_TARGET}/tbb/lib/tbb.lib - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/tbb/bin/tbb.dll - ${HARVEST_TARGET}/tbb/bin/tbb.dll - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/tbb/lib/tbbmalloc.lib - ${HARVEST_TARGET}/tbb/lib/tbbmalloc.lib - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/tbb/bin/tbbmalloc.dll - ${HARVEST_TARGET}/tbb/bin/tbbmalloc.dll - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/tbb/lib/tbbmalloc_proxy.lib - ${HARVEST_TARGET}/tbb/lib/tbbmalloc_proxy.lib - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/tbb/bin/tbbmalloc_proxy.dll - ${HARVEST_TARGET}/tbb/bin/tbbmalloc_proxy.dll - COMMAND ${CMAKE_COMMAND} -E copy_directory - ${LIBDIR}/tbb/include/ - ${HARVEST_TARGET}/tbb/include/ - + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/tbb/lib/tbb.lib ${HARVEST_TARGET}/tbb/lib/tbb.lib + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/tbb/bin/tbb.dll ${HARVEST_TARGET}/tbb/bin/tbb.dll + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/tbb/lib/tbbmalloc.lib ${HARVEST_TARGET}/tbb/lib/tbbmalloc.lib + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/tbb/bin/tbbmalloc.dll ${HARVEST_TARGET}/tbb/bin/tbbmalloc.dll + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/tbb/lib/tbbmalloc_proxy.lib ${HARVEST_TARGET}/tbb/lib/tbbmalloc_proxy.lib + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/tbb/bin/tbbmalloc_proxy.dll ${HARVEST_TARGET}/tbb/bin/tbbmalloc_proxy.dll + COMMAND ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/tbb/include/ ${HARVEST_TARGET}/tbb/include/ DEPENDEES install ) endif() if(BUILD_MODE STREQUAL Debug) ExternalProject_Add_Step(external_tbb after_install - # `findtbb.cmake` in some deps *NEEDS* to find `tbb.lib` even if they are not going to use - # it to make that test pass, we place a copy with the right name in the lib folder. - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/tbb/lib/tbb_debug.lib - ${LIBDIR}/tbb/lib/tbb.lib + # findtbb.cmake in some deps *NEEDS* to find tbb.lib even if they are not going to use it + # to make that test pass, we place a copy with the right name in the lib folder. + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/tbb/lib/tbb_debug.lib ${LIBDIR}/tbb/lib/tbb.lib # Normal collection of build artifacts - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/tbb/lib/tbb_debug.lib - ${HARVEST_TARGET}/tbb/lib/tbb_debug.lib - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/tbb/bin/tbb_debug.dll - ${HARVEST_TARGET}/tbb/bin/tbb_debug.dll - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/tbb/lib/tbbmalloc_debug.lib - ${HARVEST_TARGET}/tbb/lib/tbbmalloc_debug.lib - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/tbb/lib/tbbmalloc_proxy_debug.lib - ${HARVEST_TARGET}/tbb/lib/tbbmalloc_proxy_debug.lib - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/tbb/bin/tbbmalloc_debug.dll - ${HARVEST_TARGET}/tbb/bin/tbbmalloc_debug.dll - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/tbb/bin/tbbmalloc_proxy_debug.dll - ${HARVEST_TARGET}/tbb/bin/tbbmalloc_proxy_debug.dll + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/tbb/lib/tbb_debug.lib ${HARVEST_TARGET}/tbb/lib/tbb_debug.lib + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/tbb/bin/tbb_debug.dll ${HARVEST_TARGET}/tbb/bin/tbb_debug.dll + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/tbb/lib/tbbmalloc_debug.lib ${HARVEST_TARGET}/tbb/lib/tbbmalloc_debug.lib + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/tbb/lib/tbbmalloc_proxy_debug.lib ${HARVEST_TARGET}/tbb/lib/tbbmalloc_proxy_debug.lib + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/tbb/bin/tbbmalloc_debug.dll ${HARVEST_TARGET}/tbb/bin/tbbmalloc_debug.dll + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/tbb/bin/tbbmalloc_proxy_debug.dll ${HARVEST_TARGET}/tbb/bin/tbbmalloc_proxy_debug.dll DEPENDEES install ) endif() diff --git a/build_files/build_environment/cmake/theora.cmake b/build_files/build_environment/cmake/theora.cmake index d6b0e6a1bcf..2b6944c3480 100644 --- a/build_files/build_environment/cmake/theora.cmake +++ b/build_files/build_environment/cmake/theora.cmake @@ -14,58 +14,29 @@ if(NOT WIN32) DOWNLOAD_DIR ${DOWNLOAD_DIR} URL_HASH ${THEORA_HASH_TYPE}=${THEORA_HASH} PREFIX ${BUILD_DIR}/theora - - PATCH_COMMAND ${PATCH_CMD} -p 0 -d - ${BUILD_DIR}/theora/src/external_theora < - ${PATCH_DIR}/theora.diff - - CONFIGURE_COMMAND ${THEORA_CONFIGURE_ENV} && - cd ${BUILD_DIR}/theora/src/external_theora/ && - ${CONFIGURE_COMMAND} - --prefix=${LIBDIR}/theora - --disable-shared - --enable-static - --with-pic - --with-ogg=${LIBDIR}/ogg - --with-vorbis=${LIBDIR}/vorbis - --disable-examples - - BUILD_COMMAND ${THEORA_CONFIGURE_ENV} && - cd ${BUILD_DIR}/theora/src/external_theora/ && - make -j${MAKE_THREADS} - - INSTALL_COMMAND ${THEORA_CONFIGURE_ENV} && - cd ${BUILD_DIR}/theora/src/external_theora/ && - make install - + PATCH_COMMAND ${PATCH_CMD} -p 0 -d ${BUILD_DIR}/theora/src/external_theora < ${PATCH_DIR}/theora.diff + CONFIGURE_COMMAND ${THEORA_CONFIGURE_ENV} && cd ${BUILD_DIR}/theora/src/external_theora/ && ${CONFIGURE_COMMAND} --prefix=${LIBDIR}/theora + --disable-shared + --enable-static + --with-pic + --with-ogg=${LIBDIR}/ogg + --with-vorbis=${LIBDIR}/vorbis + --disable-examples + BUILD_COMMAND ${THEORA_CONFIGURE_ENV} && cd ${BUILD_DIR}/theora/src/external_theora/ && make -j${MAKE_THREADS} + INSTALL_COMMAND ${THEORA_CONFIGURE_ENV} && cd ${BUILD_DIR}/theora/src/external_theora/ && make install INSTALL_DIR ${LIBDIR}/theora ) else() - # We are kind of naughty here and steal vorbis' `FindOgg.cmake`, - # but given it's a dependency anyway. + # We are kind of naughty here and steal vorbis' FindOgg.cmake, but given it's a dependency anyway... ExternalProject_Add(external_theora URL file://${PACKAGE_DIR}/${THEORA_FILE} DOWNLOAD_DIR ${DOWNLOAD_DIR} URL_HASH ${THEORA_HASH_TYPE}=${THEORA_HASH} PREFIX ${BUILD_DIR}/theora - - PATCH_COMMAND COMMAND - ${CMAKE_COMMAND} -E copy - ${PATCH_DIR}/cmakelists_theora.txt - ${BUILD_DIR}/theora/src/external_theora/CMakeLists.txt && - ${CMAKE_COMMAND} -E copy - ${PATCH_DIR}/libtheora.def - ${BUILD_DIR}/theora/src/external_theora/libtheora.def && - ${CMAKE_COMMAND} -E copy - ${BUILD_DIR}/vorbis/src/external_vorbis/cmake/FindOgg.cmake - ${BUILD_DIR}/theora/src/external_theora/FindOgg.cmake - - CMAKE_ARGS - -DCMAKE_INSTALL_PREFIX=${LIBDIR}/theora - -DOGG_ROOT=${LIBDIR}/ogg - ${DEFAULT_CMAKE_FLAGS} - -DLIBDIR=${LIBDIR} - + PATCH_COMMAND COMMAND ${CMAKE_COMMAND} -E copy ${PATCH_DIR}/cmakelists_theora.txt ${BUILD_DIR}/theora/src/external_theora/CMakeLists.txt && + ${CMAKE_COMMAND} -E copy ${PATCH_DIR}/libtheora.def ${BUILD_DIR}/theora/src/external_theora/libtheora.def && + ${CMAKE_COMMAND} -E copy ${BUILD_DIR}/vorbis/src/external_vorbis/cmake/FindOgg.cmake ${BUILD_DIR}/theora/src/external_theora/FindOgg.cmake + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/theora -DOGG_ROOT=${LIBDIR}/ogg ${DEFAULT_CMAKE_FLAGS} -DLIBDIR=${LIBDIR} INSTALL_DIR ${LIBDIR}/theora ) endif() diff --git a/build_files/build_environment/cmake/tiff.cmake b/build_files/build_environment/cmake/tiff.cmake index ef3f544ffc7..7fd314d2b7c 100644 --- a/build_files/build_environment/cmake/tiff.cmake +++ b/build_files/build_environment/cmake/tiff.cmake @@ -22,12 +22,7 @@ ExternalProject_Add(external_tiff DOWNLOAD_DIR ${DOWNLOAD_DIR} URL_HASH ${TIFF_HASH_TYPE}=${TIFF_HASH} PREFIX ${BUILD_DIR}/tiff - - CMAKE_ARGS - -DCMAKE_INSTALL_PREFIX=${LIBDIR}/tiff - ${DEFAULT_CMAKE_FLAGS} - ${TIFF_EXTRA_ARGS} - + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/tiff ${DEFAULT_CMAKE_FLAGS} ${TIFF_EXTRA_ARGS} INSTALL_DIR ${LIBDIR}/tiff ) @@ -39,13 +34,8 @@ add_dependencies( if(WIN32) if(BUILD_MODE STREQUAL Release) ExternalProject_Add_Step(external_tiff after_install - COMMAND - ${CMAKE_COMMAND} -E copy - ${LIBDIR}/tiff/lib/tiff.lib - ${HARVEST_TARGET}/tiff/lib/libtiff.lib && - ${CMAKE_COMMAND} -E copy_directory - ${LIBDIR}/tiff/include/ - ${HARVEST_TARGET}/tiff/include/ + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/tiff/lib/tiff.lib ${HARVEST_TARGET}/tiff/lib/libtiff.lib && + ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/tiff/include/ ${HARVEST_TARGET}/tiff/include/ DEPENDEES install ) endif() diff --git a/build_files/build_environment/cmake/usd.cmake b/build_files/build_environment/cmake/usd.cmake index ac5ef653d94..1251de4d89d 100644 --- a/build_files/build_environment/cmake/usd.cmake +++ b/build_files/build_environment/cmake/usd.cmake @@ -5,9 +5,6 @@ if(WIN32) # OIIO and OSL are statically linked for us, but USD doesn't know set(USD_CXX_FLAGS "${CMAKE_CXX_FLAGS} /DOIIO_STATIC_DEFINE /DOSL_STATIC_DEFINE") - if(BLENDER_PLATFORM_ARM) - set(USD_CXX_FLAGS "${USD_CXX_FLAGS} /DOIIO_NO_SSE") - endif() if(BUILD_MODE STREQUAL Debug) # USD does not look for debug libs, nor does it link them # when building static, so this is just to keep find_package happy @@ -114,21 +111,9 @@ ExternalProject_Add(external_usd CMAKE_GENERATOR ${PLATFORM_ALT_GENERATOR} PREFIX ${BUILD_DIR}/usd LIST_SEPARATOR ^^ - - PATCH_COMMAND - ${PATCH_CMD} -p 1 -d - ${BUILD_DIR}/usd/src/external_usd < - ${PATCH_DIR}/usd.diff && - ${PATCH_CMD} -p 1 -d - ${BUILD_DIR}/usd/src/external_usd < - ${PATCH_DIR}/usd_core_profile.diff - - CMAKE_ARGS - -DCMAKE_INSTALL_PREFIX=${LIBDIR}/usd - -Wno-dev - ${DEFAULT_CMAKE_FLAGS} - ${USD_EXTRA_ARGS} - + PATCH_COMMAND ${PATCH_CMD} -p 1 -d ${BUILD_DIR}/usd/src/external_usd < ${PATCH_DIR}/usd.diff && + ${PATCH_CMD} -p 1 -d ${BUILD_DIR}/usd/src/external_usd < ${PATCH_DIR}/usd_core_profile.diff + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/usd -Wno-dev ${DEFAULT_CMAKE_FLAGS} ${USD_EXTRA_ARGS} INSTALL_DIR ${LIBDIR}/usd ) @@ -143,8 +128,7 @@ add_dependencies( openvdb ) -# Since USD 21.11 the libraries are prefixed with "usd_", -# i.e. "libusd_m.a" became "libusd_usd_m.a". +# Since USD 21.11 the libraries are prefixed with "usd_", i.e. "libusd_m.a" became "libusd_usd_m.a". # See https://github.com/PixarAnimationStudios/USD/blob/release/CHANGELOG.md#2111---2021-11-01 if(NOT WIN32) if(USD_VERSION VERSION_LESS 21.11) @@ -157,24 +141,15 @@ endif() if(WIN32) if(BUILD_MODE STREQUAL Release) ExternalProject_Add_Step(external_usd after_install - COMMAND ${CMAKE_COMMAND} -E copy_directory - ${LIBDIR}/usd - ${HARVEST_TARGET}/usd - + COMMAND ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/usd ${HARVEST_TARGET}/usd DEPENDEES install ) endif() if(BUILD_MODE STREQUAL Debug) ExternalProject_Add_Step(external_usd after_install - COMMAND ${CMAKE_COMMAND} -E copy_directory - ${LIBDIR}/usd/lib/python - ${HARVEST_TARGET}/usd/lib/debug/python - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/usd/lib/usd_ms_d.dll - ${HARVEST_TARGET}/usd/lib/usd_ms_d.dll - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/usd/lib/usd_ms_d.lib - ${HARVEST_TARGET}/usd/lib/usd_ms_d.lib + COMMAND ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/usd/lib/python ${HARVEST_TARGET}/usd/lib/debug/python + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/usd/lib/usd_ms_d.dll ${HARVEST_TARGET}/usd/lib/usd_ms_d.dll + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/usd/lib/usd_ms_d.lib ${HARVEST_TARGET}/usd/lib/usd_ms_d.lib DEPENDEES install ) endif() diff --git a/build_files/build_environment/cmake/versions.cmake b/build_files/build_environment/cmake/versions.cmake index b9304c0388f..81381858c45 100644 --- a/build_files/build_environment/cmake/versions.cmake +++ b/build_files/build_environment/cmake/versions.cmake @@ -639,10 +639,10 @@ set(BROTLI_HASH_TYPE SHA256) set(BROTLI_FILE brotli-v${BROTLI_VERSION}.tar.gz) set(BROTLI_CPE "cpe:2.3:a:google:brotli:${BROTLI_VERSION}:*:*:*:*:*:*:*") -set(OPENPGL_VERSION v0.6.0) -set(OPENPGL_SHORT_VERSION 0.6.0) +set(OPENPGL_VERSION v0.5.0) +set(OPENPGL_SHORT_VERSION 0.5.0) set(OPENPGL_URI https://github.com/OpenPathGuidingLibrary/openpgl/archive/refs/tags/${OPENPGL_VERSION}.tar.gz) -set(OPENPGL_HASH 4192a4096ee3e3d31878cd013f8de23418c8037c576537551f946c4811931c5e) +set(OPENPGL_HASH 1ec806d434d45e43e098f82ee9be0cb74928343898c57490b34ff80584e9805a) set(OPENPGL_HASH_TYPE SHA256) set(OPENPGL_FILE openpgl-${OPENPGL_VERSION}.tar.gz) diff --git a/build_files/build_environment/cmake/vorbis.cmake b/build_files/build_environment/cmake/vorbis.cmake index e141c4d0908..13074256cdc 100644 --- a/build_files/build_environment/cmake/vorbis.cmake +++ b/build_files/build_environment/cmake/vorbis.cmake @@ -3,18 +3,13 @@ # SPDX-License-Identifier: GPL-2.0-or-later ExternalProject_Add(external_vorbis - URL file://${PACKAGE_DIR}/${VORBIS_FILE} - DOWNLOAD_DIR ${DOWNLOAD_DIR} - URL_HASH ${VORBIS_HASH_TYPE}=${VORBIS_HASH} - PREFIX ${BUILD_DIR}/vorbis - - CMAKE_ARGS - -DCMAKE_INSTALL_PREFIX=${LIBDIR}/vorbis - -DOGG_ROOT=${LIBDIR}/ogg - ${DEFAULT_CMAKE_FLAGS} - - INSTALL_DIR ${LIBDIR}/vorbis -) + URL file://${PACKAGE_DIR}/${VORBIS_FILE} + DOWNLOAD_DIR ${DOWNLOAD_DIR} + URL_HASH ${VORBIS_HASH_TYPE}=${VORBIS_HASH} + PREFIX ${BUILD_DIR}/vorbis + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/vorbis -DOGG_ROOT=${LIBDIR}/ogg ${DEFAULT_CMAKE_FLAGS} + INSTALL_DIR ${LIBDIR}/vorbis + ) add_dependencies( external_vorbis diff --git a/build_files/build_environment/cmake/vpx.cmake b/build_files/build_environment/cmake/vpx.cmake index 9ed28e6fad3..aca22358ef6 100644 --- a/build_files/build_environment/cmake/vpx.cmake +++ b/build_files/build_environment/cmake/vpx.cmake @@ -9,11 +9,7 @@ if(WIN32) # layer using win32 threads. So all this patch does is make it not find # pthead.h - set(VPX_PATCH - ${PATCH_CMD} -p 1 -d - ${BUILD_DIR}/vpx/src/external_vpx < - ${PATCH_DIR}/vpx_windows.diff - ) + set(VPX_PATCH ${PATCH_CMD} -p 1 -d ${BUILD_DIR}/vpx/src/external_vpx < ${PATCH_DIR}/vpx_windows.diff) if(MSVC_VERSION GREATER_EQUAL 1920) # 2019 set(VPX_COMPILER_STRING vs16) @@ -23,8 +19,8 @@ if(WIN32) if(BLENDER_PLATFORM_ARM) # ARM64 requires a min of vc142 - set(VPX_EXTRA_FLAGS --target=arm64-win64-vs16 --as=nasm --disable-neon_dotprod --disable-neon_i8mm) - set(VPX_INCL_ARCH nopost-nodocs-arm64-win64) + set(VPX_EXTRA_FLAGS --target=arm64-win64-vs16 --as=nasm) + set(VPX_INCL_ARCH nopost-nodocs-arm64) else() set(VPX_EXTRA_FLAGS --target=x86_64-win64-${VPX_COMPILER_STRING} --as=nasm) set(VPX_INCL_ARCH nodocs-x86_64-win64) @@ -34,23 +30,10 @@ if(WIN32) set(VPX_INCLUDE_PATH ${BUILD_DIR}/vpx/src/external_vpx/vpx-vp8-vp9-${VPX_INCL_ARCH}md-${VPX_COMPILER_STRING}-v${VPX_VERSION}) - set(VPX_BUILD_COMMAND - ${CONFIGURE_ENV} && - cd ${BUILD_DIR}/vpx/src/external_vpx/ && - make dist && - msbuild /m vpx.sln /p:OutDir=${BUILD_DIR}/vpx/src/external_vpx-build/ /p:Configuration=Release - ) - set(VPX_INSTALL_COMMAND - ${CONFIGURE_ENV} && - ${CMAKE_COMMAND} -E copy_directory - ${VPX_INCLUDE_PATH}/include - ${LIBDIR}/vpx/include && - ${CMAKE_COMMAND} -E copy_directory - ${BUILD_DIR}/vpx/src/external_vpx-build/ - ${LIBDIR}/vpx/lib/ && - ${CMAKE_COMMAND} -E copy - ${LIBDIR}/vpx/lib/vpxmd.lib - ${LIBDIR}/vpx/lib/vpx.lib) + set(VPX_BUILD_COMMAND ${CONFIGURE_ENV} && cd ${BUILD_DIR}/vpx/src/external_vpx/ && make dist && msbuild /m vpx.sln /p:OutDir=${BUILD_DIR}/vpx/src/external_vpx-build/ /p:Configuration=Release) + set(VPX_INSTALL_COMMAND ${CONFIGURE_ENV} && ${CMAKE_COMMAND} -E copy_directory ${VPX_INCLUDE_PATH}/include ${LIBDIR}/vpx/include && + ${CMAKE_COMMAND} -E copy_directory ${BUILD_DIR}/vpx/src/external_vpx-build/ ${LIBDIR}/vpx/lib/ && + ${CMAKE_COMMAND} -E copy ${LIBDIR}/vpx/lib/vpxmd.lib ${LIBDIR}/vpx/lib/vpx.lib) else() if(APPLE) if("${CMAKE_OSX_ARCHITECTURES}" STREQUAL "arm64") @@ -64,14 +47,8 @@ else() set(VPX_CONFIGURE_COMMAND ${CONFIGURE_ENV}) - set(VPX_BUILD_COMMAND ${CONFIGURE_ENV} && - cd ${BUILD_DIR}/vpx/src/external_vpx/ && - make -j${MAKE_THREADS} - ) - set(VPX_INSTALL_COMMAND ${CONFIGURE_ENV} && - cd ${BUILD_DIR}/vpx/src/external_vpx/ && - make install - ) + set(VPX_BUILD_COMMAND ${CONFIGURE_ENV} && cd ${BUILD_DIR}/vpx/src/external_vpx/ && make -j${MAKE_THREADS}) + set(VPX_INSTALL_COMMAND ${CONFIGURE_ENV} && cd ${BUILD_DIR}/vpx/src/external_vpx/ && make install) endif() if(NOT BLENDER_PLATFORM_ARM) @@ -89,7 +66,6 @@ ExternalProject_Add(external_vpx DOWNLOAD_DIR ${DOWNLOAD_DIR} URL_HASH ${VPX_HASH_TYPE}=${VPX_HASH} PREFIX ${BUILD_DIR}/vpx - CONFIGURE_COMMAND ${VPX_CONFIGURE_COMMAND} && cd ${BUILD_DIR}/vpx/src/external_vpx/ && ${CONFIGURE_COMMAND_NO_TARGET} --prefix=${LIBDIR}/vpx @@ -102,7 +78,6 @@ ExternalProject_Add(external_vpx --enable-vp8 --enable-vp9 ${VPX_EXTRA_FLAGS} - BUILD_COMMAND ${VPX_BUILD_COMMAND} INSTALL_COMMAND ${VPX_INSTALL_COMMAND} PATCH_COMMAND ${VPX_PATCH} diff --git a/build_files/build_environment/cmake/vulkan.cmake b/build_files/build_environment/cmake/vulkan.cmake index f882cbc6417..0f7dd4549fe 100644 --- a/build_files/build_environment/cmake/vulkan.cmake +++ b/build_files/build_environment/cmake/vulkan.cmake @@ -8,12 +8,7 @@ ExternalProject_Add(external_vulkan_headers URL file://${PACKAGE_DIR}/${VULKAN_HEADERS_FILE} URL_HASH ${VULKAN_HEADERS_HASH_TYPE}=${VULKAN_HEADERS_HASH} PREFIX ${BUILD_DIR}/vulkan_headers - - CMAKE_ARGS - -DCMAKE_INSTALL_PREFIX=${LIBDIR}/vulkan_headers - -Wno-dev ${DEFAULT_CMAKE_FLAGS} - ${VULKAN_HEADERS_EXTRA_ARGS} - + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/vulkan_headers -Wno-dev ${DEFAULT_CMAKE_FLAGS} ${VULKAN_HEADERS_EXTRA_ARGS} INSTALL_DIR ${LIBDIR}/vulkan_headers ) @@ -30,24 +25,13 @@ if(UNIX AND NOT APPLE) -DPKG_WAYLAND_INCLUDE_DIRS=${LIBDIR}/wayland/include -DPKG_WAYLAND_LIBRARY_DIRS=${LIBDIR}/wayland/lib64 ) -elseif(BLENDER_PLATFORM_WINDOWS_ARM) - set(VULKAN_LOADER_EXTRA_ARGS - -DUSE_MASM=OFF - -DVulkanHeaders_DIR=${LIBDIR}/vulkan_headers/share/cmake/VulkanHeaders - ) endif() ExternalProject_Add(external_vulkan_loader URL file://${PACKAGE_DIR}/${VULKAN_LOADER_FILE} URL_HASH ${VULKAN_LOADER_HASH_TYPE}=${VULKAN_LOADER_HASH} PREFIX ${BUILD_DIR}/vulkan_loader - - CMAKE_ARGS - -DCMAKE_INSTALL_PREFIX=${LIBDIR}/vulkan_loader - -Wno-dev - ${DEFAULT_CMAKE_FLAGS} - ${VULKAN_LOADER_EXTRA_ARGS} - + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/vulkan_loader -Wno-dev ${DEFAULT_CMAKE_FLAGS} ${VULKAN_LOADER_EXTRA_ARGS} INSTALL_DIR ${LIBDIR}/vulkan_loader ) @@ -64,12 +48,8 @@ if(UNIX AND NOT APPLE) elseif(WIN32) if(BUILD_MODE STREQUAL Release) ExternalProject_Add_Step(external_vulkan_loader after_install - COMMAND ${CMAKE_COMMAND} -E copy_directory - ${LIBDIR}/vulkan_loader/ - ${HARVEST_TARGET}/vulkan - COMMAND ${CMAKE_COMMAND} -E copy_directory - ${LIBDIR}/vulkan_headers/ - ${HARVEST_TARGET}/vulkan + COMMAND ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/vulkan_loader/ ${HARVEST_TARGET}/vulkan + COMMAND ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/vulkan_headers/ ${HARVEST_TARGET}/vulkan DEPENDEES install ) endif() diff --git a/build_files/build_environment/cmake/wayland.cmake b/build_files/build_environment/cmake/wayland.cmake index bbf1f7e5801..778237f8926 100644 --- a/build_files/build_environment/cmake/wayland.cmake +++ b/build_files/build_environment/cmake/wayland.cmake @@ -7,7 +7,6 @@ ExternalProject_Add(external_wayland DOWNLOAD_DIR ${DOWNLOAD_DIR} URL_HASH ${WAYLAND_HASH_TYPE}=${WAYLAND_HASH} PREFIX ${BUILD_DIR}/wayland - # Use `-E` so the `PKG_CONFIG_PATH` can be defined to link against our own LIBEXPAT & LIBXML2. # # NOTE: passing link args "ffi/lib" should not be needed, but @@ -15,18 +14,8 @@ ExternalProject_Add(external_wayland # # NOTE: `-lm` is needed for `libxml2` which is a static library that uses `libm.so`, # without this, math symbols such as `floor` aren't found. - CONFIGURE_COMMAND - ${CMAKE_COMMAND} -E env - PKG_CONFIG_PATH=${LIBDIR}/expat/lib/pkgconfig:${LIBDIR}/xml2/lib/pkgconfig:${LIBDIR}/ffi/lib/pkgconfig:$PKG_CONFIG_PATH - ${MESON} - --prefix ${LIBDIR}/wayland - ${MESON_BUILD_TYPE} - -Ddocumentation=false - -Dtests=false - -D "c_link_args=-L${LIBDIR}/ffi/lib -lm" - . - ../external_wayland - + CONFIGURE_COMMAND ${CMAKE_COMMAND} -E env PKG_CONFIG_PATH=${LIBDIR}/expat/lib/pkgconfig:${LIBDIR}/xml2/lib/pkgconfig:${LIBDIR}/ffi/lib/pkgconfig:$PKG_CONFIG_PATH + ${MESON} --prefix ${LIBDIR}/wayland ${MESON_BUILD_TYPE} -Ddocumentation=false -Dtests=false -D "c_link_args=-L${LIBDIR}/ffi/lib -lm" . ../external_wayland BUILD_COMMAND ninja INSTALL_COMMAND ninja install ) diff --git a/build_files/build_environment/cmake/wayland_libdecor.cmake b/build_files/build_environment/cmake/wayland_libdecor.cmake index 0df79ebfb9d..a0310a9eb88 100644 --- a/build_files/build_environment/cmake/wayland_libdecor.cmake +++ b/build_files/build_environment/cmake/wayland_libdecor.cmake @@ -12,10 +12,6 @@ ExternalProject_Add(external_wayland_libdecor PREFIX ${BUILD_DIR}/wayland_libdecor BUILD_COMMAND echo . CONFIGURE_COMMAND echo . - - INSTALL_COMMAND cp - ../external_wayland_libdecor/src/libdecor.h - ${LIBDIR}/wayland_libdecor/include/libdecor-0/libdecor.h - + INSTALL_COMMAND cp ../external_wayland_libdecor/src/libdecor.h ${LIBDIR}/wayland_libdecor/include/libdecor-0/libdecor.h INSTALL_DIR ${LIBDIR}/wayland_libdecor/include/libdecor-0 ) diff --git a/build_files/build_environment/cmake/wayland_protocols.cmake b/build_files/build_environment/cmake/wayland_protocols.cmake index 29e37975384..f5ddd137a28 100644 --- a/build_files/build_environment/cmake/wayland_protocols.cmake +++ b/build_files/build_environment/cmake/wayland_protocols.cmake @@ -8,16 +8,8 @@ ExternalProject_Add(external_wayland_protocols URL_HASH ${WL_PROTOCOLS_HASH_TYPE}=${WL_PROTOCOLS_HASH} PREFIX ${BUILD_DIR}/wayland-protocols # Use `-E` so the `PKG_CONFIG_PATH` can be defined to link against our own WAYLAND. - - CONFIGURE_COMMAND ${CMAKE_COMMAND} -E - env PKG_CONFIG_PATH=${LIBDIR}/wayland/lib64/pkgconfig:$PKG_CONFIG_PATH - ${MESON} - --prefix ${LIBDIR}/wayland-protocols - ${MESON_BUILD_TYPE} - . - ../external_wayland_protocols - -Dtests=false - + CONFIGURE_COMMAND ${CMAKE_COMMAND} -E env PKG_CONFIG_PATH=${LIBDIR}/wayland/lib64/pkgconfig:$PKG_CONFIG_PATH + ${MESON} --prefix ${LIBDIR}/wayland-protocols ${MESON_BUILD_TYPE} . ../external_wayland_protocols -Dtests=false BUILD_COMMAND ninja INSTALL_COMMAND ninja install ) diff --git a/build_files/build_environment/cmake/wayland_weston.cmake b/build_files/build_environment/cmake/wayland_weston.cmake index 2d61b28d081..ff97f4222b9 100644 --- a/build_files/build_environment/cmake/wayland_weston.cmake +++ b/build_files/build_environment/cmake/wayland_weston.cmake @@ -20,35 +20,36 @@ ExternalProject_Add(external_wayland_weston # - Keep X11 and WAYLAND back-ends enabled so it's possible # to run the instance inside existing X11/WAYLAND sessions (for debugging). CONFIGURE_COMMAND ${WAYLAND_WESTON_CONFIGURE_ENV} && - ${CMAKE_COMMAND} -E env ${WAYLAND_WESTON_PKG_ENV} ${MESON} setup - ${MESON_BUILD_TYPE} - --prefix ${LIBDIR}/wayland_weston - --libdir lib - -Dbackend-default=headless # For tests. - -Dbackend-drm-screencast-vaapi=false - -Dbackend-drm=false - -Dbackend-pipewire=false - -Dbackend-rdp=false - -Dbackend-vnc=false - -Dcolor-management-lcms=false - -Ddemo-clients=false - -Ddoc=false - -Dimage-jpeg=false - -Dimage-webp=false - -Dpipewire=false - -Dremoting=false - -Dscreenshare=false - -Dshell-fullscreen=false - -Dshell-ivi=false - -Dshell-kiosk=false - -Dsimple-clients= - -Dsystemd=false - -Dtest-junit-xml=false - -Dtools= - -Dwcap-decode=false - -Dxwayland=false - ${BUILD_DIR}/wayland_weston/src/external_wayland_weston-build - ${BUILD_DIR}/wayland_weston/src/external_wayland_weston + ${CMAKE_COMMAND} -E env ${WAYLAND_WESTON_PKG_ENV} + ${MESON} setup + ${MESON_BUILD_TYPE} + --prefix ${LIBDIR}/wayland_weston + --libdir lib + -Dbackend-default=headless # For tests. + -Dbackend-drm-screencast-vaapi=false + -Dbackend-drm=false + -Dbackend-pipewire=false + -Dbackend-rdp=false + -Dbackend-vnc=false + -Dcolor-management-lcms=false + -Ddemo-clients=false + -Ddoc=false + -Dimage-jpeg=false + -Dimage-webp=false + -Dpipewire=false + -Dremoting=false + -Dscreenshare=false + -Dshell-fullscreen=false + -Dshell-ivi=false + -Dshell-kiosk=false + -Dsimple-clients= + -Dsystemd=false + -Dtest-junit-xml=false + -Dtools= + -Dwcap-decode=false + -Dxwayland=false + ${BUILD_DIR}/wayland_weston/src/external_wayland_weston-build + ${BUILD_DIR}/wayland_weston/src/external_wayland_weston BUILD_COMMAND ninja INSTALL_COMMAND ninja install diff --git a/build_files/build_environment/cmake/webp.cmake b/build_files/build_environment/cmake/webp.cmake index 9be9c4fc1a3..3a87b36ac60 100644 --- a/build_files/build_environment/cmake/webp.cmake +++ b/build_files/build_environment/cmake/webp.cmake @@ -28,23 +28,14 @@ ExternalProject_Add(external_webp DOWNLOAD_DIR ${DOWNLOAD_DIR} URL_HASH ${WEBP_HASH_TYPE}=${WEBP_HASH} PREFIX ${BUILD_DIR}/webp - - CMAKE_ARGS - -DCMAKE_INSTALL_PREFIX=${LIBDIR}/webp - -Wno-dev - ${DEFAULT_CMAKE_FLAGS} - ${WEBP_EXTRA_ARGS} - + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/webp -Wno-dev ${DEFAULT_CMAKE_FLAGS} ${WEBP_EXTRA_ARGS} INSTALL_DIR ${LIBDIR}/webp ) if(WIN32) if(BUILD_MODE STREQUAL Release) ExternalProject_Add_Step(external_webp after_install - COMMAND ${CMAKE_COMMAND} -E copy_directory - ${LIBDIR}/webp - ${HARVEST_TARGET}/webp - + COMMAND ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/webp ${HARVEST_TARGET}/webp DEPENDEES install ) endif() diff --git a/build_files/build_environment/cmake/x264.cmake b/build_files/build_environment/cmake/x264.cmake index be861efcc9a..a451a8aea84 100644 --- a/build_files/build_environment/cmake/x264.cmake +++ b/build_files/build_environment/cmake/x264.cmake @@ -11,8 +11,8 @@ if(BLENDER_PLATFORM_ARM) endif() if((APPLE AND NOT BLENDER_PLATFORM_ARM) OR (UNIX AND NOT APPLE)) - set(X264_CONFIGURE_ENV ${CONFIGURE_ENV} && - export AS=${LIBDIR}/nasm/bin/nasm + set(X264_CONFIGURE_ENV + ${CONFIGURE_ENV} && export AS=${LIBDIR}/nasm/bin/nasm ) elseif(WIN32) set(X264_CONFIGURE_ENV ${CONFIGURE_ENV_NO_PERL}) @@ -25,23 +25,14 @@ ExternalProject_Add(external_x264 DOWNLOAD_DIR ${DOWNLOAD_DIR} URL_HASH ${X264_HASH_TYPE}=${X264_HASH} PREFIX ${BUILD_DIR}/x264 - - CONFIGURE_COMMAND ${X264_CONFIGURE_ENV} && - cd ${BUILD_DIR}/x264/src/external_x264/ && + CONFIGURE_COMMAND ${X264_CONFIGURE_ENV} && cd ${BUILD_DIR}/x264/src/external_x264/ && ${CONFIGURE_COMMAND} --prefix=${LIBDIR}/x264 - --enable-static - --enable-pic - --disable-lavf - ${X264_EXTRA_ARGS} - - BUILD_COMMAND ${X264_CONFIGURE_ENV} && - cd ${BUILD_DIR}/x264/src/external_x264/ && - make -j${MAKE_THREADS} - - INSTALL_COMMAND ${X264_CONFIGURE_ENV} && - cd ${BUILD_DIR}/x264/src/external_x264/ && - make install - + --enable-static + --enable-pic + --disable-lavf + ${X264_EXTRA_ARGS} + BUILD_COMMAND ${X264_CONFIGURE_ENV} && cd ${BUILD_DIR}/x264/src/external_x264/ && make -j${MAKE_THREADS} + INSTALL_COMMAND ${X264_CONFIGURE_ENV} && cd ${BUILD_DIR}/x264/src/external_x264/ && make install INSTALL_DIR ${LIBDIR}/x264 ) diff --git a/build_files/build_environment/cmake/xml2.cmake b/build_files/build_environment/cmake/xml2.cmake index a9bcb6ccb39..2c95b89a9e2 100644 --- a/build_files/build_environment/cmake/xml2.cmake +++ b/build_files/build_environment/cmake/xml2.cmake @@ -15,25 +15,15 @@ ExternalProject_Add(external_xml2 URL file://${PACKAGE_DIR}/${XML2_FILE} DOWNLOAD_DIR ${DOWNLOAD_DIR} URL_HASH ${XML2_HASH_TYPE}=${XML2_HASH} - - CMAKE_ARGS - -DCMAKE_INSTALL_PREFIX=${LIBDIR}/xml2 - ${DEFAULT_CMAKE_FLAGS} - ${XML2_EXTRA_ARGS} - + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/xml2 ${DEFAULT_CMAKE_FLAGS} ${XML2_EXTRA_ARGS} PREFIX ${BUILD_DIR}/xml2 INSTALL_DIR ${LIBDIR}/xml2 ) if(WIN32 AND BUILD_MODE STREQUAL Release) ExternalProject_Add_Step(external_xml2 after_install - COMMAND ${CMAKE_COMMAND} -E copy_directory - ${LIBDIR}/xml2/include - ${HARVEST_TARGET}/xml2/include - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/xml2/lib/libxml2s.lib - ${HARVEST_TARGET}/xml2/lib/libxml2s.lib - + COMMAND ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/xml2/include ${HARVEST_TARGET}/xml2/include + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/xml2/lib/libxml2s.lib ${HARVEST_TARGET}/xml2/lib/libxml2s.lib DEPENDEES install ) endif() diff --git a/build_files/build_environment/cmake/xr_openxr.cmake b/build_files/build_environment/cmake/xr_openxr.cmake index eb091506e70..77ae7d96212 100644 --- a/build_files/build_environment/cmake/xr_openxr.cmake +++ b/build_files/build_environment/cmake/xr_openxr.cmake @@ -25,34 +25,21 @@ ExternalProject_Add(external_xr_openxr_sdk DOWNLOAD_DIR ${DOWNLOAD_DIR} URL_HASH ${XR_OPENXR_SDK_HASH_TYPE}=${XR_OPENXR_SDK_HASH} PREFIX ${BUILD_DIR}/xr_openxr_sdk - - CMAKE_ARGS - -DCMAKE_INSTALL_PREFIX=${LIBDIR}/xr_openxr_sdk - ${DEFAULT_CMAKE_FLAGS} - ${XR_OPENXR_SDK_EXTRA_ARGS} - + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/xr_openxr_sdk ${DEFAULT_CMAKE_FLAGS} ${XR_OPENXR_SDK_EXTRA_ARGS} INSTALL_DIR ${LIBDIR}/xr_openxr_sdk ) if(WIN32) if(BUILD_MODE STREQUAL Release) ExternalProject_Add_Step(external_xr_openxr_sdk after_install - COMMAND ${CMAKE_COMMAND} -E copy_directory - ${LIBDIR}/xr_openxr_sdk/include/openxr - ${HARVEST_TARGET}/xr_openxr_sdk/include/openxr - COMMAND ${CMAKE_COMMAND} -E copy_directory - ${LIBDIR}/xr_openxr_sdk/lib - ${HARVEST_TARGET}/xr_openxr_sdk/lib - + COMMAND ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/xr_openxr_sdk/include/openxr ${HARVEST_TARGET}/xr_openxr_sdk/include/openxr + COMMAND ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/xr_openxr_sdk/lib ${HARVEST_TARGET}/xr_openxr_sdk/lib DEPENDEES install ) 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_loaderd.lib - ${HARVEST_TARGET}/xr_openxr_sdk/lib/openxr_loaderd.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 5cf85f36f6b..35fa74ca5a8 100644 --- a/build_files/build_environment/cmake/yamlcpp.cmake +++ b/build_files/build_environment/cmake/yamlcpp.cmake @@ -22,11 +22,6 @@ ExternalProject_Add(external_yamlcpp URL_HASH ${YAMLCPP_HASH_TYPE}=${YAMLCPP_HASH} PREFIX ${BUILD_DIR}/yamlcpp CMAKE_GENERATOR ${PLATFORM_ALT_GENERATOR} - - CMAKE_ARGS - -DCMAKE_INSTALL_PREFIX=${LIBDIR}/yamlcpp - ${DEFAULT_CMAKE_FLAGS} - ${YAMLCPP_EXTRA_ARGS} - + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/yamlcpp ${DEFAULT_CMAKE_FLAGS} ${YAMLCPP_EXTRA_ARGS} INSTALL_DIR ${LIBDIR}/yamlcpp ) diff --git a/build_files/build_environment/cmake/zlib.cmake b/build_files/build_environment/cmake/zlib.cmake index eca964d7785..72d8441c390 100644 --- a/build_files/build_environment/cmake/zlib.cmake +++ b/build_files/build_environment/cmake/zlib.cmake @@ -3,11 +3,7 @@ # SPDX-License-Identifier: GPL-2.0-or-later if(MSVC) - set(ZLIB_PATCH_COMMAND - ${PATCH_CMD} -p 1 -d - ${BUILD_DIR}/zlib/src/external_zlib < - ${PATCH_DIR}/zlib.diff - ) + set(ZLIB_PATCH_COMMAND ${PATCH_CMD} -p 1 -d ${BUILD_DIR}/zlib/src/external_zlib < ${PATCH_DIR}/zlib.diff) else() set(ZLIB_PATCH_COMMAND echo .) endif() @@ -17,37 +13,24 @@ ExternalProject_Add(external_zlib URL_HASH ${ZLIB_HASH_TYPE}=${ZLIB_HASH} PREFIX ${BUILD_DIR}/zlib PATCH_COMMAND ${ZLIB_PATCH_COMMAND} - - CMAKE_ARGS - -DCMAKE_POSITION_INDEPENDENT_CODE=ON - -DCMAKE_INSTALL_PREFIX=${LIBDIR}/zlib - ${DEFAULT_CMAKE_FLAGS} - + CMAKE_ARGS -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DCMAKE_INSTALL_PREFIX=${LIBDIR}/zlib ${DEFAULT_CMAKE_FLAGS} INSTALL_DIR ${LIBDIR}/zlib ) if(WIN32) if(BUILD_MODE STREQUAL Release) ExternalProject_Add_Step(external_zlib after_install - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/zlib/lib/zlibstatic${LIBEXT} - ${HARVEST_TARGET}/zlib/lib/libz_st${LIBEXT} - COMMAND ${CMAKE_COMMAND} -E copy_directory - ${LIBDIR}/zlib/include/ - ${HARVEST_TARGET}/zlib/include/ + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/zlib/lib/zlibstatic${LIBEXT} ${HARVEST_TARGET}/zlib/lib/libz_st${LIBEXT} + COMMAND ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/zlib/include/ ${HARVEST_TARGET}/zlib/include/ COMMAND ${CMAKE_COMMAND} -E rm -f ${LIBDIR}/zlib/bin/zlib.dll COMMAND ${CMAKE_COMMAND} -E rm -f ${LIBDIR}/zlib/lib/zlib.lib - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/zlib/lib/zlibstatic${LIBEXT} - ${LIBDIR}/zlib/lib/zlib${LIBEXT} + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/zlib/lib/zlibstatic${LIBEXT} ${LIBDIR}/zlib/lib/zlib${LIBEXT} DEPENDEES install ) endif() if(BUILD_MODE STREQUAL Debug) ExternalProject_Add_Step(external_zlib after_install - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/zlib/lib/zlibstaticd${LIBEXT} - ${HARVEST_TARGET}/zlib/lib/libz_st_d${LIBEXT} + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/zlib/lib/zlibstaticd${LIBEXT} ${HARVEST_TARGET}/zlib/lib/libz_st_d${LIBEXT} COMMAND ${CMAKE_COMMAND} -E rm -f ${LIBDIR}/zlib/bin/zlib.dll COMMAND ${CMAKE_COMMAND} -E rm -f ${LIBDIR}/zlib/lib/zlib.lib DEPENDEES install @@ -55,10 +38,7 @@ if(WIN32) endif() else() ExternalProject_Add_Step(external_zlib after_install - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/zlib/lib/libz.a - ${LIBDIR}/zlib/lib/libz_pic.a - + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/zlib/lib/libz.a ${LIBDIR}/zlib/lib/libz_pic.a DEPENDEES install ) endif() diff --git a/build_files/build_environment/cmake/zlib_mingw.cmake b/build_files/build_environment/cmake/zlib_mingw.cmake index f0ebf00bb33..61495252f11 100644 --- a/build_files/build_environment/cmake/zlib_mingw.cmake +++ b/build_files/build_environment/cmake/zlib_mingw.cmake @@ -8,21 +8,14 @@ ExternalProject_Add(external_zlib_mingw DOWNLOAD_DIR ${DOWNLOAD_DIR} PREFIX ${BUILD_DIR}/zlib_mingw CONFIGURE_COMMAND echo . - - BUILD_COMMAND ${CONFIGURE_ENV} && - cd ${BUILD_DIR}/zlib_mingw/src/external_zlib_mingw/ && - make -f win32/makefile.gcc -j${MAKE_THREADS} - + BUILD_COMMAND ${CONFIGURE_ENV} && cd ${BUILD_DIR}/zlib_mingw/src/external_zlib_mingw/ && make -f win32/makefile.gcc -j${MAKE_THREADS} INSTALL_COMMAND echo . INSTALL_DIR ${LIBDIR}/zlib_mingw ) if(BUILD_MODE STREQUAL Release) ExternalProject_Add_Step(external_zlib_mingw after_install - COMMAND ${CMAKE_COMMAND} -E copy - ${BUILD_DIR}/zlib_mingw/src/external_zlib_mingw/libz.a - ${LIBDIR}/zlib/lib/z.lib - + COMMAND ${CMAKE_COMMAND} -E copy ${BUILD_DIR}/zlib_mingw/src/external_zlib_mingw/libz.a ${LIBDIR}/zlib/lib/z.lib DEPENDEES install ) endif() diff --git a/build_files/build_environment/cmake/zstd.cmake b/build_files/build_environment/cmake/zstd.cmake index 842a4a87443..0ccded1d51c 100644 --- a/build_files/build_environment/cmake/zstd.cmake +++ b/build_files/build_environment/cmake/zstd.cmake @@ -22,25 +22,15 @@ ExternalProject_Add(external_zstd URL_HASH ${ZSTD_HASH_TYPE}=${ZSTD_HASH} PREFIX ${BUILD_DIR}/zstd SOURCE_SUBDIR build/cmake - - CMAKE_ARGS - -DCMAKE_INSTALL_PREFIX=${LIBDIR}/zstd - ${DEFAULT_CMAKE_FLAGS} - ${ZSTD_EXTRA_ARGS} - + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/zstd ${DEFAULT_CMAKE_FLAGS} ${ZSTD_EXTRA_ARGS} INSTALL_DIR ${LIBDIR}/zstd ) if(WIN32) if(BUILD_MODE STREQUAL Release) ExternalProject_Add_Step(external_zstd after_install - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBDIR}/zstd/lib/zstd_static${LIBEXT} - ${HARVEST_TARGET}/zstd/lib/zstd_static${LIBEXT} - COMMAND ${CMAKE_COMMAND} -E copy_directory - ${LIBDIR}/zstd/include/ - ${HARVEST_TARGET}/zstd/include/ - + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/zstd/lib/zstd_static${LIBEXT} ${HARVEST_TARGET}/zstd/lib/zstd_static${LIBEXT} + COMMAND ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/zstd/include/ ${HARVEST_TARGET}/zstd/include/ DEPENDEES install ) endif() diff --git a/build_files/build_environment/install_linux_packages.py b/build_files/build_environment/install_linux_packages.py index 0b85124bf3e..724e214070c 100755 --- a/build_files/build_environment/install_linux_packages.py +++ b/build_files/build_environment/install_linux_packages.py @@ -908,7 +908,7 @@ PACKAGES_ALL = ( DISTRO_ID_ARCH: "level-zero-headers", # ??? }, ), - Package(name="OpenPGL Library", is_mandatory=False, version="0.6.0", version_short="0.6", version_min="0.5.0", version_mex="0.7", + Package(name="OpenPGL Library", is_mandatory=False, version="0.5.0", version_short="0.5", version_min="0.5.0", version_mex="0.6", sub_packages=(), distro_package_names={DISTRO_ID_DEBIAN: None, DISTRO_ID_FEDORA: "openpgl-devel", diff --git a/build_files/build_environment/patches/cmakelists_tbb.txt b/build_files/build_environment/patches/cmakelists_tbb.txt index 2bcd8cfac1c..e05f27afdd6 100644 --- a/build_files/build_environment/patches/cmakelists_tbb.txt +++ b/build_files/build_environment/patches/cmakelists_tbb.txt @@ -145,7 +145,7 @@ if (UNIX) elseif(WIN32) target_compile_definitions(tbb_interface INTERFACE USE_WINTHREAD _WIN32_WINNT=0x0600) - if (MSVC AND NOT CMAKE_SYSTEM_PROCESSOR MATCHES ARM64) + if (MSVC) enable_language(ASM_MASM) target_compile_options(tbb_interface INTERFACE /GS- /Zc:wchar_t /Zc:forScope) check_cxx_compiler_flag ("/volatile:iso" SUPPORTS_VOLATILE_FLAG) @@ -209,11 +209,7 @@ endif() if (APPLE) set (ARCH_PREFIX "mac") elseif(WIN32) - if(CMAKE_SYSTEM_PROCESSOR MATCHES ARM64) - set (ARCH_PREFIX "winarm") - else() - set (ARCH_PREFIX "win") - endif() + set (ARCH_PREFIX "win") else() set (ARCH_PREFIX "lin") endif() diff --git a/build_files/build_environment/patches/embree.diff b/build_files/build_environment/patches/embree.diff index 44b314d8e6a..fe69493f89e 100644 --- a/build_files/build_environment/patches/embree.diff +++ b/build_files/build_environment/patches/embree.diff @@ -1,18 +1,5 @@ -diff --git a/CMakeLists.txt b/CMakeLists.txt -index 7fa9423e2..6de9b072b 100644 ---- a/CMakeLists.txt -+++ b/CMakeLists.txt -@@ -242,7 +242,7 @@ OPTION(EMBREE_MIN_WIDTH "Enables min-width feature to enlarge curve and point th - IF (APPLE AND CMAKE_SYSTEM_NAME STREQUAL "Darwin" AND (CMAKE_SYSTEM_PROCESSOR STREQUAL "arm64" OR CMAKE_OSX_ARCHITECTURES MATCHES "arm64")) - MESSAGE(STATUS "Building for Apple silicon") - SET(EMBREE_ARM ON) --ELSEIF(CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64") -+ELSEIF(CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64" OR CMAKE_SYSTEM_PROCESSOR STREQUAL "ARM64") - MESSAGE(STATUS "Building for AArch64") - SET(EMBREE_ARM ON) - ENDIF() diff --git a/kernels/CMakeLists.txt b/kernels/CMakeLists.txt -index fae31f4a4..8bb3601e7 100644 +index 7c2f43d..106b1d5 100644 --- a/kernels/CMakeLists.txt +++ b/kernels/CMakeLists.txt @@ -208,6 +208,12 @@ embree_files(EMBREE_LIBRARY_FILES_AVX512 ${AVX512}) diff --git a/build_files/build_environment/patches/embree_Directory.Build.Props.in b/build_files/build_environment/patches/embree_Directory.Build.Props.in deleted file mode 100644 index d3f7caa5fae..00000000000 --- a/build_files/build_environment/patches/embree_Directory.Build.Props.in +++ /dev/null @@ -1,7 +0,0 @@ - - - ${EMBREE_LLVM_INSTALL_PATH} - ${LLVM_VERSION} - ${EMBREE_VCTOOLS_VERSION} - - diff --git a/build_files/build_environment/patches/level-zero.diff b/build_files/build_environment/patches/level-zero.diff index d28b3310d70..03106e03149 100644 --- a/build_files/build_environment/patches/level-zero.diff +++ b/build_files/build_environment/patches/level-zero.diff @@ -1,7 +1,6 @@ -diff --git a/CMakeLists.txt b/CMakeLists.txt -index 7e27816..bd34055 100644 ---- a/CMakeLists.txt -+++ b/CMakeLists.txt +diff -Naur external_levelzero_org/CMakeLists.txt external_levelzero/CMakeLists.txt +--- external_levelzero_org/CMakeLists.txt 2022-03-07 13:22:11 -0700 ++++ external_levelzero/CMakeLists.txt 2022-03-29 13:22:15 -0600 @@ -81,13 +81,6 @@ if(MSVC) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /DYNAMICBASE") set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /DYNAMICBASE") @@ -14,16 +13,5 @@ index 7e27816..bd34055 100644 - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /Qspectre") - endif() endif() - + #CXX compiler support -@@ -128,7 +121,9 @@ if(MSVC) - set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE} /DEBUG /OPT:REF /OPT:ICF") - - # enable CET shadow stack -- set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /CETCOMPAT") -+ if(NOT CMAKE_SYSTEM_PROCESSOR MATCHES ARM64) -+ set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /CETCOMPAT") -+ endif() - - #Use of sccache with MSVC requires workaround of replacing /Zi with /Z7 - #https://github.com/mozilla/sccache diff --git a/build_files/build_environment/patches/openjpeg_msvc.diff b/build_files/build_environment/patches/openjpeg_msvc.diff deleted file mode 100644 index e7aa76f0faa..00000000000 --- a/build_files/build_environment/patches/openjpeg_msvc.diff +++ /dev/null @@ -1,13 +0,0 @@ -diff --git a/src/lib/openjp2/ht_dec.c b/src/lib/openjp2/ht_dec.c -index 1eb4d525..e2f3afd6 100644 ---- a/src/lib/openjp2/ht_dec.c -+++ b/src/lib/openjp2/ht_dec.c -@@ -69,7 +69,7 @@ static OPJ_BOOL only_cleanup_pass_is_decoded = OPJ_FALSE; - static INLINE - OPJ_UINT32 population_count(OPJ_UINT32 val) - { --#ifdef OPJ_COMPILER_MSVC -+#if defined(OPJ_COMPILER_MSVC) && (defined(_M_IX86) || defined(_M_AMD64)) - return (OPJ_UINT32)__popcnt(val); - #elif (defined OPJ_COMPILER_GNUC) - return (OPJ_UINT32)__builtin_popcount(val); diff --git a/build_files/build_environment/patches/pthreads.diff b/build_files/build_environment/patches/pthreads.diff index eae27bb8a45..4b6c9766e11 100644 --- a/build_files/build_environment/patches/pthreads.diff +++ b/build_files/build_environment/patches/pthreads.diff @@ -1,6 +1,6 @@ -diff -Naur pthreads4w-clean/Makefile pthreads4w-dirty/Makefile ---- pthreads4w-clean/Makefile 2022-11-18 10:08:27.266563200 +0000 -+++ pthreads4w-dirty/Makefile 2022-11-18 10:16:59.465704400 +0000 +diff -Naur orig/Makefile external_pthreads/Makefile +--- orig/Makefile 2018-08-08 04:47:40 -0600 ++++ external_pthreads/Makefile 2020-05-09 11:20:28 -0600 @@ -185,7 +185,7 @@ @ $(MAKE) /E /nologo XCFLAGS="/MTd" EHFLAGS="$(VSEFLAGSD) /D__PTW32_STATIC_LIB /D__PTW32_BUILD_INLINED" CLEANUP=__PTW32_CLEANUP_SEH pthreadVSE$(PTW32_VER_DEBUG).inlined_static_stamp @@ -10,36 +10,3 @@ diff -Naur pthreads4w-clean/Makefile pthreads4w-dirty/Makefile VC-static-debug: @ $(MAKE) /E /nologo XCFLAGS="/MTd" EHFLAGS="$(VCFLAGSD) /D__PTW32_STATIC_LIB /D__PTW32_BUILD_INLINED" CLEANUP=__PTW32_CLEANUP_C pthreadVC$(PTW32_VER_DEBUG).inlined_static_stamp -diff -Naur pthreads4w-clean/context.h pthreads4w-dirty/context.h ---- pthreads4w-clean/context.h 2022-11-18 10:08:27.564507100 +0000 -+++ pthreads4w-dirty/context.h 2022-11-18 10:13:50.209986300 +0000 -@@ -62,7 +62,7 @@ - #endif - - #if defined(_ARM_) || defined(ARM) || defined(_M_ARM) || defined(_M_ARM64) --#define PTW32_PROGCTR(Context) ((Context).Pc) -+#define __PTW32_PROGCTR(Context) ((Context).Pc) - #endif - - #if !defined (__PTW32_PROGCTR) -diff -Naur pthreads4w-clean/version.rc pthreads4w-dirty/version.rc ---- pthreads4w-clean/version.rc 2022-11-18 10:08:30.101359500 +0000 -+++ pthreads4w-dirty/version.rc 2022-11-18 10:14:44.651478200 +0000 -@@ -63,6 +63,17 @@ - # define __PTW32_VERSIONINFO_NAME "pthreadVSE2.DLL\0" - # define __PTW32_VERSIONINFO_DESCRIPTION "MS C SEH x86\0" - # endif -+# elif defined (__PTW32_ARCHARM64) -+# if defined(__PTW32_CLEANUP_C) -+# define __PTW32_VERSIONINFO_NAME "pthreadVC2.DLL\0" -+# define __PTW32_VERSIONINFO_DESCRIPTION "MS C arm64\0" -+# elif defined(__PTW32_CLEANUP_CXX) -+# define __PTW32_VERSIONINFO_NAME "pthreadVCE2.DLL\0" -+# define __PTW32_VERSIONINFO_DESCRIPTION "MS C++ arm64\0" -+# elif defined(__PTW32_CLEANUP_SEH) -+# define __PTW32_VERSIONINFO_NAME "pthreadVSE2.DLL\0" -+# define __PTW32_VERSIONINFO_DESCRIPTION "MS C SEH arm64\0" -+# endif - # endif - #elif defined(__GNUC__) - # if defined(_M_X64) diff --git a/build_files/build_environment/patches/python_windows_x64.diff b/build_files/build_environment/patches/python_windows.diff similarity index 100% rename from build_files/build_environment/patches/python_windows_x64.diff rename to build_files/build_environment/patches/python_windows.diff diff --git a/build_files/build_environment/patches/python_windows_arm64.diff b/build_files/build_environment/patches/python_windows_arm64.diff deleted file mode 100644 index feb8296fbf5..00000000000 --- a/build_files/build_environment/patches/python_windows_arm64.diff +++ /dev/null @@ -1,34 +0,0 @@ ---- a/PCbuild/prepare_ssl.bat 2022-10-30 11:48:14 -0600 -+++ b/PCbuild/prepare_ssl.bat 2022-10-30 11:53:16 -0600 -@@ -47,12 +47,13 @@ - if "%PERL%" == "" where perl > "%TEMP%\perl.loc" 2> nul && set /P PERL= <"%TEMP%\perl.loc" & del "%TEMP%\perl.loc" - if "%PERL%" == "" (echo Cannot locate perl.exe on PATH or as PERL variable & exit /b 4) - --%MSBUILD% "%PCBUILD%\openssl.vcxproj" /p:Configuration=Release /p:Platform=Win32 --if errorlevel 1 exit /b -+REM Blender: we only need x64, ssl is kind of a long build, so just build what we need -+REM %MSBUILD% "%PCBUILD%\openssl.vcxproj" /p:Configuration=Release /p:Platform=Win32 -+REM if errorlevel 1 exit /b --%MSBUILD% "%PCBUILD%\openssl.vcxproj" /p:Configuration=Release /p:Platform=x64 --if errorlevel 1 exit /b --%MSBUILD% "%PCBUILD%\openssl.vcxproj" /p:Configuration=Release /p:Platform=ARM --if errorlevel 1 exit /b -+REM %MSBUILD% "%PCBUILD%\openssl.vcxproj" /p:Configuration=Release /p:Platform=x64 -+REM if errorlevel 1 exit /b -+REM %MSBUILD% "%PCBUILD%\openssl.vcxproj" /p:Configuration=Release /p:Platform=ARM -+REM if errorlevel 1 exit /b - %MSBUILD% "%PCBUILD%\openssl.vcxproj" /p:Configuration=Release /p:Platform=ARM64 - if errorlevel 1 exit /b - -diff -aurw Python-3.10.12/PCbuild/openssl.vcxproj external_python/PCbuild/openssl.vcxproj ---- Python-3.10.12/PCbuild/openssl.vcxproj 2023-06-06 16:30:33 -0600 -+++ external_python/PCbuild/openssl.vcxproj 2023-06-20 08:50:43 -0600 -@@ -98,7 +98,7 @@ - - - -- <_Built Include="$(opensslDir)\LICENSE" /> -+ <_Built Include="$(opensslDir)\LICENSE.txt" /> - <_Built Include="$(IntDir)\libcrypto.lib;$(IntDir)\libcrypto-*.dll;$(IntDir)\libcrypto-*.pdb" /> - <_Built Include="$(IntDir)\libssl.lib;$(IntDir)\libssl-*.dll;$(IntDir)\libssl-*.pdb" /> - <_AppLink Include="$(opensslDir)\ms\applink.c" /> diff --git a/build_files/build_environment/patches/tbb.diff b/build_files/build_environment/patches/tbb.diff index dedf8225ae9..07f70aa7007 100644 --- a/build_files/build_environment/patches/tbb.diff +++ b/build_files/build_environment/patches/tbb.diff @@ -1,191 +1,16 @@ -diff --git a/include/tbb/machine/msvc_armv8.h b/include/tbb/machine/msvc_armv8.h -new file mode 100644 -index 00000000..13d56678 ---- /dev/null -+++ b/include/tbb/machine/msvc_armv8.h -@@ -0,0 +1,167 @@ -+/* -+ Copyright (c) 2005-2020 Intel Corporation -+ -+ Licensed under the Apache License, Version 2.0 (the "License"); -+ you may not use this file except in compliance with the License. -+ You may obtain a copy of the License at -+ -+ http://www.apache.org/licenses/LICENSE-2.0 -+ -+ Unless required by applicable law or agreed to in writing, software -+ distributed under the License is distributed on an "AS IS" BASIS, -+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -+ See the License for the specific language governing permissions and -+ limitations under the License. -+*/ -+ -+#if !defined(__TBB_machine_H) || defined(__TBB_msvc_armv8_H) -+#error Do not #include this internal file directly; use public TBB headers instead. -+#endif -+ -+#define __TBB_msvc_armv8_H -+ -+#include -+#include -+ -+#define __TBB_WORDSIZE 8 -+ -+#define __TBB_ENDIANNESS __TBB_ENDIAN_UNSUPPORTED -+ -+#if defined(TBB_WIN32_USE_CL_BUILTINS) -+// We can test this on _M_IX86 -+#pragma intrinsic(_ReadWriteBarrier) -+#pragma intrinsic(_mm_mfence) -+#define __TBB_compiler_fence() _ReadWriteBarrier() -+#define __TBB_full_memory_fence() _mm_mfence() -+#define __TBB_control_consistency_helper() __TBB_compiler_fence() -+#define __TBB_acquire_consistency_helper() __TBB_compiler_fence() -+#define __TBB_release_consistency_helper() __TBB_compiler_fence() -+#else -+//Now __dmb(_ARM_BARRIER_SY) is used for both compiler and memory fences -+//This might be changed later after testing -+#define __TBB_compiler_fence() __dmb(_ARM64_BARRIER_SY) -+#define __TBB_full_memory_fence() __dmb(_ARM64_BARRIER_SY) -+#define __TBB_control_consistency_helper() __TBB_compiler_fence() -+#define __TBB_acquire_consistency_helper() __TBB_full_memory_fence() -+#define __TBB_release_consistency_helper() __TBB_full_memory_fence() -+#endif -+ -+//-------------------------------------------------- -+// Compare and swap -+//-------------------------------------------------- -+ -+/** -+ * Atomic CAS for 32 bit values, if *ptr==comparand, then *ptr=value, returns *ptr -+ * @param ptr pointer to value in memory to be swapped with value if *ptr==comparand -+ * @param value value to assign *ptr to if *ptr==comparand -+ * @param comparand value to compare with *ptr -+ * @return value originally in memory at ptr, regardless of success -+*/ -+ -+#define __TBB_MACHINE_DEFINE_ATOMICS_CMPSWP(S,T,F) \ -+inline T __TBB_machine_cmpswp##S( volatile void *ptr, T value, T comparand ) { \ -+ return _InterlockedCompareExchange##F(reinterpret_cast(ptr),value,comparand); \ -+} \ -+ -+#define __TBB_MACHINE_DEFINE_ATOMICS_FETCHADD(S,T,F) \ -+inline T __TBB_machine_fetchadd##S( volatile void *ptr, T value ) { \ -+ return _InterlockedExchangeAdd##F(reinterpret_cast(ptr),value); \ -+} \ -+ -+__TBB_MACHINE_DEFINE_ATOMICS_CMPSWP(1,char,8) -+__TBB_MACHINE_DEFINE_ATOMICS_CMPSWP(2,short,16) -+__TBB_MACHINE_DEFINE_ATOMICS_CMPSWP(4,long,) -+__TBB_MACHINE_DEFINE_ATOMICS_CMPSWP(8,__int64,64) -+__TBB_MACHINE_DEFINE_ATOMICS_FETCHADD(4,long,) -+#if defined(TBB_WIN32_USE_CL_BUILTINS) -+// No _InterlockedExchangeAdd64 intrinsic on _M_IX86 -+#define __TBB_64BIT_ATOMICS 0 -+#else -+__TBB_MACHINE_DEFINE_ATOMICS_FETCHADD(8,__int64,64) -+#endif -+ -+inline void __TBB_machine_pause (int32_t delay ) -+{ -+ while(delay>0) -+ { -+ __TBB_compiler_fence(); -+ delay--; -+ } -+} -+ -+// API to retrieve/update FPU control setting -+#define __TBB_CPU_CTL_ENV_PRESENT 1 -+ -+namespace tbb { -+namespace internal { -+ -+template -+struct machine_load_store_relaxed { -+ static inline T load ( const volatile T& location ) { -+ const T value = location; -+ -+ /* -+ * An extra memory barrier is required for errata #761319 -+ * Please see http://infocenter.arm.com/help/topic/com.arm.doc.uan0004a -+ */ -+ __TBB_acquire_consistency_helper(); -+ return value; -+ } -+ -+ static inline void store ( volatile T& location, T value ) { -+ location = value; -+ } -+}; -+ -+class cpu_ctl_env { -+private: -+ unsigned int my_ctl; -+public: -+ bool operator!=( const cpu_ctl_env& ctl ) const { return my_ctl != ctl.my_ctl; } -+ void get_env() { my_ctl = _control87(0, 0); } -+ void set_env() const { _control87( my_ctl, ~0U ); } -+}; -+ -+} // namespace internal -+} // namespaces tbb -+ -+// Machine specific atomic operations -+#define __TBB_CompareAndSwap4(P,V,C) __TBB_machine_cmpswp4(P,V,C) -+#define __TBB_CompareAndSwap8(P,V,C) __TBB_machine_cmpswp8(P,V,C) -+#define __TBB_Pause(V) __TBB_machine_pause(V) -+ -+// Use generics for some things -+#define __TBB_USE_FETCHSTORE_AS_FULL_FENCED_STORE 1 -+#define __TBB_USE_GENERIC_HALF_FENCED_LOAD_STORE 1 -+#define __TBB_USE_GENERIC_PART_WORD_FETCH_ADD 1 -+#define __TBB_USE_GENERIC_PART_WORD_FETCH_STORE 1 -+#define __TBB_USE_GENERIC_FETCH_STORE 1 -+#define __TBB_USE_GENERIC_DWORD_LOAD_STORE 0 -+#define __TBB_USE_GENERIC_SEQUENTIAL_CONSISTENCY_LOAD_STORE 1 -+ -+#if defined(TBB_WIN32_USE_CL_BUILTINS) -+#if !__TBB_WIN8UI_SUPPORT -+extern "C" __declspec(dllimport) int __stdcall SwitchToThread( void ); -+#define __TBB_Yield() SwitchToThread() -+#else -+#include -+#define __TBB_Yield() std::this_thread::yield() -+#endif -+#else -+#define __TBB_Yield() __yield() -+#endif -+ -+// Machine specific atomic operations -+#define __TBB_AtomicOR(P,V) __TBB_machine_OR(P,V) -+#define __TBB_AtomicAND(P,V) __TBB_machine_AND(P,V) -+ -+template -+inline void __TBB_machine_OR( T1 *operand, T2 addend ) { -+ _InterlockedOr((long volatile *)operand, (long)addend); -+} -+ -+template -+inline void __TBB_machine_AND( T1 *operand, T2 addend ) { -+ _InterlockedAnd((long volatile *)operand, (long)addend); -+} -+ -diff --git a/include/tbb/tbb_machine.h b/include/tbb/tbb_machine.h -index 9752be58..ebb98ec2 100644 ---- a/include/tbb/tbb_machine.h -+++ b/include/tbb/tbb_machine.h -@@ -208,6 +208,8 @@ template<> struct atomic_selector<8> { - #include "machine/windows_intel64.h" - #elif defined(_M_ARM) || defined(__TBB_WIN32_USE_CL_BUILTINS) - #include "machine/msvc_armv7.h" -+ #elif defined(_M_ARM64) -+ #include "machine/msvc_armv8.h" - #endif - - #ifdef _MANAGED -diff --git a/src/tbb/tools_api/ittnotify_config.h b/src/tbb/tools_api/ittnotify_config.h -index bdb4ec29..7c363f4f 100644 +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 --- a/src/tbb/tools_api/ittnotify_config.h +++ b/src/tbb/tools_api/ittnotify_config.h @@ -162,7 +162,7 @@ @@ -193,428 +18,7 @@ index bdb4ec29..7c363f4f 100644 # elif defined _M_IA64 || defined __ia64__ # define ITT_ARCH ITT_ARCH_IA64 -# elif defined _M_ARM || defined __arm__ -+# elif defined _M_ARM || defined _M_ARM64 || defined __arm__ || defined __arm64__ ++# elif defined _M_ARM || defined __arm__ || defined __aarch64__ # define ITT_ARCH ITT_ARCH_ARM # elif defined __powerpc64__ # define ITT_ARCH ITT_ARCH_PPC64 -diff --git a/src/tbb/winarm64-tbb-export.def b/src/tbb/winarm64-tbb-export.def -new file mode 100644 -index 00000000..813eb002 ---- /dev/null -+++ b/src/tbb/winarm64-tbb-export.def -@@ -0,0 +1,21 @@ -+; Copyright (c) 2005-2020 Intel Corporation -+; Copyright (c) 2022 Linaro Ltd. -+; -+; Licensed under the Apache License, Version 2.0 (the "License"); -+; you may not use this file except in compliance with the License. -+; You may obtain a copy of the License at -+; -+; http://www.apache.org/licenses/LICENSE-2.0 -+; -+; Unless required by applicable law or agreed to in writing, software -+; distributed under the License is distributed on an "AS IS" BASIS, -+; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -+; See the License for the specific language governing permissions and -+; limitations under the License. -+ -+EXPORTS -+ -+#define __TBB_SYMBOL( sym ) sym -+#include "winarm64-tbb-export.lst" -+ -+ -diff --git a/src/tbb/winarm64-tbb-export.lst b/src/tbb/winarm64-tbb-export.lst -new file mode 100644 -index 00000000..a25d545e ---- /dev/null -+++ b/src/tbb/winarm64-tbb-export.lst -@@ -0,0 +1,310 @@ -+; Copyright (c) 2005-2020 Intel Corporation -+; -+; Licensed under the Apache License, Version 2.0 (the "License"); -+; you may not use this file except in compliance with the License. -+; You may obtain a copy of the License at -+; -+; http://www.apache.org/licenses/LICENSE-2.0 -+; -+; Unless required by applicable law or agreed to in writing, software -+; distributed under the License is distributed on an "AS IS" BASIS, -+; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -+; See the License for the specific language governing permissions and -+; limitations under the License. -+ -+#include "tbb/tbb_config.h" -+ -+// cache_aligned_allocator.cpp -+__TBB_SYMBOL( ?NFS_Allocate@internal@tbb@@YAPEAX_K0PEAX@Z ) -+__TBB_SYMBOL( ?NFS_GetLineSize@internal@tbb@@YA_KXZ ) -+__TBB_SYMBOL( ?NFS_Free@internal@tbb@@YAXPEAX@Z ) -+__TBB_SYMBOL( ?allocate_via_handler_v3@internal@tbb@@YAPEAX_K@Z ) -+__TBB_SYMBOL( ?deallocate_via_handler_v3@internal@tbb@@YAXPEAX@Z ) -+__TBB_SYMBOL( ?is_malloc_used_v3@internal@tbb@@YA_NXZ ) -+ -+// task.cpp v3 -+__TBB_SYMBOL( ?allocate@allocate_additional_child_of_proxy@internal@tbb@@QEBAAEAVtask@3@_K@Z ) -+__TBB_SYMBOL( ?allocate@allocate_child_proxy@internal@tbb@@QEBAAEAVtask@3@_K@Z ) -+__TBB_SYMBOL( ?allocate@allocate_continuation_proxy@internal@tbb@@QEBAAEAVtask@3@_K@Z ) -+__TBB_SYMBOL( ?allocate@allocate_root_proxy@internal@tbb@@SAAEAVtask@3@_K@Z ) -+__TBB_SYMBOL( ?destroy@task_base@internal@interface5@tbb@@SAXAEAVtask@4@@Z ) -+__TBB_SYMBOL( ?free@allocate_additional_child_of_proxy@internal@tbb@@QEBAXAEAVtask@3@@Z ) -+__TBB_SYMBOL( ?free@allocate_child_proxy@internal@tbb@@QEBAXAEAVtask@3@@Z ) -+__TBB_SYMBOL( ?free@allocate_continuation_proxy@internal@tbb@@QEBAXAEAVtask@3@@Z ) -+__TBB_SYMBOL( ?free@allocate_root_proxy@internal@tbb@@SAXAEAVtask@3@@Z ) -+__TBB_SYMBOL( ?internal_set_ref_count@task@tbb@@AEAAXH@Z ) -+__TBB_SYMBOL( ?internal_decrement_ref_count@task@tbb@@AEAA_JXZ ) -+__TBB_SYMBOL( ?is_owned_by_current_thread@task@tbb@@QEBA_NXZ ) -+__TBB_SYMBOL( ?note_affinity@task@tbb@@UEAAXG@Z ) -+__TBB_SYMBOL( ?resize@affinity_partitioner_base_v3@internal@tbb@@AEAAXI@Z ) -+__TBB_SYMBOL( ?self@task@tbb@@SAAEAV12@XZ ) -+__TBB_SYMBOL( ?spawn_and_wait_for_all@task@tbb@@QEAAXAEAVtask_list@2@@Z ) -+__TBB_SYMBOL( ?default_num_threads@task_scheduler_init@tbb@@SAHXZ ) -+__TBB_SYMBOL( ?initialize@task_scheduler_init@tbb@@QEAAXH_K@Z ) -+__TBB_SYMBOL( ?initialize@task_scheduler_init@tbb@@QEAAXH@Z ) -+__TBB_SYMBOL( ?terminate@task_scheduler_init@tbb@@QEAAXXZ ) -+#if __TBB_SCHEDULER_OBSERVER -+__TBB_SYMBOL( ?observe@task_scheduler_observer_v3@internal@tbb@@QEAAX_N@Z ) -+#endif /* __TBB_SCHEDULER_OBSERVER */ -+ -+/* arena.cpp */ -+__TBB_SYMBOL( ?internal_max_concurrency@task_arena_base@internal@interface7@tbb@@KAHPEBVtask_arena@34@@Z ) -+__TBB_SYMBOL( ?internal_current_slot@task_arena_base@internal@interface7@tbb@@KAHXZ ) -+__TBB_SYMBOL( ?internal_initialize@task_arena_base@internal@interface7@tbb@@IEAAXXZ ) -+__TBB_SYMBOL( ?internal_terminate@task_arena_base@internal@interface7@tbb@@IEAAXXZ ) -+__TBB_SYMBOL( ?internal_attach@task_arena_base@internal@interface7@tbb@@IEAAXXZ ) -+__TBB_SYMBOL( ?internal_enqueue@task_arena_base@internal@interface7@tbb@@IEBAXAEAVtask@4@_J@Z ) -+__TBB_SYMBOL( ?internal_execute@task_arena_base@internal@interface7@tbb@@IEBAXAEAVdelegate_base@234@@Z ) -+__TBB_SYMBOL( ?internal_wait@task_arena_base@internal@interface7@tbb@@IEBAXXZ ) -+#if __TBB_TASK_ISOLATION -+__TBB_SYMBOL( ?isolate_within_arena@internal@interface7@tbb@@YAXAEAVdelegate_base@123@_J@Z ) -+#endif /* __TBB_TASK_ISOLATION */ -+ -+#if !TBB_NO_LEGACY -+// task_v2.cpp -+__TBB_SYMBOL( ?destroy@task@tbb@@QEAAXAEAV12@@Z ) -+#endif -+ -+// exception handling support -+#if __TBB_TASK_GROUP_CONTEXT -+__TBB_SYMBOL( ?allocate@allocate_root_with_context_proxy@internal@tbb@@QEBAAEAVtask@3@_K@Z ) -+__TBB_SYMBOL( ?free@allocate_root_with_context_proxy@internal@tbb@@QEBAXAEAVtask@3@@Z ) -+__TBB_SYMBOL( ?change_group@task@tbb@@QEAAXAEAVtask_group_context@2@@Z ) -+__TBB_SYMBOL( ?is_group_execution_cancelled@task_group_context@tbb@@QEBA_NXZ ) -+__TBB_SYMBOL( ?cancel_group_execution@task_group_context@tbb@@QEAA_NXZ ) -+__TBB_SYMBOL( ?reset@task_group_context@tbb@@QEAAXXZ ) -+__TBB_SYMBOL( ?capture_fp_settings@task_group_context@tbb@@QEAAXXZ ) -+__TBB_SYMBOL( ?init@task_group_context@tbb@@IEAAXXZ ) -+__TBB_SYMBOL( ?register_pending_exception@task_group_context@tbb@@QEAAXXZ ) -+__TBB_SYMBOL( ??1task_group_context@tbb@@QEAA@XZ ) -+#if __TBB_TASK_PRIORITY -+__TBB_SYMBOL( ?set_priority@task_group_context@tbb@@QEAAXW4priority_t@2@@Z ) -+__TBB_SYMBOL( ?priority@task_group_context@tbb@@QEBA?AW4priority_t@2@XZ ) -+#endif /* __TBB_TASK_PRIORITY */ -+__TBB_SYMBOL( ?name@captured_exception@tbb@@UEBAPEBDXZ ) -+__TBB_SYMBOL( ?what@captured_exception@tbb@@UEBAPEBDXZ ) -+__TBB_SYMBOL( ??1captured_exception@tbb@@UEAA@XZ ) -+__TBB_SYMBOL( ?move@captured_exception@tbb@@UEAAPEAV12@XZ ) -+__TBB_SYMBOL( ?destroy@captured_exception@tbb@@UEAAXXZ ) -+__TBB_SYMBOL( ?set@captured_exception@tbb@@QEAAXPEBD0@Z ) -+__TBB_SYMBOL( ?clear@captured_exception@tbb@@QEAAXXZ ) -+#endif /* __TBB_TASK_GROUP_CONTEXT */ -+ -+// Symbols for exceptions thrown from TBB -+__TBB_SYMBOL( ?throw_bad_last_alloc_exception_v4@internal@tbb@@YAXXZ ) -+__TBB_SYMBOL( ?throw_exception_v4@internal@tbb@@YAXW4exception_id@12@@Z ) -+__TBB_SYMBOL( ?what@bad_last_alloc@tbb@@UEBAPEBDXZ ) -+__TBB_SYMBOL( ?what@missing_wait@tbb@@UEBAPEBDXZ ) -+__TBB_SYMBOL( ?what@invalid_multiple_scheduling@tbb@@UEBAPEBDXZ ) -+__TBB_SYMBOL( ?what@improper_lock@tbb@@UEBAPEBDXZ ) -+__TBB_SYMBOL( ?what@user_abort@tbb@@UEBAPEBDXZ ) -+ -+// tbb_misc.cpp -+__TBB_SYMBOL( ?assertion_failure@tbb@@YAXPEBDH00@Z ) -+__TBB_SYMBOL( ?get_initial_auto_partitioner_divisor@internal@tbb@@YA_KXZ ) -+__TBB_SYMBOL( ?handle_perror@internal@tbb@@YAXHPEBD@Z ) -+__TBB_SYMBOL( ?set_assertion_handler@tbb@@YAP6AXPEBDH00@ZP6AX0H00@Z@Z ) -+__TBB_SYMBOL( ?runtime_warning@internal@tbb@@YAXPEBDZZ ) -+__TBB_SYMBOL( TBB_runtime_interface_version ) -+ -+// tbb_main.cpp -+__TBB_SYMBOL( ?itt_load_pointer_with_acquire_v3@internal@tbb@@YAPEAXPEBX@Z ) -+__TBB_SYMBOL( ?itt_store_pointer_with_release_v3@internal@tbb@@YAXPEAX0@Z ) -+__TBB_SYMBOL( ?call_itt_notify_v5@internal@tbb@@YAXHPEAX@Z ) -+__TBB_SYMBOL( ?itt_set_sync_name_v3@internal@tbb@@YAXPEAXPEB_W@Z ) -+__TBB_SYMBOL( ?itt_load_pointer_v3@internal@tbb@@YAPEAXPEBX@Z ) -+__TBB_SYMBOL( ?itt_make_task_group_v7@internal@tbb@@YAXW4itt_domain_enum@12@PEAX_K12W4string_index@12@@Z ) -+__TBB_SYMBOL( ?itt_metadata_str_add_v7@internal@tbb@@YAXW4itt_domain_enum@12@PEAX_KW4string_index@12@PEBD@Z ) -+__TBB_SYMBOL( ?itt_relation_add_v7@internal@tbb@@YAXW4itt_domain_enum@12@PEAX_KW4itt_relation@12@12@Z ) -+__TBB_SYMBOL( ?itt_task_begin_v7@internal@tbb@@YAXW4itt_domain_enum@12@PEAX_K12W4string_index@12@@Z ) -+__TBB_SYMBOL( ?itt_task_end_v7@internal@tbb@@YAXW4itt_domain_enum@12@@Z ) -+__TBB_SYMBOL( ?itt_region_begin_v9@internal@tbb@@YAXW4itt_domain_enum@12@PEAX_K12W4string_index@12@@Z ) -+__TBB_SYMBOL( ?itt_region_end_v9@internal@tbb@@YAXW4itt_domain_enum@12@PEAX_K@Z ) -+ -+ -+// pipeline.cpp -+__TBB_SYMBOL( ??0pipeline@tbb@@QEAA@XZ ) -+__TBB_SYMBOL( ??1filter@tbb@@UEAA@XZ ) -+__TBB_SYMBOL( ??1pipeline@tbb@@UEAA@XZ ) -+__TBB_SYMBOL( ??_7pipeline@tbb@@6B@ ) -+__TBB_SYMBOL( ?add_filter@pipeline@tbb@@QEAAXAEAVfilter@2@@Z ) -+__TBB_SYMBOL( ?clear@pipeline@tbb@@QEAAXXZ ) -+__TBB_SYMBOL( ?inject_token@pipeline@tbb@@AEAAXAEAVtask@2@@Z ) -+__TBB_SYMBOL( ?run@pipeline@tbb@@QEAAX_K@Z ) -+#if __TBB_TASK_GROUP_CONTEXT -+__TBB_SYMBOL( ?run@pipeline@tbb@@QEAAX_KAEAVtask_group_context@2@@Z ) -+#endif -+__TBB_SYMBOL( ?process_item@thread_bound_filter@tbb@@QEAA?AW4result_type@12@XZ ) -+__TBB_SYMBOL( ?try_process_item@thread_bound_filter@tbb@@QEAA?AW4result_type@12@XZ ) -+__TBB_SYMBOL( ?set_end_of_input@filter@tbb@@IEAAXXZ ) -+ -+// queuing_rw_mutex.cpp -+__TBB_SYMBOL( ?internal_construct@queuing_rw_mutex@tbb@@QEAAXXZ ) -+__TBB_SYMBOL( ?acquire@scoped_lock@queuing_rw_mutex@tbb@@QEAAXAEAV23@_N@Z ) -+__TBB_SYMBOL( ?downgrade_to_reader@scoped_lock@queuing_rw_mutex@tbb@@QEAA_NXZ ) -+__TBB_SYMBOL( ?release@scoped_lock@queuing_rw_mutex@tbb@@QEAAXXZ ) -+__TBB_SYMBOL( ?upgrade_to_writer@scoped_lock@queuing_rw_mutex@tbb@@QEAA_NXZ ) -+__TBB_SYMBOL( ?try_acquire@scoped_lock@queuing_rw_mutex@tbb@@QEAA_NAEAV23@_N@Z ) -+ -+// reader_writer_lock.cpp -+__TBB_SYMBOL( ?try_lock_read@reader_writer_lock@interface5@tbb@@QEAA_NXZ ) -+__TBB_SYMBOL( ?try_lock@reader_writer_lock@interface5@tbb@@QEAA_NXZ ) -+__TBB_SYMBOL( ?unlock@reader_writer_lock@interface5@tbb@@QEAAXXZ ) -+__TBB_SYMBOL( ?lock_read@reader_writer_lock@interface5@tbb@@QEAAXXZ ) -+__TBB_SYMBOL( ?lock@reader_writer_lock@interface5@tbb@@QEAAXXZ ) -+__TBB_SYMBOL( ?internal_construct@reader_writer_lock@interface5@tbb@@AEAAXXZ ) -+__TBB_SYMBOL( ?internal_destroy@reader_writer_lock@interface5@tbb@@AEAAXXZ ) -+__TBB_SYMBOL( ?internal_construct@scoped_lock@reader_writer_lock@interface5@tbb@@AEAAXAEAV234@@Z ) -+__TBB_SYMBOL( ?internal_destroy@scoped_lock@reader_writer_lock@interface5@tbb@@AEAAXXZ ) -+__TBB_SYMBOL( ?internal_construct@scoped_lock_read@reader_writer_lock@interface5@tbb@@AEAAXAEAV234@@Z ) -+__TBB_SYMBOL( ?internal_destroy@scoped_lock_read@reader_writer_lock@interface5@tbb@@AEAAXXZ ) -+ -+#if !TBB_NO_LEGACY -+// spin_rw_mutex.cpp v2 -+__TBB_SYMBOL( ?internal_acquire_reader@spin_rw_mutex@tbb@@CAXPEAV12@@Z ) -+__TBB_SYMBOL( ?internal_acquire_writer@spin_rw_mutex@tbb@@CA_NPEAV12@@Z ) -+__TBB_SYMBOL( ?internal_downgrade@spin_rw_mutex@tbb@@CAXPEAV12@@Z ) -+__TBB_SYMBOL( ?internal_itt_releasing@spin_rw_mutex@tbb@@CAXPEAV12@@Z ) -+__TBB_SYMBOL( ?internal_release_reader@spin_rw_mutex@tbb@@CAXPEAV12@@Z ) -+__TBB_SYMBOL( ?internal_release_writer@spin_rw_mutex@tbb@@CAXPEAV12@@Z ) -+__TBB_SYMBOL( ?internal_upgrade@spin_rw_mutex@tbb@@CA_NPEAV12@@Z ) -+__TBB_SYMBOL( ?internal_try_acquire_writer@spin_rw_mutex@tbb@@CA_NPEAV12@@Z ) -+__TBB_SYMBOL( ?internal_try_acquire_reader@spin_rw_mutex@tbb@@CA_NPEAV12@@Z ) -+#endif -+ -+// spin_rw_mutex v3 -+__TBB_SYMBOL( ?internal_construct@spin_rw_mutex_v3@tbb@@AEAAXXZ ) -+__TBB_SYMBOL( ?internal_upgrade@spin_rw_mutex_v3@tbb@@AEAA_NXZ ) -+__TBB_SYMBOL( ?internal_downgrade@spin_rw_mutex_v3@tbb@@AEAAXXZ ) -+__TBB_SYMBOL( ?internal_acquire_reader@spin_rw_mutex_v3@tbb@@AEAAXXZ ) -+__TBB_SYMBOL( ?internal_acquire_writer@spin_rw_mutex_v3@tbb@@AEAA_NXZ ) -+__TBB_SYMBOL( ?internal_release_reader@spin_rw_mutex_v3@tbb@@AEAAXXZ ) -+__TBB_SYMBOL( ?internal_release_writer@spin_rw_mutex_v3@tbb@@AEAAXXZ ) -+__TBB_SYMBOL( ?internal_try_acquire_reader@spin_rw_mutex_v3@tbb@@AEAA_NXZ ) -+__TBB_SYMBOL( ?internal_try_acquire_writer@spin_rw_mutex_v3@tbb@@AEAA_NXZ ) -+ -+// spin_mutex.cpp -+__TBB_SYMBOL( ?internal_construct@spin_mutex@tbb@@QEAAXXZ ) -+__TBB_SYMBOL( ?internal_acquire@scoped_lock@spin_mutex@tbb@@AEAAXAEAV23@@Z ) -+__TBB_SYMBOL( ?internal_release@scoped_lock@spin_mutex@tbb@@AEAAXXZ ) -+__TBB_SYMBOL( ?internal_try_acquire@scoped_lock@spin_mutex@tbb@@AEAA_NAEAV23@@Z ) -+ -+// mutex.cpp -+__TBB_SYMBOL( ?internal_acquire@scoped_lock@mutex@tbb@@AEAAXAEAV23@@Z ) -+__TBB_SYMBOL( ?internal_release@scoped_lock@mutex@tbb@@AEAAXXZ ) -+__TBB_SYMBOL( ?internal_try_acquire@scoped_lock@mutex@tbb@@AEAA_NAEAV23@@Z ) -+__TBB_SYMBOL( ?internal_construct@mutex@tbb@@AEAAXXZ ) -+__TBB_SYMBOL( ?internal_destroy@mutex@tbb@@AEAAXXZ ) -+ -+// recursive_mutex.cpp -+__TBB_SYMBOL( ?internal_acquire@scoped_lock@recursive_mutex@tbb@@AEAAXAEAV23@@Z ) -+__TBB_SYMBOL( ?internal_release@scoped_lock@recursive_mutex@tbb@@AEAAXXZ ) -+__TBB_SYMBOL( ?internal_try_acquire@scoped_lock@recursive_mutex@tbb@@AEAA_NAEAV23@@Z ) -+__TBB_SYMBOL( ?internal_construct@recursive_mutex@tbb@@AEAAXXZ ) -+__TBB_SYMBOL( ?internal_destroy@recursive_mutex@tbb@@AEAAXXZ ) -+ -+// queuing_mutex.cpp -+__TBB_SYMBOL( ?internal_construct@queuing_mutex@tbb@@QEAAXXZ ) -+__TBB_SYMBOL( ?acquire@scoped_lock@queuing_mutex@tbb@@QEAAXAEAV23@@Z ) -+__TBB_SYMBOL( ?release@scoped_lock@queuing_mutex@tbb@@QEAAXXZ ) -+__TBB_SYMBOL( ?try_acquire@scoped_lock@queuing_mutex@tbb@@QEAA_NAEAV23@@Z ) -+ -+// critical_section.cpp -+__TBB_SYMBOL( ?internal_construct@critical_section_v4@internal@tbb@@QEAAXXZ ) -+ -+#if !TBB_NO_LEGACY -+// concurrent_hash_map.cpp -+__TBB_SYMBOL( ?internal_grow_predicate@hash_map_segment_base@internal@tbb@@QEBA_NXZ ) -+ -+// concurrent_queue.cpp v2 -+__TBB_SYMBOL( ?advance@concurrent_queue_iterator_base@internal@tbb@@IEAAXXZ ) -+__TBB_SYMBOL( ?assign@concurrent_queue_iterator_base@internal@tbb@@IEAAXAEBV123@@Z ) -+__TBB_SYMBOL( ?internal_size@concurrent_queue_base@internal@tbb@@IEBA_JXZ ) -+__TBB_SYMBOL( ??0concurrent_queue_base@internal@tbb@@IEAA@_K@Z ) -+__TBB_SYMBOL( ??0concurrent_queue_iterator_base@internal@tbb@@IEAA@AEBVconcurrent_queue_base@12@@Z ) -+__TBB_SYMBOL( ??1concurrent_queue_base@internal@tbb@@MEAA@XZ ) -+__TBB_SYMBOL( ??1concurrent_queue_iterator_base@internal@tbb@@IEAA@XZ ) -+__TBB_SYMBOL( ?internal_pop@concurrent_queue_base@internal@tbb@@IEAAXPEAX@Z ) -+__TBB_SYMBOL( ?internal_pop_if_present@concurrent_queue_base@internal@tbb@@IEAA_NPEAX@Z ) -+__TBB_SYMBOL( ?internal_push@concurrent_queue_base@internal@tbb@@IEAAXPEBX@Z ) -+__TBB_SYMBOL( ?internal_push_if_not_full@concurrent_queue_base@internal@tbb@@IEAA_NPEBX@Z ) -+__TBB_SYMBOL( ?internal_set_capacity@concurrent_queue_base@internal@tbb@@IEAAX_J_K@Z ) -+#endif -+ -+// concurrent_queue v3 -+__TBB_SYMBOL( ??1concurrent_queue_iterator_base_v3@internal@tbb@@IEAA@XZ ) -+__TBB_SYMBOL( ??0concurrent_queue_iterator_base_v3@internal@tbb@@IEAA@AEBVconcurrent_queue_base_v3@12@@Z ) -+__TBB_SYMBOL( ??0concurrent_queue_iterator_base_v3@internal@tbb@@IEAA@AEBVconcurrent_queue_base_v3@12@_K@Z ) -+__TBB_SYMBOL( ?advance@concurrent_queue_iterator_base_v3@internal@tbb@@IEAAXXZ ) -+__TBB_SYMBOL( ?assign@concurrent_queue_iterator_base_v3@internal@tbb@@IEAAXAEBV123@@Z ) -+__TBB_SYMBOL( ??0concurrent_queue_base_v3@internal@tbb@@IEAA@_K@Z ) -+__TBB_SYMBOL( ??1concurrent_queue_base_v3@internal@tbb@@MEAA@XZ ) -+__TBB_SYMBOL( ?internal_pop@concurrent_queue_base_v3@internal@tbb@@IEAAXPEAX@Z ) -+__TBB_SYMBOL( ?internal_pop_if_present@concurrent_queue_base_v3@internal@tbb@@IEAA_NPEAX@Z ) -+__TBB_SYMBOL( ?internal_abort@concurrent_queue_base_v3@internal@tbb@@IEAAXXZ ) -+__TBB_SYMBOL( ?internal_push@concurrent_queue_base_v3@internal@tbb@@IEAAXPEBX@Z ) -+__TBB_SYMBOL( ?internal_push_move@concurrent_queue_base_v8@internal@tbb@@IEAAXPEBX@Z ) -+__TBB_SYMBOL( ?internal_push_if_not_full@concurrent_queue_base_v3@internal@tbb@@IEAA_NPEBX@Z ) -+__TBB_SYMBOL( ?internal_push_move_if_not_full@concurrent_queue_base_v8@internal@tbb@@IEAA_NPEBX@Z ) -+__TBB_SYMBOL( ?internal_size@concurrent_queue_base_v3@internal@tbb@@IEBA_JXZ ) -+__TBB_SYMBOL( ?internal_empty@concurrent_queue_base_v3@internal@tbb@@IEBA_NXZ ) -+__TBB_SYMBOL( ?internal_set_capacity@concurrent_queue_base_v3@internal@tbb@@IEAAX_J_K@Z ) -+__TBB_SYMBOL( ?internal_finish_clear@concurrent_queue_base_v3@internal@tbb@@IEAAXXZ ) -+__TBB_SYMBOL( ?internal_throw_exception@concurrent_queue_base_v3@internal@tbb@@IEBAXXZ ) -+__TBB_SYMBOL( ?assign@concurrent_queue_base_v3@internal@tbb@@IEAAXAEBV123@@Z ) -+__TBB_SYMBOL( ?move_content@concurrent_queue_base_v8@internal@tbb@@IEAAXAEAV123@@Z ) -+ -+#if !TBB_NO_LEGACY -+// concurrent_vector.cpp v2 -+__TBB_SYMBOL( ?internal_assign@concurrent_vector_base@internal@tbb@@IEAAXAEBV123@_KP6AXPEAX1@ZP6AX2PEBX1@Z5@Z ) -+__TBB_SYMBOL( ?internal_capacity@concurrent_vector_base@internal@tbb@@IEBA_KXZ ) -+__TBB_SYMBOL( ?internal_clear@concurrent_vector_base@internal@tbb@@IEAAXP6AXPEAX_K@Z_N@Z ) -+__TBB_SYMBOL( ?internal_copy@concurrent_vector_base@internal@tbb@@IEAAXAEBV123@_KP6AXPEAXPEBX1@Z@Z ) -+__TBB_SYMBOL( ?internal_grow_by@concurrent_vector_base@internal@tbb@@IEAA_K_K0P6AXPEAX0@Z@Z ) -+__TBB_SYMBOL( ?internal_grow_to_at_least@concurrent_vector_base@internal@tbb@@IEAAX_K0P6AXPEAX0@Z@Z ) -+__TBB_SYMBOL( ?internal_push_back@concurrent_vector_base@internal@tbb@@IEAAPEAX_KAEA_K@Z ) -+__TBB_SYMBOL( ?internal_reserve@concurrent_vector_base@internal@tbb@@IEAAX_K00@Z ) -+#endif -+ -+// concurrent_vector v3 -+__TBB_SYMBOL( ??1concurrent_vector_base_v3@internal@tbb@@IEAA@XZ ) -+__TBB_SYMBOL( ?internal_assign@concurrent_vector_base_v3@internal@tbb@@IEAAXAEBV123@_KP6AXPEAX1@ZP6AX2PEBX1@Z5@Z ) -+__TBB_SYMBOL( ?internal_capacity@concurrent_vector_base_v3@internal@tbb@@IEBA_KXZ ) -+__TBB_SYMBOL( ?internal_clear@concurrent_vector_base_v3@internal@tbb@@IEAA_KP6AXPEAX_K@Z@Z ) -+__TBB_SYMBOL( ?internal_copy@concurrent_vector_base_v3@internal@tbb@@IEAAXAEBV123@_KP6AXPEAXPEBX1@Z@Z ) -+__TBB_SYMBOL( ?internal_grow_by@concurrent_vector_base_v3@internal@tbb@@IEAA_K_K0P6AXPEAXPEBX0@Z2@Z ) -+__TBB_SYMBOL( ?internal_grow_to_at_least@concurrent_vector_base_v3@internal@tbb@@IEAAX_K0P6AXPEAXPEBX0@Z2@Z ) -+__TBB_SYMBOL( ?internal_push_back@concurrent_vector_base_v3@internal@tbb@@IEAAPEAX_KAEA_K@Z ) -+__TBB_SYMBOL( ?internal_reserve@concurrent_vector_base_v3@internal@tbb@@IEAAX_K00@Z ) -+__TBB_SYMBOL( ?internal_compact@concurrent_vector_base_v3@internal@tbb@@IEAAPEAX_KPEAXP6AX10@ZP6AX1PEBX0@Z@Z ) -+__TBB_SYMBOL( ?internal_swap@concurrent_vector_base_v3@internal@tbb@@IEAAXAEAV123@@Z ) -+__TBB_SYMBOL( ?internal_throw_exception@concurrent_vector_base_v3@internal@tbb@@IEBAX_K@Z ) -+__TBB_SYMBOL( ?internal_resize@concurrent_vector_base_v3@internal@tbb@@IEAAX_K00PEBXP6AXPEAX0@ZP6AX210@Z@Z ) -+__TBB_SYMBOL( ?internal_grow_to_at_least_with_result@concurrent_vector_base_v3@internal@tbb@@IEAA_K_K0P6AXPEAXPEBX0@Z2@Z ) -+ -+// tbb_thread -+__TBB_SYMBOL( ?join@tbb_thread_v3@internal@tbb@@QEAAXXZ ) -+__TBB_SYMBOL( ?detach@tbb_thread_v3@internal@tbb@@QEAAXXZ ) -+__TBB_SYMBOL( ?internal_start@tbb_thread_v3@internal@tbb@@AEAAXP6AIPEAX@Z0@Z ) -+__TBB_SYMBOL( ?allocate_closure_v3@internal@tbb@@YAPEAX_K@Z ) -+__TBB_SYMBOL( ?free_closure_v3@internal@tbb@@YAXPEAX@Z ) -+__TBB_SYMBOL( ?hardware_concurrency@tbb_thread_v3@internal@tbb@@SAIXZ ) -+__TBB_SYMBOL( ?thread_yield_v3@internal@tbb@@YAXXZ ) -+__TBB_SYMBOL( ?thread_sleep_v3@internal@tbb@@YAXAEBVinterval_t@tick_count@2@@Z ) -+__TBB_SYMBOL( ?move_v3@internal@tbb@@YAXAEAVtbb_thread_v3@12@0@Z ) -+__TBB_SYMBOL( ?thread_get_id_v3@internal@tbb@@YA?AVid@tbb_thread_v3@12@XZ ) -+ -+// condition_variable -+__TBB_SYMBOL( ?internal_initialize_condition_variable@internal@interface5@tbb@@YAXAEATcondvar_impl_t@123@@Z ) -+__TBB_SYMBOL( ?internal_condition_variable_wait@internal@interface5@tbb@@YA_NAEATcondvar_impl_t@123@PEAVmutex@3@PEBVinterval_t@tick_count@3@@Z ) -+__TBB_SYMBOL( ?internal_condition_variable_notify_one@internal@interface5@tbb@@YAXAEATcondvar_impl_t@123@@Z ) -+__TBB_SYMBOL( ?internal_condition_variable_notify_all@internal@interface5@tbb@@YAXAEATcondvar_impl_t@123@@Z ) -+__TBB_SYMBOL( ?internal_destroy_condition_variable@internal@interface5@tbb@@YAXAEATcondvar_impl_t@123@@Z ) -+ -+ -+// global parameter -+__TBB_SYMBOL( ?active_value@global_control@interface9@tbb@@CA_KH@Z ) -+__TBB_SYMBOL( ?internal_create@global_control@interface9@tbb@@AEAAXXZ ) -+__TBB_SYMBOL( ?internal_destroy@global_control@interface9@tbb@@AEAAXXZ ) -+ -+#undef __TBB_SYMBOL -diff --git a/src/tbbmalloc/TypeDefinitions.h b/src/tbbmalloc/TypeDefinitions.h -index aa6763b0..fffef73d 100644 ---- a/src/tbbmalloc/TypeDefinitions.h -+++ b/src/tbbmalloc/TypeDefinitions.h -@@ -25,7 +25,7 @@ - # define __ARCH_ipf 1 - # elif defined(_M_IX86)||defined(__i386__) // the latter for MinGW support - # define __ARCH_x86_32 1 --# elif defined(_M_ARM) -+# elif defined(_M_ARM)||defined(_M_ARM64) - # define __ARCH_other 1 - # else - # error Unknown processor architecture for Windows -diff --git a/src/tbbmalloc/winarm64-tbbmalloc-export.def b/src/tbbmalloc/winarm64-tbbmalloc-export.def -new file mode 100644 -index 00000000..ec64b015 ---- /dev/null -+++ b/src/tbbmalloc/winarm64-tbbmalloc-export.def -@@ -0,0 +1,46 @@ -+; Copyright (c) 2005-2020 Intel Corporation -+; Copyright (c) 2022 Linaro Ltd -+; -+; Licensed under the Apache License, Version 2.0 (the "License"); -+; you may not use this file except in compliance with the License. -+; You may obtain a copy of the License at -+; -+; http://www.apache.org/licenses/LICENSE-2.0 -+; -+; Unless required by applicable law or agreed to in writing, software -+; distributed under the License is distributed on an "AS IS" BASIS, -+; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -+; See the License for the specific language governing permissions and -+; limitations under the License. -+ -+EXPORTS -+ -+; frontend.cpp -+scalable_calloc -+scalable_free -+scalable_malloc -+scalable_realloc -+scalable_posix_memalign -+scalable_aligned_malloc -+scalable_aligned_realloc -+scalable_aligned_free -+scalable_msize -+scalable_allocation_mode -+scalable_allocation_command -+__TBB_malloc_safer_free -+__TBB_malloc_safer_realloc -+__TBB_malloc_safer_msize -+__TBB_malloc_safer_aligned_msize -+__TBB_malloc_safer_aligned_realloc -+?pool_create@rml@@YAPEAVMemoryPool@1@_JPEBUMemPoolPolicy@1@@Z -+?pool_create_v1@rml@@YA?AW4MemPoolError@1@_JPEBUMemPoolPolicy@1@PEAPEAVMemoryPool@1@@Z -+?pool_destroy@rml@@YA_NPEAVMemoryPool@1@@Z -+?pool_malloc@rml@@YAPEAXPEAVMemoryPool@1@_K@Z -+?pool_free@rml@@YA_NPEAVMemoryPool@1@PEAX@Z -+?pool_reset@rml@@YA_NPEAVMemoryPool@1@@Z -+?pool_realloc@rml@@YAPEAXPEAVMemoryPool@1@PEAX_K@Z -+?pool_aligned_realloc@rml@@YAPEAXPEAVMemoryPool@1@PEAX_K2@Z -+?pool_aligned_malloc@rml@@YAPEAXPEAVMemoryPool@1@_K1@Z -+?pool_identify@rml@@YAPEAVMemoryPool@1@PEAX@Z -+?pool_msize@rml@@YA_KPEAVMemoryPool@1@PEAX@Z -+ -diff --git a/src/test/harness_fp.h b/src/test/harness_fp.h -index b007e2b8..f6d0066e 100644 ---- a/src/test/harness_fp.h -+++ b/src/test/harness_fp.h -@@ -84,7 +84,7 @@ inline void SetSseMode ( int mode ) { - ctl.set_env(); - } - --#elif defined(_M_ARM) || defined(__TBB_WIN32_USE_CL_BUILTINS) -+#elif defined(_M_ARM) || defined(_M_ARM64) || defined(__TBB_WIN32_USE_CL_BUILTINS) - const int NumSseModes = 1; - const int SseModes[NumSseModes] = { 0 }; - diff --git a/build_files/build_environment/patches/usd.diff b/build_files/build_environment/patches/usd.diff index 23607839cdf..976e58a2e80 100644 --- a/build_files/build_environment/patches/usd.diff +++ b/build_files/build_environment/patches/usd.diff @@ -1,9 +1,8 @@ -diff --git a/cmake/defaults/Packages.cmake b/cmake/defaults/Packages.cmake -index 2bb1f30d0..adcc7422e 100644 ---- a/cmake/defaults/Packages.cmake -+++ b/cmake/defaults/Packages.cmake -@@ -152,7 +152,7 @@ endif() - +diff -Naur orig/cmake/defaults/Packages.cmake external_usd/cmake/defaults/Packages.cmake +--- orig/cmake/defaults/Packages.cmake 2022-10-27 12:56:33 -0600 ++++ external_usd/cmake/defaults/Packages.cmake 2022-10-27 13:05:08 -0600 +@@ -129,7 +129,7 @@ + endif() # --TBB -find_package(TBB REQUIRED COMPONENTS tbb) @@ -11,11 +10,10 @@ index 2bb1f30d0..adcc7422e 100644 add_definitions(${TBB_DEFINITIONS}) # --math -diff --git a/cmake/defaults/msvcdefaults.cmake b/cmake/defaults/msvcdefaults.cmake -index 0f7fb7ef6..a467341ed 100644 ---- a/cmake/defaults/msvcdefaults.cmake -+++ b/cmake/defaults/msvcdefaults.cmake -@@ -140,9 +140,6 @@ _add_define("WIN32_LEAN_AND_MEAN") +diff -Naur orig/cmake/defaults/msvcdefaults.cmake external_usd/cmake/defaults/msvcdefaults.cmake +--- orig/cmake/defaults/msvcdefaults.cmake 2022-10-27 12:56:33 -0600 ++++ external_usd/cmake/defaults/msvcdefaults.cmake 2022-10-27 13:05:08 -0600 +@@ -120,9 +120,6 @@ # for all translation units. set(_PXR_CXX_FLAGS "${_PXR_CXX_FLAGS} /bigobj") @@ -25,49 +23,10 @@ index 0f7fb7ef6..a467341ed 100644 # Enable multiprocessor builds. set(_PXR_CXX_FLAGS "${_PXR_CXX_FLAGS} /MP") set(_PXR_CXX_FLAGS "${_PXR_CXX_FLAGS} /Gm-") -diff --git a/pxr/base/arch/defines.h b/pxr/base/arch/defines.h -index cb6ad44c5..c6c1a604b 100644 ---- a/pxr/base/arch/defines.h -+++ b/pxr/base/arch/defines.h -@@ -49,7 +49,8 @@ - #if defined(i386) || defined(__i386__) || defined(__x86_64__) || \ - defined(_M_IX86) || defined(_M_X64) - #define ARCH_CPU_INTEL --#elif defined(__arm__) || defined(__aarch64__) || defined(_M_ARM) -+#elif defined(__arm__) || defined(__aarch64__) || defined(_M_ARM) || \ -+ defined(_M_ARM64) - #define ARCH_CPU_ARM - #endif - -@@ -57,7 +58,8 @@ - // Bits - // - --#if defined(__x86_64__) || defined(__aarch64__) || defined(_M_X64) -+#if defined(__x86_64__) || defined(__aarch64__) || defined(_M_X64) || \ -+ defined(_M_ARM64) - #define ARCH_BITS_64 - #else - #error "Unsupported architecture. x86_64 or ARM64 required." -diff --git a/pxr/base/arch/timing.h b/pxr/base/arch/timing.h -index d78598a84..2f44a5f89 100644 ---- a/pxr/base/arch/timing.h -+++ b/pxr/base/arch/timing.h -@@ -69,7 +69,13 @@ ArchGetTickTime() - return __rdtsc(); - #elif defined (ARCH_CPU_ARM) - uint64_t result; -+ #if defined(ARCH_COMPILER_MSVC) -+ // MSVC does not support inline assembly on ARM64 platforms -+ // 0x5F02 == ARM64_CNTVCT - manually calculated value avoids -+ result = _ReadStatusReg(0x5F02); -+ #else - __asm __volatile("mrs %0, CNTVCT_EL0" : "=&r" (result)); -+ #endif - return result; - #else - #error Unknown architecture. -@@ -84,6 +90,10 @@ ArchGetTickTime() +diff -Naur orig/pxr/base/arch/timing.h external_usd/pxr/base/arch/timing.h +--- orig/pxr/base/arch/timing.h 2022-10-27 12:56:34 -0600 ++++ external_usd/pxr/base/arch/timing.h 2022-10-27 13:05:08 -0600 +@@ -84,6 +84,10 @@ inline uint64_t ArchGetStartTickTime() { @@ -78,7 +37,7 @@ index d78598a84..2f44a5f89 100644 uint64_t t; #if defined (ARCH_OS_DARWIN) return ArchGetTickTime(); -@@ -116,6 +126,7 @@ ArchGetStartTickTime() +@@ -116,6 +120,7 @@ #error "Unsupported architecture." #endif return t; @@ -86,7 +45,7 @@ index d78598a84..2f44a5f89 100644 } /// Get a "stop" tick time for measuring an interval of time. See -@@ -125,6 +136,10 @@ ArchGetStartTickTime() +@@ -125,6 +130,10 @@ inline uint64_t ArchGetStopTickTime() { @@ -97,7 +56,7 @@ index d78598a84..2f44a5f89 100644 uint64_t t; #if defined (ARCH_OS_DARWIN) return ArchGetTickTime(); -@@ -155,11 +170,11 @@ ArchGetStopTickTime() +@@ -155,11 +164,11 @@ #error "Unsupported architecture." #endif return t; @@ -112,37 +71,10 @@ index d78598a84..2f44a5f89 100644 /// A simple timer class for measuring an interval of time using the /// ArchTickTimer facilities. -diff --git a/pxr/base/tf/pxrDoubleConversion/utils.h b/pxr/base/tf/pxrDoubleConversion/utils.h -index 547ac1110..10fd96cf9 100644 ---- a/pxr/base/tf/pxrDoubleConversion/utils.h -+++ b/pxr/base/tf/pxrDoubleConversion/utils.h -@@ -78,7 +78,7 @@ inline void abort_noreturn() { abort(); } - defined(__sparc__) || defined(__sparc) || defined(__s390__) || \ - defined(__SH4__) || defined(__alpha__) || \ - defined(_MIPS_ARCH_MIPS32R2) || \ -- defined(__AARCH64EL__) || defined(__aarch64__) || \ -+ defined(__AARCH64EL__) || defined(__aarch64__) || defined (_M_ARM64) || \ - defined(__riscv) - #define DOUBLE_CONVERSION_CORRECT_DOUBLE_OPERATIONS 1 - #elif defined(__mc68000__) -diff --git a/pxr/imaging/hio/OpenEXR/OpenEXRCore/internal_dwa_simd.h b/pxr/imaging/hio/OpenEXR/OpenEXRCore/internal_dwa_simd.h -index 459fb3084..c1f98f160 100644 ---- a/pxr/imaging/hio/OpenEXR/OpenEXRCore/internal_dwa_simd.h -+++ b/pxr/imaging/hio/OpenEXR/OpenEXRCore/internal_dwa_simd.h -@@ -18,7 +18,7 @@ - // aligned. Unaligned pointers may risk seg-faulting. - // - --#if defined __SSE2__ || (_MSC_VER >= 1300 && !_M_CEE_PURE) -+#if defined __SSE2__ || (_MSC_VER >= 1300 && !_M_CEE_PURE && !defined(_M_ARM64)) - # define IMF_HAVE_SSE2 1 - # include - # include -diff --git a/pxr/imaging/hioOpenVDB/CMakeLists.txt b/pxr/imaging/hioOpenVDB/CMakeLists.txt -index e32762cea..d2c08d3da 100644 ---- a/pxr/imaging/hioOpenVDB/CMakeLists.txt -+++ b/pxr/imaging/hioOpenVDB/CMakeLists.txt -@@ -20,6 +20,12 @@ else() +diff -Naur orig/pxr/imaging/hioOpenVDB/CMakeLists.txt external_usd/pxr/imaging/hioOpenVDB/CMakeLists.txt +--- orig/pxr/imaging/hioOpenVDB/CMakeLists.txt 2022-10-27 12:56:35 -0600 ++++ external_usd/pxr/imaging/hioOpenVDB/CMakeLists.txt 2022-10-27 13:05:08 -0600 +@@ -20,6 +20,12 @@ LIST(APPEND __VDB_IMATH_LIBS ${OPENEXR_Half_LIBRARY}) endif() @@ -155,11 +87,10 @@ index e32762cea..d2c08d3da 100644 pxr_library(hioOpenVDB LIBRARIES ar -diff --git a/pxr/usdImaging/CMakeLists.txt b/pxr/usdImaging/CMakeLists.txt -index 53c026689..e99a5ac17 100644 ---- a/pxr/usdImaging/CMakeLists.txt -+++ b/pxr/usdImaging/CMakeLists.txt -@@ -7,7 +7,7 @@ set(DIRS +diff -Naur orig/pxr/usdImaging/CMakeLists.txt external_usd/pxr/usdImaging/CMakeLists.txt +--- orig/pxr/usdImaging/CMakeLists.txt 2022-10-27 12:56:37 -0600 ++++ external_usd/pxr/usdImaging/CMakeLists.txt 2022-10-27 13:05:08 -0600 +@@ -7,7 +7,7 @@ usdVolImaging usdAppUtils usdviewq diff --git a/build_files/build_environment/windows/build_deps.cmd b/build_files/build_environment/windows/build_deps.cmd index df8c8b9644e..543a10414ce 100644 --- a/build_files/build_environment/windows/build_deps.cmd +++ b/build_files/build_environment/windows/build_deps.cmd @@ -13,19 +13,12 @@ if NOT "%1" == "" ( set VSVER_SHORT=15 set BuildDir=VS15 goto par2 - ) - if "%1" == "2022" ( - echo "Building for VS2022" - set VSVER=15.0 - set VSVER_SHORT=15 - set BuildDir=VS15 - goto par2 ) ) :usage -Echo Usage build_deps 2017/2019/2022 x64/arm64 +Echo Usage build_deps 2017/2019 x64 goto exit :par2 if NOT "%2" == "" ( @@ -35,24 +28,11 @@ if NOT "%2" == "" ( set ARCH=64 if "%1" == "2019" ( set CMAKE_BUILDER=Visual Studio 16 2019 - set CMAKE_BUILD_ARCH=-A x64 -Thost=x64 + set CMAKE_BUILD_ARCH=-A x64 ) if "%1" == "2017" ( set CMAKE_BUILDER=Visual Studio 15 2017 Win64 - set CMAKE_BUILD_ARCH=-Thost=x64 - ) - goto start - ) - if "%2" == "arm64" ( - echo "Building for arm64" - set HARVESTROOT=WinArm64_vc - set ARCH=64 - if "%1" == "2022" ( - set CMAKE_BUILDER=Visual Studio 17 2022 - set CMAKE_BUILD_ARCH=-A arm64 - ) else ( - echo ARM64 can only be used in combination with VS2022 - goto exit + set CMAKE_BUILD_ARCH= ) goto start ) @@ -133,7 +113,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%" %CMAKE_BUILD_ARCH% %SOURCE_DIR% -DPACKAGE_DIR=%BUILD_DIR%/packages -DDOWNLOAD_DIR=%BUILD_DIR%/downloads -DBUILD_MODE=Release -DHARVEST_TARGET=%HARVEST_DIR%/%HARVESTROOT%%VSVER_SHORT%/ +cmake -G "%CMAKE_BUILDER%" %CMAKE_BUILD_ARCH% -Thost=x64 %SOURCE_DIR% -DPACKAGE_DIR=%BUILD_DIR%/packages -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 -maxcpucount:1 "BlenderDependencies.sln" /p:Configuration=Release /fl /flp:logfile=BlenderDeps.log;Verbosity=minimal /verbosity:minimal @@ -151,7 +131,7 @@ set openexr_paths=%Staging%\%BuildDir%%ARCH%D\Debug\openexr\bin set imath_paths=%Staging%\%BuildDir%%ARCH%D\Debug\imath\bin set tbb_paths=%Staging%\%BuildDir%%ARCH%D\Debug\tbb\bin set path=%BUILD_DIR%\downloads\mingw\mingw64\msys\1.0\bin\;%BUILD_DIR%\downloads\nasm-2.12.01\;%original_path%;%boost_paths%;%oiio_paths%;%openexr_paths%;%imath_paths%;%tbb_paths% -cmake -G "%CMAKE_BUILDER%" %CMAKE_BUILD_ARCH% %SOURCE_DIR% -DPACKAGE_DIR=%BUILD_DIR%/packages -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%" %CMAKE_BUILD_ARCH% -Thost=x64 %SOURCE_DIR% -DPACKAGE_DIR=%BUILD_DIR%/packages -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 -maxcpucount:1 "BlenderDependencies.sln" /p:Configuration=Debug /verbosity:n /fl /flp:logfile=BlenderDeps.log;;Verbosity=normal diff --git a/build_files/cmake/Modules/FindAudaspace.cmake b/build_files/cmake/Modules/FindAudaspace.cmake index 4ae60b3d4e2..ec105691bee 100644 --- a/build_files/cmake/Modules/FindAudaspace.cmake +++ b/build_files/cmake/Modules/FindAudaspace.cmake @@ -111,5 +111,3 @@ mark_as_advanced( AUDASPACE_PY_INCLUDE_DIR AUDASPACE_PY_INCLUDE_DIRS ) - -unset(_audaspace_SEARCH_DIRS) diff --git a/build_files/cmake/Modules/FindBlosc.cmake b/build_files/cmake/Modules/FindBlosc.cmake index 99552b8938d..85dc1643e4c 100644 --- a/build_files/cmake/Modules/FindBlosc.cmake +++ b/build_files/cmake/Modules/FindBlosc.cmake @@ -64,5 +64,3 @@ mark_as_advanced( BLOSC_INCLUDE_DIR BLOSC_LIBRARY ) - -unset(_blosc_SEARCH_DIRS) diff --git a/build_files/cmake/Modules/FindBrotli.cmake b/build_files/cmake/Modules/FindBrotli.cmake index e3328fffe96..c3f90b36196 100644 --- a/build_files/cmake/Modules/FindBrotli.cmake +++ b/build_files/cmake/Modules/FindBrotli.cmake @@ -21,7 +21,7 @@ else() set(BROTLI_ROOT_DIR "") endif() -set(_brotli_SEARCH_DIRS +set(_BROTLI_SEARCH_DIRS ${BROTLI_ROOT_DIR} ) @@ -29,7 +29,7 @@ find_path(BROTLI_INCLUDE_DIR NAMES brotli/decode.h HINTS - ${_brotli_SEARCH_DIRS} + ${_BROTLI_SEARCH_DIRS} PATH_SUFFIXES include DOC "Brotli header files" @@ -41,7 +41,7 @@ find_library(BROTLI_LIBRARY_COMMON brotlicommon-static brotlicommon HINTS - ${_brotli_SEARCH_DIRS} + ${_BROTLI_SEARCH_DIRS} PATH_SUFFIXES lib64 lib lib/static DOC "Brotli static common library" @@ -52,7 +52,7 @@ find_library(BROTLI_LIBRARY_DEC brotlidec-static brotlidec HINTS - ${_brotli_SEARCH_DIRS} + ${_BROTLI_SEARCH_DIRS} PATH_SUFFIXES lib64 lib lib/static DOC "Brotli static decode library" @@ -81,4 +81,4 @@ mark_as_advanced( BROTLI_LIBRARY_DIR ) -unset(_brotli_SEARCH_DIRS) +unset(_BROTLI_SEARCH_DIRS) diff --git a/build_files/cmake/Modules/FindClang.cmake b/build_files/cmake/Modules/FindClang.cmake index 063bbaa97f7..1957c6352bb 100644 --- a/build_files/cmake/Modules/FindClang.cmake +++ b/build_files/cmake/Modules/FindClang.cmake @@ -36,7 +36,7 @@ if(NOT LLVM_ROOT_DIR) set(LLVM_ROOT_DIR ${LLVM_ROOT_DIR} CACHE PATH "Path to the LLVM installation") endif() -set(_clang_SEARCH_DIRS +set(_CLANG_SEARCH_DIRS ${CLANG_ROOT_DIR} ${LLVM_ROOT_DIR} /opt/lib/clang @@ -46,14 +46,14 @@ find_path(CLANG_INCLUDE_DIR NAMES AST/AST.h HINTS - ${_clang_SEARCH_DIRS} + ${_CLANG_SEARCH_DIRS} PATH_SUFFIXES include include/clang ) -set(_clang_FIND_COMPONENTS +set(_CLANG_FIND_COMPONENTS clangDependencyScanning clangDynamicASTMatchers clangFrontendTool @@ -87,20 +87,20 @@ set(_clang_FIND_COMPONENTS clangBasic ) -set(_clang_LIBRARIES) -foreach(COMPONENT ${_clang_FIND_COMPONENTS}) +set(_CLANG_LIBRARIES) +foreach(COMPONENT ${_CLANG_FIND_COMPONENTS}) string(TOUPPER ${COMPONENT} UPPERCOMPONENT) find_library(CLANG_${UPPERCOMPONENT}_LIBRARY NAMES ${COMPONENT} HINTS - ${_clang_SEARCH_DIRS} + ${_CLANG_SEARCH_DIRS} PATH_SUFFIXES lib64 lib ) if(CLANG_${UPPERCOMPONENT}_LIBRARY) - list(APPEND _clang_LIBRARIES "${CLANG_${UPPERCOMPONENT}_LIBRARY}") + list(APPEND _CLANG_LIBRARIES "${CLANG_${UPPERCOMPONENT}_LIBRARY}") endif() endforeach() @@ -109,10 +109,10 @@ endforeach() # all listed variables are TRUE. include(FindPackageHandleStandardArgs) find_package_handle_standard_args(Clang DEFAULT_MSG - _clang_LIBRARIES CLANG_INCLUDE_DIR) + _CLANG_LIBRARIES CLANG_INCLUDE_DIR) if(CLANG_FOUND) - set(CLANG_LIBRARIES ${_clang_LIBRARIES}) + set(CLANG_LIBRARIES ${_CLANG_LIBRARIES}) set(CLANG_INCLUDE_DIRS ${CLANG_INCLUDE_DIR}) endif() @@ -120,11 +120,11 @@ mark_as_advanced( CLANG_INCLUDE_DIR ) -foreach(COMPONENT ${_clang_FIND_COMPONENTS}) +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) +unset(_CLANG_SEARCH_DIRS) +unset(_CLANG_FIND_COMPONENTS) +unset(_CLANG_LIBRARIES) diff --git a/build_files/cmake/Modules/FindClangTidy.cmake b/build_files/cmake/Modules/FindClangTidy.cmake index dc4914a33db..d05f1901f78 100644 --- a/build_files/cmake/Modules/FindClangTidy.cmake +++ b/build_files/cmake/Modules/FindClangTidy.cmake @@ -104,5 +104,3 @@ ${CLANG_TIDY_VERSION_PATCH}") else() set(CLANG_TIDY_FOUND FALSE) endif() - -unset(_clang_tidy_SEARCH_DIRS) diff --git a/build_files/cmake/Modules/FindEigen3.cmake b/build_files/cmake/Modules/FindEigen3.cmake index 6a6ec15c1ad..977c565d917 100644 --- a/build_files/cmake/Modules/FindEigen3.cmake +++ b/build_files/cmake/Modules/FindEigen3.cmake @@ -47,5 +47,3 @@ endif() mark_as_advanced( EIGEN3_INCLUDE_DIR ) - -unset(_eigen3_SEARCH_DIRS) diff --git a/build_files/cmake/Modules/FindFFmpeg.cmake b/build_files/cmake/Modules/FindFFmpeg.cmake index dd0e7865689..d8375f49066 100644 --- a/build_files/cmake/Modules/FindFFmpeg.cmake +++ b/build_files/cmake/Modules/FindFFmpeg.cmake @@ -66,8 +66,6 @@ foreach(_component ${FFMPEG_FIND_COMPONENTS}) list(APPEND _ffmpeg_LIBRARIES ${FFMPEG_${_upper_COMPONENT}_LIBRARY}) mark_as_advanced(FFMPEG_${_upper_COMPONENT}_LIBRARY) endforeach() -unset(_component) -unset(_upper_COMPONENT) # handle the QUIETLY and REQUIRED arguments and set FFMPEG_FOUND to TRUE if # all listed variables are TRUE diff --git a/build_files/cmake/Modules/FindFftw3.cmake b/build_files/cmake/Modules/FindFftw3.cmake index 5950c2f61c6..e024f9e7abe 100644 --- a/build_files/cmake/Modules/FindFftw3.cmake +++ b/build_files/cmake/Modules/FindFftw3.cmake @@ -72,12 +72,10 @@ if(FFTW3_FOUND) set(FFTW3_INCLUDE_DIRS ${FFTW3_INCLUDE_DIR}) endif() +unset(_FFTW3_LIBRARIES) mark_as_advanced( FFTW3_INCLUDE_DIR FFTW3_LIBRARY_F FFTW3_LIBRARY_D ) - -unset(_FFTW3_LIBRARIES) -unset(_fftw3_SEARCH_DIRS) diff --git a/build_files/cmake/Modules/FindFribidi.cmake b/build_files/cmake/Modules/FindFribidi.cmake index e945f65d272..1a3b5025f6d 100644 --- a/build_files/cmake/Modules/FindFribidi.cmake +++ b/build_files/cmake/Modules/FindFribidi.cmake @@ -55,5 +55,3 @@ MARK_AS_ADVANCED( LIBFRIBIDI_INCLUDE_DIR LIBFRIBIDI_LIBRARY ) - -unset(_fribidi_SEARCH_DIRS) diff --git a/build_files/cmake/Modules/FindGMP.cmake b/build_files/cmake/Modules/FindGMP.cmake index 3ab770dadea..9de1970d118 100644 --- a/build_files/cmake/Modules/FindGMP.cmake +++ b/build_files/cmake/Modules/FindGMP.cmake @@ -91,5 +91,3 @@ mark_as_advanced( GMPXX_INCLUDE_DIR GMPXX_LIBRARY ) - -unset(_gmp_SEARCH_DIRS) diff --git a/build_files/cmake/Modules/FindHIP.cmake b/build_files/cmake/Modules/FindHIP.cmake index 7a1ce2031a6..a3b7ee56f2c 100644 --- a/build_files/cmake/Modules/FindHIP.cmake +++ b/build_files/cmake/Modules/FindHIP.cmake @@ -101,5 +101,3 @@ include(FindPackageHandleStandardArgs) find_package_handle_standard_args(HIP REQUIRED_VARS HIP_HIPCC_EXECUTABLE VERSION_VAR HIP_VERSION) - -unset(_hip_SEARCH_DIRS) diff --git a/build_files/cmake/Modules/FindHIPRT.cmake b/build_files/cmake/Modules/FindHIPRT.cmake index d57784e5531..600f695d110 100644 --- a/build_files/cmake/Modules/FindHIPRT.cmake +++ b/build_files/cmake/Modules/FindHIPRT.cmake @@ -57,5 +57,3 @@ find_package_handle_standard_args(HIPRT DEFAULT_MSG mark_as_advanced( HIPRT_INCLUDE_DIR ) - -unset(_hiprt_SEARCH_DIRS) diff --git a/build_files/cmake/Modules/FindHarfbuzz.cmake b/build_files/cmake/Modules/FindHarfbuzz.cmake index 69de9f09f91..9dc91838412 100644 --- a/build_files/cmake/Modules/FindHarfbuzz.cmake +++ b/build_files/cmake/Modules/FindHarfbuzz.cmake @@ -55,5 +55,3 @@ MARK_AS_ADVANCED( LIBHARFBUZZ_INCLUDE_DIR LIBHARFBUZZ_LIBRARY ) - -unset(_harfbuzz_SEARCH_DIRS) diff --git a/build_files/cmake/Modules/FindIcuLinux.cmake b/build_files/cmake/Modules/FindIcuLinux.cmake index 20ed1fc0e00..0db59bad268 100644 --- a/build_files/cmake/Modules/FindIcuLinux.cmake +++ b/build_files/cmake/Modules/FindIcuLinux.cmake @@ -137,5 +137,3 @@ mark_as_advanced( ICU_LIBRARY_TU ICU_LIBRARY_UC ) - -unset(_icu_SEARCH_DIRS) diff --git a/build_files/cmake/Modules/FindJack.cmake b/build_files/cmake/Modules/FindJack.cmake index 9fea649ac87..2b45fc8de30 100644 --- a/build_files/cmake/Modules/FindJack.cmake +++ b/build_files/cmake/Modules/FindJack.cmake @@ -61,5 +61,3 @@ mark_as_advanced( JACK_INCLUDE_DIR JACK_LIBRARY ) - -unset(_jack_SEARCH_DIRS) diff --git a/build_files/cmake/Modules/FindJeMalloc.cmake b/build_files/cmake/Modules/FindJeMalloc.cmake index 0c8b1232d8e..1c0409844e2 100644 --- a/build_files/cmake/Modules/FindJeMalloc.cmake +++ b/build_files/cmake/Modules/FindJeMalloc.cmake @@ -71,5 +71,3 @@ mark_as_advanced( JEMALLOC_INCLUDE_DIR JEMALLOC_LIBRARY ) - -unset(_jemalloc_SEARCH_DIRS) diff --git a/build_files/cmake/Modules/FindLZO.cmake b/build_files/cmake/Modules/FindLZO.cmake index 73d1689bb41..edbc1a49676 100644 --- a/build_files/cmake/Modules/FindLZO.cmake +++ b/build_files/cmake/Modules/FindLZO.cmake @@ -59,5 +59,3 @@ mark_as_advanced( LZO_INCLUDE_DIR LZO_LIBRARY ) - -unset(_lzo_SEARCH_DIRS) diff --git a/build_files/cmake/Modules/FindLevelZero.cmake b/build_files/cmake/Modules/FindLevelZero.cmake index d5a764f5867..f659a2af822 100644 --- a/build_files/cmake/Modules/FindLevelZero.cmake +++ b/build_files/cmake/Modules/FindLevelZero.cmake @@ -20,7 +20,7 @@ else() set(LEVEL_ZERO_ROOT_DIR "") endif() -set(_level_zero_SEARCH_DIRS +set(_level_zero_search_dirs ${LEVEL_ZERO_ROOT_DIR} /usr/lib /usr/local/lib @@ -30,7 +30,7 @@ find_library(LEVEL_ZERO_LIBRARY NAMES ze_loader HINTS - ${_level_zero_SEARCH_DIRS} + ${_level_zero_search_dirs} PATH_SUFFIXES lib64 lib ) @@ -39,7 +39,7 @@ find_path(LEVEL_ZERO_INCLUDE_DIR NAMES level_zero/ze_api.h HINTS - ${_level_zero_SEARCH_DIRS} + ${_level_zero_search_dirs} PATH_SUFFIXES include ) @@ -60,5 +60,3 @@ mark_as_advanced( LEVEL_ZERO_LIBRARY LEVEL_ZERO_INCLUDE_DIR ) - -unset(_level_zero_SEARCH_DIRS) diff --git a/build_files/cmake/Modules/FindOSL.cmake b/build_files/cmake/Modules/FindOSL.cmake index e06ed9d2aab..bd81e54cfbf 100644 --- a/build_files/cmake/Modules/FindOSL.cmake +++ b/build_files/cmake/Modules/FindOSL.cmake @@ -125,15 +125,7 @@ mark_as_advanced( OSL_INCLUDE_DIR OSL_SHADER_DIR ) - foreach(COMPONENT ${_osl_FIND_COMPONENTS}) string(TOUPPER ${COMPONENT} UPPERCOMPONENT) mark_as_advanced(OSL_${UPPERCOMPONENT}_LIBRARY) endforeach() - -unset(COMPONENT) -unset(UPPERCOMPONENT) - -unset(_osl_FIND_COMPONENTS) -unset(_osl_LIBRARIES) -unset(_osl_SEARCH_DIRS) diff --git a/build_files/cmake/Modules/FindOpenCOLLADA.cmake b/build_files/cmake/Modules/FindOpenCOLLADA.cmake index fc0b58c6fc7..b7e0cdf289d 100644 --- a/build_files/cmake/Modules/FindOpenCOLLADA.cmake +++ b/build_files/cmake/Modules/FindOpenCOLLADA.cmake @@ -134,9 +134,5 @@ endif() unset(COMPONENT) unset(UPPERCOMPONENT) -unset(_opencollada_FIND_COMPONENTS) -unset(_opencollada_FIND_INCLUDES) -unset(_opencollada_FIND_STATIC_COMPONENTS) -unset(_opencollada_INCLUDES) unset(_opencollada_LIBRARIES) -unset(_opencollada_SEARCH_DIRS) +unset(_opencollada_INCLUDES) diff --git a/build_files/cmake/Modules/FindOpenColorIO.cmake b/build_files/cmake/Modules/FindOpenColorIO.cmake index ebf52b07b3d..7a2b1c87276 100644 --- a/build_files/cmake/Modules/FindOpenColorIO.cmake +++ b/build_files/cmake/Modules/FindOpenColorIO.cmake @@ -72,7 +72,6 @@ if(EXISTS "${OPENCOLORIO_INCLUDE_DIR}/OpenColorIO/OpenColorABI.h") REGEX "^#define OCIO_VERSION[ \t].*$") endif() string(REGEX MATCHALL "[0-9]+[.0-9]+" OPENCOLORIO_VERSION ${_opencolorio_version}) - unset(_opencolorio_version) endif() # handle the QUIETLY and REQUIRED arguments and set OPENCOLORIO_FOUND to TRUE if diff --git a/build_files/cmake/Modules/FindOpenImageDenoise.cmake b/build_files/cmake/Modules/FindOpenImageDenoise.cmake index a7e2251a11d..b2bd7ff7d9c 100644 --- a/build_files/cmake/Modules/FindOpenImageDenoise.cmake +++ b/build_files/cmake/Modules/FindOpenImageDenoise.cmake @@ -119,10 +119,6 @@ foreach(COMPONENT ${_openimagedenoise_FIND_COMPONENTS}) mark_as_advanced(OPENIMAGEDENOISE_${UPPERCOMPONENT}_LIBRARY) endforeach() -unset(COMPONENT) -unset(UPPERCOMPONENT) - -unset(_openimagedenoise_FIND_COMPONENTS) -unset(_openimagedenoise_FIND_STATIC_COMPONENTS) -unset(_openimagedenoise_LIBRARIES) unset(_openimagedenoise_SEARCH_DIRS) +unset(_openimagedenoise_FIND_COMPONENTS) +unset(_openimagedenoise_LIBRARIES) diff --git a/build_files/cmake/Modules/FindOpenSubdiv.cmake b/build_files/cmake/Modules/FindOpenSubdiv.cmake index 4ce8ff210c8..e7e392f4870 100644 --- a/build_files/cmake/Modules/FindOpenSubdiv.cmake +++ b/build_files/cmake/Modules/FindOpenSubdiv.cmake @@ -85,10 +85,3 @@ foreach(COMPONENT ${_opensubdiv_FIND_COMPONENTS}) string(TOUPPER ${COMPONENT} UPPERCOMPONENT) mark_as_advanced(OPENSUBDIV_${UPPERCOMPONENT}_LIBRARY) endforeach() - -unset(COMPONENT) -unset(UPPERCOMPONENT) - -unset(_opensubdiv_FIND_COMPONENTS) -unset(_opensubdiv_SEARCH_DIRS) -unset(_opensubdiv_LIBRARIES) diff --git a/build_files/cmake/Modules/FindPCRE.cmake b/build_files/cmake/Modules/FindPCRE.cmake index ede119b230f..fa1c010015a 100644 --- a/build_files/cmake/Modules/FindPCRE.cmake +++ b/build_files/cmake/Modules/FindPCRE.cmake @@ -64,5 +64,3 @@ mark_as_advanced( PCRE_INCLUDE_DIR PCRE_LIBRARY ) - -unset(_pcre_SEARCH_DIRS) diff --git a/build_files/cmake/Modules/FindPotrace.cmake b/build_files/cmake/Modules/FindPotrace.cmake index d80c3c96e95..e629cb174f2 100644 --- a/build_files/cmake/Modules/FindPotrace.cmake +++ b/build_files/cmake/Modules/FindPotrace.cmake @@ -64,5 +64,3 @@ mark_as_advanced( POTRACE_INCLUDE_DIR POTRACE_LIBRARY ) - -unset(_potrace_SEARCH_DIRS) diff --git a/build_files/cmake/Modules/FindPugiXML.cmake b/build_files/cmake/Modules/FindPugiXML.cmake index 21f00240217..fdd6c2b9f0f 100644 --- a/build_files/cmake/Modules/FindPugiXML.cmake +++ b/build_files/cmake/Modules/FindPugiXML.cmake @@ -64,5 +64,3 @@ mark_as_advanced( PUGIXML_INCLUDE_DIR PUGIXML_LIBRARY ) - -unset(_pugixml_SEARCH_DIRS) diff --git a/build_files/cmake/Modules/FindPulse.cmake b/build_files/cmake/Modules/FindPulse.cmake index 2719697d653..0b7668ffb5f 100644 --- a/build_files/cmake/Modules/FindPulse.cmake +++ b/build_files/cmake/Modules/FindPulse.cmake @@ -59,5 +59,3 @@ mark_as_advanced( LIBPULSE_INCLUDE_DIR LIBPULSE_LIBRARY ) - -unset(_pulse_SEARCH_DIRS) diff --git a/build_files/cmake/Modules/FindPythonLibsUnix.cmake b/build_files/cmake/Modules/FindPythonLibsUnix.cmake index 0136e2d7433..911cb24cd32 100644 --- a/build_files/cmake/Modules/FindPythonLibsUnix.cmake +++ b/build_files/cmake/Modules/FindPythonLibsUnix.cmake @@ -256,6 +256,10 @@ if(PYTHONLIBSUNIX_FOUND) ) endif() +unset(_PYTHON_ABI_FLAGS) +unset(_PYTHON_VERSION_SUPPORTED) +unset(_python_SEARCH_DIRS) + mark_as_advanced( PYTHON_INCLUDE_DIR PYTHON_INCLUDE_CONFIG_DIR @@ -264,7 +268,3 @@ mark_as_advanced( PYTHON_SITE_PACKAGES PYTHON_EXECUTABLE ) - -unset(_PYTHON_ABI_FLAGS) -unset(_PYTHON_VERSION_SUPPORTED) -unset(_python_SEARCH_DIRS) diff --git a/build_files/cmake/Modules/FindSDL2.cmake b/build_files/cmake/Modules/FindSDL2.cmake index af2ecdcfb84..4c90e0acfa6 100644 --- a/build_files/cmake/Modules/FindSDL2.cmake +++ b/build_files/cmake/Modules/FindSDL2.cmake @@ -60,5 +60,3 @@ mark_as_advanced( SDL2_INCLUDE_DIR SDL2_LIBRARY ) - -unset(_sdl2_SEARCH_DIRS) diff --git a/build_files/cmake/Modules/FindSYCL.cmake b/build_files/cmake/Modules/FindSYCL.cmake index c361cb511d5..806bdebfdf9 100644 --- a/build_files/cmake/Modules/FindSYCL.cmake +++ b/build_files/cmake/Modules/FindSYCL.cmake @@ -22,7 +22,7 @@ elseif(DEFINED ENV{SYCL_ROOT_DIR} AND NOT $ENV{SYCL_ROOT_DIR} STREQUAL "") set(SYCL_ROOT_DIR $ENV{SYCL_ROOT_DIR}) endif() -set(_sycl_SEARCH_DIRS +set(_sycl_search_dirs ${SYCL_ROOT_DIR} /usr/lib /usr/local/lib @@ -41,7 +41,7 @@ find_program(SYCL_COMPILER dpcpp clang++ HINTS - ${_sycl_SEARCH_DIRS} + ${_sycl_search_dirs} PATH_SUFFIXES bin NO_CMAKE_FIND_ROOT_PATH @@ -56,7 +56,7 @@ if(NOT SYCL_COMPILER) icpx dpcpp HINTS - ${_sycl_SEARCH_DIRS} + ${_sycl_search_dirs} PATH_SUFFIXES bin ) @@ -68,7 +68,7 @@ find_library(SYCL_LIBRARY sycl6 sycl HINTS - ${_sycl_SEARCH_DIRS} + ${_sycl_search_dirs} PATH_SUFFIXES lib64 lib ) @@ -80,7 +80,7 @@ if(WIN32) sycl6d sycld HINTS - ${_sycl_SEARCH_DIRS} + ${_sycl_search_dirs} PATH_SUFFIXES lib64 lib ) @@ -90,7 +90,7 @@ find_path(SYCL_INCLUDE_DIR NAMES sycl/sycl.hpp HINTS - ${_sycl_SEARCH_DIRS} + ${_sycl_search_dirs} PATH_SUFFIXES include ) @@ -129,5 +129,3 @@ mark_as_advanced( SYCL_INCLUDE_DIR SYCL_LIBRARY ) - -unset(_sycl_SEARCH_DIRS) diff --git a/build_files/cmake/Modules/FindSndFile.cmake b/build_files/cmake/Modules/FindSndFile.cmake index eab90db049e..584ee27ff6a 100644 --- a/build_files/cmake/Modules/FindSndFile.cmake +++ b/build_files/cmake/Modules/FindSndFile.cmake @@ -59,5 +59,3 @@ mark_as_advanced( LIBSNDFILE_INCLUDE_DIR LIBSNDFILE_LIBRARY ) - -unset(_sndfile_SEARCH_DIRS) diff --git a/build_files/cmake/Modules/FindSpacenav.cmake b/build_files/cmake/Modules/FindSpacenav.cmake index 3f2857ac19a..08d780e44d0 100644 --- a/build_files/cmake/Modules/FindSpacenav.cmake +++ b/build_files/cmake/Modules/FindSpacenav.cmake @@ -61,5 +61,3 @@ mark_as_advanced( SPACENAV_INCLUDE_DIR SPACENAV_LIBRARY ) - -unset(_spacenav_SEARCH_DIRS) diff --git a/build_files/cmake/Modules/FindTBB.cmake b/build_files/cmake/Modules/FindTBB.cmake index 7c26bd22a77..117b27813c9 100644 --- a/build_files/cmake/Modules/FindTBB.cmake +++ b/build_files/cmake/Modules/FindTBB.cmake @@ -64,5 +64,3 @@ mark_as_advanced( TBB_INCLUDE_DIR TBB_LIBRARY ) - -unset(_tbb_SEARCH_DIRS) diff --git a/build_files/cmake/Modules/FindWebP.cmake b/build_files/cmake/Modules/FindWebP.cmake index ea4051acebf..25a91e2a106 100644 --- a/build_files/cmake/Modules/FindWebP.cmake +++ b/build_files/cmake/Modules/FindWebP.cmake @@ -89,7 +89,3 @@ mark_as_advanced( WEBP_WEBP_LIBRARY WEBP_SHARPYUV_LIBRARY ) - -unset(_webp_FIND_COMPONENTS) -unset(_webp_LIBRARIES) -unset(_webp_SEARCH_DIRS) diff --git a/build_files/cmake/Modules/FindXML2.cmake b/build_files/cmake/Modules/FindXML2.cmake index a17fb181974..aa50e707e03 100644 --- a/build_files/cmake/Modules/FindXML2.cmake +++ b/build_files/cmake/Modules/FindXML2.cmake @@ -59,5 +59,3 @@ mark_as_advanced( XML2_INCLUDE_DIR XML2_LIBRARY ) - -unset(_xml2_SEARCH_DIRS) diff --git a/build_files/cmake/Modules/FindXR_OpenXR_SDK.cmake b/build_files/cmake/Modules/FindXR_OpenXR_SDK.cmake index fdc63cff543..aa55c42c0c0 100644 --- a/build_files/cmake/Modules/FindXR_OpenXR_SDK.cmake +++ b/build_files/cmake/Modules/FindXR_OpenXR_SDK.cmake @@ -70,5 +70,3 @@ mark_as_advanced( XR_OPENXR_SDK_INCLUDE_DIR XR_OPENXR_SDK_LOADER_LIBRARY ) - -unset(_xr_openxr_sdk_SEARCH_DIRS) diff --git a/build_files/cmake/Modules/FindZstd.cmake b/build_files/cmake/Modules/FindZstd.cmake index ef7394dee4f..8588d2ce8d4 100644 --- a/build_files/cmake/Modules/FindZstd.cmake +++ b/build_files/cmake/Modules/FindZstd.cmake @@ -61,5 +61,3 @@ mark_as_advanced( ZSTD_INCLUDE_DIR ZSTD_LIBRARY ) - -unset(_zstd_SEARCH_DIRS) diff --git a/build_files/cmake/config/blender_full.cmake b/build_files/cmake/config/blender_full.cmake index 2f110be90f5..9dea8b83c74 100644 --- a/build_files/cmake/config/blender_full.cmake +++ b/build_files/cmake/config/blender_full.cmake @@ -12,6 +12,7 @@ set(WITH_ALEMBIC ON CACHE BOOL "" FORCE) set(WITH_AUDASPACE ON CACHE BOOL "" FORCE) set(WITH_BUILDINFO ON CACHE BOOL "" FORCE) set(WITH_BULLET ON CACHE BOOL "" FORCE) +set(WITH_CODEC_AVI ON CACHE BOOL "" FORCE) set(WITH_CODEC_FFMPEG ON CACHE BOOL "" FORCE) set(WITH_CODEC_SNDFILE ON CACHE BOOL "" FORCE) set(WITH_COMPOSITOR_CPU ON CACHE BOOL "" FORCE) diff --git a/build_files/cmake/config/blender_lite.cmake b/build_files/cmake/config/blender_lite.cmake index 6e19414ff98..9c7791e6aae 100644 --- a/build_files/cmake/config/blender_lite.cmake +++ b/build_files/cmake/config/blender_lite.cmake @@ -15,6 +15,7 @@ set(WITH_BLENDER_THUMBNAILER OFF CACHE BOOL "" FORCE) set(WITH_BOOST OFF CACHE BOOL "" FORCE) set(WITH_BUILDINFO OFF CACHE BOOL "" FORCE) set(WITH_BULLET OFF CACHE BOOL "" FORCE) +set(WITH_CODEC_AVI OFF CACHE BOOL "" FORCE) set(WITH_CODEC_FFMPEG OFF CACHE BOOL "" FORCE) set(WITH_CODEC_SNDFILE OFF CACHE BOOL "" FORCE) set(WITH_COMPOSITOR_CPU OFF CACHE BOOL "" FORCE) diff --git a/build_files/cmake/config/blender_release.cmake b/build_files/cmake/config/blender_release.cmake index d289907b65d..0e116e76abf 100644 --- a/build_files/cmake/config/blender_release.cmake +++ b/build_files/cmake/config/blender_release.cmake @@ -16,6 +16,7 @@ set(WITH_ASSERT_ABORT OFF CACHE BOOL "" FORCE) set(WITH_AUDASPACE ON CACHE BOOL "" FORCE) set(WITH_BUILDINFO ON CACHE BOOL "" FORCE) set(WITH_BULLET ON CACHE BOOL "" FORCE) +set(WITH_CODEC_AVI ON CACHE BOOL "" FORCE) set(WITH_CODEC_FFMPEG ON CACHE BOOL "" FORCE) set(WITH_CODEC_SNDFILE ON CACHE BOOL "" FORCE) set(WITH_COMPOSITOR_CPU ON CACHE BOOL "" FORCE) @@ -87,17 +88,12 @@ endif() if(NOT APPLE) set(WITH_XR_OPENXR ON CACHE BOOL "" FORCE) - # Can't use CMAKE_SYSTEM_PROCESSOR here as it's not set yet, - # so fall back to checking the env for vcvarsall's VSCMD_ARG_TGT_ARCH - if(NOT (WIN32 AND "$ENV{VSCMD_ARG_TGT_ARCH}" STREQUAL "arm64")) - set(WITH_CYCLES_DEVICE_OPTIX ON CACHE BOOL "" FORCE) - set(WITH_CYCLES_CUDA_BINARIES ON CACHE BOOL "" FORCE) - set(WITH_CYCLES_HIP_BINARIES ON CACHE BOOL "" FORCE) - set(WITH_CYCLES_DEVICE_ONEAPI ON CACHE BOOL "" FORCE) - set(WITH_CYCLES_ONEAPI_BINARIES ON CACHE BOOL "" FORCE) - endif() + set(WITH_CYCLES_DEVICE_OPTIX ON CACHE BOOL "" FORCE) + set(WITH_CYCLES_CUDA_BINARIES ON CACHE BOOL "" FORCE) + set(WITH_CYCLES_HIP_BINARIES ON CACHE BOOL "" FORCE) + set(WITH_CYCLES_DEVICE_ONEAPI ON CACHE BOOL "" FORCE) + set(WITH_CYCLES_ONEAPI_BINARIES ON CACHE BOOL "" FORCE) endif() - -if(WIN32 AND NOT (WIN32 AND "$ENV{VSCMD_ARG_TGT_ARCH}" STREQUAL "arm64")) - set(WITH_CYCLES_DEVICE_HIPRT ON CACHE BOOL "" FORCE) +if(WIN32) + set(WITH_CYCLES_DEVICE_HIPRT ON CACHE BOOL "" FORCE) endif() diff --git a/build_files/cmake/macros.cmake b/build_files/cmake/macros.cmake index 0b3b071c70d..4ffeb6b316f 100644 --- a/build_files/cmake/macros.cmake +++ b/build_files/cmake/macros.cmake @@ -473,8 +473,6 @@ endfunction() # Ninja only: assign 'heavy pool' to some targets that are especially RAM-consuming to build. function(setup_heavy_lib_pool) if(WITH_NINJA_POOL_JOBS AND NINJA_MAX_NUM_PARALLEL_COMPILE_HEAVY_JOBS) - set(_HEAVY_LIBS) - set(_TARGET) if(WITH_CYCLES) list(APPEND _HEAVY_LIBS "cycles_device" "cycles_kernel") endif() @@ -485,13 +483,11 @@ function(setup_heavy_lib_pool) list(APPEND _HEAVY_LIBS "bf_intern_openvdb") endif() - foreach(_TARGET ${_HEAVY_LIBS}) - if(TARGET ${_TARGET}) - set_property(TARGET ${_TARGET} PROPERTY JOB_POOL_COMPILE compile_heavy_job_pool) + foreach(TARGET ${_HEAVY_LIBS}) + if(TARGET ${TARGET}) + set_property(TARGET ${TARGET} PROPERTY JOB_POOL_COMPILE compile_heavy_job_pool) endif() endforeach() - unset(_TARGET) - unset(_HEAVY_LIBS) endif() endfunction() @@ -558,7 +554,7 @@ macro(TEST_SSE_SUPPORT set(${_sse_flags} "/arch:SSE") set(${_sse2_flags} "/arch:SSE2") endif() - elseif(CMAKE_C_COMPILER_ID STREQUAL "Intel") + elseif(CMAKE_C_COMPILER_ID MATCHES "Intel") set(${_sse_flags} "") # icc defaults to -msse set(${_sse2_flags} "") # icc defaults to -msse2 else() @@ -770,7 +766,7 @@ endmacro() macro(remove_cc_flag_unsigned_char) if(CMAKE_COMPILER_IS_GNUCC OR (CMAKE_C_COMPILER_ID MATCHES "Clang") OR - (CMAKE_C_COMPILER_ID STREQUAL "Intel")) + (CMAKE_C_COMPILER_ID MATCHES "Intel")) remove_cc_flag("-funsigned-char") elseif(MSVC) remove_cc_flag("/J") @@ -853,7 +849,7 @@ function(get_blender_version) # - BLENDER_VERSION_PATCH # - BLENDER_VERSION_CYCLE (alpha, beta, rc, release) - # So CMAKE depends on `BKE_blender_version.h`, beware of infinite-loops! + # So CMAKE depends on `BKE_blender.h`, beware of infinite-loops! configure_file( ${CMAKE_SOURCE_DIR}/source/blender/blenkernel/BKE_blender_version.h ${CMAKE_BINARY_DIR}/source/blender/blenkernel/BKE_blender_version.h.done diff --git a/build_files/cmake/packaging.cmake b/build_files/cmake/packaging.cmake index fd26f77cd4b..4ed6b5a91a3 100644 --- a/build_files/cmake/packaging.cmake +++ b/build_files/cmake/packaging.cmake @@ -62,7 +62,7 @@ else() set(CPACK_PACKAGE_FILE_NAME ${PROJECT_NAME_LOWER}-${MAJOR_VERSION}.${MINOR_VERSION}.${PATCH_VERSION}-git${CPACK_DATE}.${BUILD_REV}-${PACKAGE_ARCH}) endif() -if(CMAKE_SYSTEM_NAME STREQUAL "Linux") +if(CMAKE_SYSTEM_NAME MATCHES "Linux") # RPM packages include(build_files/cmake/RpmBuild.cmake) if(RPMBUILD_FOUND) diff --git a/build_files/cmake/platform/platform_unix.cmake b/build_files/cmake/platform/platform_unix.cmake index f9c41685663..a5d7c1b9fae 100644 --- a/build_files/cmake/platform/platform_unix.cmake +++ b/build_files/cmake/platform/platform_unix.cmake @@ -41,30 +41,14 @@ else() set(LIBDIR "") # Suppress undefined warnings, allow printing even if empty. endif() if((LIBDIR STREQUAL "") OR (NOT (EXISTS "${LIBDIR}"))) - if(WITH_STRICT_BUILD_OPTIONS) - message(SEND_ERROR - "Unable to find LIBDIR: \"${LIBDIR}\". " - "WITH_LIBS_PRECOMPILED needs to be able to find the LIBDIR for the precompiled libraries." - ) - else() - message(STATUS - "Unable to find LIBDIR: \"${LIBDIR}\". system libraries may be used " - "(disable WITH_LIBS_PRECOMPILED to suppress this message)." - ) - endif() + message(STATUS + "Unable to find LIBDIR: \"${LIBDIR}\", system libraries may be used " + "(disable WITH_LIBS_PRECOMPILED to suppress this message)." + ) unset(LIBDIR) - set(WITH_LIBS_PRECOMPILED OFF) endif() endif() -# Disable the CPU check if not portable or if we are not using the pre-compiled libs. -# This is because: -# 1. We don't install the CPU check library on a non portable build. -# 2. We assume that people know what systems they are targeting when they build a non -# portable build or when not using our precompiled libs. -set_and_warn_dependency(WITH_INSTALL_PORTABLE WITH_CPU_CHECK OFF) -set_and_warn_dependency(WITH_LIBS_PRECOMPILED WITH_CPU_CHECK OFF) - # Support restoring this value once pre-compiled libraries have been handled. set(WITH_STATIC_LIBS_INIT ${WITH_STATIC_LIBS}) @@ -649,7 +633,7 @@ if(CMAKE_DL_LIBS) list(APPEND PLATFORM_LINKLIBS ${CMAKE_DL_LIBS}) endif() -if(CMAKE_SYSTEM_NAME STREQUAL "Linux") +if(CMAKE_SYSTEM_NAME MATCHES "Linux") if(NOT WITH_PYTHON_MODULE) # binreloc is linux only set(BINRELOC_INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/extern/binreloc/include) @@ -929,7 +913,7 @@ if(CMAKE_COMPILER_IS_GNUCC) message(STATUS "The \"mold\" binary could not be found, using system linker.") set(WITH_LINKER_MOLD OFF) elseif(CMAKE_C_COMPILER_VERSION VERSION_LESS 12.1) - message(STATUS "GCC 12.1 or newer is required for the MOLD linker.") + message(STATUS "GCC 12.1 or newer is required for th MOLD linker.") set(WITH_LINKER_MOLD OFF) else() get_filename_component(MOLD_BIN_DIR "${MOLD_BIN}" DIRECTORY) @@ -1043,7 +1027,7 @@ elseif(CMAKE_C_COMPILER_ID MATCHES "Clang") endif() # Intel C++ Compiler -elseif(CMAKE_C_COMPILER_ID STREQUAL "Intel") +elseif(CMAKE_C_COMPILER_ID MATCHES "Intel") # think these next two are broken find_program(XIAR xiar) if(XIAR) @@ -1136,12 +1120,8 @@ if(PLATFORM_BUNDLED_LIBRARIES) # Environment variables to run precompiled executables that needed libraries. list(JOIN PLATFORM_BUNDLED_LIBRARY_DIRS ":" _library_paths) - set(PLATFORM_ENV_BUILD - "LD_LIBRARY_PATH=\"${_library_paths}:$LD_LIBRARY_PATH\"" - ) - set(PLATFORM_ENV_INSTALL - "LD_LIBRARY_PATH=${CMAKE_INSTALL_PREFIX_WITH_CONFIG}/lib/;$LD_LIBRARY_PATH" - ) + set(PLATFORM_ENV_BUILD "LD_LIBRARY_PATH=\"${_library_paths}:$LD_LIBRARY_PATH\"") + set(PLATFORM_ENV_INSTALL "LD_LIBRARY_PATH=${CMAKE_INSTALL_PREFIX_WITH_CONFIG}/lib/;$LD_LIBRARY_PATH") unset(_library_paths) else() # Quiet unused variable warnings, unfortunately this can't be empty. diff --git a/build_files/cmake/platform/platform_win32.cmake b/build_files/cmake/platform/platform_win32.cmake index 327c7bb655f..ccbd4d5008c 100644 --- a/build_files/cmake/platform/platform_win32.cmake +++ b/build_files/cmake/platform/platform_win32.cmake @@ -119,11 +119,7 @@ remove_cc_flag("/GR") add_definitions(-D_WIN32_WINNT=0x603) # First generate the manifest for tests since it will not need the dependency on the CRT. -configure_file( - ${CMAKE_SOURCE_DIR}/release/windows/manifest/blender.exe.manifest.in - ${CMAKE_CURRENT_BINARY_DIR}/tests.exe.manifest - @ONLY -) +configure_file(${CMAKE_SOURCE_DIR}/release/windows/manifest/blender.exe.manifest.in ${CMAKE_CURRENT_BINARY_DIR}/tests.exe.manifest @ONLY) # Always detect CRT paths, but only manually install with WITH_WINDOWS_BUNDLE_CRT. set(CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS_SKIP TRUE) @@ -156,11 +152,7 @@ endif() if(NOT WITH_PYTHON_MODULE) set(BUNDLECRT "${BUNDLECRT}") endif() -configure_file( - ${CMAKE_SOURCE_DIR}/release/windows/manifest/blender.exe.manifest.in - ${CMAKE_CURRENT_BINARY_DIR}/blender.exe.manifest - @ONLY -) +configure_file(${CMAKE_SOURCE_DIR}/release/windows/manifest/blender.exe.manifest.in ${CMAKE_CURRENT_BINARY_DIR}/blender.exe.manifest @ONLY) remove_cc_flag( "/MDd" @@ -170,10 +162,10 @@ remove_cc_flag( if(MSVC_CLANG) # Clangs version of cl doesn't support all flags string(APPEND CMAKE_CXX_FLAGS " ${CXX_WARN_FLAGS} /nologo /J /Gd /EHsc -Wno-unused-command-line-argument -Wno-microsoft-enum-forward-reference ") - string(APPEND CMAKE_C_FLAGS " /nologo /J /Gd -Wno-unused-command-line-argument -Wno-microsoft-enum-forward-reference") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /nologo /J /Gd -Wno-unused-command-line-argument -Wno-microsoft-enum-forward-reference") else() - string(APPEND CMAKE_CXX_FLAGS " /nologo /J /Gd /MP /EHsc /bigobj") - string(APPEND CMAKE_C_FLAGS " /nologo /J /Gd /MP /bigobj") + string(APPEND CMAKE_CXX_FLAGS " /nologo /J /Gd /MP /EHsc /bigobj /Zc:inline") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /nologo /J /Gd /MP /bigobj /Zc:inline") endif() # X64 ASAN is available and usable on MSVC 16.9 preview 4 and up) @@ -191,25 +183,9 @@ if(WITH_COMPILER_ASAN AND MSVC AND NOT MSVC_CLANG) endif() -# C++ standards conformace -# /permissive- : Available from MSVC 15.5 (1912) and up. Enables standards-confirming compiler -# behavior. Required until the project is marked as c++20. -# /Zc:__cplusplus : Available from MSVC 15.7 (1914) and up. Ensures correct value of the __cplusplus -# preprocessor macro. -# /Zc:inline : Enforces C++11 requirement that all functions declared 'inline' must have a -# definition available in the same translation unit if they're used. -# /Zc:preprocessor: Available from MSVC 16.5 (1925) and up. Enables standards-conforming -# preprocessor. +# C++ standards conformace (/permissive-) is available on msvc 15.5 (1912) and up if(NOT MSVC_CLANG) - string(APPEND CMAKE_CXX_FLAGS " /permissive- /Zc:__cplusplus /Zc:inline") - string(APPEND CMAKE_C_FLAGS " /Zc:inline") - - # For ARM64 devices, we need to tell MSVC to use the new preprocessor - # This is because sse2neon requires it. - if(CMAKE_SYSTEM_PROCESSOR STREQUAL "ARM64") - string(APPEND CMAKE_CXX_FLAGS " /Zc:preprocessor") - string(APPEND CMAKE_C_FLAGS " /Zc:preprocessor") - endif() + string(APPEND CMAKE_CXX_FLAGS " /permissive-") endif() if(WITH_WINDOWS_SCCACHE AND CMAKE_VS_MSBUILD_COMMAND) @@ -281,11 +257,7 @@ set(PLATFORM_LINKFLAGS_RELEASE "${PLATFORM_LINKFLAGS} ${PDB_INFO_OVERRIDE_LINKER string(APPEND CMAKE_STATIC_LINKER_FLAGS " /ignore:4221") if(CMAKE_CL_64) - if(CMAKE_SYSTEM_PROCESSOR STREQUAL "ARM64") - string(PREPEND PLATFORM_LINKFLAGS "/MACHINE:ARM64 ") - else() - string(PREPEND PLATFORM_LINKFLAGS "/MACHINE:X64 ") - endif() + string(PREPEND PLATFORM_LINKFLAGS "/MACHINE:X64 ") else() string(PREPEND PLATFORM_LINKFLAGS "/MACHINE:IX86 /LARGEADDRESSAWARE ") endif() @@ -294,11 +266,7 @@ if(NOT DEFINED LIBDIR) # Setup 64bit and 64bit windows systems if(CMAKE_CL_64) message(STATUS "64 bit compiler detected.") - if(CMAKE_SYSTEM_PROCESSOR STREQUAL "ARM64") - set(LIBDIR_BASE "windows_arm64") - else() - set(LIBDIR_BASE "windows_x64") - endif() + set(LIBDIR_BASE "windows_x64") else() message(FATAL_ERROR "32 bit compiler detected, blender no longer provides pre-build libraries for 32 bit windows, please set the LIBDIR cmake variable to your own library folder") endif() @@ -352,10 +320,7 @@ foreach(child ${children}) endforeach() if(WITH_PUGIXML) - set(PUGIXML_LIBRARIES - optimized ${LIBDIR}/pugixml/lib/pugixml.lib - debug ${LIBDIR}/pugixml/lib/pugixml_d.lib - ) + set(PUGIXML_LIBRARIES optimized ${LIBDIR}/pugixml/lib/pugixml.lib debug ${LIBDIR}/pugixml/lib/pugixml_d.lib) set(PUGIXML_INCLUDE_DIR ${LIBDIR}/pugixml/include) endif() @@ -413,10 +378,7 @@ if(WITH_HARFBUZZ) windows_find_package(Harfbuzz) if(NOT Harfbuzz_FOUND) set(LIBHARFBUZZ_INCLUDE_DIRS ${LIBDIR}/harfbuzz/include) - set(LIBHARFBUZZ_LIBRARIES - optimized ${LIBDIR}/harfbuzz/lib/libharfbuzz.lib - debug ${LIBDIR}/harfbuzz/lib/libharfbuzz_d.lib - ) + set(LIBHARFBUZZ_LIBRARIES optimized ${LIBDIR}/harfbuzz/lib/libharfbuzz.lib debug ${LIBDIR}/harfbuzz/lib/libharfbuzz_d.lib) set(Harfbuzz_FOUND ON) endif() endif() @@ -552,11 +514,7 @@ if(WITH_IMAGE_OPENEXR) warn_hardcoded_paths(OpenEXR) set(OPENEXR ${LIBDIR}/openexr) set(OPENEXR_INCLUDE_DIR ${OPENEXR}/include) - set(OPENEXR_INCLUDE_DIRS - ${OPENEXR_INCLUDE_DIR} - ${IMATH_INCLUDE_DIRS} - ${OPENEXR_INCLUDE_DIR}/OpenEXR - ) + set(OPENEXR_INCLUDE_DIRS ${OPENEXR_INCLUDE_DIR} ${IMATH_INCLUDE_DIRS} ${OPENEXR_INCLUDE_DIR}/OpenEXR) set(OPENEXR_LIBPATH ${OPENEXR}/lib) # Check if the blender 3.3 lib static library eixts # if not assume this is a 3.4+ dynamic version. @@ -592,10 +550,7 @@ if(WITH_JACK) ${LIBDIR}/jack/include/jack ${LIBDIR}/jack/include ) - set(JACK_LIBRARIES - optimized ${LIBDIR}/jack/lib/libjack.lib - debug ${LIBDIR}/jack/lib/libjack_d.lib - ) + set(JACK_LIBRARIES optimized ${LIBDIR}/jack/lib/libjack.lib debug ${LIBDIR}/jack/lib/libjack_d.lib) endif() set(_PYTHON_VERSION "3.11") @@ -629,10 +584,7 @@ if(WITH_PYTHON) set(NUMPY_FOUND ON) # uncached vars set(PYTHON_INCLUDE_DIRS "${PYTHON_INCLUDE_DIR}") - set(PYTHON_LIBRARIES - debug "${PYTHON_LIBRARY_DEBUG}" - optimized "${PYTHON_LIBRARY}" - ) + set(PYTHON_LIBRARIES debug "${PYTHON_LIBRARY_DEBUG}" optimized "${PYTHON_LIBRARY}" ) endif() if(NOT WITH_WINDOWS_FIND_MODULES) @@ -652,15 +604,9 @@ if(NOT WITH_WINDOWS_FIND_MODULES) if(NOT BOOST_VERSION) message(FATAL_ERROR "Unable to determine Boost version") endif() - if(CMAKE_SYSTEM_PROCESSOR STREQUAL "ARM64") - set(BOOST_POSTFIX "vc143-mt-a64-${BOOST_VERSION}") - set(BOOST_DEBUG_POSTFIX "vc143-mt-gyd-a64-${BOOST_VERSION}") - set(BOOST_PREFIX "") - else() - set(BOOST_POSTFIX "vc142-mt-x64-${BOOST_VERSION}") - set(BOOST_DEBUG_POSTFIX "vc142-mt-gyd-x64-${BOOST_VERSION}") - set(BOOST_PREFIX "") - endif() + set(BOOST_POSTFIX "vc142-mt-x64-${BOOST_VERSION}") + set(BOOST_DEBUG_POSTFIX "vc142-mt-gyd-x64-${BOOST_VERSION}") + set(BOOST_PREFIX "") endif() if(WITH_BOOST) @@ -679,9 +625,8 @@ if(WITH_BOOST) if(NOT Boost_FOUND) warn_hardcoded_paths(BOOST) # This is file new in 3.4 if it does not exist, assume we are building against 3.3 libs - # Note, as ARM64 was introduced in 4.x, this check is not needed set(BOOST_34_TRIGGER_FILE ${BOOST_LIBPATH}/${BOOST_PREFIX}boost_python${_PYTHON_VERSION_NO_DOTS}-${BOOST_DEBUG_POSTFIX}.lib) - if (NOT EXISTS ${BOOST_34_TRIGGER_FILE}) + if(NOT EXISTS ${BOOST_34_TRIGGER_FILE}) set(BOOST_DEBUG_POSTFIX "vc142-mt-gd-x64-${BOOST_VERSION}") set(BOOST_PREFIX "lib") endif() @@ -736,14 +681,8 @@ if(NOT OpenImageIO_FOUND) set(OPENIMAGEIO_LIBPATH ${OPENIMAGEIO}/lib) set(OPENIMAGEIO_INCLUDE_DIR ${OPENIMAGEIO}/include) set(OPENIMAGEIO_INCLUDE_DIRS ${OPENIMAGEIO_INCLUDE_DIR}) - set(OIIO_OPTIMIZED - optimized ${OPENIMAGEIO_LIBPATH}/OpenImageIO.lib - optimized ${OPENIMAGEIO_LIBPATH}/OpenImageIO_Util.lib - ) - set(OIIO_DEBUG - debug ${OPENIMAGEIO_LIBPATH}/OpenImageIO_d.lib - debug ${OPENIMAGEIO_LIBPATH}/OpenImageIO_Util_d.lib - ) + set(OIIO_OPTIMIZED optimized ${OPENIMAGEIO_LIBPATH}/OpenImageIO.lib optimized ${OPENIMAGEIO_LIBPATH}/OpenImageIO_Util.lib) + set(OIIO_DEBUG debug ${OPENIMAGEIO_LIBPATH}/OpenImageIO_d.lib debug ${OPENIMAGEIO_LIBPATH}/OpenImageIO_Util_d.lib) set(OPENIMAGEIO_LIBRARIES ${OIIO_OPTIMIZED} ${OIIO_DEBUG}) set(OPENIMAGEIO_TOOL "${OPENIMAGEIO}/bin/oiiotool.exe") endif() @@ -807,10 +746,7 @@ if(WITH_OPENVDB) set(OPENVDB ${LIBDIR}/openVDB) set(OPENVDB_LIBPATH ${OPENVDB}/lib) set(OPENVDB_INCLUDE_DIRS ${OPENVDB}/include) - set(OPENVDB_LIBRARIES - optimized ${OPENVDB_LIBPATH}/openvdb.lib - debug ${OPENVDB_LIBPATH}/openvdb_d.lib - ) + set(OPENVDB_LIBRARIES optimized ${OPENVDB_LIBPATH}/openvdb.lib debug ${OPENVDB_LIBPATH}/openvdb_d.lib ) endif() set(OPENVDB_DEFINITIONS -DNOMINMAX -D_USE_MATH_DEFINES) endif() @@ -834,10 +770,7 @@ if(WITH_OPENIMAGEDENOISE) get_target_property(OPENIMAGEDENOISE_LIBRARIES_RELEASE OpenImageDenoise IMPORTED_IMPLIB_RELEASE) get_target_property(OPENIMAGEDENOISE_LIBRARIES_DEBUG OpenImageDenoise IMPORTED_IMPLIB_DEBUG) if(EXISTS ${OPENIMAGEDENOISE_LIBRARIES_DEBUG}) - set(OPENIMAGEDENOISE_LIBRARIES - optimized ${OPENIMAGEDENOISE_LIBRARIES_RELEASE} - debug ${OPENIMAGEDENOISE_LIBRARIES_DEBUG} - ) + set(OPENIMAGEDENOISE_LIBRARIES optimized ${OPENIMAGEDENOISE_LIBRARIES_RELEASE} debug ${OPENIMAGEDENOISE_LIBRARIES_DEBUG}) else() if(EXISTS ${OPENIMAGEDENOISE_LIBRARIES_RELEASE}) set(OPENIMAGEDENOISE_LIBRARIES ${OPENIMAGEDENOISE_LIBRARIES_RELEASE}) @@ -872,10 +805,7 @@ if(WITH_ALEMBIC) set(ALEMBIC_INCLUDE_DIR ${ALEMBIC}/include) set(ALEMBIC_INCLUDE_DIRS ${ALEMBIC_INCLUDE_DIR}) set(ALEMBIC_LIBPATH ${ALEMBIC}/lib) - set(ALEMBIC_LIBRARIES - optimized ${ALEMBIC}/lib/Alembic.lib - debug ${ALEMBIC}/lib/Alembic_d.lib - ) + set(ALEMBIC_LIBRARIES optimized ${ALEMBIC}/lib/Alembic.lib debug ${ALEMBIC}/lib/Alembic_d.lib) set(ALEMBIC_FOUND 1) endif() @@ -925,17 +855,11 @@ endif() if(WITH_TBB) windows_find_package(TBB) if(NOT TBB_FOUND) - set(TBB_LIBRARIES - optimized ${LIBDIR}/tbb/lib/tbb.lib - debug ${LIBDIR}/tbb/lib/tbb_debug.lib - ) + set(TBB_LIBRARIES optimized ${LIBDIR}/tbb/lib/tbb.lib debug ${LIBDIR}/tbb/lib/tbb_debug.lib) set(TBB_INCLUDE_DIR ${LIBDIR}/tbb/include) set(TBB_INCLUDE_DIRS ${TBB_INCLUDE_DIR}) if(WITH_TBB_MALLOC_PROXY) - set(TBB_MALLOC_LIBRARIES - optimized ${LIBDIR}/tbb/lib/tbbmalloc.lib - debug ${LIBDIR}/tbb/lib/tbbmalloc_debug.lib - ) + set(TBB_MALLOC_LIBRARIES optimized ${LIBDIR}/tbb/lib/tbbmalloc.lib debug ${LIBDIR}/tbb/lib/tbbmalloc_debug.lib) add_definitions(-DWITH_TBB_MALLOC) endif() endif() @@ -969,15 +893,6 @@ if(WITH_CODEC_SNDFILE) endif() endif() -if(WITH_CPU_SIMD AND SUPPORT_NEON_BUILD) - windows_find_package(sse2neon) - if(NOT SSE2NEON_FOUND) - set(SSE2NEON_ROOT_DIR ${LIBDIR}/sse2neon) - set(SSE2NEON_INCLUDE_DIRS ${LIBDIR}/sse2neon) - set(SSE2NEON_FOUND True) - endif() -endif() - if(WITH_CYCLES AND WITH_CYCLES_OSL) set(CYCLES_OSL ${LIBDIR}/osl CACHE PATH "Path to OpenShadingLanguage installation") set(OSL_SHADER_DIR ${CYCLES_OSL}/shaders) @@ -1187,15 +1102,9 @@ if(WITH_XR_OPENXR) # 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 - ) + 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 - ) + set(XR_OPENXR_SDK_LIBRARIES optimized ${XR_OPENXR_SDK_LIBPATH}/openxr_loader.lib debug ${XR_OPENXR_SDK_LIBPATH}/openxr_loaderd.lib) endif() endif() @@ -1206,10 +1115,7 @@ if(WITH_GMP) else() set(GMP_DLL_LIB_NAME libgmp-10.lib) endif() - set(GMP_LIBRARIES ${LIBDIR}/gmp/lib/${GMP_DLL_LIB_NAME} - optimized ${LIBDIR}/gmp/lib/libgmpxx.lib - debug ${LIBDIR}/gmp/lib/libgmpxx_d.lib - ) + set(GMP_LIBRARIES ${LIBDIR}/gmp/lib/${GMP_DLL_LIB_NAME} optimized ${LIBDIR}/gmp/lib/libgmpxx.lib debug ${LIBDIR}/gmp/lib/libgmpxx_d.lib) set(GMP_ROOT_DIR ${LIBDIR}/gmp) set(GMP_FOUND ON) endif() @@ -1263,10 +1169,7 @@ if(WITH_CYCLES AND WITH_CYCLES_PATH_GUIDING) if(openpgl_FOUND) get_target_property(OPENPGL_LIBRARIES_RELEASE openpgl::openpgl LOCATION_RELEASE) get_target_property(OPENPGL_LIBRARIES_DEBUG openpgl::openpgl LOCATION_DEBUG) - set(OPENPGL_LIBRARIES - optimized ${OPENPGL_LIBRARIES_RELEASE} - debug ${OPENPGL_LIBRARIES_DEBUG} - ) + set(OPENPGL_LIBRARIES optimized ${OPENPGL_LIBRARIES_RELEASE} debug ${OPENPGL_LIBRARIES_DEBUG}) get_target_property(OPENPGL_INCLUDE_DIR openpgl::openpgl INTERFACE_INCLUDE_DIRECTORIES) else() set(WITH_CYCLES_PATH_GUIDING OFF) @@ -1305,10 +1208,7 @@ if(WITH_CYCLES AND (WITH_CYCLES_DEVICE_ONEAPI OR (WITH_CYCLES_EMBREE AND EMBREE_ list(APPEND PLATFORM_BUNDLED_LIBRARIES ${_sycl_runtime_libraries}) unset(_sycl_runtime_libraries) - set(SYCL_LIBRARIES - optimized ${SYCL_LIBRARY} - debug ${SYCL_LIBRARY_DEBUG} - ) + set(SYCL_LIBRARIES optimized ${SYCL_LIBRARY} debug ${SYCL_LIBRARY_DEBUG}) endif() @@ -1316,7 +1216,6 @@ endif() list(JOIN PLATFORM_BUNDLED_LIBRARY_DIRS ";" _library_paths) set(PLATFORM_ENV_BUILD_DIRS "${LIBDIR}/epoxy/bin\;${LIBDIR}/tbb/bin\;${LIBDIR}/OpenImageIO/bin\;${LIBDIR}/boost/lib\;${LIBDIR}/openexr/bin\;${LIBDIR}/imath/bin\;${LIBDIR}/shaderc/bin\;${PATH}") set(PLATFORM_ENV_BUILD "PATH=${PLATFORM_ENV_BUILD_DIRS}") -# Install needs the additional folders from PLATFORM_ENV_BUILD_DIRS as well, as tools like: -# `idiff` and `abcls` use the release mode dlls. +# Install needs the additional folders from PLATFORM_ENV_BUILD_DIRS as well, as tools like idiff and abcls use the release mode dlls set(PLATFORM_ENV_INSTALL "PATH=${CMAKE_INSTALL_PREFIX_WITH_CONFIG}/blender.shared/\;${PLATFORM_ENV_BUILD_DIRS}\;$ENV{PATH}") unset(_library_paths) diff --git a/build_files/cmake/testing.cmake b/build_files/cmake/testing.cmake index a123756cf59..73ae6d8396a 100644 --- a/build_files/cmake/testing.cmake +++ b/build_files/cmake/testing.cmake @@ -27,8 +27,8 @@ function(blender_test_set_envvars testname envvars_list) if(NOT CMAKE_BUILD_TYPE MATCHES "Release") if(WITH_COMPILER_ASAN) set(_lsan_options "LSAN_OPTIONS=print_suppressions=false:suppressions=${CMAKE_SOURCE_DIR}/tools/config/analysis/lsan.supp") - # FIXME: That `allocator_may_return_null=true` ASAN option is only needed for the - # `guardedalloc` test, would be nice to allow tests definition to pass extra envvars better. + # FIXME That `allocator_may_return_null=true` ASAN option is only needed for the `guardedalloc` test, + # would be nice to allow tests definition to pass extra envvars better. set(_asan_options "ASAN_OPTIONS=allocator_may_return_null=true") if(DEFINED ENV{LSAN_OPTIONS}) set(_lsan_options "${_lsan_options}:$ENV{LSAN_OPTIONS}") diff --git a/build_files/utils/make_source_archive.py b/build_files/utils/make_source_archive.py index ac6b1f73228..7b405c815ed 100755 --- a/build_files/utils/make_source_archive.py +++ b/build_files/utils/make_source_archive.py @@ -8,7 +8,6 @@ import make_utils import os import re import subprocess -import sys from pathlib import Path from typing import Iterable, TextIO, Optional, Any, Union @@ -177,14 +176,9 @@ def create_tarball( packages_dir: Optional[Path], ) -> None: print(f'Creating archive: "{tarball}" ...', end="", flush=True) + command = ["tar"] # Requires GNU `tar`, since `--transform` is used. - if sys.platform == "darwin": - # Provided by `brew install gnu-tar`. - command = ["gtar"] - else: - command = ["tar"] - if packages_dir: command += ["--transform", f"s,{packages_dir}/,packages/,g"] diff --git a/build_files/windows/check_libraries.cmd b/build_files/windows/check_libraries.cmd index 1ef19e6a827..8c92ac72aa8 100644 --- a/build_files/windows/check_libraries.cmd +++ b/build_files/windows/check_libraries.cmd @@ -1,8 +1,4 @@ -if "%BUILD_ARCH%" == "arm64" ( - set BUILD_VS_LIBDIR=lib/windows_arm64 -) else ( - set BUILD_VS_LIBDIR=lib/windows_x64 -) +set BUILD_VS_LIBDIR=lib/windows_x64 if NOT "%verbose%" == "" ( echo Library Directory = "%BUILD_VS_LIBDIR%" diff --git a/build_files/windows/configure_msbuild.cmd b/build_files/windows/configure_msbuild.cmd index d4be40aff4f..9fbdef25641 100644 --- a/build_files/windows/configure_msbuild.cmd +++ b/build_files/windows/configure_msbuild.cmd @@ -19,11 +19,6 @@ if "%WITH_PYDEBUG%"=="1" ( set PYDEBUG_CMAKE_ARGS=-DWINDOWS_PYTHON_DEBUG=On ) -if "%BUILD_ARCH%"=="arm64" ( - set MSBUILD_PLATFORM=arm64 - set BUILD_PLATFORM_SELECT=-A ARM64 -) - set BUILD_CMAKE_ARGS=%BUILD_CMAKE_ARGS% -G "Visual Studio %BUILD_VS_VER% %BUILD_VS_YEAR%%BUILD_GENERATOR_POST%" %BUILD_PLATFORM_SELECT% %TESTS_CMAKE_ARGS% %CLANG_CMAKE_ARGS% %ASAN_CMAKE_ARGS% %PYDEBUG_CMAKE_ARGS% if NOT EXIST %BUILD_DIR%\nul ( diff --git a/build_files/windows/detect_architecture.cmd b/build_files/windows/detect_architecture.cmd index c78575f3605..42663ef2d29 100644 --- a/build_files/windows/detect_architecture.cmd +++ b/build_files/windows/detect_architecture.cmd @@ -5,18 +5,12 @@ if "%BUILD_ARCH%"=="" ( ) else if "%PROCESSOR_ARCHITEW6432%" == "AMD64" ( set WINDOWS_ARCH= Win64 set BUILD_ARCH=x64 - ) else if "%PROCESSOR_ARCHITECTURE%" == "ARM64" ( - set WINDOWS_ARCH= arm64 - set BUILD_ARCH=arm64 ) else ( echo Error: 32 bit builds of blender are no longer supported. goto ERR ) ) else if "%BUILD_ARCH%"=="x64" ( set WINDOWS_ARCH= Win64 -) else if "%BUILD_ARCH%"=="arm64" ( - set WINDOWS_ARCH= arm64 - set BUILD_ARCH=arm64 ) :EOF exit /b 0 diff --git a/build_files/windows/doc_py.cmd b/build_files/windows/doc_py.cmd index d09c348d997..d33a0289083 100644 --- a/build_files/windows/doc_py.cmd +++ b/build_files/windows/doc_py.cmd @@ -26,7 +26,7 @@ exit /b 1 :detect_blender_done %BLENDER_BIN% ^ - --background --factory-startup ^ + --background -noaudio --factory-startup ^ --python %BLENDER_DIR%/doc/python_api/sphinx_doc_gen.py "%SPHINX_BIN%" -b html %SPHINXOPTS% %O% %SOURCEDIR% %BUILDDIR% diff --git a/build_files/windows/find_dependencies.cmd b/build_files/windows/find_dependencies.cmd index 88c0fa6ba2b..c697da2bccf 100644 --- a/build_files/windows/find_dependencies.cmd +++ b/build_files/windows/find_dependencies.cmd @@ -23,24 +23,6 @@ if EXIST %PYTHON% ( goto detect_python_done ) -rem Additionally check for the ARM64 version -set PYTHON=%BLENDER_DIR%\lib\windows_arm64\python\310\bin\python.exe -if EXIST %PYTHON% ( - goto detect_python_done -) -set PYTHON=%BLENDER_DIR%\lib\windows_arm64\python\311\bin\python.exe -if EXIST %PYTHON% ( - goto detect_python_done -) -set PYTHON=%BLENDER_DIR%\lib\windows_arm64\python\312\bin\python.exe -if EXIST %PYTHON% ( - goto detect_python_done -) -set PYTHON=%BLENDER_DIR%\lib\windows_arm64\python\39\bin\python.exe -if EXIST %PYTHON% ( - goto detect_python_done -) - if NOT EXIST %PYTHON% ( if EXIST %BLENDER_DIR%\lib\windows_x64\.git ( echo Warning: Python not found, there is likely an issue with the library folder diff --git a/build_files/windows/format.cmd b/build_files/windows/format.cmd index d276521d83e..4546b04c295 100644 --- a/build_files/windows/format.cmd +++ b/build_files/windows/format.cmd @@ -3,11 +3,6 @@ if EXIST %BLENDER_DIR%\lib\windows_x64\llvm\bin\clang-format.exe ( goto detect_done ) -if EXIST %BLENDER_DIR%\lib\windows_arm64\llvm\bin\clang-format.exe ( - set CF_PATH=lib\windows_arm64\llvm\bin - goto detect_done -) - echo clang-format not found exit /b 1 diff --git a/build_files/windows/parse_arguments.cmd b/build_files/windows/parse_arguments.cmd index 937c56768a5..40a1c9dce11 100644 --- a/build_files/windows/parse_arguments.cmd +++ b/build_files/windows/parse_arguments.cmd @@ -50,8 +50,6 @@ if NOT "%1" == "" ( goto ERR ) else if "%1" == "x64" ( set BUILD_ARCH=x64 - ) else if "%1" == "arm64" ( - set BUILD_ARCH=arm64 ) else if "%1" == "2019" ( set BUILD_VS_YEAR=2019 ) else if "%1" == "2019pre" ( diff --git a/build_files/windows/show_hashes.cmd b/build_files/windows/show_hashes.cmd index 04a234b8207..a4d8d36e06c 100644 --- a/build_files/windows/show_hashes.cmd +++ b/build_files/windows/show_hashes.cmd @@ -9,11 +9,7 @@ cd "%BLENDER_DIR%/scripts/addons" for /f "delims=" %%i in ('"%GIT%" rev-parse --abbrev-ref HEAD') do echo Addons_Branch_name=%%i for /f "delims=" %%i in ('"%GIT%" rev-parse HEAD') do echo Addons_Branch_hash=%%i -if "%BUILD_ARCH%" == "arm64" ( - cd "%BLENDER_DIR%/lib/windows_arm64" -) else ( - cd "%BLENDER_DIR%/lib/windows_x64" -) +cd "%BLENDER_DIR%/lib/windows_x64" for /f "delims=" %%i in ('"%GIT%" rev-parse --abbrev-ref HEAD') do echo Libs_Branch_name=%%i for /f "delims=" %%i in ('"%GIT%" rev-parse HEAD') do echo Libs_Branch_hash=%%i diff --git a/doc/blender_file_format/BlendFileDnaExporter_25.py b/doc/blender_file_format/BlendFileDnaExporter_25.py index f51ecf5c8a4..6aabbdc22b0 100755 --- a/doc/blender_file_format/BlendFileDnaExporter_25.py +++ b/doc/blender_file_format/BlendFileDnaExporter_25.py @@ -363,15 +363,15 @@ class DNACatalogHTML: def usage(): - print("\nUsage: \n\tblender2.5 --background --python BlendFileDnaExporter_25.py [-- [options]]") + print("\nUsage: \n\tblender2.5 --background -noaudio --python BlendFileDnaExporter_25.py [-- [options]]") print("Options:") print("\t--dna-keep-blend: doesn't delete the produced blend file DNA export to html") print("\t--dna-debug: sets the logging level to DEBUG (lots of additional info)") print("\t--dna-versioned saves version information in the html and blend filenames") print("\t--dna-overwrite-css overwrite dna.css, useful when modifying css in the script") print("Examples:") - print("\tdefault: % blender2.5 --background --python BlendFileDnaExporter_25.py") - print("\twith options: % blender2.5 --background --python BlendFileDnaExporter_25.py -- --dna-keep-blend --dna-debug\n") + print("\tdefault: % blender2.5 --background -noaudio --python BlendFileDnaExporter_25.py") + print("\twith options: % blender2.5 --background -noaudio --python BlendFileDnaExporter_25.py -- --dna-keep-blend --dna-debug\n") ###################################################### diff --git a/doc/blender_file_format/README b/doc/blender_file_format/README index 25bb189d980..531756eb34a 100644 --- a/doc/blender_file_format/README +++ b/doc/blender_file_format/README @@ -16,14 +16,14 @@ Below you have the help message with a list of options you can use. Usage: - blender2.5 --background --python BlendFileDnaExporter_25.py [-- [options]] + blender2.5 --background -noaudio --python BlendFileDnaExporter_25.py [-- [options]] Options: --dna-keep-blend: doesn't delete the produced blend file DNA export to html --dna-debug: sets the logging level to DEBUG (lots of additional info) --dna-versioned saves version information in the html and blend filenames --dna-overwrite-css overwrite dna.css, useful when modifying css in the script Examples: - default: % blender2.5 --background --python BlendFileDnaExporter_25.py - with options: % blender2.5 --background --python BlendFileDnaExporter_25.py -- --dna-keep-blend --dna-debug + default: % blender2.5 --background -noaudio --python BlendFileDnaExporter_25.py + with options: % blender2.5 --background -noaudio --python BlendFileDnaExporter_25.py -- --dna-keep-blend --dna-debug diff --git a/doc/doxygen/Doxyfile b/doc/doxygen/Doxyfile index 51d461628a9..80eaa0ec556 100644 --- a/doc/doxygen/Doxyfile +++ b/doc/doxygen/Doxyfile @@ -38,7 +38,7 @@ PROJECT_NAME = Blender # could be handy for archiving the generated documentation or if some version # control system is used. -PROJECT_NUMBER = V4.2 +PROJECT_NUMBER = V4.1 # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer a diff --git a/doc/python_api/examples/bpy.utils.register_cli_command.1.py b/doc/python_api/examples/bpy.utils.register_cli_command.1.py deleted file mode 100644 index 05227853a2a..00000000000 --- a/doc/python_api/examples/bpy.utils.register_cli_command.1.py +++ /dev/null @@ -1,73 +0,0 @@ -""" -**Using Python Argument Parsing** - -This example shows how the Python ``argparse`` module can be used with a custom command. - -Using ``argparse`` is generally recommended as it has many useful utilities and -generates a ``--help`` message for your command. -""" - -import os -import sys - -import bpy - - -def argparse_create(): - import argparse - - parser = argparse.ArgumentParser( - prog=os.path.basename(sys.argv[0]) + " --command keyconfig_export", - description="Write key-configuration to a file.", - ) - - parser.add_argument( - "-o", "--output", - dest="output", - metavar='OUTPUT', - type=str, - help="The path to write the keymap to.", - required=True, - ) - - parser.add_argument( - "-a", "--all", - dest="all", - action="store_true", - help="Write all key-maps (not only customized key-maps).", - required=False, - ) - - return parser - - -def keyconfig_export(argv): - parser = argparse_create() - args = parser.parse_args(argv) - - # Ensure the key configuration is loaded in background mode. - bpy.utils.keyconfig_init() - - bpy.ops.preferences.keyconfig_export( - filepath=args.output, - all=args.all, - ) - - return 0 - - -cli_commands = [] - - -def register(): - cli_commands.append(bpy.utils.register_cli_command("keyconfig_export", keyconfig_export)) - - -def unregister(): - for cmd in cli_commands: - bpy.utils.unregister_cli_command(cmd) - cli_commands.clear() - - -if __name__ == "__main__": - register() diff --git a/doc/python_api/examples/bpy.utils.register_cli_command.py b/doc/python_api/examples/bpy.utils.register_cli_command.py deleted file mode 100644 index fe9fb55ddfc..00000000000 --- a/doc/python_api/examples/bpy.utils.register_cli_command.py +++ /dev/null @@ -1,42 +0,0 @@ -""" -**Custom Commands** - -Registering commands makes it possible to conveniently expose command line -functionality via commands passed to (``-c`` / ``--command``). -""" - -import sys -import os - - -def sysinfo_command(argv): - import tempfile - import sys_info - - if argv and argv[0] == "--help": - print("Print system information & exit!") - return 0 - - with tempfile.TemporaryDirectory() as tempdir: - filepath = os.path.join(tempdir, "system_info.txt") - sys_info.write_sysinfo(filepath) - with open(filepath, "r", encoding="utf-8") as fh: - sys.stdout.write(fh.read()) - return 0 - - -cli_commands = [] - - -def register(): - cli_commands.append(bpy.utils.register_cli_command("sysinfo", sysinfo_command)) - - -def unregister(): - for cmd in cli_commands: - bpy.utils.unregister_cli_command(cmd) - cli_commands.clear() - - -if __name__ == "__main__": - register() diff --git a/doc/python_api/rst/include__bmesh.rst b/doc/python_api/rst/include__bmesh.rst index e42255424fd..e8cd23e41da 100644 --- a/doc/python_api/rst/include__bmesh.rst +++ b/doc/python_api/rst/include__bmesh.rst @@ -1,7 +1,7 @@ .. This document is appended to the auto generated BMesh API doc to avoid clogging up the C files with details. to test this run: - ./blender.bin -b -P doc/python_api/sphinx_doc_gen.py -- \ + ./blender.bin -b -noaudio -P doc/python_api/sphinx_doc_gen.py -- \ --partial bmesh* ; cd doc/python_api ; sphinx-build sphinx-in sphinx-out ; cd ../../ diff --git a/doc/python_api/rst_from_bmesh_opdefines.py b/doc/python_api/rst_from_bmesh_opdefines.py index f84224830db..81a90798355 100644 --- a/doc/python_api/rst_from_bmesh_opdefines.py +++ b/doc/python_api/rst_from_bmesh_opdefines.py @@ -252,7 +252,8 @@ def main(): name, tp = arg tp_sub = None else: - assert False, "unreachable, unsupported 'arg' length found %d" % len(arg) + print(arg) + assert 0 tp_str = "" @@ -321,7 +322,8 @@ def main(): # but think the idea is that that pointer is for any type? tp_str = ":class:`bpy.types.bpy_struct`" else: - assert False, "unreachable, unknown type %r" % vars_dict_reverse[tp_sub] + print("Can't find", vars_dict_reverse[tp_sub]) + assert 0 elif tp == BMO_OP_SLOT_ELEMENT_BUF: assert tp_sub is not None @@ -360,9 +362,11 @@ def main(): elif tp_sub == BMO_OP_SLOT_SUBTYPE_MAP_INTERNAL: tp_str += "unknown internal data, not compatible with python" else: - assert False, "unreachable, unknown type %r" % vars_dict_reverse[tp_sub] + print("Can't find", vars_dict_reverse[tp_sub]) + assert 0 else: - assert False, "unreachable, unknown type %r" % vars_dict_reverse[tp] + print("Can't find", vars_dict_reverse[tp]) + assert 0 args_wash.append((name, default_value, tp_str, comment)) return args_wash diff --git a/doc/python_api/sphinx_doc_gen.py b/doc/python_api/sphinx_doc_gen.py index 637a1c7ffa9..0a7702bf09c 100644 --- a/doc/python_api/sphinx_doc_gen.py +++ b/doc/python_api/sphinx_doc_gen.py @@ -7,7 +7,7 @@ API dump in RST files --------------------- Run this script from Blender's root path once you have compiled Blender - blender --background --factory-startup --python doc/python_api/sphinx_doc_gen.py + blender --background --factory-startup -noaudio --python doc/python_api/sphinx_doc_gen.py This will generate python files in doc/python_api/sphinx-in/ providing ./blender is or links to the blender executable @@ -239,12 +239,12 @@ BPY_LOGGER.setLevel(logging.DEBUG) """ # for quick rebuilds rm -rf /b/doc/python_api/sphinx-* && \ -./blender -b --factory-startup -P doc/python_api/sphinx_doc_gen.py && \ +./blender -b -noaudio --factory-startup -P doc/python_api/sphinx_doc_gen.py && \ sphinx-build doc/python_api/sphinx-in doc/python_api/sphinx-out or -./blender -b --factory-startup -P doc/python_api/sphinx_doc_gen.py -- -f -B +./blender -b -noaudio --factory-startup -P doc/python_api/sphinx_doc_gen.py -- -f -B """ # Switch for quick testing so doc-builds don't take so long. diff --git a/extern/CMakeLists.txt b/extern/CMakeLists.txt index 30842f32441..6040c5f938b 100644 --- a/extern/CMakeLists.txt +++ b/extern/CMakeLists.txt @@ -55,7 +55,8 @@ if(WITH_LZMA) add_subdirectory(lzma) endif() -if(WITH_CYCLES OR WITH_OPENSUBDIV) +if(WITH_CYCLES OR WITH_COMPOSITOR_CPU OR WITH_OPENSUBDIV) + add_subdirectory(clew) if((WITH_CYCLES_DEVICE_CUDA OR WITH_CYCLES_DEVICE_OPTIX) AND WITH_CUDA_DYNLOAD) add_subdirectory(cuew) endif() diff --git a/extern/README b/extern/README index 75c1e0393ca..f904fc3e41e 100644 --- a/extern/README +++ b/extern/README @@ -1,4 +1,4 @@ When updating a library remember to: * Update the README.blender with the corresponding version. -* Update the THIRD-PARTY-LICENSES.txt document +* Update the THIRD-PARTY-LICENSE.txt document diff --git a/extern/audaspace/CMakeLists.txt b/extern/audaspace/CMakeLists.txt index 555278b2161..ea16fbf8fd2 100644 --- a/extern/audaspace/CMakeLists.txt +++ b/extern/audaspace/CMakeLists.txt @@ -40,7 +40,6 @@ set(SRC src/devices/DefaultSynchronizer.cpp src/devices/DeviceManager.cpp src/devices/NULLDevice.cpp - src/devices/OpenCloseDevice.cpp src/devices/ReadDevice.cpp src/devices/SoftwareDevice.cpp src/devices/ThreadedDevice.cpp @@ -151,7 +150,6 @@ set(PUBLIC_HDR include/devices/IHandle.h include/devices/ISynchronizer.h include/devices/NULLDevice.h - include/devices/OpenCloseDevice.h include/devices/ReadDevice.h include/devices/SoftwareDevice.h include/devices/ThreadedDevice.h diff --git a/extern/audaspace/README.blender b/extern/audaspace/README.blender index ce0dfc10a17..a60fb218d9f 100644 --- a/extern/audaspace/README.blender +++ b/extern/audaspace/README.blender @@ -1,5 +1,5 @@ Project: Audaspace URL: https://github.com/audaspace/audaspace License: Apache 2.0 -Upstream version: 1.4+ (ae29ce2, 2024 Feb 26) -Local modifications: none +Upstream version: 1.4+ (0d18fe7, 2024 Jan 2) +Local modifications: JOSResampleReader default quality set to MEDIUM diff --git a/extern/audaspace/bindings/C/AUD_Sound.cpp b/extern/audaspace/bindings/C/AUD_Sound.cpp index 06ed6de6693..dbedd0045b5 100644 --- a/extern/audaspace/bindings/C/AUD_Sound.cpp +++ b/extern/audaspace/bindings/C/AUD_Sound.cpp @@ -560,7 +560,7 @@ AUD_API AUD_Sound* AUD_Sound_rechannel(AUD_Sound* sound, AUD_Channels channels) } } -AUD_API AUD_Sound* AUD_Sound_resample(AUD_Sound* sound, AUD_SampleRate rate, AUD_ResampleQuality quality) +AUD_API AUD_Sound* AUD_Sound_resample(AUD_Sound* sound, AUD_SampleRate rate, bool high_quality) { assert(sound); @@ -570,14 +570,10 @@ AUD_API AUD_Sound* AUD_Sound_resample(AUD_Sound* sound, AUD_SampleRate rate, AUD specs.channels = CHANNELS_INVALID; specs.rate = rate; specs.format = FORMAT_INVALID; - if (quality == AUD_RESAMPLE_QUALITY_FASTEST) - { - return new AUD_Sound(new LinearResample(*sound, specs)); - } + if(high_quality) + return new AUD_Sound(new JOSResample(*sound, specs)); else - { - return new AUD_Sound(new JOSResample(*sound, specs, static_cast(quality))); - } + return new AUD_Sound(new LinearResample(*sound, specs)); } catch(Exception&) { diff --git a/extern/audaspace/bindings/C/AUD_Sound.h b/extern/audaspace/bindings/C/AUD_Sound.h index e8a41e8ae7b..dd4fad85122 100644 --- a/extern/audaspace/bindings/C/AUD_Sound.h +++ b/extern/audaspace/bindings/C/AUD_Sound.h @@ -300,10 +300,10 @@ extern AUD_API AUD_Sound* AUD_Sound_rechannel(AUD_Sound* sound, AUD_Channels cha * Resamples the sound. * \param sound The sound to resample. * \param rate The new sample rate. - * \param quality Resampling quality vs performance choice. + * \param high_quality When true use a higher quality but slower resampler. * \return The resampled sound. */ -extern AUD_API AUD_Sound* AUD_Sound_resample(AUD_Sound* sound, AUD_SampleRate rate, AUD_ResampleQuality quality); +extern AUD_API AUD_Sound* AUD_Sound_resample(AUD_Sound* sound, AUD_SampleRate rate, bool high_quality); /** * Reverses a sound. Make sure the sound source can be reversed. diff --git a/extern/audaspace/bindings/C/AUD_Special.cpp b/extern/audaspace/bindings/C/AUD_Special.cpp index 0e94f80ccda..a5ecb7a6dc0 100644 --- a/extern/audaspace/bindings/C/AUD_Special.cpp +++ b/extern/audaspace/bindings/C/AUD_Special.cpp @@ -270,14 +270,14 @@ AUD_API int AUD_readSound(AUD_Sound* sound, float* buffer, int length, int sampl return length; } -AUD_API int AUD_mixdown(AUD_Sound* sound, unsigned int start, unsigned int length, unsigned int buffersize, const char* filename, AUD_DeviceSpecs specs, AUD_Container format, AUD_Codec codec, unsigned int bitrate, AUD_ResampleQuality quality, void(*callback)(float, void*), void* data, char* error, size_t errorsize) +AUD_API int AUD_mixdown(AUD_Sound* sound, unsigned int start, unsigned int length, unsigned int buffersize, const char* filename, AUD_DeviceSpecs specs, AUD_Container format, AUD_Codec codec, unsigned int bitrate, void(*callback)(float, void*), void* data, char* error, size_t errorsize) { try { Sequence* f = dynamic_cast(sound->get()); f->setSpecs(convCToSpec(specs.specs)); - std::shared_ptr reader = f->createQualityReader(static_cast(quality)); + std::shared_ptr reader = f->createQualityReader(); reader->seek(start); std::shared_ptr writer = FileWriter::createWriter(filename, convCToDSpec(specs), static_cast(format), static_cast(codec), bitrate); FileWriter::writeReader(reader, writer, length, buffersize, callback, data); @@ -295,7 +295,7 @@ AUD_API int AUD_mixdown(AUD_Sound* sound, unsigned int start, unsigned int lengt } } -AUD_API int AUD_mixdown_per_channel(AUD_Sound* sound, unsigned int start, unsigned int length, unsigned int buffersize, const char* filename, AUD_DeviceSpecs specs, AUD_Container format, AUD_Codec codec, unsigned int bitrate, AUD_ResampleQuality quality, void(*callback)(float, void*), void* data, char* error, size_t errorsize) +AUD_API int AUD_mixdown_per_channel(AUD_Sound* sound, unsigned int start, unsigned int length, unsigned int buffersize, const char* filename, AUD_DeviceSpecs specs, AUD_Container format, AUD_Codec codec, unsigned int bitrate, void(*callback)(float, void*), void* data, char* error, size_t errorsize) { try { @@ -329,7 +329,7 @@ AUD_API int AUD_mixdown_per_channel(AUD_Sound* sound, unsigned int start, unsign writers.push_back(FileWriter::createWriter(stream.str(), convCToDSpec(specs), static_cast(format), static_cast(codec), bitrate)); } - std::shared_ptr reader = f->createQualityReader(static_cast(quality)); + std::shared_ptr reader = f->createQualityReader(); reader->seek(start); FileWriter::writeReader(reader, writers, length, buffersize, callback, data); @@ -346,19 +346,19 @@ AUD_API int AUD_mixdown_per_channel(AUD_Sound* sound, unsigned int start, unsign } } -AUD_API AUD_Device* AUD_openMixdownDevice(AUD_DeviceSpecs specs, AUD_Sound* sequencer, float volume, AUD_ResampleQuality quality, double start) +AUD_API AUD_Device* AUD_openMixdownDevice(AUD_DeviceSpecs specs, AUD_Sound* sequencer, float volume, double start) { try { ReadDevice* device = new ReadDevice(convCToDSpec(specs)); - device->setQuality(static_cast(quality)); + device->setQuality(true); device->setVolume(volume); Sequence* f = dynamic_cast(sequencer->get()); f->setSpecs(convCToSpec(specs.specs)); - AUD_Handle handle = device->play(f->createQualityReader(static_cast(quality))); + AUD_Handle handle = device->play(f->createQualityReader()); if(handle.get()) { handle->seek(start); diff --git a/extern/audaspace/bindings/C/AUD_Special.h b/extern/audaspace/bindings/C/AUD_Special.h index 72139e956a1..f9a239acd61 100644 --- a/extern/audaspace/bindings/C/AUD_Special.h +++ b/extern/audaspace/bindings/C/AUD_Special.h @@ -69,7 +69,6 @@ extern AUD_API int AUD_readSound(AUD_Sound* sound, float* buffer, int length, in * \param format The file's container format. * \param codec The codec used for encoding the audio data. * \param bitrate The bitrate for encoding. - * \param quality The resampling quality. * \param callback A callback function that is called periodically during mixdown, reporting progress if length > 0. Can be NULL. * \param data Pass through parameter that is passed to the callback. * \param error String buffer to copy the error message to in case of failure. @@ -79,7 +78,7 @@ extern AUD_API int AUD_readSound(AUD_Sound* sound, float* buffer, int length, in extern AUD_API int AUD_mixdown(AUD_Sound* sound, unsigned int start, unsigned int length, unsigned int buffersize, const char* filename, AUD_DeviceSpecs specs, AUD_Container format, - AUD_Codec codec, unsigned int bitrate, AUD_ResampleQuality quality, + AUD_Codec codec, unsigned int bitrate, void(*callback)(float, void*), void* data, char* error, size_t errorsize); /** @@ -93,7 +92,6 @@ extern AUD_API int AUD_mixdown(AUD_Sound* sound, unsigned int start, unsigned in * \param format The file's container format. * \param codec The codec used for encoding the audio data. * \param bitrate The bitrate for encoding. - * \param quality The resampling quality. * \param callback A callback function that is called periodically during mixdown, reporting progress if length > 0. Can be NULL. * \param data Pass through parameter that is passed to the callback. * \param error String buffer to copy the error message to in case of failure. @@ -103,7 +101,7 @@ extern AUD_API int AUD_mixdown(AUD_Sound* sound, unsigned int start, unsigned in extern AUD_API int AUD_mixdown_per_channel(AUD_Sound* sound, unsigned int start, unsigned int length, unsigned int buffersize, const char* filename, AUD_DeviceSpecs specs, AUD_Container format, - AUD_Codec codec, unsigned int bitrate, AUD_ResampleQuality quality, + AUD_Codec codec, unsigned int bitrate, void(*callback)(float, void*), void* data, char* error, size_t errorsize); /** @@ -111,12 +109,10 @@ extern AUD_API int AUD_mixdown_per_channel(AUD_Sound* sound, unsigned int start, * \param specs Output audio specifications. * \param sequencer The sound scene to mix down. * \param volume The overall mixdown volume. - * \param quality The resampling quality. * \param start The start time of the mixdown in the sound scene. * \return The read device for the mixdown. */ -extern AUD_API AUD_Device* AUD_openMixdownDevice(AUD_DeviceSpecs specs, AUD_Sound* sequencer, - float volume, AUD_ResampleQuality quality, double start); +extern AUD_API AUD_Device* AUD_openMixdownDevice(AUD_DeviceSpecs specs, AUD_Sound* sequencer, float volume, double start); /** * Initializes audio routines (FFMPEG/JACK if it is enabled). diff --git a/extern/audaspace/bindings/C/AUD_Types.h b/extern/audaspace/bindings/C/AUD_Types.h index f0f4e66851c..0f95366bc27 100644 --- a/extern/audaspace/bindings/C/AUD_Types.h +++ b/extern/audaspace/bindings/C/AUD_Types.h @@ -119,15 +119,6 @@ typedef enum AUD_CHANNELS_SURROUND71 = 8 /// 7.1 surround sound. } AUD_Channels; -/// Resampling algorithm and quality. -typedef enum -{ - AUD_RESAMPLE_QUALITY_FASTEST = 0, /// Linear resample, very fast but lowest quality. - AUD_RESAMPLE_QUALITY_LOW = 1, /// JOS resample at low quality preset. - AUD_RESAMPLE_QUALITY_MEDIUM = 2, /// JOS resample at medium quality preset. - AUD_RESAMPLE_QUALITY_HIGH = 3 /// JOS resample at high quality preset. -} AUD_ResampleQuality; - /** * The sample rate tells how many samples are played back within one second. * Some exotic formats may use other sample rates than provided here. diff --git a/extern/audaspace/bindings/python/PySound.cpp b/extern/audaspace/bindings/python/PySound.cpp index 740db485a45..7ac7e1bfe52 100644 --- a/extern/audaspace/bindings/python/PySound.cpp +++ b/extern/audaspace/bindings/python/PySound.cpp @@ -1269,12 +1269,12 @@ Sound_rechannel(Sound* self, PyObject* args) } PyDoc_STRVAR(M_aud_Sound_resample_doc, - ".. method:: resample(rate, quality)\n\n" + ".. method:: resample(rate, high_quality)\n\n" " Resamples the sound.\n\n" " :arg rate: The new sample rate.\n" " :type rate: double\n" - " :arg quality: Resampler performance vs quality choice (0=fastest, 3=slowest).\n" - " :type quality: int\n" + " :arg high_quality: When true use a higher quality but slower resampler.\n" + " :type high_quality: bool\n" " :return: The created :class:`Sound` object.\n" " :rtype: :class:`Sound`"); @@ -1282,11 +1282,20 @@ static PyObject * Sound_resample(Sound* self, PyObject* args) { double rate; - int quality = 0; + PyObject* high_qualityo; + bool high_quality = false; - if(!PyArg_ParseTuple(args, "d|i:resample", &rate, &quality)) + if(!PyArg_ParseTuple(args, "d|O:resample", &rate, &high_qualityo)) return nullptr; + if(!PyBool_Check(high_qualityo)) + { + PyErr_SetString(PyExc_TypeError, "high_quality is not a boolean!"); + return nullptr; + } + + high_quality = high_qualityo == Py_True; + PyTypeObject* type = Py_TYPE(self); Sound* parent = (Sound*)type->tp_alloc(type, 0); @@ -1298,10 +1307,10 @@ Sound_resample(Sound* self, PyObject* args) specs.channels = CHANNELS_INVALID; specs.rate = rate; specs.format = FORMAT_INVALID; - if (quality == int(ResampleQuality::FASTEST)) - parent->sound = new std::shared_ptr(new LinearResample(*reinterpret_cast*>(self->sound), specs)); + if(high_quality) + parent->sound = new std::shared_ptr(new JOSResample(*reinterpret_cast*>(self->sound), specs)); else - parent->sound = new std::shared_ptr(new JOSResample(*reinterpret_cast*>(self->sound), specs, static_cast(quality))); + parent->sound = new std::shared_ptr(new LinearResample(*reinterpret_cast*>(self->sound), specs)); } catch(Exception& e) { diff --git a/extern/audaspace/include/Exception.h b/extern/audaspace/include/Exception.h index 2a505d7965d..b102bfade63 100644 --- a/extern/audaspace/include/Exception.h +++ b/extern/audaspace/include/Exception.h @@ -69,7 +69,7 @@ protected: * @param file The source code file in which the exception was thrown. * @param line The source code line from which the exception was thrown. */ - Exception(const std::string &message, const std::string &file, int line); + Exception(std::string message, std::string file, int line); public: /** * Destroys the object. @@ -120,7 +120,7 @@ public: * @param file The source code file in which the exception was thrown. * @param line The source code line from which the exception was thrown. */ - FileException(const std::string &message, const std::string &file, int line); + FileException(std::string message, std::string file, int line); /** * Copy constructor. @@ -145,7 +145,7 @@ public: * @param file The source code file in which the exception was thrown. * @param line The source code line from which the exception was thrown. */ - DeviceException(const std::string &message, const std::string &file, int line); + DeviceException(std::string message, std::string file, int line); /** * Copy constructor. @@ -171,7 +171,7 @@ public: * @param file The source code file in which the exception was thrown. * @param line The source code line from which the exception was thrown. */ - StateException(const std::string &message, const std::string &file, int line); + StateException(std::string message, std::string file, int line); /** * Copy constructor. diff --git a/extern/audaspace/include/devices/DeviceManager.h b/extern/audaspace/include/devices/DeviceManager.h index 85d1d1f4139..fa84025478f 100644 --- a/extern/audaspace/include/devices/DeviceManager.h +++ b/extern/audaspace/include/devices/DeviceManager.h @@ -62,14 +62,14 @@ public: * @param name A representative name for the device. * @param factory The factory that creates the device. */ - static void registerDevice(const std::string &name, std::shared_ptr factory); + static void registerDevice(std::string name, std::shared_ptr factory); /** * Returns the factory for a specific device. * @param name The representative name of the device. * @return The factory if it was found, or nullptr otherwise. */ - static std::shared_ptr getDeviceFactory(const std::string &name); + static std::shared_ptr getDeviceFactory(std::string name); /** * Returns the default device based on the priorities of the registered factories. @@ -92,7 +92,7 @@ public: * If a device is currently being handled it will be released. * @param name The representative name of the device. */ - static void openDevice(const std::string &name); + static void openDevice(std::string name); /** * Opens the default device which will then be handled by the manager. diff --git a/extern/audaspace/include/devices/IDeviceFactory.h b/extern/audaspace/include/devices/IDeviceFactory.h index 82e4a90f6e6..c0769fa8015 100644 --- a/extern/audaspace/include/devices/IDeviceFactory.h +++ b/extern/audaspace/include/devices/IDeviceFactory.h @@ -71,7 +71,7 @@ public: * Sets a name for the device. * \param name The internal name for the device. */ - virtual void setName(const std::string &name)=0; + virtual void setName(std::string name)=0; }; AUD_NAMESPACE_END diff --git a/extern/audaspace/include/devices/OpenCloseDevice.h b/extern/audaspace/include/devices/OpenCloseDevice.h deleted file mode 100644 index 5d127ea295a..00000000000 --- a/extern/audaspace/include/devices/OpenCloseDevice.h +++ /dev/null @@ -1,103 +0,0 @@ -/******************************************************************************* - * Copyright 2009-2024 Jörg Müller - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - ******************************************************************************/ - -#pragma once - -/** - * @file OpenCloseDevice.h - * @ingroup devices - * The OpenCloseDevice class. - */ - -#include -#include - -#include "devices/SoftwareDevice.h" - -AUD_NAMESPACE_BEGIN - -/** - * This device extends the SoftwareDevice with code for running mixing in a separate thread. - */ -class AUD_PLUGIN_API OpenCloseDevice : public SoftwareDevice -{ -private: - /** - * Whether the device is opened. - */ - bool m_device_opened{false}; - - /** - * Whether there is currently playback. - */ - bool m_playing{false}; - - /** - * Whether thread released the device. - */ - bool m_delayed_close_finished{false}; - - /** - * Thread used to release the device after time delay. - */ - std::thread m_delayed_close_thread; - - /** - * How long to wait until closing the device.. - */ - std::chrono::milliseconds m_device_close_delay{std::chrono::milliseconds(10000)}; - - /** - * Time when playback has stopped. - */ - std::chrono::time_point m_playback_stopped_time; - - /** - * Releases the device after time delay. - */ - void closeAfterDelay(); - - /** - * Starts the playback. - */ - AUD_LOCAL virtual void start() = 0; - - /** - * Stops the playbsck. - */ - AUD_LOCAL virtual void stop() = 0; - - /** - * Acquires the device. - */ - AUD_LOCAL virtual void open() = 0; - - /** - * Releases the device. - */ - AUD_LOCAL virtual void close() = 0; - - // delete copy constructor and operator= - OpenCloseDevice(const OpenCloseDevice&) = delete; - OpenCloseDevice& operator=(const OpenCloseDevice&) = delete; - -protected: - OpenCloseDevice() = default; - - virtual void playing(bool playing); -}; - -AUD_NAMESPACE_END diff --git a/extern/audaspace/include/devices/SoftwareDevice.h b/extern/audaspace/include/devices/SoftwareDevice.h index 6fe956cac02..c3af5cfd902 100644 --- a/extern/audaspace/include/devices/SoftwareDevice.h +++ b/extern/audaspace/include/devices/SoftwareDevice.h @@ -231,9 +231,9 @@ protected: std::shared_ptr m_mixer; /** - * Resampling quality. + * Whether to do high or low quality resampling. */ - ResampleQuality m_quality; + bool m_quality; /** * Initializes member variables. @@ -347,9 +347,9 @@ public: /** * Sets the resampling quality. - * \param quality Resampling quality vs performance setting. + * \param quality Low (false) or high (true) quality. */ - void setQuality(ResampleQuality quality); + void setQuality(bool quality); virtual DeviceSpecs getSpecs() const; virtual std::shared_ptr play(std::shared_ptr reader, bool keep = false); diff --git a/extern/audaspace/include/file/File.h b/extern/audaspace/include/file/File.h index b2171b64c89..ac490acba38 100644 --- a/extern/audaspace/include/file/File.h +++ b/extern/audaspace/include/file/File.h @@ -69,7 +69,7 @@ public: * \param filename The sound file path. * \param stream The index of the audio stream within the file if it contains multiple audio streams. */ - File(const std::string &filename, int stream = 0); + File(std::string filename, int stream = 0); /** * Creates a new sound. diff --git a/extern/audaspace/include/file/FileManager.h b/extern/audaspace/include/file/FileManager.h index b1e11076a90..e19eef65b1c 100644 --- a/extern/audaspace/include/file/FileManager.h +++ b/extern/audaspace/include/file/FileManager.h @@ -72,7 +72,7 @@ public: * @return The reader created. * @exception Exception If no file input can read the file an exception is thrown. */ - static std::shared_ptr createReader(const std::string &filename, int stream = 0); + static std::shared_ptr createReader(std::string filename, int stream = 0); /** * Creates a file reader for the given buffer if a registed IFileInput is able to read it. @@ -89,7 +89,7 @@ public: * \return A vector with as many streams as there are in the file. * \exception Exception Thrown if the file specified cannot be read. */ - static std::vector queryStreams(const std::string &filename); + static std::vector queryStreams(std::string filename); /** * Queries the streams of a sound file. @@ -110,7 +110,7 @@ public: * @return A writer that creates the file. * @exception Exception If no file output can write the file with the given specification an exception is thrown. */ - static std::shared_ptr createWriter(const std::string &filename, DeviceSpecs specs, Container format, Codec codec, unsigned int bitrate); + static std::shared_ptr createWriter(std::string filename, DeviceSpecs specs, Container format, Codec codec, unsigned int bitrate); }; AUD_NAMESPACE_END diff --git a/extern/audaspace/include/file/FileWriter.h b/extern/audaspace/include/file/FileWriter.h index 923c7dcb59c..13619d4de71 100644 --- a/extern/audaspace/include/file/FileWriter.h +++ b/extern/audaspace/include/file/FileWriter.h @@ -54,7 +54,7 @@ public: * \param bitrate The bitrate for encoding. * \return The writer to write data to. */ - static std::shared_ptr createWriter(const std::string &filename, DeviceSpecs specs, Container format, Codec codec, unsigned int bitrate); + static std::shared_ptr createWriter(std::string filename, DeviceSpecs specs, Container format, Codec codec, unsigned int bitrate); /** * Writes a reader to a writer. diff --git a/extern/audaspace/include/file/IFileInput.h b/extern/audaspace/include/file/IFileInput.h index 3d44a6536bc..4a3fe446852 100644 --- a/extern/audaspace/include/file/IFileInput.h +++ b/extern/audaspace/include/file/IFileInput.h @@ -54,7 +54,7 @@ public: * \return The reader that reads the file. * \exception Exception Thrown if the file specified cannot be read. */ - virtual std::shared_ptr createReader(const std::string &filename, int stream = 0)=0; + virtual std::shared_ptr createReader(std::string filename, int stream = 0)=0; /** * Creates a reader for a file to be read from memory. @@ -71,7 +71,7 @@ public: * \return A vector with as many streams as there are in the file. * \exception Exception Thrown if the file specified cannot be read. */ - virtual std::vector queryStreams(const std::string &filename)=0; + virtual std::vector queryStreams(std::string filename)=0; /** * Queries the streams of a sound file. diff --git a/extern/audaspace/include/file/IFileOutput.h b/extern/audaspace/include/file/IFileOutput.h index 8f35eda3d77..5a6efacfe94 100644 --- a/extern/audaspace/include/file/IFileOutput.h +++ b/extern/audaspace/include/file/IFileOutput.h @@ -46,7 +46,7 @@ public: * \param bitrate The bitrate for encoding. * \exception Exception Thrown if the file specified cannot be written. */ - virtual std::shared_ptr createWriter(const std::string &filename, DeviceSpecs specs, Container format, Codec codec, unsigned int bitrate)=0; + virtual std::shared_ptr createWriter(std::string filename, DeviceSpecs specs, Container format, Codec codec, unsigned int bitrate)=0; }; AUD_NAMESPACE_END diff --git a/extern/audaspace/include/respec/JOSResample.h b/extern/audaspace/include/respec/JOSResample.h index 7cc36e14f24..b1f4d757c3c 100644 --- a/extern/audaspace/include/respec/JOSResample.h +++ b/extern/audaspace/include/respec/JOSResample.h @@ -36,15 +36,13 @@ private: JOSResample(const JOSResample&) = delete; JOSResample& operator=(const JOSResample&) = delete; - ResampleQuality m_quality; - public: /** * Creates a new sound. * \param sound The input sound. * \param specs The target specifications. */ - JOSResample(std::shared_ptr sound, DeviceSpecs specs, ResampleQuality quality = ResampleQuality::HIGH); + JOSResample(std::shared_ptr sound, DeviceSpecs specs); virtual std::shared_ptr createReader(); }; diff --git a/extern/audaspace/include/respec/JOSResampleReader.h b/extern/audaspace/include/respec/JOSResampleReader.h index d628ae7f1b2..aae28354280 100644 --- a/extern/audaspace/include/respec/JOSResampleReader.h +++ b/extern/audaspace/include/respec/JOSResampleReader.h @@ -36,39 +36,39 @@ private: typedef void (JOSResampleReader::*resample_f)(double target_factor, int length, sample_t* buffer); /** - * The half filter length for HIGH quality setting. + * The half filter length for Quality::HIGH setting. */ static const int m_len_high; /** - * The half filter length for MEDIUM quality setting. + * The half filter length for Quality::MEDIUM setting. */ static const int m_len_medium; /** - * The half filter length for LOW quality setting. + * The half filter length for Quality::LOW setting. */ static const int m_len_low; /** - * The filter sample step size for HIGH quality setting. + * The filter sample step size for Quality::HIGH setting. */ static const int m_L_high; /** - * The filter sample step size for MEDIUM quality setting. + * The filter sample step size for Quality::MEDIUM setting. */ static const int m_L_medium; /** - * The filter sample step size for LOW quality setting. + * The filter sample step size for Quality::LOW setting. */ static const int m_L_low; /** - * The filter coefficients for HIGH quality setting. + * The filter coefficients for Quality::HIGH setting. */ static const float m_coeff_high[]; /** - * The filter coefficients for MEDIUM quality setting. + * The filter coefficients for Quality::MEDIUM setting. */ static const float m_coeff_medium[]; /** - * The filter coefficients for LOW quality setting. + * The filter coefficients for Quality::LOW setting. */ static const float m_coeff_low[]; @@ -152,13 +152,19 @@ private: void AUD_LOCAL resample(double target_factor, int length, sample_t* buffer); public: + enum class Quality + { + LOW = 0, + MEDIUM, + HIGH, + }; /** * Creates a resampling reader. * \param reader The reader to mix. * \param rate The target sampling rate. */ - JOSResampleReader(std::shared_ptr reader, SampleRate rate, ResampleQuality quality = ResampleQuality::HIGH); + JOSResampleReader(std::shared_ptr reader, SampleRate rate, Quality = Quality::MEDIUM); virtual void seek(int position); virtual int getLength() const; diff --git a/extern/audaspace/include/respec/Specification.h b/extern/audaspace/include/respec/Specification.h index fef32710918..efcbb4cabce 100644 --- a/extern/audaspace/include/respec/Specification.h +++ b/extern/audaspace/include/respec/Specification.h @@ -83,15 +83,6 @@ enum Channel CHANNEL_MAX }; -/// Resampling algorithm and quality. -enum class ResampleQuality -{ - FASTEST = 0, /// Linear resample, very fast but lowest quality. - LOW, /// JOS resample at low quality preset. - MEDIUM, /// JOS resample at medium quality preset. - HIGH /// JOS resample at high quality preset. -}; - /** * The sample rate tells how many samples are played back within one second. * Some exotic formats may use other sample rates than provided here. diff --git a/extern/audaspace/include/sequence/Sequence.h b/extern/audaspace/include/sequence/Sequence.h index 03ec7376f16..de14fd9fa38 100644 --- a/extern/audaspace/include/sequence/Sequence.h +++ b/extern/audaspace/include/sequence/Sequence.h @@ -160,11 +160,10 @@ public: void remove(std::shared_ptr entry); /** - * Creates a new reader with indicated resampling quality. - * \param quality The resampling quality. + * Creates a new reader with high quality resampling. * \return The new reader. */ - std::shared_ptr createQualityReader(ResampleQuality quality); + std::shared_ptr createQualityReader(); virtual std::shared_ptr createReader(); }; diff --git a/extern/audaspace/include/sequence/SequenceReader.h b/extern/audaspace/include/sequence/SequenceReader.h index 4ad5c99498c..196d969e102 100644 --- a/extern/audaspace/include/sequence/SequenceReader.h +++ b/extern/audaspace/include/sequence/SequenceReader.h @@ -74,9 +74,9 @@ public: /** * Creates a resampling reader. * \param sequence The sequence data. - * \param quality Resampling quality vs performance option. + * \param quality Whether a high quality resample should be used for resampling. */ - SequenceReader(std::shared_ptr sequence, ResampleQuality quality = ResampleQuality::FASTEST); + SequenceReader(std::shared_ptr sequence, bool quality = false); /** * Destroys the reader. diff --git a/extern/audaspace/include/util/RingBuffer.h b/extern/audaspace/include/util/RingBuffer.h index 6173c10ddcc..67bd1cc8640 100644 --- a/extern/audaspace/include/util/RingBuffer.h +++ b/extern/audaspace/include/util/RingBuffer.h @@ -74,8 +74,6 @@ public: size_t write(data_t* source, size_t size); - void clear(); - /** * Resets the ring buffer to a state where nothing has been written or read. */ diff --git a/extern/audaspace/plugins/coreaudio/CoreAudioDevice.cpp b/extern/audaspace/plugins/coreaudio/CoreAudioDevice.cpp index 340b22ba8fb..113ceccad60 100644 --- a/extern/audaspace/plugins/coreaudio/CoreAudioDevice.cpp +++ b/extern/audaspace/plugins/coreaudio/CoreAudioDevice.cpp @@ -36,17 +36,22 @@ OSStatus CoreAudioDevice::CoreAudio_mix(void* data, AudioUnitRenderActionFlags* return noErr; } -void CoreAudioDevice::start() +void CoreAudioDevice::playing(bool playing) { - AudioOutputUnitStart(m_audio_unit); + if(m_playback != playing) + { + if(playing) + AudioOutputUnitStart(m_audio_unit); + else + AudioOutputUnitStop(m_audio_unit); + } + + m_playback = playing; } -void CoreAudioDevice::stop() -{ - AudioOutputUnitStop(m_audio_unit); -} - -void CoreAudioDevice::open() +CoreAudioDevice::CoreAudioDevice(DeviceSpecs specs, int buffersize) : +m_playback(false), +m_audio_unit(nullptr) { AudioComponentDescription component_description = {}; @@ -66,7 +71,14 @@ void CoreAudioDevice::open() AudioStreamBasicDescription stream_basic_description = {}; - switch(m_specs.format) + if(specs.channels == CHANNELS_INVALID) + specs.channels = CHANNELS_STEREO; + if(specs.format == FORMAT_INVALID) + specs.format = FORMAT_FLOAT32; + if(specs.rate == RATE_INVALID) + specs.rate = RATE_48000; + + switch(specs.format) { case FORMAT_U8: stream_basic_description.mFormatFlags = 0; @@ -93,18 +105,18 @@ void CoreAudioDevice::open() stream_basic_description.mBitsPerChannel = 64; break; default: - m_specs.format = FORMAT_FLOAT32; + specs.format = FORMAT_FLOAT32; stream_basic_description.mFormatFlags = kLinearPCMFormatFlagIsFloat; stream_basic_description.mBitsPerChannel = 32; break; } - stream_basic_description.mSampleRate = m_specs.rate; + stream_basic_description.mSampleRate = specs.rate; stream_basic_description.mFormatID = kAudioFormatLinearPCM; stream_basic_description.mFormatFlags |= kAudioFormatFlagsNativeEndian | kLinearPCMFormatFlagIsPacked; - stream_basic_description.mBytesPerPacket = stream_basic_description.mBytesPerFrame = AUD_DEVICE_SAMPLE_SIZE(m_specs); + stream_basic_description.mBytesPerPacket = stream_basic_description.mBytesPerFrame = AUD_DEVICE_SAMPLE_SIZE(specs); stream_basic_description.mFramesPerPacket = 1; - stream_basic_description.mChannelsPerFrame = m_specs.channels; + stream_basic_description.mChannelsPerFrame = specs.channels; status = AudioUnitSetProperty(m_audio_unit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, 0, &stream_basic_description, sizeof(stream_basic_description)); @@ -114,6 +126,8 @@ void CoreAudioDevice::open() AUD_THROW(DeviceException, "The audio device couldn't be opened with CoreAudio."); } + m_specs = specs; + AURenderCallbackStruct render_callback_struct; render_callback_struct.inputProc = CoreAudioDevice::CoreAudio_mix; render_callback_struct.inputProcRefCon = this; @@ -143,35 +157,16 @@ void CoreAudioDevice::open() AudioComponentInstanceDispose(m_audio_unit); throw; } -} -void CoreAudioDevice::close() -{ - AudioOutputUnitStop(m_audio_unit); - AudioUnitUninitialize(m_audio_unit); - AudioComponentInstanceDispose(m_audio_unit); -} - -CoreAudioDevice::CoreAudioDevice(DeviceSpecs specs, int buffersize) : -m_playback(false), -m_audio_unit(nullptr) -{ - if(specs.channels == CHANNELS_INVALID) - specs.channels = CHANNELS_STEREO; - if(specs.format == FORMAT_INVALID) - specs.format = FORMAT_FLOAT32; - if(specs.rate == RATE_INVALID) - specs.rate = RATE_48000; - - m_specs = specs; - open(); - close(); create(); } CoreAudioDevice::~CoreAudioDevice() { - close(); + AudioOutputUnitStop(m_audio_unit); + AudioUnitUninitialize(m_audio_unit); + AudioComponentInstanceDispose(m_audio_unit); + destroy(); } @@ -215,7 +210,7 @@ public: m_buffersize = buffersize; } - virtual void setName(const std::string &name) + virtual void setName(std::string name) { } }; diff --git a/extern/audaspace/plugins/coreaudio/CoreAudioDevice.h b/extern/audaspace/plugins/coreaudio/CoreAudioDevice.h index c70a49d0002..3770228db6f 100644 --- a/extern/audaspace/plugins/coreaudio/CoreAudioDevice.h +++ b/extern/audaspace/plugins/coreaudio/CoreAudioDevice.h @@ -26,20 +26,19 @@ * The CoreAudioDevice class. */ +#include "CoreAudioSynchronizer.h" +#include "devices/SoftwareDevice.h" + #include #include -#include "CoreAudioSynchronizer.h" - -#include "devices/OpenCloseDevice.h" - AUD_NAMESPACE_BEGIN /** * This device plays back through CoreAudio, the Apple audio API. */ -class AUD_PLUGIN_API CoreAudioDevice : public OpenCloseDevice +class AUD_PLUGIN_API CoreAudioDevice : public SoftwareDevice { private: /** @@ -68,15 +67,13 @@ private: */ AUD_LOCAL static OSStatus CoreAudio_mix(void* data, AudioUnitRenderActionFlags* flags, const AudioTimeStamp* time_stamp, UInt32 bus_number, UInt32 number_frames, AudioBufferList* buffer_list); - AUD_LOCAL void start(); - AUD_LOCAL void stop(); - AUD_LOCAL void open(); - AUD_LOCAL void close(); - // delete copy constructor and operator= CoreAudioDevice(const CoreAudioDevice&) = delete; CoreAudioDevice& operator=(const CoreAudioDevice&) = delete; +protected: + virtual void playing(bool playing); + public: /** * Opens the CoreAudio audio device for playback. diff --git a/extern/audaspace/plugins/ffmpeg/FFMPEG.cpp b/extern/audaspace/plugins/ffmpeg/FFMPEG.cpp index d9bfe0b50c4..07c0fee691a 100644 --- a/extern/audaspace/plugins/ffmpeg/FFMPEG.cpp +++ b/extern/audaspace/plugins/ffmpeg/FFMPEG.cpp @@ -35,7 +35,7 @@ void FFMPEG::registerPlugin() FileManager::registerOutput(plugin); } -std::shared_ptr FFMPEG::createReader(const std::string &filename, int stream) +std::shared_ptr FFMPEG::createReader(std::string filename, int stream) { return std::shared_ptr(new FFMPEGReader(filename, stream)); } @@ -45,7 +45,7 @@ std::shared_ptr FFMPEG::createReader(std::shared_ptr buffer, in return std::shared_ptr(new FFMPEGReader(buffer, stream)); } -std::vector FFMPEG::queryStreams(const std::string &filename) +std::vector FFMPEG::queryStreams(std::string filename) { return FFMPEGReader(filename).queryStreams(); } @@ -55,7 +55,7 @@ std::vector FFMPEG::queryStreams(std::shared_ptr buffer) return FFMPEGReader(buffer).queryStreams(); } -std::shared_ptr FFMPEG::createWriter(const std::string &filename, DeviceSpecs specs, Container format, Codec codec, unsigned int bitrate) +std::shared_ptr FFMPEG::createWriter(std::string filename, DeviceSpecs specs, Container format, Codec codec, unsigned int bitrate) { return std::shared_ptr(new FFMPEGWriter(filename, specs, format, codec, bitrate)); } diff --git a/extern/audaspace/plugins/ffmpeg/FFMPEG.h b/extern/audaspace/plugins/ffmpeg/FFMPEG.h index 974e3350b2d..fb40ba05573 100644 --- a/extern/audaspace/plugins/ffmpeg/FFMPEG.h +++ b/extern/audaspace/plugins/ffmpeg/FFMPEG.h @@ -52,11 +52,11 @@ public: */ static void registerPlugin(); - virtual std::shared_ptr createReader(const std::string &filename, int stream = 0); + virtual std::shared_ptr createReader(std::string filename, int stream = 0); virtual std::shared_ptr createReader(std::shared_ptr buffer, int stream = 0); - virtual std::vector queryStreams(const std::string &filename); + virtual std::vector queryStreams(std::string filename); virtual std::vector queryStreams(std::shared_ptr buffer); - virtual std::shared_ptr createWriter(const std::string &filename, DeviceSpecs specs, Container format, Codec codec, unsigned int bitrate); + virtual std::shared_ptr createWriter(std::string filename, DeviceSpecs specs, Container format, Codec codec, unsigned int bitrate); }; AUD_NAMESPACE_END diff --git a/extern/audaspace/plugins/ffmpeg/FFMPEGReader.cpp b/extern/audaspace/plugins/ffmpeg/FFMPEGReader.cpp index c0e16d6a887..5035ed05be5 100644 --- a/extern/audaspace/plugins/ffmpeg/FFMPEGReader.cpp +++ b/extern/audaspace/plugins/ffmpeg/FFMPEGReader.cpp @@ -239,7 +239,7 @@ void FFMPEGReader::init(int stream) m_specs.rate = (SampleRate) m_codecCtx->sample_rate; } -FFMPEGReader::FFMPEGReader(const std::string &filename, int stream) : +FFMPEGReader::FFMPEGReader(std::string filename, int stream) : m_pkgbuf(), m_formatCtx(nullptr), m_codecCtx(nullptr), diff --git a/extern/audaspace/plugins/ffmpeg/FFMPEGReader.h b/extern/audaspace/plugins/ffmpeg/FFMPEGReader.h index dc8c292c0ed..ca0e8b024aa 100644 --- a/extern/audaspace/plugins/ffmpeg/FFMPEGReader.h +++ b/extern/audaspace/plugins/ffmpeg/FFMPEGReader.h @@ -154,7 +154,7 @@ public: * \exception Exception Thrown if the file specified does not exist or * cannot be read with ffmpeg. */ - FFMPEGReader(const std::string &filename, int stream = 0); + FFMPEGReader(std::string filename, int stream = 0); /** * Creates a new reader. diff --git a/extern/audaspace/plugins/ffmpeg/FFMPEGWriter.cpp b/extern/audaspace/plugins/ffmpeg/FFMPEGWriter.cpp index 9cadfe9c092..ae6558ccfa5 100644 --- a/extern/audaspace/plugins/ffmpeg/FFMPEGWriter.cpp +++ b/extern/audaspace/plugins/ffmpeg/FFMPEGWriter.cpp @@ -158,7 +158,7 @@ void FFMPEGWriter::close() #endif } -FFMPEGWriter::FFMPEGWriter(const std::string &filename, DeviceSpecs specs, Container format, Codec codec, unsigned int bitrate) : +FFMPEGWriter::FFMPEGWriter(std::string filename, DeviceSpecs specs, Container format, Codec codec, unsigned int bitrate) : m_position(0), m_specs(specs), m_formatCtx(nullptr), diff --git a/extern/audaspace/plugins/ffmpeg/FFMPEGWriter.h b/extern/audaspace/plugins/ffmpeg/FFMPEGWriter.h index 7e39d8cb92b..c22f479d83c 100644 --- a/extern/audaspace/plugins/ffmpeg/FFMPEGWriter.h +++ b/extern/audaspace/plugins/ffmpeg/FFMPEGWriter.h @@ -135,7 +135,7 @@ public: * \exception Exception Thrown if the file specified does not exist or * cannot be read with ffmpeg. */ - FFMPEGWriter(const std::string &filename, DeviceSpecs specs, Container format, Codec codec, unsigned int bitrate); + FFMPEGWriter(std::string filename, DeviceSpecs specs, Container format, Codec codec, unsigned int bitrate); /** * Destroys the writer and closes the file. diff --git a/extern/audaspace/plugins/jack/JackDevice.cpp b/extern/audaspace/plugins/jack/JackDevice.cpp index e949d9e64e9..32874fd1315 100644 --- a/extern/audaspace/plugins/jack/JackDevice.cpp +++ b/extern/audaspace/plugins/jack/JackDevice.cpp @@ -162,7 +162,7 @@ void JackDevice::jack_shutdown(void* data) device->m_valid = false; } -JackDevice::JackDevice(const std::string &name, DeviceSpecs specs, int buffersize) : +JackDevice::JackDevice(std::string name, DeviceSpecs specs, int buffersize) : m_synchronizer(this) { if(specs.channels == CHANNELS_INVALID) @@ -358,7 +358,7 @@ public: m_buffersize = buffersize; } - virtual void setName(const std::string &name) + virtual void setName(std::string name) { m_name = name; } diff --git a/extern/audaspace/plugins/jack/JackDevice.h b/extern/audaspace/plugins/jack/JackDevice.h index 7fd1e062846..4e6b1f5d12c 100644 --- a/extern/audaspace/plugins/jack/JackDevice.h +++ b/extern/audaspace/plugins/jack/JackDevice.h @@ -151,7 +151,7 @@ public: * \param buffersize The size of the internal buffer. * \exception Exception Thrown if the audio device cannot be opened. */ - JackDevice(const std::string &name, DeviceSpecs specs, int buffersize = AUD_DEFAULT_BUFFER_SIZE); + JackDevice(std::string name, DeviceSpecs specs, int buffersize = AUD_DEFAULT_BUFFER_SIZE); /** * Closes the JACK client. diff --git a/extern/audaspace/plugins/libsndfile/SndFile.cpp b/extern/audaspace/plugins/libsndfile/SndFile.cpp index 851af888511..39335de9a1a 100644 --- a/extern/audaspace/plugins/libsndfile/SndFile.cpp +++ b/extern/audaspace/plugins/libsndfile/SndFile.cpp @@ -32,7 +32,7 @@ void SndFile::registerPlugin() FileManager::registerOutput(plugin); } -std::shared_ptr SndFile::createReader(const std::string &filename, int stream) +std::shared_ptr SndFile::createReader(std::string filename, int stream) { return std::shared_ptr(new SndFileReader(filename)); } @@ -42,7 +42,7 @@ std::shared_ptr SndFile::createReader(std::shared_ptr buffer, i return std::shared_ptr(new SndFileReader(buffer)); } -std::vector SndFile::queryStreams(const std::string &filename) +std::vector SndFile::queryStreams(std::string filename) { return SndFileReader(filename).queryStreams(); } @@ -52,7 +52,7 @@ std::vector SndFile::queryStreams(std::shared_ptr buffer) return SndFileReader(buffer).queryStreams(); } -std::shared_ptr SndFile::createWriter(const std::string &filename, DeviceSpecs specs, Container format, Codec codec, unsigned int bitrate) +std::shared_ptr SndFile::createWriter(std::string filename, DeviceSpecs specs, Container format, Codec codec, unsigned int bitrate) { return std::shared_ptr(new SndFileWriter(filename, specs, format, codec, bitrate)); } diff --git a/extern/audaspace/plugins/libsndfile/SndFile.h b/extern/audaspace/plugins/libsndfile/SndFile.h index ccd49b24882..10a7391180f 100644 --- a/extern/audaspace/plugins/libsndfile/SndFile.h +++ b/extern/audaspace/plugins/libsndfile/SndFile.h @@ -52,11 +52,11 @@ public: */ static void registerPlugin(); - virtual std::shared_ptr createReader(const std::string &filename, int stream = 0); + virtual std::shared_ptr createReader(std::string filename, int stream = 0); virtual std::shared_ptr createReader(std::shared_ptr buffer, int stream = 0); - virtual std::vector queryStreams(const std::string &filename); + virtual std::vector queryStreams(std::string filename); virtual std::vector queryStreams(std::shared_ptr buffer); - virtual std::shared_ptr createWriter(const std::string &filename, DeviceSpecs specs, Container format, Codec codec, unsigned int bitrate); + virtual std::shared_ptr createWriter(std::string filename, DeviceSpecs specs, Container format, Codec codec, unsigned int bitrate); }; AUD_NAMESPACE_END diff --git a/extern/audaspace/plugins/libsndfile/SndFileReader.cpp b/extern/audaspace/plugins/libsndfile/SndFileReader.cpp index f141adb43a5..21c733d8117 100644 --- a/extern/audaspace/plugins/libsndfile/SndFileReader.cpp +++ b/extern/audaspace/plugins/libsndfile/SndFileReader.cpp @@ -71,7 +71,7 @@ sf_count_t SndFileReader::vio_tell(void* user_data) return reader->m_memoffset; } -SndFileReader::SndFileReader(const std::string &filename) : +SndFileReader::SndFileReader(std::string filename) : m_position(0) { SF_INFO sfinfo; diff --git a/extern/audaspace/plugins/libsndfile/SndFileReader.h b/extern/audaspace/plugins/libsndfile/SndFileReader.h index bd2f766e088..b4158d9091a 100644 --- a/extern/audaspace/plugins/libsndfile/SndFileReader.h +++ b/extern/audaspace/plugins/libsndfile/SndFileReader.h @@ -103,7 +103,7 @@ public: * \exception Exception Thrown if the file specified does not exist or * cannot be read with libsndfile. */ - SndFileReader(const std::string &filename); + SndFileReader(std::string filename); /** * Creates a new reader. diff --git a/extern/audaspace/plugins/libsndfile/SndFileWriter.cpp b/extern/audaspace/plugins/libsndfile/SndFileWriter.cpp index e1a57d289de..d2ab117132d 100644 --- a/extern/audaspace/plugins/libsndfile/SndFileWriter.cpp +++ b/extern/audaspace/plugins/libsndfile/SndFileWriter.cpp @@ -21,7 +21,7 @@ AUD_NAMESPACE_BEGIN -SndFileWriter::SndFileWriter(const std::string &filename, DeviceSpecs specs, +SndFileWriter::SndFileWriter(std::string filename, DeviceSpecs specs, Container format, Codec codec, unsigned int bitrate) : m_position(0), m_specs(specs) { diff --git a/extern/audaspace/plugins/libsndfile/SndFileWriter.h b/extern/audaspace/plugins/libsndfile/SndFileWriter.h index c4e4fad627c..75d761f5163 100644 --- a/extern/audaspace/plugins/libsndfile/SndFileWriter.h +++ b/extern/audaspace/plugins/libsndfile/SndFileWriter.h @@ -69,7 +69,7 @@ public: * \exception Exception Thrown if the file specified cannot be written * with libsndfile. */ - SndFileWriter(const std::string &filename, DeviceSpecs specs, Container format, Codec codec, unsigned int bitrate); + SndFileWriter(std::string filename, DeviceSpecs specs, Container format, Codec codec, unsigned int bitrate); /** * Destroys the writer and closes the file. diff --git a/extern/audaspace/plugins/openal/OpenALDevice.cpp b/extern/audaspace/plugins/openal/OpenALDevice.cpp index 2e9c9d63631..536ec4ccb1b 100644 --- a/extern/audaspace/plugins/openal/OpenALDevice.cpp +++ b/extern/audaspace/plugins/openal/OpenALDevice.cpp @@ -1131,7 +1131,7 @@ void OpenALDevice::updateStreams() /**************************** IDevice Code ************************************/ /******************************************************************************/ -OpenALDevice::OpenALDevice(DeviceSpecs specs, int buffersize, const std::string &name) : +OpenALDevice::OpenALDevice(DeviceSpecs specs, int buffersize, std::string name) : m_name(name), m_playing(false), m_buffersize(buffersize) { // cannot determine how many channels or which format OpenAL uses, but @@ -1561,7 +1561,7 @@ private: std::string m_name; public: - OpenALDeviceFactory(const std::string &name = "") : + OpenALDeviceFactory(std::string name = "") : m_buffersize(AUD_DEFAULT_BUFFER_SIZE), m_name(name) { @@ -1590,7 +1590,7 @@ public: m_buffersize = buffersize; } - virtual void setName(const std::string &name) + virtual void setName(std::string name) { } }; @@ -1599,7 +1599,7 @@ void OpenALDevice::registerPlugin() { auto names = OpenALDevice::getDeviceNames(); DeviceManager::registerDevice("OpenAL", std::shared_ptr(new OpenALDeviceFactory)); - for(const std::string &name : names) + for(std::string &name : names) { DeviceManager::registerDevice("OpenAL - " + name, std::shared_ptr(new OpenALDeviceFactory(name))); } diff --git a/extern/audaspace/plugins/openal/OpenALDevice.h b/extern/audaspace/plugins/openal/OpenALDevice.h index f16851d12eb..b6ba5456d85 100644 --- a/extern/audaspace/plugins/openal/OpenALDevice.h +++ b/extern/audaspace/plugins/openal/OpenALDevice.h @@ -269,7 +269,7 @@ public: * \note The buffersize will be multiplicated by three for this device. * \exception DeviceException Thrown if the audio device cannot be opened. */ - OpenALDevice(DeviceSpecs specs, int buffersize = AUD_DEFAULT_BUFFER_SIZE, const std::string &name = ""); + OpenALDevice(DeviceSpecs specs, int buffersize = AUD_DEFAULT_BUFFER_SIZE, std::string name = ""); virtual ~OpenALDevice(); diff --git a/extern/audaspace/plugins/pulseaudio/PulseAudioDevice.cpp b/extern/audaspace/plugins/pulseaudio/PulseAudioDevice.cpp index b2fc2d4d44f..d2de89977a9 100644 --- a/extern/audaspace/plugins/pulseaudio/PulseAudioDevice.cpp +++ b/extern/audaspace/plugins/pulseaudio/PulseAudioDevice.cpp @@ -91,12 +91,6 @@ void PulseAudioDevice::PulseAudio_request(pa_stream *stream, size_t total_bytes, AUD_pa_stream_begin_write(stream, reinterpret_cast(&buffer), &num_bytes); - if(device->m_clear) - { - device->m_clear = false; - device->m_ring_buffer.clear(); - } - size_t readsamples = device->m_ring_buffer.getReadSize(); readsamples = std::min(readsamples, size_t(num_bytes)) / sample_size; @@ -125,18 +119,11 @@ void PulseAudioDevice::playing(bool playing) AUD_pa_threaded_mainloop_lock(m_mainloop); AUD_pa_stream_cork(m_stream, playing ? 0 : 1, nullptr, nullptr); AUD_pa_threaded_mainloop_unlock(m_mainloop); - - if(!playing) - { - AUD_pa_stream_flush(m_stream, nullptr, nullptr); - m_clear = true; - } } -PulseAudioDevice::PulseAudioDevice(const std::string &name, DeviceSpecs specs, int buffersize) : +PulseAudioDevice::PulseAudioDevice(std::string name, DeviceSpecs specs, int buffersize) : m_synchronizer(this), m_playback(false), - m_clear(false), m_state(PA_CONTEXT_UNCONNECTED), m_valid(true), m_underflows(0) @@ -334,7 +321,7 @@ public: m_buffersize = buffersize; } - virtual void setName(const std::string &name) + virtual void setName(std::string name) { m_name = name; } diff --git a/extern/audaspace/plugins/pulseaudio/PulseAudioDevice.h b/extern/audaspace/plugins/pulseaudio/PulseAudioDevice.h index e985dfa66cc..57359110633 100644 --- a/extern/audaspace/plugins/pulseaudio/PulseAudioDevice.h +++ b/extern/audaspace/plugins/pulseaudio/PulseAudioDevice.h @@ -60,11 +60,6 @@ private: */ volatile bool m_playback; - /** - * Set when playback is paused in order to later clear the ring buffer when the playback starts again. - */ - volatile bool m_clear; - pa_threaded_mainloop* m_mainloop; pa_context* m_context; pa_stream* m_stream; @@ -133,7 +128,7 @@ public: * \note The specification really used for opening the device may differ. * \exception Exception Thrown if the audio device cannot be opened. */ - PulseAudioDevice(const std::string &name, DeviceSpecs specs, int buffersize = AUD_DEFAULT_BUFFER_SIZE); + PulseAudioDevice(std::string name, DeviceSpecs specs, int buffersize = AUD_DEFAULT_BUFFER_SIZE); /** * Closes the PulseAudio audio device. diff --git a/extern/audaspace/plugins/sdl/SDLDevice.cpp b/extern/audaspace/plugins/sdl/SDLDevice.cpp index 55bddb5fb30..8d7a605fa36 100644 --- a/extern/audaspace/plugins/sdl/SDLDevice.cpp +++ b/extern/audaspace/plugins/sdl/SDLDevice.cpp @@ -157,7 +157,7 @@ public: m_buffersize = buffersize; } - virtual void setName(const std::string &name) + virtual void setName(std::string name) { } }; diff --git a/extern/audaspace/plugins/wasapi/WASAPIDevice.cpp b/extern/audaspace/plugins/wasapi/WASAPIDevice.cpp index 3beb962e2b7..cbf35520c3d 100644 --- a/extern/audaspace/plugins/wasapi/WASAPIDevice.cpp +++ b/extern/audaspace/plugins/wasapi/WASAPIDevice.cpp @@ -458,7 +458,7 @@ public: m_buffersize = buffersize; } - virtual void setName(const std::string &name) + virtual void setName(std::string name) { } }; diff --git a/extern/audaspace/src/Exception.cpp b/extern/audaspace/src/Exception.cpp index bd2a1f5d6e4..1c31cb29555 100644 --- a/extern/audaspace/src/Exception.cpp +++ b/extern/audaspace/src/Exception.cpp @@ -25,7 +25,7 @@ Exception::Exception(const Exception& exception) : { } -Exception::Exception(const std::string &message, const std::string &file, int line) : +Exception::Exception(std::string message, std::string file, int line) : m_message(message), m_file(file), m_line(line) @@ -65,7 +65,7 @@ int Exception::getLine() const return m_line; } -FileException::FileException(const std::string &message, const std::string &file, int line) : +FileException::FileException(std::string message, std::string file, int line) : Exception(message, file, line) { } @@ -79,7 +79,7 @@ FileException::~FileException() AUD_NOEXCEPT { } -DeviceException::DeviceException(const std::string &message, const std::string &file, int line) : +DeviceException::DeviceException(std::string message, std::string file, int line) : Exception(message, file, line) { } @@ -93,7 +93,7 @@ DeviceException::~DeviceException() AUD_NOEXCEPT { } -StateException::StateException(const std::string &message, const std::string &file, int line) : +StateException::StateException(std::string message, std::string file, int line) : Exception(message, file, line) { } diff --git a/extern/audaspace/src/devices/DeviceManager.cpp b/extern/audaspace/src/devices/DeviceManager.cpp index 74c374568c4..304f8b49f70 100644 --- a/extern/audaspace/src/devices/DeviceManager.cpp +++ b/extern/audaspace/src/devices/DeviceManager.cpp @@ -28,12 +28,12 @@ AUD_NAMESPACE_BEGIN std::unordered_map> DeviceManager::m_factories; std::shared_ptr DeviceManager::m_device; -void DeviceManager::registerDevice(const std::string &name, std::shared_ptr factory) +void DeviceManager::registerDevice(std::string name, std::shared_ptr factory) { m_factories[name] = factory; } -std::shared_ptr DeviceManager::getDeviceFactory(const std::string &name) +std::shared_ptr DeviceManager::getDeviceFactory(std::string name) { auto it = m_factories.find(name); @@ -66,7 +66,7 @@ void DeviceManager::setDevice(std::shared_ptr device) m_device = device; } -void DeviceManager::openDevice(const std::string &name) +void DeviceManager::openDevice(std::string name) { setDevice(getDeviceFactory(name)->openDevice()); } diff --git a/extern/audaspace/src/devices/NULLDevice.cpp b/extern/audaspace/src/devices/NULLDevice.cpp index c90dfff6d75..fa8e457dbd2 100644 --- a/extern/audaspace/src/devices/NULLDevice.cpp +++ b/extern/audaspace/src/devices/NULLDevice.cpp @@ -180,7 +180,7 @@ public: { } - virtual void setName(const std::string &name) + virtual void setName(std::string name) { } }; diff --git a/extern/audaspace/src/devices/OpenCloseDevice.cpp b/extern/audaspace/src/devices/OpenCloseDevice.cpp deleted file mode 100644 index f1dd83bbdc5..00000000000 --- a/extern/audaspace/src/devices/OpenCloseDevice.cpp +++ /dev/null @@ -1,66 +0,0 @@ - -/******************************************************************************* - * Copyright 2009-2024 Jörg Müller - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - ******************************************************************************/ - -#include "devices/OpenCloseDevice.h" - -AUD_NAMESPACE_BEGIN - -void OpenCloseDevice::closeAfterDelay() -{ - for(;;) - { - std::this_thread::sleep_for(m_device_close_delay / 10); - if(m_playing || m_playback_stopped_time.time_since_epoch().count() == 0) - m_playback_stopped_time = std::chrono::steady_clock::now(); - if(std::chrono::steady_clock::now() < m_playback_stopped_time + m_device_close_delay) - continue; - - break; - } - close(); - m_delayed_close_finished = true; - m_device_opened = false; -} - -void OpenCloseDevice::playing(bool playing) -{ - if(m_playing != playing) - { - m_playing = playing; - if(playing) - { - if(!m_device_opened) - open(); - m_device_opened = true; - start(); - } - else - { - stop(); - m_playback_stopped_time = std::chrono::steady_clock::now(); - if(m_delayed_close_thread.joinable() && m_delayed_close_finished) - { - m_delayed_close_thread.join(); - m_delayed_close_finished = false; - } - - if(m_device_opened && !m_delayed_close_thread.joinable()) - m_delayed_close_thread = std::thread(&OpenCloseDevice::closeAfterDelay, this); - } - } -} -AUD_NAMESPACE_END diff --git a/extern/audaspace/src/devices/SoftwareDevice.cpp b/extern/audaspace/src/devices/SoftwareDevice.cpp index f9ad6f767d3..e11b49a0967 100644 --- a/extern/audaspace/src/devices/SoftwareDevice.cpp +++ b/extern/audaspace/src/devices/SoftwareDevice.cpp @@ -718,7 +718,7 @@ void SoftwareDevice::create() m_doppler_factor = 1.0f; m_distance_model = DISTANCE_MODEL_INVERSE_CLAMPED; m_flags = 0; - m_quality = ResampleQuality::FASTEST; + m_quality = false; } void SoftwareDevice::destroy() @@ -829,7 +829,7 @@ void SoftwareDevice::setPanning(IHandle* handle, float pan) h->m_user_pan = pan; } -void SoftwareDevice::setQuality(ResampleQuality quality) +void SoftwareDevice::setQuality(bool quality) { m_quality = quality; } @@ -886,14 +886,10 @@ std::shared_ptr SoftwareDevice::play(std::shared_ptr reader, b std::shared_ptr resampler; // resample - if (m_quality == ResampleQuality::FASTEST) - { - resampler = std::shared_ptr(new LinearResampleReader(reader, m_specs.rate)); - } + if(m_quality) + resampler = std::shared_ptr(new JOSResampleReader(reader, m_specs.rate)); else - { - resampler = std::shared_ptr(new JOSResampleReader(reader, m_specs.rate, m_quality)); - } + resampler = std::shared_ptr(new LinearResampleReader(reader, m_specs.rate)); reader = std::shared_ptr(resampler); // rechannel diff --git a/extern/audaspace/src/file/File.cpp b/extern/audaspace/src/file/File.cpp index 6900ec81ce1..5d4bae482d6 100644 --- a/extern/audaspace/src/file/File.cpp +++ b/extern/audaspace/src/file/File.cpp @@ -23,7 +23,7 @@ AUD_NAMESPACE_BEGIN -File::File(const std::string &filename, int stream) : +File::File(std::string filename, int stream) : m_filename(filename), m_stream(stream) { } diff --git a/extern/audaspace/src/file/FileManager.cpp b/extern/audaspace/src/file/FileManager.cpp index 44ede9baef0..7cbc0318f8c 100644 --- a/extern/audaspace/src/file/FileManager.cpp +++ b/extern/audaspace/src/file/FileManager.cpp @@ -43,7 +43,7 @@ void FileManager::registerOutput(std::shared_ptr output) outputs().push_back(output); } -std::shared_ptr FileManager::createReader(const std::string &filename, int stream) +std::shared_ptr FileManager::createReader(std::string filename, int stream) { for(std::shared_ptr input : inputs()) { @@ -71,7 +71,7 @@ std::shared_ptr FileManager::createReader(std::shared_ptr buffe AUD_THROW(FileException, "The file couldn't be read with any installed file reader."); } -std::vector FileManager::queryStreams(const std::string &filename) +std::vector FileManager::queryStreams(std::string filename) { for(std::shared_ptr input : inputs()) { @@ -99,7 +99,7 @@ std::vector FileManager::queryStreams(std::shared_ptr buffer AUD_THROW(FileException, "The file couldn't be read with any installed file reader."); } -std::shared_ptr FileManager::createWriter(const std::string &filename, DeviceSpecs specs, Container format, Codec codec, unsigned int bitrate) +std::shared_ptr FileManager::createWriter(std::string filename, DeviceSpecs specs, Container format, Codec codec, unsigned int bitrate) { for(std::shared_ptr output : outputs()) { diff --git a/extern/audaspace/src/file/FileWriter.cpp b/extern/audaspace/src/file/FileWriter.cpp index 32aa5264b4a..b28bbc5329d 100644 --- a/extern/audaspace/src/file/FileWriter.cpp +++ b/extern/audaspace/src/file/FileWriter.cpp @@ -22,7 +22,7 @@ AUD_NAMESPACE_BEGIN -std::shared_ptr FileWriter::createWriter(const std::string &filename,DeviceSpecs specs, Container format, Codec codec, unsigned int bitrate) +std::shared_ptr FileWriter::createWriter(std::string filename,DeviceSpecs specs, Container format, Codec codec, unsigned int bitrate) { return FileManager::createWriter(filename, specs, format, codec, bitrate); } diff --git a/extern/audaspace/src/respec/JOSResample.cpp b/extern/audaspace/src/respec/JOSResample.cpp index 774cdf7cee4..fae116d057a 100644 --- a/extern/audaspace/src/respec/JOSResample.cpp +++ b/extern/audaspace/src/respec/JOSResample.cpp @@ -19,14 +19,15 @@ AUD_NAMESPACE_BEGIN -JOSResample::JOSResample(std::shared_ptr sound, DeviceSpecs specs, ResampleQuality quality) : - SpecsChanger(sound, specs), m_quality(quality) +JOSResample::JOSResample(std::shared_ptr sound, + DeviceSpecs specs) : + SpecsChanger(sound, specs) { } std::shared_ptr JOSResample::createReader() { - return std::shared_ptr(new JOSResampleReader(getReader(), m_specs.rate, m_quality)); + return std::shared_ptr(new JOSResampleReader(getReader(), m_specs.rate)); } AUD_NAMESPACE_END diff --git a/extern/audaspace/src/respec/JOSResampleReader.cpp b/extern/audaspace/src/respec/JOSResampleReader.cpp index 1fc00f62f73..a4321bd3a19 100644 --- a/extern/audaspace/src/respec/JOSResampleReader.cpp +++ b/extern/audaspace/src/respec/JOSResampleReader.cpp @@ -45,7 +45,7 @@ static inline int lrint_impl(double x) AUD_NAMESPACE_BEGIN -JOSResampleReader::JOSResampleReader(std::shared_ptr reader, SampleRate rate, ResampleQuality quality) : +JOSResampleReader::JOSResampleReader(std::shared_ptr reader, SampleRate rate, Quality quality) : ResampleReader(reader, rate), m_channels(CHANNELS_INVALID), m_n(0), @@ -55,17 +55,17 @@ JOSResampleReader::JOSResampleReader(std::shared_ptr reader, SampleRate { switch(quality) { - case ResampleQuality::LOW: + case Quality::LOW: m_len = m_len_low; m_L = m_L_low; m_coeff = m_coeff_low; break; - case ResampleQuality::MEDIUM: + case Quality::MEDIUM: m_len = m_len_medium; m_L = m_L_medium; m_coeff = m_coeff_medium; break; - case ResampleQuality::HIGH: + case Quality::HIGH: m_len = m_len_high; m_L = m_L_high; m_coeff = m_coeff_high; diff --git a/extern/audaspace/src/sequence/Sequence.cpp b/extern/audaspace/src/sequence/Sequence.cpp index e5411d099e1..3beb225d4ee 100644 --- a/extern/audaspace/src/sequence/Sequence.cpp +++ b/extern/audaspace/src/sequence/Sequence.cpp @@ -100,9 +100,9 @@ void Sequence::remove(std::shared_ptr entry) m_sequence->remove(entry); } -std::shared_ptr Sequence::createQualityReader(ResampleQuality quality) +std::shared_ptr Sequence::createQualityReader() { - return std::shared_ptr(new SequenceReader(m_sequence, quality)); + return std::shared_ptr(new SequenceReader(m_sequence, true)); } std::shared_ptr Sequence::createReader() diff --git a/extern/audaspace/src/sequence/SequenceReader.cpp b/extern/audaspace/src/sequence/SequenceReader.cpp index 535ed7e8406..c903e8ef42e 100644 --- a/extern/audaspace/src/sequence/SequenceReader.cpp +++ b/extern/audaspace/src/sequence/SequenceReader.cpp @@ -25,7 +25,7 @@ AUD_NAMESPACE_BEGIN -SequenceReader::SequenceReader(std::shared_ptr sequence, ResampleQuality quality) : +SequenceReader::SequenceReader(std::shared_ptr sequence, bool quality) : m_position(0), m_device(sequence->m_specs), m_sequence(sequence), m_status(0), m_entry_status(0) { m_device.setQuality(quality); diff --git a/extern/audaspace/src/util/RingBuffer.cpp b/extern/audaspace/src/util/RingBuffer.cpp index 27f661b9e6b..3796684aa88 100644 --- a/extern/audaspace/src/util/RingBuffer.cpp +++ b/extern/audaspace/src/util/RingBuffer.cpp @@ -116,11 +116,6 @@ size_t RingBuffer::write(data_t* source, size_t size) return size; } -void RingBuffer::clear() -{ - m_read = m_write; -} - void RingBuffer::reset() { m_read = 0; diff --git a/extern/clew/CMakeLists.txt b/extern/clew/CMakeLists.txt new file mode 100644 index 00000000000..a9d64f286ed --- /dev/null +++ b/extern/clew/CMakeLists.txt @@ -0,0 +1,24 @@ +# SPDX-FileCopyrightText: 2006 Blender Foundation +# +# SPDX-License-Identifier: GPL-2.0-or-later + +set(INC + . + include +) + +set(INC_SYS + +) + +set(SRC + include/clew.h + src/clew.c +) + +set(LIB +) + +add_definitions(-DCL_USE_DEPRECATED_OPENCL_1_1_APIS) + +blender_add_lib(extern_clew "${SRC}" "${INC}" "${INC_SYS}" "${LIB}") diff --git a/extern/clew/README.blender b/extern/clew/README.blender new file mode 100644 index 00000000000..127b6bdac63 --- /dev/null +++ b/extern/clew/README.blender @@ -0,0 +1,5 @@ +Project: OpenCL Wrangler +URL: https://github.com/OpenCLWrangler/clew +License: Apache 2.0 +Upstream version: 27a6867 +Local modifications: None diff --git a/extern/clew/include/clew.h b/extern/clew/include/clew.h new file mode 100644 index 00000000000..0bbb95b9839 --- /dev/null +++ b/extern/clew/include/clew.h @@ -0,0 +1,2822 @@ +#ifndef CLEW_HPP_INCLUDED +#define CLEW_HPP_INCLUDED + +////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2009-2011 Organic Vectory B.V., KindDragon +// Written by George van Venrooij +// +// Distributed under the MIT License. +////////////////////////////////////////////////////////////////////////// + +//! \file clew.h +//! \brief OpenCL run-time loader header +//! +//! This file contains a copy of the contents of CL.H and CL_PLATFORM.H from the +//! official OpenCL spec. The purpose of this code is to load the OpenCL dynamic +//! library at run-time and thus allow the executable to function on many +//! platforms regardless of the vendor of the OpenCL driver actually installed. +//! Some of the techniques used here were inspired by work done in the GLEW +//! library (http://glew.sourceforge.net/) + +// Run-time dynamic linking functionality based on concepts used in GLEW +#ifdef __OPENCL_CL_H +#error cl.h included before clew.h +#endif + +#ifdef __OPENCL_CL_PLATFORM_H +#error cl_platform.h included before clew.h +#endif + +// Prevent cl.h inclusion +#define __OPENCL_CL_H +// Prevent cl_platform.h inclusion +#define __CL_PLATFORM_H + +/******************************************************************************* +* Copyright (c) 2008-2010 The Khronos Group Inc. +* +* Permission is hereby granted, free of charge, to any person obtaining a +* copy of this software and/or associated documentation files (the +* "Materials"), to deal in the Materials without restriction, including +* without limitation the rights to use, copy, modify, merge, publish, +* distribute, sublicense, and/or sell copies of the Materials, and to +* permit persons to whom the Materials are furnished to do so, subject to +* the following conditions: +* +* The above copyright notice and this permission notice shall be included +* in all copies or substantial portions of the Materials. +* +* THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +* MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. +******************************************************************************/ +#ifdef __APPLE__ + /* Contains #defines for AVAILABLE_MAC_OS_X_VERSION_10_6_AND_LATER below */ + #include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(_WIN32) + #define CL_API_ENTRY + #define CL_API_CALL __stdcall + #define CL_CALLBACK __stdcall +#else + #define CL_API_ENTRY + #define CL_API_CALL + #define CL_CALLBACK +#endif + +#ifdef __APPLE__ + #define CL_EXTENSION_WEAK_LINK __attribute__((weak_import)) + #define CL_API_SUFFIX__VERSION_1_0 AVAILABLE_MAC_OS_X_VERSION_10_6_AND_LATER + #define CL_EXT_SUFFIX__VERSION_1_0 CL_EXTENSION_WEAK_LINK AVAILABLE_MAC_OS_X_VERSION_10_6_AND_LATER + #define CL_EXT_SUFFIX__VERSION_1_0_DEPRECATED CL_EXTENSION_WEAK_LINK AVAILABLE_MAC_OS_X_VERSION_10_6_AND_LATER + #define CL_EXT_PREFIX__VERSION_1_0_DEPRECATED CL_EXTENSION_WEAK_LINK AVAILABLE_MAC_OS_X_VERSION_10_6_AND_LATER + #define CL_API_SUFFIX__VERSION_1_1 CL_EXTENSION_WEAK_LINK + #define CL_EXT_SUFFIX__VERSION_1_1 CL_EXTENSION_WEAK_LINK + #define CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED CL_EXTENSION_WEAK_LINK AVAILABLE_MAC_OS_X_VERSION_10_7_AND_LATER + #define CL_EXT_PREFIX__VERSION_1_1_DEPRECATED CL_EXTENSION_WEAK_LINK AVAILABLE_MAC_OS_X_VERSION_10_7_AND_LATER + #define CL_API_SUFFIX__VERSION_1_2 CL_EXTENSION_WEAK_LINK + #define CL_EXT_SUFFIX__VERSION_1_2 CL_EXTENSION_WEAK_LINK +#else + #define CL_EXTENSION_WEAK_LINK + #define CL_API_SUFFIX__VERSION_1_0 + #define CL_EXT_SUFFIX__VERSION_1_0 + #define CL_API_SUFFIX__VERSION_1_1 + #define CL_EXT_SUFFIX__VERSION_1_1 + #define CL_API_SUFFIX__VERSION_1_2 + #define CL_EXT_SUFFIX__VERSION_1_2 + + #if defined(__GNUC__) + #ifdef CL_USE_DEPRECATED_OPENCL_1_0_APIS + #define CL_EXT_SUFFIX__VERSION_1_0_DEPRECATED + #define CL_EXT_PREFIX__VERSION_1_0_DEPRECATED + #else + #define CL_EXT_SUFFIX__VERSION_1_0_DEPRECATED __attribute__((deprecated)) + #define CL_EXT_PREFIX__VERSION_1_0_DEPRECATED + #endif + + #ifdef CL_USE_DEPRECATED_OPENCL_1_1_APIS + #define CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED + #define CL_EXT_PREFIX__VERSION_1_1_DEPRECATED + #else + #define CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED __attribute__((deprecated)) + #define CL_EXT_PREFIX__VERSION_1_1_DEPRECATED + #endif + #elif defined(_WIN32) + #ifdef CL_USE_DEPRECATED_OPENCL_1_0_APIS + #define CL_EXT_SUFFIX__VERSION_1_0_DEPRECATED + #define CL_EXT_PREFIX__VERSION_1_0_DEPRECATED + #else + #define CL_EXT_SUFFIX__VERSION_1_0_DEPRECATED + #define CL_EXT_PREFIX__VERSION_1_0_DEPRECATED __declspec(deprecated) + #endif + + #ifdef CL_USE_DEPRECATED_OPENCL_1_1_APIS + #define CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED + #define CL_EXT_PREFIX__VERSION_1_1_DEPRECATED + #else + #define CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED + #define CL_EXT_PREFIX__VERSION_1_1_DEPRECATED __declspec(deprecated) + #endif + #else + #define CL_EXT_SUFFIX__VERSION_1_0_DEPRECATED + #define CL_EXT_PREFIX__VERSION_1_0_DEPRECATED + + #define CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED + #define CL_EXT_PREFIX__VERSION_1_1_DEPRECATED + #endif +#endif + +#if (defined (_WIN32) && defined(_MSC_VER)) + +/* scalar types */ +typedef signed __int8 cl_char; +typedef unsigned __int8 cl_uchar; +typedef signed __int16 cl_short; +typedef unsigned __int16 cl_ushort; +typedef signed __int32 cl_int; +typedef unsigned __int32 cl_uint; +typedef signed __int64 cl_long; +typedef unsigned __int64 cl_ulong; + +typedef unsigned __int16 cl_half; +typedef float cl_float; +typedef double cl_double; + +/* Macro names and corresponding values defined by OpenCL */ +#define CL_CHAR_BIT 8 +#define CL_SCHAR_MAX 127 +#define CL_SCHAR_MIN (-127-1) +#define CL_CHAR_MAX CL_SCHAR_MAX +#define CL_CHAR_MIN CL_SCHAR_MIN +#define CL_UCHAR_MAX 255 +#define CL_SHRT_MAX 32767 +#define CL_SHRT_MIN (-32767-1) +#define CL_USHRT_MAX 65535 +#define CL_INT_MAX 2147483647 +#define CL_INT_MIN (-2147483647-1) +#define CL_UINT_MAX 0xffffffffU +#define CL_LONG_MAX ((cl_long) 0x7FFFFFFFFFFFFFFFLL) +#define CL_LONG_MIN ((cl_long) -0x7FFFFFFFFFFFFFFFLL - 1LL) +#define CL_ULONG_MAX ((cl_ulong) 0xFFFFFFFFFFFFFFFFULL) + +#define CL_FLT_DIG 6 +#define CL_FLT_MANT_DIG 24 +#define CL_FLT_MAX_10_EXP +38 +#define CL_FLT_MAX_EXP +128 +#define CL_FLT_MIN_10_EXP -37 +#define CL_FLT_MIN_EXP -125 +#define CL_FLT_RADIX 2 +#define CL_FLT_MAX 340282346638528859811704183484516925440.0f +#define CL_FLT_MIN 1.175494350822287507969e-38f +#define CL_FLT_EPSILON 0x1.0p-23f + +#define CL_DBL_DIG 15 +#define CL_DBL_MANT_DIG 53 +#define CL_DBL_MAX_10_EXP +308 +#define CL_DBL_MAX_EXP +1024 +#define CL_DBL_MIN_10_EXP -307 +#define CL_DBL_MIN_EXP -1021 +#define CL_DBL_RADIX 2 +#define CL_DBL_MAX 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.0 +#define CL_DBL_MIN 2.225073858507201383090e-308 +#define CL_DBL_EPSILON 2.220446049250313080847e-16 + +#define CL_M_E 2.718281828459045090796 +#define CL_M_LOG2E 1.442695040888963387005 +#define CL_M_LOG10E 0.434294481903251816668 +#define CL_M_LN2 0.693147180559945286227 +#define CL_M_LN10 2.302585092994045901094 +#define CL_M_PI 3.141592653589793115998 +#define CL_M_PI_2 1.570796326794896557999 +#define CL_M_PI_4 0.785398163397448278999 +#define CL_M_1_PI 0.318309886183790691216 +#define CL_M_2_PI 0.636619772367581382433 +#define CL_M_2_SQRTPI 1.128379167095512558561 +#define CL_M_SQRT2 1.414213562373095145475 +#define CL_M_SQRT1_2 0.707106781186547572737 + +#define CL_M_E_F 2.71828174591064f +#define CL_M_LOG2E_F 1.44269502162933f +#define CL_M_LOG10E_F 0.43429449200630f +#define CL_M_LN2_F 0.69314718246460f +#define CL_M_LN10_F 2.30258512496948f +#define CL_M_PI_F 3.14159274101257f +#define CL_M_PI_2_F 1.57079637050629f +#define CL_M_PI_4_F 0.78539818525314f +#define CL_M_1_PI_F 0.31830987334251f +#define CL_M_2_PI_F 0.63661974668503f +#define CL_M_2_SQRTPI_F 1.12837922573090f +#define CL_M_SQRT2_F 1.41421353816986f +#define CL_M_SQRT1_2_F 0.70710676908493f + +#define CL_NAN (CL_INFINITY - CL_INFINITY) +#define CL_HUGE_VALF ((cl_float) 1e50) +#define CL_HUGE_VAL ((cl_double) 1e500) +#define CL_MAXFLOAT CL_FLT_MAX +#define CL_INFINITY CL_HUGE_VALF + +#else + +#include + +/* scalar types */ +typedef int8_t cl_char; +typedef uint8_t cl_uchar; +typedef int16_t cl_short __attribute__((aligned(2))); +typedef uint16_t cl_ushort __attribute__((aligned(2))); +typedef int32_t cl_int __attribute__((aligned(4))); +typedef uint32_t cl_uint __attribute__((aligned(4))); +typedef int64_t cl_long __attribute__((aligned(8))); +typedef uint64_t cl_ulong __attribute__((aligned(8))); + +typedef uint16_t cl_half __attribute__((aligned(2))); +typedef float cl_float __attribute__((aligned(4))); +typedef double cl_double __attribute__((aligned(8))); + +/* Macro names and corresponding values defined by OpenCL */ +#define CL_CHAR_BIT 8 +#define CL_SCHAR_MAX 127 +#define CL_SCHAR_MIN (-127-1) +#define CL_CHAR_MAX CL_SCHAR_MAX +#define CL_CHAR_MIN CL_SCHAR_MIN +#define CL_UCHAR_MAX 255 +#define CL_SHRT_MAX 32767 +#define CL_SHRT_MIN (-32767-1) +#define CL_USHRT_MAX 65535 +#define CL_INT_MAX 2147483647 +#define CL_INT_MIN (-2147483647-1) +#define CL_UINT_MAX 0xffffffffU +#define CL_LONG_MAX ((cl_long) 0x7FFFFFFFFFFFFFFFLL) +#define CL_LONG_MIN ((cl_long) -0x7FFFFFFFFFFFFFFFLL - 1LL) +#define CL_ULONG_MAX ((cl_ulong) 0xFFFFFFFFFFFFFFFFULL) + +#define CL_FLT_DIG 6 +#define CL_FLT_MANT_DIG 24 +#define CL_FLT_MAX_10_EXP +38 +#define CL_FLT_MAX_EXP +128 +#define CL_FLT_MIN_10_EXP -37 +#define CL_FLT_MIN_EXP -125 +#define CL_FLT_RADIX 2 +#define CL_FLT_MAX 0x1.fffffep127f +#define CL_FLT_MIN 0x1.0p-126f +#define CL_FLT_EPSILON 0x1.0p-23f + +#define CL_DBL_DIG 15 +#define CL_DBL_MANT_DIG 53 +#define CL_DBL_MAX_10_EXP +308 +#define CL_DBL_MAX_EXP +1024 +#define CL_DBL_MIN_10_EXP -307 +#define CL_DBL_MIN_EXP -1021 +#define CL_DBL_RADIX 2 +#define CL_DBL_MAX 0x1.fffffffffffffp1023 +#define CL_DBL_MIN 0x1.0p-1022 +#define CL_DBL_EPSILON 0x1.0p-52 + +#define CL_M_E 2.718281828459045090796 +#define CL_M_LOG2E 1.442695040888963387005 +#define CL_M_LOG10E 0.434294481903251816668 +#define CL_M_LN2 0.693147180559945286227 +#define CL_M_LN10 2.302585092994045901094 +#define CL_M_PI 3.141592653589793115998 +#define CL_M_PI_2 1.570796326794896557999 +#define CL_M_PI_4 0.785398163397448278999 +#define CL_M_1_PI 0.318309886183790691216 +#define CL_M_2_PI 0.636619772367581382433 +#define CL_M_2_SQRTPI 1.128379167095512558561 +#define CL_M_SQRT2 1.414213562373095145475 +#define CL_M_SQRT1_2 0.707106781186547572737 + +#define CL_M_E_F 2.71828174591064f +#define CL_M_LOG2E_F 1.44269502162933f +#define CL_M_LOG10E_F 0.43429449200630f +#define CL_M_LN2_F 0.69314718246460f +#define CL_M_LN10_F 2.30258512496948f +#define CL_M_PI_F 3.14159274101257f +#define CL_M_PI_2_F 1.57079637050629f +#define CL_M_PI_4_F 0.78539818525314f +#define CL_M_1_PI_F 0.31830987334251f +#define CL_M_2_PI_F 0.63661974668503f +#define CL_M_2_SQRTPI_F 1.12837922573090f +#define CL_M_SQRT2_F 1.41421353816986f +#define CL_M_SQRT1_2_F 0.70710676908493f + +#if defined( __GNUC__ ) + #define CL_HUGE_VALF __builtin_huge_valf() + #define CL_HUGE_VAL __builtin_huge_val() + #define CL_NAN __builtin_nanf( "" ) +#else + #define CL_HUGE_VALF ((cl_float) 1e50) + #define CL_HUGE_VAL ((cl_double) 1e500) + float nanf( const char * ); + #define CL_NAN nanf( "" ) +#endif +#define CL_MAXFLOAT CL_FLT_MAX +#define CL_INFINITY CL_HUGE_VALF + +#endif + +#include + +/* Mirror types to GL types. Mirror types allow us to avoid deciding which headers to load based on whether we are using GL or GLES here. */ +typedef unsigned int cl_GLuint; +typedef int cl_GLint; +typedef unsigned int cl_GLenum; + +/* + * Vector types + * + * Note: OpenCL requires that all types be naturally aligned. + * This means that vector types must be naturally aligned. + * For example, a vector of four floats must be aligned to + * a 16 byte boundary (calculated as 4 * the natural 4-byte + * alignment of the float). The alignment qualifiers here + * will only function properly if your compiler supports them + * and if you don't actively work to defeat them. For example, + * in order for a cl_float4 to be 16 byte aligned in a struct, + * the start of the struct must itself be 16-byte aligned. + * + * Maintaining proper alignment is the user's responsibility. + */ + + +#ifdef _MSC_VER +#if defined(_M_IX86) +#if _M_IX86_FP >= 0 && !defined(__SSE__) +#define __SSE__ +#endif +#if _M_IX86_FP >= 1 +# ifndef __SSE2__ +# define __SSE2__ +# endif +#endif +#elif defined(_M_X64) +# ifndef __SSE__ +# define __SSE__ +# endif +# ifndef __SSE2__ +# define __SSE2__ +# endif +#endif +#endif + +/* Define basic vector types */ +/* Workaround for ppc64el platform: conflicts with bool from C++. */ +#if defined( __VEC__ ) && !(defined(__PPC64__) && defined(__LITTLE_ENDIAN__)) + #include /* may be omitted depending on compiler. AltiVec spec provides no way to detect whether the header is required. */ + typedef vector unsigned char __cl_uchar16; + typedef vector signed char __cl_char16; + typedef vector unsigned short __cl_ushort8; + typedef vector signed short __cl_short8; + typedef vector unsigned int __cl_uint4; + typedef vector signed int __cl_int4; + typedef vector float __cl_float4; + #define __CL_UCHAR16__ 1 + #define __CL_CHAR16__ 1 + #define __CL_USHORT8__ 1 + #define __CL_SHORT8__ 1 + #define __CL_UINT4__ 1 + #define __CL_INT4__ 1 + #define __CL_FLOAT4__ 1 +#endif + +#if defined( __SSE__ ) + #if defined( __MINGW64__ ) + #include + #else + #include + #endif + #if defined( __GNUC__ ) && !defined( __ICC ) + typedef float __cl_float4 __attribute__((vector_size(16))); + #else + typedef __m128 __cl_float4; + #endif + #define __CL_FLOAT4__ 1 +#endif + +#if defined( __SSE2__ ) + #if defined( __MINGW64__ ) + #include + #else + #include + #endif + #if defined( __GNUC__ ) && !defined( __ICC ) + typedef cl_uchar __cl_uchar16 __attribute__((vector_size(16))); + typedef cl_char __cl_char16 __attribute__((vector_size(16))); + typedef cl_ushort __cl_ushort8 __attribute__((vector_size(16))); + typedef cl_short __cl_short8 __attribute__((vector_size(16))); + typedef cl_uint __cl_uint4 __attribute__((vector_size(16))); + typedef cl_int __cl_int4 __attribute__((vector_size(16))); + typedef cl_ulong __cl_ulong2 __attribute__((vector_size(16))); + typedef cl_long __cl_long2 __attribute__((vector_size(16))); + typedef cl_double __cl_double2 __attribute__((vector_size(16))); + #else + typedef __m128i __cl_uchar16; + typedef __m128i __cl_char16; + typedef __m128i __cl_ushort8; + typedef __m128i __cl_short8; + typedef __m128i __cl_uint4; + typedef __m128i __cl_int4; + typedef __m128i __cl_ulong2; + typedef __m128i __cl_long2; + typedef __m128d __cl_double2; + #endif + #define __CL_UCHAR16__ 1 + #define __CL_CHAR16__ 1 + #define __CL_USHORT8__ 1 + #define __CL_SHORT8__ 1 + #define __CL_INT4__ 1 + #define __CL_UINT4__ 1 + #define __CL_ULONG2__ 1 + #define __CL_LONG2__ 1 + #define __CL_DOUBLE2__ 1 +#endif + +#if defined( __MMX__ ) + #include + #if defined( __GNUC__ ) && !defined( __ICC ) + typedef cl_uchar __cl_uchar8 __attribute__((vector_size(8))); + typedef cl_char __cl_char8 __attribute__((vector_size(8))); + typedef cl_ushort __cl_ushort4 __attribute__((vector_size(8))); + typedef cl_short __cl_short4 __attribute__((vector_size(8))); + typedef cl_uint __cl_uint2 __attribute__((vector_size(8))); + typedef cl_int __cl_int2 __attribute__((vector_size(8))); + typedef cl_ulong __cl_ulong1 __attribute__((vector_size(8))); + typedef cl_long __cl_long1 __attribute__((vector_size(8))); + typedef cl_float __cl_float2 __attribute__((vector_size(8))); + #else + typedef __m64 __cl_uchar8; + typedef __m64 __cl_char8; + typedef __m64 __cl_ushort4; + typedef __m64 __cl_short4; + typedef __m64 __cl_uint2; + typedef __m64 __cl_int2; + typedef __m64 __cl_ulong1; + typedef __m64 __cl_long1; + typedef __m64 __cl_float2; + #endif + #define __CL_UCHAR8__ 1 + #define __CL_CHAR8__ 1 + #define __CL_USHORT4__ 1 + #define __CL_SHORT4__ 1 + #define __CL_INT2__ 1 + #define __CL_UINT2__ 1 + #define __CL_ULONG1__ 1 + #define __CL_LONG1__ 1 + #define __CL_FLOAT2__ 1 +#endif + +#if defined( __AVX__ ) + #if defined( __MINGW64__ ) + #include + #else + #include + #endif + #if defined( __GNUC__ ) && !defined( __ICC ) + typedef cl_float __cl_float8 __attribute__((vector_size(32))); + typedef cl_double __cl_double4 __attribute__((vector_size(32))); + #else + typedef __m256 __cl_float8; + typedef __m256d __cl_double4; + #endif + #define __CL_FLOAT8__ 1 + #define __CL_DOUBLE4__ 1 +#endif + +/* Define alignment keys */ +#if defined( __GNUC__ ) + #define CL_ALIGNED(_x) __attribute__ ((aligned(_x))) +#elif defined( _WIN32) && (_MSC_VER) + /* Alignment keys neutered on windows because MSVC can't swallow function arguments with alignment requirements */ + /* http://msdn.microsoft.com/en-us/library/373ak2y1%28VS.71%29.aspx */ + /* #include */ + /* #define CL_ALIGNED(_x) _CRT_ALIGN(_x) */ + #define CL_ALIGNED(_x) +#else + #warning Need to implement some method to align data here + #define CL_ALIGNED(_x) +#endif + +/* Indicate whether .xyzw, .s0123 and .hi.lo are supported */ +#if (defined( __GNUC__) && ! defined( __STRICT_ANSI__ )) || (defined( _MSC_VER ) && ! defined( __STDC__ )) + /* .xyzw and .s0123...{f|F} are supported */ + #define CL_HAS_NAMED_VECTOR_FIELDS 1 + /* .hi and .lo are supported */ + #define CL_HAS_HI_LO_VECTOR_FIELDS 1 + + #define CL_NAMED_STRUCT_SUPPORTED +#endif + +#if defined( CL_NAMED_STRUCT_SUPPORTED) && defined( _MSC_VER ) +#define __extension__ __pragma(warning(suppress:4201)) +#endif + +/* Define cl_vector types */ + +/* ---- cl_charn ---- */ +typedef union +{ + cl_char CL_ALIGNED(2) s[2]; +#if defined( CL_NAMED_STRUCT_SUPPORTED ) + __extension__ struct{ cl_char x, y; }; + __extension__ struct{ cl_char s0, s1; }; + __extension__ struct{ cl_char lo, hi; }; +#endif +#if defined( __CL_CHAR2__) + __cl_char2 v2; +#endif +}cl_char2; + +typedef union +{ + cl_char CL_ALIGNED(4) s[4]; +#if defined( CL_NAMED_STRUCT_SUPPORTED ) + __extension__ struct{ cl_char x, y, z, w; }; + __extension__ struct{ cl_char s0, s1, s2, s3; }; + __extension__ struct{ cl_char2 lo, hi; }; +#endif +#if defined( __CL_CHAR2__) + __cl_char2 v2[2]; +#endif +#if defined( __CL_CHAR4__) + __cl_char4 v4; +#endif +}cl_char4; + +/* cl_char3 is identical in size, alignment and behavior to cl_char4. See section 6.1.5. */ +typedef cl_char4 cl_char3; + +typedef union +{ + cl_char CL_ALIGNED(8) s[8]; +#if defined( CL_NAMED_STRUCT_SUPPORTED ) + __extension__ struct{ cl_char x, y, z, w; }; + __extension__ struct{ cl_char s0, s1, s2, s3, s4, s5, s6, s7; }; + __extension__ struct{ cl_char4 lo, hi; }; +#endif +#if defined( __CL_CHAR2__) + __cl_char2 v2[4]; +#endif +#if defined( __CL_CHAR4__) + __cl_char4 v4[2]; +#endif +#if defined( __CL_CHAR8__ ) + __cl_char8 v8; +#endif +}cl_char8; + +typedef union +{ + cl_char CL_ALIGNED(16) s[16]; +#if defined( CL_NAMED_STRUCT_SUPPORTED ) + __extension__ struct{ cl_char x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; }; + __extension__ struct{ cl_char s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; }; + __extension__ struct{ cl_char8 lo, hi; }; +#endif +#if defined( __CL_CHAR2__) + __cl_char2 v2[8]; +#endif +#if defined( __CL_CHAR4__) + __cl_char4 v4[4]; +#endif +#if defined( __CL_CHAR8__ ) + __cl_char8 v8[2]; +#endif +#if defined( __CL_CHAR16__ ) + __cl_char16 v16; +#endif +}cl_char16; + + +/* ---- cl_ucharn ---- */ +typedef union +{ + cl_uchar CL_ALIGNED(2) s[2]; +#if defined( CL_NAMED_STRUCT_SUPPORTED ) + __extension__ struct{ cl_uchar x, y; }; + __extension__ struct{ cl_uchar s0, s1; }; + __extension__ struct{ cl_uchar lo, hi; }; +#endif +#if defined( __cl_uchar2__) + __cl_uchar2 v2; +#endif +}cl_uchar2; + +typedef union +{ + cl_uchar CL_ALIGNED(4) s[4]; +#if defined( CL_NAMED_STRUCT_SUPPORTED ) + __extension__ struct{ cl_uchar x, y, z, w; }; + __extension__ struct{ cl_uchar s0, s1, s2, s3; }; + __extension__ struct{ cl_uchar2 lo, hi; }; +#endif +#if defined( __CL_UCHAR2__) + __cl_uchar2 v2[2]; +#endif +#if defined( __CL_UCHAR4__) + __cl_uchar4 v4; +#endif +}cl_uchar4; + +/* cl_uchar3 is identical in size, alignment and behavior to cl_uchar4. See section 6.1.5. */ +typedef cl_uchar4 cl_uchar3; + +typedef union +{ + cl_uchar CL_ALIGNED(8) s[8]; +#if defined( CL_NAMED_STRUCT_SUPPORTED ) + __extension__ struct{ cl_uchar x, y, z, w; }; + __extension__ struct{ cl_uchar s0, s1, s2, s3, s4, s5, s6, s7; }; + __extension__ struct{ cl_uchar4 lo, hi; }; +#endif +#if defined( __CL_UCHAR2__) + __cl_uchar2 v2[4]; +#endif +#if defined( __CL_UCHAR4__) + __cl_uchar4 v4[2]; +#endif +#if defined( __CL_UCHAR8__ ) + __cl_uchar8 v8; +#endif +}cl_uchar8; + +typedef union +{ + cl_uchar CL_ALIGNED(16) s[16]; +#if defined( CL_NAMED_STRUCT_SUPPORTED ) + __extension__ struct{ cl_uchar x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; }; + __extension__ struct{ cl_uchar s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; }; + __extension__ struct{ cl_uchar8 lo, hi; }; +#endif +#if defined( __CL_UCHAR2__) + __cl_uchar2 v2[8]; +#endif +#if defined( __CL_UCHAR4__) + __cl_uchar4 v4[4]; +#endif +#if defined( __CL_UCHAR8__ ) + __cl_uchar8 v8[2]; +#endif +#if defined( __CL_UCHAR16__ ) + __cl_uchar16 v16; +#endif +}cl_uchar16; + + +/* ---- cl_shortn ---- */ +typedef union +{ + cl_short CL_ALIGNED(4) s[2]; +#if defined( CL_NAMED_STRUCT_SUPPORTED ) + __extension__ struct{ cl_short x, y; }; + __extension__ struct{ cl_short s0, s1; }; + __extension__ struct{ cl_short lo, hi; }; +#endif +#if defined( __CL_SHORT2__) + __cl_short2 v2; +#endif +}cl_short2; + +typedef union +{ + cl_short CL_ALIGNED(8) s[4]; +#if defined( CL_NAMED_STRUCT_SUPPORTED ) + __extension__ struct{ cl_short x, y, z, w; }; + __extension__ struct{ cl_short s0, s1, s2, s3; }; + __extension__ struct{ cl_short2 lo, hi; }; +#endif +#if defined( __CL_SHORT2__) + __cl_short2 v2[2]; +#endif +#if defined( __CL_SHORT4__) + __cl_short4 v4; +#endif +}cl_short4; + +/* cl_short3 is identical in size, alignment and behavior to cl_short4. See section 6.1.5. */ +typedef cl_short4 cl_short3; + +typedef union +{ + cl_short CL_ALIGNED(16) s[8]; +#if defined( CL_NAMED_STRUCT_SUPPORTED ) + __extension__ struct{ cl_short x, y, z, w; }; + __extension__ struct{ cl_short s0, s1, s2, s3, s4, s5, s6, s7; }; + __extension__ struct{ cl_short4 lo, hi; }; +#endif +#if defined( __CL_SHORT2__) + __cl_short2 v2[4]; +#endif +#if defined( __CL_SHORT4__) + __cl_short4 v4[2]; +#endif +#if defined( __CL_SHORT8__ ) + __cl_short8 v8; +#endif +}cl_short8; + +typedef union +{ + cl_short CL_ALIGNED(32) s[16]; +#if defined( CL_NAMED_STRUCT_SUPPORTED ) + __extension__ struct{ cl_short x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; }; + __extension__ struct{ cl_short s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; }; + __extension__ struct{ cl_short8 lo, hi; }; +#endif +#if defined( __CL_SHORT2__) + __cl_short2 v2[8]; +#endif +#if defined( __CL_SHORT4__) + __cl_short4 v4[4]; +#endif +#if defined( __CL_SHORT8__ ) + __cl_short8 v8[2]; +#endif +#if defined( __CL_SHORT16__ ) + __cl_short16 v16; +#endif +}cl_short16; + + +/* ---- cl_ushortn ---- */ +typedef union +{ + cl_ushort CL_ALIGNED(4) s[2]; +#if defined( CL_NAMED_STRUCT_SUPPORTED ) + __extension__ struct{ cl_ushort x, y; }; + __extension__ struct{ cl_ushort s0, s1; }; + __extension__ struct{ cl_ushort lo, hi; }; +#endif +#if defined( __CL_USHORT2__) + __cl_ushort2 v2; +#endif +}cl_ushort2; + +typedef union +{ + cl_ushort CL_ALIGNED(8) s[4]; +#if defined( CL_NAMED_STRUCT_SUPPORTED ) + __extension__ struct{ cl_ushort x, y, z, w; }; + __extension__ struct{ cl_ushort s0, s1, s2, s3; }; + __extension__ struct{ cl_ushort2 lo, hi; }; +#endif +#if defined( __CL_USHORT2__) + __cl_ushort2 v2[2]; +#endif +#if defined( __CL_USHORT4__) + __cl_ushort4 v4; +#endif +}cl_ushort4; + +/* cl_ushort3 is identical in size, alignment and behavior to cl_ushort4. See section 6.1.5. */ +typedef cl_ushort4 cl_ushort3; + +typedef union +{ + cl_ushort CL_ALIGNED(16) s[8]; +#if defined( CL_NAMED_STRUCT_SUPPORTED ) + __extension__ struct{ cl_ushort x, y, z, w; }; + __extension__ struct{ cl_ushort s0, s1, s2, s3, s4, s5, s6, s7; }; + __extension__ struct{ cl_ushort4 lo, hi; }; +#endif +#if defined( __CL_USHORT2__) + __cl_ushort2 v2[4]; +#endif +#if defined( __CL_USHORT4__) + __cl_ushort4 v4[2]; +#endif +#if defined( __CL_USHORT8__ ) + __cl_ushort8 v8; +#endif +}cl_ushort8; + +typedef union +{ + cl_ushort CL_ALIGNED(32) s[16]; +#if defined( CL_NAMED_STRUCT_SUPPORTED ) + __extension__ struct{ cl_ushort x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; }; + __extension__ struct{ cl_ushort s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; }; + __extension__ struct{ cl_ushort8 lo, hi; }; +#endif +#if defined( __CL_USHORT2__) + __cl_ushort2 v2[8]; +#endif +#if defined( __CL_USHORT4__) + __cl_ushort4 v4[4]; +#endif +#if defined( __CL_USHORT8__ ) + __cl_ushort8 v8[2]; +#endif +#if defined( __CL_USHORT16__ ) + __cl_ushort16 v16; +#endif +}cl_ushort16; + +/* ---- cl_intn ---- */ +typedef union +{ + cl_int CL_ALIGNED(8) s[2]; +#if defined( CL_NAMED_STRUCT_SUPPORTED ) + __extension__ struct{ cl_int x, y; }; + __extension__ struct{ cl_int s0, s1; }; + __extension__ struct{ cl_int lo, hi; }; +#endif +#if defined( __CL_INT2__) + __cl_int2 v2; +#endif +}cl_int2; + +typedef union +{ + cl_int CL_ALIGNED(16) s[4]; +#if defined( CL_NAMED_STRUCT_SUPPORTED ) + __extension__ struct{ cl_int x, y, z, w; }; + __extension__ struct{ cl_int s0, s1, s2, s3; }; + __extension__ struct{ cl_int2 lo, hi; }; +#endif +#if defined( __CL_INT2__) + __cl_int2 v2[2]; +#endif +#if defined( __CL_INT4__) + __cl_int4 v4; +#endif +}cl_int4; + +/* cl_int3 is identical in size, alignment and behavior to cl_int4. See section 6.1.5. */ +typedef cl_int4 cl_int3; + +typedef union +{ + cl_int CL_ALIGNED(32) s[8]; +#if defined( CL_NAMED_STRUCT_SUPPORTED ) + __extension__ struct{ cl_int x, y, z, w; }; + __extension__ struct{ cl_int s0, s1, s2, s3, s4, s5, s6, s7; }; + __extension__ struct{ cl_int4 lo, hi; }; +#endif +#if defined( __CL_INT2__) + __cl_int2 v2[4]; +#endif +#if defined( __CL_INT4__) + __cl_int4 v4[2]; +#endif +#if defined( __CL_INT8__ ) + __cl_int8 v8; +#endif +}cl_int8; + +typedef union +{ + cl_int CL_ALIGNED(64) s[16]; +#if defined( CL_NAMED_STRUCT_SUPPORTED ) + __extension__ struct{ cl_int x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; }; + __extension__ struct{ cl_int s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; }; + __extension__ struct{ cl_int8 lo, hi; }; +#endif +#if defined( __CL_INT2__) + __cl_int2 v2[8]; +#endif +#if defined( __CL_INT4__) + __cl_int4 v4[4]; +#endif +#if defined( __CL_INT8__ ) + __cl_int8 v8[2]; +#endif +#if defined( __CL_INT16__ ) + __cl_int16 v16; +#endif +}cl_int16; + + +/* ---- cl_uintn ---- */ +typedef union +{ + cl_uint CL_ALIGNED(8) s[2]; +#if defined( CL_NAMED_STRUCT_SUPPORTED ) + __extension__ struct{ cl_uint x, y; }; + __extension__ struct{ cl_uint s0, s1; }; + __extension__ struct{ cl_uint lo, hi; }; +#endif +#if defined( __CL_UINT2__) + __cl_uint2 v2; +#endif +}cl_uint2; + +typedef union +{ + cl_uint CL_ALIGNED(16) s[4]; +#if defined( CL_NAMED_STRUCT_SUPPORTED ) + __extension__ struct{ cl_uint x, y, z, w; }; + __extension__ struct{ cl_uint s0, s1, s2, s3; }; + __extension__ struct{ cl_uint2 lo, hi; }; +#endif +#if defined( __CL_UINT2__) + __cl_uint2 v2[2]; +#endif +#if defined( __CL_UINT4__) + __cl_uint4 v4; +#endif +}cl_uint4; + +/* cl_uint3 is identical in size, alignment and behavior to cl_uint4. See section 6.1.5. */ +typedef cl_uint4 cl_uint3; + +typedef union +{ + cl_uint CL_ALIGNED(32) s[8]; +#if defined( CL_NAMED_STRUCT_SUPPORTED ) + __extension__ struct{ cl_uint x, y, z, w; }; + __extension__ struct{ cl_uint s0, s1, s2, s3, s4, s5, s6, s7; }; + __extension__ struct{ cl_uint4 lo, hi; }; +#endif +#if defined( __CL_UINT2__) + __cl_uint2 v2[4]; +#endif +#if defined( __CL_UINT4__) + __cl_uint4 v4[2]; +#endif +#if defined( __CL_UINT8__ ) + __cl_uint8 v8; +#endif +}cl_uint8; + +typedef union +{ + cl_uint CL_ALIGNED(64) s[16]; +#if defined( CL_NAMED_STRUCT_SUPPORTED ) + __extension__ struct{ cl_uint x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; }; + __extension__ struct{ cl_uint s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; }; + __extension__ struct{ cl_uint8 lo, hi; }; +#endif +#if defined( __CL_UINT2__) + __cl_uint2 v2[8]; +#endif +#if defined( __CL_UINT4__) + __cl_uint4 v4[4]; +#endif +#if defined( __CL_UINT8__ ) + __cl_uint8 v8[2]; +#endif +#if defined( __CL_UINT16__ ) + __cl_uint16 v16; +#endif +}cl_uint16; + +/* ---- cl_longn ---- */ +typedef union +{ + cl_long CL_ALIGNED(16) s[2]; +#if defined( CL_NAMED_STRUCT_SUPPORTED ) + __extension__ struct{ cl_long x, y; }; + __extension__ struct{ cl_long s0, s1; }; + __extension__ struct{ cl_long lo, hi; }; +#endif +#if defined( __CL_LONG2__) + __cl_long2 v2; +#endif +}cl_long2; + +typedef union +{ + cl_long CL_ALIGNED(32) s[4]; +#if defined( CL_NAMED_STRUCT_SUPPORTED ) + __extension__ struct{ cl_long x, y, z, w; }; + __extension__ struct{ cl_long s0, s1, s2, s3; }; + __extension__ struct{ cl_long2 lo, hi; }; +#endif +#if defined( __CL_LONG2__) + __cl_long2 v2[2]; +#endif +#if defined( __CL_LONG4__) + __cl_long4 v4; +#endif +}cl_long4; + +/* cl_long3 is identical in size, alignment and behavior to cl_long4. See section 6.1.5. */ +typedef cl_long4 cl_long3; + +typedef union +{ + cl_long CL_ALIGNED(64) s[8]; +#if defined( CL_NAMED_STRUCT_SUPPORTED ) + __extension__ struct{ cl_long x, y, z, w; }; + __extension__ struct{ cl_long s0, s1, s2, s3, s4, s5, s6, s7; }; + __extension__ struct{ cl_long4 lo, hi; }; +#endif +#if defined( __CL_LONG2__) + __cl_long2 v2[4]; +#endif +#if defined( __CL_LONG4__) + __cl_long4 v4[2]; +#endif +#if defined( __CL_LONG8__ ) + __cl_long8 v8; +#endif +}cl_long8; + +typedef union +{ + cl_long CL_ALIGNED(128) s[16]; +#if defined( CL_NAMED_STRUCT_SUPPORTED ) + __extension__ struct{ cl_long x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; }; + __extension__ struct{ cl_long s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; }; + __extension__ struct{ cl_long8 lo, hi; }; +#endif +#if defined( __CL_LONG2__) + __cl_long2 v2[8]; +#endif +#if defined( __CL_LONG4__) + __cl_long4 v4[4]; +#endif +#if defined( __CL_LONG8__ ) + __cl_long8 v8[2]; +#endif +#if defined( __CL_LONG16__ ) + __cl_long16 v16; +#endif +}cl_long16; + + +/* ---- cl_ulongn ---- */ +typedef union +{ + cl_ulong CL_ALIGNED(16) s[2]; +#if defined( CL_NAMED_STRUCT_SUPPORTED ) + __extension__ struct{ cl_ulong x, y; }; + __extension__ struct{ cl_ulong s0, s1; }; + __extension__ struct{ cl_ulong lo, hi; }; +#endif +#if defined( __CL_ULONG2__) + __cl_ulong2 v2; +#endif +}cl_ulong2; + +typedef union +{ + cl_ulong CL_ALIGNED(32) s[4]; +#if defined( CL_NAMED_STRUCT_SUPPORTED ) + __extension__ struct{ cl_ulong x, y, z, w; }; + __extension__ struct{ cl_ulong s0, s1, s2, s3; }; + __extension__ struct{ cl_ulong2 lo, hi; }; +#endif +#if defined( __CL_ULONG2__) + __cl_ulong2 v2[2]; +#endif +#if defined( __CL_ULONG4__) + __cl_ulong4 v4; +#endif +}cl_ulong4; + +/* cl_ulong3 is identical in size, alignment and behavior to cl_ulong4. See section 6.1.5. */ +typedef cl_ulong4 cl_ulong3; + +typedef union +{ + cl_ulong CL_ALIGNED(64) s[8]; +#if defined( CL_NAMED_STRUCT_SUPPORTED ) + __extension__ struct{ cl_ulong x, y, z, w; }; + __extension__ struct{ cl_ulong s0, s1, s2, s3, s4, s5, s6, s7; }; + __extension__ struct{ cl_ulong4 lo, hi; }; +#endif +#if defined( __CL_ULONG2__) + __cl_ulong2 v2[4]; +#endif +#if defined( __CL_ULONG4__) + __cl_ulong4 v4[2]; +#endif +#if defined( __CL_ULONG8__ ) + __cl_ulong8 v8; +#endif +}cl_ulong8; + +typedef union +{ + cl_ulong CL_ALIGNED(128) s[16]; +#if defined( CL_NAMED_STRUCT_SUPPORTED ) + __extension__ struct{ cl_ulong x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; }; + __extension__ struct{ cl_ulong s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; }; + __extension__ struct{ cl_ulong8 lo, hi; }; +#endif +#if defined( __CL_ULONG2__) + __cl_ulong2 v2[8]; +#endif +#if defined( __CL_ULONG4__) + __cl_ulong4 v4[4]; +#endif +#if defined( __CL_ULONG8__ ) + __cl_ulong8 v8[2]; +#endif +#if defined( __CL_ULONG16__ ) + __cl_ulong16 v16; +#endif +}cl_ulong16; + + +/* --- cl_floatn ---- */ + +typedef union +{ + cl_float CL_ALIGNED(8) s[2]; +#if defined( CL_NAMED_STRUCT_SUPPORTED ) + __extension__ struct{ cl_float x, y; }; + __extension__ struct{ cl_float s0, s1; }; + __extension__ struct{ cl_float lo, hi; }; +#endif +#if defined( __CL_FLOAT2__) + __cl_float2 v2; +#endif +}cl_float2; + +typedef union +{ + cl_float CL_ALIGNED(16) s[4]; +#if defined( CL_NAMED_STRUCT_SUPPORTED ) + __extension__ struct{ cl_float x, y, z, w; }; + __extension__ struct{ cl_float s0, s1, s2, s3; }; + __extension__ struct{ cl_float2 lo, hi; }; +#endif +#if defined( __CL_FLOAT2__) + __cl_float2 v2[2]; +#endif +#if defined( __CL_FLOAT4__) + __cl_float4 v4; +#endif +}cl_float4; + +/* cl_float3 is identical in size, alignment and behavior to cl_float4. See section 6.1.5. */ +typedef cl_float4 cl_float3; + +typedef union +{ + cl_float CL_ALIGNED(32) s[8]; +#if defined( CL_NAMED_STRUCT_SUPPORTED ) + __extension__ struct{ cl_float x, y, z, w; }; + __extension__ struct{ cl_float s0, s1, s2, s3, s4, s5, s6, s7; }; + __extension__ struct{ cl_float4 lo, hi; }; +#endif +#if defined( __CL_FLOAT2__) + __cl_float2 v2[4]; +#endif +#if defined( __CL_FLOAT4__) + __cl_float4 v4[2]; +#endif +#if defined( __CL_FLOAT8__ ) + __cl_float8 v8; +#endif +}cl_float8; + +typedef union +{ + cl_float CL_ALIGNED(64) s[16]; +#if defined( CL_NAMED_STRUCT_SUPPORTED ) + __extension__ struct{ cl_float x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; }; + __extension__ struct{ cl_float s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; }; + __extension__ struct{ cl_float8 lo, hi; }; +#endif +#if defined( __CL_FLOAT2__) + __cl_float2 v2[8]; +#endif +#if defined( __CL_FLOAT4__) + __cl_float4 v4[4]; +#endif +#if defined( __CL_FLOAT8__ ) + __cl_float8 v8[2]; +#endif +#if defined( __CL_FLOAT16__ ) + __cl_float16 v16; +#endif +}cl_float16; + +/* --- cl_doublen ---- */ + +typedef union +{ + cl_double CL_ALIGNED(16) s[2]; +#if defined( CL_NAMED_STRUCT_SUPPORTED ) + __extension__ struct{ cl_double x, y; }; + __extension__ struct{ cl_double s0, s1; }; + __extension__ struct{ cl_double lo, hi; }; +#endif +#if defined( __CL_DOUBLE2__) + __cl_double2 v2; +#endif +}cl_double2; + +typedef union +{ + cl_double CL_ALIGNED(32) s[4]; +#if defined( CL_NAMED_STRUCT_SUPPORTED ) + __extension__ struct{ cl_double x, y, z, w; }; + __extension__ struct{ cl_double s0, s1, s2, s3; }; + __extension__ struct{ cl_double2 lo, hi; }; +#endif +#if defined( __CL_DOUBLE2__) + __cl_double2 v2[2]; +#endif +#if defined( __CL_DOUBLE4__) + __cl_double4 v4; +#endif +}cl_double4; + +/* cl_double3 is identical in size, alignment and behavior to cl_double4. See section 6.1.5. */ +typedef cl_double4 cl_double3; + +typedef union +{ + cl_double CL_ALIGNED(64) s[8]; +#if defined( CL_NAMED_STRUCT_SUPPORTED ) + __extension__ struct{ cl_double x, y, z, w; }; + __extension__ struct{ cl_double s0, s1, s2, s3, s4, s5, s6, s7; }; + __extension__ struct{ cl_double4 lo, hi; }; +#endif +#if defined( __CL_DOUBLE2__) + __cl_double2 v2[4]; +#endif +#if defined( __CL_DOUBLE4__) + __cl_double4 v4[2]; +#endif +#if defined( __CL_DOUBLE8__ ) + __cl_double8 v8; +#endif +}cl_double8; + +typedef union +{ + cl_double CL_ALIGNED(128) s[16]; +#if defined( CL_NAMED_STRUCT_SUPPORTED ) + __extension__ struct{ cl_double x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; }; + __extension__ struct{ cl_double s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; }; + __extension__ struct{ cl_double8 lo, hi; }; +#endif +#if defined( __CL_DOUBLE2__) + __cl_double2 v2[8]; +#endif +#if defined( __CL_DOUBLE4__) + __cl_double4 v4[4]; +#endif +#if defined( __CL_DOUBLE8__ ) + __cl_double8 v8[2]; +#endif +#if defined( __CL_DOUBLE16__ ) + __cl_double16 v16; +#endif +}cl_double16; + +/* Macro to facilitate debugging + * Usage: + * Place CL_PROGRAM_STRING_DEBUG_INFO on the line before the first line of your source. + * The first line ends with: CL_PROGRAM_STRING_BEGIN \" + * Each line thereafter of OpenCL C source must end with: \n\ + * The last line ends in "; + * + * Example: + * + * const char *my_program = CL_PROGRAM_STRING_BEGIN "\ + * kernel void foo( int a, float * b ) \n\ + * { \n\ + * // my comment \n\ + * *b[ get_global_id(0)] = a; \n\ + * } \n\ + * "; + * + * This should correctly set up the line, (column) and file information for your source + * string so you can do source level debugging. + */ +#define __CL_STRINGIFY( _x ) # _x +#define _CL_STRINGIFY( _x ) __CL_STRINGIFY( _x ) +#define CL_PROGRAM_STRING_DEBUG_INFO "#line " _CL_STRINGIFY(__LINE__) " \"" __FILE__ "\" \n\n" + +// CL.h contents +/******************************************************************************/ + +typedef struct _cl_platform_id * cl_platform_id; +typedef struct _cl_device_id * cl_device_id; +typedef struct _cl_context * cl_context; +typedef struct _cl_command_queue * cl_command_queue; +typedef struct _cl_mem * cl_mem; +typedef struct _cl_program * cl_program; +typedef struct _cl_kernel * cl_kernel; +typedef struct _cl_event * cl_event; +typedef struct _cl_sampler * cl_sampler; + +typedef cl_uint cl_bool; /* WARNING! Unlike cl_ types in cl_platform.h, cl_bool is not guaranteed to be the same size as the bool in kernels. */ +typedef cl_ulong cl_bitfield; +typedef cl_bitfield cl_device_type; +typedef cl_uint cl_platform_info; +typedef cl_uint cl_device_info; +typedef cl_bitfield cl_device_fp_config; +typedef cl_uint cl_device_mem_cache_type; +typedef cl_uint cl_device_local_mem_type; +typedef cl_bitfield cl_device_exec_capabilities; +typedef cl_bitfield cl_command_queue_properties; +typedef intptr_t cl_device_partition_property; +typedef cl_bitfield cl_device_affinity_domain; + +typedef intptr_t cl_context_properties; +typedef cl_uint cl_context_info; +typedef cl_uint cl_command_queue_info; +typedef cl_uint cl_channel_order; +typedef cl_uint cl_channel_type; +typedef cl_bitfield cl_mem_flags; +typedef cl_uint cl_mem_object_type; +typedef cl_uint cl_mem_info; +typedef cl_uint cl_image_info; +typedef cl_uint cl_buffer_create_type; +typedef cl_uint cl_addressing_mode; +typedef cl_uint cl_filter_mode; +typedef cl_uint cl_sampler_info; +typedef cl_bitfield cl_map_flags; +typedef cl_uint cl_program_info; +typedef cl_uint cl_program_build_info; +typedef cl_int cl_build_status; +typedef cl_uint cl_kernel_info; +typedef cl_uint cl_kernel_work_group_info; +typedef cl_uint cl_event_info; +typedef cl_uint cl_command_type; +typedef cl_uint cl_profiling_info; + +typedef struct _cl_image_format { + cl_channel_order image_channel_order; + cl_channel_type image_channel_data_type; +} cl_image_format; + +typedef struct _cl_image_desc { + cl_mem_object_type image_type; + size_t image_width; + size_t image_height; + size_t image_depth; + size_t image_array_size; + size_t image_row_pitch; + size_t image_slice_pitch; + cl_uint num_mip_levels; + cl_uint num_samples; + cl_mem buffer; + } cl_image_desc; + +typedef struct _cl_buffer_region { + size_t origin; + size_t size; +} cl_buffer_region; + +/******************************************************************************/ + +/* Error Codes */ +#define CL_SUCCESS 0 +#define CL_DEVICE_NOT_FOUND -1 +#define CL_DEVICE_NOT_AVAILABLE -2 +#define CL_COMPILER_NOT_AVAILABLE -3 +#define CL_MEM_OBJECT_ALLOCATION_FAILURE -4 +#define CL_OUT_OF_RESOURCES -5 +#define CL_OUT_OF_HOST_MEMORY -6 +#define CL_PROFILING_INFO_NOT_AVAILABLE -7 +#define CL_MEM_COPY_OVERLAP -8 +#define CL_IMAGE_FORMAT_MISMATCH -9 +#define CL_IMAGE_FORMAT_NOT_SUPPORTED -10 +#define CL_BUILD_PROGRAM_FAILURE -11 +#define CL_MAP_FAILURE -12 +#define CL_MISALIGNED_SUB_BUFFER_OFFSET -13 +#define CL_EXEC_STATUS_ERROR_FOR_EVENTS_IN_WAIT_LIST -14 +#define CL_COMPILE_PROGRAM_FAILURE -15 +#define CL_LINKER_NOT_AVAILABLE -16 +#define CL_LINK_PROGRAM_FAILURE -17 +#define CL_DEVICE_PARTITION_FAILED -18 +#define CL_KERNEL_ARG_INFO_NOT_AVAILABLE -19 + +#define CL_INVALID_VALUE -30 +#define CL_INVALID_DEVICE_TYPE -31 +#define CL_INVALID_PLATFORM -32 +#define CL_INVALID_DEVICE -33 +#define CL_INVALID_CONTEXT -34 +#define CL_INVALID_QUEUE_PROPERTIES -35 +#define CL_INVALID_COMMAND_QUEUE -36 +#define CL_INVALID_HOST_PTR -37 +#define CL_INVALID_MEM_OBJECT -38 +#define CL_INVALID_IMAGE_FORMAT_DESCRIPTOR -39 +#define CL_INVALID_IMAGE_SIZE -40 +#define CL_INVALID_SAMPLER -41 +#define CL_INVALID_BINARY -42 +#define CL_INVALID_BUILD_OPTIONS -43 +#define CL_INVALID_PROGRAM -44 +#define CL_INVALID_PROGRAM_EXECUTABLE -45 +#define CL_INVALID_KERNEL_NAME -46 +#define CL_INVALID_KERNEL_DEFINITION -47 +#define CL_INVALID_KERNEL -48 +#define CL_INVALID_ARG_INDEX -49 +#define CL_INVALID_ARG_VALUE -50 +#define CL_INVALID_ARG_SIZE -51 +#define CL_INVALID_KERNEL_ARGS -52 +#define CL_INVALID_WORK_DIMENSION -53 +#define CL_INVALID_WORK_GROUP_SIZE -54 +#define CL_INVALID_WORK_ITEM_SIZE -55 +#define CL_INVALID_GLOBAL_OFFSET -56 +#define CL_INVALID_EVENT_WAIT_LIST -57 +#define CL_INVALID_EVENT -58 +#define CL_INVALID_OPERATION -59 +#define CL_INVALID_GL_OBJECT -60 +#define CL_INVALID_BUFFER_SIZE -61 +#define CL_INVALID_MIP_LEVEL -62 +#define CL_INVALID_GLOBAL_WORK_SIZE -63 +#define CL_INVALID_PROPERTY -64 +#define CL_INVALID_IMAGE_DESCRIPTOR -65 +#define CL_INVALID_COMPILER_OPTIONS -66 +#define CL_INVALID_LINKER_OPTIONS -67 +#define CL_INVALID_DEVICE_PARTITION_COUNT -68 + +/* OpenCL Version */ +#define CL_VERSION_1_0 1 +#define CL_VERSION_1_1 1 +#define CL_VERSION_1_2 1 + +/* cl_bool */ +#define CL_FALSE 0 +#define CL_TRUE 1 +#define CL_BLOCKING CL_TRUE +#define CL_NON_BLOCKING CL_FALSE + +/* cl_platform_info */ +#define CL_PLATFORM_PROFILE 0x0900 +#define CL_PLATFORM_VERSION 0x0901 +#define CL_PLATFORM_NAME 0x0902 +#define CL_PLATFORM_VENDOR 0x0903 +#define CL_PLATFORM_EXTENSIONS 0x0904 + +/* cl_device_type - bitfield */ +#define CL_DEVICE_TYPE_DEFAULT (1 << 0) +#define CL_DEVICE_TYPE_CPU (1 << 1) +#define CL_DEVICE_TYPE_GPU (1 << 2) +#define CL_DEVICE_TYPE_ACCELERATOR (1 << 3) +#define CL_DEVICE_TYPE_CUSTOM (1 << 4) +#define CL_DEVICE_TYPE_ALL 0xFFFFFFFF + +/* cl_device_info */ +#define CL_DEVICE_TYPE 0x1000 +#define CL_DEVICE_VENDOR_ID 0x1001 +#define CL_DEVICE_MAX_COMPUTE_UNITS 0x1002 +#define CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS 0x1003 +#define CL_DEVICE_MAX_WORK_GROUP_SIZE 0x1004 +#define CL_DEVICE_MAX_WORK_ITEM_SIZES 0x1005 +#define CL_DEVICE_PREFERRED_VECTOR_WIDTH_CHAR 0x1006 +#define CL_DEVICE_PREFERRED_VECTOR_WIDTH_SHORT 0x1007 +#define CL_DEVICE_PREFERRED_VECTOR_WIDTH_INT 0x1008 +#define CL_DEVICE_PREFERRED_VECTOR_WIDTH_LONG 0x1009 +#define CL_DEVICE_PREFERRED_VECTOR_WIDTH_FLOAT 0x100A +#define CL_DEVICE_PREFERRED_VECTOR_WIDTH_DOUBLE 0x100B +#define CL_DEVICE_MAX_CLOCK_FREQUENCY 0x100C +#define CL_DEVICE_ADDRESS_BITS 0x100D +#define CL_DEVICE_MAX_READ_IMAGE_ARGS 0x100E +#define CL_DEVICE_MAX_WRITE_IMAGE_ARGS 0x100F +#define CL_DEVICE_MAX_MEM_ALLOC_SIZE 0x1010 +#define CL_DEVICE_IMAGE2D_MAX_WIDTH 0x1011 +#define CL_DEVICE_IMAGE2D_MAX_HEIGHT 0x1012 +#define CL_DEVICE_IMAGE3D_MAX_WIDTH 0x1013 +#define CL_DEVICE_IMAGE3D_MAX_HEIGHT 0x1014 +#define CL_DEVICE_IMAGE3D_MAX_DEPTH 0x1015 +#define CL_DEVICE_IMAGE_SUPPORT 0x1016 +#define CL_DEVICE_MAX_PARAMETER_SIZE 0x1017 +#define CL_DEVICE_MAX_SAMPLERS 0x1018 +#define CL_DEVICE_MEM_BASE_ADDR_ALIGN 0x1019 +#define CL_DEVICE_MIN_DATA_TYPE_ALIGN_SIZE 0x101A +#define CL_DEVICE_SINGLE_FP_CONFIG 0x101B +#define CL_DEVICE_GLOBAL_MEM_CACHE_TYPE 0x101C +#define CL_DEVICE_GLOBAL_MEM_CACHELINE_SIZE 0x101D +#define CL_DEVICE_GLOBAL_MEM_CACHE_SIZE 0x101E +#define CL_DEVICE_GLOBAL_MEM_SIZE 0x101F +#define CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE 0x1020 +#define CL_DEVICE_MAX_CONSTANT_ARGS 0x1021 +#define CL_DEVICE_LOCAL_MEM_TYPE 0x1022 +#define CL_DEVICE_LOCAL_MEM_SIZE 0x1023 +#define CL_DEVICE_ERROR_CORRECTION_SUPPORT 0x1024 +#define CL_DEVICE_PROFILING_TIMER_RESOLUTION 0x1025 +#define CL_DEVICE_ENDIAN_LITTLE 0x1026 +#define CL_DEVICE_AVAILABLE 0x1027 +#define CL_DEVICE_COMPILER_AVAILABLE 0x1028 +#define CL_DEVICE_EXECUTION_CAPABILITIES 0x1029 +#define CL_DEVICE_QUEUE_PROPERTIES 0x102A +#define CL_DEVICE_NAME 0x102B +#define CL_DEVICE_VENDOR 0x102C +#define CL_DRIVER_VERSION 0x102D +#define CL_DEVICE_PROFILE 0x102E +#define CL_DEVICE_VERSION 0x102F +#define CL_DEVICE_EXTENSIONS 0x1030 +#define CL_DEVICE_PLATFORM 0x1031 +#define CL_DEVICE_DOUBLE_FP_CONFIG 0x1032 +/* 0x1033 reserved for CL_DEVICE_HALF_FP_CONFIG */ +#define CL_DEVICE_PREFERRED_VECTOR_WIDTH_HALF 0x1034 +#define CL_DEVICE_HOST_UNIFIED_MEMORY 0x1035 +#define CL_DEVICE_NATIVE_VECTOR_WIDTH_CHAR 0x1036 +#define CL_DEVICE_NATIVE_VECTOR_WIDTH_SHORT 0x1037 +#define CL_DEVICE_NATIVE_VECTOR_WIDTH_INT 0x1038 +#define CL_DEVICE_NATIVE_VECTOR_WIDTH_LONG 0x1039 +#define CL_DEVICE_NATIVE_VECTOR_WIDTH_FLOAT 0x103A +#define CL_DEVICE_NATIVE_VECTOR_WIDTH_DOUBLE 0x103B +#define CL_DEVICE_NATIVE_VECTOR_WIDTH_HALF 0x103C +#define CL_DEVICE_OPENCL_C_VERSION 0x103D +#define CL_DEVICE_LINKER_AVAILABLE 0x103E +#define CL_DEVICE_BUILT_IN_KERNELS 0x103F +#define CL_DEVICE_IMAGE_MAX_BUFFER_SIZE 0x1040 +#define CL_DEVICE_IMAGE_MAX_ARRAY_SIZE 0x1041 +#define CL_DEVICE_PARENT_DEVICE 0x1042 +#define CL_DEVICE_PARTITION_MAX_SUB_DEVICES 0x1043 +#define CL_DEVICE_PARTITION_PROPERTIES 0x1044 +#define CL_DEVICE_PARTITION_AFFINITY_DOMAIN 0x1045 +#define CL_DEVICE_PARTITION_TYPE 0x1046 +#define CL_DEVICE_REFERENCE_COUNT 0x1047 +#define CL_DEVICE_PREFERRED_INTEROP_USER_SYNC 0x1048 +#define CL_DEVICE_PRINTF_BUFFER_SIZE 0x1049 +#define CL_DEVICE_IMAGE_PITCH_ALIGNMENT 0x104A +#define CL_DEVICE_IMAGE_BASE_ADDRESS_ALIGNMENT 0x104B + +/* cl_device_fp_config - bitfield */ +#define CL_FP_DENORM (1 << 0) +#define CL_FP_INF_NAN (1 << 1) +#define CL_FP_ROUND_TO_NEAREST (1 << 2) +#define CL_FP_ROUND_TO_ZERO (1 << 3) +#define CL_FP_ROUND_TO_INF (1 << 4) +#define CL_FP_FMA (1 << 5) +#define CL_FP_SOFT_FLOAT (1 << 6) +#define CL_FP_CORRECTLY_ROUNDED_DIVIDE_SQRT (1 << 7) + +/* cl_device_mem_cache_type */ +#define CL_NONE 0x0 +#define CL_READ_ONLY_CACHE 0x1 +#define CL_READ_WRITE_CACHE 0x2 + +/* cl_device_local_mem_type */ +#define CL_LOCAL 0x1 +#define CL_GLOBAL 0x2 + +/* cl_device_exec_capabilities - bitfield */ +#define CL_EXEC_KERNEL (1 << 0) +#define CL_EXEC_NATIVE_KERNEL (1 << 1) + +/* cl_command_queue_properties - bitfield */ +#define CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE (1 << 0) +#define CL_QUEUE_PROFILING_ENABLE (1 << 1) + +/* cl_context_info */ +#define CL_CONTEXT_REFERENCE_COUNT 0x1080 +#define CL_CONTEXT_DEVICES 0x1081 +#define CL_CONTEXT_PROPERTIES 0x1082 +#define CL_CONTEXT_NUM_DEVICES 0x1083 + +/* cl_context_info + cl_context_properties */ +#define CL_CONTEXT_PLATFORM 0x1084 +#define CL_CONTEXT_INTEROP_USER_SYNC 0x1085 + +/* cl_device_partition_property */ +#define CL_DEVICE_PARTITION_EQUALLY 0x1086 +#define CL_DEVICE_PARTITION_BY_COUNTS 0x1087 +#define CL_DEVICE_PARTITION_BY_COUNTS_LIST_END 0x0 +#define CL_DEVICE_PARTITION_BY_AFFINITY_DOMAIN 0x1088 + +/* cl_device_affinity_domain */ +#define CL_DEVICE_AFFINITY_DOMAIN_NUMA (1 << 0) +#define CL_DEVICE_AFFINITY_DOMAIN_L4_CACHE (1 << 1) +#define CL_DEVICE_AFFINITY_DOMAIN_L3_CACHE (1 << 2) +#define CL_DEVICE_AFFINITY_DOMAIN_L2_CACHE (1 << 3) +#define CL_DEVICE_AFFINITY_DOMAIN_L1_CACHE (1 << 4) +#define CL_DEVICE_AFFINITY_DOMAIN_NEXT_PARTITIONABLE (1 << 5) + +/* cl_command_queue_info */ +#define CL_QUEUE_CONTEXT 0x1090 +#define CL_QUEUE_DEVICE 0x1091 +#define CL_QUEUE_REFERENCE_COUNT 0x1092 +#define CL_QUEUE_PROPERTIES 0x1093 + +/* cl_mem_flags - bitfield */ +#define CL_MEM_READ_WRITE (1 << 0) +#define CL_MEM_WRITE_ONLY (1 << 1) +#define CL_MEM_READ_ONLY (1 << 2) +#define CL_MEM_USE_HOST_PTR (1 << 3) +#define CL_MEM_ALLOC_HOST_PTR (1 << 4) +#define CL_MEM_COPY_HOST_PTR (1 << 5) +// reserved (1 << 6) +#define CL_MEM_HOST_WRITE_ONLY (1 << 7) +#define CL_MEM_HOST_READ_ONLY (1 << 8) +#define CL_MEM_HOST_NO_ACCESS (1 << 9) + +/* cl_mem_migration_flags - bitfield */ +#define CL_MIGRATE_MEM_OBJECT_HOST (1 << 0) +#define CL_MIGRATE_MEM_OBJECT_CONTENT_UNDEFINED (1 << 1) + +/* cl_channel_order */ +#define CL_R 0x10B0 +#define CL_A 0x10B1 +#define CL_RG 0x10B2 +#define CL_RA 0x10B3 +#define CL_RGB 0x10B4 +#define CL_RGBA 0x10B5 +#define CL_BGRA 0x10B6 +#define CL_ARGB 0x10B7 +#define CL_INTENSITY 0x10B8 +#define CL_LUMINANCE 0x10B9 +#define CL_Rx 0x10BA +#define CL_RGx 0x10BB +#define CL_RGBx 0x10BC +#define CL_DEPTH 0x10BD +#define CL_DEPTH_STENCIL 0x10BE + +/* cl_channel_type */ +#define CL_SNORM_INT8 0x10D0 +#define CL_SNORM_INT16 0x10D1 +#define CL_UNORM_INT8 0x10D2 +#define CL_UNORM_INT16 0x10D3 +#define CL_UNORM_SHORT_565 0x10D4 +#define CL_UNORM_SHORT_555 0x10D5 +#define CL_UNORM_INT_101010 0x10D6 +#define CL_SIGNED_INT8 0x10D7 +#define CL_SIGNED_INT16 0x10D8 +#define CL_SIGNED_INT32 0x10D9 +#define CL_UNSIGNED_INT8 0x10DA +#define CL_UNSIGNED_INT16 0x10DB +#define CL_UNSIGNED_INT32 0x10DC +#define CL_HALF_FLOAT 0x10DD +#define CL_FLOAT 0x10DE +#define CL_UNORM_INT24 0x10DF + +/* cl_mem_object_type */ +#define CL_MEM_OBJECT_BUFFER 0x10F0 +#define CL_MEM_OBJECT_IMAGE2D 0x10F1 +#define CL_MEM_OBJECT_IMAGE3D 0x10F2 +#define CL_MEM_OBJECT_IMAGE2D_ARRAY 0x10F3 +#define CL_MEM_OBJECT_IMAGE1D 0x10F4 +#define CL_MEM_OBJECT_IMAGE1D_ARRAY 0x10F5 +#define CL_MEM_OBJECT_IMAGE1D_BUFFER 0x10F6 + +/* cl_mem_info */ +#define CL_MEM_TYPE 0x1100 +#define CL_MEM_FLAGS 0x1101 +#define CL_MEM_SIZE 0x1102 +#define CL_MEM_HOST_PTR 0x1103 +#define CL_MEM_MAP_COUNT 0x1104 +#define CL_MEM_REFERENCE_COUNT 0x1105 +#define CL_MEM_CONTEXT 0x1106 +#define CL_MEM_ASSOCIATED_MEMOBJECT 0x1107 +#define CL_MEM_OFFSET 0x1108 + +/* cl_image_info */ +#define CL_IMAGE_FORMAT 0x1110 +#define CL_IMAGE_ELEMENT_SIZE 0x1111 +#define CL_IMAGE_ROW_PITCH 0x1112 +#define CL_IMAGE_SLICE_PITCH 0x1113 +#define CL_IMAGE_WIDTH 0x1114 +#define CL_IMAGE_HEIGHT 0x1115 +#define CL_IMAGE_DEPTH 0x1116 +#define CL_IMAGE_ARRAY_SIZE 0x1117 +#define CL_IMAGE_BUFFER 0x1118 +#define CL_IMAGE_NUM_MIP_LEVELS 0x1119 +#define CL_IMAGE_NUM_SAMPLES 0x111A + +/* cl_addressing_mode */ +#define CL_ADDRESS_NONE 0x1130 +#define CL_ADDRESS_CLAMP_TO_EDGE 0x1131 +#define CL_ADDRESS_CLAMP 0x1132 +#define CL_ADDRESS_REPEAT 0x1133 +#define CL_ADDRESS_MIRRORED_REPEAT 0x1134 + +/* cl_filter_mode */ +#define CL_FILTER_NEAREST 0x1140 +#define CL_FILTER_LINEAR 0x1141 + +/* cl_sampler_info */ +#define CL_SAMPLER_REFERENCE_COUNT 0x1150 +#define CL_SAMPLER_CONTEXT 0x1151 +#define CL_SAMPLER_NORMALIZED_COORDS 0x1152 +#define CL_SAMPLER_ADDRESSING_MODE 0x1153 +#define CL_SAMPLER_FILTER_MODE 0x1154 + +/* cl_map_flags - bitfield */ +#define CL_MAP_READ (1 << 0) +#define CL_MAP_WRITE (1 << 1) +#define CL_MAP_WRITE_INVALIDATE_REGION (1 << 2) + +/* cl_program_info */ +#define CL_PROGRAM_REFERENCE_COUNT 0x1160 +#define CL_PROGRAM_CONTEXT 0x1161 +#define CL_PROGRAM_NUM_DEVICES 0x1162 +#define CL_PROGRAM_DEVICES 0x1163 +#define CL_PROGRAM_SOURCE 0x1164 +#define CL_PROGRAM_BINARY_SIZES 0x1165 +#define CL_PROGRAM_BINARIES 0x1166 +#define CL_PROGRAM_NUM_KERNELS 0x1167 +#define CL_PROGRAM_KERNEL_NAMES 0x1168 + +/* cl_program_build_info */ +#define CL_PROGRAM_BUILD_STATUS 0x1181 +#define CL_PROGRAM_BUILD_OPTIONS 0x1182 +#define CL_PROGRAM_BUILD_LOG 0x1183 +#define CL_PROGRAM_BINARY_TYPE 0x1184 + +/* cl_build_status */ +#define CL_BUILD_SUCCESS 0 +#define CL_BUILD_NONE -1 +#define CL_BUILD_ERROR -2 +#define CL_BUILD_IN_PROGRESS -3 + +/* cl_kernel_info */ +#define CL_KERNEL_FUNCTION_NAME 0x1190 +#define CL_KERNEL_NUM_ARGS 0x1191 +#define CL_KERNEL_REFERENCE_COUNT 0x1192 +#define CL_KERNEL_CONTEXT 0x1193 +#define CL_KERNEL_PROGRAM 0x1194 +#define CL_KERNEL_ATTRIBUTES 0x1195 + +/* cl_kernel_arg_info */ +#define CL_KERNEL_ARG_ADDRESS_QUALIFIER 0x1196 +#define CL_KERNEL_ARG_ACCESS_QUALIFIER 0x1197 +#define CL_KERNEL_ARG_TYPE_NAME 0x1198 +#define CL_KERNEL_ARG_TYPE_QUALIFIER 0x1199 +#define CL_KERNEL_ARG_NAME 0x119A + +/* cl_kernel_arg_address_qualifier */ +#define CL_KERNEL_ARG_ADDRESS_GLOBAL 0x119B +#define CL_KERNEL_ARG_ADDRESS_LOCAL 0x119C +#define CL_KERNEL_ARG_ADDRESS_CONSTANT 0x119D +#define CL_KERNEL_ARG_ADDRESS_PRIVATE 0x119E + +/* cl_kernel_arg_access_qualifier */ +#define CL_KERNEL_ARG_ACCESS_READ_ONLY 0x11A0 +#define CL_KERNEL_ARG_ACCESS_WRITE_ONLY 0x11A1 +#define CL_KERNEL_ARG_ACCESS_READ_WRITE 0x11A2 +#define CL_KERNEL_ARG_ACCESS_NONE 0x11A3 + +/* cl_kernel_arg_type_qualifer */ +#define CL_KERNEL_ARG_TYPE_NONE 0 +#define CL_KERNEL_ARG_TYPE_CONST (1 << 0) +#define CL_KERNEL_ARG_TYPE_RESTRICT (1 << 1) +#define CL_KERNEL_ARG_TYPE_VOLATILE (1 << 2) + +/* cl_kernel_work_group_info */ +#define CL_KERNEL_WORK_GROUP_SIZE 0x11B0 +#define CL_KERNEL_COMPILE_WORK_GROUP_SIZE 0x11B1 +#define CL_KERNEL_LOCAL_MEM_SIZE 0x11B2 +#define CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE 0x11B3 +#define CL_KERNEL_PRIVATE_MEM_SIZE 0x11B4 +#define CL_KERNEL_GLOBAL_WORK_SIZE 0x11B5 + +/* cl_event_info */ +#define CL_EVENT_COMMAND_QUEUE 0x11D0 +#define CL_EVENT_COMMAND_TYPE 0x11D1 +#define CL_EVENT_REFERENCE_COUNT 0x11D2 +#define CL_EVENT_COMMAND_EXECUTION_STATUS 0x11D3 +#define CL_EVENT_CONTEXT 0x11D4 + +/* cl_command_type */ +#define CL_COMMAND_NDRANGE_KERNEL 0x11F0 +#define CL_COMMAND_TASK 0x11F1 +#define CL_COMMAND_NATIVE_KERNEL 0x11F2 +#define CL_COMMAND_READ_BUFFER 0x11F3 +#define CL_COMMAND_WRITE_BUFFER 0x11F4 +#define CL_COMMAND_COPY_BUFFER 0x11F5 +#define CL_COMMAND_READ_IMAGE 0x11F6 +#define CL_COMMAND_WRITE_IMAGE 0x11F7 +#define CL_COMMAND_COPY_IMAGE 0x11F8 +#define CL_COMMAND_COPY_IMAGE_TO_BUFFER 0x11F9 +#define CL_COMMAND_COPY_BUFFER_TO_IMAGE 0x11FA +#define CL_COMMAND_MAP_BUFFER 0x11FB +#define CL_COMMAND_MAP_IMAGE 0x11FC +#define CL_COMMAND_UNMAP_MEM_OBJECT 0x11FD +#define CL_COMMAND_MARKER 0x11FE +#define CL_COMMAND_ACQUIRE_GL_OBJECTS 0x11FF +#define CL_COMMAND_RELEASE_GL_OBJECTS 0x1200 +#define CL_COMMAND_READ_BUFFER_RECT 0x1201 +#define CL_COMMAND_WRITE_BUFFER_RECT 0x1202 +#define CL_COMMAND_COPY_BUFFER_RECT 0x1203 +#define CL_COMMAND_USER 0x1204 +#define CL_COMMAND_BARRIER 0x1205 +#define CL_COMMAND_MIGRATE_MEM_OBJECTS 0x1206 +#define CL_COMMAND_FILL_BUFFER 0x1207 +#define CL_COMMAND_FILL_IMAGE 0x1208 + +/* command execution status */ +#define CL_COMPLETE 0x0 +#define CL_RUNNING 0x1 +#define CL_SUBMITTED 0x2 +#define CL_QUEUED 0x3 + +/* cl_buffer_create_type */ +#define CL_BUFFER_CREATE_TYPE_REGION 0x1220 + +/* cl_profiling_info */ +#define CL_PROFILING_COMMAND_QUEUED 0x1280 +#define CL_PROFILING_COMMAND_SUBMIT 0x1281 +#define CL_PROFILING_COMMAND_START 0x1282 +#define CL_PROFILING_COMMAND_END 0x1283 + +/********************************************************************************************************/ + +/********************************************************************************************************/ + +/* Function signature typedef's */ + +#ifdef __APPLE__ +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wignored-attributes" +#endif + +/* Platform API */ +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLGETPLATFORMIDS)(cl_uint /* num_entries */, + cl_platform_id * /* platforms */, + cl_uint * /* num_platforms */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLGETPLATFORMINFO)(cl_platform_id /* platform */, + cl_platform_info /* param_name */, + size_t /* param_value_size */, + void * /* param_value */, + size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; + +/* Device APIs */ +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLGETDEVICEIDS)(cl_platform_id /* platform */, + cl_device_type /* device_type */, + cl_uint /* num_entries */, + cl_device_id * /* devices */, + cl_uint * /* num_devices */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLGETDEVICEINFO)(cl_device_id /* device */, + cl_device_info /* param_name */, + size_t /* param_value_size */, + void * /* param_value */, + size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLCREATESUBDEVICES)(cl_device_id /* in_device */, + const cl_device_partition_property * /* properties */, + cl_uint /* num_devices */, + cl_device_id * /* out_devices */, + cl_uint * /* num_devices_ret */) CL_API_SUFFIX__VERSION_1_2; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLRETAINDEVICE)(cl_device_id /* device */) CL_API_SUFFIX__VERSION_1_2; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLRELEASEDEVICE)(cl_device_id /* device */) CL_API_SUFFIX__VERSION_1_2; + +// Context APIs +typedef CL_API_ENTRY cl_context (CL_API_CALL * +PFNCLCREATECONTEXT)(const cl_context_properties * /* properties */, + cl_uint /* num_devices */, + const cl_device_id * /* devices */, + void (CL_CALLBACK * /* pfn_notify */)(const char *, const void *, size_t, void *), + void * /* user_data */, + cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_context (CL_API_CALL * +PFNCLCREATECONTEXTFROMTYPE)(const cl_context_properties * /* properties */, + cl_device_type /* device_type */, + void (CL_CALLBACK * /* pfn_notify*/ )(const char *, const void *, size_t, void *), + void * /* user_data */, + cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLRETAINCONTEXT)(cl_context /* context */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLRELEASECONTEXT)(cl_context /* context */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLGETCONTEXTINFO)(cl_context /* context */, + cl_context_info /* param_name */, + size_t /* param_value_size */, + void * /* param_value */, + size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; + +/* Command Queue APIs */ +typedef CL_API_ENTRY cl_command_queue (CL_API_CALL * +PFNCLCREATECOMMANDQUEUE)(cl_context /* context */, + cl_device_id /* device */, + cl_command_queue_properties /* properties */, + cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLRETAINCOMMANDQUEUE)(cl_command_queue /* command_queue */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLRELEASECOMMANDQUEUE)(cl_command_queue /* command_queue */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLGETCOMMANDQUEUEINFO)(cl_command_queue /* command_queue */, + cl_command_queue_info /* param_name */, + size_t /* param_value_size */, + void * /* param_value */, + size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLSETCOMMANDQUEUEPROPERTY)(cl_command_queue /* command_queue */, + cl_command_queue_properties /* properties */, + cl_bool /* enable */, + cl_command_queue_properties * /* old_properties */) CL_API_SUFFIX__VERSION_1_0; + +/* Memory Object APIs */ +typedef CL_API_ENTRY cl_mem (CL_API_CALL * +PFNCLCREATEBUFFER)(cl_context /* context */, + cl_mem_flags /* flags */, + size_t /* size */, + void * /* host_ptr */, + cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_mem (CL_API_CALL * +PFNCLCREATESUBBUFFER)(cl_mem /* buffer */, + cl_mem_flags /* flags */, + cl_buffer_create_type /* buffer_create_type */, + const void * /* buffer_create_info */, + cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_1; + +typedef CL_API_ENTRY cl_mem (CL_API_CALL * +PFNCLCREATEIMAGE)(cl_context /* context */, + cl_mem_flags /* flags */, + const cl_image_format * /* image_format */, + const cl_image_desc * /* image_desc */, + void * /* host_ptr */, + cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_2; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLRETAINMEMOBJECT)(cl_mem /* memobj */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLRELEASEMEMOBJECT)(cl_mem /* memobj */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLGETSUPPORTEDIMAGEFORMATS)(cl_context /* context */, + cl_mem_flags /* flags */, + cl_mem_object_type /* image_type */, + cl_uint /* num_entries */, + cl_image_format * /* image_formats */, + cl_uint * /* num_image_formats */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLGETMEMOBJECTINFO)(cl_mem /* memobj */, + cl_mem_info /* param_name */, + size_t /* param_value_size */, + void * /* param_value */, + size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLGETIMAGEINFO)(cl_mem /* image */, + cl_image_info /* param_name */, + size_t /* param_value_size */, + void * /* param_value */, + size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLSETMEMOBJECTDESTRUCTORCALLBACK)( cl_mem /* memobj */, + void (CL_CALLBACK * /*pfn_notify*/)( cl_mem /* memobj */, void* /*user_data*/), + void * /*user_data */ ) CL_API_SUFFIX__VERSION_1_1; + +/* Sampler APIs */ +typedef CL_API_ENTRY cl_sampler (CL_API_CALL * +PFNCLCREATESAMPLER)(cl_context /* context */, + cl_bool /* normalized_coords */, + cl_addressing_mode /* addressing_mode */, + cl_filter_mode /* filter_mode */, + cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLRETAINSAMPLER)(cl_sampler /* sampler */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLRELEASESAMPLER)(cl_sampler /* sampler */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLGETSAMPLERINFO)(cl_sampler /* sampler */, + cl_sampler_info /* param_name */, + size_t /* param_value_size */, + void * /* param_value */, + size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; + +/* Program Object APIs */ +typedef CL_API_ENTRY cl_program (CL_API_CALL * +PFNCLCREATEPROGRAMWITHSOURCE)(cl_context /* context */, + cl_uint /* count */, + const char ** /* strings */, + const size_t * /* lengths */, + cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_program (CL_API_CALL * +PFNCLCREATEPROGRAMWITHBINARY)(cl_context /* context */, + cl_uint /* num_devices */, + const cl_device_id * /* device_list */, + const size_t * /* lengths */, + const unsigned char ** /* binaries */, + cl_int * /* binary_status */, + cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_program (CL_API_CALL * +PFNCLCREATEPROGRAMWITHBUILTINKERNELS)(cl_context /* context */, + cl_uint /* num_devices */, + const cl_device_id * /* device_list */, + const char * /* kernel_names */, + cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_2; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLRETAINPROGRAM)(cl_program /* program */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLRELEASEPROGRAM)(cl_program /* program */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLBUILDPROGRAM)(cl_program /* program */, + cl_uint /* num_devices */, + const cl_device_id * /* device_list */, + const char * /* options */, + void (CL_CALLBACK * /* pfn_notify */)(cl_program /* program */, void * /* user_data */), + void * /* user_data */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLGETPROGRAMINFO)(cl_program /* program */, + cl_program_info /* param_name */, + size_t /* param_value_size */, + void * /* param_value */, + size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLGETPROGRAMBUILDINFO)(cl_program /* program */, + cl_device_id /* device */, + cl_program_build_info /* param_name */, + size_t /* param_value_size */, + void * /* param_value */, + size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; + +/* Kernel Object APIs */ +typedef CL_API_ENTRY cl_kernel (CL_API_CALL * +PFNCLCREATEKERNEL)(cl_program /* program */, + const char * /* kernel_name */, + cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLCREATEKERNELSINPROGRAM)(cl_program /* program */, + cl_uint /* num_kernels */, + cl_kernel * /* kernels */, + cl_uint * /* num_kernels_ret */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLRETAINKERNEL)(cl_kernel /* kernel */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLRELEASEKERNEL)(cl_kernel /* kernel */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLSETKERNELARG)(cl_kernel /* kernel */, + cl_uint /* arg_index */, + size_t /* arg_size */, + const void * /* arg_value */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLGETKERNELINFO)(cl_kernel /* kernel */, + cl_kernel_info /* param_name */, + size_t /* param_value_size */, + void * /* param_value */, + size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLGETKERNELWORKGROUPINFO)(cl_kernel /* kernel */, + cl_device_id /* device */, + cl_kernel_work_group_info /* param_name */, + size_t /* param_value_size */, + void * /* param_value */, + size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; + +// Event Object APIs +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLWAITFOREVENTS)(cl_uint /* num_events */, + const cl_event * /* event_list */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLGETEVENTINFO)(cl_event /* event */, + cl_event_info /* param_name */, + size_t /* param_value_size */, + void * /* param_value */, + size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_event (CL_API_CALL * +PFNCLCREATEUSEREVENT)(cl_context /* context */, + cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_1; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLRETAINEVENT)(cl_event /* event */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLRELEASEEVENT)(cl_event /* event */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLSETUSEREVENTSTATUS)(cl_event /* event */, + cl_int /* execution_status */) CL_API_SUFFIX__VERSION_1_1; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLSETEVENTCALLBACK)( cl_event /* event */, + cl_int /* command_exec_callback_type */, + void (CL_CALLBACK * /* pfn_notify */)(cl_event, cl_int, void *), + void * /* user_data */) CL_API_SUFFIX__VERSION_1_1; + +/* Profiling APIs */ +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLGETEVENTPROFILINGINFO)(cl_event /* event */, + cl_profiling_info /* param_name */, + size_t /* param_value_size */, + void * /* param_value */, + size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; + +// Flush and Finish APIs +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLFLUSH)(cl_command_queue /* command_queue */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLFINISH)(cl_command_queue /* command_queue */) CL_API_SUFFIX__VERSION_1_0; + +/* Enqueued Commands APIs */ +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLENQUEUEREADBUFFER)(cl_command_queue /* command_queue */, + cl_mem /* buffer */, + cl_bool /* blocking_read */, + size_t /* offset */, + size_t /* cb */, + void * /* ptr */, + cl_uint /* num_events_in_wait_list */, + const cl_event * /* event_wait_list */, + cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLENQUEUEREADBUFFERRECT)(cl_command_queue /* command_queue */, + cl_mem /* buffer */, + cl_bool /* blocking_read */, + const size_t * /* buffer_origin */, + const size_t * /* host_origin */, + const size_t * /* region */, + size_t /* buffer_row_pitch */, + size_t /* buffer_slice_pitch */, + size_t /* host_row_pitch */, + size_t /* host_slice_pitch */, + void * /* ptr */, + cl_uint /* num_events_in_wait_list */, + const cl_event * /* event_wait_list */, + cl_event * /* event */) CL_API_SUFFIX__VERSION_1_1; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLENQUEUEWRITEBUFFER)(cl_command_queue /* command_queue */, + cl_mem /* buffer */, + cl_bool /* blocking_write */, + size_t /* offset */, + size_t /* cb */, + const void * /* ptr */, + cl_uint /* num_events_in_wait_list */, + const cl_event * /* event_wait_list */, + cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLENQUEUEWRITEBUFFERRECT)(cl_command_queue /* command_queue */, + cl_mem /* buffer */, + cl_bool /* blocking_write */, + const size_t * /* buffer_origin */, + const size_t * /* host_origin */, + const size_t * /* region */, + size_t /* buffer_row_pitch */, + size_t /* buffer_slice_pitch */, + size_t /* host_row_pitch */, + size_t /* host_slice_pitch */, + const void * /* ptr */, + cl_uint /* num_events_in_wait_list */, + const cl_event * /* event_wait_list */, + cl_event * /* event */) CL_API_SUFFIX__VERSION_1_1; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLENQUEUECOPYBUFFER)(cl_command_queue /* command_queue */, + cl_mem /* src_buffer */, + cl_mem /* dst_buffer */, + size_t /* src_offset */, + size_t /* dst_offset */, + size_t /* cb */, + cl_uint /* num_events_in_wait_list */, + const cl_event * /* event_wait_list */, + cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLENQUEUECOPYBUFFERRECT)(cl_command_queue /* command_queue */, + cl_mem /* src_buffer */, + cl_mem /* dst_buffer */, + const size_t * /* src_origin */, + const size_t * /* dst_origin */, + const size_t * /* region */, + size_t /* src_row_pitch */, + size_t /* src_slice_pitch */, + size_t /* dst_row_pitch */, + size_t /* dst_slice_pitch */, + cl_uint /* num_events_in_wait_list */, + const cl_event * /* event_wait_list */, + cl_event * /* event */) CL_API_SUFFIX__VERSION_1_1; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLENQUEUEREADIMAGE)(cl_command_queue /* command_queue */, + cl_mem /* image */, + cl_bool /* blocking_read */, + const size_t * /* origin[3] */, + const size_t * /* region[3] */, + size_t /* row_pitch */, + size_t /* slice_pitch */, + void * /* ptr */, + cl_uint /* num_events_in_wait_list */, + const cl_event * /* event_wait_list */, + cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLENQUEUEWRITEIMAGE)(cl_command_queue /* command_queue */, + cl_mem /* image */, + cl_bool /* blocking_write */, + const size_t * /* origin[3] */, + const size_t * /* region[3] */, + size_t /* input_row_pitch */, + size_t /* input_slice_pitch */, + const void * /* ptr */, + cl_uint /* num_events_in_wait_list */, + const cl_event * /* event_wait_list */, + cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLENQUEUECOPYIMAGE)(cl_command_queue /* command_queue */, + cl_mem /* src_image */, + cl_mem /* dst_image */, + const size_t * /* src_origin[3] */, + const size_t * /* dst_origin[3] */, + const size_t * /* region[3] */, + cl_uint /* num_events_in_wait_list */, + const cl_event * /* event_wait_list */, + cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLENQUEUECOPYIMAGETOBUFFER)(cl_command_queue /* command_queue */, + cl_mem /* src_image */, + cl_mem /* dst_buffer */, + const size_t * /* src_origin[3] */, + const size_t * /* region[3] */, + size_t /* dst_offset */, + cl_uint /* num_events_in_wait_list */, + const cl_event * /* event_wait_list */, + cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLENQUEUECOPYBUFFERTOIMAGE)(cl_command_queue /* command_queue */, + cl_mem /* src_buffer */, + cl_mem /* dst_image */, + size_t /* src_offset */, + const size_t * /* dst_origin[3] */, + const size_t * /* region[3] */, + cl_uint /* num_events_in_wait_list */, + const cl_event * /* event_wait_list */, + cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY void * (CL_API_CALL * +PFNCLENQUEUEMAPBUFFER)(cl_command_queue /* command_queue */, + cl_mem /* buffer */, + cl_bool /* blocking_map */, + cl_map_flags /* map_flags */, + size_t /* offset */, + size_t /* cb */, + cl_uint /* num_events_in_wait_list */, + const cl_event * /* event_wait_list */, + cl_event * /* event */, + cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY void * (CL_API_CALL * +PFNCLENQUEUEMAPIMAGE)(cl_command_queue /* command_queue */, + cl_mem /* image */, + cl_bool /* blocking_map */, + cl_map_flags /* map_flags */, + const size_t * /* origin[3] */, + const size_t * /* region[3] */, + size_t * /* image_row_pitch */, + size_t * /* image_slice_pitch */, + cl_uint /* num_events_in_wait_list */, + const cl_event * /* event_wait_list */, + cl_event * /* event */, + cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLENQUEUEUNMAPMEMOBJECT)(cl_command_queue /* command_queue */, + cl_mem /* memobj */, + void * /* mapped_ptr */, + cl_uint /* num_events_in_wait_list */, + const cl_event * /* event_wait_list */, + cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLENQUEUENDRANGEKERNEL)(cl_command_queue /* command_queue */, + cl_kernel /* kernel */, + cl_uint /* work_dim */, + const size_t * /* global_work_offset */, + const size_t * /* global_work_size */, + const size_t * /* local_work_size */, + cl_uint /* num_events_in_wait_list */, + const cl_event * /* event_wait_list */, + cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLENQUEUETASK)(cl_command_queue /* command_queue */, + cl_kernel /* kernel */, + cl_uint /* num_events_in_wait_list */, + const cl_event * /* event_wait_list */, + cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLENQUEUENATIVEKERNEL)(cl_command_queue /* command_queue */, + void (*user_func)(void *), + void * /* args */, + size_t /* cb_args */, + cl_uint /* num_mem_objects */, + const cl_mem * /* mem_list */, + const void ** /* args_mem_loc */, + cl_uint /* num_events_in_wait_list */, + const cl_event * /* event_wait_list */, + cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; + +/* Extension function access +* +* Returns the extension function address for the given function name, +* or NULL if a valid function can not be found. The client must +* check to make sure the address is not NULL, before using or +* calling the returned function address. +*/ +typedef CL_API_ENTRY void * (CL_API_CALL * +PFNCLGETEXTENSIONFUNCTIONADDRESSFORPLATFORM)(cl_platform_id /* platform */, + const char * /* func_name */) CL_API_SUFFIX__VERSION_1_2; +#ifdef CL_USE_DEPRECATED_OPENCL_1_1_APIS +// Deprecated OpenCL 1.1 APIs +typedef CL_API_ENTRY CL_EXT_PREFIX__VERSION_1_1_DEPRECATED cl_mem (CL_API_CALL * +PFNCLCREATEIMAGE2D)(cl_context /* context */, + cl_mem_flags /* flags */, + const cl_image_format * /* image_format */, + size_t /* image_width */, + size_t /* image_height */, + size_t /* image_row_pitch */, + void * /* host_ptr */, + cl_int * /* errcode_ret */) CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED; + +typedef CL_API_ENTRY CL_EXT_PREFIX__VERSION_1_1_DEPRECATED cl_mem (CL_API_CALL * +PFNCLCREATEIMAGE3D)(cl_context /* context */, + cl_mem_flags /* flags */, + const cl_image_format * /* image_format */, + size_t /* image_width */, + size_t /* image_height */, + size_t /* image_depth */, + size_t /* image_row_pitch */, + size_t /* image_slice_pitch */, + void * /* host_ptr */, + cl_int * /* errcode_ret */) CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED; + +typedef CL_API_ENTRY CL_EXT_PREFIX__VERSION_1_1_DEPRECATED cl_int (CL_API_CALL * +PFNCLENQUEUEMARKER)(cl_command_queue /* command_queue */, + cl_event * /* event */) CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED; + +typedef CL_API_ENTRY CL_EXT_PREFIX__VERSION_1_1_DEPRECATED cl_int (CL_API_CALL * +PFNCLENQUEUEWAITFOREVENTS)(cl_command_queue /* command_queue */, + cl_uint /* num_events */, + const cl_event * /* event_list */) CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED; + +typedef CL_API_ENTRY CL_EXT_PREFIX__VERSION_1_1_DEPRECATED cl_int (CL_API_CALL * +PFNCLENQUEUEBARRIER)(cl_command_queue /* command_queue */) CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED; + +typedef CL_API_ENTRY CL_EXT_PREFIX__VERSION_1_1_DEPRECATED cl_int (CL_API_CALL * +PFNCLUNLOADCOMPILER)(void) CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED; + +typedef CL_API_ENTRY CL_EXT_PREFIX__VERSION_1_1_DEPRECATED void * (CL_API_CALL * +PFNCLGETEXTENSIONFUNCTIONADDRESS)(const char * /* func_name */) CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED; +#endif + + +/* cl_gl */ + +typedef cl_uint cl_gl_object_type; +typedef cl_uint cl_gl_texture_info; +typedef cl_uint cl_gl_platform_info; +typedef struct __GLsync *cl_GLsync; + +/* cl_gl_object_type = 0x2000 - 0x200F enum values are currently taken */ +#define CL_GL_OBJECT_BUFFER 0x2000 +#define CL_GL_OBJECT_TEXTURE2D 0x2001 +#define CL_GL_OBJECT_TEXTURE3D 0x2002 +#define CL_GL_OBJECT_RENDERBUFFER 0x2003 +#define CL_GL_OBJECT_TEXTURE2D_ARRAY 0x200E +#define CL_GL_OBJECT_TEXTURE1D 0x200F +#define CL_GL_OBJECT_TEXTURE1D_ARRAY 0x2010 +#define CL_GL_OBJECT_TEXTURE_BUFFER 0x2011 + +/* cl_gl_texture_info */ +#define CL_GL_TEXTURE_TARGET 0x2004 +#define CL_GL_MIPMAP_LEVEL 0x2005 +#define CL_GL_NUM_SAMPLES 0x2012 + + +typedef CL_API_ENTRY cl_mem (CL_API_CALL * +PFNCLCREATEFROMGLBUFFER)(cl_context /* context */, + cl_mem_flags /* flags */, + cl_GLuint /* bufobj */, + int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_mem (CL_API_CALL * +PFNCLCREATEFROMGLTEXTURE)(cl_context /* context */, + cl_mem_flags /* flags */, + cl_GLenum /* target */, + cl_GLint /* miplevel */, + cl_GLuint /* texture */, + cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_2; + +typedef CL_API_ENTRY cl_mem (CL_API_CALL * +PFNCLCREATEFROMGLRENDERBUFFER)(cl_context /* context */, + cl_mem_flags /* flags */, + cl_GLuint /* renderbuffer */, + cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLGETGLOBJECTINFO)(cl_mem /* memobj */, + cl_gl_object_type * /* gl_object_type */, + cl_GLuint * /* gl_object_name */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLGETGLTEXTUREINFO)(cl_mem /* memobj */, + cl_gl_texture_info /* param_name */, + size_t /* param_value_size */, + void * /* param_value */, + size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLENQUEUEACQUIREGLOBJECTS)(cl_command_queue /* command_queue */, + cl_uint /* num_objects */, + const cl_mem * /* mem_objects */, + cl_uint /* num_events_in_wait_list */, + const cl_event * /* event_wait_list */, + cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLENQUEUERELEASEGLOBJECTS)(cl_command_queue /* command_queue */, + cl_uint /* num_objects */, + const cl_mem * /* mem_objects */, + cl_uint /* num_events_in_wait_list */, + const cl_event * /* event_wait_list */, + cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; + + +// Deprecated OpenCL 1.1 APIs +#ifdef CL_USE_DEPRECATED_OPENCL_1_1_APIS +typedef CL_API_ENTRY CL_EXT_PREFIX__VERSION_1_1_DEPRECATED cl_mem (CL_API_CALL * +PFNCLCREATEFROMGLTEXTURE2D)(cl_context /* context */, + cl_mem_flags /* flags */, + cl_GLenum /* target */, + cl_GLint /* miplevel */, + cl_GLuint /* texture */, + cl_int * /* errcode_ret */) CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED; + +typedef CL_API_ENTRY CL_EXT_PREFIX__VERSION_1_1_DEPRECATED cl_mem (CL_API_CALL * +PFNCLCREATEFROMGLTEXTURE3D)(cl_context /* context */, + cl_mem_flags /* flags */, + cl_GLenum /* target */, + cl_GLint /* miplevel */, + cl_GLuint /* texture */, + cl_int * /* errcode_ret */) CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED; +#endif + +#ifdef __APPLE__ +# pragma GCC diagnostic pop // ignored "-Wignored-attributes" +#endif + +/* cl_khr_gl_sharing extension */ + +#define cl_khr_gl_sharing 1 + +typedef cl_uint cl_gl_context_info; + +/* Additional Error Codes */ +#define CL_INVALID_GL_SHAREGROUP_REFERENCE_KHR -1000 + +/* cl_gl_context_info */ +#define CL_CURRENT_DEVICE_FOR_GL_CONTEXT_KHR 0x2006 +#define CL_DEVICES_FOR_GL_CONTEXT_KHR 0x2007 + +/* Additional cl_context_properties */ +#define CL_GL_CONTEXT_KHR 0x2008 +#define CL_EGL_DISPLAY_KHR 0x2009 +#define CL_GLX_DISPLAY_KHR 0x200A +#define CL_WGL_HDC_KHR 0x200B +#define CL_CGL_SHAREGROUP_KHR 0x200C + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLGETGLCONTEXTINFOKHR)(const cl_context_properties * /* properties */, + cl_gl_context_info /* param_name */, + size_t /* param_value_size */, + void * /* param_value */, + size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL *clGetGLContextInfoKHR_fn)( + const cl_context_properties * properties, + cl_gl_context_info param_name, + size_t param_value_size, + void * param_value, + size_t * param_value_size_ret); + +#define CLEW_STATIC + +#ifdef CLEW_STATIC +# define CLEWAPI extern +#else +# ifdef CLEW_BUILD +# define CLEWAPI extern __declspec(dllexport) +# else +# define CLEWAPI extern __declspec(dllimport) +# endif +#endif + +#if defined(_WIN32) +#define CLEW_FUN_EXPORT extern +#else +#define CLEW_FUN_EXPORT CLEWAPI +#endif + +#define CLEW_GET_FUN(x) x + + +// Variables holding function entry points +CLEW_FUN_EXPORT PFNCLGETPLATFORMIDS __clewGetPlatformIDs ; +CLEW_FUN_EXPORT PFNCLGETPLATFORMINFO __clewGetPlatformInfo ; +CLEW_FUN_EXPORT PFNCLGETDEVICEIDS __clewGetDeviceIDs ; +CLEW_FUN_EXPORT PFNCLGETDEVICEINFO __clewGetDeviceInfo ; +CLEW_FUN_EXPORT PFNCLCREATESUBDEVICES __clewCreateSubDevices ; +CLEW_FUN_EXPORT PFNCLRETAINDEVICE __clewRetainDevice ; +CLEW_FUN_EXPORT PFNCLRELEASEDEVICE __clewReleaseDevice ; +CLEW_FUN_EXPORT PFNCLCREATECONTEXT __clewCreateContext ; +CLEW_FUN_EXPORT PFNCLCREATECONTEXTFROMTYPE __clewCreateContextFromType ; +CLEW_FUN_EXPORT PFNCLRETAINCONTEXT __clewRetainContext ; +CLEW_FUN_EXPORT PFNCLRELEASECONTEXT __clewReleaseContext ; +CLEW_FUN_EXPORT PFNCLGETCONTEXTINFO __clewGetContextInfo ; +CLEW_FUN_EXPORT PFNCLCREATECOMMANDQUEUE __clewCreateCommandQueue ; +CLEW_FUN_EXPORT PFNCLRETAINCOMMANDQUEUE __clewRetainCommandQueue ; +CLEW_FUN_EXPORT PFNCLRELEASECOMMANDQUEUE __clewReleaseCommandQueue ; +CLEW_FUN_EXPORT PFNCLGETCOMMANDQUEUEINFO __clewGetCommandQueueInfo ; +CLEW_FUN_EXPORT PFNCLCREATEBUFFER __clewCreateBuffer ; +CLEW_FUN_EXPORT PFNCLCREATESUBBUFFER __clewCreateSubBuffer ; +CLEW_FUN_EXPORT PFNCLCREATEIMAGE __clewCreateImage ; +CLEW_FUN_EXPORT PFNCLRETAINMEMOBJECT __clewRetainMemObject ; +CLEW_FUN_EXPORT PFNCLRELEASEMEMOBJECT __clewReleaseMemObject ; +CLEW_FUN_EXPORT PFNCLGETSUPPORTEDIMAGEFORMATS __clewGetSupportedImageFormats ; +CLEW_FUN_EXPORT PFNCLGETMEMOBJECTINFO __clewGetMemObjectInfo ; +CLEW_FUN_EXPORT PFNCLGETIMAGEINFO __clewGetImageInfo ; +CLEW_FUN_EXPORT PFNCLSETMEMOBJECTDESTRUCTORCALLBACK __clewSetMemObjectDestructorCallback; +CLEW_FUN_EXPORT PFNCLCREATESAMPLER __clewCreateSampler ; +CLEW_FUN_EXPORT PFNCLRETAINSAMPLER __clewRetainSampler ; +CLEW_FUN_EXPORT PFNCLRELEASESAMPLER __clewReleaseSampler ; +CLEW_FUN_EXPORT PFNCLGETSAMPLERINFO __clewGetSamplerInfo ; +CLEW_FUN_EXPORT PFNCLCREATEPROGRAMWITHSOURCE __clewCreateProgramWithSource ; +CLEW_FUN_EXPORT PFNCLCREATEPROGRAMWITHBINARY __clewCreateProgramWithBinary ; +CLEW_FUN_EXPORT PFNCLCREATEPROGRAMWITHBUILTINKERNELS __clewCreateProgramWithBuiltInKernels; +CLEW_FUN_EXPORT PFNCLRETAINPROGRAM __clewRetainProgram ; +CLEW_FUN_EXPORT PFNCLRELEASEPROGRAM __clewReleaseProgram ; +CLEW_FUN_EXPORT PFNCLBUILDPROGRAM __clewBuildProgram ; +CLEW_FUN_EXPORT PFNCLGETPROGRAMINFO __clewGetProgramInfo ; +CLEW_FUN_EXPORT PFNCLGETPROGRAMBUILDINFO __clewGetProgramBuildInfo ; +CLEW_FUN_EXPORT PFNCLCREATEKERNEL __clewCreateKernel ; +CLEW_FUN_EXPORT PFNCLCREATEKERNELSINPROGRAM __clewCreateKernelsInProgram ; +CLEW_FUN_EXPORT PFNCLRETAINKERNEL __clewRetainKernel ; +CLEW_FUN_EXPORT PFNCLRELEASEKERNEL __clewReleaseKernel ; +CLEW_FUN_EXPORT PFNCLSETKERNELARG __clewSetKernelArg ; +CLEW_FUN_EXPORT PFNCLGETKERNELINFO __clewGetKernelInfo ; +CLEW_FUN_EXPORT PFNCLGETKERNELWORKGROUPINFO __clewGetKernelWorkGroupInfo ; +CLEW_FUN_EXPORT PFNCLWAITFOREVENTS __clewWaitForEvents ; +CLEW_FUN_EXPORT PFNCLGETEVENTINFO __clewGetEventInfo ; +CLEW_FUN_EXPORT PFNCLCREATEUSEREVENT __clewCreateUserEvent ; +CLEW_FUN_EXPORT PFNCLRETAINEVENT __clewRetainEvent ; +CLEW_FUN_EXPORT PFNCLRELEASEEVENT __clewReleaseEvent ; +CLEW_FUN_EXPORT PFNCLSETUSEREVENTSTATUS __clewSetUserEventStatus ; +CLEW_FUN_EXPORT PFNCLSETEVENTCALLBACK __clewSetEventCallback ; +CLEW_FUN_EXPORT PFNCLGETEVENTPROFILINGINFO __clewGetEventProfilingInfo ; +CLEW_FUN_EXPORT PFNCLFLUSH __clewFlush ; +CLEW_FUN_EXPORT PFNCLFINISH __clewFinish ; +CLEW_FUN_EXPORT PFNCLENQUEUEREADBUFFER __clewEnqueueReadBuffer ; +CLEW_FUN_EXPORT PFNCLENQUEUEREADBUFFERRECT __clewEnqueueReadBufferRect ; +CLEW_FUN_EXPORT PFNCLENQUEUEWRITEBUFFER __clewEnqueueWriteBuffer ; +CLEW_FUN_EXPORT PFNCLENQUEUEWRITEBUFFERRECT __clewEnqueueWriteBufferRect ; +CLEW_FUN_EXPORT PFNCLENQUEUECOPYBUFFER __clewEnqueueCopyBuffer ; +CLEW_FUN_EXPORT PFNCLENQUEUECOPYBUFFERRECT __clewEnqueueCopyBufferRect ; +CLEW_FUN_EXPORT PFNCLENQUEUEREADIMAGE __clewEnqueueReadImage ; +CLEW_FUN_EXPORT PFNCLENQUEUEWRITEIMAGE __clewEnqueueWriteImage ; +CLEW_FUN_EXPORT PFNCLENQUEUECOPYIMAGE __clewEnqueueCopyImage ; +CLEW_FUN_EXPORT PFNCLENQUEUECOPYIMAGETOBUFFER __clewEnqueueCopyImageToBuffer ; +CLEW_FUN_EXPORT PFNCLENQUEUECOPYBUFFERTOIMAGE __clewEnqueueCopyBufferToImage ; +CLEW_FUN_EXPORT PFNCLENQUEUEMAPBUFFER __clewEnqueueMapBuffer ; +CLEW_FUN_EXPORT PFNCLENQUEUEMAPIMAGE __clewEnqueueMapImage ; +CLEW_FUN_EXPORT PFNCLENQUEUEUNMAPMEMOBJECT __clewEnqueueUnmapMemObject ; +CLEW_FUN_EXPORT PFNCLENQUEUENDRANGEKERNEL __clewEnqueueNDRangeKernel ; +CLEW_FUN_EXPORT PFNCLENQUEUETASK __clewEnqueueTask ; +CLEW_FUN_EXPORT PFNCLENQUEUENATIVEKERNEL __clewEnqueueNativeKernel ; +CLEW_FUN_EXPORT PFNCLGETEXTENSIONFUNCTIONADDRESSFORPLATFORM __clewGetExtensionFunctionAddressForPlatform; + +#ifdef CL_USE_DEPRECATED_OPENCL_1_0_APIS +CLEW_FUN_EXPORT PFNCLSETCOMMANDQUEUEPROPERTY __clewSetCommandQueueProperty ; +#endif + +#ifdef CL_USE_DEPRECATED_OPENCL_1_1_APIS +CLEW_FUN_EXPORT PFNCLCREATEIMAGE2D __clewCreateImage2D ; +CLEW_FUN_EXPORT PFNCLCREATEIMAGE3D __clewCreateImage3D ; +CLEW_FUN_EXPORT PFNCLGETEXTENSIONFUNCTIONADDRESS __clewGetExtensionFunctionAddress ; +CLEW_FUN_EXPORT PFNCLUNLOADCOMPILER __clewUnloadCompiler ; +CLEW_FUN_EXPORT PFNCLENQUEUEMARKER __clewEnqueueMarker ; +CLEW_FUN_EXPORT PFNCLENQUEUEWAITFOREVENTS __clewEnqueueWaitForEvents ; +CLEW_FUN_EXPORT PFNCLENQUEUEBARRIER __clewEnqueueBarrier ; +#endif + +/* cl_gl */ +CLEW_FUN_EXPORT PFNCLCREATEFROMGLBUFFER __clewCreateFromGLBuffer ; +CLEW_FUN_EXPORT PFNCLCREATEFROMGLTEXTURE __clewCreateFromGLTexture ; +CLEW_FUN_EXPORT PFNCLCREATEFROMGLRENDERBUFFER __clewCreateFromGLRenderbuffer ; +CLEW_FUN_EXPORT PFNCLGETGLOBJECTINFO __clewGetGLObjectInfo ; +CLEW_FUN_EXPORT PFNCLGETGLTEXTUREINFO __clewGetGLTextureInfo ; +CLEW_FUN_EXPORT PFNCLENQUEUEACQUIREGLOBJECTS __clewEnqueueAcquireGLObjects ; +CLEW_FUN_EXPORT PFNCLENQUEUERELEASEGLOBJECTS __clewEnqueueReleaseGLObjects ; +#ifdef CL_USE_DEPRECATED_OPENCL_1_1_APIS +CLEW_FUN_EXPORT PFNCLCREATEFROMGLTEXTURE2D __clewCreateFromGLTexture2D ; +CLEW_FUN_EXPORT PFNCLCREATEFROMGLTEXTURE3D __clewCreateFromGLTexture3D ; +#endif +CLEW_FUN_EXPORT PFNCLGETGLCONTEXTINFOKHR __clewGetGLContextInfoKHR ; + +#define clGetPlatformIDs CLEW_GET_FUN(__clewGetPlatformIDs ) +#define clGetPlatformInfo CLEW_GET_FUN(__clewGetPlatformInfo ) +#define clGetDeviceIDs CLEW_GET_FUN(__clewGetDeviceIDs ) +#define clGetDeviceInfo CLEW_GET_FUN(__clewGetDeviceInfo ) +#define clCreateContext CLEW_GET_FUN(__clewCreateContext ) +#define clCreateContextFromType CLEW_GET_FUN(__clewCreateContextFromType ) +#define clRetainContext CLEW_GET_FUN(__clewRetainContext ) +#define clReleaseContext CLEW_GET_FUN(__clewReleaseContext ) +#define clGetContextInfo CLEW_GET_FUN(__clewGetContextInfo ) +#define clCreateCommandQueue CLEW_GET_FUN(__clewCreateCommandQueue ) +#define clRetainCommandQueue CLEW_GET_FUN(__clewRetainCommandQueue ) +#define clReleaseCommandQueue CLEW_GET_FUN(__clewReleaseCommandQueue ) +#define clGetCommandQueueInfo CLEW_GET_FUN(__clewGetCommandQueueInfo ) +#ifdef CL_USE_DEPRECATED_OPENCL_1_0_APIS +#warning CL_USE_DEPRECATED_OPENCL_1_0_APIS is defined. These APIs are unsupported and untested in OpenCL 1.1! +/* + * WARNING: + * This API introduces mutable state into the OpenCL implementation. It has been REMOVED + * to better facilitate thread safety. The 1.0 API is not thread safe. It is not tested by the + * OpenCL 1.1 conformance test, and consequently may not work or may not work dependably. + * It is likely to be non-performant. Use of this API is not advised. Use at your own risk. + * + * Software developers previously relying on this API are instructed to set the command queue + * properties when creating the queue, instead. + */ +#define clSetCommandQueueProperty CLEW_GET_FUN(__clewSetCommandQueueProperty ) +#endif /* CL_USE_DEPRECATED_OPENCL_1_0_APIS */ +#define clCreateBuffer CLEW_GET_FUN(__clewCreateBuffer ) +#define clCreateSubBuffer CLEW_GET_FUN(__clewCreateSubBuffer ) +#define clCreateImage CLEW_GET_FUN(__clewCreateImage ) +#define clRetainMemObject CLEW_GET_FUN(__clewRetainMemObject ) +#define clReleaseMemObject CLEW_GET_FUN(__clewReleaseMemObject ) +#define clGetSupportedImageFormats CLEW_GET_FUN(__clewGetSupportedImageFormats ) +#define clGetMemObjectInfo CLEW_GET_FUN(__clewGetMemObjectInfo ) +#define clGetImageInfo CLEW_GET_FUN(__clewGetImageInfo ) +#define clSetMemObjectDestructorCallback CLEW_GET_FUN(__clewSetMemObjectDestructorCallback) +#define clCreateSampler CLEW_GET_FUN(__clewCreateSampler ) +#define clRetainSampler CLEW_GET_FUN(__clewRetainSampler ) +#define clReleaseSampler CLEW_GET_FUN(__clewReleaseSampler ) +#define clGetSamplerInfo CLEW_GET_FUN(__clewGetSamplerInfo ) +#define clCreateProgramWithSource CLEW_GET_FUN(__clewCreateProgramWithSource ) +#define clCreateProgramWithBinary CLEW_GET_FUN(__clewCreateProgramWithBinary ) +#define clCreateProgramWithBuiltInKernels CLEW_GET_FUN(__clewCreateProgramWithBuiltInKernels) +#define clRetainProgram CLEW_GET_FUN(__clewRetainProgram ) +#define clReleaseProgram CLEW_GET_FUN(__clewReleaseProgram ) +#define clBuildProgram CLEW_GET_FUN(__clewBuildProgram ) +#define clGetProgramInfo CLEW_GET_FUN(__clewGetProgramInfo ) +#define clGetProgramBuildInfo CLEW_GET_FUN(__clewGetProgramBuildInfo ) +#define clCreateKernel CLEW_GET_FUN(__clewCreateKernel ) +#define clCreateKernelsInProgram CLEW_GET_FUN(__clewCreateKernelsInProgram ) +#define clRetainKernel CLEW_GET_FUN(__clewRetainKernel ) +#define clReleaseKernel CLEW_GET_FUN(__clewReleaseKernel ) +#define clSetKernelArg CLEW_GET_FUN(__clewSetKernelArg ) +#define clGetKernelInfo CLEW_GET_FUN(__clewGetKernelInfo ) +#define clGetKernelWorkGroupInfo CLEW_GET_FUN(__clewGetKernelWorkGroupInfo ) +#define clWaitForEvents CLEW_GET_FUN(__clewWaitForEvents ) +#define clGetEventInfo CLEW_GET_FUN(__clewGetEventInfo ) +#define clCreateUserEvent CLEW_GET_FUN(__clewCreateUserEvent ) +#define clRetainEvent CLEW_GET_FUN(__clewRetainEvent ) +#define clReleaseEvent CLEW_GET_FUN(__clewReleaseEvent ) +#define clSetUserEventStatus CLEW_GET_FUN(__clewSetUserEventStatus ) +#define clSetEventCallback CLEW_GET_FUN(__clewSetEventCallback ) +#define clGetEventProfilingInfo CLEW_GET_FUN(__clewGetEventProfilingInfo ) +#define clFlush CLEW_GET_FUN(__clewFlush ) +#define clFinish CLEW_GET_FUN(__clewFinish ) +#define clEnqueueReadBuffer CLEW_GET_FUN(__clewEnqueueReadBuffer ) +#define clEnqueueReadBufferRect CLEW_GET_FUN(__clewEnqueueReadBufferRect ) +#define clEnqueueWriteBuffer CLEW_GET_FUN(__clewEnqueueWriteBuffer ) +#define clEnqueueWriteBufferRect CLEW_GET_FUN(__clewEnqueueWriteBufferRect ) +#define clEnqueueCopyBuffer CLEW_GET_FUN(__clewEnqueueCopyBuffer ) +#define clEnqueueCopyBufferRect CLEW_GET_FUN(__clewEnqueueCopyBufferRect ) +#define clEnqueueReadImage CLEW_GET_FUN(__clewEnqueueReadImage ) +#define clEnqueueWriteImage CLEW_GET_FUN(__clewEnqueueWriteImage ) +#define clEnqueueCopyImage CLEW_GET_FUN(__clewEnqueueCopyImage ) +#define clEnqueueCopyImageToBuffer CLEW_GET_FUN(__clewEnqueueCopyImageToBuffer ) +#define clEnqueueCopyBufferToImage CLEW_GET_FUN(__clewEnqueueCopyBufferToImage ) +#define clEnqueueMapBuffer CLEW_GET_FUN(__clewEnqueueMapBuffer ) +#define clEnqueueMapImage CLEW_GET_FUN(__clewEnqueueMapImage ) +#define clEnqueueUnmapMemObject CLEW_GET_FUN(__clewEnqueueUnmapMemObject ) +#define clEnqueueNDRangeKernel CLEW_GET_FUN(__clewEnqueueNDRangeKernel ) +#define clEnqueueTask CLEW_GET_FUN(__clewEnqueueTask ) +#define clEnqueueNativeKernel CLEW_GET_FUN(__clewEnqueueNativeKernel ) + +#define clGetExtensionFunctionAddressForPlatform CLEW_GET_FUN(__clewGetExtensionFunctionAddressForPlatform) + +#ifdef CL_USE_DEPRECATED_OPENCL_1_1_APIS +#define clCreateImage2D CLEW_GET_FUN(__clewCreateImage2D ) +#define clCreateImage3D CLEW_GET_FUN(__clewCreateImage3D ) +#define clGetExtensionFunctionAddress CLEW_GET_FUN(__clewGetExtensionFunctionAddress ) +#define clEnqueueMarker CLEW_GET_FUN(__clewEnqueueMarker ) +#define clEnqueueWaitForEvents CLEW_GET_FUN(__clewEnqueueWaitForEvents ) +#define clEnqueueBarrier CLEW_GET_FUN(__clewEnqueueBarrier ) +#define clUnloadCompiler CLEW_GET_FUN(__clewUnloadCompiler ) +#endif + +/* cl_gl */ +#define clCreateFromGLBuffer CLEW_GET_FUN(__clewCreateFromGLBuffer ) +#define clCreateFromGLTexture CLEW_GET_FUN(__clewCreateFromGLTexture ) +#define clCreateFromGLRenderbuffer CLEW_GET_FUN(__clewCreateFromGLRenderbuffer ) +#define clGetGLObjectInfo CLEW_GET_FUN(__clewGetGLObjectInfo ) +#define clGetGLTextureInfo CLEW_GET_FUN(__clGetGLTextureInfo ) +#define clEnqueueAcquireGLObjects CLEW_GET_FUN(__clewEnqueueAcquireGLObjects ) +#define clEnqueueReleaseGLObjects CLEW_GET_FUN(__clewEnqueueReleaseGLObjects ) +#ifdef CL_USE_DEPRECATED_OPENCL_1_1_APIS +#define clCreateFromGLTexture2D CLEW_GET_FUN(__clewCreateFromGLTexture2D ) +#define clCreateFromGLTexture3D CLEW_GET_FUN(__clewCreateFromGLTexture3D ) +#endif +#define clGetGLContextInfoKHR CLEW_GET_FUN(__clewGetGLContextInfoKHR ) + +/* cl_ext */ + +/****************************************** + * cl_nv_device_attribute_query extension * + ******************************************/ +/* cl_nv_device_attribute_query extension - no extension #define since it has no functions */ +#define CL_DEVICE_COMPUTE_CAPABILITY_MAJOR_NV 0x4000 +#define CL_DEVICE_COMPUTE_CAPABILITY_MINOR_NV 0x4001 +#define CL_DEVICE_REGISTERS_PER_BLOCK_NV 0x4002 +#define CL_DEVICE_WARP_SIZE_NV 0x4003 +#define CL_DEVICE_GPU_OVERLAP_NV 0x4004 +#define CL_DEVICE_KERNEL_EXEC_TIMEOUT_NV 0x4005 +#define CL_DEVICE_INTEGRATED_MEMORY_NV 0x4006 +#define CL_DEVICE_ATTRIBUTE_ASYNC_ENGINE_COUNT_NV 0x4007 +#define CL_DEVICE_PCI_BUS_ID_NV 0x4008 +#define CL_DEVICE_PCI_SLOT_ID_NV 0x4009 + +/********************************* + * cl_amd_device_attribute_query * + *********************************/ +#define CL_DEVICE_PROFILING_TIMER_OFFSET_AMD 0x4036 +#define CL_DEVICE_TOPOLOGY_AMD 0x4037 +#define CL_DEVICE_BOARD_NAME_AMD 0x4038 +#define CL_DEVICE_GLOBAL_FREE_MEMORY_AMD 0x4039 +#define CL_DEVICE_SIMD_PER_COMPUTE_UNIT_AMD 0x4040 +#define CL_DEVICE_SIMD_WIDTH_AMD 0x4041 +#define CL_DEVICE_SIMD_INSTRUCTION_WIDTH_AMD 0x4042 +#define CL_DEVICE_WAVEFRONT_WIDTH_AMD 0x4043 +#define CL_DEVICE_GLOBAL_MEM_CHANNELS_AMD 0x4044 +#define CL_DEVICE_GLOBAL_MEM_CHANNEL_BANKS_AMD 0x4045 +#define CL_DEVICE_GLOBAL_MEM_CHANNEL_BANK_WIDTH_AMD 0x4046 +#define CL_DEVICE_LOCAL_MEM_SIZE_PER_COMPUTE_UNIT_AMD 0x4047 +#define CL_DEVICE_LOCAL_MEM_BANKS_AMD 0x4048 +#define CL_DEVICE_THREAD_TRACE_SUPPORTED_AMD 0x4049 +#define CL_DEVICE_GFXIP_MAJOR_AMD 0x404A +#define CL_DEVICE_GFXIP_MINOR_AMD 0x404B +#define CL_DEVICE_AVAILABLE_ASYNC_QUEUES_AMD 0x404C + +#ifndef CL_DEVICE_TOPOLOGY_TYPE_PCIE_AMD +#define CL_DEVICE_TOPOLOGY_TYPE_PCIE_AMD 1 + +typedef union +{ + struct { cl_uint type; cl_uint data[5]; } raw; + struct { cl_uint type; cl_char unused[17]; cl_char bus; cl_char device; cl_char function; } pcie; +} cl_device_topology_amd; +#endif + +/********************************* + * cl_arm_printf extension + *********************************/ +#define CL_PRINTF_CALLBACK_ARM 0x40B0 +#define CL_PRINTF_BUFFERSIZE_ARM 0x40B1 + +#define CLEW_SUCCESS 0 //!< Success error code +#define CLEW_ERROR_OPEN_FAILED -1 //!< Error code for failing to open the dynamic library +#define CLEW_ERROR_ATEXIT_FAILED -2 //!< Error code for failing to queue the closing of the dynamic library to atexit() + +//! \brief Load OpenCL dynamic library and set function entry points +int clewInit (void); +//! \brief Convert an OpenCL error code to its string equivalent +const char* clewErrorString (cl_int error); + +#ifdef __cplusplus +} +#endif + +#endif // CLEW_HPP_INCLUDED diff --git a/extern/clew/src/clew.c b/extern/clew/src/clew.c new file mode 100644 index 00000000000..dbdddfc0332 --- /dev/null +++ b/extern/clew/src/clew.c @@ -0,0 +1,407 @@ +////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2009 Organic Vectory B.V. +// Written by George van Venrooij +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file license.txt) +////////////////////////////////////////////////////////////////////////// + +#include "clew.h" + +#ifdef _WIN32 + #define WIN32_LEAN_AND_MEAN + #define VC_EXTRALEAN + #include + + typedef HMODULE CLEW_DYNLIB_HANDLE; + + #define CLEW_DYNLIB_OPEN LoadLibraryA + #define CLEW_DYNLIB_CLOSE FreeLibrary + #define CLEW_DYNLIB_IMPORT GetProcAddress +#else + #include + + typedef void* CLEW_DYNLIB_HANDLE; + + #define CLEW_DYNLIB_OPEN(path) dlopen(path, RTLD_NOW | RTLD_GLOBAL) + #define CLEW_DYNLIB_CLOSE dlclose + #define CLEW_DYNLIB_IMPORT dlsym +#endif + +#include + +//! \brief module handle +static CLEW_DYNLIB_HANDLE module = NULL; + +// Variables holding function entry points +PFNCLGETPLATFORMIDS __clewGetPlatformIDs = NULL; +PFNCLGETPLATFORMINFO __clewGetPlatformInfo = NULL; +PFNCLGETDEVICEIDS __clewGetDeviceIDs = NULL; +PFNCLGETDEVICEINFO __clewGetDeviceInfo = NULL; +PFNCLCREATESUBDEVICES __clewCreateSubDevices = NULL; +PFNCLRETAINDEVICE __clewRetainDevice = NULL; +PFNCLRELEASEDEVICE __clewReleaseDevice = NULL; +PFNCLCREATECONTEXT __clewCreateContext = NULL; +PFNCLCREATECONTEXTFROMTYPE __clewCreateContextFromType = NULL; +PFNCLRETAINCONTEXT __clewRetainContext = NULL; +PFNCLRELEASECONTEXT __clewReleaseContext = NULL; +PFNCLGETCONTEXTINFO __clewGetContextInfo = NULL; +PFNCLCREATECOMMANDQUEUE __clewCreateCommandQueue = NULL; +PFNCLRETAINCOMMANDQUEUE __clewRetainCommandQueue = NULL; +PFNCLRELEASECOMMANDQUEUE __clewReleaseCommandQueue = NULL; +PFNCLGETCOMMANDQUEUEINFO __clewGetCommandQueueInfo = NULL; +#ifdef CL_USE_DEPRECATED_OPENCL_1_0_APIS +PFNCLSETCOMMANDQUEUEPROPERTY __clewSetCommandQueueProperty = NULL; +#endif +PFNCLCREATEBUFFER __clewCreateBuffer = NULL; +PFNCLCREATESUBBUFFER __clewCreateSubBuffer = NULL; +PFNCLCREATEIMAGE __clewCreateImage = NULL; +PFNCLRETAINMEMOBJECT __clewRetainMemObject = NULL; +PFNCLRELEASEMEMOBJECT __clewReleaseMemObject = NULL; +PFNCLGETSUPPORTEDIMAGEFORMATS __clewGetSupportedImageFormats = NULL; +PFNCLGETMEMOBJECTINFO __clewGetMemObjectInfo = NULL; +PFNCLGETIMAGEINFO __clewGetImageInfo = NULL; +PFNCLSETMEMOBJECTDESTRUCTORCALLBACK __clewSetMemObjectDestructorCallback = NULL; +PFNCLCREATESAMPLER __clewCreateSampler = NULL; +PFNCLRETAINSAMPLER __clewRetainSampler = NULL; +PFNCLRELEASESAMPLER __clewReleaseSampler = NULL; +PFNCLGETSAMPLERINFO __clewGetSamplerInfo = NULL; +PFNCLCREATEPROGRAMWITHSOURCE __clewCreateProgramWithSource = NULL; +PFNCLCREATEPROGRAMWITHBINARY __clewCreateProgramWithBinary = NULL; +PFNCLCREATEPROGRAMWITHBUILTINKERNELS __clewCreateProgramWithBuiltInKernels = NULL; +PFNCLRETAINPROGRAM __clewRetainProgram = NULL; +PFNCLRELEASEPROGRAM __clewReleaseProgram = NULL; +PFNCLBUILDPROGRAM __clewBuildProgram = NULL; +PFNCLGETPROGRAMINFO __clewGetProgramInfo = NULL; +PFNCLGETPROGRAMBUILDINFO __clewGetProgramBuildInfo = NULL; +PFNCLCREATEKERNEL __clewCreateKernel = NULL; +PFNCLCREATEKERNELSINPROGRAM __clewCreateKernelsInProgram = NULL; +PFNCLRETAINKERNEL __clewRetainKernel = NULL; +PFNCLRELEASEKERNEL __clewReleaseKernel = NULL; +PFNCLSETKERNELARG __clewSetKernelArg = NULL; +PFNCLGETKERNELINFO __clewGetKernelInfo = NULL; +PFNCLGETKERNELWORKGROUPINFO __clewGetKernelWorkGroupInfo = NULL; +PFNCLWAITFOREVENTS __clewWaitForEvents = NULL; +PFNCLGETEVENTINFO __clewGetEventInfo = NULL; +PFNCLCREATEUSEREVENT __clewCreateUserEvent = NULL; +PFNCLRETAINEVENT __clewRetainEvent = NULL; +PFNCLRELEASEEVENT __clewReleaseEvent = NULL; +PFNCLSETUSEREVENTSTATUS __clewSetUserEventStatus = NULL; +PFNCLSETEVENTCALLBACK __clewSetEventCallback = NULL; +PFNCLGETEVENTPROFILINGINFO __clewGetEventProfilingInfo = NULL; +PFNCLFLUSH __clewFlush = NULL; +PFNCLFINISH __clewFinish = NULL; +PFNCLENQUEUEREADBUFFER __clewEnqueueReadBuffer = NULL; +PFNCLENQUEUEREADBUFFERRECT __clewEnqueueReadBufferRect = NULL; +PFNCLENQUEUEWRITEBUFFER __clewEnqueueWriteBuffer = NULL; +PFNCLENQUEUEWRITEBUFFERRECT __clewEnqueueWriteBufferRect = NULL; +PFNCLENQUEUECOPYBUFFER __clewEnqueueCopyBuffer = NULL; +PFNCLENQUEUEREADIMAGE __clewEnqueueReadImage = NULL; +PFNCLENQUEUEWRITEIMAGE __clewEnqueueWriteImage = NULL; +PFNCLENQUEUECOPYIMAGE __clewEnqueueCopyImage = NULL; +PFNCLENQUEUECOPYBUFFERRECT __clewEnqueueCopyBufferRect = NULL; +PFNCLENQUEUECOPYIMAGETOBUFFER __clewEnqueueCopyImageToBuffer = NULL; +PFNCLENQUEUECOPYBUFFERTOIMAGE __clewEnqueueCopyBufferToImage = NULL; +PFNCLENQUEUEMAPBUFFER __clewEnqueueMapBuffer = NULL; +PFNCLENQUEUEMAPIMAGE __clewEnqueueMapImage = NULL; +PFNCLENQUEUEUNMAPMEMOBJECT __clewEnqueueUnmapMemObject = NULL; +PFNCLENQUEUENDRANGEKERNEL __clewEnqueueNDRangeKernel = NULL; +PFNCLENQUEUETASK __clewEnqueueTask = NULL; +PFNCLENQUEUENATIVEKERNEL __clewEnqueueNativeKernel = NULL; + + + +PFNCLGETEXTENSIONFUNCTIONADDRESSFORPLATFORM __clewGetExtensionFunctionAddressForPlatform = NULL; + +#ifdef CL_USE_DEPRECATED_OPENCL_1_1_APIS +PFNCLCREATEIMAGE2D __clewCreateImage2D = NULL; +PFNCLCREATEIMAGE3D __clewCreateImage3D = NULL; +PFNCLENQUEUEMARKER __clewEnqueueMarker = NULL; +PFNCLENQUEUEWAITFOREVENTS __clewEnqueueWaitForEvents = NULL; +PFNCLENQUEUEBARRIER __clewEnqueueBarrier = NULL; +PFNCLUNLOADCOMPILER __clewUnloadCompiler = NULL; +PFNCLGETEXTENSIONFUNCTIONADDRESS __clewGetExtensionFunctionAddress = NULL; +#endif + +/* cl_gl */ +PFNCLCREATEFROMGLBUFFER __clewCreateFromGLBuffer = NULL; +PFNCLCREATEFROMGLTEXTURE __clewCreateFromGLTexture = NULL; +PFNCLCREATEFROMGLRENDERBUFFER __clewCreateFromGLRenderbuffer = NULL; +PFNCLGETGLOBJECTINFO __clewGetGLObjectInfo = NULL; +PFNCLGETGLTEXTUREINFO __clewGetGLTextureInfo = NULL; +PFNCLENQUEUEACQUIREGLOBJECTS __clewEnqueueAcquireGLObjects = NULL; +PFNCLENQUEUERELEASEGLOBJECTS __clewEnqueueReleaseGLObjects = NULL; +#ifdef CL_USE_DEPRECATED_OPENCL_1_1_APIS +PFNCLCREATEFROMGLTEXTURE2D __clewCreateFromGLTexture2D = NULL; +PFNCLCREATEFROMGLTEXTURE3D __clewCreateFromGLTexture3D = NULL; +#endif +PFNCLGETGLCONTEXTINFOKHR __clewGetGLContextInfoKHR = NULL; + +static CLEW_DYNLIB_HANDLE dynamic_library_open_find(const char **paths) { + int i = 0; + while (paths[i] != NULL) { + CLEW_DYNLIB_HANDLE lib = CLEW_DYNLIB_OPEN(paths[i]); + if (lib != NULL) { + return lib; + } + ++i; + } + return NULL; +} + +static void clewExit(void) +{ + if (module != NULL) + { + // Ignore errors + CLEW_DYNLIB_CLOSE(module); + module = NULL; + } +} + +int clewInit() +{ +#ifdef _WIN32 + const char *paths[] = {"OpenCL.dll", NULL}; +#elif defined(__APPLE__) + const char *paths[] = {"/Library/Frameworks/OpenCL.framework/OpenCL", NULL}; +#else + const char *paths[] = {"libOpenCL.so", + "libOpenCL.so.0", + "libOpenCL.so.1", + "libOpenCL.so.2", + NULL}; +#endif + + int error = 0; + + // Check if already initialized + if (module != NULL) + { + return CLEW_SUCCESS; + } + + // Load library + module = dynamic_library_open_find(paths); + + // Check for errors + if (module == NULL) + { + return CLEW_ERROR_OPEN_FAILED; + } + + // Set unloading + error = atexit(clewExit); + + if (error) + { + // Failure queuing atexit, shutdown with error + CLEW_DYNLIB_CLOSE(module); + module = NULL; + + return CLEW_ERROR_ATEXIT_FAILED; + } + + // Determine function entry-points + __clewGetPlatformIDs = (PFNCLGETPLATFORMIDS )CLEW_DYNLIB_IMPORT(module, "clGetPlatformIDs"); + __clewGetPlatformInfo = (PFNCLGETPLATFORMINFO )CLEW_DYNLIB_IMPORT(module, "clGetPlatformInfo"); + __clewGetDeviceIDs = (PFNCLGETDEVICEIDS )CLEW_DYNLIB_IMPORT(module, "clGetDeviceIDs"); + __clewGetDeviceInfo = (PFNCLGETDEVICEINFO )CLEW_DYNLIB_IMPORT(module, "clGetDeviceInfo"); + __clewCreateSubDevices = (PFNCLCREATESUBDEVICES )CLEW_DYNLIB_IMPORT(module, "clCreateSubDevices"); + __clewRetainDevice = (PFNCLRETAINDEVICE )CLEW_DYNLIB_IMPORT(module, "clRetainDevice"); + __clewReleaseDevice = (PFNCLRELEASEDEVICE )CLEW_DYNLIB_IMPORT(module, "clReleaseDevice"); + __clewCreateContext = (PFNCLCREATECONTEXT )CLEW_DYNLIB_IMPORT(module, "clCreateContext"); + __clewCreateContextFromType = (PFNCLCREATECONTEXTFROMTYPE )CLEW_DYNLIB_IMPORT(module, "clCreateContextFromType"); + __clewRetainContext = (PFNCLRETAINCONTEXT )CLEW_DYNLIB_IMPORT(module, "clRetainContext"); + __clewReleaseContext = (PFNCLRELEASECONTEXT )CLEW_DYNLIB_IMPORT(module, "clReleaseContext"); + __clewGetContextInfo = (PFNCLGETCONTEXTINFO )CLEW_DYNLIB_IMPORT(module, "clGetContextInfo"); + __clewCreateCommandQueue = (PFNCLCREATECOMMANDQUEUE )CLEW_DYNLIB_IMPORT(module, "clCreateCommandQueue"); + __clewRetainCommandQueue = (PFNCLRETAINCOMMANDQUEUE )CLEW_DYNLIB_IMPORT(module, "clRetainCommandQueue"); + __clewReleaseCommandQueue = (PFNCLRELEASECOMMANDQUEUE )CLEW_DYNLIB_IMPORT(module, "clReleaseCommandQueue"); + __clewGetCommandQueueInfo = (PFNCLGETCOMMANDQUEUEINFO )CLEW_DYNLIB_IMPORT(module, "clGetCommandQueueInfo"); +#ifdef CL_USE_DEPRECATED_OPENCL_1_0_APIS + __clewSetCommandQueueProperty = (PFNCLSETCOMMANDQUEUEPROPERTY )CLEW_DYNLIB_IMPORT(module, "clSetCommandQueueProperty"); +#endif + __clewCreateBuffer = (PFNCLCREATEBUFFER )CLEW_DYNLIB_IMPORT(module, "clCreateBuffer"); + __clewCreateSubBuffer = (PFNCLCREATESUBBUFFER )CLEW_DYNLIB_IMPORT(module, "clCreateSubBuffer"); + __clewCreateImage = (PFNCLCREATEIMAGE )CLEW_DYNLIB_IMPORT(module, "clCreateImage"); + __clewRetainMemObject = (PFNCLRETAINMEMOBJECT )CLEW_DYNLIB_IMPORT(module, "clRetainMemObject"); + __clewReleaseMemObject = (PFNCLRELEASEMEMOBJECT )CLEW_DYNLIB_IMPORT(module, "clReleaseMemObject"); + __clewGetSupportedImageFormats = (PFNCLGETSUPPORTEDIMAGEFORMATS )CLEW_DYNLIB_IMPORT(module, "clGetSupportedImageFormats"); + __clewGetMemObjectInfo = (PFNCLGETMEMOBJECTINFO )CLEW_DYNLIB_IMPORT(module, "clGetMemObjectInfo"); + __clewGetImageInfo = (PFNCLGETIMAGEINFO )CLEW_DYNLIB_IMPORT(module, "clGetImageInfo"); + __clewSetMemObjectDestructorCallback = (PFNCLSETMEMOBJECTDESTRUCTORCALLBACK)CLEW_DYNLIB_IMPORT(module, "clSetMemObjectDestructorCallback"); + __clewCreateSampler = (PFNCLCREATESAMPLER )CLEW_DYNLIB_IMPORT(module, "clCreateSampler"); + __clewRetainSampler = (PFNCLRETAINSAMPLER )CLEW_DYNLIB_IMPORT(module, "clRetainSampler"); + __clewReleaseSampler = (PFNCLRELEASESAMPLER )CLEW_DYNLIB_IMPORT(module, "clReleaseSampler"); + __clewGetSamplerInfo = (PFNCLGETSAMPLERINFO )CLEW_DYNLIB_IMPORT(module, "clGetSamplerInfo"); + __clewCreateProgramWithSource = (PFNCLCREATEPROGRAMWITHSOURCE )CLEW_DYNLIB_IMPORT(module, "clCreateProgramWithSource"); + __clewCreateProgramWithBinary = (PFNCLCREATEPROGRAMWITHBINARY )CLEW_DYNLIB_IMPORT(module, "clCreateProgramWithBinary"); + __clewCreateProgramWithBuiltInKernels =(PFNCLCREATEPROGRAMWITHBUILTINKERNELS)CLEW_DYNLIB_IMPORT(module, "clCreateProgramWithBuiltInKernels"); + __clewRetainProgram = (PFNCLRETAINPROGRAM )CLEW_DYNLIB_IMPORT(module, "clRetainProgram"); + __clewReleaseProgram = (PFNCLRELEASEPROGRAM )CLEW_DYNLIB_IMPORT(module, "clReleaseProgram"); + __clewBuildProgram = (PFNCLBUILDPROGRAM )CLEW_DYNLIB_IMPORT(module, "clBuildProgram"); + + __clewGetProgramInfo = (PFNCLGETPROGRAMINFO )CLEW_DYNLIB_IMPORT(module, "clGetProgramInfo"); + __clewGetProgramBuildInfo = (PFNCLGETPROGRAMBUILDINFO )CLEW_DYNLIB_IMPORT(module, "clGetProgramBuildInfo"); + __clewCreateKernel = (PFNCLCREATEKERNEL )CLEW_DYNLIB_IMPORT(module, "clCreateKernel"); + __clewCreateKernelsInProgram = (PFNCLCREATEKERNELSINPROGRAM )CLEW_DYNLIB_IMPORT(module, "clCreateKernelsInProgram"); + __clewRetainKernel = (PFNCLRETAINKERNEL )CLEW_DYNLIB_IMPORT(module, "clRetainKernel"); + __clewReleaseKernel = (PFNCLRELEASEKERNEL )CLEW_DYNLIB_IMPORT(module, "clReleaseKernel"); + __clewSetKernelArg = (PFNCLSETKERNELARG )CLEW_DYNLIB_IMPORT(module, "clSetKernelArg"); + __clewGetKernelInfo = (PFNCLGETKERNELINFO )CLEW_DYNLIB_IMPORT(module, "clGetKernelInfo"); + __clewGetKernelWorkGroupInfo = (PFNCLGETKERNELWORKGROUPINFO )CLEW_DYNLIB_IMPORT(module, "clGetKernelWorkGroupInfo"); + __clewWaitForEvents = (PFNCLWAITFOREVENTS )CLEW_DYNLIB_IMPORT(module, "clWaitForEvents"); + __clewGetEventInfo = (PFNCLGETEVENTINFO )CLEW_DYNLIB_IMPORT(module, "clGetEventInfo"); + __clewCreateUserEvent = (PFNCLCREATEUSEREVENT )CLEW_DYNLIB_IMPORT(module, "clCreateUserEvent"); + __clewRetainEvent = (PFNCLRETAINEVENT )CLEW_DYNLIB_IMPORT(module, "clRetainEvent"); + __clewReleaseEvent = (PFNCLRELEASEEVENT )CLEW_DYNLIB_IMPORT(module, "clReleaseEvent"); + __clewSetUserEventStatus = (PFNCLSETUSEREVENTSTATUS )CLEW_DYNLIB_IMPORT(module, "clSetUserEventStatus"); + __clewSetEventCallback = (PFNCLSETEVENTCALLBACK )CLEW_DYNLIB_IMPORT(module, "clSetEventCallback"); + __clewGetEventProfilingInfo = (PFNCLGETEVENTPROFILINGINFO )CLEW_DYNLIB_IMPORT(module, "clGetEventProfilingInfo"); + __clewFlush = (PFNCLFLUSH )CLEW_DYNLIB_IMPORT(module, "clFlush"); + __clewFinish = (PFNCLFINISH )CLEW_DYNLIB_IMPORT(module, "clFinish"); + __clewEnqueueReadBuffer = (PFNCLENQUEUEREADBUFFER )CLEW_DYNLIB_IMPORT(module, "clEnqueueReadBuffer"); + __clewEnqueueReadBufferRect = (PFNCLENQUEUEREADBUFFERRECT )CLEW_DYNLIB_IMPORT(module, "clEnqueueReadBufferRect"); + __clewEnqueueWriteBuffer = (PFNCLENQUEUEWRITEBUFFER )CLEW_DYNLIB_IMPORT(module, "clEnqueueWriteBuffer"); + __clewEnqueueWriteBufferRect = (PFNCLENQUEUEWRITEBUFFERRECT )CLEW_DYNLIB_IMPORT(module, "clEnqueueWriteBufferRect"); + __clewEnqueueCopyBuffer = (PFNCLENQUEUECOPYBUFFER )CLEW_DYNLIB_IMPORT(module, "clEnqueueCopyBuffer"); + __clewEnqueueCopyBufferRect = (PFNCLENQUEUECOPYBUFFERRECT )CLEW_DYNLIB_IMPORT(module, "clEnqueueCopyBufferRect"); + __clewEnqueueReadImage = (PFNCLENQUEUEREADIMAGE )CLEW_DYNLIB_IMPORT(module, "clEnqueueReadImage"); + __clewEnqueueWriteImage = (PFNCLENQUEUEWRITEIMAGE )CLEW_DYNLIB_IMPORT(module, "clEnqueueWriteImage"); + __clewEnqueueCopyImage = (PFNCLENQUEUECOPYIMAGE )CLEW_DYNLIB_IMPORT(module, "clEnqueueCopyImage"); + __clewEnqueueCopyImageToBuffer = (PFNCLENQUEUECOPYIMAGETOBUFFER )CLEW_DYNLIB_IMPORT(module, "clEnqueueCopyImageToBuffer"); + __clewEnqueueCopyBufferToImage = (PFNCLENQUEUECOPYBUFFERTOIMAGE )CLEW_DYNLIB_IMPORT(module, "clEnqueueCopyBufferToImage"); + __clewEnqueueMapBuffer = (PFNCLENQUEUEMAPBUFFER )CLEW_DYNLIB_IMPORT(module, "clEnqueueMapBuffer"); + __clewEnqueueMapImage = (PFNCLENQUEUEMAPIMAGE )CLEW_DYNLIB_IMPORT(module, "clEnqueueMapImage"); + __clewEnqueueUnmapMemObject = (PFNCLENQUEUEUNMAPMEMOBJECT )CLEW_DYNLIB_IMPORT(module, "clEnqueueUnmapMemObject"); + __clewEnqueueNDRangeKernel = (PFNCLENQUEUENDRANGEKERNEL )CLEW_DYNLIB_IMPORT(module, "clEnqueueNDRangeKernel"); + __clewEnqueueTask = (PFNCLENQUEUETASK )CLEW_DYNLIB_IMPORT(module, "clEnqueueTask"); + __clewEnqueueNativeKernel = (PFNCLENQUEUENATIVEKERNEL )CLEW_DYNLIB_IMPORT(module, "clEnqueueNativeKernel"); + + + __clewGetExtensionFunctionAddressForPlatform = (PFNCLGETEXTENSIONFUNCTIONADDRESSFORPLATFORM)CLEW_DYNLIB_IMPORT(module, "clGetExtensionFunctionAddressForPlatform"); +#ifdef CL_USE_DEPRECATED_OPENCL_1_1_APIS + __clewCreateImage2D = (PFNCLCREATEIMAGE2D )CLEW_DYNLIB_IMPORT(module, "clCreateImage2D"); + __clewCreateImage3D = (PFNCLCREATEIMAGE3D )CLEW_DYNLIB_IMPORT(module, "clCreateImage3D"); + __clewEnqueueMarker = (PFNCLENQUEUEMARKER )CLEW_DYNLIB_IMPORT(module, "clEnqueueMarker"); + __clewEnqueueWaitForEvents = (PFNCLENQUEUEWAITFOREVENTS )CLEW_DYNLIB_IMPORT(module, "clEnqueueWaitForEvents"); + __clewEnqueueBarrier = (PFNCLENQUEUEBARRIER )CLEW_DYNLIB_IMPORT(module, "clEnqueueBarrier"); + __clewUnloadCompiler = (PFNCLUNLOADCOMPILER )CLEW_DYNLIB_IMPORT(module, "clUnloadCompiler"); + __clewGetExtensionFunctionAddress = (PFNCLGETEXTENSIONFUNCTIONADDRESS )CLEW_DYNLIB_IMPORT(module, "clGetExtensionFunctionAddress"); +#endif + + + /* cl_gl */ + __clewCreateFromGLBuffer = (PFNCLCREATEFROMGLBUFFER )CLEW_DYNLIB_IMPORT(module, "clCreateFromGLBuffer"); + __clewCreateFromGLTexture = (PFNCLCREATEFROMGLTEXTURE )CLEW_DYNLIB_IMPORT(module, "clCreateFromGLTexture"); + __clewCreateFromGLRenderbuffer = (PFNCLCREATEFROMGLRENDERBUFFER )CLEW_DYNLIB_IMPORT(module, "clCreateFromGLRenderbuffer"); + __clewGetGLObjectInfo = (PFNCLGETGLOBJECTINFO )CLEW_DYNLIB_IMPORT(module, "clGetGLObjectInfo"); + __clewGetGLTextureInfo = (PFNCLGETGLTEXTUREINFO )CLEW_DYNLIB_IMPORT(module, "clGetGLTextureInfo"); + __clewEnqueueAcquireGLObjects = (PFNCLENQUEUEACQUIREGLOBJECTS )CLEW_DYNLIB_IMPORT(module, "clEnqueueAcquireGLObjects"); + __clewEnqueueReleaseGLObjects = (PFNCLENQUEUERELEASEGLOBJECTS )CLEW_DYNLIB_IMPORT(module, "clEnqueueReleaseGLObjects"); + #ifdef CL_USE_DEPRECATED_OPENCL_1_1_APIS + __clewCreateFromGLTexture2D = (PFNCLCREATEFROMGLTEXTURE2D )CLEW_DYNLIB_IMPORT(module, "clCreateFromGLTexture2D"); + __clewCreateFromGLTexture3D = (PFNCLCREATEFROMGLTEXTURE3D )CLEW_DYNLIB_IMPORT(module, "clCreateFromGLTexture3D"); + #endif + __clewGetGLContextInfoKHR = (PFNCLGETGLCONTEXTINFOKHR )CLEW_DYNLIB_IMPORT(module, "clGetGLContextInfoKHR"); + + + if(__clewGetPlatformIDs == NULL) return 0; + if(__clewGetPlatformInfo == NULL) return 0; + if(__clewGetDeviceIDs == NULL) return 0; + if(__clewGetDeviceInfo == NULL) return 0; + + return CLEW_SUCCESS; +} + +const char* clewErrorString(cl_int error) +{ + static const char* strings[] = + { + // Error Codes + "CL_SUCCESS" // 0 + , "CL_DEVICE_NOT_FOUND" // -1 + , "CL_DEVICE_NOT_AVAILABLE" // -2 + , "CL_COMPILER_NOT_AVAILABLE" // -3 + , "CL_MEM_OBJECT_ALLOCATION_FAILURE" // -4 + , "CL_OUT_OF_RESOURCES" // -5 + , "CL_OUT_OF_HOST_MEMORY" // -6 + , "CL_PROFILING_INFO_NOT_AVAILABLE" // -7 + , "CL_MEM_COPY_OVERLAP" // -8 + , "CL_IMAGE_FORMAT_MISMATCH" // -9 + , "CL_IMAGE_FORMAT_NOT_SUPPORTED" // -10 + , "CL_BUILD_PROGRAM_FAILURE" // -11 + , "CL_MAP_FAILURE" // -12 + , "CL_MISALIGNED_SUB_BUFFER_OFFSET" // -13 + , "CL_EXEC_STATUS_ERROR_FOR_EVENTS_IN_WAIT_LIST"// -14 + , "CL_COMPILE_PROGRAM_FAILURE" // -15 + , "CL_LINKER_NOT_AVAILABLE" // -16 + , "CL_LINK_PROGRAM_FAILURE" // -17 + , "CL_DEVICE_PARTITION_FAILED" // -18 + , "CL_KERNEL_ARG_INFO_NOT_AVAILABLE" // -19 + + , "" // -20 + , "" // -21 + , "" // -22 + , "" // -23 + , "" // -24 + , "" // -25 + , "" // -26 + , "" // -27 + , "" // -28 + , "" // -29 + + , "CL_INVALID_VALUE" // -30 + , "CL_INVALID_DEVICE_TYPE" // -31 + , "CL_INVALID_PLATFORM" // -32 + , "CL_INVALID_DEVICE" // -33 + , "CL_INVALID_CONTEXT" // -34 + , "CL_INVALID_QUEUE_PROPERTIES" // -35 + , "CL_INVALID_COMMAND_QUEUE" // -36 + , "CL_INVALID_HOST_PTR" // -37 + , "CL_INVALID_MEM_OBJECT" // -38 + , "CL_INVALID_IMAGE_FORMAT_DESCRIPTOR" // -39 + , "CL_INVALID_IMAGE_SIZE" // -40 + , "CL_INVALID_SAMPLER" // -41 + , "CL_INVALID_BINARY" // -42 + , "CL_INVALID_BUILD_OPTIONS" // -43 + , "CL_INVALID_PROGRAM" // -44 + , "CL_INVALID_PROGRAM_EXECUTABLE" // -45 + , "CL_INVALID_KERNEL_NAME" // -46 + , "CL_INVALID_KERNEL_DEFINITION" // -47 + , "CL_INVALID_KERNEL" // -48 + , "CL_INVALID_ARG_INDEX" // -49 + , "CL_INVALID_ARG_VALUE" // -50 + , "CL_INVALID_ARG_SIZE" // -51 + , "CL_INVALID_KERNEL_ARGS" // -52 + , "CL_INVALID_WORK_DIMENSION" // -53 + , "CL_INVALID_WORK_GROUP_SIZE" // -54 + , "CL_INVALID_WORK_ITEM_SIZE" // -55 + , "CL_INVALID_GLOBAL_OFFSET" // -56 + , "CL_INVALID_EVENT_WAIT_LIST" // -57 + , "CL_INVALID_EVENT" // -58 + , "CL_INVALID_OPERATION" // -59 + , "CL_INVALID_GL_OBJECT" // -60 + , "CL_INVALID_BUFFER_SIZE" // -61 + , "CL_INVALID_MIP_LEVEL" // -62 + , "CL_INVALID_GLOBAL_WORK_SIZE" // -63 + , "CL_INVALID_PROPERTY" // -64 + , "CL_INVALID_IMAGE_DESCRIPTOR" // -65 + , "CL_INVALID_COMPILER_OPTIONS" // -66 + , "CL_INVALID_LINKER_OPTIONS" // -67 + , "CL_INVALID_DEVICE_PARTITION_COUNT" // -68 + }; + + static const int num_errors = sizeof(strings) / sizeof(strings[0]); + + if (error == -1001) { + return "CL_PLATFORM_NOT_FOUND_KHR"; + } + + if (error > 0 || -error >= num_errors) { + return "Unknown OpenCL error"; + } + + return strings[-error]; +} diff --git a/extern/cuew/include/cuew.h b/extern/cuew/include/cuew.h index 6206c882063..278fb1172ee 100644 --- a/extern/cuew/include/cuew.h +++ b/extern/cuew/include/cuew.h @@ -127,7 +127,7 @@ typedef uint32_t cuuint32_t; typedef uint64_t cuuint64_t; #endif -#if defined(__x86_64) || defined(AMD64) || defined(_M_AMD64) || defined (__aarch64__) || defined(_M_ARM64) || defined(__ppc64__) || defined(__PPC64__) +#if defined(__x86_64) || defined(AMD64) || defined(_M_AMD64) || defined (__aarch64__) || defined(__ppc64__) || defined(__PPC64__) typedef unsigned long long CUdeviceptr; #else typedef unsigned int CUdeviceptr; diff --git a/extern/hipew/include/hipew.h b/extern/hipew/include/hipew.h index 52bc26f8bbd..df7498aaeae 100644 --- a/extern/hipew/include/hipew.h +++ b/extern/hipew/include/hipew.h @@ -86,7 +86,7 @@ typedef uint32_t hipuint32_t; typedef uint64_t hipuint64_t; #endif -#if defined(__x86_64) || defined(AMD64) || defined(_M_AMD64) || defined (__aarch64__) || defined(_M_ARM64) || defined(__ppc64__) || defined(__PPC64__) +#if defined(__x86_64) || defined(AMD64) || defined(_M_AMD64) || defined (__aarch64__) || defined(__ppc64__) || defined(__PPC64__) typedef unsigned long long hipDeviceptr_t; #else typedef unsigned int hipDeviceptr_t; diff --git a/extern/lzma/7zTypes.h b/extern/lzma/7zTypes.h deleted file mode 100644 index 1fcb2473e18..00000000000 --- a/extern/lzma/7zTypes.h +++ /dev/null @@ -1,597 +0,0 @@ -/* 7zTypes.h -- Basic types -2023-04-02 : Igor Pavlov : Public domain */ - -#ifndef ZIP7_7Z_TYPES_H -#define ZIP7_7Z_TYPES_H - -#ifdef _WIN32 -/* #include */ -#else -#include -#endif - -#include - -#ifndef EXTERN_C_BEGIN -#ifdef __cplusplus -#define EXTERN_C_BEGIN extern "C" { -#define EXTERN_C_END } -#else -#define EXTERN_C_BEGIN -#define EXTERN_C_END -#endif -#endif - -EXTERN_C_BEGIN - -#define SZ_OK 0 - -#define SZ_ERROR_DATA 1 -#define SZ_ERROR_MEM 2 -#define SZ_ERROR_CRC 3 -#define SZ_ERROR_UNSUPPORTED 4 -#define SZ_ERROR_PARAM 5 -#define SZ_ERROR_INPUT_EOF 6 -#define SZ_ERROR_OUTPUT_EOF 7 -#define SZ_ERROR_READ 8 -#define SZ_ERROR_WRITE 9 -#define SZ_ERROR_PROGRESS 10 -#define SZ_ERROR_FAIL 11 -#define SZ_ERROR_THREAD 12 - -#define SZ_ERROR_ARCHIVE 16 -#define SZ_ERROR_NO_ARCHIVE 17 - -typedef int SRes; - - -#ifdef _MSC_VER - #if _MSC_VER > 1200 - #define MY_ALIGN(n) __declspec(align(n)) - #else - #define MY_ALIGN(n) - #endif -#else - /* - // C11/C++11: - #include - #define MY_ALIGN(n) alignas(n) - */ - #define MY_ALIGN(n) __attribute__ ((aligned(n))) -#endif - - -#ifdef _WIN32 - -/* typedef DWORD WRes; */ -typedef unsigned WRes; -#define MY_SRes_HRESULT_FROM_WRes(x) HRESULT_FROM_WIN32(x) - -// #define MY_HRES_ERROR_INTERNAL_ERROR MY_SRes_HRESULT_FROM_WRes(ERROR_INTERNAL_ERROR) - -#else // _WIN32 - -// #define ENV_HAVE_LSTAT -typedef int WRes; - -// (FACILITY_ERRNO = 0x800) is 7zip's FACILITY constant to represent (errno) errors in HRESULT -#define MY_FACILITY_ERRNO 0x800 -#define MY_FACILITY_WIN32 7 -#define MY_FACILITY_WRes MY_FACILITY_ERRNO - -#define MY_HRESULT_FROM_errno_CONST_ERROR(x) ((HRESULT)( \ - ( (HRESULT)(x) & 0x0000FFFF) \ - | (MY_FACILITY_WRes << 16) \ - | (HRESULT)0x80000000 )) - -#define MY_SRes_HRESULT_FROM_WRes(x) \ - ((HRESULT)(x) <= 0 ? ((HRESULT)(x)) : MY_HRESULT_FROM_errno_CONST_ERROR(x)) - -// we call macro HRESULT_FROM_WIN32 for system errors (WRes) that are (errno) -#define HRESULT_FROM_WIN32(x) MY_SRes_HRESULT_FROM_WRes(x) - -/* -#define ERROR_FILE_NOT_FOUND 2L -#define ERROR_ACCESS_DENIED 5L -#define ERROR_NO_MORE_FILES 18L -#define ERROR_LOCK_VIOLATION 33L -#define ERROR_FILE_EXISTS 80L -#define ERROR_DISK_FULL 112L -#define ERROR_NEGATIVE_SEEK 131L -#define ERROR_ALREADY_EXISTS 183L -#define ERROR_DIRECTORY 267L -#define ERROR_TOO_MANY_POSTS 298L - -#define ERROR_INTERNAL_ERROR 1359L -#define ERROR_INVALID_REPARSE_DATA 4392L -#define ERROR_REPARSE_TAG_INVALID 4393L -#define ERROR_REPARSE_TAG_MISMATCH 4394L -*/ - -// we use errno equivalents for some WIN32 errors: - -#define ERROR_INVALID_PARAMETER EINVAL -#define ERROR_INVALID_FUNCTION EINVAL -#define ERROR_ALREADY_EXISTS EEXIST -#define ERROR_FILE_EXISTS EEXIST -#define ERROR_PATH_NOT_FOUND ENOENT -#define ERROR_FILE_NOT_FOUND ENOENT -#define ERROR_DISK_FULL ENOSPC -// #define ERROR_INVALID_HANDLE EBADF - -// we use FACILITY_WIN32 for errors that has no errno equivalent -// Too many posts were made to a semaphore. -#define ERROR_TOO_MANY_POSTS ((HRESULT)0x8007012AL) -#define ERROR_INVALID_REPARSE_DATA ((HRESULT)0x80071128L) -#define ERROR_REPARSE_TAG_INVALID ((HRESULT)0x80071129L) - -// if (MY_FACILITY_WRes != FACILITY_WIN32), -// we use FACILITY_WIN32 for COM errors: -#define E_OUTOFMEMORY ((HRESULT)0x8007000EL) -#define E_INVALIDARG ((HRESULT)0x80070057L) -#define MY_E_ERROR_NEGATIVE_SEEK ((HRESULT)0x80070083L) - -/* -// we can use FACILITY_ERRNO for some COM errors, that have errno equivalents: -#define E_OUTOFMEMORY MY_HRESULT_FROM_errno_CONST_ERROR(ENOMEM) -#define E_INVALIDARG MY_HRESULT_FROM_errno_CONST_ERROR(EINVAL) -#define MY_E_ERROR_NEGATIVE_SEEK MY_HRESULT_FROM_errno_CONST_ERROR(EINVAL) -*/ - -#define TEXT(quote) quote - -#define FILE_ATTRIBUTE_READONLY 0x0001 -#define FILE_ATTRIBUTE_HIDDEN 0x0002 -#define FILE_ATTRIBUTE_SYSTEM 0x0004 -#define FILE_ATTRIBUTE_DIRECTORY 0x0010 -#define FILE_ATTRIBUTE_ARCHIVE 0x0020 -#define FILE_ATTRIBUTE_DEVICE 0x0040 -#define FILE_ATTRIBUTE_NORMAL 0x0080 -#define FILE_ATTRIBUTE_TEMPORARY 0x0100 -#define FILE_ATTRIBUTE_SPARSE_FILE 0x0200 -#define FILE_ATTRIBUTE_REPARSE_POINT 0x0400 -#define FILE_ATTRIBUTE_COMPRESSED 0x0800 -#define FILE_ATTRIBUTE_OFFLINE 0x1000 -#define FILE_ATTRIBUTE_NOT_CONTENT_INDEXED 0x2000 -#define FILE_ATTRIBUTE_ENCRYPTED 0x4000 - -#define FILE_ATTRIBUTE_UNIX_EXTENSION 0x8000 /* trick for Unix */ - -#endif - - -#ifndef RINOK -#define RINOK(x) { const int _result_ = (x); if (_result_ != 0) return _result_; } -#endif - -#ifndef RINOK_WRes -#define RINOK_WRes(x) { const WRes _result_ = (x); if (_result_ != 0) return _result_; } -#endif - -typedef unsigned char Byte; -typedef short Int16; -typedef unsigned short UInt16; - -#ifdef Z7_DECL_Int32_AS_long -typedef long Int32; -typedef unsigned long UInt32; -#else -typedef int Int32; -typedef unsigned int UInt32; -#endif - - -#ifndef _WIN32 - -typedef int INT; -typedef Int32 INT32; -typedef unsigned int UINT; -typedef UInt32 UINT32; -typedef INT32 LONG; // LONG, ULONG and DWORD must be 32-bit for _WIN32 compatibility -typedef UINT32 ULONG; - -#undef DWORD -typedef UINT32 DWORD; - -#define VOID void - -#define HRESULT LONG - -typedef void *LPVOID; -// typedef void VOID; -// typedef ULONG_PTR DWORD_PTR, *PDWORD_PTR; -// gcc / clang on Unix : sizeof(long==sizeof(void*) in 32 or 64 bits) -typedef long INT_PTR; -typedef unsigned long UINT_PTR; -typedef long LONG_PTR; -typedef unsigned long DWORD_PTR; - -typedef size_t SIZE_T; - -#endif // _WIN32 - - -#define MY_HRES_ERROR_INTERNAL_ERROR ((HRESULT)0x8007054FL) - - -#ifdef Z7_DECL_Int64_AS_long - -typedef long Int64; -typedef unsigned long UInt64; - -#else - -#if (defined(_MSC_VER) || defined(__BORLANDC__)) && !defined(__clang__) -typedef __int64 Int64; -typedef unsigned __int64 UInt64; -#else -#if defined(__clang__) || defined(__GNUC__) -#include -typedef int64_t Int64; -typedef uint64_t UInt64; -#else -typedef long long int Int64; -typedef unsigned long long int UInt64; -// #define UINT64_CONST(n) n ## ULL -#endif -#endif - -#endif - -#define UINT64_CONST(n) n - - -#ifdef Z7_DECL_SizeT_AS_unsigned_int -typedef unsigned int SizeT; -#else -typedef size_t SizeT; -#endif - -/* -#if (defined(_MSC_VER) && _MSC_VER <= 1200) -typedef size_t MY_uintptr_t; -#else -#include -typedef uintptr_t MY_uintptr_t; -#endif -*/ - -typedef int BoolInt; -/* typedef BoolInt Bool; */ -#define True 1 -#define False 0 - - -#ifdef _WIN32 -#define Z7_STDCALL __stdcall -#else -#define Z7_STDCALL -#endif - -#ifdef _MSC_VER - -#if _MSC_VER >= 1300 -#define Z7_NO_INLINE __declspec(noinline) -#else -#define Z7_NO_INLINE -#endif - -#define Z7_FORCE_INLINE __forceinline - -#define Z7_CDECL __cdecl -#define Z7_FASTCALL __fastcall - -#else // _MSC_VER - -#if (defined(__GNUC__) && (__GNUC__ >= 4)) \ - || (defined(__clang__) && (__clang_major__ >= 4)) \ - || defined(__INTEL_COMPILER) \ - || defined(__xlC__) -#define Z7_NO_INLINE __attribute__((noinline)) -#define Z7_FORCE_INLINE __attribute__((always_inline)) inline -#else -#define Z7_NO_INLINE -#define Z7_FORCE_INLINE -#endif - -#define Z7_CDECL - -#if defined(_M_IX86) \ - || defined(__i386__) -// #define Z7_FASTCALL __attribute__((fastcall)) -// #define Z7_FASTCALL __attribute__((cdecl)) -#define Z7_FASTCALL -#elif defined(MY_CPU_AMD64) -// #define Z7_FASTCALL __attribute__((ms_abi)) -#define Z7_FASTCALL -#else -#define Z7_FASTCALL -#endif - -#endif // _MSC_VER - - -/* The following interfaces use first parameter as pointer to structure */ - -// #define Z7_C_IFACE_CONST_QUAL -#define Z7_C_IFACE_CONST_QUAL const - -#define Z7_C_IFACE_DECL(a) \ - struct a ## _; \ - typedef Z7_C_IFACE_CONST_QUAL struct a ## _ * a ## Ptr; \ - typedef struct a ## _ a; \ - struct a ## _ - - -Z7_C_IFACE_DECL (IByteIn) -{ - Byte (*Read)(IByteInPtr p); /* reads one byte, returns 0 in case of EOF or error */ -}; -#define IByteIn_Read(p) (p)->Read(p) - - -Z7_C_IFACE_DECL (IByteOut) -{ - void (*Write)(IByteOutPtr p, Byte b); -}; -#define IByteOut_Write(p, b) (p)->Write(p, b) - - -Z7_C_IFACE_DECL (ISeqInStream) -{ - SRes (*Read)(ISeqInStreamPtr p, void *buf, size_t *size); - /* if (input(*size) != 0 && output(*size) == 0) means end_of_stream. - (output(*size) < input(*size)) is allowed */ -}; -#define ISeqInStream_Read(p, buf, size) (p)->Read(p, buf, size) - -/* try to read as much as avail in stream and limited by (*processedSize) */ -SRes SeqInStream_ReadMax(ISeqInStreamPtr stream, void *buf, size_t *processedSize); -/* it can return SZ_ERROR_INPUT_EOF */ -// SRes SeqInStream_Read(ISeqInStreamPtr stream, void *buf, size_t size); -// SRes SeqInStream_Read2(ISeqInStreamPtr stream, void *buf, size_t size, SRes errorType); -SRes SeqInStream_ReadByte(ISeqInStreamPtr stream, Byte *buf); - - -Z7_C_IFACE_DECL (ISeqOutStream) -{ - size_t (*Write)(ISeqOutStreamPtr p, const void *buf, size_t size); - /* Returns: result - the number of actually written bytes. - (result < size) means error */ -}; -#define ISeqOutStream_Write(p, buf, size) (p)->Write(p, buf, size) - -typedef enum -{ - SZ_SEEK_SET = 0, - SZ_SEEK_CUR = 1, - SZ_SEEK_END = 2 -} ESzSeek; - - -Z7_C_IFACE_DECL (ISeekInStream) -{ - SRes (*Read)(ISeekInStreamPtr p, void *buf, size_t *size); /* same as ISeqInStream::Read */ - SRes (*Seek)(ISeekInStreamPtr p, Int64 *pos, ESzSeek origin); -}; -#define ISeekInStream_Read(p, buf, size) (p)->Read(p, buf, size) -#define ISeekInStream_Seek(p, pos, origin) (p)->Seek(p, pos, origin) - - -Z7_C_IFACE_DECL (ILookInStream) -{ - SRes (*Look)(ILookInStreamPtr p, const void **buf, size_t *size); - /* if (input(*size) != 0 && output(*size) == 0) means end_of_stream. - (output(*size) > input(*size)) is not allowed - (output(*size) < input(*size)) is allowed */ - SRes (*Skip)(ILookInStreamPtr p, size_t offset); - /* offset must be <= output(*size) of Look */ - SRes (*Read)(ILookInStreamPtr p, void *buf, size_t *size); - /* reads directly (without buffer). It's same as ISeqInStream::Read */ - SRes (*Seek)(ILookInStreamPtr p, Int64 *pos, ESzSeek origin); -}; - -#define ILookInStream_Look(p, buf, size) (p)->Look(p, buf, size) -#define ILookInStream_Skip(p, offset) (p)->Skip(p, offset) -#define ILookInStream_Read(p, buf, size) (p)->Read(p, buf, size) -#define ILookInStream_Seek(p, pos, origin) (p)->Seek(p, pos, origin) - - -SRes LookInStream_LookRead(ILookInStreamPtr stream, void *buf, size_t *size); -SRes LookInStream_SeekTo(ILookInStreamPtr stream, UInt64 offset); - -/* reads via ILookInStream::Read */ -SRes LookInStream_Read2(ILookInStreamPtr stream, void *buf, size_t size, SRes errorType); -SRes LookInStream_Read(ILookInStreamPtr stream, void *buf, size_t size); - - -typedef struct -{ - ILookInStream vt; - ISeekInStreamPtr realStream; - - size_t pos; - size_t size; /* it's data size */ - - /* the following variables must be set outside */ - Byte *buf; - size_t bufSize; -} CLookToRead2; - -void LookToRead2_CreateVTable(CLookToRead2 *p, int lookahead); - -#define LookToRead2_INIT(p) { (p)->pos = (p)->size = 0; } - - -typedef struct -{ - ISeqInStream vt; - ILookInStreamPtr realStream; -} CSecToLook; - -void SecToLook_CreateVTable(CSecToLook *p); - - - -typedef struct -{ - ISeqInStream vt; - ILookInStreamPtr realStream; -} CSecToRead; - -void SecToRead_CreateVTable(CSecToRead *p); - - -Z7_C_IFACE_DECL (ICompressProgress) -{ - SRes (*Progress)(ICompressProgressPtr p, UInt64 inSize, UInt64 outSize); - /* Returns: result. (result != SZ_OK) means break. - Value (UInt64)(Int64)-1 for size means unknown value. */ -}; - -#define ICompressProgress_Progress(p, inSize, outSize) (p)->Progress(p, inSize, outSize) - - - -typedef struct ISzAlloc ISzAlloc; -typedef const ISzAlloc * ISzAllocPtr; - -struct ISzAlloc -{ - void *(*Alloc)(ISzAllocPtr p, size_t size); - void (*Free)(ISzAllocPtr p, void *address); /* address can be 0 */ -}; - -#define ISzAlloc_Alloc(p, size) (p)->Alloc(p, size) -#define ISzAlloc_Free(p, a) (p)->Free(p, a) - -/* deprecated */ -#define IAlloc_Alloc(p, size) ISzAlloc_Alloc(p, size) -#define IAlloc_Free(p, a) ISzAlloc_Free(p, a) - - - - - -#ifndef MY_offsetof - #ifdef offsetof - #define MY_offsetof(type, m) offsetof(type, m) - /* - #define MY_offsetof(type, m) FIELD_OFFSET(type, m) - */ - #else - #define MY_offsetof(type, m) ((size_t)&(((type *)0)->m)) - #endif -#endif - - - -#ifndef Z7_container_of - -/* -#define Z7_container_of(ptr, type, m) container_of(ptr, type, m) -#define Z7_container_of(ptr, type, m) CONTAINING_RECORD(ptr, type, m) -#define Z7_container_of(ptr, type, m) ((type *)((char *)(ptr) - offsetof(type, m))) -#define Z7_container_of(ptr, type, m) (&((type *)0)->m == (ptr), ((type *)(((char *)(ptr)) - MY_offsetof(type, m)))) -*/ - -/* - GCC shows warning: "perhaps the 'offsetof' macro was used incorrectly" - GCC 3.4.4 : classes with constructor - GCC 4.8.1 : classes with non-public variable members" -*/ - -#define Z7_container_of(ptr, type, m) \ - ((type *)(void *)((char *)(void *) \ - (1 ? (ptr) : &((type *)NULL)->m) - MY_offsetof(type, m))) - -#define Z7_container_of_CONST(ptr, type, m) \ - ((const type *)(const void *)((const char *)(const void *) \ - (1 ? (ptr) : &((type *)NULL)->m) - MY_offsetof(type, m))) - -/* -#define Z7_container_of_NON_CONST_FROM_CONST(ptr, type, m) \ - ((type *)(void *)(const void *)((const char *)(const void *) \ - (1 ? (ptr) : &((type *)NULL)->m) - MY_offsetof(type, m))) -*/ - -#endif - -#define Z7_CONTAINER_FROM_VTBL_SIMPLE(ptr, type, m) ((type *)(void *)(ptr)) - -// #define Z7_CONTAINER_FROM_VTBL(ptr, type, m) Z7_CONTAINER_FROM_VTBL_SIMPLE(ptr, type, m) -#define Z7_CONTAINER_FROM_VTBL(ptr, type, m) Z7_container_of(ptr, type, m) -// #define Z7_CONTAINER_FROM_VTBL(ptr, type, m) Z7_container_of_NON_CONST_FROM_CONST(ptr, type, m) - -#define Z7_CONTAINER_FROM_VTBL_CONST(ptr, type, m) Z7_container_of_CONST(ptr, type, m) - -#define Z7_CONTAINER_FROM_VTBL_CLS(ptr, type, m) Z7_CONTAINER_FROM_VTBL_SIMPLE(ptr, type, m) -/* -#define Z7_CONTAINER_FROM_VTBL_CLS(ptr, type, m) Z7_CONTAINER_FROM_VTBL(ptr, type, m) -*/ -#if defined (__clang__) || defined(__GNUC__) -#define Z7_DIAGNOSCTIC_IGNORE_BEGIN_CAST_QUAL \ - _Pragma("GCC diagnostic push") \ - _Pragma("GCC diagnostic ignored \"-Wcast-qual\"") -#define Z7_DIAGNOSCTIC_IGNORE_END_CAST_QUAL \ - _Pragma("GCC diagnostic pop") -#else -#define Z7_DIAGNOSCTIC_IGNORE_BEGIN_CAST_QUAL -#define Z7_DIAGNOSCTIC_IGNORE_END_CAST_QUAL -#endif - -#define Z7_CONTAINER_FROM_VTBL_TO_DECL_VAR(ptr, type, m, p) \ - Z7_DIAGNOSCTIC_IGNORE_BEGIN_CAST_QUAL \ - type *p = Z7_CONTAINER_FROM_VTBL(ptr, type, m); \ - Z7_DIAGNOSCTIC_IGNORE_END_CAST_QUAL - -#define Z7_CONTAINER_FROM_VTBL_TO_DECL_VAR_pp_vt_p(type) \ - Z7_CONTAINER_FROM_VTBL_TO_DECL_VAR(pp, type, vt, p) - - -// #define ZIP7_DECLARE_HANDLE(name) typedef void *name; -#define Z7_DECLARE_HANDLE(name) struct name##_dummy{int unused;}; typedef struct name##_dummy *name; - - -#define Z7_memset_0_ARRAY(a) memset((a), 0, sizeof(a)) - -#ifndef Z7_ARRAY_SIZE -#define Z7_ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0])) -#endif - - -#ifdef _WIN32 - -#define CHAR_PATH_SEPARATOR '\\' -#define WCHAR_PATH_SEPARATOR L'\\' -#define STRING_PATH_SEPARATOR "\\" -#define WSTRING_PATH_SEPARATOR L"\\" - -#else - -#define CHAR_PATH_SEPARATOR '/' -#define WCHAR_PATH_SEPARATOR L'/' -#define STRING_PATH_SEPARATOR "/" -#define WSTRING_PATH_SEPARATOR L"/" - -#endif - -#define k_PropVar_TimePrec_0 0 -#define k_PropVar_TimePrec_Unix 1 -#define k_PropVar_TimePrec_DOS 2 -#define k_PropVar_TimePrec_HighPrec 3 -#define k_PropVar_TimePrec_Base 16 -#define k_PropVar_TimePrec_100ns (k_PropVar_TimePrec_Base + 7) -#define k_PropVar_TimePrec_1ns (k_PropVar_TimePrec_Base + 9) - -EXTERN_C_END - -#endif - -/* -#ifndef Z7_ST -#ifdef _7ZIP_ST -#define Z7_ST -#endif -#endif -*/ diff --git a/extern/lzma/7zWindows.h b/extern/lzma/7zWindows.h deleted file mode 100644 index 42c6db8bfc2..00000000000 --- a/extern/lzma/7zWindows.h +++ /dev/null @@ -1,101 +0,0 @@ -/* 7zWindows.h -- StdAfx -2023-04-02 : Igor Pavlov : Public domain */ - -#ifndef ZIP7_INC_7Z_WINDOWS_H -#define ZIP7_INC_7Z_WINDOWS_H - -#ifdef _WIN32 - -#if defined(__clang__) -# pragma clang diagnostic push -#endif - -#if defined(_MSC_VER) - -#pragma warning(push) -#pragma warning(disable : 4668) // '_WIN32_WINNT' is not defined as a preprocessor macro, replacing with '0' for '#if/#elif' - -#if _MSC_VER == 1900 -// for old kit10 versions -// #pragma warning(disable : 4255) // winuser.h(13979): warning C4255: 'GetThreadDpiAwarenessContext': -#endif -// win10 Windows Kit: -#endif // _MSC_VER - -#if defined(_MSC_VER) && _MSC_VER <= 1200 && !defined(_WIN64) -// for msvc6 without sdk2003 -#define RPC_NO_WINDOWS_H -#endif - -#if defined(__MINGW32__) || defined(__MINGW64__) -// #if defined(__GNUC__) && !defined(__clang__) -#include -#else -#include -#endif -// #include -// #include - -// but if precompiled with clang-cl then we need -// #include -#if defined(_MSC_VER) -#pragma warning(pop) -#endif - -#if defined(__clang__) -# pragma clang diagnostic pop -#endif - -#if defined(_MSC_VER) && _MSC_VER <= 1200 && !defined(_WIN64) -#ifndef _W64 - -typedef long LONG_PTR, *PLONG_PTR; -typedef unsigned long ULONG_PTR, *PULONG_PTR; -typedef ULONG_PTR DWORD_PTR, *PDWORD_PTR; - -#define Z7_OLD_WIN_SDK -#endif // _W64 -#endif // _MSC_VER == 1200 - -#ifdef Z7_OLD_WIN_SDK - -#ifndef INVALID_FILE_ATTRIBUTES -#define INVALID_FILE_ATTRIBUTES ((DWORD)-1) -#endif -#ifndef INVALID_SET_FILE_POINTER -#define INVALID_SET_FILE_POINTER ((DWORD)-1) -#endif -#ifndef FILE_SPECIAL_ACCESS -#define FILE_SPECIAL_ACCESS (FILE_ANY_ACCESS) -#endif - -// ShlObj.h: -// #define BIF_NEWDIALOGSTYLE 0x0040 - -#pragma warning(disable : 4201) -// #pragma warning(disable : 4115) - -#undef VARIANT_TRUE -#define VARIANT_TRUE ((VARIANT_BOOL)-1) -#endif - -#endif // Z7_OLD_WIN_SDK - -#ifdef UNDER_CE -#undef VARIANT_TRUE -#define VARIANT_TRUE ((VARIANT_BOOL)-1) -#endif - - -#if defined(_MSC_VER) -#if _MSC_VER >= 1400 && _MSC_VER <= 1600 - // BaseTsd.h(148) : 'HandleToULong' : unreferenced inline function has been removed - // string.h - // #pragma warning(disable : 4514) -#endif -#endif - - -/* #include "7zTypes.h" */ - -#endif diff --git a/extern/lzma/Alloc.c b/extern/lzma/Alloc.c index d841bf20a35..358a7b52650 100644 --- a/extern/lzma/Alloc.c +++ b/extern/lzma/Alloc.c @@ -1,182 +1,33 @@ /* Alloc.c -- Memory allocation functions -2023-04-02 : Igor Pavlov : Public domain */ - -#include "Precomp.h" +2008-09-24 +Igor Pavlov +Public domain */ #ifdef _WIN32 -#include "7zWindows.h" +#include #endif #include #include "Alloc.h" -#ifdef _WIN32 -#ifdef Z7_LARGE_PAGES -#if defined(__clang__) || defined(__GNUC__) -typedef void (*Z7_voidFunction)(void); -#define MY_CAST_FUNC (Z7_voidFunction) -#elif defined(_MSC_VER) && _MSC_VER > 1920 -#define MY_CAST_FUNC (void *) -// #pragma warning(disable : 4191) // 'type cast': unsafe conversion from 'FARPROC' to 'void (__cdecl *)()' -#else -#define MY_CAST_FUNC -#endif -#endif // Z7_LARGE_PAGES -#endif // _WIN32 +/* #define _SZ_ALLOC_DEBUG */ -// #define SZ_ALLOC_DEBUG -/* #define SZ_ALLOC_DEBUG */ - -/* use SZ_ALLOC_DEBUG to debug alloc/free operations */ -#ifdef SZ_ALLOC_DEBUG - -#include +/* use _SZ_ALLOC_DEBUG to debug alloc/free operations */ +#ifdef _SZ_ALLOC_DEBUG #include -static int g_allocCount = 0; -#ifdef _WIN32 -static int g_allocCountMid = 0; -static int g_allocCountBig = 0; +int g_allocCount = 0; +int g_allocCountMid = 0; +int g_allocCountBig = 0; #endif - -#define CONVERT_INT_TO_STR(charType, tempSize) \ - char temp[tempSize]; unsigned i = 0; \ - while (val >= 10) { temp[i++] = (char)('0' + (unsigned)(val % 10)); val /= 10; } \ - *s++ = (charType)('0' + (unsigned)val); \ - while (i != 0) { i--; *s++ = temp[i]; } \ - *s = 0; - -static void ConvertUInt64ToString(UInt64 val, char *s) -{ - CONVERT_INT_TO_STR(char, 24) -} - -#define GET_HEX_CHAR(t) ((char)(((t < 10) ? ('0' + t) : ('A' + (t - 10))))) - -static void ConvertUInt64ToHex(UInt64 val, char *s) -{ - UInt64 v = val; - unsigned i; - for (i = 1;; i++) - { - v >>= 4; - if (v == 0) - break; - } - s[i] = 0; - do - { - unsigned t = (unsigned)(val & 0xF); - val >>= 4; - s[--i] = GET_HEX_CHAR(t); - } - while (i); -} - -#define DEBUG_OUT_STREAM stderr - -static void Print(const char *s) -{ - fputs(s, DEBUG_OUT_STREAM); -} - -static void PrintAligned(const char *s, size_t align) -{ - size_t len = strlen(s); - for(;;) - { - fputc(' ', DEBUG_OUT_STREAM); - if (len >= align) - break; - ++len; - } - Print(s); -} - -static void PrintLn(void) -{ - Print("\n"); -} - -static void PrintHex(UInt64 v, size_t align) -{ - char s[32]; - ConvertUInt64ToHex(v, s); - PrintAligned(s, align); -} - -static void PrintDec(int v, size_t align) -{ - char s[32]; - ConvertUInt64ToString((unsigned)v, s); - PrintAligned(s, align); -} - -static void PrintAddr(void *p) -{ - PrintHex((UInt64)(size_t)(ptrdiff_t)p, 12); -} - - -#define PRINT_REALLOC(name, cnt, size, ptr) { \ - Print(name " "); \ - if (!ptr) PrintDec(cnt++, 10); \ - PrintHex(size, 10); \ - PrintAddr(ptr); \ - PrintLn(); } - -#define PRINT_ALLOC(name, cnt, size, ptr) { \ - Print(name " "); \ - PrintDec(cnt++, 10); \ - PrintHex(size, 10); \ - PrintAddr(ptr); \ - PrintLn(); } - -#define PRINT_FREE(name, cnt, ptr) if (ptr) { \ - Print(name " "); \ - PrintDec(--cnt, 10); \ - PrintAddr(ptr); \ - PrintLn(); } - -#else - -#ifdef _WIN32 -#define PRINT_ALLOC(name, cnt, size, ptr) -#endif -#define PRINT_FREE(name, cnt, ptr) -#define Print(s) -#define PrintLn() -#define PrintHex(v, align) -#define PrintAddr(p) - -#endif - - -/* -by specification: - malloc(non_NULL, 0) : returns NULL or a unique pointer value that can later be successfully passed to free() - realloc(NULL, size) : the call is equivalent to malloc(size) - realloc(non_NULL, 0) : the call is equivalent to free(ptr) - -in main compilers: - malloc(0) : returns non_NULL - realloc(NULL, 0) : returns non_NULL - realloc(non_NULL, 0) : returns NULL -*/ - - void *MyAlloc(size_t size) { if (size == 0) - return NULL; - // PRINT_ALLOC("Alloc ", g_allocCount, size, NULL) - #ifdef SZ_ALLOC_DEBUG + return 0; + #ifdef _SZ_ALLOC_DEBUG { void *p = malloc(size); - if (p) - { - PRINT_ALLOC("Alloc ", g_allocCount, size, p) - } + fprintf(stderr, "\nAlloc %10d bytes, count = %10d, addr = %8X", size, g_allocCount++, (unsigned)p); return p; } #else @@ -186,350 +37,91 @@ void *MyAlloc(size_t size) void MyFree(void *address) { - PRINT_FREE("Free ", g_allocCount, address) - + #ifdef _SZ_ALLOC_DEBUG + if (address != 0) + fprintf(stderr, "\nFree; count = %10d, addr = %8X", --g_allocCount, (unsigned)address); + #endif free(address); } -void *MyRealloc(void *address, size_t size) -{ - if (size == 0) - { - MyFree(address); - return NULL; - } - // PRINT_REALLOC("Realloc ", g_allocCount, size, address) - #ifdef SZ_ALLOC_DEBUG - { - void *p = realloc(address, size); - if (p) - { - PRINT_REALLOC("Realloc ", g_allocCount, size, address) - } - return p; - } - #else - return realloc(address, size); - #endif -} - - #ifdef _WIN32 void *MidAlloc(size_t size) { if (size == 0) - return NULL; - #ifdef SZ_ALLOC_DEBUG - { - void *p = VirtualAlloc(NULL, size, MEM_COMMIT, PAGE_READWRITE); - if (p) - { - PRINT_ALLOC("Alloc-Mid", g_allocCountMid, size, p) - } - return p; - } - #else - return VirtualAlloc(NULL, size, MEM_COMMIT, PAGE_READWRITE); + return 0; + #ifdef _SZ_ALLOC_DEBUG + fprintf(stderr, "\nAlloc_Mid %10d bytes; count = %10d", size, g_allocCountMid++); #endif + return VirtualAlloc(0, size, MEM_COMMIT, PAGE_READWRITE); } void MidFree(void *address) { - PRINT_FREE("Free-Mid", g_allocCountMid, address) - - if (!address) + #ifdef _SZ_ALLOC_DEBUG + if (address != 0) + fprintf(stderr, "\nFree_Mid; count = %10d", --g_allocCountMid); + #endif + if (address == 0) return; VirtualFree(address, 0, MEM_RELEASE); } -#ifdef Z7_LARGE_PAGES - -#ifdef MEM_LARGE_PAGES - #define MY__MEM_LARGE_PAGES MEM_LARGE_PAGES -#else - #define MY__MEM_LARGE_PAGES 0x20000000 +#ifndef MEM_LARGE_PAGES +#undef _7ZIP_LARGE_PAGES #endif -extern -SIZE_T g_LargePageSize; +#ifdef _7ZIP_LARGE_PAGES SIZE_T g_LargePageSize = 0; -typedef SIZE_T (WINAPI *Func_GetLargePageMinimum)(VOID); +typedef SIZE_T (WINAPI *GetLargePageMinimumP)(); +#endif -void SetLargePageSize(void) +void SetLargePageSize() { - #ifdef Z7_LARGE_PAGES - SIZE_T size; - const - Func_GetLargePageMinimum fn = - (Func_GetLargePageMinimum) MY_CAST_FUNC GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), - "GetLargePageMinimum"); - if (!fn) + #ifdef _7ZIP_LARGE_PAGES + SIZE_T size = 0; + GetLargePageMinimumP largePageMinimum = (GetLargePageMinimumP) + GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), "GetLargePageMinimum"); + if (largePageMinimum == 0) return; - size = fn(); + size = largePageMinimum(); if (size == 0 || (size & (size - 1)) != 0) return; g_LargePageSize = size; #endif } -#endif // Z7_LARGE_PAGES void *BigAlloc(size_t size) { if (size == 0) - return NULL; - - PRINT_ALLOC("Alloc-Big", g_allocCountBig, size, NULL) - - #ifdef Z7_LARGE_PAGES + return 0; + #ifdef _SZ_ALLOC_DEBUG + fprintf(stderr, "\nAlloc_Big %10d bytes; count = %10d", size, g_allocCountBig++); + #endif + + #ifdef _7ZIP_LARGE_PAGES + if (g_LargePageSize != 0 && g_LargePageSize <= (1 << 30) && size >= (1 << 18)) { - SIZE_T ps = g_LargePageSize; - if (ps != 0 && ps <= (1 << 30) && size > (ps / 2)) - { - size_t size2; - ps--; - size2 = (size + ps) & ~ps; - if (size2 >= size) - { - void *p = VirtualAlloc(NULL, size2, MEM_COMMIT | MY__MEM_LARGE_PAGES, PAGE_READWRITE); - if (p) - { - PRINT_ALLOC("Alloc-BM ", g_allocCountMid, size2, p) - return p; - } - } - } + void *res = VirtualAlloc(0, (size + g_LargePageSize - 1) & (~(g_LargePageSize - 1)), + MEM_COMMIT | MEM_LARGE_PAGES, PAGE_READWRITE); + if (res != 0) + return res; } #endif - - return MidAlloc(size); + return VirtualAlloc(0, size, MEM_COMMIT, PAGE_READWRITE); } void BigFree(void *address) { - PRINT_FREE("Free-Big", g_allocCountBig, address) - MidFree(address); -} - -#endif // _WIN32 - - -static void *SzAlloc(ISzAllocPtr p, size_t size) { UNUSED_VAR(p) return MyAlloc(size); } -static void SzFree(ISzAllocPtr p, void *address) { UNUSED_VAR(p) MyFree(address); } -const ISzAlloc g_Alloc = { SzAlloc, SzFree }; - -#ifdef _WIN32 -static void *SzMidAlloc(ISzAllocPtr p, size_t size) { UNUSED_VAR(p) return MidAlloc(size); } -static void SzMidFree(ISzAllocPtr p, void *address) { UNUSED_VAR(p) MidFree(address); } -static void *SzBigAlloc(ISzAllocPtr p, size_t size) { UNUSED_VAR(p) return BigAlloc(size); } -static void SzBigFree(ISzAllocPtr p, void *address) { UNUSED_VAR(p) BigFree(address); } -const ISzAlloc g_MidAlloc = { SzMidAlloc, SzMidFree }; -const ISzAlloc g_BigAlloc = { SzBigAlloc, SzBigFree }; -#endif - -/* - uintptr_t : C99 (optional) - : unsupported in VS6 -*/ - -#ifdef _WIN32 - typedef UINT_PTR UIntPtr; -#else - /* - typedef uintptr_t UIntPtr; - */ - typedef ptrdiff_t UIntPtr; -#endif - - -#define ADJUST_ALLOC_SIZE 0 -/* -#define ADJUST_ALLOC_SIZE (sizeof(void *) - 1) -*/ -/* - Use (ADJUST_ALLOC_SIZE = (sizeof(void *) - 1)), if - MyAlloc() can return address that is NOT multiple of sizeof(void *). -*/ - - -/* -#define MY_ALIGN_PTR_DOWN(p, align) ((void *)((char *)(p) - ((size_t)(UIntPtr)(p) & ((align) - 1)))) -*/ -#define MY_ALIGN_PTR_DOWN(p, align) ((void *)((((UIntPtr)(p)) & ~((UIntPtr)(align) - 1)))) - - -#if !defined(_WIN32) && defined(_POSIX_C_SOURCE) && (_POSIX_C_SOURCE >= 200112L) - #define USE_posix_memalign -#endif - -#ifndef USE_posix_memalign -#define MY_ALIGN_PTR_UP_PLUS(p, align) MY_ALIGN_PTR_DOWN(((char *)(p) + (align) + ADJUST_ALLOC_SIZE), align) -#endif - -/* - This posix_memalign() is for test purposes only. - We also need special Free() function instead of free(), - if this posix_memalign() is used. -*/ - -/* -static int posix_memalign(void **ptr, size_t align, size_t size) -{ - size_t newSize = size + align; - void *p; - void *pAligned; - *ptr = NULL; - if (newSize < size) - return 12; // ENOMEM - p = MyAlloc(newSize); - if (!p) - return 12; // ENOMEM - pAligned = MY_ALIGN_PTR_UP_PLUS(p, align); - ((void **)pAligned)[-1] = p; - *ptr = pAligned; - return 0; -} -*/ - -/* - ALLOC_ALIGN_SIZE >= sizeof(void *) - ALLOC_ALIGN_SIZE >= cache_line_size -*/ - -#define ALLOC_ALIGN_SIZE ((size_t)1 << 7) - -static void *SzAlignedAlloc(ISzAllocPtr pp, size_t size) -{ - #ifndef USE_posix_memalign - - void *p; - void *pAligned; - size_t newSize; - UNUSED_VAR(pp) - - /* also we can allocate additional dummy ALLOC_ALIGN_SIZE bytes after aligned - block to prevent cache line sharing with another allocated blocks */ - - newSize = size + ALLOC_ALIGN_SIZE * 1 + ADJUST_ALLOC_SIZE; - if (newSize < size) - return NULL; - - p = MyAlloc(newSize); - - if (!p) - return NULL; - pAligned = MY_ALIGN_PTR_UP_PLUS(p, ALLOC_ALIGN_SIZE); - - Print(" size="); PrintHex(size, 8); - Print(" a_size="); PrintHex(newSize, 8); - Print(" ptr="); PrintAddr(p); - Print(" a_ptr="); PrintAddr(pAligned); - PrintLn(); - - ((void **)pAligned)[-1] = p; - - return pAligned; - - #else - - void *p; - UNUSED_VAR(pp) - if (posix_memalign(&p, ALLOC_ALIGN_SIZE, size)) - return NULL; - - Print(" posix_memalign="); PrintAddr(p); - PrintLn(); - - return p; - + #ifdef _SZ_ALLOC_DEBUG + if (address != 0) + fprintf(stderr, "\nFree_Big; count = %10d", --g_allocCountBig); #endif -} - - -static void SzAlignedFree(ISzAllocPtr pp, void *address) -{ - UNUSED_VAR(pp) - #ifndef USE_posix_memalign - if (address) - MyFree(((void **)address)[-1]); - #else - free(address); - #endif -} - - -const ISzAlloc g_AlignedAlloc = { SzAlignedAlloc, SzAlignedFree }; - - - -#define MY_ALIGN_PTR_DOWN_1(p) MY_ALIGN_PTR_DOWN(p, sizeof(void *)) - -/* we align ptr to support cases where CAlignOffsetAlloc::offset is not multiply of sizeof(void *) */ -#define REAL_BLOCK_PTR_VAR(p) ((void **)MY_ALIGN_PTR_DOWN_1(p))[-1] -/* -#define REAL_BLOCK_PTR_VAR(p) ((void **)(p))[-1] -*/ - -static void *AlignOffsetAlloc_Alloc(ISzAllocPtr pp, size_t size) -{ - const CAlignOffsetAlloc *p = Z7_CONTAINER_FROM_VTBL_CONST(pp, CAlignOffsetAlloc, vt); - void *adr; - void *pAligned; - size_t newSize; - size_t extra; - size_t alignSize = (size_t)1 << p->numAlignBits; - - if (alignSize < sizeof(void *)) - alignSize = sizeof(void *); - if (p->offset >= alignSize) - return NULL; - - /* also we can allocate additional dummy ALLOC_ALIGN_SIZE bytes after aligned - block to prevent cache line sharing with another allocated blocks */ - extra = p->offset & (sizeof(void *) - 1); - newSize = size + alignSize + extra + ADJUST_ALLOC_SIZE; - if (newSize < size) - return NULL; - - adr = ISzAlloc_Alloc(p->baseAlloc, newSize); - - if (!adr) - return NULL; - - pAligned = (char *)MY_ALIGN_PTR_DOWN((char *)adr + - alignSize - p->offset + extra + ADJUST_ALLOC_SIZE, alignSize) + p->offset; - - PrintLn(); - Print("- Aligned: "); - Print(" size="); PrintHex(size, 8); - Print(" a_size="); PrintHex(newSize, 8); - Print(" ptr="); PrintAddr(adr); - Print(" a_ptr="); PrintAddr(pAligned); - PrintLn(); - - REAL_BLOCK_PTR_VAR(pAligned) = adr; - - return pAligned; + if (address == 0) + return; + VirtualFree(address, 0, MEM_RELEASE); } - -static void AlignOffsetAlloc_Free(ISzAllocPtr pp, void *address) -{ - if (address) - { - const CAlignOffsetAlloc *p = Z7_CONTAINER_FROM_VTBL_CONST(pp, CAlignOffsetAlloc, vt); - PrintLn(); - Print("- Aligned Free: "); - PrintLn(); - ISzAlloc_Free(p->baseAlloc, REAL_BLOCK_PTR_VAR(address)); - } -} - - -void AlignOffsetAlloc_CreateVTable(CAlignOffsetAlloc *p) -{ - p->vt.Alloc = AlignOffsetAlloc_Alloc; - p->vt.Free = AlignOffsetAlloc_Free; -} +#endif diff --git a/extern/lzma/Alloc.h b/extern/lzma/Alloc.h index fac5b62fb9f..ff0669cad8d 100644 --- a/extern/lzma/Alloc.h +++ b/extern/lzma/Alloc.h @@ -1,32 +1,19 @@ /* Alloc.h -- Memory allocation functions -2023-03-04 : Igor Pavlov : Public domain */ +2008-03-13 +Igor Pavlov +Public domain */ -#ifndef ZIP7_INC_ALLOC_H -#define ZIP7_INC_ALLOC_H +#ifndef __COMMON_ALLOC_H +#define __COMMON_ALLOC_H -#include "7zTypes.h" - -EXTERN_C_BEGIN - -/* - MyFree(NULL) : is allowed, as free(NULL) - MyAlloc(0) : returns NULL : but malloc(0) is allowed to return NULL or non_NULL - MyRealloc(NULL, 0) : returns NULL : but realloc(NULL, 0) is allowed to return NULL or non_NULL -MyRealloc() is similar to realloc() for the following cases: - MyRealloc(non_NULL, 0) : returns NULL and always calls MyFree(ptr) - MyRealloc(NULL, non_ZERO) : returns NULL, if allocation failed - MyRealloc(non_NULL, non_ZERO) : returns NULL, if reallocation failed -*/ +#include void *MyAlloc(size_t size); void MyFree(void *address); -void *MyRealloc(void *address, size_t size); #ifdef _WIN32 -#ifdef Z7_LARGE_PAGES -void SetLargePageSize(void); -#endif +void SetLargePageSize(); void *MidAlloc(size_t size); void MidFree(void *address); @@ -42,30 +29,4 @@ void BigFree(void *address); #endif -extern const ISzAlloc g_Alloc; - -#ifdef _WIN32 -extern const ISzAlloc g_BigAlloc; -extern const ISzAlloc g_MidAlloc; -#else -#define g_BigAlloc g_AlignedAlloc -#define g_MidAlloc g_AlignedAlloc -#endif - -extern const ISzAlloc g_AlignedAlloc; - - -typedef struct -{ - ISzAlloc vt; - ISzAllocPtr baseAlloc; - unsigned numAlignBits; /* ((1 << numAlignBits) >= sizeof(void *)) */ - size_t offset; /* (offset == (k * sizeof(void *)) && offset < (1 << numAlignBits) */ -} CAlignOffsetAlloc; - -void AlignOffsetAlloc_CreateVTable(CAlignOffsetAlloc *p); - - -EXTERN_C_END - #endif diff --git a/extern/lzma/CMakeLists.txt b/extern/lzma/CMakeLists.txt index fdee58401df..aa2a0e7d7fa 100644 --- a/extern/lzma/CMakeLists.txt +++ b/extern/lzma/CMakeLists.txt @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2024 Blender Foundation +# SPDX-FileCopyrightText: 2006 Blender Foundation # # SPDX-License-Identifier: GPL-2.0-or-later @@ -19,28 +19,18 @@ set(INC_SYS set(SRC Alloc.c - CpuArch.c LzFind.c - LzFindMt.c - LzFindOpt.c LzmaDec.c LzmaEnc.c LzmaLib.c - Threads.c - 7zTypes.h - 7zWindows.h Alloc.h - Compiler.h - CpuArch.h LzFind.h - LzFindMt.h LzHash.h LzmaDec.h LzmaEnc.h LzmaLib.h - Precomp.h - Threads.h + Types.h ) set(LIB diff --git a/extern/lzma/Compiler.h b/extern/lzma/Compiler.h deleted file mode 100644 index 185a52deb50..00000000000 --- a/extern/lzma/Compiler.h +++ /dev/null @@ -1,159 +0,0 @@ -/* Compiler.h : Compiler specific defines and pragmas -2023-04-02 : Igor Pavlov : Public domain */ - -#ifndef ZIP7_INC_COMPILER_H -#define ZIP7_INC_COMPILER_H - -#if defined(__clang__) -# define Z7_CLANG_VERSION (__clang_major__ * 10000 + __clang_minor__ * 100 + __clang_patchlevel__) -#endif -#if defined(__clang__) && defined(__apple_build_version__) -# define Z7_APPLE_CLANG_VERSION Z7_CLANG_VERSION -#elif defined(__clang__) -# define Z7_LLVM_CLANG_VERSION Z7_CLANG_VERSION -#elif defined(__GNUC__) -# define Z7_GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) -#endif - -#ifdef _MSC_VER -#if !defined(__clang__) && !defined(__GNUC__) -#define Z7_MSC_VER_ORIGINAL _MSC_VER -#endif -#endif - -#if defined(__MINGW32__) || defined(__MINGW64__) -#define Z7_MINGW -#endif - -// #pragma GCC diagnostic ignored "-Wunknown-pragmas" - -#ifdef __clang__ -// padding size of '' with 4 bytes to alignment boundary -#pragma GCC diagnostic ignored "-Wpadded" -#endif - - -#ifdef _MSC_VER - - #ifdef UNDER_CE - #define RPC_NO_WINDOWS_H - /* #pragma warning(disable : 4115) // '_RPC_ASYNC_STATE' : named type definition in parentheses */ - #pragma warning(disable : 4201) // nonstandard extension used : nameless struct/union - #pragma warning(disable : 4214) // nonstandard extension used : bit field types other than int - #endif - -#if defined(_MSC_VER) && _MSC_VER >= 1800 -#pragma warning(disable : 4464) // relative include path contains '..' -#endif - -// == 1200 : -O1 : for __forceinline -// >= 1900 : -O1 : for printf -#pragma warning(disable : 4710) // function not inlined - -#if _MSC_VER < 1900 -// winnt.h: 'Int64ShllMod32' -#pragma warning(disable : 4514) // unreferenced inline function has been removed -#endif - -#if _MSC_VER < 1300 -// #pragma warning(disable : 4702) // unreachable code -// Bra.c : -O1: -#pragma warning(disable : 4714) // function marked as __forceinline not inlined -#endif - -/* -#if _MSC_VER > 1400 && _MSC_VER <= 1900 -// strcat: This function or variable may be unsafe -// sysinfoapi.h: kit10: GetVersion was declared deprecated -#pragma warning(disable : 4996) -#endif -*/ - -#if _MSC_VER > 1200 -// -Wall warnings - -#pragma warning(disable : 4711) // function selected for automatic inline expansion -#pragma warning(disable : 4820) // '2' bytes padding added after data member - -#if _MSC_VER >= 1400 && _MSC_VER < 1920 -// 1400: string.h: _DBG_MEMCPY_INLINE_ -// 1600 - 191x : smmintrin.h __cplusplus' -// is not defined as a preprocessor macro, replacing with '0' for '#if/#elif' -#pragma warning(disable : 4668) - -// 1400 - 1600 : WinDef.h : 'FARPROC' : -// 1900 - 191x : immintrin.h: _readfsbase_u32 -// no function prototype given : converting '()' to '(void)' -#pragma warning(disable : 4255) -#endif - -#if _MSC_VER >= 1914 -// Compiler will insert Spectre mitigation for memory load if /Qspectre switch specified -#pragma warning(disable : 5045) -#endif - -#endif // _MSC_VER > 1200 -#endif // _MSC_VER - - -#if defined(__clang__) && (__clang_major__ >= 4) - #define Z7_PRAGMA_OPT_DISABLE_LOOP_UNROLL_VECTORIZE \ - _Pragma("clang loop unroll(disable)") \ - _Pragma("clang loop vectorize(disable)") - #define Z7_ATTRIB_NO_VECTORIZE -#elif defined(__GNUC__) && (__GNUC__ >= 5) - #define Z7_ATTRIB_NO_VECTORIZE __attribute__((optimize("no-tree-vectorize"))) - // __attribute__((optimize("no-unroll-loops"))); - #define Z7_PRAGMA_OPT_DISABLE_LOOP_UNROLL_VECTORIZE -#elif defined(_MSC_VER) && (_MSC_VER >= 1920) - #define Z7_PRAGMA_OPT_DISABLE_LOOP_UNROLL_VECTORIZE \ - _Pragma("loop( no_vector )") - #define Z7_ATTRIB_NO_VECTORIZE -#else - #define Z7_PRAGMA_OPT_DISABLE_LOOP_UNROLL_VECTORIZE - #define Z7_ATTRIB_NO_VECTORIZE -#endif - -#if defined(MY_CPU_X86_OR_AMD64) && ( \ - defined(__clang__) && (__clang_major__ >= 4) \ - || defined(__GNUC__) && (__GNUC__ >= 5)) - #define Z7_ATTRIB_NO_SSE __attribute__((__target__("no-sse"))) -#else - #define Z7_ATTRIB_NO_SSE -#endif - -#define Z7_ATTRIB_NO_VECTOR \ - Z7_ATTRIB_NO_VECTORIZE \ - Z7_ATTRIB_NO_SSE - - -#if defined(__clang__) && (__clang_major__ >= 8) \ - || defined(__GNUC__) && (__GNUC__ >= 1000) \ - /* || defined(_MSC_VER) && (_MSC_VER >= 1920) */ - // GCC is not good for __builtin_expect() - #define Z7_LIKELY(x) (__builtin_expect((x), 1)) - #define Z7_UNLIKELY(x) (__builtin_expect((x), 0)) - // #define Z7_unlikely [[unlikely]] - // #define Z7_likely [[likely]] -#else - #define Z7_LIKELY(x) (x) - #define Z7_UNLIKELY(x) (x) - // #define Z7_likely -#endif - - -#if (defined(Z7_CLANG_VERSION) && (Z7_CLANG_VERSION >= 36000)) -#define Z7_DIAGNOSCTIC_IGNORE_BEGIN_RESERVED_MACRO_IDENTIFIER \ - _Pragma("GCC diagnostic push") \ - _Pragma("GCC diagnostic ignored \"-Wreserved-macro-identifier\"") -#define Z7_DIAGNOSCTIC_IGNORE_END_RESERVED_MACRO_IDENTIFIER \ - _Pragma("GCC diagnostic pop") -#else -#define Z7_DIAGNOSCTIC_IGNORE_BEGIN_RESERVED_MACRO_IDENTIFIER -#define Z7_DIAGNOSCTIC_IGNORE_END_RESERVED_MACRO_IDENTIFIER -#endif - -#define UNUSED_VAR(x) (void)x; -/* #define UNUSED_VAR(x) x=x; */ - -#endif diff --git a/extern/lzma/CpuArch.c b/extern/lzma/CpuArch.c deleted file mode 100644 index 33f8a3ab4c1..00000000000 --- a/extern/lzma/CpuArch.c +++ /dev/null @@ -1,823 +0,0 @@ -/* CpuArch.c -- CPU specific code -2023-05-18 : Igor Pavlov : Public domain */ - -#include "Precomp.h" - -// #include - -#include "CpuArch.h" - -#ifdef MY_CPU_X86_OR_AMD64 - -#undef NEED_CHECK_FOR_CPUID -#if !defined(MY_CPU_AMD64) -#define NEED_CHECK_FOR_CPUID -#endif - -/* - cpuid instruction supports (subFunction) parameter in ECX, - that is used only with some specific (function) parameter values. - But we always use only (subFunction==0). -*/ -/* - __cpuid(): MSVC and GCC/CLANG use same function/macro name - but parameters are different. - We use MSVC __cpuid() parameters style for our z7_x86_cpuid() function. -*/ - -#if defined(__GNUC__) /* && (__GNUC__ >= 10) */ \ - || defined(__clang__) /* && (__clang_major__ >= 10) */ - -/* there was some CLANG/GCC compilers that have issues with - rbx(ebx) handling in asm blocks in -fPIC mode (__PIC__ is defined). - compiler's contains the macro __cpuid() that is similar to our code. - The history of __cpuid() changes in CLANG/GCC: - GCC: - 2007: it preserved ebx for (__PIC__ && __i386__) - 2013: it preserved rbx and ebx for __PIC__ - 2014: it doesn't preserves rbx and ebx anymore - we suppose that (__GNUC__ >= 5) fixed that __PIC__ ebx/rbx problem. - CLANG: - 2014+: it preserves rbx, but only for 64-bit code. No __PIC__ check. - Why CLANG cares about 64-bit mode only, and doesn't care about ebx (in 32-bit)? - Do we need __PIC__ test for CLANG or we must care about rbx even if - __PIC__ is not defined? -*/ - -#define ASM_LN "\n" - -#if defined(MY_CPU_AMD64) && defined(__PIC__) \ - && ((defined (__GNUC__) && (__GNUC__ < 5)) || defined(__clang__)) - -#define x86_cpuid_MACRO(p, func) { \ - __asm__ __volatile__ ( \ - ASM_LN "mov %%rbx, %q1" \ - ASM_LN "cpuid" \ - ASM_LN "xchg %%rbx, %q1" \ - : "=a" ((p)[0]), "=&r" ((p)[1]), "=c" ((p)[2]), "=d" ((p)[3]) : "0" (func), "2"(0)); } - - /* "=&r" selects free register. It can select even rbx, if that register is free. - "=&D" for (RDI) also works, but the code can be larger with "=&D" - "2"(0) means (subFunction = 0), - 2 is (zero-based) index in the output constraint list "=c" (ECX). */ - -#elif defined(MY_CPU_X86) && defined(__PIC__) \ - && ((defined (__GNUC__) && (__GNUC__ < 5)) || defined(__clang__)) - -#define x86_cpuid_MACRO(p, func) { \ - __asm__ __volatile__ ( \ - ASM_LN "mov %%ebx, %k1" \ - ASM_LN "cpuid" \ - ASM_LN "xchg %%ebx, %k1" \ - : "=a" ((p)[0]), "=&r" ((p)[1]), "=c" ((p)[2]), "=d" ((p)[3]) : "0" (func), "2"(0)); } - -#else - -#define x86_cpuid_MACRO(p, func) { \ - __asm__ __volatile__ ( \ - ASM_LN "cpuid" \ - : "=a" ((p)[0]), "=b" ((p)[1]), "=c" ((p)[2]), "=d" ((p)[3]) : "0" (func), "2"(0)); } - -#endif - - -void Z7_FASTCALL z7_x86_cpuid(UInt32 p[4], UInt32 func) -{ - x86_cpuid_MACRO(p, func) -} - - -Z7_NO_INLINE -UInt32 Z7_FASTCALL z7_x86_cpuid_GetMaxFunc(void) -{ - #if defined(NEED_CHECK_FOR_CPUID) - #define EFALGS_CPUID_BIT 21 - UInt32 a; - __asm__ __volatile__ ( - ASM_LN "pushf" - ASM_LN "pushf" - ASM_LN "pop %0" - // ASM_LN "movl %0, %1" - // ASM_LN "xorl $0x200000, %0" - ASM_LN "btc %1, %0" - ASM_LN "push %0" - ASM_LN "popf" - ASM_LN "pushf" - ASM_LN "pop %0" - ASM_LN "xorl (%%esp), %0" - - ASM_LN "popf" - ASM_LN - : "=&r" (a) // "=a" - : "i" (EFALGS_CPUID_BIT) - ); - if ((a & (1 << EFALGS_CPUID_BIT)) == 0) - return 0; - #endif - { - UInt32 p[4]; - x86_cpuid_MACRO(p, 0) - return p[0]; - } -} - -#undef ASM_LN - -#elif !defined(_MSC_VER) - -/* -// for gcc/clang and other: we can try to use __cpuid macro: -#include -void Z7_FASTCALL z7_x86_cpuid(UInt32 p[4], UInt32 func) -{ - __cpuid(func, p[0], p[1], p[2], p[3]); -} -UInt32 Z7_FASTCALL z7_x86_cpuid_GetMaxFunc(void) -{ - return (UInt32)__get_cpuid_max(0, NULL); -} -*/ -// for unsupported cpuid: -void Z7_FASTCALL z7_x86_cpuid(UInt32 p[4], UInt32 func) -{ - UNUSED_VAR(func) - p[0] = p[1] = p[2] = p[3] = 0; -} -UInt32 Z7_FASTCALL z7_x86_cpuid_GetMaxFunc(void) -{ - return 0; -} - -#else // _MSC_VER - -#if !defined(MY_CPU_AMD64) - -UInt32 __declspec(naked) Z7_FASTCALL z7_x86_cpuid_GetMaxFunc(void) -{ - #if defined(NEED_CHECK_FOR_CPUID) - #define EFALGS_CPUID_BIT 21 - __asm pushfd - __asm pushfd - /* - __asm pop eax - // __asm mov edx, eax - __asm btc eax, EFALGS_CPUID_BIT - __asm push eax - */ - __asm btc dword ptr [esp], EFALGS_CPUID_BIT - __asm popfd - __asm pushfd - __asm pop eax - // __asm xor eax, edx - __asm xor eax, [esp] - // __asm push edx - __asm popfd - __asm and eax, (1 shl EFALGS_CPUID_BIT) - __asm jz end_func - #endif - __asm push ebx - __asm xor eax, eax // func - __asm xor ecx, ecx // subFunction (optional) for (func == 0) - __asm cpuid - __asm pop ebx - #if defined(NEED_CHECK_FOR_CPUID) - end_func: - #endif - __asm ret 0 -} - -void __declspec(naked) Z7_FASTCALL z7_x86_cpuid(UInt32 p[4], UInt32 func) -{ - UNUSED_VAR(p) - UNUSED_VAR(func) - __asm push ebx - __asm push edi - __asm mov edi, ecx // p - __asm mov eax, edx // func - __asm xor ecx, ecx // subfunction (optional) for (func == 0) - __asm cpuid - __asm mov [edi ], eax - __asm mov [edi + 4], ebx - __asm mov [edi + 8], ecx - __asm mov [edi + 12], edx - __asm pop edi - __asm pop ebx - __asm ret 0 -} - -#else // MY_CPU_AMD64 - - #if _MSC_VER >= 1600 - #include - #define MY_cpuidex __cpuidex - #else -/* - __cpuid (func == (0 or 7)) requires subfunction number in ECX. - MSDN: The __cpuid intrinsic clears the ECX register before calling the cpuid instruction. - __cpuid() in new MSVC clears ECX. - __cpuid() in old MSVC (14.00) x64 doesn't clear ECX - We still can use __cpuid for low (func) values that don't require ECX, - but __cpuid() in old MSVC will be incorrect for some func values: (func == 7). - So here we use the hack for old MSVC to send (subFunction) in ECX register to cpuid instruction, - where ECX value is first parameter for FASTCALL / NO_INLINE func, - So the caller of MY_cpuidex_HACK() sets ECX as subFunction, and - old MSVC for __cpuid() doesn't change ECX and cpuid instruction gets (subFunction) value. - -DON'T remove Z7_NO_INLINE and Z7_FASTCALL for MY_cpuidex_HACK(): !!! -*/ -static -Z7_NO_INLINE void Z7_FASTCALL MY_cpuidex_HACK(UInt32 subFunction, UInt32 func, int *CPUInfo) -{ - UNUSED_VAR(subFunction) - __cpuid(CPUInfo, func); -} - #define MY_cpuidex(info, func, func2) MY_cpuidex_HACK(func2, func, info) - #pragma message("======== MY_cpuidex_HACK WAS USED ========") - #endif // _MSC_VER >= 1600 - -#if !defined(MY_CPU_AMD64) -/* inlining for __cpuid() in MSVC x86 (32-bit) produces big ineffective code, - so we disable inlining here */ -Z7_NO_INLINE -#endif -void Z7_FASTCALL z7_x86_cpuid(UInt32 p[4], UInt32 func) -{ - MY_cpuidex((int *)p, (int)func, 0); -} - -Z7_NO_INLINE -UInt32 Z7_FASTCALL z7_x86_cpuid_GetMaxFunc(void) -{ - int a[4]; - MY_cpuidex(a, 0, 0); - return a[0]; -} - -#endif // MY_CPU_AMD64 -#endif // _MSC_VER - -#if defined(NEED_CHECK_FOR_CPUID) -#define CHECK_CPUID_IS_SUPPORTED { if (z7_x86_cpuid_GetMaxFunc() == 0) return 0; } -#else -#define CHECK_CPUID_IS_SUPPORTED -#endif -#undef NEED_CHECK_FOR_CPUID - - -static -BoolInt x86cpuid_Func_1(UInt32 *p) -{ - CHECK_CPUID_IS_SUPPORTED - z7_x86_cpuid(p, 1); - return True; -} - -/* -static const UInt32 kVendors[][1] = -{ - { 0x756E6547 }, // , 0x49656E69, 0x6C65746E }, - { 0x68747541 }, // , 0x69746E65, 0x444D4163 }, - { 0x746E6543 } // , 0x48727561, 0x736C7561 } -}; -*/ - -/* -typedef struct -{ - UInt32 maxFunc; - UInt32 vendor[3]; - UInt32 ver; - UInt32 b; - UInt32 c; - UInt32 d; -} Cx86cpuid; - -enum -{ - CPU_FIRM_INTEL, - CPU_FIRM_AMD, - CPU_FIRM_VIA -}; -int x86cpuid_GetFirm(const Cx86cpuid *p); -#define x86cpuid_ver_GetFamily(ver) (((ver >> 16) & 0xff0) | ((ver >> 8) & 0xf)) -#define x86cpuid_ver_GetModel(ver) (((ver >> 12) & 0xf0) | ((ver >> 4) & 0xf)) -#define x86cpuid_ver_GetStepping(ver) (ver & 0xf) - -int x86cpuid_GetFirm(const Cx86cpuid *p) -{ - unsigned i; - for (i = 0; i < sizeof(kVendors) / sizeof(kVendors[0]); i++) - { - const UInt32 *v = kVendors[i]; - if (v[0] == p->vendor[0] - // && v[1] == p->vendor[1] - // && v[2] == p->vendor[2] - ) - return (int)i; - } - return -1; -} - -BoolInt CPU_Is_InOrder() -{ - Cx86cpuid p; - UInt32 family, model; - if (!x86cpuid_CheckAndRead(&p)) - return True; - - family = x86cpuid_ver_GetFamily(p.ver); - model = x86cpuid_ver_GetModel(p.ver); - - switch (x86cpuid_GetFirm(&p)) - { - case CPU_FIRM_INTEL: return (family < 6 || (family == 6 && ( - // In-Order Atom CPU - model == 0x1C // 45 nm, N4xx, D4xx, N5xx, D5xx, 230, 330 - || model == 0x26 // 45 nm, Z6xx - || model == 0x27 // 32 nm, Z2460 - || model == 0x35 // 32 nm, Z2760 - || model == 0x36 // 32 nm, N2xxx, D2xxx - ))); - case CPU_FIRM_AMD: return (family < 5 || (family == 5 && (model < 6 || model == 0xA))); - case CPU_FIRM_VIA: return (family < 6 || (family == 6 && model < 0xF)); - } - return False; // v23 : unknown processors are not In-Order -} -*/ - -#ifdef _WIN32 -#include "7zWindows.h" -#endif - -#if !defined(MY_CPU_AMD64) && defined(_WIN32) - -/* for legacy SSE ia32: there is no user-space cpu instruction to check - that OS supports SSE register storing/restoring on context switches. - So we need some OS-specific function to check that it's safe to use SSE registers. -*/ - -Z7_FORCE_INLINE -static BoolInt CPU_Sys_Is_SSE_Supported(void) -{ -#ifdef _MSC_VER - #pragma warning(push) - #pragma warning(disable : 4996) // `GetVersion': was declared deprecated -#endif - /* low byte is major version of Windows - We suppose that any Windows version since - Windows2000 (major == 5) supports SSE registers */ - return (Byte)GetVersion() >= 5; -#if defined(_MSC_VER) - #pragma warning(pop) -#endif -} -#define CHECK_SYS_SSE_SUPPORT if (!CPU_Sys_Is_SSE_Supported()) return False; -#else -#define CHECK_SYS_SSE_SUPPORT -#endif - - -#if !defined(MY_CPU_AMD64) - -BoolInt CPU_IsSupported_CMOV(void) -{ - UInt32 a[4]; - if (!x86cpuid_Func_1(&a[0])) - return 0; - return (a[3] >> 15) & 1; -} - -BoolInt CPU_IsSupported_SSE(void) -{ - UInt32 a[4]; - CHECK_SYS_SSE_SUPPORT - if (!x86cpuid_Func_1(&a[0])) - return 0; - return (a[3] >> 25) & 1; -} - -BoolInt CPU_IsSupported_SSE2(void) -{ - UInt32 a[4]; - CHECK_SYS_SSE_SUPPORT - if (!x86cpuid_Func_1(&a[0])) - return 0; - return (a[3] >> 26) & 1; -} - -#endif - - -static UInt32 x86cpuid_Func_1_ECX(void) -{ - UInt32 a[4]; - CHECK_SYS_SSE_SUPPORT - if (!x86cpuid_Func_1(&a[0])) - return 0; - return a[2]; -} - -BoolInt CPU_IsSupported_AES(void) -{ - return (x86cpuid_Func_1_ECX() >> 25) & 1; -} - -BoolInt CPU_IsSupported_SSSE3(void) -{ - return (x86cpuid_Func_1_ECX() >> 9) & 1; -} - -BoolInt CPU_IsSupported_SSE41(void) -{ - return (x86cpuid_Func_1_ECX() >> 19) & 1; -} - -BoolInt CPU_IsSupported_SHA(void) -{ - CHECK_SYS_SSE_SUPPORT - - if (z7_x86_cpuid_GetMaxFunc() < 7) - return False; - { - UInt32 d[4]; - z7_x86_cpuid(d, 7); - return (d[1] >> 29) & 1; - } -} - -/* -MSVC: _xgetbv() intrinsic is available since VS2010SP1. - MSVC also defines (_XCR_XFEATURE_ENABLED_MASK) macro in - that we can use or check. - For any 32-bit x86 we can use asm code in MSVC, - but MSVC asm code is huge after compilation. - So _xgetbv() is better - -ICC: _xgetbv() intrinsic is available (in what version of ICC?) - ICC defines (__GNUC___) and it supports gnu assembler - also ICC supports MASM style code with -use-msasm switch. - but ICC doesn't support __attribute__((__target__)) - -GCC/CLANG 9: - _xgetbv() is macro that works via __builtin_ia32_xgetbv() - and we need __attribute__((__target__("xsave")). - But with __target__("xsave") the function will be not - inlined to function that has no __target__("xsave") attribute. - If we want _xgetbv() call inlining, then we should use asm version - instead of calling _xgetbv(). - Note:intrinsic is broke before GCC 8.2: - https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85684 -*/ - -#if defined(__INTEL_COMPILER) && (__INTEL_COMPILER >= 1100) \ - || defined(_MSC_VER) && (_MSC_VER >= 1600) && (_MSC_FULL_VER >= 160040219) \ - || defined(__GNUC__) && (__GNUC__ >= 9) \ - || defined(__clang__) && (__clang_major__ >= 9) -// we define ATTRIB_XGETBV, if we want to use predefined _xgetbv() from compiler -#if defined(__INTEL_COMPILER) -#define ATTRIB_XGETBV -#elif defined(__GNUC__) || defined(__clang__) -// we don't define ATTRIB_XGETBV here, because asm version is better for inlining. -// #define ATTRIB_XGETBV __attribute__((__target__("xsave"))) -#else -#define ATTRIB_XGETBV -#endif -#endif - -#if defined(ATTRIB_XGETBV) -#include -#endif - - -// XFEATURE_ENABLED_MASK/XCR0 -#define MY_XCR_XFEATURE_ENABLED_MASK 0 - -#if defined(ATTRIB_XGETBV) -ATTRIB_XGETBV -#endif -static UInt64 x86_xgetbv_0(UInt32 num) -{ -#if defined(ATTRIB_XGETBV) - { - return - #if (defined(_MSC_VER)) - _xgetbv(num); - #else - __builtin_ia32_xgetbv( - #if !defined(__clang__) - (int) - #endif - num); - #endif - } - -#elif defined(__GNUC__) || defined(__clang__) || defined(__SUNPRO_CC) - - UInt32 a, d; - #if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)) - __asm__ - ( - "xgetbv" - : "=a"(a), "=d"(d) : "c"(num) : "cc" - ); - #else // is old gcc - __asm__ - ( - ".byte 0x0f, 0x01, 0xd0" "\n\t" - : "=a"(a), "=d"(d) : "c"(num) : "cc" - ); - #endif - return ((UInt64)d << 32) | a; - // return a; - -#elif defined(_MSC_VER) && !defined(MY_CPU_AMD64) - - UInt32 a, d; - __asm { - push eax - push edx - push ecx - mov ecx, num; - // xor ecx, ecx // = MY_XCR_XFEATURE_ENABLED_MASK - _emit 0x0f - _emit 0x01 - _emit 0xd0 - mov a, eax - mov d, edx - pop ecx - pop edx - pop eax - } - return ((UInt64)d << 32) | a; - // return a; - -#else // it's unknown compiler - // #error "Need xgetbv function" - UNUSED_VAR(num) - // for MSVC-X64 we could call external function from external file. - /* Actually we had checked OSXSAVE/AVX in cpuid before. - So it's expected that OS supports at least AVX and below. */ - // if (num != MY_XCR_XFEATURE_ENABLED_MASK) return 0; // if not XCR0 - return - // (1 << 0) | // x87 - (1 << 1) // SSE - | (1 << 2); // AVX - -#endif -} - -#ifdef _WIN32 -/* - Windows versions do not know about new ISA extensions that - can be introduced. But we still can use new extensions, - even if Windows doesn't report about supporting them, - But we can use new extensions, only if Windows knows about new ISA extension - that changes the number or size of registers: SSE, AVX/XSAVE, AVX512 - So it's enough to check - MY_PF_AVX_INSTRUCTIONS_AVAILABLE - instead of - MY_PF_AVX2_INSTRUCTIONS_AVAILABLE -*/ -#define MY_PF_XSAVE_ENABLED 17 -// #define MY_PF_SSSE3_INSTRUCTIONS_AVAILABLE 36 -// #define MY_PF_SSE4_1_INSTRUCTIONS_AVAILABLE 37 -// #define MY_PF_SSE4_2_INSTRUCTIONS_AVAILABLE 38 -// #define MY_PF_AVX_INSTRUCTIONS_AVAILABLE 39 -// #define MY_PF_AVX2_INSTRUCTIONS_AVAILABLE 40 -// #define MY_PF_AVX512F_INSTRUCTIONS_AVAILABLE 41 -#endif - -BoolInt CPU_IsSupported_AVX(void) -{ - #ifdef _WIN32 - if (!IsProcessorFeaturePresent(MY_PF_XSAVE_ENABLED)) - return False; - /* PF_AVX_INSTRUCTIONS_AVAILABLE probably is supported starting from - some latest Win10 revisions. But we need AVX in older Windows also. - So we don't use the following check: */ - /* - if (!IsProcessorFeaturePresent(MY_PF_AVX_INSTRUCTIONS_AVAILABLE)) - return False; - */ - #endif - - /* - OS must use new special XSAVE/XRSTOR instructions to save - AVX registers when it required for context switching. - At OS statring: - OS sets CR4.OSXSAVE flag to signal the processor that OS supports the XSAVE extensions. - Also OS sets bitmask in XCR0 register that defines what - registers will be processed by XSAVE instruction: - XCR0.SSE[bit 0] - x87 registers and state - XCR0.SSE[bit 1] - SSE registers and state - XCR0.AVX[bit 2] - AVX registers and state - CR4.OSXSAVE is reflected to CPUID.1:ECX.OSXSAVE[bit 27]. - So we can read that bit in user-space. - XCR0 is available for reading in user-space by new XGETBV instruction. - */ - { - const UInt32 c = x86cpuid_Func_1_ECX(); - if (0 == (1 - & (c >> 28) // AVX instructions are supported by hardware - & (c >> 27))) // OSXSAVE bit: XSAVE and related instructions are enabled by OS. - return False; - } - - /* also we can check - CPUID.1:ECX.XSAVE [bit 26] : that shows that - XSAVE, XRESTOR, XSETBV, XGETBV instructions are supported by hardware. - But that check is redundant, because if OSXSAVE bit is set, then XSAVE is also set */ - - /* If OS have enabled XSAVE extension instructions (OSXSAVE == 1), - in most cases we expect that OS also will support storing/restoring - for AVX and SSE states at least. - But to be ensure for that we call user-space instruction - XGETBV(0) to get XCR0 value that contains bitmask that defines - what exact states(registers) OS have enabled for storing/restoring. - */ - - { - const UInt32 bm = (UInt32)x86_xgetbv_0(MY_XCR_XFEATURE_ENABLED_MASK); - // printf("\n=== XGetBV=%d\n", bm); - return 1 - & (bm >> 1) // SSE state is supported (set by OS) for storing/restoring - & (bm >> 2); // AVX state is supported (set by OS) for storing/restoring - } - // since Win7SP1: we can use GetEnabledXStateFeatures(); -} - - -BoolInt CPU_IsSupported_AVX2(void) -{ - if (!CPU_IsSupported_AVX()) - return False; - if (z7_x86_cpuid_GetMaxFunc() < 7) - return False; - { - UInt32 d[4]; - z7_x86_cpuid(d, 7); - // printf("\ncpuid(7): ebx=%8x ecx=%8x\n", d[1], d[2]); - return 1 - & (d[1] >> 5); // avx2 - } -} - -BoolInt CPU_IsSupported_VAES_AVX2(void) -{ - if (!CPU_IsSupported_AVX()) - return False; - if (z7_x86_cpuid_GetMaxFunc() < 7) - return False; - { - UInt32 d[4]; - z7_x86_cpuid(d, 7); - // printf("\ncpuid(7): ebx=%8x ecx=%8x\n", d[1], d[2]); - return 1 - & (d[1] >> 5) // avx2 - // & (d[1] >> 31) // avx512vl - & (d[2] >> 9); // vaes // VEX-256/EVEX - } -} - -BoolInt CPU_IsSupported_PageGB(void) -{ - CHECK_CPUID_IS_SUPPORTED - { - UInt32 d[4]; - z7_x86_cpuid(d, 0x80000000); - if (d[0] < 0x80000001) - return False; - z7_x86_cpuid(d, 0x80000001); - return (d[3] >> 26) & 1; - } -} - - -#elif defined(MY_CPU_ARM_OR_ARM64) - -#ifdef _WIN32 - -#include "7zWindows.h" - -BoolInt CPU_IsSupported_CRC32(void) { return IsProcessorFeaturePresent(PF_ARM_V8_CRC32_INSTRUCTIONS_AVAILABLE) ? 1 : 0; } -BoolInt CPU_IsSupported_CRYPTO(void) { return IsProcessorFeaturePresent(PF_ARM_V8_CRYPTO_INSTRUCTIONS_AVAILABLE) ? 1 : 0; } -BoolInt CPU_IsSupported_NEON(void) { return IsProcessorFeaturePresent(PF_ARM_NEON_INSTRUCTIONS_AVAILABLE) ? 1 : 0; } - -#else - -#if defined(__APPLE__) - -/* -#include -#include -static void Print_sysctlbyname(const char *name) -{ - size_t bufSize = 256; - char buf[256]; - int res = sysctlbyname(name, &buf, &bufSize, NULL, 0); - { - int i; - printf("\nres = %d : %s : '%s' : bufSize = %d, numeric", res, name, buf, (unsigned)bufSize); - for (i = 0; i < 20; i++) - printf(" %2x", (unsigned)(Byte)buf[i]); - - } -} -*/ -/* - Print_sysctlbyname("hw.pagesize"); - Print_sysctlbyname("machdep.cpu.brand_string"); -*/ - -static BoolInt z7_sysctlbyname_Get_BoolInt(const char *name) -{ - UInt32 val = 0; - if (z7_sysctlbyname_Get_UInt32(name, &val) == 0 && val == 1) - return 1; - return 0; -} - -BoolInt CPU_IsSupported_CRC32(void) -{ - return z7_sysctlbyname_Get_BoolInt("hw.optional.armv8_crc32"); -} - -BoolInt CPU_IsSupported_NEON(void) -{ - return z7_sysctlbyname_Get_BoolInt("hw.optional.neon"); -} - -#ifdef MY_CPU_ARM64 -#define APPLE_CRYPTO_SUPPORT_VAL 1 -#else -#define APPLE_CRYPTO_SUPPORT_VAL 0 -#endif - -BoolInt CPU_IsSupported_SHA1(void) { return APPLE_CRYPTO_SUPPORT_VAL; } -BoolInt CPU_IsSupported_SHA2(void) { return APPLE_CRYPTO_SUPPORT_VAL; } -BoolInt CPU_IsSupported_AES (void) { return APPLE_CRYPTO_SUPPORT_VAL; } - - -#else // __APPLE__ - -#include - -#define USE_HWCAP - -#ifdef USE_HWCAP - -#include - - #define MY_HWCAP_CHECK_FUNC_2(name1, name2) \ - BoolInt CPU_IsSupported_ ## name1() { return (getauxval(AT_HWCAP) & (HWCAP_ ## name2)) ? 1 : 0; } - -#ifdef MY_CPU_ARM64 - #define MY_HWCAP_CHECK_FUNC(name) \ - MY_HWCAP_CHECK_FUNC_2(name, name) - MY_HWCAP_CHECK_FUNC_2(NEON, ASIMD) -// MY_HWCAP_CHECK_FUNC (ASIMD) -#elif defined(MY_CPU_ARM) - #define MY_HWCAP_CHECK_FUNC(name) \ - BoolInt CPU_IsSupported_ ## name() { return (getauxval(AT_HWCAP2) & (HWCAP2_ ## name)) ? 1 : 0; } - MY_HWCAP_CHECK_FUNC_2(NEON, NEON) -#endif - -#else // USE_HWCAP - - #define MY_HWCAP_CHECK_FUNC(name) \ - BoolInt CPU_IsSupported_ ## name() { return 0; } - MY_HWCAP_CHECK_FUNC(NEON) - -#endif // USE_HWCAP - -MY_HWCAP_CHECK_FUNC (CRC32) -MY_HWCAP_CHECK_FUNC (SHA1) -MY_HWCAP_CHECK_FUNC (SHA2) -MY_HWCAP_CHECK_FUNC (AES) - -#endif // __APPLE__ -#endif // _WIN32 - -#endif // MY_CPU_ARM_OR_ARM64 - - - -#ifdef __APPLE__ - -#include - -int z7_sysctlbyname_Get(const char *name, void *buf, size_t *bufSize) -{ - return sysctlbyname(name, buf, bufSize, NULL, 0); -} - -int z7_sysctlbyname_Get_UInt32(const char *name, UInt32 *val) -{ - size_t bufSize = sizeof(*val); - const int res = z7_sysctlbyname_Get(name, val, &bufSize); - if (res == 0 && bufSize != sizeof(*val)) - return EFAULT; - return res; -} - -#endif diff --git a/extern/lzma/CpuArch.h b/extern/lzma/CpuArch.h deleted file mode 100644 index 8e5d8a543f8..00000000000 --- a/extern/lzma/CpuArch.h +++ /dev/null @@ -1,523 +0,0 @@ -/* CpuArch.h -- CPU specific code -2023-04-02 : Igor Pavlov : Public domain */ - -#ifndef ZIP7_INC_CPU_ARCH_H -#define ZIP7_INC_CPU_ARCH_H - -#include "7zTypes.h" - -EXTERN_C_BEGIN - -/* -MY_CPU_LE means that CPU is LITTLE ENDIAN. -MY_CPU_BE means that CPU is BIG ENDIAN. -If MY_CPU_LE and MY_CPU_BE are not defined, we don't know about ENDIANNESS of platform. - -MY_CPU_LE_UNALIGN means that CPU is LITTLE ENDIAN and CPU supports unaligned memory accesses. - -MY_CPU_64BIT means that processor can work with 64-bit registers. - MY_CPU_64BIT can be used to select fast code branch - MY_CPU_64BIT doesn't mean that (sizeof(void *) == 8) -*/ - -#if defined(_M_X64) \ - || defined(_M_AMD64) \ - || defined(__x86_64__) \ - || defined(__AMD64__) \ - || defined(__amd64__) - #define MY_CPU_AMD64 - #ifdef __ILP32__ - #define MY_CPU_NAME "x32" - #define MY_CPU_SIZEOF_POINTER 4 - #else - #define MY_CPU_NAME "x64" - #define MY_CPU_SIZEOF_POINTER 8 - #endif - #define MY_CPU_64BIT -#endif - - -#if defined(_M_IX86) \ - || defined(__i386__) - #define MY_CPU_X86 - #define MY_CPU_NAME "x86" - /* #define MY_CPU_32BIT */ - #define MY_CPU_SIZEOF_POINTER 4 -#endif - - -#if defined(_M_ARM64) \ - || defined(__AARCH64EL__) \ - || defined(__AARCH64EB__) \ - || defined(__aarch64__) - #define MY_CPU_ARM64 - #ifdef __ILP32__ - #define MY_CPU_NAME "arm64-32" - #define MY_CPU_SIZEOF_POINTER 4 - #else - #define MY_CPU_NAME "arm64" - #define MY_CPU_SIZEOF_POINTER 8 - #endif - #define MY_CPU_64BIT -#endif - - -#if defined(_M_ARM) \ - || defined(_M_ARM_NT) \ - || defined(_M_ARMT) \ - || defined(__arm__) \ - || defined(__thumb__) \ - || defined(__ARMEL__) \ - || defined(__ARMEB__) \ - || defined(__THUMBEL__) \ - || defined(__THUMBEB__) - #define MY_CPU_ARM - - #if defined(__thumb__) || defined(__THUMBEL__) || defined(_M_ARMT) - #define MY_CPU_ARMT - #define MY_CPU_NAME "armt" - #else - #define MY_CPU_ARM32 - #define MY_CPU_NAME "arm" - #endif - /* #define MY_CPU_32BIT */ - #define MY_CPU_SIZEOF_POINTER 4 -#endif - - -#if defined(_M_IA64) \ - || defined(__ia64__) - #define MY_CPU_IA64 - #define MY_CPU_NAME "ia64" - #define MY_CPU_64BIT -#endif - - -#if defined(__mips64) \ - || defined(__mips64__) \ - || (defined(__mips) && (__mips == 64 || __mips == 4 || __mips == 3)) - #define MY_CPU_NAME "mips64" - #define MY_CPU_64BIT -#elif defined(__mips__) - #define MY_CPU_NAME "mips" - /* #define MY_CPU_32BIT */ -#endif - - -#if defined(__ppc64__) \ - || defined(__powerpc64__) \ - || defined(__ppc__) \ - || defined(__powerpc__) \ - || defined(__PPC__) \ - || defined(_POWER) - -#define MY_CPU_PPC_OR_PPC64 - -#if defined(__ppc64__) \ - || defined(__powerpc64__) \ - || defined(_LP64) \ - || defined(__64BIT__) - #ifdef __ILP32__ - #define MY_CPU_NAME "ppc64-32" - #define MY_CPU_SIZEOF_POINTER 4 - #else - #define MY_CPU_NAME "ppc64" - #define MY_CPU_SIZEOF_POINTER 8 - #endif - #define MY_CPU_64BIT -#else - #define MY_CPU_NAME "ppc" - #define MY_CPU_SIZEOF_POINTER 4 - /* #define MY_CPU_32BIT */ -#endif -#endif - - -#if defined(__riscv) \ - || defined(__riscv__) - #if __riscv_xlen == 32 - #define MY_CPU_NAME "riscv32" - #elif __riscv_xlen == 64 - #define MY_CPU_NAME "riscv64" - #else - #define MY_CPU_NAME "riscv" - #endif -#endif - - -#if defined(MY_CPU_X86) || defined(MY_CPU_AMD64) -#define MY_CPU_X86_OR_AMD64 -#endif - -#if defined(MY_CPU_ARM) || defined(MY_CPU_ARM64) -#define MY_CPU_ARM_OR_ARM64 -#endif - - -#ifdef _WIN32 - - #ifdef MY_CPU_ARM - #define MY_CPU_ARM_LE - #endif - - #ifdef MY_CPU_ARM64 - #define MY_CPU_ARM64_LE - #endif - - #ifdef _M_IA64 - #define MY_CPU_IA64_LE - #endif - -#endif - - -#if defined(MY_CPU_X86_OR_AMD64) \ - || defined(MY_CPU_ARM_LE) \ - || defined(MY_CPU_ARM64_LE) \ - || defined(MY_CPU_IA64_LE) \ - || defined(__LITTLE_ENDIAN__) \ - || defined(__ARMEL__) \ - || defined(__THUMBEL__) \ - || defined(__AARCH64EL__) \ - || defined(__MIPSEL__) \ - || defined(__MIPSEL) \ - || defined(_MIPSEL) \ - || defined(__BFIN__) \ - || (defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)) - #define MY_CPU_LE -#endif - -#if defined(__BIG_ENDIAN__) \ - || defined(__ARMEB__) \ - || defined(__THUMBEB__) \ - || defined(__AARCH64EB__) \ - || defined(__MIPSEB__) \ - || defined(__MIPSEB) \ - || defined(_MIPSEB) \ - || defined(__m68k__) \ - || defined(__s390__) \ - || defined(__s390x__) \ - || defined(__zarch__) \ - || (defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)) - #define MY_CPU_BE -#endif - - -#if defined(MY_CPU_LE) && defined(MY_CPU_BE) - #error Stop_Compiling_Bad_Endian -#endif - -#if !defined(MY_CPU_LE) && !defined(MY_CPU_BE) - #error Stop_Compiling_CPU_ENDIAN_must_be_detected_at_compile_time -#endif - -#if defined(MY_CPU_32BIT) && defined(MY_CPU_64BIT) - #error Stop_Compiling_Bad_32_64_BIT -#endif - -#ifdef __SIZEOF_POINTER__ - #ifdef MY_CPU_SIZEOF_POINTER - #if MY_CPU_SIZEOF_POINTER != __SIZEOF_POINTER__ - #error Stop_Compiling_Bad_MY_CPU_PTR_SIZE - #endif - #else - #define MY_CPU_SIZEOF_POINTER __SIZEOF_POINTER__ - #endif -#endif - -#if defined(MY_CPU_SIZEOF_POINTER) && (MY_CPU_SIZEOF_POINTER == 4) -#if defined (_LP64) - #error Stop_Compiling_Bad_MY_CPU_PTR_SIZE -#endif -#endif - -#ifdef _MSC_VER - #if _MSC_VER >= 1300 - #define MY_CPU_pragma_pack_push_1 __pragma(pack(push, 1)) - #define MY_CPU_pragma_pop __pragma(pack(pop)) - #else - #define MY_CPU_pragma_pack_push_1 - #define MY_CPU_pragma_pop - #endif -#else - #ifdef __xlC__ - #define MY_CPU_pragma_pack_push_1 _Pragma("pack(1)") - #define MY_CPU_pragma_pop _Pragma("pack()") - #else - #define MY_CPU_pragma_pack_push_1 _Pragma("pack(push, 1)") - #define MY_CPU_pragma_pop _Pragma("pack(pop)") - #endif -#endif - - -#ifndef MY_CPU_NAME - #ifdef MY_CPU_LE - #define MY_CPU_NAME "LE" - #elif defined(MY_CPU_BE) - #define MY_CPU_NAME "BE" - #else - /* - #define MY_CPU_NAME "" - */ - #endif -#endif - - - - - -#ifdef __has_builtin - #define Z7_has_builtin(x) __has_builtin(x) -#else - #define Z7_has_builtin(x) 0 -#endif - - -#define Z7_BSWAP32_CONST(v) \ - ( (((UInt32)(v) << 24) ) \ - | (((UInt32)(v) << 8) & (UInt32)0xff0000) \ - | (((UInt32)(v) >> 8) & (UInt32)0xff00 ) \ - | (((UInt32)(v) >> 24) )) - - -#if defined(_MSC_VER) && (_MSC_VER >= 1300) - -#include - -/* Note: these macros will use bswap instruction (486), that is unsupported in 386 cpu */ - -#pragma intrinsic(_byteswap_ushort) -#pragma intrinsic(_byteswap_ulong) -#pragma intrinsic(_byteswap_uint64) - -#define Z7_BSWAP16(v) _byteswap_ushort(v) -#define Z7_BSWAP32(v) _byteswap_ulong (v) -#define Z7_BSWAP64(v) _byteswap_uint64(v) -#define Z7_CPU_FAST_BSWAP_SUPPORTED - -#elif (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3))) \ - || (defined(__clang__) && Z7_has_builtin(__builtin_bswap16)) - -#define Z7_BSWAP16(v) __builtin_bswap16(v) -#define Z7_BSWAP32(v) __builtin_bswap32(v) -#define Z7_BSWAP64(v) __builtin_bswap64(v) -#define Z7_CPU_FAST_BSWAP_SUPPORTED - -#else - -#define Z7_BSWAP16(v) ((UInt16) \ - ( ((UInt32)(v) << 8) \ - | ((UInt32)(v) >> 8) \ - )) - -#define Z7_BSWAP32(v) Z7_BSWAP32_CONST(v) - -#define Z7_BSWAP64(v) \ - ( ( ( (UInt64)(v) ) << 8 * 7 ) \ - | ( ( (UInt64)(v) & ((UInt32)0xff << 8 * 1) ) << 8 * 5 ) \ - | ( ( (UInt64)(v) & ((UInt32)0xff << 8 * 2) ) << 8 * 3 ) \ - | ( ( (UInt64)(v) & ((UInt32)0xff << 8 * 3) ) << 8 * 1 ) \ - | ( ( (UInt64)(v) >> 8 * 1 ) & ((UInt32)0xff << 8 * 3) ) \ - | ( ( (UInt64)(v) >> 8 * 3 ) & ((UInt32)0xff << 8 * 2) ) \ - | ( ( (UInt64)(v) >> 8 * 5 ) & ((UInt32)0xff << 8 * 1) ) \ - | ( ( (UInt64)(v) >> 8 * 7 ) ) \ - ) - -#endif - - - -#ifdef MY_CPU_LE - #if defined(MY_CPU_X86_OR_AMD64) \ - || defined(MY_CPU_ARM64) - #define MY_CPU_LE_UNALIGN - #define MY_CPU_LE_UNALIGN_64 - #elif defined(__ARM_FEATURE_UNALIGNED) - /* gcc9 for 32-bit arm can use LDRD instruction that requires 32-bit alignment. - So we can't use unaligned 64-bit operations. */ - #define MY_CPU_LE_UNALIGN - #endif -#endif - - -#ifdef MY_CPU_LE_UNALIGN - -#define GetUi16(p) (*(const UInt16 *)(const void *)(p)) -#define GetUi32(p) (*(const UInt32 *)(const void *)(p)) -#ifdef MY_CPU_LE_UNALIGN_64 -#define GetUi64(p) (*(const UInt64 *)(const void *)(p)) -#define SetUi64(p, v) { *(UInt64 *)(void *)(p) = (v); } -#endif - -#define SetUi16(p, v) { *(UInt16 *)(void *)(p) = (v); } -#define SetUi32(p, v) { *(UInt32 *)(void *)(p) = (v); } - -#else - -#define GetUi16(p) ( (UInt16) ( \ - ((const Byte *)(p))[0] | \ - ((UInt16)((const Byte *)(p))[1] << 8) )) - -#define GetUi32(p) ( \ - ((const Byte *)(p))[0] | \ - ((UInt32)((const Byte *)(p))[1] << 8) | \ - ((UInt32)((const Byte *)(p))[2] << 16) | \ - ((UInt32)((const Byte *)(p))[3] << 24)) - -#define SetUi16(p, v) { Byte *_ppp_ = (Byte *)(p); UInt32 _vvv_ = (v); \ - _ppp_[0] = (Byte)_vvv_; \ - _ppp_[1] = (Byte)(_vvv_ >> 8); } - -#define SetUi32(p, v) { Byte *_ppp_ = (Byte *)(p); UInt32 _vvv_ = (v); \ - _ppp_[0] = (Byte)_vvv_; \ - _ppp_[1] = (Byte)(_vvv_ >> 8); \ - _ppp_[2] = (Byte)(_vvv_ >> 16); \ - _ppp_[3] = (Byte)(_vvv_ >> 24); } - -#endif - - -#ifndef GetUi64 -#define GetUi64(p) (GetUi32(p) | ((UInt64)GetUi32(((const Byte *)(p)) + 4) << 32)) -#endif - -#ifndef SetUi64 -#define SetUi64(p, v) { Byte *_ppp2_ = (Byte *)(p); UInt64 _vvv2_ = (v); \ - SetUi32(_ppp2_ , (UInt32)_vvv2_) \ - SetUi32(_ppp2_ + 4, (UInt32)(_vvv2_ >> 32)) } -#endif - - -#if defined(MY_CPU_LE_UNALIGN) && defined(Z7_CPU_FAST_BSWAP_SUPPORTED) - -#define GetBe32(p) Z7_BSWAP32 (*(const UInt32 *)(const void *)(p)) -#define SetBe32(p, v) { (*(UInt32 *)(void *)(p)) = Z7_BSWAP32(v); } - -#if defined(MY_CPU_LE_UNALIGN_64) -#define GetBe64(p) Z7_BSWAP64 (*(const UInt64 *)(const void *)(p)) -#endif - -#else - -#define GetBe32(p) ( \ - ((UInt32)((const Byte *)(p))[0] << 24) | \ - ((UInt32)((const Byte *)(p))[1] << 16) | \ - ((UInt32)((const Byte *)(p))[2] << 8) | \ - ((const Byte *)(p))[3] ) - -#define SetBe32(p, v) { Byte *_ppp_ = (Byte *)(p); UInt32 _vvv_ = (v); \ - _ppp_[0] = (Byte)(_vvv_ >> 24); \ - _ppp_[1] = (Byte)(_vvv_ >> 16); \ - _ppp_[2] = (Byte)(_vvv_ >> 8); \ - _ppp_[3] = (Byte)_vvv_; } - -#endif - -#ifndef GetBe64 -#define GetBe64(p) (((UInt64)GetBe32(p) << 32) | GetBe32(((const Byte *)(p)) + 4)) -#endif - -#ifndef GetBe16 -#define GetBe16(p) ( (UInt16) ( \ - ((UInt16)((const Byte *)(p))[0] << 8) | \ - ((const Byte *)(p))[1] )) -#endif - - -#if defined(MY_CPU_BE) -#define Z7_CONV_BE_TO_NATIVE_CONST32(v) (v) -#define Z7_CONV_LE_TO_NATIVE_CONST32(v) Z7_BSWAP32_CONST(v) -#define Z7_CONV_NATIVE_TO_BE_32(v) (v) -#elif defined(MY_CPU_LE) -#define Z7_CONV_BE_TO_NATIVE_CONST32(v) Z7_BSWAP32_CONST(v) -#define Z7_CONV_LE_TO_NATIVE_CONST32(v) (v) -#define Z7_CONV_NATIVE_TO_BE_32(v) Z7_BSWAP32(v) -#else -#error Stop_Compiling_Unknown_Endian_CONV -#endif - - -#if defined(MY_CPU_BE) - -#define GetBe32a(p) (*(const UInt32 *)(const void *)(p)) -#define GetBe16a(p) (*(const UInt16 *)(const void *)(p)) -#define SetBe32a(p, v) { *(UInt32 *)(void *)(p) = (v); } -#define SetBe16a(p, v) { *(UInt16 *)(void *)(p) = (v); } - -#define GetUi32a(p) GetUi32(p) -#define GetUi16a(p) GetUi16(p) -#define SetUi32a(p, v) SetUi32(p, v) -#define SetUi16a(p, v) SetUi16(p, v) - -#elif defined(MY_CPU_LE) - -#define GetUi32a(p) (*(const UInt32 *)(const void *)(p)) -#define GetUi16a(p) (*(const UInt16 *)(const void *)(p)) -#define SetUi32a(p, v) { *(UInt32 *)(void *)(p) = (v); } -#define SetUi16a(p, v) { *(UInt16 *)(void *)(p) = (v); } - -#define GetBe32a(p) GetBe32(p) -#define GetBe16a(p) GetBe16(p) -#define SetBe32a(p, v) SetBe32(p, v) -#define SetBe16a(p, v) SetBe16(p, v) - -#else -#error Stop_Compiling_Unknown_Endian_CPU_a -#endif - - -#if defined(MY_CPU_X86_OR_AMD64) \ - || defined(MY_CPU_ARM_OR_ARM64) \ - || defined(MY_CPU_PPC_OR_PPC64) - #define Z7_CPU_FAST_ROTATE_SUPPORTED -#endif - - -#ifdef MY_CPU_X86_OR_AMD64 - -void Z7_FASTCALL z7_x86_cpuid(UInt32 a[4], UInt32 function); -UInt32 Z7_FASTCALL z7_x86_cpuid_GetMaxFunc(void); -#if defined(MY_CPU_AMD64) -#define Z7_IF_X86_CPUID_SUPPORTED -#else -#define Z7_IF_X86_CPUID_SUPPORTED if (z7_x86_cpuid_GetMaxFunc()) -#endif - -BoolInt CPU_IsSupported_AES(void); -BoolInt CPU_IsSupported_AVX(void); -BoolInt CPU_IsSupported_AVX2(void); -BoolInt CPU_IsSupported_VAES_AVX2(void); -BoolInt CPU_IsSupported_CMOV(void); -BoolInt CPU_IsSupported_SSE(void); -BoolInt CPU_IsSupported_SSE2(void); -BoolInt CPU_IsSupported_SSSE3(void); -BoolInt CPU_IsSupported_SSE41(void); -BoolInt CPU_IsSupported_SHA(void); -BoolInt CPU_IsSupported_PageGB(void); - -#elif defined(MY_CPU_ARM_OR_ARM64) - -BoolInt CPU_IsSupported_CRC32(void); -BoolInt CPU_IsSupported_NEON(void); - -#if defined(_WIN32) -BoolInt CPU_IsSupported_CRYPTO(void); -#define CPU_IsSupported_SHA1 CPU_IsSupported_CRYPTO -#define CPU_IsSupported_SHA2 CPU_IsSupported_CRYPTO -#define CPU_IsSupported_AES CPU_IsSupported_CRYPTO -#else -BoolInt CPU_IsSupported_SHA1(void); -BoolInt CPU_IsSupported_SHA2(void); -BoolInt CPU_IsSupported_AES(void); -#endif - -#endif - -#if defined(__APPLE__) -int z7_sysctlbyname_Get(const char *name, void *buf, size_t *bufSize); -int z7_sysctlbyname_Get_UInt32(const char *name, UInt32 *val); -#endif - -EXTERN_C_END - -#endif diff --git a/extern/lzma/LzFind.c b/extern/lzma/LzFind.c index 0fbd5aae563..34f4f09ea58 100644 --- a/extern/lzma/LzFind.c +++ b/extern/lzma/LzFind.c @@ -1,166 +1,70 @@ /* LzFind.c -- Match finder for LZ algorithms -2023-03-14 : Igor Pavlov : Public domain */ - -#include "Precomp.h" +2008-10-04 : Igor Pavlov : Public domain */ #include -// #include -#include "CpuArch.h" #include "LzFind.h" #include "LzHash.h" -#define kBlockMoveAlign (1 << 7) // alignment for memmove() -#define kBlockSizeAlign (1 << 16) // alignment for block allocation -#define kBlockSizeReserveMin (1 << 24) // it's 1/256 from 4 GB dictinary - #define kEmptyHashValue 0 +#define kMaxValForNormalize ((UInt32)0xFFFFFFFF) +#define kNormalizeStepMin (1 << 10) /* it must be power of 2 */ +#define kNormalizeMask (~(kNormalizeStepMin - 1)) +#define kMaxHistorySize ((UInt32)3 << 30) -#define kMaxValForNormalize ((UInt32)0) -// #define kMaxValForNormalize ((UInt32)(1 << 20) + 0xfff) // for debug +#define kStartMaxLen 3 -// #define kNormalizeAlign (1 << 7) // alignment for speculated accesses - -#define GET_AVAIL_BYTES(p) \ - Inline_MatchFinder_GetNumAvailableBytes(p) - - -// #define kFix5HashSize (kHash2Size + kHash3Size + kHash4Size) -#define kFix5HashSize kFix4HashSize - -/* - HASH2_CALC: - if (hv) match, then cur[0] and cur[1] also match -*/ -#define HASH2_CALC hv = GetUi16(cur); - -// (crc[0 ... 255] & 0xFF) provides one-to-one correspondence to [0 ... 255] - -/* - HASH3_CALC: - if (cur[0]) and (h2) match, then cur[1] also match - if (cur[0]) and (hv) match, then cur[1] and cur[2] also match -*/ -#define HASH3_CALC { \ - UInt32 temp = p->crc[cur[0]] ^ cur[1]; \ - h2 = temp & (kHash2Size - 1); \ - hv = (temp ^ ((UInt32)cur[2] << 8)) & p->hashMask; } - -#define HASH4_CALC { \ - UInt32 temp = p->crc[cur[0]] ^ cur[1]; \ - h2 = temp & (kHash2Size - 1); \ - temp ^= ((UInt32)cur[2] << 8); \ - h3 = temp & (kHash3Size - 1); \ - hv = (temp ^ (p->crc[cur[3]] << kLzHash_CrcShift_1)) & p->hashMask; } - -#define HASH5_CALC { \ - UInt32 temp = p->crc[cur[0]] ^ cur[1]; \ - h2 = temp & (kHash2Size - 1); \ - temp ^= ((UInt32)cur[2] << 8); \ - h3 = temp & (kHash3Size - 1); \ - temp ^= (p->crc[cur[3]] << kLzHash_CrcShift_1); \ - /* h4 = temp & p->hash4Mask; */ /* (kHash4Size - 1); */ \ - hv = (temp ^ (p->crc[cur[4]] << kLzHash_CrcShift_2)) & p->hashMask; } - -#define HASH_ZIP_CALC hv = ((cur[2] | ((UInt32)cur[0] << 8)) ^ p->crc[cur[1]]) & 0xFFFF; - - -static void LzInWindow_Free(CMatchFinder *p, ISzAllocPtr alloc) +static void LzInWindow_Free(CMatchFinder *p, ISzAlloc *alloc) { - // if (!p->directInput) + if (!p->directInput) { - ISzAlloc_Free(alloc, p->bufBase); - p->bufBase = NULL; + alloc->Free(alloc, p->bufferBase); + p->bufferBase = 0; } } +/* keepSizeBefore + keepSizeAfter + keepSizeReserv must be < 4G) */ -static int LzInWindow_Create2(CMatchFinder *p, UInt32 blockSize, ISzAllocPtr alloc) +static int LzInWindow_Create(CMatchFinder *p, UInt32 keepSizeReserv, ISzAlloc *alloc) { - if (blockSize == 0) - return 0; - if (!p->bufBase || p->blockSize != blockSize) + UInt32 blockSize = p->keepSizeBefore + p->keepSizeAfter + keepSizeReserv; + if (p->directInput) + { + p->blockSize = blockSize; + return 1; + } + if (p->bufferBase == 0 || p->blockSize != blockSize) { - // size_t blockSizeT; LzInWindow_Free(p, alloc); p->blockSize = blockSize; - // blockSizeT = blockSize; - - // printf("\nblockSize = 0x%x\n", blockSize); - /* - #if defined _WIN64 - // we can allocate 4GiB, but still use UInt32 for (p->blockSize) - // we use UInt32 type for (p->blockSize), because - // we don't want to wrap over 4 GiB, - // when we use (p->streamPos - p->pos) that is UInt32. - if (blockSize >= (UInt32)0 - (UInt32)kBlockSizeAlign) - { - blockSizeT = ((size_t)1 << 32); - printf("\nchanged to blockSizeT = 4GiB\n"); - } - #endif - */ - - p->bufBase = (Byte *)ISzAlloc_Alloc(alloc, blockSize); - // printf("\nbufferBase = %p\n", p->bufBase); - // return 0; // for debug + p->bufferBase = (Byte *)alloc->Alloc(alloc, (size_t)blockSize); } - return (p->bufBase != NULL); + return (p->bufferBase != 0); } -static const Byte *MatchFinder_GetPointerToCurrentPos(CMatchFinder *p) { return p->buffer; } +Byte *MatchFinder_GetPointerToCurrentPos(CMatchFinder *p) { return p->buffer; } +Byte MatchFinder_GetIndexByte(CMatchFinder *p, Int32 index) { return p->buffer[index]; } -static UInt32 MatchFinder_GetNumAvailableBytes(CMatchFinder *p) { return GET_AVAIL_BYTES(p); } +UInt32 MatchFinder_GetNumAvailableBytes(CMatchFinder *p) { return p->streamPos - p->pos; } +void MatchFinder_ReduceOffsets(CMatchFinder *p, UInt32 subValue) +{ + p->posLimit -= subValue; + p->pos -= subValue; + p->streamPos -= subValue; +} -Z7_NO_INLINE static void MatchFinder_ReadBlock(CMatchFinder *p) { if (p->streamEndWasReached || p->result != SZ_OK) return; - - /* We use (p->streamPos - p->pos) value. - (p->streamPos < p->pos) is allowed. */ - - if (p->directInput) - { - UInt32 curSize = 0xFFFFFFFF - GET_AVAIL_BYTES(p); - if (curSize > p->directInputRem) - curSize = (UInt32)p->directInputRem; - p->streamPos += curSize; - p->directInputRem -= curSize; - if (p->directInputRem == 0) - p->streamEndWasReached = 1; - return; - } - for (;;) { - const Byte *dest = p->buffer + GET_AVAIL_BYTES(p); - size_t size = (size_t)(p->bufBase + p->blockSize - dest); + Byte *dest = p->buffer + (p->streamPos - p->pos); + size_t size = (p->bufferBase + p->blockSize - dest); if (size == 0) - { - /* we call ReadBlock() after NeedMove() and MoveBlock(). - NeedMove() and MoveBlock() povide more than (keepSizeAfter) - to the end of (blockSize). - So we don't execute this branch in normal code flow. - We can go here, if we will call ReadBlock() before NeedMove(), MoveBlock(). - */ - // p->result = SZ_ERROR_FAIL; // we can show error here return; - } - - // #define kRead 3 - // if (size > kRead) size = kRead; // for debug - - /* - // we need cast (Byte *)dest. - #ifdef __clang__ - #pragma GCC diagnostic ignored "-Wcast-qual" - #endif - */ - p->result = ISeqInStream_Read(p->stream, - p->bufBase + (dest - p->bufBase), &size); + p->result = p->stream->Read(p->stream, dest, &size); if (p->result != SZ_OK) return; if (size == 0) @@ -169,60 +73,47 @@ static void MatchFinder_ReadBlock(CMatchFinder *p) return; } p->streamPos += (UInt32)size; - if (GET_AVAIL_BYTES(p) > p->keepSizeAfter) + if (p->streamPos - p->pos > p->keepSizeAfter) return; - /* here and in another (p->keepSizeAfter) checks we keep on 1 byte more than was requested by Create() function - (GET_AVAIL_BYTES(p) >= p->keepSizeAfter) - minimal required size */ } - - // on exit: (p->result != SZ_OK || p->streamEndWasReached || GET_AVAIL_BYTES(p) > p->keepSizeAfter) } - - -Z7_NO_INLINE void MatchFinder_MoveBlock(CMatchFinder *p) { - const size_t offset = (size_t)(p->buffer - p->bufBase) - p->keepSizeBefore; - const size_t keepBefore = (offset & (kBlockMoveAlign - 1)) + p->keepSizeBefore; - p->buffer = p->bufBase + keepBefore; - memmove(p->bufBase, - p->bufBase + (offset & ~((size_t)kBlockMoveAlign - 1)), - keepBefore + (size_t)GET_AVAIL_BYTES(p)); + memmove(p->bufferBase, + p->buffer - p->keepSizeBefore, + (size_t)(p->streamPos - p->pos + p->keepSizeBefore)); + p->buffer = p->bufferBase + p->keepSizeBefore; } -/* We call MoveBlock() before ReadBlock(). - So MoveBlock() can be wasteful operation, if the whole input data - can fit in current block even without calling MoveBlock(). - in important case where (dataSize <= historySize) - condition (p->blockSize > dataSize + p->keepSizeAfter) is met - So there is no MoveBlock() in that case case. -*/ - int MatchFinder_NeedMove(CMatchFinder *p) { - if (p->directInput) - return 0; - if (p->streamEndWasReached || p->result != SZ_OK) - return 0; - return ((size_t)(p->bufBase + p->blockSize - p->buffer) <= p->keepSizeAfter); + /* if (p->streamEndWasReached) return 0; */ + return ((size_t)(p->bufferBase + p->blockSize - p->buffer) <= p->keepSizeAfter); } void MatchFinder_ReadIfRequired(CMatchFinder *p) { - if (p->keepSizeAfter >= GET_AVAIL_BYTES(p)) + if (p->streamEndWasReached) + return; + if (p->keepSizeAfter >= p->streamPos - p->pos) MatchFinder_ReadBlock(p); } - +static void MatchFinder_CheckAndMoveAndRead(CMatchFinder *p) +{ + if (MatchFinder_NeedMove(p)) + MatchFinder_MoveBlock(p); + MatchFinder_ReadBlock(p); +} static void MatchFinder_SetDefaultSettings(CMatchFinder *p) { p->cutValue = 32; p->btMode = 1; p->numHashBytes = 4; - p->numHashBytes_Min = 2; - p->numHashOutBits = 0; + /* p->skipModeBits = 0; */ + p->directInput = 0; p->bigHash = 0; } @@ -230,657 +121,204 @@ static void MatchFinder_SetDefaultSettings(CMatchFinder *p) void MatchFinder_Construct(CMatchFinder *p) { - unsigned i; - p->buffer = NULL; - p->bufBase = NULL; + UInt32 i; + p->bufferBase = 0; p->directInput = 0; - p->stream = NULL; - p->hash = NULL; - p->expectedDataSize = (UInt64)(Int64)-1; + p->hash = 0; MatchFinder_SetDefaultSettings(p); for (i = 0; i < 256; i++) { - UInt32 r = (UInt32)i; - unsigned j; + UInt32 r = i; + int j; for (j = 0; j < 8; j++) - r = (r >> 1) ^ (kCrcPoly & ((UInt32)0 - (r & 1))); + r = (r >> 1) ^ (kCrcPoly & ~((r & 1) - 1)); p->crc[i] = r; } } -#undef kCrcPoly - -static void MatchFinder_FreeThisClassMemory(CMatchFinder *p, ISzAllocPtr alloc) +static void MatchFinder_FreeThisClassMemory(CMatchFinder *p, ISzAlloc *alloc) { - ISzAlloc_Free(alloc, p->hash); - p->hash = NULL; + alloc->Free(alloc, p->hash); + p->hash = 0; } -void MatchFinder_Free(CMatchFinder *p, ISzAllocPtr alloc) +void MatchFinder_Free(CMatchFinder *p, ISzAlloc *alloc) { MatchFinder_FreeThisClassMemory(p, alloc); LzInWindow_Free(p, alloc); } -static CLzRef* AllocRefs(size_t num, ISzAllocPtr alloc) +static CLzRef* AllocRefs(UInt32 num, ISzAlloc *alloc) { - const size_t sizeInBytes = (size_t)num * sizeof(CLzRef); + size_t sizeInBytes = (size_t)num * sizeof(CLzRef); if (sizeInBytes / sizeof(CLzRef) != num) - return NULL; - return (CLzRef *)ISzAlloc_Alloc(alloc, sizeInBytes); -} - -#if (kBlockSizeReserveMin < kBlockSizeAlign * 2) - #error Stop_Compiling_Bad_Reserve -#endif - - - -static UInt32 GetBlockSize(CMatchFinder *p, UInt32 historySize) -{ - UInt32 blockSize = (p->keepSizeBefore + p->keepSizeAfter); - /* - if (historySize > kMaxHistorySize) return 0; - */ - // printf("\nhistorySize == 0x%x\n", historySize); - - if (p->keepSizeBefore < historySize || blockSize < p->keepSizeBefore) // if 32-bit overflow - return 0; - - { - const UInt32 kBlockSizeMax = (UInt32)0 - (UInt32)kBlockSizeAlign; - const UInt32 rem = kBlockSizeMax - blockSize; - const UInt32 reserve = (blockSize >> (blockSize < ((UInt32)1 << 30) ? 1 : 2)) - + (1 << 12) + kBlockMoveAlign + kBlockSizeAlign; // do not overflow 32-bit here - if (blockSize >= kBlockSizeMax - || rem < kBlockSizeReserveMin) // we reject settings that will be slow - return 0; - if (reserve >= rem) - blockSize = kBlockSizeMax; - else - { - blockSize += reserve; - blockSize &= ~(UInt32)(kBlockSizeAlign - 1); - } - } - // printf("\n LzFind_blockSize = %x\n", blockSize); - // printf("\n LzFind_blockSize = %d\n", blockSize >> 20); - return blockSize; + return (CLzRef *)alloc->Alloc(alloc, sizeInBytes); } - -// input is historySize -static UInt32 MatchFinder_GetHashMask2(CMatchFinder *p, UInt32 hs) -{ - if (p->numHashBytes == 2) - return (1 << 16) - 1; - if (hs != 0) - hs--; - hs |= (hs >> 1); - hs |= (hs >> 2); - hs |= (hs >> 4); - hs |= (hs >> 8); - // we propagated 16 bits in (hs). Low 16 bits must be set later - if (hs >= (1 << 24)) - { - if (p->numHashBytes == 3) - hs = (1 << 24) - 1; - /* if (bigHash) mode, GetHeads4b() in LzFindMt.c needs (hs >= ((1 << 24) - 1))) */ - } - // (hash_size >= (1 << 16)) : Required for (numHashBytes > 2) - hs |= (1 << 16) - 1; /* don't change it! */ - // bt5: we adjust the size with recommended minimum size - if (p->numHashBytes >= 5) - hs |= (256 << kLzHash_CrcShift_2) - 1; - return hs; -} - -// input is historySize -static UInt32 MatchFinder_GetHashMask(CMatchFinder *p, UInt32 hs) -{ - if (p->numHashBytes == 2) - return (1 << 16) - 1; - if (hs != 0) - hs--; - hs |= (hs >> 1); - hs |= (hs >> 2); - hs |= (hs >> 4); - hs |= (hs >> 8); - // we propagated 16 bits in (hs). Low 16 bits must be set later - hs >>= 1; - if (hs >= (1 << 24)) - { - if (p->numHashBytes == 3) - hs = (1 << 24) - 1; - else - hs >>= 1; - /* if (bigHash) mode, GetHeads4b() in LzFindMt.c needs (hs >= ((1 << 24) - 1))) */ - } - // (hash_size >= (1 << 16)) : Required for (numHashBytes > 2) - hs |= (1 << 16) - 1; /* don't change it! */ - // bt5: we adjust the size with recommended minimum size - if (p->numHashBytes >= 5) - hs |= (256 << kLzHash_CrcShift_2) - 1; - return hs; -} - - int MatchFinder_Create(CMatchFinder *p, UInt32 historySize, UInt32 keepAddBufferBefore, UInt32 matchMaxLen, UInt32 keepAddBufferAfter, - ISzAllocPtr alloc) + ISzAlloc *alloc) { - /* we need one additional byte in (p->keepSizeBefore), - since we use MoveBlock() after (p->pos++) and before dictionary using */ - // keepAddBufferBefore = (UInt32)0xFFFFFFFF - (1 << 22); // for debug - p->keepSizeBefore = historySize + keepAddBufferBefore + 1; - - keepAddBufferAfter += matchMaxLen; - /* we need (p->keepSizeAfter >= p->numHashBytes) */ - if (keepAddBufferAfter < p->numHashBytes) - keepAddBufferAfter = p->numHashBytes; - // keepAddBufferAfter -= 2; // for debug - p->keepSizeAfter = keepAddBufferAfter; - - if (p->directInput) - p->blockSize = 0; - if (p->directInput || LzInWindow_Create2(p, GetBlockSize(p, historySize), alloc)) + UInt32 sizeReserv; + if (historySize > kMaxHistorySize) { - size_t hashSizeSum; + MatchFinder_Free(p, alloc); + return 0; + } + sizeReserv = historySize >> 1; + if (historySize > ((UInt32)2 << 30)) + sizeReserv = historySize >> 2; + sizeReserv += (keepAddBufferBefore + matchMaxLen + keepAddBufferAfter) / 2 + (1 << 19); + + p->keepSizeBefore = historySize + keepAddBufferBefore + 1; + p->keepSizeAfter = matchMaxLen + keepAddBufferAfter; + /* we need one additional byte, since we use MoveBlock after pos++ and before dictionary using */ + if (LzInWindow_Create(p, sizeReserv, alloc)) + { + UInt32 newCyclicBufferSize = (historySize /* >> p->skipModeBits */) + 1; + UInt32 hs; + p->matchMaxLen = matchMaxLen; { - UInt32 hs; - UInt32 hsCur; - - if (p->numHashOutBits != 0) - { - unsigned numBits = p->numHashOutBits; - const unsigned nbMax = - (p->numHashBytes == 2 ? 16 : - (p->numHashBytes == 3 ? 24 : 32)); - if (numBits > nbMax) - numBits = nbMax; - if (numBits >= 32) - hs = (UInt32)0 - 1; - else - hs = ((UInt32)1 << numBits) - 1; - // (hash_size >= (1 << 16)) : Required for (numHashBytes > 2) - hs |= (1 << 16) - 1; /* don't change it! */ - if (p->numHashBytes >= 5) - hs |= (256 << kLzHash_CrcShift_2) - 1; - { - const UInt32 hs2 = MatchFinder_GetHashMask2(p, historySize); - if (hs > hs2) - hs = hs2; - } - hsCur = hs; - if (p->expectedDataSize < historySize) - { - const UInt32 hs2 = MatchFinder_GetHashMask2(p, (UInt32)p->expectedDataSize); - if (hsCur > hs2) - hsCur = hs2; - } - } + p->fixedHashSize = 0; + if (p->numHashBytes == 2) + hs = (1 << 16) - 1; else { - hs = MatchFinder_GetHashMask(p, historySize); - hsCur = hs; - if (p->expectedDataSize < historySize) + hs = historySize - 1; + hs |= (hs >> 1); + hs |= (hs >> 2); + hs |= (hs >> 4); + hs |= (hs >> 8); + hs >>= 1; + /* hs >>= p->skipModeBits; */ + hs |= 0xFFFF; /* don't change it! It's required for Deflate */ + if (hs > (1 << 24)) { - hsCur = MatchFinder_GetHashMask(p, (UInt32)p->expectedDataSize); - if (hsCur > hs) // is it possible? - hsCur = hs; + if (p->numHashBytes == 3) + hs = (1 << 24) - 1; + else + hs >>= 1; } } - - p->hashMask = hsCur; - - hashSizeSum = hs; - hashSizeSum++; - if (hashSizeSum < hs) - return 0; - { - UInt32 fixedHashSize = 0; - if (p->numHashBytes > 2 && p->numHashBytes_Min <= 2) fixedHashSize += kHash2Size; - if (p->numHashBytes > 3 && p->numHashBytes_Min <= 3) fixedHashSize += kHash3Size; - // if (p->numHashBytes > 4) p->fixedHashSize += hs4; // kHash4Size; - hashSizeSum += fixedHashSize; - p->fixedHashSize = fixedHashSize; - } + p->hashMask = hs; + hs++; + if (p->numHashBytes > 2) p->fixedHashSize += kHash2Size; + if (p->numHashBytes > 3) p->fixedHashSize += kHash3Size; + if (p->numHashBytes > 4) p->fixedHashSize += kHash4Size; + hs += p->fixedHashSize; } - p->matchMaxLen = matchMaxLen; - { - size_t newSize; - size_t numSons; - const UInt32 newCyclicBufferSize = historySize + 1; // do not change it + UInt32 prevSize = p->hashSizeSum + p->numSons; + UInt32 newSize; p->historySize = historySize; - p->cyclicBufferSize = newCyclicBufferSize; // it must be = (historySize + 1) - - numSons = newCyclicBufferSize; - if (p->btMode) - numSons <<= 1; - newSize = hashSizeSum + numSons; - - if (numSons < newCyclicBufferSize || newSize < numSons) - return 0; - - // aligned size is not required here, but it can be better for some loops - #define NUM_REFS_ALIGN_MASK 0xF - newSize = (newSize + NUM_REFS_ALIGN_MASK) & ~(size_t)NUM_REFS_ALIGN_MASK; - - // 22.02: we don't reallocate buffer, if old size is enough - if (p->hash && p->numRefs >= newSize) + p->hashSizeSum = hs; + p->cyclicBufferSize = newCyclicBufferSize; + p->numSons = (p->btMode ? newCyclicBufferSize * 2 : newCyclicBufferSize); + newSize = p->hashSizeSum + p->numSons; + if (p->hash != 0 && prevSize == newSize) return 1; - MatchFinder_FreeThisClassMemory(p, alloc); - p->numRefs = newSize; p->hash = AllocRefs(newSize, alloc); - - if (p->hash) + if (p->hash != 0) { - p->son = p->hash + hashSizeSum; + p->son = p->hash + p->hashSizeSum; return 1; } } } - MatchFinder_Free(p, alloc); return 0; } - static void MatchFinder_SetLimits(CMatchFinder *p) { - UInt32 k; - UInt32 n = kMaxValForNormalize - p->pos; - if (n == 0) - n = (UInt32)(Int32)-1; // we allow (pos == 0) at start even with (kMaxValForNormalize == 0) - - k = p->cyclicBufferSize - p->cyclicBufferPos; - if (k < n) - n = k; - - k = GET_AVAIL_BYTES(p); + UInt32 limit = kMaxValForNormalize - p->pos; + UInt32 limit2 = p->cyclicBufferSize - p->cyclicBufferPos; + if (limit2 < limit) + limit = limit2; + limit2 = p->streamPos - p->pos; + if (limit2 <= p->keepSizeAfter) { - const UInt32 ksa = p->keepSizeAfter; - UInt32 mm = p->matchMaxLen; - if (k > ksa) - k -= ksa; // we must limit exactly to keepSizeAfter for ReadBlock - else if (k >= mm) - { - // the limitation for (p->lenLimit) update - k -= mm; // optimization : to reduce the number of checks - k++; - // k = 1; // non-optimized version : for debug - } - else - { - mm = k; - if (k != 0) - k = 1; - } - p->lenLimit = mm; + if (limit2 > 0) + limit2 = 1; } - if (k < n) - n = k; - - p->posLimit = p->pos + n; -} - - -void MatchFinder_Init_LowHash(CMatchFinder *p) -{ - size_t i; - CLzRef *items = p->hash; - const size_t numItems = p->fixedHashSize; - for (i = 0; i < numItems; i++) - items[i] = kEmptyHashValue; -} - - -void MatchFinder_Init_HighHash(CMatchFinder *p) -{ - size_t i; - CLzRef *items = p->hash + p->fixedHashSize; - const size_t numItems = (size_t)p->hashMask + 1; - for (i = 0; i < numItems; i++) - items[i] = kEmptyHashValue; -} - - -void MatchFinder_Init_4(CMatchFinder *p) -{ - if (!p->directInput) - p->buffer = p->bufBase; + else + limit2 -= p->keepSizeAfter; + if (limit2 < limit) + limit = limit2; { - /* kEmptyHashValue = 0 (Zero) is used in hash tables as NO-VALUE marker. - the code in CMatchFinderMt expects (pos = 1) */ - p->pos = - p->streamPos = - 1; // it's smallest optimal value. do not change it - // 0; // for debug + UInt32 lenLimit = p->streamPos - p->pos; + if (lenLimit > p->matchMaxLen) + lenLimit = p->matchMaxLen; + p->lenLimit = lenLimit; } - p->result = SZ_OK; - p->streamEndWasReached = 0; + p->posLimit = p->pos + limit; } - -// (CYC_TO_POS_OFFSET == 0) is expected by some optimized code -#define CYC_TO_POS_OFFSET 0 -// #define CYC_TO_POS_OFFSET 1 // for debug - void MatchFinder_Init(CMatchFinder *p) { - MatchFinder_Init_HighHash(p); - MatchFinder_Init_LowHash(p); - MatchFinder_Init_4(p); - // if (readData) + UInt32 i; + for (i = 0; i < p->hashSizeSum; i++) + p->hash[i] = kEmptyHashValue; + p->cyclicBufferPos = 0; + p->buffer = p->bufferBase; + p->pos = p->streamPos = p->cyclicBufferSize; + p->result = SZ_OK; + p->streamEndWasReached = 0; MatchFinder_ReadBlock(p); - - /* if we init (cyclicBufferPos = pos), then we can use one variable - instead of both (cyclicBufferPos) and (pos) : only before (cyclicBufferPos) wrapping */ - p->cyclicBufferPos = (p->pos - CYC_TO_POS_OFFSET); // init with relation to (pos) - // p->cyclicBufferPos = 0; // smallest value - // p->son[0] = p->son[1] = 0; // unused: we can init skipped record for speculated accesses. MatchFinder_SetLimits(p); } - - -#ifdef MY_CPU_X86_OR_AMD64 - #if defined(__clang__) && (__clang_major__ >= 4) \ - || defined(Z7_GCC_VERSION) && (Z7_GCC_VERSION >= 40701) - // || defined(__INTEL_COMPILER) && (__INTEL_COMPILER >= 1900) - - #define USE_LZFIND_SATUR_SUB_128 - #define USE_LZFIND_SATUR_SUB_256 - #define LZFIND_ATTRIB_SSE41 __attribute__((__target__("sse4.1"))) - #define LZFIND_ATTRIB_AVX2 __attribute__((__target__("avx2"))) - #elif defined(_MSC_VER) - #if (_MSC_VER >= 1600) - #define USE_LZFIND_SATUR_SUB_128 - #endif - #if (_MSC_VER >= 1900) - #define USE_LZFIND_SATUR_SUB_256 - #endif - #endif - -// #elif defined(MY_CPU_ARM_OR_ARM64) -#elif defined(MY_CPU_ARM64) - - #if defined(__clang__) && (__clang_major__ >= 8) \ - || defined(__GNUC__) && (__GNUC__ >= 8) - #define USE_LZFIND_SATUR_SUB_128 - #ifdef MY_CPU_ARM64 - // #define LZFIND_ATTRIB_SSE41 __attribute__((__target__(""))) - #else - // #define LZFIND_ATTRIB_SSE41 __attribute__((__target__("fpu=crypto-neon-fp-armv8"))) - #endif - - #elif defined(_MSC_VER) - #if (_MSC_VER >= 1910) - #define USE_LZFIND_SATUR_SUB_128 - #endif - #endif - - #if defined(_MSC_VER) && defined(MY_CPU_ARM64) - #include - #else - #include - #endif - -#endif - - -#ifdef USE_LZFIND_SATUR_SUB_128 - -// #define Z7_SHOW_HW_STATUS - -#ifdef Z7_SHOW_HW_STATUS -#include -#define PRF(x) x -PRF(;) -#else -#define PRF(x) -#endif - - -#ifdef MY_CPU_ARM_OR_ARM64 - -#ifdef MY_CPU_ARM64 -// #define FORCE_LZFIND_SATUR_SUB_128 -#endif -typedef uint32x4_t LzFind_v128; -#define SASUB_128_V(v, s) \ - vsubq_u32(vmaxq_u32(v, s), s) - -#else // MY_CPU_ARM_OR_ARM64 - -#include // sse4.1 - -typedef __m128i LzFind_v128; -// SSE 4.1 -#define SASUB_128_V(v, s) \ - _mm_sub_epi32(_mm_max_epu32(v, s), s) - -#endif // MY_CPU_ARM_OR_ARM64 - - -#define SASUB_128(i) \ - *( LzFind_v128 *)( void *)(items + (i) * 4) = SASUB_128_V( \ - *(const LzFind_v128 *)(const void *)(items + (i) * 4), sub2); - - -Z7_NO_INLINE -static -#ifdef LZFIND_ATTRIB_SSE41 -LZFIND_ATTRIB_SSE41 -#endif -void -Z7_FASTCALL -LzFind_SaturSub_128(UInt32 subValue, CLzRef *items, const CLzRef *lim) +static UInt32 MatchFinder_GetSubValue(CMatchFinder *p) { - const LzFind_v128 sub2 = - #ifdef MY_CPU_ARM_OR_ARM64 - vdupq_n_u32(subValue); - #else - _mm_set_epi32((Int32)subValue, (Int32)subValue, (Int32)subValue, (Int32)subValue); - #endif - Z7_PRAGMA_OPT_DISABLE_LOOP_UNROLL_VECTORIZE - do - { - SASUB_128(0) SASUB_128(1) items += 2 * 4; - SASUB_128(0) SASUB_128(1) items += 2 * 4; - } - while (items != lim); + return (p->pos - p->historySize - 1) & kNormalizeMask; } - - -#ifdef USE_LZFIND_SATUR_SUB_256 - -#include // avx -/* -clang :immintrin.h uses -#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \ - defined(__AVX2__) -#include -#endif -so we need for clang-cl */ - -#if defined(__clang__) -#include -#include -#endif - -// AVX2: -#define SASUB_256(i) \ - *( __m256i *)( void *)(items + (i) * 8) = \ - _mm256_sub_epi32(_mm256_max_epu32( \ - *(const __m256i *)(const void *)(items + (i) * 8), sub2), sub2); - -Z7_NO_INLINE -static -#ifdef LZFIND_ATTRIB_AVX2 -LZFIND_ATTRIB_AVX2 -#endif -void -Z7_FASTCALL -LzFind_SaturSub_256(UInt32 subValue, CLzRef *items, const CLzRef *lim) +void MatchFinder_Normalize3(UInt32 subValue, CLzRef *items, UInt32 numItems) { - const __m256i sub2 = _mm256_set_epi32( - (Int32)subValue, (Int32)subValue, (Int32)subValue, (Int32)subValue, - (Int32)subValue, (Int32)subValue, (Int32)subValue, (Int32)subValue); - Z7_PRAGMA_OPT_DISABLE_LOOP_UNROLL_VECTORIZE - do + UInt32 i; + for (i = 0; i < numItems; i++) { - SASUB_256(0) SASUB_256(1) items += 2 * 8; - SASUB_256(0) SASUB_256(1) items += 2 * 8; - } - while (items != lim); -} -#endif // USE_LZFIND_SATUR_SUB_256 - -#ifndef FORCE_LZFIND_SATUR_SUB_128 -typedef void (Z7_FASTCALL *LZFIND_SATUR_SUB_CODE_FUNC)( - UInt32 subValue, CLzRef *items, const CLzRef *lim); -static LZFIND_SATUR_SUB_CODE_FUNC g_LzFind_SaturSub; -#endif // FORCE_LZFIND_SATUR_SUB_128 - -#endif // USE_LZFIND_SATUR_SUB_128 - - -// kEmptyHashValue must be zero -// #define SASUB_32(i) { UInt32 v = items[i]; UInt32 m = v - subValue; if (v < subValue) m = kEmptyHashValue; items[i] = m; } -#define SASUB_32(i) { UInt32 v = items[i]; if (v < subValue) v = subValue; items[i] = v - subValue; } - -#ifdef FORCE_LZFIND_SATUR_SUB_128 - -#define DEFAULT_SaturSub LzFind_SaturSub_128 - -#else - -#define DEFAULT_SaturSub LzFind_SaturSub_32 - -Z7_NO_INLINE -static -void -Z7_FASTCALL -LzFind_SaturSub_32(UInt32 subValue, CLzRef *items, const CLzRef *lim) -{ - Z7_PRAGMA_OPT_DISABLE_LOOP_UNROLL_VECTORIZE - do - { - SASUB_32(0) SASUB_32(1) items += 2; - SASUB_32(0) SASUB_32(1) items += 2; - SASUB_32(0) SASUB_32(1) items += 2; - SASUB_32(0) SASUB_32(1) items += 2; - } - while (items != lim); -} - -#endif - - -Z7_NO_INLINE -void MatchFinder_Normalize3(UInt32 subValue, CLzRef *items, size_t numItems) -{ - #define LZFIND_NORM_ALIGN_BLOCK_SIZE (1 << 7) - Z7_PRAGMA_OPT_DISABLE_LOOP_UNROLL_VECTORIZE - for (; numItems != 0 && ((unsigned)(ptrdiff_t)items & (LZFIND_NORM_ALIGN_BLOCK_SIZE - 1)) != 0; numItems--) - { - SASUB_32(0) - items++; - } - { - const size_t k_Align_Mask = (LZFIND_NORM_ALIGN_BLOCK_SIZE / 4 - 1); - CLzRef *lim = items + (numItems & ~(size_t)k_Align_Mask); - numItems &= k_Align_Mask; - if (items != lim) - { - #if defined(USE_LZFIND_SATUR_SUB_128) && !defined(FORCE_LZFIND_SATUR_SUB_128) - if (g_LzFind_SaturSub) - g_LzFind_SaturSub(subValue, items, lim); - else - #endif - DEFAULT_SaturSub(subValue, items, lim); - } - items = lim; - } - Z7_PRAGMA_OPT_DISABLE_LOOP_UNROLL_VECTORIZE - for (; numItems != 0; numItems--) - { - SASUB_32(0) - items++; + UInt32 value = items[i]; + if (value <= subValue) + value = kEmptyHashValue; + else + value -= subValue; + items[i] = value; } } +static void MatchFinder_Normalize(CMatchFinder *p) +{ + UInt32 subValue = MatchFinder_GetSubValue(p); + MatchFinder_Normalize3(subValue, p->hash, p->hashSizeSum + p->numSons); + MatchFinder_ReduceOffsets(p, subValue); +} - -// call MatchFinder_CheckLimits() only after (p->pos++) update - -Z7_NO_INLINE static void MatchFinder_CheckLimits(CMatchFinder *p) { - if (// !p->streamEndWasReached && p->result == SZ_OK && - p->keepSizeAfter == GET_AVAIL_BYTES(p)) - { - // we try to read only in exact state (p->keepSizeAfter == GET_AVAIL_BYTES(p)) - if (MatchFinder_NeedMove(p)) - MatchFinder_MoveBlock(p); - MatchFinder_ReadBlock(p); - } - if (p->pos == kMaxValForNormalize) - if (GET_AVAIL_BYTES(p) >= p->numHashBytes) // optional optimization for last bytes of data. - /* - if we disable normalization for last bytes of data, and - if (data_size == 4 GiB), we don't call wastfull normalization, - but (pos) will be wrapped over Zero (0) in that case. - And we cannot resume later to normal operation - */ - { - // MatchFinder_Normalize(p); - /* after normalization we need (p->pos >= p->historySize + 1); */ - /* we can reduce subValue to aligned value, if want to keep alignment - of (p->pos) and (p->buffer) for speculated accesses. */ - const UInt32 subValue = (p->pos - p->historySize - 1) /* & ~(UInt32)(kNormalizeAlign - 1) */; - // const UInt32 subValue = (1 << 15); // for debug - // printf("\nMatchFinder_Normalize() subValue == 0x%x\n", subValue); - MatchFinder_REDUCE_OFFSETS(p, subValue) - MatchFinder_Normalize3(subValue, p->hash, (size_t)p->hashMask + 1 + p->fixedHashSize); - { - size_t numSonRefs = p->cyclicBufferSize; - if (p->btMode) - numSonRefs <<= 1; - MatchFinder_Normalize3(subValue, p->son, numSonRefs); - } - } - + MatchFinder_Normalize(p); + if (!p->streamEndWasReached && p->keepSizeAfter == p->streamPos - p->pos) + MatchFinder_CheckAndMoveAndRead(p); if (p->cyclicBufferPos == p->cyclicBufferSize) p->cyclicBufferPos = 0; - MatchFinder_SetLimits(p); } - -/* - (lenLimit > maxLen) -*/ -Z7_FORCE_INLINE -static UInt32 * Hc_GetMatchesSpec(size_t lenLimit, UInt32 curMatch, UInt32 pos, const Byte *cur, CLzRef *son, - size_t _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 cutValue, - UInt32 *d, unsigned maxLen) +static UInt32 * Hc_GetMatchesSpec(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *cur, CLzRef *son, + UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 cutValue, + UInt32 *distances, UInt32 maxLen) { - /* son[_cyclicBufferPos] = curMatch; for (;;) { UInt32 delta = pos - curMatch; if (cutValue-- == 0 || delta >= _cyclicBufferSize) - return d; + return distances; { const Byte *pb = cur - delta; curMatch = son[_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)]; @@ -892,91 +330,35 @@ static UInt32 * Hc_GetMatchesSpec(size_t lenLimit, UInt32 curMatch, UInt32 pos, break; if (maxLen < len) { - maxLen = len; - *d++ = len; - *d++ = delta - 1; + *distances++ = maxLen = len; + *distances++ = delta - 1; if (len == lenLimit) - return d; + return distances; } } } } - */ - - const Byte *lim = cur + lenLimit; - son[_cyclicBufferPos] = curMatch; - - do - { - UInt32 delta; - - if (curMatch == 0) - break; - // if (curMatch2 >= curMatch) return NULL; - delta = pos - curMatch; - if (delta >= _cyclicBufferSize) - break; - { - ptrdiff_t diff; - curMatch = son[_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)]; - diff = (ptrdiff_t)0 - (ptrdiff_t)delta; - if (cur[maxLen] == cur[(ptrdiff_t)maxLen + diff]) - { - const Byte *c = cur; - while (*c == c[diff]) - { - if (++c == lim) - { - d[0] = (UInt32)(lim - cur); - d[1] = delta - 1; - return d + 2; - } - } - { - const unsigned len = (unsigned)(c - cur); - if (maxLen < len) - { - maxLen = len; - d[0] = (UInt32)len; - d[1] = delta - 1; - d += 2; - } - } - } - } - } - while (--cutValue); - - return d; } - -Z7_FORCE_INLINE UInt32 * GetMatchesSpec1(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *cur, CLzRef *son, - size_t _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 cutValue, - UInt32 *d, UInt32 maxLen) + UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 cutValue, + UInt32 *distances, UInt32 maxLen) { - CLzRef *ptr0 = son + ((size_t)_cyclicBufferPos << 1) + 1; - CLzRef *ptr1 = son + ((size_t)_cyclicBufferPos << 1); - unsigned len0 = 0, len1 = 0; - - UInt32 cmCheck; - - // if (curMatch >= pos) { *ptr0 = *ptr1 = kEmptyHashValue; return NULL; } - - cmCheck = (UInt32)(pos - _cyclicBufferSize); - if ((UInt32)pos <= _cyclicBufferSize) - cmCheck = 0; - - if (cmCheck < curMatch) - do + CLzRef *ptr0 = son + (_cyclicBufferPos << 1) + 1; + CLzRef *ptr1 = son + (_cyclicBufferPos << 1); + UInt32 len0 = 0, len1 = 0; + for (;;) { - const UInt32 delta = pos - curMatch; + UInt32 delta = pos - curMatch; + if (cutValue-- == 0 || delta >= _cyclicBufferSize) { - CLzRef *pair = son + ((size_t)(_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)) << 1); + *ptr0 = *ptr1 = kEmptyHashValue; + return distances; + } + { + CLzRef *pair = son + ((_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)) << 1); const Byte *pb = cur - delta; - unsigned len = (len0 < len1 ? len0 : len1); - const UInt32 pair0 = pair[0]; + UInt32 len = (len0 < len1 ? len0 : len1); if (pb[len] == cur[len]) { if (++len != lenLimit && pb[len] == cur[len]) @@ -985,65 +367,52 @@ UInt32 * GetMatchesSpec1(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byt break; if (maxLen < len) { - maxLen = (UInt32)len; - *d++ = (UInt32)len; - *d++ = delta - 1; + *distances++ = maxLen = len; + *distances++ = delta - 1; if (len == lenLimit) { - *ptr1 = pair0; + *ptr1 = pair[0]; *ptr0 = pair[1]; - return d; + return distances; } } } if (pb[len] < cur[len]) { *ptr1 = curMatch; - // const UInt32 curMatch2 = pair[1]; - // if (curMatch2 >= curMatch) { *ptr0 = *ptr1 = kEmptyHashValue; return NULL; } - // curMatch = curMatch2; - curMatch = pair[1]; ptr1 = pair + 1; + curMatch = *ptr1; len1 = len; } else { *ptr0 = curMatch; - curMatch = pair[0]; ptr0 = pair; + curMatch = *ptr0; len0 = len; } } } - while(--cutValue && cmCheck < curMatch); - - *ptr0 = *ptr1 = kEmptyHashValue; - return d; } - static void SkipMatchesSpec(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *cur, CLzRef *son, - size_t _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 cutValue) + UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 cutValue) { - CLzRef *ptr0 = son + ((size_t)_cyclicBufferPos << 1) + 1; - CLzRef *ptr1 = son + ((size_t)_cyclicBufferPos << 1); - unsigned len0 = 0, len1 = 0; - - UInt32 cmCheck; - - cmCheck = (UInt32)(pos - _cyclicBufferSize); - if ((UInt32)pos <= _cyclicBufferSize) - cmCheck = 0; - - if (// curMatch >= pos || // failure - cmCheck < curMatch) - do + CLzRef *ptr0 = son + (_cyclicBufferPos << 1) + 1; + CLzRef *ptr1 = son + (_cyclicBufferPos << 1); + UInt32 len0 = 0, len1 = 0; + for (;;) { - const UInt32 delta = pos - curMatch; + UInt32 delta = pos - curMatch; + if (cutValue-- == 0 || delta >= _cyclicBufferSize) { - CLzRef *pair = son + ((size_t)(_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)) << 1); + *ptr0 = *ptr1 = kEmptyHashValue; + return; + } + { + CLzRef *pair = son + ((_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)) << 1); const Byte *pb = cur - delta; - unsigned len = (len0 < len1 ? len0 : len1); + UInt32 len = (len0 < len1 ? len0 : len1); if (pb[len] == cur[len]) { while (++len != lenLimit) @@ -1061,594 +430,308 @@ static void SkipMatchesSpec(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const if (pb[len] < cur[len]) { *ptr1 = curMatch; - curMatch = pair[1]; ptr1 = pair + 1; + curMatch = *ptr1; len1 = len; } else { *ptr0 = curMatch; - curMatch = pair[0]; ptr0 = pair; + curMatch = *ptr0; len0 = len; } } } - while(--cutValue && cmCheck < curMatch); - - *ptr0 = *ptr1 = kEmptyHashValue; - return; } - #define MOVE_POS \ ++p->cyclicBufferPos; \ p->buffer++; \ - { const UInt32 pos1 = p->pos + 1; p->pos = pos1; if (pos1 == p->posLimit) MatchFinder_CheckLimits(p); } + if (++p->pos == p->posLimit) MatchFinder_CheckLimits(p); -#define MOVE_POS_RET MOVE_POS return distances; +#define MOVE_POS_RET MOVE_POS return offset; -Z7_NO_INLINE -static void MatchFinder_MovePos(CMatchFinder *p) -{ - /* we go here at the end of stream data, when (avail < num_hash_bytes) - We don't update sons[cyclicBufferPos << btMode]. - So (sons) record will contain junk. And we cannot resume match searching - to normal operation, even if we will provide more input data in buffer. - p->sons[p->cyclicBufferPos << p->btMode] = 0; // kEmptyHashValue - if (p->btMode) - p->sons[(p->cyclicBufferPos << p->btMode) + 1] = 0; // kEmptyHashValue - */ - MOVE_POS -} +static void MatchFinder_MovePos(CMatchFinder *p) { MOVE_POS; } #define GET_MATCHES_HEADER2(minLen, ret_op) \ - unsigned lenLimit; UInt32 hv; const Byte *cur; UInt32 curMatch; \ - lenLimit = (unsigned)p->lenLimit; { if (lenLimit < minLen) { MatchFinder_MovePos(p); ret_op; }} \ + UInt32 lenLimit; UInt32 hashValue; const Byte *cur; UInt32 curMatch; \ + lenLimit = p->lenLimit; { if (lenLimit < minLen) { MatchFinder_MovePos(p); ret_op; }} \ cur = p->buffer; -#define GET_MATCHES_HEADER(minLen) GET_MATCHES_HEADER2(minLen, return distances) -#define SKIP_HEADER(minLen) do { GET_MATCHES_HEADER2(minLen, continue) +#define GET_MATCHES_HEADER(minLen) GET_MATCHES_HEADER2(minLen, return 0) +#define SKIP_HEADER(minLen) GET_MATCHES_HEADER2(minLen, continue) -#define MF_PARAMS(p) lenLimit, curMatch, p->pos, p->buffer, p->son, p->cyclicBufferPos, p->cyclicBufferSize, p->cutValue +#define MF_PARAMS(p) p->pos, p->buffer, p->son, p->cyclicBufferPos, p->cyclicBufferSize, p->cutValue -#define SKIP_FOOTER SkipMatchesSpec(MF_PARAMS(p)); MOVE_POS } while (--num); +#define GET_MATCHES_FOOTER(offset, maxLen) \ + offset = (UInt32)(GetMatchesSpec1(lenLimit, curMatch, MF_PARAMS(p), \ + distances + offset, maxLen) - distances); MOVE_POS_RET; -#define GET_MATCHES_FOOTER_BASE(_maxLen_, func) \ - distances = func(MF_PARAMS(p), \ - distances, (UInt32)_maxLen_); MOVE_POS_RET +#define SKIP_FOOTER \ + SkipMatchesSpec(lenLimit, curMatch, MF_PARAMS(p)); MOVE_POS; -#define GET_MATCHES_FOOTER_BT(_maxLen_) \ - GET_MATCHES_FOOTER_BASE(_maxLen_, GetMatchesSpec1) - -#define GET_MATCHES_FOOTER_HC(_maxLen_) \ - GET_MATCHES_FOOTER_BASE(_maxLen_, Hc_GetMatchesSpec) - - - -#define UPDATE_maxLen { \ - const ptrdiff_t diff = (ptrdiff_t)0 - (ptrdiff_t)d2; \ - const Byte *c = cur + maxLen; \ - const Byte *lim = cur + lenLimit; \ - for (; c != lim; c++) if (*(c + diff) != *c) break; \ - maxLen = (unsigned)(c - cur); } - -static UInt32* Bt2_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) +static UInt32 Bt2_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) { + UInt32 offset; GET_MATCHES_HEADER(2) - HASH2_CALC - curMatch = p->hash[hv]; - p->hash[hv] = p->pos; - GET_MATCHES_FOOTER_BT(1) + HASH2_CALC; + curMatch = p->hash[hashValue]; + p->hash[hashValue] = p->pos; + offset = 0; + GET_MATCHES_FOOTER(offset, 1) } -UInt32* Bt3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) +UInt32 Bt3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) { + UInt32 offset; GET_MATCHES_HEADER(3) - HASH_ZIP_CALC - curMatch = p->hash[hv]; - p->hash[hv] = p->pos; - GET_MATCHES_FOOTER_BT(2) + HASH_ZIP_CALC; + curMatch = p->hash[hashValue]; + p->hash[hashValue] = p->pos; + offset = 0; + GET_MATCHES_FOOTER(offset, 2) } - -#define SET_mmm \ - mmm = p->cyclicBufferSize; \ - if (pos < mmm) \ - mmm = pos; - - -static UInt32* Bt3_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) +static UInt32 Bt3_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) { - UInt32 mmm; - UInt32 h2, d2, pos; - unsigned maxLen; - UInt32 *hash; + UInt32 hash2Value, delta2, maxLen, offset; GET_MATCHES_HEADER(3) - HASH3_CALC + HASH3_CALC; - hash = p->hash; - pos = p->pos; - - d2 = pos - hash[h2]; - - curMatch = (hash + kFix3HashSize)[hv]; + delta2 = p->pos - p->hash[hash2Value]; + curMatch = p->hash[kFix3HashSize + hashValue]; - hash[h2] = pos; - (hash + kFix3HashSize)[hv] = pos; + p->hash[hash2Value] = + p->hash[kFix3HashSize + hashValue] = p->pos; - SET_mmm maxLen = 2; - - if (d2 < mmm && *(cur - d2) == *cur) + offset = 0; + if (delta2 < p->cyclicBufferSize && *(cur - delta2) == *cur) { - UPDATE_maxLen - distances[0] = (UInt32)maxLen; - distances[1] = d2 - 1; - distances += 2; + for (; maxLen != lenLimit; maxLen++) + if (cur[(ptrdiff_t)maxLen - delta2] != cur[maxLen]) + break; + distances[0] = maxLen; + distances[1] = delta2 - 1; + offset = 2; if (maxLen == lenLimit) { - SkipMatchesSpec(MF_PARAMS(p)); - MOVE_POS_RET + SkipMatchesSpec(lenLimit, curMatch, MF_PARAMS(p)); + MOVE_POS_RET; } } - - GET_MATCHES_FOOTER_BT(maxLen) + GET_MATCHES_FOOTER(offset, maxLen) } - -static UInt32* Bt4_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) +static UInt32 Bt4_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) { - UInt32 mmm; - UInt32 h2, h3, d2, d3, pos; - unsigned maxLen; - UInt32 *hash; + UInt32 hash2Value, hash3Value, delta2, delta3, maxLen, offset; GET_MATCHES_HEADER(4) - HASH4_CALC + HASH4_CALC; - hash = p->hash; - pos = p->pos; - - d2 = pos - hash [h2]; - d3 = pos - (hash + kFix3HashSize)[h3]; - curMatch = (hash + kFix4HashSize)[hv]; - - hash [h2] = pos; - (hash + kFix3HashSize)[h3] = pos; - (hash + kFix4HashSize)[hv] = pos; - - SET_mmm - - maxLen = 3; + delta2 = p->pos - p->hash[ hash2Value]; + delta3 = p->pos - p->hash[kFix3HashSize + hash3Value]; + curMatch = p->hash[kFix4HashSize + hashValue]; - for (;;) + p->hash[ hash2Value] = + p->hash[kFix3HashSize + hash3Value] = + p->hash[kFix4HashSize + hashValue] = p->pos; + + maxLen = 1; + offset = 0; + if (delta2 < p->cyclicBufferSize && *(cur - delta2) == *cur) { - if (d2 < mmm && *(cur - d2) == *cur) - { - distances[0] = 2; - distances[1] = d2 - 1; - distances += 2; - if (*(cur - d2 + 2) == cur[2]) - { - // distances[-2] = 3; - } - else if (d3 < mmm && *(cur - d3) == *cur) - { - d2 = d3; - distances[1] = d3 - 1; - distances += 2; - } - else + distances[0] = maxLen = 2; + distances[1] = delta2 - 1; + offset = 2; + } + if (delta2 != delta3 && delta3 < p->cyclicBufferSize && *(cur - delta3) == *cur) + { + maxLen = 3; + distances[offset + 1] = delta3 - 1; + offset += 2; + delta2 = delta3; + } + if (offset != 0) + { + for (; maxLen != lenLimit; maxLen++) + if (cur[(ptrdiff_t)maxLen - delta2] != cur[maxLen]) break; - } - else if (d3 < mmm && *(cur - d3) == *cur) - { - d2 = d3; - distances[1] = d3 - 1; - distances += 2; - } - else - break; - - UPDATE_maxLen - distances[-2] = (UInt32)maxLen; + distances[offset - 2] = maxLen; if (maxLen == lenLimit) { - SkipMatchesSpec(MF_PARAMS(p)); - MOVE_POS_RET + SkipMatchesSpec(lenLimit, curMatch, MF_PARAMS(p)); + MOVE_POS_RET; } - break; } - - GET_MATCHES_FOOTER_BT(maxLen) + if (maxLen < 3) + maxLen = 3; + GET_MATCHES_FOOTER(offset, maxLen) } - -static UInt32* Bt5_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) +static UInt32 Hc4_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) { - UInt32 mmm; - UInt32 h2, h3, d2, d3, maxLen, pos; - UInt32 *hash; - GET_MATCHES_HEADER(5) - - HASH5_CALC - - hash = p->hash; - pos = p->pos; - - d2 = pos - hash [h2]; - d3 = pos - (hash + kFix3HashSize)[h3]; - // d4 = pos - (hash + kFix4HashSize)[h4]; - - curMatch = (hash + kFix5HashSize)[hv]; - - hash [h2] = pos; - (hash + kFix3HashSize)[h3] = pos; - // (hash + kFix4HashSize)[h4] = pos; - (hash + kFix5HashSize)[hv] = pos; - - SET_mmm - - maxLen = 4; - - for (;;) - { - if (d2 < mmm && *(cur - d2) == *cur) - { - distances[0] = 2; - distances[1] = d2 - 1; - distances += 2; - if (*(cur - d2 + 2) == cur[2]) - { - } - else if (d3 < mmm && *(cur - d3) == *cur) - { - distances[1] = d3 - 1; - distances += 2; - d2 = d3; - } - else - break; - } - else if (d3 < mmm && *(cur - d3) == *cur) - { - distances[1] = d3 - 1; - distances += 2; - d2 = d3; - } - else - break; - - distances[-2] = 3; - if (*(cur - d2 + 3) != cur[3]) - break; - UPDATE_maxLen - distances[-2] = (UInt32)maxLen; - if (maxLen == lenLimit) - { - SkipMatchesSpec(MF_PARAMS(p)); - MOVE_POS_RET - } - break; - } - - GET_MATCHES_FOOTER_BT(maxLen) -} - - -static UInt32* Hc4_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) -{ - UInt32 mmm; - UInt32 h2, h3, d2, d3, pos; - unsigned maxLen; - UInt32 *hash; + UInt32 hash2Value, hash3Value, delta2, delta3, maxLen, offset; GET_MATCHES_HEADER(4) - HASH4_CALC + HASH4_CALC; - hash = p->hash; - pos = p->pos; - - d2 = pos - hash [h2]; - d3 = pos - (hash + kFix3HashSize)[h3]; - curMatch = (hash + kFix4HashSize)[hv]; + delta2 = p->pos - p->hash[ hash2Value]; + delta3 = p->pos - p->hash[kFix3HashSize + hash3Value]; + curMatch = p->hash[kFix4HashSize + hashValue]; - hash [h2] = pos; - (hash + kFix3HashSize)[h3] = pos; - (hash + kFix4HashSize)[hv] = pos; + p->hash[ hash2Value] = + p->hash[kFix3HashSize + hash3Value] = + p->hash[kFix4HashSize + hashValue] = p->pos; - SET_mmm - - maxLen = 3; - - for (;;) + maxLen = 1; + offset = 0; + if (delta2 < p->cyclicBufferSize && *(cur - delta2) == *cur) { - if (d2 < mmm && *(cur - d2) == *cur) - { - distances[0] = 2; - distances[1] = d2 - 1; - distances += 2; - if (*(cur - d2 + 2) == cur[2]) - { - // distances[-2] = 3; - } - else if (d3 < mmm && *(cur - d3) == *cur) - { - d2 = d3; - distances[1] = d3 - 1; - distances += 2; - } - else + distances[0] = maxLen = 2; + distances[1] = delta2 - 1; + offset = 2; + } + if (delta2 != delta3 && delta3 < p->cyclicBufferSize && *(cur - delta3) == *cur) + { + maxLen = 3; + distances[offset + 1] = delta3 - 1; + offset += 2; + delta2 = delta3; + } + if (offset != 0) + { + for (; maxLen != lenLimit; maxLen++) + if (cur[(ptrdiff_t)maxLen - delta2] != cur[maxLen]) break; - } - else if (d3 < mmm && *(cur - d3) == *cur) - { - d2 = d3; - distances[1] = d3 - 1; - distances += 2; - } - else - break; - - UPDATE_maxLen - distances[-2] = (UInt32)maxLen; + distances[offset - 2] = maxLen; if (maxLen == lenLimit) { p->son[p->cyclicBufferPos] = curMatch; - MOVE_POS_RET + MOVE_POS_RET; } - break; } - - GET_MATCHES_FOOTER_HC(maxLen) + if (maxLen < 3) + maxLen = 3; + offset = (UInt32)(Hc_GetMatchesSpec(lenLimit, curMatch, MF_PARAMS(p), + distances + offset, maxLen) - (distances)); + MOVE_POS_RET } - -static UInt32 * Hc5_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) -{ - UInt32 mmm; - UInt32 h2, h3, d2, d3, maxLen, pos; - UInt32 *hash; - GET_MATCHES_HEADER(5) - - HASH5_CALC - - hash = p->hash; - pos = p->pos; - - d2 = pos - hash [h2]; - d3 = pos - (hash + kFix3HashSize)[h3]; - // d4 = pos - (hash + kFix4HashSize)[h4]; - - curMatch = (hash + kFix5HashSize)[hv]; - - hash [h2] = pos; - (hash + kFix3HashSize)[h3] = pos; - // (hash + kFix4HashSize)[h4] = pos; - (hash + kFix5HashSize)[hv] = pos; - - SET_mmm - - maxLen = 4; - - for (;;) - { - if (d2 < mmm && *(cur - d2) == *cur) - { - distances[0] = 2; - distances[1] = d2 - 1; - distances += 2; - if (*(cur - d2 + 2) == cur[2]) - { - } - else if (d3 < mmm && *(cur - d3) == *cur) - { - distances[1] = d3 - 1; - distances += 2; - d2 = d3; - } - else - break; - } - else if (d3 < mmm && *(cur - d3) == *cur) - { - distances[1] = d3 - 1; - distances += 2; - d2 = d3; - } - else - break; - - distances[-2] = 3; - if (*(cur - d2 + 3) != cur[3]) - break; - UPDATE_maxLen - distances[-2] = maxLen; - if (maxLen == lenLimit) - { - p->son[p->cyclicBufferPos] = curMatch; - MOVE_POS_RET - } - break; - } - - GET_MATCHES_FOOTER_HC(maxLen) -} - - -UInt32* Hc3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) +UInt32 Hc3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) { + UInt32 offset; GET_MATCHES_HEADER(3) - HASH_ZIP_CALC - curMatch = p->hash[hv]; - p->hash[hv] = p->pos; - GET_MATCHES_FOOTER_HC(2) + HASH_ZIP_CALC; + curMatch = p->hash[hashValue]; + p->hash[hashValue] = p->pos; + offset = (UInt32)(Hc_GetMatchesSpec(lenLimit, curMatch, MF_PARAMS(p), + distances, 2) - (distances)); + MOVE_POS_RET } - static void Bt2_MatchFinder_Skip(CMatchFinder *p, UInt32 num) { - SKIP_HEADER(2) + do { - HASH2_CALC - curMatch = p->hash[hv]; - p->hash[hv] = p->pos; + SKIP_HEADER(2) + HASH2_CALC; + curMatch = p->hash[hashValue]; + p->hash[hashValue] = p->pos; + SKIP_FOOTER } - SKIP_FOOTER + while (--num != 0); } void Bt3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num) { - SKIP_HEADER(3) + do { - HASH_ZIP_CALC - curMatch = p->hash[hv]; - p->hash[hv] = p->pos; + SKIP_HEADER(3) + HASH_ZIP_CALC; + curMatch = p->hash[hashValue]; + p->hash[hashValue] = p->pos; + SKIP_FOOTER } - SKIP_FOOTER + while (--num != 0); } static void Bt3_MatchFinder_Skip(CMatchFinder *p, UInt32 num) { - SKIP_HEADER(3) + do { - UInt32 h2; - UInt32 *hash; - HASH3_CALC - hash = p->hash; - curMatch = (hash + kFix3HashSize)[hv]; - hash[h2] = - (hash + kFix3HashSize)[hv] = p->pos; + UInt32 hash2Value; + SKIP_HEADER(3) + HASH3_CALC; + curMatch = p->hash[kFix3HashSize + hashValue]; + p->hash[hash2Value] = + p->hash[kFix3HashSize + hashValue] = p->pos; + SKIP_FOOTER } - SKIP_FOOTER + while (--num != 0); } static void Bt4_MatchFinder_Skip(CMatchFinder *p, UInt32 num) { - SKIP_HEADER(4) + do { - UInt32 h2, h3; - UInt32 *hash; - HASH4_CALC - hash = p->hash; - curMatch = (hash + kFix4HashSize)[hv]; - hash [h2] = - (hash + kFix3HashSize)[h3] = - (hash + kFix4HashSize)[hv] = p->pos; + UInt32 hash2Value, hash3Value; + SKIP_HEADER(4) + HASH4_CALC; + curMatch = p->hash[kFix4HashSize + hashValue]; + p->hash[ hash2Value] = + p->hash[kFix3HashSize + hash3Value] = p->pos; + p->hash[kFix4HashSize + hashValue] = p->pos; + SKIP_FOOTER } - SKIP_FOOTER + while (--num != 0); } -static void Bt5_MatchFinder_Skip(CMatchFinder *p, UInt32 num) -{ - SKIP_HEADER(5) - { - UInt32 h2, h3; - UInt32 *hash; - HASH5_CALC - hash = p->hash; - curMatch = (hash + kFix5HashSize)[hv]; - hash [h2] = - (hash + kFix3HashSize)[h3] = - // (hash + kFix4HashSize)[h4] = - (hash + kFix5HashSize)[hv] = p->pos; - } - SKIP_FOOTER -} - - -#define HC_SKIP_HEADER(minLen) \ - do { if (p->lenLimit < minLen) { MatchFinder_MovePos(p); num--; continue; } { \ - const Byte *cur; \ - UInt32 *hash; \ - UInt32 *son; \ - UInt32 pos = p->pos; \ - UInt32 num2 = num; \ - /* (p->pos == p->posLimit) is not allowed here !!! */ \ - { const UInt32 rem = p->posLimit - pos; if (num2 > rem) num2 = rem; } \ - num -= num2; \ - { const UInt32 cycPos = p->cyclicBufferPos; \ - son = p->son + cycPos; \ - p->cyclicBufferPos = cycPos + num2; } \ - cur = p->buffer; \ - hash = p->hash; \ - do { \ - UInt32 curMatch; \ - UInt32 hv; - - -#define HC_SKIP_FOOTER \ - cur++; pos++; *son++ = curMatch; \ - } while (--num2); \ - p->buffer = cur; \ - p->pos = pos; \ - if (pos == p->posLimit) MatchFinder_CheckLimits(p); \ - }} while(num); \ - - static void Hc4_MatchFinder_Skip(CMatchFinder *p, UInt32 num) { - HC_SKIP_HEADER(4) - - UInt32 h2, h3; - HASH4_CALC - curMatch = (hash + kFix4HashSize)[hv]; - hash [h2] = - (hash + kFix3HashSize)[h3] = - (hash + kFix4HashSize)[hv] = pos; - - HC_SKIP_FOOTER + do + { + UInt32 hash2Value, hash3Value; + SKIP_HEADER(4) + HASH4_CALC; + curMatch = p->hash[kFix4HashSize + hashValue]; + p->hash[ hash2Value] = + p->hash[kFix3HashSize + hash3Value] = + p->hash[kFix4HashSize + hashValue] = p->pos; + p->son[p->cyclicBufferPos] = curMatch; + MOVE_POS + } + while (--num != 0); } - -static void Hc5_MatchFinder_Skip(CMatchFinder *p, UInt32 num) -{ - HC_SKIP_HEADER(5) - - UInt32 h2, h3; - HASH5_CALC - curMatch = (hash + kFix5HashSize)[hv]; - hash [h2] = - (hash + kFix3HashSize)[h3] = - // (hash + kFix4HashSize)[h4] = - (hash + kFix5HashSize)[hv] = pos; - - HC_SKIP_FOOTER -} - - void Hc3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num) { - HC_SKIP_HEADER(3) - - HASH_ZIP_CALC - curMatch = hash[hv]; - hash[hv] = pos; - - HC_SKIP_FOOTER + do + { + SKIP_HEADER(3) + HASH_ZIP_CALC; + curMatch = p->hash[hashValue]; + p->hash[hashValue] = p->pos; + p->son[p->cyclicBufferPos] = curMatch; + MOVE_POS + } + while (--num != 0); } - -void MatchFinder_CreateVTable(CMatchFinder *p, IMatchFinder2 *vTable) +void MatchFinder_CreateVTable(CMatchFinder *p, IMatchFinder *vTable) { vTable->Init = (Mf_Init_Func)MatchFinder_Init; + vTable->GetIndexByte = (Mf_GetIndexByte_Func)MatchFinder_GetIndexByte; vTable->GetNumAvailableBytes = (Mf_GetNumAvailableBytes_Func)MatchFinder_GetNumAvailableBytes; vTable->GetPointerToCurrentPos = (Mf_GetPointerToCurrentPos_Func)MatchFinder_GetPointerToCurrentPos; if (!p->btMode) { - if (p->numHashBytes <= 4) - { - vTable->GetMatches = (Mf_GetMatches_Func)Hc4_MatchFinder_GetMatches; - vTable->Skip = (Mf_Skip_Func)Hc4_MatchFinder_Skip; - } - else - { - vTable->GetMatches = (Mf_GetMatches_Func)Hc5_MatchFinder_GetMatches; - vTable->Skip = (Mf_Skip_Func)Hc5_MatchFinder_Skip; - } + vTable->GetMatches = (Mf_GetMatches_Func)Hc4_MatchFinder_GetMatches; + vTable->Skip = (Mf_Skip_Func)Hc4_MatchFinder_Skip; } else if (p->numHashBytes == 2) { @@ -1660,58 +743,9 @@ void MatchFinder_CreateVTable(CMatchFinder *p, IMatchFinder2 *vTable) vTable->GetMatches = (Mf_GetMatches_Func)Bt3_MatchFinder_GetMatches; vTable->Skip = (Mf_Skip_Func)Bt3_MatchFinder_Skip; } - else if (p->numHashBytes == 4) + else { vTable->GetMatches = (Mf_GetMatches_Func)Bt4_MatchFinder_GetMatches; vTable->Skip = (Mf_Skip_Func)Bt4_MatchFinder_Skip; } - else - { - vTable->GetMatches = (Mf_GetMatches_Func)Bt5_MatchFinder_GetMatches; - vTable->Skip = (Mf_Skip_Func)Bt5_MatchFinder_Skip; - } } - - - -void LzFindPrepare(void) -{ - #ifndef FORCE_LZFIND_SATUR_SUB_128 - #ifdef USE_LZFIND_SATUR_SUB_128 - LZFIND_SATUR_SUB_CODE_FUNC f = NULL; - #ifdef MY_CPU_ARM_OR_ARM64 - { - if (CPU_IsSupported_NEON()) - { - // #pragma message ("=== LzFind NEON") - PRF(printf("\n=== LzFind NEON\n")); - f = LzFind_SaturSub_128; - } - // f = 0; // for debug - } - #else // MY_CPU_ARM_OR_ARM64 - if (CPU_IsSupported_SSE41()) - { - // #pragma message ("=== LzFind SSE41") - PRF(printf("\n=== LzFind SSE41\n")); - f = LzFind_SaturSub_128; - - #ifdef USE_LZFIND_SATUR_SUB_256 - if (CPU_IsSupported_AVX2()) - { - // #pragma message ("=== LzFind AVX2") - PRF(printf("\n=== LzFind AVX2\n")); - f = LzFind_SaturSub_256; - } - #endif - } - #endif // MY_CPU_ARM_OR_ARM64 - g_LzFind_SaturSub = f; - #endif // USE_LZFIND_SATUR_SUB_128 - #endif // FORCE_LZFIND_SATUR_SUB_128 -} - - -#undef MOVE_POS -#undef MOVE_POS_RET -#undef PRF diff --git a/extern/lzma/LzFind.h b/extern/lzma/LzFind.h index a3f72c98700..5b9cebfdffe 100644 --- a/extern/lzma/LzFind.h +++ b/extern/lzma/LzFind.h @@ -1,121 +1,76 @@ /* LzFind.h -- Match finder for LZ algorithms -2023-03-04 : Igor Pavlov : Public domain */ +2008-10-04 : Igor Pavlov : Public domain */ -#ifndef ZIP7_INC_LZ_FIND_H -#define ZIP7_INC_LZ_FIND_H +#ifndef __LZFIND_H +#define __LZFIND_H -#include "7zTypes.h" - -EXTERN_C_BEGIN +#include "Types.h" typedef UInt32 CLzRef; -typedef struct +typedef struct _CMatchFinder { - const Byte *buffer; + Byte *buffer; UInt32 pos; UInt32 posLimit; - UInt32 streamPos; /* wrap over Zero is allowed (streamPos < pos). Use (UInt32)(streamPos - pos) */ + UInt32 streamPos; UInt32 lenLimit; UInt32 cyclicBufferPos; UInt32 cyclicBufferSize; /* it must be = (historySize + 1) */ - Byte streamEndWasReached; - Byte btMode; - Byte bigHash; - Byte directInput; - UInt32 matchMaxLen; CLzRef *hash; CLzRef *son; UInt32 hashMask; UInt32 cutValue; - Byte *bufBase; - ISeqInStreamPtr stream; - + Byte *bufferBase; + ISeqInStream *stream; + int streamEndWasReached; + UInt32 blockSize; UInt32 keepSizeBefore; UInt32 keepSizeAfter; UInt32 numHashBytes; - size_t directInputRem; + int directInput; + int btMode; + /* int skipModeBits; */ + int bigHash; UInt32 historySize; UInt32 fixedHashSize; - Byte numHashBytes_Min; - Byte numHashOutBits; - Byte _pad2_[2]; + UInt32 hashSizeSum; + UInt32 numSons; SRes result; UInt32 crc[256]; - size_t numRefs; - - UInt64 expectedDataSize; } CMatchFinder; -#define Inline_MatchFinder_GetPointerToCurrentPos(p) ((const Byte *)(p)->buffer) +#define Inline_MatchFinder_GetPointerToCurrentPos(p) ((p)->buffer) +#define Inline_MatchFinder_GetIndexByte(p, index) ((p)->buffer[(Int32)(index)]) -#define Inline_MatchFinder_GetNumAvailableBytes(p) ((UInt32)((p)->streamPos - (p)->pos)) +#define Inline_MatchFinder_GetNumAvailableBytes(p) ((p)->streamPos - (p)->pos) -/* -#define Inline_MatchFinder_IsFinishedOK(p) \ - ((p)->streamEndWasReached \ - && (p)->streamPos == (p)->pos \ - && (!(p)->directInput || (p)->directInputRem == 0)) -*/ - int MatchFinder_NeedMove(CMatchFinder *p); -/* Byte *MatchFinder_GetPointerToCurrentPos(CMatchFinder *p); */ +Byte *MatchFinder_GetPointerToCurrentPos(CMatchFinder *p); void MatchFinder_MoveBlock(CMatchFinder *p); void MatchFinder_ReadIfRequired(CMatchFinder *p); void MatchFinder_Construct(CMatchFinder *p); -/* (directInput = 0) is default value. - It's required to provide correct (directInput) value - before calling MatchFinder_Create(). - You can set (directInput) by any of the following calls: - - MatchFinder_SET_DIRECT_INPUT_BUF() - - MatchFinder_SET_STREAM() - - MatchFinder_SET_STREAM_MODE() +/* Conditions: + historySize <= 3 GB + keepAddBufferBefore + matchMaxLen + keepAddBufferAfter < 511MB */ - -#define MatchFinder_SET_DIRECT_INPUT_BUF(p, _src_, _srcLen_) { \ - (p)->stream = NULL; \ - (p)->directInput = 1; \ - (p)->buffer = (_src_); \ - (p)->directInputRem = (_srcLen_); } - -/* -#define MatchFinder_SET_STREAM_MODE(p) { \ - (p)->directInput = 0; } -*/ - -#define MatchFinder_SET_STREAM(p, _stream_) { \ - (p)->stream = _stream_; \ - (p)->directInput = 0; } - - int MatchFinder_Create(CMatchFinder *p, UInt32 historySize, UInt32 keepAddBufferBefore, UInt32 matchMaxLen, UInt32 keepAddBufferAfter, - ISzAllocPtr alloc); -void MatchFinder_Free(CMatchFinder *p, ISzAllocPtr alloc); -void MatchFinder_Normalize3(UInt32 subValue, CLzRef *items, size_t numItems); - -/* -#define MatchFinder_INIT_POS(p, val) \ - (p)->pos = (val); \ - (p)->streamPos = (val); -*/ - -// void MatchFinder_ReduceOffsets(CMatchFinder *p, UInt32 subValue); -#define MatchFinder_REDUCE_OFFSETS(p, subValue) \ - (p)->pos -= (subValue); \ - (p)->streamPos -= (subValue); - + ISzAlloc *alloc); +void MatchFinder_Free(CMatchFinder *p, ISzAlloc *alloc); +void MatchFinder_Normalize3(UInt32 subValue, CLzRef *items, UInt32 numItems); +void MatchFinder_ReduceOffsets(CMatchFinder *p, UInt32 subValue); UInt32 * GetMatchesSpec1(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *buffer, CLzRef *son, - size_t _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 _cutValue, + UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 _cutValue, UInt32 *distances, UInt32 maxLen); /* @@ -125,35 +80,28 @@ Conditions: */ typedef void (*Mf_Init_Func)(void *object); +typedef Byte (*Mf_GetIndexByte_Func)(void *object, Int32 index); typedef UInt32 (*Mf_GetNumAvailableBytes_Func)(void *object); typedef const Byte * (*Mf_GetPointerToCurrentPos_Func)(void *object); -typedef UInt32 * (*Mf_GetMatches_Func)(void *object, UInt32 *distances); +typedef UInt32 (*Mf_GetMatches_Func)(void *object, UInt32 *distances); typedef void (*Mf_Skip_Func)(void *object, UInt32); -typedef struct +typedef struct _IMatchFinder { Mf_Init_Func Init; + Mf_GetIndexByte_Func GetIndexByte; Mf_GetNumAvailableBytes_Func GetNumAvailableBytes; Mf_GetPointerToCurrentPos_Func GetPointerToCurrentPos; Mf_GetMatches_Func GetMatches; Mf_Skip_Func Skip; -} IMatchFinder2; +} IMatchFinder; -void MatchFinder_CreateVTable(CMatchFinder *p, IMatchFinder2 *vTable); +void MatchFinder_CreateVTable(CMatchFinder *p, IMatchFinder *vTable); -void MatchFinder_Init_LowHash(CMatchFinder *p); -void MatchFinder_Init_HighHash(CMatchFinder *p); -void MatchFinder_Init_4(CMatchFinder *p); void MatchFinder_Init(CMatchFinder *p); - -UInt32* Bt3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances); -UInt32* Hc3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances); - +UInt32 Bt3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances); +UInt32 Hc3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances); void Bt3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num); void Hc3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num); -void LzFindPrepare(void); - -EXTERN_C_END - #endif diff --git a/extern/lzma/LzFindMt.c b/extern/lzma/LzFindMt.c deleted file mode 100644 index 5253e6ebb35..00000000000 --- a/extern/lzma/LzFindMt.c +++ /dev/null @@ -1,1406 +0,0 @@ -/* LzFindMt.c -- multithreaded Match finder for LZ algorithms -2023-04-02 : Igor Pavlov : Public domain */ - -#include "Precomp.h" - -// #include - -#include "CpuArch.h" - -#include "LzHash.h" -#include "LzFindMt.h" - -// #define LOG_ITERS - -// #define LOG_THREAD - -#ifdef LOG_THREAD -#include -#define PRF(x) x -#else -#define PRF(x) -#endif - -#ifdef LOG_ITERS -#include -extern UInt64 g_NumIters_Tree; -extern UInt64 g_NumIters_Loop; -extern UInt64 g_NumIters_Bytes; -#define LOG_ITER(x) x -#else -#define LOG_ITER(x) -#endif - -#define kMtHashBlockSize ((UInt32)1 << 17) -#define kMtHashNumBlocks (1 << 1) - -#define GET_HASH_BLOCK_OFFSET(i) (((i) & (kMtHashNumBlocks - 1)) * kMtHashBlockSize) - -#define kMtBtBlockSize ((UInt32)1 << 16) -#define kMtBtNumBlocks (1 << 4) - -#define GET_BT_BLOCK_OFFSET(i) (((i) & (kMtBtNumBlocks - 1)) * (size_t)kMtBtBlockSize) - -/* - HASH functions: - We use raw 8/16 bits from a[1] and a[2], - xored with crc(a[0]) and crc(a[3]). - We check a[0], a[3] only. We don't need to compare a[1] and a[2] in matches. - our crc() function provides one-to-one correspondence for low 8-bit values: - (crc[0...0xFF] & 0xFF) <-> [0...0xFF] -*/ - -#define MF(mt) ((mt)->MatchFinder) -#define MF_CRC (p->crc) - -// #define MF(mt) (&(mt)->MatchFinder) -// #define MF_CRC (p->MatchFinder.crc) - -#define MT_HASH2_CALC \ - h2 = (MF_CRC[cur[0]] ^ cur[1]) & (kHash2Size - 1); - -#define MT_HASH3_CALC { \ - UInt32 temp = MF_CRC[cur[0]] ^ cur[1]; \ - h2 = temp & (kHash2Size - 1); \ - h3 = (temp ^ ((UInt32)cur[2] << 8)) & (kHash3Size - 1); } - -/* -#define MT_HASH3_CALC__NO_2 { \ - UInt32 temp = p->crc[cur[0]] ^ cur[1]; \ - h3 = (temp ^ ((UInt32)cur[2] << 8)) & (kHash3Size - 1); } - -#define MT_HASH4_CALC { \ - UInt32 temp = p->crc[cur[0]] ^ cur[1]; \ - h2 = temp & (kHash2Size - 1); \ - temp ^= ((UInt32)cur[2] << 8); \ - h3 = temp & (kHash3Size - 1); \ - h4 = (temp ^ (p->crc[cur[3]] << kLzHash_CrcShift_1)) & p->hash4Mask; } - // (kHash4Size - 1); -*/ - - -Z7_NO_INLINE -static void MtSync_Construct(CMtSync *p) -{ - p->affinity = 0; - p->wasCreated = False; - p->csWasInitialized = False; - p->csWasEntered = False; - Thread_CONSTRUCT(&p->thread) - Event_Construct(&p->canStart); - Event_Construct(&p->wasStopped); - Semaphore_Construct(&p->freeSemaphore); - Semaphore_Construct(&p->filledSemaphore); -} - - -#define DEBUG_BUFFER_LOCK // define it to debug lock state - -#ifdef DEBUG_BUFFER_LOCK -#include -#define BUFFER_MUST_BE_LOCKED(p) if (!(p)->csWasEntered) exit(1); -#define BUFFER_MUST_BE_UNLOCKED(p) if ( (p)->csWasEntered) exit(1); -#else -#define BUFFER_MUST_BE_LOCKED(p) -#define BUFFER_MUST_BE_UNLOCKED(p) -#endif - -#define LOCK_BUFFER(p) { \ - BUFFER_MUST_BE_UNLOCKED(p); \ - CriticalSection_Enter(&(p)->cs); \ - (p)->csWasEntered = True; } - -#define UNLOCK_BUFFER(p) { \ - BUFFER_MUST_BE_LOCKED(p); \ - CriticalSection_Leave(&(p)->cs); \ - (p)->csWasEntered = False; } - - -Z7_NO_INLINE -static UInt32 MtSync_GetNextBlock(CMtSync *p) -{ - UInt32 numBlocks = 0; - if (p->needStart) - { - BUFFER_MUST_BE_UNLOCKED(p) - p->numProcessedBlocks = 1; - p->needStart = False; - p->stopWriting = False; - p->exit = False; - Event_Reset(&p->wasStopped); - Event_Set(&p->canStart); - } - else - { - UNLOCK_BUFFER(p) - // we free current block - numBlocks = p->numProcessedBlocks++; - Semaphore_Release1(&p->freeSemaphore); - } - - // buffer is UNLOCKED here - Semaphore_Wait(&p->filledSemaphore); - LOCK_BUFFER(p) - return numBlocks; -} - - -/* if Writing (Processing) thread was started, we must call MtSync_StopWriting() */ - -Z7_NO_INLINE -static void MtSync_StopWriting(CMtSync *p) -{ - if (!Thread_WasCreated(&p->thread) || p->needStart) - return; - - PRF(printf("\nMtSync_StopWriting %p\n", p)); - - if (p->csWasEntered) - { - /* we don't use buffer in this thread after StopWriting(). - So we UNLOCK buffer. - And we restore default UNLOCKED state for stopped thread */ - UNLOCK_BUFFER(p) - } - - /* We send (p->stopWriting) message and release freeSemaphore - to free current block. - So the thread will see (p->stopWriting) at some - iteration after Wait(freeSemaphore). - The thread doesn't need to fill all avail free blocks, - so we can get fast thread stop. - */ - - p->stopWriting = True; - Semaphore_Release1(&p->freeSemaphore); // check semaphore count !!! - - PRF(printf("\nMtSync_StopWriting %p : Event_Wait(&p->wasStopped)\n", p)); - Event_Wait(&p->wasStopped); - PRF(printf("\nMtSync_StopWriting %p : Event_Wait() finsihed\n", p)); - - /* 21.03 : we don't restore samaphore counters here. - We will recreate and reinit samaphores in next start */ - - p->needStart = True; -} - - -Z7_NO_INLINE -static void MtSync_Destruct(CMtSync *p) -{ - PRF(printf("\nMtSync_Destruct %p\n", p)); - - if (Thread_WasCreated(&p->thread)) - { - /* we want thread to be in Stopped state before sending EXIT command. - note: stop(btSync) will stop (htSync) also */ - MtSync_StopWriting(p); - /* thread in Stopped state here : (p->needStart == true) */ - p->exit = True; - // if (p->needStart) // it's (true) - Event_Set(&p->canStart); // we send EXIT command to thread - Thread_Wait_Close(&p->thread); // we wait thread finishing - } - - if (p->csWasInitialized) - { - CriticalSection_Delete(&p->cs); - p->csWasInitialized = False; - } - p->csWasEntered = False; - - Event_Close(&p->canStart); - Event_Close(&p->wasStopped); - Semaphore_Close(&p->freeSemaphore); - Semaphore_Close(&p->filledSemaphore); - - p->wasCreated = False; -} - - -// #define RINOK_THREAD(x) { if ((x) != 0) return SZ_ERROR_THREAD; } -// we want to get real system error codes here instead of SZ_ERROR_THREAD -#define RINOK_THREAD(x) RINOK_WRes(x) - - -// call it before each new file (when new starting is required): -Z7_NO_INLINE -static SRes MtSync_Init(CMtSync *p, UInt32 numBlocks) -{ - WRes wres; - // BUFFER_MUST_BE_UNLOCKED(p) - if (!p->needStart || p->csWasEntered) - return SZ_ERROR_FAIL; - wres = Semaphore_OptCreateInit(&p->freeSemaphore, numBlocks, numBlocks); - if (wres == 0) - wres = Semaphore_OptCreateInit(&p->filledSemaphore, 0, numBlocks); - return MY_SRes_HRESULT_FROM_WRes(wres); -} - - -static WRes MtSync_Create_WRes(CMtSync *p, THREAD_FUNC_TYPE startAddress, void *obj) -{ - WRes wres; - - if (p->wasCreated) - return SZ_OK; - - RINOK_THREAD(CriticalSection_Init(&p->cs)) - p->csWasInitialized = True; - p->csWasEntered = False; - - RINOK_THREAD(AutoResetEvent_CreateNotSignaled(&p->canStart)) - RINOK_THREAD(AutoResetEvent_CreateNotSignaled(&p->wasStopped)) - - p->needStart = True; - p->exit = True; /* p->exit is unused before (canStart) Event. - But in case of some unexpected code failure we will get fast exit from thread */ - - // return ERROR_TOO_MANY_POSTS; // for debug - // return EINVAL; // for debug - - if (p->affinity != 0) - wres = Thread_Create_With_Affinity(&p->thread, startAddress, obj, (CAffinityMask)p->affinity); - else - wres = Thread_Create(&p->thread, startAddress, obj); - - RINOK_THREAD(wres) - p->wasCreated = True; - return SZ_OK; -} - - -Z7_NO_INLINE -static SRes MtSync_Create(CMtSync *p, THREAD_FUNC_TYPE startAddress, void *obj) -{ - const WRes wres = MtSync_Create_WRes(p, startAddress, obj); - if (wres == 0) - return 0; - MtSync_Destruct(p); - return MY_SRes_HRESULT_FROM_WRes(wres); -} - - -// ---------- HASH THREAD ---------- - -#define kMtMaxValForNormalize 0xFFFFFFFF -// #define kMtMaxValForNormalize ((1 << 21)) // for debug -// #define kNormalizeAlign (1 << 7) // alignment for speculated accesses - -#ifdef MY_CPU_LE_UNALIGN - #define GetUi24hi_from32(p) ((UInt32)GetUi32(p) >> 8) -#else - #define GetUi24hi_from32(p) ((p)[1] ^ ((UInt32)(p)[2] << 8) ^ ((UInt32)(p)[3] << 16)) -#endif - -#define GetHeads_DECL(name) \ - static void GetHeads ## name(const Byte *p, UInt32 pos, \ - UInt32 *hash, UInt32 hashMask, UInt32 *heads, UInt32 numHeads, const UInt32 *crc) - -#define GetHeads_LOOP(v) \ - for (; numHeads != 0; numHeads--) { \ - const UInt32 value = (v); \ - p++; \ - *heads++ = pos - hash[value]; \ - hash[value] = pos++; } - -#define DEF_GetHeads2(name, v, action) \ - GetHeads_DECL(name) { action \ - GetHeads_LOOP(v) } - -#define DEF_GetHeads(name, v) DEF_GetHeads2(name, v, ;) - -DEF_GetHeads2(2, GetUi16(p), UNUSED_VAR(hashMask); UNUSED_VAR(crc); ) -DEF_GetHeads(3, (crc[p[0]] ^ GetUi16(p + 1)) & hashMask) -DEF_GetHeads2(3b, GetUi16(p) ^ ((UInt32)(p)[2] << 16), UNUSED_VAR(hashMask); UNUSED_VAR(crc); ) -// BT3 is not good for crc collisions for big hashMask values. - -/* -GetHeads_DECL(3b) -{ - UNUSED_VAR(hashMask); - UNUSED_VAR(crc); - { - const Byte *pLim = p + numHeads; - if (numHeads == 0) - return; - pLim--; - while (p < pLim) - { - UInt32 v1 = GetUi32(p); - UInt32 v0 = v1 & 0xFFFFFF; - UInt32 h0, h1; - p += 2; - v1 >>= 8; - h0 = hash[v0]; hash[v0] = pos; heads[0] = pos - h0; pos++; - h1 = hash[v1]; hash[v1] = pos; heads[1] = pos - h1; pos++; - heads += 2; - } - if (p == pLim) - { - UInt32 v0 = GetUi16(p) ^ ((UInt32)(p)[2] << 16); - *heads = pos - hash[v0]; - hash[v0] = pos; - } - } -} -*/ - -/* -GetHeads_DECL(4) -{ - unsigned sh = 0; - UNUSED_VAR(crc) - while ((hashMask & 0x80000000) == 0) - { - hashMask <<= 1; - sh++; - } - GetHeads_LOOP((GetUi32(p) * 0xa54a1) >> sh) -} -#define GetHeads4b GetHeads4 -*/ - -#define USE_GetHeads_LOCAL_CRC - -#ifdef USE_GetHeads_LOCAL_CRC - -GetHeads_DECL(4) -{ - UInt32 crc0[256]; - UInt32 crc1[256]; - { - unsigned i; - for (i = 0; i < 256; i++) - { - UInt32 v = crc[i]; - crc0[i] = v & hashMask; - crc1[i] = (v << kLzHash_CrcShift_1) & hashMask; - // crc1[i] = rotlFixed(v, 8) & hashMask; - } - } - GetHeads_LOOP(crc0[p[0]] ^ crc1[p[3]] ^ (UInt32)GetUi16(p+1)) -} - -GetHeads_DECL(4b) -{ - UInt32 crc0[256]; - { - unsigned i; - for (i = 0; i < 256; i++) - crc0[i] = crc[i] & hashMask; - } - GetHeads_LOOP(crc0[p[0]] ^ GetUi24hi_from32(p)) -} - -GetHeads_DECL(5) -{ - UInt32 crc0[256]; - UInt32 crc1[256]; - UInt32 crc2[256]; - { - unsigned i; - for (i = 0; i < 256; i++) - { - UInt32 v = crc[i]; - crc0[i] = v & hashMask; - crc1[i] = (v << kLzHash_CrcShift_1) & hashMask; - crc2[i] = (v << kLzHash_CrcShift_2) & hashMask; - } - } - GetHeads_LOOP(crc0[p[0]] ^ crc1[p[3]] ^ crc2[p[4]] ^ (UInt32)GetUi16(p+1)) -} - -GetHeads_DECL(5b) -{ - UInt32 crc0[256]; - UInt32 crc1[256]; - { - unsigned i; - for (i = 0; i < 256; i++) - { - UInt32 v = crc[i]; - crc0[i] = v & hashMask; - crc1[i] = (v << kLzHash_CrcShift_1) & hashMask; - } - } - GetHeads_LOOP(crc0[p[0]] ^ crc1[p[4]] ^ GetUi24hi_from32(p)) -} - -#else - -DEF_GetHeads(4, (crc[p[0]] ^ (crc[p[3]] << kLzHash_CrcShift_1) ^ (UInt32)GetUi16(p+1)) & hashMask) -DEF_GetHeads(4b, (crc[p[0]] ^ GetUi24hi_from32(p)) & hashMask) -DEF_GetHeads(5, (crc[p[0]] ^ (crc[p[3]] << kLzHash_CrcShift_1) ^ (crc[p[4]] << kLzHash_CrcShift_2) ^ (UInt32)GetUi16(p + 1)) & hashMask) -DEF_GetHeads(5b, (crc[p[0]] ^ (crc[p[4]] << kLzHash_CrcShift_1) ^ GetUi24hi_from32(p)) & hashMask) - -#endif - - -static void HashThreadFunc(CMatchFinderMt *mt) -{ - CMtSync *p = &mt->hashSync; - PRF(printf("\nHashThreadFunc\n")); - - for (;;) - { - UInt32 blockIndex = 0; - PRF(printf("\nHashThreadFunc : Event_Wait(&p->canStart)\n")); - Event_Wait(&p->canStart); - PRF(printf("\nHashThreadFunc : Event_Wait(&p->canStart) : after \n")); - if (p->exit) - { - PRF(printf("\nHashThreadFunc : exit \n")); - return; - } - - MatchFinder_Init_HighHash(MF(mt)); - - for (;;) - { - PRF(printf("Hash thread block = %d pos = %d\n", (unsigned)blockIndex, mt->MatchFinder->pos)); - - { - CMatchFinder *mf = MF(mt); - if (MatchFinder_NeedMove(mf)) - { - CriticalSection_Enter(&mt->btSync.cs); - CriticalSection_Enter(&mt->hashSync.cs); - { - const Byte *beforePtr = Inline_MatchFinder_GetPointerToCurrentPos(mf); - ptrdiff_t offset; - MatchFinder_MoveBlock(mf); - offset = beforePtr - Inline_MatchFinder_GetPointerToCurrentPos(mf); - mt->pointerToCurPos -= offset; - mt->buffer -= offset; - } - CriticalSection_Leave(&mt->hashSync.cs); - CriticalSection_Leave(&mt->btSync.cs); - continue; - } - - Semaphore_Wait(&p->freeSemaphore); - - if (p->exit) // exit is unexpected here. But we check it here for some failure case - return; - - // for faster stop : we check (p->stopWriting) after Wait(freeSemaphore) - if (p->stopWriting) - break; - - MatchFinder_ReadIfRequired(mf); - { - UInt32 *heads = mt->hashBuf + GET_HASH_BLOCK_OFFSET(blockIndex++); - UInt32 num = Inline_MatchFinder_GetNumAvailableBytes(mf); - heads[0] = 2; - heads[1] = num; - - /* heads[1] contains the number of avail bytes: - if (avail < mf->numHashBytes) : - { - it means that stream was finished - HASH_THREAD and BT_TREAD must move position for heads[1] (avail) bytes. - HASH_THREAD doesn't stop, - HASH_THREAD fills only the header (2 numbers) for all next blocks: - {2, NumHashBytes - 1}, {2,0}, {2,0}, ... , {2,0} - } - else - { - HASH_THREAD and BT_TREAD must move position for (heads[0] - 2) bytes; - } - */ - - if (num >= mf->numHashBytes) - { - num = num - mf->numHashBytes + 1; - if (num > kMtHashBlockSize - 2) - num = kMtHashBlockSize - 2; - - if (mf->pos > (UInt32)kMtMaxValForNormalize - num) - { - const UInt32 subValue = (mf->pos - mf->historySize - 1); // & ~(UInt32)(kNormalizeAlign - 1); - MatchFinder_REDUCE_OFFSETS(mf, subValue) - MatchFinder_Normalize3(subValue, mf->hash + mf->fixedHashSize, (size_t)mf->hashMask + 1); - } - - heads[0] = 2 + num; - mt->GetHeadsFunc(mf->buffer, mf->pos, mf->hash + mf->fixedHashSize, mf->hashMask, heads + 2, num, mf->crc); - } - - mf->pos += num; // wrap over zero is allowed at the end of stream - mf->buffer += num; - } - } - - Semaphore_Release1(&p->filledSemaphore); - } // for() processing end - - // p->numBlocks_Sent = blockIndex; - Event_Set(&p->wasStopped); - } // for() thread end -} - - - - -// ---------- BT THREAD ---------- - -/* we use one variable instead of two (cyclicBufferPos == pos) before CyclicBuf wrap. - here we define fixed offset of (p->pos) from (p->cyclicBufferPos) */ -#define CYC_TO_POS_OFFSET 0 -// #define CYC_TO_POS_OFFSET 1 // for debug - -#define MFMT_GM_INLINE - -#ifdef MFMT_GM_INLINE - -/* - we use size_t for (pos) instead of UInt32 - to eliminate "movsx" BUG in old MSVC x64 compiler. -*/ - - -UInt32 * Z7_FASTCALL GetMatchesSpecN_2(const Byte *lenLimit, size_t pos, const Byte *cur, CLzRef *son, - UInt32 _cutValue, UInt32 *d, size_t _maxLen, const UInt32 *hash, const UInt32 *limit, const UInt32 *size, - size_t _cyclicBufferPos, UInt32 _cyclicBufferSize, - UInt32 *posRes); - -#endif - - -static void BtGetMatches(CMatchFinderMt *p, UInt32 *d) -{ - UInt32 numProcessed = 0; - UInt32 curPos = 2; - - /* GetMatchesSpec() functions don't create (len = 1) - in [len, dist] match pairs, if (p->numHashBytes >= 2) - Also we suppose here that (matchMaxLen >= 2). - So the following code for (reserve) is not required - UInt32 reserve = (p->matchMaxLen * 2); - const UInt32 kNumHashBytes_Max = 5; // BT_HASH_BYTES_MAX - if (reserve < kNumHashBytes_Max - 1) - reserve = kNumHashBytes_Max - 1; - const UInt32 limit = kMtBtBlockSize - (reserve); - */ - - const UInt32 limit = kMtBtBlockSize - (p->matchMaxLen * 2); - - d[1] = p->hashNumAvail; - - if (p->failure_BT) - { - // printf("\n == 1 BtGetMatches() p->failure_BT\n"); - d[0] = 0; - // d[1] = 0; - return; - } - - while (curPos < limit) - { - if (p->hashBufPos == p->hashBufPosLimit) - { - // MatchFinderMt_GetNextBlock_Hash(p); - UInt32 avail; - { - const UInt32 bi = MtSync_GetNextBlock(&p->hashSync); - const UInt32 k = GET_HASH_BLOCK_OFFSET(bi); - const UInt32 *h = p->hashBuf + k; - avail = h[1]; - p->hashBufPosLimit = k + h[0]; - p->hashNumAvail = avail; - p->hashBufPos = k + 2; - } - - { - /* we must prevent UInt32 overflow for avail total value, - if avail was increased with new hash block */ - UInt32 availSum = numProcessed + avail; - if (availSum < numProcessed) - availSum = (UInt32)(Int32)-1; - d[1] = availSum; - } - - if (avail >= p->numHashBytes) - continue; - - // if (p->hashBufPos != p->hashBufPosLimit) exit(1); - - /* (avail < p->numHashBytes) - It means that stream was finished. - And (avail) - is a number of remaining bytes, - we fill (d) for (avail) bytes for LZ_THREAD (receiver). - but we don't update (p->pos) and (p->cyclicBufferPos) here in BT_THREAD */ - - /* here we suppose that we have space enough: - (kMtBtBlockSize - curPos >= p->hashNumAvail) */ - p->hashNumAvail = 0; - d[0] = curPos + avail; - d += curPos; - for (; avail != 0; avail--) - *d++ = 0; - return; - } - { - UInt32 size = p->hashBufPosLimit - p->hashBufPos; - UInt32 pos = p->pos; - UInt32 cyclicBufferPos = p->cyclicBufferPos; - UInt32 lenLimit = p->matchMaxLen; - if (lenLimit >= p->hashNumAvail) - lenLimit = p->hashNumAvail; - { - UInt32 size2 = p->hashNumAvail - lenLimit + 1; - if (size2 < size) - size = size2; - size2 = p->cyclicBufferSize - cyclicBufferPos; - if (size2 < size) - size = size2; - } - - if (pos > (UInt32)kMtMaxValForNormalize - size) - { - const UInt32 subValue = (pos - p->cyclicBufferSize); // & ~(UInt32)(kNormalizeAlign - 1); - pos -= subValue; - p->pos = pos; - MatchFinder_Normalize3(subValue, p->son, (size_t)p->cyclicBufferSize * 2); - } - - #ifndef MFMT_GM_INLINE - while (curPos < limit && size-- != 0) - { - UInt32 *startDistances = d + curPos; - UInt32 num = (UInt32)(GetMatchesSpec1(lenLimit, pos - p->hashBuf[p->hashBufPos++], - pos, p->buffer, p->son, cyclicBufferPos, p->cyclicBufferSize, p->cutValue, - startDistances + 1, p->numHashBytes - 1) - startDistances); - *startDistances = num - 1; - curPos += num; - cyclicBufferPos++; - pos++; - p->buffer++; - } - #else - { - UInt32 posRes = pos; - const UInt32 *d_end; - { - d_end = GetMatchesSpecN_2( - p->buffer + lenLimit - 1, - pos, p->buffer, p->son, p->cutValue, d + curPos, - p->numHashBytes - 1, p->hashBuf + p->hashBufPos, - d + limit, p->hashBuf + p->hashBufPos + size, - cyclicBufferPos, p->cyclicBufferSize, - &posRes); - } - { - if (!d_end) - { - // printf("\n == 2 BtGetMatches() p->failure_BT\n"); - // internal data failure - p->failure_BT = True; - d[0] = 0; - // d[1] = 0; - return; - } - } - curPos = (UInt32)(d_end - d); - { - const UInt32 processed = posRes - pos; - pos = posRes; - p->hashBufPos += processed; - cyclicBufferPos += processed; - p->buffer += processed; - } - } - #endif - - { - const UInt32 processed = pos - p->pos; - numProcessed += processed; - p->hashNumAvail -= processed; - p->pos = pos; - } - if (cyclicBufferPos == p->cyclicBufferSize) - cyclicBufferPos = 0; - p->cyclicBufferPos = cyclicBufferPos; - } - } - - d[0] = curPos; -} - - -static void BtFillBlock(CMatchFinderMt *p, UInt32 globalBlockIndex) -{ - CMtSync *sync = &p->hashSync; - - BUFFER_MUST_BE_UNLOCKED(sync) - - if (!sync->needStart) - { - LOCK_BUFFER(sync) - } - - BtGetMatches(p, p->btBuf + GET_BT_BLOCK_OFFSET(globalBlockIndex)); - - /* We suppose that we have called GetNextBlock() from start. - So buffer is LOCKED */ - - UNLOCK_BUFFER(sync) -} - - -Z7_NO_INLINE -static void BtThreadFunc(CMatchFinderMt *mt) -{ - CMtSync *p = &mt->btSync; - for (;;) - { - UInt32 blockIndex = 0; - Event_Wait(&p->canStart); - - for (;;) - { - PRF(printf(" BT thread block = %d pos = %d\n", (unsigned)blockIndex, mt->pos)); - /* (p->exit == true) is possible after (p->canStart) at first loop iteration - and is unexpected after more Wait(freeSemaphore) iterations */ - if (p->exit) - return; - - Semaphore_Wait(&p->freeSemaphore); - - // for faster stop : we check (p->stopWriting) after Wait(freeSemaphore) - if (p->stopWriting) - break; - - BtFillBlock(mt, blockIndex++); - - Semaphore_Release1(&p->filledSemaphore); - } - - // we stop HASH_THREAD here - MtSync_StopWriting(&mt->hashSync); - - // p->numBlocks_Sent = blockIndex; - Event_Set(&p->wasStopped); - } -} - - -void MatchFinderMt_Construct(CMatchFinderMt *p) -{ - p->hashBuf = NULL; - MtSync_Construct(&p->hashSync); - MtSync_Construct(&p->btSync); -} - -static void MatchFinderMt_FreeMem(CMatchFinderMt *p, ISzAllocPtr alloc) -{ - ISzAlloc_Free(alloc, p->hashBuf); - p->hashBuf = NULL; -} - -void MatchFinderMt_Destruct(CMatchFinderMt *p, ISzAllocPtr alloc) -{ - /* - HASH_THREAD can use CriticalSection(s) btSync.cs and hashSync.cs. - So we must be sure that HASH_THREAD will not use CriticalSection(s) - after deleting CriticalSection here. - - we call ReleaseStream(p) - that calls StopWriting(btSync) - that calls StopWriting(hashSync), if it's required to stop HASH_THREAD. - after StopWriting() it's safe to destruct MtSync(s) in any order */ - - MatchFinderMt_ReleaseStream(p); - - MtSync_Destruct(&p->btSync); - MtSync_Destruct(&p->hashSync); - - LOG_ITER( - printf("\nTree %9d * %7d iter = %9d = sum : bytes = %9d\n", - (UInt32)(g_NumIters_Tree / 1000), - (UInt32)(((UInt64)g_NumIters_Loop * 1000) / (g_NumIters_Tree + 1)), - (UInt32)(g_NumIters_Loop / 1000), - (UInt32)(g_NumIters_Bytes / 1000) - )); - - MatchFinderMt_FreeMem(p, alloc); -} - - -#define kHashBufferSize (kMtHashBlockSize * kMtHashNumBlocks) -#define kBtBufferSize (kMtBtBlockSize * kMtBtNumBlocks) - - -static THREAD_FUNC_DECL HashThreadFunc2(void *p) { HashThreadFunc((CMatchFinderMt *)p); return 0; } -static THREAD_FUNC_DECL BtThreadFunc2(void *p) -{ - Byte allocaDummy[0x180]; - unsigned i = 0; - for (i = 0; i < 16; i++) - allocaDummy[i] = (Byte)0; - if (allocaDummy[0] == 0) - BtThreadFunc((CMatchFinderMt *)p); - return 0; -} - - -SRes MatchFinderMt_Create(CMatchFinderMt *p, UInt32 historySize, UInt32 keepAddBufferBefore, - UInt32 matchMaxLen, UInt32 keepAddBufferAfter, ISzAllocPtr alloc) -{ - CMatchFinder *mf = MF(p); - p->historySize = historySize; - if (kMtBtBlockSize <= matchMaxLen * 4) - return SZ_ERROR_PARAM; - if (!p->hashBuf) - { - p->hashBuf = (UInt32 *)ISzAlloc_Alloc(alloc, ((size_t)kHashBufferSize + (size_t)kBtBufferSize) * sizeof(UInt32)); - if (!p->hashBuf) - return SZ_ERROR_MEM; - p->btBuf = p->hashBuf + kHashBufferSize; - } - keepAddBufferBefore += (kHashBufferSize + kBtBufferSize); - keepAddBufferAfter += kMtHashBlockSize; - if (!MatchFinder_Create(mf, historySize, keepAddBufferBefore, matchMaxLen, keepAddBufferAfter, alloc)) - return SZ_ERROR_MEM; - - RINOK(MtSync_Create(&p->hashSync, HashThreadFunc2, p)) - RINOK(MtSync_Create(&p->btSync, BtThreadFunc2, p)) - return SZ_OK; -} - - -SRes MatchFinderMt_InitMt(CMatchFinderMt *p) -{ - RINOK(MtSync_Init(&p->hashSync, kMtHashNumBlocks)) - return MtSync_Init(&p->btSync, kMtBtNumBlocks); -} - - -static void MatchFinderMt_Init(CMatchFinderMt *p) -{ - CMatchFinder *mf = MF(p); - - p->btBufPos = - p->btBufPosLimit = NULL; - p->hashBufPos = - p->hashBufPosLimit = 0; - p->hashNumAvail = 0; // 21.03 - - p->failure_BT = False; - - /* Init without data reading. We don't want to read data in this thread */ - MatchFinder_Init_4(mf); - - MatchFinder_Init_LowHash(mf); - - p->pointerToCurPos = Inline_MatchFinder_GetPointerToCurrentPos(mf); - p->btNumAvailBytes = 0; - p->failure_LZ_BT = False; - // p->failure_LZ_LZ = False; - - p->lzPos = - 1; // optimal smallest value - // 0; // for debug: ignores match to start - // kNormalizeAlign; // for debug - - p->hash = mf->hash; - p->fixedHashSize = mf->fixedHashSize; - // p->hash4Mask = mf->hash4Mask; - p->crc = mf->crc; - // memcpy(p->crc, mf->crc, sizeof(mf->crc)); - - p->son = mf->son; - p->matchMaxLen = mf->matchMaxLen; - p->numHashBytes = mf->numHashBytes; - - /* (mf->pos) and (mf->streamPos) were already initialized to 1 in MatchFinder_Init_4() */ - // mf->streamPos = mf->pos = 1; // optimal smallest value - // 0; // for debug: ignores match to start - // kNormalizeAlign; // for debug - - /* we must init (p->pos = mf->pos) for BT, because - BT code needs (p->pos == delta_value_for_empty_hash_record == mf->pos) */ - p->pos = mf->pos; // do not change it - - p->cyclicBufferPos = (p->pos - CYC_TO_POS_OFFSET); - p->cyclicBufferSize = mf->cyclicBufferSize; - p->buffer = mf->buffer; - p->cutValue = mf->cutValue; - // p->son[0] = p->son[1] = 0; // unused: to init skipped record for speculated accesses. -} - - -/* ReleaseStream is required to finish multithreading */ -void MatchFinderMt_ReleaseStream(CMatchFinderMt *p) -{ - // Sleep(1); // for debug - MtSync_StopWriting(&p->btSync); - // Sleep(200); // for debug - /* p->MatchFinder->ReleaseStream(); */ -} - - -Z7_NO_INLINE -static UInt32 MatchFinderMt_GetNextBlock_Bt(CMatchFinderMt *p) -{ - if (p->failure_LZ_BT) - p->btBufPos = p->failureBuf; - else - { - const UInt32 bi = MtSync_GetNextBlock(&p->btSync); - const UInt32 *bt = p->btBuf + GET_BT_BLOCK_OFFSET(bi); - { - const UInt32 numItems = bt[0]; - p->btBufPosLimit = bt + numItems; - p->btNumAvailBytes = bt[1]; - p->btBufPos = bt + 2; - if (numItems < 2 || numItems > kMtBtBlockSize) - { - p->failureBuf[0] = 0; - p->btBufPos = p->failureBuf; - p->btBufPosLimit = p->failureBuf + 1; - p->failure_LZ_BT = True; - // p->btNumAvailBytes = 0; - /* we don't want to decrease AvailBytes, that was load before. - that can be unxepected for the code that have loaded anopther value before */ - } - } - - if (p->lzPos >= (UInt32)kMtMaxValForNormalize - (UInt32)kMtBtBlockSize) - { - /* we don't check (lzPos) over exact avail bytes in (btBuf). - (fixedHashSize) is small, so normalization is fast */ - const UInt32 subValue = (p->lzPos - p->historySize - 1); // & ~(UInt32)(kNormalizeAlign - 1); - p->lzPos -= subValue; - MatchFinder_Normalize3(subValue, p->hash, p->fixedHashSize); - } - } - return p->btNumAvailBytes; -} - - - -static const Byte * MatchFinderMt_GetPointerToCurrentPos(CMatchFinderMt *p) -{ - return p->pointerToCurPos; -} - - -#define GET_NEXT_BLOCK_IF_REQUIRED if (p->btBufPos == p->btBufPosLimit) MatchFinderMt_GetNextBlock_Bt(p); - - -static UInt32 MatchFinderMt_GetNumAvailableBytes(CMatchFinderMt *p) -{ - if (p->btBufPos != p->btBufPosLimit) - return p->btNumAvailBytes; - return MatchFinderMt_GetNextBlock_Bt(p); -} - - -// #define CHECK_FAILURE_LZ(_match_, _pos_) if (_match_ >= _pos_) { p->failure_LZ_LZ = True; return d; } -#define CHECK_FAILURE_LZ(_match_, _pos_) - -static UInt32 * MixMatches2(CMatchFinderMt *p, UInt32 matchMinPos, UInt32 *d) -{ - UInt32 h2, c2; - UInt32 *hash = p->hash; - const Byte *cur = p->pointerToCurPos; - const UInt32 m = p->lzPos; - MT_HASH2_CALC - - c2 = hash[h2]; - hash[h2] = m; - - if (c2 >= matchMinPos) - { - CHECK_FAILURE_LZ(c2, m) - if (cur[(ptrdiff_t)c2 - (ptrdiff_t)m] == cur[0]) - { - *d++ = 2; - *d++ = m - c2 - 1; - } - } - - return d; -} - -static UInt32 * MixMatches3(CMatchFinderMt *p, UInt32 matchMinPos, UInt32 *d) -{ - UInt32 h2, h3, c2, c3; - UInt32 *hash = p->hash; - const Byte *cur = p->pointerToCurPos; - const UInt32 m = p->lzPos; - MT_HASH3_CALC - - c2 = hash[h2]; - c3 = (hash + kFix3HashSize)[h3]; - - hash[h2] = m; - (hash + kFix3HashSize)[h3] = m; - - if (c2 >= matchMinPos) - { - CHECK_FAILURE_LZ(c2, m) - if (cur[(ptrdiff_t)c2 - (ptrdiff_t)m] == cur[0]) - { - d[1] = m - c2 - 1; - if (cur[(ptrdiff_t)c2 - (ptrdiff_t)m + 2] == cur[2]) - { - d[0] = 3; - return d + 2; - } - d[0] = 2; - d += 2; - } - } - - if (c3 >= matchMinPos) - { - CHECK_FAILURE_LZ(c3, m) - if (cur[(ptrdiff_t)c3 - (ptrdiff_t)m] == cur[0]) - { - *d++ = 3; - *d++ = m - c3 - 1; - } - } - - return d; -} - - -#define INCREASE_LZ_POS p->lzPos++; p->pointerToCurPos++; - -/* -static -UInt32* MatchFinderMt_GetMatches_Bt4(CMatchFinderMt *p, UInt32 *d) -{ - const UInt32 *bt = p->btBufPos; - const UInt32 len = *bt++; - const UInt32 *btLim = bt + len; - UInt32 matchMinPos; - UInt32 avail = p->btNumAvailBytes - 1; - p->btBufPos = btLim; - - { - p->btNumAvailBytes = avail; - - #define BT_HASH_BYTES_MAX 5 - - matchMinPos = p->lzPos; - - if (len != 0) - matchMinPos -= bt[1]; - else if (avail < (BT_HASH_BYTES_MAX - 1) - 1) - { - INCREASE_LZ_POS - return d; - } - else - { - const UInt32 hs = p->historySize; - if (matchMinPos > hs) - matchMinPos -= hs; - else - matchMinPos = 1; - } - } - - for (;;) - { - - UInt32 h2, h3, c2, c3; - UInt32 *hash = p->hash; - const Byte *cur = p->pointerToCurPos; - UInt32 m = p->lzPos; - MT_HASH3_CALC - - c2 = hash[h2]; - c3 = (hash + kFix3HashSize)[h3]; - - hash[h2] = m; - (hash + kFix3HashSize)[h3] = m; - - if (c2 >= matchMinPos && cur[(ptrdiff_t)c2 - (ptrdiff_t)m] == cur[0]) - { - d[1] = m - c2 - 1; - if (cur[(ptrdiff_t)c2 - (ptrdiff_t)m + 2] == cur[2]) - { - d[0] = 3; - d += 2; - break; - } - // else - { - d[0] = 2; - d += 2; - } - } - if (c3 >= matchMinPos && cur[(ptrdiff_t)c3 - (ptrdiff_t)m] == cur[0]) - { - *d++ = 3; - *d++ = m - c3 - 1; - } - break; - } - - if (len != 0) - { - do - { - const UInt32 v0 = bt[0]; - const UInt32 v1 = bt[1]; - bt += 2; - d[0] = v0; - d[1] = v1; - d += 2; - } - while (bt != btLim); - } - INCREASE_LZ_POS - return d; -} -*/ - - -static UInt32 * MixMatches4(CMatchFinderMt *p, UInt32 matchMinPos, UInt32 *d) -{ - UInt32 h2, h3, /* h4, */ c2, c3 /* , c4 */; - UInt32 *hash = p->hash; - const Byte *cur = p->pointerToCurPos; - const UInt32 m = p->lzPos; - MT_HASH3_CALC - // MT_HASH4_CALC - c2 = hash[h2]; - c3 = (hash + kFix3HashSize)[h3]; - // c4 = (hash + kFix4HashSize)[h4]; - - hash[h2] = m; - (hash + kFix3HashSize)[h3] = m; - // (hash + kFix4HashSize)[h4] = m; - - // #define BT5_USE_H2 - // #ifdef BT5_USE_H2 - if (c2 >= matchMinPos && cur[(ptrdiff_t)c2 - (ptrdiff_t)m] == cur[0]) - { - d[1] = m - c2 - 1; - if (cur[(ptrdiff_t)c2 - (ptrdiff_t)m + 2] == cur[2]) - { - // d[0] = (cur[(ptrdiff_t)c2 - (ptrdiff_t)m + 3] == cur[3]) ? 4 : 3; - // return d + 2; - - if (cur[(ptrdiff_t)c2 - (ptrdiff_t)m + 3] == cur[3]) - { - d[0] = 4; - return d + 2; - } - d[0] = 3; - d += 2; - - #ifdef BT5_USE_H4 - if (c4 >= matchMinPos) - if ( - cur[(ptrdiff_t)c4 - (ptrdiff_t)m] == cur[0] && - cur[(ptrdiff_t)c4 - (ptrdiff_t)m + 3] == cur[3] - ) - { - *d++ = 4; - *d++ = m - c4 - 1; - } - #endif - return d; - } - d[0] = 2; - d += 2; - } - // #endif - - if (c3 >= matchMinPos && cur[(ptrdiff_t)c3 - (ptrdiff_t)m] == cur[0]) - { - d[1] = m - c3 - 1; - if (cur[(ptrdiff_t)c3 - (ptrdiff_t)m + 3] == cur[3]) - { - d[0] = 4; - return d + 2; - } - d[0] = 3; - d += 2; - } - - #ifdef BT5_USE_H4 - if (c4 >= matchMinPos) - if ( - cur[(ptrdiff_t)c4 - (ptrdiff_t)m] == cur[0] && - cur[(ptrdiff_t)c4 - (ptrdiff_t)m + 3] == cur[3] - ) - { - *d++ = 4; - *d++ = m - c4 - 1; - } - #endif - - return d; -} - - -static UInt32 * MatchFinderMt2_GetMatches(CMatchFinderMt *p, UInt32 *d) -{ - const UInt32 *bt = p->btBufPos; - const UInt32 len = *bt++; - const UInt32 *btLim = bt + len; - p->btBufPos = btLim; - p->btNumAvailBytes--; - INCREASE_LZ_POS - { - while (bt != btLim) - { - const UInt32 v0 = bt[0]; - const UInt32 v1 = bt[1]; - bt += 2; - d[0] = v0; - d[1] = v1; - d += 2; - } - } - return d; -} - - - -static UInt32 * MatchFinderMt_GetMatches(CMatchFinderMt *p, UInt32 *d) -{ - const UInt32 *bt = p->btBufPos; - UInt32 len = *bt++; - const UInt32 avail = p->btNumAvailBytes - 1; - p->btNumAvailBytes = avail; - p->btBufPos = bt + len; - if (len == 0) - { - #define BT_HASH_BYTES_MAX 5 - if (avail >= (BT_HASH_BYTES_MAX - 1) - 1) - { - UInt32 m = p->lzPos; - if (m > p->historySize) - m -= p->historySize; - else - m = 1; - d = p->MixMatchesFunc(p, m, d); - } - } - else - { - /* - first match pair from BinTree: (match_len, match_dist), - (match_len >= numHashBytes). - MixMatchesFunc() inserts only hash matches that are nearer than (match_dist) - */ - d = p->MixMatchesFunc(p, p->lzPos - bt[1], d); - // if (d) // check for failure - do - { - const UInt32 v0 = bt[0]; - const UInt32 v1 = bt[1]; - bt += 2; - d[0] = v0; - d[1] = v1; - d += 2; - } - while (len -= 2); - } - INCREASE_LZ_POS - return d; -} - -#define SKIP_HEADER2_MT do { GET_NEXT_BLOCK_IF_REQUIRED -#define SKIP_HEADER_MT(n) SKIP_HEADER2_MT if (p->btNumAvailBytes-- >= (n)) { const Byte *cur = p->pointerToCurPos; UInt32 *hash = p->hash; -#define SKIP_FOOTER_MT } INCREASE_LZ_POS p->btBufPos += (size_t)*p->btBufPos + 1; } while (--num != 0); - -static void MatchFinderMt0_Skip(CMatchFinderMt *p, UInt32 num) -{ - SKIP_HEADER2_MT { p->btNumAvailBytes--; - SKIP_FOOTER_MT -} - -static void MatchFinderMt2_Skip(CMatchFinderMt *p, UInt32 num) -{ - SKIP_HEADER_MT(2) - UInt32 h2; - MT_HASH2_CALC - hash[h2] = p->lzPos; - SKIP_FOOTER_MT -} - -static void MatchFinderMt3_Skip(CMatchFinderMt *p, UInt32 num) -{ - SKIP_HEADER_MT(3) - UInt32 h2, h3; - MT_HASH3_CALC - (hash + kFix3HashSize)[h3] = - hash[ h2] = - p->lzPos; - SKIP_FOOTER_MT -} - -/* -// MatchFinderMt4_Skip() is similar to MatchFinderMt3_Skip(). -// The difference is that MatchFinderMt3_Skip() updates hash for last 3 bytes of stream. - -static void MatchFinderMt4_Skip(CMatchFinderMt *p, UInt32 num) -{ - SKIP_HEADER_MT(4) - UInt32 h2, h3; // h4 - MT_HASH3_CALC - // MT_HASH4_CALC - // (hash + kFix4HashSize)[h4] = - (hash + kFix3HashSize)[h3] = - hash[ h2] = - p->lzPos; - SKIP_FOOTER_MT -} -*/ - -void MatchFinderMt_CreateVTable(CMatchFinderMt *p, IMatchFinder2 *vTable) -{ - vTable->Init = (Mf_Init_Func)MatchFinderMt_Init; - vTable->GetNumAvailableBytes = (Mf_GetNumAvailableBytes_Func)MatchFinderMt_GetNumAvailableBytes; - vTable->GetPointerToCurrentPos = (Mf_GetPointerToCurrentPos_Func)MatchFinderMt_GetPointerToCurrentPos; - vTable->GetMatches = (Mf_GetMatches_Func)MatchFinderMt_GetMatches; - - switch (MF(p)->numHashBytes) - { - case 2: - p->GetHeadsFunc = GetHeads2; - p->MixMatchesFunc = (Mf_Mix_Matches)NULL; - vTable->Skip = (Mf_Skip_Func)MatchFinderMt0_Skip; - vTable->GetMatches = (Mf_GetMatches_Func)MatchFinderMt2_GetMatches; - break; - case 3: - p->GetHeadsFunc = MF(p)->bigHash ? GetHeads3b : GetHeads3; - p->MixMatchesFunc = (Mf_Mix_Matches)MixMatches2; - vTable->Skip = (Mf_Skip_Func)MatchFinderMt2_Skip; - break; - case 4: - p->GetHeadsFunc = MF(p)->bigHash ? GetHeads4b : GetHeads4; - - // it's fast inline version of GetMatches() - // vTable->GetMatches = (Mf_GetMatches_Func)MatchFinderMt_GetMatches_Bt4; - - p->MixMatchesFunc = (Mf_Mix_Matches)MixMatches3; - vTable->Skip = (Mf_Skip_Func)MatchFinderMt3_Skip; - break; - default: - p->GetHeadsFunc = MF(p)->bigHash ? GetHeads5b : GetHeads5; - p->MixMatchesFunc = (Mf_Mix_Matches)MixMatches4; - vTable->Skip = - (Mf_Skip_Func)MatchFinderMt3_Skip; - // (Mf_Skip_Func)MatchFinderMt4_Skip; - break; - } -} - -#undef RINOK_THREAD -#undef PRF -#undef MF -#undef GetUi24hi_from32 -#undef LOCK_BUFFER -#undef UNLOCK_BUFFER diff --git a/extern/lzma/LzFindMt.h b/extern/lzma/LzFindMt.h deleted file mode 100644 index db5923ea05b..00000000000 --- a/extern/lzma/LzFindMt.h +++ /dev/null @@ -1,109 +0,0 @@ -/* LzFindMt.h -- multithreaded Match finder for LZ algorithms -2023-03-05 : Igor Pavlov : Public domain */ - -#ifndef ZIP7_INC_LZ_FIND_MT_H -#define ZIP7_INC_LZ_FIND_MT_H - -#include "LzFind.h" -#include "Threads.h" - -EXTERN_C_BEGIN - -typedef struct -{ - UInt32 numProcessedBlocks; - CThread thread; - UInt64 affinity; - - BoolInt wasCreated; - BoolInt needStart; - BoolInt csWasInitialized; - BoolInt csWasEntered; - - BoolInt exit; - BoolInt stopWriting; - - CAutoResetEvent canStart; - CAutoResetEvent wasStopped; - CSemaphore freeSemaphore; - CSemaphore filledSemaphore; - CCriticalSection cs; - // UInt32 numBlocks_Sent; -} CMtSync; - -typedef UInt32 * (*Mf_Mix_Matches)(void *p, UInt32 matchMinPos, UInt32 *distances); - -/* kMtCacheLineDummy must be >= size_of_CPU_cache_line */ -#define kMtCacheLineDummy 128 - -typedef void (*Mf_GetHeads)(const Byte *buffer, UInt32 pos, - UInt32 *hash, UInt32 hashMask, UInt32 *heads, UInt32 numHeads, const UInt32 *crc); - -typedef struct -{ - /* LZ */ - const Byte *pointerToCurPos; - UInt32 *btBuf; - const UInt32 *btBufPos; - const UInt32 *btBufPosLimit; - UInt32 lzPos; - UInt32 btNumAvailBytes; - - UInt32 *hash; - UInt32 fixedHashSize; - // UInt32 hash4Mask; - UInt32 historySize; - const UInt32 *crc; - - Mf_Mix_Matches MixMatchesFunc; - UInt32 failure_LZ_BT; // failure in BT transfered to LZ - // UInt32 failure_LZ_LZ; // failure in LZ tables - UInt32 failureBuf[1]; - // UInt32 crc[256]; - - /* LZ + BT */ - CMtSync btSync; - Byte btDummy[kMtCacheLineDummy]; - - /* BT */ - UInt32 *hashBuf; - UInt32 hashBufPos; - UInt32 hashBufPosLimit; - UInt32 hashNumAvail; - UInt32 failure_BT; - - - CLzRef *son; - UInt32 matchMaxLen; - UInt32 numHashBytes; - UInt32 pos; - const Byte *buffer; - UInt32 cyclicBufferPos; - UInt32 cyclicBufferSize; /* it must be = (historySize + 1) */ - UInt32 cutValue; - - /* BT + Hash */ - CMtSync hashSync; - /* Byte hashDummy[kMtCacheLineDummy]; */ - - /* Hash */ - Mf_GetHeads GetHeadsFunc; - CMatchFinder *MatchFinder; - // CMatchFinder MatchFinder; -} CMatchFinderMt; - -// only for Mt part -void MatchFinderMt_Construct(CMatchFinderMt *p); -void MatchFinderMt_Destruct(CMatchFinderMt *p, ISzAllocPtr alloc); - -SRes MatchFinderMt_Create(CMatchFinderMt *p, UInt32 historySize, UInt32 keepAddBufferBefore, - UInt32 matchMaxLen, UInt32 keepAddBufferAfter, ISzAllocPtr alloc); -void MatchFinderMt_CreateVTable(CMatchFinderMt *p, IMatchFinder2 *vTable); - -/* call MatchFinderMt_InitMt() before IMatchFinder::Init() */ -SRes MatchFinderMt_InitMt(CMatchFinderMt *p); -void MatchFinderMt_ReleaseStream(CMatchFinderMt *p); - -EXTERN_C_END - -#endif diff --git a/extern/lzma/LzFindOpt.c b/extern/lzma/LzFindOpt.c deleted file mode 100644 index 85bdc136d67..00000000000 --- a/extern/lzma/LzFindOpt.c +++ /dev/null @@ -1,578 +0,0 @@ -/* LzFindOpt.c -- multithreaded Match finder for LZ algorithms -2023-04-02 : Igor Pavlov : Public domain */ - -#include "Precomp.h" - -#include "CpuArch.h" -#include "LzFind.h" - -// #include "LzFindMt.h" - -// #define LOG_ITERS - -// #define LOG_THREAD - -#ifdef LOG_THREAD -#include -#define PRF(x) x -#else -// #define PRF(x) -#endif - -#ifdef LOG_ITERS -#include -UInt64 g_NumIters_Tree; -UInt64 g_NumIters_Loop; -UInt64 g_NumIters_Bytes; -#define LOG_ITER(x) x -#else -#define LOG_ITER(x) -#endif - -// ---------- BT THREAD ---------- - -#define USE_SON_PREFETCH -#define USE_LONG_MATCH_OPT - -#define kEmptyHashValue 0 - -// #define CYC_TO_POS_OFFSET 0 - -// #define CYC_TO_POS_OFFSET 1 // for debug - -/* -Z7_NO_INLINE -UInt32 * Z7_FASTCALL GetMatchesSpecN_1(const Byte *lenLimit, size_t pos, const Byte *cur, CLzRef *son, - UInt32 _cutValue, UInt32 *d, size_t _maxLen, const UInt32 *hash, const UInt32 *limit, const UInt32 *size, UInt32 *posRes) -{ - do - { - UInt32 delta; - if (hash == size) - break; - delta = *hash++; - - if (delta == 0 || delta > (UInt32)pos) - return NULL; - - lenLimit++; - - if (delta == (UInt32)pos) - { - CLzRef *ptr1 = son + ((size_t)pos << 1) - CYC_TO_POS_OFFSET * 2; - *d++ = 0; - ptr1[0] = kEmptyHashValue; - ptr1[1] = kEmptyHashValue; - } -else -{ - UInt32 *_distances = ++d; - - CLzRef *ptr0 = son + ((size_t)(pos) << 1) - CYC_TO_POS_OFFSET * 2 + 1; - CLzRef *ptr1 = son + ((size_t)(pos) << 1) - CYC_TO_POS_OFFSET * 2; - - const Byte *len0 = cur, *len1 = cur; - UInt32 cutValue = _cutValue; - const Byte *maxLen = cur + _maxLen; - - for (LOG_ITER(g_NumIters_Tree++);;) - { - LOG_ITER(g_NumIters_Loop++); - { - const ptrdiff_t diff = (ptrdiff_t)0 - (ptrdiff_t)delta; - CLzRef *pair = son + ((size_t)(((ptrdiff_t)pos - CYC_TO_POS_OFFSET) + diff) << 1); - const Byte *len = (len0 < len1 ? len0 : len1); - - #ifdef USE_SON_PREFETCH - const UInt32 pair0 = *pair; - #endif - - if (len[diff] == len[0]) - { - if (++len != lenLimit && len[diff] == len[0]) - while (++len != lenLimit) - { - LOG_ITER(g_NumIters_Bytes++); - if (len[diff] != len[0]) - break; - } - if (maxLen < len) - { - maxLen = len; - *d++ = (UInt32)(len - cur); - *d++ = delta - 1; - - if (len == lenLimit) - { - const UInt32 pair1 = pair[1]; - *ptr1 = - #ifdef USE_SON_PREFETCH - pair0; - #else - pair[0]; - #endif - *ptr0 = pair1; - - _distances[-1] = (UInt32)(d - _distances); - - #ifdef USE_LONG_MATCH_OPT - - if (hash == size || *hash != delta || lenLimit[diff] != lenLimit[0] || d >= limit) - break; - - { - for (;;) - { - hash++; - pos++; - cur++; - lenLimit++; - { - CLzRef *ptr = son + ((size_t)(pos) << 1) - CYC_TO_POS_OFFSET * 2; - #if 0 - *(UInt64 *)(void *)ptr = ((const UInt64 *)(const void *)ptr)[diff]; - #else - const UInt32 p0 = ptr[0 + (diff * 2)]; - const UInt32 p1 = ptr[1 + (diff * 2)]; - ptr[0] = p0; - ptr[1] = p1; - // ptr[0] = ptr[0 + (diff * 2)]; - // ptr[1] = ptr[1 + (diff * 2)]; - #endif - } - // PrintSon(son + 2, pos - 1); - // printf("\npos = %x delta = %x\n", pos, delta); - len++; - *d++ = 2; - *d++ = (UInt32)(len - cur); - *d++ = delta - 1; - if (hash == size || *hash != delta || lenLimit[diff] != lenLimit[0] || d >= limit) - break; - } - } - #endif - - break; - } - } - } - - { - const UInt32 curMatch = (UInt32)pos - delta; // (UInt32)(pos + diff); - if (len[diff] < len[0]) - { - delta = pair[1]; - if (delta >= curMatch) - return NULL; - *ptr1 = curMatch; - ptr1 = pair + 1; - len1 = len; - } - else - { - delta = *pair; - if (delta >= curMatch) - return NULL; - *ptr0 = curMatch; - ptr0 = pair; - len0 = len; - } - - delta = (UInt32)pos - delta; - - if (--cutValue == 0 || delta >= pos) - { - *ptr0 = *ptr1 = kEmptyHashValue; - _distances[-1] = (UInt32)(d - _distances); - break; - } - } - } - } // for (tree iterations) -} - pos++; - cur++; - } - while (d < limit); - *posRes = (UInt32)pos; - return d; -} -*/ - -/* define cbs if you use 2 functions. - GetMatchesSpecN_1() : (pos < _cyclicBufferSize) - GetMatchesSpecN_2() : (pos >= _cyclicBufferSize) - - do not define cbs if you use 1 function: - GetMatchesSpecN_2() -*/ - -// #define cbs _cyclicBufferSize - -/* - we use size_t for (pos) and (_cyclicBufferPos_ instead of UInt32 - to eliminate "movsx" BUG in old MSVC x64 compiler. -*/ - -UInt32 * Z7_FASTCALL GetMatchesSpecN_2(const Byte *lenLimit, size_t pos, const Byte *cur, CLzRef *son, - UInt32 _cutValue, UInt32 *d, size_t _maxLen, const UInt32 *hash, const UInt32 *limit, const UInt32 *size, - size_t _cyclicBufferPos, UInt32 _cyclicBufferSize, - UInt32 *posRes); - -Z7_NO_INLINE -UInt32 * Z7_FASTCALL GetMatchesSpecN_2(const Byte *lenLimit, size_t pos, const Byte *cur, CLzRef *son, - UInt32 _cutValue, UInt32 *d, size_t _maxLen, const UInt32 *hash, const UInt32 *limit, const UInt32 *size, - size_t _cyclicBufferPos, UInt32 _cyclicBufferSize, - UInt32 *posRes) -{ - do // while (hash != size) - { - UInt32 delta; - - #ifndef cbs - UInt32 cbs; - #endif - - if (hash == size) - break; - - delta = *hash++; - - if (delta == 0) - return NULL; - - lenLimit++; - - #ifndef cbs - cbs = _cyclicBufferSize; - if ((UInt32)pos < cbs) - { - if (delta > (UInt32)pos) - return NULL; - cbs = (UInt32)pos; - } - #endif - - if (delta >= cbs) - { - CLzRef *ptr1 = son + ((size_t)_cyclicBufferPos << 1); - *d++ = 0; - ptr1[0] = kEmptyHashValue; - ptr1[1] = kEmptyHashValue; - } -else -{ - UInt32 *_distances = ++d; - - CLzRef *ptr0 = son + ((size_t)_cyclicBufferPos << 1) + 1; - CLzRef *ptr1 = son + ((size_t)_cyclicBufferPos << 1); - - UInt32 cutValue = _cutValue; - const Byte *len0 = cur, *len1 = cur; - const Byte *maxLen = cur + _maxLen; - - // if (cutValue == 0) { *ptr0 = *ptr1 = kEmptyHashValue; } else - for (LOG_ITER(g_NumIters_Tree++);;) - { - LOG_ITER(g_NumIters_Loop++); - { - // SPEC code - CLzRef *pair = son + ((size_t)((ptrdiff_t)_cyclicBufferPos - (ptrdiff_t)delta - + (ptrdiff_t)(UInt32)(_cyclicBufferPos < delta ? cbs : 0) - ) << 1); - - const ptrdiff_t diff = (ptrdiff_t)0 - (ptrdiff_t)delta; - const Byte *len = (len0 < len1 ? len0 : len1); - - #ifdef USE_SON_PREFETCH - const UInt32 pair0 = *pair; - #endif - - if (len[diff] == len[0]) - { - if (++len != lenLimit && len[diff] == len[0]) - while (++len != lenLimit) - { - LOG_ITER(g_NumIters_Bytes++); - if (len[diff] != len[0]) - break; - } - if (maxLen < len) - { - maxLen = len; - *d++ = (UInt32)(len - cur); - *d++ = delta - 1; - - if (len == lenLimit) - { - const UInt32 pair1 = pair[1]; - *ptr1 = - #ifdef USE_SON_PREFETCH - pair0; - #else - pair[0]; - #endif - *ptr0 = pair1; - - _distances[-1] = (UInt32)(d - _distances); - - #ifdef USE_LONG_MATCH_OPT - - if (hash == size || *hash != delta || lenLimit[diff] != lenLimit[0] || d >= limit) - break; - - { - for (;;) - { - *d++ = 2; - *d++ = (UInt32)(lenLimit - cur); - *d++ = delta - 1; - cur++; - lenLimit++; - // SPEC - _cyclicBufferPos++; - { - // SPEC code - CLzRef *dest = son + ((size_t)(_cyclicBufferPos) << 1); - const CLzRef *src = dest + ((diff - + (ptrdiff_t)(UInt32)((_cyclicBufferPos < delta) ? cbs : 0)) << 1); - // CLzRef *ptr = son + ((size_t)(pos) << 1) - CYC_TO_POS_OFFSET * 2; - #if 0 - *(UInt64 *)(void *)dest = *((const UInt64 *)(const void *)src); - #else - const UInt32 p0 = src[0]; - const UInt32 p1 = src[1]; - dest[0] = p0; - dest[1] = p1; - #endif - } - pos++; - hash++; - if (hash == size || *hash != delta || lenLimit[diff] != lenLimit[0] || d >= limit) - break; - } // for() end for long matches - } - #endif - - break; // break from TREE iterations - } - } - } - { - const UInt32 curMatch = (UInt32)pos - delta; // (UInt32)(pos + diff); - if (len[diff] < len[0]) - { - delta = pair[1]; - *ptr1 = curMatch; - ptr1 = pair + 1; - len1 = len; - if (delta >= curMatch) - return NULL; - } - else - { - delta = *pair; - *ptr0 = curMatch; - ptr0 = pair; - len0 = len; - if (delta >= curMatch) - return NULL; - } - delta = (UInt32)pos - delta; - - if (--cutValue == 0 || delta >= cbs) - { - *ptr0 = *ptr1 = kEmptyHashValue; - _distances[-1] = (UInt32)(d - _distances); - break; - } - } - } - } // for (tree iterations) -} - pos++; - _cyclicBufferPos++; - cur++; - } - while (d < limit); - *posRes = (UInt32)pos; - return d; -} - - - -/* -typedef UInt32 uint32plus; // size_t - -UInt32 * Z7_FASTCALL GetMatchesSpecN_3(uint32plus lenLimit, size_t pos, const Byte *cur, CLzRef *son, - UInt32 _cutValue, UInt32 *d, uint32plus _maxLen, const UInt32 *hash, const UInt32 *limit, const UInt32 *size, - size_t _cyclicBufferPos, UInt32 _cyclicBufferSize, - UInt32 *posRes) -{ - do // while (hash != size) - { - UInt32 delta; - - #ifndef cbs - UInt32 cbs; - #endif - - if (hash == size) - break; - - delta = *hash++; - - if (delta == 0) - return NULL; - - #ifndef cbs - cbs = _cyclicBufferSize; - if ((UInt32)pos < cbs) - { - if (delta > (UInt32)pos) - return NULL; - cbs = (UInt32)pos; - } - #endif - - if (delta >= cbs) - { - CLzRef *ptr1 = son + ((size_t)_cyclicBufferPos << 1); - *d++ = 0; - ptr1[0] = kEmptyHashValue; - ptr1[1] = kEmptyHashValue; - } -else -{ - CLzRef *ptr0 = son + ((size_t)_cyclicBufferPos << 1) + 1; - CLzRef *ptr1 = son + ((size_t)_cyclicBufferPos << 1); - UInt32 *_distances = ++d; - uint32plus len0 = 0, len1 = 0; - UInt32 cutValue = _cutValue; - uint32plus maxLen = _maxLen; - // lenLimit++; // const Byte *lenLimit = cur + _lenLimit; - - for (LOG_ITER(g_NumIters_Tree++);;) - { - LOG_ITER(g_NumIters_Loop++); - { - // const ptrdiff_t diff = (ptrdiff_t)0 - (ptrdiff_t)delta; - CLzRef *pair = son + ((size_t)((ptrdiff_t)_cyclicBufferPos - delta - + (ptrdiff_t)(UInt32)(_cyclicBufferPos < delta ? cbs : 0) - ) << 1); - const Byte *pb = cur - delta; - uint32plus len = (len0 < len1 ? len0 : len1); - - #ifdef USE_SON_PREFETCH - const UInt32 pair0 = *pair; - #endif - - if (pb[len] == cur[len]) - { - if (++len != lenLimit && pb[len] == cur[len]) - while (++len != lenLimit) - if (pb[len] != cur[len]) - break; - if (maxLen < len) - { - maxLen = len; - *d++ = (UInt32)len; - *d++ = delta - 1; - if (len == lenLimit) - { - { - const UInt32 pair1 = pair[1]; - *ptr0 = pair1; - *ptr1 = - #ifdef USE_SON_PREFETCH - pair0; - #else - pair[0]; - #endif - } - - _distances[-1] = (UInt32)(d - _distances); - - #ifdef USE_LONG_MATCH_OPT - - if (hash == size || *hash != delta || pb[lenLimit] != cur[lenLimit] || d >= limit) - break; - - { - const ptrdiff_t diff = (ptrdiff_t)0 - (ptrdiff_t)delta; - for (;;) - { - *d++ = 2; - *d++ = (UInt32)lenLimit; - *d++ = delta - 1; - _cyclicBufferPos++; - { - CLzRef *dest = son + ((size_t)_cyclicBufferPos << 1); - const CLzRef *src = dest + ((diff + - (ptrdiff_t)(UInt32)(_cyclicBufferPos < delta ? cbs : 0)) << 1); - #if 0 - *(UInt64 *)(void *)dest = *((const UInt64 *)(const void *)src); - #else - const UInt32 p0 = src[0]; - const UInt32 p1 = src[1]; - dest[0] = p0; - dest[1] = p1; - #endif - } - hash++; - pos++; - cur++; - pb++; - if (hash == size || *hash != delta || pb[lenLimit] != cur[lenLimit] || d >= limit) - break; - } - } - #endif - - break; - } - } - } - { - const UInt32 curMatch = (UInt32)pos - delta; - if (pb[len] < cur[len]) - { - delta = pair[1]; - *ptr1 = curMatch; - ptr1 = pair + 1; - len1 = len; - } - else - { - delta = *pair; - *ptr0 = curMatch; - ptr0 = pair; - len0 = len; - } - - { - if (delta >= curMatch) - return NULL; - delta = (UInt32)pos - delta; - if (delta >= cbs - // delta >= _cyclicBufferSize || delta >= pos - || --cutValue == 0) - { - *ptr0 = *ptr1 = kEmptyHashValue; - _distances[-1] = (UInt32)(d - _distances); - break; - } - } - } - } - } // for (tree iterations) -} - pos++; - _cyclicBufferPos++; - cur++; - } - while (d < limit); - *posRes = (UInt32)pos; - return d; -} -*/ diff --git a/extern/lzma/LzHash.h b/extern/lzma/LzHash.h index 2b6290b64c0..9f4173e7e33 100644 --- a/extern/lzma/LzHash.h +++ b/extern/lzma/LzHash.h @@ -1,34 +1,54 @@ -/* LzHash.h -- HASH constants for LZ algorithms -2023-03-05 : Igor Pavlov : Public domain */ +/* LzHash.h -- HASH functions for LZ algorithms +2008-10-04 : Igor Pavlov : Public domain */ -#ifndef ZIP7_INC_LZ_HASH_H -#define ZIP7_INC_LZ_HASH_H - -/* - (kHash2Size >= (1 << 8)) : Required - (kHash3Size >= (1 << 16)) : Required -*/ +#ifndef __LZHASH_H +#define __LZHASH_H #define kHash2Size (1 << 10) #define kHash3Size (1 << 16) -// #define kHash4Size (1 << 20) +#define kHash4Size (1 << 20) #define kFix3HashSize (kHash2Size) #define kFix4HashSize (kHash2Size + kHash3Size) -// #define kFix5HashSize (kHash2Size + kHash3Size + kHash4Size) +#define kFix5HashSize (kHash2Size + kHash3Size + kHash4Size) -/* - We use up to 3 crc values for hash: - crc0 - crc1 << Shift_1 - crc2 << Shift_2 - (Shift_1 = 5) and (Shift_2 = 10) is good tradeoff. - Small values for Shift are not good for collision rate. - Big value for Shift_2 increases the minimum size - of hash table, that will be slow for small files. -*/ +#define HASH2_CALC hashValue = cur[0] | ((UInt32)cur[1] << 8); -#define kLzHash_CrcShift_1 5 -#define kLzHash_CrcShift_2 10 +#define HASH3_CALC { \ + UInt32 temp = p->crc[cur[0]] ^ cur[1]; \ + hash2Value = temp & (kHash2Size - 1); \ + hashValue = (temp ^ ((UInt32)cur[2] << 8)) & p->hashMask; } + +#define HASH4_CALC { \ + UInt32 temp = p->crc[cur[0]] ^ cur[1]; \ + hash2Value = temp & (kHash2Size - 1); \ + hash3Value = (temp ^ ((UInt32)cur[2] << 8)) & (kHash3Size - 1); \ + hashValue = (temp ^ ((UInt32)cur[2] << 8) ^ (p->crc[cur[3]] << 5)) & p->hashMask; } + +#define HASH5_CALC { \ + UInt32 temp = p->crc[cur[0]] ^ cur[1]; \ + hash2Value = temp & (kHash2Size - 1); \ + hash3Value = (temp ^ ((UInt32)cur[2] << 8)) & (kHash3Size - 1); \ + hash4Value = (temp ^ ((UInt32)cur[2] << 8) ^ (p->crc[cur[3]] << 5)); \ + hashValue = (hash4Value ^ (p->crc[cur[4]] << 3)) & p->hashMask; \ + hash4Value &= (kHash4Size - 1); } + +/* #define HASH_ZIP_CALC hashValue = ((cur[0] | ((UInt32)cur[1] << 8)) ^ p->crc[cur[2]]) & 0xFFFF; */ +#define HASH_ZIP_CALC hashValue = ((cur[2] | ((UInt32)cur[0] << 8)) ^ p->crc[cur[1]]) & 0xFFFF; + + +#define MT_HASH2_CALC \ + hash2Value = (p->crc[cur[0]] ^ cur[1]) & (kHash2Size - 1); + +#define MT_HASH3_CALC { \ + UInt32 temp = p->crc[cur[0]] ^ cur[1]; \ + hash2Value = temp & (kHash2Size - 1); \ + hash3Value = (temp ^ ((UInt32)cur[2] << 8)) & (kHash3Size - 1); } + +#define MT_HASH4_CALC { \ + UInt32 temp = p->crc[cur[0]] ^ cur[1]; \ + hash2Value = temp & (kHash2Size - 1); \ + hash3Value = (temp ^ ((UInt32)cur[2] << 8)) & (kHash3Size - 1); \ + hash4Value = (temp ^ ((UInt32)cur[2] << 8) ^ (p->crc[cur[3]] << 5)) & (kHash4Size - 1); } #endif diff --git a/extern/lzma/LzmaDec.c b/extern/lzma/LzmaDec.c index 69bb8bba9d4..d87eb1914ea 100644 --- a/extern/lzma/LzmaDec.c +++ b/extern/lzma/LzmaDec.c @@ -1,107 +1,81 @@ /* LzmaDec.c -- LZMA Decoder -2023-04-07 : Igor Pavlov : Public domain */ +2008-11-06 : Igor Pavlov : Public domain */ -#include "Precomp.h" +#include "LzmaDec.h" #include -/* #include "CpuArch.h" */ -#include "LzmaDec.h" - -// #define kNumTopBits 24 -#define kTopValue ((UInt32)1 << 24) +#define kNumTopBits 24 +#define kTopValue ((UInt32)1 << kNumTopBits) #define kNumBitModelTotalBits 11 #define kBitModelTotal (1 << kNumBitModelTotalBits) +#define kNumMoveBits 5 #define RC_INIT_SIZE 5 -#ifndef Z7_LZMA_DEC_OPT - -#define kNumMoveBits 5 #define NORMALIZE if (range < kTopValue) { range <<= 8; code = (code << 8) | (*buf++); } -#define IF_BIT_0(p) ttt = *(p); NORMALIZE; bound = (range >> kNumBitModelTotalBits) * (UInt32)ttt; if (code < bound) +#define IF_BIT_0(p) ttt = *(p); NORMALIZE; bound = (range >> kNumBitModelTotalBits) * ttt; if (code < bound) #define UPDATE_0(p) range = bound; *(p) = (CLzmaProb)(ttt + ((kBitModelTotal - ttt) >> kNumMoveBits)); #define UPDATE_1(p) range -= bound; code -= bound; *(p) = (CLzmaProb)(ttt - (ttt >> kNumMoveBits)); #define GET_BIT2(p, i, A0, A1) IF_BIT_0(p) \ - { UPDATE_0(p) i = (i + i); A0; } else \ - { UPDATE_1(p) i = (i + i) + 1; A1; } - -#define TREE_GET_BIT(probs, i) { GET_BIT2(probs + i, i, ;, ;); } - -#define REV_BIT(p, i, A0, A1) IF_BIT_0(p + i) \ - { UPDATE_0(p + i) A0; } else \ - { UPDATE_1(p + i) A1; } -#define REV_BIT_VAR( p, i, m) REV_BIT(p, i, i += m; m += m, m += m; i += m; ) -#define REV_BIT_CONST(p, i, m) REV_BIT(p, i, i += m; , i += m * 2; ) -#define REV_BIT_LAST( p, i, m) REV_BIT(p, i, i -= m , ; ) + { UPDATE_0(p); i = (i + i); A0; } else \ + { UPDATE_1(p); i = (i + i) + 1; A1; } +#define GET_BIT(p, i) GET_BIT2(p, i, ; , ;) +#define TREE_GET_BIT(probs, i) { GET_BIT((probs + i), i); } #define TREE_DECODE(probs, limit, i) \ { i = 1; do { TREE_GET_BIT(probs, i); } while (i < limit); i -= limit; } -/* #define Z7_LZMA_SIZE_OPT */ +/* #define _LZMA_SIZE_OPT */ -#ifdef Z7_LZMA_SIZE_OPT +#ifdef _LZMA_SIZE_OPT #define TREE_6_DECODE(probs, i) TREE_DECODE(probs, (1 << 6), i) #else #define TREE_6_DECODE(probs, i) \ { i = 1; \ - TREE_GET_BIT(probs, i) \ - TREE_GET_BIT(probs, i) \ - TREE_GET_BIT(probs, i) \ - TREE_GET_BIT(probs, i) \ - TREE_GET_BIT(probs, i) \ - TREE_GET_BIT(probs, i) \ + TREE_GET_BIT(probs, i); \ + TREE_GET_BIT(probs, i); \ + TREE_GET_BIT(probs, i); \ + TREE_GET_BIT(probs, i); \ + TREE_GET_BIT(probs, i); \ + TREE_GET_BIT(probs, i); \ i -= 0x40; } #endif -#define NORMAL_LITER_DEC TREE_GET_BIT(prob, symbol) -#define MATCHED_LITER_DEC \ - matchByte += matchByte; \ - bit = offs; \ - offs &= matchByte; \ - probLit = prob + (offs + bit + symbol); \ - GET_BIT2(probLit, symbol, offs ^= bit; , ;) +#define NORMALIZE_CHECK if (range < kTopValue) { if (buf >= bufLimit) return DUMMY_ERROR; range <<= 8; code = (code << 8) | (*buf++); } -#endif // Z7_LZMA_DEC_OPT - - -#define NORMALIZE_CHECK if (range < kTopValue) { if (buf >= bufLimit) return DUMMY_INPUT_EOF; range <<= 8; code = (code << 8) | (*buf++); } - -#define IF_BIT_0_CHECK(p) ttt = *(p); NORMALIZE_CHECK bound = (range >> kNumBitModelTotalBits) * (UInt32)ttt; if (code < bound) +#define IF_BIT_0_CHECK(p) ttt = *(p); NORMALIZE_CHECK; bound = (range >> kNumBitModelTotalBits) * ttt; if (code < bound) #define UPDATE_0_CHECK range = bound; #define UPDATE_1_CHECK range -= bound; code -= bound; #define GET_BIT2_CHECK(p, i, A0, A1) IF_BIT_0_CHECK(p) \ - { UPDATE_0_CHECK i = (i + i); A0; } else \ - { UPDATE_1_CHECK i = (i + i) + 1; A1; } + { UPDATE_0_CHECK; i = (i + i); A0; } else \ + { UPDATE_1_CHECK; i = (i + i) + 1; A1; } #define GET_BIT_CHECK(p, i) GET_BIT2_CHECK(p, i, ; , ;) #define TREE_DECODE_CHECK(probs, limit, i) \ { i = 1; do { GET_BIT_CHECK(probs + i, i) } while (i < limit); i -= limit; } -#define REV_BIT_CHECK(p, i, m) IF_BIT_0_CHECK(p + i) \ - { UPDATE_0_CHECK i += m; m += m; } else \ - { UPDATE_1_CHECK m += m; i += m; } - - #define kNumPosBitsMax 4 #define kNumPosStatesMax (1 << kNumPosBitsMax) #define kLenNumLowBits 3 #define kLenNumLowSymbols (1 << kLenNumLowBits) +#define kLenNumMidBits 3 +#define kLenNumMidSymbols (1 << kLenNumMidBits) #define kLenNumHighBits 8 #define kLenNumHighSymbols (1 << kLenNumHighBits) -#define LenLow 0 -#define LenHigh (LenLow + 2 * (kNumPosStatesMax << kLenNumLowBits)) +#define LenChoice 0 +#define LenChoice2 (LenChoice + 1) +#define LenLow (LenChoice2 + 1) +#define LenMid (LenLow + (kNumPosStatesMax << kLenNumLowBits)) +#define LenHigh (LenMid + (kNumPosStatesMax << kLenNumMidBits)) #define kNumLenProbs (LenHigh + kLenNumHighSymbols) -#define LenChoice LenLow -#define LenChoice2 (LenLow + (1 << kLenNumLowBits)) #define kNumStates 12 -#define kNumStates2 16 #define kNumLitStates 7 #define kStartPosModelIndex 4 @@ -115,130 +89,60 @@ #define kAlignTableSize (1 << kNumAlignBits) #define kMatchMinLen 2 -#define kMatchSpecLenStart (kMatchMinLen + kLenNumLowSymbols * 2 + kLenNumHighSymbols) +#define kMatchSpecLenStart (kMatchMinLen + kLenNumLowSymbols + kLenNumMidSymbols + kLenNumHighSymbols) -#define kMatchSpecLen_Error_Data (1 << 9) -#define kMatchSpecLen_Error_Fail (kMatchSpecLen_Error_Data - 1) - -/* External ASM code needs same CLzmaProb array layout. So don't change it. */ - -/* (probs_1664) is faster and better for code size at some platforms */ -/* -#ifdef MY_CPU_X86_OR_AMD64 -*/ -#define kStartOffset 1664 -#define GET_PROBS p->probs_1664 -/* -#define GET_PROBS p->probs + kStartOffset -#else -#define kStartOffset 0 -#define GET_PROBS p->probs -#endif -*/ - -#define SpecPos (-kStartOffset) -#define IsRep0Long (SpecPos + kNumFullDistances) -#define RepLenCoder (IsRep0Long + (kNumStates2 << kNumPosBitsMax)) -#define LenCoder (RepLenCoder + kNumLenProbs) -#define IsMatch (LenCoder + kNumLenProbs) -#define Align (IsMatch + (kNumStates2 << kNumPosBitsMax)) -#define IsRep (Align + kAlignTableSize) +#define IsMatch 0 +#define IsRep (IsMatch + (kNumStates << kNumPosBitsMax)) #define IsRepG0 (IsRep + kNumStates) #define IsRepG1 (IsRepG0 + kNumStates) #define IsRepG2 (IsRepG1 + kNumStates) -#define PosSlot (IsRepG2 + kNumStates) -#define Literal (PosSlot + (kNumLenToPosStates << kNumPosSlotBits)) -#define NUM_BASE_PROBS (Literal + kStartOffset) +#define IsRep0Long (IsRepG2 + kNumStates) +#define PosSlot (IsRep0Long + (kNumStates << kNumPosBitsMax)) +#define SpecPos (PosSlot + (kNumLenToPosStates << kNumPosSlotBits)) +#define Align (SpecPos + kNumFullDistances - kEndPosModelIndex) +#define LenCoder (Align + kAlignTableSize) +#define RepLenCoder (LenCoder + kNumLenProbs) +#define Literal (RepLenCoder + kNumLenProbs) -#if Align != 0 && kStartOffset != 0 - #error Stop_Compiling_Bad_LZMA_kAlign +#define LZMA_BASE_SIZE 1846 +#define LZMA_LIT_SIZE 768 + +#define LzmaProps_GetNumProbs(p) ((UInt32)LZMA_BASE_SIZE + (LZMA_LIT_SIZE << ((p)->lc + (p)->lp))) + +#if Literal != LZMA_BASE_SIZE +StopCompilingDueBUG #endif -#if NUM_BASE_PROBS != 1984 - #error Stop_Compiling_Bad_LZMA_PROBS -#endif - - -#define LZMA_LIT_SIZE 0x300 - -#define LzmaProps_GetNumProbs(p) (NUM_BASE_PROBS + ((UInt32)LZMA_LIT_SIZE << ((p)->lc + (p)->lp))) - - -#define CALC_POS_STATE(processedPos, pbMask) (((processedPos) & (pbMask)) << 4) -#define COMBINED_PS_STATE (posState + state) -#define GET_LEN_STATE (posState) +static const Byte kLiteralNextStates[kNumStates * 2] = +{ + 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 4, 5, + 7, 7, 7, 7, 7, 7, 7, 10, 10, 10, 10, 10 +}; #define LZMA_DIC_MIN (1 << 12) -/* -p->remainLen : shows status of LZMA decoder: - < kMatchSpecLenStart : the number of bytes to be copied with (p->rep0) offset - = kMatchSpecLenStart : the LZMA stream was finished with end mark - = kMatchSpecLenStart + 1 : need init range coder - = kMatchSpecLenStart + 2 : need init range coder and state - = kMatchSpecLen_Error_Fail : Internal Code Failure - = kMatchSpecLen_Error_Data + [0 ... 273] : LZMA Data Error -*/ - -/* ---------- LZMA_DECODE_REAL ---------- */ -/* -LzmaDec_DecodeReal_3() can be implemented in external ASM file. -3 - is the code compatibility version of that function for check at link time. -*/ - -#define LZMA_DECODE_REAL LzmaDec_DecodeReal_3 - -/* -LZMA_DECODE_REAL() -In: - RangeCoder is normalized - if (p->dicPos == limit) - { - LzmaDec_TryDummy() was called before to exclude LITERAL and MATCH-REP cases. - So first symbol can be only MATCH-NON-REP. And if that MATCH-NON-REP symbol - is not END_OF_PAYALOAD_MARKER, then the function doesn't write any byte to dictionary, - the function returns SZ_OK, and the caller can use (p->remainLen) and (p->reps[0]) later. - } - -Processing: - The first LZMA symbol will be decoded in any case. - All main checks for limits are at the end of main loop, - It decodes additional LZMA-symbols while (p->buf < bufLimit && dicPos < limit), - RangeCoder is still without last normalization when (p->buf < bufLimit) is being checked. - But if (p->buf < bufLimit), the caller provided at least (LZMA_REQUIRED_INPUT_MAX + 1) bytes for - next iteration before limit (bufLimit + LZMA_REQUIRED_INPUT_MAX), - that is enough for worst case LZMA symbol with one additional RangeCoder normalization for one bit. - So that function never reads bufLimit [LZMA_REQUIRED_INPUT_MAX] byte. - +/* First LZMA-symbol is always decoded. +And it decodes new LZMA-symbols while (buf < bufLimit), but "buf" is without last normalization Out: - RangeCoder is normalized Result: SZ_OK - OK - p->remainLen: - < kMatchSpecLenStart : the number of bytes to be copied with (p->reps[0]) offset - = kMatchSpecLenStart : the LZMA stream was finished with end mark - - SZ_ERROR_DATA - error, when the MATCH-Symbol refers out of dictionary - p->remainLen : undefined - p->reps[*] : undefined + SZ_ERROR_DATA - Error + p->remainLen: + < kMatchSpecLenStart : normal remain + = kMatchSpecLenStart : finished + = kMatchSpecLenStart + 1 : Flush marker + = kMatchSpecLenStart + 2 : State Init Marker */ - -#ifdef Z7_LZMA_DEC_OPT - -int Z7_FASTCALL LZMA_DECODE_REAL(CLzmaDec *p, SizeT limit, const Byte *bufLimit); - -#else - -static -int Z7_FASTCALL LZMA_DECODE_REAL(CLzmaDec *p, SizeT limit, const Byte *bufLimit) +static int MY_FAST_CALL LzmaDec_DecodeReal(CLzmaDec *p, SizeT limit, const Byte *bufLimit) { - CLzmaProb *probs = GET_PROBS; - unsigned state = (unsigned)p->state; + CLzmaProb *probs = p->probs; + + unsigned state = p->state; UInt32 rep0 = p->reps[0], rep1 = p->reps[1], rep2 = p->reps[2], rep3 = p->reps[3]; unsigned pbMask = ((unsigned)1 << (p->prop.pb)) - 1; + unsigned lpMask = ((unsigned)1 << (p->prop.lp)) - 1; unsigned lc = p->prop.lc; - unsigned lpMask = ((unsigned)0x100 << p->prop.lp) - ((unsigned)0x100 >> lc); Byte *dic = p->dic; SizeT dicBufSize = p->dicBufSize; @@ -257,126 +161,99 @@ int Z7_FASTCALL LZMA_DECODE_REAL(CLzmaDec *p, SizeT limit, const Byte *bufLimit) CLzmaProb *prob; UInt32 bound; unsigned ttt; - unsigned posState = CALC_POS_STATE(processedPos, pbMask); + unsigned posState = processedPos & pbMask; - prob = probs + IsMatch + COMBINED_PS_STATE; + prob = probs + IsMatch + (state << kNumPosBitsMax) + posState; IF_BIT_0(prob) { unsigned symbol; - UPDATE_0(prob) + UPDATE_0(prob); prob = probs + Literal; - if (processedPos != 0 || checkDicSize != 0) - prob += (UInt32)3 * ((((processedPos << 8) + dic[(dicPos == 0 ? dicBufSize : dicPos) - 1]) & lpMask) << lc); - processedPos++; + if (checkDicSize != 0 || processedPos != 0) + prob += (LZMA_LIT_SIZE * (((processedPos & lpMask) << lc) + + (dic[(dicPos == 0 ? dicBufSize : dicPos) - 1] >> (8 - lc)))); if (state < kNumLitStates) { - state -= (state < 4) ? state : 3; symbol = 1; - #ifdef Z7_LZMA_SIZE_OPT - do { NORMAL_LITER_DEC } while (symbol < 0x100); - #else - NORMAL_LITER_DEC - NORMAL_LITER_DEC - NORMAL_LITER_DEC - NORMAL_LITER_DEC - NORMAL_LITER_DEC - NORMAL_LITER_DEC - NORMAL_LITER_DEC - NORMAL_LITER_DEC - #endif + do { GET_BIT(prob + symbol, symbol) } while (symbol < 0x100); } else { - unsigned matchByte = dic[dicPos - rep0 + (dicPos < rep0 ? dicBufSize : 0)]; + unsigned matchByte = p->dic[(dicPos - rep0) + ((dicPos < rep0) ? dicBufSize : 0)]; unsigned offs = 0x100; - state -= (state < 10) ? 3 : 6; symbol = 1; - #ifdef Z7_LZMA_SIZE_OPT do { unsigned bit; CLzmaProb *probLit; - MATCHED_LITER_DEC + matchByte <<= 1; + bit = (matchByte & offs); + probLit = prob + offs + bit + symbol; + GET_BIT2(probLit, symbol, offs &= ~bit, offs &= bit) } while (symbol < 0x100); - #else - { - unsigned bit; - CLzmaProb *probLit; - MATCHED_LITER_DEC - MATCHED_LITER_DEC - MATCHED_LITER_DEC - MATCHED_LITER_DEC - MATCHED_LITER_DEC - MATCHED_LITER_DEC - MATCHED_LITER_DEC - MATCHED_LITER_DEC - } - #endif } - dic[dicPos++] = (Byte)symbol; + processedPos++; + + state = kLiteralNextStates[state]; + /* if (state < 4) state = 0; else if (state < 10) state -= 3; else state -= 6; */ continue; } - + else { - UPDATE_1(prob) + UPDATE_1(prob); prob = probs + IsRep + state; IF_BIT_0(prob) { - UPDATE_0(prob) + UPDATE_0(prob); state += kNumStates; prob = probs + LenCoder; } else { - UPDATE_1(prob) + UPDATE_1(prob); + if (checkDicSize == 0 && processedPos == 0) + return SZ_ERROR_DATA; prob = probs + IsRepG0 + state; IF_BIT_0(prob) { - UPDATE_0(prob) - prob = probs + IsRep0Long + COMBINED_PS_STATE; + UPDATE_0(prob); + prob = probs + IsRep0Long + (state << kNumPosBitsMax) + posState; IF_BIT_0(prob) { - UPDATE_0(prob) - - // that case was checked before with kBadRepCode - // if (checkDicSize == 0 && processedPos == 0) { len = kMatchSpecLen_Error_Data + 1; break; } - // The caller doesn't allow (dicPos == limit) case here - // so we don't need the following check: - // if (dicPos == limit) { state = state < kNumLitStates ? 9 : 11; len = 1; break; } - - dic[dicPos] = dic[dicPos - rep0 + (dicPos < rep0 ? dicBufSize : 0)]; + UPDATE_0(prob); + dic[dicPos] = dic[(dicPos - rep0) + ((dicPos < rep0) ? dicBufSize : 0)]; dicPos++; processedPos++; state = state < kNumLitStates ? 9 : 11; continue; } - UPDATE_1(prob) + UPDATE_1(prob); } else { UInt32 distance; - UPDATE_1(prob) + UPDATE_1(prob); prob = probs + IsRepG1 + state; IF_BIT_0(prob) { - UPDATE_0(prob) + UPDATE_0(prob); distance = rep1; } else { - UPDATE_1(prob) + UPDATE_1(prob); prob = probs + IsRepG2 + state; IF_BIT_0(prob) { - UPDATE_0(prob) + UPDATE_0(prob); distance = rep2; } else { - UPDATE_1(prob) + UPDATE_1(prob); distance = rep3; rep3 = rep2; } @@ -388,101 +265,63 @@ int Z7_FASTCALL LZMA_DECODE_REAL(CLzmaDec *p, SizeT limit, const Byte *bufLimit) state = state < kNumLitStates ? 8 : 11; prob = probs + RepLenCoder; } - - #ifdef Z7_LZMA_SIZE_OPT { - unsigned lim, offset; + unsigned limit, offset; CLzmaProb *probLen = prob + LenChoice; IF_BIT_0(probLen) { - UPDATE_0(probLen) - probLen = prob + LenLow + GET_LEN_STATE; + UPDATE_0(probLen); + probLen = prob + LenLow + (posState << kLenNumLowBits); offset = 0; - lim = (1 << kLenNumLowBits); + limit = (1 << kLenNumLowBits); } else { - UPDATE_1(probLen) + UPDATE_1(probLen); probLen = prob + LenChoice2; IF_BIT_0(probLen) { - UPDATE_0(probLen) - probLen = prob + LenLow + GET_LEN_STATE + (1 << kLenNumLowBits); + UPDATE_0(probLen); + probLen = prob + LenMid + (posState << kLenNumMidBits); offset = kLenNumLowSymbols; - lim = (1 << kLenNumLowBits); + limit = (1 << kLenNumMidBits); } else { - UPDATE_1(probLen) + UPDATE_1(probLen); probLen = prob + LenHigh; - offset = kLenNumLowSymbols * 2; - lim = (1 << kLenNumHighBits); + offset = kLenNumLowSymbols + kLenNumMidSymbols; + limit = (1 << kLenNumHighBits); } } - TREE_DECODE(probLen, lim, len) + TREE_DECODE(probLen, limit, len); len += offset; } - #else - { - CLzmaProb *probLen = prob + LenChoice; - IF_BIT_0(probLen) - { - UPDATE_0(probLen) - probLen = prob + LenLow + GET_LEN_STATE; - len = 1; - TREE_GET_BIT(probLen, len) - TREE_GET_BIT(probLen, len) - TREE_GET_BIT(probLen, len) - len -= 8; - } - else - { - UPDATE_1(probLen) - probLen = prob + LenChoice2; - IF_BIT_0(probLen) - { - UPDATE_0(probLen) - probLen = prob + LenLow + GET_LEN_STATE + (1 << kLenNumLowBits); - len = 1; - TREE_GET_BIT(probLen, len) - TREE_GET_BIT(probLen, len) - TREE_GET_BIT(probLen, len) - } - else - { - UPDATE_1(probLen) - probLen = prob + LenHigh; - TREE_DECODE(probLen, (1 << kLenNumHighBits), len) - len += kLenNumLowSymbols * 2; - } - } - } - #endif if (state >= kNumStates) { UInt32 distance; prob = probs + PosSlot + ((len < kNumLenToPosStates ? len : kNumLenToPosStates - 1) << kNumPosSlotBits); - TREE_6_DECODE(prob, distance) + TREE_6_DECODE(prob, distance); if (distance >= kStartPosModelIndex) { unsigned posSlot = (unsigned)distance; - unsigned numDirectBits = (unsigned)(((distance >> 1) - 1)); + int numDirectBits = (int)(((distance >> 1) - 1)); distance = (2 | (distance & 1)); if (posSlot < kEndPosModelIndex) { distance <<= numDirectBits; - prob = probs + SpecPos; + prob = probs + SpecPos + distance - posSlot - 1; { - UInt32 m = 1; - distance++; + UInt32 mask = 1; + unsigned i = 1; do { - REV_BIT_VAR(prob, distance, m) + GET_BIT2(prob + i, i, ; , distance |= mask); + mask <<= 1; } - while (--numDirectBits); - distance -= m; + while (--numDirectBits != 0); } } else @@ -509,70 +348,57 @@ int Z7_FASTCALL LZMA_DECODE_REAL(CLzmaDec *p, SizeT limit, const Byte *bufLimit) } */ } - while (--numDirectBits); + while (--numDirectBits != 0); prob = probs + Align; distance <<= kNumAlignBits; { unsigned i = 1; - REV_BIT_CONST(prob, i, 1) - REV_BIT_CONST(prob, i, 2) - REV_BIT_CONST(prob, i, 4) - REV_BIT_LAST (prob, i, 8) - distance |= i; + GET_BIT2(prob + i, i, ; , distance |= 1); + GET_BIT2(prob + i, i, ; , distance |= 2); + GET_BIT2(prob + i, i, ; , distance |= 4); + GET_BIT2(prob + i, i, ; , distance |= 8); } if (distance == (UInt32)0xFFFFFFFF) { - len = kMatchSpecLenStart; + len += kMatchSpecLenStart; state -= kNumStates; break; } } } - rep3 = rep2; rep2 = rep1; rep1 = rep0; rep0 = distance + 1; - state = (state < kNumStates + kNumLitStates) ? kNumLitStates : kNumLitStates + 3; - if (distance >= (checkDicSize == 0 ? processedPos: checkDicSize)) + if (checkDicSize == 0) { - len += kMatchSpecLen_Error_Data + kMatchMinLen; - // len = kMatchSpecLen_Error_Data; - // len += kMatchMinLen; - break; + if (distance >= processedPos) + return SZ_ERROR_DATA; } + else if (distance >= checkDicSize) + return SZ_ERROR_DATA; + state = (state < kNumStates + kNumLitStates) ? kNumLitStates : kNumLitStates + 3; + /* state = kLiteralNextStates[state]; */ } len += kMatchMinLen; + if (limit == dicPos) + return SZ_ERROR_DATA; { - SizeT rem; - unsigned curLen; - SizeT pos; - - if ((rem = limit - dicPos) == 0) - { - /* - We stop decoding and return SZ_OK, and we can resume decoding later. - Any error conditions can be tested later in caller code. - For more strict mode we can stop decoding with error - // len += kMatchSpecLen_Error_Data; - */ - break; - } - - curLen = ((rem < len) ? (unsigned)rem : len); - pos = dicPos - rep0 + (dicPos < rep0 ? dicBufSize : 0); + SizeT rem = limit - dicPos; + unsigned curLen = ((rem < len) ? (unsigned)rem : len); + SizeT pos = (dicPos - rep0) + ((dicPos < rep0) ? dicBufSize : 0); - processedPos += (UInt32)curLen; + processedPos += curLen; len -= curLen; - if (curLen <= dicBufSize - pos) + if (pos + curLen <= dicBufSize) { Byte *dest = dic + dicPos; ptrdiff_t src = (ptrdiff_t)pos - (ptrdiff_t)dicPos; const Byte *lim = dest + curLen; - dicPos += (SizeT)curLen; + dicPos += curLen; do *(dest) = (Byte)*(dest + src); while (++dest != lim); @@ -591,153 +417,108 @@ int Z7_FASTCALL LZMA_DECODE_REAL(CLzmaDec *p, SizeT limit, const Byte *bufLimit) } } while (dicPos < limit && buf < bufLimit); - - NORMALIZE - + NORMALIZE; p->buf = buf; p->range = range; p->code = code; - p->remainLen = (UInt32)len; // & (kMatchSpecLen_Error_Data - 1); // we can write real length for error matches too. + p->remainLen = len; p->dicPos = dicPos; p->processedPos = processedPos; p->reps[0] = rep0; p->reps[1] = rep1; p->reps[2] = rep2; p->reps[3] = rep3; - p->state = (UInt32)state; - if (len >= kMatchSpecLen_Error_Data) - return SZ_ERROR_DATA; + p->state = state; + return SZ_OK; } -#endif - - -static void Z7_FASTCALL LzmaDec_WriteRem(CLzmaDec *p, SizeT limit) +static void MY_FAST_CALL LzmaDec_WriteRem(CLzmaDec *p, SizeT limit) { - unsigned len = (unsigned)p->remainLen; - if (len == 0 /* || len >= kMatchSpecLenStart */) - return; + if (p->remainLen != 0 && p->remainLen < kMatchSpecLenStart) { + Byte *dic = p->dic; SizeT dicPos = p->dicPos; - Byte *dic; - SizeT dicBufSize; - SizeT rep0; /* we use SizeT to avoid the BUG of VC14 for AMD64 */ - { - SizeT rem = limit - dicPos; - if (rem < len) - { - len = (unsigned)(rem); - if (len == 0) - return; - } - } + SizeT dicBufSize = p->dicBufSize; + unsigned len = p->remainLen; + UInt32 rep0 = p->reps[0]; + if (limit - dicPos < len) + len = (unsigned)(limit - dicPos); if (p->checkDicSize == 0 && p->prop.dicSize - p->processedPos <= len) p->checkDicSize = p->prop.dicSize; - p->processedPos += (UInt32)len; - p->remainLen -= (UInt32)len; - dic = p->dic; - rep0 = p->reps[0]; - dicBufSize = p->dicBufSize; - do + p->processedPos += len; + p->remainLen -= len; + while (len-- != 0) { - dic[dicPos] = dic[dicPos - rep0 + (dicPos < rep0 ? dicBufSize : 0)]; + dic[dicPos] = dic[(dicPos - rep0) + ((dicPos < rep0) ? dicBufSize : 0)]; dicPos++; } - while (--len); p->dicPos = dicPos; } } - -/* -At staring of new stream we have one of the following symbols: - - Literal - is allowed - - Non-Rep-Match - is allowed only if it's end marker symbol - - Rep-Match - is not allowed -We use early check of (RangeCoder:Code) over kBadRepCode to simplify main decoding code -*/ - -#define kRange0 0xFFFFFFFF -#define kBound0 ((kRange0 >> kNumBitModelTotalBits) << (kNumBitModelTotalBits - 1)) -#define kBadRepCode (kBound0 + (((kRange0 - kBound0) >> kNumBitModelTotalBits) << (kNumBitModelTotalBits - 1))) -#if kBadRepCode != (0xC0000000 - 0x400) - #error Stop_Compiling_Bad_LZMA_Check -#endif - - -/* -LzmaDec_DecodeReal2(): - It calls LZMA_DECODE_REAL() and it adjusts limit according (p->checkDicSize). - -We correct (p->checkDicSize) after LZMA_DECODE_REAL() and in LzmaDec_WriteRem(), -and we support the following state of (p->checkDicSize): - if (total_processed < p->prop.dicSize) then - { - (total_processed == p->processedPos) - (p->checkDicSize == 0) - } - else - (p->checkDicSize == p->prop.dicSize) -*/ - -static int Z7_FASTCALL LzmaDec_DecodeReal2(CLzmaDec *p, SizeT limit, const Byte *bufLimit) +static int MY_FAST_CALL LzmaDec_DecodeReal2(CLzmaDec *p, SizeT limit, const Byte *bufLimit) { - if (p->checkDicSize == 0) + do { - UInt32 rem = p->prop.dicSize - p->processedPos; - if (limit - p->dicPos > rem) - limit = p->dicPos + rem; - } - { - int res = LZMA_DECODE_REAL(p, limit, bufLimit); - if (p->checkDicSize == 0 && p->processedPos >= p->prop.dicSize) + SizeT limit2 = limit; + if (p->checkDicSize == 0) + { + UInt32 rem = p->prop.dicSize - p->processedPos; + if (limit - p->dicPos > rem) + limit2 = p->dicPos + rem; + } + RINOK(LzmaDec_DecodeReal(p, limit2, bufLimit)); + if (p->processedPos >= p->prop.dicSize) p->checkDicSize = p->prop.dicSize; - return res; + LzmaDec_WriteRem(p, limit); } + while (p->dicPos < limit && p->buf < bufLimit && p->remainLen < kMatchSpecLenStart); + + if (p->remainLen > kMatchSpecLenStart) + { + p->remainLen = kMatchSpecLenStart; + } + return 0; } - - typedef enum { - DUMMY_INPUT_EOF, /* need more input data */ + DUMMY_ERROR, /* unexpected end of input stream */ DUMMY_LIT, DUMMY_MATCH, DUMMY_REP } ELzmaDummy; - -#define IS_DUMMY_END_MARKER_POSSIBLE(dummyRes) ((dummyRes) == DUMMY_MATCH) - -static ELzmaDummy LzmaDec_TryDummy(const CLzmaDec *p, const Byte *buf, const Byte **bufOut) +static ELzmaDummy LzmaDec_TryDummy(const CLzmaDec *p, const Byte *buf, SizeT inSize) { UInt32 range = p->range; UInt32 code = p->code; - const Byte *bufLimit = *bufOut; - const CLzmaProb *probs = GET_PROBS; - unsigned state = (unsigned)p->state; + const Byte *bufLimit = buf + inSize; + CLzmaProb *probs = p->probs; + unsigned state = p->state; ELzmaDummy res; - for (;;) { - const CLzmaProb *prob; + CLzmaProb *prob; UInt32 bound; unsigned ttt; - unsigned posState = CALC_POS_STATE(p->processedPos, ((unsigned)1 << p->prop.pb) - 1); + unsigned posState = (p->processedPos) & ((1 << p->prop.pb) - 1); - prob = probs + IsMatch + COMBINED_PS_STATE; + prob = probs + IsMatch + (state << kNumPosBitsMax) + posState; IF_BIT_0_CHECK(prob) { UPDATE_0_CHECK + /* if (bufLimit - buf >= 7) return DUMMY_LIT; */ + prob = probs + Literal; if (p->checkDicSize != 0 || p->processedPos != 0) - prob += ((UInt32)LZMA_LIT_SIZE * - ((((p->processedPos) & (((unsigned)1 << (p->prop.lp)) - 1)) << p->prop.lc) + - ((unsigned)p->dic[(p->dicPos == 0 ? p->dicBufSize : p->dicPos) - 1] >> (8 - p->prop.lc)))); + prob += (LZMA_LIT_SIZE * + ((((p->processedPos) & ((1 << (p->prop.lp)) - 1)) << p->prop.lc) + + (p->dic[(p->dicPos == 0 ? p->dicBufSize : p->dicPos) - 1] >> (8 - p->prop.lc)))); if (state < kNumLitStates) { @@ -747,18 +528,17 @@ static ELzmaDummy LzmaDec_TryDummy(const CLzmaDec *p, const Byte *buf, const Byt else { unsigned matchByte = p->dic[p->dicPos - p->reps[0] + - (p->dicPos < p->reps[0] ? p->dicBufSize : 0)]; + ((p->dicPos < p->reps[0]) ? p->dicBufSize : 0)]; unsigned offs = 0x100; unsigned symbol = 1; do { unsigned bit; - const CLzmaProb *probLit; - matchByte += matchByte; - bit = offs; - offs &= matchByte; - probLit = prob + (offs + bit + symbol); - GET_BIT2_CHECK(probLit, symbol, offs ^= bit; , ; ) + CLzmaProb *probLit; + matchByte <<= 1; + bit = (matchByte & offs); + probLit = prob + offs + bit + symbol; + GET_BIT2_CHECK(probLit, symbol, offs &= ~bit, offs &= bit) } while (symbol < 0x100); } @@ -767,54 +547,55 @@ static ELzmaDummy LzmaDec_TryDummy(const CLzmaDec *p, const Byte *buf, const Byt else { unsigned len; - UPDATE_1_CHECK + UPDATE_1_CHECK; prob = probs + IsRep + state; IF_BIT_0_CHECK(prob) { - UPDATE_0_CHECK + UPDATE_0_CHECK; state = 0; prob = probs + LenCoder; res = DUMMY_MATCH; } else { - UPDATE_1_CHECK + UPDATE_1_CHECK; res = DUMMY_REP; prob = probs + IsRepG0 + state; IF_BIT_0_CHECK(prob) { - UPDATE_0_CHECK - prob = probs + IsRep0Long + COMBINED_PS_STATE; + UPDATE_0_CHECK; + prob = probs + IsRep0Long + (state << kNumPosBitsMax) + posState; IF_BIT_0_CHECK(prob) { - UPDATE_0_CHECK - break; + UPDATE_0_CHECK; + NORMALIZE_CHECK; + return DUMMY_REP; } else { - UPDATE_1_CHECK + UPDATE_1_CHECK; } } else { - UPDATE_1_CHECK + UPDATE_1_CHECK; prob = probs + IsRepG1 + state; IF_BIT_0_CHECK(prob) { - UPDATE_0_CHECK + UPDATE_0_CHECK; } else { - UPDATE_1_CHECK + UPDATE_1_CHECK; prob = probs + IsRepG2 + state; IF_BIT_0_CHECK(prob) { - UPDATE_0_CHECK + UPDATE_0_CHECK; } else { - UPDATE_1_CHECK + UPDATE_1_CHECK; } } } @@ -823,34 +604,34 @@ static ELzmaDummy LzmaDec_TryDummy(const CLzmaDec *p, const Byte *buf, const Byt } { unsigned limit, offset; - const CLzmaProb *probLen = prob + LenChoice; + CLzmaProb *probLen = prob + LenChoice; IF_BIT_0_CHECK(probLen) { - UPDATE_0_CHECK - probLen = prob + LenLow + GET_LEN_STATE; + UPDATE_0_CHECK; + probLen = prob + LenLow + (posState << kLenNumLowBits); offset = 0; limit = 1 << kLenNumLowBits; } else { - UPDATE_1_CHECK + UPDATE_1_CHECK; probLen = prob + LenChoice2; IF_BIT_0_CHECK(probLen) { - UPDATE_0_CHECK - probLen = prob + LenLow + GET_LEN_STATE + (1 << kLenNumLowBits); + UPDATE_0_CHECK; + probLen = prob + LenMid + (posState << kLenNumMidBits); offset = kLenNumLowSymbols; - limit = 1 << kLenNumLowBits; + limit = 1 << kLenNumMidBits; } else { - UPDATE_1_CHECK + UPDATE_1_CHECK; probLen = prob + LenHigh; - offset = kLenNumLowSymbols * 2; + offset = kLenNumLowSymbols + kLenNumMidSymbols; limit = 1 << kLenNumHighBits; } } - TREE_DECODE_CHECK(probLen, limit, len) + TREE_DECODE_CHECK(probLen, limit, len); len += offset; } @@ -858,16 +639,18 @@ static ELzmaDummy LzmaDec_TryDummy(const CLzmaDec *p, const Byte *buf, const Byt { unsigned posSlot; prob = probs + PosSlot + - ((len < kNumLenToPosStates - 1 ? len : kNumLenToPosStates - 1) << + ((len < kNumLenToPosStates ? len : kNumLenToPosStates - 1) << kNumPosSlotBits); - TREE_DECODE_CHECK(prob, 1 << kNumPosSlotBits, posSlot) + TREE_DECODE_CHECK(prob, 1 << kNumPosSlotBits, posSlot); if (posSlot >= kStartPosModelIndex) { - unsigned numDirectBits = ((posSlot >> 1) - 1); + int numDirectBits = ((posSlot >> 1) - 1); + + /* if (bufLimit - buf >= 8) return DUMMY_MATCH; */ if (posSlot < kEndPosModelIndex) { - prob = probs + SpecPos + ((2 | (posSlot & 1)) << numDirectBits); + prob = probs + SpecPos + ((2 | (posSlot & 1)) << numDirectBits) - posSlot - 1; } else { @@ -879,44 +662,48 @@ static ELzmaDummy LzmaDec_TryDummy(const CLzmaDec *p, const Byte *buf, const Byt code -= range & (((code - range) >> 31) - 1); /* if (code >= range) code -= range; */ } - while (--numDirectBits); + while (--numDirectBits != 0); prob = probs + Align; numDirectBits = kNumAlignBits; } { unsigned i = 1; - unsigned m = 1; do { - REV_BIT_CHECK(prob, i, m) + GET_BIT_CHECK(prob + i, i); } - while (--numDirectBits); + while (--numDirectBits != 0); } } } } - break; } - NORMALIZE_CHECK - - *bufOut = buf; + NORMALIZE_CHECK; return res; } -void LzmaDec_InitDicAndState(CLzmaDec *p, BoolInt initDic, BoolInt initState); -void LzmaDec_InitDicAndState(CLzmaDec *p, BoolInt initDic, BoolInt initState) + +static void LzmaDec_InitRc(CLzmaDec *p, const Byte *data) { - p->remainLen = kMatchSpecLenStart + 1; + p->code = ((UInt32)data[1] << 24) | ((UInt32)data[2] << 16) | ((UInt32)data[3] << 8) | ((UInt32)data[4]); + p->range = 0xFFFFFFFF; + p->needFlush = 0; +} + +void LzmaDec_InitDicAndState(CLzmaDec *p, Bool initDic, Bool initState) +{ + p->needFlush = 1; + p->remainLen = 0; p->tempBufSize = 0; if (initDic) { p->processedPos = 0; p->checkDicSize = 0; - p->remainLen = kMatchSpecLenStart + 2; + p->needInitState = 1; } if (initState) - p->remainLen = kMatchSpecLenStart + 2; + p->needInitState = 1; } void LzmaDec_Init(CLzmaDec *p) @@ -925,96 +712,48 @@ void LzmaDec_Init(CLzmaDec *p) LzmaDec_InitDicAndState(p, True, True); } - -/* -LZMA supports optional end_marker. -So the decoder can lookahead for one additional LZMA-Symbol to check end_marker. -That additional LZMA-Symbol can require up to LZMA_REQUIRED_INPUT_MAX bytes in input stream. -When the decoder reaches dicLimit, it looks (finishMode) parameter: - if (finishMode == LZMA_FINISH_ANY), the decoder doesn't lookahead - if (finishMode != LZMA_FINISH_ANY), the decoder lookahead, if end_marker is possible for current position - -When the decoder lookahead, and the lookahead symbol is not end_marker, we have two ways: - 1) Strict mode (default) : the decoder returns SZ_ERROR_DATA. - 2) The relaxed mode (alternative mode) : we could return SZ_OK, and the caller - must check (status) value. The caller can show the error, - if the end of stream is expected, and the (status) is noit - LZMA_STATUS_FINISHED_WITH_MARK or LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK. -*/ - - -#define RETURN_NOT_FINISHED_FOR_FINISH \ - *status = LZMA_STATUS_NOT_FINISHED; \ - return SZ_ERROR_DATA; // for strict mode - // return SZ_OK; // for relaxed mode - +static void LzmaDec_InitStateReal(CLzmaDec *p) +{ + UInt32 numProbs = Literal + ((UInt32)LZMA_LIT_SIZE << (p->prop.lc + p->prop.lp)); + UInt32 i; + CLzmaProb *probs = p->probs; + for (i = 0; i < numProbs; i++) + probs[i] = kBitModelTotal >> 1; + p->reps[0] = p->reps[1] = p->reps[2] = p->reps[3] = 1; + p->state = 0; + p->needInitState = 0; +} SRes LzmaDec_DecodeToDic(CLzmaDec *p, SizeT dicLimit, const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status) { SizeT inSize = *srcLen; (*srcLen) = 0; + LzmaDec_WriteRem(p, dicLimit); + *status = LZMA_STATUS_NOT_SPECIFIED; - if (p->remainLen > kMatchSpecLenStart) + while (p->remainLen != kMatchSpecLenStart) { - if (p->remainLen > kMatchSpecLenStart + 2) - return p->remainLen == kMatchSpecLen_Error_Fail ? SZ_ERROR_FAIL : SZ_ERROR_DATA; + int checkEndMarkNow; - for (; inSize > 0 && p->tempBufSize < RC_INIT_SIZE; (*srcLen)++, inSize--) - p->tempBuf[p->tempBufSize++] = *src++; - if (p->tempBufSize != 0 && p->tempBuf[0] != 0) - return SZ_ERROR_DATA; - if (p->tempBufSize < RC_INIT_SIZE) - { - *status = LZMA_STATUS_NEEDS_MORE_INPUT; - return SZ_OK; - } - p->code = - ((UInt32)p->tempBuf[1] << 24) - | ((UInt32)p->tempBuf[2] << 16) - | ((UInt32)p->tempBuf[3] << 8) - | ((UInt32)p->tempBuf[4]); + if (p->needFlush != 0) + { + for (; inSize > 0 && p->tempBufSize < RC_INIT_SIZE; (*srcLen)++, inSize--) + p->tempBuf[p->tempBufSize++] = *src++; + if (p->tempBufSize < RC_INIT_SIZE) + { + *status = LZMA_STATUS_NEEDS_MORE_INPUT; + return SZ_OK; + } + if (p->tempBuf[0] != 0) + return SZ_ERROR_DATA; - if (p->checkDicSize == 0 - && p->processedPos == 0 - && p->code >= kBadRepCode) - return SZ_ERROR_DATA; - - p->range = 0xFFFFFFFF; - p->tempBufSize = 0; - - if (p->remainLen > kMatchSpecLenStart + 1) - { - SizeT numProbs = LzmaProps_GetNumProbs(&p->prop); - SizeT i; - CLzmaProb *probs = p->probs; - for (i = 0; i < numProbs; i++) - probs[i] = kBitModelTotal >> 1; - p->reps[0] = p->reps[1] = p->reps[2] = p->reps[3] = 1; - p->state = 0; - } - - p->remainLen = 0; - } - - for (;;) - { - if (p->remainLen == kMatchSpecLenStart) - { - if (p->code != 0) - return SZ_ERROR_DATA; - *status = LZMA_STATUS_FINISHED_WITH_MARK; - return SZ_OK; - } - - LzmaDec_WriteRem(p, dicLimit); - - { - // (p->remainLen == 0 || p->dicPos == dicLimit) - - int checkEndMarkNow = 0; + LzmaDec_InitRc(p, p->tempBuf); + p->tempBufSize = 0; + } + checkEndMarkNow = 0; if (p->dicPos >= dicLimit) { if (p->remainLen == 0 && p->code == 0) @@ -1029,174 +768,83 @@ SRes LzmaDec_DecodeToDic(CLzmaDec *p, SizeT dicLimit, const Byte *src, SizeT *sr } if (p->remainLen != 0) { - RETURN_NOT_FINISHED_FOR_FINISH + *status = LZMA_STATUS_NOT_FINISHED; + return SZ_ERROR_DATA; } checkEndMarkNow = 1; } - // (p->remainLen == 0) - + if (p->needInitState) + LzmaDec_InitStateReal(p); + if (p->tempBufSize == 0) { + SizeT processed; const Byte *bufLimit; - int dummyProcessed = -1; - if (inSize < LZMA_REQUIRED_INPUT_MAX || checkEndMarkNow) { - const Byte *bufOut = src + inSize; - - ELzmaDummy dummyRes = LzmaDec_TryDummy(p, src, &bufOut); - - if (dummyRes == DUMMY_INPUT_EOF) + int dummyRes = LzmaDec_TryDummy(p, src, inSize); + if (dummyRes == DUMMY_ERROR) { - size_t i; - if (inSize >= LZMA_REQUIRED_INPUT_MAX) - break; - (*srcLen) += inSize; + memcpy(p->tempBuf, src, inSize); p->tempBufSize = (unsigned)inSize; - for (i = 0; i < inSize; i++) - p->tempBuf[i] = src[i]; + (*srcLen) += inSize; *status = LZMA_STATUS_NEEDS_MORE_INPUT; return SZ_OK; } - - dummyProcessed = (int)(bufOut - src); - if ((unsigned)dummyProcessed > LZMA_REQUIRED_INPUT_MAX) - break; - - if (checkEndMarkNow && !IS_DUMMY_END_MARKER_POSSIBLE(dummyRes)) + if (checkEndMarkNow && dummyRes != DUMMY_MATCH) { - unsigned i; - (*srcLen) += (unsigned)dummyProcessed; - p->tempBufSize = (unsigned)dummyProcessed; - for (i = 0; i < (unsigned)dummyProcessed; i++) - p->tempBuf[i] = src[i]; - // p->remainLen = kMatchSpecLen_Error_Data; - RETURN_NOT_FINISHED_FOR_FINISH + *status = LZMA_STATUS_NOT_FINISHED; + return SZ_ERROR_DATA; } - bufLimit = src; - // we will decode only one iteration } else bufLimit = src + inSize - LZMA_REQUIRED_INPUT_MAX; - p->buf = src; - - { - int res = LzmaDec_DecodeReal2(p, dicLimit, bufLimit); - - SizeT processed = (SizeT)(p->buf - src); - - if (dummyProcessed < 0) - { - if (processed > inSize) - break; - } - else if ((unsigned)dummyProcessed != processed) - break; - - src += processed; - inSize -= processed; - (*srcLen) += processed; - - if (res != SZ_OK) - { - p->remainLen = kMatchSpecLen_Error_Data; - return SZ_ERROR_DATA; - } - } - continue; + if (LzmaDec_DecodeReal2(p, dicLimit, bufLimit) != 0) + return SZ_ERROR_DATA; + processed = (SizeT)(p->buf - src); + (*srcLen) += processed; + src += processed; + inSize -= processed; } - + else { - // we have some data in (p->tempBuf) - // in strict mode: tempBufSize is not enough for one Symbol decoding. - // in relaxed mode: tempBufSize not larger than required for one Symbol decoding. - - unsigned rem = p->tempBufSize; - unsigned ahead = 0; - int dummyProcessed = -1; - - while (rem < LZMA_REQUIRED_INPUT_MAX && ahead < inSize) - p->tempBuf[rem++] = src[ahead++]; - - // ahead - the size of new data copied from (src) to (p->tempBuf) - // rem - the size of temp buffer including new data from (src) - + unsigned rem = p->tempBufSize, lookAhead = 0; + while (rem < LZMA_REQUIRED_INPUT_MAX && lookAhead < inSize) + p->tempBuf[rem++] = src[lookAhead++]; + p->tempBufSize = rem; if (rem < LZMA_REQUIRED_INPUT_MAX || checkEndMarkNow) { - const Byte *bufOut = p->tempBuf + rem; - - ELzmaDummy dummyRes = LzmaDec_TryDummy(p, p->tempBuf, &bufOut); - - if (dummyRes == DUMMY_INPUT_EOF) + int dummyRes = LzmaDec_TryDummy(p, p->tempBuf, rem); + if (dummyRes == DUMMY_ERROR) { - if (rem >= LZMA_REQUIRED_INPUT_MAX) - break; - p->tempBufSize = rem; - (*srcLen) += (SizeT)ahead; + (*srcLen) += lookAhead; *status = LZMA_STATUS_NEEDS_MORE_INPUT; return SZ_OK; } - - dummyProcessed = (int)(bufOut - p->tempBuf); - - if ((unsigned)dummyProcessed < p->tempBufSize) - break; - - if (checkEndMarkNow && !IS_DUMMY_END_MARKER_POSSIBLE(dummyRes)) + if (checkEndMarkNow && dummyRes != DUMMY_MATCH) { - (*srcLen) += (unsigned)dummyProcessed - p->tempBufSize; - p->tempBufSize = (unsigned)dummyProcessed; - // p->remainLen = kMatchSpecLen_Error_Data; - RETURN_NOT_FINISHED_FOR_FINISH - } - } - - p->buf = p->tempBuf; - - { - // we decode one symbol from (p->tempBuf) here, so the (bufLimit) is equal to (p->buf) - int res = LzmaDec_DecodeReal2(p, dicLimit, p->buf); - - SizeT processed = (SizeT)(p->buf - p->tempBuf); - rem = p->tempBufSize; - - if (dummyProcessed < 0) - { - if (processed > LZMA_REQUIRED_INPUT_MAX) - break; - if (processed < rem) - break; - } - else if ((unsigned)dummyProcessed != processed) - break; - - processed -= rem; - - src += processed; - inSize -= processed; - (*srcLen) += processed; - p->tempBufSize = 0; - - if (res != SZ_OK) - { - p->remainLen = kMatchSpecLen_Error_Data; + *status = LZMA_STATUS_NOT_FINISHED; return SZ_ERROR_DATA; } } + p->buf = p->tempBuf; + if (LzmaDec_DecodeReal2(p, dicLimit, p->buf) != 0) + return SZ_ERROR_DATA; + lookAhead -= (rem - (unsigned)(p->buf - p->tempBuf)); + (*srcLen) += lookAhead; + src += lookAhead; + inSize -= lookAhead; + p->tempBufSize = 0; } - } } - - /* Some unexpected error: internal error of code, memory corruption or hardware failure */ - p->remainLen = kMatchSpecLen_Error_Fail; - return SZ_ERROR_FAIL; + if (p->code == 0) + *status = LZMA_STATUS_FINISHED_WITH_MARK; + return (p->code == 0) ? SZ_OK : SZ_ERROR_DATA; } - - SRes LzmaDec_DecodeToBuf(CLzmaDec *p, Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status) { SizeT outSize = *destLen; @@ -1237,19 +885,19 @@ SRes LzmaDec_DecodeToBuf(CLzmaDec *p, Byte *dest, SizeT *destLen, const Byte *sr } } -void LzmaDec_FreeProbs(CLzmaDec *p, ISzAllocPtr alloc) +void LzmaDec_FreeProbs(CLzmaDec *p, ISzAlloc *alloc) { - ISzAlloc_Free(alloc, p->probs); - p->probs = NULL; + alloc->Free(alloc, p->probs); + p->probs = 0; } -static void LzmaDec_FreeDict(CLzmaDec *p, ISzAllocPtr alloc) +static void LzmaDec_FreeDict(CLzmaDec *p, ISzAlloc *alloc) { - ISzAlloc_Free(alloc, p->dic); - p->dic = NULL; + alloc->Free(alloc, p->dic); + p->dic = 0; } -void LzmaDec_Free(CLzmaDec *p, ISzAllocPtr alloc) +void LzmaDec_Free(CLzmaDec *p, ISzAlloc *alloc) { LzmaDec_FreeProbs(p, alloc); LzmaDec_FreeDict(p, alloc); @@ -1273,60 +921,49 @@ SRes LzmaProps_Decode(CLzmaProps *p, const Byte *data, unsigned size) if (d >= (9 * 5 * 5)) return SZ_ERROR_UNSUPPORTED; - p->lc = (Byte)(d % 9); + p->lc = d % 9; d /= 9; - p->pb = (Byte)(d / 5); - p->lp = (Byte)(d % 5); + p->pb = d / 5; + p->lp = d % 5; return SZ_OK; } -static SRes LzmaDec_AllocateProbs2(CLzmaDec *p, const CLzmaProps *propNew, ISzAllocPtr alloc) +static SRes LzmaDec_AllocateProbs2(CLzmaDec *p, const CLzmaProps *propNew, ISzAlloc *alloc) { UInt32 numProbs = LzmaProps_GetNumProbs(propNew); - if (!p->probs || numProbs != p->numProbs) + if (p->probs == 0 || numProbs != p->numProbs) { LzmaDec_FreeProbs(p, alloc); - p->probs = (CLzmaProb *)ISzAlloc_Alloc(alloc, numProbs * sizeof(CLzmaProb)); - if (!p->probs) - return SZ_ERROR_MEM; - p->probs_1664 = p->probs + 1664; + p->probs = (CLzmaProb *)alloc->Alloc(alloc, numProbs * sizeof(CLzmaProb)); p->numProbs = numProbs; + if (p->probs == 0) + return SZ_ERROR_MEM; } return SZ_OK; } -SRes LzmaDec_AllocateProbs(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAllocPtr alloc) +SRes LzmaDec_AllocateProbs(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc) { CLzmaProps propNew; - RINOK(LzmaProps_Decode(&propNew, props, propsSize)) - RINOK(LzmaDec_AllocateProbs2(p, &propNew, alloc)) + RINOK(LzmaProps_Decode(&propNew, props, propsSize)); + RINOK(LzmaDec_AllocateProbs2(p, &propNew, alloc)); p->prop = propNew; return SZ_OK; } -SRes LzmaDec_Allocate(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAllocPtr alloc) +SRes LzmaDec_Allocate(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc) { CLzmaProps propNew; SizeT dicBufSize; - RINOK(LzmaProps_Decode(&propNew, props, propsSize)) - RINOK(LzmaDec_AllocateProbs2(p, &propNew, alloc)) - - { - UInt32 dictSize = propNew.dicSize; - SizeT mask = ((UInt32)1 << 12) - 1; - if (dictSize >= ((UInt32)1 << 30)) mask = ((UInt32)1 << 22) - 1; - else if (dictSize >= ((UInt32)1 << 22)) mask = ((UInt32)1 << 20) - 1; - dicBufSize = ((SizeT)dictSize + mask) & ~mask; - if (dicBufSize < dictSize) - dicBufSize = dictSize; - } - - if (!p->dic || dicBufSize != p->dicBufSize) + RINOK(LzmaProps_Decode(&propNew, props, propsSize)); + RINOK(LzmaDec_AllocateProbs2(p, &propNew, alloc)); + dicBufSize = propNew.dicSize; + if (p->dic == 0 || dicBufSize != p->dicBufSize) { LzmaDec_FreeDict(p, alloc); - p->dic = (Byte *)ISzAlloc_Alloc(alloc, dicBufSize); - if (!p->dic) + p->dic = (Byte *)alloc->Alloc(alloc, dicBufSize); + if (p->dic == 0) { LzmaDec_FreeProbs(p, alloc); return SZ_ERROR_MEM; @@ -1339,25 +976,32 @@ SRes LzmaDec_Allocate(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAll SRes LzmaDecode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, const Byte *propData, unsigned propSize, ELzmaFinishMode finishMode, - ELzmaStatus *status, ISzAllocPtr alloc) + ELzmaStatus *status, ISzAlloc *alloc) { CLzmaDec p; SRes res; - SizeT outSize = *destLen, inSize = *srcLen; - *destLen = *srcLen = 0; - *status = LZMA_STATUS_NOT_SPECIFIED; + SizeT inSize = *srcLen; + SizeT outSize = *destLen; + *srcLen = *destLen = 0; if (inSize < RC_INIT_SIZE) return SZ_ERROR_INPUT_EOF; - LzmaDec_CONSTRUCT(&p) - RINOK(LzmaDec_AllocateProbs(&p, propData, propSize, alloc)) + + LzmaDec_Construct(&p); + res = LzmaDec_AllocateProbs(&p, propData, propSize, alloc); + if (res != 0) + return res; p.dic = dest; p.dicBufSize = outSize; + LzmaDec_Init(&p); + *srcLen = inSize; res = LzmaDec_DecodeToDic(&p, outSize, src, srcLen, finishMode, status); - *destLen = p.dicPos; + if (res == SZ_OK && *status == LZMA_STATUS_NEEDS_MORE_INPUT) res = SZ_ERROR_INPUT_EOF; + + (*destLen) = p.dicPos; LzmaDec_FreeProbs(&p, alloc); return res; } diff --git a/extern/lzma/LzmaDec.h b/extern/lzma/LzmaDec.h index b0ce28fa02a..98cdbe94949 100644 --- a/extern/lzma/LzmaDec.h +++ b/extern/lzma/LzmaDec.h @@ -1,36 +1,29 @@ /* LzmaDec.h -- LZMA Decoder -2023-04-02 : Igor Pavlov : Public domain */ +2008-10-04 : Igor Pavlov : Public domain */ -#ifndef ZIP7_INC_LZMA_DEC_H -#define ZIP7_INC_LZMA_DEC_H +#ifndef __LZMADEC_H +#define __LZMADEC_H -#include "7zTypes.h" +#include "Types.h" -EXTERN_C_BEGIN - -/* #define Z7_LZMA_PROB32 */ -/* Z7_LZMA_PROB32 can increase the speed on some CPUs, +/* #define _LZMA_PROB32 */ +/* _LZMA_PROB32 can increase the speed on some CPUs, but memory usage for CLzmaDec::probs will be doubled in that case */ -typedef -#ifdef Z7_LZMA_PROB32 - UInt32 +#ifdef _LZMA_PROB32 +#define CLzmaProb UInt32 #else - UInt16 +#define CLzmaProb UInt16 #endif - CLzmaProb; /* ---------- LZMA Properties ---------- */ #define LZMA_PROPS_SIZE 5 -typedef struct +typedef struct _CLzmaProps { - Byte lc; - Byte lp; - Byte pb; - Byte _pad_; + unsigned lc, lp, pb; UInt32 dicSize; } CLzmaProps; @@ -52,35 +45,32 @@ SRes LzmaProps_Decode(CLzmaProps *p, const Byte *data, unsigned size); typedef struct { - /* Don't change this structure. ASM code can use it. */ CLzmaProps prop; CLzmaProb *probs; - CLzmaProb *probs_1664; Byte *dic; - SizeT dicBufSize; - SizeT dicPos; const Byte *buf; - UInt32 range; - UInt32 code; + UInt32 range, code; + SizeT dicPos; + SizeT dicBufSize; UInt32 processedPos; UInt32 checkDicSize; + unsigned state; UInt32 reps[4]; - UInt32 state; - UInt32 remainLen; - + unsigned remainLen; + int needFlush; + int needInitState; UInt32 numProbs; unsigned tempBufSize; Byte tempBuf[LZMA_REQUIRED_INPUT_MAX]; } CLzmaDec; -#define LzmaDec_CONSTRUCT(p) { (p)->dic = NULL; (p)->probs = NULL; } -#define LzmaDec_Construct(p) LzmaDec_CONSTRUCT(p) +#define LzmaDec_Construct(p) { (p)->dic = 0; (p)->probs = 0; } void LzmaDec_Init(CLzmaDec *p); /* There are two types of LZMA streams: - - Stream with end mark. That end mark adds about 6 bytes to compressed size. - - Stream without end mark. You must know exact uncompressed size to decompress such stream. */ + 0) Stream with end mark. That end mark adds about 6 bytes to compressed size. + 1) Stream without end mark. You must know exact uncompressed size to decompress such stream. */ typedef enum { @@ -137,11 +127,11 @@ LzmaDec_Allocate* can return: SZ_ERROR_UNSUPPORTED - Unsupported properties */ -SRes LzmaDec_AllocateProbs(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAllocPtr alloc); -void LzmaDec_FreeProbs(CLzmaDec *p, ISzAllocPtr alloc); +SRes LzmaDec_AllocateProbs(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc); +void LzmaDec_FreeProbs(CLzmaDec *p, ISzAlloc *alloc); -SRes LzmaDec_Allocate(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAllocPtr alloc); -void LzmaDec_Free(CLzmaDec *p, ISzAllocPtr alloc); +SRes LzmaDec_Allocate(CLzmaDec *state, const Byte *prop, unsigned propsSize, ISzAlloc *alloc); +void LzmaDec_Free(CLzmaDec *state, ISzAlloc *alloc); /* ---------- Dictionary Interface ---------- */ @@ -150,7 +140,7 @@ void LzmaDec_Free(CLzmaDec *p, ISzAllocPtr alloc); You must work with CLzmaDec variables directly in this interface. STEPS: - LzmaDec_Construct() + LzmaDec_Constr() LzmaDec_Allocate() for (each new stream) { @@ -182,7 +172,6 @@ Returns: LZMA_STATUS_NEEDS_MORE_INPUT LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK SZ_ERROR_DATA - Data error - SZ_ERROR_FAIL - Some unexpected error: internal error of code, memory corruption or hardware failure */ SRes LzmaDec_DecodeToDic(CLzmaDec *p, SizeT dicLimit, @@ -225,13 +214,10 @@ Returns: SZ_ERROR_MEM - Memory allocation error SZ_ERROR_UNSUPPORTED - Unsupported properties SZ_ERROR_INPUT_EOF - It needs more bytes in input buffer (src). - SZ_ERROR_FAIL - Some unexpected error: internal error of code, memory corruption or hardware failure */ SRes LzmaDecode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, const Byte *propData, unsigned propSize, ELzmaFinishMode finishMode, - ELzmaStatus *status, ISzAllocPtr alloc); - -EXTERN_C_END + ELzmaStatus *status, ISzAlloc *alloc); #endif diff --git a/extern/lzma/LzmaEnc.c b/extern/lzma/LzmaEnc.c index 6d13cac8ce2..8c5636fc89e 100644 --- a/extern/lzma/LzmaEnc.c +++ b/extern/lzma/LzmaEnc.c @@ -1,7 +1,5 @@ /* LzmaEnc.c -- LZMA Encoder -2023-04-13: Igor Pavlov : Public domain */ - -#include "Precomp.h" +2009-02-02 : Igor Pavlov : Public domain */ #include @@ -12,36 +10,28 @@ #include #endif -#include "CpuArch.h" #include "LzmaEnc.h" #include "LzFind.h" -#ifndef Z7_ST +#ifdef COMPRESS_MF_MT #include "LzFindMt.h" #endif -/* the following LzmaEnc_* declarations is internal LZMA interface for LZMA2 encoder */ - -SRes LzmaEnc_PrepareForLzma2(CLzmaEncHandle p, ISeqInStreamPtr inStream, UInt32 keepWindowSize, - ISzAllocPtr alloc, ISzAllocPtr allocBig); -SRes LzmaEnc_MemPrepare(CLzmaEncHandle p, const Byte *src, SizeT srcLen, - UInt32 keepWindowSize, ISzAllocPtr alloc, ISzAllocPtr allocBig); -SRes LzmaEnc_CodeOneMemBlock(CLzmaEncHandle p, BoolInt reInit, - Byte *dest, size_t *destLen, UInt32 desiredPackSize, UInt32 *unpackSize); -const Byte *LzmaEnc_GetCurBuf(CLzmaEncHandle p); -void LzmaEnc_Finish(CLzmaEncHandle p); -void LzmaEnc_SaveState(CLzmaEncHandle p); -void LzmaEnc_RestoreState(CLzmaEncHandle p); - #ifdef SHOW_STAT -static unsigned g_STAT_OFFSET = 0; +static int ttt = 0; #endif -/* for good normalization speed we still reserve 256 MB before 4 GB range */ -#define kLzmaMaxHistorySize ((UInt32)15 << 28) +#define kBlockSizeMax ((1 << LZMA_NUM_BLOCK_SIZE_BITS) - 1) -// #define kNumTopBits 24 -#define kTopValue ((UInt32)1 << 24) +#define kBlockSize (9 << 10) +#define kUnpackBlockSize (1 << 18) +#define kMatchArraySize (1 << 21) +#define kMatchRecordMaxSize ((LZMA_MATCH_LEN_MAX * 2 + 3) * LZMA_MATCH_LEN_MAX) + +#define kNumMaxDirectBits (31) + +#define kNumTopBits 24 +#define kTopValue ((UInt32)1 << kNumTopBits) #define kNumBitModelTotalBits 11 #define kBitModelTotal (1 << kNumBitModelTotalBits) @@ -50,19 +40,14 @@ static unsigned g_STAT_OFFSET = 0; #define kNumMoveReducingBits 4 #define kNumBitPriceShiftBits 4 -// #define kBitPrice (1 << kNumBitPriceShiftBits) - -#define REP_LEN_COUNT 64 +#define kBitPrice (1 << kNumBitPriceShiftBits) void LzmaEncProps_Init(CLzmaEncProps *p) { p->level = 5; p->dictSize = p->mc = 0; - p->reduceSize = (UInt64)(Int64)-1; p->lc = p->lp = p->pb = p->algo = p->fb = p->btMode = p->numHashBytes = p->numThreads = -1; - p->numHashOutBits = 0; p->writeEndMark = 0; - p->affinity = 0; } void LzmaEncProps_Normalize(CLzmaEncProps *p) @@ -70,37 +55,18 @@ void LzmaEncProps_Normalize(CLzmaEncProps *p) int level = p->level; if (level < 0) level = 5; p->level = level; - - if (p->dictSize == 0) - p->dictSize = - ( level <= 3 ? ((UInt32)1 << (level * 2 + 16)) : - ( level <= 6 ? ((UInt32)1 << (level + 19)) : - ( level <= 7 ? ((UInt32)1 << 25) : ((UInt32)1 << 26) - ))); - - if (p->dictSize > p->reduceSize) - { - UInt32 v = (UInt32)p->reduceSize; - const UInt32 kReduceMin = ((UInt32)1 << 12); - if (v < kReduceMin) - v = kReduceMin; - if (p->dictSize > v) - p->dictSize = v; - } - + if (p->dictSize == 0) p->dictSize = (level <= 5 ? (1 << (level * 2 + 14)) : (level == 6 ? (1 << 25) : (1 << 26))); if (p->lc < 0) p->lc = 3; if (p->lp < 0) p->lp = 0; if (p->pb < 0) p->pb = 2; - if (p->algo < 0) p->algo = (level < 5 ? 0 : 1); if (p->fb < 0) p->fb = (level < 7 ? 32 : 64); if (p->btMode < 0) p->btMode = (p->algo == 0 ? 0 : 1); - if (p->numHashBytes < 0) p->numHashBytes = (p->btMode ? 4 : 5); - if (p->mc == 0) p->mc = (16 + ((unsigned)p->fb >> 1)) >> (p->btMode ? 0 : 1); - + if (p->numHashBytes < 0) p->numHashBytes = 4; + if (p->mc == 0) p->mc = (16 + (p->fb >> 1)) >> (p->btMode ? 0 : 1); if (p->numThreads < 0) p->numThreads = - #ifndef Z7_ST + #ifdef COMPRESS_MF_MT ((p->btMode && p->algo) ? 2 : 1); #else 1; @@ -114,133 +80,48 @@ UInt32 LzmaEncProps_GetDictSize(const CLzmaEncProps *props2) return props.dictSize; } +/* #define LZMA_LOG_BSR */ +/* Define it for Intel's CPU */ -/* -x86/x64: - -BSR: - IF (SRC == 0) ZF = 1, DEST is undefined; - AMD : DEST is unchanged; - IF (SRC != 0) ZF = 0; DEST is index of top non-zero bit - BSR is slow in some processors - -LZCNT: - IF (SRC == 0) CF = 1, DEST is size_in_bits_of_register(src) (32 or 64) - IF (SRC != 0) CF = 0, DEST = num_lead_zero_bits - IF (DEST == 0) ZF = 1; - -LZCNT works only in new processors starting from Haswell. -if LZCNT is not supported by processor, then it's executed as BSR. -LZCNT can be faster than BSR, if supported. -*/ - -// #define LZMA_LOG_BSR - -#if defined(MY_CPU_ARM_OR_ARM64) /* || defined(MY_CPU_X86_OR_AMD64) */ - - #if (defined(__clang__) && (__clang_major__ >= 6)) \ - || (defined(__GNUC__) && (__GNUC__ >= 6)) - #define LZMA_LOG_BSR - #elif defined(_MSC_VER) && (_MSC_VER >= 1300) - // #if defined(MY_CPU_ARM_OR_ARM64) - #define LZMA_LOG_BSR - // #endif - #endif -#endif - -// #include #ifdef LZMA_LOG_BSR -#if defined(__clang__) \ - || defined(__GNUC__) +#define kDicLogSizeMaxCompress 30 -/* - C code: : (30 - __builtin_clz(x)) - gcc9/gcc10 for x64 /x86 : 30 - (bsr(x) xor 31) - clang10 for x64 : 31 + (bsr(x) xor -32) -*/ +#define BSR2_RET(pos, res) { unsigned long i; _BitScanReverse(&i, (pos)); res = (i + i) + ((pos >> (i - 1)) & 1); } - #define MY_clz(x) ((unsigned)__builtin_clz(x)) - // __lzcnt32 - // __builtin_ia32_lzcnt_u32 - -#else // #if defined(_MSC_VER) - - #ifdef MY_CPU_ARM_OR_ARM64 - - #define MY_clz _CountLeadingZeros - - #else // if defined(MY_CPU_X86_OR_AMD64) - - // #define MY_clz __lzcnt // we can use lzcnt (unsupported by old CPU) - // _BitScanReverse code is not optimal for some MSVC compilers - #define BSR2_RET(pos, res) { unsigned long zz; _BitScanReverse(&zz, (pos)); zz--; \ - res = (zz + zz) + (pos >> zz); } - - #endif // MY_CPU_X86_OR_AMD64 - -#endif // _MSC_VER - - -#ifndef BSR2_RET - - #define BSR2_RET(pos, res) { unsigned zz = 30 - MY_clz(pos); \ - res = (zz + zz) + (pos >> zz); } - -#endif - - -unsigned GetPosSlot1(UInt32 pos); -unsigned GetPosSlot1(UInt32 pos) +UInt32 GetPosSlot1(UInt32 pos) { - unsigned res; + UInt32 res; BSR2_RET(pos, res); return res; } #define GetPosSlot2(pos, res) { BSR2_RET(pos, res); } #define GetPosSlot(pos, res) { if (pos < 2) res = pos; else BSR2_RET(pos, res); } +#else -#else // ! LZMA_LOG_BSR - -#define kNumLogBits (11 + sizeof(size_t) / 8 * 3) - +#define kNumLogBits (9 + (int)sizeof(size_t) / 2) #define kDicLogSizeMaxCompress ((kNumLogBits - 1) * 2 + 7) -static void LzmaEnc_FastPosInit(Byte *g_FastPos) +void LzmaEnc_FastPosInit(Byte *g_FastPos) { - unsigned slot; + int c = 2, slotFast; g_FastPos[0] = 0; g_FastPos[1] = 1; - g_FastPos += 2; - for (slot = 2; slot < kNumLogBits * 2; slot++) + for (slotFast = 2; slotFast < kNumLogBits * 2; slotFast++) { - size_t k = ((size_t)1 << ((slot >> 1) - 1)); - size_t j; - for (j = 0; j < k; j++) - g_FastPos[j] = (Byte)slot; - g_FastPos += k; + UInt32 k = (1 << ((slotFast >> 1) - 1)); + UInt32 j; + for (j = 0; j < k; j++, c++) + g_FastPos[c] = (Byte)slotFast; } } -/* we can use ((limit - pos) >> 31) only if (pos < ((UInt32)1 << 31)) */ -/* -#define BSR2_RET(pos, res) { unsigned zz = 6 + ((kNumLogBits - 1) & \ +#define BSR2_RET(pos, res) { UInt32 i = 6 + ((kNumLogBits - 1) & \ (0 - (((((UInt32)1 << (kNumLogBits + 6)) - 1) - pos) >> 31))); \ - res = p->g_FastPos[pos >> zz] + (zz * 2); } -*/ - -/* -#define BSR2_RET(pos, res) { unsigned zz = 6 + ((kNumLogBits - 1) & \ - (0 - (((((UInt32)1 << (kNumLogBits)) - 1) - (pos >> 6)) >> 31))); \ - res = p->g_FastPos[pos >> zz] + (zz * 2); } -*/ - -#define BSR2_RET(pos, res) { unsigned zz = (pos < (1 << (kNumLogBits + 6))) ? 6 : 6 + kNumLogBits - 1; \ - res = p->g_FastPos[pos >> zz] + (zz * 2); } - + res = p->g_FastPos[pos >> i] + (i * 2); } /* #define BSR2_RET(pos, res) { res = (pos < (1 << (kNumLogBits + 6))) ? \ p->g_FastPos[pos >> 6] + 12 : \ @@ -249,57 +130,55 @@ static void LzmaEnc_FastPosInit(Byte *g_FastPos) #define GetPosSlot1(pos) p->g_FastPos[pos] #define GetPosSlot2(pos, res) { BSR2_RET(pos, res); } -#define GetPosSlot(pos, res) { if (pos < kNumFullDistances) res = p->g_FastPos[pos & (kNumFullDistances - 1)]; else BSR2_RET(pos, res); } +#define GetPosSlot(pos, res) { if (pos < kNumFullDistances) res = p->g_FastPos[pos]; else BSR2_RET(pos, res); } -#endif // LZMA_LOG_BSR +#endif #define LZMA_NUM_REPS 4 -typedef UInt16 CState; -typedef UInt16 CExtra; +typedef unsigned CState; -typedef struct +typedef struct _COptimal { UInt32 price; + CState state; - CExtra extra; - // 0 : normal - // 1 : LIT : MATCH - // > 1 : MATCH (extra-1) : LIT : REP0 (len) - UInt32 len; - UInt32 dist; - UInt32 reps[LZMA_NUM_REPS]; + int prev1IsChar; + int prev2; + + UInt32 posPrev2; + UInt32 backPrev2; + + UInt32 posPrev; + UInt32 backPrev; + UInt32 backs[LZMA_NUM_REPS]; } COptimal; - -// 18.06 -#define kNumOpts (1 << 11) -#define kPackReserve (kNumOpts * 8) -// #define kNumOpts (1 << 12) -// #define kPackReserve (1 + kNumOpts * 2) +#define kNumOpts (1 << 12) #define kNumLenToPosStates 4 #define kNumPosSlotBits 6 -// #define kDicLogSizeMin 0 +#define kDicLogSizeMin 0 #define kDicLogSizeMax 32 #define kDistTableSizeMax (kDicLogSizeMax * 2) + #define kNumAlignBits 4 #define kAlignTableSize (1 << kNumAlignBits) #define kAlignMask (kAlignTableSize - 1) #define kStartPosModelIndex 4 #define kEndPosModelIndex 14 -#define kNumFullDistances (1 << (kEndPosModelIndex >> 1)) +#define kNumPosModels (kEndPosModelIndex - kStartPosModelIndex) -typedef -#ifdef Z7_LZMA_PROB32 - UInt32 +#define kNumFullDistances (1 << (kEndPosModelIndex / 2)) + +#ifdef _LZMA_PROB32 +#define CLzmaProb UInt32 #else - UInt16 +#define CLzmaProb UInt16 #endif - CLzmaProb; #define LZMA_PB_MAX 4 #define LZMA_LC_MAX 8 @@ -307,287 +186,270 @@ typedef #define LZMA_NUM_PB_STATES_MAX (1 << LZMA_PB_MAX) + #define kLenNumLowBits 3 #define kLenNumLowSymbols (1 << kLenNumLowBits) +#define kLenNumMidBits 3 +#define kLenNumMidSymbols (1 << kLenNumMidBits) #define kLenNumHighBits 8 #define kLenNumHighSymbols (1 << kLenNumHighBits) -#define kLenNumSymbolsTotal (kLenNumLowSymbols * 2 + kLenNumHighSymbols) + +#define kLenNumSymbolsTotal (kLenNumLowSymbols + kLenNumMidSymbols + kLenNumHighSymbols) #define LZMA_MATCH_LEN_MIN 2 #define LZMA_MATCH_LEN_MAX (LZMA_MATCH_LEN_MIN + kLenNumSymbolsTotal - 1) #define kNumStates 12 - typedef struct { - CLzmaProb low[LZMA_NUM_PB_STATES_MAX << (kLenNumLowBits + 1)]; + CLzmaProb choice; + CLzmaProb choice2; + CLzmaProb low[LZMA_NUM_PB_STATES_MAX << kLenNumLowBits]; + CLzmaProb mid[LZMA_NUM_PB_STATES_MAX << kLenNumMidBits]; CLzmaProb high[kLenNumHighSymbols]; } CLenEnc; - typedef struct { - unsigned tableSize; + CLenEnc p; UInt32 prices[LZMA_NUM_PB_STATES_MAX][kLenNumSymbolsTotal]; - // UInt32 prices1[LZMA_NUM_PB_STATES_MAX][kLenNumLowSymbols * 2]; - // UInt32 prices2[kLenNumSymbolsTotal]; + UInt32 tableSize; + UInt32 counters[LZMA_NUM_PB_STATES_MAX]; } CLenPriceEnc; -#define GET_PRICE_LEN(p, posState, len) \ - ((p)->prices[posState][(size_t)(len) - LZMA_MATCH_LEN_MIN]) - -/* -#define GET_PRICE_LEN(p, posState, len) \ - ((p)->prices2[(size_t)(len) - 2] + ((p)->prices1[posState][((len) - 2) & (kLenNumLowSymbols * 2 - 1)] & (((len) - 2 - kLenNumLowSymbols * 2) >> 9))) -*/ - -typedef struct +typedef struct _CRangeEnc { UInt32 range; - unsigned cache; + Byte cache; UInt64 low; UInt64 cacheSize; Byte *buf; Byte *bufLim; Byte *bufBase; - ISeqOutStreamPtr outStream; + ISeqOutStream *outStream; UInt64 processed; SRes res; } CRangeEnc; +typedef struct _CSeqInStreamBuf +{ + ISeqInStream funcTable; + const Byte *data; + SizeT rem; +} CSeqInStreamBuf; + +static SRes MyRead(void *pp, void *data, size_t *size) +{ + size_t curSize = *size; + CSeqInStreamBuf *p = (CSeqInStreamBuf *)pp; + if (p->rem < curSize) + curSize = p->rem; + memcpy(data, p->data, curSize); + p->rem -= curSize; + p->data += curSize; + *size = curSize; + return SZ_OK; +} typedef struct { CLzmaProb *litProbs; - unsigned state; - UInt32 reps[LZMA_NUM_REPS]; - - CLzmaProb posAlignEncoder[1 << kNumAlignBits]; + CLzmaProb isMatch[kNumStates][LZMA_NUM_PB_STATES_MAX]; CLzmaProb isRep[kNumStates]; CLzmaProb isRepG0[kNumStates]; CLzmaProb isRepG1[kNumStates]; CLzmaProb isRepG2[kNumStates]; - CLzmaProb isMatch[kNumStates][LZMA_NUM_PB_STATES_MAX]; CLzmaProb isRep0Long[kNumStates][LZMA_NUM_PB_STATES_MAX]; CLzmaProb posSlotEncoder[kNumLenToPosStates][1 << kNumPosSlotBits]; - CLzmaProb posEncoders[kNumFullDistances]; + CLzmaProb posEncoders[kNumFullDistances - kEndPosModelIndex]; + CLzmaProb posAlignEncoder[1 << kNumAlignBits]; - CLenEnc lenProbs; - CLenEnc repLenProbs; + CLenPriceEnc lenEnc; + CLenPriceEnc repLenEnc; + UInt32 reps[LZMA_NUM_REPS]; + UInt32 state; } CSaveState; - -typedef UInt32 CProbPrice; - - -struct CLzmaEnc +typedef struct _CLzmaEnc { + IMatchFinder matchFinder; void *matchFinderObj; - IMatchFinder2 matchFinder; - unsigned optCur; - unsigned optEnd; - - unsigned longestMatchLen; - unsigned numPairs; - UInt32 numAvail; - - unsigned state; - unsigned numFastBytes; - unsigned additionalOffset; - UInt32 reps[LZMA_NUM_REPS]; - unsigned lpMask, pbMask; - CLzmaProb *litProbs; - CRangeEnc rc; - - UInt32 backRes; - - unsigned lc, lp, pb; - unsigned lclp; - - BoolInt fastMode; - BoolInt writeEndMark; - BoolInt finished; - BoolInt multiThread; - BoolInt needInit; - // BoolInt _maxMode; - - UInt64 nowPos64; - - unsigned matchPriceCount; - // unsigned alignPriceCount; - int repLenEncCounter; - - unsigned distTableSize; - - UInt32 dictSize; - SRes result; - - #ifndef Z7_ST - BoolInt mtMode; - // begin of CMatchFinderMt is used in LZ thread + #ifdef COMPRESS_MF_MT + Bool mtMode; CMatchFinderMt matchFinderMt; - // end of CMatchFinderMt is used in BT and HASH threads - // #else - // CMatchFinder matchFinderBase; #endif + CMatchFinder matchFinderBase; - - // we suppose that we have 8-bytes alignment after CMatchFinder - - #ifndef Z7_ST + #ifdef COMPRESS_MF_MT Byte pad[128]; #endif - // LZ thread - CProbPrice ProbPrices[kBitModelTotal >> kNumMoveReducingBits]; + UInt32 optimumEndIndex; + UInt32 optimumCurrentIndex; - // we want {len , dist} pairs to be 8-bytes aligned in matches array - UInt32 matches[LZMA_MATCH_LEN_MAX * 2 + 2]; - - // we want 8-bytes alignment here - UInt32 alignPrices[kAlignTableSize]; - UInt32 posSlotPrices[kNumLenToPosStates][kDistTableSizeMax]; - UInt32 distancesPrices[kNumLenToPosStates][kNumFullDistances]; - - CLzmaProb posAlignEncoder[1 << kNumAlignBits]; - CLzmaProb isRep[kNumStates]; - CLzmaProb isRepG0[kNumStates]; - CLzmaProb isRepG1[kNumStates]; - CLzmaProb isRepG2[kNumStates]; - CLzmaProb isMatch[kNumStates][LZMA_NUM_PB_STATES_MAX]; - CLzmaProb isRep0Long[kNumStates][LZMA_NUM_PB_STATES_MAX]; - CLzmaProb posSlotEncoder[kNumLenToPosStates][1 << kNumPosSlotBits]; - CLzmaProb posEncoders[kNumFullDistances]; + UInt32 longestMatchLength; + UInt32 numPairs; + UInt32 numAvail; + COptimal opt[kNumOpts]; - CLenEnc lenProbs; - CLenEnc repLenProbs; - #ifndef LZMA_LOG_BSR Byte g_FastPos[1 << kNumLogBits]; #endif + UInt32 ProbPrices[kBitModelTotal >> kNumMoveReducingBits]; + UInt32 matches[LZMA_MATCH_LEN_MAX * 2 + 2 + 1]; + UInt32 numFastBytes; + UInt32 additionalOffset; + UInt32 reps[LZMA_NUM_REPS]; + UInt32 state; + + UInt32 posSlotPrices[kNumLenToPosStates][kDistTableSizeMax]; + UInt32 distancesPrices[kNumLenToPosStates][kNumFullDistances]; + UInt32 alignPrices[kAlignTableSize]; + UInt32 alignPriceCount; + + UInt32 distTableSize; + + unsigned lc, lp, pb; + unsigned lpMask, pbMask; + + CLzmaProb *litProbs; + + CLzmaProb isMatch[kNumStates][LZMA_NUM_PB_STATES_MAX]; + CLzmaProb isRep[kNumStates]; + CLzmaProb isRepG0[kNumStates]; + CLzmaProb isRepG1[kNumStates]; + CLzmaProb isRepG2[kNumStates]; + CLzmaProb isRep0Long[kNumStates][LZMA_NUM_PB_STATES_MAX]; + + CLzmaProb posSlotEncoder[kNumLenToPosStates][1 << kNumPosSlotBits]; + CLzmaProb posEncoders[kNumFullDistances - kEndPosModelIndex]; + CLzmaProb posAlignEncoder[1 << kNumAlignBits]; + CLenPriceEnc lenEnc; CLenPriceEnc repLenEnc; - COptimal opt[kNumOpts]; + unsigned lclp; + + Bool fastMode; + + CRangeEnc rc; + + Bool writeEndMark; + UInt64 nowPos64; + UInt32 matchPriceCount; + Bool finished; + Bool multiThread; + + SRes result; + UInt32 dictSize; + UInt32 matchFinderCycles; + + ISeqInStream *inStream; + CSeqInStreamBuf seqBufInStream; CSaveState saveState; +} CLzmaEnc; - // BoolInt mf_Failure; - #ifndef Z7_ST - Byte pad2[128]; - #endif -}; - - -#define MFB (p->matchFinderBase) -/* -#ifndef Z7_ST -#define MFB (p->matchFinderMt.MatchFinder) -#endif -*/ - -// #define GET_CLzmaEnc_p CLzmaEnc *p = (CLzmaEnc*)(void *)p; -// #define GET_const_CLzmaEnc_p const CLzmaEnc *p = (const CLzmaEnc*)(const void *)p; - -#define COPY_ARR(dest, src, arr) memcpy((dest)->arr, (src)->arr, sizeof((src)->arr)); - -#define COPY_LZMA_ENC_STATE(d, s, p) \ - (d)->state = (s)->state; \ - COPY_ARR(d, s, reps) \ - COPY_ARR(d, s, posAlignEncoder) \ - COPY_ARR(d, s, isRep) \ - COPY_ARR(d, s, isRepG0) \ - COPY_ARR(d, s, isRepG1) \ - COPY_ARR(d, s, isRepG2) \ - COPY_ARR(d, s, isMatch) \ - COPY_ARR(d, s, isRep0Long) \ - COPY_ARR(d, s, posSlotEncoder) \ - COPY_ARR(d, s, posEncoders) \ - (d)->lenProbs = (s)->lenProbs; \ - (d)->repLenProbs = (s)->repLenProbs; \ - memcpy((d)->litProbs, (s)->litProbs, ((UInt32)0x300 << (p)->lclp) * sizeof(CLzmaProb)); - -void LzmaEnc_SaveState(CLzmaEncHandle p) +void LzmaEnc_SaveState(CLzmaEncHandle pp) { - // GET_CLzmaEnc_p - CSaveState *v = &p->saveState; - COPY_LZMA_ENC_STATE(v, p, p) + CLzmaEnc *p = (CLzmaEnc *)pp; + CSaveState *dest = &p->saveState; + int i; + dest->lenEnc = p->lenEnc; + dest->repLenEnc = p->repLenEnc; + dest->state = p->state; + + for (i = 0; i < kNumStates; i++) + { + memcpy(dest->isMatch[i], p->isMatch[i], sizeof(p->isMatch[i])); + memcpy(dest->isRep0Long[i], p->isRep0Long[i], sizeof(p->isRep0Long[i])); + } + for (i = 0; i < kNumLenToPosStates; i++) + memcpy(dest->posSlotEncoder[i], p->posSlotEncoder[i], sizeof(p->posSlotEncoder[i])); + memcpy(dest->isRep, p->isRep, sizeof(p->isRep)); + memcpy(dest->isRepG0, p->isRepG0, sizeof(p->isRepG0)); + memcpy(dest->isRepG1, p->isRepG1, sizeof(p->isRepG1)); + memcpy(dest->isRepG2, p->isRepG2, sizeof(p->isRepG2)); + memcpy(dest->posEncoders, p->posEncoders, sizeof(p->posEncoders)); + memcpy(dest->posAlignEncoder, p->posAlignEncoder, sizeof(p->posAlignEncoder)); + memcpy(dest->reps, p->reps, sizeof(p->reps)); + memcpy(dest->litProbs, p->litProbs, (0x300 << p->lclp) * sizeof(CLzmaProb)); } -void LzmaEnc_RestoreState(CLzmaEncHandle p) +void LzmaEnc_RestoreState(CLzmaEncHandle pp) { - // GET_CLzmaEnc_p - const CSaveState *v = &p->saveState; - COPY_LZMA_ENC_STATE(p, v, p) + CLzmaEnc *dest = (CLzmaEnc *)pp; + const CSaveState *p = &dest->saveState; + int i; + dest->lenEnc = p->lenEnc; + dest->repLenEnc = p->repLenEnc; + dest->state = p->state; + + for (i = 0; i < kNumStates; i++) + { + memcpy(dest->isMatch[i], p->isMatch[i], sizeof(p->isMatch[i])); + memcpy(dest->isRep0Long[i], p->isRep0Long[i], sizeof(p->isRep0Long[i])); + } + for (i = 0; i < kNumLenToPosStates; i++) + memcpy(dest->posSlotEncoder[i], p->posSlotEncoder[i], sizeof(p->posSlotEncoder[i])); + memcpy(dest->isRep, p->isRep, sizeof(p->isRep)); + memcpy(dest->isRepG0, p->isRepG0, sizeof(p->isRepG0)); + memcpy(dest->isRepG1, p->isRepG1, sizeof(p->isRepG1)); + memcpy(dest->isRepG2, p->isRepG2, sizeof(p->isRepG2)); + memcpy(dest->posEncoders, p->posEncoders, sizeof(p->posEncoders)); + memcpy(dest->posAlignEncoder, p->posAlignEncoder, sizeof(p->posAlignEncoder)); + memcpy(dest->reps, p->reps, sizeof(p->reps)); + memcpy(dest->litProbs, p->litProbs, (0x300 << dest->lclp) * sizeof(CLzmaProb)); } - -Z7_NO_INLINE -SRes LzmaEnc_SetProps(CLzmaEncHandle p, const CLzmaEncProps *props2) +SRes LzmaEnc_SetProps(CLzmaEncHandle pp, const CLzmaEncProps *props2) { - // GET_CLzmaEnc_p + CLzmaEnc *p = (CLzmaEnc *)pp; CLzmaEncProps props = *props2; LzmaEncProps_Normalize(&props); - if (props.lc > LZMA_LC_MAX - || props.lp > LZMA_LP_MAX - || props.pb > LZMA_PB_MAX) + if (props.lc > LZMA_LC_MAX || props.lp > LZMA_LP_MAX || props.pb > LZMA_PB_MAX || + props.dictSize > (1 << kDicLogSizeMaxCompress) || props.dictSize > (1 << 30)) return SZ_ERROR_PARAM; - - - if (props.dictSize > kLzmaMaxHistorySize) - props.dictSize = kLzmaMaxHistorySize; - - #ifndef LZMA_LOG_BSR - { - const UInt64 dict64 = props.dictSize; - if (dict64 > ((UInt64)1 << kDicLogSizeMaxCompress)) - return SZ_ERROR_PARAM; - } - #endif - p->dictSize = props.dictSize; + p->matchFinderCycles = props.mc; { - unsigned fb = (unsigned)props.fb; + unsigned fb = props.fb; if (fb < 5) fb = 5; if (fb > LZMA_MATCH_LEN_MAX) fb = LZMA_MATCH_LEN_MAX; p->numFastBytes = fb; } - p->lc = (unsigned)props.lc; - p->lp = (unsigned)props.lp; - p->pb = (unsigned)props.pb; + p->lc = props.lc; + p->lp = props.lp; + p->pb = props.pb; p->fastMode = (props.algo == 0); - // p->_maxMode = True; - MFB.btMode = (Byte)(props.btMode ? 1 : 0); - // MFB.btMode = (Byte)(props.btMode); + p->matchFinderBase.btMode = props.btMode; { - unsigned numHashBytes = 4; + UInt32 numHashBytes = 4; if (props.btMode) { - if (props.numHashBytes < 2) numHashBytes = 2; - else if (props.numHashBytes < 4) numHashBytes = (unsigned)props.numHashBytes; + if (props.numHashBytes < 2) + numHashBytes = 2; + else if (props.numHashBytes < 4) + numHashBytes = props.numHashBytes; } - if (props.numHashBytes >= 5) numHashBytes = 5; - - MFB.numHashBytes = numHashBytes; - // MFB.numHashBytes_Min = 2; - MFB.numHashOutBits = (Byte)props.numHashOutBits; + p->matchFinderBase.numHashBytes = numHashBytes; } - MFB.cutValue = props.mc; + p->matchFinderBase.cutValue = props.mc; - p->writeEndMark = (BoolInt)props.writeEndMark; + p->writeEndMark = props.writeEndMark; - #ifndef Z7_ST + #ifdef COMPRESS_MF_MT /* if (newMultiThread != _multiThread) { @@ -596,73 +458,56 @@ SRes LzmaEnc_SetProps(CLzmaEncHandle p, const CLzmaEncProps *props2) } */ p->multiThread = (props.numThreads > 1); - p->matchFinderMt.btSync.affinity = - p->matchFinderMt.hashSync.affinity = props.affinity; #endif return SZ_OK; } +static const int kLiteralNextStates[kNumStates] = {0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 4, 5}; +static const int kMatchNextStates[kNumStates] = {7, 7, 7, 7, 7, 7, 7, 10, 10, 10, 10, 10}; +static const int kRepNextStates[kNumStates] = {8, 8, 8, 8, 8, 8, 8, 11, 11, 11, 11, 11}; +static const int kShortRepNextStates[kNumStates]= {9, 9, 9, 9, 9, 9, 9, 11, 11, 11, 11, 11}; -void LzmaEnc_SetDataSize(CLzmaEncHandle p, UInt64 expectedDataSiize) -{ - // GET_CLzmaEnc_p - MFB.expectedDataSize = expectedDataSiize; -} +#define IsCharState(s) ((s) < 7) - -#define kState_Start 0 -#define kState_LitAfterMatch 4 -#define kState_LitAfterRep 5 -#define kState_MatchAfterLit 7 -#define kState_RepAfterLit 8 - -static const Byte kLiteralNextStates[kNumStates] = {0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 4, 5}; -static const Byte kMatchNextStates[kNumStates] = {7, 7, 7, 7, 7, 7, 7, 10, 10, 10, 10, 10}; -static const Byte kRepNextStates[kNumStates] = {8, 8, 8, 8, 8, 8, 8, 11, 11, 11, 11, 11}; -static const Byte kShortRepNextStates[kNumStates]= {9, 9, 9, 9, 9, 9, 9, 11, 11, 11, 11, 11}; - -#define IsLitState(s) ((s) < 7) -#define GetLenToPosState2(len) (((len) < kNumLenToPosStates - 1) ? (len) : kNumLenToPosStates - 1) #define GetLenToPosState(len) (((len) < kNumLenToPosStates + 1) ? (len) - 2 : kNumLenToPosStates - 1) #define kInfinityPrice (1 << 30) static void RangeEnc_Construct(CRangeEnc *p) { - p->outStream = NULL; - p->bufBase = NULL; + p->outStream = 0; + p->bufBase = 0; } -#define RangeEnc_GetProcessed(p) ( (p)->processed + (size_t)((p)->buf - (p)->bufBase) + (p)->cacheSize) -#define RangeEnc_GetProcessed_sizet(p) ((size_t)(p)->processed + (size_t)((p)->buf - (p)->bufBase) + (size_t)(p)->cacheSize) +#define RangeEnc_GetProcessed(p) ((p)->processed + ((p)->buf - (p)->bufBase) + (p)->cacheSize) #define RC_BUF_SIZE (1 << 16) - -static int RangeEnc_Alloc(CRangeEnc *p, ISzAllocPtr alloc) +static int RangeEnc_Alloc(CRangeEnc *p, ISzAlloc *alloc) { - if (!p->bufBase) + if (p->bufBase == 0) { - p->bufBase = (Byte *)ISzAlloc_Alloc(alloc, RC_BUF_SIZE); - if (!p->bufBase) + p->bufBase = (Byte *)alloc->Alloc(alloc, RC_BUF_SIZE); + if (p->bufBase == 0) return 0; p->bufLim = p->bufBase + RC_BUF_SIZE; } return 1; } -static void RangeEnc_Free(CRangeEnc *p, ISzAllocPtr alloc) +static void RangeEnc_Free(CRangeEnc *p, ISzAlloc *alloc) { - ISzAlloc_Free(alloc, p->bufBase); - p->bufBase = NULL; + alloc->Free(alloc, p->bufBase); + p->bufBase = 0; } static void RangeEnc_Init(CRangeEnc *p) { - p->range = 0xFFFFFFFF; - p->cache = 0; + /* Stream.Init(); */ p->low = 0; - p->cacheSize = 0; + p->range = 0xFFFFFFFF; + p->cacheSize = 1; + p->cache = 0; p->buf = p->bufBase; @@ -670,48 +515,37 @@ static void RangeEnc_Init(CRangeEnc *p) p->res = SZ_OK; } -Z7_NO_INLINE static void RangeEnc_FlushStream(CRangeEnc *p) +static void RangeEnc_FlushStream(CRangeEnc *p) { - const size_t num = (size_t)(p->buf - p->bufBase); - if (p->res == SZ_OK) - { - if (num != ISeqOutStream_Write(p->outStream, p->bufBase, num)) - p->res = SZ_ERROR_WRITE; - } + size_t num; + if (p->res != SZ_OK) + return; + num = p->buf - p->bufBase; + if (num != p->outStream->Write(p->outStream, p->bufBase, num)) + p->res = SZ_ERROR_WRITE; p->processed += num; p->buf = p->bufBase; } -Z7_NO_INLINE static void Z7_FASTCALL RangeEnc_ShiftLow(CRangeEnc *p) +static void MY_FAST_CALL RangeEnc_ShiftLow(CRangeEnc *p) { - UInt32 low = (UInt32)p->low; - unsigned high = (unsigned)(p->low >> 32); - p->low = (UInt32)(low << 8); - if (low < (UInt32)0xFF000000 || high != 0) + if ((UInt32)p->low < (UInt32)0xFF000000 || (int)(p->low >> 32) != 0) { + Byte temp = p->cache; + do { Byte *buf = p->buf; - *buf++ = (Byte)(p->cache + high); - p->cache = (unsigned)(low >> 24); + *buf++ = (Byte)(temp + (Byte)(p->low >> 32)); p->buf = buf; if (buf == p->bufLim) RangeEnc_FlushStream(p); - if (p->cacheSize == 0) - return; - } - high += 0xFF; - for (;;) - { - Byte *buf = p->buf; - *buf++ = (Byte)(high); - p->buf = buf; - if (buf == p->bufLim) - RangeEnc_FlushStream(p); - if (--p->cacheSize == 0) - return; + temp = 0xFF; } + while (--p->cacheSize != 0); + p->cache = (Byte)((UInt32)p->low >> 24); } p->cacheSize++; + p->low = (UInt32)p->low << 8; } static void RangeEnc_FlushData(CRangeEnc *p) @@ -721,121 +555,78 @@ static void RangeEnc_FlushData(CRangeEnc *p) RangeEnc_ShiftLow(p); } -#define RC_NORM(p) if (range < kTopValue) { range <<= 8; RangeEnc_ShiftLow(p); } - -#define RC_BIT_PRE(p, prob) \ - ttt = *(prob); \ - newBound = (range >> kNumBitModelTotalBits) * ttt; - -// #define Z7_LZMA_ENC_USE_BRANCH - -#ifdef Z7_LZMA_ENC_USE_BRANCH - -#define RC_BIT(p, prob, bit) { \ - RC_BIT_PRE(p, prob) \ - if (bit == 0) { range = newBound; ttt += (kBitModelTotal - ttt) >> kNumMoveBits; } \ - else { (p)->low += newBound; range -= newBound; ttt -= ttt >> kNumMoveBits; } \ - *(prob) = (CLzmaProb)ttt; \ - RC_NORM(p) \ - } - -#else - -#define RC_BIT(p, prob, bit) { \ - UInt32 mask; \ - RC_BIT_PRE(p, prob) \ - mask = 0 - (UInt32)bit; \ - range &= mask; \ - mask &= newBound; \ - range -= mask; \ - (p)->low += mask; \ - mask = (UInt32)bit - 1; \ - range += newBound & mask; \ - mask &= (kBitModelTotal - ((1 << kNumMoveBits) - 1)); \ - mask += ((1 << kNumMoveBits) - 1); \ - ttt += (UInt32)((Int32)(mask - ttt) >> kNumMoveBits); \ - *(prob) = (CLzmaProb)ttt; \ - RC_NORM(p) \ - } - -#endif - - - - -#define RC_BIT_0_BASE(p, prob) \ - range = newBound; *(prob) = (CLzmaProb)(ttt + ((kBitModelTotal - ttt) >> kNumMoveBits)); - -#define RC_BIT_1_BASE(p, prob) \ - range -= newBound; (p)->low += newBound; *(prob) = (CLzmaProb)(ttt - (ttt >> kNumMoveBits)); \ - -#define RC_BIT_0(p, prob) \ - RC_BIT_0_BASE(p, prob) \ - RC_NORM(p) - -#define RC_BIT_1(p, prob) \ - RC_BIT_1_BASE(p, prob) \ - RC_NORM(p) - -static void RangeEnc_EncodeBit_0(CRangeEnc *p, CLzmaProb *prob) +static void RangeEnc_EncodeDirectBits(CRangeEnc *p, UInt32 value, int numBits) { - UInt32 range, ttt, newBound; - range = p->range; - RC_BIT_PRE(p, prob) - RC_BIT_0(p, prob) - p->range = range; -} - -static void LitEnc_Encode(CRangeEnc *p, CLzmaProb *probs, UInt32 sym) -{ - UInt32 range = p->range; - sym |= 0x100; do { - UInt32 ttt, newBound; - // RangeEnc_EncodeBit(p, probs + (sym >> 8), (sym >> 7) & 1); - CLzmaProb *prob = probs + (sym >> 8); - UInt32 bit = (sym >> 7) & 1; - sym <<= 1; - RC_BIT(p, prob, bit) + p->range >>= 1; + p->low += p->range & (0 - ((value >> --numBits) & 1)); + if (p->range < kTopValue) + { + p->range <<= 8; + RangeEnc_ShiftLow(p); + } } - while (sym < 0x10000); - p->range = range; + while (numBits != 0); } -static void LitEnc_EncodeMatched(CRangeEnc *p, CLzmaProb *probs, UInt32 sym, UInt32 matchByte) +static void RangeEnc_EncodeBit(CRangeEnc *p, CLzmaProb *prob, UInt32 symbol) +{ + UInt32 ttt = *prob; + UInt32 newBound = (p->range >> kNumBitModelTotalBits) * ttt; + if (symbol == 0) + { + p->range = newBound; + ttt += (kBitModelTotal - ttt) >> kNumMoveBits; + } + else + { + p->low += newBound; + p->range -= newBound; + ttt -= ttt >> kNumMoveBits; + } + *prob = (CLzmaProb)ttt; + if (p->range < kTopValue) + { + p->range <<= 8; + RangeEnc_ShiftLow(p); + } +} + +static void LitEnc_Encode(CRangeEnc *p, CLzmaProb *probs, UInt32 symbol) +{ + symbol |= 0x100; + do + { + RangeEnc_EncodeBit(p, probs + (symbol >> 8), (symbol >> 7) & 1); + symbol <<= 1; + } + while (symbol < 0x10000); +} + +static void LitEnc_EncodeMatched(CRangeEnc *p, CLzmaProb *probs, UInt32 symbol, UInt32 matchByte) { - UInt32 range = p->range; UInt32 offs = 0x100; - sym |= 0x100; + symbol |= 0x100; do { - UInt32 ttt, newBound; - CLzmaProb *prob; - UInt32 bit; matchByte <<= 1; - // RangeEnc_EncodeBit(p, probs + (offs + (matchByte & offs) + (sym >> 8)), (sym >> 7) & 1); - prob = probs + (offs + (matchByte & offs) + (sym >> 8)); - bit = (sym >> 7) & 1; - sym <<= 1; - offs &= ~(matchByte ^ sym); - RC_BIT(p, prob, bit) + RangeEnc_EncodeBit(p, probs + (offs + (matchByte & offs) + (symbol >> 8)), (symbol >> 7) & 1); + symbol <<= 1; + offs &= ~(matchByte ^ symbol); } - while (sym < 0x10000); - p->range = range; + while (symbol < 0x10000); } - - -static void LzmaEnc_InitPriceTables(CProbPrice *ProbPrices) +void LzmaEnc_InitPriceTables(UInt32 *ProbPrices) { UInt32 i; - for (i = 0; i < (kBitModelTotal >> kNumMoveReducingBits); i++) + for (i = (1 << kNumMoveReducingBits) / 2; i < kBitModelTotal; i += (1 << kNumMoveReducingBits)) { - const unsigned kCyclesBits = kNumBitPriceShiftBits; - UInt32 w = (i << kNumMoveReducingBits) + (1 << (kNumMoveReducingBits - 1)); - unsigned bitCount = 0; - unsigned j; + const int kCyclesBits = kNumBitPriceShiftBits; + UInt32 w = i; + UInt32 bitCount = 0; + int j; for (j = 0; j < kCyclesBits; j++) { w = w * w; @@ -846,663 +637,554 @@ static void LzmaEnc_InitPriceTables(CProbPrice *ProbPrices) bitCount++; } } - ProbPrices[i] = (CProbPrice)(((unsigned)kNumBitModelTotalBits << kCyclesBits) - 15 - bitCount); - // printf("\n%3d: %5d", i, ProbPrices[i]); + ProbPrices[i >> kNumMoveReducingBits] = ((kNumBitModelTotalBits << kCyclesBits) - 15 - bitCount); } } -#define GET_PRICE(prob, bit) \ - p->ProbPrices[((prob) ^ (unsigned)(((-(int)(bit))) & (kBitModelTotal - 1))) >> kNumMoveReducingBits] +#define GET_PRICE(prob, symbol) \ + p->ProbPrices[((prob) ^ (((-(int)(symbol))) & (kBitModelTotal - 1))) >> kNumMoveReducingBits]; -#define GET_PRICEa(prob, bit) \ - ProbPrices[((prob) ^ (unsigned)((-((int)(bit))) & (kBitModelTotal - 1))) >> kNumMoveReducingBits] +#define GET_PRICEa(prob, symbol) \ + ProbPrices[((prob) ^ ((-((int)(symbol))) & (kBitModelTotal - 1))) >> kNumMoveReducingBits]; #define GET_PRICE_0(prob) p->ProbPrices[(prob) >> kNumMoveReducingBits] #define GET_PRICE_1(prob) p->ProbPrices[((prob) ^ (kBitModelTotal - 1)) >> kNumMoveReducingBits] -#define GET_PRICEa_0(prob) ProbPrices[(prob) >> kNumMoveReducingBits] -#define GET_PRICEa_1(prob) ProbPrices[((prob) ^ (kBitModelTotal - 1)) >> kNumMoveReducingBits] +#define GET_PRICE_0a(prob) ProbPrices[(prob) >> kNumMoveReducingBits] +#define GET_PRICE_1a(prob) ProbPrices[((prob) ^ (kBitModelTotal - 1)) >> kNumMoveReducingBits] - -static UInt32 LitEnc_GetPrice(const CLzmaProb *probs, UInt32 sym, const CProbPrice *ProbPrices) +static UInt32 LitEnc_GetPrice(const CLzmaProb *probs, UInt32 symbol, UInt32 *ProbPrices) { UInt32 price = 0; - sym |= 0x100; + symbol |= 0x100; do { - unsigned bit = sym & 1; - sym >>= 1; - price += GET_PRICEa(probs[sym], bit); + price += GET_PRICEa(probs[symbol >> 8], (symbol >> 7) & 1); + symbol <<= 1; } - while (sym >= 2); + while (symbol < 0x10000); return price; } - -static UInt32 LitEnc_Matched_GetPrice(const CLzmaProb *probs, UInt32 sym, UInt32 matchByte, const CProbPrice *ProbPrices) +static UInt32 LitEnc_GetPriceMatched(const CLzmaProb *probs, UInt32 symbol, UInt32 matchByte, UInt32 *ProbPrices) { UInt32 price = 0; UInt32 offs = 0x100; - sym |= 0x100; + symbol |= 0x100; do { matchByte <<= 1; - price += GET_PRICEa(probs[offs + (matchByte & offs) + (sym >> 8)], (sym >> 7) & 1); - sym <<= 1; - offs &= ~(matchByte ^ sym); + price += GET_PRICEa(probs[offs + (matchByte & offs) + (symbol >> 8)], (symbol >> 7) & 1); + symbol <<= 1; + offs &= ~(matchByte ^ symbol); } - while (sym < 0x10000); + while (symbol < 0x10000); return price; } -static void RcTree_ReverseEncode(CRangeEnc *rc, CLzmaProb *probs, unsigned numBits, unsigned sym) +static void RcTree_Encode(CRangeEnc *rc, CLzmaProb *probs, int numBitLevels, UInt32 symbol) { - UInt32 range = rc->range; - unsigned m = 1; - do + UInt32 m = 1; + int i; + for (i = numBitLevels; i != 0;) { - UInt32 ttt, newBound; - unsigned bit = sym & 1; - // RangeEnc_EncodeBit(rc, probs + m, bit); - sym >>= 1; - RC_BIT(rc, probs + m, bit) + UInt32 bit; + i--; + bit = (symbol >> i) & 1; + RangeEnc_EncodeBit(rc, probs + m, bit); m = (m << 1) | bit; } - while (--numBits); - rc->range = range; } +static void RcTree_ReverseEncode(CRangeEnc *rc, CLzmaProb *probs, int numBitLevels, UInt32 symbol) +{ + UInt32 m = 1; + int i; + for (i = 0; i < numBitLevels; i++) + { + UInt32 bit = symbol & 1; + RangeEnc_EncodeBit(rc, probs + m, bit); + m = (m << 1) | bit; + symbol >>= 1; + } +} + +static UInt32 RcTree_GetPrice(const CLzmaProb *probs, int numBitLevels, UInt32 symbol, UInt32 *ProbPrices) +{ + UInt32 price = 0; + symbol |= (1 << numBitLevels); + while (symbol != 1) + { + price += GET_PRICEa(probs[symbol >> 1], symbol & 1); + symbol >>= 1; + } + return price; +} + +static UInt32 RcTree_ReverseGetPrice(const CLzmaProb *probs, int numBitLevels, UInt32 symbol, UInt32 *ProbPrices) +{ + UInt32 price = 0; + UInt32 m = 1; + int i; + for (i = numBitLevels; i != 0; i--) + { + UInt32 bit = symbol & 1; + symbol >>= 1; + price += GET_PRICEa(probs[m], bit); + m = (m << 1) | bit; + } + return price; +} static void LenEnc_Init(CLenEnc *p) { unsigned i; - for (i = 0; i < (LZMA_NUM_PB_STATES_MAX << (kLenNumLowBits + 1)); i++) + p->choice = p->choice2 = kProbInitValue; + for (i = 0; i < (LZMA_NUM_PB_STATES_MAX << kLenNumLowBits); i++) p->low[i] = kProbInitValue; + for (i = 0; i < (LZMA_NUM_PB_STATES_MAX << kLenNumMidBits); i++) + p->mid[i] = kProbInitValue; for (i = 0; i < kLenNumHighSymbols; i++) p->high[i] = kProbInitValue; } -static void LenEnc_Encode(CLenEnc *p, CRangeEnc *rc, unsigned sym, unsigned posState) +static void LenEnc_Encode(CLenEnc *p, CRangeEnc *rc, UInt32 symbol, UInt32 posState) { - UInt32 range, ttt, newBound; - CLzmaProb *probs = p->low; - range = rc->range; - RC_BIT_PRE(rc, probs) - if (sym >= kLenNumLowSymbols) + if (symbol < kLenNumLowSymbols) { - RC_BIT_1(rc, probs) - probs += kLenNumLowSymbols; - RC_BIT_PRE(rc, probs) - if (sym >= kLenNumLowSymbols * 2) + RangeEnc_EncodeBit(rc, &p->choice, 0); + RcTree_Encode(rc, p->low + (posState << kLenNumLowBits), kLenNumLowBits, symbol); + } + else + { + RangeEnc_EncodeBit(rc, &p->choice, 1); + if (symbol < kLenNumLowSymbols + kLenNumMidSymbols) { - RC_BIT_1(rc, probs) - rc->range = range; - // RcTree_Encode(rc, p->high, kLenNumHighBits, sym - kLenNumLowSymbols * 2); - LitEnc_Encode(rc, p->high, sym - kLenNumLowSymbols * 2); + RangeEnc_EncodeBit(rc, &p->choice2, 0); + RcTree_Encode(rc, p->mid + (posState << kLenNumMidBits), kLenNumMidBits, symbol - kLenNumLowSymbols); + } + else + { + RangeEnc_EncodeBit(rc, &p->choice2, 1); + RcTree_Encode(rc, p->high, kLenNumHighBits, symbol - kLenNumLowSymbols - kLenNumMidSymbols); + } + } +} + +static void LenEnc_SetPrices(CLenEnc *p, UInt32 posState, UInt32 numSymbols, UInt32 *prices, UInt32 *ProbPrices) +{ + UInt32 a0 = GET_PRICE_0a(p->choice); + UInt32 a1 = GET_PRICE_1a(p->choice); + UInt32 b0 = a1 + GET_PRICE_0a(p->choice2); + UInt32 b1 = a1 + GET_PRICE_1a(p->choice2); + UInt32 i = 0; + for (i = 0; i < kLenNumLowSymbols; i++) + { + if (i >= numSymbols) return; - } - sym -= kLenNumLowSymbols; + prices[i] = a0 + RcTree_GetPrice(p->low + (posState << kLenNumLowBits), kLenNumLowBits, i, ProbPrices); } - - // RcTree_Encode(rc, probs + (posState << kLenNumLowBits), kLenNumLowBits, sym); + for (; i < kLenNumLowSymbols + kLenNumMidSymbols; i++) { - unsigned m; - unsigned bit; - RC_BIT_0(rc, probs) - probs += (posState << (1 + kLenNumLowBits)); - bit = (sym >> 2) ; RC_BIT(rc, probs + 1, bit) m = (1 << 1) + bit; - bit = (sym >> 1) & 1; RC_BIT(rc, probs + m, bit) m = (m << 1) + bit; - bit = sym & 1; RC_BIT(rc, probs + m, bit) - rc->range = range; + if (i >= numSymbols) + return; + prices[i] = b0 + RcTree_GetPrice(p->mid + (posState << kLenNumMidBits), kLenNumMidBits, i - kLenNumLowSymbols, ProbPrices); } + for (; i < numSymbols; i++) + prices[i] = b1 + RcTree_GetPrice(p->high, kLenNumHighBits, i - kLenNumLowSymbols - kLenNumMidSymbols, ProbPrices); } -static void SetPrices_3(const CLzmaProb *probs, UInt32 startPrice, UInt32 *prices, const CProbPrice *ProbPrices) +static void MY_FAST_CALL LenPriceEnc_UpdateTable(CLenPriceEnc *p, UInt32 posState, UInt32 *ProbPrices) { - unsigned i; - for (i = 0; i < 8; i += 2) - { - UInt32 price = startPrice; - UInt32 prob; - price += GET_PRICEa(probs[1 ], (i >> 2)); - price += GET_PRICEa(probs[2 + (i >> 2)], (i >> 1) & 1); - prob = probs[4 + (i >> 1)]; - prices[i ] = price + GET_PRICEa_0(prob); - prices[i + 1] = price + GET_PRICEa_1(prob); - } + LenEnc_SetPrices(&p->p, posState, p->tableSize, p->prices[posState], ProbPrices); + p->counters[posState] = p->tableSize; } - -Z7_NO_INLINE static void Z7_FASTCALL LenPriceEnc_UpdateTables( - CLenPriceEnc *p, - unsigned numPosStates, - const CLenEnc *enc, - const CProbPrice *ProbPrices) +static void LenPriceEnc_UpdateTables(CLenPriceEnc *p, UInt32 numPosStates, UInt32 *ProbPrices) { - UInt32 b; - - { - unsigned prob = enc->low[0]; - UInt32 a, c; - unsigned posState; - b = GET_PRICEa_1(prob); - a = GET_PRICEa_0(prob); - c = b + GET_PRICEa_0(enc->low[kLenNumLowSymbols]); - for (posState = 0; posState < numPosStates; posState++) - { - UInt32 *prices = p->prices[posState]; - const CLzmaProb *probs = enc->low + (posState << (1 + kLenNumLowBits)); - SetPrices_3(probs, a, prices, ProbPrices); - SetPrices_3(probs + kLenNumLowSymbols, c, prices + kLenNumLowSymbols, ProbPrices); - } - } - - /* - { - unsigned i; - UInt32 b; - a = GET_PRICEa_0(enc->low[0]); - for (i = 0; i < kLenNumLowSymbols; i++) - p->prices2[i] = a; - a = GET_PRICEa_1(enc->low[0]); - b = a + GET_PRICEa_0(enc->low[kLenNumLowSymbols]); - for (i = kLenNumLowSymbols; i < kLenNumLowSymbols * 2; i++) - p->prices2[i] = b; - a += GET_PRICEa_1(enc->low[kLenNumLowSymbols]); - } - */ - - // p->counter = numSymbols; - // p->counter = 64; - - { - unsigned i = p->tableSize; - - if (i > kLenNumLowSymbols * 2) - { - const CLzmaProb *probs = enc->high; - UInt32 *prices = p->prices[0] + kLenNumLowSymbols * 2; - i -= kLenNumLowSymbols * 2 - 1; - i >>= 1; - b += GET_PRICEa_1(enc->low[kLenNumLowSymbols]); - do - { - /* - p->prices2[i] = a + - // RcTree_GetPrice(enc->high, kLenNumHighBits, i - kLenNumLowSymbols * 2, ProbPrices); - LitEnc_GetPrice(probs, i - kLenNumLowSymbols * 2, ProbPrices); - */ - // UInt32 price = a + RcTree_GetPrice(probs, kLenNumHighBits - 1, sym, ProbPrices); - unsigned sym = --i + (1 << (kLenNumHighBits - 1)); - UInt32 price = b; - do - { - unsigned bit = sym & 1; - sym >>= 1; - price += GET_PRICEa(probs[sym], bit); - } - while (sym >= 2); - - { - unsigned prob = probs[(size_t)i + (1 << (kLenNumHighBits - 1))]; - prices[(size_t)i * 2 ] = price + GET_PRICEa_0(prob); - prices[(size_t)i * 2 + 1] = price + GET_PRICEa_1(prob); - } - } - while (i); - - { - unsigned posState; - size_t num = (p->tableSize - kLenNumLowSymbols * 2) * sizeof(p->prices[0][0]); - for (posState = 1; posState < numPosStates; posState++) - memcpy(p->prices[posState] + kLenNumLowSymbols * 2, p->prices[0] + kLenNumLowSymbols * 2, num); - } - } - } + UInt32 posState; + for (posState = 0; posState < numPosStates; posState++) + LenPriceEnc_UpdateTable(p, posState, ProbPrices); } -/* +static void LenEnc_Encode2(CLenPriceEnc *p, CRangeEnc *rc, UInt32 symbol, UInt32 posState, Bool updatePrice, UInt32 *ProbPrices) +{ + LenEnc_Encode(&p->p, rc, symbol, posState); + if (updatePrice) + if (--p->counters[posState] == 0) + LenPriceEnc_UpdateTable(p, posState, ProbPrices); +} + + + + +static void MovePos(CLzmaEnc *p, UInt32 num) +{ #ifdef SHOW_STAT - g_STAT_OFFSET += num; - printf("\n MovePos %u", num); + ttt += num; + printf("\n MovePos %d", num); #endif -*/ - -#define MOVE_POS(p, num) { \ - p->additionalOffset += (num); \ - p->matchFinder.Skip(p->matchFinderObj, (UInt32)(num)); } + if (num != 0) + { + p->additionalOffset += num; + p->matchFinder.Skip(p->matchFinderObj, num); + } +} - -static unsigned ReadMatchDistances(CLzmaEnc *p, unsigned *numPairsRes) +static UInt32 ReadMatchDistances(CLzmaEnc *p, UInt32 *numDistancePairsRes) { - unsigned numPairs; - - p->additionalOffset++; + UInt32 lenRes = 0, numPairs; p->numAvail = p->matchFinder.GetNumAvailableBytes(p->matchFinderObj); - { - const UInt32 *d = p->matchFinder.GetMatches(p->matchFinderObj, p->matches); - // if (!d) { p->mf_Failure = True; *numPairsRes = 0; return 0; } - numPairs = (unsigned)(d - p->matches); - } - *numPairsRes = numPairs; - + numPairs = p->matchFinder.GetMatches(p->matchFinderObj, p->matches); #ifdef SHOW_STAT - printf("\n i = %u numPairs = %u ", g_STAT_OFFSET, numPairs / 2); - g_STAT_OFFSET++; + printf("\n i = %d numPairs = %d ", ttt, numPairs / 2); + ttt++; { - unsigned i; + UInt32 i; for (i = 0; i < numPairs; i += 2) - printf("%2u %6u | ", p->matches[i], p->matches[i + 1]); + printf("%2d %6d | ", p->matches[i], p->matches[i + 1]); } #endif - - if (numPairs == 0) - return 0; + if (numPairs > 0) { - const unsigned len = p->matches[(size_t)numPairs - 2]; - if (len != p->numFastBytes) - return len; + lenRes = p->matches[numPairs - 2]; + if (lenRes == p->numFastBytes) { + const Byte *pby = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1; + UInt32 distance = p->matches[numPairs - 1] + 1; UInt32 numAvail = p->numAvail; if (numAvail > LZMA_MATCH_LEN_MAX) numAvail = LZMA_MATCH_LEN_MAX; { - const Byte *p1 = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1; - const Byte *p2 = p1 + len; - const ptrdiff_t dif = (ptrdiff_t)-1 - (ptrdiff_t)p->matches[(size_t)numPairs - 1]; - const Byte *lim = p1 + numAvail; - for (; p2 != lim && *p2 == p2[dif]; p2++) - {} - return (unsigned)(p2 - p1); + const Byte *pby2 = pby - distance; + for (; lenRes < numAvail && pby[lenRes] == pby2[lenRes]; lenRes++); } } } + p->additionalOffset++; + *numDistancePairsRes = numPairs; + return lenRes; } -#define MARK_LIT ((UInt32)(Int32)-1) -#define MakeAs_Lit(p) { (p)->dist = MARK_LIT; (p)->extra = 0; } -#define MakeAs_ShortRep(p) { (p)->dist = 0; (p)->extra = 0; } -#define IsShortRep(p) ((p)->dist == 0) +#define MakeAsChar(p) (p)->backPrev = (UInt32)(-1); (p)->prev1IsChar = False; +#define MakeAsShortRep(p) (p)->backPrev = 0; (p)->prev1IsChar = False; +#define IsShortRep(p) ((p)->backPrev == 0) +static UInt32 GetRepLen1Price(CLzmaEnc *p, UInt32 state, UInt32 posState) +{ + return + GET_PRICE_0(p->isRepG0[state]) + + GET_PRICE_0(p->isRep0Long[state][posState]); +} -#define GetPrice_ShortRep(p, state, posState) \ - ( GET_PRICE_0(p->isRepG0[state]) + GET_PRICE_0(p->isRep0Long[state][posState])) - -#define GetPrice_Rep_0(p, state, posState) ( \ - GET_PRICE_1(p->isMatch[state][posState]) \ - + GET_PRICE_1(p->isRep0Long[state][posState])) \ - + GET_PRICE_1(p->isRep[state]) \ - + GET_PRICE_0(p->isRepG0[state]) - -Z7_FORCE_INLINE -static UInt32 GetPrice_PureRep(const CLzmaEnc *p, unsigned repIndex, size_t state, size_t posState) +static UInt32 GetPureRepPrice(CLzmaEnc *p, UInt32 repIndex, UInt32 state, UInt32 posState) { UInt32 price; - UInt32 prob = p->isRepG0[state]; if (repIndex == 0) { - price = GET_PRICE_0(prob); + price = GET_PRICE_0(p->isRepG0[state]); price += GET_PRICE_1(p->isRep0Long[state][posState]); } else { - price = GET_PRICE_1(prob); - prob = p->isRepG1[state]; + price = GET_PRICE_1(p->isRepG0[state]); if (repIndex == 1) - price += GET_PRICE_0(prob); + price += GET_PRICE_0(p->isRepG1[state]); else { - price += GET_PRICE_1(prob); + price += GET_PRICE_1(p->isRepG1[state]); price += GET_PRICE(p->isRepG2[state], repIndex - 2); } } return price; } - -static unsigned Backward(CLzmaEnc *p, unsigned cur) +static UInt32 GetRepPrice(CLzmaEnc *p, UInt32 repIndex, UInt32 len, UInt32 state, UInt32 posState) { - unsigned wr = cur + 1; - p->optEnd = wr; - - for (;;) - { - UInt32 dist = p->opt[cur].dist; - unsigned len = (unsigned)p->opt[cur].len; - unsigned extra = (unsigned)p->opt[cur].extra; - cur -= len; - - if (extra) - { - wr--; - p->opt[wr].len = (UInt32)len; - cur -= extra; - len = extra; - if (extra == 1) - { - p->opt[wr].dist = dist; - dist = MARK_LIT; - } - else - { - p->opt[wr].dist = 0; - len--; - wr--; - p->opt[wr].dist = MARK_LIT; - p->opt[wr].len = 1; - } - } - - if (cur == 0) - { - p->backRes = dist; - p->optCur = wr; - return len; - } - - wr--; - p->opt[wr].dist = dist; - p->opt[wr].len = (UInt32)len; - } + return p->repLenEnc.prices[posState][len - LZMA_MATCH_LEN_MIN] + + GetPureRepPrice(p, repIndex, state, posState); } - - -#define LIT_PROBS(pos, prevByte) \ - (p->litProbs + (UInt32)3 * (((((pos) << 8) + (prevByte)) & p->lpMask) << p->lc)) - - -static unsigned GetOptimum(CLzmaEnc *p, UInt32 position) +static UInt32 Backward(CLzmaEnc *p, UInt32 *backRes, UInt32 cur) { - unsigned last, cur; - UInt32 reps[LZMA_NUM_REPS]; - unsigned repLens[LZMA_NUM_REPS]; + UInt32 posMem = p->opt[cur].posPrev; + UInt32 backMem = p->opt[cur].backPrev; + p->optimumEndIndex = cur; + do + { + if (p->opt[cur].prev1IsChar) + { + MakeAsChar(&p->opt[posMem]) + p->opt[posMem].posPrev = posMem - 1; + if (p->opt[cur].prev2) + { + p->opt[posMem - 1].prev1IsChar = False; + p->opt[posMem - 1].posPrev = p->opt[cur].posPrev2; + p->opt[posMem - 1].backPrev = p->opt[cur].backPrev2; + } + } + { + UInt32 posPrev = posMem; + UInt32 backCur = backMem; + + backMem = p->opt[posPrev].backPrev; + posMem = p->opt[posPrev].posPrev; + + p->opt[posPrev].backPrev = backCur; + p->opt[posPrev].posPrev = cur; + cur = posPrev; + } + } + while (cur != 0); + *backRes = p->opt[0].backPrev; + p->optimumCurrentIndex = p->opt[0].posPrev; + return p->optimumCurrentIndex; +} + +#define LIT_PROBS(pos, prevByte) (p->litProbs + ((((pos) & p->lpMask) << p->lc) + ((prevByte) >> (8 - p->lc))) * 0x300) + +static UInt32 GetOptimum(CLzmaEnc *p, UInt32 position, UInt32 *backRes) +{ + UInt32 numAvail, mainLen, numPairs, repMaxIndex, i, posState, lenEnd, len, cur; + UInt32 matchPrice, repMatchPrice, normalMatchPrice; + UInt32 reps[LZMA_NUM_REPS], repLens[LZMA_NUM_REPS]; UInt32 *matches; + const Byte *data; + Byte curByte, matchByte; + if (p->optimumEndIndex != p->optimumCurrentIndex) + { + const COptimal *opt = &p->opt[p->optimumCurrentIndex]; + UInt32 lenRes = opt->posPrev - p->optimumCurrentIndex; + *backRes = opt->backPrev; + p->optimumCurrentIndex = opt->posPrev; + return lenRes; + } + p->optimumCurrentIndex = p->optimumEndIndex = 0; + + if (p->additionalOffset == 0) + mainLen = ReadMatchDistances(p, &numPairs); + else + { + mainLen = p->longestMatchLength; + numPairs = p->numPairs; + } + + numAvail = p->numAvail; + if (numAvail < 2) + { + *backRes = (UInt32)(-1); + return 1; + } + if (numAvail > LZMA_MATCH_LEN_MAX) + numAvail = LZMA_MATCH_LEN_MAX; + + data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1; + repMaxIndex = 0; + for (i = 0; i < LZMA_NUM_REPS; i++) + { + UInt32 lenTest; + const Byte *data2; + reps[i] = p->reps[i]; + data2 = data - (reps[i] + 1); + if (data[0] != data2[0] || data[1] != data2[1]) + { + repLens[i] = 0; + continue; + } + for (lenTest = 2; lenTest < numAvail && data[lenTest] == data2[lenTest]; lenTest++); + repLens[i] = lenTest; + if (lenTest > repLens[repMaxIndex]) + repMaxIndex = i; + } + if (repLens[repMaxIndex] >= p->numFastBytes) + { + UInt32 lenRes; + *backRes = repMaxIndex; + lenRes = repLens[repMaxIndex]; + MovePos(p, lenRes - 1); + return lenRes; + } + + matches = p->matches; + if (mainLen >= p->numFastBytes) + { + *backRes = matches[numPairs - 1] + LZMA_NUM_REPS; + MovePos(p, mainLen - 1); + return mainLen; + } + curByte = *data; + matchByte = *(data - (reps[0] + 1)); + + if (mainLen < 2 && curByte != matchByte && repLens[repMaxIndex] < 2) + { + *backRes = (UInt32)-1; + return 1; + } + + p->opt[0].state = (CState)p->state; + + posState = (position & p->pbMask); { - UInt32 numAvail; - unsigned numPairs, mainLen, repMaxIndex, i, posState; - UInt32 matchPrice, repMatchPrice; - const Byte *data; - Byte curByte, matchByte; - - p->optCur = p->optEnd = 0; - - if (p->additionalOffset == 0) - mainLen = ReadMatchDistances(p, &numPairs); - else - { - mainLen = p->longestMatchLen; - numPairs = p->numPairs; - } - - numAvail = p->numAvail; - if (numAvail < 2) - { - p->backRes = MARK_LIT; - return 1; - } - if (numAvail > LZMA_MATCH_LEN_MAX) - numAvail = LZMA_MATCH_LEN_MAX; - - data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1; - repMaxIndex = 0; - - for (i = 0; i < LZMA_NUM_REPS; i++) - { - unsigned len; - const Byte *data2; - reps[i] = p->reps[i]; - data2 = data - reps[i]; - if (data[0] != data2[0] || data[1] != data2[1]) - { - repLens[i] = 0; - continue; - } - for (len = 2; len < numAvail && data[len] == data2[len]; len++) - {} - repLens[i] = len; - if (len > repLens[repMaxIndex]) - repMaxIndex = i; - if (len == LZMA_MATCH_LEN_MAX) // 21.03 : optimization - break; - } - - if (repLens[repMaxIndex] >= p->numFastBytes) - { - unsigned len; - p->backRes = (UInt32)repMaxIndex; - len = repLens[repMaxIndex]; - MOVE_POS(p, len - 1) - return len; - } - - matches = p->matches; - #define MATCHES matches - // #define MATCHES p->matches - - if (mainLen >= p->numFastBytes) - { - p->backRes = MATCHES[(size_t)numPairs - 1] + LZMA_NUM_REPS; - MOVE_POS(p, mainLen - 1) - return mainLen; - } - - curByte = *data; - matchByte = *(data - reps[0]); - - last = repLens[repMaxIndex]; - if (last <= mainLen) - last = mainLen; - - if (last < 2 && curByte != matchByte) - { - p->backRes = MARK_LIT; - return 1; - } - - p->opt[0].state = (CState)p->state; - - posState = (position & p->pbMask); - - { - const CLzmaProb *probs = LIT_PROBS(position, *(data - 1)); - p->opt[1].price = GET_PRICE_0(p->isMatch[p->state][posState]) + - (!IsLitState(p->state) ? - LitEnc_Matched_GetPrice(probs, curByte, matchByte, p->ProbPrices) : + const CLzmaProb *probs = LIT_PROBS(position, *(data - 1)); + p->opt[1].price = GET_PRICE_0(p->isMatch[p->state][posState]) + + (!IsCharState(p->state) ? + LitEnc_GetPriceMatched(probs, curByte, matchByte, p->ProbPrices) : LitEnc_GetPrice(probs, curByte, p->ProbPrices)); - } + } - MakeAs_Lit(&p->opt[1]) - - matchPrice = GET_PRICE_1(p->isMatch[p->state][posState]); - repMatchPrice = matchPrice + GET_PRICE_1(p->isRep[p->state]); - - // 18.06 - if (matchByte == curByte && repLens[0] == 0) - { - UInt32 shortRepPrice = repMatchPrice + GetPrice_ShortRep(p, p->state, posState); - if (shortRepPrice < p->opt[1].price) - { - p->opt[1].price = shortRepPrice; - MakeAs_ShortRep(&p->opt[1]) - } - if (last < 2) - { - p->backRes = p->opt[1].dist; - return 1; - } - } - - p->opt[1].len = 1; - - p->opt[0].reps[0] = reps[0]; - p->opt[0].reps[1] = reps[1]; - p->opt[0].reps[2] = reps[2]; - p->opt[0].reps[3] = reps[3]; - - // ---------- REP ---------- - - for (i = 0; i < LZMA_NUM_REPS; i++) - { - unsigned repLen = repLens[i]; - UInt32 price; - if (repLen < 2) - continue; - price = repMatchPrice + GetPrice_PureRep(p, i, p->state, posState); - do - { - UInt32 price2 = price + GET_PRICE_LEN(&p->repLenEnc, posState, repLen); - COptimal *opt = &p->opt[repLen]; - if (price2 < opt->price) - { - opt->price = price2; - opt->len = (UInt32)repLen; - opt->dist = (UInt32)i; - opt->extra = 0; - } - } - while (--repLen >= 2); - } - - - // ---------- MATCH ---------- - { - unsigned len = repLens[0] + 1; - if (len <= mainLen) - { - unsigned offs = 0; - UInt32 normalMatchPrice = matchPrice + GET_PRICE_0(p->isRep[p->state]); + MakeAsChar(&p->opt[1]); - if (len < 2) - len = 2; - else - while (len > MATCHES[offs]) - offs += 2; - - for (; ; len++) - { - COptimal *opt; - UInt32 dist = MATCHES[(size_t)offs + 1]; - UInt32 price = normalMatchPrice + GET_PRICE_LEN(&p->lenEnc, posState, len); - unsigned lenToPosState = GetLenToPosState(len); - - if (dist < kNumFullDistances) - price += p->distancesPrices[lenToPosState][dist & (kNumFullDistances - 1)]; - else - { - unsigned slot; - GetPosSlot2(dist, slot) - price += p->alignPrices[dist & kAlignMask]; - price += p->posSlotPrices[lenToPosState][slot]; - } - - opt = &p->opt[len]; - - if (price < opt->price) - { - opt->price = price; - opt->len = (UInt32)len; - opt->dist = dist + LZMA_NUM_REPS; - opt->extra = 0; - } - - if (len == MATCHES[offs]) - { - offs += 2; - if (offs == numPairs) - break; - } - } + matchPrice = GET_PRICE_1(p->isMatch[p->state][posState]); + repMatchPrice = matchPrice + GET_PRICE_1(p->isRep[p->state]); + + if (matchByte == curByte) + { + UInt32 shortRepPrice = repMatchPrice + GetRepLen1Price(p, p->state, posState); + if (shortRepPrice < p->opt[1].price) + { + p->opt[1].price = shortRepPrice; + MakeAsShortRep(&p->opt[1]); + } + } + lenEnd = ((mainLen >= repLens[repMaxIndex]) ? mainLen : repLens[repMaxIndex]); + + if (lenEnd < 2) + { + *backRes = p->opt[1].backPrev; + return 1; + } + + p->opt[1].posPrev = 0; + for (i = 0; i < LZMA_NUM_REPS; i++) + p->opt[0].backs[i] = reps[i]; + + len = lenEnd; + do + p->opt[len--].price = kInfinityPrice; + while (len >= 2); + + for (i = 0; i < LZMA_NUM_REPS; i++) + { + UInt32 repLen = repLens[i]; + UInt32 price; + if (repLen < 2) + continue; + price = repMatchPrice + GetPureRepPrice(p, i, p->state, posState); + do + { + UInt32 curAndLenPrice = price + p->repLenEnc.prices[posState][repLen - 2]; + COptimal *opt = &p->opt[repLen]; + if (curAndLenPrice < opt->price) + { + opt->price = curAndLenPrice; + opt->posPrev = 0; + opt->backPrev = i; + opt->prev1IsChar = False; } } - + while (--repLen >= 2); + } - cur = 0; + normalMatchPrice = matchPrice + GET_PRICE_0(p->isRep[p->state]); + + len = ((repLens[0] >= 2) ? repLens[0] + 1 : 2); + if (len <= mainLen) + { + UInt32 offs = 0; + while (len > matches[offs]) + offs += 2; + for (; ; len++) + { + COptimal *opt; + UInt32 distance = matches[offs + 1]; + + UInt32 curAndLenPrice = normalMatchPrice + p->lenEnc.prices[posState][len - LZMA_MATCH_LEN_MIN]; + UInt32 lenToPosState = GetLenToPosState(len); + if (distance < kNumFullDistances) + curAndLenPrice += p->distancesPrices[lenToPosState][distance]; + else + { + UInt32 slot; + GetPosSlot2(distance, slot); + curAndLenPrice += p->alignPrices[distance & kAlignMask] + p->posSlotPrices[lenToPosState][slot]; + } + opt = &p->opt[len]; + if (curAndLenPrice < opt->price) + { + opt->price = curAndLenPrice; + opt->posPrev = 0; + opt->backPrev = distance + LZMA_NUM_REPS; + opt->prev1IsChar = False; + } + if (len == matches[offs]) + { + offs += 2; + if (offs == numPairs) + break; + } + } + } + + cur = 0; #ifdef SHOW_STAT2 - /* if (position >= 0) */ + if (position >= 0) { unsigned i; printf("\n pos = %4X", position); - for (i = cur; i <= last; i++) - printf("\nprice[%4X] = %u", position - cur + i, p->opt[i].price); + for (i = cur; i <= lenEnd; i++) + printf("\nprice[%4X] = %d", position - cur + i, p->opt[i].price); } #endif - } - - - - // ---------- Optimal Parsing ---------- for (;;) { - unsigned numAvail; - UInt32 numAvailFull; - unsigned newLen, numPairs, prev, state, posState, startLen; - UInt32 litPrice, matchPrice, repMatchPrice; - BoolInt nextIsLit; + UInt32 numAvailFull, newLen, numPairs, posPrev, state, posState, startLen; + UInt32 curPrice, curAnd1Price, matchPrice, repMatchPrice; + Bool nextIsChar; Byte curByte, matchByte; const Byte *data; - COptimal *curOpt, *nextOpt; + COptimal *curOpt; + COptimal *nextOpt; - if (++cur == last) - break; - - // 18.06 - if (cur >= kNumOpts - 64) - { - unsigned j, best; - UInt32 price = p->opt[cur].price; - best = cur; - for (j = cur + 1; j <= last; j++) - { - UInt32 price2 = p->opt[j].price; - if (price >= price2) - { - price = price2; - best = j; - } - } - { - unsigned delta = best - cur; - if (delta != 0) - { - MOVE_POS(p, delta) - } - } - cur = best; - break; - } + cur++; + if (cur == lenEnd) + return Backward(p, backRes, cur); newLen = ReadMatchDistances(p, &numPairs); - if (newLen >= p->numFastBytes) { p->numPairs = numPairs; - p->longestMatchLen = newLen; - break; + p->longestMatchLength = newLen; + return Backward(p, backRes, cur); } - - curOpt = &p->opt[cur]; - position++; - - // we need that check here, if skip_items in p->opt are possible - /* - if (curOpt->price >= kInfinityPrice) - continue; - */ - - prev = cur - curOpt->len; - - if (curOpt->len == 1) + curOpt = &p->opt[cur]; + posPrev = curOpt->posPrev; + if (curOpt->prev1IsChar) + { + posPrev--; + if (curOpt->prev2) + { + state = p->opt[curOpt->posPrev2].state; + if (curOpt->backPrev2 < LZMA_NUM_REPS) + state = kRepNextStates[state]; + else + state = kMatchNextStates[state]; + } + else + state = p->opt[posPrev].state; + state = kLiteralNextStates[state]; + } + else + state = p->opt[posPrev].state; + if (posPrev == cur - 1) { - state = (unsigned)p->opt[prev].state; if (IsShortRep(curOpt)) state = kShortRepNextStates[state]; else @@ -1510,499 +1192,355 @@ static unsigned GetOptimum(CLzmaEnc *p, UInt32 position) } else { + UInt32 pos; const COptimal *prevOpt; - UInt32 b0; - UInt32 dist = curOpt->dist; - - if (curOpt->extra) + if (curOpt->prev1IsChar && curOpt->prev2) { - prev -= (unsigned)curOpt->extra; - state = kState_RepAfterLit; - if (curOpt->extra == 1) - state = (dist < LZMA_NUM_REPS ? kState_RepAfterLit : kState_MatchAfterLit); + posPrev = curOpt->posPrev2; + pos = curOpt->backPrev2; + state = kRepNextStates[state]; } else { - state = (unsigned)p->opt[prev].state; - if (dist < LZMA_NUM_REPS) + pos = curOpt->backPrev; + if (pos < LZMA_NUM_REPS) state = kRepNextStates[state]; else state = kMatchNextStates[state]; } - - prevOpt = &p->opt[prev]; - b0 = prevOpt->reps[0]; - - if (dist < LZMA_NUM_REPS) + prevOpt = &p->opt[posPrev]; + if (pos < LZMA_NUM_REPS) { - if (dist == 0) - { - reps[0] = b0; - reps[1] = prevOpt->reps[1]; - reps[2] = prevOpt->reps[2]; - reps[3] = prevOpt->reps[3]; - } - else - { - reps[1] = b0; - b0 = prevOpt->reps[1]; - if (dist == 1) - { - reps[0] = b0; - reps[2] = prevOpt->reps[2]; - reps[3] = prevOpt->reps[3]; - } - else - { - reps[2] = b0; - reps[0] = prevOpt->reps[dist]; - reps[3] = prevOpt->reps[dist ^ 1]; - } - } + UInt32 i; + reps[0] = prevOpt->backs[pos]; + for (i = 1; i <= pos; i++) + reps[i] = prevOpt->backs[i - 1]; + for (; i < LZMA_NUM_REPS; i++) + reps[i] = prevOpt->backs[i]; } else { - reps[0] = (dist - LZMA_NUM_REPS + 1); - reps[1] = b0; - reps[2] = prevOpt->reps[1]; - reps[3] = prevOpt->reps[2]; + UInt32 i; + reps[0] = (pos - LZMA_NUM_REPS); + for (i = 1; i < LZMA_NUM_REPS; i++) + reps[i] = prevOpt->backs[i - 1]; } } - curOpt->state = (CState)state; - curOpt->reps[0] = reps[0]; - curOpt->reps[1] = reps[1]; - curOpt->reps[2] = reps[2]; - curOpt->reps[3] = reps[3]; + curOpt->backs[0] = reps[0]; + curOpt->backs[1] = reps[1]; + curOpt->backs[2] = reps[2]; + curOpt->backs[3] = reps[3]; + + curPrice = curOpt->price; + nextIsChar = False; data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1; curByte = *data; - matchByte = *(data - reps[0]); + matchByte = *(data - (reps[0] + 1)); posState = (position & p->pbMask); - /* - The order of Price checks: - < LIT - <= SHORT_REP - < LIT : REP_0 - < REP [ : LIT : REP_0 ] - < MATCH [ : LIT : REP_0 ] - */ - - { - UInt32 curPrice = curOpt->price; - unsigned prob = p->isMatch[state][posState]; - matchPrice = curPrice + GET_PRICE_1(prob); - litPrice = curPrice + GET_PRICE_0(prob); - } - - nextOpt = &p->opt[(size_t)cur + 1]; - nextIsLit = False; - - // here we can allow skip_items in p->opt, if we don't check (nextOpt->price < kInfinityPrice) - // 18.new.06 - if ((nextOpt->price < kInfinityPrice - // && !IsLitState(state) - && matchByte == curByte) - || litPrice > nextOpt->price - ) - litPrice = 0; - else + curAnd1Price = curPrice + GET_PRICE_0(p->isMatch[state][posState]); { const CLzmaProb *probs = LIT_PROBS(position, *(data - 1)); - litPrice += (!IsLitState(state) ? - LitEnc_Matched_GetPrice(probs, curByte, matchByte, p->ProbPrices) : + curAnd1Price += + (!IsCharState(state) ? + LitEnc_GetPriceMatched(probs, curByte, matchByte, p->ProbPrices) : LitEnc_GetPrice(probs, curByte, p->ProbPrices)); - - if (litPrice < nextOpt->price) - { - nextOpt->price = litPrice; - nextOpt->len = 1; - MakeAs_Lit(nextOpt) - nextIsLit = True; - } } + nextOpt = &p->opt[cur + 1]; + + if (curAnd1Price < nextOpt->price) + { + nextOpt->price = curAnd1Price; + nextOpt->posPrev = cur; + MakeAsChar(nextOpt); + nextIsChar = True; + } + + matchPrice = curPrice + GET_PRICE_1(p->isMatch[state][posState]); repMatchPrice = matchPrice + GET_PRICE_1(p->isRep[state]); - numAvailFull = p->numAvail; + if (matchByte == curByte && !(nextOpt->posPrev < cur && nextOpt->backPrev == 0)) { - unsigned temp = kNumOpts - 1 - cur; - if (numAvailFull > temp) - numAvailFull = (UInt32)temp; - } - - // 18.06 - // ---------- SHORT_REP ---------- - if (IsLitState(state)) // 18.new - if (matchByte == curByte) - if (repMatchPrice < nextOpt->price) // 18.new - // if (numAvailFull < 2 || data[1] != *(data - reps[0] + 1)) - if ( - // nextOpt->price >= kInfinityPrice || - nextOpt->len < 2 // we can check nextOpt->len, if skip items are not allowed in p->opt - || (nextOpt->dist != 0 - // && nextOpt->extra <= 1 // 17.old - ) - ) - { - UInt32 shortRepPrice = repMatchPrice + GetPrice_ShortRep(p, state, posState); - // if (shortRepPrice <= nextOpt->price) // 17.old - if (shortRepPrice < nextOpt->price) // 18.new + UInt32 shortRepPrice = repMatchPrice + GetRepLen1Price(p, state, posState); + if (shortRepPrice <= nextOpt->price) { nextOpt->price = shortRepPrice; - nextOpt->len = 1; - MakeAs_ShortRep(nextOpt) - nextIsLit = False; + nextOpt->posPrev = cur; + MakeAsShortRep(nextOpt); + nextIsChar = True; } } - + numAvailFull = p->numAvail; + { + UInt32 temp = kNumOpts - 1 - cur; + if (temp < numAvailFull) + numAvailFull = temp; + } + if (numAvailFull < 2) continue; numAvail = (numAvailFull <= p->numFastBytes ? numAvailFull : p->numFastBytes); - // numAvail <= p->numFastBytes - - // ---------- LIT : REP_0 ---------- - - if (!nextIsLit - && litPrice != 0 // 18.new - && matchByte != curByte - && numAvailFull > 2) + if (!nextIsChar && matchByte != curByte) /* speed optimization */ { - const Byte *data2 = data - reps[0]; - if (data[1] == data2[1] && data[2] == data2[2]) + /* try Literal + rep0 */ + UInt32 temp; + UInt32 lenTest2; + const Byte *data2 = data - (reps[0] + 1); + UInt32 limit = p->numFastBytes + 1; + if (limit > numAvailFull) + limit = numAvailFull; + + for (temp = 1; temp < limit && data[temp] == data2[temp]; temp++); + lenTest2 = temp - 1; + if (lenTest2 >= 2) { - unsigned len; - unsigned limit = p->numFastBytes + 1; - if (limit > numAvailFull) - limit = numAvailFull; - for (len = 3; len < limit && data[len] == data2[len]; len++) - {} - + UInt32 state2 = kLiteralNextStates[state]; + UInt32 posStateNext = (position + 1) & p->pbMask; + UInt32 nextRepMatchPrice = curAnd1Price + + GET_PRICE_1(p->isMatch[state2][posStateNext]) + + GET_PRICE_1(p->isRep[state2]); + /* for (; lenTest2 >= 2; lenTest2--) */ { - unsigned state2 = kLiteralNextStates[state]; - unsigned posState2 = (position + 1) & p->pbMask; - UInt32 price = litPrice + GetPrice_Rep_0(p, state2, posState2); + UInt32 curAndLenPrice; + COptimal *opt; + UInt32 offset = cur + 1 + lenTest2; + while (lenEnd < offset) + p->opt[++lenEnd].price = kInfinityPrice; + curAndLenPrice = nextRepMatchPrice + GetRepPrice(p, 0, lenTest2, state2, posStateNext); + opt = &p->opt[offset]; + if (curAndLenPrice < opt->price) { - unsigned offset = cur + len; - - if (last < offset) - last = offset; - - // do - { - UInt32 price2; - COptimal *opt; - len--; - // price2 = price + GetPrice_Len_Rep_0(p, len, state2, posState2); - price2 = price + GET_PRICE_LEN(&p->repLenEnc, posState2, len); - - opt = &p->opt[offset]; - // offset--; - if (price2 < opt->price) - { - opt->price = price2; - opt->len = (UInt32)len; - opt->dist = 0; - opt->extra = 1; - } - } - // while (len >= 3); + opt->price = curAndLenPrice; + opt->posPrev = cur + 1; + opt->backPrev = 0; + opt->prev1IsChar = True; + opt->prev2 = False; } } } } startLen = 2; /* speed optimization */ - { - // ---------- REP ---------- - unsigned repIndex = 0; // 17.old - // unsigned repIndex = IsLitState(state) ? 0 : 1; // 18.notused - for (; repIndex < LZMA_NUM_REPS; repIndex++) + UInt32 repIndex; + for (repIndex = 0; repIndex < LZMA_NUM_REPS; repIndex++) + { + UInt32 lenTest; + UInt32 lenTestTemp; + UInt32 price; + const Byte *data2 = data - (reps[repIndex] + 1); + if (data[0] != data2[0] || data[1] != data2[1]) + continue; + for (lenTest = 2; lenTest < numAvail && data[lenTest] == data2[lenTest]; lenTest++); + while (lenEnd < cur + lenTest) + p->opt[++lenEnd].price = kInfinityPrice; + lenTestTemp = lenTest; + price = repMatchPrice + GetPureRepPrice(p, repIndex, state, posState); + do { - unsigned len; - UInt32 price; - const Byte *data2 = data - reps[repIndex]; - if (data[0] != data2[0] || data[1] != data2[1]) - continue; - - for (len = 2; len < numAvail && data[len] == data2[len]; len++) - {} - - // if (len < startLen) continue; // 18.new: speed optimization - + UInt32 curAndLenPrice = price + p->repLenEnc.prices[posState][lenTest - 2]; + COptimal *opt = &p->opt[cur + lenTest]; + if (curAndLenPrice < opt->price) { - unsigned offset = cur + len; - if (last < offset) - last = offset; - } - { - unsigned len2 = len; - price = repMatchPrice + GetPrice_PureRep(p, repIndex, state, posState); - do - { - UInt32 price2 = price + GET_PRICE_LEN(&p->repLenEnc, posState, len2); - COptimal *opt = &p->opt[cur + len2]; - if (price2 < opt->price) - { - opt->price = price2; - opt->len = (UInt32)len2; - opt->dist = (UInt32)repIndex; - opt->extra = 0; - } - } - while (--len2 >= 2); - } - - if (repIndex == 0) startLen = len + 1; // 17.old - // startLen = len + 1; // 18.new - - /* if (_maxMode) */ - { - // ---------- REP : LIT : REP_0 ---------- - // numFastBytes + 1 + numFastBytes - - unsigned len2 = len + 1; - unsigned limit = len2 + p->numFastBytes; - if (limit > numAvailFull) - limit = numAvailFull; - - len2 += 2; - if (len2 <= limit) - if (data[len2 - 2] == data2[len2 - 2]) - if (data[len2 - 1] == data2[len2 - 1]) - { - unsigned state2 = kRepNextStates[state]; - unsigned posState2 = (position + len) & p->pbMask; - price += GET_PRICE_LEN(&p->repLenEnc, posState, len) - + GET_PRICE_0(p->isMatch[state2][posState2]) - + LitEnc_Matched_GetPrice(LIT_PROBS(position + len, data[(size_t)len - 1]), - data[len], data2[len], p->ProbPrices); - - // state2 = kLiteralNextStates[state2]; - state2 = kState_LitAfterRep; - posState2 = (posState2 + 1) & p->pbMask; - - - price += GetPrice_Rep_0(p, state2, posState2); - - for (; len2 < limit && data[len2] == data2[len2]; len2++) - {} - - len2 -= len; - // if (len2 >= 3) - { - { - unsigned offset = cur + len + len2; - - if (last < offset) - last = offset; - // do - { - UInt32 price2; - COptimal *opt; - len2--; - // price2 = price + GetPrice_Len_Rep_0(p, len2, state2, posState2); - price2 = price + GET_PRICE_LEN(&p->repLenEnc, posState2, len2); - - opt = &p->opt[offset]; - // offset--; - if (price2 < opt->price) - { - opt->price = price2; - opt->len = (UInt32)len2; - opt->extra = (CExtra)(len + 1); - opt->dist = (UInt32)repIndex; - } - } - // while (len2 >= 3); - } - } - } + opt->price = curAndLenPrice; + opt->posPrev = cur; + opt->backPrev = repIndex; + opt->prev1IsChar = False; } } + while (--lenTest >= 2); + lenTest = lenTestTemp; + + if (repIndex == 0) + startLen = lenTest + 1; + + /* if (_maxMode) */ + { + UInt32 lenTest2 = lenTest + 1; + UInt32 limit = lenTest2 + p->numFastBytes; + UInt32 nextRepMatchPrice; + if (limit > numAvailFull) + limit = numAvailFull; + for (; lenTest2 < limit && data[lenTest2] == data2[lenTest2]; lenTest2++); + lenTest2 -= lenTest + 1; + if (lenTest2 >= 2) + { + UInt32 state2 = kRepNextStates[state]; + UInt32 posStateNext = (position + lenTest) & p->pbMask; + UInt32 curAndLenCharPrice = + price + p->repLenEnc.prices[posState][lenTest - 2] + + GET_PRICE_0(p->isMatch[state2][posStateNext]) + + LitEnc_GetPriceMatched(LIT_PROBS(position + lenTest, data[lenTest - 1]), + data[lenTest], data2[lenTest], p->ProbPrices); + state2 = kLiteralNextStates[state2]; + posStateNext = (position + lenTest + 1) & p->pbMask; + nextRepMatchPrice = curAndLenCharPrice + + GET_PRICE_1(p->isMatch[state2][posStateNext]) + + GET_PRICE_1(p->isRep[state2]); + + /* for (; lenTest2 >= 2; lenTest2--) */ + { + UInt32 curAndLenPrice; + COptimal *opt; + UInt32 offset = cur + lenTest + 1 + lenTest2; + while (lenEnd < offset) + p->opt[++lenEnd].price = kInfinityPrice; + curAndLenPrice = nextRepMatchPrice + GetRepPrice(p, 0, lenTest2, state2, posStateNext); + opt = &p->opt[offset]; + if (curAndLenPrice < opt->price) + { + opt->price = curAndLenPrice; + opt->posPrev = cur + lenTest + 1; + opt->backPrev = 0; + opt->prev1IsChar = True; + opt->prev2 = True; + opt->posPrev2 = cur; + opt->backPrev2 = repIndex; + } + } + } + } } - - - // ---------- MATCH ---------- - /* for (unsigned len = 2; len <= newLen; len++) */ + } + /* for (UInt32 lenTest = 2; lenTest <= newLen; lenTest++) */ if (newLen > numAvail) { newLen = numAvail; - for (numPairs = 0; newLen > MATCHES[numPairs]; numPairs += 2); - MATCHES[numPairs] = (UInt32)newLen; + for (numPairs = 0; newLen > matches[numPairs]; numPairs += 2); + matches[numPairs] = newLen; numPairs += 2; } - - // startLen = 2; /* speed optimization */ - if (newLen >= startLen) { UInt32 normalMatchPrice = matchPrice + GET_PRICE_0(p->isRep[state]); - UInt32 dist; - unsigned offs, posSlot, len; - - { - unsigned offset = cur + newLen; - if (last < offset) - last = offset; - } + UInt32 offs, curBack, posSlot; + UInt32 lenTest; + while (lenEnd < cur + newLen) + p->opt[++lenEnd].price = kInfinityPrice; offs = 0; - while (startLen > MATCHES[offs]) + while (startLen > matches[offs]) offs += 2; - dist = MATCHES[(size_t)offs + 1]; - - // if (dist >= kNumFullDistances) - GetPosSlot2(dist, posSlot) - - for (len = /*2*/ startLen; ; len++) + curBack = matches[offs + 1]; + GetPosSlot2(curBack, posSlot); + for (lenTest = /*2*/ startLen; ; lenTest++) { - UInt32 price = normalMatchPrice + GET_PRICE_LEN(&p->lenEnc, posState, len); + UInt32 curAndLenPrice = normalMatchPrice + p->lenEnc.prices[posState][lenTest - LZMA_MATCH_LEN_MIN]; + UInt32 lenToPosState = GetLenToPosState(lenTest); + COptimal *opt; + if (curBack < kNumFullDistances) + curAndLenPrice += p->distancesPrices[lenToPosState][curBack]; + else + curAndLenPrice += p->posSlotPrices[lenToPosState][posSlot] + p->alignPrices[curBack & kAlignMask]; + + opt = &p->opt[cur + lenTest]; + if (curAndLenPrice < opt->price) { - COptimal *opt; - unsigned lenNorm = len - 2; - lenNorm = GetLenToPosState2(lenNorm); - if (dist < kNumFullDistances) - price += p->distancesPrices[lenNorm][dist & (kNumFullDistances - 1)]; - else - price += p->posSlotPrices[lenNorm][posSlot] + p->alignPrices[dist & kAlignMask]; - - opt = &p->opt[cur + len]; - if (price < opt->price) - { - opt->price = price; - opt->len = (UInt32)len; - opt->dist = dist + LZMA_NUM_REPS; - opt->extra = 0; - } + opt->price = curAndLenPrice; + opt->posPrev = cur; + opt->backPrev = curBack + LZMA_NUM_REPS; + opt->prev1IsChar = False; } - if (len == MATCHES[offs]) + if (/*_maxMode && */lenTest == matches[offs]) { - // if (p->_maxMode) { - // MATCH : LIT : REP_0 - - const Byte *data2 = data - dist - 1; - unsigned len2 = len + 1; - unsigned limit = len2 + p->numFastBytes; + /* Try Match + Literal + Rep0 */ + const Byte *data2 = data - (curBack + 1); + UInt32 lenTest2 = lenTest + 1; + UInt32 limit = lenTest2 + p->numFastBytes; + UInt32 nextRepMatchPrice; if (limit > numAvailFull) limit = numAvailFull; - - len2 += 2; - if (len2 <= limit) - if (data[len2 - 2] == data2[len2 - 2]) - if (data[len2 - 1] == data2[len2 - 1]) + for (; lenTest2 < limit && data[lenTest2] == data2[lenTest2]; lenTest2++); + lenTest2 -= lenTest + 1; + if (lenTest2 >= 2) { - for (; len2 < limit && data[len2] == data2[len2]; len2++) - {} - - len2 -= len; - - // if (len2 >= 3) - { - unsigned state2 = kMatchNextStates[state]; - unsigned posState2 = (position + len) & p->pbMask; - unsigned offset; - price += GET_PRICE_0(p->isMatch[state2][posState2]); - price += LitEnc_Matched_GetPrice(LIT_PROBS(position + len, data[(size_t)len - 1]), - data[len], data2[len], p->ProbPrices); - - // state2 = kLiteralNextStates[state2]; - state2 = kState_LitAfterMatch; - - posState2 = (posState2 + 1) & p->pbMask; - price += GetPrice_Rep_0(p, state2, posState2); - - offset = cur + len + len2; - - if (last < offset) - last = offset; - // do + UInt32 state2 = kMatchNextStates[state]; + UInt32 posStateNext = (position + lenTest) & p->pbMask; + UInt32 curAndLenCharPrice = curAndLenPrice + + GET_PRICE_0(p->isMatch[state2][posStateNext]) + + LitEnc_GetPriceMatched(LIT_PROBS(position + lenTest, data[lenTest - 1]), + data[lenTest], data2[lenTest], p->ProbPrices); + state2 = kLiteralNextStates[state2]; + posStateNext = (posStateNext + 1) & p->pbMask; + nextRepMatchPrice = curAndLenCharPrice + + GET_PRICE_1(p->isMatch[state2][posStateNext]) + + GET_PRICE_1(p->isRep[state2]); + + /* for (; lenTest2 >= 2; lenTest2--) */ { - UInt32 price2; + UInt32 offset = cur + lenTest + 1 + lenTest2; + UInt32 curAndLenPrice; COptimal *opt; - len2--; - // price2 = price + GetPrice_Len_Rep_0(p, len2, state2, posState2); - price2 = price + GET_PRICE_LEN(&p->repLenEnc, posState2, len2); + while (lenEnd < offset) + p->opt[++lenEnd].price = kInfinityPrice; + curAndLenPrice = nextRepMatchPrice + GetRepPrice(p, 0, lenTest2, state2, posStateNext); opt = &p->opt[offset]; - // offset--; - if (price2 < opt->price) + if (curAndLenPrice < opt->price) { - opt->price = price2; - opt->len = (UInt32)len2; - opt->extra = (CExtra)(len + 1); - opt->dist = dist + LZMA_NUM_REPS; + opt->price = curAndLenPrice; + opt->posPrev = cur + lenTest + 1; + opt->backPrev = 0; + opt->prev1IsChar = True; + opt->prev2 = True; + opt->posPrev2 = cur; + opt->backPrev2 = curBack + LZMA_NUM_REPS; } } - // while (len2 >= 3); } - - } - offs += 2; if (offs == numPairs) break; - dist = MATCHES[(size_t)offs + 1]; - // if (dist >= kNumFullDistances) - GetPosSlot2(dist, posSlot) + curBack = matches[offs + 1]; + if (curBack >= kNumFullDistances) + GetPosSlot2(curBack, posSlot); } } } } - - do - p->opt[last].price = kInfinityPrice; - while (--last); - - return Backward(p, cur); } - - #define ChangePair(smallDist, bigDist) (((bigDist) >> 7) > (smallDist)) - - -static unsigned GetOptimumFast(CLzmaEnc *p) +static UInt32 GetOptimumFast(CLzmaEnc *p, UInt32 *backRes) { - UInt32 numAvail, mainDist; - unsigned mainLen, numPairs, repIndex, repLen, i; + UInt32 numAvail, mainLen, mainDist, numPairs, repIndex, repLen, i; const Byte *data; + const UInt32 *matches; if (p->additionalOffset == 0) mainLen = ReadMatchDistances(p, &numPairs); else { - mainLen = p->longestMatchLen; + mainLen = p->longestMatchLength; numPairs = p->numPairs; } numAvail = p->numAvail; - p->backRes = MARK_LIT; + *backRes = (UInt32)-1; if (numAvail < 2) return 1; - // if (mainLen < 2 && p->state == 0) return 1; // 18.06.notused if (numAvail > LZMA_MATCH_LEN_MAX) numAvail = LZMA_MATCH_LEN_MAX; data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1; + repLen = repIndex = 0; - for (i = 0; i < LZMA_NUM_REPS; i++) { - unsigned len; - const Byte *data2 = data - p->reps[i]; + UInt32 len; + const Byte *data2 = data - (p->reps[i] + 1); if (data[0] != data2[0] || data[1] != data2[1]) continue; - for (len = 2; len < numAvail && data[len] == data2[len]; len++) - {} + for (len = 2; len < numAvail && data[len] == data2[len]; len++); if (len >= p->numFastBytes) { - p->backRes = (UInt32)i; - MOVE_POS(p, len - 1) + *backRes = i; + MovePos(p, len - 1); return len; } if (len > repLen) @@ -2012,182 +1550,98 @@ static unsigned GetOptimumFast(CLzmaEnc *p) } } + matches = p->matches; if (mainLen >= p->numFastBytes) { - p->backRes = p->matches[(size_t)numPairs - 1] + LZMA_NUM_REPS; - MOVE_POS(p, mainLen - 1) + *backRes = matches[numPairs - 1] + LZMA_NUM_REPS; + MovePos(p, mainLen - 1); return mainLen; } mainDist = 0; /* for GCC */ - if (mainLen >= 2) { - mainDist = p->matches[(size_t)numPairs - 1]; - while (numPairs > 2) + mainDist = matches[numPairs - 1]; + while (numPairs > 2 && mainLen == matches[numPairs - 4] + 1) { - UInt32 dist2; - if (mainLen != p->matches[(size_t)numPairs - 4] + 1) - break; - dist2 = p->matches[(size_t)numPairs - 3]; - if (!ChangePair(dist2, mainDist)) + if (!ChangePair(matches[numPairs - 3], mainDist)) break; numPairs -= 2; - mainLen--; - mainDist = dist2; + mainLen = matches[numPairs - 2]; + mainDist = matches[numPairs - 1]; } if (mainLen == 2 && mainDist >= 0x80) mainLen = 1; } - if (repLen >= 2) - if ( repLen + 1 >= mainLen - || (repLen + 2 >= mainLen && mainDist >= (1 << 9)) - || (repLen + 3 >= mainLen && mainDist >= (1 << 15))) + if (repLen >= 2 && ( + (repLen + 1 >= mainLen) || + (repLen + 2 >= mainLen && mainDist >= (1 << 9)) || + (repLen + 3 >= mainLen && mainDist >= (1 << 15)))) { - p->backRes = (UInt32)repIndex; - MOVE_POS(p, repLen - 1) + *backRes = repIndex; + MovePos(p, repLen - 1); return repLen; } if (mainLen < 2 || numAvail <= 2) return 1; + p->longestMatchLength = ReadMatchDistances(p, &p->numPairs); + if (p->longestMatchLength >= 2) { - unsigned len1 = ReadMatchDistances(p, &p->numPairs); - p->longestMatchLen = len1; - - if (len1 >= 2) - { - UInt32 newDist = p->matches[(size_t)p->numPairs - 1]; - if ( (len1 >= mainLen && newDist < mainDist) - || (len1 == mainLen + 1 && !ChangePair(mainDist, newDist)) - || (len1 > mainLen + 1) - || (len1 + 1 >= mainLen && mainLen >= 3 && ChangePair(newDist, mainDist))) - return 1; - } + UInt32 newDistance = matches[p->numPairs - 1]; + if ((p->longestMatchLength >= mainLen && newDistance < mainDist) || + (p->longestMatchLength == mainLen + 1 && !ChangePair(mainDist, newDistance)) || + (p->longestMatchLength > mainLen + 1) || + (p->longestMatchLength + 1 >= mainLen && mainLen >= 3 && ChangePair(newDistance, mainDist))) + return 1; } data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1; - for (i = 0; i < LZMA_NUM_REPS; i++) { - unsigned len, limit; - const Byte *data2 = data - p->reps[i]; + UInt32 len, limit; + const Byte *data2 = data - (p->reps[i] + 1); if (data[0] != data2[0] || data[1] != data2[1]) continue; limit = mainLen - 1; - for (len = 2;; len++) - { - if (len >= limit) - return 1; - if (data[len] != data2[len]) - break; - } - } - - p->backRes = mainDist + LZMA_NUM_REPS; - if (mainLen != 2) - { - MOVE_POS(p, mainLen - 2) + for (len = 2; len < limit && data[len] == data2[len]; len++); + if (len >= limit) + return 1; } + *backRes = mainDist + LZMA_NUM_REPS; + MovePos(p, mainLen - 2); return mainLen; } - - - -static void WriteEndMarker(CLzmaEnc *p, unsigned posState) +static void WriteEndMarker(CLzmaEnc *p, UInt32 posState) { - UInt32 range; - range = p->rc.range; - { - UInt32 ttt, newBound; - CLzmaProb *prob = &p->isMatch[p->state][posState]; - RC_BIT_PRE(&p->rc, prob) - RC_BIT_1(&p->rc, prob) - prob = &p->isRep[p->state]; - RC_BIT_PRE(&p->rc, prob) - RC_BIT_0(&p->rc, prob) - } + UInt32 len; + RangeEnc_EncodeBit(&p->rc, &p->isMatch[p->state][posState], 1); + RangeEnc_EncodeBit(&p->rc, &p->isRep[p->state], 0); p->state = kMatchNextStates[p->state]; - - p->rc.range = range; - LenEnc_Encode(&p->lenProbs, &p->rc, 0, posState); - range = p->rc.range; - - { - // RcTree_Encode_PosSlot(&p->rc, p->posSlotEncoder[0], (1 << kNumPosSlotBits) - 1); - CLzmaProb *probs = p->posSlotEncoder[0]; - unsigned m = 1; - do - { - UInt32 ttt, newBound; - RC_BIT_PRE(p, probs + m) - RC_BIT_1(&p->rc, probs + m) - m = (m << 1) + 1; - } - while (m < (1 << kNumPosSlotBits)); - } - { - // RangeEnc_EncodeDirectBits(&p->rc, ((UInt32)1 << (30 - kNumAlignBits)) - 1, 30 - kNumAlignBits); UInt32 range = p->range; - unsigned numBits = 30 - kNumAlignBits; - do - { - range >>= 1; - p->rc.low += range; - RC_NORM(&p->rc) - } - while (--numBits); - } - - { - // RcTree_ReverseEncode(&p->rc, p->posAlignEncoder, kNumAlignBits, kAlignMask); - CLzmaProb *probs = p->posAlignEncoder; - unsigned m = 1; - do - { - UInt32 ttt, newBound; - RC_BIT_PRE(p, probs + m) - RC_BIT_1(&p->rc, probs + m) - m = (m << 1) + 1; - } - while (m < kAlignTableSize); - } - p->rc.range = range; + len = LZMA_MATCH_LEN_MIN; + LenEnc_Encode2(&p->lenEnc, &p->rc, len - LZMA_MATCH_LEN_MIN, posState, !p->fastMode, p->ProbPrices); + RcTree_Encode(&p->rc, p->posSlotEncoder[GetLenToPosState(len)], kNumPosSlotBits, (1 << kNumPosSlotBits) - 1); + RangeEnc_EncodeDirectBits(&p->rc, (((UInt32)1 << 30) - 1) >> kNumAlignBits, 30 - kNumAlignBits); + RcTree_ReverseEncode(&p->rc, p->posAlignEncoder, kNumAlignBits, kAlignMask); } - static SRes CheckErrors(CLzmaEnc *p) { if (p->result != SZ_OK) return p->result; if (p->rc.res != SZ_OK) p->result = SZ_ERROR_WRITE; - - #ifndef Z7_ST - if ( - // p->mf_Failure || - (p->mtMode && - ( // p->matchFinderMt.failure_LZ_LZ || - p->matchFinderMt.failure_LZ_BT)) - ) - { - p->result = MY_HRES_ERROR_INTERNAL_ERROR; - // printf("\nCheckErrors p->matchFinderMt.failureLZ\n"); - } - #endif - - if (MFB.result != SZ_OK) + if (p->matchFinderBase.result != SZ_OK) p->result = SZ_ERROR_READ; - if (p->result != SZ_OK) p->finished = True; return p->result; } - -Z7_NO_INLINE static SRes Flush(CLzmaEnc *p, UInt32 nowPos) +static SRes Flush(CLzmaEnc *p, UInt32 nowPos) { /* ReleaseMFStream(); */ p->finished = True; @@ -2198,140 +1652,61 @@ Z7_NO_INLINE static SRes Flush(CLzmaEnc *p, UInt32 nowPos) return CheckErrors(p); } - -Z7_NO_INLINE static void FillAlignPrices(CLzmaEnc *p) +static void FillAlignPrices(CLzmaEnc *p) { - unsigned i; - const CProbPrice *ProbPrices = p->ProbPrices; - const CLzmaProb *probs = p->posAlignEncoder; - // p->alignPriceCount = 0; - for (i = 0; i < kAlignTableSize / 2; i++) - { - UInt32 price = 0; - unsigned sym = i; - unsigned m = 1; - unsigned bit; - UInt32 prob; - bit = sym & 1; sym >>= 1; price += GET_PRICEa(probs[m], bit); m = (m << 1) + bit; - bit = sym & 1; sym >>= 1; price += GET_PRICEa(probs[m], bit); m = (m << 1) + bit; - bit = sym & 1; sym >>= 1; price += GET_PRICEa(probs[m], bit); m = (m << 1) + bit; - prob = probs[m]; - p->alignPrices[i ] = price + GET_PRICEa_0(prob); - p->alignPrices[i + 8] = price + GET_PRICEa_1(prob); - // p->alignPrices[i] = RcTree_ReverseGetPrice(p->posAlignEncoder, kNumAlignBits, i, p->ProbPrices); - } + UInt32 i; + for (i = 0; i < kAlignTableSize; i++) + p->alignPrices[i] = RcTree_ReverseGetPrice(p->posAlignEncoder, kNumAlignBits, i, p->ProbPrices); + p->alignPriceCount = 0; } - -Z7_NO_INLINE static void FillDistancesPrices(CLzmaEnc *p) +static void FillDistancesPrices(CLzmaEnc *p) { - // int y; for (y = 0; y < 100; y++) { - UInt32 tempPrices[kNumFullDistances]; - unsigned i, lps; + UInt32 i, lenToPosState; + for (i = kStartPosModelIndex; i < kNumFullDistances; i++) + { + UInt32 posSlot = GetPosSlot1(i); + UInt32 footerBits = ((posSlot >> 1) - 1); + UInt32 base = ((2 | (posSlot & 1)) << footerBits); + tempPrices[i] = RcTree_ReverseGetPrice(p->posEncoders + base - posSlot - 1, footerBits, i - base, p->ProbPrices); + } - const CProbPrice *ProbPrices = p->ProbPrices; + for (lenToPosState = 0; lenToPosState < kNumLenToPosStates; lenToPosState++) + { + UInt32 posSlot; + const CLzmaProb *encoder = p->posSlotEncoder[lenToPosState]; + UInt32 *posSlotPrices = p->posSlotPrices[lenToPosState]; + for (posSlot = 0; posSlot < p->distTableSize; posSlot++) + posSlotPrices[posSlot] = RcTree_GetPrice(encoder, kNumPosSlotBits, posSlot, p->ProbPrices); + for (posSlot = kEndPosModelIndex; posSlot < p->distTableSize; posSlot++) + posSlotPrices[posSlot] += ((((posSlot >> 1) - 1) - kNumAlignBits) << kNumBitPriceShiftBits); + + { + UInt32 *distancesPrices = p->distancesPrices[lenToPosState]; + UInt32 i; + for (i = 0; i < kStartPosModelIndex; i++) + distancesPrices[i] = posSlotPrices[i]; + for (; i < kNumFullDistances; i++) + distancesPrices[i] = posSlotPrices[GetPosSlot1(i)] + tempPrices[i]; + } + } p->matchPriceCount = 0; - - for (i = kStartPosModelIndex / 2; i < kNumFullDistances / 2; i++) - { - unsigned posSlot = GetPosSlot1(i); - unsigned footerBits = (posSlot >> 1) - 1; - unsigned base = ((2 | (posSlot & 1)) << footerBits); - const CLzmaProb *probs = p->posEncoders + (size_t)base * 2; - // tempPrices[i] = RcTree_ReverseGetPrice(p->posEncoders + base, footerBits, i - base, p->ProbPrices); - UInt32 price = 0; - unsigned m = 1; - unsigned sym = i; - unsigned offset = (unsigned)1 << footerBits; - base += i; - - if (footerBits) - do - { - unsigned bit = sym & 1; - sym >>= 1; - price += GET_PRICEa(probs[m], bit); - m = (m << 1) + bit; - } - while (--footerBits); - - { - unsigned prob = probs[m]; - tempPrices[base ] = price + GET_PRICEa_0(prob); - tempPrices[base + offset] = price + GET_PRICEa_1(prob); - } - } - - for (lps = 0; lps < kNumLenToPosStates; lps++) - { - unsigned slot; - unsigned distTableSize2 = (p->distTableSize + 1) >> 1; - UInt32 *posSlotPrices = p->posSlotPrices[lps]; - const CLzmaProb *probs = p->posSlotEncoder[lps]; - - for (slot = 0; slot < distTableSize2; slot++) - { - // posSlotPrices[slot] = RcTree_GetPrice(encoder, kNumPosSlotBits, slot, p->ProbPrices); - UInt32 price; - unsigned bit; - unsigned sym = slot + (1 << (kNumPosSlotBits - 1)); - unsigned prob; - bit = sym & 1; sym >>= 1; price = GET_PRICEa(probs[sym], bit); - bit = sym & 1; sym >>= 1; price += GET_PRICEa(probs[sym], bit); - bit = sym & 1; sym >>= 1; price += GET_PRICEa(probs[sym], bit); - bit = sym & 1; sym >>= 1; price += GET_PRICEa(probs[sym], bit); - bit = sym & 1; sym >>= 1; price += GET_PRICEa(probs[sym], bit); - prob = probs[(size_t)slot + (1 << (kNumPosSlotBits - 1))]; - posSlotPrices[(size_t)slot * 2 ] = price + GET_PRICEa_0(prob); - posSlotPrices[(size_t)slot * 2 + 1] = price + GET_PRICEa_1(prob); - } - - { - UInt32 delta = ((UInt32)((kEndPosModelIndex / 2 - 1) - kNumAlignBits) << kNumBitPriceShiftBits); - for (slot = kEndPosModelIndex / 2; slot < distTableSize2; slot++) - { - posSlotPrices[(size_t)slot * 2 ] += delta; - posSlotPrices[(size_t)slot * 2 + 1] += delta; - delta += ((UInt32)1 << kNumBitPriceShiftBits); - } - } - - { - UInt32 *dp = p->distancesPrices[lps]; - - dp[0] = posSlotPrices[0]; - dp[1] = posSlotPrices[1]; - dp[2] = posSlotPrices[2]; - dp[3] = posSlotPrices[3]; - - for (i = 4; i < kNumFullDistances; i += 2) - { - UInt32 slotPrice = posSlotPrices[GetPosSlot1(i)]; - dp[i ] = slotPrice + tempPrices[i]; - dp[i + 1] = slotPrice + tempPrices[i + 1]; - } - } - } - // } } - - -static void LzmaEnc_Construct(CLzmaEnc *p) +void LzmaEnc_Construct(CLzmaEnc *p) { RangeEnc_Construct(&p->rc); - MatchFinder_Construct(&MFB); - - #ifndef Z7_ST - p->matchFinderMt.MatchFinder = &MFB; + MatchFinder_Construct(&p->matchFinderBase); + #ifdef COMPRESS_MF_MT MatchFinderMt_Construct(&p->matchFinderMt); + p->matchFinderMt.MatchFinder = &p->matchFinderBase; #endif { CLzmaEncProps props; LzmaEncProps_Init(&props); - LzmaEnc_SetProps((CLzmaEncHandle)(void *)p, &props); + LzmaEnc_SetProps(p, &props); } #ifndef LZMA_LOG_BSR @@ -2339,370 +1714,226 @@ static void LzmaEnc_Construct(CLzmaEnc *p) #endif LzmaEnc_InitPriceTables(p->ProbPrices); - p->litProbs = NULL; - p->saveState.litProbs = NULL; + p->litProbs = 0; + p->saveState.litProbs = 0; } -CLzmaEncHandle LzmaEnc_Create(ISzAllocPtr alloc) +CLzmaEncHandle LzmaEnc_Create(ISzAlloc *alloc) { void *p; - p = ISzAlloc_Alloc(alloc, sizeof(CLzmaEnc)); - if (p) + p = alloc->Alloc(alloc, sizeof(CLzmaEnc)); + if (p != 0) LzmaEnc_Construct((CLzmaEnc *)p); return p; } -static void LzmaEnc_FreeLits(CLzmaEnc *p, ISzAllocPtr alloc) +void LzmaEnc_FreeLits(CLzmaEnc *p, ISzAlloc *alloc) { - ISzAlloc_Free(alloc, p->litProbs); - ISzAlloc_Free(alloc, p->saveState.litProbs); - p->litProbs = NULL; - p->saveState.litProbs = NULL; + alloc->Free(alloc, p->litProbs); + alloc->Free(alloc, p->saveState.litProbs); + p->litProbs = 0; + p->saveState.litProbs = 0; } -static void LzmaEnc_Destruct(CLzmaEnc *p, ISzAllocPtr alloc, ISzAllocPtr allocBig) +void LzmaEnc_Destruct(CLzmaEnc *p, ISzAlloc *alloc, ISzAlloc *allocBig) { - #ifndef Z7_ST + #ifdef COMPRESS_MF_MT MatchFinderMt_Destruct(&p->matchFinderMt, allocBig); #endif - - MatchFinder_Free(&MFB, allocBig); + MatchFinder_Free(&p->matchFinderBase, allocBig); LzmaEnc_FreeLits(p, alloc); RangeEnc_Free(&p->rc, alloc); } -void LzmaEnc_Destroy(CLzmaEncHandle p, ISzAllocPtr alloc, ISzAllocPtr allocBig) +void LzmaEnc_Destroy(CLzmaEncHandle p, ISzAlloc *alloc, ISzAlloc *allocBig) { - // GET_CLzmaEnc_p - LzmaEnc_Destruct(p, alloc, allocBig); - ISzAlloc_Free(alloc, p); + LzmaEnc_Destruct((CLzmaEnc *)p, alloc, allocBig); + alloc->Free(alloc, p); } - -Z7_NO_INLINE -static SRes LzmaEnc_CodeOneBlock(CLzmaEnc *p, UInt32 maxPackSize, UInt32 maxUnpackSize) +static SRes LzmaEnc_CodeOneBlock(CLzmaEnc *p, Bool useLimits, UInt32 maxPackSize, UInt32 maxUnpackSize) { UInt32 nowPos32, startPos32; - if (p->needInit) + if (p->inStream != 0) { - #ifndef Z7_ST - if (p->mtMode) - { - RINOK(MatchFinderMt_InitMt(&p->matchFinderMt)) - } - #endif + p->matchFinderBase.stream = p->inStream; p->matchFinder.Init(p->matchFinderObj); - p->needInit = 0; + p->inStream = 0; } if (p->finished) return p->result; - RINOK(CheckErrors(p)) + RINOK(CheckErrors(p)); nowPos32 = (UInt32)p->nowPos64; startPos32 = nowPos32; if (p->nowPos64 == 0) { - unsigned numPairs; + UInt32 numPairs; Byte curByte; if (p->matchFinder.GetNumAvailableBytes(p->matchFinderObj) == 0) return Flush(p, nowPos32); ReadMatchDistances(p, &numPairs); - RangeEnc_EncodeBit_0(&p->rc, &p->isMatch[kState_Start][0]); - // p->state = kLiteralNextStates[p->state]; - curByte = *(p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - p->additionalOffset); + RangeEnc_EncodeBit(&p->rc, &p->isMatch[p->state][0], 0); + p->state = kLiteralNextStates[p->state]; + curByte = p->matchFinder.GetIndexByte(p->matchFinderObj, 0 - p->additionalOffset); LitEnc_Encode(&p->rc, p->litProbs, curByte); p->additionalOffset--; nowPos32++; } if (p->matchFinder.GetNumAvailableBytes(p->matchFinderObj) != 0) - for (;;) { - UInt32 dist; - unsigned len, posState; - UInt32 range, ttt, newBound; - CLzmaProb *probs; - - if (p->fastMode) - len = GetOptimumFast(p); - else - { - unsigned oci = p->optCur; - if (p->optEnd == oci) - len = GetOptimum(p, nowPos32); - else - { - const COptimal *opt = &p->opt[oci]; - len = opt->len; - p->backRes = opt->dist; - p->optCur = oci + 1; - } - } + UInt32 pos, len, posState; - posState = (unsigned)nowPos32 & p->pbMask; - range = p->rc.range; - probs = &p->isMatch[p->state][posState]; - - RC_BIT_PRE(&p->rc, probs) - - dist = p->backRes; + if (p->fastMode) + len = GetOptimumFast(p, &pos); + else + len = GetOptimum(p, nowPos32, &pos); #ifdef SHOW_STAT2 - printf("\n pos = %6X, len = %3u pos = %6u", nowPos32, len, dist); + printf("\n pos = %4X, len = %d pos = %d", nowPos32, len, pos); #endif - if (dist == MARK_LIT) + posState = nowPos32 & p->pbMask; + if (len == 1 && pos == (UInt32)-1) { Byte curByte; + CLzmaProb *probs; const Byte *data; - unsigned state; - RC_BIT_0(&p->rc, probs) - p->rc.range = range; + RangeEnc_EncodeBit(&p->rc, &p->isMatch[p->state][posState], 0); data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - p->additionalOffset; - probs = LIT_PROBS(nowPos32, *(data - 1)); curByte = *data; - state = p->state; - p->state = kLiteralNextStates[state]; - if (IsLitState(state)) + probs = LIT_PROBS(nowPos32, *(data - 1)); + if (IsCharState(p->state)) LitEnc_Encode(&p->rc, probs, curByte); else - LitEnc_EncodeMatched(&p->rc, probs, curByte, *(data - p->reps[0])); + LitEnc_EncodeMatched(&p->rc, probs, curByte, *(data - p->reps[0] - 1)); + p->state = kLiteralNextStates[p->state]; } else { - RC_BIT_1(&p->rc, probs) - probs = &p->isRep[p->state]; - RC_BIT_PRE(&p->rc, probs) - - if (dist < LZMA_NUM_REPS) + RangeEnc_EncodeBit(&p->rc, &p->isMatch[p->state][posState], 1); + if (pos < LZMA_NUM_REPS) { - RC_BIT_1(&p->rc, probs) - probs = &p->isRepG0[p->state]; - RC_BIT_PRE(&p->rc, probs) - if (dist == 0) + RangeEnc_EncodeBit(&p->rc, &p->isRep[p->state], 1); + if (pos == 0) { - RC_BIT_0(&p->rc, probs) - probs = &p->isRep0Long[p->state][posState]; - RC_BIT_PRE(&p->rc, probs) - if (len != 1) - { - RC_BIT_1_BASE(&p->rc, probs) - } - else - { - RC_BIT_0_BASE(&p->rc, probs) - p->state = kShortRepNextStates[p->state]; - } + RangeEnc_EncodeBit(&p->rc, &p->isRepG0[p->state], 0); + RangeEnc_EncodeBit(&p->rc, &p->isRep0Long[p->state][posState], ((len == 1) ? 0 : 1)); } else { - RC_BIT_1(&p->rc, probs) - probs = &p->isRepG1[p->state]; - RC_BIT_PRE(&p->rc, probs) - if (dist == 1) - { - RC_BIT_0_BASE(&p->rc, probs) - dist = p->reps[1]; - } + UInt32 distance = p->reps[pos]; + RangeEnc_EncodeBit(&p->rc, &p->isRepG0[p->state], 1); + if (pos == 1) + RangeEnc_EncodeBit(&p->rc, &p->isRepG1[p->state], 0); else { - RC_BIT_1(&p->rc, probs) - probs = &p->isRepG2[p->state]; - RC_BIT_PRE(&p->rc, probs) - if (dist == 2) - { - RC_BIT_0_BASE(&p->rc, probs) - dist = p->reps[2]; - } - else - { - RC_BIT_1_BASE(&p->rc, probs) - dist = p->reps[3]; + RangeEnc_EncodeBit(&p->rc, &p->isRepG1[p->state], 1); + RangeEnc_EncodeBit(&p->rc, &p->isRepG2[p->state], pos - 2); + if (pos == 3) p->reps[3] = p->reps[2]; - } p->reps[2] = p->reps[1]; } p->reps[1] = p->reps[0]; - p->reps[0] = dist; + p->reps[0] = distance; } - - RC_NORM(&p->rc) - - p->rc.range = range; - - if (len != 1) + if (len == 1) + p->state = kShortRepNextStates[p->state]; + else { - LenEnc_Encode(&p->repLenProbs, &p->rc, len - LZMA_MATCH_LEN_MIN, posState); - --p->repLenEncCounter; + LenEnc_Encode2(&p->repLenEnc, &p->rc, len - LZMA_MATCH_LEN_MIN, posState, !p->fastMode, p->ProbPrices); p->state = kRepNextStates[p->state]; } } else { - unsigned posSlot; - RC_BIT_0(&p->rc, probs) - p->rc.range = range; + UInt32 posSlot; + RangeEnc_EncodeBit(&p->rc, &p->isRep[p->state], 0); p->state = kMatchNextStates[p->state]; + LenEnc_Encode2(&p->lenEnc, &p->rc, len - LZMA_MATCH_LEN_MIN, posState, !p->fastMode, p->ProbPrices); + pos -= LZMA_NUM_REPS; + GetPosSlot(pos, posSlot); + RcTree_Encode(&p->rc, p->posSlotEncoder[GetLenToPosState(len)], kNumPosSlotBits, posSlot); + + if (posSlot >= kStartPosModelIndex) + { + UInt32 footerBits = ((posSlot >> 1) - 1); + UInt32 base = ((2 | (posSlot & 1)) << footerBits); + UInt32 posReduced = pos - base; - LenEnc_Encode(&p->lenProbs, &p->rc, len - LZMA_MATCH_LEN_MIN, posState); - // --p->lenEnc.counter; - - dist -= LZMA_NUM_REPS; + if (posSlot < kEndPosModelIndex) + RcTree_ReverseEncode(&p->rc, p->posEncoders + base - posSlot - 1, footerBits, posReduced); + else + { + RangeEnc_EncodeDirectBits(&p->rc, posReduced >> kNumAlignBits, footerBits - kNumAlignBits); + RcTree_ReverseEncode(&p->rc, p->posAlignEncoder, kNumAlignBits, posReduced & kAlignMask); + p->alignPriceCount++; + } + } p->reps[3] = p->reps[2]; p->reps[2] = p->reps[1]; p->reps[1] = p->reps[0]; - p->reps[0] = dist + 1; - + p->reps[0] = pos; p->matchPriceCount++; - GetPosSlot(dist, posSlot) - // RcTree_Encode_PosSlot(&p->rc, p->posSlotEncoder[GetLenToPosState(len)], posSlot); - { - UInt32 sym = (UInt32)posSlot + (1 << kNumPosSlotBits); - range = p->rc.range; - probs = p->posSlotEncoder[GetLenToPosState(len)]; - do - { - CLzmaProb *prob = probs + (sym >> kNumPosSlotBits); - UInt32 bit = (sym >> (kNumPosSlotBits - 1)) & 1; - sym <<= 1; - RC_BIT(&p->rc, prob, bit) - } - while (sym < (1 << kNumPosSlotBits * 2)); - p->rc.range = range; - } - - if (dist >= kStartPosModelIndex) - { - unsigned footerBits = ((posSlot >> 1) - 1); - - if (dist < kNumFullDistances) - { - unsigned base = ((2 | (posSlot & 1)) << footerBits); - RcTree_ReverseEncode(&p->rc, p->posEncoders + base, footerBits, (unsigned)(dist /* - base */)); - } - else - { - UInt32 pos2 = (dist | 0xF) << (32 - footerBits); - range = p->rc.range; - // RangeEnc_EncodeDirectBits(&p->rc, posReduced >> kNumAlignBits, footerBits - kNumAlignBits); - /* - do - { - range >>= 1; - p->rc.low += range & (0 - ((dist >> --footerBits) & 1)); - RC_NORM(&p->rc) - } - while (footerBits > kNumAlignBits); - */ - do - { - range >>= 1; - p->rc.low += range & (0 - (pos2 >> 31)); - pos2 += pos2; - RC_NORM(&p->rc) - } - while (pos2 != 0xF0000000); - - - // RcTree_ReverseEncode(&p->rc, p->posAlignEncoder, kNumAlignBits, posReduced & kAlignMask); - - { - unsigned m = 1; - unsigned bit; - bit = dist & 1; dist >>= 1; RC_BIT(&p->rc, p->posAlignEncoder + m, bit) m = (m << 1) + bit; - bit = dist & 1; dist >>= 1; RC_BIT(&p->rc, p->posAlignEncoder + m, bit) m = (m << 1) + bit; - bit = dist & 1; dist >>= 1; RC_BIT(&p->rc, p->posAlignEncoder + m, bit) m = (m << 1) + bit; - bit = dist & 1; RC_BIT(&p->rc, p->posAlignEncoder + m, bit) - p->rc.range = range; - // p->alignPriceCount++; - } - } - } } } - - nowPos32 += (UInt32)len; p->additionalOffset -= len; - + nowPos32 += len; if (p->additionalOffset == 0) { UInt32 processed; - if (!p->fastMode) { - /* - if (p->alignPriceCount >= 16) // kAlignTableSize - FillAlignPrices(p); - if (p->matchPriceCount >= 128) + if (p->matchPriceCount >= (1 << 7)) FillDistancesPrices(p); - if (p->lenEnc.counter <= 0) - LenPriceEnc_UpdateTables(&p->lenEnc, 1 << p->pb, &p->lenProbs, p->ProbPrices); - */ - if (p->matchPriceCount >= 64) - { + if (p->alignPriceCount >= kAlignTableSize) FillAlignPrices(p); - // { int y; for (y = 0; y < 100; y++) { - FillDistancesPrices(p); - // }} - LenPriceEnc_UpdateTables(&p->lenEnc, (unsigned)1 << p->pb, &p->lenProbs, p->ProbPrices); - } - if (p->repLenEncCounter <= 0) - { - p->repLenEncCounter = REP_LEN_COUNT; - LenPriceEnc_UpdateTables(&p->repLenEnc, (unsigned)1 << p->pb, &p->repLenProbs, p->ProbPrices); - } } - if (p->matchFinder.GetNumAvailableBytes(p->matchFinderObj) == 0) break; processed = nowPos32 - startPos32; - - if (maxPackSize) + if (useLimits) { - if (processed + kNumOpts + 300 >= maxUnpackSize - || RangeEnc_GetProcessed_sizet(&p->rc) + kPackReserve >= maxPackSize) + if (processed + kNumOpts + 300 >= maxUnpackSize || + RangeEnc_GetProcessed(&p->rc) + kNumOpts * 2 >= maxPackSize) break; } - else if (processed >= (1 << 17)) + else if (processed >= (1 << 15)) { p->nowPos64 += nowPos32 - startPos32; return CheckErrors(p); } } } - p->nowPos64 += nowPos32 - startPos32; return Flush(p, nowPos32); } - - #define kBigHashDicLimit ((UInt32)1 << 24) -static SRes LzmaEnc_Alloc(CLzmaEnc *p, UInt32 keepWindowSize, ISzAllocPtr alloc, ISzAllocPtr allocBig) +static SRes LzmaEnc_Alloc(CLzmaEnc *p, UInt32 keepWindowSize, ISzAlloc *alloc, ISzAlloc *allocBig) { UInt32 beforeSize = kNumOpts; - UInt32 dictSize; - if (!RangeEnc_Alloc(&p->rc, alloc)) return SZ_ERROR_MEM; - - #ifndef Z7_ST - p->mtMode = (p->multiThread && !p->fastMode && (MFB.btMode != 0)); + #ifdef COMPRESS_MF_MT + Bool btMode = (p->matchFinderBase.btMode != 0);; + p->mtMode = (p->multiThread && !p->fastMode && btMode); #endif { unsigned lclp = p->lc + p->lp; - if (!p->litProbs || !p->saveState.litProbs || p->lclp != lclp) + if (p->litProbs == 0 || p->saveState.litProbs == 0 || p->lclp != lclp) { LzmaEnc_FreeLits(p, alloc); - p->litProbs = (CLzmaProb *)ISzAlloc_Alloc(alloc, ((UInt32)0x300 << lclp) * sizeof(CLzmaProb)); - p->saveState.litProbs = (CLzmaProb *)ISzAlloc_Alloc(alloc, ((UInt32)0x300 << lclp) * sizeof(CLzmaProb)); - if (!p->litProbs || !p->saveState.litProbs) + p->litProbs = (CLzmaProb *)alloc->Alloc(alloc, (0x300 << lclp) * sizeof(CLzmaProb)); + p->saveState.litProbs = (CLzmaProb *)alloc->Alloc(alloc, (0x300 << lclp) * sizeof(CLzmaProb)); + if (p->litProbs == 0 || p->saveState.litProbs == 0) { LzmaEnc_FreeLits(p, alloc); return SZ_ERROR_MEM; @@ -2711,71 +1942,42 @@ static SRes LzmaEnc_Alloc(CLzmaEnc *p, UInt32 keepWindowSize, ISzAllocPtr alloc, } } - MFB.bigHash = (Byte)(p->dictSize > kBigHashDicLimit ? 1 : 0); + p->matchFinderBase.bigHash = (p->dictSize > kBigHashDicLimit); + if (beforeSize + p->dictSize < keepWindowSize) + beforeSize = keepWindowSize - p->dictSize; - dictSize = p->dictSize; - if (dictSize == ((UInt32)2 << 30) || - dictSize == ((UInt32)3 << 30)) - { - /* 21.03 : here we reduce the dictionary for 2 reasons: - 1) we don't want 32-bit back_distance matches in decoder for 2 GB dictionary. - 2) we want to elimate useless last MatchFinder_Normalize3() for corner cases, - where data size is aligned for 1 GB: 5/6/8 GB. - That reducing must be >= 1 for such corner cases. */ - dictSize -= 1; - } - - if (beforeSize + dictSize < keepWindowSize) - beforeSize = keepWindowSize - dictSize; - - /* in worst case we can look ahead for - max(LZMA_MATCH_LEN_MAX, numFastBytes + 1 + numFastBytes) bytes. - we send larger value for (keepAfter) to MantchFinder_Create(): - (numFastBytes + LZMA_MATCH_LEN_MAX + 1) - */ - - #ifndef Z7_ST + #ifdef COMPRESS_MF_MT if (p->mtMode) { - RINOK(MatchFinderMt_Create(&p->matchFinderMt, dictSize, beforeSize, - p->numFastBytes, LZMA_MATCH_LEN_MAX + 1 /* 18.04 */ - , allocBig)) + RINOK(MatchFinderMt_Create(&p->matchFinderMt, p->dictSize, beforeSize, p->numFastBytes, LZMA_MATCH_LEN_MAX, allocBig)); p->matchFinderObj = &p->matchFinderMt; - MFB.bigHash = (Byte)(MFB.hashMask >= 0xFFFFFF ? 1 : 0); MatchFinderMt_CreateVTable(&p->matchFinderMt, &p->matchFinder); } else #endif { - if (!MatchFinder_Create(&MFB, dictSize, beforeSize, - p->numFastBytes, LZMA_MATCH_LEN_MAX + 1 /* 21.03 */ - , allocBig)) + if (!MatchFinder_Create(&p->matchFinderBase, p->dictSize, beforeSize, p->numFastBytes, LZMA_MATCH_LEN_MAX, allocBig)) return SZ_ERROR_MEM; - p->matchFinderObj = &MFB; - MatchFinder_CreateVTable(&MFB, &p->matchFinder); + p->matchFinderObj = &p->matchFinderBase; + MatchFinder_CreateVTable(&p->matchFinderBase, &p->matchFinder); } - return SZ_OK; } -static void LzmaEnc_Init(CLzmaEnc *p) +void LzmaEnc_Init(CLzmaEnc *p) { - unsigned i; + UInt32 i; p->state = 0; - p->reps[0] = - p->reps[1] = - p->reps[2] = - p->reps[3] = 1; + for (i = 0 ; i < LZMA_NUM_REPS; i++) + p->reps[i] = 0; RangeEnc_Init(&p->rc); - for (i = 0; i < (1 << kNumAlignBits); i++) - p->posAlignEncoder[i] = kProbInitValue; for (i = 0; i < kNumStates; i++) { - unsigned j; + UInt32 j; for (j = 0; j < LZMA_NUM_PB_STATES_MAX; j++) { p->isMatch[i][j] = kProbInitValue; @@ -2787,50 +1989,41 @@ static void LzmaEnc_Init(CLzmaEnc *p) p->isRepG2[i] = kProbInitValue; } + { + UInt32 num = 0x300 << (p->lp + p->lc); + for (i = 0; i < num; i++) + p->litProbs[i] = kProbInitValue; + } + { for (i = 0; i < kNumLenToPosStates; i++) { CLzmaProb *probs = p->posSlotEncoder[i]; - unsigned j; + UInt32 j; for (j = 0; j < (1 << kNumPosSlotBits); j++) probs[j] = kProbInitValue; } } { - for (i = 0; i < kNumFullDistances; i++) + for (i = 0; i < kNumFullDistances - kEndPosModelIndex; i++) p->posEncoders[i] = kProbInitValue; } - { - UInt32 num = (UInt32)0x300 << (p->lp + p->lc); - UInt32 k; - CLzmaProb *probs = p->litProbs; - for (k = 0; k < num; k++) - probs[k] = kProbInitValue; - } + LenEnc_Init(&p->lenEnc.p); + LenEnc_Init(&p->repLenEnc.p); + for (i = 0; i < (1 << kNumAlignBits); i++) + p->posAlignEncoder[i] = kProbInitValue; - LenEnc_Init(&p->lenProbs); - LenEnc_Init(&p->repLenProbs); - - p->optEnd = 0; - p->optCur = 0; - - { - for (i = 0; i < kNumOpts; i++) - p->opt[i].price = kInfinityPrice; - } - + p->optimumEndIndex = 0; + p->optimumCurrentIndex = 0; p->additionalOffset = 0; - p->pbMask = ((unsigned)1 << p->pb) - 1; - p->lpMask = ((UInt32)0x100 << p->lp) - ((unsigned)0x100 >> p->lc); - - // p->mf_Failure = False; + p->pbMask = (1 << p->pb) - 1; + p->lpMask = (1 << p->lp) - 1; } - -static void LzmaEnc_InitPrices(CLzmaEnc *p) +void LzmaEnc_InitPrices(CLzmaEnc *p) { if (!p->fastMode) { @@ -2841,125 +2034,116 @@ static void LzmaEnc_InitPrices(CLzmaEnc *p) p->lenEnc.tableSize = p->repLenEnc.tableSize = p->numFastBytes + 1 - LZMA_MATCH_LEN_MIN; - - p->repLenEncCounter = REP_LEN_COUNT; - - LenPriceEnc_UpdateTables(&p->lenEnc, (unsigned)1 << p->pb, &p->lenProbs, p->ProbPrices); - LenPriceEnc_UpdateTables(&p->repLenEnc, (unsigned)1 << p->pb, &p->repLenProbs, p->ProbPrices); + LenPriceEnc_UpdateTables(&p->lenEnc, 1 << p->pb, p->ProbPrices); + LenPriceEnc_UpdateTables(&p->repLenEnc, 1 << p->pb, p->ProbPrices); } -static SRes LzmaEnc_AllocAndInit(CLzmaEnc *p, UInt32 keepWindowSize, ISzAllocPtr alloc, ISzAllocPtr allocBig) +static SRes LzmaEnc_AllocAndInit(CLzmaEnc *p, UInt32 keepWindowSize, ISzAlloc *alloc, ISzAlloc *allocBig) { - unsigned i; - for (i = kEndPosModelIndex / 2; i < kDicLogSizeMax; i++) + UInt32 i; + for (i = 0; i < (UInt32)kDicLogSizeMaxCompress; i++) if (p->dictSize <= ((UInt32)1 << i)) break; p->distTableSize = i * 2; p->finished = False; p->result = SZ_OK; - p->nowPos64 = 0; - p->needInit = 1; - RINOK(LzmaEnc_Alloc(p, keepWindowSize, alloc, allocBig)) + RINOK(LzmaEnc_Alloc(p, keepWindowSize, alloc, allocBig)); LzmaEnc_Init(p); LzmaEnc_InitPrices(p); + p->nowPos64 = 0; return SZ_OK; } -static SRes LzmaEnc_Prepare(CLzmaEncHandle p, - ISeqOutStreamPtr outStream, - ISeqInStreamPtr inStream, - ISzAllocPtr alloc, ISzAllocPtr allocBig) +static SRes LzmaEnc_Prepare(CLzmaEncHandle pp, ISeqInStream *inStream, ISeqOutStream *outStream, + ISzAlloc *alloc, ISzAlloc *allocBig) { - // GET_CLzmaEnc_p - MatchFinder_SET_STREAM(&MFB, inStream) + CLzmaEnc *p = (CLzmaEnc *)pp; + p->inStream = inStream; p->rc.outStream = outStream; return LzmaEnc_AllocAndInit(p, 0, alloc, allocBig); } -SRes LzmaEnc_PrepareForLzma2(CLzmaEncHandle p, - ISeqInStreamPtr inStream, UInt32 keepWindowSize, - ISzAllocPtr alloc, ISzAllocPtr allocBig) +SRes LzmaEnc_PrepareForLzma2(CLzmaEncHandle pp, + ISeqInStream *inStream, UInt32 keepWindowSize, + ISzAlloc *alloc, ISzAlloc *allocBig) { - // GET_CLzmaEnc_p - MatchFinder_SET_STREAM(&MFB, inStream) + CLzmaEnc *p = (CLzmaEnc *)pp; + p->inStream = inStream; return LzmaEnc_AllocAndInit(p, keepWindowSize, alloc, allocBig); } -SRes LzmaEnc_MemPrepare(CLzmaEncHandle p, - const Byte *src, SizeT srcLen, - UInt32 keepWindowSize, - ISzAllocPtr alloc, ISzAllocPtr allocBig) +static void LzmaEnc_SetInputBuf(CLzmaEnc *p, const Byte *src, SizeT srcLen) { - // GET_CLzmaEnc_p - MatchFinder_SET_DIRECT_INPUT_BUF(&MFB, src, srcLen) - LzmaEnc_SetDataSize(p, srcLen); + p->seqBufInStream.funcTable.Read = MyRead; + p->seqBufInStream.data = src; + p->seqBufInStream.rem = srcLen; +} + +SRes LzmaEnc_MemPrepare(CLzmaEncHandle pp, const Byte *src, SizeT srcLen, + UInt32 keepWindowSize, ISzAlloc *alloc, ISzAlloc *allocBig) +{ + CLzmaEnc *p = (CLzmaEnc *)pp; + LzmaEnc_SetInputBuf(p, src, srcLen); + p->inStream = &p->seqBufInStream.funcTable; return LzmaEnc_AllocAndInit(p, keepWindowSize, alloc, allocBig); } -void LzmaEnc_Finish(CLzmaEncHandle p) +void LzmaEnc_Finish(CLzmaEncHandle pp) { - #ifndef Z7_ST - // GET_CLzmaEnc_p + #ifdef COMPRESS_MF_MT + CLzmaEnc *p = (CLzmaEnc *)pp; if (p->mtMode) MatchFinderMt_ReleaseStream(&p->matchFinderMt); #else - UNUSED_VAR(p) + pp = pp; #endif } - -typedef struct +typedef struct _CSeqOutStreamBuf { - ISeqOutStream vt; + ISeqOutStream funcTable; Byte *data; - size_t rem; - BoolInt overflow; -} CLzmaEnc_SeqOutStreamBuf; + SizeT rem; + Bool overflow; +} CSeqOutStreamBuf; -static size_t SeqOutStreamBuf_Write(ISeqOutStreamPtr pp, const void *data, size_t size) +static size_t MyWrite(void *pp, const void *data, size_t size) { - Z7_CONTAINER_FROM_VTBL_TO_DECL_VAR_pp_vt_p(CLzmaEnc_SeqOutStreamBuf) + CSeqOutStreamBuf *p = (CSeqOutStreamBuf *)pp; if (p->rem < size) { size = p->rem; p->overflow = True; } - if (size != 0) - { - memcpy(p->data, data, size); - p->rem -= size; - p->data += size; - } + memcpy(p->data, data, size); + p->rem -= size; + p->data += size; return size; } -/* -UInt32 LzmaEnc_GetNumAvailableBytes(CLzmaEncHandle p) +UInt32 LzmaEnc_GetNumAvailableBytes(CLzmaEncHandle pp) { - GET_const_CLzmaEnc_p + const CLzmaEnc *p = (CLzmaEnc *)pp; return p->matchFinder.GetNumAvailableBytes(p->matchFinderObj); } -*/ -const Byte *LzmaEnc_GetCurBuf(CLzmaEncHandle p) +const Byte *LzmaEnc_GetCurBuf(CLzmaEncHandle pp) { - // GET_const_CLzmaEnc_p + const CLzmaEnc *p = (CLzmaEnc *)pp; return p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - p->additionalOffset; } - -// (desiredPackSize == 0) is not allowed -SRes LzmaEnc_CodeOneMemBlock(CLzmaEncHandle p, BoolInt reInit, +SRes LzmaEnc_CodeOneMemBlock(CLzmaEncHandle pp, Bool reInit, Byte *dest, size_t *destLen, UInt32 desiredPackSize, UInt32 *unpackSize) { - // GET_CLzmaEnc_p + CLzmaEnc *p = (CLzmaEnc *)pp; UInt64 nowPos64; SRes res; - CLzmaEnc_SeqOutStreamBuf outStream; + CSeqOutStreamBuf outStream; - outStream.vt.Write = SeqOutStreamBuf_Write; + outStream.funcTable.Write = MyWrite; outStream.data = dest; outStream.rem = *destLen; outStream.overflow = False; @@ -2971,11 +2155,11 @@ SRes LzmaEnc_CodeOneMemBlock(CLzmaEncHandle p, BoolInt reInit, if (reInit) LzmaEnc_Init(p); LzmaEnc_InitPrices(p); - RangeEnc_Init(&p->rc); - p->rc.outStream = &outStream.vt; nowPos64 = p->nowPos64; - - res = LzmaEnc_CodeOneBlock(p, desiredPackSize, *unpackSize); + RangeEnc_Init(&p->rc); + p->rc.outStream = &outStream.funcTable; + + res = LzmaEnc_CodeOneBlock(p, True, desiredPackSize, *unpackSize); *unpackSize = (UInt32)(p->nowPos64 - nowPos64); *destLen -= outStream.rem; @@ -2985,26 +2169,29 @@ SRes LzmaEnc_CodeOneMemBlock(CLzmaEncHandle p, BoolInt reInit, return res; } - -Z7_NO_INLINE -static SRes LzmaEnc_Encode2(CLzmaEnc *p, ICompressProgressPtr progress) +SRes LzmaEnc_Encode(CLzmaEncHandle pp, ISeqOutStream *outStream, ISeqInStream *inStream, ICompressProgress *progress, + ISzAlloc *alloc, ISzAlloc *allocBig) { + CLzmaEnc *p = (CLzmaEnc *)pp; SRes res = SZ_OK; - #ifndef Z7_ST + #ifdef COMPRESS_MF_MT Byte allocaDummy[0x300]; - allocaDummy[0] = 0; - allocaDummy[1] = allocaDummy[0]; + int i = 0; + for (i = 0; i < 16; i++) + allocaDummy[i] = (Byte)i; #endif + RINOK(LzmaEnc_Prepare(pp, inStream, outStream, alloc, allocBig)); + for (;;) { - res = LzmaEnc_CodeOneBlock(p, 0, 0); - if (res != SZ_OK || p->finished) + res = LzmaEnc_CodeOneBlock(p, False, 0, 0); + if (res != SZ_OK || p->finished != 0) break; - if (progress) + if (progress != 0) { - res = ICompressProgress_Progress(progress, p->nowPos64, RangeEnc_GetProcessed(&p->rc)); + res = progress->Progress(progress, p->nowPos64, RangeEnc_GetProcessed(&p->rc)); if (res != SZ_OK) { res = SZ_ERROR_PROGRESS; @@ -3012,110 +2199,71 @@ static SRes LzmaEnc_Encode2(CLzmaEnc *p, ICompressProgressPtr progress) } } } - - LzmaEnc_Finish((CLzmaEncHandle)(void *)p); - - /* - if (res == SZ_OK && !Inline_MatchFinder_IsFinishedOK(&MFB)) - res = SZ_ERROR_FAIL; - } - */ - + LzmaEnc_Finish(pp); return res; } - -SRes LzmaEnc_Encode(CLzmaEncHandle p, ISeqOutStreamPtr outStream, ISeqInStreamPtr inStream, ICompressProgressPtr progress, - ISzAllocPtr alloc, ISzAllocPtr allocBig) -{ - // GET_CLzmaEnc_p - RINOK(LzmaEnc_Prepare(p, outStream, inStream, alloc, allocBig)) - return LzmaEnc_Encode2(p, progress); -} - - -SRes LzmaEnc_WriteProperties(CLzmaEncHandle p, Byte *props, SizeT *size) +SRes LzmaEnc_WriteProperties(CLzmaEncHandle pp, Byte *props, SizeT *size) { + CLzmaEnc *p = (CLzmaEnc *)pp; + int i; + UInt32 dictSize = p->dictSize; if (*size < LZMA_PROPS_SIZE) return SZ_ERROR_PARAM; *size = LZMA_PROPS_SIZE; + props[0] = (Byte)((p->pb * 5 + p->lp) * 9 + p->lc); + + for (i = 11; i <= 30; i++) { - // GET_CLzmaEnc_p - const UInt32 dictSize = p->dictSize; - UInt32 v; - props[0] = (Byte)((p->pb * 5 + p->lp) * 9 + p->lc); - - // we write aligned dictionary value to properties for lzma decoder - if (dictSize >= ((UInt32)1 << 21)) + if (dictSize <= ((UInt32)2 << i)) { - const UInt32 kDictMask = ((UInt32)1 << 20) - 1; - v = (dictSize + kDictMask) & ~kDictMask; - if (v < dictSize) - v = dictSize; + dictSize = (2 << i); + break; } - else + if (dictSize <= ((UInt32)3 << i)) { - unsigned i = 11 * 2; - do - { - v = (UInt32)(2 + (i & 1)) << (i >> 1); - i++; - } - while (v < dictSize); + dictSize = (3 << i); + break; } - - SetUi32(props + 1, v) - return SZ_OK; } + + for (i = 0; i < 4; i++) + props[1 + i] = (Byte)(dictSize >> (8 * i)); + return SZ_OK; } - -unsigned LzmaEnc_IsWriteEndMark(CLzmaEncHandle p) -{ - // GET_CLzmaEnc_p - return (unsigned)p->writeEndMark; -} - - -SRes LzmaEnc_MemEncode(CLzmaEncHandle p, Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen, - int writeEndMark, ICompressProgressPtr progress, ISzAllocPtr alloc, ISzAllocPtr allocBig) +SRes LzmaEnc_MemEncode(CLzmaEncHandle pp, Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen, + int writeEndMark, ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig) { SRes res; - // GET_CLzmaEnc_p + CLzmaEnc *p = (CLzmaEnc *)pp; - CLzmaEnc_SeqOutStreamBuf outStream; + CSeqOutStreamBuf outStream; - outStream.vt.Write = SeqOutStreamBuf_Write; + LzmaEnc_SetInputBuf(p, src, srcLen); + + outStream.funcTable.Write = MyWrite; outStream.data = dest; outStream.rem = *destLen; outStream.overflow = False; p->writeEndMark = writeEndMark; - p->rc.outStream = &outStream.vt; + res = LzmaEnc_Encode(pp, &outStream.funcTable, &p->seqBufInStream.funcTable, + progress, alloc, allocBig); - res = LzmaEnc_MemPrepare(p, src, srcLen, 0, alloc, allocBig); - - if (res == SZ_OK) - { - res = LzmaEnc_Encode2(p, progress); - if (res == SZ_OK && p->nowPos64 != srcLen) - res = SZ_ERROR_FAIL; - } - - *destLen -= (SizeT)outStream.rem; + *destLen -= outStream.rem; if (outStream.overflow) return SZ_ERROR_OUTPUT_EOF; return res; } - SRes LzmaEncode(Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen, const CLzmaEncProps *props, Byte *propsEncoded, SizeT *propsSize, int writeEndMark, - ICompressProgressPtr progress, ISzAllocPtr alloc, ISzAllocPtr allocBig) + ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig) { - CLzmaEncHandle p = LzmaEnc_Create(alloc); + CLzmaEnc *p = (CLzmaEnc *)LzmaEnc_Create(alloc); SRes res; - if (!p) + if (p == 0) return SZ_ERROR_MEM; res = LzmaEnc_SetProps(p, props); @@ -3130,15 +2278,3 @@ SRes LzmaEncode(Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen, LzmaEnc_Destroy(p, alloc, allocBig); return res; } - - -/* -#ifndef Z7_ST -void LzmaEnc_GetLzThreads(CLzmaEncHandle p, HANDLE lz_threads[2]) -{ - GET_const_CLzmaEnc_p - lz_threads[0] = p->matchFinderMt.hashSync.thread; - lz_threads[1] = p->matchFinderMt.btSync.thread; -} -#endif -*/ diff --git a/extern/lzma/LzmaEnc.h b/extern/lzma/LzmaEnc.h index 9f8039a1032..bfbc7d2b9c3 100644 --- a/extern/lzma/LzmaEnc.h +++ b/extern/lzma/LzmaEnc.h @@ -1,21 +1,19 @@ /* LzmaEnc.h -- LZMA Encoder -2023-04-13 : Igor Pavlov : Public domain */ +2008-10-04 : Igor Pavlov : Public domain */ -#ifndef ZIP7_INC_LZMA_ENC_H -#define ZIP7_INC_LZMA_ENC_H +#ifndef __LZMAENC_H +#define __LZMAENC_H -#include "7zTypes.h" - -EXTERN_C_BEGIN +#include "Types.h" #define LZMA_PROPS_SIZE 5 -typedef struct +typedef struct _CLzmaEncProps { - int level; /* 0 <= level <= 9 */ + int level; /* 0 <= level <= 9 */ UInt32 dictSize; /* (1 << 12) <= dictSize <= (1 << 27) for 32-bit version - (1 << 12) <= dictSize <= (3 << 29) for 64-bit version - default = (1 << 24) */ + (1 << 12) <= dictSize <= (1 << 30) for 64-bit version + default = (1 << 24) */ int lc; /* 0 <= lc <= 8, default = 3 */ int lp; /* 0 <= lp <= 4, default = 0 */ int pb; /* 0 <= pb <= 4, default = 2 */ @@ -23,17 +21,9 @@ typedef struct int fb; /* 5 <= fb <= 273, default = 32 */ int btMode; /* 0 - hashChain Mode, 1 - binTree mode - normal, default = 1 */ int numHashBytes; /* 2, 3 or 4, default = 4 */ - unsigned numHashOutBits; /* default = ? */ - UInt32 mc; /* 1 <= mc <= (1 << 30), default = 32 */ + UInt32 mc; /* 1 <= mc <= (1 << 30), default = 32 */ unsigned writeEndMark; /* 0 - do not write EOPM, 1 - write EOPM, default = 0 */ int numThreads; /* 1 or 2, default = 2 */ - - // int _pad; - - UInt64 reduceSize; /* estimated size of data that will be compressed. default = (UInt64)(Int64)-1. - Encoder uses this value to reduce dictionary size */ - - UInt64 affinity; } CLzmaEncProps; void LzmaEncProps_Init(CLzmaEncProps *p); @@ -43,41 +33,40 @@ UInt32 LzmaEncProps_GetDictSize(const CLzmaEncProps *props2); /* ---------- CLzmaEncHandle Interface ---------- */ -/* LzmaEnc* functions can return the following exit codes: -SRes: +/* LzmaEnc_* functions can return the following exit codes: +Returns: SZ_OK - OK SZ_ERROR_MEM - Memory allocation error SZ_ERROR_PARAM - Incorrect paramater in props - SZ_ERROR_WRITE - ISeqOutStream write callback error - SZ_ERROR_OUTPUT_EOF - output buffer overflow - version with (Byte *) output + SZ_ERROR_WRITE - Write callback error. SZ_ERROR_PROGRESS - some break from progress callback - SZ_ERROR_THREAD - error in multithreading functions (only for Mt version) + SZ_ERROR_THREAD - errors in multithreading functions (only for Mt version) */ -typedef struct CLzmaEnc CLzmaEnc; -typedef CLzmaEnc * CLzmaEncHandle; -// Z7_DECLARE_HANDLE(CLzmaEncHandle) - -CLzmaEncHandle LzmaEnc_Create(ISzAllocPtr alloc); -void LzmaEnc_Destroy(CLzmaEncHandle p, ISzAllocPtr alloc, ISzAllocPtr allocBig); +typedef void * CLzmaEncHandle; +CLzmaEncHandle LzmaEnc_Create(ISzAlloc *alloc); +void LzmaEnc_Destroy(CLzmaEncHandle p, ISzAlloc *alloc, ISzAlloc *allocBig); SRes LzmaEnc_SetProps(CLzmaEncHandle p, const CLzmaEncProps *props); -void LzmaEnc_SetDataSize(CLzmaEncHandle p, UInt64 expectedDataSiize); SRes LzmaEnc_WriteProperties(CLzmaEncHandle p, Byte *properties, SizeT *size); -unsigned LzmaEnc_IsWriteEndMark(CLzmaEncHandle p); - -SRes LzmaEnc_Encode(CLzmaEncHandle p, ISeqOutStreamPtr outStream, ISeqInStreamPtr inStream, - ICompressProgressPtr progress, ISzAllocPtr alloc, ISzAllocPtr allocBig); +SRes LzmaEnc_Encode(CLzmaEncHandle p, ISeqOutStream *outStream, ISeqInStream *inStream, + ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig); SRes LzmaEnc_MemEncode(CLzmaEncHandle p, Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen, - int writeEndMark, ICompressProgressPtr progress, ISzAllocPtr alloc, ISzAllocPtr allocBig); - + int writeEndMark, ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig); /* ---------- One Call Interface ---------- */ +/* LzmaEncode +Return code: + SZ_OK - OK + SZ_ERROR_MEM - Memory allocation error + SZ_ERROR_PARAM - Incorrect paramater + SZ_ERROR_OUTPUT_EOF - output buffer overflow + SZ_ERROR_THREAD - errors in multithreading functions (only for Mt version) +*/ + SRes LzmaEncode(Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen, const CLzmaEncProps *props, Byte *propsEncoded, SizeT *propsSize, int writeEndMark, - ICompressProgressPtr progress, ISzAllocPtr alloc, ISzAllocPtr allocBig); - -EXTERN_C_END + ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig); #endif diff --git a/extern/lzma/LzmaLib.c b/extern/lzma/LzmaLib.c index 785e8848744..02a511857c9 100644 --- a/extern/lzma/LzmaLib.c +++ b/extern/lzma/LzmaLib.c @@ -1,14 +1,18 @@ /* LzmaLib.c -- LZMA library wrapper -2023-04-02 : Igor Pavlov : Public domain */ +2008-08-05 +Igor Pavlov +Public domain */ -#include "Precomp.h" - -#include "Alloc.h" -#include "LzmaDec.h" #include "LzmaEnc.h" +#include "LzmaDec.h" +#include "Alloc.h" #include "LzmaLib.h" -Z7_STDAPI LzmaCompress(unsigned char *dest, size_t *destLen, const unsigned char *src, size_t srcLen, +static void *SzAlloc(void *p, size_t size) { p = p; return MyAlloc(size); } +static void SzFree(void *p, void *address) { p = p; MyFree(address); } +static ISzAlloc g_Alloc = { SzAlloc, SzFree }; + +MY_STDAPI LzmaCompress(unsigned char *dest, size_t *destLen, const unsigned char *src, size_t srcLen, unsigned char *outProps, size_t *outPropsSize, int level, /* 0 <= level <= 9, default = 5 */ unsigned dictSize, /* use (1 << N) or (3 << N). 4 KB < dictSize <= 128 MB */ @@ -34,7 +38,7 @@ Z7_STDAPI LzmaCompress(unsigned char *dest, size_t *destLen, const unsigned char } -Z7_STDAPI LzmaUncompress(unsigned char *dest, size_t *destLen, const unsigned char *src, size_t *srcLen, +MY_STDAPI LzmaUncompress(unsigned char *dest, size_t *destLen, const unsigned char *src, size_t *srcLen, const unsigned char *props, size_t propsSize) { ELzmaStatus status; diff --git a/extern/lzma/LzmaLib.h b/extern/lzma/LzmaLib.h index d7c0724de5e..5c9eeec73ca 100644 --- a/extern/lzma/LzmaLib.h +++ b/extern/lzma/LzmaLib.h @@ -1,14 +1,20 @@ /* LzmaLib.h -- LZMA library interface -2023-04-02 : Igor Pavlov : Public domain */ +2008-08-05 +Igor Pavlov +Public domain */ -#ifndef ZIP7_INC_LZMA_LIB_H -#define ZIP7_INC_LZMA_LIB_H +#ifndef __LZMALIB_H +#define __LZMALIB_H -#include "7zTypes.h" +#include "Types.h" -EXTERN_C_BEGIN +#ifdef __cplusplus + #define MY_EXTERN_C extern "C" +#else + #define MY_EXTERN_C extern +#endif -#define Z7_STDAPI int Z7_STDCALL +#define MY_STDAPI MY_EXTERN_C int MY_STD_CALL #define LZMA_PROPS_SIZE 5 @@ -40,16 +46,14 @@ outPropsSize - level - compression level: 0 <= level <= 9; level dictSize algo fb - 0: 64 KB 0 32 - 1: 256 KB 0 32 - 2: 1 MB 0 32 - 3: 4 MB 0 32 - 4: 16 MB 0 32 + 0: 16 KB 0 32 + 1: 64 KB 0 32 + 2: 256 KB 0 32 + 3: 1 MB 0 32 + 4: 4 MB 0 32 5: 16 MB 1 32 6: 32 MB 1 32 - 7: 32 MB 1 64 - 8: 64 MB 1 64 - 9: 64 MB 1 64 + 7+: 64 MB 1 64 The default value for "level" is 5. @@ -85,11 +89,6 @@ fb - Word size (the number of fast bytes). numThreads - The number of thereads. 1 or 2. The default value is 2. Fast mode (algo = 0) can use only 1 thread. -In: - dest - output data buffer - destLen - output data buffer size - src - input data - srcLen - input data size Out: destLen - processed output size Returns: @@ -100,7 +99,7 @@ Returns: SZ_ERROR_THREAD - errors in multithreading functions (only for Mt version) */ -Z7_STDAPI LzmaCompress(unsigned char *dest, size_t *destLen, const unsigned char *src, size_t srcLen, +MY_STDAPI LzmaCompress(unsigned char *dest, size_t *destLen, const unsigned char *src, size_t srcLen, unsigned char *outProps, size_t *outPropsSize, /* *outPropsSize must be = 5 */ int level, /* 0 <= level <= 9, default = 5 */ unsigned dictSize, /* default = (1 << 24) */ @@ -115,8 +114,8 @@ Z7_STDAPI LzmaCompress(unsigned char *dest, size_t *destLen, const unsigned char LzmaUncompress -------------- In: - dest - output data buffer - destLen - output data buffer size + dest - output data + destLen - output data size src - input data srcLen - input data size Out: @@ -130,9 +129,7 @@ Returns: SZ_ERROR_INPUT_EOF - it needs more bytes in input buffer (src) */ -Z7_STDAPI LzmaUncompress(unsigned char *dest, size_t *destLen, const unsigned char *src, SizeT *srcLen, +MY_STDAPI LzmaUncompress(unsigned char *dest, size_t *destLen, const unsigned char *src, SizeT *srcLen, const unsigned char *props, size_t propsSize); -EXTERN_C_END - #endif diff --git a/extern/lzma/Precomp.h b/extern/lzma/Precomp.h deleted file mode 100644 index 69afb2ffd10..00000000000 --- a/extern/lzma/Precomp.h +++ /dev/null @@ -1,10 +0,0 @@ -/* Precomp.h -- StdAfx -2023-04-02 : Igor Pavlov : Public domain */ - -#ifndef ZIP7_INC_PRECOMP_H -#define ZIP7_INC_PRECOMP_H - -#include "Compiler.h" -/* #include "7zTypes.h" */ - -#endif diff --git a/extern/lzma/README.blender b/extern/lzma/README.blender index 48ac4ab1ee4..0111946e30e 100644 --- a/extern/lzma/README.blender +++ b/extern/lzma/README.blender @@ -1,8 +1,5 @@ Project: LZMA SDK URL: https://www.7-zip.org/sdk.html License: Public Domain -Upstream version: 23.01 -Local modifications: No code changes - -- Took only files needed for Blender: C source for raw LZMA1 encoder/decoder. -- CMakeLists.txt is made for Blender codebase +Upstream version: 4.65 +Local modifications: None diff --git a/extern/lzma/Threads.c b/extern/lzma/Threads.c deleted file mode 100644 index cf52bd30307..00000000000 --- a/extern/lzma/Threads.c +++ /dev/null @@ -1,562 +0,0 @@ -/* Threads.c -- multithreading library -2023-03-04 : Igor Pavlov : Public domain */ - -#include "Precomp.h" - -#ifdef _WIN32 - -#ifndef USE_THREADS_CreateThread -#include -#endif - -#include "Threads.h" - -static WRes GetError(void) -{ - const DWORD res = GetLastError(); - return res ? (WRes)res : 1; -} - -static WRes HandleToWRes(HANDLE h) { return (h != NULL) ? 0 : GetError(); } -static WRes BOOLToWRes(BOOL v) { return v ? 0 : GetError(); } - -WRes HandlePtr_Close(HANDLE *p) -{ - if (*p != NULL) - { - if (!CloseHandle(*p)) - return GetError(); - *p = NULL; - } - return 0; -} - -WRes Handle_WaitObject(HANDLE h) -{ - DWORD dw = WaitForSingleObject(h, INFINITE); - /* - (dw) result: - WAIT_OBJECT_0 // 0 - WAIT_ABANDONED // 0x00000080 : is not compatible with Win32 Error space - WAIT_TIMEOUT // 0x00000102 : is compatible with Win32 Error space - WAIT_FAILED // 0xFFFFFFFF - */ - if (dw == WAIT_FAILED) - { - dw = GetLastError(); - if (dw == 0) - return WAIT_FAILED; - } - return (WRes)dw; -} - -#define Thread_Wait(p) Handle_WaitObject(*(p)) - -WRes Thread_Wait_Close(CThread *p) -{ - WRes res = Thread_Wait(p); - WRes res2 = Thread_Close(p); - return (res != 0 ? res : res2); -} - -WRes Thread_Create(CThread *p, THREAD_FUNC_TYPE func, LPVOID param) -{ - /* Windows Me/98/95: threadId parameter may not be NULL in _beginthreadex/CreateThread functions */ - - #ifdef USE_THREADS_CreateThread - - DWORD threadId; - *p = CreateThread(NULL, 0, func, param, 0, &threadId); - - #else - - unsigned threadId; - *p = (HANDLE)(_beginthreadex(NULL, 0, func, param, 0, &threadId)); - - #endif - - /* maybe we must use errno here, but probably GetLastError() is also OK. */ - return HandleToWRes(*p); -} - - -WRes Thread_Create_With_Affinity(CThread *p, THREAD_FUNC_TYPE func, LPVOID param, CAffinityMask affinity) -{ - #ifdef USE_THREADS_CreateThread - - UNUSED_VAR(affinity) - return Thread_Create(p, func, param); - - #else - - /* Windows Me/98/95: threadId parameter may not be NULL in _beginthreadex/CreateThread functions */ - HANDLE h; - WRes wres; - unsigned threadId; - h = (HANDLE)(_beginthreadex(NULL, 0, func, param, CREATE_SUSPENDED, &threadId)); - *p = h; - wres = HandleToWRes(h); - if (h) - { - { - // DWORD_PTR prevMask = - SetThreadAffinityMask(h, (DWORD_PTR)affinity); - /* - if (prevMask == 0) - { - // affinity change is non-critical error, so we can ignore it - // wres = GetError(); - } - */ - } - { - DWORD prevSuspendCount = ResumeThread(h); - /* ResumeThread() returns: - 0 : was_not_suspended - 1 : was_resumed - -1 : error - */ - if (prevSuspendCount == (DWORD)-1) - wres = GetError(); - } - } - - /* maybe we must use errno here, but probably GetLastError() is also OK. */ - return wres; - - #endif -} - - -static WRes Event_Create(CEvent *p, BOOL manualReset, int signaled) -{ - *p = CreateEvent(NULL, manualReset, (signaled ? TRUE : FALSE), NULL); - return HandleToWRes(*p); -} - -WRes Event_Set(CEvent *p) { return BOOLToWRes(SetEvent(*p)); } -WRes Event_Reset(CEvent *p) { return BOOLToWRes(ResetEvent(*p)); } - -WRes ManualResetEvent_Create(CManualResetEvent *p, int signaled) { return Event_Create(p, TRUE, signaled); } -WRes AutoResetEvent_Create(CAutoResetEvent *p, int signaled) { return Event_Create(p, FALSE, signaled); } -WRes ManualResetEvent_CreateNotSignaled(CManualResetEvent *p) { return ManualResetEvent_Create(p, 0); } -WRes AutoResetEvent_CreateNotSignaled(CAutoResetEvent *p) { return AutoResetEvent_Create(p, 0); } - - -WRes Semaphore_Create(CSemaphore *p, UInt32 initCount, UInt32 maxCount) -{ - // negative ((LONG)maxCount) is not supported in WIN32::CreateSemaphore() - *p = CreateSemaphore(NULL, (LONG)initCount, (LONG)maxCount, NULL); - return HandleToWRes(*p); -} - -WRes Semaphore_OptCreateInit(CSemaphore *p, UInt32 initCount, UInt32 maxCount) -{ - // if (Semaphore_IsCreated(p)) - { - WRes wres = Semaphore_Close(p); - if (wres != 0) - return wres; - } - return Semaphore_Create(p, initCount, maxCount); -} - -static WRes Semaphore_Release(CSemaphore *p, LONG releaseCount, LONG *previousCount) - { return BOOLToWRes(ReleaseSemaphore(*p, releaseCount, previousCount)); } -WRes Semaphore_ReleaseN(CSemaphore *p, UInt32 num) - { return Semaphore_Release(p, (LONG)num, NULL); } -WRes Semaphore_Release1(CSemaphore *p) { return Semaphore_ReleaseN(p, 1); } - -WRes CriticalSection_Init(CCriticalSection *p) -{ - /* InitializeCriticalSection() can raise exception: - Windows XP, 2003 : can raise a STATUS_NO_MEMORY exception - Windows Vista+ : no exceptions */ - #ifdef _MSC_VER - #ifdef __clang__ - #pragma GCC diagnostic ignored "-Wlanguage-extension-token" - #endif - __try - #endif - { - InitializeCriticalSection(p); - /* InitializeCriticalSectionAndSpinCount(p, 0); */ - } - #ifdef _MSC_VER - __except (EXCEPTION_EXECUTE_HANDLER) { return ERROR_NOT_ENOUGH_MEMORY; } - #endif - return 0; -} - - - - -#else // _WIN32 - -// ---------- POSIX ---------- - -#ifndef __APPLE__ -#ifndef Z7_AFFINITY_DISABLE -// _GNU_SOURCE can be required for pthread_setaffinity_np() / CPU_ZERO / CPU_SET -// clang < 3.6 : unknown warning group '-Wreserved-id-macro' -// clang 3.6 - 12.01 : gives warning "macro name is a reserved identifier" -// clang >= 13 : do not give warning -#if !defined(_GNU_SOURCE) - #if defined(__clang__) && (__clang_major__ >= 4) && (__clang_major__ <= 12) - #pragma GCC diagnostic ignored "-Wreserved-id-macro" - #endif -#define _GNU_SOURCE -#endif // !defined(_GNU_SOURCE) -#endif // Z7_AFFINITY_DISABLE -#endif // __APPLE__ - -#include "Threads.h" - -#include -#include -#include -#ifdef Z7_AFFINITY_SUPPORTED -// #include -#endif - - -// #include -// #define PRF(p) p -#define PRF(p) -#define Print(s) PRF(printf("\n%s\n", s);) - -WRes Thread_Create_With_CpuSet(CThread *p, THREAD_FUNC_TYPE func, LPVOID param, const CCpuSet *cpuSet) -{ - // new thread in Posix probably inherits affinity from parrent thread - Print("Thread_Create_With_CpuSet") - - pthread_attr_t attr; - int ret; - // int ret2; - - p->_created = 0; - - RINOK(pthread_attr_init(&attr)) - - ret = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE); - - if (!ret) - { - if (cpuSet) - { - #ifdef Z7_AFFINITY_SUPPORTED - - /* - printf("\n affinity :"); - unsigned i; - for (i = 0; i < sizeof(*cpuSet) && i < 8; i++) - { - Byte b = *((const Byte *)cpuSet + i); - char temp[32]; - #define GET_HEX_CHAR(t) ((char)(((t < 10) ? ('0' + t) : ('A' + (t - 10))))) - temp[0] = GET_HEX_CHAR((b & 0xF)); - temp[1] = GET_HEX_CHAR((b >> 4)); - // temp[0] = GET_HEX_CHAR((b >> 4)); // big-endian - // temp[1] = GET_HEX_CHAR((b & 0xF)); // big-endian - temp[2] = 0; - printf("%s", temp); - } - printf("\n"); - */ - - // ret2 = - pthread_attr_setaffinity_np(&attr, sizeof(*cpuSet), cpuSet); - // if (ret2) ret = ret2; - #endif - } - - ret = pthread_create(&p->_tid, &attr, func, param); - - if (!ret) - { - p->_created = 1; - /* - if (cpuSet) - { - // ret2 = - pthread_setaffinity_np(p->_tid, sizeof(*cpuSet), cpuSet); - // if (ret2) ret = ret2; - } - */ - } - } - // ret2 = - pthread_attr_destroy(&attr); - // if (ret2 != 0) ret = ret2; - return ret; -} - - -WRes Thread_Create(CThread *p, THREAD_FUNC_TYPE func, LPVOID param) -{ - return Thread_Create_With_CpuSet(p, func, param, NULL); -} - - -WRes Thread_Create_With_Affinity(CThread *p, THREAD_FUNC_TYPE func, LPVOID param, CAffinityMask affinity) -{ - Print("Thread_Create_WithAffinity") - CCpuSet cs; - unsigned i; - CpuSet_Zero(&cs); - for (i = 0; i < sizeof(affinity) * 8; i++) - { - if (affinity == 0) - break; - if (affinity & 1) - { - CpuSet_Set(&cs, i); - } - affinity >>= 1; - } - return Thread_Create_With_CpuSet(p, func, param, &cs); -} - - -WRes Thread_Close(CThread *p) -{ - // Print("Thread_Close") - int ret; - if (!p->_created) - return 0; - - ret = pthread_detach(p->_tid); - p->_tid = 0; - p->_created = 0; - return ret; -} - - -WRes Thread_Wait_Close(CThread *p) -{ - // Print("Thread_Wait_Close") - void *thread_return; - int ret; - if (!p->_created) - return EINVAL; - - ret = pthread_join(p->_tid, &thread_return); - // probably we can't use that (_tid) after pthread_join(), so we close thread here - p->_created = 0; - p->_tid = 0; - return ret; -} - - - -static WRes Event_Create(CEvent *p, int manualReset, int signaled) -{ - RINOK(pthread_mutex_init(&p->_mutex, NULL)) - RINOK(pthread_cond_init(&p->_cond, NULL)) - p->_manual_reset = manualReset; - p->_state = (signaled ? True : False); - p->_created = 1; - return 0; -} - -WRes ManualResetEvent_Create(CManualResetEvent *p, int signaled) - { return Event_Create(p, True, signaled); } -WRes ManualResetEvent_CreateNotSignaled(CManualResetEvent *p) - { return ManualResetEvent_Create(p, 0); } -WRes AutoResetEvent_Create(CAutoResetEvent *p, int signaled) - { return Event_Create(p, False, signaled); } -WRes AutoResetEvent_CreateNotSignaled(CAutoResetEvent *p) - { return AutoResetEvent_Create(p, 0); } - - -WRes Event_Set(CEvent *p) -{ - RINOK(pthread_mutex_lock(&p->_mutex)) - p->_state = True; - int res1 = pthread_cond_broadcast(&p->_cond); - int res2 = pthread_mutex_unlock(&p->_mutex); - return (res2 ? res2 : res1); -} - -WRes Event_Reset(CEvent *p) -{ - RINOK(pthread_mutex_lock(&p->_mutex)) - p->_state = False; - return pthread_mutex_unlock(&p->_mutex); -} - -WRes Event_Wait(CEvent *p) -{ - RINOK(pthread_mutex_lock(&p->_mutex)) - while (p->_state == False) - { - // ETIMEDOUT - // ret = - pthread_cond_wait(&p->_cond, &p->_mutex); - // if (ret != 0) break; - } - if (p->_manual_reset == False) - { - p->_state = False; - } - return pthread_mutex_unlock(&p->_mutex); -} - -WRes Event_Close(CEvent *p) -{ - if (!p->_created) - return 0; - p->_created = 0; - { - int res1 = pthread_mutex_destroy(&p->_mutex); - int res2 = pthread_cond_destroy(&p->_cond); - return (res1 ? res1 : res2); - } -} - - -WRes Semaphore_Create(CSemaphore *p, UInt32 initCount, UInt32 maxCount) -{ - if (initCount > maxCount || maxCount < 1) - return EINVAL; - RINOK(pthread_mutex_init(&p->_mutex, NULL)) - RINOK(pthread_cond_init(&p->_cond, NULL)) - p->_count = initCount; - p->_maxCount = maxCount; - p->_created = 1; - return 0; -} - - -WRes Semaphore_OptCreateInit(CSemaphore *p, UInt32 initCount, UInt32 maxCount) -{ - if (Semaphore_IsCreated(p)) - { - /* - WRes wres = Semaphore_Close(p); - if (wres != 0) - return wres; - */ - if (initCount > maxCount || maxCount < 1) - return EINVAL; - // return EINVAL; // for debug - p->_count = initCount; - p->_maxCount = maxCount; - return 0; - } - return Semaphore_Create(p, initCount, maxCount); -} - - -WRes Semaphore_ReleaseN(CSemaphore *p, UInt32 releaseCount) -{ - UInt32 newCount; - int ret; - - if (releaseCount < 1) - return EINVAL; - - RINOK(pthread_mutex_lock(&p->_mutex)) - - newCount = p->_count + releaseCount; - if (newCount > p->_maxCount) - ret = ERROR_TOO_MANY_POSTS; // EINVAL; - else - { - p->_count = newCount; - ret = pthread_cond_broadcast(&p->_cond); - } - RINOK(pthread_mutex_unlock(&p->_mutex)) - return ret; -} - -WRes Semaphore_Wait(CSemaphore *p) -{ - RINOK(pthread_mutex_lock(&p->_mutex)) - while (p->_count < 1) - { - pthread_cond_wait(&p->_cond, &p->_mutex); - } - p->_count--; - return pthread_mutex_unlock(&p->_mutex); -} - -WRes Semaphore_Close(CSemaphore *p) -{ - if (!p->_created) - return 0; - p->_created = 0; - { - int res1 = pthread_mutex_destroy(&p->_mutex); - int res2 = pthread_cond_destroy(&p->_cond); - return (res1 ? res1 : res2); - } -} - - - -WRes CriticalSection_Init(CCriticalSection *p) -{ - // Print("CriticalSection_Init") - if (!p) - return EINTR; - return pthread_mutex_init(&p->_mutex, NULL); -} - -void CriticalSection_Enter(CCriticalSection *p) -{ - // Print("CriticalSection_Enter") - if (p) - { - // int ret = - pthread_mutex_lock(&p->_mutex); - } -} - -void CriticalSection_Leave(CCriticalSection *p) -{ - // Print("CriticalSection_Leave") - if (p) - { - // int ret = - pthread_mutex_unlock(&p->_mutex); - } -} - -void CriticalSection_Delete(CCriticalSection *p) -{ - // Print("CriticalSection_Delete") - if (p) - { - // int ret = - pthread_mutex_destroy(&p->_mutex); - } -} - -LONG InterlockedIncrement(LONG volatile *addend) -{ - // Print("InterlockedIncrement") - #ifdef USE_HACK_UNSAFE_ATOMIC - LONG val = *addend + 1; - *addend = val; - return val; - #else - - #if defined(__clang__) && (__clang_major__ >= 8) - #pragma GCC diagnostic ignored "-Watomic-implicit-seq-cst" - #endif - return __sync_add_and_fetch(addend, 1); - #endif -} - -#endif // _WIN32 - -WRes AutoResetEvent_OptCreate_And_Reset(CAutoResetEvent *p) -{ - if (Event_IsCreated(p)) - return Event_Reset(p); - return AutoResetEvent_CreateNotSignaled(p); -} - -#undef PRF -#undef Print diff --git a/extern/lzma/Threads.h b/extern/lzma/Threads.h deleted file mode 100644 index 4028464a337..00000000000 --- a/extern/lzma/Threads.h +++ /dev/null @@ -1,240 +0,0 @@ -/* Threads.h -- multithreading library -2023-04-02 : Igor Pavlov : Public domain */ - -#ifndef ZIP7_INC_THREADS_H -#define ZIP7_INC_THREADS_H - -#ifdef _WIN32 -#include "7zWindows.h" - -#else - -#if defined(__linux__) -#if !defined(__APPLE__) && !defined(_AIX) && !defined(__ANDROID__) -#ifndef Z7_AFFINITY_DISABLE -#define Z7_AFFINITY_SUPPORTED -// #pragma message(" ==== Z7_AFFINITY_SUPPORTED") -// #define _GNU_SOURCE -#endif -#endif -#endif - -#include - -#endif - -#include "7zTypes.h" - -EXTERN_C_BEGIN - -#ifdef _WIN32 - -WRes HandlePtr_Close(HANDLE *h); -WRes Handle_WaitObject(HANDLE h); - -typedef HANDLE CThread; - -#define Thread_CONSTRUCT(p) { *(p) = NULL; } -#define Thread_WasCreated(p) (*(p) != NULL) -#define Thread_Close(p) HandlePtr_Close(p) -// #define Thread_Wait(p) Handle_WaitObject(*(p)) - -#ifdef UNDER_CE - // if (USE_THREADS_CreateThread is defined), we use _beginthreadex() - // if (USE_THREADS_CreateThread is not definned), we use CreateThread() - #define USE_THREADS_CreateThread -#endif - -typedef - #ifdef USE_THREADS_CreateThread - DWORD - #else - unsigned - #endif - THREAD_FUNC_RET_TYPE; - -#define THREAD_FUNC_RET_ZERO 0 - -typedef DWORD_PTR CAffinityMask; -typedef DWORD_PTR CCpuSet; - -#define CpuSet_Zero(p) *(p) = (0) -#define CpuSet_Set(p, cpu) *(p) |= ((DWORD_PTR)1 << (cpu)) - -#else // _WIN32 - -typedef struct -{ - pthread_t _tid; - int _created; -} CThread; - -#define Thread_CONSTRUCT(p) { (p)->_tid = 0; (p)->_created = 0; } -#define Thread_WasCreated(p) ((p)->_created != 0) -WRes Thread_Close(CThread *p); -// #define Thread_Wait Thread_Wait_Close - -typedef void * THREAD_FUNC_RET_TYPE; -#define THREAD_FUNC_RET_ZERO NULL - - -typedef UInt64 CAffinityMask; - -#ifdef Z7_AFFINITY_SUPPORTED - -typedef cpu_set_t CCpuSet; -#define CpuSet_Zero(p) CPU_ZERO(p) -#define CpuSet_Set(p, cpu) CPU_SET(cpu, p) -#define CpuSet_IsSet(p, cpu) CPU_ISSET(cpu, p) - -#else - -typedef UInt64 CCpuSet; -#define CpuSet_Zero(p) *(p) = (0) -#define CpuSet_Set(p, cpu) *(p) |= ((UInt64)1 << (cpu)) -#define CpuSet_IsSet(p, cpu) ((*(p) & ((UInt64)1 << (cpu))) != 0) - -#endif - - -#endif // _WIN32 - - -#define THREAD_FUNC_CALL_TYPE Z7_STDCALL - -#if defined(_WIN32) && defined(__GNUC__) -/* GCC compiler for x86 32-bit uses the rule: - the stack is 16-byte aligned before CALL instruction for function calling. - But only root function main() contains instructions that - set 16-byte alignment for stack pointer. And another functions - just keep alignment, if it was set in some parent function. - - The problem: - if we create new thread in MinGW (GCC) 32-bit x86 via _beginthreadex() or CreateThread(), - the root function of thread doesn't set 16-byte alignment. - And stack frames in all child functions also will be unaligned in that case. - - Here we set (force_align_arg_pointer) attribute for root function of new thread. - Do we need (force_align_arg_pointer) also for another systems? */ - - #define THREAD_FUNC_ATTRIB_ALIGN_ARG __attribute__((force_align_arg_pointer)) - // #define THREAD_FUNC_ATTRIB_ALIGN_ARG // for debug : bad alignment in SSE functions -#else - #define THREAD_FUNC_ATTRIB_ALIGN_ARG -#endif - -#define THREAD_FUNC_DECL THREAD_FUNC_ATTRIB_ALIGN_ARG THREAD_FUNC_RET_TYPE THREAD_FUNC_CALL_TYPE - -typedef THREAD_FUNC_RET_TYPE (THREAD_FUNC_CALL_TYPE * THREAD_FUNC_TYPE)(void *); -WRes Thread_Create(CThread *p, THREAD_FUNC_TYPE func, LPVOID param); -WRes Thread_Create_With_Affinity(CThread *p, THREAD_FUNC_TYPE func, LPVOID param, CAffinityMask affinity); -WRes Thread_Wait_Close(CThread *p); - -#ifdef _WIN32 -#define Thread_Create_With_CpuSet(p, func, param, cs) \ - Thread_Create_With_Affinity(p, func, param, *cs) -#else -WRes Thread_Create_With_CpuSet(CThread *p, THREAD_FUNC_TYPE func, LPVOID param, const CCpuSet *cpuSet); -#endif - - -#ifdef _WIN32 - -typedef HANDLE CEvent; -typedef CEvent CAutoResetEvent; -typedef CEvent CManualResetEvent; -#define Event_Construct(p) *(p) = NULL -#define Event_IsCreated(p) (*(p) != NULL) -#define Event_Close(p) HandlePtr_Close(p) -#define Event_Wait(p) Handle_WaitObject(*(p)) -WRes Event_Set(CEvent *p); -WRes Event_Reset(CEvent *p); -WRes ManualResetEvent_Create(CManualResetEvent *p, int signaled); -WRes ManualResetEvent_CreateNotSignaled(CManualResetEvent *p); -WRes AutoResetEvent_Create(CAutoResetEvent *p, int signaled); -WRes AutoResetEvent_CreateNotSignaled(CAutoResetEvent *p); - -typedef HANDLE CSemaphore; -#define Semaphore_Construct(p) *(p) = NULL -#define Semaphore_IsCreated(p) (*(p) != NULL) -#define Semaphore_Close(p) HandlePtr_Close(p) -#define Semaphore_Wait(p) Handle_WaitObject(*(p)) -WRes Semaphore_Create(CSemaphore *p, UInt32 initCount, UInt32 maxCount); -WRes Semaphore_OptCreateInit(CSemaphore *p, UInt32 initCount, UInt32 maxCount); -WRes Semaphore_ReleaseN(CSemaphore *p, UInt32 num); -WRes Semaphore_Release1(CSemaphore *p); - -typedef CRITICAL_SECTION CCriticalSection; -WRes CriticalSection_Init(CCriticalSection *p); -#define CriticalSection_Delete(p) DeleteCriticalSection(p) -#define CriticalSection_Enter(p) EnterCriticalSection(p) -#define CriticalSection_Leave(p) LeaveCriticalSection(p) - - -#else // _WIN32 - -typedef struct _CEvent -{ - int _created; - int _manual_reset; - int _state; - pthread_mutex_t _mutex; - pthread_cond_t _cond; -} CEvent; - -typedef CEvent CAutoResetEvent; -typedef CEvent CManualResetEvent; - -#define Event_Construct(p) (p)->_created = 0 -#define Event_IsCreated(p) ((p)->_created) - -WRes ManualResetEvent_Create(CManualResetEvent *p, int signaled); -WRes ManualResetEvent_CreateNotSignaled(CManualResetEvent *p); -WRes AutoResetEvent_Create(CAutoResetEvent *p, int signaled); -WRes AutoResetEvent_CreateNotSignaled(CAutoResetEvent *p); - -WRes Event_Set(CEvent *p); -WRes Event_Reset(CEvent *p); -WRes Event_Wait(CEvent *p); -WRes Event_Close(CEvent *p); - - -typedef struct _CSemaphore -{ - int _created; - UInt32 _count; - UInt32 _maxCount; - pthread_mutex_t _mutex; - pthread_cond_t _cond; -} CSemaphore; - -#define Semaphore_Construct(p) (p)->_created = 0 -#define Semaphore_IsCreated(p) ((p)->_created) - -WRes Semaphore_Create(CSemaphore *p, UInt32 initCount, UInt32 maxCount); -WRes Semaphore_OptCreateInit(CSemaphore *p, UInt32 initCount, UInt32 maxCount); -WRes Semaphore_ReleaseN(CSemaphore *p, UInt32 num); -#define Semaphore_Release1(p) Semaphore_ReleaseN(p, 1) -WRes Semaphore_Wait(CSemaphore *p); -WRes Semaphore_Close(CSemaphore *p); - - -typedef struct _CCriticalSection -{ - pthread_mutex_t _mutex; -} CCriticalSection; - -WRes CriticalSection_Init(CCriticalSection *p); -void CriticalSection_Delete(CCriticalSection *cs); -void CriticalSection_Enter(CCriticalSection *cs); -void CriticalSection_Leave(CCriticalSection *cs); - -LONG InterlockedIncrement(LONG volatile *addend); - -#endif // _WIN32 - -WRes AutoResetEvent_OptCreate_And_Reset(CAutoResetEvent *p); - -EXTERN_C_END - -#endif diff --git a/extern/lzma/Types.h b/extern/lzma/Types.h new file mode 100644 index 00000000000..1af5cfc4d86 --- /dev/null +++ b/extern/lzma/Types.h @@ -0,0 +1,208 @@ +/* Types.h -- Basic types +2008-11-23 : Igor Pavlov : Public domain */ + +#ifndef __7Z_TYPES_H +#define __7Z_TYPES_H + +#include + +#ifdef _WIN32 +#include +#endif + +#define SZ_OK 0 + +#define SZ_ERROR_DATA 1 +#define SZ_ERROR_MEM 2 +#define SZ_ERROR_CRC 3 +#define SZ_ERROR_UNSUPPORTED 4 +#define SZ_ERROR_PARAM 5 +#define SZ_ERROR_INPUT_EOF 6 +#define SZ_ERROR_OUTPUT_EOF 7 +#define SZ_ERROR_READ 8 +#define SZ_ERROR_WRITE 9 +#define SZ_ERROR_PROGRESS 10 +#define SZ_ERROR_FAIL 11 +#define SZ_ERROR_THREAD 12 + +#define SZ_ERROR_ARCHIVE 16 +#define SZ_ERROR_NO_ARCHIVE 17 + +typedef int SRes; + +#ifdef _WIN32 +typedef DWORD WRes; +#else +typedef int WRes; +#endif + +#ifndef RINOK +#define RINOK(x) { int __result__ = (x); if (__result__ != 0) return __result__; } +#endif + +typedef unsigned char Byte; +typedef short Int16; +typedef unsigned short UInt16; + +#ifdef _LZMA_UINT32_IS_ULONG +typedef long Int32; +typedef unsigned long UInt32; +#else +typedef int Int32; +typedef unsigned int UInt32; +#endif + +#ifdef _SZ_NO_INT_64 + +/* define _SZ_NO_INT_64, if your compiler doesn't support 64-bit integers. + NOTES: Some code will work incorrectly in that case! */ + +typedef long Int64; +typedef unsigned long UInt64; + +#else + +#if defined(_MSC_VER) || defined(__BORLANDC__) +typedef __int64 Int64; +typedef unsigned __int64 UInt64; +#else +typedef long long int Int64; +typedef unsigned long long int UInt64; +#endif + +#endif + +#ifdef _LZMA_NO_SYSTEM_SIZE_T +typedef UInt32 SizeT; +#else +typedef size_t SizeT; +#endif + +typedef int Bool; +#define True 1 +#define False 0 + + +#ifdef _MSC_VER + +#if _MSC_VER >= 1300 +#define MY_NO_INLINE __declspec(noinline) +#else +#define MY_NO_INLINE +#endif + +#define MY_CDECL __cdecl +#define MY_STD_CALL __stdcall +#define MY_FAST_CALL MY_NO_INLINE __fastcall + +#else + +#define MY_CDECL +#define MY_STD_CALL +#define MY_FAST_CALL + +#endif + + +/* The following interfaces use first parameter as pointer to structure */ + +typedef struct +{ + SRes (*Read)(void *p, void *buf, size_t *size); + /* if (input(*size) != 0 && output(*size) == 0) means end_of_stream. + (output(*size) < input(*size)) is allowed */ +} ISeqInStream; + +/* it can return SZ_ERROR_INPUT_EOF */ +SRes SeqInStream_Read(ISeqInStream *stream, void *buf, size_t size); +SRes SeqInStream_Read2(ISeqInStream *stream, void *buf, size_t size, SRes errorType); +SRes SeqInStream_ReadByte(ISeqInStream *stream, Byte *buf); + +typedef struct +{ + size_t (*Write)(void *p, const void *buf, size_t size); + /* Returns: result - the number of actually written bytes. + (result < size) means error */ +} ISeqOutStream; + +typedef enum +{ + SZ_SEEK_SET = 0, + SZ_SEEK_CUR = 1, + SZ_SEEK_END = 2 +} ESzSeek; + +typedef struct +{ + SRes (*Read)(void *p, void *buf, size_t *size); /* same as ISeqInStream::Read */ + SRes (*Seek)(void *p, Int64 *pos, ESzSeek origin); +} ISeekInStream; + +typedef struct +{ + SRes (*Look)(void *p, void **buf, size_t *size); + /* if (input(*size) != 0 && output(*size) == 0) means end_of_stream. + (output(*size) > input(*size)) is not allowed + (output(*size) < input(*size)) is allowed */ + SRes (*Skip)(void *p, size_t offset); + /* offset must be <= output(*size) of Look */ + + SRes (*Read)(void *p, void *buf, size_t *size); + /* reads directly (without buffer). It's same as ISeqInStream::Read */ + SRes (*Seek)(void *p, Int64 *pos, ESzSeek origin); +} ILookInStream; + +SRes LookInStream_LookRead(ILookInStream *stream, void *buf, size_t *size); +SRes LookInStream_SeekTo(ILookInStream *stream, UInt64 offset); + +/* reads via ILookInStream::Read */ +SRes LookInStream_Read2(ILookInStream *stream, void *buf, size_t size, SRes errorType); +SRes LookInStream_Read(ILookInStream *stream, void *buf, size_t size); + +#define LookToRead_BUF_SIZE (1 << 14) + +typedef struct +{ + ILookInStream s; + ISeekInStream *realStream; + size_t pos; + size_t size; + Byte buf[LookToRead_BUF_SIZE]; +} CLookToRead; + +void LookToRead_CreateVTable(CLookToRead *p, int lookahead); +void LookToRead_Init(CLookToRead *p); + +typedef struct +{ + ISeqInStream s; + ILookInStream *realStream; +} CSecToLook; + +void SecToLook_CreateVTable(CSecToLook *p); + +typedef struct +{ + ISeqInStream s; + ILookInStream *realStream; +} CSecToRead; + +void SecToRead_CreateVTable(CSecToRead *p); + +typedef struct +{ + SRes (*Progress)(void *p, UInt64 inSize, UInt64 outSize); + /* Returns: result. (result != SZ_OK) means break. + Value (UInt64)(Int64)-1 for size means unknown value. */ +} ICompressProgress; + +typedef struct +{ + void *(*Alloc)(void *p, size_t size); + void (*Free)(void *p, void *address); /* address can be 0 */ +} ISzAlloc; + +#define IAlloc_Alloc(p, size) (p)->Alloc((p), size) +#define IAlloc_Free(p, a) (p)->Free((p), a) + +#endif diff --git a/extern/lzma/history.txt b/extern/lzma/history.txt new file mode 100644 index 00000000000..014186717da --- /dev/null +++ b/extern/lzma/history.txt @@ -0,0 +1,236 @@ +HISTORY of the LZMA SDK +----------------------- + +4.65 2009-02-03 +------------------------- +- Some minor fixes + + +4.63 2008-12-31 +------------------------- +- Some minor fixes + + +4.61 beta 2008-11-23 +------------------------- +- The bug in ANSI-C LZMA Decoder was fixed: + If encoded stream was corrupted, decoder could access memory + outside of allocated range. +- Some changes in ANSI-C 7z Decoder interfaces. +- LZMA SDK is placed in the public domain. + + +4.60 beta 2008-08-19 +------------------------- +- Some minor fixes. + + +4.59 beta 2008-08-13 +------------------------- +- The bug was fixed: + LZMA Encoder in fast compression mode could access memory outside of + allocated range in some rare cases. + + +4.58 beta 2008-05-05 +------------------------- +- ANSI-C LZMA Decoder was rewritten for speed optimizations. +- ANSI-C LZMA Encoder was included to LZMA SDK. +- C++ LZMA code now is just wrapper over ANSI-C code. + + +4.57 2007-12-12 +------------------------- +- Speed optimizations in Ñ++ LZMA Decoder. +- Small changes for more compatibility with some C/C++ compilers. + + +4.49 beta 2007-07-05 +------------------------- +- .7z ANSI-C Decoder: + - now it supports BCJ and BCJ2 filters + - now it supports files larger than 4 GB. + - now it supports "Last Write Time" field for files. +- C++ code for .7z archives compressing/decompressing from 7-zip + was included to LZMA SDK. + + +4.43 2006-06-04 +------------------------- +- Small changes for more compatibility with some C/C++ compilers. + + +4.42 2006-05-15 +------------------------- +- Small changes in .h files in ANSI-C version. + + +4.39 beta 2006-04-14 +------------------------- +- The bug in versions 4.33b:4.38b was fixed: + C++ version of LZMA encoder could not correctly compress + files larger than 2 GB with HC4 match finder (-mfhc4). + + +4.37 beta 2005-04-06 +------------------------- +- Fixes in C++ code: code could no be compiled if _NO_EXCEPTIONS was defined. + + +4.35 beta 2005-03-02 +------------------------- +- The bug was fixed in C++ version of LZMA Decoder: + If encoded stream was corrupted, decoder could access memory + outside of allocated range. + + +4.34 beta 2006-02-27 +------------------------- +- Compressing speed and memory requirements for compressing were increased +- LZMA now can use only these match finders: HC4, BT2, BT3, BT4 + + +4.32 2005-12-09 +------------------------- +- Java version of LZMA SDK was included + + +4.30 2005-11-20 +------------------------- +- Compression ratio was improved in -a2 mode +- Speed optimizations for compressing in -a2 mode +- -fb switch now supports values up to 273 +- The bug in 7z_C (7zIn.c) was fixed: + It used Alloc/Free functions from different memory pools. + So if program used two memory pools, it worked incorrectly. +- 7z_C: .7z format supporting was improved +- LZMA# SDK (C#.NET version) was included + + +4.27 (Updated) 2005-09-21 +------------------------- +- Some GUIDs/interfaces in C++ were changed. + IStream.h: + ISequentialInStream::Read now works as old ReadPart + ISequentialOutStream::Write now works as old WritePart + + +4.27 2005-08-07 +------------------------- +- The bug in LzmaDecodeSize.c was fixed: + if _LZMA_IN_CB and _LZMA_OUT_READ were defined, + decompressing worked incorrectly. + + +4.26 2005-08-05 +------------------------- +- Fixes in 7z_C code and LzmaTest.c: + previous versions could work incorrectly, + if malloc(0) returns 0 + + +4.23 2005-06-29 +------------------------- +- Small fixes in C++ code + + +4.22 2005-06-10 +------------------------- +- Small fixes + + +4.21 2005-06-08 +------------------------- +- Interfaces for ANSI-C LZMA Decoder (LzmaDecode.c) were changed +- New additional version of ANSI-C LZMA Decoder with zlib-like interface: + - LzmaStateDecode.h + - LzmaStateDecode.c + - LzmaStateTest.c +- ANSI-C LZMA Decoder now can decompress files larger than 4 GB + + +4.17 2005-04-18 +------------------------- +- New example for RAM->RAM compressing/decompressing: + LZMA + BCJ (filter for x86 code): + - LzmaRam.h + - LzmaRam.cpp + - LzmaRamDecode.h + - LzmaRamDecode.c + - -f86 switch for lzma.exe + + +4.16 2005-03-29 +------------------------- +- The bug was fixed in LzmaDecode.c (ANSI-C LZMA Decoder): + If _LZMA_OUT_READ was defined, and if encoded stream was corrupted, + decoder could access memory outside of allocated range. +- Speed optimization of ANSI-C LZMA Decoder (now it's about 20% faster). + Old version of LZMA Decoder now is in file LzmaDecodeSize.c. + LzmaDecodeSize.c can provide slightly smaller code than LzmaDecode.c +- Small speed optimization in LZMA C++ code +- filter for SPARC's code was added +- Simplified version of .7z ANSI-C Decoder was included + + +4.06 2004-09-05 +------------------------- +- The bug in v4.05 was fixed: + LZMA-Encoder didn't release output stream in some cases. + + +4.05 2004-08-25 +------------------------- +- Source code of filters for x86, IA-64, ARM, ARM-Thumb + and PowerPC code was included to SDK +- Some internal minor changes + + +4.04 2004-07-28 +------------------------- +- More compatibility with some C++ compilers + + +4.03 2004-06-18 +------------------------- +- "Benchmark" command was added. It measures compressing + and decompressing speed and shows rating values. + Also it checks hardware errors. + + +4.02 2004-06-10 +------------------------- +- C++ LZMA Encoder/Decoder code now is more portable + and it can be compiled by GCC on Linux. + + +4.01 2004-02-15 +------------------------- +- Some detection of data corruption was enabled. + LzmaDecode.c / RangeDecoderReadByte + ..... + { + rd->ExtraBytes = 1; + return 0xFF; + } + + +4.00 2004-02-13 +------------------------- +- Original version of LZMA SDK + + + +HISTORY of the LZMA +------------------- + 2001-2008: Improvements to LZMA compressing/decompressing code, + keeping compatibility with original LZMA format + 1996-2001: Development of LZMA compression format + + Some milestones: + + 2001-08-30: LZMA compression was added to 7-Zip + 1999-01-02: First version of 7-Zip was released + + +End of document diff --git a/extern/lzma/lzma.txt b/extern/lzma/lzma.txt new file mode 100644 index 00000000000..715792d6c17 --- /dev/null +++ b/extern/lzma/lzma.txt @@ -0,0 +1,594 @@ +LZMA SDK 4.65 +------------- + +LZMA SDK provides the documentation, samples, header files, libraries, +and tools you need to develop applications that use LZMA compression. + +LZMA is default and general compression method of 7z format +in 7-Zip compression program (www.7-zip.org). LZMA provides high +compression ratio and very fast decompression. + +LZMA is an improved version of famous LZ77 compression algorithm. +It was improved in way of maximum increasing of compression ratio, +keeping high decompression speed and low memory requirements for +decompressing. + + + +LICENSE +------- + +LZMA SDK is written and placed in the public domain by Igor Pavlov. + + +LZMA SDK Contents +----------------- + +LZMA SDK includes: + + - ANSI-C/C++/C#/Java source code for LZMA compressing and decompressing + - Compiled file->file LZMA compressing/decompressing program for Windows system + + +UNIX/Linux version +------------------ +To compile C++ version of file->file LZMA encoding, go to directory +C++/7zip/Compress/LZMA_Alone +and call make to recompile it: + make -f makefile.gcc clean all + +In some UNIX/Linux versions you must compile LZMA with static libraries. +To compile with static libraries, you can use +LIB = -lm -static + + +Files +--------------------- +lzma.txt - LZMA SDK description (this file) +7zFormat.txt - 7z Format description +7zC.txt - 7z ANSI-C Decoder description +methods.txt - Compression method IDs for .7z +lzma.exe - Compiled file->file LZMA encoder/decoder for Windows +history.txt - history of the LZMA SDK + + +Source code structure +--------------------- + +C/ - C files + 7zCrc*.* - CRC code + Alloc.* - Memory allocation functions + Bra*.* - Filters for x86, IA-64, ARM, ARM-Thumb, PowerPC and SPARC code + LzFind.* - Match finder for LZ (LZMA) encoders + LzFindMt.* - Match finder for LZ (LZMA) encoders for multithreading encoding + LzHash.h - Additional file for LZ match finder + LzmaDec.* - LZMA decoding + LzmaEnc.* - LZMA encoding + LzmaLib.* - LZMA Library for DLL calling + Types.h - Basic types for another .c files + Threads.* - The code for multithreading. + + LzmaLib - LZMA Library (.DLL for Windows) + + LzmaUtil - LZMA Utility (file->file LZMA encoder/decoder). + + Archive - files related to archiving + 7z - 7z ANSI-C Decoder + +CPP/ -- CPP files + + Common - common files for C++ projects + Windows - common files for Windows related code + + 7zip - files related to 7-Zip Project + + Common - common files for 7-Zip + + Compress - files related to compression/decompression + + Copy - Copy coder + RangeCoder - Range Coder (special code of compression/decompression) + LZMA - LZMA compression/decompression on C++ + LZMA_Alone - file->file LZMA compression/decompression + Branch - Filters for x86, IA-64, ARM, ARM-Thumb, PowerPC and SPARC code + + Archive - files related to archiving + + Common - common files for archive handling + 7z - 7z C++ Encoder/Decoder + + Bundles - Modules that are bundles of other modules + + Alone7z - 7zr.exe: Standalone version of 7z.exe that supports only 7z/LZMA/BCJ/BCJ2 + Format7zR - 7zr.dll: Reduced version of 7za.dll: extracting/compressing to 7z/LZMA/BCJ/BCJ2 + Format7zExtractR - 7zxr.dll: Reduced version of 7zxa.dll: extracting from 7z/LZMA/BCJ/BCJ2. + + UI - User Interface files + + Client7z - Test application for 7za.dll, 7zr.dll, 7zxr.dll + Common - Common UI files + Console - Code for console archiver + + + +CS/ - C# files + 7zip + Common - some common files for 7-Zip + Compress - files related to compression/decompression + LZ - files related to LZ (Lempel-Ziv) compression algorithm + LZMA - LZMA compression/decompression + LzmaAlone - file->file LZMA compression/decompression + RangeCoder - Range Coder (special code of compression/decompression) + +Java/ - Java files + SevenZip + Compression - files related to compression/decompression + LZ - files related to LZ (Lempel-Ziv) compression algorithm + LZMA - LZMA compression/decompression + RangeCoder - Range Coder (special code of compression/decompression) + + +C/C++ source code of LZMA SDK is part of 7-Zip project. +7-Zip source code can be downloaded from 7-Zip's SourceForge page: + + http://sourceforge.net/projects/sevenzip/ + + + +LZMA features +------------- + - Variable dictionary size (up to 1 GB) + - Estimated compressing speed: about 2 MB/s on 2 GHz CPU + - Estimated decompressing speed: + - 20-30 MB/s on 2 GHz Core 2 or AMD Athlon 64 + - 1-2 MB/s on 200 MHz ARM, MIPS, PowerPC or other simple RISC + - Small memory requirements for decompressing (16 KB + DictionarySize) + - Small code size for decompressing: 5-8 KB + +LZMA decoder uses only integer operations and can be +implemented in any modern 32-bit CPU (or on 16-bit CPU with some conditions). + +Some critical operations that affect the speed of LZMA decompression: + 1) 32*16 bit integer multiply + 2) Misspredicted branches (penalty mostly depends from pipeline length) + 3) 32-bit shift and arithmetic operations + +The speed of LZMA decompressing mostly depends from CPU speed. +Memory speed has no big meaning. But if your CPU has small data cache, +overall weight of memory speed will slightly increase. + + +How To Use +---------- + +Using LZMA encoder/decoder executable +-------------------------------------- + +Usage: LZMA inputFile outputFile [...] + + e: encode file + + d: decode file + + b: Benchmark. There are two tests: compressing and decompressing + with LZMA method. Benchmark shows rating in MIPS (million + instructions per second). Rating value is calculated from + measured speed and it is normalized with Intel's Core 2 results. + Also Benchmark checks possible hardware errors (RAM + errors in most cases). Benchmark uses these settings: + (-a1, -d21, -fb32, -mfbt4). You can change only -d parameter. + Also you can change the number of iterations. Example for 30 iterations: + LZMA b 30 + Default number of iterations is 10. + + + + + -a{N}: set compression mode 0 = fast, 1 = normal + default: 1 (normal) + + d{N}: Sets Dictionary size - [0, 30], default: 23 (8MB) + The maximum value for dictionary size is 1 GB = 2^30 bytes. + Dictionary size is calculated as DictionarySize = 2^N bytes. + For decompressing file compressed by LZMA method with dictionary + size D = 2^N you need about D bytes of memory (RAM). + + -fb{N}: set number of fast bytes - [5, 273], default: 128 + Usually big number gives a little bit better compression ratio + and slower compression process. + + -lc{N}: set number of literal context bits - [0, 8], default: 3 + Sometimes lc=4 gives gain for big files. + + -lp{N}: set number of literal pos bits - [0, 4], default: 0 + lp switch is intended for periodical data when period is + equal 2^N. For example, for 32-bit (4 bytes) + periodical data you can use lp=2. Often it's better to set lc0, + if you change lp switch. + + -pb{N}: set number of pos bits - [0, 4], default: 2 + pb switch is intended for periodical data + when period is equal 2^N. + + -mf{MF_ID}: set Match Finder. Default: bt4. + Algorithms from hc* group doesn't provide good compression + ratio, but they often works pretty fast in combination with + fast mode (-a0). + + Memory requirements depend from dictionary size + (parameter "d" in table below). + + MF_ID Memory Description + + bt2 d * 9.5 + 4MB Binary Tree with 2 bytes hashing. + bt3 d * 11.5 + 4MB Binary Tree with 3 bytes hashing. + bt4 d * 11.5 + 4MB Binary Tree with 4 bytes hashing. + hc4 d * 7.5 + 4MB Hash Chain with 4 bytes hashing. + + -eos: write End Of Stream marker. By default LZMA doesn't write + eos marker, since LZMA decoder knows uncompressed size + stored in .lzma file header. + + -si: Read data from stdin (it will write End Of Stream marker). + -so: Write data to stdout + + +Examples: + +1) LZMA e file.bin file.lzma -d16 -lc0 + +compresses file.bin to file.lzma with 64 KB dictionary (2^16=64K) +and 0 literal context bits. -lc0 allows to reduce memory requirements +for decompression. + + +2) LZMA e file.bin file.lzma -lc0 -lp2 + +compresses file.bin to file.lzma with settings suitable +for 32-bit periodical data (for example, ARM or MIPS code). + +3) LZMA d file.lzma file.bin + +decompresses file.lzma to file.bin. + + +Compression ratio hints +----------------------- + +Recommendations +--------------- + +To increase the compression ratio for LZMA compressing it's desirable +to have aligned data (if it's possible) and also it's desirable to locate +data in such order, where code is grouped in one place and data is +grouped in other place (it's better than such mixing: code, data, code, +data, ...). + + +Filters +------- +You can increase the compression ratio for some data types, using +special filters before compressing. For example, it's possible to +increase the compression ratio on 5-10% for code for those CPU ISAs: +x86, IA-64, ARM, ARM-Thumb, PowerPC, SPARC. + +You can find C source code of such filters in C/Bra*.* files + +You can check the compression ratio gain of these filters with such +7-Zip commands (example for ARM code): +No filter: + 7z a a1.7z a.bin -m0=lzma + +With filter for little-endian ARM code: + 7z a a2.7z a.bin -m0=arm -m1=lzma + +It works in such manner: +Compressing = Filter_encoding + LZMA_encoding +Decompressing = LZMA_decoding + Filter_decoding + +Compressing and decompressing speed of such filters is very high, +so it will not increase decompressing time too much. +Moreover, it reduces decompression time for LZMA_decoding, +since compression ratio with filtering is higher. + +These filters convert CALL (calling procedure) instructions +from relative offsets to absolute addresses, so such data becomes more +compressible. + +For some ISAs (for example, for MIPS) it's impossible to get gain from such filter. + + +LZMA compressed file format +--------------------------- +Offset Size Description + 0 1 Special LZMA properties (lc,lp, pb in encoded form) + 1 4 Dictionary size (little endian) + 5 8 Uncompressed size (little endian). -1 means unknown size + 13 Compressed data + + +ANSI-C LZMA Decoder +~~~~~~~~~~~~~~~~~~~ + +Please note that interfaces for ANSI-C code were changed in LZMA SDK 4.58. +If you want to use old interfaces you can download previous version of LZMA SDK +from sourceforge.net site. + +To use ANSI-C LZMA Decoder you need the following files: +1) LzmaDec.h + LzmaDec.c + Types.h +LzmaUtil/LzmaUtil.c is example application that uses these files. + + +Memory requirements for LZMA decoding +------------------------------------- + +Stack usage of LZMA decoding function for local variables is not +larger than 200-400 bytes. + +LZMA Decoder uses dictionary buffer and internal state structure. +Internal state structure consumes + state_size = (4 + (1.5 << (lc + lp))) KB +by default (lc=3, lp=0), state_size = 16 KB. + + +How To decompress data +---------------------- + +LZMA Decoder (ANSI-C version) now supports 2 interfaces: +1) Single-call Decompressing +2) Multi-call State Decompressing (zlib-like interface) + +You must use external allocator: +Example: +void *SzAlloc(void *p, size_t size) { p = p; return malloc(size); } +void SzFree(void *p, void *address) { p = p; free(address); } +ISzAlloc alloc = { SzAlloc, SzFree }; + +You can use p = p; operator to disable compiler warnings. + + +Single-call Decompressing +------------------------- +When to use: RAM->RAM decompressing +Compile files: LzmaDec.h + LzmaDec.c + Types.h +Compile defines: no defines +Memory Requirements: + - Input buffer: compressed size + - Output buffer: uncompressed size + - LZMA Internal Structures: state_size (16 KB for default settings) + +Interface: + int LzmaDecode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, + const Byte *propData, unsigned propSize, ELzmaFinishMode finishMode, + ELzmaStatus *status, ISzAlloc *alloc); + In: + dest - output data + destLen - output data size + src - input data + srcLen - input data size + propData - LZMA properties (5 bytes) + propSize - size of propData buffer (5 bytes) + finishMode - It has meaning only if the decoding reaches output limit (*destLen). + LZMA_FINISH_ANY - Decode just destLen bytes. + LZMA_FINISH_END - Stream must be finished after (*destLen). + You can use LZMA_FINISH_END, when you know that + current output buffer covers last bytes of stream. + alloc - Memory allocator. + + Out: + destLen - processed output size + srcLen - processed input size + + Output: + SZ_OK + status: + LZMA_STATUS_FINISHED_WITH_MARK + LZMA_STATUS_NOT_FINISHED + LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK + SZ_ERROR_DATA - Data error + SZ_ERROR_MEM - Memory allocation error + SZ_ERROR_UNSUPPORTED - Unsupported properties + SZ_ERROR_INPUT_EOF - It needs more bytes in input buffer (src). + + If LZMA decoder sees end_marker before reaching output limit, it returns OK result, + and output value of destLen will be less than output buffer size limit. + + You can use multiple checks to test data integrity after full decompression: + 1) Check Result and "status" variable. + 2) Check that output(destLen) = uncompressedSize, if you know real uncompressedSize. + 3) Check that output(srcLen) = compressedSize, if you know real compressedSize. + You must use correct finish mode in that case. */ + + +Multi-call State Decompressing (zlib-like interface) +---------------------------------------------------- + +When to use: file->file decompressing +Compile files: LzmaDec.h + LzmaDec.c + Types.h + +Memory Requirements: + - Buffer for input stream: any size (for example, 16 KB) + - Buffer for output stream: any size (for example, 16 KB) + - LZMA Internal Structures: state_size (16 KB for default settings) + - LZMA dictionary (dictionary size is encoded in LZMA properties header) + +1) read LZMA properties (5 bytes) and uncompressed size (8 bytes, little-endian) to header: + unsigned char header[LZMA_PROPS_SIZE + 8]; + ReadFile(inFile, header, sizeof(header) + +2) Allocate CLzmaDec structures (state + dictionary) using LZMA properties + + CLzmaDec state; + LzmaDec_Constr(&state); + res = LzmaDec_Allocate(&state, header, LZMA_PROPS_SIZE, &g_Alloc); + if (res != SZ_OK) + return res; + +3) Init LzmaDec structure before any new LZMA stream. And call LzmaDec_DecodeToBuf in loop + + LzmaDec_Init(&state); + for (;;) + { + ... + int res = LzmaDec_DecodeToBuf(CLzmaDec *p, Byte *dest, SizeT *destLen, + const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode); + ... + } + + +4) Free all allocated structures + LzmaDec_Free(&state, &g_Alloc); + +For full code example, look at C/LzmaUtil/LzmaUtil.c code. + + +How To compress data +-------------------- + +Compile files: LzmaEnc.h + LzmaEnc.c + Types.h + +LzFind.c + LzFind.h + LzFindMt.c + LzFindMt.h + LzHash.h + +Memory Requirements: + - (dictSize * 11.5 + 6 MB) + state_size + +Lzma Encoder can use two memory allocators: +1) alloc - for small arrays. +2) allocBig - for big arrays. + +For example, you can use Large RAM Pages (2 MB) in allocBig allocator for +better compression speed. Note that Windows has bad implementation for +Large RAM Pages. +It's OK to use same allocator for alloc and allocBig. + + +Single-call Compression with callbacks +-------------------------------------- + +Check C/LzmaUtil/LzmaUtil.c as example, + +When to use: file->file decompressing + +1) you must implement callback structures for interfaces: +ISeqInStream +ISeqOutStream +ICompressProgress +ISzAlloc + +static void *SzAlloc(void *p, size_t size) { p = p; return MyAlloc(size); } +static void SzFree(void *p, void *address) { p = p; MyFree(address); } +static ISzAlloc g_Alloc = { SzAlloc, SzFree }; + + CFileSeqInStream inStream; + CFileSeqOutStream outStream; + + inStream.funcTable.Read = MyRead; + inStream.file = inFile; + outStream.funcTable.Write = MyWrite; + outStream.file = outFile; + + +2) Create CLzmaEncHandle object; + + CLzmaEncHandle enc; + + enc = LzmaEnc_Create(&g_Alloc); + if (enc == 0) + return SZ_ERROR_MEM; + + +3) initialize CLzmaEncProps properties; + + LzmaEncProps_Init(&props); + + Then you can change some properties in that structure. + +4) Send LZMA properties to LZMA Encoder + + res = LzmaEnc_SetProps(enc, &props); + +5) Write encoded properties to header + + Byte header[LZMA_PROPS_SIZE + 8]; + size_t headerSize = LZMA_PROPS_SIZE; + UInt64 fileSize; + int i; + + res = LzmaEnc_WriteProperties(enc, header, &headerSize); + fileSize = MyGetFileLength(inFile); + for (i = 0; i < 8; i++) + header[headerSize++] = (Byte)(fileSize >> (8 * i)); + MyWriteFileAndCheck(outFile, header, headerSize) + +6) Call encoding function: + res = LzmaEnc_Encode(enc, &outStream.funcTable, &inStream.funcTable, + NULL, &g_Alloc, &g_Alloc); + +7) Destroy LZMA Encoder Object + LzmaEnc_Destroy(enc, &g_Alloc, &g_Alloc); + + +If callback function return some error code, LzmaEnc_Encode also returns that code. + + +Single-call RAM->RAM Compression +-------------------------------- + +Single-call RAM->RAM Compression is similar to Compression with callbacks, +but you provide pointers to buffers instead of pointers to stream callbacks: + +HRes LzmaEncode(Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen, + CLzmaEncProps *props, Byte *propsEncoded, SizeT *propsSize, int writeEndMark, + ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig); + +Return code: + SZ_OK - OK + SZ_ERROR_MEM - Memory allocation error + SZ_ERROR_PARAM - Incorrect paramater + SZ_ERROR_OUTPUT_EOF - output buffer overflow + SZ_ERROR_THREAD - errors in multithreading functions (only for Mt version) + + + +LZMA Defines +------------ + +_LZMA_SIZE_OPT - Enable some optimizations in LZMA Decoder to get smaller executable code. + +_LZMA_PROB32 - It can increase the speed on some 32-bit CPUs, but memory usage for + some structures will be doubled in that case. + +_LZMA_UINT32_IS_ULONG - Define it if int is 16-bit on your compiler and long is 32-bit. + +_LZMA_NO_SYSTEM_SIZE_T - Define it if you don't want to use size_t type. + + +C++ LZMA Encoder/Decoder +~~~~~~~~~~~~~~~~~~~~~~~~ +C++ LZMA code use COM-like interfaces. So if you want to use it, +you can study basics of COM/OLE. +C++ LZMA code is just wrapper over ANSI-C code. + + +C++ Notes +~~~~~~~~~~~~~~~~~~~~~~~~ +If you use some C++ code folders in 7-Zip (for example, C++ code for .7z handling), +you must check that you correctly work with "new" operator. +7-Zip can be compiled with MSVC 6.0 that doesn't throw "exception" from "new" operator. +So 7-Zip uses "CPP\Common\NewHandler.cpp" that redefines "new" operator: +operator new(size_t size) +{ + void *p = ::malloc(size); + if (p == 0) + throw CNewException(); + return p; +} +If you use MSCV that throws exception for "new" operator, you can compile without +"NewHandler.cpp". So standard exception will be used. Actually some code of +7-Zip catches any exception in internal code and converts it to HRESULT code. +So you don't need to catch CNewException, if you call COM interfaces of 7-Zip. + +--- + +http://www.7-zip.org +http://www.7-zip.org/sdk.html +http://www.7-zip.org/support.html diff --git a/extern/lzo/README.blender b/extern/lzo/README.blender index 674f2413034..d91500b7780 100644 --- a/extern/lzo/README.blender +++ b/extern/lzo/README.blender @@ -2,4 +2,4 @@ Project: miniLZO - mini subset of the LZO real-time data compression librar URL: http://www.oberhumer.com/opensource/lzo/ License: GPLv2+ Upstream version: 2.08 -Local modifications: Add #ifdef for Windows ARM64 (MSVC) platforms +Local modifications: None diff --git a/extern/lzo/minilzo/lzodefs.h b/extern/lzo/minilzo/lzodefs.h index feee5cdf3d2..f4ae9487ebe 100644 --- a/extern/lzo/minilzo/lzodefs.h +++ b/extern/lzo/minilzo/lzodefs.h @@ -770,7 +770,7 @@ #elif (LZO_OS_DOS16 || LZO_OS_OS216 || LZO_OS_WIN16) # define LZO_ARCH_I086 1 # define LZO_INFO_ARCH "i086" -#elif defined(__aarch64__) || defined(_M_ARM64) +#elif defined(__aarch64__) # define LZO_ARCH_ARM64 1 # define LZO_INFO_ARCH "arm64" #elif defined(__alpha__) || defined(__alpha) || defined(_M_ALPHA) diff --git a/extern/lzo/minilzo/minilzo.c b/extern/lzo/minilzo/minilzo.c index 86fb4ecd2f2..ab2be5f4fd0 100644 --- a/extern/lzo/minilzo/minilzo.c +++ b/extern/lzo/minilzo/minilzo.c @@ -790,7 +790,7 @@ #elif (LZO_OS_DOS16 || LZO_OS_OS216 || LZO_OS_WIN16) # define LZO_ARCH_I086 1 # define LZO_INFO_ARCH "i086" -#elif defined(__aarch64__) || defined(_M_ARM64) +#elif defined(__aarch64__) # define LZO_ARCH_ARM64 1 # define LZO_INFO_ARCH "arm64" #elif defined(__alpha__) || defined(__alpha) || defined(_M_ALPHA) diff --git a/extern/tinygltf/README.blender b/extern/tinygltf/README.blender index a7cdb3af5bf..3dcd6d15f03 100644 --- a/extern/tinygltf/README.blender +++ b/extern/tinygltf/README.blender @@ -1,5 +1,5 @@ Project: TinyGLTF URL: https://github.com/syoyo/tinygltf License: MIT -Upstream version: 2.8.21, 4bfc1fc1807e +Upstream version: 2.8.3, 84a83d39f55d Local modifications: None diff --git a/extern/tinygltf/tiny_gltf.h b/extern/tinygltf/tiny_gltf.h index 7ef28f41ce5..c935b89df9a 100644 --- a/extern/tinygltf/tiny_gltf.h +++ b/extern/tinygltf/tiny_gltf.h @@ -25,8 +25,32 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. -// Version: - v2.8.10 -// See https://github.com/syoyo/tinygltf/releases for release history. +// Version: +// - v2.8.1 Missed serialization texture sampler name fixed. PR#399. +// - v2.8.0 Add URICallbacks for custom URI handling in Buffer and Image. PR#397. +// - v2.7.0 Change WriteImageDataFunction user callback function signature. PR#393. +// - v2.6.3 Fix GLB file with empty BIN chunk was not handled. PR#382 and PR#383. +// - v2.6.2 Fix out-of-bounds access of accessors. PR#379. +// - v2.6.1 Better GLB validation check when loading. +// - v2.6.0 Support serializing sparse accessor(Thanks to @fynv). +// Disable expanding file path for security(no use of awkward `wordexp` anymore). +// - v2.5.0 Add SetPreserveImageChannels() option to load image data as is. +// - v2.4.3 Fix null object output when material has all default +// parameters. +// - v2.4.2 Decode percent-encoded URI. +// - v2.4.1 Fix some glTF object class does not have `extensions` and/or +// `extras` property. +// - v2.4.0 Experimental RapidJSON and C++14 support(Thanks to @jrkoone). +// - v2.3.1 Set default value of minFilter and magFilter in Sampler to -1. +// - v2.3.0 Modified Material representation according to glTF 2.0 schema +// (and introduced TextureInfo class) +// Change the behavior of `Value::IsNumber`. It return true either the +// value is int or real. +// - v2.2.0 Add loading 16bit PNG support. Add Sparse accessor support(Thanks +// to @Ybalrid) +// - v2.1.0 Add draco compression. +// - v2.0.1 Add comparison feature(Thanks to @Selmar). +// - v2.0.0 glTF 2.0!. // // Tiny glTF loader is using following third party libraries: // @@ -48,12 +72,15 @@ #include #include -// Auto-detect C++14 standard version -#if !defined(TINYGLTF_USE_CPP14) && defined(__cplusplus) && \ - (__cplusplus >= 201402L) +//Auto-detect C++14 standard version +#if !defined(TINYGLTF_USE_CPP14) && defined(__cplusplus) && (__cplusplus >= 201402L) #define TINYGLTF_USE_CPP14 #endif +#ifndef TINYGLTF_USE_CPP14 +#include +#endif + #ifdef __ANDROID__ #ifdef TINYGLTF_ANDROID_LOAD_FROM_ASSETS #include @@ -195,11 +222,6 @@ typedef enum { OBJECT_TYPE } Type; -typedef enum { - Permissive, - Strict -} ParseStrictness; - static inline int32_t GetComponentSizeInBytes(uint32_t componentType) { if (componentType == TINYGLTF_COMPONENT_TYPE_BYTE) { return 1; @@ -262,7 +284,11 @@ class Value { typedef std::vector Array; typedef std::map Object; - Value() = default; + Value() + : type_(NULL_TYPE), + int_value_(0), + real_value_(0.0), + boolean_value_(false) {} explicit Value(bool b) : type_(BOOL_TYPE) { boolean_value_ = b; } explicit Value(int i) : type_(INT_TYPE) { @@ -275,7 +301,6 @@ class Value { } explicit Value(std::string &&s) : type_(STRING_TYPE), string_value_(std::move(s)) {} - explicit Value(const char *s) : type_(STRING_TYPE) { string_value_ = s; } explicit Value(const unsigned char *p, size_t n) : type_(BINARY_TYPE) { binary_value_.resize(n); memcpy(binary_value_.data(), p, n); @@ -521,30 +546,28 @@ typedef std::map ParameterMap; typedef std::map ExtensionMap; struct AnimationChannel { - int sampler{-1}; // required - int target_node{-1}; // optional index of the node to target (alternative + int sampler; // required + int target_node; // optional index of the node to target (alternative // target should be provided by extension) std::string target_path; // required with standard values of ["translation", // "rotation", "scale", "weights"] Value extras; ExtensionMap extensions; - Value target_extras; ExtensionMap target_extensions; // Filled when SetStoreOriginalJSONForExtrasAndExtensions is enabled. std::string extras_json_string; std::string extensions_json_string; - std::string target_extras_json_string; std::string target_extensions_json_string; - AnimationChannel() = default; + AnimationChannel() : sampler(-1), target_node(-1) {} DEFAULT_METHODS(AnimationChannel) bool operator==(const AnimationChannel &) const; }; struct AnimationSampler { - int input{-1}; // required - int output{-1}; // required + int input; // required + int output; // required std::string interpolation; // "LINEAR", "STEP","CUBICSPLINE" or user defined // string. default "LINEAR" Value extras; @@ -554,7 +577,7 @@ struct AnimationSampler { std::string extras_json_string; std::string extensions_json_string; - AnimationSampler() : interpolation("LINEAR") {} + AnimationSampler() : input(-1), output(-1), interpolation("LINEAR") {} DEFAULT_METHODS(AnimationSampler) bool operator==(const AnimationSampler &) const; }; @@ -577,9 +600,9 @@ struct Animation { struct Skin { std::string name; - int inverseBindMatrices{-1}; // required here but not in the spec - int skeleton{-1}; // The index of the node used as a skeleton root - std::vector joints; // Indices of skeleton nodes + int inverseBindMatrices; // required here but not in the spec + int skeleton; // The index of the node used as a skeleton root + std::vector joints; // Indices of skeleton nodes Value extras; ExtensionMap extensions; @@ -588,7 +611,10 @@ struct Skin { std::string extras_json_string; std::string extensions_json_string; - Skin() = default; + Skin() { + inverseBindMatrices = -1; + skeleton = -1; + } DEFAULT_METHODS(Skin) bool operator==(const Skin &) const; }; @@ -619,21 +645,25 @@ struct Sampler { std::string extras_json_string; std::string extensions_json_string; - Sampler() = default; + Sampler() + : minFilter(-1), + magFilter(-1), + wrapS(TINYGLTF_TEXTURE_WRAP_REPEAT), + wrapT(TINYGLTF_TEXTURE_WRAP_REPEAT) {} DEFAULT_METHODS(Sampler) bool operator==(const Sampler &) const; }; struct Image { std::string name; - int width{-1}; - int height{-1}; - int component{-1}; - int bits{-1}; // bit depth per channel. 8(byte), 16 or 32. - int pixel_type{-1}; // pixel type(TINYGLTF_COMPONENT_TYPE_***). usually - // UBYTE(bits = 8) or USHORT(bits = 16) + int width; + int height; + int component; + int bits; // bit depth per channel. 8(byte), 16 or 32. + int pixel_type; // pixel type(TINYGLTF_COMPONENT_TYPE_***). usually + // UBYTE(bits = 8) or USHORT(bits = 16) std::vector image; - int bufferView{-1}; // (required if no uri) + int bufferView; // (required if no uri) std::string mimeType; // (required if no uri) ["image/jpeg", "image/png", // "image/bmp", "image/gif"] std::string uri; // (required if no mimeType) uri is not decoded(e.g. @@ -651,9 +681,16 @@ struct Image { // parsing) Default parser for Image does not provide as-is loading feature at // the moment. (You can manipulate this by providing your own LoadImageData // function) - bool as_is{false}; + bool as_is; - Image() = default; + Image() : as_is(false) { + bufferView = -1; + width = -1; + height = -1; + component = -1; + bits = -1; + pixel_type = -1; + } DEFAULT_METHODS(Image) bool operator==(const Image &) const; @@ -662,8 +699,8 @@ struct Image { struct Texture { std::string name; - int sampler{-1}; - int source{-1}; + int sampler; + int source; Value extras; ExtensionMap extensions; @@ -671,16 +708,16 @@ struct Texture { std::string extras_json_string; std::string extensions_json_string; - Texture() = default; + Texture() : sampler(-1), source(-1) {} DEFAULT_METHODS(Texture) bool operator==(const Texture &) const; }; struct TextureInfo { - int index{-1}; // required. - int texCoord{0}; // The set index of texture's TEXCOORD attribute used for - // texture coordinate mapping. + int index = -1; // required. + int texCoord; // The set index of texture's TEXCOORD attribute used for + // texture coordinate mapping. Value extras; ExtensionMap extensions; @@ -689,18 +726,17 @@ struct TextureInfo { std::string extras_json_string; std::string extensions_json_string; - TextureInfo() = default; + TextureInfo() : index(-1), texCoord(0) {} DEFAULT_METHODS(TextureInfo) bool operator==(const TextureInfo &) const; }; struct NormalTextureInfo { - int index{-1}; // required - int texCoord{0}; // The set index of texture's TEXCOORD attribute used for - // texture coordinate mapping. - double scale{ - 1.0}; // scaledNormal = normalize(( - // * 2.0 - 1.0) * vec3(, , 1.0)) + int index = -1; // required + int texCoord; // The set index of texture's TEXCOORD attribute used for + // texture coordinate mapping. + double scale; // scaledNormal = normalize(( + // * 2.0 - 1.0) * vec3(, , 1.0)) Value extras; ExtensionMap extensions; @@ -709,17 +745,17 @@ struct NormalTextureInfo { std::string extras_json_string; std::string extensions_json_string; - NormalTextureInfo() = default; + NormalTextureInfo() : index(-1), texCoord(0), scale(1.0) {} DEFAULT_METHODS(NormalTextureInfo) bool operator==(const NormalTextureInfo &) const; }; struct OcclusionTextureInfo { - int index{-1}; // required - int texCoord{0}; // The set index of texture's TEXCOORD attribute used for + int index = -1; // required + int texCoord; // The set index of texture's TEXCOORD attribute used for // texture coordinate mapping. - double strength{1.0}; // occludedColor = lerp(color, color * , ) + double strength; // occludedColor = lerp(color, color * , ) Value extras; ExtensionMap extensions; @@ -728,17 +764,17 @@ struct OcclusionTextureInfo { std::string extras_json_string; std::string extensions_json_string; - OcclusionTextureInfo() = default; + OcclusionTextureInfo() : index(-1), texCoord(0), strength(1.0) {} DEFAULT_METHODS(OcclusionTextureInfo) bool operator==(const OcclusionTextureInfo &) const; }; // pbrMetallicRoughness class defined in glTF 2.0 spec. struct PbrMetallicRoughness { - std::vector baseColorFactor{1.0, 1.0, 1.0, 1.0}; // len = 4. default [1,1,1,1] + std::vector baseColorFactor; // len = 4. default [1,1,1,1] TextureInfo baseColorTexture; - double metallicFactor{1.0}; // default 1 - double roughnessFactor{1.0}; // default 1 + double metallicFactor; // default 1 + double roughnessFactor; // default 1 TextureInfo metallicRoughnessTexture; Value extras; @@ -748,9 +784,11 @@ struct PbrMetallicRoughness { std::string extras_json_string; std::string extensions_json_string; - PbrMetallicRoughness() = default; + PbrMetallicRoughness() + : baseColorFactor(std::vector{1.0, 1.0, 1.0, 1.0}), + metallicFactor(1.0), + roughnessFactor(1.0) {} DEFAULT_METHODS(PbrMetallicRoughness) - bool operator==(const PbrMetallicRoughness &) const; }; @@ -760,11 +798,10 @@ struct PbrMetallicRoughness { struct Material { std::string name; - std::vector emissiveFactor{0.0, 0.0, 0.0}; // length 3. default [0, 0, 0] - std::string alphaMode{"OPAQUE"}; // default "OPAQUE" - double alphaCutoff{0.5}; // default 0.5 - bool doubleSided{false}; // default false - std::vector lods; // level of detail materials (MSFT_lod) + std::vector emissiveFactor; // length 3. default [0, 0, 0] + std::string alphaMode; // default "OPAQUE" + double alphaCutoff; // default 0.5 + bool doubleSided; // default false; PbrMetallicRoughness pbrMetallicRoughness; @@ -784,7 +821,7 @@ struct Material { std::string extras_json_string; std::string extensions_json_string; - Material() = default; + Material() : alphaMode("OPAQUE"), alphaCutoff(0.5), doubleSided(false) {} DEFAULT_METHODS(Material) bool operator==(const Material &) const; @@ -808,20 +845,26 @@ struct BufferView { bool dracoDecoded{false}; // Flag indicating this has been draco decoded - BufferView() = default; + BufferView() + : buffer(-1), + byteOffset(0), + byteLength(0), + byteStride(0), + target(0), + dracoDecoded(false) {} DEFAULT_METHODS(BufferView) bool operator==(const BufferView &) const; }; struct Accessor { - int bufferView{-1}; // optional in spec but required here since sparse - // accessor are not supported + int bufferView; // optional in spec but required here since sparse accessor + // are not supported std::string name; - size_t byteOffset{0}; - bool normalized{false}; // optional. - int componentType{-1}; // (required) One of TINYGLTF_COMPONENT_TYPE_*** - size_t count{0}; // required - int type{-1}; // (required) One of TINYGLTF_TYPE_*** .. + size_t byteOffset; + bool normalized; // optional. + int componentType; // (required) One of TINYGLTF_COMPONENT_TYPE_*** + size_t count; // required + int type; // (required) One of TINYGLTF_TYPE_*** .. Value extras; ExtensionMap extensions; @@ -834,33 +877,19 @@ struct Accessor { std::vector maxValues; // optional. integer value is promoted to double - struct Sparse { + struct { int count; bool isSparse; struct { - size_t byteOffset; + int byteOffset; int bufferView; int componentType; // a TINYGLTF_COMPONENT_TYPE_ value - Value extras; - ExtensionMap extensions; - std::string extras_json_string; - std::string extensions_json_string; } indices; struct { int bufferView; - size_t byteOffset; - Value extras; - ExtensionMap extensions; - std::string extras_json_string; - std::string extensions_json_string; + int byteOffset; } values; - Value extras; - ExtensionMap extensions; - std::string extras_json_string; - std::string extensions_json_string; - }; - - Sparse sparse; + } sparse; /// /// Utility function to compute byteStride for a given bufferView object. @@ -882,8 +911,8 @@ struct Accessor { return componentSizeInBytes * numComponents; } else { - // Check if byteStride is a multiple of the size of the accessor's - // component type. + // Check if byteStride is a multiple of the size of the accessor's component + // type. int componentSizeInBytes = GetComponentSizeInBytes(static_cast(componentType)); if (componentSizeInBytes <= 0) { @@ -900,8 +929,12 @@ struct Accessor { } Accessor() - - { + : bufferView(-1), + byteOffset(0), + normalized(false), + componentType(-1), + count(0), + type(-1) { sparse.isSparse = false; } DEFAULT_METHODS(Accessor) @@ -909,12 +942,17 @@ struct Accessor { }; struct PerspectiveCamera { - double aspectRatio{0.0}; // min > 0 - double yfov{0.0}; // required. min > 0 - double zfar{0.0}; // min > 0 - double znear{0.0}; // required. min > 0 + double aspectRatio; // min > 0 + double yfov; // required. min > 0 + double zfar; // min > 0 + double znear; // required. min > 0 - PerspectiveCamera() = default; + PerspectiveCamera() + : aspectRatio(0.0), + yfov(0.0), + zfar(0.0) // 0 = use infinite projection matrix + , + znear(0.0) {} DEFAULT_METHODS(PerspectiveCamera) bool operator==(const PerspectiveCamera &) const; @@ -927,12 +965,12 @@ struct PerspectiveCamera { }; struct OrthographicCamera { - double xmag{0.0}; // required. must not be zero. - double ymag{0.0}; // required. must not be zero. - double zfar{0.0}; // required. `zfar` must be greater than `znear`. - double znear{0.0}; // required + double xmag; // required. must not be zero. + double ymag; // required. must not be zero. + double zfar; // required. `zfar` must be greater than `znear`. + double znear; // required - OrthographicCamera() = default; + OrthographicCamera() : xmag(0.0), ymag(0.0), zfar(0.0), znear(0.0) {} DEFAULT_METHODS(OrthographicCamera) bool operator==(const OrthographicCamera &) const; @@ -951,7 +989,7 @@ struct Camera { PerspectiveCamera perspective; OrthographicCamera orthographic; - Camera() = default; + Camera() {} DEFAULT_METHODS(Camera) bool operator==(const Camera &) const; @@ -968,10 +1006,10 @@ struct Primitive { // integer, where each integer // is the index of the accessor // containing an attribute. - int material{-1}; // The index of the material to apply to this primitive - // when rendering. - int indices{-1}; // The index of the accessor that contains the indices. - int mode{-1}; // one of TINYGLTF_MODE_*** + int material; // The index of the material to apply to this primitive + // when rendering. + int indices; // The index of the accessor that contains the indices. + int mode; // one of TINYGLTF_MODE_*** std::vector > targets; // array of morph targets, // where each target is a dict with attributes in ["POSITION, "NORMAL", // "TANGENT"] pointing @@ -983,7 +1021,11 @@ struct Primitive { std::string extras_json_string; std::string extensions_json_string; - Primitive() = default; + Primitive() { + material = -1; + indices = -1; + mode = -1; + } DEFAULT_METHODS(Primitive) bool operator==(const Primitive &) const; }; @@ -1006,20 +1048,17 @@ struct Mesh { class Node { public: - Node() = default; + Node() : camera(-1), skin(-1), mesh(-1) {} DEFAULT_METHODS(Node) bool operator==(const Node &) const; - int camera{-1}; // the index of the camera referenced by this node + int camera; // the index of the camera referenced by this node std::string name; - int skin{-1}; - int mesh{-1}; - int light{-1}; // light source index (KHR_lights_punctual) - int emitter{-1}; // audio emitter index (KHR_audio) - std::vector lods; // level of detail nodes (MSFT_lod) + int skin; + int mesh; std::vector children; std::vector rotation; // length must be 0 or 4 std::vector scale; // length must be 0 or 3 @@ -1073,7 +1112,6 @@ struct Asset { struct Scene { std::string name; std::vector nodes; - std::vector audioEmitters; // KHR_audio global emitters ExtensionMap extensions; Value extras; @@ -1088,10 +1126,10 @@ struct Scene { }; struct SpotLight { - double innerConeAngle{0.0}; - double outerConeAngle{0.7853981634}; + double innerConeAngle; + double outerConeAngle; - SpotLight() = default; + SpotLight() : innerConeAngle(0.0), outerConeAngle(0.7853981634) {} DEFAULT_METHODS(SpotLight) bool operator==(const SpotLight &) const; @@ -1111,7 +1149,7 @@ struct Light { double range{0.0}; // 0.0 = infinite SpotLight spot; - Light() = default; + Light() : intensity(1.0), range(0.0) {} DEFAULT_METHODS(Light) bool operator==(const Light &) const; @@ -1124,89 +1162,6 @@ struct Light { std::string extensions_json_string; }; -struct PositionalEmitter { - double coneInnerAngle{6.283185307179586}; - double coneOuterAngle{6.283185307179586}; - double coneOuterGain{0.0}; - double maxDistance{100.0}; - double refDistance{1.0}; - double rolloffFactor{1.0}; - - PositionalEmitter() = default; - DEFAULT_METHODS(PositionalEmitter) - bool operator==(const PositionalEmitter &) const; - - ExtensionMap extensions; - Value extras; - - // Filled when SetStoreOriginalJSONForExtrasAndExtensions is enabled. - std::string extras_json_string; - std::string extensions_json_string; -}; - -struct AudioEmitter { - std::string name; - double gain{1.0}; - bool loop{false}; - bool playing{false}; - std::string - type; // positional - Positional audio emitters. Using sound cones, the - // orientation is +Z having the same front side for a glTF asset. - // global - Global audio emitters are not affected by the position - // of audio listeners. coneInnerAngle, coneOuterAngle, - // coneOuterGain, distanceModel, maxDistance, refDistance, and - // rolloffFactor should all be ignored when set. - std::string - distanceModel; // linear - A linear distance model calculating the - // gain induced by the distance according to: 1.0 - // - rolloffFactor * (distance - refDistance) / - // (maxDistance - refDistance) - // inverse - (default) An inverse distance model - // calculating the gain induced by the distance according - // to: refDistance / (refDistance + rolloffFactor * - // (Math.max(distance, refDistance) - refDistance)) - // exponential - An exponential distance model calculating - // the gain induced by the distance according to: - // pow((Math.max(distance, refDistance) / refDistance, - // -rolloffFactor)) - PositionalEmitter positional; - int source{-1}; - - AudioEmitter() : type("global"), distanceModel("inverse") {} - DEFAULT_METHODS(AudioEmitter) - - bool operator==(const AudioEmitter &) const; - - ExtensionMap extensions; - Value extras; - - // Filled when SetStoreOriginalJSONForExtrasAndExtensions is enabled. - std::string extras_json_string; - std::string extensions_json_string; -}; - -struct AudioSource { - std::string name; - std::string uri; - int bufferView{-1}; // (required if no uri) - std::string - mimeType; // (required if no uri) The audio's MIME type. Required if - // bufferView is defined. Unless specified by another - // extension, the only supported mimeType is audio/mpeg. - - AudioSource() = default; - DEFAULT_METHODS(AudioSource) - - bool operator==(const AudioSource &) const; - - Value extras; - ExtensionMap extensions; - - // Filled when SetStoreOriginalJSONForExtrasAndExtensions is enabled. - std::string extras_json_string; - std::string extensions_json_string; -}; - class Model { public: Model() = default; @@ -1228,10 +1183,8 @@ class Model { std::vector cameras; std::vector scenes; std::vector lights; - std::vector audioEmitters; - std::vector audioSources; - int defaultScene{-1}; + int defaultScene = -1; std::vector extensionsUsed; std::vector extensionsRequired; @@ -1348,13 +1301,6 @@ typedef bool (*WriteWholeFileFunction)(std::string *, const std::string &, const std::vector &, void *); -/// -/// GetFileSizeFunction type. Signature for custom filesystem callbacks. -/// -typedef bool (*GetFileSizeFunction)(size_t *filesize_out, std::string *err, - const std::string &abs_filename, - void *userdata); - /// /// A structure containing all required filesystem callbacks and a pointer to /// their user data. @@ -1364,8 +1310,6 @@ struct FsCallbacks { ExpandFilePathFunction ExpandFilePath; ReadWholeFileFunction ReadWholeFile; WriteWholeFileFunction WriteWholeFile; - GetFileSizeFunction GetFileSizeInBytes; // To avoid GetFileSize Win32 API, - // add `InBytes` suffix. void *user_data; // An argument that is passed to all fs callbacks }; @@ -1389,9 +1333,6 @@ bool ReadWholeFile(std::vector *out, std::string *err, bool WriteWholeFile(std::string *err, const std::string &filepath, const std::vector &contents, void *); - -bool GetFileSizeInBytes(size_t *filesize_out, std::string *err, - const std::string &filepath, void *); #endif /// @@ -1404,13 +1345,13 @@ class TinyGLTF { #pragma clang diagnostic ignored "-Wc++98-compat" #endif - TinyGLTF() = default; + TinyGLTF() : bin_data_(nullptr), bin_size_(0), is_binary_(false) {} #ifdef __clang__ #pragma clang diagnostic pop #endif - ~TinyGLTF() = default; + ~TinyGLTF() {} /// /// Loads glTF ASCII asset from a file. @@ -1470,11 +1411,6 @@ class TinyGLTF { bool embedImages, bool embedBuffers, bool prettyPrint, bool writeBinary); - /// - /// Sets the parsing strictness. - /// - void SetParseStrictness(ParseStrictness strictness); - /// /// Set callback to use for loading image data /// @@ -1536,17 +1472,6 @@ class TinyGLTF { preserve_image_channels_ = onoff; } - /// - /// Set maximum allowed external file size in bytes. - /// Default: 2GB - /// Only effective for built-in ReadWholeFileFunction FS function. - /// - void SetMaxExternalFileSize(size_t max_bytes) { - max_external_file_size_ = max_bytes; - } - - size_t GetMaxExternalFileSize() const { return max_external_file_size_; } - bool GetPreserveImageChannels() const { return preserve_image_channels_; } private: @@ -1564,8 +1489,6 @@ class TinyGLTF { size_t bin_size_ = 0; bool is_binary_ = false; - ParseStrictness strictness_ = ParseStrictness::Strict; - bool serialize_default_values_ = false; ///< Serialize default values? bool store_original_json_for_extras_and_extensions_ = false; @@ -1573,24 +1496,18 @@ class TinyGLTF { bool preserve_image_channels_ = false; /// Default false(expand channels to /// RGBA) for backward compatibility. - size_t max_external_file_size_{ - size_t((std::numeric_limits::max)())}; // Default 2GB - // Warning & error messages std::string warn_; std::string err_; FsCallbacks fs = { #ifndef TINYGLTF_NO_FS - &tinygltf::FileExists, - &tinygltf::ExpandFilePath, - &tinygltf::ReadWholeFile, - &tinygltf::WriteWholeFile, - &tinygltf::GetFileSizeInBytes, + &tinygltf::FileExists, &tinygltf::ExpandFilePath, + &tinygltf::ReadWholeFile, &tinygltf::WriteWholeFile, nullptr // Fs callback user data #else - nullptr, nullptr, nullptr, nullptr, nullptr, + nullptr, nullptr, nullptr, nullptr, nullptr // Fs callback user data #endif @@ -1633,10 +1550,8 @@ class TinyGLTF { #if defined(TINYGLTF_IMPLEMENTATION) || defined(__INTELLISENSE__) #include -// #include +//#include #ifndef TINYGLTF_NO_FS -#include // for is_directory check - #include #include #endif @@ -1779,7 +1694,7 @@ class TinyGLTF { #endif #elif !defined(__ANDROID__) && !defined(__OpenBSD__) -// #include +//#include #endif #if defined(__sparcv9) || defined(__powerpc__) @@ -1799,7 +1714,6 @@ namespace detail { // documents may be active at once. using json = rapidjson::GenericValue, rapidjson::CrtAllocator>; -using json_iterator = json::MemberIterator; using json_const_iterator = json::ConstMemberIterator; using json_const_array_iterator = json const *; using JsonDocument = @@ -1811,7 +1725,6 @@ rapidjson::CrtAllocator &GetAllocator() { return s_CrtAllocator; } // not thread safe. Only a single JsonDocument may be active at any one time, // meaning only a single gltf load/save can be active any one time. using json = rapidjson::Value; -using json_iterator = json::MemberIterator; using json_const_iterator = json::ConstMemberIterator; using json_const_array_iterator = json const *; rapidjson::Document *s_pActiveDocument = nullptr; @@ -1858,7 +1771,6 @@ struct JsonDocument : public rapidjson::Document { #else using nlohmann::json; -using json_iterator = json::iterator; using json_const_iterator = json::const_iterator; using json_const_array_iterator = json_const_iterator; using JsonDocument = json; @@ -1873,8 +1785,8 @@ void JsonParse(JsonDocument &doc, const char *str, size_t length, doc = detail::json::parse(str, str + length, nullptr, throwExc); #endif } -} // namespace detail -} // namespace tinygltf +} // namespace +} #ifdef __APPLE__ #include "TargetConditionals.h" @@ -2017,17 +1929,6 @@ bool Light::operator==(const Light &other) const { return Equals(this->color, other.color) && this->name == other.name && this->type == other.type; } -bool AudioEmitter::operator==(const AudioEmitter &other) const { - return this->name == other.name && - TINYGLTF_DOUBLE_EQUAL(this->gain, other.gain) && - this->loop == other.loop && this->playing == other.playing && - this->type == other.type && - this->distanceModel == other.distanceModel && - this->source == other.source; -} -bool AudioSource::operator==(const AudioSource &other) const { - return this->name == other.name && this->uri == other.uri; -} bool Material::operator==(const Material &other) const { return (this->pbrMetallicRoughness == other.pbrMetallicRoughness) && (this->normalTexture == other.normalTexture) && @@ -2067,7 +1968,6 @@ bool Node::operator==(const Node &other) const { return this->camera == other.camera && this->children == other.children && this->extensions == other.extensions && this->extras == other.extras && Equals(this->matrix, other.matrix) && this->mesh == other.mesh && - (this->light == other.light) && (this->emitter == other.emitter) && this->name == other.name && Equals(this->rotation, other.rotation) && Equals(this->scale, other.scale) && this->skin == other.skin && Equals(this->translation, other.translation) && @@ -2078,15 +1978,6 @@ bool SpotLight::operator==(const SpotLight &other) const { TINYGLTF_DOUBLE_EQUAL(this->innerConeAngle, other.innerConeAngle) && TINYGLTF_DOUBLE_EQUAL(this->outerConeAngle, other.outerConeAngle); } -bool PositionalEmitter::operator==(const PositionalEmitter &other) const { - return this->extensions == other.extensions && this->extras == other.extras && - TINYGLTF_DOUBLE_EQUAL(this->coneInnerAngle, other.coneInnerAngle) && - TINYGLTF_DOUBLE_EQUAL(this->coneOuterAngle, other.coneOuterAngle) && - TINYGLTF_DOUBLE_EQUAL(this->coneOuterGain, other.coneOuterGain) && - TINYGLTF_DOUBLE_EQUAL(this->maxDistance, other.maxDistance) && - TINYGLTF_DOUBLE_EQUAL(this->refDistance, other.refDistance) && - TINYGLTF_DOUBLE_EQUAL(this->rolloffFactor, other.rolloffFactor); -} bool OrthographicCamera::operator==(const OrthographicCamera &other) const { return this->extensions == other.extensions && this->extras == other.extras && TINYGLTF_DOUBLE_EQUAL(this->xmag, other.xmag) && @@ -2216,20 +2107,9 @@ static std::string FindFile(const std::vector &paths, return std::string(); } - // https://github.com/syoyo/tinygltf/issues/416 - // Use strlen() since std::string's size/length reports the number of elements - // in the buffer, not the length of string(null-terminated) strip - // null-character in the middle of string. - size_t slength = strlen(filepath.c_str()); - if (slength == 0) { - return std::string(); - } - - std::string cleaned_filepath = std::string(filepath.c_str()); - for (size_t i = 0; i < paths.size(); i++) { std::string absPath = - fs->ExpandFilePath(JoinPath(paths[i], cleaned_filepath), fs->user_data); + fs->ExpandFilePath(JoinPath(paths[i], filepath), fs->user_data); if (fs->FileExists(absPath, fs->user_data)) { return absPath; } @@ -2475,8 +2355,7 @@ bool URIDecode(const std::string &in_uri, std::string *out_uri, static bool LoadExternalFile(std::vector *out, std::string *err, std::string *warn, const std::string &filename, const std::string &basedir, bool required, - size_t reqBytes, bool checkSize, - size_t maxFileSize, FsCallbacks *fs) { + size_t reqBytes, bool checkSize, FsCallbacks *fs) { if (fs == nullptr || fs->FileExists == nullptr || fs->ExpandFilePath == nullptr || fs->ReadWholeFile == nullptr) { // This is a developer error, assert() ? @@ -2502,32 +2381,6 @@ static bool LoadExternalFile(std::vector *out, std::string *err, return false; } - // Check file size - if (fs->GetFileSizeInBytes) { - size_t file_size{0}; - std::string _err; - bool ok = - fs->GetFileSizeInBytes(&file_size, &_err, filepath, fs->user_data); - if (!ok) { - if (_err.size()) { - if (failMsgOut) { - (*failMsgOut) += "Getting file size failed : " + filename + - ", err = " + _err + "\n"; - } - } - return false; - } - - if (file_size > maxFileSize) { - if (failMsgOut) { - (*failMsgOut) += "File size " + std::to_string(file_size) + - " exceeds maximum allowed file size " + - std::to_string(maxFileSize) + " : " + filepath + "\n"; - } - return false; - } - } - std::vector buf; std::string fileReadErr; bool fileRead = @@ -2567,10 +2420,6 @@ static bool LoadExternalFile(std::vector *out, std::string *err, return true; } -void TinyGLTF::SetParseStrictness(ParseStrictness strictness) { - strictness_ = strictness; -} - void TinyGLTF::SetImageLoader(LoadImageDataFunction func, void *user_data) { LoadImageData = func; load_image_user_data_ = user_data; @@ -2757,8 +2606,8 @@ bool WriteImageData(const std::string *basepath, const std::string *filename, if (embedImages) { // Embed base64-encoded image into URI if (data.size()) { - *out_uri = header + base64_encode(&data[0], - static_cast(data.size())); + *out_uri = header + + base64_encode(&data[0], static_cast(data.size())); } else { // Throw error? } @@ -2837,29 +2686,13 @@ bool FileExists(const std::string &abs_filename, void *) { } #else #ifdef _WIN32 -#if defined(_MSC_VER) || defined(_LIBCPP_VERSION) - - // First check if a file is a directory. - DWORD result = GetFileAttributesW(UTF8ToWchar(abs_filename).c_str()); - if (result == INVALID_FILE_ATTRIBUTES) { - return false; - } - if (result & FILE_ATTRIBUTE_DIRECTORY) { - return false; - } - +#if defined(_MSC_VER) || defined(__GLIBCXX__) || defined(_LIBCPP_VERSION) FILE *fp = nullptr; errno_t err = _wfopen_s(&fp, UTF8ToWchar(abs_filename).c_str(), L"rb"); if (err != 0) { return false; } -#elif defined(__GLIBCXX__) - FILE *fp = fopen(abs_filename.c_str(), "rb"); - if (!fp) { - return false; - } #else - // TODO: is_directory check FILE *fp = nullptr; errno_t err = fopen_s(&fp, abs_filename.c_str(), "rb"); if (err != 0) { @@ -2868,14 +2701,6 @@ bool FileExists(const std::string &abs_filename, void *) { #endif #else - struct stat sb; - if (stat(abs_filename.c_str(), &sb)) { - return false; - } - if (S_ISDIR(sb.st_mode)) { - return false; - } - FILE *fp = fopen(abs_filename.c_str(), "rb"); #endif if (fp) { @@ -2952,102 +2777,6 @@ std::string ExpandFilePath(const std::string &filepath, void *) { #endif } -bool GetFileSizeInBytes(size_t *filesize_out, std::string *err, - const std::string &filepath, void *userdata) { - (void)userdata; - -#ifdef TINYGLTF_ANDROID_LOAD_FROM_ASSETS - if (asset_manager) { - AAsset *asset = AAssetManager_open(asset_manager, filepath.c_str(), - AASSET_MODE_STREAMING); - if (!asset) { - if (err) { - (*err) += "File open error : " + filepath + "\n"; - } - return false; - } - size_t size = AAsset_getLength(asset); - - if (size == 0) { - if (err) { - (*err) += "Invalid file size : " + filepath + - " (does the path point to a directory?)"; - } - return false; - } - - return true; - } else { - if (err) { - (*err) += "No asset manager specified : " + filepath + "\n"; - } - return false; - } -#else -#ifdef _WIN32 -#if defined(__GLIBCXX__) // mingw - int file_descriptor = - _wopen(UTF8ToWchar(filepath).c_str(), _O_RDONLY | _O_BINARY); - __gnu_cxx::stdio_filebuf wfile_buf(file_descriptor, std::ios_base::in); - std::istream f(&wfile_buf); -#elif defined(_MSC_VER) || defined(_LIBCPP_VERSION) - // For libcxx, assume _LIBCPP_HAS_OPEN_WITH_WCHAR is defined to accept - // `wchar_t *` - std::ifstream f(UTF8ToWchar(filepath).c_str(), std::ifstream::binary); -#else - // Unknown compiler/runtime - std::ifstream f(filepath.c_str(), std::ifstream::binary); -#endif -#else - std::ifstream f(filepath.c_str(), std::ifstream::binary); -#endif - if (!f) { - if (err) { - (*err) += "File open error : " + filepath + "\n"; - } - return false; - } - - // For directory(and pipe?), peek() will fail(Posix gnustl/libc++ only) - f.peek(); - if (!f) { - if (err) { - (*err) += - "File read error. Maybe empty file or invalid file : " + filepath + - "\n"; - } - return false; - } - - f.seekg(0, f.end); - size_t sz = static_cast(f.tellg()); - - // std::cout << "sz = " << sz << "\n"; - f.seekg(0, f.beg); - - if (int64_t(sz) < 0) { - if (err) { - (*err) += "Invalid file size : " + filepath + - " (does the path point to a directory?)"; - } - return false; - } else if (sz == 0) { - if (err) { - (*err) += "File is empty : " + filepath + "\n"; - } - return false; - } else if (sz >= (std::numeric_limits::max)()) { - if (err) { - (*err) += "Invalid file size : " + filepath + "\n"; - } - return false; - } - - (*filesize_out) = sz; - return true; -#endif -} - bool ReadWholeFile(std::vector *out, std::string *err, const std::string &filepath, void *) { #ifdef TINYGLTF_ANDROID_LOAD_FROM_ASSETS @@ -3103,21 +2832,8 @@ bool ReadWholeFile(std::vector *out, std::string *err, return false; } - // For directory(and pipe?), peek() will fail(Posix gnustl/libc++ only) - f.peek(); - if (!f) { - if (err) { - (*err) += - "File read error. Maybe empty file or invalid file : " + filepath + - "\n"; - } - return false; - } - f.seekg(0, f.end); size_t sz = static_cast(f.tellg()); - - // std::cout << "sz = " << sz << "\n"; f.seekg(0, f.beg); if (int64_t(sz) < 0) { @@ -3131,11 +2847,6 @@ bool ReadWholeFile(std::vector *out, std::string *err, (*err) += "File is empty : " + filepath + "\n"; } return false; - } else if (sz >= (std::numeric_limits::max)()) { - if (err) { - (*err) += "Invalid file size : " + filepath + "\n"; - } - return false; } out->resize(sz); @@ -3496,8 +3207,7 @@ std::string GetKey(detail::json_const_iterator &it) { #endif } -bool FindMember(const detail::json &o, const char *member, - detail::json_const_iterator &it) { +bool FindMember(const detail::json &o, const char *member, detail::json_const_iterator &it) { #ifdef TINYGLTF_USE_RAPIDJSON if (!o.IsObject()) { return false; @@ -3510,36 +3220,6 @@ bool FindMember(const detail::json &o, const char *member, #endif } -bool FindMember(detail::json &o, const char *member, - detail::json_iterator &it) { -#ifdef TINYGLTF_USE_RAPIDJSON - if (!o.IsObject()) { - return false; - } - it = o.FindMember(member); - return it != o.MemberEnd(); -#else - it = o.find(member); - return it != o.end(); -#endif -} - -void Erase(detail::json &o, detail::json_iterator &it) { -#ifdef TINYGLTF_USE_RAPIDJSON - o.EraseMember(it); -#else - o.erase(it); -#endif -} - -bool IsEmpty(const detail::json &o) { -#ifdef TINYGLTF_USE_RAPIDJSON - return o.ObjectEmpty(); -#else - return o.empty(); -#endif -} - const detail::json &GetValue(detail::json_const_iterator &it) { #ifdef TINYGLTF_USE_RAPIDJSON return it->value; @@ -3548,14 +3228,6 @@ const detail::json &GetValue(detail::json_const_iterator &it) { #endif } -detail::json &GetValue(detail::json_iterator &it) { -#ifdef TINYGLTF_USE_RAPIDJSON - return it->value; -#else - return it.value(); -#endif -} - std::string JsonToString(const detail::json &o, int spacing = -1) { #ifdef TINYGLTF_USE_RAPIDJSON using namespace rapidjson; @@ -3580,7 +3252,7 @@ std::string JsonToString(const detail::json &o, int spacing = -1) { #endif } -} // namespace detail +} // namespace static bool ParseJsonAsValue(Value *ret, const detail::json &o) { Value val{}; @@ -3689,8 +3361,7 @@ static bool ParseExtrasProperty(Value *ret, const detail::json &o) { return ParseJsonAsValue(ret, detail::GetValue(it)); } -static bool ParseBooleanProperty(bool *ret, std::string *err, - const detail::json &o, +static bool ParseBooleanProperty(bool *ret, std::string *err, const detail::json &o, const std::string &property, const bool required, const std::string &parent_node = "") { @@ -3739,8 +3410,7 @@ static bool ParseBooleanProperty(bool *ret, std::string *err, return true; } -static bool ParseIntegerProperty(int *ret, std::string *err, - const detail::json &o, +static bool ParseIntegerProperty(int *ret, std::string *err, const detail::json &o, const std::string &property, const bool required, const std::string &parent_node = "") { @@ -3776,8 +3446,7 @@ static bool ParseIntegerProperty(int *ret, std::string *err, return true; } -static bool ParseUnsignedProperty(size_t *ret, std::string *err, - const detail::json &o, +static bool ParseUnsignedProperty(size_t *ret, std::string *err, const detail::json &o, const std::string &property, const bool required, const std::string &parent_node = "") { @@ -3830,8 +3499,7 @@ static bool ParseUnsignedProperty(size_t *ret, std::string *err, return true; } -static bool ParseNumberProperty(double *ret, std::string *err, - const detail::json &o, +static bool ParseNumberProperty(double *ret, std::string *err, const detail::json &o, const std::string &property, const bool required, const std::string &parent_node = "") { @@ -3870,8 +3538,8 @@ static bool ParseNumberProperty(double *ret, std::string *err, } static bool ParseNumberArrayProperty(std::vector *ret, std::string *err, - const detail::json &o, - const std::string &property, bool required, + const detail::json &o, const std::string &property, + bool required, const std::string &parent_node = "") { detail::json_const_iterator it; if (!detail::FindMember(o, property.c_str(), it)) { @@ -4106,8 +3774,8 @@ static bool ParseJSONProperty(std::map *ret, } static bool ParseParameterProperty(Parameter *param, std::string *err, - const detail::json &o, - const std::string &prop, bool required) { + const detail::json &o, const std::string &prop, + bool required) { // A parameter value can either be a string or an array of either a boolean or // a number. Booleans of any kind aren't supported here. Granted, it // complicates the Parameter structure and breaks it semantically in the sense @@ -4152,8 +3820,7 @@ static bool ParseExtensionsProperty(ExtensionMap *ret, std::string *err, return false; } ExtensionMap extensions; - detail::json_const_iterator extIt = - detail::ObjectBegin(obj); // it.value().begin(); + detail::json_const_iterator extIt = detail::ObjectBegin(obj); // it.value().begin(); detail::json_const_iterator extEnd = detail::ObjectEnd(obj); for (; extIt != extEnd; ++extIt) { auto &itObj = detail::GetValue(extIt); @@ -4173,31 +3840,6 @@ static bool ParseExtensionsProperty(ExtensionMap *ret, std::string *err, return true; } -template -static bool ParseExtrasAndExtensions(GltfType *target, std::string *err, - const detail::json &o, - bool store_json_strings) { - ParseExtensionsProperty(&target->extensions, err, o); - ParseExtrasProperty(&target->extras, o); - - if (store_json_strings) { - { - detail::json_const_iterator it; - if (detail::FindMember(o, "extensions", it)) { - target->extensions_json_string = - detail::JsonToString(detail::GetValue(it)); - } - } - { - detail::json_const_iterator it; - if (detail::FindMember(o, "extras", it)) { - target->extras_json_string = detail::JsonToString(detail::GetValue(it)); - } - } - } - return true; -} - static bool ParseAsset(Asset *asset, std::string *err, const detail::json &o, bool store_original_json_for_extras_and_extensions) { ParseStringProperty(&asset->version, err, o, "version", true, "Asset"); @@ -4205,16 +3847,34 @@ static bool ParseAsset(Asset *asset, std::string *err, const detail::json &o, ParseStringProperty(&asset->minVersion, err, o, "minVersion", false, "Asset"); ParseStringProperty(&asset->copyright, err, o, "copyright", false, "Asset"); - ParseExtrasAndExtensions(asset, err, o, - store_original_json_for_extras_and_extensions); + ParseExtensionsProperty(&asset->extensions, err, o); + + // Unity exporter version is added as extra here + ParseExtrasProperty(&(asset->extras), o); + + if (store_original_json_for_extras_and_extensions) { + { + detail::json_const_iterator it; + if (detail::FindMember(o, "extensions", it)) { + asset->extensions_json_string = detail::JsonToString(detail::GetValue(it)); + } + } + { + detail::json_const_iterator it; + if (detail::FindMember(o, "extras", it)) { + asset->extras_json_string = detail::JsonToString(detail::GetValue(it)); + } + } + } + return true; } static bool ParseImage(Image *image, const int image_idx, std::string *err, std::string *warn, const detail::json &o, bool store_original_json_for_extras_and_extensions, - const std::string &basedir, const size_t max_file_size, - FsCallbacks *fs, const URICallbacks *uri_cb, + const std::string &basedir, FsCallbacks *fs, + const URICallbacks *uri_cb, LoadImageDataFunction *LoadImageData = nullptr, void *load_image_user_data = nullptr) { // A glTF image must either reference a bufferView or an image uri @@ -4247,8 +3907,23 @@ static bool ParseImage(Image *image, const int image_idx, std::string *err, return false; } - ParseExtrasAndExtensions(image, err, o, - store_original_json_for_extras_and_extensions); + ParseExtensionsProperty(&image->extensions, err, o); + ParseExtrasProperty(&image->extras, o); + + if (store_original_json_for_extras_and_extensions) { + { + detail::json_const_iterator eit; + if (detail::FindMember(o, "extensions", eit)) { + image->extensions_json_string = detail::JsonToString(detail::GetValue(eit)); + } + } + { + detail::json_const_iterator eit; + if (detail::FindMember(o, "extras", eit)) { + image->extras_json_string = detail::JsonToString(detail::GetValue(eit)); + } + } + } if (hasBufferView) { int bufferView = -1; @@ -4298,8 +3973,8 @@ static bool ParseImage(Image *image, const int image_idx, std::string *err, if (!DecodeDataURI(&img, image->mimeType, uri, 0, false)) { if (err) { (*err) += "Failed to decode 'uri' for image[" + - std::to_string(image_idx) + "] name = \"" + image->name + - "\"\n"; + std::to_string(image_idx) + "] name = [" + image->name + + "]\n"; } return false; } @@ -4314,8 +3989,8 @@ static bool ParseImage(Image *image, const int image_idx, std::string *err, if (!uri_cb->decode(uri, &decoded_uri, uri_cb->user_data)) { if (warn) { (*warn) += "Failed to decode 'uri' for image[" + - std::to_string(image_idx) + "] name = \"" + image->name + - "\"\n"; + std::to_string(image_idx) + "] name = [" + image->name + + "]\n"; } // Image loading failure is not critical to overall gltf loading. @@ -4324,12 +3999,11 @@ static bool ParseImage(Image *image, const int image_idx, std::string *err, if (!LoadExternalFile(&img, err, warn, decoded_uri, basedir, /* required */ false, /* required bytes */ 0, - /* checksize */ false, - /* max file size */ max_file_size, fs)) { + /* checksize */ false, fs)) { if (warn) { (*warn) += "Failed to load external 'uri' for image[" + - std::to_string(image_idx) + "] name = \"" + decoded_uri + - "\"\n"; + std::to_string(image_idx) + "] name = [" + image->name + + "]\n"; } // If the image cannot be loaded, keep uri as image->uri. return true; @@ -4338,8 +4012,8 @@ static bool ParseImage(Image *image, const int image_idx, std::string *err, if (img.empty()) { if (warn) { (*warn) += "Image data is empty for image[" + - std::to_string(image_idx) + "] name = \"" + image->name + - "\" \n"; + std::to_string(image_idx) + "] name = [" + image->name + + "] \n"; } return false; } @@ -4356,8 +4030,7 @@ static bool ParseImage(Image *image, const int image_idx, std::string *err, static_cast(img.size()), load_image_user_data); } -static bool ParseTexture(Texture *texture, std::string *err, - const detail::json &o, +static bool ParseTexture(Texture *texture, std::string *err, const detail::json &o, bool store_original_json_for_extras_and_extensions, const std::string &basedir) { (void)basedir; @@ -4370,8 +4043,23 @@ static bool ParseTexture(Texture *texture, std::string *err, texture->sampler = sampler; texture->source = source; - ParseExtrasAndExtensions(texture, err, o, - store_original_json_for_extras_and_extensions); + ParseExtensionsProperty(&texture->extensions, err, o); + ParseExtrasProperty(&texture->extras, o); + + if (store_original_json_for_extras_and_extensions) { + { + detail::json_const_iterator it; + if (detail::FindMember(o, "extensions", it)) { + texture->extensions_json_string = detail::JsonToString(detail::GetValue(it)); + } + } + { + detail::json_const_iterator it; + if (detail::FindMember(o, "extras", it)) { + texture->extras_json_string = detail::JsonToString(detail::GetValue(it)); + } + } + } ParseStringProperty(&texture->name, err, o, "name", false); @@ -4392,8 +4080,23 @@ static bool ParseTextureInfo( ParseIntegerProperty(&texinfo->texCoord, err, o, "texCoord", false); - ParseExtrasAndExtensions(texinfo, err, o, - store_original_json_for_extras_and_extensions); + ParseExtensionsProperty(&texinfo->extensions, err, o); + ParseExtrasProperty(&texinfo->extras, o); + + if (store_original_json_for_extras_and_extensions) { + { + detail::json_const_iterator it; + if (detail::FindMember(o, "extensions", it)) { + texinfo->extensions_json_string = detail::JsonToString(detail::GetValue(it)); + } + } + { + detail::json_const_iterator it; + if (detail::FindMember(o, "extras", it)) { + texinfo->extras_json_string = detail::JsonToString(detail::GetValue(it)); + } + } + } return true; } @@ -4413,8 +4116,23 @@ static bool ParseNormalTextureInfo( ParseIntegerProperty(&texinfo->texCoord, err, o, "texCoord", false); ParseNumberProperty(&texinfo->scale, err, o, "scale", false); - ParseExtrasAndExtensions(texinfo, err, o, - store_original_json_for_extras_and_extensions); + ParseExtensionsProperty(&texinfo->extensions, err, o); + ParseExtrasProperty(&texinfo->extras, o); + + if (store_original_json_for_extras_and_extensions) { + { + detail::json_const_iterator it; + if (detail::FindMember(o, "extensions", it)) { + texinfo->extensions_json_string = detail::JsonToString(detail::GetValue(it)); + } + } + { + detail::json_const_iterator it; + if (detail::FindMember(o, "extras", it)) { + texinfo->extras_json_string = detail::JsonToString(detail::GetValue(it)); + } + } + } return true; } @@ -4434,8 +4152,23 @@ static bool ParseOcclusionTextureInfo( ParseIntegerProperty(&texinfo->texCoord, err, o, "texCoord", false); ParseNumberProperty(&texinfo->strength, err, o, "strength", false); - ParseExtrasAndExtensions(texinfo, err, o, - store_original_json_for_extras_and_extensions); + ParseExtensionsProperty(&texinfo->extensions, err, o); + ParseExtrasProperty(&texinfo->extras, o); + + if (store_original_json_for_extras_and_extensions) { + { + detail::json_const_iterator it; + if (detail::FindMember(o, "extensions", it)) { + texinfo->extensions_json_string = detail::JsonToString(detail::GetValue(it)); + } + } + { + detail::json_const_iterator it; + if (detail::FindMember(o, "extras", it)) { + texinfo->extras_json_string = detail::JsonToString(detail::GetValue(it)); + } + } + } return true; } @@ -4443,8 +4176,7 @@ static bool ParseOcclusionTextureInfo( static bool ParseBuffer(Buffer *buffer, std::string *err, const detail::json &o, bool store_original_json_for_extras_and_extensions, FsCallbacks *fs, const URICallbacks *uri_cb, - const std::string &basedir, - const size_t max_buffer_size, bool is_binary = false, + const std::string &basedir, bool is_binary = false, const unsigned char *bin_data = nullptr, size_t bin_size = 0) { size_t byteLength; @@ -4496,8 +4228,7 @@ static bool ParseBuffer(Buffer *buffer, std::string *err, const detail::json &o, } if (!LoadExternalFile(&buffer->data, err, /* warn */ nullptr, decoded_uri, basedir, /* required */ true, - byteLength, /* checkSize */ true, - /* max_file_size */ max_buffer_size, fs)) { + byteLength, /* checkSize */ true, fs)) { return false; } } @@ -4506,8 +4237,7 @@ static bool ParseBuffer(Buffer *buffer, std::string *err, const detail::json &o, if ((bin_size == 0) || (bin_data == nullptr)) { if (err) { - (*err) += - "Invalid binary data in `Buffer', or GLB with empty BIN chunk.\n"; + (*err) += "Invalid binary data in `Buffer', or GLB with empty BIN chunk.\n"; } return false; } @@ -4546,8 +4276,7 @@ static bool ParseBuffer(Buffer *buffer, std::string *err, const detail::json &o, } if (!LoadExternalFile(&buffer->data, err, /* warn */ nullptr, decoded_uri, basedir, /* required */ true, byteLength, - /* checkSize */ true, - /* max file size */ max_buffer_size, fs)) { + /* checkSize */ true, fs)) { return false; } } @@ -4555,8 +4284,23 @@ static bool ParseBuffer(Buffer *buffer, std::string *err, const detail::json &o, ParseStringProperty(&buffer->name, err, o, "name", false); - ParseExtrasAndExtensions(buffer, err, o, - store_original_json_for_extras_and_extensions); + ParseExtensionsProperty(&buffer->extensions, err, o); + ParseExtrasProperty(&buffer->extras, o); + + if (store_original_json_for_extras_and_extensions) { + { + detail::json_const_iterator it; + if (detail::FindMember(o, "extensions", it)) { + buffer->extensions_json_string = detail::JsonToString(detail::GetValue(it)); + } + } + { + detail::json_const_iterator it; + if (detail::FindMember(o, "extras", it)) { + buffer->extras_json_string = detail::JsonToString(detail::GetValue(it)); + } + } + } return true; } @@ -4612,8 +4356,23 @@ static bool ParseBufferView( ParseStringProperty(&bufferView->name, err, o, "name", false); - ParseExtrasAndExtensions(bufferView, err, o, - store_original_json_for_extras_and_extensions); + ParseExtensionsProperty(&bufferView->extensions, err, o); + ParseExtrasProperty(&bufferView->extras, o); + + if (store_original_json_for_extras_and_extensions) { + { + detail::json_const_iterator it; + if (detail::FindMember(o, "extensions", it)) { + bufferView->extensions_json_string = detail::JsonToString(detail::GetValue(it)); + } + } + { + detail::json_const_iterator it; + if (detail::FindMember(o, "extras", it)) { + bufferView->extras_json_string = detail::JsonToString(detail::GetValue(it)); + } + } + } bufferView->buffer = buffer; bufferView->byteOffset = byteOffset; @@ -4622,19 +4381,15 @@ static bool ParseBufferView( return true; } -static bool ParseSparseAccessor( - Accessor::Sparse *sparse, std::string *err, const detail::json &o, - bool store_original_json_for_extras_and_extensions) { - sparse->isSparse = true; +static bool ParseSparseAccessor(Accessor *accessor, std::string *err, + const detail::json &o) { + accessor->sparse.isSparse = true; int count = 0; if (!ParseIntegerProperty(&count, err, o, "count", true, "SparseAccessor")) { return false; } - ParseExtrasAndExtensions(sparse, err, o, - store_original_json_for_extras_and_extensions); - detail::json_const_iterator indices_iterator; detail::json_const_iterator values_iterator; if (!detail::FindMember(o, "indices", indices_iterator)) { @@ -4650,45 +4405,37 @@ static bool ParseSparseAccessor( const detail::json &indices_obj = detail::GetValue(indices_iterator); const detail::json &values_obj = detail::GetValue(values_iterator); - int indices_buffer_view = 0, component_type = 0; - size_t indices_byte_offset = 0; + int indices_buffer_view = 0, indices_byte_offset = 0, component_type = 0; if (!ParseIntegerProperty(&indices_buffer_view, err, indices_obj, "bufferView", true, "SparseAccessor")) { return false; } - ParseUnsignedProperty(&indices_byte_offset, err, indices_obj, "byteOffset", + ParseIntegerProperty(&indices_byte_offset, err, indices_obj, "byteOffset", false); if (!ParseIntegerProperty(&component_type, err, indices_obj, "componentType", true, "SparseAccessor")) { return false; } - int values_buffer_view = 0; - size_t values_byte_offset = 0; + int values_buffer_view = 0, values_byte_offset = 0; if (!ParseIntegerProperty(&values_buffer_view, err, values_obj, "bufferView", true, "SparseAccessor")) { return false; } - ParseUnsignedProperty(&values_byte_offset, err, values_obj, "byteOffset", + ParseIntegerProperty(&values_byte_offset, err, values_obj, "byteOffset", false); - sparse->count = count; - sparse->indices.bufferView = indices_buffer_view; - sparse->indices.byteOffset = indices_byte_offset; - sparse->indices.componentType = component_type; - ParseExtrasAndExtensions(&sparse->indices, err, indices_obj, - store_original_json_for_extras_and_extensions); - - sparse->values.bufferView = values_buffer_view; - sparse->values.byteOffset = values_byte_offset; - ParseExtrasAndExtensions(&sparse->values, err, values_obj, - store_original_json_for_extras_and_extensions); + accessor->sparse.count = count; + accessor->sparse.indices.bufferView = indices_buffer_view; + accessor->sparse.indices.byteOffset = indices_byte_offset; + accessor->sparse.indices.componentType = component_type; + accessor->sparse.values.bufferView = values_buffer_view; + accessor->sparse.values.byteOffset = values_byte_offset; return true; } -static bool ParseAccessor(Accessor *accessor, std::string *err, - const detail::json &o, +static bool ParseAccessor(Accessor *accessor, std::string *err, const detail::json &o, bool store_original_json_for_extras_and_extensions) { int bufferView = -1; ParseIntegerProperty(&bufferView, err, o, "bufferView", false, "Accessor"); @@ -4768,16 +4515,29 @@ static bool ParseAccessor(Accessor *accessor, std::string *err, } } - ParseExtrasAndExtensions(accessor, err, o, - store_original_json_for_extras_and_extensions); + ParseExtensionsProperty(&(accessor->extensions), err, o); + ParseExtrasProperty(&(accessor->extras), o); + + if (store_original_json_for_extras_and_extensions) { + { + detail::json_const_iterator it; + if (detail::FindMember(o, "extensions", it)) { + accessor->extensions_json_string = detail::JsonToString(detail::GetValue(it)); + } + } + { + detail::json_const_iterator it; + if (detail::FindMember(o, "extras", it)) { + accessor->extras_json_string = detail::JsonToString(detail::GetValue(it)); + } + } + } // check if accessor has a "sparse" object: detail::json_const_iterator iterator; if (detail::FindMember(o, "sparse", iterator)) { // here this accessor has a "sparse" subobject - return ParseSparseAccessor(&accessor->sparse, err, - detail::GetValue(iterator), - store_original_json_for_extras_and_extensions); + return ParseSparseAccessor(accessor, err, detail::GetValue(iterator)); } return true; @@ -4877,9 +4637,8 @@ static bool GetAttributeForAllPoints(uint32_t componentType, draco::Mesh *mesh, } static bool ParseDracoExtension(Primitive *primitive, Model *model, - std::string *err, std::string *warn, - const Value &dracoExtensionValue, - ParseStrictness strictness) { + std::string *err, + const Value &dracoExtensionValue) { (void)err; auto bufferViewValue = dracoExtensionValue.Get("bufferView"); if (!bufferViewValue.IsInt()) return false; @@ -4911,33 +4670,6 @@ static bool ParseDracoExtension(Primitive *primitive, Model *model, // create new bufferView for indices if (primitive->indices >= 0) { - if (strictness == ParseStrictness::Permissive) { - const draco::PointIndex::ValueType numPoint = mesh->num_points(); - // handle the situation where the stored component type does not match the - // required type for the actual number of stored points - int supposedComponentType = TINYGLTF_COMPONENT_TYPE_UNSIGNED_BYTE; - if (numPoint < static_cast( - std::numeric_limits::max())) { - supposedComponentType = TINYGLTF_COMPONENT_TYPE_UNSIGNED_BYTE; - } else if ( - numPoint < static_cast( - std::numeric_limits::max())) { - supposedComponentType = TINYGLTF_COMPONENT_TYPE_UNSIGNED_SHORT; - } else { - supposedComponentType = TINYGLTF_COMPONENT_TYPE_UNSIGNED_INT; - } - - if (supposedComponentType > model->accessors[primitive->indices].componentType) { - if (warn) { - (*warn) += - "GLTF component type " + std::to_string(model->accessors[primitive->indices].componentType) + - " is not sufficient for number of stored points," - " treating as " + std::to_string(supposedComponentType) + "\n"; - } - model->accessors[primitive->indices].componentType = supposedComponentType; - } - } - int32_t componentSize = GetComponentSizeInBytes( model->accessors[primitive->indices].componentType); Buffer decodedIndexBuffer; @@ -5003,11 +4735,9 @@ static bool ParseDracoExtension(Primitive *primitive, Model *model, } #endif -static bool ParsePrimitive(Primitive *primitive, Model *model, - std::string *err, std::string *warn, +static bool ParsePrimitive(Primitive *primitive, Model *model, std::string *err, const detail::json &o, - bool store_original_json_for_extras_and_extensions, - ParseStrictness strictness) { + bool store_original_json_for_extras_and_extensions) { int material = -1; ParseIntegerProperty(&material, err, o, "material", false); primitive->material = material; @@ -5029,8 +4759,7 @@ static bool ParsePrimitive(Primitive *primitive, Model *model, if (detail::FindMember(o, "targets", targetsObject) && detail::IsArray(detail::GetValue(targetsObject))) { auto targetsObjectEnd = detail::ArrayEnd(detail::GetValue(targetsObject)); - for (detail::json_const_array_iterator i = - detail::ArrayBegin(detail::GetValue(targetsObject)); + for (detail::json_const_array_iterator i = detail::ArrayBegin(detail::GetValue(targetsObject)); i != targetsObjectEnd; ++i) { std::map targetAttribues; @@ -5049,44 +4778,51 @@ static bool ParsePrimitive(Primitive *primitive, Model *model, } } - ParseExtrasAndExtensions(primitive, err, o, - store_original_json_for_extras_and_extensions); + ParseExtrasProperty(&(primitive->extras), o); + ParseExtensionsProperty(&primitive->extensions, err, o); + + if (store_original_json_for_extras_and_extensions) { + { + detail::json_const_iterator it; + if (detail::FindMember(o, "extensions", it)) { + primitive->extensions_json_string = detail::JsonToString(detail::GetValue(it)); + } + } + { + detail::json_const_iterator it; + if (detail::FindMember(o, "extras", it)) { + primitive->extras_json_string = detail::JsonToString(detail::GetValue(it)); + } + } + } #ifdef TINYGLTF_ENABLE_DRACO auto dracoExtension = primitive->extensions.find("KHR_draco_mesh_compression"); if (dracoExtension != primitive->extensions.end()) { - ParseDracoExtension(primitive, model, err, warn, dracoExtension->second, strictness); + ParseDracoExtension(primitive, model, err, dracoExtension->second); } #else (void)model; - (void)warn; - (void)strictness; #endif return true; } -static bool ParseMesh(Mesh *mesh, Model *model, - std::string *err, std::string *warn, - const detail::json &o, - bool store_original_json_for_extras_and_extensions, - ParseStrictness strictness) { +static bool ParseMesh(Mesh *mesh, Model *model, std::string *err, const detail::json &o, + bool store_original_json_for_extras_and_extensions) { ParseStringProperty(&mesh->name, err, o, "name", false); mesh->primitives.clear(); detail::json_const_iterator primObject; if (detail::FindMember(o, "primitives", primObject) && detail::IsArray(detail::GetValue(primObject))) { - detail::json_const_array_iterator primEnd = - detail::ArrayEnd(detail::GetValue(primObject)); - for (detail::json_const_array_iterator i = - detail::ArrayBegin(detail::GetValue(primObject)); + detail::json_const_array_iterator primEnd = detail::ArrayEnd(detail::GetValue(primObject)); + for (detail::json_const_array_iterator i = detail::ArrayBegin(detail::GetValue(primObject)); i != primEnd; ++i) { Primitive primitive; - if (ParsePrimitive(&primitive, model, err, warn, *i, - store_original_json_for_extras_and_extensions, - strictness)) { + if (ParsePrimitive(&primitive, model, err, *i, + store_original_json_for_extras_and_extensions)) { // Only add the primitive if the parsing succeeds. mesh->primitives.emplace_back(std::move(primitive)); } @@ -5096,8 +4832,23 @@ static bool ParseMesh(Mesh *mesh, Model *model, // Should probably check if has targets and if dimensions fit ParseNumberArrayProperty(&mesh->weights, err, o, "weights", false); - ParseExtrasAndExtensions(mesh, err, o, - store_original_json_for_extras_and_extensions); + ParseExtensionsProperty(&mesh->extensions, err, o); + ParseExtrasProperty(&(mesh->extras), o); + + if (store_original_json_for_extras_and_extensions) { + { + detail::json_const_iterator it; + if (detail::FindMember(o, "extensions", it)) { + mesh->extensions_json_string = detail::JsonToString(detail::GetValue(it)); + } + } + { + detail::json_const_iterator it; + if (detail::FindMember(o, "extras", it)) { + mesh->extras_json_string = detail::JsonToString(detail::GetValue(it)); + } + } + } return true; } @@ -5130,87 +4881,21 @@ static bool ParseNode(Node *node, std::string *err, const detail::json &o, ParseNumberArrayProperty(&node->weights, err, o, "weights", false); - ParseExtrasAndExtensions(node, err, o, - store_original_json_for_extras_and_extensions); + ParseExtensionsProperty(&node->extensions, err, o); + ParseExtrasProperty(&(node->extras), o); - // KHR_lights_punctual: parse light source reference - int light = -1; - if (node->extensions.count("KHR_lights_punctual") != 0) { - auto const &light_ext = node->extensions["KHR_lights_punctual"]; - if (light_ext.Has("light")) { - light = light_ext.Get("light").GetNumberAsInt(); - } else { - if (err) { - *err += - "Node has extension KHR_lights_punctual, but does not reference " - "a light source.\n"; + if (store_original_json_for_extras_and_extensions) { + { + detail::json_const_iterator it; + if (detail::FindMember(o, "extensions", it)) { + node->extensions_json_string = detail::JsonToString(detail::GetValue(it)); } - return false; } - } - node->light = light; - - // KHR_audio: parse audio source reference - int emitter = -1; - if (node->extensions.count("KHR_audio") != 0) { - auto const &audio_ext = node->extensions["KHR_audio"]; - if (audio_ext.Has("emitter")) { - emitter = audio_ext.Get("emitter").GetNumberAsInt(); - } else { - if (err) { - *err += - "Node has extension KHR_audio, but does not reference " - "a audio emitter.\n"; + { + detail::json_const_iterator it; + if (detail::FindMember(o, "extras", it)) { + node->extras_json_string = detail::JsonToString(detail::GetValue(it)); } - return false; - } - } - node->emitter = emitter; - - node->lods.clear(); - if (node->extensions.count("MSFT_lod") != 0) { - auto const &msft_lod_ext = node->extensions["MSFT_lod"]; - if (msft_lod_ext.Has("ids")) { - auto idsArr = msft_lod_ext.Get("ids"); - for (size_t i = 0; i < idsArr.ArrayLen(); ++i) { - node->lods.emplace_back(idsArr.Get(i).GetNumberAsInt()); - } - } else { - if (err) { - *err += - "Node has extension MSFT_lod, but does not reference " - "other nodes via their ids.\n"; - } - return false; - } - } - - return true; -} - -static bool ParseScene(Scene *scene, std::string *err, const detail::json &o, - bool store_original_json_for_extras_and_extensions) { - ParseStringProperty(&scene->name, err, o, "name", false); - ParseIntegerArrayProperty(&scene->nodes, err, o, "nodes", false); - - ParseExtrasAndExtensions(scene, err, o, - store_original_json_for_extras_and_extensions); - - // Parse KHR_audio global emitters - if (scene->extensions.count("KHR_audio") != 0) { - auto const &audio_ext = scene->extensions["KHR_audio"]; - if (audio_ext.Has("emitters")) { - auto emittersArr = audio_ext.Get("emitters"); - for (size_t i = 0; i < emittersArr.ArrayLen(); ++i) { - scene->audioEmitters.emplace_back(emittersArr.Get(i).GetNumberAsInt()); - } - } else { - if (err) { - *err += - "Node has extension KHR_audio, but does not reference " - "a audio emitter.\n"; - } - return false; } } @@ -5250,8 +4935,7 @@ static bool ParsePbrMetallicRoughness( { detail::json_const_iterator it; if (detail::FindMember(o, "metallicRoughnessTexture", it)) { - ParseTextureInfo(&pbr->metallicRoughnessTexture, err, - detail::GetValue(it), + ParseTextureInfo(&pbr->metallicRoughnessTexture, err, detail::GetValue(it), store_original_json_for_extras_and_extensions); } } @@ -5259,30 +4943,35 @@ static bool ParsePbrMetallicRoughness( ParseNumberProperty(&pbr->metallicFactor, err, o, "metallicFactor", false); ParseNumberProperty(&pbr->roughnessFactor, err, o, "roughnessFactor", false); - ParseExtrasAndExtensions(pbr, err, o, - store_original_json_for_extras_and_extensions); + ParseExtensionsProperty(&pbr->extensions, err, o); + ParseExtrasProperty(&pbr->extras, o); + + if (store_original_json_for_extras_and_extensions) { + { + detail::json_const_iterator it; + if (detail::FindMember(o, "extensions", it)) { + pbr->extensions_json_string = detail::JsonToString(detail::GetValue(it)); + } + } + { + detail::json_const_iterator it; + if (detail::FindMember(o, "extras", it)) { + pbr->extras_json_string = detail::JsonToString(detail::GetValue(it)); + } + } + } return true; } -static bool ParseMaterial(Material *material, std::string *err, std::string *warn, - const detail::json &o, - bool store_original_json_for_extras_and_extensions, - ParseStrictness strictness) { +static bool ParseMaterial(Material *material, std::string *err, const detail::json &o, + bool store_original_json_for_extras_and_extensions) { ParseStringProperty(&material->name, err, o, "name", /* required */ false); if (ParseNumberArrayProperty(&material->emissiveFactor, err, o, "emissiveFactor", /* required */ false)) { - if (strictness==ParseStrictness::Permissive && material->emissiveFactor.size() == 4) { - if (warn) { - (*warn) += - "Array length of `emissiveFactor` parameter in " - "material must be 3, but got 4\n"; - } - material->emissiveFactor.resize(3); - } - else if (material->emissiveFactor.size() != 3) { + if (material->emissiveFactor.size() != 3) { if (err) { (*err) += "Array length of `emissiveFactor` parameter in " @@ -5315,8 +5004,7 @@ static bool ParseMaterial(Material *material, std::string *err, std::string *war { detail::json_const_iterator it; if (detail::FindMember(o, "normalTexture", it)) { - ParseNormalTextureInfo(&material->normalTexture, err, - detail::GetValue(it), + ParseNormalTextureInfo(&material->normalTexture, err, detail::GetValue(it), store_original_json_for_extras_and_extensions); } } @@ -5324,8 +5012,7 @@ static bool ParseMaterial(Material *material, std::string *err, std::string *war { detail::json_const_iterator it; if (detail::FindMember(o, "occlusionTexture", it)) { - ParseOcclusionTextureInfo(&material->occlusionTexture, err, - detail::GetValue(it), + ParseOcclusionTextureInfo(&material->occlusionTexture, err, detail::GetValue(it), store_original_json_for_extras_and_extensions); } } @@ -5360,8 +5047,8 @@ static bool ParseMaterial(Material *material, std::string *err, std::string *war for (; itVal != itValEnd; ++itVal) { Parameter param; - if (ParseParameterProperty(¶m, err, values_object, - detail::GetKey(itVal), false)) { + if (ParseParameterProperty(¶m, err, values_object, detail::GetKey(itVal), + false)) { material->values.emplace(detail::GetKey(itVal), std::move(param)); } } @@ -5380,25 +5067,22 @@ static bool ParseMaterial(Material *material, std::string *err, std::string *war } } - material->extensions.clear(); // Note(agnat): Why? - ParseExtrasAndExtensions(material, err, o, - store_original_json_for_extras_and_extensions); + material->extensions.clear(); + ParseExtensionsProperty(&material->extensions, err, o); + ParseExtrasProperty(&(material->extras), o); - material->lods.clear(); - if (material->extensions.count("MSFT_lod") != 0) { - auto const &msft_lod_ext = material->extensions["MSFT_lod"]; - if (msft_lod_ext.Has("ids")) { - auto idsArr = msft_lod_ext.Get("ids"); - for (size_t i = 0; i < idsArr.ArrayLen(); ++i) { - material->lods.emplace_back(idsArr.Get(i).GetNumberAsInt()); + if (store_original_json_for_extras_and_extensions) { + { + detail::json_const_iterator eit; + if (detail::FindMember(o, "extensions", eit)) { + material->extensions_json_string = detail::JsonToString(detail::GetValue(eit)); } - } else { - if (err) { - *err += - "Material has extension MSFT_lod, but does not reference " - "other materials via their ids.\n"; + } + { + detail::json_const_iterator eit; + if (detail::FindMember(o, "extras", eit)) { + material->extras_json_string = detail::JsonToString(detail::GetValue(eit)); } - return false; } } @@ -5419,8 +5103,7 @@ static bool ParseAnimationChannel( } detail::json_const_iterator targetIt; - if (detail::FindMember(o, "target", targetIt) && - detail::IsObject(detail::GetValue(targetIt))) { + if (detail::FindMember(o, "target", targetIt) && detail::IsObject(detail::GetValue(targetIt))) { const detail::json &target_object = detail::GetValue(targetIt); ParseIntegerProperty(&targetIndex, err, target_object, "node", false); @@ -5433,21 +5116,10 @@ static bool ParseAnimationChannel( return false; } ParseExtensionsProperty(&channel->target_extensions, err, target_object); - ParseExtrasProperty(&channel->target_extras, target_object); if (store_original_json_for_extras_and_extensions) { - { - detail::json_const_iterator it; - if (detail::FindMember(target_object, "extensions", it)) { - channel->target_extensions_json_string = - detail::JsonToString(detail::GetValue(it)); - } - } - { - detail::json_const_iterator it; - if (detail::FindMember(target_object, "extras", it)) { - channel->target_extras_json_string = - detail::JsonToString(detail::GetValue(it)); - } + detail::json_const_iterator it; + if (detail::FindMember(target_object, "extensions", it)) { + channel->target_extensions_json_string = detail::JsonToString(detail::GetValue(it)); } } } @@ -5455,8 +5127,23 @@ static bool ParseAnimationChannel( channel->sampler = samplerIndex; channel->target_node = targetIndex; - ParseExtrasAndExtensions(channel, err, o, - store_original_json_for_extras_and_extensions); + ParseExtensionsProperty(&channel->extensions, err, o); + ParseExtrasProperty(&(channel->extras), o); + + if (store_original_json_for_extras_and_extensions) { + { + detail::json_const_iterator it; + if (detail::FindMember(o, "extensions", it)) { + channel->extensions_json_string = detail::JsonToString(detail::GetValue(it)); + } + } + { + detail::json_const_iterator it; + if (detail::FindMember(o, "extras", it)) { + channel->extras_json_string = detail::JsonToString(detail::GetValue(it)); + } + } + } return true; } @@ -5468,10 +5155,8 @@ static bool ParseAnimation(Animation *animation, std::string *err, detail::json_const_iterator channelsIt; if (detail::FindMember(o, "channels", channelsIt) && detail::IsArray(detail::GetValue(channelsIt))) { - detail::json_const_array_iterator channelEnd = - detail::ArrayEnd(detail::GetValue(channelsIt)); - for (detail::json_const_array_iterator i = - detail::ArrayBegin(detail::GetValue(channelsIt)); + detail::json_const_array_iterator channelEnd = detail::ArrayEnd(detail::GetValue(channelsIt)); + for (detail::json_const_array_iterator i = detail::ArrayBegin(detail::GetValue(channelsIt)); i != channelEnd; ++i) { AnimationChannel channel; if (ParseAnimationChannel( @@ -5486,8 +5171,7 @@ static bool ParseAnimation(Animation *animation, std::string *err, { detail::json_const_iterator samplerIt; - if (detail::FindMember(o, "samplers", samplerIt) && - detail::IsArray(detail::GetValue(samplerIt))) { + if (detail::FindMember(o, "samplers", samplerIt) && detail::IsArray(detail::GetValue(samplerIt))) { const detail::json &sampler_array = detail::GetValue(samplerIt); detail::json_const_array_iterator it = detail::ArrayBegin(sampler_array); @@ -5515,8 +5199,23 @@ static bool ParseAnimation(Animation *animation, std::string *err, } sampler.input = inputIndex; sampler.output = outputIndex; - ParseExtrasAndExtensions(&sampler, err, o, - store_original_json_for_extras_and_extensions); + ParseExtensionsProperty(&(sampler.extensions), err, o); + ParseExtrasProperty(&(sampler.extras), s); + + if (store_original_json_for_extras_and_extensions) { + { + detail::json_const_iterator eit; + if (detail::FindMember(o, "extensions", eit)) { + sampler.extensions_json_string = detail::JsonToString(detail::GetValue(eit)); + } + } + { + detail::json_const_iterator eit; + if (detail::FindMember(o, "extras", eit)) { + sampler.extras_json_string = detail::JsonToString(detail::GetValue(eit)); + } + } + } animation->samplers.emplace_back(std::move(sampler)); } @@ -5525,14 +5224,28 @@ static bool ParseAnimation(Animation *animation, std::string *err, ParseStringProperty(&animation->name, err, o, "name", false); - ParseExtrasAndExtensions(animation, err, o, - store_original_json_for_extras_and_extensions); + ParseExtensionsProperty(&animation->extensions, err, o); + ParseExtrasProperty(&(animation->extras), o); + + if (store_original_json_for_extras_and_extensions) { + { + detail::json_const_iterator it; + if (detail::FindMember(o, "extensions", it)) { + animation->extensions_json_string = detail::JsonToString(detail::GetValue(it)); + } + } + { + detail::json_const_iterator it; + if (detail::FindMember(o, "extras", it)) { + animation->extras_json_string = detail::JsonToString(detail::GetValue(it)); + } + } + } return true; } -static bool ParseSampler(Sampler *sampler, std::string *err, - const detail::json &o, +static bool ParseSampler(Sampler *sampler, std::string *err, const detail::json &o, bool store_original_json_for_extras_and_extensions) { ParseStringProperty(&sampler->name, err, o, "name", false); @@ -5557,8 +5270,23 @@ static bool ParseSampler(Sampler *sampler, std::string *err, sampler->wrapT = wrapT; // sampler->wrapR = wrapR; - ParseExtrasAndExtensions(sampler, err, o, - store_original_json_for_extras_and_extensions); + ParseExtensionsProperty(&(sampler->extensions), err, o); + ParseExtrasProperty(&(sampler->extras), o); + + if (store_original_json_for_extras_and_extensions) { + { + detail::json_const_iterator it; + if (detail::FindMember(o, "extensions", it)) { + sampler->extensions_json_string = detail::JsonToString(detail::GetValue(it)); + } + } + { + detail::json_const_iterator it; + if (detail::FindMember(o, "extras", it)) { + sampler->extras_json_string = detail::JsonToString(detail::GetValue(it)); + } + } + } return true; } @@ -5581,8 +5309,23 @@ static bool ParseSkin(Skin *skin, std::string *err, const detail::json &o, ParseIntegerProperty(&invBind, err, o, "inverseBindMatrices", true, "Skin"); skin->inverseBindMatrices = invBind; - ParseExtrasAndExtensions(skin, err, o, - store_original_json_for_extras_and_extensions); + ParseExtensionsProperty(&(skin->extensions), err, o); + ParseExtrasProperty(&(skin->extras), o); + + if (store_original_json_for_extras_and_extensions) { + { + detail::json_const_iterator it; + if (detail::FindMember(o, "extensions", it)) { + skin->extensions_json_string = detail::JsonToString(detail::GetValue(it)); + } + } + { + detail::json_const_iterator it; + if (detail::FindMember(o, "extras", it)) { + skin->extras_json_string = detail::JsonToString(detail::GetValue(it)); + } + } + } return true; } @@ -5613,22 +5356,51 @@ static bool ParsePerspectiveCamera( camera->yfov = yfov; camera->znear = znear; - ParseExtrasAndExtensions(camera, err, o, - store_original_json_for_extras_and_extensions); + ParseExtensionsProperty(&camera->extensions, err, o); + ParseExtrasProperty(&(camera->extras), o); + + if (store_original_json_for_extras_and_extensions) { + { + detail::json_const_iterator it; + if (detail::FindMember(o, "extensions", it)) { + camera->extensions_json_string = detail::JsonToString(detail::GetValue(it)); + } + } + { + detail::json_const_iterator it; + if (detail::FindMember(o, "extras", it)) { + camera->extras_json_string = detail::JsonToString(detail::GetValue(it)); + } + } + } // TODO(syoyo): Validate parameter values. return true; } -static bool ParseSpotLight(SpotLight *light, std::string *err, - const detail::json &o, +static bool ParseSpotLight(SpotLight *light, std::string *err, const detail::json &o, bool store_original_json_for_extras_and_extensions) { ParseNumberProperty(&light->innerConeAngle, err, o, "innerConeAngle", false); ParseNumberProperty(&light->outerConeAngle, err, o, "outerConeAngle", false); - ParseExtrasAndExtensions(light, err, o, - store_original_json_for_extras_and_extensions); + ParseExtensionsProperty(&light->extensions, err, o); + ParseExtrasProperty(&light->extras, o); + + if (store_original_json_for_extras_and_extensions) { + { + detail::json_const_iterator it; + if (detail::FindMember(o, "extensions", it)) { + light->extensions_json_string = detail::JsonToString(detail::GetValue(it)); + } + } + { + detail::json_const_iterator it; + if (detail::FindMember(o, "extras", it)) { + light->extras_json_string = detail::JsonToString(detail::GetValue(it)); + } + } + } // TODO(syoyo): Validate parameter values. @@ -5659,8 +5431,23 @@ static bool ParseOrthographicCamera( return false; } - ParseExtrasAndExtensions(camera, err, o, - store_original_json_for_extras_and_extensions); + ParseExtensionsProperty(&camera->extensions, err, o); + ParseExtrasProperty(&(camera->extras), o); + + if (store_original_json_for_extras_and_extensions) { + { + detail::json_const_iterator it; + if (detail::FindMember(o, "extensions", it)) { + camera->extensions_json_string = detail::JsonToString(detail::GetValue(it)); + } + } + { + detail::json_const_iterator it; + if (detail::FindMember(o, "extras", it)) { + camera->extras_json_string = detail::JsonToString(detail::GetValue(it)); + } + } + } camera->xmag = xmag; camera->ymag = ymag; @@ -5742,8 +5529,23 @@ static bool ParseCamera(Camera *camera, std::string *err, const detail::json &o, ParseStringProperty(&camera->name, err, o, "name", false); - ParseExtrasAndExtensions(camera, err, o, - store_original_json_for_extras_and_extensions); + ParseExtensionsProperty(&camera->extensions, err, o); + ParseExtrasProperty(&(camera->extras), o); + + if (store_original_json_for_extras_and_extensions) { + { + detail::json_const_iterator it; + if (detail::FindMember(o, "extensions", it)) { + camera->extensions_json_string = detail::JsonToString(detail::GetValue(it)); + } + } + { + detail::json_const_iterator it; + if (detail::FindMember(o, "extras", it)) { + camera->extras_json_string = detail::JsonToString(detail::GetValue(it)); + } + } + } return true; } @@ -5785,117 +5587,27 @@ static bool ParseLight(Light *light, std::string *err, const detail::json &o, ParseNumberArrayProperty(&light->color, err, o, "color", false); ParseNumberProperty(&light->range, err, o, "range", false); ParseNumberProperty(&light->intensity, err, o, "intensity", false); + ParseExtensionsProperty(&light->extensions, err, o); + ParseExtrasProperty(&(light->extras), o); - ParseExtrasAndExtensions(light, err, o, - store_original_json_for_extras_and_extensions); - - return true; -} - -static bool ParsePositionalEmitter( - PositionalEmitter *positional, std::string *err, const detail::json &o, - bool store_original_json_for_extras_and_extensions) { - ParseNumberProperty(&positional->coneInnerAngle, err, o, "coneInnerAngle", - false); - ParseNumberProperty(&positional->coneOuterAngle, err, o, "coneOuterAngle", - false); - ParseNumberProperty(&positional->coneOuterGain, err, o, "coneOuterGain", - false); - ParseNumberProperty(&positional->maxDistance, err, o, "maxDistance", false); - ParseNumberProperty(&positional->refDistance, err, o, "refDistance", false); - ParseNumberProperty(&positional->rolloffFactor, err, o, "rolloffFactor", - false); - - ParseExtrasAndExtensions(positional, err, o, - store_original_json_for_extras_and_extensions); - - return true; -} - -static bool ParseAudioEmitter( - AudioEmitter *emitter, std::string *err, const detail::json &o, - bool store_original_json_for_extras_and_extensions) { - if (!ParseStringProperty(&emitter->type, err, o, "type", true)) { - return false; - } - - if (emitter->type == "positional") { - detail::json_const_iterator positionalIt; - if (!detail::FindMember(o, "positional", positionalIt)) { - if (err) { - std::stringstream ss; - ss << "Positional emitter description not found." << std::endl; - (*err) += ss.str(); + if (store_original_json_for_extras_and_extensions) { + { + detail::json_const_iterator it; + if (detail::FindMember(o, "extensions", it)) { + light->extensions_json_string = detail::JsonToString(detail::GetValue(it)); } - return false; } - - const detail::json &v = detail::GetValue(positionalIt); - if (!detail::IsObject(v)) { - if (err) { - std::stringstream ss; - ss << "\"positional\" is not a JSON object." << std::endl; - (*err) += ss.str(); + { + detail::json_const_iterator it; + if (detail::FindMember(o, "extras", it)) { + light->extras_json_string = detail::JsonToString(detail::GetValue(it)); } - return false; - } - - if (!ParsePositionalEmitter( - &emitter->positional, err, v, - store_original_json_for_extras_and_extensions)) { - return false; } } - ParseStringProperty(&emitter->name, err, o, "name", false); - ParseNumberProperty(&emitter->gain, err, o, "gain", false); - ParseBooleanProperty(&emitter->loop, err, o, "loop", false); - ParseBooleanProperty(&emitter->playing, err, o, "playing", false); - ParseStringProperty(&emitter->distanceModel, err, o, "distanceModel", false); - ParseIntegerProperty(&emitter->source, err, o, "source", true); - - ParseExtrasAndExtensions(emitter, err, o, - store_original_json_for_extras_and_extensions); - return true; } -static bool ParseAudioSource( - AudioSource *source, std::string *err, const detail::json &o, - bool store_original_json_for_extras_and_extensions) { - ParseStringProperty(&source->name, err, o, "name", false); - ParseStringProperty(&source->uri, err, o, "uri", false); - - if (source->uri.empty()) { - ParseIntegerProperty(&source->bufferView, err, o, "bufferView", true); - ParseStringProperty(&source->mimeType, err, o, "mimeType", true); - } - - ParseExtrasAndExtensions(source, err, o, - store_original_json_for_extras_and_extensions); - - return true; -} - -namespace detail { - -template -bool ForEachInArray(const detail::json &_v, const char *member, Callback &&cb) { - detail::json_const_iterator itm; - if (detail::FindMember(_v, member, itm) && - detail::IsArray(detail::GetValue(itm))) { - const detail::json &root = detail::GetValue(itm); - auto it = detail::ArrayBegin(root); - auto end = detail::ArrayEnd(root); - for (; it != end; ++it) { - if (!cb(*it)) return false; - } - } - return true; -}; - -} // end of namespace detail - bool TinyGLTF::LoadFromString(Model *model, std::string *err, std::string *warn, const char *json_str, unsigned int json_str_length, @@ -5947,8 +5659,7 @@ bool TinyGLTF::LoadFromString(Model *model, std::string *err, std::string *warn, { bool version_found = false; detail::json_const_iterator it; - if (detail::FindMember(v, "asset", it) && - detail::IsObject(detail::GetValue(it))) { + if (detail::FindMember(v, "asset", it) && detail::IsObject(detail::GetValue(it))) { auto &itObj = detail::GetValue(it); detail::json_const_iterator version_it; std::string versionStr; @@ -5970,11 +5681,9 @@ bool TinyGLTF::LoadFromString(Model *model, std::string *err, std::string *warn, // scene is not mandatory. // FIXME Maybe a better way to handle it than removing the code - auto IsArrayMemberPresent = [](const detail::json &_v, - const char *name) -> bool { + auto IsArrayMemberPresent = [](const detail::json &_v, const char *name) -> bool { detail::json_const_iterator it; - return detail::FindMember(_v, name, it) && - detail::IsArray(detail::GetValue(it)); + return detail::FindMember(_v, name, it) && detail::IsArray(detail::GetValue(it)); }; { @@ -6040,8 +5749,7 @@ bool TinyGLTF::LoadFromString(Model *model, std::string *err, std::string *warn, // 1. Parse Asset { detail::json_const_iterator it; - if (detail::FindMember(v, "asset", it) && - detail::IsObject(detail::GetValue(it))) { + if (detail::FindMember(v, "asset", it) && detail::IsObject(detail::GetValue(it))) { const detail::json &root = detail::GetValue(it); ParseAsset(&model->asset, err, root, @@ -6049,7 +5757,28 @@ bool TinyGLTF::LoadFromString(Model *model, std::string *err, std::string *warn, } } - using detail::ForEachInArray; +#ifdef TINYGLTF_USE_CPP14 + auto ForEachInArray = [](const detail::json &_v, const char *member, + const auto &cb) -> bool +#else + // The std::function<> implementation can be less efficient because it will + // allocate heap when the size of the captured lambda is above 16 bytes with + // clang and gcc, but it does not require C++14. + auto ForEachInArray = [](const detail::json &_v, const char *member, + const std::function &cb) -> bool +#endif + { + detail::json_const_iterator itm; + if (detail::FindMember(_v, member, itm) && detail::IsArray(detail::GetValue(itm))) { + const detail::json &root = detail::GetValue(itm); + auto it = detail::ArrayBegin(root); + auto end = detail::ArrayEnd(root); + for (; it != end; ++it) { + if (!cb(*it)) return false; + } + } + return true; + }; // 2. Parse extensionUsed { @@ -6082,8 +5811,7 @@ bool TinyGLTF::LoadFromString(Model *model, std::string *err, std::string *warn, Buffer buffer; if (!ParseBuffer(&buffer, err, o, store_original_json_for_extras_and_extensions_, &fs, - &uri_cb, base_dir, max_external_file_size_, is_binary_, - bin_data_, bin_size_)) { + &uri_cb, base_dir, is_binary_, bin_data_, bin_size_)) { return false; } @@ -6153,9 +5881,8 @@ bool TinyGLTF::LoadFromString(Model *model, std::string *err, std::string *warn, return false; } Mesh mesh; - if (!ParseMesh(&mesh, model, err, warn, o, - store_original_json_for_extras_and_extensions_, - strictness_)) { + if (!ParseMesh(&mesh, model, err, o, + store_original_json_for_extras_and_extensions_)) { return false; } @@ -6183,22 +5910,20 @@ bool TinyGLTF::LoadFromString(Model *model, std::string *err, std::string *warn, return false; } - const auto bufferView = + auto bufferView = model->accessors[size_t(primitive.indices)].bufferView; - if (bufferView < 0) { - // skip, bufferView could be null(-1) for certain extensions - } else if (size_t(bufferView) >= model->bufferViews.size()) { + if (bufferView < 0 || size_t(bufferView) >= model->bufferViews.size()) { if (err) { (*err) += "accessor[" + std::to_string(primitive.indices) + "] invalid bufferView"; } return false; - } else { - model->bufferViews[size_t(bufferView)].target = - TINYGLTF_TARGET_ELEMENT_ARRAY_BUFFER; - // we could optionally check if accessors' bufferView type is Scalar, as - // it should be } + + model->bufferViews[size_t(bufferView)].target = + TINYGLTF_TARGET_ELEMENT_ARRAY_BUFFER; + // we could optionally check if accessors' bufferView type is Scalar, as + // it should be } for (auto &attribute : primitive.attributes) { @@ -6219,8 +5944,7 @@ bool TinyGLTF::LoadFromString(Model *model, std::string *err, std::string *warn, if (accessorsIndex < model->accessors.size()) { const auto bufferView = model->accessors[accessorsIndex].bufferView; // bufferView could be null(-1) for sparse morph target - if (bufferView >= 0 && - bufferView < (int)model->bufferViews.size()) { + if (bufferView >= 0 && bufferView < (int)model->bufferViews.size()) { model->bufferViews[size_t(bufferView)].target = TINYGLTF_TARGET_ARRAY_BUFFER; } @@ -6263,11 +5987,30 @@ bool TinyGLTF::LoadFromString(Model *model, std::string *err, std::string *warn, } return false; } + std::vector nodes; + ParseIntegerArrayProperty(&nodes, err, o, "nodes", false); Scene scene; - if (!ParseScene(&scene, err, o, - store_original_json_for_extras_and_extensions_)) { - return false; + scene.nodes = std::move(nodes); + + ParseStringProperty(&scene.name, err, o, "name", false); + + ParseExtensionsProperty(&scene.extensions, err, o); + ParseExtrasProperty(&scene.extras, o); + + if (store_original_json_for_extras_and_extensions_) { + { + detail::json_const_iterator it; + if (detail::FindMember(o, "extensions", it)) { + scene.extensions_json_string = detail::JsonToString(detail::GetValue(it)); + } + } + { + detail::json_const_iterator it; + if (detail::FindMember(o, "extras", it)) { + scene.extras_json_string = detail::JsonToString(detail::GetValue(it)); + } + } } model->scenes.emplace_back(std::move(scene)); @@ -6283,8 +6026,7 @@ bool TinyGLTF::LoadFromString(Model *model, std::string *err, std::string *warn, { detail::json_const_iterator rootIt; int iVal; - if (detail::FindMember(v, "scene", rootIt) && - detail::GetInt(detail::GetValue(rootIt), iVal)) { + if (detail::FindMember(v, "scene", rootIt) && detail::GetInt(detail::GetValue(rootIt), iVal)) { model->defaultScene = iVal; } } @@ -6301,9 +6043,8 @@ bool TinyGLTF::LoadFromString(Model *model, std::string *err, std::string *warn, Material material; ParseStringProperty(&material.name, err, o, "name", false); - if (!ParseMaterial(&material, err, warn, o, - store_original_json_for_extras_and_extensions_, - strictness_)) { + if (!ParseMaterial(&material, err, o, + store_original_json_for_extras_and_extensions_)) { return false; } @@ -6341,8 +6082,8 @@ bool TinyGLTF::LoadFromString(Model *model, std::string *err, std::string *warn, Image image; if (!ParseImage(&image, idx, err, warn, o, store_original_json_for_extras_and_extensions_, base_dir, - max_external_file_size_, &fs, &uri_cb, - &this->LoadImageData, load_image_user_data)) { + &fs, &uri_cb, &this->LoadImageData, + load_image_user_data)) { return false; } @@ -6517,15 +6258,13 @@ bool TinyGLTF::LoadFromString(Model *model, std::string *err, std::string *warn, } } - // 17. Parse Extras & Extensions - ParseExtrasAndExtensions(model, err, v, - store_original_json_for_extras_and_extensions_); + // 17. Parse Extensions + ParseExtensionsProperty(&model->extensions, err, v); // 18. Specific extension implementations { detail::json_const_iterator rootIt; - if (detail::FindMember(v, "extensions", rootIt) && - detail::IsObject(detail::GetValue(rootIt))) { + if (detail::FindMember(v, "extensions", rootIt) && detail::IsObject(detail::GetValue(rootIt))) { const detail::json &root = detail::GetValue(rootIt); detail::json_const_iterator it(detail::ObjectBegin(root)); @@ -6533,8 +6272,7 @@ bool TinyGLTF::LoadFromString(Model *model, std::string *err, std::string *warn, for (; it != itEnd; ++it) { // parse KHR_lights_punctual extension std::string key(detail::GetKey(it)); - if ((key == "KHR_lights_punctual") && - detail::IsObject(detail::GetValue(it))) { + if ((key == "KHR_lights_punctual") && detail::IsObject(detail::GetValue(it))) { const detail::json &object = detail::GetValue(it); detail::json_const_iterator itLight; if (detail::FindMember(object, "lights", itLight)) { @@ -6555,52 +6293,18 @@ bool TinyGLTF::LoadFromString(Model *model, std::string *err, std::string *warn, } } } - // parse KHR_audio extension - if ((key == "KHR_audio") && detail::IsObject(detail::GetValue(it))) { - const detail::json &object = detail::GetValue(it); - detail::json_const_iterator itKhrAudio; - if (detail::FindMember(object, "emitters", itKhrAudio)) { - const detail::json &emitters = detail::GetValue(itKhrAudio); - if (!detail::IsArray(emitters)) { - continue; - } - - auto arrayIt(detail::ArrayBegin(emitters)); - auto arrayItEnd(detail::ArrayEnd(emitters)); - for (; arrayIt != arrayItEnd; ++arrayIt) { - AudioEmitter emitter; - if (!ParseAudioEmitter( - &emitter, err, *arrayIt, - store_original_json_for_extras_and_extensions_)) { - return false; - } - model->audioEmitters.emplace_back(std::move(emitter)); - } - } - - if (detail::FindMember(object, "sources", itKhrAudio)) { - const detail::json &sources = detail::GetValue(itKhrAudio); - if (!detail::IsArray(sources)) { - continue; - } - - auto arrayIt(detail::ArrayBegin(sources)); - auto arrayItEnd(detail::ArrayEnd(sources)); - for (; arrayIt != arrayItEnd; ++arrayIt) { - AudioSource source; - if (!ParseAudioSource( - &source, err, *arrayIt, - store_original_json_for_extras_and_extensions_)) { - return false; - } - model->audioSources.emplace_back(std::move(source)); - } - } - } } } } + // 19. Parse Extras + ParseExtrasProperty(&model->extras, v); + + if (store_original_json_for_extras_and_extensions_) { + model->extras_json_string = detail::JsonToString(v["extras"]); + model->extensions_json_string = detail::JsonToString(v["extensions"]); + } + return true; } @@ -6683,16 +6387,16 @@ bool TinyGLTF::LoadBinaryFromMemory(Model *model, std::string *err, return false; } - unsigned int version; // 4 bytes - unsigned int length; // 4 bytes + unsigned int version; // 4 bytes + unsigned int length; // 4 bytes unsigned int chunk0_length; // 4 bytes unsigned int chunk0_format; // 4 bytes; memcpy(&version, bytes + 4, 4); swap4(&version); - memcpy(&length, bytes + 8, 4); // Total glb size, including header and all chunks. + memcpy(&length, bytes + 8, 4); swap4(&length); - memcpy(&chunk0_length, bytes + 12, 4); // JSON data length + memcpy(&chunk0_length, bytes + 12, 4); // JSON data length swap4(&chunk0_length); memcpy(&chunk0_format, bytes + 16, 4); swap4(&chunk0_format); @@ -6707,16 +6411,13 @@ bool TinyGLTF::LoadBinaryFromMemory(Model *model, std::string *err, // Use 64bit uint to avoid integer overflow. uint64_t header_and_json_size = 20ull + uint64_t(chunk0_length); - if (header_and_json_size > (std::numeric_limits::max)()) { + if (header_and_json_size > std::numeric_limits::max()) { // Do not allow 4GB or more GLB data. - if (err) { - (*err) = "Invalid glTF binary. GLB data exceeds 4GB."; - } - return false; + (*err) = "Invalid glTF binary. GLB data exceeds 4GB."; } - if ((header_and_json_size > uint64_t(size)) || (chunk0_length < 1) || - (length > size) || (header_and_json_size > uint64_t(length)) || + if ((header_and_json_size > uint64_t(size)) || (chunk0_length < 1) || (length > size) || + (header_and_json_size > uint64_t(length)) || (chunk0_format != 0x4E4F534A)) { // 0x4E4F534A = JSON format. if (err) { (*err) = "Invalid glTF binary."; @@ -6731,105 +6432,77 @@ bool TinyGLTF::LoadBinaryFromMemory(Model *model, std::string *err, if (err) { (*err) = "JSON Chunk end does not aligned to a 4-byte boundary."; } - return false; } - // std::cout << "header_and_json_size = " << header_and_json_size << "\n"; - // std::cout << "length = " << length << "\n"; + //std::cout << "header_and_json_size = " << header_and_json_size << "\n"; + //std::cout << "length = " << length << "\n"; // Chunk1(BIN) data - // The spec says: When the binary buffer is empty or when it is stored by - // other means, this chunk SHOULD be omitted. So when header + JSON data == - // binary size, Chunk1 is omitted. + // The spec says: When the binary buffer is empty or when it is stored by other means, this chunk SHOULD be omitted. + // So when header + JSON data == binary size, Chunk1 is omitted. if (header_and_json_size == uint64_t(length)) { + bin_data_ = nullptr; bin_size_ = 0; } else { // Read Chunk1 info(BIN data) - // - // issue-440: - // 'SHOULD' in glTF spec means 'RECOMMENDED', - // So there is a situation that Chunk1(BIN) is composed of zero-sized BIN data - // (chunksize(0) + binformat(BIN) = 8bytes). - // - if ((header_and_json_size + 8ull) > uint64_t(length)) { + // At least Chunk1 should have 12 bytes(8 bytes(header) + 4 bytes(bin payload could be 1~3 bytes, but need to be aligned to 4 bytes) + if ((header_and_json_size + 12ull) > uint64_t(length)) { if (err) { - (*err) = - "Insufficient storage space for Chunk1(BIN data). At least Chunk1 " - "Must have 8 or more bytes, but got " + - std::to_string((header_and_json_size + 8ull) - uint64_t(length)) + - ".\n"; + (*err) = "Insufficient storage space for Chunk1(BIN data). At least Chunk1 Must have 4 bytes or more bytes, but got " + std::to_string((header_and_json_size + 12ull) - uint64_t(length)) + ".\n"; } return false; } - unsigned int chunk1_length{0}; // 4 bytes - unsigned int chunk1_format{0}; // 4 bytes; - memcpy(&chunk1_length, bytes + header_and_json_size, - 4); // Bin data length + unsigned int chunk1_length; // 4 bytes + unsigned int chunk1_format; // 4 bytes; + memcpy(&chunk1_length, bytes + header_and_json_size, 4); // JSON data length swap4(&chunk1_length); memcpy(&chunk1_format, bytes + header_and_json_size + 4, 4); swap4(&chunk1_format); - if (chunk1_format != 0x004e4942) { + //std::cout << "chunk1_length = " << chunk1_length << "\n"; + + if (chunk1_length < 4) { if (err) { - (*err) = "Invalid chunkType for Chunk1."; + (*err) = "Insufficient Chunk1(BIN) data size."; } return false; } - if (chunk1_length == 0) { - - if (header_and_json_size + 8 > uint64_t(length)) { - if (err) { - (*err) = "BIN Chunk header location exceeds the GLB size."; - } - return false; + if ((chunk1_length % 4) != 0) { + if (err) { + (*err) = "BIN Chunk end does not aligned to a 4-byte boundary."; } - - bin_data_ = nullptr; - - } else { - - // When BIN chunk size is not zero, at least Chunk1 should have 12 bytes(8 bytes(header) + 4 bytes(bin - // payload could be 1~3 bytes, but need to be aligned to 4 bytes) - - if (chunk1_length < 4) { - if (err) { - (*err) = "Insufficient Chunk1(BIN) data size."; - } - return false; - } - - if ((chunk1_length % 4) != 0) { - if (strictness_==ParseStrictness::Permissive) { - if (warn) { - (*warn) += "BIN Chunk end is not aligned to a 4-byte boundary.\n"; - } - } - else { - if (err) { - (*err) = "BIN Chunk end is not aligned to a 4-byte boundary."; - } - return false; - } - } - - // +8 chunk1 header size. - if (uint64_t(chunk1_length) + header_and_json_size + 8 > uint64_t(length)) { - if (err) { - (*err) = "BIN Chunk data length exceeds the GLB size."; - } - return false; - } - - bin_data_ = bytes + header_and_json_size + - 8; // 4 bytes (bin_buffer_length) + 4 bytes(bin_buffer_format) + return false; } + if (uint64_t(chunk1_length) + header_and_json_size > uint64_t(length)) { + if (err) { + (*err) = "BIN Chunk data length exceeds the GLB size."; + } + return false; + } + + if (chunk1_format != 0x004e4942) { + if (err) { + (*err) = "Invalid type for chunk1 data."; + } + return false; + } + + //std::cout << "chunk1_length = " << chunk1_length << "\n"; + + bin_data_ = bytes + header_and_json_size + + 8; // 4 bytes (bin_buffer_length) + 4 bytes(bin_buffer_format) + bin_size_ = size_t(chunk1_length); } + // Extract JSON string. + std::string jsonString(reinterpret_cast(&bytes[20]), + chunk0_length); + is_binary_ = true; bool ret = LoadFromString(model, err, warn, @@ -6903,18 +6576,7 @@ void JsonAddMember(detail::json &o, const char *key, detail::json &&value) { if (!o.IsObject()) { o.SetObject(); } - - // Issue 420. - // AddMember may create duplicated key, so use [] API when a key already - // exists. - // https://github.com/Tencent/rapidjson/issues/771#issuecomment-254386863 - detail::json_const_iterator it; - if (detail::FindMember(o, key, it)) { - o[key] = std::move(value); // replace - } else { - o.AddMember(detail::json(key, detail::GetAllocator()), std::move(value), - detail::GetAllocator()); - } + o.AddMember(detail::json(key, detail::GetAllocator()), std::move(value), detail::GetAllocator()); #else o[key] = std::move(value); #endif @@ -6952,7 +6614,7 @@ void JsonReserveArray(detail::json &o, size_t s) { (void)(o); (void)(s); } -} // namespace detail +} // namespace // typedef std::pair json_object_pair; @@ -6967,10 +6629,8 @@ static void SerializeNumberProperty(const std::string &key, T number, #ifdef TINYGLTF_USE_RAPIDJSON template <> -void SerializeNumberProperty(const std::string &key, size_t number, - detail::json &obj) { - detail::JsonAddMember(obj, key.c_str(), - detail::json(static_cast(number))); +void SerializeNumberProperty(const std::string &key, size_t number, detail::json &obj) { + detail::JsonAddMember(obj, key.c_str(), detail::json(static_cast(number))); } #endif @@ -6989,10 +6649,8 @@ static void SerializeNumberArrayProperty(const std::string &key, } static void SerializeStringProperty(const std::string &key, - const std::string &value, - detail::json &obj) { - detail::JsonAddMember(obj, key.c_str(), - detail::JsonFromString(value.c_str())); + const std::string &value, detail::json &obj) { + detail::JsonAddMember(obj, key.c_str(), detail::JsonFromString(value.c_str())); } static void SerializeStringArrayProperty(const std::string &key, @@ -7185,8 +6843,7 @@ static void SerializeParameterMap(ParameterMap ¶m, detail::json &o) { } #endif -static void SerializeExtensionMap(const ExtensionMap &extensions, - detail::json &o) { +static void SerializeExtensionMap(const ExtensionMap &extensions, detail::json &o) { if (!extensions.size()) return; detail::json extMap; @@ -7212,22 +6869,12 @@ static void SerializeExtensionMap(const ExtensionMap &extensions, detail::JsonAddMember(o, "extensions", std::move(extMap)); } -static void SerializeExtras(const Value &extras, detail::json &o) { - if (extras.Type() != NULL_TYPE) SerializeValue("extras", extras, o); -} - -template -void SerializeExtrasAndExtensions(const GltfType &obj, detail::json &o) { - SerializeExtensionMap(obj.extensions, o); - SerializeExtras(obj.extras, o); -} - static void SerializeGltfAccessor(const Accessor &accessor, detail::json &o) { if (accessor.bufferView >= 0) SerializeNumberProperty("bufferView", accessor.bufferView, o); if (accessor.byteOffset != 0) - SerializeNumberProperty("byteOffset", accessor.byteOffset, o); + SerializeNumberProperty("byteOffset", int(accessor.byteOffset), o); SerializeNumberProperty("componentType", accessor.componentType, o); SerializeNumberProperty("count", accessor.count, o); @@ -7288,34 +6935,29 @@ static void SerializeGltfAccessor(const Accessor &accessor, detail::json &o) { SerializeStringProperty("type", type, o); if (!accessor.name.empty()) SerializeStringProperty("name", accessor.name, o); - SerializeExtrasAndExtensions(accessor, o); + if (accessor.extras.Type() != NULL_TYPE) { + SerializeValue("extras", accessor.extras, o); + } // sparse - if (accessor.sparse.isSparse) { - detail::json sparse; - SerializeNumberProperty("count", accessor.sparse.count, sparse); - { - detail::json indices; - SerializeNumberProperty("bufferView", - accessor.sparse.indices.bufferView, indices); - SerializeNumberProperty("byteOffset", - accessor.sparse.indices.byteOffset, indices); - SerializeNumberProperty( - "componentType", accessor.sparse.indices.componentType, indices); - SerializeExtrasAndExtensions(accessor.sparse.indices, indices); - detail::JsonAddMember(sparse, "indices", std::move(indices)); - } - { - detail::json values; - SerializeNumberProperty("bufferView", - accessor.sparse.values.bufferView, values); - SerializeNumberProperty("byteOffset", - accessor.sparse.values.byteOffset, values); - SerializeExtrasAndExtensions(accessor.sparse.values, values); - detail::JsonAddMember(sparse, "values", std::move(values)); - } - SerializeExtrasAndExtensions(accessor.sparse, sparse); - detail::JsonAddMember(o, "sparse", std::move(sparse)); + if (accessor.sparse.isSparse) + { + detail::json sparse; + SerializeNumberProperty("count", accessor.sparse.count, sparse); + { + detail::json indices; + SerializeNumberProperty("bufferView", accessor.sparse.indices.bufferView, indices); + SerializeNumberProperty("byteOffset", accessor.sparse.indices.byteOffset, indices); + SerializeNumberProperty("componentType", accessor.sparse.indices.componentType, indices); + detail::JsonAddMember(sparse, "indices", std::move(indices)); + } + { + detail::json values; + SerializeNumberProperty("bufferView", accessor.sparse.values.bufferView, values); + SerializeNumberProperty("byteOffset", accessor.sparse.values.byteOffset, values); + detail::JsonAddMember(sparse, "values", std::move(values)); + } + detail::JsonAddMember(o, "sparse", std::move(sparse)); } } @@ -7325,19 +6967,22 @@ static void SerializeGltfAnimationChannel(const AnimationChannel &channel, { detail::json target; - if (channel.target_node >= 0) { + if (channel.target_node > 0) { SerializeNumberProperty("node", channel.target_node, target); } SerializeStringProperty("path", channel.target_path, target); SerializeExtensionMap(channel.target_extensions, target); - SerializeExtras(channel.target_extras, target); detail::JsonAddMember(o, "target", std::move(target)); } - SerializeExtrasAndExtensions(channel, o); + if (channel.extras.Type() != NULL_TYPE) { + SerializeValue("extras", channel.extras, o); + } + + SerializeExtensionMap(channel.extensions, o); } static void SerializeGltfAnimationSampler(const AnimationSampler &sampler, @@ -7346,11 +6991,12 @@ static void SerializeGltfAnimationSampler(const AnimationSampler &sampler, SerializeNumberProperty("output", sampler.output, o); SerializeStringProperty("interpolation", sampler.interpolation, o); - SerializeExtrasAndExtensions(sampler, o); + if (sampler.extras.Type() != NULL_TYPE) { + SerializeValue("extras", sampler.extras, o); + } } -static void SerializeGltfAnimation(const Animation &animation, - detail::json &o) { +static void SerializeGltfAnimation(const Animation &animation, detail::json &o) { if (!animation.name.empty()) SerializeStringProperty("name", animation.name, o); @@ -7379,7 +7025,11 @@ static void SerializeGltfAnimation(const Animation &animation, detail::JsonAddMember(o, "samplers", std::move(samplers)); } - SerializeExtrasAndExtensions(animation, o); + if (animation.extras.Type() != NULL_TYPE) { + SerializeValue("extras", animation.extras, o); + } + + SerializeExtensionMap(animation.extensions, o); } static void SerializeGltfAsset(const Asset &asset, detail::json &o) { @@ -7401,7 +7051,11 @@ static void SerializeGltfAsset(const Asset &asset, detail::json &o) { // TODO(syoyo): Do we need to check if `version` is greater or equal to 2.0? SerializeStringProperty("version", version, o); - SerializeExtrasAndExtensions(asset, o); + if (asset.extras.Keys().size()) { + SerializeValue("extras", asset.extras, o); + } + + SerializeExtensionMap(asset.extensions, o); } static void SerializeGltfBufferBin(const Buffer &buffer, detail::json &o, @@ -7411,7 +7065,9 @@ static void SerializeGltfBufferBin(const Buffer &buffer, detail::json &o, if (buffer.name.size()) SerializeStringProperty("name", buffer.name, o); - SerializeExtrasAndExtensions(buffer, o); + if (buffer.extras.Type() != NULL_TYPE) { + SerializeValue("extras", buffer.extras, o); + } } static void SerializeGltfBuffer(const Buffer &buffer, detail::json &o) { @@ -7420,7 +7076,9 @@ static void SerializeGltfBuffer(const Buffer &buffer, detail::json &o) { if (buffer.name.size()) SerializeStringProperty("name", buffer.name, o); - SerializeExtrasAndExtensions(buffer, o); + if (buffer.extras.Type() != NULL_TYPE) { + SerializeValue("extras", buffer.extras, o); + } } static bool SerializeGltfBuffer(const Buffer &buffer, detail::json &o, @@ -7432,12 +7090,13 @@ static bool SerializeGltfBuffer(const Buffer &buffer, detail::json &o, if (buffer.name.size()) SerializeStringProperty("name", buffer.name, o); - SerializeExtrasAndExtensions(buffer, o); + if (buffer.extras.Type() != NULL_TYPE) { + SerializeValue("extras", buffer.extras, o); + } return true; } -static void SerializeGltfBufferView(const BufferView &bufferView, - detail::json &o) { +static void SerializeGltfBufferView(const BufferView &bufferView, detail::json &o) { SerializeNumberProperty("buffer", bufferView.buffer, o); SerializeNumberProperty("byteLength", bufferView.byteLength, o); @@ -7458,7 +7117,9 @@ static void SerializeGltfBufferView(const BufferView &bufferView, SerializeStringProperty("name", bufferView.name, o); } - SerializeExtrasAndExtensions(bufferView, o); + if (bufferView.extras.Type() != NULL_TYPE) { + SerializeValue("extras", bufferView.extras, o); + } } static void SerializeGltfImage(const Image &image, const std::string &uri, @@ -7476,18 +7137,25 @@ static void SerializeGltfImage(const Image &image, const std::string &uri, SerializeStringProperty("name", image.name, o); } - SerializeExtrasAndExtensions(image, o); + if (image.extras.Type() != NULL_TYPE) { + SerializeValue("extras", image.extras, o); + } + + SerializeExtensionMap(image.extensions, o); } -static void SerializeGltfTextureInfo(const TextureInfo &texinfo, - detail::json &o) { +static void SerializeGltfTextureInfo(const TextureInfo &texinfo, detail::json &o) { SerializeNumberProperty("index", texinfo.index, o); if (texinfo.texCoord != 0) { SerializeNumberProperty("texCoord", texinfo.texCoord, o); } - SerializeExtrasAndExtensions(texinfo, o); + if (texinfo.extras.Type() != NULL_TYPE) { + SerializeValue("extras", texinfo.extras, o); + } + + SerializeExtensionMap(texinfo.extensions, o); } static void SerializeGltfNormalTextureInfo(const NormalTextureInfo &texinfo, @@ -7502,7 +7170,11 @@ static void SerializeGltfNormalTextureInfo(const NormalTextureInfo &texinfo, SerializeNumberProperty("scale", texinfo.scale, o); } - SerializeExtrasAndExtensions(texinfo, o); + if (texinfo.extras.Type() != NULL_TYPE) { + SerializeValue("extras", texinfo.extras, o); + } + + SerializeExtensionMap(texinfo.extensions, o); } static void SerializeGltfOcclusionTextureInfo( @@ -7517,7 +7189,11 @@ static void SerializeGltfOcclusionTextureInfo( SerializeNumberProperty("strength", texinfo.strength, o); } - SerializeExtrasAndExtensions(texinfo, o); + if (texinfo.extras.Type() != NULL_TYPE) { + SerializeValue("extras", texinfo.extras, o); + } + + SerializeExtensionMap(texinfo.extensions, o); } static void SerializeGltfPbrMetallicRoughness(const PbrMetallicRoughness &pbr, @@ -7548,7 +7224,11 @@ static void SerializeGltfPbrMetallicRoughness(const PbrMetallicRoughness &pbr, detail::JsonAddMember(o, "metallicRoughnessTexture", std::move(texinfo)); } - SerializeExtrasAndExtensions(pbr, o); + SerializeExtensionMap(pbr.extensions, o); + + if (pbr.extras.Type() != NULL_TYPE) { + SerializeValue("extras", pbr.extras, o); + } } static void SerializeGltfMaterial(const Material &material, detail::json &o) { @@ -7604,8 +7284,7 @@ static void SerializeGltfMaterial(const Material &material, detail::json &o) { // importers (and validators). // if (!detail::JsonIsNull(pbrMetallicRoughness)) { - detail::JsonAddMember(o, "pbrMetallicRoughness", - std::move(pbrMetallicRoughness)); + detail::JsonAddMember(o, "pbrMetallicRoughness", std::move(pbrMetallicRoughness)); } } @@ -7617,39 +7296,14 @@ static void SerializeGltfMaterial(const Material &material, detail::json &o) { } SerializeParameterMap(material.additionalValues, o); +#else + #endif - SerializeExtrasAndExtensions(material, o); + SerializeExtensionMap(material.extensions, o); - // MSFT_lod - if (!material.lods.empty()) { - detail::json_iterator it; - if (!detail::FindMember(o, "extensions", it)) { - detail::json extensions; - detail::JsonSetObject(extensions); - detail::JsonAddMember(o, "extensions", std::move(extensions)); - detail::FindMember(o, "extensions", it); - } - auto &extensions = detail::GetValue(it); - if (!detail::FindMember(extensions, "MSFT_lod", it)) { - detail::json lod; - detail::JsonSetObject(lod); - detail::JsonAddMember(extensions, "MSFT_lod", std::move(lod)); - detail::FindMember(extensions, "MSFT_lod", it); - } - SerializeNumberArrayProperty("ids", material.lods, detail::GetValue(it)); - } else { - detail::json_iterator ext_it; - if (detail::FindMember(o, "extensions", ext_it)) { - auto &extensions = detail::GetValue(ext_it); - detail::json_iterator lp_it; - if (detail::FindMember(extensions, "MSFT_lod", lp_it)) { - detail::Erase(extensions, lp_it); - } - if (detail::IsEmpty(extensions)) { - detail::Erase(o, ext_it); - } - } + if (material.extras.Type() != NULL_TYPE) { + SerializeValue("extras", material.extras, o); } } @@ -7697,7 +7351,11 @@ static void SerializeGltfMesh(const Mesh &mesh, detail::json &o) { detail::JsonAddMember(primitive, "targets", std::move(targets)); } - SerializeExtrasAndExtensions(gltfPrimitive, primitive); + SerializeExtensionMap(gltfPrimitive.extensions, primitive); + + if (gltfPrimitive.extras.Type() != NULL_TYPE) { + SerializeValue("extras", gltfPrimitive.extras, primitive); + } detail::JsonPushBack(primitives, std::move(primitive)); } @@ -7712,13 +7370,19 @@ static void SerializeGltfMesh(const Mesh &mesh, detail::json &o) { SerializeStringProperty("name", mesh.name, o); } - SerializeExtrasAndExtensions(mesh, o); + SerializeExtensionMap(mesh.extensions, o); + if (mesh.extras.Type() != NULL_TYPE) { + SerializeValue("extras", mesh.extras, o); + } } static void SerializeSpotLight(const SpotLight &spot, detail::json &o) { SerializeNumberProperty("innerConeAngle", spot.innerConeAngle, o); SerializeNumberProperty("outerConeAngle", spot.outerConeAngle, o); - SerializeExtrasAndExtensions(spot, o); + SerializeExtensionMap(spot.extensions, o); + if (spot.extras.Type() != NULL_TYPE) { + SerializeValue("extras", spot.extras, o); + } } static void SerializeGltfLight(const Light &light, detail::json &o) { @@ -7734,61 +7398,10 @@ static void SerializeGltfLight(const Light &light, detail::json &o) { SerializeSpotLight(light.spot, spot); detail::JsonAddMember(o, "spot", std::move(spot)); } - SerializeExtrasAndExtensions(light, o); -} - -static void SerializeGltfPositionalEmitter(const PositionalEmitter &positional, - detail::json &o) { - if (!TINYGLTF_DOUBLE_EQUAL(positional.coneInnerAngle, 6.283185307179586)) - SerializeNumberProperty("coneInnerAngle", positional.coneInnerAngle, o); - if (!TINYGLTF_DOUBLE_EQUAL(positional.coneOuterAngle, 6.283185307179586)) - SerializeNumberProperty("coneOuterAngle", positional.coneOuterAngle, o); - if (positional.coneOuterGain > 0.0) - SerializeNumberProperty("coneOuterGain", positional.coneOuterGain, o); - if (!TINYGLTF_DOUBLE_EQUAL(positional.maxDistance, 100.0)) - SerializeNumberProperty("maxDistance", positional.maxDistance, o); - if (!TINYGLTF_DOUBLE_EQUAL(positional.refDistance, 1.0)) - SerializeNumberProperty("refDistance", positional.refDistance, o); - if (!TINYGLTF_DOUBLE_EQUAL(positional.rolloffFactor, 1.0)) - SerializeNumberProperty("rolloffFactor", positional.rolloffFactor, o); - - SerializeExtrasAndExtensions(positional, o); -} - -static void SerializeGltfAudioEmitter(const AudioEmitter &emitter, - detail::json &o) { - if (!emitter.name.empty()) SerializeStringProperty("name", emitter.name, o); - if (!TINYGLTF_DOUBLE_EQUAL(emitter.gain, 1.0)) - SerializeNumberProperty("gain", emitter.gain, o); - if (emitter.loop) SerializeNumberProperty("loop", emitter.loop, o); - if (emitter.playing) SerializeNumberProperty("playing", emitter.playing, o); - if (!emitter.type.empty()) SerializeStringProperty("type", emitter.type, o); - if (!emitter.distanceModel.empty()) - SerializeStringProperty("distanceModel", emitter.distanceModel, o); - if (emitter.type == "positional") { - detail::json positional; - SerializeGltfPositionalEmitter(emitter.positional, positional); - detail::JsonAddMember(o, "positional", std::move(positional)); + SerializeExtensionMap(light.extensions, o); + if (light.extras.Type() != NULL_TYPE) { + SerializeValue("extras", light.extras, o); } - SerializeNumberProperty("source", emitter.source, o); - SerializeExtrasAndExtensions(emitter, o); -} - -static void SerializeGltfAudioSource(const AudioSource &source, - detail::json &o) { - std::string name; - std::string uri; - std::string mimeType; // (required if no uri) ["audio/mp3", "audio/ogg", - // "audio/wav", "audio/m4a"] - - if (!source.name.empty()) SerializeStringProperty("name", source.name, o); - if (source.uri.empty()) { - SerializeStringProperty("mimeType", source.mimeType, o); - SerializeNumberProperty("bufferView", source.bufferView, o); - } else { - SerializeStringProperty("uri", source.uri, o); - } - SerializeExtrasAndExtensions(source, o); } static void SerializeGltfNode(const Node &node, detail::json &o) { @@ -7820,107 +7433,11 @@ static void SerializeGltfNode(const Node &node, detail::json &o) { SerializeNumberArrayProperty("weights", node.weights, o); } - SerializeExtrasAndExtensions(node, o); - - // Note(agnat): If the asset was loaded from disk, the node may already - // contain the KHR_lights_punctual extension. If it was constructed in - // memory it does not. In any case we update the JSON property using - // the value from the struct. Last, if the node does not have a light - // reference but the extension is still present, we remove it. - if (node.light != -1) { - detail::json_iterator it; - if (!detail::FindMember(o, "extensions", it)) { - detail::json extensions; - detail::JsonSetObject(extensions); - detail::JsonAddMember(o, "extensions", std::move(extensions)); - detail::FindMember(o, "extensions", it); - } - auto &extensions = detail::GetValue(it); - if (!detail::FindMember(extensions, "KHR_lights_punctual", it)) { - detail::json lights_punctual; - detail::JsonSetObject(lights_punctual); - detail::JsonAddMember(extensions, "KHR_lights_punctual", - std::move(lights_punctual)); - detail::FindMember(extensions, "KHR_lights_punctual", it); - } - SerializeNumberProperty("light", node.light, detail::GetValue(it)); - } else { - // node has no light ref (any longer)... so we clean up - detail::json_iterator ext_it; - if (detail::FindMember(o, "extensions", ext_it)) { - auto &extensions = detail::GetValue(ext_it); - detail::json_iterator lp_it; - if (detail::FindMember(extensions, "KHR_lights_punctual", lp_it)) { - detail::Erase(extensions, lp_it); - } - if (detail::IsEmpty(extensions)) { - detail::Erase(o, ext_it); - } - } - } - - // KHR_audio - if (node.emitter != -1) { - detail::json_iterator it; - if (!detail::FindMember(o, "extensions", it)) { - detail::json extensions; - detail::JsonSetObject(extensions); - detail::JsonAddMember(o, "extensions", std::move(extensions)); - detail::FindMember(o, "extensions", it); - } - auto &extensions = detail::GetValue(it); - if (!detail::FindMember(extensions, "KHR_audio", it)) { - detail::json audio; - detail::JsonSetObject(audio); - detail::JsonAddMember(extensions, "KHR_audio", std::move(audio)); - detail::FindMember(extensions, "KHR_audio", it); - } - SerializeNumberProperty("emitter", node.emitter, detail::GetValue(it)); - } else { - detail::json_iterator ext_it; - if (detail::FindMember(o, "extensions", ext_it)) { - auto &extensions = detail::GetValue(ext_it); - detail::json_iterator lp_it; - if (detail::FindMember(extensions, "KHR_audio", lp_it)) { - detail::Erase(extensions, lp_it); - } - if (detail::IsEmpty(extensions)) { - detail::Erase(o, ext_it); - } - } - } - - // MSFT_lod - if (!node.lods.empty()) { - detail::json_iterator it; - if (!detail::FindMember(o, "extensions", it)) { - detail::json extensions; - detail::JsonSetObject(extensions); - detail::JsonAddMember(o, "extensions", std::move(extensions)); - detail::FindMember(o, "extensions", it); - } - auto &extensions = detail::GetValue(it); - if (!detail::FindMember(extensions, "MSFT_lod", it)) { - detail::json lod; - detail::JsonSetObject(lod); - detail::JsonAddMember(extensions, "MSFT_lod", std::move(lod)); - detail::FindMember(extensions, "MSFT_lod", it); - } - SerializeNumberArrayProperty("ids", node.lods, detail::GetValue(it)); - } else { - detail::json_iterator ext_it; - if (detail::FindMember(o, "extensions", ext_it)) { - auto &extensions = detail::GetValue(ext_it); - detail::json_iterator lp_it; - if (detail::FindMember(extensions, "MSFT_lod", lp_it)) { - detail::Erase(extensions, lp_it); - } - if (detail::IsEmpty(extensions)) { - detail::Erase(o, ext_it); - } - } + if (node.extras.Type() != NULL_TYPE) { + SerializeValue("extras", node.extras, o); } + SerializeExtensionMap(node.extensions, o); if (!node.name.empty()) SerializeStringProperty("name", node.name, o); SerializeNumberArrayProperty("children", node.children, o); } @@ -7939,7 +7456,9 @@ static void SerializeGltfSampler(const Sampler &sampler, detail::json &o) { SerializeNumberProperty("wrapS", sampler.wrapS, o); SerializeNumberProperty("wrapT", sampler.wrapT, o); - SerializeExtrasAndExtensions(sampler, o); + if (sampler.extras.Type() != NULL_TYPE) { + SerializeValue("extras", sampler.extras, o); + } } static void SerializeGltfOrthographicCamera(const OrthographicCamera &camera, @@ -7949,7 +7468,9 @@ static void SerializeGltfOrthographicCamera(const OrthographicCamera &camera, SerializeNumberProperty("xmag", camera.xmag, o); SerializeNumberProperty("ymag", camera.ymag, o); - SerializeExtrasAndExtensions(camera, o); + if (camera.extras.Type() != NULL_TYPE) { + SerializeValue("extras", camera.extras, o); + } } static void SerializeGltfPerspectiveCamera(const PerspectiveCamera &camera, @@ -7964,7 +7485,9 @@ static void SerializeGltfPerspectiveCamera(const PerspectiveCamera &camera, SerializeNumberProperty("yfov", camera.yfov, o); } - SerializeExtrasAndExtensions(camera, o); + if (camera.extras.Type() != NULL_TYPE) { + SerializeValue("extras", camera.extras, o); + } } static void SerializeGltfCamera(const Camera &camera, detail::json &o) { @@ -7985,7 +7508,10 @@ static void SerializeGltfCamera(const Camera &camera, detail::json &o) { // ??? } - SerializeExtrasAndExtensions(camera, o); + if (camera.extras.Type() != NULL_TYPE) { + SerializeValue("extras", camera.extras, o); + } + SerializeExtensionMap(camera.extensions, o); } static void SerializeGltfScene(const Scene &scene, detail::json &o) { @@ -7994,39 +7520,10 @@ static void SerializeGltfScene(const Scene &scene, detail::json &o) { if (scene.name.size()) { SerializeStringProperty("name", scene.name, o); } - SerializeExtrasAndExtensions(scene, o); - - // KHR_audio - if (!scene.audioEmitters.empty()) { - detail::json_iterator it; - if (!detail::FindMember(o, "extensions", it)) { - detail::json extensions; - detail::JsonSetObject(extensions); - detail::JsonAddMember(o, "extensions", std::move(extensions)); - detail::FindMember(o, "extensions", it); - } - auto &extensions = detail::GetValue(it); - if (!detail::FindMember(extensions, "KHR_audio", it)) { - detail::json audio; - detail::JsonSetObject(audio); - detail::JsonAddMember(extensions, "KHR_audio", std::move(audio)); - detail::FindMember(o, "KHR_audio", it); - } - SerializeNumberArrayProperty("emitters", scene.audioEmitters, - detail::GetValue(it)); - } else { - detail::json_iterator ext_it; - if (detail::FindMember(o, "extensions", ext_it)) { - auto &extensions = detail::GetValue(ext_it); - detail::json_iterator lp_it; - if (detail::FindMember(extensions, "KHR_audio", lp_it)) { - detail::Erase(extensions, lp_it); - } - if (detail::IsEmpty(extensions)) { - detail::Erase(o, ext_it); - } - } + if (scene.extras.Type() != NULL_TYPE) { + SerializeValue("extras", scene.extras, o); } + SerializeExtensionMap(scene.extensions, o); } static void SerializeGltfSkin(const Skin &skin, detail::json &o) { @@ -8044,8 +7541,6 @@ static void SerializeGltfSkin(const Skin &skin, detail::json &o) { if (skin.name.size()) { SerializeStringProperty("name", skin.name, o); } - - SerializeExtrasAndExtensions(skin, o); } static void SerializeGltfTexture(const Texture &texture, detail::json &o) { @@ -8058,7 +7553,10 @@ static void SerializeGltfTexture(const Texture &texture, detail::json &o) { if (texture.name.size()) { SerializeStringProperty("name", texture.name, o); } - SerializeExtrasAndExtensions(texture, o); + if (texture.extras.Type() != NULL_TYPE) { + SerializeValue("extras", texture.extras, o); + } + SerializeExtensionMap(texture.extensions, o); } /// @@ -8156,16 +7654,6 @@ static void SerializeGltfModel(const Model *model, detail::json &o) { for (unsigned int i = 0; i < model->nodes.size(); ++i) { detail::json node; SerializeGltfNode(model->nodes[i], node); - - if (detail::JsonIsNull(node)) { - // Issue 457. - // `node` does not have any required parameters, - // so the result may be null(unmodified) when all node parameters - // have default value. - // - // null is not allowed thus we create an empty JSON object. - detail::JsonSetObject(node); - } detail::JsonPushBack(nodes, std::move(node)); } detail::JsonAddMember(o, "nodes", std::move(nodes)); @@ -8183,15 +7671,6 @@ static void SerializeGltfModel(const Model *model, detail::json &o) { for (unsigned int i = 0; i < model->scenes.size(); ++i) { detail::json currentScene; SerializeGltfScene(model->scenes[i], currentScene); - if (detail::JsonIsNull(currentScene)) { - // Issue 464. - // `scene` does not have any required parameters, - // so the result may be null(unmodified) when all scene parameters - // have default value. - // - // null is not allowed thus we create an empty JSON object. - detail::JsonSetObject(currentScene); - } detail::JsonPushBack(scenes, std::move(currentScene)); } detail::JsonAddMember(o, "scenes", std::move(scenes)); @@ -8245,8 +7724,8 @@ static void SerializeGltfModel(const Model *model, detail::json &o) { detail::JsonAddMember(o, "cameras", std::move(cameras)); } - // EXTRAS & EXTENSIONS - SerializeExtrasAndExtensions(*model, o); + // EXTENSIONS + SerializeExtensionMap(model->extensions, o); auto extensionsUsed = model->extensionsUsed; @@ -8270,8 +7749,7 @@ static void SerializeGltfModel(const Model *model, detail::json &o) { } } - detail::JsonAddMember(ext_j, "KHR_lights_punctual", - std::move(khr_lights_cmn)); + detail::JsonAddMember(ext_j, "KHR_lights_punctual", std::move(khr_lights_cmn)); detail::JsonAddMember(o, "extensions", std::move(ext_j)); @@ -8289,60 +7767,20 @@ static void SerializeGltfModel(const Model *model, detail::json &o) { } } - // KHR_audio - if (!model->audioEmitters.empty() || !model->audioSources.empty()) { - detail::json emitters; - detail::JsonReserveArray(emitters, model->audioEmitters.size()); - for (unsigned int i = 0; i < model->audioEmitters.size(); ++i) { - detail::json emitter; - SerializeGltfAudioEmitter(model->audioEmitters[i], emitter); - detail::JsonPushBack(emitters, std::move(emitter)); - } - detail::json khr_audio_cmn; - detail::JsonAddMember(khr_audio_cmn, "emitters", std::move(emitters)); - - detail::json sources; - detail::JsonReserveArray(sources, model->audioSources.size()); - for (unsigned int i = 0; i < model->audioSources.size(); ++i) { - detail::json source; - SerializeGltfAudioSource(model->audioSources[i], source); - detail::JsonPushBack(sources, std::move(source)); - } - detail::JsonAddMember(khr_audio_cmn, "sources", std::move(sources)); - - detail::json ext_j; - { - detail::json_const_iterator it; - if (detail::FindMember(o, "extensions", it)) { - detail::JsonAssign(ext_j, detail::GetValue(it)); - } - } - - detail::JsonAddMember(ext_j, "KHR_audio", std::move(khr_audio_cmn)); - - detail::JsonAddMember(o, "extensions", std::move(ext_j)); - - // Also add "KHR_audio" to `extensionsUsed` - { - auto has_khr_audio = std::find_if( - extensionsUsed.begin(), extensionsUsed.end(), - [](const std::string &s) { return (s.compare("KHR_audio") == 0); }); - - if (has_khr_audio == extensionsUsed.end()) { - extensionsUsed.push_back("KHR_audio"); - } - } - } - // Extensions used if (extensionsUsed.size()) { SerializeStringArrayProperty("extensionsUsed", extensionsUsed, o); } + + // EXTRAS + if (model->extras.Type() != NULL_TYPE) { + SerializeValue("extras", model->extras, o); + } } static bool WriteGltfStream(std::ostream &stream, const std::string &content) { stream << content << std::endl; - return stream.good(); + return true; } static bool WriteGltfFile(const std::string &output, @@ -8425,8 +7863,8 @@ static bool WriteBinaryGltfStream(std::ostream &stream, } } - stream.flush(); - return stream.good(); + // TODO: Check error on stream.write + return true; } static bool WriteBinaryGltfFile(const std::string &output, @@ -8482,7 +7920,7 @@ bool TinyGLTF::WriteGltfSceneToStream(const Model *model, std::ostream &stream, for (unsigned int i = 0; i < model->images.size(); ++i) { detail::json image; - std::string dummystring; + std::string dummystring = ""; // UpdateImageObject need baseDir but only uses it if embeddedImages is // enabled, since we won't write separate images when writing to a stream // we @@ -8499,11 +7937,9 @@ bool TinyGLTF::WriteGltfSceneToStream(const Model *model, std::ostream &stream, } if (writeBinary) { - return WriteBinaryGltfStream(stream, detail::JsonToString(output), - binBuffer); + return WriteBinaryGltfStream(stream, detail::JsonToString(output), binBuffer); } else { - return WriteGltfStream(stream, - detail::JsonToString(output, prettyPrint ? 2 : -1)); + return WriteGltfStream(stream, detail::JsonToString(output, prettyPrint ? 2 : -1)); } } @@ -8607,11 +8043,9 @@ bool TinyGLTF::WriteGltfSceneToFile(const Model *model, } if (writeBinary) { - return WriteBinaryGltfFile(filename, detail::JsonToString(output), - binBuffer); + return WriteBinaryGltfFile(filename, detail::JsonToString(output), binBuffer); } else { - return WriteGltfFile(filename, - detail::JsonToString(output, (prettyPrint ? 2 : -1))); + return WriteGltfFile(filename, detail::JsonToString(output, (prettyPrint ? 2 : -1))); } } diff --git a/extern/xdnd/xdnd.h b/extern/xdnd/xdnd.h index a9979b706df..c903b51c8d0 100644 --- a/extern/xdnd/xdnd.h +++ b/extern/xdnd/xdnd.h @@ -26,11 +26,7 @@ extern "C" { /* you can set this to either 2 (which support 0 and 1 as well) or 3 */ /* #define XDND_VERSION 2 */ - -/* NOTE(@ideasman42): Use version 5 otherwise the chrome browser can't drop URL or text data. - * Ideally all aspects of the updated specification would also be supported although none seem - * essential for use in Blender, see: https://www.freedesktop.org/wiki/Specifications/XDND/ */ -#define XDND_VERSION 5 +#define XDND_VERSION 3 /* XdndEnter */ diff --git a/intern/clog/CLG_log.h b/intern/clog/CLG_log.h index 8fc887cb1ce..04bd03a6563 100644 --- a/intern/clog/CLG_log.h +++ b/intern/clog/CLG_log.h @@ -176,6 +176,19 @@ int CLG_color_support_get(CLG_LogRef *clg_ref); } \ ((void)0) +#define CLOG_STR_AT_SEVERITY_N(clg_ref, severity, verbose_level, str) \ + { \ + CLG_LogType *_lg_ty = CLOG_ENSURE(clg_ref); \ + if (((_lg_ty->flag & CLG_FLAG_USE) && (_lg_ty->level >= verbose_level)) || \ + (severity >= CLG_SEVERITY_WARN)) \ + { \ + const char *_str = str; \ + CLG_log_str(_lg_ty, severity, __FILE__ ":" STRINGIFY(__LINE__), __func__, _str); \ + MEM_freeN((void *)_str); \ + } \ + } \ + ((void)0) + #define CLOG_INFO(clg_ref, level, ...) \ CLOG_AT_SEVERITY(clg_ref, CLG_SEVERITY_INFO, level, __VA_ARGS__) #define CLOG_WARN(clg_ref, ...) CLOG_AT_SEVERITY(clg_ref, CLG_SEVERITY_WARN, 0, __VA_ARGS__) @@ -188,6 +201,13 @@ int CLG_color_support_get(CLG_LogRef *clg_ref); #define CLOG_STR_ERROR(clg_ref, str) CLOG_STR_AT_SEVERITY(clg_ref, CLG_SEVERITY_ERROR, 0, str) #define CLOG_STR_FATAL(clg_ref, str) CLOG_STR_AT_SEVERITY(clg_ref, CLG_SEVERITY_FATAL, 0, str) +/* Allocated string which is immediately freed. */ +#define CLOG_STR_INFO_N(clg_ref, level, str) \ + CLOG_STR_AT_SEVERITY_N(clg_ref, CLG_SEVERITY_INFO, level, str) +#define CLOG_STR_WARN_N(clg_ref, str) CLOG_STR_AT_SEVERITY_N(clg_ref, CLG_SEVERITY_WARN, 0, str) +#define CLOG_STR_ERROR_N(clg_ref, str) CLOG_STR_AT_SEVERITY_N(clg_ref, CLG_SEVERITY_ERROR, 0, str) +#define CLOG_STR_FATAL_N(clg_ref, str) CLOG_STR_AT_SEVERITY_N(clg_ref, CLG_SEVERITY_FATAL, 0, str) + #ifdef __cplusplus } #endif diff --git a/intern/cycles/CMakeLists.txt b/intern/cycles/CMakeLists.txt index 3442ab285be..080d2ef79dc 100644 --- a/intern/cycles/CMakeLists.txt +++ b/intern/cycles/CMakeLists.txt @@ -26,10 +26,10 @@ endif() # Build Flags # todo: this code could be refactored a bit to avoid duplication -# note: CXX_HAS_SSE42 is needed in case passing SSE flags fails altogether (gcc-arm) +# note: CXX_HAS_SSE is needed in case passing SSE flags fails altogether (gcc-arm) if(WITH_CYCLES_NATIVE_ONLY) - set(CXX_HAS_SSE42 FALSE) + set(CXX_HAS_SSE FALSE) set(CXX_HAS_AVX FALSE) set(CXX_HAS_AVX2 FALSE) add_definitions( @@ -64,21 +64,12 @@ if(WITH_CYCLES_NATIVE_ONLY) endif() set(CYCLES_KERNEL_FLAGS "${MSVC_NATIVE_ARCH_FLAGS}") endif() -elseif(WIN32 AND MSVC AND SUPPORT_NEON_BUILD AND SSE2NEON_FOUND) +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) - set(CYCLES_KERNEL_FLAGS "/fp:fast -D_CRT_SECURE_NO_WARNINGS /GS-") - string(APPEND CMAKE_CXX_FLAGS " ${CYCLES_KERNEL_FLAGS}") - string(APPEND CMAKE_CXX_FLAGS_RELEASE " /Ox") - string(APPEND CMAKE_CXX_FLAGS_RELWITHDEBINFO " /Ox") - string(APPEND CMAKE_CXX_FLAGS_MINSIZEREL " /Ox") -elseif(NOT WITH_CPU_SIMD OR (SUPPORT_NEON_BUILD AND SSE2NEON_FOUND)) - set(CXX_HAS_SSE42 FALSE) - set(CXX_HAS_AVX FALSE) - set(CXX_HAS_AVX2 FALSE) elseif(WIN32 AND MSVC AND NOT CMAKE_CXX_COMPILER_ID MATCHES "Clang") - set(CXX_HAS_SSE42 TRUE) + set(CXX_HAS_SSE TRUE) set(CXX_HAS_AVX TRUE) set(CXX_HAS_AVX2 TRUE) @@ -95,8 +86,7 @@ elseif(WIN32 AND MSVC AND NOT CMAKE_CXX_COMPILER_ID MATCHES "Clang") # grained control and the speedup we get here is too big to ignore. set(CYCLES_KERNEL_FLAGS "/fp:fast -D_CRT_SECURE_NO_WARNINGS /GS-") - # "jumptablerdata" improves performance when there is contention in large switch statements - # such as in `svm.h`. + # "jumptablerdata" improves performance when there is contention in large switch statements such as in svm.h # This flag is supported starting with MSVC 17.7 preview 3: # https://learn.microsoft.com/en-us/cpp/build/reference/jump-table-rdata if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 19.37.32820) @@ -105,10 +95,12 @@ elseif(WIN32 AND MSVC AND NOT CMAKE_CXX_COMPILER_ID MATCHES "Clang") # there is no /arch:SSE3, but intrinsics are available anyway if(CMAKE_CL_64) - set(CYCLES_SSE42_KERNEL_FLAGS "${CYCLES_KERNEL_FLAGS}") + set(CYCLES_SSE2_KERNEL_FLAGS "${CYCLES_KERNEL_FLAGS}") + set(CYCLES_SSE41_KERNEL_FLAGS "${CYCLES_KERNEL_FLAGS}") set(CYCLES_AVX2_KERNEL_FLAGS "${CYCLES_AVX2_ARCH_FLAGS} ${CYCLES_KERNEL_FLAGS}") else() - set(CYCLES_SSE42_KERNEL_FLAGS "/arch:SSE2 ${CYCLES_KERNEL_FLAGS}") + set(CYCLES_SSE2_KERNEL_FLAGS "/arch:SSE2 ${CYCLES_KERNEL_FLAGS}") + set(CYCLES_SSE41_KERNEL_FLAGS "/arch:SSE2 ${CYCLES_KERNEL_FLAGS}") set(CYCLES_AVX2_KERNEL_FLAGS "${CYCLES_AVX2_ARCH_FLAGS} ${CYCLES_KERNEL_FLAGS}") endif() @@ -117,7 +109,7 @@ elseif(WIN32 AND MSVC AND NOT CMAKE_CXX_COMPILER_ID MATCHES "Clang") string(APPEND CMAKE_CXX_FLAGS_RELWITHDEBINFO " /Ox") string(APPEND CMAKE_CXX_FLAGS_MINSIZEREL " /Ox") elseif(CMAKE_COMPILER_IS_GNUCC OR (CMAKE_CXX_COMPILER_ID MATCHES "Clang")) - check_cxx_compiler_flag(-msse4.2 CXX_HAS_SSE42) + check_cxx_compiler_flag(-msse CXX_HAS_SSE) check_cxx_compiler_flag(-mavx CXX_HAS_AVX) check_cxx_compiler_flag(-mavx2 CXX_HAS_AVX2) @@ -135,40 +127,52 @@ elseif(CMAKE_COMPILER_IS_GNUCC OR (CMAKE_CXX_COMPILER_ID MATCHES "Clang")) string(APPEND CYCLES_KERNEL_FLAGS " -fno-rounding-math") endif() - if(CXX_HAS_SSE42) + if(CXX_HAS_SSE) if(CMAKE_COMPILER_IS_GNUCC) string(APPEND CYCLES_KERNEL_FLAGS " -mfpmath=sse") endif() - set(CYCLES_SSE42_KERNEL_FLAGS "${CYCLES_KERNEL_FLAGS} -msse -msse2 -msse3 -mssse3 -msse4.1 -msse4.2") + set(CYCLES_SSE2_KERNEL_FLAGS "${CYCLES_KERNEL_FLAGS} -msse -msse2") + set(CYCLES_SSE41_KERNEL_FLAGS "${CYCLES_SSE2_KERNEL_FLAGS} -msse3 -mssse3 -msse4.1") if(CXX_HAS_AVX2) - set(CYCLES_AVX2_KERNEL_FLAGS "${CYCLES_SSE42_KERNEL_FLAGS} -mavx -mavx2 -mfma -mlzcnt -mbmi -mbmi2 -mf16c") + set(CYCLES_AVX2_KERNEL_FLAGS "${CYCLES_SSE41_KERNEL_FLAGS} -mavx -mavx2 -mfma -mlzcnt -mbmi -mbmi2 -mf16c") endif() - - string(APPEND CMAKE_CXX_FLAGS " ${CYCLES_SSE42_KERNEL_FLAGS}") - else() - string(APPEND CMAKE_CXX_FLAGS " ${CYCLES_KERNEL_FLAGS}") endif() -elseif(WIN32 AND CMAKE_CXX_COMPILER_ID STREQUAL "Intel") - check_cxx_compiler_flag(/QxSSE4.2 CXX_HAS_SSE42) + string(APPEND CMAKE_CXX_FLAGS " ${CYCLES_KERNEL_FLAGS}") +elseif(WIN32 AND CMAKE_CXX_COMPILER_ID MATCHES "Intel") + check_cxx_compiler_flag(/QxSSE2 CXX_HAS_SSE) check_cxx_compiler_flag(/arch:AVX CXX_HAS_AVX) check_cxx_compiler_flag(/QxCORE-AVX2 CXX_HAS_AVX2) - if(CXX_HAS_SSE42) - set(CYCLES_SSE42_KERNEL_FLAGS "/QxSSE4.2") + if(CXX_HAS_SSE) + set(CYCLES_SSE2_KERNEL_FLAGS "/QxSSE2") + set(CYCLES_SSE41_KERNEL_FLAGS "/QxSSE4.1") if(CXX_HAS_AVX2) set(CYCLES_AVX2_KERNEL_FLAGS "/QxCORE-AVX2") endif() endif() -elseif(CMAKE_CXX_COMPILER_ID STREQUAL "Intel") - check_cxx_compiler_flag(-xsse4.2 CXX_HAS_SSE42) +elseif(CMAKE_CXX_COMPILER_ID MATCHES "Intel") + if(APPLE) + # ICC does not support SSE2 flag on MacOSX + check_cxx_compiler_flag(-xssse3 CXX_HAS_SSE) + else() + check_cxx_compiler_flag(-xsse2 CXX_HAS_SSE) + endif() + check_cxx_compiler_flag(-xavx CXX_HAS_AVX) check_cxx_compiler_flag(-xcore-avx2 CXX_HAS_AVX2) - if(CXX_HAS_SSE42) - set(CYCLES_SSE42_KERNEL_FLAGS "-xsse4.2") + if(CXX_HAS_SSE) + if(APPLE) + # ICC does not support SSE2 flag on MacOSX + set(CYCLES_SSE2_KERNEL_FLAGS "-xssse3") + else() + set(CYCLES_SSE2_KERNEL_FLAGS "-xsse2") + endif() + + set(CYCLES_SSE41_KERNEL_FLAGS "-xsse4.1") if(CXX_HAS_AVX2) set(CYCLES_AVX2_KERNEL_FLAGS "-xcore-avx2") @@ -176,9 +180,10 @@ elseif(CMAKE_CXX_COMPILER_ID STREQUAL "Intel") endif() endif() -if(CXX_HAS_SSE42) +if(CXX_HAS_SSE) add_definitions( - -DWITH_KERNEL_SSE42 + -DWITH_KERNEL_SSE2 + -DWITH_KERNEL_SSE41 ) endif() diff --git a/intern/cycles/blender/addon/properties.py b/intern/cycles/blender/addon/properties.py index 0b8b5ca662e..9a7fc4911fd 100644 --- a/intern/cycles/blender/addon/properties.py +++ b/intern/cycles/blender/addon/properties.py @@ -888,6 +888,17 @@ class CyclesRenderSettings(bpy.types.PropertyGroup): unit='LENGTH' ) + motion_blur_position: EnumProperty( + name="Motion Blur Position", + default='CENTER', + description="Offset for the shutter's time interval, allows to change the motion blur trails", + items=( + ('START', "Start on Frame", "The shutter opens at the current frame"), + ('CENTER', "Center on Frame", "The shutter is open during the current frame"), + ('END', "End on Frame", "The shutter closes at the current frame"), + ), + ) + rolling_shutter_type: EnumProperty( name="Shutter Type", default='NONE', @@ -969,7 +980,8 @@ class CyclesRenderSettings(bpy.types.PropertyGroup): return _cycles.debug_flags_update(scene) debug_use_cpu_avx2: BoolProperty(name="AVX2", default=True) - debug_use_cpu_sse42: BoolProperty(name="SSE42", default=True) + debug_use_cpu_sse41: BoolProperty(name="SSE41", default=True) + debug_use_cpu_sse2: BoolProperty(name="SSE2", default=True) debug_bvh_layout: EnumProperty( name="BVH Layout", items=enum_bvh_layouts, diff --git a/intern/cycles/blender/addon/ui.py b/intern/cycles/blender/addon/ui.py index b3e58905996..b903eda2281 100644 --- a/intern/cycles/blender/addon/ui.py +++ b/intern/cycles/blender/addon/ui.py @@ -657,7 +657,7 @@ class CYCLES_RENDER_PT_motion_blur(CyclesButtonsPanel, Panel): layout.active = rd.use_motion_blur col = layout.column() - col.prop(rd, "motion_blur_position", text="Position") + col.prop(cscene, "motion_blur_position", text="Position") col.prop(rd, "motion_blur_shutter") col.separator() col.prop(cscene, "rolling_shutter_type", text="Rolling Shutter") @@ -931,7 +931,6 @@ class CYCLES_RENDER_PT_override(CyclesButtonsPanel, Panel): view_layer = context.view_layer layout.prop(view_layer, "material_override") - layout.prop(view_layer, "world_override") layout.prop(view_layer, "samples") @@ -2238,7 +2237,8 @@ class CYCLES_RENDER_PT_debug(CyclesDebugButtonsPanel, Panel): col = layout.column(heading="CPU") row = col.row(align=True) - row.prop(cscene, "debug_use_cpu_sse42", toggle=True) + row.prop(cscene, "debug_use_cpu_sse2", toggle=True) + row.prop(cscene, "debug_use_cpu_sse41", toggle=True) row.prop(cscene, "debug_use_cpu_avx2", toggle=True) col.prop(cscene, "debug_bvh_layout", text="BVH") diff --git a/intern/cycles/blender/camera.cpp b/intern/cycles/blender/camera.cpp index 59a129ae567..b743d7815ae 100644 --- a/intern/cycles/blender/camera.cpp +++ b/intern/cycles/blender/camera.cpp @@ -577,21 +577,6 @@ static void blender_camera_sync(Camera *cam, /* Sync Render Camera */ -static MotionPosition blender_motion_blur_position_type_to_cycles( - const BL::RenderSettings::motion_blur_position_enum type) -{ - switch (type) { - case BL::RenderSettings::motion_blur_position_START: - return MOTION_POSITION_START; - case BL::RenderSettings::motion_blur_position_CENTER: - return MOTION_POSITION_CENTER; - case BL::RenderSettings::motion_blur_position_END: - return MOTION_POSITION_END; - } - /* Could happen if loading a newer file that has an unsupported type. */ - return MOTION_POSITION_CENTER; -} - void BlenderSync::sync_camera(BL::RenderSettings &b_render, BL::Object &b_override, int width, @@ -605,13 +590,13 @@ void BlenderSync::sync_camera(BL::RenderSettings &b_render, bcam.pixelaspect.x = b_render.pixel_aspect_x(); bcam.pixelaspect.y = b_render.pixel_aspect_y(); bcam.shuttertime = b_render.motion_blur_shutter(); - bcam.motion_position = blender_motion_blur_position_type_to_cycles( - b_render.motion_blur_position()); BL::CurveMapping b_shutter_curve(b_render.motion_blur_shutter_curve()); curvemapping_to_array(b_shutter_curve, bcam.shutter_curve, RAMP_TABLE_SIZE); PointerRNA cscene = RNA_pointer_get(&b_scene.ptr, "cycles"); + bcam.motion_position = (MotionPosition)get_enum( + cscene, "motion_blur_position", MOTION_NUM_POSITIONS, MOTION_POSITION_CENTER); bcam.rolling_shutter_type = (Camera::RollingShutterType)get_enum( cscene, "rolling_shutter_type", diff --git a/intern/cycles/blender/light.cpp b/intern/cycles/blender/light.cpp index 08898f0e440..6eaa4529250 100644 --- a/intern/cycles/blender/light.cpp +++ b/intern/cycles/blender/light.cpp @@ -166,7 +166,7 @@ void BlenderSync::sync_light(BL::Object &b_parent, void BlenderSync::sync_background_light(BL::SpaceView3D &b_v3d, bool use_portal) { - BL::World b_world = view_layer.world_override ? view_layer.world_override : b_scene.world(); + BL::World b_world = b_scene.world(); if (b_world) { PointerRNA cworld = RNA_pointer_get(&b_world.ptr, "cycles"); diff --git a/intern/cycles/blender/object.cpp b/intern/cycles/blender/object.cpp index 54d88477bc8..3bdefd47b62 100644 --- a/intern/cycles/blender/object.cpp +++ b/intern/cycles/blender/object.cpp @@ -25,7 +25,7 @@ #include "util/log.h" #include "util/task.h" -#include "BKE_duplilist.hh" +#include "BKE_duplilist.h" CCL_NAMESPACE_BEGIN diff --git a/intern/cycles/blender/python.cpp b/intern/cycles/blender/python.cpp index ace67591250..9320b992b67 100644 --- a/intern/cycles/blender/python.cpp +++ b/intern/cycles/blender/python.cpp @@ -65,7 +65,8 @@ static void debug_flags_sync_from_scene(BL::Scene b_scene) PointerRNA cscene = RNA_pointer_get(&b_scene.ptr, "cycles"); /* Synchronize CPU flags. */ flags.cpu.avx2 = get_boolean(cscene, "debug_use_cpu_avx2"); - flags.cpu.sse42 = get_boolean(cscene, "debug_use_cpu_sse42"); + flags.cpu.sse41 = get_boolean(cscene, "debug_use_cpu_sse41"); + flags.cpu.sse2 = get_boolean(cscene, "debug_use_cpu_sse2"); flags.cpu.bvh_layout = (BVHLayout)get_enum(cscene, "debug_bvh_layout"); /* Synchronize CUDA flags. */ flags.cuda.adaptive_compile = get_boolean(cscene, "debug_use_cuda_adaptive_compile"); @@ -614,12 +615,14 @@ static PyObject *osl_update_node_func(PyObject * /*self*/, PyObject *args) if (!found_existing) { /* Create new socket. */ - BL::NodeSocket b_sock = - (param->isoutput) ? - b_node.outputs.create( - b_data, socket_type.c_str(), param_label.c_str(), param->name.c_str(), false) : - b_node.inputs.create( - b_data, socket_type.c_str(), param_label.c_str(), param->name.c_str(), false); + BL::NodeSocket b_sock = (param->isoutput) ? b_node.outputs.create(b_data, + socket_type.c_str(), + param_label.c_str(), + param->name.c_str()) : + b_node.inputs.create(b_data, + socket_type.c_str(), + param_label.c_str(), + param->name.c_str()); /* set default value */ if (data_type == BL::NodeSocket::type_VALUE) { diff --git a/intern/cycles/blender/shader.cpp b/intern/cycles/blender/shader.cpp index 5600da3c143..998be73d555 100644 --- a/intern/cycles/blender/shader.cpp +++ b/intern/cycles/blender/shader.cpp @@ -23,7 +23,7 @@ #include "util/string.h" #include "util/task.h" -#include "BKE_duplilist.hh" +#include "BKE_duplilist.h" CCL_NAMESPACE_BEGIN @@ -1064,7 +1064,7 @@ static ShaderNode *add_node(Scene *scene, else if (b_node.is_a(&RNA_ShaderNodeOutputAOV)) { BL::ShaderNodeOutputAOV b_aov_node(b_node); OutputAOVNode *aov = graph->create_node(); - aov->set_name(ustring(b_aov_node.aov_name())); + aov->set_name(ustring(b_aov_node.name())); node = aov; } @@ -1592,7 +1592,7 @@ void BlenderSync::sync_world(BL::Depsgraph &b_depsgraph, BL::SpaceView3D &b_v3d, Integrator *integrator = scene->integrator; PointerRNA cscene = RNA_pointer_get(&b_scene.ptr, "cycles"); - BL::World b_world = view_layer.world_override ? view_layer.world_override : b_scene.world(); + BL::World b_world = b_scene.world(); BlenderViewportParameters new_viewport_parameters(b_v3d, use_developer_ui); diff --git a/intern/cycles/blender/sync.cpp b/intern/cycles/blender/sync.cpp index 13aa5f4d13d..1e15c13f187 100644 --- a/intern/cycles/blender/sync.cpp +++ b/intern/cycles/blender/sync.cpp @@ -561,8 +561,6 @@ void BlenderSync::sync_view_layer(BL::ViewLayer &b_view_layer) /* Material override. */ view_layer.material_override = b_view_layer.material_override(); - /* World override. */ - view_layer.world_override = b_view_layer.world_override(); /* Sample override. */ PointerRNA cscene = RNA_pointer_get(&b_scene.ptr, "cycles"); diff --git a/intern/cycles/blender/sync.h b/intern/cycles/blender/sync.h index feaef01f743..da7567c8681 100644 --- a/intern/cycles/blender/sync.h +++ b/intern/cycles/blender/sync.h @@ -253,7 +253,6 @@ class BlenderSync { struct RenderLayerInfo { RenderLayerInfo() : material_override(PointerRNA_NULL), - world_override(PointerRNA_NULL), use_background_shader(true), use_surfaces(true), use_hair(true), @@ -266,7 +265,6 @@ class BlenderSync { string name; BL::Material material_override; - BL::World world_override; bool use_background_shader; bool use_surfaces; bool use_hair; diff --git a/intern/cycles/blender/util.h b/intern/cycles/blender/util.h index 7277c45c17e..3e950f795bc 100644 --- a/intern/cycles/blender/util.h +++ b/intern/cycles/blender/util.h @@ -70,7 +70,7 @@ static inline BL::Mesh object_to_mesh(BL::BlendData & /*data*/, bool /*calc_undeformed*/, Mesh::SubdivisionType subdivision_type) { - /* TODO: make this work with copy-on-evaluation, modifiers are already evaluated. */ + /* TODO: make this work with copy-on-write, modifiers are already evaluated. */ #if 0 bool subsurf_mod_show_render = false; bool subsurf_mod_show_viewport = false; diff --git a/intern/cycles/device/cpu/device.cpp b/intern/cycles/device/cpu/device.cpp index 02db1cf3601..5d0959d5e6d 100644 --- a/intern/cycles/device/cpu/device.cpp +++ b/intern/cycles/device/cpu/device.cpp @@ -46,7 +46,8 @@ void device_cpu_info(vector &devices) string device_cpu_capabilities() { string capabilities = ""; - capabilities += system_cpu_support_sse42() ? "SSE42 " : ""; + capabilities += system_cpu_support_sse2() ? "SSE2 " : ""; + capabilities += system_cpu_support_sse41() ? "SSE41 " : ""; capabilities += system_cpu_support_avx2() ? "AVX2" : ""; if (capabilities[capabilities.size() - 1] == ' ') { capabilities.resize(capabilities.size() - 1); diff --git a/intern/cycles/device/cpu/kernel.cpp b/intern/cycles/device/cpu/kernel.cpp index af8e27560da..8718820a0c8 100644 --- a/intern/cycles/device/cpu/kernel.cpp +++ b/intern/cycles/device/cpu/kernel.cpp @@ -9,7 +9,8 @@ CCL_NAMESPACE_BEGIN #define KERNEL_FUNCTIONS(name) \ - KERNEL_NAME_EVAL(cpu, name), KERNEL_NAME_EVAL(cpu_sse42, name), KERNEL_NAME_EVAL(cpu_avx2, name) + KERNEL_NAME_EVAL(cpu, name), KERNEL_NAME_EVAL(cpu_sse2, name), \ + KERNEL_NAME_EVAL(cpu_sse41, name), KERNEL_NAME_EVAL(cpu_avx2, name) #define REGISTER_KERNEL(name) name(KERNEL_FUNCTIONS(name)) #define REGISTER_KERNEL_FILM_CONVERT(name) \ diff --git a/intern/cycles/device/cpu/kernel_function.h b/intern/cycles/device/cpu/kernel_function.h index edd920e40b8..899849674b3 100644 --- a/intern/cycles/device/cpu/kernel_function.h +++ b/intern/cycles/device/cpu/kernel_function.h @@ -13,14 +13,15 @@ CCL_NAMESPACE_BEGIN * * Provides a function-call-like API which gets routed to the most suitable implementation. * - * For example, on a computer which only has SSE4.2 the kernel_sse42 will be used. */ + * For example, on a computer which only has SSE4.1 the kernel_sse41 will be used. */ template class CPUKernelFunction { public: CPUKernelFunction(FunctionType kernel_default, - FunctionType kernel_sse42, + FunctionType kernel_sse2, + FunctionType kernel_sse41, FunctionType kernel_avx2) { - kernel_info_ = get_best_kernel_info(kernel_default, kernel_sse42, kernel_avx2); + kernel_info_ = get_best_kernel_info(kernel_default, kernel_sse2, kernel_sse41, kernel_avx2); } template inline auto operator()(Args... args) const @@ -54,11 +55,13 @@ template class CPUKernelFunction { }; KernelInfo get_best_kernel_info(FunctionType kernel_default, - FunctionType kernel_sse42, + FunctionType kernel_sse2, + FunctionType kernel_sse41, FunctionType kernel_avx2) { /* Silence warnings about unused variables when compiling without some architectures. */ - (void)kernel_sse42; + (void)kernel_sse2; + (void)kernel_sse41; (void)kernel_avx2; #ifdef WITH_CYCLES_OPTIMIZED_KERNEL_AVX2 @@ -67,9 +70,15 @@ template class CPUKernelFunction { } #endif -#ifdef WITH_CYCLES_OPTIMIZED_KERNEL_SSE42 - if (DebugFlags().cpu.has_sse42() && system_cpu_support_sse42()) { - return KernelInfo("SSE4.2", kernel_sse42); +#ifdef WITH_CYCLES_OPTIMIZED_KERNEL_SSE41 + if (DebugFlags().cpu.has_sse41() && system_cpu_support_sse41()) { + return KernelInfo("SSE4.1", kernel_sse41); + } +#endif + +#ifdef WITH_CYCLES_OPTIMIZED_KERNEL_SSE2 + if (DebugFlags().cpu.has_sse2() && system_cpu_support_sse2()) { + return KernelInfo("SSE2", kernel_sse2); } #endif diff --git a/intern/cycles/device/cuda/kernel.cpp b/intern/cycles/device/cuda/kernel.cpp index ccf6e0200c3..3768e3daade 100644 --- a/intern/cycles/device/cuda/kernel.cpp +++ b/intern/cycles/device/cuda/kernel.cpp @@ -54,4 +54,4 @@ bool CUDADeviceKernels::available(DeviceKernel kernel) const CCL_NAMESPACE_END -#endif /* WITH_CUDA */ +#endif /* WITH_CUDA*/ diff --git a/intern/cycles/device/denoise.h b/intern/cycles/device/denoise.h index ad7a31fea60..ca5f651bb05 100644 --- a/intern/cycles/device/denoise.h +++ b/intern/cycles/device/denoise.h @@ -70,7 +70,8 @@ class DenoiseParams : public Node { bool temporally_stable = false; /* If true, then allow, if supported, OpenImageDenoise to use GPU device. - * If false, then OpenImageDenoise will always use CPU regardless of GPU device presence. */ + * If false, then OpenImageDenoise will always use CPU regardless of GPU device + * precense. */ bool use_gpu = true; DenoiserPrefilter prefilter = DENOISER_PREFILTER_FAST; diff --git a/intern/cycles/device/device.cpp b/intern/cycles/device/device.cpp index 0a2378eb679..d871149bd87 100644 --- a/intern/cycles/device/device.cpp +++ b/intern/cycles/device/device.cpp @@ -208,6 +208,27 @@ vector Device::available_types() return types; } +static void device_oidn_init_once() +{ + static bool initialized = false; + + if (initialized == false) { + /* Disable OIDN for HIP until it has been tested to be stable on more systems. + * + * In older drivers with an integrated GPU, this may crash with message: + * "hipErrorNoBinaryForGpu: Unable to find code object for all current devices". + * + * This also affects systems which have for example an NVIDIA GPU as OIDN + * initializes all device types together. */ +#ifdef _WIN32 + _putenv_s("OIDN_DEVICE_HIP", "0"); +#else + setenv("OIDN_DEVICE_HIP", "0", true); +#endif + initialized = true; + } +} + vector Device::available_devices(uint mask) { /* Lazy initialize devices. On some platforms OpenCL or CUDA drivers can @@ -216,6 +237,8 @@ vector Device::available_devices(uint mask) thread_scoped_lock lock(device_mutex); vector devices; + device_oidn_init_once(); + #if defined(WITH_CUDA) || defined(WITH_OPTIX) if (mask & (DEVICE_MASK_CUDA | DEVICE_MASK_OPTIX)) { if (!(devices_initialized_mask & DEVICE_MASK_CUDA)) { @@ -314,6 +337,8 @@ string Device::device_capabilities(uint mask) thread_scoped_lock lock(device_mutex); string capabilities = ""; + device_oidn_init_once(); + if (mask & DEVICE_MASK_CPU) { capabilities += "\nCPU device capabilities: "; capabilities += device_cpu_capabilities() + "\n"; diff --git a/intern/cycles/device/hip/kernel.cpp b/intern/cycles/device/hip/kernel.cpp index 35f7deb6071..089e1ac50ff 100644 --- a/intern/cycles/device/hip/kernel.cpp +++ b/intern/cycles/device/hip/kernel.cpp @@ -54,4 +54,4 @@ bool HIPDeviceKernels::available(DeviceKernel kernel) const CCL_NAMESPACE_END -#endif /* WITH_HIP */ +#endif /* WITH_HIP*/ diff --git a/intern/cycles/device/metal/kernel.mm b/intern/cycles/device/metal/kernel.mm index b9da74e2ff3..336fe30d9d8 100644 --- a/intern/cycles/device/metal/kernel.mm +++ b/intern/cycles/device/metal/kernel.mm @@ -903,4 +903,4 @@ bool MetalDeviceKernels::is_benchmark_warmup() CCL_NAMESPACE_END -#endif /* WITH_METAL */ +#endif /* WITH_METAL*/ diff --git a/intern/cycles/device/metal/util.h b/intern/cycles/device/metal/util.h index 902ab074c9f..96740888b66 100644 --- a/intern/cycles/device/metal/util.h +++ b/intern/cycles/device/metal/util.h @@ -32,7 +32,7 @@ enum AppleGPUArchitecture { APPLE_M2_BIG, APPLE_M3, /* Keep APPLE_UNKNOWN at the end of this enum to ensure that unknown future architectures get - * the most recent defaults when using comparison operators. */ + the most recent defaults when using comparison operators. */ APPLE_UNKNOWN, }; diff --git a/intern/cycles/integrator/denoiser_oidn_gpu.cpp b/intern/cycles/integrator/denoiser_oidn_gpu.cpp index 5dea072a424..a452cbe4f62 100644 --- a/intern/cycles/integrator/denoiser_oidn_gpu.cpp +++ b/intern/cycles/integrator/denoiser_oidn_gpu.cpp @@ -28,33 +28,6 @@ CCL_NAMESPACE_BEGIN -static const char *oidn_device_type_to_string(const OIDNDeviceType type) -{ - switch (type) { - case OIDN_DEVICE_TYPE_DEFAULT: - return "DEFAULT"; - case OIDN_DEVICE_TYPE_CPU: - return "CPU"; - - /* The initial GPU support was added in OIDN 2.0. */ -# if OIDN_VERSION_MAJOR >= 2 - case OIDN_DEVICE_TYPE_SYCL: - return "SYCL"; - case OIDN_DEVICE_TYPE_CUDA: - return "CUDA"; - case OIDN_DEVICE_TYPE_HIP: - return "HIP"; -# endif - - /* The Metal support was added in OIDN 2.2.*/ -# if (OIDN_VERSION_MAJOR > 2) || ((OIDN_VERSION_MAJOR == 2) && (OIDN_VERSION_MINOR >= 2)) - case OIDN_DEVICE_TYPE_METAL: - return "METAL"; -# endif - } - return "UNKNOWN"; -} - bool OIDNDenoiserGPU::is_device_supported(const DeviceInfo &device) { if (device.type == DEVICE_MULTI) { @@ -67,9 +40,6 @@ bool OIDNDenoiserGPU::is_device_supported(const DeviceInfo &device) return false; } - VLOG_DEBUG << "Checking device " << device.description << " (" << device.id - << ") for OIDN GPU support"; - int device_type = OIDN_DEVICE_TYPE_DEFAULT; switch (device.type) { # ifdef OIDN_DEVICE_SYCL @@ -90,21 +60,15 @@ bool OIDNDenoiserGPU::is_device_supported(const DeviceInfo &device) # endif # ifdef OIDN_DEVICE_METAL case DEVICE_METAL: { - const int num_devices = oidnGetNumPhysicalDevices(); - VLOG_DEBUG << "Found " << num_devices << " OIDN device(s)"; + int num_devices = oidnGetNumPhysicalDevices(); for (int i = 0; i < num_devices; i++) { - const int type = oidnGetPhysicalDeviceInt(i, "type"); - const char *name = oidnGetPhysicalDeviceString(i, "name"); - VLOG_DEBUG << "OIDN device " << i << ": name=\"" << name - << "\", type=" << oidn_device_type_to_string(OIDNDeviceType(type)); - if (type == OIDN_DEVICE_TYPE_METAL) { + if (oidnGetPhysicalDeviceUInt(i, "type") == OIDN_DEVICE_TYPE_METAL) { + const char *name = oidnGetPhysicalDeviceString(i, "name"); if (device.id.find(name) != std::string::npos) { - VLOG_DEBUG << "OIDN device name matches the Cycles device name"; return true; } } } - VLOG_DEBUG << "No matched OIDN device found"; return false; } # endif @@ -117,30 +81,20 @@ bool OIDNDenoiserGPU::is_device_supported(const DeviceInfo &device) /* Match GPUs by their PCI ID. */ const int num_devices = oidnGetNumPhysicalDevices(); - VLOG_DEBUG << "Found " << num_devices << " OIDN device(s)"; for (int i = 0; i < num_devices; i++) { - const int type = oidnGetPhysicalDeviceInt(i, "type"); - const char *name = oidnGetPhysicalDeviceString(i, "name"); - VLOG_DEBUG << "OIDN device " << i << ": name=\"" << name - << "\" type=" << oidn_device_type_to_string(OIDNDeviceType(type)); - if (type == device_type) { + if (oidnGetPhysicalDeviceInt(i, "type") == device_type) { if (oidnGetPhysicalDeviceBool(i, "pciAddressSupported")) { unsigned int pci_domain = oidnGetPhysicalDeviceInt(i, "pciDomain"); unsigned int pci_bus = oidnGetPhysicalDeviceInt(i, "pciBus"); unsigned int pci_device = oidnGetPhysicalDeviceInt(i, "pciDevice"); string pci_id = string_printf("%04x:%02x:%02x", pci_domain, pci_bus, pci_device); - VLOG_INFO << "OIDN device PCI-e identifier: " << pci_id; if (device.id.find(pci_id) != string::npos) { - VLOG_DEBUG << "OIDN device PCI-e identifier matches the Cycles device ID"; return true; } } - else { - VLOG_DEBUG << "Device does not support pciAddressSupported"; - } } } - VLOG_DEBUG << "No matched OIDN device found"; + return false; } diff --git a/intern/cycles/kernel/CMakeLists.txt b/intern/cycles/kernel/CMakeLists.txt index 8ef143c69bb..4d8a970a13d 100644 --- a/intern/cycles/kernel/CMakeLists.txt +++ b/intern/cycles/kernel/CMakeLists.txt @@ -14,7 +14,8 @@ set(INC_SYS set(SRC_KERNEL_DEVICE_CPU device/cpu/kernel.cpp - device/cpu/kernel_sse42.cpp + device/cpu/kernel_sse2.cpp + device/cpu/kernel_sse41.cpp device/cpu/kernel_avx2.cpp ) @@ -1162,8 +1163,9 @@ endif() set_source_files_properties(device/cpu/kernel.cpp PROPERTIES COMPILE_FLAGS "${CYCLES_KERNEL_FLAGS}") -if(CXX_HAS_SSE42) - set_source_files_properties(device/cpu/kernel_sse42.cpp PROPERTIES COMPILE_FLAGS "${CYCLES_SSE42_KERNEL_FLAGS}") +if(CXX_HAS_SSE) + set_source_files_properties(device/cpu/kernel_sse2.cpp PROPERTIES COMPILE_FLAGS "${CYCLES_SSE2_KERNEL_FLAGS}") + set_source_files_properties(device/cpu/kernel_sse41.cpp PROPERTIES COMPILE_FLAGS "${CYCLES_SSE41_KERNEL_FLAGS}") endif() if(CXX_HAS_AVX2) diff --git a/intern/cycles/kernel/closure/bsdf_principled_hair_huang.h b/intern/cycles/kernel/closure/bsdf_principled_hair_huang.h index 0d5382cdaf1..adf8e220a6c 100644 --- a/intern/cycles/kernel/closure/bsdf_principled_hair_huang.h +++ b/intern/cycles/kernel/closure/bsdf_principled_hair_huang.h @@ -1,8 +1,8 @@ /* SPDX-FileCopyrightText: 2023 Blender Foundation * - * SPDX-License-Identifier: Apache-2.0 */ + * SPDX-License-Identifier: Apache-2.0 -/* This code implements the paper [A Microfacet-based Hair Scattering + * This code implements the paper [A Microfacet-based Hair Scattering * Model](https://onlinelibrary.wiley.com/doi/full/10.1111/cgf.14588) by Weizhen Huang, Matthias B. * Hullin and Johannes Hanika. */ @@ -29,12 +29,6 @@ typedef struct HuangHairExtra { /* Squared Eccentricity. */ float e2; - - /* The projected width of half a pixel at `sd->P` in `h` space. */ - float pixel_coverage; - - /* Valid integration interval. */ - float gamma_m_min, gamma_m_max; } HuangHairExtra; typedef struct HuangHairBSDF { @@ -141,14 +135,6 @@ ccl_device_inline float to_gamma(float phi, float b) return atan2f(sin_phi, b * cos_phi); } -/* Intersect `wi` with the ellipse defined by `x = sin_gamma, y = b * cos_gamma` results in solving - * for `gamma` in equation `-cos_phi_i * sin_gamma + b * sin_phi_i * cos_gamma = h`. - * Also, make use of `r = sqrt(sqr(cos_phi_i) + sqr(b * sin_phi_i))` to pre-map `h` to [-1, 1]. */ -ccl_device_inline float h_to_gamma(const float h_div_r, const float b, const float3 wi) -{ - return (b == 1.0f) ? -asinf(h_div_r) : atan2f(wi.z, -b * wi.x) - acosf(-h_div_r); -} - /* Compute the coordinate on the ellipse, given `gamma` and the aspect ratio between the minor axis * and the major axis. */ ccl_device_inline float2 to_point(float gamma, float b) @@ -184,11 +170,6 @@ ccl_device_inline float arc_length(float e2, float gamma) return e2 == 0 ? 1.0f : sqrtf(1.0f - e2 * sqr(sinf(gamma))); } -ccl_device_inline bool is_nearfield(ccl_private const HuangHairBSDF *bsdf) -{ - return bsdf->extra->radius > bsdf->extra->pixel_coverage; -} - /** \} */ #ifdef __HAIR__ @@ -205,10 +186,10 @@ ccl_device int bsdf_hair_huang_setup(ccl_private ShaderData *sd, bsdf->tilt = -bsdf->tilt; /* Compute local frame. The Y axis is aligned with the curve tangent; the X axis is perpendicular - * to the ray direction for circular cross-sections, or aligned with the major axis for - * elliptical cross-sections. */ - bsdf->extra->Y = safe_normalize(sd->dPdu); - const float3 X = safe_normalize(cross(sd->dPdu, sd->wi)); + to the ray direction for circular cross-sections, or aligned with the major axis for elliptical + cross-sections. */ + const float3 Y = safe_normalize(sd->dPdu); + const float3 X = safe_normalize(cross(Y, sd->wi)); /* h from -1..0..1 means the rays goes from grazing the hair, to hitting it at the center, to * grazing the other edge. This is the cosine of the angle between `sd->N` and `X`. */ @@ -218,8 +199,6 @@ ccl_device int bsdf_hair_huang_setup(ccl_private ShaderData *sd, kernel_assert(isfinite_safe(bsdf->h)); if (bsdf->aspect_ratio != 1.0f && (sd->type & PRIMITIVE_CURVE)) { - /* Adjust `bsdf->N` to be orthogonal to `sd->dPdu`. */ - bsdf->N = safe_normalize(cross(sd->dPdu, safe_normalize(cross(bsdf->N, sd->dPdu)))); /* Align local frame with the curve normal. */ if (bsdf->aspect_ratio > 1.0f) { /* Switch major and minor axis. */ @@ -235,12 +214,14 @@ ccl_device int bsdf_hair_huang_setup(ccl_private ShaderData *sd, /* Fill extra closure. */ if (is_zero(bsdf->N) || !isfinite_safe(bsdf->N)) { + bsdf->extra->Y = Y; /* Construct arbitrary local coordinate system. The implementation should ensure smooth * transition along the hair shaft. */ - make_orthonormals(bsdf->extra->Y, &bsdf->extra->Z, &bsdf->N); + make_orthonormals(Y, &bsdf->extra->Z, &bsdf->N); } else { bsdf->extra->Z = safe_normalize(cross(bsdf->N, sd->dPdu)); + bsdf->extra->Y = safe_normalize(cross(bsdf->extra->Z, bsdf->N)); } const float3 I = make_float3( @@ -330,6 +311,50 @@ ccl_device Spectrum bsdf_hair_huang_eval_r(KernelGlobals kg, /* Get minor axis, assuming major axis is 1. */ const float b = bsdf->aspect_ratio; + const bool is_circular = (b == 1.0f); + + const float phi_i = is_circular ? 0.0f : dir_phi(wi); + const float phi_o = dir_phi(wo); + + /* Compute visible azimuthal range from incoming and outgoing directions. */ + /* `dot(wi, wmi) > 0` */ + const float tan_tilt = tanf(bsdf->tilt); + float phi_m_max1 = acosf(fmaxf(-tan_tilt * tan_theta(wi), 0.0f)) + phi_i; + if (isnan_safe(phi_m_max1)) { + return zero_spectrum(); + } + float phi_m_min1 = -phi_m_max1 + 2.0f * phi_i; + + /* `dot(wo, wmi) > 0` */ + float phi_m_max2 = acosf(fmaxf(-tan_tilt * tan_theta(wo), 0.0f)) + phi_o; + if (isnan_safe(phi_m_max2)) { + return zero_spectrum(); + } + float phi_m_min2 = -phi_m_max2 + 2.0f * phi_o; + + if (!is_circular) { + /* Try to wrap range. */ + if ((phi_m_max2 - phi_m_min1) > M_2PI_F) { + phi_m_min2 -= M_2PI_F; + phi_m_max2 -= M_2PI_F; + } + if ((phi_m_max1 - phi_m_min2) > M_2PI_F) { + phi_m_min1 -= M_2PI_F; + phi_m_max1 -= M_2PI_F; + } + } + + const float phi_m_min = fmaxf(phi_m_min1, phi_m_min2) + 1e-3f; + const float phi_m_max = fminf(phi_m_max1, phi_m_max2) - 1e-3f; + if (phi_m_min > phi_m_max) { + return zero_spectrum(); + } + + const float gamma_m_min = to_gamma(phi_m_min, b); + float gamma_m_max = to_gamma(phi_m_max, b); + if (gamma_m_max < gamma_m_min) { + gamma_m_max += M_2PI_F; + } const float3 wh = normalize(wi + wo); @@ -338,19 +363,16 @@ ccl_device Spectrum bsdf_hair_huang_eval_r(KernelGlobals kg, /* Maximal sample resolution. */ float res = roughness * 0.7f; - - const float gamma_m_range = bsdf->extra->gamma_m_max - bsdf->extra->gamma_m_min; - /* Number of intervals should be even. */ - const size_t intervals = 2 * (size_t)ceilf(gamma_m_range / res * 0.5f); + const size_t intervals = 2 * (size_t)ceilf((gamma_m_max - gamma_m_min) / res * 0.5f); /* Modified resolution based on numbers of intervals. */ - res = gamma_m_range / float(intervals); + res = (gamma_m_max - gamma_m_min) / float(intervals); /* Integrate using Composite Simpson's 1/3 rule. */ float integral = 0.0f; for (size_t i = 0; i <= intervals; i++) { - const float gamma_m = bsdf->extra->gamma_m_min + i * res; + const float gamma_m = gamma_m_min + i * res; const float3 wm = sphg_dir(bsdf->tilt, gamma_m, b); if (microfacet_visible(wi, wo, make_float3(wm.x, 0.0f, wm.z), wh)) { @@ -363,12 +385,11 @@ ccl_device Spectrum bsdf_hair_huang_eval_r(KernelGlobals kg, } } - /* Simpson coefficient */ integral *= (2.0f / 3.0f * res); const float F = fresnel_dielectric_cos(dot(wi, wh), bsdf->eta); - return make_spectrum(bsdf->extra->R * 0.25f * F * integral); + return make_spectrum(bsdf->extra->R * 0.125f * F * integral / bsdf->extra->radius); } /* Approximate components beyond TRT (starting TRRT) by summing up a geometric series. Attenuations @@ -399,25 +420,46 @@ ccl_device Spectrum bsdf_hair_huang_eval_residual(KernelGlobals kg, const float b = bsdf->aspect_ratio; const bool is_circular = (b == 1.0f); + const float phi_i = is_circular ? 0.0f : dir_phi(wi); + + /* Compute visible azimuthal range from the incoming direction. */ + const float tan_tilt = tanf(bsdf->tilt); + const float phi_m_max = acosf(fmaxf(-tan_tilt * tan_theta(wi), 0.0f)) + phi_i; + if (isnan_safe(phi_m_max)) { + /* Early detection of `dot(wi, wmi) < 0`. */ + return zero_spectrum(); + } + const float phi_m_min = -phi_m_max + 2.0f * phi_i; + + if (tan_tilt * tan_theta(wo) < -1.0f) { + /* Early detection of `dot(wo, wmo) < 0`. */ + return zero_spectrum(); + } + const Spectrum mu_a = bsdf->sigma; const float eta = bsdf->eta; const float inv_eta = 1.0f / eta; + const float gamma_m_min = to_gamma(phi_m_min, b) + 1e-3f; + float gamma_m_max = to_gamma(phi_m_max, b) - 1e-3f; + if (gamma_m_max < gamma_m_min) { + gamma_m_max += M_2PI_F; + } + const float roughness = bsdf->roughness; const float roughness2 = sqr(roughness); const float sqrt_roughness = sqrtf(roughness); float res = roughness * 0.8f; - const float gamma_m_range = bsdf->extra->gamma_m_max - bsdf->extra->gamma_m_min; - const size_t intervals = 2 * (size_t)ceilf(gamma_m_range / res * 0.5f); - res = gamma_m_range / intervals; + const size_t intervals = 2 * (size_t)ceilf((gamma_m_max - gamma_m_min) / res * 0.5f); + res = (gamma_m_max - gamma_m_min) / intervals; Spectrum S_tt = zero_spectrum(); Spectrum S_trt = zero_spectrum(); Spectrum S_trrt = zero_spectrum(); for (size_t i = 0; i <= intervals; i++) { - const float gamma_mi = bsdf->extra->gamma_m_min + i * res; + const float gamma_mi = gamma_m_min + i * res; const float3 wmi = sphg_dir(bsdf->tilt, gamma_mi, b); const float3 wmi_ = sphg_dir(0.0f, gamma_mi, b); @@ -561,9 +603,8 @@ ccl_device Spectrum bsdf_hair_huang_eval_residual(KernelGlobals kg, sin_theta(wi), cos_theta(wi), sin_theta(wo), cos_theta(wo), 4.0f * bsdf->roughness); const float N = M_1_2PI_F; - const float simpson_coeff = 2.0f / 3.0f * res; - - return ((S_tt + S_trt) * sqr(inv_eta) + S_trrt * M * N * M_2_PI_F) * simpson_coeff; + return ((S_tt + S_trt) * sqr(inv_eta) / bsdf->extra->radius + S_trrt * M * N * M_2_PI_F) * res / + 3.0f; } ccl_device int bsdf_hair_huang_sample(const KernelGlobals kg, @@ -594,14 +635,20 @@ ccl_device int bsdf_hair_huang_sample(const KernelGlobals kg, /* Get `wi` in local coordinate. */ const float3 wi = bsdf->extra->wi; + const float2 sincos_phi_i = sincos_phi(wi); + const float sin_phi_i = sincos_phi_i.x; + const float cos_phi_i = sincos_phi_i.y; + /* Get minor axis, assuming major axis is 1. */ const float b = bsdf->aspect_ratio; const bool is_circular = (b == 1.0f); - /* Sample `h` for farfield model, as the computed intersection might have numerical issues. */ - const float h_div_r = is_nearfield(bsdf) ? bsdf->h / bsdf->extra->radius : - (sample_h * 2.0f - 1.0f); - const float gamma_mi = h_to_gamma(h_div_r, b, wi); + const float h = sample_h * 2.0f - 1.0f; + const float gamma_mi = is_circular ? + asinf(h) : + atan2f(cos_phi_i, -b * sin_phi_i) - + acosf(h * bsdf->extra->radius * + inversesqrtf(sqr(cos_phi_i) + sqr(b * sin_phi_i))); /* Macronormal. */ const float3 wmi_ = sphg_dir(0, gamma_mi, b); @@ -690,7 +737,7 @@ ccl_device int bsdf_hair_huang_sample(const KernelGlobals kg, if (cos_mi3 > 0.0f) { const Spectrum A_tr = exp(mu_a / cos_theta(wtr) * -(is_circular ? - 2.0f * fabsf(cosf(phi_tr - gamma_mt)) : + 2.0f * fabsf(cos(phi_tr - gamma_mt)) : len(to_point(gamma_mt, b) - to_point(gamma_mtr, b)))); const Spectrum TR = T1 * R2 * scale2 * A_t * A_tr * @@ -806,74 +853,9 @@ ccl_device Spectrum bsdf_hair_huang_eval(KernelGlobals kg, /* TODO: better estimation of the pdf */ *pdf = 1.0f; - /* Early detection of `dot(wo, wmo) < 0`. */ - const float tan_tilt = tanf(bsdf->tilt); - if (tan_tilt * tan_theta(local_O) < -1.0f) { - return zero_spectrum(); - } - - /* Compute visible azimuthal range from the incoming direction. */ - const float half_span = acosf(fmaxf(-tan_tilt * tan_theta(local_I), 0.0f)); - if (isnan_safe(half_span)) { - /* Early detection of `dot(wi, wmi) < 0`. */ - return zero_spectrum(); - } - const float r = bsdf->extra->radius; - const float b = bsdf->aspect_ratio; - const float phi_i = (b == 1.0f) ? 0.0f : dir_phi(local_I); - float gamma_m_min = to_gamma(phi_i - half_span, b); - float gamma_m_max = to_gamma(phi_i + half_span, b); - if (gamma_m_max < gamma_m_min) { - gamma_m_max += M_2PI_F; - } - - /* Prevent numerical issues at the boundary. */ - gamma_m_min += 1e-3f; - gamma_m_max -= 1e-3f; - - /* Length of the integral interval. */ - float dh = 2.0f * r; - - if (is_nearfield(bsdf)) { - /* Reduce the integration interval to the subset that's visible to the current pixel. - * Inspired by [An Efficient and Practical Near and Far Field Fur Reflectance Model] - * (https://sites.cs.ucsb.edu/~lingqi/publications/paper_fur2.pdf) by Ling-Qi Yan, Henrik Wann - * Jensen and Ravi Ramamoorthi. */ - const float h_max = min(bsdf->h + bsdf->extra->pixel_coverage, r); - const float h_min = max(bsdf->h - bsdf->extra->pixel_coverage, -r); - - /* At the boundaries the hair might not cover the whole pixel. */ - dh = h_max - h_min; - - float nearfield_gamma_min = h_to_gamma(h_max / r, bsdf->aspect_ratio, local_I); - float nearfield_gamma_max = h_to_gamma(h_min / r, bsdf->aspect_ratio, local_I); - - if (nearfield_gamma_max < nearfield_gamma_min) { - nearfield_gamma_max += M_2PI_F; - } - - /* Wrap range to compute the intersection. */ - if ((gamma_m_max - nearfield_gamma_min) > M_2PI_F) { - gamma_m_min -= M_2PI_F; - gamma_m_max -= M_2PI_F; - } - else if ((nearfield_gamma_max - gamma_m_min) > M_2PI_F) { - nearfield_gamma_min -= M_2PI_F; - nearfield_gamma_max -= M_2PI_F; - } - - gamma_m_min = fmaxf(gamma_m_min, nearfield_gamma_min); - gamma_m_max = fminf(gamma_m_max, nearfield_gamma_max); - } - - bsdf->extra->gamma_m_min = gamma_m_min; - bsdf->extra->gamma_m_max = gamma_m_max; - - const float projected_area = cos_theta(local_I) * dh; - return (bsdf_hair_huang_eval_r(kg, sc, local_I, local_O) + bsdf_hair_huang_eval_residual(kg, sc, local_I, local_O, sd->lcg_state)) / - projected_area; + cos_theta(local_I); } /* Implements Filter Glossy by capping the effective roughness. */ diff --git a/intern/cycles/kernel/device/cpu/kernel.cpp b/intern/cycles/kernel/device/cpu/kernel.cpp index 22d4507327c..a90d351c7c9 100644 --- a/intern/cycles/kernel/device/cpu/kernel.cpp +++ b/intern/cycles/kernel/device/cpu/kernel.cpp @@ -4,26 +4,32 @@ /* CPU kernel entry points */ -/* On x86-64, our minimum is SSE4.2, so avoid the extra kernel and compile this - * one with SSE4.2 intrinsics. +/* On x86-64, we can assume SSE2, so avoid the extra kernel and compile this + * one with SSE2 intrinsics. */ #if defined(__x86_64__) || defined(_M_X64) # define __KERNEL_SSE__ # define __KERNEL_SSE2__ -# define __KERNEL_SSE3__ -# define __KERNEL_SSSE3__ -# define __KERNEL_SSE42__ #endif /* When building kernel for native machine detect kernel features from the flags * set by compiler. */ #ifdef WITH_KERNEL_NATIVE -# ifdef __SSE4_2__ -# ifndef __KERNEL_SSE42__ -# define __KERNEL_SSE42__ +# ifdef __SSE2__ +# ifndef __KERNEL_SSE2__ +# define __KERNEL_SSE2__ # endif # endif +# ifdef __SSE3__ +# define __KERNEL_SSE3__ +# endif +# ifdef __SSSE3__ +# define __KERNEL_SSSE3__ +# endif +# ifdef __SSE4_1__ +# define __KERNEL_SSE41__ +# endif # ifdef __AVX__ # ifndef __KERNEL_SSE__ # define __KERNEL_SSE__ diff --git a/intern/cycles/kernel/device/cpu/kernel.h b/intern/cycles/kernel/device/cpu/kernel.h index 873a9b48739..63ea39c17bc 100644 --- a/intern/cycles/kernel/device/cpu/kernel.h +++ b/intern/cycles/kernel/device/cpu/kernel.h @@ -33,7 +33,10 @@ void kernel_global_memory_copy(KernelGlobalsCPU *kg, const char *name, void *mem #define KERNEL_ARCH cpu #include "kernel/device/cpu/kernel_arch.h" -#define KERNEL_ARCH cpu_sse42 +#define KERNEL_ARCH cpu_sse2 +#include "kernel/device/cpu/kernel_arch.h" + +#define KERNEL_ARCH cpu_sse41 #include "kernel/device/cpu/kernel_arch.h" #define KERNEL_ARCH cpu_avx2 diff --git a/intern/cycles/kernel/device/cpu/kernel_avx2.cpp b/intern/cycles/kernel/device/cpu/kernel_avx2.cpp index 097601e1950..8015fe23968 100644 --- a/intern/cycles/kernel/device/cpu/kernel_avx2.cpp +++ b/intern/cycles/kernel/device/cpu/kernel_avx2.cpp @@ -17,7 +17,7 @@ # define __KERNEL_SSE2__ # define __KERNEL_SSE3__ # define __KERNEL_SSSE3__ -# define __KERNEL_SSE42__ +# define __KERNEL_SSE41__ # define __KERNEL_AVX__ # define __KERNEL_AVX2__ # endif diff --git a/intern/cycles/kernel/device/cpu/kernel_sse2.cpp b/intern/cycles/kernel/device/cpu/kernel_sse2.cpp new file mode 100644 index 00000000000..35c4185177e --- /dev/null +++ b/intern/cycles/kernel/device/cpu/kernel_sse2.cpp @@ -0,0 +1,22 @@ +/* SPDX-FileCopyrightText: 2011-2022 Blender Foundation + * + * SPDX-License-Identifier: Apache-2.0 */ + +/* Optimized CPU kernel entry points. This file is compiled with SSE2 + * optimization flags and nearly all functions inlined, while kernel.cpp + * is compiled without for other CPU's. */ + +#include "util/optimization.h" + +#ifndef WITH_CYCLES_OPTIMIZED_KERNEL_SSE2 +# define KERNEL_STUB +#else +/* SSE optimization disabled for now on 32 bit, see bug #36316. */ +# if !(defined(__GNUC__) && (defined(i386) || defined(_M_IX86))) +# define __KERNEL_SSE2__ +# endif +#endif /* WITH_CYCLES_OPTIMIZED_KERNEL_SSE2 */ + +#include "kernel/device/cpu/kernel.h" +#define KERNEL_ARCH cpu_sse2 +#include "kernel/device/cpu/kernel_arch_impl.h" diff --git a/intern/cycles/kernel/device/cpu/kernel_sse42.cpp b/intern/cycles/kernel/device/cpu/kernel_sse41.cpp similarity index 78% rename from intern/cycles/kernel/device/cpu/kernel_sse42.cpp rename to intern/cycles/kernel/device/cpu/kernel_sse41.cpp index d9a12e8a224..20df03dd9d2 100644 --- a/intern/cycles/kernel/device/cpu/kernel_sse42.cpp +++ b/intern/cycles/kernel/device/cpu/kernel_sse41.cpp @@ -2,25 +2,24 @@ * * SPDX-License-Identifier: Apache-2.0 */ -/* Optimized CPU kernel entry points. This file is compiled with SSE42 +/* Optimized CPU kernel entry points. This file is compiled with SSE3/SSSE3 * optimization flags and nearly all functions inlined, while kernel.cpp * is compiled without for other CPU's. */ #include "util/optimization.h" -#ifndef WITH_CYCLES_OPTIMIZED_KERNEL_SSE42 +#ifndef WITH_CYCLES_OPTIMIZED_KERNEL_SSE41 # define KERNEL_STUB #else /* SSE optimization disabled for now on 32 bit, see bug #36316. */ # if !(defined(__GNUC__) && (defined(i386) || defined(_M_IX86))) -# define __KERNEL_SSE__ # define __KERNEL_SSE2__ # define __KERNEL_SSE3__ # define __KERNEL_SSSE3__ -# define __KERNEL_SSE42__ +# define __KERNEL_SSE41__ # endif -#endif /* WITH_CYCLES_OPTIMIZED_KERNEL_SSE42 */ +#endif /* WITH_CYCLES_OPTIMIZED_KERNEL_SSE41 */ #include "kernel/device/cpu/kernel.h" -#define KERNEL_ARCH cpu_sse42 +#define KERNEL_ARCH cpu_sse41 #include "kernel/device/cpu/kernel_arch_impl.h" diff --git a/intern/cycles/kernel/integrator/shade_surface.h b/intern/cycles/kernel/integrator/shade_surface.h index ecb2f84b0f9..bb50ccc9581 100644 --- a/intern/cycles/kernel/integrator/shade_surface.h +++ b/intern/cycles/kernel/integrator/shade_surface.h @@ -280,16 +280,6 @@ ccl_device kernel_assert(ls.pdf != 0.0f); - const bool is_transmission = dot(ls.D, sd->N) < 0.0f; - - if (ls.prim != PRIM_NONE && ls.prim == sd->prim && ls.object == sd->object) { - /* Skip self intersection if light direction lies in the same hemisphere as the geometric - * normal. */ - if (dot(ls.D, is_transmission ? -sd->Ng : sd->Ng) > 0.0f) { - return; - } - } - /* Evaluate light shader. * * TODO: can we reuse sd memory? In theory we can move this after @@ -302,6 +292,8 @@ ccl_device Ray ray ccl_optional_struct_init; BsdfEval bsdf_eval ccl_optional_struct_init; + const bool is_transmission = dot(ls.D, sd->N) < 0.0f; + int mnee_vertex_count = 0; #ifdef __MNEE__ IF_KERNEL_FEATURE(MNEE) diff --git a/intern/cycles/kernel/integrator/surface_shader.h b/intern/cycles/kernel/integrator/surface_shader.h index 50365a58e63..2840b1f27bb 100644 --- a/intern/cycles/kernel/integrator/surface_shader.h +++ b/intern/cycles/kernel/integrator/surface_shader.h @@ -955,6 +955,22 @@ ccl_device Spectrum surface_shader_transparency(KernelGlobals kg, ccl_private co } } +ccl_device void surface_shader_disable_transparency(KernelGlobals kg, ccl_private ShaderData *sd) +{ + if (sd->flag & SD_TRANSPARENT) { + for (int i = 0; i < sd->num_closure; i++) { + ccl_private ShaderClosure *sc = &sd->closure[i]; + + if (sc->type == CLOSURE_BSDF_TRANSPARENT_ID) { + sc->sample_weight = 0.0f; + sc->weight = zero_spectrum(); + } + } + + sd->flag &= ~SD_TRANSPARENT; + } +} + ccl_device Spectrum surface_shader_alpha(KernelGlobals kg, ccl_private const ShaderData *sd) { Spectrum alpha = one_spectrum() - surface_shader_transparency(kg, sd); diff --git a/intern/cycles/kernel/light/tree.h b/intern/cycles/kernel/light/tree.h index 3fd49e30cbe..5b42bcc4655 100644 --- a/intern/cycles/kernel/light/tree.h +++ b/intern/cycles/kernel/light/tree.h @@ -201,7 +201,7 @@ ccl_device void light_tree_importance(const float3 N_or_D, cos_min_outgoing_angle = 1.0f; } else if ((bcone.theta_o + bcone.theta_e > M_PI_F) || - (cos_theta_minus_theta_u > cosf(bcone.theta_o + bcone.theta_e))) + (cos_theta_minus_theta_u > cos(bcone.theta_o + bcone.theta_e))) { /* theta' = theta - theta_o - theta_u < theta_e */ kernel_assert( @@ -231,7 +231,7 @@ ccl_device void light_tree_importance(const float3 N_or_D, float cos_max_outgoing_angle; const float cos_theta_plus_theta_u = cos_theta * cos_theta_u - sin_theta * sin_theta_u; if (bcone.theta_e - bcone.theta_o < 0 || cos_theta < 0 || cos_theta_u < 0 || - cos_theta_plus_theta_u < cosf(bcone.theta_e - bcone.theta_o)) + cos_theta_plus_theta_u < cos(bcone.theta_e - bcone.theta_o)) { min_importance = 0.0f; } diff --git a/intern/cycles/kernel/osl/closures_setup.h b/intern/cycles/kernel/osl/closures_setup.h index 33a25d63ffc..5214daf8a9b 100644 --- a/intern/cycles/kernel/osl/closures_setup.h +++ b/intern/cycles/kernel/osl/closures_setup.h @@ -58,7 +58,7 @@ ccl_device_forceinline bool osl_closure_skip(KernelGlobals kg, if (reflect_caustics_disabled && has_reflect && !has_transmit) { return true; } - /* Refractive Caustics */ + /* Refractive Caustics*/ if (refract_caustics_disabled && has_transmit && !has_reflect) { return true; } @@ -988,21 +988,6 @@ ccl_device void osl_closure_hair_huang_setup(KernelGlobals kg, bsdf->extra->TT = closure->tt_lobe; bsdf->extra->TRT = closure->trt_lobe; - bsdf->extra->pixel_coverage = 1.0f; - - /* For camera ray, check if the hair covers more than one pixel, in which case a nearfield model - * is needed to prevent ribbon-like appearance. */ - if ((path_flag & PATH_RAY_CAMERA) && (sd->type & PRIMITIVE_CURVE)) { - /* Interpolate radius between curve keys. */ - const KernelCurve kcurve = kernel_data_fetch(curves, sd->prim); - const int k0 = kcurve.first_key + PRIMITIVE_UNPACK_SEGMENT(sd->type); - const int k1 = k0 + 1; - const float radius = mix( - kernel_data_fetch(curve_keys, k0).w, kernel_data_fetch(curve_keys, k1).w, sd->u); - - bsdf->extra->pixel_coverage = 0.5f * sd->dP / radius; - } - sd->flag |= bsdf_hair_huang_setup(sd, bsdf, path_flag); #endif } diff --git a/intern/cycles/kernel/svm/closure.h b/intern/cycles/kernel/svm/closure.h index a19e371779a..d26a52b7d10 100644 --- a/intern/cycles/kernel/svm/closure.h +++ b/intern/cycles/kernel/svm/closure.h @@ -790,21 +790,6 @@ ccl_device bsdf->extra->TT = fmaxf(0.0f, TT); bsdf->extra->TRT = fmaxf(0.0f, TRT); - bsdf->extra->pixel_coverage = 1.0f; - - /* For camera ray, check if the hair covers more than one pixel, in which case a - * nearfield model is needed to prevent ribbon-like appearance. */ - if ((path_flag & PATH_RAY_CAMERA) && (sd->type & PRIMITIVE_CURVE)) { - /* Interpolate radius between curve keys. */ - const KernelCurve kcurve = kernel_data_fetch(curves, sd->prim); - const int k0 = kcurve.first_key + PRIMITIVE_UNPACK_SEGMENT(sd->type); - const int k1 = k0 + 1; - const float radius = mix( - kernel_data_fetch(curve_keys, k0).w, kernel_data_fetch(curve_keys, k1).w, sd->u); - - bsdf->extra->pixel_coverage = 0.5f * sd->dP / radius; - } - bsdf->aspect_ratio = stack_load_float_default(stack, shared_ofs1, data_node3.w); if (bsdf->aspect_ratio != 1.0f) { /* Align ellipse major axis with the curve normal direction. */ diff --git a/intern/cycles/kernel/types.h b/intern/cycles/kernel/types.h index 6f581ac2611..0c1b67b9b34 100644 --- a/intern/cycles/kernel/types.h +++ b/intern/cycles/kernel/types.h @@ -1220,9 +1220,7 @@ typedef enum KernelBVHLayout { } KernelBVHLayout; /* Specialized struct that can become constants in dynamic compilation. */ -#define KERNEL_STRUCT_BEGIN(name, parent) \ - struct ccl_align(16) name \ - { +#define KERNEL_STRUCT_BEGIN(name, parent) struct name { #define KERNEL_STRUCT_END(name) \ } \ ; \ @@ -1264,8 +1262,7 @@ typedef struct KernelLightLinkSet { uint light_tree_root; } KernelLightLinkSet; -typedef struct ccl_align(16) KernelData -{ +typedef struct KernelData { /* Features and limits. */ uint kernel_features; uint max_closures; @@ -1300,8 +1297,7 @@ typedef struct ccl_align(16) KernelData # endif #endif int pad2, pad3; -} -KernelData; +} KernelData; static_assert_align(KernelData, 16); /* Kernel data structures. */ diff --git a/intern/cycles/scene/osl.cpp b/intern/cycles/scene/osl.cpp index 01aac1508ad..fcaaa2a92e8 100644 --- a/intern/cycles/scene/osl.cpp +++ b/intern/cycles/scene/osl.cpp @@ -1374,15 +1374,15 @@ void OSLCompiler::parameter_array(const char * /*name*/, const float /*f*/[], in void OSLCompiler::parameter_color_array(const char * /*name*/, const array & /*f*/) {} -void OSLCompiler::parameter_texture(const char * /*name*/, - ustring /*filename*/, - ustring /*colorspace*/) +void OSLCompiler::parameter_texture(const char * /* name */, + ustring /* filename */, + ustring /* colorspace */) { } -void OSLCompiler::parameter_texture(const char * /*name*/, const ImageHandle & /*handle*/) {} +void OSLCompiler::parameter_texture(const char * /* name */, const ImageHandle & /*handle*/) {} -void OSLCompiler::parameter_texture_ies(const char * /*name*/, int /*svm_slot*/) {} +void OSLCompiler::parameter_texture_ies(const char * /* name */, int /* svm_slot */) {} #endif /* WITH_OSL */ diff --git a/intern/cycles/scene/shader_nodes.h b/intern/cycles/scene/shader_nodes.h index 842a7feb5b2..cd437d3f885 100644 --- a/intern/cycles/scene/shader_nodes.h +++ b/intern/cycles/scene/shader_nodes.h @@ -844,7 +844,7 @@ class PrincipledHairBsdfNode : public BsdfBaseNode { NODE_SOCKET_API(float, random) /* Selected coloring parametrization. */ NODE_SOCKET_API(NodePrincipledHairParametrization, parametrization) - /* Selected scattering model (chiang/huang). */ + /* Selected scattering model (near-/far-field). */ NODE_SOCKET_API(NodePrincipledHairModel, model) virtual int get_feature() diff --git a/intern/cycles/test/util_float8_test.h b/intern/cycles/test/util_float8_test.h index fab2950d429..7f5843b646a 100644 --- a/intern/cycles/test/util_float8_test.h +++ b/intern/cycles/test/util_float8_test.h @@ -16,8 +16,8 @@ static bool validate_cpu_capabilities() return system_cpu_support_avx2(); #elif defined(__KERNEL_AVX__) return system_cpu_support_avx(); -#elif defined(__KERNEL_SSE42__) - return system_cpu_support_sse42(); +#elif defined(__KERNEL_SSE2__) + return system_cpu_support_sse2(); #else return false; #endif diff --git a/intern/cycles/util/CMakeLists.txt b/intern/cycles/util/CMakeLists.txt index 2f854e3d69a..fca9b02b396 100644 --- a/intern/cycles/util/CMakeLists.txt +++ b/intern/cycles/util/CMakeLists.txt @@ -20,13 +20,14 @@ set(SRC path.cpp profiling.cpp string.cpp + simd.cpp system.cpp task.cpp thread.cpp time.cpp transform.cpp transform_avx2.cpp - transform_sse42.cpp + transform_sse41.cpp windows.cpp ) @@ -135,8 +136,8 @@ set(SRC_HEADERS xml.h ) -if(CXX_HAS_SSE42) - set_source_files_properties(transform_sse42.cpp PROPERTIES COMPILE_FLAGS "${CYCLES_SSE42_KERNEL_FLAGS}") +if(CXX_HAS_SSE) + set_source_files_properties(transform_sse41.cpp PROPERTIES COMPILE_FLAGS "${CYCLES_SSE41_KERNEL_FLAGS}") endif() if(CXX_HAS_AVX2) set_source_files_properties(transform_avx2.cpp PROPERTIES COMPILE_FLAGS "${CYCLES_AVX2_KERNEL_FLAGS}") diff --git a/intern/cycles/util/debug.cpp b/intern/cycles/util/debug.cpp index ee6ae3a678d..de536690c11 100644 --- a/intern/cycles/util/debug.cpp +++ b/intern/cycles/util/debug.cpp @@ -30,7 +30,8 @@ void DebugFlags::CPU::reset() } while (0) CHECK_CPU_FLAGS(avx2, "CYCLES_CPU_NO_AVX2"); - CHECK_CPU_FLAGS(sse42, "CYCLES_CPU_NO_SSE42"); + CHECK_CPU_FLAGS(sse41, "CYCLES_CPU_NO_SSE41"); + CHECK_CPU_FLAGS(sse2, "CYCLES_CPU_NO_SSE2"); #undef STRINGIFY #undef CHECK_CPU_FLAGS diff --git a/intern/cycles/util/debug.h b/intern/cycles/util/debug.h index beadbe938f9..71f7165cd56 100644 --- a/intern/cycles/util/debug.h +++ b/intern/cycles/util/debug.h @@ -26,18 +26,23 @@ class DebugFlags { /* Flags describing which instructions sets are allowed for use. */ bool avx2 = true; - bool sse42 = true; + bool sse41 = true; + bool sse2 = true; /* Check functions to see whether instructions up to the given one * are allowed for use. */ bool has_avx2() { - return has_sse42() && avx2; + return has_sse41() && avx2; } - bool has_sse42() + bool has_sse41() { - return sse42; + return has_sse2() && sse41; + } + bool has_sse2() + { + return sse2; } /* Requested BVH layout. diff --git a/intern/cycles/util/defines.h b/intern/cycles/util/defines.h index a1d68bd9654..fe59b497ac8 100644 --- a/intern/cycles/util/defines.h +++ b/intern/cycles/util/defines.h @@ -13,7 +13,7 @@ /* Bitness */ #if defined(__ppc64__) || defined(__PPC64__) || defined(__x86_64__) || defined(__ia64__) || \ - defined(_M_X64) || defined(__aarch64__) || defined(_M_ARM64) + defined(_M_X64) || defined(__aarch64__) # define __KERNEL_64_BIT__ #endif diff --git a/intern/cycles/util/guiding.h b/intern/cycles/util/guiding.h index 1c5dbb24814..c4bd3992251 100644 --- a/intern/cycles/util/guiding.h +++ b/intern/cycles/util/guiding.h @@ -22,7 +22,7 @@ static int guiding_device_type() if (system_cpu_support_avx2()) { return 8; } - if (system_cpu_support_sse42()) { + if (system_cpu_support_sse41()) { return 4; } return 0; diff --git a/intern/cycles/util/math.h b/intern/cycles/util/math.h index 7d5cab7e30c..9db10e89032 100644 --- a/intern/cycles/util/math.h +++ b/intern/cycles/util/math.h @@ -1000,7 +1000,7 @@ ccl_device_inline uint32_t reverse_integer_bits(uint32_t x) return __brev(x); #elif defined(__KERNEL_METAL__) return reverse_bits(x); -#elif defined(__aarch64__) || (defined(_M_ARM64) && !defined(_MSC_VER)) +#elif defined(__aarch64__) || defined(_M_ARM64) /* Assume the rbit is always available on 64bit ARM architecture. */ __asm__("rbit %w0, %w1" : "=r"(x) : "r"(x)); return x; diff --git a/intern/cycles/util/math_fast.h b/intern/cycles/util/math_fast.h index cec5e5391fb..059c876fd8c 100644 --- a/intern/cycles/util/math_fast.h +++ b/intern/cycles/util/math_fast.h @@ -62,7 +62,7 @@ ccl_device_inline float4 madd4(const float4 a, const float4 b, const float4 c) ccl_device_inline int fast_rint(float x) { /* used by sin/cos/tan range reduction. */ -#ifdef __KERNEL_SSE42__ +#ifdef __KERNEL_SSE41__ /* Single `roundps` instruction on SSE4.1+ for gcc/clang but not MSVC 19.35: * float_to_int(rintf(x)); so we use the equivalent intrinsics. */ __m128 vec = _mm_set_ss(x); diff --git a/intern/cycles/util/math_float3.h b/intern/cycles/util/math_float3.h index fd3dc0d71aa..eaf13cf779f 100644 --- a/intern/cycles/util/math_float3.h +++ b/intern/cycles/util/math_float3.h @@ -200,7 +200,7 @@ ccl_device_inline bool operator!=(const float3 a, const float3 b) ccl_device_inline float dot(const float3 a, const float3 b) { -# if defined(__KERNEL_SSE42__) && defined(__KERNEL_SSE__) +# if defined(__KERNEL_SSE41__) && defined(__KERNEL_SSE__) return _mm_cvtss_f32(_mm_dp_ps(a, b, 0x7F)); # else return a.x * b.x + a.y * b.y + a.z * b.z; @@ -211,7 +211,7 @@ ccl_device_inline float dot(const float3 a, const float3 b) ccl_device_inline float dot_xy(const float3 a, const float3 b) { -#if defined(__KERNEL_SSE42__) && defined(__KERNEL_SSE__) +#if defined(__KERNEL_SSE41__) && defined(__KERNEL_SSE__) return _mm_cvtss_f32(_mm_hadd_ps(_mm_mul_ps(a, b), b)); #else return a.x * b.x + a.y * b.y; @@ -220,7 +220,7 @@ ccl_device_inline float dot_xy(const float3 a, const float3 b) ccl_device_inline float len(const float3 a) { -#if defined(__KERNEL_SSE42__) && defined(__KERNEL_SSE__) +#if defined(__KERNEL_SSE41__) && defined(__KERNEL_SSE__) return _mm_cvtss_f32(_mm_sqrt_ss(_mm_dp_ps(a.m128, a.m128, 0x7F))); #else return sqrtf(dot(a, a)); @@ -264,7 +264,7 @@ ccl_device_inline float3 cross(const float3 a, const float3 b) ccl_device_inline float3 normalize(const float3 a) { -# if defined(__KERNEL_SSE42__) && defined(__KERNEL_SSE__) +# if defined(__KERNEL_SSE41__) && defined(__KERNEL_SSE__) __m128 norm = _mm_sqrt_ps(_mm_dp_ps(a.m128, a.m128, 0x7F)); return float3(_mm_div_ps(a.m128, norm)); # else @@ -455,7 +455,7 @@ ccl_device_inline float reduce_add(const float3 a) { #if defined(__KERNEL_SSE__) && defined(__KERNEL_NEON__) __m128 t = a.m128; - t = vsetq_lane_f32(0.0f, t, 3); + t[3] = 0.0f; return vaddvq_f32(t); #else return (a.x + a.y + a.z); diff --git a/intern/cycles/util/math_float4.h b/intern/cycles/util/math_float4.h index 369b5fef3c2..235bf3fa373 100644 --- a/intern/cycles/util/math_float4.h +++ b/intern/cycles/util/math_float4.h @@ -364,7 +364,7 @@ ccl_device_inline float reduce_max(const float4 a) #if !defined(__KERNEL_METAL__) ccl_device_inline float dot(const float4 a, const float4 b) { -# if defined(__KERNEL_SSE42__) && defined(__KERNEL_SSE__) +# if defined(__KERNEL_SSE41__) && defined(__KERNEL_SSE__) # if defined(__KERNEL_NEON__) __m128 t = vmulq_f32(a, b); return vaddvq_f32(t); @@ -534,7 +534,7 @@ ccl_device_inline bool isequal(const float4 a, const float4 b) ccl_device_inline float4 select(const int4 mask, const float4 a, const float4 b) { # ifdef __KERNEL_SSE__ -# ifdef __KERNEL_SSE42__ +# ifdef __KERNEL_SSE41__ return float4(_mm_blendv_ps(b.m128, a.m128, _mm_castsi128_ps(mask.m128))); # else return float4( diff --git a/intern/cycles/util/math_int3.h b/intern/cycles/util/math_int3.h index dfc30ead886..ae0b81f88a8 100644 --- a/intern/cycles/util/math_int3.h +++ b/intern/cycles/util/math_int3.h @@ -14,7 +14,7 @@ CCL_NAMESPACE_BEGIN #if !defined(__KERNEL_METAL__) ccl_device_inline int3 min(int3 a, int3 b) { -# if defined(__KERNEL_SSE__) && defined(__KERNEL_SSE42__) +# if defined(__KERNEL_SSE__) && defined(__KERNEL_SSE41__) return int3(_mm_min_epi32(a.m128, b.m128)); # else return make_int3(min(a.x, b.x), min(a.y, b.y), min(a.z, b.z)); @@ -23,7 +23,7 @@ ccl_device_inline int3 min(int3 a, int3 b) ccl_device_inline int3 max(int3 a, int3 b) { -# if defined(__KERNEL_SSE__) && defined(__KERNEL_SSE42__) +# if defined(__KERNEL_SSE__) && defined(__KERNEL_SSE41__) return int3(_mm_max_epi32(a.m128, b.m128)); # else return make_int3(max(a.x, b.x), max(a.y, b.y), max(a.z, b.z)); diff --git a/intern/cycles/util/math_int4.h b/intern/cycles/util/math_int4.h index 8929290e9a4..ce5eaf40a52 100644 --- a/intern/cycles/util/math_int4.h +++ b/intern/cycles/util/math_int4.h @@ -203,7 +203,7 @@ ccl_device_forceinline const int4 srl(const int4 a, const int32_t b) ccl_device_inline int4 min(int4 a, int4 b) { -# if defined(__KERNEL_SSE__) && defined(__KERNEL_SSE42__) +# if defined(__KERNEL_SSE__) && defined(__KERNEL_SSE41__) return int4(_mm_min_epi32(a.m128, b.m128)); # else return make_int4(min(a.x, b.x), min(a.y, b.y), min(a.z, b.z), min(a.w, b.w)); @@ -212,7 +212,7 @@ ccl_device_inline int4 min(int4 a, int4 b) ccl_device_inline int4 max(int4 a, int4 b) { -# if defined(__KERNEL_SSE__) && defined(__KERNEL_SSE42__) +# if defined(__KERNEL_SSE__) && defined(__KERNEL_SSE41__) return int4(_mm_max_epi32(a.m128, b.m128)); # else return make_int4(max(a.x, b.x), max(a.y, b.y), max(a.z, b.z), max(a.w, b.w)); diff --git a/intern/cycles/util/math_intersect.h b/intern/cycles/util/math_intersect.h index b09cf2a4b1b..b5eb209ec82 100644 --- a/intern/cycles/util/math_intersect.h +++ b/intern/cycles/util/math_intersect.h @@ -114,12 +114,12 @@ ccl_device_forceinline float ray_triangle_rcp(const float x) { #ifdef __KERNEL_NEON__ /* Move scalar to vector register and do rcp. */ - __m128 a = {0}; - a = vsetq_lane_f32(x, a, 0); + __m128 a; + a[0] = x; float32x4_t reciprocal = vrecpeq_f32(a); reciprocal = vmulq_f32(vrecpsq_f32(a, reciprocal), reciprocal); reciprocal = vmulq_f32(vrecpsq_f32(a, reciprocal), reciprocal); - return vgetq_lane_f32(reciprocal, 0); + return reciprocal[0]; #elif defined(__KERNEL_SSE__) const __m128 a = _mm_set_ss(x); const __m128 r = _mm_rcp_ss(a); @@ -136,7 +136,7 @@ ccl_device_forceinline float ray_triangle_rcp(const float x) ccl_device_inline float ray_triangle_dot(const float3 a, const float3 b) { -#if defined(__KERNEL_SSE42__) && defined(__KERNEL_SSE__) +#if defined(__KERNEL_SSE41__) && defined(__KERNEL_SSE__) return madd(make_float4(a.x), make_float4(b.x), madd(make_float4(a.y), make_float4(b.y), make_float4(a.z) * make_float4(b.z)))[0]; @@ -147,7 +147,7 @@ ccl_device_inline float ray_triangle_dot(const float3 a, const float3 b) ccl_device_inline float3 ray_triangle_cross(const float3 a, const float3 b) { -#if defined(__KERNEL_SSE42__) && defined(__KERNEL_SSE__) +#if defined(__KERNEL_SSE41__) && defined(__KERNEL_SSE__) return make_float3( msub(make_float4(a.y), make_float4(b.z), make_float4(a.z) * make_float4(b.y))[0], msub(make_float4(a.z), make_float4(b.x), make_float4(a.x) * make_float4(b.z))[0], diff --git a/intern/cycles/util/openimagedenoise.h b/intern/cycles/util/openimagedenoise.h index 18510fc2208..be4ca39a3c4 100644 --- a/intern/cycles/util/openimagedenoise.h +++ b/intern/cycles/util/openimagedenoise.h @@ -16,14 +16,11 @@ CCL_NAMESPACE_BEGIN static inline bool openimagedenoise_supported() { #ifdef WITH_OPENIMAGEDENOISE -# if defined(__APPLE__) +# ifdef __APPLE__ /* Always supported through Accelerate framework BNNS. */ return true; -# elif defined(_M_ARM64) - /* OIDN supports NEON natively, and all Windows ARM64 platforms support NEON */ - return true; # else - return system_cpu_support_sse42(); + return system_cpu_support_sse41(); # endif #else return false; diff --git a/intern/cycles/util/optimization.h b/intern/cycles/util/optimization.h index d4d51760f27..d4cdc4c1d6e 100644 --- a/intern/cycles/util/optimization.h +++ b/intern/cycles/util/optimization.h @@ -9,25 +9,28 @@ /* x86 * - * Compile a regular and SSE42 kernel. */ + * Compile a regular, SSE2 and SSE3 kernel. */ # if defined(i386) || defined(_M_IX86) -/* We require minimum SSE4.2 support on x86, so auto enable. */ -# define __KERNEL_SSE42__ -# ifdef WITH_KERNEL_SSE42 -# define WITH_CYCLES_OPTIMIZED_KERNEL_SSE42 +/* We require minimum SSE2 support on x86, so auto enable. */ +# define __KERNEL_SSE2__ +# ifdef WITH_KERNEL_SSE2 +# define WITH_CYCLES_OPTIMIZED_KERNEL_SSE2 # endif /* x86-64 * - * Compile a regular (includes SSE4.2) and AVX2 kernel. */ + * Compile a regular (includes SSE2), SSE3, SSE 4.1, AVX and AVX2 kernel. */ # elif defined(__x86_64__) || defined(_M_X64) -/* SSE4.2 is our minimum requirement for x86-64 CPUs, so auto enable */ -# define __KERNEL_SSE42__ -/* no SSE4.2 kernel on x86-64, part of regular kernel */ +/* 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_SSE41 +# define WITH_CYCLES_OPTIMIZED_KERNEL_SSE41 +# endif # ifdef WITH_KERNEL_AVX2 # define WITH_CYCLES_OPTIMIZED_KERNEL_AVX2 # endif @@ -38,13 +41,13 @@ * SSE, some specializations for performance and compatibility are made * made testing for __KERNEL_NEON__. */ -# elif (defined(__ARM_NEON) || defined(_M_ARM64)) && defined(WITH_SSE2NEON) +# elif defined(__ARM_NEON) && defined(WITH_SSE2NEON) # define __KERNEL_NEON__ # define __KERNEL_SSE__ # define __KERNEL_SSE2__ # define __KERNEL_SSE3__ -# define __KERNEL_SSE42__ +# define __KERNEL_SSE41__ # endif diff --git a/intern/cycles/util/simd.cpp b/intern/cycles/util/simd.cpp new file mode 100644 index 00000000000..12c5aa5b4b3 --- /dev/null +++ b/intern/cycles/util/simd.cpp @@ -0,0 +1,32 @@ +/* SPDX-FileCopyrightText: 2011-2013 Intel Corporation + * SPDX-FileCopyrightText: 2014-2022 Blender Foundation + * + * SPDX-License-Identifier: Apache-2.0 */ + +#if (defined(WITH_KERNEL_SSE2)) || (defined(WITH_KERNEL_NATIVE) && defined(__SSE2__)) + +# define __KERNEL_SSE2__ +# include "util/simd.h" + +CCL_NAMESPACE_BEGIN + +const __m128 _mm_lookupmask_ps[16] = {_mm_castsi128_ps(_mm_set_epi32(0, 0, 0, 0)), + _mm_castsi128_ps(_mm_set_epi32(0, 0, 0, -1)), + _mm_castsi128_ps(_mm_set_epi32(0, 0, -1, 0)), + _mm_castsi128_ps(_mm_set_epi32(0, 0, -1, -1)), + _mm_castsi128_ps(_mm_set_epi32(0, -1, 0, 0)), + _mm_castsi128_ps(_mm_set_epi32(0, -1, 0, -1)), + _mm_castsi128_ps(_mm_set_epi32(0, -1, -1, 0)), + _mm_castsi128_ps(_mm_set_epi32(0, -1, -1, -1)), + _mm_castsi128_ps(_mm_set_epi32(-1, 0, 0, 0)), + _mm_castsi128_ps(_mm_set_epi32(-1, 0, 0, -1)), + _mm_castsi128_ps(_mm_set_epi32(-1, 0, -1, 0)), + _mm_castsi128_ps(_mm_set_epi32(-1, 0, -1, -1)), + _mm_castsi128_ps(_mm_set_epi32(-1, -1, 0, 0)), + _mm_castsi128_ps(_mm_set_epi32(-1, -1, 0, -1)), + _mm_castsi128_ps(_mm_set_epi32(-1, -1, -1, 0)), + _mm_castsi128_ps(_mm_set_epi32(-1, -1, -1, -1))}; + +CCL_NAMESPACE_END + +#endif // WITH_KERNEL_SSE2 diff --git a/intern/cycles/util/simd.h b/intern/cycles/util/simd.h index 9dd37a9d819..e612475d765 100644 --- a/intern/cycles/util/simd.h +++ b/intern/cycles/util/simd.h @@ -19,7 +19,7 @@ * Since we can't avoid including , better only include that */ #if defined(FREE_WINDOWS64) # include "util/windows.h" -#elif defined(_MSC_VER) && !defined(__KERNEL_NEON__) +#elif defined(_MSC_VER) # include #elif (defined(__x86_64__) || defined(__i386__)) # include @@ -40,18 +40,12 @@ # define SIMD_SET_FLUSH_TO_ZERO \ _MM_SET_FLUSH_ZERO_MODE(_MM_FLUSH_ZERO_ON); \ _MM_SET_DENORMALS_ZERO_MODE(_MM_DENORMALS_ZERO_ON); -# elif !defined(_M_ARM64) +# else # define _MM_FLUSH_ZERO_ON 24 # define __get_fpcr(__fpcr) __asm__ __volatile__("mrs %0,fpcr" : "=r"(__fpcr)) # define __set_fpcr(__fpcr) __asm__ __volatile__("msr fpcr,%0" : : "ri"(__fpcr)) # define SIMD_SET_FLUSH_TO_ZERO set_fz(_MM_FLUSH_ZERO_ON); # define SIMD_GET_FLUSH_TO_ZERO get_fz(_MM_FLUSH_ZERO_ON) -# else -# define _MM_FLUSH_ZERO_ON 24 -# define __get_fpcr(__fpcr) _ReadStatusReg(__fpcr) -# define __set_fpcr(__fpcr) _WriteStatusReg(0x5A20, __fpcr) -# define SIMD_SET_FLUSH_TO_ZERO set_fz(_MM_FLUSH_ZERO_ON); -# define SIMD_GET_FLUSH_TO_ZERO get_fz(_MM_FLUSH_ZERO_ON) # endif #else # define SIMD_SET_FLUSH_TO_ZERO @@ -213,11 +207,7 @@ type shuffle_neon(const type &a, const type &b) (i3 * 4) + 2 + 16, (i3 * 4) + 3 + 16}; - // Note: This cannot all be put in a single line due to how MSVC ARM64 - // implements the function calls as several layers of macros. - int8x16x2_t t = {int8x16_t(a), int8x16_t(b)}; - uint8x16_t idx = *(uint8x16_t *)tbl; - return type(vqtbl2q_s8(t, idx)); + return type(vqtbl2q_s8((int8x16x2_t){int8x16_t(a), int8x16_t(b)}, *(uint8x16_t *)tbl)); } } #endif /* __KERNEL_NEON */ @@ -467,16 +457,136 @@ __forceinline uint64_t bitscan(uint64_t value) #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__)) + +/* 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 + +# 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); + __m128 signmask = _mm_castsi128_ps(isignmask); + __m128i iandsign = _mm_castps_si128(_mm_and_ps(mask, signmask)); + __m128i icmpmask = _mm_cmpeq_epi32(iandsign, isignmask); + __m128 cmpmask = _mm_castsi128_ps(icmpmask); + 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 +__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 +__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 +__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 +__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) +{ + switch (index) { + case 0: + return _mm_cvtsi128_si32(input); + case 1: + return _mm_cvtsi128_si32(_mm_shuffle_epi32(input, _MM_SHUFFLE(1, 1, 1, 1))); + case 2: + return _mm_cvtsi128_si32(_mm_shuffle_epi32(input, _MM_SHUFFLE(2, 2, 2, 2))); + case 3: + return _mm_cvtsi128_si32(_mm_shuffle_epi32(input, _MM_SHUFFLE(3, 3, 3, 3))); + default: + assert(false); + return 0; + } +} +# endif + +# 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); + ((int *)&value)[index] = input; + return value; +} + +# 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); + ((float *)&value)[(index >> 4) & 0x3] = ((float *)&input)[index >> 6]; + return _mm_andnot_ps(_mm_lookupmask_ps[index & 0xf], value); +} + +# 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) { + case _MM_FROUND_TO_NEAREST_INT: + return _mm_cvtepi32_ps(_mm_cvtps_epi32(value)); + case _MM_FROUND_TO_NEG_INF: + return _mm_cvtepi32_ps(_mm_cvtps_epi32(_mm_add_ps(value, _mm_set1_ps(-0.5f)))); + case _MM_FROUND_TO_POS_INF: + return _mm_cvtepi32_ps(_mm_cvtps_epi32(_mm_add_ps(value, _mm_set1_ps(0.5f)))); + case _MM_FROUND_TO_ZERO: + return _mm_cvtepi32_ps(_mm_cvttps_epi32(value)); + } + return value; +} + +# 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 + +#endif /* __KERNEL_SSE2__ */ /* quiet unused define warnings */ #if defined(__KERNEL_SSE2__) || defined(__KERNEL_SSE3__) || defined(__KERNEL_SSSE3__) || \ - defined(__KERNEL_SSE42__) || defined(__KERNEL_AVX__) || defined(__KERNEL_AVX2__) + defined(__KERNEL_SSE41__) || defined(__KERNEL_AVX__) || defined(__KERNEL_AVX2__) /* do nothing */ #endif diff --git a/intern/cycles/util/system.cpp b/intern/cycles/util/system.cpp index 1e0cbe8cfa6..0af0d1fad4e 100644 --- a/intern/cycles/util/system.cpp +++ b/intern/cycles/util/system.cpp @@ -77,7 +77,7 @@ string system_cpu_brand_string() if (sysctlbyname("machdep.cpu.brand_string", &modelname, &bufferlen, NULL, 0) == 0) { return modelname; } -#elif (defined(WIN32) || defined(__x86_64__) || defined(__i386__)) && !defined(_M_ARM64) +#elif defined(WIN32) || defined(__x86_64__) || defined(__i386__) /* Get from intrinsics on Windows and x86. */ char buf[49] = {0}; int result[4] = {0}; @@ -96,19 +96,6 @@ string system_cpu_brand_string() return brand; } -#elif defined(_M_ARM64) - DWORD vendorIdentifierLength = 255; - char vendorIdentifier[255]; - if (RegGetValueA(HKEY_LOCAL_MACHINE, - "HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0", - "VendorIdentifier", - RRF_RT_REG_SZ, - nullptr, - &vendorIdentifier, - &vendorIdentifierLength) == ERROR_SUCCESS) - { - return vendorIdentifier; - } #else /* Get from /proc/cpuinfo on Unix systems. */ FILE *cpuinfo = fopen("/proc/cpuinfo", "r"); @@ -142,7 +129,10 @@ int system_cpu_bits() #if defined(__x86_64__) || defined(_M_X64) || defined(__i386__) || defined(_M_IX86) struct CPUCapabilities { - bool sse42; + bool sse2; + bool sse3; + bool sse41; + bool avx; bool avx2; }; @@ -165,14 +155,16 @@ static CPUCapabilities &system_cpu_capabilities() const bool ssse3 = (result[2] & ((int)1 << 9)) != 0; const bool sse41 = (result[2] & ((int)1 << 19)) != 0; - const bool sse42 = (result[2] & ((int)1 << 20)) != 0; + // const bool sse42 = (result[2] & ((int)1 << 20)) != 0; const bool fma3 = (result[2] & ((int)1 << 12)) != 0; const bool os_uses_xsave_xrestore = (result[2] & ((int)1 << 27)) != 0; const bool cpu_avx_support = (result[2] & ((int)1 << 28)) != 0; /* Simplify to combined capabilities for which we specialize kernels. */ - caps.sse42 = sse && sse2 && sse3 && ssse3 && sse41 && sse42; + caps.sse2 = sse && sse2; + caps.sse3 = sse && sse2 && sse3 && ssse3; + caps.sse41 = sse && sse2 && sse3 && ssse3 && sse41; if (os_uses_xsave_xrestore && cpu_avx_support) { // Check if the OS will save the YMM registers @@ -195,8 +187,9 @@ static CPUCapabilities &system_cpu_capabilities() bool bmi2 = (result[1] & ((int)1 << 8)) != 0; bool avx2 = (result[1] & ((int)1 << 5)) != 0; - caps.avx2 = sse && sse2 && sse3 && ssse3 && sse41 && sse42 && avx && f16c && avx2 && - fma3 && bmi1 && bmi2; + caps.avx = sse && sse2 && sse3 && ssse3 && sse41 && avx; + caps.avx2 = sse && sse2 && sse3 && ssse3 && sse41 && avx && f16c && avx2 && fma3 && bmi1 && + bmi2; } } @@ -206,10 +199,16 @@ static CPUCapabilities &system_cpu_capabilities() return caps; } -bool system_cpu_support_sse42() +bool system_cpu_support_sse2() { CPUCapabilities &caps = system_cpu_capabilities(); - return caps.sse42; + return caps.sse2; +} + +bool system_cpu_support_sse41() +{ + CPUCapabilities &caps = system_cpu_capabilities(); + return caps.sse41; } bool system_cpu_support_avx2() @@ -219,7 +218,12 @@ bool system_cpu_support_avx2() } #else -bool system_cpu_support_sse42() +bool system_cpu_support_sse2() +{ + return false; +} + +bool system_cpu_support_sse41() { return false; } diff --git a/intern/cycles/util/system.h b/intern/cycles/util/system.h index 6dbef3c9df8..187ab5cd3fc 100644 --- a/intern/cycles/util/system.h +++ b/intern/cycles/util/system.h @@ -17,7 +17,8 @@ int system_console_width(); std::string system_cpu_brand_string(); int system_cpu_bits(); -bool system_cpu_support_sse42(); +bool system_cpu_support_sse2(); +bool system_cpu_support_sse41(); bool system_cpu_support_avx2(); size_t system_physical_ram(); diff --git a/intern/cycles/util/transform.h b/intern/cycles/util/transform.h index 208c68dc5a1..af12ac3d0ea 100644 --- a/intern/cycles/util/transform.h +++ b/intern/cycles/util/transform.h @@ -405,7 +405,7 @@ ccl_device_inline float4 quat_interpolate(float4 q1, float4 q2, float t) } #ifndef __KERNEL_GPU__ -void transform_inverse_cpu_sse42(const Transform &tfm, Transform &itfm); +void transform_inverse_cpu_sse41(const Transform &tfm, Transform &itfm); void transform_inverse_cpu_avx2(const Transform &tfm, Transform &itfm); #endif @@ -418,9 +418,9 @@ ccl_device_inline Transform transform_inverse(const Transform tfm) transform_inverse_cpu_avx2(tfm, itfm); return itfm; } - else if (system_cpu_support_sse42()) { + else if (system_cpu_support_sse41()) { Transform itfm; - transform_inverse_cpu_sse42(tfm, itfm); + transform_inverse_cpu_sse41(tfm, itfm); return itfm; } #endif diff --git a/intern/cycles/util/transform_inverse.h b/intern/cycles/util/transform_inverse.h index fe43e88e49a..32a62a27620 100644 --- a/intern/cycles/util/transform_inverse.h +++ b/intern/cycles/util/transform_inverse.h @@ -30,7 +30,7 @@ ccl_device_forceinline float3 transform_inverse_cross(const float3 a_, const flo ccl_device_forceinline float transform_inverse_dot(const float3 a_, const float3 b_) { -#if defined(__KERNEL_SSE__) && defined(__KERNEL_SSE42__) +#if defined(__KERNEL_SSE__) && defined(__KERNEL_SSE41__) const __m128 a = (const __m128 &)a_; const __m128 b = (const __m128 &)b_; return _mm_cvtss_f32(_mm_dp_ps(a, b, 0x7F)); diff --git a/intern/cycles/util/transform_sse42.cpp b/intern/cycles/util/transform_sse41.cpp similarity index 77% rename from intern/cycles/util/transform_sse42.cpp rename to intern/cycles/util/transform_sse41.cpp index b47392e6f34..8e64cc9cd71 100644 --- a/intern/cycles/util/transform_sse42.cpp +++ b/intern/cycles/util/transform_sse41.cpp @@ -6,7 +6,7 @@ CCL_NAMESPACE_BEGIN -void transform_inverse_cpu_sse42(const Transform &tfm, Transform &itfm) +void transform_inverse_cpu_sse41(const Transform &tfm, Transform &itfm) { itfm = transform_inverse_impl(tfm); } diff --git a/intern/ghost/GHOST_Path-api.hh b/intern/ghost/GHOST_Path-api.hh index a0ea21dfb21..394449eac24 100644 --- a/intern/ghost/GHOST_Path-api.hh +++ b/intern/ghost/GHOST_Path-api.hh @@ -20,13 +20,13 @@ GHOST_DECLARE_HANDLE(GHOST_SystemPathsHandle); * Creates the one and only instance of the system path access. * \return An indication of success. */ -extern GHOST_TSuccess GHOST_CreateSystemPaths(); +extern GHOST_TSuccess GHOST_CreateSystemPaths(void); /** * Disposes the one and only system. * \return An indication of success. */ -extern GHOST_TSuccess GHOST_DisposeSystemPaths(); +extern GHOST_TSuccess GHOST_DisposeSystemPaths(void); /** * Determine the base dir in which shared resources are located. It will first try to use @@ -57,7 +57,7 @@ extern const char *GHOST_getUserSpecialDir(GHOST_TUserSpecialDirTypes type); * Determine the dir in which the binary file is found. * \return Unsigned char string pointing to binary dir (eg ~/usr/local/bin/). */ -extern const char *GHOST_getBinaryDir(); +extern const char *GHOST_getBinaryDir(void); /** * Add the file to the operating system most recently used files diff --git a/intern/ghost/intern/GHOST_ContextEGL.cc b/intern/ghost/intern/GHOST_ContextEGL.cc index be4a6016495..5239ee49541 100644 --- a/intern/ghost/intern/GHOST_ContextEGL.cc +++ b/intern/ghost/intern/GHOST_ContextEGL.cc @@ -131,9 +131,11 @@ static bool egl_chk(bool result, { if (!result) { const EGLint error = eglGetError(); -#ifndef NDEBUG + const char *code = get_egl_error_enum_string(error); const char *msg = get_egl_error_message_string(error); + +#ifndef NDEBUG fprintf(stderr, "%s:%d: [%s] -> EGL Error (0x%04X): %s: %s\n", file, diff --git a/intern/ghost/intern/GHOST_DisplayManagerCocoa.hh b/intern/ghost/intern/GHOST_DisplayManagerCocoa.hh index 99a98ee8cc2..81eda5d71e0 100644 --- a/intern/ghost/intern/GHOST_DisplayManagerCocoa.hh +++ b/intern/ghost/intern/GHOST_DisplayManagerCocoa.hh @@ -24,7 +24,7 @@ class GHOST_DisplayManagerCocoa : public GHOST_DisplayManager { /** * Constructor. */ - GHOST_DisplayManagerCocoa(); + GHOST_DisplayManagerCocoa(void); /** * Returns the number of display devices on this system. diff --git a/intern/ghost/intern/GHOST_DisplayManagerWin32.hh b/intern/ghost/intern/GHOST_DisplayManagerWin32.hh index 1b54caf3764..254f1da74bc 100644 --- a/intern/ghost/intern/GHOST_DisplayManagerWin32.hh +++ b/intern/ghost/intern/GHOST_DisplayManagerWin32.hh @@ -23,7 +23,7 @@ class GHOST_DisplayManagerWin32 : public GHOST_DisplayManager { /** * Constructor. */ - GHOST_DisplayManagerWin32(); + GHOST_DisplayManagerWin32(void); /** * Returns the number of display devices on this system. diff --git a/intern/ghost/intern/GHOST_DropTargetWin32.hh b/intern/ghost/intern/GHOST_DropTargetWin32.hh index f06fd55efca..5596144c465 100644 --- a/intern/ghost/intern/GHOST_DropTargetWin32.hh +++ b/intern/ghost/intern/GHOST_DropTargetWin32.hh @@ -23,8 +23,8 @@ class GHOST_DropTargetWin32 : public IDropTarget { * methods in IUnknown are the first entries in the VTable for every interface. */ HRESULT __stdcall QueryInterface(REFIID riid, void **ppv_obj); - ULONG __stdcall AddRef(); - ULONG __stdcall Release(); + ULONG __stdcall AddRef(void); + ULONG __stdcall Release(void); /* IDropTarget implementation * + The IDropTarget interface is one of the interfaces you implement to @@ -50,7 +50,7 @@ class GHOST_DropTargetWin32 : public IDropTarget { POINTL pt, DWORD *pdw_effect); HRESULT __stdcall DragOver(DWORD grf_key_state, POINTL pt, DWORD *pdw_effect); - HRESULT __stdcall DragLeave(); + HRESULT __stdcall DragLeave(void); HRESULT __stdcall Drop(IDataObject *p_data_object, DWORD grf_key_state, POINTL pt, diff --git a/intern/ghost/intern/GHOST_DropTargetX11.cc b/intern/ghost/intern/GHOST_DropTargetX11.cc index 45edd553886..505cd07ab23 100644 --- a/intern/ghost/intern/GHOST_DropTargetX11.cc +++ b/intern/ghost/intern/GHOST_DropTargetX11.cc @@ -102,8 +102,7 @@ GHOST_DropTargetX11::~GHOST_DropTargetX11() char *GHOST_DropTargetX11::FileUrlDecode(const char *fileUrl) { if (strncmp(fileUrl, "file://", 7) == 0) { - const char *file = fileUrl + 7; - return GHOST_URL_decode_alloc(file, strlen(file)); + return GHOST_URL_decode_alloc(fileUrl + 7); } return nullptr; diff --git a/intern/ghost/intern/GHOST_PathUtils.cc b/intern/ghost/intern/GHOST_PathUtils.cc index b53b2a85cba..4c51a803871 100644 --- a/intern/ghost/intern/GHOST_PathUtils.cc +++ b/intern/ghost/intern/GHOST_PathUtils.cc @@ -12,7 +12,6 @@ #include #include -#include "GHOST_Debug.hh" #include "GHOST_PathUtils.hh" #include "GHOST_Types.h" @@ -25,10 +24,9 @@ using DecodeState_e = enum DecodeState_e { STATE_CONVERTING }; -void GHOST_URL_decode(char *buf_dst, int buf_dst_size, const char *buf_src, const int buf_src_len) +void GHOST_URL_decode(char *buf_dst, int buf_dst_size, const char *buf_src) { - GHOST_ASSERT(strnlen(buf_src, buf_src_len) == buf_src_len, "Incorrect length"); - + const uint buf_src_len = strlen(buf_src); DecodeState_e state = STATE_SEARCH; uint ascii_character; @@ -87,12 +85,12 @@ void GHOST_URL_decode(char *buf_dst, int buf_dst_size, const char *buf_src, cons } } -char *GHOST_URL_decode_alloc(const char *buf_src, const int buf_src_len) +char *GHOST_URL_decode_alloc(const char *buf_src) { /* Assume one character of encoded URL can be expanded to 4 chars max. */ - const size_t decoded_size_max = 4 * buf_src_len + 1; + const size_t decoded_size_max = 4 * strlen(buf_src) + 1; char *buf_dst = (char *)malloc(decoded_size_max); - GHOST_URL_decode(buf_dst, decoded_size_max, buf_src, buf_src_len); + GHOST_URL_decode(buf_dst, decoded_size_max, buf_src); const size_t decoded_size = strlen(buf_dst) + 1; if (decoded_size != decoded_size_max) { char *buf_dst_trim = (char *)malloc(decoded_size); diff --git a/intern/ghost/intern/GHOST_PathUtils.hh b/intern/ghost/intern/GHOST_PathUtils.hh index bc8a2a894b3..941e405344a 100644 --- a/intern/ghost/intern/GHOST_PathUtils.hh +++ b/intern/ghost/intern/GHOST_PathUtils.hh @@ -14,13 +14,12 @@ * \param buf_dst: Buffer for decoded URL. * \param buf_dst_maxlen: Size of output buffer. * \param buf_src: Input encoded buffer to be decoded. - * \param buf_src_len: The length of `buf_src` to use. */ -void GHOST_URL_decode(char *buf_dst, int buf_dst_size, const char *buf_src, int buf_src_len); +void GHOST_URL_decode(char *buf_dst, int buf_dst_size, const char *buf_src); /** * A version of #GHOST_URL_decode that allocates the string & returns it. * * \param buf_src: Input encoded buffer to be decoded. * \return The decoded output buffer. */ -char *GHOST_URL_decode_alloc(const char *buf_src, int buf_src_len); +char *GHOST_URL_decode_alloc(const char *buf_src); diff --git a/intern/ghost/intern/GHOST_System.hh b/intern/ghost/intern/GHOST_System.hh index 7a85bb143ae..83437f45e84 100644 --- a/intern/ghost/intern/GHOST_System.hh +++ b/intern/ghost/intern/GHOST_System.hh @@ -246,7 +246,7 @@ class GHOST_System : public GHOST_ISystem { * \param api: Enum indicating which API to use. */ virtual void setTabletAPI(GHOST_TTabletAPI api); - GHOST_TTabletAPI getTabletAPI(); + GHOST_TTabletAPI getTabletAPI(void); /** * Get the color of the pixel at the current mouse cursor location @@ -332,7 +332,7 @@ class GHOST_System : public GHOST_ISystem { /** * Returns GHOST_kSuccess if the clipboard contains an image. */ - GHOST_TSuccess hasClipboardImage() const; + GHOST_TSuccess hasClipboardImage(void) const; /** * Get image data from the Clipboard diff --git a/intern/ghost/intern/GHOST_SystemWayland.cc b/intern/ghost/intern/GHOST_SystemWayland.cc index 80f2f70eec9..4ac2cbbf65c 100644 --- a/intern/ghost/intern/GHOST_SystemWayland.cc +++ b/intern/ghost/intern/GHOST_SystemWayland.cc @@ -108,9 +108,6 @@ static bool has_libdecor = true; # endif #endif -#include "IMB_imbuf.hh" -#include "IMB_imbuf_types.hh" - /* -------------------------------------------------------------------- */ /** \name Forward Declarations * \{ */ @@ -2975,9 +2972,6 @@ static char *read_buffer_from_data_offer(GWL_DataOffer *data_offer, } close(pipefd[0]); } - else { - *r_len = 0; - } return buf; } @@ -3311,19 +3305,20 @@ static void data_device_handle_drop(void *data, wl_data_device * /*wl_data_devic CLOG_INFO(LOG, 2, "drop mime_recieve=%s", mime_receive); - auto read_drop_data_fn = [](GWL_Seat *const seat, - GWL_DataOffer *data_offer, - wl_surface *wl_surface_window, - const char *mime_receive) { + auto read_uris_fn = [](GWL_Seat *const seat, + GWL_DataOffer *data_offer, + wl_surface *wl_surface_window, + const char *mime_receive) { const uint64_t event_ms = seat->system->getMilliSeconds(); const wl_fixed_t xy[2] = {UNPACK2(data_offer->dnd.xy)}; - const bool nil_terminate = (mime_receive != ghost_wl_mime_text_uri); size_t data_buf_len = 0; const char *data_buf = read_buffer_from_data_offer( - data_offer, mime_receive, nullptr, nil_terminate, &data_buf_len); + data_offer, mime_receive, nullptr, false, &data_buf_len); + std::string data = data_buf ? std::string(data_buf, data_buf_len) : ""; + free(const_cast(data_buf)); - CLOG_INFO(LOG, 2, "read_drop_data mime_receive=%s, data_len=%zu", mime_receive, data_buf_len); + CLOG_INFO(LOG, 2, "drop_read_uris mime_receive=%s, data=%s", mime_receive, data.c_str()); wl_data_offer_finish(data_offer->wl.id); wl_data_offer_destroy(data_offer->wl.id); @@ -3334,97 +3329,69 @@ static void data_device_handle_drop(void *data, wl_data_device * /*wl_data_devic delete data_offer; data_offer = nullptr; - /* Don't generate a drop event if the data could not be read, - * an error will have been logged. */ - if (data_buf != nullptr) { - GHOST_TDragnDropTypes ghost_dnd_type = GHOST_kDragnDropTypeUnknown; - void *ghost_dnd_data = nullptr; + GHOST_SystemWayland *const system = seat->system; - /* Failure to receive drop data . */ - if (mime_receive == ghost_wl_mime_text_uri) { - const char file_proto[] = "file://"; - /* NOTE: some applications CRLF (`\r\n`) GTK3 for e.g. & others don't `pcmanfm-qt`. - * So support both, once `\n` is found, strip the preceding `\r` if found. */ - const char lf = '\n'; + if (mime_receive == ghost_wl_mime_text_uri) { + const char file_proto[] = "file://"; + /* NOTE: some applications CRLF (`\r\n`) GTK3 for e.g. & others don't `pcmanfm-qt`. + * So support both, once `\n` is found, strip the preceding `\r` if found. */ + const char lf = '\n'; - const std::string_view data = std::string_view(data_buf, data_buf_len); - std::vector uris; + GHOST_WindowWayland *win = ghost_wl_surface_user_data(wl_surface_window); + std::vector uris; - size_t pos = 0; - while (pos != std::string::npos) { - pos = data.find(file_proto, pos); - if (pos == std::string::npos) { - break; - } - const size_t start = pos + sizeof(file_proto) - 1; - pos = data.find(lf, pos); - - size_t end = pos; - if (UNLIKELY(end == std::string::npos)) { - /* Note that most well behaved file managers will add a trailing newline, - * Gnome's web browser (44.3) doesn't, so support reading up until the last byte. */ - end = data.size(); - } - /* Account for 'CRLF' case. */ - if (data[end - 1] == '\r') { - end -= 1; - } - - std::string_view data_substr = data.substr(start, end - start); - uris.push_back(data_substr); - CLOG_INFO(LOG, - 2, - "read_drop_data pos=%zu, text_uri=\"%.*s\"", - start, - int(data_substr.size()), - data_substr.data()); + size_t pos = 0; + while (pos != std::string::npos) { + pos = data.find(file_proto, pos); + if (pos == std::string::npos) { + break; } + const size_t start = pos + sizeof(file_proto) - 1; + pos = data.find(lf, pos); - GHOST_TStringArray *flist = static_cast( - malloc(sizeof(GHOST_TStringArray))); - flist->count = int(uris.size()); - flist->strings = static_cast(malloc(uris.size() * sizeof(uint8_t *))); - for (size_t i = 0; i < uris.size(); i++) { - flist->strings[i] = reinterpret_cast( - GHOST_URL_decode_alloc(uris[i].data(), uris[i].size())); + size_t end = pos; + if (UNLIKELY(end == std::string::npos)) { + /* Note that most well behaved file managers will add a trailing newline, + * Gnome's web browser (44.3) doesn't, so support reading up until the last byte. */ + end = data.size(); } - - CLOG_INFO(LOG, 2, "read_drop_data file_count=%d", flist->count); - ghost_dnd_type = GHOST_kDragnDropTypeFilenames; - ghost_dnd_data = flist; - } - else if (ELEM(mime_receive, ghost_wl_mime_text_plain, ghost_wl_mime_text_utf8)) { - ghost_dnd_type = GHOST_kDragnDropTypeString; - ghost_dnd_data = (void *)data_buf; /* Move ownership to the event. */ - data_buf = nullptr; + /* Account for 'CRLF' case. */ + if (data[end - 1] == '\r') { + end -= 1; + } + uris.push_back(data.substr(start, end - start)); + CLOG_INFO(LOG, 2, "drop_read_uris pos=%zu, text_uri=\"%s\"", start, uris.back().c_str()); } - if (ghost_dnd_type != GHOST_kDragnDropTypeUnknown) { - GHOST_SystemWayland *const system = seat->system; - GHOST_WindowWayland *win = ghost_wl_surface_user_data(wl_surface_window); - const int event_xy[2] = {WL_FIXED_TO_INT_FOR_WINDOW_V2(win, xy)}; - - system->pushEvent_maybe_pending(new GHOST_EventDragnDrop(event_ms, - GHOST_kEventDraggingDropDone, - ghost_dnd_type, - win, - UNPACK2(event_xy), - ghost_dnd_data)); - - wl_display_roundtrip(system->wl_display_get()); - } - else { - CLOG_INFO(LOG, 2, "read_drop_data, unhandled!"); + GHOST_TStringArray *flist = static_cast( + malloc(sizeof(GHOST_TStringArray))); + flist->count = int(uris.size()); + flist->strings = static_cast(malloc(uris.size() * sizeof(uint8_t *))); + for (size_t i = 0; i < uris.size(); i++) { + flist->strings[i] = reinterpret_cast(GHOST_URL_decode_alloc(uris[i].c_str())); } - free(const_cast(data_buf)); + CLOG_INFO(LOG, 2, "drop_read_uris_fn file_count=%d", flist->count); + const int event_xy[2] = {WL_FIXED_TO_INT_FOR_WINDOW_V2(win, xy)}; + system->pushEvent_maybe_pending(new GHOST_EventDragnDrop(event_ms, + GHOST_kEventDraggingDropDone, + GHOST_kDragnDropTypeFilenames, + win, + UNPACK2(event_xy), + flist)); } + else if (ELEM(mime_receive, ghost_wl_mime_text_plain, ghost_wl_mime_text_utf8)) { + /* TODO: enable use of internal functions 'txt_insert_buf' and + * 'text_update_edited' to behave like dropped text was pasted. */ + CLOG_INFO(LOG, 2, "drop_read_uris_fn (text_plain, text_utf8), unhandled!"); + } + wl_display_roundtrip(system->wl_display_get()); }; /* Pass in `seat->wl_surface_window_focus_dnd` instead of accessing it from `seat` since the * leave callback (#data_device_handle_leave) will clear the value once this function starts. */ std::thread read_thread( - read_drop_data_fn, seat, data_offer, seat->wl.surface_window_focus_dnd, mime_receive); + read_uris_fn, seat, data_offer, seat->wl.surface_window_focus_dnd, mime_receive); read_thread.detach(); } @@ -5546,7 +5513,7 @@ static CLG_LogRef LOG_WL_SEAT = {"ghost.wl.handle.seat"}; static bool gwl_seat_capability_pointer_multitouch_check(const GWL_Seat *seat, const bool fallback) { - const zwp_pointer_gestures_v1 *pointer_gestures = seat->system->wp_pointer_gestures_get(); + zwp_pointer_gestures_v1 *pointer_gestures = seat->system->wp_pointer_gestures_get(); if (pointer_gestures == nullptr) { return fallback; } @@ -7476,148 +7443,6 @@ void GHOST_SystemWayland::putClipboard(const char *buffer, bool selection) const } } -static constexpr const char *ghost_wl_mime_img_png = "image/png"; - -GHOST_TSuccess GHOST_SystemWayland::hasClipboardImage(void) const -{ - GWL_Seat *seat = gwl_display_seat_active_get(display_); - if (UNLIKELY(!seat)) { - return GHOST_kFailure; - } - - GWL_DataOffer *data_offer = seat->data_offer_copy_paste; - if (data_offer) { - if (data_offer->types.count(ghost_wl_mime_img_png)) { - return GHOST_kSuccess; - } - } - - return GHOST_kFailure; -} - -uint *GHOST_SystemWayland::getClipboardImage(int *r_width, int *r_height) const -{ -#ifdef USE_EVENT_BACKGROUND_THREAD - std::lock_guard lock_server_guard{*server_mutex}; -#endif - - GWL_Seat *seat = gwl_display_seat_active_get(display_); - if (UNLIKELY(!seat)) { - return nullptr; - } - - std::mutex &mutex = seat->data_offer_copy_paste_mutex; - mutex.lock(); - bool mutex_locked = true; - - uint *rgba = nullptr; - - GWL_DataOffer *data_offer = seat->data_offer_copy_paste; - if (data_offer) { - /* Check if the source offers a supported mime type. - * This check could be skipped, because the paste option is not supposed to be enabled - * otherwise. */ - if (data_offer->types.count(ghost_wl_mime_img_png)) { - /* Receive the clipboard in a thread, performing round-trips while waiting, - * so pasting content from own `primary->data_source` doesn't hang. */ - struct ThreadResult { - char *data = nullptr; - size_t data_len = 0; - std::atomic done = false; - } thread_result; - - auto read_clipboard_fn = [](GWL_DataOffer *data_offer, - const char *mime_receive, - std::mutex *mutex, - ThreadResult *thread_result) { - thread_result->data = read_buffer_from_data_offer( - data_offer, mime_receive, mutex, false, &thread_result->data_len); - thread_result->done = true; - }; - std::thread read_thread( - read_clipboard_fn, data_offer, ghost_wl_mime_img_png, &mutex, &thread_result); - read_thread.detach(); - - while (!thread_result.done) { - wl_display_roundtrip(display_->wl.display); - } - - if (thread_result.data) { - /* Generate the image buffer with the received data. */ - ImBuf *ibuf = IMB_ibImageFromMemory((uint8_t *)thread_result.data, - thread_result.data_len, - IB_rect, - nullptr, - ""); - if (ibuf) { - *r_width = ibuf->x; - *r_height = ibuf->y; - const size_t byte_count = size_t(ibuf->x) * size_t(ibuf->y) * 4; - rgba = (uint *)malloc(byte_count); - std::memcpy(rgba, ibuf->byte_buffer.data, byte_count); - IMB_freeImBuf(ibuf); - } - } - - /* After reading the data offer, the mutex gets unlocked. */ - mutex_locked = false; - } - } - - if (mutex_locked) { - mutex.unlock(); - } - return rgba; -} - -GHOST_TSuccess GHOST_SystemWayland::putClipboardImage(uint *rgba, int width, int height) const -{ -#ifdef USE_EVENT_BACKGROUND_THREAD - std::lock_guard lock_server_guard{*server_mutex}; -#endif - - /* Create a #wl_data_source object. */ - GWL_Seat *seat = gwl_display_seat_active_get(display_); - if (UNLIKELY(!seat)) { - return GHOST_kFailure; - } - std::lock_guard lock(seat->data_source_mutex); - - GWL_DataSource *data_source = seat->data_source; - - /* Load buffer into an #ImBuf and convert to PNG. */ - ImBuf *ibuf = IMB_allocFromBuffer(reinterpret_cast(rgba), nullptr, width, height, 32); - ibuf->ftype = IMB_FTYPE_PNG; - ibuf->foptions.quality = 15; - if (!IMB_saveiff(ibuf, "", IB_rect | IB_mem)) { - IMB_freeImBuf(ibuf); - return GHOST_kFailure; - } - - /* Copy #ImBuf encoded_buffer to data source. */ - GWL_SimpleBuffer *imgbuffer = &data_source->buffer_out; - gwl_simple_buffer_free_data(imgbuffer); - imgbuffer->data_size = ibuf->encoded_buffer_size; - char *data = static_cast(malloc(imgbuffer->data_size)); - std::memcpy(data, ibuf->encoded_buffer.data, ibuf->encoded_buffer_size); - imgbuffer->data = data; - - data_source->wl.source = wl_data_device_manager_create_data_source( - display_->wl.data_device_manager); - wl_data_source_add_listener(data_source->wl.source, &data_source_listener, seat); - - /* Advertise the mime types supported. */ - wl_data_source_offer(data_source->wl.source, ghost_wl_mime_img_png); - - if (seat->wl.data_device) { - wl_data_device_set_selection( - seat->wl.data_device, data_source->wl.source, seat->data_source_serial); - } - - IMB_freeImBuf(ibuf); - return GHOST_kSuccess; -} - uint8_t GHOST_SystemWayland::getNumDisplays() const { #ifdef USE_EVENT_BACKGROUND_THREAD @@ -8193,7 +8018,9 @@ GHOST_TCapabilityFlag GHOST_SystemWayland::getCapabilities() const * is negligible. */ GHOST_kCapabilityGPUReadFrontBuffer | /* This WAYLAND back-end has not yet implemented desktop color sample. */ - GHOST_kCapabilityDesktopSample)); + GHOST_kCapabilityDesktopSample | + /* This WAYLAND back-end has not yet implemented image copy/paste. */ + GHOST_kCapabilityClipboardImages)); } bool GHOST_SystemWayland::cursor_grab_use_software_display_get(const GHOST_TGrabCursorMode mode) diff --git a/intern/ghost/intern/GHOST_SystemWayland.hh b/intern/ghost/intern/GHOST_SystemWayland.hh index 04d07c69e7c..17b3944801f 100644 --- a/intern/ghost/intern/GHOST_SystemWayland.hh +++ b/intern/ghost/intern/GHOST_SystemWayland.hh @@ -159,27 +159,6 @@ class GHOST_SystemWayland : public GHOST_System { void putClipboard(const char *buffer, bool selection) const override; - /** - * Returns GHOST_kSuccess if the clipboard contains an image. - */ - GHOST_TSuccess hasClipboardImage() const override; - - /** - * Get image data from the Clipboard - * \param r_width: the returned image width in pixels. - * \param r_height: the returned image height in pixels. - * \return pointer uint array in RGBA byte order. Caller must free. - */ - uint *getClipboardImage(int *r_width, int *r_height) const override; - - /** - * Put image data to the Clipboard - * \param rgba: uint array in RGBA byte order. - * \param width: the image width in pixels. - * \param height: the image height in pixels. - */ - GHOST_TSuccess putClipboardImage(uint *rgba, int width, int height) const override; - uint8_t getNumDisplays() const override; uint64_t getMilliSeconds() const override; diff --git a/intern/ghost/intern/GHOST_SystemWin32.cc b/intern/ghost/intern/GHOST_SystemWin32.cc index 35b8de3672f..33708e92058 100644 --- a/intern/ghost/intern/GHOST_SystemWin32.cc +++ b/intern/ghost/intern/GHOST_SystemWin32.cc @@ -135,7 +135,8 @@ static void initRawInput() typedef BOOL(API *GHOST_WIN32_EnableNonClientDpiScaling)(HWND); -GHOST_SystemWin32::GHOST_SystemWin32() : m_hasPerformanceCounter(false), m_freq(0) +GHOST_SystemWin32::GHOST_SystemWin32() + : m_hasPerformanceCounter(false), m_freq(0), m_start(0), m_lfstart(0) { m_displayManager = new GHOST_DisplayManagerWin32(); GHOST_ASSERT(m_displayManager, "GHOST_SystemWin32::GHOST_SystemWin32(): m_displayManager==0\n"); @@ -177,17 +178,22 @@ GHOST_SystemWin32::~GHOST_SystemWin32() uint64_t GHOST_SystemWin32::performanceCounterToMillis(__int64 perf_ticks) const { /* Calculate the time passed since system initialization. */ - __int64 delta = perf_ticks * 1000; + __int64 delta = (perf_ticks - m_start) * 1000; uint64_t t = uint64_t(delta / m_freq); return t; } +uint64_t GHOST_SystemWin32::tickCountToMillis(__int64 ticks) const +{ + return ticks - m_lfstart; +} + uint64_t GHOST_SystemWin32::getMilliSeconds() const { /* Hardware does not support high resolution timers. We will use GetTickCount instead then. */ if (!m_hasPerformanceCounter) { - return ::GetTickCount64(); + return tickCountToMillis(::GetTickCount()); } /* Retrieve current count */ @@ -198,9 +204,10 @@ uint64_t GHOST_SystemWin32::getMilliSeconds() const } /** - * Returns the message time, compatible with the time value from #getMilliSeconds. - * This should be used instead of #getMilliSeconds when you need the time a message was delivered - * versus collected, so for all event creation that are in response to receiving a Windows message. + * Returns the number of milliseconds since the start of the Blender process to the time of the + * last message, using the high frequency timer if available. This should be used instead of + * getMilliSeconds when you need the time a message was delivered versus collected, so for all + * event creation that are in response to receiving a Windows message. */ static uint64_t getMessageTime(GHOST_SystemWin32 *system) { @@ -212,7 +219,7 @@ static uint64_t getMessageTime(GHOST_SystemWin32 *system) t_delta -= int64_t(UINT32_MAX) + 1; } - /* Return message time as 64-bit milliseconds with the delta applied. */ + /* Return message time as 64-bit milliseconds since Blender start. */ return system->getMilliSeconds() + t_delta; } @@ -568,8 +575,16 @@ GHOST_TSuccess GHOST_SystemWin32::init() SetProcessDPIAware(); initRawInput(); + m_lfstart = ::GetTickCount(); /* Determine whether this system has a high frequency performance counter. */ m_hasPerformanceCounter = ::QueryPerformanceFrequency((LARGE_INTEGER *)&m_freq) == TRUE; + if (m_hasPerformanceCounter) { + GHOST_PRINT("GHOST_SystemWin32::init: High Frequency Performance Timer available\n"); + ::QueryPerformanceCounter((LARGE_INTEGER *)&m_start); + } + else { + GHOST_PRINT("GHOST_SystemWin32::init: High Frequency Performance Timer not available\n"); + } if (success) { WNDCLASSW wc = {0}; diff --git a/intern/ghost/intern/GHOST_SystemWin32.hh b/intern/ghost/intern/GHOST_SystemWin32.hh index 731ecb8409b..e61709f1788 100644 --- a/intern/ghost/intern/GHOST_SystemWin32.hh +++ b/intern/ghost/intern/GHOST_SystemWin32.hh @@ -60,6 +60,13 @@ class GHOST_SystemWin32 : public GHOST_System { */ uint64_t performanceCounterToMillis(__int64 perf_ticks) const; + /** + * This method converts system ticks into milliseconds since the start of the + * Blender process. + * \return The number of milliseconds since the start of the Blender process. + */ + uint64_t tickCountToMillis(__int64 ticks) const; + /** * Returns the system time. * Returns the number of milliseconds since the start of the Blender process. @@ -229,7 +236,7 @@ class GHOST_SystemWin32 : public GHOST_System { /** * Returns GHOST_kSuccess if the clipboard contains an image. */ - GHOST_TSuccess hasClipboardImage() const; + GHOST_TSuccess hasClipboardImage(void) const; /** * Get image data from the Clipboard @@ -451,7 +458,7 @@ class GHOST_SystemWin32 : public GHOST_System { /** * Check current key layout for AltGr */ - inline void handleKeyboardChange(); + inline void handleKeyboardChange(void); /** * Windows call back routine for our window class. @@ -469,6 +476,10 @@ class GHOST_SystemWin32 : public GHOST_System { bool m_hasPerformanceCounter; /** High frequency timer variable. */ __int64 m_freq; + /** High frequency timer variable. */ + __int64 m_start; + /** Low frequency timer variable. */ + __int64 m_lfstart; /** AltGr on current keyboard layout. */ bool m_hasAltGr; /** Language identifier. */ @@ -483,7 +494,7 @@ class GHOST_SystemWin32 : public GHOST_System { int m_wheelDeltaAccum; }; -inline void GHOST_SystemWin32::handleKeyboardChange() +inline void GHOST_SystemWin32::handleKeyboardChange(void) { m_keylayout = GetKeyboardLayout(0); /* Get keylayout for current thread. */ int i; diff --git a/intern/ghost/intern/GHOST_WindowCocoa.hh b/intern/ghost/intern/GHOST_WindowCocoa.hh index add896384cd..e773681812a 100644 --- a/intern/ghost/intern/GHOST_WindowCocoa.hh +++ b/intern/ghost/intern/GHOST_WindowCocoa.hh @@ -217,7 +217,7 @@ class GHOST_WindowCocoa : public GHOST_Window { */ GHOST_TSuccess endProgressBar(); - void setNativePixelSize(); + void setNativePixelSize(void); GHOST_TSuccess beginFullScreen() const { @@ -240,7 +240,7 @@ class GHOST_WindowCocoa : public GHOST_Window { { m_immediateDraw = value; } - bool getImmediateDraw() const + bool getImmediateDraw(void) const { return m_immediateDraw; } diff --git a/intern/ghost/intern/GHOST_WindowCocoa.mm b/intern/ghost/intern/GHOST_WindowCocoa.mm index bfed3c0d833..88a28466732 100644 --- a/intern/ghost/intern/GHOST_WindowCocoa.mm +++ b/intern/ghost/intern/GHOST_WindowCocoa.mm @@ -1002,7 +1002,7 @@ NSCursor *GHOST_WindowCocoa::getStandardCursor(GHOST_TStandardCursor shape) cons case GHOST_kStandardCursorStop: return [NSCursor operationNotAllowedCursor]; case GHOST_kStandardCursorMove: - return [NSCursor openHandCursor]; + return [NSCursor pointingHandCursor]; case GHOST_kStandardCursorDefault: return [NSCursor arrowCursor]; case GHOST_kStandardCursorKnife: diff --git a/intern/ghost/intern/GHOST_WindowWayland.cc b/intern/ghost/intern/GHOST_WindowWayland.cc index 93b40b941e3..4420ab54511 100644 --- a/intern/ghost/intern/GHOST_WindowWayland.cc +++ b/intern/ghost/intern/GHOST_WindowWayland.cc @@ -1341,7 +1341,7 @@ static void libdecor_frame_handle_configure(libdecor_frame *frame, /* These values are cleared after use & will practically always be zero. * Read them because it's possible multiple configure calls run before they can be handled. */ - const GWL_LibDecor_Window &decor = *win->libdecor; + GWL_LibDecor_Window &decor = *win->libdecor; size_next[0] = decor.pending.size[0]; size_next[1] = decor.pending.size[1]; } diff --git a/intern/ghost/intern/GHOST_WindowWin32.cc b/intern/ghost/intern/GHOST_WindowWin32.cc index 2f7bf67533b..d6c5e184705 100644 --- a/intern/ghost/intern/GHOST_WindowWin32.cc +++ b/intern/ghost/intern/GHOST_WindowWin32.cc @@ -22,10 +22,6 @@ # include "GHOST_ContextVK.hh" #endif -#ifdef WIN32 -# include "BLI_path_util.h" -#endif - #include #include @@ -131,27 +127,15 @@ GHOST_WindowWin32::GHOST_WindowWin32(GHOST_SystemWin32 *system, if (!setDrawingContextType(type)) { const char *title = "Blender - Unsupported Graphics Card Configuration"; - const char *text = ""; -#if defined(WIN32) - if (strncmp(BLI_getenv("PROCESSOR_IDENTIFIER"), "ARM", 3) == 0) { - text = - "A driver with support for OpenGL 4.3 or higher is required.\n\n" - "If you are on a Qualcomm 8cx Gen3 device or newer, you need to download the" - "\"OpenCLâ„¢, OpenGL®, and Vulkan® Compatibility Pack\" from the MS Store."; - } - else -#endif - { + const char *text = + "A graphics card and driver with support for OpenGL 4.3 or higher is " + "required.\n\nInstalling the latest driver for your graphics card might resolve the " + "issue."; + if (GetSystemMetrics(SM_CMONITORS) > 1) { text = "A graphics card and driver with support for OpenGL 4.3 or higher is " - "required.\n\nInstalling the latest driver for your graphics card might resolve the " - "issue."; - if (GetSystemMetrics(SM_CMONITORS) > 1) { - text = - "A graphics card and driver with support for OpenGL 4.3 or higher is " - "required.\n\nPlugging all monitors into your primary graphics card might resolve " - "this issue. Installing the latest driver for your graphics card could also help."; - } + "required.\n\nPlugging all monitors into your primary graphics card might resolve " + "this issue. Installing the latest driver for your graphics card could also help."; } MessageBox(m_hWnd, text, title, MB_OK | MB_ICONERROR); ::ReleaseDC(m_hWnd, m_hDC); diff --git a/intern/ghost/intern/GHOST_Wintab.hh b/intern/ghost/intern/GHOST_Wintab.hh index 42f1f35012c..2747d61716b 100644 --- a/intern/ghost/intern/GHOST_Wintab.hh +++ b/intern/ghost/intern/GHOST_Wintab.hh @@ -28,23 +28,13 @@ #define PACKETMODE 0 #include -#if !defined(_MSVC_TRADITIONAL) || _MSVC_TRADITIONAL -# define WINTAB_PRINTF(x, ...) \ - { \ - if (GHOST_Wintab::getDebug()) { \ - printf(x, __VA_ARGS__); \ - } \ +#define WINTAB_PRINTF(x, ...) \ + { \ + if (GHOST_Wintab::getDebug()) { \ + printf(x, __VA_ARGS__); \ } \ - (void)0 -#else -# define WINTAB_PRINTF(x, ...) \ - { \ - if (GHOST_Wintab::getDebug()) { \ - printf(x, ##__VA_ARGS__); \ - } \ - } \ - (void)0 -#endif + } \ + (void)0 /* Typedefs for Wintab functions to allow dynamic loading. */ typedef UINT(API *GHOST_WIN32_WTInfo)(UINT, UINT, LPVOID); diff --git a/intern/opencolorio/ocio_impl_glsl.cc b/intern/opencolorio/ocio_impl_glsl.cc index eb62ddb143b..35e4d0b7a90 100644 --- a/intern/opencolorio/ocio_impl_glsl.cc +++ b/intern/opencolorio/ocio_impl_glsl.cc @@ -21,7 +21,7 @@ #include "GPU_immediate.h" #include "GPU_shader.h" -#include "GPU_uniform_buffer.hh" +#include "GPU_uniform_buffer.h" #include "gpu_shader_create_info.hh" diff --git a/intern/opencolorio/ocio_shader_shared.hh b/intern/opencolorio/ocio_shader_shared.hh index 1479d1d02dc..aa5cad193ce 100644 --- a/intern/opencolorio/ocio_shader_shared.hh +++ b/intern/opencolorio/ocio_shader_shared.hh @@ -34,9 +34,9 @@ struct OCIO_GPUParameters { float dither; float scale; float exponent; - bool32_t use_predivide; - bool32_t use_overlay; - bool32_t use_hdr; + bool1 use_predivide; + bool1 use_overlay; + bool1 use_hdr; int _pad0; int _pad1; }; diff --git a/intern/renderdoc_dynload/include/renderdoc_api.hh b/intern/renderdoc_dynload/include/renderdoc_api.hh index e1fcab6aa54..264938d41d6 100644 --- a/intern/renderdoc_dynload/include/renderdoc_api.hh +++ b/intern/renderdoc_dynload/include/renderdoc_api.hh @@ -34,7 +34,6 @@ class Renderdoc { RENDERDOC_WindowHandle window_handle); void end_frame_capture(RENDERDOC_DevicePointer device_handle, RENDERDOC_WindowHandle window_handle); - void set_frame_capture_title(const char *capture_title); private: /** @@ -45,4 +44,4 @@ class Renderdoc { bool check_loaded(); void load(); }; -} // namespace renderdoc::api +} // namespace renderdoc::api \ No newline at end of file diff --git a/intern/renderdoc_dynload/intern/renderdoc_api.cc b/intern/renderdoc_dynload/intern/renderdoc_api.cc index d0f5019fad1..09906e6bdd4 100644 --- a/intern/renderdoc_dynload/intern/renderdoc_api.cc +++ b/intern/renderdoc_dynload/intern/renderdoc_api.cc @@ -33,14 +33,6 @@ void Renderdoc::end_frame_capture(RENDERDOC_DevicePointer device_handle, renderdoc_api_->EndFrameCapture(device_handle, window_handle); } -void Renderdoc::set_frame_capture_title(const char *title) -{ - if (!check_loaded()) { - return; - } - renderdoc_api_->SetCaptureTitle(title); -} - bool Renderdoc::check_loaded() { switch (state_) { @@ -72,4 +64,4 @@ void Renderdoc::load() #endif } -} // namespace renderdoc::api +} // namespace renderdoc::api \ No newline at end of file diff --git a/lib/linux_x64 b/lib/linux_x64 index d983ed32a1e..87f8577ceac 160000 --- a/lib/linux_x64 +++ b/lib/linux_x64 @@ -1 +1 @@ -Subproject commit d983ed32a1e760130ba31ad8a98a94ea943267a2 +Subproject commit 87f8577ceac51577e2753541da4d49963110b59d diff --git a/lib/macos_arm64 b/lib/macos_arm64 index f1caad00e45..3cb32dc5bc2 160000 --- a/lib/macos_arm64 +++ b/lib/macos_arm64 @@ -1 +1 @@ -Subproject commit f1caad00e45d3741f84e5e68197a420f0819bded +Subproject commit 3cb32dc5bc2ddcb2996419bd265670fc91f6afcf diff --git a/lib/macos_x64 b/lib/macos_x64 index c0ef4a3e1bc..69d61acf964 160000 --- a/lib/macos_x64 +++ b/lib/macos_x64 @@ -1 +1 @@ -Subproject commit c0ef4a3e1bcac58868b9b8d0d0b65236f65d6219 +Subproject commit 69d61acf964eb13e25329da2582a39e429a837b2 diff --git a/lib/windows_arm64 b/lib/windows_arm64 deleted file mode 160000 index dc33a870493..00000000000 --- a/lib/windows_arm64 +++ /dev/null @@ -1 +0,0 @@ -Subproject commit dc33a8704935c49dd7a8cf49197fdf42ff52622d diff --git a/lib/windows_x64 b/lib/windows_x64 index a5521c85e03..1a8571ac519 160000 --- a/lib/windows_x64 +++ b/lib/windows_x64 @@ -1 +1 @@ -Subproject commit a5521c85e03bfd1556ff1e63bf7163235c401497 +Subproject commit 1a8571ac5192a45f6fedf2b92932c2f1bf3b09f4 diff --git a/release/datafiles/assets b/release/datafiles/assets index 1d44611dd36..6e43ac4de44 160000 --- a/release/datafiles/assets +++ b/release/datafiles/assets @@ -1 +1 @@ -Subproject commit 1d44611dd36032c1889c66d673801ef7d699f592 +Subproject commit 6e43ac4de4474de1c3b00baceaaa85b79d884222 diff --git a/release/datafiles/blender_icons.svg b/release/datafiles/blender_icons.svg index 4df0f7e3ea8..3becf27cbd0 100644 --- a/release/datafiles/blender_icons.svg +++ b/release/datafiles/blender_icons.svg @@ -41,39 +41,20 @@ guidetolerance="10" inkscape:pageopacity="0" inkscape:pageshadow="2" - inkscape:window-width="1920" - inkscape:window-height="1009" + inkscape:window-width="1837" + inkscape:window-height="962" id="namedview34335" - showgrid="true" - inkscape:zoom="5.6568544" - inkscape:cx="347.80814" - inkscape:cy="81.052113" - inkscape:window-x="1912" - inkscape:window-y="-8" - inkscape:window-maximized="1" + showgrid="false" + inkscape:zoom="2" + inkscape:cx="256" + inkscape:cy="185" + inkscape:window-x="56" + inkscape:window-y="31" + inkscape:window-maximized="0" inkscape:current-layer="layer8" inkscape:showpageshadow="2" inkscape:deskcolor="#808080" - showguides="true" - guidecolor="#c34e00" - guideopacity="0.6"> - - + showguides="true" /> + + + + + + + + + + + + + + + + + + + @@ -15471,6 +15525,27 @@ inkscape:connector-curvature="0" sodipodi:nodetypes="cccccccccccccc" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {name: Standard, colorspace: sRGB} - - ! {name: Khronos PBR Neutral, colorspace: Khronos PBR Neutral sRGB} - ! {name: AgX, colorspace: AgX Base sRGB} - ! {name: Filmic, colorspace: Filmic sRGB} - ! {name: Filmic Log, colorspace: Filmic Log} @@ -79,7 +78,7 @@ displays: - ! {name: False Color, colorspace: AgX False Color Rec.2020} - ! {name: Raw, colorspace: Non-Color} active_displays: [sRGB, Display P3, Rec.1886, Rec.2020] -active_views: [Standard, Khronos PBR Neutral, AgX, Filmic, Filmic Log, False Color, Raw] +active_views: [Standard, AgX, Filmic, Filmic Log, False Color, Raw] inactive_colorspaces: [Luminance Compensation Rec.2020, Luminance Compensation sRGB, Luminance Compensation P3, AgX False Color Rec.709, AgX False Color P3, AgX False Color Rec.1886, AgX False Color Rec.2020] colorspaces: @@ -486,21 +485,6 @@ colorspaces: - ! {src: Linear CIE-XYZ E, dst: AgX False Color Rec.709} - ! {src: Rec.1886, dst: Rec.2020} - - ! - name: Khronos PBR Neutral sRGB - family: Khronos PBR Neutral - equalitygroup: - bitdepth: 32f - description: | - Khronos PBR Neutral Image Encoding for sRGB Display - isdata: false - from_scene_reference: ! - children: - - ! {src: Linear CIE-XYZ E, dst: Linear Rec.709} - - ! {allocation: lg2, vars: [-9, 10]} - - ! {src: pbrNeutral.cube, interpolation: tetrahedral} - - ! {src: Linear Rec.709, dst: sRGB} - looks: - ! name: Very High Contrast @@ -760,4 +744,4 @@ looks: style: log contrast: {rgb: [0.7, 0.7, 0.7], master: 1} saturation: 1.15 - pivot: {contrast: -0.2} \ No newline at end of file + pivot: {contrast: -0.2} diff --git a/release/datafiles/colormanagement/luts/pbrNeutral.cube b/release/datafiles/colormanagement/luts/pbrNeutral.cube deleted file mode 100644 index 82ed019e231..00000000000 --- a/release/datafiles/colormanagement/luts/pbrNeutral.cube +++ /dev/null @@ -1,185198 +0,0 @@ -TITLE "PBR Neutral sRGB" -# PBR Neutral sRGB LUT -DOMAIN_MIN 0 0 0 -DOMAIN_MAX 1 1 1 -LUT_3D_SIZE 57 -0.0000238 0.0000238 0.0000238 -0.0005417 0.0000238 0.0000238 -0.0011968 0.0000238 0.0000238 -0.0020256 0.0000238 0.0000238 -0.0030742 0.0000238 0.0000238 -0.0044007 0.0000238 0.0000238 -0.006079 0.0000238 0.0000238 -0.0082023 0.0000238 0.0000238 -0.0108885 0.0000238 0.0000238 -0.0142868 0.0000238 0.0000238 -0.0185862 0.0000238 0.0000238 -0.0240255 0.0000238 0.0000238 -0.0309069 0.0000238 0.0000238 -0.0396127 0.0000238 0.0000238 -0.0506267 0.0000238 0.0000238 -0.0645609 0.0000238 0.0000238 -0.0821895 0.0000238 0.0000238 -0.1044919 0.0000238 0.0000238 -0.1327073 0.0000238 0.0000238 -0.1684036 0.0000238 0.0000238 -0.2135639 0.0000238 0.0000238 -0.2706977 0.0000238 0.0000238 -0.3429792 0.0000238 0.0000238 -0.4344249 0.0000238 0.0000238 -0.5501155 0.0000238 0.0000238 -0.6964791 0.0000238 0.0000238 -0.8407292 0.0051514 0.0051514 -0.9033413 0.0279321 0.0279321 -0.9354466 0.0624569 0.0624569 -0.9545467 0.1059991 0.1059991 -0.9669269 0.1572498 0.1572498 -0.9754027 0.2151269 0.2151269 -0.9814251 0.2783684 0.2783684 -0.9858181 0.3454107 0.3454107 -0.9890841 0.4144197 0.4144197 -0.9915469 0.4834235 0.4834235 -0.993424 0.5504963 0.5504963 -0.9948662 0.6139459 0.6139459 -0.9959813 0.6724572 0.6724572 -0.9968475 0.7251659 0.7251659 -0.997523 0.7716588 0.7716588 -0.9980513 0.8119154 0.8119154 -0.9984653 0.8462171 0.8462171 -0.9987905 0.8750477 0.8750477 -0.9990461 0.8990028 0.8990028 -0.9992474 0.9187175 0.9187175 -0.999406 0.9348153 0.9348153 -0.999531 0.9478754 0.9478754 -0.9996296 0.958416 0.958416 -0.9997074 0.9668873 0.9668873 -0.9997689 0.9736726 0.9736726 -0.9998174 0.9790927 0.9790927 -0.9998557 0.9834129 0.9834129 -0.999886 0.9868505 0.9868505 -0.9999099 0.989582 0.989582 -0.9999288 0.9917501 0.9917501 -0.9999437 0.9934695 0.9934695 -0.0000238 0.0005417 0.0000238 -0.0005417 0.0005417 0.0000238 -0.0011968 0.0005417 0.0000238 -0.0020256 0.0005417 0.0000238 -0.0030742 0.0005417 0.0000238 -0.0044007 0.0005417 0.0000238 -0.006079 0.0005417 0.0000238 -0.0082023 0.0005417 0.0000238 -0.0108885 0.0005417 0.0000238 -0.0142868 0.0005417 0.0000238 -0.0185862 0.0005417 0.0000238 -0.0240255 0.0005417 0.0000238 -0.0309069 0.0005417 0.0000238 -0.0396127 0.0005417 0.0000238 -0.0506267 0.0005417 0.0000238 -0.0645609 0.0005417 0.0000238 -0.0821895 0.0005417 0.0000238 -0.1044919 0.0005417 0.0000238 -0.1327073 0.0005417 0.0000238 -0.1684036 0.0005417 0.0000238 -0.2135639 0.0005417 0.0000238 -0.2706977 0.0005417 0.0000238 -0.3429792 0.0005417 0.0000238 -0.4344249 0.0005417 0.0000238 -0.5501155 0.0005417 0.0000238 -0.6964791 0.0005417 0.0000238 -0.8407292 0.0056422 0.0051514 -0.9033413 0.0283384 0.0279321 -0.9354466 0.062777 0.0624569 -0.9545467 0.1062449 0.1059991 -0.9669269 0.1574352 0.1572498 -0.9754027 0.2152645 0.2151269 -0.9814251 0.278469 0.2783684 -0.9858181 0.3454831 0.3454107 -0.9890841 0.4144711 0.4144197 -0.9915469 0.4834593 0.4834235 -0.993424 0.550521 0.5504963 -0.9948662 0.6139627 0.6139459 -0.9959813 0.6724685 0.6724572 -0.9968475 0.7251734 0.7251659 -0.997523 0.7716637 0.7716588 -0.9980513 0.8119186 0.8119154 -0.9984653 0.8462191 0.8462171 -0.9987905 0.875049 0.8750477 -0.9990461 0.8990036 0.8990028 -0.9992474 0.918718 0.9187175 -0.999406 0.9348156 0.9348153 -0.999531 0.9478756 0.9478754 -0.9996296 0.9584161 0.958416 -0.9997074 0.9668874 0.9668873 -0.9997689 0.9736727 0.9736726 -0.9998174 0.9790928 0.9790927 -0.9998557 0.983413 0.9834129 -0.999886 0.9868505 0.9868505 -0.9999099 0.989582 0.989582 -0.9999288 0.9917501 0.9917501 -0.9999437 0.9934695 0.9934695 -0.0000238 0.0011968 0.0000238 -0.0005417 0.0011968 0.0000238 -0.0011968 0.0011968 0.0000238 -0.0020256 0.0011968 0.0000238 -0.0030742 0.0011968 0.0000238 -0.0044007 0.0011968 0.0000238 -0.006079 0.0011968 0.0000238 -0.0082023 0.0011968 0.0000238 -0.0108885 0.0011968 0.0000238 -0.0142868 0.0011968 0.0000238 -0.0185862 0.0011968 0.0000238 -0.0240255 0.0011968 0.0000238 -0.0309069 0.0011968 0.0000238 -0.0396127 0.0011968 0.0000238 -0.0506267 0.0011968 0.0000238 -0.0645609 0.0011968 0.0000238 -0.0821895 0.0011968 0.0000238 -0.1044919 0.0011968 0.0000238 -0.1327073 0.0011968 0.0000238 -0.1684036 0.0011968 0.0000238 -0.2135639 0.0011968 0.0000238 -0.2706977 0.0011968 0.0000238 -0.3429792 0.0011968 0.0000238 -0.4344249 0.0011968 0.0000238 -0.5501155 0.0011968 0.0000238 -0.6964791 0.0011968 0.0000238 -0.8407292 0.0062631 0.0051514 -0.9033413 0.0288523 0.0279321 -0.9354466 0.063182 0.0624569 -0.9545467 0.106556 0.1059991 -0.9669269 0.1576697 0.1572498 -0.9754027 0.2154385 0.2151269 -0.9814251 0.2785962 0.2783684 -0.9858181 0.3455746 0.3454107 -0.9890841 0.414536 0.4144197 -0.9915469 0.4835047 0.4834235 -0.993424 0.5505523 0.5504963 -0.9948662 0.6139839 0.6139459 -0.9959813 0.6724827 0.6724572 -0.9968475 0.7251829 0.7251659 -0.997523 0.77167 0.7716588 -0.9980513 0.8119226 0.8119154 -0.9984653 0.8462218 0.8462171 -0.9987905 0.8750507 0.8750477 -0.9990461 0.8990047 0.8990028 -0.9992474 0.9187187 0.9187175 -0.999406 0.934816 0.9348153 -0.999531 0.9478759 0.9478754 -0.9996296 0.9584163 0.958416 -0.9997074 0.9668875 0.9668873 -0.9997689 0.9736727 0.9736726 -0.9998174 0.9790928 0.9790927 -0.9998557 0.983413 0.9834129 -0.999886 0.9868505 0.9868505 -0.9999099 0.989582 0.989582 -0.9999288 0.9917501 0.9917501 -0.9999437 0.9934695 0.9934695 -0.0000238 0.0020256 0.0000238 -0.0005417 0.0020256 0.0000238 -0.0011968 0.0020256 0.0000238 -0.0020256 0.0020256 0.0000238 -0.0030742 0.0020256 0.0000238 -0.0044007 0.0020256 0.0000238 -0.006079 0.0020256 0.0000238 -0.0082023 0.0020256 0.0000238 -0.0108885 0.0020256 0.0000238 -0.0142868 0.0020256 0.0000238 -0.0185862 0.0020256 0.0000238 -0.0240255 0.0020256 0.0000238 -0.0309069 0.0020256 0.0000238 -0.0396127 0.0020256 0.0000238 -0.0506267 0.0020256 0.0000238 -0.0645609 0.0020256 0.0000238 -0.0821895 0.0020256 0.0000238 -0.1044919 0.0020256 0.0000238 -0.1327073 0.0020256 0.0000238 -0.1684036 0.0020256 0.0000238 -0.2135639 0.0020256 0.0000238 -0.2706977 0.0020256 0.0000238 -0.3429792 0.0020256 0.0000238 -0.4344249 0.0020256 0.0000238 -0.5501155 0.0020256 0.0000238 -0.6964791 0.0020256 0.0000238 -0.8407292 0.0070486 0.0051514 -0.9033413 0.0295025 0.0279321 -0.9354466 0.0636943 0.0624569 -0.9545467 0.1069495 0.1059991 -0.9669269 0.1579665 0.1572498 -0.9754027 0.2156587 0.2151269 -0.9814251 0.2787571 0.2783684 -0.9858181 0.3456905 0.3454107 -0.9890841 0.4146182 0.4144197 -0.9915469 0.4835622 0.4834235 -0.993424 0.5505918 0.5504963 -0.9948662 0.6140108 0.6139459 -0.9959813 0.6725008 0.6724572 -0.9968475 0.7251949 0.7251659 -0.997523 0.7716778 0.7716588 -0.9980513 0.8119278 0.8119154 -0.9984653 0.8462251 0.8462171 -0.9987905 0.8750528 0.8750477 -0.9990461 0.8990061 0.8990028 -0.9992474 0.9187196 0.9187175 -0.999406 0.9348166 0.9348153 -0.999531 0.9478762 0.9478754 -0.9996296 0.9584165 0.958416 -0.9997074 0.9668877 0.9668873 -0.9997689 0.9736728 0.9736726 -0.9998174 0.9790929 0.9790927 -0.9998557 0.983413 0.9834129 -0.999886 0.9868506 0.9868505 -0.9999099 0.989582 0.989582 -0.9999288 0.9917501 0.9917501 -0.9999437 0.9934695 0.9934695 -0.0000238 0.0030742 0.0000238 -0.0005417 0.0030742 0.0000238 -0.0011968 0.0030742 0.0000238 -0.0020256 0.0030742 0.0000238 -0.0030742 0.0030742 0.0000238 -0.0044007 0.0030742 0.0000238 -0.006079 0.0030742 0.0000238 -0.0082023 0.0030742 0.0000238 -0.0108885 0.0030742 0.0000238 -0.0142868 0.0030742 0.0000238 -0.0185862 0.0030742 0.0000238 -0.0240255 0.0030742 0.0000238 -0.0309069 0.0030742 0.0000238 -0.0396127 0.0030742 0.0000238 -0.0506267 0.0030742 0.0000238 -0.0645609 0.0030742 0.0000238 -0.0821895 0.0030742 0.0000238 -0.1044919 0.0030742 0.0000238 -0.1327073 0.0030742 0.0000238 -0.1684036 0.0030742 0.0000238 -0.2135639 0.0030742 0.0000238 -0.2706977 0.0030742 0.0000238 -0.3429792 0.0030742 0.0000238 -0.4344249 0.0030742 0.0000238 -0.5501155 0.0030742 0.0000238 -0.6964791 0.0030742 0.0000238 -0.8407292 0.0080424 0.0051514 -0.9033413 0.0303251 0.0279321 -0.9354466 0.0643425 0.0624569 -0.9545467 0.1074473 0.1059991 -0.9669269 0.1583419 0.1572498 -0.9754027 0.2159373 0.2151269 -0.9814251 0.2789607 0.2783684 -0.9858181 0.3458371 0.3454107 -0.9890841 0.4147221 0.4144197 -0.9915469 0.4836348 0.4834235 -0.993424 0.5506419 0.5504963 -0.9948662 0.6140448 0.6139459 -0.9959813 0.6725236 0.6724572 -0.9968475 0.72521 0.7251659 -0.997523 0.7716878 0.7716588 -0.9980513 0.8119343 0.8119154 -0.9984653 0.8462293 0.8462171 -0.9987905 0.8750555 0.8750477 -0.9990461 0.8990078 0.8990028 -0.9992474 0.9187207 0.9187175 -0.999406 0.9348173 0.9348153 -0.999531 0.9478767 0.9478754 -0.9996296 0.9584168 0.958416 -0.9997074 0.9668878 0.9668873 -0.9997689 0.9736729 0.9736726 -0.9998174 0.9790929 0.9790927 -0.9998557 0.9834131 0.9834129 -0.999886 0.9868506 0.9868505 -0.9999099 0.9895821 0.989582 -0.9999288 0.9917501 0.9917501 -0.9999437 0.9934695 0.9934695 -0.0000238 0.0044007 0.0000238 -0.0005417 0.0044007 0.0000238 -0.0011968 0.0044007 0.0000238 -0.0020256 0.0044007 0.0000238 -0.0030742 0.0044007 0.0000238 -0.0044007 0.0044007 0.0000238 -0.006079 0.0044007 0.0000238 -0.0082023 0.0044007 0.0000238 -0.0108885 0.0044007 0.0000238 -0.0142868 0.0044007 0.0000238 -0.0185862 0.0044007 0.0000238 -0.0240255 0.0044007 0.0000238 -0.0309069 0.0044007 0.0000238 -0.0396127 0.0044007 0.0000238 -0.0506267 0.0044007 0.0000238 -0.0645609 0.0044007 0.0000238 -0.0821895 0.0044007 0.0000238 -0.1044919 0.0044007 0.0000238 -0.1327073 0.0044007 0.0000238 -0.1684036 0.0044007 0.0000238 -0.2135639 0.0044007 0.0000238 -0.2706977 0.0044007 0.0000238 -0.3429792 0.0044007 0.0000238 -0.4344249 0.0044007 0.0000238 -0.5501155 0.0044007 0.0000238 -0.6964791 0.0044007 0.0000238 -0.8407292 0.0092997 0.0051514 -0.9033413 0.0313658 0.0279321 -0.9354466 0.0651625 0.0624569 -0.9545467 0.1080772 0.1059991 -0.9669269 0.1588168 0.1572498 -0.9754027 0.2162897 0.2151269 -0.9814251 0.2792183 0.2783684 -0.9858181 0.3460225 0.3454107 -0.9890841 0.4148536 0.4144197 -0.9915469 0.4837267 0.4834235 -0.993424 0.5507052 0.5504963 -0.9948662 0.6140879 0.6139459 -0.9959813 0.6725525 0.6724572 -0.9968475 0.7252292 0.7251659 -0.997523 0.7717004 0.7716588 -0.9980513 0.8119425 0.8119154 -0.9984653 0.8462346 0.8462171 -0.9987905 0.8750589 0.8750477 -0.9990461 0.89901 0.8990028 -0.9992474 0.9187221 0.9187175 -0.999406 0.9348182 0.9348153 -0.999531 0.9478772 0.9478754 -0.9996296 0.9584171 0.958416 -0.9997074 0.9668881 0.9668873 -0.9997689 0.9736731 0.9736726 -0.9998174 0.979093 0.9790927 -0.9998557 0.9834131 0.9834129 -0.999886 0.9868506 0.9868505 -0.9999099 0.9895821 0.989582 -0.9999288 0.9917501 0.9917501 -0.9999437 0.9934695 0.9934695 -0.0000238 0.006079 0.0000238 -0.0005417 0.006079 0.0000238 -0.0011968 0.006079 0.0000238 -0.0020256 0.006079 0.0000238 -0.0030742 0.006079 0.0000238 -0.0044007 0.006079 0.0000238 -0.006079 0.006079 0.0000238 -0.0082023 0.006079 0.0000238 -0.0108885 0.006079 0.0000238 -0.0142868 0.006079 0.0000238 -0.0185862 0.006079 0.0000238 -0.0240255 0.006079 0.0000238 -0.0309069 0.006079 0.0000238 -0.0396127 0.006079 0.0000238 -0.0506267 0.006079 0.0000238 -0.0645609 0.006079 0.0000238 -0.0821895 0.006079 0.0000238 -0.1044919 0.006079 0.0000238 -0.1327073 0.006079 0.0000238 -0.1684036 0.006079 0.0000238 -0.2135639 0.006079 0.0000238 -0.2706977 0.006079 0.0000238 -0.3429792 0.006079 0.0000238 -0.4344249 0.006079 0.0000238 -0.5501155 0.006079 0.0000238 -0.6964791 0.006079 0.0000238 -0.8407292 0.0108903 0.0051514 -0.9033413 0.0326824 0.0279321 -0.9354466 0.0662 0.0624569 -0.9545467 0.108874 0.1059991 -0.9669269 0.1594176 0.1572498 -0.9754027 0.2167356 0.2151269 -0.9814251 0.2795441 0.2783684 -0.9858181 0.3462571 0.3454107 -0.9890841 0.41502 0.4144197 -0.9915469 0.483843 0.4834235 -0.993424 0.5507853 0.5504963 -0.9948662 0.6141423 0.6139459 -0.9959813 0.6725891 0.6724572 -0.9968475 0.7252535 0.7251659 -0.997523 0.7717164 0.7716588 -0.9980513 0.8119529 0.8119154 -0.9984653 0.8462413 0.8462171 -0.9987905 0.8750632 0.8750477 -0.9990461 0.8990127 0.8990028 -0.9992474 0.9187238 0.9187175 -0.999406 0.9348193 0.9348153 -0.999531 0.9478779 0.9478754 -0.9996296 0.9584176 0.958416 -0.9997074 0.9668883 0.9668873 -0.9997689 0.9736733 0.9736726 -0.9998174 0.9790931 0.9790927 -0.9998557 0.9834132 0.9834129 -0.999886 0.9868507 0.9868505 -0.9999099 0.9895821 0.989582 -0.9999288 0.9917502 0.9917501 -0.9999437 0.9934695 0.9934695 -0.0000238 0.0082023 0.0000238 -0.0005417 0.0082023 0.0000238 -0.0011968 0.0082023 0.0000238 -0.0020256 0.0082023 0.0000238 -0.0030742 0.0082023 0.0000238 -0.0044007 0.0082023 0.0000238 -0.006079 0.0082023 0.0000238 -0.0082023 0.0082023 0.0000238 -0.0108885 0.0082023 0.0000238 -0.0142868 0.0082023 0.0000238 -0.0185862 0.0082023 0.0000238 -0.0240255 0.0082023 0.0000238 -0.0309069 0.0082023 0.0000238 -0.0396127 0.0082023 0.0000238 -0.0506267 0.0082023 0.0000238 -0.0645609 0.0082023 0.0000238 -0.0821895 0.0082023 0.0000238 -0.1044919 0.0082023 0.0000238 -0.1327073 0.0082023 0.0000238 -0.1684036 0.0082023 0.0000238 -0.2135639 0.0082023 0.0000238 -0.2706977 0.0082023 0.0000238 -0.3429792 0.0082023 0.0000238 -0.4344249 0.0082023 0.0000238 -0.5501155 0.0082023 0.0000238 -0.6964791 0.0082023 0.0000238 -0.8407292 0.0129027 0.0051514 -0.9033413 0.0343481 0.0279321 -0.9354466 0.0675125 0.0624569 -0.9545467 0.1098821 0.1059991 -0.9669269 0.1601778 0.1572498 -0.9754027 0.2172997 0.2151269 -0.9814251 0.2799564 0.2783684 -0.9858181 0.3465539 0.3454107 -0.9890841 0.4152305 0.4144197 -0.9915469 0.4839901 0.4834235 -0.993424 0.5508867 0.5504963 -0.9948662 0.6142112 0.6139459 -0.9959813 0.6726353 0.6724572 -0.9968475 0.7252842 0.7251659 -0.997523 0.7717365 0.7716588 -0.9980513 0.811966 0.8119154 -0.9984653 0.8462498 0.8462171 -0.9987905 0.8750687 0.8750477 -0.9990461 0.8990162 0.8990028 -0.9992474 0.918726 0.9187175 -0.999406 0.9348207 0.9348153 -0.999531 0.9478788 0.9478754 -0.9996296 0.9584181 0.958416 -0.9997074 0.9668887 0.9668873 -0.9997689 0.9736735 0.9736726 -0.9998174 0.9790933 0.9790927 -0.9998557 0.9834133 0.9834129 -0.999886 0.9868507 0.9868505 -0.9999099 0.9895821 0.989582 -0.9999288 0.9917502 0.9917501 -0.9999437 0.9934695 0.9934695 -0.0000238 0.0108885 0.0000238 -0.0005417 0.0108885 0.0000238 -0.0011968 0.0108885 0.0000238 -0.0020256 0.0108885 0.0000238 -0.0030742 0.0108885 0.0000238 -0.0044007 0.0108885 0.0000238 -0.006079 0.0108885 0.0000238 -0.0082023 0.0108885 0.0000238 -0.0108885 0.0108885 0.0000238 -0.0142868 0.0108885 0.0000238 -0.0185862 0.0108885 0.0000238 -0.0240255 0.0108885 0.0000238 -0.0309069 0.0108885 0.0000238 -0.0396127 0.0108885 0.0000238 -0.0506267 0.0108885 0.0000238 -0.0645609 0.0108885 0.0000238 -0.0821895 0.0108885 0.0000238 -0.1044919 0.0108885 0.0000238 -0.1327073 0.0108885 0.0000238 -0.1684036 0.0108885 0.0000238 -0.2135639 0.0108885 0.0000238 -0.2706977 0.0108885 0.0000238 -0.3429792 0.0108885 0.0000238 -0.4344249 0.0108885 0.0000238 -0.5501155 0.0108885 0.0000238 -0.6964791 0.0108885 0.0000238 -0.8407292 0.0154486 0.0051514 -0.9033413 0.0364554 0.0279321 -0.9354466 0.0691729 0.0624569 -0.9545467 0.1111575 0.1059991 -0.9669269 0.1611395 0.1572498 -0.9754027 0.2180133 0.2151269 -0.9814251 0.2804779 0.2783684 -0.9858181 0.3469293 0.3454107 -0.9890841 0.4154968 0.4144197 -0.9915469 0.4841762 0.4834235 -0.993424 0.5510149 0.5504963 -0.9948662 0.6142984 0.6139459 -0.9959813 0.6726938 0.6724572 -0.9968475 0.725323 0.7251659 -0.997523 0.771762 0.7716588 -0.9980513 0.8119826 0.8119154 -0.9984653 0.8462605 0.8462171 -0.9987905 0.8750756 0.8750477 -0.9990461 0.8990206 0.8990028 -0.9992474 0.9187289 0.9187175 -0.999406 0.9348225 0.9348153 -0.999531 0.9478799 0.9478754 -0.9996296 0.9584189 0.958416 -0.9997074 0.9668891 0.9668873 -0.9997689 0.9736738 0.9736726 -0.9998174 0.9790934 0.9790927 -0.9998557 0.9834134 0.9834129 -0.999886 0.9868508 0.9868505 -0.9999099 0.9895822 0.989582 -0.9999288 0.9917502 0.9917501 -0.9999437 0.9934696 0.9934695 -0.0000238 0.0142868 0.0000238 -0.0005417 0.0142868 0.0000238 -0.0011968 0.0142868 0.0000238 -0.0020256 0.0142868 0.0000238 -0.0030742 0.0142868 0.0000238 -0.0044007 0.0142868 0.0000238 -0.006079 0.0142868 0.0000238 -0.0082023 0.0142868 0.0000238 -0.0108885 0.0142868 0.0000238 -0.0142868 0.0142868 0.0000238 -0.0185862 0.0142868 0.0000238 -0.0240255 0.0142868 0.0000238 -0.0309069 0.0142868 0.0000238 -0.0396127 0.0142868 0.0000238 -0.0506267 0.0142868 0.0000238 -0.0645609 0.0142868 0.0000238 -0.0821895 0.0142868 0.0000238 -0.1044919 0.0142868 0.0000238 -0.1327073 0.0142868 0.0000238 -0.1684036 0.0142868 0.0000238 -0.2135639 0.0142868 0.0000238 -0.2706977 0.0142868 0.0000238 -0.3429792 0.0142868 0.0000238 -0.4344249 0.0142868 0.0000238 -0.5501155 0.0142868 0.0000238 -0.6964791 0.0142868 0.0000238 -0.8407292 0.0186694 0.0051514 -0.9033413 0.0391214 0.0279321 -0.9354466 0.0712736 0.0624569 -0.9545467 0.112771 0.1059991 -0.9669269 0.1623561 0.1572498 -0.9754027 0.2189162 0.2151269 -0.9814251 0.2811378 0.2783684 -0.9858181 0.3474044 0.3454107 -0.9890841 0.4158337 0.4144197 -0.9915469 0.4844116 0.4834235 -0.993424 0.5511771 0.5504963 -0.9948662 0.6144087 0.6139459 -0.9959813 0.6727678 0.6724572 -0.9968475 0.7253722 0.7251659 -0.997523 0.7717943 0.7716588 -0.9980513 0.8120036 0.8119154 -0.9984653 0.8462741 0.8462171 -0.9987905 0.8750843 0.8750477 -0.9990461 0.8990262 0.8990028 -0.9992474 0.9187324 0.9187175 -0.999406 0.9348247 0.9348153 -0.999531 0.9478814 0.9478754 -0.9996296 0.9584198 0.958416 -0.9997074 0.9668897 0.9668873 -0.9997689 0.9736741 0.9736726 -0.9998174 0.9790937 0.9790927 -0.9998557 0.9834135 0.9834129 -0.999886 0.9868509 0.9868505 -0.9999099 0.9895822 0.989582 -0.9999288 0.9917502 0.9917501 -0.9999437 0.9934696 0.9934695 -0.0000238 0.0185862 0.0000238 -0.0005417 0.0185862 0.0000238 -0.0011968 0.0185862 0.0000238 -0.0020256 0.0185862 0.0000238 -0.0030742 0.0185862 0.0000238 -0.0044007 0.0185862 0.0000238 -0.006079 0.0185862 0.0000238 -0.0082023 0.0185862 0.0000238 -0.0108885 0.0185862 0.0000238 -0.0142868 0.0185862 0.0000238 -0.0185862 0.0185862 0.0000238 -0.0240255 0.0185862 0.0000238 -0.0309069 0.0185862 0.0000238 -0.0396127 0.0185862 0.0000238 -0.0506267 0.0185862 0.0000238 -0.0645609 0.0185862 0.0000238 -0.0821895 0.0185862 0.0000238 -0.1044919 0.0185862 0.0000238 -0.1327073 0.0185862 0.0000238 -0.1684036 0.0185862 0.0000238 -0.2135639 0.0185862 0.0000238 -0.2706977 0.0185862 0.0000238 -0.3429792 0.0185862 0.0000238 -0.4344249 0.0185862 0.0000238 -0.5501155 0.0185862 0.0000238 -0.6964791 0.0185862 0.0000238 -0.8407292 0.0227443 0.0051514 -0.9033413 0.0424942 0.0279321 -0.9354466 0.0739313 0.0624569 -0.9545467 0.1148123 0.1059991 -0.9669269 0.1638954 0.1572498 -0.9754027 0.2200584 0.2151269 -0.9814251 0.2819726 0.2783684 -0.9858181 0.3480054 0.3454107 -0.9890841 0.4162599 0.4144197 -0.9915469 0.4847095 0.4834235 -0.993424 0.5513823 0.5504963 -0.9948662 0.6145482 0.6139459 -0.9959813 0.6728615 0.6724572 -0.9968475 0.7254343 0.7251659 -0.997523 0.7718352 0.7716588 -0.9980513 0.8120303 0.8119154 -0.9984653 0.8462913 0.8462171 -0.9987905 0.8750954 0.8750477 -0.9990461 0.8990333 0.8990028 -0.9992474 0.9187369 0.9187175 -0.999406 0.9348276 0.9348153 -0.999531 0.9478832 0.9478754 -0.9996296 0.9584209 0.958416 -0.9997074 0.9668904 0.9668873 -0.9997689 0.9736746 0.9736726 -0.9998174 0.9790939 0.9790927 -0.9998557 0.9834137 0.9834129 -0.999886 0.986851 0.9868505 -0.9999099 0.9895823 0.989582 -0.9999288 0.9917503 0.9917501 -0.9999437 0.9934696 0.9934695 -0.0000238 0.0240255 0.0000238 -0.0005417 0.0240255 0.0000238 -0.0011968 0.0240255 0.0000238 -0.0020256 0.0240255 0.0000238 -0.0030742 0.0240255 0.0000238 -0.0044007 0.0240255 0.0000238 -0.006079 0.0240255 0.0000238 -0.0082023 0.0240255 0.0000238 -0.0108885 0.0240255 0.0000238 -0.0142868 0.0240255 0.0000238 -0.0185862 0.0240255 0.0000238 -0.0240255 0.0240255 0.0000238 -0.0309069 0.0240255 0.0000238 -0.0396127 0.0240255 0.0000238 -0.0506267 0.0240255 0.0000238 -0.0645609 0.0240255 0.0000238 -0.0821895 0.0240255 0.0000238 -0.1044919 0.0240255 0.0000238 -0.1327073 0.0240255 0.0000238 -0.1684036 0.0240255 0.0000238 -0.2135639 0.0240255 0.0000238 -0.2706977 0.0240255 0.0000238 -0.3429792 0.0240255 0.0000238 -0.4344249 0.0240255 0.0000238 -0.5501155 0.0240255 0.0000238 -0.6964791 0.0240255 0.0000238 -0.8407292 0.0278994 0.0051514 -0.9033413 0.0467613 0.0279321 -0.9354466 0.0772936 0.0624569 -0.9545467 0.1173948 0.1059991 -0.9669269 0.1658427 0.1572498 -0.9754027 0.2215035 0.2151269 -0.9814251 0.2830287 0.2783684 -0.9858181 0.3487657 0.3454107 -0.9890841 0.4167992 0.4144197 -0.9915469 0.4850864 0.4834235 -0.993424 0.551642 0.5504963 -0.9948662 0.6147247 0.6139459 -0.9959813 0.67298 0.6724572 -0.9968475 0.725513 0.7251659 -0.997523 0.7718869 0.7716588 -0.9980513 0.8120639 0.8119154 -0.9984653 0.8463131 0.8462171 -0.9987905 0.8751094 0.8750477 -0.9990461 0.8990422 0.8990028 -0.9992474 0.9187426 0.9187175 -0.999406 0.9348312 0.9348153 -0.999531 0.9478854 0.9478754 -0.9996296 0.9584223 0.958416 -0.9997074 0.9668913 0.9668873 -0.9997689 0.9736751 0.9736726 -0.9998174 0.9790943 0.9790927 -0.9998557 0.9834139 0.9834129 -0.999886 0.9868511 0.9868505 -0.9999099 0.9895824 0.989582 -0.9999288 0.9917503 0.9917501 -0.9999437 0.9934696 0.9934695 -0.0000238 0.0309069 0.0000238 -0.0005417 0.0309069 0.0000238 -0.0011968 0.0309069 0.0000238 -0.0020256 0.0309069 0.0000238 -0.0030742 0.0309069 0.0000238 -0.0044007 0.0309069 0.0000238 -0.006079 0.0309069 0.0000238 -0.0082023 0.0309069 0.0000238 -0.0108885 0.0309069 0.0000238 -0.0142868 0.0309069 0.0000238 -0.0185862 0.0309069 0.0000238 -0.0240255 0.0309069 0.0000238 -0.0309069 0.0309069 0.0000238 -0.0396127 0.0309069 0.0000238 -0.0506267 0.0309069 0.0000238 -0.0645609 0.0309069 0.0000238 -0.0821895 0.0309069 0.0000238 -0.1044919 0.0309069 0.0000238 -0.1327073 0.0309069 0.0000238 -0.1684036 0.0309069 0.0000238 -0.2135639 0.0309069 0.0000238 -0.2706977 0.0309069 0.0000238 -0.3429792 0.0309069 0.0000238 -0.4344249 0.0309069 0.0000238 -0.5501155 0.0309069 0.0000238 -0.6964791 0.0309069 0.0000238 -0.8407292 0.0344214 0.0051514 -0.9033413 0.0521597 0.0279321 -0.9354466 0.0815473 0.0624569 -0.9545467 0.120662 0.1059991 -0.9669269 0.1683064 0.1572498 -0.9754027 0.2233317 0.2151269 -0.9814251 0.2843648 0.2783684 -0.9858181 0.3497276 0.3454107 -0.9890841 0.4174814 0.4144197 -0.9915469 0.4855631 0.4834235 -0.993424 0.5519704 0.5504963 -0.9948662 0.6149479 0.6139459 -0.9959813 0.6731299 0.6724572 -0.9968475 0.7256124 0.7251659 -0.997523 0.7719522 0.7716588 -0.9980513 0.8121065 0.8119154 -0.9984653 0.8463406 0.8462171 -0.9987905 0.8751271 0.8750477 -0.9990461 0.8990535 0.8990028 -0.9992474 0.9187498 0.9187175 -0.999406 0.9348357 0.9348153 -0.999531 0.9478883 0.9478754 -0.9996296 0.9584241 0.958416 -0.9997074 0.9668925 0.9668873 -0.9997689 0.9736758 0.9736726 -0.9998174 0.9790948 0.9790927 -0.9998557 0.9834142 0.9834129 -0.999886 0.9868513 0.9868505 -0.9999099 0.9895825 0.989582 -0.9999288 0.9917504 0.9917501 -0.9999437 0.9934697 0.9934695 -0.0000238 0.0396127 0.0000238 -0.0005417 0.0396127 0.0000238 -0.0011968 0.0396127 0.0000238 -0.0020256 0.0396127 0.0000238 -0.0030742 0.0396127 0.0000238 -0.0044007 0.0396127 0.0000238 -0.006079 0.0396127 0.0000238 -0.0082023 0.0396127 0.0000238 -0.0108885 0.0396127 0.0000238 -0.0142868 0.0396127 0.0000238 -0.0185862 0.0396127 0.0000238 -0.0240255 0.0396127 0.0000238 -0.0309069 0.0396127 0.0000238 -0.0396127 0.0396127 0.0000238 -0.0506267 0.0396127 0.0000238 -0.0645609 0.0396127 0.0000238 -0.0821895 0.0396127 0.0000238 -0.1044919 0.0396127 0.0000238 -0.1327073 0.0396127 0.0000238 -0.1684036 0.0396127 0.0000238 -0.2135639 0.0396127 0.0000238 -0.2706977 0.0396127 0.0000238 -0.3429792 0.0396127 0.0000238 -0.4344249 0.0396127 0.0000238 -0.5501155 0.0396127 0.0000238 -0.6964791 0.0396127 0.0000238 -0.8407292 0.0426726 0.0051514 -0.9033413 0.0589895 0.0279321 -0.9354466 0.0869288 0.0624569 -0.9545467 0.1247954 0.1059991 -0.9669269 0.1714232 0.1572498 -0.9754027 0.2256446 0.2151269 -0.9814251 0.2860552 0.2783684 -0.9858181 0.3509445 0.3454107 -0.9890841 0.4183444 0.4144197 -0.9915469 0.4861663 0.4834235 -0.993424 0.552386 0.5504963 -0.9948662 0.6152304 0.6139459 -0.9959813 0.6733195 0.6724572 -0.9968475 0.7257383 0.7251659 -0.997523 0.7720349 0.7716588 -0.9980513 0.8121604 0.8119154 -0.9984653 0.8463755 0.8462171 -0.9987905 0.8751494 0.8750477 -0.9990461 0.8990678 0.8990028 -0.9992474 0.9187589 0.9187175 -0.999406 0.9348415 0.9348153 -0.999531 0.947892 0.9478754 -0.9996296 0.9584264 0.958416 -0.9997074 0.9668939 0.9668873 -0.9997689 0.9736768 0.9736726 -0.9998174 0.9790953 0.9790927 -0.9998557 0.9834146 0.9834129 -0.999886 0.9868515 0.9868505 -0.9999099 0.9895826 0.989582 -0.9999288 0.9917505 0.9917501 -0.9999437 0.9934697 0.9934695 -0.0000238 0.0506267 0.0000238 -0.0005417 0.0506267 0.0000238 -0.0011968 0.0506267 0.0000238 -0.0020256 0.0506267 0.0000238 -0.0030742 0.0506267 0.0000238 -0.0044007 0.0506267 0.0000238 -0.006079 0.0506267 0.0000238 -0.0082023 0.0506267 0.0000238 -0.0108885 0.0506267 0.0000238 -0.0142868 0.0506267 0.0000238 -0.0185862 0.0506267 0.0000238 -0.0240255 0.0506267 0.0000238 -0.0309069 0.0506267 0.0000238 -0.0396127 0.0506267 0.0000238 -0.0506267 0.0506267 0.0000238 -0.0645609 0.0506267 0.0000238 -0.0821895 0.0506267 0.0000238 -0.1044919 0.0506267 0.0000238 -0.1327073 0.0506267 0.0000238 -0.1684036 0.0506267 0.0000238 -0.2135639 0.0506267 0.0000238 -0.2706977 0.0506267 0.0000238 -0.3429792 0.0506267 0.0000238 -0.4344249 0.0506267 0.0000238 -0.5501155 0.0506267 0.0000238 -0.6964791 0.0506267 0.0000238 -0.8407292 0.0531113 0.0051514 -0.9033413 0.0676299 0.0279321 -0.9354466 0.0937372 0.0624569 -0.9545467 0.1300248 0.1059991 -0.9669269 0.1753664 0.1572498 -0.9754027 0.2285707 0.2151269 -0.9814251 0.2881937 0.2783684 -0.9858181 0.352484 0.3454107 -0.9890841 0.4194363 0.4144197 -0.9915469 0.4869294 0.4834235 -0.993424 0.5529117 0.5504963 -0.9948662 0.6155878 0.6139459 -0.9959813 0.6735594 0.6724572 -0.9968475 0.7258976 0.7251659 -0.997523 0.7721396 0.7716588 -0.9980513 0.8122285 0.8119154 -0.9984653 0.8464195 0.8462171 -0.9987905 0.8751778 0.8750477 -0.9990461 0.8990859 0.8990028 -0.9992474 0.9187704 0.9187175 -0.999406 0.9348488 0.9348153 -0.999531 0.9478966 0.9478754 -0.9996296 0.9584293 0.958416 -0.9997074 0.9668957 0.9668873 -0.9997689 0.9736779 0.9736726 -0.9998174 0.979096 0.9790927 -0.9998557 0.983415 0.9834129 -0.999886 0.9868518 0.9868505 -0.9999099 0.9895828 0.989582 -0.9999288 0.9917506 0.9917501 -0.9999437 0.9934698 0.9934695 -0.0000238 0.0645609 0.0000238 -0.0005417 0.0645609 0.0000238 -0.0011968 0.0645609 0.0000238 -0.0020256 0.0645609 0.0000238 -0.0030742 0.0645609 0.0000238 -0.0044007 0.0645609 0.0000238 -0.006079 0.0645609 0.0000238 -0.0082023 0.0645609 0.0000238 -0.0108885 0.0645609 0.0000238 -0.0142868 0.0645609 0.0000238 -0.0185862 0.0645609 0.0000238 -0.0240255 0.0645609 0.0000238 -0.0309069 0.0645609 0.0000238 -0.0396127 0.0645609 0.0000238 -0.0506267 0.0645609 0.0000238 -0.0645609 0.0645609 0.0000238 -0.0821895 0.0645609 0.0000238 -0.1044919 0.0645609 0.0000238 -0.1327073 0.0645609 0.0000238 -0.1684036 0.0645609 0.0000238 -0.2135639 0.0645609 0.0000238 -0.2706977 0.0645609 0.0000238 -0.3429792 0.0645609 0.0000238 -0.4344249 0.0645609 0.0000238 -0.5501155 0.0645609 0.0000238 -0.6964791 0.0645609 0.0000238 -0.8407292 0.0663177 0.0051514 -0.9033413 0.0785612 0.0279321 -0.9354466 0.1023506 0.0624569 -0.9545467 0.1366405 0.1059991 -0.9669269 0.180355 0.1572498 -0.9754027 0.2322726 0.2151269 -0.9814251 0.2908992 0.2783684 -0.9858181 0.3544318 0.3454107 -0.9890841 0.4208177 0.4144197 -0.9915469 0.4878948 0.4834235 -0.993424 0.5535769 0.5504963 -0.9948662 0.6160399 0.6139459 -0.9959813 0.6738629 0.6724572 -0.9968475 0.726099 0.7251659 -0.997523 0.772272 0.7716588 -0.9980513 0.8123148 0.8119154 -0.9984653 0.8464753 0.8462171 -0.9987905 0.8752136 0.8750477 -0.9990461 0.8991088 0.8990028 -0.9992474 0.9187849 0.9187175 -0.999406 0.934858 0.9348153 -0.999531 0.9479024 0.9478754 -0.9996296 0.958433 0.958416 -0.9997074 0.9668981 0.9668873 -0.9997689 0.9736794 0.9736726 -0.9998174 0.979097 0.9790927 -0.9998557 0.9834156 0.9834129 -0.999886 0.9868522 0.9868505 -0.9999099 0.989583 0.989582 -0.9999288 0.9917507 0.9917501 -0.9999437 0.9934699 0.9934695 -0.0000238 0.0821895 0.0000238 -0.0005417 0.0821895 0.0000238 -0.0011968 0.0821895 0.0000238 -0.0020256 0.0821895 0.0000238 -0.0030742 0.0821895 0.0000238 -0.0044007 0.0821895 0.0000238 -0.006079 0.0821895 0.0000238 -0.0082023 0.0821895 0.0000238 -0.0108885 0.0821895 0.0000238 -0.0142868 0.0821895 0.0000238 -0.0185862 0.0821895 0.0000238 -0.0240255 0.0821895 0.0000238 -0.0309069 0.0821895 0.0000238 -0.0396127 0.0821895 0.0000238 -0.0506267 0.0821895 0.0000238 -0.0645609 0.0821895 0.0000238 -0.0821895 0.0821895 0.0000238 -0.1044919 0.0821895 0.0000238 -0.1327073 0.0821895 0.0000238 -0.1684036 0.0821895 0.0000238 -0.2135639 0.0821895 0.0000238 -0.2706977 0.0821895 0.0000238 -0.3429792 0.0821895 0.0000238 -0.4344249 0.0821895 0.0000238 -0.5501155 0.0821895 0.0000238 -0.6964791 0.0821895 0.0000238 -0.8407292 0.0830256 0.0051514 -0.9033413 0.0923908 0.0279321 -0.9354466 0.1132477 0.0624569 -0.9545467 0.1450104 0.1059991 -0.9669269 0.1866663 0.1572498 -0.9754027 0.236956 0.2151269 -0.9814251 0.294322 0.2783684 -0.9858181 0.3568959 0.3454107 -0.9890841 0.4225654 0.4144197 -0.9915469 0.4891161 0.4834235 -0.993424 0.5544184 0.5504963 -0.9948662 0.6166119 0.6139459 -0.9959813 0.6742469 0.6724572 -0.9968475 0.7263539 0.7251659 -0.997523 0.7724394 0.7716588 -0.9980513 0.8124239 0.8119154 -0.9984653 0.8465458 0.8462171 -0.9987905 0.8752589 0.8750477 -0.9990461 0.8991377 0.8990028 -0.9992474 0.9188034 0.9187175 -0.999406 0.9348697 0.9348153 -0.999531 0.9479098 0.9478754 -0.9996296 0.9584377 0.958416 -0.9997074 0.966901 0.9668873 -0.9997689 0.9736812 0.9736726 -0.9998174 0.9790981 0.9790927 -0.9998557 0.9834163 0.9834129 -0.999886 0.9868526 0.9868505 -0.9999099 0.9895833 0.989582 -0.9999288 0.9917509 0.9917501 -0.9999437 0.99347 0.9934695 -0.0000238 0.1044919 0.0000238 -0.0005417 0.1044919 0.0000238 -0.0011968 0.1044919 0.0000238 -0.0020256 0.1044919 0.0000238 -0.0030742 0.1044919 0.0000238 -0.0044007 0.1044919 0.0000238 -0.006079 0.1044919 0.0000238 -0.0082023 0.1044919 0.0000238 -0.0108885 0.1044919 0.0000238 -0.0142868 0.1044919 0.0000238 -0.0185862 0.1044919 0.0000238 -0.0240255 0.1044919 0.0000238 -0.0309069 0.1044919 0.0000238 -0.0396127 0.1044919 0.0000238 -0.0506267 0.1044919 0.0000238 -0.0645609 0.1044919 0.0000238 -0.0821895 0.1044919 0.0000238 -0.1044919 0.1044919 0.0000238 -0.1327073 0.1044919 0.0000238 -0.1684036 0.1044919 0.0000238 -0.2135639 0.1044919 0.0000238 -0.2706977 0.1044919 0.0000238 -0.3429792 0.1044919 0.0000238 -0.4344249 0.1044919 0.0000238 -0.5501155 0.1044919 0.0000238 -0.6964791 0.1044919 0.0000238 -0.8407292 0.1041632 0.0051514 -0.9033413 0.1098869 0.0279321 -0.9354466 0.1270339 0.0624569 -0.9545467 0.1555993 0.1059991 -0.9669269 0.1946509 0.1572498 -0.9754027 0.2428812 0.2151269 -0.9814251 0.2986524 0.2783684 -0.9858181 0.3600134 0.3454107 -0.9890841 0.4247763 0.4144197 -0.9915469 0.4906613 0.4834235 -0.993424 0.5554829 0.5504963 -0.9948662 0.6173355 0.6139459 -0.9959813 0.6747327 0.6724572 -0.9968475 0.7266763 0.7251659 -0.997523 0.7726513 0.7716588 -0.9980513 0.8125619 0.8119154 -0.9984653 0.846635 0.8462171 -0.9987905 0.8753162 0.8750477 -0.9990461 0.8991744 0.8990028 -0.9992474 0.9188267 0.9187175 -0.999406 0.9348845 0.9348153 -0.999531 0.9479192 0.9478754 -0.9996296 0.9584436 0.958416 -0.9997074 0.9669047 0.9668873 -0.9997689 0.9736835 0.9736726 -0.9998174 0.9790996 0.9790927 -0.9998557 0.9834172 0.9834129 -0.999886 0.9868532 0.9868505 -0.9999099 0.9895837 0.989582 -0.9999288 0.9917511 0.9917501 -0.9999437 0.9934701 0.9934695 -0.0000238 0.1327073 0.0000238 -0.0005417 0.1327073 0.0000238 -0.0011968 0.1327073 0.0000238 -0.0020256 0.1327073 0.0000238 -0.0030742 0.1327073 0.0000238 -0.0044007 0.1327073 0.0000238 -0.006079 0.1327073 0.0000238 -0.0082023 0.1327073 0.0000238 -0.0108885 0.1327073 0.0000238 -0.0142868 0.1327073 0.0000238 -0.0185862 0.1327073 0.0000238 -0.0240255 0.1327073 0.0000238 -0.0309069 0.1327073 0.0000238 -0.0396127 0.1327073 0.0000238 -0.0506267 0.1327073 0.0000238 -0.0645609 0.1327073 0.0000238 -0.0821895 0.1327073 0.0000238 -0.1044919 0.1327073 0.0000238 -0.1327073 0.1327073 0.0000238 -0.1684036 0.1327073 0.0000238 -0.2135639 0.1327073 0.0000238 -0.2706977 0.1327073 0.0000238 -0.3429792 0.1327073 0.0000238 -0.4344249 0.1327073 0.0000238 -0.5501155 0.1327073 0.0000238 -0.6964791 0.1327073 0.0000238 -0.8407292 0.1309049 0.0051514 -0.9033413 0.1320218 0.0279321 -0.9354466 0.1444753 0.0624569 -0.9545467 0.1689957 0.1059991 -0.9669269 0.2047525 0.1572498 -0.9754027 0.2503773 0.2151269 -0.9814251 0.3041308 0.2783684 -0.9858181 0.3639574 0.3454107 -0.9890841 0.4275735 0.4144197 -0.9915469 0.4926161 0.4834235 -0.993424 0.5568298 0.5504963 -0.9948662 0.6182511 0.6139459 -0.9959813 0.6753473 0.6724572 -0.9968475 0.7270843 0.7251659 -0.997523 0.7729194 0.7716588 -0.9980513 0.8127365 0.8119154 -0.9984653 0.8467479 0.8462171 -0.9987905 0.8753887 0.8750477 -0.9990461 0.8992207 0.8990028 -0.9992474 0.9188562 0.9187175 -0.999406 0.9349032 0.9348153 -0.999531 0.947931 0.9478754 -0.9996296 0.958451 0.958416 -0.9997074 0.9669094 0.9668873 -0.9997689 0.9736865 0.9736726 -0.9998174 0.9791014 0.9790927 -0.9998557 0.9834184 0.9834129 -0.999886 0.9868539 0.9868505 -0.9999099 0.9895841 0.989582 -0.9999288 0.9917514 0.9917501 -0.9999437 0.9934703 0.9934695 -0.0000238 0.1684036 0.0000238 -0.0005417 0.1684036 0.0000238 -0.0011968 0.1684036 0.0000238 -0.0020256 0.1684036 0.0000238 -0.0030742 0.1684036 0.0000238 -0.0044007 0.1684036 0.0000238 -0.006079 0.1684036 0.0000238 -0.0082023 0.1684036 0.0000238 -0.0108885 0.1684036 0.0000238 -0.0142868 0.1684036 0.0000238 -0.0185862 0.1684036 0.0000238 -0.0240255 0.1684036 0.0000238 -0.0309069 0.1684036 0.0000238 -0.0396127 0.1684036 0.0000238 -0.0506267 0.1684036 0.0000238 -0.0645609 0.1684036 0.0000238 -0.0821895 0.1684036 0.0000238 -0.1044919 0.1684036 0.0000238 -0.1327073 0.1684036 0.0000238 -0.1684036 0.1684036 0.0000238 -0.2135639 0.1684036 0.0000238 -0.2706977 0.1684036 0.0000238 -0.3429792 0.1684036 0.0000238 -0.4344249 0.1684036 0.0000238 -0.5501155 0.1684036 0.0000238 -0.6964791 0.1684036 0.0000238 -0.8407292 0.1647368 0.0051514 -0.9033413 0.1600254 0.0279321 -0.9354466 0.166541 0.0624569 -0.9545467 0.1859439 0.1059991 -0.9669269 0.2175323 0.1572498 -0.9754027 0.2598608 0.2151269 -0.9814251 0.3110617 0.2783684 -0.9858181 0.3689471 0.3454107 -0.9890841 0.4311123 0.4144197 -0.9915469 0.4950892 0.4834235 -0.993424 0.5585337 0.5504963 -0.9948662 0.6194093 0.6139459 -0.9959813 0.6761248 0.6724572 -0.9968475 0.7276003 0.7251659 -0.997523 0.7732585 0.7716588 -0.9980513 0.8129574 0.8119154 -0.9984653 0.8468908 0.8462171 -0.9987905 0.8754805 0.8750477 -0.9990461 0.8992794 0.8990028 -0.9992474 0.9188935 0.9187175 -0.999406 0.9349268 0.9348153 -0.999531 0.9479459 0.9478754 -0.9996296 0.9584605 0.958416 -0.9997074 0.9669153 0.9668873 -0.9997689 0.9736902 0.9736726 -0.9998174 0.9791038 0.9790927 -0.9998557 0.9834199 0.9834129 -0.999886 0.9868548 0.9868505 -0.9999099 0.9895847 0.989582 -0.9999288 0.9917518 0.9917501 -0.9999437 0.9934706 0.9934695 -0.0000238 0.2135639 0.0000238 -0.0005417 0.2135639 0.0000238 -0.0011968 0.2135639 0.0000238 -0.0020256 0.2135639 0.0000238 -0.0030742 0.2135639 0.0000238 -0.0044007 0.2135639 0.0000238 -0.006079 0.2135639 0.0000238 -0.0082023 0.2135639 0.0000238 -0.0108885 0.2135639 0.0000238 -0.0142868 0.2135639 0.0000238 -0.0185862 0.2135639 0.0000238 -0.0240255 0.2135639 0.0000238 -0.0309069 0.2135639 0.0000238 -0.0396127 0.2135639 0.0000238 -0.0506267 0.2135639 0.0000238 -0.0645609 0.2135639 0.0000238 -0.0821895 0.2135639 0.0000238 -0.1044919 0.2135639 0.0000238 -0.1327073 0.2135639 0.0000238 -0.1684036 0.2135639 0.0000238 -0.2135639 0.2135639 0.0000238 -0.2706977 0.2135639 0.0000238 -0.3429792 0.2135639 0.0000238 -0.4344249 0.2135639 0.0000238 -0.5501155 0.2135639 0.0000238 -0.6964791 0.2135639 0.0000238 -0.8407292 0.2075384 0.0051514 -0.9033413 0.1954535 0.0279321 -0.9354466 0.1944569 0.0624569 -0.9545467 0.2073855 0.1059991 -0.9669269 0.2337004 0.1572498 -0.9754027 0.2718587 0.2151269 -0.9814251 0.3198302 0.2783684 -0.9858181 0.3752597 0.3454107 -0.9890841 0.4355894 0.4144197 -0.9915469 0.4982181 0.4834235 -0.993424 0.5606894 0.5504963 -0.9948662 0.6208746 0.6139459 -0.9959813 0.6771085 0.6724572 -0.9968475 0.7282533 0.7251659 -0.997523 0.7736876 0.7716588 -0.9980513 0.8132369 0.8119154 -0.9984653 0.8470714 0.8462171 -0.9987905 0.8755966 0.8750477 -0.9990461 0.8993535 0.8990028 -0.9992474 0.9189407 0.9187175 -0.999406 0.9349567 0.9348153 -0.999531 0.9479648 0.9478754 -0.9996296 0.9584724 0.958416 -0.9997074 0.9669228 0.9668873 -0.9997689 0.9736949 0.9736726 -0.9998174 0.9791067 0.9790927 -0.9998557 0.9834217 0.9834129 -0.999886 0.986856 0.9868505 -0.9999099 0.9895855 0.989582 -0.9999288 0.9917523 0.9917501 -0.9999437 0.9934708 0.9934695 -0.0000238 0.2706977 0.0000238 -0.0005417 0.2706977 0.0000238 -0.0011968 0.2706977 0.0000238 -0.0020256 0.2706977 0.0000238 -0.0030742 0.2706977 0.0000238 -0.0044007 0.2706977 0.0000238 -0.006079 0.2706977 0.0000238 -0.0082023 0.2706977 0.0000238 -0.0108885 0.2706977 0.0000238 -0.0142868 0.2706977 0.0000238 -0.0185862 0.2706977 0.0000238 -0.0240255 0.2706977 0.0000238 -0.0309069 0.2706977 0.0000238 -0.0396127 0.2706977 0.0000238 -0.0506267 0.2706977 0.0000238 -0.0645609 0.2706977 0.0000238 -0.0821895 0.2706977 0.0000238 -0.1044919 0.2706977 0.0000238 -0.1327073 0.2706977 0.0000238 -0.1684036 0.2706977 0.0000238 -0.2135639 0.2706977 0.0000238 -0.2706977 0.2706977 0.0000238 -0.3429792 0.2706977 0.0000238 -0.4344249 0.2706977 0.0000238 -0.5501155 0.2706977 0.0000238 -0.6964791 0.2706977 0.0000238 -0.8407292 0.2616881 0.0051514 -0.9033413 0.2402747 0.0279321 -0.9354466 0.2297741 0.0624569 -0.9545467 0.2345119 0.1059991 -0.9669269 0.2541551 0.1572498 -0.9754027 0.2870375 0.2151269 -0.9814251 0.3309236 0.2783684 -0.9858181 0.3832459 0.3454107 -0.9890841 0.4412534 0.4144197 -0.9915469 0.5021764 0.4834235 -0.993424 0.5634166 0.5504963 -0.9948662 0.6227284 0.6139459 -0.9959813 0.678353 0.6724572 -0.9968475 0.7290793 0.7251659 -0.997523 0.7742304 0.7716588 -0.9980513 0.8135904 0.8119154 -0.9984653 0.8473 0.8462171 -0.9987905 0.8757434 0.8750477 -0.9990461 0.8994474 0.8990028 -0.9992474 0.9190004 0.9187175 -0.999406 0.9349946 0.9348153 -0.999531 0.9479888 0.9478754 -0.9996296 0.9584875 0.958416 -0.9997074 0.9669323 0.9668873 -0.9997689 0.9737009 0.9736726 -0.9998174 0.9791105 0.9790927 -0.9998557 0.9834241 0.9834129 -0.999886 0.9868575 0.9868505 -0.9999099 0.9895864 0.989582 -0.9999288 0.9917528 0.9917501 -0.9999437 0.9934712 0.9934695 -0.0000238 0.3429792 0.0000238 -0.0005417 0.3429792 0.0000238 -0.0011968 0.3429792 0.0000238 -0.0020256 0.3429792 0.0000238 -0.0030742 0.3429792 0.0000238 -0.0044007 0.3429792 0.0000238 -0.006079 0.3429792 0.0000238 -0.0082023 0.3429792 0.0000238 -0.0108885 0.3429792 0.0000238 -0.0142868 0.3429792 0.0000238 -0.0185862 0.3429792 0.0000238 -0.0240255 0.3429792 0.0000238 -0.0309069 0.3429792 0.0000238 -0.0396127 0.3429792 0.0000238 -0.0506267 0.3429792 0.0000238 -0.0645609 0.3429792 0.0000238 -0.0821895 0.3429792 0.0000238 -0.1044919 0.3429792 0.0000238 -0.1327073 0.3429792 0.0000238 -0.1684036 0.3429792 0.0000238 -0.2135639 0.3429792 0.0000238 -0.2706977 0.3429792 0.0000238 -0.3429792 0.3429792 0.0000238 -0.4344249 0.3429792 0.0000238 -0.5501155 0.3429792 0.0000238 -0.6964791 0.3429792 0.0000238 -0.8407292 0.3301945 0.0051514 -0.9033413 0.2969793 0.0279321 -0.9354466 0.274455 0.0624569 -0.9545467 0.2688304 0.1059991 -0.9669269 0.280033 0.1572498 -0.9754027 0.3062408 0.2151269 -0.9814251 0.344958 0.2783684 -0.9858181 0.3933496 0.3454107 -0.9890841 0.4484192 0.4144197 -0.9915469 0.5071843 0.4834235 -0.993424 0.5668669 0.5504963 -0.9948662 0.6250738 0.6139459 -0.9959813 0.6799274 0.6724572 -0.9968475 0.7301243 0.7251659 -0.997523 0.7749171 0.7716588 -0.9980513 0.8140378 0.8119154 -0.9984653 0.8475892 0.8462171 -0.9987905 0.8759292 0.8750477 -0.9990461 0.8995661 0.8990028 -0.9992474 0.9190759 0.9187175 -0.999406 0.9350425 0.9348153 -0.999531 0.948019 0.9478754 -0.9996296 0.9585066 0.958416 -0.9997074 0.9669443 0.9668873 -0.9997689 0.9737085 0.9736726 -0.9998174 0.9791152 0.9790927 -0.9998557 0.983427 0.9834129 -0.999886 0.9868593 0.9868505 -0.9999099 0.9895875 0.989582 -0.9999288 0.9917536 0.9917501 -0.9999437 0.9934717 0.9934695 -0.0000238 0.4344249 0.0000238 -0.0005417 0.4344249 0.0000238 -0.0011968 0.4344249 0.0000238 -0.0020256 0.4344249 0.0000238 -0.0030742 0.4344249 0.0000238 -0.0044007 0.4344249 0.0000238 -0.006079 0.4344249 0.0000238 -0.0082023 0.4344249 0.0000238 -0.0108885 0.4344249 0.0000238 -0.0142868 0.4344249 0.0000238 -0.0185862 0.4344249 0.0000238 -0.0240255 0.4344249 0.0000238 -0.0309069 0.4344249 0.0000238 -0.0396127 0.4344249 0.0000238 -0.0506267 0.4344249 0.0000238 -0.0645609 0.4344249 0.0000238 -0.0821895 0.4344249 0.0000238 -0.1044919 0.4344249 0.0000238 -0.1327073 0.4344249 0.0000238 -0.1684036 0.4344249 0.0000238 -0.2135639 0.4344249 0.0000238 -0.2706977 0.4344249 0.0000238 -0.3429792 0.4344249 0.0000238 -0.4344249 0.4344249 0.0000238 -0.5501155 0.4344249 0.0000238 -0.6964791 0.4344249 0.0000238 -0.8407292 0.416864 0.0051514 -0.9033413 0.368718 0.0279321 -0.9354466 0.3309822 0.0624569 -0.9545467 0.3122478 0.1059991 -0.9669269 0.3127719 0.1572498 -0.9754027 0.3305354 0.2151269 -0.9814251 0.3627135 0.2783684 -0.9858181 0.406132 0.3454107 -0.9890841 0.4574848 0.4144197 -0.9915469 0.5135199 0.4834235 -0.993424 0.571232 0.5504963 -0.9948662 0.6280409 0.6139459 -0.9959813 0.6819193 0.6724572 -0.9968475 0.7314464 0.7251659 -0.997523 0.7757859 0.7716588 -0.9980513 0.8146037 0.8119154 -0.9984653 0.8479551 0.8462171 -0.9987905 0.8761643 0.8750477 -0.9990461 0.8997163 0.8990028 -0.9992474 0.9191715 0.9187175 -0.999406 0.9351031 0.9348153 -0.999531 0.9480573 0.9478754 -0.9996296 0.9585307 0.958416 -0.9997074 0.9669595 0.9668873 -0.9997689 0.973718 0.9736726 -0.9998174 0.9791212 0.9790927 -0.9998557 0.9834308 0.9834129 -0.999886 0.9868617 0.9868505 -0.9999099 0.989589 0.989582 -0.9999288 0.9917545 0.9917501 -0.9999437 0.9934722 0.9934695 -0.0000238 0.5501155 0.0000238 -0.0005417 0.5501155 0.0000238 -0.0011968 0.5501155 0.0000238 -0.0020256 0.5501155 0.0000238 -0.0030742 0.5501155 0.0000238 -0.0044007 0.5501155 0.0000238 -0.006079 0.5501155 0.0000238 -0.0082023 0.5501155 0.0000238 -0.0108885 0.5501155 0.0000238 -0.0142868 0.5501155 0.0000238 -0.0185862 0.5501155 0.0000238 -0.0240255 0.5501155 0.0000238 -0.0309069 0.5501155 0.0000238 -0.0396127 0.5501155 0.0000238 -0.0506267 0.5501155 0.0000238 -0.0645609 0.5501155 0.0000238 -0.0821895 0.5501155 0.0000238 -0.1044919 0.5501155 0.0000238 -0.1327073 0.5501155 0.0000238 -0.1684036 0.5501155 0.0000238 -0.2135639 0.5501155 0.0000238 -0.2706977 0.5501155 0.0000238 -0.3429792 0.5501155 0.0000238 -0.4344249 0.5501155 0.0000238 -0.5501155 0.5501155 0.0000238 -0.6964791 0.5501155 0.0000238 -0.8407292 0.5265122 0.0051514 -0.9033413 0.4594768 0.0279321 -0.9354466 0.4024964 0.0624569 -0.9545467 0.3671764 0.1059991 -0.9669269 0.3541909 0.1572498 -0.9754027 0.3612712 0.2151269 -0.9814251 0.3851765 0.2783684 -0.9858181 0.4223035 0.3454107 -0.9890841 0.468954 0.4144197 -0.9915469 0.5215352 0.4834235 -0.993424 0.5767543 0.5504963 -0.9948662 0.6317947 0.6139459 -0.9959813 0.6844392 0.6724572 -0.9968475 0.7331191 0.7251659 -0.997523 0.776885 0.7716588 -0.9980513 0.8153196 0.8119154 -0.9984653 0.848418 0.8462171 -0.9987905 0.8764616 0.8750477 -0.9990461 0.8999063 0.8990028 -0.9992474 0.9192924 0.9187175 -0.999406 0.9351797 0.9348153 -0.999531 0.9481058 0.9478754 -0.9996296 0.9585613 0.958416 -0.9997074 0.9669788 0.9668873 -0.9997689 0.9737301 0.9736726 -0.9998174 0.9791288 0.9790927 -0.9998557 0.9834356 0.9834129 -0.999886 0.9868647 0.9868505 -0.9999099 0.9895909 0.989582 -0.9999288 0.9917557 0.9917501 -0.9999437 0.993473 0.9934695 -0.0000238 0.6964791 0.0000238 -0.0005417 0.6964791 0.0000238 -0.0011968 0.6964791 0.0000238 -0.0020256 0.6964791 0.0000238 -0.0030742 0.6964791 0.0000238 -0.0044007 0.6964791 0.0000238 -0.006079 0.6964791 0.0000238 -0.0082023 0.6964791 0.0000238 -0.0108885 0.6964791 0.0000238 -0.0142868 0.6964791 0.0000238 -0.0185862 0.6964791 0.0000238 -0.0240255 0.6964791 0.0000238 -0.0309069 0.6964791 0.0000238 -0.0396127 0.6964791 0.0000238 -0.0506267 0.6964791 0.0000238 -0.0645609 0.6964791 0.0000238 -0.0821895 0.6964791 0.0000238 -0.1044919 0.6964791 0.0000238 -0.1327073 0.6964791 0.0000238 -0.1684036 0.6964791 0.0000238 -0.2135639 0.6964791 0.0000238 -0.2706977 0.6964791 0.0000238 -0.3429792 0.6964791 0.0000238 -0.4344249 0.6964791 0.0000238 -0.5501155 0.6964791 0.0000238 -0.6964791 0.6964791 0.0000238 -0.8407292 0.6652314 0.0051514 -0.9033413 0.5742985 0.0279321 -0.9354466 0.4929712 0.0624569 -0.9545467 0.4366682 0.1059991 -0.9669269 0.4065913 0.1572498 -0.9754027 0.4001561 0.2151269 -0.9814251 0.413595 0.2783684 -0.9858181 0.4427624 0.3454107 -0.9890841 0.483464 0.4144197 -0.9915469 0.5316756 0.4834235 -0.993424 0.5837409 0.5504963 -0.9948662 0.6365438 0.6139459 -0.9959813 0.6876273 0.6724572 -0.9968475 0.7352352 0.7251659 -0.997523 0.7782755 0.7716588 -0.9980513 0.8162254 0.8119154 -0.9984653 0.8490036 0.8462171 -0.9987905 0.8768378 0.8750477 -0.9990461 0.9001468 0.8990028 -0.9992474 0.9194454 0.9187175 -0.999406 0.9352767 0.9348153 -0.999531 0.9481671 0.9478754 -0.9996296 0.9585999 0.958416 -0.9997074 0.9670031 0.9668873 -0.9997689 0.9737454 0.9736726 -0.9998174 0.9791384 0.9790927 -0.9998557 0.9834416 0.9834129 -0.999886 0.9868685 0.9868505 -0.9999099 0.9895933 0.989582 -0.9999288 0.9917571 0.9917501 -0.9999437 0.9934739 0.9934695 -0.0051514 0.8407292 0.0051514 -0.0056422 0.8407292 0.0051514 -0.0062631 0.8407292 0.0051514 -0.0070486 0.8407292 0.0051514 -0.0080424 0.8407292 0.0051514 -0.0092997 0.8407292 0.0051514 -0.0108903 0.8407292 0.0051514 -0.0129027 0.8407292 0.0051514 -0.0154486 0.8407292 0.0051514 -0.0186694 0.8407292 0.0051514 -0.0227443 0.8407292 0.0051514 -0.0278994 0.8407292 0.0051514 -0.0344214 0.8407292 0.0051514 -0.0426726 0.8407292 0.0051514 -0.0531113 0.8407292 0.0051514 -0.0663177 0.8407292 0.0051514 -0.0830256 0.8407292 0.0051514 -0.1041632 0.8407292 0.0051514 -0.1309049 0.8407292 0.0051514 -0.1647368 0.8407292 0.0051514 -0.2075384 0.8407292 0.0051514 -0.2616881 0.8407292 0.0051514 -0.3301945 0.8407292 0.0051514 -0.416864 0.8407292 0.0051514 -0.5265122 0.8407292 0.0051514 -0.6652314 0.8407292 0.0051514 -0.8407292 0.8407292 0.0051514 -0.9033413 0.7195629 0.0279321 -0.9354466 0.6074336 0.0624569 -0.9545467 0.5245844 0.1059991 -0.9669269 0.4728847 0.1572498 -0.9754027 0.4493504 0.2151269 -0.9814251 0.4495482 0.2783684 -0.9858181 0.4686457 0.3454107 -0.9890841 0.5018211 0.4144197 -0.9915469 0.5445046 0.4834235 -0.993424 0.5925797 0.5504963 -0.9948662 0.642552 0.6139459 -0.9959813 0.6916607 0.6724572 -0.9968475 0.7379123 0.7251659 -0.997523 0.7800347 0.7716588 -0.9980513 0.8173713 0.8119154 -0.9984653 0.8497444 0.8462171 -0.9987905 0.8773138 0.8750477 -0.9990461 0.9004509 0.8990028 -0.9992474 0.9196389 0.9187175 -0.999406 0.9353994 0.9348153 -0.999531 0.9482447 0.9478754 -0.9996296 0.9586489 0.958416 -0.9997074 0.9670339 0.9668873 -0.9997689 0.9737647 0.9736726 -0.9998174 0.9791506 0.9790927 -0.9998557 0.9834492 0.9834129 -0.999886 0.9868732 0.9868505 -0.9999099 0.9895962 0.989582 -0.9999288 0.991759 0.9917501 -0.9999437 0.9934751 0.9934695 -0.0279321 0.9033413 0.0279321 -0.0283384 0.9033413 0.0279321 -0.0288523 0.9033413 0.0279321 -0.0295025 0.9033413 0.0279321 -0.0303251 0.9033413 0.0279321 -0.0313658 0.9033413 0.0279321 -0.0326824 0.9033413 0.0279321 -0.0343481 0.9033413 0.0279321 -0.0364554 0.9033413 0.0279321 -0.0391214 0.9033413 0.0279321 -0.0424942 0.9033413 0.0279321 -0.0467613 0.9033413 0.0279321 -0.0521597 0.9033413 0.0279321 -0.0589895 0.9033413 0.0279321 -0.0676299 0.9033413 0.0279321 -0.0785612 0.9033413 0.0279321 -0.0923908 0.9033413 0.0279321 -0.1098869 0.9033413 0.0279321 -0.1320218 0.9033413 0.0279321 -0.1600254 0.9033413 0.0279321 -0.1954535 0.9033413 0.0279321 -0.2402747 0.9033413 0.0279321 -0.2969793 0.9033413 0.0279321 -0.368718 0.9033413 0.0279321 -0.4594768 0.9033413 0.0279321 -0.5742985 0.9033413 0.0279321 -0.7195629 0.9033413 0.0279321 -0.9033413 0.9033413 0.0279321 -0.9354466 0.7522434 0.0624569 -0.9545467 0.6358098 0.1059991 -0.9669269 0.5567544 0.1572498 -0.9754027 0.5115877 0.2151269 -0.9814251 0.4950336 0.2783684 -0.9858181 0.5013914 0.3454107 -0.9890841 0.5250451 0.4144197 -0.9915469 0.560735 0.4834235 -0.993424 0.603762 0.5504963 -0.9948662 0.6501531 0.6139459 -0.9959813 0.6967634 0.6724572 -0.9968475 0.7412993 0.7251659 -0.997523 0.7822603 0.7716588 -0.9980513 0.8188211 0.8119154 -0.9984653 0.8506817 0.8462171 -0.9987905 0.8779159 0.8750477 -0.9990461 0.9008357 0.8990028 -0.9992474 0.9198837 0.9187175 -0.999406 0.9355546 0.9348153 -0.999531 0.9483428 0.9478754 -0.9996296 0.9587107 0.958416 -0.9997074 0.9670729 0.9668873 -0.9997689 0.9737892 0.9736726 -0.9998174 0.9791659 0.9790927 -0.9998557 0.9834588 0.9834129 -0.999886 0.9868793 0.9868505 -0.9999099 0.9896 0.989582 -0.9999288 0.9917614 0.9917501 -0.9999437 0.9934765 0.9934695 -0.0624569 0.9354466 0.0624569 -0.062777 0.9354466 0.0624569 -0.063182 0.9354466 0.0624569 -0.0636943 0.9354466 0.0624569 -0.0643425 0.9354466 0.0624569 -0.0651625 0.9354466 0.0624569 -0.0662 0.9354466 0.0624569 -0.0675125 0.9354466 0.0624569 -0.0691729 0.9354466 0.0624569 -0.0712736 0.9354466 0.0624569 -0.0739313 0.9354466 0.0624569 -0.0772936 0.9354466 0.0624569 -0.0815473 0.9354466 0.0624569 -0.0869288 0.9354466 0.0624569 -0.0937372 0.9354466 0.0624569 -0.1023506 0.9354466 0.0624569 -0.1132477 0.9354466 0.0624569 -0.1270339 0.9354466 0.0624569 -0.1444753 0.9354466 0.0624569 -0.166541 0.9354466 0.0624569 -0.1944569 0.9354466 0.0624569 -0.2297741 0.9354466 0.0624569 -0.274455 0.9354466 0.0624569 -0.3309822 0.9354466 0.0624569 -0.4024964 0.9354466 0.0624569 -0.4929712 0.9354466 0.0624569 -0.6074336 0.9354466 0.0624569 -0.7522434 0.9354466 0.0624569 -0.9354466 0.9354466 0.0624569 -0.9545467 0.7765244 0.1059991 -0.9669269 0.6628604 0.1572498 -0.9754027 0.590326 0.2151269 -0.9814251 0.5525787 0.2783684 -0.9858181 0.5428189 0.3454107 -0.9890841 0.5544266 0.4144197 -0.9915469 0.5812684 0.4834235 -0.993424 0.6179091 0.5504963 -0.9948662 0.6597695 0.6139459 -0.9959813 0.703219 0.6724572 -0.9968475 0.7455842 0.7251659 -0.997523 0.785076 0.7716588 -0.9980513 0.8206552 0.8119154 -0.9984653 0.8518675 0.8462171 -0.9987905 0.8786777 0.8750477 -0.9990461 0.9013225 0.8990028 -0.9992474 0.9201934 0.9187175 -0.999406 0.935751 0.9348153 -0.999531 0.9484669 0.9478754 -0.9996296 0.958789 0.958416 -0.9997074 0.9671221 0.9668873 -0.9997689 0.9738202 0.9736726 -0.9998174 0.9791854 0.9790927 -0.9998557 0.983471 0.9834129 -0.999886 0.9868869 0.9868505 -0.9999099 0.9896048 0.989582 -0.9999288 0.9917644 0.9917501 -0.9999437 0.9934784 0.9934695 -0.1059991 0.9545467 0.1059991 -0.1062449 0.9545467 0.1059991 -0.106556 0.9545467 0.1059991 -0.1069495 0.9545467 0.1059991 -0.1074473 0.9545467 0.1059991 -0.1080772 0.9545467 0.1059991 -0.108874 0.9545467 0.1059991 -0.1098821 0.9545467 0.1059991 -0.1111575 0.9545467 0.1059991 -0.112771 0.9545467 0.1059991 -0.1148123 0.9545467 0.1059991 -0.1173948 0.9545467 0.1059991 -0.120662 0.9545467 0.1059991 -0.1247954 0.9545467 0.1059991 -0.1300248 0.9545467 0.1059991 -0.1366405 0.9545467 0.1059991 -0.1450104 0.9545467 0.1059991 -0.1555993 0.9545467 0.1059991 -0.1689957 0.9545467 0.1059991 -0.1859439 0.9545467 0.1059991 -0.2073855 0.9545467 0.1059991 -0.2345119 0.9545467 0.1059991 -0.2688304 0.9545467 0.1059991 -0.3122478 0.9545467 0.1059991 -0.3671764 0.9545467 0.1059991 -0.4366682 0.9545467 0.1059991 -0.5245844 0.9545467 0.1059991 -0.6358098 0.9545467 0.1059991 -0.7765244 0.9545467 0.1059991 -0.9545467 0.9545467 0.1059991 -0.9669269 0.7970984 0.1572498 -0.9754027 0.6899401 0.2151269 -0.9814251 0.6253806 0.2783684 -0.9858181 0.5952302 0.3454107 -0.9890841 0.591598 0.4144197 -0.9915469 0.6072459 0.4834235 -0.993424 0.635807 0.5504963 -0.9948662 0.6719355 0.6139459 -0.9959813 0.7113861 0.6724572 -0.9968475 0.7510052 0.7251659 -0.997523 0.7886382 0.7716588 -0.9980513 0.8229756 0.8119154 -0.9984653 0.8533677 0.8462171 -0.9987905 0.8796415 0.8750477 -0.9990461 0.9019384 0.8990028 -0.9992474 0.9205853 0.9187175 -0.999406 0.9359994 0.9348153 -0.999531 0.9486239 0.9478754 -0.9996296 0.958888 0.958416 -0.9997074 0.9671845 0.9668873 -0.9997689 0.9738594 0.9736726 -0.9998174 0.97921 0.9790927 -0.9998557 0.9834865 0.9834129 -0.999886 0.9868966 0.9868505 -0.9999099 0.9896109 0.989582 -0.9999288 0.9917682 0.9917501 -0.9999437 0.9934808 0.9934695 -0.1572498 0.9669269 0.1572498 -0.1574352 0.9669269 0.1572498 -0.1576697 0.9669269 0.1572498 -0.1579665 0.9669269 0.1572498 -0.1583419 0.9669269 0.1572498 -0.1588168 0.9669269 0.1572498 -0.1594176 0.9669269 0.1572498 -0.1601778 0.9669269 0.1572498 -0.1611395 0.9669269 0.1572498 -0.1623561 0.9669269 0.1572498 -0.1638954 0.9669269 0.1572498 -0.1658427 0.9669269 0.1572498 -0.1683064 0.9669269 0.1572498 -0.1714232 0.9669269 0.1572498 -0.1753664 0.9669269 0.1572498 -0.180355 0.9669269 0.1572498 -0.1866663 0.9669269 0.1572498 -0.1946509 0.9669269 0.1572498 -0.2047525 0.9669269 0.1572498 -0.2175323 0.9669269 0.1572498 -0.2337004 0.9669269 0.1572498 -0.2541551 0.9669269 0.1572498 -0.280033 0.9669269 0.1572498 -0.3127719 0.9669269 0.1572498 -0.3541909 0.9669269 0.1572498 -0.4065913 0.9669269 0.1572498 -0.4728847 0.9669269 0.1572498 -0.5567544 0.9669269 0.1572498 -0.6628604 0.9669269 0.1572498 -0.7970984 0.9669269 0.1572498 -0.9669269 0.9669269 0.1572498 -0.9754027 0.8159649 0.2151269 -0.9814251 0.7174845 0.2783684 -0.9858181 0.6615372 0.3454107 -0.9890841 0.6386246 0.4144197 -0.9915469 0.6401109 0.4834235 -0.993424 0.6584502 0.5504963 -0.9948662 0.6873271 0.6139459 -0.9959813 0.7217186 0.6724572 -0.9968475 0.7578634 0.7251659 -0.997523 0.7931449 0.7716588 -0.9980513 0.8259111 0.8119154 -0.9984653 0.8552656 0.8462171 -0.9987905 0.8808607 0.8750477 -0.9990461 0.9027176 0.8990028 -0.9992474 0.9210811 0.9187175 -0.999406 0.9363137 0.9348153 -0.999531 0.9488226 0.9478754 -0.9996296 0.9590133 0.958416 -0.9997074 0.9672633 0.9668873 -0.9997689 0.9739089 0.9736726 -0.9998174 0.9792411 0.9790927 -0.9998557 0.983506 0.9834129 -0.999886 0.9869088 0.9868505 -0.9999099 0.9896185 0.989582 -0.9999288 0.9917729 0.9917501 -0.9999437 0.9934838 0.9934695 -0.2151269 0.9754027 0.2151269 -0.2152645 0.9754027 0.2151269 -0.2154385 0.9754027 0.2151269 -0.2156587 0.9754027 0.2151269 -0.2159373 0.9754027 0.2151269 -0.2162897 0.9754027 0.2151269 -0.2167356 0.9754027 0.2151269 -0.2172997 0.9754027 0.2151269 -0.2180133 0.9754027 0.2151269 -0.2189162 0.9754027 0.2151269 -0.2200584 0.9754027 0.2151269 -0.2215035 0.9754027 0.2151269 -0.2233317 0.9754027 0.2151269 -0.2256446 0.9754027 0.2151269 -0.2285707 0.9754027 0.2151269 -0.2322726 0.9754027 0.2151269 -0.236956 0.9754027 0.2151269 -0.2428812 0.9754027 0.2151269 -0.2503773 0.9754027 0.2151269 -0.2598608 0.9754027 0.2151269 -0.2718587 0.9754027 0.2151269 -0.2870375 0.9754027 0.2151269 -0.3062408 0.9754027 0.2151269 -0.3305354 0.9754027 0.2151269 -0.3612712 0.9754027 0.2151269 -0.4001561 0.9754027 0.2151269 -0.4493504 0.9754027 0.2151269 -0.5115877 0.9754027 0.2151269 -0.590326 0.9754027 0.2151269 -0.6899401 0.9754027 0.2151269 -0.8159649 0.9754027 0.2151269 -0.9754027 0.9754027 0.2151269 -0.9814251 0.8340079 0.2783684 -0.9858181 0.7454243 0.3454107 -0.9890841 0.6981193 0.4144197 -0.9915469 0.6816893 0.4834235 -0.993424 0.6870967 0.5504963 -0.9948662 0.7067995 0.6139459 -0.9959813 0.7347906 0.6724572 -0.9968475 0.76654 0.7251659 -0.997523 0.7988464 0.7716588 -0.9980513 0.829625 0.8119154 -0.9984653 0.8576667 0.8462171 -0.9987905 0.8824033 0.8750477 -0.9990461 0.9037033 0.8990028 -0.9992474 0.9217082 0.9187175 -0.999406 0.9367113 0.9348153 -0.999531 0.949074 0.9478754 -0.9996296 0.9591719 0.958416 -0.9997074 0.9673631 0.9668873 -0.9997689 0.9739717 0.9736726 -0.9998174 0.9792804 0.9790927 -0.9998557 0.9835307 0.9834129 -0.999886 0.9869243 0.9868505 -0.9999099 0.9896282 0.989582 -0.9999288 0.991779 0.9917501 -0.9999437 0.9934876 0.9934695 -0.2783684 0.9814251 0.2783684 -0.278469 0.9814251 0.2783684 -0.2785962 0.9814251 0.2783684 -0.2787571 0.9814251 0.2783684 -0.2789607 0.9814251 0.2783684 -0.2792183 0.9814251 0.2783684 -0.2795441 0.9814251 0.2783684 -0.2799564 0.9814251 0.2783684 -0.2804779 0.9814251 0.2783684 -0.2811378 0.9814251 0.2783684 -0.2819726 0.9814251 0.2783684 -0.2830287 0.9814251 0.2783684 -0.2843648 0.9814251 0.2783684 -0.2860552 0.9814251 0.2783684 -0.2881937 0.9814251 0.2783684 -0.2908992 0.9814251 0.2783684 -0.294322 0.9814251 0.2783684 -0.2986524 0.9814251 0.2783684 -0.3041308 0.9814251 0.2783684 -0.3110617 0.9814251 0.2783684 -0.3198302 0.9814251 0.2783684 -0.3309236 0.9814251 0.2783684 -0.344958 0.9814251 0.2783684 -0.3627135 0.9814251 0.2783684 -0.3851765 0.9814251 0.2783684 -0.413595 0.9814251 0.2783684 -0.4495482 0.9814251 0.2783684 -0.4950336 0.9814251 0.2783684 -0.5525787 0.9814251 0.2783684 -0.6253806 0.9814251 0.2783684 -0.7174845 0.9814251 0.2783684 -0.8340079 0.9814251 0.2783684 -0.9814251 0.9814251 0.2783684 -0.9858181 0.8515523 0.3454107 -0.9890841 0.773388 0.4144197 -0.9915469 0.7342914 0.4834235 -0.993424 0.7233383 0.5504963 -0.9948662 0.7314346 0.6139459 -0.9959813 0.7513284 0.6724572 -0.9968475 0.7775169 0.7251659 -0.997523 0.8060595 0.7716588 -0.9980513 0.8343236 0.8119154 -0.9984653 0.8607044 0.8462171 -0.9987905 0.8843548 0.8750477 -0.9990461 0.9049504 0.8990028 -0.9992474 0.9225017 0.9187175 -0.999406 0.9372144 0.9348153 -0.999531 0.949392 0.9478754 -0.9996296 0.9593724 0.958416 -0.9997074 0.9674893 0.9668873 -0.9997689 0.974051 0.9736726 -0.9998174 0.9793302 0.9790927 -0.9998557 0.9835619 0.9834129 -0.999886 0.9869438 0.9868505 -0.9999099 0.9896405 0.989582 -0.9999288 0.9917867 0.9917501 -0.9999437 0.9934924 0.9934695 -0.3454107 0.9858181 0.3454107 -0.3454831 0.9858181 0.3454107 -0.3455746 0.9858181 0.3454107 -0.3456905 0.9858181 0.3454107 -0.3458371 0.9858181 0.3454107 -0.3460225 0.9858181 0.3454107 -0.3462571 0.9858181 0.3454107 -0.3465539 0.9858181 0.3454107 -0.3469293 0.9858181 0.3454107 -0.3474044 0.9858181 0.3454107 -0.3480054 0.9858181 0.3454107 -0.3487657 0.9858181 0.3454107 -0.3497276 0.9858181 0.3454107 -0.3509445 0.9858181 0.3454107 -0.352484 0.9858181 0.3454107 -0.3544318 0.9858181 0.3454107 -0.3568959 0.9858181 0.3454107 -0.3600134 0.9858181 0.3454107 -0.3639574 0.9858181 0.3454107 -0.3689471 0.9858181 0.3454107 -0.3752597 0.9858181 0.3454107 -0.3832459 0.9858181 0.3454107 -0.3933496 0.9858181 0.3454107 -0.406132 0.9858181 0.3454107 -0.4223035 0.9858181 0.3454107 -0.4427624 0.9858181 0.3454107 -0.4686457 0.9858181 0.3454107 -0.5013914 0.9858181 0.3454107 -0.5428189 0.9858181 0.3454107 -0.5952302 0.9858181 0.3454107 -0.6615372 0.9858181 0.3454107 -0.7454243 0.9858181 0.3454107 -0.8515523 0.9858181 0.3454107 -0.9858181 0.9858181 0.3454107 -0.9890841 0.8686126 0.4144197 -0.9915469 0.8008399 0.4834235 -0.993424 0.7691886 0.5504963 -0.9948662 0.7626012 0.6139459 -0.9959813 0.7722508 0.6724572 -0.9968475 0.7914042 0.7251659 -0.997523 0.8151851 0.7716588 -0.9980513 0.8402679 0.8119154 -0.9984653 0.8645475 0.8462171 -0.9987905 0.8868238 0.8750477 -0.9990461 0.9065282 0.8990028 -0.9992474 0.9235056 0.9187175 -0.999406 0.9378508 0.9348153 -0.999531 0.9497943 0.9478754 -0.9996296 0.9596261 0.958416 -0.9997074 0.967649 0.9668873 -0.9997689 0.9741514 0.9736726 -0.9998174 0.9793932 0.9790927 -0.9998557 0.9836014 0.9834129 -0.999886 0.9869686 0.9868505 -0.9999099 0.989656 0.989582 -0.9999288 0.9917964 0.9917501 -0.9999437 0.9934985 0.9934695 -0.4144197 0.9890841 0.4144197 -0.4144711 0.9890841 0.4144197 -0.414536 0.9890841 0.4144197 -0.4146182 0.9890841 0.4144197 -0.4147221 0.9890841 0.4144197 -0.4148536 0.9890841 0.4144197 -0.41502 0.9890841 0.4144197 -0.4152305 0.9890841 0.4144197 -0.4154968 0.9890841 0.4144197 -0.4158337 0.9890841 0.4144197 -0.4162599 0.9890841 0.4144197 -0.4167992 0.9890841 0.4144197 -0.4174814 0.9890841 0.4144197 -0.4183444 0.9890841 0.4144197 -0.4194363 0.9890841 0.4144197 -0.4208177 0.9890841 0.4144197 -0.4225654 0.9890841 0.4144197 -0.4247763 0.9890841 0.4144197 -0.4275735 0.9890841 0.4144197 -0.4311123 0.9890841 0.4144197 -0.4355894 0.9890841 0.4144197 -0.4412534 0.9890841 0.4144197 -0.4484192 0.9890841 0.4144197 -0.4574848 0.9890841 0.4144197 -0.468954 0.9890841 0.4144197 -0.483464 0.9890841 0.4144197 -0.5018211 0.9890841 0.4144197 -0.5250451 0.9890841 0.4144197 -0.5544266 0.9890841 0.4144197 -0.591598 0.9890841 0.4144197 -0.6386246 0.9890841 0.4144197 -0.6981193 0.9890841 0.4144197 -0.773388 0.9890841 0.4144197 -0.8686126 0.9890841 0.4144197 -0.9890841 0.9890841 0.4144197 -0.9915469 0.8850325 0.4834235 -0.993424 0.8271953 0.5504963 -0.9948662 0.802031 0.6139459 -0.9959813 0.7987204 0.6724572 -0.9968475 0.8089735 0.7251659 -0.997523 0.8267302 0.7716588 -0.9980513 0.8477882 0.8119154 -0.9984653 0.8694095 0.8462171 -0.9987905 0.8899473 0.8750477 -0.9990461 0.9085243 0.8990028 -0.9992474 0.9247756 0.9187175 -0.999406 0.938656 0.9348153 -0.999531 0.9503032 0.9478754 -0.9996296 0.9599471 0.958416 -0.9997074 0.9678511 0.9668873 -0.9997689 0.9742783 0.9736726 -0.9998174 0.979473 0.9790927 -0.9998557 0.9836514 0.9834129 -0.999886 0.9869999 0.9868505 -0.9999099 0.9896756 0.989582 -0.9999288 0.9918087 0.9917501 -0.9999437 0.9935061 0.9934695 -0.4834235 0.9915469 0.4834235 -0.4834593 0.9915469 0.4834235 -0.4835047 0.9915469 0.4834235 -0.4835622 0.9915469 0.4834235 -0.4836348 0.9915469 0.4834235 -0.4837267 0.9915469 0.4834235 -0.483843 0.9915469 0.4834235 -0.4839901 0.9915469 0.4834235 -0.4841762 0.9915469 0.4834235 -0.4844116 0.9915469 0.4834235 -0.4847095 0.9915469 0.4834235 -0.4850864 0.9915469 0.4834235 -0.4855631 0.9915469 0.4834235 -0.4861663 0.9915469 0.4834235 -0.4869294 0.9915469 0.4834235 -0.4878948 0.9915469 0.4834235 -0.4891161 0.9915469 0.4834235 -0.4906613 0.9915469 0.4834235 -0.4926161 0.9915469 0.4834235 -0.4950892 0.9915469 0.4834235 -0.4982181 0.9915469 0.4834235 -0.5021764 0.9915469 0.4834235 -0.5071843 0.9915469 0.4834235 -0.5135199 0.9915469 0.4834235 -0.5215352 0.9915469 0.4834235 -0.5316756 0.9915469 0.4834235 -0.5445046 0.9915469 0.4834235 -0.560735 0.9915469 0.4834235 -0.5812684 0.9915469 0.4834235 -0.6072459 0.9915469 0.4834235 -0.6401109 0.9915469 0.4834235 -0.6816893 0.9915469 0.4834235 -0.7342914 0.9915469 0.4834235 -0.8008399 0.9915469 0.4834235 -0.8850325 0.9915469 0.4834235 -0.9915469 0.9915469 0.4834235 -0.993424 0.9005812 0.5504963 -0.9948662 0.8519149 0.6139459 -0.9959813 0.8322078 0.6724572 -0.9968475 0.8312009 0.7251659 -0.997523 0.8413362 0.7716588 -0.9980513 0.8573024 0.8119154 -0.9984653 0.8755606 0.8462171 -0.9987905 0.8938989 0.8750477 -0.9990461 0.9110495 0.8990028 -0.9992474 0.9263823 0.9187175 -0.999406 0.9396746 0.9348153 -0.999531 0.9509472 0.9478754 -0.9996296 0.9603532 0.958416 -0.9997074 0.9681067 0.9668873 -0.9997689 0.974439 0.9736726 -0.9998174 0.9795738 0.9790927 -0.9998557 0.9837146 0.9834129 -0.999886 0.9870396 0.9868505 -0.9999099 0.9897004 0.989582 -0.9999288 0.9918242 0.9917501 -0.9999437 0.9935159 0.9934695 -0.5504963 0.993424 0.5504963 -0.550521 0.993424 0.5504963 -0.5505523 0.993424 0.5504963 -0.5505918 0.993424 0.5504963 -0.5506419 0.993424 0.5504963 -0.5507052 0.993424 0.5504963 -0.5507853 0.993424 0.5504963 -0.5508867 0.993424 0.5504963 -0.5510149 0.993424 0.5504963 -0.5511771 0.993424 0.5504963 -0.5513823 0.993424 0.5504963 -0.551642 0.993424 0.5504963 -0.5519704 0.993424 0.5504963 -0.552386 0.993424 0.5504963 -0.5529117 0.993424 0.5504963 -0.5535769 0.993424 0.5504963 -0.5544184 0.993424 0.5504963 -0.5554829 0.993424 0.5504963 -0.5568298 0.993424 0.5504963 -0.5585337 0.993424 0.5504963 -0.5606894 0.993424 0.5504963 -0.5634166 0.993424 0.5504963 -0.5668669 0.993424 0.5504963 -0.571232 0.993424 0.5504963 -0.5767543 0.993424 0.5504963 -0.5837409 0.993424 0.5504963 -0.5925797 0.993424 0.5504963 -0.603762 0.993424 0.5504963 -0.6179091 0.993424 0.5504963 -0.635807 0.993424 0.5504963 -0.6584502 0.993424 0.5504963 -0.6870967 0.993424 0.5504963 -0.7233383 0.993424 0.5504963 -0.7691886 0.993424 0.5504963 -0.8271953 0.993424 0.5504963 -0.9005812 0.993424 0.5504963 -0.993424 0.993424 0.5504963 -0.9948662 0.9150244 0.6139459 -0.9959813 0.8745738 0.6724572 -0.9968475 0.8593214 0.7251659 -0.997523 0.8598146 0.7716588 -0.9980513 0.8693391 0.8119154 -0.9984653 0.8833426 0.8462171 -0.9987905 0.8988983 0.8750477 -0.9990461 0.9142443 0.8990028 -0.9992474 0.928415 0.9187175 -0.999406 0.9409633 0.9348153 -0.999531 0.9517618 0.9478754 -0.9996296 0.9608669 0.958416 -0.9997074 0.9684301 0.9668873 -0.9997689 0.9746422 0.9736726 -0.9998174 0.9797014 0.9790927 -0.9998557 0.9837946 0.9834129 -0.999886 0.9870897 0.9868505 -0.9999099 0.9897318 0.989582 -0.9999288 0.9918439 0.9917501 -0.9999437 0.9935282 0.9934695 -0.6139459 0.9948662 0.6139459 -0.6139627 0.9948662 0.6139459 -0.6139839 0.9948662 0.6139459 -0.6140108 0.9948662 0.6139459 -0.6140448 0.9948662 0.6139459 -0.6140879 0.9948662 0.6139459 -0.6141423 0.9948662 0.6139459 -0.6142112 0.9948662 0.6139459 -0.6142984 0.9948662 0.6139459 -0.6144087 0.9948662 0.6139459 -0.6145482 0.9948662 0.6139459 -0.6147247 0.9948662 0.6139459 -0.6149479 0.9948662 0.6139459 -0.6152304 0.9948662 0.6139459 -0.6155878 0.9948662 0.6139459 -0.6160399 0.9948662 0.6139459 -0.6166119 0.9948662 0.6139459 -0.6173355 0.9948662 0.6139459 -0.6182511 0.9948662 0.6139459 -0.6194093 0.9948662 0.6139459 -0.6208746 0.9948662 0.6139459 -0.6227284 0.9948662 0.6139459 -0.6250738 0.9948662 0.6139459 -0.6280409 0.9948662 0.6139459 -0.6317947 0.9948662 0.6139459 -0.6365438 0.9948662 0.6139459 -0.642552 0.9948662 0.6139459 -0.6501531 0.9948662 0.6139459 -0.6597695 0.9948662 0.6139459 -0.6719355 0.9948662 0.6139459 -0.6873271 0.9948662 0.6139459 -0.7067995 0.9948662 0.6139459 -0.7314346 0.9948662 0.6139459 -0.7626012 0.9948662 0.6139459 -0.802031 0.9948662 0.6139459 -0.8519149 0.9948662 0.6139459 -0.9150244 0.9948662 0.6139459 -0.9948662 0.9948662 0.6139459 -0.9959813 0.9281722 0.6724572 -0.9968475 0.8948976 0.7251659 -0.997523 0.8831923 0.7716588 -0.9980513 0.884567 0.8119154 -0.9984653 0.8931877 0.8462171 -0.9987905 0.9052232 0.8750477 -0.9990461 0.9182862 0.8990028 -0.9992474 0.9309867 0.9187175 -0.999406 0.9425936 0.9348153 -0.999531 0.9527924 0.9478754 -0.9996296 0.9615169 0.958416 -0.9997074 0.9688392 0.9668873 -0.9997689 0.9748994 0.9736726 -0.9998174 0.9798628 0.9790927 -0.9998557 0.9838959 0.9834129 -0.999886 0.9871531 0.9868505 -0.9999099 0.9897715 0.989582 -0.9999288 0.9918687 0.9917501 -0.9999437 0.9935437 0.9934695 -0.6724572 0.9959813 0.6724572 -0.6724685 0.9959813 0.6724572 -0.6724827 0.9959813 0.6724572 -0.6725008 0.9959813 0.6724572 -0.6725236 0.9959813 0.6724572 -0.6725525 0.9959813 0.6724572 -0.6725891 0.9959813 0.6724572 -0.6726353 0.9959813 0.6724572 -0.6726938 0.9959813 0.6724572 -0.6727678 0.9959813 0.6724572 -0.6728615 0.9959813 0.6724572 -0.67298 0.9959813 0.6724572 -0.6731299 0.9959813 0.6724572 -0.6733195 0.9959813 0.6724572 -0.6735594 0.9959813 0.6724572 -0.6738629 0.9959813 0.6724572 -0.6742469 0.9959813 0.6724572 -0.6747327 0.9959813 0.6724572 -0.6753473 0.9959813 0.6724572 -0.6761248 0.9959813 0.6724572 -0.6771085 0.9959813 0.6724572 -0.678353 0.9959813 0.6724572 -0.6799274 0.9959813 0.6724572 -0.6819193 0.9959813 0.6724572 -0.6844392 0.9959813 0.6724572 -0.6876273 0.9959813 0.6724572 -0.6916607 0.9959813 0.6724572 -0.6967634 0.9959813 0.6724572 -0.703219 0.9959813 0.6724572 -0.7113861 0.9959813 0.6724572 -0.7217186 0.9959813 0.6724572 -0.7347906 0.9959813 0.6724572 -0.7513284 0.9959813 0.6724572 -0.7722508 0.9959813 0.6724572 -0.7987204 0.9959813 0.6724572 -0.8322078 0.9959813 0.6724572 -0.8745738 0.9959813 0.6724572 -0.9281722 0.9959813 0.6724572 -0.9959813 0.9959813 0.6724572 -0.9968475 0.939906 0.7251659 -0.997523 0.9127681 0.7716588 -0.9980513 0.9038323 0.8119154 -0.9984653 0.9056431 0.8462171 -0.9987905 0.9132249 0.8750477 -0.9990461 0.9233996 0.8990028 -0.9992474 0.9342401 0.9187175 -0.999406 0.9446563 0.9348153 -0.999531 0.9540963 0.9478754 -0.9996296 0.9623392 0.958416 -0.9997074 0.9693568 0.9668873 -0.9997689 0.9752247 0.9736726 -0.9998174 0.980067 0.9790927 -0.9998557 0.9840239 0.9834129 -0.999886 0.9872334 0.9868505 -0.9999099 0.9898218 0.989582 -0.9999288 0.9919002 0.9917501 -0.9999437 0.9935634 0.9934695 -0.7251659 0.9968475 0.7251659 -0.7251734 0.9968475 0.7251659 -0.7251829 0.9968475 0.7251659 -0.7251949 0.9968475 0.7251659 -0.72521 0.9968475 0.7251659 -0.7252292 0.9968475 0.7251659 -0.7252535 0.9968475 0.7251659 -0.7252842 0.9968475 0.7251659 -0.725323 0.9968475 0.7251659 -0.7253722 0.9968475 0.7251659 -0.7254343 0.9968475 0.7251659 -0.725513 0.9968475 0.7251659 -0.7256124 0.9968475 0.7251659 -0.7257383 0.9968475 0.7251659 -0.7258976 0.9968475 0.7251659 -0.726099 0.9968475 0.7251659 -0.7263539 0.9968475 0.7251659 -0.7266763 0.9968475 0.7251659 -0.7270843 0.9968475 0.7251659 -0.7276003 0.9968475 0.7251659 -0.7282533 0.9968475 0.7251659 -0.7290793 0.9968475 0.7251659 -0.7301243 0.9968475 0.7251659 -0.7314464 0.9968475 0.7251659 -0.7331191 0.9968475 0.7251659 -0.7352352 0.9968475 0.7251659 -0.7379123 0.9968475 0.7251659 -0.7412993 0.9968475 0.7251659 -0.7455842 0.9968475 0.7251659 -0.7510052 0.9968475 0.7251659 -0.7578634 0.9968475 0.7251659 -0.76654 0.9968475 0.7251659 -0.7775169 0.9968475 0.7251659 -0.7914042 0.9968475 0.7251659 -0.8089735 0.9968475 0.7251659 -0.8312009 0.9968475 0.7251659 -0.8593214 0.9968475 0.7251659 -0.8948976 0.9968475 0.7251659 -0.939906 0.9968475 0.7251659 -0.9968475 0.9968475 0.7251659 -0.997523 0.9501853 0.7716588 -0.9980513 0.9282055 0.8119154 -0.9984653 0.9214008 0.8462171 -0.9987905 0.9233482 0.8750477 -0.9990461 0.9298688 0.8990028 -0.9992474 0.9383562 0.9187175 -0.999406 0.9472658 0.9348153 -0.999531 0.9557458 0.9478754 -0.9996296 0.9633794 0.958416 -0.9997074 0.9700116 0.9668873 -0.9997689 0.9756362 0.9736726 -0.9998174 0.9803253 0.9790927 -0.9998557 0.9841859 0.9834129 -0.999886 0.9873349 0.9868505 -0.9999099 0.9898854 0.989582 -0.9999288 0.99194 0.9917501 -0.9999437 0.9935883 0.9934695 -0.7716588 0.997523 0.7716588 -0.7716637 0.997523 0.7716588 -0.77167 0.997523 0.7716588 -0.7716778 0.997523 0.7716588 -0.7716878 0.997523 0.7716588 -0.7717004 0.997523 0.7716588 -0.7717164 0.997523 0.7716588 -0.7717365 0.997523 0.7716588 -0.771762 0.997523 0.7716588 -0.7717943 0.997523 0.7716588 -0.7718352 0.997523 0.7716588 -0.7718869 0.997523 0.7716588 -0.7719522 0.997523 0.7716588 -0.7720349 0.997523 0.7716588 -0.7721396 0.997523 0.7716588 -0.772272 0.997523 0.7716588 -0.7724394 0.997523 0.7716588 -0.7726513 0.997523 0.7716588 -0.7729194 0.997523 0.7716588 -0.7732585 0.997523 0.7716588 -0.7736876 0.997523 0.7716588 -0.7742304 0.997523 0.7716588 -0.7749171 0.997523 0.7716588 -0.7757859 0.997523 0.7716588 -0.776885 0.997523 0.7716588 -0.7782755 0.997523 0.7716588 -0.7800347 0.997523 0.7716588 -0.7822603 0.997523 0.7716588 -0.785076 0.997523 0.7716588 -0.7886382 0.997523 0.7716588 -0.7931449 0.997523 0.7716588 -0.7988464 0.997523 0.7716588 -0.8060595 0.997523 0.7716588 -0.8151851 0.997523 0.7716588 -0.8267302 0.997523 0.7716588 -0.8413362 0.997523 0.7716588 -0.8598146 0.997523 0.7716588 -0.8831923 0.997523 0.7716588 -0.9127681 0.997523 0.7716588 -0.9501853 0.997523 0.7716588 -0.997523 0.997523 0.7716588 -0.9980513 0.9590407 0.8119154 -0.9984653 0.9413364 0.8462171 -0.9987905 0.9361554 0.8750477 -0.9990461 0.9380532 0.8990028 -0.9992474 0.9435635 0.9187175 -0.999406 0.9505671 0.9348153 -0.999531 0.9578327 0.9478754 -0.9996296 0.9646955 0.958416 -0.9997074 0.97084 0.9668873 -0.9997689 0.9761569 0.9736726 -0.9998174 0.9806522 0.9790927 -0.9998557 0.9843909 0.9834129 -0.999886 0.9874633 0.9868505 -0.9999099 0.9899658 0.989582 -0.9999288 0.9919903 0.9917501 -0.9999437 0.9936198 0.9934695 -0.8119154 0.9980513 0.8119154 -0.8119186 0.9980513 0.8119154 -0.8119226 0.9980513 0.8119154 -0.8119278 0.9980513 0.8119154 -0.8119343 0.9980513 0.8119154 -0.8119425 0.9980513 0.8119154 -0.8119529 0.9980513 0.8119154 -0.811966 0.9980513 0.8119154 -0.8119826 0.9980513 0.8119154 -0.8120036 0.9980513 0.8119154 -0.8120303 0.9980513 0.8119154 -0.8120639 0.9980513 0.8119154 -0.8121065 0.9980513 0.8119154 -0.8121604 0.9980513 0.8119154 -0.8122285 0.9980513 0.8119154 -0.8123148 0.9980513 0.8119154 -0.8124239 0.9980513 0.8119154 -0.8125619 0.9980513 0.8119154 -0.8127365 0.9980513 0.8119154 -0.8129574 0.9980513 0.8119154 -0.8132369 0.9980513 0.8119154 -0.8135904 0.9980513 0.8119154 -0.8140378 0.9980513 0.8119154 -0.8146037 0.9980513 0.8119154 -0.8153196 0.9980513 0.8119154 -0.8162254 0.9980513 0.8119154 -0.8173713 0.9980513 0.8119154 -0.8188211 0.9980513 0.8119154 -0.8206552 0.9980513 0.8119154 -0.8229756 0.9980513 0.8119154 -0.8259111 0.9980513 0.8119154 -0.829625 0.9980513 0.8119154 -0.8343236 0.9980513 0.8119154 -0.8402679 0.9980513 0.8119154 -0.8477882 0.9980513 0.8119154 -0.8573024 0.9980513 0.8119154 -0.8693391 0.9980513 0.8119154 -0.884567 0.9980513 0.8119154 -0.9038323 0.9980513 0.8119154 -0.9282055 0.9980513 0.8119154 -0.9590407 0.9980513 0.8119154 -0.9980513 0.9980513 0.8119154 -0.9984653 0.9665574 0.8462171 -0.9987905 0.9523583 0.8750477 -0.9990461 0.9484075 0.8990028 -0.9992474 0.9501515 0.9187175 -0.999406 0.9547438 0.9348153 -0.999531 0.9604729 0.9478754 -0.9996296 0.9663606 0.958416 -0.9997074 0.9718881 0.9668873 -0.9997689 0.9768156 0.9736726 -0.9998174 0.9810656 0.9790927 -0.9998557 0.9846502 0.9834129 -0.999886 0.9876258 0.9868505 -0.9999099 0.9900676 0.989582 -0.9999288 0.992054 0.9917501 -0.9999437 0.9936597 0.9934695 -0.8462171 0.9984653 0.8462171 -0.8462191 0.9984653 0.8462171 -0.8462218 0.9984653 0.8462171 -0.8462251 0.9984653 0.8462171 -0.8462293 0.9984653 0.8462171 -0.8462346 0.9984653 0.8462171 -0.8462413 0.9984653 0.8462171 -0.8462498 0.9984653 0.8462171 -0.8462605 0.9984653 0.8462171 -0.8462741 0.9984653 0.8462171 -0.8462913 0.9984653 0.8462171 -0.8463131 0.9984653 0.8462171 -0.8463406 0.9984653 0.8462171 -0.8463755 0.9984653 0.8462171 -0.8464195 0.9984653 0.8462171 -0.8464753 0.9984653 0.8462171 -0.8465458 0.9984653 0.8462171 -0.846635 0.9984653 0.8462171 -0.8467479 0.9984653 0.8462171 -0.8468908 0.9984653 0.8462171 -0.8470714 0.9984653 0.8462171 -0.8473 0.9984653 0.8462171 -0.8475892 0.9984653 0.8462171 -0.8479551 0.9984653 0.8462171 -0.848418 0.9984653 0.8462171 -0.8490036 0.9984653 0.8462171 -0.8497444 0.9984653 0.8462171 -0.8506817 0.9984653 0.8462171 -0.8518675 0.9984653 0.8462171 -0.8533677 0.9984653 0.8462171 -0.8552656 0.9984653 0.8462171 -0.8576667 0.9984653 0.8462171 -0.8607044 0.9984653 0.8462171 -0.8645475 0.9984653 0.8462171 -0.8694095 0.9984653 0.8462171 -0.8755606 0.9984653 0.8462171 -0.8833426 0.9984653 0.8462171 -0.8931877 0.9984653 0.8462171 -0.9056431 0.9984653 0.8462171 -0.9214008 0.9984653 0.8462171 -0.9413364 0.9984653 0.8462171 -0.9665574 0.9984653 0.8462171 -0.9984653 0.9984653 0.8462171 -0.9987905 0.972857 0.8750477 -0.9990461 0.961507 0.8990028 -0.9992474 0.9584861 0.9187175 -0.999406 0.9600277 0.9348153 -0.999531 0.9638131 0.9478754 -0.9996296 0.9684671 0.958416 -0.9997074 0.973214 0.9668873 -0.9997689 0.9776489 0.9736726 -0.9998174 0.9815888 0.9790927 -0.9998557 0.9849783 0.9834129 -0.999886 0.9878314 0.9868505 -0.9999099 0.9901963 0.989582 -0.9999288 0.9921346 0.9917501 -0.9999437 0.9937101 0.9934695 -0.8750477 0.9987905 0.8750477 -0.875049 0.9987905 0.8750477 -0.8750507 0.9987905 0.8750477 -0.8750528 0.9987905 0.8750477 -0.8750555 0.9987905 0.8750477 -0.8750589 0.9987905 0.8750477 -0.8750632 0.9987905 0.8750477 -0.8750687 0.9987905 0.8750477 -0.8750756 0.9987905 0.8750477 -0.8750843 0.9987905 0.8750477 -0.8750954 0.9987905 0.8750477 -0.8751094 0.9987905 0.8750477 -0.8751271 0.9987905 0.8750477 -0.8751494 0.9987905 0.8750477 -0.8751778 0.9987905 0.8750477 -0.8752136 0.9987905 0.8750477 -0.8752589 0.9987905 0.8750477 -0.8753162 0.9987905 0.8750477 -0.8753887 0.9987905 0.8750477 -0.8754805 0.9987905 0.8750477 -0.8755966 0.9987905 0.8750477 -0.8757434 0.9987905 0.8750477 -0.8759292 0.9987905 0.8750477 -0.8761643 0.9987905 0.8750477 -0.8764616 0.9987905 0.8750477 -0.8768378 0.9987905 0.8750477 -0.8773138 0.9987905 0.8750477 -0.8779159 0.9987905 0.8750477 -0.8786777 0.9987905 0.8750477 -0.8796415 0.9987905 0.8750477 -0.8808607 0.9987905 0.8750477 -0.8824033 0.9987905 0.8750477 -0.8843548 0.9987905 0.8750477 -0.8868238 0.9987905 0.8750477 -0.8899473 0.9987905 0.8750477 -0.8938989 0.9987905 0.8750477 -0.8988983 0.9987905 0.8750477 -0.9052232 0.9987905 0.8750477 -0.9132249 0.9987905 0.8750477 -0.9233482 0.9987905 0.8750477 -0.9361554 0.9987905 0.8750477 -0.9523583 0.9987905 0.8750477 -0.972857 0.9987905 0.8750477 -0.9987905 0.9987905 0.8750477 -0.9990461 0.9780796 0.8990028 -0.9992474 0.9690305 0.9187175 -0.999406 0.9667127 0.9348153 -0.999531 0.9680389 0.9478754 -0.9996296 0.971132 0.958416 -0.9997074 0.9748915 0.9668873 -0.9997689 0.9787032 0.9736726 -0.9998174 0.9822506 0.9790927 -0.9998557 0.9853933 0.9834129 -0.999886 0.9880915 0.9868505 -0.9999099 0.9903592 0.989582 -0.9999288 0.9922366 0.9917501 -0.9999437 0.9937739 0.9934695 -0.8990028 0.9990461 0.8990028 -0.8990036 0.9990461 0.8990028 -0.8990047 0.9990461 0.8990028 -0.8990061 0.9990461 0.8990028 -0.8990078 0.9990461 0.8990028 -0.89901 0.9990461 0.8990028 -0.8990127 0.9990461 0.8990028 -0.8990162 0.9990461 0.8990028 -0.8990206 0.9990461 0.8990028 -0.8990262 0.9990461 0.8990028 -0.8990333 0.9990461 0.8990028 -0.8990422 0.9990461 0.8990028 -0.8990535 0.9990461 0.8990028 -0.8990678 0.9990461 0.8990028 -0.8990859 0.9990461 0.8990028 -0.8991088 0.9990461 0.8990028 -0.8991377 0.9990461 0.8990028 -0.8991744 0.9990461 0.8990028 -0.8992207 0.9990461 0.8990028 -0.8992794 0.9990461 0.8990028 -0.8993535 0.9990461 0.8990028 -0.8994474 0.9990461 0.8990028 -0.8995661 0.9990461 0.8990028 -0.8997163 0.9990461 0.8990028 -0.8999063 0.9990461 0.8990028 -0.9001468 0.9990461 0.8990028 -0.9004509 0.9990461 0.8990028 -0.9008357 0.9990461 0.8990028 -0.9013225 0.9990461 0.8990028 -0.9019384 0.9990461 0.8990028 -0.9027176 0.9990461 0.8990028 -0.9037033 0.9990461 0.8990028 -0.9049504 0.9990461 0.8990028 -0.9065282 0.9990461 0.8990028 -0.9085243 0.9990461 0.8990028 -0.9110495 0.9990461 0.8990028 -0.9142443 0.9990461 0.8990028 -0.9182862 0.9990461 0.8990028 -0.9233996 0.9990461 0.8990028 -0.9298688 0.9990461 0.8990028 -0.9380532 0.9990461 0.8990028 -0.9484075 0.9990461 0.8990028 -0.961507 0.9990461 0.8990028 -0.9780796 0.9990461 0.8990028 -0.9990461 0.9990461 0.8990028 -0.9992474 0.9823705 0.9187175 -0.999406 0.97517 0.9348153 -0.999531 0.9733851 0.9478754 -0.9996296 0.9745036 0.958416 -0.9997074 0.9770137 0.9668873 -0.9997689 0.980037 0.9736726 -0.9998174 0.9830878 0.9790927 -0.9998557 0.9859184 0.9834129 -0.999886 0.9884205 0.9868505 -0.9999099 0.9905652 0.989582 -0.9999288 0.9923655 0.9917501 -0.9999437 0.9938546 0.9934695 -0.9187175 0.9992474 0.9187175 -0.918718 0.9992474 0.9187175 -0.9187187 0.9992474 0.9187175 -0.9187196 0.9992474 0.9187175 -0.9187207 0.9992474 0.9187175 -0.9187221 0.9992474 0.9187175 -0.9187238 0.9992474 0.9187175 -0.918726 0.9992474 0.9187175 -0.9187289 0.9992474 0.9187175 -0.9187324 0.9992474 0.9187175 -0.9187369 0.9992474 0.9187175 -0.9187426 0.9992474 0.9187175 -0.9187498 0.9992474 0.9187175 -0.9187589 0.9992474 0.9187175 -0.9187704 0.9992474 0.9187175 -0.9187849 0.9992474 0.9187175 -0.9188034 0.9992474 0.9187175 -0.9188267 0.9992474 0.9187175 -0.9188562 0.9992474 0.9187175 -0.9188935 0.9992474 0.9187175 -0.9189407 0.9992474 0.9187175 -0.9190004 0.9992474 0.9187175 -0.9190759 0.9992474 0.9187175 -0.9191715 0.9992474 0.9187175 -0.9192924 0.9992474 0.9187175 -0.9194454 0.9992474 0.9187175 -0.9196389 0.9992474 0.9187175 -0.9198837 0.9992474 0.9187175 -0.9201934 0.9992474 0.9187175 -0.9205853 0.9992474 0.9187175 -0.9210811 0.9992474 0.9187175 -0.9217082 0.9992474 0.9187175 -0.9225017 0.9992474 0.9187175 -0.9235056 0.9992474 0.9187175 -0.9247756 0.9992474 0.9187175 -0.9263823 0.9992474 0.9187175 -0.928415 0.9992474 0.9187175 -0.9309867 0.9992474 0.9187175 -0.9342401 0.9992474 0.9187175 -0.9383562 0.9992474 0.9187175 -0.9435635 0.9992474 0.9187175 -0.9501515 0.9992474 0.9187175 -0.9584861 0.9992474 0.9187175 -0.9690305 0.9992474 0.9187175 -0.9823705 0.9992474 0.9187175 -0.9992474 0.9992474 0.9187175 -0.999406 0.9858696 0.9348153 -0.999531 0.9801487 0.9478754 -0.9996296 0.978769 0.958416 -0.9997074 0.9796986 0.9668873 -0.9997689 0.9817245 0.9736726 -0.9998174 0.9841471 0.9790927 -0.9998557 0.9865826 0.9834129 -0.999886 0.9888368 0.9868505 -0.9999099 0.9908259 0.989582 -0.9999288 0.9925287 0.9917501 -0.9999437 0.9939567 0.9934695 -0.9348153 0.999406 0.9348153 -0.9348156 0.999406 0.9348153 -0.934816 0.999406 0.9348153 -0.9348166 0.999406 0.9348153 -0.9348173 0.999406 0.9348153 -0.9348182 0.999406 0.9348153 -0.9348193 0.999406 0.9348153 -0.9348207 0.999406 0.9348153 -0.9348225 0.999406 0.9348153 -0.9348247 0.999406 0.9348153 -0.9348276 0.999406 0.9348153 -0.9348312 0.999406 0.9348153 -0.9348357 0.999406 0.9348153 -0.9348415 0.999406 0.9348153 -0.9348488 0.999406 0.9348153 -0.934858 0.999406 0.9348153 -0.9348697 0.999406 0.9348153 -0.9348845 0.999406 0.9348153 -0.9349032 0.999406 0.9348153 -0.9349268 0.999406 0.9348153 -0.9349567 0.999406 0.9348153 -0.9349946 0.999406 0.9348153 -0.9350425 0.999406 0.9348153 -0.9351031 0.999406 0.9348153 -0.9351797 0.999406 0.9348153 -0.9352767 0.999406 0.9348153 -0.9353994 0.999406 0.9348153 -0.9355546 0.999406 0.9348153 -0.935751 0.999406 0.9348153 -0.9359994 0.999406 0.9348153 -0.9363137 0.999406 0.9348153 -0.9367113 0.999406 0.9348153 -0.9372144 0.999406 0.9348153 -0.9378508 0.999406 0.9348153 -0.938656 0.999406 0.9348153 -0.9396746 0.999406 0.9348153 -0.9409633 0.999406 0.9348153 -0.9425936 0.999406 0.9348153 -0.9446563 0.999406 0.9348153 -0.9472658 0.999406 0.9348153 -0.9505671 0.999406 0.9348153 -0.9547438 0.999406 0.9348153 -0.9600277 0.999406 0.9348153 -0.9667127 0.999406 0.9348153 -0.97517 0.999406 0.9348153 -0.9858696 0.999406 0.9348153 -0.999406 0.999406 0.9348153 -0.999531 0.9887055 0.9478754 -0.9996296 0.9841654 0.958416 -0.9997074 0.9830954 0.9668873 -0.9997689 0.9838593 0.9736726 -0.9998174 0.9854872 0.9790927 -0.9998557 0.9874231 0.9834129 -0.999886 0.9893634 0.9868505 -0.9999099 0.9911557 0.989582 -0.9999288 0.9927351 0.9917501 -0.9999437 0.9940858 0.9934695 -0.9478754 0.999531 0.9478754 -0.9478756 0.999531 0.9478754 -0.9478759 0.999531 0.9478754 -0.9478762 0.999531 0.9478754 -0.9478767 0.999531 0.9478754 -0.9478772 0.999531 0.9478754 -0.9478779 0.999531 0.9478754 -0.9478788 0.999531 0.9478754 -0.9478799 0.999531 0.9478754 -0.9478814 0.999531 0.9478754 -0.9478832 0.999531 0.9478754 -0.9478854 0.999531 0.9478754 -0.9478883 0.999531 0.9478754 -0.947892 0.999531 0.9478754 -0.9478966 0.999531 0.9478754 -0.9479024 0.999531 0.9478754 -0.9479098 0.999531 0.9478754 -0.9479192 0.999531 0.9478754 -0.947931 0.999531 0.9478754 -0.9479459 0.999531 0.9478754 -0.9479648 0.999531 0.9478754 -0.9479888 0.999531 0.9478754 -0.948019 0.999531 0.9478754 -0.9480573 0.999531 0.9478754 -0.9481058 0.999531 0.9478754 -0.9481671 0.999531 0.9478754 -0.9482447 0.999531 0.9478754 -0.9483428 0.999531 0.9478754 -0.9484669 0.999531 0.9478754 -0.9486239 0.999531 0.9478754 -0.9488226 0.999531 0.9478754 -0.949074 0.999531 0.9478754 -0.949392 0.999531 0.9478754 -0.9497943 0.999531 0.9478754 -0.9503032 0.999531 0.9478754 -0.9509472 0.999531 0.9478754 -0.9517618 0.999531 0.9478754 -0.9527924 0.999531 0.9478754 -0.9540963 0.999531 0.9478754 -0.9557458 0.999531 0.9478754 -0.9578327 0.999531 0.9478754 -0.9604729 0.999531 0.9478754 -0.9638131 0.999531 0.9478754 -0.9680389 0.999531 0.9478754 -0.9733851 0.999531 0.9478754 -0.9801487 0.999531 0.9478754 -0.9887055 0.999531 0.9478754 -0.999531 0.999531 0.9478754 -0.9996296 0.9909925 0.958416 -0.9997074 0.9873927 0.9668873 -0.9997689 0.9865601 0.9736726 -0.9998174 0.9871826 0.9790927 -0.9998557 0.9884863 0.9834129 -0.999886 0.9900297 0.9868505 -0.9999099 0.991573 0.989582 -0.9999288 0.9929963 0.9917501 -0.9999437 0.9942493 0.9934695 -0.958416 0.9996296 0.958416 -0.9584161 0.9996296 0.958416 -0.9584163 0.9996296 0.958416 -0.9584165 0.9996296 0.958416 -0.9584168 0.9996296 0.958416 -0.9584171 0.9996296 0.958416 -0.9584176 0.9996296 0.958416 -0.9584181 0.9996296 0.958416 -0.9584189 0.9996296 0.958416 -0.9584198 0.9996296 0.958416 -0.9584209 0.9996296 0.958416 -0.9584223 0.9996296 0.958416 -0.9584241 0.9996296 0.958416 -0.9584264 0.9996296 0.958416 -0.9584293 0.9996296 0.958416 -0.958433 0.9996296 0.958416 -0.9584377 0.9996296 0.958416 -0.9584436 0.9996296 0.958416 -0.958451 0.9996296 0.958416 -0.9584605 0.9996296 0.958416 -0.9584724 0.9996296 0.958416 -0.9584875 0.9996296 0.958416 -0.9585066 0.9996296 0.958416 -0.9585307 0.9996296 0.958416 -0.9585613 0.9996296 0.958416 -0.9585999 0.9996296 0.958416 -0.9586489 0.9996296 0.958416 -0.9587107 0.9996296 0.958416 -0.958789 0.9996296 0.958416 -0.958888 0.9996296 0.958416 -0.9590133 0.9996296 0.958416 -0.9591719 0.9996296 0.958416 -0.9593724 0.9996296 0.958416 -0.9596261 0.9996296 0.958416 -0.9599471 0.9996296 0.958416 -0.9603532 0.9996296 0.958416 -0.9608669 0.9996296 0.958416 -0.9615169 0.9996296 0.958416 -0.9623392 0.9996296 0.958416 -0.9633794 0.9996296 0.958416 -0.9646955 0.9996296 0.958416 -0.9663606 0.9996296 0.958416 -0.9684671 0.9996296 0.958416 -0.971132 0.9996296 0.958416 -0.9745036 0.9996296 0.958416 -0.978769 0.9996296 0.958416 -0.9841654 0.9996296 0.958416 -0.9909925 0.9996296 0.958416 -0.9996296 0.9996296 0.958416 -0.9997074 0.9928293 0.9668873 -0.9997689 0.9899771 0.9736726 -0.9998174 0.9893275 0.9790927 -0.9998557 0.9898314 0.9834129 -0.999886 0.9908726 0.9868505 -0.9999099 0.9921008 0.989582 -0.9999288 0.9933267 0.9917501 -0.9999437 0.994456 0.9934695 -0.9668873 0.9997074 0.9668873 -0.9668874 0.9997074 0.9668873 -0.9668875 0.9997074 0.9668873 -0.9668877 0.9997074 0.9668873 -0.9668878 0.9997074 0.9668873 -0.9668881 0.9997074 0.9668873 -0.9668883 0.9997074 0.9668873 -0.9668887 0.9997074 0.9668873 -0.9668891 0.9997074 0.9668873 -0.9668897 0.9997074 0.9668873 -0.9668904 0.9997074 0.9668873 -0.9668913 0.9997074 0.9668873 -0.9668925 0.9997074 0.9668873 -0.9668939 0.9997074 0.9668873 -0.9668957 0.9997074 0.9668873 -0.9668981 0.9997074 0.9668873 -0.966901 0.9997074 0.9668873 -0.9669047 0.9997074 0.9668873 -0.9669094 0.9997074 0.9668873 -0.9669153 0.9997074 0.9668873 -0.9669228 0.9997074 0.9668873 -0.9669323 0.9997074 0.9668873 -0.9669443 0.9997074 0.9668873 -0.9669595 0.9997074 0.9668873 -0.9669788 0.9997074 0.9668873 -0.9670031 0.9997074 0.9668873 -0.9670339 0.9997074 0.9668873 -0.9670729 0.9997074 0.9668873 -0.9671221 0.9997074 0.9668873 -0.9671845 0.9997074 0.9668873 -0.9672633 0.9997074 0.9668873 -0.9673631 0.9997074 0.9668873 -0.9674893 0.9997074 0.9668873 -0.967649 0.9997074 0.9668873 -0.9678511 0.9997074 0.9668873 -0.9681067 0.9997074 0.9668873 -0.9684301 0.9997074 0.9668873 -0.9688392 0.9997074 0.9668873 -0.9693568 0.9997074 0.9668873 -0.9700116 0.9997074 0.9668873 -0.97084 0.9997074 0.9668873 -0.9718881 0.9997074 0.9668873 -0.973214 0.9997074 0.9668873 -0.9748915 0.9997074 0.9668873 -0.9770137 0.9997074 0.9668873 -0.9796986 0.9997074 0.9668873 -0.9830954 0.9997074 0.9668873 -0.9873927 0.9997074 0.9668873 -0.9928293 0.9997074 0.9668873 -0.9997074 0.9997074 0.9668873 -0.9997689 0.9942999 0.9736726 -0.9998174 0.9920411 0.9790927 -0.9998557 0.9915331 0.9834129 -0.999886 0.9919389 0.9868505 -0.9999099 0.9927686 0.989582 -0.9999288 0.9937448 0.9917501 -0.9999437 0.9947176 0.9934695 -0.9736726 0.9997689 0.9736726 -0.9736727 0.9997689 0.9736726 -0.9736727 0.9997689 0.9736726 -0.9736728 0.9997689 0.9736726 -0.9736729 0.9997689 0.9736726 -0.9736731 0.9997689 0.9736726 -0.9736733 0.9997689 0.9736726 -0.9736735 0.9997689 0.9736726 -0.9736738 0.9997689 0.9736726 -0.9736741 0.9997689 0.9736726 -0.9736746 0.9997689 0.9736726 -0.9736751 0.9997689 0.9736726 -0.9736758 0.9997689 0.9736726 -0.9736768 0.9997689 0.9736726 -0.9736779 0.9997689 0.9736726 -0.9736794 0.9997689 0.9736726 -0.9736812 0.9997689 0.9736726 -0.9736835 0.9997689 0.9736726 -0.9736865 0.9997689 0.9736726 -0.9736902 0.9997689 0.9736726 -0.9736949 0.9997689 0.9736726 -0.9737009 0.9997689 0.9736726 -0.9737085 0.9997689 0.9736726 -0.973718 0.9997689 0.9736726 -0.9737301 0.9997689 0.9736726 -0.9737454 0.9997689 0.9736726 -0.9737647 0.9997689 0.9736726 -0.9737892 0.9997689 0.9736726 -0.9738202 0.9997689 0.9736726 -0.9738594 0.9997689 0.9736726 -0.9739089 0.9997689 0.9736726 -0.9739717 0.9997689 0.9736726 -0.974051 0.9997689 0.9736726 -0.9741514 0.9997689 0.9736726 -0.9742783 0.9997689 0.9736726 -0.974439 0.9997689 0.9736726 -0.9746422 0.9997689 0.9736726 -0.9748994 0.9997689 0.9736726 -0.9752247 0.9997689 0.9736726 -0.9756362 0.9997689 0.9736726 -0.9761569 0.9997689 0.9736726 -0.9768156 0.9997689 0.9736726 -0.9776489 0.9997689 0.9736726 -0.9787032 0.9997689 0.9736726 -0.980037 0.9997689 0.9736726 -0.9817245 0.9997689 0.9736726 -0.9838593 0.9997689 0.9736726 -0.9865601 0.9997689 0.9736726 -0.9899771 0.9997689 0.9736726 -0.9942999 0.9997689 0.9736726 -0.9997689 0.9997689 0.9736726 -0.9998174 0.9954742 0.9790927 -0.9998557 0.9936861 0.9834129 -0.999886 0.993288 0.9868505 -0.9999099 0.9936135 0.989582 -0.9999288 0.9942736 0.9917501 -0.9999437 0.9950485 0.9934695 -0.9790927 0.9998174 0.9790927 -0.9790928 0.9998174 0.9790927 -0.9790928 0.9998174 0.9790927 -0.9790929 0.9998174 0.9790927 -0.9790929 0.9998174 0.9790927 -0.979093 0.9998174 0.9790927 -0.9790931 0.9998174 0.9790927 -0.9790933 0.9998174 0.9790927 -0.9790934 0.9998174 0.9790927 -0.9790937 0.9998174 0.9790927 -0.9790939 0.9998174 0.9790927 -0.9790943 0.9998174 0.9790927 -0.9790948 0.9998174 0.9790927 -0.9790953 0.9998174 0.9790927 -0.979096 0.9998174 0.9790927 -0.979097 0.9998174 0.9790927 -0.9790981 0.9998174 0.9790927 -0.9790996 0.9998174 0.9790927 -0.9791014 0.9998174 0.9790927 -0.9791038 0.9998174 0.9790927 -0.9791067 0.9998174 0.9790927 -0.9791105 0.9998174 0.9790927 -0.9791152 0.9998174 0.9790927 -0.9791212 0.9998174 0.9790927 -0.9791288 0.9998174 0.9790927 -0.9791384 0.9998174 0.9790927 -0.9791506 0.9998174 0.9790927 -0.9791659 0.9998174 0.9790927 -0.9791854 0.9998174 0.9790927 -0.97921 0.9998174 0.9790927 -0.9792411 0.9998174 0.9790927 -0.9792804 0.9998174 0.9790927 -0.9793302 0.9998174 0.9790927 -0.9793932 0.9998174 0.9790927 -0.979473 0.9998174 0.9790927 -0.9795738 0.9998174 0.9790927 -0.9797014 0.9998174 0.9790927 -0.9798628 0.9998174 0.9790927 -0.980067 0.9998174 0.9790927 -0.9803253 0.9998174 0.9790927 -0.9806522 0.9998174 0.9790927 -0.9810656 0.9998174 0.9790927 -0.9815888 0.9998174 0.9790927 -0.9822506 0.9998174 0.9790927 -0.9830878 0.9998174 0.9790927 -0.9841471 0.9998174 0.9790927 -0.9854872 0.9998174 0.9790927 -0.9871826 0.9998174 0.9790927 -0.9893275 0.9998174 0.9790927 -0.9920411 0.9998174 0.9790927 -0.9954742 0.9998174 0.9790927 -0.9998174 0.9998174 0.9790927 -0.9998557 0.9964098 0.9834129 -0.999886 0.9949948 0.9868505 -0.9999099 0.9946824 0.989582 -0.9999288 0.9949427 0.9917501 -0.9999437 0.9954671 0.9934695 -0.9834129 0.9998557 0.9834129 -0.983413 0.9998557 0.9834129 -0.983413 0.9998557 0.9834129 -0.983413 0.9998557 0.9834129 -0.9834131 0.9998557 0.9834129 -0.9834131 0.9998557 0.9834129 -0.9834132 0.9998557 0.9834129 -0.9834133 0.9998557 0.9834129 -0.9834134 0.9998557 0.9834129 -0.9834135 0.9998557 0.9834129 -0.9834137 0.9998557 0.9834129 -0.9834139 0.9998557 0.9834129 -0.9834142 0.9998557 0.9834129 -0.9834146 0.9998557 0.9834129 -0.983415 0.9998557 0.9834129 -0.9834156 0.9998557 0.9834129 -0.9834163 0.9998557 0.9834129 -0.9834172 0.9998557 0.9834129 -0.9834184 0.9998557 0.9834129 -0.9834199 0.9998557 0.9834129 -0.9834217 0.9998557 0.9834129 -0.9834241 0.9998557 0.9834129 -0.983427 0.9998557 0.9834129 -0.9834308 0.9998557 0.9834129 -0.9834356 0.9998557 0.9834129 -0.9834416 0.9998557 0.9834129 -0.9834492 0.9998557 0.9834129 -0.9834588 0.9998557 0.9834129 -0.983471 0.9998557 0.9834129 -0.9834865 0.9998557 0.9834129 -0.983506 0.9998557 0.9834129 -0.9835307 0.9998557 0.9834129 -0.9835619 0.9998557 0.9834129 -0.9836014 0.9998557 0.9834129 -0.9836514 0.9998557 0.9834129 -0.9837146 0.9998557 0.9834129 -0.9837946 0.9998557 0.9834129 -0.9838959 0.9998557 0.9834129 -0.9840239 0.9998557 0.9834129 -0.9841859 0.9998557 0.9834129 -0.9843909 0.9998557 0.9834129 -0.9846502 0.9998557 0.9834129 -0.9849783 0.9998557 0.9834129 -0.9853933 0.9998557 0.9834129 -0.9859184 0.9998557 0.9834129 -0.9865826 0.9998557 0.9834129 -0.9874231 0.9998557 0.9834129 -0.9884863 0.9998557 0.9834129 -0.9898314 0.9998557 0.9834129 -0.9915331 0.9998557 0.9834129 -0.9936861 0.9998557 0.9834129 -0.9964098 0.9998557 0.9834129 -0.9998557 0.9998557 0.9834129 -0.999886 0.9971542 0.9868505 -0.9999099 0.9960347 0.989582 -0.9999288 0.9957891 0.9917501 -0.9999437 0.9959967 0.9934695 -0.9868505 0.999886 0.9868505 -0.9868505 0.999886 0.9868505 -0.9868505 0.999886 0.9868505 -0.9868506 0.999886 0.9868505 -0.9868506 0.999886 0.9868505 -0.9868506 0.999886 0.9868505 -0.9868507 0.999886 0.9868505 -0.9868507 0.999886 0.9868505 -0.9868508 0.999886 0.9868505 -0.9868509 0.999886 0.9868505 -0.986851 0.999886 0.9868505 -0.9868511 0.999886 0.9868505 -0.9868513 0.999886 0.9868505 -0.9868515 0.999886 0.9868505 -0.9868518 0.999886 0.9868505 -0.9868522 0.999886 0.9868505 -0.9868526 0.999886 0.9868505 -0.9868532 0.999886 0.9868505 -0.9868539 0.999886 0.9868505 -0.9868548 0.999886 0.9868505 -0.986856 0.999886 0.9868505 -0.9868575 0.999886 0.9868505 -0.9868593 0.999886 0.9868505 -0.9868617 0.999886 0.9868505 -0.9868647 0.999886 0.9868505 -0.9868685 0.999886 0.9868505 -0.9868732 0.999886 0.9868505 -0.9868793 0.999886 0.9868505 -0.9868869 0.999886 0.9868505 -0.9868966 0.999886 0.9868505 -0.9869088 0.999886 0.9868505 -0.9869243 0.999886 0.9868505 -0.9869438 0.999886 0.9868505 -0.9869686 0.999886 0.9868505 -0.9869999 0.999886 0.9868505 -0.9870396 0.999886 0.9868505 -0.9870897 0.999886 0.9868505 -0.9871531 0.999886 0.9868505 -0.9872334 0.999886 0.9868505 -0.9873349 0.999886 0.9868505 -0.9874633 0.999886 0.9868505 -0.9876258 0.999886 0.9868505 -0.9878314 0.999886 0.9868505 -0.9880915 0.999886 0.9868505 -0.9884205 0.999886 0.9868505 -0.9888368 0.999886 0.9868505 -0.9893634 0.999886 0.9868505 -0.9900297 0.999886 0.9868505 -0.9908726 0.999886 0.9868505 -0.9919389 0.999886 0.9868505 -0.993288 0.999886 0.9868505 -0.9949948 0.999886 0.9868505 -0.9971542 0.999886 0.9868505 -0.999886 0.999886 0.9868505 -0.9999099 0.9977455 0.989582 -0.9999288 0.99686 0.9917501 -0.9999437 0.9966668 0.9934695 -0.989582 0.9999099 0.989582 -0.989582 0.9999099 0.989582 -0.989582 0.9999099 0.989582 -0.989582 0.9999099 0.989582 -0.9895821 0.9999099 0.989582 -0.9895821 0.9999099 0.989582 -0.9895821 0.9999099 0.989582 -0.9895821 0.9999099 0.989582 -0.9895822 0.9999099 0.989582 -0.9895822 0.9999099 0.989582 -0.9895823 0.9999099 0.989582 -0.9895824 0.9999099 0.989582 -0.9895825 0.9999099 0.989582 -0.9895826 0.9999099 0.989582 -0.9895828 0.9999099 0.989582 -0.989583 0.9999099 0.989582 -0.9895833 0.9999099 0.989582 -0.9895837 0.9999099 0.989582 -0.9895841 0.9999099 0.989582 -0.9895847 0.9999099 0.989582 -0.9895855 0.9999099 0.989582 -0.9895864 0.9999099 0.989582 -0.9895875 0.9999099 0.989582 -0.989589 0.9999099 0.989582 -0.9895909 0.9999099 0.989582 -0.9895933 0.9999099 0.989582 -0.9895962 0.9999099 0.989582 -0.9896 0.9999099 0.989582 -0.9896048 0.9999099 0.989582 -0.9896109 0.9999099 0.989582 -0.9896185 0.9999099 0.989582 -0.9896282 0.9999099 0.989582 -0.9896405 0.9999099 0.989582 -0.989656 0.9999099 0.989582 -0.9896756 0.9999099 0.989582 -0.9897004 0.9999099 0.989582 -0.9897318 0.9999099 0.989582 -0.9897715 0.9999099 0.989582 -0.9898218 0.9999099 0.989582 -0.9898854 0.9999099 0.989582 -0.9899658 0.9999099 0.989582 -0.9900676 0.9999099 0.989582 -0.9901963 0.9999099 0.989582 -0.9903592 0.9999099 0.989582 -0.9905652 0.9999099 0.989582 -0.9908259 0.9999099 0.989582 -0.9911557 0.9999099 0.989582 -0.991573 0.9999099 0.989582 -0.9921008 0.9999099 0.989582 -0.9927686 0.9999099 0.989582 -0.9936135 0.9999099 0.989582 -0.9946824 0.9999099 0.989582 -0.9960347 0.9999099 0.989582 -0.9977455 0.9999099 0.989582 -0.9999099 0.9999099 0.989582 -0.9999288 0.9982148 0.9917501 -0.9999437 0.9975145 0.9934695 -0.9917501 0.9999288 0.9917501 -0.9917501 0.9999288 0.9917501 -0.9917501 0.9999288 0.9917501 -0.9917501 0.9999288 0.9917501 -0.9917501 0.9999288 0.9917501 -0.9917501 0.9999288 0.9917501 -0.9917502 0.9999288 0.9917501 -0.9917502 0.9999288 0.9917501 -0.9917502 0.9999288 0.9917501 -0.9917502 0.9999288 0.9917501 -0.9917503 0.9999288 0.9917501 -0.9917503 0.9999288 0.9917501 -0.9917504 0.9999288 0.9917501 -0.9917505 0.9999288 0.9917501 -0.9917506 0.9999288 0.9917501 -0.9917507 0.9999288 0.9917501 -0.9917509 0.9999288 0.9917501 -0.9917511 0.9999288 0.9917501 -0.9917514 0.9999288 0.9917501 -0.9917518 0.9999288 0.9917501 -0.9917523 0.9999288 0.9917501 -0.9917528 0.9999288 0.9917501 -0.9917536 0.9999288 0.9917501 -0.9917545 0.9999288 0.9917501 -0.9917557 0.9999288 0.9917501 -0.9917571 0.9999288 0.9917501 -0.991759 0.9999288 0.9917501 -0.9917614 0.9999288 0.9917501 -0.9917644 0.9999288 0.9917501 -0.9917682 0.9999288 0.9917501 -0.9917729 0.9999288 0.9917501 -0.991779 0.9999288 0.9917501 -0.9917867 0.9999288 0.9917501 -0.9917964 0.9999288 0.9917501 -0.9918087 0.9999288 0.9917501 -0.9918242 0.9999288 0.9917501 -0.9918439 0.9999288 0.9917501 -0.9918687 0.9999288 0.9917501 -0.9919002 0.9999288 0.9917501 -0.99194 0.9999288 0.9917501 -0.9919903 0.9999288 0.9917501 -0.992054 0.9999288 0.9917501 -0.9921346 0.9999288 0.9917501 -0.9922366 0.9999288 0.9917501 -0.9923655 0.9999288 0.9917501 -0.9925287 0.9999288 0.9917501 -0.9927351 0.9999288 0.9917501 -0.9929963 0.9999288 0.9917501 -0.9933267 0.9999288 0.9917501 -0.9937448 0.9999288 0.9917501 -0.9942736 0.9999288 0.9917501 -0.9949427 0.9999288 0.9917501 -0.9957891 0.9999288 0.9917501 -0.99686 0.9999288 0.9917501 -0.9982148 0.9999288 0.9917501 -0.9999288 0.9999288 0.9917501 -0.9999437 0.9985869 0.9934695 -0.9934695 0.9999437 0.9934695 -0.9934695 0.9999437 0.9934695 -0.9934695 0.9999437 0.9934695 -0.9934695 0.9999437 0.9934695 -0.9934695 0.9999437 0.9934695 -0.9934695 0.9999437 0.9934695 -0.9934695 0.9999437 0.9934695 -0.9934695 0.9999437 0.9934695 -0.9934696 0.9999437 0.9934695 -0.9934696 0.9999437 0.9934695 -0.9934696 0.9999437 0.9934695 -0.9934696 0.9999437 0.9934695 -0.9934697 0.9999437 0.9934695 -0.9934697 0.9999437 0.9934695 -0.9934698 0.9999437 0.9934695 -0.9934699 0.9999437 0.9934695 -0.99347 0.9999437 0.9934695 -0.9934701 0.9999437 0.9934695 -0.9934703 0.9999437 0.9934695 -0.9934706 0.9999437 0.9934695 -0.9934708 0.9999437 0.9934695 -0.9934712 0.9999437 0.9934695 -0.9934717 0.9999437 0.9934695 -0.9934722 0.9999437 0.9934695 -0.993473 0.9999437 0.9934695 -0.9934739 0.9999437 0.9934695 -0.9934751 0.9999437 0.9934695 -0.9934765 0.9999437 0.9934695 -0.9934784 0.9999437 0.9934695 -0.9934808 0.9999437 0.9934695 -0.9934838 0.9999437 0.9934695 -0.9934876 0.9999437 0.9934695 -0.9934924 0.9999437 0.9934695 -0.9934985 0.9999437 0.9934695 -0.9935061 0.9999437 0.9934695 -0.9935159 0.9999437 0.9934695 -0.9935282 0.9999437 0.9934695 -0.9935437 0.9999437 0.9934695 -0.9935634 0.9999437 0.9934695 -0.9935883 0.9999437 0.9934695 -0.9936198 0.9999437 0.9934695 -0.9936597 0.9999437 0.9934695 -0.9937101 0.9999437 0.9934695 -0.9937739 0.9999437 0.9934695 -0.9938546 0.9999437 0.9934695 -0.9939567 0.9999437 0.9934695 -0.9940858 0.9999437 0.9934695 -0.9942493 0.9999437 0.9934695 -0.994456 0.9999437 0.9934695 -0.9947176 0.9999437 0.9934695 -0.9950485 0.9999437 0.9934695 -0.9954671 0.9999437 0.9934695 -0.9959967 0.9999437 0.9934695 -0.9966668 0.9999437 0.9934695 -0.9975145 0.9999437 0.9934695 -0.9985869 0.9999437 0.9934695 -0.9999437 0.9999437 0.9934695 -0.0000238 0.0000238 0.0005417 -0.0005417 0.0000238 0.0005417 -0.0011968 0.0000238 0.0005417 -0.0020256 0.0000238 0.0005417 -0.0030742 0.0000238 0.0005417 -0.0044007 0.0000238 0.0005417 -0.006079 0.0000238 0.0005417 -0.0082023 0.0000238 0.0005417 -0.0108885 0.0000238 0.0005417 -0.0142868 0.0000238 0.0005417 -0.0185862 0.0000238 0.0005417 -0.0240255 0.0000238 0.0005417 -0.0309069 0.0000238 0.0005417 -0.0396127 0.0000238 0.0005417 -0.0506267 0.0000238 0.0005417 -0.0645609 0.0000238 0.0005417 -0.0821895 0.0000238 0.0005417 -0.1044919 0.0000238 0.0005417 -0.1327073 0.0000238 0.0005417 -0.1684036 0.0000238 0.0005417 -0.2135639 0.0000238 0.0005417 -0.2706977 0.0000238 0.0005417 -0.3429792 0.0000238 0.0005417 -0.4344249 0.0000238 0.0005417 -0.5501155 0.0000238 0.0005417 -0.6964791 0.0000238 0.0005417 -0.8407292 0.0051514 0.0056422 -0.9033413 0.0279321 0.0283384 -0.9354466 0.0624569 0.062777 -0.9545467 0.1059991 0.1062449 -0.9669269 0.1572498 0.1574352 -0.9754027 0.2151269 0.2152645 -0.9814251 0.2783684 0.278469 -0.9858181 0.3454107 0.3454831 -0.9890841 0.4144197 0.4144711 -0.9915469 0.4834235 0.4834593 -0.993424 0.5504963 0.550521 -0.9948662 0.6139459 0.6139627 -0.9959813 0.6724572 0.6724685 -0.9968475 0.7251659 0.7251734 -0.997523 0.7716588 0.7716637 -0.9980513 0.8119154 0.8119186 -0.9984653 0.8462171 0.8462191 -0.9987905 0.8750477 0.875049 -0.9990461 0.8990028 0.8990036 -0.9992474 0.9187175 0.918718 -0.999406 0.9348153 0.9348156 -0.999531 0.9478754 0.9478756 -0.9996296 0.958416 0.9584161 -0.9997074 0.9668873 0.9668874 -0.9997689 0.9736726 0.9736727 -0.9998174 0.9790927 0.9790928 -0.9998557 0.9834129 0.983413 -0.999886 0.9868505 0.9868505 -0.9999099 0.989582 0.989582 -0.9999288 0.9917501 0.9917501 -0.9999437 0.9934695 0.9934695 -0.0000238 0.0005417 0.0005417 -0.0000382 0.0000382 0.0000382 -0.0006933 0.0000382 0.0000382 -0.0015221 0.0000382 0.0000382 -0.0025707 0.0000382 0.0000382 -0.0038972 0.0000382 0.0000382 -0.0055755 0.0000382 0.0000382 -0.0076988 0.0000382 0.0000382 -0.0103849 0.0000382 0.0000382 -0.0137833 0.0000382 0.0000382 -0.0180827 0.0000382 0.0000382 -0.023522 0.0000382 0.0000382 -0.0304033 0.0000382 0.0000382 -0.0391092 0.0000382 0.0000382 -0.0501232 0.0000382 0.0000382 -0.0640574 0.0000382 0.0000382 -0.081686 0.0000382 0.0000382 -0.1039884 0.0000382 0.0000382 -0.1322038 0.0000382 0.0000382 -0.1679 0.0000382 0.0000382 -0.2130604 0.0000382 0.0000382 -0.2701941 0.0000382 0.0000382 -0.3424757 0.0000382 0.0000382 -0.4339214 0.0000382 0.0000382 -0.549612 0.0000382 0.0000382 -0.6959756 0.0000382 0.0000382 -0.8405071 0.0051286 0.0051286 -0.9032596 0.0278872 0.0278872 -0.9354101 0.0624063 0.0624063 -0.9545286 0.1059489 0.1059489 -0.9669173 0.1572031 0.1572031 -0.9753975 0.2150852 0.2150852 -0.9814221 0.2783325 0.2783325 -0.9858163 0.3453807 0.3453807 -0.9890831 0.4143955 0.4143955 -0.9915463 0.4834045 0.4834045 -0.9934236 0.5504818 0.5504818 -0.994866 0.6139352 0.6139352 -0.9959811 0.6724495 0.6724495 -0.9968474 0.7251605 0.7251605 -0.997523 0.7716551 0.7716551 -0.9980512 0.8119128 0.8119128 -0.9984653 0.8462154 0.8462154 -0.9987905 0.8750466 0.8750466 -0.9990461 0.899002 0.899002 -0.9992474 0.918717 0.918717 -0.999406 0.9348149 0.9348149 -0.999531 0.9478752 0.9478752 -0.9996296 0.9584159 0.9584159 -0.9997074 0.9668872 0.9668872 -0.9997689 0.9736726 0.9736726 -0.9998174 0.9790927 0.9790927 -0.9998557 0.9834129 0.9834129 -0.999886 0.9868505 0.9868505 -0.9999099 0.989582 0.989582 -0.9999288 0.9917501 0.9917501 -0.9999437 0.9934695 0.9934695 -0.0000238 0.0011968 0.0005417 -0.0000382 0.0006933 0.0000382 -0.0006933 0.0006933 0.0000382 -0.0015221 0.0006933 0.0000382 -0.0025707 0.0006933 0.0000382 -0.0038972 0.0006933 0.0000382 -0.0055755 0.0006933 0.0000382 -0.0076988 0.0006933 0.0000382 -0.0103849 0.0006933 0.0000382 -0.0137833 0.0006933 0.0000382 -0.0180827 0.0006933 0.0000382 -0.023522 0.0006933 0.0000382 -0.0304033 0.0006933 0.0000382 -0.0391092 0.0006933 0.0000382 -0.0501232 0.0006933 0.0000382 -0.0640574 0.0006933 0.0000382 -0.081686 0.0006933 0.0000382 -0.1039884 0.0006933 0.0000382 -0.1322038 0.0006933 0.0000382 -0.1679 0.0006933 0.0000382 -0.2130604 0.0006933 0.0000382 -0.2701941 0.0006933 0.0000382 -0.3424757 0.0006933 0.0000382 -0.4339214 0.0006933 0.0000382 -0.549612 0.0006933 0.0000382 -0.6959756 0.0006933 0.0000382 -0.8405071 0.0057497 0.0051286 -0.9032596 0.0284013 0.0278872 -0.9354101 0.0628114 0.0624063 -0.9545286 0.1062601 0.1059489 -0.9669173 0.1574377 0.1572031 -0.9753975 0.2152593 0.2150852 -0.9814221 0.2784598 0.2783325 -0.9858163 0.3454723 0.3453807 -0.9890831 0.4144605 0.4143955 -0.9915463 0.4834499 0.4834045 -0.9934236 0.5505131 0.5504818 -0.994866 0.6139564 0.6139352 -0.9959811 0.6724637 0.6724495 -0.9968474 0.72517 0.7251605 -0.997523 0.7716613 0.7716551 -0.9980512 0.8119169 0.8119128 -0.9984653 0.846218 0.8462154 -0.9987905 0.8750482 0.8750466 -0.9990461 0.8990031 0.899002 -0.9992474 0.9187177 0.918717 -0.999406 0.9348154 0.9348149 -0.999531 0.9478755 0.9478752 -0.9996296 0.958416 0.9584159 -0.9997074 0.9668874 0.9668872 -0.9997689 0.9736726 0.9736726 -0.9998174 0.9790927 0.9790927 -0.9998557 0.9834129 0.9834129 -0.999886 0.9868505 0.9868505 -0.9999099 0.989582 0.989582 -0.9999288 0.9917501 0.9917501 -0.9999437 0.9934695 0.9934695 -0.0000238 0.0020256 0.0005417 -0.0000382 0.0015221 0.0000382 -0.0006933 0.0015221 0.0000382 -0.0015221 0.0015221 0.0000382 -0.0025707 0.0015221 0.0000382 -0.0038972 0.0015221 0.0000382 -0.0055755 0.0015221 0.0000382 -0.0076988 0.0015221 0.0000382 -0.0103849 0.0015221 0.0000382 -0.0137833 0.0015221 0.0000382 -0.0180827 0.0015221 0.0000382 -0.023522 0.0015221 0.0000382 -0.0304033 0.0015221 0.0000382 -0.0391092 0.0015221 0.0000382 -0.0501232 0.0015221 0.0000382 -0.0640574 0.0015221 0.0000382 -0.081686 0.0015221 0.0000382 -0.1039884 0.0015221 0.0000382 -0.1322038 0.0015221 0.0000382 -0.1679 0.0015221 0.0000382 -0.2130604 0.0015221 0.0000382 -0.2701941 0.0015221 0.0000382 -0.3424757 0.0015221 0.0000382 -0.4339214 0.0015221 0.0000382 -0.549612 0.0015221 0.0000382 -0.6959756 0.0015221 0.0000382 -0.8405071 0.0065355 0.0051286 -0.9032596 0.0290518 0.0278872 -0.9354101 0.0633239 0.0624063 -0.9545286 0.1066537 0.1059489 -0.9669173 0.1577345 0.1572031 -0.9753975 0.2154796 0.2150852 -0.9814221 0.2786207 0.2783325 -0.9858163 0.3455882 0.3453807 -0.9890831 0.4145427 0.4143955 -0.9915463 0.4835073 0.4834045 -0.9934236 0.5505527 0.5504818 -0.994866 0.6139833 0.6139352 -0.9959811 0.6724818 0.6724495 -0.9968474 0.725182 0.7251605 -0.997523 0.7716692 0.7716551 -0.9980512 0.811922 0.8119128 -0.9984653 0.8462213 0.8462154 -0.9987905 0.8750504 0.8750466 -0.9990461 0.8990045 0.899002 -0.9992474 0.9187186 0.918717 -0.999406 0.9348159 0.9348149 -0.999531 0.9478758 0.9478752 -0.9996296 0.9584162 0.9584159 -0.9997074 0.9668875 0.9668872 -0.9997689 0.9736727 0.9736726 -0.9998174 0.9790928 0.9790927 -0.9998557 0.983413 0.9834129 -0.999886 0.9868505 0.9868505 -0.9999099 0.989582 0.989582 -0.9999288 0.9917501 0.9917501 -0.9999437 0.9934695 0.9934695 -0.0000238 0.0030742 0.0005417 -0.0000382 0.0025707 0.0000382 -0.0006933 0.0025707 0.0000382 -0.0015221 0.0025707 0.0000382 -0.0025707 0.0025707 0.0000382 -0.0038972 0.0025707 0.0000382 -0.0055755 0.0025707 0.0000382 -0.0076988 0.0025707 0.0000382 -0.0103849 0.0025707 0.0000382 -0.0137833 0.0025707 0.0000382 -0.0180827 0.0025707 0.0000382 -0.023522 0.0025707 0.0000382 -0.0304033 0.0025707 0.0000382 -0.0391092 0.0025707 0.0000382 -0.0501232 0.0025707 0.0000382 -0.0640574 0.0025707 0.0000382 -0.081686 0.0025707 0.0000382 -0.1039884 0.0025707 0.0000382 -0.1322038 0.0025707 0.0000382 -0.1679 0.0025707 0.0000382 -0.2130604 0.0025707 0.0000382 -0.2701941 0.0025707 0.0000382 -0.3424757 0.0025707 0.0000382 -0.4339214 0.0025707 0.0000382 -0.549612 0.0025707 0.0000382 -0.6959756 0.0025707 0.0000382 -0.8405071 0.0075296 0.0051286 -0.9032596 0.0298748 0.0278872 -0.9354101 0.0639724 0.0624063 -0.9545286 0.1071517 0.1059489 -0.9669173 0.15811 0.1572031 -0.9753975 0.2157582 0.2150852 -0.9814221 0.2788244 0.2783325 -0.9858163 0.3457348 0.3453807 -0.9890831 0.4146466 0.4143955 -0.9915463 0.48358 0.4834045 -0.9934236 0.5506027 0.5504818 -0.994866 0.6140174 0.6139352 -0.9959811 0.6725046 0.6724495 -0.9968474 0.7251971 0.7251605 -0.997523 0.7716791 0.7716551 -0.9980512 0.8119285 0.8119128 -0.9984653 0.8462255 0.8462154 -0.9987905 0.8750531 0.8750466 -0.9990461 0.8990062 0.899002 -0.9992474 0.9187197 0.918717 -0.999406 0.9348166 0.9348149 -0.999531 0.9478763 0.9478752 -0.9996296 0.9584165 0.9584159 -0.9997074 0.9668877 0.9668872 -0.9997689 0.9736728 0.9736726 -0.9998174 0.9790929 0.9790927 -0.9998557 0.983413 0.9834129 -0.999886 0.9868506 0.9868505 -0.9999099 0.989582 0.989582 -0.9999288 0.9917501 0.9917501 -0.9999437 0.9934695 0.9934695 -0.0000238 0.0044007 0.0005417 -0.0000382 0.0038972 0.0000382 -0.0006933 0.0038972 0.0000382 -0.0015221 0.0038972 0.0000382 -0.0025707 0.0038972 0.0000382 -0.0038972 0.0038972 0.0000382 -0.0055755 0.0038972 0.0000382 -0.0076988 0.0038972 0.0000382 -0.0103849 0.0038972 0.0000382 -0.0137833 0.0038972 0.0000382 -0.0180827 0.0038972 0.0000382 -0.023522 0.0038972 0.0000382 -0.0304033 0.0038972 0.0000382 -0.0391092 0.0038972 0.0000382 -0.0501232 0.0038972 0.0000382 -0.0640574 0.0038972 0.0000382 -0.081686 0.0038972 0.0000382 -0.1039884 0.0038972 0.0000382 -0.1322038 0.0038972 0.0000382 -0.1679 0.0038972 0.0000382 -0.2130604 0.0038972 0.0000382 -0.2701941 0.0038972 0.0000382 -0.3424757 0.0038972 0.0000382 -0.4339214 0.0038972 0.0000382 -0.549612 0.0038972 0.0000382 -0.6959756 0.0038972 0.0000382 -0.8405071 0.0087874 0.0051286 -0.9032596 0.0309159 0.0278872 -0.9354101 0.0647927 0.0624063 -0.9545286 0.1077818 0.1059489 -0.9669173 0.1585851 0.1572031 -0.9753975 0.2161107 0.2150852 -0.9814221 0.279082 0.2783325 -0.9858163 0.3459203 0.3453807 -0.9890831 0.4147782 0.4143955 -0.9915463 0.4836719 0.4834045 -0.9934236 0.5506661 0.5504818 -0.994866 0.6140604 0.6139352 -0.9959811 0.6725335 0.6724495 -0.9968474 0.7252163 0.7251605 -0.997523 0.7716917 0.7716551 -0.9980512 0.8119367 0.8119128 -0.9984653 0.8462308 0.8462154 -0.9987905 0.8750565 0.8750466 -0.9990461 0.8990084 0.899002 -0.9992474 0.9187211 0.918717 -0.999406 0.9348175 0.9348149 -0.999531 0.9478768 0.9478752 -0.9996296 0.9584169 0.9584159 -0.9997074 0.9668879 0.9668872 -0.9997689 0.973673 0.9736726 -0.9998174 0.9790929 0.9790927 -0.9998557 0.9834131 0.9834129 -0.999886 0.9868506 0.9868505 -0.9999099 0.9895821 0.989582 -0.9999288 0.9917501 0.9917501 -0.9999437 0.9934695 0.9934695 -0.0000238 0.006079 0.0005417 -0.0000382 0.0055755 0.0000382 -0.0006933 0.0055755 0.0000382 -0.0015221 0.0055755 0.0000382 -0.0025707 0.0055755 0.0000382 -0.0038972 0.0055755 0.0000382 -0.0055755 0.0055755 0.0000382 -0.0076988 0.0055755 0.0000382 -0.0103849 0.0055755 0.0000382 -0.0137833 0.0055755 0.0000382 -0.0180827 0.0055755 0.0000382 -0.023522 0.0055755 0.0000382 -0.0304033 0.0055755 0.0000382 -0.0391092 0.0055755 0.0000382 -0.0501232 0.0055755 0.0000382 -0.0640574 0.0055755 0.0000382 -0.081686 0.0055755 0.0000382 -0.1039884 0.0055755 0.0000382 -0.1322038 0.0055755 0.0000382 -0.1679 0.0055755 0.0000382 -0.2130604 0.0055755 0.0000382 -0.2701941 0.0055755 0.0000382 -0.3424757 0.0055755 0.0000382 -0.4339214 0.0055755 0.0000382 -0.549612 0.0055755 0.0000382 -0.6959756 0.0055755 0.0000382 -0.8405071 0.0103785 0.0051286 -0.9032596 0.0322331 0.0278872 -0.9354101 0.0658305 0.0624063 -0.9545286 0.1085789 0.1059489 -0.9669173 0.1591861 0.1572031 -0.9753975 0.2165567 0.2150852 -0.9814221 0.2794079 0.2783325 -0.9858163 0.3461549 0.3453807 -0.9890831 0.4149446 0.4143955 -0.9915463 0.4837882 0.4834045 -0.9934236 0.5507462 0.5504818 -0.994866 0.6141149 0.6139352 -0.9959811 0.6725701 0.6724495 -0.9968474 0.7252406 0.7251605 -0.997523 0.7717077 0.7716551 -0.9980512 0.8119471 0.8119128 -0.9984653 0.8462375 0.8462154 -0.9987905 0.8750608 0.8750466 -0.9990461 0.8990111 0.899002 -0.9992474 0.9187228 0.918717 -0.999406 0.9348186 0.9348149 -0.999531 0.9478775 0.9478752 -0.9996296 0.9584173 0.9584159 -0.9997074 0.9668882 0.9668872 -0.9997689 0.9736731 0.9736726 -0.9998174 0.9790931 0.9790927 -0.9998557 0.9834131 0.9834129 -0.999886 0.9868506 0.9868505 -0.9999099 0.9895821 0.989582 -0.9999288 0.9917501 0.9917501 -0.9999437 0.9934695 0.9934695 -0.0000238 0.0082023 0.0005417 -0.0000382 0.0076988 0.0000382 -0.0006933 0.0076988 0.0000382 -0.0015221 0.0076988 0.0000382 -0.0025707 0.0076988 0.0000382 -0.0038972 0.0076988 0.0000382 -0.0055755 0.0076988 0.0000382 -0.0076988 0.0076988 0.0000382 -0.0103849 0.0076988 0.0000382 -0.0137833 0.0076988 0.0000382 -0.0180827 0.0076988 0.0000382 -0.023522 0.0076988 0.0000382 -0.0304033 0.0076988 0.0000382 -0.0391092 0.0076988 0.0000382 -0.0501232 0.0076988 0.0000382 -0.0640574 0.0076988 0.0000382 -0.081686 0.0076988 0.0000382 -0.1039884 0.0076988 0.0000382 -0.1322038 0.0076988 0.0000382 -0.1679 0.0076988 0.0000382 -0.2130604 0.0076988 0.0000382 -0.2701941 0.0076988 0.0000382 -0.3424757 0.0076988 0.0000382 -0.4339214 0.0076988 0.0000382 -0.549612 0.0076988 0.0000382 -0.6959756 0.0076988 0.0000382 -0.8405071 0.0123916 0.0051286 -0.9032596 0.0338994 0.0278872 -0.9354101 0.0671435 0.0624063 -0.9545286 0.1095873 0.1059489 -0.9669173 0.1599465 0.1572031 -0.9753975 0.2171209 0.2150852 -0.9814221 0.2798202 0.2783325 -0.9858163 0.3464517 0.3453807 -0.9890831 0.4151551 0.4143955 -0.9915463 0.4839353 0.4834045 -0.9934236 0.5508475 0.5504818 -0.994866 0.6141838 0.6139352 -0.9959811 0.6726163 0.6724495 -0.9968474 0.7252713 0.7251605 -0.997523 0.7717278 0.7716551 -0.9980512 0.8119602 0.8119128 -0.9984653 0.846246 0.8462154 -0.9987905 0.8750662 0.8750466 -0.9990461 0.8990146 0.899002 -0.9992474 0.918725 0.918717 -0.999406 0.93482 0.9348149 -0.999531 0.9478784 0.9478752 -0.9996296 0.9584179 0.9584159 -0.9997074 0.9668885 0.9668872 -0.9997689 0.9736734 0.9736726 -0.9998174 0.9790932 0.9790927 -0.9998557 0.9834132 0.9834129 -0.999886 0.9868507 0.9868505 -0.9999099 0.9895821 0.989582 -0.9999288 0.9917502 0.9917501 -0.9999437 0.9934695 0.9934695 -0.0000238 0.0108885 0.0005417 -0.0000382 0.0103849 0.0000382 -0.0006933 0.0103849 0.0000382 -0.0015221 0.0103849 0.0000382 -0.0025707 0.0103849 0.0000382 -0.0038972 0.0103849 0.0000382 -0.0055755 0.0103849 0.0000382 -0.0076988 0.0103849 0.0000382 -0.0103849 0.0103849 0.0000382 -0.0137833 0.0103849 0.0000382 -0.0180827 0.0103849 0.0000382 -0.023522 0.0103849 0.0000382 -0.0304033 0.0103849 0.0000382 -0.0391092 0.0103849 0.0000382 -0.0501232 0.0103849 0.0000382 -0.0640574 0.0103849 0.0000382 -0.081686 0.0103849 0.0000382 -0.1039884 0.0103849 0.0000382 -0.1322038 0.0103849 0.0000382 -0.1679 0.0103849 0.0000382 -0.2130604 0.0103849 0.0000382 -0.2701941 0.0103849 0.0000382 -0.3424757 0.0103849 0.0000382 -0.4339214 0.0103849 0.0000382 -0.549612 0.0103849 0.0000382 -0.6959756 0.0103849 0.0000382 -0.8405071 0.0149384 0.0051286 -0.9032596 0.0360076 0.0278872 -0.9354101 0.0688046 0.0624063 -0.9545286 0.1108631 0.1059489 -0.9669173 0.1609084 0.1572031 -0.9753975 0.2178347 0.2150852 -0.9814221 0.2803419 0.2783325 -0.9858163 0.3468273 0.3453807 -0.9890831 0.4154214 0.4143955 -0.9915463 0.4841214 0.4834045 -0.9934236 0.5509758 0.5504818 -0.994866 0.6142709 0.6139352 -0.9959811 0.6726748 0.6724495 -0.9968474 0.7253101 0.7251605 -0.997523 0.7717534 0.7716551 -0.9980512 0.8119769 0.8119128 -0.9984653 0.8462568 0.8462154 -0.9987905 0.8750731 0.8750466 -0.9990461 0.899019 0.899002 -0.9992474 0.9187278 0.918717 -0.999406 0.9348218 0.9348149 -0.999531 0.9478795 0.9478752 -0.9996296 0.9584186 0.9584159 -0.9997074 0.966889 0.9668872 -0.9997689 0.9736737 0.9736726 -0.9998174 0.9790934 0.9790927 -0.9998557 0.9834133 0.9834129 -0.999886 0.9868508 0.9868505 -0.9999099 0.9895822 0.989582 -0.9999288 0.9917502 0.9917501 -0.9999437 0.9934695 0.9934695 -0.0000238 0.0142868 0.0005417 -0.0000382 0.0137833 0.0000382 -0.0006933 0.0137833 0.0000382 -0.0015221 0.0137833 0.0000382 -0.0025707 0.0137833 0.0000382 -0.0038972 0.0137833 0.0000382 -0.0055755 0.0137833 0.0000382 -0.0076988 0.0137833 0.0000382 -0.0103849 0.0137833 0.0000382 -0.0137833 0.0137833 0.0000382 -0.0180827 0.0137833 0.0000382 -0.023522 0.0137833 0.0000382 -0.0304033 0.0137833 0.0000382 -0.0391092 0.0137833 0.0000382 -0.0501232 0.0137833 0.0000382 -0.0640574 0.0137833 0.0000382 -0.081686 0.0137833 0.0000382 -0.1039884 0.0137833 0.0000382 -0.1322038 0.0137833 0.0000382 -0.1679 0.0137833 0.0000382 -0.2130604 0.0137833 0.0000382 -0.2701941 0.0137833 0.0000382 -0.3424757 0.0137833 0.0000382 -0.4339214 0.0137833 0.0000382 -0.549612 0.0137833 0.0000382 -0.6959756 0.0137833 0.0000382 -0.8405071 0.0181604 0.0051286 -0.9032596 0.0386748 0.0278872 -0.9354101 0.0709061 0.0624063 -0.9545286 0.1124771 0.1059489 -0.9669173 0.1621254 0.1572031 -0.9753975 0.2187378 0.2150852 -0.9814221 0.2810019 0.2783325 -0.9858163 0.3473024 0.3453807 -0.9890831 0.4157584 0.4143955 -0.9915463 0.4843569 0.4834045 -0.9934236 0.551138 0.5504818 -0.994866 0.6143812 0.6139352 -0.9959811 0.6727489 0.6724495 -0.9968474 0.7253592 0.7251605 -0.997523 0.7717857 0.7716551 -0.9980512 0.8119979 0.8119128 -0.9984653 0.8462703 0.8462154 -0.9987905 0.8750819 0.8750466 -0.9990461 0.8990246 0.899002 -0.9992474 0.9187314 0.918717 -0.999406 0.9348241 0.9348149 -0.999531 0.947881 0.9478752 -0.9996296 0.9584195 0.9584159 -0.9997074 0.9668895 0.9668872 -0.9997689 0.973674 0.9736726 -0.9998174 0.9790936 0.9790927 -0.9998557 0.9834135 0.9834129 -0.999886 0.9868508 0.9868505 -0.9999099 0.9895822 0.989582 -0.9999288 0.9917502 0.9917501 -0.9999437 0.9934696 0.9934695 -0.0000238 0.0185862 0.0005417 -0.0000382 0.0180827 0.0000382 -0.0006933 0.0180827 0.0000382 -0.0015221 0.0180827 0.0000382 -0.0025707 0.0180827 0.0000382 -0.0038972 0.0180827 0.0000382 -0.0055755 0.0180827 0.0000382 -0.0076988 0.0180827 0.0000382 -0.0103849 0.0180827 0.0000382 -0.0137833 0.0180827 0.0000382 -0.0180827 0.0180827 0.0000382 -0.023522 0.0180827 0.0000382 -0.0304033 0.0180827 0.0000382 -0.0391092 0.0180827 0.0000382 -0.0501232 0.0180827 0.0000382 -0.0640574 0.0180827 0.0000382 -0.081686 0.0180827 0.0000382 -0.1039884 0.0180827 0.0000382 -0.1322038 0.0180827 0.0000382 -0.1679 0.0180827 0.0000382 -0.2130604 0.0180827 0.0000382 -0.2701941 0.0180827 0.0000382 -0.3424757 0.0180827 0.0000382 -0.4339214 0.0180827 0.0000382 -0.549612 0.0180827 0.0000382 -0.6959756 0.0180827 0.0000382 -0.8405071 0.0222366 0.0051286 -0.9032596 0.042049 0.0278872 -0.9354101 0.0735648 0.0624063 -0.9545286 0.1145191 0.1059489 -0.9669173 0.1636651 0.1572031 -0.9753975 0.2198803 0.2150852 -0.9814221 0.2818368 0.2783325 -0.9858163 0.3479034 0.3453807 -0.9890831 0.4161847 0.4143955 -0.9915463 0.4846548 0.4834045 -0.9934236 0.5513433 0.5504818 -0.994866 0.6145207 0.6139352 -0.9959811 0.6728425 0.6724495 -0.9968474 0.7254214 0.7251605 -0.997523 0.7718265 0.7716551 -0.9980512 0.8120245 0.8119128 -0.9984653 0.8462876 0.8462154 -0.9987905 0.8750929 0.8750466 -0.9990461 0.8990317 0.899002 -0.9992474 0.9187359 0.918717 -0.999406 0.9348269 0.9348149 -0.999531 0.9478828 0.9478752 -0.9996296 0.9584206 0.9584159 -0.9997074 0.9668902 0.9668872 -0.9997689 0.9736745 0.9736726 -0.9998174 0.9790939 0.9790927 -0.9998557 0.9834137 0.9834129 -0.999886 0.986851 0.9868505 -0.9999099 0.9895823 0.989582 -0.9999288 0.9917503 0.9917501 -0.9999437 0.9934696 0.9934695 -0.0000238 0.0240255 0.0005417 -0.0000382 0.023522 0.0000382 -0.0006933 0.023522 0.0000382 -0.0015221 0.023522 0.0000382 -0.0025707 0.023522 0.0000382 -0.0038972 0.023522 0.0000382 -0.0055755 0.023522 0.0000382 -0.0076988 0.023522 0.0000382 -0.0103849 0.023522 0.0000382 -0.0137833 0.023522 0.0000382 -0.0180827 0.023522 0.0000382 -0.023522 0.023522 0.0000382 -0.0304033 0.023522 0.0000382 -0.0391092 0.023522 0.0000382 -0.0501232 0.023522 0.0000382 -0.0640574 0.023522 0.0000382 -0.081686 0.023522 0.0000382 -0.1039884 0.023522 0.0000382 -0.1322038 0.023522 0.0000382 -0.1679 0.023522 0.0000382 -0.2130604 0.023522 0.0000382 -0.2701941 0.023522 0.0000382 -0.3424757 0.023522 0.0000382 -0.4339214 0.023522 0.0000382 -0.549612 0.023522 0.0000382 -0.6959756 0.023522 0.0000382 -0.8405071 0.0273936 0.0051286 -0.9032596 0.0463179 0.0278872 -0.9354101 0.0769284 0.0624063 -0.9545286 0.1171024 0.1059489 -0.9669173 0.165613 0.1572031 -0.9753975 0.2213257 0.2150852 -0.9814221 0.2828931 0.2783325 -0.9858163 0.3486639 0.3453807 -0.9890831 0.416724 0.4143955 -0.9915463 0.4850317 0.4834045 -0.9934236 0.5516029 0.5504818 -0.994866 0.6146972 0.6139352 -0.9959811 0.672961 0.6724495 -0.9968474 0.7255 0.7251605 -0.997523 0.7718782 0.7716551 -0.9980512 0.8120582 0.8119128 -0.9984653 0.8463093 0.8462154 -0.9987905 0.8751069 0.8750466 -0.9990461 0.8990406 0.899002 -0.9992474 0.9187416 0.918717 -0.999406 0.9348305 0.9348149 -0.999531 0.947885 0.9478752 -0.9996296 0.9584221 0.9584159 -0.9997074 0.9668911 0.9668872 -0.9997689 0.973675 0.9736726 -0.9998174 0.9790942 0.9790927 -0.9998557 0.9834139 0.9834129 -0.999886 0.9868511 0.9868505 -0.9999099 0.9895824 0.989582 -0.9999288 0.9917503 0.9917501 -0.9999437 0.9934696 0.9934695 -0.0000238 0.0309069 0.0005417 -0.0000382 0.0304033 0.0000382 -0.0006933 0.0304033 0.0000382 -0.0015221 0.0304033 0.0000382 -0.0025707 0.0304033 0.0000382 -0.0038972 0.0304033 0.0000382 -0.0055755 0.0304033 0.0000382 -0.0076988 0.0304033 0.0000382 -0.0103849 0.0304033 0.0000382 -0.0137833 0.0304033 0.0000382 -0.0180827 0.0304033 0.0000382 -0.023522 0.0304033 0.0000382 -0.0304033 0.0304033 0.0000382 -0.0391092 0.0304033 0.0000382 -0.0501232 0.0304033 0.0000382 -0.0640574 0.0304033 0.0000382 -0.081686 0.0304033 0.0000382 -0.1039884 0.0304033 0.0000382 -0.1322038 0.0304033 0.0000382 -0.1679 0.0304033 0.0000382 -0.2130604 0.0304033 0.0000382 -0.2701941 0.0304033 0.0000382 -0.3424757 0.0304033 0.0000382 -0.4339214 0.0304033 0.0000382 -0.549612 0.0304033 0.0000382 -0.6959756 0.0304033 0.0000382 -0.8405071 0.0339178 0.0051286 -0.9032596 0.0517186 0.0278872 -0.9354101 0.0811837 0.0624063 -0.9545286 0.1203707 0.1059489 -0.9669173 0.1680773 0.1572031 -0.9753975 0.2231543 0.2150852 -0.9814221 0.2842295 0.2783325 -0.9858163 0.3496259 0.3453807 -0.9890831 0.4174062 0.4143955 -0.9915463 0.4855085 0.4834045 -0.9934236 0.5519314 0.5504818 -0.994866 0.6149205 0.6139352 -0.9959811 0.6731109 0.6724495 -0.9968474 0.7255995 0.7251605 -0.997523 0.7719436 0.7716551 -0.9980512 0.8121007 0.8119128 -0.9984653 0.8463368 0.8462154 -0.9987905 0.8751246 0.8750466 -0.9990461 0.8990519 0.899002 -0.9992474 0.9187488 0.918717 -0.999406 0.9348351 0.9348149 -0.999531 0.9478879 0.9478752 -0.9996296 0.9584239 0.9584159 -0.9997074 0.9668923 0.9668872 -0.9997689 0.9736757 0.9736726 -0.9998174 0.9790947 0.9790927 -0.9998557 0.9834142 0.9834129 -0.999886 0.9868513 0.9868505 -0.9999099 0.9895825 0.989582 -0.9999288 0.9917504 0.9917501 -0.9999437 0.9934697 0.9934695 -0.0000238 0.0396127 0.0005417 -0.0000382 0.0391092 0.0000382 -0.0006933 0.0391092 0.0000382 -0.0015221 0.0391092 0.0000382 -0.0025707 0.0391092 0.0000382 -0.0038972 0.0391092 0.0000382 -0.0055755 0.0391092 0.0000382 -0.0076988 0.0391092 0.0000382 -0.0103849 0.0391092 0.0000382 -0.0137833 0.0391092 0.0000382 -0.0180827 0.0391092 0.0000382 -0.023522 0.0391092 0.0000382 -0.0304033 0.0391092 0.0000382 -0.0391092 0.0391092 0.0000382 -0.0501232 0.0391092 0.0000382 -0.0640574 0.0391092 0.0000382 -0.081686 0.0391092 0.0000382 -0.1039884 0.0391092 0.0000382 -0.1322038 0.0391092 0.0000382 -0.1679 0.0391092 0.0000382 -0.2130604 0.0391092 0.0000382 -0.2701941 0.0391092 0.0000382 -0.3424757 0.0391092 0.0000382 -0.4339214 0.0391092 0.0000382 -0.549612 0.0391092 0.0000382 -0.6959756 0.0391092 0.0000382 -0.8405071 0.0421719 0.0051286 -0.9032596 0.0585512 0.0278872 -0.9354101 0.0865673 0.0624063 -0.9545286 0.1245055 0.1059489 -0.9669173 0.171195 0.1572031 -0.9753975 0.2254677 0.2150852 -0.9814221 0.2859202 0.2783325 -0.9858163 0.350843 0.3453807 -0.9890831 0.4182694 0.4143955 -0.9915463 0.4861117 0.4834045 -0.9934236 0.552347 0.5504818 -0.994866 0.615203 0.6139352 -0.9959811 0.6733005 0.6724495 -0.9968474 0.7257254 0.7251605 -0.997523 0.7720263 0.7716551 -0.9980512 0.8121546 0.8119128 -0.9984653 0.8463717 0.8462154 -0.9987905 0.875147 0.8750466 -0.9990461 0.8990662 0.899002 -0.9992474 0.9187579 0.918717 -0.999406 0.9348408 0.9348149 -0.999531 0.9478916 0.9478752 -0.9996296 0.9584262 0.9584159 -0.9997074 0.9668937 0.9668872 -0.9997689 0.9736767 0.9736726 -0.9998174 0.9790953 0.9790927 -0.9998557 0.9834145 0.9834129 -0.999886 0.9868515 0.9868505 -0.9999099 0.9895826 0.989582 -0.9999288 0.9917505 0.9917501 -0.9999437 0.9934697 0.9934695 -0.0000238 0.0506267 0.0005417 -0.0000382 0.0501232 0.0000382 -0.0006933 0.0501232 0.0000382 -0.0015221 0.0501232 0.0000382 -0.0025707 0.0501232 0.0000382 -0.0038972 0.0501232 0.0000382 -0.0055755 0.0501232 0.0000382 -0.0076988 0.0501232 0.0000382 -0.0103849 0.0501232 0.0000382 -0.0137833 0.0501232 0.0000382 -0.0180827 0.0501232 0.0000382 -0.023522 0.0501232 0.0000382 -0.0304033 0.0501232 0.0000382 -0.0391092 0.0501232 0.0000382 -0.0501232 0.0501232 0.0000382 -0.0640574 0.0501232 0.0000382 -0.081686 0.0501232 0.0000382 -0.1039884 0.0501232 0.0000382 -0.1322038 0.0501232 0.0000382 -0.1679 0.0501232 0.0000382 -0.2130604 0.0501232 0.0000382 -0.2701941 0.0501232 0.0000382 -0.3424757 0.0501232 0.0000382 -0.4339214 0.0501232 0.0000382 -0.549612 0.0501232 0.0000382 -0.6959756 0.0501232 0.0000382 -0.8405071 0.0526143 0.0051286 -0.9032596 0.0671953 0.0278872 -0.9354101 0.0933783 0.0624063 -0.9545286 0.1297365 0.1059489 -0.9669173 0.1751393 0.1572031 -0.9753975 0.2283945 0.2150852 -0.9814221 0.2880591 0.2783325 -0.9858163 0.3523828 0.3453807 -0.9890831 0.4193615 0.4143955 -0.9915463 0.4868749 0.4834045 -0.9934236 0.5528728 0.5504818 -0.994866 0.6155604 0.6139352 -0.9959811 0.6735405 0.6724495 -0.9968474 0.7258847 0.7251605 -0.997523 0.7721309 0.7716551 -0.9980512 0.8122228 0.8119128 -0.9984653 0.8464157 0.8462154 -0.9987905 0.8751753 0.8750466 -0.9990461 0.8990843 0.899002 -0.9992474 0.9187694 0.918717 -0.999406 0.9348481 0.9348149 -0.999531 0.9478962 0.9478752 -0.9996296 0.9584291 0.9584159 -0.9997074 0.9668956 0.9668872 -0.9997689 0.9736778 0.9736726 -0.9998174 0.979096 0.9790927 -0.9998557 0.983415 0.9834129 -0.999886 0.9868518 0.9868505 -0.9999099 0.9895828 0.989582 -0.9999288 0.9917506 0.9917501 -0.9999437 0.9934698 0.9934695 -0.0000238 0.0645609 0.0005417 -0.0000382 0.0640574 0.0000382 -0.0006933 0.0640574 0.0000382 -0.0015221 0.0640574 0.0000382 -0.0025707 0.0640574 0.0000382 -0.0038972 0.0640574 0.0000382 -0.0055755 0.0640574 0.0000382 -0.0076988 0.0640574 0.0000382 -0.0103849 0.0640574 0.0000382 -0.0137833 0.0640574 0.0000382 -0.0180827 0.0640574 0.0000382 -0.023522 0.0640574 0.0000382 -0.0304033 0.0640574 0.0000382 -0.0391092 0.0640574 0.0000382 -0.0501232 0.0640574 0.0000382 -0.0640574 0.0640574 0.0000382 -0.081686 0.0640574 0.0000382 -0.1039884 0.0640574 0.0000382 -0.1322038 0.0640574 0.0000382 -0.1679 0.0640574 0.0000382 -0.2130604 0.0640574 0.0000382 -0.2701941 0.0640574 0.0000382 -0.3424757 0.0640574 0.0000382 -0.4339214 0.0640574 0.0000382 -0.549612 0.0640574 0.0000382 -0.6959756 0.0640574 0.0000382 -0.8405071 0.0658253 0.0051286 -0.9032596 0.0781312 0.0278872 -0.9354101 0.101995 0.0624063 -0.9545286 0.1363545 0.1059489 -0.9669173 0.1801293 0.1572031 -0.9753975 0.2320973 0.2150852 -0.9814221 0.2907651 0.2783325 -0.9858163 0.3543309 0.3453807 -0.9890831 0.420743 0.4143955 -0.9915463 0.4878404 0.4834045 -0.9934236 0.553538 0.5504818 -0.994866 0.6160126 0.6139352 -0.9959811 0.673844 0.6724495 -0.9968474 0.7260861 0.7251605 -0.997523 0.7722633 0.7716551 -0.9980512 0.812309 0.8119128 -0.9984653 0.8464715 0.8462154 -0.9987905 0.8752111 0.8750466 -0.9990461 0.8991072 0.899002 -0.9992474 0.9187839 0.918717 -0.999406 0.9348574 0.9348149 -0.999531 0.947902 0.9478752 -0.9996296 0.9584328 0.9584159 -0.9997074 0.9668979 0.9668872 -0.9997689 0.9736793 0.9736726 -0.9998174 0.9790969 0.9790927 -0.9998557 0.9834155 0.9834129 -0.999886 0.9868521 0.9868505 -0.9999099 0.989583 0.989582 -0.9999288 0.9917507 0.9917501 -0.9999437 0.9934699 0.9934695 -0.0000238 0.0821895 0.0005417 -0.0000382 0.081686 0.0000382 -0.0006933 0.081686 0.0000382 -0.0015221 0.081686 0.0000382 -0.0025707 0.081686 0.0000382 -0.0038972 0.081686 0.0000382 -0.0055755 0.081686 0.0000382 -0.0076988 0.081686 0.0000382 -0.0103849 0.081686 0.0000382 -0.0137833 0.081686 0.0000382 -0.0180827 0.081686 0.0000382 -0.023522 0.081686 0.0000382 -0.0304033 0.081686 0.0000382 -0.0391092 0.081686 0.0000382 -0.0501232 0.081686 0.0000382 -0.0640574 0.081686 0.0000382 -0.081686 0.081686 0.0000382 -0.1039884 0.081686 0.0000382 -0.1322038 0.081686 0.0000382 -0.1679 0.081686 0.0000382 -0.2130604 0.081686 0.0000382 -0.2701941 0.081686 0.0000382 -0.3424757 0.081686 0.0000382 -0.4339214 0.081686 0.0000382 -0.549612 0.081686 0.0000382 -0.6959756 0.081686 0.0000382 -0.8405071 0.082539 0.0051286 -0.9032596 0.0919666 0.0278872 -0.9354101 0.1128963 0.0624063 -0.9545286 0.1447271 0.1059489 -0.9669173 0.1864423 0.1572031 -0.9753975 0.2367818 0.2150852 -0.9814221 0.2941886 0.2783325 -0.9858163 0.3567954 0.3453807 -0.9890831 0.4224909 0.4143955 -0.9915463 0.4890619 0.4834045 -0.9934236 0.5543796 0.5504818 -0.994866 0.6165846 0.6139352 -0.9959811 0.674228 0.6724495 -0.9968474 0.726341 0.7251605 -0.997523 0.7724308 0.7716551 -0.9980512 0.8124181 0.8119128 -0.9984653 0.846542 0.8462154 -0.9987905 0.8752564 0.8750466 -0.9990461 0.8991362 0.899002 -0.9992474 0.9188024 0.918717 -0.999406 0.934869 0.9348149 -0.999531 0.9479094 0.9478752 -0.9996296 0.9584374 0.9584159 -0.9997074 0.9669008 0.9668872 -0.9997689 0.9736811 0.9736726 -0.9998174 0.979098 0.9790927 -0.9998557 0.9834163 0.9834129 -0.999886 0.9868526 0.9868505 -0.9999099 0.9895833 0.989582 -0.9999288 0.9917509 0.9917501 -0.9999437 0.99347 0.9934695 -0.0000238 0.1044919 0.0005417 -0.0000382 0.1039884 0.0000382 -0.0006933 0.1039884 0.0000382 -0.0015221 0.1039884 0.0000382 -0.0025707 0.1039884 0.0000382 -0.0038972 0.1039884 0.0000382 -0.0055755 0.1039884 0.0000382 -0.0076988 0.1039884 0.0000382 -0.0103849 0.1039884 0.0000382 -0.0137833 0.1039884 0.0000382 -0.0180827 0.1039884 0.0000382 -0.023522 0.1039884 0.0000382 -0.0304033 0.1039884 0.0000382 -0.0391092 0.1039884 0.0000382 -0.0501232 0.1039884 0.0000382 -0.0640574 0.1039884 0.0000382 -0.081686 0.1039884 0.0000382 -0.1039884 0.1039884 0.0000382 -0.1322038 0.1039884 0.0000382 -0.1679 0.1039884 0.0000382 -0.2130604 0.1039884 0.0000382 -0.2701941 0.1039884 0.0000382 -0.3424757 0.1039884 0.0000382 -0.4339214 0.1039884 0.0000382 -0.549612 0.1039884 0.0000382 -0.6959756 0.1039884 0.0000382 -0.8405071 0.1036839 0.0051286 -0.9032596 0.1094702 0.0278872 -0.9354101 0.1266878 0.0624063 -0.9545286 0.1553195 0.1059489 -0.9669173 0.1944291 0.1572031 -0.9753975 0.2427083 0.2150852 -0.9814221 0.2985198 0.2783325 -0.9858163 0.3599134 0.3453807 -0.9890831 0.4247022 0.4143955 -0.9915463 0.4906072 0.4834045 -0.9934236 0.5554442 0.5504818 -0.994866 0.6173083 0.6139352 -0.9959811 0.6747138 0.6724495 -0.9968474 0.7266635 0.7251605 -0.997523 0.7726427 0.7716551 -0.9980512 0.8125561 0.8119128 -0.9984653 0.8466313 0.8462154 -0.9987905 0.8753137 0.8750466 -0.9990461 0.8991728 0.899002 -0.9992474 0.9188257 0.918717 -0.999406 0.9348838 0.9348149 -0.999531 0.9479187 0.9478752 -0.9996296 0.9584433 0.9584159 -0.9997074 0.9669045 0.9668872 -0.9997689 0.9736834 0.9736726 -0.9998174 0.9790995 0.9790927 -0.9998557 0.9834172 0.9834129 -0.999886 0.9868532 0.9868505 -0.9999099 0.9895837 0.989582 -0.9999288 0.9917511 0.9917501 -0.9999437 0.9934701 0.9934695 -0.0000238 0.1327073 0.0005417 -0.0000382 0.1322038 0.0000382 -0.0006933 0.1322038 0.0000382 -0.0015221 0.1322038 0.0000382 -0.0025707 0.1322038 0.0000382 -0.0038972 0.1322038 0.0000382 -0.0055755 0.1322038 0.0000382 -0.0076988 0.1322038 0.0000382 -0.0103849 0.1322038 0.0000382 -0.0137833 0.1322038 0.0000382 -0.0180827 0.1322038 0.0000382 -0.023522 0.1322038 0.0000382 -0.0304033 0.1322038 0.0000382 -0.0391092 0.1322038 0.0000382 -0.0501232 0.1322038 0.0000382 -0.0640574 0.1322038 0.0000382 -0.081686 0.1322038 0.0000382 -0.1039884 0.1322038 0.0000382 -0.1322038 0.1322038 0.0000382 -0.1679 0.1322038 0.0000382 -0.2130604 0.1322038 0.0000382 -0.2701941 0.1322038 0.0000382 -0.3424757 0.1322038 0.0000382 -0.4339214 0.1322038 0.0000382 -0.549612 0.1322038 0.0000382 -0.6959756 0.1322038 0.0000382 -0.8405071 0.1304351 0.0051286 -0.9032596 0.1316144 0.0278872 -0.9354101 0.1441359 0.0624063 -0.9545286 0.1687203 0.1059489 -0.9669173 0.2045334 0.1572031 -0.9753975 0.2502061 0.2150852 -0.9814221 0.3039992 0.2783325 -0.9858163 0.363858 0.3453807 -0.9890831 0.4274997 0.4143955 -0.9915463 0.4925623 0.4834045 -0.9934236 0.5567912 0.5504818 -0.994866 0.6182239 0.6139352 -0.9959811 0.6753284 0.6724495 -0.9968474 0.7270714 0.7251605 -0.997523 0.7729107 0.7716551 -0.9980512 0.8127308 0.8119128 -0.9984653 0.8467442 0.8462154 -0.9987905 0.8753863 0.8750466 -0.9990461 0.8992191 0.899002 -0.9992474 0.9188551 0.918717 -0.999406 0.9349025 0.9348149 -0.999531 0.9479306 0.9478752 -0.9996296 0.9584508 0.9584159 -0.9997074 0.9669092 0.9668872 -0.9997689 0.9736864 0.9736726 -0.9998174 0.9791014 0.9790927 -0.9998557 0.9834184 0.9834129 -0.999886 0.9868539 0.9868505 -0.9999099 0.9895841 0.989582 -0.9999288 0.9917514 0.9917501 -0.9999437 0.9934703 0.9934695 -0.0000238 0.1684036 0.0005417 -0.0000382 0.1679 0.0000382 -0.0006933 0.1679 0.0000382 -0.0015221 0.1679 0.0000382 -0.0025707 0.1679 0.0000382 -0.0038972 0.1679 0.0000382 -0.0055755 0.1679 0.0000382 -0.0076988 0.1679 0.0000382 -0.0103849 0.1679 0.0000382 -0.0137833 0.1679 0.0000382 -0.0180827 0.1679 0.0000382 -0.023522 0.1679 0.0000382 -0.0304033 0.1679 0.0000382 -0.0391092 0.1679 0.0000382 -0.0501232 0.1679 0.0000382 -0.0640574 0.1679 0.0000382 -0.081686 0.1679 0.0000382 -0.1039884 0.1679 0.0000382 -0.1322038 0.1679 0.0000382 -0.1679 0.1679 0.0000382 -0.2130604 0.1679 0.0000382 -0.2701941 0.1679 0.0000382 -0.3424757 0.1679 0.0000382 -0.4339214 0.1679 0.0000382 -0.549612 0.1679 0.0000382 -0.6959756 0.1679 0.0000382 -0.8405071 0.1642787 0.0051286 -0.9032596 0.1596298 0.0278872 -0.9354101 0.16621 0.0624063 -0.9545286 0.185674 0.1059489 -0.9669173 0.2173167 0.1572031 -0.9753975 0.2596918 0.2150852 -0.9814221 0.3109315 0.2783325 -0.9858163 0.3688485 0.3453807 -0.9890831 0.431039 0.4143955 -0.9915463 0.4950356 0.4834045 -0.9934236 0.5584953 0.5504818 -0.994866 0.6193822 0.6139352 -0.9959811 0.676106 0.6724495 -0.9968474 0.7275875 0.7251605 -0.997523 0.7732499 0.7716551 -0.9980512 0.8129517 0.8119128 -0.9984653 0.846887 0.8462154 -0.9987905 0.875478 0.8750466 -0.9990461 0.8992778 0.899002 -0.9992474 0.9188925 0.918717 -0.999406 0.9349262 0.9348149 -0.999531 0.9479455 0.9478752 -0.9996296 0.9584602 0.9584159 -0.9997074 0.9669152 0.9668872 -0.9997689 0.9736901 0.9736726 -0.9998174 0.9791037 0.9790927 -0.9998557 0.9834198 0.9834129 -0.999886 0.9868548 0.9868505 -0.9999099 0.9895847 0.989582 -0.9999288 0.9917518 0.9917501 -0.9999437 0.9934705 0.9934695 -0.0000238 0.2135639 0.0005417 -0.0000382 0.2130604 0.0000382 -0.0006933 0.2130604 0.0000382 -0.0015221 0.2130604 0.0000382 -0.0025707 0.2130604 0.0000382 -0.0038972 0.2130604 0.0000382 -0.0055755 0.2130604 0.0000382 -0.0076988 0.2130604 0.0000382 -0.0103849 0.2130604 0.0000382 -0.0137833 0.2130604 0.0000382 -0.0180827 0.2130604 0.0000382 -0.023522 0.2130604 0.0000382 -0.0304033 0.2130604 0.0000382 -0.0391092 0.2130604 0.0000382 -0.0501232 0.2130604 0.0000382 -0.0640574 0.2130604 0.0000382 -0.081686 0.2130604 0.0000382 -0.1039884 0.2130604 0.0000382 -0.1322038 0.2130604 0.0000382 -0.1679 0.2130604 0.0000382 -0.2130604 0.2130604 0.0000382 -0.2701941 0.2130604 0.0000382 -0.3424757 0.2130604 0.0000382 -0.4339214 0.2130604 0.0000382 -0.549612 0.2130604 0.0000382 -0.6959756 0.2130604 0.0000382 -0.8405071 0.2070953 0.0051286 -0.9032596 0.1950729 0.0278872 -0.9354101 0.1941366 0.0624063 -0.9545286 0.2071226 0.1059489 -0.9669173 0.2334893 0.1572031 -0.9753975 0.2716924 0.2150852 -0.9814221 0.3197017 0.2783325 -0.9858163 0.3751621 0.3453807 -0.9890831 0.4355166 0.4143955 -0.9915463 0.4981648 0.4834045 -0.9934236 0.5606511 0.5504818 -0.994866 0.6208476 0.6139352 -0.9959811 0.6770898 0.6724495 -0.9968474 0.7282405 0.7251605 -0.997523 0.773679 0.7716551 -0.9980512 0.8132312 0.8119128 -0.9984653 0.8470677 0.8462154 -0.9987905 0.8755941 0.8750466 -0.9990461 0.899352 0.899002 -0.9992474 0.9189397 0.918717 -0.999406 0.9349561 0.9348149 -0.999531 0.9479644 0.9478752 -0.9996296 0.9584721 0.9584159 -0.9997074 0.9669227 0.9668872 -0.9997689 0.9736948 0.9736726 -0.9998174 0.9791067 0.9790927 -0.9998557 0.9834217 0.9834129 -0.999886 0.986856 0.9868505 -0.9999099 0.9895854 0.989582 -0.9999288 0.9917522 0.9917501 -0.9999437 0.9934708 0.9934695 -0.0000238 0.2706977 0.0005417 -0.0000382 0.2701941 0.0000382 -0.0006933 0.2701941 0.0000382 -0.0015221 0.2701941 0.0000382 -0.0025707 0.2701941 0.0000382 -0.0038972 0.2701941 0.0000382 -0.0055755 0.2701941 0.0000382 -0.0076988 0.2701941 0.0000382 -0.0103849 0.2701941 0.0000382 -0.0137833 0.2701941 0.0000382 -0.0180827 0.2701941 0.0000382 -0.023522 0.2701941 0.0000382 -0.0304033 0.2701941 0.0000382 -0.0391092 0.2701941 0.0000382 -0.0501232 0.2701941 0.0000382 -0.0640574 0.2701941 0.0000382 -0.081686 0.2701941 0.0000382 -0.1039884 0.2701941 0.0000382 -0.1322038 0.2701941 0.0000382 -0.1679 0.2701941 0.0000382 -0.2130604 0.2701941 0.0000382 -0.2701941 0.2701941 0.0000382 -0.3424757 0.2701941 0.0000382 -0.4339214 0.2701941 0.0000382 -0.549612 0.2701941 0.0000382 -0.6959756 0.2701941 0.0000382 -0.8405071 0.2612639 0.0051286 -0.9032596 0.239913 0.0278872 -0.9354101 0.2294673 0.0624063 -0.9545286 0.234258 0.1059489 -0.9669173 0.2539496 0.1572031 -0.9753975 0.2868747 0.2150852 -0.9814221 0.3307971 0.2783325 -0.9858163 0.3831496 0.3453807 -0.9890831 0.4411814 0.4143955 -0.9915463 0.5021236 0.4834045 -0.9934236 0.5633786 0.5504818 -0.994866 0.6227016 0.6139352 -0.9959811 0.6783343 0.6724495 -0.9968474 0.7290666 0.7251605 -0.997523 0.7742218 0.7716551 -0.9980512 0.8135847 0.8119128 -0.9984653 0.8472963 0.8462154 -0.9987905 0.875741 0.8750466 -0.9990461 0.8994458 0.899002 -0.9992474 0.9189994 0.918717 -0.999406 0.9349939 0.9348149 -0.999531 0.9479884 0.9478752 -0.9996296 0.9584872 0.9584159 -0.9997074 0.9669322 0.9668872 -0.9997689 0.9737008 0.9736726 -0.9998174 0.9791104 0.9790927 -0.9998557 0.983424 0.9834129 -0.999886 0.9868575 0.9868505 -0.9999099 0.9895864 0.989582 -0.9999288 0.9917528 0.9917501 -0.9999437 0.9934712 0.9934695 -0.0000238 0.3429792 0.0005417 -0.0000382 0.3424757 0.0000382 -0.0006933 0.3424757 0.0000382 -0.0015221 0.3424757 0.0000382 -0.0025707 0.3424757 0.0000382 -0.0038972 0.3424757 0.0000382 -0.0055755 0.3424757 0.0000382 -0.0076988 0.3424757 0.0000382 -0.0103849 0.3424757 0.0000382 -0.0137833 0.3424757 0.0000382 -0.0180827 0.3424757 0.0000382 -0.023522 0.3424757 0.0000382 -0.0304033 0.3424757 0.0000382 -0.0391092 0.3424757 0.0000382 -0.0501232 0.3424757 0.0000382 -0.0640574 0.3424757 0.0000382 -0.081686 0.3424757 0.0000382 -0.1039884 0.3424757 0.0000382 -0.1322038 0.3424757 0.0000382 -0.1679 0.3424757 0.0000382 -0.2130604 0.3424757 0.0000382 -0.2701941 0.3424757 0.0000382 -0.3424757 0.3424757 0.0000382 -0.4339214 0.3424757 0.0000382 -0.549612 0.3424757 0.0000382 -0.6959756 0.3424757 0.0000382 -0.8405071 0.3297942 0.0051286 -0.9032596 0.2966415 0.0278872 -0.9354101 0.2741654 0.0624063 -0.9545286 0.2685877 0.1059489 -0.9669173 0.2798347 0.1572031 -0.9753975 0.3060824 0.2150852 -0.9814221 0.3448342 0.2783325 -0.9858163 0.3932548 0.3453807 -0.9890831 0.4483481 0.4143955 -0.9915463 0.507132 0.4834045 -0.9934236 0.5668292 0.5504818 -0.994866 0.6250471 0.6139352 -0.9959811 0.6799088 0.6724495 -0.9968474 0.7301116 0.7251605 -0.997523 0.7749085 0.7716551 -0.9980512 0.8140321 0.8119128 -0.9984653 0.8475855 0.8462154 -0.9987905 0.8759268 0.8750466 -0.9990461 0.8995645 0.899002 -0.9992474 0.9190749 0.918717 -0.999406 0.9350418 0.9348149 -0.999531 0.9480186 0.9478752 -0.9996296 0.9585063 0.9584159 -0.9997074 0.9669442 0.9668872 -0.9997689 0.9737084 0.9736726 -0.9998174 0.9791152 0.9790927 -0.9998557 0.983427 0.9834129 -0.999886 0.9868593 0.9868505 -0.9999099 0.9895875 0.989582 -0.9999288 0.9917535 0.9917501 -0.9999437 0.9934716 0.9934695 -0.0000238 0.4344249 0.0005417 -0.0000382 0.4339214 0.0000382 -0.0006933 0.4339214 0.0000382 -0.0015221 0.4339214 0.0000382 -0.0025707 0.4339214 0.0000382 -0.0038972 0.4339214 0.0000382 -0.0055755 0.4339214 0.0000382 -0.0076988 0.4339214 0.0000382 -0.0103849 0.4339214 0.0000382 -0.0137833 0.4339214 0.0000382 -0.0180827 0.4339214 0.0000382 -0.023522 0.4339214 0.0000382 -0.0304033 0.4339214 0.0000382 -0.0391092 0.4339214 0.0000382 -0.0501232 0.4339214 0.0000382 -0.0640574 0.4339214 0.0000382 -0.081686 0.4339214 0.0000382 -0.1039884 0.4339214 0.0000382 -0.1322038 0.4339214 0.0000382 -0.1679 0.4339214 0.0000382 -0.2130604 0.4339214 0.0000382 -0.2701941 0.4339214 0.0000382 -0.3424757 0.4339214 0.0000382 -0.4339214 0.4339214 0.0000382 -0.549612 0.4339214 0.0000382 -0.6959756 0.4339214 0.0000382 -0.8405071 0.4164939 0.0051286 -0.9032596 0.3684105 0.0278872 -0.9354101 0.3307142 0.0624063 -0.9545286 0.3120193 0.1059489 -0.9669173 0.3125826 0.1572031 -0.9753975 0.3303825 0.2150852 -0.9814221 0.3625931 0.2783325 -0.9858163 0.4060392 0.3453807 -0.9890831 0.4574149 0.4143955 -0.9915463 0.5134682 0.4834045 -0.9934236 0.5711946 0.5504818 -0.994866 0.6280144 0.6139352 -0.9959811 0.6819008 0.6724495 -0.9968474 0.7314338 0.7251605 -0.997523 0.7757773 0.7716551 -0.9980512 0.814598 0.8119128 -0.9984653 0.8479514 0.8462154 -0.9987905 0.8761618 0.8750466 -0.9990461 0.8997147 0.899002 -0.9992474 0.9191705 0.918717 -0.999406 0.9351024 0.9348149 -0.999531 0.9480569 0.9478752 -0.9996296 0.9585305 0.9584159 -0.9997074 0.9669594 0.9668872 -0.9997689 0.9737179 0.9736726 -0.9998174 0.9791212 0.9790927 -0.9998557 0.9834308 0.9834129 -0.999886 0.9868617 0.9868505 -0.9999099 0.989589 0.989582 -0.9999288 0.9917545 0.9917501 -0.9999437 0.9934722 0.9934695 -0.0000238 0.5501155 0.0005417 -0.0000382 0.549612 0.0000382 -0.0006933 0.549612 0.0000382 -0.0015221 0.549612 0.0000382 -0.0025707 0.549612 0.0000382 -0.0038972 0.549612 0.0000382 -0.0055755 0.549612 0.0000382 -0.0076988 0.549612 0.0000382 -0.0103849 0.549612 0.0000382 -0.0137833 0.549612 0.0000382 -0.0180827 0.549612 0.0000382 -0.023522 0.549612 0.0000382 -0.0304033 0.549612 0.0000382 -0.0391092 0.549612 0.0000382 -0.0501232 0.549612 0.0000382 -0.0640574 0.549612 0.0000382 -0.081686 0.549612 0.0000382 -0.1039884 0.549612 0.0000382 -0.1322038 0.549612 0.0000382 -0.1679 0.549612 0.0000382 -0.2130604 0.549612 0.0000382 -0.2701941 0.549612 0.0000382 -0.3424757 0.549612 0.0000382 -0.4339214 0.549612 0.0000382 -0.549612 0.549612 0.0000382 -0.6959756 0.549612 0.0000382 -0.8405071 0.5261804 0.0051286 -0.9032596 0.4592077 0.0278872 -0.9354101 0.4022558 0.0624063 -0.9545286 0.3669659 0.1059489 -0.9669173 0.3540129 0.1572031 -0.9753975 0.3611254 0.2150852 -0.9814221 0.3850603 0.2783325 -0.9858163 0.4222132 0.3453807 -0.9890831 0.4688855 0.4143955 -0.9915463 0.5214844 0.4834045 -0.9934236 0.5767175 0.5504818 -0.994866 0.6317685 0.6139352 -0.9959811 0.6844209 0.6724495 -0.9968474 0.7331065 0.7251605 -0.997523 0.7768765 0.7716551 -0.9980512 0.815314 0.8119128 -0.9984653 0.8484142 0.8462154 -0.9987905 0.8764592 0.8750466 -0.9990461 0.8999048 0.899002 -0.9992474 0.9192914 0.918717 -0.999406 0.9351791 0.9348149 -0.999531 0.9481054 0.9478752 -0.9996296 0.958561 0.9584159 -0.9997074 0.9669786 0.9668872 -0.9997689 0.97373 0.9736726 -0.9998174 0.9791287 0.9790927 -0.9998557 0.9834355 0.9834129 -0.999886 0.9868647 0.9868505 -0.9999099 0.9895909 0.989582 -0.9999288 0.9917556 0.9917501 -0.9999437 0.993473 0.9934695 -0.0000238 0.6964791 0.0005417 -0.0000382 0.6959756 0.0000382 -0.0006933 0.6959756 0.0000382 -0.0015221 0.6959756 0.0000382 -0.0025707 0.6959756 0.0000382 -0.0038972 0.6959756 0.0000382 -0.0055755 0.6959756 0.0000382 -0.0076988 0.6959756 0.0000382 -0.0103849 0.6959756 0.0000382 -0.0137833 0.6959756 0.0000382 -0.0180827 0.6959756 0.0000382 -0.023522 0.6959756 0.0000382 -0.0304033 0.6959756 0.0000382 -0.0391092 0.6959756 0.0000382 -0.0501232 0.6959756 0.0000382 -0.0640574 0.6959756 0.0000382 -0.081686 0.6959756 0.0000382 -0.1039884 0.6959756 0.0000382 -0.1322038 0.6959756 0.0000382 -0.1679 0.6959756 0.0000382 -0.2130604 0.6959756 0.0000382 -0.2701941 0.6959756 0.0000382 -0.3424757 0.6959756 0.0000382 -0.4339214 0.6959756 0.0000382 -0.549612 0.6959756 0.0000382 -0.6959756 0.6959756 0.0000382 -0.8405071 0.664948 0.0051286 -0.9032596 0.5740779 0.0278872 -0.9354101 0.4927653 0.0624063 -0.9545286 0.4364805 0.1059489 -0.9669173 0.4064278 0.1572031 -0.9753975 0.4000191 0.2150852 -0.9814221 0.4134842 0.2783325 -0.9858163 0.4426754 0.3453807 -0.9890831 0.4833974 0.4143955 -0.9915463 0.531626 0.4834045 -0.9934236 0.5837046 0.5504818 -0.994866 0.6365179 0.6139352 -0.9959811 0.6876092 0.6724495 -0.9968474 0.7352227 0.7251605 -0.997523 0.7782671 0.7716551 -0.9980512 0.8162198 0.8119128 -0.9984653 0.8489999 0.8462154 -0.9987905 0.8768354 0.8750466 -0.9990461 0.9001452 0.899002 -0.9992474 0.9194443 0.918717 -0.999406 0.9352761 0.9348149 -0.999531 0.9481667 0.9478752 -0.9996296 0.9585997 0.9584159 -0.9997074 0.967003 0.9668872 -0.9997689 0.9737453 0.9736726 -0.9998174 0.9791383 0.9790927 -0.9998557 0.9834415 0.9834129 -0.999886 0.9868684 0.9868505 -0.9999099 0.9895932 0.989582 -0.9999288 0.9917571 0.9917501 -0.9999437 0.9934739 0.9934695 -0.0051514 0.8407292 0.0056422 -0.0051286 0.8405071 0.0051286 -0.0057497 0.8405071 0.0051286 -0.0065355 0.8405071 0.0051286 -0.0075296 0.8405071 0.0051286 -0.0087874 0.8405071 0.0051286 -0.0103785 0.8405071 0.0051286 -0.0123916 0.8405071 0.0051286 -0.0149384 0.8405071 0.0051286 -0.0181604 0.8405071 0.0051286 -0.0222366 0.8405071 0.0051286 -0.0273936 0.8405071 0.0051286 -0.0339178 0.8405071 0.0051286 -0.0421719 0.8405071 0.0051286 -0.0526143 0.8405071 0.0051286 -0.0658253 0.8405071 0.0051286 -0.082539 0.8405071 0.0051286 -0.1036839 0.8405071 0.0051286 -0.1304351 0.8405071 0.0051286 -0.1642787 0.8405071 0.0051286 -0.2070953 0.8405071 0.0051286 -0.2612639 0.8405071 0.0051286 -0.3297942 0.8405071 0.0051286 -0.4164939 0.8405071 0.0051286 -0.5261804 0.8405071 0.0051286 -0.664948 0.8405071 0.0051286 -0.8405071 0.8405071 0.0051286 -0.9032596 0.7194036 0.0278872 -0.9354101 0.6072715 0.0624063 -0.9545286 0.5244254 0.1059489 -0.9669173 0.4727393 0.1572031 -0.9753975 0.4492248 0.2150852 -0.9814221 0.4494442 0.2783325 -0.9858163 0.4685627 0.3453807 -0.9890831 0.5017569 0.4143955 -0.9915463 0.5444563 0.4834045 -0.9934236 0.5925443 0.5504818 -0.994866 0.6425265 0.6139352 -0.9959811 0.6916428 0.6724495 -0.9968474 0.7379 0.7251605 -0.997523 0.7800263 0.7716551 -0.9980512 0.8173657 0.8119128 -0.9984653 0.8497407 0.8462154 -0.9987905 0.8773114 0.8750466 -0.9990461 0.9004493 0.899002 -0.9992474 0.9196379 0.918717 -0.999406 0.9353987 0.9348149 -0.999531 0.9482442 0.9478752 -0.9996296 0.9586486 0.9584159 -0.9997074 0.9670337 0.9668872 -0.9997689 0.9737646 0.9736726 -0.9998174 0.9791505 0.9790927 -0.9998557 0.9834492 0.9834129 -0.999886 0.9868732 0.9868505 -0.9999099 0.9895962 0.989582 -0.9999288 0.991759 0.9917501 -0.9999437 0.9934751 0.9934695 -0.0279321 0.9033413 0.0283384 -0.0278872 0.9032596 0.0278872 -0.0284013 0.9032596 0.0278872 -0.0290518 0.9032596 0.0278872 -0.0298748 0.9032596 0.0278872 -0.0309159 0.9032596 0.0278872 -0.0322331 0.9032596 0.0278872 -0.0338994 0.9032596 0.0278872 -0.0360076 0.9032596 0.0278872 -0.0386748 0.9032596 0.0278872 -0.042049 0.9032596 0.0278872 -0.0463179 0.9032596 0.0278872 -0.0517186 0.9032596 0.0278872 -0.0585512 0.9032596 0.0278872 -0.0671953 0.9032596 0.0278872 -0.0781312 0.9032596 0.0278872 -0.0919666 0.9032596 0.0278872 -0.1094702 0.9032596 0.0278872 -0.1316144 0.9032596 0.0278872 -0.1596298 0.9032596 0.0278872 -0.1950729 0.9032596 0.0278872 -0.239913 0.9032596 0.0278872 -0.2966415 0.9032596 0.0278872 -0.3684105 0.9032596 0.0278872 -0.4592077 0.9032596 0.0278872 -0.5740779 0.9032596 0.0278872 -0.7194036 0.9032596 0.0278872 -0.9032596 0.9032596 0.0278872 -0.9354101 0.7521367 0.0624063 -0.9545286 0.6356873 0.1059489 -0.9669173 0.5566321 0.1572031 -0.9753975 0.5114763 0.2150852 -0.9814221 0.4949383 0.2783325 -0.9858163 0.5013136 0.3453807 -0.9890831 0.5249839 0.4143955 -0.9915463 0.5606884 0.4834045 -0.9934236 0.6037276 0.5504818 -0.994866 0.6501282 0.6139352 -0.9959811 0.6967458 0.6724495 -0.9968474 0.7412871 0.7251605 -0.997523 0.782252 0.7716551 -0.9980512 0.8188155 0.8119128 -0.9984653 0.850678 0.8462154 -0.9987905 0.8779135 0.8750466 -0.9990461 0.9008341 0.899002 -0.9992474 0.9198827 0.918717 -0.999406 0.935554 0.9348149 -0.999531 0.9483424 0.9478752 -0.9996296 0.9587105 0.9584159 -0.9997074 0.9670727 0.9668872 -0.9997689 0.9737891 0.9736726 -0.9998174 0.9791659 0.9790927 -0.9998557 0.9834588 0.9834129 -0.999886 0.9868792 0.9868505 -0.9999099 0.9896 0.989582 -0.9999288 0.9917614 0.9917501 -0.9999437 0.9934765 0.9934695 -0.0624569 0.9354466 0.062777 -0.0624063 0.9354101 0.0624063 -0.0628114 0.9354101 0.0624063 -0.0633239 0.9354101 0.0624063 -0.0639724 0.9354101 0.0624063 -0.0647927 0.9354101 0.0624063 -0.0658305 0.9354101 0.0624063 -0.0671435 0.9354101 0.0624063 -0.0688046 0.9354101 0.0624063 -0.0709061 0.9354101 0.0624063 -0.0735648 0.9354101 0.0624063 -0.0769284 0.9354101 0.0624063 -0.0811837 0.9354101 0.0624063 -0.0865673 0.9354101 0.0624063 -0.0933783 0.9354101 0.0624063 -0.101995 0.9354101 0.0624063 -0.1128963 0.9354101 0.0624063 -0.1266878 0.9354101 0.0624063 -0.1441359 0.9354101 0.0624063 -0.16621 0.9354101 0.0624063 -0.1941366 0.9354101 0.0624063 -0.2294673 0.9354101 0.0624063 -0.2741654 0.9354101 0.0624063 -0.3307142 0.9354101 0.0624063 -0.4022558 0.9354101 0.0624063 -0.4927653 0.9354101 0.0624063 -0.6072715 0.9354101 0.0624063 -0.7521367 0.9354101 0.0624063 -0.9354101 0.9354101 0.0624063 -0.9545286 0.776448 0.1059489 -0.9669173 0.6627673 0.1572031 -0.9753975 0.5902326 0.2150852 -0.9814221 0.5524942 0.2783325 -0.9858163 0.5427476 0.3453807 -0.9890831 0.5543692 0.4143955 -0.9915463 0.581224 0.4834045 -0.9934236 0.6178759 0.5504818 -0.994866 0.6597453 0.6139352 -0.9959811 0.7032018 0.6724495 -0.9968474 0.7455722 0.7251605 -0.997523 0.7850678 0.7716551 -0.9980512 0.8206497 0.8119128 -0.9984653 0.8518639 0.8462154 -0.9987905 0.8786753 0.8750466 -0.9990461 0.901321 0.899002 -0.9992474 0.9201924 0.918717 -0.999406 0.9357503 0.9348149 -0.999531 0.9484665 0.9478752 -0.9996296 0.9587888 0.9584159 -0.9997074 0.967122 0.9668872 -0.9997689 0.9738201 0.9736726 -0.9998174 0.9791853 0.9790927 -0.9998557 0.983471 0.9834129 -0.999886 0.9868869 0.9868505 -0.9999099 0.9896048 0.989582 -0.9999288 0.9917644 0.9917501 -0.9999437 0.9934784 0.9934695 -0.1059991 0.9545467 0.1062449 -0.1059489 0.9545286 0.1059489 -0.1062601 0.9545286 0.1059489 -0.1066537 0.9545286 0.1059489 -0.1071517 0.9545286 0.1059489 -0.1077818 0.9545286 0.1059489 -0.1085789 0.9545286 0.1059489 -0.1095873 0.9545286 0.1059489 -0.1108631 0.9545286 0.1059489 -0.1124771 0.9545286 0.1059489 -0.1145191 0.9545286 0.1059489 -0.1171024 0.9545286 0.1059489 -0.1203707 0.9545286 0.1059489 -0.1245055 0.9545286 0.1059489 -0.1297365 0.9545286 0.1059489 -0.1363545 0.9545286 0.1059489 -0.1447271 0.9545286 0.1059489 -0.1553195 0.9545286 0.1059489 -0.1687203 0.9545286 0.1059489 -0.185674 0.9545286 0.1059489 -0.2071226 0.9545286 0.1059489 -0.234258 0.9545286 0.1059489 -0.2685877 0.9545286 0.1059489 -0.3120193 0.9545286 0.1059489 -0.3669659 0.9545286 0.1059489 -0.4364805 0.9545286 0.1059489 -0.5244254 0.9545286 0.1059489 -0.6356873 0.9545286 0.1059489 -0.776448 0.9545286 0.1059489 -0.9545286 0.9545286 0.1059489 -0.9669173 0.7970422 0.1572031 -0.9753975 0.6898695 0.2150852 -0.9814221 0.62531 0.2783325 -0.9858163 0.5951671 0.3453807 -0.9890831 0.5915454 0.4143955 -0.9915463 0.6072043 0.4834045 -0.9934236 0.6357753 0.5504818 -0.994866 0.6719122 0.6139352 -0.9959811 0.7113694 0.6724495 -0.9968474 0.7509934 0.7251605 -0.997523 0.7886302 0.7716551 -0.9980512 0.8229701 0.8119128 -0.9984653 0.8533641 0.8462154 -0.9987905 0.8796391 0.8750466 -0.9990461 0.9019369 0.899002 -0.9992474 0.9205843 0.918717 -0.999406 0.9359988 0.9348149 -0.999531 0.9486235 0.9478752 -0.9996296 0.9588878 0.9584159 -0.9997074 0.9671843 0.9668872 -0.9997689 0.9738593 0.9736726 -0.9998174 0.9792099 0.9790927 -0.9998557 0.9834864 0.9834129 -0.999886 0.9868965 0.9868505 -0.9999099 0.9896108 0.989582 -0.9999288 0.9917681 0.9917501 -0.9999437 0.9934808 0.9934695 -0.1572498 0.9669269 0.1574352 -0.1572031 0.9669173 0.1572031 -0.1574377 0.9669173 0.1572031 -0.1577345 0.9669173 0.1572031 -0.15811 0.9669173 0.1572031 -0.1585851 0.9669173 0.1572031 -0.1591861 0.9669173 0.1572031 -0.1599465 0.9669173 0.1572031 -0.1609084 0.9669173 0.1572031 -0.1621254 0.9669173 0.1572031 -0.1636651 0.9669173 0.1572031 -0.165613 0.9669173 0.1572031 -0.1680773 0.9669173 0.1572031 -0.171195 0.9669173 0.1572031 -0.1751393 0.9669173 0.1572031 -0.1801293 0.9669173 0.1572031 -0.1864423 0.9669173 0.1572031 -0.1944291 0.9669173 0.1572031 -0.2045334 0.9669173 0.1572031 -0.2173167 0.9669173 0.1572031 -0.2334893 0.9669173 0.1572031 -0.2539496 0.9669173 0.1572031 -0.2798347 0.9669173 0.1572031 -0.3125826 0.9669173 0.1572031 -0.3540129 0.9669173 0.1572031 -0.4064278 0.9669173 0.1572031 -0.4727393 0.9669173 0.1572031 -0.5566321 0.9669173 0.1572031 -0.6627673 0.9669173 0.1572031 -0.7970422 0.9669173 0.1572031 -0.9669173 0.9669173 0.1572031 -0.9753975 0.8159232 0.2150852 -0.9814221 0.7174314 0.2783325 -0.9858163 0.6614846 0.3453807 -0.9890831 0.6385781 0.4143955 -0.9915463 0.6400728 0.4834045 -0.9934236 0.6584205 0.5504818 -0.994866 0.6873049 0.6139352 -0.9959811 0.7217025 0.6724495 -0.9968474 0.757852 0.7251605 -0.997523 0.793137 0.7716551 -0.9980512 0.8259058 0.8119128 -0.9984653 0.855262 0.8462154 -0.9987905 0.8808584 0.8750466 -0.9990461 0.902716 0.899002 -0.9992474 0.9210801 0.918717 -0.999406 0.9363131 0.9348149 -0.999531 0.9488222 0.9478752 -0.9996296 0.9590131 0.9584159 -0.9997074 0.9672632 0.9668872 -0.9997689 0.9739088 0.9736726 -0.9998174 0.979241 0.9790927 -0.9998557 0.9835059 0.9834129 -0.999886 0.9869088 0.9868505 -0.9999099 0.9896185 0.989582 -0.9999288 0.9917729 0.9917501 -0.9999437 0.9934838 0.9934695 -0.2151269 0.9754027 0.2152645 -0.2150852 0.9753975 0.2150852 -0.2152593 0.9753975 0.2150852 -0.2154796 0.9753975 0.2150852 -0.2157582 0.9753975 0.2150852 -0.2161107 0.9753975 0.2150852 -0.2165567 0.9753975 0.2150852 -0.2171209 0.9753975 0.2150852 -0.2178347 0.9753975 0.2150852 -0.2187378 0.9753975 0.2150852 -0.2198803 0.9753975 0.2150852 -0.2213257 0.9753975 0.2150852 -0.2231543 0.9753975 0.2150852 -0.2254677 0.9753975 0.2150852 -0.2283945 0.9753975 0.2150852 -0.2320973 0.9753975 0.2150852 -0.2367818 0.9753975 0.2150852 -0.2427083 0.9753975 0.2150852 -0.2502061 0.9753975 0.2150852 -0.2596918 0.9753975 0.2150852 -0.2716924 0.9753975 0.2150852 -0.2868747 0.9753975 0.2150852 -0.3060824 0.9753975 0.2150852 -0.3303825 0.9753975 0.2150852 -0.3611254 0.9753975 0.2150852 -0.4000191 0.9753975 0.2150852 -0.4492248 0.9753975 0.2150852 -0.5114763 0.9753975 0.2150852 -0.5902326 0.9753975 0.2150852 -0.6898695 0.9753975 0.2150852 -0.8159232 0.9753975 0.2150852 -0.9753975 0.9753975 0.2150852 -0.9814221 0.8339769 0.2783325 -0.9858163 0.7453848 0.3453807 -0.9890831 0.6980806 0.4143955 -0.9915463 0.6816556 0.4834045 -0.9934236 0.6870695 0.5504818 -0.994866 0.7067787 0.6139352 -0.9959811 0.7347753 0.6724495 -0.9968474 0.766529 0.7251605 -0.997523 0.7988387 0.7716551 -0.9980512 0.8296198 0.8119128 -0.9984653 0.8576632 0.8462154 -0.9987905 0.882401 0.8750466 -0.9990461 0.9037018 0.899002 -0.9992474 0.9217073 0.918717 -0.999406 0.9367107 0.9348149 -0.999531 0.9490736 0.9478752 -0.9996296 0.9591716 0.9584159 -0.9997074 0.9673629 0.9668872 -0.9997689 0.9739715 0.9736726 -0.9998174 0.9792804 0.9790927 -0.9998557 0.9835306 0.9834129 -0.999886 0.9869242 0.9868505 -0.9999099 0.9896282 0.989582 -0.9999288 0.991779 0.9917501 -0.9999437 0.9934876 0.9934695 -0.2783684 0.9814251 0.278469 -0.2783325 0.9814221 0.2783325 -0.2784598 0.9814221 0.2783325 -0.2786207 0.9814221 0.2783325 -0.2788244 0.9814221 0.2783325 -0.279082 0.9814221 0.2783325 -0.2794079 0.9814221 0.2783325 -0.2798202 0.9814221 0.2783325 -0.2803419 0.9814221 0.2783325 -0.2810019 0.9814221 0.2783325 -0.2818368 0.9814221 0.2783325 -0.2828931 0.9814221 0.2783325 -0.2842295 0.9814221 0.2783325 -0.2859202 0.9814221 0.2783325 -0.2880591 0.9814221 0.2783325 -0.2907651 0.9814221 0.2783325 -0.2941886 0.9814221 0.2783325 -0.2985198 0.9814221 0.2783325 -0.3039992 0.9814221 0.2783325 -0.3109315 0.9814221 0.2783325 -0.3197017 0.9814221 0.2783325 -0.3307971 0.9814221 0.2783325 -0.3448342 0.9814221 0.2783325 -0.3625931 0.9814221 0.2783325 -0.3850603 0.9814221 0.2783325 -0.4134842 0.9814221 0.2783325 -0.4494442 0.9814221 0.2783325 -0.4949383 0.9814221 0.2783325 -0.5524942 0.9814221 0.2783325 -0.62531 0.9814221 0.2783325 -0.7174314 0.9814221 0.2783325 -0.8339769 0.9814221 0.2783325 -0.9814221 0.9814221 0.2783325 -0.9858163 0.8515295 0.3453807 -0.9890831 0.773359 0.4143955 -0.9915463 0.7342633 0.4834045 -0.9934236 0.7233143 0.5504818 -0.994866 0.7314156 0.6139352 -0.9959811 0.751314 0.6724495 -0.9968474 0.7775065 0.7251605 -0.997523 0.8060522 0.7716551 -0.9980512 0.8343185 0.8119128 -0.9984653 0.860701 0.8462154 -0.9987905 0.8843525 0.8750466 -0.9990461 0.9049489 0.899002 -0.9992474 0.9225007 0.918717 -0.999406 0.9372137 0.9348149 -0.999531 0.9493916 0.9478752 -0.9996296 0.9593721 0.9584159 -0.9997074 0.9674892 0.9668872 -0.9997689 0.9740509 0.9736726 -0.9998174 0.9793302 0.9790927 -0.9998557 0.9835618 0.9834129 -0.999886 0.9869438 0.9868505 -0.9999099 0.9896404 0.989582 -0.9999288 0.9917867 0.9917501 -0.9999437 0.9934924 0.9934695 -0.3454107 0.9858181 0.3454831 -0.3453807 0.9858163 0.3453807 -0.3454723 0.9858163 0.3453807 -0.3455882 0.9858163 0.3453807 -0.3457348 0.9858163 0.3453807 -0.3459203 0.9858163 0.3453807 -0.3461549 0.9858163 0.3453807 -0.3464517 0.9858163 0.3453807 -0.3468273 0.9858163 0.3453807 -0.3473024 0.9858163 0.3453807 -0.3479034 0.9858163 0.3453807 -0.3486639 0.9858163 0.3453807 -0.3496259 0.9858163 0.3453807 -0.350843 0.9858163 0.3453807 -0.3523828 0.9858163 0.3453807 -0.3543309 0.9858163 0.3453807 -0.3567954 0.9858163 0.3453807 -0.3599134 0.9858163 0.3453807 -0.363858 0.9858163 0.3453807 -0.3688485 0.9858163 0.3453807 -0.3751621 0.9858163 0.3453807 -0.3831496 0.9858163 0.3453807 -0.3932548 0.9858163 0.3453807 -0.4060392 0.9858163 0.3453807 -0.4222132 0.9858163 0.3453807 -0.4426754 0.9858163 0.3453807 -0.4685627 0.9858163 0.3453807 -0.5013136 0.9858163 0.3453807 -0.5427476 0.9858163 0.3453807 -0.5951671 0.9858163 0.3453807 -0.6614846 0.9858163 0.3453807 -0.7453848 0.9858163 0.3453807 -0.8515295 0.9858163 0.3453807 -0.9858163 0.9858163 0.3453807 -0.9890831 0.8685959 0.4143955 -0.9915463 0.800819 0.4834045 -0.9934236 0.7691686 0.5504818 -0.994866 0.7625844 0.6139352 -0.9959811 0.7722376 0.6724495 -0.9968474 0.7913944 0.7251605 -0.997523 0.8151781 0.7716551 -0.9980512 0.840263 0.8119128 -0.9984653 0.8645442 0.8462154 -0.9987905 0.8868215 0.8750466 -0.9990461 0.9065267 0.899002 -0.9992474 0.9235046 0.918717 -0.999406 0.9378502 0.9348149 -0.999531 0.9497939 0.9478752 -0.9996296 0.9596259 0.9584159 -0.9997074 0.9676489 0.9668872 -0.9997689 0.9741513 0.9736726 -0.9998174 0.9793932 0.9790927 -0.9998557 0.9836014 0.9834129 -0.999886 0.9869686 0.9868505 -0.9999099 0.9896559 0.989582 -0.9999288 0.9917964 0.9917501 -0.9999437 0.9934984 0.9934695 -0.4144197 0.9890841 0.4144711 -0.4143955 0.9890831 0.4143955 -0.4144605 0.9890831 0.4143955 -0.4145427 0.9890831 0.4143955 -0.4146466 0.9890831 0.4143955 -0.4147782 0.9890831 0.4143955 -0.4149446 0.9890831 0.4143955 -0.4151551 0.9890831 0.4143955 -0.4154214 0.9890831 0.4143955 -0.4157584 0.9890831 0.4143955 -0.4161847 0.9890831 0.4143955 -0.416724 0.9890831 0.4143955 -0.4174062 0.9890831 0.4143955 -0.4182694 0.9890831 0.4143955 -0.4193615 0.9890831 0.4143955 -0.420743 0.9890831 0.4143955 -0.4224909 0.9890831 0.4143955 -0.4247022 0.9890831 0.4143955 -0.4274997 0.9890831 0.4143955 -0.431039 0.9890831 0.4143955 -0.4355166 0.9890831 0.4143955 -0.4411814 0.9890831 0.4143955 -0.4483481 0.9890831 0.4143955 -0.4574149 0.9890831 0.4143955 -0.4688855 0.9890831 0.4143955 -0.4833974 0.9890831 0.4143955 -0.5017569 0.9890831 0.4143955 -0.5249839 0.9890831 0.4143955 -0.5543692 0.9890831 0.4143955 -0.5915454 0.9890831 0.4143955 -0.6385781 0.9890831 0.4143955 -0.6980806 0.9890831 0.4143955 -0.773359 0.9890831 0.4143955 -0.8685959 0.9890831 0.4143955 -0.9890831 0.9890831 0.4143955 -0.9915463 0.8850205 0.4834045 -0.9934236 0.8271803 0.5504818 -0.994866 0.802017 0.6139352 -0.9959811 0.7987087 0.6724495 -0.9968474 0.8089645 0.7251605 -0.997523 0.8267236 0.7716551 -0.9980512 0.8477836 0.8119128 -0.9984653 0.8694063 0.8462154 -0.9987905 0.8899451 0.8750466 -0.9990461 0.9085228 0.899002 -0.9992474 0.9247746 0.918717 -0.999406 0.9386553 0.9348149 -0.999531 0.9503028 0.9478752 -0.9996296 0.9599468 0.9584159 -0.9997074 0.9678509 0.9668872 -0.9997689 0.9742782 0.9736726 -0.9998174 0.9794729 0.9790927 -0.9998557 0.9836513 0.9834129 -0.999886 0.9869999 0.9868505 -0.9999099 0.9896756 0.989582 -0.9999288 0.9918087 0.9917501 -0.9999437 0.9935061 0.9934695 -0.4834235 0.9915469 0.4834593 -0.4834045 0.9915463 0.4834045 -0.4834499 0.9915463 0.4834045 -0.4835073 0.9915463 0.4834045 -0.48358 0.9915463 0.4834045 -0.4836719 0.9915463 0.4834045 -0.4837882 0.9915463 0.4834045 -0.4839353 0.9915463 0.4834045 -0.4841214 0.9915463 0.4834045 -0.4843569 0.9915463 0.4834045 -0.4846548 0.9915463 0.4834045 -0.4850317 0.9915463 0.4834045 -0.4855085 0.9915463 0.4834045 -0.4861117 0.9915463 0.4834045 -0.4868749 0.9915463 0.4834045 -0.4878404 0.9915463 0.4834045 -0.4890619 0.9915463 0.4834045 -0.4906072 0.9915463 0.4834045 -0.4925623 0.9915463 0.4834045 -0.4950356 0.9915463 0.4834045 -0.4981648 0.9915463 0.4834045 -0.5021236 0.9915463 0.4834045 -0.507132 0.9915463 0.4834045 -0.5134682 0.9915463 0.4834045 -0.5214844 0.9915463 0.4834045 -0.531626 0.9915463 0.4834045 -0.5444563 0.9915463 0.4834045 -0.5606884 0.9915463 0.4834045 -0.581224 0.9915463 0.4834045 -0.6072043 0.9915463 0.4834045 -0.6400728 0.9915463 0.4834045 -0.6816556 0.9915463 0.4834045 -0.7342633 0.9915463 0.4834045 -0.800819 0.9915463 0.4834045 -0.8850205 0.9915463 0.4834045 -0.9915463 0.9915463 0.4834045 -0.9934236 0.9005727 0.5504818 -0.994866 0.8519044 0.6139352 -0.9959811 0.8321981 0.6724495 -0.9968474 0.831193 0.7251605 -0.997523 0.8413301 0.7716551 -0.9980512 0.857298 0.8119128 -0.9984653 0.8755576 0.8462154 -0.9987905 0.8938969 0.8750466 -0.9990461 0.9110481 0.899002 -0.9992474 0.9263814 0.918717 -0.999406 0.939674 0.9348149 -0.999531 0.9509468 0.9478752 -0.9996296 0.9603529 0.9584159 -0.9997074 0.9681065 0.9668872 -0.9997689 0.9744389 0.9736726 -0.9998174 0.9795737 0.9790927 -0.9998557 0.9837146 0.9834129 -0.999886 0.9870395 0.9868505 -0.9999099 0.9897004 0.989582 -0.9999288 0.9918242 0.9917501 -0.9999437 0.9935159 0.9934695 -0.5504963 0.993424 0.550521 -0.5504818 0.9934236 0.5504818 -0.5505131 0.9934236 0.5504818 -0.5505527 0.9934236 0.5504818 -0.5506027 0.9934236 0.5504818 -0.5506661 0.9934236 0.5504818 -0.5507462 0.9934236 0.5504818 -0.5508475 0.9934236 0.5504818 -0.5509758 0.9934236 0.5504818 -0.551138 0.9934236 0.5504818 -0.5513433 0.9934236 0.5504818 -0.5516029 0.9934236 0.5504818 -0.5519314 0.9934236 0.5504818 -0.552347 0.9934236 0.5504818 -0.5528728 0.9934236 0.5504818 -0.553538 0.9934236 0.5504818 -0.5543796 0.9934236 0.5504818 -0.5554442 0.9934236 0.5504818 -0.5567912 0.9934236 0.5504818 -0.5584953 0.9934236 0.5504818 -0.5606511 0.9934236 0.5504818 -0.5633786 0.9934236 0.5504818 -0.5668292 0.9934236 0.5504818 -0.5711946 0.9934236 0.5504818 -0.5767175 0.9934236 0.5504818 -0.5837046 0.9934236 0.5504818 -0.5925443 0.9934236 0.5504818 -0.6037276 0.9934236 0.5504818 -0.6178759 0.9934236 0.5504818 -0.6357753 0.9934236 0.5504818 -0.6584205 0.9934236 0.5504818 -0.6870695 0.9934236 0.5504818 -0.7233143 0.9934236 0.5504818 -0.7691686 0.9934236 0.5504818 -0.8271803 0.9934236 0.5504818 -0.9005727 0.9934236 0.5504818 -0.9934236 0.9934236 0.5504818 -0.994866 0.9150185 0.6139352 -0.9959811 0.8745666 0.6724495 -0.9968474 0.8593148 0.7251605 -0.997523 0.8598093 0.7716551 -0.9980512 0.8693351 0.8119128 -0.9984653 0.8833397 0.8462154 -0.9987905 0.8988963 0.8750466 -0.9990461 0.914243 0.899002 -0.9992474 0.9284141 0.918717 -0.999406 0.9409627 0.9348149 -0.999531 0.9517614 0.9478752 -0.9996296 0.9608667 0.9584159 -0.9997074 0.9684299 0.9668872 -0.9997689 0.9746421 0.9736726 -0.9998174 0.9797013 0.9790927 -0.9998557 0.9837946 0.9834129 -0.999886 0.9870897 0.9868505 -0.9999099 0.9897318 0.989582 -0.9999288 0.9918438 0.9917501 -0.9999437 0.9935281 0.9934695 -0.6139459 0.9948662 0.6139627 -0.6139352 0.994866 0.6139352 -0.6139564 0.994866 0.6139352 -0.6139833 0.994866 0.6139352 -0.6140174 0.994866 0.6139352 -0.6140604 0.994866 0.6139352 -0.6141149 0.994866 0.6139352 -0.6141838 0.994866 0.6139352 -0.6142709 0.994866 0.6139352 -0.6143812 0.994866 0.6139352 -0.6145207 0.994866 0.6139352 -0.6146972 0.994866 0.6139352 -0.6149205 0.994866 0.6139352 -0.615203 0.994866 0.6139352 -0.6155604 0.994866 0.6139352 -0.6160126 0.994866 0.6139352 -0.6165846 0.994866 0.6139352 -0.6173083 0.994866 0.6139352 -0.6182239 0.994866 0.6139352 -0.6193822 0.994866 0.6139352 -0.6208476 0.994866 0.6139352 -0.6227016 0.994866 0.6139352 -0.6250471 0.994866 0.6139352 -0.6280144 0.994866 0.6139352 -0.6317685 0.994866 0.6139352 -0.6365179 0.994866 0.6139352 -0.6425265 0.994866 0.6139352 -0.6501282 0.994866 0.6139352 -0.6597453 0.994866 0.6139352 -0.6719122 0.994866 0.6139352 -0.6873049 0.994866 0.6139352 -0.7067787 0.994866 0.6139352 -0.7314156 0.994866 0.6139352 -0.7625844 0.994866 0.6139352 -0.802017 0.994866 0.6139352 -0.8519044 0.994866 0.6139352 -0.9150185 0.994866 0.6139352 -0.994866 0.994866 0.6139352 -0.9959811 0.9281681 0.6724495 -0.9968474 0.8948926 0.7251605 -0.997523 0.8831879 0.7716551 -0.9980512 0.8845635 0.8119128 -0.9984653 0.8931851 0.8462154 -0.9987905 0.9052213 0.8750466 -0.9990461 0.9182849 0.899002 -0.9992474 0.9309858 0.918717 -0.999406 0.9425931 0.9348149 -0.999531 0.952792 0.9478752 -0.9996296 0.9615166 0.9584159 -0.9997074 0.968839 0.9668872 -0.9997689 0.9748993 0.9736726 -0.9998174 0.9798627 0.9790927 -0.9998557 0.9838958 0.9834129 -0.999886 0.9871531 0.9868505 -0.9999099 0.9897715 0.989582 -0.9999288 0.9918687 0.9917501 -0.9999437 0.9935437 0.9934695 -0.6724572 0.9959813 0.6724685 -0.6724495 0.9959811 0.6724495 -0.6724637 0.9959811 0.6724495 -0.6724818 0.9959811 0.6724495 -0.6725046 0.9959811 0.6724495 -0.6725335 0.9959811 0.6724495 -0.6725701 0.9959811 0.6724495 -0.6726163 0.9959811 0.6724495 -0.6726748 0.9959811 0.6724495 -0.6727489 0.9959811 0.6724495 -0.6728425 0.9959811 0.6724495 -0.672961 0.9959811 0.6724495 -0.6731109 0.9959811 0.6724495 -0.6733005 0.9959811 0.6724495 -0.6735405 0.9959811 0.6724495 -0.673844 0.9959811 0.6724495 -0.674228 0.9959811 0.6724495 -0.6747138 0.9959811 0.6724495 -0.6753284 0.9959811 0.6724495 -0.676106 0.9959811 0.6724495 -0.6770898 0.9959811 0.6724495 -0.6783343 0.9959811 0.6724495 -0.6799088 0.9959811 0.6724495 -0.6819008 0.9959811 0.6724495 -0.6844209 0.9959811 0.6724495 -0.6876092 0.9959811 0.6724495 -0.6916428 0.9959811 0.6724495 -0.6967458 0.9959811 0.6724495 -0.7032018 0.9959811 0.6724495 -0.7113694 0.9959811 0.6724495 -0.7217025 0.9959811 0.6724495 -0.7347753 0.9959811 0.6724495 -0.751314 0.9959811 0.6724495 -0.7722376 0.9959811 0.6724495 -0.7987087 0.9959811 0.6724495 -0.8321981 0.9959811 0.6724495 -0.8745666 0.9959811 0.6724495 -0.9281681 0.9959811 0.6724495 -0.9959811 0.9959811 0.6724495 -0.9968474 0.9399032 0.7251605 -0.997523 0.9127648 0.7716551 -0.9980512 0.9038294 0.8119128 -0.9984653 0.9056408 0.8462154 -0.9987905 0.9132232 0.8750466 -0.9990461 0.9233984 0.899002 -0.9992474 0.9342393 0.918717 -0.999406 0.9446557 0.9348149 -0.999531 0.9540959 0.9478752 -0.9996296 0.9623389 0.9584159 -0.9997074 0.9693566 0.9668872 -0.9997689 0.9752246 0.9736726 -0.9998174 0.9800669 0.9790927 -0.9998557 0.9840239 0.9834129 -0.999886 0.9872333 0.9868505 -0.9999099 0.9898218 0.989582 -0.9999288 0.9919002 0.9917501 -0.9999437 0.9935634 0.9934695 -0.7251659 0.9968475 0.7251734 -0.7251605 0.9968474 0.7251605 -0.72517 0.9968474 0.7251605 -0.725182 0.9968474 0.7251605 -0.7251971 0.9968474 0.7251605 -0.7252163 0.9968474 0.7251605 -0.7252406 0.9968474 0.7251605 -0.7252713 0.9968474 0.7251605 -0.7253101 0.9968474 0.7251605 -0.7253592 0.9968474 0.7251605 -0.7254214 0.9968474 0.7251605 -0.7255 0.9968474 0.7251605 -0.7255995 0.9968474 0.7251605 -0.7257254 0.9968474 0.7251605 -0.7258847 0.9968474 0.7251605 -0.7260861 0.9968474 0.7251605 -0.726341 0.9968474 0.7251605 -0.7266635 0.9968474 0.7251605 -0.7270714 0.9968474 0.7251605 -0.7275875 0.9968474 0.7251605 -0.7282405 0.9968474 0.7251605 -0.7290666 0.9968474 0.7251605 -0.7301116 0.9968474 0.7251605 -0.7314338 0.9968474 0.7251605 -0.7331065 0.9968474 0.7251605 -0.7352227 0.9968474 0.7251605 -0.7379 0.9968474 0.7251605 -0.7412871 0.9968474 0.7251605 -0.7455722 0.9968474 0.7251605 -0.7509934 0.9968474 0.7251605 -0.757852 0.9968474 0.7251605 -0.766529 0.9968474 0.7251605 -0.7775065 0.9968474 0.7251605 -0.7913944 0.9968474 0.7251605 -0.8089645 0.9968474 0.7251605 -0.831193 0.9968474 0.7251605 -0.8593148 0.9968474 0.7251605 -0.8948926 0.9968474 0.7251605 -0.9399032 0.9968474 0.7251605 -0.9968474 0.9968474 0.7251605 -0.997523 0.9501835 0.7716551 -0.9980512 0.9282033 0.8119128 -0.9984653 0.9213989 0.8462154 -0.9987905 0.9233467 0.8750466 -0.9990461 0.9298677 0.899002 -0.9992474 0.9383554 0.918717 -0.999406 0.9472652 0.9348149 -0.999531 0.9557455 0.9478752 -0.9996296 0.9633792 0.9584159 -0.9997074 0.9700114 0.9668872 -0.9997689 0.9756361 0.9736726 -0.9998174 0.9803253 0.9790927 -0.9998557 0.9841859 0.9834129 -0.999886 0.9873349 0.9868505 -0.9999099 0.9898853 0.989582 -0.9999288 0.99194 0.9917501 -0.9999437 0.9935883 0.9934695 -0.7716588 0.997523 0.7716637 -0.7716551 0.997523 0.7716551 -0.7716613 0.997523 0.7716551 -0.7716692 0.997523 0.7716551 -0.7716791 0.997523 0.7716551 -0.7716917 0.997523 0.7716551 -0.7717077 0.997523 0.7716551 -0.7717278 0.997523 0.7716551 -0.7717534 0.997523 0.7716551 -0.7717857 0.997523 0.7716551 -0.7718265 0.997523 0.7716551 -0.7718782 0.997523 0.7716551 -0.7719436 0.997523 0.7716551 -0.7720263 0.997523 0.7716551 -0.7721309 0.997523 0.7716551 -0.7722633 0.997523 0.7716551 -0.7724308 0.997523 0.7716551 -0.7726427 0.997523 0.7716551 -0.7729107 0.997523 0.7716551 -0.7732499 0.997523 0.7716551 -0.773679 0.997523 0.7716551 -0.7742218 0.997523 0.7716551 -0.7749085 0.997523 0.7716551 -0.7757773 0.997523 0.7716551 -0.7768765 0.997523 0.7716551 -0.7782671 0.997523 0.7716551 -0.7800263 0.997523 0.7716551 -0.782252 0.997523 0.7716551 -0.7850678 0.997523 0.7716551 -0.7886302 0.997523 0.7716551 -0.793137 0.997523 0.7716551 -0.7988387 0.997523 0.7716551 -0.8060522 0.997523 0.7716551 -0.8151781 0.997523 0.7716551 -0.8267236 0.997523 0.7716551 -0.8413301 0.997523 0.7716551 -0.8598093 0.997523 0.7716551 -0.8831879 0.997523 0.7716551 -0.9127648 0.997523 0.7716551 -0.9501835 0.997523 0.7716551 -0.997523 0.997523 0.7716551 -0.9980512 0.9590395 0.8119128 -0.9984653 0.9413349 0.8462154 -0.9987905 0.9361542 0.8750466 -0.9990461 0.9380522 0.899002 -0.9992474 0.9435628 0.918717 -0.999406 0.9505666 0.9348149 -0.999531 0.9578324 0.9478752 -0.9996296 0.9646953 0.9584159 -0.9997074 0.9708399 0.9668872 -0.9997689 0.9761568 0.9736726 -0.9998174 0.9806521 0.9790927 -0.9998557 0.9843909 0.9834129 -0.999886 0.9874633 0.9868505 -0.9999099 0.9899658 0.989582 -0.9999288 0.9919903 0.9917501 -0.9999437 0.9936198 0.9934695 -0.8119154 0.9980513 0.8119186 -0.8119128 0.9980512 0.8119128 -0.8119169 0.9980512 0.8119128 -0.811922 0.9980512 0.8119128 -0.8119285 0.9980512 0.8119128 -0.8119367 0.9980512 0.8119128 -0.8119471 0.9980512 0.8119128 -0.8119602 0.9980512 0.8119128 -0.8119769 0.9980512 0.8119128 -0.8119979 0.9980512 0.8119128 -0.8120245 0.9980512 0.8119128 -0.8120582 0.9980512 0.8119128 -0.8121007 0.9980512 0.8119128 -0.8121546 0.9980512 0.8119128 -0.8122228 0.9980512 0.8119128 -0.812309 0.9980512 0.8119128 -0.8124181 0.9980512 0.8119128 -0.8125561 0.9980512 0.8119128 -0.8127308 0.9980512 0.8119128 -0.8129517 0.9980512 0.8119128 -0.8132312 0.9980512 0.8119128 -0.8135847 0.9980512 0.8119128 -0.8140321 0.9980512 0.8119128 -0.814598 0.9980512 0.8119128 -0.815314 0.9980512 0.8119128 -0.8162198 0.9980512 0.8119128 -0.8173657 0.9980512 0.8119128 -0.8188155 0.9980512 0.8119128 -0.8206497 0.9980512 0.8119128 -0.8229701 0.9980512 0.8119128 -0.8259058 0.9980512 0.8119128 -0.8296198 0.9980512 0.8119128 -0.8343185 0.9980512 0.8119128 -0.840263 0.9980512 0.8119128 -0.8477836 0.9980512 0.8119128 -0.857298 0.9980512 0.8119128 -0.8693351 0.9980512 0.8119128 -0.8845635 0.9980512 0.8119128 -0.9038294 0.9980512 0.8119128 -0.9282033 0.9980512 0.8119128 -0.9590395 0.9980512 0.8119128 -0.9980512 0.9980512 0.8119128 -0.9984653 0.9665566 0.8462154 -0.9987905 0.9523573 0.8750466 -0.9990461 0.9484067 0.899002 -0.9992474 0.9501508 0.918717 -0.999406 0.9547433 0.9348149 -0.999531 0.9604726 0.9478752 -0.9996296 0.9663604 0.9584159 -0.9997074 0.9718879 0.9668872 -0.9997689 0.9768155 0.9736726 -0.9998174 0.9810656 0.9790927 -0.9998557 0.9846502 0.9834129 -0.999886 0.9876258 0.9868505 -0.9999099 0.9900675 0.989582 -0.9999288 0.992054 0.9917501 -0.9999437 0.9936596 0.9934695 -0.8462171 0.9984653 0.8462191 -0.8462154 0.9984653 0.8462154 -0.846218 0.9984653 0.8462154 -0.8462213 0.9984653 0.8462154 -0.8462255 0.9984653 0.8462154 -0.8462308 0.9984653 0.8462154 -0.8462375 0.9984653 0.8462154 -0.846246 0.9984653 0.8462154 -0.8462568 0.9984653 0.8462154 -0.8462703 0.9984653 0.8462154 -0.8462876 0.9984653 0.8462154 -0.8463093 0.9984653 0.8462154 -0.8463368 0.9984653 0.8462154 -0.8463717 0.9984653 0.8462154 -0.8464157 0.9984653 0.8462154 -0.8464715 0.9984653 0.8462154 -0.846542 0.9984653 0.8462154 -0.8466313 0.9984653 0.8462154 -0.8467442 0.9984653 0.8462154 -0.846887 0.9984653 0.8462154 -0.8470677 0.9984653 0.8462154 -0.8472963 0.9984653 0.8462154 -0.8475855 0.9984653 0.8462154 -0.8479514 0.9984653 0.8462154 -0.8484142 0.9984653 0.8462154 -0.8489999 0.9984653 0.8462154 -0.8497407 0.9984653 0.8462154 -0.850678 0.9984653 0.8462154 -0.8518639 0.9984653 0.8462154 -0.8533641 0.9984653 0.8462154 -0.855262 0.9984653 0.8462154 -0.8576632 0.9984653 0.8462154 -0.860701 0.9984653 0.8462154 -0.8645442 0.9984653 0.8462154 -0.8694063 0.9984653 0.8462154 -0.8755576 0.9984653 0.8462154 -0.8833397 0.9984653 0.8462154 -0.8931851 0.9984653 0.8462154 -0.9056408 0.9984653 0.8462154 -0.9213989 0.9984653 0.8462154 -0.9413349 0.9984653 0.8462154 -0.9665566 0.9984653 0.8462154 -0.9984653 0.9984653 0.8462154 -0.9987905 0.9728564 0.8750466 -0.9990461 0.9615064 0.899002 -0.9992474 0.9584856 0.918717 -0.999406 0.9600273 0.9348149 -0.999531 0.9638128 0.9478752 -0.9996296 0.9684669 0.9584159 -0.9997074 0.9732139 0.9668872 -0.9997689 0.9776488 0.9736726 -0.9998174 0.9815887 0.9790927 -0.9998557 0.9849782 0.9834129 -0.999886 0.9878314 0.9868505 -0.9999099 0.9901963 0.989582 -0.9999288 0.9921346 0.9917501 -0.9999437 0.9937101 0.9934695 -0.8750477 0.9987905 0.875049 -0.8750466 0.9987905 0.8750466 -0.8750482 0.9987905 0.8750466 -0.8750504 0.9987905 0.8750466 -0.8750531 0.9987905 0.8750466 -0.8750565 0.9987905 0.8750466 -0.8750608 0.9987905 0.8750466 -0.8750662 0.9987905 0.8750466 -0.8750731 0.9987905 0.8750466 -0.8750819 0.9987905 0.8750466 -0.8750929 0.9987905 0.8750466 -0.8751069 0.9987905 0.8750466 -0.8751246 0.9987905 0.8750466 -0.875147 0.9987905 0.8750466 -0.8751753 0.9987905 0.8750466 -0.8752111 0.9987905 0.8750466 -0.8752564 0.9987905 0.8750466 -0.8753137 0.9987905 0.8750466 -0.8753863 0.9987905 0.8750466 -0.875478 0.9987905 0.8750466 -0.8755941 0.9987905 0.8750466 -0.875741 0.9987905 0.8750466 -0.8759268 0.9987905 0.8750466 -0.8761618 0.9987905 0.8750466 -0.8764592 0.9987905 0.8750466 -0.8768354 0.9987905 0.8750466 -0.8773114 0.9987905 0.8750466 -0.8779135 0.9987905 0.8750466 -0.8786753 0.9987905 0.8750466 -0.8796391 0.9987905 0.8750466 -0.8808584 0.9987905 0.8750466 -0.882401 0.9987905 0.8750466 -0.8843525 0.9987905 0.8750466 -0.8868215 0.9987905 0.8750466 -0.8899451 0.9987905 0.8750466 -0.8938969 0.9987905 0.8750466 -0.8988963 0.9987905 0.8750466 -0.9052213 0.9987905 0.8750466 -0.9132232 0.9987905 0.8750466 -0.9233467 0.9987905 0.8750466 -0.9361542 0.9987905 0.8750466 -0.9523573 0.9987905 0.8750466 -0.9728564 0.9987905 0.8750466 -0.9987905 0.9987905 0.8750466 -0.9990461 0.9780793 0.899002 -0.9992474 0.9690301 0.918717 -0.999406 0.9667124 0.9348149 -0.999531 0.9680386 0.9478752 -0.9996296 0.9711319 0.9584159 -0.9997074 0.9748914 0.9668872 -0.9997689 0.9787031 0.9736726 -0.9998174 0.9822505 0.9790927 -0.9998557 0.9853933 0.9834129 -0.999886 0.9880914 0.9868505 -0.9999099 0.9903591 0.989582 -0.9999288 0.9922365 0.9917501 -0.9999437 0.9937739 0.9934695 -0.8990028 0.9990461 0.8990036 -0.899002 0.9990461 0.899002 -0.8990031 0.9990461 0.899002 -0.8990045 0.9990461 0.899002 -0.8990062 0.9990461 0.899002 -0.8990084 0.9990461 0.899002 -0.8990111 0.9990461 0.899002 -0.8990146 0.9990461 0.899002 -0.899019 0.9990461 0.899002 -0.8990246 0.9990461 0.899002 -0.8990317 0.9990461 0.899002 -0.8990406 0.9990461 0.899002 -0.8990519 0.9990461 0.899002 -0.8990662 0.9990461 0.899002 -0.8990843 0.9990461 0.899002 -0.8991072 0.9990461 0.899002 -0.8991362 0.9990461 0.899002 -0.8991728 0.9990461 0.899002 -0.8992191 0.9990461 0.899002 -0.8992778 0.9990461 0.899002 -0.899352 0.9990461 0.899002 -0.8994458 0.9990461 0.899002 -0.8995645 0.9990461 0.899002 -0.8997147 0.9990461 0.899002 -0.8999048 0.9990461 0.899002 -0.9001452 0.9990461 0.899002 -0.9004493 0.9990461 0.899002 -0.9008341 0.9990461 0.899002 -0.901321 0.9990461 0.899002 -0.9019369 0.9990461 0.899002 -0.902716 0.9990461 0.899002 -0.9037018 0.9990461 0.899002 -0.9049489 0.9990461 0.899002 -0.9065267 0.9990461 0.899002 -0.9085228 0.9990461 0.899002 -0.9110481 0.9990461 0.899002 -0.914243 0.9990461 0.899002 -0.9182849 0.9990461 0.899002 -0.9233984 0.9990461 0.899002 -0.9298677 0.9990461 0.899002 -0.9380522 0.9990461 0.899002 -0.9484067 0.9990461 0.899002 -0.9615064 0.9990461 0.899002 -0.9780793 0.9990461 0.899002 -0.9990461 0.9990461 0.899002 -0.9992474 0.9823703 0.918717 -0.999406 0.9751697 0.9348149 -0.999531 0.9733849 0.9478752 -0.9996296 0.9745034 0.9584159 -0.9997074 0.9770136 0.9668872 -0.9997689 0.9800369 0.9736726 -0.9998174 0.9830878 0.9790927 -0.9998557 0.9859183 0.9834129 -0.999886 0.9884205 0.9868505 -0.9999099 0.9905652 0.989582 -0.9999288 0.9923655 0.9917501 -0.9999437 0.9938546 0.9934695 -0.9187175 0.9992474 0.918718 -0.918717 0.9992474 0.918717 -0.9187177 0.9992474 0.918717 -0.9187186 0.9992474 0.918717 -0.9187197 0.9992474 0.918717 -0.9187211 0.9992474 0.918717 -0.9187228 0.9992474 0.918717 -0.918725 0.9992474 0.918717 -0.9187278 0.9992474 0.918717 -0.9187314 0.9992474 0.918717 -0.9187359 0.9992474 0.918717 -0.9187416 0.9992474 0.918717 -0.9187488 0.9992474 0.918717 -0.9187579 0.9992474 0.918717 -0.9187694 0.9992474 0.918717 -0.9187839 0.9992474 0.918717 -0.9188024 0.9992474 0.918717 -0.9188257 0.9992474 0.918717 -0.9188551 0.9992474 0.918717 -0.9188925 0.9992474 0.918717 -0.9189397 0.9992474 0.918717 -0.9189994 0.9992474 0.918717 -0.9190749 0.9992474 0.918717 -0.9191705 0.9992474 0.918717 -0.9192914 0.9992474 0.918717 -0.9194443 0.9992474 0.918717 -0.9196379 0.9992474 0.918717 -0.9198827 0.9992474 0.918717 -0.9201924 0.9992474 0.918717 -0.9205843 0.9992474 0.918717 -0.9210801 0.9992474 0.918717 -0.9217073 0.9992474 0.918717 -0.9225007 0.9992474 0.918717 -0.9235046 0.9992474 0.918717 -0.9247746 0.9992474 0.918717 -0.9263814 0.9992474 0.918717 -0.9284141 0.9992474 0.918717 -0.9309858 0.9992474 0.918717 -0.9342393 0.9992474 0.918717 -0.9383554 0.9992474 0.918717 -0.9435628 0.9992474 0.918717 -0.9501508 0.9992474 0.918717 -0.9584856 0.9992474 0.918717 -0.9690301 0.9992474 0.918717 -0.9823703 0.9992474 0.918717 -0.9992474 0.9992474 0.918717 -0.999406 0.9858695 0.9348149 -0.999531 0.9801485 0.9478752 -0.9996296 0.9787689 0.9584159 -0.9997074 0.9796985 0.9668872 -0.9997689 0.9817244 0.9736726 -0.9998174 0.9841471 0.9790927 -0.9998557 0.9865826 0.9834129 -0.999886 0.9888367 0.9868505 -0.9999099 0.9908259 0.989582 -0.9999288 0.9925287 0.9917501 -0.9999437 0.9939567 0.9934695 -0.9348153 0.999406 0.9348156 -0.9348149 0.999406 0.9348149 -0.9348154 0.999406 0.9348149 -0.9348159 0.999406 0.9348149 -0.9348166 0.999406 0.9348149 -0.9348175 0.999406 0.9348149 -0.9348186 0.999406 0.9348149 -0.93482 0.999406 0.9348149 -0.9348218 0.999406 0.9348149 -0.9348241 0.999406 0.9348149 -0.9348269 0.999406 0.9348149 -0.9348305 0.999406 0.9348149 -0.9348351 0.999406 0.9348149 -0.9348408 0.999406 0.9348149 -0.9348481 0.999406 0.9348149 -0.9348574 0.999406 0.9348149 -0.934869 0.999406 0.9348149 -0.9348838 0.999406 0.9348149 -0.9349025 0.999406 0.9348149 -0.9349262 0.999406 0.9348149 -0.9349561 0.999406 0.9348149 -0.9349939 0.999406 0.9348149 -0.9350418 0.999406 0.9348149 -0.9351024 0.999406 0.9348149 -0.9351791 0.999406 0.9348149 -0.9352761 0.999406 0.9348149 -0.9353987 0.999406 0.9348149 -0.935554 0.999406 0.9348149 -0.9357503 0.999406 0.9348149 -0.9359988 0.999406 0.9348149 -0.9363131 0.999406 0.9348149 -0.9367107 0.999406 0.9348149 -0.9372137 0.999406 0.9348149 -0.9378502 0.999406 0.9348149 -0.9386553 0.999406 0.9348149 -0.939674 0.999406 0.9348149 -0.9409627 0.999406 0.9348149 -0.9425931 0.999406 0.9348149 -0.9446557 0.999406 0.9348149 -0.9472652 0.999406 0.9348149 -0.9505666 0.999406 0.9348149 -0.9547433 0.999406 0.9348149 -0.9600273 0.999406 0.9348149 -0.9667124 0.999406 0.9348149 -0.9751697 0.999406 0.9348149 -0.9858695 0.999406 0.9348149 -0.999406 0.999406 0.9348149 -0.999531 0.9887054 0.9478752 -0.9996296 0.9841653 0.9584159 -0.9997074 0.9830953 0.9668872 -0.9997689 0.9838592 0.9736726 -0.9998174 0.9854872 0.9790927 -0.9998557 0.987423 0.9834129 -0.999886 0.9893634 0.9868505 -0.9999099 0.9911557 0.989582 -0.9999288 0.9927351 0.9917501 -0.9999437 0.9940858 0.9934695 -0.9478754 0.999531 0.9478756 -0.9478752 0.999531 0.9478752 -0.9478755 0.999531 0.9478752 -0.9478758 0.999531 0.9478752 -0.9478763 0.999531 0.9478752 -0.9478768 0.999531 0.9478752 -0.9478775 0.999531 0.9478752 -0.9478784 0.999531 0.9478752 -0.9478795 0.999531 0.9478752 -0.947881 0.999531 0.9478752 -0.9478828 0.999531 0.9478752 -0.947885 0.999531 0.9478752 -0.9478879 0.999531 0.9478752 -0.9478916 0.999531 0.9478752 -0.9478962 0.999531 0.9478752 -0.947902 0.999531 0.9478752 -0.9479094 0.999531 0.9478752 -0.9479187 0.999531 0.9478752 -0.9479306 0.999531 0.9478752 -0.9479455 0.999531 0.9478752 -0.9479644 0.999531 0.9478752 -0.9479884 0.999531 0.9478752 -0.9480186 0.999531 0.9478752 -0.9480569 0.999531 0.9478752 -0.9481054 0.999531 0.9478752 -0.9481667 0.999531 0.9478752 -0.9482442 0.999531 0.9478752 -0.9483424 0.999531 0.9478752 -0.9484665 0.999531 0.9478752 -0.9486235 0.999531 0.9478752 -0.9488222 0.999531 0.9478752 -0.9490736 0.999531 0.9478752 -0.9493916 0.999531 0.9478752 -0.9497939 0.999531 0.9478752 -0.9503028 0.999531 0.9478752 -0.9509468 0.999531 0.9478752 -0.9517614 0.999531 0.9478752 -0.952792 0.999531 0.9478752 -0.9540959 0.999531 0.9478752 -0.9557455 0.999531 0.9478752 -0.9578324 0.999531 0.9478752 -0.9604726 0.999531 0.9478752 -0.9638128 0.999531 0.9478752 -0.9680386 0.999531 0.9478752 -0.9733849 0.999531 0.9478752 -0.9801485 0.999531 0.9478752 -0.9887054 0.999531 0.9478752 -0.999531 0.999531 0.9478752 -0.9996296 0.9909924 0.9584159 -0.9997074 0.9873926 0.9668872 -0.9997689 0.9865601 0.9736726 -0.9998174 0.9871826 0.9790927 -0.9998557 0.9884863 0.9834129 -0.999886 0.9900296 0.9868505 -0.9999099 0.9915729 0.989582 -0.9999288 0.9929963 0.9917501 -0.9999437 0.9942492 0.9934695 -0.958416 0.9996296 0.9584161 -0.9584159 0.9996296 0.9584159 -0.958416 0.9996296 0.9584159 -0.9584162 0.9996296 0.9584159 -0.9584165 0.9996296 0.9584159 -0.9584169 0.9996296 0.9584159 -0.9584173 0.9996296 0.9584159 -0.9584179 0.9996296 0.9584159 -0.9584186 0.9996296 0.9584159 -0.9584195 0.9996296 0.9584159 -0.9584206 0.9996296 0.9584159 -0.9584221 0.9996296 0.9584159 -0.9584239 0.9996296 0.9584159 -0.9584262 0.9996296 0.9584159 -0.9584291 0.9996296 0.9584159 -0.9584328 0.9996296 0.9584159 -0.9584374 0.9996296 0.9584159 -0.9584433 0.9996296 0.9584159 -0.9584508 0.9996296 0.9584159 -0.9584602 0.9996296 0.9584159 -0.9584721 0.9996296 0.9584159 -0.9584872 0.9996296 0.9584159 -0.9585063 0.9996296 0.9584159 -0.9585305 0.9996296 0.9584159 -0.958561 0.9996296 0.9584159 -0.9585997 0.9996296 0.9584159 -0.9586486 0.9996296 0.9584159 -0.9587105 0.9996296 0.9584159 -0.9587888 0.9996296 0.9584159 -0.9588878 0.9996296 0.9584159 -0.9590131 0.9996296 0.9584159 -0.9591716 0.9996296 0.9584159 -0.9593721 0.9996296 0.9584159 -0.9596259 0.9996296 0.9584159 -0.9599468 0.9996296 0.9584159 -0.9603529 0.9996296 0.9584159 -0.9608667 0.9996296 0.9584159 -0.9615166 0.9996296 0.9584159 -0.9623389 0.9996296 0.9584159 -0.9633792 0.9996296 0.9584159 -0.9646953 0.9996296 0.9584159 -0.9663604 0.9996296 0.9584159 -0.9684669 0.9996296 0.9584159 -0.9711319 0.9996296 0.9584159 -0.9745034 0.9996296 0.9584159 -0.9787689 0.9996296 0.9584159 -0.9841653 0.9996296 0.9584159 -0.9909924 0.9996296 0.9584159 -0.9996296 0.9996296 0.9584159 -0.9997074 0.9928293 0.9668872 -0.9997689 0.989977 0.9736726 -0.9998174 0.9893275 0.9790927 -0.9998557 0.9898314 0.9834129 -0.999886 0.9908725 0.9868505 -0.9999099 0.9921008 0.989582 -0.9999288 0.9933267 0.9917501 -0.9999437 0.994456 0.9934695 -0.9668873 0.9997074 0.9668874 -0.9668872 0.9997074 0.9668872 -0.9668874 0.9997074 0.9668872 -0.9668875 0.9997074 0.9668872 -0.9668877 0.9997074 0.9668872 -0.9668879 0.9997074 0.9668872 -0.9668882 0.9997074 0.9668872 -0.9668885 0.9997074 0.9668872 -0.966889 0.9997074 0.9668872 -0.9668895 0.9997074 0.9668872 -0.9668902 0.9997074 0.9668872 -0.9668911 0.9997074 0.9668872 -0.9668923 0.9997074 0.9668872 -0.9668937 0.9997074 0.9668872 -0.9668956 0.9997074 0.9668872 -0.9668979 0.9997074 0.9668872 -0.9669008 0.9997074 0.9668872 -0.9669045 0.9997074 0.9668872 -0.9669092 0.9997074 0.9668872 -0.9669152 0.9997074 0.9668872 -0.9669227 0.9997074 0.9668872 -0.9669322 0.9997074 0.9668872 -0.9669442 0.9997074 0.9668872 -0.9669594 0.9997074 0.9668872 -0.9669786 0.9997074 0.9668872 -0.967003 0.9997074 0.9668872 -0.9670337 0.9997074 0.9668872 -0.9670727 0.9997074 0.9668872 -0.967122 0.9997074 0.9668872 -0.9671843 0.9997074 0.9668872 -0.9672632 0.9997074 0.9668872 -0.9673629 0.9997074 0.9668872 -0.9674892 0.9997074 0.9668872 -0.9676489 0.9997074 0.9668872 -0.9678509 0.9997074 0.9668872 -0.9681065 0.9997074 0.9668872 -0.9684299 0.9997074 0.9668872 -0.968839 0.9997074 0.9668872 -0.9693566 0.9997074 0.9668872 -0.9700114 0.9997074 0.9668872 -0.9708399 0.9997074 0.9668872 -0.9718879 0.9997074 0.9668872 -0.9732139 0.9997074 0.9668872 -0.9748914 0.9997074 0.9668872 -0.9770136 0.9997074 0.9668872 -0.9796985 0.9997074 0.9668872 -0.9830953 0.9997074 0.9668872 -0.9873926 0.9997074 0.9668872 -0.9928293 0.9997074 0.9668872 -0.9997074 0.9997074 0.9668872 -0.9997689 0.9942999 0.9736726 -0.9998174 0.9920411 0.9790927 -0.9998557 0.9915331 0.9834129 -0.999886 0.9919389 0.9868505 -0.9999099 0.9927686 0.989582 -0.9999288 0.9937448 0.9917501 -0.9999437 0.9947176 0.9934695 -0.9736726 0.9997689 0.9736727 -0.9736726 0.9997689 0.9736726 -0.9736726 0.9997689 0.9736726 -0.9736727 0.9997689 0.9736726 -0.9736728 0.9997689 0.9736726 -0.973673 0.9997689 0.9736726 -0.9736731 0.9997689 0.9736726 -0.9736734 0.9997689 0.9736726 -0.9736737 0.9997689 0.9736726 -0.973674 0.9997689 0.9736726 -0.9736745 0.9997689 0.9736726 -0.973675 0.9997689 0.9736726 -0.9736757 0.9997689 0.9736726 -0.9736767 0.9997689 0.9736726 -0.9736778 0.9997689 0.9736726 -0.9736793 0.9997689 0.9736726 -0.9736811 0.9997689 0.9736726 -0.9736834 0.9997689 0.9736726 -0.9736864 0.9997689 0.9736726 -0.9736901 0.9997689 0.9736726 -0.9736948 0.9997689 0.9736726 -0.9737008 0.9997689 0.9736726 -0.9737084 0.9997689 0.9736726 -0.9737179 0.9997689 0.9736726 -0.97373 0.9997689 0.9736726 -0.9737453 0.9997689 0.9736726 -0.9737646 0.9997689 0.9736726 -0.9737891 0.9997689 0.9736726 -0.9738201 0.9997689 0.9736726 -0.9738593 0.9997689 0.9736726 -0.9739088 0.9997689 0.9736726 -0.9739715 0.9997689 0.9736726 -0.9740509 0.9997689 0.9736726 -0.9741513 0.9997689 0.9736726 -0.9742782 0.9997689 0.9736726 -0.9744389 0.9997689 0.9736726 -0.9746421 0.9997689 0.9736726 -0.9748993 0.9997689 0.9736726 -0.9752246 0.9997689 0.9736726 -0.9756361 0.9997689 0.9736726 -0.9761568 0.9997689 0.9736726 -0.9768155 0.9997689 0.9736726 -0.9776488 0.9997689 0.9736726 -0.9787031 0.9997689 0.9736726 -0.9800369 0.9997689 0.9736726 -0.9817244 0.9997689 0.9736726 -0.9838592 0.9997689 0.9736726 -0.9865601 0.9997689 0.9736726 -0.989977 0.9997689 0.9736726 -0.9942999 0.9997689 0.9736726 -0.9997689 0.9997689 0.9736726 -0.9998174 0.9954741 0.9790927 -0.9998557 0.9936861 0.9834129 -0.999886 0.993288 0.9868505 -0.9999099 0.9936135 0.989582 -0.9999288 0.9942736 0.9917501 -0.9999437 0.9950485 0.9934695 -0.9790927 0.9998174 0.9790928 -0.9790927 0.9998174 0.9790927 -0.9790927 0.9998174 0.9790927 -0.9790928 0.9998174 0.9790927 -0.9790929 0.9998174 0.9790927 -0.9790929 0.9998174 0.9790927 -0.9790931 0.9998174 0.9790927 -0.9790932 0.9998174 0.9790927 -0.9790934 0.9998174 0.9790927 -0.9790936 0.9998174 0.9790927 -0.9790939 0.9998174 0.9790927 -0.9790942 0.9998174 0.9790927 -0.9790947 0.9998174 0.9790927 -0.9790953 0.9998174 0.9790927 -0.979096 0.9998174 0.9790927 -0.9790969 0.9998174 0.9790927 -0.979098 0.9998174 0.9790927 -0.9790995 0.9998174 0.9790927 -0.9791014 0.9998174 0.9790927 -0.9791037 0.9998174 0.9790927 -0.9791067 0.9998174 0.9790927 -0.9791104 0.9998174 0.9790927 -0.9791152 0.9998174 0.9790927 -0.9791212 0.9998174 0.9790927 -0.9791287 0.9998174 0.9790927 -0.9791383 0.9998174 0.9790927 -0.9791505 0.9998174 0.9790927 -0.9791659 0.9998174 0.9790927 -0.9791853 0.9998174 0.9790927 -0.9792099 0.9998174 0.9790927 -0.979241 0.9998174 0.9790927 -0.9792804 0.9998174 0.9790927 -0.9793302 0.9998174 0.9790927 -0.9793932 0.9998174 0.9790927 -0.9794729 0.9998174 0.9790927 -0.9795737 0.9998174 0.9790927 -0.9797013 0.9998174 0.9790927 -0.9798627 0.9998174 0.9790927 -0.9800669 0.9998174 0.9790927 -0.9803253 0.9998174 0.9790927 -0.9806521 0.9998174 0.9790927 -0.9810656 0.9998174 0.9790927 -0.9815887 0.9998174 0.9790927 -0.9822505 0.9998174 0.9790927 -0.9830878 0.9998174 0.9790927 -0.9841471 0.9998174 0.9790927 -0.9854872 0.9998174 0.9790927 -0.9871826 0.9998174 0.9790927 -0.9893275 0.9998174 0.9790927 -0.9920411 0.9998174 0.9790927 -0.9954741 0.9998174 0.9790927 -0.9998174 0.9998174 0.9790927 -0.9998557 0.9964098 0.9834129 -0.999886 0.9949948 0.9868505 -0.9999099 0.9946824 0.989582 -0.9999288 0.9949427 0.9917501 -0.9999437 0.9954671 0.9934695 -0.9834129 0.9998557 0.983413 -0.9834129 0.9998557 0.9834129 -0.9834129 0.9998557 0.9834129 -0.983413 0.9998557 0.9834129 -0.983413 0.9998557 0.9834129 -0.9834131 0.9998557 0.9834129 -0.9834131 0.9998557 0.9834129 -0.9834132 0.9998557 0.9834129 -0.9834133 0.9998557 0.9834129 -0.9834135 0.9998557 0.9834129 -0.9834137 0.9998557 0.9834129 -0.9834139 0.9998557 0.9834129 -0.9834142 0.9998557 0.9834129 -0.9834145 0.9998557 0.9834129 -0.983415 0.9998557 0.9834129 -0.9834155 0.9998557 0.9834129 -0.9834163 0.9998557 0.9834129 -0.9834172 0.9998557 0.9834129 -0.9834184 0.9998557 0.9834129 -0.9834198 0.9998557 0.9834129 -0.9834217 0.9998557 0.9834129 -0.983424 0.9998557 0.9834129 -0.983427 0.9998557 0.9834129 -0.9834308 0.9998557 0.9834129 -0.9834355 0.9998557 0.9834129 -0.9834415 0.9998557 0.9834129 -0.9834492 0.9998557 0.9834129 -0.9834588 0.9998557 0.9834129 -0.983471 0.9998557 0.9834129 -0.9834864 0.9998557 0.9834129 -0.9835059 0.9998557 0.9834129 -0.9835306 0.9998557 0.9834129 -0.9835618 0.9998557 0.9834129 -0.9836014 0.9998557 0.9834129 -0.9836513 0.9998557 0.9834129 -0.9837146 0.9998557 0.9834129 -0.9837946 0.9998557 0.9834129 -0.9838958 0.9998557 0.9834129 -0.9840239 0.9998557 0.9834129 -0.9841859 0.9998557 0.9834129 -0.9843909 0.9998557 0.9834129 -0.9846502 0.9998557 0.9834129 -0.9849782 0.9998557 0.9834129 -0.9853933 0.9998557 0.9834129 -0.9859183 0.9998557 0.9834129 -0.9865826 0.9998557 0.9834129 -0.987423 0.9998557 0.9834129 -0.9884863 0.9998557 0.9834129 -0.9898314 0.9998557 0.9834129 -0.9915331 0.9998557 0.9834129 -0.9936861 0.9998557 0.9834129 -0.9964098 0.9998557 0.9834129 -0.9998557 0.9998557 0.9834129 -0.999886 0.9971542 0.9868505 -0.9999099 0.9960347 0.989582 -0.9999288 0.9957891 0.9917501 -0.9999437 0.9959967 0.9934695 -0.9868505 0.999886 0.9868505 -0.9868505 0.999886 0.9868505 -0.9868505 0.999886 0.9868505 -0.9868505 0.999886 0.9868505 -0.9868506 0.999886 0.9868505 -0.9868506 0.999886 0.9868505 -0.9868506 0.999886 0.9868505 -0.9868507 0.999886 0.9868505 -0.9868508 0.999886 0.9868505 -0.9868508 0.999886 0.9868505 -0.986851 0.999886 0.9868505 -0.9868511 0.999886 0.9868505 -0.9868513 0.999886 0.9868505 -0.9868515 0.999886 0.9868505 -0.9868518 0.999886 0.9868505 -0.9868521 0.999886 0.9868505 -0.9868526 0.999886 0.9868505 -0.9868532 0.999886 0.9868505 -0.9868539 0.999886 0.9868505 -0.9868548 0.999886 0.9868505 -0.986856 0.999886 0.9868505 -0.9868575 0.999886 0.9868505 -0.9868593 0.999886 0.9868505 -0.9868617 0.999886 0.9868505 -0.9868647 0.999886 0.9868505 -0.9868684 0.999886 0.9868505 -0.9868732 0.999886 0.9868505 -0.9868792 0.999886 0.9868505 -0.9868869 0.999886 0.9868505 -0.9868965 0.999886 0.9868505 -0.9869088 0.999886 0.9868505 -0.9869242 0.999886 0.9868505 -0.9869438 0.999886 0.9868505 -0.9869686 0.999886 0.9868505 -0.9869999 0.999886 0.9868505 -0.9870395 0.999886 0.9868505 -0.9870897 0.999886 0.9868505 -0.9871531 0.999886 0.9868505 -0.9872333 0.999886 0.9868505 -0.9873349 0.999886 0.9868505 -0.9874633 0.999886 0.9868505 -0.9876258 0.999886 0.9868505 -0.9878314 0.999886 0.9868505 -0.9880914 0.999886 0.9868505 -0.9884205 0.999886 0.9868505 -0.9888367 0.999886 0.9868505 -0.9893634 0.999886 0.9868505 -0.9900296 0.999886 0.9868505 -0.9908725 0.999886 0.9868505 -0.9919389 0.999886 0.9868505 -0.993288 0.999886 0.9868505 -0.9949948 0.999886 0.9868505 -0.9971542 0.999886 0.9868505 -0.999886 0.999886 0.9868505 -0.9999099 0.9977455 0.989582 -0.9999288 0.99686 0.9917501 -0.9999437 0.9966668 0.9934695 -0.989582 0.9999099 0.989582 -0.989582 0.9999099 0.989582 -0.989582 0.9999099 0.989582 -0.989582 0.9999099 0.989582 -0.989582 0.9999099 0.989582 -0.9895821 0.9999099 0.989582 -0.9895821 0.9999099 0.989582 -0.9895821 0.9999099 0.989582 -0.9895822 0.9999099 0.989582 -0.9895822 0.9999099 0.989582 -0.9895823 0.9999099 0.989582 -0.9895824 0.9999099 0.989582 -0.9895825 0.9999099 0.989582 -0.9895826 0.9999099 0.989582 -0.9895828 0.9999099 0.989582 -0.989583 0.9999099 0.989582 -0.9895833 0.9999099 0.989582 -0.9895837 0.9999099 0.989582 -0.9895841 0.9999099 0.989582 -0.9895847 0.9999099 0.989582 -0.9895854 0.9999099 0.989582 -0.9895864 0.9999099 0.989582 -0.9895875 0.9999099 0.989582 -0.989589 0.9999099 0.989582 -0.9895909 0.9999099 0.989582 -0.9895932 0.9999099 0.989582 -0.9895962 0.9999099 0.989582 -0.9896 0.9999099 0.989582 -0.9896048 0.9999099 0.989582 -0.9896108 0.9999099 0.989582 -0.9896185 0.9999099 0.989582 -0.9896282 0.9999099 0.989582 -0.9896404 0.9999099 0.989582 -0.9896559 0.9999099 0.989582 -0.9896756 0.9999099 0.989582 -0.9897004 0.9999099 0.989582 -0.9897318 0.9999099 0.989582 -0.9897715 0.9999099 0.989582 -0.9898218 0.9999099 0.989582 -0.9898853 0.9999099 0.989582 -0.9899658 0.9999099 0.989582 -0.9900675 0.9999099 0.989582 -0.9901963 0.9999099 0.989582 -0.9903591 0.9999099 0.989582 -0.9905652 0.9999099 0.989582 -0.9908259 0.9999099 0.989582 -0.9911557 0.9999099 0.989582 -0.9915729 0.9999099 0.989582 -0.9921008 0.9999099 0.989582 -0.9927686 0.9999099 0.989582 -0.9936135 0.9999099 0.989582 -0.9946824 0.9999099 0.989582 -0.9960347 0.9999099 0.989582 -0.9977455 0.9999099 0.989582 -0.9999099 0.9999099 0.989582 -0.9999288 0.9982148 0.9917501 -0.9999437 0.9975145 0.9934695 -0.9917501 0.9999288 0.9917501 -0.9917501 0.9999288 0.9917501 -0.9917501 0.9999288 0.9917501 -0.9917501 0.9999288 0.9917501 -0.9917501 0.9999288 0.9917501 -0.9917501 0.9999288 0.9917501 -0.9917501 0.9999288 0.9917501 -0.9917502 0.9999288 0.9917501 -0.9917502 0.9999288 0.9917501 -0.9917502 0.9999288 0.9917501 -0.9917503 0.9999288 0.9917501 -0.9917503 0.9999288 0.9917501 -0.9917504 0.9999288 0.9917501 -0.9917505 0.9999288 0.9917501 -0.9917506 0.9999288 0.9917501 -0.9917507 0.9999288 0.9917501 -0.9917509 0.9999288 0.9917501 -0.9917511 0.9999288 0.9917501 -0.9917514 0.9999288 0.9917501 -0.9917518 0.9999288 0.9917501 -0.9917522 0.9999288 0.9917501 -0.9917528 0.9999288 0.9917501 -0.9917535 0.9999288 0.9917501 -0.9917545 0.9999288 0.9917501 -0.9917556 0.9999288 0.9917501 -0.9917571 0.9999288 0.9917501 -0.991759 0.9999288 0.9917501 -0.9917614 0.9999288 0.9917501 -0.9917644 0.9999288 0.9917501 -0.9917681 0.9999288 0.9917501 -0.9917729 0.9999288 0.9917501 -0.991779 0.9999288 0.9917501 -0.9917867 0.9999288 0.9917501 -0.9917964 0.9999288 0.9917501 -0.9918087 0.9999288 0.9917501 -0.9918242 0.9999288 0.9917501 -0.9918438 0.9999288 0.9917501 -0.9918687 0.9999288 0.9917501 -0.9919002 0.9999288 0.9917501 -0.99194 0.9999288 0.9917501 -0.9919903 0.9999288 0.9917501 -0.992054 0.9999288 0.9917501 -0.9921346 0.9999288 0.9917501 -0.9922365 0.9999288 0.9917501 -0.9923655 0.9999288 0.9917501 -0.9925287 0.9999288 0.9917501 -0.9927351 0.9999288 0.9917501 -0.9929963 0.9999288 0.9917501 -0.9933267 0.9999288 0.9917501 -0.9937448 0.9999288 0.9917501 -0.9942736 0.9999288 0.9917501 -0.9949427 0.9999288 0.9917501 -0.9957891 0.9999288 0.9917501 -0.99686 0.9999288 0.9917501 -0.9982148 0.9999288 0.9917501 -0.9999288 0.9999288 0.9917501 -0.9999437 0.9985869 0.9934695 -0.9934695 0.9999437 0.9934695 -0.9934695 0.9999437 0.9934695 -0.9934695 0.9999437 0.9934695 -0.9934695 0.9999437 0.9934695 -0.9934695 0.9999437 0.9934695 -0.9934695 0.9999437 0.9934695 -0.9934695 0.9999437 0.9934695 -0.9934695 0.9999437 0.9934695 -0.9934695 0.9999437 0.9934695 -0.9934696 0.9999437 0.9934695 -0.9934696 0.9999437 0.9934695 -0.9934696 0.9999437 0.9934695 -0.9934697 0.9999437 0.9934695 -0.9934697 0.9999437 0.9934695 -0.9934698 0.9999437 0.9934695 -0.9934699 0.9999437 0.9934695 -0.99347 0.9999437 0.9934695 -0.9934701 0.9999437 0.9934695 -0.9934703 0.9999437 0.9934695 -0.9934705 0.9999437 0.9934695 -0.9934708 0.9999437 0.9934695 -0.9934712 0.9999437 0.9934695 -0.9934716 0.9999437 0.9934695 -0.9934722 0.9999437 0.9934695 -0.993473 0.9999437 0.9934695 -0.9934739 0.9999437 0.9934695 -0.9934751 0.9999437 0.9934695 -0.9934765 0.9999437 0.9934695 -0.9934784 0.9999437 0.9934695 -0.9934808 0.9999437 0.9934695 -0.9934838 0.9999437 0.9934695 -0.9934876 0.9999437 0.9934695 -0.9934924 0.9999437 0.9934695 -0.9934984 0.9999437 0.9934695 -0.9935061 0.9999437 0.9934695 -0.9935159 0.9999437 0.9934695 -0.9935281 0.9999437 0.9934695 -0.9935437 0.9999437 0.9934695 -0.9935634 0.9999437 0.9934695 -0.9935883 0.9999437 0.9934695 -0.9936198 0.9999437 0.9934695 -0.9936596 0.9999437 0.9934695 -0.9937101 0.9999437 0.9934695 -0.9937739 0.9999437 0.9934695 -0.9938546 0.9999437 0.9934695 -0.9939567 0.9999437 0.9934695 -0.9940858 0.9999437 0.9934695 -0.9942492 0.9999437 0.9934695 -0.994456 0.9999437 0.9934695 -0.9947176 0.9999437 0.9934695 -0.9950485 0.9999437 0.9934695 -0.9954671 0.9999437 0.9934695 -0.9959967 0.9999437 0.9934695 -0.9966668 0.9999437 0.9934695 -0.9975145 0.9999437 0.9934695 -0.9985869 0.9999437 0.9934695 -0.9999437 0.9999437 0.9934695 -0.0000238 0.0000238 0.0011968 -0.0005417 0.0000238 0.0011968 -0.0011968 0.0000238 0.0011968 -0.0020256 0.0000238 0.0011968 -0.0030742 0.0000238 0.0011968 -0.0044007 0.0000238 0.0011968 -0.006079 0.0000238 0.0011968 -0.0082023 0.0000238 0.0011968 -0.0108885 0.0000238 0.0011968 -0.0142868 0.0000238 0.0011968 -0.0185862 0.0000238 0.0011968 -0.0240255 0.0000238 0.0011968 -0.0309069 0.0000238 0.0011968 -0.0396127 0.0000238 0.0011968 -0.0506267 0.0000238 0.0011968 -0.0645609 0.0000238 0.0011968 -0.0821895 0.0000238 0.0011968 -0.1044919 0.0000238 0.0011968 -0.1327073 0.0000238 0.0011968 -0.1684036 0.0000238 0.0011968 -0.2135639 0.0000238 0.0011968 -0.2706977 0.0000238 0.0011968 -0.3429792 0.0000238 0.0011968 -0.4344249 0.0000238 0.0011968 -0.5501155 0.0000238 0.0011968 -0.6964791 0.0000238 0.0011968 -0.8407292 0.0051514 0.0062631 -0.9033413 0.0279321 0.0288523 -0.9354466 0.0624569 0.063182 -0.9545467 0.1059991 0.106556 -0.9669269 0.1572498 0.1576697 -0.9754027 0.2151269 0.2154385 -0.9814251 0.2783684 0.2785962 -0.9858181 0.3454107 0.3455746 -0.9890841 0.4144197 0.414536 -0.9915469 0.4834235 0.4835047 -0.993424 0.5504963 0.5505523 -0.9948662 0.6139459 0.6139839 -0.9959813 0.6724572 0.6724827 -0.9968475 0.7251659 0.7251829 -0.997523 0.7716588 0.77167 -0.9980513 0.8119154 0.8119226 -0.9984653 0.8462171 0.8462218 -0.9987905 0.8750477 0.8750507 -0.9990461 0.8990028 0.8990047 -0.9992474 0.9187175 0.9187187 -0.999406 0.9348153 0.934816 -0.999531 0.9478754 0.9478759 -0.9996296 0.958416 0.9584163 -0.9997074 0.9668873 0.9668875 -0.9997689 0.9736726 0.9736727 -0.9998174 0.9790927 0.9790928 -0.9998557 0.9834129 0.983413 -0.999886 0.9868505 0.9868505 -0.9999099 0.989582 0.989582 -0.9999288 0.9917501 0.9917501 -0.9999437 0.9934695 0.9934695 -0.0000238 0.0005417 0.0011968 -0.0000382 0.0000382 0.0006933 -0.0006933 0.0000382 0.0006933 -0.0015221 0.0000382 0.0006933 -0.0025707 0.0000382 0.0006933 -0.0038972 0.0000382 0.0006933 -0.0055755 0.0000382 0.0006933 -0.0076988 0.0000382 0.0006933 -0.0103849 0.0000382 0.0006933 -0.0137833 0.0000382 0.0006933 -0.0180827 0.0000382 0.0006933 -0.023522 0.0000382 0.0006933 -0.0304033 0.0000382 0.0006933 -0.0391092 0.0000382 0.0006933 -0.0501232 0.0000382 0.0006933 -0.0640574 0.0000382 0.0006933 -0.081686 0.0000382 0.0006933 -0.1039884 0.0000382 0.0006933 -0.1322038 0.0000382 0.0006933 -0.1679 0.0000382 0.0006933 -0.2130604 0.0000382 0.0006933 -0.2701941 0.0000382 0.0006933 -0.3424757 0.0000382 0.0006933 -0.4339214 0.0000382 0.0006933 -0.549612 0.0000382 0.0006933 -0.6959756 0.0000382 0.0006933 -0.8405071 0.0051286 0.0057497 -0.9032596 0.0278872 0.0284013 -0.9354101 0.0624063 0.0628114 -0.9545286 0.1059489 0.1062601 -0.9669173 0.1572031 0.1574377 -0.9753975 0.2150852 0.2152593 -0.9814221 0.2783325 0.2784598 -0.9858163 0.3453807 0.3454723 -0.9890831 0.4143955 0.4144605 -0.9915463 0.4834045 0.4834499 -0.9934236 0.5504818 0.5505131 -0.994866 0.6139352 0.6139564 -0.9959811 0.6724495 0.6724637 -0.9968474 0.7251605 0.72517 -0.997523 0.7716551 0.7716613 -0.9980512 0.8119128 0.8119169 -0.9984653 0.8462154 0.846218 -0.9987905 0.8750466 0.8750482 -0.9990461 0.899002 0.8990031 -0.9992474 0.918717 0.9187177 -0.999406 0.9348149 0.9348154 -0.999531 0.9478752 0.9478755 -0.9996296 0.9584159 0.958416 -0.9997074 0.9668872 0.9668874 -0.9997689 0.9736726 0.9736726 -0.9998174 0.9790927 0.9790927 -0.9998557 0.9834129 0.9834129 -0.999886 0.9868505 0.9868505 -0.9999099 0.989582 0.989582 -0.9999288 0.9917501 0.9917501 -0.9999437 0.9934695 0.9934695 -0.0000238 0.0011968 0.0011968 -0.0000382 0.0006933 0.0006933 -0.0000611 0.0000611 0.0000611 -0.0008899 0.0000611 0.0000611 -0.0019385 0.0000611 0.0000611 -0.003265 0.0000611 0.0000611 -0.0049433 0.0000611 0.0000611 -0.0070666 0.0000611 0.0000611 -0.0097527 0.0000611 0.0000611 -0.0131511 0.0000611 0.0000611 -0.0174505 0.0000611 0.0000611 -0.0228898 0.0000611 0.0000611 -0.0297711 0.0000611 0.0000611 -0.038477 0.0000611 0.0000611 -0.049491 0.0000611 0.0000611 -0.0634252 0.0000611 0.0000611 -0.0810538 0.0000611 0.0000611 -0.1033562 0.0000611 0.0000611 -0.1315716 0.0000611 0.0000611 -0.1672678 0.0000611 0.0000611 -0.2124282 0.0000611 0.0000611 -0.2695619 0.0000611 0.0000611 -0.3418435 0.0000611 0.0000611 -0.4332891 0.0000611 0.0000611 -0.5489798 0.0000611 0.0000611 -0.6953434 0.0000611 0.0000611 -0.8402274 0.0051047 0.0051047 -0.9031567 0.0278347 0.0278347 -0.9353643 0.0623458 0.0623458 -0.9545059 0.1058883 0.1058883 -0.9669053 0.1571463 0.1571463 -0.9753908 0.2150342 0.2150342 -0.9814183 0.2782884 0.2782884 -0.9858141 0.3453439 0.3453439 -0.9890818 0.4143657 0.4143657 -0.9915455 0.4833811 0.4833811 -0.9934231 0.550464 0.550464 -0.9948657 0.6139219 0.6139219 -0.9959809 0.6724399 0.6724399 -0.9968473 0.7251537 0.7251537 -0.9975229 0.7716504 0.7716504 -0.9980512 0.8119096 0.8119096 -0.9984653 0.8462132 0.8462132 -0.9987904 0.8750451 0.8750451 -0.9990461 0.8990011 0.8990011 -0.9992474 0.9187164 0.9187164 -0.999406 0.9348146 0.9348146 -0.999531 0.947875 0.947875 -0.9996296 0.9584157 0.9584157 -0.9997074 0.9668871 0.9668871 -0.9997689 0.9736725 0.9736725 -0.9998174 0.9790927 0.9790927 -0.9998557 0.9834129 0.9834129 -0.999886 0.9868505 0.9868505 -0.9999099 0.989582 0.989582 -0.9999288 0.9917501 0.9917501 -0.9999437 0.9934695 0.9934695 -0.0000238 0.0020256 0.0011968 -0.0000382 0.0015221 0.0006933 -0.0000611 0.0008899 0.0000611 -0.0008899 0.0008899 0.0000611 -0.0019385 0.0008899 0.0000611 -0.003265 0.0008899 0.0000611 -0.0049433 0.0008899 0.0000611 -0.0070666 0.0008899 0.0000611 -0.0097527 0.0008899 0.0000611 -0.0131511 0.0008899 0.0000611 -0.0174505 0.0008899 0.0000611 -0.0228898 0.0008899 0.0000611 -0.0297711 0.0008899 0.0000611 -0.038477 0.0008899 0.0000611 -0.049491 0.0008899 0.0000611 -0.0634252 0.0008899 0.0000611 -0.0810538 0.0008899 0.0000611 -0.1033562 0.0008899 0.0000611 -0.1315716 0.0008899 0.0000611 -0.1672678 0.0008899 0.0000611 -0.2124282 0.0008899 0.0000611 -0.2695619 0.0008899 0.0000611 -0.3418435 0.0008899 0.0000611 -0.4332891 0.0008899 0.0000611 -0.5489798 0.0008899 0.0000611 -0.6953434 0.0008899 0.0000611 -0.8402274 0.0058909 0.0051047 -0.9031567 0.0284855 0.0278347 -0.9353643 0.0628585 0.0623458 -0.9545059 0.1062821 0.1058883 -0.9669053 0.1574432 0.1571463 -0.9753908 0.2152545 0.2150342 -0.9814183 0.2784494 0.2782884 -0.9858141 0.3454598 0.3453439 -0.9890818 0.4144479 0.4143657 -0.9915455 0.4834385 0.4833811 -0.9934231 0.5505035 0.550464 -0.9948657 0.6139488 0.6139219 -0.9959809 0.6724579 0.6724399 -0.9968473 0.7251657 0.7251537 -0.9975229 0.7716583 0.7716504 -0.9980512 0.8119148 0.8119096 -0.9984653 0.8462165 0.8462132 -0.9987904 0.8750473 0.8750451 -0.9990461 0.8990025 0.8990011 -0.9992474 0.9187173 0.9187164 -0.999406 0.9348151 0.9348146 -0.999531 0.9478753 0.947875 -0.9996296 0.9584159 0.9584157 -0.9997074 0.9668873 0.9668871 -0.9997689 0.9736726 0.9736725 -0.9998174 0.9790927 0.9790927 -0.9998557 0.9834129 0.9834129 -0.999886 0.9868505 0.9868505 -0.9999099 0.989582 0.989582 -0.9999288 0.9917501 0.9917501 -0.9999437 0.9934695 0.9934695 -0.0000238 0.0030742 0.0011968 -0.0000382 0.0025707 0.0006933 -0.0000611 0.0019385 0.0000611 -0.0008899 0.0019385 0.0000611 -0.0019385 0.0019385 0.0000611 -0.003265 0.0019385 0.0000611 -0.0049433 0.0019385 0.0000611 -0.0070666 0.0019385 0.0000611 -0.0097527 0.0019385 0.0000611 -0.0131511 0.0019385 0.0000611 -0.0174505 0.0019385 0.0000611 -0.0228898 0.0019385 0.0000611 -0.0297711 0.0019385 0.0000611 -0.038477 0.0019385 0.0000611 -0.049491 0.0019385 0.0000611 -0.0634252 0.0019385 0.0000611 -0.0810538 0.0019385 0.0000611 -0.1033562 0.0019385 0.0000611 -0.1315716 0.0019385 0.0000611 -0.1672678 0.0019385 0.0000611 -0.2124282 0.0019385 0.0000611 -0.2695619 0.0019385 0.0000611 -0.3418435 0.0019385 0.0000611 -0.4332891 0.0019385 0.0000611 -0.5489798 0.0019385 0.0000611 -0.6953434 0.0019385 0.0000611 -0.8402274 0.0068855 0.0051047 -0.9031567 0.0293089 0.0278347 -0.9353643 0.0635073 0.0623458 -0.9545059 0.1067803 0.1058883 -0.9669053 0.1578188 0.1571463 -0.9753908 0.2155333 0.2150342 -0.9814183 0.2786531 0.2782884 -0.9858141 0.3456064 0.3453439 -0.9890818 0.4145518 0.4143657 -0.9915455 0.4835112 0.4833811 -0.9934231 0.5505536 0.550464 -0.9948657 0.6139828 0.6139219 -0.9959809 0.6724808 0.6724399 -0.9968473 0.7251809 0.7251537 -0.9975229 0.7716682 0.7716504 -0.9980512 0.8119213 0.8119096 -0.9984653 0.8462207 0.8462132 -0.9987904 0.87505 0.8750451 -0.9990461 0.8990042 0.8990011 -0.9992474 0.9187184 0.9187164 -0.999406 0.9348158 0.9348146 -0.999531 0.9478757 0.947875 -0.9996296 0.9584162 0.9584157 -0.9997074 0.9668875 0.9668871 -0.9997689 0.9736727 0.9736725 -0.9998174 0.9790928 0.9790927 -0.9998557 0.983413 0.9834129 -0.999886 0.9868505 0.9868505 -0.9999099 0.989582 0.989582 -0.9999288 0.9917501 0.9917501 -0.9999437 0.9934695 0.9934695 -0.0000238 0.0044007 0.0011968 -0.0000382 0.0038972 0.0006933 -0.0000611 0.003265 0.0000611 -0.0008899 0.003265 0.0000611 -0.0019385 0.003265 0.0000611 -0.003265 0.003265 0.0000611 -0.0049433 0.003265 0.0000611 -0.0070666 0.003265 0.0000611 -0.0097527 0.003265 0.0000611 -0.0131511 0.003265 0.0000611 -0.0174505 0.003265 0.0000611 -0.0228898 0.003265 0.0000611 -0.0297711 0.003265 0.0000611 -0.038477 0.003265 0.0000611 -0.049491 0.003265 0.0000611 -0.0634252 0.003265 0.0000611 -0.0810538 0.003265 0.0000611 -0.1033562 0.003265 0.0000611 -0.1315716 0.003265 0.0000611 -0.1672678 0.003265 0.0000611 -0.2124282 0.003265 0.0000611 -0.2695619 0.003265 0.0000611 -0.3418435 0.003265 0.0000611 -0.4332891 0.003265 0.0000611 -0.5489798 0.003265 0.0000611 -0.6953434 0.003265 0.0000611 -0.8402274 0.0081437 0.0051047 -0.9031567 0.0303505 0.0278347 -0.9353643 0.064328 0.0623458 -0.9545059 0.1074107 0.1058883 -0.9669053 0.1582941 0.1571463 -0.9753908 0.2158859 0.2150342 -0.9814183 0.2789108 0.2782884 -0.9858141 0.3457919 0.3453439 -0.9890818 0.4146834 0.4143657 -0.9915455 0.4836031 0.4833811 -0.9934231 0.5506169 0.550464 -0.9948657 0.6140259 0.6139219 -0.9959809 0.6725097 0.6724399 -0.9968473 0.7252001 0.7251537 -0.9975229 0.7716808 0.7716504 -0.9980512 0.8119295 0.8119096 -0.9984653 0.846226 0.8462132 -0.9987904 0.8750534 0.8750451 -0.9990461 0.8990064 0.8990011 -0.9992474 0.9187198 0.9187164 -0.999406 0.9348167 0.9348146 -0.999531 0.9478763 0.947875 -0.9996296 0.9584165 0.9584157 -0.9997074 0.9668877 0.9668871 -0.9997689 0.9736728 0.9736725 -0.9998174 0.9790929 0.9790927 -0.9998557 0.983413 0.9834129 -0.999886 0.9868506 0.9868505 -0.9999099 0.989582 0.989582 -0.9999288 0.9917501 0.9917501 -0.9999437 0.9934695 0.9934695 -0.0000238 0.006079 0.0011968 -0.0000382 0.0055755 0.0006933 -0.0000611 0.0049433 0.0000611 -0.0008899 0.0049433 0.0000611 -0.0019385 0.0049433 0.0000611 -0.003265 0.0049433 0.0000611 -0.0049433 0.0049433 0.0000611 -0.0070666 0.0049433 0.0000611 -0.0097527 0.0049433 0.0000611 -0.0131511 0.0049433 0.0000611 -0.0174505 0.0049433 0.0000611 -0.0228898 0.0049433 0.0000611 -0.0297711 0.0049433 0.0000611 -0.038477 0.0049433 0.0000611 -0.049491 0.0049433 0.0000611 -0.0634252 0.0049433 0.0000611 -0.0810538 0.0049433 0.0000611 -0.1033562 0.0049433 0.0000611 -0.1315716 0.0049433 0.0000611 -0.1672678 0.0049433 0.0000611 -0.2124282 0.0049433 0.0000611 -0.2695619 0.0049433 0.0000611 -0.3418435 0.0049433 0.0000611 -0.4332891 0.0049433 0.0000611 -0.5489798 0.0049433 0.0000611 -0.6953434 0.0049433 0.0000611 -0.8402274 0.0097356 0.0051047 -0.9031567 0.0316684 0.0278347 -0.9353643 0.0653663 0.0623458 -0.9545059 0.1082081 0.1058883 -0.9669053 0.1588953 0.1571463 -0.9753908 0.216332 0.2150342 -0.9814183 0.2792368 0.2782884 -0.9858141 0.3460265 0.3453439 -0.9890818 0.4148498 0.4143657 -0.9915455 0.4837194 0.4833811 -0.9934231 0.5506971 0.550464 -0.9948657 0.6140804 0.6139219 -0.9959809 0.6725462 0.6724399 -0.9968473 0.7252243 0.7251537 -0.9975229 0.7716968 0.7716504 -0.9980512 0.8119399 0.8119096 -0.9984653 0.8462328 0.8462132 -0.9987904 0.8750577 0.8750451 -0.9990461 0.8990091 0.8990011 -0.9992474 0.9187215 0.9187164 -0.999406 0.9348178 0.9348146 -0.999531 0.947877 0.947875 -0.9996296 0.958417 0.9584157 -0.9997074 0.966888 0.9668871 -0.9997689 0.973673 0.9736725 -0.9998174 0.979093 0.9790927 -0.9998557 0.9834131 0.9834129 -0.999886 0.9868506 0.9868505 -0.9999099 0.9895821 0.989582 -0.9999288 0.9917501 0.9917501 -0.9999437 0.9934695 0.9934695 -0.0000238 0.0082023 0.0011968 -0.0000382 0.0076988 0.0006933 -0.0000611 0.0070666 0.0000611 -0.0008899 0.0070666 0.0000611 -0.0019385 0.0070666 0.0000611 -0.003265 0.0070666 0.0000611 -0.0049433 0.0070666 0.0000611 -0.0070666 0.0070666 0.0000611 -0.0097527 0.0070666 0.0000611 -0.0131511 0.0070666 0.0000611 -0.0174505 0.0070666 0.0000611 -0.0228898 0.0070666 0.0000611 -0.0297711 0.0070666 0.0000611 -0.038477 0.0070666 0.0000611 -0.049491 0.0070666 0.0000611 -0.0634252 0.0070666 0.0000611 -0.0810538 0.0070666 0.0000611 -0.1033562 0.0070666 0.0000611 -0.1315716 0.0070666 0.0000611 -0.1672678 0.0070666 0.0000611 -0.2124282 0.0070666 0.0000611 -0.2695619 0.0070666 0.0000611 -0.3418435 0.0070666 0.0000611 -0.4332891 0.0070666 0.0000611 -0.5489798 0.0070666 0.0000611 -0.6953434 0.0070666 0.0000611 -0.8402274 0.0117495 0.0051047 -0.9031567 0.0333357 0.0278347 -0.9353643 0.0666799 0.0623458 -0.9545059 0.1092169 0.1058883 -0.9669053 0.1596559 0.1571463 -0.9753908 0.2168964 0.2150342 -0.9814183 0.2796492 0.2782884 -0.9858141 0.3463234 0.3453439 -0.9890818 0.4150604 0.4143657 -0.9915455 0.4838665 0.4833811 -0.9934231 0.5507984 0.550464 -0.9948657 0.6141493 0.6139219 -0.9959809 0.6725925 0.6724399 -0.9968473 0.725255 0.7251537 -0.9975229 0.7717169 0.7716504 -0.9980512 0.811953 0.8119096 -0.9984653 0.8462413 0.8462132 -0.9987904 0.8750631 0.8750451 -0.9990461 0.8990126 0.8990011 -0.9992474 0.9187237 0.9187164 -0.999406 0.9348192 0.9348146 -0.999531 0.9478779 0.947875 -0.9996296 0.9584176 0.9584157 -0.9997074 0.9668883 0.9668871 -0.9997689 0.9736732 0.9736725 -0.9998174 0.9790931 0.9790927 -0.9998557 0.9834132 0.9834129 -0.999886 0.9868507 0.9868505 -0.9999099 0.9895821 0.989582 -0.9999288 0.9917502 0.9917501 -0.9999437 0.9934695 0.9934695 -0.0000238 0.0108885 0.0011968 -0.0000382 0.0103849 0.0006933 -0.0000611 0.0097527 0.0000611 -0.0008899 0.0097527 0.0000611 -0.0019385 0.0097527 0.0000611 -0.003265 0.0097527 0.0000611 -0.0049433 0.0097527 0.0000611 -0.0070666 0.0097527 0.0000611 -0.0097527 0.0097527 0.0000611 -0.0131511 0.0097527 0.0000611 -0.0174505 0.0097527 0.0000611 -0.0228898 0.0097527 0.0000611 -0.0297711 0.0097527 0.0000611 -0.038477 0.0097527 0.0000611 -0.049491 0.0097527 0.0000611 -0.0634252 0.0097527 0.0000611 -0.0810538 0.0097527 0.0000611 -0.1033562 0.0097527 0.0000611 -0.1315716 0.0097527 0.0000611 -0.1672678 0.0097527 0.0000611 -0.2124282 0.0097527 0.0000611 -0.2695619 0.0097527 0.0000611 -0.3418435 0.0097527 0.0000611 -0.4332891 0.0097527 0.0000611 -0.5489798 0.0097527 0.0000611 -0.6953434 0.0097527 0.0000611 -0.8402274 0.0142974 0.0051047 -0.9031567 0.035445 0.0278347 -0.9353643 0.0683418 0.0623458 -0.9545059 0.1104932 0.1058883 -0.9669053 0.1606182 0.1571463 -0.9753908 0.2176104 0.2150342 -0.9814183 0.280171 0.2782884 -0.9858141 0.3466991 0.3453439 -0.9890818 0.4153268 0.4143657 -0.9915455 0.4840527 0.4833811 -0.9934231 0.5509267 0.550464 -0.9948657 0.6142364 0.6139219 -0.9959809 0.672651 0.6724399 -0.9968473 0.7252939 0.7251537 -0.9975229 0.7717425 0.7716504 -0.9980512 0.8119696 0.8119096 -0.9984653 0.846252 0.8462132 -0.9987904 0.8750701 0.8750451 -0.9990461 0.899017 0.8990011 -0.9992474 0.9187266 0.9187164 -0.999406 0.934821 0.9348146 -0.999531 0.947879 0.947875 -0.9996296 0.9584183 0.9584157 -0.9997074 0.9668888 0.9668871 -0.9997689 0.9736735 0.9736725 -0.9998174 0.9790933 0.9790927 -0.9998557 0.9834133 0.9834129 -0.999886 0.9868507 0.9868505 -0.9999099 0.9895821 0.989582 -0.9999288 0.9917502 0.9917501 -0.9999437 0.9934695 0.9934695 -0.0000238 0.0142868 0.0011968 -0.0000382 0.0137833 0.0006933 -0.0000611 0.0131511 0.0000611 -0.0008899 0.0131511 0.0000611 -0.0019385 0.0131511 0.0000611 -0.003265 0.0131511 0.0000611 -0.0049433 0.0131511 0.0000611 -0.0070666 0.0131511 0.0000611 -0.0097527 0.0131511 0.0000611 -0.0131511 0.0131511 0.0000611 -0.0174505 0.0131511 0.0000611 -0.0228898 0.0131511 0.0000611 -0.0297711 0.0131511 0.0000611 -0.038477 0.0131511 0.0000611 -0.049491 0.0131511 0.0000611 -0.0634252 0.0131511 0.0000611 -0.0810538 0.0131511 0.0000611 -0.1033562 0.0131511 0.0000611 -0.1315716 0.0131511 0.0000611 -0.1672678 0.0131511 0.0000611 -0.2124282 0.0131511 0.0000611 -0.2695619 0.0131511 0.0000611 -0.3418435 0.0131511 0.0000611 -0.4332891 0.0131511 0.0000611 -0.5489798 0.0131511 0.0000611 -0.6953434 0.0131511 0.0000611 -0.8402274 0.0175208 0.0051047 -0.9031567 0.0381135 0.0278347 -0.9353643 0.0704444 0.0623458 -0.9545059 0.1121079 0.1058883 -0.9669053 0.1618356 0.1571463 -0.9753908 0.2185137 0.2150342 -0.9814183 0.2808311 0.2782884 -0.9858141 0.3471743 0.3453439 -0.9890818 0.4156638 0.4143657 -0.9915455 0.4842882 0.4833811 -0.9934231 0.5510889 0.550464 -0.9948657 0.6143467 0.6139219 -0.9959809 0.672725 0.6724399 -0.9968473 0.725343 0.7251537 -0.9975229 0.7717748 0.7716504 -0.9980512 0.8119906 0.8119096 -0.9984653 0.8462656 0.8462132 -0.9987904 0.8750788 0.8750451 -0.9990461 0.8990226 0.8990011 -0.9992474 0.9187301 0.9187164 -0.999406 0.9348232 0.9348146 -0.999531 0.9478804 0.947875 -0.9996296 0.9584192 0.9584157 -0.9997074 0.9668893 0.9668871 -0.9997689 0.9736739 0.9736725 -0.9998174 0.9790935 0.9790927 -0.9998557 0.9834134 0.9834129 -0.999886 0.9868508 0.9868505 -0.9999099 0.9895822 0.989582 -0.9999288 0.9917502 0.9917501 -0.9999437 0.9934696 0.9934695 -0.0000238 0.0185862 0.0011968 -0.0000382 0.0180827 0.0006933 -0.0000611 0.0174505 0.0000611 -0.0008899 0.0174505 0.0000611 -0.0019385 0.0174505 0.0000611 -0.003265 0.0174505 0.0000611 -0.0049433 0.0174505 0.0000611 -0.0070666 0.0174505 0.0000611 -0.0097527 0.0174505 0.0000611 -0.0131511 0.0174505 0.0000611 -0.0174505 0.0174505 0.0000611 -0.0228898 0.0174505 0.0000611 -0.0297711 0.0174505 0.0000611 -0.038477 0.0174505 0.0000611 -0.049491 0.0174505 0.0000611 -0.0634252 0.0174505 0.0000611 -0.0810538 0.0174505 0.0000611 -0.1033562 0.0174505 0.0000611 -0.1315716 0.0174505 0.0000611 -0.1672678 0.0174505 0.0000611 -0.2124282 0.0174505 0.0000611 -0.2695619 0.0174505 0.0000611 -0.3418435 0.0174505 0.0000611 -0.4332891 0.0174505 0.0000611 -0.5489798 0.0174505 0.0000611 -0.6953434 0.0174505 0.0000611 -0.8402274 0.0215989 0.0051047 -0.9031567 0.0414896 0.0278347 -0.9353643 0.0731043 0.0623458 -0.9545059 0.1141507 0.1058883 -0.9669053 0.1633758 0.1571463 -0.9753908 0.2196565 0.2150342 -0.9814183 0.2816663 0.2782884 -0.9858141 0.3477754 0.3453439 -0.9890818 0.4160901 0.4143657 -0.9915455 0.4845861 0.4833811 -0.9934231 0.5512942 0.550464 -0.9948657 0.6144862 0.6139219 -0.9959809 0.6728187 0.6724399 -0.9968473 0.7254052 0.7251537 -0.9975229 0.7718156 0.7716504 -0.9980512 0.8120173 0.8119096 -0.9984653 0.8462828 0.8462132 -0.9987904 0.8750898 0.8750451 -0.9990461 0.8990297 0.8990011 -0.9992474 0.9187346 0.9187164 -0.999406 0.9348261 0.9348146 -0.999531 0.9478822 0.947875 -0.9996296 0.9584203 0.9584157 -0.9997074 0.96689 0.9668871 -0.9997689 0.9736743 0.9736725 -0.9998174 0.9790938 0.9790927 -0.9998557 0.9834136 0.9834129 -0.999886 0.9868509 0.9868505 -0.9999099 0.9895823 0.989582 -0.9999288 0.9917503 0.9917501 -0.9999437 0.9934696 0.9934695 -0.0000238 0.0240255 0.0011968 -0.0000382 0.023522 0.0006933 -0.0000611 0.0228898 0.0000611 -0.0008899 0.0228898 0.0000611 -0.0019385 0.0228898 0.0000611 -0.003265 0.0228898 0.0000611 -0.0049433 0.0228898 0.0000611 -0.0070666 0.0228898 0.0000611 -0.0097527 0.0228898 0.0000611 -0.0131511 0.0228898 0.0000611 -0.0174505 0.0228898 0.0000611 -0.0228898 0.0228898 0.0000611 -0.0297711 0.0228898 0.0000611 -0.038477 0.0228898 0.0000611 -0.049491 0.0228898 0.0000611 -0.0634252 0.0228898 0.0000611 -0.0810538 0.0228898 0.0000611 -0.1033562 0.0228898 0.0000611 -0.1315716 0.0228898 0.0000611 -0.1672678 0.0228898 0.0000611 -0.2124282 0.0228898 0.0000611 -0.2695619 0.0228898 0.0000611 -0.3418435 0.0228898 0.0000611 -0.4332891 0.0228898 0.0000611 -0.5489798 0.0228898 0.0000611 -0.6953434 0.0228898 0.0000611 -0.8402274 0.0267581 0.0051047 -0.9031567 0.0457607 0.0278347 -0.9353643 0.0764695 0.0623458 -0.9545059 0.1167351 0.1058883 -0.9669053 0.1653244 0.1571463 -0.9753908 0.2211023 0.2150342 -0.9814183 0.2827228 0.2782884 -0.9858141 0.348536 0.3453439 -0.9890818 0.4166295 0.4143657 -0.9915455 0.4849631 0.4833811 -0.9934231 0.5515539 0.550464 -0.9948657 0.6146628 0.6139219 -0.9959809 0.6729372 0.6724399 -0.9968473 0.7254838 0.7251537 -0.9975229 0.7718673 0.7716504 -0.9980512 0.8120509 0.8119096 -0.9984653 0.8463046 0.8462132 -0.9987904 0.8751038 0.8750451 -0.9990461 0.8990386 0.8990011 -0.9992474 0.9187403 0.9187164 -0.999406 0.9348297 0.9348146 -0.999531 0.9478845 0.947875 -0.9996296 0.9584217 0.9584157 -0.9997074 0.9668909 0.9668871 -0.9997689 0.9736749 0.9736725 -0.9998174 0.9790942 0.9790927 -0.9998557 0.9834138 0.9834129 -0.999886 0.9868511 0.9868505 -0.9999099 0.9895824 0.989582 -0.9999288 0.9917503 0.9917501 -0.9999437 0.9934696 0.9934695 -0.0000238 0.0309069 0.0011968 -0.0000382 0.0304033 0.0006933 -0.0000611 0.0297711 0.0000611 -0.0008899 0.0297711 0.0000611 -0.0019385 0.0297711 0.0000611 -0.003265 0.0297711 0.0000611 -0.0049433 0.0297711 0.0000611 -0.0070666 0.0297711 0.0000611 -0.0097527 0.0297711 0.0000611 -0.0131511 0.0297711 0.0000611 -0.0174505 0.0297711 0.0000611 -0.0228898 0.0297711 0.0000611 -0.0297711 0.0297711 0.0000611 -0.038477 0.0297711 0.0000611 -0.049491 0.0297711 0.0000611 -0.0634252 0.0297711 0.0000611 -0.0810538 0.0297711 0.0000611 -0.1033562 0.0297711 0.0000611 -0.1315716 0.0297711 0.0000611 -0.1672678 0.0297711 0.0000611 -0.2124282 0.0297711 0.0000611 -0.2695619 0.0297711 0.0000611 -0.3418435 0.0297711 0.0000611 -0.4332891 0.0297711 0.0000611 -0.5489798 0.0297711 0.0000611 -0.6953434 0.0297711 0.0000611 -0.8402274 0.0332852 0.0051047 -0.9031567 0.0511643 0.0278347 -0.9353643 0.0807269 0.0623458 -0.9545059 0.1200048 0.1058883 -0.9669053 0.1677895 0.1571463 -0.9753908 0.2229315 0.2150342 -0.9814183 0.2840595 0.2782884 -0.9858141 0.3494983 0.3453439 -0.9890818 0.4173119 0.4143657 -0.9915455 0.4854399 0.4833811 -0.9934231 0.5518824 0.550464 -0.9948657 0.6148861 0.6139219 -0.9959809 0.6730871 0.6724399 -0.9968473 0.7255833 0.7251537 -0.9975229 0.7719327 0.7716504 -0.9980512 0.8120935 0.8119096 -0.9984653 0.8463321 0.8462132 -0.9987904 0.8751215 0.8750451 -0.9990461 0.8990499 0.8990011 -0.9992474 0.9187475 0.9187164 -0.999406 0.9348342 0.9348146 -0.999531 0.9478874 0.947875 -0.9996296 0.9584235 0.9584157 -0.9997074 0.9668921 0.9668871 -0.9997689 0.9736756 0.9736725 -0.9998174 0.9790946 0.9790927 -0.9998557 0.9834141 0.9834129 -0.999886 0.9868512 0.9868505 -0.9999099 0.9895825 0.989582 -0.9999288 0.9917504 0.9917501 -0.9999437 0.9934697 0.9934695 -0.0000238 0.0396127 0.0011968 -0.0000382 0.0391092 0.0006933 -0.0000611 0.038477 0.0000611 -0.0008899 0.038477 0.0000611 -0.0019385 0.038477 0.0000611 -0.003265 0.038477 0.0000611 -0.0049433 0.038477 0.0000611 -0.0070666 0.038477 0.0000611 -0.0097527 0.038477 0.0000611 -0.0131511 0.038477 0.0000611 -0.0174505 0.038477 0.0000611 -0.0228898 0.038477 0.0000611 -0.0297711 0.038477 0.0000611 -0.038477 0.038477 0.0000611 -0.049491 0.038477 0.0000611 -0.0634252 0.038477 0.0000611 -0.0810538 0.038477 0.0000611 -0.1033562 0.038477 0.0000611 -0.1315716 0.038477 0.0000611 -0.1672678 0.038477 0.0000611 -0.2124282 0.038477 0.0000611 -0.2695619 0.038477 0.0000611 -0.3418435 0.038477 0.0000611 -0.4332891 0.038477 0.0000611 -0.5489798 0.038477 0.0000611 -0.6953434 0.038477 0.0000611 -0.8402274 0.0415429 0.0051047 -0.9031567 0.0580005 0.0278347 -0.9353643 0.0861131 0.0623458 -0.9545059 0.1241413 0.1058883 -0.9669053 0.1709083 0.1571463 -0.9753908 0.2252456 0.2150342 -0.9814183 0.2857506 0.2782884 -0.9858141 0.3507156 0.3453439 -0.9890818 0.4181752 0.4143657 -0.9915455 0.4860432 0.4833811 -0.9934231 0.5522981 0.550464 -0.9948657 0.6151686 0.6139219 -0.9959809 0.6732768 0.6724399 -0.9968473 0.7257092 0.7251537 -0.9975229 0.7720154 0.7716504 -0.9980512 0.8121474 0.8119096 -0.9984653 0.8463669 0.8462132 -0.9987904 0.8751439 0.8750451 -0.9990461 0.8990642 0.8990011 -0.9992474 0.9187566 0.9187164 -0.999406 0.93484 0.9348146 -0.999531 0.947891 0.947875 -0.9996296 0.9584258 0.9584157 -0.9997074 0.9668935 0.9668871 -0.9997689 0.9736765 0.9736725 -0.9998174 0.9790952 0.9790927 -0.9998557 0.9834145 0.9834129 -0.999886 0.9868515 0.9868505 -0.9999099 0.9895826 0.989582 -0.9999288 0.9917505 0.9917501 -0.9999437 0.9934697 0.9934695 -0.0000238 0.0506267 0.0011968 -0.0000382 0.0501232 0.0006933 -0.0000611 0.049491 0.0000611 -0.0008899 0.049491 0.0000611 -0.0019385 0.049491 0.0000611 -0.003265 0.049491 0.0000611 -0.0049433 0.049491 0.0000611 -0.0070666 0.049491 0.0000611 -0.0097527 0.049491 0.0000611 -0.0131511 0.049491 0.0000611 -0.0174505 0.049491 0.0000611 -0.0228898 0.049491 0.0000611 -0.0297711 0.049491 0.0000611 -0.038477 0.049491 0.0000611 -0.049491 0.049491 0.0000611 -0.0634252 0.049491 0.0000611 -0.0810538 0.049491 0.0000611 -0.1033562 0.049491 0.0000611 -0.1315716 0.049491 0.0000611 -0.1672678 0.049491 0.0000611 -0.2124282 0.049491 0.0000611 -0.2695619 0.049491 0.0000611 -0.3418435 0.049491 0.0000611 -0.4332891 0.049491 0.0000611 -0.5489798 0.049491 0.0000611 -0.6953434 0.049491 0.0000611 -0.8402274 0.0519898 0.0051047 -0.9031567 0.0666492 0.0278347 -0.9353643 0.0929273 0.0623458 -0.9545059 0.1293745 0.1058883 -0.9669053 0.1748539 0.1571463 -0.9753908 0.2281732 0.2150342 -0.9814183 0.2878901 0.2782884 -0.9858141 0.3522557 0.3453439 -0.9890818 0.4192674 0.4143657 -0.9915455 0.4868065 0.4833811 -0.9934231 0.5528239 0.550464 -0.9948657 0.615526 0.6139219 -0.9959809 0.6735167 0.6724399 -0.9968473 0.7258685 0.7251537 -0.9975229 0.77212 0.7716504 -0.9980512 0.8122156 0.8119096 -0.9984653 0.846411 0.8462132 -0.9987904 0.8751722 0.8750451 -0.9990461 0.8990823 0.8990011 -0.9992474 0.9187681 0.9187164 -0.999406 0.9348473 0.9348146 -0.999531 0.9478957 0.947875 -0.9996296 0.9584288 0.9584157 -0.9997074 0.9668954 0.9668871 -0.9997689 0.9736777 0.9736725 -0.9998174 0.9790959 0.9790927 -0.9998557 0.9834149 0.9834129 -0.999886 0.9868518 0.9868505 -0.9999099 0.9895828 0.989582 -0.9999288 0.9917506 0.9917501 -0.9999437 0.9934698 0.9934695 -0.0000238 0.0645609 0.0011968 -0.0000382 0.0640574 0.0006933 -0.0000611 0.0634252 0.0000611 -0.0008899 0.0634252 0.0000611 -0.0019385 0.0634252 0.0000611 -0.003265 0.0634252 0.0000611 -0.0049433 0.0634252 0.0000611 -0.0070666 0.0634252 0.0000611 -0.0097527 0.0634252 0.0000611 -0.0131511 0.0634252 0.0000611 -0.0174505 0.0634252 0.0000611 -0.0228898 0.0634252 0.0000611 -0.0297711 0.0634252 0.0000611 -0.038477 0.0634252 0.0000611 -0.049491 0.0634252 0.0000611 -0.0634252 0.0634252 0.0000611 -0.0810538 0.0634252 0.0000611 -0.1033562 0.0634252 0.0000611 -0.1315716 0.0634252 0.0000611 -0.1672678 0.0634252 0.0000611 -0.2124282 0.0634252 0.0000611 -0.2695619 0.0634252 0.0000611 -0.3418435 0.0634252 0.0000611 -0.4332891 0.0634252 0.0000611 -0.5489798 0.0634252 0.0000611 -0.6953434 0.0634252 0.0000611 -0.8402274 0.0652066 0.0051047 -0.9031567 0.0775909 0.0278347 -0.9353643 0.1015482 0.0623458 -0.9545059 0.1359951 0.1058883 -0.9669053 0.1798457 0.1571463 -0.9753908 0.2318771 0.2150342 -0.9814183 0.2905967 0.2782884 -0.9858141 0.3542041 0.3453439 -0.9890818 0.4206492 0.4143657 -0.9915455 0.4877721 0.4833811 -0.9934231 0.5534892 0.550464 -0.9948657 0.6159782 0.6139219 -0.9959809 0.6738202 0.6724399 -0.9968473 0.7260699 0.7251537 -0.9975229 0.7722524 0.7716504 -0.9980512 0.8123018 0.8119096 -0.9984653 0.8464668 0.8462132 -0.9987904 0.875208 0.8750451 -0.9990461 0.8991052 0.8990011 -0.9992474 0.9187826 0.9187164 -0.999406 0.9348565 0.9348146 -0.999531 0.9479015 0.947875 -0.9996296 0.9584324 0.9584157 -0.9997074 0.9668977 0.9668871 -0.9997689 0.9736791 0.9736725 -0.9998174 0.9790968 0.9790927 -0.9998557 0.9834155 0.9834129 -0.999886 0.9868521 0.9868505 -0.9999099 0.989583 0.989582 -0.9999288 0.9917507 0.9917501 -0.9999437 0.9934699 0.9934695 -0.0000238 0.0821895 0.0011968 -0.0000382 0.081686 0.0006933 -0.0000611 0.0810538 0.0000611 -0.0008899 0.0810538 0.0000611 -0.0019385 0.0810538 0.0000611 -0.003265 0.0810538 0.0000611 -0.0049433 0.0810538 0.0000611 -0.0070666 0.0810538 0.0000611 -0.0097527 0.0810538 0.0000611 -0.0131511 0.0810538 0.0000611 -0.0174505 0.0810538 0.0000611 -0.0228898 0.0810538 0.0000611 -0.0297711 0.0810538 0.0000611 -0.038477 0.0810538 0.0000611 -0.049491 0.0810538 0.0000611 -0.0634252 0.0810538 0.0000611 -0.0810538 0.0810538 0.0000611 -0.1033562 0.0810538 0.0000611 -0.1315716 0.0810538 0.0000611 -0.1672678 0.0810538 0.0000611 -0.2124282 0.0810538 0.0000611 -0.2695619 0.0810538 0.0000611 -0.3418435 0.0810538 0.0000611 -0.4332891 0.0810538 0.0000611 -0.5489798 0.0810538 0.0000611 -0.6953434 0.0810538 0.0000611 -0.8402274 0.0819276 0.0051047 -0.9031567 0.0914336 0.0278347 -0.9353643 0.1124547 0.0623458 -0.9545059 0.1443712 0.1058883 -0.9669053 0.1861609 0.1571463 -0.9753908 0.2365629 0.2150342 -0.9814183 0.294021 0.2782884 -0.9858141 0.3566692 0.3453439 -0.9890818 0.4223974 0.4143657 -0.9915455 0.4889938 0.4833811 -0.9934231 0.5543308 0.550464 -0.9948657 0.6165503 0.6139219 -0.9959809 0.6742043 0.6724399 -0.9968473 0.7263248 0.7251537 -0.9975229 0.7724199 0.7716504 -0.9980512 0.8124109 0.8119096 -0.9984653 0.8465373 0.8462132 -0.9987904 0.8752533 0.8750451 -0.9990461 0.8991342 0.8990011 -0.9992474 0.9188011 0.9187164 -0.999406 0.9348682 0.9348146 -0.999531 0.9479089 0.947875 -0.9996296 0.9584371 0.9584157 -0.9997074 0.9669006 0.9668871 -0.9997689 0.973681 0.9736725 -0.9998174 0.979098 0.9790927 -0.9998557 0.9834162 0.9834129 -0.999886 0.9868526 0.9868505 -0.9999099 0.9895833 0.989582 -0.9999288 0.9917509 0.9917501 -0.9999437 0.99347 0.9934695 -0.0000238 0.1044919 0.0011968 -0.0000382 0.1039884 0.0006933 -0.0000611 0.1033562 0.0000611 -0.0008899 0.1033562 0.0000611 -0.0019385 0.1033562 0.0000611 -0.003265 0.1033562 0.0000611 -0.0049433 0.1033562 0.0000611 -0.0070666 0.1033562 0.0000611 -0.0097527 0.1033562 0.0000611 -0.0131511 0.1033562 0.0000611 -0.0174505 0.1033562 0.0000611 -0.0228898 0.1033562 0.0000611 -0.0297711 0.1033562 0.0000611 -0.038477 0.1033562 0.0000611 -0.049491 0.1033562 0.0000611 -0.0634252 0.1033562 0.0000611 -0.0810538 0.1033562 0.0000611 -0.1033562 0.1033562 0.0000611 -0.1315716 0.1033562 0.0000611 -0.1672678 0.1033562 0.0000611 -0.2124282 0.1033562 0.0000611 -0.2695619 0.1033562 0.0000611 -0.3418435 0.1033562 0.0000611 -0.4332891 0.1033562 0.0000611 -0.5489798 0.1033562 0.0000611 -0.6953434 0.1033562 0.0000611 -0.8402274 0.1030818 0.0051047 -0.9031567 0.1089464 0.0278347 -0.9353643 0.1262529 0.0623458 -0.9545059 0.1549679 0.1058883 -0.9669053 0.1941504 0.1571463 -0.9753908 0.2424911 0.2150342 -0.9814183 0.2983532 0.2782884 -0.9858141 0.3597877 0.3453439 -0.9890818 0.424609 0.4143657 -0.9915455 0.4905393 0.4833811 -0.9934231 0.5553956 0.550464 -0.9948657 0.6172741 0.6139219 -0.9959809 0.6746901 0.6724399 -0.9968473 0.7266473 0.7251537 -0.9975229 0.7726318 0.7716504 -0.9980512 0.8125489 0.8119096 -0.9984653 0.8466265 0.8462132 -0.9987904 0.8753107 0.8750451 -0.9990461 0.8991708 0.8990011 -0.9992474 0.9188244 0.9187164 -0.999406 0.934883 0.9348146 -0.999531 0.9479182 0.947875 -0.9996296 0.958443 0.9584157 -0.9997074 0.9669043 0.9668871 -0.9997689 0.9736833 0.9736725 -0.9998174 0.9790994 0.9790927 -0.9998557 0.9834171 0.9834129 -0.999886 0.9868531 0.9868505 -0.9999099 0.9895837 0.989582 -0.9999288 0.9917511 0.9917501 -0.9999437 0.9934701 0.9934695 -0.0000238 0.1327073 0.0011968 -0.0000382 0.1322038 0.0006933 -0.0000611 0.1315716 0.0000611 -0.0008899 0.1315716 0.0000611 -0.0019385 0.1315716 0.0000611 -0.003265 0.1315716 0.0000611 -0.0049433 0.1315716 0.0000611 -0.0070666 0.1315716 0.0000611 -0.0097527 0.1315716 0.0000611 -0.0131511 0.1315716 0.0000611 -0.0174505 0.1315716 0.0000611 -0.0228898 0.1315716 0.0000611 -0.0297711 0.1315716 0.0000611 -0.038477 0.1315716 0.0000611 -0.049491 0.1315716 0.0000611 -0.0634252 0.1315716 0.0000611 -0.0810538 0.1315716 0.0000611 -0.1033562 0.1315716 0.0000611 -0.1315716 0.1315716 0.0000611 -0.1672678 0.1315716 0.0000611 -0.2124282 0.1315716 0.0000611 -0.2695619 0.1315716 0.0000611 -0.3418435 0.1315716 0.0000611 -0.4332891 0.1315716 0.0000611 -0.5489798 0.1315716 0.0000611 -0.6953434 0.1315716 0.0000611 -0.8402274 0.1298447 0.0051047 -0.9031567 0.1311024 0.0278347 -0.9353643 0.1437093 0.0623458 -0.9545059 0.1683742 0.1058883 -0.9669053 0.2042583 0.1571463 -0.9753908 0.249991 0.2150342 -0.9814183 0.303834 0.2782884 -0.9858141 0.3637331 0.3453439 -0.9890818 0.427407 0.4143657 -0.9915455 0.4924946 0.4833811 -0.9934231 0.5567427 0.550464 -0.9948657 0.6181897 0.6139219 -0.9959809 0.6753048 0.6724399 -0.9968473 0.7270553 0.7251537 -0.9975229 0.7728999 0.7716504 -0.9980512 0.8127235 0.8119096 -0.9984653 0.8467394 0.8462132 -0.9987904 0.8753832 0.8750451 -0.9990461 0.8992171 0.8990011 -0.9992474 0.9188539 0.9187164 -0.999406 0.9349017 0.9348146 -0.999531 0.94793 0.947875 -0.9996296 0.9584504 0.9584157 -0.9997074 0.966909 0.9668871 -0.9997689 0.9736863 0.9736725 -0.9998174 0.9791013 0.9790927 -0.9998557 0.9834183 0.9834129 -0.999886 0.9868539 0.9868505 -0.9999099 0.9895841 0.989582 -0.9999288 0.9917514 0.9917501 -0.9999437 0.9934703 0.9934695 -0.0000238 0.1684036 0.0011968 -0.0000382 0.1679 0.0006933 -0.0000611 0.1672678 0.0000611 -0.0008899 0.1672678 0.0000611 -0.0019385 0.1672678 0.0000611 -0.003265 0.1672678 0.0000611 -0.0049433 0.1672678 0.0000611 -0.0070666 0.1672678 0.0000611 -0.0097527 0.1672678 0.0000611 -0.0131511 0.1672678 0.0000611 -0.0174505 0.1672678 0.0000611 -0.0228898 0.1672678 0.0000611 -0.0297711 0.1672678 0.0000611 -0.038477 0.1672678 0.0000611 -0.049491 0.1672678 0.0000611 -0.0634252 0.1672678 0.0000611 -0.0810538 0.1672678 0.0000611 -0.1033562 0.1672678 0.0000611 -0.1315716 0.1672678 0.0000611 -0.1672678 0.1672678 0.0000611 -0.2124282 0.1672678 0.0000611 -0.2695619 0.1672678 0.0000611 -0.3418435 0.1672678 0.0000611 -0.4332891 0.1672678 0.0000611 -0.5489798 0.1672678 0.0000611 -0.6953434 0.1672678 0.0000611 -0.8402274 0.1637031 0.0051047 -0.9031567 0.1591327 0.0278347 -0.9353643 0.1657941 0.0623458 -0.9545059 0.1853349 0.1058883 -0.9669053 0.217046 0.1571463 -0.9753908 0.2594794 0.2150342 -0.9814183 0.3107679 0.2782884 -0.9858141 0.3687246 0.3453439 -0.9890818 0.4309468 0.4143657 -0.9915455 0.4949683 0.4833811 -0.9934231 0.558447 0.550464 -0.9948657 0.6193482 0.6139219 -0.9959809 0.6760824 0.6724399 -0.9968473 0.7275714 0.7251537 -0.9975229 0.7732391 0.7716504 -0.9980512 0.8129445 0.8119096 -0.9984653 0.8468823 0.8462132 -0.9987904 0.8754749 0.8750451 -0.9990461 0.8992758 0.8990011 -0.9992474 0.9188912 0.9187164 -0.999406 0.9349253 0.9348146 -0.999531 0.947945 0.947875 -0.9996296 0.9584599 0.9584157 -0.9997074 0.9669149 0.9668871 -0.9997689 0.97369 0.9736725 -0.9998174 0.9791036 0.9790927 -0.9998557 0.9834198 0.9834129 -0.999886 0.9868548 0.9868505 -0.9999099 0.9895847 0.989582 -0.9999288 0.9917518 0.9917501 -0.9999437 0.9934705 0.9934695 -0.0000238 0.2135639 0.0011968 -0.0000382 0.2130604 0.0006933 -0.0000611 0.2124282 0.0000611 -0.0008899 0.2124282 0.0000611 -0.0019385 0.2124282 0.0000611 -0.003265 0.2124282 0.0000611 -0.0049433 0.2124282 0.0000611 -0.0070666 0.2124282 0.0000611 -0.0097527 0.2124282 0.0000611 -0.0131511 0.2124282 0.0000611 -0.0174505 0.2124282 0.0000611 -0.0228898 0.2124282 0.0000611 -0.0297711 0.2124282 0.0000611 -0.038477 0.2124282 0.0000611 -0.049491 0.2124282 0.0000611 -0.0634252 0.2124282 0.0000611 -0.0810538 0.2124282 0.0000611 -0.1033562 0.2124282 0.0000611 -0.1315716 0.2124282 0.0000611 -0.1672678 0.2124282 0.0000611 -0.2124282 0.2124282 0.0000611 -0.2695619 0.2124282 0.0000611 -0.3418435 0.2124282 0.0000611 -0.4332891 0.2124282 0.0000611 -0.5489798 0.2124282 0.0000611 -0.6953434 0.2124282 0.0000611 -0.8402274 0.2065385 0.0051047 -0.9031567 0.1945945 0.0278347 -0.9353643 0.1937341 0.0623458 -0.9545059 0.2067924 0.1058883 -0.9669053 0.2332241 0.1571463 -0.9753908 0.2714835 0.2150342 -0.9814183 0.3195402 0.2782884 -0.9858141 0.3750394 0.3453439 -0.9890818 0.4354252 0.4143657 -0.9915455 0.4980979 0.4833811 -0.9934231 0.5606031 0.550464 -0.9948657 0.6208137 0.6139219 -0.9959809 0.6770662 0.6724399 -0.9968473 0.7282244 0.7251537 -0.9975229 0.7736681 0.7716504 -0.9980512 0.813224 0.8119096 -0.9984653 0.8470629 0.8462132 -0.9987904 0.875591 0.8750451 -0.9990461 0.89935 0.8990011 -0.9992474 0.9189384 0.9187164 -0.999406 0.9349553 0.9348146 -0.999531 0.9479639 0.947875 -0.9996296 0.9584718 0.9584157 -0.9997074 0.9669225 0.9668871 -0.9997689 0.9736947 0.9736725 -0.9998174 0.9791066 0.9790927 -0.9998557 0.9834216 0.9834129 -0.999886 0.986856 0.9868505 -0.9999099 0.9895854 0.989582 -0.9999288 0.9917522 0.9917501 -0.9999437 0.9934708 0.9934695 -0.0000238 0.2706977 0.0011968 -0.0000382 0.2701941 0.0006933 -0.0000611 0.2695619 0.0000611 -0.0008899 0.2695619 0.0000611 -0.0019385 0.2695619 0.0000611 -0.003265 0.2695619 0.0000611 -0.0049433 0.2695619 0.0000611 -0.0070666 0.2695619 0.0000611 -0.0097527 0.2695619 0.0000611 -0.0131511 0.2695619 0.0000611 -0.0174505 0.2695619 0.0000611 -0.0228898 0.2695619 0.0000611 -0.0297711 0.2695619 0.0000611 -0.038477 0.2695619 0.0000611 -0.049491 0.2695619 0.0000611 -0.0634252 0.2695619 0.0000611 -0.0810538 0.2695619 0.0000611 -0.1033562 0.2695619 0.0000611 -0.1315716 0.2695619 0.0000611 -0.1672678 0.2695619 0.0000611 -0.2124282 0.2695619 0.0000611 -0.2695619 0.2695619 0.0000611 -0.3418435 0.2695619 0.0000611 -0.4332891 0.2695619 0.0000611 -0.5489798 0.2695619 0.0000611 -0.6953434 0.2695619 0.0000611 -0.8402274 0.2607307 0.0051047 -0.9031567 0.2394584 0.0278347 -0.9353643 0.2290819 0.0623458 -0.9545059 0.2339389 0.1058883 -0.9669053 0.2536915 0.1571463 -0.9753908 0.2866702 0.2150342 -0.9814183 0.3306382 0.2782884 -0.9858141 0.3830285 0.3453439 -0.9890818 0.4410909 0.4143657 -0.9915455 0.5020572 0.4833811 -0.9934231 0.5633309 0.550464 -0.9948657 0.6226678 0.6139219 -0.9959809 0.6783109 0.6724399 -0.9968473 0.7290505 0.7251537 -0.9975229 0.774211 0.7716504 -0.9980512 0.8135776 0.8119096 -0.9984653 0.8472916 0.8462132 -0.9987904 0.8757379 0.8750451 -0.9990461 0.8994438 0.8990011 -0.9992474 0.9189981 0.9187164 -0.999406 0.9349931 0.9348146 -0.999531 0.9479878 0.947875 -0.9996296 0.9584869 0.9584157 -0.9997074 0.966932 0.9668871 -0.9997689 0.9737007 0.9736725 -0.9998174 0.9791103 0.9790927 -0.9998557 0.983424 0.9834129 -0.999886 0.9868574 0.9868505 -0.9999099 0.9895863 0.989582 -0.9999288 0.9917528 0.9917501 -0.9999437 0.9934712 0.9934695 -0.0000238 0.3429792 0.0011968 -0.0000382 0.3424757 0.0006933 -0.0000611 0.3418435 0.0000611 -0.0008899 0.3418435 0.0000611 -0.0019385 0.3418435 0.0000611 -0.003265 0.3418435 0.0000611 -0.0049433 0.3418435 0.0000611 -0.0070666 0.3418435 0.0000611 -0.0097527 0.3418435 0.0000611 -0.0131511 0.3418435 0.0000611 -0.0174505 0.3418435 0.0000611 -0.0228898 0.3418435 0.0000611 -0.0297711 0.3418435 0.0000611 -0.038477 0.3418435 0.0000611 -0.049491 0.3418435 0.0000611 -0.0634252 0.3418435 0.0000611 -0.0810538 0.3418435 0.0000611 -0.1033562 0.3418435 0.0000611 -0.1315716 0.3418435 0.0000611 -0.1672678 0.3418435 0.0000611 -0.2124282 0.3418435 0.0000611 -0.2695619 0.3418435 0.0000611 -0.3418435 0.3418435 0.0000611 -0.4332891 0.3418435 0.0000611 -0.5489798 0.3418435 0.0000611 -0.6953434 0.3418435 0.0000611 -0.8402274 0.329291 0.0051047 -0.9031567 0.2962171 0.0278347 -0.9353643 0.2738014 0.0623458 -0.9545059 0.2682827 0.1058883 -0.9669053 0.2795855 0.1571463 -0.9753908 0.3058834 0.2150342 -0.9814183 0.3446787 0.2782884 -0.9858141 0.3931357 0.3453439 -0.9890818 0.4482588 0.4143657 -0.9915455 0.5070663 0.4833811 -0.9934231 0.5667818 0.550464 -0.9948657 0.6250135 0.6139219 -0.9959809 0.6798855 0.6724399 -0.9968473 0.7300957 0.7251537 -0.9975229 0.7748978 0.7716504 -0.9980512 0.8140249 0.8119096 -0.9984653 0.8475808 0.8462132 -0.9987904 0.8759237 0.8750451 -0.9990461 0.8995625 0.8990011 -0.9992474 0.9190736 0.9187164 -0.999406 0.935041 0.9348146 -0.999531 0.9480181 0.947875 -0.9996296 0.958506 0.9584157 -0.9997074 0.966944 0.9668871 -0.9997689 0.9737082 0.9736725 -0.9998174 0.9791151 0.9790927 -0.9998557 0.9834269 0.9834129 -0.999886 0.9868593 0.9868505 -0.9999099 0.9895875 0.989582 -0.9999288 0.9917535 0.9917501 -0.9999437 0.9934716 0.9934695 -0.0000238 0.4344249 0.0011968 -0.0000382 0.4339214 0.0006933 -0.0000611 0.4332891 0.0000611 -0.0008899 0.4332891 0.0000611 -0.0019385 0.4332891 0.0000611 -0.003265 0.4332891 0.0000611 -0.0049433 0.4332891 0.0000611 -0.0070666 0.4332891 0.0000611 -0.0097527 0.4332891 0.0000611 -0.0131511 0.4332891 0.0000611 -0.0174505 0.4332891 0.0000611 -0.0228898 0.4332891 0.0000611 -0.0297711 0.4332891 0.0000611 -0.038477 0.4332891 0.0000611 -0.049491 0.4332891 0.0000611 -0.0634252 0.4332891 0.0000611 -0.0810538 0.4332891 0.0000611 -0.1033562 0.4332891 0.0000611 -0.1315716 0.4332891 0.0000611 -0.1672678 0.4332891 0.0000611 -0.2124282 0.4332891 0.0000611 -0.2695619 0.4332891 0.0000611 -0.3418435 0.4332891 0.0000611 -0.4332891 0.4332891 0.0000611 -0.5489798 0.4332891 0.0000611 -0.6953434 0.4332891 0.0000611 -0.8402274 0.4160287 0.0051047 -0.9031567 0.3680241 0.0278347 -0.9353643 0.3303774 0.0623458 -0.9545059 0.3117322 0.1058883 -0.9669053 0.3123447 0.1571463 -0.9753908 0.3301905 0.2150342 -0.9814183 0.3624418 0.2782884 -0.9858141 0.4059227 0.3453439 -0.9890818 0.457327 0.4143657 -0.9915455 0.5134034 0.4833811 -0.9934231 0.5711477 0.550464 -0.9948657 0.6279812 0.6139219 -0.9959809 0.6818777 0.6724399 -0.9968473 0.7314179 0.7251537 -0.9975229 0.7757666 0.7716504 -0.9980512 0.8145909 0.8119096 -0.9984653 0.8479467 0.8462132 -0.9987904 0.8761587 0.8750451 -0.9990461 0.8997128 0.8990011 -0.9992474 0.9191692 0.9187164 -0.999406 0.9351016 0.9348146 -0.999531 0.9480564 0.947875 -0.9996296 0.9585301 0.9584157 -0.9997074 0.9669592 0.9668871 -0.9997689 0.9737178 0.9736725 -0.9998174 0.9791211 0.9790927 -0.9998557 0.9834307 0.9834129 -0.999886 0.9868616 0.9868505 -0.9999099 0.989589 0.989582 -0.9999288 0.9917545 0.9917501 -0.9999437 0.9934722 0.9934695 -0.0000238 0.5501155 0.0011968 -0.0000382 0.549612 0.0006933 -0.0000611 0.5489798 0.0000611 -0.0008899 0.5489798 0.0000611 -0.0019385 0.5489798 0.0000611 -0.003265 0.5489798 0.0000611 -0.0049433 0.5489798 0.0000611 -0.0070666 0.5489798 0.0000611 -0.0097527 0.5489798 0.0000611 -0.0131511 0.5489798 0.0000611 -0.0174505 0.5489798 0.0000611 -0.0228898 0.5489798 0.0000611 -0.0297711 0.5489798 0.0000611 -0.038477 0.5489798 0.0000611 -0.049491 0.5489798 0.0000611 -0.0634252 0.5489798 0.0000611 -0.0810538 0.5489798 0.0000611 -0.1033562 0.5489798 0.0000611 -0.1315716 0.5489798 0.0000611 -0.1672678 0.5489798 0.0000611 -0.2124282 0.5489798 0.0000611 -0.2695619 0.5489798 0.0000611 -0.3418435 0.5489798 0.0000611 -0.4332891 0.5489798 0.0000611 -0.5489798 0.5489798 0.0000611 -0.6953434 0.5489798 0.0000611 -0.8402274 0.5257632 0.0051047 -0.9031567 0.4588694 0.0278347 -0.9353643 0.4019535 0.0623458 -0.9545059 0.3667014 0.1058883 -0.9669053 0.3537894 0.1571463 -0.9753908 0.3609422 0.2150342 -0.9814183 0.3849144 0.2782884 -0.9858141 0.4220999 0.3453439 -0.9890818 0.4687996 0.4143657 -0.9915455 0.5214207 0.4833811 -0.9934231 0.5766712 0.550464 -0.9948657 0.6317356 0.6139219 -0.9959809 0.684398 0.6724399 -0.9968473 0.7330907 0.7251537 -0.9975229 0.7768658 0.7716504 -0.9980512 0.8153069 0.8119096 -0.9984653 0.8484096 0.8462132 -0.9987904 0.8764561 0.8750451 -0.9990461 0.8999028 0.8990011 -0.9992474 0.9192901 0.9187164 -0.999406 0.9351783 0.9348146 -0.999531 0.9481049 0.947875 -0.9996296 0.9585607 0.9584157 -0.9997074 0.9669784 0.9668871 -0.9997689 0.9737299 0.9736725 -0.9998174 0.9791287 0.9790927 -0.9998557 0.9834355 0.9834129 -0.999886 0.9868646 0.9868505 -0.9999099 0.9895909 0.989582 -0.9999288 0.9917556 0.9917501 -0.9999437 0.993473 0.9934695 -0.0000238 0.6964791 0.0011968 -0.0000382 0.6959756 0.0006933 -0.0000611 0.6953434 0.0000611 -0.0008899 0.6953434 0.0000611 -0.0019385 0.6953434 0.0000611 -0.003265 0.6953434 0.0000611 -0.0049433 0.6953434 0.0000611 -0.0070666 0.6953434 0.0000611 -0.0097527 0.6953434 0.0000611 -0.0131511 0.6953434 0.0000611 -0.0174505 0.6953434 0.0000611 -0.0228898 0.6953434 0.0000611 -0.0297711 0.6953434 0.0000611 -0.038477 0.6953434 0.0000611 -0.049491 0.6953434 0.0000611 -0.0634252 0.6953434 0.0000611 -0.0810538 0.6953434 0.0000611 -0.1033562 0.6953434 0.0000611 -0.1315716 0.6953434 0.0000611 -0.1672678 0.6953434 0.0000611 -0.2124282 0.6953434 0.0000611 -0.2695619 0.6953434 0.0000611 -0.3418435 0.6953434 0.0000611 -0.4332891 0.6953434 0.0000611 -0.5489798 0.6953434 0.0000611 -0.6953434 0.6953434 0.0000611 -0.8402274 0.6645915 0.0051047 -0.9031567 0.5738005 0.0278347 -0.9353643 0.4925065 0.0623458 -0.9545059 0.4362446 0.1058883 -0.9669053 0.4062223 0.1571463 -0.9753908 0.3998472 0.2150342 -0.9814183 0.4133451 0.2782884 -0.9858141 0.4425661 0.3453439 -0.9890818 0.4833138 0.4143657 -0.9915455 0.5315636 0.4833811 -0.9934231 0.5836591 0.550464 -0.9948657 0.6364854 0.6139219 -0.9959809 0.6875865 0.6724399 -0.9968473 0.7352071 0.7251537 -0.9975229 0.7782565 0.7716504 -0.9980512 0.8162127 0.8119096 -0.9984653 0.8489952 0.8462132 -0.9987904 0.8768324 0.8750451 -0.9990461 0.9001432 0.8990011 -0.9992474 0.9194431 0.9187164 -0.999406 0.9352752 0.9348146 -0.999531 0.9481662 0.947875 -0.9996296 0.9585994 0.9584157 -0.9997074 0.9670027 0.9668871 -0.9997689 0.9737452 0.9736725 -0.9998174 0.9791383 0.9790927 -0.9998557 0.9834415 0.9834129 -0.999886 0.9868684 0.9868505 -0.9999099 0.9895932 0.989582 -0.9999288 0.9917571 0.9917501 -0.9999437 0.9934739 0.9934695 -0.0051514 0.8407292 0.0062631 -0.0051286 0.8405071 0.0057497 -0.0051047 0.8402274 0.0051047 -0.0058909 0.8402274 0.0051047 -0.0068855 0.8402274 0.0051047 -0.0081437 0.8402274 0.0051047 -0.0097356 0.8402274 0.0051047 -0.0117495 0.8402274 0.0051047 -0.0142974 0.8402274 0.0051047 -0.0175208 0.8402274 0.0051047 -0.0215989 0.8402274 0.0051047 -0.0267581 0.8402274 0.0051047 -0.0332852 0.8402274 0.0051047 -0.0415429 0.8402274 0.0051047 -0.0519898 0.8402274 0.0051047 -0.0652066 0.8402274 0.0051047 -0.0819276 0.8402274 0.0051047 -0.1030818 0.8402274 0.0051047 -0.1298447 0.8402274 0.0051047 -0.1637031 0.8402274 0.0051047 -0.2065385 0.8402274 0.0051047 -0.2607307 0.8402274 0.0051047 -0.329291 0.8402274 0.0051047 -0.4160287 0.8402274 0.0051047 -0.5257632 0.8402274 0.0051047 -0.6645915 0.8402274 0.0051047 -0.8402274 0.8402274 0.0051047 -0.9031567 0.7192033 0.0278347 -0.9353643 0.6070678 0.0623458 -0.9545059 0.5242258 0.1058883 -0.9669053 0.4725567 0.1571463 -0.9753908 0.4490669 0.2150342 -0.9814183 0.4493137 0.2782884 -0.9858141 0.4684585 0.3453439 -0.9890818 0.5016763 0.4143657 -0.9915455 0.5443956 0.4833811 -0.9934231 0.5924997 0.550464 -0.9948657 0.6424946 0.6139219 -0.9959809 0.6916203 0.6724399 -0.9968473 0.7378845 0.7251537 -0.9975229 0.7800158 0.7716504 -0.9980512 0.8173587 0.8119096 -0.9984653 0.8497361 0.8462132 -0.9987904 0.8773083 0.8750451 -0.9990461 0.9004474 0.8990011 -0.9992474 0.9196366 0.9187164 -0.999406 0.9353979 0.9348146 -0.999531 0.9482437 0.947875 -0.9996296 0.9586483 0.9584157 -0.9997074 0.9670335 0.9668871 -0.9997689 0.9737645 0.9736725 -0.9998174 0.9791504 0.9790927 -0.9998557 0.9834491 0.9834129 -0.999886 0.9868732 0.9868505 -0.9999099 0.9895962 0.989582 -0.9999288 0.991759 0.9917501 -0.9999437 0.993475 0.9934695 -0.0279321 0.9033413 0.0288523 -0.0278872 0.9032596 0.0284013 -0.0278347 0.9031567 0.0278347 -0.0284855 0.9031567 0.0278347 -0.0293089 0.9031567 0.0278347 -0.0303505 0.9031567 0.0278347 -0.0316684 0.9031567 0.0278347 -0.0333357 0.9031567 0.0278347 -0.035445 0.9031567 0.0278347 -0.0381135 0.9031567 0.0278347 -0.0414896 0.9031567 0.0278347 -0.0457607 0.9031567 0.0278347 -0.0511643 0.9031567 0.0278347 -0.0580005 0.9031567 0.0278347 -0.0666492 0.9031567 0.0278347 -0.0775909 0.9031567 0.0278347 -0.0914336 0.9031567 0.0278347 -0.1089464 0.9031567 0.0278347 -0.1311024 0.9031567 0.0278347 -0.1591327 0.9031567 0.0278347 -0.1945945 0.9031567 0.0278347 -0.2394584 0.9031567 0.0278347 -0.2962171 0.9031567 0.0278347 -0.3680241 0.9031567 0.0278347 -0.4588694 0.9031567 0.0278347 -0.5738005 0.9031567 0.0278347 -0.7192033 0.9031567 0.0278347 -0.9031567 0.9031567 0.0278347 -0.9353643 0.7520027 0.0623458 -0.9545059 0.6355334 0.1058883 -0.9669053 0.5564784 0.1571463 -0.9753908 0.5113363 0.2150342 -0.9814183 0.4948186 0.2782884 -0.9858141 0.5012158 0.3453439 -0.9890818 0.5249071 0.4143657 -0.9915455 0.5606299 0.4833811 -0.9934231 0.6036842 0.550464 -0.9948657 0.6500969 0.6139219 -0.9959809 0.6967237 0.6724399 -0.9968473 0.7412718 0.7251537 -0.9975229 0.7822416 0.7716504 -0.9980512 0.8188085 0.8119096 -0.9984653 0.8506734 0.8462132 -0.9987904 0.8779105 0.8750451 -0.9990461 0.9008322 0.8990011 -0.9992474 0.9198814 0.9187164 -0.999406 0.9355532 0.9348146 -0.999531 0.9483418 0.947875 -0.9996296 0.9587101 0.9584157 -0.9997074 0.9670725 0.9668871 -0.9997689 0.973789 0.9736725 -0.9998174 0.9791658 0.9790927 -0.9998557 0.9834587 0.9834129 -0.999886 0.9868792 0.9868505 -0.9999099 0.9896 0.989582 -0.9999288 0.9917613 0.9917501 -0.9999437 0.9934765 0.9934695 -0.0624569 0.9354466 0.063182 -0.0624063 0.9354101 0.0628114 -0.0623458 0.9353643 0.0623458 -0.0628585 0.9353643 0.0623458 -0.0635073 0.9353643 0.0623458 -0.064328 0.9353643 0.0623458 -0.0653663 0.9353643 0.0623458 -0.0666799 0.9353643 0.0623458 -0.0683418 0.9353643 0.0623458 -0.0704444 0.9353643 0.0623458 -0.0731043 0.9353643 0.0623458 -0.0764695 0.9353643 0.0623458 -0.0807269 0.9353643 0.0623458 -0.0861131 0.9353643 0.0623458 -0.0929273 0.9353643 0.0623458 -0.1015482 0.9353643 0.0623458 -0.1124547 0.9353643 0.0623458 -0.1262529 0.9353643 0.0623458 -0.1437093 0.9353643 0.0623458 -0.1657941 0.9353643 0.0623458 -0.1937341 0.9353643 0.0623458 -0.2290819 0.9353643 0.0623458 -0.2738014 0.9353643 0.0623458 -0.3303774 0.9353643 0.0623458 -0.4019535 0.9353643 0.0623458 -0.4925065 0.9353643 0.0623458 -0.6070678 0.9353643 0.0623458 -0.7520027 0.9353643 0.0623458 -0.9353643 0.9353643 0.0623458 -0.9545059 0.776352 0.1058883 -0.9669053 0.6626503 0.1571463 -0.9753908 0.5901152 0.2150342 -0.9814183 0.5523882 0.2782884 -0.9858141 0.542658 0.3453439 -0.9890818 0.5542971 0.4143657 -0.9915455 0.5811683 0.4833811 -0.9934231 0.6178341 0.550464 -0.9948657 0.6597149 0.6139219 -0.9959809 0.7031802 0.6724399 -0.9968473 0.7455572 0.7251537 -0.9975229 0.7850576 0.7716504 -0.9980512 0.8206428 0.8119096 -0.9984653 0.8518593 0.8462132 -0.9987904 0.8786723 0.8750451 -0.9990461 0.901319 0.8990011 -0.9992474 0.9201912 0.9187164 -0.999406 0.9357495 0.9348146 -0.999531 0.948466 0.947875 -0.9996296 0.9587884 0.9584157 -0.9997074 0.9671218 0.9668871 -0.9997689 0.97382 0.9736725 -0.9998174 0.9791852 0.9790927 -0.9998557 0.9834709 0.9834129 -0.999886 0.9868869 0.9868505 -0.9999099 0.9896048 0.989582 -0.9999288 0.9917643 0.9917501 -0.9999437 0.9934784 0.9934695 -0.1059991 0.9545467 0.106556 -0.1059489 0.9545286 0.1062601 -0.1058883 0.9545059 0.1058883 -0.1062821 0.9545059 0.1058883 -0.1067803 0.9545059 0.1058883 -0.1074107 0.9545059 0.1058883 -0.1082081 0.9545059 0.1058883 -0.1092169 0.9545059 0.1058883 -0.1104932 0.9545059 0.1058883 -0.1121079 0.9545059 0.1058883 -0.1141507 0.9545059 0.1058883 -0.1167351 0.9545059 0.1058883 -0.1200048 0.9545059 0.1058883 -0.1241413 0.9545059 0.1058883 -0.1293745 0.9545059 0.1058883 -0.1359951 0.9545059 0.1058883 -0.1443712 0.9545059 0.1058883 -0.1549679 0.9545059 0.1058883 -0.1683742 0.9545059 0.1058883 -0.1853349 0.9545059 0.1058883 -0.2067924 0.9545059 0.1058883 -0.2339389 0.9545059 0.1058883 -0.2682827 0.9545059 0.1058883 -0.3117322 0.9545059 0.1058883 -0.3667014 0.9545059 0.1058883 -0.4362446 0.9545059 0.1058883 -0.5242258 0.9545059 0.1058883 -0.6355334 0.9545059 0.1058883 -0.776352 0.9545059 0.1058883 -0.9545059 0.9545059 0.1058883 -0.9669053 0.7969715 0.1571463 -0.9753908 0.6897808 0.2150342 -0.9814183 0.6252213 0.2782884 -0.9858141 0.5950879 0.3453439 -0.9890818 0.5914794 0.4143657 -0.9915455 0.607152 0.4833811 -0.9934231 0.6357355 0.550464 -0.9948657 0.6718829 0.6139219 -0.9959809 0.7113484 0.6724399 -0.9968473 0.7509787 0.7251537 -0.9975229 0.7886201 0.7716504 -0.9980512 0.8229633 0.8119096 -0.9984653 0.8533595 0.8462132 -0.9987904 0.8796361 0.8750451 -0.9990461 0.9019349 0.8990011 -0.9992474 0.9205831 0.9187164 -0.999406 0.935998 0.9348146 -0.999531 0.948623 0.947875 -0.9996296 0.9588875 0.9584157 -0.9997074 0.9671841 0.9668871 -0.9997689 0.9738591 0.9736725 -0.9998174 0.9792098 0.9790927 -0.9998557 0.9834864 0.9834129 -0.999886 0.9868965 0.9868505 -0.9999099 0.9896108 0.989582 -0.9999288 0.9917681 0.9917501 -0.9999437 0.9934808 0.9934695 -0.1572498 0.9669269 0.1576697 -0.1572031 0.9669173 0.1574377 -0.1571463 0.9669053 0.1571463 -0.1574432 0.9669053 0.1571463 -0.1578188 0.9669053 0.1571463 -0.1582941 0.9669053 0.1571463 -0.1588953 0.9669053 0.1571463 -0.1596559 0.9669053 0.1571463 -0.1606182 0.9669053 0.1571463 -0.1618356 0.9669053 0.1571463 -0.1633758 0.9669053 0.1571463 -0.1653244 0.9669053 0.1571463 -0.1677895 0.9669053 0.1571463 -0.1709083 0.9669053 0.1571463 -0.1748539 0.9669053 0.1571463 -0.1798457 0.9669053 0.1571463 -0.1861609 0.9669053 0.1571463 -0.1941504 0.9669053 0.1571463 -0.2042583 0.9669053 0.1571463 -0.217046 0.9669053 0.1571463 -0.2332241 0.9669053 0.1571463 -0.2536915 0.9669053 0.1571463 -0.2795855 0.9669053 0.1571463 -0.3123447 0.9669053 0.1571463 -0.3537894 0.9669053 0.1571463 -0.4062223 0.9669053 0.1571463 -0.4725567 0.9669053 0.1571463 -0.5564784 0.9669053 0.1571463 -0.6626503 0.9669053 0.1571463 -0.7969715 0.9669053 0.1571463 -0.9669053 0.9669053 0.1571463 -0.9753908 0.8158707 0.2150342 -0.9814183 0.7173646 0.2782884 -0.9858141 0.6614184 0.3453439 -0.9890818 0.6385197 0.4143657 -0.9915455 0.6400249 0.4833811 -0.9934231 0.6583832 0.550464 -0.9948657 0.687277 0.6139219 -0.9959809 0.7216823 0.6724399 -0.9968473 0.7578377 0.7251537 -0.9975229 0.7931271 0.7716504 -0.9980512 0.8258991 0.8119096 -0.9984653 0.8552576 0.8462132 -0.9987904 0.8808555 0.8750451 -0.9990461 0.9027141 0.8990011 -0.9992474 0.9210788 0.9187164 -0.999406 0.9363123 0.9348146 -0.999531 0.9488217 0.947875 -0.9996296 0.9590128 0.9584157 -0.9997074 0.967263 0.9668871 -0.9997689 0.9739087 0.9736725 -0.9998174 0.9792409 0.9790927 -0.9998557 0.9835059 0.9834129 -0.999886 0.9869087 0.9868505 -0.9999099 0.9896185 0.989582 -0.9999288 0.9917729 0.9917501 -0.9999437 0.9934838 0.9934695 -0.2151269 0.9754027 0.2154385 -0.2150852 0.9753975 0.2152593 -0.2150342 0.9753908 0.2150342 -0.2152545 0.9753908 0.2150342 -0.2155333 0.9753908 0.2150342 -0.2158859 0.9753908 0.2150342 -0.216332 0.9753908 0.2150342 -0.2168964 0.9753908 0.2150342 -0.2176104 0.9753908 0.2150342 -0.2185137 0.9753908 0.2150342 -0.2196565 0.9753908 0.2150342 -0.2211023 0.9753908 0.2150342 -0.2229315 0.9753908 0.2150342 -0.2252456 0.9753908 0.2150342 -0.2281732 0.9753908 0.2150342 -0.2318771 0.9753908 0.2150342 -0.2365629 0.9753908 0.2150342 -0.2424911 0.9753908 0.2150342 -0.249991 0.9753908 0.2150342 -0.2594794 0.9753908 0.2150342 -0.2714835 0.9753908 0.2150342 -0.2866702 0.9753908 0.2150342 -0.3058834 0.9753908 0.2150342 -0.3301905 0.9753908 0.2150342 -0.3609422 0.9753908 0.2150342 -0.3998472 0.9753908 0.2150342 -0.4490669 0.9753908 0.2150342 -0.5113363 0.9753908 0.2150342 -0.5901152 0.9753908 0.2150342 -0.6897808 0.9753908 0.2150342 -0.8158707 0.9753908 0.2150342 -0.9753908 0.9753908 0.2150342 -0.9814183 0.8339379 0.2782884 -0.9858141 0.7453352 0.3453439 -0.9890818 0.6980319 0.4143657 -0.9915455 0.6816133 0.4833811 -0.9934231 0.6870354 0.550464 -0.9948657 0.7067525 0.6139219 -0.9959809 0.734756 0.6724399 -0.9968473 0.7665152 0.7251537 -0.9975229 0.7988291 0.7716504 -0.9980512 0.8296133 0.8119096 -0.9984653 0.8576588 0.8462132 -0.9987904 0.8823981 0.8750451 -0.9990461 0.9036999 0.8990011 -0.9992474 0.921706 0.9187164 -0.999406 0.9367099 0.9348146 -0.999531 0.9490731 0.947875 -0.9996296 0.9591713 0.9584157 -0.9997074 0.9673627 0.9668871 -0.9997689 0.9739714 0.9736725 -0.9998174 0.9792803 0.9790927 -0.9998557 0.9835306 0.9834129 -0.999886 0.9869242 0.9868505 -0.9999099 0.9896282 0.989582 -0.9999288 0.991779 0.9917501 -0.9999437 0.9934876 0.9934695 -0.2783684 0.9814251 0.2785962 -0.2783325 0.9814221 0.2784598 -0.2782884 0.9814183 0.2782884 -0.2784494 0.9814183 0.2782884 -0.2786531 0.9814183 0.2782884 -0.2789108 0.9814183 0.2782884 -0.2792368 0.9814183 0.2782884 -0.2796492 0.9814183 0.2782884 -0.280171 0.9814183 0.2782884 -0.2808311 0.9814183 0.2782884 -0.2816663 0.9814183 0.2782884 -0.2827228 0.9814183 0.2782884 -0.2840595 0.9814183 0.2782884 -0.2857506 0.9814183 0.2782884 -0.2878901 0.9814183 0.2782884 -0.2905967 0.9814183 0.2782884 -0.294021 0.9814183 0.2782884 -0.2983532 0.9814183 0.2782884 -0.303834 0.9814183 0.2782884 -0.3107679 0.9814183 0.2782884 -0.3195402 0.9814183 0.2782884 -0.3306382 0.9814183 0.2782884 -0.3446787 0.9814183 0.2782884 -0.3624418 0.9814183 0.2782884 -0.3849144 0.9814183 0.2782884 -0.4133451 0.9814183 0.2782884 -0.4493137 0.9814183 0.2782884 -0.4948186 0.9814183 0.2782884 -0.5523882 0.9814183 0.2782884 -0.6252213 0.9814183 0.2782884 -0.7173646 0.9814183 0.2782884 -0.8339379 0.9814183 0.2782884 -0.9814183 0.9814183 0.2782884 -0.9858141 0.8515008 0.3453439 -0.9890818 0.7733226 0.4143657 -0.9915455 0.7342281 0.4833811 -0.9934231 0.7232841 0.550464 -0.9948657 0.7313916 0.6139219 -0.9959809 0.7512959 0.6724399 -0.9968473 0.7774933 0.7251537 -0.9975229 0.8060429 0.7716504 -0.9980512 0.8343122 0.8119096 -0.9984653 0.8606967 0.8462132 -0.9987904 0.8843497 0.8750451 -0.9990461 0.9049471 0.8990011 -0.9992474 0.9224995 0.9187164 -0.999406 0.937213 0.9348146 -0.999531 0.9493911 0.947875 -0.9996296 0.9593718 0.9584157 -0.9997074 0.967489 0.9668871 -0.9997689 0.9740508 0.9736725 -0.9998174 0.9793301 0.9790927 -0.9998557 0.9835618 0.9834129 -0.999886 0.9869438 0.9868505 -0.9999099 0.9896404 0.989582 -0.9999288 0.9917867 0.9917501 -0.9999437 0.9934924 0.9934695 -0.3454107 0.9858181 0.3455746 -0.3453807 0.9858163 0.3454723 -0.3453439 0.9858141 0.3453439 -0.3454598 0.9858141 0.3453439 -0.3456064 0.9858141 0.3453439 -0.3457919 0.9858141 0.3453439 -0.3460265 0.9858141 0.3453439 -0.3463234 0.9858141 0.3453439 -0.3466991 0.9858141 0.3453439 -0.3471743 0.9858141 0.3453439 -0.3477754 0.9858141 0.3453439 -0.348536 0.9858141 0.3453439 -0.3494983 0.9858141 0.3453439 -0.3507156 0.9858141 0.3453439 -0.3522557 0.9858141 0.3453439 -0.3542041 0.9858141 0.3453439 -0.3566692 0.9858141 0.3453439 -0.3597877 0.9858141 0.3453439 -0.3637331 0.9858141 0.3453439 -0.3687246 0.9858141 0.3453439 -0.3750394 0.9858141 0.3453439 -0.3830285 0.9858141 0.3453439 -0.3931357 0.9858141 0.3453439 -0.4059227 0.9858141 0.3453439 -0.4220999 0.9858141 0.3453439 -0.4425661 0.9858141 0.3453439 -0.4684585 0.9858141 0.3453439 -0.5012158 0.9858141 0.3453439 -0.542658 0.9858141 0.3453439 -0.5950879 0.9858141 0.3453439 -0.6614184 0.9858141 0.3453439 -0.7453352 0.9858141 0.3453439 -0.8515008 0.9858141 0.3453439 -0.9858141 0.9858141 0.3453439 -0.9890818 0.868575 0.4143657 -0.9915455 0.8007926 0.4833811 -0.9934231 0.7691435 0.550464 -0.9948657 0.7625632 0.6139219 -0.9959809 0.772221 0.6724399 -0.9968473 0.7913821 0.7251537 -0.9975229 0.8151693 0.7716504 -0.9980512 0.8402569 0.8119096 -0.9984653 0.86454 0.8462132 -0.9987904 0.8868187 0.8750451 -0.9990461 0.9065249 0.8990011 -0.9992474 0.9235034 0.9187164 -0.999406 0.9378494 0.9348146 -0.999531 0.9497934 0.947875 -0.9996296 0.9596255 0.9584157 -0.9997074 0.9676487 0.9668871 -0.9997689 0.9741511 0.9736725 -0.9998174 0.9793931 0.9790927 -0.9998557 0.9836013 0.9834129 -0.999886 0.9869685 0.9868505 -0.9999099 0.9896559 0.989582 -0.9999288 0.9917964 0.9917501 -0.9999437 0.9934984 0.9934695 -0.4144197 0.9890841 0.414536 -0.4143955 0.9890831 0.4144605 -0.4143657 0.9890818 0.4143657 -0.4144479 0.9890818 0.4143657 -0.4145518 0.9890818 0.4143657 -0.4146834 0.9890818 0.4143657 -0.4148498 0.9890818 0.4143657 -0.4150604 0.9890818 0.4143657 -0.4153268 0.9890818 0.4143657 -0.4156638 0.9890818 0.4143657 -0.4160901 0.9890818 0.4143657 -0.4166295 0.9890818 0.4143657 -0.4173119 0.9890818 0.4143657 -0.4181752 0.9890818 0.4143657 -0.4192674 0.9890818 0.4143657 -0.4206492 0.9890818 0.4143657 -0.4223974 0.9890818 0.4143657 -0.424609 0.9890818 0.4143657 -0.427407 0.9890818 0.4143657 -0.4309468 0.9890818 0.4143657 -0.4354252 0.9890818 0.4143657 -0.4410909 0.9890818 0.4143657 -0.4482588 0.9890818 0.4143657 -0.457327 0.9890818 0.4143657 -0.4687996 0.9890818 0.4143657 -0.4833138 0.9890818 0.4143657 -0.5016763 0.9890818 0.4143657 -0.5249071 0.9890818 0.4143657 -0.5542971 0.9890818 0.4143657 -0.5914794 0.9890818 0.4143657 -0.6385197 0.9890818 0.4143657 -0.6980319 0.9890818 0.4143657 -0.7733226 0.9890818 0.4143657 -0.868575 0.9890818 0.4143657 -0.9890818 0.9890818 0.4143657 -0.9915455 0.8850054 0.4833811 -0.9934231 0.8271616 0.550464 -0.9948657 0.8019994 0.6139219 -0.9959809 0.7986941 0.6724399 -0.9968473 0.8089533 0.7251537 -0.9975229 0.8267153 0.7716504 -0.9980512 0.8477777 0.8119096 -0.9984653 0.8694023 0.8462132 -0.9987904 0.8899424 0.8750451 -0.9990461 0.908521 0.8990011 -0.9992474 0.9247734 0.9187164 -0.999406 0.9386546 0.9348146 -0.999531 0.9503023 0.947875 -0.9996296 0.9599465 0.9584157 -0.9997074 0.9678507 0.9668871 -0.9997689 0.9742781 0.9736725 -0.9998174 0.9794728 0.9790927 -0.9998557 0.9836513 0.9834129 -0.999886 0.9869999 0.9868505 -0.9999099 0.9896755 0.989582 -0.9999288 0.9918086 0.9917501 -0.9999437 0.9935061 0.9934695 -0.4834235 0.9915469 0.4835047 -0.4834045 0.9915463 0.4834499 -0.4833811 0.9915455 0.4833811 -0.4834385 0.9915455 0.4833811 -0.4835112 0.9915455 0.4833811 -0.4836031 0.9915455 0.4833811 -0.4837194 0.9915455 0.4833811 -0.4838665 0.9915455 0.4833811 -0.4840527 0.9915455 0.4833811 -0.4842882 0.9915455 0.4833811 -0.4845861 0.9915455 0.4833811 -0.4849631 0.9915455 0.4833811 -0.4854399 0.9915455 0.4833811 -0.4860432 0.9915455 0.4833811 -0.4868065 0.9915455 0.4833811 -0.4877721 0.9915455 0.4833811 -0.4889938 0.9915455 0.4833811 -0.4905393 0.9915455 0.4833811 -0.4924946 0.9915455 0.4833811 -0.4949683 0.9915455 0.4833811 -0.4980979 0.9915455 0.4833811 -0.5020572 0.9915455 0.4833811 -0.5070663 0.9915455 0.4833811 -0.5134034 0.9915455 0.4833811 -0.5214207 0.9915455 0.4833811 -0.5315636 0.9915455 0.4833811 -0.5443956 0.9915455 0.4833811 -0.5606299 0.9915455 0.4833811 -0.5811683 0.9915455 0.4833811 -0.607152 0.9915455 0.4833811 -0.6400249 0.9915455 0.4833811 -0.6816133 0.9915455 0.4833811 -0.7342281 0.9915455 0.4833811 -0.8007926 0.9915455 0.4833811 -0.8850054 0.9915455 0.4833811 -0.9915455 0.9915455 0.4833811 -0.9934231 0.900562 0.550464 -0.9948657 0.8518913 0.6139219 -0.9959809 0.8321859 0.6724399 -0.9968473 0.831183 0.7251537 -0.9975229 0.8413226 0.7716504 -0.9980512 0.8572925 0.8119096 -0.9984653 0.8755537 0.8462132 -0.9987904 0.8938942 0.8750451 -0.9990461 0.9110464 0.8990011 -0.9992474 0.9263802 0.9187164 -0.999406 0.9396732 0.9348146 -0.999531 0.9509463 0.947875 -0.9996296 0.9603526 0.9584157 -0.9997074 0.9681063 0.9668871 -0.9997689 0.9744388 0.9736725 -0.9998174 0.9795737 0.9790927 -0.9998557 0.9837145 0.9834129 -0.999886 0.9870395 0.9868505 -0.9999099 0.9897004 0.989582 -0.9999288 0.9918242 0.9917501 -0.9999437 0.9935158 0.9934695 -0.5504963 0.993424 0.5505523 -0.5504818 0.9934236 0.5505131 -0.550464 0.9934231 0.550464 -0.5505035 0.9934231 0.550464 -0.5505536 0.9934231 0.550464 -0.5506169 0.9934231 0.550464 -0.5506971 0.9934231 0.550464 -0.5507984 0.9934231 0.550464 -0.5509267 0.9934231 0.550464 -0.5510889 0.9934231 0.550464 -0.5512942 0.9934231 0.550464 -0.5515539 0.9934231 0.550464 -0.5518824 0.9934231 0.550464 -0.5522981 0.9934231 0.550464 -0.5528239 0.9934231 0.550464 -0.5534892 0.9934231 0.550464 -0.5543308 0.9934231 0.550464 -0.5553956 0.9934231 0.550464 -0.5567427 0.9934231 0.550464 -0.558447 0.9934231 0.550464 -0.5606031 0.9934231 0.550464 -0.5633309 0.9934231 0.550464 -0.5667818 0.9934231 0.550464 -0.5711477 0.9934231 0.550464 -0.5766712 0.9934231 0.550464 -0.5836591 0.9934231 0.550464 -0.5924997 0.9934231 0.550464 -0.6036842 0.9934231 0.550464 -0.6178341 0.9934231 0.550464 -0.6357355 0.9934231 0.550464 -0.6583832 0.9934231 0.550464 -0.6870354 0.9934231 0.550464 -0.7232841 0.9934231 0.550464 -0.7691435 0.9934231 0.550464 -0.8271616 0.9934231 0.550464 -0.900562 0.9934231 0.550464 -0.9934231 0.9934231 0.550464 -0.9948657 0.915011 0.6139219 -0.9959809 0.8745575 0.6724399 -0.9968473 0.8593065 0.7251537 -0.9975229 0.8598026 0.7716504 -0.9980512 0.86933 0.8119096 -0.9984653 0.8833361 0.8462132 -0.9987904 0.8988938 0.8750451 -0.9990461 0.9142413 0.8990011 -0.9992474 0.928413 0.9187164 -0.999406 0.9409619 0.9348146 -0.999531 0.9517609 0.947875 -0.9996296 0.9608664 0.9584157 -0.9997074 0.9684297 0.9668871 -0.9997689 0.974642 0.9736725 -0.9998174 0.9797012 0.9790927 -0.9998557 0.9837945 0.9834129 -0.999886 0.9870896 0.9868505 -0.9999099 0.9897318 0.989582 -0.9999288 0.9918438 0.9917501 -0.9999437 0.9935281 0.9934695 -0.6139459 0.9948662 0.6139839 -0.6139352 0.994866 0.6139564 -0.6139219 0.9948657 0.6139219 -0.6139488 0.9948657 0.6139219 -0.6139828 0.9948657 0.6139219 -0.6140259 0.9948657 0.6139219 -0.6140804 0.9948657 0.6139219 -0.6141493 0.9948657 0.6139219 -0.6142364 0.9948657 0.6139219 -0.6143467 0.9948657 0.6139219 -0.6144862 0.9948657 0.6139219 -0.6146628 0.9948657 0.6139219 -0.6148861 0.9948657 0.6139219 -0.6151686 0.9948657 0.6139219 -0.615526 0.9948657 0.6139219 -0.6159782 0.9948657 0.6139219 -0.6165503 0.9948657 0.6139219 -0.6172741 0.9948657 0.6139219 -0.6181897 0.9948657 0.6139219 -0.6193482 0.9948657 0.6139219 -0.6208137 0.9948657 0.6139219 -0.6226678 0.9948657 0.6139219 -0.6250135 0.9948657 0.6139219 -0.6279812 0.9948657 0.6139219 -0.6317356 0.9948657 0.6139219 -0.6364854 0.9948657 0.6139219 -0.6424946 0.9948657 0.6139219 -0.6500969 0.9948657 0.6139219 -0.6597149 0.9948657 0.6139219 -0.6718829 0.9948657 0.6139219 -0.687277 0.9948657 0.6139219 -0.7067525 0.9948657 0.6139219 -0.7313916 0.9948657 0.6139219 -0.7625632 0.9948657 0.6139219 -0.8019994 0.9948657 0.6139219 -0.8518913 0.9948657 0.6139219 -0.915011 0.9948657 0.6139219 -0.9948657 0.9948657 0.6139219 -0.9959809 0.928163 0.6724399 -0.9968473 0.8948865 0.7251537 -0.9975229 0.8831823 0.7716504 -0.9980512 0.8845591 0.8119096 -0.9984653 0.8931818 0.8462132 -0.9987904 0.905219 0.8750451 -0.9990461 0.9182833 0.8990011 -0.9992474 0.9309847 0.9187164 -0.999406 0.9425924 0.9348146 -0.999531 0.9527916 0.947875 -0.9996296 0.9615163 0.9584157 -0.9997074 0.9688388 0.9668871 -0.9997689 0.9748991 0.9736725 -0.9998174 0.9798626 0.9790927 -0.9998557 0.9838958 0.9834129 -0.999886 0.9871531 0.9868505 -0.9999099 0.9897715 0.989582 -0.9999288 0.9918687 0.9917501 -0.9999437 0.9935437 0.9934695 -0.6724572 0.9959813 0.6724827 -0.6724495 0.9959811 0.6724637 -0.6724399 0.9959809 0.6724399 -0.6724579 0.9959809 0.6724399 -0.6724808 0.9959809 0.6724399 -0.6725097 0.9959809 0.6724399 -0.6725462 0.9959809 0.6724399 -0.6725925 0.9959809 0.6724399 -0.672651 0.9959809 0.6724399 -0.672725 0.9959809 0.6724399 -0.6728187 0.9959809 0.6724399 -0.6729372 0.9959809 0.6724399 -0.6730871 0.9959809 0.6724399 -0.6732768 0.9959809 0.6724399 -0.6735167 0.9959809 0.6724399 -0.6738202 0.9959809 0.6724399 -0.6742043 0.9959809 0.6724399 -0.6746901 0.9959809 0.6724399 -0.6753048 0.9959809 0.6724399 -0.6760824 0.9959809 0.6724399 -0.6770662 0.9959809 0.6724399 -0.6783109 0.9959809 0.6724399 -0.6798855 0.9959809 0.6724399 -0.6818777 0.9959809 0.6724399 -0.684398 0.9959809 0.6724399 -0.6875865 0.9959809 0.6724399 -0.6916203 0.9959809 0.6724399 -0.6967237 0.9959809 0.6724399 -0.7031802 0.9959809 0.6724399 -0.7113484 0.9959809 0.6724399 -0.7216823 0.9959809 0.6724399 -0.734756 0.9959809 0.6724399 -0.7512959 0.9959809 0.6724399 -0.772221 0.9959809 0.6724399 -0.7986941 0.9959809 0.6724399 -0.8321859 0.9959809 0.6724399 -0.8745575 0.9959809 0.6724399 -0.928163 0.9959809 0.6724399 -0.9959809 0.9959809 0.6724399 -0.9968473 0.9398997 0.7251537 -0.9975229 0.9127607 0.7716504 -0.9980512 0.9038257 0.8119096 -0.9984653 0.9056379 0.8462132 -0.9987904 0.9132211 0.8750451 -0.9990461 0.9233969 0.8990011 -0.9992474 0.9342383 0.9187164 -0.999406 0.944655 0.9348146 -0.999531 0.9540954 0.947875 -0.9996296 0.9623386 0.9584157 -0.9997074 0.9693564 0.9668871 -0.9997689 0.9752244 0.9736725 -0.9998174 0.9800668 0.9790927 -0.9998557 0.9840238 0.9834129 -0.999886 0.9872333 0.9868505 -0.9999099 0.9898217 0.989582 -0.9999288 0.9919002 0.9917501 -0.9999437 0.9935634 0.9934695 -0.7251659 0.9968475 0.7251829 -0.7251605 0.9968474 0.72517 -0.7251537 0.9968473 0.7251537 -0.7251657 0.9968473 0.7251537 -0.7251809 0.9968473 0.7251537 -0.7252001 0.9968473 0.7251537 -0.7252243 0.9968473 0.7251537 -0.725255 0.9968473 0.7251537 -0.7252939 0.9968473 0.7251537 -0.725343 0.9968473 0.7251537 -0.7254052 0.9968473 0.7251537 -0.7254838 0.9968473 0.7251537 -0.7255833 0.9968473 0.7251537 -0.7257092 0.9968473 0.7251537 -0.7258685 0.9968473 0.7251537 -0.7260699 0.9968473 0.7251537 -0.7263248 0.9968473 0.7251537 -0.7266473 0.9968473 0.7251537 -0.7270553 0.9968473 0.7251537 -0.7275714 0.9968473 0.7251537 -0.7282244 0.9968473 0.7251537 -0.7290505 0.9968473 0.7251537 -0.7300957 0.9968473 0.7251537 -0.7314179 0.9968473 0.7251537 -0.7330907 0.9968473 0.7251537 -0.7352071 0.9968473 0.7251537 -0.7378845 0.9968473 0.7251537 -0.7412718 0.9968473 0.7251537 -0.7455572 0.9968473 0.7251537 -0.7509787 0.9968473 0.7251537 -0.7578377 0.9968473 0.7251537 -0.7665152 0.9968473 0.7251537 -0.7774933 0.9968473 0.7251537 -0.7913821 0.9968473 0.7251537 -0.8089533 0.9968473 0.7251537 -0.831183 0.9968473 0.7251537 -0.8593065 0.9968473 0.7251537 -0.8948865 0.9968473 0.7251537 -0.9398997 0.9968473 0.7251537 -0.9968473 0.9968473 0.7251537 -0.9975229 0.9501811 0.7716504 -0.9980512 0.9282006 0.8119096 -0.9984653 0.9213965 0.8462132 -0.9987904 0.9233448 0.8750451 -0.9990461 0.9298664 0.8990011 -0.9992474 0.9383544 0.9187164 -0.999406 0.9472646 0.9348146 -0.999531 0.955745 0.947875 -0.9996296 0.9633789 0.9584157 -0.9997074 0.9700112 0.9668871 -0.9997689 0.975636 0.9736725 -0.9998174 0.9803252 0.9790927 -0.9998557 0.9841858 0.9834129 -0.999886 0.9873348 0.9868505 -0.9999099 0.9898853 0.989582 -0.9999288 0.99194 0.9917501 -0.9999437 0.9935883 0.9934695 -0.7716588 0.997523 0.77167 -0.7716551 0.997523 0.7716613 -0.7716504 0.9975229 0.7716504 -0.7716583 0.9975229 0.7716504 -0.7716682 0.9975229 0.7716504 -0.7716808 0.9975229 0.7716504 -0.7716968 0.9975229 0.7716504 -0.7717169 0.9975229 0.7716504 -0.7717425 0.9975229 0.7716504 -0.7717748 0.9975229 0.7716504 -0.7718156 0.9975229 0.7716504 -0.7718673 0.9975229 0.7716504 -0.7719327 0.9975229 0.7716504 -0.7720154 0.9975229 0.7716504 -0.77212 0.9975229 0.7716504 -0.7722524 0.9975229 0.7716504 -0.7724199 0.9975229 0.7716504 -0.7726318 0.9975229 0.7716504 -0.7728999 0.9975229 0.7716504 -0.7732391 0.9975229 0.7716504 -0.7736681 0.9975229 0.7716504 -0.774211 0.9975229 0.7716504 -0.7748978 0.9975229 0.7716504 -0.7757666 0.9975229 0.7716504 -0.7768658 0.9975229 0.7716504 -0.7782565 0.9975229 0.7716504 -0.7800158 0.9975229 0.7716504 -0.7822416 0.9975229 0.7716504 -0.7850576 0.9975229 0.7716504 -0.7886201 0.9975229 0.7716504 -0.7931271 0.9975229 0.7716504 -0.7988291 0.9975229 0.7716504 -0.8060429 0.9975229 0.7716504 -0.8151693 0.9975229 0.7716504 -0.8267153 0.9975229 0.7716504 -0.8413226 0.9975229 0.7716504 -0.8598026 0.9975229 0.7716504 -0.8831823 0.9975229 0.7716504 -0.9127607 0.9975229 0.7716504 -0.9501811 0.9975229 0.7716504 -0.9975229 0.9975229 0.7716504 -0.9980512 0.9590379 0.8119096 -0.9984653 0.9413331 0.8462132 -0.9987904 0.9361526 0.8750451 -0.9990461 0.938051 0.8990011 -0.9992474 0.9435619 0.9187164 -0.999406 0.950566 0.9348146 -0.999531 0.957832 0.947875 -0.9996296 0.964695 0.9584157 -0.9997074 0.9708397 0.9668871 -0.9997689 0.9761567 0.9736725 -0.9998174 0.980652 0.9790927 -0.9998557 0.9843908 0.9834129 -0.999886 0.9874633 0.9868505 -0.9999099 0.9899658 0.989582 -0.9999288 0.9919903 0.9917501 -0.9999437 0.9936198 0.9934695 -0.8119154 0.9980513 0.8119226 -0.8119128 0.9980512 0.8119169 -0.8119096 0.9980512 0.8119096 -0.8119148 0.9980512 0.8119096 -0.8119213 0.9980512 0.8119096 -0.8119295 0.9980512 0.8119096 -0.8119399 0.9980512 0.8119096 -0.811953 0.9980512 0.8119096 -0.8119696 0.9980512 0.8119096 -0.8119906 0.9980512 0.8119096 -0.8120173 0.9980512 0.8119096 -0.8120509 0.9980512 0.8119096 -0.8120935 0.9980512 0.8119096 -0.8121474 0.9980512 0.8119096 -0.8122156 0.9980512 0.8119096 -0.8123018 0.9980512 0.8119096 -0.8124109 0.9980512 0.8119096 -0.8125489 0.9980512 0.8119096 -0.8127235 0.9980512 0.8119096 -0.8129445 0.9980512 0.8119096 -0.813224 0.9980512 0.8119096 -0.8135776 0.9980512 0.8119096 -0.8140249 0.9980512 0.8119096 -0.8145909 0.9980512 0.8119096 -0.8153069 0.9980512 0.8119096 -0.8162127 0.9980512 0.8119096 -0.8173587 0.9980512 0.8119096 -0.8188085 0.9980512 0.8119096 -0.8206428 0.9980512 0.8119096 -0.8229633 0.9980512 0.8119096 -0.8258991 0.9980512 0.8119096 -0.8296133 0.9980512 0.8119096 -0.8343122 0.9980512 0.8119096 -0.8402569 0.9980512 0.8119096 -0.8477777 0.9980512 0.8119096 -0.8572925 0.9980512 0.8119096 -0.86933 0.9980512 0.8119096 -0.8845591 0.9980512 0.8119096 -0.9038257 0.9980512 0.8119096 -0.9282006 0.9980512 0.8119096 -0.9590379 0.9980512 0.8119096 -0.9980512 0.9980512 0.8119096 -0.9984653 0.9665556 0.8462132 -0.9987904 0.9523562 0.8750451 -0.9990461 0.9484057 0.8990011 -0.9992474 0.9501501 0.9187164 -0.999406 0.9547427 0.9348146 -0.999531 0.9604722 0.947875 -0.9996296 0.9663601 0.9584157 -0.9997074 0.9718878 0.9668871 -0.9997689 0.9768154 0.9736725 -0.9998174 0.9810655 0.9790927 -0.9998557 0.9846501 0.9834129 -0.999886 0.9876258 0.9868505 -0.9999099 0.9900675 0.989582 -0.9999288 0.992054 0.9917501 -0.9999437 0.9936596 0.9934695 -0.8462171 0.9984653 0.8462218 -0.8462154 0.9984653 0.846218 -0.8462132 0.9984653 0.8462132 -0.8462165 0.9984653 0.8462132 -0.8462207 0.9984653 0.8462132 -0.846226 0.9984653 0.8462132 -0.8462328 0.9984653 0.8462132 -0.8462413 0.9984653 0.8462132 -0.846252 0.9984653 0.8462132 -0.8462656 0.9984653 0.8462132 -0.8462828 0.9984653 0.8462132 -0.8463046 0.9984653 0.8462132 -0.8463321 0.9984653 0.8462132 -0.8463669 0.9984653 0.8462132 -0.846411 0.9984653 0.8462132 -0.8464668 0.9984653 0.8462132 -0.8465373 0.9984653 0.8462132 -0.8466265 0.9984653 0.8462132 -0.8467394 0.9984653 0.8462132 -0.8468823 0.9984653 0.8462132 -0.8470629 0.9984653 0.8462132 -0.8472916 0.9984653 0.8462132 -0.8475808 0.9984653 0.8462132 -0.8479467 0.9984653 0.8462132 -0.8484096 0.9984653 0.8462132 -0.8489952 0.9984653 0.8462132 -0.8497361 0.9984653 0.8462132 -0.8506734 0.9984653 0.8462132 -0.8518593 0.9984653 0.8462132 -0.8533595 0.9984653 0.8462132 -0.8552576 0.9984653 0.8462132 -0.8576588 0.9984653 0.8462132 -0.8606967 0.9984653 0.8462132 -0.86454 0.9984653 0.8462132 -0.8694023 0.9984653 0.8462132 -0.8755537 0.9984653 0.8462132 -0.8833361 0.9984653 0.8462132 -0.8931818 0.9984653 0.8462132 -0.9056379 0.9984653 0.8462132 -0.9213965 0.9984653 0.8462132 -0.9413331 0.9984653 0.8462132 -0.9665556 0.9984653 0.8462132 -0.9984653 0.9984653 0.8462132 -0.9987904 0.9728558 0.8750451 -0.9990461 0.9615057 0.8990011 -0.9992474 0.9584849 0.9187164 -0.999406 0.9600268 0.9348146 -0.999531 0.9638125 0.947875 -0.9996296 0.9684666 0.9584157 -0.9997074 0.9732137 0.9668871 -0.9997689 0.9776487 0.9736725 -0.9998174 0.9815886 0.9790927 -0.9998557 0.9849782 0.9834129 -0.999886 0.9878313 0.9868505 -0.9999099 0.9901963 0.989582 -0.9999288 0.9921346 0.9917501 -0.9999437 0.9937101 0.9934695 -0.8750477 0.9987905 0.8750507 -0.8750466 0.9987905 0.8750482 -0.8750451 0.9987904 0.8750451 -0.8750473 0.9987904 0.8750451 -0.87505 0.9987904 0.8750451 -0.8750534 0.9987904 0.8750451 -0.8750577 0.9987904 0.8750451 -0.8750631 0.9987904 0.8750451 -0.8750701 0.9987904 0.8750451 -0.8750788 0.9987904 0.8750451 -0.8750898 0.9987904 0.8750451 -0.8751038 0.9987904 0.8750451 -0.8751215 0.9987904 0.8750451 -0.8751439 0.9987904 0.8750451 -0.8751722 0.9987904 0.8750451 -0.875208 0.9987904 0.8750451 -0.8752533 0.9987904 0.8750451 -0.8753107 0.9987904 0.8750451 -0.8753832 0.9987904 0.8750451 -0.8754749 0.9987904 0.8750451 -0.875591 0.9987904 0.8750451 -0.8757379 0.9987904 0.8750451 -0.8759237 0.9987904 0.8750451 -0.8761587 0.9987904 0.8750451 -0.8764561 0.9987904 0.8750451 -0.8768324 0.9987904 0.8750451 -0.8773083 0.9987904 0.8750451 -0.8779105 0.9987904 0.8750451 -0.8786723 0.9987904 0.8750451 -0.8796361 0.9987904 0.8750451 -0.8808555 0.9987904 0.8750451 -0.8823981 0.9987904 0.8750451 -0.8843497 0.9987904 0.8750451 -0.8868187 0.9987904 0.8750451 -0.8899424 0.9987904 0.8750451 -0.8938942 0.9987904 0.8750451 -0.8988938 0.9987904 0.8750451 -0.905219 0.9987904 0.8750451 -0.9132211 0.9987904 0.8750451 -0.9233448 0.9987904 0.8750451 -0.9361526 0.9987904 0.8750451 -0.9523562 0.9987904 0.8750451 -0.9728558 0.9987904 0.8750451 -0.9987904 0.9987904 0.8750451 -0.9990461 0.9780789 0.8990011 -0.9992474 0.9690296 0.9187164 -0.999406 0.9667119 0.9348146 -0.999531 0.9680383 0.947875 -0.9996296 0.9711316 0.9584157 -0.9997074 0.9748912 0.9668871 -0.9997689 0.978703 0.9736725 -0.9998174 0.9822504 0.9790927 -0.9998557 0.9853932 0.9834129 -0.999886 0.9880914 0.9868505 -0.9999099 0.9903591 0.989582 -0.9999288 0.9922365 0.9917501 -0.9999437 0.9937739 0.9934695 -0.8990028 0.9990461 0.8990047 -0.899002 0.9990461 0.8990031 -0.8990011 0.9990461 0.8990011 -0.8990025 0.9990461 0.8990011 -0.8990042 0.9990461 0.8990011 -0.8990064 0.9990461 0.8990011 -0.8990091 0.9990461 0.8990011 -0.8990126 0.9990461 0.8990011 -0.899017 0.9990461 0.8990011 -0.8990226 0.9990461 0.8990011 -0.8990297 0.9990461 0.8990011 -0.8990386 0.9990461 0.8990011 -0.8990499 0.9990461 0.8990011 -0.8990642 0.9990461 0.8990011 -0.8990823 0.9990461 0.8990011 -0.8991052 0.9990461 0.8990011 -0.8991342 0.9990461 0.8990011 -0.8991708 0.9990461 0.8990011 -0.8992171 0.9990461 0.8990011 -0.8992758 0.9990461 0.8990011 -0.89935 0.9990461 0.8990011 -0.8994438 0.9990461 0.8990011 -0.8995625 0.9990461 0.8990011 -0.8997128 0.9990461 0.8990011 -0.8999028 0.9990461 0.8990011 -0.9001432 0.9990461 0.8990011 -0.9004474 0.9990461 0.8990011 -0.9008322 0.9990461 0.8990011 -0.901319 0.9990461 0.8990011 -0.9019349 0.9990461 0.8990011 -0.9027141 0.9990461 0.8990011 -0.9036999 0.9990461 0.8990011 -0.9049471 0.9990461 0.8990011 -0.9065249 0.9990461 0.8990011 -0.908521 0.9990461 0.8990011 -0.9110464 0.9990461 0.8990011 -0.9142413 0.9990461 0.8990011 -0.9182833 0.9990461 0.8990011 -0.9233969 0.9990461 0.8990011 -0.9298664 0.9990461 0.8990011 -0.938051 0.9990461 0.8990011 -0.9484057 0.9990461 0.8990011 -0.9615057 0.9990461 0.8990011 -0.9780789 0.9990461 0.8990011 -0.9990461 0.9990461 0.8990011 -0.9992474 0.98237 0.9187164 -0.999406 0.9751694 0.9348146 -0.999531 0.9733846 0.947875 -0.9996296 0.9745032 0.9584157 -0.9997074 0.9770135 0.9668871 -0.9997689 0.9800368 0.9736725 -0.9998174 0.9830877 0.9790927 -0.9998557 0.9859183 0.9834129 -0.999886 0.9884204 0.9868505 -0.9999099 0.9905652 0.989582 -0.9999288 0.9923655 0.9917501 -0.9999437 0.9938546 0.9934695 -0.9187175 0.9992474 0.9187187 -0.918717 0.9992474 0.9187177 -0.9187164 0.9992474 0.9187164 -0.9187173 0.9992474 0.9187164 -0.9187184 0.9992474 0.9187164 -0.9187198 0.9992474 0.9187164 -0.9187215 0.9992474 0.9187164 -0.9187237 0.9992474 0.9187164 -0.9187266 0.9992474 0.9187164 -0.9187301 0.9992474 0.9187164 -0.9187346 0.9992474 0.9187164 -0.9187403 0.9992474 0.9187164 -0.9187475 0.9992474 0.9187164 -0.9187566 0.9992474 0.9187164 -0.9187681 0.9992474 0.9187164 -0.9187826 0.9992474 0.9187164 -0.9188011 0.9992474 0.9187164 -0.9188244 0.9992474 0.9187164 -0.9188539 0.9992474 0.9187164 -0.9188912 0.9992474 0.9187164 -0.9189384 0.9992474 0.9187164 -0.9189981 0.9992474 0.9187164 -0.9190736 0.9992474 0.9187164 -0.9191692 0.9992474 0.9187164 -0.9192901 0.9992474 0.9187164 -0.9194431 0.9992474 0.9187164 -0.9196366 0.9992474 0.9187164 -0.9198814 0.9992474 0.9187164 -0.9201912 0.9992474 0.9187164 -0.9205831 0.9992474 0.9187164 -0.9210788 0.9992474 0.9187164 -0.921706 0.9992474 0.9187164 -0.9224995 0.9992474 0.9187164 -0.9235034 0.9992474 0.9187164 -0.9247734 0.9992474 0.9187164 -0.9263802 0.9992474 0.9187164 -0.928413 0.9992474 0.9187164 -0.9309847 0.9992474 0.9187164 -0.9342383 0.9992474 0.9187164 -0.9383544 0.9992474 0.9187164 -0.9435619 0.9992474 0.9187164 -0.9501501 0.9992474 0.9187164 -0.9584849 0.9992474 0.9187164 -0.9690296 0.9992474 0.9187164 -0.98237 0.9992474 0.9187164 -0.9992474 0.9992474 0.9187164 -0.999406 0.9858693 0.9348146 -0.999531 0.9801483 0.947875 -0.9996296 0.9787687 0.9584157 -0.9997074 0.9796984 0.9668871 -0.9997689 0.9817243 0.9736725 -0.9998174 0.984147 0.9790927 -0.9998557 0.9865826 0.9834129 -0.999886 0.9888367 0.9868505 -0.9999099 0.9908259 0.989582 -0.9999288 0.9925287 0.9917501 -0.9999437 0.9939567 0.9934695 -0.9348153 0.999406 0.934816 -0.9348149 0.999406 0.9348154 -0.9348146 0.999406 0.9348146 -0.9348151 0.999406 0.9348146 -0.9348158 0.999406 0.9348146 -0.9348167 0.999406 0.9348146 -0.9348178 0.999406 0.9348146 -0.9348192 0.999406 0.9348146 -0.934821 0.999406 0.9348146 -0.9348232 0.999406 0.9348146 -0.9348261 0.999406 0.9348146 -0.9348297 0.999406 0.9348146 -0.9348342 0.999406 0.9348146 -0.93484 0.999406 0.9348146 -0.9348473 0.999406 0.9348146 -0.9348565 0.999406 0.9348146 -0.9348682 0.999406 0.9348146 -0.934883 0.999406 0.9348146 -0.9349017 0.999406 0.9348146 -0.9349253 0.999406 0.9348146 -0.9349553 0.999406 0.9348146 -0.9349931 0.999406 0.9348146 -0.935041 0.999406 0.9348146 -0.9351016 0.999406 0.9348146 -0.9351783 0.999406 0.9348146 -0.9352752 0.999406 0.9348146 -0.9353979 0.999406 0.9348146 -0.9355532 0.999406 0.9348146 -0.9357495 0.999406 0.9348146 -0.935998 0.999406 0.9348146 -0.9363123 0.999406 0.9348146 -0.9367099 0.999406 0.9348146 -0.937213 0.999406 0.9348146 -0.9378494 0.999406 0.9348146 -0.9386546 0.999406 0.9348146 -0.9396732 0.999406 0.9348146 -0.9409619 0.999406 0.9348146 -0.9425924 0.999406 0.9348146 -0.944655 0.999406 0.9348146 -0.9472646 0.999406 0.9348146 -0.950566 0.999406 0.9348146 -0.9547427 0.999406 0.9348146 -0.9600268 0.999406 0.9348146 -0.9667119 0.999406 0.9348146 -0.9751694 0.999406 0.9348146 -0.9858693 0.999406 0.9348146 -0.999406 0.999406 0.9348146 -0.999531 0.9887053 0.947875 -0.9996296 0.9841652 0.9584157 -0.9997074 0.9830952 0.9668871 -0.9997689 0.9838591 0.9736725 -0.9998174 0.9854871 0.9790927 -0.9998557 0.987423 0.9834129 -0.999886 0.9893633 0.9868505 -0.9999099 0.9911557 0.989582 -0.9999288 0.9927351 0.9917501 -0.9999437 0.9940858 0.9934695 -0.9478754 0.999531 0.9478759 -0.9478752 0.999531 0.9478755 -0.947875 0.999531 0.947875 -0.9478753 0.999531 0.947875 -0.9478757 0.999531 0.947875 -0.9478763 0.999531 0.947875 -0.947877 0.999531 0.947875 -0.9478779 0.999531 0.947875 -0.947879 0.999531 0.947875 -0.9478804 0.999531 0.947875 -0.9478822 0.999531 0.947875 -0.9478845 0.999531 0.947875 -0.9478874 0.999531 0.947875 -0.947891 0.999531 0.947875 -0.9478957 0.999531 0.947875 -0.9479015 0.999531 0.947875 -0.9479089 0.999531 0.947875 -0.9479182 0.999531 0.947875 -0.94793 0.999531 0.947875 -0.947945 0.999531 0.947875 -0.9479639 0.999531 0.947875 -0.9479878 0.999531 0.947875 -0.9480181 0.999531 0.947875 -0.9480564 0.999531 0.947875 -0.9481049 0.999531 0.947875 -0.9481662 0.999531 0.947875 -0.9482437 0.999531 0.947875 -0.9483418 0.999531 0.947875 -0.948466 0.999531 0.947875 -0.948623 0.999531 0.947875 -0.9488217 0.999531 0.947875 -0.9490731 0.999531 0.947875 -0.9493911 0.999531 0.947875 -0.9497934 0.999531 0.947875 -0.9503023 0.999531 0.947875 -0.9509463 0.999531 0.947875 -0.9517609 0.999531 0.947875 -0.9527916 0.999531 0.947875 -0.9540954 0.999531 0.947875 -0.955745 0.999531 0.947875 -0.957832 0.999531 0.947875 -0.9604722 0.999531 0.947875 -0.9638125 0.999531 0.947875 -0.9680383 0.999531 0.947875 -0.9733846 0.999531 0.947875 -0.9801483 0.999531 0.947875 -0.9887053 0.999531 0.947875 -0.999531 0.999531 0.947875 -0.9996296 0.9909923 0.9584157 -0.9997074 0.9873925 0.9668871 -0.9997689 0.98656 0.9736725 -0.9998174 0.9871825 0.9790927 -0.9998557 0.9884862 0.9834129 -0.999886 0.9900296 0.9868505 -0.9999099 0.9915729 0.989582 -0.9999288 0.9929963 0.9917501 -0.9999437 0.9942492 0.9934695 -0.958416 0.9996296 0.9584163 -0.9584159 0.9996296 0.958416 -0.9584157 0.9996296 0.9584157 -0.9584159 0.9996296 0.9584157 -0.9584162 0.9996296 0.9584157 -0.9584165 0.9996296 0.9584157 -0.958417 0.9996296 0.9584157 -0.9584176 0.9996296 0.9584157 -0.9584183 0.9996296 0.9584157 -0.9584192 0.9996296 0.9584157 -0.9584203 0.9996296 0.9584157 -0.9584217 0.9996296 0.9584157 -0.9584235 0.9996296 0.9584157 -0.9584258 0.9996296 0.9584157 -0.9584288 0.9996296 0.9584157 -0.9584324 0.9996296 0.9584157 -0.9584371 0.9996296 0.9584157 -0.958443 0.9996296 0.9584157 -0.9584504 0.9996296 0.9584157 -0.9584599 0.9996296 0.9584157 -0.9584718 0.9996296 0.9584157 -0.9584869 0.9996296 0.9584157 -0.958506 0.9996296 0.9584157 -0.9585301 0.9996296 0.9584157 -0.9585607 0.9996296 0.9584157 -0.9585994 0.9996296 0.9584157 -0.9586483 0.9996296 0.9584157 -0.9587101 0.9996296 0.9584157 -0.9587884 0.9996296 0.9584157 -0.9588875 0.9996296 0.9584157 -0.9590128 0.9996296 0.9584157 -0.9591713 0.9996296 0.9584157 -0.9593718 0.9996296 0.9584157 -0.9596255 0.9996296 0.9584157 -0.9599465 0.9996296 0.9584157 -0.9603526 0.9996296 0.9584157 -0.9608664 0.9996296 0.9584157 -0.9615163 0.9996296 0.9584157 -0.9623386 0.9996296 0.9584157 -0.9633789 0.9996296 0.9584157 -0.964695 0.9996296 0.9584157 -0.9663601 0.9996296 0.9584157 -0.9684666 0.9996296 0.9584157 -0.9711316 0.9996296 0.9584157 -0.9745032 0.9996296 0.9584157 -0.9787687 0.9996296 0.9584157 -0.9841652 0.9996296 0.9584157 -0.9909923 0.9996296 0.9584157 -0.9996296 0.9996296 0.9584157 -0.9997074 0.9928293 0.9668871 -0.9997689 0.989977 0.9736725 -0.9998174 0.9893274 0.9790927 -0.9998557 0.9898313 0.9834129 -0.999886 0.9908725 0.9868505 -0.9999099 0.9921008 0.989582 -0.9999288 0.9933267 0.9917501 -0.9999437 0.994456 0.9934695 -0.9668873 0.9997074 0.9668875 -0.9668872 0.9997074 0.9668874 -0.9668871 0.9997074 0.9668871 -0.9668873 0.9997074 0.9668871 -0.9668875 0.9997074 0.9668871 -0.9668877 0.9997074 0.9668871 -0.966888 0.9997074 0.9668871 -0.9668883 0.9997074 0.9668871 -0.9668888 0.9997074 0.9668871 -0.9668893 0.9997074 0.9668871 -0.96689 0.9997074 0.9668871 -0.9668909 0.9997074 0.9668871 -0.9668921 0.9997074 0.9668871 -0.9668935 0.9997074 0.9668871 -0.9668954 0.9997074 0.9668871 -0.9668977 0.9997074 0.9668871 -0.9669006 0.9997074 0.9668871 -0.9669043 0.9997074 0.9668871 -0.966909 0.9997074 0.9668871 -0.9669149 0.9997074 0.9668871 -0.9669225 0.9997074 0.9668871 -0.966932 0.9997074 0.9668871 -0.966944 0.9997074 0.9668871 -0.9669592 0.9997074 0.9668871 -0.9669784 0.9997074 0.9668871 -0.9670027 0.9997074 0.9668871 -0.9670335 0.9997074 0.9668871 -0.9670725 0.9997074 0.9668871 -0.9671218 0.9997074 0.9668871 -0.9671841 0.9997074 0.9668871 -0.967263 0.9997074 0.9668871 -0.9673627 0.9997074 0.9668871 -0.967489 0.9997074 0.9668871 -0.9676487 0.9997074 0.9668871 -0.9678507 0.9997074 0.9668871 -0.9681063 0.9997074 0.9668871 -0.9684297 0.9997074 0.9668871 -0.9688388 0.9997074 0.9668871 -0.9693564 0.9997074 0.9668871 -0.9700112 0.9997074 0.9668871 -0.9708397 0.9997074 0.9668871 -0.9718878 0.9997074 0.9668871 -0.9732137 0.9997074 0.9668871 -0.9748912 0.9997074 0.9668871 -0.9770135 0.9997074 0.9668871 -0.9796984 0.9997074 0.9668871 -0.9830952 0.9997074 0.9668871 -0.9873925 0.9997074 0.9668871 -0.9928293 0.9997074 0.9668871 -0.9997074 0.9997074 0.9668871 -0.9997689 0.9942999 0.9736725 -0.9998174 0.9920411 0.9790927 -0.9998557 0.9915331 0.9834129 -0.999886 0.9919389 0.9868505 -0.9999099 0.9927686 0.989582 -0.9999288 0.9937447 0.9917501 -0.9999437 0.9947175 0.9934695 -0.9736726 0.9997689 0.9736727 -0.9736726 0.9997689 0.9736726 -0.9736725 0.9997689 0.9736725 -0.9736726 0.9997689 0.9736725 -0.9736727 0.9997689 0.9736725 -0.9736728 0.9997689 0.9736725 -0.973673 0.9997689 0.9736725 -0.9736732 0.9997689 0.9736725 -0.9736735 0.9997689 0.9736725 -0.9736739 0.9997689 0.9736725 -0.9736743 0.9997689 0.9736725 -0.9736749 0.9997689 0.9736725 -0.9736756 0.9997689 0.9736725 -0.9736765 0.9997689 0.9736725 -0.9736777 0.9997689 0.9736725 -0.9736791 0.9997689 0.9736725 -0.973681 0.9997689 0.9736725 -0.9736833 0.9997689 0.9736725 -0.9736863 0.9997689 0.9736725 -0.97369 0.9997689 0.9736725 -0.9736947 0.9997689 0.9736725 -0.9737007 0.9997689 0.9736725 -0.9737082 0.9997689 0.9736725 -0.9737178 0.9997689 0.9736725 -0.9737299 0.9997689 0.9736725 -0.9737452 0.9997689 0.9736725 -0.9737645 0.9997689 0.9736725 -0.973789 0.9997689 0.9736725 -0.97382 0.9997689 0.9736725 -0.9738591 0.9997689 0.9736725 -0.9739087 0.9997689 0.9736725 -0.9739714 0.9997689 0.9736725 -0.9740508 0.9997689 0.9736725 -0.9741511 0.9997689 0.9736725 -0.9742781 0.9997689 0.9736725 -0.9744388 0.9997689 0.9736725 -0.974642 0.9997689 0.9736725 -0.9748991 0.9997689 0.9736725 -0.9752244 0.9997689 0.9736725 -0.975636 0.9997689 0.9736725 -0.9761567 0.9997689 0.9736725 -0.9768154 0.9997689 0.9736725 -0.9776487 0.9997689 0.9736725 -0.978703 0.9997689 0.9736725 -0.9800368 0.9997689 0.9736725 -0.9817243 0.9997689 0.9736725 -0.9838591 0.9997689 0.9736725 -0.98656 0.9997689 0.9736725 -0.989977 0.9997689 0.9736725 -0.9942999 0.9997689 0.9736725 -0.9997689 0.9997689 0.9736725 -0.9998174 0.9954741 0.9790927 -0.9998557 0.993686 0.9834129 -0.999886 0.993288 0.9868505 -0.9999099 0.9936135 0.989582 -0.9999288 0.9942736 0.9917501 -0.9999437 0.9950484 0.9934695 -0.9790927 0.9998174 0.9790928 -0.9790927 0.9998174 0.9790927 -0.9790927 0.9998174 0.9790927 -0.9790927 0.9998174 0.9790927 -0.9790928 0.9998174 0.9790927 -0.9790929 0.9998174 0.9790927 -0.979093 0.9998174 0.9790927 -0.9790931 0.9998174 0.9790927 -0.9790933 0.9998174 0.9790927 -0.9790935 0.9998174 0.9790927 -0.9790938 0.9998174 0.9790927 -0.9790942 0.9998174 0.9790927 -0.9790946 0.9998174 0.9790927 -0.9790952 0.9998174 0.9790927 -0.9790959 0.9998174 0.9790927 -0.9790968 0.9998174 0.9790927 -0.979098 0.9998174 0.9790927 -0.9790994 0.9998174 0.9790927 -0.9791013 0.9998174 0.9790927 -0.9791036 0.9998174 0.9790927 -0.9791066 0.9998174 0.9790927 -0.9791103 0.9998174 0.9790927 -0.9791151 0.9998174 0.9790927 -0.9791211 0.9998174 0.9790927 -0.9791287 0.9998174 0.9790927 -0.9791383 0.9998174 0.9790927 -0.9791504 0.9998174 0.9790927 -0.9791658 0.9998174 0.9790927 -0.9791852 0.9998174 0.9790927 -0.9792098 0.9998174 0.9790927 -0.9792409 0.9998174 0.9790927 -0.9792803 0.9998174 0.9790927 -0.9793301 0.9998174 0.9790927 -0.9793931 0.9998174 0.9790927 -0.9794728 0.9998174 0.9790927 -0.9795737 0.9998174 0.9790927 -0.9797012 0.9998174 0.9790927 -0.9798626 0.9998174 0.9790927 -0.9800668 0.9998174 0.9790927 -0.9803252 0.9998174 0.9790927 -0.980652 0.9998174 0.9790927 -0.9810655 0.9998174 0.9790927 -0.9815886 0.9998174 0.9790927 -0.9822504 0.9998174 0.9790927 -0.9830877 0.9998174 0.9790927 -0.984147 0.9998174 0.9790927 -0.9854871 0.9998174 0.9790927 -0.9871825 0.9998174 0.9790927 -0.9893274 0.9998174 0.9790927 -0.9920411 0.9998174 0.9790927 -0.9954741 0.9998174 0.9790927 -0.9998174 0.9998174 0.9790927 -0.9998557 0.9964098 0.9834129 -0.999886 0.9949948 0.9868505 -0.9999099 0.9946824 0.989582 -0.9999288 0.9949427 0.9917501 -0.9999437 0.9954671 0.9934695 -0.9834129 0.9998557 0.983413 -0.9834129 0.9998557 0.9834129 -0.9834129 0.9998557 0.9834129 -0.9834129 0.9998557 0.9834129 -0.983413 0.9998557 0.9834129 -0.983413 0.9998557 0.9834129 -0.9834131 0.9998557 0.9834129 -0.9834132 0.9998557 0.9834129 -0.9834133 0.9998557 0.9834129 -0.9834134 0.9998557 0.9834129 -0.9834136 0.9998557 0.9834129 -0.9834138 0.9998557 0.9834129 -0.9834141 0.9998557 0.9834129 -0.9834145 0.9998557 0.9834129 -0.9834149 0.9998557 0.9834129 -0.9834155 0.9998557 0.9834129 -0.9834162 0.9998557 0.9834129 -0.9834171 0.9998557 0.9834129 -0.9834183 0.9998557 0.9834129 -0.9834198 0.9998557 0.9834129 -0.9834216 0.9998557 0.9834129 -0.983424 0.9998557 0.9834129 -0.9834269 0.9998557 0.9834129 -0.9834307 0.9998557 0.9834129 -0.9834355 0.9998557 0.9834129 -0.9834415 0.9998557 0.9834129 -0.9834491 0.9998557 0.9834129 -0.9834587 0.9998557 0.9834129 -0.9834709 0.9998557 0.9834129 -0.9834864 0.9998557 0.9834129 -0.9835059 0.9998557 0.9834129 -0.9835306 0.9998557 0.9834129 -0.9835618 0.9998557 0.9834129 -0.9836013 0.9998557 0.9834129 -0.9836513 0.9998557 0.9834129 -0.9837145 0.9998557 0.9834129 -0.9837945 0.9998557 0.9834129 -0.9838958 0.9998557 0.9834129 -0.9840238 0.9998557 0.9834129 -0.9841858 0.9998557 0.9834129 -0.9843908 0.9998557 0.9834129 -0.9846501 0.9998557 0.9834129 -0.9849782 0.9998557 0.9834129 -0.9853932 0.9998557 0.9834129 -0.9859183 0.9998557 0.9834129 -0.9865826 0.9998557 0.9834129 -0.987423 0.9998557 0.9834129 -0.9884862 0.9998557 0.9834129 -0.9898313 0.9998557 0.9834129 -0.9915331 0.9998557 0.9834129 -0.993686 0.9998557 0.9834129 -0.9964098 0.9998557 0.9834129 -0.9998557 0.9998557 0.9834129 -0.999886 0.9971541 0.9868505 -0.9999099 0.9960347 0.989582 -0.9999288 0.9957891 0.9917501 -0.9999437 0.9959967 0.9934695 -0.9868505 0.999886 0.9868505 -0.9868505 0.999886 0.9868505 -0.9868505 0.999886 0.9868505 -0.9868505 0.999886 0.9868505 -0.9868505 0.999886 0.9868505 -0.9868506 0.999886 0.9868505 -0.9868506 0.999886 0.9868505 -0.9868507 0.999886 0.9868505 -0.9868507 0.999886 0.9868505 -0.9868508 0.999886 0.9868505 -0.9868509 0.999886 0.9868505 -0.9868511 0.999886 0.9868505 -0.9868512 0.999886 0.9868505 -0.9868515 0.999886 0.9868505 -0.9868518 0.999886 0.9868505 -0.9868521 0.999886 0.9868505 -0.9868526 0.999886 0.9868505 -0.9868531 0.999886 0.9868505 -0.9868539 0.999886 0.9868505 -0.9868548 0.999886 0.9868505 -0.986856 0.999886 0.9868505 -0.9868574 0.999886 0.9868505 -0.9868593 0.999886 0.9868505 -0.9868616 0.999886 0.9868505 -0.9868646 0.999886 0.9868505 -0.9868684 0.999886 0.9868505 -0.9868732 0.999886 0.9868505 -0.9868792 0.999886 0.9868505 -0.9868869 0.999886 0.9868505 -0.9868965 0.999886 0.9868505 -0.9869087 0.999886 0.9868505 -0.9869242 0.999886 0.9868505 -0.9869438 0.999886 0.9868505 -0.9869685 0.999886 0.9868505 -0.9869999 0.999886 0.9868505 -0.9870395 0.999886 0.9868505 -0.9870896 0.999886 0.9868505 -0.9871531 0.999886 0.9868505 -0.9872333 0.999886 0.9868505 -0.9873348 0.999886 0.9868505 -0.9874633 0.999886 0.9868505 -0.9876258 0.999886 0.9868505 -0.9878313 0.999886 0.9868505 -0.9880914 0.999886 0.9868505 -0.9884204 0.999886 0.9868505 -0.9888367 0.999886 0.9868505 -0.9893633 0.999886 0.9868505 -0.9900296 0.999886 0.9868505 -0.9908725 0.999886 0.9868505 -0.9919389 0.999886 0.9868505 -0.993288 0.999886 0.9868505 -0.9949948 0.999886 0.9868505 -0.9971541 0.999886 0.9868505 -0.999886 0.999886 0.9868505 -0.9999099 0.9977455 0.989582 -0.9999288 0.99686 0.9917501 -0.9999437 0.9966668 0.9934695 -0.989582 0.9999099 0.989582 -0.989582 0.9999099 0.989582 -0.989582 0.9999099 0.989582 -0.989582 0.9999099 0.989582 -0.989582 0.9999099 0.989582 -0.989582 0.9999099 0.989582 -0.9895821 0.9999099 0.989582 -0.9895821 0.9999099 0.989582 -0.9895821 0.9999099 0.989582 -0.9895822 0.9999099 0.989582 -0.9895823 0.9999099 0.989582 -0.9895824 0.9999099 0.989582 -0.9895825 0.9999099 0.989582 -0.9895826 0.9999099 0.989582 -0.9895828 0.9999099 0.989582 -0.989583 0.9999099 0.989582 -0.9895833 0.9999099 0.989582 -0.9895837 0.9999099 0.989582 -0.9895841 0.9999099 0.989582 -0.9895847 0.9999099 0.989582 -0.9895854 0.9999099 0.989582 -0.9895863 0.9999099 0.989582 -0.9895875 0.9999099 0.989582 -0.989589 0.9999099 0.989582 -0.9895909 0.9999099 0.989582 -0.9895932 0.9999099 0.989582 -0.9895962 0.9999099 0.989582 -0.9896 0.9999099 0.989582 -0.9896048 0.9999099 0.989582 -0.9896108 0.9999099 0.989582 -0.9896185 0.9999099 0.989582 -0.9896282 0.9999099 0.989582 -0.9896404 0.9999099 0.989582 -0.9896559 0.9999099 0.989582 -0.9896755 0.9999099 0.989582 -0.9897004 0.9999099 0.989582 -0.9897318 0.9999099 0.989582 -0.9897715 0.9999099 0.989582 -0.9898217 0.9999099 0.989582 -0.9898853 0.9999099 0.989582 -0.9899658 0.9999099 0.989582 -0.9900675 0.9999099 0.989582 -0.9901963 0.9999099 0.989582 -0.9903591 0.9999099 0.989582 -0.9905652 0.9999099 0.989582 -0.9908259 0.9999099 0.989582 -0.9911557 0.9999099 0.989582 -0.9915729 0.9999099 0.989582 -0.9921008 0.9999099 0.989582 -0.9927686 0.9999099 0.989582 -0.9936135 0.9999099 0.989582 -0.9946824 0.9999099 0.989582 -0.9960347 0.9999099 0.989582 -0.9977455 0.9999099 0.989582 -0.9999099 0.9999099 0.989582 -0.9999288 0.9982148 0.9917501 -0.9999437 0.9975145 0.9934695 -0.9917501 0.9999288 0.9917501 -0.9917501 0.9999288 0.9917501 -0.9917501 0.9999288 0.9917501 -0.9917501 0.9999288 0.9917501 -0.9917501 0.9999288 0.9917501 -0.9917501 0.9999288 0.9917501 -0.9917501 0.9999288 0.9917501 -0.9917502 0.9999288 0.9917501 -0.9917502 0.9999288 0.9917501 -0.9917502 0.9999288 0.9917501 -0.9917503 0.9999288 0.9917501 -0.9917503 0.9999288 0.9917501 -0.9917504 0.9999288 0.9917501 -0.9917505 0.9999288 0.9917501 -0.9917506 0.9999288 0.9917501 -0.9917507 0.9999288 0.9917501 -0.9917509 0.9999288 0.9917501 -0.9917511 0.9999288 0.9917501 -0.9917514 0.9999288 0.9917501 -0.9917518 0.9999288 0.9917501 -0.9917522 0.9999288 0.9917501 -0.9917528 0.9999288 0.9917501 -0.9917535 0.9999288 0.9917501 -0.9917545 0.9999288 0.9917501 -0.9917556 0.9999288 0.9917501 -0.9917571 0.9999288 0.9917501 -0.991759 0.9999288 0.9917501 -0.9917613 0.9999288 0.9917501 -0.9917643 0.9999288 0.9917501 -0.9917681 0.9999288 0.9917501 -0.9917729 0.9999288 0.9917501 -0.991779 0.9999288 0.9917501 -0.9917867 0.9999288 0.9917501 -0.9917964 0.9999288 0.9917501 -0.9918086 0.9999288 0.9917501 -0.9918242 0.9999288 0.9917501 -0.9918438 0.9999288 0.9917501 -0.9918687 0.9999288 0.9917501 -0.9919002 0.9999288 0.9917501 -0.99194 0.9999288 0.9917501 -0.9919903 0.9999288 0.9917501 -0.992054 0.9999288 0.9917501 -0.9921346 0.9999288 0.9917501 -0.9922365 0.9999288 0.9917501 -0.9923655 0.9999288 0.9917501 -0.9925287 0.9999288 0.9917501 -0.9927351 0.9999288 0.9917501 -0.9929963 0.9999288 0.9917501 -0.9933267 0.9999288 0.9917501 -0.9937447 0.9999288 0.9917501 -0.9942736 0.9999288 0.9917501 -0.9949427 0.9999288 0.9917501 -0.9957891 0.9999288 0.9917501 -0.99686 0.9999288 0.9917501 -0.9982148 0.9999288 0.9917501 -0.9999288 0.9999288 0.9917501 -0.9999437 0.9985869 0.9934695 -0.9934695 0.9999437 0.9934695 -0.9934695 0.9999437 0.9934695 -0.9934695 0.9999437 0.9934695 -0.9934695 0.9999437 0.9934695 -0.9934695 0.9999437 0.9934695 -0.9934695 0.9999437 0.9934695 -0.9934695 0.9999437 0.9934695 -0.9934695 0.9999437 0.9934695 -0.9934695 0.9999437 0.9934695 -0.9934696 0.9999437 0.9934695 -0.9934696 0.9999437 0.9934695 -0.9934696 0.9999437 0.9934695 -0.9934697 0.9999437 0.9934695 -0.9934697 0.9999437 0.9934695 -0.9934698 0.9999437 0.9934695 -0.9934699 0.9999437 0.9934695 -0.99347 0.9999437 0.9934695 -0.9934701 0.9999437 0.9934695 -0.9934703 0.9999437 0.9934695 -0.9934705 0.9999437 0.9934695 -0.9934708 0.9999437 0.9934695 -0.9934712 0.9999437 0.9934695 -0.9934716 0.9999437 0.9934695 -0.9934722 0.9999437 0.9934695 -0.993473 0.9999437 0.9934695 -0.9934739 0.9999437 0.9934695 -0.993475 0.9999437 0.9934695 -0.9934765 0.9999437 0.9934695 -0.9934784 0.9999437 0.9934695 -0.9934808 0.9999437 0.9934695 -0.9934838 0.9999437 0.9934695 -0.9934876 0.9999437 0.9934695 -0.9934924 0.9999437 0.9934695 -0.9934984 0.9999437 0.9934695 -0.9935061 0.9999437 0.9934695 -0.9935158 0.9999437 0.9934695 -0.9935281 0.9999437 0.9934695 -0.9935437 0.9999437 0.9934695 -0.9935634 0.9999437 0.9934695 -0.9935883 0.9999437 0.9934695 -0.9936198 0.9999437 0.9934695 -0.9936596 0.9999437 0.9934695 -0.9937101 0.9999437 0.9934695 -0.9937739 0.9999437 0.9934695 -0.9938546 0.9999437 0.9934695 -0.9939567 0.9999437 0.9934695 -0.9940858 0.9999437 0.9934695 -0.9942492 0.9999437 0.9934695 -0.994456 0.9999437 0.9934695 -0.9947175 0.9999437 0.9934695 -0.9950484 0.9999437 0.9934695 -0.9954671 0.9999437 0.9934695 -0.9959967 0.9999437 0.9934695 -0.9966668 0.9999437 0.9934695 -0.9975145 0.9999437 0.9934695 -0.9985869 0.9999437 0.9934695 -0.9999437 0.9999437 0.9934695 -0.0000238 0.0000238 0.0020256 -0.0005417 0.0000238 0.0020256 -0.0011968 0.0000238 0.0020256 -0.0020256 0.0000238 0.0020256 -0.0030742 0.0000238 0.0020256 -0.0044007 0.0000238 0.0020256 -0.006079 0.0000238 0.0020256 -0.0082023 0.0000238 0.0020256 -0.0108885 0.0000238 0.0020256 -0.0142868 0.0000238 0.0020256 -0.0185862 0.0000238 0.0020256 -0.0240255 0.0000238 0.0020256 -0.0309069 0.0000238 0.0020256 -0.0396127 0.0000238 0.0020256 -0.0506267 0.0000238 0.0020256 -0.0645609 0.0000238 0.0020256 -0.0821895 0.0000238 0.0020256 -0.1044919 0.0000238 0.0020256 -0.1327073 0.0000238 0.0020256 -0.1684036 0.0000238 0.0020256 -0.2135639 0.0000238 0.0020256 -0.2706977 0.0000238 0.0020256 -0.3429792 0.0000238 0.0020256 -0.4344249 0.0000238 0.0020256 -0.5501155 0.0000238 0.0020256 -0.6964791 0.0000238 0.0020256 -0.8407292 0.0051514 0.0070486 -0.9033413 0.0279321 0.0295025 -0.9354466 0.0624569 0.0636943 -0.9545467 0.1059991 0.1069495 -0.9669269 0.1572498 0.1579665 -0.9754027 0.2151269 0.2156587 -0.9814251 0.2783684 0.2787571 -0.9858181 0.3454107 0.3456905 -0.9890841 0.4144197 0.4146182 -0.9915469 0.4834235 0.4835622 -0.993424 0.5504963 0.5505918 -0.9948662 0.6139459 0.6140108 -0.9959813 0.6724572 0.6725008 -0.9968475 0.7251659 0.7251949 -0.997523 0.7716588 0.7716778 -0.9980513 0.8119154 0.8119278 -0.9984653 0.8462171 0.8462251 -0.9987905 0.8750477 0.8750528 -0.9990461 0.8990028 0.8990061 -0.9992474 0.9187175 0.9187196 -0.999406 0.9348153 0.9348166 -0.999531 0.9478754 0.9478762 -0.9996296 0.958416 0.9584165 -0.9997074 0.9668873 0.9668877 -0.9997689 0.9736726 0.9736728 -0.9998174 0.9790927 0.9790929 -0.9998557 0.9834129 0.983413 -0.999886 0.9868505 0.9868506 -0.9999099 0.989582 0.989582 -0.9999288 0.9917501 0.9917501 -0.9999437 0.9934695 0.9934695 -0.0000238 0.0005417 0.0020256 -0.0000382 0.0000382 0.0015221 -0.0006933 0.0000382 0.0015221 -0.0015221 0.0000382 0.0015221 -0.0025707 0.0000382 0.0015221 -0.0038972 0.0000382 0.0015221 -0.0055755 0.0000382 0.0015221 -0.0076988 0.0000382 0.0015221 -0.0103849 0.0000382 0.0015221 -0.0137833 0.0000382 0.0015221 -0.0180827 0.0000382 0.0015221 -0.023522 0.0000382 0.0015221 -0.0304033 0.0000382 0.0015221 -0.0391092 0.0000382 0.0015221 -0.0501232 0.0000382 0.0015221 -0.0640574 0.0000382 0.0015221 -0.081686 0.0000382 0.0015221 -0.1039884 0.0000382 0.0015221 -0.1322038 0.0000382 0.0015221 -0.1679 0.0000382 0.0015221 -0.2130604 0.0000382 0.0015221 -0.2701941 0.0000382 0.0015221 -0.3424757 0.0000382 0.0015221 -0.4339214 0.0000382 0.0015221 -0.549612 0.0000382 0.0015221 -0.6959756 0.0000382 0.0015221 -0.8405071 0.0051286 0.0065355 -0.9032596 0.0278872 0.0290518 -0.9354101 0.0624063 0.0633239 -0.9545286 0.1059489 0.1066537 -0.9669173 0.1572031 0.1577345 -0.9753975 0.2150852 0.2154796 -0.9814221 0.2783325 0.2786207 -0.9858163 0.3453807 0.3455882 -0.9890831 0.4143955 0.4145427 -0.9915463 0.4834045 0.4835073 -0.9934236 0.5504818 0.5505527 -0.994866 0.6139352 0.6139833 -0.9959811 0.6724495 0.6724818 -0.9968474 0.7251605 0.725182 -0.997523 0.7716551 0.7716692 -0.9980512 0.8119128 0.811922 -0.9984653 0.8462154 0.8462213 -0.9987905 0.8750466 0.8750504 -0.9990461 0.899002 0.8990045 -0.9992474 0.918717 0.9187186 -0.999406 0.9348149 0.9348159 -0.999531 0.9478752 0.9478758 -0.9996296 0.9584159 0.9584162 -0.9997074 0.9668872 0.9668875 -0.9997689 0.9736726 0.9736727 -0.9998174 0.9790927 0.9790928 -0.9998557 0.9834129 0.983413 -0.999886 0.9868505 0.9868505 -0.9999099 0.989582 0.989582 -0.9999288 0.9917501 0.9917501 -0.9999437 0.9934695 0.9934695 -0.0000238 0.0011968 0.0020256 -0.0000382 0.0006933 0.0015221 -0.0000611 0.0000611 0.0008899 -0.0008899 0.0000611 0.0008899 -0.0019385 0.0000611 0.0008899 -0.003265 0.0000611 0.0008899 -0.0049433 0.0000611 0.0008899 -0.0070666 0.0000611 0.0008899 -0.0097527 0.0000611 0.0008899 -0.0131511 0.0000611 0.0008899 -0.0174505 0.0000611 0.0008899 -0.0228898 0.0000611 0.0008899 -0.0297711 0.0000611 0.0008899 -0.038477 0.0000611 0.0008899 -0.049491 0.0000611 0.0008899 -0.0634252 0.0000611 0.0008899 -0.0810538 0.0000611 0.0008899 -0.1033562 0.0000611 0.0008899 -0.1315716 0.0000611 0.0008899 -0.1672678 0.0000611 0.0008899 -0.2124282 0.0000611 0.0008899 -0.2695619 0.0000611 0.0008899 -0.3418435 0.0000611 0.0008899 -0.4332891 0.0000611 0.0008899 -0.5489798 0.0000611 0.0008899 -0.6953434 0.0000611 0.0008899 -0.8402274 0.0051047 0.0058909 -0.9031567 0.0278347 0.0284855 -0.9353643 0.0623458 0.0628585 -0.9545059 0.1058883 0.1062821 -0.9669053 0.1571463 0.1574432 -0.9753908 0.2150342 0.2152545 -0.9814183 0.2782884 0.2784494 -0.9858141 0.3453439 0.3454598 -0.9890818 0.4143657 0.4144479 -0.9915455 0.4833811 0.4834385 -0.9934231 0.550464 0.5505035 -0.9948657 0.6139219 0.6139488 -0.9959809 0.6724399 0.6724579 -0.9968473 0.7251537 0.7251657 -0.9975229 0.7716504 0.7716583 -0.9980512 0.8119096 0.8119148 -0.9984653 0.8462132 0.8462165 -0.9987904 0.8750451 0.8750473 -0.9990461 0.8990011 0.8990025 -0.9992474 0.9187164 0.9187173 -0.999406 0.9348146 0.9348151 -0.999531 0.947875 0.9478753 -0.9996296 0.9584157 0.9584159 -0.9997074 0.9668871 0.9668873 -0.9997689 0.9736725 0.9736726 -0.9998174 0.9790927 0.9790927 -0.9998557 0.9834129 0.9834129 -0.999886 0.9868505 0.9868505 -0.9999099 0.989582 0.989582 -0.9999288 0.9917501 0.9917501 -0.9999437 0.9934695 0.9934695 -0.0000238 0.0020256 0.0020256 -0.0000382 0.0015221 0.0015221 -0.0000611 0.0008899 0.0008899 -0.0000978 0.0000978 0.0000978 -0.0011463 0.0000978 0.0000978 -0.0024729 0.0000978 0.0000978 -0.0041512 0.0000978 0.0000978 -0.0062744 0.0000978 0.0000978 -0.0089606 0.0000978 0.0000978 -0.012359 0.0000978 0.0000978 -0.0166583 0.0000978 0.0000978 -0.0220976 0.0000978 0.0000978 -0.028979 0.0000978 0.0000978 -0.0376849 0.0000978 0.0000978 -0.0486989 0.0000978 0.0000978 -0.0626331 0.0000978 0.0000978 -0.0802616 0.0000978 0.0000978 -0.102564 0.0000978 0.0000978 -0.1307795 0.0000978 0.0000978 -0.1664757 0.0000978 0.0000978 -0.2116361 0.0000978 0.0000978 -0.2687698 0.0000978 0.0000978 -0.3410514 0.0000978 0.0000978 -0.432497 0.0000978 0.0000978 -0.5481876 0.0000978 0.0000978 -0.6945513 0.0000978 0.0000978 -0.8398756 0.0050826 0.0050826 -0.9030276 0.0277752 0.0277752 -0.9353068 0.0622749 0.0622749 -0.9544774 0.1058162 0.1058162 -0.9668902 0.1570779 0.1570779 -0.9753825 0.2149725 0.2149725 -0.9814136 0.2782347 0.2782347 -0.9858113 0.3452987 0.3452987 -0.9890801 0.414329 0.414329 -0.9915446 0.4833522 0.4833522 -0.9934225 0.5504419 0.5504419 -0.9948653 0.6139056 0.6139056 -0.9959807 0.672428 0.672428 -0.9968472 0.7251454 0.7251454 -0.9975228 0.7716446 0.7716446 -0.9980511 0.8119057 0.8119057 -0.9984653 0.8462106 0.8462106 -0.9987904 0.8750434 0.8750434 -0.9990461 0.899 0.899 -0.9992474 0.9187157 0.9187157 -0.999406 0.9348141 0.9348141 -0.999531 0.9478746 0.9478746 -0.9996296 0.9584155 0.9584155 -0.9997074 0.966887 0.966887 -0.9997689 0.9736724 0.9736724 -0.9998174 0.9790926 0.9790926 -0.9998557 0.9834129 0.9834129 -0.999886 0.9868505 0.9868505 -0.9999099 0.989582 0.989582 -0.9999288 0.9917501 0.9917501 -0.9999437 0.9934695 0.9934695 -0.0000238 0.0030742 0.0020256 -0.0000382 0.0025707 0.0015221 -0.0000611 0.0019385 0.0008899 -0.0000978 0.0011463 0.0000978 -0.0011463 0.0011463 0.0000978 -0.0024729 0.0011463 0.0000978 -0.0041512 0.0011463 0.0000978 -0.0062744 0.0011463 0.0000978 -0.0089606 0.0011463 0.0000978 -0.012359 0.0011463 0.0000978 -0.0166583 0.0011463 0.0000978 -0.0220976 0.0011463 0.0000978 -0.028979 0.0011463 0.0000978 -0.0376849 0.0011463 0.0000978 -0.0486989 0.0011463 0.0000978 -0.0626331 0.0011463 0.0000978 -0.0802616 0.0011463 0.0000978 -0.102564 0.0011463 0.0000978 -0.1307795 0.0011463 0.0000978 -0.1664757 0.0011463 0.0000978 -0.2116361 0.0011463 0.0000978 -0.2687698 0.0011463 0.0000978 -0.3410514 0.0011463 0.0000978 -0.432497 0.0011463 0.0000978 -0.5481876 0.0011463 0.0000978 -0.6945513 0.0011463 0.0000978 -0.8398756 0.0060778 0.0050826 -0.9030276 0.0285991 0.0277752 -0.9353068 0.062924 0.0622749 -0.9544774 0.1063147 0.1058162 -0.9668902 0.1574537 0.1570779 -0.9753825 0.2152513 0.2149725 -0.9814136 0.2784385 0.2782347 -0.9858113 0.3454454 0.3452987 -0.9890801 0.414433 0.414329 -0.9915446 0.4834249 0.4833522 -0.9934225 0.550492 0.5504419 -0.9948653 0.6139396 0.6139056 -0.9959807 0.6724509 0.672428 -0.9968472 0.7251605 0.7251454 -0.9975228 0.7716545 0.7716446 -0.9980511 0.8119122 0.8119057 -0.9984653 0.8462148 0.8462106 -0.9987904 0.8750461 0.8750434 -0.9990461 0.8990017 0.899 -0.9992474 0.9187168 0.9187157 -0.999406 0.9348148 0.9348141 -0.999531 0.9478751 0.9478746 -0.9996296 0.9584158 0.9584155 -0.9997074 0.9668872 0.966887 -0.9997689 0.9736725 0.9736724 -0.9998174 0.9790927 0.9790926 -0.9998557 0.9834129 0.9834129 -0.999886 0.9868505 0.9868505 -0.9999099 0.989582 0.989582 -0.9999288 0.9917501 0.9917501 -0.9999437 0.9934695 0.9934695 -0.0000238 0.0044007 0.0020256 -0.0000382 0.0038972 0.0015221 -0.0000611 0.003265 0.0008899 -0.0000978 0.0024729 0.0000978 -0.0011463 0.0024729 0.0000978 -0.0024729 0.0024729 0.0000978 -0.0041512 0.0024729 0.0000978 -0.0062744 0.0024729 0.0000978 -0.0089606 0.0024729 0.0000978 -0.012359 0.0024729 0.0000978 -0.0166583 0.0024729 0.0000978 -0.0220976 0.0024729 0.0000978 -0.028979 0.0024729 0.0000978 -0.0376849 0.0024729 0.0000978 -0.0486989 0.0024729 0.0000978 -0.0626331 0.0024729 0.0000978 -0.0802616 0.0024729 0.0000978 -0.102564 0.0024729 0.0000978 -0.1307795 0.0024729 0.0000978 -0.1664757 0.0024729 0.0000978 -0.2116361 0.0024729 0.0000978 -0.2687698 0.0024729 0.0000978 -0.3410514 0.0024729 0.0000978 -0.432497 0.0024729 0.0000978 -0.5481876 0.0024729 0.0000978 -0.6945513 0.0024729 0.0000978 -0.8398756 0.0073367 0.0050826 -0.9030276 0.0296415 0.0277752 -0.9353068 0.0637452 0.0622749 -0.9544774 0.1069453 0.1058162 -0.9668902 0.1579292 0.1570779 -0.9753825 0.215604 0.2149725 -0.9814136 0.2786962 0.2782347 -0.9858113 0.3456309 0.3452987 -0.9890801 0.4145646 0.414329 -0.9915446 0.4835168 0.4833522 -0.9934225 0.5505553 0.5504419 -0.9948653 0.6139827 0.6139056 -0.9959807 0.6724798 0.672428 -0.9968472 0.7251797 0.7251454 -0.9975228 0.7716672 0.7716446 -0.9980511 0.8119204 0.8119057 -0.9984653 0.8462201 0.8462106 -0.9987904 0.8750495 0.8750434 -0.9990461 0.8990039 0.899 -0.9992474 0.9187182 0.9187157 -0.999406 0.9348157 0.9348141 -0.999531 0.9478756 0.9478746 -0.9996296 0.9584161 0.9584155 -0.9997074 0.9668874 0.966887 -0.9997689 0.9736727 0.9736724 -0.9998174 0.9790928 0.9790926 -0.9998557 0.983413 0.9834129 -0.999886 0.9868505 0.9868505 -0.9999099 0.989582 0.989582 -0.9999288 0.9917501 0.9917501 -0.9999437 0.9934695 0.9934695 -0.0000238 0.006079 0.0020256 -0.0000382 0.0055755 0.0015221 -0.0000611 0.0049433 0.0008899 -0.0000978 0.0041512 0.0000978 -0.0011463 0.0041512 0.0000978 -0.0024729 0.0041512 0.0000978 -0.0041512 0.0041512 0.0000978 -0.0062744 0.0041512 0.0000978 -0.0089606 0.0041512 0.0000978 -0.012359 0.0041512 0.0000978 -0.0166583 0.0041512 0.0000978 -0.0220976 0.0041512 0.0000978 -0.028979 0.0041512 0.0000978 -0.0376849 0.0041512 0.0000978 -0.0486989 0.0041512 0.0000978 -0.0626331 0.0041512 0.0000978 -0.0802616 0.0041512 0.0000978 -0.102564 0.0041512 0.0000978 -0.1307795 0.0041512 0.0000978 -0.1664757 0.0041512 0.0000978 -0.2116361 0.0041512 0.0000978 -0.2687698 0.0041512 0.0000978 -0.3410514 0.0041512 0.0000978 -0.432497 0.0041512 0.0000978 -0.5481876 0.0041512 0.0000978 -0.6945513 0.0041512 0.0000978 -0.8398756 0.0089295 0.0050826 -0.9030276 0.0309602 0.0277752 -0.9353068 0.0647842 0.0622749 -0.9544774 0.1077431 0.1058162 -0.9668902 0.1585307 0.1570779 -0.9753825 0.2160503 0.2149725 -0.9814136 0.2790223 0.2782347 -0.9858113 0.3458657 0.3452987 -0.9890801 0.4147311 0.414329 -0.9915446 0.4836332 0.4833522 -0.9934225 0.5506355 0.5504419 -0.9948653 0.6140371 0.6139056 -0.9959807 0.6725163 0.672428 -0.9968472 0.725204 0.7251454 -0.9975228 0.7716831 0.7716446 -0.9980511 0.8119308 0.8119057 -0.9984653 0.8462268 0.8462106 -0.9987904 0.8750538 0.8750434 -0.9990461 0.8990066 0.899 -0.9992474 0.9187199 0.9187157 -0.999406 0.9348168 0.9348141 -0.999531 0.9478763 0.9478746 -0.9996296 0.9584166 0.9584155 -0.9997074 0.9668877 0.966887 -0.9997689 0.9736729 0.9736724 -0.9998174 0.9790929 0.9790926 -0.9998557 0.983413 0.9834129 -0.999886 0.9868506 0.9868505 -0.9999099 0.989582 0.989582 -0.9999288 0.9917501 0.9917501 -0.9999437 0.9934695 0.9934695 -0.0000238 0.0082023 0.0020256 -0.0000382 0.0076988 0.0015221 -0.0000611 0.0070666 0.0008899 -0.0000978 0.0062744 0.0000978 -0.0011463 0.0062744 0.0000978 -0.0024729 0.0062744 0.0000978 -0.0041512 0.0062744 0.0000978 -0.0062744 0.0062744 0.0000978 -0.0089606 0.0062744 0.0000978 -0.012359 0.0062744 0.0000978 -0.0166583 0.0062744 0.0000978 -0.0220976 0.0062744 0.0000978 -0.028979 0.0062744 0.0000978 -0.0376849 0.0062744 0.0000978 -0.0486989 0.0062744 0.0000978 -0.0626331 0.0062744 0.0000978 -0.0802616 0.0062744 0.0000978 -0.102564 0.0062744 0.0000978 -0.1307795 0.0062744 0.0000978 -0.1664757 0.0062744 0.0000978 -0.2116361 0.0062744 0.0000978 -0.2687698 0.0062744 0.0000978 -0.3410514 0.0062744 0.0000978 -0.432497 0.0062744 0.0000978 -0.5481876 0.0062744 0.0000978 -0.6945513 0.0062744 0.0000978 -0.8398756 0.0109445 0.0050826 -0.9030276 0.0326286 0.0277752 -0.9353068 0.0660986 0.0622749 -0.9544774 0.1087525 0.1058162 -0.9668902 0.1592916 0.1570779 -0.9753825 0.2166149 0.2149725 -0.9814136 0.2794349 0.2782347 -0.9858113 0.3461627 0.3452987 -0.9890801 0.4149417 0.414329 -0.9915446 0.4837803 0.4833522 -0.9934225 0.5507369 0.5504419 -0.9948653 0.614106 0.6139056 -0.9959807 0.6725626 0.672428 -0.9968472 0.7252347 0.7251454 -0.9975228 0.7717033 0.7716446 -0.9980511 0.8119439 0.8119057 -0.9984653 0.8462353 0.8462106 -0.9987904 0.8750593 0.8750434 -0.9990461 0.8990101 0.899 -0.9992474 0.9187221 0.9187157 -0.999406 0.9348182 0.9348141 -0.999531 0.9478772 0.9478746 -0.9996296 0.9584171 0.9584155 -0.9997074 0.966888 0.966887 -0.9997689 0.9736731 0.9736724 -0.9998174 0.979093 0.9790926 -0.9998557 0.9834131 0.9834129 -0.999886 0.9868506 0.9868505 -0.9999099 0.9895821 0.989582 -0.9999288 0.9917501 0.9917501 -0.9999437 0.9934695 0.9934695 -0.0000238 0.0108885 0.0020256 -0.0000382 0.0103849 0.0015221 -0.0000611 0.0097527 0.0008899 -0.0000978 0.0089606 0.0000978 -0.0011463 0.0089606 0.0000978 -0.0024729 0.0089606 0.0000978 -0.0041512 0.0089606 0.0000978 -0.0062744 0.0089606 0.0000978 -0.0089606 0.0089606 0.0000978 -0.012359 0.0089606 0.0000978 -0.0166583 0.0089606 0.0000978 -0.0220976 0.0089606 0.0000978 -0.028979 0.0089606 0.0000978 -0.0376849 0.0089606 0.0000978 -0.0486989 0.0089606 0.0000978 -0.0626331 0.0089606 0.0000978 -0.0802616 0.0089606 0.0000978 -0.102564 0.0089606 0.0000978 -0.1307795 0.0089606 0.0000978 -0.1664757 0.0089606 0.0000978 -0.2116361 0.0089606 0.0000978 -0.2687698 0.0089606 0.0000978 -0.3410514 0.0089606 0.0000978 -0.432497 0.0089606 0.0000978 -0.5481876 0.0089606 0.0000978 -0.6945513 0.0089606 0.0000978 -0.8398756 0.0134938 0.0050826 -0.9030276 0.0347393 0.0277752 -0.9353068 0.0677615 0.0622749 -0.9544774 0.1100294 0.1058162 -0.9668902 0.1602543 0.1570779 -0.9753825 0.2173291 0.2149725 -0.9814136 0.2799568 0.2782347 -0.9858113 0.3465384 0.3452987 -0.9890801 0.4152081 0.414329 -0.9915446 0.4839665 0.4833522 -0.9934225 0.5508651 0.5504419 -0.9948653 0.6141932 0.6139056 -0.9959807 0.6726211 0.672428 -0.9968472 0.7252735 0.7251454 -0.9975228 0.7717288 0.7716446 -0.9980511 0.8119606 0.8119057 -0.9984653 0.846246 0.8462106 -0.9987904 0.8750662 0.8750434 -0.9990461 0.8990145 0.899 -0.9992474 0.9187249 0.9187157 -0.999406 0.93482 0.9348141 -0.999531 0.9478784 0.9478746 -0.9996296 0.9584178 0.9584155 -0.9997074 0.9668885 0.966887 -0.9997689 0.9736734 0.9736724 -0.9998174 0.9790932 0.9790926 -0.9998557 0.9834132 0.9834129 -0.999886 0.9868507 0.9868505 -0.9999099 0.9895821 0.989582 -0.9999288 0.9917502 0.9917501 -0.9999437 0.9934695 0.9934695 -0.0000238 0.0142868 0.0020256 -0.0000382 0.0137833 0.0015221 -0.0000611 0.0131511 0.0008899 -0.0000978 0.012359 0.0000978 -0.0011463 0.012359 0.0000978 -0.0024729 0.012359 0.0000978 -0.0041512 0.012359 0.0000978 -0.0062744 0.012359 0.0000978 -0.0089606 0.012359 0.0000978 -0.012359 0.012359 0.0000978 -0.0166583 0.012359 0.0000978 -0.0220976 0.012359 0.0000978 -0.028979 0.012359 0.0000978 -0.0376849 0.012359 0.0000978 -0.0486989 0.012359 0.0000978 -0.0626331 0.012359 0.0000978 -0.0802616 0.012359 0.0000978 -0.102564 0.012359 0.0000978 -0.1307795 0.012359 0.0000978 -0.1664757 0.012359 0.0000978 -0.2116361 0.012359 0.0000978 -0.2687698 0.012359 0.0000978 -0.3410514 0.012359 0.0000978 -0.432497 0.012359 0.0000978 -0.5481876 0.012359 0.0000978 -0.6945513 0.012359 0.0000978 -0.8398756 0.016719 0.0050826 -0.9030276 0.0374096 0.0277752 -0.9353068 0.0698653 0.0622749 -0.9544774 0.111645 0.1058162 -0.9668902 0.1614723 0.1570779 -0.9753825 0.2182328 0.2149725 -0.9814136 0.2806171 0.2782347 -0.9858113 0.3470137 0.3452987 -0.9890801 0.4155452 0.414329 -0.9915446 0.484202 0.4833522 -0.9934225 0.5510274 0.5504419 -0.9948653 0.6143035 0.6139056 -0.9959807 0.6726952 0.672428 -0.9968472 0.7253227 0.7251454 -0.9975228 0.7717611 0.7716446 -0.9980511 0.8119816 0.8119057 -0.9984653 0.8462596 0.8462106 -0.9987904 0.8750749 0.8750434 -0.9990461 0.8990201 0.899 -0.9992474 0.9187285 0.9187157 -0.999406 0.9348222 0.9348141 -0.999531 0.9478798 0.9478746 -0.9996296 0.9584187 0.9584155 -0.9997074 0.9668891 0.966887 -0.9997689 0.9736737 0.9736724 -0.9998174 0.9790934 0.9790926 -0.9998557 0.9834134 0.9834129 -0.999886 0.9868508 0.9868505 -0.9999099 0.9895822 0.989582 -0.9999288 0.9917502 0.9917501 -0.9999437 0.9934696 0.9934695 -0.0000238 0.0185862 0.0020256 -0.0000382 0.0180827 0.0015221 -0.0000611 0.0174505 0.0008899 -0.0000978 0.0166583 0.0000978 -0.0011463 0.0166583 0.0000978 -0.0024729 0.0166583 0.0000978 -0.0041512 0.0166583 0.0000978 -0.0062744 0.0166583 0.0000978 -0.0089606 0.0166583 0.0000978 -0.012359 0.0166583 0.0000978 -0.0166583 0.0166583 0.0000978 -0.0220976 0.0166583 0.0000978 -0.028979 0.0166583 0.0000978 -0.0376849 0.0166583 0.0000978 -0.0486989 0.0166583 0.0000978 -0.0626331 0.0166583 0.0000978 -0.0802616 0.0166583 0.0000978 -0.102564 0.0166583 0.0000978 -0.1307795 0.0166583 0.0000978 -0.1664757 0.0166583 0.0000978 -0.2116361 0.0166583 0.0000978 -0.2687698 0.0166583 0.0000978 -0.3410514 0.0166583 0.0000978 -0.432497 0.0166583 0.0000978 -0.5481876 0.0166583 0.0000978 -0.6945513 0.0166583 0.0000978 -0.8398756 0.0207992 0.0050826 -0.9030276 0.0407879 0.0277752 -0.9353068 0.0725268 0.0622749 -0.9544774 0.1136888 0.1058162 -0.9668902 0.1630131 0.1570779 -0.9753825 0.219376 0.2149725 -0.9814136 0.2814525 0.2782347 -0.9858113 0.347615 0.3452987 -0.9890801 0.4159716 0.414329 -0.9915446 0.4845 0.4833522 -0.9934225 0.5512327 0.5504419 -0.9948653 0.6144431 0.6139056 -0.9959807 0.6727888 0.672428 -0.9968472 0.7253848 0.7251454 -0.9975228 0.7718019 0.7716446 -0.9980511 0.8120082 0.8119057 -0.9984653 0.8462768 0.8462106 -0.9987904 0.875086 0.8750434 -0.9990461 0.8990272 0.899 -0.9992474 0.918733 0.9187157 -0.999406 0.9348251 0.9348141 -0.999531 0.9478816 0.9478746 -0.9996296 0.9584199 0.9584155 -0.9997074 0.9668898 0.966887 -0.9997689 0.9736742 0.9736724 -0.9998174 0.9790937 0.9790926 -0.9998557 0.9834135 0.9834129 -0.999886 0.9868509 0.9868505 -0.9999099 0.9895822 0.989582 -0.9999288 0.9917502 0.9917501 -0.9999437 0.9934696 0.9934695 -0.0000238 0.0240255 0.0020256 -0.0000382 0.023522 0.0015221 -0.0000611 0.0228898 0.0008899 -0.0000978 0.0220976 0.0000978 -0.0011463 0.0220976 0.0000978 -0.0024729 0.0220976 0.0000978 -0.0041512 0.0220976 0.0000978 -0.0062744 0.0220976 0.0000978 -0.0089606 0.0220976 0.0000978 -0.012359 0.0220976 0.0000978 -0.0166583 0.0220976 0.0000978 -0.0220976 0.0220976 0.0000978 -0.028979 0.0220976 0.0000978 -0.0376849 0.0220976 0.0000978 -0.0486989 0.0220976 0.0000978 -0.0626331 0.0220976 0.0000978 -0.0802616 0.0220976 0.0000978 -0.102564 0.0220976 0.0000978 -0.1307795 0.0220976 0.0000978 -0.1664757 0.0220976 0.0000978 -0.2116361 0.0220976 0.0000978 -0.2687698 0.0220976 0.0000978 -0.3410514 0.0220976 0.0000978 -0.432497 0.0220976 0.0000978 -0.5481876 0.0220976 0.0000978 -0.6945513 0.0220976 0.0000978 -0.8398756 0.0259613 0.0050826 -0.9030276 0.0450619 0.0277752 -0.9353068 0.075894 0.0622749 -0.9544774 0.1162746 0.1058162 -0.9668902 0.1649625 0.1570779 -0.9753825 0.2208224 0.2149725 -0.9814136 0.2825094 0.2782347 -0.9858113 0.3483758 0.3452987 -0.9890801 0.4165111 0.414329 -0.9915446 0.484877 0.4833522 -0.9934225 0.5514924 0.5504419 -0.9948653 0.6146196 0.6139056 -0.9959807 0.6729073 0.672428 -0.9968472 0.7254635 0.7251454 -0.9975228 0.7718536 0.7716446 -0.9980511 0.8120419 0.8119057 -0.9984653 0.8462986 0.8462106 -0.9987904 0.8750999 0.8750434 -0.9990461 0.8990361 0.899 -0.9992474 0.9187387 0.9187157 -0.999406 0.9348287 0.9348141 -0.999531 0.9478839 0.9478746 -0.9996296 0.9584213 0.9584155 -0.9997074 0.9668907 0.966887 -0.9997689 0.9736747 0.9736724 -0.9998174 0.979094 0.9790926 -0.9998557 0.9834138 0.9834129 -0.999886 0.986851 0.9868505 -0.9999099 0.9895823 0.989582 -0.9999288 0.9917503 0.9917501 -0.9999437 0.9934696 0.9934695 -0.0000238 0.0309069 0.0020256 -0.0000382 0.0304033 0.0015221 -0.0000611 0.0297711 0.0008899 -0.0000978 0.028979 0.0000978 -0.0011463 0.028979 0.0000978 -0.0024729 0.028979 0.0000978 -0.0041512 0.028979 0.0000978 -0.0062744 0.028979 0.0000978 -0.0089606 0.028979 0.0000978 -0.012359 0.028979 0.0000978 -0.0166583 0.028979 0.0000978 -0.0220976 0.028979 0.0000978 -0.028979 0.028979 0.0000978 -0.0376849 0.028979 0.0000978 -0.0486989 0.028979 0.0000978 -0.0626331 0.028979 0.0000978 -0.0802616 0.028979 0.0000978 -0.102564 0.028979 0.0000978 -0.1307795 0.028979 0.0000978 -0.1664757 0.028979 0.0000978 -0.2116361 0.028979 0.0000978 -0.2687698 0.028979 0.0000978 -0.3410514 0.028979 0.0000978 -0.432497 0.028979 0.0000978 -0.5481876 0.028979 0.0000978 -0.6945513 0.028979 0.0000978 -0.8398756 0.032492 0.0050826 -0.9030276 0.050469 0.0277752 -0.9353068 0.080154 0.0622749 -0.9544774 0.1195459 0.1058162 -0.9668902 0.1674288 0.1570779 -0.9753825 0.2226522 0.2149725 -0.9814136 0.2838465 0.2782347 -0.9858113 0.3493382 0.3452987 -0.9890801 0.4171936 0.414329 -0.9915446 0.485354 0.4833522 -0.9934225 0.551821 0.5504419 -0.9948653 0.6148429 0.6139056 -0.9959807 0.6730573 0.672428 -0.9968472 0.725563 0.7251454 -0.9975228 0.771919 0.7716446 -0.9980511 0.8120844 0.8119057 -0.9984653 0.8463261 0.8462106 -0.9987904 0.8751176 0.8750434 -0.9990461 0.8990474 0.899 -0.9992474 0.9187459 0.9187157 -0.999406 0.9348332 0.9348141 -0.999531 0.9478867 0.9478746 -0.9996296 0.9584231 0.9584155 -0.9997074 0.9668918 0.966887 -0.9997689 0.9736754 0.9736724 -0.9998174 0.9790945 0.9790926 -0.9998557 0.983414 0.9834129 -0.999886 0.9868512 0.9868505 -0.9999099 0.9895824 0.989582 -0.9999288 0.9917504 0.9917501 -0.9999437 0.9934697 0.9934695 -0.0000238 0.0396127 0.0020256 -0.0000382 0.0391092 0.0015221 -0.0000611 0.038477 0.0008899 -0.0000978 0.0376849 0.0000978 -0.0011463 0.0376849 0.0000978 -0.0024729 0.0376849 0.0000978 -0.0041512 0.0376849 0.0000978 -0.0062744 0.0376849 0.0000978 -0.0089606 0.0376849 0.0000978 -0.012359 0.0376849 0.0000978 -0.0166583 0.0376849 0.0000978 -0.0220976 0.0376849 0.0000978 -0.028979 0.0376849 0.0000978 -0.0376849 0.0376849 0.0000978 -0.0486989 0.0376849 0.0000978 -0.0626331 0.0376849 0.0000978 -0.0802616 0.0376849 0.0000978 -0.102564 0.0376849 0.0000978 -0.1307795 0.0376849 0.0000978 -0.1664757 0.0376849 0.0000978 -0.2116361 0.0376849 0.0000978 -0.2687698 0.0376849 0.0000978 -0.3410514 0.0376849 0.0000978 -0.432497 0.0376849 0.0000978 -0.5481876 0.0376849 0.0000978 -0.6945513 0.0376849 0.0000978 -0.8398756 0.0407541 0.0050826 -0.9030276 0.0573098 0.0277752 -0.9353068 0.0855434 0.0622749 -0.9544774 0.1236845 0.1058162 -0.9668902 0.1705489 0.1570779 -0.9753825 0.2249671 0.2149725 -0.9814136 0.2855381 0.2782347 -0.9858113 0.3505559 0.3452987 -0.9890801 0.4180571 0.414329 -0.9915446 0.4859574 0.4833522 -0.9934225 0.5522367 0.5504419 -0.9948653 0.6151255 0.6139056 -0.9959807 0.6732469 0.672428 -0.9968472 0.7256889 0.7251454 -0.9975228 0.7720017 0.7716446 -0.9980511 0.8121383 0.8119057 -0.9984653 0.846361 0.8462106 -0.9987904 0.87514 0.8750434 -0.9990461 0.8990617 0.899 -0.9992474 0.918755 0.9187157 -0.999406 0.934839 0.9348141 -0.999531 0.9478904 0.9478746 -0.9996296 0.9584254 0.9584155 -0.9997074 0.9668933 0.966887 -0.9997689 0.9736764 0.9736724 -0.9998174 0.9790951 0.9790926 -0.9998557 0.9834144 0.9834129 -0.999886 0.9868514 0.9868505 -0.9999099 0.9895826 0.989582 -0.9999288 0.9917505 0.9917501 -0.9999437 0.9934697 0.9934695 -0.0000238 0.0506267 0.0020256 -0.0000382 0.0501232 0.0015221 -0.0000611 0.049491 0.0008899 -0.0000978 0.0486989 0.0000978 -0.0011463 0.0486989 0.0000978 -0.0024729 0.0486989 0.0000978 -0.0041512 0.0486989 0.0000978 -0.0062744 0.0486989 0.0000978 -0.0089606 0.0486989 0.0000978 -0.012359 0.0486989 0.0000978 -0.0166583 0.0486989 0.0000978 -0.0220976 0.0486989 0.0000978 -0.028979 0.0486989 0.0000978 -0.0376849 0.0486989 0.0000978 -0.0486989 0.0486989 0.0000978 -0.0626331 0.0486989 0.0000978 -0.0802616 0.0486989 0.0000978 -0.102564 0.0486989 0.0000978 -0.1307795 0.0486989 0.0000978 -0.1664757 0.0486989 0.0000978 -0.2116361 0.0486989 0.0000978 -0.2687698 0.0486989 0.0000978 -0.3410514 0.0486989 0.0000978 -0.432497 0.0486989 0.0000978 -0.5481876 0.0486989 0.0000978 -0.6945513 0.0486989 0.0000978 -0.8398756 0.0512068 0.0050826 -0.9030276 0.0659642 0.0277752 -0.9353068 0.0923618 0.0622749 -0.9544774 0.1289204 0.1058162 -0.9668902 0.1744962 0.1570779 -0.9753825 0.2278958 0.2149725 -0.9814136 0.2876782 0.2782347 -0.9858113 0.3520964 0.3452987 -0.9890801 0.4191496 0.414329 -0.9915446 0.4867208 0.4833522 -0.9934225 0.5527626 0.5504419 -0.9948653 0.615483 0.6139056 -0.9959807 0.6734869 0.672428 -0.9968472 0.7258482 0.7251454 -0.9975228 0.7721064 0.7716446 -0.9980511 0.8122065 0.8119057 -0.9984653 0.8464051 0.8462106 -0.9987904 0.8751683 0.8750434 -0.9990461 0.8990798 0.899 -0.9992474 0.9187665 0.9187157 -0.999406 0.9348463 0.9348141 -0.999531 0.947895 0.9478746 -0.9996296 0.9584283 0.9584155 -0.9997074 0.9668951 0.966887 -0.9997689 0.9736775 0.9736724 -0.9998174 0.9790958 0.9790926 -0.9998557 0.9834149 0.9834129 -0.999886 0.9868517 0.9868505 -0.9999099 0.9895828 0.989582 -0.9999288 0.9917506 0.9917501 -0.9999437 0.9934698 0.9934695 -0.0000238 0.0645609 0.0020256 -0.0000382 0.0640574 0.0015221 -0.0000611 0.0634252 0.0008899 -0.0000978 0.0626331 0.0000978 -0.0011463 0.0626331 0.0000978 -0.0024729 0.0626331 0.0000978 -0.0041512 0.0626331 0.0000978 -0.0062744 0.0626331 0.0000978 -0.0089606 0.0626331 0.0000978 -0.012359 0.0626331 0.0000978 -0.0166583 0.0626331 0.0000978 -0.0220976 0.0626331 0.0000978 -0.028979 0.0626331 0.0000978 -0.0376849 0.0626331 0.0000978 -0.0486989 0.0626331 0.0000978 -0.0626331 0.0626331 0.0000978 -0.0802616 0.0626331 0.0000978 -0.102564 0.0626331 0.0000978 -0.1307795 0.0626331 0.0000978 -0.1664757 0.0626331 0.0000978 -0.2116361 0.0626331 0.0000978 -0.2687698 0.0626331 0.0000978 -0.3410514 0.0626331 0.0000978 -0.432497 0.0626331 0.0000978 -0.5481876 0.0626331 0.0000978 -0.6945513 0.0626331 0.0000978 -0.8398756 0.0644309 0.0050826 -0.9030276 0.0769132 0.0277752 -0.9353068 0.1009878 0.0622749 -0.9544774 0.1355445 0.1058162 -0.9668902 0.1794901 0.1570779 -0.9753825 0.231601 0.2149725 -0.9814136 0.2903857 0.2782347 -0.9858113 0.3540453 0.3452987 -0.9890801 0.4205316 0.414329 -0.9915446 0.4876866 0.4833522 -0.9934225 0.553428 0.5504419 -0.9948653 0.6159352 0.6139056 -0.9959807 0.6737905 0.672428 -0.9968472 0.7260496 0.7251454 -0.9975228 0.7722388 0.7716446 -0.9980511 0.8122927 0.8119057 -0.9984653 0.8464608 0.8462106 -0.9987904 0.8752041 0.8750434 -0.9990461 0.8991027 0.899 -0.9992474 0.918781 0.9187157 -0.999406 0.9348555 0.9348141 -0.999531 0.9479008 0.9478746 -0.9996296 0.958432 0.9584155 -0.9997074 0.9668974 0.966887 -0.9997689 0.973679 0.9736724 -0.9998174 0.9790967 0.9790926 -0.9998557 0.9834154 0.9834129 -0.999886 0.9868521 0.9868505 -0.9999099 0.989583 0.989582 -0.9999288 0.9917507 0.9917501 -0.9999437 0.9934699 0.9934695 -0.0000238 0.0821895 0.0020256 -0.0000382 0.081686 0.0015221 -0.0000611 0.0810538 0.0008899 -0.0000978 0.0802616 0.0000978 -0.0011463 0.0802616 0.0000978 -0.0024729 0.0802616 0.0000978 -0.0041512 0.0802616 0.0000978 -0.0062744 0.0802616 0.0000978 -0.0089606 0.0802616 0.0000978 -0.012359 0.0802616 0.0000978 -0.0166583 0.0802616 0.0000978 -0.0220976 0.0802616 0.0000978 -0.028979 0.0802616 0.0000978 -0.0376849 0.0802616 0.0000978 -0.0486989 0.0802616 0.0000978 -0.0626331 0.0802616 0.0000978 -0.0802616 0.0802616 0.0000978 -0.102564 0.0802616 0.0000978 -0.1307795 0.0802616 0.0000978 -0.1664757 0.0802616 0.0000978 -0.2116361 0.0802616 0.0000978 -0.2687698 0.0802616 0.0000978 -0.3410514 0.0802616 0.0000978 -0.432497 0.0802616 0.0000978 -0.5481876 0.0802616 0.0000978 -0.6945513 0.0802616 0.0000978 -0.8398756 0.081161 0.0050826 -0.9030276 0.0907651 0.0277752 -0.9353068 0.1119009 0.0622749 -0.9544774 0.1439249 0.1058162 -0.9668902 0.185808 0.1570779 -0.9753825 0.2362885 0.2149725 -0.9814136 0.293811 0.2782347 -0.9858113 0.3565109 0.3452987 -0.9890801 0.4222801 0.414329 -0.9915446 0.4889084 0.4833522 -0.9934225 0.5542698 0.5504419 -0.9948653 0.6165074 0.6139056 -0.9959807 0.6741745 0.672428 -0.9968472 0.7263046 0.7251454 -0.9975228 0.7724063 0.7716446 -0.9980511 0.8124018 0.8119057 -0.9984653 0.8465313 0.8462106 -0.9987904 0.8752495 0.8750434 -0.9990461 0.8991317 0.899 -0.9992474 0.9187995 0.9187157 -0.999406 0.9348672 0.9348141 -0.999531 0.9479082 0.9478746 -0.9996296 0.9584367 0.9584155 -0.9997074 0.9669003 0.966887 -0.9997689 0.9736808 0.9736724 -0.9998174 0.9790979 0.9790926 -0.9998557 0.9834162 0.9834129 -0.999886 0.9868525 0.9868505 -0.9999099 0.9895833 0.989582 -0.9999288 0.9917509 0.9917501 -0.9999437 0.99347 0.9934695 -0.0000238 0.1044919 0.0020256 -0.0000382 0.1039884 0.0015221 -0.0000611 0.1033562 0.0008899 -0.0000978 0.102564 0.0000978 -0.0011463 0.102564 0.0000978 -0.0024729 0.102564 0.0000978 -0.0041512 0.102564 0.0000978 -0.0062744 0.102564 0.0000978 -0.0089606 0.102564 0.0000978 -0.012359 0.102564 0.0000978 -0.0166583 0.102564 0.0000978 -0.0220976 0.102564 0.0000978 -0.028979 0.102564 0.0000978 -0.0376849 0.102564 0.0000978 -0.0486989 0.102564 0.0000978 -0.0626331 0.102564 0.0000978 -0.0802616 0.102564 0.0000978 -0.102564 0.102564 0.0000978 -0.1307795 0.102564 0.0000978 -0.1664757 0.102564 0.0000978 -0.2116361 0.102564 0.0000978 -0.2687698 0.102564 0.0000978 -0.3410514 0.102564 0.0000978 -0.432497 0.102564 0.0000978 -0.5481876 0.102564 0.0000978 -0.6945513 0.102564 0.0000978 -0.8398756 0.1023268 0.0050826 -0.9030276 0.1082896 0.0277752 -0.9353068 0.1257074 0.0622749 -0.9544774 0.1545271 0.1058162 -0.9668902 0.1938011 0.1570779 -0.9753825 0.2422188 0.2149725 -0.9814136 0.2981445 0.2782347 -0.9858113 0.3596303 0.3452987 -0.9890801 0.4244922 0.414329 -0.9915446 0.4904542 0.4833522 -0.9934225 0.5553347 0.5504419 -0.9948653 0.6172312 0.6139056 -0.9959807 0.6746604 0.672428 -0.9968472 0.7266271 0.7251454 -0.9975228 0.7726182 0.7716446 -0.9980511 0.8125399 0.8119057 -0.9984653 0.8466206 0.8462106 -0.9987904 0.8753068 0.8750434 -0.9990461 0.8991683 0.899 -0.9992474 0.9188228 0.9187157 -0.999406 0.934882 0.9348141 -0.999531 0.9479176 0.9478746 -0.9996296 0.9584426 0.9584155 -0.9997074 0.9669041 0.966887 -0.9997689 0.9736831 0.9736724 -0.9998174 0.9790993 0.9790926 -0.9998557 0.9834171 0.9834129 -0.999886 0.9868531 0.9868505 -0.9999099 0.9895836 0.989582 -0.9999288 0.9917511 0.9917501 -0.9999437 0.9934701 0.9934695 -0.0000238 0.1327073 0.0020256 -0.0000382 0.1322038 0.0015221 -0.0000611 0.1315716 0.0008899 -0.0000978 0.1307795 0.0000978 -0.0011463 0.1307795 0.0000978 -0.0024729 0.1307795 0.0000978 -0.0041512 0.1307795 0.0000978 -0.0062744 0.1307795 0.0000978 -0.0089606 0.1307795 0.0000978 -0.012359 0.1307795 0.0000978 -0.0166583 0.1307795 0.0000978 -0.0220976 0.1307795 0.0000978 -0.028979 0.1307795 0.0000978 -0.0376849 0.1307795 0.0000978 -0.0486989 0.1307795 0.0000978 -0.0626331 0.1307795 0.0000978 -0.0802616 0.1307795 0.0000978 -0.102564 0.1307795 0.0000978 -0.1307795 0.1307795 0.0000978 -0.1664757 0.1307795 0.0000978 -0.2116361 0.1307795 0.0000978 -0.2687698 0.1307795 0.0000978 -0.3410514 0.1307795 0.0000978 -0.432497 0.1307795 0.0000978 -0.5481876 0.1307795 0.0000978 -0.6945513 0.1307795 0.0000978 -0.8398756 0.1291042 0.0050826 -0.9030276 0.1304603 0.0277752 -0.9353068 0.1431744 0.0622749 -0.9544774 0.1679403 0.1058162 -0.9668902 0.2039133 0.1570779 -0.9753825 0.2497215 0.2149725 -0.9814136 0.3036269 0.2782347 -0.9858113 0.3635767 0.3452987 -0.9890801 0.4272908 0.414329 -0.9915446 0.4924099 0.4833522 -0.9934225 0.556682 0.5504419 -0.9948653 0.618147 0.6139056 -0.9959807 0.6752752 0.672428 -0.9968472 0.7270351 0.7251454 -0.9975228 0.7728863 0.7716446 -0.9980511 0.8127145 0.8119057 -0.9984653 0.8467335 0.8462106 -0.9987904 0.8753793 0.8750434 -0.9990461 0.8992146 0.899 -0.9992474 0.9188523 0.9187157 -0.999406 0.9349007 0.9348141 -0.999531 0.9479294 0.9478746 -0.9996296 0.95845 0.9584155 -0.9997074 0.9669087 0.966887 -0.9997689 0.9736861 0.9736724 -0.9998174 0.9791012 0.9790926 -0.9998557 0.9834182 0.9834129 -0.999886 0.9868538 0.9868505 -0.9999099 0.9895841 0.989582 -0.9999288 0.9917514 0.9917501 -0.9999437 0.9934703 0.9934695 -0.0000238 0.1684036 0.0020256 -0.0000382 0.1679 0.0015221 -0.0000611 0.1672678 0.0008899 -0.0000978 0.1664757 0.0000978 -0.0011463 0.1664757 0.0000978 -0.0024729 0.1664757 0.0000978 -0.0041512 0.1664757 0.0000978 -0.0062744 0.1664757 0.0000978 -0.0089606 0.1664757 0.0000978 -0.012359 0.1664757 0.0000978 -0.0166583 0.1664757 0.0000978 -0.0220976 0.1664757 0.0000978 -0.028979 0.1664757 0.0000978 -0.0376849 0.1664757 0.0000978 -0.0486989 0.1664757 0.0000978 -0.0626331 0.1664757 0.0000978 -0.0802616 0.1664757 0.0000978 -0.102564 0.1664757 0.0000978 -0.1307795 0.1664757 0.0000978 -0.1664757 0.1664757 0.0000978 -0.2116361 0.1664757 0.0000978 -0.2687698 0.1664757 0.0000978 -0.3410514 0.1664757 0.0000978 -0.432497 0.1664757 0.0000978 -0.5481876 0.1664757 0.0000978 -0.6945513 0.1664757 0.0000978 -0.8398756 0.1629812 0.0050826 -0.9030276 0.1585092 0.0277752 -0.9353068 0.1652725 0.0622749 -0.9544774 0.1849097 0.1058162 -0.9668902 0.2167065 0.1570779 -0.9753825 0.2592133 0.2149725 -0.9814136 0.3105628 0.2782347 -0.9858113 0.3685693 0.3452987 -0.9890801 0.4308314 0.414329 -0.9915446 0.494884 0.4833522 -0.9934225 0.5583865 0.5504419 -0.9948653 0.6193055 0.6139056 -0.9959807 0.6760529 0.672428 -0.9968472 0.7275513 0.7251454 -0.9975228 0.7732255 0.7716446 -0.9980511 0.8129354 0.8119057 -0.9984653 0.8468763 0.8462106 -0.9987904 0.8754711 0.8750434 -0.9990461 0.8992733 0.899 -0.9992474 0.9188896 0.9187157 -0.999406 0.9349243 0.9348141 -0.999531 0.9479443 0.9478746 -0.9996296 0.9584595 0.9584155 -0.9997074 0.9669147 0.966887 -0.9997689 0.9736898 0.9736724 -0.9998174 0.9791035 0.9790926 -0.9998557 0.9834197 0.9834129 -0.999886 0.9868547 0.9868505 -0.9999099 0.9895847 0.989582 -0.9999288 0.9917518 0.9917501 -0.9999437 0.9934705 0.9934695 -0.0000238 0.2135639 0.0020256 -0.0000382 0.2130604 0.0015221 -0.0000611 0.2124282 0.0008899 -0.0000978 0.2116361 0.0000978 -0.0011463 0.2116361 0.0000978 -0.0024729 0.2116361 0.0000978 -0.0041512 0.2116361 0.0000978 -0.0062744 0.2116361 0.0000978 -0.0089606 0.2116361 0.0000978 -0.012359 0.2116361 0.0000978 -0.0166583 0.2116361 0.0000978 -0.0220976 0.2116361 0.0000978 -0.028979 0.2116361 0.0000978 -0.0376849 0.2116361 0.0000978 -0.0486989 0.2116361 0.0000978 -0.0626331 0.2116361 0.0000978 -0.0802616 0.2116361 0.0000978 -0.102564 0.2116361 0.0000978 -0.1307795 0.2116361 0.0000978 -0.1664757 0.2116361 0.0000978 -0.2116361 0.2116361 0.0000978 -0.2687698 0.2116361 0.0000978 -0.3410514 0.2116361 0.0000978 -0.432497 0.2116361 0.0000978 -0.5481876 0.2116361 0.0000978 -0.6945513 0.2116361 0.0000978 -0.8398756 0.20584 0.0050826 -0.9030276 0.1939946 0.0277752 -0.9353068 0.1932293 0.0622749 -0.9544774 0.2063783 0.1058162 -0.9668902 0.2328916 0.1570779 -0.9753825 0.2712217 0.2149725 -0.9814136 0.3193377 0.2782347 -0.9858113 0.3748857 0.3452987 -0.9890801 0.4353106 0.414329 -0.9915446 0.4980141 0.4833522 -0.9934225 0.5605429 0.5504419 -0.9948653 0.6207712 0.6139056 -0.9959807 0.6770368 0.672428 -0.9968472 0.7282043 0.7251454 -0.9975228 0.7736546 0.7716446 -0.9980511 0.813215 0.8119057 -0.9984653 0.847057 0.8462106 -0.9987904 0.8755872 0.8750434 -0.9990461 0.8993475 0.899 -0.9992474 0.9189368 0.9187157 -0.999406 0.9349542 0.9348141 -0.999531 0.9479633 0.9478746 -0.9996296 0.9584714 0.9584155 -0.9997074 0.9669222 0.966887 -0.9997689 0.9736945 0.9736724 -0.9998174 0.9791065 0.9790926 -0.9998557 0.9834216 0.9834129 -0.999886 0.9868559 0.9868505 -0.9999099 0.9895854 0.989582 -0.9999288 0.9917522 0.9917501 -0.9999437 0.9934708 0.9934695 -0.0000238 0.2706977 0.0020256 -0.0000382 0.2701941 0.0015221 -0.0000611 0.2695619 0.0008899 -0.0000978 0.2687698 0.0000978 -0.0011463 0.2687698 0.0000978 -0.0024729 0.2687698 0.0000978 -0.0041512 0.2687698 0.0000978 -0.0062744 0.2687698 0.0000978 -0.0089606 0.2687698 0.0000978 -0.012359 0.2687698 0.0000978 -0.0166583 0.2687698 0.0000978 -0.0220976 0.2687698 0.0000978 -0.028979 0.2687698 0.0000978 -0.0376849 0.2687698 0.0000978 -0.0486989 0.2687698 0.0000978 -0.0626331 0.2687698 0.0000978 -0.0802616 0.2687698 0.0000978 -0.102564 0.2687698 0.0000978 -0.1307795 0.2687698 0.0000978 -0.1664757 0.2687698 0.0000978 -0.2116361 0.2687698 0.0000978 -0.2687698 0.2687698 0.0000978 -0.3410514 0.2687698 0.0000978 -0.432497 0.2687698 0.0000978 -0.5481876 0.2687698 0.0000978 -0.6945513 0.2687698 0.0000978 -0.8398756 0.2600619 0.0050826 -0.9030276 0.2388883 0.0277752 -0.9353068 0.2285984 0.0622749 -0.9544774 0.2335388 0.1058162 -0.9668902 0.2533679 0.1570779 -0.9753825 0.2864139 0.2149725 -0.9814136 0.3304391 0.2782347 -0.9858113 0.3828768 0.3452987 -0.9890801 0.4409775 0.414329 -0.9915446 0.5019741 0.4833522 -0.9934225 0.563271 0.5504419 -0.9948653 0.6226256 0.6139056 -0.9959807 0.6782815 0.672428 -0.9968472 0.7290305 0.7251454 -0.9975228 0.7741975 0.7716446 -0.9980511 0.8135686 0.8119057 -0.9984653 0.8472856 0.8462106 -0.9987904 0.875734 0.8750434 -0.9990461 0.8994413 0.899 -0.9992474 0.9189965 0.9187157 -0.999406 0.9349921 0.9348141 -0.999531 0.9479872 0.9478746 -0.9996296 0.9584865 0.9584155 -0.9997074 0.9669317 0.966887 -0.9997689 0.9737005 0.9736724 -0.9998174 0.9791102 0.9790926 -0.9998557 0.9834239 0.9834129 -0.999886 0.9868574 0.9868505 -0.9999099 0.9895863 0.989582 -0.9999288 0.9917528 0.9917501 -0.9999437 0.9934712 0.9934695 -0.0000238 0.3429792 0.0020256 -0.0000382 0.3424757 0.0015221 -0.0000611 0.3418435 0.0008899 -0.0000978 0.3410514 0.0000978 -0.0011463 0.3410514 0.0000978 -0.0024729 0.3410514 0.0000978 -0.0041512 0.3410514 0.0000978 -0.0062744 0.3410514 0.0000978 -0.0089606 0.3410514 0.0000978 -0.012359 0.3410514 0.0000978 -0.0166583 0.3410514 0.0000978 -0.0220976 0.3410514 0.0000978 -0.028979 0.3410514 0.0000978 -0.0376849 0.3410514 0.0000978 -0.0486989 0.3410514 0.0000978 -0.0626331 0.3410514 0.0000978 -0.0802616 0.3410514 0.0000978 -0.102564 0.3410514 0.0000978 -0.1307795 0.3410514 0.0000978 -0.1664757 0.3410514 0.0000978 -0.2116361 0.3410514 0.0000978 -0.2687698 0.3410514 0.0000978 -0.3410514 0.3410514 0.0000978 -0.432497 0.3410514 0.0000978 -0.5481876 0.3410514 0.0000978 -0.6945513 0.3410514 0.0000978 -0.8398756 0.3286597 0.0050826 -0.9030276 0.2956846 0.0277752 -0.9353068 0.2733449 0.0622749 -0.9544774 0.2679003 0.1058162 -0.9668902 0.2792731 0.1570779 -0.9753825 0.3056339 0.2149725 -0.9814136 0.3444838 0.2782347 -0.9858113 0.3929865 0.3452987 -0.9890801 0.4481468 0.414329 -0.9915446 0.506984 0.4833522 -0.9934225 0.5667225 0.5504419 -0.9948653 0.6249715 0.6139056 -0.9959807 0.6798563 0.672428 -0.9968472 0.7300757 0.7251454 -0.9975228 0.7748843 0.7716446 -0.9980511 0.8140159 0.8119057 -0.9984653 0.8475749 0.8462106 -0.9987904 0.8759198 0.8750434 -0.9990461 0.8995601 0.899 -0.9992474 0.919072 0.9187157 -0.999406 0.93504 0.9348141 -0.999531 0.9480175 0.9478746 -0.9996296 0.9585056 0.9584155 -0.9997074 0.9669437 0.966887 -0.9997689 0.9737081 0.9736724 -0.9998174 0.979115 0.9790926 -0.9998557 0.9834269 0.9834129 -0.999886 0.9868592 0.9868505 -0.9999099 0.9895875 0.989582 -0.9999288 0.9917535 0.9917501 -0.9999437 0.9934716 0.9934695 -0.0000238 0.4344249 0.0020256 -0.0000382 0.4339214 0.0015221 -0.0000611 0.4332891 0.0008899 -0.0000978 0.432497 0.0000978 -0.0011463 0.432497 0.0000978 -0.0024729 0.432497 0.0000978 -0.0041512 0.432497 0.0000978 -0.0062744 0.432497 0.0000978 -0.0089606 0.432497 0.0000978 -0.012359 0.432497 0.0000978 -0.0166583 0.432497 0.0000978 -0.0220976 0.432497 0.0000978 -0.028979 0.432497 0.0000978 -0.0376849 0.432497 0.0000978 -0.0486989 0.432497 0.0000978 -0.0626331 0.432497 0.0000978 -0.0802616 0.432497 0.0000978 -0.102564 0.432497 0.0000978 -0.1307795 0.432497 0.0000978 -0.1664757 0.432497 0.0000978 -0.2116361 0.432497 0.0000978 -0.2687698 0.432497 0.0000978 -0.3410514 0.432497 0.0000978 -0.432497 0.432497 0.0000978 -0.5481876 0.432497 0.0000978 -0.6945513 0.432497 0.0000978 -0.8398756 0.4154448 0.0050826 -0.9030276 0.3675394 0.0277752 -0.9353068 0.3299551 0.0622749 -0.9544774 0.3113722 0.1058162 -0.9668902 0.3120464 0.1570779 -0.9753825 0.3299499 0.2149725 -0.9814136 0.3622521 0.2782347 -0.9858113 0.4057766 0.3452987 -0.9890801 0.4572169 0.414329 -0.9915446 0.5133222 0.4833522 -0.9934225 0.571089 0.5504419 -0.9948653 0.6279395 0.6139056 -0.9959807 0.6818486 0.672428 -0.9968472 0.731398 0.7251454 -0.9975228 0.7757532 0.7716446 -0.9980511 0.8145819 0.8119057 -0.9984653 0.8479408 0.8462106 -0.9987904 0.8761549 0.8750434 -0.9990461 0.8997103 0.899 -0.9992474 0.9191676 0.9187157 -0.999406 0.9351006 0.9348141 -0.999531 0.9480558 0.9478746 -0.9996296 0.9585297 0.9584155 -0.9997074 0.9669589 0.966887 -0.9997689 0.9737176 0.9736724 -0.9998174 0.979121 0.9790926 -0.9998557 0.9834306 0.9834129 -0.999886 0.9868616 0.9868505 -0.9999099 0.989589 0.989582 -0.9999288 0.9917544 0.9917501 -0.9999437 0.9934722 0.9934695 -0.0000238 0.5501155 0.0020256 -0.0000382 0.549612 0.0015221 -0.0000611 0.5489798 0.0008899 -0.0000978 0.5481876 0.0000978 -0.0011463 0.5481876 0.0000978 -0.0024729 0.5481876 0.0000978 -0.0041512 0.5481876 0.0000978 -0.0062744 0.5481876 0.0000978 -0.0089606 0.5481876 0.0000978 -0.012359 0.5481876 0.0000978 -0.0166583 0.5481876 0.0000978 -0.0220976 0.5481876 0.0000978 -0.028979 0.5481876 0.0000978 -0.0376849 0.5481876 0.0000978 -0.0486989 0.5481876 0.0000978 -0.0626331 0.5481876 0.0000978 -0.0802616 0.5481876 0.0000978 -0.102564 0.5481876 0.0000978 -0.1307795 0.5481876 0.0000978 -0.1664757 0.5481876 0.0000978 -0.2116361 0.5481876 0.0000978 -0.2687698 0.5481876 0.0000978 -0.3410514 0.5481876 0.0000978 -0.432497 0.5481876 0.0000978 -0.5481876 0.5481876 0.0000978 -0.6945513 0.5481876 0.0000978 -0.8398756 0.5252393 0.0050826 -0.9030276 0.4584451 0.0277752 -0.9353068 0.4015743 0.0622749 -0.9544774 0.3663698 0.1058162 -0.9668902 0.353509 0.1570779 -0.9753825 0.3607126 0.2149725 -0.9814136 0.3847314 0.2782347 -0.9858113 0.4219578 0.3452987 -0.9890801 0.4686918 0.414329 -0.9915446 0.5213408 0.4833522 -0.9934225 0.5766132 0.5504419 -0.9948653 0.6316943 0.6139056 -0.9959807 0.6843692 0.672428 -0.9968472 0.733071 0.7251454 -0.9975228 0.7768525 0.7716446 -0.9980511 0.815298 0.8119057 -0.9984653 0.8484037 0.8462106 -0.9987904 0.8764523 0.8750434 -0.9990461 0.8999003 0.899 -0.9992474 0.9192885 0.9187157 -0.999406 0.9351772 0.9348141 -0.999531 0.9481042 0.9478746 -0.9996296 0.9585603 0.9584155 -0.9997074 0.9669781 0.966887 -0.9997689 0.9737297 0.9736724 -0.9998174 0.9791286 0.9790926 -0.9998557 0.9834354 0.9834129 -0.999886 0.9868646 0.9868505 -0.9999099 0.9895908 0.989582 -0.9999288 0.9917556 0.9917501 -0.9999437 0.9934729 0.9934695 -0.0000238 0.6964791 0.0020256 -0.0000382 0.6959756 0.0015221 -0.0000611 0.6953434 0.0008899 -0.0000978 0.6945513 0.0000978 -0.0011463 0.6945513 0.0000978 -0.0024729 0.6945513 0.0000978 -0.0041512 0.6945513 0.0000978 -0.0062744 0.6945513 0.0000978 -0.0089606 0.6945513 0.0000978 -0.012359 0.6945513 0.0000978 -0.0166583 0.6945513 0.0000978 -0.0220976 0.6945513 0.0000978 -0.028979 0.6945513 0.0000978 -0.0376849 0.6945513 0.0000978 -0.0486989 0.6945513 0.0000978 -0.0626331 0.6945513 0.0000978 -0.0802616 0.6945513 0.0000978 -0.102564 0.6945513 0.0000978 -0.1307795 0.6945513 0.0000978 -0.1664757 0.6945513 0.0000978 -0.2116361 0.6945513 0.0000978 -0.2687698 0.6945513 0.0000978 -0.3410514 0.6945513 0.0000978 -0.432497 0.6945513 0.0000978 -0.5481876 0.6945513 0.0000978 -0.6945513 0.6945513 0.0000978 -0.8398756 0.6641436 0.0050826 -0.9030276 0.5734525 0.0277752 -0.9353068 0.4921819 0.0622749 -0.9544774 0.4359488 0.1058162 -0.9668902 0.4059646 0.1570779 -0.9753825 0.3996316 0.2149725 -0.9814136 0.4131707 0.2782347 -0.9858113 0.4424291 0.3452987 -0.9890801 0.483209 0.414329 -0.9915446 0.5314854 0.4833522 -0.9934225 0.5836021 0.5504419 -0.9948653 0.6364447 0.6139056 -0.9959807 0.687558 0.672428 -0.9968472 0.7351875 0.7251454 -0.9975228 0.7782432 0.7716446 -0.9980511 0.8162038 0.8119057 -0.9984653 0.8489893 0.8462106 -0.9987904 0.8768285 0.8750434 -0.9990461 0.9001407 0.899 -0.9992474 0.9194415 0.9187157 -0.999406 0.9352742 0.9348141 -0.999531 0.9481655 0.9478746 -0.9996296 0.9585989 0.9584155 -0.9997074 0.9670025 0.966887 -0.9997689 0.973745 0.9736724 -0.9998174 0.9791382 0.9790926 -0.9998557 0.9834414 0.9834129 -0.999886 0.9868684 0.9868505 -0.9999099 0.9895932 0.989582 -0.9999288 0.9917571 0.9917501 -0.9999437 0.9934739 0.9934695 -0.0051514 0.8407292 0.0070486 -0.0051286 0.8405071 0.0065355 -0.0051047 0.8402274 0.0058909 -0.0050826 0.8398756 0.0050826 -0.0060778 0.8398756 0.0050826 -0.0073367 0.8398756 0.0050826 -0.0089295 0.8398756 0.0050826 -0.0109445 0.8398756 0.0050826 -0.0134938 0.8398756 0.0050826 -0.016719 0.8398756 0.0050826 -0.0207992 0.8398756 0.0050826 -0.0259613 0.8398756 0.0050826 -0.032492 0.8398756 0.0050826 -0.0407541 0.8398756 0.0050826 -0.0512068 0.8398756 0.0050826 -0.0644309 0.8398756 0.0050826 -0.081161 0.8398756 0.0050826 -0.1023268 0.8398756 0.0050826 -0.1291042 0.8398756 0.0050826 -0.1629812 0.8398756 0.0050826 -0.20584 0.8398756 0.0050826 -0.2600619 0.8398756 0.0050826 -0.3286597 0.8398756 0.0050826 -0.4154448 0.8398756 0.0050826 -0.5252393 0.8398756 0.0050826 -0.6641436 0.8398756 0.0050826 -0.8398756 0.8398756 0.0050826 -0.9030276 0.7189519 0.0277752 -0.9353068 0.6068123 0.0622749 -0.9544774 0.5239754 0.1058162 -0.9668902 0.4723278 0.1570779 -0.9753825 0.448869 0.2149725 -0.9814136 0.44915 0.2782347 -0.9858113 0.4683279 0.3452987 -0.9890801 0.5015752 0.414329 -0.9915446 0.5443196 0.4833522 -0.9934225 0.5924439 0.5504419 -0.9948653 0.6424545 0.6139056 -0.9959807 0.6915922 0.672428 -0.9968472 0.7378651 0.7251454 -0.9975228 0.7800027 0.7716446 -0.9980511 0.8173499 0.8119057 -0.9984653 0.8497303 0.8462106 -0.9987904 0.8773045 0.8750434 -0.9990461 0.9004449 0.899 -0.9992474 0.919635 0.9187157 -0.999406 0.9353969 0.9348141 -0.999531 0.9482431 0.9478746 -0.9996296 0.9586479 0.9584155 -0.9997074 0.9670333 0.966887 -0.9997689 0.9737643 0.9736724 -0.9998174 0.9791503 0.9790926 -0.9998557 0.983449 0.9834129 -0.999886 0.9868731 0.9868505 -0.9999099 0.9895962 0.989582 -0.9999288 0.991759 0.9917501 -0.9999437 0.993475 0.9934695 -0.0279321 0.9033413 0.0295025 -0.0278872 0.9032596 0.0290518 -0.0278347 0.9031567 0.0284855 -0.0277752 0.9030276 0.0277752 -0.0285991 0.9030276 0.0277752 -0.0296415 0.9030276 0.0277752 -0.0309602 0.9030276 0.0277752 -0.0326286 0.9030276 0.0277752 -0.0347393 0.9030276 0.0277752 -0.0374096 0.9030276 0.0277752 -0.0407879 0.9030276 0.0277752 -0.0450619 0.9030276 0.0277752 -0.050469 0.9030276 0.0277752 -0.0573098 0.9030276 0.0277752 -0.0659642 0.9030276 0.0277752 -0.0769132 0.9030276 0.0277752 -0.0907651 0.9030276 0.0277752 -0.1082896 0.9030276 0.0277752 -0.1304603 0.9030276 0.0277752 -0.1585092 0.9030276 0.0277752 -0.1939946 0.9030276 0.0277752 -0.2388883 0.9030276 0.0277752 -0.2956846 0.9030276 0.0277752 -0.3675394 0.9030276 0.0277752 -0.4584451 0.9030276 0.0277752 -0.5734525 0.9030276 0.0277752 -0.7189519 0.9030276 0.0277752 -0.9030276 0.9030276 0.0277752 -0.9353068 0.7518347 0.0622749 -0.9544774 0.6353404 0.1058162 -0.9668902 0.5562858 0.1570779 -0.9753825 0.5111609 0.2149725 -0.9814136 0.4946685 0.2782347 -0.9858113 0.5010933 0.3452987 -0.9890801 0.5248108 0.414329 -0.9915446 0.5605565 0.4833522 -0.9934225 0.60363 0.5504419 -0.9948653 0.6500577 0.6139056 -0.9959807 0.6966961 0.672428 -0.9968472 0.7412527 0.7251454 -0.9975228 0.7822286 0.7716446 -0.9980511 0.8187998 0.8119057 -0.9984653 0.8506676 0.8462106 -0.9987904 0.8779067 0.8750434 -0.9990461 0.9008297 0.899 -0.9992474 0.9198799 0.9187157 -0.999406 0.9355521 0.9348141 -0.999531 0.9483412 0.9478746 -0.9996296 0.9587097 0.9584155 -0.9997074 0.9670722 0.966887 -0.9997689 0.9737888 0.9736724 -0.9998174 0.9791657 0.9790926 -0.9998557 0.9834587 0.9834129 -0.999886 0.9868792 0.9868505 -0.9999099 0.9896 0.989582 -0.9999288 0.9917613 0.9917501 -0.9999437 0.9934765 0.9934695 -0.0624569 0.9354466 0.0636943 -0.0624063 0.9354101 0.0633239 -0.0623458 0.9353643 0.0628585 -0.0622749 0.9353068 0.0622749 -0.062924 0.9353068 0.0622749 -0.0637452 0.9353068 0.0622749 -0.0647842 0.9353068 0.0622749 -0.0660986 0.9353068 0.0622749 -0.0677615 0.9353068 0.0622749 -0.0698653 0.9353068 0.0622749 -0.0725268 0.9353068 0.0622749 -0.075894 0.9353068 0.0622749 -0.080154 0.9353068 0.0622749 -0.0855434 0.9353068 0.0622749 -0.0923618 0.9353068 0.0622749 -0.1009878 0.9353068 0.0622749 -0.1119009 0.9353068 0.0622749 -0.1257074 0.9353068 0.0622749 -0.1431744 0.9353068 0.0622749 -0.1652725 0.9353068 0.0622749 -0.1932293 0.9353068 0.0622749 -0.2285984 0.9353068 0.0622749 -0.2733449 0.9353068 0.0622749 -0.3299551 0.9353068 0.0622749 -0.4015743 0.9353068 0.0622749 -0.4921819 0.9353068 0.0622749 -0.6068123 0.9353068 0.0622749 -0.7518347 0.9353068 0.0622749 -0.9353068 0.9353068 0.0622749 -0.9544774 0.7762317 0.1058162 -0.9668902 0.6625036 0.1570779 -0.9753825 0.5899682 0.2149725 -0.9814136 0.5522553 0.2782347 -0.9858113 0.5425458 0.3452987 -0.9890801 0.5542068 0.414329 -0.9915446 0.5810984 0.4833522 -0.9934225 0.6177818 0.5504419 -0.9948653 0.6596768 0.6139056 -0.9959807 0.7031531 0.672428 -0.9968472 0.7455383 0.7251454 -0.9975228 0.7850447 0.7716446 -0.9980511 0.8206341 0.8119057 -0.9984653 0.8518535 0.8462106 -0.9987904 0.8786686 0.8750434 -0.9990461 0.9013166 0.899 -0.9992474 0.9201896 0.9187157 -0.999406 0.9357485 0.9348141 -0.999531 0.9484653 0.9478746 -0.9996296 0.958788 0.9584155 -0.9997074 0.9671215 0.966887 -0.9997689 0.9738198 0.9736724 -0.9998174 0.9791851 0.9790926 -0.9998557 0.9834709 0.9834129 -0.999886 0.9868868 0.9868505 -0.9999099 0.9896047 0.989582 -0.9999288 0.9917643 0.9917501 -0.9999437 0.9934784 0.9934695 -0.1059991 0.9545467 0.1069495 -0.1059489 0.9545286 0.1066537 -0.1058883 0.9545059 0.1062821 -0.1058162 0.9544774 0.1058162 -0.1063147 0.9544774 0.1058162 -0.1069453 0.9544774 0.1058162 -0.1077431 0.9544774 0.1058162 -0.1087525 0.9544774 0.1058162 -0.1100294 0.9544774 0.1058162 -0.111645 0.9544774 0.1058162 -0.1136888 0.9544774 0.1058162 -0.1162746 0.9544774 0.1058162 -0.1195459 0.9544774 0.1058162 -0.1236845 0.9544774 0.1058162 -0.1289204 0.9544774 0.1058162 -0.1355445 0.9544774 0.1058162 -0.1439249 0.9544774 0.1058162 -0.1545271 0.9544774 0.1058162 -0.1679403 0.9544774 0.1058162 -0.1849097 0.9544774 0.1058162 -0.2063783 0.9544774 0.1058162 -0.2335388 0.9544774 0.1058162 -0.2679003 0.9544774 0.1058162 -0.3113722 0.9544774 0.1058162 -0.3663698 0.9544774 0.1058162 -0.4359488 0.9544774 0.1058162 -0.5239754 0.9544774 0.1058162 -0.6353404 0.9544774 0.1058162 -0.7762317 0.9544774 0.1058162 -0.9544774 0.9544774 0.1058162 -0.9668902 0.7968829 0.1570779 -0.9753825 0.6896696 0.2149725 -0.9814136 0.6251102 0.2782347 -0.9858113 0.5949885 0.3452987 -0.9890801 0.5913967 0.414329 -0.9915446 0.6070865 0.4833522 -0.9934225 0.6356857 0.5504419 -0.9948653 0.6718462 0.6139056 -0.9959807 0.7113221 0.672428 -0.9968472 0.7509603 0.7251454 -0.9975228 0.7886074 0.7716446 -0.9980511 0.8229548 0.8119057 -0.9984653 0.8533539 0.8462106 -0.9987904 0.8796324 0.8750434 -0.9990461 0.9019325 0.899 -0.9992474 0.9205815 0.9187157 -0.999406 0.935997 0.9348141 -0.999531 0.9486224 0.9478746 -0.9996296 0.9588871 0.9584155 -0.9997074 0.9671838 0.966887 -0.9997689 0.973859 0.9736724 -0.9998174 0.9792097 0.9790926 -0.9998557 0.9834863 0.9834129 -0.999886 0.9868965 0.9868505 -0.9999099 0.9896108 0.989582 -0.9999288 0.9917681 0.9917501 -0.9999437 0.9934808 0.9934695 -0.1572498 0.9669269 0.1579665 -0.1572031 0.9669173 0.1577345 -0.1571463 0.9669053 0.1574432 -0.1570779 0.9668902 0.1570779 -0.1574537 0.9668902 0.1570779 -0.1579292 0.9668902 0.1570779 -0.1585307 0.9668902 0.1570779 -0.1592916 0.9668902 0.1570779 -0.1602543 0.9668902 0.1570779 -0.1614723 0.9668902 0.1570779 -0.1630131 0.9668902 0.1570779 -0.1649625 0.9668902 0.1570779 -0.1674288 0.9668902 0.1570779 -0.1705489 0.9668902 0.1570779 -0.1744962 0.9668902 0.1570779 -0.1794901 0.9668902 0.1570779 -0.185808 0.9668902 0.1570779 -0.1938011 0.9668902 0.1570779 -0.2039133 0.9668902 0.1570779 -0.2167065 0.9668902 0.1570779 -0.2328916 0.9668902 0.1570779 -0.2533679 0.9668902 0.1570779 -0.2792731 0.9668902 0.1570779 -0.3120464 0.9668902 0.1570779 -0.353509 0.9668902 0.1570779 -0.4059646 0.9668902 0.1570779 -0.4723278 0.9668902 0.1570779 -0.5562858 0.9668902 0.1570779 -0.6625036 0.9668902 0.1570779 -0.7968829 0.9668902 0.1570779 -0.9668902 0.9668902 0.1570779 -0.9753825 0.8158049 0.2149725 -0.9814136 0.717281 0.2782347 -0.9858113 0.6613355 0.3452987 -0.9890801 0.6384466 0.414329 -0.9915446 0.6399649 0.4833522 -0.9934225 0.6583364 0.5504419 -0.9948653 0.687242 0.6139056 -0.9959807 0.7216569 0.672428 -0.9968472 0.7578198 0.7251454 -0.9975228 0.7931147 0.7716446 -0.9980511 0.8258907 0.8119057 -0.9984653 0.855252 0.8462106 -0.9987904 0.8808518 0.8750434 -0.9990461 0.9027117 0.899 -0.9992474 0.9210773 0.9187157 -0.999406 0.9363113 0.9348141 -0.999531 0.9488211 0.9478746 -0.9996296 0.9590124 0.9584155 -0.9997074 0.9672627 0.966887 -0.9997689 0.9739085 0.9736724 -0.9998174 0.9792408 0.9790926 -0.9998557 0.9835058 0.9834129 -0.999886 0.9869087 0.9868505 -0.9999099 0.9896185 0.989582 -0.9999288 0.9917729 0.9917501 -0.9999437 0.9934838 0.9934695 -0.2151269 0.9754027 0.2156587 -0.2150852 0.9753975 0.2154796 -0.2150342 0.9753908 0.2152545 -0.2149725 0.9753825 0.2149725 -0.2152513 0.9753825 0.2149725 -0.215604 0.9753825 0.2149725 -0.2160503 0.9753825 0.2149725 -0.2166149 0.9753825 0.2149725 -0.2173291 0.9753825 0.2149725 -0.2182328 0.9753825 0.2149725 -0.219376 0.9753825 0.2149725 -0.2208224 0.9753825 0.2149725 -0.2226522 0.9753825 0.2149725 -0.2249671 0.9753825 0.2149725 -0.2278958 0.9753825 0.2149725 -0.231601 0.9753825 0.2149725 -0.2362885 0.9753825 0.2149725 -0.2422188 0.9753825 0.2149725 -0.2497215 0.9753825 0.2149725 -0.2592133 0.9753825 0.2149725 -0.2712217 0.9753825 0.2149725 -0.2864139 0.9753825 0.2149725 -0.3056339 0.9753825 0.2149725 -0.3299499 0.9753825 0.2149725 -0.3607126 0.9753825 0.2149725 -0.3996316 0.9753825 0.2149725 -0.448869 0.9753825 0.2149725 -0.5111609 0.9753825 0.2149725 -0.5899682 0.9753825 0.2149725 -0.6896696 0.9753825 0.2149725 -0.8158049 0.9753825 0.2149725 -0.9753825 0.9753825 0.2149725 -0.9814136 0.8338891 0.2782347 -0.9858113 0.745273 0.3452987 -0.9890801 0.6979709 0.414329 -0.9915446 0.6815603 0.4833522 -0.9934225 0.6869926 0.5504419 -0.9948653 0.7067197 0.6139056 -0.9959807 0.7347318 0.672428 -0.9968472 0.7664979 0.7251454 -0.9975228 0.7988171 0.7716446 -0.9980511 0.8296051 0.8119057 -0.9984653 0.8576533 0.8462106 -0.9987904 0.8823944 0.8750434 -0.9990461 0.9036975 0.899 -0.9992474 0.9217045 0.9187157 -0.999406 0.9367089 0.9348141 -0.999531 0.9490724 0.9478746 -0.9996296 0.9591709 0.9584155 -0.9997074 0.9673625 0.966887 -0.9997689 0.9739713 0.9736724 -0.9998174 0.9792802 0.9790926 -0.9998557 0.9835305 0.9834129 -0.999886 0.9869242 0.9868505 -0.9999099 0.9896281 0.989582 -0.9999288 0.991779 0.9917501 -0.9999437 0.9934876 0.9934695 -0.2783684 0.9814251 0.2787571 -0.2783325 0.9814221 0.2786207 -0.2782884 0.9814183 0.2784494 -0.2782347 0.9814136 0.2782347 -0.2784385 0.9814136 0.2782347 -0.2786962 0.9814136 0.2782347 -0.2790223 0.9814136 0.2782347 -0.2794349 0.9814136 0.2782347 -0.2799568 0.9814136 0.2782347 -0.2806171 0.9814136 0.2782347 -0.2814525 0.9814136 0.2782347 -0.2825094 0.9814136 0.2782347 -0.2838465 0.9814136 0.2782347 -0.2855381 0.9814136 0.2782347 -0.2876782 0.9814136 0.2782347 -0.2903857 0.9814136 0.2782347 -0.293811 0.9814136 0.2782347 -0.2981445 0.9814136 0.2782347 -0.3036269 0.9814136 0.2782347 -0.3105628 0.9814136 0.2782347 -0.3193377 0.9814136 0.2782347 -0.3304391 0.9814136 0.2782347 -0.3444838 0.9814136 0.2782347 -0.3622521 0.9814136 0.2782347 -0.3847314 0.9814136 0.2782347 -0.4131707 0.9814136 0.2782347 -0.44915 0.9814136 0.2782347 -0.4946685 0.9814136 0.2782347 -0.5522553 0.9814136 0.2782347 -0.6251102 0.9814136 0.2782347 -0.717281 0.9814136 0.2782347 -0.8338891 0.9814136 0.2782347 -0.9814136 0.9814136 0.2782347 -0.9858113 0.8514648 0.3452987 -0.9890801 0.7732769 0.414329 -0.9915446 0.7341839 0.4833522 -0.9934225 0.7232463 0.5504419 -0.9948653 0.7313616 0.6139056 -0.9959807 0.7512732 0.672428 -0.9968472 0.7774769 0.7251454 -0.9975228 0.8060313 0.7716446 -0.9980511 0.8343042 0.8119057 -0.9984653 0.8606913 0.8462106 -0.9987904 0.8843461 0.8750434 -0.9990461 0.9049447 0.899 -0.9992474 0.922498 0.9187157 -0.999406 0.937212 0.9348141 -0.999531 0.9493904 0.9478746 -0.9996296 0.9593714 0.9584155 -0.9997074 0.9674887 0.966887 -0.9997689 0.9740506 0.9736724 -0.9998174 0.97933 0.9790926 -0.9998557 0.9835617 0.9834129 -0.999886 0.9869437 0.9868505 -0.9999099 0.9896404 0.989582 -0.9999288 0.9917866 0.9917501 -0.9999437 0.9934924 0.9934695 -0.3454107 0.9858181 0.3456905 -0.3453807 0.9858163 0.3455882 -0.3453439 0.9858141 0.3454598 -0.3452987 0.9858113 0.3452987 -0.3454454 0.9858113 0.3452987 -0.3456309 0.9858113 0.3452987 -0.3458657 0.9858113 0.3452987 -0.3461627 0.9858113 0.3452987 -0.3465384 0.9858113 0.3452987 -0.3470137 0.9858113 0.3452987 -0.347615 0.9858113 0.3452987 -0.3483758 0.9858113 0.3452987 -0.3493382 0.9858113 0.3452987 -0.3505559 0.9858113 0.3452987 -0.3520964 0.9858113 0.3452987 -0.3540453 0.9858113 0.3452987 -0.3565109 0.9858113 0.3452987 -0.3596303 0.9858113 0.3452987 -0.3635767 0.9858113 0.3452987 -0.3685693 0.9858113 0.3452987 -0.3748857 0.9858113 0.3452987 -0.3828768 0.9858113 0.3452987 -0.3929865 0.9858113 0.3452987 -0.4057766 0.9858113 0.3452987 -0.4219578 0.9858113 0.3452987 -0.4424291 0.9858113 0.3452987 -0.4683279 0.9858113 0.3452987 -0.5010933 0.9858113 0.3452987 -0.5425458 0.9858113 0.3452987 -0.5949885 0.9858113 0.3452987 -0.6613355 0.9858113 0.3452987 -0.745273 0.9858113 0.3452987 -0.8514648 0.9858113 0.3452987 -0.9858113 0.9858113 0.3452987 -0.9890801 0.8685488 0.414329 -0.9915446 0.8007596 0.4833522 -0.9934225 0.769112 0.5504419 -0.9948653 0.7625367 0.6139056 -0.9959807 0.7722003 0.672428 -0.9968472 0.7913667 0.7251454 -0.9975228 0.8151582 0.7716446 -0.9980511 0.8402492 0.8119057 -0.9984653 0.8645348 0.8462106 -0.9987904 0.8868152 0.8750434 -0.9990461 0.9065226 0.899 -0.9992474 0.9235019 0.9187157 -0.999406 0.9378484 0.9348141 -0.999531 0.9497927 0.9478746 -0.9996296 0.9596251 0.9584155 -0.9997074 0.9676484 0.966887 -0.9997689 0.974151 0.9736724 -0.9998174 0.979393 0.9790926 -0.9998557 0.9836012 0.9834129 -0.999886 0.9869685 0.9868505 -0.9999099 0.9896559 0.989582 -0.9999288 0.9917963 0.9917501 -0.9999437 0.9934984 0.9934695 -0.4144197 0.9890841 0.4146182 -0.4143955 0.9890831 0.4145427 -0.4143657 0.9890818 0.4144479 -0.414329 0.9890801 0.414329 -0.414433 0.9890801 0.414329 -0.4145646 0.9890801 0.414329 -0.4147311 0.9890801 0.414329 -0.4149417 0.9890801 0.414329 -0.4152081 0.9890801 0.414329 -0.4155452 0.9890801 0.414329 -0.4159716 0.9890801 0.414329 -0.4165111 0.9890801 0.414329 -0.4171936 0.9890801 0.414329 -0.4180571 0.9890801 0.414329 -0.4191496 0.9890801 0.414329 -0.4205316 0.9890801 0.414329 -0.4222801 0.9890801 0.414329 -0.4244922 0.9890801 0.414329 -0.4272908 0.9890801 0.414329 -0.4308314 0.9890801 0.414329 -0.4353106 0.9890801 0.414329 -0.4409775 0.9890801 0.414329 -0.4481468 0.9890801 0.414329 -0.4572169 0.9890801 0.414329 -0.4686918 0.9890801 0.414329 -0.483209 0.9890801 0.414329 -0.5015752 0.9890801 0.414329 -0.5248108 0.9890801 0.414329 -0.5542068 0.9890801 0.414329 -0.5913967 0.9890801 0.414329 -0.6384466 0.9890801 0.414329 -0.6979709 0.9890801 0.414329 -0.7732769 0.9890801 0.414329 -0.8685488 0.9890801 0.414329 -0.9890801 0.9890801 0.414329 -0.9915446 0.8849865 0.4833522 -0.9934225 0.8271381 0.5504419 -0.9948653 0.8019773 0.6139056 -0.9959807 0.7986758 0.672428 -0.9968472 0.8089391 0.7251454 -0.9975228 0.826705 0.7716446 -0.9980511 0.8477704 0.8119057 -0.9984653 0.8693972 0.8462106 -0.9987904 0.889939 0.8750434 -0.9990461 0.9085187 0.899 -0.9992474 0.924772 0.9187157 -0.999406 0.9386536 0.9348141 -0.999531 0.9503017 0.9478746 -0.9996296 0.9599461 0.9584155 -0.9997074 0.9678505 0.966887 -0.9997689 0.974278 0.9736724 -0.9998174 0.9794727 0.9790926 -0.9998557 0.9836512 0.9834129 -0.999886 0.9869998 0.9868505 -0.9999099 0.9896755 0.989582 -0.9999288 0.9918086 0.9917501 -0.9999437 0.9935061 0.9934695 -0.4834235 0.9915469 0.4835622 -0.4834045 0.9915463 0.4835073 -0.4833811 0.9915455 0.4834385 -0.4833522 0.9915446 0.4833522 -0.4834249 0.9915446 0.4833522 -0.4835168 0.9915446 0.4833522 -0.4836332 0.9915446 0.4833522 -0.4837803 0.9915446 0.4833522 -0.4839665 0.9915446 0.4833522 -0.484202 0.9915446 0.4833522 -0.4845 0.9915446 0.4833522 -0.484877 0.9915446 0.4833522 -0.485354 0.9915446 0.4833522 -0.4859574 0.9915446 0.4833522 -0.4867208 0.9915446 0.4833522 -0.4876866 0.9915446 0.4833522 -0.4889084 0.9915446 0.4833522 -0.4904542 0.9915446 0.4833522 -0.4924099 0.9915446 0.4833522 -0.494884 0.9915446 0.4833522 -0.4980141 0.9915446 0.4833522 -0.5019741 0.9915446 0.4833522 -0.506984 0.9915446 0.4833522 -0.5133222 0.9915446 0.4833522 -0.5213408 0.9915446 0.4833522 -0.5314854 0.9915446 0.4833522 -0.5443196 0.9915446 0.4833522 -0.5605565 0.9915446 0.4833522 -0.5810984 0.9915446 0.4833522 -0.6070865 0.9915446 0.4833522 -0.6399649 0.9915446 0.4833522 -0.6815603 0.9915446 0.4833522 -0.7341839 0.9915446 0.4833522 -0.8007596 0.9915446 0.4833522 -0.8849865 0.9915446 0.4833522 -0.9915446 0.9915446 0.4833522 -0.9934225 0.9005487 0.5504419 -0.9948653 0.8518748 0.6139056 -0.9959807 0.8321707 0.672428 -0.9968472 0.8311705 0.7251454 -0.9975228 0.8413131 0.7716446 -0.9980511 0.8572857 0.8119057 -0.9984653 0.8755489 0.8462106 -0.9987904 0.8938909 0.8750434 -0.9990461 0.9110442 0.899 -0.9992474 0.9263788 0.9187157 -0.999406 0.9396723 0.9348141 -0.999531 0.9509457 0.9478746 -0.9996296 0.9603522 0.9584155 -0.9997074 0.9681061 0.966887 -0.9997689 0.9744386 0.9736724 -0.9998174 0.9795736 0.9790926 -0.9998557 0.9837145 0.9834129 -0.999886 0.9870395 0.9868505 -0.9999099 0.9897003 0.989582 -0.9999288 0.9918242 0.9917501 -0.9999437 0.9935158 0.9934695 -0.5504963 0.993424 0.5505918 -0.5504818 0.9934236 0.5505527 -0.550464 0.9934231 0.5505035 -0.5504419 0.9934225 0.5504419 -0.550492 0.9934225 0.5504419 -0.5505553 0.9934225 0.5504419 -0.5506355 0.9934225 0.5504419 -0.5507369 0.9934225 0.5504419 -0.5508651 0.9934225 0.5504419 -0.5510274 0.9934225 0.5504419 -0.5512327 0.9934225 0.5504419 -0.5514924 0.9934225 0.5504419 -0.551821 0.9934225 0.5504419 -0.5522367 0.9934225 0.5504419 -0.5527626 0.9934225 0.5504419 -0.553428 0.9934225 0.5504419 -0.5542698 0.9934225 0.5504419 -0.5553347 0.9934225 0.5504419 -0.556682 0.9934225 0.5504419 -0.5583865 0.9934225 0.5504419 -0.5605429 0.9934225 0.5504419 -0.563271 0.9934225 0.5504419 -0.5667225 0.9934225 0.5504419 -0.571089 0.9934225 0.5504419 -0.5766132 0.9934225 0.5504419 -0.5836021 0.9934225 0.5504419 -0.5924439 0.9934225 0.5504419 -0.60363 0.9934225 0.5504419 -0.6177818 0.9934225 0.5504419 -0.6356857 0.9934225 0.5504419 -0.6583364 0.9934225 0.5504419 -0.6869926 0.9934225 0.5504419 -0.7232463 0.9934225 0.5504419 -0.769112 0.9934225 0.5504419 -0.8271381 0.9934225 0.5504419 -0.9005487 0.9934225 0.5504419 -0.9934225 0.9934225 0.5504419 -0.9948653 0.9150017 0.6139056 -0.9959807 0.8745461 0.672428 -0.9968472 0.8592962 0.7251454 -0.9975228 0.8597943 0.7716446 -0.9980511 0.8693238 0.8119057 -0.9984653 0.8833316 0.8462106 -0.9987904 0.8988907 0.8750434 -0.9990461 0.9142392 0.899 -0.9992474 0.9284116 0.9187157 -0.999406 0.940961 0.9348141 -0.999531 0.9517603 0.9478746 -0.9996296 0.960866 0.9584155 -0.9997074 0.9684295 0.966887 -0.9997689 0.9746418 0.9736724 -0.9998174 0.9797011 0.9790926 -0.9998557 0.9837945 0.9834129 -0.999886 0.9870896 0.9868505 -0.9999099 0.9897317 0.989582 -0.9999288 0.9918438 0.9917501 -0.9999437 0.9935281 0.9934695 -0.6139459 0.9948662 0.6140108 -0.6139352 0.994866 0.6139833 -0.6139219 0.9948657 0.6139488 -0.6139056 0.9948653 0.6139056 -0.6139396 0.9948653 0.6139056 -0.6139827 0.9948653 0.6139056 -0.6140371 0.9948653 0.6139056 -0.614106 0.9948653 0.6139056 -0.6141932 0.9948653 0.6139056 -0.6143035 0.9948653 0.6139056 -0.6144431 0.9948653 0.6139056 -0.6146196 0.9948653 0.6139056 -0.6148429 0.9948653 0.6139056 -0.6151255 0.9948653 0.6139056 -0.615483 0.9948653 0.6139056 -0.6159352 0.9948653 0.6139056 -0.6165074 0.9948653 0.6139056 -0.6172312 0.9948653 0.6139056 -0.618147 0.9948653 0.6139056 -0.6193055 0.9948653 0.6139056 -0.6207712 0.9948653 0.6139056 -0.6226256 0.9948653 0.6139056 -0.6249715 0.9948653 0.6139056 -0.6279395 0.9948653 0.6139056 -0.6316943 0.9948653 0.6139056 -0.6364447 0.9948653 0.6139056 -0.6424545 0.9948653 0.6139056 -0.6500577 0.9948653 0.6139056 -0.6596768 0.9948653 0.6139056 -0.6718462 0.9948653 0.6139056 -0.687242 0.9948653 0.6139056 -0.7067197 0.9948653 0.6139056 -0.7313616 0.9948653 0.6139056 -0.7625367 0.9948653 0.6139056 -0.8019773 0.9948653 0.6139056 -0.8518748 0.9948653 0.6139056 -0.9150017 0.9948653 0.6139056 -0.9948653 0.9948653 0.6139056 -0.9959807 0.9281566 0.672428 -0.9968472 0.8948788 0.7251454 -0.9975228 0.8831754 0.7716446 -0.9980511 0.8845535 0.8119057 -0.9984653 0.8931777 0.8462106 -0.9987904 0.905216 0.8750434 -0.9990461 0.9182813 0.899 -0.9992474 0.9309833 0.9187157 -0.999406 0.9425915 0.9348141 -0.999531 0.952791 0.9478746 -0.9996296 0.9615159 0.9584155 -0.9997074 0.9688386 0.966887 -0.9997689 0.974899 0.9736724 -0.9998174 0.9798625 0.9790926 -0.9998557 0.9838957 0.9834129 -0.999886 0.987153 0.9868505 -0.9999099 0.9897715 0.989582 -0.9999288 0.9918687 0.9917501 -0.9999437 0.9935437 0.9934695 -0.6724572 0.9959813 0.6725008 -0.6724495 0.9959811 0.6724818 -0.6724399 0.9959809 0.6724579 -0.672428 0.9959807 0.672428 -0.6724509 0.9959807 0.672428 -0.6724798 0.9959807 0.672428 -0.6725163 0.9959807 0.672428 -0.6725626 0.9959807 0.672428 -0.6726211 0.9959807 0.672428 -0.6726952 0.9959807 0.672428 -0.6727888 0.9959807 0.672428 -0.6729073 0.9959807 0.672428 -0.6730573 0.9959807 0.672428 -0.6732469 0.9959807 0.672428 -0.6734869 0.9959807 0.672428 -0.6737905 0.9959807 0.672428 -0.6741745 0.9959807 0.672428 -0.6746604 0.9959807 0.672428 -0.6752752 0.9959807 0.672428 -0.6760529 0.9959807 0.672428 -0.6770368 0.9959807 0.672428 -0.6782815 0.9959807 0.672428 -0.6798563 0.9959807 0.672428 -0.6818486 0.9959807 0.672428 -0.6843692 0.9959807 0.672428 -0.687558 0.9959807 0.672428 -0.6915922 0.9959807 0.672428 -0.6966961 0.9959807 0.672428 -0.7031531 0.9959807 0.672428 -0.7113221 0.9959807 0.672428 -0.7216569 0.9959807 0.672428 -0.7347318 0.9959807 0.672428 -0.7512732 0.9959807 0.672428 -0.7722003 0.9959807 0.672428 -0.7986758 0.9959807 0.672428 -0.8321707 0.9959807 0.672428 -0.8745461 0.9959807 0.672428 -0.9281566 0.9959807 0.672428 -0.9959807 0.9959807 0.672428 -0.9968472 0.9398953 0.7251454 -0.9975228 0.9127555 0.7716446 -0.9980511 0.9038211 0.8119057 -0.9984653 0.9056342 0.8462106 -0.9987904 0.9132184 0.8750434 -0.9990461 0.923395 0.899 -0.9992474 0.934237 0.9187157 -0.999406 0.9446542 0.9348141 -0.999531 0.9540949 0.9478746 -0.9996296 0.9623382 0.9584155 -0.9997074 0.9693562 0.966887 -0.9997689 0.9752243 0.9736724 -0.9998174 0.9800667 0.9790926 -0.9998557 0.9840238 0.9834129 -0.999886 0.9872333 0.9868505 -0.9999099 0.9898217 0.989582 -0.9999288 0.9919001 0.9917501 -0.9999437 0.9935634 0.9934695 -0.7251659 0.9968475 0.7251949 -0.7251605 0.9968474 0.725182 -0.7251537 0.9968473 0.7251657 -0.7251454 0.9968472 0.7251454 -0.7251605 0.9968472 0.7251454 -0.7251797 0.9968472 0.7251454 -0.725204 0.9968472 0.7251454 -0.7252347 0.9968472 0.7251454 -0.7252735 0.9968472 0.7251454 -0.7253227 0.9968472 0.7251454 -0.7253848 0.9968472 0.7251454 -0.7254635 0.9968472 0.7251454 -0.725563 0.9968472 0.7251454 -0.7256889 0.9968472 0.7251454 -0.7258482 0.9968472 0.7251454 -0.7260496 0.9968472 0.7251454 -0.7263046 0.9968472 0.7251454 -0.7266271 0.9968472 0.7251454 -0.7270351 0.9968472 0.7251454 -0.7275513 0.9968472 0.7251454 -0.7282043 0.9968472 0.7251454 -0.7290305 0.9968472 0.7251454 -0.7300757 0.9968472 0.7251454 -0.731398 0.9968472 0.7251454 -0.733071 0.9968472 0.7251454 -0.7351875 0.9968472 0.7251454 -0.7378651 0.9968472 0.7251454 -0.7412527 0.9968472 0.7251454 -0.7455383 0.9968472 0.7251454 -0.7509603 0.9968472 0.7251454 -0.7578198 0.9968472 0.7251454 -0.7664979 0.9968472 0.7251454 -0.7774769 0.9968472 0.7251454 -0.7913667 0.9968472 0.7251454 -0.8089391 0.9968472 0.7251454 -0.8311705 0.9968472 0.7251454 -0.8592962 0.9968472 0.7251454 -0.8948788 0.9968472 0.7251454 -0.9398953 0.9968472 0.7251454 -0.9968472 0.9968472 0.7251454 -0.9975228 0.9501782 0.7716446 -0.9980511 0.9281971 0.8119057 -0.9984653 0.9213934 0.8462106 -0.9987904 0.9233424 0.8750434 -0.9990461 0.9298646 0.899 -0.9992474 0.9383532 0.9187157 -0.999406 0.9472638 0.9348141 -0.999531 0.9557445 0.9478746 -0.9996296 0.9633786 0.9584155 -0.9997074 0.970011 0.966887 -0.9997689 0.9756358 0.9736724 -0.9998174 0.9803251 0.9790926 -0.9998557 0.9841858 0.9834129 -0.999886 0.9873348 0.9868505 -0.9999099 0.9898853 0.989582 -0.9999288 0.9919399 0.9917501 -0.9999437 0.9935883 0.9934695 -0.7716588 0.997523 0.7716778 -0.7716551 0.997523 0.7716692 -0.7716504 0.9975229 0.7716583 -0.7716446 0.9975228 0.7716446 -0.7716545 0.9975228 0.7716446 -0.7716672 0.9975228 0.7716446 -0.7716831 0.9975228 0.7716446 -0.7717033 0.9975228 0.7716446 -0.7717288 0.9975228 0.7716446 -0.7717611 0.9975228 0.7716446 -0.7718019 0.9975228 0.7716446 -0.7718536 0.9975228 0.7716446 -0.771919 0.9975228 0.7716446 -0.7720017 0.9975228 0.7716446 -0.7721064 0.9975228 0.7716446 -0.7722388 0.9975228 0.7716446 -0.7724063 0.9975228 0.7716446 -0.7726182 0.9975228 0.7716446 -0.7728863 0.9975228 0.7716446 -0.7732255 0.9975228 0.7716446 -0.7736546 0.9975228 0.7716446 -0.7741975 0.9975228 0.7716446 -0.7748843 0.9975228 0.7716446 -0.7757532 0.9975228 0.7716446 -0.7768525 0.9975228 0.7716446 -0.7782432 0.9975228 0.7716446 -0.7800027 0.9975228 0.7716446 -0.7822286 0.9975228 0.7716446 -0.7850447 0.9975228 0.7716446 -0.7886074 0.9975228 0.7716446 -0.7931147 0.9975228 0.7716446 -0.7988171 0.9975228 0.7716446 -0.8060313 0.9975228 0.7716446 -0.8151582 0.9975228 0.7716446 -0.826705 0.9975228 0.7716446 -0.8413131 0.9975228 0.7716446 -0.8597943 0.9975228 0.7716446 -0.8831754 0.9975228 0.7716446 -0.9127555 0.9975228 0.7716446 -0.9501782 0.9975228 0.7716446 -0.9975228 0.9975228 0.7716446 -0.9980511 0.959036 0.8119057 -0.9984653 0.9413309 0.8462106 -0.9987904 0.9361506 0.8750434 -0.9990461 0.9380495 0.899 -0.9992474 0.9435608 0.9187157 -0.999406 0.9505652 0.9348141 -0.999531 0.9578314 0.9478746 -0.9996296 0.9646947 0.9584155 -0.9997074 0.9708394 0.966887 -0.9997689 0.9761565 0.9736724 -0.9998174 0.9806519 0.9790926 -0.9998557 0.9843907 0.9834129 -0.999886 0.9874632 0.9868505 -0.9999099 0.9899657 0.989582 -0.9999288 0.9919903 0.9917501 -0.9999437 0.9936198 0.9934695 -0.8119154 0.9980513 0.8119278 -0.8119128 0.9980512 0.811922 -0.8119096 0.9980512 0.8119148 -0.8119057 0.9980511 0.8119057 -0.8119122 0.9980511 0.8119057 -0.8119204 0.9980511 0.8119057 -0.8119308 0.9980511 0.8119057 -0.8119439 0.9980511 0.8119057 -0.8119606 0.9980511 0.8119057 -0.8119816 0.9980511 0.8119057 -0.8120082 0.9980511 0.8119057 -0.8120419 0.9980511 0.8119057 -0.8120844 0.9980511 0.8119057 -0.8121383 0.9980511 0.8119057 -0.8122065 0.9980511 0.8119057 -0.8122927 0.9980511 0.8119057 -0.8124018 0.9980511 0.8119057 -0.8125399 0.9980511 0.8119057 -0.8127145 0.9980511 0.8119057 -0.8129354 0.9980511 0.8119057 -0.813215 0.9980511 0.8119057 -0.8135686 0.9980511 0.8119057 -0.8140159 0.9980511 0.8119057 -0.8145819 0.9980511 0.8119057 -0.815298 0.9980511 0.8119057 -0.8162038 0.9980511 0.8119057 -0.8173499 0.9980511 0.8119057 -0.8187998 0.9980511 0.8119057 -0.8206341 0.9980511 0.8119057 -0.8229548 0.9980511 0.8119057 -0.8258907 0.9980511 0.8119057 -0.8296051 0.9980511 0.8119057 -0.8343042 0.9980511 0.8119057 -0.8402492 0.9980511 0.8119057 -0.8477704 0.9980511 0.8119057 -0.8572857 0.9980511 0.8119057 -0.8693238 0.9980511 0.8119057 -0.8845535 0.9980511 0.8119057 -0.9038211 0.9980511 0.8119057 -0.9281971 0.9980511 0.8119057 -0.959036 0.9980511 0.8119057 -0.9980511 0.9980511 0.8119057 -0.9984653 0.9665543 0.8462106 -0.9987904 0.9523547 0.8750434 -0.9990461 0.9484044 0.899 -0.9992474 0.9501491 0.9187157 -0.999406 0.954742 0.9348141 -0.999531 0.9604717 0.9478746 -0.9996296 0.9663598 0.9584155 -0.9997074 0.9718875 0.966887 -0.9997689 0.9768152 0.9736724 -0.9998174 0.9810654 0.9790926 -0.9998557 0.9846501 0.9834129 -0.999886 0.9876257 0.9868505 -0.9999099 0.9900675 0.989582 -0.9999288 0.992054 0.9917501 -0.9999437 0.9936596 0.9934695 -0.8462171 0.9984653 0.8462251 -0.8462154 0.9984653 0.8462213 -0.8462132 0.9984653 0.8462165 -0.8462106 0.9984653 0.8462106 -0.8462148 0.9984653 0.8462106 -0.8462201 0.9984653 0.8462106 -0.8462268 0.9984653 0.8462106 -0.8462353 0.9984653 0.8462106 -0.846246 0.9984653 0.8462106 -0.8462596 0.9984653 0.8462106 -0.8462768 0.9984653 0.8462106 -0.8462986 0.9984653 0.8462106 -0.8463261 0.9984653 0.8462106 -0.846361 0.9984653 0.8462106 -0.8464051 0.9984653 0.8462106 -0.8464608 0.9984653 0.8462106 -0.8465313 0.9984653 0.8462106 -0.8466206 0.9984653 0.8462106 -0.8467335 0.9984653 0.8462106 -0.8468763 0.9984653 0.8462106 -0.847057 0.9984653 0.8462106 -0.8472856 0.9984653 0.8462106 -0.8475749 0.9984653 0.8462106 -0.8479408 0.9984653 0.8462106 -0.8484037 0.9984653 0.8462106 -0.8489893 0.9984653 0.8462106 -0.8497303 0.9984653 0.8462106 -0.8506676 0.9984653 0.8462106 -0.8518535 0.9984653 0.8462106 -0.8533539 0.9984653 0.8462106 -0.855252 0.9984653 0.8462106 -0.8576533 0.9984653 0.8462106 -0.8606913 0.9984653 0.8462106 -0.8645348 0.9984653 0.8462106 -0.8693972 0.9984653 0.8462106 -0.8755489 0.9984653 0.8462106 -0.8833316 0.9984653 0.8462106 -0.8931777 0.9984653 0.8462106 -0.9056342 0.9984653 0.8462106 -0.9213934 0.9984653 0.8462106 -0.9413309 0.9984653 0.8462106 -0.9665543 0.9984653 0.8462106 -0.9984653 0.9984653 0.8462106 -0.9987904 0.972855 0.8750434 -0.9990461 0.9615047 0.899 -0.9992474 0.9584841 0.9187157 -0.999406 0.9600262 0.9348141 -0.999531 0.963812 0.9478746 -0.9996296 0.9684663 0.9584155 -0.9997074 0.9732135 0.966887 -0.9997689 0.9776486 0.9736724 -0.9998174 0.9815885 0.9790926 -0.9998557 0.9849781 0.9834129 -0.999886 0.9878313 0.9868505 -0.9999099 0.9901962 0.989582 -0.9999288 0.9921346 0.9917501 -0.9999437 0.9937101 0.9934695 -0.8750477 0.9987905 0.8750528 -0.8750466 0.9987905 0.8750504 -0.8750451 0.9987904 0.8750473 -0.8750434 0.9987904 0.8750434 -0.8750461 0.9987904 0.8750434 -0.8750495 0.9987904 0.8750434 -0.8750538 0.9987904 0.8750434 -0.8750593 0.9987904 0.8750434 -0.8750662 0.9987904 0.8750434 -0.8750749 0.9987904 0.8750434 -0.875086 0.9987904 0.8750434 -0.8750999 0.9987904 0.8750434 -0.8751176 0.9987904 0.8750434 -0.87514 0.9987904 0.8750434 -0.8751683 0.9987904 0.8750434 -0.8752041 0.9987904 0.8750434 -0.8752495 0.9987904 0.8750434 -0.8753068 0.9987904 0.8750434 -0.8753793 0.9987904 0.8750434 -0.8754711 0.9987904 0.8750434 -0.8755872 0.9987904 0.8750434 -0.875734 0.9987904 0.8750434 -0.8759198 0.9987904 0.8750434 -0.8761549 0.9987904 0.8750434 -0.8764523 0.9987904 0.8750434 -0.8768285 0.9987904 0.8750434 -0.8773045 0.9987904 0.8750434 -0.8779067 0.9987904 0.8750434 -0.8786686 0.9987904 0.8750434 -0.8796324 0.9987904 0.8750434 -0.8808518 0.9987904 0.8750434 -0.8823944 0.9987904 0.8750434 -0.8843461 0.9987904 0.8750434 -0.8868152 0.9987904 0.8750434 -0.889939 0.9987904 0.8750434 -0.8938909 0.9987904 0.8750434 -0.8988907 0.9987904 0.8750434 -0.905216 0.9987904 0.8750434 -0.9132184 0.9987904 0.8750434 -0.9233424 0.9987904 0.8750434 -0.9361506 0.9987904 0.8750434 -0.9523547 0.9987904 0.8750434 -0.972855 0.9987904 0.8750434 -0.9987904 0.9987904 0.8750434 -0.9990461 0.9780783 0.899 -0.9992474 0.969029 0.9187157 -0.999406 0.9667114 0.9348141 -0.999531 0.9680379 0.9478746 -0.9996296 0.9711314 0.9584155 -0.9997074 0.974891 0.966887 -0.9997689 0.9787029 0.9736724 -0.9998174 0.9822504 0.9790926 -0.9998557 0.9853932 0.9834129 -0.999886 0.9880914 0.9868505 -0.9999099 0.9903591 0.989582 -0.9999288 0.9922365 0.9917501 -0.9999437 0.9937738 0.9934695 -0.8990028 0.9990461 0.8990061 -0.899002 0.9990461 0.8990045 -0.8990011 0.9990461 0.8990025 -0.899 0.9990461 0.899 -0.8990017 0.9990461 0.899 -0.8990039 0.9990461 0.899 -0.8990066 0.9990461 0.899 -0.8990101 0.9990461 0.899 -0.8990145 0.9990461 0.899 -0.8990201 0.9990461 0.899 -0.8990272 0.9990461 0.899 -0.8990361 0.9990461 0.899 -0.8990474 0.9990461 0.899 -0.8990617 0.9990461 0.899 -0.8990798 0.9990461 0.899 -0.8991027 0.9990461 0.899 -0.8991317 0.9990461 0.899 -0.8991683 0.9990461 0.899 -0.8992146 0.9990461 0.899 -0.8992733 0.9990461 0.899 -0.8993475 0.9990461 0.899 -0.8994413 0.9990461 0.899 -0.8995601 0.9990461 0.899 -0.8997103 0.9990461 0.899 -0.8999003 0.9990461 0.899 -0.9001407 0.9990461 0.899 -0.9004449 0.9990461 0.899 -0.9008297 0.9990461 0.899 -0.9013166 0.9990461 0.899 -0.9019325 0.9990461 0.899 -0.9027117 0.9990461 0.899 -0.9036975 0.9990461 0.899 -0.9049447 0.9990461 0.899 -0.9065226 0.9990461 0.899 -0.9085187 0.9990461 0.899 -0.9110442 0.9990461 0.899 -0.9142392 0.9990461 0.899 -0.9182813 0.9990461 0.899 -0.923395 0.9990461 0.899 -0.9298646 0.9990461 0.899 -0.9380495 0.9990461 0.899 -0.9484044 0.9990461 0.899 -0.9615047 0.9990461 0.899 -0.9780783 0.9990461 0.899 -0.9990461 0.9990461 0.899 -0.9992474 0.9823697 0.9187157 -0.999406 0.975169 0.9348141 -0.999531 0.9733843 0.9478746 -0.9996296 0.974503 0.9584155 -0.9997074 0.9770133 0.966887 -0.9997689 0.9800367 0.9736724 -0.9998174 0.9830876 0.9790926 -0.9998557 0.9859182 0.9834129 -0.999886 0.9884204 0.9868505 -0.9999099 0.9905652 0.989582 -0.9999288 0.9923655 0.9917501 -0.9999437 0.9938545 0.9934695 -0.9187175 0.9992474 0.9187196 -0.918717 0.9992474 0.9187186 -0.9187164 0.9992474 0.9187173 -0.9187157 0.9992474 0.9187157 -0.9187168 0.9992474 0.9187157 -0.9187182 0.9992474 0.9187157 -0.9187199 0.9992474 0.9187157 -0.9187221 0.9992474 0.9187157 -0.9187249 0.9992474 0.9187157 -0.9187285 0.9992474 0.9187157 -0.918733 0.9992474 0.9187157 -0.9187387 0.9992474 0.9187157 -0.9187459 0.9992474 0.9187157 -0.918755 0.9992474 0.9187157 -0.9187665 0.9992474 0.9187157 -0.918781 0.9992474 0.9187157 -0.9187995 0.9992474 0.9187157 -0.9188228 0.9992474 0.9187157 -0.9188523 0.9992474 0.9187157 -0.9188896 0.9992474 0.9187157 -0.9189368 0.9992474 0.9187157 -0.9189965 0.9992474 0.9187157 -0.919072 0.9992474 0.9187157 -0.9191676 0.9992474 0.9187157 -0.9192885 0.9992474 0.9187157 -0.9194415 0.9992474 0.9187157 -0.919635 0.9992474 0.9187157 -0.9198799 0.9992474 0.9187157 -0.9201896 0.9992474 0.9187157 -0.9205815 0.9992474 0.9187157 -0.9210773 0.9992474 0.9187157 -0.9217045 0.9992474 0.9187157 -0.922498 0.9992474 0.9187157 -0.9235019 0.9992474 0.9187157 -0.924772 0.9992474 0.9187157 -0.9263788 0.9992474 0.9187157 -0.9284116 0.9992474 0.9187157 -0.9309833 0.9992474 0.9187157 -0.934237 0.9992474 0.9187157 -0.9383532 0.9992474 0.9187157 -0.9435608 0.9992474 0.9187157 -0.9501491 0.9992474 0.9187157 -0.9584841 0.9992474 0.9187157 -0.969029 0.9992474 0.9187157 -0.9823697 0.9992474 0.9187157 -0.9992474 0.9992474 0.9187157 -0.999406 0.9858691 0.9348141 -0.999531 0.9801481 0.9478746 -0.9996296 0.9787685 0.9584155 -0.9997074 0.9796982 0.966887 -0.9997689 0.9817242 0.9736724 -0.9998174 0.9841469 0.9790926 -0.9998557 0.9865825 0.9834129 -0.999886 0.9888367 0.9868505 -0.9999099 0.9908259 0.989582 -0.9999288 0.9925287 0.9917501 -0.9999437 0.9939566 0.9934695 -0.9348153 0.999406 0.9348166 -0.9348149 0.999406 0.9348159 -0.9348146 0.999406 0.9348151 -0.9348141 0.999406 0.9348141 -0.9348148 0.999406 0.9348141 -0.9348157 0.999406 0.9348141 -0.9348168 0.999406 0.9348141 -0.9348182 0.999406 0.9348141 -0.93482 0.999406 0.9348141 -0.9348222 0.999406 0.9348141 -0.9348251 0.999406 0.9348141 -0.9348287 0.999406 0.9348141 -0.9348332 0.999406 0.9348141 -0.934839 0.999406 0.9348141 -0.9348463 0.999406 0.9348141 -0.9348555 0.999406 0.9348141 -0.9348672 0.999406 0.9348141 -0.934882 0.999406 0.9348141 -0.9349007 0.999406 0.9348141 -0.9349243 0.999406 0.9348141 -0.9349542 0.999406 0.9348141 -0.9349921 0.999406 0.9348141 -0.93504 0.999406 0.9348141 -0.9351006 0.999406 0.9348141 -0.9351772 0.999406 0.9348141 -0.9352742 0.999406 0.9348141 -0.9353969 0.999406 0.9348141 -0.9355521 0.999406 0.9348141 -0.9357485 0.999406 0.9348141 -0.935997 0.999406 0.9348141 -0.9363113 0.999406 0.9348141 -0.9367089 0.999406 0.9348141 -0.937212 0.999406 0.9348141 -0.9378484 0.999406 0.9348141 -0.9386536 0.999406 0.9348141 -0.9396723 0.999406 0.9348141 -0.940961 0.999406 0.9348141 -0.9425915 0.999406 0.9348141 -0.9446542 0.999406 0.9348141 -0.9472638 0.999406 0.9348141 -0.9505652 0.999406 0.9348141 -0.954742 0.999406 0.9348141 -0.9600262 0.999406 0.9348141 -0.9667114 0.999406 0.9348141 -0.975169 0.999406 0.9348141 -0.9858691 0.999406 0.9348141 -0.999406 0.999406 0.9348141 -0.999531 0.9887052 0.9478746 -0.9996296 0.984165 0.9584155 -0.9997074 0.983095 0.966887 -0.9997689 0.983859 0.9736724 -0.9998174 0.985487 0.9790926 -0.9998557 0.9874229 0.9834129 -0.999886 0.9893633 0.9868505 -0.9999099 0.9911557 0.989582 -0.9999288 0.9927351 0.9917501 -0.9999437 0.9940858 0.9934695 -0.9478754 0.999531 0.9478762 -0.9478752 0.999531 0.9478758 -0.947875 0.999531 0.9478753 -0.9478746 0.999531 0.9478746 -0.9478751 0.999531 0.9478746 -0.9478756 0.999531 0.9478746 -0.9478763 0.999531 0.9478746 -0.9478772 0.999531 0.9478746 -0.9478784 0.999531 0.9478746 -0.9478798 0.999531 0.9478746 -0.9478816 0.999531 0.9478746 -0.9478839 0.999531 0.9478746 -0.9478867 0.999531 0.9478746 -0.9478904 0.999531 0.9478746 -0.947895 0.999531 0.9478746 -0.9479008 0.999531 0.9478746 -0.9479082 0.999531 0.9478746 -0.9479176 0.999531 0.9478746 -0.9479294 0.999531 0.9478746 -0.9479443 0.999531 0.9478746 -0.9479633 0.999531 0.9478746 -0.9479872 0.999531 0.9478746 -0.9480175 0.999531 0.9478746 -0.9480558 0.999531 0.9478746 -0.9481042 0.999531 0.9478746 -0.9481655 0.999531 0.9478746 -0.9482431 0.999531 0.9478746 -0.9483412 0.999531 0.9478746 -0.9484653 0.999531 0.9478746 -0.9486224 0.999531 0.9478746 -0.9488211 0.999531 0.9478746 -0.9490724 0.999531 0.9478746 -0.9493904 0.999531 0.9478746 -0.9497927 0.999531 0.9478746 -0.9503017 0.999531 0.9478746 -0.9509457 0.999531 0.9478746 -0.9517603 0.999531 0.9478746 -0.952791 0.999531 0.9478746 -0.9540949 0.999531 0.9478746 -0.9557445 0.999531 0.9478746 -0.9578314 0.999531 0.9478746 -0.9604717 0.999531 0.9478746 -0.963812 0.999531 0.9478746 -0.9680379 0.999531 0.9478746 -0.9733843 0.999531 0.9478746 -0.9801481 0.999531 0.9478746 -0.9887052 0.999531 0.9478746 -0.999531 0.999531 0.9478746 -0.9996296 0.9909923 0.9584155 -0.9997074 0.9873924 0.966887 -0.9997689 0.9865599 0.9736724 -0.9998174 0.9871825 0.9790926 -0.9998557 0.9884862 0.9834129 -0.999886 0.9900296 0.9868505 -0.9999099 0.9915729 0.989582 -0.9999288 0.9929963 0.9917501 -0.9999437 0.9942492 0.9934695 -0.958416 0.9996296 0.9584165 -0.9584159 0.9996296 0.9584162 -0.9584157 0.9996296 0.9584159 -0.9584155 0.9996296 0.9584155 -0.9584158 0.9996296 0.9584155 -0.9584161 0.9996296 0.9584155 -0.9584166 0.9996296 0.9584155 -0.9584171 0.9996296 0.9584155 -0.9584178 0.9996296 0.9584155 -0.9584187 0.9996296 0.9584155 -0.9584199 0.9996296 0.9584155 -0.9584213 0.9996296 0.9584155 -0.9584231 0.9996296 0.9584155 -0.9584254 0.9996296 0.9584155 -0.9584283 0.9996296 0.9584155 -0.958432 0.9996296 0.9584155 -0.9584367 0.9996296 0.9584155 -0.9584426 0.9996296 0.9584155 -0.95845 0.9996296 0.9584155 -0.9584595 0.9996296 0.9584155 -0.9584714 0.9996296 0.9584155 -0.9584865 0.9996296 0.9584155 -0.9585056 0.9996296 0.9584155 -0.9585297 0.9996296 0.9584155 -0.9585603 0.9996296 0.9584155 -0.9585989 0.9996296 0.9584155 -0.9586479 0.9996296 0.9584155 -0.9587097 0.9996296 0.9584155 -0.958788 0.9996296 0.9584155 -0.9588871 0.9996296 0.9584155 -0.9590124 0.9996296 0.9584155 -0.9591709 0.9996296 0.9584155 -0.9593714 0.9996296 0.9584155 -0.9596251 0.9996296 0.9584155 -0.9599461 0.9996296 0.9584155 -0.9603522 0.9996296 0.9584155 -0.960866 0.9996296 0.9584155 -0.9615159 0.9996296 0.9584155 -0.9623382 0.9996296 0.9584155 -0.9633786 0.9996296 0.9584155 -0.9646947 0.9996296 0.9584155 -0.9663598 0.9996296 0.9584155 -0.9684663 0.9996296 0.9584155 -0.9711314 0.9996296 0.9584155 -0.974503 0.9996296 0.9584155 -0.9787685 0.9996296 0.9584155 -0.984165 0.9996296 0.9584155 -0.9909923 0.9996296 0.9584155 -0.9996296 0.9996296 0.9584155 -0.9997074 0.9928292 0.966887 -0.9997689 0.9899769 0.9736724 -0.9998174 0.9893274 0.9790926 -0.9998557 0.9898313 0.9834129 -0.999886 0.9908725 0.9868505 -0.9999099 0.9921008 0.989582 -0.9999288 0.9933267 0.9917501 -0.9999437 0.994456 0.9934695 -0.9668873 0.9997074 0.9668877 -0.9668872 0.9997074 0.9668875 -0.9668871 0.9997074 0.9668873 -0.966887 0.9997074 0.966887 -0.9668872 0.9997074 0.966887 -0.9668874 0.9997074 0.966887 -0.9668877 0.9997074 0.966887 -0.966888 0.9997074 0.966887 -0.9668885 0.9997074 0.966887 -0.9668891 0.9997074 0.966887 -0.9668898 0.9997074 0.966887 -0.9668907 0.9997074 0.966887 -0.9668918 0.9997074 0.966887 -0.9668933 0.9997074 0.966887 -0.9668951 0.9997074 0.966887 -0.9668974 0.9997074 0.966887 -0.9669003 0.9997074 0.966887 -0.9669041 0.9997074 0.966887 -0.9669087 0.9997074 0.966887 -0.9669147 0.9997074 0.966887 -0.9669222 0.9997074 0.966887 -0.9669317 0.9997074 0.966887 -0.9669437 0.9997074 0.966887 -0.9669589 0.9997074 0.966887 -0.9669781 0.9997074 0.966887 -0.9670025 0.9997074 0.966887 -0.9670333 0.9997074 0.966887 -0.9670722 0.9997074 0.966887 -0.9671215 0.9997074 0.966887 -0.9671838 0.9997074 0.966887 -0.9672627 0.9997074 0.966887 -0.9673625 0.9997074 0.966887 -0.9674887 0.9997074 0.966887 -0.9676484 0.9997074 0.966887 -0.9678505 0.9997074 0.966887 -0.9681061 0.9997074 0.966887 -0.9684295 0.9997074 0.966887 -0.9688386 0.9997074 0.966887 -0.9693562 0.9997074 0.966887 -0.970011 0.9997074 0.966887 -0.9708394 0.9997074 0.966887 -0.9718875 0.9997074 0.966887 -0.9732135 0.9997074 0.966887 -0.974891 0.9997074 0.966887 -0.9770133 0.9997074 0.966887 -0.9796982 0.9997074 0.966887 -0.983095 0.9997074 0.966887 -0.9873924 0.9997074 0.966887 -0.9928292 0.9997074 0.966887 -0.9997074 0.9997074 0.966887 -0.9997689 0.9942998 0.9736724 -0.9998174 0.992041 0.9790926 -0.9998557 0.9915331 0.9834129 -0.999886 0.9919389 0.9868505 -0.9999099 0.9927686 0.989582 -0.9999288 0.9937447 0.9917501 -0.9999437 0.9947175 0.9934695 -0.9736726 0.9997689 0.9736728 -0.9736726 0.9997689 0.9736727 -0.9736725 0.9997689 0.9736726 -0.9736724 0.9997689 0.9736724 -0.9736725 0.9997689 0.9736724 -0.9736727 0.9997689 0.9736724 -0.9736729 0.9997689 0.9736724 -0.9736731 0.9997689 0.9736724 -0.9736734 0.9997689 0.9736724 -0.9736737 0.9997689 0.9736724 -0.9736742 0.9997689 0.9736724 -0.9736747 0.9997689 0.9736724 -0.9736754 0.9997689 0.9736724 -0.9736764 0.9997689 0.9736724 -0.9736775 0.9997689 0.9736724 -0.973679 0.9997689 0.9736724 -0.9736808 0.9997689 0.9736724 -0.9736831 0.9997689 0.9736724 -0.9736861 0.9997689 0.9736724 -0.9736898 0.9997689 0.9736724 -0.9736945 0.9997689 0.9736724 -0.9737005 0.9997689 0.9736724 -0.9737081 0.9997689 0.9736724 -0.9737176 0.9997689 0.9736724 -0.9737297 0.9997689 0.9736724 -0.973745 0.9997689 0.9736724 -0.9737643 0.9997689 0.9736724 -0.9737888 0.9997689 0.9736724 -0.9738198 0.9997689 0.9736724 -0.973859 0.9997689 0.9736724 -0.9739085 0.9997689 0.9736724 -0.9739713 0.9997689 0.9736724 -0.9740506 0.9997689 0.9736724 -0.974151 0.9997689 0.9736724 -0.974278 0.9997689 0.9736724 -0.9744386 0.9997689 0.9736724 -0.9746418 0.9997689 0.9736724 -0.974899 0.9997689 0.9736724 -0.9752243 0.9997689 0.9736724 -0.9756358 0.9997689 0.9736724 -0.9761565 0.9997689 0.9736724 -0.9768152 0.9997689 0.9736724 -0.9776486 0.9997689 0.9736724 -0.9787029 0.9997689 0.9736724 -0.9800367 0.9997689 0.9736724 -0.9817242 0.9997689 0.9736724 -0.983859 0.9997689 0.9736724 -0.9865599 0.9997689 0.9736724 -0.9899769 0.9997689 0.9736724 -0.9942998 0.9997689 0.9736724 -0.9997689 0.9997689 0.9736724 -0.9998174 0.9954741 0.9790926 -0.9998557 0.993686 0.9834129 -0.999886 0.993288 0.9868505 -0.9999099 0.9936135 0.989582 -0.9999288 0.9942736 0.9917501 -0.9999437 0.9950484 0.9934695 -0.9790927 0.9998174 0.9790929 -0.9790927 0.9998174 0.9790928 -0.9790927 0.9998174 0.9790927 -0.9790926 0.9998174 0.9790926 -0.9790927 0.9998174 0.9790926 -0.9790928 0.9998174 0.9790926 -0.9790929 0.9998174 0.9790926 -0.979093 0.9998174 0.9790926 -0.9790932 0.9998174 0.9790926 -0.9790934 0.9998174 0.9790926 -0.9790937 0.9998174 0.9790926 -0.979094 0.9998174 0.9790926 -0.9790945 0.9998174 0.9790926 -0.9790951 0.9998174 0.9790926 -0.9790958 0.9998174 0.9790926 -0.9790967 0.9998174 0.9790926 -0.9790979 0.9998174 0.9790926 -0.9790993 0.9998174 0.9790926 -0.9791012 0.9998174 0.9790926 -0.9791035 0.9998174 0.9790926 -0.9791065 0.9998174 0.9790926 -0.9791102 0.9998174 0.9790926 -0.979115 0.9998174 0.9790926 -0.979121 0.9998174 0.9790926 -0.9791286 0.9998174 0.9790926 -0.9791382 0.9998174 0.9790926 -0.9791503 0.9998174 0.9790926 -0.9791657 0.9998174 0.9790926 -0.9791851 0.9998174 0.9790926 -0.9792097 0.9998174 0.9790926 -0.9792408 0.9998174 0.9790926 -0.9792802 0.9998174 0.9790926 -0.97933 0.9998174 0.9790926 -0.979393 0.9998174 0.9790926 -0.9794727 0.9998174 0.9790926 -0.9795736 0.9998174 0.9790926 -0.9797011 0.9998174 0.9790926 -0.9798625 0.9998174 0.9790926 -0.9800667 0.9998174 0.9790926 -0.9803251 0.9998174 0.9790926 -0.9806519 0.9998174 0.9790926 -0.9810654 0.9998174 0.9790926 -0.9815885 0.9998174 0.9790926 -0.9822504 0.9998174 0.9790926 -0.9830876 0.9998174 0.9790926 -0.9841469 0.9998174 0.9790926 -0.985487 0.9998174 0.9790926 -0.9871825 0.9998174 0.9790926 -0.9893274 0.9998174 0.9790926 -0.992041 0.9998174 0.9790926 -0.9954741 0.9998174 0.9790926 -0.9998174 0.9998174 0.9790926 -0.9998557 0.9964098 0.9834129 -0.999886 0.9949948 0.9868505 -0.9999099 0.9946824 0.989582 -0.9999288 0.9949426 0.9917501 -0.9999437 0.9954671 0.9934695 -0.9834129 0.9998557 0.983413 -0.9834129 0.9998557 0.983413 -0.9834129 0.9998557 0.9834129 -0.9834129 0.9998557 0.9834129 -0.9834129 0.9998557 0.9834129 -0.983413 0.9998557 0.9834129 -0.983413 0.9998557 0.9834129 -0.9834131 0.9998557 0.9834129 -0.9834132 0.9998557 0.9834129 -0.9834134 0.9998557 0.9834129 -0.9834135 0.9998557 0.9834129 -0.9834138 0.9998557 0.9834129 -0.983414 0.9998557 0.9834129 -0.9834144 0.9998557 0.9834129 -0.9834149 0.9998557 0.9834129 -0.9834154 0.9998557 0.9834129 -0.9834162 0.9998557 0.9834129 -0.9834171 0.9998557 0.9834129 -0.9834182 0.9998557 0.9834129 -0.9834197 0.9998557 0.9834129 -0.9834216 0.9998557 0.9834129 -0.9834239 0.9998557 0.9834129 -0.9834269 0.9998557 0.9834129 -0.9834306 0.9998557 0.9834129 -0.9834354 0.9998557 0.9834129 -0.9834414 0.9998557 0.9834129 -0.983449 0.9998557 0.9834129 -0.9834587 0.9998557 0.9834129 -0.9834709 0.9998557 0.9834129 -0.9834863 0.9998557 0.9834129 -0.9835058 0.9998557 0.9834129 -0.9835305 0.9998557 0.9834129 -0.9835617 0.9998557 0.9834129 -0.9836012 0.9998557 0.9834129 -0.9836512 0.9998557 0.9834129 -0.9837145 0.9998557 0.9834129 -0.9837945 0.9998557 0.9834129 -0.9838957 0.9998557 0.9834129 -0.9840238 0.9998557 0.9834129 -0.9841858 0.9998557 0.9834129 -0.9843907 0.9998557 0.9834129 -0.9846501 0.9998557 0.9834129 -0.9849781 0.9998557 0.9834129 -0.9853932 0.9998557 0.9834129 -0.9859182 0.9998557 0.9834129 -0.9865825 0.9998557 0.9834129 -0.9874229 0.9998557 0.9834129 -0.9884862 0.9998557 0.9834129 -0.9898313 0.9998557 0.9834129 -0.9915331 0.9998557 0.9834129 -0.993686 0.9998557 0.9834129 -0.9964098 0.9998557 0.9834129 -0.9998557 0.9998557 0.9834129 -0.999886 0.9971541 0.9868505 -0.9999099 0.9960347 0.989582 -0.9999288 0.9957891 0.9917501 -0.9999437 0.9959967 0.9934695 -0.9868505 0.999886 0.9868506 -0.9868505 0.999886 0.9868505 -0.9868505 0.999886 0.9868505 -0.9868505 0.999886 0.9868505 -0.9868505 0.999886 0.9868505 -0.9868505 0.999886 0.9868505 -0.9868506 0.999886 0.9868505 -0.9868506 0.999886 0.9868505 -0.9868507 0.999886 0.9868505 -0.9868508 0.999886 0.9868505 -0.9868509 0.999886 0.9868505 -0.986851 0.999886 0.9868505 -0.9868512 0.999886 0.9868505 -0.9868514 0.999886 0.9868505 -0.9868517 0.999886 0.9868505 -0.9868521 0.999886 0.9868505 -0.9868525 0.999886 0.9868505 -0.9868531 0.999886 0.9868505 -0.9868538 0.999886 0.9868505 -0.9868547 0.999886 0.9868505 -0.9868559 0.999886 0.9868505 -0.9868574 0.999886 0.9868505 -0.9868592 0.999886 0.9868505 -0.9868616 0.999886 0.9868505 -0.9868646 0.999886 0.9868505 -0.9868684 0.999886 0.9868505 -0.9868731 0.999886 0.9868505 -0.9868792 0.999886 0.9868505 -0.9868868 0.999886 0.9868505 -0.9868965 0.999886 0.9868505 -0.9869087 0.999886 0.9868505 -0.9869242 0.999886 0.9868505 -0.9869437 0.999886 0.9868505 -0.9869685 0.999886 0.9868505 -0.9869998 0.999886 0.9868505 -0.9870395 0.999886 0.9868505 -0.9870896 0.999886 0.9868505 -0.987153 0.999886 0.9868505 -0.9872333 0.999886 0.9868505 -0.9873348 0.999886 0.9868505 -0.9874632 0.999886 0.9868505 -0.9876257 0.999886 0.9868505 -0.9878313 0.999886 0.9868505 -0.9880914 0.999886 0.9868505 -0.9884204 0.999886 0.9868505 -0.9888367 0.999886 0.9868505 -0.9893633 0.999886 0.9868505 -0.9900296 0.999886 0.9868505 -0.9908725 0.999886 0.9868505 -0.9919389 0.999886 0.9868505 -0.993288 0.999886 0.9868505 -0.9949948 0.999886 0.9868505 -0.9971541 0.999886 0.9868505 -0.999886 0.999886 0.9868505 -0.9999099 0.9977455 0.989582 -0.9999288 0.99686 0.9917501 -0.9999437 0.9966668 0.9934695 -0.989582 0.9999099 0.989582 -0.989582 0.9999099 0.989582 -0.989582 0.9999099 0.989582 -0.989582 0.9999099 0.989582 -0.989582 0.9999099 0.989582 -0.989582 0.9999099 0.989582 -0.989582 0.9999099 0.989582 -0.9895821 0.9999099 0.989582 -0.9895821 0.9999099 0.989582 -0.9895822 0.9999099 0.989582 -0.9895822 0.9999099 0.989582 -0.9895823 0.9999099 0.989582 -0.9895824 0.9999099 0.989582 -0.9895826 0.9999099 0.989582 -0.9895828 0.9999099 0.989582 -0.989583 0.9999099 0.989582 -0.9895833 0.9999099 0.989582 -0.9895836 0.9999099 0.989582 -0.9895841 0.9999099 0.989582 -0.9895847 0.9999099 0.989582 -0.9895854 0.9999099 0.989582 -0.9895863 0.9999099 0.989582 -0.9895875 0.9999099 0.989582 -0.989589 0.9999099 0.989582 -0.9895908 0.9999099 0.989582 -0.9895932 0.9999099 0.989582 -0.9895962 0.9999099 0.989582 -0.9896 0.9999099 0.989582 -0.9896047 0.9999099 0.989582 -0.9896108 0.9999099 0.989582 -0.9896185 0.9999099 0.989582 -0.9896281 0.9999099 0.989582 -0.9896404 0.9999099 0.989582 -0.9896559 0.9999099 0.989582 -0.9896755 0.9999099 0.989582 -0.9897003 0.9999099 0.989582 -0.9897317 0.9999099 0.989582 -0.9897715 0.9999099 0.989582 -0.9898217 0.9999099 0.989582 -0.9898853 0.9999099 0.989582 -0.9899657 0.9999099 0.989582 -0.9900675 0.9999099 0.989582 -0.9901962 0.9999099 0.989582 -0.9903591 0.9999099 0.989582 -0.9905652 0.9999099 0.989582 -0.9908259 0.9999099 0.989582 -0.9911557 0.9999099 0.989582 -0.9915729 0.9999099 0.989582 -0.9921008 0.9999099 0.989582 -0.9927686 0.9999099 0.989582 -0.9936135 0.9999099 0.989582 -0.9946824 0.9999099 0.989582 -0.9960347 0.9999099 0.989582 -0.9977455 0.9999099 0.989582 -0.9999099 0.9999099 0.989582 -0.9999288 0.9982148 0.9917501 -0.9999437 0.9975145 0.9934695 -0.9917501 0.9999288 0.9917501 -0.9917501 0.9999288 0.9917501 -0.9917501 0.9999288 0.9917501 -0.9917501 0.9999288 0.9917501 -0.9917501 0.9999288 0.9917501 -0.9917501 0.9999288 0.9917501 -0.9917501 0.9999288 0.9917501 -0.9917501 0.9999288 0.9917501 -0.9917502 0.9999288 0.9917501 -0.9917502 0.9999288 0.9917501 -0.9917502 0.9999288 0.9917501 -0.9917503 0.9999288 0.9917501 -0.9917504 0.9999288 0.9917501 -0.9917505 0.9999288 0.9917501 -0.9917506 0.9999288 0.9917501 -0.9917507 0.9999288 0.9917501 -0.9917509 0.9999288 0.9917501 -0.9917511 0.9999288 0.9917501 -0.9917514 0.9999288 0.9917501 -0.9917518 0.9999288 0.9917501 -0.9917522 0.9999288 0.9917501 -0.9917528 0.9999288 0.9917501 -0.9917535 0.9999288 0.9917501 -0.9917544 0.9999288 0.9917501 -0.9917556 0.9999288 0.9917501 -0.9917571 0.9999288 0.9917501 -0.991759 0.9999288 0.9917501 -0.9917613 0.9999288 0.9917501 -0.9917643 0.9999288 0.9917501 -0.9917681 0.9999288 0.9917501 -0.9917729 0.9999288 0.9917501 -0.991779 0.9999288 0.9917501 -0.9917866 0.9999288 0.9917501 -0.9917963 0.9999288 0.9917501 -0.9918086 0.9999288 0.9917501 -0.9918242 0.9999288 0.9917501 -0.9918438 0.9999288 0.9917501 -0.9918687 0.9999288 0.9917501 -0.9919001 0.9999288 0.9917501 -0.9919399 0.9999288 0.9917501 -0.9919903 0.9999288 0.9917501 -0.992054 0.9999288 0.9917501 -0.9921346 0.9999288 0.9917501 -0.9922365 0.9999288 0.9917501 -0.9923655 0.9999288 0.9917501 -0.9925287 0.9999288 0.9917501 -0.9927351 0.9999288 0.9917501 -0.9929963 0.9999288 0.9917501 -0.9933267 0.9999288 0.9917501 -0.9937447 0.9999288 0.9917501 -0.9942736 0.9999288 0.9917501 -0.9949426 0.9999288 0.9917501 -0.9957891 0.9999288 0.9917501 -0.99686 0.9999288 0.9917501 -0.9982148 0.9999288 0.9917501 -0.9999288 0.9999288 0.9917501 -0.9999437 0.9985869 0.9934695 -0.9934695 0.9999437 0.9934695 -0.9934695 0.9999437 0.9934695 -0.9934695 0.9999437 0.9934695 -0.9934695 0.9999437 0.9934695 -0.9934695 0.9999437 0.9934695 -0.9934695 0.9999437 0.9934695 -0.9934695 0.9999437 0.9934695 -0.9934695 0.9999437 0.9934695 -0.9934695 0.9999437 0.9934695 -0.9934696 0.9999437 0.9934695 -0.9934696 0.9999437 0.9934695 -0.9934696 0.9999437 0.9934695 -0.9934697 0.9999437 0.9934695 -0.9934697 0.9999437 0.9934695 -0.9934698 0.9999437 0.9934695 -0.9934699 0.9999437 0.9934695 -0.99347 0.9999437 0.9934695 -0.9934701 0.9999437 0.9934695 -0.9934703 0.9999437 0.9934695 -0.9934705 0.9999437 0.9934695 -0.9934708 0.9999437 0.9934695 -0.9934712 0.9999437 0.9934695 -0.9934716 0.9999437 0.9934695 -0.9934722 0.9999437 0.9934695 -0.9934729 0.9999437 0.9934695 -0.9934739 0.9999437 0.9934695 -0.993475 0.9999437 0.9934695 -0.9934765 0.9999437 0.9934695 -0.9934784 0.9999437 0.9934695 -0.9934808 0.9999437 0.9934695 -0.9934838 0.9999437 0.9934695 -0.9934876 0.9999437 0.9934695 -0.9934924 0.9999437 0.9934695 -0.9934984 0.9999437 0.9934695 -0.9935061 0.9999437 0.9934695 -0.9935158 0.9999437 0.9934695 -0.9935281 0.9999437 0.9934695 -0.9935437 0.9999437 0.9934695 -0.9935634 0.9999437 0.9934695 -0.9935883 0.9999437 0.9934695 -0.9936198 0.9999437 0.9934695 -0.9936596 0.9999437 0.9934695 -0.9937101 0.9999437 0.9934695 -0.9937738 0.9999437 0.9934695 -0.9938545 0.9999437 0.9934695 -0.9939566 0.9999437 0.9934695 -0.9940858 0.9999437 0.9934695 -0.9942492 0.9999437 0.9934695 -0.994456 0.9999437 0.9934695 -0.9947175 0.9999437 0.9934695 -0.9950484 0.9999437 0.9934695 -0.9954671 0.9999437 0.9934695 -0.9959967 0.9999437 0.9934695 -0.9966668 0.9999437 0.9934695 -0.9975145 0.9999437 0.9934695 -0.9985869 0.9999437 0.9934695 -0.9999437 0.9999437 0.9934695 -0.0000238 0.0000238 0.0030742 -0.0005417 0.0000238 0.0030742 -0.0011968 0.0000238 0.0030742 -0.0020256 0.0000238 0.0030742 -0.0030742 0.0000238 0.0030742 -0.0044007 0.0000238 0.0030742 -0.006079 0.0000238 0.0030742 -0.0082023 0.0000238 0.0030742 -0.0108885 0.0000238 0.0030742 -0.0142868 0.0000238 0.0030742 -0.0185862 0.0000238 0.0030742 -0.0240255 0.0000238 0.0030742 -0.0309069 0.0000238 0.0030742 -0.0396127 0.0000238 0.0030742 -0.0506267 0.0000238 0.0030742 -0.0645609 0.0000238 0.0030742 -0.0821895 0.0000238 0.0030742 -0.1044919 0.0000238 0.0030742 -0.1327073 0.0000238 0.0030742 -0.1684036 0.0000238 0.0030742 -0.2135639 0.0000238 0.0030742 -0.2706977 0.0000238 0.0030742 -0.3429792 0.0000238 0.0030742 -0.4344249 0.0000238 0.0030742 -0.5501155 0.0000238 0.0030742 -0.6964791 0.0000238 0.0030742 -0.8407292 0.0051514 0.0080424 -0.9033413 0.0279321 0.0303251 -0.9354466 0.0624569 0.0643425 -0.9545467 0.1059991 0.1074473 -0.9669269 0.1572498 0.1583419 -0.9754027 0.2151269 0.2159373 -0.9814251 0.2783684 0.2789607 -0.9858181 0.3454107 0.3458371 -0.9890841 0.4144197 0.4147221 -0.9915469 0.4834235 0.4836348 -0.993424 0.5504963 0.5506419 -0.9948662 0.6139459 0.6140448 -0.9959813 0.6724572 0.6725236 -0.9968475 0.7251659 0.72521 -0.997523 0.7716588 0.7716878 -0.9980513 0.8119154 0.8119343 -0.9984653 0.8462171 0.8462293 -0.9987905 0.8750477 0.8750555 -0.9990461 0.8990028 0.8990078 -0.9992474 0.9187175 0.9187207 -0.999406 0.9348153 0.9348173 -0.999531 0.9478754 0.9478767 -0.9996296 0.958416 0.9584168 -0.9997074 0.9668873 0.9668878 -0.9997689 0.9736726 0.9736729 -0.9998174 0.9790927 0.9790929 -0.9998557 0.9834129 0.9834131 -0.999886 0.9868505 0.9868506 -0.9999099 0.989582 0.9895821 -0.9999288 0.9917501 0.9917501 -0.9999437 0.9934695 0.9934695 -0.0000238 0.0005417 0.0030742 -0.0000382 0.0000382 0.0025707 -0.0006933 0.0000382 0.0025707 -0.0015221 0.0000382 0.0025707 -0.0025707 0.0000382 0.0025707 -0.0038972 0.0000382 0.0025707 -0.0055755 0.0000382 0.0025707 -0.0076988 0.0000382 0.0025707 -0.0103849 0.0000382 0.0025707 -0.0137833 0.0000382 0.0025707 -0.0180827 0.0000382 0.0025707 -0.023522 0.0000382 0.0025707 -0.0304033 0.0000382 0.0025707 -0.0391092 0.0000382 0.0025707 -0.0501232 0.0000382 0.0025707 -0.0640574 0.0000382 0.0025707 -0.081686 0.0000382 0.0025707 -0.1039884 0.0000382 0.0025707 -0.1322038 0.0000382 0.0025707 -0.1679 0.0000382 0.0025707 -0.2130604 0.0000382 0.0025707 -0.2701941 0.0000382 0.0025707 -0.3424757 0.0000382 0.0025707 -0.4339214 0.0000382 0.0025707 -0.549612 0.0000382 0.0025707 -0.6959756 0.0000382 0.0025707 -0.8405071 0.0051286 0.0075296 -0.9032596 0.0278872 0.0298748 -0.9354101 0.0624063 0.0639724 -0.9545286 0.1059489 0.1071517 -0.9669173 0.1572031 0.15811 -0.9753975 0.2150852 0.2157582 -0.9814221 0.2783325 0.2788244 -0.9858163 0.3453807 0.3457348 -0.9890831 0.4143955 0.4146466 -0.9915463 0.4834045 0.48358 -0.9934236 0.5504818 0.5506027 -0.994866 0.6139352 0.6140174 -0.9959811 0.6724495 0.6725046 -0.9968474 0.7251605 0.7251971 -0.997523 0.7716551 0.7716791 -0.9980512 0.8119128 0.8119285 -0.9984653 0.8462154 0.8462255 -0.9987905 0.8750466 0.8750531 -0.9990461 0.899002 0.8990062 -0.9992474 0.918717 0.9187197 -0.999406 0.9348149 0.9348166 -0.999531 0.9478752 0.9478763 -0.9996296 0.9584159 0.9584165 -0.9997074 0.9668872 0.9668877 -0.9997689 0.9736726 0.9736728 -0.9998174 0.9790927 0.9790929 -0.9998557 0.9834129 0.983413 -0.999886 0.9868505 0.9868506 -0.9999099 0.989582 0.989582 -0.9999288 0.9917501 0.9917501 -0.9999437 0.9934695 0.9934695 -0.0000238 0.0011968 0.0030742 -0.0000382 0.0006933 0.0025707 -0.0000611 0.0000611 0.0019385 -0.0008899 0.0000611 0.0019385 -0.0019385 0.0000611 0.0019385 -0.003265 0.0000611 0.0019385 -0.0049433 0.0000611 0.0019385 -0.0070666 0.0000611 0.0019385 -0.0097527 0.0000611 0.0019385 -0.0131511 0.0000611 0.0019385 -0.0174505 0.0000611 0.0019385 -0.0228898 0.0000611 0.0019385 -0.0297711 0.0000611 0.0019385 -0.038477 0.0000611 0.0019385 -0.049491 0.0000611 0.0019385 -0.0634252 0.0000611 0.0019385 -0.0810538 0.0000611 0.0019385 -0.1033562 0.0000611 0.0019385 -0.1315716 0.0000611 0.0019385 -0.1672678 0.0000611 0.0019385 -0.2124282 0.0000611 0.0019385 -0.2695619 0.0000611 0.0019385 -0.3418435 0.0000611 0.0019385 -0.4332891 0.0000611 0.0019385 -0.5489798 0.0000611 0.0019385 -0.6953434 0.0000611 0.0019385 -0.8402274 0.0051047 0.0068855 -0.9031567 0.0278347 0.0293089 -0.9353643 0.0623458 0.0635073 -0.9545059 0.1058883 0.1067803 -0.9669053 0.1571463 0.1578188 -0.9753908 0.2150342 0.2155333 -0.9814183 0.2782884 0.2786531 -0.9858141 0.3453439 0.3456064 -0.9890818 0.4143657 0.4145518 -0.9915455 0.4833811 0.4835112 -0.9934231 0.550464 0.5505536 -0.9948657 0.6139219 0.6139828 -0.9959809 0.6724399 0.6724808 -0.9968473 0.7251537 0.7251809 -0.9975229 0.7716504 0.7716682 -0.9980512 0.8119096 0.8119213 -0.9984653 0.8462132 0.8462207 -0.9987904 0.8750451 0.87505 -0.9990461 0.8990011 0.8990042 -0.9992474 0.9187164 0.9187184 -0.999406 0.9348146 0.9348158 -0.999531 0.947875 0.9478757 -0.9996296 0.9584157 0.9584162 -0.9997074 0.9668871 0.9668875 -0.9997689 0.9736725 0.9736727 -0.9998174 0.9790927 0.9790928 -0.9998557 0.9834129 0.983413 -0.999886 0.9868505 0.9868505 -0.9999099 0.989582 0.989582 -0.9999288 0.9917501 0.9917501 -0.9999437 0.9934695 0.9934695 -0.0000238 0.0020256 0.0030742 -0.0000382 0.0015221 0.0025707 -0.0000611 0.0008899 0.0019385 -0.0000978 0.0000978 0.0011463 -0.0011463 0.0000978 0.0011463 -0.0024729 0.0000978 0.0011463 -0.0041512 0.0000978 0.0011463 -0.0062744 0.0000978 0.0011463 -0.0089606 0.0000978 0.0011463 -0.012359 0.0000978 0.0011463 -0.0166583 0.0000978 0.0011463 -0.0220976 0.0000978 0.0011463 -0.028979 0.0000978 0.0011463 -0.0376849 0.0000978 0.0011463 -0.0486989 0.0000978 0.0011463 -0.0626331 0.0000978 0.0011463 -0.0802616 0.0000978 0.0011463 -0.102564 0.0000978 0.0011463 -0.1307795 0.0000978 0.0011463 -0.1664757 0.0000978 0.0011463 -0.2116361 0.0000978 0.0011463 -0.2687698 0.0000978 0.0011463 -0.3410514 0.0000978 0.0011463 -0.432497 0.0000978 0.0011463 -0.5481876 0.0000978 0.0011463 -0.6945513 0.0000978 0.0011463 -0.8398756 0.0050826 0.0060778 -0.9030276 0.0277752 0.0285991 -0.9353068 0.0622749 0.062924 -0.9544774 0.1058162 0.1063147 -0.9668902 0.1570779 0.1574537 -0.9753825 0.2149725 0.2152513 -0.9814136 0.2782347 0.2784385 -0.9858113 0.3452987 0.3454454 -0.9890801 0.414329 0.414433 -0.9915446 0.4833522 0.4834249 -0.9934225 0.5504419 0.550492 -0.9948653 0.6139056 0.6139396 -0.9959807 0.672428 0.6724509 -0.9968472 0.7251454 0.7251605 -0.9975228 0.7716446 0.7716545 -0.9980511 0.8119057 0.8119122 -0.9984653 0.8462106 0.8462148 -0.9987904 0.8750434 0.8750461 -0.9990461 0.899 0.8990017 -0.9992474 0.9187157 0.9187168 -0.999406 0.9348141 0.9348148 -0.999531 0.9478746 0.9478751 -0.9996296 0.9584155 0.9584158 -0.9997074 0.966887 0.9668872 -0.9997689 0.9736724 0.9736725 -0.9998174 0.9790926 0.9790927 -0.9998557 0.9834129 0.9834129 -0.999886 0.9868505 0.9868505 -0.9999099 0.989582 0.989582 -0.9999288 0.9917501 0.9917501 -0.9999437 0.9934695 0.9934695 -0.0000238 0.0030742 0.0030742 -0.0000382 0.0025707 0.0025707 -0.0000611 0.0019385 0.0019385 -0.0000978 0.0011463 0.0011463 -0.0001565 0.0001565 0.0001565 -0.001483 0.0001565 0.0001565 -0.0031613 0.0001565 0.0001565 -0.0052846 0.0001565 0.0001565 -0.0079707 0.0001565 0.0001565 -0.0113691 0.0001565 0.0001565 -0.0156685 0.0001565 0.0001565 -0.0211078 0.0001565 0.0001565 -0.0279891 0.0001565 0.0001565 -0.036695 0.0001565 0.0001565 -0.047709 0.0001565 0.0001565 -0.0616432 0.0001565 0.0001565 -0.0792718 0.0001565 0.0001565 -0.1015742 0.0001565 0.0001565 -0.1297896 0.0001565 0.0001565 -0.1654858 0.0001565 0.0001565 -0.2106462 0.0001565 0.0001565 -0.2677799 0.0001565 0.0001565 -0.3400615 0.0001565 0.0001565 -0.4315072 0.0001565 0.0001565 -0.5471978 0.0001565 0.0001565 -0.6935614 0.0001565 0.0001565 -0.8394338 0.0050676 0.0050676 -0.9028657 0.0277111 0.0277111 -0.9352348 0.0621943 0.0621943 -0.9544418 0.1057322 0.1057322 -0.9668714 0.1569971 0.1569971 -0.9753721 0.2148987 0.2148987 -0.9814076 0.2781701 0.2781701 -0.9858079 0.3452442 0.3452442 -0.9890781 0.4142845 0.4142845 -0.9915433 0.4833171 0.4833171 -0.9934218 0.550415 0.550415 -0.9948649 0.6138855 0.6138855 -0.9959804 0.6724135 0.6724135 -0.996847 0.7251351 0.7251351 -0.9975227 0.7716375 0.7716375 -0.9980511 0.8119009 0.8119009 -0.9984652 0.8462073 0.8462073 -0.9987904 0.8750412 0.8750412 -0.9990461 0.8989986 0.8989986 -0.9992474 0.9187148 0.9187148 -0.999406 0.9348135 0.9348135 -0.999531 0.9478743 0.9478743 -0.9996296 0.9584153 0.9584153 -0.9997074 0.9668869 0.9668869 -0.9997689 0.9736723 0.9736723 -0.9998174 0.9790925 0.9790925 -0.9998557 0.9834128 0.9834128 -0.999886 0.9868504 0.9868504 -0.9999099 0.989582 0.989582 -0.9999288 0.9917501 0.9917501 -0.9999437 0.9934695 0.9934695 -0.0000238 0.0044007 0.0030742 -0.0000382 0.0038972 0.0025707 -0.0000611 0.003265 0.0019385 -0.0000978 0.0024729 0.0011463 -0.0001565 0.001483 0.0001565 -0.001483 0.001483 0.0001565 -0.0031613 0.001483 0.0001565 -0.0052846 0.001483 0.0001565 -0.0079707 0.001483 0.0001565 -0.0113691 0.001483 0.0001565 -0.0156685 0.001483 0.0001565 -0.0211078 0.001483 0.0001565 -0.0279891 0.001483 0.0001565 -0.036695 0.001483 0.0001565 -0.047709 0.001483 0.0001565 -0.0616432 0.001483 0.0001565 -0.0792718 0.001483 0.0001565 -0.1015742 0.001483 0.0001565 -0.1297896 0.001483 0.0001565 -0.1654858 0.001483 0.0001565 -0.2106462 0.001483 0.0001565 -0.2677799 0.001483 0.0001565 -0.3400615 0.001483 0.0001565 -0.4315072 0.001483 0.0001565 -0.5471978 0.001483 0.0001565 -0.6935614 0.001483 0.0001565 -0.8394338 0.0063275 0.0050676 -0.9028657 0.0287543 0.0277111 -0.9352348 0.0630161 0.0621943 -0.9544418 0.1063632 0.1057322 -0.9668714 0.1574728 0.1569971 -0.9753721 0.2152516 0.2148987 -0.9814076 0.2784279 0.2781701 -0.9858079 0.3454298 0.3452442 -0.9890781 0.4144161 0.4142845 -0.9915433 0.483409 0.4833171 -0.9934218 0.5504784 0.550415 -0.9948649 0.6139286 0.6138855 -0.9959804 0.6724424 0.6724135 -0.996847 0.7251543 0.7251351 -0.9975227 0.7716501 0.7716375 -0.9980511 0.8119091 0.8119009 -0.9984652 0.8462126 0.8462073 -0.9987904 0.8750447 0.8750412 -0.9990461 0.8990008 0.8989986 -0.9992474 0.9187162 0.9187148 -0.999406 0.9348144 0.9348135 -0.999531 0.9478748 0.9478743 -0.9996296 0.9584156 0.9584153 -0.9997074 0.9668871 0.9668869 -0.9997689 0.9736725 0.9736723 -0.9998174 0.9790926 0.9790925 -0.9998557 0.9834129 0.9834128 -0.999886 0.9868505 0.9868504 -0.9999099 0.989582 0.989582 -0.9999288 0.9917501 0.9917501 -0.9999437 0.9934695 0.9934695 -0.0000238 0.006079 0.0030742 -0.0000382 0.0055755 0.0025707 -0.0000611 0.0049433 0.0019385 -0.0000978 0.0041512 0.0011463 -0.0001565 0.0031613 0.0001565 -0.001483 0.0031613 0.0001565 -0.0031613 0.0031613 0.0001565 -0.0052846 0.0031613 0.0001565 -0.0079707 0.0031613 0.0001565 -0.0113691 0.0031613 0.0001565 -0.0156685 0.0031613 0.0001565 -0.0211078 0.0031613 0.0001565 -0.0279891 0.0031613 0.0001565 -0.036695 0.0031613 0.0001565 -0.047709 0.0031613 0.0001565 -0.0616432 0.0031613 0.0001565 -0.0792718 0.0031613 0.0001565 -0.1015742 0.0031613 0.0001565 -0.1297896 0.0031613 0.0001565 -0.1654858 0.0031613 0.0001565 -0.2106462 0.0031613 0.0001565 -0.2677799 0.0031613 0.0001565 -0.3400615 0.0031613 0.0001565 -0.4315072 0.0031613 0.0001565 -0.5471978 0.0031613 0.0001565 -0.6935614 0.0031613 0.0001565 -0.8394338 0.0079213 0.0050676 -0.9028657 0.0300741 0.0277111 -0.9352348 0.0640558 0.0621943 -0.9544418 0.1071616 0.1057322 -0.9668714 0.1580746 0.1569971 -0.9753721 0.2156981 0.2148987 -0.9814076 0.2787542 0.2781701 -0.9858079 0.3456646 0.3452442 -0.9890781 0.4145826 0.4142845 -0.9915433 0.4835254 0.4833171 -0.9934218 0.5505585 0.550415 -0.9948649 0.6139831 0.6138855 -0.9959804 0.672479 0.6724135 -0.996847 0.7251785 0.7251351 -0.9975227 0.771666 0.7716375 -0.9980511 0.8119195 0.8119009 -0.9984652 0.8462194 0.8462073 -0.9987904 0.875049 0.8750412 -0.9990461 0.8990035 0.8989986 -0.9992474 0.9187179 0.9187148 -0.999406 0.9348155 0.9348135 -0.999531 0.9478755 0.9478743 -0.9996296 0.9584161 0.9584153 -0.9997074 0.9668874 0.9668869 -0.9997689 0.9736726 0.9736723 -0.9998174 0.9790927 0.9790925 -0.9998557 0.9834129 0.9834128 -0.999886 0.9868505 0.9868504 -0.9999099 0.989582 0.989582 -0.9999288 0.9917501 0.9917501 -0.9999437 0.9934695 0.9934695 -0.0000238 0.0082023 0.0030742 -0.0000382 0.0076988 0.0025707 -0.0000611 0.0070666 0.0019385 -0.0000978 0.0062744 0.0011463 -0.0001565 0.0052846 0.0001565 -0.001483 0.0052846 0.0001565 -0.0031613 0.0052846 0.0001565 -0.0052846 0.0052846 0.0001565 -0.0079707 0.0052846 0.0001565 -0.0113691 0.0052846 0.0001565 -0.0156685 0.0052846 0.0001565 -0.0211078 0.0052846 0.0001565 -0.0279891 0.0052846 0.0001565 -0.036695 0.0052846 0.0001565 -0.047709 0.0052846 0.0001565 -0.0616432 0.0052846 0.0001565 -0.0792718 0.0052846 0.0001565 -0.1015742 0.0052846 0.0001565 -0.1297896 0.0052846 0.0001565 -0.1654858 0.0052846 0.0001565 -0.2106462 0.0052846 0.0001565 -0.2677799 0.0052846 0.0001565 -0.3400615 0.0052846 0.0001565 -0.4315072 0.0052846 0.0001565 -0.5471978 0.0052846 0.0001565 -0.6935614 0.0052846 0.0001565 -0.8394338 0.0099377 0.0050676 -0.9028657 0.0317439 0.0277111 -0.9352348 0.0653712 0.0621943 -0.9544418 0.1081716 0.1057322 -0.9668714 0.158836 0.1569971 -0.9753721 0.2162629 0.2148987 -0.9814076 0.2791669 0.2781701 -0.9858079 0.3459616 0.3452442 -0.9890781 0.4147933 0.4142845 -0.9915433 0.4836726 0.4833171 -0.9934218 0.5506599 0.550415 -0.9948649 0.614052 0.6138855 -0.9959804 0.6725253 0.6724135 -0.996847 0.7252093 0.7251351 -0.9975227 0.7716862 0.7716375 -0.9980511 0.8119326 0.8119009 -0.9984652 0.8462279 0.8462073 -0.9987904 0.8750544 0.8750412 -0.9990461 0.899007 0.8989986 -0.9992474 0.9187201 0.9187148 -0.999406 0.9348169 0.9348135 -0.999531 0.9478764 0.9478743 -0.9996296 0.9584166 0.9584153 -0.9997074 0.9668877 0.9668869 -0.9997689 0.9736729 0.9736723 -0.9998174 0.9790929 0.9790925 -0.9998557 0.983413 0.9834128 -0.999886 0.9868506 0.9868504 -0.9999099 0.989582 0.989582 -0.9999288 0.9917501 0.9917501 -0.9999437 0.9934695 0.9934695 -0.0000238 0.0108885 0.0030742 -0.0000382 0.0103849 0.0025707 -0.0000611 0.0097527 0.0019385 -0.0000978 0.0089606 0.0011463 -0.0001565 0.0079707 0.0001565 -0.001483 0.0079707 0.0001565 -0.0031613 0.0079707 0.0001565 -0.0052846 0.0079707 0.0001565 -0.0079707 0.0079707 0.0001565 -0.0113691 0.0079707 0.0001565 -0.0156685 0.0079707 0.0001565 -0.0211078 0.0079707 0.0001565 -0.0279891 0.0079707 0.0001565 -0.036695 0.0079707 0.0001565 -0.047709 0.0079707 0.0001565 -0.0616432 0.0079707 0.0001565 -0.0792718 0.0079707 0.0001565 -0.1015742 0.0079707 0.0001565 -0.1297896 0.0079707 0.0001565 -0.1654858 0.0079707 0.0001565 -0.2106462 0.0079707 0.0001565 -0.2677799 0.0079707 0.0001565 -0.3400615 0.0079707 0.0001565 -0.4315072 0.0079707 0.0001565 -0.5471978 0.0079707 0.0001565 -0.6935614 0.0079707 0.0001565 -0.8394338 0.0124887 0.0050676 -0.9028657 0.0338564 0.0277111 -0.9352348 0.0670354 0.0621943 -0.9544418 0.1094494 0.1057322 -0.9668714 0.1597992 0.1569971 -0.9753721 0.2169775 0.2148987 -0.9814076 0.279689 0.2781701 -0.9858079 0.3463375 0.3452442 -0.9890781 0.4150598 0.4142845 -0.9915433 0.4838588 0.4833171 -0.9934218 0.5507882 0.550415 -0.9948649 0.6141392 0.6138855 -0.9959804 0.6725838 0.6724135 -0.996847 0.7252481 0.7251351 -0.9975227 0.7717117 0.7716375 -0.9980511 0.8119492 0.8119009 -0.9984652 0.8462386 0.8462073 -0.9987904 0.8750613 0.8750412 -0.9990461 0.8990114 0.8989986 -0.9992474 0.9187229 0.9187148 -0.999406 0.9348187 0.9348135 -0.999531 0.9478775 0.9478743 -0.9996296 0.9584173 0.9584153 -0.9997074 0.9668882 0.9668869 -0.9997689 0.9736732 0.9736723 -0.9998174 0.9790931 0.9790925 -0.9998557 0.9834131 0.9834128 -0.999886 0.9868506 0.9868504 -0.9999099 0.9895821 0.989582 -0.9999288 0.9917501 0.9917501 -0.9999437 0.9934695 0.9934695 -0.0000238 0.0142868 0.0030742 -0.0000382 0.0137833 0.0025707 -0.0000611 0.0131511 0.0019385 -0.0000978 0.012359 0.0011463 -0.0001565 0.0113691 0.0001565 -0.001483 0.0113691 0.0001565 -0.0031613 0.0113691 0.0001565 -0.0052846 0.0113691 0.0001565 -0.0079707 0.0113691 0.0001565 -0.0113691 0.0113691 0.0001565 -0.0156685 0.0113691 0.0001565 -0.0211078 0.0113691 0.0001565 -0.0279891 0.0113691 0.0001565 -0.036695 0.0113691 0.0001565 -0.047709 0.0113691 0.0001565 -0.0616432 0.0113691 0.0001565 -0.0792718 0.0113691 0.0001565 -0.1015742 0.0113691 0.0001565 -0.1297896 0.0113691 0.0001565 -0.1654858 0.0113691 0.0001565 -0.2106462 0.0113691 0.0001565 -0.2677799 0.0113691 0.0001565 -0.3400615 0.0113691 0.0001565 -0.4315072 0.0113691 0.0001565 -0.5471978 0.0113691 0.0001565 -0.6935614 0.0113691 0.0001565 -0.8394338 0.0157161 0.0050676 -0.9028657 0.0365289 0.0277111 -0.9352348 0.0691408 0.0621943 -0.9544418 0.1110659 0.1057322 -0.9668714 0.1610178 0.1569971 -0.9753721 0.2178815 0.2148987 -0.9814076 0.2803496 0.2781701 -0.9858079 0.3468129 0.3452442 -0.9890781 0.4153969 0.4142845 -0.9915433 0.4840944 0.4833171 -0.9934218 0.5509505 0.550415 -0.9948649 0.6142495 0.6138855 -0.9959804 0.6726578 0.6724135 -0.996847 0.7252972 0.7251351 -0.9975227 0.771744 0.7716375 -0.9980511 0.8119703 0.8119009 -0.9984652 0.8462522 0.8462073 -0.9987904 0.8750701 0.8750412 -0.9990461 0.899017 0.8989986 -0.9992474 0.9187265 0.9187148 -0.999406 0.9348209 0.9348135 -0.999531 0.947879 0.9478743 -0.9996296 0.9584182 0.9584153 -0.9997074 0.9668887 0.9668869 -0.9997689 0.9736735 0.9736723 -0.9998174 0.9790933 0.9790925 -0.9998557 0.9834133 0.9834128 -0.999886 0.9868507 0.9868504 -0.9999099 0.9895821 0.989582 -0.9999288 0.9917502 0.9917501 -0.9999437 0.9934695 0.9934695 -0.0000238 0.0185862 0.0030742 -0.0000382 0.0180827 0.0025707 -0.0000611 0.0174505 0.0019385 -0.0000978 0.0166583 0.0011463 -0.0001565 0.0156685 0.0001565 -0.001483 0.0156685 0.0001565 -0.0031613 0.0156685 0.0001565 -0.0052846 0.0156685 0.0001565 -0.0079707 0.0156685 0.0001565 -0.0113691 0.0156685 0.0001565 -0.0156685 0.0156685 0.0001565 -0.0211078 0.0156685 0.0001565 -0.0279891 0.0156685 0.0001565 -0.036695 0.0156685 0.0001565 -0.047709 0.0156685 0.0001565 -0.0616432 0.0156685 0.0001565 -0.0792718 0.0156685 0.0001565 -0.1015742 0.0156685 0.0001565 -0.1297896 0.0156685 0.0001565 -0.1654858 0.0156685 0.0001565 -0.2106462 0.0156685 0.0001565 -0.2677799 0.0156685 0.0001565 -0.3400615 0.0156685 0.0001565 -0.4315072 0.0156685 0.0001565 -0.5471978 0.0156685 0.0001565 -0.6935614 0.0156685 0.0001565 -0.8394338 0.0197991 0.0050676 -0.9028657 0.03991 0.0277111 -0.9352348 0.0718043 0.0621943 -0.9544418 0.1131111 0.1057322 -0.9668714 0.1625595 0.1569971 -0.9753721 0.2190253 0.2148987 -0.9814076 0.2811853 0.2781701 -0.9858079 0.3474144 0.3452442 -0.9890781 0.4158235 0.4142845 -0.9915433 0.4843924 0.4833171 -0.9934218 0.5511558 0.550415 -0.9948649 0.6143891 0.6138855 -0.9959804 0.6727515 0.6724135 -0.996847 0.7253594 0.7251351 -0.9975227 0.7717849 0.7716375 -0.9980511 0.8119969 0.8119009 -0.9984652 0.8462694 0.8462073 -0.9987904 0.8750811 0.8750412 -0.9990461 0.8990241 0.8989986 -0.9992474 0.918731 0.9187148 -0.999406 0.9348238 0.9348135 -0.999531 0.9478808 0.9478743 -0.9996296 0.9584194 0.9584153 -0.9997074 0.9668894 0.9668869 -0.9997689 0.973674 0.9736723 -0.9998174 0.9790936 0.9790925 -0.9998557 0.9834135 0.9834128 -0.999886 0.9868508 0.9868504 -0.9999099 0.9895822 0.989582 -0.9999288 0.9917502 0.9917501 -0.9999437 0.9934696 0.9934695 -0.0000238 0.0240255 0.0030742 -0.0000382 0.023522 0.0025707 -0.0000611 0.0228898 0.0019385 -0.0000978 0.0220976 0.0011463 -0.0001565 0.0211078 0.0001565 -0.001483 0.0211078 0.0001565 -0.0031613 0.0211078 0.0001565 -0.0052846 0.0211078 0.0001565 -0.0079707 0.0211078 0.0001565 -0.0113691 0.0211078 0.0001565 -0.0156685 0.0211078 0.0001565 -0.0211078 0.0211078 0.0001565 -0.0279891 0.0211078 0.0001565 -0.036695 0.0211078 0.0001565 -0.047709 0.0211078 0.0001565 -0.0616432 0.0211078 0.0001565 -0.0792718 0.0211078 0.0001565 -0.1015742 0.0211078 0.0001565 -0.1297896 0.0211078 0.0001565 -0.1654858 0.0211078 0.0001565 -0.2106462 0.0211078 0.0001565 -0.2677799 0.0211078 0.0001565 -0.3400615 0.0211078 0.0001565 -0.4315072 0.0211078 0.0001565 -0.5471978 0.0211078 0.0001565 -0.6935614 0.0211078 0.0001565 -0.8394338 0.0249647 0.0050676 -0.9028657 0.0441875 0.0277111 -0.9352348 0.0751741 0.0621943 -0.9544418 0.1156985 0.1057322 -0.9668714 0.16451 0.1569971 -0.9753721 0.2204723 0.2148987 -0.9814076 0.2822426 0.2781701 -0.9858079 0.3481754 0.3452442 -0.9890781 0.4163631 0.4142845 -0.9915433 0.4847695 0.4833171 -0.9934218 0.5514156 0.550415 -0.9948649 0.6145656 0.6138855 -0.9959804 0.67287 0.6724135 -0.996847 0.7254381 0.7251351 -0.9975227 0.7718366 0.7716375 -0.9980511 0.8120305 0.8119009 -0.9984652 0.8462912 0.8462073 -0.9987904 0.8750951 0.8750412 -0.9990461 0.899033 0.8989986 -0.9992474 0.9187367 0.9187148 -0.999406 0.9348274 0.9348135 -0.999531 0.947883 0.9478743 -0.9996296 0.9584208 0.9584153 -0.9997074 0.9668904 0.9668869 -0.9997689 0.9736745 0.9736723 -0.9998174 0.9790939 0.9790925 -0.9998557 0.9834137 0.9834128 -0.999886 0.986851 0.9868504 -0.9999099 0.9895823 0.989582 -0.9999288 0.9917503 0.9917501 -0.9999437 0.9934696 0.9934695 -0.0000238 0.0309069 0.0030742 -0.0000382 0.0304033 0.0025707 -0.0000611 0.0297711 0.0019385 -0.0000978 0.028979 0.0011463 -0.0001565 0.0279891 0.0001565 -0.001483 0.0279891 0.0001565 -0.0031613 0.0279891 0.0001565 -0.0052846 0.0279891 0.0001565 -0.0079707 0.0279891 0.0001565 -0.0113691 0.0279891 0.0001565 -0.0156685 0.0279891 0.0001565 -0.0211078 0.0279891 0.0001565 -0.0279891 0.0279891 0.0001565 -0.036695 0.0279891 0.0001565 -0.047709 0.0279891 0.0001565 -0.0616432 0.0279891 0.0001565 -0.0792718 0.0279891 0.0001565 -0.1015742 0.0279891 0.0001565 -0.1297896 0.0279891 0.0001565 -0.1654858 0.0279891 0.0001565 -0.2106462 0.0279891 0.0001565 -0.2677799 0.0279891 0.0001565 -0.3400615 0.0279891 0.0001565 -0.4315072 0.0279891 0.0001565 -0.5471978 0.0279891 0.0001565 -0.6935614 0.0279891 0.0001565 -0.8394338 0.0314998 0.0050676 -0.9028657 0.0495992 0.0277111 -0.9352348 0.0794373 0.0621943 -0.9544418 0.1189719 0.1057322 -0.9668714 0.1669776 0.1569971 -0.9753721 0.2223029 0.2148987 -0.9814076 0.2835801 0.2781701 -0.9858079 0.3491382 0.3452442 -0.9890781 0.4170458 0.4142845 -0.9915433 0.4852466 0.4833171 -0.9934218 0.5517442 0.550415 -0.9948649 0.614789 0.6138855 -0.9959804 0.67302 0.6724135 -0.996847 0.7255376 0.7251351 -0.9975227 0.7719019 0.7716375 -0.9980511 0.8120731 0.8119009 -0.9984652 0.8463187 0.8462073 -0.9987904 0.8751128 0.8750412 -0.9990461 0.8990443 0.8989986 -0.9992474 0.9187439 0.9187148 -0.999406 0.9348319 0.9348135 -0.999531 0.9478859 0.9478743 -0.9996296 0.9584226 0.9584153 -0.9997074 0.9668915 0.9668869 -0.9997689 0.9736752 0.9736723 -0.9998174 0.9790944 0.9790925 -0.9998557 0.983414 0.9834128 -0.999886 0.9868512 0.9868504 -0.9999099 0.9895824 0.989582 -0.9999288 0.9917503 0.9917501 -0.9999437 0.9934696 0.9934695 -0.0000238 0.0396127 0.0030742 -0.0000382 0.0391092 0.0025707 -0.0000611 0.038477 0.0019385 -0.0000978 0.0376849 0.0011463 -0.0001565 0.036695 0.0001565 -0.001483 0.036695 0.0001565 -0.0031613 0.036695 0.0001565 -0.0052846 0.036695 0.0001565 -0.0079707 0.036695 0.0001565 -0.0113691 0.036695 0.0001565 -0.0156685 0.036695 0.0001565 -0.0211078 0.036695 0.0001565 -0.0279891 0.036695 0.0001565 -0.036695 0.036695 0.0001565 -0.047709 0.036695 0.0001565 -0.0616432 0.036695 0.0001565 -0.0792718 0.036695 0.0001565 -0.1015742 0.036695 0.0001565 -0.1297896 0.036695 0.0001565 -0.1654858 0.036695 0.0001565 -0.2106462 0.036695 0.0001565 -0.2677799 0.036695 0.0001565 -0.3400615 0.036695 0.0001565 -0.4315072 0.036695 0.0001565 -0.5471978 0.036695 0.0001565 -0.6935614 0.036695 0.0001565 -0.8394338 0.0397676 0.0050676 -0.9028657 0.0564456 0.0277111 -0.9352348 0.0848308 0.0621943 -0.9544418 0.1231132 0.1057322 -0.9668714 0.1700994 0.1569971 -0.9753721 0.2246189 0.2148987 -0.9814076 0.2852724 0.2781701 -0.9858079 0.3503562 0.3452442 -0.9890781 0.4179095 0.4142845 -0.9915433 0.4858501 0.4833171 -0.9934218 0.55216 0.550415 -0.9948649 0.6150716 0.6138855 -0.9959804 0.6732097 0.6724135 -0.996847 0.7256635 0.7251351 -0.9975227 0.7719847 0.7716375 -0.9980511 0.812127 0.8119009 -0.9984652 0.8463535 0.8462073 -0.9987904 0.8751352 0.8750412 -0.9990461 0.8990586 0.8989986 -0.9992474 0.918753 0.9187148 -0.999406 0.9348377 0.9348135 -0.999531 0.9478896 0.9478743 -0.9996296 0.9584249 0.9584153 -0.9997074 0.9668929 0.9668869 -0.9997689 0.9736762 0.9736723 -0.9998174 0.9790949 0.9790925 -0.9998557 0.9834143 0.9834128 -0.999886 0.9868514 0.9868504 -0.9999099 0.9895826 0.989582 -0.9999288 0.9917504 0.9917501 -0.9999437 0.9934697 0.9934695 -0.0000238 0.0506267 0.0030742 -0.0000382 0.0501232 0.0025707 -0.0000611 0.049491 0.0019385 -0.0000978 0.0486989 0.0011463 -0.0001565 0.047709 0.0001565 -0.001483 0.047709 0.0001565 -0.0031613 0.047709 0.0001565 -0.0052846 0.047709 0.0001565 -0.0079707 0.047709 0.0001565 -0.0113691 0.047709 0.0001565 -0.0156685 0.047709 0.0001565 -0.0211078 0.047709 0.0001565 -0.0279891 0.047709 0.0001565 -0.036695 0.047709 0.0001565 -0.047709 0.047709 0.0001565 -0.0616432 0.047709 0.0001565 -0.0792718 0.047709 0.0001565 -0.1015742 0.047709 0.0001565 -0.1297896 0.047709 0.0001565 -0.1654858 0.047709 0.0001565 -0.2106462 0.047709 0.0001565 -0.2677799 0.047709 0.0001565 -0.3400615 0.047709 0.0001565 -0.4315072 0.047709 0.0001565 -0.5471978 0.047709 0.0001565 -0.6935614 0.047709 0.0001565 -0.8394338 0.0502275 0.0050676 -0.9028657 0.0651072 0.0277111 -0.9352348 0.0916543 0.0621943 -0.9544418 0.1283525 0.1057322 -0.9668714 0.1740488 0.1569971 -0.9753721 0.2275489 0.2148987 -0.9814076 0.2874132 0.2781701 -0.9858079 0.3518972 0.3452442 -0.9890781 0.4190022 0.4142845 -0.9915433 0.4866137 0.4833171 -0.9934218 0.552686 0.550415 -0.9948649 0.6154291 0.6138855 -0.9959804 0.6734497 0.6724135 -0.996847 0.7258228 0.7251351 -0.9975227 0.7720893 0.7716375 -0.9980511 0.8121952 0.8119009 -0.9984652 0.8463976 0.8462073 -0.9987904 0.8751635 0.8750412 -0.9990461 0.8990767 0.8989986 -0.9992474 0.9187645 0.9187148 -0.999406 0.934845 0.9348135 -0.999531 0.9478942 0.9478743 -0.9996296 0.9584278 0.9584153 -0.9997074 0.9668948 0.9668869 -0.9997689 0.9736773 0.9736723 -0.9998174 0.9790957 0.9790925 -0.9998557 0.9834148 0.9834128 -0.999886 0.9868517 0.9868504 -0.9999099 0.9895827 0.989582 -0.9999288 0.9917505 0.9917501 -0.9999437 0.9934698 0.9934695 -0.0000238 0.0645609 0.0030742 -0.0000382 0.0640574 0.0025707 -0.0000611 0.0634252 0.0019385 -0.0000978 0.0626331 0.0011463 -0.0001565 0.0616432 0.0001565 -0.001483 0.0616432 0.0001565 -0.0031613 0.0616432 0.0001565 -0.0052846 0.0616432 0.0001565 -0.0079707 0.0616432 0.0001565 -0.0113691 0.0616432 0.0001565 -0.0156685 0.0616432 0.0001565 -0.0211078 0.0616432 0.0001565 -0.0279891 0.0616432 0.0001565 -0.036695 0.0616432 0.0001565 -0.047709 0.0616432 0.0001565 -0.0616432 0.0616432 0.0001565 -0.0792718 0.0616432 0.0001565 -0.1015742 0.0616432 0.0001565 -0.1297896 0.0616432 0.0001565 -0.1654858 0.0616432 0.0001565 -0.2106462 0.0616432 0.0001565 -0.2677799 0.0616432 0.0001565 -0.3400615 0.0616432 0.0001565 -0.4315072 0.0616432 0.0001565 -0.5471978 0.0616432 0.0001565 -0.6935614 0.0616432 0.0001565 -0.8394338 0.0634605 0.0050676 -0.9028657 0.0760653 0.0277111 -0.9352348 0.1002868 0.0621943 -0.9544418 0.1349809 0.1057322 -0.9668714 0.1790454 0.1569971 -0.9753721 0.2312557 0.2148987 -0.9814076 0.2901217 0.2781701 -0.9858079 0.3538467 0.3452442 -0.9890781 0.4203847 0.4142845 -0.9915433 0.4875796 0.4833171 -0.9934218 0.5533515 0.550415 -0.9948649 0.6158814 0.6138855 -0.9959804 0.6737533 0.6724135 -0.996847 0.7260243 0.7251351 -0.9975227 0.7722218 0.7716375 -0.9980511 0.8122814 0.8119009 -0.9984652 0.8464534 0.8462073 -0.9987904 0.8751993 0.8750412 -0.9990461 0.8990996 0.8989986 -0.9992474 0.918779 0.9187148 -0.999406 0.9348542 0.9348135 -0.999531 0.9479 0.9478743 -0.9996296 0.9584315 0.9584153 -0.9997074 0.9668971 0.9668869 -0.9997689 0.9736788 0.9736723 -0.9998174 0.9790966 0.9790925 -0.9998557 0.9834153 0.9834128 -0.999886 0.986852 0.9868504 -0.9999099 0.989583 0.989582 -0.9999288 0.9917507 0.9917501 -0.9999437 0.9934699 0.9934695 -0.0000238 0.0821895 0.0030742 -0.0000382 0.081686 0.0025707 -0.0000611 0.0810538 0.0019385 -0.0000978 0.0802616 0.0011463 -0.0001565 0.0792718 0.0001565 -0.001483 0.0792718 0.0001565 -0.0031613 0.0792718 0.0001565 -0.0052846 0.0792718 0.0001565 -0.0079707 0.0792718 0.0001565 -0.0113691 0.0792718 0.0001565 -0.0156685 0.0792718 0.0001565 -0.0211078 0.0792718 0.0001565 -0.0279891 0.0792718 0.0001565 -0.036695 0.0792718 0.0001565 -0.047709 0.0792718 0.0001565 -0.0616432 0.0792718 0.0001565 -0.0792718 0.0792718 0.0001565 -0.1015742 0.0792718 0.0001565 -0.1297896 0.0792718 0.0001565 -0.1654858 0.0792718 0.0001565 -0.2106462 0.0792718 0.0001565 -0.2677799 0.0792718 0.0001565 -0.3400615 0.0792718 0.0001565 -0.4315072 0.0792718 0.0001565 -0.5471978 0.0792718 0.0001565 -0.6935614 0.0792718 0.0001565 -0.8394338 0.080202 0.0050676 -0.9028657 0.0899287 0.0277111 -0.9352348 0.1112082 0.0621943 -0.9544418 0.1433666 0.1057322 -0.9668714 0.1853668 0.1569971 -0.9753721 0.2359454 0.2148987 -0.9814076 0.2935483 0.2781701 -0.9858079 0.3563131 0.3452442 -0.9890781 0.4221336 0.4142845 -0.9915433 0.4888018 0.4833171 -0.9934218 0.5541934 0.550415 -0.9948649 0.6164537 0.6138855 -0.9959804 0.6741374 0.6724135 -0.996847 0.7262792 0.7251351 -0.9975227 0.7723893 0.7716375 -0.9980511 0.8123905 0.8119009 -0.9984652 0.8465239 0.8462073 -0.9987904 0.8752446 0.8750412 -0.9990461 0.8991285 0.8989986 -0.9992474 0.9187975 0.9187148 -0.999406 0.9348659 0.9348135 -0.999531 0.9479074 0.9478743 -0.9996296 0.9584362 0.9584153 -0.9997074 0.9669 0.9668869 -0.9997689 0.9736806 0.9736723 -0.9998174 0.9790977 0.9790925 -0.9998557 0.9834161 0.9834128 -0.999886 0.9868525 0.9868504 -0.9999099 0.9895832 0.989582 -0.9999288 0.9917509 0.9917501 -0.9999437 0.99347 0.9934695 -0.0000238 0.1044919 0.0030742 -0.0000382 0.1039884 0.0025707 -0.0000611 0.1033562 0.0019385 -0.0000978 0.102564 0.0011463 -0.0001565 0.1015742 0.0001565 -0.001483 0.1015742 0.0001565 -0.0031613 0.1015742 0.0001565 -0.0052846 0.1015742 0.0001565 -0.0079707 0.1015742 0.0001565 -0.0113691 0.1015742 0.0001565 -0.0156685 0.1015742 0.0001565 -0.0211078 0.1015742 0.0001565 -0.0279891 0.1015742 0.0001565 -0.036695 0.1015742 0.0001565 -0.047709 0.1015742 0.0001565 -0.0616432 0.1015742 0.0001565 -0.0792718 0.1015742 0.0001565 -0.1015742 0.1015742 0.0001565 -0.1297896 0.1015742 0.0001565 -0.1654858 0.1015742 0.0001565 -0.2106462 0.1015742 0.0001565 -0.2677799 0.1015742 0.0001565 -0.3400615 0.1015742 0.0001565 -0.4315072 0.1015742 0.0001565 -0.5471978 0.1015742 0.0001565 -0.6935614 0.1015742 0.0001565 -0.8394338 0.1013822 0.0050676 -0.9028657 0.1074677 0.0277111 -0.9352348 0.125025 0.0621943 -0.9544418 0.1539757 0.1057322 -0.9668714 0.1933641 0.1569971 -0.9753721 0.2418784 0.2148987 -0.9814076 0.2978834 0.2781701 -0.9858079 0.3594334 0.3452442 -0.9890781 0.4243463 0.4142845 -0.9915433 0.4903479 0.4833171 -0.9934218 0.5552585 0.550415 -0.9948649 0.6171776 0.6138855 -0.9959804 0.6746233 0.6724135 -0.996847 0.7266018 0.7251351 -0.9975227 0.7726012 0.7716375 -0.9980511 0.8125286 0.8119009 -0.9984652 0.8466132 0.8462073 -0.9987904 0.875302 0.8750412 -0.9990461 0.8991652 0.8989986 -0.9992474 0.9188208 0.9187148 -0.999406 0.9348807 0.9348135 -0.999531 0.9479168 0.9478743 -0.9996296 0.9584421 0.9584153 -0.9997074 0.9669037 0.9668869 -0.9997689 0.9736829 0.9736723 -0.9998174 0.9790992 0.9790925 -0.9998557 0.983417 0.9834128 -0.999886 0.986853 0.9868504 -0.9999099 0.9895836 0.989582 -0.9999288 0.9917511 0.9917501 -0.9999437 0.9934701 0.9934695 -0.0000238 0.1327073 0.0030742 -0.0000382 0.1322038 0.0025707 -0.0000611 0.1315716 0.0019385 -0.0000978 0.1307795 0.0011463 -0.0001565 0.1297896 0.0001565 -0.001483 0.1297896 0.0001565 -0.0031613 0.1297896 0.0001565 -0.0052846 0.1297896 0.0001565 -0.0079707 0.1297896 0.0001565 -0.0113691 0.1297896 0.0001565 -0.0156685 0.1297896 0.0001565 -0.0211078 0.1297896 0.0001565 -0.0279891 0.1297896 0.0001565 -0.036695 0.1297896 0.0001565 -0.047709 0.1297896 0.0001565 -0.0616432 0.1297896 0.0001565 -0.0792718 0.1297896 0.0001565 -0.1015742 0.1297896 0.0001565 -0.1297896 0.1297896 0.0001565 -0.1654858 0.1297896 0.0001565 -0.2106462 0.1297896 0.0001565 -0.2677799 0.1297896 0.0001565 -0.3400615 0.1297896 0.0001565 -0.4315072 0.1297896 0.0001565 -0.5471978 0.1297896 0.0001565 -0.6935614 0.1297896 0.0001565 -0.8394338 0.128178 0.0050676 -0.9028657 0.1296569 0.0277111 -0.9352348 0.1425052 0.0621943 -0.9544418 0.1673975 0.1057322 -0.9668714 0.2034818 0.1569971 -0.9753721 0.2493844 0.2148987 -0.9814076 0.3033679 0.2781701 -0.9858079 0.363381 0.3452442 -0.9890781 0.4271456 0.4142845 -0.9915433 0.4923039 0.4833171 -0.9934218 0.5566061 0.550415 -0.9948649 0.6180935 0.6138855 -0.9959804 0.6752381 0.6724135 -0.996847 0.7270098 0.7251351 -0.9975227 0.7728693 0.7716375 -0.9980511 0.8127032 0.8119009 -0.9984652 0.8467261 0.8462073 -0.9987904 0.8753745 0.8750412 -0.9990461 0.8992115 0.8989986 -0.9992474 0.9188503 0.9187148 -0.999406 0.9348994 0.9348135 -0.999531 0.9479286 0.9478743 -0.9996296 0.9584495 0.9584153 -0.9997074 0.9669084 0.9668869 -0.9997689 0.9736859 0.9736723 -0.9998174 0.979101 0.9790925 -0.9998557 0.9834182 0.9834128 -0.999886 0.9868538 0.9868504 -0.9999099 0.9895841 0.989582 -0.9999288 0.9917514 0.9917501 -0.9999437 0.9934703 0.9934695 -0.0000238 0.1684036 0.0030742 -0.0000382 0.1679 0.0025707 -0.0000611 0.1672678 0.0019385 -0.0000978 0.1664757 0.0011463 -0.0001565 0.1654858 0.0001565 -0.001483 0.1654858 0.0001565 -0.0031613 0.1654858 0.0001565 -0.0052846 0.1654858 0.0001565 -0.0079707 0.1654858 0.0001565 -0.0113691 0.1654858 0.0001565 -0.0156685 0.1654858 0.0001565 -0.0211078 0.1654858 0.0001565 -0.0279891 0.1654858 0.0001565 -0.036695 0.1654858 0.0001565 -0.047709 0.1654858 0.0001565 -0.0616432 0.1654858 0.0001565 -0.0792718 0.1654858 0.0001565 -0.1015742 0.1654858 0.0001565 -0.1297896 0.1654858 0.0001565 -0.1654858 0.1654858 0.0001565 -0.2106462 0.1654858 0.0001565 -0.2677799 0.1654858 0.0001565 -0.3400615 0.1654858 0.0001565 -0.4315072 0.1654858 0.0001565 -0.5471978 0.1654858 0.0001565 -0.6935614 0.1654858 0.0001565 -0.8394338 0.162078 0.0050676 -0.9028657 0.157729 0.0277111 -0.9352348 0.1646199 0.0621943 -0.9544418 0.1843779 0.1057322 -0.9668714 0.2162819 0.1569971 -0.9753721 0.2588805 0.2148987 -0.9814076 0.3103064 0.2781701 -0.9858079 0.3683752 0.3452442 -0.9890781 0.430687 0.4142845 -0.9915433 0.4947786 0.4833171 -0.9934218 0.5583108 0.550415 -0.9948649 0.6192522 0.6138855 -0.9959804 0.6760159 0.6724135 -0.996847 0.7275261 0.7251351 -0.9975227 0.7732085 0.7716375 -0.9980511 0.8129242 0.8119009 -0.9984652 0.8468689 0.8462073 -0.9987904 0.8754663 0.8750412 -0.9990461 0.8992702 0.8989986 -0.9992474 0.9188876 0.9187148 -0.999406 0.934923 0.9348135 -0.999531 0.9479435 0.9478743 -0.9996296 0.9584589 0.9584153 -0.9997074 0.9669144 0.9668869 -0.9997689 0.9736896 0.9736723 -0.9998174 0.9791034 0.9790925 -0.9998557 0.9834196 0.9834128 -0.999886 0.9868547 0.9868504 -0.9999099 0.9895846 0.989582 -0.9999288 0.9917517 0.9917501 -0.9999437 0.9934705 0.9934695 -0.0000238 0.2135639 0.0030742 -0.0000382 0.2130604 0.0025707 -0.0000611 0.2124282 0.0019385 -0.0000978 0.2116361 0.0011463 -0.0001565 0.2106462 0.0001565 -0.001483 0.2106462 0.0001565 -0.0031613 0.2106462 0.0001565 -0.0052846 0.2106462 0.0001565 -0.0079707 0.2106462 0.0001565 -0.0113691 0.2106462 0.0001565 -0.0156685 0.2106462 0.0001565 -0.0211078 0.2106462 0.0001565 -0.0279891 0.2106462 0.0001565 -0.036695 0.2106462 0.0001565 -0.047709 0.2106462 0.0001565 -0.0616432 0.2106462 0.0001565 -0.0792718 0.2106462 0.0001565 -0.1015742 0.2106462 0.0001565 -0.1297896 0.2106462 0.0001565 -0.1654858 0.2106462 0.0001565 -0.2106462 0.2106462 0.0001565 -0.2677799 0.2106462 0.0001565 -0.3400615 0.2106462 0.0001565 -0.4315072 0.2106462 0.0001565 -0.5471978 0.2106462 0.0001565 -0.6935614 0.2106462 0.0001565 -0.8394338 0.204966 0.0050676 -0.9028657 0.1932439 0.0277111 -0.9352348 0.1925979 0.0621943 -0.9544418 0.2058603 0.1057322 -0.9668714 0.2324758 0.1569971 -0.9753721 0.2708943 0.2148987 -0.9814076 0.3190846 0.2781701 -0.9858079 0.3746936 0.3452442 -0.9890781 0.4351674 0.4142845 -0.9915433 0.4979093 0.4833171 -0.9934218 0.5604676 0.550415 -0.9948649 0.6207181 0.6138855 -0.9959804 0.677 0.6724135 -0.996847 0.7281792 0.7251351 -0.9975227 0.7736377 0.7716375 -0.9980511 0.8132037 0.8119009 -0.9984652 0.8470496 0.8462073 -0.9987904 0.8755823 0.8750412 -0.9990461 0.8993443 0.8989986 -0.9992474 0.9189348 0.9187148 -0.999406 0.934953 0.9348135 -0.999531 0.9479624 0.9478743 -0.9996296 0.9584709 0.9584153 -0.9997074 0.9669219 0.9668869 -0.9997689 0.9736943 0.9736723 -0.9998174 0.9791064 0.9790925 -0.9998557 0.9834215 0.9834128 -0.999886 0.9868559 0.9868504 -0.9999099 0.9895854 0.989582 -0.9999288 0.9917522 0.9917501 -0.9999437 0.9934708 0.9934695 -0.0000238 0.2706977 0.0030742 -0.0000382 0.2701941 0.0025707 -0.0000611 0.2695619 0.0019385 -0.0000978 0.2687698 0.0011463 -0.0001565 0.2677799 0.0001565 -0.001483 0.2677799 0.0001565 -0.0031613 0.2677799 0.0001565 -0.0052846 0.2677799 0.0001565 -0.0079707 0.2677799 0.0001565 -0.0113691 0.2677799 0.0001565 -0.0156685 0.2677799 0.0001565 -0.0211078 0.2677799 0.0001565 -0.0279891 0.2677799 0.0001565 -0.036695 0.2677799 0.0001565 -0.047709 0.2677799 0.0001565 -0.0616432 0.2677799 0.0001565 -0.0792718 0.2677799 0.0001565 -0.1015742 0.2677799 0.0001565 -0.1297896 0.2677799 0.0001565 -0.1654858 0.2677799 0.0001565 -0.2106462 0.2677799 0.0001565 -0.2677799 0.2677799 0.0001565 -0.3400615 0.2677799 0.0001565 -0.4315072 0.2677799 0.0001565 -0.5471978 0.2677799 0.0001565 -0.6935614 0.2677799 0.0001565 -0.8394338 0.2592249 0.0050676 -0.9028657 0.2381749 0.0277111 -0.9352348 0.2279936 0.0621943 -0.9544418 0.2330383 0.1057322 -0.9668714 0.2529632 0.1569971 -0.9753721 0.2860933 0.2148987 -0.9814076 0.3301901 0.2781701 -0.9858079 0.3826871 0.3452442 -0.9890781 0.4408357 0.4142845 -0.9915433 0.5018701 0.4833171 -0.9934218 0.5631962 0.550415 -0.9948649 0.6225727 0.6138855 -0.9959804 0.6782449 0.6724135 -0.996847 0.7290054 0.7251351 -0.9975227 0.7741806 0.7716375 -0.9980511 0.8135573 0.8119009 -0.9984652 0.8472782 0.8462073 -0.9987904 0.8757292 0.8750412 -0.9990461 0.8994382 0.8989986 -0.9992474 0.9189945 0.9187148 -0.999406 0.9349908 0.9348135 -0.999531 0.9479864 0.9478743 -0.9996296 0.958486 0.9584153 -0.9997074 0.9669314 0.9668869 -0.9997689 0.9737003 0.9736723 -0.9998174 0.9791101 0.9790925 -0.9998557 0.9834238 0.9834128 -0.999886 0.9868573 0.9868504 -0.9999099 0.9895863 0.989582 -0.9999288 0.9917528 0.9917501 -0.9999437 0.9934712 0.9934695 -0.0000238 0.3429792 0.0030742 -0.0000382 0.3424757 0.0025707 -0.0000611 0.3418435 0.0019385 -0.0000978 0.3410514 0.0011463 -0.0001565 0.3400615 0.0001565 -0.001483 0.3400615 0.0001565 -0.0031613 0.3400615 0.0001565 -0.0052846 0.3400615 0.0001565 -0.0079707 0.3400615 0.0001565 -0.0113691 0.3400615 0.0001565 -0.0156685 0.3400615 0.0001565 -0.0211078 0.3400615 0.0001565 -0.0279891 0.3400615 0.0001565 -0.036695 0.3400615 0.0001565 -0.047709 0.3400615 0.0001565 -0.0616432 0.3400615 0.0001565 -0.0792718 0.3400615 0.0001565 -0.1015742 0.3400615 0.0001565 -0.1297896 0.3400615 0.0001565 -0.1654858 0.3400615 0.0001565 -0.2106462 0.3400615 0.0001565 -0.2677799 0.3400615 0.0001565 -0.3400615 0.3400615 0.0001565 -0.4315072 0.3400615 0.0001565 -0.5471978 0.3400615 0.0001565 -0.6935614 0.3400615 0.0001565 -0.8394338 0.3278694 0.0050676 -0.9028657 0.2950184 0.0277111 -0.9352348 0.2727739 0.0621943 -0.9544418 0.267422 0.1057322 -0.9668714 0.2788823 0.1569971 -0.9753721 0.305322 0.2148987 -0.9814076 0.3442401 0.2781701 -0.9858079 0.3928 0.3452442 -0.9890781 0.4480069 0.4142845 -0.9915433 0.5068811 0.4833171 -0.9934218 0.5666483 0.550415 -0.9948649 0.624919 0.6138855 -0.9959804 0.6798198 0.6724135 -0.996847 0.7300507 0.7251351 -0.9975227 0.7748674 0.7716375 -0.9980511 0.8140047 0.8119009 -0.9984652 0.8475675 0.8462073 -0.9987904 0.875915 0.8750412 -0.9990461 0.8995569 0.8989986 -0.9992474 0.91907 0.9187148 -0.999406 0.9350387 0.9348135 -0.999531 0.9480166 0.9478743 -0.9996296 0.9585051 0.9584153 -0.9997074 0.9669434 0.9668869 -0.9997689 0.9737079 0.9736723 -0.9998174 0.9791148 0.9790925 -0.9998557 0.9834268 0.9834128 -0.999886 0.9868592 0.9868504 -0.9999099 0.9895874 0.989582 -0.9999288 0.9917535 0.9917501 -0.9999437 0.9934716 0.9934695 -0.0000238 0.4344249 0.0030742 -0.0000382 0.4339214 0.0025707 -0.0000611 0.4332891 0.0019385 -0.0000978 0.432497 0.0011463 -0.0001565 0.4315072 0.0001565 -0.001483 0.4315072 0.0001565 -0.0031613 0.4315072 0.0001565 -0.0052846 0.4315072 0.0001565 -0.0079707 0.4315072 0.0001565 -0.0113691 0.4315072 0.0001565 -0.0156685 0.4315072 0.0001565 -0.0211078 0.4315072 0.0001565 -0.0279891 0.4315072 0.0001565 -0.036695 0.4315072 0.0001565 -0.047709 0.4315072 0.0001565 -0.0616432 0.4315072 0.0001565 -0.0792718 0.4315072 0.0001565 -0.1015742 0.4315072 0.0001565 -0.1297896 0.4315072 0.0001565 -0.1654858 0.4315072 0.0001565 -0.2106462 0.4315072 0.0001565 -0.2677799 0.4315072 0.0001565 -0.3400615 0.4315072 0.0001565 -0.4315072 0.4315072 0.0001565 -0.5471978 0.4315072 0.0001565 -0.6935614 0.4315072 0.0001565 -0.8394338 0.4147137 0.0050676 -0.9028657 0.3669329 0.0277111 -0.9352348 0.3294267 0.0621943 -0.9544418 0.3109219 0.1057322 -0.9668714 0.3116735 0.1569971 -0.9753721 0.3296489 0.2148987 -0.9814076 0.3620151 0.2781701 -0.9858079 0.405594 0.3452442 -0.9890781 0.4570793 0.4142845 -0.9915433 0.5132206 0.4833171 -0.9934218 0.5710156 0.550415 -0.9948649 0.6278874 0.6138855 -0.9959804 0.6818124 0.6724135 -0.996847 0.7313732 0.7251351 -0.9975227 0.7757364 0.7716375 -0.9980511 0.8145707 0.8119009 -0.9984652 0.8479334 0.8462073 -0.9987904 0.8761501 0.8750412 -0.9990461 0.8997072 0.8989986 -0.9992474 0.9191656 0.9187148 -0.999406 0.9350993 0.9348135 -0.999531 0.9480549 0.9478743 -0.9996296 0.9585292 0.9584153 -0.9997074 0.9669586 0.9668869 -0.9997689 0.9737174 0.9736723 -0.9998174 0.9791208 0.9790925 -0.9998557 0.9834306 0.9834128 -0.999886 0.9868616 0.9868504 -0.9999099 0.9895889 0.989582 -0.9999288 0.9917544 0.9917501 -0.9999437 0.9934722 0.9934695 -0.0000238 0.5501155 0.0030742 -0.0000382 0.549612 0.0025707 -0.0000611 0.5489798 0.0019385 -0.0000978 0.5481876 0.0011463 -0.0001565 0.5471978 0.0001565 -0.001483 0.5471978 0.0001565 -0.0031613 0.5471978 0.0001565 -0.0052846 0.5471978 0.0001565 -0.0079707 0.5471978 0.0001565 -0.0113691 0.5471978 0.0001565 -0.0156685 0.5471978 0.0001565 -0.0211078 0.5471978 0.0001565 -0.0279891 0.5471978 0.0001565 -0.036695 0.5471978 0.0001565 -0.047709 0.5471978 0.0001565 -0.0616432 0.5471978 0.0001565 -0.0792718 0.5471978 0.0001565 -0.1015742 0.5471978 0.0001565 -0.1297896 0.5471978 0.0001565 -0.1654858 0.5471978 0.0001565 -0.2106462 0.5471978 0.0001565 -0.2677799 0.5471978 0.0001565 -0.3400615 0.5471978 0.0001565 -0.4315072 0.5471978 0.0001565 -0.5471978 0.5471978 0.0001565 -0.6935614 0.5471978 0.0001565 -0.8394338 0.524583 0.0050676 -0.9028657 0.457914 0.0277111 -0.9352348 0.4010999 0.0621943 -0.9544418 0.3659549 0.1057322 -0.9668714 0.3531585 0.1569971 -0.9753721 0.3604255 0.2148987 -0.9814076 0.3845027 0.2781701 -0.9858079 0.4217802 0.3452442 -0.9890781 0.4685571 0.4142845 -0.9915433 0.5212409 0.4833171 -0.9934218 0.5765407 0.550415 -0.9948649 0.6316428 0.6138855 -0.9959804 0.6843332 0.6724135 -0.996847 0.7330463 0.7251351 -0.9975227 0.7768358 0.7716375 -0.9980511 0.8152868 0.8119009 -0.9984652 0.8483964 0.8462073 -0.9987904 0.8764475 0.8750412 -0.9990461 0.8998972 0.8989986 -0.9992474 0.9192865 0.9187148 -0.999406 0.935176 0.9348135 -0.999531 0.9481034 0.9478743 -0.9996296 0.9585598 0.9584153 -0.9997074 0.9669778 0.9668869 -0.9997689 0.9737295 0.9736723 -0.9998174 0.9791284 0.9790925 -0.9998557 0.9834353 0.9834128 -0.999886 0.9868645 0.9868504 -0.9999099 0.9895908 0.989582 -0.9999288 0.9917556 0.9917501 -0.9999437 0.9934729 0.9934695 -0.0000238 0.6964791 0.0030742 -0.0000382 0.6959756 0.0025707 -0.0000611 0.6953434 0.0019385 -0.0000978 0.6945513 0.0011463 -0.0001565 0.6935614 0.0001565 -0.001483 0.6935614 0.0001565 -0.0031613 0.6935614 0.0001565 -0.0052846 0.6935614 0.0001565 -0.0079707 0.6935614 0.0001565 -0.0113691 0.6935614 0.0001565 -0.0156685 0.6935614 0.0001565 -0.0211078 0.6935614 0.0001565 -0.0279891 0.6935614 0.0001565 -0.036695 0.6935614 0.0001565 -0.047709 0.6935614 0.0001565 -0.0616432 0.6935614 0.0001565 -0.0792718 0.6935614 0.0001565 -0.1015742 0.6935614 0.0001565 -0.1297896 0.6935614 0.0001565 -0.1654858 0.6935614 0.0001565 -0.2106462 0.6935614 0.0001565 -0.2677799 0.6935614 0.0001565 -0.3400615 0.6935614 0.0001565 -0.4315072 0.6935614 0.0001565 -0.5471978 0.6935614 0.0001565 -0.6935614 0.6935614 0.0001565 -0.8394338 0.663582 0.0050676 -0.9028657 0.573017 0.0277111 -0.9352348 0.4917758 0.0621943 -0.9544418 0.4355789 0.1057322 -0.9668714 0.4056424 0.1569971 -0.9753721 0.399362 0.2148987 -0.9814076 0.4129526 0.2781701 -0.9858079 0.4422578 0.3452442 -0.9890781 0.483078 0.4142845 -0.9915433 0.5313876 0.4833171 -0.9934218 0.5835308 0.550415 -0.9948649 0.6363938 0.6138855 -0.9959804 0.6875223 0.6724135 -0.996847 0.735163 0.7251351 -0.9975227 0.7782266 0.7716375 -0.9980511 0.8161928 0.8119009 -0.9984652 0.848982 0.8462073 -0.9987904 0.8768238 0.8750412 -0.9990461 0.9001376 0.8989986 -0.9992474 0.9194395 0.9187148 -0.999406 0.935273 0.9348135 -0.999531 0.9481647 0.9478743 -0.9996296 0.9585984 0.9584153 -0.9997074 0.9670022 0.9668869 -0.9997689 0.9737448 0.9736723 -0.9998174 0.979138 0.9790925 -0.9998557 0.9834413 0.9834128 -0.999886 0.9868683 0.9868504 -0.9999099 0.9895932 0.989582 -0.9999288 0.9917571 0.9917501 -0.9999437 0.9934739 0.9934695 -0.0051514 0.8407292 0.0080424 -0.0051286 0.8405071 0.0075296 -0.0051047 0.8402274 0.0068855 -0.0050826 0.8398756 0.0060778 -0.0050676 0.8394338 0.0050676 -0.0063275 0.8394338 0.0050676 -0.0079213 0.8394338 0.0050676 -0.0099377 0.8394338 0.0050676 -0.0124887 0.8394338 0.0050676 -0.0157161 0.8394338 0.0050676 -0.0197991 0.8394338 0.0050676 -0.0249647 0.8394338 0.0050676 -0.0314998 0.8394338 0.0050676 -0.0397676 0.8394338 0.0050676 -0.0502275 0.8394338 0.0050676 -0.0634605 0.8394338 0.0050676 -0.080202 0.8394338 0.0050676 -0.1013822 0.8394338 0.0050676 -0.128178 0.8394338 0.0050676 -0.162078 0.8394338 0.0050676 -0.204966 0.8394338 0.0050676 -0.2592249 0.8394338 0.0050676 -0.3278694 0.8394338 0.0050676 -0.4147137 0.8394338 0.0050676 -0.524583 0.8394338 0.0050676 -0.663582 0.8394338 0.0050676 -0.8394338 0.8394338 0.0050676 -0.9028657 0.7186372 0.0277111 -0.9352348 0.6064926 0.0621943 -0.9544418 0.5236622 0.1057322 -0.9668714 0.4720415 0.1569971 -0.9753721 0.4486216 0.2148987 -0.9814076 0.4489453 0.2781701 -0.9858079 0.4681646 0.3452442 -0.9890781 0.5014489 0.4142845 -0.9915433 0.5442245 0.4833171 -0.9934218 0.5923741 0.550415 -0.9948649 0.6424045 0.6138855 -0.9959804 0.6915571 0.6724135 -0.996847 0.7378409 0.7251351 -0.9975227 0.7799862 0.7716375 -0.9980511 0.8173389 0.8119009 -0.9984652 0.849723 0.8462073 -0.9987904 0.8772998 0.8750412 -0.9990461 0.9004418 0.8989986 -0.9992474 0.919633 0.9187148 -0.999406 0.9353956 0.9348135 -0.999531 0.9482423 0.9478743 -0.9996296 0.9586473 0.9584153 -0.9997074 0.9670329 0.9668869 -0.9997689 0.9737641 0.9736723 -0.9998174 0.9791502 0.9790925 -0.9998557 0.983449 0.9834128 -0.999886 0.9868731 0.9868504 -0.9999099 0.9895961 0.989582 -0.9999288 0.9917589 0.9917501 -0.9999437 0.993475 0.9934695 -0.0279321 0.9033413 0.0303251 -0.0278872 0.9032596 0.0298748 -0.0278347 0.9031567 0.0293089 -0.0277752 0.9030276 0.0285991 -0.0277111 0.9028657 0.0277111 -0.0287543 0.9028657 0.0277111 -0.0300741 0.9028657 0.0277111 -0.0317439 0.9028657 0.0277111 -0.0338564 0.9028657 0.0277111 -0.0365289 0.9028657 0.0277111 -0.03991 0.9028657 0.0277111 -0.0441875 0.9028657 0.0277111 -0.0495992 0.9028657 0.0277111 -0.0564456 0.9028657 0.0277111 -0.0651072 0.9028657 0.0277111 -0.0760653 0.9028657 0.0277111 -0.0899287 0.9028657 0.0277111 -0.1074677 0.9028657 0.0277111 -0.1296569 0.9028657 0.0277111 -0.157729 0.9028657 0.0277111 -0.1932439 0.9028657 0.0277111 -0.2381749 0.9028657 0.0277111 -0.2950184 0.9028657 0.0277111 -0.3669329 0.9028657 0.0277111 -0.457914 0.9028657 0.0277111 -0.573017 0.9028657 0.0277111 -0.7186372 0.9028657 0.0277111 -0.9028657 0.9028657 0.0277111 -0.9352348 0.7516243 0.0621943 -0.9544418 0.635099 0.1057322 -0.9668714 0.5560449 0.1569971 -0.9753721 0.5109415 0.2148987 -0.9814076 0.4944808 0.2781701 -0.9858079 0.5009401 0.3452442 -0.9890781 0.5246904 0.4142845 -0.9915433 0.5604649 0.4833171 -0.9934218 0.6035621 0.550415 -0.9948649 0.6500088 0.6138855 -0.9959804 0.6966615 0.6724135 -0.996847 0.7412287 0.7251351 -0.9975227 0.7822123 0.7716375 -0.9980511 0.8187889 0.8119009 -0.9984652 0.8506604 0.8462073 -0.9987904 0.877902 0.8750412 -0.9990461 0.9008267 0.8989986 -0.9992474 0.9198779 0.9187148 -0.999406 0.9355509 0.9348135 -0.999531 0.9483404 0.9478743 -0.9996296 0.9587092 0.9584153 -0.9997074 0.9670719 0.9668869 -0.9997689 0.9737886 0.9736723 -0.9998174 0.9791655 0.9790925 -0.9998557 0.9834586 0.9834128 -0.999886 0.9868791 0.9868504 -0.9999099 0.9895999 0.989582 -0.9999288 0.9917613 0.9917501 -0.9999437 0.9934765 0.9934695 -0.0624569 0.9354466 0.0643425 -0.0624063 0.9354101 0.0639724 -0.0623458 0.9353643 0.0635073 -0.0622749 0.9353068 0.062924 -0.0621943 0.9352348 0.0621943 -0.0630161 0.9352348 0.0621943 -0.0640558 0.9352348 0.0621943 -0.0653712 0.9352348 0.0621943 -0.0670354 0.9352348 0.0621943 -0.0691408 0.9352348 0.0621943 -0.0718043 0.9352348 0.0621943 -0.0751741 0.9352348 0.0621943 -0.0794373 0.9352348 0.0621943 -0.0848308 0.9352348 0.0621943 -0.0916543 0.9352348 0.0621943 -0.1002868 0.9352348 0.0621943 -0.1112082 0.9352348 0.0621943 -0.125025 0.9352348 0.0621943 -0.1425052 0.9352348 0.0621943 -0.1646199 0.9352348 0.0621943 -0.1925979 0.9352348 0.0621943 -0.2279936 0.9352348 0.0621943 -0.2727739 0.9352348 0.0621943 -0.3294267 0.9352348 0.0621943 -0.4010999 0.9352348 0.0621943 -0.4917758 0.9352348 0.0621943 -0.6064926 0.9352348 0.0621943 -0.7516243 0.9352348 0.0621943 -0.9352348 0.9352348 0.0621943 -0.9544418 0.7760811 0.1057322 -0.9668714 0.6623201 0.1569971 -0.9753721 0.5897842 0.2148987 -0.9814076 0.5520892 0.2781701 -0.9858079 0.5424054 0.3452442 -0.9890781 0.5540939 0.4142845 -0.9915433 0.5810111 0.4833171 -0.9934218 0.6177164 0.550415 -0.9948649 0.6596292 0.6138855 -0.9959804 0.7031193 0.6724135 -0.996847 0.7455148 0.7251351 -0.9975227 0.7850286 0.7716375 -0.9980511 0.8206233 0.8119009 -0.9984652 0.8518464 0.8462073 -0.9987904 0.8786638 0.8750412 -0.9990461 0.9013135 0.8989986 -0.9992474 0.9201876 0.9187148 -0.999406 0.9357472 0.9348135 -0.999531 0.9484645 0.9478743 -0.9996296 0.9587875 0.9584153 -0.9997074 0.9671212 0.9668869 -0.9997689 0.9738196 0.9736723 -0.9998174 0.979185 0.9790925 -0.9998557 0.9834708 0.9834128 -0.999886 0.9868868 0.9868504 -0.9999099 0.9896047 0.989582 -0.9999288 0.9917643 0.9917501 -0.9999437 0.9934784 0.9934695 -0.1059991 0.9545467 0.1074473 -0.1059489 0.9545286 0.1071517 -0.1058883 0.9545059 0.1067803 -0.1058162 0.9544774 0.1063147 -0.1057322 0.9544418 0.1057322 -0.1063632 0.9544418 0.1057322 -0.1071616 0.9544418 0.1057322 -0.1081716 0.9544418 0.1057322 -0.1094494 0.9544418 0.1057322 -0.1110659 0.9544418 0.1057322 -0.1131111 0.9544418 0.1057322 -0.1156985 0.9544418 0.1057322 -0.1189719 0.9544418 0.1057322 -0.1231132 0.9544418 0.1057322 -0.1283525 0.9544418 0.1057322 -0.1349809 0.9544418 0.1057322 -0.1433666 0.9544418 0.1057322 -0.1539757 0.9544418 0.1057322 -0.1673975 0.9544418 0.1057322 -0.1843779 0.9544418 0.1057322 -0.2058603 0.9544418 0.1057322 -0.2330383 0.9544418 0.1057322 -0.267422 0.9544418 0.1057322 -0.3109219 0.9544418 0.1057322 -0.3659549 0.9544418 0.1057322 -0.4355789 0.9544418 0.1057322 -0.5236622 0.9544418 0.1057322 -0.635099 0.9544418 0.1057322 -0.7760811 0.9544418 0.1057322 -0.9544418 0.9544418 0.1057322 -0.9668714 0.7967721 0.1569971 -0.9753721 0.6895306 0.2148987 -0.9814076 0.6249712 0.2781701 -0.9858079 0.5948644 0.3452442 -0.9890781 0.5912932 0.4142845 -0.9915433 0.6070046 0.4833171 -0.9934218 0.6356233 0.550415 -0.9948649 0.6718002 0.6138855 -0.9959804 0.7112892 0.6724135 -0.996847 0.7509373 0.7251351 -0.9975227 0.7885916 0.7716375 -0.9980511 0.8229441 0.8119009 -0.9984652 0.8533468 0.8462073 -0.9987904 0.8796277 0.8750412 -0.9990461 0.9019295 0.8989986 -0.9992474 0.9205795 0.9187148 -0.999406 0.9359957 0.9348135 -0.999531 0.9486216 0.9478743 -0.9996296 0.9588865 0.9584153 -0.9997074 0.9671835 0.9668869 -0.9997689 0.9738588 0.9736723 -0.9998174 0.9792096 0.9790925 -0.9998557 0.9834862 0.9834128 -0.999886 0.9868964 0.9868504 -0.9999099 0.9896108 0.989582 -0.9999288 0.9917681 0.9917501 -0.9999437 0.9934807 0.9934695 -0.1572498 0.9669269 0.1583419 -0.1572031 0.9669173 0.15811 -0.1571463 0.9669053 0.1578188 -0.1570779 0.9668902 0.1574537 -0.1569971 0.9668714 0.1569971 -0.1574728 0.9668714 0.1569971 -0.1580746 0.9668714 0.1569971 -0.158836 0.9668714 0.1569971 -0.1597992 0.9668714 0.1569971 -0.1610178 0.9668714 0.1569971 -0.1625595 0.9668714 0.1569971 -0.16451 0.9668714 0.1569971 -0.1669776 0.9668714 0.1569971 -0.1700994 0.9668714 0.1569971 -0.1740488 0.9668714 0.1569971 -0.1790454 0.9668714 0.1569971 -0.1853668 0.9668714 0.1569971 -0.1933641 0.9668714 0.1569971 -0.2034818 0.9668714 0.1569971 -0.2162819 0.9668714 0.1569971 -0.2324758 0.9668714 0.1569971 -0.2529632 0.9668714 0.1569971 -0.2788823 0.9668714 0.1569971 -0.3116735 0.9668714 0.1569971 -0.3531585 0.9668714 0.1569971 -0.4056424 0.9668714 0.1569971 -0.4720415 0.9668714 0.1569971 -0.5560449 0.9668714 0.1569971 -0.6623201 0.9668714 0.1569971 -0.7967721 0.9668714 0.1569971 -0.9668714 0.9668714 0.1569971 -0.9753721 0.8157227 0.2148987 -0.9814076 0.7171765 0.2781701 -0.9858079 0.6612318 0.3452442 -0.9890781 0.6383552 0.4142845 -0.9915433 0.6398899 0.4833171 -0.9934218 0.658278 0.550415 -0.9948649 0.6871982 0.6138855 -0.9959804 0.7216252 0.6724135 -0.996847 0.7577974 0.7251351 -0.9975227 0.7930993 0.7716375 -0.9980511 0.8258802 0.8119009 -0.9984652 0.8552449 0.8462073 -0.9987904 0.8808471 0.8750412 -0.9990461 0.9027087 0.8989986 -0.9992474 0.9210753 0.9187148 -0.999406 0.93631 0.9348135 -0.999531 0.9488203 0.9478743 -0.9996296 0.9590118 0.9584153 -0.9997074 0.9672624 0.9668869 -0.9997689 0.9739083 0.9736723 -0.9998174 0.9792407 0.9790925 -0.9998557 0.9835057 0.9834128 -0.999886 0.9869087 0.9868504 -0.9999099 0.9896184 0.989582 -0.9999288 0.9917729 0.9917501 -0.9999437 0.9934837 0.9934695 -0.2151269 0.9754027 0.2159373 -0.2150852 0.9753975 0.2157582 -0.2150342 0.9753908 0.2155333 -0.2149725 0.9753825 0.2152513 -0.2148987 0.9753721 0.2148987 -0.2152516 0.9753721 0.2148987 -0.2156981 0.9753721 0.2148987 -0.2162629 0.9753721 0.2148987 -0.2169775 0.9753721 0.2148987 -0.2178815 0.9753721 0.2148987 -0.2190253 0.9753721 0.2148987 -0.2204723 0.9753721 0.2148987 -0.2223029 0.9753721 0.2148987 -0.2246189 0.9753721 0.2148987 -0.2275489 0.9753721 0.2148987 -0.2312557 0.9753721 0.2148987 -0.2359454 0.9753721 0.2148987 -0.2418784 0.9753721 0.2148987 -0.2493844 0.9753721 0.2148987 -0.2588805 0.9753721 0.2148987 -0.2708943 0.9753721 0.2148987 -0.2860933 0.9753721 0.2148987 -0.305322 0.9753721 0.2148987 -0.3296489 0.9753721 0.2148987 -0.3604255 0.9753721 0.2148987 -0.399362 0.9753721 0.2148987 -0.4486216 0.9753721 0.2148987 -0.5109415 0.9753721 0.2148987 -0.5897842 0.9753721 0.2148987 -0.6895306 0.9753721 0.2148987 -0.8157227 0.9753721 0.2148987 -0.9753721 0.9753721 0.2148987 -0.9814076 0.8338281 0.2781701 -0.9858079 0.7451952 0.3452442 -0.9890781 0.6978947 0.4142845 -0.9915433 0.681494 0.4833171 -0.9934218 0.6869391 0.550415 -0.9948649 0.7066787 0.6138855 -0.9959804 0.7347016 0.6724135 -0.996847 0.7664763 0.7251351 -0.9975227 0.7988021 0.7716375 -0.9980511 0.8295948 0.8119009 -0.9984652 0.8576464 0.8462073 -0.9987904 0.8823899 0.8750412 -0.9990461 0.9036945 0.8989986 -0.9992474 0.9217025 0.9187148 -0.999406 0.9367077 0.9348135 -0.999531 0.9490716 0.9478743 -0.9996296 0.9591704 0.9584153 -0.9997074 0.9673622 0.9668869 -0.9997689 0.9739711 0.9736723 -0.9998174 0.9792801 0.9790925 -0.9998557 0.9835304 0.9834128 -0.999886 0.9869241 0.9868504 -0.9999099 0.9896281 0.989582 -0.9999288 0.991779 0.9917501 -0.9999437 0.9934875 0.9934695 -0.2783684 0.9814251 0.2789607 -0.2783325 0.9814221 0.2788244 -0.2782884 0.9814183 0.2786531 -0.2782347 0.9814136 0.2784385 -0.2781701 0.9814076 0.2781701 -0.2784279 0.9814076 0.2781701 -0.2787542 0.9814076 0.2781701 -0.2791669 0.9814076 0.2781701 -0.279689 0.9814076 0.2781701 -0.2803496 0.9814076 0.2781701 -0.2811853 0.9814076 0.2781701 -0.2822426 0.9814076 0.2781701 -0.2835801 0.9814076 0.2781701 -0.2852724 0.9814076 0.2781701 -0.2874132 0.9814076 0.2781701 -0.2901217 0.9814076 0.2781701 -0.2935483 0.9814076 0.2781701 -0.2978834 0.9814076 0.2781701 -0.3033679 0.9814076 0.2781701 -0.3103064 0.9814076 0.2781701 -0.3190846 0.9814076 0.2781701 -0.3301901 0.9814076 0.2781701 -0.3442401 0.9814076 0.2781701 -0.3620151 0.9814076 0.2781701 -0.3845027 0.9814076 0.2781701 -0.4129526 0.9814076 0.2781701 -0.4489453 0.9814076 0.2781701 -0.4944808 0.9814076 0.2781701 -0.5520892 0.9814076 0.2781701 -0.6249712 0.9814076 0.2781701 -0.7171765 0.9814076 0.2781701 -0.8338281 0.9814076 0.2781701 -0.9814076 0.9814076 0.2781701 -0.9858079 0.8514199 0.3452442 -0.9890781 0.7732199 0.4142845 -0.9915433 0.7341287 0.4833171 -0.9934218 0.7231991 0.550415 -0.9948649 0.731324 0.6138855 -0.9959804 0.7512449 0.6724135 -0.996847 0.7774563 0.7251351 -0.9975227 0.8060168 0.7716375 -0.9980511 0.8342942 0.8119009 -0.9984652 0.8606845 0.8462073 -0.9987904 0.8843416 0.8750412 -0.9990461 0.9049418 0.8989986 -0.9992474 0.9224961 0.9187148 -0.999406 0.9372107 0.9348135 -0.999531 0.9493896 0.9478743 -0.9996296 0.9593709 0.9584153 -0.9997074 0.9674884 0.9668869 -0.9997689 0.9740504 0.9736723 -0.9998174 0.9793299 0.9790925 -0.9998557 0.9835616 0.9834128 -0.999886 0.9869437 0.9868504 -0.9999099 0.9896404 0.989582 -0.9999288 0.9917866 0.9917501 -0.9999437 0.9934923 0.9934695 -0.3454107 0.9858181 0.3458371 -0.3453807 0.9858163 0.3457348 -0.3453439 0.9858141 0.3456064 -0.3452987 0.9858113 0.3454454 -0.3452442 0.9858079 0.3452442 -0.3454298 0.9858079 0.3452442 -0.3456646 0.9858079 0.3452442 -0.3459616 0.9858079 0.3452442 -0.3463375 0.9858079 0.3452442 -0.3468129 0.9858079 0.3452442 -0.3474144 0.9858079 0.3452442 -0.3481754 0.9858079 0.3452442 -0.3491382 0.9858079 0.3452442 -0.3503562 0.9858079 0.3452442 -0.3518972 0.9858079 0.3452442 -0.3538467 0.9858079 0.3452442 -0.3563131 0.9858079 0.3452442 -0.3594334 0.9858079 0.3452442 -0.363381 0.9858079 0.3452442 -0.3683752 0.9858079 0.3452442 -0.3746936 0.9858079 0.3452442 -0.3826871 0.9858079 0.3452442 -0.3928 0.9858079 0.3452442 -0.405594 0.9858079 0.3452442 -0.4217802 0.9858079 0.3452442 -0.4422578 0.9858079 0.3452442 -0.4681646 0.9858079 0.3452442 -0.5009401 0.9858079 0.3452442 -0.5424054 0.9858079 0.3452442 -0.5948644 0.9858079 0.3452442 -0.6612318 0.9858079 0.3452442 -0.7451952 0.9858079 0.3452442 -0.8514199 0.9858079 0.3452442 -0.9858079 0.9858079 0.3452442 -0.9890781 0.868516 0.4142845 -0.9915433 0.8007184 0.4833171 -0.9934218 0.7690727 0.550415 -0.9948649 0.7625036 0.6138855 -0.9959804 0.7721744 0.6724135 -0.996847 0.7913474 0.7251351 -0.9975227 0.8151444 0.7716375 -0.9980511 0.8402396 0.8119009 -0.9984652 0.8645282 0.8462073 -0.9987904 0.8868108 0.8750412 -0.9990461 0.9065197 0.8989986 -0.9992474 0.9235 0.9187148 -0.999406 0.9378472 0.9348135 -0.999531 0.949792 0.9478743 -0.9996296 0.9596246 0.9584153 -0.9997074 0.9676481 0.9668869 -0.9997689 0.9741508 0.9736723 -0.9998174 0.9793929 0.9790925 -0.9998557 0.9836012 0.9834128 -0.999886 0.9869685 0.9868504 -0.9999099 0.9896559 0.989582 -0.9999288 0.9917963 0.9917501 -0.9999437 0.9934984 0.9934695 -0.4144197 0.9890841 0.4147221 -0.4143955 0.9890831 0.4146466 -0.4143657 0.9890818 0.4145518 -0.414329 0.9890801 0.414433 -0.4142845 0.9890781 0.4142845 -0.4144161 0.9890781 0.4142845 -0.4145826 0.9890781 0.4142845 -0.4147933 0.9890781 0.4142845 -0.4150598 0.9890781 0.4142845 -0.4153969 0.9890781 0.4142845 -0.4158235 0.9890781 0.4142845 -0.4163631 0.9890781 0.4142845 -0.4170458 0.9890781 0.4142845 -0.4179095 0.9890781 0.4142845 -0.4190022 0.9890781 0.4142845 -0.4203847 0.9890781 0.4142845 -0.4221336 0.9890781 0.4142845 -0.4243463 0.9890781 0.4142845 -0.4271456 0.9890781 0.4142845 -0.430687 0.9890781 0.4142845 -0.4351674 0.9890781 0.4142845 -0.4408357 0.9890781 0.4142845 -0.4480069 0.9890781 0.4142845 -0.4570793 0.9890781 0.4142845 -0.4685571 0.9890781 0.4142845 -0.483078 0.9890781 0.4142845 -0.5014489 0.9890781 0.4142845 -0.5246904 0.9890781 0.4142845 -0.5540939 0.9890781 0.4142845 -0.5912932 0.9890781 0.4142845 -0.6383552 0.9890781 0.4142845 -0.6978947 0.9890781 0.4142845 -0.7732199 0.9890781 0.4142845 -0.868516 0.9890781 0.4142845 -0.9890781 0.9890781 0.4142845 -0.9915433 0.884963 0.4833171 -0.9934218 0.8271087 0.550415 -0.9948649 0.8019497 0.6138855 -0.9959804 0.7986529 0.6724135 -0.996847 0.8089215 0.7251351 -0.9975227 0.826692 0.7716375 -0.9980511 0.8477612 0.8119009 -0.9984652 0.8693909 0.8462073 -0.9987904 0.8899347 0.8750412 -0.9990461 0.9085159 0.8989986 -0.9992474 0.9247701 0.9187148 -0.999406 0.9386524 0.9348135 -0.999531 0.950301 0.9478743 -0.9996296 0.9599456 0.9584153 -0.9997074 0.9678502 0.9668869 -0.9997689 0.9742778 0.9736723 -0.9998174 0.9794726 0.9790925 -0.9998557 0.9836511 0.9834128 -0.999886 0.9869998 0.9868504 -0.9999099 0.9896755 0.989582 -0.9999288 0.9918086 0.9917501 -0.9999437 0.9935061 0.9934695 -0.4834235 0.9915469 0.4836348 -0.4834045 0.9915463 0.48358 -0.4833811 0.9915455 0.4835112 -0.4833522 0.9915446 0.4834249 -0.4833171 0.9915433 0.4833171 -0.483409 0.9915433 0.4833171 -0.4835254 0.9915433 0.4833171 -0.4836726 0.9915433 0.4833171 -0.4838588 0.9915433 0.4833171 -0.4840944 0.9915433 0.4833171 -0.4843924 0.9915433 0.4833171 -0.4847695 0.9915433 0.4833171 -0.4852466 0.9915433 0.4833171 -0.4858501 0.9915433 0.4833171 -0.4866137 0.9915433 0.4833171 -0.4875796 0.9915433 0.4833171 -0.4888018 0.9915433 0.4833171 -0.4903479 0.9915433 0.4833171 -0.4923039 0.9915433 0.4833171 -0.4947786 0.9915433 0.4833171 -0.4979093 0.9915433 0.4833171 -0.5018701 0.9915433 0.4833171 -0.5068811 0.9915433 0.4833171 -0.5132206 0.9915433 0.4833171 -0.5212409 0.9915433 0.4833171 -0.5313876 0.9915433 0.4833171 -0.5442245 0.9915433 0.4833171 -0.5604649 0.9915433 0.4833171 -0.5810111 0.9915433 0.4833171 -0.6070046 0.9915433 0.4833171 -0.6398899 0.9915433 0.4833171 -0.681494 0.9915433 0.4833171 -0.7341287 0.9915433 0.4833171 -0.8007184 0.9915433 0.4833171 -0.884963 0.9915433 0.4833171 -0.9915433 0.9915433 0.4833171 -0.9934218 0.9005319 0.550415 -0.9948649 0.8518543 0.6138855 -0.9959804 0.8321516 0.6724135 -0.996847 0.831155 0.7251351 -0.9975227 0.8413012 0.7716375 -0.9980511 0.8572771 0.8119009 -0.9984652 0.8755429 0.8462073 -0.9987904 0.8938868 0.8750412 -0.9990461 0.9110414 0.8989986 -0.9992474 0.9263769 0.9187148 -0.999406 0.9396711 0.9348135 -0.999531 0.9509449 0.9478743 -0.9996296 0.9603517 0.9584153 -0.9997074 0.9681058 0.9668869 -0.9997689 0.9744384 0.9736723 -0.9998174 0.9795734 0.9790925 -0.9998557 0.9837144 0.9834128 -0.999886 0.9870394 0.9868504 -0.9999099 0.9897003 0.989582 -0.9999288 0.9918241 0.9917501 -0.9999437 0.9935158 0.9934695 -0.5504963 0.993424 0.5506419 -0.5504818 0.9934236 0.5506027 -0.550464 0.9934231 0.5505536 -0.5504419 0.9934225 0.550492 -0.550415 0.9934218 0.550415 -0.5504784 0.9934218 0.550415 -0.5505585 0.9934218 0.550415 -0.5506599 0.9934218 0.550415 -0.5507882 0.9934218 0.550415 -0.5509505 0.9934218 0.550415 -0.5511558 0.9934218 0.550415 -0.5514156 0.9934218 0.550415 -0.5517442 0.9934218 0.550415 -0.55216 0.9934218 0.550415 -0.552686 0.9934218 0.550415 -0.5533515 0.9934218 0.550415 -0.5541934 0.9934218 0.550415 -0.5552585 0.9934218 0.550415 -0.5566061 0.9934218 0.550415 -0.5583108 0.9934218 0.550415 -0.5604676 0.9934218 0.550415 -0.5631962 0.9934218 0.550415 -0.5666483 0.9934218 0.550415 -0.5710156 0.9934218 0.550415 -0.5765407 0.9934218 0.550415 -0.5835308 0.9934218 0.550415 -0.5923741 0.9934218 0.550415 -0.6035621 0.9934218 0.550415 -0.6177164 0.9934218 0.550415 -0.6356233 0.9934218 0.550415 -0.658278 0.9934218 0.550415 -0.6869391 0.9934218 0.550415 -0.7231991 0.9934218 0.550415 -0.7690727 0.9934218 0.550415 -0.8271087 0.9934218 0.550415 -0.9005319 0.9934218 0.550415 -0.9934218 0.9934218 0.550415 -0.9948649 0.91499 0.6138855 -0.9959804 0.8745319 0.6724135 -0.996847 0.8592832 0.7251351 -0.9975227 0.8597838 0.7716375 -0.9980511 0.8693159 0.8119009 -0.9984652 0.8833259 0.8462073 -0.9987904 0.8988868 0.8750412 -0.9990461 0.9142365 0.8989986 -0.9992474 0.9284098 0.9187148 -0.999406 0.9409599 0.9348135 -0.999531 0.9517596 0.9478743 -0.9996296 0.9608655 0.9584153 -0.9997074 0.9684292 0.9668869 -0.9997689 0.9746416 0.9736723 -0.9998174 0.979701 0.9790925 -0.9998557 0.9837944 0.9834128 -0.999886 0.9870895 0.9868504 -0.9999099 0.9897317 0.989582 -0.9999288 0.9918438 0.9917501 -0.9999437 0.9935281 0.9934695 -0.6139459 0.9948662 0.6140448 -0.6139352 0.994866 0.6140174 -0.6139219 0.9948657 0.6139828 -0.6139056 0.9948653 0.6139396 -0.6138855 0.9948649 0.6138855 -0.6139286 0.9948649 0.6138855 -0.6139831 0.9948649 0.6138855 -0.614052 0.9948649 0.6138855 -0.6141392 0.9948649 0.6138855 -0.6142495 0.9948649 0.6138855 -0.6143891 0.9948649 0.6138855 -0.6145656 0.9948649 0.6138855 -0.614789 0.9948649 0.6138855 -0.6150716 0.9948649 0.6138855 -0.6154291 0.9948649 0.6138855 -0.6158814 0.9948649 0.6138855 -0.6164537 0.9948649 0.6138855 -0.6171776 0.9948649 0.6138855 -0.6180935 0.9948649 0.6138855 -0.6192522 0.9948649 0.6138855 -0.6207181 0.9948649 0.6138855 -0.6225727 0.9948649 0.6138855 -0.624919 0.9948649 0.6138855 -0.6278874 0.9948649 0.6138855 -0.6316428 0.9948649 0.6138855 -0.6363938 0.9948649 0.6138855 -0.6424045 0.9948649 0.6138855 -0.6500088 0.9948649 0.6138855 -0.6596292 0.9948649 0.6138855 -0.6718002 0.9948649 0.6138855 -0.6871982 0.9948649 0.6138855 -0.7066787 0.9948649 0.6138855 -0.731324 0.9948649 0.6138855 -0.7625036 0.9948649 0.6138855 -0.8019497 0.9948649 0.6138855 -0.8518543 0.9948649 0.6138855 -0.91499 0.9948649 0.6138855 -0.9948649 0.9948649 0.6138855 -0.9959804 0.9281485 0.6724135 -0.996847 0.8948691 0.7251351 -0.9975227 0.8831667 0.7716375 -0.9980511 0.8845466 0.8119009 -0.9984652 0.8931725 0.8462073 -0.9987904 0.9052124 0.8750412 -0.9990461 0.9182787 0.8989986 -0.9992474 0.9309816 0.9187148 -0.999406 0.9425903 0.9348135 -0.999531 0.9527902 0.9478743 -0.9996296 0.9615155 0.9584153 -0.9997074 0.9688383 0.9668869 -0.9997689 0.9748988 0.9736723 -0.9998174 0.9798624 0.9790925 -0.9998557 0.9838956 0.9834128 -0.999886 0.987153 0.9868504 -0.9999099 0.9897714 0.989582 -0.9999288 0.9918687 0.9917501 -0.9999437 0.9935437 0.9934695 -0.6724572 0.9959813 0.6725236 -0.6724495 0.9959811 0.6725046 -0.6724399 0.9959809 0.6724808 -0.672428 0.9959807 0.6724509 -0.6724135 0.9959804 0.6724135 -0.6724424 0.9959804 0.6724135 -0.672479 0.9959804 0.6724135 -0.6725253 0.9959804 0.6724135 -0.6725838 0.9959804 0.6724135 -0.6726578 0.9959804 0.6724135 -0.6727515 0.9959804 0.6724135 -0.67287 0.9959804 0.6724135 -0.67302 0.9959804 0.6724135 -0.6732097 0.9959804 0.6724135 -0.6734497 0.9959804 0.6724135 -0.6737533 0.9959804 0.6724135 -0.6741374 0.9959804 0.6724135 -0.6746233 0.9959804 0.6724135 -0.6752381 0.9959804 0.6724135 -0.6760159 0.9959804 0.6724135 -0.677 0.9959804 0.6724135 -0.6782449 0.9959804 0.6724135 -0.6798198 0.9959804 0.6724135 -0.6818124 0.9959804 0.6724135 -0.6843332 0.9959804 0.6724135 -0.6875223 0.9959804 0.6724135 -0.6915571 0.9959804 0.6724135 -0.6966615 0.9959804 0.6724135 -0.7031193 0.9959804 0.6724135 -0.7112892 0.9959804 0.6724135 -0.7216252 0.9959804 0.6724135 -0.7347016 0.9959804 0.6724135 -0.7512449 0.9959804 0.6724135 -0.7721744 0.9959804 0.6724135 -0.7986529 0.9959804 0.6724135 -0.8321516 0.9959804 0.6724135 -0.8745319 0.9959804 0.6724135 -0.9281485 0.9959804 0.6724135 -0.9959804 0.9959804 0.6724135 -0.996847 0.9398899 0.7251351 -0.9975227 0.912749 0.7716375 -0.9980511 0.9038153 0.8119009 -0.9984652 0.9056297 0.8462073 -0.9987904 0.913215 0.8750412 -0.9990461 0.9233927 0.8989986 -0.9992474 0.9342353 0.9187148 -0.999406 0.9446531 0.9348135 -0.999531 0.9540941 0.9478743 -0.9996296 0.9623378 0.9584153 -0.9997074 0.9693559 0.9668869 -0.9997689 0.9752241 0.9736723 -0.9998174 0.9800666 0.9790925 -0.9998557 0.9840237 0.9834128 -0.999886 0.9872332 0.9868504 -0.9999099 0.9898217 0.989582 -0.9999288 0.9919001 0.9917501 -0.9999437 0.9935634 0.9934695 -0.7251659 0.9968475 0.72521 -0.7251605 0.9968474 0.7251971 -0.7251537 0.9968473 0.7251809 -0.7251454 0.9968472 0.7251605 -0.7251351 0.996847 0.7251351 -0.7251543 0.996847 0.7251351 -0.7251785 0.996847 0.7251351 -0.7252093 0.996847 0.7251351 -0.7252481 0.996847 0.7251351 -0.7252972 0.996847 0.7251351 -0.7253594 0.996847 0.7251351 -0.7254381 0.996847 0.7251351 -0.7255376 0.996847 0.7251351 -0.7256635 0.996847 0.7251351 -0.7258228 0.996847 0.7251351 -0.7260243 0.996847 0.7251351 -0.7262792 0.996847 0.7251351 -0.7266018 0.996847 0.7251351 -0.7270098 0.996847 0.7251351 -0.7275261 0.996847 0.7251351 -0.7281792 0.996847 0.7251351 -0.7290054 0.996847 0.7251351 -0.7300507 0.996847 0.7251351 -0.7313732 0.996847 0.7251351 -0.7330463 0.996847 0.7251351 -0.735163 0.996847 0.7251351 -0.7378409 0.996847 0.7251351 -0.7412287 0.996847 0.7251351 -0.7455148 0.996847 0.7251351 -0.7509373 0.996847 0.7251351 -0.7577974 0.996847 0.7251351 -0.7664763 0.996847 0.7251351 -0.7774563 0.996847 0.7251351 -0.7913474 0.996847 0.7251351 -0.8089215 0.996847 0.7251351 -0.831155 0.996847 0.7251351 -0.8592832 0.996847 0.7251351 -0.8948691 0.996847 0.7251351 -0.9398899 0.996847 0.7251351 -0.996847 0.996847 0.7251351 -0.9975227 0.9501745 0.7716375 -0.9980511 0.9281928 0.8119009 -0.9984652 0.9213897 0.8462073 -0.9987904 0.9233395 0.8750412 -0.9990461 0.9298625 0.8989986 -0.9992474 0.9383517 0.9187148 -0.999406 0.9472627 0.9348135 -0.999531 0.9557438 0.9478743 -0.9996296 0.9633781 0.9584153 -0.9997074 0.9700107 0.9668869 -0.9997689 0.9756356 0.9736723 -0.9998174 0.980325 0.9790925 -0.9998557 0.9841857 0.9834128 -0.999886 0.9873347 0.9868504 -0.9999099 0.9898853 0.989582 -0.9999288 0.9919399 0.9917501 -0.9999437 0.9935883 0.9934695 -0.7716588 0.997523 0.7716878 -0.7716551 0.997523 0.7716791 -0.7716504 0.9975229 0.7716682 -0.7716446 0.9975228 0.7716545 -0.7716375 0.9975227 0.7716375 -0.7716501 0.9975227 0.7716375 -0.771666 0.9975227 0.7716375 -0.7716862 0.9975227 0.7716375 -0.7717117 0.9975227 0.7716375 -0.771744 0.9975227 0.7716375 -0.7717849 0.9975227 0.7716375 -0.7718366 0.9975227 0.7716375 -0.7719019 0.9975227 0.7716375 -0.7719847 0.9975227 0.7716375 -0.7720893 0.9975227 0.7716375 -0.7722218 0.9975227 0.7716375 -0.7723893 0.9975227 0.7716375 -0.7726012 0.9975227 0.7716375 -0.7728693 0.9975227 0.7716375 -0.7732085 0.9975227 0.7716375 -0.7736377 0.9975227 0.7716375 -0.7741806 0.9975227 0.7716375 -0.7748674 0.9975227 0.7716375 -0.7757364 0.9975227 0.7716375 -0.7768358 0.9975227 0.7716375 -0.7782266 0.9975227 0.7716375 -0.7799862 0.9975227 0.7716375 -0.7822123 0.9975227 0.7716375 -0.7850286 0.9975227 0.7716375 -0.7885916 0.9975227 0.7716375 -0.7930993 0.9975227 0.7716375 -0.7988021 0.9975227 0.7716375 -0.8060168 0.9975227 0.7716375 -0.8151444 0.9975227 0.7716375 -0.826692 0.9975227 0.7716375 -0.8413012 0.9975227 0.7716375 -0.8597838 0.9975227 0.7716375 -0.8831667 0.9975227 0.7716375 -0.912749 0.9975227 0.7716375 -0.9501745 0.9975227 0.7716375 -0.9975227 0.9975227 0.7716375 -0.9980511 0.9590336 0.8119009 -0.9984652 0.9413281 0.8462073 -0.9987904 0.9361482 0.8750412 -0.9990461 0.9380476 0.8989986 -0.9992474 0.9435594 0.9187148 -0.999406 0.9505643 0.9348135 -0.999531 0.9578308 0.9478743 -0.9996296 0.9646943 0.9584153 -0.9997074 0.9708392 0.9668869 -0.9997689 0.9761563 0.9736723 -0.9998174 0.9806518 0.9790925 -0.9998557 0.9843907 0.9834128 -0.999886 0.9874632 0.9868504 -0.9999099 0.9899657 0.989582 -0.9999288 0.9919903 0.9917501 -0.9999437 0.9936198 0.9934695 -0.8119154 0.9980513 0.8119343 -0.8119128 0.9980512 0.8119285 -0.8119096 0.9980512 0.8119213 -0.8119057 0.9980511 0.8119122 -0.8119009 0.9980511 0.8119009 -0.8119091 0.9980511 0.8119009 -0.8119195 0.9980511 0.8119009 -0.8119326 0.9980511 0.8119009 -0.8119492 0.9980511 0.8119009 -0.8119703 0.9980511 0.8119009 -0.8119969 0.9980511 0.8119009 -0.8120305 0.9980511 0.8119009 -0.8120731 0.9980511 0.8119009 -0.812127 0.9980511 0.8119009 -0.8121952 0.9980511 0.8119009 -0.8122814 0.9980511 0.8119009 -0.8123905 0.9980511 0.8119009 -0.8125286 0.9980511 0.8119009 -0.8127032 0.9980511 0.8119009 -0.8129242 0.9980511 0.8119009 -0.8132037 0.9980511 0.8119009 -0.8135573 0.9980511 0.8119009 -0.8140047 0.9980511 0.8119009 -0.8145707 0.9980511 0.8119009 -0.8152868 0.9980511 0.8119009 -0.8161928 0.9980511 0.8119009 -0.8173389 0.9980511 0.8119009 -0.8187889 0.9980511 0.8119009 -0.8206233 0.9980511 0.8119009 -0.8229441 0.9980511 0.8119009 -0.8258802 0.9980511 0.8119009 -0.8295948 0.9980511 0.8119009 -0.8342942 0.9980511 0.8119009 -0.8402396 0.9980511 0.8119009 -0.8477612 0.9980511 0.8119009 -0.8572771 0.9980511 0.8119009 -0.8693159 0.9980511 0.8119009 -0.8845466 0.9980511 0.8119009 -0.9038153 0.9980511 0.8119009 -0.9281928 0.9980511 0.8119009 -0.9590336 0.9980511 0.8119009 -0.9980511 0.9980511 0.8119009 -0.9984652 0.9665527 0.8462073 -0.9987904 0.9523529 0.8750412 -0.9990461 0.9484028 0.8989986 -0.9992474 0.9501479 0.9187148 -0.999406 0.9547411 0.9348135 -0.999531 0.9604711 0.9478743 -0.9996296 0.9663593 0.9584153 -0.9997074 0.9718873 0.9668869 -0.9997689 0.976815 0.9736723 -0.9998174 0.9810653 0.9790925 -0.9998557 0.98465 0.9834128 -0.999886 0.9876257 0.9868504 -0.9999099 0.9900675 0.989582 -0.9999288 0.992054 0.9917501 -0.9999437 0.9936596 0.9934695 -0.8462171 0.9984653 0.8462293 -0.8462154 0.9984653 0.8462255 -0.8462132 0.9984653 0.8462207 -0.8462106 0.9984653 0.8462148 -0.8462073 0.9984652 0.8462073 -0.8462126 0.9984652 0.8462073 -0.8462194 0.9984652 0.8462073 -0.8462279 0.9984652 0.8462073 -0.8462386 0.9984652 0.8462073 -0.8462522 0.9984652 0.8462073 -0.8462694 0.9984652 0.8462073 -0.8462912 0.9984652 0.8462073 -0.8463187 0.9984652 0.8462073 -0.8463535 0.9984652 0.8462073 -0.8463976 0.9984652 0.8462073 -0.8464534 0.9984652 0.8462073 -0.8465239 0.9984652 0.8462073 -0.8466132 0.9984652 0.8462073 -0.8467261 0.9984652 0.8462073 -0.8468689 0.9984652 0.8462073 -0.8470496 0.9984652 0.8462073 -0.8472782 0.9984652 0.8462073 -0.8475675 0.9984652 0.8462073 -0.8479334 0.9984652 0.8462073 -0.8483964 0.9984652 0.8462073 -0.848982 0.9984652 0.8462073 -0.849723 0.9984652 0.8462073 -0.8506604 0.9984652 0.8462073 -0.8518464 0.9984652 0.8462073 -0.8533468 0.9984652 0.8462073 -0.8552449 0.9984652 0.8462073 -0.8576464 0.9984652 0.8462073 -0.8606845 0.9984652 0.8462073 -0.8645282 0.9984652 0.8462073 -0.8693909 0.9984652 0.8462073 -0.8755429 0.9984652 0.8462073 -0.8833259 0.9984652 0.8462073 -0.8931725 0.9984652 0.8462073 -0.9056297 0.9984652 0.8462073 -0.9213897 0.9984652 0.8462073 -0.9413281 0.9984652 0.8462073 -0.9665527 0.9984652 0.8462073 -0.9984652 0.9984652 0.8462073 -0.9987904 0.9728539 0.8750412 -0.9990461 0.9615035 0.8989986 -0.9992474 0.9584831 0.9187148 -0.999406 0.9600254 0.9348135 -0.999531 0.9638114 0.9478743 -0.9996296 0.9684659 0.9584153 -0.9997074 0.9732132 0.9668869 -0.9997689 0.9776484 0.9736723 -0.9998174 0.9815884 0.9790925 -0.9998557 0.984978 0.9834128 -0.999886 0.9878313 0.9868504 -0.9999099 0.9901962 0.989582 -0.9999288 0.9921345 0.9917501 -0.9999437 0.99371 0.9934695 -0.8750477 0.9987905 0.8750555 -0.8750466 0.9987905 0.8750531 -0.8750451 0.9987904 0.87505 -0.8750434 0.9987904 0.8750461 -0.8750412 0.9987904 0.8750412 -0.8750447 0.9987904 0.8750412 -0.875049 0.9987904 0.8750412 -0.8750544 0.9987904 0.8750412 -0.8750613 0.9987904 0.8750412 -0.8750701 0.9987904 0.8750412 -0.8750811 0.9987904 0.8750412 -0.8750951 0.9987904 0.8750412 -0.8751128 0.9987904 0.8750412 -0.8751352 0.9987904 0.8750412 -0.8751635 0.9987904 0.8750412 -0.8751993 0.9987904 0.8750412 -0.8752446 0.9987904 0.8750412 -0.875302 0.9987904 0.8750412 -0.8753745 0.9987904 0.8750412 -0.8754663 0.9987904 0.8750412 -0.8755823 0.9987904 0.8750412 -0.8757292 0.9987904 0.8750412 -0.875915 0.9987904 0.8750412 -0.8761501 0.9987904 0.8750412 -0.8764475 0.9987904 0.8750412 -0.8768238 0.9987904 0.8750412 -0.8772998 0.9987904 0.8750412 -0.877902 0.9987904 0.8750412 -0.8786638 0.9987904 0.8750412 -0.8796277 0.9987904 0.8750412 -0.8808471 0.9987904 0.8750412 -0.8823899 0.9987904 0.8750412 -0.8843416 0.9987904 0.8750412 -0.8868108 0.9987904 0.8750412 -0.8899347 0.9987904 0.8750412 -0.8938868 0.9987904 0.8750412 -0.8988868 0.9987904 0.8750412 -0.9052124 0.9987904 0.8750412 -0.913215 0.9987904 0.8750412 -0.9233395 0.9987904 0.8750412 -0.9361482 0.9987904 0.8750412 -0.9523529 0.9987904 0.8750412 -0.9728539 0.9987904 0.8750412 -0.9987904 0.9987904 0.8750412 -0.9990461 0.9780777 0.8989986 -0.9992474 0.9690283 0.9187148 -0.999406 0.9667108 0.9348135 -0.999531 0.9680374 0.9478743 -0.9996296 0.971131 0.9584153 -0.9997074 0.9748908 0.9668869 -0.9997689 0.9787027 0.9736723 -0.9998174 0.9822502 0.9790925 -0.9998557 0.9853931 0.9834128 -0.999886 0.9880913 0.9868504 -0.9999099 0.9903591 0.989582 -0.9999288 0.9922365 0.9917501 -0.9999437 0.9937738 0.9934695 -0.8990028 0.9990461 0.8990078 -0.899002 0.9990461 0.8990062 -0.8990011 0.9990461 0.8990042 -0.899 0.9990461 0.8990017 -0.8989986 0.9990461 0.8989986 -0.8990008 0.9990461 0.8989986 -0.8990035 0.9990461 0.8989986 -0.899007 0.9990461 0.8989986 -0.8990114 0.9990461 0.8989986 -0.899017 0.9990461 0.8989986 -0.8990241 0.9990461 0.8989986 -0.899033 0.9990461 0.8989986 -0.8990443 0.9990461 0.8989986 -0.8990586 0.9990461 0.8989986 -0.8990767 0.9990461 0.8989986 -0.8990996 0.9990461 0.8989986 -0.8991285 0.9990461 0.8989986 -0.8991652 0.9990461 0.8989986 -0.8992115 0.9990461 0.8989986 -0.8992702 0.9990461 0.8989986 -0.8993443 0.9990461 0.8989986 -0.8994382 0.9990461 0.8989986 -0.8995569 0.9990461 0.8989986 -0.8997072 0.9990461 0.8989986 -0.8998972 0.9990461 0.8989986 -0.9001376 0.9990461 0.8989986 -0.9004418 0.9990461 0.8989986 -0.9008267 0.9990461 0.8989986 -0.9013135 0.9990461 0.8989986 -0.9019295 0.9990461 0.8989986 -0.9027087 0.9990461 0.8989986 -0.9036945 0.9990461 0.8989986 -0.9049418 0.9990461 0.8989986 -0.9065197 0.9990461 0.8989986 -0.9085159 0.9990461 0.8989986 -0.9110414 0.9990461 0.8989986 -0.9142365 0.9990461 0.8989986 -0.9182787 0.9990461 0.8989986 -0.9233927 0.9990461 0.8989986 -0.9298625 0.9990461 0.8989986 -0.9380476 0.9990461 0.8989986 -0.9484028 0.9990461 0.8989986 -0.9615035 0.9990461 0.8989986 -0.9780777 0.9990461 0.8989986 -0.9990461 0.9990461 0.8989986 -0.9992474 0.9823693 0.9187148 -0.999406 0.9751686 0.9348135 -0.999531 0.9733838 0.9478743 -0.9996296 0.9745027 0.9584153 -0.9997074 0.977013 0.9668869 -0.9997689 0.9800366 0.9736723 -0.9998174 0.9830875 0.9790925 -0.9998557 0.9859182 0.9834128 -0.999886 0.9884204 0.9868504 -0.9999099 0.9905651 0.989582 -0.9999288 0.9923655 0.9917501 -0.9999437 0.9938545 0.9934695 -0.9187175 0.9992474 0.9187207 -0.918717 0.9992474 0.9187197 -0.9187164 0.9992474 0.9187184 -0.9187157 0.9992474 0.9187168 -0.9187148 0.9992474 0.9187148 -0.9187162 0.9992474 0.9187148 -0.9187179 0.9992474 0.9187148 -0.9187201 0.9992474 0.9187148 -0.9187229 0.9992474 0.9187148 -0.9187265 0.9992474 0.9187148 -0.918731 0.9992474 0.9187148 -0.9187367 0.9992474 0.9187148 -0.9187439 0.9992474 0.9187148 -0.918753 0.9992474 0.9187148 -0.9187645 0.9992474 0.9187148 -0.918779 0.9992474 0.9187148 -0.9187975 0.9992474 0.9187148 -0.9188208 0.9992474 0.9187148 -0.9188503 0.9992474 0.9187148 -0.9188876 0.9992474 0.9187148 -0.9189348 0.9992474 0.9187148 -0.9189945 0.9992474 0.9187148 -0.91907 0.9992474 0.9187148 -0.9191656 0.9992474 0.9187148 -0.9192865 0.9992474 0.9187148 -0.9194395 0.9992474 0.9187148 -0.919633 0.9992474 0.9187148 -0.9198779 0.9992474 0.9187148 -0.9201876 0.9992474 0.9187148 -0.9205795 0.9992474 0.9187148 -0.9210753 0.9992474 0.9187148 -0.9217025 0.9992474 0.9187148 -0.9224961 0.9992474 0.9187148 -0.9235 0.9992474 0.9187148 -0.9247701 0.9992474 0.9187148 -0.9263769 0.9992474 0.9187148 -0.9284098 0.9992474 0.9187148 -0.9309816 0.9992474 0.9187148 -0.9342353 0.9992474 0.9187148 -0.9383517 0.9992474 0.9187148 -0.9435594 0.9992474 0.9187148 -0.9501479 0.9992474 0.9187148 -0.9584831 0.9992474 0.9187148 -0.9690283 0.9992474 0.9187148 -0.9823693 0.9992474 0.9187148 -0.9992474 0.9992474 0.9187148 -0.999406 0.9858688 0.9348135 -0.999531 0.9801478 0.9478743 -0.9996296 0.9787683 0.9584153 -0.9997074 0.979698 0.9668869 -0.9997689 0.981724 0.9736723 -0.9998174 0.9841468 0.9790925 -0.9998557 0.9865825 0.9834128 -0.999886 0.9888366 0.9868504 -0.9999099 0.9908258 0.989582 -0.9999288 0.9925287 0.9917501 -0.9999437 0.9939566 0.9934695 -0.9348153 0.999406 0.9348173 -0.9348149 0.999406 0.9348166 -0.9348146 0.999406 0.9348158 -0.9348141 0.999406 0.9348148 -0.9348135 0.999406 0.9348135 -0.9348144 0.999406 0.9348135 -0.9348155 0.999406 0.9348135 -0.9348169 0.999406 0.9348135 -0.9348187 0.999406 0.9348135 -0.9348209 0.999406 0.9348135 -0.9348238 0.999406 0.9348135 -0.9348274 0.999406 0.9348135 -0.9348319 0.999406 0.9348135 -0.9348377 0.999406 0.9348135 -0.934845 0.999406 0.9348135 -0.9348542 0.999406 0.9348135 -0.9348659 0.999406 0.9348135 -0.9348807 0.999406 0.9348135 -0.9348994 0.999406 0.9348135 -0.934923 0.999406 0.9348135 -0.934953 0.999406 0.9348135 -0.9349908 0.999406 0.9348135 -0.9350387 0.999406 0.9348135 -0.9350993 0.999406 0.9348135 -0.935176 0.999406 0.9348135 -0.935273 0.999406 0.9348135 -0.9353956 0.999406 0.9348135 -0.9355509 0.999406 0.9348135 -0.9357472 0.999406 0.9348135 -0.9359957 0.999406 0.9348135 -0.93631 0.999406 0.9348135 -0.9367077 0.999406 0.9348135 -0.9372107 0.999406 0.9348135 -0.9378472 0.999406 0.9348135 -0.9386524 0.999406 0.9348135 -0.9396711 0.999406 0.9348135 -0.9409599 0.999406 0.9348135 -0.9425903 0.999406 0.9348135 -0.9446531 0.999406 0.9348135 -0.9472627 0.999406 0.9348135 -0.9505643 0.999406 0.9348135 -0.9547411 0.999406 0.9348135 -0.9600254 0.999406 0.9348135 -0.9667108 0.999406 0.9348135 -0.9751686 0.999406 0.9348135 -0.9858688 0.999406 0.9348135 -0.999406 0.999406 0.9348135 -0.999531 0.988705 0.9478743 -0.9996296 0.9841648 0.9584153 -0.9997074 0.9830949 0.9668869 -0.9997689 0.9838589 0.9736723 -0.9998174 0.9854869 0.9790925 -0.9998557 0.9874229 0.9834128 -0.999886 0.9893633 0.9868504 -0.9999099 0.9911556 0.989582 -0.9999288 0.9927351 0.9917501 -0.9999437 0.9940858 0.9934695 -0.9478754 0.999531 0.9478767 -0.9478752 0.999531 0.9478763 -0.947875 0.999531 0.9478757 -0.9478746 0.999531 0.9478751 -0.9478743 0.999531 0.9478743 -0.9478748 0.999531 0.9478743 -0.9478755 0.999531 0.9478743 -0.9478764 0.999531 0.9478743 -0.9478775 0.999531 0.9478743 -0.947879 0.999531 0.9478743 -0.9478808 0.999531 0.9478743 -0.947883 0.999531 0.9478743 -0.9478859 0.999531 0.9478743 -0.9478896 0.999531 0.9478743 -0.9478942 0.999531 0.9478743 -0.9479 0.999531 0.9478743 -0.9479074 0.999531 0.9478743 -0.9479168 0.999531 0.9478743 -0.9479286 0.999531 0.9478743 -0.9479435 0.999531 0.9478743 -0.9479624 0.999531 0.9478743 -0.9479864 0.999531 0.9478743 -0.9480166 0.999531 0.9478743 -0.9480549 0.999531 0.9478743 -0.9481034 0.999531 0.9478743 -0.9481647 0.999531 0.9478743 -0.9482423 0.999531 0.9478743 -0.9483404 0.999531 0.9478743 -0.9484645 0.999531 0.9478743 -0.9486216 0.999531 0.9478743 -0.9488203 0.999531 0.9478743 -0.9490716 0.999531 0.9478743 -0.9493896 0.999531 0.9478743 -0.949792 0.999531 0.9478743 -0.950301 0.999531 0.9478743 -0.9509449 0.999531 0.9478743 -0.9517596 0.999531 0.9478743 -0.9527902 0.999531 0.9478743 -0.9540941 0.999531 0.9478743 -0.9557438 0.999531 0.9478743 -0.9578308 0.999531 0.9478743 -0.9604711 0.999531 0.9478743 -0.9638114 0.999531 0.9478743 -0.9680374 0.999531 0.9478743 -0.9733838 0.999531 0.9478743 -0.9801478 0.999531 0.9478743 -0.988705 0.999531 0.9478743 -0.999531 0.999531 0.9478743 -0.9996296 0.9909921 0.9584153 -0.9997074 0.9873923 0.9668869 -0.9997689 0.9865598 0.9736723 -0.9998174 0.9871824 0.9790925 -0.9998557 0.9884861 0.9834128 -0.999886 0.9900295 0.9868504 -0.9999099 0.9915729 0.989582 -0.9999288 0.9929963 0.9917501 -0.9999437 0.9942492 0.9934695 -0.958416 0.9996296 0.9584168 -0.9584159 0.9996296 0.9584165 -0.9584157 0.9996296 0.9584162 -0.9584155 0.9996296 0.9584158 -0.9584153 0.9996296 0.9584153 -0.9584156 0.9996296 0.9584153 -0.9584161 0.9996296 0.9584153 -0.9584166 0.9996296 0.9584153 -0.9584173 0.9996296 0.9584153 -0.9584182 0.9996296 0.9584153 -0.9584194 0.9996296 0.9584153 -0.9584208 0.9996296 0.9584153 -0.9584226 0.9996296 0.9584153 -0.9584249 0.9996296 0.9584153 -0.9584278 0.9996296 0.9584153 -0.9584315 0.9996296 0.9584153 -0.9584362 0.9996296 0.9584153 -0.9584421 0.9996296 0.9584153 -0.9584495 0.9996296 0.9584153 -0.9584589 0.9996296 0.9584153 -0.9584709 0.9996296 0.9584153 -0.958486 0.9996296 0.9584153 -0.9585051 0.9996296 0.9584153 -0.9585292 0.9996296 0.9584153 -0.9585598 0.9996296 0.9584153 -0.9585984 0.9996296 0.9584153 -0.9586473 0.9996296 0.9584153 -0.9587092 0.9996296 0.9584153 -0.9587875 0.9996296 0.9584153 -0.9588865 0.9996296 0.9584153 -0.9590118 0.9996296 0.9584153 -0.9591704 0.9996296 0.9584153 -0.9593709 0.9996296 0.9584153 -0.9596246 0.9996296 0.9584153 -0.9599456 0.9996296 0.9584153 -0.9603517 0.9996296 0.9584153 -0.9608655 0.9996296 0.9584153 -0.9615155 0.9996296 0.9584153 -0.9623378 0.9996296 0.9584153 -0.9633781 0.9996296 0.9584153 -0.9646943 0.9996296 0.9584153 -0.9663593 0.9996296 0.9584153 -0.9684659 0.9996296 0.9584153 -0.971131 0.9996296 0.9584153 -0.9745027 0.9996296 0.9584153 -0.9787683 0.9996296 0.9584153 -0.9841648 0.9996296 0.9584153 -0.9909921 0.9996296 0.9584153 -0.9996296 0.9996296 0.9584153 -0.9997074 0.9928291 0.9668869 -0.9997689 0.9899768 0.9736723 -0.9998174 0.9893273 0.9790925 -0.9998557 0.9898313 0.9834128 -0.999886 0.9908724 0.9868504 -0.9999099 0.9921008 0.989582 -0.9999288 0.9933267 0.9917501 -0.9999437 0.994456 0.9934695 -0.9668873 0.9997074 0.9668878 -0.9668872 0.9997074 0.9668877 -0.9668871 0.9997074 0.9668875 -0.966887 0.9997074 0.9668872 -0.9668869 0.9997074 0.9668869 -0.9668871 0.9997074 0.9668869 -0.9668874 0.9997074 0.9668869 -0.9668877 0.9997074 0.9668869 -0.9668882 0.9997074 0.9668869 -0.9668887 0.9997074 0.9668869 -0.9668894 0.9997074 0.9668869 -0.9668904 0.9997074 0.9668869 -0.9668915 0.9997074 0.9668869 -0.9668929 0.9997074 0.9668869 -0.9668948 0.9997074 0.9668869 -0.9668971 0.9997074 0.9668869 -0.9669 0.9997074 0.9668869 -0.9669037 0.9997074 0.9668869 -0.9669084 0.9997074 0.9668869 -0.9669144 0.9997074 0.9668869 -0.9669219 0.9997074 0.9668869 -0.9669314 0.9997074 0.9668869 -0.9669434 0.9997074 0.9668869 -0.9669586 0.9997074 0.9668869 -0.9669778 0.9997074 0.9668869 -0.9670022 0.9997074 0.9668869 -0.9670329 0.9997074 0.9668869 -0.9670719 0.9997074 0.9668869 -0.9671212 0.9997074 0.9668869 -0.9671835 0.9997074 0.9668869 -0.9672624 0.9997074 0.9668869 -0.9673622 0.9997074 0.9668869 -0.9674884 0.9997074 0.9668869 -0.9676481 0.9997074 0.9668869 -0.9678502 0.9997074 0.9668869 -0.9681058 0.9997074 0.9668869 -0.9684292 0.9997074 0.9668869 -0.9688383 0.9997074 0.9668869 -0.9693559 0.9997074 0.9668869 -0.9700107 0.9997074 0.9668869 -0.9708392 0.9997074 0.9668869 -0.9718873 0.9997074 0.9668869 -0.9732132 0.9997074 0.9668869 -0.9748908 0.9997074 0.9668869 -0.977013 0.9997074 0.9668869 -0.979698 0.9997074 0.9668869 -0.9830949 0.9997074 0.9668869 -0.9873923 0.9997074 0.9668869 -0.9928291 0.9997074 0.9668869 -0.9997074 0.9997074 0.9668869 -0.9997689 0.9942998 0.9736723 -0.9998174 0.992041 0.9790925 -0.9998557 0.991533 0.9834128 -0.999886 0.9919388 0.9868504 -0.9999099 0.9927686 0.989582 -0.9999288 0.9937447 0.9917501 -0.9999437 0.9947175 0.9934695 -0.9736726 0.9997689 0.9736729 -0.9736726 0.9997689 0.9736728 -0.9736725 0.9997689 0.9736727 -0.9736724 0.9997689 0.9736725 -0.9736723 0.9997689 0.9736723 -0.9736725 0.9997689 0.9736723 -0.9736726 0.9997689 0.9736723 -0.9736729 0.9997689 0.9736723 -0.9736732 0.9997689 0.9736723 -0.9736735 0.9997689 0.9736723 -0.973674 0.9997689 0.9736723 -0.9736745 0.9997689 0.9736723 -0.9736752 0.9997689 0.9736723 -0.9736762 0.9997689 0.9736723 -0.9736773 0.9997689 0.9736723 -0.9736788 0.9997689 0.9736723 -0.9736806 0.9997689 0.9736723 -0.9736829 0.9997689 0.9736723 -0.9736859 0.9997689 0.9736723 -0.9736896 0.9997689 0.9736723 -0.9736943 0.9997689 0.9736723 -0.9737003 0.9997689 0.9736723 -0.9737079 0.9997689 0.9736723 -0.9737174 0.9997689 0.9736723 -0.9737295 0.9997689 0.9736723 -0.9737448 0.9997689 0.9736723 -0.9737641 0.9997689 0.9736723 -0.9737886 0.9997689 0.9736723 -0.9738196 0.9997689 0.9736723 -0.9738588 0.9997689 0.9736723 -0.9739083 0.9997689 0.9736723 -0.9739711 0.9997689 0.9736723 -0.9740504 0.9997689 0.9736723 -0.9741508 0.9997689 0.9736723 -0.9742778 0.9997689 0.9736723 -0.9744384 0.9997689 0.9736723 -0.9746416 0.9997689 0.9736723 -0.9748988 0.9997689 0.9736723 -0.9752241 0.9997689 0.9736723 -0.9756356 0.9997689 0.9736723 -0.9761563 0.9997689 0.9736723 -0.976815 0.9997689 0.9736723 -0.9776484 0.9997689 0.9736723 -0.9787027 0.9997689 0.9736723 -0.9800366 0.9997689 0.9736723 -0.981724 0.9997689 0.9736723 -0.9838589 0.9997689 0.9736723 -0.9865598 0.9997689 0.9736723 -0.9899768 0.9997689 0.9736723 -0.9942998 0.9997689 0.9736723 -0.9997689 0.9997689 0.9736723 -0.9998174 0.9954741 0.9790925 -0.9998557 0.993686 0.9834128 -0.999886 0.993288 0.9868504 -0.9999099 0.9936135 0.989582 -0.9999288 0.9942736 0.9917501 -0.9999437 0.9950484 0.9934695 -0.9790927 0.9998174 0.9790929 -0.9790927 0.9998174 0.9790929 -0.9790927 0.9998174 0.9790928 -0.9790926 0.9998174 0.9790927 -0.9790925 0.9998174 0.9790925 -0.9790926 0.9998174 0.9790925 -0.9790927 0.9998174 0.9790925 -0.9790929 0.9998174 0.9790925 -0.9790931 0.9998174 0.9790925 -0.9790933 0.9998174 0.9790925 -0.9790936 0.9998174 0.9790925 -0.9790939 0.9998174 0.9790925 -0.9790944 0.9998174 0.9790925 -0.9790949 0.9998174 0.9790925 -0.9790957 0.9998174 0.9790925 -0.9790966 0.9998174 0.9790925 -0.9790977 0.9998174 0.9790925 -0.9790992 0.9998174 0.9790925 -0.979101 0.9998174 0.9790925 -0.9791034 0.9998174 0.9790925 -0.9791064 0.9998174 0.9790925 -0.9791101 0.9998174 0.9790925 -0.9791148 0.9998174 0.9790925 -0.9791208 0.9998174 0.9790925 -0.9791284 0.9998174 0.9790925 -0.979138 0.9998174 0.9790925 -0.9791502 0.9998174 0.9790925 -0.9791655 0.9998174 0.9790925 -0.979185 0.9998174 0.9790925 -0.9792096 0.9998174 0.9790925 -0.9792407 0.9998174 0.9790925 -0.9792801 0.9998174 0.9790925 -0.9793299 0.9998174 0.9790925 -0.9793929 0.9998174 0.9790925 -0.9794726 0.9998174 0.9790925 -0.9795734 0.9998174 0.9790925 -0.979701 0.9998174 0.9790925 -0.9798624 0.9998174 0.9790925 -0.9800666 0.9998174 0.9790925 -0.980325 0.9998174 0.9790925 -0.9806518 0.9998174 0.9790925 -0.9810653 0.9998174 0.9790925 -0.9815884 0.9998174 0.9790925 -0.9822502 0.9998174 0.9790925 -0.9830875 0.9998174 0.9790925 -0.9841468 0.9998174 0.9790925 -0.9854869 0.9998174 0.9790925 -0.9871824 0.9998174 0.9790925 -0.9893273 0.9998174 0.9790925 -0.992041 0.9998174 0.9790925 -0.9954741 0.9998174 0.9790925 -0.9998174 0.9998174 0.9790925 -0.9998557 0.9964098 0.9834128 -0.999886 0.9949948 0.9868504 -0.9999099 0.9946824 0.989582 -0.9999288 0.9949426 0.9917501 -0.9999437 0.9954671 0.9934695 -0.9834129 0.9998557 0.9834131 -0.9834129 0.9998557 0.983413 -0.9834129 0.9998557 0.983413 -0.9834129 0.9998557 0.9834129 -0.9834128 0.9998557 0.9834128 -0.9834129 0.9998557 0.9834128 -0.9834129 0.9998557 0.9834128 -0.983413 0.9998557 0.9834128 -0.9834131 0.9998557 0.9834128 -0.9834133 0.9998557 0.9834128 -0.9834135 0.9998557 0.9834128 -0.9834137 0.9998557 0.9834128 -0.983414 0.9998557 0.9834128 -0.9834143 0.9998557 0.9834128 -0.9834148 0.9998557 0.9834128 -0.9834153 0.9998557 0.9834128 -0.9834161 0.9998557 0.9834128 -0.983417 0.9998557 0.9834128 -0.9834182 0.9998557 0.9834128 -0.9834196 0.9998557 0.9834128 -0.9834215 0.9998557 0.9834128 -0.9834238 0.9998557 0.9834128 -0.9834268 0.9998557 0.9834128 -0.9834306 0.9998557 0.9834128 -0.9834353 0.9998557 0.9834128 -0.9834413 0.9998557 0.9834128 -0.983449 0.9998557 0.9834128 -0.9834586 0.9998557 0.9834128 -0.9834708 0.9998557 0.9834128 -0.9834862 0.9998557 0.9834128 -0.9835057 0.9998557 0.9834128 -0.9835304 0.9998557 0.9834128 -0.9835616 0.9998557 0.9834128 -0.9836012 0.9998557 0.9834128 -0.9836511 0.9998557 0.9834128 -0.9837144 0.9998557 0.9834128 -0.9837944 0.9998557 0.9834128 -0.9838956 0.9998557 0.9834128 -0.9840237 0.9998557 0.9834128 -0.9841857 0.9998557 0.9834128 -0.9843907 0.9998557 0.9834128 -0.98465 0.9998557 0.9834128 -0.984978 0.9998557 0.9834128 -0.9853931 0.9998557 0.9834128 -0.9859182 0.9998557 0.9834128 -0.9865825 0.9998557 0.9834128 -0.9874229 0.9998557 0.9834128 -0.9884861 0.9998557 0.9834128 -0.9898313 0.9998557 0.9834128 -0.991533 0.9998557 0.9834128 -0.993686 0.9998557 0.9834128 -0.9964098 0.9998557 0.9834128 -0.9998557 0.9998557 0.9834128 -0.999886 0.9971541 0.9868504 -0.9999099 0.9960347 0.989582 -0.9999288 0.9957891 0.9917501 -0.9999437 0.9959967 0.9934695 -0.9868505 0.999886 0.9868506 -0.9868505 0.999886 0.9868506 -0.9868505 0.999886 0.9868505 -0.9868505 0.999886 0.9868505 -0.9868504 0.999886 0.9868504 -0.9868505 0.999886 0.9868504 -0.9868505 0.999886 0.9868504 -0.9868506 0.999886 0.9868504 -0.9868506 0.999886 0.9868504 -0.9868507 0.999886 0.9868504 -0.9868508 0.999886 0.9868504 -0.986851 0.999886 0.9868504 -0.9868512 0.999886 0.9868504 -0.9868514 0.999886 0.9868504 -0.9868517 0.999886 0.9868504 -0.986852 0.999886 0.9868504 -0.9868525 0.999886 0.9868504 -0.986853 0.999886 0.9868504 -0.9868538 0.999886 0.9868504 -0.9868547 0.999886 0.9868504 -0.9868559 0.999886 0.9868504 -0.9868573 0.999886 0.9868504 -0.9868592 0.999886 0.9868504 -0.9868616 0.999886 0.9868504 -0.9868645 0.999886 0.9868504 -0.9868683 0.999886 0.9868504 -0.9868731 0.999886 0.9868504 -0.9868791 0.999886 0.9868504 -0.9868868 0.999886 0.9868504 -0.9868964 0.999886 0.9868504 -0.9869087 0.999886 0.9868504 -0.9869241 0.999886 0.9868504 -0.9869437 0.999886 0.9868504 -0.9869685 0.999886 0.9868504 -0.9869998 0.999886 0.9868504 -0.9870394 0.999886 0.9868504 -0.9870895 0.999886 0.9868504 -0.987153 0.999886 0.9868504 -0.9872332 0.999886 0.9868504 -0.9873347 0.999886 0.9868504 -0.9874632 0.999886 0.9868504 -0.9876257 0.999886 0.9868504 -0.9878313 0.999886 0.9868504 -0.9880913 0.999886 0.9868504 -0.9884204 0.999886 0.9868504 -0.9888366 0.999886 0.9868504 -0.9893633 0.999886 0.9868504 -0.9900295 0.999886 0.9868504 -0.9908724 0.999886 0.9868504 -0.9919388 0.999886 0.9868504 -0.993288 0.999886 0.9868504 -0.9949948 0.999886 0.9868504 -0.9971541 0.999886 0.9868504 -0.999886 0.999886 0.9868504 -0.9999099 0.9977455 0.989582 -0.9999288 0.99686 0.9917501 -0.9999437 0.9966668 0.9934695 -0.989582 0.9999099 0.9895821 -0.989582 0.9999099 0.989582 -0.989582 0.9999099 0.989582 -0.989582 0.9999099 0.989582 -0.989582 0.9999099 0.989582 -0.989582 0.9999099 0.989582 -0.989582 0.9999099 0.989582 -0.989582 0.9999099 0.989582 -0.9895821 0.9999099 0.989582 -0.9895821 0.9999099 0.989582 -0.9895822 0.9999099 0.989582 -0.9895823 0.9999099 0.989582 -0.9895824 0.9999099 0.989582 -0.9895826 0.9999099 0.989582 -0.9895827 0.9999099 0.989582 -0.989583 0.9999099 0.989582 -0.9895832 0.9999099 0.989582 -0.9895836 0.9999099 0.989582 -0.9895841 0.9999099 0.989582 -0.9895846 0.9999099 0.989582 -0.9895854 0.9999099 0.989582 -0.9895863 0.9999099 0.989582 -0.9895874 0.9999099 0.989582 -0.9895889 0.9999099 0.989582 -0.9895908 0.9999099 0.989582 -0.9895932 0.9999099 0.989582 -0.9895961 0.9999099 0.989582 -0.9895999 0.9999099 0.989582 -0.9896047 0.9999099 0.989582 -0.9896108 0.9999099 0.989582 -0.9896184 0.9999099 0.989582 -0.9896281 0.9999099 0.989582 -0.9896404 0.9999099 0.989582 -0.9896559 0.9999099 0.989582 -0.9896755 0.9999099 0.989582 -0.9897003 0.9999099 0.989582 -0.9897317 0.9999099 0.989582 -0.9897714 0.9999099 0.989582 -0.9898217 0.9999099 0.989582 -0.9898853 0.9999099 0.989582 -0.9899657 0.9999099 0.989582 -0.9900675 0.9999099 0.989582 -0.9901962 0.9999099 0.989582 -0.9903591 0.9999099 0.989582 -0.9905651 0.9999099 0.989582 -0.9908258 0.9999099 0.989582 -0.9911556 0.9999099 0.989582 -0.9915729 0.9999099 0.989582 -0.9921008 0.9999099 0.989582 -0.9927686 0.9999099 0.989582 -0.9936135 0.9999099 0.989582 -0.9946824 0.9999099 0.989582 -0.9960347 0.9999099 0.989582 -0.9977455 0.9999099 0.989582 -0.9999099 0.9999099 0.989582 -0.9999288 0.9982148 0.9917501 -0.9999437 0.9975145 0.9934695 -0.9917501 0.9999288 0.9917501 -0.9917501 0.9999288 0.9917501 -0.9917501 0.9999288 0.9917501 -0.9917501 0.9999288 0.9917501 -0.9917501 0.9999288 0.9917501 -0.9917501 0.9999288 0.9917501 -0.9917501 0.9999288 0.9917501 -0.9917501 0.9999288 0.9917501 -0.9917501 0.9999288 0.9917501 -0.9917502 0.9999288 0.9917501 -0.9917502 0.9999288 0.9917501 -0.9917503 0.9999288 0.9917501 -0.9917503 0.9999288 0.9917501 -0.9917504 0.9999288 0.9917501 -0.9917505 0.9999288 0.9917501 -0.9917507 0.9999288 0.9917501 -0.9917509 0.9999288 0.9917501 -0.9917511 0.9999288 0.9917501 -0.9917514 0.9999288 0.9917501 -0.9917517 0.9999288 0.9917501 -0.9917522 0.9999288 0.9917501 -0.9917528 0.9999288 0.9917501 -0.9917535 0.9999288 0.9917501 -0.9917544 0.9999288 0.9917501 -0.9917556 0.9999288 0.9917501 -0.9917571 0.9999288 0.9917501 -0.9917589 0.9999288 0.9917501 -0.9917613 0.9999288 0.9917501 -0.9917643 0.9999288 0.9917501 -0.9917681 0.9999288 0.9917501 -0.9917729 0.9999288 0.9917501 -0.991779 0.9999288 0.9917501 -0.9917866 0.9999288 0.9917501 -0.9917963 0.9999288 0.9917501 -0.9918086 0.9999288 0.9917501 -0.9918241 0.9999288 0.9917501 -0.9918438 0.9999288 0.9917501 -0.9918687 0.9999288 0.9917501 -0.9919001 0.9999288 0.9917501 -0.9919399 0.9999288 0.9917501 -0.9919903 0.9999288 0.9917501 -0.992054 0.9999288 0.9917501 -0.9921345 0.9999288 0.9917501 -0.9922365 0.9999288 0.9917501 -0.9923655 0.9999288 0.9917501 -0.9925287 0.9999288 0.9917501 -0.9927351 0.9999288 0.9917501 -0.9929963 0.9999288 0.9917501 -0.9933267 0.9999288 0.9917501 -0.9937447 0.9999288 0.9917501 -0.9942736 0.9999288 0.9917501 -0.9949426 0.9999288 0.9917501 -0.9957891 0.9999288 0.9917501 -0.99686 0.9999288 0.9917501 -0.9982148 0.9999288 0.9917501 -0.9999288 0.9999288 0.9917501 -0.9999437 0.9985869 0.9934695 -0.9934695 0.9999437 0.9934695 -0.9934695 0.9999437 0.9934695 -0.9934695 0.9999437 0.9934695 -0.9934695 0.9999437 0.9934695 -0.9934695 0.9999437 0.9934695 -0.9934695 0.9999437 0.9934695 -0.9934695 0.9999437 0.9934695 -0.9934695 0.9999437 0.9934695 -0.9934695 0.9999437 0.9934695 -0.9934695 0.9999437 0.9934695 -0.9934696 0.9999437 0.9934695 -0.9934696 0.9999437 0.9934695 -0.9934696 0.9999437 0.9934695 -0.9934697 0.9999437 0.9934695 -0.9934698 0.9999437 0.9934695 -0.9934699 0.9999437 0.9934695 -0.99347 0.9999437 0.9934695 -0.9934701 0.9999437 0.9934695 -0.9934703 0.9999437 0.9934695 -0.9934705 0.9999437 0.9934695 -0.9934708 0.9999437 0.9934695 -0.9934712 0.9999437 0.9934695 -0.9934716 0.9999437 0.9934695 -0.9934722 0.9999437 0.9934695 -0.9934729 0.9999437 0.9934695 -0.9934739 0.9999437 0.9934695 -0.993475 0.9999437 0.9934695 -0.9934765 0.9999437 0.9934695 -0.9934784 0.9999437 0.9934695 -0.9934807 0.9999437 0.9934695 -0.9934837 0.9999437 0.9934695 -0.9934875 0.9999437 0.9934695 -0.9934923 0.9999437 0.9934695 -0.9934984 0.9999437 0.9934695 -0.9935061 0.9999437 0.9934695 -0.9935158 0.9999437 0.9934695 -0.9935281 0.9999437 0.9934695 -0.9935437 0.9999437 0.9934695 -0.9935634 0.9999437 0.9934695 -0.9935883 0.9999437 0.9934695 -0.9936198 0.9999437 0.9934695 -0.9936596 0.9999437 0.9934695 -0.99371 0.9999437 0.9934695 -0.9937738 0.9999437 0.9934695 -0.9938545 0.9999437 0.9934695 -0.9939566 0.9999437 0.9934695 -0.9940858 0.9999437 0.9934695 -0.9942492 0.9999437 0.9934695 -0.994456 0.9999437 0.9934695 -0.9947175 0.9999437 0.9934695 -0.9950484 0.9999437 0.9934695 -0.9954671 0.9999437 0.9934695 -0.9959967 0.9999437 0.9934695 -0.9966668 0.9999437 0.9934695 -0.9975145 0.9999437 0.9934695 -0.9985869 0.9999437 0.9934695 -0.9999437 0.9999437 0.9934695 -0.0000238 0.0000238 0.0044007 -0.0005417 0.0000238 0.0044007 -0.0011968 0.0000238 0.0044007 -0.0020256 0.0000238 0.0044007 -0.0030742 0.0000238 0.0044007 -0.0044007 0.0000238 0.0044007 -0.006079 0.0000238 0.0044007 -0.0082023 0.0000238 0.0044007 -0.0108885 0.0000238 0.0044007 -0.0142868 0.0000238 0.0044007 -0.0185862 0.0000238 0.0044007 -0.0240255 0.0000238 0.0044007 -0.0309069 0.0000238 0.0044007 -0.0396127 0.0000238 0.0044007 -0.0506267 0.0000238 0.0044007 -0.0645609 0.0000238 0.0044007 -0.0821895 0.0000238 0.0044007 -0.1044919 0.0000238 0.0044007 -0.1327073 0.0000238 0.0044007 -0.1684036 0.0000238 0.0044007 -0.2135639 0.0000238 0.0044007 -0.2706977 0.0000238 0.0044007 -0.3429792 0.0000238 0.0044007 -0.4344249 0.0000238 0.0044007 -0.5501155 0.0000238 0.0044007 -0.6964791 0.0000238 0.0044007 -0.8407292 0.0051514 0.0092997 -0.9033413 0.0279321 0.0313658 -0.9354466 0.0624569 0.0651625 -0.9545467 0.1059991 0.1080772 -0.9669269 0.1572498 0.1588168 -0.9754027 0.2151269 0.2162897 -0.9814251 0.2783684 0.2792183 -0.9858181 0.3454107 0.3460225 -0.9890841 0.4144197 0.4148536 -0.9915469 0.4834235 0.4837267 -0.993424 0.5504963 0.5507052 -0.9948662 0.6139459 0.6140879 -0.9959813 0.6724572 0.6725525 -0.9968475 0.7251659 0.7252292 -0.997523 0.7716588 0.7717004 -0.9980513 0.8119154 0.8119425 -0.9984653 0.8462171 0.8462346 -0.9987905 0.8750477 0.8750589 -0.9990461 0.8990028 0.89901 -0.9992474 0.9187175 0.9187221 -0.999406 0.9348153 0.9348182 -0.999531 0.9478754 0.9478772 -0.9996296 0.958416 0.9584171 -0.9997074 0.9668873 0.9668881 -0.9997689 0.9736726 0.9736731 -0.9998174 0.9790927 0.979093 -0.9998557 0.9834129 0.9834131 -0.999886 0.9868505 0.9868506 -0.9999099 0.989582 0.9895821 -0.9999288 0.9917501 0.9917501 -0.9999437 0.9934695 0.9934695 -0.0000238 0.0005417 0.0044007 -0.0000382 0.0000382 0.0038972 -0.0006933 0.0000382 0.0038972 -0.0015221 0.0000382 0.0038972 -0.0025707 0.0000382 0.0038972 -0.0038972 0.0000382 0.0038972 -0.0055755 0.0000382 0.0038972 -0.0076988 0.0000382 0.0038972 -0.0103849 0.0000382 0.0038972 -0.0137833 0.0000382 0.0038972 -0.0180827 0.0000382 0.0038972 -0.023522 0.0000382 0.0038972 -0.0304033 0.0000382 0.0038972 -0.0391092 0.0000382 0.0038972 -0.0501232 0.0000382 0.0038972 -0.0640574 0.0000382 0.0038972 -0.081686 0.0000382 0.0038972 -0.1039884 0.0000382 0.0038972 -0.1322038 0.0000382 0.0038972 -0.1679 0.0000382 0.0038972 -0.2130604 0.0000382 0.0038972 -0.2701941 0.0000382 0.0038972 -0.3424757 0.0000382 0.0038972 -0.4339214 0.0000382 0.0038972 -0.549612 0.0000382 0.0038972 -0.6959756 0.0000382 0.0038972 -0.8405071 0.0051286 0.0087874 -0.9032596 0.0278872 0.0309159 -0.9354101 0.0624063 0.0647927 -0.9545286 0.1059489 0.1077818 -0.9669173 0.1572031 0.1585851 -0.9753975 0.2150852 0.2161107 -0.9814221 0.2783325 0.279082 -0.9858163 0.3453807 0.3459203 -0.9890831 0.4143955 0.4147782 -0.9915463 0.4834045 0.4836719 -0.9934236 0.5504818 0.5506661 -0.994866 0.6139352 0.6140604 -0.9959811 0.6724495 0.6725335 -0.9968474 0.7251605 0.7252163 -0.997523 0.7716551 0.7716917 -0.9980512 0.8119128 0.8119367 -0.9984653 0.8462154 0.8462308 -0.9987905 0.8750466 0.8750565 -0.9990461 0.899002 0.8990084 -0.9992474 0.918717 0.9187211 -0.999406 0.9348149 0.9348175 -0.999531 0.9478752 0.9478768 -0.9996296 0.9584159 0.9584169 -0.9997074 0.9668872 0.9668879 -0.9997689 0.9736726 0.973673 -0.9998174 0.9790927 0.9790929 -0.9998557 0.9834129 0.9834131 -0.999886 0.9868505 0.9868506 -0.9999099 0.989582 0.9895821 -0.9999288 0.9917501 0.9917501 -0.9999437 0.9934695 0.9934695 -0.0000238 0.0011968 0.0044007 -0.0000382 0.0006933 0.0038972 -0.0000611 0.0000611 0.003265 -0.0008899 0.0000611 0.003265 -0.0019385 0.0000611 0.003265 -0.003265 0.0000611 0.003265 -0.0049433 0.0000611 0.003265 -0.0070666 0.0000611 0.003265 -0.0097527 0.0000611 0.003265 -0.0131511 0.0000611 0.003265 -0.0174505 0.0000611 0.003265 -0.0228898 0.0000611 0.003265 -0.0297711 0.0000611 0.003265 -0.038477 0.0000611 0.003265 -0.049491 0.0000611 0.003265 -0.0634252 0.0000611 0.003265 -0.0810538 0.0000611 0.003265 -0.1033562 0.0000611 0.003265 -0.1315716 0.0000611 0.003265 -0.1672678 0.0000611 0.003265 -0.2124282 0.0000611 0.003265 -0.2695619 0.0000611 0.003265 -0.3418435 0.0000611 0.003265 -0.4332891 0.0000611 0.003265 -0.5489798 0.0000611 0.003265 -0.6953434 0.0000611 0.003265 -0.8402274 0.0051047 0.0081437 -0.9031567 0.0278347 0.0303505 -0.9353643 0.0623458 0.064328 -0.9545059 0.1058883 0.1074107 -0.9669053 0.1571463 0.1582941 -0.9753908 0.2150342 0.2158859 -0.9814183 0.2782884 0.2789108 -0.9858141 0.3453439 0.3457919 -0.9890818 0.4143657 0.4146834 -0.9915455 0.4833811 0.4836031 -0.9934231 0.550464 0.5506169 -0.9948657 0.6139219 0.6140259 -0.9959809 0.6724399 0.6725097 -0.9968473 0.7251537 0.7252001 -0.9975229 0.7716504 0.7716808 -0.9980512 0.8119096 0.8119295 -0.9984653 0.8462132 0.846226 -0.9987904 0.8750451 0.8750534 -0.9990461 0.8990011 0.8990064 -0.9992474 0.9187164 0.9187198 -0.999406 0.9348146 0.9348167 -0.999531 0.947875 0.9478763 -0.9996296 0.9584157 0.9584165 -0.9997074 0.9668871 0.9668877 -0.9997689 0.9736725 0.9736728 -0.9998174 0.9790927 0.9790929 -0.9998557 0.9834129 0.983413 -0.999886 0.9868505 0.9868506 -0.9999099 0.989582 0.989582 -0.9999288 0.9917501 0.9917501 -0.9999437 0.9934695 0.9934695 -0.0000238 0.0020256 0.0044007 -0.0000382 0.0015221 0.0038972 -0.0000611 0.0008899 0.003265 -0.0000978 0.0000978 0.0024729 -0.0011463 0.0000978 0.0024729 -0.0024729 0.0000978 0.0024729 -0.0041512 0.0000978 0.0024729 -0.0062744 0.0000978 0.0024729 -0.0089606 0.0000978 0.0024729 -0.012359 0.0000978 0.0024729 -0.0166583 0.0000978 0.0024729 -0.0220976 0.0000978 0.0024729 -0.028979 0.0000978 0.0024729 -0.0376849 0.0000978 0.0024729 -0.0486989 0.0000978 0.0024729 -0.0626331 0.0000978 0.0024729 -0.0802616 0.0000978 0.0024729 -0.102564 0.0000978 0.0024729 -0.1307795 0.0000978 0.0024729 -0.1664757 0.0000978 0.0024729 -0.2116361 0.0000978 0.0024729 -0.2687698 0.0000978 0.0024729 -0.3410514 0.0000978 0.0024729 -0.432497 0.0000978 0.0024729 -0.5481876 0.0000978 0.0024729 -0.6945513 0.0000978 0.0024729 -0.8398756 0.0050826 0.0073367 -0.9030276 0.0277752 0.0296415 -0.9353068 0.0622749 0.0637452 -0.9544774 0.1058162 0.1069453 -0.9668902 0.1570779 0.1579292 -0.9753825 0.2149725 0.215604 -0.9814136 0.2782347 0.2786962 -0.9858113 0.3452987 0.3456309 -0.9890801 0.414329 0.4145646 -0.9915446 0.4833522 0.4835168 -0.9934225 0.5504419 0.5505553 -0.9948653 0.6139056 0.6139827 -0.9959807 0.672428 0.6724798 -0.9968472 0.7251454 0.7251797 -0.9975228 0.7716446 0.7716672 -0.9980511 0.8119057 0.8119204 -0.9984653 0.8462106 0.8462201 -0.9987904 0.8750434 0.8750495 -0.9990461 0.899 0.8990039 -0.9992474 0.9187157 0.9187182 -0.999406 0.9348141 0.9348157 -0.999531 0.9478746 0.9478756 -0.9996296 0.9584155 0.9584161 -0.9997074 0.966887 0.9668874 -0.9997689 0.9736724 0.9736727 -0.9998174 0.9790926 0.9790928 -0.9998557 0.9834129 0.983413 -0.999886 0.9868505 0.9868505 -0.9999099 0.989582 0.989582 -0.9999288 0.9917501 0.9917501 -0.9999437 0.9934695 0.9934695 -0.0000238 0.0030742 0.0044007 -0.0000382 0.0025707 0.0038972 -0.0000611 0.0019385 0.003265 -0.0000978 0.0011463 0.0024729 -0.0001565 0.0001565 0.001483 -0.001483 0.0001565 0.001483 -0.0031613 0.0001565 0.001483 -0.0052846 0.0001565 0.001483 -0.0079707 0.0001565 0.001483 -0.0113691 0.0001565 0.001483 -0.0156685 0.0001565 0.001483 -0.0211078 0.0001565 0.001483 -0.0279891 0.0001565 0.001483 -0.036695 0.0001565 0.001483 -0.047709 0.0001565 0.001483 -0.0616432 0.0001565 0.001483 -0.0792718 0.0001565 0.001483 -0.1015742 0.0001565 0.001483 -0.1297896 0.0001565 0.001483 -0.1654858 0.0001565 0.001483 -0.2106462 0.0001565 0.001483 -0.2677799 0.0001565 0.001483 -0.3400615 0.0001565 0.001483 -0.4315072 0.0001565 0.001483 -0.5471978 0.0001565 0.001483 -0.6935614 0.0001565 0.001483 -0.8394338 0.0050676 0.0063275 -0.9028657 0.0277111 0.0287543 -0.9352348 0.0621943 0.0630161 -0.9544418 0.1057322 0.1063632 -0.9668714 0.1569971 0.1574728 -0.9753721 0.2148987 0.2152516 -0.9814076 0.2781701 0.2784279 -0.9858079 0.3452442 0.3454298 -0.9890781 0.4142845 0.4144161 -0.9915433 0.4833171 0.483409 -0.9934218 0.550415 0.5504784 -0.9948649 0.6138855 0.6139286 -0.9959804 0.6724135 0.6724424 -0.996847 0.7251351 0.7251543 -0.9975227 0.7716375 0.7716501 -0.9980511 0.8119009 0.8119091 -0.9984652 0.8462073 0.8462126 -0.9987904 0.8750412 0.8750447 -0.9990461 0.8989986 0.8990008 -0.9992474 0.9187148 0.9187162 -0.999406 0.9348135 0.9348144 -0.999531 0.9478743 0.9478748 -0.9996296 0.9584153 0.9584156 -0.9997074 0.9668869 0.9668871 -0.9997689 0.9736723 0.9736725 -0.9998174 0.9790925 0.9790926 -0.9998557 0.9834128 0.9834129 -0.999886 0.9868504 0.9868505 -0.9999099 0.989582 0.989582 -0.9999288 0.9917501 0.9917501 -0.9999437 0.9934695 0.9934695 -0.0000238 0.0044007 0.0044007 -0.0000382 0.0038972 0.0038972 -0.0000611 0.003265 0.003265 -0.0000978 0.0024729 0.0024729 -0.0001565 0.001483 0.001483 -0.0002504 0.0002504 0.0002504 -0.0019287 0.0002504 0.0002504 -0.004052 0.0002504 0.0002504 -0.0067381 0.0002504 0.0002504 -0.0101365 0.0002504 0.0002504 -0.0144359 0.0002504 0.0002504 -0.0198752 0.0002504 0.0002504 -0.0267565 0.0002504 0.0002504 -0.0354624 0.0002504 0.0002504 -0.0464764 0.0002504 0.0002504 -0.0604106 0.0002504 0.0002504 -0.0780392 0.0002504 0.0002504 -0.1003416 0.0002504 0.0002504 -0.128557 0.0002504 0.0002504 -0.1642532 0.0002504 0.0002504 -0.2094136 0.0002504 0.0002504 -0.2665473 0.0002504 0.0002504 -0.3388289 0.0002504 0.0002504 -0.4302746 0.0002504 0.0002504 -0.5459652 0.0002504 0.0002504 -0.6923288 0.0002504 0.0002504 -0.8388802 0.0050694 0.0050694 -0.9026634 0.0276479 0.0276479 -0.9351449 0.0621069 0.0621069 -0.9543974 0.1056375 0.1056375 -0.9668479 0.156904 0.156904 -0.9753591 0.2148124 0.2148124 -0.9814002 0.2780936 0.2780936 -0.9858036 0.3451791 0.3451791 -0.9890755 0.4142311 0.4142311 -0.9915418 0.4832747 0.4832747 -0.9934209 0.5503825 0.5503825 -0.9948643 0.6138613 0.6138613 -0.9959801 0.6723959 0.6723959 -0.9968468 0.7251226 0.7251226 -0.9975226 0.7716288 0.7716288 -0.998051 0.8118949 0.8118949 -0.9984652 0.8462034 0.8462034 -0.9987904 0.8750386 0.8750386 -0.9990461 0.8989969 0.8989969 -0.9992474 0.9187137 0.9187137 -0.9994059 0.9348128 0.9348128 -0.999531 0.9478738 0.9478738 -0.9996296 0.958415 0.958415 -0.9997074 0.9668867 0.9668867 -0.9997689 0.9736722 0.9736722 -0.9998174 0.9790925 0.9790925 -0.9998557 0.9834128 0.9834128 -0.999886 0.9868504 0.9868504 -0.9999099 0.9895819 0.9895819 -0.9999288 0.9917501 0.9917501 -0.9999437 0.9934695 0.9934695 -0.0000238 0.006079 0.0044007 -0.0000382 0.0055755 0.0038972 -0.0000611 0.0049433 0.003265 -0.0000978 0.0041512 0.0024729 -0.0001565 0.0031613 0.001483 -0.0002504 0.0019287 0.0002504 -0.0019287 0.0019287 0.0002504 -0.004052 0.0019287 0.0002504 -0.0067381 0.0019287 0.0002504 -0.0101365 0.0019287 0.0002504 -0.0144359 0.0019287 0.0002504 -0.0198752 0.0019287 0.0002504 -0.0267565 0.0019287 0.0002504 -0.0354624 0.0019287 0.0002504 -0.0464764 0.0019287 0.0002504 -0.0604106 0.0019287 0.0002504 -0.0780392 0.0019287 0.0002504 -0.1003416 0.0019287 0.0002504 -0.128557 0.0019287 0.0002504 -0.1642532 0.0019287 0.0002504 -0.2094136 0.0019287 0.0002504 -0.2665473 0.0019287 0.0002504 -0.3388289 0.0019287 0.0002504 -0.4302746 0.0019287 0.0002504 -0.5459652 0.0019287 0.0002504 -0.6923288 0.0019287 0.0002504 -0.8388802 0.0066646 0.0050694 -0.9026634 0.0289691 0.0276479 -0.9351449 0.0631476 0.0621069 -0.9543974 0.1064365 0.1056375 -0.9668479 0.1575062 0.156904 -0.9753591 0.2152591 0.2148124 -0.9814002 0.27842 0.2780936 -0.9858036 0.345414 0.3451791 -0.9890755 0.4143977 0.4142311 -0.9915418 0.4833911 0.4832747 -0.9934209 0.5504627 0.5503825 -0.9948643 0.6139158 0.6138613 -0.9959801 0.6724325 0.6723959 -0.9968468 0.7251469 0.7251226 -0.9975226 0.7716448 0.7716288 -0.998051 0.8119053 0.8118949 -0.9984652 0.8462101 0.8462034 -0.9987904 0.8750429 0.8750386 -0.9990461 0.8989996 0.8989969 -0.9992474 0.9187154 0.9187137 -0.9994059 0.9348139 0.9348128 -0.999531 0.9478745 0.9478738 -0.9996296 0.9584154 0.958415 -0.9997074 0.966887 0.9668867 -0.9997689 0.9736724 0.9736722 -0.9998174 0.9790926 0.9790925 -0.9998557 0.9834128 0.9834128 -0.999886 0.9868504 0.9868504 -0.9999099 0.989582 0.9895819 -0.9999288 0.9917501 0.9917501 -0.9999437 0.9934695 0.9934695 -0.0000238 0.0082023 0.0044007 -0.0000382 0.0076988 0.0038972 -0.0000611 0.0070666 0.003265 -0.0000978 0.0062744 0.0024729 -0.0001565 0.0052846 0.001483 -0.0002504 0.004052 0.0002504 -0.0019287 0.004052 0.0002504 -0.004052 0.004052 0.0002504 -0.0067381 0.004052 0.0002504 -0.0101365 0.004052 0.0002504 -0.0144359 0.004052 0.0002504 -0.0198752 0.004052 0.0002504 -0.0267565 0.004052 0.0002504 -0.0354624 0.004052 0.0002504 -0.0464764 0.004052 0.0002504 -0.0604106 0.004052 0.0002504 -0.0780392 0.004052 0.0002504 -0.1003416 0.004052 0.0002504 -0.128557 0.004052 0.0002504 -0.1642532 0.004052 0.0002504 -0.2094136 0.004052 0.0002504 -0.2665473 0.004052 0.0002504 -0.3388289 0.004052 0.0002504 -0.4302746 0.004052 0.0002504 -0.5459652 0.004052 0.0002504 -0.6923288 0.004052 0.0002504 -0.8388802 0.0086827 0.0050694 -0.9026634 0.0306405 0.0276479 -0.9351449 0.0644643 0.0621069 -0.9543974 0.1074473 0.1056375 -0.9668479 0.1582681 0.156904 -0.9753591 0.2158242 0.2148124 -0.9814002 0.2788329 0.2780936 -0.9858036 0.3457112 0.3451791 -0.9890755 0.4146084 0.4142311 -0.9915418 0.4835383 0.4832747 -0.9934209 0.5505641 0.5503825 -0.9948643 0.6139847 0.6138613 -0.9959801 0.6724787 0.6723959 -0.9968468 0.7251776 0.7251226 -0.9975226 0.7716649 0.7716288 -0.998051 0.8119185 0.8118949 -0.9984652 0.8462186 0.8462034 -0.9987904 0.8750484 0.8750386 -0.9990461 0.8990031 0.8989969 -0.9992474 0.9187176 0.9187137 -0.9994059 0.9348153 0.9348128 -0.999531 0.9478754 0.9478738 -0.9996296 0.958416 0.958415 -0.9997074 0.9668873 0.9668867 -0.9997689 0.9736726 0.9736722 -0.9998174 0.9790927 0.9790925 -0.9998557 0.9834129 0.9834128 -0.999886 0.9868505 0.9868504 -0.9999099 0.989582 0.9895819 -0.9999288 0.9917501 0.9917501 -0.9999437 0.9934695 0.9934695 -0.0000238 0.0108885 0.0044007 -0.0000382 0.0103849 0.0038972 -0.0000611 0.0097527 0.003265 -0.0000978 0.0089606 0.0024729 -0.0001565 0.0079707 0.001483 -0.0002504 0.0067381 0.0002504 -0.0019287 0.0067381 0.0002504 -0.004052 0.0067381 0.0002504 -0.0067381 0.0067381 0.0002504 -0.0101365 0.0067381 0.0002504 -0.0144359 0.0067381 0.0002504 -0.0198752 0.0067381 0.0002504 -0.0267565 0.0067381 0.0002504 -0.0354624 0.0067381 0.0002504 -0.0464764 0.0067381 0.0002504 -0.0604106 0.0067381 0.0002504 -0.0780392 0.0067381 0.0002504 -0.1003416 0.0067381 0.0002504 -0.128557 0.0067381 0.0002504 -0.1642532 0.0067381 0.0002504 -0.2094136 0.0067381 0.0002504 -0.2665473 0.0067381 0.0002504 -0.3388289 0.0067381 0.0002504 -0.4302746 0.0067381 0.0002504 -0.5459652 0.0067381 0.0002504 -0.6923288 0.0067381 0.0002504 -0.8388802 0.0112359 0.0050694 -0.9026634 0.0327552 0.0276479 -0.9351449 0.06613 0.0621069 -0.9543974 0.1087261 0.1056375 -0.9668479 0.159232 0.156904 -0.9753591 0.2165392 0.2148124 -0.9814002 0.2793553 0.2780936 -0.9858036 0.3460872 0.3451791 -0.9890755 0.414875 0.4142311 -0.9915418 0.4837246 0.4832747 -0.9934209 0.5506924 0.5503825 -0.9948643 0.6140719 0.6138613 -0.9959801 0.6725373 0.6723959 -0.9968468 0.7252164 0.7251226 -0.9975226 0.7716905 0.7716288 -0.998051 0.8119351 0.8118949 -0.9984652 0.8462293 0.8462034 -0.9987904 0.8750553 0.8750386 -0.9990461 0.8990075 0.8989969 -0.9992474 0.9187204 0.9187137 -0.9994059 0.9348171 0.9348128 -0.999531 0.9478765 0.9478738 -0.9996296 0.9584167 0.958415 -0.9997074 0.9668878 0.9668867 -0.9997689 0.9736729 0.9736722 -0.9998174 0.9790929 0.9790925 -0.9998557 0.983413 0.9834128 -0.999886 0.9868506 0.9868504 -0.9999099 0.989582 0.9895819 -0.9999288 0.9917501 0.9917501 -0.9999437 0.9934695 0.9934695 -0.0000238 0.0142868 0.0044007 -0.0000382 0.0137833 0.0038972 -0.0000611 0.0131511 0.003265 -0.0000978 0.012359 0.0024729 -0.0001565 0.0113691 0.001483 -0.0002504 0.0101365 0.0002504 -0.0019287 0.0101365 0.0002504 -0.004052 0.0101365 0.0002504 -0.0067381 0.0101365 0.0002504 -0.0101365 0.0101365 0.0002504 -0.0144359 0.0101365 0.0002504 -0.0198752 0.0101365 0.0002504 -0.0267565 0.0101365 0.0002504 -0.0354624 0.0101365 0.0002504 -0.0464764 0.0101365 0.0002504 -0.0604106 0.0101365 0.0002504 -0.0780392 0.0101365 0.0002504 -0.1003416 0.0101365 0.0002504 -0.128557 0.0101365 0.0002504 -0.1642532 0.0101365 0.0002504 -0.2094136 0.0101365 0.0002504 -0.2665473 0.0101365 0.0002504 -0.3388289 0.0101365 0.0002504 -0.4302746 0.0101365 0.0002504 -0.5459652 0.0101365 0.0002504 -0.6923288 0.0101365 0.0002504 -0.8388802 0.014466 0.0050694 -0.9026634 0.0354305 0.0276479 -0.9351449 0.0682373 0.0621069 -0.9543974 0.110344 0.1056375 -0.9668479 0.1604514 0.156904 -0.9753591 0.2174438 0.2148124 -0.9814002 0.2800162 0.2780936 -0.9858036 0.3465628 0.3451791 -0.9890755 0.4152122 0.4142311 -0.9915418 0.4839603 0.4832747 -0.9934209 0.5508547 0.5503825 -0.9948643 0.6141822 0.6138613 -0.9959801 0.6726113 0.6723959 -0.9968468 0.7252656 0.7251226 -0.9975226 0.7717228 0.7716288 -0.998051 0.8119561 0.8118949 -0.9984652 0.8462429 0.8462034 -0.9987904 0.875064 0.8750386 -0.9990461 0.8990131 0.8989969 -0.9992474 0.918724 0.9187137 -0.9994059 0.9348193 0.9348128 -0.999531 0.947878 0.9478738 -0.9996296 0.9584176 0.958415 -0.9997074 0.9668883 0.9668867 -0.9997689 0.9736733 0.9736722 -0.9998174 0.9790931 0.9790925 -0.9998557 0.9834132 0.9834128 -0.999886 0.9868507 0.9868504 -0.9999099 0.9895821 0.9895819 -0.9999288 0.9917502 0.9917501 -0.9999437 0.9934695 0.9934695 -0.0000238 0.0185862 0.0044007 -0.0000382 0.0180827 0.0038972 -0.0000611 0.0174505 0.003265 -0.0000978 0.0166583 0.0024729 -0.0001565 0.0156685 0.001483 -0.0002504 0.0144359 0.0002504 -0.0019287 0.0144359 0.0002504 -0.004052 0.0144359 0.0002504 -0.0067381 0.0144359 0.0002504 -0.0101365 0.0144359 0.0002504 -0.0144359 0.0144359 0.0002504 -0.0198752 0.0144359 0.0002504 -0.0267565 0.0144359 0.0002504 -0.0354624 0.0144359 0.0002504 -0.0464764 0.0144359 0.0002504 -0.0604106 0.0144359 0.0002504 -0.0780392 0.0144359 0.0002504 -0.1003416 0.0144359 0.0002504 -0.128557 0.0144359 0.0002504 -0.1642532 0.0144359 0.0002504 -0.2094136 0.0144359 0.0002504 -0.2665473 0.0144359 0.0002504 -0.3388289 0.0144359 0.0002504 -0.4302746 0.0144359 0.0002504 -0.5459652 0.0144359 0.0002504 -0.6923288 0.0144359 0.0002504 -0.8388802 0.0185525 0.0050694 -0.9026634 0.0388151 0.0276479 -0.9351449 0.0709034 0.0621069 -0.9543974 0.1123908 0.1056375 -0.9668479 0.1619942 0.156904 -0.9753591 0.2185882 0.2148124 -0.9814002 0.2808523 0.2780936 -0.9858036 0.3471646 0.3451791 -0.9890755 0.4156389 0.4142311 -0.9915418 0.4842584 0.4832747 -0.9934209 0.5510601 0.5503825 -0.9948643 0.6143218 0.6138613 -0.9959801 0.672705 0.6723959 -0.9968468 0.7253278 0.7251226 -0.9975226 0.7717636 0.7716288 -0.998051 0.8119828 0.8118949 -0.9984652 0.8462601 0.8462034 -0.9987904 0.8750751 0.8750386 -0.9990461 0.8990202 0.8989969 -0.9992474 0.9187285 0.9187137 -0.9994059 0.9348222 0.9348128 -0.999531 0.9478798 0.9478738 -0.9996296 0.9584187 0.958415 -0.9997074 0.966889 0.9668867 -0.9997689 0.9736737 0.9736722 -0.9998174 0.9790934 0.9790925 -0.9998557 0.9834134 0.9834128 -0.999886 0.9868508 0.9868504 -0.9999099 0.9895822 0.9895819 -0.9999288 0.9917502 0.9917501 -0.9999437 0.9934696 0.9934695 -0.0000238 0.0240255 0.0044007 -0.0000382 0.023522 0.0038972 -0.0000611 0.0228898 0.003265 -0.0000978 0.0220976 0.0024729 -0.0001565 0.0211078 0.001483 -0.0002504 0.0198752 0.0002504 -0.0019287 0.0198752 0.0002504 -0.004052 0.0198752 0.0002504 -0.0067381 0.0198752 0.0002504 -0.0101365 0.0198752 0.0002504 -0.0144359 0.0198752 0.0002504 -0.0198752 0.0198752 0.0002504 -0.0267565 0.0198752 0.0002504 -0.0354624 0.0198752 0.0002504 -0.0464764 0.0198752 0.0002504 -0.0604106 0.0198752 0.0002504 -0.0780392 0.0198752 0.0002504 -0.1003416 0.0198752 0.0002504 -0.128557 0.0198752 0.0002504 -0.1642532 0.0198752 0.0002504 -0.2094136 0.0198752 0.0002504 -0.2665473 0.0198752 0.0002504 -0.3388289 0.0198752 0.0002504 -0.4302746 0.0198752 0.0002504 -0.5459652 0.0198752 0.0002504 -0.6923288 0.0198752 0.0002504 -0.8388802 0.0237224 0.0050694 -0.9026634 0.0430971 0.0276479 -0.9351449 0.0742763 0.0621069 -0.9543974 0.1149803 0.1056375 -0.9668479 0.1639459 0.156904 -0.9753591 0.220036 0.2148124 -0.9814002 0.28191 0.2780936 -0.9858036 0.3479259 0.3451791 -0.9890755 0.4161787 0.4142311 -0.9915418 0.4846356 0.4832747 -0.9934209 0.5513199 0.5503825 -0.9948643 0.6144984 0.6138613 -0.9959801 0.6728236 0.6723959 -0.9968468 0.7254064 0.7251226 -0.9975226 0.7718153 0.7716288 -0.998051 0.8120164 0.8118949 -0.9984652 0.8462819 0.8462034 -0.9987904 0.8750891 0.8750386 -0.9990461 0.8990291 0.8989969 -0.9992474 0.9187342 0.9187137 -0.9994059 0.9348258 0.9348128 -0.999531 0.947882 0.9478738 -0.9996296 0.9584202 0.958415 -0.9997074 0.9668899 0.9668867 -0.9997689 0.9736743 0.9736722 -0.9998174 0.9790938 0.9790925 -0.9998557 0.9834136 0.9834128 -0.999886 0.9868509 0.9868504 -0.9999099 0.9895823 0.9895819 -0.9999288 0.9917503 0.9917501 -0.9999437 0.9934696 0.9934695 -0.0000238 0.0309069 0.0044007 -0.0000382 0.0304033 0.0038972 -0.0000611 0.0297711 0.003265 -0.0000978 0.028979 0.0024729 -0.0001565 0.0279891 0.001483 -0.0002504 0.0267565 0.0002504 -0.0019287 0.0267565 0.0002504 -0.004052 0.0267565 0.0002504 -0.0067381 0.0267565 0.0002504 -0.0101365 0.0267565 0.0002504 -0.0144359 0.0267565 0.0002504 -0.0198752 0.0267565 0.0002504 -0.0267565 0.0267565 0.0002504 -0.0354624 0.0267565 0.0002504 -0.0464764 0.0267565 0.0002504 -0.0604106 0.0267565 0.0002504 -0.0780392 0.0267565 0.0002504 -0.1003416 0.0267565 0.0002504 -0.128557 0.0267565 0.0002504 -0.1642532 0.0267565 0.0002504 -0.2094136 0.0267565 0.0002504 -0.2665473 0.0267565 0.0002504 -0.3388289 0.0267565 0.0002504 -0.4302746 0.0267565 0.0002504 -0.5459652 0.0267565 0.0002504 -0.6923288 0.0267565 0.0002504 -0.8388802 0.0302631 0.0050694 -0.9026634 0.0485143 0.0276479 -0.9351449 0.0785435 0.0621069 -0.9543974 0.1182564 0.1056375 -0.9668479 0.1664151 0.156904 -0.9753591 0.2218676 0.2148124 -0.9814002 0.2832482 0.2780936 -0.9858036 0.348889 0.3451791 -0.9890755 0.4168617 0.4142311 -0.9915418 0.4851127 0.4832747 -0.9934209 0.5516486 0.5503825 -0.9948643 0.6147218 0.6138613 -0.9959801 0.6729735 0.6723959 -0.9968468 0.725506 0.7251226 -0.9975226 0.7718807 0.7716288 -0.998051 0.812059 0.8118949 -0.9984652 0.8463094 0.8462034 -0.9987904 0.8751068 0.8750386 -0.9990461 0.8990404 0.8989969 -0.9992474 0.9187414 0.9187137 -0.9994059 0.9348303 0.9348128 -0.999531 0.9478849 0.9478738 -0.9996296 0.958422 0.958415 -0.9997074 0.9668911 0.9668867 -0.9997689 0.973675 0.9736722 -0.9998174 0.9790942 0.9790925 -0.9998557 0.9834139 0.9834128 -0.999886 0.9868511 0.9868504 -0.9999099 0.9895824 0.9895819 -0.9999288 0.9917503 0.9917501 -0.9999437 0.9934696 0.9934695 -0.0000238 0.0396127 0.0044007 -0.0000382 0.0391092 0.0038972 -0.0000611 0.038477 0.003265 -0.0000978 0.0376849 0.0024729 -0.0001565 0.036695 0.001483 -0.0002504 0.0354624 0.0002504 -0.0019287 0.0354624 0.0002504 -0.004052 0.0354624 0.0002504 -0.0067381 0.0354624 0.0002504 -0.0101365 0.0354624 0.0002504 -0.0144359 0.0354624 0.0002504 -0.0198752 0.0354624 0.0002504 -0.0267565 0.0354624 0.0002504 -0.0354624 0.0354624 0.0002504 -0.0464764 0.0354624 0.0002504 -0.0604106 0.0354624 0.0002504 -0.0780392 0.0354624 0.0002504 -0.1003416 0.0354624 0.0002504 -0.128557 0.0354624 0.0002504 -0.1642532 0.0354624 0.0002504 -0.2094136 0.0354624 0.0002504 -0.2665473 0.0354624 0.0002504 -0.3388289 0.0354624 0.0002504 -0.4302746 0.0354624 0.0002504 -0.5459652 0.0354624 0.0002504 -0.6923288 0.0354624 0.0002504 -0.8388802 0.0385378 0.0050694 -0.9026634 0.0553678 0.0276479 -0.9351449 0.0839421 0.0621069 -0.9543974 0.122401 0.1056375 -0.9668479 0.169539 0.156904 -0.9753591 0.2241849 0.2148124 -0.9814002 0.2849413 0.2780936 -0.9858036 0.3501075 0.3451791 -0.9890755 0.4177256 0.4142311 -0.9915418 0.4857164 0.4832747 -0.9934209 0.5520645 0.5503825 -0.9948643 0.6150045 0.6138613 -0.9959801 0.6731633 0.6723959 -0.9968468 0.7256319 0.7251226 -0.9975226 0.7719634 0.7716288 -0.998051 0.8121129 0.8118949 -0.9984652 0.8463443 0.8462034 -0.9987904 0.8751292 0.8750386 -0.9990461 0.8990547 0.8989969 -0.9992474 0.9187505 0.9187137 -0.9994059 0.9348361 0.9348128 -0.999531 0.9478886 0.9478738 -0.9996296 0.9584243 0.958415 -0.9997074 0.9668925 0.9668867 -0.9997689 0.9736759 0.9736722 -0.9998174 0.9790948 0.9790925 -0.9998557 0.9834142 0.9834128 -0.999886 0.9868513 0.9868504 -0.9999099 0.9895825 0.9895819 -0.9999288 0.9917504 0.9917501 -0.9999437 0.9934697 0.9934695 -0.0000238 0.0506267 0.0044007 -0.0000382 0.0501232 0.0038972 -0.0000611 0.049491 0.003265 -0.0000978 0.0486989 0.0024729 -0.0001565 0.047709 0.001483 -0.0002504 0.0464764 0.0002504 -0.0019287 0.0464764 0.0002504 -0.004052 0.0464764 0.0002504 -0.0067381 0.0464764 0.0002504 -0.0101365 0.0464764 0.0002504 -0.0144359 0.0464764 0.0002504 -0.0198752 0.0464764 0.0002504 -0.0267565 0.0464764 0.0002504 -0.0354624 0.0464764 0.0002504 -0.0464764 0.0464764 0.0002504 -0.0604106 0.0464764 0.0002504 -0.0780392 0.0464764 0.0002504 -0.1003416 0.0464764 0.0002504 -0.128557 0.0464764 0.0002504 -0.1642532 0.0464764 0.0002504 -0.2094136 0.0464764 0.0002504 -0.2665473 0.0464764 0.0002504 -0.3388289 0.0464764 0.0002504 -0.4302746 0.0464764 0.0002504 -0.5459652 0.0464764 0.0002504 -0.6923288 0.0464764 0.0002504 -0.8388802 0.0490065 0.0050694 -0.9026634 0.0640384 0.0276479 -0.9351449 0.090772 0.0621069 -0.9543974 0.1276445 0.1056375 -0.9668479 0.1734912 0.156904 -0.9753591 0.2271165 0.2148124 -0.9814002 0.2870831 0.2780936 -0.9858036 0.351649 0.3451791 -0.9890755 0.4188187 0.4142311 -0.9915418 0.4864802 0.4832747 -0.9934209 0.5525906 0.5503825 -0.9948643 0.6153621 0.6138613 -0.9959801 0.6734033 0.6723959 -0.9968468 0.7257912 0.7251226 -0.9975226 0.7720681 0.7716288 -0.998051 0.8121811 0.8118949 -0.9984652 0.8463884 0.8462034 -0.9987904 0.8751575 0.8750386 -0.9990461 0.8990728 0.8989969 -0.9992474 0.918762 0.9187137 -0.9994059 0.9348434 0.9348128 -0.999531 0.9478932 0.9478738 -0.9996296 0.9584272 0.958415 -0.9997074 0.9668944 0.9668867 -0.9997689 0.973677 0.9736722 -0.9998174 0.9790955 0.9790925 -0.9998557 0.9834147 0.9834128 -0.999886 0.9868516 0.9868504 -0.9999099 0.9895827 0.9895819 -0.9999288 0.9917505 0.9917501 -0.9999437 0.9934698 0.9934695 -0.0000238 0.0645609 0.0044007 -0.0000382 0.0640574 0.0038972 -0.0000611 0.0634252 0.003265 -0.0000978 0.0626331 0.0024729 -0.0001565 0.0616432 0.001483 -0.0002504 0.0604106 0.0002504 -0.0019287 0.0604106 0.0002504 -0.004052 0.0604106 0.0002504 -0.0067381 0.0604106 0.0002504 -0.0101365 0.0604106 0.0002504 -0.0144359 0.0604106 0.0002504 -0.0198752 0.0604106 0.0002504 -0.0267565 0.0604106 0.0002504 -0.0354624 0.0604106 0.0002504 -0.0464764 0.0604106 0.0002504 -0.0604106 0.0604106 0.0002504 -0.0780392 0.0604106 0.0002504 -0.1003416 0.0604106 0.0002504 -0.128557 0.0604106 0.0002504 -0.1642532 0.0604106 0.0002504 -0.2094136 0.0604106 0.0002504 -0.2665473 0.0604106 0.0002504 -0.3388289 0.0604106 0.0002504 -0.4302746 0.0604106 0.0002504 -0.5459652 0.0604106 0.0002504 -0.6923288 0.0604106 0.0002504 -0.8388802 0.0622508 0.0050694 -0.9026634 0.0750078 0.0276479 -0.9351449 0.0994127 0.0621069 -0.9543974 0.1342782 0.1056375 -0.9668479 0.1784912 0.156904 -0.9753591 0.2308255 0.2148124 -0.9814002 0.2897929 0.2780936 -0.9858036 0.3535993 0.3451791 -0.9890755 0.4202016 0.4142311 -0.9915418 0.4874464 0.4832747 -0.9934209 0.5532562 0.5503825 -0.9948643 0.6158144 0.6138613 -0.9959801 0.6737069 0.6723959 -0.9968468 0.7259927 0.7251226 -0.9975226 0.7722005 0.7716288 -0.998051 0.8122673 0.8118949 -0.9984652 0.8464441 0.8462034 -0.9987904 0.8751933 0.8750386 -0.9990461 0.8990957 0.8989969 -0.9992474 0.9187765 0.9187137 -0.9994059 0.9348526 0.9348128 -0.999531 0.947899 0.9478738 -0.9996296 0.9584309 0.958415 -0.9997074 0.9668967 0.9668867 -0.9997689 0.9736785 0.9736722 -0.9998174 0.9790964 0.9790925 -0.9998557 0.9834152 0.9834128 -0.999886 0.986852 0.9868504 -0.9999099 0.9895829 0.9895819 -0.9999288 0.9917507 0.9917501 -0.9999437 0.9934698 0.9934695 -0.0000238 0.0821895 0.0044007 -0.0000382 0.081686 0.0038972 -0.0000611 0.0810538 0.003265 -0.0000978 0.0802616 0.0024729 -0.0001565 0.0792718 0.001483 -0.0002504 0.0780392 0.0002504 -0.0019287 0.0780392 0.0002504 -0.004052 0.0780392 0.0002504 -0.0067381 0.0780392 0.0002504 -0.0101365 0.0780392 0.0002504 -0.0144359 0.0780392 0.0002504 -0.0198752 0.0780392 0.0002504 -0.0267565 0.0780392 0.0002504 -0.0354624 0.0780392 0.0002504 -0.0464764 0.0780392 0.0002504 -0.0604106 0.0780392 0.0002504 -0.0780392 0.0780392 0.0002504 -0.1003416 0.0780392 0.0002504 -0.128557 0.0780392 0.0002504 -0.1642532 0.0780392 0.0002504 -0.2094136 0.0780392 0.0002504 -0.2665473 0.0780392 0.0002504 -0.3388289 0.0780392 0.0002504 -0.4302746 0.0780392 0.0002504 -0.5459652 0.0780392 0.0002504 -0.6923288 0.0780392 0.0002504 -0.8388802 0.0790064 0.0050694 -0.9026634 0.0888856 0.0276479 -0.9351449 0.1103442 0.0621069 -0.9543974 0.1426706 0.1056375 -0.9668479 0.1848168 0.156904 -0.9753591 0.2355177 0.2148124 -0.9814002 0.2932211 0.2780936 -0.9858036 0.3560667 0.3451791 -0.9890755 0.4219511 0.4142311 -0.9915418 0.4886689 0.4832747 -0.9934209 0.5540983 0.5503825 -0.9948643 0.6163868 0.6138613 -0.9959801 0.6740911 0.6723959 -0.9968468 0.7262477 0.7251226 -0.9975226 0.7723681 0.7716288 -0.998051 0.8123765 0.8118949 -0.9984652 0.8465147 0.8462034 -0.9987904 0.8752386 0.8750386 -0.9990461 0.8991246 0.8989969 -0.9992474 0.918795 0.9187137 -0.9994059 0.9348643 0.9348128 -0.999531 0.9479064 0.9478738 -0.9996296 0.9584355 0.958415 -0.9997074 0.9668996 0.9668867 -0.9997689 0.9736803 0.9736722 -0.9998174 0.9790976 0.9790925 -0.9998557 0.983416 0.9834128 -0.999886 0.9868524 0.9868504 -0.9999099 0.9895832 0.9895819 -0.9999288 0.9917508 0.9917501 -0.9999437 0.99347 0.9934695 -0.0000238 0.1044919 0.0044007 -0.0000382 0.1039884 0.0038972 -0.0000611 0.1033562 0.003265 -0.0000978 0.102564 0.0024729 -0.0001565 0.1015742 0.001483 -0.0002504 0.1003416 0.0002504 -0.0019287 0.1003416 0.0002504 -0.004052 0.1003416 0.0002504 -0.0067381 0.1003416 0.0002504 -0.0101365 0.1003416 0.0002504 -0.0144359 0.1003416 0.0002504 -0.0198752 0.1003416 0.0002504 -0.0267565 0.1003416 0.0002504 -0.0354624 0.1003416 0.0002504 -0.0464764 0.1003416 0.0002504 -0.0604106 0.1003416 0.0002504 -0.0780392 0.1003416 0.0002504 -0.1003416 0.1003416 0.0002504 -0.128557 0.1003416 0.0002504 -0.1642532 0.1003416 0.0002504 -0.2094136 0.1003416 0.0002504 -0.2665473 0.1003416 0.0002504 -0.3388289 0.1003416 0.0002504 -0.4302746 0.1003416 0.0002504 -0.5459652 0.1003416 0.0002504 -0.6923288 0.1003416 0.0002504 -0.8388802 0.1002045 0.0050694 -0.9026634 0.1064427 0.0276479 -0.9351449 0.1241741 0.0621069 -0.9543974 0.1532882 0.1056375 -0.9668479 0.1928195 0.156904 -0.9753591 0.2414541 0.2148124 -0.9814002 0.2975582 0.2780936 -0.9858036 0.3591882 0.3451791 -0.9890755 0.4241644 0.4142311 -0.9915418 0.4902154 0.4832747 -0.9934209 0.5551637 0.5503825 -0.9948643 0.6171109 0.6138613 -0.9959801 0.6745771 0.6723959 -0.9968468 0.7265703 0.7251226 -0.9975226 0.77258 0.7716288 -0.998051 0.8125145 0.8118949 -0.9984652 0.8466039 0.8462034 -0.9987904 0.8752959 0.8750386 -0.9990461 0.8991613 0.8989969 -0.9992474 0.9188183 0.9187137 -0.9994059 0.9348791 0.9348128 -0.999531 0.9479157 0.9478738 -0.9996296 0.9584414 0.958415 -0.9997074 0.9669033 0.9668867 -0.9997689 0.9736827 0.9736722 -0.9998174 0.979099 0.9790925 -0.9998557 0.9834169 0.9834128 -0.999886 0.986853 0.9868504 -0.9999099 0.9895836 0.9895819 -0.9999288 0.9917511 0.9917501 -0.9999437 0.9934701 0.9934695 -0.0000238 0.1327073 0.0044007 -0.0000382 0.1322038 0.0038972 -0.0000611 0.1315716 0.003265 -0.0000978 0.1307795 0.0024729 -0.0001565 0.1297896 0.001483 -0.0002504 0.128557 0.0002504 -0.0019287 0.128557 0.0002504 -0.004052 0.128557 0.0002504 -0.0067381 0.128557 0.0002504 -0.0101365 0.128557 0.0002504 -0.0144359 0.128557 0.0002504 -0.0198752 0.128557 0.0002504 -0.0267565 0.128557 0.0002504 -0.0354624 0.128557 0.0002504 -0.0464764 0.128557 0.0002504 -0.0604106 0.128557 0.0002504 -0.0780392 0.128557 0.0002504 -0.1003416 0.128557 0.0002504 -0.128557 0.128557 0.0002504 -0.1642532 0.128557 0.0002504 -0.2094136 0.128557 0.0002504 -0.2665473 0.128557 0.0002504 -0.3388289 0.128557 0.0002504 -0.4302746 0.128557 0.0002504 -0.5459652 0.128557 0.0002504 -0.6923288 0.128557 0.0002504 -0.8388802 0.1270229 0.0050694 -0.9026634 0.1286548 0.0276479 -0.9351449 0.1416707 0.0621069 -0.9543974 0.1667209 0.1056375 -0.9668479 0.202944 0.156904 -0.9753591 0.2489643 0.2148124 -0.9814002 0.3030452 0.2780936 -0.9858036 0.3631373 0.3451791 -0.9890755 0.4269646 0.4142311 -0.9915418 0.4921719 0.4832747 -0.9934209 0.5565115 0.5503825 -0.9948643 0.6180269 0.6138613 -0.9959801 0.675192 0.6723959 -0.9968468 0.7269784 0.7251226 -0.9975226 0.7728482 0.7716288 -0.998051 0.8126892 0.8118949 -0.9984652 0.8467168 0.8462034 -0.9987904 0.8753685 0.8750386 -0.9990461 0.8992076 0.8989969 -0.9992474 0.9188478 0.9187137 -0.9994059 0.9348978 0.9348128 -0.999531 0.9479276 0.9478738 -0.9996296 0.9584489 0.958415 -0.9997074 0.966908 0.9668867 -0.9997689 0.9736856 0.9736722 -0.9998174 0.9791009 0.9790925 -0.9998557 0.9834181 0.9834128 -0.999886 0.9868537 0.9868504 -0.9999099 0.989584 0.9895819 -0.9999288 0.9917514 0.9917501 -0.9999437 0.9934703 0.9934695 -0.0000238 0.1684036 0.0044007 -0.0000382 0.1679 0.0038972 -0.0000611 0.1672678 0.003265 -0.0000978 0.1664757 0.0024729 -0.0001565 0.1654858 0.001483 -0.0002504 0.1642532 0.0002504 -0.0019287 0.1642532 0.0002504 -0.004052 0.1642532 0.0002504 -0.0067381 0.1642532 0.0002504 -0.0101365 0.1642532 0.0002504 -0.0144359 0.1642532 0.0002504 -0.0198752 0.1642532 0.0002504 -0.0267565 0.1642532 0.0002504 -0.0354624 0.1642532 0.0002504 -0.0464764 0.1642532 0.0002504 -0.0604106 0.1642532 0.0002504 -0.0780392 0.1642532 0.0002504 -0.1003416 0.1642532 0.0002504 -0.128557 0.1642532 0.0002504 -0.1642532 0.1642532 0.0002504 -0.2094136 0.1642532 0.0002504 -0.2665473 0.1642532 0.0002504 -0.3388289 0.1642532 0.0002504 -0.4302746 0.1642532 0.0002504 -0.5459652 0.1642532 0.0002504 -0.6923288 0.1642532 0.0002504 -0.8388802 0.1609516 0.0050694 -0.9026634 0.156756 0.0276479 -0.9351449 0.1638062 0.0621069 -0.9543974 0.1837149 0.1056375 -0.9668479 0.2157528 0.156904 -0.9753591 0.2584657 0.2148124 -0.9814002 0.309987 0.2780936 -0.9858036 0.3681334 0.3451791 -0.9890755 0.4305072 0.4142311 -0.9915418 0.4946472 0.4832747 -0.9934209 0.5582166 0.5503825 -0.9948643 0.6191858 0.6138613 -0.9959801 0.6759699 0.6723959 -0.9968468 0.7274947 0.7251226 -0.9975226 0.7731874 0.7716288 -0.998051 0.8129101 0.8118949 -0.9984652 0.8468597 0.8462034 -0.9987904 0.8754602 0.8750386 -0.9990461 0.8992663 0.8989969 -0.9992474 0.9188851 0.9187137 -0.9994059 0.9349215 0.9348128 -0.999531 0.9479425 0.9478738 -0.9996296 0.9584583 0.958415 -0.9997074 0.966914 0.9668867 -0.9997689 0.9736894 0.9736722 -0.9998174 0.9791032 0.9790925 -0.9998557 0.9834195 0.9834128 -0.999886 0.9868546 0.9868504 -0.9999099 0.9895846 0.9895819 -0.9999288 0.9917517 0.9917501 -0.9999437 0.9934705 0.9934695 -0.0000238 0.2135639 0.0044007 -0.0000382 0.2130604 0.0038972 -0.0000611 0.2124282 0.003265 -0.0000978 0.2116361 0.0024729 -0.0001565 0.2106462 0.001483 -0.0002504 0.2094136 0.0002504 -0.0019287 0.2094136 0.0002504 -0.004052 0.2094136 0.0002504 -0.0067381 0.2094136 0.0002504 -0.0101365 0.2094136 0.0002504 -0.0144359 0.2094136 0.0002504 -0.0198752 0.2094136 0.0002504 -0.0267565 0.2094136 0.0002504 -0.0354624 0.2094136 0.0002504 -0.0464764 0.2094136 0.0002504 -0.0604106 0.2094136 0.0002504 -0.0780392 0.2094136 0.0002504 -0.1003416 0.2094136 0.0002504 -0.128557 0.2094136 0.0002504 -0.1642532 0.2094136 0.0002504 -0.2094136 0.2094136 0.0002504 -0.2665473 0.2094136 0.0002504 -0.3388289 0.2094136 0.0002504 -0.4302746 0.2094136 0.0002504 -0.5459652 0.2094136 0.0002504 -0.6923288 0.2094136 0.0002504 -0.8388802 0.2038759 0.0050694 -0.9026634 0.1923076 0.0276479 -0.9351449 0.1918104 0.0621069 -0.9543974 0.2052145 0.1056375 -0.9668479 0.2319575 0.156904 -0.9753591 0.2704863 0.2148124 -0.9814002 0.3187692 0.2780936 -0.9858036 0.3744542 0.3451791 -0.9890755 0.434989 0.4142311 -0.9915418 0.4977788 0.4832747 -0.9934209 0.5603739 0.5503825 -0.9948643 0.620652 0.6138613 -0.9959801 0.6769541 0.6723959 -0.9968468 0.7281478 0.7251226 -0.9975226 0.7736166 0.7716288 -0.998051 0.8131897 0.8118949 -0.9984652 0.8470404 0.8462034 -0.9987904 0.8755763 0.8750386 -0.9990461 0.8993405 0.8989969 -0.9992474 0.9189323 0.9187137 -0.9994059 0.9349514 0.9348128 -0.999531 0.9479614 0.9478738 -0.9996296 0.9584702 0.958415 -0.9997074 0.9669215 0.9668867 -0.9997689 0.9736941 0.9736722 -0.9998174 0.9791062 0.9790925 -0.9998557 0.9834214 0.9834128 -0.999886 0.9868558 0.9868504 -0.9999099 0.9895853 0.9895819 -0.9999288 0.9917522 0.9917501 -0.9999437 0.9934708 0.9934695 -0.0000238 0.2706977 0.0044007 -0.0000382 0.2701941 0.0038972 -0.0000611 0.2695619 0.003265 -0.0000978 0.2687698 0.0024729 -0.0001565 0.2677799 0.001483 -0.0002504 0.2665473 0.0002504 -0.0019287 0.2665473 0.0002504 -0.004052 0.2665473 0.0002504 -0.0067381 0.2665473 0.0002504 -0.0101365 0.2665473 0.0002504 -0.0144359 0.2665473 0.0002504 -0.0198752 0.2665473 0.0002504 -0.0267565 0.2665473 0.0002504 -0.0354624 0.2665473 0.0002504 -0.0464764 0.2665473 0.0002504 -0.0604106 0.2665473 0.0002504 -0.0780392 0.2665473 0.0002504 -0.1003416 0.2665473 0.0002504 -0.128557 0.2665473 0.0002504 -0.1642532 0.2665473 0.0002504 -0.2094136 0.2665473 0.0002504 -0.2665473 0.2665473 0.0002504 -0.3388289 0.2665473 0.0002504 -0.4302746 0.2665473 0.0002504 -0.5459652 0.2665473 0.0002504 -0.6923288 0.2665473 0.0002504 -0.8388802 0.2581807 0.0050694 -0.9026634 0.2372851 0.0276479 -0.9351449 0.2272394 0.0621069 -0.9543974 0.2324144 0.1056375 -0.9668479 0.2524587 0.156904 -0.9753591 0.2856938 0.2148124 -0.9814002 0.3298799 0.2780936 -0.9858036 0.3824508 0.3451791 -0.9890755 0.4406591 0.4142311 -0.9915418 0.5017407 0.4832747 -0.9934209 0.5631031 0.5503825 -0.9948643 0.6225069 0.6138613 -0.9959801 0.6781992 0.6723959 -0.9968468 0.7289742 0.7251226 -0.9975226 0.7741595 0.7716288 -0.998051 0.8135433 0.8118949 -0.9984652 0.847269 0.8462034 -0.9987904 0.8757232 0.8750386 -0.9990461 0.8994343 0.8989969 -0.9992474 0.918992 0.9187137 -0.9994059 0.9349892 0.9348128 -0.999531 0.9479854 0.9478738 -0.9996296 0.9584853 0.958415 -0.9997074 0.966931 0.9668867 -0.9997689 0.9737 0.9736722 -0.9998174 0.9791099 0.9790925 -0.9998557 0.9834237 0.9834128 -0.999886 0.9868573 0.9868504 -0.9999099 0.9895862 0.9895819 -0.9999288 0.9917527 0.9917501 -0.9999437 0.9934711 0.9934695 -0.0000238 0.3429792 0.0044007 -0.0000382 0.3424757 0.0038972 -0.0000611 0.3418435 0.003265 -0.0000978 0.3410514 0.0024729 -0.0001565 0.3400615 0.001483 -0.0002504 0.3388289 0.0002504 -0.0019287 0.3388289 0.0002504 -0.004052 0.3388289 0.0002504 -0.0067381 0.3388289 0.0002504 -0.0101365 0.3388289 0.0002504 -0.0144359 0.3388289 0.0002504 -0.0198752 0.3388289 0.0002504 -0.0267565 0.3388289 0.0002504 -0.0354624 0.3388289 0.0002504 -0.0464764 0.3388289 0.0002504 -0.0604106 0.3388289 0.0002504 -0.0780392 0.3388289 0.0002504 -0.1003416 0.3388289 0.0002504 -0.128557 0.3388289 0.0002504 -0.1642532 0.3388289 0.0002504 -0.2094136 0.3388289 0.0002504 -0.2665473 0.3388289 0.0002504 -0.3388289 0.3388289 0.0002504 -0.4302746 0.3388289 0.0002504 -0.5459652 0.3388289 0.0002504 -0.6923288 0.3388289 0.0002504 -0.8388802 0.3268833 0.0050694 -0.9026634 0.2941874 0.0276479 -0.9351449 0.2720617 0.0621069 -0.9543974 0.2668257 0.1056375 -0.9668479 0.2783953 0.156904 -0.9753591 0.3049333 0.2148124 -0.9814002 0.3439364 0.2780936 -0.9858036 0.3925675 0.3451791 -0.9890755 0.4478326 0.4142311 -0.9915418 0.5067529 0.4832747 -0.9934209 0.5665559 0.5503825 -0.9948643 0.6248536 0.6138613 -0.9959801 0.6797744 0.6723959 -0.9968468 0.7300196 0.7251226 -0.9975226 0.7748465 0.7716288 -0.998051 0.8139908 0.8118949 -0.9984652 0.8475583 0.8462034 -0.9987904 0.875909 0.8750386 -0.9990461 0.8995531 0.8989969 -0.9992474 0.9190675 0.9187137 -0.9994059 0.9350371 0.9348128 -0.999531 0.9480156 0.9478738 -0.9996296 0.9585044 0.958415 -0.9997074 0.966943 0.9668867 -0.9997689 0.9737076 0.9736722 -0.9998174 0.9791147 0.9790925 -0.9998557 0.9834267 0.9834128 -0.999886 0.9868591 0.9868504 -0.9999099 0.9895874 0.9895819 -0.9999288 0.9917535 0.9917501 -0.9999437 0.9934716 0.9934695 -0.0000238 0.4344249 0.0044007 -0.0000382 0.4339214 0.0038972 -0.0000611 0.4332891 0.003265 -0.0000978 0.432497 0.0024729 -0.0001565 0.4315072 0.001483 -0.0002504 0.4302746 0.0002504 -0.0019287 0.4302746 0.0002504 -0.004052 0.4302746 0.0002504 -0.0067381 0.4302746 0.0002504 -0.0101365 0.4302746 0.0002504 -0.0144359 0.4302746 0.0002504 -0.0198752 0.4302746 0.0002504 -0.0267565 0.4302746 0.0002504 -0.0354624 0.4302746 0.0002504 -0.0464764 0.4302746 0.0002504 -0.0604106 0.4302746 0.0002504 -0.0780392 0.4302746 0.0002504 -0.1003416 0.4302746 0.0002504 -0.128557 0.4302746 0.0002504 -0.1642532 0.4302746 0.0002504 -0.2094136 0.4302746 0.0002504 -0.2665473 0.4302746 0.0002504 -0.3388289 0.4302746 0.0002504 -0.4302746 0.4302746 0.0002504 -0.5459652 0.4302746 0.0002504 -0.6923288 0.4302746 0.0002504 -0.8388802 0.413801 0.0050694 -0.9026634 0.3661762 0.0276479 -0.9351449 0.3287678 0.0621069 -0.9543974 0.3103605 0.1056375 -0.9668479 0.3112085 0.156904 -0.9753591 0.3292738 0.2148124 -0.9814002 0.3617196 0.2780936 -0.9858036 0.4053665 0.3451791 -0.9890755 0.4569079 0.4142311 -0.9915418 0.5130941 0.4832747 -0.9934209 0.5709241 0.5503825 -0.9948643 0.6278225 0.6138613 -0.9959801 0.6817672 0.6723959 -0.9968468 0.7313422 0.7251226 -0.9975226 0.7757155 0.7716288 -0.998051 0.8145568 0.8118949 -0.9984652 0.8479242 0.8462034 -0.9987904 0.8761441 0.8750386 -0.9990461 0.8997033 0.8989969 -0.9992474 0.9191631 0.9187137 -0.9994059 0.9350977 0.9348128 -0.999531 0.9480539 0.9478738 -0.9996296 0.9585286 0.958415 -0.9997074 0.9669582 0.9668867 -0.9997689 0.9737172 0.9736722 -0.9998174 0.9791207 0.9790925 -0.9998557 0.9834305 0.9834128 -0.999886 0.9868615 0.9868504 -0.9999099 0.9895889 0.9895819 -0.9999288 0.9917544 0.9917501 -0.9999437 0.9934722 0.9934695 -0.0000238 0.5501155 0.0044007 -0.0000382 0.549612 0.0038972 -0.0000611 0.5489798 0.003265 -0.0000978 0.5481876 0.0024729 -0.0001565 0.5471978 0.001483 -0.0002504 0.5459652 0.0002504 -0.0019287 0.5459652 0.0002504 -0.004052 0.5459652 0.0002504 -0.0067381 0.5459652 0.0002504 -0.0101365 0.5459652 0.0002504 -0.0144359 0.5459652 0.0002504 -0.0198752 0.5459652 0.0002504 -0.0267565 0.5459652 0.0002504 -0.0354624 0.5459652 0.0002504 -0.0464764 0.5459652 0.0002504 -0.0604106 0.5459652 0.0002504 -0.0780392 0.5459652 0.0002504 -0.1003416 0.5459652 0.0002504 -0.128557 0.5459652 0.0002504 -0.1642532 0.5459652 0.0002504 -0.2094136 0.5459652 0.0002504 -0.2665473 0.5459652 0.0002504 -0.3388289 0.5459652 0.0002504 -0.4302746 0.5459652 0.0002504 -0.5459652 0.5459652 0.0002504 -0.6923288 0.5459652 0.0002504 -0.8388802 0.5237632 0.0050694 -0.9026634 0.4572514 0.0276479 -0.9351449 0.4005083 0.0621069 -0.9543974 0.3654378 0.1056375 -0.9668479 0.3527215 0.156904 -0.9753591 0.3600677 0.2148124 -0.9814002 0.3842178 0.2780936 -0.9858036 0.4215589 0.3451791 -0.9890755 0.4683893 0.4142311 -0.9915418 0.5211165 0.4832747 -0.9934209 0.5764504 0.5503825 -0.9948643 0.6315785 0.6138613 -0.9959801 0.6842884 0.6723959 -0.9968468 0.7330155 0.7251226 -0.9975226 0.776815 0.7716288 -0.998051 0.815273 0.8118949 -0.9984652 0.8483872 0.8462034 -0.9987904 0.8764415 0.8750386 -0.9990461 0.8998934 0.8989969 -0.9992474 0.919284 0.9187137 -0.9994059 0.9351744 0.9348128 -0.999531 0.9481024 0.9478738 -0.9996296 0.9585591 0.958415 -0.9997074 0.9669774 0.9668867 -0.9997689 0.9737292 0.9736722 -0.9998174 0.9791283 0.9790925 -0.9998557 0.9834352 0.9834128 -0.999886 0.9868645 0.9868504 -0.9999099 0.9895908 0.9895819 -0.9999288 0.9917556 0.9917501 -0.9999437 0.9934729 0.9934695 -0.0000238 0.6964791 0.0044007 -0.0000382 0.6959756 0.0038972 -0.0000611 0.6953434 0.003265 -0.0000978 0.6945513 0.0024729 -0.0001565 0.6935614 0.001483 -0.0002504 0.6923288 0.0002504 -0.0019287 0.6923288 0.0002504 -0.004052 0.6923288 0.0002504 -0.0067381 0.6923288 0.0002504 -0.0101365 0.6923288 0.0002504 -0.0144359 0.6923288 0.0002504 -0.0198752 0.6923288 0.0002504 -0.0267565 0.6923288 0.0002504 -0.0354624 0.6923288 0.0002504 -0.0464764 0.6923288 0.0002504 -0.0604106 0.6923288 0.0002504 -0.0780392 0.6923288 0.0002504 -0.1003416 0.6923288 0.0002504 -0.128557 0.6923288 0.0002504 -0.1642532 0.6923288 0.0002504 -0.2094136 0.6923288 0.0002504 -0.2665473 0.6923288 0.0002504 -0.3388289 0.6923288 0.0002504 -0.4302746 0.6923288 0.0002504 -0.5459652 0.6923288 0.0002504 -0.6923288 0.6923288 0.0002504 -0.8388802 0.6628797 0.0050694 -0.9026634 0.5724735 0.0276479 -0.9351449 0.4912694 0.0621069 -0.9543974 0.4351176 0.1056375 -0.9668479 0.4052408 0.156904 -0.9753591 0.399026 0.2148124 -0.9814002 0.4126808 0.2780936 -0.9858036 0.4420444 0.3451791 -0.9890755 0.4829148 0.4142311 -0.9915418 0.5312658 0.4832747 -0.9934209 0.583442 0.5503825 -0.9948643 0.6363304 0.6138613 -0.9959801 0.687478 0.6723959 -0.9968468 0.7351325 0.7251226 -0.9975226 0.778206 0.7716288 -0.998051 0.816179 0.8118949 -0.9984652 0.8489729 0.8462034 -0.9987904 0.8768178 0.8750386 -0.9990461 0.9001338 0.8989969 -0.9992474 0.919437 0.9187137 -0.9994059 0.9352714 0.9348128 -0.999531 0.9481637 0.9478738 -0.9996296 0.9585978 0.958415 -0.9997074 0.9670018 0.9668867 -0.9997689 0.9737445 0.9736722 -0.9998174 0.9791379 0.9790925 -0.9998557 0.9834412 0.9834128 -0.999886 0.9868682 0.9868504 -0.9999099 0.9895931 0.9895819 -0.9999288 0.991757 0.9917501 -0.9999437 0.9934738 0.9934695 -0.0051514 0.8407292 0.0092997 -0.0051286 0.8405071 0.0087874 -0.0051047 0.8402274 0.0081437 -0.0050826 0.8398756 0.0073367 -0.0050676 0.8394338 0.0063275 -0.0050694 0.8388802 0.0050694 -0.0066646 0.8388802 0.0050694 -0.0086827 0.8388802 0.0050694 -0.0112359 0.8388802 0.0050694 -0.014466 0.8388802 0.0050694 -0.0185525 0.8388802 0.0050694 -0.0237224 0.8388802 0.0050694 -0.0302631 0.8388802 0.0050694 -0.0385378 0.8388802 0.0050694 -0.0490065 0.8388802 0.0050694 -0.0622508 0.8388802 0.0050694 -0.0790064 0.8388802 0.0050694 -0.1002045 0.8388802 0.0050694 -0.1270229 0.8388802 0.0050694 -0.1609516 0.8388802 0.0050694 -0.2038759 0.8388802 0.0050694 -0.2581807 0.8388802 0.0050694 -0.3268833 0.8388802 0.0050694 -0.413801 0.8388802 0.0050694 -0.5237632 0.8388802 0.0050694 -0.6628797 0.8388802 0.0050694 -0.8388802 0.8388802 0.0050694 -0.9026634 0.7182443 0.0276479 -0.9351449 0.6060939 0.0621069 -0.9543974 0.5232717 0.1056375 -0.9668479 0.4716846 0.156904 -0.9753591 0.4483133 0.2148124 -0.9814002 0.4486903 0.2780936 -0.9858036 0.4679612 0.3451791 -0.9890755 0.5012915 0.4142311 -0.9915418 0.5441061 0.4832747 -0.9934209 0.5922872 0.5503825 -0.9948643 0.6423421 0.6138613 -0.9959801 0.6915133 0.6723959 -0.9968468 0.7378107 0.7251226 -0.9975226 0.7799657 0.7716288 -0.998051 0.8173252 0.8118949 -0.9984652 0.8497139 0.8462034 -0.9987904 0.8772938 0.8750386 -0.9990461 0.900438 0.8989969 -0.9992474 0.9196306 0.9187137 -0.9994059 0.9353941 0.9348128 -0.999531 0.9482413 0.9478738 -0.9996296 0.9586467 0.958415 -0.9997074 0.9670325 0.9668867 -0.9997689 0.9737639 0.9736722 -0.9998174 0.97915 0.9790925 -0.9998557 0.9834489 0.9834128 -0.999886 0.986873 0.9868504 -0.9999099 0.9895961 0.9895819 -0.9999288 0.9917589 0.9917501 -0.9999437 0.993475 0.9934695 -0.0279321 0.9033413 0.0313658 -0.0278872 0.9032596 0.0309159 -0.0278347 0.9031567 0.0303505 -0.0277752 0.9030276 0.0296415 -0.0277111 0.9028657 0.0287543 -0.0276479 0.9026634 0.0276479 -0.0289691 0.9026634 0.0276479 -0.0306405 0.9026634 0.0276479 -0.0327552 0.9026634 0.0276479 -0.0354305 0.9026634 0.0276479 -0.0388151 0.9026634 0.0276479 -0.0430971 0.9026634 0.0276479 -0.0485143 0.9026634 0.0276479 -0.0553678 0.9026634 0.0276479 -0.0640384 0.9026634 0.0276479 -0.0750078 0.9026634 0.0276479 -0.0888856 0.9026634 0.0276479 -0.1064427 0.9026634 0.0276479 -0.1286548 0.9026634 0.0276479 -0.156756 0.9026634 0.0276479 -0.1923076 0.9026634 0.0276479 -0.2372851 0.9026634 0.0276479 -0.2941874 0.9026634 0.0276479 -0.3661762 0.9026634 0.0276479 -0.4572514 0.9026634 0.0276479 -0.5724735 0.9026634 0.0276479 -0.7182443 0.9026634 0.0276479 -0.9026634 0.9026634 0.0276479 -0.9351449 0.751362 0.0621069 -0.9543974 0.634798 0.1056375 -0.9668479 0.5557446 0.156904 -0.9753591 0.5106681 0.2148124 -0.9814002 0.494247 0.2780936 -0.9858036 0.5007493 0.3451791 -0.9890755 0.5245404 0.4142311 -0.9915418 0.5603507 0.4832747 -0.9934209 0.6034776 0.5503825 -0.9948643 0.6499478 0.6138613 -0.9959801 0.6966184 0.6723959 -0.9968468 0.7411989 0.7251226 -0.9975226 0.782192 0.7716288 -0.998051 0.8187753 0.8118949 -0.9984652 0.8506514 0.8462034 -0.9987904 0.8778961 0.8750386 -0.9990461 0.9008228 0.8989969 -0.9992474 0.9198754 0.9187137 -0.9994059 0.9355493 0.9348128 -0.999531 0.9483394 0.9478738 -0.9996296 0.9587086 0.958415 -0.9997074 0.9670715 0.9668867 -0.9997689 0.9737884 0.9736722 -0.9998174 0.9791654 0.9790925 -0.9998557 0.9834585 0.9834128 -0.999886 0.9868791 0.9868504 -0.9999099 0.9895999 0.9895819 -0.9999288 0.9917613 0.9917501 -0.9999437 0.9934765 0.9934695 -0.0624569 0.9354466 0.0651625 -0.0624063 0.9354101 0.0647927 -0.0623458 0.9353643 0.064328 -0.0622749 0.9353068 0.0637452 -0.0621943 0.9352348 0.0630161 -0.0621069 0.9351449 0.0621069 -0.0631476 0.9351449 0.0621069 -0.0644643 0.9351449 0.0621069 -0.06613 0.9351449 0.0621069 -0.0682373 0.9351449 0.0621069 -0.0709034 0.9351449 0.0621069 -0.0742763 0.9351449 0.0621069 -0.0785435 0.9351449 0.0621069 -0.0839421 0.9351449 0.0621069 -0.090772 0.9351449 0.0621069 -0.0994127 0.9351449 0.0621069 -0.1103442 0.9351449 0.0621069 -0.1241741 0.9351449 0.0621069 -0.1416707 0.9351449 0.0621069 -0.1638062 0.9351449 0.0621069 -0.1918104 0.9351449 0.0621069 -0.2272394 0.9351449 0.0621069 -0.2720617 0.9351449 0.0621069 -0.3287678 0.9351449 0.0621069 -0.4005083 0.9351449 0.0621069 -0.4912694 0.9351449 0.0621069 -0.6060939 0.9351449 0.0621069 -0.751362 0.9351449 0.0621069 -0.9351449 0.9351449 0.0621069 -0.9543974 0.7758934 0.1056375 -0.9668479 0.6620914 0.156904 -0.9753591 0.589555 0.2148124 -0.9814002 0.5518821 0.2780936 -0.9858036 0.5422305 0.3451791 -0.9890755 0.5539533 0.4142311 -0.9915418 0.5809023 0.4832747 -0.9934209 0.6176349 0.5503825 -0.9948643 0.6595699 0.6138613 -0.9959801 0.7030771 0.6723959 -0.9968468 0.7454855 0.7251226 -0.9975226 0.7850086 0.7716288 -0.998051 0.8206099 0.8118949 -0.9984652 0.8518374 0.8462034 -0.9987904 0.878658 0.8750386 -0.9990461 0.9013097 0.8989969 -0.9992474 0.9201852 0.9187137 -0.9994059 0.9357457 0.9348128 -0.999531 0.9484635 0.9478738 -0.9996296 0.9587869 0.958415 -0.9997074 0.9671208 0.9668867 -0.9997689 0.9738193 0.9736722 -0.9998174 0.9791848 0.9790925 -0.9998557 0.9834707 0.9834128 -0.999886 0.9868867 0.9868504 -0.9999099 0.9896047 0.9895819 -0.9999288 0.9917643 0.9917501 -0.9999437 0.9934784 0.9934695 -0.1059991 0.9545467 0.1080772 -0.1059489 0.9545286 0.1077818 -0.1058883 0.9545059 0.1074107 -0.1058162 0.9544774 0.1069453 -0.1057322 0.9544418 0.1063632 -0.1056375 0.9543974 0.1056375 -0.1064365 0.9543974 0.1056375 -0.1074473 0.9543974 0.1056375 -0.1087261 0.9543974 0.1056375 -0.110344 0.9543974 0.1056375 -0.1123908 0.9543974 0.1056375 -0.1149803 0.9543974 0.1056375 -0.1182564 0.9543974 0.1056375 -0.122401 0.9543974 0.1056375 -0.1276445 0.9543974 0.1056375 -0.1342782 0.9543974 0.1056375 -0.1426706 0.9543974 0.1056375 -0.1532882 0.9543974 0.1056375 -0.1667209 0.9543974 0.1056375 -0.1837149 0.9543974 0.1056375 -0.2052145 0.9543974 0.1056375 -0.2324144 0.9543974 0.1056375 -0.2668257 0.9543974 0.1056375 -0.3103605 0.9543974 0.1056375 -0.3654378 0.9543974 0.1056375 -0.4351176 0.9543974 0.1056375 -0.5232717 0.9543974 0.1056375 -0.634798 0.9543974 0.1056375 -0.7758934 0.9543974 0.1056375 -0.9543974 0.9543974 0.1056375 -0.9668479 0.796634 0.156904 -0.9753591 0.6893573 0.2148124 -0.9814002 0.6247981 0.2780936 -0.9858036 0.5947097 0.3451791 -0.9890755 0.5911644 0.4142311 -0.9915418 0.6069026 0.4832747 -0.9934209 0.6355457 0.5503825 -0.9948643 0.6717431 0.6138613 -0.9959801 0.7112482 0.6723959 -0.9968468 0.7509086 0.7251226 -0.9975226 0.7885719 0.7716288 -0.998051 0.8229308 0.8118949 -0.9984652 0.8533379 0.8462034 -0.9987904 0.8796219 0.8750386 -0.9990461 0.9019257 0.8989969 -0.9992474 0.9205771 0.9187137 -0.9994059 0.9359941 0.9348128 -0.999531 0.9486206 0.9478738 -0.9996296 0.9588859 0.958415 -0.9997074 0.9671831 0.9668867 -0.9997689 0.9738585 0.9736722 -0.9998174 0.9792094 0.9790925 -0.9998557 0.9834861 0.9834128 -0.999886 0.9868964 0.9868504 -0.9999099 0.9896107 0.9895819 -0.9999288 0.9917681 0.9917501 -0.9999437 0.9934807 0.9934695 -0.1572498 0.9669269 0.1588168 -0.1572031 0.9669173 0.1585851 -0.1571463 0.9669053 0.1582941 -0.1570779 0.9668902 0.1579292 -0.1569971 0.9668714 0.1574728 -0.156904 0.9668479 0.156904 -0.1575062 0.9668479 0.156904 -0.1582681 0.9668479 0.156904 -0.159232 0.9668479 0.156904 -0.1604514 0.9668479 0.156904 -0.1619942 0.9668479 0.156904 -0.1639459 0.9668479 0.156904 -0.1664151 0.9668479 0.156904 -0.169539 0.9668479 0.156904 -0.1734912 0.9668479 0.156904 -0.1784912 0.9668479 0.156904 -0.1848168 0.9668479 0.156904 -0.1928195 0.9668479 0.156904 -0.202944 0.9668479 0.156904 -0.2157528 0.9668479 0.156904 -0.2319575 0.9668479 0.156904 -0.2524587 0.9668479 0.156904 -0.2783953 0.9668479 0.156904 -0.3112085 0.9668479 0.156904 -0.3527215 0.9668479 0.156904 -0.4052408 0.9668479 0.156904 -0.4716846 0.9668479 0.156904 -0.5557446 0.9668479 0.156904 -0.6620914 0.9668479 0.156904 -0.796634 0.9668479 0.156904 -0.9668479 0.9668479 0.156904 -0.9753591 0.8156201 0.2148124 -0.9814002 0.7170462 0.2780936 -0.9858036 0.6611026 0.3451791 -0.9890755 0.6382413 0.4142311 -0.9915418 0.6397965 0.4832747 -0.9934209 0.6582052 0.5503825 -0.9948643 0.6871438 0.6138613 -0.9959801 0.7215857 0.6723959 -0.9968468 0.7577695 0.7251226 -0.9975226 0.79308 0.7716288 -0.998051 0.8258672 0.8118949 -0.9984652 0.8552362 0.8462034 -0.9987904 0.8808414 0.8750386 -0.9990461 0.9027049 0.8989969 -0.9992474 0.9210729 0.9187137 -0.9994059 0.9363085 0.9348128 -0.999531 0.9488193 0.9478738 -0.9996296 0.9590112 0.958415 -0.9997074 0.967262 0.9668867 -0.9997689 0.9739081 0.9736722 -0.9998174 0.9792405 0.9790925 -0.9998557 0.9835056 0.9834128 -0.999886 0.9869086 0.9868504 -0.9999099 0.9896184 0.9895819 -0.9999288 0.9917729 0.9917501 -0.9999437 0.9934837 0.9934695 -0.2151269 0.9754027 0.2162897 -0.2150852 0.9753975 0.2161107 -0.2150342 0.9753908 0.2158859 -0.2149725 0.9753825 0.215604 -0.2148987 0.9753721 0.2152516 -0.2148124 0.9753591 0.2148124 -0.2152591 0.9753591 0.2148124 -0.2158242 0.9753591 0.2148124 -0.2165392 0.9753591 0.2148124 -0.2174438 0.9753591 0.2148124 -0.2185882 0.9753591 0.2148124 -0.220036 0.9753591 0.2148124 -0.2218676 0.9753591 0.2148124 -0.2241849 0.9753591 0.2148124 -0.2271165 0.9753591 0.2148124 -0.2308255 0.9753591 0.2148124 -0.2355177 0.9753591 0.2148124 -0.2414541 0.9753591 0.2148124 -0.2489643 0.9753591 0.2148124 -0.2584657 0.9753591 0.2148124 -0.2704863 0.9753591 0.2148124 -0.2856938 0.9753591 0.2148124 -0.3049333 0.9753591 0.2148124 -0.3292738 0.9753591 0.2148124 -0.3600677 0.9753591 0.2148124 -0.399026 0.9753591 0.2148124 -0.4483133 0.9753591 0.2148124 -0.5106681 0.9753591 0.2148124 -0.589555 0.9753591 0.2148124 -0.6893573 0.9753591 0.2148124 -0.8156201 0.9753591 0.2148124 -0.9753591 0.9753591 0.2148124 -0.9814002 0.8337521 0.2780936 -0.9858036 0.7450984 0.3451791 -0.9890755 0.6977997 0.4142311 -0.9915418 0.6814115 0.4832747 -0.9934209 0.6868724 0.5503825 -0.9948643 0.7066276 0.6138613 -0.9959801 0.7346639 0.6723959 -0.9968468 0.7664494 0.7251226 -0.9975226 0.7987833 0.7716288 -0.998051 0.829582 0.8118949 -0.9984652 0.8576378 0.8462034 -0.9987904 0.8823842 0.8750386 -0.9990461 0.9036908 0.8989969 -0.9992474 0.9217001 0.9187137 -0.9994059 0.9367061 0.9348128 -0.999531 0.9490706 0.9478738 -0.9996296 0.9591697 0.958415 -0.9997074 0.9673618 0.9668867 -0.9997689 0.9739708 0.9736722 -0.9998174 0.9792799 0.9790925 -0.9998557 0.9835303 0.9834128 -0.999886 0.9869241 0.9868504 -0.9999099 0.9896281 0.9895819 -0.9999288 0.9917789 0.9917501 -0.9999437 0.9934875 0.9934695 -0.2783684 0.9814251 0.2792183 -0.2783325 0.9814221 0.279082 -0.2782884 0.9814183 0.2789108 -0.2782347 0.9814136 0.2786962 -0.2781701 0.9814076 0.2784279 -0.2780936 0.9814002 0.2780936 -0.27842 0.9814002 0.2780936 -0.2788329 0.9814002 0.2780936 -0.2793553 0.9814002 0.2780936 -0.2800162 0.9814002 0.2780936 -0.2808523 0.9814002 0.2780936 -0.28191 0.9814002 0.2780936 -0.2832482 0.9814002 0.2780936 -0.2849413 0.9814002 0.2780936 -0.2870831 0.9814002 0.2780936 -0.2897929 0.9814002 0.2780936 -0.2932211 0.9814002 0.2780936 -0.2975582 0.9814002 0.2780936 -0.3030452 0.9814002 0.2780936 -0.309987 0.9814002 0.2780936 -0.3187692 0.9814002 0.2780936 -0.3298799 0.9814002 0.2780936 -0.3439364 0.9814002 0.2780936 -0.3617196 0.9814002 0.2780936 -0.3842178 0.9814002 0.2780936 -0.4126808 0.9814002 0.2780936 -0.4486903 0.9814002 0.2780936 -0.494247 0.9814002 0.2780936 -0.5518821 0.9814002 0.2780936 -0.6247981 0.9814002 0.2780936 -0.7170462 0.9814002 0.2780936 -0.8337521 0.9814002 0.2780936 -0.9814002 0.9814002 0.2780936 -0.9858036 0.8513639 0.3451791 -0.9890755 0.7731488 0.4142311 -0.9915418 0.7340599 0.4832747 -0.9934209 0.7231402 0.5503825 -0.9948643 0.7312773 0.6138613 -0.9959801 0.7512096 0.6723959 -0.9968468 0.7774307 0.7251226 -0.9975226 0.8059988 0.7716288 -0.998051 0.8342818 0.8118949 -0.9984652 0.8606762 0.8462034 -0.9987904 0.884336 0.8750386 -0.9990461 0.9049381 0.8989969 -0.9992474 0.9224937 0.9187137 -0.9994059 0.9372092 0.9348128 -0.999531 0.9493887 0.9478738 -0.9996296 0.9593703 0.958415 -0.9997074 0.967488 0.9668867 -0.9997689 0.9740501 0.9736722 -0.9998174 0.9793297 0.9790925 -0.9998557 0.9835615 0.9834128 -0.999886 0.9869436 0.9868504 -0.9999099 0.9896403 0.9895819 -0.9999288 0.9917866 0.9917501 -0.9999437 0.9934923 0.9934695 -0.3454107 0.9858181 0.3460225 -0.3453807 0.9858163 0.3459203 -0.3453439 0.9858141 0.3457919 -0.3452987 0.9858113 0.3456309 -0.3452442 0.9858079 0.3454298 -0.3451791 0.9858036 0.3451791 -0.345414 0.9858036 0.3451791 -0.3457112 0.9858036 0.3451791 -0.3460872 0.9858036 0.3451791 -0.3465628 0.9858036 0.3451791 -0.3471646 0.9858036 0.3451791 -0.3479259 0.9858036 0.3451791 -0.348889 0.9858036 0.3451791 -0.3501075 0.9858036 0.3451791 -0.351649 0.9858036 0.3451791 -0.3535993 0.9858036 0.3451791 -0.3560667 0.9858036 0.3451791 -0.3591882 0.9858036 0.3451791 -0.3631373 0.9858036 0.3451791 -0.3681334 0.9858036 0.3451791 -0.3744542 0.9858036 0.3451791 -0.3824508 0.9858036 0.3451791 -0.3925675 0.9858036 0.3451791 -0.4053665 0.9858036 0.3451791 -0.4215589 0.9858036 0.3451791 -0.4420444 0.9858036 0.3451791 -0.4679612 0.9858036 0.3451791 -0.5007493 0.9858036 0.3451791 -0.5422305 0.9858036 0.3451791 -0.5947097 0.9858036 0.3451791 -0.6611026 0.9858036 0.3451791 -0.7450984 0.9858036 0.3451791 -0.8513639 0.9858036 0.3451791 -0.9858036 0.9858036 0.3451791 -0.9890755 0.8684752 0.4142311 -0.9915418 0.800667 0.4832747 -0.9934209 0.7690236 0.5503825 -0.9948643 0.7624623 0.6138613 -0.9959801 0.7721421 0.6723959 -0.9968468 0.7913234 0.7251226 -0.9975226 0.8151272 0.7716288 -0.998051 0.8402276 0.8118949 -0.9984652 0.86452 0.8462034 -0.9987904 0.8868054 0.8750386 -0.9990461 0.9065161 0.8989969 -0.9992474 0.9234977 0.9187137 -0.9994059 0.9378457 0.9348128 -0.999531 0.949791 0.9478738 -0.9996296 0.959624 0.958415 -0.9997074 0.9676477 0.9668867 -0.9997689 0.9741505 0.9736722 -0.9998174 0.9793927 0.9790925 -0.9998557 0.9836011 0.9834128 -0.999886 0.9869684 0.9868504 -0.9999099 0.9896558 0.9895819 -0.9999288 0.9917963 0.9917501 -0.9999437 0.9934984 0.9934695 -0.4144197 0.9890841 0.4148536 -0.4143955 0.9890831 0.4147782 -0.4143657 0.9890818 0.4146834 -0.414329 0.9890801 0.4145646 -0.4142845 0.9890781 0.4144161 -0.4142311 0.9890755 0.4142311 -0.4143977 0.9890755 0.4142311 -0.4146084 0.9890755 0.4142311 -0.414875 0.9890755 0.4142311 -0.4152122 0.9890755 0.4142311 -0.4156389 0.9890755 0.4142311 -0.4161787 0.9890755 0.4142311 -0.4168617 0.9890755 0.4142311 -0.4177256 0.9890755 0.4142311 -0.4188187 0.9890755 0.4142311 -0.4202016 0.9890755 0.4142311 -0.4219511 0.9890755 0.4142311 -0.4241644 0.9890755 0.4142311 -0.4269646 0.9890755 0.4142311 -0.4305072 0.9890755 0.4142311 -0.434989 0.9890755 0.4142311 -0.4406591 0.9890755 0.4142311 -0.4478326 0.9890755 0.4142311 -0.4569079 0.9890755 0.4142311 -0.4683893 0.9890755 0.4142311 -0.4829148 0.9890755 0.4142311 -0.5012915 0.9890755 0.4142311 -0.5245404 0.9890755 0.4142311 -0.5539533 0.9890755 0.4142311 -0.5911644 0.9890755 0.4142311 -0.6382413 0.9890755 0.4142311 -0.6977997 0.9890755 0.4142311 -0.7731488 0.9890755 0.4142311 -0.8684752 0.9890755 0.4142311 -0.9890755 0.9890755 0.4142311 -0.9915418 0.8849336 0.4832747 -0.9934209 0.8270722 0.5503825 -0.9948643 0.8019154 0.6138613 -0.9959801 0.7986244 0.6723959 -0.9968468 0.8088995 0.7251226 -0.9975226 0.8266759 0.7716288 -0.998051 0.8477498 0.8118949 -0.9984652 0.8693831 0.8462034 -0.9987904 0.8899294 0.8750386 -0.9990461 0.9085124 0.8989969 -0.9992474 0.9247678 0.9187137 -0.9994059 0.9386509 0.9348128 -0.999531 0.9503 0.9478738 -0.9996296 0.959945 0.958415 -0.9997074 0.9678498 0.9668867 -0.9997689 0.9742775 0.9736722 -0.9998174 0.9794724 0.9790925 -0.9998557 0.983651 0.9834128 -0.999886 0.9869997 0.9868504 -0.9999099 0.9896755 0.9895819 -0.9999288 0.9918086 0.9917501 -0.9999437 0.9935061 0.9934695 -0.4834235 0.9915469 0.4837267 -0.4834045 0.9915463 0.4836719 -0.4833811 0.9915455 0.4836031 -0.4833522 0.9915446 0.4835168 -0.4833171 0.9915433 0.483409 -0.4832747 0.9915418 0.4832747 -0.4833911 0.9915418 0.4832747 -0.4835383 0.9915418 0.4832747 -0.4837246 0.9915418 0.4832747 -0.4839603 0.9915418 0.4832747 -0.4842584 0.9915418 0.4832747 -0.4846356 0.9915418 0.4832747 -0.4851127 0.9915418 0.4832747 -0.4857164 0.9915418 0.4832747 -0.4864802 0.9915418 0.4832747 -0.4874464 0.9915418 0.4832747 -0.4886689 0.9915418 0.4832747 -0.4902154 0.9915418 0.4832747 -0.4921719 0.9915418 0.4832747 -0.4946472 0.9915418 0.4832747 -0.4977788 0.9915418 0.4832747 -0.5017407 0.9915418 0.4832747 -0.5067529 0.9915418 0.4832747 -0.5130941 0.9915418 0.4832747 -0.5211165 0.9915418 0.4832747 -0.5312658 0.9915418 0.4832747 -0.5441061 0.9915418 0.4832747 -0.5603507 0.9915418 0.4832747 -0.5809023 0.9915418 0.4832747 -0.6069026 0.9915418 0.4832747 -0.6397965 0.9915418 0.4832747 -0.6814115 0.9915418 0.4832747 -0.7340599 0.9915418 0.4832747 -0.800667 0.9915418 0.4832747 -0.8849336 0.9915418 0.4832747 -0.9915418 0.9915418 0.4832747 -0.9934209 0.9005111 0.5503825 -0.9948643 0.8518286 0.6138613 -0.9959801 0.8321279 0.6723959 -0.9968468 0.8311356 0.7251226 -0.9975226 0.8412865 0.7716288 -0.998051 0.8572664 0.8118949 -0.9984652 0.8755354 0.8462034 -0.9987904 0.8938817 0.8750386 -0.9990461 0.911038 0.8989969 -0.9992474 0.9263747 0.9187137 -0.9994059 0.9396696 0.9348128 -0.999531 0.9509439 0.9478738 -0.9996296 0.9603511 0.958415 -0.9997074 0.9681054 0.9668867 -0.9997689 0.9744382 0.9736722 -0.9998174 0.9795733 0.9790925 -0.9998557 0.9837143 0.9834128 -0.999886 0.9870393 0.9868504 -0.9999099 0.9897003 0.9895819 -0.9999288 0.9918241 0.9917501 -0.9999437 0.9935158 0.9934695 -0.5504963 0.993424 0.5507052 -0.5504818 0.9934236 0.5506661 -0.550464 0.9934231 0.5506169 -0.5504419 0.9934225 0.5505553 -0.550415 0.9934218 0.5504784 -0.5503825 0.9934209 0.5503825 -0.5504627 0.9934209 0.5503825 -0.5505641 0.9934209 0.5503825 -0.5506924 0.9934209 0.5503825 -0.5508547 0.9934209 0.5503825 -0.5510601 0.9934209 0.5503825 -0.5513199 0.9934209 0.5503825 -0.5516486 0.9934209 0.5503825 -0.5520645 0.9934209 0.5503825 -0.5525906 0.9934209 0.5503825 -0.5532562 0.9934209 0.5503825 -0.5540983 0.9934209 0.5503825 -0.5551637 0.9934209 0.5503825 -0.5565115 0.9934209 0.5503825 -0.5582166 0.9934209 0.5503825 -0.5603739 0.9934209 0.5503825 -0.5631031 0.9934209 0.5503825 -0.5665559 0.9934209 0.5503825 -0.5709241 0.9934209 0.5503825 -0.5764504 0.9934209 0.5503825 -0.583442 0.9934209 0.5503825 -0.5922872 0.9934209 0.5503825 -0.6034776 0.9934209 0.5503825 -0.6176349 0.9934209 0.5503825 -0.6355457 0.9934209 0.5503825 -0.6582052 0.9934209 0.5503825 -0.6868724 0.9934209 0.5503825 -0.7231402 0.9934209 0.5503825 -0.7690236 0.9934209 0.5503825 -0.8270722 0.9934209 0.5503825 -0.9005111 0.9934209 0.5503825 -0.9934209 0.9934209 0.5503825 -0.9948643 0.9149754 0.6138613 -0.9959801 0.8745143 0.6723959 -0.9968468 0.8592671 0.7251226 -0.9975226 0.8597708 0.7716288 -0.998051 0.8693061 0.8118949 -0.9984652 0.8833189 0.8462034 -0.9987904 0.8988819 0.8750386 -0.9990461 0.9142332 0.8989969 -0.9992474 0.9284076 0.9187137 -0.9994059 0.9409584 0.9348128 -0.999531 0.9517586 0.9478738 -0.9996296 0.9608649 0.958415 -0.9997074 0.9684288 0.9668867 -0.9997689 0.9746414 0.9736722 -0.9998174 0.9797009 0.9790925 -0.9998557 0.9837943 0.9834128 -0.999886 0.9870895 0.9868504 -0.9999099 0.9897317 0.9895819 -0.9999288 0.9918438 0.9917501 -0.9999437 0.9935281 0.9934695 -0.6139459 0.9948662 0.6140879 -0.6139352 0.994866 0.6140604 -0.6139219 0.9948657 0.6140259 -0.6139056 0.9948653 0.6139827 -0.6138855 0.9948649 0.6139286 -0.6138613 0.9948643 0.6138613 -0.6139158 0.9948643 0.6138613 -0.6139847 0.9948643 0.6138613 -0.6140719 0.9948643 0.6138613 -0.6141822 0.9948643 0.6138613 -0.6143218 0.9948643 0.6138613 -0.6144984 0.9948643 0.6138613 -0.6147218 0.9948643 0.6138613 -0.6150045 0.9948643 0.6138613 -0.6153621 0.9948643 0.6138613 -0.6158144 0.9948643 0.6138613 -0.6163868 0.9948643 0.6138613 -0.6171109 0.9948643 0.6138613 -0.6180269 0.9948643 0.6138613 -0.6191858 0.9948643 0.6138613 -0.620652 0.9948643 0.6138613 -0.6225069 0.9948643 0.6138613 -0.6248536 0.9948643 0.6138613 -0.6278225 0.9948643 0.6138613 -0.6315785 0.9948643 0.6138613 -0.6363304 0.9948643 0.6138613 -0.6423421 0.9948643 0.6138613 -0.6499478 0.9948643 0.6138613 -0.6595699 0.9948643 0.6138613 -0.6717431 0.9948643 0.6138613 -0.6871438 0.9948643 0.6138613 -0.7066276 0.9948643 0.6138613 -0.7312773 0.9948643 0.6138613 -0.7624623 0.9948643 0.6138613 -0.8019154 0.9948643 0.6138613 -0.8518286 0.9948643 0.6138613 -0.9149754 0.9948643 0.6138613 -0.9948643 0.9948643 0.6138613 -0.9959801 0.9281385 0.6723959 -0.9968468 0.8948571 0.7251226 -0.9975226 0.8831558 0.7716288 -0.998051 0.8845379 0.8118949 -0.9984652 0.8931661 0.8462034 -0.9987904 0.9052078 0.8750386 -0.9990461 0.9182756 0.8989969 -0.9992474 0.9309795 0.9187137 -0.9994059 0.9425889 0.9348128 -0.999531 0.9527893 0.9478738 -0.9996296 0.9615149 0.958415 -0.9997074 0.9688379 0.9668867 -0.9997689 0.9748985 0.9736722 -0.9998174 0.9798623 0.9790925 -0.9998557 0.9838955 0.9834128 -0.999886 0.9871529 0.9868504 -0.9999099 0.9897714 0.9895819 -0.9999288 0.9918686 0.9917501 -0.9999437 0.9935437 0.9934695 -0.6724572 0.9959813 0.6725525 -0.6724495 0.9959811 0.6725335 -0.6724399 0.9959809 0.6725097 -0.672428 0.9959807 0.6724798 -0.6724135 0.9959804 0.6724424 -0.6723959 0.9959801 0.6723959 -0.6724325 0.9959801 0.6723959 -0.6724787 0.9959801 0.6723959 -0.6725373 0.9959801 0.6723959 -0.6726113 0.9959801 0.6723959 -0.672705 0.9959801 0.6723959 -0.6728236 0.9959801 0.6723959 -0.6729735 0.9959801 0.6723959 -0.6731633 0.9959801 0.6723959 -0.6734033 0.9959801 0.6723959 -0.6737069 0.9959801 0.6723959 -0.6740911 0.9959801 0.6723959 -0.6745771 0.9959801 0.6723959 -0.675192 0.9959801 0.6723959 -0.6759699 0.9959801 0.6723959 -0.6769541 0.9959801 0.6723959 -0.6781992 0.9959801 0.6723959 -0.6797744 0.9959801 0.6723959 -0.6817672 0.9959801 0.6723959 -0.6842884 0.9959801 0.6723959 -0.687478 0.9959801 0.6723959 -0.6915133 0.9959801 0.6723959 -0.6966184 0.9959801 0.6723959 -0.7030771 0.9959801 0.6723959 -0.7112482 0.9959801 0.6723959 -0.7215857 0.9959801 0.6723959 -0.7346639 0.9959801 0.6723959 -0.7512096 0.9959801 0.6723959 -0.7721421 0.9959801 0.6723959 -0.7986244 0.9959801 0.6723959 -0.8321279 0.9959801 0.6723959 -0.8745143 0.9959801 0.6723959 -0.9281385 0.9959801 0.6723959 -0.9959801 0.9959801 0.6723959 -0.9968468 0.9398831 0.7251226 -0.9975226 0.912741 0.7716288 -0.998051 0.9038082 0.8118949 -0.9984652 0.905624 0.8462034 -0.9987904 0.9132109 0.8750386 -0.9990461 0.9233897 0.8989969 -0.9992474 0.9342333 0.9187137 -0.9994059 0.9446517 0.9348128 -0.999531 0.9540933 0.9478738 -0.9996296 0.9623372 0.958415 -0.9997074 0.9693555 0.9668867 -0.9997689 0.9752238 0.9736722 -0.9998174 0.9800665 0.9790925 -0.9998557 0.9840236 0.9834128 -0.999886 0.9872332 0.9868504 -0.9999099 0.9898216 0.9895819 -0.9999288 0.9919001 0.9917501 -0.9999437 0.9935633 0.9934695 -0.7251659 0.9968475 0.7252292 -0.7251605 0.9968474 0.7252163 -0.7251537 0.9968473 0.7252001 -0.7251454 0.9968472 0.7251797 -0.7251351 0.996847 0.7251543 -0.7251226 0.9968468 0.7251226 -0.7251469 0.9968468 0.7251226 -0.7251776 0.9968468 0.7251226 -0.7252164 0.9968468 0.7251226 -0.7252656 0.9968468 0.7251226 -0.7253278 0.9968468 0.7251226 -0.7254064 0.9968468 0.7251226 -0.725506 0.9968468 0.7251226 -0.7256319 0.9968468 0.7251226 -0.7257912 0.9968468 0.7251226 -0.7259927 0.9968468 0.7251226 -0.7262477 0.9968468 0.7251226 -0.7265703 0.9968468 0.7251226 -0.7269784 0.9968468 0.7251226 -0.7274947 0.9968468 0.7251226 -0.7281478 0.9968468 0.7251226 -0.7289742 0.9968468 0.7251226 -0.7300196 0.9968468 0.7251226 -0.7313422 0.9968468 0.7251226 -0.7330155 0.9968468 0.7251226 -0.7351325 0.9968468 0.7251226 -0.7378107 0.9968468 0.7251226 -0.7411989 0.9968468 0.7251226 -0.7454855 0.9968468 0.7251226 -0.7509086 0.9968468 0.7251226 -0.7577695 0.9968468 0.7251226 -0.7664494 0.9968468 0.7251226 -0.7774307 0.9968468 0.7251226 -0.7913234 0.9968468 0.7251226 -0.8088995 0.9968468 0.7251226 -0.8311356 0.9968468 0.7251226 -0.8592671 0.9968468 0.7251226 -0.8948571 0.9968468 0.7251226 -0.9398831 0.9968468 0.7251226 -0.9968468 0.9968468 0.7251226 -0.9975226 0.95017 0.7716288 -0.998051 0.9281875 0.8118949 -0.9984652 0.9213849 0.8462034 -0.9987904 0.9233358 0.8750386 -0.9990461 0.9298598 0.8989969 -0.9992474 0.9383498 0.9187137 -0.9994059 0.9472614 0.9348128 -0.999531 0.9557429 0.9478738 -0.9996296 0.9633775 0.958415 -0.9997074 0.9700103 0.9668867 -0.9997689 0.9756354 0.9736722 -0.9998174 0.9803248 0.9790925 -0.9998557 0.9841856 0.9834128 -0.999886 0.9873347 0.9868504 -0.9999099 0.9898852 0.9895819 -0.9999288 0.9919399 0.9917501 -0.9999437 0.9935882 0.9934695 -0.7716588 0.997523 0.7717004 -0.7716551 0.997523 0.7716917 -0.7716504 0.9975229 0.7716808 -0.7716446 0.9975228 0.7716672 -0.7716375 0.9975227 0.7716501 -0.7716288 0.9975226 0.7716288 -0.7716448 0.9975226 0.7716288 -0.7716649 0.9975226 0.7716288 -0.7716905 0.9975226 0.7716288 -0.7717228 0.9975226 0.7716288 -0.7717636 0.9975226 0.7716288 -0.7718153 0.9975226 0.7716288 -0.7718807 0.9975226 0.7716288 -0.7719634 0.9975226 0.7716288 -0.7720681 0.9975226 0.7716288 -0.7722005 0.9975226 0.7716288 -0.7723681 0.9975226 0.7716288 -0.77258 0.9975226 0.7716288 -0.7728482 0.9975226 0.7716288 -0.7731874 0.9975226 0.7716288 -0.7736166 0.9975226 0.7716288 -0.7741595 0.9975226 0.7716288 -0.7748465 0.9975226 0.7716288 -0.7757155 0.9975226 0.7716288 -0.776815 0.9975226 0.7716288 -0.778206 0.9975226 0.7716288 -0.7799657 0.9975226 0.7716288 -0.782192 0.9975226 0.7716288 -0.7850086 0.9975226 0.7716288 -0.7885719 0.9975226 0.7716288 -0.79308 0.9975226 0.7716288 -0.7987833 0.9975226 0.7716288 -0.8059988 0.9975226 0.7716288 -0.8151272 0.9975226 0.7716288 -0.8266759 0.9975226 0.7716288 -0.8412865 0.9975226 0.7716288 -0.8597708 0.9975226 0.7716288 -0.8831558 0.9975226 0.7716288 -0.912741 0.9975226 0.7716288 -0.95017 0.9975226 0.7716288 -0.9975226 0.9975226 0.7716288 -0.998051 0.9590305 0.8118949 -0.9984652 0.9413245 0.8462034 -0.9987904 0.9361451 0.8750386 -0.9990461 0.9380452 0.8989969 -0.9992474 0.9435577 0.9187137 -0.9994059 0.9505631 0.9348128 -0.999531 0.95783 0.9478738 -0.9996296 0.9646937 0.958415 -0.9997074 0.9708388 0.9668867 -0.9997689 0.9761561 0.9736722 -0.9998174 0.9806517 0.9790925 -0.9998557 0.9843906 0.9834128 -0.999886 0.9874631 0.9868504 -0.9999099 0.9899657 0.9895819 -0.9999288 0.9919902 0.9917501 -0.9999437 0.9936197 0.9934695 -0.8119154 0.9980513 0.8119425 -0.8119128 0.9980512 0.8119367 -0.8119096 0.9980512 0.8119295 -0.8119057 0.9980511 0.8119204 -0.8119009 0.9980511 0.8119091 -0.8118949 0.998051 0.8118949 -0.8119053 0.998051 0.8118949 -0.8119185 0.998051 0.8118949 -0.8119351 0.998051 0.8118949 -0.8119561 0.998051 0.8118949 -0.8119828 0.998051 0.8118949 -0.8120164 0.998051 0.8118949 -0.812059 0.998051 0.8118949 -0.8121129 0.998051 0.8118949 -0.8121811 0.998051 0.8118949 -0.8122673 0.998051 0.8118949 -0.8123765 0.998051 0.8118949 -0.8125145 0.998051 0.8118949 -0.8126892 0.998051 0.8118949 -0.8129101 0.998051 0.8118949 -0.8131897 0.998051 0.8118949 -0.8135433 0.998051 0.8118949 -0.8139908 0.998051 0.8118949 -0.8145568 0.998051 0.8118949 -0.815273 0.998051 0.8118949 -0.816179 0.998051 0.8118949 -0.8173252 0.998051 0.8118949 -0.8187753 0.998051 0.8118949 -0.8206099 0.998051 0.8118949 -0.8229308 0.998051 0.8118949 -0.8258672 0.998051 0.8118949 -0.829582 0.998051 0.8118949 -0.8342818 0.998051 0.8118949 -0.8402276 0.998051 0.8118949 -0.8477498 0.998051 0.8118949 -0.8572664 0.998051 0.8118949 -0.8693061 0.998051 0.8118949 -0.8845379 0.998051 0.8118949 -0.9038082 0.998051 0.8118949 -0.9281875 0.998051 0.8118949 -0.9590305 0.998051 0.8118949 -0.998051 0.998051 0.8118949 -0.9984652 0.9665507 0.8462034 -0.9987904 0.9523506 0.8750386 -0.9990461 0.9484008 0.8989969 -0.9992474 0.9501463 0.9187137 -0.9994059 0.95474 0.9348128 -0.999531 0.9604703 0.9478738 -0.9996296 0.9663588 0.958415 -0.9997074 0.9718869 0.9668867 -0.9997689 0.9768148 0.9736722 -0.9998174 0.9810652 0.9790925 -0.9998557 0.9846499 0.9834128 -0.999886 0.9876256 0.9868504 -0.9999099 0.9900674 0.9895819 -0.9999288 0.9920539 0.9917501 -0.9999437 0.9936596 0.9934695 -0.8462171 0.9984653 0.8462346 -0.8462154 0.9984653 0.8462308 -0.8462132 0.9984653 0.846226 -0.8462106 0.9984653 0.8462201 -0.8462073 0.9984652 0.8462126 -0.8462034 0.9984652 0.8462034 -0.8462101 0.9984652 0.8462034 -0.8462186 0.9984652 0.8462034 -0.8462293 0.9984652 0.8462034 -0.8462429 0.9984652 0.8462034 -0.8462601 0.9984652 0.8462034 -0.8462819 0.9984652 0.8462034 -0.8463094 0.9984652 0.8462034 -0.8463443 0.9984652 0.8462034 -0.8463884 0.9984652 0.8462034 -0.8464441 0.9984652 0.8462034 -0.8465147 0.9984652 0.8462034 -0.8466039 0.9984652 0.8462034 -0.8467168 0.9984652 0.8462034 -0.8468597 0.9984652 0.8462034 -0.8470404 0.9984652 0.8462034 -0.847269 0.9984652 0.8462034 -0.8475583 0.9984652 0.8462034 -0.8479242 0.9984652 0.8462034 -0.8483872 0.9984652 0.8462034 -0.8489729 0.9984652 0.8462034 -0.8497139 0.9984652 0.8462034 -0.8506514 0.9984652 0.8462034 -0.8518374 0.9984652 0.8462034 -0.8533379 0.9984652 0.8462034 -0.8552362 0.9984652 0.8462034 -0.8576378 0.9984652 0.8462034 -0.8606762 0.9984652 0.8462034 -0.86452 0.9984652 0.8462034 -0.8693831 0.9984652 0.8462034 -0.8755354 0.9984652 0.8462034 -0.8833189 0.9984652 0.8462034 -0.8931661 0.9984652 0.8462034 -0.905624 0.9984652 0.8462034 -0.9213849 0.9984652 0.8462034 -0.9413245 0.9984652 0.8462034 -0.9665507 0.9984652 0.8462034 -0.9984652 0.9984652 0.8462034 -0.9987904 0.9728526 0.8750386 -0.9990461 0.9615021 0.8989969 -0.9992474 0.9584818 0.9187137 -0.9994059 0.9600245 0.9348128 -0.999531 0.9638107 0.9478738 -0.9996296 0.9684654 0.958415 -0.9997074 0.9732129 0.9668867 -0.9997689 0.9776482 0.9736722 -0.9998174 0.9815883 0.9790925 -0.9998557 0.9849779 0.9834128 -0.999886 0.9878312 0.9868504 -0.9999099 0.9901962 0.9895819 -0.9999288 0.9921345 0.9917501 -0.9999437 0.99371 0.9934695 -0.8750477 0.9987905 0.8750589 -0.8750466 0.9987905 0.8750565 -0.8750451 0.9987904 0.8750534 -0.8750434 0.9987904 0.8750495 -0.8750412 0.9987904 0.8750447 -0.8750386 0.9987904 0.8750386 -0.8750429 0.9987904 0.8750386 -0.8750484 0.9987904 0.8750386 -0.8750553 0.9987904 0.8750386 -0.875064 0.9987904 0.8750386 -0.8750751 0.9987904 0.8750386 -0.8750891 0.9987904 0.8750386 -0.8751068 0.9987904 0.8750386 -0.8751292 0.9987904 0.8750386 -0.8751575 0.9987904 0.8750386 -0.8751933 0.9987904 0.8750386 -0.8752386 0.9987904 0.8750386 -0.8752959 0.9987904 0.8750386 -0.8753685 0.9987904 0.8750386 -0.8754602 0.9987904 0.8750386 -0.8755763 0.9987904 0.8750386 -0.8757232 0.9987904 0.8750386 -0.875909 0.9987904 0.8750386 -0.8761441 0.9987904 0.8750386 -0.8764415 0.9987904 0.8750386 -0.8768178 0.9987904 0.8750386 -0.8772938 0.9987904 0.8750386 -0.8778961 0.9987904 0.8750386 -0.878658 0.9987904 0.8750386 -0.8796219 0.9987904 0.8750386 -0.8808414 0.9987904 0.8750386 -0.8823842 0.9987904 0.8750386 -0.884336 0.9987904 0.8750386 -0.8868054 0.9987904 0.8750386 -0.8899294 0.9987904 0.8750386 -0.8938817 0.9987904 0.8750386 -0.8988819 0.9987904 0.8750386 -0.9052078 0.9987904 0.8750386 -0.9132109 0.9987904 0.8750386 -0.9233358 0.9987904 0.8750386 -0.9361451 0.9987904 0.8750386 -0.9523506 0.9987904 0.8750386 -0.9728526 0.9987904 0.8750386 -0.9987904 0.9987904 0.8750386 -0.9990461 0.9780768 0.8989969 -0.9992474 0.9690273 0.9187137 -0.9994059 0.96671 0.9348128 -0.999531 0.9680368 0.9478738 -0.9996296 0.9711305 0.958415 -0.9997074 0.9748904 0.9668867 -0.9997689 0.9787025 0.9736722 -0.9998174 0.9822501 0.9790925 -0.9998557 0.985393 0.9834128 -0.999886 0.9880913 0.9868504 -0.9999099 0.990359 0.9895819 -0.9999288 0.9922365 0.9917501 -0.9999437 0.9937738 0.9934695 -0.8990028 0.9990461 0.89901 -0.899002 0.9990461 0.8990084 -0.8990011 0.9990461 0.8990064 -0.899 0.9990461 0.8990039 -0.8989986 0.9990461 0.8990008 -0.8989969 0.9990461 0.8989969 -0.8989996 0.9990461 0.8989969 -0.8990031 0.9990461 0.8989969 -0.8990075 0.9990461 0.8989969 -0.8990131 0.9990461 0.8989969 -0.8990202 0.9990461 0.8989969 -0.8990291 0.9990461 0.8989969 -0.8990404 0.9990461 0.8989969 -0.8990547 0.9990461 0.8989969 -0.8990728 0.9990461 0.8989969 -0.8990957 0.9990461 0.8989969 -0.8991246 0.9990461 0.8989969 -0.8991613 0.9990461 0.8989969 -0.8992076 0.9990461 0.8989969 -0.8992663 0.9990461 0.8989969 -0.8993405 0.9990461 0.8989969 -0.8994343 0.9990461 0.8989969 -0.8995531 0.9990461 0.8989969 -0.8997033 0.9990461 0.8989969 -0.8998934 0.9990461 0.8989969 -0.9001338 0.9990461 0.8989969 -0.900438 0.9990461 0.8989969 -0.9008228 0.9990461 0.8989969 -0.9013097 0.9990461 0.8989969 -0.9019257 0.9990461 0.8989969 -0.9027049 0.9990461 0.8989969 -0.9036908 0.9990461 0.8989969 -0.9049381 0.9990461 0.8989969 -0.9065161 0.9990461 0.8989969 -0.9085124 0.9990461 0.8989969 -0.911038 0.9990461 0.8989969 -0.9142332 0.9990461 0.8989969 -0.9182756 0.9990461 0.8989969 -0.9233897 0.9990461 0.8989969 -0.9298598 0.9990461 0.8989969 -0.9380452 0.9990461 0.8989969 -0.9484008 0.9990461 0.8989969 -0.9615021 0.9990461 0.8989969 -0.9780768 0.9990461 0.8989969 -0.9990461 0.9990461 0.8989969 -0.9992474 0.9823687 0.9187137 -0.9994059 0.975168 0.9348128 -0.999531 0.9733833 0.9478738 -0.9996296 0.9745023 0.958415 -0.9997074 0.9770128 0.9668867 -0.9997689 0.9800364 0.9736722 -0.9998174 0.9830874 0.9790925 -0.9998557 0.9859181 0.9834128 -0.999886 0.9884203 0.9868504 -0.9999099 0.9905651 0.9895819 -0.9999288 0.9923655 0.9917501 -0.9999437 0.9938545 0.9934695 -0.9187175 0.9992474 0.9187221 -0.918717 0.9992474 0.9187211 -0.9187164 0.9992474 0.9187198 -0.9187157 0.9992474 0.9187182 -0.9187148 0.9992474 0.9187162 -0.9187137 0.9992474 0.9187137 -0.9187154 0.9992474 0.9187137 -0.9187176 0.9992474 0.9187137 -0.9187204 0.9992474 0.9187137 -0.918724 0.9992474 0.9187137 -0.9187285 0.9992474 0.9187137 -0.9187342 0.9992474 0.9187137 -0.9187414 0.9992474 0.9187137 -0.9187505 0.9992474 0.9187137 -0.918762 0.9992474 0.9187137 -0.9187765 0.9992474 0.9187137 -0.918795 0.9992474 0.9187137 -0.9188183 0.9992474 0.9187137 -0.9188478 0.9992474 0.9187137 -0.9188851 0.9992474 0.9187137 -0.9189323 0.9992474 0.9187137 -0.918992 0.9992474 0.9187137 -0.9190675 0.9992474 0.9187137 -0.9191631 0.9992474 0.9187137 -0.919284 0.9992474 0.9187137 -0.919437 0.9992474 0.9187137 -0.9196306 0.9992474 0.9187137 -0.9198754 0.9992474 0.9187137 -0.9201852 0.9992474 0.9187137 -0.9205771 0.9992474 0.9187137 -0.9210729 0.9992474 0.9187137 -0.9217001 0.9992474 0.9187137 -0.9224937 0.9992474 0.9187137 -0.9234977 0.9992474 0.9187137 -0.9247678 0.9992474 0.9187137 -0.9263747 0.9992474 0.9187137 -0.9284076 0.9992474 0.9187137 -0.9309795 0.9992474 0.9187137 -0.9342333 0.9992474 0.9187137 -0.9383498 0.9992474 0.9187137 -0.9435577 0.9992474 0.9187137 -0.9501463 0.9992474 0.9187137 -0.9584818 0.9992474 0.9187137 -0.9690273 0.9992474 0.9187137 -0.9823687 0.9992474 0.9187137 -0.9992474 0.9992474 0.9187137 -0.9994059 0.9858684 0.9348128 -0.999531 0.9801474 0.9478738 -0.9996296 0.9787679 0.958415 -0.9997074 0.9796978 0.9668867 -0.9997689 0.9817239 0.9736722 -0.9998174 0.9841467 0.9790925 -0.9998557 0.9865824 0.9834128 -0.999886 0.9888366 0.9868504 -0.9999099 0.9908258 0.9895819 -0.9999288 0.9925286 0.9917501 -0.9999437 0.9939566 0.9934695 -0.9348153 0.999406 0.9348182 -0.9348149 0.999406 0.9348175 -0.9348146 0.999406 0.9348167 -0.9348141 0.999406 0.9348157 -0.9348135 0.999406 0.9348144 -0.9348128 0.9994059 0.9348128 -0.9348139 0.9994059 0.9348128 -0.9348153 0.9994059 0.9348128 -0.9348171 0.9994059 0.9348128 -0.9348193 0.9994059 0.9348128 -0.9348222 0.9994059 0.9348128 -0.9348258 0.9994059 0.9348128 -0.9348303 0.9994059 0.9348128 -0.9348361 0.9994059 0.9348128 -0.9348434 0.9994059 0.9348128 -0.9348526 0.9994059 0.9348128 -0.9348643 0.9994059 0.9348128 -0.9348791 0.9994059 0.9348128 -0.9348978 0.9994059 0.9348128 -0.9349215 0.9994059 0.9348128 -0.9349514 0.9994059 0.9348128 -0.9349892 0.9994059 0.9348128 -0.9350371 0.9994059 0.9348128 -0.9350977 0.9994059 0.9348128 -0.9351744 0.9994059 0.9348128 -0.9352714 0.9994059 0.9348128 -0.9353941 0.9994059 0.9348128 -0.9355493 0.9994059 0.9348128 -0.9357457 0.9994059 0.9348128 -0.9359941 0.9994059 0.9348128 -0.9363085 0.9994059 0.9348128 -0.9367061 0.9994059 0.9348128 -0.9372092 0.9994059 0.9348128 -0.9378457 0.9994059 0.9348128 -0.9386509 0.9994059 0.9348128 -0.9396696 0.9994059 0.9348128 -0.9409584 0.9994059 0.9348128 -0.9425889 0.9994059 0.9348128 -0.9446517 0.9994059 0.9348128 -0.9472614 0.9994059 0.9348128 -0.9505631 0.9994059 0.9348128 -0.95474 0.9994059 0.9348128 -0.9600245 0.9994059 0.9348128 -0.96671 0.9994059 0.9348128 -0.975168 0.9994059 0.9348128 -0.9858684 0.9994059 0.9348128 -0.9994059 0.9994059 0.9348128 -0.999531 0.9887048 0.9478738 -0.9996296 0.9841646 0.958415 -0.9997074 0.9830947 0.9668867 -0.9997689 0.9838588 0.9736722 -0.9998174 0.9854868 0.9790925 -0.9998557 0.9874228 0.9834128 -0.999886 0.9893632 0.9868504 -0.9999099 0.9911556 0.9895819 -0.9999288 0.9927351 0.9917501 -0.9999437 0.9940858 0.9934695 -0.9478754 0.999531 0.9478772 -0.9478752 0.999531 0.9478768 -0.947875 0.999531 0.9478763 -0.9478746 0.999531 0.9478756 -0.9478743 0.999531 0.9478748 -0.9478738 0.999531 0.9478738 -0.9478745 0.999531 0.9478738 -0.9478754 0.999531 0.9478738 -0.9478765 0.999531 0.9478738 -0.947878 0.999531 0.9478738 -0.9478798 0.999531 0.9478738 -0.947882 0.999531 0.9478738 -0.9478849 0.999531 0.9478738 -0.9478886 0.999531 0.9478738 -0.9478932 0.999531 0.9478738 -0.947899 0.999531 0.9478738 -0.9479064 0.999531 0.9478738 -0.9479157 0.999531 0.9478738 -0.9479276 0.999531 0.9478738 -0.9479425 0.999531 0.9478738 -0.9479614 0.999531 0.9478738 -0.9479854 0.999531 0.9478738 -0.9480156 0.999531 0.9478738 -0.9480539 0.999531 0.9478738 -0.9481024 0.999531 0.9478738 -0.9481637 0.999531 0.9478738 -0.9482413 0.999531 0.9478738 -0.9483394 0.999531 0.9478738 -0.9484635 0.999531 0.9478738 -0.9486206 0.999531 0.9478738 -0.9488193 0.999531 0.9478738 -0.9490706 0.999531 0.9478738 -0.9493887 0.999531 0.9478738 -0.949791 0.999531 0.9478738 -0.9503 0.999531 0.9478738 -0.9509439 0.999531 0.9478738 -0.9517586 0.999531 0.9478738 -0.9527893 0.999531 0.9478738 -0.9540933 0.999531 0.9478738 -0.9557429 0.999531 0.9478738 -0.95783 0.999531 0.9478738 -0.9604703 0.999531 0.9478738 -0.9638107 0.999531 0.9478738 -0.9680368 0.999531 0.9478738 -0.9733833 0.999531 0.9478738 -0.9801474 0.999531 0.9478738 -0.9887048 0.999531 0.9478738 -0.999531 0.999531 0.9478738 -0.9996296 0.990992 0.958415 -0.9997074 0.9873922 0.9668867 -0.9997689 0.9865597 0.9736722 -0.9998174 0.9871823 0.9790925 -0.9998557 0.988486 0.9834128 -0.999886 0.9900295 0.9868504 -0.9999099 0.9915728 0.9895819 -0.9999288 0.9929962 0.9917501 -0.9999437 0.9942492 0.9934695 -0.958416 0.9996296 0.9584171 -0.9584159 0.9996296 0.9584169 -0.9584157 0.9996296 0.9584165 -0.9584155 0.9996296 0.9584161 -0.9584153 0.9996296 0.9584156 -0.958415 0.9996296 0.958415 -0.9584154 0.9996296 0.958415 -0.958416 0.9996296 0.958415 -0.9584167 0.9996296 0.958415 -0.9584176 0.9996296 0.958415 -0.9584187 0.9996296 0.958415 -0.9584202 0.9996296 0.958415 -0.958422 0.9996296 0.958415 -0.9584243 0.9996296 0.958415 -0.9584272 0.9996296 0.958415 -0.9584309 0.9996296 0.958415 -0.9584355 0.9996296 0.958415 -0.9584414 0.9996296 0.958415 -0.9584489 0.9996296 0.958415 -0.9584583 0.9996296 0.958415 -0.9584702 0.9996296 0.958415 -0.9584853 0.9996296 0.958415 -0.9585044 0.9996296 0.958415 -0.9585286 0.9996296 0.958415 -0.9585591 0.9996296 0.958415 -0.9585978 0.9996296 0.958415 -0.9586467 0.9996296 0.958415 -0.9587086 0.9996296 0.958415 -0.9587869 0.9996296 0.958415 -0.9588859 0.9996296 0.958415 -0.9590112 0.9996296 0.958415 -0.9591697 0.9996296 0.958415 -0.9593703 0.9996296 0.958415 -0.959624 0.9996296 0.958415 -0.959945 0.9996296 0.958415 -0.9603511 0.9996296 0.958415 -0.9608649 0.9996296 0.958415 -0.9615149 0.9996296 0.958415 -0.9623372 0.9996296 0.958415 -0.9633775 0.9996296 0.958415 -0.9646937 0.9996296 0.958415 -0.9663588 0.9996296 0.958415 -0.9684654 0.9996296 0.958415 -0.9711305 0.9996296 0.958415 -0.9745023 0.9996296 0.958415 -0.9787679 0.9996296 0.958415 -0.9841646 0.9996296 0.958415 -0.990992 0.9996296 0.958415 -0.9996296 0.9996296 0.958415 -0.9997074 0.9928291 0.9668867 -0.9997689 0.9899767 0.9736722 -0.9998174 0.9893272 0.9790925 -0.9998557 0.9898312 0.9834128 -0.999886 0.9908724 0.9868504 -0.9999099 0.9921007 0.9895819 -0.9999288 0.9933267 0.9917501 -0.9999437 0.994456 0.9934695 -0.9668873 0.9997074 0.9668881 -0.9668872 0.9997074 0.9668879 -0.9668871 0.9997074 0.9668877 -0.966887 0.9997074 0.9668874 -0.9668869 0.9997074 0.9668871 -0.9668867 0.9997074 0.9668867 -0.966887 0.9997074 0.9668867 -0.9668873 0.9997074 0.9668867 -0.9668878 0.9997074 0.9668867 -0.9668883 0.9997074 0.9668867 -0.966889 0.9997074 0.9668867 -0.9668899 0.9997074 0.9668867 -0.9668911 0.9997074 0.9668867 -0.9668925 0.9997074 0.9668867 -0.9668944 0.9997074 0.9668867 -0.9668967 0.9997074 0.9668867 -0.9668996 0.9997074 0.9668867 -0.9669033 0.9997074 0.9668867 -0.966908 0.9997074 0.9668867 -0.966914 0.9997074 0.9668867 -0.9669215 0.9997074 0.9668867 -0.966931 0.9997074 0.9668867 -0.966943 0.9997074 0.9668867 -0.9669582 0.9997074 0.9668867 -0.9669774 0.9997074 0.9668867 -0.9670018 0.9997074 0.9668867 -0.9670325 0.9997074 0.9668867 -0.9670715 0.9997074 0.9668867 -0.9671208 0.9997074 0.9668867 -0.9671831 0.9997074 0.9668867 -0.967262 0.9997074 0.9668867 -0.9673618 0.9997074 0.9668867 -0.967488 0.9997074 0.9668867 -0.9676477 0.9997074 0.9668867 -0.9678498 0.9997074 0.9668867 -0.9681054 0.9997074 0.9668867 -0.9684288 0.9997074 0.9668867 -0.9688379 0.9997074 0.9668867 -0.9693555 0.9997074 0.9668867 -0.9700103 0.9997074 0.9668867 -0.9708388 0.9997074 0.9668867 -0.9718869 0.9997074 0.9668867 -0.9732129 0.9997074 0.9668867 -0.9748904 0.9997074 0.9668867 -0.9770128 0.9997074 0.9668867 -0.9796978 0.9997074 0.9668867 -0.9830947 0.9997074 0.9668867 -0.9873922 0.9997074 0.9668867 -0.9928291 0.9997074 0.9668867 -0.9997074 0.9997074 0.9668867 -0.9997689 0.9942997 0.9736722 -0.9998174 0.9920409 0.9790925 -0.9998557 0.991533 0.9834128 -0.999886 0.9919388 0.9868504 -0.9999099 0.9927686 0.9895819 -0.9999288 0.9937447 0.9917501 -0.9999437 0.9947175 0.9934695 -0.9736726 0.9997689 0.9736731 -0.9736726 0.9997689 0.973673 -0.9736725 0.9997689 0.9736728 -0.9736724 0.9997689 0.9736727 -0.9736723 0.9997689 0.9736725 -0.9736722 0.9997689 0.9736722 -0.9736724 0.9997689 0.9736722 -0.9736726 0.9997689 0.9736722 -0.9736729 0.9997689 0.9736722 -0.9736733 0.9997689 0.9736722 -0.9736737 0.9997689 0.9736722 -0.9736743 0.9997689 0.9736722 -0.973675 0.9997689 0.9736722 -0.9736759 0.9997689 0.9736722 -0.973677 0.9997689 0.9736722 -0.9736785 0.9997689 0.9736722 -0.9736803 0.9997689 0.9736722 -0.9736827 0.9997689 0.9736722 -0.9736856 0.9997689 0.9736722 -0.9736894 0.9997689 0.9736722 -0.9736941 0.9997689 0.9736722 -0.9737 0.9997689 0.9736722 -0.9737076 0.9997689 0.9736722 -0.9737172 0.9997689 0.9736722 -0.9737292 0.9997689 0.9736722 -0.9737445 0.9997689 0.9736722 -0.9737639 0.9997689 0.9736722 -0.9737884 0.9997689 0.9736722 -0.9738193 0.9997689 0.9736722 -0.9738585 0.9997689 0.9736722 -0.9739081 0.9997689 0.9736722 -0.9739708 0.9997689 0.9736722 -0.9740501 0.9997689 0.9736722 -0.9741505 0.9997689 0.9736722 -0.9742775 0.9997689 0.9736722 -0.9744382 0.9997689 0.9736722 -0.9746414 0.9997689 0.9736722 -0.9748985 0.9997689 0.9736722 -0.9752238 0.9997689 0.9736722 -0.9756354 0.9997689 0.9736722 -0.9761561 0.9997689 0.9736722 -0.9768148 0.9997689 0.9736722 -0.9776482 0.9997689 0.9736722 -0.9787025 0.9997689 0.9736722 -0.9800364 0.9997689 0.9736722 -0.9817239 0.9997689 0.9736722 -0.9838588 0.9997689 0.9736722 -0.9865597 0.9997689 0.9736722 -0.9899767 0.9997689 0.9736722 -0.9942997 0.9997689 0.9736722 -0.9997689 0.9997689 0.9736722 -0.9998174 0.995474 0.9790925 -0.9998557 0.993686 0.9834128 -0.999886 0.9932879 0.9868504 -0.9999099 0.9936134 0.9895819 -0.9999288 0.9942736 0.9917501 -0.9999437 0.9950484 0.9934695 -0.9790927 0.9998174 0.979093 -0.9790927 0.9998174 0.9790929 -0.9790927 0.9998174 0.9790929 -0.9790926 0.9998174 0.9790928 -0.9790925 0.9998174 0.9790926 -0.9790925 0.9998174 0.9790925 -0.9790926 0.9998174 0.9790925 -0.9790927 0.9998174 0.9790925 -0.9790929 0.9998174 0.9790925 -0.9790931 0.9998174 0.9790925 -0.9790934 0.9998174 0.9790925 -0.9790938 0.9998174 0.9790925 -0.9790942 0.9998174 0.9790925 -0.9790948 0.9998174 0.9790925 -0.9790955 0.9998174 0.9790925 -0.9790964 0.9998174 0.9790925 -0.9790976 0.9998174 0.9790925 -0.979099 0.9998174 0.9790925 -0.9791009 0.9998174 0.9790925 -0.9791032 0.9998174 0.9790925 -0.9791062 0.9998174 0.9790925 -0.9791099 0.9998174 0.9790925 -0.9791147 0.9998174 0.9790925 -0.9791207 0.9998174 0.9790925 -0.9791283 0.9998174 0.9790925 -0.9791379 0.9998174 0.9790925 -0.97915 0.9998174 0.9790925 -0.9791654 0.9998174 0.9790925 -0.9791848 0.9998174 0.9790925 -0.9792094 0.9998174 0.9790925 -0.9792405 0.9998174 0.9790925 -0.9792799 0.9998174 0.9790925 -0.9793297 0.9998174 0.9790925 -0.9793927 0.9998174 0.9790925 -0.9794724 0.9998174 0.9790925 -0.9795733 0.9998174 0.9790925 -0.9797009 0.9998174 0.9790925 -0.9798623 0.9998174 0.9790925 -0.9800665 0.9998174 0.9790925 -0.9803248 0.9998174 0.9790925 -0.9806517 0.9998174 0.9790925 -0.9810652 0.9998174 0.9790925 -0.9815883 0.9998174 0.9790925 -0.9822501 0.9998174 0.9790925 -0.9830874 0.9998174 0.9790925 -0.9841467 0.9998174 0.9790925 -0.9854868 0.9998174 0.9790925 -0.9871823 0.9998174 0.9790925 -0.9893272 0.9998174 0.9790925 -0.9920409 0.9998174 0.9790925 -0.995474 0.9998174 0.9790925 -0.9998174 0.9998174 0.9790925 -0.9998557 0.9964098 0.9834128 -0.999886 0.9949948 0.9868504 -0.9999099 0.9946823 0.9895819 -0.9999288 0.9949426 0.9917501 -0.9999437 0.9954671 0.9934695 -0.9834129 0.9998557 0.9834131 -0.9834129 0.9998557 0.9834131 -0.9834129 0.9998557 0.983413 -0.9834129 0.9998557 0.983413 -0.9834128 0.9998557 0.9834129 -0.9834128 0.9998557 0.9834128 -0.9834128 0.9998557 0.9834128 -0.9834129 0.9998557 0.9834128 -0.983413 0.9998557 0.9834128 -0.9834132 0.9998557 0.9834128 -0.9834134 0.9998557 0.9834128 -0.9834136 0.9998557 0.9834128 -0.9834139 0.9998557 0.9834128 -0.9834142 0.9998557 0.9834128 -0.9834147 0.9998557 0.9834128 -0.9834152 0.9998557 0.9834128 -0.983416 0.9998557 0.9834128 -0.9834169 0.9998557 0.9834128 -0.9834181 0.9998557 0.9834128 -0.9834195 0.9998557 0.9834128 -0.9834214 0.9998557 0.9834128 -0.9834237 0.9998557 0.9834128 -0.9834267 0.9998557 0.9834128 -0.9834305 0.9998557 0.9834128 -0.9834352 0.9998557 0.9834128 -0.9834412 0.9998557 0.9834128 -0.9834489 0.9998557 0.9834128 -0.9834585 0.9998557 0.9834128 -0.9834707 0.9998557 0.9834128 -0.9834861 0.9998557 0.9834128 -0.9835056 0.9998557 0.9834128 -0.9835303 0.9998557 0.9834128 -0.9835615 0.9998557 0.9834128 -0.9836011 0.9998557 0.9834128 -0.983651 0.9998557 0.9834128 -0.9837143 0.9998557 0.9834128 -0.9837943 0.9998557 0.9834128 -0.9838955 0.9998557 0.9834128 -0.9840236 0.9998557 0.9834128 -0.9841856 0.9998557 0.9834128 -0.9843906 0.9998557 0.9834128 -0.9846499 0.9998557 0.9834128 -0.9849779 0.9998557 0.9834128 -0.985393 0.9998557 0.9834128 -0.9859181 0.9998557 0.9834128 -0.9865824 0.9998557 0.9834128 -0.9874228 0.9998557 0.9834128 -0.988486 0.9998557 0.9834128 -0.9898312 0.9998557 0.9834128 -0.991533 0.9998557 0.9834128 -0.993686 0.9998557 0.9834128 -0.9964098 0.9998557 0.9834128 -0.9998557 0.9998557 0.9834128 -0.999886 0.9971541 0.9868504 -0.9999099 0.9960346 0.9895819 -0.9999288 0.9957891 0.9917501 -0.9999437 0.9959967 0.9934695 -0.9868505 0.999886 0.9868506 -0.9868505 0.999886 0.9868506 -0.9868505 0.999886 0.9868506 -0.9868505 0.999886 0.9868505 -0.9868504 0.999886 0.9868505 -0.9868504 0.999886 0.9868504 -0.9868504 0.999886 0.9868504 -0.9868505 0.999886 0.9868504 -0.9868506 0.999886 0.9868504 -0.9868507 0.999886 0.9868504 -0.9868508 0.999886 0.9868504 -0.9868509 0.999886 0.9868504 -0.9868511 0.999886 0.9868504 -0.9868513 0.999886 0.9868504 -0.9868516 0.999886 0.9868504 -0.986852 0.999886 0.9868504 -0.9868524 0.999886 0.9868504 -0.986853 0.999886 0.9868504 -0.9868537 0.999886 0.9868504 -0.9868546 0.999886 0.9868504 -0.9868558 0.999886 0.9868504 -0.9868573 0.999886 0.9868504 -0.9868591 0.999886 0.9868504 -0.9868615 0.999886 0.9868504 -0.9868645 0.999886 0.9868504 -0.9868682 0.999886 0.9868504 -0.986873 0.999886 0.9868504 -0.9868791 0.999886 0.9868504 -0.9868867 0.999886 0.9868504 -0.9868964 0.999886 0.9868504 -0.9869086 0.999886 0.9868504 -0.9869241 0.999886 0.9868504 -0.9869436 0.999886 0.9868504 -0.9869684 0.999886 0.9868504 -0.9869997 0.999886 0.9868504 -0.9870393 0.999886 0.9868504 -0.9870895 0.999886 0.9868504 -0.9871529 0.999886 0.9868504 -0.9872332 0.999886 0.9868504 -0.9873347 0.999886 0.9868504 -0.9874631 0.999886 0.9868504 -0.9876256 0.999886 0.9868504 -0.9878312 0.999886 0.9868504 -0.9880913 0.999886 0.9868504 -0.9884203 0.999886 0.9868504 -0.9888366 0.999886 0.9868504 -0.9893632 0.999886 0.9868504 -0.9900295 0.999886 0.9868504 -0.9908724 0.999886 0.9868504 -0.9919388 0.999886 0.9868504 -0.9932879 0.999886 0.9868504 -0.9949948 0.999886 0.9868504 -0.9971541 0.999886 0.9868504 -0.999886 0.999886 0.9868504 -0.9999099 0.9977455 0.9895819 -0.9999288 0.99686 0.9917501 -0.9999437 0.9966668 0.9934695 -0.989582 0.9999099 0.9895821 -0.989582 0.9999099 0.9895821 -0.989582 0.9999099 0.989582 -0.989582 0.9999099 0.989582 -0.989582 0.9999099 0.989582 -0.9895819 0.9999099 0.9895819 -0.989582 0.9999099 0.9895819 -0.989582 0.9999099 0.9895819 -0.989582 0.9999099 0.9895819 -0.9895821 0.9999099 0.9895819 -0.9895822 0.9999099 0.9895819 -0.9895823 0.9999099 0.9895819 -0.9895824 0.9999099 0.9895819 -0.9895825 0.9999099 0.9895819 -0.9895827 0.9999099 0.9895819 -0.9895829 0.9999099 0.9895819 -0.9895832 0.9999099 0.9895819 -0.9895836 0.9999099 0.9895819 -0.989584 0.9999099 0.9895819 -0.9895846 0.9999099 0.9895819 -0.9895853 0.9999099 0.9895819 -0.9895862 0.9999099 0.9895819 -0.9895874 0.9999099 0.9895819 -0.9895889 0.9999099 0.9895819 -0.9895908 0.9999099 0.9895819 -0.9895931 0.9999099 0.9895819 -0.9895961 0.9999099 0.9895819 -0.9895999 0.9999099 0.9895819 -0.9896047 0.9999099 0.9895819 -0.9896107 0.9999099 0.9895819 -0.9896184 0.9999099 0.9895819 -0.9896281 0.9999099 0.9895819 -0.9896403 0.9999099 0.9895819 -0.9896558 0.9999099 0.9895819 -0.9896755 0.9999099 0.9895819 -0.9897003 0.9999099 0.9895819 -0.9897317 0.9999099 0.9895819 -0.9897714 0.9999099 0.9895819 -0.9898216 0.9999099 0.9895819 -0.9898852 0.9999099 0.9895819 -0.9899657 0.9999099 0.9895819 -0.9900674 0.9999099 0.9895819 -0.9901962 0.9999099 0.9895819 -0.990359 0.9999099 0.9895819 -0.9905651 0.9999099 0.9895819 -0.9908258 0.9999099 0.9895819 -0.9911556 0.9999099 0.9895819 -0.9915728 0.9999099 0.9895819 -0.9921007 0.9999099 0.9895819 -0.9927686 0.9999099 0.9895819 -0.9936134 0.9999099 0.9895819 -0.9946823 0.9999099 0.9895819 -0.9960346 0.9999099 0.9895819 -0.9977455 0.9999099 0.9895819 -0.9999099 0.9999099 0.9895819 -0.9999288 0.9982148 0.9917501 -0.9999437 0.9975145 0.9934695 -0.9917501 0.9999288 0.9917501 -0.9917501 0.9999288 0.9917501 -0.9917501 0.9999288 0.9917501 -0.9917501 0.9999288 0.9917501 -0.9917501 0.9999288 0.9917501 -0.9917501 0.9999288 0.9917501 -0.9917501 0.9999288 0.9917501 -0.9917501 0.9999288 0.9917501 -0.9917501 0.9999288 0.9917501 -0.9917502 0.9999288 0.9917501 -0.9917502 0.9999288 0.9917501 -0.9917503 0.9999288 0.9917501 -0.9917503 0.9999288 0.9917501 -0.9917504 0.9999288 0.9917501 -0.9917505 0.9999288 0.9917501 -0.9917507 0.9999288 0.9917501 -0.9917508 0.9999288 0.9917501 -0.9917511 0.9999288 0.9917501 -0.9917514 0.9999288 0.9917501 -0.9917517 0.9999288 0.9917501 -0.9917522 0.9999288 0.9917501 -0.9917527 0.9999288 0.9917501 -0.9917535 0.9999288 0.9917501 -0.9917544 0.9999288 0.9917501 -0.9917556 0.9999288 0.9917501 -0.991757 0.9999288 0.9917501 -0.9917589 0.9999288 0.9917501 -0.9917613 0.9999288 0.9917501 -0.9917643 0.9999288 0.9917501 -0.9917681 0.9999288 0.9917501 -0.9917729 0.9999288 0.9917501 -0.9917789 0.9999288 0.9917501 -0.9917866 0.9999288 0.9917501 -0.9917963 0.9999288 0.9917501 -0.9918086 0.9999288 0.9917501 -0.9918241 0.9999288 0.9917501 -0.9918438 0.9999288 0.9917501 -0.9918686 0.9999288 0.9917501 -0.9919001 0.9999288 0.9917501 -0.9919399 0.9999288 0.9917501 -0.9919902 0.9999288 0.9917501 -0.9920539 0.9999288 0.9917501 -0.9921345 0.9999288 0.9917501 -0.9922365 0.9999288 0.9917501 -0.9923655 0.9999288 0.9917501 -0.9925286 0.9999288 0.9917501 -0.9927351 0.9999288 0.9917501 -0.9929962 0.9999288 0.9917501 -0.9933267 0.9999288 0.9917501 -0.9937447 0.9999288 0.9917501 -0.9942736 0.9999288 0.9917501 -0.9949426 0.9999288 0.9917501 -0.9957891 0.9999288 0.9917501 -0.99686 0.9999288 0.9917501 -0.9982148 0.9999288 0.9917501 -0.9999288 0.9999288 0.9917501 -0.9999437 0.9985869 0.9934695 -0.9934695 0.9999437 0.9934695 -0.9934695 0.9999437 0.9934695 -0.9934695 0.9999437 0.9934695 -0.9934695 0.9999437 0.9934695 -0.9934695 0.9999437 0.9934695 -0.9934695 0.9999437 0.9934695 -0.9934695 0.9999437 0.9934695 -0.9934695 0.9999437 0.9934695 -0.9934695 0.9999437 0.9934695 -0.9934695 0.9999437 0.9934695 -0.9934696 0.9999437 0.9934695 -0.9934696 0.9999437 0.9934695 -0.9934696 0.9999437 0.9934695 -0.9934697 0.9999437 0.9934695 -0.9934698 0.9999437 0.9934695 -0.9934698 0.9999437 0.9934695 -0.99347 0.9999437 0.9934695 -0.9934701 0.9999437 0.9934695 -0.9934703 0.9999437 0.9934695 -0.9934705 0.9999437 0.9934695 -0.9934708 0.9999437 0.9934695 -0.9934711 0.9999437 0.9934695 -0.9934716 0.9999437 0.9934695 -0.9934722 0.9999437 0.9934695 -0.9934729 0.9999437 0.9934695 -0.9934738 0.9999437 0.9934695 -0.993475 0.9999437 0.9934695 -0.9934765 0.9999437 0.9934695 -0.9934784 0.9999437 0.9934695 -0.9934807 0.9999437 0.9934695 -0.9934837 0.9999437 0.9934695 -0.9934875 0.9999437 0.9934695 -0.9934923 0.9999437 0.9934695 -0.9934984 0.9999437 0.9934695 -0.9935061 0.9999437 0.9934695 -0.9935158 0.9999437 0.9934695 -0.9935281 0.9999437 0.9934695 -0.9935437 0.9999437 0.9934695 -0.9935633 0.9999437 0.9934695 -0.9935882 0.9999437 0.9934695 -0.9936197 0.9999437 0.9934695 -0.9936596 0.9999437 0.9934695 -0.99371 0.9999437 0.9934695 -0.9937738 0.9999437 0.9934695 -0.9938545 0.9999437 0.9934695 -0.9939566 0.9999437 0.9934695 -0.9940858 0.9999437 0.9934695 -0.9942492 0.9999437 0.9934695 -0.994456 0.9999437 0.9934695 -0.9947175 0.9999437 0.9934695 -0.9950484 0.9999437 0.9934695 -0.9954671 0.9999437 0.9934695 -0.9959967 0.9999437 0.9934695 -0.9966668 0.9999437 0.9934695 -0.9975145 0.9999437 0.9934695 -0.9985869 0.9999437 0.9934695 -0.9999437 0.9999437 0.9934695 -0.0000238 0.0000238 0.006079 -0.0005417 0.0000238 0.006079 -0.0011968 0.0000238 0.006079 -0.0020256 0.0000238 0.006079 -0.0030742 0.0000238 0.006079 -0.0044007 0.0000238 0.006079 -0.006079 0.0000238 0.006079 -0.0082023 0.0000238 0.006079 -0.0108885 0.0000238 0.006079 -0.0142868 0.0000238 0.006079 -0.0185862 0.0000238 0.006079 -0.0240255 0.0000238 0.006079 -0.0309069 0.0000238 0.006079 -0.0396127 0.0000238 0.006079 -0.0506267 0.0000238 0.006079 -0.0645609 0.0000238 0.006079 -0.0821895 0.0000238 0.006079 -0.1044919 0.0000238 0.006079 -0.1327073 0.0000238 0.006079 -0.1684036 0.0000238 0.006079 -0.2135639 0.0000238 0.006079 -0.2706977 0.0000238 0.006079 -0.3429792 0.0000238 0.006079 -0.4344249 0.0000238 0.006079 -0.5501155 0.0000238 0.006079 -0.6964791 0.0000238 0.006079 -0.8407292 0.0051514 0.0108903 -0.9033413 0.0279321 0.0326824 -0.9354466 0.0624569 0.0662 -0.9545467 0.1059991 0.108874 -0.9669269 0.1572498 0.1594176 -0.9754027 0.2151269 0.2167356 -0.9814251 0.2783684 0.2795441 -0.9858181 0.3454107 0.3462571 -0.9890841 0.4144197 0.41502 -0.9915469 0.4834235 0.483843 -0.993424 0.5504963 0.5507853 -0.9948662 0.6139459 0.6141423 -0.9959813 0.6724572 0.6725891 -0.9968475 0.7251659 0.7252535 -0.997523 0.7716588 0.7717164 -0.9980513 0.8119154 0.8119529 -0.9984653 0.8462171 0.8462413 -0.9987905 0.8750477 0.8750632 -0.9990461 0.8990028 0.8990127 -0.9992474 0.9187175 0.9187238 -0.999406 0.9348153 0.9348193 -0.999531 0.9478754 0.9478779 -0.9996296 0.958416 0.9584176 -0.9997074 0.9668873 0.9668883 -0.9997689 0.9736726 0.9736733 -0.9998174 0.9790927 0.9790931 -0.9998557 0.9834129 0.9834132 -0.999886 0.9868505 0.9868507 -0.9999099 0.989582 0.9895821 -0.9999288 0.9917501 0.9917502 -0.9999437 0.9934695 0.9934695 -0.0000238 0.0005417 0.006079 -0.0000382 0.0000382 0.0055755 -0.0006933 0.0000382 0.0055755 -0.0015221 0.0000382 0.0055755 -0.0025707 0.0000382 0.0055755 -0.0038972 0.0000382 0.0055755 -0.0055755 0.0000382 0.0055755 -0.0076988 0.0000382 0.0055755 -0.0103849 0.0000382 0.0055755 -0.0137833 0.0000382 0.0055755 -0.0180827 0.0000382 0.0055755 -0.023522 0.0000382 0.0055755 -0.0304033 0.0000382 0.0055755 -0.0391092 0.0000382 0.0055755 -0.0501232 0.0000382 0.0055755 -0.0640574 0.0000382 0.0055755 -0.081686 0.0000382 0.0055755 -0.1039884 0.0000382 0.0055755 -0.1322038 0.0000382 0.0055755 -0.1679 0.0000382 0.0055755 -0.2130604 0.0000382 0.0055755 -0.2701941 0.0000382 0.0055755 -0.3424757 0.0000382 0.0055755 -0.4339214 0.0000382 0.0055755 -0.549612 0.0000382 0.0055755 -0.6959756 0.0000382 0.0055755 -0.8405071 0.0051286 0.0103785 -0.9032596 0.0278872 0.0322331 -0.9354101 0.0624063 0.0658305 -0.9545286 0.1059489 0.1085789 -0.9669173 0.1572031 0.1591861 -0.9753975 0.2150852 0.2165567 -0.9814221 0.2783325 0.2794079 -0.9858163 0.3453807 0.3461549 -0.9890831 0.4143955 0.4149446 -0.9915463 0.4834045 0.4837882 -0.9934236 0.5504818 0.5507462 -0.994866 0.6139352 0.6141149 -0.9959811 0.6724495 0.6725701 -0.9968474 0.7251605 0.7252406 -0.997523 0.7716551 0.7717077 -0.9980512 0.8119128 0.8119471 -0.9984653 0.8462154 0.8462375 -0.9987905 0.8750466 0.8750608 -0.9990461 0.899002 0.8990111 -0.9992474 0.918717 0.9187228 -0.999406 0.9348149 0.9348186 -0.999531 0.9478752 0.9478775 -0.9996296 0.9584159 0.9584173 -0.9997074 0.9668872 0.9668882 -0.9997689 0.9736726 0.9736731 -0.9998174 0.9790927 0.9790931 -0.9998557 0.9834129 0.9834131 -0.999886 0.9868505 0.9868506 -0.9999099 0.989582 0.9895821 -0.9999288 0.9917501 0.9917501 -0.9999437 0.9934695 0.9934695 -0.0000238 0.0011968 0.006079 -0.0000382 0.0006933 0.0055755 -0.0000611 0.0000611 0.0049433 -0.0008899 0.0000611 0.0049433 -0.0019385 0.0000611 0.0049433 -0.003265 0.0000611 0.0049433 -0.0049433 0.0000611 0.0049433 -0.0070666 0.0000611 0.0049433 -0.0097527 0.0000611 0.0049433 -0.0131511 0.0000611 0.0049433 -0.0174505 0.0000611 0.0049433 -0.0228898 0.0000611 0.0049433 -0.0297711 0.0000611 0.0049433 -0.038477 0.0000611 0.0049433 -0.049491 0.0000611 0.0049433 -0.0634252 0.0000611 0.0049433 -0.0810538 0.0000611 0.0049433 -0.1033562 0.0000611 0.0049433 -0.1315716 0.0000611 0.0049433 -0.1672678 0.0000611 0.0049433 -0.2124282 0.0000611 0.0049433 -0.2695619 0.0000611 0.0049433 -0.3418435 0.0000611 0.0049433 -0.4332891 0.0000611 0.0049433 -0.5489798 0.0000611 0.0049433 -0.6953434 0.0000611 0.0049433 -0.8402274 0.0051047 0.0097356 -0.9031567 0.0278347 0.0316684 -0.9353643 0.0623458 0.0653663 -0.9545059 0.1058883 0.1082081 -0.9669053 0.1571463 0.1588953 -0.9753908 0.2150342 0.216332 -0.9814183 0.2782884 0.2792368 -0.9858141 0.3453439 0.3460265 -0.9890818 0.4143657 0.4148498 -0.9915455 0.4833811 0.4837194 -0.9934231 0.550464 0.5506971 -0.9948657 0.6139219 0.6140804 -0.9959809 0.6724399 0.6725462 -0.9968473 0.7251537 0.7252243 -0.9975229 0.7716504 0.7716968 -0.9980512 0.8119096 0.8119399 -0.9984653 0.8462132 0.8462328 -0.9987904 0.8750451 0.8750577 -0.9990461 0.8990011 0.8990091 -0.9992474 0.9187164 0.9187215 -0.999406 0.9348146 0.9348178 -0.999531 0.947875 0.947877 -0.9996296 0.9584157 0.958417 -0.9997074 0.9668871 0.966888 -0.9997689 0.9736725 0.973673 -0.9998174 0.9790927 0.979093 -0.9998557 0.9834129 0.9834131 -0.999886 0.9868505 0.9868506 -0.9999099 0.989582 0.9895821 -0.9999288 0.9917501 0.9917501 -0.9999437 0.9934695 0.9934695 -0.0000238 0.0020256 0.006079 -0.0000382 0.0015221 0.0055755 -0.0000611 0.0008899 0.0049433 -0.0000978 0.0000978 0.0041512 -0.0011463 0.0000978 0.0041512 -0.0024729 0.0000978 0.0041512 -0.0041512 0.0000978 0.0041512 -0.0062744 0.0000978 0.0041512 -0.0089606 0.0000978 0.0041512 -0.012359 0.0000978 0.0041512 -0.0166583 0.0000978 0.0041512 -0.0220976 0.0000978 0.0041512 -0.028979 0.0000978 0.0041512 -0.0376849 0.0000978 0.0041512 -0.0486989 0.0000978 0.0041512 -0.0626331 0.0000978 0.0041512 -0.0802616 0.0000978 0.0041512 -0.102564 0.0000978 0.0041512 -0.1307795 0.0000978 0.0041512 -0.1664757 0.0000978 0.0041512 -0.2116361 0.0000978 0.0041512 -0.2687698 0.0000978 0.0041512 -0.3410514 0.0000978 0.0041512 -0.432497 0.0000978 0.0041512 -0.5481876 0.0000978 0.0041512 -0.6945513 0.0000978 0.0041512 -0.8398756 0.0050826 0.0089295 -0.9030276 0.0277752 0.0309602 -0.9353068 0.0622749 0.0647842 -0.9544774 0.1058162 0.1077431 -0.9668902 0.1570779 0.1585307 -0.9753825 0.2149725 0.2160503 -0.9814136 0.2782347 0.2790223 -0.9858113 0.3452987 0.3458657 -0.9890801 0.414329 0.4147311 -0.9915446 0.4833522 0.4836332 -0.9934225 0.5504419 0.5506355 -0.9948653 0.6139056 0.6140371 -0.9959807 0.672428 0.6725163 -0.9968472 0.7251454 0.725204 -0.9975228 0.7716446 0.7716831 -0.9980511 0.8119057 0.8119308 -0.9984653 0.8462106 0.8462268 -0.9987904 0.8750434 0.8750538 -0.9990461 0.899 0.8990066 -0.9992474 0.9187157 0.9187199 -0.999406 0.9348141 0.9348168 -0.999531 0.9478746 0.9478763 -0.9996296 0.9584155 0.9584166 -0.9997074 0.966887 0.9668877 -0.9997689 0.9736724 0.9736729 -0.9998174 0.9790926 0.9790929 -0.9998557 0.9834129 0.983413 -0.999886 0.9868505 0.9868506 -0.9999099 0.989582 0.989582 -0.9999288 0.9917501 0.9917501 -0.9999437 0.9934695 0.9934695 -0.0000238 0.0030742 0.006079 -0.0000382 0.0025707 0.0055755 -0.0000611 0.0019385 0.0049433 -0.0000978 0.0011463 0.0041512 -0.0001565 0.0001565 0.0031613 -0.001483 0.0001565 0.0031613 -0.0031613 0.0001565 0.0031613 -0.0052846 0.0001565 0.0031613 -0.0079707 0.0001565 0.0031613 -0.0113691 0.0001565 0.0031613 -0.0156685 0.0001565 0.0031613 -0.0211078 0.0001565 0.0031613 -0.0279891 0.0001565 0.0031613 -0.036695 0.0001565 0.0031613 -0.047709 0.0001565 0.0031613 -0.0616432 0.0001565 0.0031613 -0.0792718 0.0001565 0.0031613 -0.1015742 0.0001565 0.0031613 -0.1297896 0.0001565 0.0031613 -0.1654858 0.0001565 0.0031613 -0.2106462 0.0001565 0.0031613 -0.2677799 0.0001565 0.0031613 -0.3400615 0.0001565 0.0031613 -0.4315072 0.0001565 0.0031613 -0.5471978 0.0001565 0.0031613 -0.6935614 0.0001565 0.0031613 -0.8394338 0.0050676 0.0079213 -0.9028657 0.0277111 0.0300741 -0.9352348 0.0621943 0.0640558 -0.9544418 0.1057322 0.1071616 -0.9668714 0.1569971 0.1580746 -0.9753721 0.2148987 0.2156981 -0.9814076 0.2781701 0.2787542 -0.9858079 0.3452442 0.3456646 -0.9890781 0.4142845 0.4145826 -0.9915433 0.4833171 0.4835254 -0.9934218 0.550415 0.5505585 -0.9948649 0.6138855 0.6139831 -0.9959804 0.6724135 0.672479 -0.996847 0.7251351 0.7251785 -0.9975227 0.7716375 0.771666 -0.9980511 0.8119009 0.8119195 -0.9984652 0.8462073 0.8462194 -0.9987904 0.8750412 0.875049 -0.9990461 0.8989986 0.8990035 -0.9992474 0.9187148 0.9187179 -0.999406 0.9348135 0.9348155 -0.999531 0.9478743 0.9478755 -0.9996296 0.9584153 0.9584161 -0.9997074 0.9668869 0.9668874 -0.9997689 0.9736723 0.9736726 -0.9998174 0.9790925 0.9790927 -0.9998557 0.9834128 0.9834129 -0.999886 0.9868504 0.9868505 -0.9999099 0.989582 0.989582 -0.9999288 0.9917501 0.9917501 -0.9999437 0.9934695 0.9934695 -0.0000238 0.0044007 0.006079 -0.0000382 0.0038972 0.0055755 -0.0000611 0.003265 0.0049433 -0.0000978 0.0024729 0.0041512 -0.0001565 0.001483 0.0031613 -0.0002504 0.0002504 0.0019287 -0.0019287 0.0002504 0.0019287 -0.004052 0.0002504 0.0019287 -0.0067381 0.0002504 0.0019287 -0.0101365 0.0002504 0.0019287 -0.0144359 0.0002504 0.0019287 -0.0198752 0.0002504 0.0019287 -0.0267565 0.0002504 0.0019287 -0.0354624 0.0002504 0.0019287 -0.0464764 0.0002504 0.0019287 -0.0604106 0.0002504 0.0019287 -0.0780392 0.0002504 0.0019287 -0.1003416 0.0002504 0.0019287 -0.128557 0.0002504 0.0019287 -0.1642532 0.0002504 0.0019287 -0.2094136 0.0002504 0.0019287 -0.2665473 0.0002504 0.0019287 -0.3388289 0.0002504 0.0019287 -0.4302746 0.0002504 0.0019287 -0.5459652 0.0002504 0.0019287 -0.6923288 0.0002504 0.0019287 -0.8388802 0.0050694 0.0066646 -0.9026634 0.0276479 0.0289691 -0.9351449 0.0621069 0.0631476 -0.9543974 0.1056375 0.1064365 -0.9668479 0.156904 0.1575062 -0.9753591 0.2148124 0.2152591 -0.9814002 0.2780936 0.27842 -0.9858036 0.3451791 0.345414 -0.9890755 0.4142311 0.4143977 -0.9915418 0.4832747 0.4833911 -0.9934209 0.5503825 0.5504627 -0.9948643 0.6138613 0.6139158 -0.9959801 0.6723959 0.6724325 -0.9968468 0.7251226 0.7251469 -0.9975226 0.7716288 0.7716448 -0.998051 0.8118949 0.8119053 -0.9984652 0.8462034 0.8462101 -0.9987904 0.8750386 0.8750429 -0.9990461 0.8989969 0.8989996 -0.9992474 0.9187137 0.9187154 -0.9994059 0.9348128 0.9348139 -0.999531 0.9478738 0.9478745 -0.9996296 0.958415 0.9584154 -0.9997074 0.9668867 0.966887 -0.9997689 0.9736722 0.9736724 -0.9998174 0.9790925 0.9790926 -0.9998557 0.9834128 0.9834128 -0.999886 0.9868504 0.9868504 -0.9999099 0.9895819 0.989582 -0.9999288 0.9917501 0.9917501 -0.9999437 0.9934695 0.9934695 -0.0000238 0.006079 0.006079 -0.0000382 0.0055755 0.0055755 -0.0000611 0.0049433 0.0049433 -0.0000978 0.0041512 0.0041512 -0.0001565 0.0031613 0.0031613 -0.0002504 0.0019287 0.0019287 -0.0004008 0.0004008 0.0004008 -0.0025241 0.0004008 0.0004008 -0.0052103 0.0004008 0.0004008 -0.0086086 0.0004008 0.0004008 -0.012908 0.0004008 0.0004008 -0.0183473 0.0004008 0.0004008 -0.0252287 0.0004008 0.0004008 -0.0339345 0.0004008 0.0004008 -0.0449485 0.0004008 0.0004008 -0.0588827 0.0004008 0.0004008 -0.0765113 0.0004008 0.0004008 -0.0988137 0.0004008 0.0004008 -0.1270291 0.0004008 0.0004008 -0.1627254 0.0004008 0.0004008 -0.2078857 0.0004008 0.0004008 -0.2650195 0.0004008 0.0004008 -0.337301 0.0004008 0.0004008 -0.4287467 0.0004008 0.0004008 -0.5444373 0.0004008 0.0004008 -0.6908009 0.0004008 0.0004008 -0.8381886 0.0051048 0.0051048 -0.9024114 0.0275966 0.0275966 -0.9350332 0.0620199 0.0620199 -0.9543421 0.1055364 0.1055364 -0.9668187 0.1568008 0.1568008 -0.975343 0.2147144 0.2147144 -0.9813911 0.2780055 0.2780055 -0.9857982 0.3451032 0.3451032 -0.9890723 0.4141683 0.4141683 -0.9915399 0.4832246 0.4832246 -0.9934197 0.5503438 0.5503438 -0.9948636 0.6138323 0.6138323 -0.9959797 0.6723748 0.6723748 -0.9968465 0.7251076 0.7251076 -0.9975224 0.7716184 0.7716184 -0.9980509 0.8118878 0.8118878 -0.9984651 0.8461986 0.8461986 -0.9987903 0.8750355 0.8750355 -0.9990461 0.8989948 0.8989948 -0.9992473 0.9187123 0.9187123 -0.9994059 0.9348119 0.9348119 -0.999531 0.9478733 0.9478733 -0.9996296 0.9584146 0.9584146 -0.9997074 0.9668865 0.9668865 -0.9997689 0.9736721 0.9736721 -0.9998174 0.9790924 0.9790924 -0.9998557 0.9834127 0.9834127 -0.999886 0.9868504 0.9868504 -0.9999099 0.9895819 0.9895819 -0.9999288 0.99175 0.99175 -0.9999437 0.9934695 0.9934695 -0.0000238 0.0082023 0.006079 -0.0000382 0.0076988 0.0055755 -0.0000611 0.0070666 0.0049433 -0.0000978 0.0062744 0.0041512 -0.0001565 0.0052846 0.0031613 -0.0002504 0.004052 0.0019287 -0.0004008 0.0025241 0.0004008 -0.0025241 0.0025241 0.0004008 -0.0052103 0.0025241 0.0004008 -0.0086086 0.0025241 0.0004008 -0.012908 0.0025241 0.0004008 -0.0183473 0.0025241 0.0004008 -0.0252287 0.0025241 0.0004008 -0.0339345 0.0025241 0.0004008 -0.0449485 0.0025241 0.0004008 -0.0588827 0.0025241 0.0004008 -0.0765113 0.0025241 0.0004008 -0.0988137 0.0025241 0.0004008 -0.1270291 0.0025241 0.0004008 -0.1627254 0.0025241 0.0004008 -0.2078857 0.0025241 0.0004008 -0.2650195 0.0025241 0.0004008 -0.337301 0.0025241 0.0004008 -0.4287467 0.0025241 0.0004008 -0.5444373 0.0025241 0.0004008 -0.6908009 0.0025241 0.0004008 -0.8381886 0.007125 0.0051048 -0.9024114 0.0292702 0.0275966 -0.9350332 0.063338 0.0620199 -0.9543421 0.1065482 0.1055364 -0.9668187 0.1575633 0.1568008 -0.975343 0.2152799 0.2147144 -0.9813911 0.2784186 0.2780055 -0.9857982 0.3454005 0.3451032 -0.9890723 0.4143791 0.4141683 -0.9915399 0.4833719 0.4832246 -0.9934197 0.5504452 0.5503438 -0.9948636 0.6139012 0.6138323 -0.9959797 0.6724211 0.6723748 -0.9968465 0.7251383 0.7251076 -0.9975224 0.7716386 0.7716184 -0.9980509 0.811901 0.8118878 -0.9984651 0.8462071 0.8461986 -0.9987903 0.8750409 0.8750355 -0.9990461 0.8989983 0.8989948 -0.9992473 0.9187145 0.9187123 -0.9994059 0.9348133 0.9348119 -0.999531 0.9478742 0.9478733 -0.9996296 0.9584152 0.9584146 -0.9997074 0.9668868 0.9668865 -0.9997689 0.9736723 0.9736721 -0.9998174 0.9790925 0.9790924 -0.9998557 0.9834128 0.9834127 -0.999886 0.9868504 0.9868504 -0.9999099 0.989582 0.9895819 -0.9999288 0.9917501 0.99175 -0.9999437 0.9934695 0.9934695 -0.0000238 0.0108885 0.006079 -0.0000382 0.0103849 0.0055755 -0.0000611 0.0097527 0.0049433 -0.0000978 0.0089606 0.0041512 -0.0001565 0.0079707 0.0031613 -0.0002504 0.0067381 0.0019287 -0.0004008 0.0052103 0.0004008 -0.0025241 0.0052103 0.0004008 -0.0052103 0.0052103 0.0004008 -0.0086086 0.0052103 0.0004008 -0.012908 0.0052103 0.0004008 -0.0183473 0.0052103 0.0004008 -0.0252287 0.0052103 0.0004008 -0.0339345 0.0052103 0.0004008 -0.0449485 0.0052103 0.0004008 -0.0588827 0.0052103 0.0004008 -0.0765113 0.0052103 0.0004008 -0.0988137 0.0052103 0.0004008 -0.1270291 0.0052103 0.0004008 -0.1627254 0.0052103 0.0004008 -0.2078857 0.0052103 0.0004008 -0.2650195 0.0052103 0.0004008 -0.337301 0.0052103 0.0004008 -0.4287467 0.0052103 0.0004008 -0.5444373 0.0052103 0.0004008 -0.6908009 0.0052103 0.0004008 -0.8381886 0.0096809 0.0051048 -0.9024114 0.0313876 0.0275966 -0.9350332 0.0650057 0.0620199 -0.9543421 0.1078283 0.1055364 -0.9668187 0.158528 0.1568008 -0.975343 0.2159954 0.2147144 -0.9813911 0.2789413 0.2780055 -0.9857982 0.3457767 0.3451032 -0.9890723 0.4146458 0.4141683 -0.9915399 0.4835582 0.4832246 -0.9934197 0.5505736 0.5503438 -0.9948636 0.6139885 0.6138323 -0.9959797 0.6724796 0.6723748 -0.9968465 0.7251772 0.7251076 -0.9975224 0.7716641 0.7716184 -0.9980509 0.8119176 0.8118878 -0.9984651 0.8462179 0.8461986 -0.9987903 0.8750478 0.8750355 -0.9990461 0.8990027 0.8989948 -0.9992473 0.9187173 0.9187123 -0.9994059 0.9348151 0.9348119 -0.999531 0.9478753 0.9478733 -0.9996296 0.9584159 0.9584146 -0.9997074 0.9668873 0.9668865 -0.9997689 0.9736726 0.9736721 -0.9998174 0.9790927 0.9790924 -0.9998557 0.9834129 0.9834127 -0.999886 0.9868505 0.9868504 -0.9999099 0.989582 0.9895819 -0.9999288 0.9917501 0.99175 -0.9999437 0.9934695 0.9934695 -0.0000238 0.0142868 0.006079 -0.0000382 0.0137833 0.0055755 -0.0000611 0.0131511 0.0049433 -0.0000978 0.012359 0.0041512 -0.0001565 0.0113691 0.0031613 -0.0002504 0.0101365 0.0019287 -0.0004008 0.0086086 0.0004008 -0.0025241 0.0086086 0.0004008 -0.0052103 0.0086086 0.0004008 -0.0086086 0.0086086 0.0004008 -0.012908 0.0086086 0.0004008 -0.0183473 0.0086086 0.0004008 -0.0252287 0.0086086 0.0004008 -0.0339345 0.0086086 0.0004008 -0.0449485 0.0086086 0.0004008 -0.0588827 0.0086086 0.0004008 -0.0765113 0.0086086 0.0004008 -0.0988137 0.0086086 0.0004008 -0.1270291 0.0086086 0.0004008 -0.1627254 0.0086086 0.0004008 -0.2078857 0.0086086 0.0004008 -0.2650195 0.0086086 0.0004008 -0.337301 0.0086086 0.0004008 -0.4287467 0.0086086 0.0004008 -0.5444373 0.0086086 0.0004008 -0.6908009 0.0086086 0.0004008 -0.8381886 0.0129143 0.0051048 -0.9024114 0.0340663 0.0275966 -0.9350332 0.0671155 0.0620199 -0.9543421 0.1094478 0.1055364 -0.9668187 0.1597484 0.1568008 -0.975343 0.2169006 0.2147144 -0.9813911 0.2796026 0.2780055 -0.9857982 0.3462526 0.3451032 -0.9890723 0.4149832 0.4141683 -0.9915399 0.4837939 0.4832246 -0.9934197 0.550736 0.5503438 -0.9948636 0.6140988 0.6138323 -0.9959797 0.6725537 0.6723748 -0.9968465 0.7252263 0.7251076 -0.9975224 0.7716964 0.7716184 -0.9980509 0.8119387 0.8118878 -0.9984651 0.8462315 0.8461986 -0.9987903 0.8750566 0.8750355 -0.9990461 0.8990083 0.8989948 -0.9992473 0.9187209 0.9187123 -0.9994059 0.9348174 0.9348119 -0.999531 0.9478767 0.9478733 -0.9996296 0.9584168 0.9584146 -0.9997074 0.9668878 0.9668865 -0.9997689 0.9736729 0.9736721 -0.9998174 0.9790929 0.9790924 -0.9998557 0.9834131 0.9834127 -0.999886 0.9868506 0.9868504 -0.9999099 0.9895821 0.9895819 -0.9999288 0.9917501 0.99175 -0.9999437 0.9934695 0.9934695 -0.0000238 0.0185862 0.006079 -0.0000382 0.0180827 0.0055755 -0.0000611 0.0174505 0.0049433 -0.0000978 0.0166583 0.0041512 -0.0001565 0.0156685 0.0031613 -0.0002504 0.0144359 0.0019287 -0.0004008 0.012908 0.0004008 -0.0025241 0.012908 0.0004008 -0.0052103 0.012908 0.0004008 -0.0086086 0.012908 0.0004008 -0.012908 0.012908 0.0004008 -0.0183473 0.012908 0.0004008 -0.0252287 0.012908 0.0004008 -0.0339345 0.012908 0.0004008 -0.0449485 0.012908 0.0004008 -0.0588827 0.012908 0.0004008 -0.0765113 0.012908 0.0004008 -0.0988137 0.012908 0.0004008 -0.1270291 0.012908 0.0004008 -0.1627254 0.012908 0.0004008 -0.2078857 0.012908 0.0004008 -0.2650195 0.012908 0.0004008 -0.337301 0.012908 0.0004008 -0.4287467 0.012908 0.0004008 -0.5444373 0.012908 0.0004008 -0.6908009 0.012908 0.0004008 -0.8381886 0.0170051 0.0051048 -0.9024114 0.0374553 0.0275966 -0.9350332 0.0697847 0.0620199 -0.9543421 0.1114966 0.1055364 -0.9668187 0.1612925 0.1568008 -0.975343 0.2180458 0.2147144 -0.9813911 0.2804391 0.2780055 -0.9857982 0.3468546 0.3451032 -0.9890723 0.41541 0.4141683 -0.9915399 0.4840922 0.4832246 -0.9934197 0.5509414 0.5503438 -0.9948636 0.6142384 0.6138323 -0.9959797 0.6726474 0.6723748 -0.9968465 0.7252885 0.7251076 -0.9975224 0.7717373 0.7716184 -0.9980509 0.8119653 0.8118878 -0.9984651 0.8462487 0.8461986 -0.9987903 0.8750676 0.8750355 -0.9990461 0.8990153 0.8989948 -0.9992473 0.9187254 0.9187123 -0.9994059 0.9348202 0.9348119 -0.999531 0.9478785 0.9478733 -0.9996296 0.9584179 0.9584146 -0.9997074 0.9668885 0.9668865 -0.9997689 0.9736734 0.9736721 -0.9998174 0.9790932 0.9790924 -0.9998557 0.9834132 0.9834127 -0.999886 0.9868507 0.9868504 -0.9999099 0.9895821 0.9895819 -0.9999288 0.9917502 0.99175 -0.9999437 0.9934695 0.9934695 -0.0000238 0.0240255 0.006079 -0.0000382 0.023522 0.0055755 -0.0000611 0.0228898 0.0049433 -0.0000978 0.0220976 0.0041512 -0.0001565 0.0211078 0.0031613 -0.0002504 0.0198752 0.0019287 -0.0004008 0.0183473 0.0004008 -0.0025241 0.0183473 0.0004008 -0.0052103 0.0183473 0.0004008 -0.0086086 0.0183473 0.0004008 -0.012908 0.0183473 0.0004008 -0.0183473 0.0183473 0.0004008 -0.0252287 0.0183473 0.0004008 -0.0339345 0.0183473 0.0004008 -0.0449485 0.0183473 0.0004008 -0.0588827 0.0183473 0.0004008 -0.0765113 0.0183473 0.0004008 -0.0988137 0.0183473 0.0004008 -0.1270291 0.0183473 0.0004008 -0.1627254 0.0183473 0.0004008 -0.2078857 0.0183473 0.0004008 -0.2650195 0.0183473 0.0004008 -0.337301 0.0183473 0.0004008 -0.4287467 0.0183473 0.0004008 -0.5444373 0.0183473 0.0004008 -0.6908009 0.0183473 0.0004008 -0.8381886 0.0221804 0.0051048 -0.9024114 0.0417427 0.0275966 -0.9350332 0.0731615 0.0620199 -0.9543421 0.1140887 0.1055364 -0.9668187 0.1632458 0.1568008 -0.975343 0.2194946 0.2147144 -0.9813911 0.2814975 0.2780055 -0.9857982 0.3476163 0.3451032 -0.9890723 0.4159501 0.4141683 -0.9915399 0.4844695 0.4832246 -0.9934197 0.5512013 0.5503438 -0.9948636 0.6144151 0.6138323 -0.9959797 0.672766 0.6723748 -0.9968465 0.7253672 0.7251076 -0.9975224 0.771789 0.7716184 -0.9980509 0.8119989 0.8118878 -0.9984651 0.8462704 0.8461986 -0.9987903 0.8750816 0.8750355 -0.9990461 0.8990243 0.8989948 -0.9992473 0.9187311 0.9187123 -0.9994059 0.9348238 0.9348119 -0.999531 0.9478808 0.9478733 -0.9996296 0.9584194 0.9584146 -0.9997074 0.9668894 0.9668865 -0.9997689 0.973674 0.9736721 -0.9998174 0.9790936 0.9790924 -0.9998557 0.9834135 0.9834127 -0.999886 0.9868508 0.9868504 -0.9999099 0.9895822 0.9895819 -0.9999288 0.9917502 0.99175 -0.9999437 0.9934696 0.9934695 -0.0000238 0.0309069 0.006079 -0.0000382 0.0304033 0.0055755 -0.0000611 0.0297711 0.0049433 -0.0000978 0.028979 0.0041512 -0.0001565 0.0279891 0.0031613 -0.0002504 0.0267565 0.0019287 -0.0004008 0.0252287 0.0004008 -0.0025241 0.0252287 0.0004008 -0.0052103 0.0252287 0.0004008 -0.0086086 0.0252287 0.0004008 -0.012908 0.0252287 0.0004008 -0.0183473 0.0252287 0.0004008 -0.0252287 0.0252287 0.0004008 -0.0339345 0.0252287 0.0004008 -0.0449485 0.0252287 0.0004008 -0.0588827 0.0252287 0.0004008 -0.0765113 0.0252287 0.0004008 -0.0988137 0.0252287 0.0004008 -0.1270291 0.0252287 0.0004008 -0.1627254 0.0252287 0.0004008 -0.2078857 0.0252287 0.0004008 -0.2650195 0.0252287 0.0004008 -0.337301 0.0252287 0.0004008 -0.4287467 0.0252287 0.0004008 -0.5444373 0.0252287 0.0004008 -0.6908009 0.0252287 0.0004008 -0.8381886 0.0287279 0.0051048 -0.9024114 0.0471669 0.0275966 -0.9350332 0.0774337 0.0620199 -0.9543421 0.117368 0.1055364 -0.9668187 0.1657171 0.1568008 -0.975343 0.2213275 0.2147144 -0.9813911 0.2828365 0.2780055 -0.9857982 0.3485799 0.3451032 -0.9890723 0.4166333 0.4141683 -0.9915399 0.4849468 0.4832246 -0.9934197 0.5515301 0.5503438 -0.9948636 0.6146385 0.6138323 -0.9959797 0.672916 0.6723748 -0.9968465 0.7254668 0.7251076 -0.9975224 0.7718544 0.7716184 -0.9980509 0.8120415 0.8118878 -0.9984651 0.846298 0.8461986 -0.9987903 0.8750993 0.8750355 -0.9990461 0.8990356 0.8989948 -0.9992473 0.9187383 0.9187123 -0.9994059 0.9348284 0.9348119 -0.999531 0.9478837 0.9478733 -0.9996296 0.9584212 0.9584146 -0.9997074 0.9668906 0.9668865 -0.9997689 0.9736747 0.9736721 -0.9998174 0.979094 0.9790924 -0.9998557 0.9834137 0.9834127 -0.999886 0.986851 0.9868504 -0.9999099 0.9895823 0.9895819 -0.9999288 0.9917503 0.99175 -0.9999437 0.9934696 0.9934695 -0.0000238 0.0396127 0.006079 -0.0000382 0.0391092 0.0055755 -0.0000611 0.038477 0.0049433 -0.0000978 0.0376849 0.0041512 -0.0001565 0.036695 0.0031613 -0.0002504 0.0354624 0.0019287 -0.0004008 0.0339345 0.0004008 -0.0025241 0.0339345 0.0004008 -0.0052103 0.0339345 0.0004008 -0.0086086 0.0339345 0.0004008 -0.012908 0.0339345 0.0004008 -0.0183473 0.0339345 0.0004008 -0.0252287 0.0339345 0.0004008 -0.0339345 0.0339345 0.0004008 -0.0449485 0.0339345 0.0004008 -0.0588827 0.0339345 0.0004008 -0.0765113 0.0339345 0.0004008 -0.0988137 0.0339345 0.0004008 -0.1270291 0.0339345 0.0004008 -0.1627254 0.0339345 0.0004008 -0.2078857 0.0339345 0.0004008 -0.2650195 0.0339345 0.0004008 -0.337301 0.0339345 0.0004008 -0.4287467 0.0339345 0.0004008 -0.5444373 0.0339345 0.0004008 -0.6908009 0.0339345 0.0004008 -0.8381886 0.0370113 0.0051048 -0.9024114 0.0540292 0.0275966 -0.9350332 0.0828386 0.0620199 -0.9543421 0.1215168 0.1055364 -0.9668187 0.1688437 0.1568008 -0.975343 0.2236464 0.2147144 -0.9813911 0.2845305 0.2780055 -0.9857982 0.3497989 0.3451032 -0.9890723 0.4174976 0.4141683 -0.9915399 0.4855507 0.4832246 -0.9934197 0.5519461 0.5503438 -0.9948636 0.6149212 0.6138323 -0.9959797 0.6731057 0.6723748 -0.9968465 0.7255927 0.7251076 -0.9975224 0.7719371 0.7716184 -0.9980509 0.8120954 0.8118878 -0.9984651 0.8463328 0.8461986 -0.9987903 0.8751217 0.8750355 -0.9990461 0.8990499 0.8989948 -0.9992473 0.9187474 0.9187123 -0.9994059 0.9348341 0.9348119 -0.999531 0.9478873 0.9478733 -0.9996296 0.9584235 0.9584146 -0.9997074 0.966892 0.9668865 -0.9997689 0.9736756 0.9736721 -0.9998174 0.9790946 0.9790924 -0.9998557 0.9834141 0.9834127 -0.999886 0.9868512 0.9868504 -0.9999099 0.9895825 0.9895819 -0.9999288 0.9917504 0.99175 -0.9999437 0.9934697 0.9934695 -0.0000238 0.0506267 0.006079 -0.0000382 0.0501232 0.0055755 -0.0000611 0.049491 0.0049433 -0.0000978 0.0486989 0.0041512 -0.0001565 0.047709 0.0031613 -0.0002504 0.0464764 0.0019287 -0.0004008 0.0449485 0.0004008 -0.0025241 0.0449485 0.0004008 -0.0052103 0.0449485 0.0004008 -0.0086086 0.0449485 0.0004008 -0.012908 0.0449485 0.0004008 -0.0183473 0.0449485 0.0004008 -0.0252287 0.0449485 0.0004008 -0.0339345 0.0449485 0.0004008 -0.0449485 0.0449485 0.0004008 -0.0588827 0.0449485 0.0004008 -0.0765113 0.0449485 0.0004008 -0.0988137 0.0449485 0.0004008 -0.1270291 0.0449485 0.0004008 -0.1627254 0.0449485 0.0004008 -0.2078857 0.0449485 0.0004008 -0.2650195 0.0449485 0.0004008 -0.337301 0.0449485 0.0004008 -0.4287467 0.0449485 0.0004008 -0.5444373 0.0449485 0.0004008 -0.6908009 0.0449485 0.0004008 -0.8381886 0.0474909 0.0051048 -0.9024114 0.0627109 0.0275966 -0.9350332 0.0896764 0.0620199 -0.9543421 0.1267655 0.1055364 -0.9668187 0.1727991 0.1568008 -0.975343 0.2265801 0.2147144 -0.9813911 0.2866736 0.2780055 -0.9857982 0.3513412 0.3451032 -0.9890723 0.4185911 0.4141683 -0.9915399 0.4863147 0.4832246 -0.9934197 0.5524723 0.5503438 -0.9948636 0.6152789 0.6138323 -0.9959797 0.6733458 0.6723748 -0.9968465 0.725752 0.7251076 -0.9975224 0.7720418 0.7716184 -0.9980509 0.8121636 0.8118878 -0.9984651 0.8463769 0.8461986 -0.9987903 0.87515 0.8750355 -0.9990461 0.899068 0.8989948 -0.9992473 0.9187589 0.9187123 -0.9994059 0.9348414 0.9348119 -0.999531 0.9478919 0.9478733 -0.9996296 0.9584264 0.9584146 -0.9997074 0.9668939 0.9668865 -0.9997689 0.9736767 0.9736721 -0.9998174 0.9790953 0.9790924 -0.9998557 0.9834146 0.9834127 -0.999886 0.9868515 0.9868504 -0.9999099 0.9895826 0.9895819 -0.9999288 0.9917505 0.99175 -0.9999437 0.9934697 0.9934695 -0.0000238 0.0645609 0.006079 -0.0000382 0.0640574 0.0055755 -0.0000611 0.0634252 0.0049433 -0.0000978 0.0626331 0.0041512 -0.0001565 0.0616432 0.0031613 -0.0002504 0.0604106 0.0019287 -0.0004008 0.0588827 0.0004008 -0.0025241 0.0588827 0.0004008 -0.0052103 0.0588827 0.0004008 -0.0086086 0.0588827 0.0004008 -0.012908 0.0588827 0.0004008 -0.0183473 0.0588827 0.0004008 -0.0252287 0.0588827 0.0004008 -0.0339345 0.0588827 0.0004008 -0.0449485 0.0588827 0.0004008 -0.0588827 0.0588827 0.0004008 -0.0765113 0.0588827 0.0004008 -0.0988137 0.0588827 0.0004008 -0.1270291 0.0588827 0.0004008 -0.1627254 0.0588827 0.0004008 -0.2078857 0.0588827 0.0004008 -0.2650195 0.0588827 0.0004008 -0.337301 0.0588827 0.0004008 -0.4287467 0.0588827 0.0004008 -0.5444373 0.0588827 0.0004008 -0.6908009 0.0588827 0.0004008 -0.8381886 0.060749 0.0051048 -0.9024114 0.0736944 0.0275966 -0.9350332 0.0983271 0.0620199 -0.9543421 0.1334058 0.1055364 -0.9668187 0.1778032 0.1568008 -0.975343 0.2302916 0.2147144 -0.9813911 0.2893849 0.2780055 -0.9857982 0.3532924 0.3451032 -0.9890723 0.4199745 0.4141683 -0.9915399 0.4872812 0.4832246 -0.9934197 0.5531381 0.5503438 -0.9948636 0.6157314 0.6138323 -0.9959797 0.6736495 0.6723748 -0.9968465 0.7259536 0.7251076 -0.9975224 0.7721742 0.7716184 -0.9980509 0.8122499 0.8118878 -0.9984651 0.8464327 0.8461986 -0.9987903 0.8751858 0.8750355 -0.9990461 0.8990909 0.8989948 -0.9992473 0.9187734 0.9187123 -0.9994059 0.9348507 0.9348119 -0.999531 0.9478978 0.9478733 -0.9996296 0.9584301 0.9584146 -0.9997074 0.9668962 0.9668865 -0.9997689 0.9736782 0.9736721 -0.9998174 0.9790962 0.9790924 -0.9998557 0.9834151 0.9834127 -0.999886 0.9868519 0.9868504 -0.9999099 0.9895829 0.9895819 -0.9999288 0.9917506 0.99175 -0.9999437 0.9934698 0.9934695 -0.0000238 0.0821895 0.006079 -0.0000382 0.081686 0.0055755 -0.0000611 0.0810538 0.0049433 -0.0000978 0.0802616 0.0041512 -0.0001565 0.0792718 0.0031613 -0.0002504 0.0780392 0.0019287 -0.0004008 0.0765113 0.0004008 -0.0025241 0.0765113 0.0004008 -0.0052103 0.0765113 0.0004008 -0.0086086 0.0765113 0.0004008 -0.012908 0.0765113 0.0004008 -0.0183473 0.0765113 0.0004008 -0.0252287 0.0765113 0.0004008 -0.0339345 0.0765113 0.0004008 -0.0449485 0.0765113 0.0004008 -0.0588827 0.0765113 0.0004008 -0.0765113 0.0765113 0.0004008 -0.0988137 0.0765113 0.0004008 -0.1270291 0.0765113 0.0004008 -0.1627254 0.0765113 0.0004008 -0.2078857 0.0765113 0.0004008 -0.2650195 0.0765113 0.0004008 -0.337301 0.0765113 0.0004008 -0.4287467 0.0765113 0.0004008 -0.5444373 0.0765113 0.0004008 -0.6908009 0.0765113 0.0004008 -0.8381886 0.0775221 0.0051048 -0.9024114 0.08759 0.0275966 -0.9350332 0.1092715 0.0620199 -0.9543421 0.1418066 0.1055364 -0.9668187 0.1841341 0.1568008 -0.975343 0.2349871 0.2147144 -0.9813911 0.2928151 0.2780055 -0.9857982 0.3557609 0.3451032 -0.9890723 0.4217247 0.4141683 -0.9915399 0.4885041 0.4832246 -0.9934197 0.5539804 0.5503438 -0.9948636 0.6163039 0.6138323 -0.9959797 0.6740337 0.6723748 -0.9968465 0.7262086 0.7251076 -0.9975224 0.7723418 0.7716184 -0.9980509 0.812359 0.8118878 -0.9984651 0.8465032 0.8461986 -0.9987903 0.8752311 0.8750355 -0.9990461 0.8991198 0.8989948 -0.9992473 0.9187919 0.9187123 -0.9994059 0.9348623 0.9348119 -0.999531 0.9479051 0.9478733 -0.9996296 0.9584347 0.9584146 -0.9997074 0.9668991 0.9668865 -0.9997689 0.97368 0.9736721 -0.9998174 0.9790974 0.9790924 -0.9998557 0.9834158 0.9834127 -0.999886 0.9868523 0.9868504 -0.9999099 0.9895832 0.9895819 -0.9999288 0.9917508 0.99175 -0.9999437 0.9934699 0.9934695 -0.0000238 0.1044919 0.006079 -0.0000382 0.1039884 0.0055755 -0.0000611 0.1033562 0.0049433 -0.0000978 0.102564 0.0041512 -0.0001565 0.1015742 0.0031613 -0.0002504 0.1003416 0.0019287 -0.0004008 0.0988137 0.0004008 -0.0025241 0.0988137 0.0004008 -0.0052103 0.0988137 0.0004008 -0.0086086 0.0988137 0.0004008 -0.012908 0.0988137 0.0004008 -0.0183473 0.0988137 0.0004008 -0.0252287 0.0988137 0.0004008 -0.0339345 0.0988137 0.0004008 -0.0449485 0.0988137 0.0004008 -0.0588827 0.0988137 0.0004008 -0.0765113 0.0988137 0.0004008 -0.0988137 0.0988137 0.0004008 -0.1270291 0.0988137 0.0004008 -0.1627254 0.0988137 0.0004008 -0.2078857 0.0988137 0.0004008 -0.2650195 0.0988137 0.0004008 -0.337301 0.0988137 0.0004008 -0.4287467 0.0988137 0.0004008 -0.5444373 0.0988137 0.0004008 -0.6908009 0.0988137 0.0004008 -0.8381886 0.0987424 0.0051048 -0.9024114 0.1051696 0.0275966 -0.9350332 0.1231174 0.0620199 -0.9543421 0.1524348 0.1055364 -0.9668187 0.1921435 0.1568008 -0.975343 0.2409276 0.2147144 -0.9813911 0.2971547 0.2780055 -0.9857982 0.3588839 0.3451032 -0.9890723 0.4239389 0.4141683 -0.9915399 0.4900511 0.4832246 -0.9934197 0.5550461 0.5503438 -0.9948636 0.6170281 0.6138323 -0.9959797 0.6745198 0.6723748 -0.9968465 0.7265312 0.7251076 -0.9975224 0.7725538 0.7716184 -0.9980509 0.8124971 0.8118878 -0.9984651 0.8465925 0.8461986 -0.9987903 0.8752885 0.8750355 -0.9990461 0.8991565 0.8989948 -0.9992473 0.9188152 0.9187123 -0.9994059 0.9348771 0.9348119 -0.999531 0.9479145 0.9478733 -0.9996296 0.9584406 0.9584146 -0.9997074 0.9669028 0.9668865 -0.9997689 0.9736824 0.9736721 -0.9998174 0.9790988 0.9790924 -0.9998557 0.9834168 0.9834127 -0.999886 0.9868529 0.9868504 -0.9999099 0.9895835 0.9895819 -0.9999288 0.991751 0.99175 -0.9999437 0.9934701 0.9934695 -0.0000238 0.1327073 0.006079 -0.0000382 0.1322038 0.0055755 -0.0000611 0.1315716 0.0049433 -0.0000978 0.1307795 0.0041512 -0.0001565 0.1297896 0.0031613 -0.0002504 0.128557 0.0019287 -0.0004008 0.1270291 0.0004008 -0.0025241 0.1270291 0.0004008 -0.0052103 0.1270291 0.0004008 -0.0086086 0.1270291 0.0004008 -0.012908 0.1270291 0.0004008 -0.0183473 0.1270291 0.0004008 -0.0252287 0.1270291 0.0004008 -0.0339345 0.1270291 0.0004008 -0.0449485 0.1270291 0.0004008 -0.0588827 0.1270291 0.0004008 -0.0765113 0.1270291 0.0004008 -0.0988137 0.1270291 0.0004008 -0.1270291 0.1270291 0.0004008 -0.1627254 0.1270291 0.0004008 -0.2078857 0.1270291 0.0004008 -0.2650195 0.1270291 0.0004008 -0.337301 0.1270291 0.0004008 -0.4287467 0.1270291 0.0004008 -0.5444373 0.1270291 0.0004008 -0.6908009 0.1270291 0.0004008 -0.8381886 0.1255887 0.0051048 -0.9024114 0.1274102 0.0275966 -0.9350332 0.1406344 0.0620199 -0.9543421 0.1658808 0.1055364 -0.9668187 0.2022765 0.1568008 -0.975343 0.2484431 0.2147144 -0.9813911 0.3026449 0.2780055 -0.9857982 0.3628349 0.3451032 -0.9890723 0.4267402 0.4141683 -0.9915399 0.4920083 0.4832246 -0.9934197 0.5563942 0.5503438 -0.9948636 0.6179443 0.6138323 -0.9959797 0.6751348 0.6723748 -0.9968465 0.7269394 0.7251076 -0.9975224 0.7728219 0.7716184 -0.9980509 0.8126718 0.8118878 -0.9984651 0.8467054 0.8461986 -0.9987903 0.875361 0.8750355 -0.9990461 0.8992028 0.8989948 -0.9992473 0.9188447 0.9187123 -0.9994059 0.9348958 0.9348119 -0.999531 0.9479263 0.9478733 -0.9996296 0.9584481 0.9584146 -0.9997074 0.9669075 0.9668865 -0.9997689 0.9736853 0.9736721 -0.9998174 0.9791007 0.9790924 -0.9998557 0.9834179 0.9834127 -0.999886 0.9868536 0.9868504 -0.9999099 0.989584 0.9895819 -0.9999288 0.9917513 0.99175 -0.9999437 0.9934703 0.9934695 -0.0000238 0.1684036 0.006079 -0.0000382 0.1679 0.0055755 -0.0000611 0.1672678 0.0049433 -0.0000978 0.1664757 0.0041512 -0.0001565 0.1654858 0.0031613 -0.0002504 0.1642532 0.0019287 -0.0004008 0.1627254 0.0004008 -0.0025241 0.1627254 0.0004008 -0.0052103 0.1627254 0.0004008 -0.0086086 0.1627254 0.0004008 -0.012908 0.1627254 0.0004008 -0.0183473 0.1627254 0.0004008 -0.0252287 0.1627254 0.0004008 -0.0339345 0.1627254 0.0004008 -0.0449485 0.1627254 0.0004008 -0.0588827 0.1627254 0.0004008 -0.0765113 0.1627254 0.0004008 -0.0988137 0.1627254 0.0004008 -0.1270291 0.1627254 0.0004008 -0.1627254 0.1627254 0.0004008 -0.2078857 0.1627254 0.0004008 -0.2650195 0.1627254 0.0004008 -0.337301 0.1627254 0.0004008 -0.4287467 0.1627254 0.0004008 -0.5444373 0.1627254 0.0004008 -0.6908009 0.1627254 0.0004008 -0.8381886 0.1595528 0.0051048 -0.9024114 0.1555474 0.0275966 -0.9350332 0.1627957 0.0620199 -0.9543421 0.1828918 0.1055364 -0.9668187 0.215096 0.1568008 -0.975343 0.2579511 0.2147144 -0.9813911 0.3095906 0.2780055 -0.9857982 0.3678335 0.3451032 -0.9890723 0.4302842 0.4141683 -0.9915399 0.4944844 0.4832246 -0.9934197 0.5580998 0.5503438 -0.9948636 0.6191035 0.6138323 -0.9959797 0.6759129 0.6723748 -0.9968465 0.7274557 0.7251076 -0.9975224 0.7731612 0.7716184 -0.9980509 0.8128927 0.8118878 -0.9984651 0.8468482 0.8461986 -0.9987903 0.8754528 0.8750355 -0.9990461 0.8992615 0.8989948 -0.9992473 0.918882 0.9187123 -0.9994059 0.9349195 0.9348119 -0.999531 0.9479413 0.9478733 -0.9996296 0.9584575 0.9584146 -0.9997074 0.9669135 0.9668865 -0.9997689 0.973689 0.9736721 -0.9998174 0.979103 0.9790924 -0.9998557 0.9834194 0.9834127 -0.999886 0.9868546 0.9868504 -0.9999099 0.9895845 0.9895819 -0.9999288 0.9917517 0.99175 -0.9999437 0.9934705 0.9934695 -0.0000238 0.2135639 0.006079 -0.0000382 0.2130604 0.0055755 -0.0000611 0.2124282 0.0049433 -0.0000978 0.2116361 0.0041512 -0.0001565 0.2106462 0.0031613 -0.0002504 0.2094136 0.0019287 -0.0004008 0.2078857 0.0004008 -0.0025241 0.2078857 0.0004008 -0.0052103 0.2078857 0.0004008 -0.0086086 0.2078857 0.0004008 -0.012908 0.2078857 0.0004008 -0.0183473 0.2078857 0.0004008 -0.0252287 0.2078857 0.0004008 -0.0339345 0.2078857 0.0004008 -0.0449485 0.2078857 0.0004008 -0.0588827 0.2078857 0.0004008 -0.0765113 0.2078857 0.0004008 -0.0988137 0.2078857 0.0004008 -0.1270291 0.2078857 0.0004008 -0.1627254 0.2078857 0.0004008 -0.2078857 0.2078857 0.0004008 -0.2650195 0.2078857 0.0004008 -0.337301 0.2078857 0.0004008 -0.4287467 0.2078857 0.0004008 -0.5444373 0.2078857 0.0004008 -0.6908009 0.2078857 0.0004008 -0.8381886 0.2025219 0.0051048 -0.9024114 0.1911446 0.0275966 -0.9350332 0.1908325 0.0620199 -0.9543421 0.2044128 0.1055364 -0.9668187 0.2313143 0.1568008 -0.975343 0.26998 0.2147144 -0.9813911 0.318378 0.2780055 -0.9857982 0.3741573 0.3451032 -0.9890723 0.4347678 0.4141683 -0.9915399 0.497617 0.4832246 -0.9934197 0.5602576 0.5503438 -0.9948636 0.62057 0.6138323 -0.9959797 0.6768972 0.6723748 -0.9968465 0.728109 0.7251076 -0.9975224 0.7735904 0.7716184 -0.9980509 0.8131723 0.8118878 -0.9984651 0.847029 0.8461986 -0.9987903 0.8755689 0.8750355 -0.9990461 0.8993357 0.8989948 -0.9992473 0.9189292 0.9187123 -0.9994059 0.9349494 0.9348119 -0.999531 0.9479602 0.9478733 -0.9996296 0.9584694 0.9584146 -0.9997074 0.966921 0.9668865 -0.9997689 0.9736938 0.9736721 -0.9998174 0.979106 0.9790924 -0.9998557 0.9834213 0.9834127 -0.999886 0.9868557 0.9868504 -0.9999099 0.9895853 0.9895819 -0.9999288 0.9917521 0.99175 -0.9999437 0.9934708 0.9934695 -0.0000238 0.2706977 0.006079 -0.0000382 0.2701941 0.0055755 -0.0000611 0.2695619 0.0049433 -0.0000978 0.2687698 0.0041512 -0.0001565 0.2677799 0.0031613 -0.0002504 0.2665473 0.0019287 -0.0004008 0.2650195 0.0004008 -0.0025241 0.2650195 0.0004008 -0.0052103 0.2650195 0.0004008 -0.0086086 0.2650195 0.0004008 -0.012908 0.2650195 0.0004008 -0.0183473 0.2650195 0.0004008 -0.0252287 0.2650195 0.0004008 -0.0339345 0.2650195 0.0004008 -0.0449485 0.2650195 0.0004008 -0.0588827 0.2650195 0.0004008 -0.0765113 0.2650195 0.0004008 -0.0988137 0.2650195 0.0004008 -0.1270291 0.2650195 0.0004008 -0.1627254 0.2650195 0.0004008 -0.2078857 0.2650195 0.0004008 -0.2650195 0.2650195 0.0004008 -0.337301 0.2650195 0.0004008 -0.4287467 0.2650195 0.0004008 -0.5444373 0.2650195 0.0004008 -0.6908009 0.2650195 0.0004008 -0.8381886 0.2568833 0.0051048 -0.9024114 0.2361798 0.0275966 -0.9350332 0.2263028 0.0620199 -0.9543421 0.2316398 0.1055364 -0.9668187 0.2518326 0.1568008 -0.975343 0.2851981 0.2147144 -0.9813911 0.3294951 0.2780055 -0.9857982 0.3821577 0.3451032 -0.9890723 0.4404401 0.4141683 -0.9915399 0.5015801 0.4832246 -0.9934197 0.5629876 0.5503438 -0.9948636 0.6224253 0.6138323 -0.9959797 0.6781425 0.6723748 -0.9968465 0.7289355 0.7251076 -0.9975224 0.7741335 0.7716184 -0.9980509 0.813526 0.8118878 -0.9984651 0.8472576 0.8461986 -0.9987903 0.8757158 0.8750355 -0.9990461 0.8994295 0.8989948 -0.9992473 0.9189889 0.9187123 -0.9994059 0.9349873 0.9348119 -0.999531 0.9479841 0.9478733 -0.9996296 0.9584845 0.9584146 -0.9997074 0.9669305 0.9668865 -0.9997689 0.9736997 0.9736721 -0.9998174 0.9791097 0.9790924 -0.9998557 0.9834236 0.9834127 -0.999886 0.9868572 0.9868504 -0.9999099 0.9895862 0.9895819 -0.9999288 0.9917527 0.99175 -0.9999437 0.9934711 0.9934695 -0.0000238 0.3429792 0.006079 -0.0000382 0.3424757 0.0055755 -0.0000611 0.3418435 0.0049433 -0.0000978 0.3410514 0.0041512 -0.0001565 0.3400615 0.0031613 -0.0002504 0.3388289 0.0019287 -0.0004008 0.337301 0.0004008 -0.0025241 0.337301 0.0004008 -0.0052103 0.337301 0.0004008 -0.0086086 0.337301 0.0004008 -0.012908 0.337301 0.0004008 -0.0183473 0.337301 0.0004008 -0.0252287 0.337301 0.0004008 -0.0339345 0.337301 0.0004008 -0.0449485 0.337301 0.0004008 -0.0588827 0.337301 0.0004008 -0.0765113 0.337301 0.0004008 -0.0988137 0.337301 0.0004008 -0.1270291 0.337301 0.0004008 -0.1627254 0.337301 0.0004008 -0.2078857 0.337301 0.0004008 -0.2650195 0.337301 0.0004008 -0.337301 0.337301 0.0004008 -0.4287467 0.337301 0.0004008 -0.5444373 0.337301 0.0004008 -0.6908009 0.337301 0.0004008 -0.8381886 0.3256576 0.0051048 -0.9024114 0.2931551 0.0275966 -0.9350332 0.2711774 0.0620199 -0.9543421 0.2660854 0.1055364 -0.9668187 0.2777909 0.1568008 -0.975343 0.304451 0.2147144 -0.9813911 0.3435596 0.2780055 -0.9857982 0.3922792 0.3451032 -0.9890723 0.4476164 0.4141683 -0.9915399 0.506594 0.4832246 -0.9934197 0.5664413 0.5503438 -0.9948636 0.6247725 0.6138323 -0.9959797 0.679718 0.6723748 -0.9968465 0.7299811 0.7251076 -0.9975224 0.7748205 0.7716184 -0.9980509 0.8139735 0.8118878 -0.9984651 0.8475469 0.8461986 -0.9987903 0.8759016 0.8750355 -0.9990461 0.8995483 0.8989948 -0.9992473 0.9190645 0.9187123 -0.9994059 0.9350352 0.9348119 -0.999531 0.9480144 0.9478733 -0.9996296 0.9585036 0.9584146 -0.9997074 0.9669425 0.9668865 -0.9997689 0.9737073 0.9736721 -0.9998174 0.9791145 0.9790924 -0.9998557 0.9834266 0.9834127 -0.999886 0.9868591 0.9868504 -0.9999099 0.9895874 0.9895819 -0.9999288 0.9917534 0.99175 -0.9999437 0.9934716 0.9934695 -0.0000238 0.4344249 0.006079 -0.0000382 0.4339214 0.0055755 -0.0000611 0.4332891 0.0049433 -0.0000978 0.432497 0.0041512 -0.0001565 0.4315072 0.0031613 -0.0002504 0.4302746 0.0019287 -0.0004008 0.4287467 0.0004008 -0.0025241 0.4287467 0.0004008 -0.0052103 0.4287467 0.0004008 -0.0086086 0.4287467 0.0004008 -0.012908 0.4287467 0.0004008 -0.0183473 0.4287467 0.0004008 -0.0252287 0.4287467 0.0004008 -0.0339345 0.4287467 0.0004008 -0.0449485 0.4287467 0.0004008 -0.0588827 0.4287467 0.0004008 -0.0765113 0.4287467 0.0004008 -0.0988137 0.4287467 0.0004008 -0.1270291 0.4287467 0.0004008 -0.1627254 0.4287467 0.0004008 -0.2078857 0.4287467 0.0004008 -0.2650195 0.4287467 0.0004008 -0.337301 0.4287467 0.0004008 -0.4287467 0.4287467 0.0004008 -0.5444373 0.4287467 0.0004008 -0.6908009 0.4287467 0.0004008 -0.8381886 0.412666 0.0051048 -0.9024114 0.3652362 0.0275966 -0.9350332 0.3279495 0.0620199 -0.9543421 0.3096636 0.1055364 -0.9668187 0.3106315 0.1568008 -0.975343 0.3288084 0.2147144 -0.9813911 0.3613531 0.2780055 -0.9857982 0.4050843 0.3451032 -0.9890723 0.4566952 0.4141683 -0.9915399 0.5129372 0.4832246 -0.9934197 0.5708106 0.5503438 -0.9948636 0.6277421 0.6138323 -0.9959797 0.6817112 0.6723748 -0.9968465 0.7313039 0.7251076 -0.9975224 0.7756896 0.7716184 -0.9980509 0.8145396 0.8118878 -0.9984651 0.8479129 0.8461986 -0.9987903 0.8761367 0.8750355 -0.9990461 0.8996985 0.8989948 -0.9992473 0.91916 0.9187123 -0.9994059 0.9350958 0.9348119 -0.999531 0.9480527 0.9478733 -0.9996296 0.9585278 0.9584146 -0.9997074 0.9669577 0.9668865 -0.9997689 0.9737168 0.9736721 -0.9998174 0.9791205 0.9790924 -0.9998557 0.9834303 0.9834127 -0.999886 0.9868614 0.9868504 -0.9999099 0.9895888 0.9895819 -0.9999288 0.9917544 0.99175 -0.9999437 0.9934722 0.9934695 -0.0000238 0.5501155 0.006079 -0.0000382 0.549612 0.0055755 -0.0000611 0.5489798 0.0049433 -0.0000978 0.5481876 0.0041512 -0.0001565 0.5471978 0.0031613 -0.0002504 0.5459652 0.0019287 -0.0004008 0.5444373 0.0004008 -0.0025241 0.5444373 0.0004008 -0.0052103 0.5444373 0.0004008 -0.0086086 0.5444373 0.0004008 -0.012908 0.5444373 0.0004008 -0.0183473 0.5444373 0.0004008 -0.0252287 0.5444373 0.0004008 -0.0339345 0.5444373 0.0004008 -0.0449485 0.5444373 0.0004008 -0.0588827 0.5444373 0.0004008 -0.0765113 0.5444373 0.0004008 -0.0988137 0.5444373 0.0004008 -0.1270291 0.5444373 0.0004008 -0.1627254 0.5444373 0.0004008 -0.2078857 0.5444373 0.0004008 -0.2650195 0.5444373 0.0004008 -0.337301 0.5444373 0.0004008 -0.4287467 0.5444373 0.0004008 -0.5444373 0.5444373 0.0004008 -0.6908009 0.5444373 0.0004008 -0.8381886 0.5227429 0.0051048 -0.9024114 0.4564282 0.0275966 -0.9350332 0.3997736 0.0620199 -0.9543421 0.3647957 0.1055364 -0.9668187 0.3521792 0.1568008 -0.975343 0.3596237 0.2147144 -0.9813911 0.3838642 0.2780055 -0.9857982 0.4212844 0.3451032 -0.9890723 0.4681812 0.4141683 -0.9915399 0.5209622 0.4832246 -0.9934197 0.5763385 0.5503438 -0.9948636 0.6314989 0.6138323 -0.9959797 0.6842328 0.6723748 -0.9968465 0.7329774 0.7251076 -0.9975224 0.7767892 0.7716184 -0.9980509 0.8152558 0.8118878 -0.9984651 0.8483759 0.8461986 -0.9987903 0.8764342 0.8750355 -0.9990461 0.8998886 0.8989948 -0.9992473 0.919281 0.9187123 -0.9994059 0.9351724 0.9348119 -0.999531 0.9481011 0.9478733 -0.9996296 0.9585583 0.9584146 -0.9997074 0.9669769 0.9668865 -0.9997689 0.9737289 0.9736721 -0.9998174 0.9791281 0.9790924 -0.9998557 0.9834351 0.9834127 -0.999886 0.9868644 0.9868504 -0.9999099 0.9895907 0.9895819 -0.9999288 0.9917555 0.99175 -0.9999437 0.9934729 0.9934695 -0.0000238 0.6964791 0.006079 -0.0000382 0.6959756 0.0055755 -0.0000611 0.6953434 0.0049433 -0.0000978 0.6945513 0.0041512 -0.0001565 0.6935614 0.0031613 -0.0002504 0.6923288 0.0019287 -0.0004008 0.6908009 0.0004008 -0.0025241 0.6908009 0.0004008 -0.0052103 0.6908009 0.0004008 -0.0086086 0.6908009 0.0004008 -0.012908 0.6908009 0.0004008 -0.0183473 0.6908009 0.0004008 -0.0252287 0.6908009 0.0004008 -0.0339345 0.6908009 0.0004008 -0.0449485 0.6908009 0.0004008 -0.0588827 0.6908009 0.0004008 -0.0765113 0.6908009 0.0004008 -0.0988137 0.6908009 0.0004008 -0.1270291 0.6908009 0.0004008 -0.1627254 0.6908009 0.0004008 -0.2078857 0.6908009 0.0004008 -0.2650195 0.6908009 0.0004008 -0.337301 0.6908009 0.0004008 -0.4287467 0.6908009 0.0004008 -0.5444373 0.6908009 0.0004008 -0.6908009 0.6908009 0.0004008 -0.8381886 0.6620045 0.0051048 -0.9024114 0.571798 0.0275966 -0.9350332 0.4906404 0.0620199 -0.9543421 0.434545 0.1055364 -0.9668187 0.4047424 0.1568008 -0.975343 0.3986091 0.2147144 -0.9813911 0.4123437 0.2780055 -0.9857982 0.4417797 0.3451032 -0.9890723 0.4827124 0.4141683 -0.9915399 0.5311148 0.4832246 -0.9934197 0.5833319 0.5503438 -0.9948636 0.6362518 0.6138323 -0.9959797 0.687423 0.6723748 -0.9968465 0.7350946 0.7251076 -0.9975224 0.7781803 0.7716184 -0.9980509 0.8161619 0.8118878 -0.9984651 0.8489617 0.8461986 -0.9987903 0.8768104 0.8750355 -0.9990461 0.900129 0.8989948 -0.9992473 0.919434 0.9187123 -0.9994059 0.9352694 0.9348119 -0.999531 0.9481624 0.9478733 -0.9996296 0.958597 0.9584146 -0.9997074 0.9670013 0.9668865 -0.9997689 0.9737442 0.9736721 -0.9998174 0.9791377 0.9790924 -0.9998557 0.9834411 0.9834127 -0.999886 0.9868682 0.9868504 -0.9999099 0.9895931 0.9895819 -0.9999288 0.991757 0.99175 -0.9999437 0.9934738 0.9934695 -0.0051514 0.8407292 0.0108903 -0.0051286 0.8405071 0.0103785 -0.0051047 0.8402274 0.0097356 -0.0050826 0.8398756 0.0089295 -0.0050676 0.8394338 0.0079213 -0.0050694 0.8388802 0.0066646 -0.0051048 0.8381886 0.0051048 -0.007125 0.8381886 0.0051048 -0.0096809 0.8381886 0.0051048 -0.0129143 0.8381886 0.0051048 -0.0170051 0.8381886 0.0051048 -0.0221804 0.8381886 0.0051048 -0.0287279 0.8381886 0.0051048 -0.0370113 0.8381886 0.0051048 -0.0474909 0.8381886 0.0051048 -0.060749 0.8381886 0.0051048 -0.0775221 0.8381886 0.0051048 -0.0987424 0.8381886 0.0051048 -0.1255887 0.8381886 0.0051048 -0.1595528 0.8381886 0.0051048 -0.2025219 0.8381886 0.0051048 -0.2568833 0.8381886 0.0051048 -0.3256576 0.8381886 0.0051048 -0.412666 0.8381886 0.0051048 -0.5227429 0.8381886 0.0051048 -0.6620045 0.8381886 0.0051048 -0.8381886 0.8381886 0.0051048 -0.9024114 0.7177558 0.0275966 -0.9350332 0.6055988 0.0620199 -0.9543421 0.5227869 0.1055364 -0.9668187 0.4712417 0.1568008 -0.975343 0.4479306 0.2147144 -0.9813911 0.448374 0.2780055 -0.9857982 0.4677088 0.3451032 -0.9890723 0.5010964 0.4141683 -0.9915399 0.5439593 0.4832246 -0.9934197 0.5921795 0.5503438 -0.9948636 0.6422649 0.6138323 -0.9959797 0.691459 0.6723748 -0.9968465 0.7377732 0.7251076 -0.9975224 0.7799403 0.7716184 -0.9980509 0.8173082 0.8118878 -0.9984651 0.8497027 0.8461986 -0.9987903 0.8772865 0.8750355 -0.9990461 0.9004332 0.8989948 -0.9992473 0.9196275 0.9187123 -0.9994059 0.9353921 0.9348119 -0.999531 0.94824 0.9478733 -0.9996296 0.9586459 0.9584146 -0.9997074 0.967032 0.9668865 -0.9997689 0.9737636 0.9736721 -0.9998174 0.9791498 0.9790924 -0.9998557 0.9834487 0.9834127 -0.999886 0.9868729 0.9868504 -0.9999099 0.9895961 0.9895819 -0.9999288 0.9917589 0.99175 -0.9999437 0.993475 0.9934695 -0.0279321 0.9033413 0.0326824 -0.0278872 0.9032596 0.0322331 -0.0278347 0.9031567 0.0316684 -0.0277752 0.9030276 0.0309602 -0.0277111 0.9028657 0.0300741 -0.0276479 0.9026634 0.0289691 -0.0275966 0.9024114 0.0275966 -0.0292702 0.9024114 0.0275966 -0.0313876 0.9024114 0.0275966 -0.0340663 0.9024114 0.0275966 -0.0374553 0.9024114 0.0275966 -0.0417427 0.9024114 0.0275966 -0.0471669 0.9024114 0.0275966 -0.0540292 0.9024114 0.0275966 -0.0627109 0.9024114 0.0275966 -0.0736944 0.9024114 0.0275966 -0.08759 0.9024114 0.0275966 -0.1051696 0.9024114 0.0275966 -0.1274102 0.9024114 0.0275966 -0.1555474 0.9024114 0.0275966 -0.1911446 0.9024114 0.0275966 -0.2361798 0.9024114 0.0275966 -0.2931551 0.9024114 0.0275966 -0.3652362 0.9024114 0.0275966 -0.4564282 0.9024114 0.0275966 -0.571798 0.9024114 0.0275966 -0.7177558 0.9024114 0.0275966 -0.9024114 0.9024114 0.0275966 -0.9350332 0.7510361 0.0620199 -0.9543421 0.6344244 0.1055364 -0.9668187 0.5553719 0.1568008 -0.975343 0.5103288 0.2147144 -0.9813911 0.4939569 0.2780055 -0.9857982 0.5005126 0.3451032 -0.9890723 0.5243544 0.4141683 -0.9915399 0.5602091 0.4832246 -0.9934197 0.6033728 0.5503438 -0.9948636 0.6498721 0.6138323 -0.9959797 0.696565 0.6723748 -0.9968465 0.7411619 0.7251076 -0.9975224 0.7821669 0.7716184 -0.9980509 0.8187584 0.8118878 -0.9984651 0.8506403 0.8461986 -0.9987903 0.8778888 0.8750355 -0.9990461 0.9008181 0.8989948 -0.9992473 0.9198724 0.9187123 -0.9994059 0.9355473 0.9348119 -0.999531 0.9483381 0.9478733 -0.9996296 0.9587078 0.9584146 -0.9997074 0.967071 0.9668865 -0.9997689 0.9737881 0.9736721 -0.9998174 0.9791652 0.9790924 -0.9998557 0.9834584 0.9834127 -0.999886 0.986879 0.9868504 -0.9999099 0.9895998 0.9895819 -0.9999288 0.9917613 0.99175 -0.9999437 0.9934765 0.9934695 -0.0624569 0.9354466 0.0662 -0.0624063 0.9354101 0.0658305 -0.0623458 0.9353643 0.0653663 -0.0622749 0.9353068 0.0647842 -0.0621943 0.9352348 0.0640558 -0.0621069 0.9351449 0.0631476 -0.0620199 0.9350332 0.0620199 -0.063338 0.9350332 0.0620199 -0.0650057 0.9350332 0.0620199 -0.0671155 0.9350332 0.0620199 -0.0697847 0.9350332 0.0620199 -0.0731615 0.9350332 0.0620199 -0.0774337 0.9350332 0.0620199 -0.0828386 0.9350332 0.0620199 -0.0896764 0.9350332 0.0620199 -0.0983271 0.9350332 0.0620199 -0.1092715 0.9350332 0.0620199 -0.1231174 0.9350332 0.0620199 -0.1406344 0.9350332 0.0620199 -0.1627957 0.9350332 0.0620199 -0.1908325 0.9350332 0.0620199 -0.2263028 0.9350332 0.0620199 -0.2711774 0.9350332 0.0620199 -0.3279495 0.9350332 0.0620199 -0.3997736 0.9350332 0.0620199 -0.4906404 0.9350332 0.0620199 -0.6055988 0.9350332 0.0620199 -0.7510361 0.9350332 0.0620199 -0.9350332 0.9350332 0.0620199 -0.9543421 0.7756603 0.1055364 -0.9668187 0.6618076 0.1568008 -0.975343 0.5892706 0.2147144 -0.9813911 0.5516253 0.2780055 -0.9857982 0.5420136 0.3451032 -0.9890723 0.5537789 0.4141683 -0.9915399 0.5807673 0.4832246 -0.9934197 0.6175339 0.5503438 -0.9948636 0.6594963 0.6138323 -0.9959797 0.7030249 0.6723748 -0.9968465 0.7454491 0.7251076 -0.9975224 0.7849838 0.7716184 -0.9980509 0.8205932 0.8118878 -0.9984651 0.8518264 0.8461986 -0.9987903 0.8786507 0.8750355 -0.9990461 0.901305 0.8989948 -0.9992473 0.9201821 0.9187123 -0.9994059 0.9357437 0.9348119 -0.999531 0.9484623 0.9478733 -0.9996296 0.9587861 0.9584146 -0.9997074 0.9671203 0.9668865 -0.9997689 0.973819 0.9736721 -0.9998174 0.9791846 0.9790924 -0.9998557 0.9834706 0.9834127 -0.999886 0.9868866 0.9868504 -0.9999099 0.9896046 0.9895819 -0.9999288 0.9917642 0.99175 -0.9999437 0.9934783 0.9934695 -0.1059991 0.9545467 0.108874 -0.1059489 0.9545286 0.1085789 -0.1058883 0.9545059 0.1082081 -0.1058162 0.9544774 0.1077431 -0.1057322 0.9544418 0.1071616 -0.1056375 0.9543974 0.1064365 -0.1055364 0.9543421 0.1055364 -0.1065482 0.9543421 0.1055364 -0.1078283 0.9543421 0.1055364 -0.1094478 0.9543421 0.1055364 -0.1114966 0.9543421 0.1055364 -0.1140887 0.9543421 0.1055364 -0.117368 0.9543421 0.1055364 -0.1215168 0.9543421 0.1055364 -0.1267655 0.9543421 0.1055364 -0.1334058 0.9543421 0.1055364 -0.1418066 0.9543421 0.1055364 -0.1524348 0.9543421 0.1055364 -0.1658808 0.9543421 0.1055364 -0.1828918 0.9543421 0.1055364 -0.2044128 0.9543421 0.1055364 -0.2316398 0.9543421 0.1055364 -0.2660854 0.9543421 0.1055364 -0.3096636 0.9543421 0.1055364 -0.3647957 0.9543421 0.1055364 -0.434545 0.9543421 0.1055364 -0.5227869 0.9543421 0.1055364 -0.6344244 0.9543421 0.1055364 -0.7756603 0.9543421 0.1055364 -0.9543421 0.9543421 0.1055364 -0.9668187 0.7964626 0.1568008 -0.975343 0.6891423 0.2147144 -0.9813911 0.6245833 0.2780055 -0.9857982 0.5945178 0.3451032 -0.9890723 0.5910046 0.4141683 -0.9915399 0.6067761 0.4832246 -0.9934197 0.6354495 0.5503438 -0.9948636 0.6716722 0.6138323 -0.9959797 0.7111974 0.6723748 -0.9968465 0.750873 0.7251076 -0.9975224 0.7885475 0.7716184 -0.9980509 0.8229144 0.8118878 -0.9984651 0.853327 0.8461986 -0.9987903 0.8796147 0.8750355 -0.9990461 0.901921 0.8989948 -0.9992473 0.9205741 0.9187123 -0.9994059 0.9359922 0.9348119 -0.999531 0.9486193 0.9478733 -0.9996296 0.9588851 0.9584146 -0.9997074 0.9671826 0.9668865 -0.9997689 0.9738582 0.9736721 -0.9998174 0.9792092 0.9790924 -0.9998557 0.983486 0.9834127 -0.999886 0.9868963 0.9868504 -0.9999099 0.9896107 0.9895819 -0.9999288 0.991768 0.99175 -0.9999437 0.9934807 0.9934695 -0.1572498 0.9669269 0.1594176 -0.1572031 0.9669173 0.1591861 -0.1571463 0.9669053 0.1588953 -0.1570779 0.9668902 0.1585307 -0.1569971 0.9668714 0.1580746 -0.156904 0.9668479 0.1575062 -0.1568008 0.9668187 0.1568008 -0.1575633 0.9668187 0.1568008 -0.158528 0.9668187 0.1568008 -0.1597484 0.9668187 0.1568008 -0.1612925 0.9668187 0.1568008 -0.1632458 0.9668187 0.1568008 -0.1657171 0.9668187 0.1568008 -0.1688437 0.9668187 0.1568008 -0.1727991 0.9668187 0.1568008 -0.1778032 0.9668187 0.1568008 -0.1841341 0.9668187 0.1568008 -0.1921435 0.9668187 0.1568008 -0.2022765 0.9668187 0.1568008 -0.215096 0.9668187 0.1568008 -0.2313143 0.9668187 0.1568008 -0.2518326 0.9668187 0.1568008 -0.2777909 0.9668187 0.1568008 -0.3106315 0.9668187 0.1568008 -0.3521792 0.9668187 0.1568008 -0.4047424 0.9668187 0.1568008 -0.4712417 0.9668187 0.1568008 -0.5553719 0.9668187 0.1568008 -0.6618076 0.9668187 0.1568008 -0.7964626 0.9668187 0.1568008 -0.9668187 0.9668187 0.1568008 -0.975343 0.815493 0.2147144 -0.9813911 0.7168846 0.2780055 -0.9857982 0.6609424 0.3451032 -0.9890723 0.6381 0.4141683 -0.9915399 0.6396806 0.4832246 -0.9934197 0.658115 0.5503438 -0.9948636 0.6870762 0.6138323 -0.9959797 0.7215367 0.6723748 -0.9968465 0.7577349 0.7251076 -0.9975224 0.7930561 0.7716184 -0.9980509 0.825851 0.8118878 -0.9984651 0.8552254 0.8461986 -0.9987903 0.8808343 0.8750355 -0.9990461 0.9027003 0.8989948 -0.9992473 0.9210699 0.9187123 -0.9994059 0.9363065 0.9348119 -0.999531 0.948818 0.9478733 -0.9996296 0.9590104 0.9584146 -0.9997074 0.9672615 0.9668865 -0.9997689 0.9739078 0.9736721 -0.9998174 0.9792403 0.9790924 -0.9998557 0.9835055 0.9834127 -0.999886 0.9869085 0.9868504 -0.9999099 0.9896183 0.9895819 -0.9999288 0.9917728 0.99175 -0.9999437 0.9934837 0.9934695 -0.2151269 0.9754027 0.2167356 -0.2150852 0.9753975 0.2165567 -0.2150342 0.9753908 0.216332 -0.2149725 0.9753825 0.2160503 -0.2148987 0.9753721 0.2156981 -0.2148124 0.9753591 0.2152591 -0.2147144 0.975343 0.2147144 -0.2152799 0.975343 0.2147144 -0.2159954 0.975343 0.2147144 -0.2169006 0.975343 0.2147144 -0.2180458 0.975343 0.2147144 -0.2194946 0.975343 0.2147144 -0.2213275 0.975343 0.2147144 -0.2236464 0.975343 0.2147144 -0.2265801 0.975343 0.2147144 -0.2302916 0.975343 0.2147144 -0.2349871 0.975343 0.2147144 -0.2409276 0.975343 0.2147144 -0.2484431 0.975343 0.2147144 -0.2579511 0.975343 0.2147144 -0.26998 0.975343 0.2147144 -0.2851981 0.975343 0.2147144 -0.304451 0.975343 0.2147144 -0.3288084 0.975343 0.2147144 -0.3596237 0.975343 0.2147144 -0.3986091 0.975343 0.2147144 -0.4479306 0.975343 0.2147144 -0.5103288 0.975343 0.2147144 -0.5892706 0.975343 0.2147144 -0.6891423 0.975343 0.2147144 -0.815493 0.975343 0.2147144 -0.975343 0.975343 0.2147144 -0.9813911 0.8336578 0.2780055 -0.9857982 0.7449782 0.3451032 -0.9890723 0.6976819 0.4141683 -0.9915399 0.6813091 0.4832246 -0.9934197 0.6867898 0.5503438 -0.9948636 0.7065643 0.6138323 -0.9959797 0.7346173 0.6723748 -0.9968465 0.7664161 0.7251076 -0.9975224 0.7987601 0.7716184 -0.9980509 0.8295662 0.8118878 -0.9984651 0.8576272 0.8461986 -0.9987903 0.8823772 0.8750355 -0.9990461 0.9036862 0.8989948 -0.9992473 0.9216972 0.9187123 -0.9994059 0.9367042 0.9348119 -0.999531 0.9490694 0.9478733 -0.9996296 0.959169 0.9584146 -0.9997074 0.9673613 0.9668865 -0.9997689 0.9739705 0.9736721 -0.9998174 0.9792797 0.9790924 -0.9998557 0.9835302 0.9834127 -0.999886 0.986924 0.9868504 -0.9999099 0.989628 0.9895819 -0.9999288 0.9917789 0.99175 -0.9999437 0.9934875 0.9934695 -0.2783684 0.9814251 0.2795441 -0.2783325 0.9814221 0.2794079 -0.2782884 0.9814183 0.2792368 -0.2782347 0.9814136 0.2790223 -0.2781701 0.9814076 0.2787542 -0.2780936 0.9814002 0.27842 -0.2780055 0.9813911 0.2780055 -0.2784186 0.9813911 0.2780055 -0.2789413 0.9813911 0.2780055 -0.2796026 0.9813911 0.2780055 -0.2804391 0.9813911 0.2780055 -0.2814975 0.9813911 0.2780055 -0.2828365 0.9813911 0.2780055 -0.2845305 0.9813911 0.2780055 -0.2866736 0.9813911 0.2780055 -0.2893849 0.9813911 0.2780055 -0.2928151 0.9813911 0.2780055 -0.2971547 0.9813911 0.2780055 -0.3026449 0.9813911 0.2780055 -0.3095906 0.9813911 0.2780055 -0.318378 0.9813911 0.2780055 -0.3294951 0.9813911 0.2780055 -0.3435596 0.9813911 0.2780055 -0.3613531 0.9813911 0.2780055 -0.3838642 0.9813911 0.2780055 -0.4123437 0.9813911 0.2780055 -0.448374 0.9813911 0.2780055 -0.4939569 0.9813911 0.2780055 -0.5516253 0.9813911 0.2780055 -0.6245833 0.9813911 0.2780055 -0.7168846 0.9813911 0.2780055 -0.8336578 0.9813911 0.2780055 -0.9813911 0.9813911 0.2780055 -0.9857982 0.8512944 0.3451032 -0.9890723 0.7730606 0.4141683 -0.9915399 0.7339746 0.4832246 -0.9934197 0.7230672 0.5503438 -0.9948636 0.7312193 0.6138323 -0.9959797 0.7511659 0.6723748 -0.9968465 0.7773989 0.7251076 -0.9975224 0.8059764 0.7716184 -0.9980509 0.8342664 0.8118878 -0.9984651 0.8606658 0.8461986 -0.9987903 0.8843291 0.8750355 -0.9990461 0.9049336 0.8989948 -0.9992473 0.9224907 0.9187123 -0.9994059 0.9372073 0.9348119 -0.999531 0.9493874 0.9478733 -0.9996296 0.9593695 0.9584146 -0.9997074 0.9674875 0.9668865 -0.9997689 0.9740498 0.9736721 -0.9998174 0.9793295 0.9790924 -0.9998557 0.9835614 0.9834127 -0.999886 0.9869436 0.9868504 -0.9999099 0.9896403 0.9895819 -0.9999288 0.9917866 0.99175 -0.9999437 0.9934923 0.9934695 -0.3454107 0.9858181 0.3462571 -0.3453807 0.9858163 0.3461549 -0.3453439 0.9858141 0.3460265 -0.3452987 0.9858113 0.3458657 -0.3452442 0.9858079 0.3456646 -0.3451791 0.9858036 0.345414 -0.3451032 0.9857982 0.3451032 -0.3454005 0.9857982 0.3451032 -0.3457767 0.9857982 0.3451032 -0.3462526 0.9857982 0.3451032 -0.3468546 0.9857982 0.3451032 -0.3476163 0.9857982 0.3451032 -0.3485799 0.9857982 0.3451032 -0.3497989 0.9857982 0.3451032 -0.3513412 0.9857982 0.3451032 -0.3532924 0.9857982 0.3451032 -0.3557609 0.9857982 0.3451032 -0.3588839 0.9857982 0.3451032 -0.3628349 0.9857982 0.3451032 -0.3678335 0.9857982 0.3451032 -0.3741573 0.9857982 0.3451032 -0.3821577 0.9857982 0.3451032 -0.3922792 0.9857982 0.3451032 -0.4050843 0.9857982 0.3451032 -0.4212844 0.9857982 0.3451032 -0.4417797 0.9857982 0.3451032 -0.4677088 0.9857982 0.3451032 -0.5005126 0.9857982 0.3451032 -0.5420136 0.9857982 0.3451032 -0.5945178 0.9857982 0.3451032 -0.6609424 0.9857982 0.3451032 -0.7449782 0.9857982 0.3451032 -0.8512944 0.9857982 0.3451032 -0.9857982 0.9857982 0.3451032 -0.9890723 0.8684246 0.4141683 -0.9915399 0.8006032 0.4832246 -0.9934197 0.7689629 0.5503438 -0.9948636 0.7624111 0.6138323 -0.9959797 0.7721021 0.6723748 -0.9968465 0.7912937 0.7251076 -0.9975224 0.8151059 0.7716184 -0.9980509 0.8402127 0.8118878 -0.9984651 0.8645099 0.8461986 -0.9987903 0.8867986 0.8750355 -0.9990461 0.9065116 0.8989948 -0.9992473 0.9234947 0.9187123 -0.9994059 0.9378438 0.9348119 -0.999531 0.9497898 0.9478733 -0.9996296 0.9596232 0.9584146 -0.9997074 0.9676472 0.9668865 -0.9997689 0.9741502 0.9736721 -0.9998174 0.9793925 0.9790924 -0.9998557 0.9836009 0.9834127 -0.999886 0.9869683 0.9868504 -0.9999099 0.9896558 0.9895819 -0.9999288 0.9917963 0.99175 -0.9999437 0.9934984 0.9934695 -0.4144197 0.9890841 0.41502 -0.4143955 0.9890831 0.4149446 -0.4143657 0.9890818 0.4148498 -0.414329 0.9890801 0.4147311 -0.4142845 0.9890781 0.4145826 -0.4142311 0.9890755 0.4143977 -0.4141683 0.9890723 0.4141683 -0.4143791 0.9890723 0.4141683 -0.4146458 0.9890723 0.4141683 -0.4149832 0.9890723 0.4141683 -0.41541 0.9890723 0.4141683 -0.4159501 0.9890723 0.4141683 -0.4166333 0.9890723 0.4141683 -0.4174976 0.9890723 0.4141683 -0.4185911 0.9890723 0.4141683 -0.4199745 0.9890723 0.4141683 -0.4217247 0.9890723 0.4141683 -0.4239389 0.9890723 0.4141683 -0.4267402 0.9890723 0.4141683 -0.4302842 0.9890723 0.4141683 -0.4347678 0.9890723 0.4141683 -0.4404401 0.9890723 0.4141683 -0.4476164 0.9890723 0.4141683 -0.4566952 0.9890723 0.4141683 -0.4681812 0.9890723 0.4141683 -0.4827124 0.9890723 0.4141683 -0.5010964 0.9890723 0.4141683 -0.5243544 0.9890723 0.4141683 -0.5537789 0.9890723 0.4141683 -0.5910046 0.9890723 0.4141683 -0.6381 0.9890723 0.4141683 -0.6976819 0.9890723 0.4141683 -0.7730606 0.9890723 0.4141683 -0.8684246 0.9890723 0.4141683 -0.9890723 0.9890723 0.4141683 -0.9915399 0.8848971 0.4832246 -0.9934197 0.8270268 0.5503438 -0.9948636 0.8018727 0.6138323 -0.9959797 0.798589 0.6723748 -0.9968465 0.8088723 0.7251076 -0.9975224 0.8266559 0.7716184 -0.9980509 0.8477357 0.8118878 -0.9984651 0.8693733 0.8461986 -0.9987903 0.8899228 0.8750355 -0.9990461 0.908508 0.8989948 -0.9992473 0.9247649 0.9187123 -0.9994059 0.938649 0.9348119 -0.999531 0.9502988 0.9478733 -0.9996296 0.9599442 0.9584146 -0.9997074 0.9678493 0.9668865 -0.9997689 0.9742772 0.9736721 -0.9998174 0.9794722 0.9790924 -0.9998557 0.9836509 0.9834127 -0.999886 0.9869996 0.9868504 -0.9999099 0.9896754 0.9895819 -0.9999288 0.9918086 0.99175 -0.9999437 0.9935061 0.9934695 -0.4834235 0.9915469 0.483843 -0.4834045 0.9915463 0.4837882 -0.4833811 0.9915455 0.4837194 -0.4833522 0.9915446 0.4836332 -0.4833171 0.9915433 0.4835254 -0.4832747 0.9915418 0.4833911 -0.4832246 0.9915399 0.4832246 -0.4833719 0.9915399 0.4832246 -0.4835582 0.9915399 0.4832246 -0.4837939 0.9915399 0.4832246 -0.4840922 0.9915399 0.4832246 -0.4844695 0.9915399 0.4832246 -0.4849468 0.9915399 0.4832246 -0.4855507 0.9915399 0.4832246 -0.4863147 0.9915399 0.4832246 -0.4872812 0.9915399 0.4832246 -0.4885041 0.9915399 0.4832246 -0.4900511 0.9915399 0.4832246 -0.4920083 0.9915399 0.4832246 -0.4944844 0.9915399 0.4832246 -0.497617 0.9915399 0.4832246 -0.5015801 0.9915399 0.4832246 -0.506594 0.9915399 0.4832246 -0.5129372 0.9915399 0.4832246 -0.5209622 0.9915399 0.4832246 -0.5311148 0.9915399 0.4832246 -0.5439593 0.9915399 0.4832246 -0.5602091 0.9915399 0.4832246 -0.5807673 0.9915399 0.4832246 -0.6067761 0.9915399 0.4832246 -0.6396806 0.9915399 0.4832246 -0.6813091 0.9915399 0.4832246 -0.7339746 0.9915399 0.4832246 -0.8006032 0.9915399 0.4832246 -0.8848971 0.9915399 0.4832246 -0.9915399 0.9915399 0.4832246 -0.9934197 0.9004852 0.5503438 -0.9948636 0.8517969 0.6138323 -0.9959797 0.8320985 0.6723748 -0.9968465 0.8311115 0.7251076 -0.9975224 0.8412682 0.7716184 -0.9980509 0.8572531 0.8118878 -0.9984651 0.8755261 0.8461986 -0.9987903 0.8938754 0.8750355 -0.9990461 0.9110337 0.8989948 -0.9992473 0.9263719 0.9187123 -0.9994059 0.9396678 0.9348119 -0.999531 0.9509428 0.9478733 -0.9996296 0.9603504 0.9584146 -0.9997074 0.9681049 0.9668865 -0.9997689 0.9744378 0.9736721 -0.9998174 0.9795731 0.9790924 -0.9998557 0.9837142 0.9834127 -0.999886 0.9870393 0.9868504 -0.9999099 0.9897002 0.9895819 -0.9999288 0.9918241 0.99175 -0.9999437 0.9935158 0.9934695 -0.5504963 0.993424 0.5507853 -0.5504818 0.9934236 0.5507462 -0.550464 0.9934231 0.5506971 -0.5504419 0.9934225 0.5506355 -0.550415 0.9934218 0.5505585 -0.5503825 0.9934209 0.5504627 -0.5503438 0.9934197 0.5503438 -0.5504452 0.9934197 0.5503438 -0.5505736 0.9934197 0.5503438 -0.550736 0.9934197 0.5503438 -0.5509414 0.9934197 0.5503438 -0.5512013 0.9934197 0.5503438 -0.5515301 0.9934197 0.5503438 -0.5519461 0.9934197 0.5503438 -0.5524723 0.9934197 0.5503438 -0.5531381 0.9934197 0.5503438 -0.5539804 0.9934197 0.5503438 -0.5550461 0.9934197 0.5503438 -0.5563942 0.9934197 0.5503438 -0.5580998 0.9934197 0.5503438 -0.5602576 0.9934197 0.5503438 -0.5629876 0.9934197 0.5503438 -0.5664413 0.9934197 0.5503438 -0.5708106 0.9934197 0.5503438 -0.5763385 0.9934197 0.5503438 -0.5833319 0.9934197 0.5503438 -0.5921795 0.9934197 0.5503438 -0.6033728 0.9934197 0.5503438 -0.6175339 0.9934197 0.5503438 -0.6354495 0.9934197 0.5503438 -0.658115 0.9934197 0.5503438 -0.6867898 0.9934197 0.5503438 -0.7230672 0.9934197 0.5503438 -0.7689629 0.9934197 0.5503438 -0.8270268 0.9934197 0.5503438 -0.9004852 0.9934197 0.5503438 -0.9934197 0.9934197 0.5503438 -0.9948636 0.9149574 0.6138323 -0.9959797 0.8744923 0.6723748 -0.9968465 0.8592471 0.7251076 -0.9975224 0.8597546 0.7716184 -0.9980509 0.869294 0.8118878 -0.9984651 0.8833102 0.8461986 -0.9987903 0.8988759 0.8750355 -0.9990461 0.9142291 0.8989948 -0.9992473 0.9284049 0.9187123 -0.9994059 0.9409566 0.9348119 -0.999531 0.9517575 0.9478733 -0.9996296 0.9608641 0.9584146 -0.9997074 0.9684283 0.9668865 -0.9997689 0.9746411 0.9736721 -0.9998174 0.9797007 0.9790924 -0.9998557 0.9837942 0.9834127 -0.999886 0.9870894 0.9868504 -0.9999099 0.9897316 0.9895819 -0.9999288 0.9918437 0.99175 -0.9999437 0.9935281 0.9934695 -0.6139459 0.9948662 0.6141423 -0.6139352 0.994866 0.6141149 -0.6139219 0.9948657 0.6140804 -0.6139056 0.9948653 0.6140371 -0.6138855 0.9948649 0.6139831 -0.6138613 0.9948643 0.6139158 -0.6138323 0.9948636 0.6138323 -0.6139012 0.9948636 0.6138323 -0.6139885 0.9948636 0.6138323 -0.6140988 0.9948636 0.6138323 -0.6142384 0.9948636 0.6138323 -0.6144151 0.9948636 0.6138323 -0.6146385 0.9948636 0.6138323 -0.6149212 0.9948636 0.6138323 -0.6152789 0.9948636 0.6138323 -0.6157314 0.9948636 0.6138323 -0.6163039 0.9948636 0.6138323 -0.6170281 0.9948636 0.6138323 -0.6179443 0.9948636 0.6138323 -0.6191035 0.9948636 0.6138323 -0.62057 0.9948636 0.6138323 -0.6224253 0.9948636 0.6138323 -0.6247725 0.9948636 0.6138323 -0.6277421 0.9948636 0.6138323 -0.6314989 0.9948636 0.6138323 -0.6362518 0.9948636 0.6138323 -0.6422649 0.9948636 0.6138323 -0.6498721 0.9948636 0.6138323 -0.6594963 0.9948636 0.6138323 -0.6716722 0.9948636 0.6138323 -0.6870762 0.9948636 0.6138323 -0.7065643 0.9948636 0.6138323 -0.7312193 0.9948636 0.6138323 -0.7624111 0.9948636 0.6138323 -0.8018727 0.9948636 0.6138323 -0.8517969 0.9948636 0.6138323 -0.9149574 0.9948636 0.6138323 -0.9948636 0.9948636 0.6138323 -0.9959797 0.928126 0.6723748 -0.9968465 0.8948422 0.7251076 -0.9975224 0.8831424 0.7716184 -0.9980509 0.8845272 0.8118878 -0.9984651 0.8931581 0.8461986 -0.9987903 0.9052021 0.8750355 -0.9990461 0.9182717 0.8989948 -0.9992473 0.9309769 0.9187123 -0.9994059 0.9425872 0.9348119 -0.999531 0.9527882 0.9478733 -0.9996296 0.9615141 0.9584146 -0.9997074 0.9688374 0.9668865 -0.9997689 0.9748982 0.9736721 -0.9998174 0.9798621 0.9790924 -0.9998557 0.9838954 0.9834127 -0.999886 0.9871528 0.9868504 -0.9999099 0.9897713 0.9895819 -0.9999288 0.9918686 0.99175 -0.9999437 0.9935436 0.9934695 -0.6724572 0.9959813 0.6725891 -0.6724495 0.9959811 0.6725701 -0.6724399 0.9959809 0.6725462 -0.672428 0.9959807 0.6725163 -0.6724135 0.9959804 0.672479 -0.6723959 0.9959801 0.6724325 -0.6723748 0.9959797 0.6723748 -0.6724211 0.9959797 0.6723748 -0.6724796 0.9959797 0.6723748 -0.6725537 0.9959797 0.6723748 -0.6726474 0.9959797 0.6723748 -0.672766 0.9959797 0.6723748 -0.672916 0.9959797 0.6723748 -0.6731057 0.9959797 0.6723748 -0.6733458 0.9959797 0.6723748 -0.6736495 0.9959797 0.6723748 -0.6740337 0.9959797 0.6723748 -0.6745198 0.9959797 0.6723748 -0.6751348 0.9959797 0.6723748 -0.6759129 0.9959797 0.6723748 -0.6768972 0.9959797 0.6723748 -0.6781425 0.9959797 0.6723748 -0.679718 0.9959797 0.6723748 -0.6817112 0.9959797 0.6723748 -0.6842328 0.9959797 0.6723748 -0.687423 0.9959797 0.6723748 -0.691459 0.9959797 0.6723748 -0.696565 0.9959797 0.6723748 -0.7030249 0.9959797 0.6723748 -0.7111974 0.9959797 0.6723748 -0.7215367 0.9959797 0.6723748 -0.7346173 0.9959797 0.6723748 -0.7511659 0.9959797 0.6723748 -0.7721021 0.9959797 0.6723748 -0.798589 0.9959797 0.6723748 -0.8320985 0.9959797 0.6723748 -0.8744923 0.9959797 0.6723748 -0.928126 0.9959797 0.6723748 -0.9959797 0.9959797 0.6723748 -0.9968465 0.9398746 0.7251076 -0.9975224 0.912731 0.7716184 -0.9980509 0.9037992 0.8118878 -0.9984651 0.905617 0.8461986 -0.9987903 0.9132057 0.8750355 -0.9990461 0.9233861 0.8989948 -0.9992473 0.9342308 0.9187123 -0.9994059 0.94465 0.9348119 -0.999531 0.9540921 0.9478733 -0.9996296 0.9623365 0.9584146 -0.9997074 0.969355 0.9668865 -0.9997689 0.9752236 0.9736721 -0.9998174 0.9800663 0.9790924 -0.9998557 0.9840235 0.9834127 -0.999886 0.9872331 0.9868504 -0.9999099 0.9898216 0.9895819 -0.9999288 0.9919001 0.99175 -0.9999437 0.9935633 0.9934695 -0.7251659 0.9968475 0.7252535 -0.7251605 0.9968474 0.7252406 -0.7251537 0.9968473 0.7252243 -0.7251454 0.9968472 0.725204 -0.7251351 0.996847 0.7251785 -0.7251226 0.9968468 0.7251469 -0.7251076 0.9968465 0.7251076 -0.7251383 0.9968465 0.7251076 -0.7251772 0.9968465 0.7251076 -0.7252263 0.9968465 0.7251076 -0.7252885 0.9968465 0.7251076 -0.7253672 0.9968465 0.7251076 -0.7254668 0.9968465 0.7251076 -0.7255927 0.9968465 0.7251076 -0.725752 0.9968465 0.7251076 -0.7259536 0.9968465 0.7251076 -0.7262086 0.9968465 0.7251076 -0.7265312 0.9968465 0.7251076 -0.7269394 0.9968465 0.7251076 -0.7274557 0.9968465 0.7251076 -0.728109 0.9968465 0.7251076 -0.7289355 0.9968465 0.7251076 -0.7299811 0.9968465 0.7251076 -0.7313039 0.9968465 0.7251076 -0.7329774 0.9968465 0.7251076 -0.7350946 0.9968465 0.7251076 -0.7377732 0.9968465 0.7251076 -0.7411619 0.9968465 0.7251076 -0.7454491 0.9968465 0.7251076 -0.750873 0.9968465 0.7251076 -0.7577349 0.9968465 0.7251076 -0.7664161 0.9968465 0.7251076 -0.7773989 0.9968465 0.7251076 -0.7912937 0.9968465 0.7251076 -0.8088723 0.9968465 0.7251076 -0.8311115 0.9968465 0.7251076 -0.8592471 0.9968465 0.7251076 -0.8948422 0.9968465 0.7251076 -0.9398746 0.9968465 0.7251076 -0.9968465 0.9968465 0.7251076 -0.9975224 0.9501643 0.7716184 -0.9980509 0.9281809 0.8118878 -0.9984651 0.9213791 0.8461986 -0.9987903 0.9233312 0.8750355 -0.9990461 0.9298564 0.8989948 -0.9992473 0.9383474 0.9187123 -0.9994059 0.9472598 0.9348119 -0.999531 0.9557418 0.9478733 -0.9996296 0.9633768 0.9584146 -0.9997074 0.9700099 0.9668865 -0.9997689 0.9756351 0.9736721 -0.9998174 0.9803246 0.9790924 -0.9998557 0.9841855 0.9834127 -0.999886 0.9873346 0.9868504 -0.9999099 0.9898852 0.9895819 -0.9999288 0.9919399 0.99175 -0.9999437 0.9935882 0.9934695 -0.7716588 0.997523 0.7717164 -0.7716551 0.997523 0.7717077 -0.7716504 0.9975229 0.7716968 -0.7716446 0.9975228 0.7716831 -0.7716375 0.9975227 0.771666 -0.7716288 0.9975226 0.7716448 -0.7716184 0.9975224 0.7716184 -0.7716386 0.9975224 0.7716184 -0.7716641 0.9975224 0.7716184 -0.7716964 0.9975224 0.7716184 -0.7717373 0.9975224 0.7716184 -0.771789 0.9975224 0.7716184 -0.7718544 0.9975224 0.7716184 -0.7719371 0.9975224 0.7716184 -0.7720418 0.9975224 0.7716184 -0.7721742 0.9975224 0.7716184 -0.7723418 0.9975224 0.7716184 -0.7725538 0.9975224 0.7716184 -0.7728219 0.9975224 0.7716184 -0.7731612 0.9975224 0.7716184 -0.7735904 0.9975224 0.7716184 -0.7741335 0.9975224 0.7716184 -0.7748205 0.9975224 0.7716184 -0.7756896 0.9975224 0.7716184 -0.7767892 0.9975224 0.7716184 -0.7781803 0.9975224 0.7716184 -0.7799403 0.9975224 0.7716184 -0.7821669 0.9975224 0.7716184 -0.7849838 0.9975224 0.7716184 -0.7885475 0.9975224 0.7716184 -0.7930561 0.9975224 0.7716184 -0.7987601 0.9975224 0.7716184 -0.8059764 0.9975224 0.7716184 -0.8151059 0.9975224 0.7716184 -0.8266559 0.9975224 0.7716184 -0.8412682 0.9975224 0.7716184 -0.8597546 0.9975224 0.7716184 -0.8831424 0.9975224 0.7716184 -0.912731 0.9975224 0.7716184 -0.9501643 0.9975224 0.7716184 -0.9975224 0.9975224 0.7716184 -0.9980509 0.9590268 0.8118878 -0.9984651 0.9413202 0.8461986 -0.9987903 0.9361413 0.8750355 -0.9990461 0.9380422 0.8989948 -0.9992473 0.9435555 0.9187123 -0.9994059 0.9505616 0.9348119 -0.999531 0.9578289 0.9478733 -0.9996296 0.964693 0.9584146 -0.9997074 0.9708384 0.9668865 -0.9997689 0.9761558 0.9736721 -0.9998174 0.9806515 0.9790924 -0.9998557 0.9843905 0.9834127 -0.999886 0.9874631 0.9868504 -0.9999099 0.9899656 0.9895819 -0.9999288 0.9919902 0.99175 -0.9999437 0.9936197 0.9934695 -0.8119154 0.9980513 0.8119529 -0.8119128 0.9980512 0.8119471 -0.8119096 0.9980512 0.8119399 -0.8119057 0.9980511 0.8119308 -0.8119009 0.9980511 0.8119195 -0.8118949 0.998051 0.8119053 -0.8118878 0.9980509 0.8118878 -0.811901 0.9980509 0.8118878 -0.8119176 0.9980509 0.8118878 -0.8119387 0.9980509 0.8118878 -0.8119653 0.9980509 0.8118878 -0.8119989 0.9980509 0.8118878 -0.8120415 0.9980509 0.8118878 -0.8120954 0.9980509 0.8118878 -0.8121636 0.9980509 0.8118878 -0.8122499 0.9980509 0.8118878 -0.812359 0.9980509 0.8118878 -0.8124971 0.9980509 0.8118878 -0.8126718 0.9980509 0.8118878 -0.8128927 0.9980509 0.8118878 -0.8131723 0.9980509 0.8118878 -0.813526 0.9980509 0.8118878 -0.8139735 0.9980509 0.8118878 -0.8145396 0.9980509 0.8118878 -0.8152558 0.9980509 0.8118878 -0.8161619 0.9980509 0.8118878 -0.8173082 0.9980509 0.8118878 -0.8187584 0.9980509 0.8118878 -0.8205932 0.9980509 0.8118878 -0.8229144 0.9980509 0.8118878 -0.825851 0.9980509 0.8118878 -0.8295662 0.9980509 0.8118878 -0.8342664 0.9980509 0.8118878 -0.8402127 0.9980509 0.8118878 -0.8477357 0.9980509 0.8118878 -0.8572531 0.9980509 0.8118878 -0.869294 0.9980509 0.8118878 -0.8845272 0.9980509 0.8118878 -0.9037992 0.9980509 0.8118878 -0.9281809 0.9980509 0.8118878 -0.9590268 0.9980509 0.8118878 -0.9980509 0.9980509 0.8118878 -0.9984651 0.9665483 0.8461986 -0.9987903 0.9523478 0.8750355 -0.9990461 0.9483984 0.8989948 -0.9992473 0.9501444 0.9187123 -0.9994059 0.9547387 0.9348119 -0.999531 0.9604694 0.9478733 -0.9996296 0.9663582 0.9584146 -0.9997074 0.9718865 0.9668865 -0.9997689 0.9768145 0.9736721 -0.9998174 0.981065 0.9790924 -0.9998557 0.9846498 0.9834127 -0.999886 0.9876255 0.9868504 -0.9999099 0.9900674 0.9895819 -0.9999288 0.9920539 0.99175 -0.9999437 0.9936596 0.9934695 -0.8462171 0.9984653 0.8462413 -0.8462154 0.9984653 0.8462375 -0.8462132 0.9984653 0.8462328 -0.8462106 0.9984653 0.8462268 -0.8462073 0.9984652 0.8462194 -0.8462034 0.9984652 0.8462101 -0.8461986 0.9984651 0.8461986 -0.8462071 0.9984651 0.8461986 -0.8462179 0.9984651 0.8461986 -0.8462315 0.9984651 0.8461986 -0.8462487 0.9984651 0.8461986 -0.8462704 0.9984651 0.8461986 -0.846298 0.9984651 0.8461986 -0.8463328 0.9984651 0.8461986 -0.8463769 0.9984651 0.8461986 -0.8464327 0.9984651 0.8461986 -0.8465032 0.9984651 0.8461986 -0.8465925 0.9984651 0.8461986 -0.8467054 0.9984651 0.8461986 -0.8468482 0.9984651 0.8461986 -0.847029 0.9984651 0.8461986 -0.8472576 0.9984651 0.8461986 -0.8475469 0.9984651 0.8461986 -0.8479129 0.9984651 0.8461986 -0.8483759 0.9984651 0.8461986 -0.8489617 0.9984651 0.8461986 -0.8497027 0.9984651 0.8461986 -0.8506403 0.9984651 0.8461986 -0.8518264 0.9984651 0.8461986 -0.853327 0.9984651 0.8461986 -0.8552254 0.9984651 0.8461986 -0.8576272 0.9984651 0.8461986 -0.8606658 0.9984651 0.8461986 -0.8645099 0.9984651 0.8461986 -0.8693733 0.9984651 0.8461986 -0.8755261 0.9984651 0.8461986 -0.8833102 0.9984651 0.8461986 -0.8931581 0.9984651 0.8461986 -0.905617 0.9984651 0.8461986 -0.9213791 0.9984651 0.8461986 -0.9413202 0.9984651 0.8461986 -0.9665483 0.9984651 0.8461986 -0.9984651 0.9984651 0.8461986 -0.9987903 0.972851 0.8750355 -0.9990461 0.9615002 0.8989948 -0.9992473 0.9584803 0.9187123 -0.9994059 0.9600233 0.9348119 -0.999531 0.9638099 0.9478733 -0.9996296 0.9684648 0.9584146 -0.9997074 0.9732125 0.9668865 -0.9997689 0.9776479 0.9736721 -0.9998174 0.9815881 0.9790924 -0.9998557 0.9849778 0.9834127 -0.999886 0.9878311 0.9868504 -0.9999099 0.9901961 0.9895819 -0.9999288 0.9921345 0.99175 -0.9999437 0.99371 0.9934695 -0.8750477 0.9987905 0.8750632 -0.8750466 0.9987905 0.8750608 -0.8750451 0.9987904 0.8750577 -0.8750434 0.9987904 0.8750538 -0.8750412 0.9987904 0.875049 -0.8750386 0.9987904 0.8750429 -0.8750355 0.9987903 0.8750355 -0.8750409 0.9987903 0.8750355 -0.8750478 0.9987903 0.8750355 -0.8750566 0.9987903 0.8750355 -0.8750676 0.9987903 0.8750355 -0.8750816 0.9987903 0.8750355 -0.8750993 0.9987903 0.8750355 -0.8751217 0.9987903 0.8750355 -0.87515 0.9987903 0.8750355 -0.8751858 0.9987903 0.8750355 -0.8752311 0.9987903 0.8750355 -0.8752885 0.9987903 0.8750355 -0.875361 0.9987903 0.8750355 -0.8754528 0.9987903 0.8750355 -0.8755689 0.9987903 0.8750355 -0.8757158 0.9987903 0.8750355 -0.8759016 0.9987903 0.8750355 -0.8761367 0.9987903 0.8750355 -0.8764342 0.9987903 0.8750355 -0.8768104 0.9987903 0.8750355 -0.8772865 0.9987903 0.8750355 -0.8778888 0.9987903 0.8750355 -0.8786507 0.9987903 0.8750355 -0.8796147 0.9987903 0.8750355 -0.8808343 0.9987903 0.8750355 -0.8823772 0.9987903 0.8750355 -0.8843291 0.9987903 0.8750355 -0.8867986 0.9987903 0.8750355 -0.8899228 0.9987903 0.8750355 -0.8938754 0.9987903 0.8750355 -0.8988759 0.9987903 0.8750355 -0.9052021 0.9987903 0.8750355 -0.9132057 0.9987903 0.8750355 -0.9233312 0.9987903 0.8750355 -0.9361413 0.9987903 0.8750355 -0.9523478 0.9987903 0.8750355 -0.972851 0.9987903 0.8750355 -0.9987903 0.9987903 0.8750355 -0.9990461 0.9780758 0.8989948 -0.9992473 0.9690261 0.9187123 -0.9994059 0.9667089 0.9348119 -0.999531 0.968036 0.9478733 -0.9996296 0.97113 0.9584146 -0.9997074 0.9748901 0.9668865 -0.9997689 0.9787022 0.9736721 -0.9998174 0.9822499 0.9790924 -0.9998557 0.9853929 0.9834127 -0.999886 0.9880912 0.9868504 -0.9999099 0.990359 0.9895819 -0.9999288 0.9922364 0.99175 -0.9999437 0.9937738 0.9934695 -0.8990028 0.9990461 0.8990127 -0.899002 0.9990461 0.8990111 -0.8990011 0.9990461 0.8990091 -0.899 0.9990461 0.8990066 -0.8989986 0.9990461 0.8990035 -0.8989969 0.9990461 0.8989996 -0.8989948 0.9990461 0.8989948 -0.8989983 0.9990461 0.8989948 -0.8990027 0.9990461 0.8989948 -0.8990083 0.9990461 0.8989948 -0.8990153 0.9990461 0.8989948 -0.8990243 0.9990461 0.8989948 -0.8990356 0.9990461 0.8989948 -0.8990499 0.9990461 0.8989948 -0.899068 0.9990461 0.8989948 -0.8990909 0.9990461 0.8989948 -0.8991198 0.9990461 0.8989948 -0.8991565 0.9990461 0.8989948 -0.8992028 0.9990461 0.8989948 -0.8992615 0.9990461 0.8989948 -0.8993357 0.9990461 0.8989948 -0.8994295 0.9990461 0.8989948 -0.8995483 0.9990461 0.8989948 -0.8996985 0.9990461 0.8989948 -0.8998886 0.9990461 0.8989948 -0.900129 0.9990461 0.8989948 -0.9004332 0.9990461 0.8989948 -0.9008181 0.9990461 0.8989948 -0.901305 0.9990461 0.8989948 -0.901921 0.9990461 0.8989948 -0.9027003 0.9990461 0.8989948 -0.9036862 0.9990461 0.8989948 -0.9049336 0.9990461 0.8989948 -0.9065116 0.9990461 0.8989948 -0.908508 0.9990461 0.8989948 -0.9110337 0.9990461 0.8989948 -0.9142291 0.9990461 0.8989948 -0.9182717 0.9990461 0.8989948 -0.9233861 0.9990461 0.8989948 -0.9298564 0.9990461 0.8989948 -0.9380422 0.9990461 0.8989948 -0.9483984 0.9990461 0.8989948 -0.9615002 0.9990461 0.8989948 -0.9780758 0.9990461 0.8989948 -0.9990461 0.9990461 0.8989948 -0.9992473 0.9823681 0.9187123 -0.9994059 0.9751672 0.9348119 -0.999531 0.9733827 0.9478733 -0.9996296 0.9745018 0.9584146 -0.9997074 0.9770124 0.9668865 -0.9997689 0.9800361 0.9736721 -0.9998174 0.9830872 0.9790924 -0.9998557 0.985918 0.9834127 -0.999886 0.9884202 0.9868504 -0.9999099 0.9905651 0.9895819 -0.9999288 0.9923654 0.99175 -0.9999437 0.9938545 0.9934695 -0.9187175 0.9992474 0.9187238 -0.918717 0.9992474 0.9187228 -0.9187164 0.9992474 0.9187215 -0.9187157 0.9992474 0.9187199 -0.9187148 0.9992474 0.9187179 -0.9187137 0.9992474 0.9187154 -0.9187123 0.9992473 0.9187123 -0.9187145 0.9992473 0.9187123 -0.9187173 0.9992473 0.9187123 -0.9187209 0.9992473 0.9187123 -0.9187254 0.9992473 0.9187123 -0.9187311 0.9992473 0.9187123 -0.9187383 0.9992473 0.9187123 -0.9187474 0.9992473 0.9187123 -0.9187589 0.9992473 0.9187123 -0.9187734 0.9992473 0.9187123 -0.9187919 0.9992473 0.9187123 -0.9188152 0.9992473 0.9187123 -0.9188447 0.9992473 0.9187123 -0.918882 0.9992473 0.9187123 -0.9189292 0.9992473 0.9187123 -0.9189889 0.9992473 0.9187123 -0.9190645 0.9992473 0.9187123 -0.91916 0.9992473 0.9187123 -0.919281 0.9992473 0.9187123 -0.919434 0.9992473 0.9187123 -0.9196275 0.9992473 0.9187123 -0.9198724 0.9992473 0.9187123 -0.9201821 0.9992473 0.9187123 -0.9205741 0.9992473 0.9187123 -0.9210699 0.9992473 0.9187123 -0.9216972 0.9992473 0.9187123 -0.9224907 0.9992473 0.9187123 -0.9234947 0.9992473 0.9187123 -0.9247649 0.9992473 0.9187123 -0.9263719 0.9992473 0.9187123 -0.9284049 0.9992473 0.9187123 -0.9309769 0.9992473 0.9187123 -0.9342308 0.9992473 0.9187123 -0.9383474 0.9992473 0.9187123 -0.9435555 0.9992473 0.9187123 -0.9501444 0.9992473 0.9187123 -0.9584803 0.9992473 0.9187123 -0.9690261 0.9992473 0.9187123 -0.9823681 0.9992473 0.9187123 -0.9992473 0.9992473 0.9187123 -0.9994059 0.985868 0.9348119 -0.999531 0.9801469 0.9478733 -0.9996296 0.9787675 0.9584146 -0.9997074 0.9796975 0.9668865 -0.9997689 0.9817236 0.9736721 -0.9998174 0.9841465 0.9790924 -0.9998557 0.9865823 0.9834127 -0.999886 0.9888365 0.9868504 -0.9999099 0.9908257 0.9895819 -0.9999288 0.9925286 0.99175 -0.9999437 0.9939566 0.9934695 -0.9348153 0.999406 0.9348193 -0.9348149 0.999406 0.9348186 -0.9348146 0.999406 0.9348178 -0.9348141 0.999406 0.9348168 -0.9348135 0.999406 0.9348155 -0.9348128 0.9994059 0.9348139 -0.9348119 0.9994059 0.9348119 -0.9348133 0.9994059 0.9348119 -0.9348151 0.9994059 0.9348119 -0.9348174 0.9994059 0.9348119 -0.9348202 0.9994059 0.9348119 -0.9348238 0.9994059 0.9348119 -0.9348284 0.9994059 0.9348119 -0.9348341 0.9994059 0.9348119 -0.9348414 0.9994059 0.9348119 -0.9348507 0.9994059 0.9348119 -0.9348623 0.9994059 0.9348119 -0.9348771 0.9994059 0.9348119 -0.9348958 0.9994059 0.9348119 -0.9349195 0.9994059 0.9348119 -0.9349494 0.9994059 0.9348119 -0.9349873 0.9994059 0.9348119 -0.9350352 0.9994059 0.9348119 -0.9350958 0.9994059 0.9348119 -0.9351724 0.9994059 0.9348119 -0.9352694 0.9994059 0.9348119 -0.9353921 0.9994059 0.9348119 -0.9355473 0.9994059 0.9348119 -0.9357437 0.9994059 0.9348119 -0.9359922 0.9994059 0.9348119 -0.9363065 0.9994059 0.9348119 -0.9367042 0.9994059 0.9348119 -0.9372073 0.9994059 0.9348119 -0.9378438 0.9994059 0.9348119 -0.938649 0.9994059 0.9348119 -0.9396678 0.9994059 0.9348119 -0.9409566 0.9994059 0.9348119 -0.9425872 0.9994059 0.9348119 -0.94465 0.9994059 0.9348119 -0.9472598 0.9994059 0.9348119 -0.9505616 0.9994059 0.9348119 -0.9547387 0.9994059 0.9348119 -0.9600233 0.9994059 0.9348119 -0.9667089 0.9994059 0.9348119 -0.9751672 0.9994059 0.9348119 -0.985868 0.9994059 0.9348119 -0.9994059 0.9994059 0.9348119 -0.999531 0.9887045 0.9478733 -0.9996296 0.9841643 0.9584146 -0.9997074 0.9830944 0.9668865 -0.9997689 0.9838586 0.9736721 -0.9998174 0.9854867 0.9790924 -0.9998557 0.9874227 0.9834127 -0.999886 0.9893632 0.9868504 -0.9999099 0.9911556 0.9895819 -0.9999288 0.992735 0.99175 -0.9999437 0.9940858 0.9934695 -0.9478754 0.999531 0.9478779 -0.9478752 0.999531 0.9478775 -0.947875 0.999531 0.947877 -0.9478746 0.999531 0.9478763 -0.9478743 0.999531 0.9478755 -0.9478738 0.999531 0.9478745 -0.9478733 0.999531 0.9478733 -0.9478742 0.999531 0.9478733 -0.9478753 0.999531 0.9478733 -0.9478767 0.999531 0.9478733 -0.9478785 0.999531 0.9478733 -0.9478808 0.999531 0.9478733 -0.9478837 0.999531 0.9478733 -0.9478873 0.999531 0.9478733 -0.9478919 0.999531 0.9478733 -0.9478978 0.999531 0.9478733 -0.9479051 0.999531 0.9478733 -0.9479145 0.999531 0.9478733 -0.9479263 0.999531 0.9478733 -0.9479413 0.999531 0.9478733 -0.9479602 0.999531 0.9478733 -0.9479841 0.999531 0.9478733 -0.9480144 0.999531 0.9478733 -0.9480527 0.999531 0.9478733 -0.9481011 0.999531 0.9478733 -0.9481624 0.999531 0.9478733 -0.94824 0.999531 0.9478733 -0.9483381 0.999531 0.9478733 -0.9484623 0.999531 0.9478733 -0.9486193 0.999531 0.9478733 -0.948818 0.999531 0.9478733 -0.9490694 0.999531 0.9478733 -0.9493874 0.999531 0.9478733 -0.9497898 0.999531 0.9478733 -0.9502988 0.999531 0.9478733 -0.9509428 0.999531 0.9478733 -0.9517575 0.999531 0.9478733 -0.9527882 0.999531 0.9478733 -0.9540921 0.999531 0.9478733 -0.9557418 0.999531 0.9478733 -0.9578289 0.999531 0.9478733 -0.9604694 0.999531 0.9478733 -0.9638099 0.999531 0.9478733 -0.968036 0.999531 0.9478733 -0.9733827 0.999531 0.9478733 -0.9801469 0.999531 0.9478733 -0.9887045 0.999531 0.9478733 -0.999531 0.999531 0.9478733 -0.9996296 0.9909918 0.9584146 -0.9997074 0.987392 0.9668865 -0.9997689 0.9865595 0.9736721 -0.9998174 0.9871822 0.9790924 -0.9998557 0.988486 0.9834127 -0.999886 0.9900294 0.9868504 -0.9999099 0.9915728 0.9895819 -0.9999288 0.9929962 0.99175 -0.9999437 0.9942492 0.9934695 -0.958416 0.9996296 0.9584176 -0.9584159 0.9996296 0.9584173 -0.9584157 0.9996296 0.958417 -0.9584155 0.9996296 0.9584166 -0.9584153 0.9996296 0.9584161 -0.958415 0.9996296 0.9584154 -0.9584146 0.9996296 0.9584146 -0.9584152 0.9996296 0.9584146 -0.9584159 0.9996296 0.9584146 -0.9584168 0.9996296 0.9584146 -0.9584179 0.9996296 0.9584146 -0.9584194 0.9996296 0.9584146 -0.9584212 0.9996296 0.9584146 -0.9584235 0.9996296 0.9584146 -0.9584264 0.9996296 0.9584146 -0.9584301 0.9996296 0.9584146 -0.9584347 0.9996296 0.9584146 -0.9584406 0.9996296 0.9584146 -0.9584481 0.9996296 0.9584146 -0.9584575 0.9996296 0.9584146 -0.9584694 0.9996296 0.9584146 -0.9584845 0.9996296 0.9584146 -0.9585036 0.9996296 0.9584146 -0.9585278 0.9996296 0.9584146 -0.9585583 0.9996296 0.9584146 -0.958597 0.9996296 0.9584146 -0.9586459 0.9996296 0.9584146 -0.9587078 0.9996296 0.9584146 -0.9587861 0.9996296 0.9584146 -0.9588851 0.9996296 0.9584146 -0.9590104 0.9996296 0.9584146 -0.959169 0.9996296 0.9584146 -0.9593695 0.9996296 0.9584146 -0.9596232 0.9996296 0.9584146 -0.9599442 0.9996296 0.9584146 -0.9603504 0.9996296 0.9584146 -0.9608641 0.9996296 0.9584146 -0.9615141 0.9996296 0.9584146 -0.9623365 0.9996296 0.9584146 -0.9633768 0.9996296 0.9584146 -0.964693 0.9996296 0.9584146 -0.9663582 0.9996296 0.9584146 -0.9684648 0.9996296 0.9584146 -0.97113 0.9996296 0.9584146 -0.9745018 0.9996296 0.9584146 -0.9787675 0.9996296 0.9584146 -0.9841643 0.9996296 0.9584146 -0.9909918 0.9996296 0.9584146 -0.9996296 0.9996296 0.9584146 -0.9997074 0.9928289 0.9668865 -0.9997689 0.9899766 0.9736721 -0.9998174 0.9893271 0.9790924 -0.9998557 0.9898311 0.9834127 -0.999886 0.9908724 0.9868504 -0.9999099 0.9921007 0.9895819 -0.9999288 0.9933266 0.99175 -0.9999437 0.9944559 0.9934695 -0.9668873 0.9997074 0.9668883 -0.9668872 0.9997074 0.9668882 -0.9668871 0.9997074 0.966888 -0.966887 0.9997074 0.9668877 -0.9668869 0.9997074 0.9668874 -0.9668867 0.9997074 0.966887 -0.9668865 0.9997074 0.9668865 -0.9668868 0.9997074 0.9668865 -0.9668873 0.9997074 0.9668865 -0.9668878 0.9997074 0.9668865 -0.9668885 0.9997074 0.9668865 -0.9668894 0.9997074 0.9668865 -0.9668906 0.9997074 0.9668865 -0.966892 0.9997074 0.9668865 -0.9668939 0.9997074 0.9668865 -0.9668962 0.9997074 0.9668865 -0.9668991 0.9997074 0.9668865 -0.9669028 0.9997074 0.9668865 -0.9669075 0.9997074 0.9668865 -0.9669135 0.9997074 0.9668865 -0.966921 0.9997074 0.9668865 -0.9669305 0.9997074 0.9668865 -0.9669425 0.9997074 0.9668865 -0.9669577 0.9997074 0.9668865 -0.9669769 0.9997074 0.9668865 -0.9670013 0.9997074 0.9668865 -0.967032 0.9997074 0.9668865 -0.967071 0.9997074 0.9668865 -0.9671203 0.9997074 0.9668865 -0.9671826 0.9997074 0.9668865 -0.9672615 0.9997074 0.9668865 -0.9673613 0.9997074 0.9668865 -0.9674875 0.9997074 0.9668865 -0.9676472 0.9997074 0.9668865 -0.9678493 0.9997074 0.9668865 -0.9681049 0.9997074 0.9668865 -0.9684283 0.9997074 0.9668865 -0.9688374 0.9997074 0.9668865 -0.969355 0.9997074 0.9668865 -0.9700099 0.9997074 0.9668865 -0.9708384 0.9997074 0.9668865 -0.9718865 0.9997074 0.9668865 -0.9732125 0.9997074 0.9668865 -0.9748901 0.9997074 0.9668865 -0.9770124 0.9997074 0.9668865 -0.9796975 0.9997074 0.9668865 -0.9830944 0.9997074 0.9668865 -0.987392 0.9997074 0.9668865 -0.9928289 0.9997074 0.9668865 -0.9997074 0.9997074 0.9668865 -0.9997689 0.9942997 0.9736721 -0.9998174 0.9920408 0.9790924 -0.9998557 0.9915329 0.9834127 -0.999886 0.9919388 0.9868504 -0.9999099 0.9927685 0.9895819 -0.9999288 0.9937447 0.99175 -0.9999437 0.9947175 0.9934695 -0.9736726 0.9997689 0.9736733 -0.9736726 0.9997689 0.9736731 -0.9736725 0.9997689 0.973673 -0.9736724 0.9997689 0.9736729 -0.9736723 0.9997689 0.9736726 -0.9736722 0.9997689 0.9736724 -0.9736721 0.9997689 0.9736721 -0.9736723 0.9997689 0.9736721 -0.9736726 0.9997689 0.9736721 -0.9736729 0.9997689 0.9736721 -0.9736734 0.9997689 0.9736721 -0.973674 0.9997689 0.9736721 -0.9736747 0.9997689 0.9736721 -0.9736756 0.9997689 0.9736721 -0.9736767 0.9997689 0.9736721 -0.9736782 0.9997689 0.9736721 -0.97368 0.9997689 0.9736721 -0.9736824 0.9997689 0.9736721 -0.9736853 0.9997689 0.9736721 -0.973689 0.9997689 0.9736721 -0.9736938 0.9997689 0.9736721 -0.9736997 0.9997689 0.9736721 -0.9737073 0.9997689 0.9736721 -0.9737168 0.9997689 0.9736721 -0.9737289 0.9997689 0.9736721 -0.9737442 0.9997689 0.9736721 -0.9737636 0.9997689 0.9736721 -0.9737881 0.9997689 0.9736721 -0.973819 0.9997689 0.9736721 -0.9738582 0.9997689 0.9736721 -0.9739078 0.9997689 0.9736721 -0.9739705 0.9997689 0.9736721 -0.9740498 0.9997689 0.9736721 -0.9741502 0.9997689 0.9736721 -0.9742772 0.9997689 0.9736721 -0.9744378 0.9997689 0.9736721 -0.9746411 0.9997689 0.9736721 -0.9748982 0.9997689 0.9736721 -0.9752236 0.9997689 0.9736721 -0.9756351 0.9997689 0.9736721 -0.9761558 0.9997689 0.9736721 -0.9768145 0.9997689 0.9736721 -0.9776479 0.9997689 0.9736721 -0.9787022 0.9997689 0.9736721 -0.9800361 0.9997689 0.9736721 -0.9817236 0.9997689 0.9736721 -0.9838586 0.9997689 0.9736721 -0.9865595 0.9997689 0.9736721 -0.9899766 0.9997689 0.9736721 -0.9942997 0.9997689 0.9736721 -0.9997689 0.9997689 0.9736721 -0.9998174 0.995474 0.9790924 -0.9998557 0.9936859 0.9834127 -0.999886 0.9932879 0.9868504 -0.9999099 0.9936134 0.9895819 -0.9999288 0.9942735 0.99175 -0.9999437 0.9950484 0.9934695 -0.9790927 0.9998174 0.9790931 -0.9790927 0.9998174 0.9790931 -0.9790927 0.9998174 0.979093 -0.9790926 0.9998174 0.9790929 -0.9790925 0.9998174 0.9790927 -0.9790925 0.9998174 0.9790926 -0.9790924 0.9998174 0.9790924 -0.9790925 0.9998174 0.9790924 -0.9790927 0.9998174 0.9790924 -0.9790929 0.9998174 0.9790924 -0.9790932 0.9998174 0.9790924 -0.9790936 0.9998174 0.9790924 -0.979094 0.9998174 0.9790924 -0.9790946 0.9998174 0.9790924 -0.9790953 0.9998174 0.9790924 -0.9790962 0.9998174 0.9790924 -0.9790974 0.9998174 0.9790924 -0.9790988 0.9998174 0.9790924 -0.9791007 0.9998174 0.9790924 -0.979103 0.9998174 0.9790924 -0.979106 0.9998174 0.9790924 -0.9791097 0.9998174 0.9790924 -0.9791145 0.9998174 0.9790924 -0.9791205 0.9998174 0.9790924 -0.9791281 0.9998174 0.9790924 -0.9791377 0.9998174 0.9790924 -0.9791498 0.9998174 0.9790924 -0.9791652 0.9998174 0.9790924 -0.9791846 0.9998174 0.9790924 -0.9792092 0.9998174 0.9790924 -0.9792403 0.9998174 0.9790924 -0.9792797 0.9998174 0.9790924 -0.9793295 0.9998174 0.9790924 -0.9793925 0.9998174 0.9790924 -0.9794722 0.9998174 0.9790924 -0.9795731 0.9998174 0.9790924 -0.9797007 0.9998174 0.9790924 -0.9798621 0.9998174 0.9790924 -0.9800663 0.9998174 0.9790924 -0.9803246 0.9998174 0.9790924 -0.9806515 0.9998174 0.9790924 -0.981065 0.9998174 0.9790924 -0.9815881 0.9998174 0.9790924 -0.9822499 0.9998174 0.9790924 -0.9830872 0.9998174 0.9790924 -0.9841465 0.9998174 0.9790924 -0.9854867 0.9998174 0.9790924 -0.9871822 0.9998174 0.9790924 -0.9893271 0.9998174 0.9790924 -0.9920408 0.9998174 0.9790924 -0.995474 0.9998174 0.9790924 -0.9998174 0.9998174 0.9790924 -0.9998557 0.9964097 0.9834127 -0.999886 0.9949947 0.9868504 -0.9999099 0.9946823 0.9895819 -0.9999288 0.9949426 0.99175 -0.9999437 0.995467 0.9934695 -0.9834129 0.9998557 0.9834132 -0.9834129 0.9998557 0.9834131 -0.9834129 0.9998557 0.9834131 -0.9834129 0.9998557 0.983413 -0.9834128 0.9998557 0.9834129 -0.9834128 0.9998557 0.9834128 -0.9834127 0.9998557 0.9834127 -0.9834128 0.9998557 0.9834127 -0.9834129 0.9998557 0.9834127 -0.9834131 0.9998557 0.9834127 -0.9834132 0.9998557 0.9834127 -0.9834135 0.9998557 0.9834127 -0.9834137 0.9998557 0.9834127 -0.9834141 0.9998557 0.9834127 -0.9834146 0.9998557 0.9834127 -0.9834151 0.9998557 0.9834127 -0.9834158 0.9998557 0.9834127 -0.9834168 0.9998557 0.9834127 -0.9834179 0.9998557 0.9834127 -0.9834194 0.9998557 0.9834127 -0.9834213 0.9998557 0.9834127 -0.9834236 0.9998557 0.9834127 -0.9834266 0.9998557 0.9834127 -0.9834303 0.9998557 0.9834127 -0.9834351 0.9998557 0.9834127 -0.9834411 0.9998557 0.9834127 -0.9834487 0.9998557 0.9834127 -0.9834584 0.9998557 0.9834127 -0.9834706 0.9998557 0.9834127 -0.983486 0.9998557 0.9834127 -0.9835055 0.9998557 0.9834127 -0.9835302 0.9998557 0.9834127 -0.9835614 0.9998557 0.9834127 -0.9836009 0.9998557 0.9834127 -0.9836509 0.9998557 0.9834127 -0.9837142 0.9998557 0.9834127 -0.9837942 0.9998557 0.9834127 -0.9838954 0.9998557 0.9834127 -0.9840235 0.9998557 0.9834127 -0.9841855 0.9998557 0.9834127 -0.9843905 0.9998557 0.9834127 -0.9846498 0.9998557 0.9834127 -0.9849778 0.9998557 0.9834127 -0.9853929 0.9998557 0.9834127 -0.985918 0.9998557 0.9834127 -0.9865823 0.9998557 0.9834127 -0.9874227 0.9998557 0.9834127 -0.988486 0.9998557 0.9834127 -0.9898311 0.9998557 0.9834127 -0.9915329 0.9998557 0.9834127 -0.9936859 0.9998557 0.9834127 -0.9964097 0.9998557 0.9834127 -0.9998557 0.9998557 0.9834127 -0.999886 0.9971541 0.9868504 -0.9999099 0.9960346 0.9895819 -0.9999288 0.9957891 0.99175 -0.9999437 0.9959967 0.9934695 -0.9868505 0.999886 0.9868507 -0.9868505 0.999886 0.9868506 -0.9868505 0.999886 0.9868506 -0.9868505 0.999886 0.9868506 -0.9868504 0.999886 0.9868505 -0.9868504 0.999886 0.9868504 -0.9868504 0.999886 0.9868504 -0.9868504 0.999886 0.9868504 -0.9868505 0.999886 0.9868504 -0.9868506 0.999886 0.9868504 -0.9868507 0.999886 0.9868504 -0.9868508 0.999886 0.9868504 -0.986851 0.999886 0.9868504 -0.9868512 0.999886 0.9868504 -0.9868515 0.999886 0.9868504 -0.9868519 0.999886 0.9868504 -0.9868523 0.999886 0.9868504 -0.9868529 0.999886 0.9868504 -0.9868536 0.999886 0.9868504 -0.9868546 0.999886 0.9868504 -0.9868557 0.999886 0.9868504 -0.9868572 0.999886 0.9868504 -0.9868591 0.999886 0.9868504 -0.9868614 0.999886 0.9868504 -0.9868644 0.999886 0.9868504 -0.9868682 0.999886 0.9868504 -0.9868729 0.999886 0.9868504 -0.986879 0.999886 0.9868504 -0.9868866 0.999886 0.9868504 -0.9868963 0.999886 0.9868504 -0.9869085 0.999886 0.9868504 -0.986924 0.999886 0.9868504 -0.9869436 0.999886 0.9868504 -0.9869683 0.999886 0.9868504 -0.9869996 0.999886 0.9868504 -0.9870393 0.999886 0.9868504 -0.9870894 0.999886 0.9868504 -0.9871528 0.999886 0.9868504 -0.9872331 0.999886 0.9868504 -0.9873346 0.999886 0.9868504 -0.9874631 0.999886 0.9868504 -0.9876255 0.999886 0.9868504 -0.9878311 0.999886 0.9868504 -0.9880912 0.999886 0.9868504 -0.9884202 0.999886 0.9868504 -0.9888365 0.999886 0.9868504 -0.9893632 0.999886 0.9868504 -0.9900294 0.999886 0.9868504 -0.9908724 0.999886 0.9868504 -0.9919388 0.999886 0.9868504 -0.9932879 0.999886 0.9868504 -0.9949947 0.999886 0.9868504 -0.9971541 0.999886 0.9868504 -0.999886 0.999886 0.9868504 -0.9999099 0.9977455 0.9895819 -0.9999288 0.99686 0.99175 -0.9999437 0.9966667 0.9934695 -0.989582 0.9999099 0.9895821 -0.989582 0.9999099 0.9895821 -0.989582 0.9999099 0.9895821 -0.989582 0.9999099 0.989582 -0.989582 0.9999099 0.989582 -0.9895819 0.9999099 0.989582 -0.9895819 0.9999099 0.9895819 -0.989582 0.9999099 0.9895819 -0.989582 0.9999099 0.9895819 -0.9895821 0.9999099 0.9895819 -0.9895821 0.9999099 0.9895819 -0.9895822 0.9999099 0.9895819 -0.9895823 0.9999099 0.9895819 -0.9895825 0.9999099 0.9895819 -0.9895826 0.9999099 0.9895819 -0.9895829 0.9999099 0.9895819 -0.9895832 0.9999099 0.9895819 -0.9895835 0.9999099 0.9895819 -0.989584 0.9999099 0.9895819 -0.9895845 0.9999099 0.9895819 -0.9895853 0.9999099 0.9895819 -0.9895862 0.9999099 0.9895819 -0.9895874 0.9999099 0.9895819 -0.9895888 0.9999099 0.9895819 -0.9895907 0.9999099 0.9895819 -0.9895931 0.9999099 0.9895819 -0.9895961 0.9999099 0.9895819 -0.9895998 0.9999099 0.9895819 -0.9896046 0.9999099 0.9895819 -0.9896107 0.9999099 0.9895819 -0.9896183 0.9999099 0.9895819 -0.989628 0.9999099 0.9895819 -0.9896403 0.9999099 0.9895819 -0.9896558 0.9999099 0.9895819 -0.9896754 0.9999099 0.9895819 -0.9897002 0.9999099 0.9895819 -0.9897316 0.9999099 0.9895819 -0.9897713 0.9999099 0.9895819 -0.9898216 0.9999099 0.9895819 -0.9898852 0.9999099 0.9895819 -0.9899656 0.9999099 0.9895819 -0.9900674 0.9999099 0.9895819 -0.9901961 0.9999099 0.9895819 -0.990359 0.9999099 0.9895819 -0.9905651 0.9999099 0.9895819 -0.9908257 0.9999099 0.9895819 -0.9911556 0.9999099 0.9895819 -0.9915728 0.9999099 0.9895819 -0.9921007 0.9999099 0.9895819 -0.9927685 0.9999099 0.9895819 -0.9936134 0.9999099 0.9895819 -0.9946823 0.9999099 0.9895819 -0.9960346 0.9999099 0.9895819 -0.9977455 0.9999099 0.9895819 -0.9999099 0.9999099 0.9895819 -0.9999288 0.9982148 0.99175 -0.9999437 0.9975145 0.9934695 -0.9917501 0.9999288 0.9917502 -0.9917501 0.9999288 0.9917501 -0.9917501 0.9999288 0.9917501 -0.9917501 0.9999288 0.9917501 -0.9917501 0.9999288 0.9917501 -0.9917501 0.9999288 0.9917501 -0.99175 0.9999288 0.99175 -0.9917501 0.9999288 0.99175 -0.9917501 0.9999288 0.99175 -0.9917501 0.9999288 0.99175 -0.9917502 0.9999288 0.99175 -0.9917502 0.9999288 0.99175 -0.9917503 0.9999288 0.99175 -0.9917504 0.9999288 0.99175 -0.9917505 0.9999288 0.99175 -0.9917506 0.9999288 0.99175 -0.9917508 0.9999288 0.99175 -0.991751 0.9999288 0.99175 -0.9917513 0.9999288 0.99175 -0.9917517 0.9999288 0.99175 -0.9917521 0.9999288 0.99175 -0.9917527 0.9999288 0.99175 -0.9917534 0.9999288 0.99175 -0.9917544 0.9999288 0.99175 -0.9917555 0.9999288 0.99175 -0.991757 0.9999288 0.99175 -0.9917589 0.9999288 0.99175 -0.9917613 0.9999288 0.99175 -0.9917642 0.9999288 0.99175 -0.991768 0.9999288 0.99175 -0.9917728 0.9999288 0.99175 -0.9917789 0.9999288 0.99175 -0.9917866 0.9999288 0.99175 -0.9917963 0.9999288 0.99175 -0.9918086 0.9999288 0.99175 -0.9918241 0.9999288 0.99175 -0.9918437 0.9999288 0.99175 -0.9918686 0.9999288 0.99175 -0.9919001 0.9999288 0.99175 -0.9919399 0.9999288 0.99175 -0.9919902 0.9999288 0.99175 -0.9920539 0.9999288 0.99175 -0.9921345 0.9999288 0.99175 -0.9922364 0.9999288 0.99175 -0.9923654 0.9999288 0.99175 -0.9925286 0.9999288 0.99175 -0.992735 0.9999288 0.99175 -0.9929962 0.9999288 0.99175 -0.9933266 0.9999288 0.99175 -0.9937447 0.9999288 0.99175 -0.9942735 0.9999288 0.99175 -0.9949426 0.9999288 0.99175 -0.9957891 0.9999288 0.99175 -0.99686 0.9999288 0.99175 -0.9982148 0.9999288 0.99175 -0.9999288 0.9999288 0.99175 -0.9999437 0.9985869 0.9934695 -0.9934695 0.9999437 0.9934695 -0.9934695 0.9999437 0.9934695 -0.9934695 0.9999437 0.9934695 -0.9934695 0.9999437 0.9934695 -0.9934695 0.9999437 0.9934695 -0.9934695 0.9999437 0.9934695 -0.9934695 0.9999437 0.9934695 -0.9934695 0.9999437 0.9934695 -0.9934695 0.9999437 0.9934695 -0.9934695 0.9999437 0.9934695 -0.9934695 0.9999437 0.9934695 -0.9934696 0.9999437 0.9934695 -0.9934696 0.9999437 0.9934695 -0.9934697 0.9999437 0.9934695 -0.9934697 0.9999437 0.9934695 -0.9934698 0.9999437 0.9934695 -0.9934699 0.9999437 0.9934695 -0.9934701 0.9999437 0.9934695 -0.9934703 0.9999437 0.9934695 -0.9934705 0.9999437 0.9934695 -0.9934708 0.9999437 0.9934695 -0.9934711 0.9999437 0.9934695 -0.9934716 0.9999437 0.9934695 -0.9934722 0.9999437 0.9934695 -0.9934729 0.9999437 0.9934695 -0.9934738 0.9999437 0.9934695 -0.993475 0.9999437 0.9934695 -0.9934765 0.9999437 0.9934695 -0.9934783 0.9999437 0.9934695 -0.9934807 0.9999437 0.9934695 -0.9934837 0.9999437 0.9934695 -0.9934875 0.9999437 0.9934695 -0.9934923 0.9999437 0.9934695 -0.9934984 0.9999437 0.9934695 -0.9935061 0.9999437 0.9934695 -0.9935158 0.9999437 0.9934695 -0.9935281 0.9999437 0.9934695 -0.9935436 0.9999437 0.9934695 -0.9935633 0.9999437 0.9934695 -0.9935882 0.9999437 0.9934695 -0.9936197 0.9999437 0.9934695 -0.9936596 0.9999437 0.9934695 -0.99371 0.9999437 0.9934695 -0.9937738 0.9999437 0.9934695 -0.9938545 0.9999437 0.9934695 -0.9939566 0.9999437 0.9934695 -0.9940858 0.9999437 0.9934695 -0.9942492 0.9999437 0.9934695 -0.9944559 0.9999437 0.9934695 -0.9947175 0.9999437 0.9934695 -0.9950484 0.9999437 0.9934695 -0.995467 0.9999437 0.9934695 -0.9959967 0.9999437 0.9934695 -0.9966667 0.9999437 0.9934695 -0.9975145 0.9999437 0.9934695 -0.9985869 0.9999437 0.9934695 -0.9999437 0.9999437 0.9934695 -0.0000238 0.0000238 0.0082023 -0.0005417 0.0000238 0.0082023 -0.0011968 0.0000238 0.0082023 -0.0020256 0.0000238 0.0082023 -0.0030742 0.0000238 0.0082023 -0.0044007 0.0000238 0.0082023 -0.006079 0.0000238 0.0082023 -0.0082023 0.0000238 0.0082023 -0.0108885 0.0000238 0.0082023 -0.0142868 0.0000238 0.0082023 -0.0185862 0.0000238 0.0082023 -0.0240255 0.0000238 0.0082023 -0.0309069 0.0000238 0.0082023 -0.0396127 0.0000238 0.0082023 -0.0506267 0.0000238 0.0082023 -0.0645609 0.0000238 0.0082023 -0.0821895 0.0000238 0.0082023 -0.1044919 0.0000238 0.0082023 -0.1327073 0.0000238 0.0082023 -0.1684036 0.0000238 0.0082023 -0.2135639 0.0000238 0.0082023 -0.2706977 0.0000238 0.0082023 -0.3429792 0.0000238 0.0082023 -0.4344249 0.0000238 0.0082023 -0.5501155 0.0000238 0.0082023 -0.6964791 0.0000238 0.0082023 -0.8407292 0.0051514 0.0129027 -0.9033413 0.0279321 0.0343481 -0.9354466 0.0624569 0.0675125 -0.9545467 0.1059991 0.1098821 -0.9669269 0.1572498 0.1601778 -0.9754027 0.2151269 0.2172997 -0.9814251 0.2783684 0.2799564 -0.9858181 0.3454107 0.3465539 -0.9890841 0.4144197 0.4152305 -0.9915469 0.4834235 0.4839901 -0.993424 0.5504963 0.5508867 -0.9948662 0.6139459 0.6142112 -0.9959813 0.6724572 0.6726353 -0.9968475 0.7251659 0.7252842 -0.997523 0.7716588 0.7717365 -0.9980513 0.8119154 0.811966 -0.9984653 0.8462171 0.8462498 -0.9987905 0.8750477 0.8750687 -0.9990461 0.8990028 0.8990162 -0.9992474 0.9187175 0.918726 -0.999406 0.9348153 0.9348207 -0.999531 0.9478754 0.9478788 -0.9996296 0.958416 0.9584181 -0.9997074 0.9668873 0.9668887 -0.9997689 0.9736726 0.9736735 -0.9998174 0.9790927 0.9790933 -0.9998557 0.9834129 0.9834133 -0.999886 0.9868505 0.9868507 -0.9999099 0.989582 0.9895821 -0.9999288 0.9917501 0.9917502 -0.9999437 0.9934695 0.9934695 -0.0000238 0.0005417 0.0082023 -0.0000382 0.0000382 0.0076988 -0.0006933 0.0000382 0.0076988 -0.0015221 0.0000382 0.0076988 -0.0025707 0.0000382 0.0076988 -0.0038972 0.0000382 0.0076988 -0.0055755 0.0000382 0.0076988 -0.0076988 0.0000382 0.0076988 -0.0103849 0.0000382 0.0076988 -0.0137833 0.0000382 0.0076988 -0.0180827 0.0000382 0.0076988 -0.023522 0.0000382 0.0076988 -0.0304033 0.0000382 0.0076988 -0.0391092 0.0000382 0.0076988 -0.0501232 0.0000382 0.0076988 -0.0640574 0.0000382 0.0076988 -0.081686 0.0000382 0.0076988 -0.1039884 0.0000382 0.0076988 -0.1322038 0.0000382 0.0076988 -0.1679 0.0000382 0.0076988 -0.2130604 0.0000382 0.0076988 -0.2701941 0.0000382 0.0076988 -0.3424757 0.0000382 0.0076988 -0.4339214 0.0000382 0.0076988 -0.549612 0.0000382 0.0076988 -0.6959756 0.0000382 0.0076988 -0.8405071 0.0051286 0.0123916 -0.9032596 0.0278872 0.0338994 -0.9354101 0.0624063 0.0671435 -0.9545286 0.1059489 0.1095873 -0.9669173 0.1572031 0.1599465 -0.9753975 0.2150852 0.2171209 -0.9814221 0.2783325 0.2798202 -0.9858163 0.3453807 0.3464517 -0.9890831 0.4143955 0.4151551 -0.9915463 0.4834045 0.4839353 -0.9934236 0.5504818 0.5508475 -0.994866 0.6139352 0.6141838 -0.9959811 0.6724495 0.6726163 -0.9968474 0.7251605 0.7252713 -0.997523 0.7716551 0.7717278 -0.9980512 0.8119128 0.8119602 -0.9984653 0.8462154 0.846246 -0.9987905 0.8750466 0.8750662 -0.9990461 0.899002 0.8990146 -0.9992474 0.918717 0.918725 -0.999406 0.9348149 0.93482 -0.999531 0.9478752 0.9478784 -0.9996296 0.9584159 0.9584179 -0.9997074 0.9668872 0.9668885 -0.9997689 0.9736726 0.9736734 -0.9998174 0.9790927 0.9790932 -0.9998557 0.9834129 0.9834132 -0.999886 0.9868505 0.9868507 -0.9999099 0.989582 0.9895821 -0.9999288 0.9917501 0.9917502 -0.9999437 0.9934695 0.9934695 -0.0000238 0.0011968 0.0082023 -0.0000382 0.0006933 0.0076988 -0.0000611 0.0000611 0.0070666 -0.0008899 0.0000611 0.0070666 -0.0019385 0.0000611 0.0070666 -0.003265 0.0000611 0.0070666 -0.0049433 0.0000611 0.0070666 -0.0070666 0.0000611 0.0070666 -0.0097527 0.0000611 0.0070666 -0.0131511 0.0000611 0.0070666 -0.0174505 0.0000611 0.0070666 -0.0228898 0.0000611 0.0070666 -0.0297711 0.0000611 0.0070666 -0.038477 0.0000611 0.0070666 -0.049491 0.0000611 0.0070666 -0.0634252 0.0000611 0.0070666 -0.0810538 0.0000611 0.0070666 -0.1033562 0.0000611 0.0070666 -0.1315716 0.0000611 0.0070666 -0.1672678 0.0000611 0.0070666 -0.2124282 0.0000611 0.0070666 -0.2695619 0.0000611 0.0070666 -0.3418435 0.0000611 0.0070666 -0.4332891 0.0000611 0.0070666 -0.5489798 0.0000611 0.0070666 -0.6953434 0.0000611 0.0070666 -0.8402274 0.0051047 0.0117495 -0.9031567 0.0278347 0.0333357 -0.9353643 0.0623458 0.0666799 -0.9545059 0.1058883 0.1092169 -0.9669053 0.1571463 0.1596559 -0.9753908 0.2150342 0.2168964 -0.9814183 0.2782884 0.2796492 -0.9858141 0.3453439 0.3463234 -0.9890818 0.4143657 0.4150604 -0.9915455 0.4833811 0.4838665 -0.9934231 0.550464 0.5507984 -0.9948657 0.6139219 0.6141493 -0.9959809 0.6724399 0.6725925 -0.9968473 0.7251537 0.725255 -0.9975229 0.7716504 0.7717169 -0.9980512 0.8119096 0.811953 -0.9984653 0.8462132 0.8462413 -0.9987904 0.8750451 0.8750631 -0.9990461 0.8990011 0.8990126 -0.9992474 0.9187164 0.9187237 -0.999406 0.9348146 0.9348192 -0.999531 0.947875 0.9478779 -0.9996296 0.9584157 0.9584176 -0.9997074 0.9668871 0.9668883 -0.9997689 0.9736725 0.9736732 -0.9998174 0.9790927 0.9790931 -0.9998557 0.9834129 0.9834132 -0.999886 0.9868505 0.9868507 -0.9999099 0.989582 0.9895821 -0.9999288 0.9917501 0.9917502 -0.9999437 0.9934695 0.9934695 -0.0000238 0.0020256 0.0082023 -0.0000382 0.0015221 0.0076988 -0.0000611 0.0008899 0.0070666 -0.0000978 0.0000978 0.0062744 -0.0011463 0.0000978 0.0062744 -0.0024729 0.0000978 0.0062744 -0.0041512 0.0000978 0.0062744 -0.0062744 0.0000978 0.0062744 -0.0089606 0.0000978 0.0062744 -0.012359 0.0000978 0.0062744 -0.0166583 0.0000978 0.0062744 -0.0220976 0.0000978 0.0062744 -0.028979 0.0000978 0.0062744 -0.0376849 0.0000978 0.0062744 -0.0486989 0.0000978 0.0062744 -0.0626331 0.0000978 0.0062744 -0.0802616 0.0000978 0.0062744 -0.102564 0.0000978 0.0062744 -0.1307795 0.0000978 0.0062744 -0.1664757 0.0000978 0.0062744 -0.2116361 0.0000978 0.0062744 -0.2687698 0.0000978 0.0062744 -0.3410514 0.0000978 0.0062744 -0.432497 0.0000978 0.0062744 -0.5481876 0.0000978 0.0062744 -0.6945513 0.0000978 0.0062744 -0.8398756 0.0050826 0.0109445 -0.9030276 0.0277752 0.0326286 -0.9353068 0.0622749 0.0660986 -0.9544774 0.1058162 0.1087525 -0.9668902 0.1570779 0.1592916 -0.9753825 0.2149725 0.2166149 -0.9814136 0.2782347 0.2794349 -0.9858113 0.3452987 0.3461627 -0.9890801 0.414329 0.4149417 -0.9915446 0.4833522 0.4837803 -0.9934225 0.5504419 0.5507369 -0.9948653 0.6139056 0.614106 -0.9959807 0.672428 0.6725626 -0.9968472 0.7251454 0.7252347 -0.9975228 0.7716446 0.7717033 -0.9980511 0.8119057 0.8119439 -0.9984653 0.8462106 0.8462353 -0.9987904 0.8750434 0.8750593 -0.9990461 0.899 0.8990101 -0.9992474 0.9187157 0.9187221 -0.999406 0.9348141 0.9348182 -0.999531 0.9478746 0.9478772 -0.9996296 0.9584155 0.9584171 -0.9997074 0.966887 0.966888 -0.9997689 0.9736724 0.9736731 -0.9998174 0.9790926 0.979093 -0.9998557 0.9834129 0.9834131 -0.999886 0.9868505 0.9868506 -0.9999099 0.989582 0.9895821 -0.9999288 0.9917501 0.9917501 -0.9999437 0.9934695 0.9934695 -0.0000238 0.0030742 0.0082023 -0.0000382 0.0025707 0.0076988 -0.0000611 0.0019385 0.0070666 -0.0000978 0.0011463 0.0062744 -0.0001565 0.0001565 0.0052846 -0.001483 0.0001565 0.0052846 -0.0031613 0.0001565 0.0052846 -0.0052846 0.0001565 0.0052846 -0.0079707 0.0001565 0.0052846 -0.0113691 0.0001565 0.0052846 -0.0156685 0.0001565 0.0052846 -0.0211078 0.0001565 0.0052846 -0.0279891 0.0001565 0.0052846 -0.036695 0.0001565 0.0052846 -0.047709 0.0001565 0.0052846 -0.0616432 0.0001565 0.0052846 -0.0792718 0.0001565 0.0052846 -0.1015742 0.0001565 0.0052846 -0.1297896 0.0001565 0.0052846 -0.1654858 0.0001565 0.0052846 -0.2106462 0.0001565 0.0052846 -0.2677799 0.0001565 0.0052846 -0.3400615 0.0001565 0.0052846 -0.4315072 0.0001565 0.0052846 -0.5471978 0.0001565 0.0052846 -0.6935614 0.0001565 0.0052846 -0.8394338 0.0050676 0.0099377 -0.9028657 0.0277111 0.0317439 -0.9352348 0.0621943 0.0653712 -0.9544418 0.1057322 0.1081716 -0.9668714 0.1569971 0.158836 -0.9753721 0.2148987 0.2162629 -0.9814076 0.2781701 0.2791669 -0.9858079 0.3452442 0.3459616 -0.9890781 0.4142845 0.4147933 -0.9915433 0.4833171 0.4836726 -0.9934218 0.550415 0.5506599 -0.9948649 0.6138855 0.614052 -0.9959804 0.6724135 0.6725253 -0.996847 0.7251351 0.7252093 -0.9975227 0.7716375 0.7716862 -0.9980511 0.8119009 0.8119326 -0.9984652 0.8462073 0.8462279 -0.9987904 0.8750412 0.8750544 -0.9990461 0.8989986 0.899007 -0.9992474 0.9187148 0.9187201 -0.999406 0.9348135 0.9348169 -0.999531 0.9478743 0.9478764 -0.9996296 0.9584153 0.9584166 -0.9997074 0.9668869 0.9668877 -0.9997689 0.9736723 0.9736729 -0.9998174 0.9790925 0.9790929 -0.9998557 0.9834128 0.983413 -0.999886 0.9868504 0.9868506 -0.9999099 0.989582 0.989582 -0.9999288 0.9917501 0.9917501 -0.9999437 0.9934695 0.9934695 -0.0000238 0.0044007 0.0082023 -0.0000382 0.0038972 0.0076988 -0.0000611 0.003265 0.0070666 -0.0000978 0.0024729 0.0062744 -0.0001565 0.001483 0.0052846 -0.0002504 0.0002504 0.004052 -0.0019287 0.0002504 0.004052 -0.004052 0.0002504 0.004052 -0.0067381 0.0002504 0.004052 -0.0101365 0.0002504 0.004052 -0.0144359 0.0002504 0.004052 -0.0198752 0.0002504 0.004052 -0.0267565 0.0002504 0.004052 -0.0354624 0.0002504 0.004052 -0.0464764 0.0002504 0.004052 -0.0604106 0.0002504 0.004052 -0.0780392 0.0002504 0.004052 -0.1003416 0.0002504 0.004052 -0.128557 0.0002504 0.004052 -0.1642532 0.0002504 0.004052 -0.2094136 0.0002504 0.004052 -0.2665473 0.0002504 0.004052 -0.3388289 0.0002504 0.004052 -0.4302746 0.0002504 0.004052 -0.5459652 0.0002504 0.004052 -0.6923288 0.0002504 0.004052 -0.8388802 0.0050694 0.0086827 -0.9026634 0.0276479 0.0306405 -0.9351449 0.0621069 0.0644643 -0.9543974 0.1056375 0.1074473 -0.9668479 0.156904 0.1582681 -0.9753591 0.2148124 0.2158242 -0.9814002 0.2780936 0.2788329 -0.9858036 0.3451791 0.3457112 -0.9890755 0.4142311 0.4146084 -0.9915418 0.4832747 0.4835383 -0.9934209 0.5503825 0.5505641 -0.9948643 0.6138613 0.6139847 -0.9959801 0.6723959 0.6724787 -0.9968468 0.7251226 0.7251776 -0.9975226 0.7716288 0.7716649 -0.998051 0.8118949 0.8119185 -0.9984652 0.8462034 0.8462186 -0.9987904 0.8750386 0.8750484 -0.9990461 0.8989969 0.8990031 -0.9992474 0.9187137 0.9187176 -0.9994059 0.9348128 0.9348153 -0.999531 0.9478738 0.9478754 -0.9996296 0.958415 0.958416 -0.9997074 0.9668867 0.9668873 -0.9997689 0.9736722 0.9736726 -0.9998174 0.9790925 0.9790927 -0.9998557 0.9834128 0.9834129 -0.999886 0.9868504 0.9868505 -0.9999099 0.9895819 0.989582 -0.9999288 0.9917501 0.9917501 -0.9999437 0.9934695 0.9934695 -0.0000238 0.006079 0.0082023 -0.0000382 0.0055755 0.0076988 -0.0000611 0.0049433 0.0070666 -0.0000978 0.0041512 0.0062744 -0.0001565 0.0031613 0.0052846 -0.0002504 0.0019287 0.004052 -0.0004008 0.0004008 0.0025241 -0.0025241 0.0004008 0.0025241 -0.0052103 0.0004008 0.0025241 -0.0086086 0.0004008 0.0025241 -0.012908 0.0004008 0.0025241 -0.0183473 0.0004008 0.0025241 -0.0252287 0.0004008 0.0025241 -0.0339345 0.0004008 0.0025241 -0.0449485 0.0004008 0.0025241 -0.0588827 0.0004008 0.0025241 -0.0765113 0.0004008 0.0025241 -0.0988137 0.0004008 0.0025241 -0.1270291 0.0004008 0.0025241 -0.1627254 0.0004008 0.0025241 -0.2078857 0.0004008 0.0025241 -0.2650195 0.0004008 0.0025241 -0.337301 0.0004008 0.0025241 -0.4287467 0.0004008 0.0025241 -0.5444373 0.0004008 0.0025241 -0.6908009 0.0004008 0.0025241 -0.8381886 0.0051048 0.007125 -0.9024114 0.0275966 0.0292702 -0.9350332 0.0620199 0.063338 -0.9543421 0.1055364 0.1065482 -0.9668187 0.1568008 0.1575633 -0.975343 0.2147144 0.2152799 -0.9813911 0.2780055 0.2784186 -0.9857982 0.3451032 0.3454005 -0.9890723 0.4141683 0.4143791 -0.9915399 0.4832246 0.4833719 -0.9934197 0.5503438 0.5504452 -0.9948636 0.6138323 0.6139012 -0.9959797 0.6723748 0.6724211 -0.9968465 0.7251076 0.7251383 -0.9975224 0.7716184 0.7716386 -0.9980509 0.8118878 0.811901 -0.9984651 0.8461986 0.8462071 -0.9987903 0.8750355 0.8750409 -0.9990461 0.8989948 0.8989983 -0.9992473 0.9187123 0.9187145 -0.9994059 0.9348119 0.9348133 -0.999531 0.9478733 0.9478742 -0.9996296 0.9584146 0.9584152 -0.9997074 0.9668865 0.9668868 -0.9997689 0.9736721 0.9736723 -0.9998174 0.9790924 0.9790925 -0.9998557 0.9834127 0.9834128 -0.999886 0.9868504 0.9868504 -0.9999099 0.9895819 0.989582 -0.9999288 0.99175 0.9917501 -0.9999437 0.9934695 0.9934695 -0.0000238 0.0082023 0.0082023 -0.0000382 0.0076988 0.0076988 -0.0000611 0.0070666 0.0070666 -0.0000978 0.0062744 0.0062744 -0.0001565 0.0052846 0.0052846 -0.0002504 0.004052 0.004052 -0.0004008 0.0025241 0.0025241 -0.0006416 0.0006416 0.0006416 -0.0033277 0.0006416 0.0006416 -0.0067261 0.0006416 0.0006416 -0.0110255 0.0006416 0.0006416 -0.0164648 0.0006416 0.0006416 -0.0233461 0.0006416 0.0006416 -0.032052 0.0006416 0.0006416 -0.043066 0.0006416 0.0006416 -0.0570002 0.0006416 0.0006416 -0.0746288 0.0006416 0.0006416 -0.0969312 0.0006416 0.0006416 -0.1251466 0.0006416 0.0006416 -0.1608428 0.0006416 0.0006416 -0.2060032 0.0006416 0.0006416 -0.2631369 0.0006416 0.0006416 -0.3354185 0.0006416 0.0006416 -0.4268641 0.0006416 0.0006416 -0.5425548 0.0006416 0.0006416 -0.6889184 0.0006416 0.0006416 -0.8373283 0.0052028 0.0052028 -0.9020992 0.0275778 0.0275778 -0.9348949 0.0619473 0.0619473 -0.9542739 0.1054384 0.1054384 -0.9667827 0.1566936 0.1566936 -0.9753231 0.2146085 0.2146085 -0.9813797 0.2779077 0.2779077 -0.9857916 0.3450175 0.3450175 -0.9890684 0.4140964 0.4140964 -0.9915376 0.4831666 0.4831666 -0.9934183 0.5502987 0.5502987 -0.9948628 0.6137984 0.6137984 -0.9959791 0.67235 0.67235 -0.9968462 0.7250899 0.7250899 -0.9975222 0.7716061 0.7716061 -0.9980508 0.8118794 0.8118794 -0.998465 0.8461929 0.8461929 -0.9987903 0.8750317 0.8750317 -0.999046 0.8989923 0.8989923 -0.9992473 0.9187107 0.9187107 -0.9994059 0.9348109 0.9348109 -0.999531 0.9478726 0.9478726 -0.9996296 0.9584142 0.9584142 -0.9997074 0.9668862 0.9668862 -0.9997689 0.9736719 0.9736719 -0.9998174 0.9790923 0.9790923 -0.9998557 0.9834127 0.9834127 -0.999886 0.9868503 0.9868503 -0.9999099 0.9895819 0.9895819 -0.9999288 0.99175 0.99175 -0.9999437 0.9934694 0.9934694 -0.0000238 0.0108885 0.0082023 -0.0000382 0.0103849 0.0076988 -0.0000611 0.0097527 0.0070666 -0.0000978 0.0089606 0.0062744 -0.0001565 0.0079707 0.0052846 -0.0002504 0.0067381 0.004052 -0.0004008 0.0052103 0.0025241 -0.0006416 0.0033277 0.0006416 -0.0033277 0.0033277 0.0006416 -0.0067261 0.0033277 0.0006416 -0.0110255 0.0033277 0.0006416 -0.0164648 0.0033277 0.0006416 -0.0233461 0.0033277 0.0006416 -0.032052 0.0033277 0.0006416 -0.043066 0.0033277 0.0006416 -0.0570002 0.0033277 0.0006416 -0.0746288 0.0033277 0.0006416 -0.0969312 0.0033277 0.0006416 -0.1251466 0.0033277 0.0006416 -0.1608428 0.0033277 0.0006416 -0.2060032 0.0033277 0.0006416 -0.2631369 0.0033277 0.0006416 -0.3354185 0.0033277 0.0006416 -0.4268641 0.0033277 0.0006416 -0.5425548 0.0033277 0.0006416 -0.6889184 0.0033277 0.0006416 -0.8373283 0.0077619 0.0052028 -0.9020992 0.0296985 0.0275778 -0.9348949 0.0636174 0.0619473 -0.9542739 0.10672 0.1054384 -0.9667827 0.1576592 0.1566936 -0.9753231 0.2153246 0.2146085 -0.9813797 0.2784307 0.2779077 -0.9857916 0.3453938 0.3450175 -0.9890684 0.4143632 0.4140964 -0.9915376 0.483353 0.4831666 -0.9934183 0.5504271 0.5502987 -0.9948628 0.6138856 0.6137984 -0.9959791 0.6724086 0.67235 -0.9968462 0.7251288 0.7250899 -0.9975222 0.7716316 0.7716061 -0.9980508 0.8118961 0.8118794 -0.998465 0.8462037 0.8461929 -0.9987903 0.8750386 0.8750317 -0.999046 0.8989967 0.8989923 -0.9992473 0.9187135 0.9187107 -0.9994059 0.9348127 0.9348109 -0.999531 0.9478737 0.9478726 -0.9996296 0.9584149 0.9584142 -0.9997074 0.9668866 0.9668862 -0.9997689 0.9736722 0.9736719 -0.9998174 0.9790924 0.9790923 -0.9998557 0.9834128 0.9834127 -0.999886 0.9868504 0.9868503 -0.9999099 0.9895819 0.9895819 -0.9999288 0.9917501 0.99175 -0.9999437 0.9934695 0.9934694 -0.0000238 0.0142868 0.0082023 -0.0000382 0.0137833 0.0076988 -0.0000611 0.0131511 0.0070666 -0.0000978 0.012359 0.0062744 -0.0001565 0.0113691 0.0052846 -0.0002504 0.0101365 0.004052 -0.0004008 0.0086086 0.0025241 -0.0006416 0.0067261 0.0006416 -0.0033277 0.0067261 0.0006416 -0.0067261 0.0067261 0.0006416 -0.0110255 0.0067261 0.0006416 -0.0164648 0.0067261 0.0006416 -0.0233461 0.0067261 0.0006416 -0.032052 0.0067261 0.0006416 -0.043066 0.0067261 0.0006416 -0.0570002 0.0067261 0.0006416 -0.0746288 0.0067261 0.0006416 -0.0969312 0.0067261 0.0006416 -0.1251466 0.0067261 0.0006416 -0.1608428 0.0067261 0.0006416 -0.2060032 0.0067261 0.0006416 -0.2631369 0.0067261 0.0006416 -0.3354185 0.0067261 0.0006416 -0.4268641 0.0067261 0.0006416 -0.5425548 0.0067261 0.0006416 -0.6889184 0.0067261 0.0006416 -0.8373283 0.0109995 0.0052028 -0.9020992 0.0323815 0.0275778 -0.9348949 0.0657302 0.0619473 -0.9542739 0.1083415 0.1054384 -0.9667827 0.1588809 0.1566936 -0.9753231 0.2162305 0.2146085 -0.9813797 0.2790924 0.2779077 -0.9857916 0.34587 0.3450175 -0.9890684 0.4147008 0.4140964 -0.9915376 0.4835889 0.4831666 -0.9934183 0.5505896 0.5502987 -0.9948628 0.613996 0.6137984 -0.9959791 0.6724827 0.67235 -0.9968462 0.725178 0.7250899 -0.9975222 0.7716639 0.7716061 -0.9980508 0.8119171 0.8118794 -0.998465 0.8462173 0.8461929 -0.9987903 0.8750474 0.8750317 -0.999046 0.8990023 0.8989923 -0.9992473 0.9187171 0.9187107 -0.9994059 0.9348149 0.9348109 -0.999531 0.9478751 0.9478726 -0.9996296 0.9584158 0.9584142 -0.9997074 0.9668872 0.9668862 -0.9997689 0.9736725 0.9736719 -0.9998174 0.9790927 0.9790923 -0.9998557 0.9834129 0.9834127 -0.999886 0.9868505 0.9868503 -0.9999099 0.989582 0.9895819 -0.9999288 0.9917501 0.99175 -0.9999437 0.9934695 0.9934694 -0.0000238 0.0185862 0.0082023 -0.0000382 0.0180827 0.0076988 -0.0000611 0.0174505 0.0070666 -0.0000978 0.0166583 0.0062744 -0.0001565 0.0156685 0.0052846 -0.0002504 0.0144359 0.004052 -0.0004008 0.012908 0.0025241 -0.0006416 0.0110255 0.0006416 -0.0033277 0.0110255 0.0006416 -0.0067261 0.0110255 0.0006416 -0.0110255 0.0110255 0.0006416 -0.0164648 0.0110255 0.0006416 -0.0233461 0.0110255 0.0006416 -0.032052 0.0110255 0.0006416 -0.043066 0.0110255 0.0006416 -0.0570002 0.0110255 0.0006416 -0.0746288 0.0110255 0.0006416 -0.0969312 0.0110255 0.0006416 -0.1251466 0.0110255 0.0006416 -0.1608428 0.0110255 0.0006416 -0.2060032 0.0110255 0.0006416 -0.2631369 0.0110255 0.0006416 -0.3354185 0.0110255 0.0006416 -0.4268641 0.0110255 0.0006416 -0.5425548 0.0110255 0.0006416 -0.6889184 0.0110255 0.0006416 -0.8373283 0.0150955 0.0052028 -0.9020992 0.0357758 0.0275778 -0.9348949 0.0684033 0.0619473 -0.9542739 0.1103929 0.1054384 -0.9667827 0.1604266 0.1566936 -0.9753231 0.2173767 0.2146085 -0.9813797 0.2799296 0.2779077 -0.9857916 0.3464724 0.3450175 -0.9890684 0.4151278 0.4140964 -0.9915376 0.4838872 0.4831666 -0.9934183 0.5507951 0.5502987 -0.9948628 0.6141357 0.6137984 -0.9959791 0.6725764 0.67235 -0.9968462 0.7252402 0.7250899 -0.9975222 0.7717048 0.7716061 -0.9980508 0.8119437 0.8118794 -0.998465 0.8462345 0.8461929 -0.9987903 0.8750584 0.8750317 -0.999046 0.8990094 0.8989923 -0.9992473 0.9187216 0.9187107 -0.9994059 0.9348178 0.9348109 -0.999531 0.947877 0.9478726 -0.9996296 0.9584169 0.9584142 -0.9997074 0.9668879 0.9668862 -0.9997689 0.973673 0.9736719 -0.9998174 0.979093 0.9790923 -0.9998557 0.9834131 0.9834127 -0.999886 0.9868506 0.9868503 -0.9999099 0.9895821 0.9895819 -0.9999288 0.9917501 0.99175 -0.9999437 0.9934695 0.9934694 -0.0000238 0.0240255 0.0082023 -0.0000382 0.023522 0.0076988 -0.0000611 0.0228898 0.0070666 -0.0000978 0.0220976 0.0062744 -0.0001565 0.0211078 0.0052846 -0.0002504 0.0198752 0.004052 -0.0004008 0.0183473 0.0025241 -0.0006416 0.0164648 0.0006416 -0.0033277 0.0164648 0.0006416 -0.0067261 0.0164648 0.0006416 -0.0110255 0.0164648 0.0006416 -0.0164648 0.0164648 0.0006416 -0.0233461 0.0164648 0.0006416 -0.032052 0.0164648 0.0006416 -0.043066 0.0164648 0.0006416 -0.0570002 0.0164648 0.0006416 -0.0746288 0.0164648 0.0006416 -0.0969312 0.0164648 0.0006416 -0.1251466 0.0164648 0.0006416 -0.1608428 0.0164648 0.0006416 -0.2060032 0.0164648 0.0006416 -0.2631369 0.0164648 0.0006416 -0.3354185 0.0164648 0.0006416 -0.4268641 0.0164648 0.0006416 -0.5425548 0.0164648 0.0006416 -0.6889184 0.0164648 0.0006416 -0.8373283 0.0202775 0.0052028 -0.9020992 0.04007 0.0275778 -0.9348949 0.071785 0.0619473 -0.9542739 0.1129881 0.1054384 -0.9667827 0.162382 0.1566936 -0.9753231 0.2188268 0.2146085 -0.9813797 0.2809887 0.2779077 -0.9857916 0.3472345 0.3450175 -0.9890684 0.4156681 0.4140964 -0.9915376 0.4842647 0.4831666 -0.9934183 0.551055 0.5502987 -0.9948628 0.6143124 0.6137984 -0.9959791 0.672695 0.67235 -0.9968462 0.7253189 0.7250899 -0.9975222 0.7717565 0.7716061 -0.9980508 0.8119774 0.8118794 -0.998465 0.8462563 0.8461929 -0.9987903 0.8750724 0.8750317 -0.999046 0.8990183 0.8989923 -0.9992473 0.9187273 0.9187107 -0.9994059 0.9348214 0.9348109 -0.999531 0.9478792 0.9478726 -0.9996296 0.9584184 0.9584142 -0.9997074 0.9668888 0.9668862 -0.9997689 0.9736736 0.9736719 -0.9998174 0.9790933 0.9790923 -0.9998557 0.9834133 0.9834127 -0.999886 0.9868507 0.9868503 -0.9999099 0.9895822 0.9895819 -0.9999288 0.9917502 0.99175 -0.9999437 0.9934695 0.9934694 -0.0000238 0.0309069 0.0082023 -0.0000382 0.0304033 0.0076988 -0.0000611 0.0297711 0.0070666 -0.0000978 0.028979 0.0062744 -0.0001565 0.0279891 0.0052846 -0.0002504 0.0267565 0.004052 -0.0004008 0.0252287 0.0025241 -0.0006416 0.0233461 0.0006416 -0.0033277 0.0233461 0.0006416 -0.0067261 0.0233461 0.0006416 -0.0110255 0.0233461 0.0006416 -0.0164648 0.0233461 0.0006416 -0.0233461 0.0233461 0.0006416 -0.032052 0.0233461 0.0006416 -0.043066 0.0233461 0.0006416 -0.0570002 0.0233461 0.0006416 -0.0746288 0.0233461 0.0006416 -0.0969312 0.0233461 0.0006416 -0.1251466 0.0233461 0.0006416 -0.1608428 0.0233461 0.0006416 -0.2060032 0.0233461 0.0006416 -0.2631369 0.0233461 0.0006416 -0.3354185 0.0233461 0.0006416 -0.4268641 0.0233461 0.0006416 -0.5425548 0.0233461 0.0006416 -0.6889184 0.0233461 0.0006416 -0.8373283 0.0268333 0.0052028 -0.9020992 0.0455028 0.0275778 -0.9348949 0.0760633 0.0619473 -0.9542739 0.1162715 0.1054384 -0.9667827 0.1648558 0.1566936 -0.9753231 0.2206612 0.2146085 -0.9813797 0.2823287 0.2779077 -0.9857916 0.3481986 0.3450175 -0.9890684 0.4163517 0.4140964 -0.9915376 0.4847422 0.4831666 -0.9934183 0.5513839 0.5502987 -0.9948628 0.6145359 0.6137984 -0.9959791 0.672845 0.67235 -0.9968462 0.7254184 0.7250899 -0.9975222 0.7718219 0.7716061 -0.9980508 0.81202 0.8118794 -0.998465 0.8462838 0.8461929 -0.9987903 0.8750901 0.8750317 -0.999046 0.8990296 0.8989923 -0.9992473 0.9187344 0.9187107 -0.9994059 0.9348259 0.9348109 -0.999531 0.9478821 0.9478726 -0.9996296 0.9584202 0.9584142 -0.9997074 0.96689 0.9668862 -0.9997689 0.9736743 0.9736719 -0.9998174 0.9790938 0.9790923 -0.9998557 0.9834136 0.9834127 -0.999886 0.9868509 0.9868503 -0.9999099 0.9895823 0.9895819 -0.9999288 0.9917503 0.99175 -0.9999437 0.9934696 0.9934694 -0.0000238 0.0396127 0.0082023 -0.0000382 0.0391092 0.0076988 -0.0000611 0.038477 0.0070666 -0.0000978 0.0376849 0.0062744 -0.0001565 0.036695 0.0052846 -0.0002504 0.0354624 0.004052 -0.0004008 0.0339345 0.0025241 -0.0006416 0.032052 0.0006416 -0.0033277 0.032052 0.0006416 -0.0067261 0.032052 0.0006416 -0.0110255 0.032052 0.0006416 -0.0164648 0.032052 0.0006416 -0.0233461 0.032052 0.0006416 -0.032052 0.032052 0.0006416 -0.043066 0.032052 0.0006416 -0.0570002 0.032052 0.0006416 -0.0746288 0.032052 0.0006416 -0.0969312 0.032052 0.0006416 -0.1251466 0.032052 0.0006416 -0.1608428 0.032052 0.0006416 -0.2060032 0.032052 0.0006416 -0.2631369 0.032052 0.0006416 -0.3354185 0.032052 0.0006416 -0.4268641 0.032052 0.0006416 -0.5425548 0.032052 0.0006416 -0.6889184 0.032052 0.0006416 -0.8373283 0.0351273 0.0052028 -0.9020992 0.052376 0.0275778 -0.9348949 0.0814759 0.0619473 -0.9542739 0.1204253 0.1054384 -0.9667827 0.1679855 0.1566936 -0.9753231 0.2229821 0.2146085 -0.9813797 0.2840238 0.2779077 -0.9857916 0.3494184 0.3450175 -0.9890684 0.4172164 0.4140964 -0.9915376 0.4853463 0.4831666 -0.9934183 0.5518001 0.5502987 -0.9948628 0.6148187 0.6137984 -0.9959791 0.6730348 0.67235 -0.9968462 0.7255444 0.7250899 -0.9975222 0.7719047 0.7716061 -0.9980508 0.8120739 0.8118794 -0.998465 0.8463187 0.8461929 -0.9987903 0.8751125 0.8750317 -0.999046 0.8990439 0.8989923 -0.9992473 0.9187435 0.9187107 -0.9994059 0.9348317 0.9348109 -0.999531 0.9478858 0.9478726 -0.9996296 0.9584225 0.9584142 -0.9997074 0.9668914 0.9668862 -0.9997689 0.9736752 0.9736719 -0.9998174 0.9790943 0.9790923 -0.9998557 0.9834139 0.9834127 -0.999886 0.9868511 0.9868503 -0.9999099 0.9895824 0.9895819 -0.9999288 0.9917503 0.99175 -0.9999437 0.9934696 0.9934694 -0.0000238 0.0506267 0.0082023 -0.0000382 0.0501232 0.0076988 -0.0000611 0.049491 0.0070666 -0.0000978 0.0486989 0.0062744 -0.0001565 0.047709 0.0052846 -0.0002504 0.0464764 0.004052 -0.0004008 0.0449485 0.0025241 -0.0006416 0.043066 0.0006416 -0.0033277 0.043066 0.0006416 -0.0067261 0.043066 0.0006416 -0.0110255 0.043066 0.0006416 -0.0164648 0.043066 0.0006416 -0.0233461 0.043066 0.0006416 -0.032052 0.043066 0.0006416 -0.043066 0.043066 0.0006416 -0.0570002 0.043066 0.0006416 -0.0746288 0.043066 0.0006416 -0.0969312 0.043066 0.0006416 -0.1251466 0.043066 0.0006416 -0.1608428 0.043066 0.0006416 -0.2060032 0.043066 0.0006416 -0.2631369 0.043066 0.0006416 -0.3354185 0.043066 0.0006416 -0.4268641 0.043066 0.0006416 -0.5425548 0.043066 0.0006416 -0.6889184 0.043066 0.0006416 -0.8373283 0.0456203 0.0052028 -0.9020992 0.0610714 0.0275778 -0.9348949 0.0883235 0.0619473 -0.9542739 0.1256805 0.1054384 -0.9667827 0.1719451 0.1566936 -0.9753231 0.2259183 0.2146085 -0.9813797 0.2861685 0.2779077 -0.9857916 0.3509616 0.3450175 -0.9890684 0.4183104 0.4140964 -0.9915376 0.4861106 0.4831666 -0.9934183 0.5523265 0.5502987 -0.9948628 0.6151764 0.6137984 -0.9959791 0.6732749 0.67235 -0.9968462 0.7257037 0.7250899 -0.9975222 0.7720094 0.7716061 -0.9980508 0.8121421 0.8118794 -0.998465 0.8463627 0.8461929 -0.9987903 0.8751408 0.8750317 -0.999046 0.899062 0.8989923 -0.9992473 0.9187551 0.9187107 -0.9994059 0.934839 0.9348109 -0.999531 0.9478904 0.9478726 -0.9996296 0.9584254 0.9584142 -0.9997074 0.9668932 0.9668862 -0.9997689 0.9736763 0.9736719 -0.9998174 0.9790951 0.9790923 -0.9998557 0.9834144 0.9834127 -0.999886 0.9868514 0.9868503 -0.9999099 0.9895826 0.9895819 -0.9999288 0.9917505 0.99175 -0.9999437 0.9934697 0.9934694 -0.0000238 0.0645609 0.0082023 -0.0000382 0.0640574 0.0076988 -0.0000611 0.0634252 0.0070666 -0.0000978 0.0626331 0.0062744 -0.0001565 0.0616432 0.0052846 -0.0002504 0.0604106 0.004052 -0.0004008 0.0588827 0.0025241 -0.0006416 0.0570002 0.0006416 -0.0033277 0.0570002 0.0006416 -0.0067261 0.0570002 0.0006416 -0.0110255 0.0570002 0.0006416 -0.0164648 0.0570002 0.0006416 -0.0233461 0.0570002 0.0006416 -0.032052 0.0570002 0.0006416 -0.043066 0.0570002 0.0006416 -0.0570002 0.0570002 0.0006416 -0.0746288 0.0570002 0.0006416 -0.0969312 0.0570002 0.0006416 -0.1251466 0.0570002 0.0006416 -0.1608428 0.0570002 0.0006416 -0.2060032 0.0570002 0.0006416 -0.2631369 0.0570002 0.0006416 -0.3354185 0.0570002 0.0006416 -0.4268641 0.0570002 0.0006416 -0.5425548 0.0570002 0.0006416 -0.6889184 0.0570002 0.0006416 -0.8373283 0.0588953 0.0052028 -0.9020992 0.0720722 0.0275778 -0.9348949 0.0969867 0.0619473 -0.9542739 0.1323289 0.1054384 -0.9667827 0.1769544 0.1566936 -0.9753231 0.229633 0.2146085 -0.9813797 0.2888817 0.2779077 -0.9857916 0.352914 0.3450175 -0.9890684 0.4196945 0.4140964 -0.9915376 0.4870776 0.4831666 -0.9934183 0.5529925 0.5502987 -0.9948628 0.615629 0.6137984 -0.9959791 0.6735787 0.67235 -0.9968462 0.7259053 0.7250899 -0.9975222 0.7721418 0.7716061 -0.9980508 0.8122284 0.8118794 -0.998465 0.8464185 0.8461929 -0.9987903 0.8751766 0.8750317 -0.999046 0.8990849 0.8989923 -0.9992473 0.9187696 0.9187107 -0.9994059 0.9348482 0.9348109 -0.999531 0.9478962 0.9478726 -0.9996296 0.9584291 0.9584142 -0.9997074 0.9668956 0.9668862 -0.9997689 0.9736778 0.9736719 -0.9998174 0.979096 0.9790923 -0.9998557 0.983415 0.9834127 -0.999886 0.9868518 0.9868503 -0.9999099 0.9895828 0.9895819 -0.9999288 0.9917506 0.99175 -0.9999437 0.9934698 0.9934694 -0.0000238 0.0821895 0.0082023 -0.0000382 0.081686 0.0076988 -0.0000611 0.0810538 0.0070666 -0.0000978 0.0802616 0.0062744 -0.0001565 0.0792718 0.0052846 -0.0002504 0.0780392 0.004052 -0.0004008 0.0765113 0.0025241 -0.0006416 0.0746288 0.0006416 -0.0033277 0.0746288 0.0006416 -0.0067261 0.0746288 0.0006416 -0.0110255 0.0746288 0.0006416 -0.0164648 0.0746288 0.0006416 -0.0233461 0.0746288 0.0006416 -0.032052 0.0746288 0.0006416 -0.043066 0.0746288 0.0006416 -0.0570002 0.0746288 0.0006416 -0.0746288 0.0746288 0.0006416 -0.0969312 0.0746288 0.0006416 -0.1251466 0.0746288 0.0006416 -0.1608428 0.0746288 0.0006416 -0.2060032 0.0746288 0.0006416 -0.2631369 0.0746288 0.0006416 -0.3354185 0.0746288 0.0006416 -0.4268641 0.0746288 0.0006416 -0.5425548 0.0746288 0.0006416 -0.6889184 0.0746288 0.0006416 -0.8373283 0.0756899 0.0052028 -0.9020992 0.0859897 0.0275778 -0.9348949 0.1079468 0.0619473 -0.9542739 0.1407401 0.1054384 -0.9667827 0.1832918 0.1566936 -0.9753231 0.2343326 0.2146085 -0.9813797 0.2923143 0.2779077 -0.9857916 0.355384 0.3450175 -0.9890684 0.4214456 0.4140964 -0.9915376 0.4883009 0.4831666 -0.9934183 0.5538351 0.5502987 -0.9948628 0.6162016 0.6137984 -0.9959791 0.673963 0.67235 -0.9968462 0.7261604 0.7250899 -0.9975222 0.7723094 0.7716061 -0.9980508 0.8123375 0.8118794 -0.998465 0.8464891 0.8461929 -0.9987903 0.8752219 0.8750317 -0.999046 0.8991139 0.8989923 -0.9992473 0.9187881 0.9187107 -0.9994059 0.9348599 0.9348109 -0.999531 0.9479036 0.9478726 -0.9996296 0.9584337 0.9584142 -0.9997074 0.9668985 0.9668862 -0.9997689 0.9736796 0.9736719 -0.9998174 0.9790971 0.9790923 -0.9998557 0.9834157 0.9834127 -0.999886 0.9868522 0.9868503 -0.9999099 0.9895831 0.9895819 -0.9999288 0.9917508 0.99175 -0.9999437 0.9934699 0.9934694 -0.0000238 0.1044919 0.0082023 -0.0000382 0.1039884 0.0076988 -0.0000611 0.1033562 0.0070666 -0.0000978 0.102564 0.0062744 -0.0001565 0.1015742 0.0052846 -0.0002504 0.1003416 0.004052 -0.0004008 0.0988137 0.0025241 -0.0006416 0.0969312 0.0006416 -0.0033277 0.0969312 0.0006416 -0.0067261 0.0969312 0.0006416 -0.0110255 0.0969312 0.0006416 -0.0164648 0.0969312 0.0006416 -0.0233461 0.0969312 0.0006416 -0.032052 0.0969312 0.0006416 -0.043066 0.0969312 0.0006416 -0.0570002 0.0969312 0.0006416 -0.0746288 0.0969312 0.0006416 -0.0969312 0.0969312 0.0006416 -0.1251466 0.0969312 0.0006416 -0.1608428 0.0969312 0.0006416 -0.2060032 0.0969312 0.0006416 -0.2631369 0.0969312 0.0006416 -0.3354185 0.0969312 0.0006416 -0.4268641 0.0969312 0.0006416 -0.5425548 0.0969312 0.0006416 -0.6889184 0.0969312 0.0006416 -0.8373283 0.0969372 0.0052028 -0.9020992 0.1035972 0.0275778 -0.9348949 0.1218126 0.0619473 -0.9542739 0.1513813 0.1054384 -0.9667827 0.1913094 0.1566936 -0.9753231 0.2402781 0.2146085 -0.9813797 0.296657 0.2779077 -0.9857916 0.3585088 0.3450175 -0.9890684 0.4236608 0.4140964 -0.9915376 0.4898485 0.4831666 -0.9934183 0.5549011 0.5502987 -0.9948628 0.6169261 0.6137984 -0.9959791 0.6744492 0.67235 -0.9968462 0.7264831 0.7250899 -0.9975222 0.7725214 0.7716061 -0.9980508 0.8124756 0.8118794 -0.998465 0.8465783 0.8461929 -0.9987903 0.8752793 0.8750317 -0.999046 0.8991505 0.8989923 -0.9992473 0.9188114 0.9187107 -0.9994059 0.9348747 0.9348109 -0.999531 0.9479129 0.9478726 -0.9996296 0.9584396 0.9584142 -0.9997074 0.9669022 0.9668862 -0.9997689 0.973682 0.9736719 -0.9998174 0.9790986 0.9790923 -0.9998557 0.9834166 0.9834127 -0.999886 0.9868528 0.9868503 -0.9999099 0.9895834 0.9895819 -0.9999288 0.991751 0.99175 -0.9999437 0.9934701 0.9934694 -0.0000238 0.1327073 0.0082023 -0.0000382 0.1322038 0.0076988 -0.0000611 0.1315716 0.0070666 -0.0000978 0.1307795 0.0062744 -0.0001565 0.1297896 0.0052846 -0.0002504 0.128557 0.004052 -0.0004008 0.1270291 0.0025241 -0.0006416 0.1251466 0.0006416 -0.0033277 0.1251466 0.0006416 -0.0067261 0.1251466 0.0006416 -0.0110255 0.1251466 0.0006416 -0.0164648 0.1251466 0.0006416 -0.0233461 0.1251466 0.0006416 -0.032052 0.1251466 0.0006416 -0.043066 0.1251466 0.0006416 -0.0570002 0.1251466 0.0006416 -0.0746288 0.1251466 0.0006416 -0.0969312 0.1251466 0.0006416 -0.1251466 0.1251466 0.0006416 -0.1608428 0.1251466 0.0006416 -0.2060032 0.1251466 0.0006416 -0.2631369 0.1251466 0.0006416 -0.3354185 0.1251466 0.0006416 -0.4268641 0.1251466 0.0006416 -0.5425548 0.1251466 0.0006416 -0.6889184 0.1251466 0.0006416 -0.8373283 0.1238179 0.0052028 -0.9020992 0.1258729 0.0275778 -0.9348949 0.1393548 0.0619473 -0.9542739 0.1648439 0.1054384 -0.9667827 0.2014528 0.1566936 -0.9753231 0.2478 0.2146085 -0.9813797 0.3021511 0.2779077 -0.9857916 0.3624621 0.3450175 -0.9890684 0.4264635 0.4140964 -0.9915376 0.4918065 0.4831666 -0.9934183 0.5562497 0.5502987 -0.9948628 0.6178426 0.6137984 -0.9959791 0.6750644 0.67235 -0.9968462 0.7268913 0.7250899 -0.9975222 0.7727896 0.7716061 -0.9980508 0.8126503 0.8118794 -0.998465 0.8466913 0.8461929 -0.9987903 0.8753518 0.8750317 -0.999046 0.8991969 0.8989923 -0.9992473 0.9188409 0.9187107 -0.9994059 0.9348934 0.9348109 -0.999531 0.9479248 0.9478726 -0.9996296 0.9584471 0.9584142 -0.9997074 0.9669069 0.9668862 -0.9997689 0.9736849 0.9736719 -0.9998174 0.9791004 0.9790923 -0.9998557 0.9834178 0.9834127 -0.999886 0.9868535 0.9868503 -0.9999099 0.9895839 0.9895819 -0.9999288 0.9917513 0.99175 -0.9999437 0.9934702 0.9934694 -0.0000238 0.1684036 0.0082023 -0.0000382 0.1679 0.0076988 -0.0000611 0.1672678 0.0070666 -0.0000978 0.1664757 0.0062744 -0.0001565 0.1654858 0.0052846 -0.0002504 0.1642532 0.004052 -0.0004008 0.1627254 0.0025241 -0.0006416 0.1608428 0.0006416 -0.0033277 0.1608428 0.0006416 -0.0067261 0.1608428 0.0006416 -0.0110255 0.1608428 0.0006416 -0.0164648 0.1608428 0.0006416 -0.0233461 0.1608428 0.0006416 -0.032052 0.1608428 0.0006416 -0.043066 0.1608428 0.0006416 -0.0570002 0.1608428 0.0006416 -0.0746288 0.1608428 0.0006416 -0.0969312 0.1608428 0.0006416 -0.1251466 0.1608428 0.0006416 -0.1608428 0.1608428 0.0006416 -0.2060032 0.1608428 0.0006416 -0.2631369 0.1608428 0.0006416 -0.3354185 0.1608428 0.0006416 -0.4268641 0.1608428 0.0006416 -0.5425548 0.1608428 0.0006416 -0.6889184 0.1608428 0.0006416 -0.8373283 0.1578254 0.0052028 -0.9020992 0.1540546 0.0275778 -0.9348949 0.1615479 0.0619473 -0.9542739 0.1818757 0.1054384 -0.9667827 0.2142855 0.1566936 -0.9753231 0.2573162 0.2146085 -0.9813797 0.3091018 0.2779077 -0.9857916 0.3674636 0.3450175 -0.9890684 0.4300092 0.4140964 -0.9915376 0.4942836 0.4831666 -0.9934183 0.5579558 0.5502987 -0.9948628 0.619002 0.6137984 -0.9959791 0.6758426 0.67235 -0.9968462 0.7274078 0.7250899 -0.9975222 0.7731289 0.7716061 -0.9980508 0.8128713 0.8118794 -0.998465 0.8468341 0.8461929 -0.9987903 0.8754436 0.8750317 -0.999046 0.8992555 0.8989923 -0.9992473 0.9188782 0.9187107 -0.9994059 0.934917 0.9348109 -0.999531 0.9479397 0.9478726 -0.9996296 0.9584565 0.9584142 -0.9997074 0.9669128 0.9668862 -0.9997689 0.9736886 0.9736719 -0.9998174 0.9791028 0.9790923 -0.9998557 0.9834192 0.9834127 -0.999886 0.9868545 0.9868503 -0.9999099 0.9895845 0.9895819 -0.9999288 0.9917516 0.99175 -0.9999437 0.9934705 0.9934694 -0.0000238 0.2135639 0.0082023 -0.0000382 0.2130604 0.0076988 -0.0000611 0.2124282 0.0070666 -0.0000978 0.2116361 0.0062744 -0.0001565 0.2106462 0.0052846 -0.0002504 0.2094136 0.004052 -0.0004008 0.2078857 0.0025241 -0.0006416 0.2060032 0.0006416 -0.0033277 0.2060032 0.0006416 -0.0067261 0.2060032 0.0006416 -0.0110255 0.2060032 0.0006416 -0.0164648 0.2060032 0.0006416 -0.0233461 0.2060032 0.0006416 -0.032052 0.2060032 0.0006416 -0.043066 0.2060032 0.0006416 -0.0570002 0.2060032 0.0006416 -0.0746288 0.2060032 0.0006416 -0.0969312 0.2060032 0.0006416 -0.1251466 0.2060032 0.0006416 -0.1608428 0.2060032 0.0006416 -0.2060032 0.2060032 0.0006416 -0.2631369 0.2060032 0.0006416 -0.3354185 0.2060032 0.0006416 -0.4268641 0.2060032 0.0006416 -0.5425548 0.2060032 0.0006416 -0.6889184 0.2060032 0.0006416 -0.8373283 0.2008493 0.0052028 -0.9020992 0.1897081 0.0275778 -0.9348949 0.189625 0.0619473 -0.9542739 0.2034232 0.1054384 -0.9667827 0.2305205 0.1566936 -0.9753231 0.2693554 0.2146085 -0.9813797 0.3178954 0.2779077 -0.9857916 0.3737911 0.3450175 -0.9890684 0.434495 0.4140964 -0.9915376 0.4974174 0.4831666 -0.9934183 0.5601144 0.5502987 -0.9948628 0.6204689 0.6137984 -0.9959791 0.6768271 0.67235 -0.9968462 0.7280611 0.7250899 -0.9975222 0.7735582 0.7716061 -0.9980508 0.8131509 0.8118794 -0.998465 0.8470149 0.8461929 -0.9987903 0.8755597 0.8750317 -0.999046 0.8993297 0.8989923 -0.9992473 0.9189254 0.9187107 -0.9994059 0.934947 0.9348109 -0.999531 0.9479586 0.9478726 -0.9996296 0.9584685 0.9584142 -0.9997074 0.9669203 0.9668862 -0.9997689 0.9736934 0.9736719 -0.9998174 0.9791057 0.9790923 -0.9998557 0.9834211 0.9834127 -0.999886 0.9868556 0.9868503 -0.9999099 0.9895852 0.9895819 -0.9999288 0.9917521 0.99175 -0.9999437 0.9934707 0.9934694 -0.0000238 0.2706977 0.0082023 -0.0000382 0.2701941 0.0076988 -0.0000611 0.2695619 0.0070666 -0.0000978 0.2687698 0.0062744 -0.0001565 0.2677799 0.0052846 -0.0002504 0.2665473 0.004052 -0.0004008 0.2650195 0.0025241 -0.0006416 0.2631369 0.0006416 -0.0033277 0.2631369 0.0006416 -0.0067261 0.2631369 0.0006416 -0.0110255 0.2631369 0.0006416 -0.0164648 0.2631369 0.0006416 -0.0233461 0.2631369 0.0006416 -0.032052 0.2631369 0.0006416 -0.043066 0.2631369 0.0006416 -0.0570002 0.2631369 0.0006416 -0.0746288 0.2631369 0.0006416 -0.0969312 0.2631369 0.0006416 -0.1251466 0.2631369 0.0006416 -0.1608428 0.2631369 0.0006416 -0.2060032 0.2631369 0.0006416 -0.2631369 0.2631369 0.0006416 -0.3354185 0.2631369 0.0006416 -0.4268641 0.2631369 0.0006416 -0.5425548 0.2631369 0.0006416 -0.6889184 0.2631369 0.0006416 -0.8373283 0.2552802 0.0052028 -0.9020992 0.2348144 0.0275778 -0.9348949 0.2251463 0.0619473 -0.9542739 0.2306836 0.1054384 -0.9667827 0.25106 0.1566936 -0.9753231 0.2845866 0.2146085 -0.9813797 0.3290204 0.2779077 -0.9857916 0.3817962 0.3450175 -0.9890684 0.4401701 0.4140964 -0.9915376 0.5013822 0.4831666 -0.9934183 0.5628452 0.5502987 -0.9948628 0.6223247 0.6137984 -0.9959791 0.6780727 0.67235 -0.9968462 0.7288878 0.7250899 -0.9975222 0.7741013 0.7716061 -0.9980508 0.8135046 0.8118794 -0.998465 0.8472436 0.8461929 -0.9987903 0.8757066 0.8750317 -0.999046 0.8994236 0.8989923 -0.9992473 0.9189851 0.9187107 -0.9994059 0.9349848 0.9348109 -0.999531 0.9479826 0.9478726 -0.9996296 0.9584835 0.9584142 -0.9997074 0.9669298 0.9668862 -0.9997689 0.9736993 0.9736719 -0.9998174 0.9791095 0.9790923 -0.9998557 0.9834234 0.9834127 -0.999886 0.9868571 0.9868503 -0.9999099 0.9895861 0.9895819 -0.9999288 0.9917527 0.99175 -0.9999437 0.9934711 0.9934694 -0.0000238 0.3429792 0.0082023 -0.0000382 0.3424757 0.0076988 -0.0000611 0.3418435 0.0070666 -0.0000978 0.3410514 0.0062744 -0.0001565 0.3400615 0.0052846 -0.0002504 0.3388289 0.004052 -0.0004008 0.337301 0.0025241 -0.0006416 0.3354185 0.0006416 -0.0033277 0.3354185 0.0006416 -0.0067261 0.3354185 0.0006416 -0.0110255 0.3354185 0.0006416 -0.0164648 0.3354185 0.0006416 -0.0233461 0.3354185 0.0006416 -0.032052 0.3354185 0.0006416 -0.043066 0.3354185 0.0006416 -0.0570002 0.3354185 0.0006416 -0.0746288 0.3354185 0.0006416 -0.0969312 0.3354185 0.0006416 -0.1251466 0.3354185 0.0006416 -0.1608428 0.3354185 0.0006416 -0.2060032 0.3354185 0.0006416 -0.2631369 0.3354185 0.0006416 -0.3354185 0.3354185 0.0006416 -0.4268641 0.3354185 0.0006416 -0.5425548 0.3354185 0.0006416 -0.6889184 0.3354185 0.0006416 -0.8373283 0.3241424 0.0052028 -0.9020992 0.2918798 0.0275778 -0.9348949 0.2700853 0.0619473 -0.9542739 0.2651716 0.1054384 -0.9667827 0.277045 0.1566936 -0.9753231 0.303856 0.2146085 -0.9813797 0.3430949 0.2779077 -0.9857916 0.3919237 0.3450175 -0.9890684 0.4473498 0.4140964 -0.9915376 0.506398 0.4831666 -0.9934183 0.5663 0.5502987 -0.9948628 0.6246726 0.6137984 -0.9959791 0.6796485 0.67235 -0.9968462 0.7299335 0.7250899 -0.9975222 0.7747884 0.7716061 -0.9980508 0.8139522 0.8118794 -0.998465 0.8475329 0.8461929 -0.9987903 0.8758925 0.8750317 -0.999046 0.8995424 0.8989923 -0.9992473 0.9190607 0.9187107 -0.9994059 0.9350327 0.9348109 -0.999531 0.9480128 0.9478726 -0.9996296 0.9585026 0.9584142 -0.9997074 0.9669419 0.9668862 -0.9997689 0.9737069 0.9736719 -0.9998174 0.9791142 0.9790923 -0.9998557 0.9834264 0.9834127 -0.999886 0.986859 0.9868503 -0.9999099 0.9895873 0.9895819 -0.9999288 0.9917534 0.99175 -0.9999437 0.9934716 0.9934694 -0.0000238 0.4344249 0.0082023 -0.0000382 0.4339214 0.0076988 -0.0000611 0.4332891 0.0070666 -0.0000978 0.432497 0.0062744 -0.0001565 0.4315072 0.0052846 -0.0002504 0.4302746 0.004052 -0.0004008 0.4287467 0.0025241 -0.0006416 0.4268641 0.0006416 -0.0033277 0.4268641 0.0006416 -0.0067261 0.4268641 0.0006416 -0.0110255 0.4268641 0.0006416 -0.0164648 0.4268641 0.0006416 -0.0233461 0.4268641 0.0006416 -0.032052 0.4268641 0.0006416 -0.043066 0.4268641 0.0006416 -0.0570002 0.4268641 0.0006416 -0.0746288 0.4268641 0.0006416 -0.0969312 0.4268641 0.0006416 -0.1251466 0.4268641 0.0006416 -0.1608428 0.4268641 0.0006416 -0.2060032 0.4268641 0.0006416 -0.2631369 0.4268641 0.0006416 -0.3354185 0.4268641 0.0006416 -0.4268641 0.4268641 0.0006416 -0.5425548 0.4268641 0.0006416 -0.6889184 0.4268641 0.0006416 -0.8373283 0.4112619 0.0052028 -0.9020992 0.3640749 0.0275778 -0.9348949 0.326939 0.0619473 -0.9542739 0.3088033 0.1054384 -0.9667827 0.3099195 0.1566936 -0.9753231 0.3282343 0.2146085 -0.9813797 0.3609011 0.2779077 -0.9857916 0.4047363 0.3450175 -0.9890684 0.4564331 0.4140964 -0.9915376 0.5127438 0.4831666 -0.9934183 0.5706708 0.5502987 -0.9948628 0.6276429 0.6137984 -0.9959791 0.6816421 0.67235 -0.9968462 0.7312566 0.7250899 -0.9975222 0.7756577 0.7716061 -0.9980508 0.8145183 0.8118794 -0.998465 0.8478989 0.8461929 -0.9987903 0.8761276 0.8750317 -0.999046 0.8996926 0.8989923 -0.9992473 0.9191562 0.9187107 -0.9994059 0.9350933 0.9348109 -0.999531 0.9480511 0.9478726 -0.9996296 0.9585268 0.9584142 -0.9997074 0.9669571 0.9668862 -0.9997689 0.9737164 0.9736719 -0.9998174 0.9791202 0.9790923 -0.9998557 0.9834302 0.9834127 -0.999886 0.9868613 0.9868503 -0.9999099 0.9895888 0.9895819 -0.9999288 0.9917543 0.99175 -0.9999437 0.9934721 0.9934694 -0.0000238 0.5501155 0.0082023 -0.0000382 0.549612 0.0076988 -0.0000611 0.5489798 0.0070666 -0.0000978 0.5481876 0.0062744 -0.0001565 0.5471978 0.0052846 -0.0002504 0.5459652 0.004052 -0.0004008 0.5444373 0.0025241 -0.0006416 0.5425548 0.0006416 -0.0033277 0.5425548 0.0006416 -0.0067261 0.5425548 0.0006416 -0.0110255 0.5425548 0.0006416 -0.0164648 0.5425548 0.0006416 -0.0233461 0.5425548 0.0006416 -0.032052 0.5425548 0.0006416 -0.043066 0.5425548 0.0006416 -0.0570002 0.5425548 0.0006416 -0.0746288 0.5425548 0.0006416 -0.0969312 0.5425548 0.0006416 -0.1251466 0.5425548 0.0006416 -0.1608428 0.5425548 0.0006416 -0.2060032 0.5425548 0.0006416 -0.2631369 0.5425548 0.0006416 -0.3354185 0.5425548 0.0006416 -0.4268641 0.5425548 0.0006416 -0.5425548 0.5425548 0.0006416 -0.6889184 0.5425548 0.0006416 -0.8373283 0.5214795 0.0052028 -0.9020992 0.455411 0.0275778 -0.9348949 0.3988663 0.0619473 -0.9542739 0.3640031 0.1054384 -0.9667827 0.3515099 0.1566936 -0.9753231 0.359076 0.2146085 -0.9813797 0.3834282 0.2779077 -0.9857916 0.420946 0.3450175 -0.9890684 0.4679246 0.4140964 -0.9915376 0.520772 0.4831666 -0.9934183 0.5762005 0.5502987 -0.9948628 0.6314008 0.6137984 -0.9959791 0.6841643 0.67235 -0.9968462 0.7329304 0.7250899 -0.9975222 0.7767575 0.7716061 -0.9980508 0.8152346 0.8118794 -0.998465 0.8483619 0.8461929 -0.9987903 0.876425 0.8750317 -0.999046 0.8998827 0.8989923 -0.9992473 0.9192772 0.9187107 -0.9994059 0.93517 0.9348109 -0.999531 0.9480996 0.9478726 -0.9996296 0.9585574 0.9584142 -0.9997074 0.9669763 0.9668862 -0.9997689 0.9737285 0.9736719 -0.9998174 0.9791278 0.9790923 -0.9998557 0.9834349 0.9834127 -0.999886 0.9868643 0.9868503 -0.9999099 0.9895906 0.9895819 -0.9999288 0.9917555 0.99175 -0.9999437 0.9934729 0.9934694 -0.0000238 0.6964791 0.0082023 -0.0000382 0.6959756 0.0076988 -0.0000611 0.6953434 0.0070666 -0.0000978 0.6945513 0.0062744 -0.0001565 0.6935614 0.0052846 -0.0002504 0.6923288 0.004052 -0.0004008 0.6908009 0.0025241 -0.0006416 0.6889184 0.0006416 -0.0033277 0.6889184 0.0006416 -0.0067261 0.6889184 0.0006416 -0.0110255 0.6889184 0.0006416 -0.0164648 0.6889184 0.0006416 -0.0233461 0.6889184 0.0006416 -0.032052 0.6889184 0.0006416 -0.043066 0.6889184 0.0006416 -0.0570002 0.6889184 0.0006416 -0.0746288 0.6889184 0.0006416 -0.0969312 0.6889184 0.0006416 -0.1251466 0.6889184 0.0006416 -0.1608428 0.6889184 0.0006416 -0.2060032 0.6889184 0.0006416 -0.2631369 0.6889184 0.0006416 -0.3354185 0.6889184 0.0006416 -0.4268641 0.6889184 0.0006416 -0.5425548 0.6889184 0.0006416 -0.6889184 0.6889184 0.0006416 -0.8373283 0.6609191 0.0052028 -0.9020992 0.5709632 0.0275778 -0.9348949 0.4898637 0.0619473 -0.9542739 0.4338381 0.1054384 -0.9667827 0.4041273 0.1566936 -0.9753231 0.3980948 0.2146085 -0.9813797 0.4119279 0.2779077 -0.9857916 0.4414533 0.3450175 -0.9890684 0.4824629 0.4140964 -0.9915376 0.5309287 0.4831666 -0.9934183 0.5831962 0.5502987 -0.9948628 0.6361549 0.6137984 -0.9959791 0.6873552 0.67235 -0.9968462 0.735048 0.7250899 -0.9975222 0.7781488 0.7716061 -0.9980508 0.8161408 0.8118794 -0.998465 0.8489478 0.8461929 -0.9987903 0.8768014 0.8750317 -0.999046 0.9001231 0.8989923 -0.9992473 0.9194302 0.9187107 -0.9994059 0.935267 0.9348109 -0.999531 0.9481609 0.9478726 -0.9996296 0.958596 0.9584142 -0.9997074 0.9670006 0.9668862 -0.9997689 0.9737438 0.9736719 -0.9998174 0.9791374 0.9790923 -0.9998557 0.983441 0.9834127 -0.999886 0.9868681 0.9868503 -0.9999099 0.989593 0.9895819 -0.9999288 0.991757 0.99175 -0.9999437 0.9934738 0.9934694 -0.0051514 0.8407292 0.0129027 -0.0051286 0.8405071 0.0123916 -0.0051047 0.8402274 0.0117495 -0.0050826 0.8398756 0.0109445 -0.0050676 0.8394338 0.0099377 -0.0050694 0.8388802 0.0086827 -0.0051048 0.8381886 0.007125 -0.0052028 0.8373283 0.0052028 -0.0077619 0.8373283 0.0052028 -0.0109995 0.8373283 0.0052028 -0.0150955 0.8373283 0.0052028 -0.0202775 0.8373283 0.0052028 -0.0268333 0.8373283 0.0052028 -0.0351273 0.8373283 0.0052028 -0.0456203 0.8373283 0.0052028 -0.0588953 0.8373283 0.0052028 -0.0756899 0.8373283 0.0052028 -0.0969372 0.8373283 0.0052028 -0.1238179 0.8373283 0.0052028 -0.1578254 0.8373283 0.0052028 -0.2008493 0.8373283 0.0052028 -0.2552802 0.8373283 0.0052028 -0.3241424 0.8373283 0.0052028 -0.4112619 0.8373283 0.0052028 -0.5214795 0.8373283 0.0052028 -0.6609191 0.8373283 0.0052028 -0.8373283 0.8373283 0.0052028 -0.9020992 0.7171517 0.0275778 -0.9348949 0.6049872 0.0619473 -0.9542739 0.5221884 0.1054384 -0.9667827 0.4706951 0.1566936 -0.9753231 0.4474586 0.2146085 -0.9813797 0.4479838 0.2779077 -0.9857916 0.4673977 0.3450175 -0.9890684 0.5008557 0.4140964 -0.9915376 0.5437782 0.4831666 -0.9934183 0.5920467 0.5502987 -0.9948628 0.6421696 0.6137984 -0.9959791 0.691392 0.67235 -0.9968462 0.7377271 0.7250899 -0.9975222 0.779909 0.7716061 -0.9980508 0.8172873 0.8118794 -0.998465 0.8496889 0.8461929 -0.9987903 0.8772775 0.8750317 -0.999046 0.9004274 0.8989923 -0.9992473 0.9196237 0.9187107 -0.9994059 0.9353897 0.9348109 -0.999531 0.9482385 0.9478726 -0.9996296 0.9586449 0.9584142 -0.9997074 0.9670314 0.9668862 -0.9997689 0.9737632 0.9736719 -0.9998174 0.9791496 0.9790923 -0.9998557 0.9834486 0.9834127 -0.999886 0.9868728 0.9868503 -0.9999099 0.989596 0.9895819 -0.9999288 0.9917588 0.99175 -0.9999437 0.993475 0.9934694 -0.0279321 0.9033413 0.0343481 -0.0278872 0.9032596 0.0338994 -0.0278347 0.9031567 0.0333357 -0.0277752 0.9030276 0.0326286 -0.0277111 0.9028657 0.0317439 -0.0276479 0.9026634 0.0306405 -0.0275966 0.9024114 0.0292702 -0.0275778 0.9020992 0.0275778 -0.0296985 0.9020992 0.0275778 -0.0323815 0.9020992 0.0275778 -0.0357758 0.9020992 0.0275778 -0.04007 0.9020992 0.0275778 -0.0455028 0.9020992 0.0275778 -0.052376 0.9020992 0.0275778 -0.0610714 0.9020992 0.0275778 -0.0720722 0.9020992 0.0275778 -0.0859897 0.9020992 0.0275778 -0.1035972 0.9020992 0.0275778 -0.1258729 0.9020992 0.0275778 -0.1540546 0.9020992 0.0275778 -0.1897081 0.9020992 0.0275778 -0.2348144 0.9020992 0.0275778 -0.2918798 0.9020992 0.0275778 -0.3640749 0.9020992 0.0275778 -0.455411 0.9020992 0.0275778 -0.5709632 0.9020992 0.0275778 -0.7171517 0.9020992 0.0275778 -0.9020992 0.9020992 0.0275778 -0.9348949 0.7506335 0.0619473 -0.9542739 0.6339631 0.1054384 -0.9667827 0.554912 0.1566936 -0.9753231 0.5099103 0.2146085 -0.9813797 0.4935991 0.2779077 -0.9857916 0.5002207 0.3450175 -0.9890684 0.5241251 0.4140964 -0.9915376 0.5600346 0.4831666 -0.9934183 0.6032437 0.5502987 -0.9948628 0.6497789 0.6137984 -0.9959791 0.6964992 0.67235 -0.9968462 0.7411164 0.7250899 -0.9975222 0.7821359 0.7716061 -0.9980508 0.8187377 0.8118794 -0.998465 0.8506265 0.8461929 -0.9987903 0.8778798 0.8750317 -0.999046 0.9008122 0.8989923 -0.9992473 0.9198686 0.9187107 -0.9994059 0.9355449 0.9348109 -0.999531 0.9483366 0.9478726 -0.9996296 0.9587068 0.9584142 -0.9997074 0.9670704 0.9668862 -0.9997689 0.9737877 0.9736719 -0.9998174 0.9791649 0.9790923 -0.9998557 0.9834582 0.9834127 -0.999886 0.9868789 0.9868503 -0.9999099 0.9895998 0.9895819 -0.9999288 0.9917612 0.99175 -0.9999437 0.9934764 0.9934694 -0.0624569 0.9354466 0.0675125 -0.0624063 0.9354101 0.0671435 -0.0623458 0.9353643 0.0666799 -0.0622749 0.9353068 0.0660986 -0.0621943 0.9352348 0.0653712 -0.0621069 0.9351449 0.0644643 -0.0620199 0.9350332 0.063338 -0.0619473 0.9348949 0.0619473 -0.0636174 0.9348949 0.0619473 -0.0657302 0.9348949 0.0619473 -0.0684033 0.9348949 0.0619473 -0.071785 0.9348949 0.0619473 -0.0760633 0.9348949 0.0619473 -0.0814759 0.9348949 0.0619473 -0.0883235 0.9348949 0.0619473 -0.0969867 0.9348949 0.0619473 -0.1079468 0.9348949 0.0619473 -0.1218126 0.9348949 0.0619473 -0.1393548 0.9348949 0.0619473 -0.1615479 0.9348949 0.0619473 -0.189625 0.9348949 0.0619473 -0.2251463 0.9348949 0.0619473 -0.2700853 0.9348949 0.0619473 -0.326939 0.9348949 0.0619473 -0.3988663 0.9348949 0.0619473 -0.4898637 0.9348949 0.0619473 -0.6049872 0.9348949 0.0619473 -0.7506335 0.9348949 0.0619473 -0.9348949 0.9348949 0.0619473 -0.9542739 0.7753725 0.1054384 -0.9667827 0.6614574 0.1566936 -0.9753231 0.5889198 0.2146085 -0.9813797 0.5513085 0.2779077 -0.9857916 0.5417461 0.3450175 -0.9890684 0.5535638 0.4140964 -0.9915376 0.580601 0.4831666 -0.9934183 0.6174094 0.5502987 -0.9948628 0.6594057 0.6137984 -0.9959791 0.7029605 0.67235 -0.9968462 0.7454044 0.7250899 -0.9975222 0.7849532 0.7716061 -0.9980508 0.8205726 0.8118794 -0.998465 0.8518127 0.8461929 -0.9987903 0.8786418 0.8750317 -0.999046 0.9012992 0.8989923 -0.9992473 0.9201784 0.9187107 -0.9994059 0.9357413 0.9348109 -0.999531 0.9484607 0.9478726 -0.9996296 0.9587851 0.9584142 -0.9997074 0.9671197 0.9668862 -0.9997689 0.9738186 0.9736719 -0.9998174 0.9791844 0.9790923 -0.9998557 0.9834704 0.9834127 -0.999886 0.9868865 0.9868503 -0.9999099 0.9896046 0.9895819 -0.9999288 0.9917642 0.99175 -0.9999437 0.9934783 0.9934694 -0.1059991 0.9545467 0.1098821 -0.1059489 0.9545286 0.1095873 -0.1058883 0.9545059 0.1092169 -0.1058162 0.9544774 0.1087525 -0.1057322 0.9544418 0.1081716 -0.1056375 0.9543974 0.1074473 -0.1055364 0.9543421 0.1065482 -0.1054384 0.9542739 0.1054384 -0.10672 0.9542739 0.1054384 -0.1083415 0.9542739 0.1054384 -0.1103929 0.9542739 0.1054384 -0.1129881 0.9542739 0.1054384 -0.1162715 0.9542739 0.1054384 -0.1204253 0.9542739 0.1054384 -0.1256805 0.9542739 0.1054384 -0.1323289 0.9542739 0.1054384 -0.1407401 0.9542739 0.1054384 -0.1513813 0.9542739 0.1054384 -0.1648439 0.9542739 0.1054384 -0.1818757 0.9542739 0.1054384 -0.2034232 0.9542739 0.1054384 -0.2306836 0.9542739 0.1054384 -0.2651716 0.9542739 0.1054384 -0.3088033 0.9542739 0.1054384 -0.3640031 0.9542739 0.1054384 -0.4338381 0.9542739 0.1054384 -0.5221884 0.9542739 0.1054384 -0.6339631 0.9542739 0.1054384 -0.7753725 0.9542739 0.1054384 -0.9542739 0.9542739 0.1054384 -0.9667827 0.7962511 0.1566936 -0.9753231 0.6888771 0.2146085 -0.9813797 0.6243183 0.2779077 -0.9857916 0.5942812 0.3450175 -0.9890684 0.5908076 0.4140964 -0.9915376 0.6066202 0.4831666 -0.9934183 0.6353308 0.5502987 -0.9948628 0.6715848 0.6137984 -0.9959791 0.7111348 0.67235 -0.9968462 0.7508292 0.7250899 -0.9975222 0.7885175 0.7716061 -0.9980508 0.8228941 0.8118794 -0.998465 0.8533135 0.8461929 -0.9987903 0.8796058 0.8750317 -0.999046 0.9019152 0.8989923 -0.9992473 0.9205703 0.9187107 -0.9994059 0.9359898 0.9348109 -0.999531 0.9486178 0.9478726 -0.9996296 0.9588842 0.9584142 -0.9997074 0.967182 0.9668862 -0.9997689 0.9738578 0.9736719 -0.9998174 0.979209 0.9790923 -0.9998557 0.9834858 0.9834127 -0.999886 0.9868962 0.9868503 -0.9999099 0.9896106 0.9895819 -0.9999288 0.991768 0.99175 -0.9999437 0.9934807 0.9934694 -0.1572498 0.9669269 0.1601778 -0.1572031 0.9669173 0.1599465 -0.1571463 0.9669053 0.1596559 -0.1570779 0.9668902 0.1592916 -0.1569971 0.9668714 0.158836 -0.156904 0.9668479 0.1582681 -0.1568008 0.9668187 0.1575633 -0.1566936 0.9667827 0.1566936 -0.1576592 0.9667827 0.1566936 -0.1588809 0.9667827 0.1566936 -0.1604266 0.9667827 0.1566936 -0.162382 0.9667827 0.1566936 -0.1648558 0.9667827 0.1566936 -0.1679855 0.9667827 0.1566936 -0.1719451 0.9667827 0.1566936 -0.1769544 0.9667827 0.1566936 -0.1832918 0.9667827 0.1566936 -0.1913094 0.9667827 0.1566936 -0.2014528 0.9667827 0.1566936 -0.2142855 0.9667827 0.1566936 -0.2305205 0.9667827 0.1566936 -0.25106 0.9667827 0.1566936 -0.277045 0.9667827 0.1566936 -0.3099195 0.9667827 0.1566936 -0.3515099 0.9667827 0.1566936 -0.4041273 0.9667827 0.1566936 -0.4706951 0.9667827 0.1566936 -0.554912 0.9667827 0.1566936 -0.6614574 0.9667827 0.1566936 -0.7962511 0.9667827 0.1566936 -0.9667827 0.9667827 0.1566936 -0.9753231 0.815336 0.2146085 -0.9813797 0.7166853 0.2779077 -0.9857916 0.6607448 0.3450175 -0.9890684 0.6379259 0.4140964 -0.9915376 0.6395378 0.4831666 -0.9934183 0.6580038 0.5502987 -0.9948628 0.6869929 0.6137984 -0.9959791 0.7214763 0.67235 -0.9968462 0.7576923 0.7250899 -0.9975222 0.7930267 0.7716061 -0.9980508 0.825831 0.8118794 -0.998465 0.8552121 0.8461929 -0.9987903 0.8808255 0.8750317 -0.999046 0.9026946 0.8989923 -0.9992473 0.9210662 0.9187107 -0.9994059 0.9363041 0.9348109 -0.999531 0.9488165 0.9478726 -0.9996296 0.9590095 0.9584142 -0.9997074 0.9672609 0.9668862 -0.9997689 0.9739074 0.9736719 -0.9998174 0.9792401 0.9790923 -0.9998557 0.9835053 0.9834127 -0.999886 0.9869084 0.9868503 -0.9999099 0.9896183 0.9895819 -0.9999288 0.9917728 0.99175 -0.9999437 0.9934837 0.9934694 -0.2151269 0.9754027 0.2172997 -0.2150852 0.9753975 0.2171209 -0.2150342 0.9753908 0.2168964 -0.2149725 0.9753825 0.2166149 -0.2148987 0.9753721 0.2162629 -0.2148124 0.9753591 0.2158242 -0.2147144 0.975343 0.2152799 -0.2146085 0.9753231 0.2146085 -0.2153246 0.9753231 0.2146085 -0.2162305 0.9753231 0.2146085 -0.2173767 0.9753231 0.2146085 -0.2188268 0.9753231 0.2146085 -0.2206612 0.9753231 0.2146085 -0.2229821 0.9753231 0.2146085 -0.2259183 0.9753231 0.2146085 -0.229633 0.9753231 0.2146085 -0.2343326 0.9753231 0.2146085 -0.2402781 0.9753231 0.2146085 -0.2478 0.9753231 0.2146085 -0.2573162 0.9753231 0.2146085 -0.2693554 0.9753231 0.2146085 -0.2845866 0.9753231 0.2146085 -0.303856 0.9753231 0.2146085 -0.3282343 0.9753231 0.2146085 -0.359076 0.9753231 0.2146085 -0.3980948 0.9753231 0.2146085 -0.4474586 0.9753231 0.2146085 -0.5099103 0.9753231 0.2146085 -0.5889198 0.9753231 0.2146085 -0.6888771 0.9753231 0.2146085 -0.815336 0.9753231 0.2146085 -0.9753231 0.9753231 0.2146085 -0.9813797 0.8335415 0.2779077 -0.9857916 0.74483 0.3450175 -0.9890684 0.6975366 0.4140964 -0.9915376 0.6811829 0.4831666 -0.9934183 0.686688 0.5502987 -0.9948628 0.7064863 0.6137984 -0.9959791 0.7345598 0.67235 -0.9968462 0.766375 0.7250899 -0.9975222 0.7987315 0.7716061 -0.9980508 0.8295466 0.8118794 -0.998465 0.8576141 0.8461929 -0.9987903 0.8823685 0.8750317 -0.999046 0.9036806 0.8989923 -0.9992473 0.9216935 0.9187107 -0.9994059 0.9367018 0.9348109 -0.999531 0.9490679 0.9478726 -0.9996296 0.959168 0.9584142 -0.9997074 0.9673607 0.9668862 -0.9997689 0.9739701 0.9736719 -0.9998174 0.9792795 0.9790923 -0.9998557 0.98353 0.9834127 -0.999886 0.9869239 0.9868503 -0.9999099 0.989628 0.9895819 -0.9999288 0.9917789 0.99175 -0.9999437 0.9934875 0.9934694 -0.2783684 0.9814251 0.2799564 -0.2783325 0.9814221 0.2798202 -0.2782884 0.9814183 0.2796492 -0.2782347 0.9814136 0.2794349 -0.2781701 0.9814076 0.2791669 -0.2780936 0.9814002 0.2788329 -0.2780055 0.9813911 0.2784186 -0.2779077 0.9813797 0.2779077 -0.2784307 0.9813797 0.2779077 -0.2790924 0.9813797 0.2779077 -0.2799296 0.9813797 0.2779077 -0.2809887 0.9813797 0.2779077 -0.2823287 0.9813797 0.2779077 -0.2840238 0.9813797 0.2779077 -0.2861685 0.9813797 0.2779077 -0.2888817 0.9813797 0.2779077 -0.2923143 0.9813797 0.2779077 -0.296657 0.9813797 0.2779077 -0.3021511 0.9813797 0.2779077 -0.3091018 0.9813797 0.2779077 -0.3178954 0.9813797 0.2779077 -0.3290204 0.9813797 0.2779077 -0.3430949 0.9813797 0.2779077 -0.3609011 0.9813797 0.2779077 -0.3834282 0.9813797 0.2779077 -0.4119279 0.9813797 0.2779077 -0.4479838 0.9813797 0.2779077 -0.4935991 0.9813797 0.2779077 -0.5513085 0.9813797 0.2779077 -0.6243183 0.9813797 0.2779077 -0.7166853 0.9813797 0.2779077 -0.8335415 0.9813797 0.2779077 -0.9813797 0.9813797 0.2779077 -0.9857916 0.8512087 0.3450175 -0.9890684 0.7729519 0.4140964 -0.9915376 0.7338694 0.4831666 -0.9934183 0.7229773 0.5502987 -0.9948628 0.7311479 0.6137984 -0.9959791 0.751112 0.67235 -0.9968462 0.7773598 0.7250899 -0.9975222 0.8059488 0.7716061 -0.9980508 0.8342474 0.8118794 -0.998465 0.8606529 0.8461929 -0.9987903 0.8843206 0.8750317 -0.999046 0.904928 0.8989923 -0.9992473 0.9224871 0.9187107 -0.9994059 0.9372049 0.9348109 -0.999531 0.9493859 0.9478726 -0.9996296 0.9593686 0.9584142 -0.9997074 0.9674869 0.9668862 -0.9997689 0.9740494 0.9736719 -0.9998174 0.9793293 0.9790923 -0.9998557 0.9835613 0.9834127 -0.999886 0.9869435 0.9868503 -0.9999099 0.9896402 0.9895819 -0.9999288 0.9917865 0.99175 -0.9999437 0.9934923 0.9934694 -0.3454107 0.9858181 0.3465539 -0.3453807 0.9858163 0.3464517 -0.3453439 0.9858141 0.3463234 -0.3452987 0.9858113 0.3461627 -0.3452442 0.9858079 0.3459616 -0.3451791 0.9858036 0.3457112 -0.3451032 0.9857982 0.3454005 -0.3450175 0.9857916 0.3450175 -0.3453938 0.9857916 0.3450175 -0.34587 0.9857916 0.3450175 -0.3464724 0.9857916 0.3450175 -0.3472345 0.9857916 0.3450175 -0.3481986 0.9857916 0.3450175 -0.3494184 0.9857916 0.3450175 -0.3509616 0.9857916 0.3450175 -0.352914 0.9857916 0.3450175 -0.355384 0.9857916 0.3450175 -0.3585088 0.9857916 0.3450175 -0.3624621 0.9857916 0.3450175 -0.3674636 0.9857916 0.3450175 -0.3737911 0.9857916 0.3450175 -0.3817962 0.9857916 0.3450175 -0.3919237 0.9857916 0.3450175 -0.4047363 0.9857916 0.3450175 -0.420946 0.9857916 0.3450175 -0.4414533 0.9857916 0.3450175 -0.4673977 0.9857916 0.3450175 -0.5002207 0.9857916 0.3450175 -0.5417461 0.9857916 0.3450175 -0.5942812 0.9857916 0.3450175 -0.6607448 0.9857916 0.3450175 -0.74483 0.9857916 0.3450175 -0.8512087 0.9857916 0.3450175 -0.9857916 0.9857916 0.3450175 -0.9890684 0.8683621 0.4140964 -0.9915376 0.8005247 0.4831666 -0.9934183 0.7688879 0.5502987 -0.9948628 0.762348 0.6137984 -0.9959791 0.7720527 0.67235 -0.9968462 0.791257 0.7250899 -0.9975222 0.8150796 0.7716061 -0.9980508 0.8401944 0.8118794 -0.998465 0.8644975 0.8461929 -0.9987903 0.8867903 0.8750317 -0.999046 0.9065061 0.8989923 -0.9992473 0.9234912 0.9187107 -0.9994059 0.9378415 0.9348109 -0.999531 0.9497883 0.9478726 -0.9996296 0.9596223 0.9584142 -0.9997074 0.9676466 0.9668862 -0.9997689 0.9741498 0.9736719 -0.9998174 0.9793923 0.9790923 -0.9998557 0.9836008 0.9834127 -0.999886 0.9869682 0.9868503 -0.9999099 0.9896557 0.9895819 -0.9999288 0.9917962 0.99175 -0.9999437 0.9934984 0.9934694 -0.4144197 0.9890841 0.4152305 -0.4143955 0.9890831 0.4151551 -0.4143657 0.9890818 0.4150604 -0.414329 0.9890801 0.4149417 -0.4142845 0.9890781 0.4147933 -0.4142311 0.9890755 0.4146084 -0.4141683 0.9890723 0.4143791 -0.4140964 0.9890684 0.4140964 -0.4143632 0.9890684 0.4140964 -0.4147008 0.9890684 0.4140964 -0.4151278 0.9890684 0.4140964 -0.4156681 0.9890684 0.4140964 -0.4163517 0.9890684 0.4140964 -0.4172164 0.9890684 0.4140964 -0.4183104 0.9890684 0.4140964 -0.4196945 0.9890684 0.4140964 -0.4214456 0.9890684 0.4140964 -0.4236608 0.9890684 0.4140964 -0.4264635 0.9890684 0.4140964 -0.4300092 0.9890684 0.4140964 -0.434495 0.9890684 0.4140964 -0.4401701 0.9890684 0.4140964 -0.4473498 0.9890684 0.4140964 -0.4564331 0.9890684 0.4140964 -0.4679246 0.9890684 0.4140964 -0.4824629 0.9890684 0.4140964 -0.5008557 0.9890684 0.4140964 -0.5241251 0.9890684 0.4140964 -0.5535638 0.9890684 0.4140964 -0.5908076 0.9890684 0.4140964 -0.6379259 0.9890684 0.4140964 -0.6975366 0.9890684 0.4140964 -0.7729519 0.9890684 0.4140964 -0.8683621 0.9890684 0.4140964 -0.9890684 0.9890684 0.4140964 -0.9915376 0.8848522 0.4831666 -0.9934183 0.8269709 0.5502987 -0.9948628 0.8018202 0.6137984 -0.9959791 0.7985455 0.67235 -0.9968462 0.8088387 0.7250899 -0.9975222 0.8266313 0.7716061 -0.9980508 0.8477182 0.8118794 -0.998465 0.8693613 0.8461929 -0.9987903 0.8899147 0.8750317 -0.999046 0.9085026 0.8989923 -0.9992473 0.9247614 0.9187107 -0.9994059 0.9386467 0.9348109 -0.999531 0.9502973 0.9478726 -0.9996296 0.9599433 0.9584142 -0.9997074 0.9678487 0.9668862 -0.9997689 0.9742768 0.9736719 -0.9998174 0.979472 0.9790923 -0.9998557 0.9836508 0.9834127 -0.999886 0.9869995 0.9868503 -0.9999099 0.9896753 0.9895819 -0.9999288 0.9918085 0.99175 -0.9999437 0.993506 0.9934694 -0.4834235 0.9915469 0.4839901 -0.4834045 0.9915463 0.4839353 -0.4833811 0.9915455 0.4838665 -0.4833522 0.9915446 0.4837803 -0.4833171 0.9915433 0.4836726 -0.4832747 0.9915418 0.4835383 -0.4832246 0.9915399 0.4833719 -0.4831666 0.9915376 0.4831666 -0.483353 0.9915376 0.4831666 -0.4835889 0.9915376 0.4831666 -0.4838872 0.9915376 0.4831666 -0.4842647 0.9915376 0.4831666 -0.4847422 0.9915376 0.4831666 -0.4853463 0.9915376 0.4831666 -0.4861106 0.9915376 0.4831666 -0.4870776 0.9915376 0.4831666 -0.4883009 0.9915376 0.4831666 -0.4898485 0.9915376 0.4831666 -0.4918065 0.9915376 0.4831666 -0.4942836 0.9915376 0.4831666 -0.4974174 0.9915376 0.4831666 -0.5013822 0.9915376 0.4831666 -0.506398 0.9915376 0.4831666 -0.5127438 0.9915376 0.4831666 -0.520772 0.9915376 0.4831666 -0.5309287 0.9915376 0.4831666 -0.5437782 0.9915376 0.4831666 -0.5600346 0.9915376 0.4831666 -0.580601 0.9915376 0.4831666 -0.6066202 0.9915376 0.4831666 -0.6395378 0.9915376 0.4831666 -0.6811829 0.9915376 0.4831666 -0.7338694 0.9915376 0.4831666 -0.8005247 0.9915376 0.4831666 -0.8848522 0.9915376 0.4831666 -0.9915376 0.9915376 0.4831666 -0.9934183 0.9004534 0.5502987 -0.9948628 0.8517577 0.6137984 -0.9959791 0.8320622 0.67235 -0.9968462 0.8310819 0.7250899 -0.9975222 0.8412457 0.7716061 -0.9980508 0.8572368 0.8118794 -0.998465 0.8755147 0.8461929 -0.9987903 0.8938676 0.8750317 -0.999046 0.9110285 0.8989923 -0.9992473 0.9263684 0.9187107 -0.9994059 0.9396655 0.9348109 -0.999531 0.9509413 0.9478726 -0.9996296 0.9603494 0.9584142 -0.9997074 0.9681043 0.9668862 -0.9997689 0.9744375 0.9736719 -0.9998174 0.9795728 0.9790923 -0.9998557 0.983714 0.9834127 -0.999886 0.9870392 0.9868503 -0.9999099 0.9897002 0.9895819 -0.9999288 0.9918241 0.99175 -0.9999437 0.9935158 0.9934694 -0.5504963 0.993424 0.5508867 -0.5504818 0.9934236 0.5508475 -0.550464 0.9934231 0.5507984 -0.5504419 0.9934225 0.5507369 -0.550415 0.9934218 0.5506599 -0.5503825 0.9934209 0.5505641 -0.5503438 0.9934197 0.5504452 -0.5502987 0.9934183 0.5502987 -0.5504271 0.9934183 0.5502987 -0.5505896 0.9934183 0.5502987 -0.5507951 0.9934183 0.5502987 -0.551055 0.9934183 0.5502987 -0.5513839 0.9934183 0.5502987 -0.5518001 0.9934183 0.5502987 -0.5523265 0.9934183 0.5502987 -0.5529925 0.9934183 0.5502987 -0.5538351 0.9934183 0.5502987 -0.5549011 0.9934183 0.5502987 -0.5562497 0.9934183 0.5502987 -0.5579558 0.9934183 0.5502987 -0.5601144 0.9934183 0.5502987 -0.5628452 0.9934183 0.5502987 -0.5663 0.9934183 0.5502987 -0.5706708 0.9934183 0.5502987 -0.5762005 0.9934183 0.5502987 -0.5831962 0.9934183 0.5502987 -0.5920467 0.9934183 0.5502987 -0.6032437 0.9934183 0.5502987 -0.6174094 0.9934183 0.5502987 -0.6353308 0.9934183 0.5502987 -0.6580038 0.9934183 0.5502987 -0.686688 0.9934183 0.5502987 -0.7229773 0.9934183 0.5502987 -0.7688879 0.9934183 0.5502987 -0.8269709 0.9934183 0.5502987 -0.9004534 0.9934183 0.5502987 -0.9934183 0.9934183 0.5502987 -0.9948628 0.9149351 0.6137984 -0.9959791 0.8744653 0.67235 -0.9968462 0.8592224 0.7250899 -0.9975222 0.8597348 0.7716061 -0.9980508 0.869279 0.8118794 -0.998465 0.8832995 0.8461929 -0.9987903 0.8988684 0.8750317 -0.999046 0.9142241 0.8989923 -0.9992473 0.9284015 0.9187107 -0.9994059 0.9409544 0.9348109 -0.999531 0.951756 0.9478726 -0.9996296 0.9608632 0.9584142 -0.9997074 0.9684277 0.9668862 -0.9997689 0.9746407 0.9736719 -0.9998174 0.9797004 0.9790923 -0.9998557 0.983794 0.9834127 -0.999886 0.9870893 0.9868503 -0.9999099 0.9897316 0.9895819 -0.9999288 0.9918437 0.99175 -0.9999437 0.9935281 0.9934694 -0.6139459 0.9948662 0.6142112 -0.6139352 0.994866 0.6141838 -0.6139219 0.9948657 0.6141493 -0.6139056 0.9948653 0.614106 -0.6138855 0.9948649 0.614052 -0.6138613 0.9948643 0.6139847 -0.6138323 0.9948636 0.6139012 -0.6137984 0.9948628 0.6137984 -0.6138856 0.9948628 0.6137984 -0.613996 0.9948628 0.6137984 -0.6141357 0.9948628 0.6137984 -0.6143124 0.9948628 0.6137984 -0.6145359 0.9948628 0.6137984 -0.6148187 0.9948628 0.6137984 -0.6151764 0.9948628 0.6137984 -0.615629 0.9948628 0.6137984 -0.6162016 0.9948628 0.6137984 -0.6169261 0.9948628 0.6137984 -0.6178426 0.9948628 0.6137984 -0.619002 0.9948628 0.6137984 -0.6204689 0.9948628 0.6137984 -0.6223247 0.9948628 0.6137984 -0.6246726 0.9948628 0.6137984 -0.6276429 0.9948628 0.6137984 -0.6314008 0.9948628 0.6137984 -0.6361549 0.9948628 0.6137984 -0.6421696 0.9948628 0.6137984 -0.6497789 0.9948628 0.6137984 -0.6594057 0.9948628 0.6137984 -0.6715848 0.9948628 0.6137984 -0.6869929 0.9948628 0.6137984 -0.7064863 0.9948628 0.6137984 -0.7311479 0.9948628 0.6137984 -0.762348 0.9948628 0.6137984 -0.8018202 0.9948628 0.6137984 -0.8517577 0.9948628 0.6137984 -0.9149351 0.9948628 0.6137984 -0.9948628 0.9948628 0.6137984 -0.9959791 0.9281107 0.67235 -0.9968462 0.8948238 0.7250899 -0.9975222 0.8831259 0.7716061 -0.9980508 0.884514 0.8118794 -0.998465 0.8931483 0.8461929 -0.9987903 0.9051951 0.8750317 -0.999046 0.9182669 0.8989923 -0.9992473 0.9309736 0.9187107 -0.9994059 0.942585 0.9348109 -0.999531 0.9527868 0.9478726 -0.9996296 0.9615132 0.9584142 -0.9997074 0.9688368 0.9668862 -0.9997689 0.9748979 0.9736719 -0.9998174 0.9798618 0.9790923 -0.9998557 0.9838953 0.9834127 -0.999886 0.9871527 0.9868503 -0.9999099 0.9897713 0.9895819 -0.9999288 0.9918686 0.99175 -0.9999437 0.9935436 0.9934694 -0.6724572 0.9959813 0.6726353 -0.6724495 0.9959811 0.6726163 -0.6724399 0.9959809 0.6725925 -0.672428 0.9959807 0.6725626 -0.6724135 0.9959804 0.6725253 -0.6723959 0.9959801 0.6724787 -0.6723748 0.9959797 0.6724211 -0.67235 0.9959791 0.67235 -0.6724086 0.9959791 0.67235 -0.6724827 0.9959791 0.67235 -0.6725764 0.9959791 0.67235 -0.672695 0.9959791 0.67235 -0.672845 0.9959791 0.67235 -0.6730348 0.9959791 0.67235 -0.6732749 0.9959791 0.67235 -0.6735787 0.9959791 0.67235 -0.673963 0.9959791 0.67235 -0.6744492 0.9959791 0.67235 -0.6750644 0.9959791 0.67235 -0.6758426 0.9959791 0.67235 -0.6768271 0.9959791 0.67235 -0.6780727 0.9959791 0.67235 -0.6796485 0.9959791 0.67235 -0.6816421 0.9959791 0.67235 -0.6841643 0.9959791 0.67235 -0.6873552 0.9959791 0.67235 -0.691392 0.9959791 0.67235 -0.6964992 0.9959791 0.67235 -0.7029605 0.9959791 0.67235 -0.7111348 0.9959791 0.67235 -0.7214763 0.9959791 0.67235 -0.7345598 0.9959791 0.67235 -0.751112 0.9959791 0.67235 -0.7720527 0.9959791 0.67235 -0.7985455 0.9959791 0.67235 -0.8320622 0.9959791 0.67235 -0.8744653 0.9959791 0.67235 -0.9281107 0.9959791 0.67235 -0.9959791 0.9959791 0.67235 -0.9968462 0.9398642 0.7250899 -0.9975222 0.9127186 0.7716061 -0.9980508 0.9037883 0.8118794 -0.998465 0.9056083 0.8461929 -0.9987903 0.9131993 0.8750317 -0.999046 0.9233816 0.8989923 -0.9992473 0.9342277 0.9187107 -0.9994059 0.944648 0.9348109 -0.999531 0.9540908 0.9478726 -0.9996296 0.9623356 0.9584142 -0.9997074 0.9693545 0.9668862 -0.9997689 0.9752232 0.9736719 -0.9998174 0.980066 0.9790923 -0.9998557 0.9840233 0.9834127 -0.999886 0.987233 0.9868503 -0.9999099 0.9898215 0.9895819 -0.9999288 0.9919 0.99175 -0.9999437 0.9935633 0.9934694 -0.7251659 0.9968475 0.7252842 -0.7251605 0.9968474 0.7252713 -0.7251537 0.9968473 0.725255 -0.7251454 0.9968472 0.7252347 -0.7251351 0.996847 0.7252093 -0.7251226 0.9968468 0.7251776 -0.7251076 0.9968465 0.7251383 -0.7250899 0.9968462 0.7250899 -0.7251288 0.9968462 0.7250899 -0.725178 0.9968462 0.7250899 -0.7252402 0.9968462 0.7250899 -0.7253189 0.9968462 0.7250899 -0.7254184 0.9968462 0.7250899 -0.7255444 0.9968462 0.7250899 -0.7257037 0.9968462 0.7250899 -0.7259053 0.9968462 0.7250899 -0.7261604 0.9968462 0.7250899 -0.7264831 0.9968462 0.7250899 -0.7268913 0.9968462 0.7250899 -0.7274078 0.9968462 0.7250899 -0.7280611 0.9968462 0.7250899 -0.7288878 0.9968462 0.7250899 -0.7299335 0.9968462 0.7250899 -0.7312566 0.9968462 0.7250899 -0.7329304 0.9968462 0.7250899 -0.735048 0.9968462 0.7250899 -0.7377271 0.9968462 0.7250899 -0.7411164 0.9968462 0.7250899 -0.7454044 0.9968462 0.7250899 -0.7508292 0.9968462 0.7250899 -0.7576923 0.9968462 0.7250899 -0.766375 0.9968462 0.7250899 -0.7773598 0.9968462 0.7250899 -0.791257 0.9968462 0.7250899 -0.8088387 0.9968462 0.7250899 -0.8310819 0.9968462 0.7250899 -0.8592224 0.9968462 0.7250899 -0.8948238 0.9968462 0.7250899 -0.9398642 0.9968462 0.7250899 -0.9968462 0.9968462 0.7250899 -0.9975222 0.9501574 0.7716061 -0.9980508 0.9281727 0.8118794 -0.998465 0.9213719 0.8461929 -0.9987903 0.9233256 0.8750317 -0.999046 0.9298523 0.8989923 -0.9992473 0.9383446 0.9187107 -0.9994059 0.9472579 0.9348109 -0.999531 0.9557405 0.9478726 -0.9996296 0.963376 0.9584142 -0.9997074 0.9700093 0.9668862 -0.9997689 0.9756348 0.9736719 -0.9998174 0.9803244 0.9790923 -0.9998557 0.9841853 0.9834127 -0.999886 0.9873345 0.9868503 -0.9999099 0.9898851 0.9895819 -0.9999288 0.9919398 0.99175 -0.9999437 0.9935882 0.9934694 -0.7716588 0.997523 0.7717365 -0.7716551 0.997523 0.7717278 -0.7716504 0.9975229 0.7717169 -0.7716446 0.9975228 0.7717033 -0.7716375 0.9975227 0.7716862 -0.7716288 0.9975226 0.7716649 -0.7716184 0.9975224 0.7716386 -0.7716061 0.9975222 0.7716061 -0.7716316 0.9975222 0.7716061 -0.7716639 0.9975222 0.7716061 -0.7717048 0.9975222 0.7716061 -0.7717565 0.9975222 0.7716061 -0.7718219 0.9975222 0.7716061 -0.7719047 0.9975222 0.7716061 -0.7720094 0.9975222 0.7716061 -0.7721418 0.9975222 0.7716061 -0.7723094 0.9975222 0.7716061 -0.7725214 0.9975222 0.7716061 -0.7727896 0.9975222 0.7716061 -0.7731289 0.9975222 0.7716061 -0.7735582 0.9975222 0.7716061 -0.7741013 0.9975222 0.7716061 -0.7747884 0.9975222 0.7716061 -0.7756577 0.9975222 0.7716061 -0.7767575 0.9975222 0.7716061 -0.7781488 0.9975222 0.7716061 -0.779909 0.9975222 0.7716061 -0.7821359 0.9975222 0.7716061 -0.7849532 0.9975222 0.7716061 -0.7885175 0.9975222 0.7716061 -0.7930267 0.9975222 0.7716061 -0.7987315 0.9975222 0.7716061 -0.8059488 0.9975222 0.7716061 -0.8150796 0.9975222 0.7716061 -0.8266313 0.9975222 0.7716061 -0.8412457 0.9975222 0.7716061 -0.8597348 0.9975222 0.7716061 -0.8831259 0.9975222 0.7716061 -0.9127186 0.9975222 0.7716061 -0.9501574 0.9975222 0.7716061 -0.9975222 0.9975222 0.7716061 -0.9980508 0.9590222 0.8118794 -0.998465 0.9413148 0.8461929 -0.9987903 0.9361366 0.8750317 -0.999046 0.9380386 0.8989923 -0.9992473 0.9435529 0.9187107 -0.9994059 0.9505597 0.9348109 -0.999531 0.9578277 0.9478726 -0.9996296 0.9646922 0.9584142 -0.9997074 0.9708378 0.9668862 -0.9997689 0.9761554 0.9736719 -0.9998174 0.9806512 0.9790923 -0.9998557 0.9843903 0.9834127 -0.999886 0.987463 0.9868503 -0.9999099 0.9899656 0.9895819 -0.9999288 0.9919902 0.99175 -0.9999437 0.9936197 0.9934694 -0.8119154 0.9980513 0.811966 -0.8119128 0.9980512 0.8119602 -0.8119096 0.9980512 0.811953 -0.8119057 0.9980511 0.8119439 -0.8119009 0.9980511 0.8119326 -0.8118949 0.998051 0.8119185 -0.8118878 0.9980509 0.811901 -0.8118794 0.9980508 0.8118794 -0.8118961 0.9980508 0.8118794 -0.8119171 0.9980508 0.8118794 -0.8119437 0.9980508 0.8118794 -0.8119774 0.9980508 0.8118794 -0.81202 0.9980508 0.8118794 -0.8120739 0.9980508 0.8118794 -0.8121421 0.9980508 0.8118794 -0.8122284 0.9980508 0.8118794 -0.8123375 0.9980508 0.8118794 -0.8124756 0.9980508 0.8118794 -0.8126503 0.9980508 0.8118794 -0.8128713 0.9980508 0.8118794 -0.8131509 0.9980508 0.8118794 -0.8135046 0.9980508 0.8118794 -0.8139522 0.9980508 0.8118794 -0.8145183 0.9980508 0.8118794 -0.8152346 0.9980508 0.8118794 -0.8161408 0.9980508 0.8118794 -0.8172873 0.9980508 0.8118794 -0.8187377 0.9980508 0.8118794 -0.8205726 0.9980508 0.8118794 -0.8228941 0.9980508 0.8118794 -0.825831 0.9980508 0.8118794 -0.8295466 0.9980508 0.8118794 -0.8342474 0.9980508 0.8118794 -0.8401944 0.9980508 0.8118794 -0.8477182 0.9980508 0.8118794 -0.8572368 0.9980508 0.8118794 -0.869279 0.9980508 0.8118794 -0.884514 0.9980508 0.8118794 -0.9037883 0.9980508 0.8118794 -0.9281727 0.9980508 0.8118794 -0.9590222 0.9980508 0.8118794 -0.9980508 0.9980508 0.8118794 -0.998465 0.9665453 0.8461929 -0.9987903 0.9523443 0.8750317 -0.999046 0.9483954 0.8989923 -0.9992473 0.9501421 0.9187107 -0.9994059 0.954737 0.9348109 -0.999531 0.9604682 0.9478726 -0.9996296 0.9663574 0.9584142 -0.9997074 0.971886 0.9668862 -0.9997689 0.9768142 0.9736719 -0.9998174 0.9810648 0.9790923 -0.9998557 0.9846496 0.9834127 -0.999886 0.9876255 0.9868503 -0.9999099 0.9900673 0.9895819 -0.9999288 0.9920539 0.99175 -0.9999437 0.9936596 0.9934694 -0.8462171 0.9984653 0.8462498 -0.8462154 0.9984653 0.846246 -0.8462132 0.9984653 0.8462413 -0.8462106 0.9984653 0.8462353 -0.8462073 0.9984652 0.8462279 -0.8462034 0.9984652 0.8462186 -0.8461986 0.9984651 0.8462071 -0.8461929 0.998465 0.8461929 -0.8462037 0.998465 0.8461929 -0.8462173 0.998465 0.8461929 -0.8462345 0.998465 0.8461929 -0.8462563 0.998465 0.8461929 -0.8462838 0.998465 0.8461929 -0.8463187 0.998465 0.8461929 -0.8463627 0.998465 0.8461929 -0.8464185 0.998465 0.8461929 -0.8464891 0.998465 0.8461929 -0.8465783 0.998465 0.8461929 -0.8466913 0.998465 0.8461929 -0.8468341 0.998465 0.8461929 -0.8470149 0.998465 0.8461929 -0.8472436 0.998465 0.8461929 -0.8475329 0.998465 0.8461929 -0.8478989 0.998465 0.8461929 -0.8483619 0.998465 0.8461929 -0.8489478 0.998465 0.8461929 -0.8496889 0.998465 0.8461929 -0.8506265 0.998465 0.8461929 -0.8518127 0.998465 0.8461929 -0.8533135 0.998465 0.8461929 -0.8552121 0.998465 0.8461929 -0.8576141 0.998465 0.8461929 -0.8606529 0.998465 0.8461929 -0.8644975 0.998465 0.8461929 -0.8693613 0.998465 0.8461929 -0.8755147 0.998465 0.8461929 -0.8832995 0.998465 0.8461929 -0.8931483 0.998465 0.8461929 -0.9056083 0.998465 0.8461929 -0.9213719 0.998465 0.8461929 -0.9413148 0.998465 0.8461929 -0.9665453 0.998465 0.8461929 -0.998465 0.998465 0.8461929 -0.9987903 0.9728491 0.8750317 -0.999046 0.961498 0.8989923 -0.9992473 0.9584783 0.9187107 -0.9994059 0.9600218 0.9348109 -0.999531 0.9638088 0.9478726 -0.9996296 0.9684641 0.9584142 -0.9997074 0.973212 0.9668862 -0.9997689 0.9776476 0.9736719 -0.9998174 0.9815879 0.9790923 -0.9998557 0.9849777 0.9834127 -0.999886 0.987831 0.9868503 -0.9999099 0.9901961 0.9895819 -0.9999288 0.9921345 0.99175 -0.9999437 0.99371 0.9934694 -0.8750477 0.9987905 0.8750687 -0.8750466 0.9987905 0.8750662 -0.8750451 0.9987904 0.8750631 -0.8750434 0.9987904 0.8750593 -0.8750412 0.9987904 0.8750544 -0.8750386 0.9987904 0.8750484 -0.8750355 0.9987903 0.8750409 -0.8750317 0.9987903 0.8750317 -0.8750386 0.9987903 0.8750317 -0.8750474 0.9987903 0.8750317 -0.8750584 0.9987903 0.8750317 -0.8750724 0.9987903 0.8750317 -0.8750901 0.9987903 0.8750317 -0.8751125 0.9987903 0.8750317 -0.8751408 0.9987903 0.8750317 -0.8751766 0.9987903 0.8750317 -0.8752219 0.9987903 0.8750317 -0.8752793 0.9987903 0.8750317 -0.8753518 0.9987903 0.8750317 -0.8754436 0.9987903 0.8750317 -0.8755597 0.9987903 0.8750317 -0.8757066 0.9987903 0.8750317 -0.8758925 0.9987903 0.8750317 -0.8761276 0.9987903 0.8750317 -0.876425 0.9987903 0.8750317 -0.8768014 0.9987903 0.8750317 -0.8772775 0.9987903 0.8750317 -0.8778798 0.9987903 0.8750317 -0.8786418 0.9987903 0.8750317 -0.8796058 0.9987903 0.8750317 -0.8808255 0.9987903 0.8750317 -0.8823685 0.9987903 0.8750317 -0.8843206 0.9987903 0.8750317 -0.8867903 0.9987903 0.8750317 -0.8899147 0.9987903 0.8750317 -0.8938676 0.9987903 0.8750317 -0.8988684 0.9987903 0.8750317 -0.9051951 0.9987903 0.8750317 -0.9131993 0.9987903 0.8750317 -0.9233256 0.9987903 0.8750317 -0.9361366 0.9987903 0.8750317 -0.9523443 0.9987903 0.8750317 -0.9728491 0.9987903 0.8750317 -0.9987903 0.9987903 0.8750317 -0.999046 0.9780745 0.8989923 -0.9992473 0.9690247 0.9187107 -0.9994059 0.9667077 0.9348109 -0.999531 0.9680351 0.9478726 -0.9996296 0.9711293 0.9584142 -0.9997074 0.9748896 0.9668862 -0.9997689 0.9787019 0.9736719 -0.9998174 0.9822497 0.9790923 -0.9998557 0.9853927 0.9834127 -0.999886 0.9880911 0.9868503 -0.9999099 0.9903589 0.9895819 -0.9999288 0.9922364 0.99175 -0.9999437 0.9937738 0.9934694 -0.8990028 0.9990461 0.8990162 -0.899002 0.9990461 0.8990146 -0.8990011 0.9990461 0.8990126 -0.899 0.9990461 0.8990101 -0.8989986 0.9990461 0.899007 -0.8989969 0.9990461 0.8990031 -0.8989948 0.9990461 0.8989983 -0.8989923 0.999046 0.8989923 -0.8989967 0.999046 0.8989923 -0.8990023 0.999046 0.8989923 -0.8990094 0.999046 0.8989923 -0.8990183 0.999046 0.8989923 -0.8990296 0.999046 0.8989923 -0.8990439 0.999046 0.8989923 -0.899062 0.999046 0.8989923 -0.8990849 0.999046 0.8989923 -0.8991139 0.999046 0.8989923 -0.8991505 0.999046 0.8989923 -0.8991969 0.999046 0.8989923 -0.8992555 0.999046 0.8989923 -0.8993297 0.999046 0.8989923 -0.8994236 0.999046 0.8989923 -0.8995424 0.999046 0.8989923 -0.8996926 0.999046 0.8989923 -0.8998827 0.999046 0.8989923 -0.9001231 0.999046 0.8989923 -0.9004274 0.999046 0.8989923 -0.9008122 0.999046 0.8989923 -0.9012992 0.999046 0.8989923 -0.9019152 0.999046 0.8989923 -0.9026946 0.999046 0.8989923 -0.9036806 0.999046 0.8989923 -0.904928 0.999046 0.8989923 -0.9065061 0.999046 0.8989923 -0.9085026 0.999046 0.8989923 -0.9110285 0.999046 0.8989923 -0.9142241 0.999046 0.8989923 -0.9182669 0.999046 0.8989923 -0.9233816 0.999046 0.8989923 -0.9298523 0.999046 0.8989923 -0.9380386 0.999046 0.8989923 -0.9483954 0.999046 0.8989923 -0.961498 0.999046 0.8989923 -0.9780745 0.999046 0.8989923 -0.999046 0.999046 0.8989923 -0.9992473 0.9823673 0.9187107 -0.9994059 0.9751663 0.9348109 -0.999531 0.9733819 0.9478726 -0.9996296 0.9745012 0.9584142 -0.9997074 0.977012 0.9668862 -0.9997689 0.9800358 0.9736719 -0.9998174 0.983087 0.9790923 -0.9998557 0.9859178 0.9834127 -0.999886 0.9884202 0.9868503 -0.9999099 0.990565 0.9895819 -0.9999288 0.9923654 0.99175 -0.9999437 0.9938545 0.9934694 -0.9187175 0.9992474 0.918726 -0.918717 0.9992474 0.918725 -0.9187164 0.9992474 0.9187237 -0.9187157 0.9992474 0.9187221 -0.9187148 0.9992474 0.9187201 -0.9187137 0.9992474 0.9187176 -0.9187123 0.9992473 0.9187145 -0.9187107 0.9992473 0.9187107 -0.9187135 0.9992473 0.9187107 -0.9187171 0.9992473 0.9187107 -0.9187216 0.9992473 0.9187107 -0.9187273 0.9992473 0.9187107 -0.9187344 0.9992473 0.9187107 -0.9187435 0.9992473 0.9187107 -0.9187551 0.9992473 0.9187107 -0.9187696 0.9992473 0.9187107 -0.9187881 0.9992473 0.9187107 -0.9188114 0.9992473 0.9187107 -0.9188409 0.9992473 0.9187107 -0.9188782 0.9992473 0.9187107 -0.9189254 0.9992473 0.9187107 -0.9189851 0.9992473 0.9187107 -0.9190607 0.9992473 0.9187107 -0.9191562 0.9992473 0.9187107 -0.9192772 0.9992473 0.9187107 -0.9194302 0.9992473 0.9187107 -0.9196237 0.9992473 0.9187107 -0.9198686 0.9992473 0.9187107 -0.9201784 0.9992473 0.9187107 -0.9205703 0.9992473 0.9187107 -0.9210662 0.9992473 0.9187107 -0.9216935 0.9992473 0.9187107 -0.9224871 0.9992473 0.9187107 -0.9234912 0.9992473 0.9187107 -0.9247614 0.9992473 0.9187107 -0.9263684 0.9992473 0.9187107 -0.9284015 0.9992473 0.9187107 -0.9309736 0.9992473 0.9187107 -0.9342277 0.9992473 0.9187107 -0.9383446 0.9992473 0.9187107 -0.9435529 0.9992473 0.9187107 -0.9501421 0.9992473 0.9187107 -0.9584783 0.9992473 0.9187107 -0.9690247 0.9992473 0.9187107 -0.9823673 0.9992473 0.9187107 -0.9992473 0.9992473 0.9187107 -0.9994059 0.9858675 0.9348109 -0.999531 0.9801463 0.9478726 -0.9996296 0.978767 0.9584142 -0.9997074 0.9796971 0.9668862 -0.9997689 0.9817234 0.9736719 -0.9998174 0.9841464 0.9790923 -0.9998557 0.9865821 0.9834127 -0.999886 0.9888364 0.9868503 -0.9999099 0.9908257 0.9895819 -0.9999288 0.9925286 0.99175 -0.9999437 0.9939566 0.9934694 -0.9348153 0.999406 0.9348207 -0.9348149 0.999406 0.93482 -0.9348146 0.999406 0.9348192 -0.9348141 0.999406 0.9348182 -0.9348135 0.999406 0.9348169 -0.9348128 0.9994059 0.9348153 -0.9348119 0.9994059 0.9348133 -0.9348109 0.9994059 0.9348109 -0.9348127 0.9994059 0.9348109 -0.9348149 0.9994059 0.9348109 -0.9348178 0.9994059 0.9348109 -0.9348214 0.9994059 0.9348109 -0.9348259 0.9994059 0.9348109 -0.9348317 0.9994059 0.9348109 -0.934839 0.9994059 0.9348109 -0.9348482 0.9994059 0.9348109 -0.9348599 0.9994059 0.9348109 -0.9348747 0.9994059 0.9348109 -0.9348934 0.9994059 0.9348109 -0.934917 0.9994059 0.9348109 -0.934947 0.9994059 0.9348109 -0.9349848 0.9994059 0.9348109 -0.9350327 0.9994059 0.9348109 -0.9350933 0.9994059 0.9348109 -0.93517 0.9994059 0.9348109 -0.935267 0.9994059 0.9348109 -0.9353897 0.9994059 0.9348109 -0.9355449 0.9994059 0.9348109 -0.9357413 0.9994059 0.9348109 -0.9359898 0.9994059 0.9348109 -0.9363041 0.9994059 0.9348109 -0.9367018 0.9994059 0.9348109 -0.9372049 0.9994059 0.9348109 -0.9378415 0.9994059 0.9348109 -0.9386467 0.9994059 0.9348109 -0.9396655 0.9994059 0.9348109 -0.9409544 0.9994059 0.9348109 -0.942585 0.9994059 0.9348109 -0.944648 0.9994059 0.9348109 -0.9472579 0.9994059 0.9348109 -0.9505597 0.9994059 0.9348109 -0.954737 0.9994059 0.9348109 -0.9600218 0.9994059 0.9348109 -0.9667077 0.9994059 0.9348109 -0.9751663 0.9994059 0.9348109 -0.9858675 0.9994059 0.9348109 -0.9994059 0.9994059 0.9348109 -0.999531 0.9887042 0.9478726 -0.9996296 0.9841639 0.9584142 -0.9997074 0.9830941 0.9668862 -0.9997689 0.9838583 0.9736719 -0.9998174 0.9854865 0.9790923 -0.9998557 0.9874226 0.9834127 -0.999886 0.9893631 0.9868503 -0.9999099 0.9911555 0.9895819 -0.9999288 0.992735 0.99175 -0.9999437 0.9940858 0.9934694 -0.9478754 0.999531 0.9478788 -0.9478752 0.999531 0.9478784 -0.947875 0.999531 0.9478779 -0.9478746 0.999531 0.9478772 -0.9478743 0.999531 0.9478764 -0.9478738 0.999531 0.9478754 -0.9478733 0.999531 0.9478742 -0.9478726 0.999531 0.9478726 -0.9478737 0.999531 0.9478726 -0.9478751 0.999531 0.9478726 -0.947877 0.999531 0.9478726 -0.9478792 0.999531 0.9478726 -0.9478821 0.999531 0.9478726 -0.9478858 0.999531 0.9478726 -0.9478904 0.999531 0.9478726 -0.9478962 0.999531 0.9478726 -0.9479036 0.999531 0.9478726 -0.9479129 0.999531 0.9478726 -0.9479248 0.999531 0.9478726 -0.9479397 0.999531 0.9478726 -0.9479586 0.999531 0.9478726 -0.9479826 0.999531 0.9478726 -0.9480128 0.999531 0.9478726 -0.9480511 0.999531 0.9478726 -0.9480996 0.999531 0.9478726 -0.9481609 0.999531 0.9478726 -0.9482385 0.999531 0.9478726 -0.9483366 0.999531 0.9478726 -0.9484607 0.999531 0.9478726 -0.9486178 0.999531 0.9478726 -0.9488165 0.999531 0.9478726 -0.9490679 0.999531 0.9478726 -0.9493859 0.999531 0.9478726 -0.9497883 0.999531 0.9478726 -0.9502973 0.999531 0.9478726 -0.9509413 0.999531 0.9478726 -0.951756 0.999531 0.9478726 -0.9527868 0.999531 0.9478726 -0.9540908 0.999531 0.9478726 -0.9557405 0.999531 0.9478726 -0.9578277 0.999531 0.9478726 -0.9604682 0.999531 0.9478726 -0.9638088 0.999531 0.9478726 -0.9680351 0.999531 0.9478726 -0.9733819 0.999531 0.9478726 -0.9801463 0.999531 0.9478726 -0.9887042 0.999531 0.9478726 -0.999531 0.999531 0.9478726 -0.9996296 0.9909916 0.9584142 -0.9997074 0.9873917 0.9668862 -0.9997689 0.9865593 0.9736719 -0.9998174 0.987182 0.9790923 -0.9998557 0.9884859 0.9834127 -0.999886 0.9900294 0.9868503 -0.9999099 0.9915728 0.9895819 -0.9999288 0.9929962 0.99175 -0.9999437 0.9942492 0.9934694 -0.958416 0.9996296 0.9584181 -0.9584159 0.9996296 0.9584179 -0.9584157 0.9996296 0.9584176 -0.9584155 0.9996296 0.9584171 -0.9584153 0.9996296 0.9584166 -0.958415 0.9996296 0.958416 -0.9584146 0.9996296 0.9584152 -0.9584142 0.9996296 0.9584142 -0.9584149 0.9996296 0.9584142 -0.9584158 0.9996296 0.9584142 -0.9584169 0.9996296 0.9584142 -0.9584184 0.9996296 0.9584142 -0.9584202 0.9996296 0.9584142 -0.9584225 0.9996296 0.9584142 -0.9584254 0.9996296 0.9584142 -0.9584291 0.9996296 0.9584142 -0.9584337 0.9996296 0.9584142 -0.9584396 0.9996296 0.9584142 -0.9584471 0.9996296 0.9584142 -0.9584565 0.9996296 0.9584142 -0.9584685 0.9996296 0.9584142 -0.9584835 0.9996296 0.9584142 -0.9585026 0.9996296 0.9584142 -0.9585268 0.9996296 0.9584142 -0.9585574 0.9996296 0.9584142 -0.958596 0.9996296 0.9584142 -0.9586449 0.9996296 0.9584142 -0.9587068 0.9996296 0.9584142 -0.9587851 0.9996296 0.9584142 -0.9588842 0.9996296 0.9584142 -0.9590095 0.9996296 0.9584142 -0.959168 0.9996296 0.9584142 -0.9593686 0.9996296 0.9584142 -0.9596223 0.9996296 0.9584142 -0.9599433 0.9996296 0.9584142 -0.9603494 0.9996296 0.9584142 -0.9608632 0.9996296 0.9584142 -0.9615132 0.9996296 0.9584142 -0.9623356 0.9996296 0.9584142 -0.963376 0.9996296 0.9584142 -0.9646922 0.9996296 0.9584142 -0.9663574 0.9996296 0.9584142 -0.9684641 0.9996296 0.9584142 -0.9711293 0.9996296 0.9584142 -0.9745012 0.9996296 0.9584142 -0.978767 0.9996296 0.9584142 -0.9841639 0.9996296 0.9584142 -0.9909916 0.9996296 0.9584142 -0.9996296 0.9996296 0.9584142 -0.9997074 0.9928288 0.9668862 -0.9997689 0.9899765 0.9736719 -0.9998174 0.989327 0.9790923 -0.9998557 0.989831 0.9834127 -0.999886 0.9908723 0.9868503 -0.9999099 0.9921006 0.9895819 -0.9999288 0.9933266 0.99175 -0.9999437 0.9944559 0.9934694 -0.9668873 0.9997074 0.9668887 -0.9668872 0.9997074 0.9668885 -0.9668871 0.9997074 0.9668883 -0.966887 0.9997074 0.966888 -0.9668869 0.9997074 0.9668877 -0.9668867 0.9997074 0.9668873 -0.9668865 0.9997074 0.9668868 -0.9668862 0.9997074 0.9668862 -0.9668866 0.9997074 0.9668862 -0.9668872 0.9997074 0.9668862 -0.9668879 0.9997074 0.9668862 -0.9668888 0.9997074 0.9668862 -0.96689 0.9997074 0.9668862 -0.9668914 0.9997074 0.9668862 -0.9668932 0.9997074 0.9668862 -0.9668956 0.9997074 0.9668862 -0.9668985 0.9997074 0.9668862 -0.9669022 0.9997074 0.9668862 -0.9669069 0.9997074 0.9668862 -0.9669128 0.9997074 0.9668862 -0.9669203 0.9997074 0.9668862 -0.9669298 0.9997074 0.9668862 -0.9669419 0.9997074 0.9668862 -0.9669571 0.9997074 0.9668862 -0.9669763 0.9997074 0.9668862 -0.9670006 0.9997074 0.9668862 -0.9670314 0.9997074 0.9668862 -0.9670704 0.9997074 0.9668862 -0.9671197 0.9997074 0.9668862 -0.967182 0.9997074 0.9668862 -0.9672609 0.9997074 0.9668862 -0.9673607 0.9997074 0.9668862 -0.9674869 0.9997074 0.9668862 -0.9676466 0.9997074 0.9668862 -0.9678487 0.9997074 0.9668862 -0.9681043 0.9997074 0.9668862 -0.9684277 0.9997074 0.9668862 -0.9688368 0.9997074 0.9668862 -0.9693545 0.9997074 0.9668862 -0.9700093 0.9997074 0.9668862 -0.9708378 0.9997074 0.9668862 -0.971886 0.9997074 0.9668862 -0.973212 0.9997074 0.9668862 -0.9748896 0.9997074 0.9668862 -0.977012 0.9997074 0.9668862 -0.9796971 0.9997074 0.9668862 -0.9830941 0.9997074 0.9668862 -0.9873917 0.9997074 0.9668862 -0.9928288 0.9997074 0.9668862 -0.9997074 0.9997074 0.9668862 -0.9997689 0.9942996 0.9736719 -0.9998174 0.9920407 0.9790923 -0.9998557 0.9915328 0.9834127 -0.999886 0.9919387 0.9868503 -0.9999099 0.9927685 0.9895819 -0.9999288 0.9937446 0.99175 -0.9999437 0.9947175 0.9934694 -0.9736726 0.9997689 0.9736735 -0.9736726 0.9997689 0.9736734 -0.9736725 0.9997689 0.9736732 -0.9736724 0.9997689 0.9736731 -0.9736723 0.9997689 0.9736729 -0.9736722 0.9997689 0.9736726 -0.9736721 0.9997689 0.9736723 -0.9736719 0.9997689 0.9736719 -0.9736722 0.9997689 0.9736719 -0.9736725 0.9997689 0.9736719 -0.973673 0.9997689 0.9736719 -0.9736736 0.9997689 0.9736719 -0.9736743 0.9997689 0.9736719 -0.9736752 0.9997689 0.9736719 -0.9736763 0.9997689 0.9736719 -0.9736778 0.9997689 0.9736719 -0.9736796 0.9997689 0.9736719 -0.973682 0.9997689 0.9736719 -0.9736849 0.9997689 0.9736719 -0.9736886 0.9997689 0.9736719 -0.9736934 0.9997689 0.9736719 -0.9736993 0.9997689 0.9736719 -0.9737069 0.9997689 0.9736719 -0.9737164 0.9997689 0.9736719 -0.9737285 0.9997689 0.9736719 -0.9737438 0.9997689 0.9736719 -0.9737632 0.9997689 0.9736719 -0.9737877 0.9997689 0.9736719 -0.9738186 0.9997689 0.9736719 -0.9738578 0.9997689 0.9736719 -0.9739074 0.9997689 0.9736719 -0.9739701 0.9997689 0.9736719 -0.9740494 0.9997689 0.9736719 -0.9741498 0.9997689 0.9736719 -0.9742768 0.9997689 0.9736719 -0.9744375 0.9997689 0.9736719 -0.9746407 0.9997689 0.9736719 -0.9748979 0.9997689 0.9736719 -0.9752232 0.9997689 0.9736719 -0.9756348 0.9997689 0.9736719 -0.9761554 0.9997689 0.9736719 -0.9768142 0.9997689 0.9736719 -0.9776476 0.9997689 0.9736719 -0.9787019 0.9997689 0.9736719 -0.9800358 0.9997689 0.9736719 -0.9817234 0.9997689 0.9736719 -0.9838583 0.9997689 0.9736719 -0.9865593 0.9997689 0.9736719 -0.9899765 0.9997689 0.9736719 -0.9942996 0.9997689 0.9736719 -0.9997689 0.9997689 0.9736719 -0.9998174 0.9954739 0.9790923 -0.9998557 0.9936858 0.9834127 -0.999886 0.9932878 0.9868503 -0.9999099 0.9936134 0.9895819 -0.9999288 0.9942735 0.99175 -0.9999437 0.9950484 0.9934694 -0.9790927 0.9998174 0.9790933 -0.9790927 0.9998174 0.9790932 -0.9790927 0.9998174 0.9790931 -0.9790926 0.9998174 0.979093 -0.9790925 0.9998174 0.9790929 -0.9790925 0.9998174 0.9790927 -0.9790924 0.9998174 0.9790925 -0.9790923 0.9998174 0.9790923 -0.9790924 0.9998174 0.9790923 -0.9790927 0.9998174 0.9790923 -0.979093 0.9998174 0.9790923 -0.9790933 0.9998174 0.9790923 -0.9790938 0.9998174 0.9790923 -0.9790943 0.9998174 0.9790923 -0.9790951 0.9998174 0.9790923 -0.979096 0.9998174 0.9790923 -0.9790971 0.9998174 0.9790923 -0.9790986 0.9998174 0.9790923 -0.9791004 0.9998174 0.9790923 -0.9791028 0.9998174 0.9790923 -0.9791057 0.9998174 0.9790923 -0.9791095 0.9998174 0.9790923 -0.9791142 0.9998174 0.9790923 -0.9791202 0.9998174 0.9790923 -0.9791278 0.9998174 0.9790923 -0.9791374 0.9998174 0.9790923 -0.9791496 0.9998174 0.9790923 -0.9791649 0.9998174 0.9790923 -0.9791844 0.9998174 0.9790923 -0.979209 0.9998174 0.9790923 -0.9792401 0.9998174 0.9790923 -0.9792795 0.9998174 0.9790923 -0.9793293 0.9998174 0.9790923 -0.9793923 0.9998174 0.9790923 -0.979472 0.9998174 0.9790923 -0.9795728 0.9998174 0.9790923 -0.9797004 0.9998174 0.9790923 -0.9798618 0.9998174 0.9790923 -0.980066 0.9998174 0.9790923 -0.9803244 0.9998174 0.9790923 -0.9806512 0.9998174 0.9790923 -0.9810648 0.9998174 0.9790923 -0.9815879 0.9998174 0.9790923 -0.9822497 0.9998174 0.9790923 -0.983087 0.9998174 0.9790923 -0.9841464 0.9998174 0.9790923 -0.9854865 0.9998174 0.9790923 -0.987182 0.9998174 0.9790923 -0.989327 0.9998174 0.9790923 -0.9920407 0.9998174 0.9790923 -0.9954739 0.9998174 0.9790923 -0.9998174 0.9998174 0.9790923 -0.9998557 0.9964097 0.9834127 -0.999886 0.9949947 0.9868503 -0.9999099 0.9946823 0.9895819 -0.9999288 0.9949426 0.99175 -0.9999437 0.995467 0.9934694 -0.9834129 0.9998557 0.9834133 -0.9834129 0.9998557 0.9834132 -0.9834129 0.9998557 0.9834132 -0.9834129 0.9998557 0.9834131 -0.9834128 0.9998557 0.983413 -0.9834128 0.9998557 0.9834129 -0.9834127 0.9998557 0.9834128 -0.9834127 0.9998557 0.9834127 -0.9834128 0.9998557 0.9834127 -0.9834129 0.9998557 0.9834127 -0.9834131 0.9998557 0.9834127 -0.9834133 0.9998557 0.9834127 -0.9834136 0.9998557 0.9834127 -0.9834139 0.9998557 0.9834127 -0.9834144 0.9998557 0.9834127 -0.983415 0.9998557 0.9834127 -0.9834157 0.9998557 0.9834127 -0.9834166 0.9998557 0.9834127 -0.9834178 0.9998557 0.9834127 -0.9834192 0.9998557 0.9834127 -0.9834211 0.9998557 0.9834127 -0.9834234 0.9998557 0.9834127 -0.9834264 0.9998557 0.9834127 -0.9834302 0.9998557 0.9834127 -0.9834349 0.9998557 0.9834127 -0.983441 0.9998557 0.9834127 -0.9834486 0.9998557 0.9834127 -0.9834582 0.9998557 0.9834127 -0.9834704 0.9998557 0.9834127 -0.9834858 0.9998557 0.9834127 -0.9835053 0.9998557 0.9834127 -0.98353 0.9998557 0.9834127 -0.9835613 0.9998557 0.9834127 -0.9836008 0.9998557 0.9834127 -0.9836508 0.9998557 0.9834127 -0.983714 0.9998557 0.9834127 -0.983794 0.9998557 0.9834127 -0.9838953 0.9998557 0.9834127 -0.9840233 0.9998557 0.9834127 -0.9841853 0.9998557 0.9834127 -0.9843903 0.9998557 0.9834127 -0.9846496 0.9998557 0.9834127 -0.9849777 0.9998557 0.9834127 -0.9853927 0.9998557 0.9834127 -0.9859178 0.9998557 0.9834127 -0.9865821 0.9998557 0.9834127 -0.9874226 0.9998557 0.9834127 -0.9884859 0.9998557 0.9834127 -0.989831 0.9998557 0.9834127 -0.9915328 0.9998557 0.9834127 -0.9936858 0.9998557 0.9834127 -0.9964097 0.9998557 0.9834127 -0.9998557 0.9998557 0.9834127 -0.999886 0.9971541 0.9868503 -0.9999099 0.9960346 0.9895819 -0.9999288 0.9957891 0.99175 -0.9999437 0.9959967 0.9934694 -0.9868505 0.999886 0.9868507 -0.9868505 0.999886 0.9868507 -0.9868505 0.999886 0.9868507 -0.9868505 0.999886 0.9868506 -0.9868504 0.999886 0.9868506 -0.9868504 0.999886 0.9868505 -0.9868504 0.999886 0.9868504 -0.9868503 0.999886 0.9868503 -0.9868504 0.999886 0.9868503 -0.9868505 0.999886 0.9868503 -0.9868506 0.999886 0.9868503 -0.9868507 0.999886 0.9868503 -0.9868509 0.999886 0.9868503 -0.9868511 0.999886 0.9868503 -0.9868514 0.999886 0.9868503 -0.9868518 0.999886 0.9868503 -0.9868522 0.999886 0.9868503 -0.9868528 0.999886 0.9868503 -0.9868535 0.999886 0.9868503 -0.9868545 0.999886 0.9868503 -0.9868556 0.999886 0.9868503 -0.9868571 0.999886 0.9868503 -0.986859 0.999886 0.9868503 -0.9868613 0.999886 0.9868503 -0.9868643 0.999886 0.9868503 -0.9868681 0.999886 0.9868503 -0.9868728 0.999886 0.9868503 -0.9868789 0.999886 0.9868503 -0.9868865 0.999886 0.9868503 -0.9868962 0.999886 0.9868503 -0.9869084 0.999886 0.9868503 -0.9869239 0.999886 0.9868503 -0.9869435 0.999886 0.9868503 -0.9869682 0.999886 0.9868503 -0.9869995 0.999886 0.9868503 -0.9870392 0.999886 0.9868503 -0.9870893 0.999886 0.9868503 -0.9871527 0.999886 0.9868503 -0.987233 0.999886 0.9868503 -0.9873345 0.999886 0.9868503 -0.987463 0.999886 0.9868503 -0.9876255 0.999886 0.9868503 -0.987831 0.999886 0.9868503 -0.9880911 0.999886 0.9868503 -0.9884202 0.999886 0.9868503 -0.9888364 0.999886 0.9868503 -0.9893631 0.999886 0.9868503 -0.9900294 0.999886 0.9868503 -0.9908723 0.999886 0.9868503 -0.9919387 0.999886 0.9868503 -0.9932878 0.999886 0.9868503 -0.9949947 0.999886 0.9868503 -0.9971541 0.999886 0.9868503 -0.999886 0.999886 0.9868503 -0.9999099 0.9977454 0.9895819 -0.9999288 0.9968599 0.99175 -0.9999437 0.9966667 0.9934694 -0.989582 0.9999099 0.9895821 -0.989582 0.9999099 0.9895821 -0.989582 0.9999099 0.9895821 -0.989582 0.9999099 0.9895821 -0.989582 0.9999099 0.989582 -0.9895819 0.9999099 0.989582 -0.9895819 0.9999099 0.989582 -0.9895819 0.9999099 0.9895819 -0.9895819 0.9999099 0.9895819 -0.989582 0.9999099 0.9895819 -0.9895821 0.9999099 0.9895819 -0.9895822 0.9999099 0.9895819 -0.9895823 0.9999099 0.9895819 -0.9895824 0.9999099 0.9895819 -0.9895826 0.9999099 0.9895819 -0.9895828 0.9999099 0.9895819 -0.9895831 0.9999099 0.9895819 -0.9895834 0.9999099 0.9895819 -0.9895839 0.9999099 0.9895819 -0.9895845 0.9999099 0.9895819 -0.9895852 0.9999099 0.9895819 -0.9895861 0.9999099 0.9895819 -0.9895873 0.9999099 0.9895819 -0.9895888 0.9999099 0.9895819 -0.9895906 0.9999099 0.9895819 -0.989593 0.9999099 0.9895819 -0.989596 0.9999099 0.9895819 -0.9895998 0.9999099 0.9895819 -0.9896046 0.9999099 0.9895819 -0.9896106 0.9999099 0.9895819 -0.9896183 0.9999099 0.9895819 -0.989628 0.9999099 0.9895819 -0.9896402 0.9999099 0.9895819 -0.9896557 0.9999099 0.9895819 -0.9896753 0.9999099 0.9895819 -0.9897002 0.9999099 0.9895819 -0.9897316 0.9999099 0.9895819 -0.9897713 0.9999099 0.9895819 -0.9898215 0.9999099 0.9895819 -0.9898851 0.9999099 0.9895819 -0.9899656 0.9999099 0.9895819 -0.9900673 0.9999099 0.9895819 -0.9901961 0.9999099 0.9895819 -0.9903589 0.9999099 0.9895819 -0.990565 0.9999099 0.9895819 -0.9908257 0.9999099 0.9895819 -0.9911555 0.9999099 0.9895819 -0.9915728 0.9999099 0.9895819 -0.9921006 0.9999099 0.9895819 -0.9927685 0.9999099 0.9895819 -0.9936134 0.9999099 0.9895819 -0.9946823 0.9999099 0.9895819 -0.9960346 0.9999099 0.9895819 -0.9977454 0.9999099 0.9895819 -0.9999099 0.9999099 0.9895819 -0.9999288 0.9982148 0.99175 -0.9999437 0.9975144 0.9934694 -0.9917501 0.9999288 0.9917502 -0.9917501 0.9999288 0.9917502 -0.9917501 0.9999288 0.9917502 -0.9917501 0.9999288 0.9917501 -0.9917501 0.9999288 0.9917501 -0.9917501 0.9999288 0.9917501 -0.99175 0.9999288 0.9917501 -0.99175 0.9999288 0.99175 -0.9917501 0.9999288 0.99175 -0.9917501 0.9999288 0.99175 -0.9917501 0.9999288 0.99175 -0.9917502 0.9999288 0.99175 -0.9917503 0.9999288 0.99175 -0.9917503 0.9999288 0.99175 -0.9917505 0.9999288 0.99175 -0.9917506 0.9999288 0.99175 -0.9917508 0.9999288 0.99175 -0.991751 0.9999288 0.99175 -0.9917513 0.9999288 0.99175 -0.9917516 0.9999288 0.99175 -0.9917521 0.9999288 0.99175 -0.9917527 0.9999288 0.99175 -0.9917534 0.9999288 0.99175 -0.9917543 0.9999288 0.99175 -0.9917555 0.9999288 0.99175 -0.991757 0.9999288 0.99175 -0.9917588 0.9999288 0.99175 -0.9917612 0.9999288 0.99175 -0.9917642 0.9999288 0.99175 -0.991768 0.9999288 0.99175 -0.9917728 0.9999288 0.99175 -0.9917789 0.9999288 0.99175 -0.9917865 0.9999288 0.99175 -0.9917962 0.9999288 0.99175 -0.9918085 0.9999288 0.99175 -0.9918241 0.9999288 0.99175 -0.9918437 0.9999288 0.99175 -0.9918686 0.9999288 0.99175 -0.9919 0.9999288 0.99175 -0.9919398 0.9999288 0.99175 -0.9919902 0.9999288 0.99175 -0.9920539 0.9999288 0.99175 -0.9921345 0.9999288 0.99175 -0.9922364 0.9999288 0.99175 -0.9923654 0.9999288 0.99175 -0.9925286 0.9999288 0.99175 -0.992735 0.9999288 0.99175 -0.9929962 0.9999288 0.99175 -0.9933266 0.9999288 0.99175 -0.9937446 0.9999288 0.99175 -0.9942735 0.9999288 0.99175 -0.9949426 0.9999288 0.99175 -0.9957891 0.9999288 0.99175 -0.9968599 0.9999288 0.99175 -0.9982148 0.9999288 0.99175 -0.9999288 0.9999288 0.99175 -0.9999437 0.9985869 0.9934694 -0.9934695 0.9999437 0.9934695 -0.9934695 0.9999437 0.9934695 -0.9934695 0.9999437 0.9934695 -0.9934695 0.9999437 0.9934695 -0.9934695 0.9999437 0.9934695 -0.9934695 0.9999437 0.9934695 -0.9934695 0.9999437 0.9934695 -0.9934694 0.9999437 0.9934694 -0.9934695 0.9999437 0.9934694 -0.9934695 0.9999437 0.9934694 -0.9934695 0.9999437 0.9934694 -0.9934695 0.9999437 0.9934694 -0.9934696 0.9999437 0.9934694 -0.9934696 0.9999437 0.9934694 -0.9934697 0.9999437 0.9934694 -0.9934698 0.9999437 0.9934694 -0.9934699 0.9999437 0.9934694 -0.9934701 0.9999437 0.9934694 -0.9934702 0.9999437 0.9934694 -0.9934705 0.9999437 0.9934694 -0.9934707 0.9999437 0.9934694 -0.9934711 0.9999437 0.9934694 -0.9934716 0.9999437 0.9934694 -0.9934721 0.9999437 0.9934694 -0.9934729 0.9999437 0.9934694 -0.9934738 0.9999437 0.9934694 -0.993475 0.9999437 0.9934694 -0.9934764 0.9999437 0.9934694 -0.9934783 0.9999437 0.9934694 -0.9934807 0.9999437 0.9934694 -0.9934837 0.9999437 0.9934694 -0.9934875 0.9999437 0.9934694 -0.9934923 0.9999437 0.9934694 -0.9934984 0.9999437 0.9934694 -0.993506 0.9999437 0.9934694 -0.9935158 0.9999437 0.9934694 -0.9935281 0.9999437 0.9934694 -0.9935436 0.9999437 0.9934694 -0.9935633 0.9999437 0.9934694 -0.9935882 0.9999437 0.9934694 -0.9936197 0.9999437 0.9934694 -0.9936596 0.9999437 0.9934694 -0.99371 0.9999437 0.9934694 -0.9937738 0.9999437 0.9934694 -0.9938545 0.9999437 0.9934694 -0.9939566 0.9999437 0.9934694 -0.9940858 0.9999437 0.9934694 -0.9942492 0.9999437 0.9934694 -0.9944559 0.9999437 0.9934694 -0.9947175 0.9999437 0.9934694 -0.9950484 0.9999437 0.9934694 -0.995467 0.9999437 0.9934694 -0.9959967 0.9999437 0.9934694 -0.9966667 0.9999437 0.9934694 -0.9975144 0.9999437 0.9934694 -0.9985869 0.9999437 0.9934694 -0.9999437 0.9999437 0.9934694 -0.0000238 0.0000238 0.0108885 -0.0005417 0.0000238 0.0108885 -0.0011968 0.0000238 0.0108885 -0.0020256 0.0000238 0.0108885 -0.0030742 0.0000238 0.0108885 -0.0044007 0.0000238 0.0108885 -0.006079 0.0000238 0.0108885 -0.0082023 0.0000238 0.0108885 -0.0108885 0.0000238 0.0108885 -0.0142868 0.0000238 0.0108885 -0.0185862 0.0000238 0.0108885 -0.0240255 0.0000238 0.0108885 -0.0309069 0.0000238 0.0108885 -0.0396127 0.0000238 0.0108885 -0.0506267 0.0000238 0.0108885 -0.0645609 0.0000238 0.0108885 -0.0821895 0.0000238 0.0108885 -0.1044919 0.0000238 0.0108885 -0.1327073 0.0000238 0.0108885 -0.1684036 0.0000238 0.0108885 -0.2135639 0.0000238 0.0108885 -0.2706977 0.0000238 0.0108885 -0.3429792 0.0000238 0.0108885 -0.4344249 0.0000238 0.0108885 -0.5501155 0.0000238 0.0108885 -0.6964791 0.0000238 0.0108885 -0.8407292 0.0051514 0.0154486 -0.9033413 0.0279321 0.0364554 -0.9354466 0.0624569 0.0691729 -0.9545467 0.1059991 0.1111575 -0.9669269 0.1572498 0.1611395 -0.9754027 0.2151269 0.2180133 -0.9814251 0.2783684 0.2804779 -0.9858181 0.3454107 0.3469293 -0.9890841 0.4144197 0.4154968 -0.9915469 0.4834235 0.4841762 -0.993424 0.5504963 0.5510149 -0.9948662 0.6139459 0.6142984 -0.9959813 0.6724572 0.6726938 -0.9968475 0.7251659 0.725323 -0.997523 0.7716588 0.771762 -0.9980513 0.8119154 0.8119826 -0.9984653 0.8462171 0.8462605 -0.9987905 0.8750477 0.8750756 -0.9990461 0.8990028 0.8990206 -0.9992474 0.9187175 0.9187289 -0.999406 0.9348153 0.9348225 -0.999531 0.9478754 0.9478799 -0.9996296 0.958416 0.9584189 -0.9997074 0.9668873 0.9668891 -0.9997689 0.9736726 0.9736738 -0.9998174 0.9790927 0.9790934 -0.9998557 0.9834129 0.9834134 -0.999886 0.9868505 0.9868508 -0.9999099 0.989582 0.9895822 -0.9999288 0.9917501 0.9917502 -0.9999437 0.9934695 0.9934696 -0.0000238 0.0005417 0.0108885 -0.0000382 0.0000382 0.0103849 -0.0006933 0.0000382 0.0103849 -0.0015221 0.0000382 0.0103849 -0.0025707 0.0000382 0.0103849 -0.0038972 0.0000382 0.0103849 -0.0055755 0.0000382 0.0103849 -0.0076988 0.0000382 0.0103849 -0.0103849 0.0000382 0.0103849 -0.0137833 0.0000382 0.0103849 -0.0180827 0.0000382 0.0103849 -0.023522 0.0000382 0.0103849 -0.0304033 0.0000382 0.0103849 -0.0391092 0.0000382 0.0103849 -0.0501232 0.0000382 0.0103849 -0.0640574 0.0000382 0.0103849 -0.081686 0.0000382 0.0103849 -0.1039884 0.0000382 0.0103849 -0.1322038 0.0000382 0.0103849 -0.1679 0.0000382 0.0103849 -0.2130604 0.0000382 0.0103849 -0.2701941 0.0000382 0.0103849 -0.3424757 0.0000382 0.0103849 -0.4339214 0.0000382 0.0103849 -0.549612 0.0000382 0.0103849 -0.6959756 0.0000382 0.0103849 -0.8405071 0.0051286 0.0149384 -0.9032596 0.0278872 0.0360076 -0.9354101 0.0624063 0.0688046 -0.9545286 0.1059489 0.1108631 -0.9669173 0.1572031 0.1609084 -0.9753975 0.2150852 0.2178347 -0.9814221 0.2783325 0.2803419 -0.9858163 0.3453807 0.3468273 -0.9890831 0.4143955 0.4154214 -0.9915463 0.4834045 0.4841214 -0.9934236 0.5504818 0.5509758 -0.994866 0.6139352 0.6142709 -0.9959811 0.6724495 0.6726748 -0.9968474 0.7251605 0.7253101 -0.997523 0.7716551 0.7717534 -0.9980512 0.8119128 0.8119769 -0.9984653 0.8462154 0.8462568 -0.9987905 0.8750466 0.8750731 -0.9990461 0.899002 0.899019 -0.9992474 0.918717 0.9187278 -0.999406 0.9348149 0.9348218 -0.999531 0.9478752 0.9478795 -0.9996296 0.9584159 0.9584186 -0.9997074 0.9668872 0.966889 -0.9997689 0.9736726 0.9736737 -0.9998174 0.9790927 0.9790934 -0.9998557 0.9834129 0.9834133 -0.999886 0.9868505 0.9868508 -0.9999099 0.989582 0.9895822 -0.9999288 0.9917501 0.9917502 -0.9999437 0.9934695 0.9934695 -0.0000238 0.0011968 0.0108885 -0.0000382 0.0006933 0.0103849 -0.0000611 0.0000611 0.0097527 -0.0008899 0.0000611 0.0097527 -0.0019385 0.0000611 0.0097527 -0.003265 0.0000611 0.0097527 -0.0049433 0.0000611 0.0097527 -0.0070666 0.0000611 0.0097527 -0.0097527 0.0000611 0.0097527 -0.0131511 0.0000611 0.0097527 -0.0174505 0.0000611 0.0097527 -0.0228898 0.0000611 0.0097527 -0.0297711 0.0000611 0.0097527 -0.038477 0.0000611 0.0097527 -0.049491 0.0000611 0.0097527 -0.0634252 0.0000611 0.0097527 -0.0810538 0.0000611 0.0097527 -0.1033562 0.0000611 0.0097527 -0.1315716 0.0000611 0.0097527 -0.1672678 0.0000611 0.0097527 -0.2124282 0.0000611 0.0097527 -0.2695619 0.0000611 0.0097527 -0.3418435 0.0000611 0.0097527 -0.4332891 0.0000611 0.0097527 -0.5489798 0.0000611 0.0097527 -0.6953434 0.0000611 0.0097527 -0.8402274 0.0051047 0.0142974 -0.9031567 0.0278347 0.035445 -0.9353643 0.0623458 0.0683418 -0.9545059 0.1058883 0.1104932 -0.9669053 0.1571463 0.1606182 -0.9753908 0.2150342 0.2176104 -0.9814183 0.2782884 0.280171 -0.9858141 0.3453439 0.3466991 -0.9890818 0.4143657 0.4153268 -0.9915455 0.4833811 0.4840527 -0.9934231 0.550464 0.5509267 -0.9948657 0.6139219 0.6142364 -0.9959809 0.6724399 0.672651 -0.9968473 0.7251537 0.7252939 -0.9975229 0.7716504 0.7717425 -0.9980512 0.8119096 0.8119696 -0.9984653 0.8462132 0.846252 -0.9987904 0.8750451 0.8750701 -0.9990461 0.8990011 0.899017 -0.9992474 0.9187164 0.9187266 -0.999406 0.9348146 0.934821 -0.999531 0.947875 0.947879 -0.9996296 0.9584157 0.9584183 -0.9997074 0.9668871 0.9668888 -0.9997689 0.9736725 0.9736735 -0.9998174 0.9790927 0.9790933 -0.9998557 0.9834129 0.9834133 -0.999886 0.9868505 0.9868507 -0.9999099 0.989582 0.9895821 -0.9999288 0.9917501 0.9917502 -0.9999437 0.9934695 0.9934695 -0.0000238 0.0020256 0.0108885 -0.0000382 0.0015221 0.0103849 -0.0000611 0.0008899 0.0097527 -0.0000978 0.0000978 0.0089606 -0.0011463 0.0000978 0.0089606 -0.0024729 0.0000978 0.0089606 -0.0041512 0.0000978 0.0089606 -0.0062744 0.0000978 0.0089606 -0.0089606 0.0000978 0.0089606 -0.012359 0.0000978 0.0089606 -0.0166583 0.0000978 0.0089606 -0.0220976 0.0000978 0.0089606 -0.028979 0.0000978 0.0089606 -0.0376849 0.0000978 0.0089606 -0.0486989 0.0000978 0.0089606 -0.0626331 0.0000978 0.0089606 -0.0802616 0.0000978 0.0089606 -0.102564 0.0000978 0.0089606 -0.1307795 0.0000978 0.0089606 -0.1664757 0.0000978 0.0089606 -0.2116361 0.0000978 0.0089606 -0.2687698 0.0000978 0.0089606 -0.3410514 0.0000978 0.0089606 -0.432497 0.0000978 0.0089606 -0.5481876 0.0000978 0.0089606 -0.6945513 0.0000978 0.0089606 -0.8398756 0.0050826 0.0134938 -0.9030276 0.0277752 0.0347393 -0.9353068 0.0622749 0.0677615 -0.9544774 0.1058162 0.1100294 -0.9668902 0.1570779 0.1602543 -0.9753825 0.2149725 0.2173291 -0.9814136 0.2782347 0.2799568 -0.9858113 0.3452987 0.3465384 -0.9890801 0.414329 0.4152081 -0.9915446 0.4833522 0.4839665 -0.9934225 0.5504419 0.5508651 -0.9948653 0.6139056 0.6141932 -0.9959807 0.672428 0.6726211 -0.9968472 0.7251454 0.7252735 -0.9975228 0.7716446 0.7717288 -0.9980511 0.8119057 0.8119606 -0.9984653 0.8462106 0.846246 -0.9987904 0.8750434 0.8750662 -0.9990461 0.899 0.8990145 -0.9992474 0.9187157 0.9187249 -0.999406 0.9348141 0.93482 -0.999531 0.9478746 0.9478784 -0.9996296 0.9584155 0.9584178 -0.9997074 0.966887 0.9668885 -0.9997689 0.9736724 0.9736734 -0.9998174 0.9790926 0.9790932 -0.9998557 0.9834129 0.9834132 -0.999886 0.9868505 0.9868507 -0.9999099 0.989582 0.9895821 -0.9999288 0.9917501 0.9917502 -0.9999437 0.9934695 0.9934695 -0.0000238 0.0030742 0.0108885 -0.0000382 0.0025707 0.0103849 -0.0000611 0.0019385 0.0097527 -0.0000978 0.0011463 0.0089606 -0.0001565 0.0001565 0.0079707 -0.001483 0.0001565 0.0079707 -0.0031613 0.0001565 0.0079707 -0.0052846 0.0001565 0.0079707 -0.0079707 0.0001565 0.0079707 -0.0113691 0.0001565 0.0079707 -0.0156685 0.0001565 0.0079707 -0.0211078 0.0001565 0.0079707 -0.0279891 0.0001565 0.0079707 -0.036695 0.0001565 0.0079707 -0.047709 0.0001565 0.0079707 -0.0616432 0.0001565 0.0079707 -0.0792718 0.0001565 0.0079707 -0.1015742 0.0001565 0.0079707 -0.1297896 0.0001565 0.0079707 -0.1654858 0.0001565 0.0079707 -0.2106462 0.0001565 0.0079707 -0.2677799 0.0001565 0.0079707 -0.3400615 0.0001565 0.0079707 -0.4315072 0.0001565 0.0079707 -0.5471978 0.0001565 0.0079707 -0.6935614 0.0001565 0.0079707 -0.8394338 0.0050676 0.0124887 -0.9028657 0.0277111 0.0338564 -0.9352348 0.0621943 0.0670354 -0.9544418 0.1057322 0.1094494 -0.9668714 0.1569971 0.1597992 -0.9753721 0.2148987 0.2169775 -0.9814076 0.2781701 0.279689 -0.9858079 0.3452442 0.3463375 -0.9890781 0.4142845 0.4150598 -0.9915433 0.4833171 0.4838588 -0.9934218 0.550415 0.5507882 -0.9948649 0.6138855 0.6141392 -0.9959804 0.6724135 0.6725838 -0.996847 0.7251351 0.7252481 -0.9975227 0.7716375 0.7717117 -0.9980511 0.8119009 0.8119492 -0.9984652 0.8462073 0.8462386 -0.9987904 0.8750412 0.8750613 -0.9990461 0.8989986 0.8990114 -0.9992474 0.9187148 0.9187229 -0.999406 0.9348135 0.9348187 -0.999531 0.9478743 0.9478775 -0.9996296 0.9584153 0.9584173 -0.9997074 0.9668869 0.9668882 -0.9997689 0.9736723 0.9736732 -0.9998174 0.9790925 0.9790931 -0.9998557 0.9834128 0.9834131 -0.999886 0.9868504 0.9868506 -0.9999099 0.989582 0.9895821 -0.9999288 0.9917501 0.9917501 -0.9999437 0.9934695 0.9934695 -0.0000238 0.0044007 0.0108885 -0.0000382 0.0038972 0.0103849 -0.0000611 0.003265 0.0097527 -0.0000978 0.0024729 0.0089606 -0.0001565 0.001483 0.0079707 -0.0002504 0.0002504 0.0067381 -0.0019287 0.0002504 0.0067381 -0.004052 0.0002504 0.0067381 -0.0067381 0.0002504 0.0067381 -0.0101365 0.0002504 0.0067381 -0.0144359 0.0002504 0.0067381 -0.0198752 0.0002504 0.0067381 -0.0267565 0.0002504 0.0067381 -0.0354624 0.0002504 0.0067381 -0.0464764 0.0002504 0.0067381 -0.0604106 0.0002504 0.0067381 -0.0780392 0.0002504 0.0067381 -0.1003416 0.0002504 0.0067381 -0.128557 0.0002504 0.0067381 -0.1642532 0.0002504 0.0067381 -0.2094136 0.0002504 0.0067381 -0.2665473 0.0002504 0.0067381 -0.3388289 0.0002504 0.0067381 -0.4302746 0.0002504 0.0067381 -0.5459652 0.0002504 0.0067381 -0.6923288 0.0002504 0.0067381 -0.8388802 0.0050694 0.0112359 -0.9026634 0.0276479 0.0327552 -0.9351449 0.0621069 0.06613 -0.9543974 0.1056375 0.1087261 -0.9668479 0.156904 0.159232 -0.9753591 0.2148124 0.2165392 -0.9814002 0.2780936 0.2793553 -0.9858036 0.3451791 0.3460872 -0.9890755 0.4142311 0.414875 -0.9915418 0.4832747 0.4837246 -0.9934209 0.5503825 0.5506924 -0.9948643 0.6138613 0.6140719 -0.9959801 0.6723959 0.6725373 -0.9968468 0.7251226 0.7252164 -0.9975226 0.7716288 0.7716905 -0.998051 0.8118949 0.8119351 -0.9984652 0.8462034 0.8462293 -0.9987904 0.8750386 0.8750553 -0.9990461 0.8989969 0.8990075 -0.9992474 0.9187137 0.9187204 -0.9994059 0.9348128 0.9348171 -0.999531 0.9478738 0.9478765 -0.9996296 0.958415 0.9584167 -0.9997074 0.9668867 0.9668878 -0.9997689 0.9736722 0.9736729 -0.9998174 0.9790925 0.9790929 -0.9998557 0.9834128 0.983413 -0.999886 0.9868504 0.9868506 -0.9999099 0.9895819 0.989582 -0.9999288 0.9917501 0.9917501 -0.9999437 0.9934695 0.9934695 -0.0000238 0.006079 0.0108885 -0.0000382 0.0055755 0.0103849 -0.0000611 0.0049433 0.0097527 -0.0000978 0.0041512 0.0089606 -0.0001565 0.0031613 0.0079707 -0.0002504 0.0019287 0.0067381 -0.0004008 0.0004008 0.0052103 -0.0025241 0.0004008 0.0052103 -0.0052103 0.0004008 0.0052103 -0.0086086 0.0004008 0.0052103 -0.012908 0.0004008 0.0052103 -0.0183473 0.0004008 0.0052103 -0.0252287 0.0004008 0.0052103 -0.0339345 0.0004008 0.0052103 -0.0449485 0.0004008 0.0052103 -0.0588827 0.0004008 0.0052103 -0.0765113 0.0004008 0.0052103 -0.0988137 0.0004008 0.0052103 -0.1270291 0.0004008 0.0052103 -0.1627254 0.0004008 0.0052103 -0.2078857 0.0004008 0.0052103 -0.2650195 0.0004008 0.0052103 -0.337301 0.0004008 0.0052103 -0.4287467 0.0004008 0.0052103 -0.5444373 0.0004008 0.0052103 -0.6908009 0.0004008 0.0052103 -0.8381886 0.0051048 0.0096809 -0.9024114 0.0275966 0.0313876 -0.9350332 0.0620199 0.0650057 -0.9543421 0.1055364 0.1078283 -0.9668187 0.1568008 0.158528 -0.975343 0.2147144 0.2159954 -0.9813911 0.2780055 0.2789413 -0.9857982 0.3451032 0.3457767 -0.9890723 0.4141683 0.4146458 -0.9915399 0.4832246 0.4835582 -0.9934197 0.5503438 0.5505736 -0.9948636 0.6138323 0.6139885 -0.9959797 0.6723748 0.6724796 -0.9968465 0.7251076 0.7251772 -0.9975224 0.7716184 0.7716641 -0.9980509 0.8118878 0.8119176 -0.9984651 0.8461986 0.8462179 -0.9987903 0.8750355 0.8750478 -0.9990461 0.8989948 0.8990027 -0.9992473 0.9187123 0.9187173 -0.9994059 0.9348119 0.9348151 -0.999531 0.9478733 0.9478753 -0.9996296 0.9584146 0.9584159 -0.9997074 0.9668865 0.9668873 -0.9997689 0.9736721 0.9736726 -0.9998174 0.9790924 0.9790927 -0.9998557 0.9834127 0.9834129 -0.999886 0.9868504 0.9868505 -0.9999099 0.9895819 0.989582 -0.9999288 0.99175 0.9917501 -0.9999437 0.9934695 0.9934695 -0.0000238 0.0082023 0.0108885 -0.0000382 0.0076988 0.0103849 -0.0000611 0.0070666 0.0097527 -0.0000978 0.0062744 0.0089606 -0.0001565 0.0052846 0.0079707 -0.0002504 0.004052 0.0067381 -0.0004008 0.0025241 0.0052103 -0.0006416 0.0006416 0.0033277 -0.0033277 0.0006416 0.0033277 -0.0067261 0.0006416 0.0033277 -0.0110255 0.0006416 0.0033277 -0.0164648 0.0006416 0.0033277 -0.0233461 0.0006416 0.0033277 -0.032052 0.0006416 0.0033277 -0.043066 0.0006416 0.0033277 -0.0570002 0.0006416 0.0033277 -0.0746288 0.0006416 0.0033277 -0.0969312 0.0006416 0.0033277 -0.1251466 0.0006416 0.0033277 -0.1608428 0.0006416 0.0033277 -0.2060032 0.0006416 0.0033277 -0.2631369 0.0006416 0.0033277 -0.3354185 0.0006416 0.0033277 -0.4268641 0.0006416 0.0033277 -0.5425548 0.0006416 0.0033277 -0.6889184 0.0006416 0.0033277 -0.8373283 0.0052028 0.0077619 -0.9020992 0.0275778 0.0296985 -0.9348949 0.0619473 0.0636174 -0.9542739 0.1054384 0.10672 -0.9667827 0.1566936 0.1576592 -0.9753231 0.2146085 0.2153246 -0.9813797 0.2779077 0.2784307 -0.9857916 0.3450175 0.3453938 -0.9890684 0.4140964 0.4143632 -0.9915376 0.4831666 0.483353 -0.9934183 0.5502987 0.5504271 -0.9948628 0.6137984 0.6138856 -0.9959791 0.67235 0.6724086 -0.9968462 0.7250899 0.7251288 -0.9975222 0.7716061 0.7716316 -0.9980508 0.8118794 0.8118961 -0.998465 0.8461929 0.8462037 -0.9987903 0.8750317 0.8750386 -0.999046 0.8989923 0.8989967 -0.9992473 0.9187107 0.9187135 -0.9994059 0.9348109 0.9348127 -0.999531 0.9478726 0.9478737 -0.9996296 0.9584142 0.9584149 -0.9997074 0.9668862 0.9668866 -0.9997689 0.9736719 0.9736722 -0.9998174 0.9790923 0.9790924 -0.9998557 0.9834127 0.9834128 -0.999886 0.9868503 0.9868504 -0.9999099 0.9895819 0.9895819 -0.9999288 0.99175 0.9917501 -0.9999437 0.9934694 0.9934695 -0.0000238 0.0108885 0.0108885 -0.0000382 0.0103849 0.0103849 -0.0000611 0.0097527 0.0097527 -0.0000978 0.0089606 0.0089606 -0.0001565 0.0079707 0.0079707 -0.0002504 0.0067381 0.0067381 -0.0004008 0.0052103 0.0052103 -0.0006416 0.0033277 0.0033277 -0.0010268 0.0010268 0.0010268 -0.0044252 0.0010268 0.0010268 -0.0087246 0.0010268 0.0010268 -0.0141639 0.0010268 0.0010268 -0.0210452 0.0010268 0.0010268 -0.0297511 0.0010268 0.0010268 -0.0407651 0.0010268 0.0010268 -0.0546993 0.0010268 0.0010268 -0.0723279 0.0010268 0.0010268 -0.0946303 0.0010268 0.0010268 -0.1228457 0.0010268 0.0010268 -0.1585419 0.0010268 0.0010268 -0.2037023 0.0010268 0.0010268 -0.260836 0.0010268 0.0010268 -0.3331176 0.0010268 0.0010268 -0.4245633 0.0010268 0.0010268 -0.5402539 0.0010268 0.0010268 -0.6866175 0.0010268 0.0010268 -0.8362644 0.0054121 0.0054121 -0.9017148 0.0276281 0.0276281 -0.9347252 0.061916 0.061916 -0.9541902 0.1053624 0.1053624 -0.9667385 0.1565954 0.1565954 -0.9752987 0.2145034 0.2145034 -0.9813659 0.2778058 0.2778058 -0.9857835 0.3449254 0.3449254 -0.9890637 0.4140176 0.4140176 -0.9915347 0.4831021 0.4831021 -0.9934166 0.550248 0.550248 -0.9948617 0.6137599 0.6137599 -0.9959785 0.6723217 0.6723217 -0.9968458 0.7250697 0.7250697 -0.997522 0.7715919 0.7715919 -0.9980506 0.8118697 0.8118697 -0.9984649 0.8461864 0.8461864 -0.9987902 0.8750274 0.8750274 -0.999046 0.8989895 0.8989895 -0.9992473 0.9187089 0.9187089 -0.9994059 0.9348097 0.9348097 -0.999531 0.9478718 0.9478718 -0.9996296 0.9584137 0.9584137 -0.9997074 0.9668859 0.9668859 -0.9997689 0.9736717 0.9736717 -0.9998174 0.9790921 0.9790921 -0.9998557 0.9834126 0.9834126 -0.999886 0.9868503 0.9868503 -0.9999099 0.9895819 0.9895819 -0.9999288 0.99175 0.99175 -0.9999437 0.9934694 0.9934694 -0.0000238 0.0142868 0.0108885 -0.0000382 0.0137833 0.0103849 -0.0000611 0.0131511 0.0097527 -0.0000978 0.012359 0.0089606 -0.0001565 0.0113691 0.0079707 -0.0002504 0.0101365 0.0067381 -0.0004008 0.0086086 0.0052103 -0.0006416 0.0067261 0.0033277 -0.0010268 0.0044252 0.0010268 -0.0044252 0.0044252 0.0010268 -0.0087246 0.0044252 0.0010268 -0.0141639 0.0044252 0.0010268 -0.0210452 0.0044252 0.0010268 -0.0297511 0.0044252 0.0010268 -0.0407651 0.0044252 0.0010268 -0.0546993 0.0044252 0.0010268 -0.0723279 0.0044252 0.0010268 -0.0946303 0.0044252 0.0010268 -0.1228457 0.0044252 0.0010268 -0.1585419 0.0044252 0.0010268 -0.2037023 0.0044252 0.0010268 -0.260836 0.0044252 0.0010268 -0.3331176 0.0044252 0.0010268 -0.4245633 0.0044252 0.0010268 -0.5402539 0.0044252 0.0010268 -0.6866175 0.0044252 0.0010268 -0.8362644 0.0086547 0.0054121 -0.9017148 0.0303162 0.0276281 -0.9347252 0.0640325 0.061916 -0.9541902 0.1069863 0.1053624 -0.9667385 0.1578187 0.1565954 -0.9752987 0.2154103 0.2145034 -0.9813659 0.2784681 0.2778058 -0.9857835 0.3454019 0.3449254 -0.9890637 0.4143553 0.4140176 -0.9915347 0.4833381 0.4831021 -0.9934166 0.5504105 0.550248 -0.9948617 0.6138703 0.6137599 -0.9959785 0.6723958 0.6723217 -0.9968458 0.7251188 0.7250697 -0.997522 0.7716242 0.7715919 -0.9980506 0.8118907 0.8118697 -0.9984649 0.8462 0.8461864 -0.9987902 0.8750361 0.8750274 -0.999046 0.8989951 0.8989895 -0.9992473 0.9187124 0.9187089 -0.9994059 0.9348119 0.9348097 -0.999531 0.9478733 0.9478718 -0.9996296 0.9584146 0.9584137 -0.9997074 0.9668864 0.9668859 -0.9997689 0.9736721 0.9736717 -0.9998174 0.9790924 0.9790921 -0.9998557 0.9834127 0.9834126 -0.999886 0.9868504 0.9868503 -0.9999099 0.9895819 0.9895819 -0.9999288 0.99175 0.99175 -0.9999437 0.9934695 0.9934694 -0.0000238 0.0185862 0.0108885 -0.0000382 0.0180827 0.0103849 -0.0000611 0.0174505 0.0097527 -0.0000978 0.0166583 0.0089606 -0.0001565 0.0156685 0.0079707 -0.0002504 0.0144359 0.0067381 -0.0004008 0.012908 0.0052103 -0.0006416 0.0110255 0.0033277 -0.0010268 0.0087246 0.0010268 -0.0044252 0.0087246 0.0010268 -0.0087246 0.0087246 0.0010268 -0.0141639 0.0087246 0.0010268 -0.0210452 0.0087246 0.0010268 -0.0297511 0.0087246 0.0010268 -0.0407651 0.0087246 0.0010268 -0.0546993 0.0087246 0.0010268 -0.0723279 0.0087246 0.0010268 -0.0946303 0.0087246 0.0010268 -0.1228457 0.0087246 0.0010268 -0.1585419 0.0087246 0.0010268 -0.2037023 0.0087246 0.0010268 -0.260836 0.0087246 0.0010268 -0.3331176 0.0087246 0.0010268 -0.4245633 0.0087246 0.0010268 -0.5402539 0.0087246 0.0010268 -0.6866175 0.0087246 0.0010268 -0.8362644 0.012757 0.0054121 -0.9017148 0.0337171 0.0276281 -0.9347252 0.0667103 0.061916 -0.9541902 0.1090407 0.1053624 -0.9667385 0.1593662 0.1565954 -0.9752987 0.2165577 0.2145034 -0.9813659 0.279306 0.2778058 -0.9857835 0.3460047 0.3449254 -0.9890637 0.4147826 0.4140176 -0.9915347 0.4836366 0.4831021 -0.9934166 0.5506161 0.550248 -0.9948617 0.61401 0.6137599 -0.9959785 0.6724896 0.6723217 -0.9968458 0.7251811 0.7250697 -0.997522 0.7716651 0.7715919 -0.9980506 0.8119174 0.8118697 -0.9984649 0.8462172 0.8461864 -0.9987902 0.8750472 0.8750274 -0.999046 0.8990021 0.8989895 -0.9992473 0.9187169 0.9187089 -0.9994059 0.9348148 0.9348097 -0.999531 0.9478751 0.9478718 -0.9996296 0.9584157 0.9584137 -0.9997074 0.9668872 0.9668859 -0.9997689 0.9736725 0.9736717 -0.9998174 0.9790927 0.9790921 -0.9998557 0.9834129 0.9834126 -0.999886 0.9868505 0.9868503 -0.9999099 0.989582 0.9895819 -0.9999288 0.9917501 0.99175 -0.9999437 0.9934695 0.9934694 -0.0000238 0.0240255 0.0108885 -0.0000382 0.023522 0.0103849 -0.0000611 0.0228898 0.0097527 -0.0000978 0.0220976 0.0089606 -0.0001565 0.0211078 0.0079707 -0.0002504 0.0198752 0.0067381 -0.0004008 0.0183473 0.0052103 -0.0006416 0.0164648 0.0033277 -0.0010268 0.0141639 0.0010268 -0.0044252 0.0141639 0.0010268 -0.0087246 0.0141639 0.0010268 -0.0141639 0.0141639 0.0010268 -0.0210452 0.0141639 0.0010268 -0.0297511 0.0141639 0.0010268 -0.0407651 0.0141639 0.0010268 -0.0546993 0.0141639 0.0010268 -0.0723279 0.0141639 0.0010268 -0.0946303 0.0141639 0.0010268 -0.1228457 0.0141639 0.0010268 -0.1585419 0.0141639 0.0010268 -0.2037023 0.0141639 0.0010268 -0.260836 0.0141639 0.0010268 -0.3331176 0.0141639 0.0010268 -0.4245633 0.0141639 0.0010268 -0.5402539 0.0141639 0.0010268 -0.6866175 0.0141639 0.0010268 -0.8362644 0.017947 0.0054121 -0.9017148 0.0380196 0.0276281 -0.9347252 0.0700979 0.061916 -0.9541902 0.1116399 0.1053624 -0.9667385 0.1613241 0.1565954 -0.9752987 0.2180092 0.2145034 -0.9813659 0.2803661 0.2778058 -0.9857835 0.3467674 0.3449254 -0.9890637 0.4153232 0.4140176 -0.9915347 0.4840142 0.4831021 -0.9934166 0.5508762 0.550248 -0.9948617 0.6141868 0.6137599 -0.9959785 0.6726082 0.6723217 -0.9968458 0.7252598 0.7250697 -0.997522 0.7717168 0.7715919 -0.9980506 0.811951 0.8118697 -0.9984649 0.846239 0.8461864 -0.9987902 0.8750611 0.8750274 -0.999046 0.8990111 0.8989895 -0.9992473 0.9187226 0.9187089 -0.9994059 0.9348184 0.9348097 -0.999531 0.9478773 0.9478718 -0.9996296 0.9584172 0.9584137 -0.9997074 0.9668881 0.9668859 -0.9997689 0.9736731 0.9736717 -0.9998174 0.979093 0.9790921 -0.9998557 0.9834131 0.9834126 -0.999886 0.9868506 0.9868503 -0.9999099 0.9895821 0.9895819 -0.9999288 0.9917501 0.99175 -0.9999437 0.9934695 0.9934694 -0.0000238 0.0309069 0.0108885 -0.0000382 0.0304033 0.0103849 -0.0000611 0.0297711 0.0097527 -0.0000978 0.028979 0.0089606 -0.0001565 0.0279891 0.0079707 -0.0002504 0.0267565 0.0067381 -0.0004008 0.0252287 0.0052103 -0.0006416 0.0233461 0.0033277 -0.0010268 0.0210452 0.0010268 -0.0044252 0.0210452 0.0010268 -0.0087246 0.0210452 0.0010268 -0.0141639 0.0210452 0.0010268 -0.0210452 0.0210452 0.0010268 -0.0297511 0.0210452 0.0010268 -0.0407651 0.0210452 0.0010268 -0.0546993 0.0210452 0.0010268 -0.0723279 0.0210452 0.0010268 -0.0946303 0.0210452 0.0010268 -0.1228457 0.0210452 0.0010268 -0.1585419 0.0210452 0.0010268 -0.2037023 0.0210452 0.0010268 -0.260836 0.0210452 0.0010268 -0.3331176 0.0210452 0.0010268 -0.4245633 0.0210452 0.0010268 -0.5402539 0.0210452 0.0010268 -0.6866175 0.0210452 0.0010268 -0.8362644 0.024513 0.0054121 -0.9017148 0.0434629 0.0276281 -0.9347252 0.0743837 0.061916 -0.9541902 0.1149282 0.1053624 -0.9667385 0.1638011 0.1565954 -0.9752987 0.2198456 0.2145034 -0.9813659 0.2817072 0.2778058 -0.9857835 0.3477322 0.3449254 -0.9890637 0.4160072 0.4140176 -0.9915347 0.484492 0.4831021 -0.9934166 0.5512052 0.550248 -0.9948617 0.6144104 0.6137599 -0.9959785 0.6727582 0.6723217 -0.9968458 0.7253594 0.7250697 -0.997522 0.7717822 0.7715919 -0.9980506 0.8119937 0.8118697 -0.9984649 0.8462665 0.8461864 -0.9987902 0.8750788 0.8750274 -0.999046 0.8990224 0.8989895 -0.9992473 0.9187298 0.9187089 -0.9994059 0.934823 0.9348097 -0.999531 0.9478802 0.9478718 -0.9996296 0.958419 0.9584137 -0.9997074 0.9668892 0.9668859 -0.9997689 0.9736738 0.9736717 -0.9998174 0.9790935 0.9790921 -0.9998557 0.9834134 0.9834126 -0.999886 0.9868508 0.9868503 -0.9999099 0.9895822 0.9895819 -0.9999288 0.9917502 0.99175 -0.9999437 0.9934696 0.9934694 -0.0000238 0.0396127 0.0108885 -0.0000382 0.0391092 0.0103849 -0.0000611 0.038477 0.0097527 -0.0000978 0.0376849 0.0089606 -0.0001565 0.036695 0.0079707 -0.0002504 0.0354624 0.0067381 -0.0004008 0.0339345 0.0052103 -0.0006416 0.032052 0.0033277 -0.0010268 0.0297511 0.0010268 -0.0044252 0.0297511 0.0010268 -0.0087246 0.0297511 0.0010268 -0.0141639 0.0297511 0.0010268 -0.0210452 0.0297511 0.0010268 -0.0297511 0.0297511 0.0010268 -0.0407651 0.0297511 0.0010268 -0.0546993 0.0297511 0.0010268 -0.0723279 0.0297511 0.0010268 -0.0946303 0.0297511 0.0010268 -0.1228457 0.0297511 0.0010268 -0.1585419 0.0297511 0.0010268 -0.2037023 0.0297511 0.0010268 -0.260836 0.0297511 0.0010268 -0.3331176 0.0297511 0.0010268 -0.4245633 0.0297511 0.0010268 -0.5402539 0.0297511 0.0010268 -0.6866175 0.0297511 0.0010268 -0.8362644 0.0328199 0.0054121 -0.9017148 0.0503493 0.0276281 -0.9347252 0.0798059 0.061916 -0.9541902 0.1190883 0.1053624 -0.9667385 0.1669347 0.1565954 -0.9752987 0.2221689 0.2145034 -0.9813659 0.2834038 0.2778058 -0.9857835 0.3489529 0.3449254 -0.9890637 0.4168724 0.4140176 -0.9915347 0.4850964 0.4831021 -0.9934166 0.5516215 0.550248 -0.9948617 0.6146932 0.6137599 -0.9959785 0.6729481 0.6723217 -0.9968458 0.7254853 0.7250697 -0.997522 0.771865 0.7715919 -0.9980506 0.8120476 0.8118697 -0.9984649 0.8463014 0.8461864 -0.9987902 0.8751012 0.8750274 -0.999046 0.8990367 0.8989895 -0.9992473 0.9187389 0.9187089 -0.9994059 0.9348287 0.9348097 -0.999531 0.9478839 0.9478718 -0.9996296 0.9584213 0.9584137 -0.9997074 0.9668907 0.9668859 -0.9997689 0.9736747 0.9736717 -0.9998174 0.979094 0.9790921 -0.9998557 0.9834138 0.9834126 -0.999886 0.986851 0.9868503 -0.9999099 0.9895823 0.9895819 -0.9999288 0.9917503 0.99175 -0.9999437 0.9934696 0.9934694 -0.0000238 0.0506267 0.0108885 -0.0000382 0.0501232 0.0103849 -0.0000611 0.049491 0.0097527 -0.0000978 0.0486989 0.0089606 -0.0001565 0.047709 0.0079707 -0.0002504 0.0464764 0.0067381 -0.0004008 0.0449485 0.0052103 -0.0006416 0.043066 0.0033277 -0.0010268 0.0407651 0.0010268 -0.0044252 0.0407651 0.0010268 -0.0087246 0.0407651 0.0010268 -0.0141639 0.0407651 0.0010268 -0.0210452 0.0407651 0.0010268 -0.0297511 0.0407651 0.0010268 -0.0407651 0.0407651 0.0010268 -0.0546993 0.0407651 0.0010268 -0.0723279 0.0407651 0.0010268 -0.0946303 0.0407651 0.0010268 -0.1228457 0.0407651 0.0010268 -0.1585419 0.0407651 0.0010268 -0.2037023 0.0407651 0.0010268 -0.260836 0.0407651 0.0010268 -0.3331176 0.0407651 0.0010268 -0.4245633 0.0407651 0.0010268 -0.5402539 0.0407651 0.0010268 -0.6866175 0.0407651 0.0010268 -0.8362644 0.0433291 0.0054121 -0.9017148 0.0590616 0.0276281 -0.9347252 0.0866656 0.061916 -0.9541902 0.1243513 0.1053624 -0.9667385 0.1708992 0.1565954 -0.9752987 0.2251082 0.2145034 -0.9813659 0.2855503 0.2778058 -0.9857835 0.3504972 0.3449254 -0.9890637 0.4179671 0.4140176 -0.9915347 0.4858611 0.4831021 -0.9934166 0.5521481 0.550248 -0.9948617 0.6150511 0.6137599 -0.9959785 0.6731883 0.6723217 -0.9968458 0.7256447 0.7250697 -0.997522 0.7719697 0.7715919 -0.9980506 0.8121158 0.8118697 -0.9984649 0.8463455 0.8461864 -0.9987902 0.8751295 0.8750274 -0.999046 0.8990548 0.8989895 -0.9992473 0.9187504 0.9187089 -0.9994059 0.934836 0.9348097 -0.999531 0.9478885 0.9478718 -0.9996296 0.9584242 0.9584137 -0.9997074 0.9668925 0.9668859 -0.9997689 0.9736759 0.9736717 -0.9998174 0.9790948 0.9790921 -0.9998557 0.9834142 0.9834126 -0.999886 0.9868513 0.9868503 -0.9999099 0.9895825 0.9895819 -0.9999288 0.9917504 0.99175 -0.9999437 0.9934697 0.9934694 -0.0000238 0.0645609 0.0108885 -0.0000382 0.0640574 0.0103849 -0.0000611 0.0634252 0.0097527 -0.0000978 0.0626331 0.0089606 -0.0001565 0.0616432 0.0079707 -0.0002504 0.0604106 0.0067381 -0.0004008 0.0588827 0.0052103 -0.0006416 0.0570002 0.0033277 -0.0010268 0.0546993 0.0010268 -0.0044252 0.0546993 0.0010268 -0.0087246 0.0546993 0.0010268 -0.0141639 0.0546993 0.0010268 -0.0210452 0.0546993 0.0010268 -0.0297511 0.0546993 0.0010268 -0.0407651 0.0546993 0.0010268 -0.0546993 0.0546993 0.0010268 -0.0723279 0.0546993 0.0010268 -0.0946303 0.0546993 0.0010268 -0.1228457 0.0546993 0.0010268 -0.1585419 0.0546993 0.0010268 -0.2037023 0.0546993 0.0010268 -0.260836 0.0546993 0.0010268 -0.3331176 0.0546993 0.0010268 -0.4245633 0.0546993 0.0010268 -0.5402539 0.0546993 0.0010268 -0.6866175 0.0546993 0.0010268 -0.8362644 0.0566247 0.0054121 -0.9017148 0.0700837 0.0276281 -0.9347252 0.095344 0.061916 -0.9541902 0.1310098 0.1053624 -0.9667385 0.1759149 0.1565954 -0.9752987 0.2288268 0.2145034 -0.9813659 0.2882659 0.2778058 -0.9857835 0.352451 0.3449254 -0.9890637 0.419352 0.4140176 -0.9915347 0.4868285 0.4831021 -0.9934166 0.5528144 0.550248 -0.9948617 0.6155039 0.6137599 -0.9959785 0.6734921 0.6723217 -0.9968458 0.7258464 0.7250697 -0.997522 0.7721022 0.7715919 -0.9980506 0.8122021 0.8118697 -0.9984649 0.8464012 0.8461864 -0.9987902 0.8751654 0.8750274 -0.999046 0.8990777 0.8989895 -0.9992473 0.918765 0.9187089 -0.9994059 0.9348453 0.9348097 -0.999531 0.9478943 0.9478718 -0.9996296 0.9584279 0.9584137 -0.9997074 0.9668948 0.9668859 -0.9997689 0.9736773 0.9736717 -0.9998174 0.9790957 0.9790921 -0.9998557 0.9834148 0.9834126 -0.999886 0.9868517 0.9868503 -0.9999099 0.9895827 0.9895819 -0.9999288 0.9917505 0.99175 -0.9999437 0.9934698 0.9934694 -0.0000238 0.0821895 0.0108885 -0.0000382 0.081686 0.0103849 -0.0000611 0.0810538 0.0097527 -0.0000978 0.0802616 0.0089606 -0.0001565 0.0792718 0.0079707 -0.0002504 0.0780392 0.0067381 -0.0004008 0.0765113 0.0052103 -0.0006416 0.0746288 0.0033277 -0.0010268 0.0723279 0.0010268 -0.0044252 0.0723279 0.0010268 -0.0087246 0.0723279 0.0010268 -0.0141639 0.0723279 0.0010268 -0.0210452 0.0723279 0.0010268 -0.0297511 0.0723279 0.0010268 -0.0407651 0.0723279 0.0010268 -0.0546993 0.0723279 0.0010268 -0.0723279 0.0723279 0.0010268 -0.0946303 0.0723279 0.0010268 -0.1228457 0.0723279 0.0010268 -0.1585419 0.0723279 0.0010268 -0.2037023 0.0723279 0.0010268 -0.260836 0.0723279 0.0010268 -0.3331176 0.0723279 0.0010268 -0.4245633 0.0723279 0.0010268 -0.5402539 0.0723279 0.0010268 -0.6866175 0.0723279 0.0010268 -0.8362644 0.0734453 0.0054121 -0.9017148 0.0840281 0.0276281 -0.9347252 0.1063233 0.061916 -0.9541902 0.1394336 0.1053624 -0.9667385 0.1822603 0.1565954 -0.9752987 0.2335313 0.2145034 -0.9813659 0.2917015 0.2778058 -0.9857835 0.3549227 0.3449254 -0.9890637 0.4211041 0.4140176 -0.9915347 0.4880524 0.4831021 -0.9934166 0.5536574 0.550248 -0.9948617 0.6160767 0.6137599 -0.9959785 0.6738765 0.6723217 -0.9968458 0.7261015 0.7250697 -0.997522 0.7722698 0.7715919 -0.9980506 0.8123112 0.8118697 -0.9984649 0.8464718 0.8461864 -0.9987902 0.8752107 0.8750274 -0.999046 0.8991066 0.8989895 -0.9992473 0.9187834 0.9187089 -0.9994059 0.9348569 0.9348097 -0.999531 0.9479017 0.9478718 -0.9996296 0.9584325 0.9584137 -0.9997074 0.9668977 0.9668859 -0.9997689 0.9736792 0.9736717 -0.9998174 0.9790968 0.9790921 -0.9998557 0.9834155 0.9834126 -0.999886 0.9868521 0.9868503 -0.9999099 0.989583 0.9895819 -0.9999288 0.9917507 0.99175 -0.9999437 0.9934699 0.9934694 -0.0000238 0.1044919 0.0108885 -0.0000382 0.1039884 0.0103849 -0.0000611 0.1033562 0.0097527 -0.0000978 0.102564 0.0089606 -0.0001565 0.1015742 0.0079707 -0.0002504 0.1003416 0.0067381 -0.0004008 0.0988137 0.0052103 -0.0006416 0.0969312 0.0033277 -0.0010268 0.0946303 0.0010268 -0.0044252 0.0946303 0.0010268 -0.0087246 0.0946303 0.0010268 -0.0141639 0.0946303 0.0010268 -0.0210452 0.0946303 0.0010268 -0.0297511 0.0946303 0.0010268 -0.0407651 0.0946303 0.0010268 -0.0546993 0.0946303 0.0010268 -0.0723279 0.0946303 0.0010268 -0.0946303 0.0946303 0.0010268 -0.1228457 0.0946303 0.0010268 -0.1585419 0.0946303 0.0010268 -0.2037023 0.0946303 0.0010268 -0.260836 0.0946303 0.0010268 -0.3331176 0.0946303 0.0010268 -0.4245633 0.0946303 0.0010268 -0.5402539 0.0946303 0.0010268 -0.6866175 0.0946303 0.0010268 -0.8362644 0.0947256 0.0054121 -0.9017148 0.1016696 0.0276281 -0.9347252 0.1202135 0.061916 -0.9541902 0.1500908 0.1053624 -0.9667385 0.190288 0.1565954 -0.9752987 0.2394831 0.2145034 -0.9813659 0.296048 0.2778058 -0.9857835 0.3580498 0.3449254 -0.9890637 0.4233207 0.4140176 -0.9915347 0.4896008 0.4831021 -0.9934166 0.5547238 0.550248 -0.9948617 0.6168013 0.6137599 -0.9959785 0.6743629 0.6723217 -0.9968458 0.7264242 0.7250697 -0.997522 0.7724818 0.7715919 -0.9980506 0.8124493 0.8118697 -0.9984649 0.8465611 0.8461864 -0.9987902 0.875268 0.8750274 -0.999046 0.8991433 0.8989895 -0.9992473 0.9188067 0.9187089 -0.9994059 0.9348717 0.9348097 -0.999531 0.947911 0.9478718 -0.9996296 0.9584384 0.9584137 -0.9997074 0.9669014 0.9668859 -0.9997689 0.9736815 0.9736717 -0.9998174 0.9790983 0.9790921 -0.9998557 0.9834164 0.9834126 -0.999886 0.9868527 0.9868503 -0.9999099 0.9895834 0.9895819 -0.9999288 0.991751 0.99175 -0.9999437 0.99347 0.9934694 -0.0000238 0.1327073 0.0108885 -0.0000382 0.1322038 0.0103849 -0.0000611 0.1315716 0.0097527 -0.0000978 0.1307795 0.0089606 -0.0001565 0.1297896 0.0079707 -0.0002504 0.128557 0.0067381 -0.0004008 0.1270291 0.0052103 -0.0006416 0.1251466 0.0033277 -0.0010268 0.1228457 0.0010268 -0.0044252 0.1228457 0.0010268 -0.0087246 0.1228457 0.0010268 -0.0141639 0.1228457 0.0010268 -0.0210452 0.1228457 0.0010268 -0.0297511 0.1228457 0.0010268 -0.0407651 0.1228457 0.0010268 -0.0546993 0.1228457 0.0010268 -0.0723279 0.1228457 0.0010268 -0.0946303 0.1228457 0.0010268 -0.1228457 0.1228457 0.0010268 -0.1585419 0.1228457 0.0010268 -0.2037023 0.1228457 0.0010268 -0.260836 0.1228457 0.0010268 -0.3331176 0.1228457 0.0010268 -0.4245633 0.1228457 0.0010268 -0.5402539 0.1228457 0.0010268 -0.6866175 0.1228457 0.0010268 -0.8362644 0.1216479 0.0054121 -0.9017148 0.1239883 0.0276281 -0.9347252 0.1377865 0.061916 -0.9541902 0.1635736 0.1053624 -0.9667385 0.2004442 0.1565954 -0.9752987 0.2470129 0.2145034 -0.9813659 0.3015469 0.2778058 -0.9857835 0.362006 0.3449254 -0.9890637 0.426125 0.4140176 -0.9915347 0.4915597 0.4831021 -0.9934166 0.5560729 0.550248 -0.9948617 0.6177181 0.6137599 -0.9959785 0.6749782 0.6723217 -0.9968458 0.7268325 0.7250697 -0.997522 0.7727501 0.7715919 -0.9980506 0.812624 0.8118697 -0.9984649 0.846674 0.8461864 -0.9987902 0.8753406 0.8750274 -0.999046 0.8991896 0.8989895 -0.9992473 0.9188362 0.9187089 -0.9994059 0.9348904 0.9348097 -0.999531 0.9479229 0.9478718 -0.9996296 0.9584459 0.9584137 -0.9997074 0.9669061 0.9668859 -0.9997689 0.9736844 0.9736717 -0.9998174 0.9791001 0.9790921 -0.9998557 0.9834176 0.9834126 -0.999886 0.9868534 0.9868503 -0.9999099 0.9895838 0.9895819 -0.9999288 0.9917512 0.99175 -0.9999437 0.9934702 0.9934694 -0.0000238 0.1684036 0.0108885 -0.0000382 0.1679 0.0103849 -0.0000611 0.1672678 0.0097527 -0.0000978 0.1664757 0.0089606 -0.0001565 0.1654858 0.0079707 -0.0002504 0.1642532 0.0067381 -0.0004008 0.1627254 0.0052103 -0.0006416 0.1608428 0.0033277 -0.0010268 0.1585419 0.0010268 -0.0044252 0.1585419 0.0010268 -0.0087246 0.1585419 0.0010268 -0.0141639 0.1585419 0.0010268 -0.0210452 0.1585419 0.0010268 -0.0297511 0.1585419 0.0010268 -0.0407651 0.1585419 0.0010268 -0.0546993 0.1585419 0.0010268 -0.0723279 0.1585419 0.0010268 -0.0946303 0.1585419 0.0010268 -0.1228457 0.1585419 0.0010268 -0.1585419 0.1585419 0.0010268 -0.2037023 0.1585419 0.0010268 -0.260836 0.1585419 0.0010268 -0.3331176 0.1585419 0.0010268 -0.4245633 0.1585419 0.0010268 -0.5402539 0.1585419 0.0010268 -0.6866175 0.1585419 0.0010268 -0.8362644 0.1557082 0.0054121 -0.9017148 0.1522245 0.0276281 -0.9347252 0.1600186 0.061916 -0.9541902 0.180631 0.1053624 -0.9667385 0.2132931 0.1565954 -0.9752987 0.256539 0.2145034 -0.9813659 0.3085036 0.2778058 -0.9857835 0.367011 0.3449254 -0.9890637 0.4296728 0.4140176 -0.9915347 0.494038 0.4831021 -0.9934166 0.5577798 0.550248 -0.9948617 0.618878 0.6137599 -0.9959785 0.6757566 0.6723217 -0.9968458 0.7273491 0.7250697 -0.997522 0.7730895 0.7715919 -0.9980506 0.8128451 0.8118697 -0.9984649 0.8468169 0.8461864 -0.9987902 0.8754324 0.8750274 -0.999046 0.8992483 0.8989895 -0.9992473 0.9188735 0.9187089 -0.9994059 0.9349141 0.9348097 -0.999531 0.9479378 0.9478718 -0.9996296 0.9584553 0.9584137 -0.9997074 0.9669121 0.9668859 -0.9997689 0.9736882 0.9736717 -0.9998174 0.9791025 0.9790921 -0.9998557 0.9834191 0.9834126 -0.999886 0.9868543 0.9868503 -0.9999099 0.9895844 0.9895819 -0.9999288 0.9917516 0.99175 -0.9999437 0.9934704 0.9934694 -0.0000238 0.2135639 0.0108885 -0.0000382 0.2130604 0.0103849 -0.0000611 0.2124282 0.0097527 -0.0000978 0.2116361 0.0089606 -0.0001565 0.2106462 0.0079707 -0.0002504 0.2094136 0.0067381 -0.0004008 0.2078857 0.0052103 -0.0006416 0.2060032 0.0033277 -0.0010268 0.2037023 0.0010268 -0.0044252 0.2037023 0.0010268 -0.0087246 0.2037023 0.0010268 -0.0141639 0.2037023 0.0010268 -0.0210452 0.2037023 0.0010268 -0.0297511 0.2037023 0.0010268 -0.0407651 0.2037023 0.0010268 -0.0546993 0.2037023 0.0010268 -0.0723279 0.2037023 0.0010268 -0.0946303 0.2037023 0.0010268 -0.1228457 0.2037023 0.0010268 -0.1585419 0.2037023 0.0010268 -0.2037023 0.2037023 0.0010268 -0.260836 0.2037023 0.0010268 -0.3331176 0.2037023 0.0010268 -0.4245633 0.2037023 0.0010268 -0.5402539 0.2037023 0.0010268 -0.6866175 0.2037023 0.0010268 -0.8362644 0.1987988 0.0054121 -0.9017148 0.1879469 0.0276281 -0.9347252 0.1881451 0.061916 -0.9541902 0.2022109 0.1053624 -0.9667385 0.2295486 0.1565954 -0.9752987 0.2685909 0.2145034 -0.9813659 0.3173048 0.2778058 -0.9857835 0.3733431 0.3449254 -0.9890637 0.4341613 0.4140176 -0.9915347 0.4971734 0.4831021 -0.9934166 0.5599391 0.550248 -0.9948617 0.6203453 0.6137599 -0.9959785 0.6767414 0.6723217 -0.9968458 0.7280026 0.7250697 -0.997522 0.7735188 0.7715919 -0.9980506 0.8131247 0.8118697 -0.9984649 0.8469977 0.8461864 -0.9987902 0.8755485 0.8750274 -0.999046 0.8993225 0.8989895 -0.9992473 0.9189207 0.9187089 -0.9994059 0.934944 0.9348097 -0.999531 0.9479567 0.9478718 -0.9996296 0.9584673 0.9584137 -0.9997074 0.9669196 0.9668859 -0.9997689 0.9736929 0.9736717 -0.9998174 0.9791054 0.9790921 -0.9998557 0.9834209 0.9834126 -0.999886 0.9868555 0.9868503 -0.9999099 0.9895851 0.9895819 -0.9999288 0.9917521 0.99175 -0.9999437 0.9934707 0.9934694 -0.0000238 0.2706977 0.0108885 -0.0000382 0.2701941 0.0103849 -0.0000611 0.2695619 0.0097527 -0.0000978 0.2687698 0.0089606 -0.0001565 0.2677799 0.0079707 -0.0002504 0.2665473 0.0067381 -0.0004008 0.2650195 0.0052103 -0.0006416 0.2631369 0.0033277 -0.0010268 0.260836 0.0010268 -0.0044252 0.260836 0.0010268 -0.0087246 0.260836 0.0010268 -0.0141639 0.260836 0.0010268 -0.0210452 0.260836 0.0010268 -0.0297511 0.260836 0.0010268 -0.0407651 0.260836 0.0010268 -0.0546993 0.260836 0.0010268 -0.0723279 0.260836 0.0010268 -0.0946303 0.260836 0.0010268 -0.1228457 0.260836 0.0010268 -0.1585419 0.260836 0.0010268 -0.2037023 0.260836 0.0010268 -0.260836 0.260836 0.0010268 -0.3331176 0.260836 0.0010268 -0.4245633 0.260836 0.0010268 -0.5402539 0.260836 0.0010268 -0.6866175 0.260836 0.0010268 -0.8362644 0.253314 0.0054121 -0.9017148 0.2331404 0.0276281 -0.9347252 0.2237288 0.061916 -0.9541902 0.2295123 0.1053624 -0.9667385 0.2501139 0.1565954 -0.9752987 0.283838 0.2145034 -0.9813659 0.3284395 0.2778058 -0.9857835 0.3813539 0.3449254 -0.9890637 0.4398397 0.4140176 -0.9915347 0.50114 0.4831021 -0.9934166 0.562671 0.550248 -0.9948617 0.6222018 0.6137599 -0.9959785 0.6779873 0.6723217 -0.9968458 0.7288294 0.7250697 -0.997522 0.774062 0.7715919 -0.9980506 0.8134785 0.8118697 -0.9984649 0.8472264 0.8461864 -0.9987902 0.8756954 0.8750274 -0.999046 0.8994164 0.8989895 -0.9992473 0.9189805 0.9187089 -0.9994059 0.9349819 0.9348097 -0.999531 0.9479807 0.9478718 -0.9996296 0.9584823 0.9584137 -0.9997074 0.9669291 0.9668859 -0.9997689 0.9736989 0.9736717 -0.9998174 0.9791092 0.9790921 -0.9998557 0.9834233 0.9834126 -0.999886 0.986857 0.9868503 -0.9999099 0.9895861 0.9895819 -0.9999288 0.9917526 0.99175 -0.9999437 0.9934711 0.9934694 -0.0000238 0.3429792 0.0108885 -0.0000382 0.3424757 0.0103849 -0.0000611 0.3418435 0.0097527 -0.0000978 0.3410514 0.0089606 -0.0001565 0.3400615 0.0079707 -0.0002504 0.3388289 0.0067381 -0.0004008 0.337301 0.0052103 -0.0006416 0.3354185 0.0033277 -0.0010268 0.3331176 0.0010268 -0.0044252 0.3331176 0.0010268 -0.0087246 0.3331176 0.0010268 -0.0141639 0.3331176 0.0010268 -0.0210452 0.3331176 0.0010268 -0.0297511 0.3331176 0.0010268 -0.0407651 0.3331176 0.0010268 -0.0546993 0.3331176 0.0010268 -0.0723279 0.3331176 0.0010268 -0.0946303 0.3331176 0.0010268 -0.1228457 0.3331176 0.0010268 -0.1585419 0.3331176 0.0010268 -0.2037023 0.3331176 0.0010268 -0.260836 0.3331176 0.0010268 -0.3331176 0.3331176 0.0010268 -0.4245633 0.3331176 0.0010268 -0.5402539 0.3331176 0.0010268 -0.6866175 0.3331176 0.0010268 -0.8362644 0.3222829 0.0054121 -0.9017148 0.290316 0.0276281 -0.9347252 0.2687468 0.061916 -0.9541902 0.2640521 0.1053624 -0.9667385 0.2761317 0.1565954 -0.9752987 0.3031276 0.2145034 -0.9813659 0.3425263 0.2778058 -0.9857835 0.3914887 0.3449254 -0.9890637 0.4470237 0.4140176 -0.9915347 0.5061584 0.4831021 -0.9934166 0.5661273 0.550248 -0.9948617 0.6245504 0.6137599 -0.9959785 0.6795635 0.6723217 -0.9968458 0.7298754 0.7250697 -0.997522 0.7747493 0.7715919 -0.9980506 0.8139261 0.8118697 -0.9984649 0.8475157 0.8461864 -0.9987902 0.8758813 0.8750274 -0.999046 0.8995351 0.8989895 -0.9992473 0.919056 0.9187089 -0.9994059 0.9350298 0.9348097 -0.999531 0.9480109 0.9478718 -0.9996296 0.9585014 0.9584137 -0.9997074 0.9669411 0.9668859 -0.9997689 0.9737064 0.9736717 -0.9998174 0.9791139 0.9790921 -0.9998557 0.9834262 0.9834126 -0.999886 0.9868588 0.9868503 -0.9999099 0.9895872 0.9895819 -0.9999288 0.9917534 0.99175 -0.9999437 0.9934715 0.9934694 -0.0000238 0.4344249 0.0108885 -0.0000382 0.4339214 0.0103849 -0.0000611 0.4332891 0.0097527 -0.0000978 0.432497 0.0089606 -0.0001565 0.4315072 0.0079707 -0.0002504 0.4302746 0.0067381 -0.0004008 0.4287467 0.0052103 -0.0006416 0.4268641 0.0033277 -0.0010268 0.4245633 0.0010268 -0.0044252 0.4245633 0.0010268 -0.0087246 0.4245633 0.0010268 -0.0141639 0.4245633 0.0010268 -0.0210452 0.4245633 0.0010268 -0.0297511 0.4245633 0.0010268 -0.0407651 0.4245633 0.0010268 -0.0546993 0.4245633 0.0010268 -0.0723279 0.4245633 0.0010268 -0.0946303 0.4245633 0.0010268 -0.1228457 0.4245633 0.0010268 -0.1585419 0.4245633 0.0010268 -0.2037023 0.4245633 0.0010268 -0.260836 0.4245633 0.0010268 -0.3331176 0.4245633 0.0010268 -0.4245633 0.4245633 0.0010268 -0.5402539 0.4245633 0.0010268 -0.6866175 0.4245633 0.0010268 -0.8362644 0.4095375 0.0054121 -0.9017148 0.3626507 0.0276281 -0.9347252 0.3257005 0.061916 -0.9541902 0.3077494 0.1053624 -0.9667385 0.3090475 0.1565954 -0.9752987 0.3275315 0.2145034 -0.9813659 0.3603479 0.2778058 -0.9857835 0.4043106 0.3449254 -0.9890637 0.4561124 0.4140176 -0.9915347 0.5125072 0.4831021 -0.9934166 0.5704998 0.550248 -0.9948617 0.6275217 0.6137599 -0.9959785 0.6815577 0.6723217 -0.9968458 0.7311988 0.7250697 -0.997522 0.7756187 0.7715919 -0.9980506 0.8144923 0.8118697 -0.9984649 0.8478818 0.8461864 -0.9987902 0.8761164 0.8750274 -0.999046 0.8996854 0.8989895 -0.9992473 0.9191516 0.9187089 -0.9994059 0.9350904 0.9348097 -0.999531 0.9480493 0.9478718 -0.9996296 0.9585256 0.9584137 -0.9997074 0.9669563 0.9668859 -0.9997689 0.973716 0.9736717 -0.9998174 0.9791199 0.9790921 -0.9998557 0.98343 0.9834126 -0.999886 0.9868612 0.9868503 -0.9999099 0.9895887 0.9895819 -0.9999288 0.9917543 0.99175 -0.9999437 0.9934721 0.9934694 -0.0000238 0.5501155 0.0108885 -0.0000382 0.549612 0.0103849 -0.0000611 0.5489798 0.0097527 -0.0000978 0.5481876 0.0089606 -0.0001565 0.5471978 0.0079707 -0.0002504 0.5459652 0.0067381 -0.0004008 0.5444373 0.0052103 -0.0006416 0.5425548 0.0033277 -0.0010268 0.5402539 0.0010268 -0.0044252 0.5402539 0.0010268 -0.0087246 0.5402539 0.0010268 -0.0141639 0.5402539 0.0010268 -0.0210452 0.5402539 0.0010268 -0.0297511 0.5402539 0.0010268 -0.0407651 0.5402539 0.0010268 -0.0546993 0.5402539 0.0010268 -0.0723279 0.5402539 0.0010268 -0.0946303 0.5402539 0.0010268 -0.1228457 0.5402539 0.0010268 -0.1585419 0.5402539 0.0010268 -0.2037023 0.5402539 0.0010268 -0.260836 0.5402539 0.0010268 -0.3331176 0.5402539 0.0010268 -0.4245633 0.5402539 0.0010268 -0.5402539 0.5402539 0.0010268 -0.6866175 0.5402539 0.0010268 -0.8362644 0.519926 0.0054121 -0.9017148 0.4541634 0.0276281 -0.9347252 0.3977542 0.061916 -0.9541902 0.3630322 0.1053624 -0.9667385 0.3506904 0.1565954 -0.9752987 0.3584055 0.2145034 -0.9813659 0.3828946 0.2778058 -0.9857835 0.4205319 0.3449254 -0.9890637 0.4676107 0.4140176 -0.9915347 0.5205393 0.4831021 -0.9934166 0.5760317 0.550248 -0.9948617 0.6312808 0.6137599 -0.9959785 0.6840805 0.6723217 -0.9968458 0.7328729 0.7250697 -0.997522 0.7767186 0.7715919 -0.9980506 0.8152087 0.8118697 -0.9984649 0.8483449 0.8461864 -0.9987902 0.8764139 0.8750274 -0.999046 0.8998755 0.8989895 -0.9992473 0.9192725 0.9187089 -0.9994059 0.935167 0.9348097 -0.999531 0.9480977 0.9478718 -0.9996296 0.9585562 0.9584137 -0.9997074 0.9669755 0.9668859 -0.9997689 0.9737281 0.9736717 -0.9998174 0.9791275 0.9790921 -0.9998557 0.9834348 0.9834126 -0.999886 0.9868642 0.9868503 -0.9999099 0.9895906 0.9895819 -0.9999288 0.9917555 0.99175 -0.9999437 0.9934728 0.9934694 -0.0000238 0.6964791 0.0108885 -0.0000382 0.6959756 0.0103849 -0.0000611 0.6953434 0.0097527 -0.0000978 0.6945513 0.0089606 -0.0001565 0.6935614 0.0079707 -0.0002504 0.6923288 0.0067381 -0.0004008 0.6908009 0.0052103 -0.0006416 0.6889184 0.0033277 -0.0010268 0.6866175 0.0010268 -0.0044252 0.6866175 0.0010268 -0.0087246 0.6866175 0.0010268 -0.0141639 0.6866175 0.0010268 -0.0210452 0.6866175 0.0010268 -0.0297511 0.6866175 0.0010268 -0.0407651 0.6866175 0.0010268 -0.0546993 0.6866175 0.0010268 -0.0723279 0.6866175 0.0010268 -0.0946303 0.6866175 0.0010268 -0.1228457 0.6866175 0.0010268 -0.1585419 0.6866175 0.0010268 -0.2037023 0.6866175 0.0010268 -0.260836 0.6866175 0.0010268 -0.3331176 0.6866175 0.0010268 -0.4245633 0.6866175 0.0010268 -0.5402539 0.6866175 0.0010268 -0.6866175 0.6866175 0.0010268 -0.8362644 0.6595817 0.0054121 -0.9017148 0.5699388 0.0276281 -0.9347252 0.4889116 0.061916 -0.9541902 0.4329722 0.1053624 -0.9667385 0.4033741 0.1565954 -0.9752987 0.3974652 0.2145034 -0.9813659 0.4114191 0.2778058 -0.9857835 0.4410539 0.3449254 -0.9890637 0.4821576 0.4140176 -0.9915347 0.530701 0.4831021 -0.9934166 0.5830302 0.550248 -0.9948617 0.6360365 0.6137599 -0.9959785 0.6872723 0.6723217 -0.9968458 0.734991 0.7250697 -0.997522 0.7781102 0.7715919 -0.9980506 0.816115 0.8118697 -0.9984649 0.8489308 0.8461864 -0.9987902 0.8767903 0.8750274 -0.999046 0.9001159 0.8989895 -0.9992473 0.9194255 0.9187089 -0.9994059 0.935264 0.9348097 -0.999531 0.948159 0.9478718 -0.9996296 0.9585948 0.9584137 -0.9997074 0.9669999 0.9668859 -0.9997689 0.9737434 0.9736717 -0.9998174 0.9791371 0.9790921 -0.9998557 0.9834408 0.9834126 -0.999886 0.986868 0.9868503 -0.9999099 0.9895929 0.9895819 -0.9999288 0.9917569 0.99175 -0.9999437 0.9934738 0.9934694 -0.0051514 0.8407292 0.0154486 -0.0051286 0.8405071 0.0149384 -0.0051047 0.8402274 0.0142974 -0.0050826 0.8398756 0.0134938 -0.0050676 0.8394338 0.0124887 -0.0050694 0.8388802 0.0112359 -0.0051048 0.8381886 0.0096809 -0.0052028 0.8373283 0.0077619 -0.0054121 0.8362644 0.0054121 -0.0086547 0.8362644 0.0054121 -0.012757 0.8362644 0.0054121 -0.017947 0.8362644 0.0054121 -0.024513 0.8362644 0.0054121 -0.0328199 0.8362644 0.0054121 -0.0433291 0.8362644 0.0054121 -0.0566247 0.8362644 0.0054121 -0.0734453 0.8362644 0.0054121 -0.0947256 0.8362644 0.0054121 -0.1216479 0.8362644 0.0054121 -0.1557082 0.8362644 0.0054121 -0.1987988 0.8362644 0.0054121 -0.253314 0.8362644 0.0054121 -0.3222829 0.8362644 0.0054121 -0.4095375 0.8362644 0.0054121 -0.519926 0.8362644 0.0054121 -0.6595817 0.8362644 0.0054121 -0.8362644 0.8362644 0.0054121 -0.9017148 0.7164099 0.0276281 -0.9347252 0.6042375 0.061916 -0.9541902 0.5214553 0.1053624 -0.9667385 0.4700258 0.1565954 -0.9752987 0.4468808 0.2145034 -0.9813659 0.4475063 0.2778058 -0.9857835 0.467017 0.3449254 -0.9890637 0.5005614 0.4140176 -0.9915347 0.5435568 0.4831021 -0.9934166 0.5918842 0.550248 -0.9948617 0.6420531 0.6137599 -0.9959785 0.6913102 0.6723217 -0.9968458 0.7376706 0.7250697 -0.997522 0.7798707 0.7715919 -0.9980506 0.8172617 0.8118697 -0.9984649 0.849672 0.8461864 -0.9987902 0.8772664 0.8750274 -0.999046 0.9004202 0.8989895 -0.9992473 0.9196191 0.9187089 -0.9994059 0.9353867 0.9348097 -0.999531 0.9482366 0.9478718 -0.9996296 0.9586437 0.9584137 -0.9997074 0.9670307 0.9668859 -0.9997689 0.9737627 0.9736717 -0.9998174 0.9791493 0.9790921 -0.9998557 0.9834484 0.9834126 -0.999886 0.9868727 0.9868503 -0.9999099 0.9895959 0.9895819 -0.9999288 0.9917588 0.99175 -0.9999437 0.9934749 0.9934694 -0.0279321 0.9033413 0.0364554 -0.0278872 0.9032596 0.0360076 -0.0278347 0.9031567 0.035445 -0.0277752 0.9030276 0.0347393 -0.0277111 0.9028657 0.0338564 -0.0276479 0.9026634 0.0327552 -0.0275966 0.9024114 0.0313876 -0.0275778 0.9020992 0.0296985 -0.0276281 0.9017148 0.0276281 -0.0303162 0.9017148 0.0276281 -0.0337171 0.9017148 0.0276281 -0.0380196 0.9017148 0.0276281 -0.0434629 0.9017148 0.0276281 -0.0503493 0.9017148 0.0276281 -0.0590616 0.9017148 0.0276281 -0.0700837 0.9017148 0.0276281 -0.0840281 0.9017148 0.0276281 -0.1016696 0.9017148 0.0276281 -0.1239883 0.9017148 0.0276281 -0.1522245 0.9017148 0.0276281 -0.1879469 0.9017148 0.0276281 -0.2331404 0.9017148 0.0276281 -0.290316 0.9017148 0.0276281 -0.3626507 0.9017148 0.0276281 -0.4541634 0.9017148 0.0276281 -0.5699388 0.9017148 0.0276281 -0.7164099 0.9017148 0.0276281 -0.9017148 0.9017148 0.0276281 -0.9347252 0.7501398 0.061916 -0.9541902 0.6333979 0.1053624 -0.9667385 0.5543488 0.1565954 -0.9752987 0.509398 0.2145034 -0.9813659 0.4931613 0.2778058 -0.9857835 0.4998636 0.3449254 -0.9890637 0.5238445 0.4140176 -0.9915347 0.5598211 0.4831021 -0.9934166 0.6030857 0.550248 -0.9948617 0.6496649 0.6137599 -0.9959785 0.6964188 0.6723217 -0.9968458 0.7410607 0.7250697 -0.997522 0.782098 0.7715919 -0.9980506 0.8187123 0.8118697 -0.9984649 0.8506097 0.8461864 -0.9987902 0.8778688 0.8750274 -0.999046 0.9008051 0.8989895 -0.9992473 0.919864 0.9187089 -0.9994059 0.935542 0.9348097 -0.999531 0.9483347 0.9478718 -0.9996296 0.9587056 0.9584137 -0.9997074 0.9670696 0.9668859 -0.9997689 0.9737872 0.9736717 -0.9998174 0.9791646 0.9790921 -0.9998557 0.983458 0.9834126 -0.999886 0.9868788 0.9868503 -0.9999099 0.9895997 0.9895819 -0.9999288 0.9917612 0.99175 -0.9999437 0.9934764 0.9934694 -0.0624569 0.9354466 0.0691729 -0.0624063 0.9354101 0.0688046 -0.0623458 0.9353643 0.0683418 -0.0622749 0.9353068 0.0677615 -0.0621943 0.9352348 0.0670354 -0.0621069 0.9351449 0.06613 -0.0620199 0.9350332 0.0650057 -0.0619473 0.9348949 0.0636174 -0.061916 0.9347252 0.061916 -0.0640325 0.9347252 0.061916 -0.0667103 0.9347252 0.061916 -0.0700979 0.9347252 0.061916 -0.0743837 0.9347252 0.061916 -0.0798059 0.9347252 0.061916 -0.0866656 0.9347252 0.061916 -0.095344 0.9347252 0.061916 -0.1063233 0.9347252 0.061916 -0.1202135 0.9347252 0.061916 -0.1377865 0.9347252 0.061916 -0.1600186 0.9347252 0.061916 -0.1881451 0.9347252 0.061916 -0.2237288 0.9347252 0.061916 -0.2687468 0.9347252 0.061916 -0.3257005 0.9347252 0.061916 -0.3977542 0.9347252 0.061916 -0.4889116 0.9347252 0.061916 -0.6042375 0.9347252 0.061916 -0.7501398 0.9347252 0.061916 -0.9347252 0.9347252 0.061916 -0.9541902 0.7750199 0.1053624 -0.9667385 0.6610284 0.1565954 -0.9752987 0.5884903 0.2145034 -0.9813659 0.5509208 0.2778058 -0.9857835 0.5414188 0.3449254 -0.9890637 0.5533007 0.4140176 -0.9915347 0.5803976 0.4831021 -0.9934166 0.6172571 0.550248 -0.9948617 0.6592948 0.6137599 -0.9959785 0.7028817 0.6723217 -0.9968458 0.7453496 0.7250697 -0.997522 0.7849158 0.7715919 -0.9980506 0.8205475 0.8118697 -0.9984649 0.8517961 0.8461864 -0.9987902 0.8786309 0.8750274 -0.999046 0.9012921 0.8989895 -0.9992473 0.9201738 0.9187089 -0.9994059 0.9357384 0.9348097 -0.999531 0.9484589 0.9478718 -0.9996296 0.9587839 0.9584137 -0.9997074 0.9671189 0.9668859 -0.9997689 0.9738182 0.9736717 -0.9998174 0.9791841 0.9790921 -0.9998557 0.9834702 0.9834126 -0.999886 0.9868864 0.9868503 -0.9999099 0.9896045 0.9895819 -0.9999288 0.9917642 0.99175 -0.9999437 0.9934783 0.9934694 -0.1059991 0.9545467 0.1111575 -0.1059489 0.9545286 0.1108631 -0.1058883 0.9545059 0.1104932 -0.1058162 0.9544774 0.1100294 -0.1057322 0.9544418 0.1094494 -0.1056375 0.9543974 0.1087261 -0.1055364 0.9543421 0.1078283 -0.1054384 0.9542739 0.10672 -0.1053624 0.9541902 0.1053624 -0.1069863 0.9541902 0.1053624 -0.1090407 0.9541902 0.1053624 -0.1116399 0.9541902 0.1053624 -0.1149282 0.9541902 0.1053624 -0.1190883 0.9541902 0.1053624 -0.1243513 0.9541902 0.1053624 -0.1310098 0.9541902 0.1053624 -0.1394336 0.9541902 0.1053624 -0.1500908 0.9541902 0.1053624 -0.1635736 0.9541902 0.1053624 -0.180631 0.9541902 0.1053624 -0.2022109 0.9541902 0.1053624 -0.2295123 0.9541902 0.1053624 -0.2640521 0.9541902 0.1053624 -0.3077494 0.9541902 0.1053624 -0.3630322 0.9541902 0.1053624 -0.4329722 0.9541902 0.1053624 -0.5214553 0.9541902 0.1053624 -0.6333979 0.9541902 0.1053624 -0.7750199 0.9541902 0.1053624 -0.9541902 0.9541902 0.1053624 -0.9667385 0.795992 0.1565954 -0.9752987 0.6885524 0.2145034 -0.9813659 0.6239941 0.2778058 -0.9857835 0.5939917 0.3449254 -0.9890637 0.5905666 0.4140176 -0.9915347 0.6064294 0.4831021 -0.9934166 0.6351857 0.550248 -0.9948617 0.6714779 0.6137599 -0.9959785 0.7110582 0.6723217 -0.9968458 0.7507756 0.7250697 -0.997522 0.7884807 0.7715919 -0.9980506 0.8228693 0.8118697 -0.9984649 0.853297 0.8461864 -0.9987902 0.879595 0.8750274 -0.999046 0.9019081 0.8989895 -0.9992473 0.9205658 0.9187089 -0.9994059 0.9359869 0.9348097 -0.999531 0.9486159 0.9478718 -0.9996296 0.958883 0.9584137 -0.9997074 0.9671812 0.9668859 -0.9997689 0.9738573 0.9736717 -0.9998174 0.9792087 0.9790921 -0.9998557 0.9834856 0.9834126 -0.999886 0.9868961 0.9868503 -0.9999099 0.9896105 0.9895819 -0.9999288 0.991768 0.99175 -0.9999437 0.9934807 0.9934694 -0.1572498 0.9669269 0.1611395 -0.1572031 0.9669173 0.1609084 -0.1571463 0.9669053 0.1606182 -0.1570779 0.9668902 0.1602543 -0.1569971 0.9668714 0.1597992 -0.156904 0.9668479 0.159232 -0.1568008 0.9668187 0.158528 -0.1566936 0.9667827 0.1576592 -0.1565954 0.9667385 0.1565954 -0.1578187 0.9667385 0.1565954 -0.1593662 0.9667385 0.1565954 -0.1613241 0.9667385 0.1565954 -0.1638011 0.9667385 0.1565954 -0.1669347 0.9667385 0.1565954 -0.1708992 0.9667385 0.1565954 -0.1759149 0.9667385 0.1565954 -0.1822603 0.9667385 0.1565954 -0.190288 0.9667385 0.1565954 -0.2004442 0.9667385 0.1565954 -0.2132931 0.9667385 0.1565954 -0.2295486 0.9667385 0.1565954 -0.2501139 0.9667385 0.1565954 -0.2761317 0.9667385 0.1565954 -0.3090475 0.9667385 0.1565954 -0.3506904 0.9667385 0.1565954 -0.4033741 0.9667385 0.1565954 -0.4700258 0.9667385 0.1565954 -0.5543488 0.9667385 0.1565954 -0.6610284 0.9667385 0.1565954 -0.795992 0.9667385 0.1565954 -0.9667385 0.9667385 0.1565954 -0.9752987 0.8151439 0.2145034 -0.9813659 0.7164413 0.2778058 -0.9857835 0.6605031 0.3449254 -0.9890637 0.6377128 0.4140176 -0.9915347 0.6393632 0.4831021 -0.9934166 0.6578677 0.550248 -0.9948617 0.6868911 0.6137599 -0.9959785 0.7214025 0.6723217 -0.9968458 0.7576402 0.7250697 -0.997522 0.7929907 0.7715919 -0.9980506 0.8258066 0.8118697 -0.9984649 0.8551958 0.8461864 -0.9987902 0.8808147 0.8750274 -0.999046 0.9026876 0.8989895 -0.9992473 0.9210616 0.9187089 -0.9994059 0.9363012 0.9348097 -0.999531 0.9488147 0.9478718 -0.9996296 0.9590083 0.9584137 -0.9997074 0.9672601 0.9668859 -0.9997689 0.9739069 0.9736717 -0.9998174 0.9792398 0.9790921 -0.9998557 0.9835052 0.9834126 -0.999886 0.9869083 0.9868503 -0.9999099 0.9896182 0.9895819 -0.9999288 0.9917727 0.99175 -0.9999437 0.9934837 0.9934694 -0.2151269 0.9754027 0.2180133 -0.2150852 0.9753975 0.2178347 -0.2150342 0.9753908 0.2176104 -0.2149725 0.9753825 0.2173291 -0.2148987 0.9753721 0.2169775 -0.2148124 0.9753591 0.2165392 -0.2147144 0.975343 0.2159954 -0.2146085 0.9753231 0.2153246 -0.2145034 0.9752987 0.2145034 -0.2154103 0.9752987 0.2145034 -0.2165577 0.9752987 0.2145034 -0.2180092 0.9752987 0.2145034 -0.2198456 0.9752987 0.2145034 -0.2221689 0.9752987 0.2145034 -0.2251082 0.9752987 0.2145034 -0.2288268 0.9752987 0.2145034 -0.2335313 0.9752987 0.2145034 -0.2394831 0.9752987 0.2145034 -0.2470129 0.9752987 0.2145034 -0.256539 0.9752987 0.2145034 -0.2685909 0.9752987 0.2145034 -0.283838 0.9752987 0.2145034 -0.3031276 0.9752987 0.2145034 -0.3275315 0.9752987 0.2145034 -0.3584055 0.9752987 0.2145034 -0.3974652 0.9752987 0.2145034 -0.4468808 0.9752987 0.2145034 -0.509398 0.9752987 0.2145034 -0.5884903 0.9752987 0.2145034 -0.6885524 0.9752987 0.2145034 -0.8151439 0.9752987 0.2145034 -0.9752987 0.9752987 0.2145034 -0.9813659 0.8333991 0.2778058 -0.9857835 0.7446487 0.3449254 -0.9890637 0.6973589 0.4140176 -0.9915347 0.6810286 0.4831021 -0.9934166 0.6865634 0.550248 -0.9948617 0.7063908 0.6137599 -0.9959785 0.7344894 0.6723217 -0.9968458 0.7663248 0.7250697 -0.997522 0.7986965 0.7715919 -0.9980506 0.8295228 0.8118697 -0.9984649 0.8575981 0.8461864 -0.9987902 0.8823579 0.8750274 -0.999046 0.9036736 0.8989895 -0.9992473 0.921689 0.9187089 -0.9994059 0.9366989 0.9348097 -0.999531 0.949066 0.9478718 -0.9996296 0.9591668 0.9584137 -0.9997074 0.9673599 0.9668859 -0.9997689 0.9739696 0.9736717 -0.9998174 0.9792792 0.9790921 -0.9998557 0.9835298 0.9834126 -0.999886 0.9869238 0.9868503 -0.9999099 0.9896279 0.9895819 -0.9999288 0.9917788 0.99175 -0.9999437 0.9934875 0.9934694 -0.2783684 0.9814251 0.2804779 -0.2783325 0.9814221 0.2803419 -0.2782884 0.9814183 0.280171 -0.2782347 0.9814136 0.2799568 -0.2781701 0.9814076 0.279689 -0.2780936 0.9814002 0.2793553 -0.2780055 0.9813911 0.2789413 -0.2779077 0.9813797 0.2784307 -0.2778058 0.9813659 0.2778058 -0.2784681 0.9813659 0.2778058 -0.279306 0.9813659 0.2778058 -0.2803661 0.9813659 0.2778058 -0.2817072 0.9813659 0.2778058 -0.2834038 0.9813659 0.2778058 -0.2855503 0.9813659 0.2778058 -0.2882659 0.9813659 0.2778058 -0.2917015 0.9813659 0.2778058 -0.296048 0.9813659 0.2778058 -0.3015469 0.9813659 0.2778058 -0.3085036 0.9813659 0.2778058 -0.3173048 0.9813659 0.2778058 -0.3284395 0.9813659 0.2778058 -0.3425263 0.9813659 0.2778058 -0.3603479 0.9813659 0.2778058 -0.3828946 0.9813659 0.2778058 -0.4114191 0.9813659 0.2778058 -0.4475063 0.9813659 0.2778058 -0.4931613 0.9813659 0.2778058 -0.5509208 0.9813659 0.2778058 -0.6239941 0.9813659 0.2778058 -0.7164413 0.9813659 0.2778058 -0.8333991 0.9813659 0.2778058 -0.9813659 0.9813659 0.2778058 -0.9857835 0.8511039 0.3449254 -0.9890637 0.772819 0.4140176 -0.9915347 0.7337408 0.4831021 -0.9934166 0.7228673 0.550248 -0.9948617 0.7310605 0.6137599 -0.9959785 0.7510461 0.6723217 -0.9968458 0.7773119 0.7250697 -0.997522 0.8059151 0.7715919 -0.9980506 0.8342242 0.8118697 -0.9984649 0.8606373 0.8461864 -0.9987902 0.8843102 0.8750274 -0.999046 0.9049211 0.8989895 -0.9992473 0.9224827 0.9187089 -0.9994059 0.9372021 0.9348097 -0.999531 0.9493841 0.9478718 -0.9996296 0.9593674 0.9584137 -0.9997074 0.9674862 0.9668859 -0.9997689 0.974049 0.9736717 -0.9998174 0.979329 0.9790921 -0.9998557 0.9835611 0.9834126 -0.999886 0.9869433 0.9868503 -0.9999099 0.9896401 0.9895819 -0.9999288 0.9917865 0.99175 -0.9999437 0.9934923 0.9934694 -0.3454107 0.9858181 0.3469293 -0.3453807 0.9858163 0.3468273 -0.3453439 0.9858141 0.3466991 -0.3452987 0.9858113 0.3465384 -0.3452442 0.9858079 0.3463375 -0.3451791 0.9858036 0.3460872 -0.3451032 0.9857982 0.3457767 -0.3450175 0.9857916 0.3453938 -0.3449254 0.9857835 0.3449254 -0.3454019 0.9857835 0.3449254 -0.3460047 0.9857835 0.3449254 -0.3467674 0.9857835 0.3449254 -0.3477322 0.9857835 0.3449254 -0.3489529 0.9857835 0.3449254 -0.3504972 0.9857835 0.3449254 -0.352451 0.9857835 0.3449254 -0.3549227 0.9857835 0.3449254 -0.3580498 0.9857835 0.3449254 -0.362006 0.9857835 0.3449254 -0.367011 0.9857835 0.3449254 -0.3733431 0.9857835 0.3449254 -0.3813539 0.9857835 0.3449254 -0.3914887 0.9857835 0.3449254 -0.4043106 0.9857835 0.3449254 -0.4205319 0.9857835 0.3449254 -0.4410539 0.9857835 0.3449254 -0.467017 0.9857835 0.3449254 -0.4998636 0.9857835 0.3449254 -0.5414188 0.9857835 0.3449254 -0.5939917 0.9857835 0.3449254 -0.6605031 0.9857835 0.3449254 -0.7446487 0.9857835 0.3449254 -0.8511039 0.9857835 0.3449254 -0.9857835 0.9857835 0.3449254 -0.9890637 0.8682858 0.4140176 -0.9915347 0.8004286 0.4831021 -0.9934166 0.7687963 0.550248 -0.9948617 0.7622708 0.6137599 -0.9959785 0.7719924 0.6723217 -0.9968458 0.7912121 0.7250697 -0.997522 0.8150475 0.7715919 -0.9980506 0.8401721 0.8118697 -0.9984649 0.8644822 0.8461864 -0.9987902 0.8867801 0.8750274 -0.999046 0.9064994 0.8989895 -0.9992473 0.9234868 0.9187089 -0.9994059 0.9378386 0.9348097 -0.999531 0.9497865 0.9478718 -0.9996296 0.9596211 0.9584137 -0.9997074 0.9676459 0.9668859 -0.9997689 0.9741494 0.9736717 -0.9998174 0.979392 0.9790921 -0.9998557 0.9836006 0.9834126 -0.999886 0.9869681 0.9868503 -0.9999099 0.9896557 0.9895819 -0.9999288 0.9917962 0.99175 -0.9999437 0.9934983 0.9934694 -0.4144197 0.9890841 0.4154968 -0.4143955 0.9890831 0.4154214 -0.4143657 0.9890818 0.4153268 -0.414329 0.9890801 0.4152081 -0.4142845 0.9890781 0.4150598 -0.4142311 0.9890755 0.414875 -0.4141683 0.9890723 0.4146458 -0.4140964 0.9890684 0.4143632 -0.4140176 0.9890637 0.4140176 -0.4143553 0.9890637 0.4140176 -0.4147826 0.9890637 0.4140176 -0.4153232 0.9890637 0.4140176 -0.4160072 0.9890637 0.4140176 -0.4168724 0.9890637 0.4140176 -0.4179671 0.9890637 0.4140176 -0.419352 0.9890637 0.4140176 -0.4211041 0.9890637 0.4140176 -0.4233207 0.9890637 0.4140176 -0.426125 0.9890637 0.4140176 -0.4296728 0.9890637 0.4140176 -0.4341613 0.9890637 0.4140176 -0.4398397 0.9890637 0.4140176 -0.4470237 0.9890637 0.4140176 -0.4561124 0.9890637 0.4140176 -0.4676107 0.9890637 0.4140176 -0.4821576 0.9890637 0.4140176 -0.5005614 0.9890637 0.4140176 -0.5238445 0.9890637 0.4140176 -0.5533007 0.9890637 0.4140176 -0.5905666 0.9890637 0.4140176 -0.6377128 0.9890637 0.4140176 -0.6973589 0.9890637 0.4140176 -0.772819 0.9890637 0.4140176 -0.8682858 0.9890637 0.4140176 -0.9890637 0.9890637 0.4140176 -0.9915347 0.8847973 0.4831021 -0.9934166 0.8269025 0.550248 -0.9948617 0.801756 0.6137599 -0.9959785 0.7984922 0.6723217 -0.9968458 0.8087977 0.7250697 -0.997522 0.8266012 0.7715919 -0.9980506 0.8476969 0.8118697 -0.9984649 0.8693466 0.8461864 -0.9987902 0.8899048 0.8750274 -0.999046 0.908496 0.8989895 -0.9992473 0.9247571 0.9187089 -0.9994059 0.9386439 0.9348097 -0.999531 0.9502955 0.9478718 -0.9996296 0.9599421 0.9584137 -0.9997074 0.9678479 0.9668859 -0.9997689 0.9742763 0.9736717 -0.9998174 0.9794717 0.9790921 -0.9998557 0.9836506 0.9834126 -0.999886 0.9869994 0.9868503 -0.9999099 0.9896753 0.9895819 -0.9999288 0.9918085 0.99175 -0.9999437 0.993506 0.9934694 -0.4834235 0.9915469 0.4841762 -0.4834045 0.9915463 0.4841214 -0.4833811 0.9915455 0.4840527 -0.4833522 0.9915446 0.4839665 -0.4833171 0.9915433 0.4838588 -0.4832747 0.9915418 0.4837246 -0.4832246 0.9915399 0.4835582 -0.4831666 0.9915376 0.483353 -0.4831021 0.9915347 0.4831021 -0.4833381 0.9915347 0.4831021 -0.4836366 0.9915347 0.4831021 -0.4840142 0.9915347 0.4831021 -0.484492 0.9915347 0.4831021 -0.4850964 0.9915347 0.4831021 -0.4858611 0.9915347 0.4831021 -0.4868285 0.9915347 0.4831021 -0.4880524 0.9915347 0.4831021 -0.4896008 0.9915347 0.4831021 -0.4915597 0.9915347 0.4831021 -0.494038 0.9915347 0.4831021 -0.4971734 0.9915347 0.4831021 -0.50114 0.9915347 0.4831021 -0.5061584 0.9915347 0.4831021 -0.5125072 0.9915347 0.4831021 -0.5205393 0.9915347 0.4831021 -0.530701 0.9915347 0.4831021 -0.5435568 0.9915347 0.4831021 -0.5598211 0.9915347 0.4831021 -0.5803976 0.9915347 0.4831021 -0.6064294 0.9915347 0.4831021 -0.6393632 0.9915347 0.4831021 -0.6810286 0.9915347 0.4831021 -0.7337408 0.9915347 0.4831021 -0.8004286 0.9915347 0.4831021 -0.8847973 0.9915347 0.4831021 -0.9915347 0.9915347 0.4831021 -0.9934166 0.9004144 0.550248 -0.9948617 0.8517098 0.6137599 -0.9959785 0.8320179 0.6723217 -0.9968458 0.8310457 0.7250697 -0.997522 0.8412181 0.7715919 -0.9980506 0.8572168 0.8118697 -0.9984649 0.8755007 0.8461864 -0.9987902 0.893858 0.8750274 -0.999046 0.9110221 0.8989895 -0.9992473 0.9263642 0.9187089 -0.9994059 0.9396628 0.9348097 -0.999531 0.9509395 0.9478718 -0.9996296 0.9603483 0.9584137 -0.9997074 0.9681036 0.9668859 -0.9997689 0.974437 0.9736717 -0.9998174 0.9795725 0.9790921 -0.9998557 0.9837138 0.9834126 -0.999886 0.9870391 0.9868503 -0.9999099 0.9897001 0.9895819 -0.9999288 0.991824 0.99175 -0.9999437 0.9935157 0.9934694 -0.5504963 0.993424 0.5510149 -0.5504818 0.9934236 0.5509758 -0.550464 0.9934231 0.5509267 -0.5504419 0.9934225 0.5508651 -0.550415 0.9934218 0.5507882 -0.5503825 0.9934209 0.5506924 -0.5503438 0.9934197 0.5505736 -0.5502987 0.9934183 0.5504271 -0.550248 0.9934166 0.550248 -0.5504105 0.9934166 0.550248 -0.5506161 0.9934166 0.550248 -0.5508762 0.9934166 0.550248 -0.5512052 0.9934166 0.550248 -0.5516215 0.9934166 0.550248 -0.5521481 0.9934166 0.550248 -0.5528144 0.9934166 0.550248 -0.5536574 0.9934166 0.550248 -0.5547238 0.9934166 0.550248 -0.5560729 0.9934166 0.550248 -0.5577798 0.9934166 0.550248 -0.5599391 0.9934166 0.550248 -0.562671 0.9934166 0.550248 -0.5661273 0.9934166 0.550248 -0.5704998 0.9934166 0.550248 -0.5760317 0.9934166 0.550248 -0.5830302 0.9934166 0.550248 -0.5918842 0.9934166 0.550248 -0.6030857 0.9934166 0.550248 -0.6172571 0.9934166 0.550248 -0.6351857 0.9934166 0.550248 -0.6578677 0.9934166 0.550248 -0.6865634 0.9934166 0.550248 -0.7228673 0.9934166 0.550248 -0.7687963 0.9934166 0.550248 -0.8269025 0.9934166 0.550248 -0.9004144 0.9934166 0.550248 -0.9934166 0.9934166 0.550248 -0.9948617 0.9149079 0.6137599 -0.9959785 0.8744323 0.6723217 -0.9968458 0.8591922 0.7250697 -0.997522 0.8597104 0.7715919 -0.9980506 0.8692608 0.8118697 -0.9984649 0.8832864 0.8461864 -0.9987902 0.8988593 0.8750274 -0.999046 0.9142179 0.8989895 -0.9992473 0.9283974 0.9187089 -0.9994059 0.9409517 0.9348097 -0.999531 0.9517543 0.9478718 -0.9996296 0.9608621 0.9584137 -0.9997074 0.968427 0.9668859 -0.9997689 0.9746403 0.9736717 -0.9998174 0.9797001 0.9790921 -0.9998557 0.9837938 0.9834126 -0.999886 0.9870892 0.9868503 -0.9999099 0.9897315 0.9895819 -0.9999288 0.9918437 0.99175 -0.9999437 0.993528 0.9934694 -0.6139459 0.9948662 0.6142984 -0.6139352 0.994866 0.6142709 -0.6139219 0.9948657 0.6142364 -0.6139056 0.9948653 0.6141932 -0.6138855 0.9948649 0.6141392 -0.6138613 0.9948643 0.6140719 -0.6138323 0.9948636 0.6139885 -0.6137984 0.9948628 0.6138856 -0.6137599 0.9948617 0.6137599 -0.6138703 0.9948617 0.6137599 -0.61401 0.9948617 0.6137599 -0.6141868 0.9948617 0.6137599 -0.6144104 0.9948617 0.6137599 -0.6146932 0.9948617 0.6137599 -0.6150511 0.9948617 0.6137599 -0.6155039 0.9948617 0.6137599 -0.6160767 0.9948617 0.6137599 -0.6168013 0.9948617 0.6137599 -0.6177181 0.9948617 0.6137599 -0.618878 0.9948617 0.6137599 -0.6203453 0.9948617 0.6137599 -0.6222018 0.9948617 0.6137599 -0.6245504 0.9948617 0.6137599 -0.6275217 0.9948617 0.6137599 -0.6312808 0.9948617 0.6137599 -0.6360365 0.9948617 0.6137599 -0.6420531 0.9948617 0.6137599 -0.6496649 0.9948617 0.6137599 -0.6592948 0.9948617 0.6137599 -0.6714779 0.9948617 0.6137599 -0.6868911 0.9948617 0.6137599 -0.7063908 0.9948617 0.6137599 -0.7310605 0.9948617 0.6137599 -0.7622708 0.9948617 0.6137599 -0.801756 0.9948617 0.6137599 -0.8517098 0.9948617 0.6137599 -0.9149079 0.9948617 0.6137599 -0.9948617 0.9948617 0.6137599 -0.9959785 0.928092 0.6723217 -0.9968458 0.8948014 0.7250697 -0.997522 0.8831056 0.7715919 -0.9980506 0.8844979 0.8118697 -0.9984649 0.8931363 0.8461864 -0.9987902 0.9051866 0.8750274 -0.999046 0.918261 0.8989895 -0.9992473 0.9309697 0.9187089 -0.9994059 0.9425824 0.9348097 -0.999531 0.9527851 0.9478718 -0.9996296 0.9615121 0.9584137 -0.9997074 0.9688361 0.9668859 -0.9997689 0.9748974 0.9736717 -0.9998174 0.9798615 0.9790921 -0.9998557 0.9838951 0.9834126 -0.999886 0.9871526 0.9868503 -0.9999099 0.9897712 0.9895819 -0.9999288 0.9918685 0.99175 -0.9999437 0.9935436 0.9934694 -0.6724572 0.9959813 0.6726938 -0.6724495 0.9959811 0.6726748 -0.6724399 0.9959809 0.672651 -0.672428 0.9959807 0.6726211 -0.6724135 0.9959804 0.6725838 -0.6723959 0.9959801 0.6725373 -0.6723748 0.9959797 0.6724796 -0.67235 0.9959791 0.6724086 -0.6723217 0.9959785 0.6723217 -0.6723958 0.9959785 0.6723217 -0.6724896 0.9959785 0.6723217 -0.6726082 0.9959785 0.6723217 -0.6727582 0.9959785 0.6723217 -0.6729481 0.9959785 0.6723217 -0.6731883 0.9959785 0.6723217 -0.6734921 0.9959785 0.6723217 -0.6738765 0.9959785 0.6723217 -0.6743629 0.9959785 0.6723217 -0.6749782 0.9959785 0.6723217 -0.6757566 0.9959785 0.6723217 -0.6767414 0.9959785 0.6723217 -0.6779873 0.9959785 0.6723217 -0.6795635 0.9959785 0.6723217 -0.6815577 0.9959785 0.6723217 -0.6840805 0.9959785 0.6723217 -0.6872723 0.9959785 0.6723217 -0.6913102 0.9959785 0.6723217 -0.6964188 0.9959785 0.6723217 -0.7028817 0.9959785 0.6723217 -0.7110582 0.9959785 0.6723217 -0.7214025 0.9959785 0.6723217 -0.7344894 0.9959785 0.6723217 -0.7510461 0.9959785 0.6723217 -0.7719924 0.9959785 0.6723217 -0.7984922 0.9959785 0.6723217 -0.8320179 0.9959785 0.6723217 -0.8744323 0.9959785 0.6723217 -0.928092 0.9959785 0.6723217 -0.9959785 0.9959785 0.6723217 -0.9968458 0.9398515 0.7250697 -0.997522 0.9127036 0.7715919 -0.9980506 0.9037748 0.8118697 -0.9984649 0.9055977 0.8461864 -0.9987902 0.9131915 0.8750274 -0.999046 0.923376 0.8989895 -0.9992473 0.934224 0.9187089 -0.9994059 0.9446454 0.9348097 -0.999531 0.9540891 0.9478718 -0.9996296 0.9623345 0.9584137 -0.9997074 0.9693538 0.9668859 -0.9997689 0.9752227 0.9736717 -0.9998174 0.9800658 0.9790921 -0.9998557 0.9840231 0.9834126 -0.999886 0.9872329 0.9868503 -0.9999099 0.9898215 0.9895819 -0.9999288 0.9919 0.99175 -0.9999437 0.9935633 0.9934694 -0.7251659 0.9968475 0.725323 -0.7251605 0.9968474 0.7253101 -0.7251537 0.9968473 0.7252939 -0.7251454 0.9968472 0.7252735 -0.7251351 0.996847 0.7252481 -0.7251226 0.9968468 0.7252164 -0.7251076 0.9968465 0.7251772 -0.7250899 0.9968462 0.7251288 -0.7250697 0.9968458 0.7250697 -0.7251188 0.9968458 0.7250697 -0.7251811 0.9968458 0.7250697 -0.7252598 0.9968458 0.7250697 -0.7253594 0.9968458 0.7250697 -0.7254853 0.9968458 0.7250697 -0.7256447 0.9968458 0.7250697 -0.7258464 0.9968458 0.7250697 -0.7261015 0.9968458 0.7250697 -0.7264242 0.9968458 0.7250697 -0.7268325 0.9968458 0.7250697 -0.7273491 0.9968458 0.7250697 -0.7280026 0.9968458 0.7250697 -0.7288294 0.9968458 0.7250697 -0.7298754 0.9968458 0.7250697 -0.7311988 0.9968458 0.7250697 -0.7328729 0.9968458 0.7250697 -0.734991 0.9968458 0.7250697 -0.7376706 0.9968458 0.7250697 -0.7410607 0.9968458 0.7250697 -0.7453496 0.9968458 0.7250697 -0.7507756 0.9968458 0.7250697 -0.7576402 0.9968458 0.7250697 -0.7663248 0.9968458 0.7250697 -0.7773119 0.9968458 0.7250697 -0.7912121 0.9968458 0.7250697 -0.8087977 0.9968458 0.7250697 -0.8310457 0.9968458 0.7250697 -0.8591922 0.9968458 0.7250697 -0.8948014 0.9968458 0.7250697 -0.9398515 0.9968458 0.7250697 -0.9968458 0.9968458 0.7250697 -0.997522 0.9501488 0.7715919 -0.9980506 0.9281627 0.8118697 -0.9984649 0.9213631 0.8461864 -0.9987902 0.9233187 0.8750274 -0.999046 0.9298472 0.8989895 -0.9992473 0.938341 0.9187089 -0.9994059 0.9472555 0.9348097 -0.999531 0.9557389 0.9478718 -0.9996296 0.9633749 0.9584137 -0.9997074 0.9700086 0.9668859 -0.9997689 0.9756343 0.9736717 -0.9998174 0.9803241 0.9790921 -0.9998557 0.9841852 0.9834126 -0.999886 0.9873344 0.9868503 -0.9999099 0.989885 0.9895819 -0.9999288 0.9919398 0.99175 -0.9999437 0.9935882 0.9934694 -0.7716588 0.997523 0.771762 -0.7716551 0.997523 0.7717534 -0.7716504 0.9975229 0.7717425 -0.7716446 0.9975228 0.7717288 -0.7716375 0.9975227 0.7717117 -0.7716288 0.9975226 0.7716905 -0.7716184 0.9975224 0.7716641 -0.7716061 0.9975222 0.7716316 -0.7715919 0.997522 0.7715919 -0.7716242 0.997522 0.7715919 -0.7716651 0.997522 0.7715919 -0.7717168 0.997522 0.7715919 -0.7717822 0.997522 0.7715919 -0.771865 0.997522 0.7715919 -0.7719697 0.997522 0.7715919 -0.7721022 0.997522 0.7715919 -0.7722698 0.997522 0.7715919 -0.7724818 0.997522 0.7715919 -0.7727501 0.997522 0.7715919 -0.7730895 0.997522 0.7715919 -0.7735188 0.997522 0.7715919 -0.774062 0.997522 0.7715919 -0.7747493 0.997522 0.7715919 -0.7756187 0.997522 0.7715919 -0.7767186 0.997522 0.7715919 -0.7781102 0.997522 0.7715919 -0.7798707 0.997522 0.7715919 -0.782098 0.997522 0.7715919 -0.7849158 0.997522 0.7715919 -0.7884807 0.997522 0.7715919 -0.7929907 0.997522 0.7715919 -0.7986965 0.997522 0.7715919 -0.8059151 0.997522 0.7715919 -0.8150475 0.997522 0.7715919 -0.8266012 0.997522 0.7715919 -0.8412181 0.997522 0.7715919 -0.8597104 0.997522 0.7715919 -0.8831056 0.997522 0.7715919 -0.9127036 0.997522 0.7715919 -0.9501488 0.997522 0.7715919 -0.997522 0.997522 0.7715919 -0.9980506 0.9590165 0.8118697 -0.9984649 0.9413083 0.8461864 -0.9987902 0.9361309 0.8750274 -0.999046 0.9380342 0.8989895 -0.9992473 0.9435497 0.9187089 -0.9994059 0.9505575 0.9348097 -0.999531 0.9578262 0.9478718 -0.9996296 0.9646912 0.9584137 -0.9997074 0.9708371 0.9668859 -0.9997689 0.976155 0.9736717 -0.9998174 0.980651 0.9790921 -0.9998557 0.9843901 0.9834126 -0.999886 0.9874628 0.9868503 -0.9999099 0.9899655 0.9895819 -0.9999288 0.9919901 0.99175 -0.9999437 0.9936197 0.9934694 -0.8119154 0.9980513 0.8119826 -0.8119128 0.9980512 0.8119769 -0.8119096 0.9980512 0.8119696 -0.8119057 0.9980511 0.8119606 -0.8119009 0.9980511 0.8119492 -0.8118949 0.998051 0.8119351 -0.8118878 0.9980509 0.8119176 -0.8118794 0.9980508 0.8118961 -0.8118697 0.9980506 0.8118697 -0.8118907 0.9980506 0.8118697 -0.8119174 0.9980506 0.8118697 -0.811951 0.9980506 0.8118697 -0.8119937 0.9980506 0.8118697 -0.8120476 0.9980506 0.8118697 -0.8121158 0.9980506 0.8118697 -0.8122021 0.9980506 0.8118697 -0.8123112 0.9980506 0.8118697 -0.8124493 0.9980506 0.8118697 -0.812624 0.9980506 0.8118697 -0.8128451 0.9980506 0.8118697 -0.8131247 0.9980506 0.8118697 -0.8134785 0.9980506 0.8118697 -0.8139261 0.9980506 0.8118697 -0.8144923 0.9980506 0.8118697 -0.8152087 0.9980506 0.8118697 -0.816115 0.9980506 0.8118697 -0.8172617 0.9980506 0.8118697 -0.8187123 0.9980506 0.8118697 -0.8205475 0.9980506 0.8118697 -0.8228693 0.9980506 0.8118697 -0.8258066 0.9980506 0.8118697 -0.8295228 0.9980506 0.8118697 -0.8342242 0.9980506 0.8118697 -0.8401721 0.9980506 0.8118697 -0.8476969 0.9980506 0.8118697 -0.8572168 0.9980506 0.8118697 -0.8692608 0.9980506 0.8118697 -0.8844979 0.9980506 0.8118697 -0.9037748 0.9980506 0.8118697 -0.9281627 0.9980506 0.8118697 -0.9590165 0.9980506 0.8118697 -0.9980506 0.9980506 0.8118697 -0.9984649 0.9665416 0.8461864 -0.9987902 0.95234 0.8750274 -0.999046 0.9483917 0.8989895 -0.9992473 0.9501392 0.9187089 -0.9994059 0.9547349 0.9348097 -0.999531 0.9604668 0.9478718 -0.9996296 0.9663564 0.9584137 -0.9997074 0.9718853 0.9668859 -0.9997689 0.9768138 0.9736717 -0.9998174 0.9810645 0.9790921 -0.9998557 0.9846494 0.9834126 -0.999886 0.9876253 0.9868503 -0.9999099 0.9900672 0.9895819 -0.9999288 0.9920538 0.99175 -0.9999437 0.9936595 0.9934694 -0.8462171 0.9984653 0.8462605 -0.8462154 0.9984653 0.8462568 -0.8462132 0.9984653 0.846252 -0.8462106 0.9984653 0.846246 -0.8462073 0.9984652 0.8462386 -0.8462034 0.9984652 0.8462293 -0.8461986 0.9984651 0.8462179 -0.8461929 0.998465 0.8462037 -0.8461864 0.9984649 0.8461864 -0.8462 0.9984649 0.8461864 -0.8462172 0.9984649 0.8461864 -0.846239 0.9984649 0.8461864 -0.8462665 0.9984649 0.8461864 -0.8463014 0.9984649 0.8461864 -0.8463455 0.9984649 0.8461864 -0.8464012 0.9984649 0.8461864 -0.8464718 0.9984649 0.8461864 -0.8465611 0.9984649 0.8461864 -0.846674 0.9984649 0.8461864 -0.8468169 0.9984649 0.8461864 -0.8469977 0.9984649 0.8461864 -0.8472264 0.9984649 0.8461864 -0.8475157 0.9984649 0.8461864 -0.8478818 0.9984649 0.8461864 -0.8483449 0.9984649 0.8461864 -0.8489308 0.9984649 0.8461864 -0.849672 0.9984649 0.8461864 -0.8506097 0.9984649 0.8461864 -0.8517961 0.9984649 0.8461864 -0.853297 0.9984649 0.8461864 -0.8551958 0.9984649 0.8461864 -0.8575981 0.9984649 0.8461864 -0.8606373 0.9984649 0.8461864 -0.8644822 0.9984649 0.8461864 -0.8693466 0.9984649 0.8461864 -0.8755007 0.9984649 0.8461864 -0.8832864 0.9984649 0.8461864 -0.8931363 0.9984649 0.8461864 -0.9055977 0.9984649 0.8461864 -0.9213631 0.9984649 0.8461864 -0.9413083 0.9984649 0.8461864 -0.9665416 0.9984649 0.8461864 -0.9984649 0.9984649 0.8461864 -0.9987902 0.9728467 0.8750274 -0.999046 0.9614952 0.8989895 -0.9992473 0.9584759 0.9187089 -0.9994059 0.9600199 0.9348097 -0.999531 0.9638075 0.9478718 -0.9996296 0.9684632 0.9584137 -0.9997074 0.9732114 0.9668859 -0.9997689 0.9776472 0.9736717 -0.9998174 0.9815876 0.9790921 -0.9998557 0.9849775 0.9834126 -0.999886 0.9878309 0.9868503 -0.9999099 0.990196 0.9895819 -0.9999288 0.9921344 0.99175 -0.9999437 0.99371 0.9934694 -0.8750477 0.9987905 0.8750756 -0.8750466 0.9987905 0.8750731 -0.8750451 0.9987904 0.8750701 -0.8750434 0.9987904 0.8750662 -0.8750412 0.9987904 0.8750613 -0.8750386 0.9987904 0.8750553 -0.8750355 0.9987903 0.8750478 -0.8750317 0.9987903 0.8750386 -0.8750274 0.9987902 0.8750274 -0.8750361 0.9987902 0.8750274 -0.8750472 0.9987902 0.8750274 -0.8750611 0.9987902 0.8750274 -0.8750788 0.9987902 0.8750274 -0.8751012 0.9987902 0.8750274 -0.8751295 0.9987902 0.8750274 -0.8751654 0.9987902 0.8750274 -0.8752107 0.9987902 0.8750274 -0.875268 0.9987902 0.8750274 -0.8753406 0.9987902 0.8750274 -0.8754324 0.9987902 0.8750274 -0.8755485 0.9987902 0.8750274 -0.8756954 0.9987902 0.8750274 -0.8758813 0.9987902 0.8750274 -0.8761164 0.9987902 0.8750274 -0.8764139 0.9987902 0.8750274 -0.8767903 0.9987902 0.8750274 -0.8772664 0.9987902 0.8750274 -0.8778688 0.9987902 0.8750274 -0.8786309 0.9987902 0.8750274 -0.879595 0.9987902 0.8750274 -0.8808147 0.9987902 0.8750274 -0.8823579 0.9987902 0.8750274 -0.8843102 0.9987902 0.8750274 -0.8867801 0.9987902 0.8750274 -0.8899048 0.9987902 0.8750274 -0.893858 0.9987902 0.8750274 -0.8988593 0.9987902 0.8750274 -0.9051866 0.9987902 0.8750274 -0.9131915 0.9987902 0.8750274 -0.9233187 0.9987902 0.8750274 -0.9361309 0.9987902 0.8750274 -0.95234 0.9987902 0.8750274 -0.9728467 0.9987902 0.8750274 -0.9987902 0.9987902 0.8750274 -0.999046 0.978073 0.8989895 -0.9992473 0.9690229 0.9187089 -0.9994059 0.9667062 0.9348097 -0.999531 0.9680339 0.9478718 -0.9996296 0.9711285 0.9584137 -0.9997074 0.974889 0.9668859 -0.9997689 0.9787015 0.9736717 -0.9998174 0.9822495 0.9790921 -0.9998557 0.9853926 0.9834126 -0.999886 0.988091 0.9868503 -0.9999099 0.9903589 0.9895819 -0.9999288 0.9922364 0.99175 -0.9999437 0.9937737 0.9934694 -0.8990028 0.9990461 0.8990206 -0.899002 0.9990461 0.899019 -0.8990011 0.9990461 0.899017 -0.899 0.9990461 0.8990145 -0.8989986 0.9990461 0.8990114 -0.8989969 0.9990461 0.8990075 -0.8989948 0.9990461 0.8990027 -0.8989923 0.999046 0.8989967 -0.8989895 0.999046 0.8989895 -0.8989951 0.999046 0.8989895 -0.8990021 0.999046 0.8989895 -0.8990111 0.999046 0.8989895 -0.8990224 0.999046 0.8989895 -0.8990367 0.999046 0.8989895 -0.8990548 0.999046 0.8989895 -0.8990777 0.999046 0.8989895 -0.8991066 0.999046 0.8989895 -0.8991433 0.999046 0.8989895 -0.8991896 0.999046 0.8989895 -0.8992483 0.999046 0.8989895 -0.8993225 0.999046 0.8989895 -0.8994164 0.999046 0.8989895 -0.8995351 0.999046 0.8989895 -0.8996854 0.999046 0.8989895 -0.8998755 0.999046 0.8989895 -0.9001159 0.999046 0.8989895 -0.9004202 0.999046 0.8989895 -0.9008051 0.999046 0.8989895 -0.9012921 0.999046 0.8989895 -0.9019081 0.999046 0.8989895 -0.9026876 0.999046 0.8989895 -0.9036736 0.999046 0.8989895 -0.9049211 0.999046 0.8989895 -0.9064994 0.999046 0.8989895 -0.908496 0.999046 0.8989895 -0.9110221 0.999046 0.8989895 -0.9142179 0.999046 0.8989895 -0.918261 0.999046 0.8989895 -0.923376 0.999046 0.8989895 -0.9298472 0.999046 0.8989895 -0.9380342 0.999046 0.8989895 -0.9483917 0.999046 0.8989895 -0.9614952 0.999046 0.8989895 -0.978073 0.999046 0.8989895 -0.999046 0.999046 0.8989895 -0.9992473 0.9823663 0.9187089 -0.9994059 0.9751652 0.9348097 -0.999531 0.9733809 0.9478718 -0.9996296 0.9745005 0.9584137 -0.9997074 0.9770115 0.9668859 -0.9997689 0.9800355 0.9736717 -0.9998174 0.9830868 0.9790921 -0.9998557 0.9859177 0.9834126 -0.999886 0.9884201 0.9868503 -0.9999099 0.9905649 0.9895819 -0.9999288 0.9923653 0.99175 -0.9999437 0.9938545 0.9934694 -0.9187175 0.9992474 0.9187289 -0.918717 0.9992474 0.9187278 -0.9187164 0.9992474 0.9187266 -0.9187157 0.9992474 0.9187249 -0.9187148 0.9992474 0.9187229 -0.9187137 0.9992474 0.9187204 -0.9187123 0.9992473 0.9187173 -0.9187107 0.9992473 0.9187135 -0.9187089 0.9992473 0.9187089 -0.9187124 0.9992473 0.9187089 -0.9187169 0.9992473 0.9187089 -0.9187226 0.9992473 0.9187089 -0.9187298 0.9992473 0.9187089 -0.9187389 0.9992473 0.9187089 -0.9187504 0.9992473 0.9187089 -0.918765 0.9992473 0.9187089 -0.9187834 0.9992473 0.9187089 -0.9188067 0.9992473 0.9187089 -0.9188362 0.9992473 0.9187089 -0.9188735 0.9992473 0.9187089 -0.9189207 0.9992473 0.9187089 -0.9189805 0.9992473 0.9187089 -0.919056 0.9992473 0.9187089 -0.9191516 0.9992473 0.9187089 -0.9192725 0.9992473 0.9187089 -0.9194255 0.9992473 0.9187089 -0.9196191 0.9992473 0.9187089 -0.919864 0.9992473 0.9187089 -0.9201738 0.9992473 0.9187089 -0.9205658 0.9992473 0.9187089 -0.9210616 0.9992473 0.9187089 -0.921689 0.9992473 0.9187089 -0.9224827 0.9992473 0.9187089 -0.9234868 0.9992473 0.9187089 -0.9247571 0.9992473 0.9187089 -0.9263642 0.9992473 0.9187089 -0.9283974 0.9992473 0.9187089 -0.9309697 0.9992473 0.9187089 -0.934224 0.9992473 0.9187089 -0.938341 0.9992473 0.9187089 -0.9435497 0.9992473 0.9187089 -0.9501392 0.9992473 0.9187089 -0.9584759 0.9992473 0.9187089 -0.9690229 0.9992473 0.9187089 -0.9823663 0.9992473 0.9187089 -0.9992473 0.9992473 0.9187089 -0.9994059 0.9858669 0.9348097 -0.999531 0.9801456 0.9478718 -0.9996296 0.9787664 0.9584137 -0.9997074 0.9796966 0.9668859 -0.9997689 0.981723 0.9736717 -0.9998174 0.9841461 0.9790921 -0.9998557 0.986582 0.9834126 -0.999886 0.9888363 0.9868503 -0.9999099 0.9908256 0.9895819 -0.9999288 0.9925285 0.99175 -0.9999437 0.9939566 0.9934694 -0.9348153 0.999406 0.9348225 -0.9348149 0.999406 0.9348218 -0.9348146 0.999406 0.934821 -0.9348141 0.999406 0.93482 -0.9348135 0.999406 0.9348187 -0.9348128 0.9994059 0.9348171 -0.9348119 0.9994059 0.9348151 -0.9348109 0.9994059 0.9348127 -0.9348097 0.9994059 0.9348097 -0.9348119 0.9994059 0.9348097 -0.9348148 0.9994059 0.9348097 -0.9348184 0.9994059 0.9348097 -0.934823 0.9994059 0.9348097 -0.9348287 0.9994059 0.9348097 -0.934836 0.9994059 0.9348097 -0.9348453 0.9994059 0.9348097 -0.9348569 0.9994059 0.9348097 -0.9348717 0.9994059 0.9348097 -0.9348904 0.9994059 0.9348097 -0.9349141 0.9994059 0.9348097 -0.934944 0.9994059 0.9348097 -0.9349819 0.9994059 0.9348097 -0.9350298 0.9994059 0.9348097 -0.9350904 0.9994059 0.9348097 -0.935167 0.9994059 0.9348097 -0.935264 0.9994059 0.9348097 -0.9353867 0.9994059 0.9348097 -0.935542 0.9994059 0.9348097 -0.9357384 0.9994059 0.9348097 -0.9359869 0.9994059 0.9348097 -0.9363012 0.9994059 0.9348097 -0.9366989 0.9994059 0.9348097 -0.9372021 0.9994059 0.9348097 -0.9378386 0.9994059 0.9348097 -0.9386439 0.9994059 0.9348097 -0.9396628 0.9994059 0.9348097 -0.9409517 0.9994059 0.9348097 -0.9425824 0.9994059 0.9348097 -0.9446454 0.9994059 0.9348097 -0.9472555 0.9994059 0.9348097 -0.9505575 0.9994059 0.9348097 -0.9547349 0.9994059 0.9348097 -0.9600199 0.9994059 0.9348097 -0.9667062 0.9994059 0.9348097 -0.9751652 0.9994059 0.9348097 -0.9858669 0.9994059 0.9348097 -0.9994059 0.9994059 0.9348097 -0.999531 0.9887038 0.9478718 -0.9996296 0.9841634 0.9584137 -0.9997074 0.9830937 0.9668859 -0.9997689 0.983858 0.9736717 -0.9998174 0.9854863 0.9790921 -0.9998557 0.9874224 0.9834126 -0.999886 0.989363 0.9868503 -0.9999099 0.9911554 0.9895819 -0.9999288 0.992735 0.99175 -0.9999437 0.9940857 0.9934694 -0.9478754 0.999531 0.9478799 -0.9478752 0.999531 0.9478795 -0.947875 0.999531 0.947879 -0.9478746 0.999531 0.9478784 -0.9478743 0.999531 0.9478775 -0.9478738 0.999531 0.9478765 -0.9478733 0.999531 0.9478753 -0.9478726 0.999531 0.9478737 -0.9478718 0.999531 0.9478718 -0.9478733 0.999531 0.9478718 -0.9478751 0.999531 0.9478718 -0.9478773 0.999531 0.9478718 -0.9478802 0.999531 0.9478718 -0.9478839 0.999531 0.9478718 -0.9478885 0.999531 0.9478718 -0.9478943 0.999531 0.9478718 -0.9479017 0.999531 0.9478718 -0.947911 0.999531 0.9478718 -0.9479229 0.999531 0.9478718 -0.9479378 0.999531 0.9478718 -0.9479567 0.999531 0.9478718 -0.9479807 0.999531 0.9478718 -0.9480109 0.999531 0.9478718 -0.9480493 0.999531 0.9478718 -0.9480977 0.999531 0.9478718 -0.948159 0.999531 0.9478718 -0.9482366 0.999531 0.9478718 -0.9483347 0.999531 0.9478718 -0.9484589 0.999531 0.9478718 -0.9486159 0.999531 0.9478718 -0.9488147 0.999531 0.9478718 -0.949066 0.999531 0.9478718 -0.9493841 0.999531 0.9478718 -0.9497865 0.999531 0.9478718 -0.9502955 0.999531 0.9478718 -0.9509395 0.999531 0.9478718 -0.9517543 0.999531 0.9478718 -0.9527851 0.999531 0.9478718 -0.9540891 0.999531 0.9478718 -0.9557389 0.999531 0.9478718 -0.9578262 0.999531 0.9478718 -0.9604668 0.999531 0.9478718 -0.9638075 0.999531 0.9478718 -0.9680339 0.999531 0.9478718 -0.9733809 0.999531 0.9478718 -0.9801456 0.999531 0.9478718 -0.9887038 0.999531 0.9478718 -0.999531 0.999531 0.9478718 -0.9996296 0.9909914 0.9584137 -0.9997074 0.9873914 0.9668859 -0.9997689 0.9865591 0.9736717 -0.9998174 0.9871818 0.9790921 -0.9998557 0.9884857 0.9834126 -0.999886 0.9900293 0.9868503 -0.9999099 0.9915727 0.9895819 -0.9999288 0.9929962 0.99175 -0.9999437 0.9942491 0.9934694 -0.958416 0.9996296 0.9584189 -0.9584159 0.9996296 0.9584186 -0.9584157 0.9996296 0.9584183 -0.9584155 0.9996296 0.9584178 -0.9584153 0.9996296 0.9584173 -0.958415 0.9996296 0.9584167 -0.9584146 0.9996296 0.9584159 -0.9584142 0.9996296 0.9584149 -0.9584137 0.9996296 0.9584137 -0.9584146 0.9996296 0.9584137 -0.9584157 0.9996296 0.9584137 -0.9584172 0.9996296 0.9584137 -0.958419 0.9996296 0.9584137 -0.9584213 0.9996296 0.9584137 -0.9584242 0.9996296 0.9584137 -0.9584279 0.9996296 0.9584137 -0.9584325 0.9996296 0.9584137 -0.9584384 0.9996296 0.9584137 -0.9584459 0.9996296 0.9584137 -0.9584553 0.9996296 0.9584137 -0.9584673 0.9996296 0.9584137 -0.9584823 0.9996296 0.9584137 -0.9585014 0.9996296 0.9584137 -0.9585256 0.9996296 0.9584137 -0.9585562 0.9996296 0.9584137 -0.9585948 0.9996296 0.9584137 -0.9586437 0.9996296 0.9584137 -0.9587056 0.9996296 0.9584137 -0.9587839 0.9996296 0.9584137 -0.958883 0.9996296 0.9584137 -0.9590083 0.9996296 0.9584137 -0.9591668 0.9996296 0.9584137 -0.9593674 0.9996296 0.9584137 -0.9596211 0.9996296 0.9584137 -0.9599421 0.9996296 0.9584137 -0.9603483 0.9996296 0.9584137 -0.9608621 0.9996296 0.9584137 -0.9615121 0.9996296 0.9584137 -0.9623345 0.9996296 0.9584137 -0.9633749 0.9996296 0.9584137 -0.9646912 0.9996296 0.9584137 -0.9663564 0.9996296 0.9584137 -0.9684632 0.9996296 0.9584137 -0.9711285 0.9996296 0.9584137 -0.9745005 0.9996296 0.9584137 -0.9787664 0.9996296 0.9584137 -0.9841634 0.9996296 0.9584137 -0.9909914 0.9996296 0.9584137 -0.9996296 0.9996296 0.9584137 -0.9997074 0.9928287 0.9668859 -0.9997689 0.9899763 0.9736717 -0.9998174 0.9893269 0.9790921 -0.9998557 0.9898309 0.9834126 -0.999886 0.9908722 0.9868503 -0.9999099 0.9921006 0.9895819 -0.9999288 0.9933266 0.99175 -0.9999437 0.9944559 0.9934694 -0.9668873 0.9997074 0.9668891 -0.9668872 0.9997074 0.966889 -0.9668871 0.9997074 0.9668888 -0.966887 0.9997074 0.9668885 -0.9668869 0.9997074 0.9668882 -0.9668867 0.9997074 0.9668878 -0.9668865 0.9997074 0.9668873 -0.9668862 0.9997074 0.9668866 -0.9668859 0.9997074 0.9668859 -0.9668864 0.9997074 0.9668859 -0.9668872 0.9997074 0.9668859 -0.9668881 0.9997074 0.9668859 -0.9668892 0.9997074 0.9668859 -0.9668907 0.9997074 0.9668859 -0.9668925 0.9997074 0.9668859 -0.9668948 0.9997074 0.9668859 -0.9668977 0.9997074 0.9668859 -0.9669014 0.9997074 0.9668859 -0.9669061 0.9997074 0.9668859 -0.9669121 0.9997074 0.9668859 -0.9669196 0.9997074 0.9668859 -0.9669291 0.9997074 0.9668859 -0.9669411 0.9997074 0.9668859 -0.9669563 0.9997074 0.9668859 -0.9669755 0.9997074 0.9668859 -0.9669999 0.9997074 0.9668859 -0.9670307 0.9997074 0.9668859 -0.9670696 0.9997074 0.9668859 -0.9671189 0.9997074 0.9668859 -0.9671812 0.9997074 0.9668859 -0.9672601 0.9997074 0.9668859 -0.9673599 0.9997074 0.9668859 -0.9674862 0.9997074 0.9668859 -0.9676459 0.9997074 0.9668859 -0.9678479 0.9997074 0.9668859 -0.9681036 0.9997074 0.9668859 -0.968427 0.9997074 0.9668859 -0.9688361 0.9997074 0.9668859 -0.9693538 0.9997074 0.9668859 -0.9700086 0.9997074 0.9668859 -0.9708371 0.9997074 0.9668859 -0.9718853 0.9997074 0.9668859 -0.9732114 0.9997074 0.9668859 -0.974889 0.9997074 0.9668859 -0.9770115 0.9997074 0.9668859 -0.9796966 0.9997074 0.9668859 -0.9830937 0.9997074 0.9668859 -0.9873914 0.9997074 0.9668859 -0.9928287 0.9997074 0.9668859 -0.9997074 0.9997074 0.9668859 -0.9997689 0.9942995 0.9736717 -0.9998174 0.9920406 0.9790921 -0.9998557 0.9915327 0.9834126 -0.999886 0.9919386 0.9868503 -0.9999099 0.9927684 0.9895819 -0.9999288 0.9937446 0.99175 -0.9999437 0.9947175 0.9934694 -0.9736726 0.9997689 0.9736738 -0.9736726 0.9997689 0.9736737 -0.9736725 0.9997689 0.9736735 -0.9736724 0.9997689 0.9736734 -0.9736723 0.9997689 0.9736732 -0.9736722 0.9997689 0.9736729 -0.9736721 0.9997689 0.9736726 -0.9736719 0.9997689 0.9736722 -0.9736717 0.9997689 0.9736717 -0.9736721 0.9997689 0.9736717 -0.9736725 0.9997689 0.9736717 -0.9736731 0.9997689 0.9736717 -0.9736738 0.9997689 0.9736717 -0.9736747 0.9997689 0.9736717 -0.9736759 0.9997689 0.9736717 -0.9736773 0.9997689 0.9736717 -0.9736792 0.9997689 0.9736717 -0.9736815 0.9997689 0.9736717 -0.9736844 0.9997689 0.9736717 -0.9736882 0.9997689 0.9736717 -0.9736929 0.9997689 0.9736717 -0.9736989 0.9997689 0.9736717 -0.9737064 0.9997689 0.9736717 -0.973716 0.9997689 0.9736717 -0.9737281 0.9997689 0.9736717 -0.9737434 0.9997689 0.9736717 -0.9737627 0.9997689 0.9736717 -0.9737872 0.9997689 0.9736717 -0.9738182 0.9997689 0.9736717 -0.9738573 0.9997689 0.9736717 -0.9739069 0.9997689 0.9736717 -0.9739696 0.9997689 0.9736717 -0.974049 0.9997689 0.9736717 -0.9741494 0.9997689 0.9736717 -0.9742763 0.9997689 0.9736717 -0.974437 0.9997689 0.9736717 -0.9746403 0.9997689 0.9736717 -0.9748974 0.9997689 0.9736717 -0.9752227 0.9997689 0.9736717 -0.9756343 0.9997689 0.9736717 -0.976155 0.9997689 0.9736717 -0.9768138 0.9997689 0.9736717 -0.9776472 0.9997689 0.9736717 -0.9787015 0.9997689 0.9736717 -0.9800355 0.9997689 0.9736717 -0.981723 0.9997689 0.9736717 -0.983858 0.9997689 0.9736717 -0.9865591 0.9997689 0.9736717 -0.9899763 0.9997689 0.9736717 -0.9942995 0.9997689 0.9736717 -0.9997689 0.9997689 0.9736717 -0.9998174 0.9954739 0.9790921 -0.9998557 0.9936858 0.9834126 -0.999886 0.9932878 0.9868503 -0.9999099 0.9936133 0.9895819 -0.9999288 0.9942735 0.99175 -0.9999437 0.9950484 0.9934694 -0.9790927 0.9998174 0.9790934 -0.9790927 0.9998174 0.9790934 -0.9790927 0.9998174 0.9790933 -0.9790926 0.9998174 0.9790932 -0.9790925 0.9998174 0.9790931 -0.9790925 0.9998174 0.9790929 -0.9790924 0.9998174 0.9790927 -0.9790923 0.9998174 0.9790924 -0.9790921 0.9998174 0.9790921 -0.9790924 0.9998174 0.9790921 -0.9790927 0.9998174 0.9790921 -0.979093 0.9998174 0.9790921 -0.9790935 0.9998174 0.9790921 -0.979094 0.9998174 0.9790921 -0.9790948 0.9998174 0.9790921 -0.9790957 0.9998174 0.9790921 -0.9790968 0.9998174 0.9790921 -0.9790983 0.9998174 0.9790921 -0.9791001 0.9998174 0.9790921 -0.9791025 0.9998174 0.9790921 -0.9791054 0.9998174 0.9790921 -0.9791092 0.9998174 0.9790921 -0.9791139 0.9998174 0.9790921 -0.9791199 0.9998174 0.9790921 -0.9791275 0.9998174 0.9790921 -0.9791371 0.9998174 0.9790921 -0.9791493 0.9998174 0.9790921 -0.9791646 0.9998174 0.9790921 -0.9791841 0.9998174 0.9790921 -0.9792087 0.9998174 0.9790921 -0.9792398 0.9998174 0.9790921 -0.9792792 0.9998174 0.9790921 -0.979329 0.9998174 0.9790921 -0.979392 0.9998174 0.9790921 -0.9794717 0.9998174 0.9790921 -0.9795725 0.9998174 0.9790921 -0.9797001 0.9998174 0.9790921 -0.9798615 0.9998174 0.9790921 -0.9800658 0.9998174 0.9790921 -0.9803241 0.9998174 0.9790921 -0.980651 0.9998174 0.9790921 -0.9810645 0.9998174 0.9790921 -0.9815876 0.9998174 0.9790921 -0.9822495 0.9998174 0.9790921 -0.9830868 0.9998174 0.9790921 -0.9841461 0.9998174 0.9790921 -0.9854863 0.9998174 0.9790921 -0.9871818 0.9998174 0.9790921 -0.9893269 0.9998174 0.9790921 -0.9920406 0.9998174 0.9790921 -0.9954739 0.9998174 0.9790921 -0.9998174 0.9998174 0.9790921 -0.9998557 0.9964097 0.9834126 -0.999886 0.9949946 0.9868503 -0.9999099 0.9946823 0.9895819 -0.9999288 0.9949426 0.99175 -0.9999437 0.995467 0.9934694 -0.9834129 0.9998557 0.9834134 -0.9834129 0.9998557 0.9834133 -0.9834129 0.9998557 0.9834133 -0.9834129 0.9998557 0.9834132 -0.9834128 0.9998557 0.9834131 -0.9834128 0.9998557 0.983413 -0.9834127 0.9998557 0.9834129 -0.9834127 0.9998557 0.9834128 -0.9834126 0.9998557 0.9834126 -0.9834127 0.9998557 0.9834126 -0.9834129 0.9998557 0.9834126 -0.9834131 0.9998557 0.9834126 -0.9834134 0.9998557 0.9834126 -0.9834138 0.9998557 0.9834126 -0.9834142 0.9998557 0.9834126 -0.9834148 0.9998557 0.9834126 -0.9834155 0.9998557 0.9834126 -0.9834164 0.9998557 0.9834126 -0.9834176 0.9998557 0.9834126 -0.9834191 0.9998557 0.9834126 -0.9834209 0.9998557 0.9834126 -0.9834233 0.9998557 0.9834126 -0.9834262 0.9998557 0.9834126 -0.98343 0.9998557 0.9834126 -0.9834348 0.9998557 0.9834126 -0.9834408 0.9998557 0.9834126 -0.9834484 0.9998557 0.9834126 -0.983458 0.9998557 0.9834126 -0.9834702 0.9998557 0.9834126 -0.9834856 0.9998557 0.9834126 -0.9835052 0.9998557 0.9834126 -0.9835298 0.9998557 0.9834126 -0.9835611 0.9998557 0.9834126 -0.9836006 0.9998557 0.9834126 -0.9836506 0.9998557 0.9834126 -0.9837138 0.9998557 0.9834126 -0.9837938 0.9998557 0.9834126 -0.9838951 0.9998557 0.9834126 -0.9840231 0.9998557 0.9834126 -0.9841852 0.9998557 0.9834126 -0.9843901 0.9998557 0.9834126 -0.9846494 0.9998557 0.9834126 -0.9849775 0.9998557 0.9834126 -0.9853926 0.9998557 0.9834126 -0.9859177 0.9998557 0.9834126 -0.986582 0.9998557 0.9834126 -0.9874224 0.9998557 0.9834126 -0.9884857 0.9998557 0.9834126 -0.9898309 0.9998557 0.9834126 -0.9915327 0.9998557 0.9834126 -0.9936858 0.9998557 0.9834126 -0.9964097 0.9998557 0.9834126 -0.9998557 0.9998557 0.9834126 -0.999886 0.9971541 0.9868503 -0.9999099 0.9960346 0.9895819 -0.9999288 0.995789 0.99175 -0.9999437 0.9959967 0.9934694 -0.9868505 0.999886 0.9868508 -0.9868505 0.999886 0.9868508 -0.9868505 0.999886 0.9868507 -0.9868505 0.999886 0.9868507 -0.9868504 0.999886 0.9868506 -0.9868504 0.999886 0.9868506 -0.9868504 0.999886 0.9868505 -0.9868503 0.999886 0.9868504 -0.9868503 0.999886 0.9868503 -0.9868504 0.999886 0.9868503 -0.9868505 0.999886 0.9868503 -0.9868506 0.999886 0.9868503 -0.9868508 0.999886 0.9868503 -0.986851 0.999886 0.9868503 -0.9868513 0.999886 0.9868503 -0.9868517 0.999886 0.9868503 -0.9868521 0.999886 0.9868503 -0.9868527 0.999886 0.9868503 -0.9868534 0.999886 0.9868503 -0.9868543 0.999886 0.9868503 -0.9868555 0.999886 0.9868503 -0.986857 0.999886 0.9868503 -0.9868588 0.999886 0.9868503 -0.9868612 0.999886 0.9868503 -0.9868642 0.999886 0.9868503 -0.986868 0.999886 0.9868503 -0.9868727 0.999886 0.9868503 -0.9868788 0.999886 0.9868503 -0.9868864 0.999886 0.9868503 -0.9868961 0.999886 0.9868503 -0.9869083 0.999886 0.9868503 -0.9869238 0.999886 0.9868503 -0.9869433 0.999886 0.9868503 -0.9869681 0.999886 0.9868503 -0.9869994 0.999886 0.9868503 -0.9870391 0.999886 0.9868503 -0.9870892 0.999886 0.9868503 -0.9871526 0.999886 0.9868503 -0.9872329 0.999886 0.9868503 -0.9873344 0.999886 0.9868503 -0.9874628 0.999886 0.9868503 -0.9876253 0.999886 0.9868503 -0.9878309 0.999886 0.9868503 -0.988091 0.999886 0.9868503 -0.9884201 0.999886 0.9868503 -0.9888363 0.999886 0.9868503 -0.989363 0.999886 0.9868503 -0.9900293 0.999886 0.9868503 -0.9908722 0.999886 0.9868503 -0.9919386 0.999886 0.9868503 -0.9932878 0.999886 0.9868503 -0.9949946 0.999886 0.9868503 -0.9971541 0.999886 0.9868503 -0.999886 0.999886 0.9868503 -0.9999099 0.9977454 0.9895819 -0.9999288 0.9968599 0.99175 -0.9999437 0.9966667 0.9934694 -0.989582 0.9999099 0.9895822 -0.989582 0.9999099 0.9895822 -0.989582 0.9999099 0.9895821 -0.989582 0.9999099 0.9895821 -0.989582 0.9999099 0.9895821 -0.9895819 0.9999099 0.989582 -0.9895819 0.9999099 0.989582 -0.9895819 0.9999099 0.9895819 -0.9895819 0.9999099 0.9895819 -0.9895819 0.9999099 0.9895819 -0.989582 0.9999099 0.9895819 -0.9895821 0.9999099 0.9895819 -0.9895822 0.9999099 0.9895819 -0.9895823 0.9999099 0.9895819 -0.9895825 0.9999099 0.9895819 -0.9895827 0.9999099 0.9895819 -0.989583 0.9999099 0.9895819 -0.9895834 0.9999099 0.9895819 -0.9895838 0.9999099 0.9895819 -0.9895844 0.9999099 0.9895819 -0.9895851 0.9999099 0.9895819 -0.9895861 0.9999099 0.9895819 -0.9895872 0.9999099 0.9895819 -0.9895887 0.9999099 0.9895819 -0.9895906 0.9999099 0.9895819 -0.9895929 0.9999099 0.9895819 -0.9895959 0.9999099 0.9895819 -0.9895997 0.9999099 0.9895819 -0.9896045 0.9999099 0.9895819 -0.9896105 0.9999099 0.9895819 -0.9896182 0.9999099 0.9895819 -0.9896279 0.9999099 0.9895819 -0.9896401 0.9999099 0.9895819 -0.9896557 0.9999099 0.9895819 -0.9896753 0.9999099 0.9895819 -0.9897001 0.9999099 0.9895819 -0.9897315 0.9999099 0.9895819 -0.9897712 0.9999099 0.9895819 -0.9898215 0.9999099 0.9895819 -0.989885 0.9999099 0.9895819 -0.9899655 0.9999099 0.9895819 -0.9900672 0.9999099 0.9895819 -0.990196 0.9999099 0.9895819 -0.9903589 0.9999099 0.9895819 -0.9905649 0.9999099 0.9895819 -0.9908256 0.9999099 0.9895819 -0.9911554 0.9999099 0.9895819 -0.9915727 0.9999099 0.9895819 -0.9921006 0.9999099 0.9895819 -0.9927684 0.9999099 0.9895819 -0.9936133 0.9999099 0.9895819 -0.9946823 0.9999099 0.9895819 -0.9960346 0.9999099 0.9895819 -0.9977454 0.9999099 0.9895819 -0.9999099 0.9999099 0.9895819 -0.9999288 0.9982148 0.99175 -0.9999437 0.9975144 0.9934694 -0.9917501 0.9999288 0.9917502 -0.9917501 0.9999288 0.9917502 -0.9917501 0.9999288 0.9917502 -0.9917501 0.9999288 0.9917502 -0.9917501 0.9999288 0.9917501 -0.9917501 0.9999288 0.9917501 -0.99175 0.9999288 0.9917501 -0.99175 0.9999288 0.9917501 -0.99175 0.9999288 0.99175 -0.99175 0.9999288 0.99175 -0.9917501 0.9999288 0.99175 -0.9917501 0.9999288 0.99175 -0.9917502 0.9999288 0.99175 -0.9917503 0.9999288 0.99175 -0.9917504 0.9999288 0.99175 -0.9917505 0.9999288 0.99175 -0.9917507 0.9999288 0.99175 -0.991751 0.9999288 0.99175 -0.9917512 0.9999288 0.99175 -0.9917516 0.9999288 0.99175 -0.9917521 0.9999288 0.99175 -0.9917526 0.9999288 0.99175 -0.9917534 0.9999288 0.99175 -0.9917543 0.9999288 0.99175 -0.9917555 0.9999288 0.99175 -0.9917569 0.9999288 0.99175 -0.9917588 0.9999288 0.99175 -0.9917612 0.9999288 0.99175 -0.9917642 0.9999288 0.99175 -0.991768 0.9999288 0.99175 -0.9917727 0.9999288 0.99175 -0.9917788 0.9999288 0.99175 -0.9917865 0.9999288 0.99175 -0.9917962 0.9999288 0.99175 -0.9918085 0.9999288 0.99175 -0.991824 0.9999288 0.99175 -0.9918437 0.9999288 0.99175 -0.9918685 0.9999288 0.99175 -0.9919 0.9999288 0.99175 -0.9919398 0.9999288 0.99175 -0.9919901 0.9999288 0.99175 -0.9920538 0.9999288 0.99175 -0.9921344 0.9999288 0.99175 -0.9922364 0.9999288 0.99175 -0.9923653 0.9999288 0.99175 -0.9925285 0.9999288 0.99175 -0.992735 0.9999288 0.99175 -0.9929962 0.9999288 0.99175 -0.9933266 0.9999288 0.99175 -0.9937446 0.9999288 0.99175 -0.9942735 0.9999288 0.99175 -0.9949426 0.9999288 0.99175 -0.995789 0.9999288 0.99175 -0.9968599 0.9999288 0.99175 -0.9982148 0.9999288 0.99175 -0.9999288 0.9999288 0.99175 -0.9999437 0.9985869 0.9934694 -0.9934695 0.9999437 0.9934696 -0.9934695 0.9999437 0.9934695 -0.9934695 0.9999437 0.9934695 -0.9934695 0.9999437 0.9934695 -0.9934695 0.9999437 0.9934695 -0.9934695 0.9999437 0.9934695 -0.9934695 0.9999437 0.9934695 -0.9934694 0.9999437 0.9934695 -0.9934694 0.9999437 0.9934694 -0.9934695 0.9999437 0.9934694 -0.9934695 0.9999437 0.9934694 -0.9934695 0.9999437 0.9934694 -0.9934696 0.9999437 0.9934694 -0.9934696 0.9999437 0.9934694 -0.9934697 0.9999437 0.9934694 -0.9934698 0.9999437 0.9934694 -0.9934699 0.9999437 0.9934694 -0.99347 0.9999437 0.9934694 -0.9934702 0.9999437 0.9934694 -0.9934704 0.9999437 0.9934694 -0.9934707 0.9999437 0.9934694 -0.9934711 0.9999437 0.9934694 -0.9934715 0.9999437 0.9934694 -0.9934721 0.9999437 0.9934694 -0.9934728 0.9999437 0.9934694 -0.9934738 0.9999437 0.9934694 -0.9934749 0.9999437 0.9934694 -0.9934764 0.9999437 0.9934694 -0.9934783 0.9999437 0.9934694 -0.9934807 0.9999437 0.9934694 -0.9934837 0.9999437 0.9934694 -0.9934875 0.9999437 0.9934694 -0.9934923 0.9999437 0.9934694 -0.9934983 0.9999437 0.9934694 -0.993506 0.9999437 0.9934694 -0.9935157 0.9999437 0.9934694 -0.993528 0.9999437 0.9934694 -0.9935436 0.9999437 0.9934694 -0.9935633 0.9999437 0.9934694 -0.9935882 0.9999437 0.9934694 -0.9936197 0.9999437 0.9934694 -0.9936595 0.9999437 0.9934694 -0.99371 0.9999437 0.9934694 -0.9937737 0.9999437 0.9934694 -0.9938545 0.9999437 0.9934694 -0.9939566 0.9999437 0.9934694 -0.9940857 0.9999437 0.9934694 -0.9942491 0.9999437 0.9934694 -0.9944559 0.9999437 0.9934694 -0.9947175 0.9999437 0.9934694 -0.9950484 0.9999437 0.9934694 -0.995467 0.9999437 0.9934694 -0.9959967 0.9999437 0.9934694 -0.9966667 0.9999437 0.9934694 -0.9975144 0.9999437 0.9934694 -0.9985869 0.9999437 0.9934694 -0.9999437 0.9999437 0.9934694 -0.0000238 0.0000238 0.0142868 -0.0005417 0.0000238 0.0142868 -0.0011968 0.0000238 0.0142868 -0.0020256 0.0000238 0.0142868 -0.0030742 0.0000238 0.0142868 -0.0044007 0.0000238 0.0142868 -0.006079 0.0000238 0.0142868 -0.0082023 0.0000238 0.0142868 -0.0108885 0.0000238 0.0142868 -0.0142868 0.0000238 0.0142868 -0.0185862 0.0000238 0.0142868 -0.0240255 0.0000238 0.0142868 -0.0309069 0.0000238 0.0142868 -0.0396127 0.0000238 0.0142868 -0.0506267 0.0000238 0.0142868 -0.0645609 0.0000238 0.0142868 -0.0821895 0.0000238 0.0142868 -0.1044919 0.0000238 0.0142868 -0.1327073 0.0000238 0.0142868 -0.1684036 0.0000238 0.0142868 -0.2135639 0.0000238 0.0142868 -0.2706977 0.0000238 0.0142868 -0.3429792 0.0000238 0.0142868 -0.4344249 0.0000238 0.0142868 -0.5501155 0.0000238 0.0142868 -0.6964791 0.0000238 0.0142868 -0.8407292 0.0051514 0.0186694 -0.9033413 0.0279321 0.0391214 -0.9354466 0.0624569 0.0712736 -0.9545467 0.1059991 0.112771 -0.9669269 0.1572498 0.1623561 -0.9754027 0.2151269 0.2189162 -0.9814251 0.2783684 0.2811378 -0.9858181 0.3454107 0.3474044 -0.9890841 0.4144197 0.4158337 -0.9915469 0.4834235 0.4844116 -0.993424 0.5504963 0.5511771 -0.9948662 0.6139459 0.6144087 -0.9959813 0.6724572 0.6727678 -0.9968475 0.7251659 0.7253722 -0.997523 0.7716588 0.7717943 -0.9980513 0.8119154 0.8120036 -0.9984653 0.8462171 0.8462741 -0.9987905 0.8750477 0.8750843 -0.9990461 0.8990028 0.8990262 -0.9992474 0.9187175 0.9187324 -0.999406 0.9348153 0.9348247 -0.999531 0.9478754 0.9478814 -0.9996296 0.958416 0.9584198 -0.9997074 0.9668873 0.9668897 -0.9997689 0.9736726 0.9736741 -0.9998174 0.9790927 0.9790937 -0.9998557 0.9834129 0.9834135 -0.999886 0.9868505 0.9868509 -0.9999099 0.989582 0.9895822 -0.9999288 0.9917501 0.9917502 -0.9999437 0.9934695 0.9934696 -0.0000238 0.0005417 0.0142868 -0.0000382 0.0000382 0.0137833 -0.0006933 0.0000382 0.0137833 -0.0015221 0.0000382 0.0137833 -0.0025707 0.0000382 0.0137833 -0.0038972 0.0000382 0.0137833 -0.0055755 0.0000382 0.0137833 -0.0076988 0.0000382 0.0137833 -0.0103849 0.0000382 0.0137833 -0.0137833 0.0000382 0.0137833 -0.0180827 0.0000382 0.0137833 -0.023522 0.0000382 0.0137833 -0.0304033 0.0000382 0.0137833 -0.0391092 0.0000382 0.0137833 -0.0501232 0.0000382 0.0137833 -0.0640574 0.0000382 0.0137833 -0.081686 0.0000382 0.0137833 -0.1039884 0.0000382 0.0137833 -0.1322038 0.0000382 0.0137833 -0.1679 0.0000382 0.0137833 -0.2130604 0.0000382 0.0137833 -0.2701941 0.0000382 0.0137833 -0.3424757 0.0000382 0.0137833 -0.4339214 0.0000382 0.0137833 -0.549612 0.0000382 0.0137833 -0.6959756 0.0000382 0.0137833 -0.8405071 0.0051286 0.0181604 -0.9032596 0.0278872 0.0386748 -0.9354101 0.0624063 0.0709061 -0.9545286 0.1059489 0.1124771 -0.9669173 0.1572031 0.1621254 -0.9753975 0.2150852 0.2187378 -0.9814221 0.2783325 0.2810019 -0.9858163 0.3453807 0.3473024 -0.9890831 0.4143955 0.4157584 -0.9915463 0.4834045 0.4843569 -0.9934236 0.5504818 0.551138 -0.994866 0.6139352 0.6143812 -0.9959811 0.6724495 0.6727489 -0.9968474 0.7251605 0.7253592 -0.997523 0.7716551 0.7717857 -0.9980512 0.8119128 0.8119979 -0.9984653 0.8462154 0.8462703 -0.9987905 0.8750466 0.8750819 -0.9990461 0.899002 0.8990246 -0.9992474 0.918717 0.9187314 -0.999406 0.9348149 0.9348241 -0.999531 0.9478752 0.947881 -0.9996296 0.9584159 0.9584195 -0.9997074 0.9668872 0.9668895 -0.9997689 0.9736726 0.973674 -0.9998174 0.9790927 0.9790936 -0.9998557 0.9834129 0.9834135 -0.999886 0.9868505 0.9868508 -0.9999099 0.989582 0.9895822 -0.9999288 0.9917501 0.9917502 -0.9999437 0.9934695 0.9934696 -0.0000238 0.0011968 0.0142868 -0.0000382 0.0006933 0.0137833 -0.0000611 0.0000611 0.0131511 -0.0008899 0.0000611 0.0131511 -0.0019385 0.0000611 0.0131511 -0.003265 0.0000611 0.0131511 -0.0049433 0.0000611 0.0131511 -0.0070666 0.0000611 0.0131511 -0.0097527 0.0000611 0.0131511 -0.0131511 0.0000611 0.0131511 -0.0174505 0.0000611 0.0131511 -0.0228898 0.0000611 0.0131511 -0.0297711 0.0000611 0.0131511 -0.038477 0.0000611 0.0131511 -0.049491 0.0000611 0.0131511 -0.0634252 0.0000611 0.0131511 -0.0810538 0.0000611 0.0131511 -0.1033562 0.0000611 0.0131511 -0.1315716 0.0000611 0.0131511 -0.1672678 0.0000611 0.0131511 -0.2124282 0.0000611 0.0131511 -0.2695619 0.0000611 0.0131511 -0.3418435 0.0000611 0.0131511 -0.4332891 0.0000611 0.0131511 -0.5489798 0.0000611 0.0131511 -0.6953434 0.0000611 0.0131511 -0.8402274 0.0051047 0.0175208 -0.9031567 0.0278347 0.0381135 -0.9353643 0.0623458 0.0704444 -0.9545059 0.1058883 0.1121079 -0.9669053 0.1571463 0.1618356 -0.9753908 0.2150342 0.2185137 -0.9814183 0.2782884 0.2808311 -0.9858141 0.3453439 0.3471743 -0.9890818 0.4143657 0.4156638 -0.9915455 0.4833811 0.4842882 -0.9934231 0.550464 0.5510889 -0.9948657 0.6139219 0.6143467 -0.9959809 0.6724399 0.672725 -0.9968473 0.7251537 0.725343 -0.9975229 0.7716504 0.7717748 -0.9980512 0.8119096 0.8119906 -0.9984653 0.8462132 0.8462656 -0.9987904 0.8750451 0.8750788 -0.9990461 0.8990011 0.8990226 -0.9992474 0.9187164 0.9187301 -0.999406 0.9348146 0.9348232 -0.999531 0.947875 0.9478804 -0.9996296 0.9584157 0.9584192 -0.9997074 0.9668871 0.9668893 -0.9997689 0.9736725 0.9736739 -0.9998174 0.9790927 0.9790935 -0.9998557 0.9834129 0.9834134 -0.999886 0.9868505 0.9868508 -0.9999099 0.989582 0.9895822 -0.9999288 0.9917501 0.9917502 -0.9999437 0.9934695 0.9934696 -0.0000238 0.0020256 0.0142868 -0.0000382 0.0015221 0.0137833 -0.0000611 0.0008899 0.0131511 -0.0000978 0.0000978 0.012359 -0.0011463 0.0000978 0.012359 -0.0024729 0.0000978 0.012359 -0.0041512 0.0000978 0.012359 -0.0062744 0.0000978 0.012359 -0.0089606 0.0000978 0.012359 -0.012359 0.0000978 0.012359 -0.0166583 0.0000978 0.012359 -0.0220976 0.0000978 0.012359 -0.028979 0.0000978 0.012359 -0.0376849 0.0000978 0.012359 -0.0486989 0.0000978 0.012359 -0.0626331 0.0000978 0.012359 -0.0802616 0.0000978 0.012359 -0.102564 0.0000978 0.012359 -0.1307795 0.0000978 0.012359 -0.1664757 0.0000978 0.012359 -0.2116361 0.0000978 0.012359 -0.2687698 0.0000978 0.012359 -0.3410514 0.0000978 0.012359 -0.432497 0.0000978 0.012359 -0.5481876 0.0000978 0.012359 -0.6945513 0.0000978 0.012359 -0.8398756 0.0050826 0.016719 -0.9030276 0.0277752 0.0374096 -0.9353068 0.0622749 0.0698653 -0.9544774 0.1058162 0.111645 -0.9668902 0.1570779 0.1614723 -0.9753825 0.2149725 0.2182328 -0.9814136 0.2782347 0.2806171 -0.9858113 0.3452987 0.3470137 -0.9890801 0.414329 0.4155452 -0.9915446 0.4833522 0.484202 -0.9934225 0.5504419 0.5510274 -0.9948653 0.6139056 0.6143035 -0.9959807 0.672428 0.6726952 -0.9968472 0.7251454 0.7253227 -0.9975228 0.7716446 0.7717611 -0.9980511 0.8119057 0.8119816 -0.9984653 0.8462106 0.8462596 -0.9987904 0.8750434 0.8750749 -0.9990461 0.899 0.8990201 -0.9992474 0.9187157 0.9187285 -0.999406 0.9348141 0.9348222 -0.999531 0.9478746 0.9478798 -0.9996296 0.9584155 0.9584187 -0.9997074 0.966887 0.9668891 -0.9997689 0.9736724 0.9736737 -0.9998174 0.9790926 0.9790934 -0.9998557 0.9834129 0.9834134 -0.999886 0.9868505 0.9868508 -0.9999099 0.989582 0.9895822 -0.9999288 0.9917501 0.9917502 -0.9999437 0.9934695 0.9934696 -0.0000238 0.0030742 0.0142868 -0.0000382 0.0025707 0.0137833 -0.0000611 0.0019385 0.0131511 -0.0000978 0.0011463 0.012359 -0.0001565 0.0001565 0.0113691 -0.001483 0.0001565 0.0113691 -0.0031613 0.0001565 0.0113691 -0.0052846 0.0001565 0.0113691 -0.0079707 0.0001565 0.0113691 -0.0113691 0.0001565 0.0113691 -0.0156685 0.0001565 0.0113691 -0.0211078 0.0001565 0.0113691 -0.0279891 0.0001565 0.0113691 -0.036695 0.0001565 0.0113691 -0.047709 0.0001565 0.0113691 -0.0616432 0.0001565 0.0113691 -0.0792718 0.0001565 0.0113691 -0.1015742 0.0001565 0.0113691 -0.1297896 0.0001565 0.0113691 -0.1654858 0.0001565 0.0113691 -0.2106462 0.0001565 0.0113691 -0.2677799 0.0001565 0.0113691 -0.3400615 0.0001565 0.0113691 -0.4315072 0.0001565 0.0113691 -0.5471978 0.0001565 0.0113691 -0.6935614 0.0001565 0.0113691 -0.8394338 0.0050676 0.0157161 -0.9028657 0.0277111 0.0365289 -0.9352348 0.0621943 0.0691408 -0.9544418 0.1057322 0.1110659 -0.9668714 0.1569971 0.1610178 -0.9753721 0.2148987 0.2178815 -0.9814076 0.2781701 0.2803496 -0.9858079 0.3452442 0.3468129 -0.9890781 0.4142845 0.4153969 -0.9915433 0.4833171 0.4840944 -0.9934218 0.550415 0.5509505 -0.9948649 0.6138855 0.6142495 -0.9959804 0.6724135 0.6726578 -0.996847 0.7251351 0.7252972 -0.9975227 0.7716375 0.771744 -0.9980511 0.8119009 0.8119703 -0.9984652 0.8462073 0.8462522 -0.9987904 0.8750412 0.8750701 -0.9990461 0.8989986 0.899017 -0.9992474 0.9187148 0.9187265 -0.999406 0.9348135 0.9348209 -0.999531 0.9478743 0.947879 -0.9996296 0.9584153 0.9584182 -0.9997074 0.9668869 0.9668887 -0.9997689 0.9736723 0.9736735 -0.9998174 0.9790925 0.9790933 -0.9998557 0.9834128 0.9834133 -0.999886 0.9868504 0.9868507 -0.9999099 0.989582 0.9895821 -0.9999288 0.9917501 0.9917502 -0.9999437 0.9934695 0.9934695 -0.0000238 0.0044007 0.0142868 -0.0000382 0.0038972 0.0137833 -0.0000611 0.003265 0.0131511 -0.0000978 0.0024729 0.012359 -0.0001565 0.001483 0.0113691 -0.0002504 0.0002504 0.0101365 -0.0019287 0.0002504 0.0101365 -0.004052 0.0002504 0.0101365 -0.0067381 0.0002504 0.0101365 -0.0101365 0.0002504 0.0101365 -0.0144359 0.0002504 0.0101365 -0.0198752 0.0002504 0.0101365 -0.0267565 0.0002504 0.0101365 -0.0354624 0.0002504 0.0101365 -0.0464764 0.0002504 0.0101365 -0.0604106 0.0002504 0.0101365 -0.0780392 0.0002504 0.0101365 -0.1003416 0.0002504 0.0101365 -0.128557 0.0002504 0.0101365 -0.1642532 0.0002504 0.0101365 -0.2094136 0.0002504 0.0101365 -0.2665473 0.0002504 0.0101365 -0.3388289 0.0002504 0.0101365 -0.4302746 0.0002504 0.0101365 -0.5459652 0.0002504 0.0101365 -0.6923288 0.0002504 0.0101365 -0.8388802 0.0050694 0.014466 -0.9026634 0.0276479 0.0354305 -0.9351449 0.0621069 0.0682373 -0.9543974 0.1056375 0.110344 -0.9668479 0.156904 0.1604514 -0.9753591 0.2148124 0.2174438 -0.9814002 0.2780936 0.2800162 -0.9858036 0.3451791 0.3465628 -0.9890755 0.4142311 0.4152122 -0.9915418 0.4832747 0.4839603 -0.9934209 0.5503825 0.5508547 -0.9948643 0.6138613 0.6141822 -0.9959801 0.6723959 0.6726113 -0.9968468 0.7251226 0.7252656 -0.9975226 0.7716288 0.7717228 -0.998051 0.8118949 0.8119561 -0.9984652 0.8462034 0.8462429 -0.9987904 0.8750386 0.875064 -0.9990461 0.8989969 0.8990131 -0.9992474 0.9187137 0.918724 -0.9994059 0.9348128 0.9348193 -0.999531 0.9478738 0.947878 -0.9996296 0.958415 0.9584176 -0.9997074 0.9668867 0.9668883 -0.9997689 0.9736722 0.9736733 -0.9998174 0.9790925 0.9790931 -0.9998557 0.9834128 0.9834132 -0.999886 0.9868504 0.9868507 -0.9999099 0.9895819 0.9895821 -0.9999288 0.9917501 0.9917502 -0.9999437 0.9934695 0.9934695 -0.0000238 0.006079 0.0142868 -0.0000382 0.0055755 0.0137833 -0.0000611 0.0049433 0.0131511 -0.0000978 0.0041512 0.012359 -0.0001565 0.0031613 0.0113691 -0.0002504 0.0019287 0.0101365 -0.0004008 0.0004008 0.0086086 -0.0025241 0.0004008 0.0086086 -0.0052103 0.0004008 0.0086086 -0.0086086 0.0004008 0.0086086 -0.012908 0.0004008 0.0086086 -0.0183473 0.0004008 0.0086086 -0.0252287 0.0004008 0.0086086 -0.0339345 0.0004008 0.0086086 -0.0449485 0.0004008 0.0086086 -0.0588827 0.0004008 0.0086086 -0.0765113 0.0004008 0.0086086 -0.0988137 0.0004008 0.0086086 -0.1270291 0.0004008 0.0086086 -0.1627254 0.0004008 0.0086086 -0.2078857 0.0004008 0.0086086 -0.2650195 0.0004008 0.0086086 -0.337301 0.0004008 0.0086086 -0.4287467 0.0004008 0.0086086 -0.5444373 0.0004008 0.0086086 -0.6908009 0.0004008 0.0086086 -0.8381886 0.0051048 0.0129143 -0.9024114 0.0275966 0.0340663 -0.9350332 0.0620199 0.0671155 -0.9543421 0.1055364 0.1094478 -0.9668187 0.1568008 0.1597484 -0.975343 0.2147144 0.2169006 -0.9813911 0.2780055 0.2796026 -0.9857982 0.3451032 0.3462526 -0.9890723 0.4141683 0.4149832 -0.9915399 0.4832246 0.4837939 -0.9934197 0.5503438 0.550736 -0.9948636 0.6138323 0.6140988 -0.9959797 0.6723748 0.6725537 -0.9968465 0.7251076 0.7252263 -0.9975224 0.7716184 0.7716964 -0.9980509 0.8118878 0.8119387 -0.9984651 0.8461986 0.8462315 -0.9987903 0.8750355 0.8750566 -0.9990461 0.8989948 0.8990083 -0.9992473 0.9187123 0.9187209 -0.9994059 0.9348119 0.9348174 -0.999531 0.9478733 0.9478767 -0.9996296 0.9584146 0.9584168 -0.9997074 0.9668865 0.9668878 -0.9997689 0.9736721 0.9736729 -0.9998174 0.9790924 0.9790929 -0.9998557 0.9834127 0.9834131 -0.999886 0.9868504 0.9868506 -0.9999099 0.9895819 0.9895821 -0.9999288 0.99175 0.9917501 -0.9999437 0.9934695 0.9934695 -0.0000238 0.0082023 0.0142868 -0.0000382 0.0076988 0.0137833 -0.0000611 0.0070666 0.0131511 -0.0000978 0.0062744 0.012359 -0.0001565 0.0052846 0.0113691 -0.0002504 0.004052 0.0101365 -0.0004008 0.0025241 0.0086086 -0.0006416 0.0006416 0.0067261 -0.0033277 0.0006416 0.0067261 -0.0067261 0.0006416 0.0067261 -0.0110255 0.0006416 0.0067261 -0.0164648 0.0006416 0.0067261 -0.0233461 0.0006416 0.0067261 -0.032052 0.0006416 0.0067261 -0.043066 0.0006416 0.0067261 -0.0570002 0.0006416 0.0067261 -0.0746288 0.0006416 0.0067261 -0.0969312 0.0006416 0.0067261 -0.1251466 0.0006416 0.0067261 -0.1608428 0.0006416 0.0067261 -0.2060032 0.0006416 0.0067261 -0.2631369 0.0006416 0.0067261 -0.3354185 0.0006416 0.0067261 -0.4268641 0.0006416 0.0067261 -0.5425548 0.0006416 0.0067261 -0.6889184 0.0006416 0.0067261 -0.8373283 0.0052028 0.0109995 -0.9020992 0.0275778 0.0323815 -0.9348949 0.0619473 0.0657302 -0.9542739 0.1054384 0.1083415 -0.9667827 0.1566936 0.1588809 -0.9753231 0.2146085 0.2162305 -0.9813797 0.2779077 0.2790924 -0.9857916 0.3450175 0.34587 -0.9890684 0.4140964 0.4147008 -0.9915376 0.4831666 0.4835889 -0.9934183 0.5502987 0.5505896 -0.9948628 0.6137984 0.613996 -0.9959791 0.67235 0.6724827 -0.9968462 0.7250899 0.725178 -0.9975222 0.7716061 0.7716639 -0.9980508 0.8118794 0.8119171 -0.998465 0.8461929 0.8462173 -0.9987903 0.8750317 0.8750474 -0.999046 0.8989923 0.8990023 -0.9992473 0.9187107 0.9187171 -0.9994059 0.9348109 0.9348149 -0.999531 0.9478726 0.9478751 -0.9996296 0.9584142 0.9584158 -0.9997074 0.9668862 0.9668872 -0.9997689 0.9736719 0.9736725 -0.9998174 0.9790923 0.9790927 -0.9998557 0.9834127 0.9834129 -0.999886 0.9868503 0.9868505 -0.9999099 0.9895819 0.989582 -0.9999288 0.99175 0.9917501 -0.9999437 0.9934694 0.9934695 -0.0000238 0.0108885 0.0142868 -0.0000382 0.0103849 0.0137833 -0.0000611 0.0097527 0.0131511 -0.0000978 0.0089606 0.012359 -0.0001565 0.0079707 0.0113691 -0.0002504 0.0067381 0.0101365 -0.0004008 0.0052103 0.0086086 -0.0006416 0.0033277 0.0067261 -0.0010268 0.0010268 0.0044252 -0.0044252 0.0010268 0.0044252 -0.0087246 0.0010268 0.0044252 -0.0141639 0.0010268 0.0044252 -0.0210452 0.0010268 0.0044252 -0.0297511 0.0010268 0.0044252 -0.0407651 0.0010268 0.0044252 -0.0546993 0.0010268 0.0044252 -0.0723279 0.0010268 0.0044252 -0.0946303 0.0010268 0.0044252 -0.1228457 0.0010268 0.0044252 -0.1585419 0.0010268 0.0044252 -0.2037023 0.0010268 0.0044252 -0.260836 0.0010268 0.0044252 -0.3331176 0.0010268 0.0044252 -0.4245633 0.0010268 0.0044252 -0.5402539 0.0010268 0.0044252 -0.6866175 0.0010268 0.0044252 -0.8362644 0.0054121 0.0086547 -0.9017148 0.0276281 0.0303162 -0.9347252 0.061916 0.0640325 -0.9541902 0.1053624 0.1069863 -0.9667385 0.1565954 0.1578187 -0.9752987 0.2145034 0.2154103 -0.9813659 0.2778058 0.2784681 -0.9857835 0.3449254 0.3454019 -0.9890637 0.4140176 0.4143553 -0.9915347 0.4831021 0.4833381 -0.9934166 0.550248 0.5504105 -0.9948617 0.6137599 0.6138703 -0.9959785 0.6723217 0.6723958 -0.9968458 0.7250697 0.7251188 -0.997522 0.7715919 0.7716242 -0.9980506 0.8118697 0.8118907 -0.9984649 0.8461864 0.8462 -0.9987902 0.8750274 0.8750361 -0.999046 0.8989895 0.8989951 -0.9992473 0.9187089 0.9187124 -0.9994059 0.9348097 0.9348119 -0.999531 0.9478718 0.9478733 -0.9996296 0.9584137 0.9584146 -0.9997074 0.9668859 0.9668864 -0.9997689 0.9736717 0.9736721 -0.9998174 0.9790921 0.9790924 -0.9998557 0.9834126 0.9834127 -0.999886 0.9868503 0.9868504 -0.9999099 0.9895819 0.9895819 -0.9999288 0.99175 0.99175 -0.9999437 0.9934694 0.9934695 -0.0000238 0.0142868 0.0142868 -0.0000382 0.0137833 0.0137833 -0.0000611 0.0131511 0.0131511 -0.0000978 0.012359 0.012359 -0.0001565 0.0113691 0.0113691 -0.0002504 0.0101365 0.0101365 -0.0004008 0.0086086 0.0086086 -0.0006416 0.0067261 0.0067261 -0.0010268 0.0044252 0.0044252 -0.0016435 0.0016435 0.0016435 -0.0059429 0.0016435 0.0016435 -0.0113822 0.0016435 0.0016435 -0.0182636 0.0016435 0.0016435 -0.0269694 0.0016435 0.0016435 -0.0379834 0.0016435 0.0016435 -0.0519176 0.0016435 0.0016435 -0.0695462 0.0016435 0.0016435 -0.0918486 0.0016435 0.0016435 -0.120064 0.0016435 0.0016435 -0.1557603 0.0016435 0.0016435 -0.2009206 0.0016435 0.0016435 -0.2580543 0.0016435 0.0016435 -0.3303359 0.0016435 0.0016435 -0.4217816 0.0016435 0.0016435 -0.5374722 0.0016435 0.0016435 -0.6838358 0.0016435 0.0016435 -0.8349593 0.0058134 0.0058134 -0.9012461 0.0278105 0.0278105 -0.9345187 0.0619734 0.0619734 -0.9540886 0.1053433 0.1053433 -0.966685 0.1565315 0.1565315 -0.9752692 0.2144168 0.2144168 -0.9813491 0.2777122 0.2777122 -0.9857738 0.3448353 0.3448353 -0.9890579 0.4139373 0.4139373 -0.9915312 0.4830346 0.4830346 -0.9934145 0.5501939 0.5501939 -0.9948604 0.6137183 0.6137183 -0.9959777 0.6722907 0.6722907 -0.9968453 0.7250473 0.7250473 -0.9975217 0.7715762 0.7715762 -0.9980504 0.8118589 0.8118589 -0.9984648 0.8461791 0.8461791 -0.9987902 0.8750225 0.8750225 -0.9990459 0.8989863 0.8989863 -0.9992473 0.9187068 0.9187068 -0.9994059 0.9348083 0.9348083 -0.9995309 0.947871 0.947871 -0.9996296 0.9584132 0.9584132 -0.9997074 0.9668855 0.9668855 -0.9997689 0.9736715 0.9736715 -0.9998174 0.979092 0.979092 -0.9998557 0.9834125 0.9834125 -0.999886 0.9868502 0.9868502 -0.9999099 0.9895818 0.9895818 -0.9999288 0.99175 0.99175 -0.9999437 0.9934694 0.9934694 -0.0000238 0.0185862 0.0142868 -0.0000382 0.0180827 0.0137833 -0.0000611 0.0174505 0.0131511 -0.0000978 0.0166583 0.012359 -0.0001565 0.0156685 0.0113691 -0.0002504 0.0144359 0.0101365 -0.0004008 0.012908 0.0086086 -0.0006416 0.0110255 0.0067261 -0.0010268 0.0087246 0.0044252 -0.0016435 0.0059429 0.0016435 -0.0059429 0.0059429 0.0016435 -0.0113822 0.0059429 0.0016435 -0.0182636 0.0059429 0.0016435 -0.0269694 0.0059429 0.0016435 -0.0379834 0.0059429 0.0016435 -0.0519176 0.0059429 0.0016435 -0.0695462 0.0059429 0.0016435 -0.0918486 0.0059429 0.0016435 -0.120064 0.0059429 0.0016435 -0.1557603 0.0059429 0.0016435 -0.2009206 0.0059429 0.0016435 -0.2580543 0.0059429 0.0016435 -0.3303359 0.0059429 0.0016435 -0.4217816 0.0059429 0.0016435 -0.5374722 0.0059429 0.0016435 -0.6838358 0.0059429 0.0016435 -0.8349593 0.0099234 0.0058134 -0.9012461 0.0312193 0.0278105 -0.9345187 0.0646568 0.0619734 -0.9540886 0.1074015 0.1053433 -0.966685 0.1580814 0.1565315 -0.9752692 0.2155656 0.2144168 -0.9813491 0.278551 0.2777122 -0.9857738 0.3454387 0.3448353 -0.9890579 0.4143649 0.4139373 -0.9915312 0.4833333 0.4830346 -0.9934145 0.5503996 0.5501939 -0.9948604 0.613858 0.6137183 -0.9959777 0.6723845 0.6722907 -0.9968453 0.7251096 0.7250473 -0.9975217 0.7716171 0.7715762 -0.9980504 0.8118855 0.8118589 -0.9984648 0.8461963 0.8461791 -0.9987902 0.8750335 0.8750225 -0.9990459 0.8989933 0.8989863 -0.9992473 0.9187113 0.9187068 -0.9994059 0.9348112 0.9348083 -0.9995309 0.9478728 0.947871 -0.9996296 0.9584143 0.9584132 -0.9997074 0.9668862 0.9668855 -0.9997689 0.9736719 0.9736715 -0.9998174 0.9790923 0.979092 -0.9998557 0.9834127 0.9834125 -0.999886 0.9868503 0.9868502 -0.9999099 0.9895819 0.9895818 -0.9999288 0.99175 0.99175 -0.9999437 0.9934694 0.9934694 -0.0000238 0.0240255 0.0142868 -0.0000382 0.023522 0.0137833 -0.0000611 0.0228898 0.0131511 -0.0000978 0.0220976 0.012359 -0.0001565 0.0211078 0.0113691 -0.0002504 0.0198752 0.0101365 -0.0004008 0.0183473 0.0086086 -0.0006416 0.0164648 0.0067261 -0.0010268 0.0141639 0.0044252 -0.0016435 0.0113822 0.0016435 -0.0059429 0.0113822 0.0016435 -0.0113822 0.0113822 0.0016435 -0.0182636 0.0113822 0.0016435 -0.0269694 0.0113822 0.0016435 -0.0379834 0.0113822 0.0016435 -0.0519176 0.0113822 0.0016435 -0.0695462 0.0113822 0.0016435 -0.0918486 0.0113822 0.0016435 -0.120064 0.0113822 0.0016435 -0.1557603 0.0113822 0.0016435 -0.2009206 0.0113822 0.0016435 -0.2580543 0.0113822 0.0016435 -0.3303359 0.0113822 0.0016435 -0.4217816 0.0113822 0.0016435 -0.5374722 0.0113822 0.0016435 -0.6838358 0.0113822 0.0016435 -0.8349593 0.015123 0.0058134 -0.9012461 0.0355319 0.0278105 -0.9345187 0.0680517 0.0619734 -0.9540886 0.1100054 0.1053433 -0.966685 0.1600423 0.1565315 -0.9752692 0.217019 0.2144168 -0.9813491 0.2796122 0.2777122 -0.9857738 0.346202 0.3448353 -0.9890579 0.4149059 0.4139373 -0.9915312 0.4837112 0.4830346 -0.9934145 0.5506598 0.5501939 -0.9948604 0.6140348 0.6137183 -0.9959777 0.6725032 0.6722907 -0.9968453 0.7251883 0.7250473 -0.9975217 0.7716688 0.7715762 -0.9980504 0.8119192 0.8118589 -0.9984648 0.8462181 0.8461791 -0.9987902 0.8750475 0.8750225 -0.9990459 0.8990023 0.8989863 -0.9992473 0.918717 0.9187068 -0.9994059 0.9348148 0.9348083 -0.9995309 0.947875 0.947871 -0.9996296 0.9584157 0.9584132 -0.9997074 0.9668872 0.9668855 -0.9997689 0.9736725 0.9736715 -0.9998174 0.9790926 0.979092 -0.9998557 0.9834129 0.9834125 -0.999886 0.9868505 0.9868502 -0.9999099 0.989582 0.9895818 -0.9999288 0.9917501 0.99175 -0.9999437 0.9934695 0.9934694 -0.0000238 0.0309069 0.0142868 -0.0000382 0.0304033 0.0137833 -0.0000611 0.0297711 0.0131511 -0.0000978 0.028979 0.012359 -0.0001565 0.0279891 0.0113691 -0.0002504 0.0267565 0.0101365 -0.0004008 0.0252287 0.0086086 -0.0006416 0.0233461 0.0067261 -0.0010268 0.0210452 0.0044252 -0.0016435 0.0182636 0.0016435 -0.0059429 0.0182636 0.0016435 -0.0113822 0.0182636 0.0016435 -0.0182636 0.0182636 0.0016435 -0.0269694 0.0182636 0.0016435 -0.0379834 0.0182636 0.0016435 -0.0519176 0.0182636 0.0016435 -0.0695462 0.0182636 0.0016435 -0.0918486 0.0182636 0.0016435 -0.120064 0.0182636 0.0016435 -0.1557603 0.0182636 0.0016435 -0.2009206 0.0182636 0.0016435 -0.2580543 0.0182636 0.0016435 -0.3303359 0.0182636 0.0016435 -0.4217816 0.0182636 0.0016435 -0.5374722 0.0182636 0.0016435 -0.6838358 0.0182636 0.0016435 -0.8349593 0.0217012 0.0058134 -0.9012461 0.0409879 0.0278105 -0.9345187 0.0723466 0.0619734 -0.9540886 0.1132997 0.1053433 -0.966685 0.162523 0.1565315 -0.9752692 0.2188577 0.2144168 -0.9813491 0.2809547 0.2777122 -0.9857738 0.3471677 0.3448353 -0.9890579 0.4155903 0.4139373 -0.9915312 0.4841892 0.4830346 -0.9934145 0.550989 0.5501939 -0.9948604 0.6142585 0.6137183 -0.9959777 0.6726533 0.6722907 -0.9968453 0.7252879 0.7250473 -0.9975217 0.7717342 0.7715762 -0.9980504 0.8119618 0.8118589 -0.9984648 0.8462456 0.8461791 -0.9987902 0.8750652 0.8750225 -0.9990459 0.8990136 0.8989863 -0.9992473 0.9187241 0.9187068 -0.9994059 0.9348194 0.9348083 -0.9995309 0.9478779 0.947871 -0.9996296 0.9584175 0.9584132 -0.9997074 0.9668883 0.9668855 -0.9997689 0.9736732 0.9736715 -0.9998174 0.9790931 0.979092 -0.9998557 0.9834132 0.9834125 -0.999886 0.9868507 0.9868502 -0.9999099 0.9895821 0.9895818 -0.9999288 0.9917502 0.99175 -0.9999437 0.9934695 0.9934694 -0.0000238 0.0396127 0.0142868 -0.0000382 0.0391092 0.0137833 -0.0000611 0.038477 0.0131511 -0.0000978 0.0376849 0.012359 -0.0001565 0.036695 0.0113691 -0.0002504 0.0354624 0.0101365 -0.0004008 0.0339345 0.0086086 -0.0006416 0.032052 0.0067261 -0.0010268 0.0297511 0.0044252 -0.0016435 0.0269694 0.0016435 -0.0059429 0.0269694 0.0016435 -0.0113822 0.0269694 0.0016435 -0.0182636 0.0269694 0.0016435 -0.0269694 0.0269694 0.0016435 -0.0379834 0.0269694 0.0016435 -0.0519176 0.0269694 0.0016435 -0.0695462 0.0269694 0.0016435 -0.0918486 0.0269694 0.0016435 -0.120064 0.0269694 0.0016435 -0.1557603 0.0269694 0.0016435 -0.2009206 0.0269694 0.0016435 -0.2580543 0.0269694 0.0016435 -0.3303359 0.0269694 0.0016435 -0.4217816 0.0269694 0.0016435 -0.5374722 0.0269694 0.0016435 -0.6838358 0.0269694 0.0016435 -0.8349593 0.0300235 0.0058134 -0.9012461 0.0478904 0.0278105 -0.9345187 0.0777803 0.0619734 -0.9540886 0.1174673 0.1053433 -0.966685 0.1656615 0.1565315 -0.9752692 0.221184 0.2144168 -0.9813491 0.2826531 0.2777122 -0.9857738 0.3483894 0.3448353 -0.9890579 0.4164562 0.4139373 -0.9915312 0.484794 0.4830346 -0.9934145 0.5514055 0.5501939 -0.9948604 0.6145415 0.6137183 -0.9959777 0.6728432 0.6722907 -0.9968453 0.7254139 0.7250473 -0.9975217 0.771817 0.7715762 -0.9980504 0.8120157 0.8118589 -0.9984648 0.8462805 0.8461791 -0.9987902 0.8750876 0.8750225 -0.9990459 0.8990279 0.8989863 -0.9992473 0.9187332 0.9187068 -0.9994059 0.9348251 0.9348083 -0.9995309 0.9478816 0.947871 -0.9996296 0.9584198 0.9584132 -0.9997074 0.9668897 0.9668855 -0.9997689 0.9736741 0.9736715 -0.9998174 0.9790937 0.979092 -0.9998557 0.9834135 0.9834125 -0.999886 0.9868509 0.9868502 -0.9999099 0.9895822 0.9895818 -0.9999288 0.9917502 0.99175 -0.9999437 0.9934696 0.9934694 -0.0000238 0.0506267 0.0142868 -0.0000382 0.0501232 0.0137833 -0.0000611 0.049491 0.0131511 -0.0000978 0.0486989 0.012359 -0.0001565 0.047709 0.0113691 -0.0002504 0.0464764 0.0101365 -0.0004008 0.0449485 0.0086086 -0.0006416 0.043066 0.0067261 -0.0010268 0.0407651 0.0044252 -0.0016435 0.0379834 0.0016435 -0.0059429 0.0379834 0.0016435 -0.0113822 0.0379834 0.0016435 -0.0182636 0.0379834 0.0016435 -0.0269694 0.0379834 0.0016435 -0.0379834 0.0379834 0.0016435 -0.0519176 0.0379834 0.0016435 -0.0695462 0.0379834 0.0016435 -0.0918486 0.0379834 0.0016435 -0.120064 0.0379834 0.0016435 -0.1557603 0.0379834 0.0016435 -0.2009206 0.0379834 0.0016435 -0.2580543 0.0379834 0.0016435 -0.3303359 0.0379834 0.0016435 -0.4217816 0.0379834 0.0016435 -0.5374722 0.0379834 0.0016435 -0.6838358 0.0379834 0.0016435 -0.8349593 0.0405522 0.0058134 -0.9012461 0.056623 0.0278105 -0.9345187 0.0846546 0.0619734 -0.9540886 0.12274 0.1053433 -0.966685 0.169632 0.1565315 -0.9752692 0.224127 0.2144168 -0.9813491 0.2848019 0.2777122 -0.9857738 0.3499351 0.3448353 -0.9890579 0.4175516 0.4139373 -0.9915312 0.4855591 0.4830346 -0.9934145 0.5519324 0.5501939 -0.9948604 0.6148995 0.6137183 -0.9959777 0.6730835 0.6722907 -0.9968453 0.7255733 0.7250473 -0.9975217 0.7719217 0.7715762 -0.9980504 0.8120839 0.8118589 -0.9984648 0.8463246 0.8461791 -0.9987902 0.8751159 0.8750225 -0.9990459 0.899046 0.8989863 -0.9992473 0.9187448 0.9187068 -0.9994059 0.9348324 0.9348083 -0.9995309 0.9478862 0.947871 -0.9996296 0.9584228 0.9584132 -0.9997074 0.9668916 0.9668855 -0.9997689 0.9736753 0.9736715 -0.9998174 0.9790944 0.979092 -0.9998557 0.983414 0.9834125 -0.999886 0.9868512 0.9868502 -0.9999099 0.9895824 0.9895818 -0.9999288 0.9917503 0.99175 -0.9999437 0.9934696 0.9934694 -0.0000238 0.0645609 0.0142868 -0.0000382 0.0640574 0.0137833 -0.0000611 0.0634252 0.0131511 -0.0000978 0.0626331 0.012359 -0.0001565 0.0616432 0.0113691 -0.0002504 0.0604106 0.0101365 -0.0004008 0.0588827 0.0086086 -0.0006416 0.0570002 0.0067261 -0.0010268 0.0546993 0.0044252 -0.0016435 0.0519176 0.0016435 -0.0059429 0.0519176 0.0016435 -0.0113822 0.0519176 0.0016435 -0.0182636 0.0519176 0.0016435 -0.0269694 0.0519176 0.0016435 -0.0379834 0.0519176 0.0016435 -0.0519176 0.0519176 0.0016435 -0.0695462 0.0519176 0.0016435 -0.0918486 0.0519176 0.0016435 -0.120064 0.0519176 0.0016435 -0.1557603 0.0519176 0.0016435 -0.2009206 0.0519176 0.0016435 -0.2580543 0.0519176 0.0016435 -0.3303359 0.0519176 0.0016435 -0.4217816 0.0519176 0.0016435 -0.5374722 0.0519176 0.0016435 -0.6838358 0.0519176 0.0016435 -0.8349593 0.0538725 0.0058134 -0.9012461 0.0676709 0.0278105 -0.9345187 0.0933514 0.0619734 -0.9540886 0.1294105 0.1053433 -0.966685 0.1746553 0.1565315 -0.9752692 0.2278503 0.2144168 -0.9813491 0.2875203 0.2777122 -0.9857738 0.3518905 0.3448353 -0.9890579 0.4189375 0.4139373 -0.9915312 0.4865271 0.4830346 -0.9934145 0.552599 0.5501939 -0.9948604 0.6153525 0.6137183 -0.9959777 0.6733874 0.6722907 -0.9968453 0.725775 0.7250473 -0.9975217 0.7720543 0.7715762 -0.9980504 0.8121702 0.8118589 -0.9984648 0.8463803 0.8461791 -0.9987902 0.8751518 0.8750225 -0.9990459 0.8990689 0.8989863 -0.9992473 0.9187593 0.9187068 -0.9994059 0.9348417 0.9348083 -0.9995309 0.947892 0.947871 -0.9996296 0.9584264 0.9584132 -0.9997074 0.9668939 0.9668855 -0.9997689 0.9736767 0.9736715 -0.9998174 0.9790953 0.979092 -0.9998557 0.9834146 0.9834125 -0.999886 0.9868515 0.9868502 -0.9999099 0.9895826 0.9895818 -0.9999288 0.9917505 0.99175 -0.9999437 0.9934697 0.9934694 -0.0000238 0.0821895 0.0142868 -0.0000382 0.081686 0.0137833 -0.0000611 0.0810538 0.0131511 -0.0000978 0.0802616 0.012359 -0.0001565 0.0792718 0.0113691 -0.0002504 0.0780392 0.0101365 -0.0004008 0.0765113 0.0086086 -0.0006416 0.0746288 0.0067261 -0.0010268 0.0723279 0.0044252 -0.0016435 0.0695462 0.0016435 -0.0059429 0.0695462 0.0016435 -0.0113822 0.0695462 0.0016435 -0.0182636 0.0695462 0.0016435 -0.0269694 0.0695462 0.0016435 -0.0379834 0.0695462 0.0016435 -0.0519176 0.0695462 0.0016435 -0.0695462 0.0695462 0.0016435 -0.0918486 0.0695462 0.0016435 -0.120064 0.0695462 0.0016435 -0.1557603 0.0695462 0.0016435 -0.2009206 0.0695462 0.0016435 -0.2580543 0.0695462 0.0016435 -0.3303359 0.0695462 0.0016435 -0.4217816 0.0695462 0.0016435 -0.5374722 0.0695462 0.0016435 -0.6838358 0.0695462 0.0016435 -0.8349593 0.0707243 0.0058134 -0.9012461 0.0816479 0.0278105 -0.9345187 0.1043541 0.0619734 -0.9540886 0.1378497 0.1053433 -0.966685 0.1810104 0.1565315 -0.9752692 0.2325608 0.2144168 -0.9813491 0.2909596 0.2777122 -0.9857738 0.3543644 0.3448353 -0.9890579 0.4206909 0.4139373 -0.9915312 0.4877517 0.4830346 -0.9934145 0.5534423 0.5501939 -0.9948604 0.6159255 0.6137183 -0.9959777 0.673772 0.6722907 -0.9968453 0.7260302 0.7250473 -0.9975217 0.7722219 0.7715762 -0.9980504 0.8122794 0.8118589 -0.9984648 0.8464509 0.8461791 -0.9987902 0.8751971 0.8750225 -0.9990459 0.8990978 0.8989863 -0.9992473 0.9187778 0.9187068 -0.9994059 0.9348533 0.9348083 -0.9995309 0.9478994 0.947871 -0.9996296 0.9584311 0.9584132 -0.9997074 0.9668968 0.9668855 -0.9997689 0.9736786 0.9736715 -0.9998174 0.9790965 0.979092 -0.9998557 0.9834153 0.9834125 -0.999886 0.986852 0.9868502 -0.9999099 0.9895829 0.9895818 -0.9999288 0.9917507 0.99175 -0.9999437 0.9934698 0.9934694 -0.0000238 0.1044919 0.0142868 -0.0000382 0.1039884 0.0137833 -0.0000611 0.1033562 0.0131511 -0.0000978 0.102564 0.012359 -0.0001565 0.1015742 0.0113691 -0.0002504 0.1003416 0.0101365 -0.0004008 0.0988137 0.0086086 -0.0006416 0.0969312 0.0067261 -0.0010268 0.0946303 0.0044252 -0.0016435 0.0918486 0.0016435 -0.0059429 0.0918486 0.0016435 -0.0113822 0.0918486 0.0016435 -0.0182636 0.0918486 0.0016435 -0.0269694 0.0918486 0.0016435 -0.0379834 0.0918486 0.0016435 -0.0519176 0.0918486 0.0016435 -0.0695462 0.0918486 0.0016435 -0.0918486 0.0918486 0.0016435 -0.120064 0.0918486 0.0016435 -0.1557603 0.0918486 0.0016435 -0.2009206 0.0918486 0.0016435 -0.2580543 0.0918486 0.0016435 -0.3303359 0.0918486 0.0016435 -0.4217816 0.0918486 0.0016435 -0.5374722 0.0918486 0.0016435 -0.6838358 0.0918486 0.0016435 -0.8349593 0.0920441 0.0058134 -0.9012461 0.0993306 0.0278105 -0.9345187 0.1182739 0.0619734 -0.9540886 0.1485263 0.1053433 -0.966685 0.1890504 0.1565315 -0.9752692 0.2385201 0.2144168 -0.9813491 0.2953106 0.2777122 -0.9857738 0.3574942 0.3448353 -0.9890579 0.4229091 0.4139373 -0.9915312 0.489301 0.4830346 -0.9934145 0.5545093 0.5501939 -0.9948604 0.6166504 0.6137183 -0.9959777 0.6742585 0.6722907 -0.9968453 0.726353 0.7250473 -0.9975217 0.772434 0.7715762 -0.9980504 0.8124175 0.8118589 -0.9984648 0.8465402 0.8461791 -0.9987902 0.8752545 0.8750225 -0.9990459 0.8991345 0.8989863 -0.9992473 0.9188011 0.9187068 -0.9994059 0.9348681 0.9348083 -0.9995309 0.9479088 0.947871 -0.9996296 0.958437 0.9584132 -0.9997074 0.9669005 0.9668855 -0.9997689 0.9736809 0.9736715 -0.9998174 0.9790979 0.979092 -0.9998557 0.9834162 0.9834125 -0.999886 0.9868525 0.9868502 -0.9999099 0.9895833 0.9895818 -0.9999288 0.9917509 0.99175 -0.9999437 0.99347 0.9934694 -0.0000238 0.1327073 0.0142868 -0.0000382 0.1322038 0.0137833 -0.0000611 0.1315716 0.0131511 -0.0000978 0.1307795 0.012359 -0.0001565 0.1297896 0.0113691 -0.0002504 0.128557 0.0101365 -0.0004008 0.1270291 0.0086086 -0.0006416 0.1251466 0.0067261 -0.0010268 0.1228457 0.0044252 -0.0016435 0.120064 0.0016435 -0.0059429 0.120064 0.0016435 -0.0113822 0.120064 0.0016435 -0.0182636 0.120064 0.0016435 -0.0269694 0.120064 0.0016435 -0.0379834 0.120064 0.0016435 -0.0519176 0.120064 0.0016435 -0.0695462 0.120064 0.0016435 -0.0918486 0.120064 0.0016435 -0.120064 0.120064 0.0016435 -0.1557603 0.120064 0.0016435 -0.2009206 0.120064 0.0016435 -0.2580543 0.120064 0.0016435 -0.3303359 0.120064 0.0016435 -0.4217816 0.120064 0.0016435 -0.5374722 0.120064 0.0016435 -0.6838358 0.120064 0.0016435 -0.8349593 0.1190164 0.0058134 -0.9012461 0.1217016 0.0278105 -0.9345187 0.1358843 0.0619734 -0.9540886 0.1620336 0.1053433 -0.966685 0.199222 0.1565315 -0.9752692 0.2460594 0.2144168 -0.9813491 0.3008152 0.2777122 -0.9857738 0.3614538 0.3448353 -0.9890579 0.4257154 0.4139373 -0.9915312 0.4912611 0.4830346 -0.9934145 0.5558591 0.5501939 -0.9948604 0.6175676 0.6137183 -0.9959777 0.6748739 0.6722907 -0.9968453 0.7267615 0.7250473 -0.9975217 0.7727023 0.7715762 -0.9980504 0.8125923 0.8118589 -0.9984648 0.8466532 0.8461791 -0.9987902 0.875327 0.8750225 -0.9990459 0.8991809 0.8989863 -0.9992473 0.9188306 0.9187068 -0.9994059 0.9348868 0.9348083 -0.9995309 0.9479206 0.947871 -0.9996296 0.9584444 0.9584132 -0.9997074 0.9669052 0.9668855 -0.9997689 0.9736839 0.9736715 -0.9998174 0.9790998 0.979092 -0.9998557 0.9834174 0.9834125 -0.999886 0.9868533 0.9868502 -0.9999099 0.9895837 0.9895818 -0.9999288 0.9917512 0.99175 -0.9999437 0.9934702 0.9934694 -0.0000238 0.1684036 0.0142868 -0.0000382 0.1679 0.0137833 -0.0000611 0.1672678 0.0131511 -0.0000978 0.1664757 0.012359 -0.0001565 0.1654858 0.0113691 -0.0002504 0.1642532 0.0101365 -0.0004008 0.1627254 0.0086086 -0.0006416 0.1608428 0.0067261 -0.0010268 0.1585419 0.0044252 -0.0016435 0.1557603 0.0016435 -0.0059429 0.1557603 0.0016435 -0.0113822 0.1557603 0.0016435 -0.0182636 0.1557603 0.0016435 -0.0269694 0.1557603 0.0016435 -0.0379834 0.1557603 0.0016435 -0.0519176 0.1557603 0.0016435 -0.0695462 0.1557603 0.0016435 -0.0918486 0.1557603 0.0016435 -0.120064 0.1557603 0.0016435 -0.1557603 0.1557603 0.0016435 -0.2009206 0.1557603 0.0016435 -0.2580543 0.1557603 0.0016435 -0.3303359 0.1557603 0.0016435 -0.4217816 0.1557603 0.0016435 -0.5374722 0.1557603 0.0016435 -0.6838358 0.1557603 0.0016435 -0.8349593 0.1531399 0.0058134 -0.9012461 0.1500037 0.0278105 -0.9345187 0.1581637 0.0619734 -0.9540886 0.179122 0.1053433 -0.966685 0.2120905 0.1565315 -0.9752692 0.2555977 0.2144168 -0.9813491 0.3077793 0.2777122 -0.9857738 0.3664632 0.3448353 -0.9890579 0.4292657 0.4139373 -0.9915312 0.4937409 0.4830346 -0.9934145 0.5575667 0.5501939 -0.9948604 0.6187279 0.6137183 -0.9959777 0.6756526 0.6722907 -0.9968453 0.7272782 0.7250473 -0.9975217 0.7730418 0.7715762 -0.9980504 0.8128134 0.8118589 -0.9984648 0.8467961 0.8461791 -0.9987902 0.8754188 0.8750225 -0.9990459 0.8992395 0.8989863 -0.9992473 0.9188679 0.9187068 -0.9994059 0.9349105 0.9348083 -0.9995309 0.9479355 0.947871 -0.9996296 0.9584539 0.9584132 -0.9997074 0.9669112 0.9668855 -0.9997689 0.9736876 0.9736715 -0.9998174 0.9791021 0.979092 -0.9998557 0.9834188 0.9834125 -0.999886 0.9868542 0.9868502 -0.9999099 0.9895843 0.9895818 -0.9999288 0.9917515 0.99175 -0.9999437 0.9934704 0.9934694 -0.0000238 0.2135639 0.0142868 -0.0000382 0.2130604 0.0137833 -0.0000611 0.2124282 0.0131511 -0.0000978 0.2116361 0.012359 -0.0001565 0.2106462 0.0113691 -0.0002504 0.2094136 0.0101365 -0.0004008 0.2078857 0.0086086 -0.0006416 0.2060032 0.0067261 -0.0010268 0.2037023 0.0044252 -0.0016435 0.2009206 0.0016435 -0.0059429 0.2009206 0.0016435 -0.0113822 0.2009206 0.0016435 -0.0182636 0.2009206 0.0016435 -0.0269694 0.2009206 0.0016435 -0.0379834 0.2009206 0.0016435 -0.0519176 0.2009206 0.0016435 -0.0695462 0.2009206 0.0016435 -0.0918486 0.2009206 0.0016435 -0.120064 0.2009206 0.0016435 -0.1557603 0.2009206 0.0016435 -0.2009206 0.2009206 0.0016435 -0.2580543 0.2009206 0.0016435 -0.3303359 0.2009206 0.0016435 -0.4217816 0.2009206 0.0016435 -0.5374722 0.2009206 0.0016435 -0.6838358 0.2009206 0.0016435 -0.8349593 0.1963105 0.0058134 -0.9012461 0.1858097 0.0278105 -0.9345187 0.1863501 0.0619734 -0.9540886 0.2007412 0.1053433 -0.966685 0.2283708 0.1565315 -0.9752692 0.2676648 0.2144168 -0.9813491 0.3165898 0.2777122 -0.9857738 0.3728008 0.3448353 -0.9890579 0.4337574 0.4139373 -0.9915312 0.4968781 0.4830346 -0.9934145 0.5597272 0.5501939 -0.9948604 0.6201959 0.6137183 -0.9959777 0.6766377 0.6722907 -0.9968453 0.7279319 0.7250473 -0.9975217 0.7734712 0.7715762 -0.9980504 0.8130931 0.8118589 -0.9984648 0.8469769 0.8461791 -0.9987902 0.875535 0.8750225 -0.9990459 0.8993137 0.8989863 -0.9992473 0.9189151 0.9187068 -0.9994059 0.9349404 0.9348083 -0.9995309 0.9479544 0.947871 -0.9996296 0.9584658 0.9584132 -0.9997074 0.9669187 0.9668855 -0.9997689 0.9736923 0.9736715 -0.9998174 0.9791051 0.979092 -0.9998557 0.9834207 0.9834125 -0.999886 0.9868554 0.9868502 -0.9999099 0.989585 0.9895818 -0.9999288 0.991752 0.99175 -0.9999437 0.9934707 0.9934694 -0.0000238 0.2706977 0.0142868 -0.0000382 0.2701941 0.0137833 -0.0000611 0.2695619 0.0131511 -0.0000978 0.2687698 0.012359 -0.0001565 0.2677799 0.0113691 -0.0002504 0.2665473 0.0101365 -0.0004008 0.2650195 0.0086086 -0.0006416 0.2631369 0.0067261 -0.0010268 0.260836 0.0044252 -0.0016435 0.2580543 0.0016435 -0.0059429 0.2580543 0.0016435 -0.0113822 0.2580543 0.0016435 -0.0182636 0.2580543 0.0016435 -0.0269694 0.2580543 0.0016435 -0.0379834 0.2580543 0.0016435 -0.0519176 0.2580543 0.0016435 -0.0695462 0.2580543 0.0016435 -0.0918486 0.2580543 0.0016435 -0.120064 0.2580543 0.0016435 -0.1557603 0.2580543 0.0016435 -0.2009206 0.2580543 0.0016435 -0.2580543 0.2580543 0.0016435 -0.3303359 0.2580543 0.0016435 -0.4217816 0.2580543 0.0016435 -0.5374722 0.2580543 0.0016435 -0.6838358 0.2580543 0.0016435 -0.8349593 0.2509269 0.0058134 -0.9012461 0.2311088 0.0278105 -0.9345187 0.2220095 0.0619734 -0.9540886 0.2280923 0.1053433 -0.966685 0.2489674 0.1565315 -0.9752692 0.2829313 0.2144168 -0.9813491 0.3277361 0.2777122 -0.9857738 0.3808186 0.3448353 -0.9890579 0.4394399 0.4139373 -0.9915312 0.5008471 0.4830346 -0.9934145 0.5624604 0.5501939 -0.9948604 0.622053 0.6137183 -0.9959777 0.6778841 0.6722907 -0.9968453 0.7287589 0.7250473 -0.9975217 0.7740145 0.7715762 -0.9980504 0.8134469 0.8118589 -0.9984648 0.8472056 0.8461791 -0.9987902 0.8756819 0.8750225 -0.9990459 0.8994076 0.8989863 -0.9992473 0.9189748 0.9187068 -0.9994059 0.9349783 0.9348083 -0.9995309 0.9479784 0.947871 -0.9996296 0.9584809 0.9584132 -0.9997074 0.9669282 0.9668855 -0.9997689 0.9736983 0.9736715 -0.9998174 0.9791088 0.979092 -0.9998557 0.983423 0.9834125 -0.999886 0.9868568 0.9868502 -0.9999099 0.989586 0.9895818 -0.9999288 0.9917526 0.99175 -0.9999437 0.993471 0.9934694 -0.0000238 0.3429792 0.0142868 -0.0000382 0.3424757 0.0137833 -0.0000611 0.3418435 0.0131511 -0.0000978 0.3410514 0.012359 -0.0001565 0.3400615 0.0113691 -0.0002504 0.3388289 0.0101365 -0.0004008 0.337301 0.0086086 -0.0006416 0.3354185 0.0067261 -0.0010268 0.3331176 0.0044252 -0.0016435 0.3303359 0.0016435 -0.0059429 0.3303359 0.0016435 -0.0113822 0.3303359 0.0016435 -0.0182636 0.3303359 0.0016435 -0.0269694 0.3303359 0.0016435 -0.0379834 0.3303359 0.0016435 -0.0519176 0.3303359 0.0016435 -0.0695462 0.3303359 0.0016435 -0.0918486 0.3303359 0.0016435 -0.120064 0.3303359 0.0016435 -0.1557603 0.3303359 0.0016435 -0.2009206 0.3303359 0.0016435 -0.2580543 0.3303359 0.0016435 -0.3303359 0.3303359 0.0016435 -0.4217816 0.3303359 0.0016435 -0.5374722 0.3303359 0.0016435 -0.6838358 0.3303359 0.0016435 -0.8349593 0.3200238 0.0058134 -0.9012461 0.2884181 0.0278105 -0.9345187 0.2671233 0.0619734 -0.9540886 0.2626949 0.1053433 -0.966685 0.2750249 0.1565315 -0.9752692 0.3022454 0.2144168 -0.9813491 0.3418377 0.2777122 -0.9857738 0.3909622 0.3448353 -0.9890579 0.4466291 0.4139373 -0.9915312 0.5058684 0.4830346 -0.9934145 0.5659183 0.5501939 -0.9948604 0.6244026 0.6137183 -0.9959777 0.6794608 0.6722907 -0.9968453 0.7298052 0.7250473 -0.9975217 0.7747019 0.7715762 -0.9980504 0.8138946 0.8118589 -0.9984648 0.847495 0.8461791 -0.9987902 0.8758678 0.8750225 -0.9990459 0.8995264 0.8989863 -0.9992473 0.9190504 0.9187068 -0.9994059 0.9350262 0.9348083 -0.9995309 0.9480087 0.947871 -0.9996296 0.9585 0.9584132 -0.9997074 0.9669402 0.9668855 -0.9997689 0.9737058 0.9736715 -0.9998174 0.9791136 0.979092 -0.9998557 0.983426 0.9834125 -0.999886 0.9868587 0.9868502 -0.9999099 0.9895871 0.9895818 -0.9999288 0.9917533 0.99175 -0.9999437 0.9934715 0.9934694 -0.0000238 0.4344249 0.0142868 -0.0000382 0.4339214 0.0137833 -0.0000611 0.4332891 0.0131511 -0.0000978 0.432497 0.012359 -0.0001565 0.4315072 0.0113691 -0.0002504 0.4302746 0.0101365 -0.0004008 0.4287467 0.0086086 -0.0006416 0.4268641 0.0067261 -0.0010268 0.4245633 0.0044252 -0.0016435 0.4217816 0.0016435 -0.0059429 0.4217816 0.0016435 -0.0113822 0.4217816 0.0016435 -0.0182636 0.4217816 0.0016435 -0.0269694 0.4217816 0.0016435 -0.0379834 0.4217816 0.0016435 -0.0519176 0.4217816 0.0016435 -0.0695462 0.4217816 0.0016435 -0.0918486 0.4217816 0.0016435 -0.120064 0.4217816 0.0016435 -0.1557603 0.4217816 0.0016435 -0.2009206 0.4217816 0.0016435 -0.2580543 0.4217816 0.0016435 -0.3303359 0.4217816 0.0016435 -0.4217816 0.4217816 0.0016435 -0.5374722 0.4217816 0.0016435 -0.6838358 0.4217816 0.0016435 -0.8349593 0.4074404 0.0058134 -0.9012461 0.3609218 0.0278105 -0.9345187 0.3241981 0.0619734 -0.9540886 0.3064717 0.1053433 -0.966685 0.307991 0.1565315 -0.9752692 0.3266802 0.2144168 -0.9813491 0.3596781 0.2777122 -0.9857738 0.4037952 0.3448353 -0.9890579 0.4557243 0.4139373 -0.9915312 0.512221 0.4830346 -0.9934145 0.570293 0.5501939 -0.9948604 0.627375 0.6137183 -0.9959777 0.6814556 0.6722907 -0.9968453 0.7311288 0.7250473 -0.9975217 0.7755715 0.7715762 -0.9980504 0.8144609 0.8118589 -0.9984648 0.8478611 0.8461791 -0.9987902 0.8761029 0.8750225 -0.9990459 0.8996766 0.8989863 -0.9992473 0.919146 0.9187068 -0.9994059 0.9350868 0.9348083 -0.9995309 0.948047 0.947871 -0.9996296 0.9585242 0.9584132 -0.9997074 0.9669554 0.9668855 -0.9997689 0.9737154 0.9736715 -0.9998174 0.9791196 0.979092 -0.9998557 0.9834298 0.9834125 -0.999886 0.9868611 0.9868502 -0.9999099 0.9895886 0.9895818 -0.9999288 0.9917542 0.99175 -0.9999437 0.9934721 0.9934694 -0.0000238 0.5501155 0.0142868 -0.0000382 0.549612 0.0137833 -0.0000611 0.5489798 0.0131511 -0.0000978 0.5481876 0.012359 -0.0001565 0.5471978 0.0113691 -0.0002504 0.5459652 0.0101365 -0.0004008 0.5444373 0.0086086 -0.0006416 0.5425548 0.0067261 -0.0010268 0.5402539 0.0044252 -0.0016435 0.5374722 0.0016435 -0.0059429 0.5374722 0.0016435 -0.0113822 0.5374722 0.0016435 -0.0182636 0.5374722 0.0016435 -0.0269694 0.5374722 0.0016435 -0.0379834 0.5374722 0.0016435 -0.0519176 0.5374722 0.0016435 -0.0695462 0.5374722 0.0016435 -0.0918486 0.5374722 0.0016435 -0.120064 0.5374722 0.0016435 -0.1557603 0.5374722 0.0016435 -0.2009206 0.5374722 0.0016435 -0.2580543 0.5374722 0.0016435 -0.3303359 0.5374722 0.0016435 -0.4217816 0.5374722 0.0016435 -0.5374722 0.5374722 0.0016435 -0.6838358 0.5374722 0.0016435 -0.8349593 0.5180338 0.0058134 -0.9012461 0.4526484 0.0278105 -0.9345187 0.3964052 0.0619734 -0.9540886 0.3618551 0.1053433 -0.966685 0.3496974 0.1565315 -0.9752692 0.3575934 0.2144168 -0.9813491 0.3822485 0.2777122 -0.9857738 0.4200306 0.3448353 -0.9890579 0.4672309 0.4139373 -0.9915312 0.5202578 0.4830346 -0.9934145 0.5758275 0.5501939 -0.9948604 0.6311356 0.6137183 -0.9959777 0.6839792 0.6722907 -0.9968453 0.7328035 0.7250473 -0.9975217 0.7766717 0.7715762 -0.9980504 0.8151774 0.8118589 -0.9984648 0.8483242 0.8461791 -0.9987902 0.8764004 0.8750225 -0.9990459 0.8998667 0.8989863 -0.9992473 0.9192669 0.9187068 -0.9994059 0.9351634 0.9348083 -0.9995309 0.9480954 0.947871 -0.9996296 0.9585547 0.9584132 -0.9997074 0.9669746 0.9668855 -0.9997689 0.9737275 0.9736715 -0.9998174 0.9791272 0.979092 -0.9998557 0.9834345 0.9834125 -0.999886 0.986864 0.9868502 -0.9999099 0.9895905 0.9895818 -0.9999288 0.9917554 0.99175 -0.9999437 0.9934728 0.9934694 -0.0000238 0.6964791 0.0142868 -0.0000382 0.6959756 0.0137833 -0.0000611 0.6953434 0.0131511 -0.0000978 0.6945513 0.012359 -0.0001565 0.6935614 0.0113691 -0.0002504 0.6923288 0.0101365 -0.0004008 0.6908009 0.0086086 -0.0006416 0.6889184 0.0067261 -0.0010268 0.6866175 0.0044252 -0.0016435 0.6838358 0.0016435 -0.0059429 0.6838358 0.0016435 -0.0113822 0.6838358 0.0016435 -0.0182636 0.6838358 0.0016435 -0.0269694 0.6838358 0.0016435 -0.0379834 0.6838358 0.0016435 -0.0519176 0.6838358 0.0016435 -0.0695462 0.6838358 0.0016435 -0.0918486 0.6838358 0.0016435 -0.120064 0.6838358 0.0016435 -0.1557603 0.6838358 0.0016435 -0.2009206 0.6838358 0.0016435 -0.2580543 0.6838358 0.0016435 -0.3303359 0.6838358 0.0016435 -0.4217816 0.6838358 0.0016435 -0.5374722 0.6838358 0.0016435 -0.6838358 0.6838358 0.0016435 -0.8349593 0.6579487 0.0058134 -0.9012461 0.5686945 0.0278105 -0.9345187 0.4877565 0.0619734 -0.9540886 0.4319223 0.1053433 -0.966685 0.4024614 0.1565315 -0.9752692 0.3967026 0.2144168 -0.9813491 0.410803 0.2777122 -0.9857738 0.4405705 0.3448353 -0.9890579 0.4817882 0.4139373 -0.9915312 0.5304255 0.4830346 -0.9934145 0.5828294 0.5501939 -0.9948604 0.6358932 0.6137183 -0.9959777 0.687172 0.6722907 -0.9968453 0.7349221 0.7250473 -0.9975217 0.7780636 0.7715762 -0.9980504 0.8160839 0.8118589 -0.9984648 0.8489102 0.8461791 -0.9987902 0.8767768 0.8750225 -0.9990459 0.9001073 0.8989863 -0.9992473 0.9194199 0.9187068 -0.9994059 0.9352604 0.9348083 -0.9995309 0.9481567 0.947871 -0.9996296 0.9585934 0.9584132 -0.9997074 0.966999 0.9668855 -0.9997689 0.9737428 0.9736715 -0.9998174 0.9791368 0.979092 -0.9998557 0.9834405 0.9834125 -0.999886 0.9868678 0.9868502 -0.9999099 0.9895928 0.9895818 -0.9999288 0.9917569 0.99175 -0.9999437 0.9934737 0.9934694 -0.0051514 0.8407292 0.0186694 -0.0051286 0.8405071 0.0181604 -0.0051047 0.8402274 0.0175208 -0.0050826 0.8398756 0.016719 -0.0050676 0.8394338 0.0157161 -0.0050694 0.8388802 0.014466 -0.0051048 0.8381886 0.0129143 -0.0052028 0.8373283 0.0109995 -0.0054121 0.8362644 0.0086547 -0.0058134 0.8349593 0.0058134 -0.0099234 0.8349593 0.0058134 -0.015123 0.8349593 0.0058134 -0.0217012 0.8349593 0.0058134 -0.0300235 0.8349593 0.0058134 -0.0405522 0.8349593 0.0058134 -0.0538725 0.8349593 0.0058134 -0.0707243 0.8349593 0.0058134 -0.0920441 0.8349593 0.0058134 -0.1190164 0.8349593 0.0058134 -0.1531399 0.8349593 0.0058134 -0.1963105 0.8349593 0.0058134 -0.2509269 0.8349593 0.0058134 -0.3200238 0.8349593 0.0058134 -0.4074404 0.8349593 0.0058134 -0.5180338 0.8349593 0.0058134 -0.6579487 0.8349593 0.0058134 -0.8349593 0.8349593 0.0058134 -0.9012461 0.715508 0.0278105 -0.9345187 0.6033278 0.0619734 -0.9540886 0.5205664 0.1053433 -0.966685 0.4692147 0.1565315 -0.9752692 0.4461809 0.2144168 -0.9813491 0.4469282 0.2777122 -0.9857738 0.4665561 0.3448353 -0.9890579 0.5002052 0.4139373 -0.9915312 0.5432889 0.4830346 -0.9934145 0.5916877 0.5501939 -0.9948604 0.6419122 0.6137183 -0.9959777 0.6912113 0.6722907 -0.9968453 0.7376024 0.7250473 -0.9975217 0.7798244 0.7715762 -0.9980504 0.8172307 0.8118589 -0.9984648 0.8496515 0.8461791 -0.9987902 0.877253 0.8750225 -0.9990459 0.9004115 0.8989863 -0.9992473 0.9196135 0.9187068 -0.9994059 0.9353832 0.9348083 -0.9995309 0.9482343 0.947871 -0.9996296 0.9586423 0.9584132 -0.9997074 0.9670298 0.9668855 -0.9997689 0.9737621 0.9736715 -0.9998174 0.9791489 0.979092 -0.9998557 0.9834482 0.9834125 -0.999886 0.9868726 0.9868502 -0.9999099 0.9895958 0.9895818 -0.9999288 0.9917587 0.99175 -0.9999437 0.9934749 0.9934694 -0.0279321 0.9033413 0.0391214 -0.0278872 0.9032596 0.0386748 -0.0278347 0.9031567 0.0381135 -0.0277752 0.9030276 0.0374096 -0.0277111 0.9028657 0.0365289 -0.0276479 0.9026634 0.0354305 -0.0275966 0.9024114 0.0340663 -0.0275778 0.9020992 0.0323815 -0.0276281 0.9017148 0.0303162 -0.0278105 0.9012461 0.0278105 -0.0312193 0.9012461 0.0278105 -0.0355319 0.9012461 0.0278105 -0.0409879 0.9012461 0.0278105 -0.0478904 0.9012461 0.0278105 -0.056623 0.9012461 0.0278105 -0.0676709 0.9012461 0.0278105 -0.0816479 0.9012461 0.0278105 -0.0993306 0.9012461 0.0278105 -0.1217016 0.9012461 0.0278105 -0.1500037 0.9012461 0.0278105 -0.1858097 0.9012461 0.0278105 -0.2311088 0.9012461 0.0278105 -0.2884181 0.9012461 0.0278105 -0.3609218 0.9012461 0.0278105 -0.4526484 0.9012461 0.0278105 -0.5686945 0.9012461 0.0278105 -0.715508 0.9012461 0.0278105 -0.9012461 0.9012461 0.0278105 -0.9345187 0.7495406 0.0619734 -0.9540886 0.6327127 0.1053433 -0.966685 0.5536664 0.1565315 -0.9752692 0.5087774 0.2144168 -0.9813491 0.4926312 0.2777122 -0.9857738 0.4994313 0.3448353 -0.9890579 0.523505 0.4139373 -0.9915312 0.5595628 0.4830346 -0.9934145 0.6028946 0.5501939 -0.9948604 0.649527 0.6137183 -0.9959777 0.6963214 0.6722907 -0.9968453 0.7409934 0.7250473 -0.9975217 0.7820522 0.7715762 -0.9980504 0.8186816 0.8118589 -0.9984648 0.8505894 0.8461791 -0.9987902 0.8778555 0.8750225 -0.9990459 0.9007965 0.8989863 -0.9992473 0.9198584 0.9187068 -0.9994059 0.9355384 0.9348083 -0.9995309 0.9483325 0.947871 -0.9996296 0.9587042 0.9584132 -0.9997074 0.9670687 0.9668855 -0.9997689 0.9737866 0.9736715 -0.9998174 0.9791643 0.979092 -0.9998557 0.9834578 0.9834125 -0.999886 0.9868786 0.9868502 -0.9999099 0.9895996 0.9895818 -0.9999288 0.9917611 0.99175 -0.9999437 0.9934764 0.9934694 -0.0624569 0.9354466 0.0712736 -0.0624063 0.9354101 0.0709061 -0.0623458 0.9353643 0.0704444 -0.0622749 0.9353068 0.0698653 -0.0621943 0.9352348 0.0691408 -0.0621069 0.9351449 0.0682373 -0.0620199 0.9350332 0.0671155 -0.0619473 0.9348949 0.0657302 -0.061916 0.9347252 0.0640325 -0.0619734 0.9345187 0.0619734 -0.0646568 0.9345187 0.0619734 -0.0680517 0.9345187 0.0619734 -0.0723466 0.9345187 0.0619734 -0.0777803 0.9345187 0.0619734 -0.0846546 0.9345187 0.0619734 -0.0933514 0.9345187 0.0619734 -0.1043541 0.9345187 0.0619734 -0.1182739 0.9345187 0.0619734 -0.1358843 0.9345187 0.0619734 -0.1581637 0.9345187 0.0619734 -0.1863501 0.9345187 0.0619734 -0.2220095 0.9345187 0.0619734 -0.2671233 0.9345187 0.0619734 -0.3241981 0.9345187 0.0619734 -0.3964052 0.9345187 0.0619734 -0.4877565 0.9345187 0.0619734 -0.6033278 0.9345187 0.0619734 -0.7495406 0.9345187 0.0619734 -0.9345187 0.9345187 0.0619734 -0.9540886 0.7745924 0.1053433 -0.966685 0.6605087 0.1565315 -0.9752692 0.5879701 0.2144168 -0.9813491 0.5504514 0.2777122 -0.9857738 0.5410227 0.3448353 -0.9890579 0.5529823 0.4139373 -0.9915312 0.5801514 0.4830346 -0.9934145 0.6170729 0.5501939 -0.9948604 0.6591607 0.6137183 -0.9959777 0.7027865 0.6722907 -0.9968453 0.7452834 0.7250473 -0.9975217 0.7848706 0.7715762 -0.9980504 0.8205171 0.8118589 -0.9984648 0.8517759 0.8461791 -0.9987902 0.8786176 0.8750225 -0.9990459 0.9012835 0.8989863 -0.9992473 0.9201683 0.9187068 -0.9994059 0.9357348 0.9348083 -0.9995309 0.9484566 0.947871 -0.9996296 0.9587825 0.9584132 -0.9997074 0.967118 0.9668855 -0.9997689 0.9738176 0.9736715 -0.9998174 0.9791837 0.979092 -0.9998557 0.98347 0.9834125 -0.999886 0.9868863 0.9868502 -0.9999099 0.9896044 0.9895818 -0.9999288 0.9917641 0.99175 -0.9999437 0.9934783 0.9934694 -0.1059991 0.9545467 0.112771 -0.1059489 0.9545286 0.1124771 -0.1058883 0.9545059 0.1121079 -0.1058162 0.9544774 0.111645 -0.1057322 0.9544418 0.1110659 -0.1056375 0.9543974 0.110344 -0.1055364 0.9543421 0.1094478 -0.1054384 0.9542739 0.1083415 -0.1053624 0.9541902 0.1069863 -0.1053433 0.9540886 0.1053433 -0.1074015 0.9540886 0.1053433 -0.1100054 0.9540886 0.1053433 -0.1132997 0.9540886 0.1053433 -0.1174673 0.9540886 0.1053433 -0.12274 0.9540886 0.1053433 -0.1294105 0.9540886 0.1053433 -0.1378497 0.9540886 0.1053433 -0.1485263 0.9540886 0.1053433 -0.1620336 0.9540886 0.1053433 -0.179122 0.9540886 0.1053433 -0.2007412 0.9540886 0.1053433 -0.2280923 0.9540886 0.1053433 -0.2626949 0.9540886 0.1053433 -0.3064717 0.9540886 0.1053433 -0.3618551 0.9540886 0.1053433 -0.4319223 0.9540886 0.1053433 -0.5205664 0.9540886 0.1053433 -0.6327127 0.9540886 0.1053433 -0.7745924 0.9540886 0.1053433 -0.9540886 0.9540886 0.1053433 -0.966685 0.7956781 0.1565315 -0.9752692 0.6881591 0.2144168 -0.9813491 0.6236015 0.2777122 -0.9857738 0.5936412 0.3448353 -0.9890579 0.5902749 0.4139373 -0.9915312 0.6061987 0.4830346 -0.9934145 0.6350102 0.5501939 -0.9948604 0.6713487 0.6137183 -0.9959777 0.7109656 0.6722907 -0.9968453 0.7507108 0.7250473 -0.9975217 0.7884362 0.7715762 -0.9980504 0.8228393 0.8118589 -0.9984648 0.853277 0.8461791 -0.9987902 0.8795819 0.8750225 -0.9990459 0.9018996 0.8989863 -0.9992473 0.9205603 0.9187068 -0.9994059 0.9359833 0.9348083 -0.9995309 0.9486137 0.947871 -0.9996296 0.9588815 0.9584132 -0.9997074 0.9671803 0.9668855 -0.9997689 0.9738568 0.9736715 -0.9998174 0.9792083 0.979092 -0.9998557 0.9834854 0.9834125 -0.999886 0.9868959 0.9868502 -0.9999099 0.9896105 0.9895818 -0.9999288 0.9917679 0.99175 -0.9999437 0.9934806 0.9934694 -0.1572498 0.9669269 0.1623561 -0.1572031 0.9669173 0.1621254 -0.1571463 0.9669053 0.1618356 -0.1570779 0.9668902 0.1614723 -0.1569971 0.9668714 0.1610178 -0.156904 0.9668479 0.1604514 -0.1568008 0.9668187 0.1597484 -0.1566936 0.9667827 0.1588809 -0.1565954 0.9667385 0.1578187 -0.1565315 0.966685 0.1565315 -0.1580814 0.966685 0.1565315 -0.1600423 0.966685 0.1565315 -0.162523 0.966685 0.1565315 -0.1656615 0.966685 0.1565315 -0.169632 0.966685 0.1565315 -0.1746553 0.966685 0.1565315 -0.1810104 0.966685 0.1565315 -0.1890504 0.966685 0.1565315 -0.199222 0.966685 0.1565315 -0.2120905 0.966685 0.1565315 -0.2283708 0.966685 0.1565315 -0.2489674 0.966685 0.1565315 -0.2750249 0.966685 0.1565315 -0.307991 0.966685 0.1565315 -0.3496974 0.966685 0.1565315 -0.4024614 0.966685 0.1565315 -0.4692147 0.966685 0.1565315 -0.5536664 0.966685 0.1565315 -0.6605087 0.966685 0.1565315 -0.7956781 0.966685 0.1565315 -0.966685 0.966685 0.1565315 -0.9752692 0.8149113 0.2144168 -0.9813491 0.716146 0.2777122 -0.9857738 0.6602105 0.3448353 -0.9890579 0.637455 0.4139373 -0.9915312 0.6391518 0.4830346 -0.9934145 0.6577032 0.5501939 -0.9948604 0.686768 0.6137183 -0.9959777 0.7213133 0.6722907 -0.9968453 0.7575772 0.7250473 -0.9975217 0.7929472 0.7715762 -0.9980504 0.8257771 0.8118589 -0.9984648 0.8551761 0.8461791 -0.9987902 0.8808018 0.8750225 -0.9990459 0.9026791 0.8989863 -0.9992473 0.9210562 0.9187068 -0.9994059 0.9362977 0.9348083 -0.9995309 0.9488124 0.947871 -0.9996296 0.9590068 0.9584132 -0.9997074 0.9672592 0.9668855 -0.9997689 0.9739063 0.9736715 -0.9998174 0.9792394 0.979092 -0.9998557 0.9835049 0.9834125 -0.999886 0.9869082 0.9868502 -0.9999099 0.9896181 0.9895818 -0.9999288 0.9917727 0.99175 -0.9999437 0.9934836 0.9934694 -0.2151269 0.9754027 0.2189162 -0.2150852 0.9753975 0.2187378 -0.2150342 0.9753908 0.2185137 -0.2149725 0.9753825 0.2182328 -0.2148987 0.9753721 0.2178815 -0.2148124 0.9753591 0.2174438 -0.2147144 0.975343 0.2169006 -0.2146085 0.9753231 0.2162305 -0.2145034 0.9752987 0.2154103 -0.2144168 0.9752692 0.2144168 -0.2155656 0.9752692 0.2144168 -0.217019 0.9752692 0.2144168 -0.2188577 0.9752692 0.2144168 -0.221184 0.9752692 0.2144168 -0.224127 0.9752692 0.2144168 -0.2278503 0.9752692 0.2144168 -0.2325608 0.9752692 0.2144168 -0.2385201 0.9752692 0.2144168 -0.2460594 0.9752692 0.2144168 -0.2555977 0.9752692 0.2144168 -0.2676648 0.9752692 0.2144168 -0.2829313 0.9752692 0.2144168 -0.3022454 0.9752692 0.2144168 -0.3266802 0.9752692 0.2144168 -0.3575934 0.9752692 0.2144168 -0.3967026 0.9752692 0.2144168 -0.4461809 0.9752692 0.2144168 -0.5087774 0.9752692 0.2144168 -0.5879701 0.9752692 0.2144168 -0.6881591 0.9752692 0.2144168 -0.8149113 0.9752692 0.2144168 -0.9752692 0.9752692 0.2144168 -0.9813491 0.8332267 0.2777122 -0.9857738 0.7444293 0.3448353 -0.9890579 0.6971439 0.4139373 -0.9915312 0.6808418 0.4830346 -0.9934145 0.6864128 0.5501939 -0.9948604 0.7062754 0.6137183 -0.9959777 0.7344044 0.6722907 -0.9968453 0.7662641 0.7250473 -0.9975217 0.7986542 0.7715762 -0.9980504 0.8294939 0.8118589 -0.9984648 0.8575787 0.8461791 -0.9987902 0.8823451 0.8750225 -0.9990459 0.9036652 0.8989863 -0.9992473 0.9216836 0.9187068 -0.9994059 0.9366954 0.9348083 -0.9995309 0.9490638 0.947871 -0.9996296 0.9591654 0.9584132 -0.9997074 0.967359 0.9668855 -0.9997689 0.9739691 0.9736715 -0.9998174 0.9792788 0.979092 -0.9998557 0.9835296 0.9834125 -0.999886 0.9869236 0.9868502 -0.9999099 0.9896278 0.9895818 -0.9999288 0.9917788 0.99175 -0.9999437 0.9934874 0.9934694 -0.2783684 0.9814251 0.2811378 -0.2783325 0.9814221 0.2810019 -0.2782884 0.9814183 0.2808311 -0.2782347 0.9814136 0.2806171 -0.2781701 0.9814076 0.2803496 -0.2780936 0.9814002 0.2800162 -0.2780055 0.9813911 0.2796026 -0.2779077 0.9813797 0.2790924 -0.2778058 0.9813659 0.2784681 -0.2777122 0.9813491 0.2777122 -0.278551 0.9813491 0.2777122 -0.2796122 0.9813491 0.2777122 -0.2809547 0.9813491 0.2777122 -0.2826531 0.9813491 0.2777122 -0.2848019 0.9813491 0.2777122 -0.2875203 0.9813491 0.2777122 -0.2909596 0.9813491 0.2777122 -0.2953106 0.9813491 0.2777122 -0.3008152 0.9813491 0.2777122 -0.3077793 0.9813491 0.2777122 -0.3165898 0.9813491 0.2777122 -0.3277361 0.9813491 0.2777122 -0.3418377 0.9813491 0.2777122 -0.3596781 0.9813491 0.2777122 -0.3822485 0.9813491 0.2777122 -0.410803 0.9813491 0.2777122 -0.4469282 0.9813491 0.2777122 -0.4926312 0.9813491 0.2777122 -0.5504514 0.9813491 0.2777122 -0.6236015 0.9813491 0.2777122 -0.716146 0.9813491 0.2777122 -0.8332267 0.9813491 0.2777122 -0.9813491 0.9813491 0.2777122 -0.9857738 0.850977 0.3448353 -0.9890579 0.772658 0.4139373 -0.9915312 0.7335852 0.4830346 -0.9934145 0.7227342 0.5501939 -0.9948604 0.7309548 0.6137183 -0.9959777 0.7509664 0.6722907 -0.9968453 0.7772541 0.7250473 -0.9975217 0.8058743 0.7715762 -0.9980504 0.8341961 0.8118589 -0.9984648 0.8606183 0.8461791 -0.9987902 0.8842976 0.8750225 -0.9990459 0.9049128 0.8989863 -0.9992473 0.9224773 0.9187068 -0.9994059 0.9371986 0.9348083 -0.9995309 0.9493819 0.947871 -0.9996296 0.959366 0.9584132 -0.9997074 0.9674853 0.9668855 -0.9997689 0.9740484 0.9736715 -0.9998174 0.9793286 0.979092 -0.9998557 0.9835609 0.9834125 -0.999886 0.9869432 0.9868502 -0.9999099 0.9896401 0.9895818 -0.9999288 0.9917864 0.99175 -0.9999437 0.9934922 0.9934694 -0.3454107 0.9858181 0.3474044 -0.3453807 0.9858163 0.3473024 -0.3453439 0.9858141 0.3471743 -0.3452987 0.9858113 0.3470137 -0.3452442 0.9858079 0.3468129 -0.3451791 0.9858036 0.3465628 -0.3451032 0.9857982 0.3462526 -0.3450175 0.9857916 0.34587 -0.3449254 0.9857835 0.3454019 -0.3448353 0.9857738 0.3448353 -0.3454387 0.9857738 0.3448353 -0.346202 0.9857738 0.3448353 -0.3471677 0.9857738 0.3448353 -0.3483894 0.9857738 0.3448353 -0.3499351 0.9857738 0.3448353 -0.3518905 0.9857738 0.3448353 -0.3543644 0.9857738 0.3448353 -0.3574942 0.9857738 0.3448353 -0.3614538 0.9857738 0.3448353 -0.3664632 0.9857738 0.3448353 -0.3728008 0.9857738 0.3448353 -0.3808186 0.9857738 0.3448353 -0.3909622 0.9857738 0.3448353 -0.4037952 0.9857738 0.3448353 -0.4200306 0.9857738 0.3448353 -0.4405705 0.9857738 0.3448353 -0.4665561 0.9857738 0.3448353 -0.4994313 0.9857738 0.3448353 -0.5410227 0.9857738 0.3448353 -0.5936412 0.9857738 0.3448353 -0.6602105 0.9857738 0.3448353 -0.7444293 0.9857738 0.3448353 -0.850977 0.9857738 0.3448353 -0.9857738 0.9857738 0.3448353 -0.9890579 0.8681933 0.4139373 -0.9915312 0.8003123 0.4830346 -0.9934145 0.7686854 0.5501939 -0.9948604 0.7621775 0.6137183 -0.9959777 0.7719194 0.6722907 -0.9968453 0.7911579 0.7250473 -0.9975217 0.8150086 0.7715762 -0.9980504 0.840145 0.8118589 -0.9984648 0.8644638 0.8461791 -0.9987902 0.8867677 0.8750225 -0.9990459 0.9064912 0.8989863 -0.9992473 0.9234815 0.9187068 -0.9994059 0.9378352 0.9348083 -0.9995309 0.9497843 0.947871 -0.9996296 0.9596197 0.9584132 -0.9997074 0.967645 0.9668855 -0.9997689 0.9741488 0.9736715 -0.9998174 0.9793916 0.979092 -0.9998557 0.9836004 0.9834125 -0.999886 0.986968 0.9868502 -0.9999099 0.9896556 0.9895818 -0.9999288 0.9917961 0.99175 -0.9999437 0.9934983 0.9934694 -0.4144197 0.9890841 0.4158337 -0.4143955 0.9890831 0.4157584 -0.4143657 0.9890818 0.4156638 -0.414329 0.9890801 0.4155452 -0.4142845 0.9890781 0.4153969 -0.4142311 0.9890755 0.4152122 -0.4141683 0.9890723 0.4149832 -0.4140964 0.9890684 0.4147008 -0.4140176 0.9890637 0.4143553 -0.4139373 0.9890579 0.4139373 -0.4143649 0.9890579 0.4139373 -0.4149059 0.9890579 0.4139373 -0.4155903 0.9890579 0.4139373 -0.4164562 0.9890579 0.4139373 -0.4175516 0.9890579 0.4139373 -0.4189375 0.9890579 0.4139373 -0.4206909 0.9890579 0.4139373 -0.4229091 0.9890579 0.4139373 -0.4257154 0.9890579 0.4139373 -0.4292657 0.9890579 0.4139373 -0.4337574 0.9890579 0.4139373 -0.4394399 0.9890579 0.4139373 -0.4466291 0.9890579 0.4139373 -0.4557243 0.9890579 0.4139373 -0.4672309 0.9890579 0.4139373 -0.4817882 0.9890579 0.4139373 -0.5002052 0.9890579 0.4139373 -0.523505 0.9890579 0.4139373 -0.5529823 0.9890579 0.4139373 -0.5902749 0.9890579 0.4139373 -0.637455 0.9890579 0.4139373 -0.6971439 0.9890579 0.4139373 -0.772658 0.9890579 0.4139373 -0.8681933 0.9890579 0.4139373 -0.9890579 0.9890579 0.4139373 -0.9915312 0.8847308 0.4830346 -0.9934145 0.8268198 0.5501939 -0.9948604 0.8016783 0.6137183 -0.9959777 0.7984278 0.6722907 -0.9968453 0.808748 0.7250473 -0.9975217 0.8265648 0.7715762 -0.9980504 0.8476711 0.8118589 -0.9984648 0.8693288 0.8461791 -0.9987902 0.8898928 0.8750225 -0.9990459 0.9084881 0.8989863 -0.9992473 0.9247519 0.9187068 -0.9994059 0.9386406 0.9348083 -0.9995309 0.9502933 0.947871 -0.9996296 0.9599407 0.9584132 -0.9997074 0.967847 0.9668855 -0.9997689 0.9742758 0.9736715 -0.9998174 0.9794713 0.979092 -0.9998557 0.9836504 0.9834125 -0.999886 0.9869993 0.9868502 -0.9999099 0.9896752 0.9895818 -0.9999288 0.9918084 0.99175 -0.9999437 0.993506 0.9934694 -0.4834235 0.9915469 0.4844116 -0.4834045 0.9915463 0.4843569 -0.4833811 0.9915455 0.4842882 -0.4833522 0.9915446 0.484202 -0.4833171 0.9915433 0.4840944 -0.4832747 0.9915418 0.4839603 -0.4832246 0.9915399 0.4837939 -0.4831666 0.9915376 0.4835889 -0.4831021 0.9915347 0.4833381 -0.4830346 0.9915312 0.4830346 -0.4833333 0.9915312 0.4830346 -0.4837112 0.9915312 0.4830346 -0.4841892 0.9915312 0.4830346 -0.484794 0.9915312 0.4830346 -0.4855591 0.9915312 0.4830346 -0.4865271 0.9915312 0.4830346 -0.4877517 0.9915312 0.4830346 -0.489301 0.9915312 0.4830346 -0.4912611 0.9915312 0.4830346 -0.4937409 0.9915312 0.4830346 -0.4968781 0.9915312 0.4830346 -0.5008471 0.9915312 0.4830346 -0.5058684 0.9915312 0.4830346 -0.512221 0.9915312 0.4830346 -0.5202578 0.9915312 0.4830346 -0.5304255 0.9915312 0.4830346 -0.5432889 0.9915312 0.4830346 -0.5595628 0.9915312 0.4830346 -0.5801514 0.9915312 0.4830346 -0.6061987 0.9915312 0.4830346 -0.6391518 0.9915312 0.4830346 -0.6808418 0.9915312 0.4830346 -0.7335852 0.9915312 0.4830346 -0.8003123 0.9915312 0.4830346 -0.8847308 0.9915312 0.4830346 -0.9915312 0.9915312 0.4830346 -0.9934145 0.9003673 0.5501939 -0.9948604 0.8516519 0.6137183 -0.9959777 0.8319643 0.6722907 -0.9968453 0.8310018 0.7250473 -0.9975217 0.8411848 0.7715762 -0.9980504 0.8571927 0.8118589 -0.9984648 0.8754838 0.8461791 -0.9987902 0.8938464 0.8750225 -0.9990459 0.9110144 0.8989863 -0.9992473 0.9263591 0.9187068 -0.9994059 0.9396594 0.9348083 -0.9995309 0.9509374 0.947871 -0.9996296 0.9603469 0.9584132 -0.9997074 0.9681027 0.9668855 -0.9997689 0.9744364 0.9736715 -0.9998174 0.9795722 0.979092 -0.9998557 0.9837136 0.9834125 -0.999886 0.9870389 0.9868502 -0.9999099 0.9897 0.9895818 -0.9999288 0.9918239 0.99175 -0.9999437 0.9935157 0.9934694 -0.5504963 0.993424 0.5511771 -0.5504818 0.9934236 0.551138 -0.550464 0.9934231 0.5510889 -0.5504419 0.9934225 0.5510274 -0.550415 0.9934218 0.5509505 -0.5503825 0.9934209 0.5508547 -0.5503438 0.9934197 0.550736 -0.5502987 0.9934183 0.5505896 -0.550248 0.9934166 0.5504105 -0.5501939 0.9934145 0.5501939 -0.5503996 0.9934145 0.5501939 -0.5506598 0.9934145 0.5501939 -0.550989 0.9934145 0.5501939 -0.5514055 0.9934145 0.5501939 -0.5519324 0.9934145 0.5501939 -0.552599 0.9934145 0.5501939 -0.5534423 0.9934145 0.5501939 -0.5545093 0.9934145 0.5501939 -0.5558591 0.9934145 0.5501939 -0.5575667 0.9934145 0.5501939 -0.5597272 0.9934145 0.5501939 -0.5624604 0.9934145 0.5501939 -0.5659183 0.9934145 0.5501939 -0.570293 0.9934145 0.5501939 -0.5758275 0.9934145 0.5501939 -0.5828294 0.9934145 0.5501939 -0.5916877 0.9934145 0.5501939 -0.6028946 0.9934145 0.5501939 -0.6170729 0.9934145 0.5501939 -0.6350102 0.9934145 0.5501939 -0.6577032 0.9934145 0.5501939 -0.6864128 0.9934145 0.5501939 -0.7227342 0.9934145 0.5501939 -0.7686854 0.9934145 0.5501939 -0.8268198 0.9934145 0.5501939 -0.9003673 0.9934145 0.5501939 -0.9934145 0.9934145 0.5501939 -0.9948604 0.914875 0.6137183 -0.9959777 0.8743923 0.6722907 -0.9968453 0.8591558 0.7250473 -0.9975217 0.859681 0.7715762 -0.9980504 0.8692387 0.8118589 -0.9984648 0.8832705 0.8461791 -0.9987902 0.8988483 0.8750225 -0.9990459 0.9142104 0.8989863 -0.9992473 0.9283924 0.9187068 -0.9994059 0.9409485 0.9348083 -0.9995309 0.9517522 0.947871 -0.9996296 0.9608607 0.9584132 -0.9997074 0.9684261 0.9668855 -0.9997689 0.9746397 0.9736715 -0.9998174 0.9796998 0.979092 -0.9998557 0.9837936 0.9834125 -0.999886 0.9870891 0.9868502 -0.9999099 0.9897314 0.9895818 -0.9999288 0.9918436 0.99175 -0.9999437 0.993528 0.9934694 -0.6139459 0.9948662 0.6144087 -0.6139352 0.994866 0.6143812 -0.6139219 0.9948657 0.6143467 -0.6139056 0.9948653 0.6143035 -0.6138855 0.9948649 0.6142495 -0.6138613 0.9948643 0.6141822 -0.6138323 0.9948636 0.6140988 -0.6137984 0.9948628 0.613996 -0.6137599 0.9948617 0.6138703 -0.6137183 0.9948604 0.6137183 -0.613858 0.9948604 0.6137183 -0.6140348 0.9948604 0.6137183 -0.6142585 0.9948604 0.6137183 -0.6145415 0.9948604 0.6137183 -0.6148995 0.9948604 0.6137183 -0.6153525 0.9948604 0.6137183 -0.6159255 0.9948604 0.6137183 -0.6166504 0.9948604 0.6137183 -0.6175676 0.9948604 0.6137183 -0.6187279 0.9948604 0.6137183 -0.6201959 0.9948604 0.6137183 -0.622053 0.9948604 0.6137183 -0.6244026 0.9948604 0.6137183 -0.627375 0.9948604 0.6137183 -0.6311356 0.9948604 0.6137183 -0.6358932 0.9948604 0.6137183 -0.6419122 0.9948604 0.6137183 -0.649527 0.9948604 0.6137183 -0.6591607 0.9948604 0.6137183 -0.6713487 0.9948604 0.6137183 -0.686768 0.9948604 0.6137183 -0.7062754 0.9948604 0.6137183 -0.7309548 0.9948604 0.6137183 -0.7621775 0.9948604 0.6137183 -0.8016783 0.9948604 0.6137183 -0.8516519 0.9948604 0.6137183 -0.914875 0.9948604 0.6137183 -0.9948604 0.9948604 0.6137183 -0.9959777 0.9280693 0.6722907 -0.9968453 0.8947742 0.7250473 -0.9975217 0.8830811 0.7715762 -0.9980504 0.8844784 0.8118589 -0.9984648 0.8931218 0.8461791 -0.9987902 0.9051763 0.8750225 -0.9990459 0.9182539 0.8989863 -0.9992473 0.9309649 0.9187068 -0.9994059 0.9425792 0.9348083 -0.9995309 0.952783 0.947871 -0.9996296 0.9615108 0.9584132 -0.9997074 0.9688353 0.9668855 -0.9997689 0.9748969 0.9736715 -0.9998174 0.9798612 0.979092 -0.9998557 0.9838948 0.9834125 -0.999886 0.9871525 0.9868502 -0.9999099 0.9897711 0.9895818 -0.9999288 0.9918685 0.99175 -0.9999437 0.9935436 0.9934694 -0.6724572 0.9959813 0.6727678 -0.6724495 0.9959811 0.6727489 -0.6724399 0.9959809 0.672725 -0.672428 0.9959807 0.6726952 -0.6724135 0.9959804 0.6726578 -0.6723959 0.9959801 0.6726113 -0.6723748 0.9959797 0.6725537 -0.67235 0.9959791 0.6724827 -0.6723217 0.9959785 0.6723958 -0.6722907 0.9959777 0.6722907 -0.6723845 0.9959777 0.6722907 -0.6725032 0.9959777 0.6722907 -0.6726533 0.9959777 0.6722907 -0.6728432 0.9959777 0.6722907 -0.6730835 0.9959777 0.6722907 -0.6733874 0.9959777 0.6722907 -0.673772 0.9959777 0.6722907 -0.6742585 0.9959777 0.6722907 -0.6748739 0.9959777 0.6722907 -0.6756526 0.9959777 0.6722907 -0.6766377 0.9959777 0.6722907 -0.6778841 0.9959777 0.6722907 -0.6794608 0.9959777 0.6722907 -0.6814556 0.9959777 0.6722907 -0.6839792 0.9959777 0.6722907 -0.687172 0.9959777 0.6722907 -0.6912113 0.9959777 0.6722907 -0.6963214 0.9959777 0.6722907 -0.7027865 0.9959777 0.6722907 -0.7109656 0.9959777 0.6722907 -0.7213133 0.9959777 0.6722907 -0.7344044 0.9959777 0.6722907 -0.7509664 0.9959777 0.6722907 -0.7719194 0.9959777 0.6722907 -0.7984278 0.9959777 0.6722907 -0.8319643 0.9959777 0.6722907 -0.8743923 0.9959777 0.6722907 -0.9280693 0.9959777 0.6722907 -0.9959777 0.9959777 0.6722907 -0.9968453 0.9398361 0.7250473 -0.9975217 0.9126854 0.7715762 -0.9980504 0.9037586 0.8118589 -0.9984648 0.9055849 0.8461791 -0.9987902 0.913182 0.8750225 -0.9990459 0.9233694 0.8989863 -0.9992473 0.9342194 0.9187068 -0.9994059 0.9446424 0.9348083 -0.9995309 0.9540871 0.947871 -0.9996296 0.9623332 0.9584132 -0.9997074 0.9693529 0.9668855 -0.9997689 0.9752222 0.9736715 -0.9998174 0.9800654 0.979092 -0.9998557 0.9840229 0.9834125 -0.999886 0.9872327 0.9868502 -0.9999099 0.9898214 0.9895818 -0.9999288 0.9918999 0.99175 -0.9999437 0.9935632 0.9934694 -0.7251659 0.9968475 0.7253722 -0.7251605 0.9968474 0.7253592 -0.7251537 0.9968473 0.725343 -0.7251454 0.9968472 0.7253227 -0.7251351 0.996847 0.7252972 -0.7251226 0.9968468 0.7252656 -0.7251076 0.9968465 0.7252263 -0.7250899 0.9968462 0.725178 -0.7250697 0.9968458 0.7251188 -0.7250473 0.9968453 0.7250473 -0.7251096 0.9968453 0.7250473 -0.7251883 0.9968453 0.7250473 -0.7252879 0.9968453 0.7250473 -0.7254139 0.9968453 0.7250473 -0.7255733 0.9968453 0.7250473 -0.725775 0.9968453 0.7250473 -0.7260302 0.9968453 0.7250473 -0.726353 0.9968453 0.7250473 -0.7267615 0.9968453 0.7250473 -0.7272782 0.9968453 0.7250473 -0.7279319 0.9968453 0.7250473 -0.7287589 0.9968453 0.7250473 -0.7298052 0.9968453 0.7250473 -0.7311288 0.9968453 0.7250473 -0.7328035 0.9968453 0.7250473 -0.7349221 0.9968453 0.7250473 -0.7376024 0.9968453 0.7250473 -0.7409934 0.9968453 0.7250473 -0.7452834 0.9968453 0.7250473 -0.7507108 0.9968453 0.7250473 -0.7575772 0.9968453 0.7250473 -0.7662641 0.9968453 0.7250473 -0.7772541 0.9968453 0.7250473 -0.7911579 0.9968453 0.7250473 -0.808748 0.9968453 0.7250473 -0.8310018 0.9968453 0.7250473 -0.8591558 0.9968453 0.7250473 -0.8947742 0.9968453 0.7250473 -0.9398361 0.9968453 0.7250473 -0.9968453 0.9968453 0.7250473 -0.9975217 0.9501385 0.7715762 -0.9980504 0.9281506 0.8118589 -0.9984648 0.9213524 0.8461791 -0.9987902 0.9233103 0.8750225 -0.9990459 0.9298411 0.8989863 -0.9992473 0.9383367 0.9187068 -0.9994059 0.9472525 0.9348083 -0.9995309 0.955737 0.947871 -0.9996296 0.9633736 0.9584132 -0.9997074 0.9700078 0.9668855 -0.9997689 0.9756338 0.9736715 -0.9998174 0.9803238 0.979092 -0.9998557 0.9841849 0.9834125 -0.999886 0.9873343 0.9868502 -0.9999099 0.989885 0.9895818 -0.9999288 0.9919397 0.99175 -0.9999437 0.9935881 0.9934694 -0.7716588 0.997523 0.7717943 -0.7716551 0.997523 0.7717857 -0.7716504 0.9975229 0.7717748 -0.7716446 0.9975228 0.7717611 -0.7716375 0.9975227 0.771744 -0.7716288 0.9975226 0.7717228 -0.7716184 0.9975224 0.7716964 -0.7716061 0.9975222 0.7716639 -0.7715919 0.997522 0.7716242 -0.7715762 0.9975217 0.7715762 -0.7716171 0.9975217 0.7715762 -0.7716688 0.9975217 0.7715762 -0.7717342 0.9975217 0.7715762 -0.771817 0.9975217 0.7715762 -0.7719217 0.9975217 0.7715762 -0.7720543 0.9975217 0.7715762 -0.7722219 0.9975217 0.7715762 -0.772434 0.9975217 0.7715762 -0.7727023 0.9975217 0.7715762 -0.7730418 0.9975217 0.7715762 -0.7734712 0.9975217 0.7715762 -0.7740145 0.9975217 0.7715762 -0.7747019 0.9975217 0.7715762 -0.7755715 0.9975217 0.7715762 -0.7766717 0.9975217 0.7715762 -0.7780636 0.9975217 0.7715762 -0.7798244 0.9975217 0.7715762 -0.7820522 0.9975217 0.7715762 -0.7848706 0.9975217 0.7715762 -0.7884362 0.9975217 0.7715762 -0.7929472 0.9975217 0.7715762 -0.7986542 0.9975217 0.7715762 -0.8058743 0.9975217 0.7715762 -0.8150086 0.9975217 0.7715762 -0.8265648 0.9975217 0.7715762 -0.8411848 0.9975217 0.7715762 -0.859681 0.9975217 0.7715762 -0.8830811 0.9975217 0.7715762 -0.9126854 0.9975217 0.7715762 -0.9501385 0.9975217 0.7715762 -0.9975217 0.9975217 0.7715762 -0.9980504 0.9590097 0.8118589 -0.9984648 0.9413004 0.8461791 -0.9987902 0.936124 0.8750225 -0.9990459 0.9380288 0.8989863 -0.9992473 0.9435457 0.9187068 -0.9994059 0.9505547 0.9348083 -0.9995309 0.9578243 0.947871 -0.9996296 0.96469 0.9584132 -0.9997074 0.9708363 0.9668855 -0.9997689 0.9761545 0.9736715 -0.9998174 0.9806506 0.979092 -0.9998557 0.9843899 0.9834125 -0.999886 0.9874627 0.9868502 -0.9999099 0.9899654 0.9895818 -0.9999288 0.9919901 0.99175 -0.9999437 0.9936196 0.9934694 -0.8119154 0.9980513 0.8120036 -0.8119128 0.9980512 0.8119979 -0.8119096 0.9980512 0.8119906 -0.8119057 0.9980511 0.8119816 -0.8119009 0.9980511 0.8119703 -0.8118949 0.998051 0.8119561 -0.8118878 0.9980509 0.8119387 -0.8118794 0.9980508 0.8119171 -0.8118697 0.9980506 0.8118907 -0.8118589 0.9980504 0.8118589 -0.8118855 0.9980504 0.8118589 -0.8119192 0.9980504 0.8118589 -0.8119618 0.9980504 0.8118589 -0.8120157 0.9980504 0.8118589 -0.8120839 0.9980504 0.8118589 -0.8121702 0.9980504 0.8118589 -0.8122794 0.9980504 0.8118589 -0.8124175 0.9980504 0.8118589 -0.8125923 0.9980504 0.8118589 -0.8128134 0.9980504 0.8118589 -0.8130931 0.9980504 0.8118589 -0.8134469 0.9980504 0.8118589 -0.8138946 0.9980504 0.8118589 -0.8144609 0.9980504 0.8118589 -0.8151774 0.9980504 0.8118589 -0.8160839 0.9980504 0.8118589 -0.8172307 0.9980504 0.8118589 -0.8186816 0.9980504 0.8118589 -0.8205171 0.9980504 0.8118589 -0.8228393 0.9980504 0.8118589 -0.8257771 0.9980504 0.8118589 -0.8294939 0.9980504 0.8118589 -0.8341961 0.9980504 0.8118589 -0.840145 0.9980504 0.8118589 -0.8476711 0.9980504 0.8118589 -0.8571927 0.9980504 0.8118589 -0.8692387 0.9980504 0.8118589 -0.8844784 0.9980504 0.8118589 -0.9037586 0.9980504 0.8118589 -0.9281506 0.9980504 0.8118589 -0.9590097 0.9980504 0.8118589 -0.9980504 0.9980504 0.8118589 -0.9984648 0.9665371 0.8461791 -0.9987902 0.9523349 0.8750225 -0.9990459 0.9483872 0.8989863 -0.9992473 0.9501358 0.9187068 -0.9994059 0.9547324 0.9348083 -0.9995309 0.960465 0.947871 -0.9996296 0.9663553 0.9584132 -0.9997074 0.9718845 0.9668855 -0.9997689 0.9768133 0.9736715 -0.9998174 0.9810642 0.979092 -0.9998557 0.9846492 0.9834125 -0.999886 0.9876252 0.9868502 -0.9999099 0.9900672 0.9895818 -0.9999288 0.9920538 0.99175 -0.9999437 0.9936595 0.9934694 -0.8462171 0.9984653 0.8462741 -0.8462154 0.9984653 0.8462703 -0.8462132 0.9984653 0.8462656 -0.8462106 0.9984653 0.8462596 -0.8462073 0.9984652 0.8462522 -0.8462034 0.9984652 0.8462429 -0.8461986 0.9984651 0.8462315 -0.8461929 0.998465 0.8462173 -0.8461864 0.9984649 0.8462 -0.8461791 0.9984648 0.8461791 -0.8461963 0.9984648 0.8461791 -0.8462181 0.9984648 0.8461791 -0.8462456 0.9984648 0.8461791 -0.8462805 0.9984648 0.8461791 -0.8463246 0.9984648 0.8461791 -0.8463803 0.9984648 0.8461791 -0.8464509 0.9984648 0.8461791 -0.8465402 0.9984648 0.8461791 -0.8466532 0.9984648 0.8461791 -0.8467961 0.9984648 0.8461791 -0.8469769 0.9984648 0.8461791 -0.8472056 0.9984648 0.8461791 -0.847495 0.9984648 0.8461791 -0.8478611 0.9984648 0.8461791 -0.8483242 0.9984648 0.8461791 -0.8489102 0.9984648 0.8461791 -0.8496515 0.9984648 0.8461791 -0.8505894 0.9984648 0.8461791 -0.8517759 0.9984648 0.8461791 -0.853277 0.9984648 0.8461791 -0.8551761 0.9984648 0.8461791 -0.8575787 0.9984648 0.8461791 -0.8606183 0.9984648 0.8461791 -0.8644638 0.9984648 0.8461791 -0.8693288 0.9984648 0.8461791 -0.8754838 0.9984648 0.8461791 -0.8832705 0.9984648 0.8461791 -0.8931218 0.9984648 0.8461791 -0.9055849 0.9984648 0.8461791 -0.9213524 0.9984648 0.8461791 -0.9413004 0.9984648 0.8461791 -0.9665371 0.9984648 0.8461791 -0.9984648 0.9984648 0.8461791 -0.9987902 0.9728437 0.8750225 -0.9990459 0.9614919 0.8989863 -0.9992473 0.9584731 0.9187068 -0.9994059 0.9600177 0.9348083 -0.9995309 0.9638059 0.947871 -0.9996296 0.9684621 0.9584132 -0.9997074 0.9732106 0.9668855 -0.9997689 0.9776467 0.9736715 -0.9998174 0.9815873 0.979092 -0.9998557 0.9849773 0.9834125 -0.999886 0.9878308 0.9868502 -0.9999099 0.9901959 0.9895818 -0.9999288 0.9921344 0.99175 -0.9999437 0.9937099 0.9934694 -0.8750477 0.9987905 0.8750843 -0.8750466 0.9987905 0.8750819 -0.8750451 0.9987904 0.8750788 -0.8750434 0.9987904 0.8750749 -0.8750412 0.9987904 0.8750701 -0.8750386 0.9987904 0.875064 -0.8750355 0.9987903 0.8750566 -0.8750317 0.9987903 0.8750474 -0.8750274 0.9987902 0.8750361 -0.8750225 0.9987902 0.8750225 -0.8750335 0.9987902 0.8750225 -0.8750475 0.9987902 0.8750225 -0.8750652 0.9987902 0.8750225 -0.8750876 0.9987902 0.8750225 -0.8751159 0.9987902 0.8750225 -0.8751518 0.9987902 0.8750225 -0.8751971 0.9987902 0.8750225 -0.8752545 0.9987902 0.8750225 -0.875327 0.9987902 0.8750225 -0.8754188 0.9987902 0.8750225 -0.875535 0.9987902 0.8750225 -0.8756819 0.9987902 0.8750225 -0.8758678 0.9987902 0.8750225 -0.8761029 0.9987902 0.8750225 -0.8764004 0.9987902 0.8750225 -0.8767768 0.9987902 0.8750225 -0.877253 0.9987902 0.8750225 -0.8778555 0.9987902 0.8750225 -0.8786176 0.9987902 0.8750225 -0.8795819 0.9987902 0.8750225 -0.8808018 0.9987902 0.8750225 -0.8823451 0.9987902 0.8750225 -0.8842976 0.9987902 0.8750225 -0.8867677 0.9987902 0.8750225 -0.8898928 0.9987902 0.8750225 -0.8938464 0.9987902 0.8750225 -0.8988483 0.9987902 0.8750225 -0.9051763 0.9987902 0.8750225 -0.913182 0.9987902 0.8750225 -0.9233103 0.9987902 0.8750225 -0.936124 0.9987902 0.8750225 -0.9523349 0.9987902 0.8750225 -0.9728437 0.9987902 0.8750225 -0.9987902 0.9987902 0.8750225 -0.9990459 0.9780711 0.8989863 -0.9992473 0.9690208 0.9187068 -0.9994059 0.9667044 0.9348083 -0.9995309 0.9680325 0.947871 -0.9996296 0.9711275 0.9584132 -0.9997074 0.9748883 0.9668855 -0.9997689 0.9787011 0.9736715 -0.9998174 0.9822492 0.979092 -0.9998557 0.9853924 0.9834125 -0.999886 0.9880909 0.9868502 -0.9999099 0.9903588 0.9895818 -0.9999288 0.9922363 0.99175 -0.9999437 0.9937737 0.9934694 -0.8990028 0.9990461 0.8990262 -0.899002 0.9990461 0.8990246 -0.8990011 0.9990461 0.8990226 -0.899 0.9990461 0.8990201 -0.8989986 0.9990461 0.899017 -0.8989969 0.9990461 0.8990131 -0.8989948 0.9990461 0.8990083 -0.8989923 0.999046 0.8990023 -0.8989895 0.999046 0.8989951 -0.8989863 0.9990459 0.8989863 -0.8989933 0.9990459 0.8989863 -0.8990023 0.9990459 0.8989863 -0.8990136 0.9990459 0.8989863 -0.8990279 0.9990459 0.8989863 -0.899046 0.9990459 0.8989863 -0.8990689 0.9990459 0.8989863 -0.8990978 0.9990459 0.8989863 -0.8991345 0.9990459 0.8989863 -0.8991809 0.9990459 0.8989863 -0.8992395 0.9990459 0.8989863 -0.8993137 0.9990459 0.8989863 -0.8994076 0.9990459 0.8989863 -0.8995264 0.9990459 0.8989863 -0.8996766 0.9990459 0.8989863 -0.8998667 0.9990459 0.8989863 -0.9001073 0.9990459 0.8989863 -0.9004115 0.9990459 0.8989863 -0.9007965 0.9990459 0.8989863 -0.9012835 0.9990459 0.8989863 -0.9018996 0.9990459 0.8989863 -0.9026791 0.9990459 0.8989863 -0.9036652 0.9990459 0.8989863 -0.9049128 0.9990459 0.8989863 -0.9064912 0.9990459 0.8989863 -0.9084881 0.9990459 0.8989863 -0.9110144 0.9990459 0.8989863 -0.9142104 0.9990459 0.8989863 -0.9182539 0.9990459 0.8989863 -0.9233694 0.9990459 0.8989863 -0.9298411 0.9990459 0.8989863 -0.9380288 0.9990459 0.8989863 -0.9483872 0.9990459 0.8989863 -0.9614919 0.9990459 0.8989863 -0.9780711 0.9990459 0.8989863 -0.9990459 0.9990459 0.8989863 -0.9992473 0.9823651 0.9187068 -0.9994059 0.9751638 0.9348083 -0.9995309 0.9733798 0.947871 -0.9996296 0.9744996 0.9584132 -0.9997074 0.9770108 0.9668855 -0.9997689 0.980035 0.9736715 -0.9998174 0.9830865 0.979092 -0.9998557 0.9859175 0.9834125 -0.999886 0.9884199 0.9868502 -0.9999099 0.9905648 0.9895818 -0.9999288 0.9923653 0.99175 -0.9999437 0.9938544 0.9934694 -0.9187175 0.9992474 0.9187324 -0.918717 0.9992474 0.9187314 -0.9187164 0.9992474 0.9187301 -0.9187157 0.9992474 0.9187285 -0.9187148 0.9992474 0.9187265 -0.9187137 0.9992474 0.918724 -0.9187123 0.9992473 0.9187209 -0.9187107 0.9992473 0.9187171 -0.9187089 0.9992473 0.9187124 -0.9187068 0.9992473 0.9187068 -0.9187113 0.9992473 0.9187068 -0.918717 0.9992473 0.9187068 -0.9187241 0.9992473 0.9187068 -0.9187332 0.9992473 0.9187068 -0.9187448 0.9992473 0.9187068 -0.9187593 0.9992473 0.9187068 -0.9187778 0.9992473 0.9187068 -0.9188011 0.9992473 0.9187068 -0.9188306 0.9992473 0.9187068 -0.9188679 0.9992473 0.9187068 -0.9189151 0.9992473 0.9187068 -0.9189748 0.9992473 0.9187068 -0.9190504 0.9992473 0.9187068 -0.919146 0.9992473 0.9187068 -0.9192669 0.9992473 0.9187068 -0.9194199 0.9992473 0.9187068 -0.9196135 0.9992473 0.9187068 -0.9198584 0.9992473 0.9187068 -0.9201683 0.9992473 0.9187068 -0.9205603 0.9992473 0.9187068 -0.9210562 0.9992473 0.9187068 -0.9216836 0.9992473 0.9187068 -0.9224773 0.9992473 0.9187068 -0.9234815 0.9992473 0.9187068 -0.9247519 0.9992473 0.9187068 -0.9263591 0.9992473 0.9187068 -0.9283924 0.9992473 0.9187068 -0.9309649 0.9992473 0.9187068 -0.9342194 0.9992473 0.9187068 -0.9383367 0.9992473 0.9187068 -0.9435457 0.9992473 0.9187068 -0.9501358 0.9992473 0.9187068 -0.9584731 0.9992473 0.9187068 -0.9690208 0.9992473 0.9187068 -0.9823651 0.9992473 0.9187068 -0.9992473 0.9992473 0.9187068 -0.9994059 0.9858661 0.9348083 -0.9995309 0.9801447 0.947871 -0.9996296 0.9787657 0.9584132 -0.9997074 0.9796961 0.9668855 -0.9997689 0.9817226 0.9736715 -0.9998174 0.9841459 0.979092 -0.9998557 0.9865818 0.9834125 -0.999886 0.9888362 0.9868502 -0.9999099 0.9908255 0.9895818 -0.9999288 0.9925285 0.99175 -0.9999437 0.9939565 0.9934694 -0.9348153 0.999406 0.9348247 -0.9348149 0.999406 0.9348241 -0.9348146 0.999406 0.9348232 -0.9348141 0.999406 0.9348222 -0.9348135 0.999406 0.9348209 -0.9348128 0.9994059 0.9348193 -0.9348119 0.9994059 0.9348174 -0.9348109 0.9994059 0.9348149 -0.9348097 0.9994059 0.9348119 -0.9348083 0.9994059 0.9348083 -0.9348112 0.9994059 0.9348083 -0.9348148 0.9994059 0.9348083 -0.9348194 0.9994059 0.9348083 -0.9348251 0.9994059 0.9348083 -0.9348324 0.9994059 0.9348083 -0.9348417 0.9994059 0.9348083 -0.9348533 0.9994059 0.9348083 -0.9348681 0.9994059 0.9348083 -0.9348868 0.9994059 0.9348083 -0.9349105 0.9994059 0.9348083 -0.9349404 0.9994059 0.9348083 -0.9349783 0.9994059 0.9348083 -0.9350262 0.9994059 0.9348083 -0.9350868 0.9994059 0.9348083 -0.9351634 0.9994059 0.9348083 -0.9352604 0.9994059 0.9348083 -0.9353832 0.9994059 0.9348083 -0.9355384 0.9994059 0.9348083 -0.9357348 0.9994059 0.9348083 -0.9359833 0.9994059 0.9348083 -0.9362977 0.9994059 0.9348083 -0.9366954 0.9994059 0.9348083 -0.9371986 0.9994059 0.9348083 -0.9378352 0.9994059 0.9348083 -0.9386406 0.9994059 0.9348083 -0.9396594 0.9994059 0.9348083 -0.9409485 0.9994059 0.9348083 -0.9425792 0.9994059 0.9348083 -0.9446424 0.9994059 0.9348083 -0.9472525 0.9994059 0.9348083 -0.9505547 0.9994059 0.9348083 -0.9547324 0.9994059 0.9348083 -0.9600177 0.9994059 0.9348083 -0.9667044 0.9994059 0.9348083 -0.9751638 0.9994059 0.9348083 -0.9858661 0.9994059 0.9348083 -0.9994059 0.9994059 0.9348083 -0.9995309 0.9887033 0.947871 -0.9996296 0.9841629 0.9584132 -0.9997074 0.9830932 0.9668855 -0.9997689 0.9838577 0.9736715 -0.9998174 0.9854861 0.979092 -0.9998557 0.9874223 0.9834125 -0.999886 0.9893629 0.9868502 -0.9999099 0.9911554 0.9895818 -0.9999288 0.9927349 0.99175 -0.9999437 0.9940857 0.9934694 -0.9478754 0.999531 0.9478814 -0.9478752 0.999531 0.947881 -0.947875 0.999531 0.9478804 -0.9478746 0.999531 0.9478798 -0.9478743 0.999531 0.947879 -0.9478738 0.999531 0.947878 -0.9478733 0.999531 0.9478767 -0.9478726 0.999531 0.9478751 -0.9478718 0.999531 0.9478733 -0.947871 0.9995309 0.947871 -0.9478728 0.9995309 0.947871 -0.947875 0.9995309 0.947871 -0.9478779 0.9995309 0.947871 -0.9478816 0.9995309 0.947871 -0.9478862 0.9995309 0.947871 -0.947892 0.9995309 0.947871 -0.9478994 0.9995309 0.947871 -0.9479088 0.9995309 0.947871 -0.9479206 0.9995309 0.947871 -0.9479355 0.9995309 0.947871 -0.9479544 0.9995309 0.947871 -0.9479784 0.9995309 0.947871 -0.9480087 0.9995309 0.947871 -0.948047 0.9995309 0.947871 -0.9480954 0.9995309 0.947871 -0.9481567 0.9995309 0.947871 -0.9482343 0.9995309 0.947871 -0.9483325 0.9995309 0.947871 -0.9484566 0.9995309 0.947871 -0.9486137 0.9995309 0.947871 -0.9488124 0.9995309 0.947871 -0.9490638 0.9995309 0.947871 -0.9493819 0.9995309 0.947871 -0.9497843 0.9995309 0.947871 -0.9502933 0.9995309 0.947871 -0.9509374 0.9995309 0.947871 -0.9517522 0.9995309 0.947871 -0.952783 0.9995309 0.947871 -0.9540871 0.9995309 0.947871 -0.955737 0.9995309 0.947871 -0.9578243 0.9995309 0.947871 -0.960465 0.9995309 0.947871 -0.9638059 0.9995309 0.947871 -0.9680325 0.9995309 0.947871 -0.9733798 0.9995309 0.947871 -0.9801447 0.9995309 0.947871 -0.9887033 0.9995309 0.947871 -0.9995309 0.9995309 0.947871 -0.9996296 0.9909911 0.9584132 -0.9997074 0.9873911 0.9668855 -0.9997689 0.9865588 0.9736715 -0.9998174 0.9871816 0.979092 -0.9998557 0.9884856 0.9834125 -0.999886 0.9900292 0.9868502 -0.9999099 0.9915726 0.9895818 -0.9999288 0.9929961 0.99175 -0.9999437 0.9942491 0.9934694 -0.958416 0.9996296 0.9584198 -0.9584159 0.9996296 0.9584195 -0.9584157 0.9996296 0.9584192 -0.9584155 0.9996296 0.9584187 -0.9584153 0.9996296 0.9584182 -0.958415 0.9996296 0.9584176 -0.9584146 0.9996296 0.9584168 -0.9584142 0.9996296 0.9584158 -0.9584137 0.9996296 0.9584146 -0.9584132 0.9996296 0.9584132 -0.9584143 0.9996296 0.9584132 -0.9584157 0.9996296 0.9584132 -0.9584175 0.9996296 0.9584132 -0.9584198 0.9996296 0.9584132 -0.9584228 0.9996296 0.9584132 -0.9584264 0.9996296 0.9584132 -0.9584311 0.9996296 0.9584132 -0.958437 0.9996296 0.9584132 -0.9584444 0.9996296 0.9584132 -0.9584539 0.9996296 0.9584132 -0.9584658 0.9996296 0.9584132 -0.9584809 0.9996296 0.9584132 -0.9585 0.9996296 0.9584132 -0.9585242 0.9996296 0.9584132 -0.9585547 0.9996296 0.9584132 -0.9585934 0.9996296 0.9584132 -0.9586423 0.9996296 0.9584132 -0.9587042 0.9996296 0.9584132 -0.9587825 0.9996296 0.9584132 -0.9588815 0.9996296 0.9584132 -0.9590068 0.9996296 0.9584132 -0.9591654 0.9996296 0.9584132 -0.959366 0.9996296 0.9584132 -0.9596197 0.9996296 0.9584132 -0.9599407 0.9996296 0.9584132 -0.9603469 0.9996296 0.9584132 -0.9608607 0.9996296 0.9584132 -0.9615108 0.9996296 0.9584132 -0.9623332 0.9996296 0.9584132 -0.9633736 0.9996296 0.9584132 -0.96469 0.9996296 0.9584132 -0.9663553 0.9996296 0.9584132 -0.9684621 0.9996296 0.9584132 -0.9711275 0.9996296 0.9584132 -0.9744996 0.9996296 0.9584132 -0.9787657 0.9996296 0.9584132 -0.9841629 0.9996296 0.9584132 -0.9909911 0.9996296 0.9584132 -0.9996296 0.9996296 0.9584132 -0.9997074 0.9928285 0.9668855 -0.9997689 0.9899761 0.9736715 -0.9998174 0.9893267 0.979092 -0.9998557 0.9898308 0.9834125 -0.999886 0.9908721 0.9868502 -0.9999099 0.9921005 0.9895818 -0.9999288 0.9933265 0.99175 -0.9999437 0.9944559 0.9934694 -0.9668873 0.9997074 0.9668897 -0.9668872 0.9997074 0.9668895 -0.9668871 0.9997074 0.9668893 -0.966887 0.9997074 0.9668891 -0.9668869 0.9997074 0.9668887 -0.9668867 0.9997074 0.9668883 -0.9668865 0.9997074 0.9668878 -0.9668862 0.9997074 0.9668872 -0.9668859 0.9997074 0.9668864 -0.9668855 0.9997074 0.9668855 -0.9668862 0.9997074 0.9668855 -0.9668872 0.9997074 0.9668855 -0.9668883 0.9997074 0.9668855 -0.9668897 0.9997074 0.9668855 -0.9668916 0.9997074 0.9668855 -0.9668939 0.9997074 0.9668855 -0.9668968 0.9997074 0.9668855 -0.9669005 0.9997074 0.9668855 -0.9669052 0.9997074 0.9668855 -0.9669112 0.9997074 0.9668855 -0.9669187 0.9997074 0.9668855 -0.9669282 0.9997074 0.9668855 -0.9669402 0.9997074 0.9668855 -0.9669554 0.9997074 0.9668855 -0.9669746 0.9997074 0.9668855 -0.966999 0.9997074 0.9668855 -0.9670298 0.9997074 0.9668855 -0.9670687 0.9997074 0.9668855 -0.967118 0.9997074 0.9668855 -0.9671803 0.9997074 0.9668855 -0.9672592 0.9997074 0.9668855 -0.967359 0.9997074 0.9668855 -0.9674853 0.9997074 0.9668855 -0.967645 0.9997074 0.9668855 -0.967847 0.9997074 0.9668855 -0.9681027 0.9997074 0.9668855 -0.9684261 0.9997074 0.9668855 -0.9688353 0.9997074 0.9668855 -0.9693529 0.9997074 0.9668855 -0.9700078 0.9997074 0.9668855 -0.9708363 0.9997074 0.9668855 -0.9718845 0.9997074 0.9668855 -0.9732106 0.9997074 0.9668855 -0.9748883 0.9997074 0.9668855 -0.9770108 0.9997074 0.9668855 -0.9796961 0.9997074 0.9668855 -0.9830932 0.9997074 0.9668855 -0.9873911 0.9997074 0.9668855 -0.9928285 0.9997074 0.9668855 -0.9997074 0.9997074 0.9668855 -0.9997689 0.9942993 0.9736715 -0.9998174 0.9920405 0.979092 -0.9998557 0.9915326 0.9834125 -0.999886 0.9919385 0.9868502 -0.9999099 0.9927684 0.9895818 -0.9999288 0.9937446 0.99175 -0.9999437 0.9947174 0.9934694 -0.9736726 0.9997689 0.9736741 -0.9736726 0.9997689 0.973674 -0.9736725 0.9997689 0.9736739 -0.9736724 0.9997689 0.9736737 -0.9736723 0.9997689 0.9736735 -0.9736722 0.9997689 0.9736733 -0.9736721 0.9997689 0.9736729 -0.9736719 0.9997689 0.9736725 -0.9736717 0.9997689 0.9736721 -0.9736715 0.9997689 0.9736715 -0.9736719 0.9997689 0.9736715 -0.9736725 0.9997689 0.9736715 -0.9736732 0.9997689 0.9736715 -0.9736741 0.9997689 0.9736715 -0.9736753 0.9997689 0.9736715 -0.9736767 0.9997689 0.9736715 -0.9736786 0.9997689 0.9736715 -0.9736809 0.9997689 0.9736715 -0.9736839 0.9997689 0.9736715 -0.9736876 0.9997689 0.9736715 -0.9736923 0.9997689 0.9736715 -0.9736983 0.9997689 0.9736715 -0.9737058 0.9997689 0.9736715 -0.9737154 0.9997689 0.9736715 -0.9737275 0.9997689 0.9736715 -0.9737428 0.9997689 0.9736715 -0.9737621 0.9997689 0.9736715 -0.9737866 0.9997689 0.9736715 -0.9738176 0.9997689 0.9736715 -0.9738568 0.9997689 0.9736715 -0.9739063 0.9997689 0.9736715 -0.9739691 0.9997689 0.9736715 -0.9740484 0.9997689 0.9736715 -0.9741488 0.9997689 0.9736715 -0.9742758 0.9997689 0.9736715 -0.9744364 0.9997689 0.9736715 -0.9746397 0.9997689 0.9736715 -0.9748969 0.9997689 0.9736715 -0.9752222 0.9997689 0.9736715 -0.9756338 0.9997689 0.9736715 -0.9761545 0.9997689 0.9736715 -0.9768133 0.9997689 0.9736715 -0.9776467 0.9997689 0.9736715 -0.9787011 0.9997689 0.9736715 -0.980035 0.9997689 0.9736715 -0.9817226 0.9997689 0.9736715 -0.9838577 0.9997689 0.9736715 -0.9865588 0.9997689 0.9736715 -0.9899761 0.9997689 0.9736715 -0.9942993 0.9997689 0.9736715 -0.9997689 0.9997689 0.9736715 -0.9998174 0.9954738 0.979092 -0.9998557 0.9936857 0.9834125 -0.999886 0.9932877 0.9868502 -0.9999099 0.9936133 0.9895818 -0.9999288 0.9942734 0.99175 -0.9999437 0.9950483 0.9934694 -0.9790927 0.9998174 0.9790937 -0.9790927 0.9998174 0.9790936 -0.9790927 0.9998174 0.9790935 -0.9790926 0.9998174 0.9790934 -0.9790925 0.9998174 0.9790933 -0.9790925 0.9998174 0.9790931 -0.9790924 0.9998174 0.9790929 -0.9790923 0.9998174 0.9790927 -0.9790921 0.9998174 0.9790924 -0.979092 0.9998174 0.979092 -0.9790923 0.9998174 0.979092 -0.9790926 0.9998174 0.979092 -0.9790931 0.9998174 0.979092 -0.9790937 0.9998174 0.979092 -0.9790944 0.9998174 0.979092 -0.9790953 0.9998174 0.979092 -0.9790965 0.9998174 0.979092 -0.9790979 0.9998174 0.979092 -0.9790998 0.9998174 0.979092 -0.9791021 0.9998174 0.979092 -0.9791051 0.9998174 0.979092 -0.9791088 0.9998174 0.979092 -0.9791136 0.9998174 0.979092 -0.9791196 0.9998174 0.979092 -0.9791272 0.9998174 0.979092 -0.9791368 0.9998174 0.979092 -0.9791489 0.9998174 0.979092 -0.9791643 0.9998174 0.979092 -0.9791837 0.9998174 0.979092 -0.9792083 0.9998174 0.979092 -0.9792394 0.9998174 0.979092 -0.9792788 0.9998174 0.979092 -0.9793286 0.9998174 0.979092 -0.9793916 0.9998174 0.979092 -0.9794713 0.9998174 0.979092 -0.9795722 0.9998174 0.979092 -0.9796998 0.9998174 0.979092 -0.9798612 0.9998174 0.979092 -0.9800654 0.9998174 0.979092 -0.9803238 0.9998174 0.979092 -0.9806506 0.9998174 0.979092 -0.9810642 0.9998174 0.979092 -0.9815873 0.9998174 0.979092 -0.9822492 0.9998174 0.979092 -0.9830865 0.9998174 0.979092 -0.9841459 0.9998174 0.979092 -0.9854861 0.9998174 0.979092 -0.9871816 0.9998174 0.979092 -0.9893267 0.9998174 0.979092 -0.9920405 0.9998174 0.979092 -0.9954738 0.9998174 0.979092 -0.9998174 0.9998174 0.979092 -0.9998557 0.9964096 0.9834125 -0.999886 0.9949946 0.9868502 -0.9999099 0.9946822 0.9895818 -0.9999288 0.9949425 0.99175 -0.9999437 0.995467 0.9934694 -0.9834129 0.9998557 0.9834135 -0.9834129 0.9998557 0.9834135 -0.9834129 0.9998557 0.9834134 -0.9834129 0.9998557 0.9834134 -0.9834128 0.9998557 0.9834133 -0.9834128 0.9998557 0.9834132 -0.9834127 0.9998557 0.9834131 -0.9834127 0.9998557 0.9834129 -0.9834126 0.9998557 0.9834127 -0.9834125 0.9998557 0.9834125 -0.9834127 0.9998557 0.9834125 -0.9834129 0.9998557 0.9834125 -0.9834132 0.9998557 0.9834125 -0.9834135 0.9998557 0.9834125 -0.983414 0.9998557 0.9834125 -0.9834146 0.9998557 0.9834125 -0.9834153 0.9998557 0.9834125 -0.9834162 0.9998557 0.9834125 -0.9834174 0.9998557 0.9834125 -0.9834188 0.9998557 0.9834125 -0.9834207 0.9998557 0.9834125 -0.983423 0.9998557 0.9834125 -0.983426 0.9998557 0.9834125 -0.9834298 0.9998557 0.9834125 -0.9834345 0.9998557 0.9834125 -0.9834405 0.9998557 0.9834125 -0.9834482 0.9998557 0.9834125 -0.9834578 0.9998557 0.9834125 -0.98347 0.9998557 0.9834125 -0.9834854 0.9998557 0.9834125 -0.9835049 0.9998557 0.9834125 -0.9835296 0.9998557 0.9834125 -0.9835609 0.9998557 0.9834125 -0.9836004 0.9998557 0.9834125 -0.9836504 0.9998557 0.9834125 -0.9837136 0.9998557 0.9834125 -0.9837936 0.9998557 0.9834125 -0.9838948 0.9998557 0.9834125 -0.9840229 0.9998557 0.9834125 -0.9841849 0.9998557 0.9834125 -0.9843899 0.9998557 0.9834125 -0.9846492 0.9998557 0.9834125 -0.9849773 0.9998557 0.9834125 -0.9853924 0.9998557 0.9834125 -0.9859175 0.9998557 0.9834125 -0.9865818 0.9998557 0.9834125 -0.9874223 0.9998557 0.9834125 -0.9884856 0.9998557 0.9834125 -0.9898308 0.9998557 0.9834125 -0.9915326 0.9998557 0.9834125 -0.9936857 0.9998557 0.9834125 -0.9964096 0.9998557 0.9834125 -0.9998557 0.9998557 0.9834125 -0.999886 0.997154 0.9868502 -0.9999099 0.9960345 0.9895818 -0.9999288 0.995789 0.99175 -0.9999437 0.9959966 0.9934694 -0.9868505 0.999886 0.9868509 -0.9868505 0.999886 0.9868508 -0.9868505 0.999886 0.9868508 -0.9868505 0.999886 0.9868508 -0.9868504 0.999886 0.9868507 -0.9868504 0.999886 0.9868507 -0.9868504 0.999886 0.9868506 -0.9868503 0.999886 0.9868505 -0.9868503 0.999886 0.9868504 -0.9868502 0.999886 0.9868502 -0.9868503 0.999886 0.9868502 -0.9868505 0.999886 0.9868502 -0.9868507 0.999886 0.9868502 -0.9868509 0.999886 0.9868502 -0.9868512 0.999886 0.9868502 -0.9868515 0.999886 0.9868502 -0.986852 0.999886 0.9868502 -0.9868525 0.999886 0.9868502 -0.9868533 0.999886 0.9868502 -0.9868542 0.999886 0.9868502 -0.9868554 0.999886 0.9868502 -0.9868568 0.999886 0.9868502 -0.9868587 0.999886 0.9868502 -0.9868611 0.999886 0.9868502 -0.986864 0.999886 0.9868502 -0.9868678 0.999886 0.9868502 -0.9868726 0.999886 0.9868502 -0.9868786 0.999886 0.9868502 -0.9868863 0.999886 0.9868502 -0.9868959 0.999886 0.9868502 -0.9869082 0.999886 0.9868502 -0.9869236 0.999886 0.9868502 -0.9869432 0.999886 0.9868502 -0.986968 0.999886 0.9868502 -0.9869993 0.999886 0.9868502 -0.9870389 0.999886 0.9868502 -0.9870891 0.999886 0.9868502 -0.9871525 0.999886 0.9868502 -0.9872327 0.999886 0.9868502 -0.9873343 0.999886 0.9868502 -0.9874627 0.999886 0.9868502 -0.9876252 0.999886 0.9868502 -0.9878308 0.999886 0.9868502 -0.9880909 0.999886 0.9868502 -0.9884199 0.999886 0.9868502 -0.9888362 0.999886 0.9868502 -0.9893629 0.999886 0.9868502 -0.9900292 0.999886 0.9868502 -0.9908721 0.999886 0.9868502 -0.9919385 0.999886 0.9868502 -0.9932877 0.999886 0.9868502 -0.9949946 0.999886 0.9868502 -0.997154 0.999886 0.9868502 -0.999886 0.999886 0.9868502 -0.9999099 0.9977454 0.9895818 -0.9999288 0.9968599 0.99175 -0.9999437 0.9966667 0.9934694 -0.989582 0.9999099 0.9895822 -0.989582 0.9999099 0.9895822 -0.989582 0.9999099 0.9895822 -0.989582 0.9999099 0.9895822 -0.989582 0.9999099 0.9895821 -0.9895819 0.9999099 0.9895821 -0.9895819 0.9999099 0.9895821 -0.9895819 0.9999099 0.989582 -0.9895819 0.9999099 0.9895819 -0.9895818 0.9999099 0.9895818 -0.9895819 0.9999099 0.9895818 -0.989582 0.9999099 0.9895818 -0.9895821 0.9999099 0.9895818 -0.9895822 0.9999099 0.9895818 -0.9895824 0.9999099 0.9895818 -0.9895826 0.9999099 0.9895818 -0.9895829 0.9999099 0.9895818 -0.9895833 0.9999099 0.9895818 -0.9895837 0.9999099 0.9895818 -0.9895843 0.9999099 0.9895818 -0.989585 0.9999099 0.9895818 -0.989586 0.9999099 0.9895818 -0.9895871 0.9999099 0.9895818 -0.9895886 0.9999099 0.9895818 -0.9895905 0.9999099 0.9895818 -0.9895928 0.9999099 0.9895818 -0.9895958 0.9999099 0.9895818 -0.9895996 0.9999099 0.9895818 -0.9896044 0.9999099 0.9895818 -0.9896105 0.9999099 0.9895818 -0.9896181 0.9999099 0.9895818 -0.9896278 0.9999099 0.9895818 -0.9896401 0.9999099 0.9895818 -0.9896556 0.9999099 0.9895818 -0.9896752 0.9999099 0.9895818 -0.9897 0.9999099 0.9895818 -0.9897314 0.9999099 0.9895818 -0.9897711 0.9999099 0.9895818 -0.9898214 0.9999099 0.9895818 -0.989885 0.9999099 0.9895818 -0.9899654 0.9999099 0.9895818 -0.9900672 0.9999099 0.9895818 -0.9901959 0.9999099 0.9895818 -0.9903588 0.9999099 0.9895818 -0.9905648 0.9999099 0.9895818 -0.9908255 0.9999099 0.9895818 -0.9911554 0.9999099 0.9895818 -0.9915726 0.9999099 0.9895818 -0.9921005 0.9999099 0.9895818 -0.9927684 0.9999099 0.9895818 -0.9936133 0.9999099 0.9895818 -0.9946822 0.9999099 0.9895818 -0.9960345 0.9999099 0.9895818 -0.9977454 0.9999099 0.9895818 -0.9999099 0.9999099 0.9895818 -0.9999288 0.9982147 0.99175 -0.9999437 0.9975144 0.9934694 -0.9917501 0.9999288 0.9917502 -0.9917501 0.9999288 0.9917502 -0.9917501 0.9999288 0.9917502 -0.9917501 0.9999288 0.9917502 -0.9917501 0.9999288 0.9917502 -0.9917501 0.9999288 0.9917502 -0.99175 0.9999288 0.9917501 -0.99175 0.9999288 0.9917501 -0.99175 0.9999288 0.99175 -0.99175 0.9999288 0.99175 -0.99175 0.9999288 0.99175 -0.9917501 0.9999288 0.99175 -0.9917502 0.9999288 0.99175 -0.9917502 0.9999288 0.99175 -0.9917503 0.9999288 0.99175 -0.9917505 0.9999288 0.99175 -0.9917507 0.9999288 0.99175 -0.9917509 0.9999288 0.99175 -0.9917512 0.9999288 0.99175 -0.9917515 0.9999288 0.99175 -0.991752 0.9999288 0.99175 -0.9917526 0.9999288 0.99175 -0.9917533 0.9999288 0.99175 -0.9917542 0.9999288 0.99175 -0.9917554 0.9999288 0.99175 -0.9917569 0.9999288 0.99175 -0.9917587 0.9999288 0.99175 -0.9917611 0.9999288 0.99175 -0.9917641 0.9999288 0.99175 -0.9917679 0.9999288 0.99175 -0.9917727 0.9999288 0.99175 -0.9917788 0.9999288 0.99175 -0.9917864 0.9999288 0.99175 -0.9917961 0.9999288 0.99175 -0.9918084 0.9999288 0.99175 -0.9918239 0.9999288 0.99175 -0.9918436 0.9999288 0.99175 -0.9918685 0.9999288 0.99175 -0.9918999 0.9999288 0.99175 -0.9919397 0.9999288 0.99175 -0.9919901 0.9999288 0.99175 -0.9920538 0.9999288 0.99175 -0.9921344 0.9999288 0.99175 -0.9922363 0.9999288 0.99175 -0.9923653 0.9999288 0.99175 -0.9925285 0.9999288 0.99175 -0.9927349 0.9999288 0.99175 -0.9929961 0.9999288 0.99175 -0.9933265 0.9999288 0.99175 -0.9937446 0.9999288 0.99175 -0.9942734 0.9999288 0.99175 -0.9949425 0.9999288 0.99175 -0.995789 0.9999288 0.99175 -0.9968599 0.9999288 0.99175 -0.9982147 0.9999288 0.99175 -0.9999288 0.9999288 0.99175 -0.9999437 0.9985869 0.9934694 -0.9934695 0.9999437 0.9934696 -0.9934695 0.9999437 0.9934696 -0.9934695 0.9999437 0.9934696 -0.9934695 0.9999437 0.9934696 -0.9934695 0.9999437 0.9934695 -0.9934695 0.9999437 0.9934695 -0.9934695 0.9999437 0.9934695 -0.9934694 0.9999437 0.9934695 -0.9934694 0.9999437 0.9934695 -0.9934694 0.9999437 0.9934694 -0.9934694 0.9999437 0.9934694 -0.9934695 0.9999437 0.9934694 -0.9934695 0.9999437 0.9934694 -0.9934696 0.9999437 0.9934694 -0.9934696 0.9999437 0.9934694 -0.9934697 0.9999437 0.9934694 -0.9934698 0.9999437 0.9934694 -0.99347 0.9999437 0.9934694 -0.9934702 0.9999437 0.9934694 -0.9934704 0.9999437 0.9934694 -0.9934707 0.9999437 0.9934694 -0.993471 0.9999437 0.9934694 -0.9934715 0.9999437 0.9934694 -0.9934721 0.9999437 0.9934694 -0.9934728 0.9999437 0.9934694 -0.9934737 0.9999437 0.9934694 -0.9934749 0.9999437 0.9934694 -0.9934764 0.9999437 0.9934694 -0.9934783 0.9999437 0.9934694 -0.9934806 0.9999437 0.9934694 -0.9934836 0.9999437 0.9934694 -0.9934874 0.9999437 0.9934694 -0.9934922 0.9999437 0.9934694 -0.9934983 0.9999437 0.9934694 -0.993506 0.9999437 0.9934694 -0.9935157 0.9999437 0.9934694 -0.993528 0.9999437 0.9934694 -0.9935436 0.9999437 0.9934694 -0.9935632 0.9999437 0.9934694 -0.9935881 0.9999437 0.9934694 -0.9936196 0.9999437 0.9934694 -0.9936595 0.9999437 0.9934694 -0.9937099 0.9999437 0.9934694 -0.9937737 0.9999437 0.9934694 -0.9938544 0.9999437 0.9934694 -0.9939565 0.9999437 0.9934694 -0.9940857 0.9999437 0.9934694 -0.9942491 0.9999437 0.9934694 -0.9944559 0.9999437 0.9934694 -0.9947174 0.9999437 0.9934694 -0.9950483 0.9999437 0.9934694 -0.995467 0.9999437 0.9934694 -0.9959966 0.9999437 0.9934694 -0.9966667 0.9999437 0.9934694 -0.9975144 0.9999437 0.9934694 -0.9985869 0.9999437 0.9934694 -0.9999437 0.9999437 0.9934694 -0.0000238 0.0000238 0.0185862 -0.0005417 0.0000238 0.0185862 -0.0011968 0.0000238 0.0185862 -0.0020256 0.0000238 0.0185862 -0.0030742 0.0000238 0.0185862 -0.0044007 0.0000238 0.0185862 -0.006079 0.0000238 0.0185862 -0.0082023 0.0000238 0.0185862 -0.0108885 0.0000238 0.0185862 -0.0142868 0.0000238 0.0185862 -0.0185862 0.0000238 0.0185862 -0.0240255 0.0000238 0.0185862 -0.0309069 0.0000238 0.0185862 -0.0396127 0.0000238 0.0185862 -0.0506267 0.0000238 0.0185862 -0.0645609 0.0000238 0.0185862 -0.0821895 0.0000238 0.0185862 -0.1044919 0.0000238 0.0185862 -0.1327073 0.0000238 0.0185862 -0.1684036 0.0000238 0.0185862 -0.2135639 0.0000238 0.0185862 -0.2706977 0.0000238 0.0185862 -0.3429792 0.0000238 0.0185862 -0.4344249 0.0000238 0.0185862 -0.5501155 0.0000238 0.0185862 -0.6964791 0.0000238 0.0185862 -0.8407292 0.0051514 0.0227443 -0.9033413 0.0279321 0.0424942 -0.9354466 0.0624569 0.0739313 -0.9545467 0.1059991 0.1148123 -0.9669269 0.1572498 0.1638954 -0.9754027 0.2151269 0.2200584 -0.9814251 0.2783684 0.2819726 -0.9858181 0.3454107 0.3480054 -0.9890841 0.4144197 0.4162599 -0.9915469 0.4834235 0.4847095 -0.993424 0.5504963 0.5513823 -0.9948662 0.6139459 0.6145482 -0.9959813 0.6724572 0.6728615 -0.9968475 0.7251659 0.7254343 -0.997523 0.7716588 0.7718352 -0.9980513 0.8119154 0.8120303 -0.9984653 0.8462171 0.8462913 -0.9987905 0.8750477 0.8750954 -0.9990461 0.8990028 0.8990333 -0.9992474 0.9187175 0.9187369 -0.999406 0.9348153 0.9348276 -0.999531 0.9478754 0.9478832 -0.9996296 0.958416 0.9584209 -0.9997074 0.9668873 0.9668904 -0.9997689 0.9736726 0.9736746 -0.9998174 0.9790927 0.9790939 -0.9998557 0.9834129 0.9834137 -0.999886 0.9868505 0.986851 -0.9999099 0.989582 0.9895823 -0.9999288 0.9917501 0.9917503 -0.9999437 0.9934695 0.9934696 -0.0000238 0.0005417 0.0185862 -0.0000382 0.0000382 0.0180827 -0.0006933 0.0000382 0.0180827 -0.0015221 0.0000382 0.0180827 -0.0025707 0.0000382 0.0180827 -0.0038972 0.0000382 0.0180827 -0.0055755 0.0000382 0.0180827 -0.0076988 0.0000382 0.0180827 -0.0103849 0.0000382 0.0180827 -0.0137833 0.0000382 0.0180827 -0.0180827 0.0000382 0.0180827 -0.023522 0.0000382 0.0180827 -0.0304033 0.0000382 0.0180827 -0.0391092 0.0000382 0.0180827 -0.0501232 0.0000382 0.0180827 -0.0640574 0.0000382 0.0180827 -0.081686 0.0000382 0.0180827 -0.1039884 0.0000382 0.0180827 -0.1322038 0.0000382 0.0180827 -0.1679 0.0000382 0.0180827 -0.2130604 0.0000382 0.0180827 -0.2701941 0.0000382 0.0180827 -0.3424757 0.0000382 0.0180827 -0.4339214 0.0000382 0.0180827 -0.549612 0.0000382 0.0180827 -0.6959756 0.0000382 0.0180827 -0.8405071 0.0051286 0.0222366 -0.9032596 0.0278872 0.042049 -0.9354101 0.0624063 0.0735648 -0.9545286 0.1059489 0.1145191 -0.9669173 0.1572031 0.1636651 -0.9753975 0.2150852 0.2198803 -0.9814221 0.2783325 0.2818368 -0.9858163 0.3453807 0.3479034 -0.9890831 0.4143955 0.4161847 -0.9915463 0.4834045 0.4846548 -0.9934236 0.5504818 0.5513433 -0.994866 0.6139352 0.6145207 -0.9959811 0.6724495 0.6728425 -0.9968474 0.7251605 0.7254214 -0.997523 0.7716551 0.7718265 -0.9980512 0.8119128 0.8120245 -0.9984653 0.8462154 0.8462876 -0.9987905 0.8750466 0.8750929 -0.9990461 0.899002 0.8990317 -0.9992474 0.918717 0.9187359 -0.999406 0.9348149 0.9348269 -0.999531 0.9478752 0.9478828 -0.9996296 0.9584159 0.9584206 -0.9997074 0.9668872 0.9668902 -0.9997689 0.9736726 0.9736745 -0.9998174 0.9790927 0.9790939 -0.9998557 0.9834129 0.9834137 -0.999886 0.9868505 0.986851 -0.9999099 0.989582 0.9895823 -0.9999288 0.9917501 0.9917503 -0.9999437 0.9934695 0.9934696 -0.0000238 0.0011968 0.0185862 -0.0000382 0.0006933 0.0180827 -0.0000611 0.0000611 0.0174505 -0.0008899 0.0000611 0.0174505 -0.0019385 0.0000611 0.0174505 -0.003265 0.0000611 0.0174505 -0.0049433 0.0000611 0.0174505 -0.0070666 0.0000611 0.0174505 -0.0097527 0.0000611 0.0174505 -0.0131511 0.0000611 0.0174505 -0.0174505 0.0000611 0.0174505 -0.0228898 0.0000611 0.0174505 -0.0297711 0.0000611 0.0174505 -0.038477 0.0000611 0.0174505 -0.049491 0.0000611 0.0174505 -0.0634252 0.0000611 0.0174505 -0.0810538 0.0000611 0.0174505 -0.1033562 0.0000611 0.0174505 -0.1315716 0.0000611 0.0174505 -0.1672678 0.0000611 0.0174505 -0.2124282 0.0000611 0.0174505 -0.2695619 0.0000611 0.0174505 -0.3418435 0.0000611 0.0174505 -0.4332891 0.0000611 0.0174505 -0.5489798 0.0000611 0.0174505 -0.6953434 0.0000611 0.0174505 -0.8402274 0.0051047 0.0215989 -0.9031567 0.0278347 0.0414896 -0.9353643 0.0623458 0.0731043 -0.9545059 0.1058883 0.1141507 -0.9669053 0.1571463 0.1633758 -0.9753908 0.2150342 0.2196565 -0.9814183 0.2782884 0.2816663 -0.9858141 0.3453439 0.3477754 -0.9890818 0.4143657 0.4160901 -0.9915455 0.4833811 0.4845861 -0.9934231 0.550464 0.5512942 -0.9948657 0.6139219 0.6144862 -0.9959809 0.6724399 0.6728187 -0.9968473 0.7251537 0.7254052 -0.9975229 0.7716504 0.7718156 -0.9980512 0.8119096 0.8120173 -0.9984653 0.8462132 0.8462828 -0.9987904 0.8750451 0.8750898 -0.9990461 0.8990011 0.8990297 -0.9992474 0.9187164 0.9187346 -0.999406 0.9348146 0.9348261 -0.999531 0.947875 0.9478822 -0.9996296 0.9584157 0.9584203 -0.9997074 0.9668871 0.96689 -0.9997689 0.9736725 0.9736743 -0.9998174 0.9790927 0.9790938 -0.9998557 0.9834129 0.9834136 -0.999886 0.9868505 0.9868509 -0.9999099 0.989582 0.9895823 -0.9999288 0.9917501 0.9917503 -0.9999437 0.9934695 0.9934696 -0.0000238 0.0020256 0.0185862 -0.0000382 0.0015221 0.0180827 -0.0000611 0.0008899 0.0174505 -0.0000978 0.0000978 0.0166583 -0.0011463 0.0000978 0.0166583 -0.0024729 0.0000978 0.0166583 -0.0041512 0.0000978 0.0166583 -0.0062744 0.0000978 0.0166583 -0.0089606 0.0000978 0.0166583 -0.012359 0.0000978 0.0166583 -0.0166583 0.0000978 0.0166583 -0.0220976 0.0000978 0.0166583 -0.028979 0.0000978 0.0166583 -0.0376849 0.0000978 0.0166583 -0.0486989 0.0000978 0.0166583 -0.0626331 0.0000978 0.0166583 -0.0802616 0.0000978 0.0166583 -0.102564 0.0000978 0.0166583 -0.1307795 0.0000978 0.0166583 -0.1664757 0.0000978 0.0166583 -0.2116361 0.0000978 0.0166583 -0.2687698 0.0000978 0.0166583 -0.3410514 0.0000978 0.0166583 -0.432497 0.0000978 0.0166583 -0.5481876 0.0000978 0.0166583 -0.6945513 0.0000978 0.0166583 -0.8398756 0.0050826 0.0207992 -0.9030276 0.0277752 0.0407879 -0.9353068 0.0622749 0.0725268 -0.9544774 0.1058162 0.1136888 -0.9668902 0.1570779 0.1630131 -0.9753825 0.2149725 0.219376 -0.9814136 0.2782347 0.2814525 -0.9858113 0.3452987 0.347615 -0.9890801 0.414329 0.4159716 -0.9915446 0.4833522 0.4845 -0.9934225 0.5504419 0.5512327 -0.9948653 0.6139056 0.6144431 -0.9959807 0.672428 0.6727888 -0.9968472 0.7251454 0.7253848 -0.9975228 0.7716446 0.7718019 -0.9980511 0.8119057 0.8120082 -0.9984653 0.8462106 0.8462768 -0.9987904 0.8750434 0.875086 -0.9990461 0.899 0.8990272 -0.9992474 0.9187157 0.918733 -0.999406 0.9348141 0.9348251 -0.999531 0.9478746 0.9478816 -0.9996296 0.9584155 0.9584199 -0.9997074 0.966887 0.9668898 -0.9997689 0.9736724 0.9736742 -0.9998174 0.9790926 0.9790937 -0.9998557 0.9834129 0.9834135 -0.999886 0.9868505 0.9868509 -0.9999099 0.989582 0.9895822 -0.9999288 0.9917501 0.9917502 -0.9999437 0.9934695 0.9934696 -0.0000238 0.0030742 0.0185862 -0.0000382 0.0025707 0.0180827 -0.0000611 0.0019385 0.0174505 -0.0000978 0.0011463 0.0166583 -0.0001565 0.0001565 0.0156685 -0.001483 0.0001565 0.0156685 -0.0031613 0.0001565 0.0156685 -0.0052846 0.0001565 0.0156685 -0.0079707 0.0001565 0.0156685 -0.0113691 0.0001565 0.0156685 -0.0156685 0.0001565 0.0156685 -0.0211078 0.0001565 0.0156685 -0.0279891 0.0001565 0.0156685 -0.036695 0.0001565 0.0156685 -0.047709 0.0001565 0.0156685 -0.0616432 0.0001565 0.0156685 -0.0792718 0.0001565 0.0156685 -0.1015742 0.0001565 0.0156685 -0.1297896 0.0001565 0.0156685 -0.1654858 0.0001565 0.0156685 -0.2106462 0.0001565 0.0156685 -0.2677799 0.0001565 0.0156685 -0.3400615 0.0001565 0.0156685 -0.4315072 0.0001565 0.0156685 -0.5471978 0.0001565 0.0156685 -0.6935614 0.0001565 0.0156685 -0.8394338 0.0050676 0.0197991 -0.9028657 0.0277111 0.03991 -0.9352348 0.0621943 0.0718043 -0.9544418 0.1057322 0.1131111 -0.9668714 0.1569971 0.1625595 -0.9753721 0.2148987 0.2190253 -0.9814076 0.2781701 0.2811853 -0.9858079 0.3452442 0.3474144 -0.9890781 0.4142845 0.4158235 -0.9915433 0.4833171 0.4843924 -0.9934218 0.550415 0.5511558 -0.9948649 0.6138855 0.6143891 -0.9959804 0.6724135 0.6727515 -0.996847 0.7251351 0.7253594 -0.9975227 0.7716375 0.7717849 -0.9980511 0.8119009 0.8119969 -0.9984652 0.8462073 0.8462694 -0.9987904 0.8750412 0.8750811 -0.9990461 0.8989986 0.8990241 -0.9992474 0.9187148 0.918731 -0.999406 0.9348135 0.9348238 -0.999531 0.9478743 0.9478808 -0.9996296 0.9584153 0.9584194 -0.9997074 0.9668869 0.9668894 -0.9997689 0.9736723 0.973674 -0.9998174 0.9790925 0.9790936 -0.9998557 0.9834128 0.9834135 -0.999886 0.9868504 0.9868508 -0.9999099 0.989582 0.9895822 -0.9999288 0.9917501 0.9917502 -0.9999437 0.9934695 0.9934696 -0.0000238 0.0044007 0.0185862 -0.0000382 0.0038972 0.0180827 -0.0000611 0.003265 0.0174505 -0.0000978 0.0024729 0.0166583 -0.0001565 0.001483 0.0156685 -0.0002504 0.0002504 0.0144359 -0.0019287 0.0002504 0.0144359 -0.004052 0.0002504 0.0144359 -0.0067381 0.0002504 0.0144359 -0.0101365 0.0002504 0.0144359 -0.0144359 0.0002504 0.0144359 -0.0198752 0.0002504 0.0144359 -0.0267565 0.0002504 0.0144359 -0.0354624 0.0002504 0.0144359 -0.0464764 0.0002504 0.0144359 -0.0604106 0.0002504 0.0144359 -0.0780392 0.0002504 0.0144359 -0.1003416 0.0002504 0.0144359 -0.128557 0.0002504 0.0144359 -0.1642532 0.0002504 0.0144359 -0.2094136 0.0002504 0.0144359 -0.2665473 0.0002504 0.0144359 -0.3388289 0.0002504 0.0144359 -0.4302746 0.0002504 0.0144359 -0.5459652 0.0002504 0.0144359 -0.6923288 0.0002504 0.0144359 -0.8388802 0.0050694 0.0185525 -0.9026634 0.0276479 0.0388151 -0.9351449 0.0621069 0.0709034 -0.9543974 0.1056375 0.1123908 -0.9668479 0.156904 0.1619942 -0.9753591 0.2148124 0.2185882 -0.9814002 0.2780936 0.2808523 -0.9858036 0.3451791 0.3471646 -0.9890755 0.4142311 0.4156389 -0.9915418 0.4832747 0.4842584 -0.9934209 0.5503825 0.5510601 -0.9948643 0.6138613 0.6143218 -0.9959801 0.6723959 0.672705 -0.9968468 0.7251226 0.7253278 -0.9975226 0.7716288 0.7717636 -0.998051 0.8118949 0.8119828 -0.9984652 0.8462034 0.8462601 -0.9987904 0.8750386 0.8750751 -0.9990461 0.8989969 0.8990202 -0.9992474 0.9187137 0.9187285 -0.9994059 0.9348128 0.9348222 -0.999531 0.9478738 0.9478798 -0.9996296 0.958415 0.9584187 -0.9997074 0.9668867 0.966889 -0.9997689 0.9736722 0.9736737 -0.9998174 0.9790925 0.9790934 -0.9998557 0.9834128 0.9834134 -0.999886 0.9868504 0.9868508 -0.9999099 0.9895819 0.9895822 -0.9999288 0.9917501 0.9917502 -0.9999437 0.9934695 0.9934696 -0.0000238 0.006079 0.0185862 -0.0000382 0.0055755 0.0180827 -0.0000611 0.0049433 0.0174505 -0.0000978 0.0041512 0.0166583 -0.0001565 0.0031613 0.0156685 -0.0002504 0.0019287 0.0144359 -0.0004008 0.0004008 0.012908 -0.0025241 0.0004008 0.012908 -0.0052103 0.0004008 0.012908 -0.0086086 0.0004008 0.012908 -0.012908 0.0004008 0.012908 -0.0183473 0.0004008 0.012908 -0.0252287 0.0004008 0.012908 -0.0339345 0.0004008 0.012908 -0.0449485 0.0004008 0.012908 -0.0588827 0.0004008 0.012908 -0.0765113 0.0004008 0.012908 -0.0988137 0.0004008 0.012908 -0.1270291 0.0004008 0.012908 -0.1627254 0.0004008 0.012908 -0.2078857 0.0004008 0.012908 -0.2650195 0.0004008 0.012908 -0.337301 0.0004008 0.012908 -0.4287467 0.0004008 0.012908 -0.5444373 0.0004008 0.012908 -0.6908009 0.0004008 0.012908 -0.8381886 0.0051048 0.0170051 -0.9024114 0.0275966 0.0374553 -0.9350332 0.0620199 0.0697847 -0.9543421 0.1055364 0.1114966 -0.9668187 0.1568008 0.1612925 -0.975343 0.2147144 0.2180458 -0.9813911 0.2780055 0.2804391 -0.9857982 0.3451032 0.3468546 -0.9890723 0.4141683 0.41541 -0.9915399 0.4832246 0.4840922 -0.9934197 0.5503438 0.5509414 -0.9948636 0.6138323 0.6142384 -0.9959797 0.6723748 0.6726474 -0.9968465 0.7251076 0.7252885 -0.9975224 0.7716184 0.7717373 -0.9980509 0.8118878 0.8119653 -0.9984651 0.8461986 0.8462487 -0.9987903 0.8750355 0.8750676 -0.9990461 0.8989948 0.8990153 -0.9992473 0.9187123 0.9187254 -0.9994059 0.9348119 0.9348202 -0.999531 0.9478733 0.9478785 -0.9996296 0.9584146 0.9584179 -0.9997074 0.9668865 0.9668885 -0.9997689 0.9736721 0.9736734 -0.9998174 0.9790924 0.9790932 -0.9998557 0.9834127 0.9834132 -0.999886 0.9868504 0.9868507 -0.9999099 0.9895819 0.9895821 -0.9999288 0.99175 0.9917502 -0.9999437 0.9934695 0.9934695 -0.0000238 0.0082023 0.0185862 -0.0000382 0.0076988 0.0180827 -0.0000611 0.0070666 0.0174505 -0.0000978 0.0062744 0.0166583 -0.0001565 0.0052846 0.0156685 -0.0002504 0.004052 0.0144359 -0.0004008 0.0025241 0.012908 -0.0006416 0.0006416 0.0110255 -0.0033277 0.0006416 0.0110255 -0.0067261 0.0006416 0.0110255 -0.0110255 0.0006416 0.0110255 -0.0164648 0.0006416 0.0110255 -0.0233461 0.0006416 0.0110255 -0.032052 0.0006416 0.0110255 -0.043066 0.0006416 0.0110255 -0.0570002 0.0006416 0.0110255 -0.0746288 0.0006416 0.0110255 -0.0969312 0.0006416 0.0110255 -0.1251466 0.0006416 0.0110255 -0.1608428 0.0006416 0.0110255 -0.2060032 0.0006416 0.0110255 -0.2631369 0.0006416 0.0110255 -0.3354185 0.0006416 0.0110255 -0.4268641 0.0006416 0.0110255 -0.5425548 0.0006416 0.0110255 -0.6889184 0.0006416 0.0110255 -0.8373283 0.0052028 0.0150955 -0.9020992 0.0275778 0.0357758 -0.9348949 0.0619473 0.0684033 -0.9542739 0.1054384 0.1103929 -0.9667827 0.1566936 0.1604266 -0.9753231 0.2146085 0.2173767 -0.9813797 0.2779077 0.2799296 -0.9857916 0.3450175 0.3464724 -0.9890684 0.4140964 0.4151278 -0.9915376 0.4831666 0.4838872 -0.9934183 0.5502987 0.5507951 -0.9948628 0.6137984 0.6141357 -0.9959791 0.67235 0.6725764 -0.9968462 0.7250899 0.7252402 -0.9975222 0.7716061 0.7717048 -0.9980508 0.8118794 0.8119437 -0.998465 0.8461929 0.8462345 -0.9987903 0.8750317 0.8750584 -0.999046 0.8989923 0.8990094 -0.9992473 0.9187107 0.9187216 -0.9994059 0.9348109 0.9348178 -0.999531 0.9478726 0.947877 -0.9996296 0.9584142 0.9584169 -0.9997074 0.9668862 0.9668879 -0.9997689 0.9736719 0.973673 -0.9998174 0.9790923 0.979093 -0.9998557 0.9834127 0.9834131 -0.999886 0.9868503 0.9868506 -0.9999099 0.9895819 0.9895821 -0.9999288 0.99175 0.9917501 -0.9999437 0.9934694 0.9934695 -0.0000238 0.0108885 0.0185862 -0.0000382 0.0103849 0.0180827 -0.0000611 0.0097527 0.0174505 -0.0000978 0.0089606 0.0166583 -0.0001565 0.0079707 0.0156685 -0.0002504 0.0067381 0.0144359 -0.0004008 0.0052103 0.012908 -0.0006416 0.0033277 0.0110255 -0.0010268 0.0010268 0.0087246 -0.0044252 0.0010268 0.0087246 -0.0087246 0.0010268 0.0087246 -0.0141639 0.0010268 0.0087246 -0.0210452 0.0010268 0.0087246 -0.0297511 0.0010268 0.0087246 -0.0407651 0.0010268 0.0087246 -0.0546993 0.0010268 0.0087246 -0.0723279 0.0010268 0.0087246 -0.0946303 0.0010268 0.0087246 -0.1228457 0.0010268 0.0087246 -0.1585419 0.0010268 0.0087246 -0.2037023 0.0010268 0.0087246 -0.260836 0.0010268 0.0087246 -0.3331176 0.0010268 0.0087246 -0.4245633 0.0010268 0.0087246 -0.5402539 0.0010268 0.0087246 -0.6866175 0.0010268 0.0087246 -0.8362644 0.0054121 0.012757 -0.9017148 0.0276281 0.0337171 -0.9347252 0.061916 0.0667103 -0.9541902 0.1053624 0.1090407 -0.9667385 0.1565954 0.1593662 -0.9752987 0.2145034 0.2165577 -0.9813659 0.2778058 0.279306 -0.9857835 0.3449254 0.3460047 -0.9890637 0.4140176 0.4147826 -0.9915347 0.4831021 0.4836366 -0.9934166 0.550248 0.5506161 -0.9948617 0.6137599 0.61401 -0.9959785 0.6723217 0.6724896 -0.9968458 0.7250697 0.7251811 -0.997522 0.7715919 0.7716651 -0.9980506 0.8118697 0.8119174 -0.9984649 0.8461864 0.8462172 -0.9987902 0.8750274 0.8750472 -0.999046 0.8989895 0.8990021 -0.9992473 0.9187089 0.9187169 -0.9994059 0.9348097 0.9348148 -0.999531 0.9478718 0.9478751 -0.9996296 0.9584137 0.9584157 -0.9997074 0.9668859 0.9668872 -0.9997689 0.9736717 0.9736725 -0.9998174 0.9790921 0.9790927 -0.9998557 0.9834126 0.9834129 -0.999886 0.9868503 0.9868505 -0.9999099 0.9895819 0.989582 -0.9999288 0.99175 0.9917501 -0.9999437 0.9934694 0.9934695 -0.0000238 0.0142868 0.0185862 -0.0000382 0.0137833 0.0180827 -0.0000611 0.0131511 0.0174505 -0.0000978 0.012359 0.0166583 -0.0001565 0.0113691 0.0156685 -0.0002504 0.0101365 0.0144359 -0.0004008 0.0086086 0.012908 -0.0006416 0.0067261 0.0110255 -0.0010268 0.0044252 0.0087246 -0.0016435 0.0016435 0.0059429 -0.0059429 0.0016435 0.0059429 -0.0113822 0.0016435 0.0059429 -0.0182636 0.0016435 0.0059429 -0.0269694 0.0016435 0.0059429 -0.0379834 0.0016435 0.0059429 -0.0519176 0.0016435 0.0059429 -0.0695462 0.0016435 0.0059429 -0.0918486 0.0016435 0.0059429 -0.120064 0.0016435 0.0059429 -0.1557603 0.0016435 0.0059429 -0.2009206 0.0016435 0.0059429 -0.2580543 0.0016435 0.0059429 -0.3303359 0.0016435 0.0059429 -0.4217816 0.0016435 0.0059429 -0.5374722 0.0016435 0.0059429 -0.6838358 0.0016435 0.0059429 -0.8349593 0.0058134 0.0099234 -0.9012461 0.0278105 0.0312193 -0.9345187 0.0619734 0.0646568 -0.9540886 0.1053433 0.1074015 -0.966685 0.1565315 0.1580814 -0.9752692 0.2144168 0.2155656 -0.9813491 0.2777122 0.278551 -0.9857738 0.3448353 0.3454387 -0.9890579 0.4139373 0.4143649 -0.9915312 0.4830346 0.4833333 -0.9934145 0.5501939 0.5503996 -0.9948604 0.6137183 0.613858 -0.9959777 0.6722907 0.6723845 -0.9968453 0.7250473 0.7251096 -0.9975217 0.7715762 0.7716171 -0.9980504 0.8118589 0.8118855 -0.9984648 0.8461791 0.8461963 -0.9987902 0.8750225 0.8750335 -0.9990459 0.8989863 0.8989933 -0.9992473 0.9187068 0.9187113 -0.9994059 0.9348083 0.9348112 -0.9995309 0.947871 0.9478728 -0.9996296 0.9584132 0.9584143 -0.9997074 0.9668855 0.9668862 -0.9997689 0.9736715 0.9736719 -0.9998174 0.979092 0.9790923 -0.9998557 0.9834125 0.9834127 -0.999886 0.9868502 0.9868503 -0.9999099 0.9895818 0.9895819 -0.9999288 0.99175 0.99175 -0.9999437 0.9934694 0.9934694 -0.0000238 0.0185862 0.0185862 -0.0000382 0.0180827 0.0180827 -0.0000611 0.0174505 0.0174505 -0.0000978 0.0166583 0.0166583 -0.0001565 0.0156685 0.0156685 -0.0002504 0.0144359 0.0144359 -0.0004008 0.012908 0.012908 -0.0006416 0.0110255 0.0110255 -0.0010268 0.0087246 0.0087246 -0.0016435 0.0059429 0.0059429 -0.0026305 0.0026305 0.0026305 -0.0080698 0.0026305 0.0026305 -0.0149512 0.0026305 0.0026305 -0.023657 0.0026305 0.0026305 -0.0346711 0.0026305 0.0026305 -0.0486053 0.0026305 0.0026305 -0.0662338 0.0026305 0.0026305 -0.0885362 0.0026305 0.0026305 -0.1167517 0.0026305 0.0026305 -0.1524479 0.0026305 0.0026305 -0.1976083 0.0026305 0.0026305 -0.254742 0.0026305 0.0026305 -0.3270236 0.0026305 0.0026305 -0.4184692 0.0026305 0.0026305 -0.5341598 0.0026305 0.0026305 -0.6805235 0.0026305 0.0026305 -0.8333779 0.0065402 0.0065402 -0.900682 0.0282324 0.0282324 -0.9342712 0.062202 0.062202 -0.9539671 0.1054431 0.1054431 -0.9666211 0.1565473 0.1565473 -0.975234 0.2143816 0.2143816 -0.9813291 0.2776503 0.2776503 -0.9857621 0.3447636 0.3447636 -0.989051 0.4138668 0.4138668 -0.9915271 0.4829718 0.4829718 -0.993412 0.5501416 0.5501416 -0.9948589 0.6136769 0.6136769 -0.9959768 0.6722594 0.6722594 -0.9968448 0.7250244 0.7250244 -0.9975213 0.7715599 0.7715599 -0.9980502 0.8118476 0.8118476 -0.9984647 0.8461714 0.8461714 -0.9987901 0.8750173 0.8750173 -0.9990459 0.8989829 0.8989829 -0.9992472 0.9187045 0.9187045 -0.9994059 0.9348069 0.9348069 -0.9995309 0.94787 0.94787 -0.9996296 0.9584126 0.9584126 -0.9997074 0.9668852 0.9668852 -0.9997689 0.9736712 0.9736712 -0.9998174 0.9790919 0.9790919 -0.9998557 0.9834124 0.9834124 -0.999886 0.9868502 0.9868502 -0.9999099 0.9895818 0.9895818 -0.9999288 0.99175 0.99175 -0.9999437 0.9934694 0.9934694 -0.0000238 0.0240255 0.0185862 -0.0000382 0.023522 0.0180827 -0.0000611 0.0228898 0.0174505 -0.0000978 0.0220976 0.0166583 -0.0001565 0.0211078 0.0156685 -0.0002504 0.0198752 0.0144359 -0.0004008 0.0183473 0.012908 -0.0006416 0.0164648 0.0110255 -0.0010268 0.0141639 0.0087246 -0.0016435 0.0113822 0.0059429 -0.0026305 0.0080698 0.0026305 -0.0080698 0.0080698 0.0026305 -0.0149512 0.0080698 0.0026305 -0.023657 0.0080698 0.0026305 -0.0346711 0.0080698 0.0026305 -0.0486053 0.0080698 0.0026305 -0.0662338 0.0080698 0.0026305 -0.0885362 0.0080698 0.0026305 -0.1167517 0.0080698 0.0026305 -0.1524479 0.0080698 0.0026305 -0.1976083 0.0080698 0.0026305 -0.254742 0.0080698 0.0026305 -0.3270236 0.0080698 0.0026305 -0.4184692 0.0080698 0.0026305 -0.5341598 0.0080698 0.0026305 -0.6805235 0.0080698 0.0026305 -0.8333779 0.0117512 0.0065402 -0.900682 0.032557 0.0282324 -0.9342712 0.0656055 0.062202 -0.9539671 0.1080526 0.1054431 -0.9666211 0.1585117 0.1565473 -0.975234 0.2158372 0.2143816 -0.9813291 0.2787128 0.2776503 -0.9857621 0.3455277 0.3447636 -0.989051 0.4144083 0.4138668 -0.9915271 0.48335 0.4829718 -0.993412 0.550402 0.5501416 -0.9948589 0.6138538 0.6136769 -0.9959768 0.6723781 0.6722594 -0.9968448 0.7251031 0.7250244 -0.9975213 0.7716116 0.7715599 -0.9980502 0.8118813 0.8118476 -0.9984647 0.8461932 0.8461714 -0.9987901 0.8750313 0.8750173 -0.9990459 0.8989918 0.8989829 -0.9992472 0.9187102 0.9187045 -0.9994059 0.9348105 0.9348069 -0.9995309 0.9478723 0.94787 -0.9996296 0.958414 0.9584126 -0.9997074 0.9668861 0.9668852 -0.9997689 0.9736718 0.9736712 -0.9998174 0.9790922 0.9790919 -0.9998557 0.9834126 0.9834124 -0.999886 0.9868503 0.9868502 -0.9999099 0.9895819 0.9895818 -0.9999288 0.99175 0.99175 -0.9999437 0.9934694 0.9934694 -0.0000238 0.0309069 0.0185862 -0.0000382 0.0304033 0.0180827 -0.0000611 0.0297711 0.0174505 -0.0000978 0.028979 0.0166583 -0.0001565 0.0279891 0.0156685 -0.0002504 0.0267565 0.0144359 -0.0004008 0.0252287 0.012908 -0.0006416 0.0233461 0.0110255 -0.0010268 0.0210452 0.0087246 -0.0016435 0.0182636 0.0059429 -0.0026305 0.0149512 0.0026305 -0.0080698 0.0149512 0.0026305 -0.0149512 0.0149512 0.0026305 -0.023657 0.0149512 0.0026305 -0.0346711 0.0149512 0.0026305 -0.0486053 0.0149512 0.0026305 -0.0662338 0.0149512 0.0026305 -0.0885362 0.0149512 0.0026305 -0.1167517 0.0149512 0.0026305 -0.1524479 0.0149512 0.0026305 -0.1976083 0.0149512 0.0026305 -0.254742 0.0149512 0.0026305 -0.3270236 0.0149512 0.0026305 -0.4184692 0.0149512 0.0026305 -0.5341598 0.0149512 0.0026305 -0.6805235 0.0149512 0.0026305 -0.8333779 0.0183437 0.0065402 -0.900682 0.0380282 0.0282324 -0.9342712 0.0699113 0.062202 -0.9539671 0.111354 0.1054431 -0.9666211 0.160997 0.1565473 -0.975234 0.2176788 0.2143816 -0.9813291 0.280057 0.2776503 -0.9857621 0.3464944 0.3447636 -0.989051 0.4150933 0.4138668 -0.9915271 0.4838283 0.4829718 -0.993412 0.5507314 0.5501416 -0.9948589 0.6140776 0.6136769 -0.9959768 0.6725283 0.6722594 -0.9968448 0.7252028 0.7250244 -0.9975213 0.7716771 0.7715599 -0.9980502 0.8119239 0.8118476 -0.9984647 0.8462207 0.8461714 -0.9987901 0.875049 0.8750173 -0.9990459 0.8990031 0.8989829 -0.9992472 0.9187174 0.9187045 -0.9994059 0.9348151 0.9348069 -0.9995309 0.9478752 0.94787 -0.9996296 0.9584158 0.9584126 -0.9997074 0.9668872 0.9668852 -0.9997689 0.9736725 0.9736712 -0.9998174 0.9790927 0.9790919 -0.9998557 0.9834129 0.9834124 -0.999886 0.9868505 0.9868502 -0.9999099 0.989582 0.9895818 -0.9999288 0.9917501 0.99175 -0.9999437 0.9934695 0.9934694 -0.0000238 0.0396127 0.0185862 -0.0000382 0.0391092 0.0180827 -0.0000611 0.038477 0.0174505 -0.0000978 0.0376849 0.0166583 -0.0001565 0.036695 0.0156685 -0.0002504 0.0354624 0.0144359 -0.0004008 0.0339345 0.012908 -0.0006416 0.032052 0.0110255 -0.0010268 0.0297511 0.0087246 -0.0016435 0.0269694 0.0059429 -0.0026305 0.023657 0.0026305 -0.0080698 0.023657 0.0026305 -0.0149512 0.023657 0.0026305 -0.023657 0.023657 0.0026305 -0.0346711 0.023657 0.0026305 -0.0486053 0.023657 0.0026305 -0.0662338 0.023657 0.0026305 -0.0885362 0.023657 0.0026305 -0.1167517 0.023657 0.0026305 -0.1524479 0.023657 0.0026305 -0.1976083 0.023657 0.0026305 -0.254742 0.023657 0.0026305 -0.3270236 0.023657 0.0026305 -0.4184692 0.023657 0.0026305 -0.5341598 0.023657 0.0026305 -0.6805235 0.023657 0.0026305 -0.8333779 0.0266842 0.0065402 -0.900682 0.0449499 0.0282324 -0.9342712 0.0753587 0.062202 -0.9539671 0.1155307 0.1054431 -0.9666211 0.1641411 0.1565473 -0.975234 0.2200085 0.2143816 -0.9813291 0.2817576 0.2776503 -0.9857621 0.3477174 0.3447636 -0.989051 0.4159599 0.4138668 -0.9915271 0.4844335 0.4829718 -0.993412 0.5511481 0.5501416 -0.9948589 0.6143607 0.6136769 -0.9959768 0.6727182 0.6722594 -0.9968448 0.7253288 0.7250244 -0.9975213 0.7717599 0.7715599 -0.9980502 0.8119778 0.8118476 -0.9984647 0.8462556 0.8461714 -0.9987901 0.8750714 0.8750173 -0.9990459 0.8990174 0.8989829 -0.9992472 0.9187265 0.9187045 -0.9994059 0.9348208 0.9348069 -0.9995309 0.9478789 0.94787 -0.9996296 0.9584181 0.9584126 -0.9997074 0.9668887 0.9668852 -0.9997689 0.9736734 0.9736712 -0.9998174 0.9790932 0.9790919 -0.9998557 0.9834133 0.9834124 -0.999886 0.9868507 0.9868502 -0.9999099 0.9895821 0.9895818 -0.9999288 0.9917502 0.99175 -0.9999437 0.9934695 0.9934694 -0.0000238 0.0506267 0.0185862 -0.0000382 0.0501232 0.0180827 -0.0000611 0.049491 0.0174505 -0.0000978 0.0486989 0.0166583 -0.0001565 0.047709 0.0156685 -0.0002504 0.0464764 0.0144359 -0.0004008 0.0449485 0.012908 -0.0006416 0.043066 0.0110255 -0.0010268 0.0407651 0.0087246 -0.0016435 0.0379834 0.0059429 -0.0026305 0.0346711 0.0026305 -0.0080698 0.0346711 0.0026305 -0.0149512 0.0346711 0.0026305 -0.023657 0.0346711 0.0026305 -0.0346711 0.0346711 0.0026305 -0.0486053 0.0346711 0.0026305 -0.0662338 0.0346711 0.0026305 -0.0885362 0.0346711 0.0026305 -0.1167517 0.0346711 0.0026305 -0.1524479 0.0346711 0.0026305 -0.1976083 0.0346711 0.0026305 -0.254742 0.0346711 0.0026305 -0.3270236 0.0346711 0.0026305 -0.4184692 0.0346711 0.0026305 -0.5341598 0.0346711 0.0026305 -0.6805235 0.0346711 0.0026305 -0.8333779 0.0372359 0.0065402 -0.900682 0.0537068 0.0282324 -0.9342712 0.0822505 0.062202 -0.9539671 0.1208148 0.1054431 -0.9666211 0.1681189 0.1565473 -0.975234 0.222956 0.2143816 -0.9813291 0.283909 0.2776503 -0.9857621 0.3492646 0.3447636 -0.989051 0.4170563 0.4138668 -0.9915271 0.4851992 0.4829718 -0.993412 0.5516753 0.5501416 -0.9948589 0.6147189 0.6136769 -0.9959768 0.6729586 0.6722594 -0.9968448 0.7254883 0.7250244 -0.9975213 0.7718646 0.7715599 -0.9980502 0.812046 0.8118476 -0.9984647 0.8462997 0.8461714 -0.9987901 0.8750997 0.8750173 -0.9990459 0.8990355 0.8989829 -0.9992472 0.918738 0.9187045 -0.9994059 0.9348281 0.9348069 -0.9995309 0.9478835 0.94787 -0.9996296 0.958421 0.9584126 -0.9997074 0.9668905 0.9668852 -0.9997689 0.9736746 0.9736712 -0.9998174 0.979094 0.9790919 -0.9998557 0.9834137 0.9834124 -0.999886 0.986851 0.9868502 -0.9999099 0.9895823 0.9895818 -0.9999288 0.9917503 0.99175 -0.9999437 0.9934696 0.9934694 -0.0000238 0.0645609 0.0185862 -0.0000382 0.0640574 0.0180827 -0.0000611 0.0634252 0.0174505 -0.0000978 0.0626331 0.0166583 -0.0001565 0.0616432 0.0156685 -0.0002504 0.0604106 0.0144359 -0.0004008 0.0588827 0.012908 -0.0006416 0.0570002 0.0110255 -0.0010268 0.0546993 0.0087246 -0.0016435 0.0519176 0.0059429 -0.0026305 0.0486053 0.0026305 -0.0080698 0.0486053 0.0026305 -0.0149512 0.0486053 0.0026305 -0.023657 0.0486053 0.0026305 -0.0346711 0.0486053 0.0026305 -0.0486053 0.0486053 0.0026305 -0.0662338 0.0486053 0.0026305 -0.0885362 0.0486053 0.0026305 -0.1167517 0.0486053 0.0026305 -0.1524479 0.0486053 0.0026305 -0.1976083 0.0486053 0.0026305 -0.254742 0.0486053 0.0026305 -0.3270236 0.0486053 0.0026305 -0.4184692 0.0486053 0.0026305 -0.5341598 0.0486053 0.0026305 -0.6805235 0.0486053 0.0026305 -0.8333779 0.0505853 0.0065402 -0.900682 0.0647855 0.0282324 -0.9342712 0.0909694 0.062202 -0.9539671 0.1274998 0.1054431 -0.9666211 0.1731513 0.1565473 -0.975234 0.2266849 0.2143816 -0.9813291 0.2866309 0.2776503 -0.9857621 0.3512221 0.3447636 -0.989051 0.4184434 0.4138668 -0.9915271 0.4861679 0.4829718 -0.993412 0.5523423 0.5501416 -0.9948589 0.615172 0.6136769 -0.9959768 0.6732627 0.6722594 -0.9968448 0.7256901 0.7250244 -0.9975213 0.7719972 0.7715599 -0.9980502 0.8121323 0.8118476 -0.9984647 0.8463555 0.8461714 -0.9987901 0.8751356 0.8750173 -0.9990459 0.8990584 0.8989829 -0.9992472 0.9187526 0.9187045 -0.9994059 0.9348374 0.9348069 -0.9995309 0.9478893 0.94787 -0.9996296 0.9584247 0.9584126 -0.9997074 0.9668928 0.9668852 -0.9997689 0.9736761 0.9736712 -0.9998174 0.9790949 0.9790919 -0.9998557 0.9834143 0.9834124 -0.999886 0.9868513 0.9868502 -0.9999099 0.9895825 0.9895818 -0.9999288 0.9917504 0.99175 -0.9999437 0.9934697 0.9934694 -0.0000238 0.0821895 0.0185862 -0.0000382 0.081686 0.0180827 -0.0000611 0.0810538 0.0174505 -0.0000978 0.0802616 0.0166583 -0.0001565 0.0792718 0.0156685 -0.0002504 0.0780392 0.0144359 -0.0004008 0.0765113 0.012908 -0.0006416 0.0746288 0.0110255 -0.0010268 0.0723279 0.0087246 -0.0016435 0.0695462 0.0059429 -0.0026305 0.0662338 0.0026305 -0.0080698 0.0662338 0.0026305 -0.0149512 0.0662338 0.0026305 -0.023657 0.0662338 0.0026305 -0.0346711 0.0662338 0.0026305 -0.0486053 0.0662338 0.0026305 -0.0662338 0.0662338 0.0026305 -0.0885362 0.0662338 0.0026305 -0.1167517 0.0662338 0.0026305 -0.1524479 0.0662338 0.0026305 -0.1976083 0.0662338 0.0026305 -0.254742 0.0662338 0.0026305 -0.3270236 0.0662338 0.0026305 -0.4184692 0.0662338 0.0026305 -0.5341598 0.0662338 0.0026305 -0.6805235 0.0662338 0.0026305 -0.8333779 0.0674739 0.0065402 -0.900682 0.0788014 0.0282324 -0.9342712 0.102 0.062202 -0.9539671 0.1359573 0.1054431 -0.9666211 0.1795179 0.1565473 -0.975234 0.2314025 0.2143816 -0.9813291 0.2900744 0.2776503 -0.9857621 0.3536986 0.3447636 -0.989051 0.4201982 0.4138668 -0.9915271 0.4873934 0.4829718 -0.993412 0.5531861 0.5501416 -0.9948589 0.6157453 0.6136769 -0.9959768 0.6736474 0.6722594 -0.9968448 0.7259453 0.7250244 -0.9975213 0.7721649 0.7715599 -0.9980502 0.8122416 0.8118476 -0.9984647 0.846426 0.8461714 -0.9987901 0.8751809 0.8750173 -0.9990459 0.8990874 0.8989829 -0.9992472 0.918771 0.9187045 -0.9994059 0.9348491 0.9348069 -0.9995309 0.9478967 0.94787 -0.9996296 0.9584294 0.9584126 -0.9997074 0.9668957 0.9668852 -0.9997689 0.9736779 0.9736712 -0.9998174 0.979096 0.9790919 -0.9998557 0.983415 0.9834124 -0.999886 0.9868518 0.9868502 -0.9999099 0.9895828 0.9895818 -0.9999288 0.9917506 0.99175 -0.9999437 0.9934698 0.9934694 -0.0000238 0.1044919 0.0185862 -0.0000382 0.1039884 0.0180827 -0.0000611 0.1033562 0.0174505 -0.0000978 0.102564 0.0166583 -0.0001565 0.1015742 0.0156685 -0.0002504 0.1003416 0.0144359 -0.0004008 0.0988137 0.012908 -0.0006416 0.0969312 0.0110255 -0.0010268 0.0946303 0.0087246 -0.0016435 0.0918486 0.0059429 -0.0026305 0.0885362 0.0026305 -0.0080698 0.0885362 0.0026305 -0.0149512 0.0885362 0.0026305 -0.023657 0.0885362 0.0026305 -0.0346711 0.0885362 0.0026305 -0.0486053 0.0885362 0.0026305 -0.0662338 0.0885362 0.0026305 -0.0885362 0.0885362 0.0026305 -0.1167517 0.0885362 0.0026305 -0.1524479 0.0885362 0.0026305 -0.1976083 0.0885362 0.0026305 -0.254742 0.0885362 0.0026305 -0.3270236 0.0885362 0.0026305 -0.4184692 0.0885362 0.0026305 -0.5341598 0.0885362 0.0026305 -0.6805235 0.0885362 0.0026305 -0.8333779 0.0888403 0.0065402 -0.900682 0.0965334 0.0282324 -0.9342712 0.1159552 0.062202 -0.9539671 0.1466571 0.1054431 -0.9666211 0.1875725 0.1565473 -0.975234 0.2373708 0.2143816 -0.9813291 0.2944309 0.2776503 -0.9857621 0.3568316 0.3447636 -0.989051 0.4224183 0.4138668 -0.9915271 0.4889438 0.4829718 -0.993412 0.5542536 0.5501416 -0.9948589 0.6164706 0.6136769 -0.9959768 0.674134 0.6722594 -0.9968448 0.7262683 0.7250244 -0.9975213 0.772377 0.7715599 -0.9980502 0.8123797 0.8118476 -0.9984647 0.8465153 0.8461714 -0.9987901 0.8752383 0.8750173 -0.9990459 0.899124 0.8989829 -0.9992472 0.9187944 0.9187045 -0.9994059 0.9348638 0.9348069 -0.9995309 0.947906 0.94787 -0.9996296 0.9584353 0.9584126 -0.9997074 0.9668994 0.9668852 -0.9997689 0.9736802 0.9736712 -0.9998174 0.9790975 0.9790919 -0.9998557 0.9834159 0.9834124 -0.999886 0.9868524 0.9868502 -0.9999099 0.9895832 0.9895818 -0.9999288 0.9917508 0.99175 -0.9999437 0.9934699 0.9934694 -0.0000238 0.1327073 0.0185862 -0.0000382 0.1322038 0.0180827 -0.0000611 0.1315716 0.0174505 -0.0000978 0.1307795 0.0166583 -0.0001565 0.1297896 0.0156685 -0.0002504 0.128557 0.0144359 -0.0004008 0.1270291 0.012908 -0.0006416 0.1251466 0.0110255 -0.0010268 0.1228457 0.0087246 -0.0016435 0.120064 0.0059429 -0.0026305 0.1167517 0.0026305 -0.0080698 0.1167517 0.0026305 -0.0149512 0.1167517 0.0026305 -0.023657 0.1167517 0.0026305 -0.0346711 0.1167517 0.0026305 -0.0486053 0.1167517 0.0026305 -0.0662338 0.1167517 0.0026305 -0.0885362 0.1167517 0.0026305 -0.1167517 0.1167517 0.0026305 -0.1524479 0.1167517 0.0026305 -0.1976083 0.1167517 0.0026305 -0.254742 0.1167517 0.0026305 -0.3270236 0.1167517 0.0026305 -0.4184692 0.1167517 0.0026305 -0.5341598 0.1167517 0.0026305 -0.6805235 0.1167517 0.0026305 -0.8333779 0.1158715 0.0065402 -0.900682 0.1189666 0.0282324 -0.9342712 0.1336102 0.062202 -0.9539671 0.1601937 0.1054431 -0.9666211 0.1977627 0.1565473 -0.975234 0.2449216 0.2143816 -0.9813291 0.2999424 0.2776503 -0.9857621 0.3607953 0.3447636 -0.989051 0.425227 0.4138668 -0.9915271 0.4909052 0.4829718 -0.993412 0.5556042 0.5501416 -0.9948589 0.6173882 0.6136769 -0.9959768 0.6747498 0.6722594 -0.9968448 0.7266768 0.7250244 -0.9975213 0.7726454 0.7715599 -0.9980502 0.8125545 0.8118476 -0.9984647 0.8466283 0.8461714 -0.9987901 0.8753108 0.8750173 -0.9990459 0.8991704 0.8989829 -0.9992472 0.9188239 0.9187045 -0.9994059 0.9348825 0.9348069 -0.9995309 0.9479179 0.94787 -0.9996296 0.9584427 0.9584126 -0.9997074 0.9669041 0.9668852 -0.9997689 0.9736832 0.9736712 -0.9998174 0.9790993 0.9790919 -0.9998557 0.9834171 0.9834124 -0.999886 0.9868531 0.9868502 -0.9999099 0.9895836 0.9895818 -0.9999288 0.9917511 0.99175 -0.9999437 0.9934701 0.9934694 -0.0000238 0.1684036 0.0185862 -0.0000382 0.1679 0.0180827 -0.0000611 0.1672678 0.0174505 -0.0000978 0.1664757 0.0166583 -0.0001565 0.1654858 0.0156685 -0.0002504 0.1642532 0.0144359 -0.0004008 0.1627254 0.012908 -0.0006416 0.1608428 0.0110255 -0.0010268 0.1585419 0.0087246 -0.0016435 0.1557603 0.0059429 -0.0026305 0.1524479 0.0026305 -0.0080698 0.1524479 0.0026305 -0.0149512 0.1524479 0.0026305 -0.023657 0.1524479 0.0026305 -0.0346711 0.1524479 0.0026305 -0.0486053 0.1524479 0.0026305 -0.0662338 0.1524479 0.0026305 -0.0885362 0.1524479 0.0026305 -0.1167517 0.1524479 0.0026305 -0.1524479 0.1524479 0.0026305 -0.1976083 0.1524479 0.0026305 -0.254742 0.1524479 0.0026305 -0.3270236 0.1524479 0.0026305 -0.4184692 0.1524479 0.0026305 -0.5341598 0.1524479 0.0026305 -0.6805235 0.1524479 0.0026305 -0.8333779 0.1500694 0.0065402 -0.900682 0.1473476 0.0282324 -0.9342712 0.1559462 0.062202 -0.9539671 0.1773192 0.1054431 -0.9666211 0.2106546 0.1565473 -0.975234 0.2544742 0.2143816 -0.9813291 0.3069152 0.2776503 -0.9857621 0.3658099 0.3447636 -0.989051 0.4287804 0.4138668 -0.9915271 0.4933867 0.4829718 -0.993412 0.5573129 0.5501416 -0.9948589 0.6185491 0.6136769 -0.9959768 0.6755287 0.6722594 -0.9968448 0.7271937 0.7250244 -0.9975213 0.7729849 0.7715599 -0.9980502 0.8127756 0.8118476 -0.9984647 0.8467713 0.8461714 -0.9987901 0.8754027 0.8750173 -0.9990459 0.8992291 0.8989829 -0.9992472 0.9188612 0.9187045 -0.9994059 0.9349062 0.9348069 -0.9995309 0.9479328 0.94787 -0.9996296 0.9584521 0.9584126 -0.9997074 0.9669101 0.9668852 -0.9997689 0.9736869 0.9736712 -0.9998174 0.9791017 0.9790919 -0.9998557 0.9834186 0.9834124 -0.999886 0.986854 0.9868502 -0.9999099 0.9895842 0.9895818 -0.9999288 0.9917515 0.99175 -0.9999437 0.9934703 0.9934694 -0.0000238 0.2135639 0.0185862 -0.0000382 0.2130604 0.0180827 -0.0000611 0.2124282 0.0174505 -0.0000978 0.2116361 0.0166583 -0.0001565 0.2106462 0.0156685 -0.0002504 0.2094136 0.0144359 -0.0004008 0.2078857 0.012908 -0.0006416 0.2060032 0.0110255 -0.0010268 0.2037023 0.0087246 -0.0016435 0.2009206 0.0059429 -0.0026305 0.1976083 0.0026305 -0.0080698 0.1976083 0.0026305 -0.0149512 0.1976083 0.0026305 -0.023657 0.1976083 0.0026305 -0.0346711 0.1976083 0.0026305 -0.0486053 0.1976083 0.0026305 -0.0662338 0.1976083 0.0026305 -0.0885362 0.1976083 0.0026305 -0.1167517 0.1976083 0.0026305 -0.1524479 0.1976083 0.0026305 -0.1976083 0.1976083 0.0026305 -0.254742 0.1976083 0.0026305 -0.3270236 0.1976083 0.0026305 -0.4184692 0.1976083 0.0026305 -0.5341598 0.1976083 0.0026305 -0.6805235 0.1976083 0.0026305 -0.8333779 0.1933343 0.0065402 -0.900682 0.1832532 0.0282324 -0.9342712 0.1842041 0.062202 -0.9539671 0.1989853 0.1054431 -0.9666211 0.2269644 0.1565473 -0.975234 0.2665596 0.2143816 -0.9813291 0.3157367 0.2776503 -0.9857621 0.3721541 0.3447636 -0.989051 0.4332759 0.4138668 -0.9915271 0.4965262 0.4829718 -0.993412 0.5594745 0.5501416 -0.9948589 0.6200177 0.6136769 -0.9959768 0.6765142 0.6722594 -0.9968448 0.7278476 0.7250244 -0.9975213 0.7734145 0.7715599 -0.9980502 0.8130554 0.8118476 -0.9984647 0.8469521 0.8461714 -0.9987901 0.8755188 0.8750173 -0.9990459 0.8993033 0.8989829 -0.9992472 0.9189084 0.9187045 -0.9994059 0.9349361 0.9348069 -0.9995309 0.9479517 0.94787 -0.9996296 0.9584641 0.9584126 -0.9997074 0.9669176 0.9668852 -0.9997689 0.9736916 0.9736712 -0.9998174 0.9791046 0.9790919 -0.9998557 0.9834204 0.9834124 -0.999886 0.9868552 0.9868502 -0.9999099 0.9895849 0.9895818 -0.9999288 0.9917519 0.99175 -0.9999437 0.9934706 0.9934694 -0.0000238 0.2706977 0.0185862 -0.0000382 0.2701941 0.0180827 -0.0000611 0.2695619 0.0174505 -0.0000978 0.2687698 0.0166583 -0.0001565 0.2677799 0.0156685 -0.0002504 0.2665473 0.0144359 -0.0004008 0.2650195 0.012908 -0.0006416 0.2631369 0.0110255 -0.0010268 0.260836 0.0087246 -0.0016435 0.2580543 0.0059429 -0.0026305 0.254742 0.0026305 -0.0080698 0.254742 0.0026305 -0.0149512 0.254742 0.0026305 -0.023657 0.254742 0.0026305 -0.0346711 0.254742 0.0026305 -0.0486053 0.254742 0.0026305 -0.0662338 0.254742 0.0026305 -0.0885362 0.254742 0.0026305 -0.1167517 0.254742 0.0026305 -0.1524479 0.254742 0.0026305 -0.1976083 0.254742 0.0026305 -0.254742 0.254742 0.0026305 -0.3270236 0.254742 0.0026305 -0.4184692 0.254742 0.0026305 -0.5341598 0.254742 0.0026305 -0.6805235 0.254742 0.0026305 -0.8333779 0.2480701 0.0065402 -0.900682 0.2286785 0.0282324 -0.9342712 0.219954 0.062202 -0.9539671 0.2263957 0.1054431 -0.9666211 0.2475986 0.1565473 -0.975234 0.2818492 0.2143816 -0.9813291 0.3268971 0.2776503 -0.9857621 0.3801802 0.3447636 -0.989051 0.4389633 0.4138668 -0.9915271 0.5004979 0.4829718 -0.993412 0.5622093 0.5501416 -0.9948589 0.6218758 0.6136769 -0.9959768 0.677761 0.6722594 -0.9968448 0.7286748 0.7250244 -0.9975213 0.7739579 0.7715599 -0.9980502 0.8134093 0.8118476 -0.9984647 0.8471809 0.8461714 -0.9987901 0.8756658 0.8750173 -0.9990459 0.8993972 0.8989829 -0.9992472 0.9189681 0.9187045 -0.9994059 0.934974 0.9348069 -0.9995309 0.9479757 0.94787 -0.9996296 0.9584792 0.9584126 -0.9997074 0.9669271 0.9668852 -0.9997689 0.9736976 0.9736712 -0.9998174 0.9791084 0.9790919 -0.9998557 0.9834228 0.9834124 -0.999886 0.9868567 0.9868502 -0.9999099 0.9895859 0.9895818 -0.9999288 0.9917525 0.99175 -0.9999437 0.993471 0.9934694 -0.0000238 0.3429792 0.0185862 -0.0000382 0.3424757 0.0180827 -0.0000611 0.3418435 0.0174505 -0.0000978 0.3410514 0.0166583 -0.0001565 0.3400615 0.0156685 -0.0002504 0.3388289 0.0144359 -0.0004008 0.337301 0.012908 -0.0006416 0.3354185 0.0110255 -0.0010268 0.3331176 0.0087246 -0.0016435 0.3303359 0.0059429 -0.0026305 0.3270236 0.0026305 -0.0080698 0.3270236 0.0026305 -0.0149512 0.3270236 0.0026305 -0.023657 0.3270236 0.0026305 -0.0346711 0.3270236 0.0026305 -0.0486053 0.3270236 0.0026305 -0.0662338 0.3270236 0.0026305 -0.0885362 0.3270236 0.0026305 -0.1167517 0.3270236 0.0026305 -0.1524479 0.3270236 0.0026305 -0.1976083 0.3270236 0.0026305 -0.254742 0.3270236 0.0026305 -0.3270236 0.3270236 0.0026305 -0.4184692 0.3270236 0.0026305 -0.5341598 0.3270236 0.0026305 -0.6805235 0.3270236 0.0026305 -0.8333779 0.3173179 0.0065402 -0.900682 0.2861474 0.0282324 -0.9342712 0.2651822 0.062202 -0.9539671 0.2610734 0.1054431 -0.9666211 0.2737034 0.1565473 -0.975234 0.3011925 0.2143816 -0.9813291 0.3410164 0.2776503 -0.9857621 0.3903343 0.3447636 -0.989051 0.4461586 0.4138668 -0.9915271 0.5055228 0.4829718 -0.993412 0.5656692 0.5501416 -0.9948589 0.6242264 0.6136769 -0.9959768 0.6793384 0.6722594 -0.9968448 0.7297214 0.7250244 -0.9975213 0.7746455 0.7715599 -0.9980502 0.813857 0.8118476 -0.9984647 0.8474703 0.8461714 -0.9987901 0.8758517 0.8750173 -0.9990459 0.899516 0.8989829 -0.9992472 0.9190437 0.9187045 -0.9994059 0.9350219 0.9348069 -0.9995309 0.9480059 0.94787 -0.9996296 0.9584983 0.9584126 -0.9997074 0.9669391 0.9668852 -0.9997689 0.9737052 0.9736712 -0.9998174 0.9791131 0.9790919 -0.9998557 0.9834257 0.9834124 -0.999886 0.9868585 0.9868502 -0.9999099 0.989587 0.9895818 -0.9999288 0.9917532 0.99175 -0.9999437 0.9934715 0.9934694 -0.0000238 0.4344249 0.0185862 -0.0000382 0.4339214 0.0180827 -0.0000611 0.4332891 0.0174505 -0.0000978 0.432497 0.0166583 -0.0001565 0.4315072 0.0156685 -0.0002504 0.4302746 0.0144359 -0.0004008 0.4287467 0.012908 -0.0006416 0.4268641 0.0110255 -0.0010268 0.4245633 0.0087246 -0.0016435 0.4217816 0.0059429 -0.0026305 0.4184692 0.0026305 -0.0080698 0.4184692 0.0026305 -0.0149512 0.4184692 0.0026305 -0.023657 0.4184692 0.0026305 -0.0346711 0.4184692 0.0026305 -0.0486053 0.4184692 0.0026305 -0.0662338 0.4184692 0.0026305 -0.0885362 0.4184692 0.0026305 -0.1167517 0.4184692 0.0026305 -0.1524479 0.4184692 0.0026305 -0.1976083 0.4184692 0.0026305 -0.254742 0.4184692 0.0026305 -0.3270236 0.4184692 0.0026305 -0.4184692 0.4184692 0.0026305 -0.5341598 0.4184692 0.0026305 -0.6805235 0.4184692 0.0026305 -0.8333779 0.4049254 0.0065402 -0.900682 0.358853 0.0282324 -0.9342712 0.3224019 0.062202 -0.9539671 0.3049452 0.1054431 -0.9666211 0.3067294 0.1565473 -0.975234 0.3256642 0.2143816 -0.9813291 0.3588791 0.2776503 -0.9857621 0.4031806 0.3447636 -0.989051 0.4552615 0.4138668 -0.9915271 0.5118798 0.4829718 -0.993412 0.5700464 0.5501416 -0.9948589 0.6272003 0.6136769 -0.9959768 0.6813339 0.6722594 -0.9968448 0.7310455 0.7250244 -0.9975213 0.7755153 0.7715599 -0.9980502 0.8144235 0.8118476 -0.9984647 0.8478364 0.8461714 -0.9987901 0.8760869 0.8750173 -0.9990459 0.8996662 0.8989829 -0.9992472 0.9191393 0.9187045 -0.9994059 0.9350825 0.9348069 -0.9995309 0.9480443 0.94787 -0.9996296 0.9585224 0.9584126 -0.9997074 0.9669543 0.9668852 -0.9997689 0.9737147 0.9736712 -0.9998174 0.9791191 0.9790919 -0.9998557 0.9834295 0.9834124 -0.999886 0.9868609 0.9868502 -0.9999099 0.9895885 0.9895818 -0.9999288 0.9917542 0.99175 -0.9999437 0.993472 0.9934694 -0.0000238 0.5501155 0.0185862 -0.0000382 0.549612 0.0180827 -0.0000611 0.5489798 0.0174505 -0.0000978 0.5481876 0.0166583 -0.0001565 0.5471978 0.0156685 -0.0002504 0.5459652 0.0144359 -0.0004008 0.5444373 0.012908 -0.0006416 0.5425548 0.0110255 -0.0010268 0.5402539 0.0087246 -0.0016435 0.5374722 0.0059429 -0.0026305 0.5341598 0.0026305 -0.0080698 0.5341598 0.0026305 -0.0149512 0.5341598 0.0026305 -0.023657 0.5341598 0.0026305 -0.0346711 0.5341598 0.0026305 -0.0486053 0.5341598 0.0026305 -0.0662338 0.5341598 0.0026305 -0.0885362 0.5341598 0.0026305 -0.1167517 0.5341598 0.0026305 -0.1524479 0.5341598 0.0026305 -0.1976083 0.5341598 0.0026305 -0.254742 0.5341598 0.0026305 -0.3270236 0.5341598 0.0026305 -0.4184692 0.5341598 0.0026305 -0.5341598 0.5341598 0.0026305 -0.6805235 0.5341598 0.0026305 -0.8333779 0.5157602 0.0065402 -0.900682 0.4508351 0.0282324 -0.9342712 0.3947922 0.062202 -0.9539671 0.3604487 0.1054431 -0.9666211 0.3485116 0.1565473 -0.975234 0.3566242 0.2143816 -0.9813291 0.3814778 0.2776503 -0.9857621 0.4194328 0.3447636 -0.989051 0.466778 0.4138668 -0.9915271 0.5199223 0.4829718 -0.993412 0.5755841 0.5501416 -0.9948589 0.6309626 0.6136769 -0.9959768 0.6838586 0.6722594 -0.9968448 0.7327207 0.7250244 -0.9975213 0.7766158 0.7715599 -0.9980502 0.8151401 0.8118476 -0.9984647 0.8482997 0.8461714 -0.9987901 0.8763844 0.8750173 -0.9990459 0.8998564 0.8989829 -0.9992472 0.9192603 0.9187045 -0.9994059 0.9351592 0.9348069 -0.9995309 0.9480927 0.94787 -0.9996296 0.958553 0.9584126 -0.9997074 0.9669735 0.9668852 -0.9997689 0.9737268 0.9736712 -0.9998174 0.9791267 0.9790919 -0.9998557 0.9834343 0.9834124 -0.999886 0.9868639 0.9868502 -0.9999099 0.9895904 0.9895818 -0.9999288 0.9917553 0.99175 -0.9999437 0.9934728 0.9934694 -0.0000238 0.6964791 0.0185862 -0.0000382 0.6959756 0.0180827 -0.0000611 0.6953434 0.0174505 -0.0000978 0.6945513 0.0166583 -0.0001565 0.6935614 0.0156685 -0.0002504 0.6923288 0.0144359 -0.0004008 0.6908009 0.012908 -0.0006416 0.6889184 0.0110255 -0.0010268 0.6866175 0.0087246 -0.0016435 0.6838358 0.0059429 -0.0026305 0.6805235 0.0026305 -0.0080698 0.6805235 0.0026305 -0.0149512 0.6805235 0.0026305 -0.023657 0.6805235 0.0026305 -0.0346711 0.6805235 0.0026305 -0.0486053 0.6805235 0.0026305 -0.0662338 0.6805235 0.0026305 -0.0885362 0.6805235 0.0026305 -0.1167517 0.6805235 0.0026305 -0.1524479 0.6805235 0.0026305 -0.1976083 0.6805235 0.0026305 -0.254742 0.6805235 0.0026305 -0.3270236 0.6805235 0.0026305 -0.4184692 0.6805235 0.0026305 -0.5341598 0.6805235 0.0026305 -0.6805235 0.6805235 0.0026305 -0.8333779 0.6559807 0.0065402 -0.900682 0.5672044 0.0282324 -0.9342712 0.4863753 0.062202 -0.9539671 0.4306679 0.1054431 -0.9666211 0.4013716 0.1565473 -0.975234 0.3957926 0.2143816 -0.9813291 0.410068 0.2776503 -0.9857621 0.439994 0.3447636 -0.989051 0.4813478 0.4138668 -0.9915271 0.5300971 0.4829718 -0.993412 0.5825901 0.5501416 -0.9948589 0.6357225 0.6136769 -0.9959768 0.6870525 0.6722594 -0.9968448 0.73484 0.7250244 -0.9975213 0.778008 0.7715599 -0.9980502 0.8160468 0.8118476 -0.9984647 0.8488857 0.8461714 -0.9987901 0.8767609 0.8750173 -0.9990459 0.9000969 0.8989829 -0.9992472 0.9194133 0.9187045 -0.9994059 0.9352562 0.9348069 -0.9995309 0.948154 0.94787 -0.9996296 0.9585917 0.9584126 -0.9997074 0.9669979 0.9668852 -0.9997689 0.9737421 0.9736712 -0.9998174 0.9791363 0.9790919 -0.9998557 0.9834403 0.9834124 -0.999886 0.9868676 0.9868502 -0.9999099 0.9895927 0.9895818 -0.9999288 0.9917568 0.99175 -0.9999437 0.9934737 0.9934694 -0.0051514 0.8407292 0.0227443 -0.0051286 0.8405071 0.0222366 -0.0051047 0.8402274 0.0215989 -0.0050826 0.8398756 0.0207992 -0.0050676 0.8394338 0.0197991 -0.0050694 0.8388802 0.0185525 -0.0051048 0.8381886 0.0170051 -0.0052028 0.8373283 0.0150955 -0.0054121 0.8362644 0.012757 -0.0058134 0.8349593 0.0099234 -0.0065402 0.8333779 0.0065402 -0.0117512 0.8333779 0.0065402 -0.0183437 0.8333779 0.0065402 -0.0266842 0.8333779 0.0065402 -0.0372359 0.8333779 0.0065402 -0.0505853 0.8333779 0.0065402 -0.0674739 0.8333779 0.0065402 -0.0888403 0.8333779 0.0065402 -0.1158715 0.8333779 0.0065402 -0.1500694 0.8333779 0.0065402 -0.1933343 0.8333779 0.0065402 -0.2480701 0.8333779 0.0065402 -0.3173179 0.8333779 0.0065402 -0.4049254 0.8333779 0.0065402 -0.5157602 0.8333779 0.0065402 -0.6559807 0.8333779 0.0065402 -0.8333779 0.8333779 0.0065402 -0.900682 0.7144267 0.0282324 -0.9342712 0.6022399 0.062202 -0.9539671 0.5195043 0.1054431 -0.9666211 0.4682463 0.1565473 -0.975234 0.4453457 0.2143816 -0.9813291 0.4462385 0.2776503 -0.9857621 0.4660065 0.3447636 -0.989051 0.4997805 0.4138668 -0.9915271 0.5429696 0.4829718 -0.993412 0.5914535 0.5501416 -0.9948589 0.6417443 0.6136769 -0.9959768 0.6910933 0.6722594 -0.9968448 0.7375211 0.7250244 -0.9975213 0.7797693 0.7715599 -0.9980502 0.8171938 0.8118476 -0.9984647 0.8496272 0.8461714 -0.9987901 0.8772371 0.8750173 -0.9990459 0.9004012 0.8989829 -0.9992472 0.9196069 0.9187045 -0.9994059 0.9353789 0.9348069 -0.9995309 0.9482316 0.94787 -0.9996296 0.9586406 0.9584126 -0.9997074 0.9670287 0.9668852 -0.9997689 0.9737614 0.9736712 -0.9998174 0.9791485 0.9790919 -0.9998557 0.9834479 0.9834124 -0.999886 0.9868724 0.9868502 -0.9999099 0.9895957 0.9895818 -0.9999288 0.9917587 0.99175 -0.9999437 0.9934749 0.9934694 -0.0279321 0.9033413 0.0424942 -0.0278872 0.9032596 0.042049 -0.0278347 0.9031567 0.0414896 -0.0277752 0.9030276 0.0407879 -0.0277111 0.9028657 0.03991 -0.0276479 0.9026634 0.0388151 -0.0275966 0.9024114 0.0374553 -0.0275778 0.9020992 0.0357758 -0.0276281 0.9017148 0.0337171 -0.0278105 0.9012461 0.0312193 -0.0282324 0.900682 0.0282324 -0.032557 0.900682 0.0282324 -0.0380282 0.900682 0.0282324 -0.0449499 0.900682 0.0282324 -0.0537068 0.900682 0.0282324 -0.0647855 0.900682 0.0282324 -0.0788014 0.900682 0.0282324 -0.0965334 0.900682 0.0282324 -0.1189666 0.900682 0.0282324 -0.1473476 0.900682 0.0282324 -0.1832532 0.900682 0.0282324 -0.2286785 0.900682 0.0282324 -0.2861474 0.900682 0.0282324 -0.358853 0.900682 0.0282324 -0.4508351 0.900682 0.0282324 -0.5672044 0.900682 0.0282324 -0.7144267 0.900682 0.0282324 -0.900682 0.900682 0.0282324 -0.9342712 0.7488237 0.062202 -0.9539671 0.6318939 0.1054431 -0.9666211 0.5528515 0.1565473 -0.975234 0.5080368 0.2143816 -0.9813291 0.4919987 0.2776503 -0.9857621 0.4989158 0.3447636 -0.989051 0.5231002 0.4138668 -0.9915271 0.5592549 0.4829718 -0.993412 0.6026669 0.5501416 -0.9948589 0.6493627 0.6136769 -0.9959768 0.6962055 0.6722594 -0.9968448 0.7409131 0.7250244 -0.9975213 0.7819976 0.7715599 -0.9980502 0.818645 0.8118476 -0.9984647 0.8505652 0.8461714 -0.9987901 0.8778396 0.8750173 -0.9990459 0.9007862 0.8989829 -0.9992472 0.9198518 0.9187045 -0.9994059 0.9355342 0.9348069 -0.9995309 0.9483298 0.94787 -0.9996296 0.9587025 0.9584126 -0.9997074 0.9670676 0.9668852 -0.9997689 0.9737859 0.9736712 -0.9998174 0.9791638 0.9790919 -0.9998557 0.9834575 0.9834124 -0.999886 0.9868785 0.9868502 -0.9999099 0.9895995 0.9895818 -0.9999288 0.991761 0.99175 -0.9999437 0.9934763 0.9934694 -0.0624569 0.9354466 0.0739313 -0.0624063 0.9354101 0.0735648 -0.0623458 0.9353643 0.0731043 -0.0622749 0.9353068 0.0725268 -0.0621943 0.9352348 0.0718043 -0.0621069 0.9351449 0.0709034 -0.0620199 0.9350332 0.0697847 -0.0619473 0.9348949 0.0684033 -0.061916 0.9347252 0.0667103 -0.0619734 0.9345187 0.0646568 -0.062202 0.9342712 0.062202 -0.0656055 0.9342712 0.062202 -0.0699113 0.9342712 0.062202 -0.0753587 0.9342712 0.062202 -0.0822505 0.9342712 0.062202 -0.0909694 0.9342712 0.062202 -0.102 0.9342712 0.062202 -0.1159552 0.9342712 0.062202 -0.1336102 0.9342712 0.062202 -0.1559462 0.9342712 0.062202 -0.1842041 0.9342712 0.062202 -0.219954 0.9342712 0.062202 -0.2651822 0.9342712 0.062202 -0.3224019 0.9342712 0.062202 -0.3947922 0.9342712 0.062202 -0.4863753 0.9342712 0.062202 -0.6022399 0.9342712 0.062202 -0.7488237 0.9342712 0.062202 -0.9342712 0.9342712 0.062202 -0.9539671 0.7740814 0.1054431 -0.9666211 0.6598881 0.1565473 -0.975234 0.5873492 0.2143816 -0.9813291 0.5498914 0.2776503 -0.9857621 0.5405503 0.3447636 -0.989051 0.5526027 0.4138668 -0.9915271 0.579858 0.4829718 -0.993412 0.6168533 0.5501416 -0.9948589 0.659001 0.6136769 -0.9959768 0.702673 0.6722594 -0.9968448 0.7452045 0.7250244 -0.9975213 0.7848167 0.7715599 -0.9980502 0.8204809 0.8118476 -0.9984647 0.8517519 0.8461714 -0.9987901 0.8786019 0.8750173 -0.9990459 0.9012733 0.8989829 -0.9992472 0.9201617 0.9187045 -0.9994059 0.9357306 0.9348069 -0.9995309 0.9484539 0.94787 -0.9996296 0.9587808 0.9584126 -0.9997074 0.9671169 0.9668852 -0.9997689 0.9738169 0.9736712 -0.9998174 0.9791833 0.9790919 -0.9998557 0.9834697 0.9834124 -0.999886 0.9868861 0.9868502 -0.9999099 0.9896043 0.9895818 -0.9999288 0.991764 0.99175 -0.9999437 0.9934782 0.9934694 -0.1059991 0.9545467 0.1148123 -0.1059489 0.9545286 0.1145191 -0.1058883 0.9545059 0.1141507 -0.1058162 0.9544774 0.1136888 -0.1057322 0.9544418 0.1131111 -0.1056375 0.9543974 0.1123908 -0.1055364 0.9543421 0.1114966 -0.1054384 0.9542739 0.1103929 -0.1053624 0.9541902 0.1090407 -0.1053433 0.9540886 0.1074015 -0.1054431 0.9539671 0.1054431 -0.1080526 0.9539671 0.1054431 -0.111354 0.9539671 0.1054431 -0.1155307 0.9539671 0.1054431 -0.1208148 0.9539671 0.1054431 -0.1274998 0.9539671 0.1054431 -0.1359573 0.9539671 0.1054431 -0.1466571 0.9539671 0.1054431 -0.1601937 0.9539671 0.1054431 -0.1773192 0.9539671 0.1054431 -0.1989853 0.9539671 0.1054431 -0.2263957 0.9539671 0.1054431 -0.2610734 0.9539671 0.1054431 -0.3049452 0.9539671 0.1054431 -0.3604487 0.9539671 0.1054431 -0.4306679 0.9539671 0.1054431 -0.5195043 0.9539671 0.1054431 -0.6318939 0.9539671 0.1054431 -0.7740814 0.9539671 0.1054431 -0.9539671 0.9539671 0.1054431 -0.9666211 0.7953033 0.1565473 -0.975234 0.6876897 0.2143816 -0.9813291 0.6231332 0.2776503 -0.9857621 0.5932233 0.3447636 -0.989051 0.5899272 0.4138668 -0.9915271 0.6059236 0.4829718 -0.993412 0.634801 0.5501416 -0.9948589 0.6711946 0.6136769 -0.9959768 0.7108553 0.6722594 -0.9968448 0.7506336 0.7250244 -0.9975213 0.7883833 0.7715599 -0.9980502 0.8228035 0.8118476 -0.9984647 0.8532533 0.8461714 -0.9987901 0.8795663 0.8750173 -0.9990459 0.9018894 0.8989829 -0.9992472 0.9205537 0.9187045 -0.9994059 0.9359791 0.9348069 -0.9995309 0.948611 0.94787 -0.9996296 0.9588798 0.9584126 -0.9997074 0.9671793 0.9668852 -0.9997689 0.9738561 0.9736712 -0.9998174 0.9792079 0.9790919 -0.9998557 0.9834851 0.9834124 -0.999886 0.9868958 0.9868502 -0.9999099 0.9896103 0.9895818 -0.9999288 0.9917678 0.99175 -0.9999437 0.9934806 0.9934694 -0.1572498 0.9669269 0.1638954 -0.1572031 0.9669173 0.1636651 -0.1571463 0.9669053 0.1633758 -0.1570779 0.9668902 0.1630131 -0.1569971 0.9668714 0.1625595 -0.156904 0.9668479 0.1619942 -0.1568008 0.9668187 0.1612925 -0.1566936 0.9667827 0.1604266 -0.1565954 0.9667385 0.1593662 -0.1565315 0.966685 0.1580814 -0.1565473 0.9666211 0.1565473 -0.1585117 0.9666211 0.1565473 -0.160997 0.9666211 0.1565473 -0.1641411 0.9666211 0.1565473 -0.1681189 0.9666211 0.1565473 -0.1731513 0.9666211 0.1565473 -0.1795179 0.9666211 0.1565473 -0.1875725 0.9666211 0.1565473 -0.1977627 0.9666211 0.1565473 -0.2106546 0.9666211 0.1565473 -0.2269644 0.9666211 0.1565473 -0.2475986 0.9666211 0.1565473 -0.2737034 0.9666211 0.1565473 -0.3067294 0.9666211 0.1565473 -0.3485116 0.9666211 0.1565473 -0.4013716 0.9666211 0.1565473 -0.4682463 0.9666211 0.1565473 -0.5528515 0.9666211 0.1565473 -0.6598881 0.9666211 0.1565473 -0.7953033 0.9666211 0.1565473 -0.9666211 0.9666211 0.1565473 -0.975234 0.8146336 0.2143816 -0.9813291 0.7157936 0.2776503 -0.9857621 0.6598616 0.3447636 -0.989051 0.6371476 0.4138668 -0.9915271 0.6388999 0.4829718 -0.993412 0.657507 0.5501416 -0.9948589 0.6866212 0.6136769 -0.9959768 0.7212069 0.6722594 -0.9968448 0.7575021 0.7250244 -0.9975213 0.7928954 0.7715599 -0.9980502 0.825742 0.8118476 -0.9984647 0.8551527 0.8461714 -0.9987901 0.8807863 0.8750173 -0.9990459 0.902669 0.8989829 -0.9992472 0.9210496 0.9187045 -0.9994059 0.9362935 0.9348069 -0.9995309 0.9488097 0.94787 -0.9996296 0.9590051 0.9584126 -0.9997074 0.9672581 0.9668852 -0.9997689 0.9739057 0.9736712 -0.9998174 0.979239 0.9790919 -0.9998557 0.9835047 0.9834124 -0.999886 0.986908 0.9868502 -0.9999099 0.989618 0.9895818 -0.9999288 0.9917726 0.99175 -0.9999437 0.9934836 0.9934694 -0.2151269 0.9754027 0.2200584 -0.2150852 0.9753975 0.2198803 -0.2150342 0.9753908 0.2196565 -0.2149725 0.9753825 0.219376 -0.2148987 0.9753721 0.2190253 -0.2148124 0.9753591 0.2185882 -0.2147144 0.975343 0.2180458 -0.2146085 0.9753231 0.2173767 -0.2145034 0.9752987 0.2165577 -0.2144168 0.9752692 0.2155656 -0.2143816 0.975234 0.2143816 -0.2158372 0.975234 0.2143816 -0.2176788 0.975234 0.2143816 -0.2200085 0.975234 0.2143816 -0.222956 0.975234 0.2143816 -0.2266849 0.975234 0.2143816 -0.2314025 0.975234 0.2143816 -0.2373708 0.975234 0.2143816 -0.2449216 0.975234 0.2143816 -0.2544742 0.975234 0.2143816 -0.2665596 0.975234 0.2143816 -0.2818492 0.975234 0.2143816 -0.3011925 0.975234 0.2143816 -0.3256642 0.975234 0.2143816 -0.3566242 0.975234 0.2143816 -0.3957926 0.975234 0.2143816 -0.4453457 0.975234 0.2143816 -0.5080368 0.975234 0.2143816 -0.5873492 0.975234 0.2143816 -0.6876897 0.975234 0.2143816 -0.8146336 0.975234 0.2143816 -0.975234 0.975234 0.2143816 -0.9813291 0.8330211 0.2776503 -0.9857621 0.7441676 0.3447636 -0.989051 0.6968875 0.4138668 -0.9915271 0.6806192 0.4829718 -0.993412 0.6862332 0.5501416 -0.9948589 0.7061378 0.6136769 -0.9959768 0.7343031 0.6722594 -0.9968448 0.7661917 0.7250244 -0.9975213 0.7986038 0.7715599 -0.9980502 0.8294595 0.8118476 -0.9984647 0.8575557 0.8461714 -0.9987901 0.8823298 0.8750173 -0.9990459 0.9036553 0.8989829 -0.9992472 0.9216771 0.9187045 -0.9994059 0.9366913 0.9348069 -0.9995309 0.9490611 0.94787 -0.9996296 0.9591637 0.9584126 -0.9997074 0.9673579 0.9668852 -0.9997689 0.9739684 0.9736712 -0.9998174 0.9792784 0.9790919 -0.9998557 0.9835294 0.9834124 -0.999886 0.9869235 0.9868502 -0.9999099 0.9896277 0.9895818 -0.9999288 0.9917787 0.99175 -0.9999437 0.9934874 0.9934694 -0.2783684 0.9814251 0.2819726 -0.2783325 0.9814221 0.2818368 -0.2782884 0.9814183 0.2816663 -0.2782347 0.9814136 0.2814525 -0.2781701 0.9814076 0.2811853 -0.2780936 0.9814002 0.2808523 -0.2780055 0.9813911 0.2804391 -0.2779077 0.9813797 0.2799296 -0.2778058 0.9813659 0.279306 -0.2777122 0.9813491 0.278551 -0.2776503 0.9813291 0.2776503 -0.2787128 0.9813291 0.2776503 -0.280057 0.9813291 0.2776503 -0.2817576 0.9813291 0.2776503 -0.283909 0.9813291 0.2776503 -0.2866309 0.9813291 0.2776503 -0.2900744 0.9813291 0.2776503 -0.2944309 0.9813291 0.2776503 -0.2999424 0.9813291 0.2776503 -0.3069152 0.9813291 0.2776503 -0.3157367 0.9813291 0.2776503 -0.3268971 0.9813291 0.2776503 -0.3410164 0.9813291 0.2776503 -0.3588791 0.9813291 0.2776503 -0.3814778 0.9813291 0.2776503 -0.410068 0.9813291 0.2776503 -0.4462385 0.9813291 0.2776503 -0.4919987 0.9813291 0.2776503 -0.5498914 0.9813291 0.2776503 -0.6231332 0.9813291 0.2776503 -0.7157936 0.9813291 0.2776503 -0.8330211 0.9813291 0.2776503 -0.9813291 0.9813291 0.2776503 -0.9857621 0.8508257 0.3447636 -0.989051 0.7724662 0.4138668 -0.9915271 0.7333996 0.4829718 -0.993412 0.7225756 0.5501416 -0.9948589 0.7308289 0.6136769 -0.9959768 0.7508714 0.6722594 -0.9968448 0.7771851 0.7250244 -0.9975213 0.8058257 0.7715599 -0.9980502 0.8341627 0.8118476 -0.9984647 0.8605957 0.8461714 -0.9987901 0.8842826 0.8750173 -0.9990459 0.904903 0.8989829 -0.9992472 0.9224709 0.9187045 -0.9994059 0.9371945 0.9348069 -0.9995309 0.9493792 0.94787 -0.9996296 0.9593643 0.9584126 -0.9997074 0.9674842 0.9668852 -0.9997689 0.9740477 0.9736712 -0.9998174 0.9793282 0.9790919 -0.9998557 0.9835606 0.9834124 -0.999886 0.986943 0.9868502 -0.9999099 0.9896399 0.9895818 -0.9999288 0.9917864 0.99175 -0.9999437 0.9934922 0.9934694 -0.3454107 0.9858181 0.3480054 -0.3453807 0.9858163 0.3479034 -0.3453439 0.9858141 0.3477754 -0.3452987 0.9858113 0.347615 -0.3452442 0.9858079 0.3474144 -0.3451791 0.9858036 0.3471646 -0.3451032 0.9857982 0.3468546 -0.3450175 0.9857916 0.3464724 -0.3449254 0.9857835 0.3460047 -0.3448353 0.9857738 0.3454387 -0.3447636 0.9857621 0.3447636 -0.3455277 0.9857621 0.3447636 -0.3464944 0.9857621 0.3447636 -0.3477174 0.9857621 0.3447636 -0.3492646 0.9857621 0.3447636 -0.3512221 0.9857621 0.3447636 -0.3536986 0.9857621 0.3447636 -0.3568316 0.9857621 0.3447636 -0.3607953 0.9857621 0.3447636 -0.3658099 0.9857621 0.3447636 -0.3721541 0.9857621 0.3447636 -0.3801802 0.9857621 0.3447636 -0.3903343 0.9857621 0.3447636 -0.4031806 0.9857621 0.3447636 -0.4194328 0.9857621 0.3447636 -0.439994 0.9857621 0.3447636 -0.4660065 0.9857621 0.3447636 -0.4989158 0.9857621 0.3447636 -0.5405503 0.9857621 0.3447636 -0.5932233 0.9857621 0.3447636 -0.6598616 0.9857621 0.3447636 -0.7441676 0.9857621 0.3447636 -0.8508257 0.9857621 0.3447636 -0.9857621 0.9857621 0.3447636 -0.989051 0.8680831 0.4138668 -0.9915271 0.8001737 0.4829718 -0.993412 0.7685533 0.5501416 -0.9948589 0.7620663 0.6136769 -0.9959768 0.7718325 0.6722594 -0.9968448 0.7910933 0.7250244 -0.9975213 0.8149624 0.7715599 -0.9980502 0.8401128 0.8118476 -0.9984647 0.8644419 0.8461714 -0.9987901 0.8867531 0.8750173 -0.9990459 0.9064815 0.8989829 -0.9992472 0.9234751 0.9187045 -0.9994059 0.9378311 0.9348069 -0.9995309 0.9497816 0.94787 -0.9996296 0.959618 0.9584126 -0.9997074 0.9676439 0.9668852 -0.9997689 0.9741481 0.9736712 -0.9998174 0.9793912 0.9790919 -0.9998557 0.9836001 0.9834124 -0.999886 0.9869678 0.9868502 -0.9999099 0.9896555 0.9895818 -0.9999288 0.9917961 0.99175 -0.9999437 0.9934983 0.9934694 -0.4144197 0.9890841 0.4162599 -0.4143955 0.9890831 0.4161847 -0.4143657 0.9890818 0.4160901 -0.414329 0.9890801 0.4159716 -0.4142845 0.9890781 0.4158235 -0.4142311 0.9890755 0.4156389 -0.4141683 0.9890723 0.41541 -0.4140964 0.9890684 0.4151278 -0.4140176 0.9890637 0.4147826 -0.4139373 0.9890579 0.4143649 -0.4138668 0.989051 0.4138668 -0.4144083 0.989051 0.4138668 -0.4150933 0.989051 0.4138668 -0.4159599 0.989051 0.4138668 -0.4170563 0.989051 0.4138668 -0.4184434 0.989051 0.4138668 -0.4201982 0.989051 0.4138668 -0.4224183 0.989051 0.4138668 -0.425227 0.989051 0.4138668 -0.4287804 0.989051 0.4138668 -0.4332759 0.989051 0.4138668 -0.4389633 0.989051 0.4138668 -0.4461586 0.989051 0.4138668 -0.4552615 0.989051 0.4138668 -0.466778 0.989051 0.4138668 -0.4813478 0.989051 0.4138668 -0.4997805 0.989051 0.4138668 -0.5231002 0.989051 0.4138668 -0.5526027 0.989051 0.4138668 -0.5899272 0.989051 0.4138668 -0.6371476 0.989051 0.4138668 -0.6968875 0.989051 0.4138668 -0.7724662 0.989051 0.4138668 -0.8680831 0.989051 0.4138668 -0.989051 0.989051 0.4138668 -0.9915271 0.8846516 0.4829718 -0.993412 0.8267212 0.5501416 -0.9948589 0.8015857 0.6136769 -0.9959768 0.798351 0.6722594 -0.9968448 0.8086889 0.7250244 -0.9975213 0.8265214 0.7715599 -0.9980502 0.8476404 0.8118476 -0.9984647 0.8693077 0.8461714 -0.9987901 0.8898785 0.8750173 -0.9990459 0.9084786 0.8989829 -0.9992472 0.9247456 0.9187045 -0.9994059 0.9386365 0.9348069 -0.9995309 0.9502907 0.94787 -0.9996296 0.9599391 0.9584126 -0.9997074 0.967846 0.9668852 -0.9997689 0.9742751 0.9736712 -0.9998174 0.9794709 0.9790919 -0.9998557 0.9836501 0.9834124 -0.999886 0.9869991 0.9868502 -0.9999099 0.9896751 0.9895818 -0.9999288 0.9918083 0.99175 -0.9999437 0.9935059 0.9934694 -0.4834235 0.9915469 0.4847095 -0.4834045 0.9915463 0.4846548 -0.4833811 0.9915455 0.4845861 -0.4833522 0.9915446 0.4845 -0.4833171 0.9915433 0.4843924 -0.4832747 0.9915418 0.4842584 -0.4832246 0.9915399 0.4840922 -0.4831666 0.9915376 0.4838872 -0.4831021 0.9915347 0.4836366 -0.4830346 0.9915312 0.4833333 -0.4829718 0.9915271 0.4829718 -0.48335 0.9915271 0.4829718 -0.4838283 0.9915271 0.4829718 -0.4844335 0.9915271 0.4829718 -0.4851992 0.9915271 0.4829718 -0.4861679 0.9915271 0.4829718 -0.4873934 0.9915271 0.4829718 -0.4889438 0.9915271 0.4829718 -0.4909052 0.9915271 0.4829718 -0.4933867 0.9915271 0.4829718 -0.4965262 0.9915271 0.4829718 -0.5004979 0.9915271 0.4829718 -0.5055228 0.9915271 0.4829718 -0.5118798 0.9915271 0.4829718 -0.5199223 0.9915271 0.4829718 -0.5300971 0.9915271 0.4829718 -0.5429696 0.9915271 0.4829718 -0.5592549 0.9915271 0.4829718 -0.579858 0.9915271 0.4829718 -0.6059236 0.9915271 0.4829718 -0.6388999 0.9915271 0.4829718 -0.6806192 0.9915271 0.4829718 -0.7333996 0.9915271 0.4829718 -0.8001737 0.9915271 0.4829718 -0.8846516 0.9915271 0.4829718 -0.9915271 0.9915271 0.4829718 -0.993412 0.9003112 0.5501416 -0.9948589 0.8515828 0.6136769 -0.9959768 0.8319004 0.6722594 -0.9968448 0.8309496 0.7250244 -0.9975213 0.8411451 0.7715599 -0.9980502 0.8571639 0.8118476 -0.9984647 0.8754636 0.8461714 -0.9987901 0.8938327 0.8750173 -0.9990459 0.9110051 0.8989829 -0.9992472 0.926353 0.9187045 -0.9994059 0.9396555 0.9348069 -0.9995309 0.9509348 0.94787 -0.9996296 0.9603452 0.9584126 -0.9997074 0.9681016 0.9668852 -0.9997689 0.9744358 0.9736712 -0.9998174 0.9795718 0.9790919 -0.9998557 0.9837133 0.9834124 -0.999886 0.9870387 0.9868502 -0.9999099 0.9896999 0.9895818 -0.9999288 0.9918239 0.99175 -0.9999437 0.9935157 0.9934694 -0.5504963 0.993424 0.5513823 -0.5504818 0.9934236 0.5513433 -0.550464 0.9934231 0.5512942 -0.5504419 0.9934225 0.5512327 -0.550415 0.9934218 0.5511558 -0.5503825 0.9934209 0.5510601 -0.5503438 0.9934197 0.5509414 -0.5502987 0.9934183 0.5507951 -0.550248 0.9934166 0.5506161 -0.5501939 0.9934145 0.5503996 -0.5501416 0.993412 0.5501416 -0.550402 0.993412 0.5501416 -0.5507314 0.993412 0.5501416 -0.5511481 0.993412 0.5501416 -0.5516753 0.993412 0.5501416 -0.5523423 0.993412 0.5501416 -0.5531861 0.993412 0.5501416 -0.5542536 0.993412 0.5501416 -0.5556042 0.993412 0.5501416 -0.5573129 0.993412 0.5501416 -0.5594745 0.993412 0.5501416 -0.5622093 0.993412 0.5501416 -0.5656692 0.993412 0.5501416 -0.5700464 0.993412 0.5501416 -0.5755841 0.993412 0.5501416 -0.5825901 0.993412 0.5501416 -0.5914535 0.993412 0.5501416 -0.6026669 0.993412 0.5501416 -0.6168533 0.993412 0.5501416 -0.634801 0.993412 0.5501416 -0.657507 0.993412 0.5501416 -0.6862332 0.993412 0.5501416 -0.7225756 0.993412 0.5501416 -0.7685533 0.993412 0.5501416 -0.8267212 0.993412 0.5501416 -0.9003112 0.993412 0.5501416 -0.993412 0.993412 0.5501416 -0.9948589 0.9148357 0.6136769 -0.9959768 0.8743447 0.6722594 -0.9968448 0.8591123 0.7250244 -0.9975213 0.859646 0.7715599 -0.9980502 0.8692123 0.8118476 -0.9984647 0.8832516 0.8461714 -0.9987901 0.8988352 0.8750173 -0.9990459 0.9142016 0.8989829 -0.9992472 0.9283865 0.9187045 -0.9994059 0.9409446 0.9348069 -0.9995309 0.9517496 0.94787 -0.9996296 0.9608591 0.9584126 -0.9997074 0.9684251 0.9668852 -0.9997689 0.974639 0.9736712 -0.9998174 0.9796994 0.9790919 -0.9998557 0.9837934 0.9834124 -0.999886 0.9870889 0.9868502 -0.9999099 0.9897313 0.9895818 -0.9999288 0.9918435 0.99175 -0.9999437 0.993528 0.9934694 -0.6139459 0.9948662 0.6145482 -0.6139352 0.994866 0.6145207 -0.6139219 0.9948657 0.6144862 -0.6139056 0.9948653 0.6144431 -0.6138855 0.9948649 0.6143891 -0.6138613 0.9948643 0.6143218 -0.6138323 0.9948636 0.6142384 -0.6137984 0.9948628 0.6141357 -0.6137599 0.9948617 0.61401 -0.6137183 0.9948604 0.613858 -0.6136769 0.9948589 0.6136769 -0.6138538 0.9948589 0.6136769 -0.6140776 0.9948589 0.6136769 -0.6143607 0.9948589 0.6136769 -0.6147189 0.9948589 0.6136769 -0.615172 0.9948589 0.6136769 -0.6157453 0.9948589 0.6136769 -0.6164706 0.9948589 0.6136769 -0.6173882 0.9948589 0.6136769 -0.6185491 0.9948589 0.6136769 -0.6200177 0.9948589 0.6136769 -0.6218758 0.9948589 0.6136769 -0.6242264 0.9948589 0.6136769 -0.6272003 0.9948589 0.6136769 -0.6309626 0.9948589 0.6136769 -0.6357225 0.9948589 0.6136769 -0.6417443 0.9948589 0.6136769 -0.6493627 0.9948589 0.6136769 -0.659001 0.9948589 0.6136769 -0.6711946 0.9948589 0.6136769 -0.6866212 0.9948589 0.6136769 -0.7061378 0.9948589 0.6136769 -0.7308289 0.9948589 0.6136769 -0.7620663 0.9948589 0.6136769 -0.8015857 0.9948589 0.6136769 -0.8515828 0.9948589 0.6136769 -0.9148357 0.9948589 0.6136769 -0.9948589 0.9948589 0.6136769 -0.9959768 0.9280423 0.6722594 -0.9968448 0.8947418 0.7250244 -0.9975213 0.883052 0.7715599 -0.9980502 0.8844551 0.8118476 -0.9984647 0.8931045 0.8461714 -0.9987901 0.905164 0.8750173 -0.9990459 0.9182454 0.8989829 -0.9992472 0.9309592 0.9187045 -0.9994059 0.9425755 0.9348069 -0.9995309 0.9527805 0.94787 -0.9996296 0.9615092 0.9584126 -0.9997074 0.9688342 0.9668852 -0.9997689 0.9748962 0.9736712 -0.9998174 0.9798608 0.9790919 -0.9998557 0.9838946 0.9834124 -0.999886 0.9871523 0.9868502 -0.9999099 0.989771 0.9895818 -0.9999288 0.9918684 0.99175 -0.9999437 0.9935435 0.9934694 -0.6724572 0.9959813 0.6728615 -0.6724495 0.9959811 0.6728425 -0.6724399 0.9959809 0.6728187 -0.672428 0.9959807 0.6727888 -0.6724135 0.9959804 0.6727515 -0.6723959 0.9959801 0.672705 -0.6723748 0.9959797 0.6726474 -0.67235 0.9959791 0.6725764 -0.6723217 0.9959785 0.6724896 -0.6722907 0.9959777 0.6723845 -0.6722594 0.9959768 0.6722594 -0.6723781 0.9959768 0.6722594 -0.6725283 0.9959768 0.6722594 -0.6727182 0.9959768 0.6722594 -0.6729586 0.9959768 0.6722594 -0.6732627 0.9959768 0.6722594 -0.6736474 0.9959768 0.6722594 -0.674134 0.9959768 0.6722594 -0.6747498 0.9959768 0.6722594 -0.6755287 0.9959768 0.6722594 -0.6765142 0.9959768 0.6722594 -0.677761 0.9959768 0.6722594 -0.6793384 0.9959768 0.6722594 -0.6813339 0.9959768 0.6722594 -0.6838586 0.9959768 0.6722594 -0.6870525 0.9959768 0.6722594 -0.6910933 0.9959768 0.6722594 -0.6962055 0.9959768 0.6722594 -0.702673 0.9959768 0.6722594 -0.7108553 0.9959768 0.6722594 -0.7212069 0.9959768 0.6722594 -0.7343031 0.9959768 0.6722594 -0.7508714 0.9959768 0.6722594 -0.7718325 0.9959768 0.6722594 -0.798351 0.9959768 0.6722594 -0.8319004 0.9959768 0.6722594 -0.8743447 0.9959768 0.6722594 -0.9280423 0.9959768 0.6722594 -0.9959768 0.9959768 0.6722594 -0.9968448 0.9398178 0.7250244 -0.9975213 0.9126636 0.7715599 -0.9980502 0.9037393 0.8118476 -0.9984647 0.9055697 0.8461714 -0.9987901 0.9131708 0.8750173 -0.9990459 0.9233615 0.8989829 -0.9992472 0.934214 0.9187045 -0.9994059 0.9446388 0.9348069 -0.9995309 0.9540847 0.94787 -0.9996296 0.9623316 0.9584126 -0.9997074 0.9693519 0.9668852 -0.9997689 0.9752215 0.9736712 -0.9998174 0.980065 0.9790919 -0.9998557 0.9840227 0.9834124 -0.999886 0.9872326 0.9868502 -0.9999099 0.9898213 0.9895818 -0.9999288 0.9918999 0.99175 -0.9999437 0.9935632 0.9934694 -0.7251659 0.9968475 0.7254343 -0.7251605 0.9968474 0.7254214 -0.7251537 0.9968473 0.7254052 -0.7251454 0.9968472 0.7253848 -0.7251351 0.996847 0.7253594 -0.7251226 0.9968468 0.7253278 -0.7251076 0.9968465 0.7252885 -0.7250899 0.9968462 0.7252402 -0.7250697 0.9968458 0.7251811 -0.7250473 0.9968453 0.7251096 -0.7250244 0.9968448 0.7250244 -0.7251031 0.9968448 0.7250244 -0.7252028 0.9968448 0.7250244 -0.7253288 0.9968448 0.7250244 -0.7254883 0.9968448 0.7250244 -0.7256901 0.9968448 0.7250244 -0.7259453 0.9968448 0.7250244 -0.7262683 0.9968448 0.7250244 -0.7266768 0.9968448 0.7250244 -0.7271937 0.9968448 0.7250244 -0.7278476 0.9968448 0.7250244 -0.7286748 0.9968448 0.7250244 -0.7297214 0.9968448 0.7250244 -0.7310455 0.9968448 0.7250244 -0.7327207 0.9968448 0.7250244 -0.73484 0.9968448 0.7250244 -0.7375211 0.9968448 0.7250244 -0.7409131 0.9968448 0.7250244 -0.7452045 0.9968448 0.7250244 -0.7506336 0.9968448 0.7250244 -0.7575021 0.9968448 0.7250244 -0.7661917 0.9968448 0.7250244 -0.7771851 0.9968448 0.7250244 -0.7910933 0.9968448 0.7250244 -0.8086889 0.9968448 0.7250244 -0.8309496 0.9968448 0.7250244 -0.8591123 0.9968448 0.7250244 -0.8947418 0.9968448 0.7250244 -0.9398178 0.9968448 0.7250244 -0.9968448 0.9968448 0.7250244 -0.9975213 0.9501262 0.7715599 -0.9980502 0.9281362 0.8118476 -0.9984647 0.9213397 0.8461714 -0.9987901 0.9233004 0.8750173 -0.9990459 0.9298339 0.8989829 -0.9992472 0.9383317 0.9187045 -0.9994059 0.9472491 0.9348069 -0.9995309 0.9557347 0.94787 -0.9996296 0.9633721 0.9584126 -0.9997074 0.9700068 0.9668852 -0.9997689 0.9756331 0.9736712 -0.9998174 0.9803234 0.9790919 -0.9998557 0.9841847 0.9834124 -0.999886 0.9873341 0.9868502 -0.9999099 0.9898849 0.9895818 -0.9999288 0.9919397 0.99175 -0.9999437 0.9935881 0.9934694 -0.7716588 0.997523 0.7718352 -0.7716551 0.997523 0.7718265 -0.7716504 0.9975229 0.7718156 -0.7716446 0.9975228 0.7718019 -0.7716375 0.9975227 0.7717849 -0.7716288 0.9975226 0.7717636 -0.7716184 0.9975224 0.7717373 -0.7716061 0.9975222 0.7717048 -0.7715919 0.997522 0.7716651 -0.7715762 0.9975217 0.7716171 -0.7715599 0.9975213 0.7715599 -0.7716116 0.9975213 0.7715599 -0.7716771 0.9975213 0.7715599 -0.7717599 0.9975213 0.7715599 -0.7718646 0.9975213 0.7715599 -0.7719972 0.9975213 0.7715599 -0.7721649 0.9975213 0.7715599 -0.772377 0.9975213 0.7715599 -0.7726454 0.9975213 0.7715599 -0.7729849 0.9975213 0.7715599 -0.7734145 0.9975213 0.7715599 -0.7739579 0.9975213 0.7715599 -0.7746455 0.9975213 0.7715599 -0.7755153 0.9975213 0.7715599 -0.7766158 0.9975213 0.7715599 -0.778008 0.9975213 0.7715599 -0.7797693 0.9975213 0.7715599 -0.7819976 0.9975213 0.7715599 -0.7848167 0.9975213 0.7715599 -0.7883833 0.9975213 0.7715599 -0.7928954 0.9975213 0.7715599 -0.7986038 0.9975213 0.7715599 -0.8058257 0.9975213 0.7715599 -0.8149624 0.9975213 0.7715599 -0.8265214 0.9975213 0.7715599 -0.8411451 0.9975213 0.7715599 -0.859646 0.9975213 0.7715599 -0.883052 0.9975213 0.7715599 -0.9126636 0.9975213 0.7715599 -0.9501262 0.9975213 0.7715599 -0.9975213 0.9975213 0.7715599 -0.9980502 0.9590016 0.8118476 -0.9984647 0.9412909 0.8461714 -0.9987901 0.9361157 0.8750173 -0.9990459 0.9380224 0.8989829 -0.9992472 0.9435411 0.9187045 -0.9994059 0.9505515 0.9348069 -0.9995309 0.9578221 0.94787 -0.9996296 0.9646885 0.9584126 -0.9997074 0.9708354 0.9668852 -0.9997689 0.9761539 0.9736712 -0.9998174 0.9806502 0.9790919 -0.9998557 0.9843897 0.9834124 -0.999886 0.9874625 0.9868502 -0.9999099 0.9899653 0.9895818 -0.9999288 0.99199 0.99175 -0.9999437 0.9936196 0.9934694 -0.8119154 0.9980513 0.8120303 -0.8119128 0.9980512 0.8120245 -0.8119096 0.9980512 0.8120173 -0.8119057 0.9980511 0.8120082 -0.8119009 0.9980511 0.8119969 -0.8118949 0.998051 0.8119828 -0.8118878 0.9980509 0.8119653 -0.8118794 0.9980508 0.8119437 -0.8118697 0.9980506 0.8119174 -0.8118589 0.9980504 0.8118855 -0.8118476 0.9980502 0.8118476 -0.8118813 0.9980502 0.8118476 -0.8119239 0.9980502 0.8118476 -0.8119778 0.9980502 0.8118476 -0.812046 0.9980502 0.8118476 -0.8121323 0.9980502 0.8118476 -0.8122416 0.9980502 0.8118476 -0.8123797 0.9980502 0.8118476 -0.8125545 0.9980502 0.8118476 -0.8127756 0.9980502 0.8118476 -0.8130554 0.9980502 0.8118476 -0.8134093 0.9980502 0.8118476 -0.813857 0.9980502 0.8118476 -0.8144235 0.9980502 0.8118476 -0.8151401 0.9980502 0.8118476 -0.8160468 0.9980502 0.8118476 -0.8171938 0.9980502 0.8118476 -0.818645 0.9980502 0.8118476 -0.8204809 0.9980502 0.8118476 -0.8228035 0.9980502 0.8118476 -0.825742 0.9980502 0.8118476 -0.8294595 0.9980502 0.8118476 -0.8341627 0.9980502 0.8118476 -0.8401128 0.9980502 0.8118476 -0.8476404 0.9980502 0.8118476 -0.8571639 0.9980502 0.8118476 -0.8692123 0.9980502 0.8118476 -0.8844551 0.9980502 0.8118476 -0.9037393 0.9980502 0.8118476 -0.9281362 0.9980502 0.8118476 -0.9590016 0.9980502 0.8118476 -0.9980502 0.9980502 0.8118476 -0.9984647 0.9665318 0.8461714 -0.9987901 0.9523287 0.8750173 -0.9990459 0.9483819 0.8989829 -0.9992472 0.9501317 0.9187045 -0.9994059 0.9547294 0.9348069 -0.9995309 0.960463 0.94787 -0.9996296 0.9663539 0.9584126 -0.9997074 0.9718836 0.9668852 -0.9997689 0.9768127 0.9736712 -0.9998174 0.9810638 0.9790919 -0.9998557 0.984649 0.9834124 -0.999886 0.987625 0.9868502 -0.9999099 0.9900671 0.9895818 -0.9999288 0.9920537 0.99175 -0.9999437 0.9936595 0.9934694 -0.8462171 0.9984653 0.8462913 -0.8462154 0.9984653 0.8462876 -0.8462132 0.9984653 0.8462828 -0.8462106 0.9984653 0.8462768 -0.8462073 0.9984652 0.8462694 -0.8462034 0.9984652 0.8462601 -0.8461986 0.9984651 0.8462487 -0.8461929 0.998465 0.8462345 -0.8461864 0.9984649 0.8462172 -0.8461791 0.9984648 0.8461963 -0.8461714 0.9984647 0.8461714 -0.8461932 0.9984647 0.8461714 -0.8462207 0.9984647 0.8461714 -0.8462556 0.9984647 0.8461714 -0.8462997 0.9984647 0.8461714 -0.8463555 0.9984647 0.8461714 -0.846426 0.9984647 0.8461714 -0.8465153 0.9984647 0.8461714 -0.8466283 0.9984647 0.8461714 -0.8467713 0.9984647 0.8461714 -0.8469521 0.9984647 0.8461714 -0.8471809 0.9984647 0.8461714 -0.8474703 0.9984647 0.8461714 -0.8478364 0.9984647 0.8461714 -0.8482997 0.9984647 0.8461714 -0.8488857 0.9984647 0.8461714 -0.8496272 0.9984647 0.8461714 -0.8505652 0.9984647 0.8461714 -0.8517519 0.9984647 0.8461714 -0.8532533 0.9984647 0.8461714 -0.8551527 0.9984647 0.8461714 -0.8575557 0.9984647 0.8461714 -0.8605957 0.9984647 0.8461714 -0.8644419 0.9984647 0.8461714 -0.8693077 0.9984647 0.8461714 -0.8754636 0.9984647 0.8461714 -0.8832516 0.9984647 0.8461714 -0.8931045 0.9984647 0.8461714 -0.9055697 0.9984647 0.8461714 -0.9213397 0.9984647 0.8461714 -0.9412909 0.9984647 0.8461714 -0.9665318 0.9984647 0.8461714 -0.9984647 0.9984647 0.8461714 -0.9987901 0.9728403 0.8750173 -0.9990459 0.961488 0.8989829 -0.9992472 0.9584696 0.9187045 -0.9994059 0.9600151 0.9348069 -0.9995309 0.963804 0.94787 -0.9996296 0.9684608 0.9584126 -0.9997074 0.9732098 0.9668852 -0.9997689 0.9776461 0.9736712 -0.9998174 0.9815869 0.9790919 -0.9998557 0.9849771 0.9834124 -0.999886 0.9878306 0.9868502 -0.9999099 0.9901958 0.9895818 -0.9999288 0.9921343 0.99175 -0.9999437 0.9937099 0.9934694 -0.8750477 0.9987905 0.8750954 -0.8750466 0.9987905 0.8750929 -0.8750451 0.9987904 0.8750898 -0.8750434 0.9987904 0.875086 -0.8750412 0.9987904 0.8750811 -0.8750386 0.9987904 0.8750751 -0.8750355 0.9987903 0.8750676 -0.8750317 0.9987903 0.8750584 -0.8750274 0.9987902 0.8750472 -0.8750225 0.9987902 0.8750335 -0.8750173 0.9987901 0.8750173 -0.8750313 0.9987901 0.8750173 -0.875049 0.9987901 0.8750173 -0.8750714 0.9987901 0.8750173 -0.8750997 0.9987901 0.8750173 -0.8751356 0.9987901 0.8750173 -0.8751809 0.9987901 0.8750173 -0.8752383 0.9987901 0.8750173 -0.8753108 0.9987901 0.8750173 -0.8754027 0.9987901 0.8750173 -0.8755188 0.9987901 0.8750173 -0.8756658 0.9987901 0.8750173 -0.8758517 0.9987901 0.8750173 -0.8760869 0.9987901 0.8750173 -0.8763844 0.9987901 0.8750173 -0.8767609 0.9987901 0.8750173 -0.8772371 0.9987901 0.8750173 -0.8778396 0.9987901 0.8750173 -0.8786019 0.9987901 0.8750173 -0.8795663 0.9987901 0.8750173 -0.8807863 0.9987901 0.8750173 -0.8823298 0.9987901 0.8750173 -0.8842826 0.9987901 0.8750173 -0.8867531 0.9987901 0.8750173 -0.8898785 0.9987901 0.8750173 -0.8938327 0.9987901 0.8750173 -0.8988352 0.9987901 0.8750173 -0.905164 0.9987901 0.8750173 -0.9131708 0.9987901 0.8750173 -0.9233004 0.9987901 0.8750173 -0.9361157 0.9987901 0.8750173 -0.9523287 0.9987901 0.8750173 -0.9728403 0.9987901 0.8750173 -0.9987901 0.9987901 0.8750173 -0.9990459 0.9780689 0.8989829 -0.9992472 0.9690183 0.9187045 -0.9994059 0.9667022 0.9348069 -0.9995309 0.9680309 0.94787 -0.9996296 0.9711263 0.9584126 -0.9997074 0.9748875 0.9668852 -0.9997689 0.9787005 0.9736712 -0.9998174 0.9822488 0.9790919 -0.9998557 0.9853921 0.9834124 -0.999886 0.9880907 0.9868502 -0.9999099 0.9903587 0.9895818 -0.9999288 0.9922362 0.99175 -0.9999437 0.9937737 0.9934694 -0.8990028 0.9990461 0.8990333 -0.899002 0.9990461 0.8990317 -0.8990011 0.9990461 0.8990297 -0.899 0.9990461 0.8990272 -0.8989986 0.9990461 0.8990241 -0.8989969 0.9990461 0.8990202 -0.8989948 0.9990461 0.8990153 -0.8989923 0.999046 0.8990094 -0.8989895 0.999046 0.8990021 -0.8989863 0.9990459 0.8989933 -0.8989829 0.9990459 0.8989829 -0.8989918 0.9990459 0.8989829 -0.8990031 0.9990459 0.8989829 -0.8990174 0.9990459 0.8989829 -0.8990355 0.9990459 0.8989829 -0.8990584 0.9990459 0.8989829 -0.8990874 0.9990459 0.8989829 -0.899124 0.9990459 0.8989829 -0.8991704 0.9990459 0.8989829 -0.8992291 0.9990459 0.8989829 -0.8993033 0.9990459 0.8989829 -0.8993972 0.9990459 0.8989829 -0.899516 0.9990459 0.8989829 -0.8996662 0.9990459 0.8989829 -0.8998564 0.9990459 0.8989829 -0.9000969 0.9990459 0.8989829 -0.9004012 0.9990459 0.8989829 -0.9007862 0.9990459 0.8989829 -0.9012733 0.9990459 0.8989829 -0.9018894 0.9990459 0.8989829 -0.902669 0.9990459 0.8989829 -0.9036553 0.9990459 0.8989829 -0.904903 0.9990459 0.8989829 -0.9064815 0.9990459 0.8989829 -0.9084786 0.9990459 0.8989829 -0.9110051 0.9990459 0.8989829 -0.9142016 0.9990459 0.8989829 -0.9182454 0.9990459 0.8989829 -0.9233615 0.9990459 0.8989829 -0.9298339 0.9990459 0.8989829 -0.9380224 0.9990459 0.8989829 -0.9483819 0.9990459 0.8989829 -0.961488 0.9990459 0.8989829 -0.9780689 0.9990459 0.8989829 -0.9990459 0.9990459 0.8989829 -0.9992472 0.9823636 0.9187045 -0.9994059 0.9751622 0.9348069 -0.9995309 0.9733784 0.94787 -0.9996296 0.9744985 0.9584126 -0.9997074 0.9770101 0.9668852 -0.9997689 0.9800345 0.9736712 -0.9998174 0.9830862 0.9790919 -0.9998557 0.9859173 0.9834124 -0.999886 0.9884198 0.9868502 -0.9999099 0.9905648 0.9895818 -0.9999288 0.9923652 0.99175 -0.9999437 0.9938544 0.9934694 -0.9187175 0.9992474 0.9187369 -0.918717 0.9992474 0.9187359 -0.9187164 0.9992474 0.9187346 -0.9187157 0.9992474 0.918733 -0.9187148 0.9992474 0.918731 -0.9187137 0.9992474 0.9187285 -0.9187123 0.9992473 0.9187254 -0.9187107 0.9992473 0.9187216 -0.9187089 0.9992473 0.9187169 -0.9187068 0.9992473 0.9187113 -0.9187045 0.9992472 0.9187045 -0.9187102 0.9992472 0.9187045 -0.9187174 0.9992472 0.9187045 -0.9187265 0.9992472 0.9187045 -0.918738 0.9992472 0.9187045 -0.9187526 0.9992472 0.9187045 -0.918771 0.9992472 0.9187045 -0.9187944 0.9992472 0.9187045 -0.9188239 0.9992472 0.9187045 -0.9188612 0.9992472 0.9187045 -0.9189084 0.9992472 0.9187045 -0.9189681 0.9992472 0.9187045 -0.9190437 0.9992472 0.9187045 -0.9191393 0.9992472 0.9187045 -0.9192603 0.9992472 0.9187045 -0.9194133 0.9992472 0.9187045 -0.9196069 0.9992472 0.9187045 -0.9198518 0.9992472 0.9187045 -0.9201617 0.9992472 0.9187045 -0.9205537 0.9992472 0.9187045 -0.9210496 0.9992472 0.9187045 -0.9216771 0.9992472 0.9187045 -0.9224709 0.9992472 0.9187045 -0.9234751 0.9992472 0.9187045 -0.9247456 0.9992472 0.9187045 -0.926353 0.9992472 0.9187045 -0.9283865 0.9992472 0.9187045 -0.9309592 0.9992472 0.9187045 -0.934214 0.9992472 0.9187045 -0.9383317 0.9992472 0.9187045 -0.9435411 0.9992472 0.9187045 -0.9501317 0.9992472 0.9187045 -0.9584696 0.9992472 0.9187045 -0.9690183 0.9992472 0.9187045 -0.9823636 0.9992472 0.9187045 -0.9992472 0.9992472 0.9187045 -0.9994059 0.9858652 0.9348069 -0.9995309 0.9801437 0.94787 -0.9996296 0.9787648 0.9584126 -0.9997074 0.9796954 0.9668852 -0.9997689 0.9817222 0.9736712 -0.9998174 0.9841455 0.9790919 -0.9998557 0.9865816 0.9834124 -0.999886 0.9888361 0.9868502 -0.9999099 0.9908255 0.9895818 -0.9999288 0.9925284 0.99175 -0.9999437 0.9939565 0.9934694 -0.9348153 0.999406 0.9348276 -0.9348149 0.999406 0.9348269 -0.9348146 0.999406 0.9348261 -0.9348141 0.999406 0.9348251 -0.9348135 0.999406 0.9348238 -0.9348128 0.9994059 0.9348222 -0.9348119 0.9994059 0.9348202 -0.9348109 0.9994059 0.9348178 -0.9348097 0.9994059 0.9348148 -0.9348083 0.9994059 0.9348112 -0.9348069 0.9994059 0.9348069 -0.9348105 0.9994059 0.9348069 -0.9348151 0.9994059 0.9348069 -0.9348208 0.9994059 0.9348069 -0.9348281 0.9994059 0.9348069 -0.9348374 0.9994059 0.9348069 -0.9348491 0.9994059 0.9348069 -0.9348638 0.9994059 0.9348069 -0.9348825 0.9994059 0.9348069 -0.9349062 0.9994059 0.9348069 -0.9349361 0.9994059 0.9348069 -0.934974 0.9994059 0.9348069 -0.9350219 0.9994059 0.9348069 -0.9350825 0.9994059 0.9348069 -0.9351592 0.9994059 0.9348069 -0.9352562 0.9994059 0.9348069 -0.9353789 0.9994059 0.9348069 -0.9355342 0.9994059 0.9348069 -0.9357306 0.9994059 0.9348069 -0.9359791 0.9994059 0.9348069 -0.9362935 0.9994059 0.9348069 -0.9366913 0.9994059 0.9348069 -0.9371945 0.9994059 0.9348069 -0.9378311 0.9994059 0.9348069 -0.9386365 0.9994059 0.9348069 -0.9396555 0.9994059 0.9348069 -0.9409446 0.9994059 0.9348069 -0.9425755 0.9994059 0.9348069 -0.9446388 0.9994059 0.9348069 -0.9472491 0.9994059 0.9348069 -0.9505515 0.9994059 0.9348069 -0.9547294 0.9994059 0.9348069 -0.9600151 0.9994059 0.9348069 -0.9667022 0.9994059 0.9348069 -0.9751622 0.9994059 0.9348069 -0.9858652 0.9994059 0.9348069 -0.9994059 0.9994059 0.9348069 -0.9995309 0.9887027 0.94787 -0.9996296 0.9841622 0.9584126 -0.9997074 0.9830927 0.9668852 -0.9997689 0.9838573 0.9736712 -0.9998174 0.9854858 0.9790919 -0.9998557 0.9874221 0.9834124 -0.999886 0.9893627 0.9868502 -0.9999099 0.9911553 0.9895818 -0.9999288 0.9927349 0.99175 -0.9999437 0.9940857 0.9934694 -0.9478754 0.999531 0.9478832 -0.9478752 0.999531 0.9478828 -0.947875 0.999531 0.9478822 -0.9478746 0.999531 0.9478816 -0.9478743 0.999531 0.9478808 -0.9478738 0.999531 0.9478798 -0.9478733 0.999531 0.9478785 -0.9478726 0.999531 0.947877 -0.9478718 0.999531 0.9478751 -0.947871 0.9995309 0.9478728 -0.94787 0.9995309 0.94787 -0.9478723 0.9995309 0.94787 -0.9478752 0.9995309 0.94787 -0.9478789 0.9995309 0.94787 -0.9478835 0.9995309 0.94787 -0.9478893 0.9995309 0.94787 -0.9478967 0.9995309 0.94787 -0.947906 0.9995309 0.94787 -0.9479179 0.9995309 0.94787 -0.9479328 0.9995309 0.94787 -0.9479517 0.9995309 0.94787 -0.9479757 0.9995309 0.94787 -0.9480059 0.9995309 0.94787 -0.9480443 0.9995309 0.94787 -0.9480927 0.9995309 0.94787 -0.948154 0.9995309 0.94787 -0.9482316 0.9995309 0.94787 -0.9483298 0.9995309 0.94787 -0.9484539 0.9995309 0.94787 -0.948611 0.9995309 0.94787 -0.9488097 0.9995309 0.94787 -0.9490611 0.9995309 0.94787 -0.9493792 0.9995309 0.94787 -0.9497816 0.9995309 0.94787 -0.9502907 0.9995309 0.94787 -0.9509348 0.9995309 0.94787 -0.9517496 0.9995309 0.94787 -0.9527805 0.9995309 0.94787 -0.9540847 0.9995309 0.94787 -0.9557347 0.9995309 0.94787 -0.9578221 0.9995309 0.94787 -0.960463 0.9995309 0.94787 -0.963804 0.9995309 0.94787 -0.9680309 0.9995309 0.94787 -0.9733784 0.9995309 0.94787 -0.9801437 0.9995309 0.94787 -0.9887027 0.9995309 0.94787 -0.9995309 0.9995309 0.94787 -0.9996296 0.9909907 0.9584126 -0.9997074 0.9873907 0.9668852 -0.9997689 0.9865585 0.9736712 -0.9998174 0.9871813 0.9790919 -0.9998557 0.9884854 0.9834124 -0.999886 0.990029 0.9868502 -0.9999099 0.9915725 0.9895818 -0.9999288 0.992996 0.99175 -0.9999437 0.9942491 0.9934694 -0.958416 0.9996296 0.9584209 -0.9584159 0.9996296 0.9584206 -0.9584157 0.9996296 0.9584203 -0.9584155 0.9996296 0.9584199 -0.9584153 0.9996296 0.9584194 -0.958415 0.9996296 0.9584187 -0.9584146 0.9996296 0.9584179 -0.9584142 0.9996296 0.9584169 -0.9584137 0.9996296 0.9584157 -0.9584132 0.9996296 0.9584143 -0.9584126 0.9996296 0.9584126 -0.958414 0.9996296 0.9584126 -0.9584158 0.9996296 0.9584126 -0.9584181 0.9996296 0.9584126 -0.958421 0.9996296 0.9584126 -0.9584247 0.9996296 0.9584126 -0.9584294 0.9996296 0.9584126 -0.9584353 0.9996296 0.9584126 -0.9584427 0.9996296 0.9584126 -0.9584521 0.9996296 0.9584126 -0.9584641 0.9996296 0.9584126 -0.9584792 0.9996296 0.9584126 -0.9584983 0.9996296 0.9584126 -0.9585224 0.9996296 0.9584126 -0.958553 0.9996296 0.9584126 -0.9585917 0.9996296 0.9584126 -0.9586406 0.9996296 0.9584126 -0.9587025 0.9996296 0.9584126 -0.9587808 0.9996296 0.9584126 -0.9588798 0.9996296 0.9584126 -0.9590051 0.9996296 0.9584126 -0.9591637 0.9996296 0.9584126 -0.9593643 0.9996296 0.9584126 -0.959618 0.9996296 0.9584126 -0.9599391 0.9996296 0.9584126 -0.9603452 0.9996296 0.9584126 -0.9608591 0.9996296 0.9584126 -0.9615092 0.9996296 0.9584126 -0.9623316 0.9996296 0.9584126 -0.9633721 0.9996296 0.9584126 -0.9646885 0.9996296 0.9584126 -0.9663539 0.9996296 0.9584126 -0.9684608 0.9996296 0.9584126 -0.9711263 0.9996296 0.9584126 -0.9744985 0.9996296 0.9584126 -0.9787648 0.9996296 0.9584126 -0.9841622 0.9996296 0.9584126 -0.9909907 0.9996296 0.9584126 -0.9996296 0.9996296 0.9584126 -0.9997074 0.9928282 0.9668852 -0.9997689 0.9899758 0.9736712 -0.9998174 0.9893265 0.9790919 -0.9998557 0.9898306 0.9834124 -0.999886 0.990872 0.9868502 -0.9999099 0.9921004 0.9895818 -0.9999288 0.9933265 0.99175 -0.9999437 0.9944558 0.9934694 -0.9668873 0.9997074 0.9668904 -0.9668872 0.9997074 0.9668902 -0.9668871 0.9997074 0.96689 -0.966887 0.9997074 0.9668898 -0.9668869 0.9997074 0.9668894 -0.9668867 0.9997074 0.966889 -0.9668865 0.9997074 0.9668885 -0.9668862 0.9997074 0.9668879 -0.9668859 0.9997074 0.9668872 -0.9668855 0.9997074 0.9668862 -0.9668852 0.9997074 0.9668852 -0.9668861 0.9997074 0.9668852 -0.9668872 0.9997074 0.9668852 -0.9668887 0.9997074 0.9668852 -0.9668905 0.9997074 0.9668852 -0.9668928 0.9997074 0.9668852 -0.9668957 0.9997074 0.9668852 -0.9668994 0.9997074 0.9668852 -0.9669041 0.9997074 0.9668852 -0.9669101 0.9997074 0.9668852 -0.9669176 0.9997074 0.9668852 -0.9669271 0.9997074 0.9668852 -0.9669391 0.9997074 0.9668852 -0.9669543 0.9997074 0.9668852 -0.9669735 0.9997074 0.9668852 -0.9669979 0.9997074 0.9668852 -0.9670287 0.9997074 0.9668852 -0.9670676 0.9997074 0.9668852 -0.9671169 0.9997074 0.9668852 -0.9671793 0.9997074 0.9668852 -0.9672581 0.9997074 0.9668852 -0.9673579 0.9997074 0.9668852 -0.9674842 0.9997074 0.9668852 -0.9676439 0.9997074 0.9668852 -0.967846 0.9997074 0.9668852 -0.9681016 0.9997074 0.9668852 -0.9684251 0.9997074 0.9668852 -0.9688342 0.9997074 0.9668852 -0.9693519 0.9997074 0.9668852 -0.9700068 0.9997074 0.9668852 -0.9708354 0.9997074 0.9668852 -0.9718836 0.9997074 0.9668852 -0.9732098 0.9997074 0.9668852 -0.9748875 0.9997074 0.9668852 -0.9770101 0.9997074 0.9668852 -0.9796954 0.9997074 0.9668852 -0.9830927 0.9997074 0.9668852 -0.9873907 0.9997074 0.9668852 -0.9928282 0.9997074 0.9668852 -0.9997074 0.9997074 0.9668852 -0.9997689 0.9942992 0.9736712 -0.9998174 0.9920403 0.9790919 -0.9998557 0.9915325 0.9834124 -0.999886 0.9919384 0.9868502 -0.9999099 0.9927683 0.9895818 -0.9999288 0.9937445 0.99175 -0.9999437 0.9947174 0.9934694 -0.9736726 0.9997689 0.9736746 -0.9736726 0.9997689 0.9736745 -0.9736725 0.9997689 0.9736743 -0.9736724 0.9997689 0.9736742 -0.9736723 0.9997689 0.973674 -0.9736722 0.9997689 0.9736737 -0.9736721 0.9997689 0.9736734 -0.9736719 0.9997689 0.973673 -0.9736717 0.9997689 0.9736725 -0.9736715 0.9997689 0.9736719 -0.9736712 0.9997689 0.9736712 -0.9736718 0.9997689 0.9736712 -0.9736725 0.9997689 0.9736712 -0.9736734 0.9997689 0.9736712 -0.9736746 0.9997689 0.9736712 -0.9736761 0.9997689 0.9736712 -0.9736779 0.9997689 0.9736712 -0.9736802 0.9997689 0.9736712 -0.9736832 0.9997689 0.9736712 -0.9736869 0.9997689 0.9736712 -0.9736916 0.9997689 0.9736712 -0.9736976 0.9997689 0.9736712 -0.9737052 0.9997689 0.9736712 -0.9737147 0.9997689 0.9736712 -0.9737268 0.9997689 0.9736712 -0.9737421 0.9997689 0.9736712 -0.9737614 0.9997689 0.9736712 -0.9737859 0.9997689 0.9736712 -0.9738169 0.9997689 0.9736712 -0.9738561 0.9997689 0.9736712 -0.9739057 0.9997689 0.9736712 -0.9739684 0.9997689 0.9736712 -0.9740477 0.9997689 0.9736712 -0.9741481 0.9997689 0.9736712 -0.9742751 0.9997689 0.9736712 -0.9744358 0.9997689 0.9736712 -0.974639 0.9997689 0.9736712 -0.9748962 0.9997689 0.9736712 -0.9752215 0.9997689 0.9736712 -0.9756331 0.9997689 0.9736712 -0.9761539 0.9997689 0.9736712 -0.9768127 0.9997689 0.9736712 -0.9776461 0.9997689 0.9736712 -0.9787005 0.9997689 0.9736712 -0.9800345 0.9997689 0.9736712 -0.9817222 0.9997689 0.9736712 -0.9838573 0.9997689 0.9736712 -0.9865585 0.9997689 0.9736712 -0.9899758 0.9997689 0.9736712 -0.9942992 0.9997689 0.9736712 -0.9997689 0.9997689 0.9736712 -0.9998174 0.9954737 0.9790919 -0.9998557 0.9936856 0.9834124 -0.999886 0.9932876 0.9868502 -0.9999099 0.9936132 0.9895818 -0.9999288 0.9942734 0.99175 -0.9999437 0.9950483 0.9934694 -0.9790927 0.9998174 0.9790939 -0.9790927 0.9998174 0.9790939 -0.9790927 0.9998174 0.9790938 -0.9790926 0.9998174 0.9790937 -0.9790925 0.9998174 0.9790936 -0.9790925 0.9998174 0.9790934 -0.9790924 0.9998174 0.9790932 -0.9790923 0.9998174 0.979093 -0.9790921 0.9998174 0.9790927 -0.979092 0.9998174 0.9790923 -0.9790919 0.9998174 0.9790919 -0.9790922 0.9998174 0.9790919 -0.9790927 0.9998174 0.9790919 -0.9790932 0.9998174 0.9790919 -0.979094 0.9998174 0.9790919 -0.9790949 0.9998174 0.9790919 -0.979096 0.9998174 0.9790919 -0.9790975 0.9998174 0.9790919 -0.9790993 0.9998174 0.9790919 -0.9791017 0.9998174 0.9790919 -0.9791046 0.9998174 0.9790919 -0.9791084 0.9998174 0.9790919 -0.9791131 0.9998174 0.9790919 -0.9791191 0.9998174 0.9790919 -0.9791267 0.9998174 0.9790919 -0.9791363 0.9998174 0.9790919 -0.9791485 0.9998174 0.9790919 -0.9791638 0.9998174 0.9790919 -0.9791833 0.9998174 0.9790919 -0.9792079 0.9998174 0.9790919 -0.979239 0.9998174 0.9790919 -0.9792784 0.9998174 0.9790919 -0.9793282 0.9998174 0.9790919 -0.9793912 0.9998174 0.9790919 -0.9794709 0.9998174 0.9790919 -0.9795718 0.9998174 0.9790919 -0.9796994 0.9998174 0.9790919 -0.9798608 0.9998174 0.9790919 -0.980065 0.9998174 0.9790919 -0.9803234 0.9998174 0.9790919 -0.9806502 0.9998174 0.9790919 -0.9810638 0.9998174 0.9790919 -0.9815869 0.9998174 0.9790919 -0.9822488 0.9998174 0.9790919 -0.9830862 0.9998174 0.9790919 -0.9841455 0.9998174 0.9790919 -0.9854858 0.9998174 0.9790919 -0.9871813 0.9998174 0.9790919 -0.9893265 0.9998174 0.9790919 -0.9920403 0.9998174 0.9790919 -0.9954737 0.9998174 0.9790919 -0.9998174 0.9998174 0.9790919 -0.9998557 0.9964095 0.9834124 -0.999886 0.9949945 0.9868502 -0.9999099 0.9946822 0.9895818 -0.9999288 0.9949425 0.99175 -0.9999437 0.995467 0.9934694 -0.9834129 0.9998557 0.9834137 -0.9834129 0.9998557 0.9834137 -0.9834129 0.9998557 0.9834136 -0.9834129 0.9998557 0.9834135 -0.9834128 0.9998557 0.9834135 -0.9834128 0.9998557 0.9834134 -0.9834127 0.9998557 0.9834132 -0.9834127 0.9998557 0.9834131 -0.9834126 0.9998557 0.9834129 -0.9834125 0.9998557 0.9834127 -0.9834124 0.9998557 0.9834124 -0.9834126 0.9998557 0.9834124 -0.9834129 0.9998557 0.9834124 -0.9834133 0.9998557 0.9834124 -0.9834137 0.9998557 0.9834124 -0.9834143 0.9998557 0.9834124 -0.983415 0.9998557 0.9834124 -0.9834159 0.9998557 0.9834124 -0.9834171 0.9998557 0.9834124 -0.9834186 0.9998557 0.9834124 -0.9834204 0.9998557 0.9834124 -0.9834228 0.9998557 0.9834124 -0.9834257 0.9998557 0.9834124 -0.9834295 0.9998557 0.9834124 -0.9834343 0.9998557 0.9834124 -0.9834403 0.9998557 0.9834124 -0.9834479 0.9998557 0.9834124 -0.9834575 0.9998557 0.9834124 -0.9834697 0.9998557 0.9834124 -0.9834851 0.9998557 0.9834124 -0.9835047 0.9998557 0.9834124 -0.9835294 0.9998557 0.9834124 -0.9835606 0.9998557 0.9834124 -0.9836001 0.9998557 0.9834124 -0.9836501 0.9998557 0.9834124 -0.9837133 0.9998557 0.9834124 -0.9837934 0.9998557 0.9834124 -0.9838946 0.9998557 0.9834124 -0.9840227 0.9998557 0.9834124 -0.9841847 0.9998557 0.9834124 -0.9843897 0.9998557 0.9834124 -0.984649 0.9998557 0.9834124 -0.9849771 0.9998557 0.9834124 -0.9853921 0.9998557 0.9834124 -0.9859173 0.9998557 0.9834124 -0.9865816 0.9998557 0.9834124 -0.9874221 0.9998557 0.9834124 -0.9884854 0.9998557 0.9834124 -0.9898306 0.9998557 0.9834124 -0.9915325 0.9998557 0.9834124 -0.9936856 0.9998557 0.9834124 -0.9964095 0.9998557 0.9834124 -0.9998557 0.9998557 0.9834124 -0.999886 0.997154 0.9868502 -0.9999099 0.9960345 0.9895818 -0.9999288 0.995789 0.99175 -0.9999437 0.9959966 0.9934694 -0.9868505 0.999886 0.986851 -0.9868505 0.999886 0.986851 -0.9868505 0.999886 0.9868509 -0.9868505 0.999886 0.9868509 -0.9868504 0.999886 0.9868508 -0.9868504 0.999886 0.9868508 -0.9868504 0.999886 0.9868507 -0.9868503 0.999886 0.9868506 -0.9868503 0.999886 0.9868505 -0.9868502 0.999886 0.9868503 -0.9868502 0.999886 0.9868502 -0.9868503 0.999886 0.9868502 -0.9868505 0.999886 0.9868502 -0.9868507 0.999886 0.9868502 -0.986851 0.999886 0.9868502 -0.9868513 0.999886 0.9868502 -0.9868518 0.999886 0.9868502 -0.9868524 0.999886 0.9868502 -0.9868531 0.999886 0.9868502 -0.986854 0.999886 0.9868502 -0.9868552 0.999886 0.9868502 -0.9868567 0.999886 0.9868502 -0.9868585 0.999886 0.9868502 -0.9868609 0.999886 0.9868502 -0.9868639 0.999886 0.9868502 -0.9868676 0.999886 0.9868502 -0.9868724 0.999886 0.9868502 -0.9868785 0.999886 0.9868502 -0.9868861 0.999886 0.9868502 -0.9868958 0.999886 0.9868502 -0.986908 0.999886 0.9868502 -0.9869235 0.999886 0.9868502 -0.986943 0.999886 0.9868502 -0.9869678 0.999886 0.9868502 -0.9869991 0.999886 0.9868502 -0.9870387 0.999886 0.9868502 -0.9870889 0.999886 0.9868502 -0.9871523 0.999886 0.9868502 -0.9872326 0.999886 0.9868502 -0.9873341 0.999886 0.9868502 -0.9874625 0.999886 0.9868502 -0.987625 0.999886 0.9868502 -0.9878306 0.999886 0.9868502 -0.9880907 0.999886 0.9868502 -0.9884198 0.999886 0.9868502 -0.9888361 0.999886 0.9868502 -0.9893627 0.999886 0.9868502 -0.990029 0.999886 0.9868502 -0.990872 0.999886 0.9868502 -0.9919384 0.999886 0.9868502 -0.9932876 0.999886 0.9868502 -0.9949945 0.999886 0.9868502 -0.997154 0.999886 0.9868502 -0.999886 0.999886 0.9868502 -0.9999099 0.9977454 0.9895818 -0.9999288 0.9968599 0.99175 -0.9999437 0.9966667 0.9934694 -0.989582 0.9999099 0.9895823 -0.989582 0.9999099 0.9895823 -0.989582 0.9999099 0.9895823 -0.989582 0.9999099 0.9895822 -0.989582 0.9999099 0.9895822 -0.9895819 0.9999099 0.9895822 -0.9895819 0.9999099 0.9895821 -0.9895819 0.9999099 0.9895821 -0.9895819 0.9999099 0.989582 -0.9895818 0.9999099 0.9895819 -0.9895818 0.9999099 0.9895818 -0.9895819 0.9999099 0.9895818 -0.989582 0.9999099 0.9895818 -0.9895821 0.9999099 0.9895818 -0.9895823 0.9999099 0.9895818 -0.9895825 0.9999099 0.9895818 -0.9895828 0.9999099 0.9895818 -0.9895832 0.9999099 0.9895818 -0.9895836 0.9999099 0.9895818 -0.9895842 0.9999099 0.9895818 -0.9895849 0.9999099 0.9895818 -0.9895859 0.9999099 0.9895818 -0.989587 0.9999099 0.9895818 -0.9895885 0.9999099 0.9895818 -0.9895904 0.9999099 0.9895818 -0.9895927 0.9999099 0.9895818 -0.9895957 0.9999099 0.9895818 -0.9895995 0.9999099 0.9895818 -0.9896043 0.9999099 0.9895818 -0.9896103 0.9999099 0.9895818 -0.989618 0.9999099 0.9895818 -0.9896277 0.9999099 0.9895818 -0.9896399 0.9999099 0.9895818 -0.9896555 0.9999099 0.9895818 -0.9896751 0.9999099 0.9895818 -0.9896999 0.9999099 0.9895818 -0.9897313 0.9999099 0.9895818 -0.989771 0.9999099 0.9895818 -0.9898213 0.9999099 0.9895818 -0.9898849 0.9999099 0.9895818 -0.9899653 0.9999099 0.9895818 -0.9900671 0.9999099 0.9895818 -0.9901958 0.9999099 0.9895818 -0.9903587 0.9999099 0.9895818 -0.9905648 0.9999099 0.9895818 -0.9908255 0.9999099 0.9895818 -0.9911553 0.9999099 0.9895818 -0.9915725 0.9999099 0.9895818 -0.9921004 0.9999099 0.9895818 -0.9927683 0.9999099 0.9895818 -0.9936132 0.9999099 0.9895818 -0.9946822 0.9999099 0.9895818 -0.9960345 0.9999099 0.9895818 -0.9977454 0.9999099 0.9895818 -0.9999099 0.9999099 0.9895818 -0.9999288 0.9982147 0.99175 -0.9999437 0.9975144 0.9934694 -0.9917501 0.9999288 0.9917503 -0.9917501 0.9999288 0.9917503 -0.9917501 0.9999288 0.9917503 -0.9917501 0.9999288 0.9917502 -0.9917501 0.9999288 0.9917502 -0.9917501 0.9999288 0.9917502 -0.99175 0.9999288 0.9917502 -0.99175 0.9999288 0.9917501 -0.99175 0.9999288 0.9917501 -0.99175 0.9999288 0.99175 -0.99175 0.9999288 0.99175 -0.99175 0.9999288 0.99175 -0.9917501 0.9999288 0.99175 -0.9917502 0.9999288 0.99175 -0.9917503 0.9999288 0.99175 -0.9917504 0.9999288 0.99175 -0.9917506 0.9999288 0.99175 -0.9917508 0.9999288 0.99175 -0.9917511 0.9999288 0.99175 -0.9917515 0.9999288 0.99175 -0.9917519 0.9999288 0.99175 -0.9917525 0.9999288 0.99175 -0.9917532 0.9999288 0.99175 -0.9917542 0.9999288 0.99175 -0.9917553 0.9999288 0.99175 -0.9917568 0.9999288 0.99175 -0.9917587 0.9999288 0.99175 -0.991761 0.9999288 0.99175 -0.991764 0.9999288 0.99175 -0.9917678 0.9999288 0.99175 -0.9917726 0.9999288 0.99175 -0.9917787 0.9999288 0.99175 -0.9917864 0.9999288 0.99175 -0.9917961 0.9999288 0.99175 -0.9918083 0.9999288 0.99175 -0.9918239 0.9999288 0.99175 -0.9918435 0.9999288 0.99175 -0.9918684 0.9999288 0.99175 -0.9918999 0.9999288 0.99175 -0.9919397 0.9999288 0.99175 -0.99199 0.9999288 0.99175 -0.9920537 0.9999288 0.99175 -0.9921343 0.9999288 0.99175 -0.9922362 0.9999288 0.99175 -0.9923652 0.9999288 0.99175 -0.9925284 0.9999288 0.99175 -0.9927349 0.9999288 0.99175 -0.992996 0.9999288 0.99175 -0.9933265 0.9999288 0.99175 -0.9937445 0.9999288 0.99175 -0.9942734 0.9999288 0.99175 -0.9949425 0.9999288 0.99175 -0.995789 0.9999288 0.99175 -0.9968599 0.9999288 0.99175 -0.9982147 0.9999288 0.99175 -0.9999288 0.9999288 0.99175 -0.9999437 0.9985869 0.9934694 -0.9934695 0.9999437 0.9934696 -0.9934695 0.9999437 0.9934696 -0.9934695 0.9999437 0.9934696 -0.9934695 0.9999437 0.9934696 -0.9934695 0.9999437 0.9934696 -0.9934695 0.9999437 0.9934696 -0.9934695 0.9999437 0.9934695 -0.9934694 0.9999437 0.9934695 -0.9934694 0.9999437 0.9934695 -0.9934694 0.9999437 0.9934694 -0.9934694 0.9999437 0.9934694 -0.9934694 0.9999437 0.9934694 -0.9934695 0.9999437 0.9934694 -0.9934695 0.9999437 0.9934694 -0.9934696 0.9999437 0.9934694 -0.9934697 0.9999437 0.9934694 -0.9934698 0.9999437 0.9934694 -0.9934699 0.9999437 0.9934694 -0.9934701 0.9999437 0.9934694 -0.9934703 0.9999437 0.9934694 -0.9934706 0.9999437 0.9934694 -0.993471 0.9999437 0.9934694 -0.9934715 0.9999437 0.9934694 -0.993472 0.9999437 0.9934694 -0.9934728 0.9999437 0.9934694 -0.9934737 0.9999437 0.9934694 -0.9934749 0.9999437 0.9934694 -0.9934763 0.9999437 0.9934694 -0.9934782 0.9999437 0.9934694 -0.9934806 0.9999437 0.9934694 -0.9934836 0.9999437 0.9934694 -0.9934874 0.9999437 0.9934694 -0.9934922 0.9999437 0.9934694 -0.9934983 0.9999437 0.9934694 -0.9935059 0.9999437 0.9934694 -0.9935157 0.9999437 0.9934694 -0.993528 0.9999437 0.9934694 -0.9935435 0.9999437 0.9934694 -0.9935632 0.9999437 0.9934694 -0.9935881 0.9999437 0.9934694 -0.9936196 0.9999437 0.9934694 -0.9936595 0.9999437 0.9934694 -0.9937099 0.9999437 0.9934694 -0.9937737 0.9999437 0.9934694 -0.9938544 0.9999437 0.9934694 -0.9939565 0.9999437 0.9934694 -0.9940857 0.9999437 0.9934694 -0.9942491 0.9999437 0.9934694 -0.9944558 0.9999437 0.9934694 -0.9947174 0.9999437 0.9934694 -0.9950483 0.9999437 0.9934694 -0.995467 0.9999437 0.9934694 -0.9959966 0.9999437 0.9934694 -0.9966667 0.9999437 0.9934694 -0.9975144 0.9999437 0.9934694 -0.9985869 0.9999437 0.9934694 -0.9999437 0.9999437 0.9934694 -0.0000238 0.0000238 0.0240255 -0.0005417 0.0000238 0.0240255 -0.0011968 0.0000238 0.0240255 -0.0020256 0.0000238 0.0240255 -0.0030742 0.0000238 0.0240255 -0.0044007 0.0000238 0.0240255 -0.006079 0.0000238 0.0240255 -0.0082023 0.0000238 0.0240255 -0.0108885 0.0000238 0.0240255 -0.0142868 0.0000238 0.0240255 -0.0185862 0.0000238 0.0240255 -0.0240255 0.0000238 0.0240255 -0.0309069 0.0000238 0.0240255 -0.0396127 0.0000238 0.0240255 -0.0506267 0.0000238 0.0240255 -0.0645609 0.0000238 0.0240255 -0.0821895 0.0000238 0.0240255 -0.1044919 0.0000238 0.0240255 -0.1327073 0.0000238 0.0240255 -0.1684036 0.0000238 0.0240255 -0.2135639 0.0000238 0.0240255 -0.2706977 0.0000238 0.0240255 -0.3429792 0.0000238 0.0240255 -0.4344249 0.0000238 0.0240255 -0.5501155 0.0000238 0.0240255 -0.6964791 0.0000238 0.0240255 -0.8407292 0.0051514 0.0278994 -0.9033413 0.0279321 0.0467613 -0.9354466 0.0624569 0.0772936 -0.9545467 0.1059991 0.1173948 -0.9669269 0.1572498 0.1658427 -0.9754027 0.2151269 0.2215035 -0.9814251 0.2783684 0.2830287 -0.9858181 0.3454107 0.3487657 -0.9890841 0.4144197 0.4167992 -0.9915469 0.4834235 0.4850864 -0.993424 0.5504963 0.551642 -0.9948662 0.6139459 0.6147247 -0.9959813 0.6724572 0.67298 -0.9968475 0.7251659 0.725513 -0.997523 0.7716588 0.7718869 -0.9980513 0.8119154 0.8120639 -0.9984653 0.8462171 0.8463131 -0.9987905 0.8750477 0.8751094 -0.9990461 0.8990028 0.8990422 -0.9992474 0.9187175 0.9187426 -0.999406 0.9348153 0.9348312 -0.999531 0.9478754 0.9478854 -0.9996296 0.958416 0.9584223 -0.9997074 0.9668873 0.9668913 -0.9997689 0.9736726 0.9736751 -0.9998174 0.9790927 0.9790943 -0.9998557 0.9834129 0.9834139 -0.999886 0.9868505 0.9868511 -0.9999099 0.989582 0.9895824 -0.9999288 0.9917501 0.9917503 -0.9999437 0.9934695 0.9934696 -0.0000238 0.0005417 0.0240255 -0.0000382 0.0000382 0.023522 -0.0006933 0.0000382 0.023522 -0.0015221 0.0000382 0.023522 -0.0025707 0.0000382 0.023522 -0.0038972 0.0000382 0.023522 -0.0055755 0.0000382 0.023522 -0.0076988 0.0000382 0.023522 -0.0103849 0.0000382 0.023522 -0.0137833 0.0000382 0.023522 -0.0180827 0.0000382 0.023522 -0.023522 0.0000382 0.023522 -0.0304033 0.0000382 0.023522 -0.0391092 0.0000382 0.023522 -0.0501232 0.0000382 0.023522 -0.0640574 0.0000382 0.023522 -0.081686 0.0000382 0.023522 -0.1039884 0.0000382 0.023522 -0.1322038 0.0000382 0.023522 -0.1679 0.0000382 0.023522 -0.2130604 0.0000382 0.023522 -0.2701941 0.0000382 0.023522 -0.3424757 0.0000382 0.023522 -0.4339214 0.0000382 0.023522 -0.549612 0.0000382 0.023522 -0.6959756 0.0000382 0.023522 -0.8405071 0.0051286 0.0273936 -0.9032596 0.0278872 0.0463179 -0.9354101 0.0624063 0.0769284 -0.9545286 0.1059489 0.1171024 -0.9669173 0.1572031 0.165613 -0.9753975 0.2150852 0.2213257 -0.9814221 0.2783325 0.2828931 -0.9858163 0.3453807 0.3486639 -0.9890831 0.4143955 0.416724 -0.9915463 0.4834045 0.4850317 -0.9934236 0.5504818 0.5516029 -0.994866 0.6139352 0.6146972 -0.9959811 0.6724495 0.672961 -0.9968474 0.7251605 0.7255 -0.997523 0.7716551 0.7718782 -0.9980512 0.8119128 0.8120582 -0.9984653 0.8462154 0.8463093 -0.9987905 0.8750466 0.8751069 -0.9990461 0.899002 0.8990406 -0.9992474 0.918717 0.9187416 -0.999406 0.9348149 0.9348305 -0.999531 0.9478752 0.947885 -0.9996296 0.9584159 0.9584221 -0.9997074 0.9668872 0.9668911 -0.9997689 0.9736726 0.973675 -0.9998174 0.9790927 0.9790942 -0.9998557 0.9834129 0.9834139 -0.999886 0.9868505 0.9868511 -0.9999099 0.989582 0.9895824 -0.9999288 0.9917501 0.9917503 -0.9999437 0.9934695 0.9934696 -0.0000238 0.0011968 0.0240255 -0.0000382 0.0006933 0.023522 -0.0000611 0.0000611 0.0228898 -0.0008899 0.0000611 0.0228898 -0.0019385 0.0000611 0.0228898 -0.003265 0.0000611 0.0228898 -0.0049433 0.0000611 0.0228898 -0.0070666 0.0000611 0.0228898 -0.0097527 0.0000611 0.0228898 -0.0131511 0.0000611 0.0228898 -0.0174505 0.0000611 0.0228898 -0.0228898 0.0000611 0.0228898 -0.0297711 0.0000611 0.0228898 -0.038477 0.0000611 0.0228898 -0.049491 0.0000611 0.0228898 -0.0634252 0.0000611 0.0228898 -0.0810538 0.0000611 0.0228898 -0.1033562 0.0000611 0.0228898 -0.1315716 0.0000611 0.0228898 -0.1672678 0.0000611 0.0228898 -0.2124282 0.0000611 0.0228898 -0.2695619 0.0000611 0.0228898 -0.3418435 0.0000611 0.0228898 -0.4332891 0.0000611 0.0228898 -0.5489798 0.0000611 0.0228898 -0.6953434 0.0000611 0.0228898 -0.8402274 0.0051047 0.0267581 -0.9031567 0.0278347 0.0457607 -0.9353643 0.0623458 0.0764695 -0.9545059 0.1058883 0.1167351 -0.9669053 0.1571463 0.1653244 -0.9753908 0.2150342 0.2211023 -0.9814183 0.2782884 0.2827228 -0.9858141 0.3453439 0.348536 -0.9890818 0.4143657 0.4166295 -0.9915455 0.4833811 0.4849631 -0.9934231 0.550464 0.5515539 -0.9948657 0.6139219 0.6146628 -0.9959809 0.6724399 0.6729372 -0.9968473 0.7251537 0.7254838 -0.9975229 0.7716504 0.7718673 -0.9980512 0.8119096 0.8120509 -0.9984653 0.8462132 0.8463046 -0.9987904 0.8750451 0.8751038 -0.9990461 0.8990011 0.8990386 -0.9992474 0.9187164 0.9187403 -0.999406 0.9348146 0.9348297 -0.999531 0.947875 0.9478845 -0.9996296 0.9584157 0.9584217 -0.9997074 0.9668871 0.9668909 -0.9997689 0.9736725 0.9736749 -0.9998174 0.9790927 0.9790942 -0.9998557 0.9834129 0.9834138 -0.999886 0.9868505 0.9868511 -0.9999099 0.989582 0.9895824 -0.9999288 0.9917501 0.9917503 -0.9999437 0.9934695 0.9934696 -0.0000238 0.0020256 0.0240255 -0.0000382 0.0015221 0.023522 -0.0000611 0.0008899 0.0228898 -0.0000978 0.0000978 0.0220976 -0.0011463 0.0000978 0.0220976 -0.0024729 0.0000978 0.0220976 -0.0041512 0.0000978 0.0220976 -0.0062744 0.0000978 0.0220976 -0.0089606 0.0000978 0.0220976 -0.012359 0.0000978 0.0220976 -0.0166583 0.0000978 0.0220976 -0.0220976 0.0000978 0.0220976 -0.028979 0.0000978 0.0220976 -0.0376849 0.0000978 0.0220976 -0.0486989 0.0000978 0.0220976 -0.0626331 0.0000978 0.0220976 -0.0802616 0.0000978 0.0220976 -0.102564 0.0000978 0.0220976 -0.1307795 0.0000978 0.0220976 -0.1664757 0.0000978 0.0220976 -0.2116361 0.0000978 0.0220976 -0.2687698 0.0000978 0.0220976 -0.3410514 0.0000978 0.0220976 -0.432497 0.0000978 0.0220976 -0.5481876 0.0000978 0.0220976 -0.6945513 0.0000978 0.0220976 -0.8398756 0.0050826 0.0259613 -0.9030276 0.0277752 0.0450619 -0.9353068 0.0622749 0.075894 -0.9544774 0.1058162 0.1162746 -0.9668902 0.1570779 0.1649625 -0.9753825 0.2149725 0.2208224 -0.9814136 0.2782347 0.2825094 -0.9858113 0.3452987 0.3483758 -0.9890801 0.414329 0.4165111 -0.9915446 0.4833522 0.484877 -0.9934225 0.5504419 0.5514924 -0.9948653 0.6139056 0.6146196 -0.9959807 0.672428 0.6729073 -0.9968472 0.7251454 0.7254635 -0.9975228 0.7716446 0.7718536 -0.9980511 0.8119057 0.8120419 -0.9984653 0.8462106 0.8462986 -0.9987904 0.8750434 0.8750999 -0.9990461 0.899 0.8990361 -0.9992474 0.9187157 0.9187387 -0.999406 0.9348141 0.9348287 -0.999531 0.9478746 0.9478839 -0.9996296 0.9584155 0.9584213 -0.9997074 0.966887 0.9668907 -0.9997689 0.9736724 0.9736747 -0.9998174 0.9790926 0.979094 -0.9998557 0.9834129 0.9834138 -0.999886 0.9868505 0.986851 -0.9999099 0.989582 0.9895823 -0.9999288 0.9917501 0.9917503 -0.9999437 0.9934695 0.9934696 -0.0000238 0.0030742 0.0240255 -0.0000382 0.0025707 0.023522 -0.0000611 0.0019385 0.0228898 -0.0000978 0.0011463 0.0220976 -0.0001565 0.0001565 0.0211078 -0.001483 0.0001565 0.0211078 -0.0031613 0.0001565 0.0211078 -0.0052846 0.0001565 0.0211078 -0.0079707 0.0001565 0.0211078 -0.0113691 0.0001565 0.0211078 -0.0156685 0.0001565 0.0211078 -0.0211078 0.0001565 0.0211078 -0.0279891 0.0001565 0.0211078 -0.036695 0.0001565 0.0211078 -0.047709 0.0001565 0.0211078 -0.0616432 0.0001565 0.0211078 -0.0792718 0.0001565 0.0211078 -0.1015742 0.0001565 0.0211078 -0.1297896 0.0001565 0.0211078 -0.1654858 0.0001565 0.0211078 -0.2106462 0.0001565 0.0211078 -0.2677799 0.0001565 0.0211078 -0.3400615 0.0001565 0.0211078 -0.4315072 0.0001565 0.0211078 -0.5471978 0.0001565 0.0211078 -0.6935614 0.0001565 0.0211078 -0.8394338 0.0050676 0.0249647 -0.9028657 0.0277111 0.0441875 -0.9352348 0.0621943 0.0751741 -0.9544418 0.1057322 0.1156985 -0.9668714 0.1569971 0.16451 -0.9753721 0.2148987 0.2204723 -0.9814076 0.2781701 0.2822426 -0.9858079 0.3452442 0.3481754 -0.9890781 0.4142845 0.4163631 -0.9915433 0.4833171 0.4847695 -0.9934218 0.550415 0.5514156 -0.9948649 0.6138855 0.6145656 -0.9959804 0.6724135 0.67287 -0.996847 0.7251351 0.7254381 -0.9975227 0.7716375 0.7718366 -0.9980511 0.8119009 0.8120305 -0.9984652 0.8462073 0.8462912 -0.9987904 0.8750412 0.8750951 -0.9990461 0.8989986 0.899033 -0.9992474 0.9187148 0.9187367 -0.999406 0.9348135 0.9348274 -0.999531 0.9478743 0.947883 -0.9996296 0.9584153 0.9584208 -0.9997074 0.9668869 0.9668904 -0.9997689 0.9736723 0.9736745 -0.9998174 0.9790925 0.9790939 -0.9998557 0.9834128 0.9834137 -0.999886 0.9868504 0.986851 -0.9999099 0.989582 0.9895823 -0.9999288 0.9917501 0.9917503 -0.9999437 0.9934695 0.9934696 -0.0000238 0.0044007 0.0240255 -0.0000382 0.0038972 0.023522 -0.0000611 0.003265 0.0228898 -0.0000978 0.0024729 0.0220976 -0.0001565 0.001483 0.0211078 -0.0002504 0.0002504 0.0198752 -0.0019287 0.0002504 0.0198752 -0.004052 0.0002504 0.0198752 -0.0067381 0.0002504 0.0198752 -0.0101365 0.0002504 0.0198752 -0.0144359 0.0002504 0.0198752 -0.0198752 0.0002504 0.0198752 -0.0267565 0.0002504 0.0198752 -0.0354624 0.0002504 0.0198752 -0.0464764 0.0002504 0.0198752 -0.0604106 0.0002504 0.0198752 -0.0780392 0.0002504 0.0198752 -0.1003416 0.0002504 0.0198752 -0.128557 0.0002504 0.0198752 -0.1642532 0.0002504 0.0198752 -0.2094136 0.0002504 0.0198752 -0.2665473 0.0002504 0.0198752 -0.3388289 0.0002504 0.0198752 -0.4302746 0.0002504 0.0198752 -0.5459652 0.0002504 0.0198752 -0.6923288 0.0002504 0.0198752 -0.8388802 0.0050694 0.0237224 -0.9026634 0.0276479 0.0430971 -0.9351449 0.0621069 0.0742763 -0.9543974 0.1056375 0.1149803 -0.9668479 0.156904 0.1639459 -0.9753591 0.2148124 0.220036 -0.9814002 0.2780936 0.28191 -0.9858036 0.3451791 0.3479259 -0.9890755 0.4142311 0.4161787 -0.9915418 0.4832747 0.4846356 -0.9934209 0.5503825 0.5513199 -0.9948643 0.6138613 0.6144984 -0.9959801 0.6723959 0.6728236 -0.9968468 0.7251226 0.7254064 -0.9975226 0.7716288 0.7718153 -0.998051 0.8118949 0.8120164 -0.9984652 0.8462034 0.8462819 -0.9987904 0.8750386 0.8750891 -0.9990461 0.8989969 0.8990291 -0.9992474 0.9187137 0.9187342 -0.9994059 0.9348128 0.9348258 -0.999531 0.9478738 0.947882 -0.9996296 0.958415 0.9584202 -0.9997074 0.9668867 0.9668899 -0.9997689 0.9736722 0.9736743 -0.9998174 0.9790925 0.9790938 -0.9998557 0.9834128 0.9834136 -0.999886 0.9868504 0.9868509 -0.9999099 0.9895819 0.9895823 -0.9999288 0.9917501 0.9917503 -0.9999437 0.9934695 0.9934696 -0.0000238 0.006079 0.0240255 -0.0000382 0.0055755 0.023522 -0.0000611 0.0049433 0.0228898 -0.0000978 0.0041512 0.0220976 -0.0001565 0.0031613 0.0211078 -0.0002504 0.0019287 0.0198752 -0.0004008 0.0004008 0.0183473 -0.0025241 0.0004008 0.0183473 -0.0052103 0.0004008 0.0183473 -0.0086086 0.0004008 0.0183473 -0.012908 0.0004008 0.0183473 -0.0183473 0.0004008 0.0183473 -0.0252287 0.0004008 0.0183473 -0.0339345 0.0004008 0.0183473 -0.0449485 0.0004008 0.0183473 -0.0588827 0.0004008 0.0183473 -0.0765113 0.0004008 0.0183473 -0.0988137 0.0004008 0.0183473 -0.1270291 0.0004008 0.0183473 -0.1627254 0.0004008 0.0183473 -0.2078857 0.0004008 0.0183473 -0.2650195 0.0004008 0.0183473 -0.337301 0.0004008 0.0183473 -0.4287467 0.0004008 0.0183473 -0.5444373 0.0004008 0.0183473 -0.6908009 0.0004008 0.0183473 -0.8381886 0.0051048 0.0221804 -0.9024114 0.0275966 0.0417427 -0.9350332 0.0620199 0.0731615 -0.9543421 0.1055364 0.1140887 -0.9668187 0.1568008 0.1632458 -0.975343 0.2147144 0.2194946 -0.9813911 0.2780055 0.2814975 -0.9857982 0.3451032 0.3476163 -0.9890723 0.4141683 0.4159501 -0.9915399 0.4832246 0.4844695 -0.9934197 0.5503438 0.5512013 -0.9948636 0.6138323 0.6144151 -0.9959797 0.6723748 0.672766 -0.9968465 0.7251076 0.7253672 -0.9975224 0.7716184 0.771789 -0.9980509 0.8118878 0.8119989 -0.9984651 0.8461986 0.8462704 -0.9987903 0.8750355 0.8750816 -0.9990461 0.8989948 0.8990243 -0.9992473 0.9187123 0.9187311 -0.9994059 0.9348119 0.9348238 -0.999531 0.9478733 0.9478808 -0.9996296 0.9584146 0.9584194 -0.9997074 0.9668865 0.9668894 -0.9997689 0.9736721 0.973674 -0.9998174 0.9790924 0.9790936 -0.9998557 0.9834127 0.9834135 -0.999886 0.9868504 0.9868508 -0.9999099 0.9895819 0.9895822 -0.9999288 0.99175 0.9917502 -0.9999437 0.9934695 0.9934696 -0.0000238 0.0082023 0.0240255 -0.0000382 0.0076988 0.023522 -0.0000611 0.0070666 0.0228898 -0.0000978 0.0062744 0.0220976 -0.0001565 0.0052846 0.0211078 -0.0002504 0.004052 0.0198752 -0.0004008 0.0025241 0.0183473 -0.0006416 0.0006416 0.0164648 -0.0033277 0.0006416 0.0164648 -0.0067261 0.0006416 0.0164648 -0.0110255 0.0006416 0.0164648 -0.0164648 0.0006416 0.0164648 -0.0233461 0.0006416 0.0164648 -0.032052 0.0006416 0.0164648 -0.043066 0.0006416 0.0164648 -0.0570002 0.0006416 0.0164648 -0.0746288 0.0006416 0.0164648 -0.0969312 0.0006416 0.0164648 -0.1251466 0.0006416 0.0164648 -0.1608428 0.0006416 0.0164648 -0.2060032 0.0006416 0.0164648 -0.2631369 0.0006416 0.0164648 -0.3354185 0.0006416 0.0164648 -0.4268641 0.0006416 0.0164648 -0.5425548 0.0006416 0.0164648 -0.6889184 0.0006416 0.0164648 -0.8373283 0.0052028 0.0202775 -0.9020992 0.0275778 0.04007 -0.9348949 0.0619473 0.071785 -0.9542739 0.1054384 0.1129881 -0.9667827 0.1566936 0.162382 -0.9753231 0.2146085 0.2188268 -0.9813797 0.2779077 0.2809887 -0.9857916 0.3450175 0.3472345 -0.9890684 0.4140964 0.4156681 -0.9915376 0.4831666 0.4842647 -0.9934183 0.5502987 0.551055 -0.9948628 0.6137984 0.6143124 -0.9959791 0.67235 0.672695 -0.9968462 0.7250899 0.7253189 -0.9975222 0.7716061 0.7717565 -0.9980508 0.8118794 0.8119774 -0.998465 0.8461929 0.8462563 -0.9987903 0.8750317 0.8750724 -0.999046 0.8989923 0.8990183 -0.9992473 0.9187107 0.9187273 -0.9994059 0.9348109 0.9348214 -0.999531 0.9478726 0.9478792 -0.9996296 0.9584142 0.9584184 -0.9997074 0.9668862 0.9668888 -0.9997689 0.9736719 0.9736736 -0.9998174 0.9790923 0.9790933 -0.9998557 0.9834127 0.9834133 -0.999886 0.9868503 0.9868507 -0.9999099 0.9895819 0.9895822 -0.9999288 0.99175 0.9917502 -0.9999437 0.9934694 0.9934695 -0.0000238 0.0108885 0.0240255 -0.0000382 0.0103849 0.023522 -0.0000611 0.0097527 0.0228898 -0.0000978 0.0089606 0.0220976 -0.0001565 0.0079707 0.0211078 -0.0002504 0.0067381 0.0198752 -0.0004008 0.0052103 0.0183473 -0.0006416 0.0033277 0.0164648 -0.0010268 0.0010268 0.0141639 -0.0044252 0.0010268 0.0141639 -0.0087246 0.0010268 0.0141639 -0.0141639 0.0010268 0.0141639 -0.0210452 0.0010268 0.0141639 -0.0297511 0.0010268 0.0141639 -0.0407651 0.0010268 0.0141639 -0.0546993 0.0010268 0.0141639 -0.0723279 0.0010268 0.0141639 -0.0946303 0.0010268 0.0141639 -0.1228457 0.0010268 0.0141639 -0.1585419 0.0010268 0.0141639 -0.2037023 0.0010268 0.0141639 -0.260836 0.0010268 0.0141639 -0.3331176 0.0010268 0.0141639 -0.4245633 0.0010268 0.0141639 -0.5402539 0.0010268 0.0141639 -0.6866175 0.0010268 0.0141639 -0.8362644 0.0054121 0.017947 -0.9017148 0.0276281 0.0380196 -0.9347252 0.061916 0.0700979 -0.9541902 0.1053624 0.1116399 -0.9667385 0.1565954 0.1613241 -0.9752987 0.2145034 0.2180092 -0.9813659 0.2778058 0.2803661 -0.9857835 0.3449254 0.3467674 -0.9890637 0.4140176 0.4153232 -0.9915347 0.4831021 0.4840142 -0.9934166 0.550248 0.5508762 -0.9948617 0.6137599 0.6141868 -0.9959785 0.6723217 0.6726082 -0.9968458 0.7250697 0.7252598 -0.997522 0.7715919 0.7717168 -0.9980506 0.8118697 0.811951 -0.9984649 0.8461864 0.846239 -0.9987902 0.8750274 0.8750611 -0.999046 0.8989895 0.8990111 -0.9992473 0.9187089 0.9187226 -0.9994059 0.9348097 0.9348184 -0.999531 0.9478718 0.9478773 -0.9996296 0.9584137 0.9584172 -0.9997074 0.9668859 0.9668881 -0.9997689 0.9736717 0.9736731 -0.9998174 0.9790921 0.979093 -0.9998557 0.9834126 0.9834131 -0.999886 0.9868503 0.9868506 -0.9999099 0.9895819 0.9895821 -0.9999288 0.99175 0.9917501 -0.9999437 0.9934694 0.9934695 -0.0000238 0.0142868 0.0240255 -0.0000382 0.0137833 0.023522 -0.0000611 0.0131511 0.0228898 -0.0000978 0.012359 0.0220976 -0.0001565 0.0113691 0.0211078 -0.0002504 0.0101365 0.0198752 -0.0004008 0.0086086 0.0183473 -0.0006416 0.0067261 0.0164648 -0.0010268 0.0044252 0.0141639 -0.0016435 0.0016435 0.0113822 -0.0059429 0.0016435 0.0113822 -0.0113822 0.0016435 0.0113822 -0.0182636 0.0016435 0.0113822 -0.0269694 0.0016435 0.0113822 -0.0379834 0.0016435 0.0113822 -0.0519176 0.0016435 0.0113822 -0.0695462 0.0016435 0.0113822 -0.0918486 0.0016435 0.0113822 -0.120064 0.0016435 0.0113822 -0.1557603 0.0016435 0.0113822 -0.2009206 0.0016435 0.0113822 -0.2580543 0.0016435 0.0113822 -0.3303359 0.0016435 0.0113822 -0.4217816 0.0016435 0.0113822 -0.5374722 0.0016435 0.0113822 -0.6838358 0.0016435 0.0113822 -0.8349593 0.0058134 0.015123 -0.9012461 0.0278105 0.0355319 -0.9345187 0.0619734 0.0680517 -0.9540886 0.1053433 0.1100054 -0.966685 0.1565315 0.1600423 -0.9752692 0.2144168 0.217019 -0.9813491 0.2777122 0.2796122 -0.9857738 0.3448353 0.346202 -0.9890579 0.4139373 0.4149059 -0.9915312 0.4830346 0.4837112 -0.9934145 0.5501939 0.5506598 -0.9948604 0.6137183 0.6140348 -0.9959777 0.6722907 0.6725032 -0.9968453 0.7250473 0.7251883 -0.9975217 0.7715762 0.7716688 -0.9980504 0.8118589 0.8119192 -0.9984648 0.8461791 0.8462181 -0.9987902 0.8750225 0.8750475 -0.9990459 0.8989863 0.8990023 -0.9992473 0.9187068 0.918717 -0.9994059 0.9348083 0.9348148 -0.9995309 0.947871 0.947875 -0.9996296 0.9584132 0.9584157 -0.9997074 0.9668855 0.9668872 -0.9997689 0.9736715 0.9736725 -0.9998174 0.979092 0.9790926 -0.9998557 0.9834125 0.9834129 -0.999886 0.9868502 0.9868505 -0.9999099 0.9895818 0.989582 -0.9999288 0.99175 0.9917501 -0.9999437 0.9934694 0.9934695 -0.0000238 0.0185862 0.0240255 -0.0000382 0.0180827 0.023522 -0.0000611 0.0174505 0.0228898 -0.0000978 0.0166583 0.0220976 -0.0001565 0.0156685 0.0211078 -0.0002504 0.0144359 0.0198752 -0.0004008 0.012908 0.0183473 -0.0006416 0.0110255 0.0164648 -0.0010268 0.0087246 0.0141639 -0.0016435 0.0059429 0.0113822 -0.0026305 0.0026305 0.0080698 -0.0080698 0.0026305 0.0080698 -0.0149512 0.0026305 0.0080698 -0.023657 0.0026305 0.0080698 -0.0346711 0.0026305 0.0080698 -0.0486053 0.0026305 0.0080698 -0.0662338 0.0026305 0.0080698 -0.0885362 0.0026305 0.0080698 -0.1167517 0.0026305 0.0080698 -0.1524479 0.0026305 0.0080698 -0.1976083 0.0026305 0.0080698 -0.254742 0.0026305 0.0080698 -0.3270236 0.0026305 0.0080698 -0.4184692 0.0026305 0.0080698 -0.5341598 0.0026305 0.0080698 -0.6805235 0.0026305 0.0080698 -0.8333779 0.0065402 0.0117512 -0.900682 0.0282324 0.032557 -0.9342712 0.062202 0.0656055 -0.9539671 0.1054431 0.1080526 -0.9666211 0.1565473 0.1585117 -0.975234 0.2143816 0.2158372 -0.9813291 0.2776503 0.2787128 -0.9857621 0.3447636 0.3455277 -0.989051 0.4138668 0.4144083 -0.9915271 0.4829718 0.48335 -0.993412 0.5501416 0.550402 -0.9948589 0.6136769 0.6138538 -0.9959768 0.6722594 0.6723781 -0.9968448 0.7250244 0.7251031 -0.9975213 0.7715599 0.7716116 -0.9980502 0.8118476 0.8118813 -0.9984647 0.8461714 0.8461932 -0.9987901 0.8750173 0.8750313 -0.9990459 0.8989829 0.8989918 -0.9992472 0.9187045 0.9187102 -0.9994059 0.9348069 0.9348105 -0.9995309 0.94787 0.9478723 -0.9996296 0.9584126 0.958414 -0.9997074 0.9668852 0.9668861 -0.9997689 0.9736712 0.9736718 -0.9998174 0.9790919 0.9790922 -0.9998557 0.9834124 0.9834126 -0.999886 0.9868502 0.9868503 -0.9999099 0.9895818 0.9895819 -0.9999288 0.99175 0.99175 -0.9999437 0.9934694 0.9934694 -0.0000238 0.0240255 0.0240255 -0.0000382 0.023522 0.023522 -0.0000611 0.0228898 0.0228898 -0.0000978 0.0220976 0.0220976 -0.0001565 0.0211078 0.0211078 -0.0002504 0.0198752 0.0198752 -0.0004008 0.0183473 0.0183473 -0.0006416 0.0164648 0.0164648 -0.0010268 0.0141639 0.0141639 -0.0016435 0.0113822 0.0113822 -0.0026305 0.0080698 0.0080698 -0.0042103 0.0042103 0.0042103 -0.0110917 0.0042103 0.0042103 -0.0197975 0.0042103 0.0042103 -0.0308116 0.0042103 0.0042103 -0.0447458 0.0042103 0.0042103 -0.0623743 0.0042103 0.0042103 -0.0846767 0.0042103 0.0042103 -0.1128922 0.0042103 0.0042103 -0.1485884 0.0042103 0.0042103 -0.1937488 0.0042103 0.0042103 -0.2508825 0.0042103 0.0042103 -0.3231641 0.0042103 0.0042103 -0.4146097 0.0042103 0.0042103 -0.5303003 0.0042103 0.0042103 -0.676664 0.0042103 0.0042103 -0.8314967 0.0078103 0.0078103 -0.9000167 0.0290732 0.0290732 -0.9339805 0.062742 0.062742 -0.9538247 0.1057683 0.1057683 -0.9665463 0.1567226 0.1567226 -0.9751928 0.2144566 0.2144566 -0.9813057 0.2776626 0.2776626 -0.9857485 0.3447407 0.3447407 -0.989043 0.4138277 0.4138277 -0.9915223 0.4829286 0.4829286 -0.9934091 0.5501012 0.5501012 -0.9948571 0.6136427 0.6136427 -0.9959757 0.6722322 0.6722322 -0.9968441 0.7250039 0.7250039 -0.9975209 0.7715449 0.7715449 -0.99805 0.811837 0.811837 -0.9984645 0.8461641 0.8461641 -0.99879 0.8750124 0.8750124 -0.9990458 0.8989796 0.8989796 -0.9992472 0.9187024 0.9187024 -0.9994059 0.9348055 0.9348055 -0.9995309 0.9478691 0.9478691 -0.9996296 0.958412 0.958412 -0.9997074 0.9668848 0.9668848 -0.9997689 0.973671 0.973671 -0.9998174 0.9790917 0.9790917 -0.9998557 0.9834123 0.9834123 -0.999886 0.9868501 0.9868501 -0.9999099 0.9895818 0.9895818 -0.9999288 0.9917499 0.9917499 -0.9999437 0.9934694 0.9934694 -0.0000238 0.0309069 0.0240255 -0.0000382 0.0304033 0.023522 -0.0000611 0.0297711 0.0228898 -0.0000978 0.028979 0.0220976 -0.0001565 0.0279891 0.0211078 -0.0002504 0.0267565 0.0198752 -0.0004008 0.0252287 0.0183473 -0.0006416 0.0233461 0.0164648 -0.0010268 0.0210452 0.0141639 -0.0016435 0.0182636 0.0113822 -0.0026305 0.0149512 0.0080698 -0.0042103 0.0110917 0.0042103 -0.0110917 0.0110917 0.0042103 -0.0197975 0.0110917 0.0042103 -0.0308116 0.0110917 0.0042103 -0.0447458 0.0110917 0.0042103 -0.0623743 0.0110917 0.0042103 -0.0846767 0.0110917 0.0042103 -0.1128922 0.0110917 0.0042103 -0.1485884 0.0110917 0.0042103 -0.1937488 0.0110917 0.0042103 -0.2508825 0.0110917 0.0042103 -0.3231641 0.0110917 0.0042103 -0.4146097 0.0110917 0.0042103 -0.5303003 0.0110917 0.0042103 -0.676664 0.0110917 0.0042103 -0.8314967 0.0144193 0.0078103 -0.9000167 0.0345622 0.0290732 -0.9339805 0.0670606 0.062742 -0.9538247 0.1090781 0.1057683 -0.9665463 0.1592131 0.1567226 -0.9751928 0.2163014 0.2144566 -0.9813057 0.2790088 0.2776626 -0.9857485 0.3457085 0.3447407 -0.989043 0.4145133 0.4138277 -0.9915223 0.4834073 0.4829286 -0.9934091 0.5504308 0.5501012 -0.9948571 0.6138666 0.6136427 -0.9959757 0.6723825 0.6722322 -0.9968441 0.7251035 0.7250039 -0.9975209 0.7716104 0.7715449 -0.99805 0.8118797 0.811837 -0.9984645 0.8461917 0.8461641 -0.99879 0.8750301 0.8750124 -0.9990458 0.8989909 0.8989796 -0.9992472 0.9187096 0.9187024 -0.9994059 0.9348101 0.9348055 -0.9995309 0.947872 0.9478691 -0.9996296 0.9584138 0.958412 -0.9997074 0.9668859 0.9668848 -0.9997689 0.9736717 0.973671 -0.9998174 0.9790922 0.9790917 -0.9998557 0.9834126 0.9834123 -0.999886 0.9868503 0.9868501 -0.9999099 0.9895819 0.9895818 -0.9999288 0.99175 0.9917499 -0.9999437 0.9934694 0.9934694 -0.0000238 0.0396127 0.0240255 -0.0000382 0.0391092 0.023522 -0.0000611 0.038477 0.0228898 -0.0000978 0.0376849 0.0220976 -0.0001565 0.036695 0.0211078 -0.0002504 0.0354624 0.0198752 -0.0004008 0.0339345 0.0183473 -0.0006416 0.032052 0.0164648 -0.0010268 0.0297511 0.0141639 -0.0016435 0.0269694 0.0113822 -0.0026305 0.023657 0.0080698 -0.0042103 0.0197975 0.0042103 -0.0110917 0.0197975 0.0042103 -0.0197975 0.0197975 0.0042103 -0.0308116 0.0197975 0.0042103 -0.0447458 0.0197975 0.0042103 -0.0623743 0.0197975 0.0042103 -0.0846767 0.0197975 0.0042103 -0.1128922 0.0197975 0.0042103 -0.1485884 0.0197975 0.0042103 -0.1937488 0.0197975 0.0042103 -0.2508825 0.0197975 0.0042103 -0.3231641 0.0197975 0.0042103 -0.4146097 0.0197975 0.0042103 -0.5303003 0.0197975 0.0042103 -0.676664 0.0197975 0.0042103 -0.8314967 0.0227807 0.0078103 -0.9000167 0.0415064 0.0290732 -0.9339805 0.0725241 0.062742 -0.9538247 0.1132654 0.1057683 -0.9665463 0.1623639 0.1567226 -0.9751928 0.2186353 0.2144566 -0.9813057 0.2807118 0.2776626 -0.9857485 0.346933 0.3447407 -0.989043 0.4153808 0.4138277 -0.9915223 0.484013 0.4829286 -0.9934091 0.5508478 0.5501012 -0.9948571 0.6141499 0.6136427 -0.9959757 0.6725725 0.6722322 -0.9968441 0.7252297 0.7250039 -0.9975209 0.7716932 0.7715449 -0.99805 0.8119336 0.811837 -0.9984645 0.8462265 0.8461641 -0.99879 0.8750525 0.8750124 -0.9990458 0.8990052 0.8989796 -0.9992472 0.9187187 0.9187024 -0.9994059 0.9348158 0.9348055 -0.9995309 0.9478757 0.9478691 -0.9996296 0.9584161 0.958412 -0.9997074 0.9668874 0.9668848 -0.9997689 0.9736726 0.973671 -0.9998174 0.9790927 0.9790917 -0.9998557 0.9834129 0.9834123 -0.999886 0.9868505 0.9868501 -0.9999099 0.989582 0.9895818 -0.9999288 0.9917501 0.9917499 -0.9999437 0.9934695 0.9934694 -0.0000238 0.0506267 0.0240255 -0.0000382 0.0501232 0.023522 -0.0000611 0.049491 0.0228898 -0.0000978 0.0486989 0.0220976 -0.0001565 0.047709 0.0211078 -0.0002504 0.0464764 0.0198752 -0.0004008 0.0449485 0.0183473 -0.0006416 0.043066 0.0164648 -0.0010268 0.0407651 0.0141639 -0.0016435 0.0379834 0.0113822 -0.0026305 0.0346711 0.0080698 -0.0042103 0.0308116 0.0042103 -0.0110917 0.0308116 0.0042103 -0.0197975 0.0308116 0.0042103 -0.0308116 0.0308116 0.0042103 -0.0447458 0.0308116 0.0042103 -0.0623743 0.0308116 0.0042103 -0.0846767 0.0308116 0.0042103 -0.1128922 0.0308116 0.0042103 -0.1485884 0.0308116 0.0042103 -0.1937488 0.0308116 0.0042103 -0.2508825 0.0308116 0.0042103 -0.3231641 0.0308116 0.0042103 -0.4146097 0.0308116 0.0042103 -0.5303003 0.0308116 0.0042103 -0.676664 0.0308116 0.0042103 -0.8314967 0.0333589 0.0078103 -0.9000167 0.0502918 0.0290732 -0.9339805 0.0794363 0.062742 -0.9538247 0.1185628 0.1057683 -0.9665463 0.1663501 0.1567226 -0.9751928 0.2215879 0.2144566 -0.9813057 0.2828664 0.2776626 -0.9857485 0.3484821 0.3447407 -0.989043 0.4164783 0.4138277 -0.9915223 0.4847793 0.4829286 -0.9934091 0.5513754 0.5501012 -0.9948571 0.6145083 0.6136427 -0.9959757 0.672813 0.6722322 -0.9968441 0.7253892 0.7250039 -0.9975209 0.771798 0.7715449 -0.99805 0.8120018 0.811837 -0.9984645 0.8462707 0.8461641 -0.99879 0.8750809 0.8750124 -0.9990458 0.8990233 0.8989796 -0.9992472 0.9187302 0.9187024 -0.9994059 0.9348231 0.9348055 -0.9995309 0.9478803 0.9478691 -0.9996296 0.958419 0.958412 -0.9997074 0.9668892 0.9668848 -0.9997689 0.9736738 0.973671 -0.9998174 0.9790935 0.9790917 -0.9998557 0.9834134 0.9834123 -0.999886 0.9868508 0.9868501 -0.9999099 0.9895822 0.9895818 -0.9999288 0.9917502 0.9917499 -0.9999437 0.9934696 0.9934694 -0.0000238 0.0645609 0.0240255 -0.0000382 0.0640574 0.023522 -0.0000611 0.0634252 0.0228898 -0.0000978 0.0626331 0.0220976 -0.0001565 0.0616432 0.0211078 -0.0002504 0.0604106 0.0198752 -0.0004008 0.0588827 0.0183473 -0.0006416 0.0570002 0.0164648 -0.0010268 0.0546993 0.0141639 -0.0016435 0.0519176 0.0113822 -0.0026305 0.0486053 0.0080698 -0.0042103 0.0447458 0.0042103 -0.0110917 0.0447458 0.0042103 -0.0197975 0.0447458 0.0042103 -0.0308116 0.0447458 0.0042103 -0.0447458 0.0447458 0.0042103 -0.0623743 0.0447458 0.0042103 -0.0846767 0.0447458 0.0042103 -0.1128922 0.0447458 0.0042103 -0.1485884 0.0447458 0.0042103 -0.1937488 0.0447458 0.0042103 -0.2508825 0.0447458 0.0042103 -0.3231641 0.0447458 0.0042103 -0.4146097 0.0447458 0.0042103 -0.5303003 0.0447458 0.0042103 -0.676664 0.0447458 0.0042103 -0.8314967 0.0467417 0.0078103 -0.9000167 0.0614064 0.0290732 -0.9339805 0.088181 0.062742 -0.9538247 0.1252648 0.1057683 -0.9665463 0.1713932 0.1567226 -0.9751928 0.2253234 0.2144566 -0.9813057 0.2855923 0.2776626 -0.9857485 0.350442 0.3447407 -0.989043 0.4178668 0.4138277 -0.9915223 0.4857488 0.4829286 -0.9934091 0.5520428 0.5501012 -0.9948571 0.6149617 0.6136427 -0.9959757 0.6731172 0.6722322 -0.9968441 0.725591 0.7250039 -0.9975209 0.7719306 0.7715449 -0.99805 0.8120882 0.811837 -0.9984645 0.8463265 0.8461641 -0.99879 0.8751167 0.8750124 -0.9990458 0.8990462 0.8989796 -0.9992472 0.9187448 0.9187024 -0.9994059 0.9348324 0.9348055 -0.9995309 0.9478861 0.9478691 -0.9996296 0.9584227 0.958412 -0.9997074 0.9668915 0.9668848 -0.9997689 0.9736753 0.973671 -0.9998174 0.9790944 0.9790917 -0.9998557 0.983414 0.9834123 -0.999886 0.9868511 0.9868501 -0.9999099 0.9895824 0.9895818 -0.9999288 0.9917503 0.9917499 -0.9999437 0.9934696 0.9934694 -0.0000238 0.0821895 0.0240255 -0.0000382 0.081686 0.023522 -0.0000611 0.0810538 0.0228898 -0.0000978 0.0802616 0.0220976 -0.0001565 0.0792718 0.0211078 -0.0002504 0.0780392 0.0198752 -0.0004008 0.0765113 0.0183473 -0.0006416 0.0746288 0.0164648 -0.0010268 0.0723279 0.0141639 -0.0016435 0.0695462 0.0113822 -0.0026305 0.0662338 0.0080698 -0.0042103 0.0623743 0.0042103 -0.0110917 0.0623743 0.0042103 -0.0197975 0.0623743 0.0042103 -0.0308116 0.0623743 0.0042103 -0.0447458 0.0623743 0.0042103 -0.0623743 0.0623743 0.0042103 -0.0846767 0.0623743 0.0042103 -0.1128922 0.0623743 0.0042103 -0.1485884 0.0623743 0.0042103 -0.1937488 0.0623743 0.0042103 -0.2508825 0.0623743 0.0042103 -0.3231641 0.0623743 0.0042103 -0.4146097 0.0623743 0.0042103 -0.5303003 0.0623743 0.0042103 -0.676664 0.0623743 0.0042103 -0.8314967 0.0636727 0.0078103 -0.9000167 0.0754678 0.0290732 -0.9339805 0.0992443 0.062742 -0.9538247 0.1337437 0.1057683 -0.9665463 0.1777733 0.1567226 -0.9751928 0.2300493 0.2144566 -0.9813057 0.2890408 0.2776626 -0.9857485 0.3529214 0.3447407 -0.989043 0.4196234 0.4138277 -0.9915223 0.4869753 0.4829286 -0.9934091 0.5528872 0.5501012 -0.9948571 0.6155353 0.6136427 -0.9959757 0.6735021 0.6722322 -0.9968441 0.7258464 0.7250039 -0.9975209 0.7720984 0.7715449 -0.99805 0.8121974 0.811837 -0.9984645 0.8463971 0.8461641 -0.99879 0.875162 0.8750124 -0.9990458 0.8990752 0.8989796 -0.9992472 0.9187632 0.9187024 -0.9994059 0.9348441 0.9348055 -0.9995309 0.9478935 0.9478691 -0.9996296 0.9584274 0.958412 -0.9997074 0.9668945 0.9668848 -0.9997689 0.9736771 0.973671 -0.9998174 0.9790955 0.9790917 -0.9998557 0.9834147 0.9834123 -0.999886 0.9868516 0.9868501 -0.9999099 0.9895827 0.9895818 -0.9999288 0.9917505 0.9917499 -0.9999437 0.9934698 0.9934694 -0.0000238 0.1044919 0.0240255 -0.0000382 0.1039884 0.023522 -0.0000611 0.1033562 0.0228898 -0.0000978 0.102564 0.0220976 -0.0001565 0.1015742 0.0211078 -0.0002504 0.1003416 0.0198752 -0.0004008 0.0988137 0.0183473 -0.0006416 0.0969312 0.0164648 -0.0010268 0.0946303 0.0141639 -0.0016435 0.0918486 0.0113822 -0.0026305 0.0885362 0.0080698 -0.0042103 0.0846767 0.0042103 -0.0110917 0.0846767 0.0042103 -0.0197975 0.0846767 0.0042103 -0.0308116 0.0846767 0.0042103 -0.0447458 0.0846767 0.0042103 -0.0623743 0.0846767 0.0042103 -0.0846767 0.0846767 0.0042103 -0.1128922 0.0846767 0.0042103 -0.1485884 0.0846767 0.0042103 -0.1937488 0.0846767 0.0042103 -0.2508825 0.0846767 0.0042103 -0.3231641 0.0846767 0.0042103 -0.4146097 0.0846767 0.0042103 -0.5303003 0.0846767 0.0042103 -0.676664 0.0846767 0.0042103 -0.8314967 0.0850926 0.0078103 -0.9000167 0.0932573 0.0290732 -0.9339805 0.1132408 0.062742 -0.9538247 0.1444705 0.1057683 -0.9665463 0.185845 0.1567226 -0.9751928 0.2360282 0.2144566 -0.9813057 0.2934037 0.2776626 -0.9857485 0.3560582 0.3447407 -0.989043 0.4218457 0.4138277 -0.9915223 0.488527 0.4829286 -0.9934091 0.5539555 0.5501012 -0.9948571 0.616261 0.6136427 -0.9959757 0.673989 0.6722322 -0.9968441 0.7261694 0.7250039 -0.9975209 0.7723106 0.7715449 -0.99805 0.8123356 0.811837 -0.9984645 0.8464864 0.8461641 -0.99879 0.8752194 0.8750124 -0.9990458 0.8991118 0.8989796 -0.9992472 0.9187865 0.9187024 -0.9994059 0.9348588 0.9348055 -0.9995309 0.9479029 0.9478691 -0.9996296 0.9584333 0.958412 -0.9997074 0.9668982 0.9668848 -0.9997689 0.9736794 0.973671 -0.9998174 0.979097 0.9790917 -0.9998557 0.9834156 0.9834123 -0.999886 0.9868522 0.9868501 -0.9999099 0.9895831 0.9895818 -0.9999288 0.9917507 0.9917499 -0.9999437 0.9934699 0.9934694 -0.0000238 0.1327073 0.0240255 -0.0000382 0.1322038 0.023522 -0.0000611 0.1315716 0.0228898 -0.0000978 0.1307795 0.0220976 -0.0001565 0.1297896 0.0211078 -0.0002504 0.128557 0.0198752 -0.0004008 0.1270291 0.0183473 -0.0006416 0.1251466 0.0164648 -0.0010268 0.1228457 0.0141639 -0.0016435 0.120064 0.0113822 -0.0026305 0.1167517 0.0080698 -0.0042103 0.1128922 0.0042103 -0.0110917 0.1128922 0.0042103 -0.0197975 0.1128922 0.0042103 -0.0308116 0.1128922 0.0042103 -0.0447458 0.1128922 0.0042103 -0.0623743 0.1128922 0.0042103 -0.0846767 0.1128922 0.0042103 -0.1128922 0.1128922 0.0042103 -0.1485884 0.1128922 0.0042103 -0.1937488 0.1128922 0.0042103 -0.2508825 0.1128922 0.0042103 -0.3231641 0.1128922 0.0042103 -0.4146097 0.1128922 0.0042103 -0.5303003 0.1128922 0.0042103 -0.676664 0.1128922 0.0042103 -0.8314967 0.1121916 0.0078103 -0.9000167 0.1157634 0.0290732 -0.9339805 0.1309481 0.062742 -0.9538247 0.1580414 0.1057683 -0.9665463 0.1960568 0.1567226 -0.9751928 0.2435923 0.2144566 -0.9813057 0.2989233 0.2776626 -0.9857485 0.3600267 0.3447407 -0.989043 0.4246572 0.4138277 -0.9915223 0.49049 0.4829286 -0.9934091 0.555307 0.5501012 -0.9948571 0.617179 0.6136427 -0.9959757 0.674605 0.6722322 -0.9968441 0.7265781 0.7250039 -0.9975209 0.772579 0.7715449 -0.99805 0.8125104 0.811837 -0.9984645 0.8465994 0.8461641 -0.99879 0.875292 0.8750124 -0.9990458 0.8991582 0.8989796 -0.9992472 0.918816 0.9187024 -0.9994059 0.9348775 0.9348055 -0.9995309 0.9479147 0.9478691 -0.9996296 0.9584407 0.958412 -0.9997074 0.9669029 0.9668848 -0.9997689 0.9736824 0.973671 -0.9998174 0.9790988 0.9790917 -0.9998557 0.9834168 0.9834123 -0.999886 0.9868529 0.9868501 -0.9999099 0.9895835 0.9895818 -0.9999288 0.991751 0.9917499 -0.9999437 0.9934701 0.9934694 -0.0000238 0.1684036 0.0240255 -0.0000382 0.1679 0.023522 -0.0000611 0.1672678 0.0228898 -0.0000978 0.1664757 0.0220976 -0.0001565 0.1654858 0.0211078 -0.0002504 0.1642532 0.0198752 -0.0004008 0.1627254 0.0183473 -0.0006416 0.1608428 0.0164648 -0.0010268 0.1585419 0.0141639 -0.0016435 0.1557603 0.0113822 -0.0026305 0.1524479 0.0080698 -0.0042103 0.1485884 0.0042103 -0.0110917 0.1485884 0.0042103 -0.0197975 0.1485884 0.0042103 -0.0308116 0.1485884 0.0042103 -0.0447458 0.1485884 0.0042103 -0.0623743 0.1485884 0.0042103 -0.0846767 0.1485884 0.0042103 -0.1128922 0.1485884 0.0042103 -0.1485884 0.1485884 0.0042103 -0.1937488 0.1485884 0.0042103 -0.2508825 0.1485884 0.0042103 -0.3231641 0.1485884 0.0042103 -0.4146097 0.1485884 0.0042103 -0.5303003 0.1485884 0.0042103 -0.676664 0.1485884 0.0042103 -0.8314967 0.1464753 0.0078103 -0.9000167 0.1442365 0.0290732 -0.9339805 0.1533502 0.062742 -0.9538247 0.1752103 0.1057683 -0.9665463 0.208976 0.1567226 -0.9751928 0.2531618 0.2144566 -0.9813057 0.3059062 0.2776626 -0.9857485 0.3650474 0.3447407 -0.989043 0.4282141 0.4138277 -0.9915223 0.4929736 0.4829286 -0.9934091 0.5570168 0.5501012 -0.9948571 0.6183406 0.6136427 -0.9959757 0.6753843 0.6722322 -0.9968441 0.7270952 0.7250039 -0.9975209 0.7729187 0.7715449 -0.99805 0.8127316 0.811837 -0.9984645 0.8467423 0.8461641 -0.99879 0.8753838 0.8750124 -0.9990458 0.8992169 0.8989796 -0.9992472 0.9188534 0.9187024 -0.9994059 0.9349012 0.9348055 -0.9995309 0.9479296 0.9478691 -0.9996296 0.9584501 0.958412 -0.9997074 0.9669088 0.9668848 -0.9997689 0.9736861 0.973671 -0.9998174 0.9791012 0.9790917 -0.9998557 0.9834182 0.9834123 -0.999886 0.9868538 0.9868501 -0.9999099 0.9895841 0.9895818 -0.9999288 0.9917514 0.9917499 -0.9999437 0.9934703 0.9934694 -0.0000238 0.2135639 0.0240255 -0.0000382 0.2130604 0.023522 -0.0000611 0.2124282 0.0228898 -0.0000978 0.2116361 0.0220976 -0.0001565 0.2106462 0.0211078 -0.0002504 0.2094136 0.0198752 -0.0004008 0.2078857 0.0183473 -0.0006416 0.2060032 0.0164648 -0.0010268 0.2037023 0.0141639 -0.0016435 0.2009206 0.0113822 -0.0026305 0.1976083 0.0080698 -0.0042103 0.1937488 0.0042103 -0.0110917 0.1937488 0.0042103 -0.0197975 0.1937488 0.0042103 -0.0308116 0.1937488 0.0042103 -0.0447458 0.1937488 0.0042103 -0.0623743 0.1937488 0.0042103 -0.0846767 0.1937488 0.0042103 -0.1128922 0.1937488 0.0042103 -0.1485884 0.1937488 0.0042103 -0.1937488 0.1937488 0.0042103 -0.2508825 0.1937488 0.0042103 -0.3231641 0.1937488 0.0042103 -0.4146097 0.1937488 0.0042103 -0.5303003 0.1937488 0.0042103 -0.676664 0.1937488 0.0042103 -0.8314967 0.1898486 0.0078103 -0.9000167 0.1802587 0.0290732 -0.9339805 0.1816918 0.062742 -0.9538247 0.1969312 0.1057683 -0.9665463 0.2253205 0.1567226 -0.9751928 0.2652685 0.2144566 -0.9813057 0.3147406 0.2776626 -0.9857485 0.3713992 0.3447407 -0.989043 0.4327141 0.4138277 -0.9915223 0.4961156 0.4829286 -0.9934091 0.5591799 0.5501012 -0.9948571 0.61981 0.6136427 -0.9959757 0.6763703 0.6722322 -0.9968441 0.7277493 0.7250039 -0.9975209 0.7733484 0.7715449 -0.99805 0.8130114 0.811837 -0.9984645 0.8469232 0.8461641 -0.99879 0.8755 0.8750124 -0.9990458 0.8992911 0.8989796 -0.9992472 0.9189006 0.9187024 -0.9994059 0.9349311 0.9348055 -0.9995309 0.9479486 0.9478691 -0.9996296 0.9584621 0.958412 -0.9997074 0.9669163 0.9668848 -0.9997689 0.9736908 0.973671 -0.9998174 0.9791041 0.9790917 -0.9998557 0.9834201 0.9834123 -0.999886 0.986855 0.9868501 -0.9999099 0.9895848 0.9895818 -0.9999288 0.9917519 0.9917499 -0.9999437 0.9934706 0.9934694 -0.0000238 0.2706977 0.0240255 -0.0000382 0.2701941 0.023522 -0.0000611 0.2695619 0.0228898 -0.0000978 0.2687698 0.0220976 -0.0001565 0.2677799 0.0211078 -0.0002504 0.2665473 0.0198752 -0.0004008 0.2650195 0.0183473 -0.0006416 0.2631369 0.0164648 -0.0010268 0.260836 0.0141639 -0.0016435 0.2580543 0.0113822 -0.0026305 0.254742 0.0080698 -0.0042103 0.2508825 0.0042103 -0.0110917 0.2508825 0.0042103 -0.0197975 0.2508825 0.0042103 -0.0308116 0.2508825 0.0042103 -0.0447458 0.2508825 0.0042103 -0.0623743 0.2508825 0.0042103 -0.0846767 0.2508825 0.0042103 -0.1128922 0.2508825 0.0042103 -0.1485884 0.2508825 0.0042103 -0.1937488 0.2508825 0.0042103 -0.2508825 0.2508825 0.0042103 -0.3231641 0.2508825 0.0042103 -0.4146097 0.2508825 0.0042103 -0.5303003 0.2508825 0.0042103 -0.676664 0.2508825 0.0042103 -0.8314967 0.2447216 0.0078103 -0.9000167 0.2258315 0.0290732 -0.9339805 0.2175476 0.062742 -0.9538247 0.224411 0.1057683 -0.9665463 0.2459984 0.1567226 -0.9751928 0.280585 0.2144566 -0.9813057 0.3259173 0.2776626 -0.9857485 0.379435 0.3447407 -0.989043 0.4384071 0.4138277 -0.9915223 0.5000906 0.4829286 -0.9934091 0.5619166 0.5501012 -0.9948571 0.6216691 0.6136427 -0.9959757 0.6776176 0.6722322 -0.9968441 0.7285769 0.7250039 -0.9975209 0.773892 0.7715449 -0.99805 0.8133654 0.811837 -0.9984645 0.847152 0.8461641 -0.99879 0.875647 0.8750124 -0.9990458 0.899385 0.8989796 -0.9992472 0.9189603 0.9187024 -0.9994059 0.934969 0.9348055 -0.9995309 0.9479725 0.9478691 -0.9996296 0.9584772 0.958412 -0.9997074 0.9669258 0.9668848 -0.9997689 0.9736968 0.973671 -0.9998174 0.9791079 0.9790917 -0.9998557 0.9834224 0.9834123 -0.999886 0.9868565 0.9868501 -0.9999099 0.9895857 0.9895818 -0.9999288 0.9917524 0.9917499 -0.9999437 0.9934709 0.9934694 -0.0000238 0.3429792 0.0240255 -0.0000382 0.3424757 0.023522 -0.0000611 0.3418435 0.0228898 -0.0000978 0.3410514 0.0220976 -0.0001565 0.3400615 0.0211078 -0.0002504 0.3388289 0.0198752 -0.0004008 0.337301 0.0183473 -0.0006416 0.3354185 0.0164648 -0.0010268 0.3331176 0.0141639 -0.0016435 0.3303359 0.0113822 -0.0026305 0.3270236 0.0080698 -0.0042103 0.3231641 0.0042103 -0.0110917 0.3231641 0.0042103 -0.0197975 0.3231641 0.0042103 -0.0308116 0.3231641 0.0042103 -0.0447458 0.3231641 0.0042103 -0.0623743 0.3231641 0.0042103 -0.0846767 0.3231641 0.0042103 -0.1128922 0.3231641 0.0042103 -0.1485884 0.3231641 0.0042103 -0.1937488 0.3231641 0.0042103 -0.2508825 0.3231641 0.0042103 -0.3231641 0.3231641 0.0042103 -0.4146097 0.3231641 0.0042103 -0.5303003 0.3231641 0.0042103 -0.676664 0.3231641 0.0042103 -0.8314967 0.314143 0.0078103 -0.9000167 0.2834869 0.0290732 -0.9339805 0.2629098 0.062742 -0.9538247 0.2591765 0.1057683 -0.9665463 0.2721586 0.1567226 -0.9751928 0.2999624 0.2144566 -0.9813057 0.3400572 0.2776626 -0.9857485 0.3896014 0.3447407 -0.989043 0.4456096 0.4138277 -0.9915223 0.5051196 0.4829286 -0.9934091 0.5653788 0.5501012 -0.9948571 0.624021 0.6136427 -0.9959757 0.6791956 0.6722322 -0.9968441 0.7296238 0.7250039 -0.9975209 0.7745797 0.7715449 -0.99805 0.8138133 0.811837 -0.9984645 0.8474415 0.8461641 -0.99879 0.8758329 0.8750124 -0.9990458 0.8995038 0.8989796 -0.9992472 0.9190359 0.9187024 -0.9994059 0.9350169 0.9348055 -0.9995309 0.9480028 0.9478691 -0.9996296 0.9584963 0.958412 -0.9997074 0.9669378 0.9668848 -0.9997689 0.9737044 0.973671 -0.9998174 0.9791126 0.9790917 -0.9998557 0.9834254 0.9834123 -0.999886 0.9868583 0.9868501 -0.9999099 0.9895869 0.9895818 -0.9999288 0.9917532 0.9917499 -0.9999437 0.9934714 0.9934694 -0.0000238 0.4344249 0.0240255 -0.0000382 0.4339214 0.023522 -0.0000611 0.4332891 0.0228898 -0.0000978 0.432497 0.0220976 -0.0001565 0.4315072 0.0211078 -0.0002504 0.4302746 0.0198752 -0.0004008 0.4287467 0.0183473 -0.0006416 0.4268641 0.0164648 -0.0010268 0.4245633 0.0141639 -0.0016435 0.4217816 0.0113822 -0.0026305 0.4184692 0.0080698 -0.0042103 0.4146097 0.0042103 -0.0110917 0.4146097 0.0042103 -0.0197975 0.4146097 0.0042103 -0.0308116 0.4146097 0.0042103 -0.0447458 0.4146097 0.0042103 -0.0623743 0.4146097 0.0042103 -0.0846767 0.4146097 0.0042103 -0.1128922 0.4146097 0.0042103 -0.1485884 0.4146097 0.0042103 -0.1937488 0.4146097 0.0042103 -0.2508825 0.4146097 0.0042103 -0.3231641 0.4146097 0.0042103 -0.4146097 0.4146097 0.0042103 -0.5303003 0.4146097 0.0042103 -0.676664 0.4146097 0.0042103 -0.8314967 0.4019701 0.0078103 -0.9000167 0.3564286 0.0290732 -0.9339805 0.3202989 0.062742 -0.9538247 0.3031594 0.1057683 -0.9665463 0.3052547 0.1567226 -0.9751928 0.3244773 0.2144566 -0.9813057 0.357946 0.2776626 -0.9857485 0.4024632 0.3447407 -0.989043 0.4547216 0.4138277 -0.9915223 0.5114818 0.4829286 -0.9934091 0.5697589 0.5501012 -0.9948571 0.6269965 0.6136427 -0.9959757 0.6811921 0.6722322 -0.9968441 0.7309484 0.7250039 -0.9975209 0.7754498 0.7715449 -0.99805 0.8143799 0.811837 -0.9984645 0.8478077 0.8461641 -0.99879 0.8760681 0.8750124 -0.9990458 0.8996541 0.8989796 -0.9992472 0.9191315 0.9187024 -0.9994059 0.9350775 0.9348055 -0.9995309 0.9480411 0.9478691 -0.9996296 0.9585204 0.958412 -0.9997074 0.966953 0.9668848 -0.9997689 0.9737139 0.973671 -0.9998174 0.9791186 0.9790917 -0.9998557 0.9834292 0.9834123 -0.999886 0.9868607 0.9868501 -0.9999099 0.9895884 0.9895818 -0.9999288 0.9917541 0.9917499 -0.9999437 0.993472 0.9934694 -0.0000238 0.5501155 0.0240255 -0.0000382 0.549612 0.023522 -0.0000611 0.5489798 0.0228898 -0.0000978 0.5481876 0.0220976 -0.0001565 0.5471978 0.0211078 -0.0002504 0.5459652 0.0198752 -0.0004008 0.5444373 0.0183473 -0.0006416 0.5425548 0.0164648 -0.0010268 0.5402539 0.0141639 -0.0016435 0.5374722 0.0113822 -0.0026305 0.5341598 0.0080698 -0.0042103 0.5303003 0.0042103 -0.0110917 0.5303003 0.0042103 -0.0197975 0.5303003 0.0042103 -0.0308116 0.5303003 0.0042103 -0.0447458 0.5303003 0.0042103 -0.0623743 0.5303003 0.0042103 -0.0846767 0.5303003 0.0042103 -0.1128922 0.5303003 0.0042103 -0.1485884 0.5303003 0.0042103 -0.1937488 0.5303003 0.0042103 -0.2508825 0.5303003 0.0042103 -0.3231641 0.5303003 0.0042103 -0.4146097 0.5303003 0.0042103 -0.5303003 0.5303003 0.0042103 -0.676664 0.5303003 0.0042103 -0.8314967 0.5130828 0.0078103 -0.9000167 0.4487093 0.0290732 -0.9339805 0.3929036 0.062742 -0.9538247 0.3588035 0.1057683 -0.9665463 0.3471256 0.1567226 -0.9751928 0.3554919 0.2144566 -0.9813057 0.3805778 0.2776626 -0.9857485 0.4187351 0.3447407 -0.989043 0.4662495 0.4138277 -0.9915223 0.5195309 0.4829286 -0.9934091 0.5753003 0.5501012 -0.9948571 0.6307609 0.6136427 -0.9959757 0.6837178 0.6722322 -0.9968441 0.7326242 0.7250039 -0.9975209 0.7765506 0.7715449 -0.99805 0.8150967 0.811837 -0.9984645 0.848271 0.8461641 -0.99879 0.8763657 0.8750124 -0.9990458 0.8998443 0.8989796 -0.9992472 0.9192525 0.9187024 -0.9994059 0.9351542 0.9348055 -0.9995309 0.9480896 0.9478691 -0.9996296 0.958551 0.958412 -0.9997074 0.9669723 0.9668848 -0.9997689 0.973726 0.973671 -0.9998174 0.9791262 0.9790917 -0.9998557 0.9834339 0.9834123 -0.999886 0.9868637 0.9868501 -0.9999099 0.9895902 0.9895818 -0.9999288 0.9917553 0.9917499 -0.9999437 0.9934727 0.9934694 -0.0000238 0.6964791 0.0240255 -0.0000382 0.6959756 0.023522 -0.0000611 0.6953434 0.0228898 -0.0000978 0.6945513 0.0220976 -0.0001565 0.6935614 0.0211078 -0.0002504 0.6923288 0.0198752 -0.0004008 0.6908009 0.0183473 -0.0006416 0.6889184 0.0164648 -0.0010268 0.6866175 0.0141639 -0.0016435 0.6838358 0.0113822 -0.0026305 0.6805235 0.0080698 -0.0042103 0.676664 0.0042103 -0.0110917 0.676664 0.0042103 -0.0197975 0.676664 0.0042103 -0.0308116 0.676664 0.0042103 -0.0447458 0.676664 0.0042103 -0.0623743 0.676664 0.0042103 -0.0846767 0.676664 0.0042103 -0.1128922 0.676664 0.0042103 -0.1485884 0.676664 0.0042103 -0.1937488 0.676664 0.0042103 -0.2508825 0.676664 0.0042103 -0.3231641 0.676664 0.0042103 -0.4146097 0.676664 0.0042103 -0.5303003 0.676664 0.0042103 -0.676664 0.676664 0.0042103 -0.8314967 0.6536548 0.0078103 -0.9000167 0.5654564 0.0290732 -0.9339805 0.484758 0.062742 -0.9538247 0.4292005 0.1057683 -0.9665463 0.4000976 0.1567226 -0.9751928 0.3947294 0.2144566 -0.9813057 0.4092098 0.2776626 -0.9857485 0.4393211 0.3447407 -0.989043 0.4808339 0.4138277 -0.9915223 0.5297141 0.4829286 -0.9934091 0.582311 0.5501012 -0.9948571 0.6355234 0.6136427 -0.9959757 0.6869133 0.6722322 -0.9968441 0.7347442 0.7250039 -0.9975209 0.7779432 0.7715449 -0.99805 0.8160036 0.811837 -0.9984645 0.8488572 0.8461641 -0.99879 0.8767422 0.8750124 -0.9990458 0.9000848 0.8989796 -0.9992472 0.9194055 0.9187024 -0.9994059 0.9352512 0.9348055 -0.9995309 0.9481509 0.9478691 -0.9996296 0.9585897 0.958412 -0.9997074 0.9669966 0.9668848 -0.9997689 0.9737413 0.973671 -0.9998174 0.9791358 0.9790917 -0.9998557 0.98344 0.9834123 -0.999886 0.9868674 0.9868501 -0.9999099 0.9895926 0.9895818 -0.9999288 0.9917567 0.9917499 -0.9999437 0.9934736 0.9934694 -0.0051514 0.8407292 0.0278994 -0.0051286 0.8405071 0.0273936 -0.0051047 0.8402274 0.0267581 -0.0050826 0.8398756 0.0259613 -0.0050676 0.8394338 0.0249647 -0.0050694 0.8388802 0.0237224 -0.0051048 0.8381886 0.0221804 -0.0052028 0.8373283 0.0202775 -0.0054121 0.8362644 0.017947 -0.0058134 0.8349593 0.015123 -0.0065402 0.8333779 0.0117512 -0.0078103 0.8314967 0.0078103 -0.0144193 0.8314967 0.0078103 -0.0227807 0.8314967 0.0078103 -0.0333589 0.8314967 0.0078103 -0.0467417 0.8314967 0.0078103 -0.0636727 0.8314967 0.0078103 -0.0850926 0.8314967 0.0078103 -0.1121916 0.8314967 0.0078103 -0.1464753 0.8314967 0.0078103 -0.1898486 0.8314967 0.0078103 -0.2447216 0.8314967 0.0078103 -0.314143 0.8314967 0.0078103 -0.4019701 0.8314967 0.0078103 -0.5130828 0.8314967 0.0078103 -0.6536548 0.8314967 0.0078103 -0.8314967 0.8314967 0.0078103 -0.9000167 0.7131566 0.0290732 -0.9339805 0.6009658 0.062742 -0.9538247 0.5182618 0.1057683 -0.9665463 0.4671142 0.1567226 -0.9751928 0.4443699 0.2144566 -0.9813057 0.4454331 0.2776626 -0.9857485 0.465365 0.3447407 -0.989043 0.4992849 0.4138277 -0.9915223 0.5425971 0.4829286 -0.9934091 0.5911804 0.5501012 -0.9948571 0.6415485 0.6136427 -0.9959757 0.6909559 0.6722322 -0.9968441 0.7374264 0.7250039 -0.9975209 0.779705 0.7715449 -0.99805 0.8171509 0.811837 -0.9984645 0.8495988 0.8461641 -0.99879 0.8772186 0.8750124 -0.9990458 0.9003892 0.8989796 -0.9992472 0.9195991 0.9187024 -0.9994059 0.935374 0.9348055 -0.9995309 0.9482285 0.9478691 -0.9996296 0.9586386 0.958412 -0.9997074 0.9670274 0.9668848 -0.9997689 0.9737606 0.973671 -0.9998174 0.979148 0.9790917 -0.9998557 0.9834476 0.9834123 -0.999886 0.9868722 0.9868501 -0.9999099 0.9895956 0.9895818 -0.9999288 0.9917586 0.9917499 -0.9999437 0.9934748 0.9934694 -0.0279321 0.9033413 0.0467613 -0.0278872 0.9032596 0.0463179 -0.0278347 0.9031567 0.0457607 -0.0277752 0.9030276 0.0450619 -0.0277111 0.9028657 0.0441875 -0.0276479 0.9026634 0.0430971 -0.0275966 0.9024114 0.0417427 -0.0275778 0.9020992 0.04007 -0.0276281 0.9017148 0.0380196 -0.0278105 0.9012461 0.0355319 -0.0282324 0.900682 0.032557 -0.0290732 0.9000167 0.0290732 -0.0345622 0.9000167 0.0290732 -0.0415064 0.9000167 0.0290732 -0.0502918 0.9000167 0.0290732 -0.0614064 0.9000167 0.0290732 -0.0754678 0.9000167 0.0290732 -0.0932573 0.9000167 0.0290732 -0.1157634 0.9000167 0.0290732 -0.1442365 0.9000167 0.0290732 -0.1802587 0.9000167 0.0290732 -0.2258315 0.9000167 0.0290732 -0.2834869 0.9000167 0.0290732 -0.3564286 0.9000167 0.0290732 -0.4487093 0.9000167 0.0290732 -0.5654564 0.9000167 0.0290732 -0.7131566 0.9000167 0.0290732 -0.9000167 0.9000167 0.0290732 -0.9339805 0.7479837 0.062742 -0.9538247 0.630936 0.1057683 -0.9665463 0.5518989 0.1567226 -0.9751928 0.5071716 0.2144566 -0.9813057 0.4912602 0.2776626 -0.9857485 0.498314 0.3447407 -0.989043 0.5226279 0.4138277 -0.9915223 0.5588958 0.4829286 -0.9934091 0.6024013 0.5501012 -0.9948571 0.6491711 0.6136427 -0.9959757 0.6960703 0.6722322 -0.9968441 0.7408196 0.7250039 -0.9975209 0.781934 0.7715449 -0.99805 0.8186024 0.811837 -0.9984645 0.850537 0.8461641 -0.99879 0.8778212 0.8750124 -0.9990458 0.9007742 0.8989796 -0.9992472 0.9198441 0.9187024 -0.9994059 0.9355292 0.9348055 -0.9995309 0.9483266 0.9478691 -0.9996296 0.9587005 0.958412 -0.9997074 0.9670664 0.9668848 -0.9997689 0.9737851 0.973671 -0.9998174 0.9791633 0.9790917 -0.9998557 0.9834572 0.9834123 -0.999886 0.9868783 0.9868501 -0.9999099 0.9895994 0.9895818 -0.9999288 0.991761 0.9917499 -0.9999437 0.9934763 0.9934694 -0.0624569 0.9354466 0.0772936 -0.0624063 0.9354101 0.0769284 -0.0623458 0.9353643 0.0764695 -0.0622749 0.9353068 0.075894 -0.0621943 0.9352348 0.0751741 -0.0621069 0.9351449 0.0742763 -0.0620199 0.9350332 0.0731615 -0.0619473 0.9348949 0.071785 -0.061916 0.9347252 0.0700979 -0.0619734 0.9345187 0.0680517 -0.062202 0.9342712 0.0656055 -0.062742 0.9339805 0.062742 -0.0670606 0.9339805 0.062742 -0.0725241 0.9339805 0.062742 -0.0794363 0.9339805 0.062742 -0.088181 0.9339805 0.062742 -0.0992443 0.9339805 0.062742 -0.1132408 0.9339805 0.062742 -0.1309481 0.9339805 0.062742 -0.1533502 0.9339805 0.062742 -0.1816918 0.9339805 0.062742 -0.2175476 0.9339805 0.062742 -0.2629098 0.9339805 0.062742 -0.3202989 0.9339805 0.062742 -0.3929036 0.9339805 0.062742 -0.484758 0.9339805 0.062742 -0.6009658 0.9339805 0.062742 -0.7479837 0.9339805 0.062742 -0.9339805 0.9339805 0.062742 -0.9538247 0.7734835 0.1057683 -0.9665463 0.6591625 0.1567226 -0.9751928 0.5866239 0.2144566 -0.9813057 0.5492375 0.2776626 -0.9857485 0.5399988 0.3447407 -0.989043 0.5521598 0.4138277 -0.9915223 0.5795157 0.4829286 -0.9934091 0.6165973 0.5501012 -0.9948571 0.6588147 0.6136427 -0.9959757 0.7025407 0.6722322 -0.9968441 0.7451125 0.7250039 -0.9975209 0.7847539 0.7715449 -0.99805 0.8204387 0.811837 -0.9984645 0.8517239 0.8461641 -0.99879 0.8785835 0.8750124 -0.9990458 0.9012613 0.8989796 -0.9992472 0.920154 0.9187024 -0.9994059 0.9357257 0.9348055 -0.9995309 0.9484508 0.9478691 -0.9996296 0.9587788 0.958412 -0.9997074 0.9671156 0.9668848 -0.9997689 0.9738161 0.973671 -0.9998174 0.9791828 0.9790917 -0.9998557 0.9834694 0.9834123 -0.999886 0.9868859 0.9868501 -0.9999099 0.9896042 0.9895818 -0.9999288 0.991764 0.9917499 -0.9999437 0.9934782 0.9934694 -0.1059991 0.9545467 0.1173948 -0.1059489 0.9545286 0.1171024 -0.1058883 0.9545059 0.1167351 -0.1058162 0.9544774 0.1162746 -0.1057322 0.9544418 0.1156985 -0.1056375 0.9543974 0.1149803 -0.1055364 0.9543421 0.1140887 -0.1054384 0.9542739 0.1129881 -0.1053624 0.9541902 0.1116399 -0.1053433 0.9540886 0.1100054 -0.1054431 0.9539671 0.1080526 -0.1057683 0.9538247 0.1057683 -0.1090781 0.9538247 0.1057683 -0.1132654 0.9538247 0.1057683 -0.1185628 0.9538247 0.1057683 -0.1252648 0.9538247 0.1057683 -0.1337437 0.9538247 0.1057683 -0.1444705 0.9538247 0.1057683 -0.1580414 0.9538247 0.1057683 -0.1752103 0.9538247 0.1057683 -0.1969312 0.9538247 0.1057683 -0.224411 0.9538247 0.1057683 -0.2591765 0.9538247 0.1057683 -0.3031594 0.9538247 0.1057683 -0.3588035 0.9538247 0.1057683 -0.4292005 0.9538247 0.1057683 -0.5182618 0.9538247 0.1057683 -0.630936 0.9538247 0.1057683 -0.7734835 0.9538247 0.1057683 -0.9538247 0.9538247 0.1057683 -0.9665463 0.794865 0.1567226 -0.9751928 0.6871414 0.2144566 -0.9813057 0.6225864 0.2776626 -0.9857485 0.5927355 0.3447407 -0.989043 0.5895215 0.4138277 -0.9915223 0.6056027 0.4829286 -0.9934091 0.634557 0.5501012 -0.9948571 0.671015 0.6136427 -0.9959757 0.7107266 0.6722322 -0.9968441 0.7505436 0.7250039 -0.9975209 0.7883215 0.7715449 -0.99805 0.8227619 0.811837 -0.9984645 0.8532256 0.8461641 -0.99879 0.8795481 0.8750124 -0.9990458 0.9018776 0.8989796 -0.9992472 0.920546 0.9187024 -0.9994059 0.9359742 0.9348055 -0.9995309 0.9486079 0.9478691 -0.9996296 0.9588778 0.958412 -0.9997074 0.967178 0.9668848 -0.9997689 0.9738553 0.973671 -0.9998174 0.9792074 0.9790917 -0.9998557 0.9834848 0.9834123 -0.999886 0.9868956 0.9868501 -0.9999099 0.9896102 0.9895818 -0.9999288 0.9917678 0.9917499 -0.9999437 0.9934805 0.9934694 -0.1572498 0.9669269 0.1658427 -0.1572031 0.9669173 0.165613 -0.1571463 0.9669053 0.1653244 -0.1570779 0.9668902 0.1649625 -0.1569971 0.9668714 0.16451 -0.156904 0.9668479 0.1639459 -0.1568008 0.9668187 0.1632458 -0.1566936 0.9667827 0.162382 -0.1565954 0.9667385 0.1613241 -0.1565315 0.966685 0.1600423 -0.1565473 0.9666211 0.1585117 -0.1567226 0.9665463 0.1567226 -0.1592131 0.9665463 0.1567226 -0.1623639 0.9665463 0.1567226 -0.1663501 0.9665463 0.1567226 -0.1713932 0.9665463 0.1567226 -0.1777733 0.9665463 0.1567226 -0.185845 0.9665463 0.1567226 -0.1960568 0.9665463 0.1567226 -0.208976 0.9665463 0.1567226 -0.2253205 0.9665463 0.1567226 -0.2459984 0.9665463 0.1567226 -0.2721586 0.9665463 0.1567226 -0.3052547 0.9665463 0.1567226 -0.3471256 0.9665463 0.1567226 -0.4000976 0.9665463 0.1567226 -0.4671142 0.9665463 0.1567226 -0.5518989 0.9665463 0.1567226 -0.6591625 0.9665463 0.1567226 -0.794865 0.9665463 0.1567226 -0.9665463 0.9665463 0.1567226 -0.9751928 0.8143091 0.2144566 -0.9813057 0.7153822 0.2776626 -0.9857485 0.6594543 0.3447407 -0.989043 0.6367889 0.4138277 -0.9915223 0.638606 0.4829286 -0.9934091 0.6572783 0.5501012 -0.9948571 0.6864501 0.6136427 -0.9959757 0.7210829 0.6722322 -0.9968441 0.7574146 0.7250039 -0.9975209 0.792835 0.7715449 -0.99805 0.825701 0.811837 -0.9984645 0.8551253 0.8461641 -0.99879 0.8807683 0.8750124 -0.9990458 0.9026573 0.8989796 -0.9992472 0.921042 0.9187024 -0.9994059 0.9362886 0.9348055 -0.9995309 0.9488066 0.9478691 -0.9996296 0.9590032 0.958412 -0.9997074 0.9672569 0.9668848 -0.9997689 0.9739049 0.973671 -0.9998174 0.9792385 0.9790917 -0.9998557 0.9835043 0.9834123 -0.999886 0.9869078 0.9868501 -0.9999099 0.9896179 0.9895818 -0.9999288 0.9917725 0.9917499 -0.9999437 0.9934835 0.9934694 -0.2151269 0.9754027 0.2215035 -0.2150852 0.9753975 0.2213257 -0.2150342 0.9753908 0.2211023 -0.2149725 0.9753825 0.2208224 -0.2148987 0.9753721 0.2204723 -0.2148124 0.9753591 0.220036 -0.2147144 0.975343 0.2194946 -0.2146085 0.9753231 0.2188268 -0.2145034 0.9752987 0.2180092 -0.2144168 0.9752692 0.217019 -0.2143816 0.975234 0.2158372 -0.2144566 0.9751928 0.2144566 -0.2163014 0.9751928 0.2144566 -0.2186353 0.9751928 0.2144566 -0.2215879 0.9751928 0.2144566 -0.2253234 0.9751928 0.2144566 -0.2300493 0.9751928 0.2144566 -0.2360282 0.9751928 0.2144566 -0.2435923 0.9751928 0.2144566 -0.2531618 0.9751928 0.2144566 -0.2652685 0.9751928 0.2144566 -0.280585 0.9751928 0.2144566 -0.2999624 0.9751928 0.2144566 -0.3244773 0.9751928 0.2144566 -0.3554919 0.9751928 0.2144566 -0.3947294 0.9751928 0.2144566 -0.4443699 0.9751928 0.2144566 -0.5071716 0.9751928 0.2144566 -0.5866239 0.9751928 0.2144566 -0.6871414 0.9751928 0.2144566 -0.8143091 0.9751928 0.2144566 -0.9751928 0.9751928 0.2144566 -0.9813057 0.832781 0.2776626 -0.9857485 0.7438622 0.3447407 -0.989043 0.6965883 0.4138277 -0.9915223 0.6803596 0.4829286 -0.9934091 0.6860238 0.5501012 -0.9948571 0.7059774 0.6136427 -0.9959757 0.7341849 0.6722322 -0.9968441 0.7661073 0.7250039 -0.9975209 0.7985451 0.7715449 -0.99805 0.8294195 0.811837 -0.9984645 0.8575288 0.8461641 -0.99879 0.882312 0.8750124 -0.9990458 0.9036436 0.8989796 -0.9992472 0.9216695 0.9187024 -0.9994059 0.9366864 0.9348055 -0.9995309 0.949058 0.9478691 -0.9996296 0.9591617 0.958412 -0.9997074 0.9673567 0.9668848 -0.9997689 0.9739676 0.973671 -0.9998174 0.9792779 0.9790917 -0.9998557 0.983529 0.9834123 -0.999886 0.9869233 0.9868501 -0.9999099 0.9896276 0.9895818 -0.9999288 0.9917786 0.9917499 -0.9999437 0.9934873 0.9934694 -0.2783684 0.9814251 0.2830287 -0.2783325 0.9814221 0.2828931 -0.2782884 0.9814183 0.2827228 -0.2782347 0.9814136 0.2825094 -0.2781701 0.9814076 0.2822426 -0.2780936 0.9814002 0.28191 -0.2780055 0.9813911 0.2814975 -0.2779077 0.9813797 0.2809887 -0.2778058 0.9813659 0.2803661 -0.2777122 0.9813491 0.2796122 -0.2776503 0.9813291 0.2787128 -0.2776626 0.9813057 0.2776626 -0.2790088 0.9813057 0.2776626 -0.2807118 0.9813057 0.2776626 -0.2828664 0.9813057 0.2776626 -0.2855923 0.9813057 0.2776626 -0.2890408 0.9813057 0.2776626 -0.2934037 0.9813057 0.2776626 -0.2989233 0.9813057 0.2776626 -0.3059062 0.9813057 0.2776626 -0.3147406 0.9813057 0.2776626 -0.3259173 0.9813057 0.2776626 -0.3400572 0.9813057 0.2776626 -0.357946 0.9813057 0.2776626 -0.3805778 0.9813057 0.2776626 -0.4092098 0.9813057 0.2776626 -0.4454331 0.9813057 0.2776626 -0.4912602 0.9813057 0.2776626 -0.5492375 0.9813057 0.2776626 -0.6225864 0.9813057 0.2776626 -0.7153822 0.9813057 0.2776626 -0.832781 0.9813057 0.2776626 -0.9813057 0.9813057 0.2776626 -0.9857485 0.8506491 0.3447407 -0.989043 0.7722424 0.4138277 -0.9915223 0.7331832 0.4829286 -0.9934091 0.7223906 0.5501012 -0.9948571 0.7306821 0.6136427 -0.9959757 0.7507607 0.6722322 -0.9968441 0.7771048 0.7250039 -0.9975209 0.8057691 0.7715449 -0.99805 0.8341237 0.811837 -0.9984645 0.8605694 0.8461641 -0.99879 0.8842651 0.8750124 -0.9990458 0.9048915 0.8989796 -0.9992472 0.9224634 0.9187024 -0.9994059 0.9371897 0.9348055 -0.9995309 0.9493761 0.9478691 -0.9996296 0.9593623 0.958412 -0.9997074 0.9674829 0.9668848 -0.9997689 0.9740469 0.973671 -0.9998174 0.9793277 0.9790917 -0.9998557 0.9835603 0.9834123 -0.999886 0.9869428 0.9868501 -0.9999099 0.9896398 0.9895818 -0.9999288 0.9917863 0.9917499 -0.9999437 0.9934921 0.9934694 -0.3454107 0.9858181 0.3487657 -0.3453807 0.9858163 0.3486639 -0.3453439 0.9858141 0.348536 -0.3452987 0.9858113 0.3483758 -0.3452442 0.9858079 0.3481754 -0.3451791 0.9858036 0.3479259 -0.3451032 0.9857982 0.3476163 -0.3450175 0.9857916 0.3472345 -0.3449254 0.9857835 0.3467674 -0.3448353 0.9857738 0.346202 -0.3447636 0.9857621 0.3455277 -0.3447407 0.9857485 0.3447407 -0.3457085 0.9857485 0.3447407 -0.346933 0.9857485 0.3447407 -0.3484821 0.9857485 0.3447407 -0.350442 0.9857485 0.3447407 -0.3529214 0.9857485 0.3447407 -0.3560582 0.9857485 0.3447407 -0.3600267 0.9857485 0.3447407 -0.3650474 0.9857485 0.3447407 -0.3713992 0.9857485 0.3447407 -0.379435 0.9857485 0.3447407 -0.3896014 0.9857485 0.3447407 -0.4024632 0.9857485 0.3447407 -0.4187351 0.9857485 0.3447407 -0.4393211 0.9857485 0.3447407 -0.465365 0.9857485 0.3447407 -0.498314 0.9857485 0.3447407 -0.5399988 0.9857485 0.3447407 -0.5927355 0.9857485 0.3447407 -0.6594543 0.9857485 0.3447407 -0.7438622 0.9857485 0.3447407 -0.8506491 0.9857485 0.3447407 -0.9857485 0.9857485 0.3447407 -0.989043 0.8679546 0.4138277 -0.9915223 0.800012 0.4829286 -0.9934091 0.7683993 0.5501012 -0.9948571 0.7619366 0.6136427 -0.9959757 0.7717312 0.6722322 -0.9968441 0.791018 0.7250039 -0.9975209 0.8149084 0.7715449 -0.99805 0.8400752 0.811837 -0.9984645 0.8644163 0.8461641 -0.99879 0.8867359 0.8750124 -0.9990458 0.9064702 0.8989796 -0.9992472 0.9234678 0.9187024 -0.9994059 0.9378263 0.9348055 -0.9995309 0.9497786 0.9478691 -0.9996296 0.9596161 0.958412 -0.9997074 0.9676427 0.9668848 -0.9997689 0.9741473 0.973671 -0.9998174 0.9793907 0.9790917 -0.9998557 0.9835998 0.9834123 -0.999886 0.9869676 0.9868501 -0.9999099 0.9896553 0.9895818 -0.9999288 0.991796 0.9917499 -0.9999437 0.9934982 0.9934694 -0.4144197 0.9890841 0.4167992 -0.4143955 0.9890831 0.416724 -0.4143657 0.9890818 0.4166295 -0.414329 0.9890801 0.4165111 -0.4142845 0.9890781 0.4163631 -0.4142311 0.9890755 0.4161787 -0.4141683 0.9890723 0.4159501 -0.4140964 0.9890684 0.4156681 -0.4140176 0.9890637 0.4153232 -0.4139373 0.9890579 0.4149059 -0.4138668 0.989051 0.4144083 -0.4138277 0.989043 0.4138277 -0.4145133 0.989043 0.4138277 -0.4153808 0.989043 0.4138277 -0.4164783 0.989043 0.4138277 -0.4178668 0.989043 0.4138277 -0.4196234 0.989043 0.4138277 -0.4218457 0.989043 0.4138277 -0.4246572 0.989043 0.4138277 -0.4282141 0.989043 0.4138277 -0.4327141 0.989043 0.4138277 -0.4384071 0.989043 0.4138277 -0.4456096 0.989043 0.4138277 -0.4547216 0.989043 0.4138277 -0.4662495 0.989043 0.4138277 -0.4808339 0.989043 0.4138277 -0.4992849 0.989043 0.4138277 -0.5226279 0.989043 0.4138277 -0.5521598 0.989043 0.4138277 -0.5895215 0.989043 0.4138277 -0.6367889 0.989043 0.4138277 -0.6965883 0.989043 0.4138277 -0.7722424 0.989043 0.4138277 -0.8679546 0.989043 0.4138277 -0.989043 0.989043 0.4138277 -0.9915223 0.8845592 0.4829286 -0.9934091 0.8266062 0.5501012 -0.9948571 0.8014777 0.6136427 -0.9959757 0.7982615 0.6722322 -0.9968441 0.8086199 0.7250039 -0.9975209 0.8264708 0.7715449 -0.99805 0.8476047 0.811837 -0.9984645 0.869283 0.8461641 -0.99879 0.8898619 0.8750124 -0.9990458 0.9084676 0.8989796 -0.9992472 0.9247384 0.9187024 -0.9994059 0.9386318 0.9348055 -0.9995309 0.9502877 0.9478691 -0.9996296 0.9599371 0.958412 -0.9997074 0.9678448 0.9668848 -0.9997689 0.9742743 0.973671 -0.9998174 0.9794704 0.9790917 -0.9998557 0.9836498 0.9834123 -0.999886 0.9869989 0.9868501 -0.9999099 0.9896749 0.9895818 -0.9999288 0.9918083 0.9917499 -0.9999437 0.9935059 0.9934694 -0.4834235 0.9915469 0.4850864 -0.4834045 0.9915463 0.4850317 -0.4833811 0.9915455 0.4849631 -0.4833522 0.9915446 0.484877 -0.4833171 0.9915433 0.4847695 -0.4832747 0.9915418 0.4846356 -0.4832246 0.9915399 0.4844695 -0.4831666 0.9915376 0.4842647 -0.4831021 0.9915347 0.4840142 -0.4830346 0.9915312 0.4837112 -0.4829718 0.9915271 0.48335 -0.4829286 0.9915223 0.4829286 -0.4834073 0.9915223 0.4829286 -0.484013 0.9915223 0.4829286 -0.4847793 0.9915223 0.4829286 -0.4857488 0.9915223 0.4829286 -0.4869753 0.9915223 0.4829286 -0.488527 0.9915223 0.4829286 -0.49049 0.9915223 0.4829286 -0.4929736 0.9915223 0.4829286 -0.4961156 0.9915223 0.4829286 -0.5000906 0.9915223 0.4829286 -0.5051196 0.9915223 0.4829286 -0.5114818 0.9915223 0.4829286 -0.5195309 0.9915223 0.4829286 -0.5297141 0.9915223 0.4829286 -0.5425971 0.9915223 0.4829286 -0.5588958 0.9915223 0.4829286 -0.5795157 0.9915223 0.4829286 -0.6056027 0.9915223 0.4829286 -0.638606 0.9915223 0.4829286 -0.6803596 0.9915223 0.4829286 -0.7331832 0.9915223 0.4829286 -0.800012 0.9915223 0.4829286 -0.8845592 0.9915223 0.4829286 -0.9915223 0.9915223 0.4829286 -0.9934091 0.9002457 0.5501012 -0.9948571 0.8515024 0.6136427 -0.9959757 0.8318259 0.6722322 -0.9968441 0.8308888 0.7250039 -0.9975209 0.8410988 0.7715449 -0.99805 0.8571304 0.811837 -0.9984645 0.8754401 0.8461641 -0.99879 0.8938167 0.8750124 -0.9990458 0.9109944 0.8989796 -0.9992472 0.9263459 0.9187024 -0.9994059 0.9396508 0.9348055 -0.9995309 0.9509318 0.9478691 -0.9996296 0.9603433 0.958412 -0.9997074 0.9681004 0.9668848 -0.9997689 0.974435 0.973671 -0.9998174 0.9795713 0.9790917 -0.9998557 0.983713 0.9834123 -0.999886 0.9870386 0.9868501 -0.9999099 0.9896998 0.9895818 -0.9999288 0.9918238 0.9917499 -0.9999437 0.9935156 0.9934694 -0.5504963 0.993424 0.551642 -0.5504818 0.9934236 0.5516029 -0.550464 0.9934231 0.5515539 -0.5504419 0.9934225 0.5514924 -0.550415 0.9934218 0.5514156 -0.5503825 0.9934209 0.5513199 -0.5503438 0.9934197 0.5512013 -0.5502987 0.9934183 0.551055 -0.550248 0.9934166 0.5508762 -0.5501939 0.9934145 0.5506598 -0.5501416 0.993412 0.550402 -0.5501012 0.9934091 0.5501012 -0.5504308 0.9934091 0.5501012 -0.5508478 0.9934091 0.5501012 -0.5513754 0.9934091 0.5501012 -0.5520428 0.9934091 0.5501012 -0.5528872 0.9934091 0.5501012 -0.5539555 0.9934091 0.5501012 -0.555307 0.9934091 0.5501012 -0.5570168 0.9934091 0.5501012 -0.5591799 0.9934091 0.5501012 -0.5619166 0.9934091 0.5501012 -0.5653788 0.9934091 0.5501012 -0.5697589 0.9934091 0.5501012 -0.5753003 0.9934091 0.5501012 -0.582311 0.9934091 0.5501012 -0.5911804 0.9934091 0.5501012 -0.6024013 0.9934091 0.5501012 -0.6165973 0.9934091 0.5501012 -0.634557 0.9934091 0.5501012 -0.6572783 0.9934091 0.5501012 -0.6860238 0.9934091 0.5501012 -0.7223906 0.9934091 0.5501012 -0.7683993 0.9934091 0.5501012 -0.8266062 0.9934091 0.5501012 -0.9002457 0.9934091 0.5501012 -0.9934091 0.9934091 0.5501012 -0.9948571 0.91479 0.6136427 -0.9959757 0.8742892 0.6722322 -0.9968441 0.8590617 0.7250039 -0.9975209 0.8596051 0.7715449 -0.99805 0.8691816 0.811837 -0.9984645 0.8832296 0.8461641 -0.99879 0.8988199 0.8750124 -0.9990458 0.9141912 0.8989796 -0.9992472 0.9283796 0.9187024 -0.9994059 0.9409401 0.9348055 -0.9995309 0.9517467 0.9478691 -0.9996296 0.9608572 0.958412 -0.9997074 0.9684239 0.9668848 -0.9997689 0.9746383 0.973671 -0.9998174 0.9796989 0.9790917 -0.9998557 0.983793 0.9834123 -0.999886 0.9870887 0.9868501 -0.9999099 0.9897312 0.9895818 -0.9999288 0.9918435 0.9917499 -0.9999437 0.9935279 0.9934694 -0.6139459 0.9948662 0.6147247 -0.6139352 0.994866 0.6146972 -0.6139219 0.9948657 0.6146628 -0.6139056 0.9948653 0.6146196 -0.6138855 0.9948649 0.6145656 -0.6138613 0.9948643 0.6144984 -0.6138323 0.9948636 0.6144151 -0.6137984 0.9948628 0.6143124 -0.6137599 0.9948617 0.6141868 -0.6137183 0.9948604 0.6140348 -0.6136769 0.9948589 0.6138538 -0.6136427 0.9948571 0.6136427 -0.6138666 0.9948571 0.6136427 -0.6141499 0.9948571 0.6136427 -0.6145083 0.9948571 0.6136427 -0.6149617 0.9948571 0.6136427 -0.6155353 0.9948571 0.6136427 -0.616261 0.9948571 0.6136427 -0.617179 0.9948571 0.6136427 -0.6183406 0.9948571 0.6136427 -0.61981 0.9948571 0.6136427 -0.6216691 0.9948571 0.6136427 -0.624021 0.9948571 0.6136427 -0.6269965 0.9948571 0.6136427 -0.6307609 0.9948571 0.6136427 -0.6355234 0.9948571 0.6136427 -0.6415485 0.9948571 0.6136427 -0.6491711 0.9948571 0.6136427 -0.6588147 0.9948571 0.6136427 -0.671015 0.9948571 0.6136427 -0.6864501 0.9948571 0.6136427 -0.7059774 0.9948571 0.6136427 -0.7306821 0.9948571 0.6136427 -0.7619366 0.9948571 0.6136427 -0.8014777 0.9948571 0.6136427 -0.8515024 0.9948571 0.6136427 -0.91479 0.9948571 0.6136427 -0.9948571 0.9948571 0.6136427 -0.9959757 0.9280109 0.6722322 -0.9968441 0.8947041 0.7250039 -0.9975209 0.883018 0.7715449 -0.99805 0.8844281 0.811837 -0.9984645 0.8930844 0.8461641 -0.99879 0.9051497 0.8750124 -0.9990458 0.9182356 0.8989796 -0.9992472 0.9309526 0.9187024 -0.9994059 0.9425711 0.9348055 -0.9995309 0.9527776 0.9478691 -0.9996296 0.9615073 0.958412 -0.9997074 0.968833 0.9668848 -0.9997689 0.9748954 0.973671 -0.9998174 0.9798603 0.9790917 -0.9998557 0.9838943 0.9834123 -0.999886 0.9871521 0.9868501 -0.9999099 0.9897709 0.9895818 -0.9999288 0.9918683 0.9917499 -0.9999437 0.9935435 0.9934694 -0.6724572 0.9959813 0.67298 -0.6724495 0.9959811 0.672961 -0.6724399 0.9959809 0.6729372 -0.672428 0.9959807 0.6729073 -0.6724135 0.9959804 0.67287 -0.6723959 0.9959801 0.6728236 -0.6723748 0.9959797 0.672766 -0.67235 0.9959791 0.672695 -0.6723217 0.9959785 0.6726082 -0.6722907 0.9959777 0.6725032 -0.6722594 0.9959768 0.6723781 -0.6722322 0.9959757 0.6722322 -0.6723825 0.9959757 0.6722322 -0.6725725 0.9959757 0.6722322 -0.672813 0.9959757 0.6722322 -0.6731172 0.9959757 0.6722322 -0.6735021 0.9959757 0.6722322 -0.673989 0.9959757 0.6722322 -0.674605 0.9959757 0.6722322 -0.6753843 0.9959757 0.6722322 -0.6763703 0.9959757 0.6722322 -0.6776176 0.9959757 0.6722322 -0.6791956 0.9959757 0.6722322 -0.6811921 0.9959757 0.6722322 -0.6837178 0.9959757 0.6722322 -0.6869133 0.9959757 0.6722322 -0.6909559 0.9959757 0.6722322 -0.6960703 0.9959757 0.6722322 -0.7025407 0.9959757 0.6722322 -0.7107266 0.9959757 0.6722322 -0.7210829 0.9959757 0.6722322 -0.7341849 0.9959757 0.6722322 -0.7507607 0.9959757 0.6722322 -0.7717312 0.9959757 0.6722322 -0.7982615 0.9959757 0.6722322 -0.8318259 0.9959757 0.6722322 -0.8742892 0.9959757 0.6722322 -0.9280109 0.9959757 0.6722322 -0.9959757 0.9959757 0.6722322 -0.9968441 0.9397965 0.7250039 -0.9975209 0.9126384 0.7715449 -0.99805 0.9037168 0.811837 -0.9984645 0.9055519 0.8461641 -0.99879 0.9131577 0.8750124 -0.9990458 0.9233522 0.8989796 -0.9992472 0.9342076 0.9187024 -0.9994059 0.9446345 0.9348055 -0.9995309 0.9540819 0.9478691 -0.9996296 0.9623298 0.958412 -0.9997074 0.9693507 0.9668848 -0.9997689 0.9752208 0.973671 -0.9998174 0.9800645 0.9790917 -0.9998557 0.9840223 0.9834123 -0.999886 0.9872324 0.9868501 -0.9999099 0.9898212 0.9895818 -0.9999288 0.9918998 0.9917499 -0.9999437 0.9935631 0.9934694 -0.7251659 0.9968475 0.725513 -0.7251605 0.9968474 0.7255 -0.7251537 0.9968473 0.7254838 -0.7251454 0.9968472 0.7254635 -0.7251351 0.996847 0.7254381 -0.7251226 0.9968468 0.7254064 -0.7251076 0.9968465 0.7253672 -0.7250899 0.9968462 0.7253189 -0.7250697 0.9968458 0.7252598 -0.7250473 0.9968453 0.7251883 -0.7250244 0.9968448 0.7251031 -0.7250039 0.9968441 0.7250039 -0.7251035 0.9968441 0.7250039 -0.7252297 0.9968441 0.7250039 -0.7253892 0.9968441 0.7250039 -0.725591 0.9968441 0.7250039 -0.7258464 0.9968441 0.7250039 -0.7261694 0.9968441 0.7250039 -0.7265781 0.9968441 0.7250039 -0.7270952 0.9968441 0.7250039 -0.7277493 0.9968441 0.7250039 -0.7285769 0.9968441 0.7250039 -0.7296238 0.9968441 0.7250039 -0.7309484 0.9968441 0.7250039 -0.7326242 0.9968441 0.7250039 -0.7347442 0.9968441 0.7250039 -0.7374264 0.9968441 0.7250039 -0.7408196 0.9968441 0.7250039 -0.7451125 0.9968441 0.7250039 -0.7505436 0.9968441 0.7250039 -0.7574146 0.9968441 0.7250039 -0.7661073 0.9968441 0.7250039 -0.7771048 0.9968441 0.7250039 -0.791018 0.9968441 0.7250039 -0.8086199 0.9968441 0.7250039 -0.8308888 0.9968441 0.7250039 -0.8590617 0.9968441 0.7250039 -0.8947041 0.9968441 0.7250039 -0.9397965 0.9968441 0.7250039 -0.9968441 0.9968441 0.7250039 -0.9975209 0.9501119 0.7715449 -0.99805 0.9281195 0.811837 -0.9984645 0.921325 0.8461641 -0.99879 0.9232889 0.8750124 -0.9990458 0.9298254 0.8989796 -0.9992472 0.9383257 0.9187024 -0.9994059 0.947245 0.9348055 -0.9995309 0.955732 0.9478691 -0.9996296 0.9633703 0.958412 -0.9997074 0.9700057 0.9668848 -0.9997689 0.9756324 0.973671 -0.9998174 0.9803229 0.9790917 -0.9998557 0.9841844 0.9834123 -0.999886 0.9873339 0.9868501 -0.9999099 0.9898847 0.9895818 -0.9999288 0.9919396 0.9917499 -0.9999437 0.993588 0.9934694 -0.7716588 0.997523 0.7718869 -0.7716551 0.997523 0.7718782 -0.7716504 0.9975229 0.7718673 -0.7716446 0.9975228 0.7718536 -0.7716375 0.9975227 0.7718366 -0.7716288 0.9975226 0.7718153 -0.7716184 0.9975224 0.771789 -0.7716061 0.9975222 0.7717565 -0.7715919 0.997522 0.7717168 -0.7715762 0.9975217 0.7716688 -0.7715599 0.9975213 0.7716116 -0.7715449 0.9975209 0.7715449 -0.7716104 0.9975209 0.7715449 -0.7716932 0.9975209 0.7715449 -0.771798 0.9975209 0.7715449 -0.7719306 0.9975209 0.7715449 -0.7720984 0.9975209 0.7715449 -0.7723106 0.9975209 0.7715449 -0.772579 0.9975209 0.7715449 -0.7729187 0.9975209 0.7715449 -0.7733484 0.9975209 0.7715449 -0.773892 0.9975209 0.7715449 -0.7745797 0.9975209 0.7715449 -0.7754498 0.9975209 0.7715449 -0.7765506 0.9975209 0.7715449 -0.7779432 0.9975209 0.7715449 -0.779705 0.9975209 0.7715449 -0.781934 0.9975209 0.7715449 -0.7847539 0.9975209 0.7715449 -0.7883215 0.9975209 0.7715449 -0.792835 0.9975209 0.7715449 -0.7985451 0.9975209 0.7715449 -0.8057691 0.9975209 0.7715449 -0.8149084 0.9975209 0.7715449 -0.8264708 0.9975209 0.7715449 -0.8410988 0.9975209 0.7715449 -0.8596051 0.9975209 0.7715449 -0.883018 0.9975209 0.7715449 -0.9126384 0.9975209 0.7715449 -0.9501119 0.9975209 0.7715449 -0.9975209 0.9975209 0.7715449 -0.99805 0.9589921 0.811837 -0.9984645 0.9412799 0.8461641 -0.99879 0.9361061 0.8750124 -0.9990458 0.9380149 0.8989796 -0.9992472 0.9435357 0.9187024 -0.9994059 0.9505477 0.9348055 -0.9995309 0.9578195 0.9478691 -0.9996296 0.9646868 0.958412 -0.9997074 0.9708343 0.9668848 -0.9997689 0.9761531 0.973671 -0.9998174 0.9806498 0.9790917 -0.9998557 0.9843894 0.9834123 -0.999886 0.9874624 0.9868501 -0.9999099 0.9899652 0.9895818 -0.9999288 0.9919899 0.9917499 -0.9999437 0.9936196 0.9934694 -0.8119154 0.9980513 0.8120639 -0.8119128 0.9980512 0.8120582 -0.8119096 0.9980512 0.8120509 -0.8119057 0.9980511 0.8120419 -0.8119009 0.9980511 0.8120305 -0.8118949 0.998051 0.8120164 -0.8118878 0.9980509 0.8119989 -0.8118794 0.9980508 0.8119774 -0.8118697 0.9980506 0.811951 -0.8118589 0.9980504 0.8119192 -0.8118476 0.9980502 0.8118813 -0.811837 0.99805 0.811837 -0.8118797 0.99805 0.811837 -0.8119336 0.99805 0.811837 -0.8120018 0.99805 0.811837 -0.8120882 0.99805 0.811837 -0.8121974 0.99805 0.811837 -0.8123356 0.99805 0.811837 -0.8125104 0.99805 0.811837 -0.8127316 0.99805 0.811837 -0.8130114 0.99805 0.811837 -0.8133654 0.99805 0.811837 -0.8138133 0.99805 0.811837 -0.8143799 0.99805 0.811837 -0.8150967 0.99805 0.811837 -0.8160036 0.99805 0.811837 -0.8171509 0.99805 0.811837 -0.8186024 0.99805 0.811837 -0.8204387 0.99805 0.811837 -0.8227619 0.99805 0.811837 -0.825701 0.99805 0.811837 -0.8294195 0.99805 0.811837 -0.8341237 0.99805 0.811837 -0.8400752 0.99805 0.811837 -0.8476047 0.99805 0.811837 -0.8571304 0.99805 0.811837 -0.8691816 0.99805 0.811837 -0.8844281 0.99805 0.811837 -0.9037168 0.99805 0.811837 -0.9281195 0.99805 0.811837 -0.9589921 0.99805 0.811837 -0.99805 0.99805 0.811837 -0.9984645 0.9665255 0.8461641 -0.99879 0.9523216 0.8750124 -0.9990458 0.9483756 0.8989796 -0.9992472 0.9501269 0.9187024 -0.9994059 0.954726 0.9348055 -0.9995309 0.9604606 0.9478691 -0.9996296 0.9663522 0.958412 -0.9997074 0.9718825 0.9668848 -0.9997689 0.9768119 0.973671 -0.9998174 0.9810633 0.9790917 -0.9998557 0.9846487 0.9834123 -0.999886 0.9876249 0.9868501 -0.9999099 0.9900669 0.9895818 -0.9999288 0.9920536 0.9917499 -0.9999437 0.9936594 0.9934694 -0.8462171 0.9984653 0.8463131 -0.8462154 0.9984653 0.8463093 -0.8462132 0.9984653 0.8463046 -0.8462106 0.9984653 0.8462986 -0.8462073 0.9984652 0.8462912 -0.8462034 0.9984652 0.8462819 -0.8461986 0.9984651 0.8462704 -0.8461929 0.998465 0.8462563 -0.8461864 0.9984649 0.846239 -0.8461791 0.9984648 0.8462181 -0.8461714 0.9984647 0.8461932 -0.8461641 0.9984645 0.8461641 -0.8461917 0.9984645 0.8461641 -0.8462265 0.9984645 0.8461641 -0.8462707 0.9984645 0.8461641 -0.8463265 0.9984645 0.8461641 -0.8463971 0.9984645 0.8461641 -0.8464864 0.9984645 0.8461641 -0.8465994 0.9984645 0.8461641 -0.8467423 0.9984645 0.8461641 -0.8469232 0.9984645 0.8461641 -0.847152 0.9984645 0.8461641 -0.8474415 0.9984645 0.8461641 -0.8478077 0.9984645 0.8461641 -0.848271 0.9984645 0.8461641 -0.8488572 0.9984645 0.8461641 -0.8495988 0.9984645 0.8461641 -0.850537 0.9984645 0.8461641 -0.8517239 0.9984645 0.8461641 -0.8532256 0.9984645 0.8461641 -0.8551253 0.9984645 0.8461641 -0.8575288 0.9984645 0.8461641 -0.8605694 0.9984645 0.8461641 -0.8644163 0.9984645 0.8461641 -0.869283 0.9984645 0.8461641 -0.8754401 0.9984645 0.8461641 -0.8832296 0.9984645 0.8461641 -0.8930844 0.9984645 0.8461641 -0.9055519 0.9984645 0.8461641 -0.921325 0.9984645 0.8461641 -0.9412799 0.9984645 0.8461641 -0.9665255 0.9984645 0.8461641 -0.9984645 0.9984645 0.8461641 -0.99879 0.9728362 0.8750124 -0.9990458 0.9614833 0.8989796 -0.9992472 0.9584657 0.9187024 -0.9994059 0.9600121 0.9348055 -0.9995309 0.9638018 0.9478691 -0.9996296 0.9684592 0.958412 -0.9997074 0.9732087 0.9668848 -0.9997689 0.9776454 0.973671 -0.9998174 0.9815865 0.9790917 -0.9998557 0.9849768 0.9834123 -0.999886 0.9878304 0.9868501 -0.9999099 0.9901957 0.9895818 -0.9999288 0.9921342 0.9917499 -0.9999437 0.9937098 0.9934694 -0.8750477 0.9987905 0.8751094 -0.8750466 0.9987905 0.8751069 -0.8750451 0.9987904 0.8751038 -0.8750434 0.9987904 0.8750999 -0.8750412 0.9987904 0.8750951 -0.8750386 0.9987904 0.8750891 -0.8750355 0.9987903 0.8750816 -0.8750317 0.9987903 0.8750724 -0.8750274 0.9987902 0.8750611 -0.8750225 0.9987902 0.8750475 -0.8750173 0.9987901 0.8750313 -0.8750124 0.99879 0.8750124 -0.8750301 0.99879 0.8750124 -0.8750525 0.99879 0.8750124 -0.8750809 0.99879 0.8750124 -0.8751167 0.99879 0.8750124 -0.875162 0.99879 0.8750124 -0.8752194 0.99879 0.8750124 -0.875292 0.99879 0.8750124 -0.8753838 0.99879 0.8750124 -0.8755 0.99879 0.8750124 -0.875647 0.99879 0.8750124 -0.8758329 0.99879 0.8750124 -0.8760681 0.99879 0.8750124 -0.8763657 0.99879 0.8750124 -0.8767422 0.99879 0.8750124 -0.8772186 0.99879 0.8750124 -0.8778212 0.99879 0.8750124 -0.8785835 0.99879 0.8750124 -0.8795481 0.99879 0.8750124 -0.8807683 0.99879 0.8750124 -0.882312 0.99879 0.8750124 -0.8842651 0.99879 0.8750124 -0.8867359 0.99879 0.8750124 -0.8898619 0.99879 0.8750124 -0.8938167 0.99879 0.8750124 -0.8988199 0.99879 0.8750124 -0.9051497 0.99879 0.8750124 -0.9131577 0.99879 0.8750124 -0.9232889 0.99879 0.8750124 -0.9361061 0.99879 0.8750124 -0.9523216 0.99879 0.8750124 -0.9728362 0.99879 0.8750124 -0.99879 0.99879 0.8750124 -0.9990458 0.9780663 0.8989796 -0.9992472 0.9690153 0.9187024 -0.9994059 0.9666996 0.9348055 -0.9995309 0.9680289 0.9478691 -0.9996296 0.9711249 0.958412 -0.9997074 0.9748865 0.9668848 -0.9997689 0.9786999 0.973671 -0.9998174 0.9822484 0.9790917 -0.9998557 0.9853919 0.9834123 -0.999886 0.9880905 0.9868501 -0.9999099 0.9903586 0.9895818 -0.9999288 0.9922362 0.9917499 -0.9999437 0.9937736 0.9934694 -0.8990028 0.9990461 0.8990422 -0.899002 0.9990461 0.8990406 -0.8990011 0.9990461 0.8990386 -0.899 0.9990461 0.8990361 -0.8989986 0.9990461 0.899033 -0.8989969 0.9990461 0.8990291 -0.8989948 0.9990461 0.8990243 -0.8989923 0.999046 0.8990183 -0.8989895 0.999046 0.8990111 -0.8989863 0.9990459 0.8990023 -0.8989829 0.9990459 0.8989918 -0.8989796 0.9990458 0.8989796 -0.8989909 0.9990458 0.8989796 -0.8990052 0.9990458 0.8989796 -0.8990233 0.9990458 0.8989796 -0.8990462 0.9990458 0.8989796 -0.8990752 0.9990458 0.8989796 -0.8991118 0.9990458 0.8989796 -0.8991582 0.9990458 0.8989796 -0.8992169 0.9990458 0.8989796 -0.8992911 0.9990458 0.8989796 -0.899385 0.9990458 0.8989796 -0.8995038 0.9990458 0.8989796 -0.8996541 0.9990458 0.8989796 -0.8998443 0.9990458 0.8989796 -0.9000848 0.9990458 0.8989796 -0.9003892 0.9990458 0.8989796 -0.9007742 0.9990458 0.8989796 -0.9012613 0.9990458 0.8989796 -0.9018776 0.9990458 0.8989796 -0.9026573 0.9990458 0.8989796 -0.9036436 0.9990458 0.8989796 -0.9048915 0.9990458 0.8989796 -0.9064702 0.9990458 0.8989796 -0.9084676 0.9990458 0.8989796 -0.9109944 0.9990458 0.8989796 -0.9141912 0.9990458 0.8989796 -0.9182356 0.9990458 0.8989796 -0.9233522 0.9990458 0.8989796 -0.9298254 0.9990458 0.8989796 -0.9380149 0.9990458 0.8989796 -0.9483756 0.9990458 0.8989796 -0.9614833 0.9990458 0.8989796 -0.9780663 0.9990458 0.8989796 -0.9990458 0.9990458 0.8989796 -0.9992472 0.982362 0.9187024 -0.9994059 0.9751603 0.9348055 -0.9995309 0.9733768 0.9478691 -0.9996296 0.9744973 0.958412 -0.9997074 0.9770092 0.9668848 -0.9997689 0.9800339 0.973671 -0.9998174 0.9830858 0.9790917 -0.9998557 0.985917 0.9834123 -0.999886 0.9884196 0.9868501 -0.9999099 0.9905646 0.9895818 -0.9999288 0.9923652 0.9917499 -0.9999437 0.9938543 0.9934694 -0.9187175 0.9992474 0.9187426 -0.918717 0.9992474 0.9187416 -0.9187164 0.9992474 0.9187403 -0.9187157 0.9992474 0.9187387 -0.9187148 0.9992474 0.9187367 -0.9187137 0.9992474 0.9187342 -0.9187123 0.9992473 0.9187311 -0.9187107 0.9992473 0.9187273 -0.9187089 0.9992473 0.9187226 -0.9187068 0.9992473 0.918717 -0.9187045 0.9992472 0.9187102 -0.9187024 0.9992472 0.9187024 -0.9187096 0.9992472 0.9187024 -0.9187187 0.9992472 0.9187024 -0.9187302 0.9992472 0.9187024 -0.9187448 0.9992472 0.9187024 -0.9187632 0.9992472 0.9187024 -0.9187865 0.9992472 0.9187024 -0.918816 0.9992472 0.9187024 -0.9188534 0.9992472 0.9187024 -0.9189006 0.9992472 0.9187024 -0.9189603 0.9992472 0.9187024 -0.9190359 0.9992472 0.9187024 -0.9191315 0.9992472 0.9187024 -0.9192525 0.9992472 0.9187024 -0.9194055 0.9992472 0.9187024 -0.9195991 0.9992472 0.9187024 -0.9198441 0.9992472 0.9187024 -0.920154 0.9992472 0.9187024 -0.920546 0.9992472 0.9187024 -0.921042 0.9992472 0.9187024 -0.9216695 0.9992472 0.9187024 -0.9224634 0.9992472 0.9187024 -0.9234678 0.9992472 0.9187024 -0.9247384 0.9992472 0.9187024 -0.9263459 0.9992472 0.9187024 -0.9283796 0.9992472 0.9187024 -0.9309526 0.9992472 0.9187024 -0.9342076 0.9992472 0.9187024 -0.9383257 0.9992472 0.9187024 -0.9435357 0.9992472 0.9187024 -0.9501269 0.9992472 0.9187024 -0.9584657 0.9992472 0.9187024 -0.9690153 0.9992472 0.9187024 -0.982362 0.9992472 0.9187024 -0.9992472 0.9992472 0.9187024 -0.9994059 0.9858641 0.9348055 -0.9995309 0.9801425 0.9478691 -0.9996296 0.9787638 0.958412 -0.9997074 0.9796946 0.9668848 -0.9997689 0.9817216 0.973671 -0.9998174 0.9841451 0.9790917 -0.9998557 0.9865813 0.9834123 -0.999886 0.9888359 0.9868501 -0.9999099 0.9908253 0.9895818 -0.9999288 0.9925283 0.9917499 -0.9999437 0.9939564 0.9934694 -0.9348153 0.999406 0.9348312 -0.9348149 0.999406 0.9348305 -0.9348146 0.999406 0.9348297 -0.9348141 0.999406 0.9348287 -0.9348135 0.999406 0.9348274 -0.9348128 0.9994059 0.9348258 -0.9348119 0.9994059 0.9348238 -0.9348109 0.9994059 0.9348214 -0.9348097 0.9994059 0.9348184 -0.9348083 0.9994059 0.9348148 -0.9348069 0.9994059 0.9348105 -0.9348055 0.9994059 0.9348055 -0.9348101 0.9994059 0.9348055 -0.9348158 0.9994059 0.9348055 -0.9348231 0.9994059 0.9348055 -0.9348324 0.9994059 0.9348055 -0.9348441 0.9994059 0.9348055 -0.9348588 0.9994059 0.9348055 -0.9348775 0.9994059 0.9348055 -0.9349012 0.9994059 0.9348055 -0.9349311 0.9994059 0.9348055 -0.934969 0.9994059 0.9348055 -0.9350169 0.9994059 0.9348055 -0.9350775 0.9994059 0.9348055 -0.9351542 0.9994059 0.9348055 -0.9352512 0.9994059 0.9348055 -0.935374 0.9994059 0.9348055 -0.9355292 0.9994059 0.9348055 -0.9357257 0.9994059 0.9348055 -0.9359742 0.9994059 0.9348055 -0.9362886 0.9994059 0.9348055 -0.9366864 0.9994059 0.9348055 -0.9371897 0.9994059 0.9348055 -0.9378263 0.9994059 0.9348055 -0.9386318 0.9994059 0.9348055 -0.9396508 0.9994059 0.9348055 -0.9409401 0.9994059 0.9348055 -0.9425711 0.9994059 0.9348055 -0.9446345 0.9994059 0.9348055 -0.947245 0.9994059 0.9348055 -0.9505477 0.9994059 0.9348055 -0.954726 0.9994059 0.9348055 -0.9600121 0.9994059 0.9348055 -0.9666996 0.9994059 0.9348055 -0.9751603 0.9994059 0.9348055 -0.9858641 0.9994059 0.9348055 -0.9994059 0.9994059 0.9348055 -0.9995309 0.988702 0.9478691 -0.9996296 0.9841615 0.958412 -0.9997074 0.983092 0.9668848 -0.9997689 0.9838568 0.973671 -0.9998174 0.9854854 0.9790917 -0.9998557 0.9874218 0.9834123 -0.999886 0.9893626 0.9868501 -0.9999099 0.9911552 0.9895818 -0.9999288 0.9927348 0.9917499 -0.9999437 0.9940856 0.9934694 -0.9478754 0.999531 0.9478854 -0.9478752 0.999531 0.947885 -0.947875 0.999531 0.9478845 -0.9478746 0.999531 0.9478839 -0.9478743 0.999531 0.947883 -0.9478738 0.999531 0.947882 -0.9478733 0.999531 0.9478808 -0.9478726 0.999531 0.9478792 -0.9478718 0.999531 0.9478773 -0.947871 0.9995309 0.947875 -0.94787 0.9995309 0.9478723 -0.9478691 0.9995309 0.9478691 -0.947872 0.9995309 0.9478691 -0.9478757 0.9995309 0.9478691 -0.9478803 0.9995309 0.9478691 -0.9478861 0.9995309 0.9478691 -0.9478935 0.9995309 0.9478691 -0.9479029 0.9995309 0.9478691 -0.9479147 0.9995309 0.9478691 -0.9479296 0.9995309 0.9478691 -0.9479486 0.9995309 0.9478691 -0.9479725 0.9995309 0.9478691 -0.9480028 0.9995309 0.9478691 -0.9480411 0.9995309 0.9478691 -0.9480896 0.9995309 0.9478691 -0.9481509 0.9995309 0.9478691 -0.9482285 0.9995309 0.9478691 -0.9483266 0.9995309 0.9478691 -0.9484508 0.9995309 0.9478691 -0.9486079 0.9995309 0.9478691 -0.9488066 0.9995309 0.9478691 -0.949058 0.9995309 0.9478691 -0.9493761 0.9995309 0.9478691 -0.9497786 0.9995309 0.9478691 -0.9502877 0.9995309 0.9478691 -0.9509318 0.9995309 0.9478691 -0.9517467 0.9995309 0.9478691 -0.9527776 0.9995309 0.9478691 -0.9540819 0.9995309 0.9478691 -0.955732 0.9995309 0.9478691 -0.9578195 0.9995309 0.9478691 -0.9604606 0.9995309 0.9478691 -0.9638018 0.9995309 0.9478691 -0.9680289 0.9995309 0.9478691 -0.9733768 0.9995309 0.9478691 -0.9801425 0.9995309 0.9478691 -0.988702 0.9995309 0.9478691 -0.9995309 0.9995309 0.9478691 -0.9996296 0.9909903 0.958412 -0.9997074 0.9873902 0.9668848 -0.9997689 0.986558 0.973671 -0.9998174 0.987181 0.9790917 -0.9998557 0.9884852 0.9834123 -0.999886 0.9900289 0.9868501 -0.9999099 0.9915724 0.9895818 -0.9999288 0.992996 0.9917499 -0.9999437 0.994249 0.9934694 -0.958416 0.9996296 0.9584223 -0.9584159 0.9996296 0.9584221 -0.9584157 0.9996296 0.9584217 -0.9584155 0.9996296 0.9584213 -0.9584153 0.9996296 0.9584208 -0.958415 0.9996296 0.9584202 -0.9584146 0.9996296 0.9584194 -0.9584142 0.9996296 0.9584184 -0.9584137 0.9996296 0.9584172 -0.9584132 0.9996296 0.9584157 -0.9584126 0.9996296 0.958414 -0.958412 0.9996296 0.958412 -0.9584138 0.9996296 0.958412 -0.9584161 0.9996296 0.958412 -0.958419 0.9996296 0.958412 -0.9584227 0.9996296 0.958412 -0.9584274 0.9996296 0.958412 -0.9584333 0.9996296 0.958412 -0.9584407 0.9996296 0.958412 -0.9584501 0.9996296 0.958412 -0.9584621 0.9996296 0.958412 -0.9584772 0.9996296 0.958412 -0.9584963 0.9996296 0.958412 -0.9585204 0.9996296 0.958412 -0.958551 0.9996296 0.958412 -0.9585897 0.9996296 0.958412 -0.9586386 0.9996296 0.958412 -0.9587005 0.9996296 0.958412 -0.9587788 0.9996296 0.958412 -0.9588778 0.9996296 0.958412 -0.9590032 0.9996296 0.958412 -0.9591617 0.9996296 0.958412 -0.9593623 0.9996296 0.958412 -0.9596161 0.9996296 0.958412 -0.9599371 0.9996296 0.958412 -0.9603433 0.9996296 0.958412 -0.9608572 0.9996296 0.958412 -0.9615073 0.9996296 0.958412 -0.9623298 0.9996296 0.958412 -0.9633703 0.9996296 0.958412 -0.9646868 0.9996296 0.958412 -0.9663522 0.9996296 0.958412 -0.9684592 0.9996296 0.958412 -0.9711249 0.9996296 0.958412 -0.9744973 0.9996296 0.958412 -0.9787638 0.9996296 0.958412 -0.9841615 0.9996296 0.958412 -0.9909903 0.9996296 0.958412 -0.9996296 0.9996296 0.958412 -0.9997074 0.992828 0.9668848 -0.9997689 0.9899755 0.973671 -0.9998174 0.9893262 0.9790917 -0.9998557 0.9898304 0.9834123 -0.999886 0.9908718 0.9868501 -0.9999099 0.9921003 0.9895818 -0.9999288 0.9933264 0.9917499 -0.9999437 0.9944558 0.9934694 -0.9668873 0.9997074 0.9668913 -0.9668872 0.9997074 0.9668911 -0.9668871 0.9997074 0.9668909 -0.966887 0.9997074 0.9668907 -0.9668869 0.9997074 0.9668904 -0.9668867 0.9997074 0.9668899 -0.9668865 0.9997074 0.9668894 -0.9668862 0.9997074 0.9668888 -0.9668859 0.9997074 0.9668881 -0.9668855 0.9997074 0.9668872 -0.9668852 0.9997074 0.9668861 -0.9668848 0.9997074 0.9668848 -0.9668859 0.9997074 0.9668848 -0.9668874 0.9997074 0.9668848 -0.9668892 0.9997074 0.9668848 -0.9668915 0.9997074 0.9668848 -0.9668945 0.9997074 0.9668848 -0.9668982 0.9997074 0.9668848 -0.9669029 0.9997074 0.9668848 -0.9669088 0.9997074 0.9668848 -0.9669163 0.9997074 0.9668848 -0.9669258 0.9997074 0.9668848 -0.9669378 0.9997074 0.9668848 -0.966953 0.9997074 0.9668848 -0.9669723 0.9997074 0.9668848 -0.9669966 0.9997074 0.9668848 -0.9670274 0.9997074 0.9668848 -0.9670664 0.9997074 0.9668848 -0.9671156 0.9997074 0.9668848 -0.967178 0.9997074 0.9668848 -0.9672569 0.9997074 0.9668848 -0.9673567 0.9997074 0.9668848 -0.9674829 0.9997074 0.9668848 -0.9676427 0.9997074 0.9668848 -0.9678448 0.9997074 0.9668848 -0.9681004 0.9997074 0.9668848 -0.9684239 0.9997074 0.9668848 -0.968833 0.9997074 0.9668848 -0.9693507 0.9997074 0.9668848 -0.9700057 0.9997074 0.9668848 -0.9708343 0.9997074 0.9668848 -0.9718825 0.9997074 0.9668848 -0.9732087 0.9997074 0.9668848 -0.9748865 0.9997074 0.9668848 -0.9770092 0.9997074 0.9668848 -0.9796946 0.9997074 0.9668848 -0.983092 0.9997074 0.9668848 -0.9873902 0.9997074 0.9668848 -0.992828 0.9997074 0.9668848 -0.9997074 0.9997074 0.9668848 -0.9997689 0.994299 0.973671 -0.9998174 0.9920401 0.9790917 -0.9998557 0.9915323 0.9834123 -0.999886 0.9919383 0.9868501 -0.9999099 0.9927682 0.9895818 -0.9999288 0.9937445 0.9917499 -0.9999437 0.9947174 0.9934694 -0.9736726 0.9997689 0.9736751 -0.9736726 0.9997689 0.973675 -0.9736725 0.9997689 0.9736749 -0.9736724 0.9997689 0.9736747 -0.9736723 0.9997689 0.9736745 -0.9736722 0.9997689 0.9736743 -0.9736721 0.9997689 0.973674 -0.9736719 0.9997689 0.9736736 -0.9736717 0.9997689 0.9736731 -0.9736715 0.9997689 0.9736725 -0.9736712 0.9997689 0.9736718 -0.973671 0.9997689 0.973671 -0.9736717 0.9997689 0.973671 -0.9736726 0.9997689 0.973671 -0.9736738 0.9997689 0.973671 -0.9736753 0.9997689 0.973671 -0.9736771 0.9997689 0.973671 -0.9736794 0.9997689 0.973671 -0.9736824 0.9997689 0.973671 -0.9736861 0.9997689 0.973671 -0.9736908 0.9997689 0.973671 -0.9736968 0.9997689 0.973671 -0.9737044 0.9997689 0.973671 -0.9737139 0.9997689 0.973671 -0.973726 0.9997689 0.973671 -0.9737413 0.9997689 0.973671 -0.9737606 0.9997689 0.973671 -0.9737851 0.9997689 0.973671 -0.9738161 0.9997689 0.973671 -0.9738553 0.9997689 0.973671 -0.9739049 0.9997689 0.973671 -0.9739676 0.9997689 0.973671 -0.9740469 0.9997689 0.973671 -0.9741473 0.9997689 0.973671 -0.9742743 0.9997689 0.973671 -0.974435 0.9997689 0.973671 -0.9746383 0.9997689 0.973671 -0.9748954 0.9997689 0.973671 -0.9752208 0.9997689 0.973671 -0.9756324 0.9997689 0.973671 -0.9761531 0.9997689 0.973671 -0.9768119 0.9997689 0.973671 -0.9776454 0.9997689 0.973671 -0.9786999 0.9997689 0.973671 -0.9800339 0.9997689 0.973671 -0.9817216 0.9997689 0.973671 -0.9838568 0.9997689 0.973671 -0.986558 0.9997689 0.973671 -0.9899755 0.9997689 0.973671 -0.994299 0.9997689 0.973671 -0.9997689 0.9997689 0.973671 -0.9998174 0.9954736 0.9790917 -0.9998557 0.9936855 0.9834123 -0.999886 0.9932875 0.9868501 -0.9999099 0.9936131 0.9895818 -0.9999288 0.9942733 0.9917499 -0.9999437 0.9950483 0.9934694 -0.9790927 0.9998174 0.9790943 -0.9790927 0.9998174 0.9790942 -0.9790927 0.9998174 0.9790942 -0.9790926 0.9998174 0.979094 -0.9790925 0.9998174 0.9790939 -0.9790925 0.9998174 0.9790938 -0.9790924 0.9998174 0.9790936 -0.9790923 0.9998174 0.9790933 -0.9790921 0.9998174 0.979093 -0.979092 0.9998174 0.9790926 -0.9790919 0.9998174 0.9790922 -0.9790917 0.9998174 0.9790917 -0.9790922 0.9998174 0.9790917 -0.9790927 0.9998174 0.9790917 -0.9790935 0.9998174 0.9790917 -0.9790944 0.9998174 0.9790917 -0.9790955 0.9998174 0.9790917 -0.979097 0.9998174 0.9790917 -0.9790988 0.9998174 0.9790917 -0.9791012 0.9998174 0.9790917 -0.9791041 0.9998174 0.9790917 -0.9791079 0.9998174 0.9790917 -0.9791126 0.9998174 0.9790917 -0.9791186 0.9998174 0.9790917 -0.9791262 0.9998174 0.9790917 -0.9791358 0.9998174 0.9790917 -0.979148 0.9998174 0.9790917 -0.9791633 0.9998174 0.9790917 -0.9791828 0.9998174 0.9790917 -0.9792074 0.9998174 0.9790917 -0.9792385 0.9998174 0.9790917 -0.9792779 0.9998174 0.9790917 -0.9793277 0.9998174 0.9790917 -0.9793907 0.9998174 0.9790917 -0.9794704 0.9998174 0.9790917 -0.9795713 0.9998174 0.9790917 -0.9796989 0.9998174 0.9790917 -0.9798603 0.9998174 0.9790917 -0.9800645 0.9998174 0.9790917 -0.9803229 0.9998174 0.9790917 -0.9806498 0.9998174 0.9790917 -0.9810633 0.9998174 0.9790917 -0.9815865 0.9998174 0.9790917 -0.9822484 0.9998174 0.9790917 -0.9830858 0.9998174 0.9790917 -0.9841451 0.9998174 0.9790917 -0.9854854 0.9998174 0.9790917 -0.987181 0.9998174 0.9790917 -0.9893262 0.9998174 0.9790917 -0.9920401 0.9998174 0.9790917 -0.9954736 0.9998174 0.9790917 -0.9998174 0.9998174 0.9790917 -0.9998557 0.9964095 0.9834123 -0.999886 0.9949945 0.9868501 -0.9999099 0.9946821 0.9895818 -0.9999288 0.9949424 0.9917499 -0.9999437 0.9954669 0.9934694 -0.9834129 0.9998557 0.9834139 -0.9834129 0.9998557 0.9834139 -0.9834129 0.9998557 0.9834138 -0.9834129 0.9998557 0.9834138 -0.9834128 0.9998557 0.9834137 -0.9834128 0.9998557 0.9834136 -0.9834127 0.9998557 0.9834135 -0.9834127 0.9998557 0.9834133 -0.9834126 0.9998557 0.9834131 -0.9834125 0.9998557 0.9834129 -0.9834124 0.9998557 0.9834126 -0.9834123 0.9998557 0.9834123 -0.9834126 0.9998557 0.9834123 -0.9834129 0.9998557 0.9834123 -0.9834134 0.9998557 0.9834123 -0.983414 0.9998557 0.9834123 -0.9834147 0.9998557 0.9834123 -0.9834156 0.9998557 0.9834123 -0.9834168 0.9998557 0.9834123 -0.9834182 0.9998557 0.9834123 -0.9834201 0.9998557 0.9834123 -0.9834224 0.9998557 0.9834123 -0.9834254 0.9998557 0.9834123 -0.9834292 0.9998557 0.9834123 -0.9834339 0.9998557 0.9834123 -0.98344 0.9998557 0.9834123 -0.9834476 0.9998557 0.9834123 -0.9834572 0.9998557 0.9834123 -0.9834694 0.9998557 0.9834123 -0.9834848 0.9998557 0.9834123 -0.9835043 0.9998557 0.9834123 -0.983529 0.9998557 0.9834123 -0.9835603 0.9998557 0.9834123 -0.9835998 0.9998557 0.9834123 -0.9836498 0.9998557 0.9834123 -0.983713 0.9998557 0.9834123 -0.983793 0.9998557 0.9834123 -0.9838943 0.9998557 0.9834123 -0.9840223 0.9998557 0.9834123 -0.9841844 0.9998557 0.9834123 -0.9843894 0.9998557 0.9834123 -0.9846487 0.9998557 0.9834123 -0.9849768 0.9998557 0.9834123 -0.9853919 0.9998557 0.9834123 -0.985917 0.9998557 0.9834123 -0.9865813 0.9998557 0.9834123 -0.9874218 0.9998557 0.9834123 -0.9884852 0.9998557 0.9834123 -0.9898304 0.9998557 0.9834123 -0.9915323 0.9998557 0.9834123 -0.9936855 0.9998557 0.9834123 -0.9964095 0.9998557 0.9834123 -0.9998557 0.9998557 0.9834123 -0.999886 0.9971539 0.9868501 -0.9999099 0.9960344 0.9895818 -0.9999288 0.9957889 0.9917499 -0.9999437 0.9959966 0.9934694 -0.9868505 0.999886 0.9868511 -0.9868505 0.999886 0.9868511 -0.9868505 0.999886 0.9868511 -0.9868505 0.999886 0.986851 -0.9868504 0.999886 0.986851 -0.9868504 0.999886 0.9868509 -0.9868504 0.999886 0.9868508 -0.9868503 0.999886 0.9868507 -0.9868503 0.999886 0.9868506 -0.9868502 0.999886 0.9868505 -0.9868502 0.999886 0.9868503 -0.9868501 0.999886 0.9868501 -0.9868503 0.999886 0.9868501 -0.9868505 0.999886 0.9868501 -0.9868508 0.999886 0.9868501 -0.9868511 0.999886 0.9868501 -0.9868516 0.999886 0.9868501 -0.9868522 0.999886 0.9868501 -0.9868529 0.999886 0.9868501 -0.9868538 0.999886 0.9868501 -0.986855 0.999886 0.9868501 -0.9868565 0.999886 0.9868501 -0.9868583 0.999886 0.9868501 -0.9868607 0.999886 0.9868501 -0.9868637 0.999886 0.9868501 -0.9868674 0.999886 0.9868501 -0.9868722 0.999886 0.9868501 -0.9868783 0.999886 0.9868501 -0.9868859 0.999886 0.9868501 -0.9868956 0.999886 0.9868501 -0.9869078 0.999886 0.9868501 -0.9869233 0.999886 0.9868501 -0.9869428 0.999886 0.9868501 -0.9869676 0.999886 0.9868501 -0.9869989 0.999886 0.9868501 -0.9870386 0.999886 0.9868501 -0.9870887 0.999886 0.9868501 -0.9871521 0.999886 0.9868501 -0.9872324 0.999886 0.9868501 -0.9873339 0.999886 0.9868501 -0.9874624 0.999886 0.9868501 -0.9876249 0.999886 0.9868501 -0.9878304 0.999886 0.9868501 -0.9880905 0.999886 0.9868501 -0.9884196 0.999886 0.9868501 -0.9888359 0.999886 0.9868501 -0.9893626 0.999886 0.9868501 -0.9900289 0.999886 0.9868501 -0.9908718 0.999886 0.9868501 -0.9919383 0.999886 0.9868501 -0.9932875 0.999886 0.9868501 -0.9949945 0.999886 0.9868501 -0.9971539 0.999886 0.9868501 -0.999886 0.999886 0.9868501 -0.9999099 0.9977454 0.9895818 -0.9999288 0.9968599 0.9917499 -0.9999437 0.9966666 0.9934694 -0.989582 0.9999099 0.9895824 -0.989582 0.9999099 0.9895824 -0.989582 0.9999099 0.9895824 -0.989582 0.9999099 0.9895823 -0.989582 0.9999099 0.9895823 -0.9895819 0.9999099 0.9895823 -0.9895819 0.9999099 0.9895822 -0.9895819 0.9999099 0.9895822 -0.9895819 0.9999099 0.9895821 -0.9895818 0.9999099 0.989582 -0.9895818 0.9999099 0.9895819 -0.9895818 0.9999099 0.9895818 -0.9895819 0.9999099 0.9895818 -0.989582 0.9999099 0.9895818 -0.9895822 0.9999099 0.9895818 -0.9895824 0.9999099 0.9895818 -0.9895827 0.9999099 0.9895818 -0.9895831 0.9999099 0.9895818 -0.9895835 0.9999099 0.9895818 -0.9895841 0.9999099 0.9895818 -0.9895848 0.9999099 0.9895818 -0.9895857 0.9999099 0.9895818 -0.9895869 0.9999099 0.9895818 -0.9895884 0.9999099 0.9895818 -0.9895902 0.9999099 0.9895818 -0.9895926 0.9999099 0.9895818 -0.9895956 0.9999099 0.9895818 -0.9895994 0.9999099 0.9895818 -0.9896042 0.9999099 0.9895818 -0.9896102 0.9999099 0.9895818 -0.9896179 0.9999099 0.9895818 -0.9896276 0.9999099 0.9895818 -0.9896398 0.9999099 0.9895818 -0.9896553 0.9999099 0.9895818 -0.9896749 0.9999099 0.9895818 -0.9896998 0.9999099 0.9895818 -0.9897312 0.9999099 0.9895818 -0.9897709 0.9999099 0.9895818 -0.9898212 0.9999099 0.9895818 -0.9898847 0.9999099 0.9895818 -0.9899652 0.9999099 0.9895818 -0.9900669 0.9999099 0.9895818 -0.9901957 0.9999099 0.9895818 -0.9903586 0.9999099 0.9895818 -0.9905646 0.9999099 0.9895818 -0.9908253 0.9999099 0.9895818 -0.9911552 0.9999099 0.9895818 -0.9915724 0.9999099 0.9895818 -0.9921003 0.9999099 0.9895818 -0.9927682 0.9999099 0.9895818 -0.9936131 0.9999099 0.9895818 -0.9946821 0.9999099 0.9895818 -0.9960344 0.9999099 0.9895818 -0.9977454 0.9999099 0.9895818 -0.9999099 0.9999099 0.9895818 -0.9999288 0.9982147 0.9917499 -0.9999437 0.9975144 0.9934694 -0.9917501 0.9999288 0.9917503 -0.9917501 0.9999288 0.9917503 -0.9917501 0.9999288 0.9917503 -0.9917501 0.9999288 0.9917503 -0.9917501 0.9999288 0.9917503 -0.9917501 0.9999288 0.9917503 -0.99175 0.9999288 0.9917502 -0.99175 0.9999288 0.9917502 -0.99175 0.9999288 0.9917501 -0.99175 0.9999288 0.9917501 -0.99175 0.9999288 0.99175 -0.9917499 0.9999288 0.9917499 -0.99175 0.9999288 0.9917499 -0.9917501 0.9999288 0.9917499 -0.9917502 0.9999288 0.9917499 -0.9917503 0.9999288 0.9917499 -0.9917505 0.9999288 0.9917499 -0.9917507 0.9999288 0.9917499 -0.991751 0.9999288 0.9917499 -0.9917514 0.9999288 0.9917499 -0.9917519 0.9999288 0.9917499 -0.9917524 0.9999288 0.9917499 -0.9917532 0.9999288 0.9917499 -0.9917541 0.9999288 0.9917499 -0.9917553 0.9999288 0.9917499 -0.9917567 0.9999288 0.9917499 -0.9917586 0.9999288 0.9917499 -0.991761 0.9999288 0.9917499 -0.991764 0.9999288 0.9917499 -0.9917678 0.9999288 0.9917499 -0.9917725 0.9999288 0.9917499 -0.9917786 0.9999288 0.9917499 -0.9917863 0.9999288 0.9917499 -0.991796 0.9999288 0.9917499 -0.9918083 0.9999288 0.9917499 -0.9918238 0.9999288 0.9917499 -0.9918435 0.9999288 0.9917499 -0.9918683 0.9999288 0.9917499 -0.9918998 0.9999288 0.9917499 -0.9919396 0.9999288 0.9917499 -0.9919899 0.9999288 0.9917499 -0.9920536 0.9999288 0.9917499 -0.9921342 0.9999288 0.9917499 -0.9922362 0.9999288 0.9917499 -0.9923652 0.9999288 0.9917499 -0.9925283 0.9999288 0.9917499 -0.9927348 0.9999288 0.9917499 -0.992996 0.9999288 0.9917499 -0.9933264 0.9999288 0.9917499 -0.9937445 0.9999288 0.9917499 -0.9942733 0.9999288 0.9917499 -0.9949424 0.9999288 0.9917499 -0.9957889 0.9999288 0.9917499 -0.9968599 0.9999288 0.9917499 -0.9982147 0.9999288 0.9917499 -0.9999288 0.9999288 0.9917499 -0.9999437 0.9985869 0.9934694 -0.9934695 0.9999437 0.9934696 -0.9934695 0.9999437 0.9934696 -0.9934695 0.9999437 0.9934696 -0.9934695 0.9999437 0.9934696 -0.9934695 0.9999437 0.9934696 -0.9934695 0.9999437 0.9934696 -0.9934695 0.9999437 0.9934696 -0.9934694 0.9999437 0.9934695 -0.9934694 0.9999437 0.9934695 -0.9934694 0.9999437 0.9934695 -0.9934694 0.9999437 0.9934694 -0.9934694 0.9999437 0.9934694 -0.9934694 0.9999437 0.9934694 -0.9934695 0.9999437 0.9934694 -0.9934696 0.9999437 0.9934694 -0.9934696 0.9999437 0.9934694 -0.9934698 0.9999437 0.9934694 -0.9934699 0.9999437 0.9934694 -0.9934701 0.9999437 0.9934694 -0.9934703 0.9999437 0.9934694 -0.9934706 0.9999437 0.9934694 -0.9934709 0.9999437 0.9934694 -0.9934714 0.9999437 0.9934694 -0.993472 0.9999437 0.9934694 -0.9934727 0.9999437 0.9934694 -0.9934736 0.9999437 0.9934694 -0.9934748 0.9999437 0.9934694 -0.9934763 0.9999437 0.9934694 -0.9934782 0.9999437 0.9934694 -0.9934805 0.9999437 0.9934694 -0.9934835 0.9999437 0.9934694 -0.9934873 0.9999437 0.9934694 -0.9934921 0.9999437 0.9934694 -0.9934982 0.9999437 0.9934694 -0.9935059 0.9999437 0.9934694 -0.9935156 0.9999437 0.9934694 -0.9935279 0.9999437 0.9934694 -0.9935435 0.9999437 0.9934694 -0.9935631 0.9999437 0.9934694 -0.993588 0.9999437 0.9934694 -0.9936196 0.9999437 0.9934694 -0.9936594 0.9999437 0.9934694 -0.9937098 0.9999437 0.9934694 -0.9937736 0.9999437 0.9934694 -0.9938543 0.9999437 0.9934694 -0.9939564 0.9999437 0.9934694 -0.9940856 0.9999437 0.9934694 -0.994249 0.9999437 0.9934694 -0.9944558 0.9999437 0.9934694 -0.9947174 0.9999437 0.9934694 -0.9950483 0.9999437 0.9934694 -0.9954669 0.9999437 0.9934694 -0.9959966 0.9999437 0.9934694 -0.9966666 0.9999437 0.9934694 -0.9975144 0.9999437 0.9934694 -0.9985869 0.9999437 0.9934694 -0.9999437 0.9999437 0.9934694 -0.0000238 0.0000238 0.0309069 -0.0005417 0.0000238 0.0309069 -0.0011968 0.0000238 0.0309069 -0.0020256 0.0000238 0.0309069 -0.0030742 0.0000238 0.0309069 -0.0044007 0.0000238 0.0309069 -0.006079 0.0000238 0.0309069 -0.0082023 0.0000238 0.0309069 -0.0108885 0.0000238 0.0309069 -0.0142868 0.0000238 0.0309069 -0.0185862 0.0000238 0.0309069 -0.0240255 0.0000238 0.0309069 -0.0309069 0.0000238 0.0309069 -0.0396127 0.0000238 0.0309069 -0.0506267 0.0000238 0.0309069 -0.0645609 0.0000238 0.0309069 -0.0821895 0.0000238 0.0309069 -0.1044919 0.0000238 0.0309069 -0.1327073 0.0000238 0.0309069 -0.1684036 0.0000238 0.0309069 -0.2135639 0.0000238 0.0309069 -0.2706977 0.0000238 0.0309069 -0.3429792 0.0000238 0.0309069 -0.4344249 0.0000238 0.0309069 -0.5501155 0.0000238 0.0309069 -0.6964791 0.0000238 0.0309069 -0.8407292 0.0051514 0.0344214 -0.9033413 0.0279321 0.0521597 -0.9354466 0.0624569 0.0815473 -0.9545467 0.1059991 0.120662 -0.9669269 0.1572498 0.1683064 -0.9754027 0.2151269 0.2233317 -0.9814251 0.2783684 0.2843648 -0.9858181 0.3454107 0.3497276 -0.9890841 0.4144197 0.4174814 -0.9915469 0.4834235 0.4855631 -0.993424 0.5504963 0.5519704 -0.9948662 0.6139459 0.6149479 -0.9959813 0.6724572 0.6731299 -0.9968475 0.7251659 0.7256124 -0.997523 0.7716588 0.7719522 -0.9980513 0.8119154 0.8121065 -0.9984653 0.8462171 0.8463406 -0.9987905 0.8750477 0.8751271 -0.9990461 0.8990028 0.8990535 -0.9992474 0.9187175 0.9187498 -0.999406 0.9348153 0.9348357 -0.999531 0.9478754 0.9478883 -0.9996296 0.958416 0.9584241 -0.9997074 0.9668873 0.9668925 -0.9997689 0.9736726 0.9736758 -0.9998174 0.9790927 0.9790948 -0.9998557 0.9834129 0.9834142 -0.999886 0.9868505 0.9868513 -0.9999099 0.989582 0.9895825 -0.9999288 0.9917501 0.9917504 -0.9999437 0.9934695 0.9934697 -0.0000238 0.0005417 0.0309069 -0.0000382 0.0000382 0.0304033 -0.0006933 0.0000382 0.0304033 -0.0015221 0.0000382 0.0304033 -0.0025707 0.0000382 0.0304033 -0.0038972 0.0000382 0.0304033 -0.0055755 0.0000382 0.0304033 -0.0076988 0.0000382 0.0304033 -0.0103849 0.0000382 0.0304033 -0.0137833 0.0000382 0.0304033 -0.0180827 0.0000382 0.0304033 -0.023522 0.0000382 0.0304033 -0.0304033 0.0000382 0.0304033 -0.0391092 0.0000382 0.0304033 -0.0501232 0.0000382 0.0304033 -0.0640574 0.0000382 0.0304033 -0.081686 0.0000382 0.0304033 -0.1039884 0.0000382 0.0304033 -0.1322038 0.0000382 0.0304033 -0.1679 0.0000382 0.0304033 -0.2130604 0.0000382 0.0304033 -0.2701941 0.0000382 0.0304033 -0.3424757 0.0000382 0.0304033 -0.4339214 0.0000382 0.0304033 -0.549612 0.0000382 0.0304033 -0.6959756 0.0000382 0.0304033 -0.8405071 0.0051286 0.0339178 -0.9032596 0.0278872 0.0517186 -0.9354101 0.0624063 0.0811837 -0.9545286 0.1059489 0.1203707 -0.9669173 0.1572031 0.1680773 -0.9753975 0.2150852 0.2231543 -0.9814221 0.2783325 0.2842295 -0.9858163 0.3453807 0.3496259 -0.9890831 0.4143955 0.4174062 -0.9915463 0.4834045 0.4855085 -0.9934236 0.5504818 0.5519314 -0.994866 0.6139352 0.6149205 -0.9959811 0.6724495 0.6731109 -0.9968474 0.7251605 0.7255995 -0.997523 0.7716551 0.7719436 -0.9980512 0.8119128 0.8121007 -0.9984653 0.8462154 0.8463368 -0.9987905 0.8750466 0.8751246 -0.9990461 0.899002 0.8990519 -0.9992474 0.918717 0.9187488 -0.999406 0.9348149 0.9348351 -0.999531 0.9478752 0.9478879 -0.9996296 0.9584159 0.9584239 -0.9997074 0.9668872 0.9668923 -0.9997689 0.9736726 0.9736757 -0.9998174 0.9790927 0.9790947 -0.9998557 0.9834129 0.9834142 -0.999886 0.9868505 0.9868513 -0.9999099 0.989582 0.9895825 -0.9999288 0.9917501 0.9917504 -0.9999437 0.9934695 0.9934697 -0.0000238 0.0011968 0.0309069 -0.0000382 0.0006933 0.0304033 -0.0000611 0.0000611 0.0297711 -0.0008899 0.0000611 0.0297711 -0.0019385 0.0000611 0.0297711 -0.003265 0.0000611 0.0297711 -0.0049433 0.0000611 0.0297711 -0.0070666 0.0000611 0.0297711 -0.0097527 0.0000611 0.0297711 -0.0131511 0.0000611 0.0297711 -0.0174505 0.0000611 0.0297711 -0.0228898 0.0000611 0.0297711 -0.0297711 0.0000611 0.0297711 -0.038477 0.0000611 0.0297711 -0.049491 0.0000611 0.0297711 -0.0634252 0.0000611 0.0297711 -0.0810538 0.0000611 0.0297711 -0.1033562 0.0000611 0.0297711 -0.1315716 0.0000611 0.0297711 -0.1672678 0.0000611 0.0297711 -0.2124282 0.0000611 0.0297711 -0.2695619 0.0000611 0.0297711 -0.3418435 0.0000611 0.0297711 -0.4332891 0.0000611 0.0297711 -0.5489798 0.0000611 0.0297711 -0.6953434 0.0000611 0.0297711 -0.8402274 0.0051047 0.0332852 -0.9031567 0.0278347 0.0511643 -0.9353643 0.0623458 0.0807269 -0.9545059 0.1058883 0.1200048 -0.9669053 0.1571463 0.1677895 -0.9753908 0.2150342 0.2229315 -0.9814183 0.2782884 0.2840595 -0.9858141 0.3453439 0.3494983 -0.9890818 0.4143657 0.4173119 -0.9915455 0.4833811 0.4854399 -0.9934231 0.550464 0.5518824 -0.9948657 0.6139219 0.6148861 -0.9959809 0.6724399 0.6730871 -0.9968473 0.7251537 0.7255833 -0.9975229 0.7716504 0.7719327 -0.9980512 0.8119096 0.8120935 -0.9984653 0.8462132 0.8463321 -0.9987904 0.8750451 0.8751215 -0.9990461 0.8990011 0.8990499 -0.9992474 0.9187164 0.9187475 -0.999406 0.9348146 0.9348342 -0.999531 0.947875 0.9478874 -0.9996296 0.9584157 0.9584235 -0.9997074 0.9668871 0.9668921 -0.9997689 0.9736725 0.9736756 -0.9998174 0.9790927 0.9790946 -0.9998557 0.9834129 0.9834141 -0.999886 0.9868505 0.9868512 -0.9999099 0.989582 0.9895825 -0.9999288 0.9917501 0.9917504 -0.9999437 0.9934695 0.9934697 -0.0000238 0.0020256 0.0309069 -0.0000382 0.0015221 0.0304033 -0.0000611 0.0008899 0.0297711 -0.0000978 0.0000978 0.028979 -0.0011463 0.0000978 0.028979 -0.0024729 0.0000978 0.028979 -0.0041512 0.0000978 0.028979 -0.0062744 0.0000978 0.028979 -0.0089606 0.0000978 0.028979 -0.012359 0.0000978 0.028979 -0.0166583 0.0000978 0.028979 -0.0220976 0.0000978 0.028979 -0.028979 0.0000978 0.028979 -0.0376849 0.0000978 0.028979 -0.0486989 0.0000978 0.028979 -0.0626331 0.0000978 0.028979 -0.0802616 0.0000978 0.028979 -0.102564 0.0000978 0.028979 -0.1307795 0.0000978 0.028979 -0.1664757 0.0000978 0.028979 -0.2116361 0.0000978 0.028979 -0.2687698 0.0000978 0.028979 -0.3410514 0.0000978 0.028979 -0.432497 0.0000978 0.028979 -0.5481876 0.0000978 0.028979 -0.6945513 0.0000978 0.028979 -0.8398756 0.0050826 0.032492 -0.9030276 0.0277752 0.050469 -0.9353068 0.0622749 0.080154 -0.9544774 0.1058162 0.1195459 -0.9668902 0.1570779 0.1674288 -0.9753825 0.2149725 0.2226522 -0.9814136 0.2782347 0.2838465 -0.9858113 0.3452987 0.3493382 -0.9890801 0.414329 0.4171936 -0.9915446 0.4833522 0.485354 -0.9934225 0.5504419 0.551821 -0.9948653 0.6139056 0.6148429 -0.9959807 0.672428 0.6730573 -0.9968472 0.7251454 0.725563 -0.9975228 0.7716446 0.771919 -0.9980511 0.8119057 0.8120844 -0.9984653 0.8462106 0.8463261 -0.9987904 0.8750434 0.8751176 -0.9990461 0.899 0.8990474 -0.9992474 0.9187157 0.9187459 -0.999406 0.9348141 0.9348332 -0.999531 0.9478746 0.9478867 -0.9996296 0.9584155 0.9584231 -0.9997074 0.966887 0.9668918 -0.9997689 0.9736724 0.9736754 -0.9998174 0.9790926 0.9790945 -0.9998557 0.9834129 0.983414 -0.999886 0.9868505 0.9868512 -0.9999099 0.989582 0.9895824 -0.9999288 0.9917501 0.9917504 -0.9999437 0.9934695 0.9934697 -0.0000238 0.0030742 0.0309069 -0.0000382 0.0025707 0.0304033 -0.0000611 0.0019385 0.0297711 -0.0000978 0.0011463 0.028979 -0.0001565 0.0001565 0.0279891 -0.001483 0.0001565 0.0279891 -0.0031613 0.0001565 0.0279891 -0.0052846 0.0001565 0.0279891 -0.0079707 0.0001565 0.0279891 -0.0113691 0.0001565 0.0279891 -0.0156685 0.0001565 0.0279891 -0.0211078 0.0001565 0.0279891 -0.0279891 0.0001565 0.0279891 -0.036695 0.0001565 0.0279891 -0.047709 0.0001565 0.0279891 -0.0616432 0.0001565 0.0279891 -0.0792718 0.0001565 0.0279891 -0.1015742 0.0001565 0.0279891 -0.1297896 0.0001565 0.0279891 -0.1654858 0.0001565 0.0279891 -0.2106462 0.0001565 0.0279891 -0.2677799 0.0001565 0.0279891 -0.3400615 0.0001565 0.0279891 -0.4315072 0.0001565 0.0279891 -0.5471978 0.0001565 0.0279891 -0.6935614 0.0001565 0.0279891 -0.8394338 0.0050676 0.0314998 -0.9028657 0.0277111 0.0495992 -0.9352348 0.0621943 0.0794373 -0.9544418 0.1057322 0.1189719 -0.9668714 0.1569971 0.1669776 -0.9753721 0.2148987 0.2223029 -0.9814076 0.2781701 0.2835801 -0.9858079 0.3452442 0.3491382 -0.9890781 0.4142845 0.4170458 -0.9915433 0.4833171 0.4852466 -0.9934218 0.550415 0.5517442 -0.9948649 0.6138855 0.614789 -0.9959804 0.6724135 0.67302 -0.996847 0.7251351 0.7255376 -0.9975227 0.7716375 0.7719019 -0.9980511 0.8119009 0.8120731 -0.9984652 0.8462073 0.8463187 -0.9987904 0.8750412 0.8751128 -0.9990461 0.8989986 0.8990443 -0.9992474 0.9187148 0.9187439 -0.999406 0.9348135 0.9348319 -0.999531 0.9478743 0.9478859 -0.9996296 0.9584153 0.9584226 -0.9997074 0.9668869 0.9668915 -0.9997689 0.9736723 0.9736752 -0.9998174 0.9790925 0.9790944 -0.9998557 0.9834128 0.983414 -0.999886 0.9868504 0.9868512 -0.9999099 0.989582 0.9895824 -0.9999288 0.9917501 0.9917503 -0.9999437 0.9934695 0.9934696 -0.0000238 0.0044007 0.0309069 -0.0000382 0.0038972 0.0304033 -0.0000611 0.003265 0.0297711 -0.0000978 0.0024729 0.028979 -0.0001565 0.001483 0.0279891 -0.0002504 0.0002504 0.0267565 -0.0019287 0.0002504 0.0267565 -0.004052 0.0002504 0.0267565 -0.0067381 0.0002504 0.0267565 -0.0101365 0.0002504 0.0267565 -0.0144359 0.0002504 0.0267565 -0.0198752 0.0002504 0.0267565 -0.0267565 0.0002504 0.0267565 -0.0354624 0.0002504 0.0267565 -0.0464764 0.0002504 0.0267565 -0.0604106 0.0002504 0.0267565 -0.0780392 0.0002504 0.0267565 -0.1003416 0.0002504 0.0267565 -0.128557 0.0002504 0.0267565 -0.1642532 0.0002504 0.0267565 -0.2094136 0.0002504 0.0267565 -0.2665473 0.0002504 0.0267565 -0.3388289 0.0002504 0.0267565 -0.4302746 0.0002504 0.0267565 -0.5459652 0.0002504 0.0267565 -0.6923288 0.0002504 0.0267565 -0.8388802 0.0050694 0.0302631 -0.9026634 0.0276479 0.0485143 -0.9351449 0.0621069 0.0785435 -0.9543974 0.1056375 0.1182564 -0.9668479 0.156904 0.1664151 -0.9753591 0.2148124 0.2218676 -0.9814002 0.2780936 0.2832482 -0.9858036 0.3451791 0.348889 -0.9890755 0.4142311 0.4168617 -0.9915418 0.4832747 0.4851127 -0.9934209 0.5503825 0.5516486 -0.9948643 0.6138613 0.6147218 -0.9959801 0.6723959 0.6729735 -0.9968468 0.7251226 0.725506 -0.9975226 0.7716288 0.7718807 -0.998051 0.8118949 0.812059 -0.9984652 0.8462034 0.8463094 -0.9987904 0.8750386 0.8751068 -0.9990461 0.8989969 0.8990404 -0.9992474 0.9187137 0.9187414 -0.9994059 0.9348128 0.9348303 -0.999531 0.9478738 0.9478849 -0.9996296 0.958415 0.958422 -0.9997074 0.9668867 0.9668911 -0.9997689 0.9736722 0.973675 -0.9998174 0.9790925 0.9790942 -0.9998557 0.9834128 0.9834139 -0.999886 0.9868504 0.9868511 -0.9999099 0.9895819 0.9895824 -0.9999288 0.9917501 0.9917503 -0.9999437 0.9934695 0.9934696 -0.0000238 0.006079 0.0309069 -0.0000382 0.0055755 0.0304033 -0.0000611 0.0049433 0.0297711 -0.0000978 0.0041512 0.028979 -0.0001565 0.0031613 0.0279891 -0.0002504 0.0019287 0.0267565 -0.0004008 0.0004008 0.0252287 -0.0025241 0.0004008 0.0252287 -0.0052103 0.0004008 0.0252287 -0.0086086 0.0004008 0.0252287 -0.012908 0.0004008 0.0252287 -0.0183473 0.0004008 0.0252287 -0.0252287 0.0004008 0.0252287 -0.0339345 0.0004008 0.0252287 -0.0449485 0.0004008 0.0252287 -0.0588827 0.0004008 0.0252287 -0.0765113 0.0004008 0.0252287 -0.0988137 0.0004008 0.0252287 -0.1270291 0.0004008 0.0252287 -0.1627254 0.0004008 0.0252287 -0.2078857 0.0004008 0.0252287 -0.2650195 0.0004008 0.0252287 -0.337301 0.0004008 0.0252287 -0.4287467 0.0004008 0.0252287 -0.5444373 0.0004008 0.0252287 -0.6908009 0.0004008 0.0252287 -0.8381886 0.0051048 0.0287279 -0.9024114 0.0275966 0.0471669 -0.9350332 0.0620199 0.0774337 -0.9543421 0.1055364 0.117368 -0.9668187 0.1568008 0.1657171 -0.975343 0.2147144 0.2213275 -0.9813911 0.2780055 0.2828365 -0.9857982 0.3451032 0.3485799 -0.9890723 0.4141683 0.4166333 -0.9915399 0.4832246 0.4849468 -0.9934197 0.5503438 0.5515301 -0.9948636 0.6138323 0.6146385 -0.9959797 0.6723748 0.672916 -0.9968465 0.7251076 0.7254668 -0.9975224 0.7716184 0.7718544 -0.9980509 0.8118878 0.8120415 -0.9984651 0.8461986 0.846298 -0.9987903 0.8750355 0.8750993 -0.9990461 0.8989948 0.8990356 -0.9992473 0.9187123 0.9187383 -0.9994059 0.9348119 0.9348284 -0.999531 0.9478733 0.9478837 -0.9996296 0.9584146 0.9584212 -0.9997074 0.9668865 0.9668906 -0.9997689 0.9736721 0.9736747 -0.9998174 0.9790924 0.979094 -0.9998557 0.9834127 0.9834137 -0.999886 0.9868504 0.986851 -0.9999099 0.9895819 0.9895823 -0.9999288 0.99175 0.9917503 -0.9999437 0.9934695 0.9934696 -0.0000238 0.0082023 0.0309069 -0.0000382 0.0076988 0.0304033 -0.0000611 0.0070666 0.0297711 -0.0000978 0.0062744 0.028979 -0.0001565 0.0052846 0.0279891 -0.0002504 0.004052 0.0267565 -0.0004008 0.0025241 0.0252287 -0.0006416 0.0006416 0.0233461 -0.0033277 0.0006416 0.0233461 -0.0067261 0.0006416 0.0233461 -0.0110255 0.0006416 0.0233461 -0.0164648 0.0006416 0.0233461 -0.0233461 0.0006416 0.0233461 -0.032052 0.0006416 0.0233461 -0.043066 0.0006416 0.0233461 -0.0570002 0.0006416 0.0233461 -0.0746288 0.0006416 0.0233461 -0.0969312 0.0006416 0.0233461 -0.1251466 0.0006416 0.0233461 -0.1608428 0.0006416 0.0233461 -0.2060032 0.0006416 0.0233461 -0.2631369 0.0006416 0.0233461 -0.3354185 0.0006416 0.0233461 -0.4268641 0.0006416 0.0233461 -0.5425548 0.0006416 0.0233461 -0.6889184 0.0006416 0.0233461 -0.8373283 0.0052028 0.0268333 -0.9020992 0.0275778 0.0455028 -0.9348949 0.0619473 0.0760633 -0.9542739 0.1054384 0.1162715 -0.9667827 0.1566936 0.1648558 -0.9753231 0.2146085 0.2206612 -0.9813797 0.2779077 0.2823287 -0.9857916 0.3450175 0.3481986 -0.9890684 0.4140964 0.4163517 -0.9915376 0.4831666 0.4847422 -0.9934183 0.5502987 0.5513839 -0.9948628 0.6137984 0.6145359 -0.9959791 0.67235 0.672845 -0.9968462 0.7250899 0.7254184 -0.9975222 0.7716061 0.7718219 -0.9980508 0.8118794 0.81202 -0.998465 0.8461929 0.8462838 -0.9987903 0.8750317 0.8750901 -0.999046 0.8989923 0.8990296 -0.9992473 0.9187107 0.9187344 -0.9994059 0.9348109 0.9348259 -0.999531 0.9478726 0.9478821 -0.9996296 0.9584142 0.9584202 -0.9997074 0.9668862 0.96689 -0.9997689 0.9736719 0.9736743 -0.9998174 0.9790923 0.9790938 -0.9998557 0.9834127 0.9834136 -0.999886 0.9868503 0.9868509 -0.9999099 0.9895819 0.9895823 -0.9999288 0.99175 0.9917503 -0.9999437 0.9934694 0.9934696 -0.0000238 0.0108885 0.0309069 -0.0000382 0.0103849 0.0304033 -0.0000611 0.0097527 0.0297711 -0.0000978 0.0089606 0.028979 -0.0001565 0.0079707 0.0279891 -0.0002504 0.0067381 0.0267565 -0.0004008 0.0052103 0.0252287 -0.0006416 0.0033277 0.0233461 -0.0010268 0.0010268 0.0210452 -0.0044252 0.0010268 0.0210452 -0.0087246 0.0010268 0.0210452 -0.0141639 0.0010268 0.0210452 -0.0210452 0.0010268 0.0210452 -0.0297511 0.0010268 0.0210452 -0.0407651 0.0010268 0.0210452 -0.0546993 0.0010268 0.0210452 -0.0723279 0.0010268 0.0210452 -0.0946303 0.0010268 0.0210452 -0.1228457 0.0010268 0.0210452 -0.1585419 0.0010268 0.0210452 -0.2037023 0.0010268 0.0210452 -0.260836 0.0010268 0.0210452 -0.3331176 0.0010268 0.0210452 -0.4245633 0.0010268 0.0210452 -0.5402539 0.0010268 0.0210452 -0.6866175 0.0010268 0.0210452 -0.8362644 0.0054121 0.024513 -0.9017148 0.0276281 0.0434629 -0.9347252 0.061916 0.0743837 -0.9541902 0.1053624 0.1149282 -0.9667385 0.1565954 0.1638011 -0.9752987 0.2145034 0.2198456 -0.9813659 0.2778058 0.2817072 -0.9857835 0.3449254 0.3477322 -0.9890637 0.4140176 0.4160072 -0.9915347 0.4831021 0.484492 -0.9934166 0.550248 0.5512052 -0.9948617 0.6137599 0.6144104 -0.9959785 0.6723217 0.6727582 -0.9968458 0.7250697 0.7253594 -0.997522 0.7715919 0.7717822 -0.9980506 0.8118697 0.8119937 -0.9984649 0.8461864 0.8462665 -0.9987902 0.8750274 0.8750788 -0.999046 0.8989895 0.8990224 -0.9992473 0.9187089 0.9187298 -0.9994059 0.9348097 0.934823 -0.999531 0.9478718 0.9478802 -0.9996296 0.9584137 0.958419 -0.9997074 0.9668859 0.9668892 -0.9997689 0.9736717 0.9736738 -0.9998174 0.9790921 0.9790935 -0.9998557 0.9834126 0.9834134 -0.999886 0.9868503 0.9868508 -0.9999099 0.9895819 0.9895822 -0.9999288 0.99175 0.9917502 -0.9999437 0.9934694 0.9934696 -0.0000238 0.0142868 0.0309069 -0.0000382 0.0137833 0.0304033 -0.0000611 0.0131511 0.0297711 -0.0000978 0.012359 0.028979 -0.0001565 0.0113691 0.0279891 -0.0002504 0.0101365 0.0267565 -0.0004008 0.0086086 0.0252287 -0.0006416 0.0067261 0.0233461 -0.0010268 0.0044252 0.0210452 -0.0016435 0.0016435 0.0182636 -0.0059429 0.0016435 0.0182636 -0.0113822 0.0016435 0.0182636 -0.0182636 0.0016435 0.0182636 -0.0269694 0.0016435 0.0182636 -0.0379834 0.0016435 0.0182636 -0.0519176 0.0016435 0.0182636 -0.0695462 0.0016435 0.0182636 -0.0918486 0.0016435 0.0182636 -0.120064 0.0016435 0.0182636 -0.1557603 0.0016435 0.0182636 -0.2009206 0.0016435 0.0182636 -0.2580543 0.0016435 0.0182636 -0.3303359 0.0016435 0.0182636 -0.4217816 0.0016435 0.0182636 -0.5374722 0.0016435 0.0182636 -0.6838358 0.0016435 0.0182636 -0.8349593 0.0058134 0.0217012 -0.9012461 0.0278105 0.0409879 -0.9345187 0.0619734 0.0723466 -0.9540886 0.1053433 0.1132997 -0.966685 0.1565315 0.162523 -0.9752692 0.2144168 0.2188577 -0.9813491 0.2777122 0.2809547 -0.9857738 0.3448353 0.3471677 -0.9890579 0.4139373 0.4155903 -0.9915312 0.4830346 0.4841892 -0.9934145 0.5501939 0.550989 -0.9948604 0.6137183 0.6142585 -0.9959777 0.6722907 0.6726533 -0.9968453 0.7250473 0.7252879 -0.9975217 0.7715762 0.7717342 -0.9980504 0.8118589 0.8119618 -0.9984648 0.8461791 0.8462456 -0.9987902 0.8750225 0.8750652 -0.9990459 0.8989863 0.8990136 -0.9992473 0.9187068 0.9187241 -0.9994059 0.9348083 0.9348194 -0.9995309 0.947871 0.9478779 -0.9996296 0.9584132 0.9584175 -0.9997074 0.9668855 0.9668883 -0.9997689 0.9736715 0.9736732 -0.9998174 0.979092 0.9790931 -0.9998557 0.9834125 0.9834132 -0.999886 0.9868502 0.9868507 -0.9999099 0.9895818 0.9895821 -0.9999288 0.99175 0.9917502 -0.9999437 0.9934694 0.9934695 -0.0000238 0.0185862 0.0309069 -0.0000382 0.0180827 0.0304033 -0.0000611 0.0174505 0.0297711 -0.0000978 0.0166583 0.028979 -0.0001565 0.0156685 0.0279891 -0.0002504 0.0144359 0.0267565 -0.0004008 0.012908 0.0252287 -0.0006416 0.0110255 0.0233461 -0.0010268 0.0087246 0.0210452 -0.0016435 0.0059429 0.0182636 -0.0026305 0.0026305 0.0149512 -0.0080698 0.0026305 0.0149512 -0.0149512 0.0026305 0.0149512 -0.023657 0.0026305 0.0149512 -0.0346711 0.0026305 0.0149512 -0.0486053 0.0026305 0.0149512 -0.0662338 0.0026305 0.0149512 -0.0885362 0.0026305 0.0149512 -0.1167517 0.0026305 0.0149512 -0.1524479 0.0026305 0.0149512 -0.1976083 0.0026305 0.0149512 -0.254742 0.0026305 0.0149512 -0.3270236 0.0026305 0.0149512 -0.4184692 0.0026305 0.0149512 -0.5341598 0.0026305 0.0149512 -0.6805235 0.0026305 0.0149512 -0.8333779 0.0065402 0.0183437 -0.900682 0.0282324 0.0380282 -0.9342712 0.062202 0.0699113 -0.9539671 0.1054431 0.111354 -0.9666211 0.1565473 0.160997 -0.975234 0.2143816 0.2176788 -0.9813291 0.2776503 0.280057 -0.9857621 0.3447636 0.3464944 -0.989051 0.4138668 0.4150933 -0.9915271 0.4829718 0.4838283 -0.993412 0.5501416 0.5507314 -0.9948589 0.6136769 0.6140776 -0.9959768 0.6722594 0.6725283 -0.9968448 0.7250244 0.7252028 -0.9975213 0.7715599 0.7716771 -0.9980502 0.8118476 0.8119239 -0.9984647 0.8461714 0.8462207 -0.9987901 0.8750173 0.875049 -0.9990459 0.8989829 0.8990031 -0.9992472 0.9187045 0.9187174 -0.9994059 0.9348069 0.9348151 -0.9995309 0.94787 0.9478752 -0.9996296 0.9584126 0.9584158 -0.9997074 0.9668852 0.9668872 -0.9997689 0.9736712 0.9736725 -0.9998174 0.9790919 0.9790927 -0.9998557 0.9834124 0.9834129 -0.999886 0.9868502 0.9868505 -0.9999099 0.9895818 0.989582 -0.9999288 0.99175 0.9917501 -0.9999437 0.9934694 0.9934695 -0.0000238 0.0240255 0.0309069 -0.0000382 0.023522 0.0304033 -0.0000611 0.0228898 0.0297711 -0.0000978 0.0220976 0.028979 -0.0001565 0.0211078 0.0279891 -0.0002504 0.0198752 0.0267565 -0.0004008 0.0183473 0.0252287 -0.0006416 0.0164648 0.0233461 -0.0010268 0.0141639 0.0210452 -0.0016435 0.0113822 0.0182636 -0.0026305 0.0080698 0.0149512 -0.0042103 0.0042103 0.0110917 -0.0110917 0.0042103 0.0110917 -0.0197975 0.0042103 0.0110917 -0.0308116 0.0042103 0.0110917 -0.0447458 0.0042103 0.0110917 -0.0623743 0.0042103 0.0110917 -0.0846767 0.0042103 0.0110917 -0.1128922 0.0042103 0.0110917 -0.1485884 0.0042103 0.0110917 -0.1937488 0.0042103 0.0110917 -0.2508825 0.0042103 0.0110917 -0.3231641 0.0042103 0.0110917 -0.4146097 0.0042103 0.0110917 -0.5303003 0.0042103 0.0110917 -0.676664 0.0042103 0.0110917 -0.8314967 0.0078103 0.0144193 -0.9000167 0.0290732 0.0345622 -0.9339805 0.062742 0.0670606 -0.9538247 0.1057683 0.1090781 -0.9665463 0.1567226 0.1592131 -0.9751928 0.2144566 0.2163014 -0.9813057 0.2776626 0.2790088 -0.9857485 0.3447407 0.3457085 -0.989043 0.4138277 0.4145133 -0.9915223 0.4829286 0.4834073 -0.9934091 0.5501012 0.5504308 -0.9948571 0.6136427 0.6138666 -0.9959757 0.6722322 0.6723825 -0.9968441 0.7250039 0.7251035 -0.9975209 0.7715449 0.7716104 -0.99805 0.811837 0.8118797 -0.9984645 0.8461641 0.8461917 -0.99879 0.8750124 0.8750301 -0.9990458 0.8989796 0.8989909 -0.9992472 0.9187024 0.9187096 -0.9994059 0.9348055 0.9348101 -0.9995309 0.9478691 0.947872 -0.9996296 0.958412 0.9584138 -0.9997074 0.9668848 0.9668859 -0.9997689 0.973671 0.9736717 -0.9998174 0.9790917 0.9790922 -0.9998557 0.9834123 0.9834126 -0.999886 0.9868501 0.9868503 -0.9999099 0.9895818 0.9895819 -0.9999288 0.9917499 0.99175 -0.9999437 0.9934694 0.9934694 -0.0000238 0.0309069 0.0309069 -0.0000382 0.0304033 0.0304033 -0.0000611 0.0297711 0.0297711 -0.0000978 0.028979 0.028979 -0.0001565 0.0279891 0.0279891 -0.0002504 0.0267565 0.0267565 -0.0004008 0.0252287 0.0252287 -0.0006416 0.0233461 0.0233461 -0.0010268 0.0210452 0.0210452 -0.0016435 0.0182636 0.0182636 -0.0026305 0.0149512 0.0149512 -0.0042103 0.0110917 0.0110917 -0.0067388 0.0067388 0.0067388 -0.0154447 0.0067388 0.0067388 -0.0264587 0.0067388 0.0067388 -0.0403929 0.0067388 0.0067388 -0.0580214 0.0067388 0.0067388 -0.0803239 0.0067388 0.0067388 -0.1085393 0.0067388 0.0067388 -0.1442355 0.0067388 0.0067388 -0.1893959 0.0067388 0.0067388 -0.2465296 0.0067388 0.0067388 -0.3188112 0.0067388 0.0067388 -0.4102568 0.0067388 0.0067388 -0.5259474 0.0067388 0.0067388 -0.6723111 0.0067388 0.0067388 -0.8293233 0.0099781 0.0099781 -0.8992555 0.0306306 0.0306306 -0.9336494 0.0638283 0.0638283 -0.953663 0.1064997 0.1064997 -0.9664615 0.1571937 0.1571937 -0.9751462 0.2147432 0.2147432 -0.9812792 0.2778236 0.2778236 -0.9857332 0.3448204 0.3448204 -0.9890339 0.4138582 0.4138582 -0.9915169 0.4829319 0.4829319 -0.9934058 0.5500915 0.5500915 -0.9948551 0.6136284 0.6136284 -0.9959745 0.672218 0.672218 -0.9968433 0.7249916 0.7249916 -0.9975204 0.7715352 0.7715352 -0.9980497 0.8118298 0.8118298 -0.9984643 0.8461589 0.8461589 -0.9987899 0.8750088 0.8750088 -0.9990458 0.8989771 0.8989771 -0.9992472 0.9187008 0.9187008 -0.9994058 0.9348044 0.9348044 -0.9995309 0.9478684 0.9478684 -0.9996296 0.9584115 0.9584115 -0.9997074 0.9668845 0.9668845 -0.9997689 0.9736708 0.9736708 -0.9998174 0.9790916 0.9790916 -0.9998557 0.9834122 0.9834122 -0.999886 0.9868501 0.9868501 -0.9999099 0.9895817 0.9895817 -0.9999288 0.9917499 0.9917499 -0.9999437 0.9934694 0.9934694 -0.0000238 0.0396127 0.0309069 -0.0000382 0.0391092 0.0304033 -0.0000611 0.038477 0.0297711 -0.0000978 0.0376849 0.028979 -0.0001565 0.036695 0.0279891 -0.0002504 0.0354624 0.0267565 -0.0004008 0.0339345 0.0252287 -0.0006416 0.032052 0.0233461 -0.0010268 0.0297511 0.0210452 -0.0016435 0.0269694 0.0182636 -0.0026305 0.023657 0.0149512 -0.0042103 0.0197975 0.0110917 -0.0067388 0.0154447 0.0067388 -0.0154447 0.0154447 0.0067388 -0.0264587 0.0154447 0.0067388 -0.0403929 0.0154447 0.0067388 -0.0580214 0.0154447 0.0067388 -0.0803239 0.0154447 0.0067388 -0.1085393 0.0154447 0.0067388 -0.1442355 0.0154447 0.0067388 -0.1893959 0.0154447 0.0067388 -0.2465296 0.0154447 0.0067388 -0.3188112 0.0154447 0.0067388 -0.4102568 0.0154447 0.0067388 -0.5259474 0.0154447 0.0067388 -0.6723111 0.0154447 0.0067388 -0.8293233 0.0183626 0.0099781 -0.8992555 0.0376003 0.0306306 -0.9336494 0.0693101 0.0638283 -0.953663 0.1106989 0.1064997 -0.9664615 0.1603521 0.1571937 -0.9751462 0.2170817 0.2147432 -0.9812792 0.2795295 0.2778236 -0.9857332 0.3460466 0.3448204 -0.9890339 0.4147267 0.4138582 -0.9915169 0.4835382 0.4829319 -0.9934058 0.5505089 0.5500915 -0.9948551 0.6139119 0.6136284 -0.9959745 0.6724081 0.672218 -0.9968433 0.7251177 0.7249916 -0.9975204 0.7716181 0.7715352 -0.9980497 0.8118837 0.8118298 -0.9984643 0.8461938 0.8461589 -0.9987899 0.8750312 0.8750088 -0.9990458 0.8989915 0.8989771 -0.9992472 0.9187099 0.9187008 -0.9994058 0.9348102 0.9348044 -0.9995309 0.9478721 0.9478684 -0.9996296 0.9584138 0.9584115 -0.9997074 0.9668859 0.9668845 -0.9997689 0.9736717 0.9736708 -0.9998174 0.9790922 0.9790916 -0.9998557 0.9834126 0.9834122 -0.999886 0.9868503 0.9868501 -0.9999099 0.9895819 0.9895817 -0.9999288 0.99175 0.9917499 -0.9999437 0.9934694 0.9934694 -0.0000238 0.0506267 0.0309069 -0.0000382 0.0501232 0.0304033 -0.0000611 0.049491 0.0297711 -0.0000978 0.0486989 0.028979 -0.0001565 0.047709 0.0279891 -0.0002504 0.0464764 0.0267565 -0.0004008 0.0449485 0.0252287 -0.0006416 0.043066 0.0233461 -0.0010268 0.0407651 0.0210452 -0.0016435 0.0379834 0.0182636 -0.0026305 0.0346711 0.0149512 -0.0042103 0.0308116 0.0110917 -0.0067388 0.0264587 0.0067388 -0.0154447 0.0264587 0.0067388 -0.0264587 0.0264587 0.0067388 -0.0403929 0.0264587 0.0067388 -0.0580214 0.0264587 0.0067388 -0.0803239 0.0264587 0.0067388 -0.1085393 0.0264587 0.0067388 -0.1442355 0.0264587 0.0067388 -0.1893959 0.0264587 0.0067388 -0.2465296 0.0264587 0.0067388 -0.3188112 0.0264587 0.0067388 -0.4102568 0.0264587 0.0067388 -0.5259474 0.0264587 0.0067388 -0.6723111 0.0264587 0.0067388 -0.8293233 0.0289702 0.0099781 -0.8992555 0.0464178 0.0306306 -0.9336494 0.0762454 0.0638283 -0.953663 0.1160116 0.1064997 -0.9664615 0.1643478 0.1571937 -0.9751462 0.2200403 0.2147432 -0.9812792 0.2816876 0.2778236 -0.9857332 0.3475978 0.3448204 -0.9890339 0.4158254 0.4138582 -0.9915169 0.4843052 0.4829319 -0.9934058 0.5510368 0.5500915 -0.9948551 0.6142705 0.6136284 -0.9959745 0.6726487 0.672218 -0.9968433 0.7252773 0.7249916 -0.9975204 0.7717229 0.7715352 -0.9980497 0.811952 0.8118298 -0.9984643 0.8462379 0.8461589 -0.9987899 0.8750596 0.8750088 -0.9990458 0.8990096 0.8989771 -0.9992472 0.9187214 0.9187008 -0.9994058 0.9348175 0.9348044 -0.9995309 0.9478767 0.9478684 -0.9996296 0.9584168 0.9584115 -0.9997074 0.9668878 0.9668845 -0.9997689 0.9736729 0.9736708 -0.9998174 0.9790929 0.9790916 -0.9998557 0.983413 0.9834122 -0.999886 0.9868506 0.9868501 -0.9999099 0.989582 0.9895817 -0.9999288 0.9917501 0.9917499 -0.9999437 0.9934695 0.9934694 -0.0000238 0.0645609 0.0309069 -0.0000382 0.0640574 0.0304033 -0.0000611 0.0634252 0.0297711 -0.0000978 0.0626331 0.028979 -0.0001565 0.0616432 0.0279891 -0.0002504 0.0604106 0.0267565 -0.0004008 0.0588827 0.0252287 -0.0006416 0.0570002 0.0233461 -0.0010268 0.0546993 0.0210452 -0.0016435 0.0519176 0.0182636 -0.0026305 0.0486053 0.0149512 -0.0042103 0.0447458 0.0110917 -0.0067388 0.0403929 0.0067388 -0.0154447 0.0403929 0.0067388 -0.0264587 0.0403929 0.0067388 -0.0403929 0.0403929 0.0067388 -0.0580214 0.0403929 0.0067388 -0.0803239 0.0403929 0.0067388 -0.1085393 0.0403929 0.0067388 -0.1442355 0.0403929 0.0067388 -0.1893959 0.0403929 0.0067388 -0.2465296 0.0403929 0.0067388 -0.3188112 0.0403929 0.0067388 -0.4102568 0.0403929 0.0067388 -0.5259474 0.0403929 0.0067388 -0.6723111 0.0403929 0.0067388 -0.8293233 0.0423902 0.0099781 -0.8992555 0.0575732 0.0306306 -0.9336494 0.0850195 0.0638283 -0.953663 0.1227327 0.1064997 -0.9664615 0.169403 0.1571937 -0.9751462 0.2237832 0.2147432 -0.9812792 0.284418 0.2778236 -0.9857332 0.3495603 0.3448204 -0.9890339 0.4172154 0.4138582 -0.9915169 0.4852755 0.4829319 -0.9934058 0.5517048 0.5500915 -0.9948551 0.6147242 0.6136284 -0.9959745 0.6729531 0.672218 -0.9968433 0.7254792 0.7249916 -0.9975204 0.7718555 0.7715352 -0.9980497 0.8120384 0.8118298 -0.9984643 0.8462937 0.8461589 -0.9987899 0.8750954 0.8750088 -0.9990458 0.8990325 0.8989771 -0.9992472 0.918736 0.9187008 -0.9994058 0.9348267 0.9348044 -0.9995309 0.9478825 0.9478684 -0.9996296 0.9584204 0.9584115 -0.9997074 0.9668901 0.9668845 -0.9997689 0.9736743 0.9736708 -0.9998174 0.9790938 0.9790916 -0.9998557 0.9834136 0.9834122 -0.999886 0.9868509 0.9868501 -0.9999099 0.9895823 0.9895817 -0.9999288 0.9917503 0.9917499 -0.9999437 0.9934696 0.9934694 -0.0000238 0.0821895 0.0309069 -0.0000382 0.081686 0.0304033 -0.0000611 0.0810538 0.0297711 -0.0000978 0.0802616 0.028979 -0.0001565 0.0792718 0.0279891 -0.0002504 0.0780392 0.0267565 -0.0004008 0.0765113 0.0252287 -0.0006416 0.0746288 0.0233461 -0.0010268 0.0723279 0.0210452 -0.0016435 0.0695462 0.0182636 -0.0026305 0.0662338 0.0149512 -0.0042103 0.0623743 0.0110917 -0.0067388 0.0580214 0.0067388 -0.0154447 0.0580214 0.0067388 -0.0264587 0.0580214 0.0067388 -0.0403929 0.0580214 0.0067388 -0.0580214 0.0580214 0.0067388 -0.0803239 0.0580214 0.0067388 -0.1085393 0.0580214 0.0067388 -0.1442355 0.0580214 0.0067388 -0.1893959 0.0580214 0.0067388 -0.2465296 0.0580214 0.0067388 -0.3188112 0.0580214 0.0067388 -0.4102568 0.0580214 0.0067388 -0.5259474 0.0580214 0.0067388 -0.6723111 0.0580214 0.0067388 -0.8293233 0.0593681 0.0099781 -0.8992555 0.0716861 0.0306306 -0.9336494 0.0961197 0.0638283 -0.953663 0.1312358 0.1064997 -0.9664615 0.1757984 0.1571937 -0.9751462 0.2285185 0.2147432 -0.9812792 0.2878722 0.2778236 -0.9857332 0.3520431 0.3448204 -0.9890339 0.418974 0.4138582 -0.9915169 0.4865032 0.4829319 -0.9934058 0.5525498 0.5500915 -0.9948551 0.6152981 0.6136284 -0.9959745 0.6733381 0.672218 -0.9968433 0.7257347 0.7249916 -0.9975204 0.7720233 0.7715352 -0.9980497 0.8121476 0.8118298 -0.9984643 0.8463643 0.8461589 -0.9987899 0.8751408 0.8750088 -0.9990458 0.8990614 0.8989771 -0.9992472 0.9187544 0.9187008 -0.9994058 0.9348384 0.9348044 -0.9995309 0.9478899 0.9478684 -0.9996296 0.9584251 0.9584115 -0.9997074 0.966893 0.9668845 -0.9997689 0.9736762 0.9736708 -0.9998174 0.979095 0.9790916 -0.9998557 0.9834143 0.9834122 -0.999886 0.9868514 0.9868501 -0.9999099 0.9895826 0.9895817 -0.9999288 0.9917504 0.9917499 -0.9999437 0.9934697 0.9934694 -0.0000238 0.1044919 0.0309069 -0.0000382 0.1039884 0.0304033 -0.0000611 0.1033562 0.0297711 -0.0000978 0.102564 0.028979 -0.0001565 0.1015742 0.0279891 -0.0002504 0.1003416 0.0267565 -0.0004008 0.0988137 0.0252287 -0.0006416 0.0969312 0.0233461 -0.0010268 0.0946303 0.0210452 -0.0016435 0.0918486 0.0182636 -0.0026305 0.0885362 0.0149512 -0.0042103 0.0846767 0.0110917 -0.0067388 0.0803239 0.0067388 -0.0154447 0.0803239 0.0067388 -0.0264587 0.0803239 0.0067388 -0.0403929 0.0803239 0.0067388 -0.0580214 0.0803239 0.0067388 -0.0803239 0.0803239 0.0067388 -0.1085393 0.0803239 0.0067388 -0.1442355 0.0803239 0.0067388 -0.1893959 0.0803239 0.0067388 -0.2465296 0.0803239 0.0067388 -0.3188112 0.0803239 0.0067388 -0.4102568 0.0803239 0.0067388 -0.5259474 0.0803239 0.0067388 -0.6723111 0.0803239 0.0067388 -0.8293233 0.0808475 0.0099781 -0.8992555 0.0895408 0.0306306 -0.9336494 0.1101631 0.0638283 -0.953663 0.1419934 0.1064997 -0.9664615 0.1838895 0.1571937 -0.9751462 0.2345093 0.2147432 -0.9812792 0.2922423 0.2778236 -0.9857332 0.3551842 0.3448204 -0.9890339 0.4211988 0.4138582 -0.9915169 0.4880563 0.4829319 -0.9934058 0.5536189 0.5500915 -0.9948551 0.6160243 0.6136284 -0.9959745 0.6738253 0.672218 -0.9968433 0.7260579 0.7249916 -0.9975204 0.7722356 0.7715352 -0.9980497 0.8122858 0.8118298 -0.9984643 0.8464537 0.8461589 -0.9987899 0.8751981 0.8750088 -0.9990458 0.8990981 0.8989771 -0.9992472 0.9187777 0.9187008 -0.9994058 0.9348532 0.9348044 -0.9995309 0.9478993 0.9478684 -0.9996296 0.958431 0.9584115 -0.9997074 0.9668967 0.9668845 -0.9997689 0.9736785 0.9736708 -0.9998174 0.9790964 0.9790916 -0.9998557 0.9834152 0.9834122 -0.999886 0.986852 0.9868501 -0.9999099 0.9895829 0.9895817 -0.9999288 0.9917507 0.9917499 -0.9999437 0.9934698 0.9934694 -0.0000238 0.1327073 0.0309069 -0.0000382 0.1322038 0.0304033 -0.0000611 0.1315716 0.0297711 -0.0000978 0.1307795 0.028979 -0.0001565 0.1297896 0.0279891 -0.0002504 0.128557 0.0267565 -0.0004008 0.1270291 0.0252287 -0.0006416 0.1251466 0.0233461 -0.0010268 0.1228457 0.0210452 -0.0016435 0.120064 0.0182636 -0.0026305 0.1167517 0.0149512 -0.0042103 0.1128922 0.0110917 -0.0067388 0.1085393 0.0067388 -0.0154447 0.1085393 0.0067388 -0.0264587 0.1085393 0.0067388 -0.0403929 0.1085393 0.0067388 -0.0580214 0.1085393 0.0067388 -0.0803239 0.1085393 0.0067388 -0.1085393 0.1085393 0.0067388 -0.1442355 0.1085393 0.0067388 -0.1893959 0.1085393 0.0067388 -0.2465296 0.1085393 0.0067388 -0.3188112 0.1085393 0.0067388 -0.4102568 0.1085393 0.0067388 -0.5259474 0.1085393 0.0067388 -0.6723111 0.1085393 0.0067388 -0.8293233 0.1080217 0.0099781 -0.8992555 0.1121293 0.0306306 -0.9336494 0.1279297 0.0638283 -0.953663 0.1556031 0.1064997 -0.9664615 0.1941257 0.1571937 -0.9751462 0.2420885 0.2147432 -0.9812792 0.297771 0.2778236 -0.9857332 0.3591581 0.3448204 -0.9890339 0.4240134 0.4138582 -0.9915169 0.4900212 0.4829319 -0.9934058 0.5549714 0.5500915 -0.9948551 0.6169429 0.6136284 -0.9959745 0.6744416 0.672218 -0.9968433 0.7264667 0.7249916 -0.9975204 0.7725042 0.7715352 -0.9980497 0.8124607 0.8118298 -0.9984643 0.8465667 0.8461589 -0.9987899 0.8752707 0.8750088 -0.9990458 0.8991445 0.8989771 -0.9992472 0.9188072 0.9187008 -0.9994058 0.9348719 0.9348044 -0.9995309 0.9479111 0.9478684 -0.9996296 0.9584384 0.9584115 -0.9997074 0.9669014 0.9668845 -0.9997689 0.9736815 0.9736708 -0.9998174 0.9790983 0.9790916 -0.9998557 0.9834164 0.9834122 -0.999886 0.9868527 0.9868501 -0.9999099 0.9895834 0.9895817 -0.9999288 0.9917509 0.9917499 -0.9999437 0.99347 0.9934694 -0.0000238 0.1684036 0.0309069 -0.0000382 0.1679 0.0304033 -0.0000611 0.1672678 0.0297711 -0.0000978 0.1664757 0.028979 -0.0001565 0.1654858 0.0279891 -0.0002504 0.1642532 0.0267565 -0.0004008 0.1627254 0.0252287 -0.0006416 0.1608428 0.0233461 -0.0010268 0.1585419 0.0210452 -0.0016435 0.1557603 0.0182636 -0.0026305 0.1524479 0.0149512 -0.0042103 0.1485884 0.0110917 -0.0067388 0.1442355 0.0067388 -0.0154447 0.1442355 0.0067388 -0.0264587 0.1442355 0.0067388 -0.0403929 0.1442355 0.0067388 -0.0580214 0.1442355 0.0067388 -0.0803239 0.1442355 0.0067388 -0.1085393 0.1442355 0.0067388 -0.1442355 0.1442355 0.0067388 -0.1893959 0.1442355 0.0067388 -0.2465296 0.1442355 0.0067388 -0.3188112 0.1442355 0.0067388 -0.4102568 0.1442355 0.0067388 -0.5259474 0.1442355 0.0067388 -0.6723111 0.1442355 0.0067388 -0.8293233 0.1424005 0.0099781 -0.8992555 0.1407067 0.0306306 -0.9336494 0.1504067 0.0638283 -0.953663 0.1728211 0.1064997 -0.9664615 0.2070759 0.1571937 -0.9751462 0.251677 0.2147432 -0.9812792 0.3047655 0.2778236 -0.9857332 0.3641857 0.3448204 -0.9890339 0.4275744 0.4138582 -0.9915169 0.492507 0.4829319 -0.9934058 0.5566825 0.5500915 -0.9948551 0.6181052 0.6136284 -0.9959745 0.6752213 0.672218 -0.9968433 0.726984 0.7249916 -0.9975204 0.7728439 0.7715352 -0.9980497 0.8126819 0.8118298 -0.9984643 0.8467097 0.8461589 -0.9987899 0.8753626 0.8750088 -0.9990458 0.8992032 0.8989771 -0.9992472 0.9188446 0.9187008 -0.9994058 0.9348956 0.9348044 -0.9995309 0.9479261 0.9478684 -0.9996296 0.9584479 0.9584115 -0.9997074 0.9669074 0.9668845 -0.9997689 0.9736852 0.9736708 -0.9998174 0.9791006 0.9790916 -0.9998557 0.9834179 0.9834122 -0.999886 0.9868536 0.9868501 -0.9999099 0.9895839 0.9895817 -0.9999288 0.9917513 0.9917499 -0.9999437 0.9934702 0.9934694 -0.0000238 0.2135639 0.0309069 -0.0000382 0.2130604 0.0304033 -0.0000611 0.2124282 0.0297711 -0.0000978 0.2116361 0.028979 -0.0001565 0.2106462 0.0279891 -0.0002504 0.2094136 0.0267565 -0.0004008 0.2078857 0.0252287 -0.0006416 0.2060032 0.0233461 -0.0010268 0.2037023 0.0210452 -0.0016435 0.2009206 0.0182636 -0.0026305 0.1976083 0.0149512 -0.0042103 0.1937488 0.0110917 -0.0067388 0.1893959 0.0067388 -0.0154447 0.1893959 0.0067388 -0.0264587 0.1893959 0.0067388 -0.0403929 0.1893959 0.0067388 -0.0580214 0.1893959 0.0067388 -0.0803239 0.1893959 0.0067388 -0.1085393 0.1893959 0.0067388 -0.1442355 0.1893959 0.0067388 -0.1893959 0.1893959 0.0067388 -0.2465296 0.1893959 0.0067388 -0.3188112 0.1893959 0.0067388 -0.4102568 0.1893959 0.0067388 -0.5259474 0.1893959 0.0067388 -0.6723111 0.1893959 0.0067388 -0.8293233 0.1858943 0.0099781 -0.8992555 0.1768609 0.0306306 -0.9336494 0.1788432 0.0638283 -0.953663 0.1946042 0.1064997 -0.9664615 0.2234595 0.1571937 -0.9751462 0.2638078 0.2147432 -0.9812792 0.3136144 0.2778236 -0.9857332 0.3705461 0.3448204 -0.9890339 0.4320794 0.4138582 -0.9915169 0.4956519 0.4829319 -0.9934058 0.5588473 0.5500915 -0.9948551 0.6195755 0.6136284 -0.9959745 0.6762077 0.672218 -0.9968433 0.7276384 0.7249916 -0.9975204 0.7732737 0.7715352 -0.9980497 0.8129618 0.8118298 -0.9984643 0.8468906 0.8461589 -0.9987899 0.8754788 0.8750088 -0.9990458 0.8992774 0.8989771 -0.9992472 0.9188918 0.9187008 -0.9994058 0.9349255 0.9348044 -0.9995309 0.947945 0.9478684 -0.9996296 0.9584598 0.9584115 -0.9997074 0.9669149 0.9668845 -0.9997689 0.9736899 0.9736708 -0.9998174 0.9791036 0.9790916 -0.9998557 0.9834197 0.9834122 -0.999886 0.9868548 0.9868501 -0.9999099 0.9895847 0.9895817 -0.9999288 0.9917518 0.9917499 -0.9999437 0.9934705 0.9934694 -0.0000238 0.2706977 0.0309069 -0.0000382 0.2701941 0.0304033 -0.0000611 0.2695619 0.0297711 -0.0000978 0.2687698 0.028979 -0.0001565 0.2677799 0.0279891 -0.0002504 0.2665473 0.0267565 -0.0004008 0.2650195 0.0252287 -0.0006416 0.2631369 0.0233461 -0.0010268 0.260836 0.0210452 -0.0016435 0.2580543 0.0182636 -0.0026305 0.254742 0.0149512 -0.0042103 0.2508825 0.0110917 -0.0067388 0.2465296 0.0067388 -0.0154447 0.2465296 0.0067388 -0.0264587 0.2465296 0.0067388 -0.0403929 0.2465296 0.0067388 -0.0580214 0.2465296 0.0067388 -0.0803239 0.2465296 0.0067388 -0.1085393 0.2465296 0.0067388 -0.1442355 0.2465296 0.0067388 -0.1893959 0.2465296 0.0067388 -0.2465296 0.2465296 0.0067388 -0.3188112 0.2465296 0.0067388 -0.4102568 0.2465296 0.0067388 -0.5259474 0.2465296 0.0067388 -0.6723111 0.2465296 0.0067388 -0.8293233 0.2409195 0.0099781 -0.8992555 0.2226006 0.0306306 -0.9336494 0.2148189 0.0638283 -0.953663 0.2221626 0.1064997 -0.9664615 0.244187 0.1571937 -0.9751462 0.2791549 0.2147432 -0.9812792 0.3248095 0.2778236 -0.9857332 0.3785929 0.3448204 -0.9890339 0.4377789 0.4138582 -0.9915169 0.4996306 0.4829319 -0.9934058 0.561586 0.5500915 -0.9948551 0.6214357 0.6136284 -0.9959745 0.6774557 0.672218 -0.9968433 0.7284663 0.7249916 -0.9975204 0.7738175 0.7715352 -0.9980497 0.8133159 0.8118298 -0.9984643 0.8471195 0.8461589 -0.9987899 0.8756258 0.8750088 -0.9990458 0.8993713 0.8989771 -0.9992472 0.9189515 0.9187008 -0.9994058 0.9349634 0.9348044 -0.9995309 0.9479689 0.9478684 -0.9996296 0.9584749 0.9584115 -0.9997074 0.9669244 0.9668845 -0.9997689 0.9736959 0.9736708 -0.9998174 0.9791073 0.9790916 -0.9998557 0.9834221 0.9834122 -0.999886 0.9868562 0.9868501 -0.9999099 0.9895856 0.9895817 -0.9999288 0.9917523 0.9917499 -0.9999437 0.9934709 0.9934694 -0.0000238 0.3429792 0.0309069 -0.0000382 0.3424757 0.0304033 -0.0000611 0.3418435 0.0297711 -0.0000978 0.3410514 0.028979 -0.0001565 0.3400615 0.0279891 -0.0002504 0.3388289 0.0267565 -0.0004008 0.337301 0.0252287 -0.0006416 0.3354185 0.0233461 -0.0010268 0.3331176 0.0210452 -0.0016435 0.3303359 0.0182636 -0.0026305 0.3270236 0.0149512 -0.0042103 0.3231641 0.0110917 -0.0067388 0.3188112 0.0067388 -0.0154447 0.3188112 0.0067388 -0.0264587 0.3188112 0.0067388 -0.0403929 0.3188112 0.0067388 -0.0580214 0.3188112 0.0067388 -0.0803239 0.3188112 0.0067388 -0.1085393 0.3188112 0.0067388 -0.1442355 0.3188112 0.0067388 -0.1893959 0.3188112 0.0067388 -0.2465296 0.3188112 0.0067388 -0.3188112 0.3188112 0.0067388 -0.4102568 0.3188112 0.0067388 -0.5259474 0.3188112 0.0067388 -0.6723111 0.3188112 0.0067388 -0.8293233 0.3105336 0.0099781 -0.8992555 0.2804673 0.0306306 -0.9336494 0.260333 0.0638283 -0.953663 0.2570275 0.1064997 -0.9664615 0.2704099 0.1571937 -0.9751462 0.2985709 0.2147432 -0.9812792 0.3389728 0.2778236 -0.9857332 0.3887731 0.3448204 -0.9890339 0.4449894 0.4138582 -0.9915169 0.5046642 0.4829319 -0.9934058 0.5650508 0.5500915 -0.9948551 0.6237891 0.6136284 -0.9959745 0.6790346 0.672218 -0.9968433 0.7295137 0.7249916 -0.9975204 0.7745055 0.7715352 -0.9980497 0.8137639 0.8118298 -0.9984643 0.847409 0.8461589 -0.9987899 0.8758117 0.8750088 -0.9990458 0.8994901 0.8989771 -0.9992472 0.9190271 0.9187008 -0.9994058 0.9350113 0.9348044 -0.9995309 0.9479992 0.9478684 -0.9996296 0.958494 0.9584115 -0.9997074 0.9669364 0.9668845 -0.9997689 0.9737034 0.9736708 -0.9998174 0.9791121 0.9790916 -0.9998557 0.9834251 0.9834122 -0.999886 0.9868581 0.9868501 -0.9999099 0.9895868 0.9895817 -0.9999288 0.9917531 0.9917499 -0.9999437 0.9934713 0.9934694 -0.0000238 0.4344249 0.0309069 -0.0000382 0.4339214 0.0304033 -0.0000611 0.4332891 0.0297711 -0.0000978 0.432497 0.028979 -0.0001565 0.4315072 0.0279891 -0.0002504 0.4302746 0.0267565 -0.0004008 0.4287467 0.0252287 -0.0006416 0.4268641 0.0233461 -0.0010268 0.4245633 0.0210452 -0.0016435 0.4217816 0.0182636 -0.0026305 0.4184692 0.0149512 -0.0042103 0.4146097 0.0110917 -0.0067388 0.4102568 0.0067388 -0.0154447 0.4102568 0.0067388 -0.0264587 0.4102568 0.0067388 -0.0403929 0.4102568 0.0067388 -0.0580214 0.4102568 0.0067388 -0.0803239 0.4102568 0.0067388 -0.1085393 0.4102568 0.0067388 -0.1442355 0.4102568 0.0067388 -0.1893959 0.4102568 0.0067388 -0.2465296 0.4102568 0.0067388 -0.3188112 0.4102568 0.0067388 -0.4102568 0.4102568 0.0067388 -0.5259474 0.4102568 0.0067388 -0.6723111 0.4102568 0.0067388 -0.8293233 0.3986045 0.0099781 -0.8992555 0.3536761 0.0306306 -0.9336494 0.3179142 0.0638283 -0.953663 0.3011363 0.1064997 -0.9664615 0.3035853 0.1571937 -0.9751462 0.3231346 0.2147432 -0.9812792 0.3568911 0.2778236 -0.9857332 0.4016525 0.3448204 -0.9890339 0.4541117 0.4138582 -0.9915169 0.5110324 0.4829319 -0.9934058 0.5694343 0.5500915 -0.9948551 0.6267665 0.6136284 -0.9959745 0.681032 0.672218 -0.9968433 0.7308388 0.7249916 -0.9975204 0.7753759 0.7715352 -0.9980497 0.8143306 0.8118298 -0.9984643 0.8477753 0.8461589 -0.9987899 0.876047 0.8750088 -0.9990458 0.8996405 0.8989771 -0.9992472 0.9191227 0.9187008 -0.9994058 0.9350719 0.9348044 -0.9995309 0.9480375 0.9478684 -0.9996296 0.9585182 0.9584115 -0.9997074 0.9669516 0.9668845 -0.9997689 0.973713 0.9736708 -0.9998174 0.9791181 0.9790916 -0.9998557 0.9834288 0.9834122 -0.999886 0.9868605 0.9868501 -0.9999099 0.9895882 0.9895817 -0.9999288 0.991754 0.9917499 -0.9999437 0.9934719 0.9934694 -0.0000238 0.5501155 0.0309069 -0.0000382 0.549612 0.0304033 -0.0000611 0.5489798 0.0297711 -0.0000978 0.5481876 0.028979 -0.0001565 0.5471978 0.0279891 -0.0002504 0.5459652 0.0267565 -0.0004008 0.5444373 0.0252287 -0.0006416 0.5425548 0.0233461 -0.0010268 0.5402539 0.0210452 -0.0016435 0.5374722 0.0182636 -0.0026305 0.5341598 0.0149512 -0.0042103 0.5303003 0.0110917 -0.0067388 0.5259474 0.0067388 -0.0154447 0.5259474 0.0067388 -0.0264587 0.5259474 0.0067388 -0.0403929 0.5259474 0.0067388 -0.0580214 0.5259474 0.0067388 -0.0803239 0.5259474 0.0067388 -0.1085393 0.5259474 0.0067388 -0.1442355 0.5259474 0.0067388 -0.1893959 0.5259474 0.0067388 -0.2465296 0.5259474 0.0067388 -0.3188112 0.5259474 0.0067388 -0.4102568 0.5259474 0.0067388 -0.5259474 0.5259474 0.0067388 -0.6723111 0.5259474 0.0067388 -0.8293233 0.5100256 0.0099781 -0.8992555 0.4462949 0.0306306 -0.9336494 0.3907618 0.0638283 -0.953663 0.3569395 0.1064997 -0.9664615 0.3455565 0.1571937 -0.9751462 0.354211 0.2147432 -0.9812792 0.3795602 0.2778236 -0.9857332 0.4179465 0.3448204 -0.9890339 0.4656526 0.4138582 -0.9915169 0.5190889 0.4829319 -0.9934058 0.5749799 0.5500915 -0.9948551 0.6305332 0.6136284 -0.9959745 0.683559 0.672218 -0.9968433 0.7325153 0.7249916 -0.9975204 0.776477 0.7715352 -0.9980497 0.8150477 0.8118298 -0.9984643 0.8482387 0.8461589 -0.9987899 0.8763446 0.8750088 -0.9990458 0.8998306 0.8989771 -0.9992472 0.9192437 0.9187008 -0.9994058 0.9351486 0.9348044 -0.9995309 0.948086 0.9478684 -0.9996296 0.9585487 0.9584115 -0.9997074 0.9669708 0.9668845 -0.9997689 0.9737251 0.9736708 -0.9998174 0.9791257 0.9790916 -0.9998557 0.9834336 0.9834122 -0.999886 0.9868634 0.9868501 -0.9999099 0.9895901 0.9895817 -0.9999288 0.9917552 0.9917499 -0.9999437 0.9934727 0.9934694 -0.0000238 0.6964791 0.0309069 -0.0000382 0.6959756 0.0304033 -0.0000611 0.6953434 0.0297711 -0.0000978 0.6945513 0.028979 -0.0001565 0.6935614 0.0279891 -0.0002504 0.6923288 0.0267565 -0.0004008 0.6908009 0.0252287 -0.0006416 0.6889184 0.0233461 -0.0010268 0.6866175 0.0210452 -0.0016435 0.6838358 0.0182636 -0.0026305 0.6805235 0.0149512 -0.0042103 0.676664 0.0110917 -0.0067388 0.6723111 0.0067388 -0.0154447 0.6723111 0.0067388 -0.0264587 0.6723111 0.0067388 -0.0403929 0.6723111 0.0067388 -0.0580214 0.6723111 0.0067388 -0.0803239 0.6723111 0.0067388 -0.1085393 0.6723111 0.0067388 -0.1442355 0.6723111 0.0067388 -0.1893959 0.6723111 0.0067388 -0.2465296 0.6723111 0.0067388 -0.3188112 0.6723111 0.0067388 -0.4102568 0.6723111 0.0067388 -0.5259474 0.6723111 0.0067388 -0.6723111 0.6723111 0.0067388 -0.8293233 0.6509878 0.0099781 -0.8992555 0.5634696 0.0306306 -0.9336494 0.4829236 0.0638283 -0.953663 0.4275379 0.1064997 -0.9664615 0.3986555 0.1571937 -0.9751462 0.3935266 0.2147432 -0.9812792 0.4082395 0.2778236 -0.9857332 0.4385606 0.3448204 -0.9890339 0.4802533 0.4138582 -0.9915169 0.5292815 0.4829319 -0.9934058 0.5819959 0.5500915 -0.9948551 0.6352987 0.6136284 -0.9959745 0.6867561 0.672218 -0.9968433 0.7346362 0.7249916 -0.9975204 0.7778701 0.7715352 -0.9980497 0.8159548 0.8118298 -0.9984643 0.848825 0.8461589 -0.9987899 0.8767212 0.8750088 -0.9990458 0.9000712 0.8989771 -0.9992472 0.9193968 0.9187008 -0.9994058 0.9352456 0.9348044 -0.9995309 0.9481473 0.9478684 -0.9996296 0.9585874 0.9584115 -0.9997074 0.9669952 0.9668845 -0.9997689 0.9737404 0.9736708 -0.9998174 0.9791353 0.9790916 -0.9998557 0.9834396 0.9834122 -0.999886 0.9868672 0.9868501 -0.9999099 0.9895925 0.9895817 -0.9999288 0.9917566 0.9917499 -0.9999437 0.9934736 0.9934694 -0.0051514 0.8407292 0.0344214 -0.0051286 0.8405071 0.0339178 -0.0051047 0.8402274 0.0332852 -0.0050826 0.8398756 0.032492 -0.0050676 0.8394338 0.0314998 -0.0050694 0.8388802 0.0302631 -0.0051048 0.8381886 0.0287279 -0.0052028 0.8373283 0.0268333 -0.0054121 0.8362644 0.024513 -0.0058134 0.8349593 0.0217012 -0.0065402 0.8333779 0.0183437 -0.0078103 0.8314967 0.0144193 -0.0099781 0.8293233 0.0099781 -0.0183626 0.8293233 0.0099781 -0.0289702 0.8293233 0.0099781 -0.0423902 0.8293233 0.0099781 -0.0593681 0.8293233 0.0099781 -0.0808475 0.8293233 0.0099781 -0.1080217 0.8293233 0.0099781 -0.1424005 0.8293233 0.0099781 -0.1858943 0.8293233 0.0099781 -0.2409195 0.8293233 0.0099781 -0.3105336 0.8293233 0.0099781 -0.3986045 0.8293233 0.0099781 -0.5100256 0.8293233 0.0099781 -0.6509878 0.8293233 0.0099781 -0.8293233 0.8293233 0.0099781 -0.8992555 0.7117109 0.0306306 -0.9336494 0.5995203 0.0638283 -0.953663 0.5168541 0.1064997 -0.9664615 0.4658326 0.1571937 -0.9751462 0.443266 0.2147432 -0.9812792 0.4445225 0.2778236 -0.9857332 0.4646401 0.3448204 -0.9890339 0.4987251 0.4138582 -0.9915169 0.5421764 0.4829319 -0.9934058 0.590872 0.5500915 -0.9948551 0.6413275 0.6136284 -0.9959745 0.6908007 0.672218 -0.9968433 0.7373194 0.7249916 -0.9975204 0.7796325 0.7715352 -0.9980497 0.8171024 0.8118298 -0.9984643 0.8495668 0.8461589 -0.9987899 0.8771976 0.8750088 -0.9990458 0.9003756 0.8989771 -0.9992472 0.9195904 0.9187008 -0.9994058 0.9353684 0.9348044 -0.9995309 0.9482249 0.9478684 -0.9996296 0.9586363 0.9584115 -0.9997074 0.967026 0.9668845 -0.9997689 0.9737597 0.9736708 -0.9998174 0.9791474 0.9790916 -0.9998557 0.9834472 0.9834122 -0.999886 0.986872 0.9868501 -0.9999099 0.9895955 0.9895817 -0.9999288 0.9917585 0.9917499 -0.9999437 0.9934748 0.9934694 -0.0279321 0.9033413 0.0521597 -0.0278872 0.9032596 0.0517186 -0.0278347 0.9031567 0.0511643 -0.0277752 0.9030276 0.050469 -0.0277111 0.9028657 0.0495992 -0.0276479 0.9026634 0.0485143 -0.0275966 0.9024114 0.0471669 -0.0275778 0.9020992 0.0455028 -0.0276281 0.9017148 0.0434629 -0.0278105 0.9012461 0.0409879 -0.0282324 0.900682 0.0380282 -0.0290732 0.9000167 0.0345622 -0.0306306 0.8992555 0.0306306 -0.0376003 0.8992555 0.0306306 -0.0464178 0.8992555 0.0306306 -0.0575732 0.8992555 0.0306306 -0.0716861 0.8992555 0.0306306 -0.0895408 0.8992555 0.0306306 -0.1121293 0.8992555 0.0306306 -0.1407067 0.8992555 0.0306306 -0.1768609 0.8992555 0.0306306 -0.2226006 0.8992555 0.0306306 -0.2804673 0.8992555 0.0306306 -0.3536761 0.8992555 0.0306306 -0.4462949 0.8992555 0.0306306 -0.5634696 0.8992555 0.0306306 -0.7117109 0.8992555 0.0306306 -0.8992555 0.8992555 0.0306306 -0.9336494 0.7470302 0.0638283 -0.953663 0.6298506 0.1064997 -0.9664615 0.5508205 0.1571937 -0.9751462 0.5061928 0.2147432 -0.9812792 0.4904253 0.2778236 -0.9857332 0.497634 0.3448204 -0.9890339 0.5220943 0.4138582 -0.9915169 0.5584902 0.4829319 -0.9934058 0.6021014 0.5500915 -0.9948551 0.6489548 0.6136284 -0.9959745 0.6959177 0.672218 -0.9968433 0.7407141 0.7249916 -0.9975204 0.7818622 0.7715352 -0.9980497 0.8185543 0.8118298 -0.9984643 0.8505052 0.8461589 -0.9987899 0.8778003 0.8750088 -0.9990458 0.9007607 0.8989771 -0.9992472 0.9198354 0.9187008 -0.9994058 0.9355237 0.9348044 -0.9995309 0.9483231 0.9478684 -0.9996296 0.9586982 0.9584115 -0.9997074 0.9670649 0.9668845 -0.9997689 0.9737842 0.9736708 -0.9998174 0.9791628 0.9790916 -0.9998557 0.9834569 0.9834122 -0.999886 0.986878 0.9868501 -0.9999099 0.9895992 0.9895817 -0.9999288 0.9917609 0.9917499 -0.9999437 0.9934762 0.9934694 -0.0624569 0.9354466 0.0815473 -0.0624063 0.9354101 0.0811837 -0.0623458 0.9353643 0.0807269 -0.0622749 0.9353068 0.080154 -0.0621943 0.9352348 0.0794373 -0.0621069 0.9351449 0.0785435 -0.0620199 0.9350332 0.0774337 -0.0619473 0.9348949 0.0760633 -0.061916 0.9347252 0.0743837 -0.0619734 0.9345187 0.0723466 -0.062202 0.9342712 0.0699113 -0.062742 0.9339805 0.0670606 -0.0638283 0.9336494 0.0638283 -0.0693101 0.9336494 0.0638283 -0.0762454 0.9336494 0.0638283 -0.0850195 0.9336494 0.0638283 -0.0961197 0.9336494 0.0638283 -0.1101631 0.9336494 0.0638283 -0.1279297 0.9336494 0.0638283 -0.1504067 0.9336494 0.0638283 -0.1788432 0.9336494 0.0638283 -0.2148189 0.9336494 0.0638283 -0.260333 0.9336494 0.0638283 -0.3179142 0.9336494 0.0638283 -0.3907618 0.9336494 0.0638283 -0.4829236 0.9336494 0.0638283 -0.5995203 0.9336494 0.0638283 -0.7470302 0.9336494 0.0638283 -0.9336494 0.9336494 0.0638283 -0.953663 0.7728059 0.1064997 -0.9664615 0.6583412 0.1571937 -0.9751462 0.5858033 0.2147432 -0.9812792 0.5484982 0.2778236 -0.9857332 0.5393756 0.3448204 -0.9890339 0.5516594 0.4138582 -0.9915169 0.5791292 0.4829319 -0.9934058 0.6163081 0.5500915 -0.9948551 0.6586044 0.6136284 -0.9959745 0.7023914 0.672218 -0.9968433 0.7450087 0.7249916 -0.9975204 0.7846831 0.7715352 -0.9980497 0.8203911 0.8118298 -0.9984643 0.8516924 0.8461589 -0.9987899 0.8785628 0.8750088 -0.9990458 0.9012479 0.8989771 -0.9992472 0.9201453 0.9187008 -0.9994058 0.9357201 0.9348044 -0.9995309 0.9484472 0.9478684 -0.9996296 0.9587765 0.9584115 -0.9997074 0.9671142 0.9668845 -0.9997689 0.9738152 0.9736708 -0.9998174 0.9791822 0.9790916 -0.9998557 0.9834691 0.9834122 -0.999886 0.9868857 0.9868501 -0.9999099 0.989604 0.9895817 -0.9999288 0.9917639 0.9917499 -0.9999437 0.9934781 0.9934694 -0.1059991 0.9545467 0.120662 -0.1059489 0.9545286 0.1203707 -0.1058883 0.9545059 0.1200048 -0.1058162 0.9544774 0.1195459 -0.1057322 0.9544418 0.1189719 -0.1056375 0.9543974 0.1182564 -0.1055364 0.9543421 0.117368 -0.1054384 0.9542739 0.1162715 -0.1053624 0.9541902 0.1149282 -0.1053433 0.9540886 0.1132997 -0.1054431 0.9539671 0.111354 -0.1057683 0.9538247 0.1090781 -0.1064997 0.953663 0.1064997 -0.1106989 0.953663 0.1064997 -0.1160116 0.953663 0.1064997 -0.1227327 0.953663 0.1064997 -0.1312358 0.953663 0.1064997 -0.1419934 0.953663 0.1064997 -0.1556031 0.953663 0.1064997 -0.1728211 0.953663 0.1064997 -0.1946042 0.953663 0.1064997 -0.2221626 0.953663 0.1064997 -0.2570275 0.953663 0.1064997 -0.3011363 0.953663 0.1064997 -0.3569395 0.953663 0.1064997 -0.4275379 0.953663 0.1064997 -0.5168541 0.953663 0.1064997 -0.6298506 0.953663 0.1064997 -0.7728059 0.953663 0.1064997 -0.953663 0.953663 0.1064997 -0.9664615 0.7943688 0.1571937 -0.9751462 0.6865211 0.2147432 -0.9812792 0.6219681 0.2778236 -0.9857332 0.5921842 0.3448204 -0.9890339 0.5890631 0.4138582 -0.9915169 0.6052403 0.4829319 -0.9934058 0.6342815 0.5500915 -0.9948551 0.6708123 0.6136284 -0.9959745 0.7105815 0.672218 -0.9968433 0.750442 0.7249916 -0.9975204 0.7882518 0.7715352 -0.9980497 0.8227149 0.8118298 -0.9984643 0.8531943 0.8461589 -0.9987899 0.8795275 0.8750088 -0.9990458 0.9018642 0.8989771 -0.9992472 0.9205374 0.9187008 -0.9994058 0.9359687 0.9348044 -0.9995309 0.9486043 0.9478684 -0.9996296 0.9588756 0.9584115 -0.9997074 0.9671766 0.9668845 -0.9997689 0.9738544 0.9736708 -0.9998174 0.9792068 0.9790916 -0.9998557 0.9834845 0.9834122 -0.999886 0.9868953 0.9868501 -0.9999099 0.9896101 0.9895817 -0.9999288 0.9917677 0.9917499 -0.9999437 0.9934805 0.9934694 -0.1572498 0.9669269 0.1683064 -0.1572031 0.9669173 0.1680773 -0.1571463 0.9669053 0.1677895 -0.1570779 0.9668902 0.1674288 -0.1569971 0.9668714 0.1669776 -0.156904 0.9668479 0.1664151 -0.1568008 0.9668187 0.1657171 -0.1566936 0.9667827 0.1648558 -0.1565954 0.9667385 0.1638011 -0.1565315 0.966685 0.162523 -0.1565473 0.9666211 0.160997 -0.1567226 0.9665463 0.1592131 -0.1571937 0.9664615 0.1571937 -0.1603521 0.9664615 0.1571937 -0.1643478 0.9664615 0.1571937 -0.169403 0.9664615 0.1571937 -0.1757984 0.9664615 0.1571937 -0.1838895 0.9664615 0.1571937 -0.1941257 0.9664615 0.1571937 -0.2070759 0.9664615 0.1571937 -0.2234595 0.9664615 0.1571937 -0.244187 0.9664615 0.1571937 -0.2704099 0.9664615 0.1571937 -0.3035853 0.9664615 0.1571937 -0.3455565 0.9664615 0.1571937 -0.3986555 0.9664615 0.1571937 -0.4658326 0.9664615 0.1571937 -0.5508205 0.9664615 0.1571937 -0.6583412 0.9664615 0.1571937 -0.7943688 0.9664615 0.1571937 -0.9664615 0.9664615 0.1571937 -0.9751462 0.8139421 0.2147432 -0.9812792 0.714917 0.2778236 -0.9857332 0.658994 0.3448204 -0.9890339 0.6363837 0.4138582 -0.9915169 0.6382742 0.4829319 -0.9934058 0.6570201 0.5500915 -0.9948551 0.6862569 0.6136284 -0.9959745 0.720943 0.672218 -0.9968433 0.7573158 0.7249916 -0.9975204 0.7927668 0.7715352 -0.9980497 0.8256548 0.8118298 -0.9984643 0.8550945 0.8461589 -0.9987899 0.880748 0.8750088 -0.9990458 0.902644 0.8989771 -0.9992472 0.9210335 0.9187008 -0.9994058 0.9362831 0.9348044 -0.9995309 0.9488031 0.9478684 -0.9996296 0.9590009 0.9584115 -0.9997074 0.9672555 0.9668845 -0.9997689 0.973904 0.9736708 -0.9998174 0.9792379 0.9790916 -0.9998557 0.983504 0.9834122 -0.999886 0.9869076 0.9868501 -0.9999099 0.9896177 0.9895817 -0.9999288 0.9917725 0.9917499 -0.9999437 0.9934835 0.9934694 -0.2151269 0.9754027 0.2233317 -0.2150852 0.9753975 0.2231543 -0.2150342 0.9753908 0.2229315 -0.2149725 0.9753825 0.2226522 -0.2148987 0.9753721 0.2223029 -0.2148124 0.9753591 0.2218676 -0.2147144 0.975343 0.2213275 -0.2146085 0.9753231 0.2206612 -0.2145034 0.9752987 0.2198456 -0.2144168 0.9752692 0.2188577 -0.2143816 0.975234 0.2176788 -0.2144566 0.9751928 0.2163014 -0.2147432 0.9751462 0.2147432 -0.2170817 0.9751462 0.2147432 -0.2200403 0.9751462 0.2147432 -0.2237832 0.9751462 0.2147432 -0.2285185 0.9751462 0.2147432 -0.2345093 0.9751462 0.2147432 -0.2420885 0.9751462 0.2147432 -0.251677 0.9751462 0.2147432 -0.2638078 0.9751462 0.2147432 -0.2791549 0.9751462 0.2147432 -0.2985709 0.9751462 0.2147432 -0.3231346 0.9751462 0.2147432 -0.354211 0.9751462 0.2147432 -0.3935266 0.9751462 0.2147432 -0.443266 0.9751462 0.2147432 -0.5061928 0.9751462 0.2147432 -0.5858033 0.9751462 0.2147432 -0.6865211 0.9751462 0.2147432 -0.8139421 0.9751462 0.2147432 -0.9751462 0.9751462 0.2147432 -0.9812792 0.8325095 0.2778236 -0.9857332 0.743517 0.3448204 -0.9890339 0.6962504 0.4138582 -0.9915169 0.6800663 0.4829319 -0.9934058 0.6857874 0.5500915 -0.9948551 0.7057964 0.6136284 -0.9959745 0.7340516 0.672218 -0.9968433 0.7660121 0.7249916 -0.9975204 0.7984788 0.7715352 -0.9980497 0.8293742 0.8118298 -0.9984643 0.8574984 0.8461589 -0.9987899 0.882292 0.8750088 -0.9990458 0.9036305 0.8989771 -0.9992472 0.921661 0.9187008 -0.9994058 0.9366809 0.9348044 -0.9995309 0.9490545 0.9478684 -0.9996296 0.9591595 0.9584115 -0.9997074 0.9673553 0.9668845 -0.9997689 0.9739667 0.9736708 -0.9998174 0.9792773 0.9790916 -0.9998557 0.9835287 0.9834122 -0.999886 0.986923 0.9868501 -0.9999099 0.9896274 0.9895817 -0.9999288 0.9917785 0.9917499 -0.9999437 0.9934873 0.9934694 -0.2783684 0.9814251 0.2843648 -0.2783325 0.9814221 0.2842295 -0.2782884 0.9814183 0.2840595 -0.2782347 0.9814136 0.2838465 -0.2781701 0.9814076 0.2835801 -0.2780936 0.9814002 0.2832482 -0.2780055 0.9813911 0.2828365 -0.2779077 0.9813797 0.2823287 -0.2778058 0.9813659 0.2817072 -0.2777122 0.9813491 0.2809547 -0.2776503 0.9813291 0.280057 -0.2776626 0.9813057 0.2790088 -0.2778236 0.9812792 0.2778236 -0.2795295 0.9812792 0.2778236 -0.2816876 0.9812792 0.2778236 -0.284418 0.9812792 0.2778236 -0.2878722 0.9812792 0.2778236 -0.2922423 0.9812792 0.2778236 -0.297771 0.9812792 0.2778236 -0.3047655 0.9812792 0.2778236 -0.3136144 0.9812792 0.2778236 -0.3248095 0.9812792 0.2778236 -0.3389728 0.9812792 0.2778236 -0.3568911 0.9812792 0.2778236 -0.3795602 0.9812792 0.2778236 -0.4082395 0.9812792 0.2778236 -0.4445225 0.9812792 0.2778236 -0.4904253 0.9812792 0.2778236 -0.5484982 0.9812792 0.2778236 -0.6219681 0.9812792 0.2778236 -0.714917 0.9812792 0.2778236 -0.8325095 0.9812792 0.2778236 -0.9812792 0.9812792 0.2778236 -0.9857332 0.8504495 0.3448204 -0.9890339 0.7719895 0.4138582 -0.9915169 0.7329388 0.4829319 -0.9934058 0.7221817 0.5500915 -0.9948551 0.7305163 0.6136284 -0.9959745 0.7506357 0.672218 -0.9968433 0.7770141 0.7249916 -0.9975204 0.8057052 0.7715352 -0.9980497 0.8340798 0.8118298 -0.9984643 0.8605398 0.8461589 -0.9987899 0.8842454 0.8750088 -0.9990458 0.9048786 0.8989771 -0.9992472 0.922455 0.9187008 -0.9994058 0.9371842 0.9348044 -0.9995309 0.9493727 0.9478684 -0.9996296 0.9593601 0.9584115 -0.9997074 0.9674815 0.9668845 -0.9997689 0.974046 0.9736708 -0.9998174 0.9793271 0.9790916 -0.9998557 0.9835599 0.9834122 -0.999886 0.9869426 0.9868501 -0.9999099 0.9896397 0.9895817 -0.9999288 0.9917862 0.9917499 -0.9999437 0.9934921 0.9934694 -0.3454107 0.9858181 0.3497276 -0.3453807 0.9858163 0.3496259 -0.3453439 0.9858141 0.3494983 -0.3452987 0.9858113 0.3493382 -0.3452442 0.9858079 0.3491382 -0.3451791 0.9858036 0.348889 -0.3451032 0.9857982 0.3485799 -0.3450175 0.9857916 0.3481986 -0.3449254 0.9857835 0.3477322 -0.3448353 0.9857738 0.3471677 -0.3447636 0.9857621 0.3464944 -0.3447407 0.9857485 0.3457085 -0.3448204 0.9857332 0.3448204 -0.3460466 0.9857332 0.3448204 -0.3475978 0.9857332 0.3448204 -0.3495603 0.9857332 0.3448204 -0.3520431 0.9857332 0.3448204 -0.3551842 0.9857332 0.3448204 -0.3591581 0.9857332 0.3448204 -0.3641857 0.9857332 0.3448204 -0.3705461 0.9857332 0.3448204 -0.3785929 0.9857332 0.3448204 -0.3887731 0.9857332 0.3448204 -0.4016525 0.9857332 0.3448204 -0.4179465 0.9857332 0.3448204 -0.4385606 0.9857332 0.3448204 -0.4646401 0.9857332 0.3448204 -0.497634 0.9857332 0.3448204 -0.5393756 0.9857332 0.3448204 -0.5921842 0.9857332 0.3448204 -0.658994 0.9857332 0.3448204 -0.743517 0.9857332 0.3448204 -0.8504495 0.9857332 0.3448204 -0.9857332 0.9857332 0.3448204 -0.9890339 0.8678093 0.4138582 -0.9915169 0.7998295 0.4829319 -0.9934058 0.7682253 0.5500915 -0.9948551 0.7617903 0.6136284 -0.9959745 0.7716168 0.672218 -0.9968433 0.790933 0.7249916 -0.9975204 0.8148475 0.7715352 -0.9980497 0.8400329 0.8118298 -0.9984643 0.8643874 0.8461589 -0.9987899 0.8867166 0.8750088 -0.9990458 0.9064575 0.8989771 -0.9992472 0.9234595 0.9187008 -0.9994058 0.937821 0.9348044 -0.9995309 0.9497751 0.9478684 -0.9996296 0.9596139 0.9584115 -0.9997074 0.9676413 0.9668845 -0.9997689 0.9741464 0.9736708 -0.9998174 0.9793901 0.9790916 -0.9998557 0.9835994 0.9834122 -0.999886 0.9869674 0.9868501 -0.9999099 0.9896552 0.9895817 -0.9999288 0.9917959 0.9917499 -0.9999437 0.9934981 0.9934694 -0.4144197 0.9890841 0.4174814 -0.4143955 0.9890831 0.4174062 -0.4143657 0.9890818 0.4173119 -0.414329 0.9890801 0.4171936 -0.4142845 0.9890781 0.4170458 -0.4142311 0.9890755 0.4168617 -0.4141683 0.9890723 0.4166333 -0.4140964 0.9890684 0.4163517 -0.4140176 0.9890637 0.4160072 -0.4139373 0.9890579 0.4155903 -0.4138668 0.989051 0.4150933 -0.4138277 0.989043 0.4145133 -0.4138582 0.9890339 0.4138582 -0.4147267 0.9890339 0.4138582 -0.4158254 0.9890339 0.4138582 -0.4172154 0.9890339 0.4138582 -0.418974 0.9890339 0.4138582 -0.4211988 0.9890339 0.4138582 -0.4240134 0.9890339 0.4138582 -0.4275744 0.9890339 0.4138582 -0.4320794 0.9890339 0.4138582 -0.4377789 0.9890339 0.4138582 -0.4449894 0.9890339 0.4138582 -0.4541117 0.9890339 0.4138582 -0.4656526 0.9890339 0.4138582 -0.4802533 0.9890339 0.4138582 -0.4987251 0.9890339 0.4138582 -0.5220943 0.9890339 0.4138582 -0.5516594 0.9890339 0.4138582 -0.5890631 0.9890339 0.4138582 -0.6363837 0.9890339 0.4138582 -0.6962504 0.9890339 0.4138582 -0.7719895 0.9890339 0.4138582 -0.8678093 0.9890339 0.4138582 -0.9890339 0.9890339 0.4138582 -0.9915169 0.8844548 0.4829319 -0.9934058 0.8264764 0.5500915 -0.9948551 0.8013559 0.6136284 -0.9959745 0.7981605 0.672218 -0.9968433 0.8085421 0.7249916 -0.9975204 0.8264138 0.7715352 -0.9980497 0.8475643 0.8118298 -0.9984643 0.8692552 0.8461589 -0.9987899 0.8898431 0.8750088 -0.9990458 0.9084551 0.8989771 -0.9992472 0.9247302 0.9187008 -0.9994058 0.9386265 0.9348044 -0.9995309 0.9502843 0.9478684 -0.9996296 0.959935 0.9584115 -0.9997074 0.9678434 0.9668845 -0.9997689 0.9742734 0.9736708 -0.9998174 0.9794699 0.9790916 -0.9998557 0.9836494 0.9834122 -0.999886 0.9869987 0.9868501 -0.9999099 0.9896748 0.9895817 -0.9999288 0.9918082 0.9917499 -0.9999437 0.9935058 0.9934694 -0.4834235 0.9915469 0.4855631 -0.4834045 0.9915463 0.4855085 -0.4833811 0.9915455 0.4854399 -0.4833522 0.9915446 0.485354 -0.4833171 0.9915433 0.4852466 -0.4832747 0.9915418 0.4851127 -0.4832246 0.9915399 0.4849468 -0.4831666 0.9915376 0.4847422 -0.4831021 0.9915347 0.484492 -0.4830346 0.9915312 0.4841892 -0.4829718 0.9915271 0.4838283 -0.4829286 0.9915223 0.4834073 -0.4829319 0.9915169 0.4829319 -0.4835382 0.9915169 0.4829319 -0.4843052 0.9915169 0.4829319 -0.4852755 0.9915169 0.4829319 -0.4865032 0.9915169 0.4829319 -0.4880563 0.9915169 0.4829319 -0.4900212 0.9915169 0.4829319 -0.492507 0.9915169 0.4829319 -0.4956519 0.9915169 0.4829319 -0.4996306 0.9915169 0.4829319 -0.5046642 0.9915169 0.4829319 -0.5110324 0.9915169 0.4829319 -0.5190889 0.9915169 0.4829319 -0.5292815 0.9915169 0.4829319 -0.5421764 0.9915169 0.4829319 -0.5584902 0.9915169 0.4829319 -0.5791292 0.9915169 0.4829319 -0.6052403 0.9915169 0.4829319 -0.6382742 0.9915169 0.4829319 -0.6800663 0.9915169 0.4829319 -0.7329388 0.9915169 0.4829319 -0.7998295 0.9915169 0.4829319 -0.8844548 0.9915169 0.4829319 -0.9915169 0.9915169 0.4829319 -0.9934058 0.9001717 0.5500915 -0.9948551 0.8514115 0.6136284 -0.9959745 0.8317419 0.672218 -0.9968433 0.8308201 0.7249916 -0.9975204 0.8410466 0.7715352 -0.9980497 0.8570925 0.8118298 -0.9984643 0.8754136 0.8461589 -0.9987899 0.8937986 0.8750088 -0.9990458 0.9109823 0.8989771 -0.9992472 0.9263379 0.9187008 -0.9994058 0.9396456 0.9348044 -0.9995309 0.9509284 0.9478684 -0.9996296 0.9603412 0.9584115 -0.9997074 0.968099 0.9668845 -0.9997689 0.9744341 0.9736708 -0.9998174 0.9795707 0.9790916 -0.9998557 0.9837127 0.9834122 -0.999886 0.9870383 0.9868501 -0.9999099 0.9896996 0.9895817 -0.9999288 0.9918237 0.9917499 -0.9999437 0.9935156 0.9934694 -0.5504963 0.993424 0.5519704 -0.5504818 0.9934236 0.5519314 -0.550464 0.9934231 0.5518824 -0.5504419 0.9934225 0.551821 -0.550415 0.9934218 0.5517442 -0.5503825 0.9934209 0.5516486 -0.5503438 0.9934197 0.5515301 -0.5502987 0.9934183 0.5513839 -0.550248 0.9934166 0.5512052 -0.5501939 0.9934145 0.550989 -0.5501416 0.993412 0.5507314 -0.5501012 0.9934091 0.5504308 -0.5500915 0.9934058 0.5500915 -0.5505089 0.9934058 0.5500915 -0.5510368 0.9934058 0.5500915 -0.5517048 0.9934058 0.5500915 -0.5525498 0.9934058 0.5500915 -0.5536189 0.9934058 0.5500915 -0.5549714 0.9934058 0.5500915 -0.5566825 0.9934058 0.5500915 -0.5588473 0.9934058 0.5500915 -0.561586 0.9934058 0.5500915 -0.5650508 0.9934058 0.5500915 -0.5694343 0.9934058 0.5500915 -0.5749799 0.9934058 0.5500915 -0.5819959 0.9934058 0.5500915 -0.590872 0.9934058 0.5500915 -0.6021014 0.9934058 0.5500915 -0.6163081 0.9934058 0.5500915 -0.6342815 0.9934058 0.5500915 -0.6570201 0.9934058 0.5500915 -0.6857874 0.9934058 0.5500915 -0.7221817 0.9934058 0.5500915 -0.7682253 0.9934058 0.5500915 -0.8264764 0.9934058 0.5500915 -0.9001717 0.9934058 0.5500915 -0.9934058 0.9934058 0.5500915 -0.9948551 0.9147384 0.6136284 -0.9959745 0.8742266 0.672218 -0.9968433 0.8590045 0.7249916 -0.9975204 0.859559 0.7715352 -0.9980497 0.869147 0.8118298 -0.9984643 0.8832048 0.8461589 -0.9987899 0.8988027 0.8750088 -0.9990458 0.9141795 0.8989771 -0.9992472 0.9283719 0.9187008 -0.9994058 0.9409349 0.9348044 -0.9995309 0.9517434 0.9478684 -0.9996296 0.9608551 0.9584115 -0.9997074 0.9684225 0.9668845 -0.9997689 0.9746374 0.9736708 -0.9998174 0.9796983 0.9790916 -0.9998557 0.9837927 0.9834122 -0.999886 0.9870885 0.9868501 -0.9999099 0.989731 0.9895817 -0.9999288 0.9918434 0.9917499 -0.9999437 0.9935279 0.9934694 -0.6139459 0.9948662 0.6149479 -0.6139352 0.994866 0.6149205 -0.6139219 0.9948657 0.6148861 -0.6139056 0.9948653 0.6148429 -0.6138855 0.9948649 0.614789 -0.6138613 0.9948643 0.6147218 -0.6138323 0.9948636 0.6146385 -0.6137984 0.9948628 0.6145359 -0.6137599 0.9948617 0.6144104 -0.6137183 0.9948604 0.6142585 -0.6136769 0.9948589 0.6140776 -0.6136427 0.9948571 0.6138666 -0.6136284 0.9948551 0.6136284 -0.6139119 0.9948551 0.6136284 -0.6142705 0.9948551 0.6136284 -0.6147242 0.9948551 0.6136284 -0.6152981 0.9948551 0.6136284 -0.6160243 0.9948551 0.6136284 -0.6169429 0.9948551 0.6136284 -0.6181052 0.9948551 0.6136284 -0.6195755 0.9948551 0.6136284 -0.6214357 0.9948551 0.6136284 -0.6237891 0.9948551 0.6136284 -0.6267665 0.9948551 0.6136284 -0.6305332 0.9948551 0.6136284 -0.6352987 0.9948551 0.6136284 -0.6413275 0.9948551 0.6136284 -0.6489548 0.9948551 0.6136284 -0.6586044 0.9948551 0.6136284 -0.6708123 0.9948551 0.6136284 -0.6862569 0.9948551 0.6136284 -0.7057964 0.9948551 0.6136284 -0.7305163 0.9948551 0.6136284 -0.7617903 0.9948551 0.6136284 -0.8013559 0.9948551 0.6136284 -0.8514115 0.9948551 0.6136284 -0.9147384 0.9948551 0.6136284 -0.9948551 0.9948551 0.6136284 -0.9959745 0.9279753 0.672218 -0.9968433 0.8946616 0.7249916 -0.9975204 0.8829797 0.7715352 -0.9980497 0.8843975 0.8118298 -0.9984643 0.8930617 0.8461589 -0.9987899 0.9051336 0.8750088 -0.9990458 0.9182244 0.8989771 -0.9992472 0.9309451 0.9187008 -0.9994058 0.9425661 0.9348044 -0.9995309 0.9527744 0.9478684 -0.9996296 0.9615052 0.9584115 -0.9997074 0.9688317 0.9668845 -0.9997689 0.9748946 0.9736708 -0.9998174 0.9798597 0.9790916 -0.9998557 0.9838939 0.9834122 -0.999886 0.9871519 0.9868501 -0.9999099 0.9897708 0.9895817 -0.9999288 0.9918682 0.9917499 -0.9999437 0.9935434 0.9934694 -0.6724572 0.9959813 0.6731299 -0.6724495 0.9959811 0.6731109 -0.6724399 0.9959809 0.6730871 -0.672428 0.9959807 0.6730573 -0.6724135 0.9959804 0.67302 -0.6723959 0.9959801 0.6729735 -0.6723748 0.9959797 0.672916 -0.67235 0.9959791 0.672845 -0.6723217 0.9959785 0.6727582 -0.6722907 0.9959777 0.6726533 -0.6722594 0.9959768 0.6725283 -0.6722322 0.9959757 0.6723825 -0.672218 0.9959745 0.672218 -0.6724081 0.9959745 0.672218 -0.6726487 0.9959745 0.672218 -0.6729531 0.9959745 0.672218 -0.6733381 0.9959745 0.672218 -0.6738253 0.9959745 0.672218 -0.6744416 0.9959745 0.672218 -0.6752213 0.9959745 0.672218 -0.6762077 0.9959745 0.672218 -0.6774557 0.9959745 0.672218 -0.6790346 0.9959745 0.672218 -0.681032 0.9959745 0.672218 -0.683559 0.9959745 0.672218 -0.6867561 0.9959745 0.672218 -0.6908007 0.9959745 0.672218 -0.6959177 0.9959745 0.672218 -0.7023914 0.9959745 0.672218 -0.7105815 0.9959745 0.672218 -0.720943 0.9959745 0.672218 -0.7340516 0.9959745 0.672218 -0.7506357 0.9959745 0.672218 -0.7716168 0.9959745 0.672218 -0.7981605 0.9959745 0.672218 -0.8317419 0.9959745 0.672218 -0.8742266 0.9959745 0.672218 -0.9279753 0.9959745 0.672218 -0.9959745 0.9959745 0.672218 -0.9968433 0.9397723 0.7249916 -0.9975204 0.9126098 0.7715352 -0.9980497 0.9036913 0.8118298 -0.9984643 0.9055319 0.8461589 -0.9987899 0.9131429 0.8750088 -0.9990458 0.9233418 0.8989771 -0.9992472 0.9342005 0.9187008 -0.9994058 0.9446297 0.9348044 -0.9995309 0.9540788 0.9478684 -0.9996296 0.9623277 0.9584115 -0.9997074 0.9693494 0.9668845 -0.9997689 0.9752199 0.9736708 -0.9998174 0.980064 0.9790916 -0.9998557 0.984022 0.9834122 -0.999886 0.9872322 0.9868501 -0.9999099 0.989821 0.9895817 -0.9999288 0.9918997 0.9917499 -0.9999437 0.9935631 0.9934694 -0.7251659 0.9968475 0.7256124 -0.7251605 0.9968474 0.7255995 -0.7251537 0.9968473 0.7255833 -0.7251454 0.9968472 0.725563 -0.7251351 0.996847 0.7255376 -0.7251226 0.9968468 0.725506 -0.7251076 0.9968465 0.7254668 -0.7250899 0.9968462 0.7254184 -0.7250697 0.9968458 0.7253594 -0.7250473 0.9968453 0.7252879 -0.7250244 0.9968448 0.7252028 -0.7250039 0.9968441 0.7251035 -0.7249916 0.9968433 0.7249916 -0.7251177 0.9968433 0.7249916 -0.7252773 0.9968433 0.7249916 -0.7254792 0.9968433 0.7249916 -0.7257347 0.9968433 0.7249916 -0.7260579 0.9968433 0.7249916 -0.7264667 0.9968433 0.7249916 -0.726984 0.9968433 0.7249916 -0.7276384 0.9968433 0.7249916 -0.7284663 0.9968433 0.7249916 -0.7295137 0.9968433 0.7249916 -0.7308388 0.9968433 0.7249916 -0.7325153 0.9968433 0.7249916 -0.7346362 0.9968433 0.7249916 -0.7373194 0.9968433 0.7249916 -0.7407141 0.9968433 0.7249916 -0.7450087 0.9968433 0.7249916 -0.750442 0.9968433 0.7249916 -0.7573158 0.9968433 0.7249916 -0.7660121 0.9968433 0.7249916 -0.7770141 0.9968433 0.7249916 -0.790933 0.9968433 0.7249916 -0.8085421 0.9968433 0.7249916 -0.8308201 0.9968433 0.7249916 -0.8590045 0.9968433 0.7249916 -0.8946616 0.9968433 0.7249916 -0.9397723 0.9968433 0.7249916 -0.9968433 0.9968433 0.7249916 -0.9975204 0.9500958 0.7715352 -0.9980497 0.9281006 0.8118298 -0.9984643 0.9213083 0.8461589 -0.9987899 0.9232758 0.8750088 -0.9990458 0.9298159 0.8989771 -0.9992472 0.938319 0.9187008 -0.9994058 0.9472405 0.9348044 -0.9995309 0.9557289 0.9478684 -0.9996296 0.9633684 0.9584115 -0.9997074 0.9700044 0.9668845 -0.9997689 0.9756316 0.9736708 -0.9998174 0.9803224 0.9790916 -0.9998557 0.984184 0.9834122 -0.999886 0.9873337 0.9868501 -0.9999099 0.9898846 0.9895817 -0.9999288 0.9919395 0.9917499 -0.9999437 0.993588 0.9934694 -0.7716588 0.997523 0.7719522 -0.7716551 0.997523 0.7719436 -0.7716504 0.9975229 0.7719327 -0.7716446 0.9975228 0.771919 -0.7716375 0.9975227 0.7719019 -0.7716288 0.9975226 0.7718807 -0.7716184 0.9975224 0.7718544 -0.7716061 0.9975222 0.7718219 -0.7715919 0.997522 0.7717822 -0.7715762 0.9975217 0.7717342 -0.7715599 0.9975213 0.7716771 -0.7715449 0.9975209 0.7716104 -0.7715352 0.9975204 0.7715352 -0.7716181 0.9975204 0.7715352 -0.7717229 0.9975204 0.7715352 -0.7718555 0.9975204 0.7715352 -0.7720233 0.9975204 0.7715352 -0.7722356 0.9975204 0.7715352 -0.7725042 0.9975204 0.7715352 -0.7728439 0.9975204 0.7715352 -0.7732737 0.9975204 0.7715352 -0.7738175 0.9975204 0.7715352 -0.7745055 0.9975204 0.7715352 -0.7753759 0.9975204 0.7715352 -0.776477 0.9975204 0.7715352 -0.7778701 0.9975204 0.7715352 -0.7796325 0.9975204 0.7715352 -0.7818622 0.9975204 0.7715352 -0.7846831 0.9975204 0.7715352 -0.7882518 0.9975204 0.7715352 -0.7927668 0.9975204 0.7715352 -0.7984788 0.9975204 0.7715352 -0.8057052 0.9975204 0.7715352 -0.8148475 0.9975204 0.7715352 -0.8264138 0.9975204 0.7715352 -0.8410466 0.9975204 0.7715352 -0.859559 0.9975204 0.7715352 -0.8829797 0.9975204 0.7715352 -0.9126098 0.9975204 0.7715352 -0.9500958 0.9975204 0.7715352 -0.9975204 0.9975204 0.7715352 -0.9980497 0.9589814 0.8118298 -0.9984643 0.9412675 0.8461589 -0.9987899 0.9360952 0.8750088 -0.9990458 0.9380065 0.8989771 -0.9992472 0.9435295 0.9187008 -0.9994058 0.9505434 0.9348044 -0.9995309 0.9578166 0.9478684 -0.9996296 0.9646849 0.9584115 -0.9997074 0.970833 0.9668845 -0.9997689 0.9761523 0.9736708 -0.9998174 0.9806492 0.9790916 -0.9998557 0.984389 0.9834122 -0.999886 0.9874621 0.9868501 -0.9999099 0.989965 0.9895817 -0.9999288 0.9919898 0.9917499 -0.9999437 0.9936195 0.9934694 -0.8119154 0.9980513 0.8121065 -0.8119128 0.9980512 0.8121007 -0.8119096 0.9980512 0.8120935 -0.8119057 0.9980511 0.8120844 -0.8119009 0.9980511 0.8120731 -0.8118949 0.998051 0.812059 -0.8118878 0.9980509 0.8120415 -0.8118794 0.9980508 0.81202 -0.8118697 0.9980506 0.8119937 -0.8118589 0.9980504 0.8119618 -0.8118476 0.9980502 0.8119239 -0.811837 0.99805 0.8118797 -0.8118298 0.9980497 0.8118298 -0.8118837 0.9980497 0.8118298 -0.811952 0.9980497 0.8118298 -0.8120384 0.9980497 0.8118298 -0.8121476 0.9980497 0.8118298 -0.8122858 0.9980497 0.8118298 -0.8124607 0.9980497 0.8118298 -0.8126819 0.9980497 0.8118298 -0.8129618 0.9980497 0.8118298 -0.8133159 0.9980497 0.8118298 -0.8137639 0.9980497 0.8118298 -0.8143306 0.9980497 0.8118298 -0.8150477 0.9980497 0.8118298 -0.8159548 0.9980497 0.8118298 -0.8171024 0.9980497 0.8118298 -0.8185543 0.9980497 0.8118298 -0.8203911 0.9980497 0.8118298 -0.8227149 0.9980497 0.8118298 -0.8256548 0.9980497 0.8118298 -0.8293742 0.9980497 0.8118298 -0.8340798 0.9980497 0.8118298 -0.8400329 0.9980497 0.8118298 -0.8475643 0.9980497 0.8118298 -0.8570925 0.9980497 0.8118298 -0.869147 0.9980497 0.8118298 -0.8843975 0.9980497 0.8118298 -0.9036913 0.9980497 0.8118298 -0.9281006 0.9980497 0.8118298 -0.9589814 0.9980497 0.8118298 -0.9980497 0.9980497 0.8118298 -0.9984643 0.9665185 0.8461589 -0.9987899 0.9523135 0.8750088 -0.9990458 0.9483686 0.8989771 -0.9992472 0.9501215 0.9187008 -0.9994058 0.9547221 0.9348044 -0.9995309 0.9604579 0.9478684 -0.9996296 0.9663504 0.9584115 -0.9997074 0.9718813 0.9668845 -0.9997689 0.9768112 0.9736708 -0.9998174 0.9810628 0.9790916 -0.9998557 0.9846484 0.9834122 -0.999886 0.9876247 0.9868501 -0.9999099 0.9900668 0.9895817 -0.9999288 0.9920535 0.9917499 -0.9999437 0.9936594 0.9934694 -0.8462171 0.9984653 0.8463406 -0.8462154 0.9984653 0.8463368 -0.8462132 0.9984653 0.8463321 -0.8462106 0.9984653 0.8463261 -0.8462073 0.9984652 0.8463187 -0.8462034 0.9984652 0.8463094 -0.8461986 0.9984651 0.846298 -0.8461929 0.998465 0.8462838 -0.8461864 0.9984649 0.8462665 -0.8461791 0.9984648 0.8462456 -0.8461714 0.9984647 0.8462207 -0.8461641 0.9984645 0.8461917 -0.8461589 0.9984643 0.8461589 -0.8461938 0.9984643 0.8461589 -0.8462379 0.9984643 0.8461589 -0.8462937 0.9984643 0.8461589 -0.8463643 0.9984643 0.8461589 -0.8464537 0.9984643 0.8461589 -0.8465667 0.9984643 0.8461589 -0.8467097 0.9984643 0.8461589 -0.8468906 0.9984643 0.8461589 -0.8471195 0.9984643 0.8461589 -0.847409 0.9984643 0.8461589 -0.8477753 0.9984643 0.8461589 -0.8482387 0.9984643 0.8461589 -0.848825 0.9984643 0.8461589 -0.8495668 0.9984643 0.8461589 -0.8505052 0.9984643 0.8461589 -0.8516924 0.9984643 0.8461589 -0.8531943 0.9984643 0.8461589 -0.8550945 0.9984643 0.8461589 -0.8574984 0.9984643 0.8461589 -0.8605398 0.9984643 0.8461589 -0.8643874 0.9984643 0.8461589 -0.8692552 0.9984643 0.8461589 -0.8754136 0.9984643 0.8461589 -0.8832048 0.9984643 0.8461589 -0.8930617 0.9984643 0.8461589 -0.9055319 0.9984643 0.8461589 -0.9213083 0.9984643 0.8461589 -0.9412675 0.9984643 0.8461589 -0.9665185 0.9984643 0.8461589 -0.9984643 0.9984643 0.8461589 -0.9987899 0.9728317 0.8750088 -0.9990458 0.9614781 0.8989771 -0.9992472 0.9584612 0.9187008 -0.9994058 0.9600086 0.9348044 -0.9995309 0.9637993 0.9478684 -0.9996296 0.9684575 0.9584115 -0.9997074 0.9732076 0.9668845 -0.9997689 0.9776447 0.9736708 -0.9998174 0.981586 0.9790916 -0.9998557 0.9849765 0.9834122 -0.999886 0.9878302 0.9868501 -0.9999099 0.9901956 0.9895817 -0.9999288 0.9921341 0.9917499 -0.9999437 0.9937098 0.9934694 -0.8750477 0.9987905 0.8751271 -0.8750466 0.9987905 0.8751246 -0.8750451 0.9987904 0.8751215 -0.8750434 0.9987904 0.8751176 -0.8750412 0.9987904 0.8751128 -0.8750386 0.9987904 0.8751068 -0.8750355 0.9987903 0.8750993 -0.8750317 0.9987903 0.8750901 -0.8750274 0.9987902 0.8750788 -0.8750225 0.9987902 0.8750652 -0.8750173 0.9987901 0.875049 -0.8750124 0.99879 0.8750301 -0.8750088 0.9987899 0.8750088 -0.8750312 0.9987899 0.8750088 -0.8750596 0.9987899 0.8750088 -0.8750954 0.9987899 0.8750088 -0.8751408 0.9987899 0.8750088 -0.8751981 0.9987899 0.8750088 -0.8752707 0.9987899 0.8750088 -0.8753626 0.9987899 0.8750088 -0.8754788 0.9987899 0.8750088 -0.8756258 0.9987899 0.8750088 -0.8758117 0.9987899 0.8750088 -0.876047 0.9987899 0.8750088 -0.8763446 0.9987899 0.8750088 -0.8767212 0.9987899 0.8750088 -0.8771976 0.9987899 0.8750088 -0.8778003 0.9987899 0.8750088 -0.8785628 0.9987899 0.8750088 -0.8795275 0.9987899 0.8750088 -0.880748 0.9987899 0.8750088 -0.882292 0.9987899 0.8750088 -0.8842454 0.9987899 0.8750088 -0.8867166 0.9987899 0.8750088 -0.8898431 0.9987899 0.8750088 -0.8937986 0.9987899 0.8750088 -0.8988027 0.9987899 0.8750088 -0.9051336 0.9987899 0.8750088 -0.9131429 0.9987899 0.8750088 -0.9232758 0.9987899 0.8750088 -0.9360952 0.9987899 0.8750088 -0.9523135 0.9987899 0.8750088 -0.9728317 0.9987899 0.8750088 -0.9987899 0.9987899 0.8750088 -0.9990458 0.9780633 0.8989771 -0.9992472 0.969012 0.9187008 -0.9994058 0.9666968 0.9348044 -0.9995309 0.9680267 0.9478684 -0.9996296 0.9711233 0.9584115 -0.9997074 0.9748855 0.9668845 -0.9997689 0.9786991 0.9736708 -0.9998174 0.9822479 0.9790916 -0.9998557 0.9853915 0.9834122 -0.999886 0.9880903 0.9868501 -0.9999099 0.9903584 0.9895817 -0.9999288 0.9922361 0.9917499 -0.9999437 0.9937736 0.9934694 -0.8990028 0.9990461 0.8990535 -0.899002 0.9990461 0.8990519 -0.8990011 0.9990461 0.8990499 -0.899 0.9990461 0.8990474 -0.8989986 0.9990461 0.8990443 -0.8989969 0.9990461 0.8990404 -0.8989948 0.9990461 0.8990356 -0.8989923 0.999046 0.8990296 -0.8989895 0.999046 0.8990224 -0.8989863 0.9990459 0.8990136 -0.8989829 0.9990459 0.8990031 -0.8989796 0.9990458 0.8989909 -0.8989771 0.9990458 0.8989771 -0.8989915 0.9990458 0.8989771 -0.8990096 0.9990458 0.8989771 -0.8990325 0.9990458 0.8989771 -0.8990614 0.9990458 0.8989771 -0.8990981 0.9990458 0.8989771 -0.8991445 0.9990458 0.8989771 -0.8992032 0.9990458 0.8989771 -0.8992774 0.9990458 0.8989771 -0.8993713 0.9990458 0.8989771 -0.8994901 0.9990458 0.8989771 -0.8996405 0.9990458 0.8989771 -0.8998306 0.9990458 0.8989771 -0.9000712 0.9990458 0.8989771 -0.9003756 0.9990458 0.8989771 -0.9007607 0.9990458 0.8989771 -0.9012479 0.9990458 0.8989771 -0.9018642 0.9990458 0.8989771 -0.902644 0.9990458 0.8989771 -0.9036305 0.9990458 0.8989771 -0.9048786 0.9990458 0.8989771 -0.9064575 0.9990458 0.8989771 -0.9084551 0.9990458 0.8989771 -0.9109823 0.9990458 0.8989771 -0.9141795 0.9990458 0.8989771 -0.9182244 0.9990458 0.8989771 -0.9233418 0.9990458 0.8989771 -0.9298159 0.9990458 0.8989771 -0.9380065 0.9990458 0.8989771 -0.9483686 0.9990458 0.8989771 -0.9614781 0.9990458 0.8989771 -0.9780633 0.9990458 0.8989771 -0.9990458 0.9990458 0.8989771 -0.9992472 0.9823601 0.9187008 -0.9994058 0.9751582 0.9348044 -0.9995309 0.9733749 0.9478684 -0.9996296 0.9744959 0.9584115 -0.9997074 0.9770082 0.9668845 -0.9997689 0.9800332 0.9736708 -0.9998174 0.9830853 0.9790916 -0.9998557 0.9859167 0.9834122 -0.999886 0.9884194 0.9868501 -0.9999099 0.9905645 0.9895817 -0.9999288 0.9923651 0.9917499 -0.9999437 0.9938543 0.9934694 -0.9187175 0.9992474 0.9187498 -0.918717 0.9992474 0.9187488 -0.9187164 0.9992474 0.9187475 -0.9187157 0.9992474 0.9187459 -0.9187148 0.9992474 0.9187439 -0.9187137 0.9992474 0.9187414 -0.9187123 0.9992473 0.9187383 -0.9187107 0.9992473 0.9187344 -0.9187089 0.9992473 0.9187298 -0.9187068 0.9992473 0.9187241 -0.9187045 0.9992472 0.9187174 -0.9187024 0.9992472 0.9187096 -0.9187008 0.9992472 0.9187008 -0.9187099 0.9992472 0.9187008 -0.9187214 0.9992472 0.9187008 -0.918736 0.9992472 0.9187008 -0.9187544 0.9992472 0.9187008 -0.9187777 0.9992472 0.9187008 -0.9188072 0.9992472 0.9187008 -0.9188446 0.9992472 0.9187008 -0.9188918 0.9992472 0.9187008 -0.9189515 0.9992472 0.9187008 -0.9190271 0.9992472 0.9187008 -0.9191227 0.9992472 0.9187008 -0.9192437 0.9992472 0.9187008 -0.9193968 0.9992472 0.9187008 -0.9195904 0.9992472 0.9187008 -0.9198354 0.9992472 0.9187008 -0.9201453 0.9992472 0.9187008 -0.9205374 0.9992472 0.9187008 -0.9210335 0.9992472 0.9187008 -0.921661 0.9992472 0.9187008 -0.922455 0.9992472 0.9187008 -0.9234595 0.9992472 0.9187008 -0.9247302 0.9992472 0.9187008 -0.9263379 0.9992472 0.9187008 -0.9283719 0.9992472 0.9187008 -0.9309451 0.9992472 0.9187008 -0.9342005 0.9992472 0.9187008 -0.938319 0.9992472 0.9187008 -0.9435295 0.9992472 0.9187008 -0.9501215 0.9992472 0.9187008 -0.9584612 0.9992472 0.9187008 -0.969012 0.9992472 0.9187008 -0.9823601 0.9992472 0.9187008 -0.9992472 0.9992472 0.9187008 -0.9994058 0.9858629 0.9348044 -0.9995309 0.9801411 0.9478684 -0.9996296 0.9787626 0.9584115 -0.9997074 0.9796937 0.9668845 -0.9997689 0.981721 0.9736708 -0.9998174 0.9841447 0.9790916 -0.9998557 0.986581 0.9834122 -0.999886 0.9888357 0.9868501 -0.9999099 0.9908252 0.9895817 -0.9999288 0.9925283 0.9917499 -0.9999437 0.9939564 0.9934694 -0.9348153 0.999406 0.9348357 -0.9348149 0.999406 0.9348351 -0.9348146 0.999406 0.9348342 -0.9348141 0.999406 0.9348332 -0.9348135 0.999406 0.9348319 -0.9348128 0.9994059 0.9348303 -0.9348119 0.9994059 0.9348284 -0.9348109 0.9994059 0.9348259 -0.9348097 0.9994059 0.934823 -0.9348083 0.9994059 0.9348194 -0.9348069 0.9994059 0.9348151 -0.9348055 0.9994059 0.9348101 -0.9348044 0.9994058 0.9348044 -0.9348102 0.9994058 0.9348044 -0.9348175 0.9994058 0.9348044 -0.9348267 0.9994058 0.9348044 -0.9348384 0.9994058 0.9348044 -0.9348532 0.9994058 0.9348044 -0.9348719 0.9994058 0.9348044 -0.9348956 0.9994058 0.9348044 -0.9349255 0.9994058 0.9348044 -0.9349634 0.9994058 0.9348044 -0.9350113 0.9994058 0.9348044 -0.9350719 0.9994058 0.9348044 -0.9351486 0.9994058 0.9348044 -0.9352456 0.9994058 0.9348044 -0.9353684 0.9994058 0.9348044 -0.9355237 0.9994058 0.9348044 -0.9357201 0.9994058 0.9348044 -0.9359687 0.9994058 0.9348044 -0.9362831 0.9994058 0.9348044 -0.9366809 0.9994058 0.9348044 -0.9371842 0.9994058 0.9348044 -0.937821 0.9994058 0.9348044 -0.9386265 0.9994058 0.9348044 -0.9396456 0.9994058 0.9348044 -0.9409349 0.9994058 0.9348044 -0.9425661 0.9994058 0.9348044 -0.9446297 0.9994058 0.9348044 -0.9472405 0.9994058 0.9348044 -0.9505434 0.9994058 0.9348044 -0.9547221 0.9994058 0.9348044 -0.9600086 0.9994058 0.9348044 -0.9666968 0.9994058 0.9348044 -0.9751582 0.9994058 0.9348044 -0.9858629 0.9994058 0.9348044 -0.9994058 0.9994058 0.9348044 -0.9995309 0.9887012 0.9478684 -0.9996296 0.9841606 0.9584115 -0.9997074 0.9830913 0.9668845 -0.9997689 0.9838562 0.9736708 -0.9998174 0.985485 0.9790916 -0.9998557 0.9874216 0.9834122 -0.999886 0.9893624 0.9868501 -0.9999099 0.991155 0.9895817 -0.9999288 0.9927347 0.9917499 -0.9999437 0.9940856 0.9934694 -0.9478754 0.999531 0.9478883 -0.9478752 0.999531 0.9478879 -0.947875 0.999531 0.9478874 -0.9478746 0.999531 0.9478867 -0.9478743 0.999531 0.9478859 -0.9478738 0.999531 0.9478849 -0.9478733 0.999531 0.9478837 -0.9478726 0.999531 0.9478821 -0.9478718 0.999531 0.9478802 -0.947871 0.9995309 0.9478779 -0.94787 0.9995309 0.9478752 -0.9478691 0.9995309 0.947872 -0.9478684 0.9995309 0.9478684 -0.9478721 0.9995309 0.9478684 -0.9478767 0.9995309 0.9478684 -0.9478825 0.9995309 0.9478684 -0.9478899 0.9995309 0.9478684 -0.9478993 0.9995309 0.9478684 -0.9479111 0.9995309 0.9478684 -0.9479261 0.9995309 0.9478684 -0.947945 0.9995309 0.9478684 -0.9479689 0.9995309 0.9478684 -0.9479992 0.9995309 0.9478684 -0.9480375 0.9995309 0.9478684 -0.948086 0.9995309 0.9478684 -0.9481473 0.9995309 0.9478684 -0.9482249 0.9995309 0.9478684 -0.9483231 0.9995309 0.9478684 -0.9484472 0.9995309 0.9478684 -0.9486043 0.9995309 0.9478684 -0.9488031 0.9995309 0.9478684 -0.9490545 0.9995309 0.9478684 -0.9493727 0.9995309 0.9478684 -0.9497751 0.9995309 0.9478684 -0.9502843 0.9995309 0.9478684 -0.9509284 0.9995309 0.9478684 -0.9517434 0.9995309 0.9478684 -0.9527744 0.9995309 0.9478684 -0.9540788 0.9995309 0.9478684 -0.9557289 0.9995309 0.9478684 -0.9578166 0.9995309 0.9478684 -0.9604579 0.9995309 0.9478684 -0.9637993 0.9995309 0.9478684 -0.9680267 0.9995309 0.9478684 -0.9733749 0.9995309 0.9478684 -0.9801411 0.9995309 0.9478684 -0.9887012 0.9995309 0.9478684 -0.9995309 0.9995309 0.9478684 -0.9996296 0.9909898 0.9584115 -0.9997074 0.9873897 0.9668845 -0.9997689 0.9865576 0.9736708 -0.9998174 0.9871807 0.9790916 -0.9998557 0.9884849 0.9834122 -0.999886 0.9900287 0.9868501 -0.9999099 0.9915723 0.9895817 -0.9999288 0.9929959 0.9917499 -0.9999437 0.994249 0.9934694 -0.958416 0.9996296 0.9584241 -0.9584159 0.9996296 0.9584239 -0.9584157 0.9996296 0.9584235 -0.9584155 0.9996296 0.9584231 -0.9584153 0.9996296 0.9584226 -0.958415 0.9996296 0.958422 -0.9584146 0.9996296 0.9584212 -0.9584142 0.9996296 0.9584202 -0.9584137 0.9996296 0.958419 -0.9584132 0.9996296 0.9584175 -0.9584126 0.9996296 0.9584158 -0.958412 0.9996296 0.9584138 -0.9584115 0.9996296 0.9584115 -0.9584138 0.9996296 0.9584115 -0.9584168 0.9996296 0.9584115 -0.9584204 0.9996296 0.9584115 -0.9584251 0.9996296 0.9584115 -0.958431 0.9996296 0.9584115 -0.9584384 0.9996296 0.9584115 -0.9584479 0.9996296 0.9584115 -0.9584598 0.9996296 0.9584115 -0.9584749 0.9996296 0.9584115 -0.958494 0.9996296 0.9584115 -0.9585182 0.9996296 0.9584115 -0.9585487 0.9996296 0.9584115 -0.9585874 0.9996296 0.9584115 -0.9586363 0.9996296 0.9584115 -0.9586982 0.9996296 0.9584115 -0.9587765 0.9996296 0.9584115 -0.9588756 0.9996296 0.9584115 -0.9590009 0.9996296 0.9584115 -0.9591595 0.9996296 0.9584115 -0.9593601 0.9996296 0.9584115 -0.9596139 0.9996296 0.9584115 -0.959935 0.9996296 0.9584115 -0.9603412 0.9996296 0.9584115 -0.9608551 0.9996296 0.9584115 -0.9615052 0.9996296 0.9584115 -0.9623277 0.9996296 0.9584115 -0.9633684 0.9996296 0.9584115 -0.9646849 0.9996296 0.9584115 -0.9663504 0.9996296 0.9584115 -0.9684575 0.9996296 0.9584115 -0.9711233 0.9996296 0.9584115 -0.9744959 0.9996296 0.9584115 -0.9787626 0.9996296 0.9584115 -0.9841606 0.9996296 0.9584115 -0.9909898 0.9996296 0.9584115 -0.9996296 0.9996296 0.9584115 -0.9997074 0.9928276 0.9668845 -0.9997689 0.9899752 0.9736708 -0.9998174 0.9893259 0.9790916 -0.9998557 0.9898302 0.9834122 -0.999886 0.9908717 0.9868501 -0.9999099 0.9921002 0.9895817 -0.9999288 0.9933263 0.9917499 -0.9999437 0.9944557 0.9934694 -0.9668873 0.9997074 0.9668925 -0.9668872 0.9997074 0.9668923 -0.9668871 0.9997074 0.9668921 -0.966887 0.9997074 0.9668918 -0.9668869 0.9997074 0.9668915 -0.9668867 0.9997074 0.9668911 -0.9668865 0.9997074 0.9668906 -0.9668862 0.9997074 0.96689 -0.9668859 0.9997074 0.9668892 -0.9668855 0.9997074 0.9668883 -0.9668852 0.9997074 0.9668872 -0.9668848 0.9997074 0.9668859 -0.9668845 0.9997074 0.9668845 -0.9668859 0.9997074 0.9668845 -0.9668878 0.9997074 0.9668845 -0.9668901 0.9997074 0.9668845 -0.966893 0.9997074 0.9668845 -0.9668967 0.9997074 0.9668845 -0.9669014 0.9997074 0.9668845 -0.9669074 0.9997074 0.9668845 -0.9669149 0.9997074 0.9668845 -0.9669244 0.9997074 0.9668845 -0.9669364 0.9997074 0.9668845 -0.9669516 0.9997074 0.9668845 -0.9669708 0.9997074 0.9668845 -0.9669952 0.9997074 0.9668845 -0.967026 0.9997074 0.9668845 -0.9670649 0.9997074 0.9668845 -0.9671142 0.9997074 0.9668845 -0.9671766 0.9997074 0.9668845 -0.9672555 0.9997074 0.9668845 -0.9673553 0.9997074 0.9668845 -0.9674815 0.9997074 0.9668845 -0.9676413 0.9997074 0.9668845 -0.9678434 0.9997074 0.9668845 -0.968099 0.9997074 0.9668845 -0.9684225 0.9997074 0.9668845 -0.9688317 0.9997074 0.9668845 -0.9693494 0.9997074 0.9668845 -0.9700044 0.9997074 0.9668845 -0.970833 0.9997074 0.9668845 -0.9718813 0.9997074 0.9668845 -0.9732076 0.9997074 0.9668845 -0.9748855 0.9997074 0.9668845 -0.9770082 0.9997074 0.9668845 -0.9796937 0.9997074 0.9668845 -0.9830913 0.9997074 0.9668845 -0.9873897 0.9997074 0.9668845 -0.9928276 0.9997074 0.9668845 -0.9997074 0.9997074 0.9668845 -0.9997689 0.9942988 0.9736708 -0.9998174 0.9920399 0.9790916 -0.9998557 0.9915321 0.9834122 -0.999886 0.9919382 0.9868501 -0.9999099 0.9927681 0.9895817 -0.9999288 0.9937444 0.9917499 -0.9999437 0.9947173 0.9934694 -0.9736726 0.9997689 0.9736758 -0.9736726 0.9997689 0.9736757 -0.9736725 0.9997689 0.9736756 -0.9736724 0.9997689 0.9736754 -0.9736723 0.9997689 0.9736752 -0.9736722 0.9997689 0.973675 -0.9736721 0.9997689 0.9736747 -0.9736719 0.9997689 0.9736743 -0.9736717 0.9997689 0.9736738 -0.9736715 0.9997689 0.9736732 -0.9736712 0.9997689 0.9736725 -0.973671 0.9997689 0.9736717 -0.9736708 0.9997689 0.9736708 -0.9736717 0.9997689 0.9736708 -0.9736729 0.9997689 0.9736708 -0.9736743 0.9997689 0.9736708 -0.9736762 0.9997689 0.9736708 -0.9736785 0.9997689 0.9736708 -0.9736815 0.9997689 0.9736708 -0.9736852 0.9997689 0.9736708 -0.9736899 0.9997689 0.9736708 -0.9736959 0.9997689 0.9736708 -0.9737034 0.9997689 0.9736708 -0.973713 0.9997689 0.9736708 -0.9737251 0.9997689 0.9736708 -0.9737404 0.9997689 0.9736708 -0.9737597 0.9997689 0.9736708 -0.9737842 0.9997689 0.9736708 -0.9738152 0.9997689 0.9736708 -0.9738544 0.9997689 0.9736708 -0.973904 0.9997689 0.9736708 -0.9739667 0.9997689 0.9736708 -0.974046 0.9997689 0.9736708 -0.9741464 0.9997689 0.9736708 -0.9742734 0.9997689 0.9736708 -0.9744341 0.9997689 0.9736708 -0.9746374 0.9997689 0.9736708 -0.9748946 0.9997689 0.9736708 -0.9752199 0.9997689 0.9736708 -0.9756316 0.9997689 0.9736708 -0.9761523 0.9997689 0.9736708 -0.9768112 0.9997689 0.9736708 -0.9776447 0.9997689 0.9736708 -0.9786991 0.9997689 0.9736708 -0.9800332 0.9997689 0.9736708 -0.981721 0.9997689 0.9736708 -0.9838562 0.9997689 0.9736708 -0.9865576 0.9997689 0.9736708 -0.9899752 0.9997689 0.9736708 -0.9942988 0.9997689 0.9736708 -0.9997689 0.9997689 0.9736708 -0.9998174 0.9954735 0.9790916 -0.9998557 0.9936853 0.9834122 -0.999886 0.9932874 0.9868501 -0.9999099 0.993613 0.9895817 -0.9999288 0.9942733 0.9917499 -0.9999437 0.9950482 0.9934694 -0.9790927 0.9998174 0.9790948 -0.9790927 0.9998174 0.9790947 -0.9790927 0.9998174 0.9790946 -0.9790926 0.9998174 0.9790945 -0.9790925 0.9998174 0.9790944 -0.9790925 0.9998174 0.9790942 -0.9790924 0.9998174 0.979094 -0.9790923 0.9998174 0.9790938 -0.9790921 0.9998174 0.9790935 -0.979092 0.9998174 0.9790931 -0.9790919 0.9998174 0.9790927 -0.9790917 0.9998174 0.9790922 -0.9790916 0.9998174 0.9790916 -0.9790922 0.9998174 0.9790916 -0.9790929 0.9998174 0.9790916 -0.9790938 0.9998174 0.9790916 -0.979095 0.9998174 0.9790916 -0.9790964 0.9998174 0.9790916 -0.9790983 0.9998174 0.9790916 -0.9791006 0.9998174 0.9790916 -0.9791036 0.9998174 0.9790916 -0.9791073 0.9998174 0.9790916 -0.9791121 0.9998174 0.9790916 -0.9791181 0.9998174 0.9790916 -0.9791257 0.9998174 0.9790916 -0.9791353 0.9998174 0.9790916 -0.9791474 0.9998174 0.9790916 -0.9791628 0.9998174 0.9790916 -0.9791822 0.9998174 0.9790916 -0.9792068 0.9998174 0.9790916 -0.9792379 0.9998174 0.9790916 -0.9792773 0.9998174 0.9790916 -0.9793271 0.9998174 0.9790916 -0.9793901 0.9998174 0.9790916 -0.9794699 0.9998174 0.9790916 -0.9795707 0.9998174 0.9790916 -0.9796983 0.9998174 0.9790916 -0.9798597 0.9998174 0.9790916 -0.980064 0.9998174 0.9790916 -0.9803224 0.9998174 0.9790916 -0.9806492 0.9998174 0.9790916 -0.9810628 0.9998174 0.9790916 -0.981586 0.9998174 0.9790916 -0.9822479 0.9998174 0.9790916 -0.9830853 0.9998174 0.9790916 -0.9841447 0.9998174 0.9790916 -0.985485 0.9998174 0.9790916 -0.9871807 0.9998174 0.9790916 -0.9893259 0.9998174 0.9790916 -0.9920399 0.9998174 0.9790916 -0.9954735 0.9998174 0.9790916 -0.9998174 0.9998174 0.9790916 -0.9998557 0.9964094 0.9834122 -0.999886 0.9949944 0.9868501 -0.9999099 0.994682 0.9895817 -0.9999288 0.9949424 0.9917499 -0.9999437 0.9954669 0.9934694 -0.9834129 0.9998557 0.9834142 -0.9834129 0.9998557 0.9834142 -0.9834129 0.9998557 0.9834141 -0.9834129 0.9998557 0.983414 -0.9834128 0.9998557 0.983414 -0.9834128 0.9998557 0.9834139 -0.9834127 0.9998557 0.9834137 -0.9834127 0.9998557 0.9834136 -0.9834126 0.9998557 0.9834134 -0.9834125 0.9998557 0.9834132 -0.9834124 0.9998557 0.9834129 -0.9834123 0.9998557 0.9834126 -0.9834122 0.9998557 0.9834122 -0.9834126 0.9998557 0.9834122 -0.983413 0.9998557 0.9834122 -0.9834136 0.9998557 0.9834122 -0.9834143 0.9998557 0.9834122 -0.9834152 0.9998557 0.9834122 -0.9834164 0.9998557 0.9834122 -0.9834179 0.9998557 0.9834122 -0.9834197 0.9998557 0.9834122 -0.9834221 0.9998557 0.9834122 -0.9834251 0.9998557 0.9834122 -0.9834288 0.9998557 0.9834122 -0.9834336 0.9998557 0.9834122 -0.9834396 0.9998557 0.9834122 -0.9834472 0.9998557 0.9834122 -0.9834569 0.9998557 0.9834122 -0.9834691 0.9998557 0.9834122 -0.9834845 0.9998557 0.9834122 -0.983504 0.9998557 0.9834122 -0.9835287 0.9998557 0.9834122 -0.9835599 0.9998557 0.9834122 -0.9835994 0.9998557 0.9834122 -0.9836494 0.9998557 0.9834122 -0.9837127 0.9998557 0.9834122 -0.9837927 0.9998557 0.9834122 -0.9838939 0.9998557 0.9834122 -0.984022 0.9998557 0.9834122 -0.984184 0.9998557 0.9834122 -0.984389 0.9998557 0.9834122 -0.9846484 0.9998557 0.9834122 -0.9849765 0.9998557 0.9834122 -0.9853915 0.9998557 0.9834122 -0.9859167 0.9998557 0.9834122 -0.986581 0.9998557 0.9834122 -0.9874216 0.9998557 0.9834122 -0.9884849 0.9998557 0.9834122 -0.9898302 0.9998557 0.9834122 -0.9915321 0.9998557 0.9834122 -0.9936853 0.9998557 0.9834122 -0.9964094 0.9998557 0.9834122 -0.9998557 0.9998557 0.9834122 -0.999886 0.9971539 0.9868501 -0.9999099 0.9960344 0.9895817 -0.9999288 0.9957889 0.9917499 -0.9999437 0.9959965 0.9934694 -0.9868505 0.999886 0.9868513 -0.9868505 0.999886 0.9868513 -0.9868505 0.999886 0.9868512 -0.9868505 0.999886 0.9868512 -0.9868504 0.999886 0.9868512 -0.9868504 0.999886 0.9868511 -0.9868504 0.999886 0.986851 -0.9868503 0.999886 0.9868509 -0.9868503 0.999886 0.9868508 -0.9868502 0.999886 0.9868507 -0.9868502 0.999886 0.9868505 -0.9868501 0.999886 0.9868503 -0.9868501 0.999886 0.9868501 -0.9868503 0.999886 0.9868501 -0.9868506 0.999886 0.9868501 -0.9868509 0.999886 0.9868501 -0.9868514 0.999886 0.9868501 -0.986852 0.999886 0.9868501 -0.9868527 0.999886 0.9868501 -0.9868536 0.999886 0.9868501 -0.9868548 0.999886 0.9868501 -0.9868562 0.999886 0.9868501 -0.9868581 0.999886 0.9868501 -0.9868605 0.999886 0.9868501 -0.9868634 0.999886 0.9868501 -0.9868672 0.999886 0.9868501 -0.986872 0.999886 0.9868501 -0.986878 0.999886 0.9868501 -0.9868857 0.999886 0.9868501 -0.9868953 0.999886 0.9868501 -0.9869076 0.999886 0.9868501 -0.986923 0.999886 0.9868501 -0.9869426 0.999886 0.9868501 -0.9869674 0.999886 0.9868501 -0.9869987 0.999886 0.9868501 -0.9870383 0.999886 0.9868501 -0.9870885 0.999886 0.9868501 -0.9871519 0.999886 0.9868501 -0.9872322 0.999886 0.9868501 -0.9873337 0.999886 0.9868501 -0.9874621 0.999886 0.9868501 -0.9876247 0.999886 0.9868501 -0.9878302 0.999886 0.9868501 -0.9880903 0.999886 0.9868501 -0.9884194 0.999886 0.9868501 -0.9888357 0.999886 0.9868501 -0.9893624 0.999886 0.9868501 -0.9900287 0.999886 0.9868501 -0.9908717 0.999886 0.9868501 -0.9919382 0.999886 0.9868501 -0.9932874 0.999886 0.9868501 -0.9949944 0.999886 0.9868501 -0.9971539 0.999886 0.9868501 -0.999886 0.999886 0.9868501 -0.9999099 0.9977453 0.9895817 -0.9999288 0.9968598 0.9917499 -0.9999437 0.9966666 0.9934694 -0.989582 0.9999099 0.9895825 -0.989582 0.9999099 0.9895825 -0.989582 0.9999099 0.9895825 -0.989582 0.9999099 0.9895824 -0.989582 0.9999099 0.9895824 -0.9895819 0.9999099 0.9895824 -0.9895819 0.9999099 0.9895823 -0.9895819 0.9999099 0.9895823 -0.9895819 0.9999099 0.9895822 -0.9895818 0.9999099 0.9895821 -0.9895818 0.9999099 0.989582 -0.9895818 0.9999099 0.9895819 -0.9895817 0.9999099 0.9895817 -0.9895819 0.9999099 0.9895817 -0.989582 0.9999099 0.9895817 -0.9895823 0.9999099 0.9895817 -0.9895826 0.9999099 0.9895817 -0.9895829 0.9999099 0.9895817 -0.9895834 0.9999099 0.9895817 -0.9895839 0.9999099 0.9895817 -0.9895847 0.9999099 0.9895817 -0.9895856 0.9999099 0.9895817 -0.9895868 0.9999099 0.9895817 -0.9895882 0.9999099 0.9895817 -0.9895901 0.9999099 0.9895817 -0.9895925 0.9999099 0.9895817 -0.9895955 0.9999099 0.9895817 -0.9895992 0.9999099 0.9895817 -0.989604 0.9999099 0.9895817 -0.9896101 0.9999099 0.9895817 -0.9896177 0.9999099 0.9895817 -0.9896274 0.9999099 0.9895817 -0.9896397 0.9999099 0.9895817 -0.9896552 0.9999099 0.9895817 -0.9896748 0.9999099 0.9895817 -0.9896996 0.9999099 0.9895817 -0.989731 0.9999099 0.9895817 -0.9897708 0.9999099 0.9895817 -0.989821 0.9999099 0.9895817 -0.9898846 0.9999099 0.9895817 -0.989965 0.9999099 0.9895817 -0.9900668 0.9999099 0.9895817 -0.9901956 0.9999099 0.9895817 -0.9903584 0.9999099 0.9895817 -0.9905645 0.9999099 0.9895817 -0.9908252 0.9999099 0.9895817 -0.991155 0.9999099 0.9895817 -0.9915723 0.9999099 0.9895817 -0.9921002 0.9999099 0.9895817 -0.9927681 0.9999099 0.9895817 -0.993613 0.9999099 0.9895817 -0.994682 0.9999099 0.9895817 -0.9960344 0.9999099 0.9895817 -0.9977453 0.9999099 0.9895817 -0.9999099 0.9999099 0.9895817 -0.9999288 0.9982147 0.9917499 -0.9999437 0.9975144 0.9934694 -0.9917501 0.9999288 0.9917504 -0.9917501 0.9999288 0.9917504 -0.9917501 0.9999288 0.9917504 -0.9917501 0.9999288 0.9917504 -0.9917501 0.9999288 0.9917503 -0.9917501 0.9999288 0.9917503 -0.99175 0.9999288 0.9917503 -0.99175 0.9999288 0.9917503 -0.99175 0.9999288 0.9917502 -0.99175 0.9999288 0.9917502 -0.99175 0.9999288 0.9917501 -0.9917499 0.9999288 0.99175 -0.9917499 0.9999288 0.9917499 -0.99175 0.9999288 0.9917499 -0.9917501 0.9999288 0.9917499 -0.9917503 0.9999288 0.9917499 -0.9917504 0.9999288 0.9917499 -0.9917507 0.9999288 0.9917499 -0.9917509 0.9999288 0.9917499 -0.9917513 0.9999288 0.9917499 -0.9917518 0.9999288 0.9917499 -0.9917523 0.9999288 0.9917499 -0.9917531 0.9999288 0.9917499 -0.991754 0.9999288 0.9917499 -0.9917552 0.9999288 0.9917499 -0.9917566 0.9999288 0.9917499 -0.9917585 0.9999288 0.9917499 -0.9917609 0.9999288 0.9917499 -0.9917639 0.9999288 0.9917499 -0.9917677 0.9999288 0.9917499 -0.9917725 0.9999288 0.9917499 -0.9917785 0.9999288 0.9917499 -0.9917862 0.9999288 0.9917499 -0.9917959 0.9999288 0.9917499 -0.9918082 0.9999288 0.9917499 -0.9918237 0.9999288 0.9917499 -0.9918434 0.9999288 0.9917499 -0.9918682 0.9999288 0.9917499 -0.9918997 0.9999288 0.9917499 -0.9919395 0.9999288 0.9917499 -0.9919898 0.9999288 0.9917499 -0.9920535 0.9999288 0.9917499 -0.9921341 0.9999288 0.9917499 -0.9922361 0.9999288 0.9917499 -0.9923651 0.9999288 0.9917499 -0.9925283 0.9999288 0.9917499 -0.9927347 0.9999288 0.9917499 -0.9929959 0.9999288 0.9917499 -0.9933263 0.9999288 0.9917499 -0.9937444 0.9999288 0.9917499 -0.9942733 0.9999288 0.9917499 -0.9949424 0.9999288 0.9917499 -0.9957889 0.9999288 0.9917499 -0.9968598 0.9999288 0.9917499 -0.9982147 0.9999288 0.9917499 -0.9999288 0.9999288 0.9917499 -0.9999437 0.9985869 0.9934694 -0.9934695 0.9999437 0.9934697 -0.9934695 0.9999437 0.9934697 -0.9934695 0.9999437 0.9934697 -0.9934695 0.9999437 0.9934697 -0.9934695 0.9999437 0.9934696 -0.9934695 0.9999437 0.9934696 -0.9934695 0.9999437 0.9934696 -0.9934694 0.9999437 0.9934696 -0.9934694 0.9999437 0.9934696 -0.9934694 0.9999437 0.9934695 -0.9934694 0.9999437 0.9934695 -0.9934694 0.9999437 0.9934694 -0.9934694 0.9999437 0.9934694 -0.9934694 0.9999437 0.9934694 -0.9934695 0.9999437 0.9934694 -0.9934696 0.9999437 0.9934694 -0.9934697 0.9999437 0.9934694 -0.9934698 0.9999437 0.9934694 -0.99347 0.9999437 0.9934694 -0.9934702 0.9999437 0.9934694 -0.9934705 0.9999437 0.9934694 -0.9934709 0.9999437 0.9934694 -0.9934713 0.9999437 0.9934694 -0.9934719 0.9999437 0.9934694 -0.9934727 0.9999437 0.9934694 -0.9934736 0.9999437 0.9934694 -0.9934748 0.9999437 0.9934694 -0.9934762 0.9999437 0.9934694 -0.9934781 0.9999437 0.9934694 -0.9934805 0.9999437 0.9934694 -0.9934835 0.9999437 0.9934694 -0.9934873 0.9999437 0.9934694 -0.9934921 0.9999437 0.9934694 -0.9934981 0.9999437 0.9934694 -0.9935058 0.9999437 0.9934694 -0.9935156 0.9999437 0.9934694 -0.9935279 0.9999437 0.9934694 -0.9935434 0.9999437 0.9934694 -0.9935631 0.9999437 0.9934694 -0.993588 0.9999437 0.9934694 -0.9936195 0.9999437 0.9934694 -0.9936594 0.9999437 0.9934694 -0.9937098 0.9999437 0.9934694 -0.9937736 0.9999437 0.9934694 -0.9938543 0.9999437 0.9934694 -0.9939564 0.9999437 0.9934694 -0.9940856 0.9999437 0.9934694 -0.994249 0.9999437 0.9934694 -0.9944557 0.9999437 0.9934694 -0.9947173 0.9999437 0.9934694 -0.9950482 0.9999437 0.9934694 -0.9954669 0.9999437 0.9934694 -0.9959965 0.9999437 0.9934694 -0.9966666 0.9999437 0.9934694 -0.9975144 0.9999437 0.9934694 -0.9985869 0.9999437 0.9934694 -0.9999437 0.9999437 0.9934694 -0.0000238 0.0000238 0.0396127 -0.0005417 0.0000238 0.0396127 -0.0011968 0.0000238 0.0396127 -0.0020256 0.0000238 0.0396127 -0.0030742 0.0000238 0.0396127 -0.0044007 0.0000238 0.0396127 -0.006079 0.0000238 0.0396127 -0.0082023 0.0000238 0.0396127 -0.0108885 0.0000238 0.0396127 -0.0142868 0.0000238 0.0396127 -0.0185862 0.0000238 0.0396127 -0.0240255 0.0000238 0.0396127 -0.0309069 0.0000238 0.0396127 -0.0396127 0.0000238 0.0396127 -0.0506267 0.0000238 0.0396127 -0.0645609 0.0000238 0.0396127 -0.0821895 0.0000238 0.0396127 -0.1044919 0.0000238 0.0396127 -0.1327073 0.0000238 0.0396127 -0.1684036 0.0000238 0.0396127 -0.2135639 0.0000238 0.0396127 -0.2706977 0.0000238 0.0396127 -0.3429792 0.0000238 0.0396127 -0.4344249 0.0000238 0.0396127 -0.5501155 0.0000238 0.0396127 -0.6964791 0.0000238 0.0396127 -0.8407292 0.0051514 0.0426726 -0.9033413 0.0279321 0.0589895 -0.9354466 0.0624569 0.0869288 -0.9545467 0.1059991 0.1247954 -0.9669269 0.1572498 0.1714232 -0.9754027 0.2151269 0.2256446 -0.9814251 0.2783684 0.2860552 -0.9858181 0.3454107 0.3509445 -0.9890841 0.4144197 0.4183444 -0.9915469 0.4834235 0.4861663 -0.993424 0.5504963 0.552386 -0.9948662 0.6139459 0.6152304 -0.9959813 0.6724572 0.6733195 -0.9968475 0.7251659 0.7257383 -0.997523 0.7716588 0.7720349 -0.9980513 0.8119154 0.8121604 -0.9984653 0.8462171 0.8463755 -0.9987905 0.8750477 0.8751494 -0.9990461 0.8990028 0.8990678 -0.9992474 0.9187175 0.9187589 -0.999406 0.9348153 0.9348415 -0.999531 0.9478754 0.947892 -0.9996296 0.958416 0.9584264 -0.9997074 0.9668873 0.9668939 -0.9997689 0.9736726 0.9736768 -0.9998174 0.9790927 0.9790953 -0.9998557 0.9834129 0.9834146 -0.999886 0.9868505 0.9868515 -0.9999099 0.989582 0.9895826 -0.9999288 0.9917501 0.9917505 -0.9999437 0.9934695 0.9934697 -0.0000238 0.0005417 0.0396127 -0.0000382 0.0000382 0.0391092 -0.0006933 0.0000382 0.0391092 -0.0015221 0.0000382 0.0391092 -0.0025707 0.0000382 0.0391092 -0.0038972 0.0000382 0.0391092 -0.0055755 0.0000382 0.0391092 -0.0076988 0.0000382 0.0391092 -0.0103849 0.0000382 0.0391092 -0.0137833 0.0000382 0.0391092 -0.0180827 0.0000382 0.0391092 -0.023522 0.0000382 0.0391092 -0.0304033 0.0000382 0.0391092 -0.0391092 0.0000382 0.0391092 -0.0501232 0.0000382 0.0391092 -0.0640574 0.0000382 0.0391092 -0.081686 0.0000382 0.0391092 -0.1039884 0.0000382 0.0391092 -0.1322038 0.0000382 0.0391092 -0.1679 0.0000382 0.0391092 -0.2130604 0.0000382 0.0391092 -0.2701941 0.0000382 0.0391092 -0.3424757 0.0000382 0.0391092 -0.4339214 0.0000382 0.0391092 -0.549612 0.0000382 0.0391092 -0.6959756 0.0000382 0.0391092 -0.8405071 0.0051286 0.0421719 -0.9032596 0.0278872 0.0585512 -0.9354101 0.0624063 0.0865673 -0.9545286 0.1059489 0.1245055 -0.9669173 0.1572031 0.171195 -0.9753975 0.2150852 0.2254677 -0.9814221 0.2783325 0.2859202 -0.9858163 0.3453807 0.350843 -0.9890831 0.4143955 0.4182694 -0.9915463 0.4834045 0.4861117 -0.9934236 0.5504818 0.552347 -0.994866 0.6139352 0.615203 -0.9959811 0.6724495 0.6733005 -0.9968474 0.7251605 0.7257254 -0.997523 0.7716551 0.7720263 -0.9980512 0.8119128 0.8121546 -0.9984653 0.8462154 0.8463717 -0.9987905 0.8750466 0.875147 -0.9990461 0.899002 0.8990662 -0.9992474 0.918717 0.9187579 -0.999406 0.9348149 0.9348408 -0.999531 0.9478752 0.9478916 -0.9996296 0.9584159 0.9584262 -0.9997074 0.9668872 0.9668937 -0.9997689 0.9736726 0.9736767 -0.9998174 0.9790927 0.9790953 -0.9998557 0.9834129 0.9834145 -0.999886 0.9868505 0.9868515 -0.9999099 0.989582 0.9895826 -0.9999288 0.9917501 0.9917505 -0.9999437 0.9934695 0.9934697 -0.0000238 0.0011968 0.0396127 -0.0000382 0.0006933 0.0391092 -0.0000611 0.0000611 0.038477 -0.0008899 0.0000611 0.038477 -0.0019385 0.0000611 0.038477 -0.003265 0.0000611 0.038477 -0.0049433 0.0000611 0.038477 -0.0070666 0.0000611 0.038477 -0.0097527 0.0000611 0.038477 -0.0131511 0.0000611 0.038477 -0.0174505 0.0000611 0.038477 -0.0228898 0.0000611 0.038477 -0.0297711 0.0000611 0.038477 -0.038477 0.0000611 0.038477 -0.049491 0.0000611 0.038477 -0.0634252 0.0000611 0.038477 -0.0810538 0.0000611 0.038477 -0.1033562 0.0000611 0.038477 -0.1315716 0.0000611 0.038477 -0.1672678 0.0000611 0.038477 -0.2124282 0.0000611 0.038477 -0.2695619 0.0000611 0.038477 -0.3418435 0.0000611 0.038477 -0.4332891 0.0000611 0.038477 -0.5489798 0.0000611 0.038477 -0.6953434 0.0000611 0.038477 -0.8402274 0.0051047 0.0415429 -0.9031567 0.0278347 0.0580005 -0.9353643 0.0623458 0.0861131 -0.9545059 0.1058883 0.1241413 -0.9669053 0.1571463 0.1709083 -0.9753908 0.2150342 0.2252456 -0.9814183 0.2782884 0.2857506 -0.9858141 0.3453439 0.3507156 -0.9890818 0.4143657 0.4181752 -0.9915455 0.4833811 0.4860432 -0.9934231 0.550464 0.5522981 -0.9948657 0.6139219 0.6151686 -0.9959809 0.6724399 0.6732768 -0.9968473 0.7251537 0.7257092 -0.9975229 0.7716504 0.7720154 -0.9980512 0.8119096 0.8121474 -0.9984653 0.8462132 0.8463669 -0.9987904 0.8750451 0.8751439 -0.9990461 0.8990011 0.8990642 -0.9992474 0.9187164 0.9187566 -0.999406 0.9348146 0.93484 -0.999531 0.947875 0.947891 -0.9996296 0.9584157 0.9584258 -0.9997074 0.9668871 0.9668935 -0.9997689 0.9736725 0.9736765 -0.9998174 0.9790927 0.9790952 -0.9998557 0.9834129 0.9834145 -0.999886 0.9868505 0.9868515 -0.9999099 0.989582 0.9895826 -0.9999288 0.9917501 0.9917505 -0.9999437 0.9934695 0.9934697 -0.0000238 0.0020256 0.0396127 -0.0000382 0.0015221 0.0391092 -0.0000611 0.0008899 0.038477 -0.0000978 0.0000978 0.0376849 -0.0011463 0.0000978 0.0376849 -0.0024729 0.0000978 0.0376849 -0.0041512 0.0000978 0.0376849 -0.0062744 0.0000978 0.0376849 -0.0089606 0.0000978 0.0376849 -0.012359 0.0000978 0.0376849 -0.0166583 0.0000978 0.0376849 -0.0220976 0.0000978 0.0376849 -0.028979 0.0000978 0.0376849 -0.0376849 0.0000978 0.0376849 -0.0486989 0.0000978 0.0376849 -0.0626331 0.0000978 0.0376849 -0.0802616 0.0000978 0.0376849 -0.102564 0.0000978 0.0376849 -0.1307795 0.0000978 0.0376849 -0.1664757 0.0000978 0.0376849 -0.2116361 0.0000978 0.0376849 -0.2687698 0.0000978 0.0376849 -0.3410514 0.0000978 0.0376849 -0.432497 0.0000978 0.0376849 -0.5481876 0.0000978 0.0376849 -0.6945513 0.0000978 0.0376849 -0.8398756 0.0050826 0.0407541 -0.9030276 0.0277752 0.0573098 -0.9353068 0.0622749 0.0855434 -0.9544774 0.1058162 0.1236845 -0.9668902 0.1570779 0.1705489 -0.9753825 0.2149725 0.2249671 -0.9814136 0.2782347 0.2855381 -0.9858113 0.3452987 0.3505559 -0.9890801 0.414329 0.4180571 -0.9915446 0.4833522 0.4859574 -0.9934225 0.5504419 0.5522367 -0.9948653 0.6139056 0.6151255 -0.9959807 0.672428 0.6732469 -0.9968472 0.7251454 0.7256889 -0.9975228 0.7716446 0.7720017 -0.9980511 0.8119057 0.8121383 -0.9984653 0.8462106 0.846361 -0.9987904 0.8750434 0.87514 -0.9990461 0.899 0.8990617 -0.9992474 0.9187157 0.918755 -0.999406 0.9348141 0.934839 -0.999531 0.9478746 0.9478904 -0.9996296 0.9584155 0.9584254 -0.9997074 0.966887 0.9668933 -0.9997689 0.9736724 0.9736764 -0.9998174 0.9790926 0.9790951 -0.9998557 0.9834129 0.9834144 -0.999886 0.9868505 0.9868514 -0.9999099 0.989582 0.9895826 -0.9999288 0.9917501 0.9917505 -0.9999437 0.9934695 0.9934697 -0.0000238 0.0030742 0.0396127 -0.0000382 0.0025707 0.0391092 -0.0000611 0.0019385 0.038477 -0.0000978 0.0011463 0.0376849 -0.0001565 0.0001565 0.036695 -0.001483 0.0001565 0.036695 -0.0031613 0.0001565 0.036695 -0.0052846 0.0001565 0.036695 -0.0079707 0.0001565 0.036695 -0.0113691 0.0001565 0.036695 -0.0156685 0.0001565 0.036695 -0.0211078 0.0001565 0.036695 -0.0279891 0.0001565 0.036695 -0.036695 0.0001565 0.036695 -0.047709 0.0001565 0.036695 -0.0616432 0.0001565 0.036695 -0.0792718 0.0001565 0.036695 -0.1015742 0.0001565 0.036695 -0.1297896 0.0001565 0.036695 -0.1654858 0.0001565 0.036695 -0.2106462 0.0001565 0.036695 -0.2677799 0.0001565 0.036695 -0.3400615 0.0001565 0.036695 -0.4315072 0.0001565 0.036695 -0.5471978 0.0001565 0.036695 -0.6935614 0.0001565 0.036695 -0.8394338 0.0050676 0.0397676 -0.9028657 0.0277111 0.0564456 -0.9352348 0.0621943 0.0848308 -0.9544418 0.1057322 0.1231132 -0.9668714 0.1569971 0.1700994 -0.9753721 0.2148987 0.2246189 -0.9814076 0.2781701 0.2852724 -0.9858079 0.3452442 0.3503562 -0.9890781 0.4142845 0.4179095 -0.9915433 0.4833171 0.4858501 -0.9934218 0.550415 0.55216 -0.9948649 0.6138855 0.6150716 -0.9959804 0.6724135 0.6732097 -0.996847 0.7251351 0.7256635 -0.9975227 0.7716375 0.7719847 -0.9980511 0.8119009 0.812127 -0.9984652 0.8462073 0.8463535 -0.9987904 0.8750412 0.8751352 -0.9990461 0.8989986 0.8990586 -0.9992474 0.9187148 0.918753 -0.999406 0.9348135 0.9348377 -0.999531 0.9478743 0.9478896 -0.9996296 0.9584153 0.9584249 -0.9997074 0.9668869 0.9668929 -0.9997689 0.9736723 0.9736762 -0.9998174 0.9790925 0.9790949 -0.9998557 0.9834128 0.9834143 -0.999886 0.9868504 0.9868514 -0.9999099 0.989582 0.9895826 -0.9999288 0.9917501 0.9917504 -0.9999437 0.9934695 0.9934697 -0.0000238 0.0044007 0.0396127 -0.0000382 0.0038972 0.0391092 -0.0000611 0.003265 0.038477 -0.0000978 0.0024729 0.0376849 -0.0001565 0.001483 0.036695 -0.0002504 0.0002504 0.0354624 -0.0019287 0.0002504 0.0354624 -0.004052 0.0002504 0.0354624 -0.0067381 0.0002504 0.0354624 -0.0101365 0.0002504 0.0354624 -0.0144359 0.0002504 0.0354624 -0.0198752 0.0002504 0.0354624 -0.0267565 0.0002504 0.0354624 -0.0354624 0.0002504 0.0354624 -0.0464764 0.0002504 0.0354624 -0.0604106 0.0002504 0.0354624 -0.0780392 0.0002504 0.0354624 -0.1003416 0.0002504 0.0354624 -0.128557 0.0002504 0.0354624 -0.1642532 0.0002504 0.0354624 -0.2094136 0.0002504 0.0354624 -0.2665473 0.0002504 0.0354624 -0.3388289 0.0002504 0.0354624 -0.4302746 0.0002504 0.0354624 -0.5459652 0.0002504 0.0354624 -0.6923288 0.0002504 0.0354624 -0.8388802 0.0050694 0.0385378 -0.9026634 0.0276479 0.0553678 -0.9351449 0.0621069 0.0839421 -0.9543974 0.1056375 0.122401 -0.9668479 0.156904 0.169539 -0.9753591 0.2148124 0.2241849 -0.9814002 0.2780936 0.2849413 -0.9858036 0.3451791 0.3501075 -0.9890755 0.4142311 0.4177256 -0.9915418 0.4832747 0.4857164 -0.9934209 0.5503825 0.5520645 -0.9948643 0.6138613 0.6150045 -0.9959801 0.6723959 0.6731633 -0.9968468 0.7251226 0.7256319 -0.9975226 0.7716288 0.7719634 -0.998051 0.8118949 0.8121129 -0.9984652 0.8462034 0.8463443 -0.9987904 0.8750386 0.8751292 -0.9990461 0.8989969 0.8990547 -0.9992474 0.9187137 0.9187505 -0.9994059 0.9348128 0.9348361 -0.999531 0.9478738 0.9478886 -0.9996296 0.958415 0.9584243 -0.9997074 0.9668867 0.9668925 -0.9997689 0.9736722 0.9736759 -0.9998174 0.9790925 0.9790948 -0.9998557 0.9834128 0.9834142 -0.999886 0.9868504 0.9868513 -0.9999099 0.9895819 0.9895825 -0.9999288 0.9917501 0.9917504 -0.9999437 0.9934695 0.9934697 -0.0000238 0.006079 0.0396127 -0.0000382 0.0055755 0.0391092 -0.0000611 0.0049433 0.038477 -0.0000978 0.0041512 0.0376849 -0.0001565 0.0031613 0.036695 -0.0002504 0.0019287 0.0354624 -0.0004008 0.0004008 0.0339345 -0.0025241 0.0004008 0.0339345 -0.0052103 0.0004008 0.0339345 -0.0086086 0.0004008 0.0339345 -0.012908 0.0004008 0.0339345 -0.0183473 0.0004008 0.0339345 -0.0252287 0.0004008 0.0339345 -0.0339345 0.0004008 0.0339345 -0.0449485 0.0004008 0.0339345 -0.0588827 0.0004008 0.0339345 -0.0765113 0.0004008 0.0339345 -0.0988137 0.0004008 0.0339345 -0.1270291 0.0004008 0.0339345 -0.1627254 0.0004008 0.0339345 -0.2078857 0.0004008 0.0339345 -0.2650195 0.0004008 0.0339345 -0.337301 0.0004008 0.0339345 -0.4287467 0.0004008 0.0339345 -0.5444373 0.0004008 0.0339345 -0.6908009 0.0004008 0.0339345 -0.8381886 0.0051048 0.0370113 -0.9024114 0.0275966 0.0540292 -0.9350332 0.0620199 0.0828386 -0.9543421 0.1055364 0.1215168 -0.9668187 0.1568008 0.1688437 -0.975343 0.2147144 0.2236464 -0.9813911 0.2780055 0.2845305 -0.9857982 0.3451032 0.3497989 -0.9890723 0.4141683 0.4174976 -0.9915399 0.4832246 0.4855507 -0.9934197 0.5503438 0.5519461 -0.9948636 0.6138323 0.6149212 -0.9959797 0.6723748 0.6731057 -0.9968465 0.7251076 0.7255927 -0.9975224 0.7716184 0.7719371 -0.9980509 0.8118878 0.8120954 -0.9984651 0.8461986 0.8463328 -0.9987903 0.8750355 0.8751217 -0.9990461 0.8989948 0.8990499 -0.9992473 0.9187123 0.9187474 -0.9994059 0.9348119 0.9348341 -0.999531 0.9478733 0.9478873 -0.9996296 0.9584146 0.9584235 -0.9997074 0.9668865 0.966892 -0.9997689 0.9736721 0.9736756 -0.9998174 0.9790924 0.9790946 -0.9998557 0.9834127 0.9834141 -0.999886 0.9868504 0.9868512 -0.9999099 0.9895819 0.9895825 -0.9999288 0.99175 0.9917504 -0.9999437 0.9934695 0.9934697 -0.0000238 0.0082023 0.0396127 -0.0000382 0.0076988 0.0391092 -0.0000611 0.0070666 0.038477 -0.0000978 0.0062744 0.0376849 -0.0001565 0.0052846 0.036695 -0.0002504 0.004052 0.0354624 -0.0004008 0.0025241 0.0339345 -0.0006416 0.0006416 0.032052 -0.0033277 0.0006416 0.032052 -0.0067261 0.0006416 0.032052 -0.0110255 0.0006416 0.032052 -0.0164648 0.0006416 0.032052 -0.0233461 0.0006416 0.032052 -0.032052 0.0006416 0.032052 -0.043066 0.0006416 0.032052 -0.0570002 0.0006416 0.032052 -0.0746288 0.0006416 0.032052 -0.0969312 0.0006416 0.032052 -0.1251466 0.0006416 0.032052 -0.1608428 0.0006416 0.032052 -0.2060032 0.0006416 0.032052 -0.2631369 0.0006416 0.032052 -0.3354185 0.0006416 0.032052 -0.4268641 0.0006416 0.032052 -0.5425548 0.0006416 0.032052 -0.6889184 0.0006416 0.032052 -0.8373283 0.0052028 0.0351273 -0.9020992 0.0275778 0.052376 -0.9348949 0.0619473 0.0814759 -0.9542739 0.1054384 0.1204253 -0.9667827 0.1566936 0.1679855 -0.9753231 0.2146085 0.2229821 -0.9813797 0.2779077 0.2840238 -0.9857916 0.3450175 0.3494184 -0.9890684 0.4140964 0.4172164 -0.9915376 0.4831666 0.4853463 -0.9934183 0.5502987 0.5518001 -0.9948628 0.6137984 0.6148187 -0.9959791 0.67235 0.6730348 -0.9968462 0.7250899 0.7255444 -0.9975222 0.7716061 0.7719047 -0.9980508 0.8118794 0.8120739 -0.998465 0.8461929 0.8463187 -0.9987903 0.8750317 0.8751125 -0.999046 0.8989923 0.8990439 -0.9992473 0.9187107 0.9187435 -0.9994059 0.9348109 0.9348317 -0.999531 0.9478726 0.9478858 -0.9996296 0.9584142 0.9584225 -0.9997074 0.9668862 0.9668914 -0.9997689 0.9736719 0.9736752 -0.9998174 0.9790923 0.9790943 -0.9998557 0.9834127 0.9834139 -0.999886 0.9868503 0.9868511 -0.9999099 0.9895819 0.9895824 -0.9999288 0.99175 0.9917503 -0.9999437 0.9934694 0.9934696 -0.0000238 0.0108885 0.0396127 -0.0000382 0.0103849 0.0391092 -0.0000611 0.0097527 0.038477 -0.0000978 0.0089606 0.0376849 -0.0001565 0.0079707 0.036695 -0.0002504 0.0067381 0.0354624 -0.0004008 0.0052103 0.0339345 -0.0006416 0.0033277 0.032052 -0.0010268 0.0010268 0.0297511 -0.0044252 0.0010268 0.0297511 -0.0087246 0.0010268 0.0297511 -0.0141639 0.0010268 0.0297511 -0.0210452 0.0010268 0.0297511 -0.0297511 0.0010268 0.0297511 -0.0407651 0.0010268 0.0297511 -0.0546993 0.0010268 0.0297511 -0.0723279 0.0010268 0.0297511 -0.0946303 0.0010268 0.0297511 -0.1228457 0.0010268 0.0297511 -0.1585419 0.0010268 0.0297511 -0.2037023 0.0010268 0.0297511 -0.260836 0.0010268 0.0297511 -0.3331176 0.0010268 0.0297511 -0.4245633 0.0010268 0.0297511 -0.5402539 0.0010268 0.0297511 -0.6866175 0.0010268 0.0297511 -0.8362644 0.0054121 0.0328199 -0.9017148 0.0276281 0.0503493 -0.9347252 0.061916 0.0798059 -0.9541902 0.1053624 0.1190883 -0.9667385 0.1565954 0.1669347 -0.9752987 0.2145034 0.2221689 -0.9813659 0.2778058 0.2834038 -0.9857835 0.3449254 0.3489529 -0.9890637 0.4140176 0.4168724 -0.9915347 0.4831021 0.4850964 -0.9934166 0.550248 0.5516215 -0.9948617 0.6137599 0.6146932 -0.9959785 0.6723217 0.6729481 -0.9968458 0.7250697 0.7254853 -0.997522 0.7715919 0.771865 -0.9980506 0.8118697 0.8120476 -0.9984649 0.8461864 0.8463014 -0.9987902 0.8750274 0.8751012 -0.999046 0.8989895 0.8990367 -0.9992473 0.9187089 0.9187389 -0.9994059 0.9348097 0.9348287 -0.999531 0.9478718 0.9478839 -0.9996296 0.9584137 0.9584213 -0.9997074 0.9668859 0.9668907 -0.9997689 0.9736717 0.9736747 -0.9998174 0.9790921 0.979094 -0.9998557 0.9834126 0.9834138 -0.999886 0.9868503 0.986851 -0.9999099 0.9895819 0.9895823 -0.9999288 0.99175 0.9917503 -0.9999437 0.9934694 0.9934696 -0.0000238 0.0142868 0.0396127 -0.0000382 0.0137833 0.0391092 -0.0000611 0.0131511 0.038477 -0.0000978 0.012359 0.0376849 -0.0001565 0.0113691 0.036695 -0.0002504 0.0101365 0.0354624 -0.0004008 0.0086086 0.0339345 -0.0006416 0.0067261 0.032052 -0.0010268 0.0044252 0.0297511 -0.0016435 0.0016435 0.0269694 -0.0059429 0.0016435 0.0269694 -0.0113822 0.0016435 0.0269694 -0.0182636 0.0016435 0.0269694 -0.0269694 0.0016435 0.0269694 -0.0379834 0.0016435 0.0269694 -0.0519176 0.0016435 0.0269694 -0.0695462 0.0016435 0.0269694 -0.0918486 0.0016435 0.0269694 -0.120064 0.0016435 0.0269694 -0.1557603 0.0016435 0.0269694 -0.2009206 0.0016435 0.0269694 -0.2580543 0.0016435 0.0269694 -0.3303359 0.0016435 0.0269694 -0.4217816 0.0016435 0.0269694 -0.5374722 0.0016435 0.0269694 -0.6838358 0.0016435 0.0269694 -0.8349593 0.0058134 0.0300235 -0.9012461 0.0278105 0.0478904 -0.9345187 0.0619734 0.0777803 -0.9540886 0.1053433 0.1174673 -0.966685 0.1565315 0.1656615 -0.9752692 0.2144168 0.221184 -0.9813491 0.2777122 0.2826531 -0.9857738 0.3448353 0.3483894 -0.9890579 0.4139373 0.4164562 -0.9915312 0.4830346 0.484794 -0.9934145 0.5501939 0.5514055 -0.9948604 0.6137183 0.6145415 -0.9959777 0.6722907 0.6728432 -0.9968453 0.7250473 0.7254139 -0.9975217 0.7715762 0.771817 -0.9980504 0.8118589 0.8120157 -0.9984648 0.8461791 0.8462805 -0.9987902 0.8750225 0.8750876 -0.9990459 0.8989863 0.8990279 -0.9992473 0.9187068 0.9187332 -0.9994059 0.9348083 0.9348251 -0.9995309 0.947871 0.9478816 -0.9996296 0.9584132 0.9584198 -0.9997074 0.9668855 0.9668897 -0.9997689 0.9736715 0.9736741 -0.9998174 0.979092 0.9790937 -0.9998557 0.9834125 0.9834135 -0.999886 0.9868502 0.9868509 -0.9999099 0.9895818 0.9895822 -0.9999288 0.99175 0.9917502 -0.9999437 0.9934694 0.9934696 -0.0000238 0.0185862 0.0396127 -0.0000382 0.0180827 0.0391092 -0.0000611 0.0174505 0.038477 -0.0000978 0.0166583 0.0376849 -0.0001565 0.0156685 0.036695 -0.0002504 0.0144359 0.0354624 -0.0004008 0.012908 0.0339345 -0.0006416 0.0110255 0.032052 -0.0010268 0.0087246 0.0297511 -0.0016435 0.0059429 0.0269694 -0.0026305 0.0026305 0.023657 -0.0080698 0.0026305 0.023657 -0.0149512 0.0026305 0.023657 -0.023657 0.0026305 0.023657 -0.0346711 0.0026305 0.023657 -0.0486053 0.0026305 0.023657 -0.0662338 0.0026305 0.023657 -0.0885362 0.0026305 0.023657 -0.1167517 0.0026305 0.023657 -0.1524479 0.0026305 0.023657 -0.1976083 0.0026305 0.023657 -0.254742 0.0026305 0.023657 -0.3270236 0.0026305 0.023657 -0.4184692 0.0026305 0.023657 -0.5341598 0.0026305 0.023657 -0.6805235 0.0026305 0.023657 -0.8333779 0.0065402 0.0266842 -0.900682 0.0282324 0.0449499 -0.9342712 0.062202 0.0753587 -0.9539671 0.1054431 0.1155307 -0.9666211 0.1565473 0.1641411 -0.975234 0.2143816 0.2200085 -0.9813291 0.2776503 0.2817576 -0.9857621 0.3447636 0.3477174 -0.989051 0.4138668 0.4159599 -0.9915271 0.4829718 0.4844335 -0.993412 0.5501416 0.5511481 -0.9948589 0.6136769 0.6143607 -0.9959768 0.6722594 0.6727182 -0.9968448 0.7250244 0.7253288 -0.9975213 0.7715599 0.7717599 -0.9980502 0.8118476 0.8119778 -0.9984647 0.8461714 0.8462556 -0.9987901 0.8750173 0.8750714 -0.9990459 0.8989829 0.8990174 -0.9992472 0.9187045 0.9187265 -0.9994059 0.9348069 0.9348208 -0.9995309 0.94787 0.9478789 -0.9996296 0.9584126 0.9584181 -0.9997074 0.9668852 0.9668887 -0.9997689 0.9736712 0.9736734 -0.9998174 0.9790919 0.9790932 -0.9998557 0.9834124 0.9834133 -0.999886 0.9868502 0.9868507 -0.9999099 0.9895818 0.9895821 -0.9999288 0.99175 0.9917502 -0.9999437 0.9934694 0.9934695 -0.0000238 0.0240255 0.0396127 -0.0000382 0.023522 0.0391092 -0.0000611 0.0228898 0.038477 -0.0000978 0.0220976 0.0376849 -0.0001565 0.0211078 0.036695 -0.0002504 0.0198752 0.0354624 -0.0004008 0.0183473 0.0339345 -0.0006416 0.0164648 0.032052 -0.0010268 0.0141639 0.0297511 -0.0016435 0.0113822 0.0269694 -0.0026305 0.0080698 0.023657 -0.0042103 0.0042103 0.0197975 -0.0110917 0.0042103 0.0197975 -0.0197975 0.0042103 0.0197975 -0.0308116 0.0042103 0.0197975 -0.0447458 0.0042103 0.0197975 -0.0623743 0.0042103 0.0197975 -0.0846767 0.0042103 0.0197975 -0.1128922 0.0042103 0.0197975 -0.1485884 0.0042103 0.0197975 -0.1937488 0.0042103 0.0197975 -0.2508825 0.0042103 0.0197975 -0.3231641 0.0042103 0.0197975 -0.4146097 0.0042103 0.0197975 -0.5303003 0.0042103 0.0197975 -0.676664 0.0042103 0.0197975 -0.8314967 0.0078103 0.0227807 -0.9000167 0.0290732 0.0415064 -0.9339805 0.062742 0.0725241 -0.9538247 0.1057683 0.1132654 -0.9665463 0.1567226 0.1623639 -0.9751928 0.2144566 0.2186353 -0.9813057 0.2776626 0.2807118 -0.9857485 0.3447407 0.346933 -0.989043 0.4138277 0.4153808 -0.9915223 0.4829286 0.484013 -0.9934091 0.5501012 0.5508478 -0.9948571 0.6136427 0.6141499 -0.9959757 0.6722322 0.6725725 -0.9968441 0.7250039 0.7252297 -0.9975209 0.7715449 0.7716932 -0.99805 0.811837 0.8119336 -0.9984645 0.8461641 0.8462265 -0.99879 0.8750124 0.8750525 -0.9990458 0.8989796 0.8990052 -0.9992472 0.9187024 0.9187187 -0.9994059 0.9348055 0.9348158 -0.9995309 0.9478691 0.9478757 -0.9996296 0.958412 0.9584161 -0.9997074 0.9668848 0.9668874 -0.9997689 0.973671 0.9736726 -0.9998174 0.9790917 0.9790927 -0.9998557 0.9834123 0.9834129 -0.999886 0.9868501 0.9868505 -0.9999099 0.9895818 0.989582 -0.9999288 0.9917499 0.9917501 -0.9999437 0.9934694 0.9934695 -0.0000238 0.0309069 0.0396127 -0.0000382 0.0304033 0.0391092 -0.0000611 0.0297711 0.038477 -0.0000978 0.028979 0.0376849 -0.0001565 0.0279891 0.036695 -0.0002504 0.0267565 0.0354624 -0.0004008 0.0252287 0.0339345 -0.0006416 0.0233461 0.032052 -0.0010268 0.0210452 0.0297511 -0.0016435 0.0182636 0.0269694 -0.0026305 0.0149512 0.023657 -0.0042103 0.0110917 0.0197975 -0.0067388 0.0067388 0.0154447 -0.0154447 0.0067388 0.0154447 -0.0264587 0.0067388 0.0154447 -0.0403929 0.0067388 0.0154447 -0.0580214 0.0067388 0.0154447 -0.0803239 0.0067388 0.0154447 -0.1085393 0.0067388 0.0154447 -0.1442355 0.0067388 0.0154447 -0.1893959 0.0067388 0.0154447 -0.2465296 0.0067388 0.0154447 -0.3188112 0.0067388 0.0154447 -0.4102568 0.0067388 0.0154447 -0.5259474 0.0067388 0.0154447 -0.6723111 0.0067388 0.0154447 -0.8293233 0.0099781 0.0183626 -0.8992555 0.0306306 0.0376003 -0.9336494 0.0638283 0.0693101 -0.953663 0.1064997 0.1106989 -0.9664615 0.1571937 0.1603521 -0.9751462 0.2147432 0.2170817 -0.9812792 0.2778236 0.2795295 -0.9857332 0.3448204 0.3460466 -0.9890339 0.4138582 0.4147267 -0.9915169 0.4829319 0.4835382 -0.9934058 0.5500915 0.5505089 -0.9948551 0.6136284 0.6139119 -0.9959745 0.672218 0.6724081 -0.9968433 0.7249916 0.7251177 -0.9975204 0.7715352 0.7716181 -0.9980497 0.8118298 0.8118837 -0.9984643 0.8461589 0.8461938 -0.9987899 0.8750088 0.8750312 -0.9990458 0.8989771 0.8989915 -0.9992472 0.9187008 0.9187099 -0.9994058 0.9348044 0.9348102 -0.9995309 0.9478684 0.9478721 -0.9996296 0.9584115 0.9584138 -0.9997074 0.9668845 0.9668859 -0.9997689 0.9736708 0.9736717 -0.9998174 0.9790916 0.9790922 -0.9998557 0.9834122 0.9834126 -0.999886 0.9868501 0.9868503 -0.9999099 0.9895817 0.9895819 -0.9999288 0.9917499 0.99175 -0.9999437 0.9934694 0.9934694 -0.0000238 0.0396127 0.0396127 -0.0000382 0.0391092 0.0391092 -0.0000611 0.038477 0.038477 -0.0000978 0.0376849 0.0376849 -0.0001565 0.036695 0.036695 -0.0002504 0.0354624 0.0354624 -0.0004008 0.0339345 0.0339345 -0.0006416 0.032052 0.032052 -0.0010268 0.0297511 0.0297511 -0.0016435 0.0269694 0.0269694 -0.0026305 0.023657 0.023657 -0.0042103 0.0197975 0.0197975 -0.0067388 0.0154447 0.0154447 -0.0107859 0.0107859 0.0107859 -0.0217999 0.0107859 0.0107859 -0.0357341 0.0107859 0.0107859 -0.0533626 0.0107859 0.0107859 -0.075665 0.0107859 0.0107859 -0.1038805 0.0107859 0.0107859 -0.1395767 0.0107859 0.0107859 -0.1847371 0.0107859 0.0107859 -0.2418708 0.0107859 0.0107859 -0.3141524 0.0107859 0.0107859 -0.405598 0.0107859 0.0107859 -0.5212886 0.0107859 0.0107859 -0.6676523 0.0107859 0.0107859 -0.8269342 0.0136166 0.0136166 -0.8984278 0.0333932 0.0333932 -0.9332914 0.0658501 0.0658501 -0.9534887 0.1079385 0.1079385 -0.9663702 0.15819 0.15819 -0.9750962 0.2154135 0.2154135 -0.9812508 0.2782606 0.2782606 -0.9857167 0.3450957 0.3450957 -0.9890241 0.4140252 0.4140252 -0.991511 0.4830292 0.4830292 -0.9934023 0.5501456 0.5501456 -0.994853 0.6136569 0.6136569 -0.9959732 0.672232 0.672232 -0.9968425 0.7249978 0.7249978 -0.9975199 0.7715376 0.7715376 -0.9980494 0.8118303 0.8118303 -0.9984642 0.8461587 0.8461587 -0.9987897 0.8750084 0.8750084 -0.9990457 0.8989767 0.8989767 -0.9992471 0.9187004 0.9187004 -0.9994058 0.9348042 0.9348042 -0.9995309 0.9478683 0.9478683 -0.9996295 0.9584114 0.9584114 -0.9997074 0.9668844 0.9668844 -0.9997689 0.9736708 0.9736708 -0.9998174 0.9790916 0.9790916 -0.9998557 0.9834122 0.9834122 -0.999886 0.98685 0.98685 -0.9999099 0.9895817 0.9895817 -0.9999288 0.9917499 0.9917499 -0.9999437 0.9934694 0.9934694 -0.0000238 0.0506267 0.0396127 -0.0000382 0.0501232 0.0391092 -0.0000611 0.049491 0.038477 -0.0000978 0.0486989 0.0376849 -0.0001565 0.047709 0.036695 -0.0002504 0.0464764 0.0354624 -0.0004008 0.0449485 0.0339345 -0.0006416 0.043066 0.032052 -0.0010268 0.0407651 0.0297511 -0.0016435 0.0379834 0.0269694 -0.0026305 0.0346711 0.023657 -0.0042103 0.0308116 0.0197975 -0.0067388 0.0264587 0.0154447 -0.0107859 0.0217999 0.0107859 -0.0217999 0.0217999 0.0107859 -0.0357341 0.0217999 0.0107859 -0.0533626 0.0217999 0.0107859 -0.075665 0.0217999 0.0107859 -0.1038805 0.0217999 0.0107859 -0.1395767 0.0217999 0.0107859 -0.1847371 0.0217999 0.0107859 -0.2418708 0.0217999 0.0107859 -0.3141524 0.0217999 0.0107859 -0.405598 0.0217999 0.0107859 -0.5212886 0.0217999 0.0107859 -0.6676523 0.0217999 0.0107859 -0.8269342 0.024255 0.0136166 -0.8984278 0.0422453 0.0333932 -0.9332914 0.0728103 0.0658501 -0.9534887 0.1132674 0.1079385 -0.9663702 0.1621961 0.15819 -0.9750962 0.2183784 0.2154135 -0.9812508 0.2804226 0.2782606 -0.9857167 0.3466492 0.3450957 -0.9890241 0.4151253 0.4140252 -0.991511 0.4837969 0.4830292 -0.9934023 0.550674 0.5501456 -0.994853 0.6140158 0.6136569 -0.9959732 0.6724727 0.672232 -0.9968425 0.7251575 0.7249978 -0.9975199 0.7716425 0.7715376 -0.9980494 0.8118986 0.8118303 -0.9984642 0.8462029 0.8461587 -0.9987897 0.8750368 0.8750084 -0.9990457 0.8989948 0.8989767 -0.9992471 0.9187119 0.9187004 -0.9994058 0.9348115 0.9348042 -0.9995309 0.9478729 0.9478683 -0.9996295 0.9584143 0.9584114 -0.9997074 0.9668862 0.9668844 -0.9997689 0.9736719 0.9736708 -0.9998174 0.9790923 0.9790916 -0.9998557 0.9834127 0.9834122 -0.999886 0.9868503 0.98685 -0.9999099 0.9895819 0.9895817 -0.9999288 0.99175 0.9917499 -0.9999437 0.9934694 0.9934694 -0.0000238 0.0645609 0.0396127 -0.0000382 0.0640574 0.0391092 -0.0000611 0.0634252 0.038477 -0.0000978 0.0626331 0.0376849 -0.0001565 0.0616432 0.036695 -0.0002504 0.0604106 0.0354624 -0.0004008 0.0588827 0.0339345 -0.0006416 0.0570002 0.032052 -0.0010268 0.0546993 0.0297511 -0.0016435 0.0519176 0.0269694 -0.0026305 0.0486053 0.023657 -0.0042103 0.0447458 0.0197975 -0.0067388 0.0403929 0.0154447 -0.0107859 0.0357341 0.0107859 -0.0217999 0.0357341 0.0107859 -0.0357341 0.0357341 0.0107859 -0.0533626 0.0357341 0.0107859 -0.075665 0.0357341 0.0107859 -0.1038805 0.0357341 0.0107859 -0.1395767 0.0357341 0.0107859 -0.1847371 0.0357341 0.0107859 -0.2418708 0.0357341 0.0107859 -0.3141524 0.0357341 0.0107859 -0.405598 0.0357341 0.0107859 -0.5212886 0.0357341 0.0107859 -0.6676523 0.0357341 0.0107859 -0.8269342 0.037714 0.0136166 -0.8984278 0.0534444 0.0333932 -0.9332914 0.0816158 0.0658501 -0.9534887 0.1200092 0.1079385 -0.9663702 0.1672642 0.15819 -0.9750962 0.2221293 0.2154135 -0.9812508 0.2831577 0.2782606 -0.9857167 0.3486146 0.3450957 -0.9890241 0.416517 0.4140252 -0.991511 0.4847683 0.4830292 -0.9934023 0.5513425 0.5501456 -0.994853 0.6144698 0.6136569 -0.9959732 0.6727772 0.672232 -0.9968425 0.7253595 0.7249978 -0.9975199 0.7717751 0.7715376 -0.9980494 0.811985 0.8118303 -0.9984642 0.8462587 0.8461587 -0.9987897 0.8750726 0.8750084 -0.9990457 0.8990177 0.8989767 -0.9992471 0.9187265 0.9187004 -0.9994058 0.9348207 0.9348042 -0.9995309 0.9478787 0.9478683 -0.9996295 0.958418 0.9584114 -0.9997074 0.9668886 0.9668844 -0.9997689 0.9736734 0.9736708 -0.9998174 0.9790932 0.9790916 -0.9998557 0.9834132 0.9834122 -0.999886 0.9868507 0.98685 -0.9999099 0.9895821 0.9895817 -0.9999288 0.9917502 0.9917499 -0.9999437 0.9934695 0.9934694 -0.0000238 0.0821895 0.0396127 -0.0000382 0.081686 0.0391092 -0.0000611 0.0810538 0.038477 -0.0000978 0.0802616 0.0376849 -0.0001565 0.0792718 0.036695 -0.0002504 0.0780392 0.0354624 -0.0004008 0.0765113 0.0339345 -0.0006416 0.0746288 0.032052 -0.0010268 0.0723279 0.0297511 -0.0016435 0.0695462 0.0269694 -0.0026305 0.0662338 0.023657 -0.0042103 0.0623743 0.0197975 -0.0067388 0.0580214 0.0154447 -0.0107859 0.0533626 0.0107859 -0.0217999 0.0533626 0.0107859 -0.0357341 0.0533626 0.0107859 -0.0533626 0.0533626 0.0107859 -0.075665 0.0533626 0.0107859 -0.1038805 0.0533626 0.0107859 -0.1395767 0.0533626 0.0107859 -0.1847371 0.0533626 0.0107859 -0.2418708 0.0533626 0.0107859 -0.3141524 0.0533626 0.0107859 -0.405598 0.0533626 0.0107859 -0.5212886 0.0533626 0.0107859 -0.6676523 0.0533626 0.0107859 -0.8269342 0.0547413 0.0136166 -0.8984278 0.0676127 0.0333932 -0.9332914 0.0927559 0.0658501 -0.9534887 0.1285384 0.1079385 -0.9663702 0.1736761 0.15819 -0.9750962 0.2268747 0.2154135 -0.9812508 0.2866181 0.2782606 -0.9857167 0.351101 0.3450957 -0.9890241 0.4182777 0.4140252 -0.991511 0.4859971 0.4830292 -0.9934023 0.5521882 0.5501456 -0.994853 0.6150441 0.6136569 -0.9959732 0.6731625 0.672232 -0.9968425 0.7256151 0.7249978 -0.9975199 0.771943 0.7715376 -0.9980494 0.8120943 0.8118303 -0.9984642 0.8463293 0.8461587 -0.9987897 0.875118 0.8750084 -0.9990457 0.8990467 0.8989767 -0.9992471 0.918745 0.9187004 -0.9994058 0.9348324 0.9348042 -0.9995309 0.9478861 0.9478683 -0.9996295 0.9584227 0.9584114 -0.9997074 0.9668915 0.9668844 -0.9997689 0.9736752 0.9736708 -0.9998174 0.9790943 0.9790916 -0.9998557 0.9834139 0.9834122 -0.999886 0.9868511 0.98685 -0.9999099 0.9895824 0.9895817 -0.9999288 0.9917503 0.9917499 -0.9999437 0.9934696 0.9934694 -0.0000238 0.1044919 0.0396127 -0.0000382 0.1039884 0.0391092 -0.0000611 0.1033562 0.038477 -0.0000978 0.102564 0.0376849 -0.0001565 0.1015742 0.036695 -0.0002504 0.1003416 0.0354624 -0.0004008 0.0988137 0.0339345 -0.0006416 0.0969312 0.032052 -0.0010268 0.0946303 0.0297511 -0.0016435 0.0918486 0.0269694 -0.0026305 0.0885362 0.023657 -0.0042103 0.0846767 0.0197975 -0.0067388 0.0803239 0.0154447 -0.0107859 0.075665 0.0107859 -0.0217999 0.075665 0.0107859 -0.0357341 0.075665 0.0107859 -0.0533626 0.075665 0.0107859 -0.075665 0.075665 0.0107859 -0.1038805 0.075665 0.0107859 -0.1395767 0.075665 0.0107859 -0.1847371 0.075665 0.0107859 -0.2418708 0.075665 0.0107859 -0.3141524 0.075665 0.0107859 -0.405598 0.075665 0.0107859 -0.5212886 0.075665 0.0107859 -0.6676523 0.075665 0.0107859 -0.8269342 0.0762831 0.0136166 -0.8984278 0.0855374 0.0333932 -0.9332914 0.1068496 0.0658501 -0.9534887 0.139329 0.1079385 -0.9663702 0.1817879 0.15819 -0.9750962 0.2328783 0.2154135 -0.9812508 0.2909959 0.2782606 -0.9857167 0.3542467 0.3450957 -0.9890241 0.4205051 0.4140252 -0.991511 0.4875517 0.4830292 -0.9934023 0.5532582 0.5501456 -0.994853 0.6157707 0.6136569 -0.9959732 0.6736499 0.672232 -0.9968425 0.7259384 0.7249978 -0.9975199 0.7721553 0.7715376 -0.9980494 0.8122325 0.8118303 -0.9984642 0.8464187 0.8461587 -0.9987897 0.8751754 0.8750084 -0.9990457 0.8990834 0.8989767 -0.9992471 0.9187683 0.9187004 -0.9994058 0.9348472 0.9348042 -0.9995309 0.9478954 0.9478683 -0.9996295 0.9584286 0.9584114 -0.9997074 0.9668952 0.9668844 -0.9997689 0.9736776 0.9736708 -0.9998174 0.9790958 0.9790916 -0.9998557 0.9834149 0.9834122 -0.999886 0.9868517 0.98685 -0.9999099 0.9895828 0.9895817 -0.9999288 0.9917506 0.9917499 -0.9999437 0.9934698 0.9934694 -0.0000238 0.1327073 0.0396127 -0.0000382 0.1322038 0.0391092 -0.0000611 0.1315716 0.038477 -0.0000978 0.1307795 0.0376849 -0.0001565 0.1297896 0.036695 -0.0002504 0.128557 0.0354624 -0.0004008 0.1270291 0.0339345 -0.0006416 0.1251466 0.032052 -0.0010268 0.1228457 0.0297511 -0.0016435 0.120064 0.0269694 -0.0026305 0.1167517 0.023657 -0.0042103 0.1128922 0.0197975 -0.0067388 0.1085393 0.0154447 -0.0107859 0.1038805 0.0107859 -0.0217999 0.1038805 0.0107859 -0.0357341 0.1038805 0.0107859 -0.0533626 0.1038805 0.0107859 -0.075665 0.1038805 0.0107859 -0.1038805 0.1038805 0.0107859 -0.1395767 0.1038805 0.0107859 -0.1847371 0.1038805 0.0107859 -0.2418708 0.1038805 0.0107859 -0.3141524 0.1038805 0.0107859 -0.405598 0.1038805 0.0107859 -0.5212886 0.1038805 0.0107859 -0.6676523 0.1038805 0.0107859 -0.8269342 0.1035362 0.0136166 -0.8984278 0.1082145 0.0333932 -0.9332914 0.12468 0.0658501 -0.9534887 0.1529804 0.1079385 -0.9663702 0.1920504 0.15819 -0.9750962 0.2404736 0.2154135 -0.9812508 0.2965343 0.2782606 -0.9857167 0.3582264 0.3450957 -0.9890241 0.4233232 0.4140252 -0.991511 0.4895186 0.4830292 -0.9934023 0.5546118 0.5501456 -0.994853 0.61669 0.6136569 -0.9959732 0.6742666 0.672232 -0.9968425 0.7263474 0.7249978 -0.9975199 0.772424 0.7715376 -0.9980494 0.8124075 0.8118303 -0.9984642 0.8465317 0.8461587 -0.9987897 0.875248 0.8750084 -0.9990457 0.8991298 0.8989767 -0.9992471 0.9187978 0.9187004 -0.9994058 0.9348659 0.9348042 -0.9995309 0.9479073 0.9478683 -0.9996295 0.958436 0.9584114 -0.9997074 0.9668999 0.9668844 -0.9997689 0.9736805 0.9736708 -0.9998174 0.9790977 0.9790916 -0.9998557 0.983416 0.9834122 -0.999886 0.9868524 0.98685 -0.9999099 0.9895832 0.9895817 -0.9999288 0.9917509 0.9917499 -0.9999437 0.99347 0.9934694 -0.0000238 0.1684036 0.0396127 -0.0000382 0.1679 0.0391092 -0.0000611 0.1672678 0.038477 -0.0000978 0.1664757 0.0376849 -0.0001565 0.1654858 0.036695 -0.0002504 0.1642532 0.0354624 -0.0004008 0.1627254 0.0339345 -0.0006416 0.1608428 0.032052 -0.0010268 0.1585419 0.0297511 -0.0016435 0.1557603 0.0269694 -0.0026305 0.1524479 0.023657 -0.0042103 0.1485884 0.0197975 -0.0067388 0.1442355 0.0154447 -0.0107859 0.1395767 0.0107859 -0.0217999 0.1395767 0.0107859 -0.0357341 0.1395767 0.0107859 -0.0533626 0.1395767 0.0107859 -0.075665 0.1395767 0.0107859 -0.1038805 0.1395767 0.0107859 -0.1395767 0.1395767 0.0107859 -0.1847371 0.1395767 0.0107859 -0.2418708 0.1395767 0.0107859 -0.3141524 0.1395767 0.0107859 -0.405598 0.1395767 0.0107859 -0.5212886 0.1395767 0.0107859 -0.6676523 0.1395767 0.0107859 -0.8269342 0.138015 0.0136166 -0.8984278 0.136904 0.0333932 -0.9332914 0.1472378 0.0658501 -0.9534887 0.1702513 0.1079385 -0.9663702 0.2050339 0.15819 -0.9750962 0.2500826 0.2154135 -0.9812508 0.3035412 0.2782606 -0.9857167 0.3632613 0.3450957 -0.9890241 0.4268884 0.4140252 -0.991511 0.4920069 0.4830292 -0.9934023 0.5563243 0.5501456 -0.994853 0.617853 0.6136569 -0.9959732 0.6750467 0.672232 -0.9968425 0.7268649 0.7249978 -0.9975199 0.7727638 0.7715376 -0.9980494 0.8126288 0.8118303 -0.9984642 0.8466748 0.8461587 -0.9987897 0.8753398 0.8750084 -0.9990457 0.8991885 0.8989767 -0.9992471 0.9188351 0.9187004 -0.9994058 0.9348895 0.9348042 -0.9995309 0.9479222 0.9478683 -0.9996295 0.9584454 0.9584114 -0.9997074 0.9669058 0.9668844 -0.9997689 0.9736842 0.9736708 -0.9998174 0.9791 0.9790916 -0.9998557 0.9834175 0.9834122 -0.999886 0.9868534 0.98685 -0.9999099 0.9895838 0.9895817 -0.9999288 0.9917512 0.9917499 -0.9999437 0.9934702 0.9934694 -0.0000238 0.2135639 0.0396127 -0.0000382 0.2130604 0.0391092 -0.0000611 0.2124282 0.038477 -0.0000978 0.2116361 0.0376849 -0.0001565 0.2106462 0.036695 -0.0002504 0.2094136 0.0354624 -0.0004008 0.2078857 0.0339345 -0.0006416 0.2060032 0.032052 -0.0010268 0.2037023 0.0297511 -0.0016435 0.2009206 0.0269694 -0.0026305 0.1976083 0.023657 -0.0042103 0.1937488 0.0197975 -0.0067388 0.1893959 0.0154447 -0.0107859 0.1847371 0.0107859 -0.0217999 0.1847371 0.0107859 -0.0357341 0.1847371 0.0107859 -0.0533626 0.1847371 0.0107859 -0.075665 0.1847371 0.0107859 -0.1038805 0.1847371 0.0107859 -0.1395767 0.1847371 0.0107859 -0.1847371 0.1847371 0.0107859 -0.2418708 0.1847371 0.0107859 -0.3141524 0.1847371 0.0107859 -0.405598 0.1847371 0.0107859 -0.5212886 0.1847371 0.0107859 -0.6676523 0.1847371 0.0107859 -0.8269342 0.1816352 0.0136166 -0.8984278 0.1732 0.0333932 -0.9332914 0.1757762 0.0658501 -0.9534887 0.1921012 0.1079385 -0.9663702 0.2214596 0.15819 -0.9750962 0.2622393 0.2154135 -0.9812508 0.3124058 0.2782606 -0.9857167 0.369631 0.3450957 -0.9890241 0.4313989 0.4140252 -0.991511 0.4951549 0.4830292 -0.9934023 0.5584908 0.5501456 -0.994853 0.6193243 0.6136569 -0.9959732 0.6760337 0.672232 -0.9968425 0.7275196 0.7249978 -0.9975199 0.7731938 0.7715376 -0.9980494 0.8129087 0.8118303 -0.9984642 0.8468557 0.8461587 -0.9987897 0.875456 0.8750084 -0.9990457 0.8992627 0.8989767 -0.9992471 0.9188823 0.9187004 -0.9994058 0.9349195 0.9348042 -0.9995309 0.9479411 0.9478683 -0.9996295 0.9584574 0.9584114 -0.9997074 0.9669133 0.9668844 -0.9997689 0.973689 0.9736708 -0.9998174 0.979103 0.9790916 -0.9998557 0.9834194 0.9834122 -0.999886 0.9868545 0.98685 -0.9999099 0.9895845 0.9895817 -0.9999288 0.9917517 0.9917499 -0.9999437 0.9934705 0.9934694 -0.0000238 0.2706977 0.0396127 -0.0000382 0.2701941 0.0391092 -0.0000611 0.2695619 0.038477 -0.0000978 0.2687698 0.0376849 -0.0001565 0.2677799 0.036695 -0.0002504 0.2665473 0.0354624 -0.0004008 0.2650195 0.0339345 -0.0006416 0.2631369 0.032052 -0.0010268 0.260836 0.0297511 -0.0016435 0.2580543 0.0269694 -0.0026305 0.254742 0.023657 -0.0042103 0.2508825 0.0197975 -0.0067388 0.2465296 0.0154447 -0.0107859 0.2418708 0.0107859 -0.0217999 0.2418708 0.0107859 -0.0357341 0.2418708 0.0107859 -0.0533626 0.2418708 0.0107859 -0.075665 0.2418708 0.0107859 -0.1038805 0.2418708 0.0107859 -0.1395767 0.2418708 0.0107859 -0.1847371 0.2418708 0.0107859 -0.2418708 0.2418708 0.0107859 -0.3141524 0.2418708 0.0107859 -0.405598 0.2418708 0.0107859 -0.5212886 0.2418708 0.0107859 -0.6676523 0.2418708 0.0107859 -0.8269342 0.2368203 0.0136166 -0.8984278 0.2191191 0.0333932 -0.9332914 0.2118811 0.0658501 -0.9534887 0.2197441 0.1079385 -0.9663702 0.2422403 0.15819 -0.9750962 0.2776191 0.2154135 -0.9812508 0.3236207 0.2782606 -0.9857167 0.3776896 0.3450957 -0.9890241 0.4371052 0.4140252 -0.991511 0.4991376 0.4830292 -0.9934023 0.5612317 0.5501456 -0.994853 0.6211858 0.6136569 -0.9959732 0.6772823 0.672232 -0.9968425 0.7283479 0.7249978 -0.9975199 0.7737378 0.7715376 -0.9980494 0.8132629 0.8118303 -0.9984642 0.8470846 0.8461587 -0.9987897 0.8756031 0.8750084 -0.9990457 0.8993566 0.8989767 -0.9992471 0.9189421 0.9187004 -0.9994058 0.9349574 0.9348042 -0.9995309 0.9479651 0.9478683 -0.9996295 0.9584725 0.9584114 -0.9997074 0.9669228 0.9668844 -0.9997689 0.9736949 0.9736708 -0.9998174 0.9791067 0.9790916 -0.9998557 0.9834217 0.9834122 -0.999886 0.986856 0.98685 -0.9999099 0.9895854 0.9895817 -0.9999288 0.9917522 0.9917499 -0.9999437 0.9934708 0.9934694 -0.0000238 0.3429792 0.0396127 -0.0000382 0.3424757 0.0391092 -0.0000611 0.3418435 0.038477 -0.0000978 0.3410514 0.0376849 -0.0001565 0.3400615 0.036695 -0.0002504 0.3388289 0.0354624 -0.0004008 0.337301 0.0339345 -0.0006416 0.3354185 0.032052 -0.0010268 0.3331176 0.0297511 -0.0016435 0.3303359 0.0269694 -0.0026305 0.3270236 0.023657 -0.0042103 0.3231641 0.0197975 -0.0067388 0.3188112 0.0154447 -0.0107859 0.3141524 0.0107859 -0.0217999 0.3141524 0.0107859 -0.0357341 0.3141524 0.0107859 -0.0533626 0.3141524 0.0107859 -0.075665 0.3141524 0.0107859 -0.1038805 0.3141524 0.0107859 -0.1395767 0.3141524 0.0107859 -0.1847371 0.3141524 0.0107859 -0.2418708 0.3141524 0.0107859 -0.3141524 0.3141524 0.0107859 -0.405598 0.3141524 0.0107859 -0.5212886 0.3141524 0.0107859 -0.6676523 0.3141524 0.0107859 -0.8269342 0.3066367 0.0136166 -0.8984278 0.2772127 0.0333932 -0.9332914 0.2575585 0.0658501 -0.9534887 0.254716 0.1079385 -0.9663702 0.2685306 0.15819 -0.9750962 0.2970766 0.2154135 -0.9812508 0.337809 0.2782606 -0.9857167 0.3878847 0.3450957 -0.9890241 0.4443244 0.4140252 -0.991511 0.5041761 0.4830292 -0.9934023 0.5646994 0.5501456 -0.994853 0.6235407 0.6136569 -0.9959732 0.678862 0.672232 -0.9968425 0.7293958 0.7249978 -0.9975199 0.774426 0.7715376 -0.9980494 0.813711 0.8118303 -0.9984642 0.8473742 0.8461587 -0.9987897 0.8757891 0.8750084 -0.9990457 0.8994755 0.8989767 -0.9992471 0.9190177 0.9187004 -0.9994058 0.9350053 0.9348042 -0.9995309 0.9479954 0.9478683 -0.9996295 0.9584916 0.9584114 -0.9997074 0.9669349 0.9668844 -0.9997689 0.9737025 0.9736708 -0.9998174 0.9791115 0.9790916 -0.9998557 0.9834247 0.9834122 -0.999886 0.9868579 0.98685 -0.9999099 0.9895866 0.9895817 -0.9999288 0.991753 0.9917499 -0.9999437 0.9934713 0.9934694 -0.0000238 0.4344249 0.0396127 -0.0000382 0.4339214 0.0391092 -0.0000611 0.4332891 0.038477 -0.0000978 0.432497 0.0376849 -0.0001565 0.4315072 0.036695 -0.0002504 0.4302746 0.0354624 -0.0004008 0.4287467 0.0339345 -0.0006416 0.4268641 0.032052 -0.0010268 0.4245633 0.0297511 -0.0016435 0.4217816 0.0269694 -0.0026305 0.4184692 0.023657 -0.0042103 0.4146097 0.0197975 -0.0067388 0.4102568 0.0154447 -0.0107859 0.405598 0.0107859 -0.0217999 0.405598 0.0107859 -0.0357341 0.405598 0.0107859 -0.0533626 0.405598 0.0107859 -0.075665 0.405598 0.0107859 -0.1038805 0.405598 0.0107859 -0.1395767 0.405598 0.0107859 -0.1847371 0.405598 0.0107859 -0.2418708 0.405598 0.0107859 -0.3141524 0.405598 0.0107859 -0.405598 0.405598 0.0107859 -0.5212886 0.405598 0.0107859 -0.6676523 0.405598 0.0107859 -0.8269342 0.3949636 0.0136166 -0.8984278 0.3507087 0.0333932 -0.9332914 0.3153463 0.0658501 -0.9534887 0.2989601 0.1079385 -0.9663702 0.3017912 0.15819 -0.9750962 0.3216928 0.2154135 -0.9812508 0.355759 0.2782606 -0.9857167 0.4007829 0.3450957 -0.9890241 0.4534577 0.4140252 -0.991511 0.5105506 0.4830292 -0.9934023 0.5690864 0.5501456 -0.994853 0.6265201 0.6136569 -0.9959732 0.6808605 0.672232 -0.9968425 0.7307215 0.7249978 -0.9975199 0.7752967 0.7715376 -0.9980494 0.8142779 0.8118303 -0.9984642 0.8477406 0.8461587 -0.9987897 0.8760244 0.8750084 -0.9990457 0.8996258 0.8989767 -0.9992471 0.9191133 0.9187004 -0.9994058 0.9350659 0.9348042 -0.9995309 0.9480337 0.9478683 -0.9996295 0.9585157 0.9584114 -0.9997074 0.9669501 0.9668844 -0.9997689 0.973712 0.9736708 -0.9998174 0.9791175 0.9790916 -0.9998557 0.9834284 0.9834122 -0.999886 0.9868602 0.98685 -0.9999099 0.9895881 0.9895817 -0.9999288 0.9917539 0.9917499 -0.9999437 0.9934719 0.9934694 -0.0000238 0.5501155 0.0396127 -0.0000382 0.549612 0.0391092 -0.0000611 0.5489798 0.038477 -0.0000978 0.5481876 0.0376849 -0.0001565 0.5471978 0.036695 -0.0002504 0.5459652 0.0354624 -0.0004008 0.5444373 0.0339345 -0.0006416 0.5425548 0.032052 -0.0010268 0.5402539 0.0297511 -0.0016435 0.5374722 0.0269694 -0.0026305 0.5341598 0.023657 -0.0042103 0.5303003 0.0197975 -0.0067388 0.5259474 0.0154447 -0.0107859 0.5212886 0.0107859 -0.0217999 0.5212886 0.0107859 -0.0357341 0.5212886 0.0107859 -0.0533626 0.5212886 0.0107859 -0.075665 0.5212886 0.0107859 -0.1038805 0.5212886 0.0107859 -0.1395767 0.5212886 0.0107859 -0.1847371 0.5212886 0.0107859 -0.2418708 0.5212886 0.0107859 -0.3141524 0.5212886 0.0107859 -0.405598 0.5212886 0.0107859 -0.5212886 0.5212886 0.0107859 -0.6676523 0.5212886 0.0107859 -0.8269342 0.5067085 0.0136166 -0.8984278 0.4436907 0.0333932 -0.9332914 0.3884555 0.0658501 -0.9534887 0.3549345 0.1079385 -0.9663702 0.3438702 0.15819 -0.9750962 0.3528354 0.2154135 -0.9812508 0.3784681 0.2782606 -0.9857167 0.4171007 0.3450957 -0.9890241 0.4650125 0.4140252 -0.991511 0.5186151 0.4830292 -0.9934023 0.5746366 0.5501456 -0.994853 0.6302893 0.6136569 -0.9959732 0.6833889 0.672232 -0.9968425 0.7323986 0.7249978 -0.9975199 0.7763982 0.7715376 -0.9980494 0.8149952 0.8118303 -0.9984642 0.8482042 0.8461587 -0.9987897 0.8763221 0.8750084 -0.9990457 0.899816 0.8989767 -0.9992471 0.9192343 0.9187004 -0.9994058 0.9351426 0.9348042 -0.9995309 0.9480822 0.9478683 -0.9996295 0.9585463 0.9584114 -0.9997074 0.9669693 0.9668844 -0.9997689 0.9737241 0.9736708 -0.9998174 0.979125 0.9790916 -0.9998557 0.9834332 0.9834122 -0.999886 0.9868632 0.98685 -0.9999099 0.98959 0.9895817 -0.9999288 0.9917551 0.9917499 -0.9999437 0.9934726 0.9934694 -0.0000238 0.6964791 0.0396127 -0.0000382 0.6959756 0.0391092 -0.0000611 0.6953434 0.038477 -0.0000978 0.6945513 0.0376849 -0.0001565 0.6935614 0.036695 -0.0002504 0.6923288 0.0354624 -0.0004008 0.6908009 0.0339345 -0.0006416 0.6889184 0.032052 -0.0010268 0.6866175 0.0297511 -0.0016435 0.6838358 0.0269694 -0.0026305 0.6805235 0.023657 -0.0042103 0.676664 0.0197975 -0.0067388 0.6723111 0.0154447 -0.0107859 0.6676523 0.0107859 -0.0217999 0.6676523 0.0107859 -0.0357341 0.6676523 0.0107859 -0.0533626 0.6676523 0.0107859 -0.075665 0.6676523 0.0107859 -0.1038805 0.6676523 0.0107859 -0.1395767 0.6676523 0.0107859 -0.1847371 0.6676523 0.0107859 -0.2418708 0.6676523 0.0107859 -0.3141524 0.6676523 0.0107859 -0.405598 0.6676523 0.0107859 -0.5212886 0.6676523 0.0107859 -0.6676523 0.6676523 0.0107859 -0.8269342 0.6480804 0.0136166 -0.8984278 0.561325 0.0333932 -0.9332914 0.480948 0.0658501 -0.9534887 0.4257495 0.1079385 -0.9663702 0.3971056 0.15819 -0.9750962 0.392235 0.2154135 -0.9812508 0.4071981 0.2782606 -0.9857167 0.4377449 0.3450957 -0.9890241 0.4796308 0.4140252 -0.991511 0.5288178 0.4830292 -0.9934023 0.5816582 0.5501456 -0.994853 0.6350579 0.6136569 -0.9959732 0.6865877 0.672232 -0.9968425 0.7345205 0.7249978 -0.9975199 0.7777918 0.7715376 -0.9980494 0.8159025 0.8118303 -0.9984642 0.8487906 0.8461587 -0.9987897 0.8766987 0.8750084 -0.9990457 0.9000567 0.8989767 -0.9992471 0.9193874 0.9187004 -0.9994058 0.9352396 0.9348042 -0.9995309 0.9481435 0.9478683 -0.9996295 0.958585 0.9584114 -0.9997074 0.9669937 0.9668844 -0.9997689 0.9737394 0.9736708 -0.9998174 0.9791347 0.9790916 -0.9998557 0.9834392 0.9834122 -0.999886 0.986867 0.98685 -0.9999099 0.9895923 0.9895817 -0.9999288 0.9917565 0.9917499 -0.9999437 0.9934735 0.9934694 -0.0051514 0.8407292 0.0426726 -0.0051286 0.8405071 0.0421719 -0.0051047 0.8402274 0.0415429 -0.0050826 0.8398756 0.0407541 -0.0050676 0.8394338 0.0397676 -0.0050694 0.8388802 0.0385378 -0.0051048 0.8381886 0.0370113 -0.0052028 0.8373283 0.0351273 -0.0054121 0.8362644 0.0328199 -0.0058134 0.8349593 0.0300235 -0.0065402 0.8333779 0.0266842 -0.0078103 0.8314967 0.0227807 -0.0099781 0.8293233 0.0183626 -0.0136166 0.8269342 0.0136166 -0.024255 0.8269342 0.0136166 -0.037714 0.8269342 0.0136166 -0.0547413 0.8269342 0.0136166 -0.0762831 0.8269342 0.0136166 -0.1035362 0.8269342 0.0136166 -0.138015 0.8269342 0.0136166 -0.1816352 0.8269342 0.0136166 -0.2368203 0.8269342 0.0136166 -0.3066367 0.8269342 0.0136166 -0.3949636 0.8269342 0.0136166 -0.5067085 0.8269342 0.0136166 -0.6480804 0.8269342 0.0136166 -0.8269342 0.8269342 0.0136166 -0.8984278 0.7101477 0.0333932 -0.9332914 0.5979631 0.0658501 -0.9534887 0.5153397 0.1079385 -0.9663702 0.4644554 0.15819 -0.9750962 0.4420805 0.2154135 -0.9812508 0.4435453 0.2782606 -0.9857167 0.4638625 0.3450957 -0.9890241 0.4981248 0.4140252 -0.991511 0.5417255 0.4830292 -0.9934023 0.5905415 0.5501456 -0.994853 0.6410908 0.6136569 -0.9959732 0.6906345 0.672232 -0.9968425 0.7372049 0.7249978 -0.9975199 0.7795549 0.7715376 -0.9980494 0.8170505 0.8118303 -0.9984642 0.8495325 0.8461587 -0.9987897 0.8771752 0.8750084 -0.9990457 0.9003611 0.8989767 -0.9992471 0.9195811 0.9187004 -0.9994058 0.9353624 0.9348042 -0.9995309 0.9482211 0.9478683 -0.9996295 0.9586339 0.9584114 -0.9997074 0.9670245 0.9668844 -0.9997689 0.9737588 0.9736708 -0.9998174 0.9791468 0.9790916 -0.9998557 0.9834468 0.9834122 -0.999886 0.9868717 0.98685 -0.9999099 0.9895953 0.9895817 -0.9999288 0.9917584 0.9917499 -0.9999437 0.9934747 0.9934694 -0.0279321 0.9033413 0.0589895 -0.0278872 0.9032596 0.0585512 -0.0278347 0.9031567 0.0580005 -0.0277752 0.9030276 0.0573098 -0.0277111 0.9028657 0.0564456 -0.0276479 0.9026634 0.0553678 -0.0275966 0.9024114 0.0540292 -0.0275778 0.9020992 0.052376 -0.0276281 0.9017148 0.0503493 -0.0278105 0.9012461 0.0478904 -0.0282324 0.900682 0.0449499 -0.0290732 0.9000167 0.0415064 -0.0306306 0.8992555 0.0376003 -0.0333932 0.8984278 0.0333932 -0.0422453 0.8984278 0.0333932 -0.0534444 0.8984278 0.0333932 -0.0676127 0.8984278 0.0333932 -0.0855374 0.8984278 0.0333932 -0.1082145 0.8984278 0.0333932 -0.136904 0.8984278 0.0333932 -0.1732 0.8984278 0.0333932 -0.2191191 0.8984278 0.0333932 -0.2772127 0.8984278 0.0333932 -0.3507087 0.8984278 0.0333932 -0.4436907 0.8984278 0.0333932 -0.561325 0.8984278 0.0333932 -0.7101477 0.8984278 0.0333932 -0.8984278 0.8984278 0.0333932 -0.9332914 0.7460024 0.0658501 -0.9534887 0.6286829 0.1079385 -0.9663702 0.5496615 0.15819 -0.9750962 0.5051417 0.2154135 -0.9812508 0.4895292 0.2782606 -0.9857167 0.4969046 0.3450957 -0.9890241 0.5215222 0.4140252 -0.991511 0.5580554 0.4830292 -0.9934023 0.6017801 0.5501456 -0.994853 0.6487231 0.6136569 -0.9959732 0.6957543 0.672232 -0.9968425 0.740601 0.7249978 -0.9975199 0.7817854 0.7715376 -0.9980494 0.8185028 0.8118303 -0.9984642 0.8504711 0.8461587 -0.9987897 0.877778 0.8750084 -0.9990457 0.9007462 0.8989767 -0.9992471 0.9198261 0.9187004 -0.9994058 0.9355177 0.9348042 -0.9995309 0.9483193 0.9478683 -0.9996295 0.9586958 0.9584114 -0.9997074 0.9670634 0.9668844 -0.9997689 0.9737833 0.9736708 -0.9998174 0.9791622 0.9790916 -0.9998557 0.9834565 0.9834122 -0.999886 0.9868778 0.98685 -0.9999099 0.9895991 0.9895817 -0.9999288 0.9917608 0.9917499 -0.9999437 0.9934762 0.9934694 -0.0624569 0.9354466 0.0869288 -0.0624063 0.9354101 0.0865673 -0.0623458 0.9353643 0.0861131 -0.0622749 0.9353068 0.0855434 -0.0621943 0.9352348 0.0848308 -0.0621069 0.9351449 0.0839421 -0.0620199 0.9350332 0.0828386 -0.0619473 0.9348949 0.0814759 -0.061916 0.9347252 0.0798059 -0.0619734 0.9345187 0.0777803 -0.062202 0.9342712 0.0753587 -0.062742 0.9339805 0.0725241 -0.0638283 0.9336494 0.0693101 -0.0658501 0.9332914 0.0658501 -0.0728103 0.9332914 0.0658501 -0.0816158 0.9332914 0.0658501 -0.0927559 0.9332914 0.0658501 -0.1068496 0.9332914 0.0658501 -0.12468 0.9332914 0.0658501 -0.1472378 0.9332914 0.0658501 -0.1757762 0.9332914 0.0658501 -0.2118811 0.9332914 0.0658501 -0.2575585 0.9332914 0.0658501 -0.3153463 0.9332914 0.0658501 -0.3884555 0.9332914 0.0658501 -0.480948 0.9332914 0.0658501 -0.5979631 0.9332914 0.0658501 -0.7460024 0.9332914 0.0658501 -0.9332914 0.9332914 0.0658501 -0.9534887 0.7720768 0.1079385 -0.9663702 0.6574584 0.15819 -0.9750962 0.5849222 0.2154135 -0.9812508 0.5477048 0.2782606 -0.9857167 0.5387072 0.3450957 -0.9890241 0.5511229 0.4140252 -0.991511 0.5787149 0.4830292 -0.9934023 0.6159984 0.5501456 -0.994853 0.6583791 0.6136569 -0.9959732 0.7022315 0.672232 -0.9968425 0.7448975 0.7249978 -0.9975199 0.7846072 0.7715376 -0.9980494 0.8203401 0.8118303 -0.9984642 0.8516586 0.8461587 -0.9987897 0.8785407 0.8750084 -0.9990457 0.9012335 0.8989767 -0.9992471 0.920136 0.9187004 -0.9994058 0.9357142 0.9348042 -0.9995309 0.9484434 0.9478683 -0.9996295 0.9587741 0.9584114 -0.9997074 0.9671127 0.9668844 -0.9997689 0.9738142 0.9736708 -0.9998174 0.9791816 0.9790916 -0.9998557 0.9834687 0.9834122 -0.999886 0.9868854 0.98685 -0.9999099 0.9896039 0.9895817 -0.9999288 0.9917638 0.9917499 -0.9999437 0.9934781 0.9934694 -0.1059991 0.9545467 0.1247954 -0.1059489 0.9545286 0.1245055 -0.1058883 0.9545059 0.1241413 -0.1058162 0.9544774 0.1236845 -0.1057322 0.9544418 0.1231132 -0.1056375 0.9543974 0.122401 -0.1055364 0.9543421 0.1215168 -0.1054384 0.9542739 0.1204253 -0.1053624 0.9541902 0.1190883 -0.1053433 0.9540886 0.1174673 -0.1054431 0.9539671 0.1155307 -0.1057683 0.9538247 0.1132654 -0.1064997 0.953663 0.1106989 -0.1079385 0.9534887 0.1079385 -0.1132674 0.9534887 0.1079385 -0.1200092 0.9534887 0.1079385 -0.1285384 0.9534887 0.1079385 -0.139329 0.9534887 0.1079385 -0.1529804 0.9534887 0.1079385 -0.1702513 0.9534887 0.1079385 -0.1921012 0.9534887 0.1079385 -0.2197441 0.9534887 0.1079385 -0.254716 0.9534887 0.1079385 -0.2989601 0.9534887 0.1079385 -0.3549345 0.9534887 0.1079385 -0.4257495 0.9534887 0.1079385 -0.5153397 0.9534887 0.1079385 -0.6286829 0.9534887 0.1079385 -0.7720768 0.9534887 0.1079385 -0.9534887 0.9534887 0.1079385 -0.9663702 0.7938355 0.15819 -0.9750962 0.6858549 0.2154135 -0.9812508 0.6213045 0.2782606 -0.9857167 0.5915929 0.3450957 -0.9890241 0.5885717 0.4140252 -0.991511 0.6048518 0.4830292 -0.9934023 0.6339863 0.5501456 -0.994853 0.6705951 0.6136569 -0.9959732 0.710426 0.672232 -0.9968425 0.7503332 0.7249978 -0.9975199 0.7881772 0.7715376 -0.9980494 0.8226646 0.8118303 -0.9984642 0.8531609 0.8461587 -0.9987897 0.8795055 0.8750084 -0.9990457 0.9018499 0.8989767 -0.9992471 0.9205282 0.9187004 -0.9994058 0.9359628 0.9348042 -0.9995309 0.9486006 0.9478683 -0.9996295 0.9588732 0.9584114 -0.9997074 0.9671751 0.9668844 -0.9997689 0.9738534 0.9736708 -0.9998174 0.9792062 0.9790916 -0.9998557 0.9834841 0.9834122 -0.999886 0.9868951 0.98685 -0.9999099 0.9896099 0.9895817 -0.9999288 0.9917676 0.9917499 -0.9999437 0.9934804 0.9934694 -0.1572498 0.9669269 0.1714232 -0.1572031 0.9669173 0.171195 -0.1571463 0.9669053 0.1709083 -0.1570779 0.9668902 0.1705489 -0.1569971 0.9668714 0.1700994 -0.156904 0.9668479 0.169539 -0.1568008 0.9668187 0.1688437 -0.1566936 0.9667827 0.1679855 -0.1565954 0.9667385 0.1669347 -0.1565315 0.966685 0.1656615 -0.1565473 0.9666211 0.1641411 -0.1567226 0.9665463 0.1623639 -0.1571937 0.9664615 0.1603521 -0.15819 0.9663702 0.15819 -0.1621961 0.9663702 0.15819 -0.1672642 0.9663702 0.15819 -0.1736761 0.9663702 0.15819 -0.1817879 0.9663702 0.15819 -0.1920504 0.9663702 0.15819 -0.2050339 0.9663702 0.15819 -0.2214596 0.9663702 0.15819 -0.2422403 0.9663702 0.15819 -0.2685306 0.9663702 0.15819 -0.3017912 0.9663702 0.15819 -0.3438702 0.9663702 0.15819 -0.3971056 0.9663702 0.15819 -0.4644554 0.9663702 0.15819 -0.5496615 0.9663702 0.15819 -0.6574584 0.9663702 0.15819 -0.7938355 0.9663702 0.15819 -0.9663702 0.9663702 0.15819 -0.9750962 0.8135479 0.2154135 -0.9812508 0.7144178 0.2782606 -0.9857167 0.6585002 0.3450957 -0.9890241 0.6359492 0.4140252 -0.991511 0.6379184 0.4830292 -0.9934023 0.6567433 0.5501456 -0.994853 0.68605 0.6136569 -0.9959732 0.720793 0.672232 -0.9968425 0.7572101 0.7249978 -0.9975199 0.7926938 0.7715376 -0.9980494 0.8256054 0.8118303 -0.9984642 0.8550615 0.8461587 -0.9987897 0.8807262 0.8750084 -0.9990457 0.9026298 0.8989767 -0.9992471 0.9210243 0.9187004 -0.9994058 0.9362772 0.9348042 -0.9995309 0.9487993 0.9478683 -0.9996295 0.9589985 0.9584114 -0.9997074 0.9672539 0.9668844 -0.9997689 0.973903 0.9736708 -0.9998174 0.9792373 0.9790916 -0.9998557 0.9835036 0.9834122 -0.999886 0.9869073 0.98685 -0.9999099 0.9896176 0.9895817 -0.9999288 0.9917724 0.9917499 -0.9999437 0.9934834 0.9934694 -0.2151269 0.9754027 0.2256446 -0.2150852 0.9753975 0.2254677 -0.2150342 0.9753908 0.2252456 -0.2149725 0.9753825 0.2249671 -0.2148987 0.9753721 0.2246189 -0.2148124 0.9753591 0.2241849 -0.2147144 0.975343 0.2236464 -0.2146085 0.9753231 0.2229821 -0.2145034 0.9752987 0.2221689 -0.2144168 0.9752692 0.221184 -0.2143816 0.975234 0.2200085 -0.2144566 0.9751928 0.2186353 -0.2147432 0.9751462 0.2170817 -0.2154135 0.9750962 0.2154135 -0.2183784 0.9750962 0.2154135 -0.2221293 0.9750962 0.2154135 -0.2268747 0.9750962 0.2154135 -0.2328783 0.9750962 0.2154135 -0.2404736 0.9750962 0.2154135 -0.2500826 0.9750962 0.2154135 -0.2622393 0.9750962 0.2154135 -0.2776191 0.9750962 0.2154135 -0.2970766 0.9750962 0.2154135 -0.3216928 0.9750962 0.2154135 -0.3528354 0.9750962 0.2154135 -0.392235 0.9750962 0.2154135 -0.4420805 0.9750962 0.2154135 -0.5051417 0.9750962 0.2154135 -0.5849222 0.9750962 0.2154135 -0.6858549 0.9750962 0.2154135 -0.8135479 0.9750962 0.2154135 -0.9750962 0.9750962 0.2154135 -0.9812508 0.8322181 0.2782606 -0.9857167 0.7431467 0.3450957 -0.9890241 0.695888 0.4140252 -0.991511 0.679752 0.4830292 -0.9934023 0.685534 0.5501456 -0.994853 0.7056024 0.6136569 -0.9959732 0.7339088 0.672232 -0.9968425 0.7659102 0.7249978 -0.9975199 0.7984078 0.7715376 -0.9980494 0.8293258 0.8118303 -0.9984642 0.857466 0.8461587 -0.9987897 0.8822705 0.8750084 -0.9990457 0.9036165 0.8989767 -0.9992471 0.9216519 0.9187004 -0.9994058 0.9366751 0.9348042 -0.9995309 0.9490508 0.9478683 -0.9996295 0.9591571 0.9584114 -0.9997074 0.9673538 0.9668844 -0.9997689 0.9739657 0.9736708 -0.9998174 0.9792767 0.9790916 -0.9998557 0.9835283 0.9834122 -0.999886 0.9869228 0.98685 -0.9999099 0.9896273 0.9895817 -0.9999288 0.9917784 0.9917499 -0.9999437 0.9934872 0.9934694 -0.2783684 0.9814251 0.2860552 -0.2783325 0.9814221 0.2859202 -0.2782884 0.9814183 0.2857506 -0.2782347 0.9814136 0.2855381 -0.2781701 0.9814076 0.2852724 -0.2780936 0.9814002 0.2849413 -0.2780055 0.9813911 0.2845305 -0.2779077 0.9813797 0.2840238 -0.2778058 0.9813659 0.2834038 -0.2777122 0.9813491 0.2826531 -0.2776503 0.9813291 0.2817576 -0.2776626 0.9813057 0.2807118 -0.2778236 0.9812792 0.2795295 -0.2782606 0.9812508 0.2782606 -0.2804226 0.9812508 0.2782606 -0.2831577 0.9812508 0.2782606 -0.2866181 0.9812508 0.2782606 -0.2909959 0.9812508 0.2782606 -0.2965343 0.9812508 0.2782606 -0.3035412 0.9812508 0.2782606 -0.3124058 0.9812508 0.2782606 -0.3236207 0.9812508 0.2782606 -0.337809 0.9812508 0.2782606 -0.355759 0.9812508 0.2782606 -0.3784681 0.9812508 0.2782606 -0.4071981 0.9812508 0.2782606 -0.4435453 0.9812508 0.2782606 -0.4895292 0.9812508 0.2782606 -0.5477048 0.9812508 0.2782606 -0.6213045 0.9812508 0.2782606 -0.7144178 0.9812508 0.2782606 -0.8322181 0.9812508 0.2782606 -0.9812508 0.9812508 0.2782606 -0.9857167 0.8502355 0.3450957 -0.9890241 0.7717183 0.4140252 -0.991511 0.7326769 0.4830292 -0.9934023 0.7219579 0.5501456 -0.994853 0.7303387 0.6136569 -0.9959732 0.7505018 0.672232 -0.9968425 0.7769169 0.7249978 -0.9975199 0.8056368 0.7715376 -0.9980494 0.8340327 0.8118303 -0.9984642 0.860508 0.8461587 -0.9987897 0.8842242 0.8750084 -0.9990457 0.9048647 0.8989767 -0.9992471 0.922446 0.9187004 -0.9994058 0.9371784 0.9348042 -0.9995309 0.9493689 0.9478683 -0.9996295 0.9593577 0.9584114 -0.9997074 0.96748 0.9668844 -0.9997689 0.9740451 0.9736708 -0.9998174 0.9793265 0.9790916 -0.9998557 0.9835595 0.9834122 -0.999886 0.9869424 0.98685 -0.9999099 0.9896395 0.9895817 -0.9999288 0.9917861 0.9917499 -0.9999437 0.993492 0.9934694 -0.3454107 0.9858181 0.3509445 -0.3453807 0.9858163 0.350843 -0.3453439 0.9858141 0.3507156 -0.3452987 0.9858113 0.3505559 -0.3452442 0.9858079 0.3503562 -0.3451791 0.9858036 0.3501075 -0.3451032 0.9857982 0.3497989 -0.3450175 0.9857916 0.3494184 -0.3449254 0.9857835 0.3489529 -0.3448353 0.9857738 0.3483894 -0.3447636 0.9857621 0.3477174 -0.3447407 0.9857485 0.346933 -0.3448204 0.9857332 0.3460466 -0.3450957 0.9857167 0.3450957 -0.3466492 0.9857167 0.3450957 -0.3486146 0.9857167 0.3450957 -0.351101 0.9857167 0.3450957 -0.3542467 0.9857167 0.3450957 -0.3582264 0.9857167 0.3450957 -0.3632613 0.9857167 0.3450957 -0.369631 0.9857167 0.3450957 -0.3776896 0.9857167 0.3450957 -0.3878847 0.9857167 0.3450957 -0.4007829 0.9857167 0.3450957 -0.4171007 0.9857167 0.3450957 -0.4377449 0.9857167 0.3450957 -0.4638625 0.9857167 0.3450957 -0.4969046 0.9857167 0.3450957 -0.5387072 0.9857167 0.3450957 -0.5915929 0.9857167 0.3450957 -0.6585002 0.9857167 0.3450957 -0.7431467 0.9857167 0.3450957 -0.8502355 0.9857167 0.3450957 -0.9857167 0.9857167 0.3450957 -0.9890241 0.8676536 0.4140252 -0.991511 0.7996338 0.4830292 -0.9934023 0.7680389 0.5501456 -0.994853 0.7616334 0.6136569 -0.9959732 0.7714942 0.672232 -0.9968425 0.7908419 0.7249978 -0.9975199 0.8147824 0.7715376 -0.9980494 0.8399875 0.8118303 -0.9984642 0.8643565 0.8461587 -0.9987897 0.886696 0.8750084 -0.9990457 0.9064439 0.8989767 -0.9992471 0.9234506 0.9187004 -0.9994058 0.9378152 0.9348042 -0.9995309 0.9497714 0.9478683 -0.9996295 0.9596115 0.9584114 -0.9997074 0.9676398 0.9668844 -0.9997689 0.9741455 0.9736708 -0.9998174 0.9793895 0.9790916 -0.9998557 0.9835991 0.9834122 -0.999886 0.9869671 0.98685 -0.9999099 0.989655 0.9895817 -0.9999288 0.9917958 0.9917499 -0.9999437 0.9934981 0.9934694 -0.4144197 0.9890841 0.4183444 -0.4143955 0.9890831 0.4182694 -0.4143657 0.9890818 0.4181752 -0.414329 0.9890801 0.4180571 -0.4142845 0.9890781 0.4179095 -0.4142311 0.9890755 0.4177256 -0.4141683 0.9890723 0.4174976 -0.4140964 0.9890684 0.4172164 -0.4140176 0.9890637 0.4168724 -0.4139373 0.9890579 0.4164562 -0.4138668 0.989051 0.4159599 -0.4138277 0.989043 0.4153808 -0.4138582 0.9890339 0.4147267 -0.4140252 0.9890241 0.4140252 -0.4151253 0.9890241 0.4140252 -0.416517 0.9890241 0.4140252 -0.4182777 0.9890241 0.4140252 -0.4205051 0.9890241 0.4140252 -0.4233232 0.9890241 0.4140252 -0.4268884 0.9890241 0.4140252 -0.4313989 0.9890241 0.4140252 -0.4371052 0.9890241 0.4140252 -0.4443244 0.9890241 0.4140252 -0.4534577 0.9890241 0.4140252 -0.4650125 0.9890241 0.4140252 -0.4796308 0.9890241 0.4140252 -0.4981248 0.9890241 0.4140252 -0.5215222 0.9890241 0.4140252 -0.5511229 0.9890241 0.4140252 -0.5885717 0.9890241 0.4140252 -0.6359492 0.9890241 0.4140252 -0.695888 0.9890241 0.4140252 -0.7717183 0.9890241 0.4140252 -0.8676536 0.9890241 0.4140252 -0.9890241 0.9890241 0.4140252 -0.991511 0.8843429 0.4830292 -0.9934023 0.8263373 0.5501456 -0.994853 0.8012253 0.6136569 -0.9959732 0.7980523 0.672232 -0.9968425 0.8084588 0.7249978 -0.9975199 0.8263527 0.7715376 -0.9980494 0.8475211 0.8118303 -0.9984642 0.8692255 0.8461587 -0.9987897 0.889823 0.8750084 -0.9990457 0.9084417 0.8989767 -0.9992471 0.9247215 0.9187004 -0.9994058 0.9386208 0.9348042 -0.9995309 0.9502806 0.9478683 -0.9996295 0.9599326 0.9584114 -0.9997074 0.9678419 0.9668844 -0.9997689 0.9742725 0.9736708 -0.9998174 0.9794693 0.9790916 -0.9998557 0.9836491 0.9834122 -0.999886 0.9869985 0.98685 -0.9999099 0.9896747 0.9895817 -0.9999288 0.9918081 0.9917499 -0.9999437 0.9935058 0.9934694 -0.4834235 0.9915469 0.4861663 -0.4834045 0.9915463 0.4861117 -0.4833811 0.9915455 0.4860432 -0.4833522 0.9915446 0.4859574 -0.4833171 0.9915433 0.4858501 -0.4832747 0.9915418 0.4857164 -0.4832246 0.9915399 0.4855507 -0.4831666 0.9915376 0.4853463 -0.4831021 0.9915347 0.4850964 -0.4830346 0.9915312 0.484794 -0.4829718 0.9915271 0.4844335 -0.4829286 0.9915223 0.484013 -0.4829319 0.9915169 0.4835382 -0.4830292 0.991511 0.4830292 -0.4837969 0.991511 0.4830292 -0.4847683 0.991511 0.4830292 -0.4859971 0.991511 0.4830292 -0.4875517 0.991511 0.4830292 -0.4895186 0.991511 0.4830292 -0.4920069 0.991511 0.4830292 -0.4951549 0.991511 0.4830292 -0.4991376 0.991511 0.4830292 -0.5041761 0.991511 0.4830292 -0.5105506 0.991511 0.4830292 -0.5186151 0.991511 0.4830292 -0.5288178 0.991511 0.4830292 -0.5417255 0.991511 0.4830292 -0.5580554 0.991511 0.4830292 -0.5787149 0.991511 0.4830292 -0.6048518 0.991511 0.4830292 -0.6379184 0.991511 0.4830292 -0.679752 0.991511 0.4830292 -0.7326769 0.991511 0.4830292 -0.7996338 0.991511 0.4830292 -0.8843429 0.991511 0.4830292 -0.991511 0.991511 0.4830292 -0.9934023 0.9000925 0.5501456 -0.994853 0.8513142 0.6136569 -0.9959732 0.8316518 0.672232 -0.9968425 0.8307465 0.7249978 -0.9975199 0.8409907 0.7715376 -0.9980494 0.857052 0.8118303 -0.9984642 0.8753853 0.8461587 -0.9987897 0.8937792 0.8750084 -0.9990457 0.9109693 0.8989767 -0.9992471 0.9263294 0.9187004 -0.9994058 0.93964 0.9348042 -0.9995309 0.9509248 0.9478683 -0.9996295 0.9603388 0.9584114 -0.9997074 0.9680976 0.9668844 -0.9997689 0.9744332 0.9736708 -0.9998174 0.9795701 0.9790916 -0.9998557 0.9837123 0.9834122 -0.999886 0.9870381 0.98685 -0.9999099 0.9896995 0.9895817 -0.9999288 0.9918236 0.9917499 -0.9999437 0.9935155 0.9934694 -0.5504963 0.993424 0.552386 -0.5504818 0.9934236 0.552347 -0.550464 0.9934231 0.5522981 -0.5504419 0.9934225 0.5522367 -0.550415 0.9934218 0.55216 -0.5503825 0.9934209 0.5520645 -0.5503438 0.9934197 0.5519461 -0.5502987 0.9934183 0.5518001 -0.550248 0.9934166 0.5516215 -0.5501939 0.9934145 0.5514055 -0.5501416 0.993412 0.5511481 -0.5501012 0.9934091 0.5508478 -0.5500915 0.9934058 0.5505089 -0.5501456 0.9934023 0.5501456 -0.550674 0.9934023 0.5501456 -0.5513425 0.9934023 0.5501456 -0.5521882 0.9934023 0.5501456 -0.5532582 0.9934023 0.5501456 -0.5546118 0.9934023 0.5501456 -0.5563243 0.9934023 0.5501456 -0.5584908 0.9934023 0.5501456 -0.5612317 0.9934023 0.5501456 -0.5646994 0.9934023 0.5501456 -0.5690864 0.9934023 0.5501456 -0.5746366 0.9934023 0.5501456 -0.5816582 0.9934023 0.5501456 -0.5905415 0.9934023 0.5501456 -0.6017801 0.9934023 0.5501456 -0.6159984 0.9934023 0.5501456 -0.6339863 0.9934023 0.5501456 -0.6567433 0.9934023 0.5501456 -0.685534 0.9934023 0.5501456 -0.7219579 0.9934023 0.5501456 -0.7680389 0.9934023 0.5501456 -0.8263373 0.9934023 0.5501456 -0.9000925 0.9934023 0.5501456 -0.9934023 0.9934023 0.5501456 -0.994853 0.9146831 0.6136569 -0.9959732 0.8741595 0.672232 -0.9968425 0.8589433 0.7249978 -0.9975199 0.8595097 0.7715376 -0.9980494 0.86911 0.8118303 -0.9984642 0.8831782 0.8461587 -0.9987897 0.8987842 0.8750084 -0.9990457 0.914167 0.8989767 -0.9992471 0.9283635 0.9187004 -0.9994058 0.9409295 0.9348042 -0.9995309 0.9517398 0.9478683 -0.9996295 0.9608528 0.9584114 -0.9997074 0.968421 0.9668844 -0.9997689 0.9746365 0.9736708 -0.9998174 0.9796977 0.9790916 -0.9998557 0.9837923 0.9834122 -0.999886 0.9870882 0.98685 -0.9999099 0.9897309 0.9895817 -0.9999288 0.9918433 0.9917499 -0.9999437 0.9935278 0.9934694 -0.6139459 0.9948662 0.6152304 -0.6139352 0.994866 0.615203 -0.6139219 0.9948657 0.6151686 -0.6139056 0.9948653 0.6151255 -0.6138855 0.9948649 0.6150716 -0.6138613 0.9948643 0.6150045 -0.6138323 0.9948636 0.6149212 -0.6137984 0.9948628 0.6148187 -0.6137599 0.9948617 0.6146932 -0.6137183 0.9948604 0.6145415 -0.6136769 0.9948589 0.6143607 -0.6136427 0.9948571 0.6141499 -0.6136284 0.9948551 0.6139119 -0.6136569 0.994853 0.6136569 -0.6140158 0.994853 0.6136569 -0.6144698 0.994853 0.6136569 -0.6150441 0.994853 0.6136569 -0.6157707 0.994853 0.6136569 -0.61669 0.994853 0.6136569 -0.617853 0.994853 0.6136569 -0.6193243 0.994853 0.6136569 -0.6211858 0.994853 0.6136569 -0.6235407 0.994853 0.6136569 -0.6265201 0.994853 0.6136569 -0.6302893 0.994853 0.6136569 -0.6350579 0.994853 0.6136569 -0.6410908 0.994853 0.6136569 -0.6487231 0.994853 0.6136569 -0.6583791 0.994853 0.6136569 -0.6705951 0.994853 0.6136569 -0.68605 0.994853 0.6136569 -0.7056024 0.994853 0.6136569 -0.7303387 0.994853 0.6136569 -0.7616334 0.994853 0.6136569 -0.8012253 0.994853 0.6136569 -0.8513142 0.994853 0.6136569 -0.9146831 0.994853 0.6136569 -0.994853 0.994853 0.6136569 -0.9959732 0.9279373 0.672232 -0.9968425 0.894616 0.7249978 -0.9975199 0.8829386 0.7715376 -0.9980494 0.8843648 0.8118303 -0.9984642 0.8930373 0.8461587 -0.9987897 0.9051163 0.8750084 -0.9990457 0.9182125 0.8989767 -0.9992471 0.930937 0.9187004 -0.9994058 0.9425608 0.9348042 -0.9995309 0.9527709 0.9478683 -0.9996295 0.961503 0.9584114 -0.9997074 0.9688303 0.9668844 -0.9997689 0.9748937 0.9736708 -0.9998174 0.9798592 0.9790916 -0.9998557 0.9838936 0.9834122 -0.999886 0.9871517 0.98685 -0.9999099 0.9897706 0.9895817 -0.9999288 0.9918681 0.9917499 -0.9999437 0.9935434 0.9934694 -0.6724572 0.9959813 0.6733195 -0.6724495 0.9959811 0.6733005 -0.6724399 0.9959809 0.6732768 -0.672428 0.9959807 0.6732469 -0.6724135 0.9959804 0.6732097 -0.6723959 0.9959801 0.6731633 -0.6723748 0.9959797 0.6731057 -0.67235 0.9959791 0.6730348 -0.6723217 0.9959785 0.6729481 -0.6722907 0.9959777 0.6728432 -0.6722594 0.9959768 0.6727182 -0.6722322 0.9959757 0.6725725 -0.672218 0.9959745 0.6724081 -0.672232 0.9959732 0.672232 -0.6724727 0.9959732 0.672232 -0.6727772 0.9959732 0.672232 -0.6731625 0.9959732 0.672232 -0.6736499 0.9959732 0.672232 -0.6742666 0.9959732 0.672232 -0.6750467 0.9959732 0.672232 -0.6760337 0.9959732 0.672232 -0.6772823 0.9959732 0.672232 -0.678862 0.9959732 0.672232 -0.6808605 0.9959732 0.672232 -0.6833889 0.9959732 0.672232 -0.6865877 0.9959732 0.672232 -0.6906345 0.9959732 0.672232 -0.6957543 0.9959732 0.672232 -0.7022315 0.9959732 0.672232 -0.710426 0.9959732 0.672232 -0.720793 0.9959732 0.672232 -0.7339088 0.9959732 0.672232 -0.7505018 0.9959732 0.672232 -0.7714942 0.9959732 0.672232 -0.7980523 0.9959732 0.672232 -0.8316518 0.9959732 0.672232 -0.8741595 0.9959732 0.672232 -0.9279373 0.9959732 0.672232 -0.9959732 0.9959732 0.672232 -0.9968425 0.9397465 0.7249978 -0.9975199 0.9125792 0.7715376 -0.9980494 0.9036641 0.8118303 -0.9984642 0.9055104 0.8461587 -0.9987897 0.9131271 0.8750084 -0.9990457 0.9233306 0.8989767 -0.9992471 0.9341929 0.9187004 -0.9994058 0.9446246 0.9348042 -0.9995309 0.9540754 0.9478683 -0.9996295 0.9623255 0.9584114 -0.9997074 0.969348 0.9668844 -0.9997689 0.975219 0.9736708 -0.9998174 0.9800634 0.9790916 -0.9998557 0.9840216 0.9834122 -0.999886 0.9872319 0.98685 -0.9999099 0.9898209 0.9895817 -0.9999288 0.9918996 0.9917499 -0.9999437 0.993563 0.9934694 -0.7251659 0.9968475 0.7257383 -0.7251605 0.9968474 0.7257254 -0.7251537 0.9968473 0.7257092 -0.7251454 0.9968472 0.7256889 -0.7251351 0.996847 0.7256635 -0.7251226 0.9968468 0.7256319 -0.7251076 0.9968465 0.7255927 -0.7250899 0.9968462 0.7255444 -0.7250697 0.9968458 0.7254853 -0.7250473 0.9968453 0.7254139 -0.7250244 0.9968448 0.7253288 -0.7250039 0.9968441 0.7252297 -0.7249916 0.9968433 0.7251177 -0.7249978 0.9968425 0.7249978 -0.7251575 0.9968425 0.7249978 -0.7253595 0.9968425 0.7249978 -0.7256151 0.9968425 0.7249978 -0.7259384 0.9968425 0.7249978 -0.7263474 0.9968425 0.7249978 -0.7268649 0.9968425 0.7249978 -0.7275196 0.9968425 0.7249978 -0.7283479 0.9968425 0.7249978 -0.7293958 0.9968425 0.7249978 -0.7307215 0.9968425 0.7249978 -0.7323986 0.9968425 0.7249978 -0.7345205 0.9968425 0.7249978 -0.7372049 0.9968425 0.7249978 -0.740601 0.9968425 0.7249978 -0.7448975 0.9968425 0.7249978 -0.7503332 0.9968425 0.7249978 -0.7572101 0.9968425 0.7249978 -0.7659102 0.9968425 0.7249978 -0.7769169 0.9968425 0.7249978 -0.7908419 0.9968425 0.7249978 -0.8084588 0.9968425 0.7249978 -0.8307465 0.9968425 0.7249978 -0.8589433 0.9968425 0.7249978 -0.894616 0.9968425 0.7249978 -0.9397465 0.9968425 0.7249978 -0.9968425 0.9968425 0.7249978 -0.9975199 0.9500785 0.7715376 -0.9980494 0.9280803 0.8118303 -0.9984642 0.9212904 0.8461587 -0.9987897 0.9232619 0.8750084 -0.9990457 0.9298057 0.8989767 -0.9992471 0.9383119 0.9187004 -0.9994058 0.9472356 0.9348042 -0.9995309 0.9557257 0.9478683 -0.9996295 0.9633662 0.9584114 -0.9997074 0.970003 0.9668844 -0.9997689 0.9756307 0.9736708 -0.9998174 0.9803218 0.9790916 -0.9998557 0.9841837 0.9834122 -0.999886 0.9873335 0.98685 -0.9999099 0.9898845 0.9895817 -0.9999288 0.9919394 0.9917499 -0.9999437 0.9935879 0.9934694 -0.7716588 0.997523 0.7720349 -0.7716551 0.997523 0.7720263 -0.7716504 0.9975229 0.7720154 -0.7716446 0.9975228 0.7720017 -0.7716375 0.9975227 0.7719847 -0.7716288 0.9975226 0.7719634 -0.7716184 0.9975224 0.7719371 -0.7716061 0.9975222 0.7719047 -0.7715919 0.997522 0.771865 -0.7715762 0.9975217 0.771817 -0.7715599 0.9975213 0.7717599 -0.7715449 0.9975209 0.7716932 -0.7715352 0.9975204 0.7716181 -0.7715376 0.9975199 0.7715376 -0.7716425 0.9975199 0.7715376 -0.7717751 0.9975199 0.7715376 -0.771943 0.9975199 0.7715376 -0.7721553 0.9975199 0.7715376 -0.772424 0.9975199 0.7715376 -0.7727638 0.9975199 0.7715376 -0.7731938 0.9975199 0.7715376 -0.7737378 0.9975199 0.7715376 -0.774426 0.9975199 0.7715376 -0.7752967 0.9975199 0.7715376 -0.7763982 0.9975199 0.7715376 -0.7777918 0.9975199 0.7715376 -0.7795549 0.9975199 0.7715376 -0.7817854 0.9975199 0.7715376 -0.7846072 0.9975199 0.7715376 -0.7881772 0.9975199 0.7715376 -0.7926938 0.9975199 0.7715376 -0.7984078 0.9975199 0.7715376 -0.8056368 0.9975199 0.7715376 -0.8147824 0.9975199 0.7715376 -0.8263527 0.9975199 0.7715376 -0.8409907 0.9975199 0.7715376 -0.8595097 0.9975199 0.7715376 -0.8829386 0.9975199 0.7715376 -0.9125792 0.9975199 0.7715376 -0.9500785 0.9975199 0.7715376 -0.9975199 0.9975199 0.7715376 -0.9980494 0.9589699 0.8118303 -0.9984642 0.9412542 0.8461587 -0.9987897 0.9360836 0.8750084 -0.9990457 0.9379975 0.8989767 -0.9992471 0.943523 0.9187004 -0.9994058 0.9505389 0.9348042 -0.9995309 0.9578135 0.9478683 -0.9996295 0.9646828 0.9584114 -0.9997074 0.9708317 0.9668844 -0.9997689 0.9761514 0.9736708 -0.9998174 0.9806487 0.9790916 -0.9998557 0.9843887 0.9834122 -0.999886 0.9874619 0.98685 -0.9999099 0.9899649 0.9895817 -0.9999288 0.9919898 0.9917499 -0.9999437 0.9936194 0.9934694 -0.8119154 0.9980513 0.8121604 -0.8119128 0.9980512 0.8121546 -0.8119096 0.9980512 0.8121474 -0.8119057 0.9980511 0.8121383 -0.8119009 0.9980511 0.812127 -0.8118949 0.998051 0.8121129 -0.8118878 0.9980509 0.8120954 -0.8118794 0.9980508 0.8120739 -0.8118697 0.9980506 0.8120476 -0.8118589 0.9980504 0.8120157 -0.8118476 0.9980502 0.8119778 -0.811837 0.99805 0.8119336 -0.8118298 0.9980497 0.8118837 -0.8118303 0.9980494 0.8118303 -0.8118986 0.9980494 0.8118303 -0.811985 0.9980494 0.8118303 -0.8120943 0.9980494 0.8118303 -0.8122325 0.9980494 0.8118303 -0.8124075 0.9980494 0.8118303 -0.8126288 0.9980494 0.8118303 -0.8129087 0.9980494 0.8118303 -0.8132629 0.9980494 0.8118303 -0.813711 0.9980494 0.8118303 -0.8142779 0.9980494 0.8118303 -0.8149952 0.9980494 0.8118303 -0.8159025 0.9980494 0.8118303 -0.8170505 0.9980494 0.8118303 -0.8185028 0.9980494 0.8118303 -0.8203401 0.9980494 0.8118303 -0.8226646 0.9980494 0.8118303 -0.8256054 0.9980494 0.8118303 -0.8293258 0.9980494 0.8118303 -0.8340327 0.9980494 0.8118303 -0.8399875 0.9980494 0.8118303 -0.8475211 0.9980494 0.8118303 -0.857052 0.9980494 0.8118303 -0.86911 0.9980494 0.8118303 -0.8843648 0.9980494 0.8118303 -0.9036641 0.9980494 0.8118303 -0.9280803 0.9980494 0.8118303 -0.9589699 0.9980494 0.8118303 -0.9980494 0.9980494 0.8118303 -0.9984642 0.966511 0.8461587 -0.9987897 0.9523049 0.8750084 -0.9990457 0.9483611 0.8989767 -0.9992471 0.9501157 0.9187004 -0.9994058 0.9547179 0.9348042 -0.9995309 0.9604549 0.9478683 -0.9996295 0.9663484 0.9584114 -0.9997074 0.97188 0.9668844 -0.9997689 0.9768103 0.9736708 -0.9998174 0.9810622 0.9790916 -0.9998557 0.984648 0.9834122 -0.999886 0.9876244 0.98685 -0.9999099 0.9900667 0.9895817 -0.9999288 0.9920535 0.9917499 -0.9999437 0.9936593 0.9934694 -0.8462171 0.9984653 0.8463755 -0.8462154 0.9984653 0.8463717 -0.8462132 0.9984653 0.8463669 -0.8462106 0.9984653 0.846361 -0.8462073 0.9984652 0.8463535 -0.8462034 0.9984652 0.8463443 -0.8461986 0.9984651 0.8463328 -0.8461929 0.998465 0.8463187 -0.8461864 0.9984649 0.8463014 -0.8461791 0.9984648 0.8462805 -0.8461714 0.9984647 0.8462556 -0.8461641 0.9984645 0.8462265 -0.8461589 0.9984643 0.8461938 -0.8461587 0.9984642 0.8461587 -0.8462029 0.9984642 0.8461587 -0.8462587 0.9984642 0.8461587 -0.8463293 0.9984642 0.8461587 -0.8464187 0.9984642 0.8461587 -0.8465317 0.9984642 0.8461587 -0.8466748 0.9984642 0.8461587 -0.8468557 0.9984642 0.8461587 -0.8470846 0.9984642 0.8461587 -0.8473742 0.9984642 0.8461587 -0.8477406 0.9984642 0.8461587 -0.8482042 0.9984642 0.8461587 -0.8487906 0.9984642 0.8461587 -0.8495325 0.9984642 0.8461587 -0.8504711 0.9984642 0.8461587 -0.8516586 0.9984642 0.8461587 -0.8531609 0.9984642 0.8461587 -0.8550615 0.9984642 0.8461587 -0.857466 0.9984642 0.8461587 -0.860508 0.9984642 0.8461587 -0.8643565 0.9984642 0.8461587 -0.8692255 0.9984642 0.8461587 -0.8753853 0.9984642 0.8461587 -0.8831782 0.9984642 0.8461587 -0.8930373 0.9984642 0.8461587 -0.9055104 0.9984642 0.8461587 -0.9212904 0.9984642 0.8461587 -0.9412542 0.9984642 0.8461587 -0.966511 0.9984642 0.8461587 -0.9984642 0.9984642 0.8461587 -0.9987897 0.9728268 0.8750084 -0.9990457 0.9614726 0.8989767 -0.9992471 0.9584564 0.9187004 -0.9994058 0.9600049 0.9348042 -0.9995309 0.9637967 0.9478683 -0.9996295 0.9684557 0.9584114 -0.9997074 0.9732063 0.9668844 -0.9997689 0.9776438 0.9736708 -0.9998174 0.9815855 0.9790916 -0.9998557 0.9849761 0.9834122 -0.999886 0.98783 0.98685 -0.9999099 0.9901954 0.9895817 -0.9999288 0.992134 0.9917499 -0.9999437 0.9937097 0.9934694 -0.8750477 0.9987905 0.8751494 -0.8750466 0.9987905 0.875147 -0.8750451 0.9987904 0.8751439 -0.8750434 0.9987904 0.87514 -0.8750412 0.9987904 0.8751352 -0.8750386 0.9987904 0.8751292 -0.8750355 0.9987903 0.8751217 -0.8750317 0.9987903 0.8751125 -0.8750274 0.9987902 0.8751012 -0.8750225 0.9987902 0.8750876 -0.8750173 0.9987901 0.8750714 -0.8750124 0.99879 0.8750525 -0.8750088 0.9987899 0.8750312 -0.8750084 0.9987897 0.8750084 -0.8750368 0.9987897 0.8750084 -0.8750726 0.9987897 0.8750084 -0.875118 0.9987897 0.8750084 -0.8751754 0.9987897 0.8750084 -0.875248 0.9987897 0.8750084 -0.8753398 0.9987897 0.8750084 -0.875456 0.9987897 0.8750084 -0.8756031 0.9987897 0.8750084 -0.8757891 0.9987897 0.8750084 -0.8760244 0.9987897 0.8750084 -0.8763221 0.9987897 0.8750084 -0.8766987 0.9987897 0.8750084 -0.8771752 0.9987897 0.8750084 -0.877778 0.9987897 0.8750084 -0.8785407 0.9987897 0.8750084 -0.8795055 0.9987897 0.8750084 -0.8807262 0.9987897 0.8750084 -0.8822705 0.9987897 0.8750084 -0.8842242 0.9987897 0.8750084 -0.886696 0.9987897 0.8750084 -0.889823 0.9987897 0.8750084 -0.8937792 0.9987897 0.8750084 -0.8987842 0.9987897 0.8750084 -0.9051163 0.9987897 0.8750084 -0.9131271 0.9987897 0.8750084 -0.9232619 0.9987897 0.8750084 -0.9360836 0.9987897 0.8750084 -0.9523049 0.9987897 0.8750084 -0.9728268 0.9987897 0.8750084 -0.9987897 0.9987897 0.8750084 -0.9990457 0.9780602 0.8989767 -0.9992471 0.9690084 0.9187004 -0.9994058 0.9666937 0.9348042 -0.9995309 0.9680244 0.9478683 -0.9996295 0.9711216 0.9584114 -0.9997074 0.9748843 0.9668844 -0.9997689 0.9786984 0.9736708 -0.9998174 0.9822474 0.9790916 -0.9998557 0.9853912 0.9834122 -0.999886 0.9880901 0.98685 -0.9999099 0.9903583 0.9895817 -0.9999288 0.992236 0.9917499 -0.9999437 0.9937735 0.9934694 -0.8990028 0.9990461 0.8990678 -0.899002 0.9990461 0.8990662 -0.8990011 0.9990461 0.8990642 -0.899 0.9990461 0.8990617 -0.8989986 0.9990461 0.8990586 -0.8989969 0.9990461 0.8990547 -0.8989948 0.9990461 0.8990499 -0.8989923 0.999046 0.8990439 -0.8989895 0.999046 0.8990367 -0.8989863 0.9990459 0.8990279 -0.8989829 0.9990459 0.8990174 -0.8989796 0.9990458 0.8990052 -0.8989771 0.9990458 0.8989915 -0.8989767 0.9990457 0.8989767 -0.8989948 0.9990457 0.8989767 -0.8990177 0.9990457 0.8989767 -0.8990467 0.9990457 0.8989767 -0.8990834 0.9990457 0.8989767 -0.8991298 0.9990457 0.8989767 -0.8991885 0.9990457 0.8989767 -0.8992627 0.9990457 0.8989767 -0.8993566 0.9990457 0.8989767 -0.8994755 0.9990457 0.8989767 -0.8996258 0.9990457 0.8989767 -0.899816 0.9990457 0.8989767 -0.9000567 0.9990457 0.8989767 -0.9003611 0.9990457 0.8989767 -0.9007462 0.9990457 0.8989767 -0.9012335 0.9990457 0.8989767 -0.9018499 0.9990457 0.8989767 -0.9026298 0.9990457 0.8989767 -0.9036165 0.9990457 0.8989767 -0.9048647 0.9990457 0.8989767 -0.9064439 0.9990457 0.8989767 -0.9084417 0.9990457 0.8989767 -0.9109693 0.9990457 0.8989767 -0.914167 0.9990457 0.8989767 -0.9182125 0.9990457 0.8989767 -0.9233306 0.9990457 0.8989767 -0.9298057 0.9990457 0.8989767 -0.9379975 0.9990457 0.8989767 -0.9483611 0.9990457 0.8989767 -0.9614726 0.9990457 0.8989767 -0.9780602 0.9990457 0.8989767 -0.9990457 0.9990457 0.8989767 -0.9992471 0.9823581 0.9187004 -0.9994058 0.9751559 0.9348042 -0.9995309 0.973373 0.9478683 -0.9996295 0.9744944 0.9584114 -0.9997074 0.9770071 0.9668844 -0.9997689 0.9800325 0.9736708 -0.9998174 0.9830848 0.9790916 -0.9998557 0.9859164 0.9834122 -0.999886 0.9884192 0.98685 -0.9999099 0.9905644 0.9895817 -0.9999288 0.992365 0.9917499 -0.9999437 0.9938542 0.9934694 -0.9187175 0.9992474 0.9187589 -0.918717 0.9992474 0.9187579 -0.9187164 0.9992474 0.9187566 -0.9187157 0.9992474 0.918755 -0.9187148 0.9992474 0.918753 -0.9187137 0.9992474 0.9187505 -0.9187123 0.9992473 0.9187474 -0.9187107 0.9992473 0.9187435 -0.9187089 0.9992473 0.9187389 -0.9187068 0.9992473 0.9187332 -0.9187045 0.9992472 0.9187265 -0.9187024 0.9992472 0.9187187 -0.9187008 0.9992472 0.9187099 -0.9187004 0.9992471 0.9187004 -0.9187119 0.9992471 0.9187004 -0.9187265 0.9992471 0.9187004 -0.918745 0.9992471 0.9187004 -0.9187683 0.9992471 0.9187004 -0.9187978 0.9992471 0.9187004 -0.9188351 0.9992471 0.9187004 -0.9188823 0.9992471 0.9187004 -0.9189421 0.9992471 0.9187004 -0.9190177 0.9992471 0.9187004 -0.9191133 0.9992471 0.9187004 -0.9192343 0.9992471 0.9187004 -0.9193874 0.9992471 0.9187004 -0.9195811 0.9992471 0.9187004 -0.9198261 0.9992471 0.9187004 -0.920136 0.9992471 0.9187004 -0.9205282 0.9992471 0.9187004 -0.9210243 0.9992471 0.9187004 -0.9216519 0.9992471 0.9187004 -0.922446 0.9992471 0.9187004 -0.9234506 0.9992471 0.9187004 -0.9247215 0.9992471 0.9187004 -0.9263294 0.9992471 0.9187004 -0.9283635 0.9992471 0.9187004 -0.930937 0.9992471 0.9187004 -0.9341929 0.9992471 0.9187004 -0.9383119 0.9992471 0.9187004 -0.943523 0.9992471 0.9187004 -0.9501157 0.9992471 0.9187004 -0.9584564 0.9992471 0.9187004 -0.9690084 0.9992471 0.9187004 -0.9823581 0.9992471 0.9187004 -0.9992471 0.9992471 0.9187004 -0.9994058 0.9858616 0.9348042 -0.9995309 0.9801397 0.9478683 -0.9996295 0.9787614 0.9584114 -0.9997074 0.9796928 0.9668844 -0.9997689 0.9817203 0.9736708 -0.9998174 0.9841443 0.9790916 -0.9998557 0.9865807 0.9834122 -0.999886 0.9888355 0.98685 -0.9999099 0.9908251 0.9895817 -0.9999288 0.9925282 0.9917499 -0.9999437 0.9939563 0.9934694 -0.9348153 0.999406 0.9348415 -0.9348149 0.999406 0.9348408 -0.9348146 0.999406 0.93484 -0.9348141 0.999406 0.934839 -0.9348135 0.999406 0.9348377 -0.9348128 0.9994059 0.9348361 -0.9348119 0.9994059 0.9348341 -0.9348109 0.9994059 0.9348317 -0.9348097 0.9994059 0.9348287 -0.9348083 0.9994059 0.9348251 -0.9348069 0.9994059 0.9348208 -0.9348055 0.9994059 0.9348158 -0.9348044 0.9994058 0.9348102 -0.9348042 0.9994058 0.9348042 -0.9348115 0.9994058 0.9348042 -0.9348207 0.9994058 0.9348042 -0.9348324 0.9994058 0.9348042 -0.9348472 0.9994058 0.9348042 -0.9348659 0.9994058 0.9348042 -0.9348895 0.9994058 0.9348042 -0.9349195 0.9994058 0.9348042 -0.9349574 0.9994058 0.9348042 -0.9350053 0.9994058 0.9348042 -0.9350659 0.9994058 0.9348042 -0.9351426 0.9994058 0.9348042 -0.9352396 0.9994058 0.9348042 -0.9353624 0.9994058 0.9348042 -0.9355177 0.9994058 0.9348042 -0.9357142 0.9994058 0.9348042 -0.9359628 0.9994058 0.9348042 -0.9362772 0.9994058 0.9348042 -0.9366751 0.9994058 0.9348042 -0.9371784 0.9994058 0.9348042 -0.9378152 0.9994058 0.9348042 -0.9386208 0.9994058 0.9348042 -0.93964 0.9994058 0.9348042 -0.9409295 0.9994058 0.9348042 -0.9425608 0.9994058 0.9348042 -0.9446246 0.9994058 0.9348042 -0.9472356 0.9994058 0.9348042 -0.9505389 0.9994058 0.9348042 -0.9547179 0.9994058 0.9348042 -0.9600049 0.9994058 0.9348042 -0.9666937 0.9994058 0.9348042 -0.9751559 0.9994058 0.9348042 -0.9858616 0.9994058 0.9348042 -0.9994058 0.9994058 0.9348042 -0.9995309 0.9887004 0.9478683 -0.9996295 0.9841597 0.9584114 -0.9997074 0.9830905 0.9668844 -0.9997689 0.9838556 0.9736708 -0.9998174 0.9854846 0.9790916 -0.9998557 0.9874213 0.9834122 -0.999886 0.9893622 0.98685 -0.9999099 0.9911549 0.9895817 -0.9999288 0.9927346 0.9917499 -0.9999437 0.9940855 0.9934694 -0.9478754 0.999531 0.947892 -0.9478752 0.999531 0.9478916 -0.947875 0.999531 0.947891 -0.9478746 0.999531 0.9478904 -0.9478743 0.999531 0.9478896 -0.9478738 0.999531 0.9478886 -0.9478733 0.999531 0.9478873 -0.9478726 0.999531 0.9478858 -0.9478718 0.999531 0.9478839 -0.947871 0.9995309 0.9478816 -0.94787 0.9995309 0.9478789 -0.9478691 0.9995309 0.9478757 -0.9478684 0.9995309 0.9478721 -0.9478683 0.9995309 0.9478683 -0.9478729 0.9995309 0.9478683 -0.9478787 0.9995309 0.9478683 -0.9478861 0.9995309 0.9478683 -0.9478954 0.9995309 0.9478683 -0.9479073 0.9995309 0.9478683 -0.9479222 0.9995309 0.9478683 -0.9479411 0.9995309 0.9478683 -0.9479651 0.9995309 0.9478683 -0.9479954 0.9995309 0.9478683 -0.9480337 0.9995309 0.9478683 -0.9480822 0.9995309 0.9478683 -0.9481435 0.9995309 0.9478683 -0.9482211 0.9995309 0.9478683 -0.9483193 0.9995309 0.9478683 -0.9484434 0.9995309 0.9478683 -0.9486006 0.9995309 0.9478683 -0.9487993 0.9995309 0.9478683 -0.9490508 0.9995309 0.9478683 -0.9493689 0.9995309 0.9478683 -0.9497714 0.9995309 0.9478683 -0.9502806 0.9995309 0.9478683 -0.9509248 0.9995309 0.9478683 -0.9517398 0.9995309 0.9478683 -0.9527709 0.9995309 0.9478683 -0.9540754 0.9995309 0.9478683 -0.9557257 0.9995309 0.9478683 -0.9578135 0.9995309 0.9478683 -0.9604549 0.9995309 0.9478683 -0.9637967 0.9995309 0.9478683 -0.9680244 0.9995309 0.9478683 -0.973373 0.9995309 0.9478683 -0.9801397 0.9995309 0.9478683 -0.9887004 0.9995309 0.9478683 -0.9995309 0.9995309 0.9478683 -0.9996295 0.9909893 0.9584114 -0.9997074 0.9873891 0.9668844 -0.9997689 0.9865571 0.9736708 -0.9998174 0.9871803 0.9790916 -0.9998557 0.9884846 0.9834122 -0.999886 0.9900285 0.98685 -0.9999099 0.9915722 0.9895817 -0.9999288 0.9929958 0.9917499 -0.9999437 0.9942489 0.9934694 -0.958416 0.9996296 0.9584264 -0.9584159 0.9996296 0.9584262 -0.9584157 0.9996296 0.9584258 -0.9584155 0.9996296 0.9584254 -0.9584153 0.9996296 0.9584249 -0.958415 0.9996296 0.9584243 -0.9584146 0.9996296 0.9584235 -0.9584142 0.9996296 0.9584225 -0.9584137 0.9996296 0.9584213 -0.9584132 0.9996296 0.9584198 -0.9584126 0.9996296 0.9584181 -0.958412 0.9996296 0.9584161 -0.9584115 0.9996296 0.9584138 -0.9584114 0.9996295 0.9584114 -0.9584143 0.9996295 0.9584114 -0.958418 0.9996295 0.9584114 -0.9584227 0.9996295 0.9584114 -0.9584286 0.9996295 0.9584114 -0.958436 0.9996295 0.9584114 -0.9584454 0.9996295 0.9584114 -0.9584574 0.9996295 0.9584114 -0.9584725 0.9996295 0.9584114 -0.9584916 0.9996295 0.9584114 -0.9585157 0.9996295 0.9584114 -0.9585463 0.9996295 0.9584114 -0.958585 0.9996295 0.9584114 -0.9586339 0.9996295 0.9584114 -0.9586958 0.9996295 0.9584114 -0.9587741 0.9996295 0.9584114 -0.9588732 0.9996295 0.9584114 -0.9589985 0.9996295 0.9584114 -0.9591571 0.9996295 0.9584114 -0.9593577 0.9996295 0.9584114 -0.9596115 0.9996295 0.9584114 -0.9599326 0.9996295 0.9584114 -0.9603388 0.9996295 0.9584114 -0.9608528 0.9996295 0.9584114 -0.961503 0.9996295 0.9584114 -0.9623255 0.9996295 0.9584114 -0.9633662 0.9996295 0.9584114 -0.9646828 0.9996295 0.9584114 -0.9663484 0.9996295 0.9584114 -0.9684557 0.9996295 0.9584114 -0.9711216 0.9996295 0.9584114 -0.9744944 0.9996295 0.9584114 -0.9787614 0.9996295 0.9584114 -0.9841597 0.9996295 0.9584114 -0.9909893 0.9996295 0.9584114 -0.9996295 0.9996295 0.9584114 -0.9997074 0.9928273 0.9668844 -0.9997689 0.9899748 0.9736708 -0.9998174 0.9893256 0.9790916 -0.9998557 0.98983 0.9834122 -0.999886 0.9908715 0.98685 -0.9999099 0.9921001 0.9895817 -0.9999288 0.9933263 0.9917499 -0.9999437 0.9944557 0.9934694 -0.9668873 0.9997074 0.9668939 -0.9668872 0.9997074 0.9668937 -0.9668871 0.9997074 0.9668935 -0.966887 0.9997074 0.9668933 -0.9668869 0.9997074 0.9668929 -0.9668867 0.9997074 0.9668925 -0.9668865 0.9997074 0.966892 -0.9668862 0.9997074 0.9668914 -0.9668859 0.9997074 0.9668907 -0.9668855 0.9997074 0.9668897 -0.9668852 0.9997074 0.9668887 -0.9668848 0.9997074 0.9668874 -0.9668845 0.9997074 0.9668859 -0.9668844 0.9997074 0.9668844 -0.9668862 0.9997074 0.9668844 -0.9668886 0.9997074 0.9668844 -0.9668915 0.9997074 0.9668844 -0.9668952 0.9997074 0.9668844 -0.9668999 0.9997074 0.9668844 -0.9669058 0.9997074 0.9668844 -0.9669133 0.9997074 0.9668844 -0.9669228 0.9997074 0.9668844 -0.9669349 0.9997074 0.9668844 -0.9669501 0.9997074 0.9668844 -0.9669693 0.9997074 0.9668844 -0.9669937 0.9997074 0.9668844 -0.9670245 0.9997074 0.9668844 -0.9670634 0.9997074 0.9668844 -0.9671127 0.9997074 0.9668844 -0.9671751 0.9997074 0.9668844 -0.9672539 0.9997074 0.9668844 -0.9673538 0.9997074 0.9668844 -0.96748 0.9997074 0.9668844 -0.9676398 0.9997074 0.9668844 -0.9678419 0.9997074 0.9668844 -0.9680976 0.9997074 0.9668844 -0.968421 0.9997074 0.9668844 -0.9688303 0.9997074 0.9668844 -0.969348 0.9997074 0.9668844 -0.970003 0.9997074 0.9668844 -0.9708317 0.9997074 0.9668844 -0.97188 0.9997074 0.9668844 -0.9732063 0.9997074 0.9668844 -0.9748843 0.9997074 0.9668844 -0.9770071 0.9997074 0.9668844 -0.9796928 0.9997074 0.9668844 -0.9830905 0.9997074 0.9668844 -0.9873891 0.9997074 0.9668844 -0.9928273 0.9997074 0.9668844 -0.9997074 0.9997074 0.9668844 -0.9997689 0.9942986 0.9736708 -0.9998174 0.9920397 0.9790916 -0.9998557 0.9915319 0.9834122 -0.999886 0.991938 0.98685 -0.9999099 0.992768 0.9895817 -0.9999288 0.9937443 0.9917499 -0.9999437 0.9947173 0.9934694 -0.9736726 0.9997689 0.9736768 -0.9736726 0.9997689 0.9736767 -0.9736725 0.9997689 0.9736765 -0.9736724 0.9997689 0.9736764 -0.9736723 0.9997689 0.9736762 -0.9736722 0.9997689 0.9736759 -0.9736721 0.9997689 0.9736756 -0.9736719 0.9997689 0.9736752 -0.9736717 0.9997689 0.9736747 -0.9736715 0.9997689 0.9736741 -0.9736712 0.9997689 0.9736734 -0.973671 0.9997689 0.9736726 -0.9736708 0.9997689 0.9736717 -0.9736708 0.9997689 0.9736708 -0.9736719 0.9997689 0.9736708 -0.9736734 0.9997689 0.9736708 -0.9736752 0.9997689 0.9736708 -0.9736776 0.9997689 0.9736708 -0.9736805 0.9997689 0.9736708 -0.9736842 0.9997689 0.9736708 -0.973689 0.9997689 0.9736708 -0.9736949 0.9997689 0.9736708 -0.9737025 0.9997689 0.9736708 -0.973712 0.9997689 0.9736708 -0.9737241 0.9997689 0.9736708 -0.9737394 0.9997689 0.9736708 -0.9737588 0.9997689 0.9736708 -0.9737833 0.9997689 0.9736708 -0.9738142 0.9997689 0.9736708 -0.9738534 0.9997689 0.9736708 -0.973903 0.9997689 0.9736708 -0.9739657 0.9997689 0.9736708 -0.9740451 0.9997689 0.9736708 -0.9741455 0.9997689 0.9736708 -0.9742725 0.9997689 0.9736708 -0.9744332 0.9997689 0.9736708 -0.9746365 0.9997689 0.9736708 -0.9748937 0.9997689 0.9736708 -0.975219 0.9997689 0.9736708 -0.9756307 0.9997689 0.9736708 -0.9761514 0.9997689 0.9736708 -0.9768103 0.9997689 0.9736708 -0.9776438 0.9997689 0.9736708 -0.9786984 0.9997689 0.9736708 -0.9800325 0.9997689 0.9736708 -0.9817203 0.9997689 0.9736708 -0.9838556 0.9997689 0.9736708 -0.9865571 0.9997689 0.9736708 -0.9899748 0.9997689 0.9736708 -0.9942986 0.9997689 0.9736708 -0.9997689 0.9997689 0.9736708 -0.9998174 0.9954733 0.9790916 -0.9998557 0.9936852 0.9834122 -0.999886 0.9932873 0.98685 -0.9999099 0.993613 0.9895817 -0.9999288 0.9942732 0.9917499 -0.9999437 0.9950482 0.9934694 -0.9790927 0.9998174 0.9790953 -0.9790927 0.9998174 0.9790953 -0.9790927 0.9998174 0.9790952 -0.9790926 0.9998174 0.9790951 -0.9790925 0.9998174 0.9790949 -0.9790925 0.9998174 0.9790948 -0.9790924 0.9998174 0.9790946 -0.9790923 0.9998174 0.9790943 -0.9790921 0.9998174 0.979094 -0.979092 0.9998174 0.9790937 -0.9790919 0.9998174 0.9790932 -0.9790917 0.9998174 0.9790927 -0.9790916 0.9998174 0.9790922 -0.9790916 0.9998174 0.9790916 -0.9790923 0.9998174 0.9790916 -0.9790932 0.9998174 0.9790916 -0.9790943 0.9998174 0.9790916 -0.9790958 0.9998174 0.9790916 -0.9790977 0.9998174 0.9790916 -0.9791 0.9998174 0.9790916 -0.979103 0.9998174 0.9790916 -0.9791067 0.9998174 0.9790916 -0.9791115 0.9998174 0.9790916 -0.9791175 0.9998174 0.9790916 -0.979125 0.9998174 0.9790916 -0.9791347 0.9998174 0.9790916 -0.9791468 0.9998174 0.9790916 -0.9791622 0.9998174 0.9790916 -0.9791816 0.9998174 0.9790916 -0.9792062 0.9998174 0.9790916 -0.9792373 0.9998174 0.9790916 -0.9792767 0.9998174 0.9790916 -0.9793265 0.9998174 0.9790916 -0.9793895 0.9998174 0.9790916 -0.9794693 0.9998174 0.9790916 -0.9795701 0.9998174 0.9790916 -0.9796977 0.9998174 0.9790916 -0.9798592 0.9998174 0.9790916 -0.9800634 0.9998174 0.9790916 -0.9803218 0.9998174 0.9790916 -0.9806487 0.9998174 0.9790916 -0.9810622 0.9998174 0.9790916 -0.9815855 0.9998174 0.9790916 -0.9822474 0.9998174 0.9790916 -0.9830848 0.9998174 0.9790916 -0.9841443 0.9998174 0.9790916 -0.9854846 0.9998174 0.9790916 -0.9871803 0.9998174 0.9790916 -0.9893256 0.9998174 0.9790916 -0.9920397 0.9998174 0.9790916 -0.9954733 0.9998174 0.9790916 -0.9998174 0.9998174 0.9790916 -0.9998557 0.9964093 0.9834122 -0.999886 0.9949943 0.98685 -0.9999099 0.9946819 0.9895817 -0.9999288 0.9949423 0.9917499 -0.9999437 0.9954668 0.9934694 -0.9834129 0.9998557 0.9834146 -0.9834129 0.9998557 0.9834145 -0.9834129 0.9998557 0.9834145 -0.9834129 0.9998557 0.9834144 -0.9834128 0.9998557 0.9834143 -0.9834128 0.9998557 0.9834142 -0.9834127 0.9998557 0.9834141 -0.9834127 0.9998557 0.9834139 -0.9834126 0.9998557 0.9834138 -0.9834125 0.9998557 0.9834135 -0.9834124 0.9998557 0.9834133 -0.9834123 0.9998557 0.9834129 -0.9834122 0.9998557 0.9834126 -0.9834122 0.9998557 0.9834122 -0.9834127 0.9998557 0.9834122 -0.9834132 0.9998557 0.9834122 -0.9834139 0.9998557 0.9834122 -0.9834149 0.9998557 0.9834122 -0.983416 0.9998557 0.9834122 -0.9834175 0.9998557 0.9834122 -0.9834194 0.9998557 0.9834122 -0.9834217 0.9998557 0.9834122 -0.9834247 0.9998557 0.9834122 -0.9834284 0.9998557 0.9834122 -0.9834332 0.9998557 0.9834122 -0.9834392 0.9998557 0.9834122 -0.9834468 0.9998557 0.9834122 -0.9834565 0.9998557 0.9834122 -0.9834687 0.9998557 0.9834122 -0.9834841 0.9998557 0.9834122 -0.9835036 0.9998557 0.9834122 -0.9835283 0.9998557 0.9834122 -0.9835595 0.9998557 0.9834122 -0.9835991 0.9998557 0.9834122 -0.9836491 0.9998557 0.9834122 -0.9837123 0.9998557 0.9834122 -0.9837923 0.9998557 0.9834122 -0.9838936 0.9998557 0.9834122 -0.9840216 0.9998557 0.9834122 -0.9841837 0.9998557 0.9834122 -0.9843887 0.9998557 0.9834122 -0.984648 0.9998557 0.9834122 -0.9849761 0.9998557 0.9834122 -0.9853912 0.9998557 0.9834122 -0.9859164 0.9998557 0.9834122 -0.9865807 0.9998557 0.9834122 -0.9874213 0.9998557 0.9834122 -0.9884846 0.9998557 0.9834122 -0.98983 0.9998557 0.9834122 -0.9915319 0.9998557 0.9834122 -0.9936852 0.9998557 0.9834122 -0.9964093 0.9998557 0.9834122 -0.9998557 0.9998557 0.9834122 -0.999886 0.9971538 0.98685 -0.9999099 0.9960343 0.9895817 -0.9999288 0.9957888 0.9917499 -0.9999437 0.9959965 0.9934694 -0.9868505 0.999886 0.9868515 -0.9868505 0.999886 0.9868515 -0.9868505 0.999886 0.9868515 -0.9868505 0.999886 0.9868514 -0.9868504 0.999886 0.9868514 -0.9868504 0.999886 0.9868513 -0.9868504 0.999886 0.9868512 -0.9868503 0.999886 0.9868511 -0.9868503 0.999886 0.986851 -0.9868502 0.999886 0.9868509 -0.9868502 0.999886 0.9868507 -0.9868501 0.999886 0.9868505 -0.9868501 0.999886 0.9868503 -0.98685 0.999886 0.98685 -0.9868503 0.999886 0.98685 -0.9868507 0.999886 0.98685 -0.9868511 0.999886 0.98685 -0.9868517 0.999886 0.98685 -0.9868524 0.999886 0.98685 -0.9868534 0.999886 0.98685 -0.9868545 0.999886 0.98685 -0.986856 0.999886 0.98685 -0.9868579 0.999886 0.98685 -0.9868602 0.999886 0.98685 -0.9868632 0.999886 0.98685 -0.986867 0.999886 0.98685 -0.9868717 0.999886 0.98685 -0.9868778 0.999886 0.98685 -0.9868854 0.999886 0.98685 -0.9868951 0.999886 0.98685 -0.9869073 0.999886 0.98685 -0.9869228 0.999886 0.98685 -0.9869424 0.999886 0.98685 -0.9869671 0.999886 0.98685 -0.9869985 0.999886 0.98685 -0.9870381 0.999886 0.98685 -0.9870882 0.999886 0.98685 -0.9871517 0.999886 0.98685 -0.9872319 0.999886 0.98685 -0.9873335 0.999886 0.98685 -0.9874619 0.999886 0.98685 -0.9876244 0.999886 0.98685 -0.98783 0.999886 0.98685 -0.9880901 0.999886 0.98685 -0.9884192 0.999886 0.98685 -0.9888355 0.999886 0.98685 -0.9893622 0.999886 0.98685 -0.9900285 0.999886 0.98685 -0.9908715 0.999886 0.98685 -0.991938 0.999886 0.98685 -0.9932873 0.999886 0.98685 -0.9949943 0.999886 0.98685 -0.9971538 0.999886 0.98685 -0.999886 0.999886 0.98685 -0.9999099 0.9977453 0.9895817 -0.9999288 0.9968598 0.9917499 -0.9999437 0.9966666 0.9934694 -0.989582 0.9999099 0.9895826 -0.989582 0.9999099 0.9895826 -0.989582 0.9999099 0.9895826 -0.989582 0.9999099 0.9895826 -0.989582 0.9999099 0.9895826 -0.9895819 0.9999099 0.9895825 -0.9895819 0.9999099 0.9895825 -0.9895819 0.9999099 0.9895824 -0.9895819 0.9999099 0.9895823 -0.9895818 0.9999099 0.9895822 -0.9895818 0.9999099 0.9895821 -0.9895818 0.9999099 0.989582 -0.9895817 0.9999099 0.9895819 -0.9895817 0.9999099 0.9895817 -0.9895819 0.9999099 0.9895817 -0.9895821 0.9999099 0.9895817 -0.9895824 0.9999099 0.9895817 -0.9895828 0.9999099 0.9895817 -0.9895832 0.9999099 0.9895817 -0.9895838 0.9999099 0.9895817 -0.9895845 0.9999099 0.9895817 -0.9895854 0.9999099 0.9895817 -0.9895866 0.9999099 0.9895817 -0.9895881 0.9999099 0.9895817 -0.98959 0.9999099 0.9895817 -0.9895923 0.9999099 0.9895817 -0.9895953 0.9999099 0.9895817 -0.9895991 0.9999099 0.9895817 -0.9896039 0.9999099 0.9895817 -0.9896099 0.9999099 0.9895817 -0.9896176 0.9999099 0.9895817 -0.9896273 0.9999099 0.9895817 -0.9896395 0.9999099 0.9895817 -0.989655 0.9999099 0.9895817 -0.9896747 0.9999099 0.9895817 -0.9896995 0.9999099 0.9895817 -0.9897309 0.9999099 0.9895817 -0.9897706 0.9999099 0.9895817 -0.9898209 0.9999099 0.9895817 -0.9898845 0.9999099 0.9895817 -0.9899649 0.9999099 0.9895817 -0.9900667 0.9999099 0.9895817 -0.9901954 0.9999099 0.9895817 -0.9903583 0.9999099 0.9895817 -0.9905644 0.9999099 0.9895817 -0.9908251 0.9999099 0.9895817 -0.9911549 0.9999099 0.9895817 -0.9915722 0.9999099 0.9895817 -0.9921001 0.9999099 0.9895817 -0.992768 0.9999099 0.9895817 -0.993613 0.9999099 0.9895817 -0.9946819 0.9999099 0.9895817 -0.9960343 0.9999099 0.9895817 -0.9977453 0.9999099 0.9895817 -0.9999099 0.9999099 0.9895817 -0.9999288 0.9982147 0.9917499 -0.9999437 0.9975143 0.9934694 -0.9917501 0.9999288 0.9917505 -0.9917501 0.9999288 0.9917505 -0.9917501 0.9999288 0.9917505 -0.9917501 0.9999288 0.9917505 -0.9917501 0.9999288 0.9917504 -0.9917501 0.9999288 0.9917504 -0.99175 0.9999288 0.9917504 -0.99175 0.9999288 0.9917503 -0.99175 0.9999288 0.9917503 -0.99175 0.9999288 0.9917502 -0.99175 0.9999288 0.9917502 -0.9917499 0.9999288 0.9917501 -0.9917499 0.9999288 0.99175 -0.9917499 0.9999288 0.9917499 -0.99175 0.9999288 0.9917499 -0.9917502 0.9999288 0.9917499 -0.9917503 0.9999288 0.9917499 -0.9917506 0.9999288 0.9917499 -0.9917509 0.9999288 0.9917499 -0.9917512 0.9999288 0.9917499 -0.9917517 0.9999288 0.9917499 -0.9917522 0.9999288 0.9917499 -0.991753 0.9999288 0.9917499 -0.9917539 0.9999288 0.9917499 -0.9917551 0.9999288 0.9917499 -0.9917565 0.9999288 0.9917499 -0.9917584 0.9999288 0.9917499 -0.9917608 0.9999288 0.9917499 -0.9917638 0.9999288 0.9917499 -0.9917676 0.9999288 0.9917499 -0.9917724 0.9999288 0.9917499 -0.9917784 0.9999288 0.9917499 -0.9917861 0.9999288 0.9917499 -0.9917958 0.9999288 0.9917499 -0.9918081 0.9999288 0.9917499 -0.9918236 0.9999288 0.9917499 -0.9918433 0.9999288 0.9917499 -0.9918681 0.9999288 0.9917499 -0.9918996 0.9999288 0.9917499 -0.9919394 0.9999288 0.9917499 -0.9919898 0.9999288 0.9917499 -0.9920535 0.9999288 0.9917499 -0.992134 0.9999288 0.9917499 -0.992236 0.9999288 0.9917499 -0.992365 0.9999288 0.9917499 -0.9925282 0.9999288 0.9917499 -0.9927346 0.9999288 0.9917499 -0.9929958 0.9999288 0.9917499 -0.9933263 0.9999288 0.9917499 -0.9937443 0.9999288 0.9917499 -0.9942732 0.9999288 0.9917499 -0.9949423 0.9999288 0.9917499 -0.9957888 0.9999288 0.9917499 -0.9968598 0.9999288 0.9917499 -0.9982147 0.9999288 0.9917499 -0.9999288 0.9999288 0.9917499 -0.9999437 0.9985869 0.9934694 -0.9934695 0.9999437 0.9934697 -0.9934695 0.9999437 0.9934697 -0.9934695 0.9999437 0.9934697 -0.9934695 0.9999437 0.9934697 -0.9934695 0.9999437 0.9934697 -0.9934695 0.9999437 0.9934697 -0.9934695 0.9999437 0.9934697 -0.9934694 0.9999437 0.9934696 -0.9934694 0.9999437 0.9934696 -0.9934694 0.9999437 0.9934696 -0.9934694 0.9999437 0.9934695 -0.9934694 0.9999437 0.9934695 -0.9934694 0.9999437 0.9934694 -0.9934694 0.9999437 0.9934694 -0.9934694 0.9999437 0.9934694 -0.9934695 0.9999437 0.9934694 -0.9934696 0.9999437 0.9934694 -0.9934698 0.9999437 0.9934694 -0.99347 0.9999437 0.9934694 -0.9934702 0.9999437 0.9934694 -0.9934705 0.9999437 0.9934694 -0.9934708 0.9999437 0.9934694 -0.9934713 0.9999437 0.9934694 -0.9934719 0.9999437 0.9934694 -0.9934726 0.9999437 0.9934694 -0.9934735 0.9999437 0.9934694 -0.9934747 0.9999437 0.9934694 -0.9934762 0.9999437 0.9934694 -0.9934781 0.9999437 0.9934694 -0.9934804 0.9999437 0.9934694 -0.9934834 0.9999437 0.9934694 -0.9934872 0.9999437 0.9934694 -0.993492 0.9999437 0.9934694 -0.9934981 0.9999437 0.9934694 -0.9935058 0.9999437 0.9934694 -0.9935155 0.9999437 0.9934694 -0.9935278 0.9999437 0.9934694 -0.9935434 0.9999437 0.9934694 -0.993563 0.9999437 0.9934694 -0.9935879 0.9999437 0.9934694 -0.9936194 0.9999437 0.9934694 -0.9936593 0.9999437 0.9934694 -0.9937097 0.9999437 0.9934694 -0.9937735 0.9999437 0.9934694 -0.9938542 0.9999437 0.9934694 -0.9939563 0.9999437 0.9934694 -0.9940855 0.9999437 0.9934694 -0.9942489 0.9999437 0.9934694 -0.9944557 0.9999437 0.9934694 -0.9947173 0.9999437 0.9934694 -0.9950482 0.9999437 0.9934694 -0.9954668 0.9999437 0.9934694 -0.9959965 0.9999437 0.9934694 -0.9966666 0.9999437 0.9934694 -0.9975143 0.9999437 0.9934694 -0.9985869 0.9999437 0.9934694 -0.9999437 0.9999437 0.9934694 -0.0000238 0.0000238 0.0506267 -0.0005417 0.0000238 0.0506267 -0.0011968 0.0000238 0.0506267 -0.0020256 0.0000238 0.0506267 -0.0030742 0.0000238 0.0506267 -0.0044007 0.0000238 0.0506267 -0.006079 0.0000238 0.0506267 -0.0082023 0.0000238 0.0506267 -0.0108885 0.0000238 0.0506267 -0.0142868 0.0000238 0.0506267 -0.0185862 0.0000238 0.0506267 -0.0240255 0.0000238 0.0506267 -0.0309069 0.0000238 0.0506267 -0.0396127 0.0000238 0.0506267 -0.0506267 0.0000238 0.0506267 -0.0645609 0.0000238 0.0506267 -0.0821895 0.0000238 0.0506267 -0.1044919 0.0000238 0.0506267 -0.1327073 0.0000238 0.0506267 -0.1684036 0.0000238 0.0506267 -0.2135639 0.0000238 0.0506267 -0.2706977 0.0000238 0.0506267 -0.3429792 0.0000238 0.0506267 -0.4344249 0.0000238 0.0506267 -0.5501155 0.0000238 0.0506267 -0.6964791 0.0000238 0.0506267 -0.8407292 0.0051514 0.0531113 -0.9033413 0.0279321 0.0676299 -0.9354466 0.0624569 0.0937372 -0.9545467 0.1059991 0.1300248 -0.9669269 0.1572498 0.1753664 -0.9754027 0.2151269 0.2285707 -0.9814251 0.2783684 0.2881937 -0.9858181 0.3454107 0.352484 -0.9890841 0.4144197 0.4194363 -0.9915469 0.4834235 0.4869294 -0.993424 0.5504963 0.5529117 -0.9948662 0.6139459 0.6155878 -0.9959813 0.6724572 0.6735594 -0.9968475 0.7251659 0.7258976 -0.997523 0.7716588 0.7721396 -0.9980513 0.8119154 0.8122285 -0.9984653 0.8462171 0.8464195 -0.9987905 0.8750477 0.8751778 -0.9990461 0.8990028 0.8990859 -0.9992474 0.9187175 0.9187704 -0.999406 0.9348153 0.9348488 -0.999531 0.9478754 0.9478966 -0.9996296 0.958416 0.9584293 -0.9997074 0.9668873 0.9668957 -0.9997689 0.9736726 0.9736779 -0.9998174 0.9790927 0.979096 -0.9998557 0.9834129 0.983415 -0.999886 0.9868505 0.9868518 -0.9999099 0.989582 0.9895828 -0.9999288 0.9917501 0.9917506 -0.9999437 0.9934695 0.9934698 -0.0000238 0.0005417 0.0506267 -0.0000382 0.0000382 0.0501232 -0.0006933 0.0000382 0.0501232 -0.0015221 0.0000382 0.0501232 -0.0025707 0.0000382 0.0501232 -0.0038972 0.0000382 0.0501232 -0.0055755 0.0000382 0.0501232 -0.0076988 0.0000382 0.0501232 -0.0103849 0.0000382 0.0501232 -0.0137833 0.0000382 0.0501232 -0.0180827 0.0000382 0.0501232 -0.023522 0.0000382 0.0501232 -0.0304033 0.0000382 0.0501232 -0.0391092 0.0000382 0.0501232 -0.0501232 0.0000382 0.0501232 -0.0640574 0.0000382 0.0501232 -0.081686 0.0000382 0.0501232 -0.1039884 0.0000382 0.0501232 -0.1322038 0.0000382 0.0501232 -0.1679 0.0000382 0.0501232 -0.2130604 0.0000382 0.0501232 -0.2701941 0.0000382 0.0501232 -0.3424757 0.0000382 0.0501232 -0.4339214 0.0000382 0.0501232 -0.549612 0.0000382 0.0501232 -0.6959756 0.0000382 0.0501232 -0.8405071 0.0051286 0.0526143 -0.9032596 0.0278872 0.0671953 -0.9354101 0.0624063 0.0933783 -0.9545286 0.1059489 0.1297365 -0.9669173 0.1572031 0.1751393 -0.9753975 0.2150852 0.2283945 -0.9814221 0.2783325 0.2880591 -0.9858163 0.3453807 0.3523828 -0.9890831 0.4143955 0.4193615 -0.9915463 0.4834045 0.4868749 -0.9934236 0.5504818 0.5528728 -0.994866 0.6139352 0.6155604 -0.9959811 0.6724495 0.6735405 -0.9968474 0.7251605 0.7258847 -0.997523 0.7716551 0.7721309 -0.9980512 0.8119128 0.8122228 -0.9984653 0.8462154 0.8464157 -0.9987905 0.8750466 0.8751753 -0.9990461 0.899002 0.8990843 -0.9992474 0.918717 0.9187694 -0.999406 0.9348149 0.9348481 -0.999531 0.9478752 0.9478962 -0.9996296 0.9584159 0.9584291 -0.9997074 0.9668872 0.9668956 -0.9997689 0.9736726 0.9736778 -0.9998174 0.9790927 0.979096 -0.9998557 0.9834129 0.983415 -0.999886 0.9868505 0.9868518 -0.9999099 0.989582 0.9895828 -0.9999288 0.9917501 0.9917506 -0.9999437 0.9934695 0.9934698 -0.0000238 0.0011968 0.0506267 -0.0000382 0.0006933 0.0501232 -0.0000611 0.0000611 0.049491 -0.0008899 0.0000611 0.049491 -0.0019385 0.0000611 0.049491 -0.003265 0.0000611 0.049491 -0.0049433 0.0000611 0.049491 -0.0070666 0.0000611 0.049491 -0.0097527 0.0000611 0.049491 -0.0131511 0.0000611 0.049491 -0.0174505 0.0000611 0.049491 -0.0228898 0.0000611 0.049491 -0.0297711 0.0000611 0.049491 -0.038477 0.0000611 0.049491 -0.049491 0.0000611 0.049491 -0.0634252 0.0000611 0.049491 -0.0810538 0.0000611 0.049491 -0.1033562 0.0000611 0.049491 -0.1315716 0.0000611 0.049491 -0.1672678 0.0000611 0.049491 -0.2124282 0.0000611 0.049491 -0.2695619 0.0000611 0.049491 -0.3418435 0.0000611 0.049491 -0.4332891 0.0000611 0.049491 -0.5489798 0.0000611 0.049491 -0.6953434 0.0000611 0.049491 -0.8402274 0.0051047 0.0519898 -0.9031567 0.0278347 0.0666492 -0.9353643 0.0623458 0.0929273 -0.9545059 0.1058883 0.1293745 -0.9669053 0.1571463 0.1748539 -0.9753908 0.2150342 0.2281732 -0.9814183 0.2782884 0.2878901 -0.9858141 0.3453439 0.3522557 -0.9890818 0.4143657 0.4192674 -0.9915455 0.4833811 0.4868065 -0.9934231 0.550464 0.5528239 -0.9948657 0.6139219 0.615526 -0.9959809 0.6724399 0.6735167 -0.9968473 0.7251537 0.7258685 -0.9975229 0.7716504 0.77212 -0.9980512 0.8119096 0.8122156 -0.9984653 0.8462132 0.846411 -0.9987904 0.8750451 0.8751722 -0.9990461 0.8990011 0.8990823 -0.9992474 0.9187164 0.9187681 -0.999406 0.9348146 0.9348473 -0.999531 0.947875 0.9478957 -0.9996296 0.9584157 0.9584288 -0.9997074 0.9668871 0.9668954 -0.9997689 0.9736725 0.9736777 -0.9998174 0.9790927 0.9790959 -0.9998557 0.9834129 0.9834149 -0.999886 0.9868505 0.9868518 -0.9999099 0.989582 0.9895828 -0.9999288 0.9917501 0.9917506 -0.9999437 0.9934695 0.9934698 -0.0000238 0.0020256 0.0506267 -0.0000382 0.0015221 0.0501232 -0.0000611 0.0008899 0.049491 -0.0000978 0.0000978 0.0486989 -0.0011463 0.0000978 0.0486989 -0.0024729 0.0000978 0.0486989 -0.0041512 0.0000978 0.0486989 -0.0062744 0.0000978 0.0486989 -0.0089606 0.0000978 0.0486989 -0.012359 0.0000978 0.0486989 -0.0166583 0.0000978 0.0486989 -0.0220976 0.0000978 0.0486989 -0.028979 0.0000978 0.0486989 -0.0376849 0.0000978 0.0486989 -0.0486989 0.0000978 0.0486989 -0.0626331 0.0000978 0.0486989 -0.0802616 0.0000978 0.0486989 -0.102564 0.0000978 0.0486989 -0.1307795 0.0000978 0.0486989 -0.1664757 0.0000978 0.0486989 -0.2116361 0.0000978 0.0486989 -0.2687698 0.0000978 0.0486989 -0.3410514 0.0000978 0.0486989 -0.432497 0.0000978 0.0486989 -0.5481876 0.0000978 0.0486989 -0.6945513 0.0000978 0.0486989 -0.8398756 0.0050826 0.0512068 -0.9030276 0.0277752 0.0659642 -0.9353068 0.0622749 0.0923618 -0.9544774 0.1058162 0.1289204 -0.9668902 0.1570779 0.1744962 -0.9753825 0.2149725 0.2278958 -0.9814136 0.2782347 0.2876782 -0.9858113 0.3452987 0.3520964 -0.9890801 0.414329 0.4191496 -0.9915446 0.4833522 0.4867208 -0.9934225 0.5504419 0.5527626 -0.9948653 0.6139056 0.615483 -0.9959807 0.672428 0.6734869 -0.9968472 0.7251454 0.7258482 -0.9975228 0.7716446 0.7721064 -0.9980511 0.8119057 0.8122065 -0.9984653 0.8462106 0.8464051 -0.9987904 0.8750434 0.8751683 -0.9990461 0.899 0.8990798 -0.9992474 0.9187157 0.9187665 -0.999406 0.9348141 0.9348463 -0.999531 0.9478746 0.947895 -0.9996296 0.9584155 0.9584283 -0.9997074 0.966887 0.9668951 -0.9997689 0.9736724 0.9736775 -0.9998174 0.9790926 0.9790958 -0.9998557 0.9834129 0.9834149 -0.999886 0.9868505 0.9868517 -0.9999099 0.989582 0.9895828 -0.9999288 0.9917501 0.9917506 -0.9999437 0.9934695 0.9934698 -0.0000238 0.0030742 0.0506267 -0.0000382 0.0025707 0.0501232 -0.0000611 0.0019385 0.049491 -0.0000978 0.0011463 0.0486989 -0.0001565 0.0001565 0.047709 -0.001483 0.0001565 0.047709 -0.0031613 0.0001565 0.047709 -0.0052846 0.0001565 0.047709 -0.0079707 0.0001565 0.047709 -0.0113691 0.0001565 0.047709 -0.0156685 0.0001565 0.047709 -0.0211078 0.0001565 0.047709 -0.0279891 0.0001565 0.047709 -0.036695 0.0001565 0.047709 -0.047709 0.0001565 0.047709 -0.0616432 0.0001565 0.047709 -0.0792718 0.0001565 0.047709 -0.1015742 0.0001565 0.047709 -0.1297896 0.0001565 0.047709 -0.1654858 0.0001565 0.047709 -0.2106462 0.0001565 0.047709 -0.2677799 0.0001565 0.047709 -0.3400615 0.0001565 0.047709 -0.4315072 0.0001565 0.047709 -0.5471978 0.0001565 0.047709 -0.6935614 0.0001565 0.047709 -0.8394338 0.0050676 0.0502275 -0.9028657 0.0277111 0.0651072 -0.9352348 0.0621943 0.0916543 -0.9544418 0.1057322 0.1283525 -0.9668714 0.1569971 0.1740488 -0.9753721 0.2148987 0.2275489 -0.9814076 0.2781701 0.2874132 -0.9858079 0.3452442 0.3518972 -0.9890781 0.4142845 0.4190022 -0.9915433 0.4833171 0.4866137 -0.9934218 0.550415 0.552686 -0.9948649 0.6138855 0.6154291 -0.9959804 0.6724135 0.6734497 -0.996847 0.7251351 0.7258228 -0.9975227 0.7716375 0.7720893 -0.9980511 0.8119009 0.8121952 -0.9984652 0.8462073 0.8463976 -0.9987904 0.8750412 0.8751635 -0.9990461 0.8989986 0.8990767 -0.9992474 0.9187148 0.9187645 -0.999406 0.9348135 0.934845 -0.999531 0.9478743 0.9478942 -0.9996296 0.9584153 0.9584278 -0.9997074 0.9668869 0.9668948 -0.9997689 0.9736723 0.9736773 -0.9998174 0.9790925 0.9790957 -0.9998557 0.9834128 0.9834148 -0.999886 0.9868504 0.9868517 -0.9999099 0.989582 0.9895827 -0.9999288 0.9917501 0.9917505 -0.9999437 0.9934695 0.9934698 -0.0000238 0.0044007 0.0506267 -0.0000382 0.0038972 0.0501232 -0.0000611 0.003265 0.049491 -0.0000978 0.0024729 0.0486989 -0.0001565 0.001483 0.047709 -0.0002504 0.0002504 0.0464764 -0.0019287 0.0002504 0.0464764 -0.004052 0.0002504 0.0464764 -0.0067381 0.0002504 0.0464764 -0.0101365 0.0002504 0.0464764 -0.0144359 0.0002504 0.0464764 -0.0198752 0.0002504 0.0464764 -0.0267565 0.0002504 0.0464764 -0.0354624 0.0002504 0.0464764 -0.0464764 0.0002504 0.0464764 -0.0604106 0.0002504 0.0464764 -0.0780392 0.0002504 0.0464764 -0.1003416 0.0002504 0.0464764 -0.128557 0.0002504 0.0464764 -0.1642532 0.0002504 0.0464764 -0.2094136 0.0002504 0.0464764 -0.2665473 0.0002504 0.0464764 -0.3388289 0.0002504 0.0464764 -0.4302746 0.0002504 0.0464764 -0.5459652 0.0002504 0.0464764 -0.6923288 0.0002504 0.0464764 -0.8388802 0.0050694 0.0490065 -0.9026634 0.0276479 0.0640384 -0.9351449 0.0621069 0.090772 -0.9543974 0.1056375 0.1276445 -0.9668479 0.156904 0.1734912 -0.9753591 0.2148124 0.2271165 -0.9814002 0.2780936 0.2870831 -0.9858036 0.3451791 0.351649 -0.9890755 0.4142311 0.4188187 -0.9915418 0.4832747 0.4864802 -0.9934209 0.5503825 0.5525906 -0.9948643 0.6138613 0.6153621 -0.9959801 0.6723959 0.6734033 -0.9968468 0.7251226 0.7257912 -0.9975226 0.7716288 0.7720681 -0.998051 0.8118949 0.8121811 -0.9984652 0.8462034 0.8463884 -0.9987904 0.8750386 0.8751575 -0.9990461 0.8989969 0.8990728 -0.9992474 0.9187137 0.918762 -0.9994059 0.9348128 0.9348434 -0.999531 0.9478738 0.9478932 -0.9996296 0.958415 0.9584272 -0.9997074 0.9668867 0.9668944 -0.9997689 0.9736722 0.973677 -0.9998174 0.9790925 0.9790955 -0.9998557 0.9834128 0.9834147 -0.999886 0.9868504 0.9868516 -0.9999099 0.9895819 0.9895827 -0.9999288 0.9917501 0.9917505 -0.9999437 0.9934695 0.9934698 -0.0000238 0.006079 0.0506267 -0.0000382 0.0055755 0.0501232 -0.0000611 0.0049433 0.049491 -0.0000978 0.0041512 0.0486989 -0.0001565 0.0031613 0.047709 -0.0002504 0.0019287 0.0464764 -0.0004008 0.0004008 0.0449485 -0.0025241 0.0004008 0.0449485 -0.0052103 0.0004008 0.0449485 -0.0086086 0.0004008 0.0449485 -0.012908 0.0004008 0.0449485 -0.0183473 0.0004008 0.0449485 -0.0252287 0.0004008 0.0449485 -0.0339345 0.0004008 0.0449485 -0.0449485 0.0004008 0.0449485 -0.0588827 0.0004008 0.0449485 -0.0765113 0.0004008 0.0449485 -0.0988137 0.0004008 0.0449485 -0.1270291 0.0004008 0.0449485 -0.1627254 0.0004008 0.0449485 -0.2078857 0.0004008 0.0449485 -0.2650195 0.0004008 0.0449485 -0.337301 0.0004008 0.0449485 -0.4287467 0.0004008 0.0449485 -0.5444373 0.0004008 0.0449485 -0.6908009 0.0004008 0.0449485 -0.8381886 0.0051048 0.0474909 -0.9024114 0.0275966 0.0627109 -0.9350332 0.0620199 0.0896764 -0.9543421 0.1055364 0.1267655 -0.9668187 0.1568008 0.1727991 -0.975343 0.2147144 0.2265801 -0.9813911 0.2780055 0.2866736 -0.9857982 0.3451032 0.3513412 -0.9890723 0.4141683 0.4185911 -0.9915399 0.4832246 0.4863147 -0.9934197 0.5503438 0.5524723 -0.9948636 0.6138323 0.6152789 -0.9959797 0.6723748 0.6733458 -0.9968465 0.7251076 0.725752 -0.9975224 0.7716184 0.7720418 -0.9980509 0.8118878 0.8121636 -0.9984651 0.8461986 0.8463769 -0.9987903 0.8750355 0.87515 -0.9990461 0.8989948 0.899068 -0.9992473 0.9187123 0.9187589 -0.9994059 0.9348119 0.9348414 -0.999531 0.9478733 0.9478919 -0.9996296 0.9584146 0.9584264 -0.9997074 0.9668865 0.9668939 -0.9997689 0.9736721 0.9736767 -0.9998174 0.9790924 0.9790953 -0.9998557 0.9834127 0.9834146 -0.999886 0.9868504 0.9868515 -0.9999099 0.9895819 0.9895826 -0.9999288 0.99175 0.9917505 -0.9999437 0.9934695 0.9934697 -0.0000238 0.0082023 0.0506267 -0.0000382 0.0076988 0.0501232 -0.0000611 0.0070666 0.049491 -0.0000978 0.0062744 0.0486989 -0.0001565 0.0052846 0.047709 -0.0002504 0.004052 0.0464764 -0.0004008 0.0025241 0.0449485 -0.0006416 0.0006416 0.043066 -0.0033277 0.0006416 0.043066 -0.0067261 0.0006416 0.043066 -0.0110255 0.0006416 0.043066 -0.0164648 0.0006416 0.043066 -0.0233461 0.0006416 0.043066 -0.032052 0.0006416 0.043066 -0.043066 0.0006416 0.043066 -0.0570002 0.0006416 0.043066 -0.0746288 0.0006416 0.043066 -0.0969312 0.0006416 0.043066 -0.1251466 0.0006416 0.043066 -0.1608428 0.0006416 0.043066 -0.2060032 0.0006416 0.043066 -0.2631369 0.0006416 0.043066 -0.3354185 0.0006416 0.043066 -0.4268641 0.0006416 0.043066 -0.5425548 0.0006416 0.043066 -0.6889184 0.0006416 0.043066 -0.8373283 0.0052028 0.0456203 -0.9020992 0.0275778 0.0610714 -0.9348949 0.0619473 0.0883235 -0.9542739 0.1054384 0.1256805 -0.9667827 0.1566936 0.1719451 -0.9753231 0.2146085 0.2259183 -0.9813797 0.2779077 0.2861685 -0.9857916 0.3450175 0.3509616 -0.9890684 0.4140964 0.4183104 -0.9915376 0.4831666 0.4861106 -0.9934183 0.5502987 0.5523265 -0.9948628 0.6137984 0.6151764 -0.9959791 0.67235 0.6732749 -0.9968462 0.7250899 0.7257037 -0.9975222 0.7716061 0.7720094 -0.9980508 0.8118794 0.8121421 -0.998465 0.8461929 0.8463627 -0.9987903 0.8750317 0.8751408 -0.999046 0.8989923 0.899062 -0.9992473 0.9187107 0.9187551 -0.9994059 0.9348109 0.934839 -0.999531 0.9478726 0.9478904 -0.9996296 0.9584142 0.9584254 -0.9997074 0.9668862 0.9668932 -0.9997689 0.9736719 0.9736763 -0.9998174 0.9790923 0.9790951 -0.9998557 0.9834127 0.9834144 -0.999886 0.9868503 0.9868514 -0.9999099 0.9895819 0.9895826 -0.9999288 0.99175 0.9917505 -0.9999437 0.9934694 0.9934697 -0.0000238 0.0108885 0.0506267 -0.0000382 0.0103849 0.0501232 -0.0000611 0.0097527 0.049491 -0.0000978 0.0089606 0.0486989 -0.0001565 0.0079707 0.047709 -0.0002504 0.0067381 0.0464764 -0.0004008 0.0052103 0.0449485 -0.0006416 0.0033277 0.043066 -0.0010268 0.0010268 0.0407651 -0.0044252 0.0010268 0.0407651 -0.0087246 0.0010268 0.0407651 -0.0141639 0.0010268 0.0407651 -0.0210452 0.0010268 0.0407651 -0.0297511 0.0010268 0.0407651 -0.0407651 0.0010268 0.0407651 -0.0546993 0.0010268 0.0407651 -0.0723279 0.0010268 0.0407651 -0.0946303 0.0010268 0.0407651 -0.1228457 0.0010268 0.0407651 -0.1585419 0.0010268 0.0407651 -0.2037023 0.0010268 0.0407651 -0.260836 0.0010268 0.0407651 -0.3331176 0.0010268 0.0407651 -0.4245633 0.0010268 0.0407651 -0.5402539 0.0010268 0.0407651 -0.6866175 0.0010268 0.0407651 -0.8362644 0.0054121 0.0433291 -0.9017148 0.0276281 0.0590616 -0.9347252 0.061916 0.0866656 -0.9541902 0.1053624 0.1243513 -0.9667385 0.1565954 0.1708992 -0.9752987 0.2145034 0.2251082 -0.9813659 0.2778058 0.2855503 -0.9857835 0.3449254 0.3504972 -0.9890637 0.4140176 0.4179671 -0.9915347 0.4831021 0.4858611 -0.9934166 0.550248 0.5521481 -0.9948617 0.6137599 0.6150511 -0.9959785 0.6723217 0.6731883 -0.9968458 0.7250697 0.7256447 -0.997522 0.7715919 0.7719697 -0.9980506 0.8118697 0.8121158 -0.9984649 0.8461864 0.8463455 -0.9987902 0.8750274 0.8751295 -0.999046 0.8989895 0.8990548 -0.9992473 0.9187089 0.9187504 -0.9994059 0.9348097 0.934836 -0.999531 0.9478718 0.9478885 -0.9996296 0.9584137 0.9584242 -0.9997074 0.9668859 0.9668925 -0.9997689 0.9736717 0.9736759 -0.9998174 0.9790921 0.9790948 -0.9998557 0.9834126 0.9834142 -0.999886 0.9868503 0.9868513 -0.9999099 0.9895819 0.9895825 -0.9999288 0.99175 0.9917504 -0.9999437 0.9934694 0.9934697 -0.0000238 0.0142868 0.0506267 -0.0000382 0.0137833 0.0501232 -0.0000611 0.0131511 0.049491 -0.0000978 0.012359 0.0486989 -0.0001565 0.0113691 0.047709 -0.0002504 0.0101365 0.0464764 -0.0004008 0.0086086 0.0449485 -0.0006416 0.0067261 0.043066 -0.0010268 0.0044252 0.0407651 -0.0016435 0.0016435 0.0379834 -0.0059429 0.0016435 0.0379834 -0.0113822 0.0016435 0.0379834 -0.0182636 0.0016435 0.0379834 -0.0269694 0.0016435 0.0379834 -0.0379834 0.0016435 0.0379834 -0.0519176 0.0016435 0.0379834 -0.0695462 0.0016435 0.0379834 -0.0918486 0.0016435 0.0379834 -0.120064 0.0016435 0.0379834 -0.1557603 0.0016435 0.0379834 -0.2009206 0.0016435 0.0379834 -0.2580543 0.0016435 0.0379834 -0.3303359 0.0016435 0.0379834 -0.4217816 0.0016435 0.0379834 -0.5374722 0.0016435 0.0379834 -0.6838358 0.0016435 0.0379834 -0.8349593 0.0058134 0.0405522 -0.9012461 0.0278105 0.056623 -0.9345187 0.0619734 0.0846546 -0.9540886 0.1053433 0.12274 -0.966685 0.1565315 0.169632 -0.9752692 0.2144168 0.224127 -0.9813491 0.2777122 0.2848019 -0.9857738 0.3448353 0.3499351 -0.9890579 0.4139373 0.4175516 -0.9915312 0.4830346 0.4855591 -0.9934145 0.5501939 0.5519324 -0.9948604 0.6137183 0.6148995 -0.9959777 0.6722907 0.6730835 -0.9968453 0.7250473 0.7255733 -0.9975217 0.7715762 0.7719217 -0.9980504 0.8118589 0.8120839 -0.9984648 0.8461791 0.8463246 -0.9987902 0.8750225 0.8751159 -0.9990459 0.8989863 0.899046 -0.9992473 0.9187068 0.9187448 -0.9994059 0.9348083 0.9348324 -0.9995309 0.947871 0.9478862 -0.9996296 0.9584132 0.9584228 -0.9997074 0.9668855 0.9668916 -0.9997689 0.9736715 0.9736753 -0.9998174 0.979092 0.9790944 -0.9998557 0.9834125 0.983414 -0.999886 0.9868502 0.9868512 -0.9999099 0.9895818 0.9895824 -0.9999288 0.99175 0.9917503 -0.9999437 0.9934694 0.9934696 -0.0000238 0.0185862 0.0506267 -0.0000382 0.0180827 0.0501232 -0.0000611 0.0174505 0.049491 -0.0000978 0.0166583 0.0486989 -0.0001565 0.0156685 0.047709 -0.0002504 0.0144359 0.0464764 -0.0004008 0.012908 0.0449485 -0.0006416 0.0110255 0.043066 -0.0010268 0.0087246 0.0407651 -0.0016435 0.0059429 0.0379834 -0.0026305 0.0026305 0.0346711 -0.0080698 0.0026305 0.0346711 -0.0149512 0.0026305 0.0346711 -0.023657 0.0026305 0.0346711 -0.0346711 0.0026305 0.0346711 -0.0486053 0.0026305 0.0346711 -0.0662338 0.0026305 0.0346711 -0.0885362 0.0026305 0.0346711 -0.1167517 0.0026305 0.0346711 -0.1524479 0.0026305 0.0346711 -0.1976083 0.0026305 0.0346711 -0.254742 0.0026305 0.0346711 -0.3270236 0.0026305 0.0346711 -0.4184692 0.0026305 0.0346711 -0.5341598 0.0026305 0.0346711 -0.6805235 0.0026305 0.0346711 -0.8333779 0.0065402 0.0372359 -0.900682 0.0282324 0.0537068 -0.9342712 0.062202 0.0822505 -0.9539671 0.1054431 0.1208148 -0.9666211 0.1565473 0.1681189 -0.975234 0.2143816 0.222956 -0.9813291 0.2776503 0.283909 -0.9857621 0.3447636 0.3492646 -0.989051 0.4138668 0.4170563 -0.9915271 0.4829718 0.4851992 -0.993412 0.5501416 0.5516753 -0.9948589 0.6136769 0.6147189 -0.9959768 0.6722594 0.6729586 -0.9968448 0.7250244 0.7254883 -0.9975213 0.7715599 0.7718646 -0.9980502 0.8118476 0.812046 -0.9984647 0.8461714 0.8462997 -0.9987901 0.8750173 0.8750997 -0.9990459 0.8989829 0.8990355 -0.9992472 0.9187045 0.918738 -0.9994059 0.9348069 0.9348281 -0.9995309 0.94787 0.9478835 -0.9996296 0.9584126 0.958421 -0.9997074 0.9668852 0.9668905 -0.9997689 0.9736712 0.9736746 -0.9998174 0.9790919 0.979094 -0.9998557 0.9834124 0.9834137 -0.999886 0.9868502 0.986851 -0.9999099 0.9895818 0.9895823 -0.9999288 0.99175 0.9917503 -0.9999437 0.9934694 0.9934696 -0.0000238 0.0240255 0.0506267 -0.0000382 0.023522 0.0501232 -0.0000611 0.0228898 0.049491 -0.0000978 0.0220976 0.0486989 -0.0001565 0.0211078 0.047709 -0.0002504 0.0198752 0.0464764 -0.0004008 0.0183473 0.0449485 -0.0006416 0.0164648 0.043066 -0.0010268 0.0141639 0.0407651 -0.0016435 0.0113822 0.0379834 -0.0026305 0.0080698 0.0346711 -0.0042103 0.0042103 0.0308116 -0.0110917 0.0042103 0.0308116 -0.0197975 0.0042103 0.0308116 -0.0308116 0.0042103 0.0308116 -0.0447458 0.0042103 0.0308116 -0.0623743 0.0042103 0.0308116 -0.0846767 0.0042103 0.0308116 -0.1128922 0.0042103 0.0308116 -0.1485884 0.0042103 0.0308116 -0.1937488 0.0042103 0.0308116 -0.2508825 0.0042103 0.0308116 -0.3231641 0.0042103 0.0308116 -0.4146097 0.0042103 0.0308116 -0.5303003 0.0042103 0.0308116 -0.676664 0.0042103 0.0308116 -0.8314967 0.0078103 0.0333589 -0.9000167 0.0290732 0.0502918 -0.9339805 0.062742 0.0794363 -0.9538247 0.1057683 0.1185628 -0.9665463 0.1567226 0.1663501 -0.9751928 0.2144566 0.2215879 -0.9813057 0.2776626 0.2828664 -0.9857485 0.3447407 0.3484821 -0.989043 0.4138277 0.4164783 -0.9915223 0.4829286 0.4847793 -0.9934091 0.5501012 0.5513754 -0.9948571 0.6136427 0.6145083 -0.9959757 0.6722322 0.672813 -0.9968441 0.7250039 0.7253892 -0.9975209 0.7715449 0.771798 -0.99805 0.811837 0.8120018 -0.9984645 0.8461641 0.8462707 -0.99879 0.8750124 0.8750809 -0.9990458 0.8989796 0.8990233 -0.9992472 0.9187024 0.9187302 -0.9994059 0.9348055 0.9348231 -0.9995309 0.9478691 0.9478803 -0.9996296 0.958412 0.958419 -0.9997074 0.9668848 0.9668892 -0.9997689 0.973671 0.9736738 -0.9998174 0.9790917 0.9790935 -0.9998557 0.9834123 0.9834134 -0.999886 0.9868501 0.9868508 -0.9999099 0.9895818 0.9895822 -0.9999288 0.9917499 0.9917502 -0.9999437 0.9934694 0.9934696 -0.0000238 0.0309069 0.0506267 -0.0000382 0.0304033 0.0501232 -0.0000611 0.0297711 0.049491 -0.0000978 0.028979 0.0486989 -0.0001565 0.0279891 0.047709 -0.0002504 0.0267565 0.0464764 -0.0004008 0.0252287 0.0449485 -0.0006416 0.0233461 0.043066 -0.0010268 0.0210452 0.0407651 -0.0016435 0.0182636 0.0379834 -0.0026305 0.0149512 0.0346711 -0.0042103 0.0110917 0.0308116 -0.0067388 0.0067388 0.0264587 -0.0154447 0.0067388 0.0264587 -0.0264587 0.0067388 0.0264587 -0.0403929 0.0067388 0.0264587 -0.0580214 0.0067388 0.0264587 -0.0803239 0.0067388 0.0264587 -0.1085393 0.0067388 0.0264587 -0.1442355 0.0067388 0.0264587 -0.1893959 0.0067388 0.0264587 -0.2465296 0.0067388 0.0264587 -0.3188112 0.0067388 0.0264587 -0.4102568 0.0067388 0.0264587 -0.5259474 0.0067388 0.0264587 -0.6723111 0.0067388 0.0264587 -0.8293233 0.0099781 0.0289702 -0.8992555 0.0306306 0.0464178 -0.9336494 0.0638283 0.0762454 -0.953663 0.1064997 0.1160116 -0.9664615 0.1571937 0.1643478 -0.9751462 0.2147432 0.2200403 -0.9812792 0.2778236 0.2816876 -0.9857332 0.3448204 0.3475978 -0.9890339 0.4138582 0.4158254 -0.9915169 0.4829319 0.4843052 -0.9934058 0.5500915 0.5510368 -0.9948551 0.6136284 0.6142705 -0.9959745 0.672218 0.6726487 -0.9968433 0.7249916 0.7252773 -0.9975204 0.7715352 0.7717229 -0.9980497 0.8118298 0.811952 -0.9984643 0.8461589 0.8462379 -0.9987899 0.8750088 0.8750596 -0.9990458 0.8989771 0.8990096 -0.9992472 0.9187008 0.9187214 -0.9994058 0.9348044 0.9348175 -0.9995309 0.9478684 0.9478767 -0.9996296 0.9584115 0.9584168 -0.9997074 0.9668845 0.9668878 -0.9997689 0.9736708 0.9736729 -0.9998174 0.9790916 0.9790929 -0.9998557 0.9834122 0.983413 -0.999886 0.9868501 0.9868506 -0.9999099 0.9895817 0.989582 -0.9999288 0.9917499 0.9917501 -0.9999437 0.9934694 0.9934695 -0.0000238 0.0396127 0.0506267 -0.0000382 0.0391092 0.0501232 -0.0000611 0.038477 0.049491 -0.0000978 0.0376849 0.0486989 -0.0001565 0.036695 0.047709 -0.0002504 0.0354624 0.0464764 -0.0004008 0.0339345 0.0449485 -0.0006416 0.032052 0.043066 -0.0010268 0.0297511 0.0407651 -0.0016435 0.0269694 0.0379834 -0.0026305 0.023657 0.0346711 -0.0042103 0.0197975 0.0308116 -0.0067388 0.0154447 0.0264587 -0.0107859 0.0107859 0.0217999 -0.0217999 0.0107859 0.0217999 -0.0357341 0.0107859 0.0217999 -0.0533626 0.0107859 0.0217999 -0.075665 0.0107859 0.0217999 -0.1038805 0.0107859 0.0217999 -0.1395767 0.0107859 0.0217999 -0.1847371 0.0107859 0.0217999 -0.2418708 0.0107859 0.0217999 -0.3141524 0.0107859 0.0217999 -0.405598 0.0107859 0.0217999 -0.5212886 0.0107859 0.0217999 -0.6676523 0.0107859 0.0217999 -0.8269342 0.0136166 0.024255 -0.8984278 0.0333932 0.0422453 -0.9332914 0.0658501 0.0728103 -0.9534887 0.1079385 0.1132674 -0.9663702 0.15819 0.1621961 -0.9750962 0.2154135 0.2183784 -0.9812508 0.2782606 0.2804226 -0.9857167 0.3450957 0.3466492 -0.9890241 0.4140252 0.4151253 -0.991511 0.4830292 0.4837969 -0.9934023 0.5501456 0.550674 -0.994853 0.6136569 0.6140158 -0.9959732 0.672232 0.6724727 -0.9968425 0.7249978 0.7251575 -0.9975199 0.7715376 0.7716425 -0.9980494 0.8118303 0.8118986 -0.9984642 0.8461587 0.8462029 -0.9987897 0.8750084 0.8750368 -0.9990457 0.8989767 0.8989948 -0.9992471 0.9187004 0.9187119 -0.9994058 0.9348042 0.9348115 -0.9995309 0.9478683 0.9478729 -0.9996295 0.9584114 0.9584143 -0.9997074 0.9668844 0.9668862 -0.9997689 0.9736708 0.9736719 -0.9998174 0.9790916 0.9790923 -0.9998557 0.9834122 0.9834127 -0.999886 0.98685 0.9868503 -0.9999099 0.9895817 0.9895819 -0.9999288 0.9917499 0.99175 -0.9999437 0.9934694 0.9934694 -0.0000238 0.0506267 0.0506267 -0.0000382 0.0501232 0.0501232 -0.0000611 0.049491 0.049491 -0.0000978 0.0486989 0.0486989 -0.0001565 0.047709 0.047709 -0.0002504 0.0464764 0.0464764 -0.0004008 0.0449485 0.0449485 -0.0006416 0.043066 0.043066 -0.0010268 0.0407651 0.0407651 -0.0016435 0.0379834 0.0379834 -0.0026305 0.0346711 0.0346711 -0.0042103 0.0308116 0.0308116 -0.0067388 0.0264587 0.0264587 -0.0107859 0.0217999 0.0217999 -0.0172633 0.0172633 0.0172633 -0.0311975 0.0172633 0.0172633 -0.0488261 0.0172633 0.0172633 -0.0711285 0.0172633 0.0172633 -0.099344 0.0172633 0.0172633 -0.1350402 0.0172633 0.0172633 -0.1802005 0.0172633 0.0172633 -0.2373343 0.0172633 0.0172633 -0.3096159 0.0172633 0.0172633 -0.4010615 0.0172633 0.0172633 -0.5167521 0.0172633 0.0172633 -0.6631157 0.0172633 0.0172633 -0.8245426 0.0196467 0.0196467 -0.8976087 0.0381561 0.0381561 -0.9329391 0.0694453 0.0694453 -0.9533177 0.1105818 0.1105818 -0.9662809 0.160092 0.160092 -0.9750472 0.2167545 0.2167545 -0.9812231 0.2791873 0.2791873 -0.9857006 0.3457234 0.3457234 -0.9890146 0.4144423 0.4144423 -0.9915054 0.4833013 0.4833013 -0.9933988 0.5503203 0.5503203 -0.9948509 0.6137675 0.6137675 -0.9959719 0.6723012 0.6723012 -0.9968418 0.7250408 0.7250408 -0.9975194 0.7715641 0.7715641 -0.9980491 0.8118466 0.8118466 -0.998464 0.8461687 0.8461687 -0.9987896 0.8750145 0.8750145 -0.9990456 0.8989805 0.8989805 -0.9992471 0.9187027 0.9187027 -0.9994058 0.9348056 0.9348056 -0.9995309 0.9478691 0.9478691 -0.9996295 0.958412 0.958412 -0.9997074 0.9668847 0.9668847 -0.9997688 0.973671 0.973671 -0.9998174 0.9790917 0.9790917 -0.9998557 0.9834123 0.9834123 -0.999886 0.9868501 0.9868501 -0.9999099 0.9895817 0.9895817 -0.9999288 0.9917499 0.9917499 -0.9999437 0.9934694 0.9934694 -0.0000238 0.0645609 0.0506267 -0.0000382 0.0640574 0.0501232 -0.0000611 0.0634252 0.049491 -0.0000978 0.0626331 0.0486989 -0.0001565 0.0616432 0.047709 -0.0002504 0.0604106 0.0464764 -0.0004008 0.0588827 0.0449485 -0.0006416 0.0570002 0.043066 -0.0010268 0.0546993 0.0407651 -0.0016435 0.0519176 0.0379834 -0.0026305 0.0486053 0.0346711 -0.0042103 0.0447458 0.0308116 -0.0067388 0.0403929 0.0264587 -0.0107859 0.0357341 0.0217999 -0.0172633 0.0311975 0.0172633 -0.0311975 0.0311975 0.0172633 -0.0488261 0.0311975 0.0172633 -0.0711285 0.0311975 0.0172633 -0.099344 0.0311975 0.0172633 -0.1350402 0.0311975 0.0172633 -0.1802005 0.0311975 0.0172633 -0.2373343 0.0311975 0.0172633 -0.3096159 0.0311975 0.0172633 -0.4010615 0.0311975 0.0172633 -0.5167521 0.0311975 0.0172633 -0.6631157 0.0311975 0.0172633 -0.8245426 0.0331428 0.0196467 -0.8976087 0.0493979 0.0381561 -0.9329391 0.0782816 0.0694453 -0.9533177 0.1173437 0.1105818 -0.9662809 0.1651729 0.160092 -0.9750472 0.2205133 0.2167545 -0.9812231 0.2819272 0.2791873 -0.9857006 0.3476916 0.3457234 -0.9890146 0.4158356 0.4144423 -0.9915054 0.4842735 0.4833013 -0.9933988 0.5509893 0.5503203 -0.9948509 0.6142218 0.6137675 -0.9959719 0.6726059 0.6723012 -0.9968418 0.7252429 0.7250408 -0.9975194 0.7716968 0.7715641 -0.9980491 0.811933 0.8118466 -0.998464 0.8462246 0.8461687 -0.9987896 0.8750504 0.8750145 -0.9990456 0.8990034 0.8989805 -0.9992471 0.9187173 0.9187027 -0.9994058 0.9348148 0.9348056 -0.9995309 0.947875 0.9478691 -0.9996295 0.9584156 0.958412 -0.9997074 0.9668871 0.9668847 -0.9997688 0.9736724 0.973671 -0.9998174 0.9790926 0.9790917 -0.9998557 0.9834129 0.9834123 -0.999886 0.9868505 0.9868501 -0.9999099 0.989582 0.9895817 -0.9999288 0.9917501 0.9917499 -0.9999437 0.9934695 0.9934694 -0.0000238 0.0821895 0.0506267 -0.0000382 0.081686 0.0501232 -0.0000611 0.0810538 0.049491 -0.0000978 0.0802616 0.0486989 -0.0001565 0.0792718 0.047709 -0.0002504 0.0780392 0.0464764 -0.0004008 0.0765113 0.0449485 -0.0006416 0.0746288 0.043066 -0.0010268 0.0723279 0.0407651 -0.0016435 0.0695462 0.0379834 -0.0026305 0.0662338 0.0346711 -0.0042103 0.0623743 0.0308116 -0.0067388 0.0580214 0.0264587 -0.0107859 0.0533626 0.0217999 -0.0172633 0.0488261 0.0172633 -0.0311975 0.0488261 0.0172633 -0.0488261 0.0488261 0.0172633 -0.0711285 0.0488261 0.0172633 -0.099344 0.0488261 0.0172633 -0.1350402 0.0488261 0.0172633 -0.1802005 0.0488261 0.0172633 -0.2373343 0.0488261 0.0172633 -0.3096159 0.0488261 0.0172633 -0.4010615 0.0488261 0.0172633 -0.5167521 0.0488261 0.0172633 -0.6631157 0.0488261 0.0172633 -0.8245426 0.0502171 0.0196467 -0.8976087 0.0636203 0.0381561 -0.9329391 0.0894608 0.0694453 -0.9533177 0.1258985 0.1105818 -0.9662809 0.1716008 0.160092 -0.9750472 0.2252686 0.2167545 -0.9812231 0.2853935 0.2791873 -0.9857006 0.3501816 0.3457234 -0.9890146 0.4175984 0.4144423 -0.9915054 0.4855036 0.4833013 -0.9933988 0.5518357 0.5503203 -0.9948509 0.6147965 0.6137675 -0.9959719 0.6729913 0.6723012 -0.9968418 0.7254985 0.7250408 -0.9975194 0.7718647 0.7715641 -0.9980491 0.8120423 0.8118466 -0.998464 0.8462952 0.8461687 -0.9987896 0.8750958 0.8750145 -0.9990456 0.8990324 0.8989805 -0.9992471 0.9187358 0.9187027 -0.9994058 0.9348265 0.9348056 -0.9995309 0.9478824 0.9478691 -0.9996295 0.9584203 0.958412 -0.9997074 0.96689 0.9668847 -0.9997688 0.9736743 0.973671 -0.9998174 0.9790938 0.9790917 -0.9998557 0.9834136 0.9834123 -0.999886 0.9868509 0.9868501 -0.9999099 0.9895823 0.9895817 -0.9999288 0.9917502 0.9917499 -0.9999437 0.9934696 0.9934694 -0.0000238 0.1044919 0.0506267 -0.0000382 0.1039884 0.0501232 -0.0000611 0.1033562 0.049491 -0.0000978 0.102564 0.0486989 -0.0001565 0.1015742 0.047709 -0.0002504 0.1003416 0.0464764 -0.0004008 0.0988137 0.0449485 -0.0006416 0.0969312 0.043066 -0.0010268 0.0946303 0.0407651 -0.0016435 0.0918486 0.0379834 -0.0026305 0.0885362 0.0346711 -0.0042103 0.0846767 0.0308116 -0.0067388 0.0803239 0.0264587 -0.0107859 0.075665 0.0217999 -0.0172633 0.0711285 0.0172633 -0.0311975 0.0711285 0.0172633 -0.0488261 0.0711285 0.0172633 -0.0711285 0.0711285 0.0172633 -0.099344 0.0711285 0.0172633 -0.1350402 0.0711285 0.0172633 -0.1802005 0.0711285 0.0172633 -0.2373343 0.0711285 0.0172633 -0.3096159 0.0711285 0.0172633 -0.4010615 0.0711285 0.0172633 -0.5167521 0.0711285 0.0172633 -0.6631157 0.0711285 0.0172633 -0.8245426 0.0718184 0.0196467 -0.8976087 0.0816135 0.0381561 -0.9329391 0.1036038 0.0694453 -0.9533177 0.1367213 0.1105818 -0.9662809 0.179733 0.160092 -0.9750472 0.2312846 0.2167545 -0.9812231 0.2897788 0.2791873 -0.9857006 0.3533318 0.3457234 -0.9890146 0.4198285 0.4144423 -0.9915054 0.4870597 0.4833013 -0.9933988 0.5529065 0.5503203 -0.9948509 0.6155236 0.6137675 -0.9959719 0.673479 0.6723012 -0.9968418 0.725822 0.7250408 -0.9975194 0.7720771 0.7715641 -0.9980491 0.8121806 0.8118466 -0.998464 0.8463846 0.8461687 -0.9987896 0.8751532 0.8750145 -0.9990456 0.8990691 0.8989805 -0.9992471 0.9187591 0.9187027 -0.9994058 0.9348413 0.9348056 -0.9995309 0.9478917 0.9478691 -0.9996295 0.9584262 0.958412 -0.9997074 0.9668937 0.9668847 -0.9997688 0.9736766 0.973671 -0.9998174 0.9790952 0.9790917 -0.9998557 0.9834145 0.9834123 -0.999886 0.9868515 0.9868501 -0.9999099 0.9895826 0.9895817 -0.9999288 0.9917505 0.9917499 -0.9999437 0.9934697 0.9934694 -0.0000238 0.1327073 0.0506267 -0.0000382 0.1322038 0.0501232 -0.0000611 0.1315716 0.049491 -0.0000978 0.1307795 0.0486989 -0.0001565 0.1297896 0.047709 -0.0002504 0.128557 0.0464764 -0.0004008 0.1270291 0.0449485 -0.0006416 0.1251466 0.043066 -0.0010268 0.1228457 0.0407651 -0.0016435 0.120064 0.0379834 -0.0026305 0.1167517 0.0346711 -0.0042103 0.1128922 0.0308116 -0.0067388 0.1085393 0.0264587 -0.0107859 0.1038805 0.0217999 -0.0172633 0.099344 0.0172633 -0.0311975 0.099344 0.0172633 -0.0488261 0.099344 0.0172633 -0.0711285 0.099344 0.0172633 -0.099344 0.099344 0.0172633 -0.1350402 0.099344 0.0172633 -0.1802005 0.099344 0.0172633 -0.2373343 0.099344 0.0172633 -0.3096159 0.099344 0.0172633 -0.4010615 0.099344 0.0172633 -0.5167521 0.099344 0.0172633 -0.6631157 0.099344 0.0172633 -0.8245426 0.0991468 0.0196467 -0.8976087 0.1043773 0.0381561 -0.9329391 0.1214966 0.0694453 -0.9533177 0.1504136 0.1105818 -0.9662809 0.1900212 0.160092 -0.9750472 0.2388957 0.2167545 -0.9812231 0.2953268 0.2791873 -0.9857006 0.3573171 0.3457234 -0.9890146 0.4226498 0.4144423 -0.9915054 0.4890285 0.4833013 -0.9933988 0.5542612 0.5503203 -0.9948509 0.6164434 0.6137675 -0.9959719 0.674096 0.6723012 -0.9968418 0.7262312 0.7250408 -0.9975194 0.7723459 0.7715641 -0.9980491 0.8123556 0.8118466 -0.998464 0.8464977 0.8461687 -0.9987896 0.8752258 0.8750145 -0.9990456 0.8991155 0.8989805 -0.9992471 0.9187886 0.9187027 -0.9994058 0.93486 0.9348056 -0.9995309 0.9479035 0.9478691 -0.9996295 0.9584336 0.958412 -0.9997074 0.9668984 0.9668847 -0.9997688 0.9736796 0.973671 -0.9998174 0.9790971 0.9790917 -0.9998557 0.9834157 0.9834123 -0.999886 0.9868522 0.9868501 -0.9999099 0.9895831 0.9895817 -0.9999288 0.9917508 0.9917499 -0.9999437 0.9934699 0.9934694 -0.0000238 0.1684036 0.0506267 -0.0000382 0.1679 0.0501232 -0.0000611 0.1672678 0.049491 -0.0000978 0.1664757 0.0486989 -0.0001565 0.1654858 0.047709 -0.0002504 0.1642532 0.0464764 -0.0004008 0.1627254 0.0449485 -0.0006416 0.1608428 0.043066 -0.0010268 0.1585419 0.0407651 -0.0016435 0.1557603 0.0379834 -0.0026305 0.1524479 0.0346711 -0.0042103 0.1485884 0.0308116 -0.0067388 0.1442355 0.0264587 -0.0107859 0.1395767 0.0217999 -0.0172633 0.1350402 0.0172633 -0.0311975 0.1350402 0.0172633 -0.0488261 0.1350402 0.0172633 -0.0711285 0.1350402 0.0172633 -0.099344 0.1350402 0.0172633 -0.1350402 0.1350402 0.0172633 -0.1802005 0.1350402 0.0172633 -0.2373343 0.1350402 0.0172633 -0.3096159 0.1350402 0.0172633 -0.4010615 0.1350402 0.0172633 -0.5167521 0.1350402 0.0172633 -0.6631157 0.1350402 0.0172633 -0.8245426 0.1337208 0.0196467 -0.8976087 0.1331763 0.0381561 -0.9329391 0.1441333 0.0694453 -0.9533177 0.1677362 0.1105818 -0.9662809 0.2030372 0.160092 -0.9750472 0.2485248 0.2167545 -0.9812231 0.3023458 0.2791873 -0.9857006 0.3623592 0.3457234 -0.9890146 0.4262192 0.4144423 -0.9915054 0.4915192 0.4833013 -0.9933988 0.555975 0.5503203 -0.9948509 0.6176072 0.6137675 -0.9959719 0.6748765 0.6723012 -0.9968418 0.7267489 0.7250408 -0.9975194 0.7726859 0.7715641 -0.9980491 0.812577 0.8118466 -0.998464 0.8466407 0.8461687 -0.9987896 0.8753177 0.8750145 -0.9990456 0.8991742 0.8989805 -0.9992471 0.9188259 0.9187027 -0.9994058 0.9348837 0.9348056 -0.9995309 0.9479185 0.9478691 -0.9996295 0.9584431 0.958412 -0.9997074 0.9669043 0.9668847 -0.9997688 0.9736833 0.973671 -0.9998174 0.9790994 0.9790917 -0.9998557 0.9834171 0.9834123 -0.999886 0.9868531 0.9868501 -0.9999099 0.9895836 0.9895817 -0.9999288 0.9917511 0.9917499 -0.9999437 0.9934701 0.9934694 -0.0000238 0.2135639 0.0506267 -0.0000382 0.2130604 0.0501232 -0.0000611 0.2124282 0.049491 -0.0000978 0.2116361 0.0486989 -0.0001565 0.2106462 0.047709 -0.0002504 0.2094136 0.0464764 -0.0004008 0.2078857 0.0449485 -0.0006416 0.2060032 0.043066 -0.0010268 0.2037023 0.0407651 -0.0016435 0.2009206 0.0379834 -0.0026305 0.1976083 0.0346711 -0.0042103 0.1937488 0.0308116 -0.0067388 0.1893959 0.0264587 -0.0107859 0.1847371 0.0217999 -0.0172633 0.1802005 0.0172633 -0.0311975 0.1802005 0.0172633 -0.0488261 0.1802005 0.0172633 -0.0711285 0.1802005 0.0172633 -0.099344 0.1802005 0.0172633 -0.1350402 0.1802005 0.0172633 -0.1802005 0.1802005 0.0172633 -0.2373343 0.1802005 0.0172633 -0.3096159 0.1802005 0.0172633 -0.4010615 0.1802005 0.0172633 -0.5167521 0.1802005 0.0172633 -0.6631157 0.1802005 0.0172633 -0.8245426 0.1774615 0.0196467 -0.8976087 0.1696109 0.0381561 -0.9329391 0.1727717 0.0694453 -0.9533177 0.1896515 0.1105818 -0.9662809 0.219504 0.160092 -0.9750472 0.2607068 0.2167545 -0.9812231 0.3112256 0.2791873 -0.9857006 0.368738 0.3457234 -0.9890146 0.430735 0.4144423 -0.9915054 0.4946702 0.4833013 -0.9933988 0.5581433 0.5503203 -0.9948509 0.6190795 0.6137675 -0.9959719 0.675864 0.6723012 -0.9968418 0.7274039 0.7250408 -0.9975194 0.773116 0.7715641 -0.9980491 0.812857 0.8118466 -0.998464 0.8468217 0.8461687 -0.9987896 0.8754339 0.8750145 -0.9990456 0.8992484 0.8989805 -0.9992471 0.9188732 0.9187027 -0.9994058 0.9349136 0.9348056 -0.9995309 0.9479374 0.9478691 -0.9996295 0.958455 0.958412 -0.9997074 0.9669118 0.9668847 -0.9997688 0.973688 0.973671 -0.9998174 0.9791024 0.9790917 -0.9998557 0.983419 0.9834123 -0.999886 0.9868543 0.9868501 -0.9999099 0.9895844 0.9895817 -0.9999288 0.9917516 0.9917499 -0.9999437 0.9934704 0.9934694 -0.0000238 0.2706977 0.0506267 -0.0000382 0.2701941 0.0501232 -0.0000611 0.2695619 0.049491 -0.0000978 0.2687698 0.0486989 -0.0001565 0.2677799 0.047709 -0.0002504 0.2665473 0.0464764 -0.0004008 0.2650195 0.0449485 -0.0006416 0.2631369 0.043066 -0.0010268 0.260836 0.0407651 -0.0016435 0.2580543 0.0379834 -0.0026305 0.254742 0.0346711 -0.0042103 0.2508825 0.0308116 -0.0067388 0.2465296 0.0264587 -0.0107859 0.2418708 0.0217999 -0.0172633 0.2373343 0.0172633 -0.0311975 0.2373343 0.0172633 -0.0488261 0.2373343 0.0172633 -0.0711285 0.2373343 0.0172633 -0.099344 0.2373343 0.0172633 -0.1350402 0.2373343 0.0172633 -0.1802005 0.2373343 0.0172633 -0.2373343 0.2373343 0.0172633 -0.3096159 0.2373343 0.0172633 -0.4010615 0.2373343 0.0172633 -0.5167521 0.2373343 0.0172633 -0.6631157 0.2373343 0.0172633 -0.8245426 0.232799 0.0196467 -0.8976087 0.2157054 0.0381561 -0.9329391 0.209003 0.0694453 -0.9533177 0.2173771 0.1105818 -0.9662809 0.2403368 0.160092 -0.9750472 0.2761186 0.2167545 -0.9812231 0.3224598 0.2791873 -0.9857006 0.376808 0.3457234 -0.9890146 0.436448 0.4144423 -0.9915054 0.4986567 0.4833013 -0.9933988 0.5608864 0.5503203 -0.9948509 0.6209421 0.6137675 -0.9959719 0.6771133 0.6723012 -0.9968418 0.7282325 0.7250408 -0.9975194 0.7736602 0.7715641 -0.9980491 0.8132113 0.8118466 -0.998464 0.8470507 0.8461687 -0.9987896 0.8755809 0.8750145 -0.9990456 0.8993424 0.8989805 -0.9992471 0.9189329 0.9187027 -0.9994058 0.9349515 0.9348056 -0.9995309 0.9479614 0.9478691 -0.9996295 0.9584701 0.958412 -0.9997074 0.9669214 0.9668847 -0.9997688 0.973694 0.973671 -0.9998174 0.9791061 0.9790917 -0.9998557 0.9834213 0.9834123 -0.999886 0.9868558 0.9868501 -0.9999099 0.9895853 0.9895817 -0.9999288 0.9917522 0.9917499 -0.9999437 0.9934708 0.9934694 -0.0000238 0.3429792 0.0506267 -0.0000382 0.3424757 0.0501232 -0.0000611 0.3418435 0.049491 -0.0000978 0.3410514 0.0486989 -0.0001565 0.3400615 0.047709 -0.0002504 0.3388289 0.0464764 -0.0004008 0.337301 0.0449485 -0.0006416 0.3354185 0.043066 -0.0010268 0.3331176 0.0407651 -0.0016435 0.3303359 0.0379834 -0.0026305 0.3270236 0.0346711 -0.0042103 0.3231641 0.0308116 -0.0067388 0.3188112 0.0264587 -0.0107859 0.3141524 0.0217999 -0.0172633 0.3096159 0.0172633 -0.0311975 0.3096159 0.0172633 -0.0488261 0.3096159 0.0172633 -0.0711285 0.3096159 0.0172633 -0.099344 0.3096159 0.0172633 -0.1350402 0.3096159 0.0172633 -0.1802005 0.3096159 0.0172633 -0.2373343 0.3096159 0.0172633 -0.3096159 0.3096159 0.0172633 -0.4010615 0.3096159 0.0172633 -0.5167521 0.3096159 0.0172633 -0.6631157 0.3096159 0.0172633 -0.8245426 0.3028082 0.0196467 -0.8976087 0.2740209 0.0381561 -0.9329391 0.2548403 0.0694453 -0.9533177 0.2524537 0.1105818 -0.9662809 0.2666929 0.160092 -0.9750472 0.2956165 0.2167545 -0.9812231 0.3366726 0.2791873 -0.9857006 0.3870176 0.3457234 -0.9890146 0.4436757 0.4144423 -0.9915054 0.5037002 0.4833013 -0.9933988 0.5643568 0.5503203 -0.9948509 0.6232986 0.6137675 -0.9959719 0.6786939 0.6723012 -0.9968418 0.7292808 0.7250408 -0.9975194 0.7743486 0.7715641 -0.9980491 0.8136595 0.8118466 -0.998464 0.8473404 0.8461687 -0.9987896 0.875767 0.8750145 -0.9990456 0.8994612 0.8989805 -0.9992471 0.9190085 0.9187027 -0.9994058 0.9349994 0.9348056 -0.9995309 0.9479916 0.9478691 -0.9996295 0.9584892 0.958412 -0.9997074 0.9669334 0.9668847 -0.9997688 0.9737015 0.973671 -0.9998174 0.9791109 0.9790917 -0.9998557 0.9834243 0.9834123 -0.999886 0.9868576 0.9868501 -0.9999099 0.9895865 0.9895817 -0.9999288 0.9917529 0.9917499 -0.9999437 0.9934712 0.9934694 -0.0000238 0.4344249 0.0506267 -0.0000382 0.4339214 0.0501232 -0.0000611 0.4332891 0.049491 -0.0000978 0.432497 0.0486989 -0.0001565 0.4315072 0.047709 -0.0002504 0.4302746 0.0464764 -0.0004008 0.4287467 0.0449485 -0.0006416 0.4268641 0.043066 -0.0010268 0.4245633 0.0407651 -0.0016435 0.4217816 0.0379834 -0.0026305 0.4184692 0.0346711 -0.0042103 0.4146097 0.0308116 -0.0067388 0.4102568 0.0264587 -0.0107859 0.405598 0.0217999 -0.0172633 0.4010615 0.0172633 -0.0311975 0.4010615 0.0172633 -0.0488261 0.4010615 0.0172633 -0.0711285 0.4010615 0.0172633 -0.099344 0.4010615 0.0172633 -0.1350402 0.4010615 0.0172633 -0.1802005 0.4010615 0.0172633 -0.2373343 0.4010615 0.0172633 -0.3096159 0.4010615 0.0172633 -0.4010615 0.4010615 0.0172633 -0.5167521 0.4010615 0.0172633 -0.6631157 0.4010615 0.0172633 -0.8245426 0.391379 0.0196467 -0.8976087 0.3477976 0.0381561 -0.9329391 0.3128305 0.0694453 -0.9533177 0.2968302 0.1105818 -0.9662809 0.3000369 0.160092 -0.9750472 0.3202839 0.2167545 -0.9812231 0.3546535 0.2791873 -0.9857006 0.3999341 0.3457234 -0.9890146 0.4528197 0.4144423 -0.9915054 0.5100808 0.4833013 -0.9933988 0.5687472 0.5503203 -0.9948509 0.6262799 0.6137675 -0.9959719 0.6806934 0.6723012 -0.9968418 0.7306071 0.7250408 -0.9975194 0.7752196 0.7715641 -0.9980491 0.8142266 0.8118466 -0.998464 0.8477068 0.8461687 -0.9987896 0.8760023 0.8750145 -0.9990456 0.8996116 0.8989805 -0.9992471 0.9191042 0.9187027 -0.9994058 0.9350601 0.9348056 -0.9995309 0.94803 0.9478691 -0.9996295 0.9585134 0.958412 -0.9997074 0.9669486 0.9668847 -0.9997688 0.9737111 0.973671 -0.9998174 0.9791169 0.9790917 -0.9998557 0.9834281 0.9834123 -0.999886 0.98686 0.9868501 -0.9999099 0.9895879 0.9895817 -0.9999288 0.9917538 0.9917499 -0.9999437 0.9934718 0.9934694 -0.0000238 0.5501155 0.0506267 -0.0000382 0.549612 0.0501232 -0.0000611 0.5489798 0.049491 -0.0000978 0.5481876 0.0486989 -0.0001565 0.5471978 0.047709 -0.0002504 0.5459652 0.0464764 -0.0004008 0.5444373 0.0449485 -0.0006416 0.5425548 0.043066 -0.0010268 0.5402539 0.0407651 -0.0016435 0.5374722 0.0379834 -0.0026305 0.5341598 0.0346711 -0.0042103 0.5303003 0.0308116 -0.0067388 0.5259474 0.0264587 -0.0107859 0.5212886 0.0217999 -0.0172633 0.5167521 0.0172633 -0.0311975 0.5167521 0.0172633 -0.0488261 0.5167521 0.0172633 -0.0711285 0.5167521 0.0172633 -0.099344 0.5167521 0.0172633 -0.1350402 0.5167521 0.0172633 -0.1802005 0.5167521 0.0172633 -0.2373343 0.5167521 0.0172633 -0.3096159 0.5167521 0.0172633 -0.4010615 0.5167521 0.0172633 -0.5167521 0.5167521 0.0172633 -0.6631157 0.5167521 0.0172633 -0.8245426 0.5034325 0.0196467 -0.8976087 0.4411348 0.0381561 -0.9329391 0.3861956 0.0694453 -0.9533177 0.3529722 0.1105818 -0.9662809 0.3422213 0.160092 -0.9750472 0.3514914 0.2167545 -0.9812231 0.3774018 0.2791873 -0.9857006 0.4162752 0.3457234 -0.9890146 0.464388 0.4144423 -0.9915054 0.5181531 0.4833013 -0.9933988 0.5743018 0.5503203 -0.9948509 0.6300515 0.6137675 -0.9959719 0.6832232 0.6723012 -0.9968418 0.732285 0.7250408 -0.9975194 0.7763215 0.7715641 -0.9980491 0.814944 0.8118466 -0.998464 0.8481705 0.8461687 -0.9987896 0.8763001 0.8750145 -0.9990456 0.8998018 0.8989805 -0.9992471 0.9192252 0.9187027 -0.9994058 0.9351368 0.9348056 -0.9995309 0.9480785 0.9478691 -0.9996295 0.9585439 0.958412 -0.9997074 0.9669678 0.9668847 -0.9997688 0.9737232 0.973671 -0.9998174 0.9791245 0.9790917 -0.9998557 0.9834328 0.9834123 -0.999886 0.986863 0.9868501 -0.9999099 0.9895898 0.9895817 -0.9999288 0.991755 0.9917499 -0.9999437 0.9934725 0.9934694 -0.0000238 0.6964791 0.0506267 -0.0000382 0.6959756 0.0501232 -0.0000611 0.6953434 0.049491 -0.0000978 0.6945513 0.0486989 -0.0001565 0.6935614 0.047709 -0.0002504 0.6923288 0.0464764 -0.0004008 0.6908009 0.0449485 -0.0006416 0.6889184 0.043066 -0.0010268 0.6866175 0.0407651 -0.0016435 0.6838358 0.0379834 -0.0026305 0.6805235 0.0346711 -0.0042103 0.676664 0.0308116 -0.0067388 0.6723111 0.0264587 -0.0107859 0.6676523 0.0217999 -0.0172633 0.6631157 0.0172633 -0.0311975 0.6631157 0.0172633 -0.0488261 0.6631157 0.0172633 -0.0711285 0.6631157 0.0172633 -0.099344 0.6631157 0.0172633 -0.1350402 0.6631157 0.0172633 -0.1802005 0.6631157 0.0172633 -0.2373343 0.6631157 0.0172633 -0.3096159 0.6631157 0.0172633 -0.4010615 0.6631157 0.0172633 -0.5167521 0.6631157 0.0172633 -0.6631157 0.6631157 0.0172633 -0.8245426 0.6451948 0.0196467 -0.8976087 0.5592184 0.0381561 -0.9329391 0.479012 0.0694453 -0.9533177 0.4239991 0.1105818 -0.9662809 0.3955901 0.160092 -0.9750472 0.390973 0.2167545 -0.9812231 0.4061813 0.2791873 -0.9857006 0.4369488 0.3457234 -0.9890146 0.4790235 0.4144423 -0.9915054 0.5283656 0.4833013 -0.9933988 0.581329 0.5503203 -0.9948509 0.6348232 0.6137675 -0.9959719 0.6864236 0.6723012 -0.9968418 0.7344077 0.7250408 -0.9975194 0.7777156 0.7715641 -0.9980491 0.8158516 0.8118466 -0.998464 0.848757 0.8461687 -0.9987896 0.8766768 0.8750145 -0.9990456 0.9000425 0.8989805 -0.9992471 0.9193783 0.9187027 -0.9994058 0.9352338 0.9348056 -0.9995309 0.9481398 0.9478691 -0.9996295 0.9585826 0.958412 -0.9997074 0.9669922 0.9668847 -0.9997688 0.9737385 0.973671 -0.9998174 0.9791341 0.9790917 -0.9998557 0.9834389 0.9834123 -0.999886 0.9868667 0.9868501 -0.9999099 0.9895922 0.9895817 -0.9999288 0.9917565 0.9917499 -0.9999437 0.9934735 0.9934694 -0.0051514 0.8407292 0.0531113 -0.0051286 0.8405071 0.0526143 -0.0051047 0.8402274 0.0519898 -0.0050826 0.8398756 0.0512068 -0.0050676 0.8394338 0.0502275 -0.0050694 0.8388802 0.0490065 -0.0051048 0.8381886 0.0474909 -0.0052028 0.8373283 0.0456203 -0.0054121 0.8362644 0.0433291 -0.0058134 0.8349593 0.0405522 -0.0065402 0.8333779 0.0372359 -0.0078103 0.8314967 0.0333589 -0.0099781 0.8293233 0.0289702 -0.0136166 0.8269342 0.024255 -0.0196467 0.8245426 0.0196467 -0.0331428 0.8245426 0.0196467 -0.0502171 0.8245426 0.0196467 -0.0718184 0.8245426 0.0196467 -0.0991468 0.8245426 0.0196467 -0.1337208 0.8245426 0.0196467 -0.1774615 0.8245426 0.0196467 -0.232799 0.8245426 0.0196467 -0.3028082 0.8245426 0.0196467 -0.391379 0.8245426 0.0196467 -0.5034325 0.8245426 0.0196467 -0.6451948 0.8245426 0.0196467 -0.8245426 0.8245426 0.0196467 -0.8976087 0.7086095 0.0381561 -0.9329391 0.5964367 0.0694453 -0.9533177 0.5138574 0.1105818 -0.9662809 0.4631086 0.160092 -0.9750472 0.4409223 0.2167545 -0.9812231 0.4425911 0.2791873 -0.9857006 0.4631035 0.3457234 -0.9890146 0.4975392 0.4144423 -0.9915054 0.5412858 0.4833013 -0.9933988 0.5902194 0.5503203 -0.9948509 0.64086 0.6137675 -0.9959719 0.6904726 0.6723012 -0.9968418 0.7370933 0.7250408 -0.9975194 0.7794792 0.7715641 -0.9980491 0.8169999 0.8118466 -0.998464 0.8494991 0.8461687 -0.9987896 0.8771534 0.8750145 -0.9990456 0.9003469 0.8989805 -0.9992471 0.919572 0.9187027 -0.9994058 0.9353566 0.9348056 -0.9995309 0.9482174 0.9478691 -0.9996295 0.9586316 0.958412 -0.9997074 0.967023 0.9668847 -0.9997688 0.9737578 0.973671 -0.9998174 0.9791462 0.9790917 -0.9998557 0.9834465 0.9834123 -0.999886 0.9868715 0.9868501 -0.9999099 0.9895952 0.9895817 -0.9999288 0.9917583 0.9917499 -0.9999437 0.9934746 0.9934694 -0.0279321 0.9033413 0.0676299 -0.0278872 0.9032596 0.0671953 -0.0278347 0.9031567 0.0666492 -0.0277752 0.9030276 0.0659642 -0.0277111 0.9028657 0.0651072 -0.0276479 0.9026634 0.0640384 -0.0275966 0.9024114 0.0627109 -0.0275778 0.9020992 0.0610714 -0.0276281 0.9017148 0.0590616 -0.0278105 0.9012461 0.056623 -0.0282324 0.900682 0.0537068 -0.0290732 0.9000167 0.0502918 -0.0306306 0.8992555 0.0464178 -0.0333932 0.8984278 0.0422453 -0.0381561 0.8976087 0.0381561 -0.0493979 0.8976087 0.0381561 -0.0636203 0.8976087 0.0381561 -0.0816135 0.8976087 0.0381561 -0.1043773 0.8976087 0.0381561 -0.1331763 0.8976087 0.0381561 -0.1696109 0.8976087 0.0381561 -0.2157054 0.8976087 0.0381561 -0.2740209 0.8976087 0.0381561 -0.3477976 0.8976087 0.0381561 -0.4411348 0.8976087 0.0381561 -0.5592184 0.8976087 0.0381561 -0.7086095 0.8976087 0.0381561 -0.8976087 0.8976087 0.0381561 -0.9329391 0.7449944 0.0694453 -0.9533177 0.6275398 0.1105818 -0.9662809 0.5485282 0.160092 -0.9750472 0.5041146 0.2167545 -0.9812231 0.4886542 0.2791873 -0.9857006 0.4961927 0.3457234 -0.9890146 0.5209641 0.4144423 -0.9915054 0.5576314 0.4833013 -0.9933988 0.6014668 0.5503203 -0.9948509 0.6484973 0.6137675 -0.9959719 0.695595 0.6723012 -0.9968418 0.7404909 0.7250408 -0.9975194 0.7817105 0.7715641 -0.9980491 0.8184526 0.8118466 -0.998464 0.8504379 0.8461687 -0.9987896 0.8777563 0.8750145 -0.9990456 0.9007321 0.8989805 -0.9992471 0.919817 0.9187027 -0.9994058 0.9355119 0.9348056 -0.9995309 0.9483155 0.9478691 -0.9996295 0.9586935 0.958412 -0.9997074 0.9670619 0.9668847 -0.9997688 0.9737823 0.973671 -0.9998174 0.9791616 0.9790917 -0.9998557 0.9834561 0.9834123 -0.999886 0.9868776 0.9868501 -0.9999099 0.9895989 0.9895817 -0.9999288 0.9917607 0.9917499 -0.9999437 0.9934761 0.9934694 -0.0624569 0.9354466 0.0937372 -0.0624063 0.9354101 0.0933783 -0.0623458 0.9353643 0.0929273 -0.0622749 0.9353068 0.0923618 -0.0621943 0.9352348 0.0916543 -0.0621069 0.9351449 0.090772 -0.0620199 0.9350332 0.0896764 -0.0619473 0.9348949 0.0883235 -0.061916 0.9347252 0.0866656 -0.0619734 0.9345187 0.0846546 -0.062202 0.9342712 0.0822505 -0.062742 0.9339805 0.0794363 -0.0638283 0.9336494 0.0762454 -0.0658501 0.9332914 0.0728103 -0.0694453 0.9329391 0.0694453 -0.0782816 0.9329391 0.0694453 -0.0894608 0.9329391 0.0694453 -0.1036038 0.9329391 0.0694453 -0.1214966 0.9329391 0.0694453 -0.1441333 0.9329391 0.0694453 -0.1727717 0.9329391 0.0694453 -0.209003 0.9329391 0.0694453 -0.2548403 0.9329391 0.0694453 -0.3128305 0.9329391 0.0694453 -0.3861956 0.9329391 0.0694453 -0.479012 0.9329391 0.0694453 -0.5964367 0.9329391 0.0694453 -0.7449944 0.9329391 0.0694453 -0.9329391 0.9329391 0.0694453 -0.9533177 0.7713628 0.1105818 -0.9662809 0.6565952 0.160092 -0.9750472 0.5840612 0.2167545 -0.9812231 0.5469301 0.2791873 -0.9857006 0.5380548 0.3457234 -0.9890146 0.5505995 0.4144423 -0.9915054 0.5783109 0.4833013 -0.9933988 0.6156963 0.5503203 -0.9948509 0.6581595 0.6137675 -0.9959719 0.7020756 0.6723012 -0.9968418 0.7447892 0.7250408 -0.9975194 0.7845333 0.7715641 -0.9980491 0.8202905 0.8118466 -0.998464 0.8516256 0.8461687 -0.9987896 0.8785191 0.8750145 -0.9990456 0.9012195 0.8989805 -0.9992471 0.920127 0.9187027 -0.9994058 0.9357084 0.9348056 -0.9995309 0.9484397 0.9478691 -0.9996295 0.9587718 0.958412 -0.9997074 0.9671112 0.9668847 -0.9997688 0.9738133 0.973671 -0.9998174 0.979181 0.9790917 -0.9998557 0.9834683 0.9834123 -0.999886 0.9868852 0.9868501 -0.9999099 0.9896037 0.9895817 -0.9999288 0.9917637 0.9917499 -0.9999437 0.993478 0.9934694 -0.1059991 0.9545467 0.1300248 -0.1059489 0.9545286 0.1297365 -0.1058883 0.9545059 0.1293745 -0.1058162 0.9544774 0.1289204 -0.1057322 0.9544418 0.1283525 -0.1056375 0.9543974 0.1276445 -0.1055364 0.9543421 0.1267655 -0.1054384 0.9542739 0.1256805 -0.1053624 0.9541902 0.1243513 -0.1053433 0.9540886 0.12274 -0.1054431 0.9539671 0.1208148 -0.1057683 0.9538247 0.1185628 -0.1064997 0.953663 0.1160116 -0.1079385 0.9534887 0.1132674 -0.1105818 0.9533177 0.1105818 -0.1173437 0.9533177 0.1105818 -0.1258985 0.9533177 0.1105818 -0.1367213 0.9533177 0.1105818 -0.1504136 0.9533177 0.1105818 -0.1677362 0.9533177 0.1105818 -0.1896515 0.9533177 0.1105818 -0.2173771 0.9533177 0.1105818 -0.2524537 0.9533177 0.1105818 -0.2968302 0.9533177 0.1105818 -0.3529722 0.9533177 0.1105818 -0.4239991 0.9533177 0.1105818 -0.5138574 0.9533177 0.1105818 -0.6275398 0.9533177 0.1105818 -0.7713628 0.9533177 0.1105818 -0.9533177 0.9533177 0.1105818 -0.9662809 0.7933139 0.160092 -0.9750472 0.685204 0.2167545 -0.9812231 0.6206566 0.2791873 -0.9857006 0.5910158 0.3457234 -0.9890146 0.5880922 0.4144423 -0.9915054 0.604473 0.4833013 -0.9933988 0.6336985 0.5503203 -0.9948509 0.6703834 0.6137675 -0.9959719 0.7102744 0.6723012 -0.9968418 0.7502272 0.7250408 -0.9975194 0.7881046 0.7715641 -0.9980491 0.8226156 0.8118466 -0.998464 0.8531283 0.8461687 -0.9987896 0.8794841 0.8750145 -0.9990456 0.901836 0.8989805 -0.9992471 0.9205192 0.9187027 -0.9994058 0.935957 0.9348056 -0.9995309 0.9485969 0.9478691 -0.9996295 0.9588709 0.958412 -0.9997074 0.9671736 0.9668847 -0.9997688 0.9738525 0.973671 -0.9998174 0.9792056 0.9790917 -0.9998557 0.9834837 0.9834123 -0.999886 0.9868949 0.9868501 -0.9999099 0.9896098 0.9895817 -0.9999288 0.9917675 0.9917499 -0.9999437 0.9934804 0.9934694 -0.1572498 0.9669269 0.1753664 -0.1572031 0.9669173 0.1751393 -0.1571463 0.9669053 0.1748539 -0.1570779 0.9668902 0.1744962 -0.1569971 0.9668714 0.1740488 -0.156904 0.9668479 0.1734912 -0.1568008 0.9668187 0.1727991 -0.1566936 0.9667827 0.1719451 -0.1565954 0.9667385 0.1708992 -0.1565315 0.966685 0.169632 -0.1565473 0.9666211 0.1681189 -0.1567226 0.9665463 0.1663501 -0.1571937 0.9664615 0.1643478 -0.15819 0.9663702 0.1621961 -0.160092 0.9662809 0.160092 -0.1651729 0.9662809 0.160092 -0.1716008 0.9662809 0.160092 -0.179733 0.9662809 0.160092 -0.1900212 0.9662809 0.160092 -0.2030372 0.9662809 0.160092 -0.219504 0.9662809 0.160092 -0.2403368 0.9662809 0.160092 -0.2666929 0.9662809 0.160092 -0.3000369 0.9662809 0.160092 -0.3422213 0.9662809 0.160092 -0.3955901 0.9662809 0.160092 -0.4631086 0.9662809 0.160092 -0.5485282 0.9662809 0.160092 -0.6565952 0.9662809 0.160092 -0.7933139 0.9662809 0.160092 -0.9662809 0.9662809 0.160092 -0.9750472 0.8131627 0.2167545 -0.9812231 0.7139303 0.2791873 -0.9857006 0.6580183 0.3457234 -0.9890146 0.6355254 0.4144423 -0.9915054 0.6375715 0.4833013 -0.9933988 0.6564735 0.5503203 -0.9948509 0.6858483 0.6137675 -0.9959719 0.720647 0.6723012 -0.9968418 0.757107 0.7250408 -0.9975194 0.7926227 0.7715641 -0.9980491 0.8255572 0.8118466 -0.998464 0.8550293 0.8461687 -0.9987896 0.880705 0.8750145 -0.9990456 0.902616 0.8989805 -0.9992471 0.9210153 0.9187027 -0.9994058 0.9362715 0.9348056 -0.9995309 0.9487957 0.9478691 -0.9996295 0.9589962 0.958412 -0.9997074 0.9672525 0.9668847 -0.9997688 0.9739021 0.973671 -0.9998174 0.9792367 0.9790917 -0.9998557 0.9835032 0.9834123 -0.999886 0.9869071 0.9868501 -0.9999099 0.9896174 0.9895817 -0.9999288 0.9917723 0.9917499 -0.9999437 0.9934834 0.9934694 -0.2151269 0.9754027 0.2285707 -0.2150852 0.9753975 0.2283945 -0.2150342 0.9753908 0.2281732 -0.2149725 0.9753825 0.2278958 -0.2148987 0.9753721 0.2275489 -0.2148124 0.9753591 0.2271165 -0.2147144 0.975343 0.2265801 -0.2146085 0.9753231 0.2259183 -0.2145034 0.9752987 0.2251082 -0.2144168 0.9752692 0.224127 -0.2143816 0.975234 0.222956 -0.2144566 0.9751928 0.2215879 -0.2147432 0.9751462 0.2200403 -0.2154135 0.9750962 0.2183784 -0.2167545 0.9750472 0.2167545 -0.2205133 0.9750472 0.2167545 -0.2252686 0.9750472 0.2167545 -0.2312846 0.9750472 0.2167545 -0.2388957 0.9750472 0.2167545 -0.2485248 0.9750472 0.2167545 -0.2607068 0.9750472 0.2167545 -0.2761186 0.9750472 0.2167545 -0.2956165 0.9750472 0.2167545 -0.3202839 0.9750472 0.2167545 -0.3514914 0.9750472 0.2167545 -0.390973 0.9750472 0.2167545 -0.4409223 0.9750472 0.2167545 -0.5041146 0.9750472 0.2167545 -0.5840612 0.9750472 0.2167545 -0.685204 0.9750472 0.2167545 -0.8131627 0.9750472 0.2167545 -0.9750472 0.9750472 0.2167545 -0.9812231 0.8319336 0.2791873 -0.9857006 0.7427853 0.3457234 -0.9890146 0.6955345 0.4144423 -0.9915054 0.6794455 0.4833013 -0.9933988 0.685287 0.5503203 -0.9948509 0.7054133 0.6137675 -0.9959719 0.7337696 0.6723012 -0.9968418 0.7658108 0.7250408 -0.9975194 0.7983387 0.7715641 -0.9980491 0.8292787 0.8118466 -0.998464 0.8574344 0.8461687 -0.9987896 0.8822496 0.8750145 -0.9990456 0.9036028 0.8989805 -0.9992471 0.9216431 0.9187027 -0.9994058 0.9366694 0.9348056 -0.9995309 0.9490471 0.9478691 -0.9996295 0.9591548 0.958412 -0.9997074 0.9673523 0.9668847 -0.9997688 0.9739648 0.973671 -0.9998174 0.9792761 0.9790917 -0.9998557 0.9835279 0.9834123 -0.999886 0.9869226 0.9868501 -0.9999099 0.9896271 0.9895817 -0.9999288 0.9917783 0.9917499 -0.9999437 0.9934872 0.9934694 -0.2783684 0.9814251 0.2881937 -0.2783325 0.9814221 0.2880591 -0.2782884 0.9814183 0.2878901 -0.2782347 0.9814136 0.2876782 -0.2781701 0.9814076 0.2874132 -0.2780936 0.9814002 0.2870831 -0.2780055 0.9813911 0.2866736 -0.2779077 0.9813797 0.2861685 -0.2778058 0.9813659 0.2855503 -0.2777122 0.9813491 0.2848019 -0.2776503 0.9813291 0.283909 -0.2776626 0.9813057 0.2828664 -0.2778236 0.9812792 0.2816876 -0.2782606 0.9812508 0.2804226 -0.2791873 0.9812231 0.2791873 -0.2819272 0.9812231 0.2791873 -0.2853935 0.9812231 0.2791873 -0.2897788 0.9812231 0.2791873 -0.2953268 0.9812231 0.2791873 -0.3023458 0.9812231 0.2791873 -0.3112256 0.9812231 0.2791873 -0.3224598 0.9812231 0.2791873 -0.3366726 0.9812231 0.2791873 -0.3546535 0.9812231 0.2791873 -0.3774018 0.9812231 0.2791873 -0.4061813 0.9812231 0.2791873 -0.4425911 0.9812231 0.2791873 -0.4886542 0.9812231 0.2791873 -0.5469301 0.9812231 0.2791873 -0.6206566 0.9812231 0.2791873 -0.7139303 0.9812231 0.2791873 -0.8319336 0.9812231 0.2791873 -0.9812231 0.9812231 0.2791873 -0.9857006 0.8500265 0.3457234 -0.9890146 0.7714538 0.4144423 -0.9915054 0.7324214 0.4833013 -0.9933988 0.7217397 0.5503203 -0.9948509 0.7301657 0.6137675 -0.9959719 0.7503714 0.6723012 -0.9968418 0.7768223 0.7250408 -0.9975194 0.8055701 0.7715641 -0.9980491 0.8339868 0.8118466 -0.998464 0.860477 0.8461687 -0.9987896 0.8842037 0.8750145 -0.9990456 0.9048512 0.8989805 -0.9992471 0.9224372 0.9187027 -0.9994058 0.9371728 0.9348056 -0.9995309 0.9493653 0.9478691 -0.9996295 0.9593554 0.958412 -0.9997074 0.9674786 0.9668847 -0.9997688 0.9740442 0.973671 -0.9998174 0.9793259 0.9790917 -0.9998557 0.9835592 0.9834123 -0.999886 0.9869421 0.9868501 -0.9999099 0.9896394 0.9895817 -0.9999288 0.991786 0.9917499 -0.9999437 0.993492 0.9934694 -0.3454107 0.9858181 0.352484 -0.3453807 0.9858163 0.3523828 -0.3453439 0.9858141 0.3522557 -0.3452987 0.9858113 0.3520964 -0.3452442 0.9858079 0.3518972 -0.3451791 0.9858036 0.351649 -0.3451032 0.9857982 0.3513412 -0.3450175 0.9857916 0.3509616 -0.3449254 0.9857835 0.3504972 -0.3448353 0.9857738 0.3499351 -0.3447636 0.9857621 0.3492646 -0.3447407 0.9857485 0.3484821 -0.3448204 0.9857332 0.3475978 -0.3450957 0.9857167 0.3466492 -0.3457234 0.9857006 0.3457234 -0.3476916 0.9857006 0.3457234 -0.3501816 0.9857006 0.3457234 -0.3533318 0.9857006 0.3457234 -0.3573171 0.9857006 0.3457234 -0.3623592 0.9857006 0.3457234 -0.368738 0.9857006 0.3457234 -0.376808 0.9857006 0.3457234 -0.3870176 0.9857006 0.3457234 -0.3999341 0.9857006 0.3457234 -0.4162752 0.9857006 0.3457234 -0.4369488 0.9857006 0.3457234 -0.4631035 0.9857006 0.3457234 -0.4961927 0.9857006 0.3457234 -0.5380548 0.9857006 0.3457234 -0.5910158 0.9857006 0.3457234 -0.6580183 0.9857006 0.3457234 -0.7427853 0.9857006 0.3457234 -0.8500265 0.9857006 0.3457234 -0.9857006 0.9857006 0.3457234 -0.9890146 0.8675017 0.4144423 -0.9915054 0.7994429 0.4833013 -0.9933988 0.7678572 0.5503203 -0.9948509 0.7614806 0.6137675 -0.9959719 0.7713748 0.6723012 -0.9968418 0.7907532 0.7250408 -0.9975194 0.8147189 0.7715641 -0.9980491 0.8399433 0.8118466 -0.998464 0.8643265 0.8461687 -0.9987896 0.8866758 0.8750145 -0.9990456 0.9064306 0.8989805 -0.9992471 0.9234419 0.9187027 -0.9994058 0.9378096 0.9348056 -0.9995309 0.9497678 0.9478691 -0.9996295 0.9596092 0.958412 -0.9997074 0.9676383 0.9668847 -0.9997688 0.9741446 0.973671 -0.9998174 0.9793889 0.9790917 -0.9998557 0.9835987 0.9834123 -0.999886 0.9869669 0.9868501 -0.9999099 0.9896549 0.9895817 -0.9999288 0.9917957 0.9917499 -0.9999437 0.993498 0.9934694 -0.4144197 0.9890841 0.4194363 -0.4143955 0.9890831 0.4193615 -0.4143657 0.9890818 0.4192674 -0.414329 0.9890801 0.4191496 -0.4142845 0.9890781 0.4190022 -0.4142311 0.9890755 0.4188187 -0.4141683 0.9890723 0.4185911 -0.4140964 0.9890684 0.4183104 -0.4140176 0.9890637 0.4179671 -0.4139373 0.9890579 0.4175516 -0.4138668 0.989051 0.4170563 -0.4138277 0.989043 0.4164783 -0.4138582 0.9890339 0.4158254 -0.4140252 0.9890241 0.4151253 -0.4144423 0.9890146 0.4144423 -0.4158356 0.9890146 0.4144423 -0.4175984 0.9890146 0.4144423 -0.4198285 0.9890146 0.4144423 -0.4226498 0.9890146 0.4144423 -0.4262192 0.9890146 0.4144423 -0.430735 0.9890146 0.4144423 -0.436448 0.9890146 0.4144423 -0.4436757 0.9890146 0.4144423 -0.4528197 0.9890146 0.4144423 -0.464388 0.9890146 0.4144423 -0.4790235 0.9890146 0.4144423 -0.4975392 0.9890146 0.4144423 -0.5209641 0.9890146 0.4144423 -0.5505995 0.9890146 0.4144423 -0.5880922 0.9890146 0.4144423 -0.6355254 0.9890146 0.4144423 -0.6955345 0.9890146 0.4144423 -0.7714538 0.9890146 0.4144423 -0.8675017 0.9890146 0.4144423 -0.9890146 0.9890146 0.4144423 -0.9915054 0.8842338 0.4833013 -0.9933988 0.8262017 0.5503203 -0.9948509 0.801098 0.6137675 -0.9959719 0.7979469 0.6723012 -0.9968418 0.8083776 0.7250408 -0.9975194 0.8262932 0.7715641 -0.9980491 0.847479 0.8118466 -0.998464 0.8691965 0.8461687 -0.9987896 0.8898035 0.8750145 -0.9990456 0.9084287 0.8989805 -0.9992471 0.924713 0.9187027 -0.9994058 0.9386153 0.9348056 -0.9995309 0.9502771 0.9478691 -0.9996295 0.9599303 0.958412 -0.9997074 0.9678404 0.9668847 -0.9997688 0.9742716 0.973671 -0.9998174 0.9794687 0.9790917 -0.9998557 0.9836487 0.9834123 -0.999886 0.9869982 0.9868501 -0.9999099 0.9896745 0.9895817 -0.9999288 0.991808 0.9917499 -0.9999437 0.9935057 0.9934694 -0.4834235 0.9915469 0.4869294 -0.4834045 0.9915463 0.4868749 -0.4833811 0.9915455 0.4868065 -0.4833522 0.9915446 0.4867208 -0.4833171 0.9915433 0.4866137 -0.4832747 0.9915418 0.4864802 -0.4832246 0.9915399 0.4863147 -0.4831666 0.9915376 0.4861106 -0.4831021 0.9915347 0.4858611 -0.4830346 0.9915312 0.4855591 -0.4829718 0.9915271 0.4851992 -0.4829286 0.9915223 0.4847793 -0.4829319 0.9915169 0.4843052 -0.4830292 0.991511 0.4837969 -0.4833013 0.9915054 0.4833013 -0.4842735 0.9915054 0.4833013 -0.4855036 0.9915054 0.4833013 -0.4870597 0.9915054 0.4833013 -0.4890285 0.9915054 0.4833013 -0.4915192 0.9915054 0.4833013 -0.4946702 0.9915054 0.4833013 -0.4986567 0.9915054 0.4833013 -0.5037002 0.9915054 0.4833013 -0.5100808 0.9915054 0.4833013 -0.5181531 0.9915054 0.4833013 -0.5283656 0.9915054 0.4833013 -0.5412858 0.9915054 0.4833013 -0.5576314 0.9915054 0.4833013 -0.5783109 0.9915054 0.4833013 -0.604473 0.9915054 0.4833013 -0.6375715 0.9915054 0.4833013 -0.6794455 0.9915054 0.4833013 -0.7324214 0.9915054 0.4833013 -0.7994429 0.9915054 0.4833013 -0.8842338 0.9915054 0.4833013 -0.9915054 0.9915054 0.4833013 -0.9933988 0.9000152 0.5503203 -0.9948509 0.8512193 0.6137675 -0.9959719 0.8315641 0.6723012 -0.9968418 0.8306748 0.7250408 -0.9975194 0.8409363 0.7715641 -0.9980491 0.8570126 0.8118466 -0.998464 0.8753576 0.8461687 -0.9987896 0.8937603 0.8750145 -0.9990456 0.9109567 0.8989805 -0.9992471 0.926321 0.9187027 -0.9994058 0.9396346 0.9348056 -0.9995309 0.9509213 0.9478691 -0.9996295 0.9603366 0.958412 -0.9997074 0.9680961 0.9668847 -0.9997688 0.9744323 0.973671 -0.9998174 0.9795695 0.9790917 -0.9998557 0.9837119 0.9834123 -0.999886 0.9870379 0.9868501 -0.9999099 0.9896993 0.9895817 -0.9999288 0.9918235 0.9917499 -0.9999437 0.9935154 0.9934694 -0.5504963 0.993424 0.5529117 -0.5504818 0.9934236 0.5528728 -0.550464 0.9934231 0.5528239 -0.5504419 0.9934225 0.5527626 -0.550415 0.9934218 0.552686 -0.5503825 0.9934209 0.5525906 -0.5503438 0.9934197 0.5524723 -0.5502987 0.9934183 0.5523265 -0.550248 0.9934166 0.5521481 -0.5501939 0.9934145 0.5519324 -0.5501416 0.993412 0.5516753 -0.5501012 0.9934091 0.5513754 -0.5500915 0.9934058 0.5510368 -0.5501456 0.9934023 0.550674 -0.5503203 0.9933988 0.5503203 -0.5509893 0.9933988 0.5503203 -0.5518357 0.9933988 0.5503203 -0.5529065 0.9933988 0.5503203 -0.5542612 0.9933988 0.5503203 -0.555975 0.9933988 0.5503203 -0.5581433 0.9933988 0.5503203 -0.5608864 0.9933988 0.5503203 -0.5643568 0.9933988 0.5503203 -0.5687472 0.9933988 0.5503203 -0.5743018 0.9933988 0.5503203 -0.581329 0.9933988 0.5503203 -0.5902194 0.9933988 0.5503203 -0.6014668 0.9933988 0.5503203 -0.6156963 0.9933988 0.5503203 -0.6336985 0.9933988 0.5503203 -0.6564735 0.9933988 0.5503203 -0.685287 0.9933988 0.5503203 -0.7217397 0.9933988 0.5503203 -0.7678572 0.9933988 0.5503203 -0.8262017 0.9933988 0.5503203 -0.9000152 0.9933988 0.5503203 -0.9933988 0.9933988 0.5503203 -0.9948509 0.9146292 0.6137675 -0.9959719 0.8740941 0.6723012 -0.9968418 0.8588837 0.7250408 -0.9975194 0.8594616 0.7715641 -0.9980491 0.8690738 0.8118466 -0.998464 0.8831523 0.8461687 -0.9987896 0.8987663 0.8750145 -0.9990456 0.9141548 0.8989805 -0.9992471 0.9283554 0.9187027 -0.9994058 0.9409242 0.9348056 -0.9995309 0.9517364 0.9478691 -0.9996295 0.9608506 0.958412 -0.9997074 0.9684196 0.9668847 -0.9997688 0.9746356 0.973671 -0.9998174 0.9796971 0.9790917 -0.9998557 0.983792 0.9834123 -0.999886 0.987088 0.9868501 -0.9999099 0.9897307 0.9895817 -0.9999288 0.9918432 0.9917499 -0.9999437 0.9935277 0.9934694 -0.6139459 0.9948662 0.6155878 -0.6139352 0.994866 0.6155604 -0.6139219 0.9948657 0.615526 -0.6139056 0.9948653 0.615483 -0.6138855 0.9948649 0.6154291 -0.6138613 0.9948643 0.6153621 -0.6138323 0.9948636 0.6152789 -0.6137984 0.9948628 0.6151764 -0.6137599 0.9948617 0.6150511 -0.6137183 0.9948604 0.6148995 -0.6136769 0.9948589 0.6147189 -0.6136427 0.9948571 0.6145083 -0.6136284 0.9948551 0.6142705 -0.6136569 0.994853 0.6140158 -0.6137675 0.9948509 0.6137675 -0.6142218 0.9948509 0.6137675 -0.6147965 0.9948509 0.6137675 -0.6155236 0.9948509 0.6137675 -0.6164434 0.9948509 0.6137675 -0.6176072 0.9948509 0.6137675 -0.6190795 0.9948509 0.6137675 -0.6209421 0.9948509 0.6137675 -0.6232986 0.9948509 0.6137675 -0.6262799 0.9948509 0.6137675 -0.6300515 0.9948509 0.6137675 -0.6348232 0.9948509 0.6137675 -0.64086 0.9948509 0.6137675 -0.6484973 0.9948509 0.6137675 -0.6581595 0.9948509 0.6137675 -0.6703834 0.9948509 0.6137675 -0.6858483 0.9948509 0.6137675 -0.7054133 0.9948509 0.6137675 -0.7301657 0.9948509 0.6137675 -0.7614806 0.9948509 0.6137675 -0.801098 0.9948509 0.6137675 -0.8512193 0.9948509 0.6137675 -0.9146292 0.9948509 0.6137675 -0.9948509 0.9948509 0.6137675 -0.9959719 0.9279002 0.6723012 -0.9968418 0.8945716 0.7250408 -0.9975194 0.8828986 0.7715641 -0.9980491 0.8843329 0.8118466 -0.998464 0.8930136 0.8461687 -0.9987896 0.9050994 0.8750145 -0.9990456 0.9182009 0.8989805 -0.9992471 0.9309292 0.9187027 -0.9994058 0.9425556 0.9348056 -0.9995309 0.9527675 0.9478691 -0.9996295 0.9615008 0.958412 -0.9997074 0.9688289 0.9668847 -0.9997688 0.9748928 0.973671 -0.9998174 0.9798586 0.9790917 -0.9998557 0.9838932 0.9834123 -0.999886 0.9871514 0.9868501 -0.9999099 0.9897705 0.9895817 -0.9999288 0.9918681 0.9917499 -0.9999437 0.9935433 0.9934694 -0.6724572 0.9959813 0.6735594 -0.6724495 0.9959811 0.6735405 -0.6724399 0.9959809 0.6735167 -0.672428 0.9959807 0.6734869 -0.6724135 0.9959804 0.6734497 -0.6723959 0.9959801 0.6734033 -0.6723748 0.9959797 0.6733458 -0.67235 0.9959791 0.6732749 -0.6723217 0.9959785 0.6731883 -0.6722907 0.9959777 0.6730835 -0.6722594 0.9959768 0.6729586 -0.6722322 0.9959757 0.672813 -0.672218 0.9959745 0.6726487 -0.672232 0.9959732 0.6724727 -0.6723012 0.9959719 0.6723012 -0.6726059 0.9959719 0.6723012 -0.6729913 0.9959719 0.6723012 -0.673479 0.9959719 0.6723012 -0.674096 0.9959719 0.6723012 -0.6748765 0.9959719 0.6723012 -0.675864 0.9959719 0.6723012 -0.6771133 0.9959719 0.6723012 -0.6786939 0.9959719 0.6723012 -0.6806934 0.9959719 0.6723012 -0.6832232 0.9959719 0.6723012 -0.6864236 0.9959719 0.6723012 -0.6904726 0.9959719 0.6723012 -0.695595 0.9959719 0.6723012 -0.7020756 0.9959719 0.6723012 -0.7102744 0.9959719 0.6723012 -0.720647 0.9959719 0.6723012 -0.7337696 0.9959719 0.6723012 -0.7503714 0.9959719 0.6723012 -0.7713748 0.9959719 0.6723012 -0.7979469 0.9959719 0.6723012 -0.8315641 0.9959719 0.6723012 -0.8740941 0.9959719 0.6723012 -0.9279002 0.9959719 0.6723012 -0.9959719 0.9959719 0.6723012 -0.9968418 0.9397214 0.7250408 -0.9975194 0.9125495 0.7715641 -0.9980491 0.9036376 0.8118466 -0.998464 0.9054895 0.8461687 -0.9987896 0.9131117 0.8750145 -0.9990456 0.9233198 0.8989805 -0.9992471 0.9341854 0.9187027 -0.9994058 0.9446196 0.9348056 -0.9995309 0.9540721 0.9478691 -0.9996295 0.9623234 0.958412 -0.9997074 0.9693466 0.9668847 -0.9997688 0.9752181 0.973671 -0.9998174 0.9800628 0.9790917 -0.9998557 0.9840213 0.9834123 -0.999886 0.9872317 0.9868501 -0.9999099 0.9898207 0.9895817 -0.9999288 0.9918995 0.9917499 -0.9999437 0.993563 0.9934694 -0.7251659 0.9968475 0.7258976 -0.7251605 0.9968474 0.7258847 -0.7251537 0.9968473 0.7258685 -0.7251454 0.9968472 0.7258482 -0.7251351 0.996847 0.7258228 -0.7251226 0.9968468 0.7257912 -0.7251076 0.9968465 0.725752 -0.7250899 0.9968462 0.7257037 -0.7250697 0.9968458 0.7256447 -0.7250473 0.9968453 0.7255733 -0.7250244 0.9968448 0.7254883 -0.7250039 0.9968441 0.7253892 -0.7249916 0.9968433 0.7252773 -0.7249978 0.9968425 0.7251575 -0.7250408 0.9968418 0.7250408 -0.7252429 0.9968418 0.7250408 -0.7254985 0.9968418 0.7250408 -0.725822 0.9968418 0.7250408 -0.7262312 0.9968418 0.7250408 -0.7267489 0.9968418 0.7250408 -0.7274039 0.9968418 0.7250408 -0.7282325 0.9968418 0.7250408 -0.7292808 0.9968418 0.7250408 -0.7306071 0.9968418 0.7250408 -0.732285 0.9968418 0.7250408 -0.7344077 0.9968418 0.7250408 -0.7370933 0.9968418 0.7250408 -0.7404909 0.9968418 0.7250408 -0.7447892 0.9968418 0.7250408 -0.7502272 0.9968418 0.7250408 -0.757107 0.9968418 0.7250408 -0.7658108 0.9968418 0.7250408 -0.7768223 0.9968418 0.7250408 -0.7907532 0.9968418 0.7250408 -0.8083776 0.9968418 0.7250408 -0.8306748 0.9968418 0.7250408 -0.8588837 0.9968418 0.7250408 -0.8945716 0.9968418 0.7250408 -0.9397214 0.9968418 0.7250408 -0.9968418 0.9968418 0.7250408 -0.9975194 0.9500617 0.7715641 -0.9980491 0.9280606 0.8118466 -0.998464 0.921273 0.8461687 -0.9987896 0.9232483 0.8750145 -0.9990456 0.9297957 0.8989805 -0.9992471 0.9383049 0.9187027 -0.9994058 0.9472309 0.9348056 -0.9995309 0.9557225 0.9478691 -0.9996295 0.9633641 0.958412 -0.9997074 0.9700016 0.9668847 -0.9997688 0.9756298 0.973671 -0.9998174 0.9803212 0.9790917 -0.9998557 0.9841833 0.9834123 -0.999886 0.9873332 0.9868501 -0.9999099 0.9898843 0.9895817 -0.9999288 0.9919393 0.9917499 -0.9999437 0.9935879 0.9934694 -0.7716588 0.997523 0.7721396 -0.7716551 0.997523 0.7721309 -0.7716504 0.9975229 0.77212 -0.7716446 0.9975228 0.7721064 -0.7716375 0.9975227 0.7720893 -0.7716288 0.9975226 0.7720681 -0.7716184 0.9975224 0.7720418 -0.7716061 0.9975222 0.7720094 -0.7715919 0.997522 0.7719697 -0.7715762 0.9975217 0.7719217 -0.7715599 0.9975213 0.7718646 -0.7715449 0.9975209 0.771798 -0.7715352 0.9975204 0.7717229 -0.7715376 0.9975199 0.7716425 -0.7715641 0.9975194 0.7715641 -0.7716968 0.9975194 0.7715641 -0.7718647 0.9975194 0.7715641 -0.7720771 0.9975194 0.7715641 -0.7723459 0.9975194 0.7715641 -0.7726859 0.9975194 0.7715641 -0.773116 0.9975194 0.7715641 -0.7736602 0.9975194 0.7715641 -0.7743486 0.9975194 0.7715641 -0.7752196 0.9975194 0.7715641 -0.7763215 0.9975194 0.7715641 -0.7777156 0.9975194 0.7715641 -0.7794792 0.9975194 0.7715641 -0.7817105 0.9975194 0.7715641 -0.7845333 0.9975194 0.7715641 -0.7881046 0.9975194 0.7715641 -0.7926227 0.9975194 0.7715641 -0.7983387 0.9975194 0.7715641 -0.8055701 0.9975194 0.7715641 -0.8147189 0.9975194 0.7715641 -0.8262932 0.9975194 0.7715641 -0.8409363 0.9975194 0.7715641 -0.8594616 0.9975194 0.7715641 -0.8828986 0.9975194 0.7715641 -0.9125495 0.9975194 0.7715641 -0.9500617 0.9975194 0.7715641 -0.9975194 0.9975194 0.7715641 -0.9980491 0.9589588 0.8118466 -0.998464 0.9412413 0.8461687 -0.9987896 0.9360723 0.8750145 -0.9990456 0.9379887 0.8989805 -0.9992471 0.9435166 0.9187027 -0.9994058 0.9505344 0.9348056 -0.9995309 0.9578105 0.9478691 -0.9996295 0.9646808 0.958412 -0.9997074 0.9708303 0.9668847 -0.9997688 0.9761506 0.973671 -0.9998174 0.9806481 0.9790917 -0.9998557 0.9843883 0.9834123 -0.999886 0.9874617 0.9868501 -0.9999099 0.9899648 0.9895817 -0.9999288 0.9919897 0.9917499 -0.9999437 0.9936194 0.9934694 -0.8119154 0.9980513 0.8122285 -0.8119128 0.9980512 0.8122228 -0.8119096 0.9980512 0.8122156 -0.8119057 0.9980511 0.8122065 -0.8119009 0.9980511 0.8121952 -0.8118949 0.998051 0.8121811 -0.8118878 0.9980509 0.8121636 -0.8118794 0.9980508 0.8121421 -0.8118697 0.9980506 0.8121158 -0.8118589 0.9980504 0.8120839 -0.8118476 0.9980502 0.812046 -0.811837 0.99805 0.8120018 -0.8118298 0.9980497 0.811952 -0.8118303 0.9980494 0.8118986 -0.8118466 0.9980491 0.8118466 -0.811933 0.9980491 0.8118466 -0.8120423 0.9980491 0.8118466 -0.8121806 0.9980491 0.8118466 -0.8123556 0.9980491 0.8118466 -0.812577 0.9980491 0.8118466 -0.812857 0.9980491 0.8118466 -0.8132113 0.9980491 0.8118466 -0.8136595 0.9980491 0.8118466 -0.8142266 0.9980491 0.8118466 -0.814944 0.9980491 0.8118466 -0.8158516 0.9980491 0.8118466 -0.8169999 0.9980491 0.8118466 -0.8184526 0.9980491 0.8118466 -0.8202905 0.9980491 0.8118466 -0.8226156 0.9980491 0.8118466 -0.8255572 0.9980491 0.8118466 -0.8292787 0.9980491 0.8118466 -0.8339868 0.9980491 0.8118466 -0.8399433 0.9980491 0.8118466 -0.847479 0.9980491 0.8118466 -0.8570126 0.9980491 0.8118466 -0.8690738 0.9980491 0.8118466 -0.8843329 0.9980491 0.8118466 -0.9036376 0.9980491 0.8118466 -0.9280606 0.9980491 0.8118466 -0.9589588 0.9980491 0.8118466 -0.9980491 0.9980491 0.8118466 -0.998464 0.9665037 0.8461687 -0.9987896 0.9522964 0.8750145 -0.9990456 0.9483538 0.8989805 -0.9992471 0.9501101 0.9187027 -0.9994058 0.9547138 0.9348056 -0.9995309 0.9604521 0.9478691 -0.9996295 0.9663465 0.958412 -0.9997074 0.9718787 0.9668847 -0.9997688 0.9768095 0.973671 -0.9998174 0.9810617 0.9790917 -0.9998557 0.9846477 0.9834123 -0.999886 0.9876242 0.9868501 -0.9999099 0.9900665 0.9895817 -0.9999288 0.9920534 0.9917499 -0.9999437 0.9936592 0.9934694 -0.8462171 0.9984653 0.8464195 -0.8462154 0.9984653 0.8464157 -0.8462132 0.9984653 0.846411 -0.8462106 0.9984653 0.8464051 -0.8462073 0.9984652 0.8463976 -0.8462034 0.9984652 0.8463884 -0.8461986 0.9984651 0.8463769 -0.8461929 0.998465 0.8463627 -0.8461864 0.9984649 0.8463455 -0.8461791 0.9984648 0.8463246 -0.8461714 0.9984647 0.8462997 -0.8461641 0.9984645 0.8462707 -0.8461589 0.9984643 0.8462379 -0.8461587 0.9984642 0.8462029 -0.8461687 0.998464 0.8461687 -0.8462246 0.998464 0.8461687 -0.8462952 0.998464 0.8461687 -0.8463846 0.998464 0.8461687 -0.8464977 0.998464 0.8461687 -0.8466407 0.998464 0.8461687 -0.8468217 0.998464 0.8461687 -0.8470507 0.998464 0.8461687 -0.8473404 0.998464 0.8461687 -0.8477068 0.998464 0.8461687 -0.8481705 0.998464 0.8461687 -0.848757 0.998464 0.8461687 -0.8494991 0.998464 0.8461687 -0.8504379 0.998464 0.8461687 -0.8516256 0.998464 0.8461687 -0.8531283 0.998464 0.8461687 -0.8550293 0.998464 0.8461687 -0.8574344 0.998464 0.8461687 -0.860477 0.998464 0.8461687 -0.8643265 0.998464 0.8461687 -0.8691965 0.998464 0.8461687 -0.8753576 0.998464 0.8461687 -0.8831523 0.998464 0.8461687 -0.8930136 0.998464 0.8461687 -0.9054895 0.998464 0.8461687 -0.921273 0.998464 0.8461687 -0.9412413 0.998464 0.8461687 -0.9665037 0.998464 0.8461687 -0.998464 0.998464 0.8461687 -0.9987896 0.9728221 0.8750145 -0.9990456 0.9614671 0.8989805 -0.9992471 0.9584517 0.9187027 -0.9994058 0.9600013 0.9348056 -0.9995309 0.9637941 0.9478691 -0.9996295 0.9684539 0.958412 -0.9997074 0.9732051 0.9668847 -0.9997688 0.977643 0.973671 -0.9998174 0.9815849 0.9790917 -0.9998557 0.9849758 0.9834123 -0.999886 0.9878298 0.9868501 -0.9999099 0.9901953 0.9895817 -0.9999288 0.992134 0.9917499 -0.9999437 0.9937097 0.9934694 -0.8750477 0.9987905 0.8751778 -0.8750466 0.9987905 0.8751753 -0.8750451 0.9987904 0.8751722 -0.8750434 0.9987904 0.8751683 -0.8750412 0.9987904 0.8751635 -0.8750386 0.9987904 0.8751575 -0.8750355 0.9987903 0.87515 -0.8750317 0.9987903 0.8751408 -0.8750274 0.9987902 0.8751295 -0.8750225 0.9987902 0.8751159 -0.8750173 0.9987901 0.8750997 -0.8750124 0.99879 0.8750809 -0.8750088 0.9987899 0.8750596 -0.8750084 0.9987897 0.8750368 -0.8750145 0.9987896 0.8750145 -0.8750504 0.9987896 0.8750145 -0.8750958 0.9987896 0.8750145 -0.8751532 0.9987896 0.8750145 -0.8752258 0.9987896 0.8750145 -0.8753177 0.9987896 0.8750145 -0.8754339 0.9987896 0.8750145 -0.8755809 0.9987896 0.8750145 -0.875767 0.9987896 0.8750145 -0.8760023 0.9987896 0.8750145 -0.8763001 0.9987896 0.8750145 -0.8766768 0.9987896 0.8750145 -0.8771534 0.9987896 0.8750145 -0.8777563 0.9987896 0.8750145 -0.8785191 0.9987896 0.8750145 -0.8794841 0.9987896 0.8750145 -0.880705 0.9987896 0.8750145 -0.8822496 0.9987896 0.8750145 -0.8842037 0.9987896 0.8750145 -0.8866758 0.9987896 0.8750145 -0.8898035 0.9987896 0.8750145 -0.8937603 0.9987896 0.8750145 -0.8987663 0.9987896 0.8750145 -0.9050994 0.9987896 0.8750145 -0.9131117 0.9987896 0.8750145 -0.9232483 0.9987896 0.8750145 -0.9360723 0.9987896 0.8750145 -0.9522964 0.9987896 0.8750145 -0.9728221 0.9987896 0.8750145 -0.9987896 0.9987896 0.8750145 -0.9990456 0.9780571 0.8989805 -0.9992471 0.9690049 0.9187027 -0.9994058 0.9666907 0.9348056 -0.9995309 0.9680221 0.9478691 -0.9996295 0.97112 0.958412 -0.9997074 0.9748832 0.9668847 -0.9997688 0.9786976 0.973671 -0.9998174 0.9822469 0.9790917 -0.9998557 0.9853909 0.9834123 -0.999886 0.9880899 0.9868501 -0.9999099 0.9903582 0.9895817 -0.9999288 0.9922359 0.9917499 -0.9999437 0.9937735 0.9934694 -0.8990028 0.9990461 0.8990859 -0.899002 0.9990461 0.8990843 -0.8990011 0.9990461 0.8990823 -0.899 0.9990461 0.8990798 -0.8989986 0.9990461 0.8990767 -0.8989969 0.9990461 0.8990728 -0.8989948 0.9990461 0.899068 -0.8989923 0.999046 0.899062 -0.8989895 0.999046 0.8990548 -0.8989863 0.9990459 0.899046 -0.8989829 0.9990459 0.8990355 -0.8989796 0.9990458 0.8990233 -0.8989771 0.9990458 0.8990096 -0.8989767 0.9990457 0.8989948 -0.8989805 0.9990456 0.8989805 -0.8990034 0.9990456 0.8989805 -0.8990324 0.9990456 0.8989805 -0.8990691 0.9990456 0.8989805 -0.8991155 0.9990456 0.8989805 -0.8991742 0.9990456 0.8989805 -0.8992484 0.9990456 0.8989805 -0.8993424 0.9990456 0.8989805 -0.8994612 0.9990456 0.8989805 -0.8996116 0.9990456 0.8989805 -0.8998018 0.9990456 0.8989805 -0.9000425 0.9990456 0.8989805 -0.9003469 0.9990456 0.8989805 -0.9007321 0.9990456 0.8989805 -0.9012195 0.9990456 0.8989805 -0.901836 0.9990456 0.8989805 -0.902616 0.9990456 0.8989805 -0.9036028 0.9990456 0.8989805 -0.9048512 0.9990456 0.8989805 -0.9064306 0.9990456 0.8989805 -0.9084287 0.9990456 0.8989805 -0.9109567 0.9990456 0.8989805 -0.9141548 0.9990456 0.8989805 -0.9182009 0.9990456 0.8989805 -0.9233198 0.9990456 0.8989805 -0.9297957 0.9990456 0.8989805 -0.9379887 0.9990456 0.8989805 -0.9483538 0.9990456 0.8989805 -0.9614671 0.9990456 0.8989805 -0.9780571 0.9990456 0.8989805 -0.9990456 0.9990456 0.8989805 -0.9992471 0.9823561 0.9187027 -0.9994058 0.9751537 0.9348056 -0.9995309 0.9733711 0.9478691 -0.9996295 0.974493 0.958412 -0.9997074 0.9770061 0.9668847 -0.9997688 0.9800318 0.973671 -0.9998174 0.9830843 0.9790917 -0.9998557 0.985916 0.9834123 -0.999886 0.988419 0.9868501 -0.9999099 0.9905642 0.9895817 -0.9999288 0.9923649 0.9917499 -0.9999437 0.9938542 0.9934694 -0.9187175 0.9992474 0.9187704 -0.918717 0.9992474 0.9187694 -0.9187164 0.9992474 0.9187681 -0.9187157 0.9992474 0.9187665 -0.9187148 0.9992474 0.9187645 -0.9187137 0.9992474 0.918762 -0.9187123 0.9992473 0.9187589 -0.9187107 0.9992473 0.9187551 -0.9187089 0.9992473 0.9187504 -0.9187068 0.9992473 0.9187448 -0.9187045 0.9992472 0.918738 -0.9187024 0.9992472 0.9187302 -0.9187008 0.9992472 0.9187214 -0.9187004 0.9992471 0.9187119 -0.9187027 0.9992471 0.9187027 -0.9187173 0.9992471 0.9187027 -0.9187358 0.9992471 0.9187027 -0.9187591 0.9992471 0.9187027 -0.9187886 0.9992471 0.9187027 -0.9188259 0.9992471 0.9187027 -0.9188732 0.9992471 0.9187027 -0.9189329 0.9992471 0.9187027 -0.9190085 0.9992471 0.9187027 -0.9191042 0.9992471 0.9187027 -0.9192252 0.9992471 0.9187027 -0.9193783 0.9992471 0.9187027 -0.919572 0.9992471 0.9187027 -0.919817 0.9992471 0.9187027 -0.920127 0.9992471 0.9187027 -0.9205192 0.9992471 0.9187027 -0.9210153 0.9992471 0.9187027 -0.9216431 0.9992471 0.9187027 -0.9224372 0.9992471 0.9187027 -0.9234419 0.9992471 0.9187027 -0.924713 0.9992471 0.9187027 -0.926321 0.9992471 0.9187027 -0.9283554 0.9992471 0.9187027 -0.9309292 0.9992471 0.9187027 -0.9341854 0.9992471 0.9187027 -0.9383049 0.9992471 0.9187027 -0.9435166 0.9992471 0.9187027 -0.9501101 0.9992471 0.9187027 -0.9584517 0.9992471 0.9187027 -0.9690049 0.9992471 0.9187027 -0.9823561 0.9992471 0.9187027 -0.9992471 0.9992471 0.9187027 -0.9994058 0.9858604 0.9348056 -0.9995309 0.9801383 0.9478691 -0.9996295 0.9787602 0.958412 -0.9997074 0.9796919 0.9668847 -0.9997688 0.9817197 0.973671 -0.9998174 0.9841438 0.9790917 -0.9998557 0.9865804 0.9834123 -0.999886 0.9888353 0.9868501 -0.9999099 0.990825 0.9895817 -0.9999288 0.9925281 0.9917499 -0.9999437 0.9939563 0.9934694 -0.9348153 0.999406 0.9348488 -0.9348149 0.999406 0.9348481 -0.9348146 0.999406 0.9348473 -0.9348141 0.999406 0.9348463 -0.9348135 0.999406 0.934845 -0.9348128 0.9994059 0.9348434 -0.9348119 0.9994059 0.9348414 -0.9348109 0.9994059 0.934839 -0.9348097 0.9994059 0.934836 -0.9348083 0.9994059 0.9348324 -0.9348069 0.9994059 0.9348281 -0.9348055 0.9994059 0.9348231 -0.9348044 0.9994058 0.9348175 -0.9348042 0.9994058 0.9348115 -0.9348056 0.9994058 0.9348056 -0.9348148 0.9994058 0.9348056 -0.9348265 0.9994058 0.9348056 -0.9348413 0.9994058 0.9348056 -0.93486 0.9994058 0.9348056 -0.9348837 0.9994058 0.9348056 -0.9349136 0.9994058 0.9348056 -0.9349515 0.9994058 0.9348056 -0.9349994 0.9994058 0.9348056 -0.9350601 0.9994058 0.9348056 -0.9351368 0.9994058 0.9348056 -0.9352338 0.9994058 0.9348056 -0.9353566 0.9994058 0.9348056 -0.9355119 0.9994058 0.9348056 -0.9357084 0.9994058 0.9348056 -0.935957 0.9994058 0.9348056 -0.9362715 0.9994058 0.9348056 -0.9366694 0.9994058 0.9348056 -0.9371728 0.9994058 0.9348056 -0.9378096 0.9994058 0.9348056 -0.9386153 0.9994058 0.9348056 -0.9396346 0.9994058 0.9348056 -0.9409242 0.9994058 0.9348056 -0.9425556 0.9994058 0.9348056 -0.9446196 0.9994058 0.9348056 -0.9472309 0.9994058 0.9348056 -0.9505344 0.9994058 0.9348056 -0.9547138 0.9994058 0.9348056 -0.9600013 0.9994058 0.9348056 -0.9666907 0.9994058 0.9348056 -0.9751537 0.9994058 0.9348056 -0.9858604 0.9994058 0.9348056 -0.9994058 0.9994058 0.9348056 -0.9995309 0.9886996 0.9478691 -0.9996295 0.9841588 0.958412 -0.9997074 0.9830898 0.9668847 -0.9997688 0.9838551 0.973671 -0.9998174 0.9854842 0.9790917 -0.9998557 0.987421 0.9834123 -0.999886 0.989362 0.9868501 -0.9999099 0.9911548 0.9895817 -0.9999288 0.9927346 0.9917499 -0.9999437 0.9940855 0.9934694 -0.9478754 0.999531 0.9478966 -0.9478752 0.999531 0.9478962 -0.947875 0.999531 0.9478957 -0.9478746 0.999531 0.947895 -0.9478743 0.999531 0.9478942 -0.9478738 0.999531 0.9478932 -0.9478733 0.999531 0.9478919 -0.9478726 0.999531 0.9478904 -0.9478718 0.999531 0.9478885 -0.947871 0.9995309 0.9478862 -0.94787 0.9995309 0.9478835 -0.9478691 0.9995309 0.9478803 -0.9478684 0.9995309 0.9478767 -0.9478683 0.9995309 0.9478729 -0.9478691 0.9995309 0.9478691 -0.947875 0.9995309 0.9478691 -0.9478824 0.9995309 0.9478691 -0.9478917 0.9995309 0.9478691 -0.9479035 0.9995309 0.9478691 -0.9479185 0.9995309 0.9478691 -0.9479374 0.9995309 0.9478691 -0.9479614 0.9995309 0.9478691 -0.9479916 0.9995309 0.9478691 -0.94803 0.9995309 0.9478691 -0.9480785 0.9995309 0.9478691 -0.9481398 0.9995309 0.9478691 -0.9482174 0.9995309 0.9478691 -0.9483155 0.9995309 0.9478691 -0.9484397 0.9995309 0.9478691 -0.9485969 0.9995309 0.9478691 -0.9487957 0.9995309 0.9478691 -0.9490471 0.9995309 0.9478691 -0.9493653 0.9995309 0.9478691 -0.9497678 0.9995309 0.9478691 -0.9502771 0.9995309 0.9478691 -0.9509213 0.9995309 0.9478691 -0.9517364 0.9995309 0.9478691 -0.9527675 0.9995309 0.9478691 -0.9540721 0.9995309 0.9478691 -0.9557225 0.9995309 0.9478691 -0.9578105 0.9995309 0.9478691 -0.9604521 0.9995309 0.9478691 -0.9637941 0.9995309 0.9478691 -0.9680221 0.9995309 0.9478691 -0.9733711 0.9995309 0.9478691 -0.9801383 0.9995309 0.9478691 -0.9886996 0.9995309 0.9478691 -0.9995309 0.9995309 0.9478691 -0.9996295 0.9909888 0.958412 -0.9997074 0.9873885 0.9668847 -0.9997688 0.9865566 0.973671 -0.9998174 0.98718 0.9790917 -0.9998557 0.9884844 0.9834123 -0.999886 0.9900284 0.9868501 -0.9999099 0.9915721 0.9895817 -0.9999288 0.9929957 0.9917499 -0.9999437 0.9942489 0.9934694 -0.958416 0.9996296 0.9584293 -0.9584159 0.9996296 0.9584291 -0.9584157 0.9996296 0.9584288 -0.9584155 0.9996296 0.9584283 -0.9584153 0.9996296 0.9584278 -0.958415 0.9996296 0.9584272 -0.9584146 0.9996296 0.9584264 -0.9584142 0.9996296 0.9584254 -0.9584137 0.9996296 0.9584242 -0.9584132 0.9996296 0.9584228 -0.9584126 0.9996296 0.958421 -0.958412 0.9996296 0.958419 -0.9584115 0.9996296 0.9584168 -0.9584114 0.9996295 0.9584143 -0.958412 0.9996295 0.958412 -0.9584156 0.9996295 0.958412 -0.9584203 0.9996295 0.958412 -0.9584262 0.9996295 0.958412 -0.9584336 0.9996295 0.958412 -0.9584431 0.9996295 0.958412 -0.958455 0.9996295 0.958412 -0.9584701 0.9996295 0.958412 -0.9584892 0.9996295 0.958412 -0.9585134 0.9996295 0.958412 -0.9585439 0.9996295 0.958412 -0.9585826 0.9996295 0.958412 -0.9586316 0.9996295 0.958412 -0.9586935 0.9996295 0.958412 -0.9587718 0.9996295 0.958412 -0.9588709 0.9996295 0.958412 -0.9589962 0.9996295 0.958412 -0.9591548 0.9996295 0.958412 -0.9593554 0.9996295 0.958412 -0.9596092 0.9996295 0.958412 -0.9599303 0.9996295 0.958412 -0.9603366 0.9996295 0.958412 -0.9608506 0.9996295 0.958412 -0.9615008 0.9996295 0.958412 -0.9623234 0.9996295 0.958412 -0.9633641 0.9996295 0.958412 -0.9646808 0.9996295 0.958412 -0.9663465 0.9996295 0.958412 -0.9684539 0.9996295 0.958412 -0.97112 0.9996295 0.958412 -0.974493 0.9996295 0.958412 -0.9787602 0.9996295 0.958412 -0.9841588 0.9996295 0.958412 -0.9909888 0.9996295 0.958412 -0.9996295 0.9996295 0.958412 -0.9997074 0.992827 0.9668847 -0.9997688 0.9899744 0.973671 -0.9998174 0.9893253 0.9790917 -0.9998557 0.9898297 0.9834123 -0.999886 0.9908714 0.9868501 -0.9999099 0.9921 0.9895817 -0.9999288 0.9933262 0.9917499 -0.9999437 0.9944556 0.9934694 -0.9668873 0.9997074 0.9668957 -0.9668872 0.9997074 0.9668956 -0.9668871 0.9997074 0.9668954 -0.966887 0.9997074 0.9668951 -0.9668869 0.9997074 0.9668948 -0.9668867 0.9997074 0.9668944 -0.9668865 0.9997074 0.9668939 -0.9668862 0.9997074 0.9668932 -0.9668859 0.9997074 0.9668925 -0.9668855 0.9997074 0.9668916 -0.9668852 0.9997074 0.9668905 -0.9668848 0.9997074 0.9668892 -0.9668845 0.9997074 0.9668878 -0.9668844 0.9997074 0.9668862 -0.9668847 0.9997074 0.9668847 -0.9668871 0.9997074 0.9668847 -0.96689 0.9997074 0.9668847 -0.9668937 0.9997074 0.9668847 -0.9668984 0.9997074 0.9668847 -0.9669043 0.9997074 0.9668847 -0.9669118 0.9997074 0.9668847 -0.9669214 0.9997074 0.9668847 -0.9669334 0.9997074 0.9668847 -0.9669486 0.9997074 0.9668847 -0.9669678 0.9997074 0.9668847 -0.9669922 0.9997074 0.9668847 -0.967023 0.9997074 0.9668847 -0.9670619 0.9997074 0.9668847 -0.9671112 0.9997074 0.9668847 -0.9671736 0.9997074 0.9668847 -0.9672525 0.9997074 0.9668847 -0.9673523 0.9997074 0.9668847 -0.9674786 0.9997074 0.9668847 -0.9676383 0.9997074 0.9668847 -0.9678404 0.9997074 0.9668847 -0.9680961 0.9997074 0.9668847 -0.9684196 0.9997074 0.9668847 -0.9688289 0.9997074 0.9668847 -0.9693466 0.9997074 0.9668847 -0.9700016 0.9997074 0.9668847 -0.9708303 0.9997074 0.9668847 -0.9718787 0.9997074 0.9668847 -0.9732051 0.9997074 0.9668847 -0.9748832 0.9997074 0.9668847 -0.9770061 0.9997074 0.9668847 -0.9796919 0.9997074 0.9668847 -0.9830898 0.9997074 0.9668847 -0.9873885 0.9997074 0.9668847 -0.992827 0.9997074 0.9668847 -0.9997074 0.9997074 0.9668847 -0.9997688 0.9942984 0.973671 -0.9998174 0.9920395 0.9790917 -0.9998557 0.9915318 0.9834123 -0.999886 0.9919379 0.9868501 -0.9999099 0.9927679 0.9895817 -0.9999288 0.9937442 0.9917499 -0.9999437 0.9947172 0.9934694 -0.9736726 0.9997689 0.9736779 -0.9736726 0.9997689 0.9736778 -0.9736725 0.9997689 0.9736777 -0.9736724 0.9997689 0.9736775 -0.9736723 0.9997689 0.9736773 -0.9736722 0.9997689 0.973677 -0.9736721 0.9997689 0.9736767 -0.9736719 0.9997689 0.9736763 -0.9736717 0.9997689 0.9736759 -0.9736715 0.9997689 0.9736753 -0.9736712 0.9997689 0.9736746 -0.973671 0.9997689 0.9736738 -0.9736708 0.9997689 0.9736729 -0.9736708 0.9997689 0.9736719 -0.973671 0.9997688 0.973671 -0.9736724 0.9997688 0.973671 -0.9736743 0.9997688 0.973671 -0.9736766 0.9997688 0.973671 -0.9736796 0.9997688 0.973671 -0.9736833 0.9997688 0.973671 -0.973688 0.9997688 0.973671 -0.973694 0.9997688 0.973671 -0.9737015 0.9997688 0.973671 -0.9737111 0.9997688 0.973671 -0.9737232 0.9997688 0.973671 -0.9737385 0.9997688 0.973671 -0.9737578 0.9997688 0.973671 -0.9737823 0.9997688 0.973671 -0.9738133 0.9997688 0.973671 -0.9738525 0.9997688 0.973671 -0.9739021 0.9997688 0.973671 -0.9739648 0.9997688 0.973671 -0.9740442 0.9997688 0.973671 -0.9741446 0.9997688 0.973671 -0.9742716 0.9997688 0.973671 -0.9744323 0.9997688 0.973671 -0.9746356 0.9997688 0.973671 -0.9748928 0.9997688 0.973671 -0.9752181 0.9997688 0.973671 -0.9756298 0.9997688 0.973671 -0.9761506 0.9997688 0.973671 -0.9768095 0.9997688 0.973671 -0.977643 0.9997688 0.973671 -0.9786976 0.9997688 0.973671 -0.9800318 0.9997688 0.973671 -0.9817197 0.9997688 0.973671 -0.9838551 0.9997688 0.973671 -0.9865566 0.9997688 0.973671 -0.9899744 0.9997688 0.973671 -0.9942984 0.9997688 0.973671 -0.9997688 0.9997688 0.973671 -0.9998174 0.9954732 0.9790917 -0.9998557 0.993685 0.9834123 -0.999886 0.9932872 0.9868501 -0.9999099 0.9936129 0.9895817 -0.9999288 0.9942731 0.9917499 -0.9999437 0.9950481 0.9934694 -0.9790927 0.9998174 0.979096 -0.9790927 0.9998174 0.979096 -0.9790927 0.9998174 0.9790959 -0.9790926 0.9998174 0.9790958 -0.9790925 0.9998174 0.9790957 -0.9790925 0.9998174 0.9790955 -0.9790924 0.9998174 0.9790953 -0.9790923 0.9998174 0.9790951 -0.9790921 0.9998174 0.9790948 -0.979092 0.9998174 0.9790944 -0.9790919 0.9998174 0.979094 -0.9790917 0.9998174 0.9790935 -0.9790916 0.9998174 0.9790929 -0.9790916 0.9998174 0.9790923 -0.9790917 0.9998174 0.9790917 -0.9790926 0.9998174 0.9790917 -0.9790938 0.9998174 0.9790917 -0.9790952 0.9998174 0.9790917 -0.9790971 0.9998174 0.9790917 -0.9790994 0.9998174 0.9790917 -0.9791024 0.9998174 0.9790917 -0.9791061 0.9998174 0.9790917 -0.9791109 0.9998174 0.9790917 -0.9791169 0.9998174 0.9790917 -0.9791245 0.9998174 0.9790917 -0.9791341 0.9998174 0.9790917 -0.9791462 0.9998174 0.9790917 -0.9791616 0.9998174 0.9790917 -0.979181 0.9998174 0.9790917 -0.9792056 0.9998174 0.9790917 -0.9792367 0.9998174 0.9790917 -0.9792761 0.9998174 0.9790917 -0.9793259 0.9998174 0.9790917 -0.9793889 0.9998174 0.9790917 -0.9794687 0.9998174 0.9790917 -0.9795695 0.9998174 0.9790917 -0.9796971 0.9998174 0.9790917 -0.9798586 0.9998174 0.9790917 -0.9800628 0.9998174 0.9790917 -0.9803212 0.9998174 0.9790917 -0.9806481 0.9998174 0.9790917 -0.9810617 0.9998174 0.9790917 -0.9815849 0.9998174 0.9790917 -0.9822469 0.9998174 0.9790917 -0.9830843 0.9998174 0.9790917 -0.9841438 0.9998174 0.9790917 -0.9854842 0.9998174 0.9790917 -0.98718 0.9998174 0.9790917 -0.9893253 0.9998174 0.9790917 -0.9920395 0.9998174 0.9790917 -0.9954732 0.9998174 0.9790917 -0.9998174 0.9998174 0.9790917 -0.9998557 0.9964092 0.9834123 -0.999886 0.9949942 0.9868501 -0.9999099 0.9946819 0.9895817 -0.9999288 0.9949423 0.9917499 -0.9999437 0.9954668 0.9934694 -0.9834129 0.9998557 0.983415 -0.9834129 0.9998557 0.983415 -0.9834129 0.9998557 0.9834149 -0.9834129 0.9998557 0.9834149 -0.9834128 0.9998557 0.9834148 -0.9834128 0.9998557 0.9834147 -0.9834127 0.9998557 0.9834146 -0.9834127 0.9998557 0.9834144 -0.9834126 0.9998557 0.9834142 -0.9834125 0.9998557 0.983414 -0.9834124 0.9998557 0.9834137 -0.9834123 0.9998557 0.9834134 -0.9834122 0.9998557 0.983413 -0.9834122 0.9998557 0.9834127 -0.9834123 0.9998557 0.9834123 -0.9834129 0.9998557 0.9834123 -0.9834136 0.9998557 0.9834123 -0.9834145 0.9998557 0.9834123 -0.9834157 0.9998557 0.9834123 -0.9834171 0.9998557 0.9834123 -0.983419 0.9998557 0.9834123 -0.9834213 0.9998557 0.9834123 -0.9834243 0.9998557 0.9834123 -0.9834281 0.9998557 0.9834123 -0.9834328 0.9998557 0.9834123 -0.9834389 0.9998557 0.9834123 -0.9834465 0.9998557 0.9834123 -0.9834561 0.9998557 0.9834123 -0.9834683 0.9998557 0.9834123 -0.9834837 0.9998557 0.9834123 -0.9835032 0.9998557 0.9834123 -0.9835279 0.9998557 0.9834123 -0.9835592 0.9998557 0.9834123 -0.9835987 0.9998557 0.9834123 -0.9836487 0.9998557 0.9834123 -0.9837119 0.9998557 0.9834123 -0.983792 0.9998557 0.9834123 -0.9838932 0.9998557 0.9834123 -0.9840213 0.9998557 0.9834123 -0.9841833 0.9998557 0.9834123 -0.9843883 0.9998557 0.9834123 -0.9846477 0.9998557 0.9834123 -0.9849758 0.9998557 0.9834123 -0.9853909 0.9998557 0.9834123 -0.985916 0.9998557 0.9834123 -0.9865804 0.9998557 0.9834123 -0.987421 0.9998557 0.9834123 -0.9884844 0.9998557 0.9834123 -0.9898297 0.9998557 0.9834123 -0.9915318 0.9998557 0.9834123 -0.993685 0.9998557 0.9834123 -0.9964092 0.9998557 0.9834123 -0.9998557 0.9998557 0.9834123 -0.999886 0.9971538 0.9868501 -0.9999099 0.9960343 0.9895817 -0.9999288 0.9957888 0.9917499 -0.9999437 0.9959965 0.9934694 -0.9868505 0.999886 0.9868518 -0.9868505 0.999886 0.9868518 -0.9868505 0.999886 0.9868518 -0.9868505 0.999886 0.9868517 -0.9868504 0.999886 0.9868517 -0.9868504 0.999886 0.9868516 -0.9868504 0.999886 0.9868515 -0.9868503 0.999886 0.9868514 -0.9868503 0.999886 0.9868513 -0.9868502 0.999886 0.9868512 -0.9868502 0.999886 0.986851 -0.9868501 0.999886 0.9868508 -0.9868501 0.999886 0.9868506 -0.98685 0.999886 0.9868503 -0.9868501 0.999886 0.9868501 -0.9868505 0.999886 0.9868501 -0.9868509 0.999886 0.9868501 -0.9868515 0.999886 0.9868501 -0.9868522 0.999886 0.9868501 -0.9868531 0.999886 0.9868501 -0.9868543 0.999886 0.9868501 -0.9868558 0.999886 0.9868501 -0.9868576 0.999886 0.9868501 -0.98686 0.999886 0.9868501 -0.986863 0.999886 0.9868501 -0.9868667 0.999886 0.9868501 -0.9868715 0.999886 0.9868501 -0.9868776 0.999886 0.9868501 -0.9868852 0.999886 0.9868501 -0.9868949 0.999886 0.9868501 -0.9869071 0.999886 0.9868501 -0.9869226 0.999886 0.9868501 -0.9869421 0.999886 0.9868501 -0.9869669 0.999886 0.9868501 -0.9869982 0.999886 0.9868501 -0.9870379 0.999886 0.9868501 -0.987088 0.999886 0.9868501 -0.9871514 0.999886 0.9868501 -0.9872317 0.999886 0.9868501 -0.9873332 0.999886 0.9868501 -0.9874617 0.999886 0.9868501 -0.9876242 0.999886 0.9868501 -0.9878298 0.999886 0.9868501 -0.9880899 0.999886 0.9868501 -0.988419 0.999886 0.9868501 -0.9888353 0.999886 0.9868501 -0.989362 0.999886 0.9868501 -0.9900284 0.999886 0.9868501 -0.9908714 0.999886 0.9868501 -0.9919379 0.999886 0.9868501 -0.9932872 0.999886 0.9868501 -0.9949942 0.999886 0.9868501 -0.9971538 0.999886 0.9868501 -0.999886 0.999886 0.9868501 -0.9999099 0.9977453 0.9895817 -0.9999288 0.9968597 0.9917499 -0.9999437 0.9966666 0.9934694 -0.989582 0.9999099 0.9895828 -0.989582 0.9999099 0.9895828 -0.989582 0.9999099 0.9895828 -0.989582 0.9999099 0.9895828 -0.989582 0.9999099 0.9895827 -0.9895819 0.9999099 0.9895827 -0.9895819 0.9999099 0.9895826 -0.9895819 0.9999099 0.9895826 -0.9895819 0.9999099 0.9895825 -0.9895818 0.9999099 0.9895824 -0.9895818 0.9999099 0.9895823 -0.9895818 0.9999099 0.9895822 -0.9895817 0.9999099 0.989582 -0.9895817 0.9999099 0.9895819 -0.9895817 0.9999099 0.9895817 -0.989582 0.9999099 0.9895817 -0.9895823 0.9999099 0.9895817 -0.9895826 0.9999099 0.9895817 -0.9895831 0.9999099 0.9895817 -0.9895836 0.9999099 0.9895817 -0.9895844 0.9999099 0.9895817 -0.9895853 0.9999099 0.9895817 -0.9895865 0.9999099 0.9895817 -0.9895879 0.9999099 0.9895817 -0.9895898 0.9999099 0.9895817 -0.9895922 0.9999099 0.9895817 -0.9895952 0.9999099 0.9895817 -0.9895989 0.9999099 0.9895817 -0.9896037 0.9999099 0.9895817 -0.9896098 0.9999099 0.9895817 -0.9896174 0.9999099 0.9895817 -0.9896271 0.9999099 0.9895817 -0.9896394 0.9999099 0.9895817 -0.9896549 0.9999099 0.9895817 -0.9896745 0.9999099 0.9895817 -0.9896993 0.9999099 0.9895817 -0.9897307 0.9999099 0.9895817 -0.9897705 0.9999099 0.9895817 -0.9898207 0.9999099 0.9895817 -0.9898843 0.9999099 0.9895817 -0.9899648 0.9999099 0.9895817 -0.9900665 0.9999099 0.9895817 -0.9901953 0.9999099 0.9895817 -0.9903582 0.9999099 0.9895817 -0.9905642 0.9999099 0.9895817 -0.990825 0.9999099 0.9895817 -0.9911548 0.9999099 0.9895817 -0.9915721 0.9999099 0.9895817 -0.9921 0.9999099 0.9895817 -0.9927679 0.9999099 0.9895817 -0.9936129 0.9999099 0.9895817 -0.9946819 0.9999099 0.9895817 -0.9960343 0.9999099 0.9895817 -0.9977453 0.9999099 0.9895817 -0.9999099 0.9999099 0.9895817 -0.9999288 0.9982147 0.9917499 -0.9999437 0.9975143 0.9934694 -0.9917501 0.9999288 0.9917506 -0.9917501 0.9999288 0.9917506 -0.9917501 0.9999288 0.9917506 -0.9917501 0.9999288 0.9917506 -0.9917501 0.9999288 0.9917505 -0.9917501 0.9999288 0.9917505 -0.99175 0.9999288 0.9917505 -0.99175 0.9999288 0.9917505 -0.99175 0.9999288 0.9917504 -0.99175 0.9999288 0.9917503 -0.99175 0.9999288 0.9917503 -0.9917499 0.9999288 0.9917502 -0.9917499 0.9999288 0.9917501 -0.9917499 0.9999288 0.99175 -0.9917499 0.9999288 0.9917499 -0.9917501 0.9999288 0.9917499 -0.9917502 0.9999288 0.9917499 -0.9917505 0.9999288 0.9917499 -0.9917508 0.9999288 0.9917499 -0.9917511 0.9999288 0.9917499 -0.9917516 0.9999288 0.9917499 -0.9917522 0.9999288 0.9917499 -0.9917529 0.9999288 0.9917499 -0.9917538 0.9999288 0.9917499 -0.991755 0.9999288 0.9917499 -0.9917565 0.9999288 0.9917499 -0.9917583 0.9999288 0.9917499 -0.9917607 0.9999288 0.9917499 -0.9917637 0.9999288 0.9917499 -0.9917675 0.9999288 0.9917499 -0.9917723 0.9999288 0.9917499 -0.9917783 0.9999288 0.9917499 -0.991786 0.9999288 0.9917499 -0.9917957 0.9999288 0.9917499 -0.991808 0.9999288 0.9917499 -0.9918235 0.9999288 0.9917499 -0.9918432 0.9999288 0.9917499 -0.9918681 0.9999288 0.9917499 -0.9918995 0.9999288 0.9917499 -0.9919393 0.9999288 0.9917499 -0.9919897 0.9999288 0.9917499 -0.9920534 0.9999288 0.9917499 -0.992134 0.9999288 0.9917499 -0.9922359 0.9999288 0.9917499 -0.9923649 0.9999288 0.9917499 -0.9925281 0.9999288 0.9917499 -0.9927346 0.9999288 0.9917499 -0.9929957 0.9999288 0.9917499 -0.9933262 0.9999288 0.9917499 -0.9937442 0.9999288 0.9917499 -0.9942731 0.9999288 0.9917499 -0.9949423 0.9999288 0.9917499 -0.9957888 0.9999288 0.9917499 -0.9968597 0.9999288 0.9917499 -0.9982147 0.9999288 0.9917499 -0.9999288 0.9999288 0.9917499 -0.9999437 0.9985868 0.9934694 -0.9934695 0.9999437 0.9934698 -0.9934695 0.9999437 0.9934698 -0.9934695 0.9999437 0.9934698 -0.9934695 0.9999437 0.9934698 -0.9934695 0.9999437 0.9934698 -0.9934695 0.9999437 0.9934698 -0.9934695 0.9999437 0.9934697 -0.9934694 0.9999437 0.9934697 -0.9934694 0.9999437 0.9934697 -0.9934694 0.9999437 0.9934696 -0.9934694 0.9999437 0.9934696 -0.9934694 0.9999437 0.9934696 -0.9934694 0.9999437 0.9934695 -0.9934694 0.9999437 0.9934694 -0.9934694 0.9999437 0.9934694 -0.9934695 0.9999437 0.9934694 -0.9934696 0.9999437 0.9934694 -0.9934697 0.9999437 0.9934694 -0.9934699 0.9999437 0.9934694 -0.9934701 0.9999437 0.9934694 -0.9934704 0.9999437 0.9934694 -0.9934708 0.9999437 0.9934694 -0.9934712 0.9999437 0.9934694 -0.9934718 0.9999437 0.9934694 -0.9934725 0.9999437 0.9934694 -0.9934735 0.9999437 0.9934694 -0.9934746 0.9999437 0.9934694 -0.9934761 0.9999437 0.9934694 -0.993478 0.9999437 0.9934694 -0.9934804 0.9999437 0.9934694 -0.9934834 0.9999437 0.9934694 -0.9934872 0.9999437 0.9934694 -0.993492 0.9999437 0.9934694 -0.993498 0.9999437 0.9934694 -0.9935057 0.9999437 0.9934694 -0.9935154 0.9999437 0.9934694 -0.9935277 0.9999437 0.9934694 -0.9935433 0.9999437 0.9934694 -0.993563 0.9999437 0.9934694 -0.9935879 0.9999437 0.9934694 -0.9936194 0.9999437 0.9934694 -0.9936592 0.9999437 0.9934694 -0.9937097 0.9999437 0.9934694 -0.9937735 0.9999437 0.9934694 -0.9938542 0.9999437 0.9934694 -0.9939563 0.9999437 0.9934694 -0.9940855 0.9999437 0.9934694 -0.9942489 0.9999437 0.9934694 -0.9944556 0.9999437 0.9934694 -0.9947172 0.9999437 0.9934694 -0.9950481 0.9999437 0.9934694 -0.9954668 0.9999437 0.9934694 -0.9959965 0.9999437 0.9934694 -0.9966666 0.9999437 0.9934694 -0.9975143 0.9999437 0.9934694 -0.9985868 0.9999437 0.9934694 -0.9999437 0.9999437 0.9934694 -0.0000238 0.0000238 0.0645609 -0.0005417 0.0000238 0.0645609 -0.0011968 0.0000238 0.0645609 -0.0020256 0.0000238 0.0645609 -0.0030742 0.0000238 0.0645609 -0.0044007 0.0000238 0.0645609 -0.006079 0.0000238 0.0645609 -0.0082023 0.0000238 0.0645609 -0.0108885 0.0000238 0.0645609 -0.0142868 0.0000238 0.0645609 -0.0185862 0.0000238 0.0645609 -0.0240255 0.0000238 0.0645609 -0.0309069 0.0000238 0.0645609 -0.0396127 0.0000238 0.0645609 -0.0506267 0.0000238 0.0645609 -0.0645609 0.0000238 0.0645609 -0.0821895 0.0000238 0.0645609 -0.1044919 0.0000238 0.0645609 -0.1327073 0.0000238 0.0645609 -0.1684036 0.0000238 0.0645609 -0.2135639 0.0000238 0.0645609 -0.2706977 0.0000238 0.0645609 -0.3429792 0.0000238 0.0645609 -0.4344249 0.0000238 0.0645609 -0.5501155 0.0000238 0.0645609 -0.6964791 0.0000238 0.0645609 -0.8407292 0.0051514 0.0663177 -0.9033413 0.0279321 0.0785612 -0.9354466 0.0624569 0.1023506 -0.9545467 0.1059991 0.1366405 -0.9669269 0.1572498 0.180355 -0.9754027 0.2151269 0.2322726 -0.9814251 0.2783684 0.2908992 -0.9858181 0.3454107 0.3544318 -0.9890841 0.4144197 0.4208177 -0.9915469 0.4834235 0.4878948 -0.993424 0.5504963 0.5535769 -0.9948662 0.6139459 0.6160399 -0.9959813 0.6724572 0.6738629 -0.9968475 0.7251659 0.726099 -0.997523 0.7716588 0.772272 -0.9980513 0.8119154 0.8123148 -0.9984653 0.8462171 0.8464753 -0.9987905 0.8750477 0.8752136 -0.9990461 0.8990028 0.8991088 -0.9992474 0.9187175 0.9187849 -0.999406 0.9348153 0.934858 -0.999531 0.9478754 0.9479024 -0.9996296 0.958416 0.958433 -0.9997074 0.9668873 0.9668981 -0.9997689 0.9736726 0.9736794 -0.9998174 0.9790927 0.979097 -0.9998557 0.9834129 0.9834156 -0.999886 0.9868505 0.9868522 -0.9999099 0.989582 0.989583 -0.9999288 0.9917501 0.9917507 -0.9999437 0.9934695 0.9934699 -0.0000238 0.0005417 0.0645609 -0.0000382 0.0000382 0.0640574 -0.0006933 0.0000382 0.0640574 -0.0015221 0.0000382 0.0640574 -0.0025707 0.0000382 0.0640574 -0.0038972 0.0000382 0.0640574 -0.0055755 0.0000382 0.0640574 -0.0076988 0.0000382 0.0640574 -0.0103849 0.0000382 0.0640574 -0.0137833 0.0000382 0.0640574 -0.0180827 0.0000382 0.0640574 -0.023522 0.0000382 0.0640574 -0.0304033 0.0000382 0.0640574 -0.0391092 0.0000382 0.0640574 -0.0501232 0.0000382 0.0640574 -0.0640574 0.0000382 0.0640574 -0.081686 0.0000382 0.0640574 -0.1039884 0.0000382 0.0640574 -0.1322038 0.0000382 0.0640574 -0.1679 0.0000382 0.0640574 -0.2130604 0.0000382 0.0640574 -0.2701941 0.0000382 0.0640574 -0.3424757 0.0000382 0.0640574 -0.4339214 0.0000382 0.0640574 -0.549612 0.0000382 0.0640574 -0.6959756 0.0000382 0.0640574 -0.8405071 0.0051286 0.0658253 -0.9032596 0.0278872 0.0781312 -0.9354101 0.0624063 0.101995 -0.9545286 0.1059489 0.1363545 -0.9669173 0.1572031 0.1801293 -0.9753975 0.2150852 0.2320973 -0.9814221 0.2783325 0.2907651 -0.9858163 0.3453807 0.3543309 -0.9890831 0.4143955 0.420743 -0.9915463 0.4834045 0.4878404 -0.9934236 0.5504818 0.553538 -0.994866 0.6139352 0.6160126 -0.9959811 0.6724495 0.673844 -0.9968474 0.7251605 0.7260861 -0.997523 0.7716551 0.7722633 -0.9980512 0.8119128 0.812309 -0.9984653 0.8462154 0.8464715 -0.9987905 0.8750466 0.8752111 -0.9990461 0.899002 0.8991072 -0.9992474 0.918717 0.9187839 -0.999406 0.9348149 0.9348574 -0.999531 0.9478752 0.947902 -0.9996296 0.9584159 0.9584328 -0.9997074 0.9668872 0.9668979 -0.9997689 0.9736726 0.9736793 -0.9998174 0.9790927 0.9790969 -0.9998557 0.9834129 0.9834155 -0.999886 0.9868505 0.9868521 -0.9999099 0.989582 0.989583 -0.9999288 0.9917501 0.9917507 -0.9999437 0.9934695 0.9934699 -0.0000238 0.0011968 0.0645609 -0.0000382 0.0006933 0.0640574 -0.0000611 0.0000611 0.0634252 -0.0008899 0.0000611 0.0634252 -0.0019385 0.0000611 0.0634252 -0.003265 0.0000611 0.0634252 -0.0049433 0.0000611 0.0634252 -0.0070666 0.0000611 0.0634252 -0.0097527 0.0000611 0.0634252 -0.0131511 0.0000611 0.0634252 -0.0174505 0.0000611 0.0634252 -0.0228898 0.0000611 0.0634252 -0.0297711 0.0000611 0.0634252 -0.038477 0.0000611 0.0634252 -0.049491 0.0000611 0.0634252 -0.0634252 0.0000611 0.0634252 -0.0810538 0.0000611 0.0634252 -0.1033562 0.0000611 0.0634252 -0.1315716 0.0000611 0.0634252 -0.1672678 0.0000611 0.0634252 -0.2124282 0.0000611 0.0634252 -0.2695619 0.0000611 0.0634252 -0.3418435 0.0000611 0.0634252 -0.4332891 0.0000611 0.0634252 -0.5489798 0.0000611 0.0634252 -0.6953434 0.0000611 0.0634252 -0.8402274 0.0051047 0.0652066 -0.9031567 0.0278347 0.0775909 -0.9353643 0.0623458 0.1015482 -0.9545059 0.1058883 0.1359951 -0.9669053 0.1571463 0.1798457 -0.9753908 0.2150342 0.2318771 -0.9814183 0.2782884 0.2905967 -0.9858141 0.3453439 0.3542041 -0.9890818 0.4143657 0.4206492 -0.9915455 0.4833811 0.4877721 -0.9934231 0.550464 0.5534892 -0.9948657 0.6139219 0.6159782 -0.9959809 0.6724399 0.6738202 -0.9968473 0.7251537 0.7260699 -0.9975229 0.7716504 0.7722524 -0.9980512 0.8119096 0.8123018 -0.9984653 0.8462132 0.8464668 -0.9987904 0.8750451 0.875208 -0.9990461 0.8990011 0.8991052 -0.9992474 0.9187164 0.9187826 -0.999406 0.9348146 0.9348565 -0.999531 0.947875 0.9479015 -0.9996296 0.9584157 0.9584324 -0.9997074 0.9668871 0.9668977 -0.9997689 0.9736725 0.9736791 -0.9998174 0.9790927 0.9790968 -0.9998557 0.9834129 0.9834155 -0.999886 0.9868505 0.9868521 -0.9999099 0.989582 0.989583 -0.9999288 0.9917501 0.9917507 -0.9999437 0.9934695 0.9934699 -0.0000238 0.0020256 0.0645609 -0.0000382 0.0015221 0.0640574 -0.0000611 0.0008899 0.0634252 -0.0000978 0.0000978 0.0626331 -0.0011463 0.0000978 0.0626331 -0.0024729 0.0000978 0.0626331 -0.0041512 0.0000978 0.0626331 -0.0062744 0.0000978 0.0626331 -0.0089606 0.0000978 0.0626331 -0.012359 0.0000978 0.0626331 -0.0166583 0.0000978 0.0626331 -0.0220976 0.0000978 0.0626331 -0.028979 0.0000978 0.0626331 -0.0376849 0.0000978 0.0626331 -0.0486989 0.0000978 0.0626331 -0.0626331 0.0000978 0.0626331 -0.0802616 0.0000978 0.0626331 -0.102564 0.0000978 0.0626331 -0.1307795 0.0000978 0.0626331 -0.1664757 0.0000978 0.0626331 -0.2116361 0.0000978 0.0626331 -0.2687698 0.0000978 0.0626331 -0.3410514 0.0000978 0.0626331 -0.432497 0.0000978 0.0626331 -0.5481876 0.0000978 0.0626331 -0.6945513 0.0000978 0.0626331 -0.8398756 0.0050826 0.0644309 -0.9030276 0.0277752 0.0769132 -0.9353068 0.0622749 0.1009878 -0.9544774 0.1058162 0.1355445 -0.9668902 0.1570779 0.1794901 -0.9753825 0.2149725 0.231601 -0.9814136 0.2782347 0.2903857 -0.9858113 0.3452987 0.3540453 -0.9890801 0.414329 0.4205316 -0.9915446 0.4833522 0.4876866 -0.9934225 0.5504419 0.553428 -0.9948653 0.6139056 0.6159352 -0.9959807 0.672428 0.6737905 -0.9968472 0.7251454 0.7260496 -0.9975228 0.7716446 0.7722388 -0.9980511 0.8119057 0.8122927 -0.9984653 0.8462106 0.8464608 -0.9987904 0.8750434 0.8752041 -0.9990461 0.899 0.8991027 -0.9992474 0.9187157 0.918781 -0.999406 0.9348141 0.9348555 -0.999531 0.9478746 0.9479008 -0.9996296 0.9584155 0.958432 -0.9997074 0.966887 0.9668974 -0.9997689 0.9736724 0.973679 -0.9998174 0.9790926 0.9790967 -0.9998557 0.9834129 0.9834154 -0.999886 0.9868505 0.9868521 -0.9999099 0.989582 0.989583 -0.9999288 0.9917501 0.9917507 -0.9999437 0.9934695 0.9934699 -0.0000238 0.0030742 0.0645609 -0.0000382 0.0025707 0.0640574 -0.0000611 0.0019385 0.0634252 -0.0000978 0.0011463 0.0626331 -0.0001565 0.0001565 0.0616432 -0.001483 0.0001565 0.0616432 -0.0031613 0.0001565 0.0616432 -0.0052846 0.0001565 0.0616432 -0.0079707 0.0001565 0.0616432 -0.0113691 0.0001565 0.0616432 -0.0156685 0.0001565 0.0616432 -0.0211078 0.0001565 0.0616432 -0.0279891 0.0001565 0.0616432 -0.036695 0.0001565 0.0616432 -0.047709 0.0001565 0.0616432 -0.0616432 0.0001565 0.0616432 -0.0792718 0.0001565 0.0616432 -0.1015742 0.0001565 0.0616432 -0.1297896 0.0001565 0.0616432 -0.1654858 0.0001565 0.0616432 -0.2106462 0.0001565 0.0616432 -0.2677799 0.0001565 0.0616432 -0.3400615 0.0001565 0.0616432 -0.4315072 0.0001565 0.0616432 -0.5471978 0.0001565 0.0616432 -0.6935614 0.0001565 0.0616432 -0.8394338 0.0050676 0.0634605 -0.9028657 0.0277111 0.0760653 -0.9352348 0.0621943 0.1002868 -0.9544418 0.1057322 0.1349809 -0.9668714 0.1569971 0.1790454 -0.9753721 0.2148987 0.2312557 -0.9814076 0.2781701 0.2901217 -0.9858079 0.3452442 0.3538467 -0.9890781 0.4142845 0.4203847 -0.9915433 0.4833171 0.4875796 -0.9934218 0.550415 0.5533515 -0.9948649 0.6138855 0.6158814 -0.9959804 0.6724135 0.6737533 -0.996847 0.7251351 0.7260243 -0.9975227 0.7716375 0.7722218 -0.9980511 0.8119009 0.8122814 -0.9984652 0.8462073 0.8464534 -0.9987904 0.8750412 0.8751993 -0.9990461 0.8989986 0.8990996 -0.9992474 0.9187148 0.918779 -0.999406 0.9348135 0.9348542 -0.999531 0.9478743 0.9479 -0.9996296 0.9584153 0.9584315 -0.9997074 0.9668869 0.9668971 -0.9997689 0.9736723 0.9736788 -0.9998174 0.9790925 0.9790966 -0.9998557 0.9834128 0.9834153 -0.999886 0.9868504 0.986852 -0.9999099 0.989582 0.989583 -0.9999288 0.9917501 0.9917507 -0.9999437 0.9934695 0.9934699 -0.0000238 0.0044007 0.0645609 -0.0000382 0.0038972 0.0640574 -0.0000611 0.003265 0.0634252 -0.0000978 0.0024729 0.0626331 -0.0001565 0.001483 0.0616432 -0.0002504 0.0002504 0.0604106 -0.0019287 0.0002504 0.0604106 -0.004052 0.0002504 0.0604106 -0.0067381 0.0002504 0.0604106 -0.0101365 0.0002504 0.0604106 -0.0144359 0.0002504 0.0604106 -0.0198752 0.0002504 0.0604106 -0.0267565 0.0002504 0.0604106 -0.0354624 0.0002504 0.0604106 -0.0464764 0.0002504 0.0604106 -0.0604106 0.0002504 0.0604106 -0.0780392 0.0002504 0.0604106 -0.1003416 0.0002504 0.0604106 -0.128557 0.0002504 0.0604106 -0.1642532 0.0002504 0.0604106 -0.2094136 0.0002504 0.0604106 -0.2665473 0.0002504 0.0604106 -0.3388289 0.0002504 0.0604106 -0.4302746 0.0002504 0.0604106 -0.5459652 0.0002504 0.0604106 -0.6923288 0.0002504 0.0604106 -0.8388802 0.0050694 0.0622508 -0.9026634 0.0276479 0.0750078 -0.9351449 0.0621069 0.0994127 -0.9543974 0.1056375 0.1342782 -0.9668479 0.156904 0.1784912 -0.9753591 0.2148124 0.2308255 -0.9814002 0.2780936 0.2897929 -0.9858036 0.3451791 0.3535993 -0.9890755 0.4142311 0.4202016 -0.9915418 0.4832747 0.4874464 -0.9934209 0.5503825 0.5532562 -0.9948643 0.6138613 0.6158144 -0.9959801 0.6723959 0.6737069 -0.9968468 0.7251226 0.7259927 -0.9975226 0.7716288 0.7722005 -0.998051 0.8118949 0.8122673 -0.9984652 0.8462034 0.8464441 -0.9987904 0.8750386 0.8751933 -0.9990461 0.8989969 0.8990957 -0.9992474 0.9187137 0.9187765 -0.9994059 0.9348128 0.9348526 -0.999531 0.9478738 0.947899 -0.9996296 0.958415 0.9584309 -0.9997074 0.9668867 0.9668967 -0.9997689 0.9736722 0.9736785 -0.9998174 0.9790925 0.9790964 -0.9998557 0.9834128 0.9834152 -0.999886 0.9868504 0.986852 -0.9999099 0.9895819 0.9895829 -0.9999288 0.9917501 0.9917507 -0.9999437 0.9934695 0.9934698 -0.0000238 0.006079 0.0645609 -0.0000382 0.0055755 0.0640574 -0.0000611 0.0049433 0.0634252 -0.0000978 0.0041512 0.0626331 -0.0001565 0.0031613 0.0616432 -0.0002504 0.0019287 0.0604106 -0.0004008 0.0004008 0.0588827 -0.0025241 0.0004008 0.0588827 -0.0052103 0.0004008 0.0588827 -0.0086086 0.0004008 0.0588827 -0.012908 0.0004008 0.0588827 -0.0183473 0.0004008 0.0588827 -0.0252287 0.0004008 0.0588827 -0.0339345 0.0004008 0.0588827 -0.0449485 0.0004008 0.0588827 -0.0588827 0.0004008 0.0588827 -0.0765113 0.0004008 0.0588827 -0.0988137 0.0004008 0.0588827 -0.1270291 0.0004008 0.0588827 -0.1627254 0.0004008 0.0588827 -0.2078857 0.0004008 0.0588827 -0.2650195 0.0004008 0.0588827 -0.337301 0.0004008 0.0588827 -0.4287467 0.0004008 0.0588827 -0.5444373 0.0004008 0.0588827 -0.6908009 0.0004008 0.0588827 -0.8381886 0.0051048 0.060749 -0.9024114 0.0275966 0.0736944 -0.9350332 0.0620199 0.0983271 -0.9543421 0.1055364 0.1334058 -0.9668187 0.1568008 0.1778032 -0.975343 0.2147144 0.2302916 -0.9813911 0.2780055 0.2893849 -0.9857982 0.3451032 0.3532924 -0.9890723 0.4141683 0.4199745 -0.9915399 0.4832246 0.4872812 -0.9934197 0.5503438 0.5531381 -0.9948636 0.6138323 0.6157314 -0.9959797 0.6723748 0.6736495 -0.9968465 0.7251076 0.7259536 -0.9975224 0.7716184 0.7721742 -0.9980509 0.8118878 0.8122499 -0.9984651 0.8461986 0.8464327 -0.9987903 0.8750355 0.8751858 -0.9990461 0.8989948 0.8990909 -0.9992473 0.9187123 0.9187734 -0.9994059 0.9348119 0.9348507 -0.999531 0.9478733 0.9478978 -0.9996296 0.9584146 0.9584301 -0.9997074 0.9668865 0.9668962 -0.9997689 0.9736721 0.9736782 -0.9998174 0.9790924 0.9790962 -0.9998557 0.9834127 0.9834151 -0.999886 0.9868504 0.9868519 -0.9999099 0.9895819 0.9895829 -0.9999288 0.99175 0.9917506 -0.9999437 0.9934695 0.9934698 -0.0000238 0.0082023 0.0645609 -0.0000382 0.0076988 0.0640574 -0.0000611 0.0070666 0.0634252 -0.0000978 0.0062744 0.0626331 -0.0001565 0.0052846 0.0616432 -0.0002504 0.004052 0.0604106 -0.0004008 0.0025241 0.0588827 -0.0006416 0.0006416 0.0570002 -0.0033277 0.0006416 0.0570002 -0.0067261 0.0006416 0.0570002 -0.0110255 0.0006416 0.0570002 -0.0164648 0.0006416 0.0570002 -0.0233461 0.0006416 0.0570002 -0.032052 0.0006416 0.0570002 -0.043066 0.0006416 0.0570002 -0.0570002 0.0006416 0.0570002 -0.0746288 0.0006416 0.0570002 -0.0969312 0.0006416 0.0570002 -0.1251466 0.0006416 0.0570002 -0.1608428 0.0006416 0.0570002 -0.2060032 0.0006416 0.0570002 -0.2631369 0.0006416 0.0570002 -0.3354185 0.0006416 0.0570002 -0.4268641 0.0006416 0.0570002 -0.5425548 0.0006416 0.0570002 -0.6889184 0.0006416 0.0570002 -0.8373283 0.0052028 0.0588953 -0.9020992 0.0275778 0.0720722 -0.9348949 0.0619473 0.0969867 -0.9542739 0.1054384 0.1323289 -0.9667827 0.1566936 0.1769544 -0.9753231 0.2146085 0.229633 -0.9813797 0.2779077 0.2888817 -0.9857916 0.3450175 0.352914 -0.9890684 0.4140964 0.4196945 -0.9915376 0.4831666 0.4870776 -0.9934183 0.5502987 0.5529925 -0.9948628 0.6137984 0.615629 -0.9959791 0.67235 0.6735787 -0.9968462 0.7250899 0.7259053 -0.9975222 0.7716061 0.7721418 -0.9980508 0.8118794 0.8122284 -0.998465 0.8461929 0.8464185 -0.9987903 0.8750317 0.8751766 -0.999046 0.8989923 0.8990849 -0.9992473 0.9187107 0.9187696 -0.9994059 0.9348109 0.9348482 -0.999531 0.9478726 0.9478962 -0.9996296 0.9584142 0.9584291 -0.9997074 0.9668862 0.9668956 -0.9997689 0.9736719 0.9736778 -0.9998174 0.9790923 0.979096 -0.9998557 0.9834127 0.983415 -0.999886 0.9868503 0.9868518 -0.9999099 0.9895819 0.9895828 -0.9999288 0.99175 0.9917506 -0.9999437 0.9934694 0.9934698 -0.0000238 0.0108885 0.0645609 -0.0000382 0.0103849 0.0640574 -0.0000611 0.0097527 0.0634252 -0.0000978 0.0089606 0.0626331 -0.0001565 0.0079707 0.0616432 -0.0002504 0.0067381 0.0604106 -0.0004008 0.0052103 0.0588827 -0.0006416 0.0033277 0.0570002 -0.0010268 0.0010268 0.0546993 -0.0044252 0.0010268 0.0546993 -0.0087246 0.0010268 0.0546993 -0.0141639 0.0010268 0.0546993 -0.0210452 0.0010268 0.0546993 -0.0297511 0.0010268 0.0546993 -0.0407651 0.0010268 0.0546993 -0.0546993 0.0010268 0.0546993 -0.0723279 0.0010268 0.0546993 -0.0946303 0.0010268 0.0546993 -0.1228457 0.0010268 0.0546993 -0.1585419 0.0010268 0.0546993 -0.2037023 0.0010268 0.0546993 -0.260836 0.0010268 0.0546993 -0.3331176 0.0010268 0.0546993 -0.4245633 0.0010268 0.0546993 -0.5402539 0.0010268 0.0546993 -0.6866175 0.0010268 0.0546993 -0.8362644 0.0054121 0.0566247 -0.9017148 0.0276281 0.0700837 -0.9347252 0.061916 0.095344 -0.9541902 0.1053624 0.1310098 -0.9667385 0.1565954 0.1759149 -0.9752987 0.2145034 0.2288268 -0.9813659 0.2778058 0.2882659 -0.9857835 0.3449254 0.352451 -0.9890637 0.4140176 0.419352 -0.9915347 0.4831021 0.4868285 -0.9934166 0.550248 0.5528144 -0.9948617 0.6137599 0.6155039 -0.9959785 0.6723217 0.6734921 -0.9968458 0.7250697 0.7258464 -0.997522 0.7715919 0.7721022 -0.9980506 0.8118697 0.8122021 -0.9984649 0.8461864 0.8464012 -0.9987902 0.8750274 0.8751654 -0.999046 0.8989895 0.8990777 -0.9992473 0.9187089 0.918765 -0.9994059 0.9348097 0.9348453 -0.999531 0.9478718 0.9478943 -0.9996296 0.9584137 0.9584279 -0.9997074 0.9668859 0.9668948 -0.9997689 0.9736717 0.9736773 -0.9998174 0.9790921 0.9790957 -0.9998557 0.9834126 0.9834148 -0.999886 0.9868503 0.9868517 -0.9999099 0.9895819 0.9895827 -0.9999288 0.99175 0.9917505 -0.9999437 0.9934694 0.9934698 -0.0000238 0.0142868 0.0645609 -0.0000382 0.0137833 0.0640574 -0.0000611 0.0131511 0.0634252 -0.0000978 0.012359 0.0626331 -0.0001565 0.0113691 0.0616432 -0.0002504 0.0101365 0.0604106 -0.0004008 0.0086086 0.0588827 -0.0006416 0.0067261 0.0570002 -0.0010268 0.0044252 0.0546993 -0.0016435 0.0016435 0.0519176 -0.0059429 0.0016435 0.0519176 -0.0113822 0.0016435 0.0519176 -0.0182636 0.0016435 0.0519176 -0.0269694 0.0016435 0.0519176 -0.0379834 0.0016435 0.0519176 -0.0519176 0.0016435 0.0519176 -0.0695462 0.0016435 0.0519176 -0.0918486 0.0016435 0.0519176 -0.120064 0.0016435 0.0519176 -0.1557603 0.0016435 0.0519176 -0.2009206 0.0016435 0.0519176 -0.2580543 0.0016435 0.0519176 -0.3303359 0.0016435 0.0519176 -0.4217816 0.0016435 0.0519176 -0.5374722 0.0016435 0.0519176 -0.6838358 0.0016435 0.0519176 -0.8349593 0.0058134 0.0538725 -0.9012461 0.0278105 0.0676709 -0.9345187 0.0619734 0.0933514 -0.9540886 0.1053433 0.1294105 -0.966685 0.1565315 0.1746553 -0.9752692 0.2144168 0.2278503 -0.9813491 0.2777122 0.2875203 -0.9857738 0.3448353 0.3518905 -0.9890579 0.4139373 0.4189375 -0.9915312 0.4830346 0.4865271 -0.9934145 0.5501939 0.552599 -0.9948604 0.6137183 0.6153525 -0.9959777 0.6722907 0.6733874 -0.9968453 0.7250473 0.725775 -0.9975217 0.7715762 0.7720543 -0.9980504 0.8118589 0.8121702 -0.9984648 0.8461791 0.8463803 -0.9987902 0.8750225 0.8751518 -0.9990459 0.8989863 0.8990689 -0.9992473 0.9187068 0.9187593 -0.9994059 0.9348083 0.9348417 -0.9995309 0.947871 0.947892 -0.9996296 0.9584132 0.9584264 -0.9997074 0.9668855 0.9668939 -0.9997689 0.9736715 0.9736767 -0.9998174 0.979092 0.9790953 -0.9998557 0.9834125 0.9834146 -0.999886 0.9868502 0.9868515 -0.9999099 0.9895818 0.9895826 -0.9999288 0.99175 0.9917505 -0.9999437 0.9934694 0.9934697 -0.0000238 0.0185862 0.0645609 -0.0000382 0.0180827 0.0640574 -0.0000611 0.0174505 0.0634252 -0.0000978 0.0166583 0.0626331 -0.0001565 0.0156685 0.0616432 -0.0002504 0.0144359 0.0604106 -0.0004008 0.012908 0.0588827 -0.0006416 0.0110255 0.0570002 -0.0010268 0.0087246 0.0546993 -0.0016435 0.0059429 0.0519176 -0.0026305 0.0026305 0.0486053 -0.0080698 0.0026305 0.0486053 -0.0149512 0.0026305 0.0486053 -0.023657 0.0026305 0.0486053 -0.0346711 0.0026305 0.0486053 -0.0486053 0.0026305 0.0486053 -0.0662338 0.0026305 0.0486053 -0.0885362 0.0026305 0.0486053 -0.1167517 0.0026305 0.0486053 -0.1524479 0.0026305 0.0486053 -0.1976083 0.0026305 0.0486053 -0.254742 0.0026305 0.0486053 -0.3270236 0.0026305 0.0486053 -0.4184692 0.0026305 0.0486053 -0.5341598 0.0026305 0.0486053 -0.6805235 0.0026305 0.0486053 -0.8333779 0.0065402 0.0505853 -0.900682 0.0282324 0.0647855 -0.9342712 0.062202 0.0909694 -0.9539671 0.1054431 0.1274998 -0.9666211 0.1565473 0.1731513 -0.975234 0.2143816 0.2266849 -0.9813291 0.2776503 0.2866309 -0.9857621 0.3447636 0.3512221 -0.989051 0.4138668 0.4184434 -0.9915271 0.4829718 0.4861679 -0.993412 0.5501416 0.5523423 -0.9948589 0.6136769 0.615172 -0.9959768 0.6722594 0.6732627 -0.9968448 0.7250244 0.7256901 -0.9975213 0.7715599 0.7719972 -0.9980502 0.8118476 0.8121323 -0.9984647 0.8461714 0.8463555 -0.9987901 0.8750173 0.8751356 -0.9990459 0.8989829 0.8990584 -0.9992472 0.9187045 0.9187526 -0.9994059 0.9348069 0.9348374 -0.9995309 0.94787 0.9478893 -0.9996296 0.9584126 0.9584247 -0.9997074 0.9668852 0.9668928 -0.9997689 0.9736712 0.9736761 -0.9998174 0.9790919 0.9790949 -0.9998557 0.9834124 0.9834143 -0.999886 0.9868502 0.9868513 -0.9999099 0.9895818 0.9895825 -0.9999288 0.99175 0.9917504 -0.9999437 0.9934694 0.9934697 -0.0000238 0.0240255 0.0645609 -0.0000382 0.023522 0.0640574 -0.0000611 0.0228898 0.0634252 -0.0000978 0.0220976 0.0626331 -0.0001565 0.0211078 0.0616432 -0.0002504 0.0198752 0.0604106 -0.0004008 0.0183473 0.0588827 -0.0006416 0.0164648 0.0570002 -0.0010268 0.0141639 0.0546993 -0.0016435 0.0113822 0.0519176 -0.0026305 0.0080698 0.0486053 -0.0042103 0.0042103 0.0447458 -0.0110917 0.0042103 0.0447458 -0.0197975 0.0042103 0.0447458 -0.0308116 0.0042103 0.0447458 -0.0447458 0.0042103 0.0447458 -0.0623743 0.0042103 0.0447458 -0.0846767 0.0042103 0.0447458 -0.1128922 0.0042103 0.0447458 -0.1485884 0.0042103 0.0447458 -0.1937488 0.0042103 0.0447458 -0.2508825 0.0042103 0.0447458 -0.3231641 0.0042103 0.0447458 -0.4146097 0.0042103 0.0447458 -0.5303003 0.0042103 0.0447458 -0.676664 0.0042103 0.0447458 -0.8314967 0.0078103 0.0467417 -0.9000167 0.0290732 0.0614064 -0.9339805 0.062742 0.088181 -0.9538247 0.1057683 0.1252648 -0.9665463 0.1567226 0.1713932 -0.9751928 0.2144566 0.2253234 -0.9813057 0.2776626 0.2855923 -0.9857485 0.3447407 0.350442 -0.989043 0.4138277 0.4178668 -0.9915223 0.4829286 0.4857488 -0.9934091 0.5501012 0.5520428 -0.9948571 0.6136427 0.6149617 -0.9959757 0.6722322 0.6731172 -0.9968441 0.7250039 0.725591 -0.9975209 0.7715449 0.7719306 -0.99805 0.811837 0.8120882 -0.9984645 0.8461641 0.8463265 -0.99879 0.8750124 0.8751167 -0.9990458 0.8989796 0.8990462 -0.9992472 0.9187024 0.9187448 -0.9994059 0.9348055 0.9348324 -0.9995309 0.9478691 0.9478861 -0.9996296 0.958412 0.9584227 -0.9997074 0.9668848 0.9668915 -0.9997689 0.973671 0.9736753 -0.9998174 0.9790917 0.9790944 -0.9998557 0.9834123 0.983414 -0.999886 0.9868501 0.9868511 -0.9999099 0.9895818 0.9895824 -0.9999288 0.9917499 0.9917503 -0.9999437 0.9934694 0.9934696 -0.0000238 0.0309069 0.0645609 -0.0000382 0.0304033 0.0640574 -0.0000611 0.0297711 0.0634252 -0.0000978 0.028979 0.0626331 -0.0001565 0.0279891 0.0616432 -0.0002504 0.0267565 0.0604106 -0.0004008 0.0252287 0.0588827 -0.0006416 0.0233461 0.0570002 -0.0010268 0.0210452 0.0546993 -0.0016435 0.0182636 0.0519176 -0.0026305 0.0149512 0.0486053 -0.0042103 0.0110917 0.0447458 -0.0067388 0.0067388 0.0403929 -0.0154447 0.0067388 0.0403929 -0.0264587 0.0067388 0.0403929 -0.0403929 0.0067388 0.0403929 -0.0580214 0.0067388 0.0403929 -0.0803239 0.0067388 0.0403929 -0.1085393 0.0067388 0.0403929 -0.1442355 0.0067388 0.0403929 -0.1893959 0.0067388 0.0403929 -0.2465296 0.0067388 0.0403929 -0.3188112 0.0067388 0.0403929 -0.4102568 0.0067388 0.0403929 -0.5259474 0.0067388 0.0403929 -0.6723111 0.0067388 0.0403929 -0.8293233 0.0099781 0.0423902 -0.8992555 0.0306306 0.0575732 -0.9336494 0.0638283 0.0850195 -0.953663 0.1064997 0.1227327 -0.9664615 0.1571937 0.169403 -0.9751462 0.2147432 0.2237832 -0.9812792 0.2778236 0.284418 -0.9857332 0.3448204 0.3495603 -0.9890339 0.4138582 0.4172154 -0.9915169 0.4829319 0.4852755 -0.9934058 0.5500915 0.5517048 -0.9948551 0.6136284 0.6147242 -0.9959745 0.672218 0.6729531 -0.9968433 0.7249916 0.7254792 -0.9975204 0.7715352 0.7718555 -0.9980497 0.8118298 0.8120384 -0.9984643 0.8461589 0.8462937 -0.9987899 0.8750088 0.8750954 -0.9990458 0.8989771 0.8990325 -0.9992472 0.9187008 0.918736 -0.9994058 0.9348044 0.9348267 -0.9995309 0.9478684 0.9478825 -0.9996296 0.9584115 0.9584204 -0.9997074 0.9668845 0.9668901 -0.9997689 0.9736708 0.9736743 -0.9998174 0.9790916 0.9790938 -0.9998557 0.9834122 0.9834136 -0.999886 0.9868501 0.9868509 -0.9999099 0.9895817 0.9895823 -0.9999288 0.9917499 0.9917503 -0.9999437 0.9934694 0.9934696 -0.0000238 0.0396127 0.0645609 -0.0000382 0.0391092 0.0640574 -0.0000611 0.038477 0.0634252 -0.0000978 0.0376849 0.0626331 -0.0001565 0.036695 0.0616432 -0.0002504 0.0354624 0.0604106 -0.0004008 0.0339345 0.0588827 -0.0006416 0.032052 0.0570002 -0.0010268 0.0297511 0.0546993 -0.0016435 0.0269694 0.0519176 -0.0026305 0.023657 0.0486053 -0.0042103 0.0197975 0.0447458 -0.0067388 0.0154447 0.0403929 -0.0107859 0.0107859 0.0357341 -0.0217999 0.0107859 0.0357341 -0.0357341 0.0107859 0.0357341 -0.0533626 0.0107859 0.0357341 -0.075665 0.0107859 0.0357341 -0.1038805 0.0107859 0.0357341 -0.1395767 0.0107859 0.0357341 -0.1847371 0.0107859 0.0357341 -0.2418708 0.0107859 0.0357341 -0.3141524 0.0107859 0.0357341 -0.405598 0.0107859 0.0357341 -0.5212886 0.0107859 0.0357341 -0.6676523 0.0107859 0.0357341 -0.8269342 0.0136166 0.037714 -0.8984278 0.0333932 0.0534444 -0.9332914 0.0658501 0.0816158 -0.9534887 0.1079385 0.1200092 -0.9663702 0.15819 0.1672642 -0.9750962 0.2154135 0.2221293 -0.9812508 0.2782606 0.2831577 -0.9857167 0.3450957 0.3486146 -0.9890241 0.4140252 0.416517 -0.991511 0.4830292 0.4847683 -0.9934023 0.5501456 0.5513425 -0.994853 0.6136569 0.6144698 -0.9959732 0.672232 0.6727772 -0.9968425 0.7249978 0.7253595 -0.9975199 0.7715376 0.7717751 -0.9980494 0.8118303 0.811985 -0.9984642 0.8461587 0.8462587 -0.9987897 0.8750084 0.8750726 -0.9990457 0.8989767 0.8990177 -0.9992471 0.9187004 0.9187265 -0.9994058 0.9348042 0.9348207 -0.9995309 0.9478683 0.9478787 -0.9996295 0.9584114 0.958418 -0.9997074 0.9668844 0.9668886 -0.9997689 0.9736708 0.9736734 -0.9998174 0.9790916 0.9790932 -0.9998557 0.9834122 0.9834132 -0.999886 0.98685 0.9868507 -0.9999099 0.9895817 0.9895821 -0.9999288 0.9917499 0.9917502 -0.9999437 0.9934694 0.9934695 -0.0000238 0.0506267 0.0645609 -0.0000382 0.0501232 0.0640574 -0.0000611 0.049491 0.0634252 -0.0000978 0.0486989 0.0626331 -0.0001565 0.047709 0.0616432 -0.0002504 0.0464764 0.0604106 -0.0004008 0.0449485 0.0588827 -0.0006416 0.043066 0.0570002 -0.0010268 0.0407651 0.0546993 -0.0016435 0.0379834 0.0519176 -0.0026305 0.0346711 0.0486053 -0.0042103 0.0308116 0.0447458 -0.0067388 0.0264587 0.0403929 -0.0107859 0.0217999 0.0357341 -0.0172633 0.0172633 0.0311975 -0.0311975 0.0172633 0.0311975 -0.0488261 0.0172633 0.0311975 -0.0711285 0.0172633 0.0311975 -0.099344 0.0172633 0.0311975 -0.1350402 0.0172633 0.0311975 -0.1802005 0.0172633 0.0311975 -0.2373343 0.0172633 0.0311975 -0.3096159 0.0172633 0.0311975 -0.4010615 0.0172633 0.0311975 -0.5167521 0.0172633 0.0311975 -0.6631157 0.0172633 0.0311975 -0.8245426 0.0196467 0.0331428 -0.8976087 0.0381561 0.0493979 -0.9329391 0.0694453 0.0782816 -0.9533177 0.1105818 0.1173437 -0.9662809 0.160092 0.1651729 -0.9750472 0.2167545 0.2205133 -0.9812231 0.2791873 0.2819272 -0.9857006 0.3457234 0.3476916 -0.9890146 0.4144423 0.4158356 -0.9915054 0.4833013 0.4842735 -0.9933988 0.5503203 0.5509893 -0.9948509 0.6137675 0.6142218 -0.9959719 0.6723012 0.6726059 -0.9968418 0.7250408 0.7252429 -0.9975194 0.7715641 0.7716968 -0.9980491 0.8118466 0.811933 -0.998464 0.8461687 0.8462246 -0.9987896 0.8750145 0.8750504 -0.9990456 0.8989805 0.8990034 -0.9992471 0.9187027 0.9187173 -0.9994058 0.9348056 0.9348148 -0.9995309 0.9478691 0.947875 -0.9996295 0.958412 0.9584156 -0.9997074 0.9668847 0.9668871 -0.9997688 0.973671 0.9736724 -0.9998174 0.9790917 0.9790926 -0.9998557 0.9834123 0.9834129 -0.999886 0.9868501 0.9868505 -0.9999099 0.9895817 0.989582 -0.9999288 0.9917499 0.9917501 -0.9999437 0.9934694 0.9934695 -0.0000238 0.0645609 0.0645609 -0.0000382 0.0640574 0.0640574 -0.0000611 0.0634252 0.0634252 -0.0000978 0.0626331 0.0626331 -0.0001565 0.0616432 0.0616432 -0.0002504 0.0604106 0.0604106 -0.0004008 0.0588827 0.0588827 -0.0006416 0.0570002 0.0570002 -0.0010268 0.0546993 0.0546993 -0.0016435 0.0519176 0.0519176 -0.0026305 0.0486053 0.0486053 -0.0042103 0.0447458 0.0447458 -0.0067388 0.0403929 0.0403929 -0.0107859 0.0357341 0.0357341 -0.0172633 0.0311975 0.0311975 -0.0276309 0.0276309 0.0276309 -0.0452595 0.0276309 0.0276309 -0.0675619 0.0276309 0.0276309 -0.0957773 0.0276309 0.0276309 -0.1314736 0.0276309 0.0276309 -0.1766339 0.0276309 0.0276309 -0.2337676 0.0276309 0.0276309 -0.3060492 0.0276309 0.0276309 -0.3974949 0.0276309 0.0276309 -0.5131855 0.0276309 0.0276309 -0.6595491 0.0276309 0.0276309 -0.8226154 0.0295373 0.0295373 -0.8969554 0.0461985 0.0461985 -0.9326595 0.0756464 0.0756464 -0.9531823 0.1152388 0.1152388 -0.9662104 0.1635226 0.1635226 -0.9750086 0.2192389 0.2192389 -0.9812013 0.2809573 0.2809573 -0.9856879 0.3469645 0.3469645 -0.9890072 0.4152991 0.4152991 -0.9915009 0.4838841 0.4838841 -0.9933961 0.5507113 0.5507113 -0.9948493 0.6140266 0.6140266 -0.9959709 0.6724711 0.6724711 -0.9968411 0.7251511 0.7251511 -0.9975191 0.7716352 0.7716352 -0.9980488 0.8118921 0.8118921 -0.9984638 0.8461977 0.8461977 -0.9987895 0.8750329 0.8750329 -0.9990456 0.8989921 0.8989921 -0.999247 0.9187101 0.9187101 -0.9994057 0.9348102 0.9348102 -0.9995309 0.947872 0.947872 -0.9996295 0.9584138 0.9584138 -0.9997074 0.9668859 0.9668859 -0.9997688 0.9736717 0.9736717 -0.9998174 0.9790921 0.9790921 -0.9998557 0.9834126 0.9834126 -0.999886 0.9868503 0.9868503 -0.9999099 0.9895819 0.9895819 -0.9999288 0.99175 0.99175 -0.9999437 0.9934694 0.9934694 -0.0000238 0.0821895 0.0645609 -0.0000382 0.081686 0.0640574 -0.0000611 0.0810538 0.0634252 -0.0000978 0.0802616 0.0626331 -0.0001565 0.0792718 0.0616432 -0.0002504 0.0780392 0.0604106 -0.0004008 0.0765113 0.0588827 -0.0006416 0.0746288 0.0570002 -0.0010268 0.0723279 0.0546993 -0.0016435 0.0695462 0.0519176 -0.0026305 0.0662338 0.0486053 -0.0042103 0.0623743 0.0447458 -0.0067388 0.0580214 0.0403929 -0.0107859 0.0533626 0.0357341 -0.0172633 0.0488261 0.0311975 -0.0276309 0.0452595 0.0276309 -0.0452595 0.0452595 0.0276309 -0.0675619 0.0452595 0.0276309 -0.0957773 0.0452595 0.0276309 -0.1314736 0.0452595 0.0276309 -0.1766339 0.0452595 0.0276309 -0.2337676 0.0452595 0.0276309 -0.3060492 0.0452595 0.0276309 -0.3974949 0.0452595 0.0276309 -0.5131855 0.0452595 0.0276309 -0.6595491 0.0452595 0.0276309 -0.8226154 0.0466479 0.0295373 -0.8969554 0.0604636 0.0461985 -0.9326595 0.0868564 0.0756464 -0.9531823 0.1238137 0.1152388 -0.9662104 0.1699632 0.1635226 -0.9750086 0.224002 0.2192389 -0.9812013 0.2844283 0.2809573 -0.9856879 0.3494573 0.3469645 -0.9890072 0.4170635 0.4152991 -0.9915009 0.4851151 0.4838841 -0.9933961 0.5515582 0.5507113 -0.9948493 0.6146016 0.6140266 -0.9959709 0.6728567 0.6724711 -0.9968411 0.7254069 0.7251511 -0.9975191 0.7718031 0.7716352 -0.9980488 0.8120015 0.8118921 -0.9984638 0.8462684 0.8461977 -0.9987895 0.8750783 0.8750329 -0.9990456 0.8990211 0.8989921 -0.999247 0.9187285 0.9187101 -0.9994057 0.9348219 0.9348102 -0.9995309 0.9478794 0.947872 -0.9996295 0.9584184 0.9584138 -0.9997074 0.9668888 0.9668859 -0.9997688 0.9736735 0.9736717 -0.9998174 0.9790933 0.9790921 -0.9998557 0.9834133 0.9834126 -0.999886 0.9868507 0.9868503 -0.9999099 0.9895821 0.9895819 -0.9999288 0.9917502 0.99175 -0.9999437 0.9934695 0.9934694 -0.0000238 0.1044919 0.0645609 -0.0000382 0.1039884 0.0640574 -0.0000611 0.1033562 0.0634252 -0.0000978 0.102564 0.0626331 -0.0001565 0.1015742 0.0616432 -0.0002504 0.1003416 0.0604106 -0.0004008 0.0988137 0.0588827 -0.0006416 0.0969312 0.0570002 -0.0010268 0.0946303 0.0546993 -0.0016435 0.0918486 0.0519176 -0.0026305 0.0885362 0.0486053 -0.0042103 0.0846767 0.0447458 -0.0067388 0.0803239 0.0403929 -0.0107859 0.075665 0.0357341 -0.0172633 0.0711285 0.0311975 -0.0276309 0.0675619 0.0276309 -0.0452595 0.0675619 0.0276309 -0.0675619 0.0675619 0.0276309 -0.0957773 0.0675619 0.0276309 -0.1314736 0.0675619 0.0276309 -0.1766339 0.0675619 0.0276309 -0.2337676 0.0675619 0.0276309 -0.3060492 0.0675619 0.0276309 -0.3974949 0.0675619 0.0276309 -0.5131855 0.0675619 0.0276309 -0.6595491 0.0675619 0.0276309 -0.8226154 0.068295 0.0295373 -0.8969554 0.0785108 0.0461985 -0.9326595 0.1010384 0.0756464 -0.9531823 0.134662 0.1152388 -0.9662104 0.1781114 0.1635226 -0.9750086 0.2300279 0.2192389 -0.9812013 0.2888196 0.2809573 -0.9856879 0.352611 0.3469645 -0.9890072 0.4192956 0.4152991 -0.9915009 0.4866724 0.4838841 -0.9933961 0.5526297 0.5507113 -0.9948493 0.6153291 0.6140266 -0.9959709 0.6733446 0.6724711 -0.9968411 0.7257304 0.7251511 -0.9975191 0.7720156 0.7716352 -0.9980488 0.8121398 0.8118921 -0.9984638 0.8463578 0.8461977 -0.9987895 0.8751357 0.8750329 -0.9990456 0.8990578 0.8989921 -0.999247 0.9187518 0.9187101 -0.9994057 0.9348367 0.9348102 -0.9995309 0.9478888 0.947872 -0.9996295 0.9584243 0.9584138 -0.9997074 0.9668925 0.9668859 -0.9997688 0.9736759 0.9736717 -0.9998174 0.9790948 0.9790921 -0.9998557 0.9834142 0.9834126 -0.999886 0.9868513 0.9868503 -0.9999099 0.9895825 0.9895819 -0.9999288 0.9917504 0.99175 -0.9999437 0.9934697 0.9934694 -0.0000238 0.1327073 0.0645609 -0.0000382 0.1322038 0.0640574 -0.0000611 0.1315716 0.0634252 -0.0000978 0.1307795 0.0626331 -0.0001565 0.1297896 0.0616432 -0.0002504 0.128557 0.0604106 -0.0004008 0.1270291 0.0588827 -0.0006416 0.1251466 0.0570002 -0.0010268 0.1228457 0.0546993 -0.0016435 0.120064 0.0519176 -0.0026305 0.1167517 0.0486053 -0.0042103 0.1128922 0.0447458 -0.0067388 0.1085393 0.0403929 -0.0107859 0.1038805 0.0357341 -0.0172633 0.099344 0.0311975 -0.0276309 0.0957773 0.0276309 -0.0452595 0.0957773 0.0276309 -0.0675619 0.0957773 0.0276309 -0.0957773 0.0957773 0.0276309 -0.1314736 0.0957773 0.0276309 -0.1766339 0.0957773 0.0276309 -0.2337676 0.0957773 0.0276309 -0.3060492 0.0957773 0.0276309 -0.3974949 0.0957773 0.0276309 -0.5131855 0.0957773 0.0276309 -0.6595491 0.0957773 0.0276309 -0.8226154 0.0956813 0.0295373 -0.8969554 0.1013429 0.0461985 -0.9326595 0.1189805 0.0756464 -0.9531823 0.1483866 0.1152388 -0.9662104 0.1884199 0.1635226 -0.9750086 0.2376515 0.2192389 -0.9812013 0.2943751 0.2809573 -0.9856879 0.3566008 0.3469645 -0.9890072 0.4221196 0.4152991 -0.9915009 0.4886426 0.4838841 -0.9933961 0.5539852 0.5507113 -0.9948493 0.6162494 0.6140266 -0.9959709 0.6739618 0.6724711 -0.9968411 0.7261398 0.7251511 -0.9975191 0.7722844 0.7716352 -0.9980488 0.8123148 0.8118921 -0.9984638 0.8464709 0.8461977 -0.9987895 0.8752084 0.8750329 -0.9990456 0.8991042 0.8989921 -0.999247 0.9187814 0.9187101 -0.9994057 0.9348554 0.9348102 -0.9995309 0.9479006 0.947872 -0.9996295 0.9584318 0.9584138 -0.9997074 0.9668972 0.9668859 -0.9997688 0.9736788 0.9736717 -0.9998174 0.9790966 0.9790921 -0.9998557 0.9834154 0.9834126 -0.999886 0.986852 0.9868503 -0.9999099 0.989583 0.9895819 -0.9999288 0.9917507 0.99175 -0.9999437 0.9934699 0.9934694 -0.0000238 0.1684036 0.0645609 -0.0000382 0.1679 0.0640574 -0.0000611 0.1672678 0.0634252 -0.0000978 0.1664757 0.0626331 -0.0001565 0.1654858 0.0616432 -0.0002504 0.1642532 0.0604106 -0.0004008 0.1627254 0.0588827 -0.0006416 0.1608428 0.0570002 -0.0010268 0.1585419 0.0546993 -0.0016435 0.1557603 0.0519176 -0.0026305 0.1524479 0.0486053 -0.0042103 0.1485884 0.0447458 -0.0067388 0.1442355 0.0403929 -0.0107859 0.1395767 0.0357341 -0.0172633 0.1350402 0.0311975 -0.0276309 0.1314736 0.0276309 -0.0452595 0.1314736 0.0276309 -0.0675619 0.1314736 0.0276309 -0.0957773 0.1314736 0.0276309 -0.1314736 0.1314736 0.0276309 -0.1766339 0.1314736 0.0276309 -0.2337676 0.1314736 0.0276309 -0.3060492 0.1314736 0.0276309 -0.3974949 0.1314736 0.0276309 -0.5131855 0.1314736 0.0276309 -0.6595491 0.1314736 0.0276309 -0.8226154 0.1303287 0.0295373 -0.8969554 0.1302284 0.0461985 -0.9326595 0.1416797 0.0756464 -0.9531823 0.16575 0.1152388 -0.9662104 0.2014616 0.1635226 -0.9750086 0.2472963 0.2192389 -0.9812013 0.3014036 0.2809573 -0.9856879 0.3616485 0.3469645 -0.9890072 0.4256923 0.4152991 -0.9915009 0.4911352 0.4838841 -0.9933961 0.5557001 0.5507113 -0.9948493 0.6174138 0.6140266 -0.9959709 0.6747426 0.6724711 -0.9968411 0.7266577 0.7251511 -0.9975191 0.7726245 0.7716352 -0.9980488 0.8125362 0.8118921 -0.9984638 0.846614 0.8461977 -0.9987895 0.8753002 0.8750329 -0.9990456 0.8991629 0.8989921 -0.999247 0.9188187 0.9187101 -0.9994057 0.9348791 0.9348102 -0.9995309 0.9479156 0.947872 -0.9996295 0.9584412 0.9584138 -0.9997074 0.9669032 0.9668859 -0.9997688 0.9736826 0.9736717 -0.9998174 0.9790989 0.9790921 -0.9998557 0.9834168 0.9834126 -0.999886 0.9868529 0.9868503 -0.9999099 0.9895835 0.9895819 -0.9999288 0.991751 0.99175 -0.9999437 0.9934701 0.9934694 -0.0000238 0.2135639 0.0645609 -0.0000382 0.2130604 0.0640574 -0.0000611 0.2124282 0.0634252 -0.0000978 0.2116361 0.0626331 -0.0001565 0.2106462 0.0616432 -0.0002504 0.2094136 0.0604106 -0.0004008 0.2078857 0.0588827 -0.0006416 0.2060032 0.0570002 -0.0010268 0.2037023 0.0546993 -0.0016435 0.2009206 0.0519176 -0.0026305 0.1976083 0.0486053 -0.0042103 0.1937488 0.0447458 -0.0067388 0.1893959 0.0403929 -0.0107859 0.1847371 0.0357341 -0.0172633 0.1802005 0.0311975 -0.0276309 0.1766339 0.0276309 -0.0452595 0.1766339 0.0276309 -0.0675619 0.1766339 0.0276309 -0.0957773 0.1766339 0.0276309 -0.1314736 0.1766339 0.0276309 -0.1766339 0.1766339 0.0276309 -0.2337676 0.1766339 0.0276309 -0.3060492 0.1766339 0.0276309 -0.3974949 0.1766339 0.0276309 -0.5131855 0.1766339 0.0276309 -0.6595491 0.1766339 0.0276309 -0.8226154 0.174162 0.0295373 -0.8969554 0.1667723 0.0461985 -0.9326595 0.170397 0.0756464 -0.9531823 0.1877169 0.1152388 -0.9662104 0.2179609 0.1635226 -0.9750086 0.2594983 0.2192389 -0.9812013 0.3102955 0.2809573 -0.9856879 0.3680344 0.3469645 -0.9890072 0.4302122 0.4152991 -0.9915009 0.4942887 0.4838841 -0.9933961 0.5578697 0.5507113 -0.9948493 0.6188868 0.6140266 -0.9959709 0.6757305 0.6724711 -0.9968411 0.7273129 0.7251511 -0.9975191 0.7730548 0.7716352 -0.9980488 0.8128163 0.8118921 -0.9984638 0.846795 0.8461977 -0.9987895 0.8754165 0.8750329 -0.9990456 0.8992372 0.8989921 -0.999247 0.9188659 0.9187101 -0.9994057 0.934909 0.9348102 -0.9995309 0.9479345 0.947872 -0.9996295 0.9584532 0.9584138 -0.9997074 0.9669107 0.9668859 -0.9997688 0.9736873 0.9736717 -0.9998174 0.9791019 0.9790921 -0.9998557 0.9834187 0.9834126 -0.999886 0.9868541 0.9868503 -0.9999099 0.9895843 0.9895819 -0.9999288 0.9917515 0.99175 -0.9999437 0.9934704 0.9934694 -0.0000238 0.2706977 0.0645609 -0.0000382 0.2701941 0.0640574 -0.0000611 0.2695619 0.0634252 -0.0000978 0.2687698 0.0626331 -0.0001565 0.2677799 0.0616432 -0.0002504 0.2665473 0.0604106 -0.0004008 0.2650195 0.0588827 -0.0006416 0.2631369 0.0570002 -0.0010268 0.260836 0.0546993 -0.0016435 0.2580543 0.0519176 -0.0026305 0.254742 0.0486053 -0.0042103 0.2508825 0.0447458 -0.0067388 0.2465296 0.0403929 -0.0107859 0.2418708 0.0357341 -0.0172633 0.2373343 0.0311975 -0.0276309 0.2337676 0.0276309 -0.0452595 0.2337676 0.0276309 -0.0675619 0.2337676 0.0276309 -0.0957773 0.2337676 0.0276309 -0.1314736 0.2337676 0.0276309 -0.1766339 0.2337676 0.0276309 -0.2337676 0.2337676 0.0276309 -0.3060492 0.2337676 0.0276309 -0.3974949 0.2337676 0.0276309 -0.5131855 0.2337676 0.0276309 -0.6595491 0.2337676 0.0276309 -0.8226154 0.229617 0.0295373 -0.8969554 0.2130052 0.0461985 -0.9326595 0.2067281 0.0756464 -0.9531823 0.2155079 0.1152388 -0.9662104 0.2388348 0.1635226 -0.9750086 0.2749353 0.2192389 -0.9812013 0.321545 0.2809573 -0.9856879 0.3761135 0.3469645 -0.9890072 0.4359305 0.4152991 -0.9915009 0.4982782 0.4838841 -0.9933961 0.5606145 0.5507113 -0.9948493 0.6207504 0.6140266 -0.9959709 0.6769804 0.6724711 -0.9968411 0.7281418 0.7251511 -0.9975191 0.7735991 0.7716352 -0.9980488 0.8131707 0.8118921 -0.9984638 0.847024 0.8461977 -0.9987895 0.8755636 0.8750329 -0.9990456 0.8993311 0.8989921 -0.999247 0.9189257 0.9187101 -0.9994057 0.9349469 0.9348102 -0.9995309 0.9479584 0.947872 -0.9996295 0.9584683 0.9584138 -0.9997074 0.9669202 0.9668859 -0.9997688 0.9736932 0.9736717 -0.9998174 0.9791057 0.9790921 -0.9998557 0.983421 0.9834126 -0.999886 0.9868556 0.9868503 -0.9999099 0.9895852 0.9895819 -0.9999288 0.9917521 0.99175 -0.9999437 0.9934707 0.9934694 -0.0000238 0.3429792 0.0645609 -0.0000382 0.3424757 0.0640574 -0.0000611 0.3418435 0.0634252 -0.0000978 0.3410514 0.0626331 -0.0001565 0.3400615 0.0616432 -0.0002504 0.3388289 0.0604106 -0.0004008 0.337301 0.0588827 -0.0006416 0.3354185 0.0570002 -0.0010268 0.3331176 0.0546993 -0.0016435 0.3303359 0.0519176 -0.0026305 0.3270236 0.0486053 -0.0042103 0.3231641 0.0447458 -0.0067388 0.3188112 0.0403929 -0.0107859 0.3141524 0.0357341 -0.0172633 0.3096159 0.0311975 -0.0276309 0.3060492 0.0276309 -0.0452595 0.3060492 0.0276309 -0.0675619 0.3060492 0.0276309 -0.0957773 0.3060492 0.0276309 -0.1314736 0.3060492 0.0276309 -0.1766339 0.3060492 0.0276309 -0.2337676 0.3060492 0.0276309 -0.3060492 0.3060492 0.0276309 -0.3974949 0.3060492 0.0276309 -0.5131855 0.3060492 0.0276309 -0.6595491 0.3060492 0.0276309 -0.8226154 0.2997746 0.0295373 -0.8969554 0.2714957 0.0461985 -0.9326595 0.2526918 0.0756464 -0.9531823 0.2506671 0.1152388 -0.9662104 0.2652429 0.1635226 -0.9750086 0.2944652 0.2192389 -0.9812013 0.335777 0.2809573 -0.9856879 0.3863346 0.3469645 -0.9890072 0.4431649 0.4152991 -0.9915009 0.5033255 0.4838841 -0.9933961 0.5640871 0.5507113 -0.9948493 0.6231081 0.6140266 -0.9959709 0.6785616 0.6724711 -0.9968411 0.7291904 0.7251511 -0.9975191 0.7742877 0.7716352 -0.9980488 0.813619 0.8118921 -0.9984638 0.8473137 0.8461977 -0.9987895 0.8757496 0.8750329 -0.9990456 0.89945 0.8989921 -0.999247 0.9190013 0.9187101 -0.9994057 0.9349948 0.9348102 -0.9995309 0.9479887 0.947872 -0.9996295 0.9584874 0.9584138 -0.9997074 0.9669322 0.9668859 -0.9997688 0.9737008 0.9736717 -0.9998174 0.9791104 0.9790921 -0.9998557 0.983424 0.9834126 -0.999886 0.9868574 0.9868503 -0.9999099 0.9895864 0.9895819 -0.9999288 0.9917528 0.99175 -0.9999437 0.9934712 0.9934694 -0.0000238 0.4344249 0.0645609 -0.0000382 0.4339214 0.0640574 -0.0000611 0.4332891 0.0634252 -0.0000978 0.432497 0.0626331 -0.0001565 0.4315072 0.0616432 -0.0002504 0.4302746 0.0604106 -0.0004008 0.4287467 0.0588827 -0.0006416 0.4268641 0.0570002 -0.0010268 0.4245633 0.0546993 -0.0016435 0.4217816 0.0519176 -0.0026305 0.4184692 0.0486053 -0.0042103 0.4146097 0.0447458 -0.0067388 0.4102568 0.0403929 -0.0107859 0.405598 0.0357341 -0.0172633 0.4010615 0.0311975 -0.0276309 0.3974949 0.0276309 -0.0452595 0.3974949 0.0276309 -0.0675619 0.3974949 0.0276309 -0.0957773 0.3974949 0.0276309 -0.1314736 0.3974949 0.0276309 -0.1766339 0.3974949 0.0276309 -0.2337676 0.3974949 0.0276309 -0.3060492 0.3974949 0.0276309 -0.3974949 0.3974949 0.0276309 -0.5131855 0.3974949 0.0276309 -0.6595491 0.3974949 0.0276309 -0.8226154 0.3885332 0.0295373 -0.8969554 0.3454939 0.0461985 -0.9326595 0.3108418 0.0756464 -0.9531823 0.2951481 0.1152388 -0.9662104 0.2986526 0.1635226 -0.9750086 0.319173 0.2192389 -0.9812013 0.3537823 0.2809573 -0.9856879 0.3992655 0.3469645 -0.9890072 0.4523173 0.4152991 -0.9915009 0.5097109 0.4838841 -0.9933961 0.5684803 0.5507113 -0.9948493 0.6260909 0.6140266 -0.9959709 0.680562 0.6724711 -0.9968411 0.7305171 0.7251511 -0.9975191 0.7751589 0.7716352 -0.9980488 0.8141862 0.8118921 -0.9984638 0.8476802 0.8461977 -0.9987895 0.875985 0.8750329 -0.9990456 0.8996004 0.8989921 -0.999247 0.919097 0.9187101 -0.9994057 0.9350555 0.9348102 -0.9995309 0.948027 0.947872 -0.9996295 0.9585115 0.9584138 -0.9997074 0.9669474 0.9668859 -0.9997688 0.9737104 0.9736717 -0.9998174 0.9791164 0.9790921 -0.9998557 0.9834278 0.9834126 -0.999886 0.9868598 0.9868503 -0.9999099 0.9895878 0.9895819 -0.9999288 0.9917537 0.99175 -0.9999437 0.9934718 0.9934694 -0.0000238 0.5501155 0.0645609 -0.0000382 0.549612 0.0640574 -0.0000611 0.5489798 0.0634252 -0.0000978 0.5481876 0.0626331 -0.0001565 0.5471978 0.0616432 -0.0002504 0.5459652 0.0604106 -0.0004008 0.5444373 0.0588827 -0.0006416 0.5425548 0.0570002 -0.0010268 0.5402539 0.0546993 -0.0016435 0.5374722 0.0519176 -0.0026305 0.5341598 0.0486053 -0.0042103 0.5303003 0.0447458 -0.0067388 0.5259474 0.0403929 -0.0107859 0.5212886 0.0357341 -0.0172633 0.5167521 0.0311975 -0.0276309 0.5131855 0.0276309 -0.0452595 0.5131855 0.0276309 -0.0675619 0.5131855 0.0276309 -0.0957773 0.5131855 0.0276309 -0.1314736 0.5131855 0.0276309 -0.1766339 0.5131855 0.0276309 -0.2337676 0.5131855 0.0276309 -0.3060492 0.5131855 0.0276309 -0.3974949 0.5131855 0.0276309 -0.5131855 0.5131855 0.0276309 -0.6595491 0.5131855 0.0276309 -0.8226154 0.5008244 0.0295373 -0.8969554 0.4391112 0.0461985 -0.9326595 0.3844091 0.0756464 -0.9531823 0.3514224 0.1152388 -0.9662104 0.3409202 0.1635226 -0.9750086 0.3504316 0.2192389 -0.9812013 0.3765614 0.2809573 -0.9856879 0.4156249 0.3469645 -0.9890072 0.4638963 0.4152991 -0.9915009 0.5177893 0.4838841 -0.9933961 0.5740383 0.5507113 -0.9948493 0.6298645 0.6140266 -0.9959709 0.6830927 0.6724711 -0.9968411 0.7321956 0.7251511 -0.9975191 0.7762611 0.7716352 -0.9980488 0.8149038 0.8118921 -0.9984638 0.848144 0.8461977 -0.9987895 0.8762828 0.8750329 -0.9990456 0.8997906 0.8989921 -0.999247 0.919218 0.9187101 -0.9994057 0.9351322 0.9348102 -0.9995309 0.9480755 0.947872 -0.9996295 0.9585421 0.9584138 -0.9997074 0.9669667 0.9668859 -0.9997688 0.9737225 0.9736717 -0.9998174 0.979124 0.9790921 -0.9998557 0.9834325 0.9834126 -0.999886 0.9868628 0.9868503 -0.9999099 0.9895897 0.9895819 -0.9999288 0.9917549 0.99175 -0.9999437 0.9934725 0.9934694 -0.0000238 0.6964791 0.0645609 -0.0000382 0.6959756 0.0640574 -0.0000611 0.6953434 0.0634252 -0.0000978 0.6945513 0.0626331 -0.0001565 0.6935614 0.0616432 -0.0002504 0.6923288 0.0604106 -0.0004008 0.6908009 0.0588827 -0.0006416 0.6889184 0.0570002 -0.0010268 0.6866175 0.0546993 -0.0016435 0.6838358 0.0519176 -0.0026305 0.6805235 0.0486053 -0.0042103 0.676664 0.0447458 -0.0067388 0.6723111 0.0403929 -0.0107859 0.6676523 0.0357341 -0.0172633 0.6631157 0.0311975 -0.0276309 0.6595491 0.0276309 -0.0452595 0.6595491 0.0276309 -0.0675619 0.6595491 0.0276309 -0.0957773 0.6595491 0.0276309 -0.1314736 0.6595491 0.0276309 -0.1766339 0.6595491 0.0276309 -0.2337676 0.6595491 0.0276309 -0.3060492 0.6595491 0.0276309 -0.3974949 0.6595491 0.0276309 -0.5131855 0.6595491 0.0276309 -0.6595491 0.6595491 0.0276309 -0.8226154 0.6428873 0.0295373 -0.8969554 0.5575493 0.0461985 -0.9326595 0.4774812 0.0756464 -0.9531823 0.4226166 0.1152388 -0.9662104 0.3943942 0.1635226 -0.9750086 0.3899778 0.2192389 -0.9812013 0.4053799 0.2809573 -0.9856879 0.4363216 0.3469645 -0.9890072 0.4785453 0.4152991 -0.9915009 0.5280096 0.4838841 -0.9933961 0.5810699 0.5507113 -0.9948493 0.6346385 0.6140266 -0.9959709 0.6862945 0.6724711 -0.9968411 0.7343191 0.7251511 -0.9975191 0.7776556 0.7716352 -0.9980488 0.8158116 0.8118921 -0.9984638 0.8487306 0.8461977 -0.9987895 0.8766596 0.8750329 -0.9990456 0.9000313 0.8989921 -0.999247 0.9193711 0.9187101 -0.9994057 0.9352292 0.9348102 -0.9995309 0.9481369 0.947872 -0.9996295 0.9585808 0.9584138 -0.9997074 0.966991 0.9668859 -0.9997688 0.9737378 0.9736717 -0.9998174 0.9791336 0.9790921 -0.9998557 0.9834386 0.9834126 -0.999886 0.9868666 0.9868503 -0.9999099 0.9895921 0.9895819 -0.9999288 0.9917564 0.99175 -0.9999437 0.9934734 0.9934694 -0.0051514 0.8407292 0.0663177 -0.0051286 0.8405071 0.0658253 -0.0051047 0.8402274 0.0652066 -0.0050826 0.8398756 0.0644309 -0.0050676 0.8394338 0.0634605 -0.0050694 0.8388802 0.0622508 -0.0051048 0.8381886 0.060749 -0.0052028 0.8373283 0.0588953 -0.0054121 0.8362644 0.0566247 -0.0058134 0.8349593 0.0538725 -0.0065402 0.8333779 0.0505853 -0.0078103 0.8314967 0.0467417 -0.0099781 0.8293233 0.0423902 -0.0136166 0.8269342 0.037714 -0.0196467 0.8245426 0.0331428 -0.0295373 0.8226154 0.0295373 -0.0466479 0.8226154 0.0295373 -0.068295 0.8226154 0.0295373 -0.0956813 0.8226154 0.0295373 -0.1303287 0.8226154 0.0295373 -0.174162 0.8226154 0.0295373 -0.229617 0.8226154 0.0295373 -0.2997746 0.8226154 0.0295373 -0.3885332 0.8226154 0.0295373 -0.5008244 0.8226154 0.0295373 -0.6428873 0.8226154 0.0295373 -0.8226154 0.8226154 0.0295373 -0.8969554 0.7073888 0.0461985 -0.9326595 0.5952297 0.0756464 -0.9531823 0.5126866 0.1152388 -0.9662104 0.4620458 0.1635226 -0.9750086 0.4400089 0.2192389 -0.9812013 0.441839 0.2809573 -0.9856879 0.4625057 0.3469645 -0.9890072 0.4970781 0.4152991 -0.9915009 0.5409396 0.4838841 -0.9933961 0.5899658 0.5507113 -0.9948493 0.6406784 0.6140266 -0.9959709 0.6903451 0.6724711 -0.9968411 0.7370055 0.7251511 -0.9975191 0.7794197 0.7716352 -0.9980488 0.8169601 0.8118921 -0.9984638 0.8494728 0.8461977 -0.9987895 0.8771362 0.8750329 -0.9990456 0.9003358 0.8989921 -0.999247 0.9195648 0.9187101 -0.9994057 0.935352 0.9348102 -0.9995309 0.9482145 0.947872 -0.9996295 0.9586297 0.9584138 -0.9997074 0.9670218 0.9668859 -0.9997688 0.9737571 0.9736717 -0.9998174 0.9791457 0.9790921 -0.9998557 0.9834462 0.9834126 -0.999886 0.9868713 0.9868503 -0.9999099 0.989595 0.9895819 -0.9999288 0.9917583 0.99175 -0.9999437 0.9934746 0.9934694 -0.0279321 0.9033413 0.0785612 -0.0278872 0.9032596 0.0781312 -0.0278347 0.9031567 0.0775909 -0.0277752 0.9030276 0.0769132 -0.0277111 0.9028657 0.0760653 -0.0276479 0.9026634 0.0750078 -0.0275966 0.9024114 0.0736944 -0.0275778 0.9020992 0.0720722 -0.0276281 0.9017148 0.0700837 -0.0278105 0.9012461 0.0676709 -0.0282324 0.900682 0.0647855 -0.0290732 0.9000167 0.0614064 -0.0306306 0.8992555 0.0575732 -0.0333932 0.8984278 0.0534444 -0.0381561 0.8976087 0.0493979 -0.0461985 0.8969554 0.0461985 -0.0604636 0.8969554 0.0461985 -0.0785108 0.8969554 0.0461985 -0.1013429 0.8969554 0.0461985 -0.1302284 0.8969554 0.0461985 -0.1667723 0.8969554 0.0461985 -0.2130052 0.8969554 0.0461985 -0.2714957 0.8969554 0.0461985 -0.3454939 0.8969554 0.0461985 -0.4391112 0.8969554 0.0461985 -0.5575493 0.8969554 0.0461985 -0.7073888 0.8969554 0.0461985 -0.8969554 0.8969554 0.0461985 -0.9326595 0.7441968 0.0756464 -0.9531823 0.6266369 0.1152388 -0.9662104 0.5476339 0.1635226 -0.9750086 0.5033048 0.2192389 -0.9812013 0.4879646 0.2809573 -0.9856879 0.4956319 0.3469645 -0.9890072 0.5205246 0.4152991 -0.9915009 0.5572977 0.4838841 -0.9933961 0.6012203 0.5507113 -0.9948493 0.6483196 0.6140266 -0.9959709 0.6954697 0.6724711 -0.9968411 0.7404042 0.7251511 -0.9975191 0.7816516 0.7716352 -0.9980488 0.8184132 0.8118921 -0.9984638 0.8504118 0.8461977 -0.9987895 0.8777392 0.8750329 -0.9990456 0.9007211 0.8989921 -0.999247 0.9198099 0.9187101 -0.9994057 0.9355073 0.9348102 -0.9995309 0.9483126 0.947872 -0.9996295 0.9586916 0.9584138 -0.9997074 0.9670608 0.9668859 -0.9997688 0.9737816 0.9736717 -0.9998174 0.9791611 0.9790921 -0.9998557 0.9834558 0.9834126 -0.999886 0.9868774 0.9868503 -0.9999099 0.9895988 0.9895819 -0.9999288 0.9917606 0.99175 -0.9999437 0.9934761 0.9934694 -0.0624569 0.9354466 0.1023506 -0.0624063 0.9354101 0.101995 -0.0623458 0.9353643 0.1015482 -0.0622749 0.9353068 0.1009878 -0.0621943 0.9352348 0.1002868 -0.0621069 0.9351449 0.0994127 -0.0620199 0.9350332 0.0983271 -0.0619473 0.9348949 0.0969867 -0.061916 0.9347252 0.095344 -0.0619734 0.9345187 0.0933514 -0.062202 0.9342712 0.0909694 -0.062742 0.9339805 0.088181 -0.0638283 0.9336494 0.0850195 -0.0658501 0.9332914 0.0816158 -0.0694453 0.9329391 0.0782816 -0.0756464 0.9326595 0.0756464 -0.0868564 0.9326595 0.0756464 -0.1010384 0.9326595 0.0756464 -0.1189805 0.9326595 0.0756464 -0.1416797 0.9326595 0.0756464 -0.170397 0.9326595 0.0756464 -0.2067281 0.9326595 0.0756464 -0.2526918 0.9326595 0.0756464 -0.3108418 0.9326595 0.0756464 -0.3844091 0.9326595 0.0756464 -0.4774812 0.9326595 0.0756464 -0.5952297 0.9326595 0.0756464 -0.7441968 0.9326595 0.0756464 -0.9326595 0.9326595 0.0756464 -0.9531823 0.7707988 0.1152388 -0.9662104 0.655914 0.1635226 -0.9750086 0.5833822 0.2192389 -0.9812013 0.5463195 0.2809573 -0.9856879 0.5375409 0.3469645 -0.9890072 0.5501874 0.4152991 -0.9915009 0.5779928 0.4838841 -0.9933961 0.6154586 0.5507113 -0.9948493 0.6579867 0.6140266 -0.9959709 0.701953 0.6724711 -0.9968411 0.744704 0.7251511 -0.9975191 0.7844752 0.7716352 -0.9980488 0.8202514 0.8118921 -0.9984638 0.8515998 0.8461977 -0.9987895 0.8785021 0.8750329 -0.9990456 0.9012084 0.8989921 -0.999247 0.9201199 0.9187101 -0.9994057 0.9357038 0.9348102 -0.9995309 0.9484368 0.947872 -0.9996295 0.9587699 0.9584138 -0.9997074 0.96711 0.9668859 -0.9997688 0.9738126 0.9736717 -0.9998174 0.9791806 0.9790921 -0.9998557 0.983468 0.9834126 -0.999886 0.986885 0.9868503 -0.9999099 0.9896036 0.9895819 -0.9999288 0.9917636 0.99175 -0.9999437 0.9934779 0.9934694 -0.1059991 0.9545467 0.1366405 -0.1059489 0.9545286 0.1363545 -0.1058883 0.9545059 0.1359951 -0.1058162 0.9544774 0.1355445 -0.1057322 0.9544418 0.1349809 -0.1056375 0.9543974 0.1342782 -0.1055364 0.9543421 0.1334058 -0.1054384 0.9542739 0.1323289 -0.1053624 0.9541902 0.1310098 -0.1053433 0.9540886 0.1294105 -0.1054431 0.9539671 0.1274998 -0.1057683 0.9538247 0.1252648 -0.1064997 0.953663 0.1227327 -0.1079385 0.9534887 0.1200092 -0.1105818 0.9533177 0.1173437 -0.1152388 0.9531823 0.1152388 -0.1238137 0.9531823 0.1152388 -0.134662 0.9531823 0.1152388 -0.1483866 0.9531823 0.1152388 -0.16575 0.9531823 0.1152388 -0.1877169 0.9531823 0.1152388 -0.2155079 0.9531823 0.1152388 -0.2506671 0.9531823 0.1152388 -0.2951481 0.9531823 0.1152388 -0.3514224 0.9531823 0.1152388 -0.4226166 0.9531823 0.1152388 -0.5126866 0.9531823 0.1152388 -0.6266369 0.9531823 0.1152388 -0.7707988 0.9531823 0.1152388 -0.9531823 0.9531823 0.1152388 -0.9662104 0.7929023 0.1635226 -0.9750086 0.6846907 0.2192389 -0.9812013 0.620146 0.2809573 -0.9856879 0.5905612 0.3469645 -0.9890072 0.5877147 0.4152991 -0.9915009 0.6041748 0.4838841 -0.9933961 0.633472 0.5507113 -0.9948493 0.6702168 0.6140266 -0.9959709 0.7101552 0.6724711 -0.9968411 0.7501439 0.7251511 -0.9975191 0.7880474 0.7716352 -0.9980488 0.822577 0.8118921 -0.9984638 0.8531027 0.8461977 -0.9987895 0.8794673 0.8750329 -0.9990456 0.901825 0.8989921 -0.999247 0.9205121 0.9187101 -0.9994057 0.9359524 0.9348102 -0.9995309 0.948594 0.947872 -0.9996295 0.958869 0.9584138 -0.9997074 0.9671724 0.9668859 -0.9997688 0.9738518 0.9736717 -0.9998174 0.9792052 0.9790921 -0.9998557 0.9834834 0.9834126 -0.999886 0.9868947 0.9868503 -0.9999099 0.9896097 0.9895819 -0.9999288 0.9917674 0.99175 -0.9999437 0.9934803 0.9934694 -0.1572498 0.9669269 0.180355 -0.1572031 0.9669173 0.1801293 -0.1571463 0.9669053 0.1798457 -0.1570779 0.9668902 0.1794901 -0.1569971 0.9668714 0.1790454 -0.156904 0.9668479 0.1784912 -0.1568008 0.9668187 0.1778032 -0.1566936 0.9667827 0.1769544 -0.1565954 0.9667385 0.1759149 -0.1565315 0.966685 0.1746553 -0.1565473 0.9666211 0.1731513 -0.1567226 0.9665463 0.1713932 -0.1571937 0.9664615 0.169403 -0.15819 0.9663702 0.1672642 -0.160092 0.9662809 0.1651729 -0.1635226 0.9662104 0.1635226 -0.1699632 0.9662104 0.1635226 -0.1781114 0.9662104 0.1635226 -0.1884199 0.9662104 0.1635226 -0.2014616 0.9662104 0.1635226 -0.2179609 0.9662104 0.1635226 -0.2388348 0.9662104 0.1635226 -0.2652429 0.9662104 0.1635226 -0.2986526 0.9662104 0.1635226 -0.3409202 0.9662104 0.1635226 -0.3943942 0.9662104 0.1635226 -0.4620458 0.9662104 0.1635226 -0.5476339 0.9662104 0.1635226 -0.655914 0.9662104 0.1635226 -0.7929023 0.9662104 0.1635226 -0.9662104 0.9662104 0.1635226 -0.9750086 0.812859 0.2192389 -0.9812013 0.7135461 0.2809573 -0.9856879 0.6576388 0.3469645 -0.9890072 0.6351916 0.4152991 -0.9915009 0.6372984 0.4838841 -0.9933961 0.6562612 0.5507113 -0.9948493 0.6856895 0.6140266 -0.9959709 0.720532 0.6724711 -0.9968411 0.7570259 0.7251511 -0.9975191 0.7925667 0.7716352 -0.9980488 0.8255193 0.8118921 -0.9984638 0.855004 0.8461977 -0.9987895 0.8806883 0.8750329 -0.9990456 0.9026051 0.8989921 -0.999247 0.9210083 0.9187101 -0.9994057 0.936267 0.9348102 -0.9995309 0.9487928 0.947872 -0.9996295 0.9589944 0.9584138 -0.9997074 0.9672513 0.9668859 -0.9997688 0.9739013 0.9736717 -0.9998174 0.9792363 0.9790921 -0.9998557 0.983503 0.9834126 -0.999886 0.9869069 0.9868503 -0.9999099 0.9896173 0.9895819 -0.9999288 0.9917722 0.99175 -0.9999437 0.9934833 0.9934694 -0.2151269 0.9754027 0.2322726 -0.2150852 0.9753975 0.2320973 -0.2150342 0.9753908 0.2318771 -0.2149725 0.9753825 0.231601 -0.2148987 0.9753721 0.2312557 -0.2148124 0.9753591 0.2308255 -0.2147144 0.975343 0.2302916 -0.2146085 0.9753231 0.229633 -0.2145034 0.9752987 0.2288268 -0.2144168 0.9752692 0.2278503 -0.2143816 0.975234 0.2266849 -0.2144566 0.9751928 0.2253234 -0.2147432 0.9751462 0.2237832 -0.2154135 0.9750962 0.2221293 -0.2167545 0.9750472 0.2205133 -0.2192389 0.9750086 0.2192389 -0.224002 0.9750086 0.2192389 -0.2300279 0.9750086 0.2192389 -0.2376515 0.9750086 0.2192389 -0.2472963 0.9750086 0.2192389 -0.2594983 0.9750086 0.2192389 -0.2749353 0.9750086 0.2192389 -0.2944652 0.9750086 0.2192389 -0.319173 0.9750086 0.2192389 -0.3504316 0.9750086 0.2192389 -0.3899778 0.9750086 0.2192389 -0.4400089 0.9750086 0.2192389 -0.5033048 0.9750086 0.2192389 -0.5833822 0.9750086 0.2192389 -0.6846907 0.9750086 0.2192389 -0.812859 0.9750086 0.2192389 -0.9750086 0.9750086 0.2192389 -0.9812013 0.8317093 0.2809573 -0.9856879 0.7425006 0.3469645 -0.9890072 0.6952561 0.4152991 -0.9915009 0.6792041 0.4838841 -0.9933961 0.6850926 0.5507113 -0.9948493 0.7052645 0.6140266 -0.9959709 0.7336601 0.6724711 -0.9968411 0.7657327 0.7251511 -0.9975191 0.7982843 0.7716352 -0.9980488 0.8292416 0.8118921 -0.9984638 0.8574095 0.8461977 -0.9987895 0.8822331 0.8750329 -0.9990456 0.903592 0.8989921 -0.999247 0.9216361 0.9187101 -0.9994057 0.9366649 0.9348102 -0.9995309 0.9490443 0.947872 -0.9996295 0.959153 0.9584138 -0.9997074 0.9673511 0.9668859 -0.9997688 0.9739641 0.9736717 -0.9998174 0.9792757 0.9790921 -0.9998557 0.9835276 0.9834126 -0.999886 0.9869224 0.9868503 -0.9999099 0.989627 0.9895819 -0.9999288 0.9917783 0.99175 -0.9999437 0.9934871 0.9934694 -0.2783684 0.9814251 0.2908992 -0.2783325 0.9814221 0.2907651 -0.2782884 0.9814183 0.2905967 -0.2782347 0.9814136 0.2903857 -0.2781701 0.9814076 0.2901217 -0.2780936 0.9814002 0.2897929 -0.2780055 0.9813911 0.2893849 -0.2779077 0.9813797 0.2888817 -0.2778058 0.9813659 0.2882659 -0.2777122 0.9813491 0.2875203 -0.2776503 0.9813291 0.2866309 -0.2776626 0.9813057 0.2855923 -0.2778236 0.9812792 0.284418 -0.2782606 0.9812508 0.2831577 -0.2791873 0.9812231 0.2819272 -0.2809573 0.9812013 0.2809573 -0.2844283 0.9812013 0.2809573 -0.2888196 0.9812013 0.2809573 -0.2943751 0.9812013 0.2809573 -0.3014036 0.9812013 0.2809573 -0.3102955 0.9812013 0.2809573 -0.321545 0.9812013 0.2809573 -0.335777 0.9812013 0.2809573 -0.3537823 0.9812013 0.2809573 -0.3765614 0.9812013 0.2809573 -0.4053799 0.9812013 0.2809573 -0.441839 0.9812013 0.2809573 -0.4879646 0.9812013 0.2809573 -0.5463195 0.9812013 0.2809573 -0.620146 0.9812013 0.2809573 -0.7135461 0.9812013 0.2809573 -0.8317093 0.9812013 0.2809573 -0.9812013 0.9812013 0.2809573 -0.9856879 0.8498619 0.3469645 -0.9890072 0.7712455 0.4152991 -0.9915009 0.7322203 0.4838841 -0.9933961 0.721568 0.5507113 -0.9948493 0.7300295 0.6140266 -0.9959709 0.7502687 0.6724711 -0.9968411 0.7767478 0.7251511 -0.9975191 0.8055177 0.7716352 -0.9980488 0.8339508 0.8118921 -0.9984638 0.8604527 0.8461977 -0.9987895 0.8841875 0.8750329 -0.9990456 0.9048406 0.8989921 -0.999247 0.9224303 0.9187101 -0.9994057 0.9371683 0.9348102 -0.9995309 0.9493625 0.947872 -0.9996295 0.9593536 0.9584138 -0.9997074 0.9674774 0.9668859 -0.9997688 0.9740434 0.9736717 -0.9998174 0.9793255 0.9790921 -0.9998557 0.9835589 0.9834126 -0.999886 0.986942 0.9868503 -0.9999099 0.9896393 0.9895819 -0.9999288 0.9917859 0.99175 -0.9999437 0.9934919 0.9934694 -0.3454107 0.9858181 0.3544318 -0.3453807 0.9858163 0.3543309 -0.3453439 0.9858141 0.3542041 -0.3452987 0.9858113 0.3540453 -0.3452442 0.9858079 0.3538467 -0.3451791 0.9858036 0.3535993 -0.3451032 0.9857982 0.3532924 -0.3450175 0.9857916 0.352914 -0.3449254 0.9857835 0.352451 -0.3448353 0.9857738 0.3518905 -0.3447636 0.9857621 0.3512221 -0.3447407 0.9857485 0.350442 -0.3448204 0.9857332 0.3495603 -0.3450957 0.9857167 0.3486146 -0.3457234 0.9857006 0.3476916 -0.3469645 0.9856879 0.3469645 -0.3494573 0.9856879 0.3469645 -0.352611 0.9856879 0.3469645 -0.3566008 0.9856879 0.3469645 -0.3616485 0.9856879 0.3469645 -0.3680344 0.9856879 0.3469645 -0.3761135 0.9856879 0.3469645 -0.3863346 0.9856879 0.3469645 -0.3992655 0.9856879 0.3469645 -0.4156249 0.9856879 0.3469645 -0.4363216 0.9856879 0.3469645 -0.4625057 0.9856879 0.3469645 -0.4956319 0.9856879 0.3469645 -0.5375409 0.9856879 0.3469645 -0.5905612 0.9856879 0.3469645 -0.6576388 0.9856879 0.3469645 -0.7425006 0.9856879 0.3469645 -0.8498619 0.9856879 0.3469645 -0.9856879 0.9856879 0.3469645 -0.9890072 0.867382 0.4152991 -0.9915009 0.7992927 0.4838841 -0.9933961 0.7677141 0.5507113 -0.9948493 0.7613603 0.6140266 -0.9959709 0.7712809 0.6724711 -0.9968411 0.7906834 0.7251511 -0.9975191 0.8146689 0.7716352 -0.9980488 0.8399085 0.8118921 -0.9984638 0.8643028 0.8461977 -0.9987895 0.88666 0.8750329 -0.9990456 0.9064202 0.8989921 -0.999247 0.9234351 0.9187101 -0.9994057 0.9378052 0.9348102 -0.9995309 0.949765 0.947872 -0.9996295 0.9596074 0.9584138 -0.9997074 0.9676372 0.9668859 -0.9997688 0.9741438 0.9736717 -0.9998174 0.9793885 0.9790921 -0.9998557 0.9835984 0.9834126 -0.999886 0.9869667 0.9868503 -0.9999099 0.9896548 0.9895819 -0.9999288 0.9917956 0.99175 -0.9999437 0.993498 0.9934694 -0.4144197 0.9890841 0.4208177 -0.4143955 0.9890831 0.420743 -0.4143657 0.9890818 0.4206492 -0.414329 0.9890801 0.4205316 -0.4142845 0.9890781 0.4203847 -0.4142311 0.9890755 0.4202016 -0.4141683 0.9890723 0.4199745 -0.4140964 0.9890684 0.4196945 -0.4140176 0.9890637 0.419352 -0.4139373 0.9890579 0.4189375 -0.4138668 0.989051 0.4184434 -0.4138277 0.989043 0.4178668 -0.4138582 0.9890339 0.4172154 -0.4140252 0.9890241 0.416517 -0.4144423 0.9890146 0.4158356 -0.4152991 0.9890072 0.4152991 -0.4170635 0.9890072 0.4152991 -0.4192956 0.9890072 0.4152991 -0.4221196 0.9890072 0.4152991 -0.4256923 0.9890072 0.4152991 -0.4302122 0.9890072 0.4152991 -0.4359305 0.9890072 0.4152991 -0.4431649 0.9890072 0.4152991 -0.4523173 0.9890072 0.4152991 -0.4638963 0.9890072 0.4152991 -0.4785453 0.9890072 0.4152991 -0.4970781 0.9890072 0.4152991 -0.5205246 0.9890072 0.4152991 -0.5501874 0.9890072 0.4152991 -0.5877147 0.9890072 0.4152991 -0.6351916 0.9890072 0.4152991 -0.6952561 0.9890072 0.4152991 -0.7712455 0.9890072 0.4152991 -0.867382 0.9890072 0.4152991 -0.9890072 0.9890072 0.4152991 -0.9915009 0.8841479 0.4838841 -0.9933961 0.826095 0.5507113 -0.9948493 0.8009979 0.6140266 -0.9959709 0.797864 0.6724711 -0.9968411 0.8083138 0.7251511 -0.9975191 0.8262464 0.7716352 -0.9980488 0.8474458 0.8118921 -0.9984638 0.8691736 0.8461977 -0.9987895 0.8897881 0.8750329 -0.9990456 0.9084185 0.8989921 -0.999247 0.9247063 0.9187101 -0.9994057 0.938611 0.9348102 -0.9995309 0.9502743 0.947872 -0.9996295 0.9599286 0.9584138 -0.9997074 0.9678393 0.9668859 -0.9997688 0.9742709 0.9736717 -0.9998174 0.9794682 0.9790921 -0.9998557 0.9836484 0.9834126 -0.999886 0.986998 0.9868503 -0.9999099 0.9896744 0.9895819 -0.9999288 0.9918079 0.99175 -0.9999437 0.9935057 0.9934694 -0.4834235 0.9915469 0.4878948 -0.4834045 0.9915463 0.4878404 -0.4833811 0.9915455 0.4877721 -0.4833522 0.9915446 0.4876866 -0.4833171 0.9915433 0.4875796 -0.4832747 0.9915418 0.4874464 -0.4832246 0.9915399 0.4872812 -0.4831666 0.9915376 0.4870776 -0.4831021 0.9915347 0.4868285 -0.4830346 0.9915312 0.4865271 -0.4829718 0.9915271 0.4861679 -0.4829286 0.9915223 0.4857488 -0.4829319 0.9915169 0.4852755 -0.4830292 0.991511 0.4847683 -0.4833013 0.9915054 0.4842735 -0.4838841 0.9915009 0.4838841 -0.4851151 0.9915009 0.4838841 -0.4866724 0.9915009 0.4838841 -0.4886426 0.9915009 0.4838841 -0.4911352 0.9915009 0.4838841 -0.4942887 0.9915009 0.4838841 -0.4982782 0.9915009 0.4838841 -0.5033255 0.9915009 0.4838841 -0.5097109 0.9915009 0.4838841 -0.5177893 0.9915009 0.4838841 -0.5280096 0.9915009 0.4838841 -0.5409396 0.9915009 0.4838841 -0.5572977 0.9915009 0.4838841 -0.5779928 0.9915009 0.4838841 -0.6041748 0.9915009 0.4838841 -0.6372984 0.9915009 0.4838841 -0.6792041 0.9915009 0.4838841 -0.7322203 0.9915009 0.4838841 -0.7992927 0.9915009 0.4838841 -0.8841479 0.9915009 0.4838841 -0.9915009 0.9915009 0.4838841 -0.9933961 0.8999544 0.5507113 -0.9948493 0.8511446 0.6140266 -0.9959709 0.831495 0.6724711 -0.9968411 0.8306185 0.7251511 -0.9975191 0.8408934 0.7716352 -0.9980488 0.8569815 0.8118921 -0.9984638 0.8753359 0.8461977 -0.9987895 0.8937455 0.8750329 -0.9990456 0.9109467 0.8989921 -0.999247 0.9263145 0.9187101 -0.9994057 0.9396303 0.9348102 -0.9995309 0.9509185 0.947872 -0.9996295 0.9603348 0.9584138 -0.9997074 0.968095 0.9668859 -0.9997688 0.9744315 0.9736717 -0.9998174 0.9795691 0.9790921 -0.9998557 0.9837117 0.9834126 -0.999886 0.9870377 0.9868503 -0.9999099 0.9896992 0.9895819 -0.9999288 0.9918235 0.99175 -0.9999437 0.9935154 0.9934694 -0.5504963 0.993424 0.5535769 -0.5504818 0.9934236 0.553538 -0.550464 0.9934231 0.5534892 -0.5504419 0.9934225 0.553428 -0.550415 0.9934218 0.5533515 -0.5503825 0.9934209 0.5532562 -0.5503438 0.9934197 0.5531381 -0.5502987 0.9934183 0.5529925 -0.550248 0.9934166 0.5528144 -0.5501939 0.9934145 0.552599 -0.5501416 0.993412 0.5523423 -0.5501012 0.9934091 0.5520428 -0.5500915 0.9934058 0.5517048 -0.5501456 0.9934023 0.5513425 -0.5503203 0.9933988 0.5509893 -0.5507113 0.9933961 0.5507113 -0.5515582 0.9933961 0.5507113 -0.5526297 0.9933961 0.5507113 -0.5539852 0.9933961 0.5507113 -0.5557001 0.9933961 0.5507113 -0.5578697 0.9933961 0.5507113 -0.5606145 0.9933961 0.5507113 -0.5640871 0.9933961 0.5507113 -0.5684803 0.9933961 0.5507113 -0.5740383 0.9933961 0.5507113 -0.5810699 0.9933961 0.5507113 -0.5899658 0.9933961 0.5507113 -0.6012203 0.9933961 0.5507113 -0.6154586 0.9933961 0.5507113 -0.633472 0.9933961 0.5507113 -0.6562612 0.9933961 0.5507113 -0.6850926 0.9933961 0.5507113 -0.721568 0.9933961 0.5507113 -0.7677141 0.9933961 0.5507113 -0.826095 0.9933961 0.5507113 -0.8999544 0.9933961 0.5507113 -0.9933961 0.9933961 0.5507113 -0.9948493 0.9145867 0.6140266 -0.9959709 0.8740427 0.6724711 -0.9968411 0.8588368 0.7251511 -0.9975191 0.8594238 0.7716352 -0.9980488 0.8690454 0.8118921 -0.9984638 0.883132 0.8461977 -0.9987895 0.8987521 0.8750329 -0.9990456 0.9141453 0.8989921 -0.999247 0.9283491 0.9187101 -0.9994057 0.94092 0.9348102 -0.9995309 0.9517337 0.947872 -0.9996295 0.9608488 0.9584138 -0.9997074 0.9684185 0.9668859 -0.9997688 0.9746348 0.9736717 -0.9998174 0.9796967 0.9790921 -0.9998557 0.9837917 0.9834126 -0.999886 0.9870878 0.9868503 -0.9999099 0.9897306 0.9895819 -0.9999288 0.9918431 0.99175 -0.9999437 0.9935277 0.9934694 -0.6139459 0.9948662 0.6160399 -0.6139352 0.994866 0.6160126 -0.6139219 0.9948657 0.6159782 -0.6139056 0.9948653 0.6159352 -0.6138855 0.9948649 0.6158814 -0.6138613 0.9948643 0.6158144 -0.6138323 0.9948636 0.6157314 -0.6137984 0.9948628 0.615629 -0.6137599 0.9948617 0.6155039 -0.6137183 0.9948604 0.6153525 -0.6136769 0.9948589 0.615172 -0.6136427 0.9948571 0.6149617 -0.6136284 0.9948551 0.6147242 -0.6136569 0.994853 0.6144698 -0.6137675 0.9948509 0.6142218 -0.6140266 0.9948493 0.6140266 -0.6146016 0.9948493 0.6140266 -0.6153291 0.9948493 0.6140266 -0.6162494 0.9948493 0.6140266 -0.6174138 0.9948493 0.6140266 -0.6188868 0.9948493 0.6140266 -0.6207504 0.9948493 0.6140266 -0.6231081 0.9948493 0.6140266 -0.6260909 0.9948493 0.6140266 -0.6298645 0.9948493 0.6140266 -0.6346385 0.9948493 0.6140266 -0.6406784 0.9948493 0.6140266 -0.6483196 0.9948493 0.6140266 -0.6579867 0.9948493 0.6140266 -0.6702168 0.9948493 0.6140266 -0.6856895 0.9948493 0.6140266 -0.7052645 0.9948493 0.6140266 -0.7300295 0.9948493 0.6140266 -0.7613603 0.9948493 0.6140266 -0.8009979 0.9948493 0.6140266 -0.8511446 0.9948493 0.6140266 -0.9145867 0.9948493 0.6140266 -0.9948493 0.9948493 0.6140266 -0.9959709 0.927871 0.6724711 -0.9968411 0.8945366 0.7251511 -0.9975191 0.8828672 0.7716352 -0.9980488 0.8843078 0.8118921 -0.9984638 0.892995 0.8461977 -0.9987895 0.9050862 0.8750329 -0.9990456 0.9181918 0.8989921 -0.999247 0.9309231 0.9187101 -0.9994057 0.9425516 0.9348102 -0.9995309 0.9527649 0.947872 -0.9996295 0.9614991 0.9584138 -0.9997074 0.9688277 0.9668859 -0.9997688 0.9748921 0.9736717 -0.9998174 0.9798581 0.9790921 -0.9998557 0.9838929 0.9834126 -0.999886 0.9871513 0.9868503 -0.9999099 0.9897704 0.9895819 -0.9999288 0.991868 0.99175 -0.9999437 0.9935432 0.9934694 -0.6724572 0.9959813 0.6738629 -0.6724495 0.9959811 0.673844 -0.6724399 0.9959809 0.6738202 -0.672428 0.9959807 0.6737905 -0.6724135 0.9959804 0.6737533 -0.6723959 0.9959801 0.6737069 -0.6723748 0.9959797 0.6736495 -0.67235 0.9959791 0.6735787 -0.6723217 0.9959785 0.6734921 -0.6722907 0.9959777 0.6733874 -0.6722594 0.9959768 0.6732627 -0.6722322 0.9959757 0.6731172 -0.672218 0.9959745 0.6729531 -0.672232 0.9959732 0.6727772 -0.6723012 0.9959719 0.6726059 -0.6724711 0.9959709 0.6724711 -0.6728567 0.9959709 0.6724711 -0.6733446 0.9959709 0.6724711 -0.6739618 0.9959709 0.6724711 -0.6747426 0.9959709 0.6724711 -0.6757305 0.9959709 0.6724711 -0.6769804 0.9959709 0.6724711 -0.6785616 0.9959709 0.6724711 -0.680562 0.9959709 0.6724711 -0.6830927 0.9959709 0.6724711 -0.6862945 0.9959709 0.6724711 -0.6903451 0.9959709 0.6724711 -0.6954697 0.9959709 0.6724711 -0.701953 0.9959709 0.6724711 -0.7101552 0.9959709 0.6724711 -0.720532 0.9959709 0.6724711 -0.7336601 0.9959709 0.6724711 -0.7502687 0.9959709 0.6724711 -0.7712809 0.9959709 0.6724711 -0.797864 0.9959709 0.6724711 -0.831495 0.9959709 0.6724711 -0.8740427 0.9959709 0.6724711 -0.927871 0.9959709 0.6724711 -0.9959709 0.9959709 0.6724711 -0.9968411 0.9397016 0.7251511 -0.9975191 0.912526 0.7716352 -0.9980488 0.9036168 0.8118921 -0.9984638 0.905473 0.8461977 -0.9987895 0.9130996 0.8750329 -0.9990456 0.9233112 0.8989921 -0.999247 0.9341796 0.9187101 -0.9994057 0.9446157 0.9348102 -0.9995309 0.9540695 0.947872 -0.9996295 0.9623217 0.9584138 -0.9997074 0.9693455 0.9668859 -0.9997688 0.9752174 0.9736717 -0.9998174 0.9800624 0.9790921 -0.9998557 0.984021 0.9834126 -0.999886 0.9872315 0.9868503 -0.9999099 0.9898206 0.9895819 -0.9999288 0.9918994 0.99175 -0.9999437 0.9935629 0.9934694 -0.7251659 0.9968475 0.726099 -0.7251605 0.9968474 0.7260861 -0.7251537 0.9968473 0.7260699 -0.7251454 0.9968472 0.7260496 -0.7251351 0.996847 0.7260243 -0.7251226 0.9968468 0.7259927 -0.7251076 0.9968465 0.7259536 -0.7250899 0.9968462 0.7259053 -0.7250697 0.9968458 0.7258464 -0.7250473 0.9968453 0.725775 -0.7250244 0.9968448 0.7256901 -0.7250039 0.9968441 0.725591 -0.7249916 0.9968433 0.7254792 -0.7249978 0.9968425 0.7253595 -0.7250408 0.9968418 0.7252429 -0.7251511 0.9968411 0.7251511 -0.7254069 0.9968411 0.7251511 -0.7257304 0.9968411 0.7251511 -0.7261398 0.9968411 0.7251511 -0.7266577 0.9968411 0.7251511 -0.7273129 0.9968411 0.7251511 -0.7281418 0.9968411 0.7251511 -0.7291904 0.9968411 0.7251511 -0.7305171 0.9968411 0.7251511 -0.7321956 0.9968411 0.7251511 -0.7343191 0.9968411 0.7251511 -0.7370055 0.9968411 0.7251511 -0.7404042 0.9968411 0.7251511 -0.744704 0.9968411 0.7251511 -0.7501439 0.9968411 0.7251511 -0.7570259 0.9968411 0.7251511 -0.7657327 0.9968411 0.7251511 -0.7767478 0.9968411 0.7251511 -0.7906834 0.9968411 0.7251511 -0.8083138 0.9968411 0.7251511 -0.8306185 0.9968411 0.7251511 -0.8588368 0.9968411 0.7251511 -0.8945366 0.9968411 0.7251511 -0.9397016 0.9968411 0.7251511 -0.9968411 0.9968411 0.7251511 -0.9975191 0.9500484 0.7716352 -0.9980488 0.9280451 0.8118921 -0.9984638 0.9212593 0.8461977 -0.9987895 0.9232376 0.8750329 -0.9990456 0.9297879 0.8989921 -0.999247 0.9382994 0.9187101 -0.9994057 0.9472271 0.9348102 -0.9995309 0.95572 0.947872 -0.9996295 0.9633625 0.9584138 -0.9997074 0.9700006 0.9668859 -0.9997688 0.9756291 0.9736717 -0.9998174 0.9803208 0.9790921 -0.9998557 0.984183 0.9834126 -0.999886 0.9873331 0.9868503 -0.9999099 0.9898842 0.9895819 -0.9999288 0.9919392 0.99175 -0.9999437 0.9935878 0.9934694 -0.7716588 0.997523 0.772272 -0.7716551 0.997523 0.7722633 -0.7716504 0.9975229 0.7722524 -0.7716446 0.9975228 0.7722388 -0.7716375 0.9975227 0.7722218 -0.7716288 0.9975226 0.7722005 -0.7716184 0.9975224 0.7721742 -0.7716061 0.9975222 0.7721418 -0.7715919 0.997522 0.7721022 -0.7715762 0.9975217 0.7720543 -0.7715599 0.9975213 0.7719972 -0.7715449 0.9975209 0.7719306 -0.7715352 0.9975204 0.7718555 -0.7715376 0.9975199 0.7717751 -0.7715641 0.9975194 0.7716968 -0.7716352 0.9975191 0.7716352 -0.7718031 0.9975191 0.7716352 -0.7720156 0.9975191 0.7716352 -0.7722844 0.9975191 0.7716352 -0.7726245 0.9975191 0.7716352 -0.7730548 0.9975191 0.7716352 -0.7735991 0.9975191 0.7716352 -0.7742877 0.9975191 0.7716352 -0.7751589 0.9975191 0.7716352 -0.7762611 0.9975191 0.7716352 -0.7776556 0.9975191 0.7716352 -0.7794197 0.9975191 0.7716352 -0.7816516 0.9975191 0.7716352 -0.7844752 0.9975191 0.7716352 -0.7880474 0.9975191 0.7716352 -0.7925667 0.9975191 0.7716352 -0.7982843 0.9975191 0.7716352 -0.8055177 0.9975191 0.7716352 -0.8146689 0.9975191 0.7716352 -0.8262464 0.9975191 0.7716352 -0.8408934 0.9975191 0.7716352 -0.8594238 0.9975191 0.7716352 -0.8828672 0.9975191 0.7716352 -0.912526 0.9975191 0.7716352 -0.9500484 0.9975191 0.7716352 -0.9975191 0.9975191 0.7716352 -0.9980488 0.95895 0.8118921 -0.9984638 0.9412311 0.8461977 -0.9987895 0.9360634 0.8750329 -0.9990456 0.9379818 0.8989921 -0.999247 0.9435116 0.9187101 -0.9994057 0.9505309 0.9348102 -0.9995309 0.9578081 0.947872 -0.9996295 0.9646792 0.9584138 -0.9997074 0.9708293 0.9668859 -0.9997688 0.9761499 0.9736717 -0.9998174 0.9806477 0.9790921 -0.9998557 0.984388 0.9834126 -0.999886 0.9874615 0.9868503 -0.9999099 0.9899646 0.9895819 -0.9999288 0.9919896 0.99175 -0.9999437 0.9936193 0.9934694 -0.8119154 0.9980513 0.8123148 -0.8119128 0.9980512 0.812309 -0.8119096 0.9980512 0.8123018 -0.8119057 0.9980511 0.8122927 -0.8119009 0.9980511 0.8122814 -0.8118949 0.998051 0.8122673 -0.8118878 0.9980509 0.8122499 -0.8118794 0.9980508 0.8122284 -0.8118697 0.9980506 0.8122021 -0.8118589 0.9980504 0.8121702 -0.8118476 0.9980502 0.8121323 -0.811837 0.99805 0.8120882 -0.8118298 0.9980497 0.8120384 -0.8118303 0.9980494 0.811985 -0.8118466 0.9980491 0.811933 -0.8118921 0.9980488 0.8118921 -0.8120015 0.9980488 0.8118921 -0.8121398 0.9980488 0.8118921 -0.8123148 0.9980488 0.8118921 -0.8125362 0.9980488 0.8118921 -0.8128163 0.9980488 0.8118921 -0.8131707 0.9980488 0.8118921 -0.813619 0.9980488 0.8118921 -0.8141862 0.9980488 0.8118921 -0.8149038 0.9980488 0.8118921 -0.8158116 0.9980488 0.8118921 -0.8169601 0.9980488 0.8118921 -0.8184132 0.9980488 0.8118921 -0.8202514 0.9980488 0.8118921 -0.822577 0.9980488 0.8118921 -0.8255193 0.9980488 0.8118921 -0.8292416 0.9980488 0.8118921 -0.8339508 0.9980488 0.8118921 -0.8399085 0.9980488 0.8118921 -0.8474458 0.9980488 0.8118921 -0.8569815 0.9980488 0.8118921 -0.8690454 0.9980488 0.8118921 -0.8843078 0.9980488 0.8118921 -0.9036168 0.9980488 0.8118921 -0.9280451 0.9980488 0.8118921 -0.95895 0.9980488 0.8118921 -0.9980488 0.9980488 0.8118921 -0.9984638 0.966498 0.8461977 -0.9987895 0.9522898 0.8750329 -0.9990456 0.9483481 0.8989921 -0.999247 0.9501056 0.9187101 -0.9994057 0.9547106 0.9348102 -0.9995309 0.9604499 0.947872 -0.9996295 0.966345 0.9584138 -0.9997074 0.9718777 0.9668859 -0.9997688 0.9768088 0.9736717 -0.9998174 0.9810613 0.9790921 -0.9998557 0.9846474 0.9834126 -0.999886 0.987624 0.9868503 -0.9999099 0.9900664 0.9895819 -0.9999288 0.9920533 0.99175 -0.9999437 0.9936592 0.9934694 -0.8462171 0.9984653 0.8464753 -0.8462154 0.9984653 0.8464715 -0.8462132 0.9984653 0.8464668 -0.8462106 0.9984653 0.8464608 -0.8462073 0.9984652 0.8464534 -0.8462034 0.9984652 0.8464441 -0.8461986 0.9984651 0.8464327 -0.8461929 0.998465 0.8464185 -0.8461864 0.9984649 0.8464012 -0.8461791 0.9984648 0.8463803 -0.8461714 0.9984647 0.8463555 -0.8461641 0.9984645 0.8463265 -0.8461589 0.9984643 0.8462937 -0.8461587 0.9984642 0.8462587 -0.8461687 0.998464 0.8462246 -0.8461977 0.9984638 0.8461977 -0.8462684 0.9984638 0.8461977 -0.8463578 0.9984638 0.8461977 -0.8464709 0.9984638 0.8461977 -0.846614 0.9984638 0.8461977 -0.846795 0.9984638 0.8461977 -0.847024 0.9984638 0.8461977 -0.8473137 0.9984638 0.8461977 -0.8476802 0.9984638 0.8461977 -0.848144 0.9984638 0.8461977 -0.8487306 0.9984638 0.8461977 -0.8494728 0.9984638 0.8461977 -0.8504118 0.9984638 0.8461977 -0.8515998 0.9984638 0.8461977 -0.8531027 0.9984638 0.8461977 -0.855004 0.9984638 0.8461977 -0.8574095 0.9984638 0.8461977 -0.8604527 0.9984638 0.8461977 -0.8643028 0.9984638 0.8461977 -0.8691736 0.9984638 0.8461977 -0.8753359 0.9984638 0.8461977 -0.883132 0.9984638 0.8461977 -0.892995 0.9984638 0.8461977 -0.905473 0.9984638 0.8461977 -0.9212593 0.9984638 0.8461977 -0.9412311 0.9984638 0.8461977 -0.966498 0.9984638 0.8461977 -0.9984638 0.9984638 0.8461977 -0.9987895 0.9728183 0.8750329 -0.9990456 0.9614628 0.8989921 -0.999247 0.958448 0.9187101 -0.9994057 0.9599985 0.9348102 -0.9995309 0.963792 0.947872 -0.9996295 0.9684525 0.9584138 -0.9997074 0.9732042 0.9668859 -0.9997688 0.9776424 0.9736717 -0.9998174 0.9815845 0.9790921 -0.9998557 0.9849755 0.9834126 -0.999886 0.9878296 0.9868503 -0.9999099 0.9901952 0.9895819 -0.9999288 0.9921339 0.99175 -0.9999437 0.9937096 0.9934694 -0.8750477 0.9987905 0.8752136 -0.8750466 0.9987905 0.8752111 -0.8750451 0.9987904 0.875208 -0.8750434 0.9987904 0.8752041 -0.8750412 0.9987904 0.8751993 -0.8750386 0.9987904 0.8751933 -0.8750355 0.9987903 0.8751858 -0.8750317 0.9987903 0.8751766 -0.8750274 0.9987902 0.8751654 -0.8750225 0.9987902 0.8751518 -0.8750173 0.9987901 0.8751356 -0.8750124 0.99879 0.8751167 -0.8750088 0.9987899 0.8750954 -0.8750084 0.9987897 0.8750726 -0.8750145 0.9987896 0.8750504 -0.8750329 0.9987895 0.8750329 -0.8750783 0.9987895 0.8750329 -0.8751357 0.9987895 0.8750329 -0.8752084 0.9987895 0.8750329 -0.8753002 0.9987895 0.8750329 -0.8754165 0.9987895 0.8750329 -0.8755636 0.9987895 0.8750329 -0.8757496 0.9987895 0.8750329 -0.875985 0.9987895 0.8750329 -0.8762828 0.9987895 0.8750329 -0.8766596 0.9987895 0.8750329 -0.8771362 0.9987895 0.8750329 -0.8777392 0.9987895 0.8750329 -0.8785021 0.9987895 0.8750329 -0.8794673 0.9987895 0.8750329 -0.8806883 0.9987895 0.8750329 -0.8822331 0.9987895 0.8750329 -0.8841875 0.9987895 0.8750329 -0.88666 0.9987895 0.8750329 -0.8897881 0.9987895 0.8750329 -0.8937455 0.9987895 0.8750329 -0.8987521 0.9987895 0.8750329 -0.9050862 0.9987895 0.8750329 -0.9130996 0.9987895 0.8750329 -0.9232376 0.9987895 0.8750329 -0.9360634 0.9987895 0.8750329 -0.9522898 0.9987895 0.8750329 -0.9728183 0.9987895 0.8750329 -0.9987895 0.9987895 0.8750329 -0.9990456 0.9780547 0.8989921 -0.999247 0.9690022 0.9187101 -0.9994057 0.9666884 0.9348102 -0.9995309 0.9680203 0.947872 -0.9996295 0.9711187 0.9584138 -0.9997074 0.9748823 0.9668859 -0.9997688 0.978697 0.9736717 -0.9998174 0.9822465 0.9790921 -0.9998557 0.9853906 0.9834126 -0.999886 0.9880897 0.9868503 -0.9999099 0.9903581 0.9895819 -0.9999288 0.9922358 0.99175 -0.9999437 0.9937734 0.9934694 -0.8990028 0.9990461 0.8991088 -0.899002 0.9990461 0.8991072 -0.8990011 0.9990461 0.8991052 -0.899 0.9990461 0.8991027 -0.8989986 0.9990461 0.8990996 -0.8989969 0.9990461 0.8990957 -0.8989948 0.9990461 0.8990909 -0.8989923 0.999046 0.8990849 -0.8989895 0.999046 0.8990777 -0.8989863 0.9990459 0.8990689 -0.8989829 0.9990459 0.8990584 -0.8989796 0.9990458 0.8990462 -0.8989771 0.9990458 0.8990325 -0.8989767 0.9990457 0.8990177 -0.8989805 0.9990456 0.8990034 -0.8989921 0.9990456 0.8989921 -0.8990211 0.9990456 0.8989921 -0.8990578 0.9990456 0.8989921 -0.8991042 0.9990456 0.8989921 -0.8991629 0.9990456 0.8989921 -0.8992372 0.9990456 0.8989921 -0.8993311 0.9990456 0.8989921 -0.89945 0.9990456 0.8989921 -0.8996004 0.9990456 0.8989921 -0.8997906 0.9990456 0.8989921 -0.9000313 0.9990456 0.8989921 -0.9003358 0.9990456 0.8989921 -0.9007211 0.9990456 0.8989921 -0.9012084 0.9990456 0.8989921 -0.901825 0.9990456 0.8989921 -0.9026051 0.9990456 0.8989921 -0.903592 0.9990456 0.8989921 -0.9048406 0.9990456 0.8989921 -0.9064202 0.9990456 0.8989921 -0.9084185 0.9990456 0.8989921 -0.9109467 0.9990456 0.8989921 -0.9141453 0.9990456 0.8989921 -0.9181918 0.9990456 0.8989921 -0.9233112 0.9990456 0.8989921 -0.9297879 0.9990456 0.8989921 -0.9379818 0.9990456 0.8989921 -0.9483481 0.9990456 0.8989921 -0.9614628 0.9990456 0.8989921 -0.9780547 0.9990456 0.8989921 -0.9990456 0.9990456 0.8989921 -0.999247 0.9823545 0.9187101 -0.9994057 0.9751519 0.9348102 -0.9995309 0.9733696 0.947872 -0.9996295 0.9744918 0.9584138 -0.9997074 0.9770053 0.9668859 -0.9997688 0.9800312 0.9736717 -0.9998174 0.9830839 0.9790921 -0.9998557 0.9859158 0.9834126 -0.999886 0.9884188 0.9868503 -0.9999099 0.9905641 0.9895819 -0.9999288 0.9923648 0.99175 -0.9999437 0.9938541 0.9934694 -0.9187175 0.9992474 0.9187849 -0.918717 0.9992474 0.9187839 -0.9187164 0.9992474 0.9187826 -0.9187157 0.9992474 0.918781 -0.9187148 0.9992474 0.918779 -0.9187137 0.9992474 0.9187765 -0.9187123 0.9992473 0.9187734 -0.9187107 0.9992473 0.9187696 -0.9187089 0.9992473 0.918765 -0.9187068 0.9992473 0.9187593 -0.9187045 0.9992472 0.9187526 -0.9187024 0.9992472 0.9187448 -0.9187008 0.9992472 0.918736 -0.9187004 0.9992471 0.9187265 -0.9187027 0.9992471 0.9187173 -0.9187101 0.999247 0.9187101 -0.9187285 0.999247 0.9187101 -0.9187518 0.999247 0.9187101 -0.9187814 0.999247 0.9187101 -0.9188187 0.999247 0.9187101 -0.9188659 0.999247 0.9187101 -0.9189257 0.999247 0.9187101 -0.9190013 0.999247 0.9187101 -0.919097 0.999247 0.9187101 -0.919218 0.999247 0.9187101 -0.9193711 0.999247 0.9187101 -0.9195648 0.999247 0.9187101 -0.9198099 0.999247 0.9187101 -0.9201199 0.999247 0.9187101 -0.9205121 0.999247 0.9187101 -0.9210083 0.999247 0.9187101 -0.9216361 0.999247 0.9187101 -0.9224303 0.999247 0.9187101 -0.9234351 0.999247 0.9187101 -0.9247063 0.999247 0.9187101 -0.9263145 0.999247 0.9187101 -0.9283491 0.999247 0.9187101 -0.9309231 0.999247 0.9187101 -0.9341796 0.999247 0.9187101 -0.9382994 0.999247 0.9187101 -0.9435116 0.999247 0.9187101 -0.9501056 0.999247 0.9187101 -0.958448 0.999247 0.9187101 -0.9690022 0.999247 0.9187101 -0.9823545 0.999247 0.9187101 -0.999247 0.999247 0.9187101 -0.9994057 0.9858594 0.9348102 -0.9995309 0.9801372 0.947872 -0.9996295 0.9787593 0.9584138 -0.9997074 0.9796912 0.9668859 -0.9997688 0.9817191 0.9736717 -0.9998174 0.9841435 0.9790921 -0.9998557 0.9865802 0.9834126 -0.999886 0.9888352 0.9868503 -0.9999099 0.9908249 0.9895819 -0.9999288 0.992528 0.99175 -0.9999437 0.9939562 0.9934694 -0.9348153 0.999406 0.934858 -0.9348149 0.999406 0.9348574 -0.9348146 0.999406 0.9348565 -0.9348141 0.999406 0.9348555 -0.9348135 0.999406 0.9348542 -0.9348128 0.9994059 0.9348526 -0.9348119 0.9994059 0.9348507 -0.9348109 0.9994059 0.9348482 -0.9348097 0.9994059 0.9348453 -0.9348083 0.9994059 0.9348417 -0.9348069 0.9994059 0.9348374 -0.9348055 0.9994059 0.9348324 -0.9348044 0.9994058 0.9348267 -0.9348042 0.9994058 0.9348207 -0.9348056 0.9994058 0.9348148 -0.9348102 0.9994057 0.9348102 -0.9348219 0.9994057 0.9348102 -0.9348367 0.9994057 0.9348102 -0.9348554 0.9994057 0.9348102 -0.9348791 0.9994057 0.9348102 -0.934909 0.9994057 0.9348102 -0.9349469 0.9994057 0.9348102 -0.9349948 0.9994057 0.9348102 -0.9350555 0.9994057 0.9348102 -0.9351322 0.9994057 0.9348102 -0.9352292 0.9994057 0.9348102 -0.935352 0.9994057 0.9348102 -0.9355073 0.9994057 0.9348102 -0.9357038 0.9994057 0.9348102 -0.9359524 0.9994057 0.9348102 -0.936267 0.9994057 0.9348102 -0.9366649 0.9994057 0.9348102 -0.9371683 0.9994057 0.9348102 -0.9378052 0.9994057 0.9348102 -0.938611 0.9994057 0.9348102 -0.9396303 0.9994057 0.9348102 -0.94092 0.9994057 0.9348102 -0.9425516 0.9994057 0.9348102 -0.9446157 0.9994057 0.9348102 -0.9472271 0.9994057 0.9348102 -0.9505309 0.9994057 0.9348102 -0.9547106 0.9994057 0.9348102 -0.9599985 0.9994057 0.9348102 -0.9666884 0.9994057 0.9348102 -0.9751519 0.9994057 0.9348102 -0.9858594 0.9994057 0.9348102 -0.9994057 0.9994057 0.9348102 -0.9995309 0.988699 0.947872 -0.9996295 0.9841581 0.9584138 -0.9997074 0.9830892 0.9668859 -0.9997688 0.9838546 0.9736717 -0.9998174 0.9854839 0.9790921 -0.9998557 0.9874208 0.9834126 -0.999886 0.9893619 0.9868503 -0.9999099 0.9911547 0.9895819 -0.9999288 0.9927345 0.99175 -0.9999437 0.9940854 0.9934694 -0.9478754 0.999531 0.9479024 -0.9478752 0.999531 0.947902 -0.947875 0.999531 0.9479015 -0.9478746 0.999531 0.9479008 -0.9478743 0.999531 0.9479 -0.9478738 0.999531 0.947899 -0.9478733 0.999531 0.9478978 -0.9478726 0.999531 0.9478962 -0.9478718 0.999531 0.9478943 -0.947871 0.9995309 0.947892 -0.94787 0.9995309 0.9478893 -0.9478691 0.9995309 0.9478861 -0.9478684 0.9995309 0.9478825 -0.9478683 0.9995309 0.9478787 -0.9478691 0.9995309 0.947875 -0.947872 0.9995309 0.947872 -0.9478794 0.9995309 0.947872 -0.9478888 0.9995309 0.947872 -0.9479006 0.9995309 0.947872 -0.9479156 0.9995309 0.947872 -0.9479345 0.9995309 0.947872 -0.9479584 0.9995309 0.947872 -0.9479887 0.9995309 0.947872 -0.948027 0.9995309 0.947872 -0.9480755 0.9995309 0.947872 -0.9481369 0.9995309 0.947872 -0.9482145 0.9995309 0.947872 -0.9483126 0.9995309 0.947872 -0.9484368 0.9995309 0.947872 -0.948594 0.9995309 0.947872 -0.9487928 0.9995309 0.947872 -0.9490443 0.9995309 0.947872 -0.9493625 0.9995309 0.947872 -0.949765 0.9995309 0.947872 -0.9502743 0.9995309 0.947872 -0.9509185 0.9995309 0.947872 -0.9517337 0.9995309 0.947872 -0.9527649 0.9995309 0.947872 -0.9540695 0.9995309 0.947872 -0.95572 0.9995309 0.947872 -0.9578081 0.9995309 0.947872 -0.9604499 0.9995309 0.947872 -0.963792 0.9995309 0.947872 -0.9680203 0.9995309 0.947872 -0.9733696 0.9995309 0.947872 -0.9801372 0.9995309 0.947872 -0.988699 0.9995309 0.947872 -0.9995309 0.9995309 0.947872 -0.9996295 0.9909884 0.9584138 -0.9997074 0.9873881 0.9668859 -0.9997688 0.9865562 0.9736717 -0.9998174 0.9871797 0.9790921 -0.9998557 0.9884842 0.9834126 -0.999886 0.9900282 0.9868503 -0.9999099 0.991572 0.9895819 -0.9999288 0.9929957 0.99175 -0.9999437 0.9942488 0.9934694 -0.958416 0.9996296 0.958433 -0.9584159 0.9996296 0.9584328 -0.9584157 0.9996296 0.9584324 -0.9584155 0.9996296 0.958432 -0.9584153 0.9996296 0.9584315 -0.958415 0.9996296 0.9584309 -0.9584146 0.9996296 0.9584301 -0.9584142 0.9996296 0.9584291 -0.9584137 0.9996296 0.9584279 -0.9584132 0.9996296 0.9584264 -0.9584126 0.9996296 0.9584247 -0.958412 0.9996296 0.9584227 -0.9584115 0.9996296 0.9584204 -0.9584114 0.9996295 0.958418 -0.958412 0.9996295 0.9584156 -0.9584138 0.9996295 0.9584138 -0.9584184 0.9996295 0.9584138 -0.9584243 0.9996295 0.9584138 -0.9584318 0.9996295 0.9584138 -0.9584412 0.9996295 0.9584138 -0.9584532 0.9996295 0.9584138 -0.9584683 0.9996295 0.9584138 -0.9584874 0.9996295 0.9584138 -0.9585115 0.9996295 0.9584138 -0.9585421 0.9996295 0.9584138 -0.9585808 0.9996295 0.9584138 -0.9586297 0.9996295 0.9584138 -0.9586916 0.9996295 0.9584138 -0.9587699 0.9996295 0.9584138 -0.958869 0.9996295 0.9584138 -0.9589944 0.9996295 0.9584138 -0.959153 0.9996295 0.9584138 -0.9593536 0.9996295 0.9584138 -0.9596074 0.9996295 0.9584138 -0.9599286 0.9996295 0.9584138 -0.9603348 0.9996295 0.9584138 -0.9608488 0.9996295 0.9584138 -0.9614991 0.9996295 0.9584138 -0.9623217 0.9996295 0.9584138 -0.9633625 0.9996295 0.9584138 -0.9646792 0.9996295 0.9584138 -0.966345 0.9996295 0.9584138 -0.9684525 0.9996295 0.9584138 -0.9711187 0.9996295 0.9584138 -0.9744918 0.9996295 0.9584138 -0.9787593 0.9996295 0.9584138 -0.9841581 0.9996295 0.9584138 -0.9909884 0.9996295 0.9584138 -0.9996295 0.9996295 0.9584138 -0.9997074 0.9928267 0.9668859 -0.9997688 0.9899742 0.9736717 -0.9998174 0.9893251 0.9790921 -0.9998557 0.9898295 0.9834126 -0.999886 0.9908712 0.9868503 -0.9999099 0.9920999 0.9895819 -0.9999288 0.9933261 0.99175 -0.9999437 0.9944556 0.9934694 -0.9668873 0.9997074 0.9668981 -0.9668872 0.9997074 0.9668979 -0.9668871 0.9997074 0.9668977 -0.966887 0.9997074 0.9668974 -0.9668869 0.9997074 0.9668971 -0.9668867 0.9997074 0.9668967 -0.9668865 0.9997074 0.9668962 -0.9668862 0.9997074 0.9668956 -0.9668859 0.9997074 0.9668948 -0.9668855 0.9997074 0.9668939 -0.9668852 0.9997074 0.9668928 -0.9668848 0.9997074 0.9668915 -0.9668845 0.9997074 0.9668901 -0.9668844 0.9997074 0.9668886 -0.9668847 0.9997074 0.9668871 -0.9668859 0.9997074 0.9668859 -0.9668888 0.9997074 0.9668859 -0.9668925 0.9997074 0.9668859 -0.9668972 0.9997074 0.9668859 -0.9669032 0.9997074 0.9668859 -0.9669107 0.9997074 0.9668859 -0.9669202 0.9997074 0.9668859 -0.9669322 0.9997074 0.9668859 -0.9669474 0.9997074 0.9668859 -0.9669667 0.9997074 0.9668859 -0.966991 0.9997074 0.9668859 -0.9670218 0.9997074 0.9668859 -0.9670608 0.9997074 0.9668859 -0.96711 0.9997074 0.9668859 -0.9671724 0.9997074 0.9668859 -0.9672513 0.9997074 0.9668859 -0.9673511 0.9997074 0.9668859 -0.9674774 0.9997074 0.9668859 -0.9676372 0.9997074 0.9668859 -0.9678393 0.9997074 0.9668859 -0.968095 0.9997074 0.9668859 -0.9684185 0.9997074 0.9668859 -0.9688277 0.9997074 0.9668859 -0.9693455 0.9997074 0.9668859 -0.9700006 0.9997074 0.9668859 -0.9708293 0.9997074 0.9668859 -0.9718777 0.9997074 0.9668859 -0.9732042 0.9997074 0.9668859 -0.9748823 0.9997074 0.9668859 -0.9770053 0.9997074 0.9668859 -0.9796912 0.9997074 0.9668859 -0.9830892 0.9997074 0.9668859 -0.9873881 0.9997074 0.9668859 -0.9928267 0.9997074 0.9668859 -0.9997074 0.9997074 0.9668859 -0.9997688 0.9942983 0.9736717 -0.9998174 0.9920393 0.9790921 -0.9998557 0.9915316 0.9834126 -0.999886 0.9919378 0.9868503 -0.9999099 0.9927678 0.9895819 -0.9999288 0.9937442 0.99175 -0.9999437 0.9947172 0.9934694 -0.9736726 0.9997689 0.9736794 -0.9736726 0.9997689 0.9736793 -0.9736725 0.9997689 0.9736791 -0.9736724 0.9997689 0.973679 -0.9736723 0.9997689 0.9736788 -0.9736722 0.9997689 0.9736785 -0.9736721 0.9997689 0.9736782 -0.9736719 0.9997689 0.9736778 -0.9736717 0.9997689 0.9736773 -0.9736715 0.9997689 0.9736767 -0.9736712 0.9997689 0.9736761 -0.973671 0.9997689 0.9736753 -0.9736708 0.9997689 0.9736743 -0.9736708 0.9997689 0.9736734 -0.973671 0.9997688 0.9736724 -0.9736717 0.9997688 0.9736717 -0.9736735 0.9997688 0.9736717 -0.9736759 0.9997688 0.9736717 -0.9736788 0.9997688 0.9736717 -0.9736826 0.9997688 0.9736717 -0.9736873 0.9997688 0.9736717 -0.9736932 0.9997688 0.9736717 -0.9737008 0.9997688 0.9736717 -0.9737104 0.9997688 0.9736717 -0.9737225 0.9997688 0.9736717 -0.9737378 0.9997688 0.9736717 -0.9737571 0.9997688 0.9736717 -0.9737816 0.9997688 0.9736717 -0.9738126 0.9997688 0.9736717 -0.9738518 0.9997688 0.9736717 -0.9739013 0.9997688 0.9736717 -0.9739641 0.9997688 0.9736717 -0.9740434 0.9997688 0.9736717 -0.9741438 0.9997688 0.9736717 -0.9742709 0.9997688 0.9736717 -0.9744315 0.9997688 0.9736717 -0.9746348 0.9997688 0.9736717 -0.9748921 0.9997688 0.9736717 -0.9752174 0.9997688 0.9736717 -0.9756291 0.9997688 0.9736717 -0.9761499 0.9997688 0.9736717 -0.9768088 0.9997688 0.9736717 -0.9776424 0.9997688 0.9736717 -0.978697 0.9997688 0.9736717 -0.9800312 0.9997688 0.9736717 -0.9817191 0.9997688 0.9736717 -0.9838546 0.9997688 0.9736717 -0.9865562 0.9997688 0.9736717 -0.9899742 0.9997688 0.9736717 -0.9942983 0.9997688 0.9736717 -0.9997688 0.9997688 0.9736717 -0.9998174 0.9954731 0.9790921 -0.9998557 0.9936849 0.9834126 -0.999886 0.9932871 0.9868503 -0.9999099 0.9936128 0.9895819 -0.9999288 0.9942731 0.99175 -0.9999437 0.9950481 0.9934694 -0.9790927 0.9998174 0.979097 -0.9790927 0.9998174 0.9790969 -0.9790927 0.9998174 0.9790968 -0.9790926 0.9998174 0.9790967 -0.9790925 0.9998174 0.9790966 -0.9790925 0.9998174 0.9790964 -0.9790924 0.9998174 0.9790962 -0.9790923 0.9998174 0.979096 -0.9790921 0.9998174 0.9790957 -0.979092 0.9998174 0.9790953 -0.9790919 0.9998174 0.9790949 -0.9790917 0.9998174 0.9790944 -0.9790916 0.9998174 0.9790938 -0.9790916 0.9998174 0.9790932 -0.9790917 0.9998174 0.9790926 -0.9790921 0.9998174 0.9790921 -0.9790933 0.9998174 0.9790921 -0.9790948 0.9998174 0.9790921 -0.9790966 0.9998174 0.9790921 -0.9790989 0.9998174 0.9790921 -0.9791019 0.9998174 0.9790921 -0.9791057 0.9998174 0.9790921 -0.9791104 0.9998174 0.9790921 -0.9791164 0.9998174 0.9790921 -0.979124 0.9998174 0.9790921 -0.9791336 0.9998174 0.9790921 -0.9791457 0.9998174 0.9790921 -0.9791611 0.9998174 0.9790921 -0.9791806 0.9998174 0.9790921 -0.9792052 0.9998174 0.9790921 -0.9792363 0.9998174 0.9790921 -0.9792757 0.9998174 0.9790921 -0.9793255 0.9998174 0.9790921 -0.9793885 0.9998174 0.9790921 -0.9794682 0.9998174 0.9790921 -0.9795691 0.9998174 0.9790921 -0.9796967 0.9998174 0.9790921 -0.9798581 0.9998174 0.9790921 -0.9800624 0.9998174 0.9790921 -0.9803208 0.9998174 0.9790921 -0.9806477 0.9998174 0.9790921 -0.9810613 0.9998174 0.9790921 -0.9815845 0.9998174 0.9790921 -0.9822465 0.9998174 0.9790921 -0.9830839 0.9998174 0.9790921 -0.9841435 0.9998174 0.9790921 -0.9854839 0.9998174 0.9790921 -0.9871797 0.9998174 0.9790921 -0.9893251 0.9998174 0.9790921 -0.9920393 0.9998174 0.9790921 -0.9954731 0.9998174 0.9790921 -0.9998174 0.9998174 0.9790921 -0.9998557 0.9964092 0.9834126 -0.999886 0.9949941 0.9868503 -0.9999099 0.9946818 0.9895819 -0.9999288 0.9949422 0.99175 -0.9999437 0.9954668 0.9934694 -0.9834129 0.9998557 0.9834156 -0.9834129 0.9998557 0.9834155 -0.9834129 0.9998557 0.9834155 -0.9834129 0.9998557 0.9834154 -0.9834128 0.9998557 0.9834153 -0.9834128 0.9998557 0.9834152 -0.9834127 0.9998557 0.9834151 -0.9834127 0.9998557 0.983415 -0.9834126 0.9998557 0.9834148 -0.9834125 0.9998557 0.9834146 -0.9834124 0.9998557 0.9834143 -0.9834123 0.9998557 0.983414 -0.9834122 0.9998557 0.9834136 -0.9834122 0.9998557 0.9834132 -0.9834123 0.9998557 0.9834129 -0.9834126 0.9998557 0.9834126 -0.9834133 0.9998557 0.9834126 -0.9834142 0.9998557 0.9834126 -0.9834154 0.9998557 0.9834126 -0.9834168 0.9998557 0.9834126 -0.9834187 0.9998557 0.9834126 -0.983421 0.9998557 0.9834126 -0.983424 0.9998557 0.9834126 -0.9834278 0.9998557 0.9834126 -0.9834325 0.9998557 0.9834126 -0.9834386 0.9998557 0.9834126 -0.9834462 0.9998557 0.9834126 -0.9834558 0.9998557 0.9834126 -0.983468 0.9998557 0.9834126 -0.9834834 0.9998557 0.9834126 -0.983503 0.9998557 0.9834126 -0.9835276 0.9998557 0.9834126 -0.9835589 0.9998557 0.9834126 -0.9835984 0.9998557 0.9834126 -0.9836484 0.9998557 0.9834126 -0.9837117 0.9998557 0.9834126 -0.9837917 0.9998557 0.9834126 -0.9838929 0.9998557 0.9834126 -0.984021 0.9998557 0.9834126 -0.984183 0.9998557 0.9834126 -0.984388 0.9998557 0.9834126 -0.9846474 0.9998557 0.9834126 -0.9849755 0.9998557 0.9834126 -0.9853906 0.9998557 0.9834126 -0.9859158 0.9998557 0.9834126 -0.9865802 0.9998557 0.9834126 -0.9874208 0.9998557 0.9834126 -0.9884842 0.9998557 0.9834126 -0.9898295 0.9998557 0.9834126 -0.9915316 0.9998557 0.9834126 -0.9936849 0.9998557 0.9834126 -0.9964092 0.9998557 0.9834126 -0.9998557 0.9998557 0.9834126 -0.999886 0.9971538 0.9868503 -0.9999099 0.9960342 0.9895819 -0.9999288 0.9957887 0.99175 -0.9999437 0.9959964 0.9934694 -0.9868505 0.999886 0.9868522 -0.9868505 0.999886 0.9868521 -0.9868505 0.999886 0.9868521 -0.9868505 0.999886 0.9868521 -0.9868504 0.999886 0.986852 -0.9868504 0.999886 0.986852 -0.9868504 0.999886 0.9868519 -0.9868503 0.999886 0.9868518 -0.9868503 0.999886 0.9868517 -0.9868502 0.999886 0.9868515 -0.9868502 0.999886 0.9868513 -0.9868501 0.999886 0.9868511 -0.9868501 0.999886 0.9868509 -0.98685 0.999886 0.9868507 -0.9868501 0.999886 0.9868505 -0.9868503 0.999886 0.9868503 -0.9868507 0.999886 0.9868503 -0.9868513 0.999886 0.9868503 -0.986852 0.999886 0.9868503 -0.9868529 0.999886 0.9868503 -0.9868541 0.999886 0.9868503 -0.9868556 0.999886 0.9868503 -0.9868574 0.999886 0.9868503 -0.9868598 0.999886 0.9868503 -0.9868628 0.999886 0.9868503 -0.9868666 0.999886 0.9868503 -0.9868713 0.999886 0.9868503 -0.9868774 0.999886 0.9868503 -0.986885 0.999886 0.9868503 -0.9868947 0.999886 0.9868503 -0.9869069 0.999886 0.9868503 -0.9869224 0.999886 0.9868503 -0.986942 0.999886 0.9868503 -0.9869667 0.999886 0.9868503 -0.986998 0.999886 0.9868503 -0.9870377 0.999886 0.9868503 -0.9870878 0.999886 0.9868503 -0.9871513 0.999886 0.9868503 -0.9872315 0.999886 0.9868503 -0.9873331 0.999886 0.9868503 -0.9874615 0.999886 0.9868503 -0.987624 0.999886 0.9868503 -0.9878296 0.999886 0.9868503 -0.9880897 0.999886 0.9868503 -0.9884188 0.999886 0.9868503 -0.9888352 0.999886 0.9868503 -0.9893619 0.999886 0.9868503 -0.9900282 0.999886 0.9868503 -0.9908712 0.999886 0.9868503 -0.9919378 0.999886 0.9868503 -0.9932871 0.999886 0.9868503 -0.9949941 0.999886 0.9868503 -0.9971538 0.999886 0.9868503 -0.999886 0.999886 0.9868503 -0.9999099 0.9977452 0.9895819 -0.9999288 0.9968597 0.99175 -0.9999437 0.9966665 0.9934694 -0.989582 0.9999099 0.989583 -0.989582 0.9999099 0.989583 -0.989582 0.9999099 0.989583 -0.989582 0.9999099 0.989583 -0.989582 0.9999099 0.989583 -0.9895819 0.9999099 0.9895829 -0.9895819 0.9999099 0.9895829 -0.9895819 0.9999099 0.9895828 -0.9895819 0.9999099 0.9895827 -0.9895818 0.9999099 0.9895826 -0.9895818 0.9999099 0.9895825 -0.9895818 0.9999099 0.9895824 -0.9895817 0.9999099 0.9895823 -0.9895817 0.9999099 0.9895821 -0.9895817 0.9999099 0.989582 -0.9895819 0.9999099 0.9895819 -0.9895821 0.9999099 0.9895819 -0.9895825 0.9999099 0.9895819 -0.989583 0.9999099 0.9895819 -0.9895835 0.9999099 0.9895819 -0.9895843 0.9999099 0.9895819 -0.9895852 0.9999099 0.9895819 -0.9895864 0.9999099 0.9895819 -0.9895878 0.9999099 0.9895819 -0.9895897 0.9999099 0.9895819 -0.9895921 0.9999099 0.9895819 -0.989595 0.9999099 0.9895819 -0.9895988 0.9999099 0.9895819 -0.9896036 0.9999099 0.9895819 -0.9896097 0.9999099 0.9895819 -0.9896173 0.9999099 0.9895819 -0.989627 0.9999099 0.9895819 -0.9896393 0.9999099 0.9895819 -0.9896548 0.9999099 0.9895819 -0.9896744 0.9999099 0.9895819 -0.9896992 0.9999099 0.9895819 -0.9897306 0.9999099 0.9895819 -0.9897704 0.9999099 0.9895819 -0.9898206 0.9999099 0.9895819 -0.9898842 0.9999099 0.9895819 -0.9899646 0.9999099 0.9895819 -0.9900664 0.9999099 0.9895819 -0.9901952 0.9999099 0.9895819 -0.9903581 0.9999099 0.9895819 -0.9905641 0.9999099 0.9895819 -0.9908249 0.9999099 0.9895819 -0.9911547 0.9999099 0.9895819 -0.991572 0.9999099 0.9895819 -0.9920999 0.9999099 0.9895819 -0.9927678 0.9999099 0.9895819 -0.9936128 0.9999099 0.9895819 -0.9946818 0.9999099 0.9895819 -0.9960342 0.9999099 0.9895819 -0.9977452 0.9999099 0.9895819 -0.9999099 0.9999099 0.9895819 -0.9999288 0.9982146 0.99175 -0.9999437 0.9975143 0.9934694 -0.9917501 0.9999288 0.9917507 -0.9917501 0.9999288 0.9917507 -0.9917501 0.9999288 0.9917507 -0.9917501 0.9999288 0.9917507 -0.9917501 0.9999288 0.9917507 -0.9917501 0.9999288 0.9917507 -0.99175 0.9999288 0.9917506 -0.99175 0.9999288 0.9917506 -0.99175 0.9999288 0.9917505 -0.99175 0.9999288 0.9917505 -0.99175 0.9999288 0.9917504 -0.9917499 0.9999288 0.9917503 -0.9917499 0.9999288 0.9917503 -0.9917499 0.9999288 0.9917502 -0.9917499 0.9999288 0.9917501 -0.99175 0.9999288 0.99175 -0.9917502 0.9999288 0.99175 -0.9917504 0.9999288 0.99175 -0.9917507 0.9999288 0.99175 -0.991751 0.9999288 0.99175 -0.9917515 0.9999288 0.99175 -0.9917521 0.9999288 0.99175 -0.9917528 0.9999288 0.99175 -0.9917537 0.9999288 0.99175 -0.9917549 0.9999288 0.99175 -0.9917564 0.9999288 0.99175 -0.9917583 0.9999288 0.99175 -0.9917606 0.9999288 0.99175 -0.9917636 0.9999288 0.99175 -0.9917674 0.9999288 0.99175 -0.9917722 0.9999288 0.99175 -0.9917783 0.9999288 0.99175 -0.9917859 0.9999288 0.99175 -0.9917956 0.9999288 0.99175 -0.9918079 0.9999288 0.99175 -0.9918235 0.9999288 0.99175 -0.9918431 0.9999288 0.99175 -0.991868 0.9999288 0.99175 -0.9918994 0.9999288 0.99175 -0.9919392 0.9999288 0.99175 -0.9919896 0.9999288 0.99175 -0.9920533 0.9999288 0.99175 -0.9921339 0.9999288 0.99175 -0.9922358 0.9999288 0.99175 -0.9923648 0.9999288 0.99175 -0.992528 0.9999288 0.99175 -0.9927345 0.9999288 0.99175 -0.9929957 0.9999288 0.99175 -0.9933261 0.9999288 0.99175 -0.9937442 0.9999288 0.99175 -0.9942731 0.9999288 0.99175 -0.9949422 0.9999288 0.99175 -0.9957887 0.9999288 0.99175 -0.9968597 0.9999288 0.99175 -0.9982146 0.9999288 0.99175 -0.9999288 0.9999288 0.99175 -0.9999437 0.9985868 0.9934694 -0.9934695 0.9999437 0.9934699 -0.9934695 0.9999437 0.9934699 -0.9934695 0.9999437 0.9934699 -0.9934695 0.9999437 0.9934699 -0.9934695 0.9999437 0.9934699 -0.9934695 0.9999437 0.9934698 -0.9934695 0.9999437 0.9934698 -0.9934694 0.9999437 0.9934698 -0.9934694 0.9999437 0.9934698 -0.9934694 0.9999437 0.9934697 -0.9934694 0.9999437 0.9934697 -0.9934694 0.9999437 0.9934696 -0.9934694 0.9999437 0.9934696 -0.9934694 0.9999437 0.9934695 -0.9934694 0.9999437 0.9934695 -0.9934694 0.9999437 0.9934694 -0.9934695 0.9999437 0.9934694 -0.9934697 0.9999437 0.9934694 -0.9934699 0.9999437 0.9934694 -0.9934701 0.9999437 0.9934694 -0.9934704 0.9999437 0.9934694 -0.9934707 0.9999437 0.9934694 -0.9934712 0.9999437 0.9934694 -0.9934718 0.9999437 0.9934694 -0.9934725 0.9999437 0.9934694 -0.9934734 0.9999437 0.9934694 -0.9934746 0.9999437 0.9934694 -0.9934761 0.9999437 0.9934694 -0.9934779 0.9999437 0.9934694 -0.9934803 0.9999437 0.9934694 -0.9934833 0.9999437 0.9934694 -0.9934871 0.9999437 0.9934694 -0.9934919 0.9999437 0.9934694 -0.993498 0.9999437 0.9934694 -0.9935057 0.9999437 0.9934694 -0.9935154 0.9999437 0.9934694 -0.9935277 0.9999437 0.9934694 -0.9935432 0.9999437 0.9934694 -0.9935629 0.9999437 0.9934694 -0.9935878 0.9999437 0.9934694 -0.9936193 0.9999437 0.9934694 -0.9936592 0.9999437 0.9934694 -0.9937096 0.9999437 0.9934694 -0.9937734 0.9999437 0.9934694 -0.9938541 0.9999437 0.9934694 -0.9939562 0.9999437 0.9934694 -0.9940854 0.9999437 0.9934694 -0.9942488 0.9999437 0.9934694 -0.9944556 0.9999437 0.9934694 -0.9947172 0.9999437 0.9934694 -0.9950481 0.9999437 0.9934694 -0.9954668 0.9999437 0.9934694 -0.9959964 0.9999437 0.9934694 -0.9966665 0.9999437 0.9934694 -0.9975143 0.9999437 0.9934694 -0.9985868 0.9999437 0.9934694 -0.9999437 0.9999437 0.9934694 -0.0000238 0.0000238 0.0821895 -0.0005417 0.0000238 0.0821895 -0.0011968 0.0000238 0.0821895 -0.0020256 0.0000238 0.0821895 -0.0030742 0.0000238 0.0821895 -0.0044007 0.0000238 0.0821895 -0.006079 0.0000238 0.0821895 -0.0082023 0.0000238 0.0821895 -0.0108885 0.0000238 0.0821895 -0.0142868 0.0000238 0.0821895 -0.0185862 0.0000238 0.0821895 -0.0240255 0.0000238 0.0821895 -0.0309069 0.0000238 0.0821895 -0.0396127 0.0000238 0.0821895 -0.0506267 0.0000238 0.0821895 -0.0645609 0.0000238 0.0821895 -0.0821895 0.0000238 0.0821895 -0.1044919 0.0000238 0.0821895 -0.1327073 0.0000238 0.0821895 -0.1684036 0.0000238 0.0821895 -0.2135639 0.0000238 0.0821895 -0.2706977 0.0000238 0.0821895 -0.3429792 0.0000238 0.0821895 -0.4344249 0.0000238 0.0821895 -0.5501155 0.0000238 0.0821895 -0.6964791 0.0000238 0.0821895 -0.8407292 0.0051514 0.0830256 -0.9033413 0.0279321 0.0923908 -0.9354466 0.0624569 0.1132477 -0.9545467 0.1059991 0.1450104 -0.9669269 0.1572498 0.1866663 -0.9754027 0.2151269 0.236956 -0.9814251 0.2783684 0.294322 -0.9858181 0.3454107 0.3568959 -0.9890841 0.4144197 0.4225654 -0.9915469 0.4834235 0.4891161 -0.993424 0.5504963 0.5544184 -0.9948662 0.6139459 0.6166119 -0.9959813 0.6724572 0.6742469 -0.9968475 0.7251659 0.7263539 -0.997523 0.7716588 0.7724394 -0.9980513 0.8119154 0.8124239 -0.9984653 0.8462171 0.8465458 -0.9987905 0.8750477 0.8752589 -0.9990461 0.8990028 0.8991377 -0.9992474 0.9187175 0.9188034 -0.999406 0.9348153 0.9348697 -0.999531 0.9478754 0.9479098 -0.9996296 0.958416 0.9584377 -0.9997074 0.9668873 0.966901 -0.9997689 0.9736726 0.9736812 -0.9998174 0.9790927 0.9790981 -0.9998557 0.9834129 0.9834163 -0.999886 0.9868505 0.9868526 -0.9999099 0.989582 0.9895833 -0.9999288 0.9917501 0.9917509 -0.9999437 0.9934695 0.99347 -0.0000238 0.0005417 0.0821895 -0.0000382 0.0000382 0.081686 -0.0006933 0.0000382 0.081686 -0.0015221 0.0000382 0.081686 -0.0025707 0.0000382 0.081686 -0.0038972 0.0000382 0.081686 -0.0055755 0.0000382 0.081686 -0.0076988 0.0000382 0.081686 -0.0103849 0.0000382 0.081686 -0.0137833 0.0000382 0.081686 -0.0180827 0.0000382 0.081686 -0.023522 0.0000382 0.081686 -0.0304033 0.0000382 0.081686 -0.0391092 0.0000382 0.081686 -0.0501232 0.0000382 0.081686 -0.0640574 0.0000382 0.081686 -0.081686 0.0000382 0.081686 -0.1039884 0.0000382 0.081686 -0.1322038 0.0000382 0.081686 -0.1679 0.0000382 0.081686 -0.2130604 0.0000382 0.081686 -0.2701941 0.0000382 0.081686 -0.3424757 0.0000382 0.081686 -0.4339214 0.0000382 0.081686 -0.549612 0.0000382 0.081686 -0.6959756 0.0000382 0.081686 -0.8405071 0.0051286 0.082539 -0.9032596 0.0278872 0.0919666 -0.9354101 0.0624063 0.1128963 -0.9545286 0.1059489 0.1447271 -0.9669173 0.1572031 0.1864423 -0.9753975 0.2150852 0.2367818 -0.9814221 0.2783325 0.2941886 -0.9858163 0.3453807 0.3567954 -0.9890831 0.4143955 0.4224909 -0.9915463 0.4834045 0.4890619 -0.9934236 0.5504818 0.5543796 -0.994866 0.6139352 0.6165846 -0.9959811 0.6724495 0.674228 -0.9968474 0.7251605 0.726341 -0.997523 0.7716551 0.7724308 -0.9980512 0.8119128 0.8124181 -0.9984653 0.8462154 0.846542 -0.9987905 0.8750466 0.8752564 -0.9990461 0.899002 0.8991362 -0.9992474 0.918717 0.9188024 -0.999406 0.9348149 0.934869 -0.999531 0.9478752 0.9479094 -0.9996296 0.9584159 0.9584374 -0.9997074 0.9668872 0.9669008 -0.9997689 0.9736726 0.9736811 -0.9998174 0.9790927 0.979098 -0.9998557 0.9834129 0.9834163 -0.999886 0.9868505 0.9868526 -0.9999099 0.989582 0.9895833 -0.9999288 0.9917501 0.9917509 -0.9999437 0.9934695 0.99347 -0.0000238 0.0011968 0.0821895 -0.0000382 0.0006933 0.081686 -0.0000611 0.0000611 0.0810538 -0.0008899 0.0000611 0.0810538 -0.0019385 0.0000611 0.0810538 -0.003265 0.0000611 0.0810538 -0.0049433 0.0000611 0.0810538 -0.0070666 0.0000611 0.0810538 -0.0097527 0.0000611 0.0810538 -0.0131511 0.0000611 0.0810538 -0.0174505 0.0000611 0.0810538 -0.0228898 0.0000611 0.0810538 -0.0297711 0.0000611 0.0810538 -0.038477 0.0000611 0.0810538 -0.049491 0.0000611 0.0810538 -0.0634252 0.0000611 0.0810538 -0.0810538 0.0000611 0.0810538 -0.1033562 0.0000611 0.0810538 -0.1315716 0.0000611 0.0810538 -0.1672678 0.0000611 0.0810538 -0.2124282 0.0000611 0.0810538 -0.2695619 0.0000611 0.0810538 -0.3418435 0.0000611 0.0810538 -0.4332891 0.0000611 0.0810538 -0.5489798 0.0000611 0.0810538 -0.6953434 0.0000611 0.0810538 -0.8402274 0.0051047 0.0819276 -0.9031567 0.0278347 0.0914336 -0.9353643 0.0623458 0.1124547 -0.9545059 0.1058883 0.1443712 -0.9669053 0.1571463 0.1861609 -0.9753908 0.2150342 0.2365629 -0.9814183 0.2782884 0.294021 -0.9858141 0.3453439 0.3566692 -0.9890818 0.4143657 0.4223974 -0.9915455 0.4833811 0.4889938 -0.9934231 0.550464 0.5543308 -0.9948657 0.6139219 0.6165503 -0.9959809 0.6724399 0.6742043 -0.9968473 0.7251537 0.7263248 -0.9975229 0.7716504 0.7724199 -0.9980512 0.8119096 0.8124109 -0.9984653 0.8462132 0.8465373 -0.9987904 0.8750451 0.8752533 -0.9990461 0.8990011 0.8991342 -0.9992474 0.9187164 0.9188011 -0.999406 0.9348146 0.9348682 -0.999531 0.947875 0.9479089 -0.9996296 0.9584157 0.9584371 -0.9997074 0.9668871 0.9669006 -0.9997689 0.9736725 0.973681 -0.9998174 0.9790927 0.979098 -0.9998557 0.9834129 0.9834162 -0.999886 0.9868505 0.9868526 -0.9999099 0.989582 0.9895833 -0.9999288 0.9917501 0.9917509 -0.9999437 0.9934695 0.99347 -0.0000238 0.0020256 0.0821895 -0.0000382 0.0015221 0.081686 -0.0000611 0.0008899 0.0810538 -0.0000978 0.0000978 0.0802616 -0.0011463 0.0000978 0.0802616 -0.0024729 0.0000978 0.0802616 -0.0041512 0.0000978 0.0802616 -0.0062744 0.0000978 0.0802616 -0.0089606 0.0000978 0.0802616 -0.012359 0.0000978 0.0802616 -0.0166583 0.0000978 0.0802616 -0.0220976 0.0000978 0.0802616 -0.028979 0.0000978 0.0802616 -0.0376849 0.0000978 0.0802616 -0.0486989 0.0000978 0.0802616 -0.0626331 0.0000978 0.0802616 -0.0802616 0.0000978 0.0802616 -0.102564 0.0000978 0.0802616 -0.1307795 0.0000978 0.0802616 -0.1664757 0.0000978 0.0802616 -0.2116361 0.0000978 0.0802616 -0.2687698 0.0000978 0.0802616 -0.3410514 0.0000978 0.0802616 -0.432497 0.0000978 0.0802616 -0.5481876 0.0000978 0.0802616 -0.6945513 0.0000978 0.0802616 -0.8398756 0.0050826 0.081161 -0.9030276 0.0277752 0.0907651 -0.9353068 0.0622749 0.1119009 -0.9544774 0.1058162 0.1439249 -0.9668902 0.1570779 0.185808 -0.9753825 0.2149725 0.2362885 -0.9814136 0.2782347 0.293811 -0.9858113 0.3452987 0.3565109 -0.9890801 0.414329 0.4222801 -0.9915446 0.4833522 0.4889084 -0.9934225 0.5504419 0.5542698 -0.9948653 0.6139056 0.6165074 -0.9959807 0.672428 0.6741745 -0.9968472 0.7251454 0.7263046 -0.9975228 0.7716446 0.7724063 -0.9980511 0.8119057 0.8124018 -0.9984653 0.8462106 0.8465313 -0.9987904 0.8750434 0.8752495 -0.9990461 0.899 0.8991317 -0.9992474 0.9187157 0.9187995 -0.999406 0.9348141 0.9348672 -0.999531 0.9478746 0.9479082 -0.9996296 0.9584155 0.9584367 -0.9997074 0.966887 0.9669003 -0.9997689 0.9736724 0.9736808 -0.9998174 0.9790926 0.9790979 -0.9998557 0.9834129 0.9834162 -0.999886 0.9868505 0.9868525 -0.9999099 0.989582 0.9895833 -0.9999288 0.9917501 0.9917509 -0.9999437 0.9934695 0.99347 -0.0000238 0.0030742 0.0821895 -0.0000382 0.0025707 0.081686 -0.0000611 0.0019385 0.0810538 -0.0000978 0.0011463 0.0802616 -0.0001565 0.0001565 0.0792718 -0.001483 0.0001565 0.0792718 -0.0031613 0.0001565 0.0792718 -0.0052846 0.0001565 0.0792718 -0.0079707 0.0001565 0.0792718 -0.0113691 0.0001565 0.0792718 -0.0156685 0.0001565 0.0792718 -0.0211078 0.0001565 0.0792718 -0.0279891 0.0001565 0.0792718 -0.036695 0.0001565 0.0792718 -0.047709 0.0001565 0.0792718 -0.0616432 0.0001565 0.0792718 -0.0792718 0.0001565 0.0792718 -0.1015742 0.0001565 0.0792718 -0.1297896 0.0001565 0.0792718 -0.1654858 0.0001565 0.0792718 -0.2106462 0.0001565 0.0792718 -0.2677799 0.0001565 0.0792718 -0.3400615 0.0001565 0.0792718 -0.4315072 0.0001565 0.0792718 -0.5471978 0.0001565 0.0792718 -0.6935614 0.0001565 0.0792718 -0.8394338 0.0050676 0.080202 -0.9028657 0.0277111 0.0899287 -0.9352348 0.0621943 0.1112082 -0.9544418 0.1057322 0.1433666 -0.9668714 0.1569971 0.1853668 -0.9753721 0.2148987 0.2359454 -0.9814076 0.2781701 0.2935483 -0.9858079 0.3452442 0.3563131 -0.9890781 0.4142845 0.4221336 -0.9915433 0.4833171 0.4888018 -0.9934218 0.550415 0.5541934 -0.9948649 0.6138855 0.6164537 -0.9959804 0.6724135 0.6741374 -0.996847 0.7251351 0.7262792 -0.9975227 0.7716375 0.7723893 -0.9980511 0.8119009 0.8123905 -0.9984652 0.8462073 0.8465239 -0.9987904 0.8750412 0.8752446 -0.9990461 0.8989986 0.8991285 -0.9992474 0.9187148 0.9187975 -0.999406 0.9348135 0.9348659 -0.999531 0.9478743 0.9479074 -0.9996296 0.9584153 0.9584362 -0.9997074 0.9668869 0.9669 -0.9997689 0.9736723 0.9736806 -0.9998174 0.9790925 0.9790977 -0.9998557 0.9834128 0.9834161 -0.999886 0.9868504 0.9868525 -0.9999099 0.989582 0.9895832 -0.9999288 0.9917501 0.9917509 -0.9999437 0.9934695 0.99347 -0.0000238 0.0044007 0.0821895 -0.0000382 0.0038972 0.081686 -0.0000611 0.003265 0.0810538 -0.0000978 0.0024729 0.0802616 -0.0001565 0.001483 0.0792718 -0.0002504 0.0002504 0.0780392 -0.0019287 0.0002504 0.0780392 -0.004052 0.0002504 0.0780392 -0.0067381 0.0002504 0.0780392 -0.0101365 0.0002504 0.0780392 -0.0144359 0.0002504 0.0780392 -0.0198752 0.0002504 0.0780392 -0.0267565 0.0002504 0.0780392 -0.0354624 0.0002504 0.0780392 -0.0464764 0.0002504 0.0780392 -0.0604106 0.0002504 0.0780392 -0.0780392 0.0002504 0.0780392 -0.1003416 0.0002504 0.0780392 -0.128557 0.0002504 0.0780392 -0.1642532 0.0002504 0.0780392 -0.2094136 0.0002504 0.0780392 -0.2665473 0.0002504 0.0780392 -0.3388289 0.0002504 0.0780392 -0.4302746 0.0002504 0.0780392 -0.5459652 0.0002504 0.0780392 -0.6923288 0.0002504 0.0780392 -0.8388802 0.0050694 0.0790064 -0.9026634 0.0276479 0.0888856 -0.9351449 0.0621069 0.1103442 -0.9543974 0.1056375 0.1426706 -0.9668479 0.156904 0.1848168 -0.9753591 0.2148124 0.2355177 -0.9814002 0.2780936 0.2932211 -0.9858036 0.3451791 0.3560667 -0.9890755 0.4142311 0.4219511 -0.9915418 0.4832747 0.4886689 -0.9934209 0.5503825 0.5540983 -0.9948643 0.6138613 0.6163868 -0.9959801 0.6723959 0.6740911 -0.9968468 0.7251226 0.7262477 -0.9975226 0.7716288 0.7723681 -0.998051 0.8118949 0.8123765 -0.9984652 0.8462034 0.8465147 -0.9987904 0.8750386 0.8752386 -0.9990461 0.8989969 0.8991246 -0.9992474 0.9187137 0.918795 -0.9994059 0.9348128 0.9348643 -0.999531 0.9478738 0.9479064 -0.9996296 0.958415 0.9584355 -0.9997074 0.9668867 0.9668996 -0.9997689 0.9736722 0.9736803 -0.9998174 0.9790925 0.9790976 -0.9998557 0.9834128 0.983416 -0.999886 0.9868504 0.9868524 -0.9999099 0.9895819 0.9895832 -0.9999288 0.9917501 0.9917508 -0.9999437 0.9934695 0.99347 -0.0000238 0.006079 0.0821895 -0.0000382 0.0055755 0.081686 -0.0000611 0.0049433 0.0810538 -0.0000978 0.0041512 0.0802616 -0.0001565 0.0031613 0.0792718 -0.0002504 0.0019287 0.0780392 -0.0004008 0.0004008 0.0765113 -0.0025241 0.0004008 0.0765113 -0.0052103 0.0004008 0.0765113 -0.0086086 0.0004008 0.0765113 -0.012908 0.0004008 0.0765113 -0.0183473 0.0004008 0.0765113 -0.0252287 0.0004008 0.0765113 -0.0339345 0.0004008 0.0765113 -0.0449485 0.0004008 0.0765113 -0.0588827 0.0004008 0.0765113 -0.0765113 0.0004008 0.0765113 -0.0988137 0.0004008 0.0765113 -0.1270291 0.0004008 0.0765113 -0.1627254 0.0004008 0.0765113 -0.2078857 0.0004008 0.0765113 -0.2650195 0.0004008 0.0765113 -0.337301 0.0004008 0.0765113 -0.4287467 0.0004008 0.0765113 -0.5444373 0.0004008 0.0765113 -0.6908009 0.0004008 0.0765113 -0.8381886 0.0051048 0.0775221 -0.9024114 0.0275966 0.08759 -0.9350332 0.0620199 0.1092715 -0.9543421 0.1055364 0.1418066 -0.9668187 0.1568008 0.1841341 -0.975343 0.2147144 0.2349871 -0.9813911 0.2780055 0.2928151 -0.9857982 0.3451032 0.3557609 -0.9890723 0.4141683 0.4217247 -0.9915399 0.4832246 0.4885041 -0.9934197 0.5503438 0.5539804 -0.9948636 0.6138323 0.6163039 -0.9959797 0.6723748 0.6740337 -0.9968465 0.7251076 0.7262086 -0.9975224 0.7716184 0.7723418 -0.9980509 0.8118878 0.812359 -0.9984651 0.8461986 0.8465032 -0.9987903 0.8750355 0.8752311 -0.9990461 0.8989948 0.8991198 -0.9992473 0.9187123 0.9187919 -0.9994059 0.9348119 0.9348623 -0.999531 0.9478733 0.9479051 -0.9996296 0.9584146 0.9584347 -0.9997074 0.9668865 0.9668991 -0.9997689 0.9736721 0.97368 -0.9998174 0.9790924 0.9790974 -0.9998557 0.9834127 0.9834158 -0.999886 0.9868504 0.9868523 -0.9999099 0.9895819 0.9895832 -0.9999288 0.99175 0.9917508 -0.9999437 0.9934695 0.9934699 -0.0000238 0.0082023 0.0821895 -0.0000382 0.0076988 0.081686 -0.0000611 0.0070666 0.0810538 -0.0000978 0.0062744 0.0802616 -0.0001565 0.0052846 0.0792718 -0.0002504 0.004052 0.0780392 -0.0004008 0.0025241 0.0765113 -0.0006416 0.0006416 0.0746288 -0.0033277 0.0006416 0.0746288 -0.0067261 0.0006416 0.0746288 -0.0110255 0.0006416 0.0746288 -0.0164648 0.0006416 0.0746288 -0.0233461 0.0006416 0.0746288 -0.032052 0.0006416 0.0746288 -0.043066 0.0006416 0.0746288 -0.0570002 0.0006416 0.0746288 -0.0746288 0.0006416 0.0746288 -0.0969312 0.0006416 0.0746288 -0.1251466 0.0006416 0.0746288 -0.1608428 0.0006416 0.0746288 -0.2060032 0.0006416 0.0746288 -0.2631369 0.0006416 0.0746288 -0.3354185 0.0006416 0.0746288 -0.4268641 0.0006416 0.0746288 -0.5425548 0.0006416 0.0746288 -0.6889184 0.0006416 0.0746288 -0.8373283 0.0052028 0.0756899 -0.9020992 0.0275778 0.0859897 -0.9348949 0.0619473 0.1079468 -0.9542739 0.1054384 0.1407401 -0.9667827 0.1566936 0.1832918 -0.9753231 0.2146085 0.2343326 -0.9813797 0.2779077 0.2923143 -0.9857916 0.3450175 0.355384 -0.9890684 0.4140964 0.4214456 -0.9915376 0.4831666 0.4883009 -0.9934183 0.5502987 0.5538351 -0.9948628 0.6137984 0.6162016 -0.9959791 0.67235 0.673963 -0.9968462 0.7250899 0.7261604 -0.9975222 0.7716061 0.7723094 -0.9980508 0.8118794 0.8123375 -0.998465 0.8461929 0.8464891 -0.9987903 0.8750317 0.8752219 -0.999046 0.8989923 0.8991139 -0.9992473 0.9187107 0.9187881 -0.9994059 0.9348109 0.9348599 -0.999531 0.9478726 0.9479036 -0.9996296 0.9584142 0.9584337 -0.9997074 0.9668862 0.9668985 -0.9997689 0.9736719 0.9736796 -0.9998174 0.9790923 0.9790971 -0.9998557 0.9834127 0.9834157 -0.999886 0.9868503 0.9868522 -0.9999099 0.9895819 0.9895831 -0.9999288 0.99175 0.9917508 -0.9999437 0.9934694 0.9934699 -0.0000238 0.0108885 0.0821895 -0.0000382 0.0103849 0.081686 -0.0000611 0.0097527 0.0810538 -0.0000978 0.0089606 0.0802616 -0.0001565 0.0079707 0.0792718 -0.0002504 0.0067381 0.0780392 -0.0004008 0.0052103 0.0765113 -0.0006416 0.0033277 0.0746288 -0.0010268 0.0010268 0.0723279 -0.0044252 0.0010268 0.0723279 -0.0087246 0.0010268 0.0723279 -0.0141639 0.0010268 0.0723279 -0.0210452 0.0010268 0.0723279 -0.0297511 0.0010268 0.0723279 -0.0407651 0.0010268 0.0723279 -0.0546993 0.0010268 0.0723279 -0.0723279 0.0010268 0.0723279 -0.0946303 0.0010268 0.0723279 -0.1228457 0.0010268 0.0723279 -0.1585419 0.0010268 0.0723279 -0.2037023 0.0010268 0.0723279 -0.260836 0.0010268 0.0723279 -0.3331176 0.0010268 0.0723279 -0.4245633 0.0010268 0.0723279 -0.5402539 0.0010268 0.0723279 -0.6866175 0.0010268 0.0723279 -0.8362644 0.0054121 0.0734453 -0.9017148 0.0276281 0.0840281 -0.9347252 0.061916 0.1063233 -0.9541902 0.1053624 0.1394336 -0.9667385 0.1565954 0.1822603 -0.9752987 0.2145034 0.2335313 -0.9813659 0.2778058 0.2917015 -0.9857835 0.3449254 0.3549227 -0.9890637 0.4140176 0.4211041 -0.9915347 0.4831021 0.4880524 -0.9934166 0.550248 0.5536574 -0.9948617 0.6137599 0.6160767 -0.9959785 0.6723217 0.6738765 -0.9968458 0.7250697 0.7261015 -0.997522 0.7715919 0.7722698 -0.9980506 0.8118697 0.8123112 -0.9984649 0.8461864 0.8464718 -0.9987902 0.8750274 0.8752107 -0.999046 0.8989895 0.8991066 -0.9992473 0.9187089 0.9187834 -0.9994059 0.9348097 0.9348569 -0.999531 0.9478718 0.9479017 -0.9996296 0.9584137 0.9584325 -0.9997074 0.9668859 0.9668977 -0.9997689 0.9736717 0.9736792 -0.9998174 0.9790921 0.9790968 -0.9998557 0.9834126 0.9834155 -0.999886 0.9868503 0.9868521 -0.9999099 0.9895819 0.989583 -0.9999288 0.99175 0.9917507 -0.9999437 0.9934694 0.9934699 -0.0000238 0.0142868 0.0821895 -0.0000382 0.0137833 0.081686 -0.0000611 0.0131511 0.0810538 -0.0000978 0.012359 0.0802616 -0.0001565 0.0113691 0.0792718 -0.0002504 0.0101365 0.0780392 -0.0004008 0.0086086 0.0765113 -0.0006416 0.0067261 0.0746288 -0.0010268 0.0044252 0.0723279 -0.0016435 0.0016435 0.0695462 -0.0059429 0.0016435 0.0695462 -0.0113822 0.0016435 0.0695462 -0.0182636 0.0016435 0.0695462 -0.0269694 0.0016435 0.0695462 -0.0379834 0.0016435 0.0695462 -0.0519176 0.0016435 0.0695462 -0.0695462 0.0016435 0.0695462 -0.0918486 0.0016435 0.0695462 -0.120064 0.0016435 0.0695462 -0.1557603 0.0016435 0.0695462 -0.2009206 0.0016435 0.0695462 -0.2580543 0.0016435 0.0695462 -0.3303359 0.0016435 0.0695462 -0.4217816 0.0016435 0.0695462 -0.5374722 0.0016435 0.0695462 -0.6838358 0.0016435 0.0695462 -0.8349593 0.0058134 0.0707243 -0.9012461 0.0278105 0.0816479 -0.9345187 0.0619734 0.1043541 -0.9540886 0.1053433 0.1378497 -0.966685 0.1565315 0.1810104 -0.9752692 0.2144168 0.2325608 -0.9813491 0.2777122 0.2909596 -0.9857738 0.3448353 0.3543644 -0.9890579 0.4139373 0.4206909 -0.9915312 0.4830346 0.4877517 -0.9934145 0.5501939 0.5534423 -0.9948604 0.6137183 0.6159255 -0.9959777 0.6722907 0.673772 -0.9968453 0.7250473 0.7260302 -0.9975217 0.7715762 0.7722219 -0.9980504 0.8118589 0.8122794 -0.9984648 0.8461791 0.8464509 -0.9987902 0.8750225 0.8751971 -0.9990459 0.8989863 0.8990978 -0.9992473 0.9187068 0.9187778 -0.9994059 0.9348083 0.9348533 -0.9995309 0.947871 0.9478994 -0.9996296 0.9584132 0.9584311 -0.9997074 0.9668855 0.9668968 -0.9997689 0.9736715 0.9736786 -0.9998174 0.979092 0.9790965 -0.9998557 0.9834125 0.9834153 -0.999886 0.9868502 0.986852 -0.9999099 0.9895818 0.9895829 -0.9999288 0.99175 0.9917507 -0.9999437 0.9934694 0.9934698 -0.0000238 0.0185862 0.0821895 -0.0000382 0.0180827 0.081686 -0.0000611 0.0174505 0.0810538 -0.0000978 0.0166583 0.0802616 -0.0001565 0.0156685 0.0792718 -0.0002504 0.0144359 0.0780392 -0.0004008 0.012908 0.0765113 -0.0006416 0.0110255 0.0746288 -0.0010268 0.0087246 0.0723279 -0.0016435 0.0059429 0.0695462 -0.0026305 0.0026305 0.0662338 -0.0080698 0.0026305 0.0662338 -0.0149512 0.0026305 0.0662338 -0.023657 0.0026305 0.0662338 -0.0346711 0.0026305 0.0662338 -0.0486053 0.0026305 0.0662338 -0.0662338 0.0026305 0.0662338 -0.0885362 0.0026305 0.0662338 -0.1167517 0.0026305 0.0662338 -0.1524479 0.0026305 0.0662338 -0.1976083 0.0026305 0.0662338 -0.254742 0.0026305 0.0662338 -0.3270236 0.0026305 0.0662338 -0.4184692 0.0026305 0.0662338 -0.5341598 0.0026305 0.0662338 -0.6805235 0.0026305 0.0662338 -0.8333779 0.0065402 0.0674739 -0.900682 0.0282324 0.0788014 -0.9342712 0.062202 0.102 -0.9539671 0.1054431 0.1359573 -0.9666211 0.1565473 0.1795179 -0.975234 0.2143816 0.2314025 -0.9813291 0.2776503 0.2900744 -0.9857621 0.3447636 0.3536986 -0.989051 0.4138668 0.4201982 -0.9915271 0.4829718 0.4873934 -0.993412 0.5501416 0.5531861 -0.9948589 0.6136769 0.6157453 -0.9959768 0.6722594 0.6736474 -0.9968448 0.7250244 0.7259453 -0.9975213 0.7715599 0.7721649 -0.9980502 0.8118476 0.8122416 -0.9984647 0.8461714 0.846426 -0.9987901 0.8750173 0.8751809 -0.9990459 0.8989829 0.8990874 -0.9992472 0.9187045 0.918771 -0.9994059 0.9348069 0.9348491 -0.9995309 0.94787 0.9478967 -0.9996296 0.9584126 0.9584294 -0.9997074 0.9668852 0.9668957 -0.9997689 0.9736712 0.9736779 -0.9998174 0.9790919 0.979096 -0.9998557 0.9834124 0.983415 -0.999886 0.9868502 0.9868518 -0.9999099 0.9895818 0.9895828 -0.9999288 0.99175 0.9917506 -0.9999437 0.9934694 0.9934698 -0.0000238 0.0240255 0.0821895 -0.0000382 0.023522 0.081686 -0.0000611 0.0228898 0.0810538 -0.0000978 0.0220976 0.0802616 -0.0001565 0.0211078 0.0792718 -0.0002504 0.0198752 0.0780392 -0.0004008 0.0183473 0.0765113 -0.0006416 0.0164648 0.0746288 -0.0010268 0.0141639 0.0723279 -0.0016435 0.0113822 0.0695462 -0.0026305 0.0080698 0.0662338 -0.0042103 0.0042103 0.0623743 -0.0110917 0.0042103 0.0623743 -0.0197975 0.0042103 0.0623743 -0.0308116 0.0042103 0.0623743 -0.0447458 0.0042103 0.0623743 -0.0623743 0.0042103 0.0623743 -0.0846767 0.0042103 0.0623743 -0.1128922 0.0042103 0.0623743 -0.1485884 0.0042103 0.0623743 -0.1937488 0.0042103 0.0623743 -0.2508825 0.0042103 0.0623743 -0.3231641 0.0042103 0.0623743 -0.4146097 0.0042103 0.0623743 -0.5303003 0.0042103 0.0623743 -0.676664 0.0042103 0.0623743 -0.8314967 0.0078103 0.0636727 -0.9000167 0.0290732 0.0754678 -0.9339805 0.062742 0.0992443 -0.9538247 0.1057683 0.1337437 -0.9665463 0.1567226 0.1777733 -0.9751928 0.2144566 0.2300493 -0.9813057 0.2776626 0.2890408 -0.9857485 0.3447407 0.3529214 -0.989043 0.4138277 0.4196234 -0.9915223 0.4829286 0.4869753 -0.9934091 0.5501012 0.5528872 -0.9948571 0.6136427 0.6155353 -0.9959757 0.6722322 0.6735021 -0.9968441 0.7250039 0.7258464 -0.9975209 0.7715449 0.7720984 -0.99805 0.811837 0.8121974 -0.9984645 0.8461641 0.8463971 -0.99879 0.8750124 0.875162 -0.9990458 0.8989796 0.8990752 -0.9992472 0.9187024 0.9187632 -0.9994059 0.9348055 0.9348441 -0.9995309 0.9478691 0.9478935 -0.9996296 0.958412 0.9584274 -0.9997074 0.9668848 0.9668945 -0.9997689 0.973671 0.9736771 -0.9998174 0.9790917 0.9790955 -0.9998557 0.9834123 0.9834147 -0.999886 0.9868501 0.9868516 -0.9999099 0.9895818 0.9895827 -0.9999288 0.9917499 0.9917505 -0.9999437 0.9934694 0.9934698 -0.0000238 0.0309069 0.0821895 -0.0000382 0.0304033 0.081686 -0.0000611 0.0297711 0.0810538 -0.0000978 0.028979 0.0802616 -0.0001565 0.0279891 0.0792718 -0.0002504 0.0267565 0.0780392 -0.0004008 0.0252287 0.0765113 -0.0006416 0.0233461 0.0746288 -0.0010268 0.0210452 0.0723279 -0.0016435 0.0182636 0.0695462 -0.0026305 0.0149512 0.0662338 -0.0042103 0.0110917 0.0623743 -0.0067388 0.0067388 0.0580214 -0.0154447 0.0067388 0.0580214 -0.0264587 0.0067388 0.0580214 -0.0403929 0.0067388 0.0580214 -0.0580214 0.0067388 0.0580214 -0.0803239 0.0067388 0.0580214 -0.1085393 0.0067388 0.0580214 -0.1442355 0.0067388 0.0580214 -0.1893959 0.0067388 0.0580214 -0.2465296 0.0067388 0.0580214 -0.3188112 0.0067388 0.0580214 -0.4102568 0.0067388 0.0580214 -0.5259474 0.0067388 0.0580214 -0.6723111 0.0067388 0.0580214 -0.8293233 0.0099781 0.0593681 -0.8992555 0.0306306 0.0716861 -0.9336494 0.0638283 0.0961197 -0.953663 0.1064997 0.1312358 -0.9664615 0.1571937 0.1757984 -0.9751462 0.2147432 0.2285185 -0.9812792 0.2778236 0.2878722 -0.9857332 0.3448204 0.3520431 -0.9890339 0.4138582 0.418974 -0.9915169 0.4829319 0.4865032 -0.9934058 0.5500915 0.5525498 -0.9948551 0.6136284 0.6152981 -0.9959745 0.672218 0.6733381 -0.9968433 0.7249916 0.7257347 -0.9975204 0.7715352 0.7720233 -0.9980497 0.8118298 0.8121476 -0.9984643 0.8461589 0.8463643 -0.9987899 0.8750088 0.8751408 -0.9990458 0.8989771 0.8990614 -0.9992472 0.9187008 0.9187544 -0.9994058 0.9348044 0.9348384 -0.9995309 0.9478684 0.9478899 -0.9996296 0.9584115 0.9584251 -0.9997074 0.9668845 0.966893 -0.9997689 0.9736708 0.9736762 -0.9998174 0.9790916 0.979095 -0.9998557 0.9834122 0.9834143 -0.999886 0.9868501 0.9868514 -0.9999099 0.9895817 0.9895826 -0.9999288 0.9917499 0.9917504 -0.9999437 0.9934694 0.9934697 -0.0000238 0.0396127 0.0821895 -0.0000382 0.0391092 0.081686 -0.0000611 0.038477 0.0810538 -0.0000978 0.0376849 0.0802616 -0.0001565 0.036695 0.0792718 -0.0002504 0.0354624 0.0780392 -0.0004008 0.0339345 0.0765113 -0.0006416 0.032052 0.0746288 -0.0010268 0.0297511 0.0723279 -0.0016435 0.0269694 0.0695462 -0.0026305 0.023657 0.0662338 -0.0042103 0.0197975 0.0623743 -0.0067388 0.0154447 0.0580214 -0.0107859 0.0107859 0.0533626 -0.0217999 0.0107859 0.0533626 -0.0357341 0.0107859 0.0533626 -0.0533626 0.0107859 0.0533626 -0.075665 0.0107859 0.0533626 -0.1038805 0.0107859 0.0533626 -0.1395767 0.0107859 0.0533626 -0.1847371 0.0107859 0.0533626 -0.2418708 0.0107859 0.0533626 -0.3141524 0.0107859 0.0533626 -0.405598 0.0107859 0.0533626 -0.5212886 0.0107859 0.0533626 -0.6676523 0.0107859 0.0533626 -0.8269342 0.0136166 0.0547413 -0.8984278 0.0333932 0.0676127 -0.9332914 0.0658501 0.0927559 -0.9534887 0.1079385 0.1285384 -0.9663702 0.15819 0.1736761 -0.9750962 0.2154135 0.2268747 -0.9812508 0.2782606 0.2866181 -0.9857167 0.3450957 0.351101 -0.9890241 0.4140252 0.4182777 -0.991511 0.4830292 0.4859971 -0.9934023 0.5501456 0.5521882 -0.994853 0.6136569 0.6150441 -0.9959732 0.672232 0.6731625 -0.9968425 0.7249978 0.7256151 -0.9975199 0.7715376 0.771943 -0.9980494 0.8118303 0.8120943 -0.9984642 0.8461587 0.8463293 -0.9987897 0.8750084 0.875118 -0.9990457 0.8989767 0.8990467 -0.9992471 0.9187004 0.918745 -0.9994058 0.9348042 0.9348324 -0.9995309 0.9478683 0.9478861 -0.9996295 0.9584114 0.9584227 -0.9997074 0.9668844 0.9668915 -0.9997689 0.9736708 0.9736752 -0.9998174 0.9790916 0.9790943 -0.9998557 0.9834122 0.9834139 -0.999886 0.98685 0.9868511 -0.9999099 0.9895817 0.9895824 -0.9999288 0.9917499 0.9917503 -0.9999437 0.9934694 0.9934696 -0.0000238 0.0506267 0.0821895 -0.0000382 0.0501232 0.081686 -0.0000611 0.049491 0.0810538 -0.0000978 0.0486989 0.0802616 -0.0001565 0.047709 0.0792718 -0.0002504 0.0464764 0.0780392 -0.0004008 0.0449485 0.0765113 -0.0006416 0.043066 0.0746288 -0.0010268 0.0407651 0.0723279 -0.0016435 0.0379834 0.0695462 -0.0026305 0.0346711 0.0662338 -0.0042103 0.0308116 0.0623743 -0.0067388 0.0264587 0.0580214 -0.0107859 0.0217999 0.0533626 -0.0172633 0.0172633 0.0488261 -0.0311975 0.0172633 0.0488261 -0.0488261 0.0172633 0.0488261 -0.0711285 0.0172633 0.0488261 -0.099344 0.0172633 0.0488261 -0.1350402 0.0172633 0.0488261 -0.1802005 0.0172633 0.0488261 -0.2373343 0.0172633 0.0488261 -0.3096159 0.0172633 0.0488261 -0.4010615 0.0172633 0.0488261 -0.5167521 0.0172633 0.0488261 -0.6631157 0.0172633 0.0488261 -0.8245426 0.0196467 0.0502171 -0.8976087 0.0381561 0.0636203 -0.9329391 0.0694453 0.0894608 -0.9533177 0.1105818 0.1258985 -0.9662809 0.160092 0.1716008 -0.9750472 0.2167545 0.2252686 -0.9812231 0.2791873 0.2853935 -0.9857006 0.3457234 0.3501816 -0.9890146 0.4144423 0.4175984 -0.9915054 0.4833013 0.4855036 -0.9933988 0.5503203 0.5518357 -0.9948509 0.6137675 0.6147965 -0.9959719 0.6723012 0.6729913 -0.9968418 0.7250408 0.7254985 -0.9975194 0.7715641 0.7718647 -0.9980491 0.8118466 0.8120423 -0.998464 0.8461687 0.8462952 -0.9987896 0.8750145 0.8750958 -0.9990456 0.8989805 0.8990324 -0.9992471 0.9187027 0.9187358 -0.9994058 0.9348056 0.9348265 -0.9995309 0.9478691 0.9478824 -0.9996295 0.958412 0.9584203 -0.9997074 0.9668847 0.96689 -0.9997688 0.973671 0.9736743 -0.9998174 0.9790917 0.9790938 -0.9998557 0.9834123 0.9834136 -0.999886 0.9868501 0.9868509 -0.9999099 0.9895817 0.9895823 -0.9999288 0.9917499 0.9917502 -0.9999437 0.9934694 0.9934696 -0.0000238 0.0645609 0.0821895 -0.0000382 0.0640574 0.081686 -0.0000611 0.0634252 0.0810538 -0.0000978 0.0626331 0.0802616 -0.0001565 0.0616432 0.0792718 -0.0002504 0.0604106 0.0780392 -0.0004008 0.0588827 0.0765113 -0.0006416 0.0570002 0.0746288 -0.0010268 0.0546993 0.0723279 -0.0016435 0.0519176 0.0695462 -0.0026305 0.0486053 0.0662338 -0.0042103 0.0447458 0.0623743 -0.0067388 0.0403929 0.0580214 -0.0107859 0.0357341 0.0533626 -0.0172633 0.0311975 0.0488261 -0.0276309 0.0276309 0.0452595 -0.0452595 0.0276309 0.0452595 -0.0675619 0.0276309 0.0452595 -0.0957773 0.0276309 0.0452595 -0.1314736 0.0276309 0.0452595 -0.1766339 0.0276309 0.0452595 -0.2337676 0.0276309 0.0452595 -0.3060492 0.0276309 0.0452595 -0.3974949 0.0276309 0.0452595 -0.5131855 0.0276309 0.0452595 -0.6595491 0.0276309 0.0452595 -0.8226154 0.0295373 0.0466479 -0.8969554 0.0461985 0.0604636 -0.9326595 0.0756464 0.0868564 -0.9531823 0.1152388 0.1238137 -0.9662104 0.1635226 0.1699632 -0.9750086 0.2192389 0.224002 -0.9812013 0.2809573 0.2844283 -0.9856879 0.3469645 0.3494573 -0.9890072 0.4152991 0.4170635 -0.9915009 0.4838841 0.4851151 -0.9933961 0.5507113 0.5515582 -0.9948493 0.6140266 0.6146016 -0.9959709 0.6724711 0.6728567 -0.9968411 0.7251511 0.7254069 -0.9975191 0.7716352 0.7718031 -0.9980488 0.8118921 0.8120015 -0.9984638 0.8461977 0.8462684 -0.9987895 0.8750329 0.8750783 -0.9990456 0.8989921 0.8990211 -0.999247 0.9187101 0.9187285 -0.9994057 0.9348102 0.9348219 -0.9995309 0.947872 0.9478794 -0.9996295 0.9584138 0.9584184 -0.9997074 0.9668859 0.9668888 -0.9997688 0.9736717 0.9736735 -0.9998174 0.9790921 0.9790933 -0.9998557 0.9834126 0.9834133 -0.999886 0.9868503 0.9868507 -0.9999099 0.9895819 0.9895821 -0.9999288 0.99175 0.9917502 -0.9999437 0.9934694 0.9934695 -0.0000238 0.0821895 0.0821895 -0.0000382 0.081686 0.081686 -0.0000611 0.0810538 0.0810538 -0.0000978 0.0802616 0.0802616 -0.0001565 0.0792718 0.0792718 -0.0002504 0.0780392 0.0780392 -0.0004008 0.0765113 0.0765113 -0.0006416 0.0746288 0.0746288 -0.0010268 0.0723279 0.0723279 -0.0016435 0.0695462 0.0695462 -0.0026305 0.0662338 0.0662338 -0.0042103 0.0623743 0.0623743 -0.0067388 0.0580214 0.0580214 -0.0107859 0.0533626 0.0533626 -0.0172633 0.0488261 0.0488261 -0.0276309 0.0452595 0.0452595 -0.0441188 0.0441188 0.0441188 -0.0664212 0.0441188 0.0441188 -0.0946366 0.0441188 0.0441188 -0.1303328 0.0441188 0.0441188 -0.1754932 0.0441188 0.0441188 -0.2326269 0.0441188 0.0441188 -0.3049085 0.0441188 0.0441188 -0.3963542 0.0441188 0.0441188 -0.5120448 0.0441188 0.0441188 -0.6584084 0.0441188 0.0441188 -0.8219901 0.0455041 0.0455041 -0.8967447 0.0594506 0.0594506 -0.9325696 0.0860209 0.0860209 -0.9531389 0.1231452 0.1231452 -0.9661878 0.1694384 0.1694384 -0.9749962 0.2235962 0.2235962 -0.9811943 0.2841192 0.2841192 -0.9856839 0.3492254 0.3492254 -0.9890048 0.4168922 0.4168922 -0.9914995 0.4849907 0.4849907 -0.9933953 0.5514695 0.5514695 -0.9948487 0.6145393 0.6145393 -0.9959706 0.6728136 0.6728136 -0.9968409 0.7253775 0.7253775 -0.9975189 0.7717834 0.7717834 -0.9980488 0.8119884 0.8119884 -0.9984638 0.8462598 0.8462598 -0.9987895 0.8750727 0.8750727 -0.9990455 0.8990175 0.8990175 -0.999247 0.9187262 0.9187262 -0.9994057 0.9348204 0.9348204 -0.9995308 0.9478785 0.9478785 -0.9996295 0.9584178 0.9584178 -0.9997074 0.9668884 0.9668884 -0.9997688 0.9736733 0.9736733 -0.9998174 0.9790931 0.9790931 -0.9998557 0.9834132 0.9834132 -0.999886 0.9868507 0.9868507 -0.9999099 0.9895821 0.9895821 -0.9999288 0.9917502 0.9917502 -0.9999437 0.9934695 0.9934695 -0.0000238 0.1044919 0.0821895 -0.0000382 0.1039884 0.081686 -0.0000611 0.1033562 0.0810538 -0.0000978 0.102564 0.0802616 -0.0001565 0.1015742 0.0792718 -0.0002504 0.1003416 0.0780392 -0.0004008 0.0988137 0.0765113 -0.0006416 0.0969312 0.0746288 -0.0010268 0.0946303 0.0723279 -0.0016435 0.0918486 0.0695462 -0.0026305 0.0885362 0.0662338 -0.0042103 0.0846767 0.0623743 -0.0067388 0.0803239 0.0580214 -0.0107859 0.075665 0.0533626 -0.0172633 0.0711285 0.0488261 -0.0276309 0.0675619 0.0452595 -0.0441188 0.0664212 0.0441188 -0.0664212 0.0664212 0.0441188 -0.0946366 0.0664212 0.0441188 -0.1303328 0.0664212 0.0441188 -0.1754932 0.0664212 0.0441188 -0.2326269 0.0664212 0.0441188 -0.3049085 0.0664212 0.0441188 -0.3963542 0.0664212 0.0441188 -0.5120448 0.0664212 0.0441188 -0.6584084 0.0664212 0.0441188 -0.8219901 0.0671656 0.0455041 -0.8967447 0.0775151 0.0594506 -0.9325696 0.1002154 0.0860209 -0.9531389 0.1340017 0.1231452 -0.9661878 0.1775917 0.1694384 -0.9749962 0.2296253 0.2235962 -0.9811943 0.2885124 0.2841192 -0.9856839 0.3523802 0.3492254 -0.9890048 0.419125 0.4168922 -0.9914995 0.4865484 0.4849907 -0.9933953 0.5525411 0.5514695 -0.9948487 0.6152669 0.6145393 -0.9959706 0.6733015 0.6728136 -0.9968409 0.7257011 0.7253775 -0.9975189 0.7719959 0.7717834 -0.9980488 0.8121268 0.8119884 -0.9984638 0.8463492 0.8462598 -0.9987895 0.8751301 0.8750727 -0.9990455 0.8990542 0.8990175 -0.999247 0.9187495 0.9187262 -0.9994057 0.9348352 0.9348204 -0.9995308 0.9478878 0.9478785 -0.9996295 0.9584237 0.9584178 -0.9997074 0.9668922 0.9668884 -0.9997688 0.9736756 0.9736733 -0.9998174 0.9790946 0.9790931 -0.9998557 0.9834141 0.9834132 -0.999886 0.9868512 0.9868507 -0.9999099 0.9895825 0.9895821 -0.9999288 0.9917504 0.9917502 -0.9999437 0.9934697 0.9934695 -0.0000238 0.1327073 0.0821895 -0.0000382 0.1322038 0.081686 -0.0000611 0.1315716 0.0810538 -0.0000978 0.1307795 0.0802616 -0.0001565 0.1297896 0.0792718 -0.0002504 0.128557 0.0780392 -0.0004008 0.1270291 0.0765113 -0.0006416 0.1251466 0.0746288 -0.0010268 0.1228457 0.0723279 -0.0016435 0.120064 0.0695462 -0.0026305 0.1167517 0.0662338 -0.0042103 0.1128922 0.0623743 -0.0067388 0.1085393 0.0580214 -0.0107859 0.1038805 0.0533626 -0.0172633 0.099344 0.0488261 -0.0276309 0.0957773 0.0452595 -0.0441188 0.0946366 0.0441188 -0.0664212 0.0946366 0.0441188 -0.0946366 0.0946366 0.0441188 -0.1303328 0.0946366 0.0441188 -0.1754932 0.0946366 0.0441188 -0.2326269 0.0946366 0.0441188 -0.3049085 0.0946366 0.0441188 -0.3963542 0.0946366 0.0441188 -0.5120448 0.0946366 0.0441188 -0.6584084 0.0946366 0.0441188 -0.8219901 0.0945703 0.0455041 -0.8967447 0.1003691 0.0594506 -0.9325696 0.1181733 0.0860209 -0.9531389 0.1477366 0.1231452 -0.9661878 0.1879067 0.1694384 -0.9749962 0.2372529 0.2235962 -0.9811943 0.2940703 0.2841192 -0.9856839 0.3563715 0.3492254 -0.9890048 0.4219498 0.4168922 -0.9914995 0.4885191 0.4849907 -0.9933953 0.5538969 0.5514695 -0.9948487 0.6161874 0.6145393 -0.9959706 0.6739188 0.6728136 -0.9968409 0.7261105 0.7253775 -0.9975189 0.7722648 0.7717834 -0.9980488 0.8123018 0.8119884 -0.9984638 0.8464623 0.8462598 -0.9987895 0.8752028 0.8750727 -0.9990455 0.8991006 0.8990175 -0.999247 0.9187791 0.9187262 -0.9994057 0.9348539 0.9348204 -0.9995308 0.9478997 0.9478785 -0.9996295 0.9584312 0.9584178 -0.9997074 0.9668969 0.9668884 -0.9997688 0.9736786 0.9736733 -0.9998174 0.9790965 0.9790931 -0.9998557 0.9834153 0.9834132 -0.999886 0.986852 0.9868507 -0.9999099 0.9895829 0.9895821 -0.9999288 0.9917507 0.9917502 -0.9999437 0.9934698 0.9934695 -0.0000238 0.1684036 0.0821895 -0.0000382 0.1679 0.081686 -0.0000611 0.1672678 0.0810538 -0.0000978 0.1664757 0.0802616 -0.0001565 0.1654858 0.0792718 -0.0002504 0.1642532 0.0780392 -0.0004008 0.1627254 0.0765113 -0.0006416 0.1608428 0.0746288 -0.0010268 0.1585419 0.0723279 -0.0016435 0.1557603 0.0695462 -0.0026305 0.1524479 0.0662338 -0.0042103 0.1485884 0.0623743 -0.0067388 0.1442355 0.0580214 -0.0107859 0.1395767 0.0533626 -0.0172633 0.1350402 0.0488261 -0.0276309 0.1314736 0.0452595 -0.0441188 0.1303328 0.0441188 -0.0664212 0.1303328 0.0441188 -0.0946366 0.1303328 0.0441188 -0.1303328 0.1303328 0.0441188 -0.1754932 0.1303328 0.0441188 -0.2326269 0.1303328 0.0441188 -0.3049085 0.1303328 0.0441188 -0.3963542 0.1303328 0.0441188 -0.5120448 0.1303328 0.0441188 -0.6584084 0.1303328 0.0441188 -0.8219901 0.1292408 0.0455041 -0.8967447 0.1292823 0.0594506 -0.9325696 0.1408925 0.0860209 -0.9531389 0.1651131 0.1231452 -0.9661878 0.2009566 0.1694384 -0.9749962 0.2469027 0.2235962 -0.9811943 0.3011018 0.2841192 -0.9856839 0.3614209 0.3492254 -0.9890048 0.4255236 0.4168922 -0.9914995 0.4910123 0.4849907 -0.9933953 0.5556122 0.5514695 -0.9948487 0.6173519 0.6145393 -0.9959706 0.6746998 0.6728136 -0.9968409 0.7266285 0.7253775 -0.9975189 0.7726049 0.7717834 -0.9980488 0.8125232 0.8119884 -0.9984638 0.8466054 0.8462598 -0.9987895 0.8752947 0.8750727 -0.9990455 0.8991593 0.8990175 -0.999247 0.9188164 0.9187262 -0.9994057 0.9348776 0.9348204 -0.9995308 0.9479146 0.9478785 -0.9996295 0.9584406 0.9584178 -0.9997074 0.9669028 0.9668884 -0.9997688 0.9736823 0.9736733 -0.9998174 0.9790988 0.9790931 -0.9998557 0.9834167 0.9834132 -0.999886 0.9868529 0.9868507 -0.9999099 0.9895835 0.9895821 -0.9999288 0.991751 0.9917502 -0.9999437 0.9934701 0.9934695 -0.0000238 0.2135639 0.0821895 -0.0000382 0.2130604 0.081686 -0.0000611 0.2124282 0.0810538 -0.0000978 0.2116361 0.0802616 -0.0001565 0.2106462 0.0792718 -0.0002504 0.2094136 0.0780392 -0.0004008 0.2078857 0.0765113 -0.0006416 0.2060032 0.0746288 -0.0010268 0.2037023 0.0723279 -0.0016435 0.2009206 0.0695462 -0.0026305 0.1976083 0.0662338 -0.0042103 0.1937488 0.0623743 -0.0067388 0.1893959 0.0580214 -0.0107859 0.1847371 0.0533626 -0.0172633 0.1802005 0.0488261 -0.0276309 0.1766339 0.0452595 -0.0441188 0.1754932 0.0441188 -0.0664212 0.1754932 0.0441188 -0.0946366 0.1754932 0.0441188 -0.1303328 0.1754932 0.0441188 -0.1754932 0.1754932 0.0441188 -0.2326269 0.1754932 0.0441188 -0.3049085 0.1754932 0.0441188 -0.3963542 0.1754932 0.0441188 -0.5120448 0.1754932 0.0441188 -0.6584084 0.1754932 0.0441188 -0.8219901 0.1731034 0.0455041 -0.8967447 0.1658613 0.0594506 -0.9325696 0.1696351 0.0860209 -0.9531389 0.1870965 0.1231452 -0.9661878 0.2174663 0.1694384 -0.9749962 0.2591111 0.2235962 -0.9811943 0.3099976 0.2841192 -0.9856839 0.3678092 0.3492254 -0.9890048 0.4300448 0.4168922 -0.9914995 0.4941665 0.4849907 -0.9933953 0.5577822 0.5514695 -0.9948487 0.6188252 0.6145393 -0.9959706 0.6756878 0.6728136 -0.9968409 0.7272837 0.7253775 -0.9975189 0.7730352 0.7717834 -0.9980488 0.8128033 0.8119884 -0.9984638 0.8467864 0.8462598 -0.9987895 0.8754109 0.8750727 -0.9990455 0.8992336 0.8990175 -0.999247 0.9188636 0.9187262 -0.9994057 0.9349075 0.9348204 -0.9995308 0.9479335 0.9478785 -0.9996295 0.9584526 0.9584178 -0.9997074 0.9669103 0.9668884 -0.9997688 0.973687 0.9736733 -0.9998174 0.9791018 0.9790931 -0.9998557 0.9834186 0.9834132 -0.999886 0.9868541 0.9868507 -0.9999099 0.9895842 0.9895821 -0.9999288 0.9917515 0.9917502 -0.9999437 0.9934704 0.9934695 -0.0000238 0.2706977 0.0821895 -0.0000382 0.2701941 0.081686 -0.0000611 0.2695619 0.0810538 -0.0000978 0.2687698 0.0802616 -0.0001565 0.2677799 0.0792718 -0.0002504 0.2665473 0.0780392 -0.0004008 0.2650195 0.0765113 -0.0006416 0.2631369 0.0746288 -0.0010268 0.260836 0.0723279 -0.0016435 0.2580543 0.0695462 -0.0026305 0.254742 0.0662338 -0.0042103 0.2508825 0.0623743 -0.0067388 0.2465296 0.0580214 -0.0107859 0.2418708 0.0533626 -0.0172633 0.2373343 0.0488261 -0.0276309 0.2337676 0.0452595 -0.0441188 0.2326269 0.0441188 -0.0664212 0.2326269 0.0441188 -0.0946366 0.2326269 0.0441188 -0.1303328 0.2326269 0.0441188 -0.1754932 0.2326269 0.0441188 -0.2326269 0.2326269 0.0441188 -0.3049085 0.2326269 0.0441188 -0.3963542 0.2326269 0.0441188 -0.5120448 0.2326269 0.0441188 -0.6584084 0.2326269 0.0441188 -0.8219901 0.2285954 0.0455041 -0.8967447 0.2121385 0.0594506 -0.9325696 0.2059983 0.0860209 -0.9531389 0.2149085 0.1231452 -0.9661878 0.2383533 0.1694384 -0.9749962 0.2745562 0.2235962 -0.9811943 0.3212519 0.2841192 -0.9856839 0.3758911 0.3492254 -0.9890048 0.4357648 0.4168922 -0.9914995 0.498157 0.4849907 -0.9933953 0.5605276 0.5514695 -0.9948487 0.6206891 0.6145393 -0.9959706 0.6769378 0.6728136 -0.9968409 0.7281127 0.7253775 -0.9975189 0.7735795 0.7717834 -0.9980488 0.8131577 0.8119884 -0.9984638 0.8470154 0.8462598 -0.9987895 0.875558 0.8750727 -0.9990455 0.8993275 0.8990175 -0.999247 0.9189234 0.9187262 -0.9994057 0.9349454 0.9348204 -0.9995308 0.9479575 0.9478785 -0.9996295 0.9584677 0.9584178 -0.9997074 0.9669198 0.9668884 -0.9997688 0.973693 0.9736733 -0.9998174 0.9791055 0.9790931 -0.9998557 0.9834209 0.9834132 -0.999886 0.9868555 0.9868507 -0.9999099 0.9895851 0.9895821 -0.9999288 0.9917521 0.9917502 -0.9999437 0.9934707 0.9934695 -0.0000238 0.3429792 0.0821895 -0.0000382 0.3424757 0.081686 -0.0000611 0.3418435 0.0810538 -0.0000978 0.3410514 0.0802616 -0.0001565 0.3400615 0.0792718 -0.0002504 0.3388289 0.0780392 -0.0004008 0.337301 0.0765113 -0.0006416 0.3354185 0.0746288 -0.0010268 0.3331176 0.0723279 -0.0016435 0.3303359 0.0695462 -0.0026305 0.3270236 0.0662338 -0.0042103 0.3231641 0.0623743 -0.0067388 0.3188112 0.0580214 -0.0107859 0.3141524 0.0533626 -0.0172633 0.3096159 0.0488261 -0.0276309 0.3060492 0.0452595 -0.0441188 0.3049085 0.0441188 -0.0664212 0.3049085 0.0441188 -0.0946366 0.3049085 0.0441188 -0.1303328 0.3049085 0.0441188 -0.1754932 0.3049085 0.0441188 -0.2326269 0.3049085 0.0441188 -0.3049085 0.3049085 0.0441188 -0.3963542 0.3049085 0.0441188 -0.5120448 0.3049085 0.0441188 -0.6584084 0.3049085 0.0441188 -0.8219901 0.2988 0.0455041 -0.8967447 0.2706852 0.0594506 -0.9325696 0.2520025 0.0860209 -0.9531389 0.2500942 0.1231452 -0.9661878 0.2647781 0.1694384 -0.9749962 0.2940963 0.2235962 -0.9811943 0.3354901 0.2841192 -0.9856839 0.3861159 0.3492254 -0.9890048 0.4430013 0.4168922 -0.9914995 0.5032055 0.4849907 -0.9933953 0.5640008 0.5514695 -0.9948487 0.6230471 0.6145393 -0.9959706 0.6785192 0.6728136 -0.9968409 0.7291615 0.7253775 -0.9975189 0.7742682 0.7717834 -0.9980488 0.8136061 0.8119884 -0.9984638 0.8473052 0.8462598 -0.9987895 0.8757441 0.8750727 -0.9990455 0.8994464 0.8990175 -0.999247 0.918999 0.9187262 -0.9994057 0.9349933 0.9348204 -0.9995308 0.9479878 0.9478785 -0.9996295 0.9584868 0.9584178 -0.9997074 0.9669318 0.9668884 -0.9997688 0.9737006 0.9736733 -0.9998174 0.9791103 0.9790931 -0.9998557 0.9834239 0.9834132 -0.999886 0.9868574 0.9868507 -0.9999099 0.9895863 0.9895821 -0.9999288 0.9917528 0.9917502 -0.9999437 0.9934712 0.9934695 -0.0000238 0.4344249 0.0821895 -0.0000382 0.4339214 0.081686 -0.0000611 0.4332891 0.0810538 -0.0000978 0.432497 0.0802616 -0.0001565 0.4315072 0.0792718 -0.0002504 0.4302746 0.0780392 -0.0004008 0.4287467 0.0765113 -0.0006416 0.4268641 0.0746288 -0.0010268 0.4245633 0.0723279 -0.0016435 0.4217816 0.0695462 -0.0026305 0.4184692 0.0662338 -0.0042103 0.4146097 0.0623743 -0.0067388 0.4102568 0.0580214 -0.0107859 0.405598 0.0533626 -0.0172633 0.4010615 0.0488261 -0.0276309 0.3974949 0.0452595 -0.0441188 0.3963542 0.0441188 -0.0664212 0.3963542 0.0441188 -0.0946366 0.3963542 0.0441188 -0.1303328 0.3963542 0.0441188 -0.1754932 0.3963542 0.0441188 -0.2326269 0.3963542 0.0441188 -0.3049085 0.3963542 0.0441188 -0.3963542 0.3963542 0.0441188 -0.5120448 0.3963542 0.0441188 -0.6584084 0.3963542 0.0441188 -0.8219901 0.3876179 0.0455041 -0.8967447 0.3447543 0.0594506 -0.9325696 0.3102037 0.0860209 -0.9531389 0.2946088 0.1231452 -0.9661878 0.2982089 0.1694384 -0.9749962 0.3188171 0.2235962 -0.9811943 0.3535032 0.2841192 -0.9856839 0.3990515 0.3492254 -0.9890048 0.4521565 0.4168922 -0.9914995 0.5095925 0.4849907 -0.9933953 0.5683949 0.5514695 -0.9948487 0.6260304 0.6145393 -0.9959706 0.6805199 0.6728136 -0.9968409 0.7304884 0.7253775 -0.9975189 0.7751395 0.7717834 -0.9980488 0.8141733 0.8119884 -0.9984638 0.8476717 0.8462598 -0.9987895 0.8759795 0.8750727 -0.9990455 0.8995968 0.8990175 -0.999247 0.9190947 0.9187262 -0.9994057 0.935054 0.9348204 -0.9995308 0.9480261 0.9478785 -0.9996295 0.9585109 0.9584178 -0.9997074 0.966947 0.9668884 -0.9997688 0.9737101 0.9736733 -0.9998174 0.9791163 0.9790931 -0.9998557 0.9834277 0.9834132 -0.999886 0.9868597 0.9868507 -0.9999099 0.9895878 0.9895821 -0.9999288 0.9917537 0.9917502 -0.9999437 0.9934718 0.9934695 -0.0000238 0.5501155 0.0821895 -0.0000382 0.549612 0.081686 -0.0000611 0.5489798 0.0810538 -0.0000978 0.5481876 0.0802616 -0.0001565 0.5471978 0.0792718 -0.0002504 0.5459652 0.0780392 -0.0004008 0.5444373 0.0765113 -0.0006416 0.5425548 0.0746288 -0.0010268 0.5402539 0.0723279 -0.0016435 0.5374722 0.0695462 -0.0026305 0.5341598 0.0662338 -0.0042103 0.5303003 0.0623743 -0.0067388 0.5259474 0.0580214 -0.0107859 0.5212886 0.0533626 -0.0172633 0.5167521 0.0488261 -0.0276309 0.5131855 0.0452595 -0.0441188 0.5120448 0.0441188 -0.0664212 0.5120448 0.0441188 -0.0946366 0.5120448 0.0441188 -0.1303328 0.5120448 0.0441188 -0.1754932 0.5120448 0.0441188 -0.2326269 0.5120448 0.0441188 -0.3049085 0.5120448 0.0441188 -0.3963542 0.5120448 0.0441188 -0.5120448 0.5120448 0.0441188 -0.6584084 0.5120448 0.0441188 -0.8219901 0.4999841 0.0455041 -0.8967447 0.4384614 0.0594506 -0.9325696 0.3838358 0.0860209 -0.9531389 0.3509254 0.1231452 -0.9661878 0.3405032 0.1694384 -0.9749962 0.3500921 0.2235962 -0.9811943 0.3762922 0.2841192 -0.9856839 0.4154167 0.3492254 -0.9890048 0.4637389 0.4168922 -0.9914995 0.5176729 0.4849907 -0.9933953 0.573954 0.5514695 -0.9948487 0.6298046 0.6145393 -0.9959706 0.683051 0.6728136 -0.9968409 0.732167 0.7253775 -0.9975189 0.7762418 0.7717834 -0.9980488 0.8148909 0.8119884 -0.9984638 0.8481355 0.8462598 -0.9987895 0.8762773 0.8750727 -0.9990455 0.899787 0.8990175 -0.999247 0.9192157 0.9187262 -0.9994057 0.9351307 0.9348204 -0.9995308 0.9480746 0.9478785 -0.9996295 0.9585415 0.9584178 -0.9997074 0.9669663 0.9668884 -0.9997688 0.9737222 0.9736733 -0.9998174 0.9791238 0.9790931 -0.9998557 0.9834324 0.9834132 -0.999886 0.9868627 0.9868507 -0.9999099 0.9895897 0.9895821 -0.9999288 0.9917549 0.9917502 -0.9999437 0.9934725 0.9934695 -0.0000238 0.6964791 0.0821895 -0.0000382 0.6959756 0.081686 -0.0000611 0.6953434 0.0810538 -0.0000978 0.6945513 0.0802616 -0.0001565 0.6935614 0.0792718 -0.0002504 0.6923288 0.0780392 -0.0004008 0.6908009 0.0765113 -0.0006416 0.6889184 0.0746288 -0.0010268 0.6866175 0.0723279 -0.0016435 0.6838358 0.0695462 -0.0026305 0.6805235 0.0662338 -0.0042103 0.676664 0.0623743 -0.0067388 0.6723111 0.0580214 -0.0107859 0.6676523 0.0533626 -0.0172633 0.6631157 0.0488261 -0.0276309 0.6595491 0.0452595 -0.0441188 0.6584084 0.0441188 -0.0664212 0.6584084 0.0441188 -0.0946366 0.6584084 0.0441188 -0.1303328 0.6584084 0.0441188 -0.1754932 0.6584084 0.0441188 -0.2326269 0.6584084 0.0441188 -0.3049085 0.6584084 0.0441188 -0.3963542 0.6584084 0.0441188 -0.5120448 0.6584084 0.0441188 -0.6584084 0.6584084 0.0441188 -0.8219901 0.6421419 0.0455041 -0.8967447 0.557013 0.0594506 -0.9325696 0.4769901 0.0860209 -0.9531389 0.4221733 0.1231452 -0.9661878 0.3940109 0.1694384 -0.9749962 0.389659 0.2235962 -0.9811943 0.4051232 0.2841192 -0.9856839 0.4361208 0.3492254 -0.9890048 0.4783922 0.4168922 -0.9914995 0.5278957 0.4849907 -0.9933953 0.580987 0.5514695 -0.9948487 0.6345795 0.6145393 -0.9959706 0.6862532 0.6728136 -0.9968409 0.7342907 0.7253775 -0.9975189 0.7776364 0.7717834 -0.9980488 0.8157988 0.8119884 -0.9984638 0.8487222 0.8462598 -0.9987895 0.8766541 0.8750727 -0.9990455 0.9000277 0.8990175 -0.999247 0.9193688 0.9187262 -0.9994057 0.9352277 0.9348204 -0.9995308 0.9481359 0.9478785 -0.9996295 0.9585802 0.9584178 -0.9997074 0.9669906 0.9668884 -0.9997688 0.9737375 0.9736733 -0.9998174 0.9791334 0.9790931 -0.9998557 0.9834385 0.9834132 -0.999886 0.9868665 0.9868507 -0.9999099 0.989592 0.9895821 -0.9999288 0.9917564 0.9917502 -0.9999437 0.9934734 0.9934695 -0.0051514 0.8407292 0.0830256 -0.0051286 0.8405071 0.082539 -0.0051047 0.8402274 0.0819276 -0.0050826 0.8398756 0.081161 -0.0050676 0.8394338 0.080202 -0.0050694 0.8388802 0.0790064 -0.0051048 0.8381886 0.0775221 -0.0052028 0.8373283 0.0756899 -0.0054121 0.8362644 0.0734453 -0.0058134 0.8349593 0.0707243 -0.0065402 0.8333779 0.0674739 -0.0078103 0.8314967 0.0636727 -0.0099781 0.8293233 0.0593681 -0.0136166 0.8269342 0.0547413 -0.0196467 0.8245426 0.0502171 -0.0295373 0.8226154 0.0466479 -0.0455041 0.8219901 0.0455041 -0.0671656 0.8219901 0.0455041 -0.0945703 0.8219901 0.0455041 -0.1292408 0.8219901 0.0455041 -0.1731034 0.8219901 0.0455041 -0.2285954 0.8219901 0.0455041 -0.2988 0.8219901 0.0455041 -0.3876179 0.8219901 0.0455041 -0.4999841 0.8219901 0.0455041 -0.6421419 0.8219901 0.0455041 -0.8219901 0.8219901 0.0455041 -0.8967447 0.7069963 0.0594506 -0.9325696 0.5948423 0.0860209 -0.9531389 0.5123112 0.1231452 -0.9661878 0.4617052 0.1694384 -0.9749962 0.4397163 0.2235962 -0.9811943 0.4415982 0.2841192 -0.9856839 0.4623142 0.3492254 -0.9890048 0.4969305 0.4168922 -0.9914995 0.5408288 0.4849907 -0.9933953 0.5898847 0.5514695 -0.9948487 0.6406203 0.6145393 -0.9959706 0.6903044 0.6728136 -0.9968409 0.7369774 0.7253775 -0.9975189 0.7794007 0.7717834 -0.9980488 0.8169474 0.8119884 -0.9984638 0.8494644 0.8462598 -0.9987895 0.8771307 0.8750727 -0.9990455 0.9003323 0.8990175 -0.999247 0.9195625 0.9187262 -0.9994057 0.9353505 0.9348204 -0.9995308 0.9482135 0.9478785 -0.9996295 0.9586291 0.9584178 -0.9997074 0.9670214 0.9668884 -0.9997688 0.9737569 0.9736733 -0.9998174 0.9791456 0.9790931 -0.9998557 0.9834461 0.9834132 -0.999886 0.9868713 0.9868507 -0.9999099 0.989595 0.9895821 -0.9999288 0.9917582 0.9917502 -0.9999437 0.9934746 0.9934695 -0.0279321 0.9033413 0.0923908 -0.0278872 0.9032596 0.0919666 -0.0278347 0.9031567 0.0914336 -0.0277752 0.9030276 0.0907651 -0.0277111 0.9028657 0.0899287 -0.0276479 0.9026634 0.0888856 -0.0275966 0.9024114 0.08759 -0.0275778 0.9020992 0.0859897 -0.0276281 0.9017148 0.0840281 -0.0278105 0.9012461 0.0816479 -0.0282324 0.900682 0.0788014 -0.0290732 0.9000167 0.0754678 -0.0306306 0.8992555 0.0716861 -0.0333932 0.8984278 0.0676127 -0.0381561 0.8976087 0.0636203 -0.0461985 0.8969554 0.0604636 -0.0594506 0.8967447 0.0594506 -0.0775151 0.8967447 0.0594506 -0.1003691 0.8967447 0.0594506 -0.1292823 0.8967447 0.0594506 -0.1658613 0.8967447 0.0594506 -0.2121385 0.8967447 0.0594506 -0.2706852 0.8967447 0.0594506 -0.3447543 0.8967447 0.0594506 -0.4384614 0.8967447 0.0594506 -0.557013 0.8967447 0.0594506 -0.7069963 0.8967447 0.0594506 -0.8967447 0.8967447 0.0594506 -0.9325696 0.7439407 0.0860209 -0.9531389 0.6263473 0.1231452 -0.9661878 0.5473473 0.1694384 -0.9749962 0.5030453 0.2235962 -0.9811943 0.4877437 0.2841192 -0.9856839 0.4954523 0.3492254 -0.9890048 0.5203839 0.4168922 -0.9914995 0.5571908 0.4849907 -0.9933953 0.6011414 0.5514695 -0.9948487 0.6482627 0.6145393 -0.9959706 0.6954296 0.6728136 -0.9968409 0.7403765 0.7253775 -0.9975189 0.7816327 0.7717834 -0.9980488 0.8184005 0.8119884 -0.9984638 0.8504035 0.8462598 -0.9987895 0.8777338 0.8750727 -0.9990455 0.9007175 0.8990175 -0.999247 0.9198076 0.9187262 -0.9994057 0.9355059 0.9348204 -0.9995308 0.9483117 0.9478785 -0.9996295 0.958691 0.9584178 -0.9997074 0.9670604 0.9668884 -0.9997688 0.9737814 0.9736733 -0.9998174 0.979161 0.9790931 -0.9998557 0.9834557 0.9834132 -0.999886 0.9868773 0.9868507 -0.9999099 0.9895988 0.9895821 -0.9999288 0.9917606 0.9917502 -0.9999437 0.9934761 0.9934695 -0.0624569 0.9354466 0.1132477 -0.0624063 0.9354101 0.1128963 -0.0623458 0.9353643 0.1124547 -0.0622749 0.9353068 0.1119009 -0.0621943 0.9352348 0.1112082 -0.0621069 0.9351449 0.1103442 -0.0620199 0.9350332 0.1092715 -0.0619473 0.9348949 0.1079468 -0.061916 0.9347252 0.1063233 -0.0619734 0.9345187 0.1043541 -0.062202 0.9342712 0.102 -0.062742 0.9339805 0.0992443 -0.0638283 0.9336494 0.0961197 -0.0658501 0.9332914 0.0927559 -0.0694453 0.9329391 0.0894608 -0.0756464 0.9326595 0.0868564 -0.0860209 0.9325696 0.0860209 -0.1002154 0.9325696 0.0860209 -0.1181733 0.9325696 0.0860209 -0.1408925 0.9325696 0.0860209 -0.1696351 0.9325696 0.0860209 -0.2059983 0.9325696 0.0860209 -0.2520025 0.9325696 0.0860209 -0.3102037 0.9325696 0.0860209 -0.3838358 0.9325696 0.0860209 -0.4769901 0.9325696 0.0860209 -0.5948423 0.9325696 0.0860209 -0.7439407 0.9325696 0.0860209 -0.9325696 0.9325696 0.0860209 -0.9531389 0.7706179 0.1231452 -0.9661878 0.6556956 0.1694384 -0.9749962 0.5831647 0.2235962 -0.9811943 0.5461239 0.2841192 -0.9856839 0.5373763 0.3492254 -0.9890048 0.5500554 0.4168922 -0.9914995 0.577891 0.4849907 -0.9933953 0.6153825 0.5514695 -0.9948487 0.6579314 0.6145393 -0.9959706 0.7019138 0.6728136 -0.9968409 0.7446768 0.7253775 -0.9975189 0.7844566 0.7717834 -0.9980488 0.8202389 0.8119884 -0.9984638 0.8515915 0.8462598 -0.9987895 0.8784967 0.8750727 -0.9990455 0.9012049 0.8990175 -0.999247 0.9201176 0.9187262 -0.9994057 0.9357024 0.9348204 -0.9995308 0.9484359 0.9478785 -0.9996295 0.9587693 0.9584178 -0.9997074 0.9671097 0.9668884 -0.9997688 0.9738123 0.9736733 -0.9998174 0.9791804 0.9790931 -0.9998557 0.9834679 0.9834132 -0.999886 0.986885 0.9868507 -0.9999099 0.9896036 0.9895821 -0.9999288 0.9917636 0.9917502 -0.9999437 0.9934779 0.9934695 -0.1059991 0.9545467 0.1450104 -0.1059489 0.9545286 0.1447271 -0.1058883 0.9545059 0.1443712 -0.1058162 0.9544774 0.1439249 -0.1057322 0.9544418 0.1433666 -0.1056375 0.9543974 0.1426706 -0.1055364 0.9543421 0.1418066 -0.1054384 0.9542739 0.1407401 -0.1053624 0.9541902 0.1394336 -0.1053433 0.9540886 0.1378497 -0.1054431 0.9539671 0.1359573 -0.1057683 0.9538247 0.1337437 -0.1064997 0.953663 0.1312358 -0.1079385 0.9534887 0.1285384 -0.1105818 0.9533177 0.1258985 -0.1152388 0.9531823 0.1238137 -0.1231452 0.9531389 0.1231452 -0.1340017 0.9531389 0.1231452 -0.1477366 0.9531389 0.1231452 -0.1651131 0.9531389 0.1231452 -0.1870965 0.9531389 0.1231452 -0.2149085 0.9531389 0.1231452 -0.2500942 0.9531389 0.1231452 -0.2946088 0.9531389 0.1231452 -0.3509254 0.9531389 0.1231452 -0.4221733 0.9531389 0.1231452 -0.5123112 0.9531389 0.1231452 -0.6263473 0.9531389 0.1231452 -0.7706179 0.9531389 0.1231452 -0.9531389 0.9531389 0.1231452 -0.9661878 0.7927704 0.1694384 -0.9749962 0.6845262 0.2235962 -0.9811943 0.6199824 0.2841192 -0.9856839 0.5904156 0.3492254 -0.9890048 0.5875938 0.4168922 -0.9914995 0.6040793 0.4849907 -0.9933953 0.6333995 0.5514695 -0.9948487 0.6701635 0.6145393 -0.9959706 0.710117 0.6728136 -0.9968409 0.7501172 0.7253775 -0.9975189 0.7880291 0.7717834 -0.9980488 0.8225647 0.8119884 -0.9984638 0.8530945 0.8462598 -0.9987895 0.8794619 0.8750727 -0.9990455 0.9018215 0.8990175 -0.999247 0.9205098 0.9187262 -0.9994057 0.935951 0.9348204 -0.9995308 0.9485931 0.9478785 -0.9996295 0.9588684 0.9584178 -0.9997074 0.967172 0.9668884 -0.9997688 0.9738515 0.9736733 -0.9998174 0.979205 0.9790931 -0.9998557 0.9834833 0.9834132 -0.999886 0.9868946 0.9868507 -0.9999099 0.9896096 0.9895821 -0.9999288 0.9917674 0.9917502 -0.9999437 0.9934803 0.9934695 -0.1572498 0.9669269 0.1866663 -0.1572031 0.9669173 0.1864423 -0.1571463 0.9669053 0.1861609 -0.1570779 0.9668902 0.185808 -0.1569971 0.9668714 0.1853668 -0.156904 0.9668479 0.1848168 -0.1568008 0.9668187 0.1841341 -0.1566936 0.9667827 0.1832918 -0.1565954 0.9667385 0.1822603 -0.1565315 0.966685 0.1810104 -0.1565473 0.9666211 0.1795179 -0.1567226 0.9665463 0.1777733 -0.1571937 0.9664615 0.1757984 -0.15819 0.9663702 0.1736761 -0.160092 0.9662809 0.1716008 -0.1635226 0.9662104 0.1699632 -0.1694384 0.9661878 0.1694384 -0.1775917 0.9661878 0.1694384 -0.1879067 0.9661878 0.1694384 -0.2009566 0.9661878 0.1694384 -0.2174663 0.9661878 0.1694384 -0.2383533 0.9661878 0.1694384 -0.2647781 0.9661878 0.1694384 -0.2982089 0.9661878 0.1694384 -0.3405032 0.9661878 0.1694384 -0.3940109 0.9661878 0.1694384 -0.4617052 0.9661878 0.1694384 -0.5473473 0.9661878 0.1694384 -0.6556956 0.9661878 0.1694384 -0.7927704 0.9661878 0.1694384 -0.9661878 0.9661878 0.1694384 -0.9749962 0.8127617 0.2235962 -0.9811943 0.713423 0.2841192 -0.9856839 0.6575172 0.3492254 -0.9890048 0.6350848 0.4168922 -0.9914995 0.637211 0.4849907 -0.9933953 0.6561933 0.5514695 -0.9948487 0.6856388 0.6145393 -0.9959706 0.7204952 0.6728136 -0.9968409 0.757 0.7253775 -0.9975189 0.7925488 0.7717834 -0.9980488 0.8255071 0.8119884 -0.9984638 0.8549959 0.8462598 -0.9987895 0.880683 0.8750727 -0.9990455 0.9026016 0.8990175 -0.999247 0.9210061 0.9187262 -0.9994057 0.9362655 0.9348204 -0.9995308 0.9487918 0.9478785 -0.9996295 0.9589938 0.9584178 -0.9997074 0.9672509 0.9668884 -0.9997688 0.9739011 0.9736733 -0.9998174 0.9792361 0.9790931 -0.9998557 0.9835029 0.9834132 -0.999886 0.9869069 0.9868507 -0.9999099 0.9896173 0.9895821 -0.9999288 0.9917722 0.9917502 -0.9999437 0.9934833 0.9934695 -0.2151269 0.9754027 0.236956 -0.2150852 0.9753975 0.2367818 -0.2150342 0.9753908 0.2365629 -0.2149725 0.9753825 0.2362885 -0.2148987 0.9753721 0.2359454 -0.2148124 0.9753591 0.2355177 -0.2147144 0.975343 0.2349871 -0.2146085 0.9753231 0.2343326 -0.2145034 0.9752987 0.2335313 -0.2144168 0.9752692 0.2325608 -0.2143816 0.975234 0.2314025 -0.2144566 0.9751928 0.2300493 -0.2147432 0.9751462 0.2285185 -0.2154135 0.9750962 0.2268747 -0.2167545 0.9750472 0.2252686 -0.2192389 0.9750086 0.224002 -0.2235962 0.9749962 0.2235962 -0.2296253 0.9749962 0.2235962 -0.2372529 0.9749962 0.2235962 -0.2469027 0.9749962 0.2235962 -0.2591111 0.9749962 0.2235962 -0.2745562 0.9749962 0.2235962 -0.2940963 0.9749962 0.2235962 -0.3188171 0.9749962 0.2235962 -0.3500921 0.9749962 0.2235962 -0.389659 0.9749962 0.2235962 -0.4397163 0.9749962 0.2235962 -0.5030453 0.9749962 0.2235962 -0.5831647 0.9749962 0.2235962 -0.6845262 0.9749962 0.2235962 -0.8127617 0.9749962 0.2235962 -0.9749962 0.9749962 0.2235962 -0.9811943 0.8316375 0.2841192 -0.9856839 0.7424095 0.3492254 -0.9890048 0.695167 0.4168922 -0.9914995 0.6791269 0.4849907 -0.9933953 0.6850303 0.5514695 -0.9948487 0.7052169 0.6145393 -0.9959706 0.733625 0.6728136 -0.9968409 0.7657077 0.7253775 -0.9975189 0.7982669 0.7717834 -0.9980488 0.8292297 0.8119884 -0.9984638 0.8574015 0.8462598 -0.9987895 0.8822279 0.8750727 -0.9990455 0.9035886 0.8990175 -0.999247 0.9216339 0.9187262 -0.9994057 0.9366635 0.9348204 -0.9995308 0.9490434 0.9478785 -0.9996295 0.9591524 0.9584178 -0.9997074 0.9673508 0.9668884 -0.9997688 0.9739638 0.9736733 -0.9998174 0.9792755 0.9790931 -0.9998557 0.9835276 0.9834132 -0.999886 0.9869223 0.9868507 -0.9999099 0.989627 0.9895821 -0.9999288 0.9917782 0.9917502 -0.9999437 0.9934871 0.9934695 -0.2783684 0.9814251 0.294322 -0.2783325 0.9814221 0.2941886 -0.2782884 0.9814183 0.294021 -0.2782347 0.9814136 0.293811 -0.2781701 0.9814076 0.2935483 -0.2780936 0.9814002 0.2932211 -0.2780055 0.9813911 0.2928151 -0.2779077 0.9813797 0.2923143 -0.2778058 0.9813659 0.2917015 -0.2777122 0.9813491 0.2909596 -0.2776503 0.9813291 0.2900744 -0.2776626 0.9813057 0.2890408 -0.2778236 0.9812792 0.2878722 -0.2782606 0.9812508 0.2866181 -0.2791873 0.9812231 0.2853935 -0.2809573 0.9812013 0.2844283 -0.2841192 0.9811943 0.2841192 -0.2885124 0.9811943 0.2841192 -0.2940703 0.9811943 0.2841192 -0.3011018 0.9811943 0.2841192 -0.3099976 0.9811943 0.2841192 -0.3212519 0.9811943 0.2841192 -0.3354901 0.9811943 0.2841192 -0.3535032 0.9811943 0.2841192 -0.3762922 0.9811943 0.2841192 -0.4051232 0.9811943 0.2841192 -0.4415982 0.9811943 0.2841192 -0.4877437 0.9811943 0.2841192 -0.5461239 0.9811943 0.2841192 -0.6199824 0.9811943 0.2841192 -0.713423 0.9811943 0.2841192 -0.8316375 0.9811943 0.2841192 -0.9811943 0.9811943 0.2841192 -0.9856839 0.8498092 0.3492254 -0.9890048 0.7711789 0.4168922 -0.9914995 0.7321559 0.4849907 -0.9933953 0.721513 0.5514695 -0.9948487 0.7299859 0.6145393 -0.9959706 0.7502359 0.6728136 -0.9968409 0.776724 0.7253775 -0.9975189 0.8055009 0.7717834 -0.9980488 0.8339392 0.8119884 -0.9984638 0.8604449 0.8462598 -0.9987895 0.8841823 0.8750727 -0.9990455 0.9048372 0.8990175 -0.999247 0.9224281 0.9187262 -0.9994057 0.9371669 0.9348204 -0.9995308 0.9493615 0.9478785 -0.9996295 0.959353 0.9584178 -0.9997074 0.967477 0.9668884 -0.9997688 0.9740432 0.9736733 -0.9998174 0.9793253 0.9790931 -0.9998557 0.9835588 0.9834132 -0.999886 0.9869419 0.9868507 -0.9999099 0.9896392 0.9895821 -0.9999288 0.9917859 0.9917502 -0.9999437 0.9934919 0.9934695 -0.3454107 0.9858181 0.3568959 -0.3453807 0.9858163 0.3567954 -0.3453439 0.9858141 0.3566692 -0.3452987 0.9858113 0.3565109 -0.3452442 0.9858079 0.3563131 -0.3451791 0.9858036 0.3560667 -0.3451032 0.9857982 0.3557609 -0.3450175 0.9857916 0.355384 -0.3449254 0.9857835 0.3549227 -0.3448353 0.9857738 0.3543644 -0.3447636 0.9857621 0.3536986 -0.3447407 0.9857485 0.3529214 -0.3448204 0.9857332 0.3520431 -0.3450957 0.9857167 0.351101 -0.3457234 0.9857006 0.3501816 -0.3469645 0.9856879 0.3494573 -0.3492254 0.9856839 0.3492254 -0.3523802 0.9856839 0.3492254 -0.3563715 0.9856839 0.3492254 -0.3614209 0.9856839 0.3492254 -0.3678092 0.9856839 0.3492254 -0.3758911 0.9856839 0.3492254 -0.3861159 0.9856839 0.3492254 -0.3990515 0.9856839 0.3492254 -0.4154167 0.9856839 0.3492254 -0.4361208 0.9856839 0.3492254 -0.4623142 0.9856839 0.3492254 -0.4954523 0.9856839 0.3492254 -0.5373763 0.9856839 0.3492254 -0.5904156 0.9856839 0.3492254 -0.6575172 0.9856839 0.3492254 -0.7424095 0.9856839 0.3492254 -0.8498092 0.9856839 0.3492254 -0.9856839 0.9856839 0.3492254 -0.9890048 0.8673437 0.4168922 -0.9914995 0.7992446 0.4849907 -0.9933953 0.7676683 0.5514695 -0.9948487 0.7613218 0.6145393 -0.9959706 0.7712508 0.6728136 -0.9968409 0.7906611 0.7253775 -0.9975189 0.8146529 0.7717834 -0.9980488 0.8398974 0.8119884 -0.9984638 0.8642952 0.8462598 -0.9987895 0.886655 0.8750727 -0.9990455 0.9064168 0.8990175 -0.999247 0.9234329 0.9187262 -0.9994057 0.9378038 0.9348204 -0.9995308 0.9497641 0.9478785 -0.9996295 0.9596068 0.9584178 -0.9997074 0.9676368 0.9668884 -0.9997688 0.9741436 0.9736733 -0.9998174 0.9793883 0.9790931 -0.9998557 0.9835983 0.9834132 -0.999886 0.9869667 0.9868507 -0.9999099 0.9896547 0.9895821 -0.9999288 0.9917956 0.9917502 -0.9999437 0.993498 0.9934695 -0.4144197 0.9890841 0.4225654 -0.4143955 0.9890831 0.4224909 -0.4143657 0.9890818 0.4223974 -0.414329 0.9890801 0.4222801 -0.4142845 0.9890781 0.4221336 -0.4142311 0.9890755 0.4219511 -0.4141683 0.9890723 0.4217247 -0.4140964 0.9890684 0.4214456 -0.4140176 0.9890637 0.4211041 -0.4139373 0.9890579 0.4206909 -0.4138668 0.989051 0.4201982 -0.4138277 0.989043 0.4196234 -0.4138582 0.9890339 0.418974 -0.4140252 0.9890241 0.4182777 -0.4144423 0.9890146 0.4175984 -0.4152991 0.9890072 0.4170635 -0.4168922 0.9890048 0.4168922 -0.419125 0.9890048 0.4168922 -0.4219498 0.9890048 0.4168922 -0.4255236 0.9890048 0.4168922 -0.4300448 0.9890048 0.4168922 -0.4357648 0.9890048 0.4168922 -0.4430013 0.9890048 0.4168922 -0.4521565 0.9890048 0.4168922 -0.4637389 0.9890048 0.4168922 -0.4783922 0.9890048 0.4168922 -0.4969305 0.9890048 0.4168922 -0.5203839 0.9890048 0.4168922 -0.5500554 0.9890048 0.4168922 -0.5875938 0.9890048 0.4168922 -0.6350848 0.9890048 0.4168922 -0.695167 0.9890048 0.4168922 -0.7711789 0.9890048 0.4168922 -0.8673437 0.9890048 0.4168922 -0.9890048 0.9890048 0.4168922 -0.9914995 0.8841204 0.4849907 -0.9933953 0.8260608 0.5514695 -0.9948487 0.8009659 0.6145393 -0.9959706 0.7978374 0.6728136 -0.9968409 0.8082934 0.7253775 -0.9975189 0.8262314 0.7717834 -0.9980488 0.8474353 0.8119884 -0.9984638 0.8691663 0.8462598 -0.9987895 0.8897832 0.8750727 -0.9990455 0.9084153 0.8990175 -0.999247 0.9247041 0.9187262 -0.9994057 0.9386096 0.9348204 -0.9995308 0.9502734 0.9478785 -0.9996295 0.959928 0.9584178 -0.9997074 0.9678389 0.9668884 -0.9997688 0.9742706 0.9736733 -0.9998174 0.9794681 0.9790931 -0.9998557 0.9836483 0.9834132 -0.999886 0.986998 0.9868507 -0.9999099 0.9896744 0.9895821 -0.9999288 0.9918079 0.9917502 -0.9999437 0.9935057 0.9934695 -0.4834235 0.9915469 0.4891161 -0.4834045 0.9915463 0.4890619 -0.4833811 0.9915455 0.4889938 -0.4833522 0.9915446 0.4889084 -0.4833171 0.9915433 0.4888018 -0.4832747 0.9915418 0.4886689 -0.4832246 0.9915399 0.4885041 -0.4831666 0.9915376 0.4883009 -0.4831021 0.9915347 0.4880524 -0.4830346 0.9915312 0.4877517 -0.4829718 0.9915271 0.4873934 -0.4829286 0.9915223 0.4869753 -0.4829319 0.9915169 0.4865032 -0.4830292 0.991511 0.4859971 -0.4833013 0.9915054 0.4855036 -0.4838841 0.9915009 0.4851151 -0.4849907 0.9914995 0.4849907 -0.4865484 0.9914995 0.4849907 -0.4885191 0.9914995 0.4849907 -0.4910123 0.9914995 0.4849907 -0.4941665 0.9914995 0.4849907 -0.498157 0.9914995 0.4849907 -0.5032055 0.9914995 0.4849907 -0.5095925 0.9914995 0.4849907 -0.5176729 0.9914995 0.4849907 -0.5278957 0.9914995 0.4849907 -0.5408288 0.9914995 0.4849907 -0.5571908 0.9914995 0.4849907 -0.577891 0.9914995 0.4849907 -0.6040793 0.9914995 0.4849907 -0.637211 0.9914995 0.4849907 -0.6791269 0.9914995 0.4849907 -0.7321559 0.9914995 0.4849907 -0.7992446 0.9914995 0.4849907 -0.8841204 0.9914995 0.4849907 -0.9914995 0.9914995 0.4849907 -0.9933953 0.8999349 0.5514695 -0.9948487 0.8511207 0.6145393 -0.9959706 0.8314729 0.6728136 -0.9968409 0.8306004 0.7253775 -0.9975189 0.8408797 0.7717834 -0.9980488 0.8569716 0.8119884 -0.9984638 0.875329 0.8462598 -0.9987895 0.8937407 0.8750727 -0.9990455 0.9109436 0.8990175 -0.999247 0.9263124 0.9187262 -0.9994057 0.939629 0.9348204 -0.9995308 0.9509177 0.9478785 -0.9996295 0.9603343 0.9584178 -0.9997074 0.9680946 0.9668884 -0.9997688 0.9744313 0.9736733 -0.9998174 0.9795689 0.9790931 -0.9998557 0.9837116 0.9834132 -0.999886 0.9870376 0.9868507 -0.9999099 0.9896992 0.9895821 -0.9999288 0.9918234 0.9917502 -0.9999437 0.9935154 0.9934695 -0.5504963 0.993424 0.5544184 -0.5504818 0.9934236 0.5543796 -0.550464 0.9934231 0.5543308 -0.5504419 0.9934225 0.5542698 -0.550415 0.9934218 0.5541934 -0.5503825 0.9934209 0.5540983 -0.5503438 0.9934197 0.5539804 -0.5502987 0.9934183 0.5538351 -0.550248 0.9934166 0.5536574 -0.5501939 0.9934145 0.5534423 -0.5501416 0.993412 0.5531861 -0.5501012 0.9934091 0.5528872 -0.5500915 0.9934058 0.5525498 -0.5501456 0.9934023 0.5521882 -0.5503203 0.9933988 0.5518357 -0.5507113 0.9933961 0.5515582 -0.5514695 0.9933953 0.5514695 -0.5525411 0.9933953 0.5514695 -0.5538969 0.9933953 0.5514695 -0.5556122 0.9933953 0.5514695 -0.5577822 0.9933953 0.5514695 -0.5605276 0.9933953 0.5514695 -0.5640008 0.9933953 0.5514695 -0.5683949 0.9933953 0.5514695 -0.573954 0.9933953 0.5514695 -0.580987 0.9933953 0.5514695 -0.5898847 0.9933953 0.5514695 -0.6011414 0.9933953 0.5514695 -0.6153825 0.9933953 0.5514695 -0.6333995 0.9933953 0.5514695 -0.6561933 0.9933953 0.5514695 -0.6850303 0.9933953 0.5514695 -0.721513 0.9933953 0.5514695 -0.7676683 0.9933953 0.5514695 -0.8260608 0.9933953 0.5514695 -0.8999349 0.9933953 0.5514695 -0.9933953 0.9933953 0.5514695 -0.9948487 0.9145732 0.6145393 -0.9959706 0.8740262 0.6728136 -0.9968409 0.8588218 0.7253775 -0.9975189 0.8594117 0.7717834 -0.9980488 0.8690364 0.8119884 -0.9984638 0.8831255 0.8462598 -0.9987895 0.8987476 0.8750727 -0.9990455 0.9141422 0.8990175 -0.999247 0.928347 0.9187262 -0.9994057 0.9409186 0.9348204 -0.9995308 0.9517328 0.9478785 -0.9996295 0.9608482 0.9584178 -0.9997074 0.9684181 0.9668884 -0.9997688 0.9746346 0.9736733 -0.9998174 0.9796966 0.9790931 -0.9998557 0.9837916 0.9834132 -0.999886 0.9870878 0.9868507 -0.9999099 0.9897306 0.9895821 -0.9999288 0.9918431 0.9917502 -0.9999437 0.9935277 0.9934695 -0.6139459 0.9948662 0.6166119 -0.6139352 0.994866 0.6165846 -0.6139219 0.9948657 0.6165503 -0.6139056 0.9948653 0.6165074 -0.6138855 0.9948649 0.6164537 -0.6138613 0.9948643 0.6163868 -0.6138323 0.9948636 0.6163039 -0.6137984 0.9948628 0.6162016 -0.6137599 0.9948617 0.6160767 -0.6137183 0.9948604 0.6159255 -0.6136769 0.9948589 0.6157453 -0.6136427 0.9948571 0.6155353 -0.6136284 0.9948551 0.6152981 -0.6136569 0.994853 0.6150441 -0.6137675 0.9948509 0.6147965 -0.6140266 0.9948493 0.6146016 -0.6145393 0.9948487 0.6145393 -0.6152669 0.9948487 0.6145393 -0.6161874 0.9948487 0.6145393 -0.6173519 0.9948487 0.6145393 -0.6188252 0.9948487 0.6145393 -0.6206891 0.9948487 0.6145393 -0.6230471 0.9948487 0.6145393 -0.6260304 0.9948487 0.6145393 -0.6298046 0.9948487 0.6145393 -0.6345795 0.9948487 0.6145393 -0.6406203 0.9948487 0.6145393 -0.6482627 0.9948487 0.6145393 -0.6579314 0.9948487 0.6145393 -0.6701635 0.9948487 0.6145393 -0.6856388 0.9948487 0.6145393 -0.7052169 0.9948487 0.6145393 -0.7299859 0.9948487 0.6145393 -0.7613218 0.9948487 0.6145393 -0.8009659 0.9948487 0.6145393 -0.8511207 0.9948487 0.6145393 -0.9145732 0.9948487 0.6145393 -0.9948487 0.9948487 0.6145393 -0.9959706 0.9278617 0.6728136 -0.9968409 0.8945255 0.7253775 -0.9975189 0.8828571 0.7717834 -0.9980488 0.8842998 0.8119884 -0.9984638 0.892989 0.8462598 -0.9987895 0.9050819 0.8750727 -0.9990455 0.9181889 0.8990175 -0.999247 0.9309211 0.9187262 -0.9994057 0.9425502 0.9348204 -0.9995308 0.952764 0.9478785 -0.9996295 0.9614985 0.9584178 -0.9997074 0.9688274 0.9668884 -0.9997688 0.9748918 0.9736733 -0.9998174 0.979858 0.9790931 -0.9998557 0.9838928 0.9834132 -0.999886 0.9871512 0.9868507 -0.9999099 0.9897703 0.9895821 -0.9999288 0.991868 0.9917502 -0.9999437 0.9935432 0.9934695 -0.6724572 0.9959813 0.6742469 -0.6724495 0.9959811 0.674228 -0.6724399 0.9959809 0.6742043 -0.672428 0.9959807 0.6741745 -0.6724135 0.9959804 0.6741374 -0.6723959 0.9959801 0.6740911 -0.6723748 0.9959797 0.6740337 -0.67235 0.9959791 0.673963 -0.6723217 0.9959785 0.6738765 -0.6722907 0.9959777 0.673772 -0.6722594 0.9959768 0.6736474 -0.6722322 0.9959757 0.6735021 -0.672218 0.9959745 0.6733381 -0.672232 0.9959732 0.6731625 -0.6723012 0.9959719 0.6729913 -0.6724711 0.9959709 0.6728567 -0.6728136 0.9959706 0.6728136 -0.6733015 0.9959706 0.6728136 -0.6739188 0.9959706 0.6728136 -0.6746998 0.9959706 0.6728136 -0.6756878 0.9959706 0.6728136 -0.6769378 0.9959706 0.6728136 -0.6785192 0.9959706 0.6728136 -0.6805199 0.9959706 0.6728136 -0.683051 0.9959706 0.6728136 -0.6862532 0.9959706 0.6728136 -0.6903044 0.9959706 0.6728136 -0.6954296 0.9959706 0.6728136 -0.7019138 0.9959706 0.6728136 -0.710117 0.9959706 0.6728136 -0.7204952 0.9959706 0.6728136 -0.733625 0.9959706 0.6728136 -0.7502359 0.9959706 0.6728136 -0.7712508 0.9959706 0.6728136 -0.7978374 0.9959706 0.6728136 -0.8314729 0.9959706 0.6728136 -0.8740262 0.9959706 0.6728136 -0.9278617 0.9959706 0.6728136 -0.9959706 0.9959706 0.6728136 -0.9968409 0.9396953 0.7253775 -0.9975189 0.9125186 0.7717834 -0.9980488 0.9036101 0.8119884 -0.9984638 0.9054678 0.8462598 -0.9987895 0.9130957 0.8750727 -0.9990455 0.9233085 0.8990175 -0.999247 0.9341777 0.9187262 -0.9994057 0.9446144 0.9348204 -0.9995308 0.9540687 0.9478785 -0.9996295 0.9623212 0.9584178 -0.9997074 0.9693452 0.9668884 -0.9997688 0.9752172 0.9736733 -0.9998174 0.9800622 0.9790931 -0.9998557 0.9840209 0.9834132 -0.999886 0.9872315 0.9868507 -0.9999099 0.9898206 0.9895821 -0.9999288 0.9918994 0.9917502 -0.9999437 0.9935629 0.9934695 -0.7251659 0.9968475 0.7263539 -0.7251605 0.9968474 0.726341 -0.7251537 0.9968473 0.7263248 -0.7251454 0.9968472 0.7263046 -0.7251351 0.996847 0.7262792 -0.7251226 0.9968468 0.7262477 -0.7251076 0.9968465 0.7262086 -0.7250899 0.9968462 0.7261604 -0.7250697 0.9968458 0.7261015 -0.7250473 0.9968453 0.7260302 -0.7250244 0.9968448 0.7259453 -0.7250039 0.9968441 0.7258464 -0.7249916 0.9968433 0.7257347 -0.7249978 0.9968425 0.7256151 -0.7250408 0.9968418 0.7254985 -0.7251511 0.9968411 0.7254069 -0.7253775 0.9968409 0.7253775 -0.7257011 0.9968409 0.7253775 -0.7261105 0.9968409 0.7253775 -0.7266285 0.9968409 0.7253775 -0.7272837 0.9968409 0.7253775 -0.7281127 0.9968409 0.7253775 -0.7291615 0.9968409 0.7253775 -0.7304884 0.9968409 0.7253775 -0.732167 0.9968409 0.7253775 -0.7342907 0.9968409 0.7253775 -0.7369774 0.9968409 0.7253775 -0.7403765 0.9968409 0.7253775 -0.7446768 0.9968409 0.7253775 -0.7501172 0.9968409 0.7253775 -0.757 0.9968409 0.7253775 -0.7657077 0.9968409 0.7253775 -0.776724 0.9968409 0.7253775 -0.7906611 0.9968409 0.7253775 -0.8082934 0.9968409 0.7253775 -0.8306004 0.9968409 0.7253775 -0.8588218 0.9968409 0.7253775 -0.8945255 0.9968409 0.7253775 -0.9396953 0.9968409 0.7253775 -0.9968409 0.9968409 0.7253775 -0.9975189 0.9500442 0.7717834 -0.9980488 0.9280401 0.8119884 -0.9984638 0.921255 0.8462598 -0.9987895 0.9232341 0.8750727 -0.9990455 0.9297854 0.8990175 -0.999247 0.9382977 0.9187262 -0.9994057 0.9472259 0.9348204 -0.9995308 0.9557192 0.9478785 -0.9996295 0.963362 0.9584178 -0.9997074 0.9700002 0.9668884 -0.9997688 0.9756289 0.9736733 -0.9998174 0.9803206 0.9790931 -0.9998557 0.9841829 0.9834132 -0.999886 0.987333 0.9868507 -0.9999099 0.9898842 0.9895821 -0.9999288 0.9919392 0.9917502 -0.9999437 0.9935878 0.9934695 -0.7716588 0.997523 0.7724394 -0.7716551 0.997523 0.7724308 -0.7716504 0.9975229 0.7724199 -0.7716446 0.9975228 0.7724063 -0.7716375 0.9975227 0.7723893 -0.7716288 0.9975226 0.7723681 -0.7716184 0.9975224 0.7723418 -0.7716061 0.9975222 0.7723094 -0.7715919 0.997522 0.7722698 -0.7715762 0.9975217 0.7722219 -0.7715599 0.9975213 0.7721649 -0.7715449 0.9975209 0.7720984 -0.7715352 0.9975204 0.7720233 -0.7715376 0.9975199 0.771943 -0.7715641 0.9975194 0.7718647 -0.7716352 0.9975191 0.7718031 -0.7717834 0.9975189 0.7717834 -0.7719959 0.9975189 0.7717834 -0.7722648 0.9975189 0.7717834 -0.7726049 0.9975189 0.7717834 -0.7730352 0.9975189 0.7717834 -0.7735795 0.9975189 0.7717834 -0.7742682 0.9975189 0.7717834 -0.7751395 0.9975189 0.7717834 -0.7762418 0.9975189 0.7717834 -0.7776364 0.9975189 0.7717834 -0.7794007 0.9975189 0.7717834 -0.7816327 0.9975189 0.7717834 -0.7844566 0.9975189 0.7717834 -0.7880291 0.9975189 0.7717834 -0.7925488 0.9975189 0.7717834 -0.7982669 0.9975189 0.7717834 -0.8055009 0.9975189 0.7717834 -0.8146529 0.9975189 0.7717834 -0.8262314 0.9975189 0.7717834 -0.8408797 0.9975189 0.7717834 -0.8594117 0.9975189 0.7717834 -0.8828571 0.9975189 0.7717834 -0.9125186 0.9975189 0.7717834 -0.9500442 0.9975189 0.7717834 -0.9975189 0.9975189 0.7717834 -0.9980488 0.9589472 0.8119884 -0.9984638 0.9412278 0.8462598 -0.9987895 0.9360606 0.8750727 -0.9990455 0.9379796 0.8990175 -0.999247 0.94351 0.9187262 -0.9994057 0.9505298 0.9348204 -0.9995308 0.9578074 0.9478785 -0.9996295 0.9646787 0.9584178 -0.9997074 0.970829 0.9668884 -0.9997688 0.9761497 0.9736733 -0.9998174 0.9806476 0.9790931 -0.9998557 0.984388 0.9834132 -0.999886 0.9874615 0.9868507 -0.9999099 0.9899646 0.9895821 -0.9999288 0.9919896 0.9917502 -0.9999437 0.9936193 0.9934695 -0.8119154 0.9980513 0.8124239 -0.8119128 0.9980512 0.8124181 -0.8119096 0.9980512 0.8124109 -0.8119057 0.9980511 0.8124018 -0.8119009 0.9980511 0.8123905 -0.8118949 0.998051 0.8123765 -0.8118878 0.9980509 0.812359 -0.8118794 0.9980508 0.8123375 -0.8118697 0.9980506 0.8123112 -0.8118589 0.9980504 0.8122794 -0.8118476 0.9980502 0.8122416 -0.811837 0.99805 0.8121974 -0.8118298 0.9980497 0.8121476 -0.8118303 0.9980494 0.8120943 -0.8118466 0.9980491 0.8120423 -0.8118921 0.9980488 0.8120015 -0.8119884 0.9980488 0.8119884 -0.8121268 0.9980488 0.8119884 -0.8123018 0.9980488 0.8119884 -0.8125232 0.9980488 0.8119884 -0.8128033 0.9980488 0.8119884 -0.8131577 0.9980488 0.8119884 -0.8136061 0.9980488 0.8119884 -0.8141733 0.9980488 0.8119884 -0.8148909 0.9980488 0.8119884 -0.8157988 0.9980488 0.8119884 -0.8169474 0.9980488 0.8119884 -0.8184005 0.9980488 0.8119884 -0.8202389 0.9980488 0.8119884 -0.8225647 0.9980488 0.8119884 -0.8255071 0.9980488 0.8119884 -0.8292297 0.9980488 0.8119884 -0.8339392 0.9980488 0.8119884 -0.8398974 0.9980488 0.8119884 -0.8474353 0.9980488 0.8119884 -0.8569716 0.9980488 0.8119884 -0.8690364 0.9980488 0.8119884 -0.8842998 0.9980488 0.8119884 -0.9036101 0.9980488 0.8119884 -0.9280401 0.9980488 0.8119884 -0.9589472 0.9980488 0.8119884 -0.9980488 0.9980488 0.8119884 -0.9984638 0.9664961 0.8462598 -0.9987895 0.9522877 0.8750727 -0.9990455 0.9483463 0.8990175 -0.999247 0.9501042 0.9187262 -0.9994057 0.9547096 0.9348204 -0.9995308 0.9604492 0.9478785 -0.9996295 0.9663445 0.9584178 -0.9997074 0.9718774 0.9668884 -0.9997688 0.9768086 0.9736733 -0.9998174 0.9810611 0.9790931 -0.9998557 0.9846473 0.9834132 -0.999886 0.987624 0.9868507 -0.9999099 0.9900664 0.9895821 -0.9999288 0.9920533 0.9917502 -0.9999437 0.9936592 0.9934695 -0.8462171 0.9984653 0.8465458 -0.8462154 0.9984653 0.846542 -0.8462132 0.9984653 0.8465373 -0.8462106 0.9984653 0.8465313 -0.8462073 0.9984652 0.8465239 -0.8462034 0.9984652 0.8465147 -0.8461986 0.9984651 0.8465032 -0.8461929 0.998465 0.8464891 -0.8461864 0.9984649 0.8464718 -0.8461791 0.9984648 0.8464509 -0.8461714 0.9984647 0.846426 -0.8461641 0.9984645 0.8463971 -0.8461589 0.9984643 0.8463643 -0.8461587 0.9984642 0.8463293 -0.8461687 0.998464 0.8462952 -0.8461977 0.9984638 0.8462684 -0.8462598 0.9984638 0.8462598 -0.8463492 0.9984638 0.8462598 -0.8464623 0.9984638 0.8462598 -0.8466054 0.9984638 0.8462598 -0.8467864 0.9984638 0.8462598 -0.8470154 0.9984638 0.8462598 -0.8473052 0.9984638 0.8462598 -0.8476717 0.9984638 0.8462598 -0.8481355 0.9984638 0.8462598 -0.8487222 0.9984638 0.8462598 -0.8494644 0.9984638 0.8462598 -0.8504035 0.9984638 0.8462598 -0.8515915 0.9984638 0.8462598 -0.8530945 0.9984638 0.8462598 -0.8549959 0.9984638 0.8462598 -0.8574015 0.9984638 0.8462598 -0.8604449 0.9984638 0.8462598 -0.8642952 0.9984638 0.8462598 -0.8691663 0.9984638 0.8462598 -0.875329 0.9984638 0.8462598 -0.8831255 0.9984638 0.8462598 -0.892989 0.9984638 0.8462598 -0.9054678 0.9984638 0.8462598 -0.921255 0.9984638 0.8462598 -0.9412278 0.9984638 0.8462598 -0.9664961 0.9984638 0.8462598 -0.9984638 0.9984638 0.8462598 -0.9987895 0.9728171 0.8750727 -0.9990455 0.9614615 0.8990175 -0.999247 0.9584468 0.9187262 -0.9994057 0.9599976 0.9348204 -0.9995308 0.9637914 0.9478785 -0.9996295 0.968452 0.9584178 -0.9997074 0.9732039 0.9668884 -0.9997688 0.9776422 0.9736733 -0.9998174 0.9815844 0.9790931 -0.9998557 0.9849754 0.9834132 -0.999886 0.9878296 0.9868507 -0.9999099 0.9901951 0.9895821 -0.9999288 0.9921339 0.9917502 -0.9999437 0.9937096 0.9934695 -0.8750477 0.9987905 0.8752589 -0.8750466 0.9987905 0.8752564 -0.8750451 0.9987904 0.8752533 -0.8750434 0.9987904 0.8752495 -0.8750412 0.9987904 0.8752446 -0.8750386 0.9987904 0.8752386 -0.8750355 0.9987903 0.8752311 -0.8750317 0.9987903 0.8752219 -0.8750274 0.9987902 0.8752107 -0.8750225 0.9987902 0.8751971 -0.8750173 0.9987901 0.8751809 -0.8750124 0.99879 0.875162 -0.8750088 0.9987899 0.8751408 -0.8750084 0.9987897 0.875118 -0.8750145 0.9987896 0.8750958 -0.8750329 0.9987895 0.8750783 -0.8750727 0.9987895 0.8750727 -0.8751301 0.9987895 0.8750727 -0.8752028 0.9987895 0.8750727 -0.8752947 0.9987895 0.8750727 -0.8754109 0.9987895 0.8750727 -0.875558 0.9987895 0.8750727 -0.8757441 0.9987895 0.8750727 -0.8759795 0.9987895 0.8750727 -0.8762773 0.9987895 0.8750727 -0.8766541 0.9987895 0.8750727 -0.8771307 0.9987895 0.8750727 -0.8777338 0.9987895 0.8750727 -0.8784967 0.9987895 0.8750727 -0.8794619 0.9987895 0.8750727 -0.880683 0.9987895 0.8750727 -0.8822279 0.9987895 0.8750727 -0.8841823 0.9987895 0.8750727 -0.886655 0.9987895 0.8750727 -0.8897832 0.9987895 0.8750727 -0.8937407 0.9987895 0.8750727 -0.8987476 0.9987895 0.8750727 -0.9050819 0.9987895 0.8750727 -0.9130957 0.9987895 0.8750727 -0.9232341 0.9987895 0.8750727 -0.9360606 0.9987895 0.8750727 -0.9522877 0.9987895 0.8750727 -0.9728171 0.9987895 0.8750727 -0.9987895 0.9987895 0.8750727 -0.9990455 0.9780539 0.8990175 -0.999247 0.9690013 0.9187262 -0.9994057 0.9666876 0.9348204 -0.9995308 0.9680197 0.9478785 -0.9996295 0.9711183 0.9584178 -0.9997074 0.974882 0.9668884 -0.9997688 0.9786968 0.9736733 -0.9998174 0.9822464 0.9790931 -0.9998557 0.9853905 0.9834132 -0.999886 0.9880897 0.9868507 -0.9999099 0.990358 0.9895821 -0.9999288 0.9922358 0.9917502 -0.9999437 0.9937734 0.9934695 -0.8990028 0.9990461 0.8991377 -0.899002 0.9990461 0.8991362 -0.8990011 0.9990461 0.8991342 -0.899 0.9990461 0.8991317 -0.8989986 0.9990461 0.8991285 -0.8989969 0.9990461 0.8991246 -0.8989948 0.9990461 0.8991198 -0.8989923 0.999046 0.8991139 -0.8989895 0.999046 0.8991066 -0.8989863 0.9990459 0.8990978 -0.8989829 0.9990459 0.8990874 -0.8989796 0.9990458 0.8990752 -0.8989771 0.9990458 0.8990614 -0.8989767 0.9990457 0.8990467 -0.8989805 0.9990456 0.8990324 -0.8989921 0.9990456 0.8990211 -0.8990175 0.9990455 0.8990175 -0.8990542 0.9990455 0.8990175 -0.8991006 0.9990455 0.8990175 -0.8991593 0.9990455 0.8990175 -0.8992336 0.9990455 0.8990175 -0.8993275 0.9990455 0.8990175 -0.8994464 0.9990455 0.8990175 -0.8995968 0.9990455 0.8990175 -0.899787 0.9990455 0.8990175 -0.9000277 0.9990455 0.8990175 -0.9003323 0.9990455 0.8990175 -0.9007175 0.9990455 0.8990175 -0.9012049 0.9990455 0.8990175 -0.9018215 0.9990455 0.8990175 -0.9026016 0.9990455 0.8990175 -0.9035886 0.9990455 0.8990175 -0.9048372 0.9990455 0.8990175 -0.9064168 0.9990455 0.8990175 -0.9084153 0.9990455 0.8990175 -0.9109436 0.9990455 0.8990175 -0.9141422 0.9990455 0.8990175 -0.9181889 0.9990455 0.8990175 -0.9233085 0.9990455 0.8990175 -0.9297854 0.9990455 0.8990175 -0.9379796 0.9990455 0.8990175 -0.9483463 0.9990455 0.8990175 -0.9614615 0.9990455 0.8990175 -0.9780539 0.9990455 0.8990175 -0.9990455 0.9990455 0.8990175 -0.999247 0.982354 0.9187262 -0.9994057 0.9751513 0.9348204 -0.9995308 0.9733691 0.9478785 -0.9996295 0.9744915 0.9584178 -0.9997074 0.977005 0.9668884 -0.9997688 0.980031 0.9736733 -0.9998174 0.9830838 0.9790931 -0.9998557 0.9859157 0.9834132 -0.999886 0.9884188 0.9868507 -0.9999099 0.9905641 0.9895821 -0.9999288 0.9923648 0.9917502 -0.9999437 0.9938541 0.9934695 -0.9187175 0.9992474 0.9188034 -0.918717 0.9992474 0.9188024 -0.9187164 0.9992474 0.9188011 -0.9187157 0.9992474 0.9187995 -0.9187148 0.9992474 0.9187975 -0.9187137 0.9992474 0.918795 -0.9187123 0.9992473 0.9187919 -0.9187107 0.9992473 0.9187881 -0.9187089 0.9992473 0.9187834 -0.9187068 0.9992473 0.9187778 -0.9187045 0.9992472 0.918771 -0.9187024 0.9992472 0.9187632 -0.9187008 0.9992472 0.9187544 -0.9187004 0.9992471 0.918745 -0.9187027 0.9992471 0.9187358 -0.9187101 0.999247 0.9187285 -0.9187262 0.999247 0.9187262 -0.9187495 0.999247 0.9187262 -0.9187791 0.999247 0.9187262 -0.9188164 0.999247 0.9187262 -0.9188636 0.999247 0.9187262 -0.9189234 0.999247 0.9187262 -0.918999 0.999247 0.9187262 -0.9190947 0.999247 0.9187262 -0.9192157 0.999247 0.9187262 -0.9193688 0.999247 0.9187262 -0.9195625 0.999247 0.9187262 -0.9198076 0.999247 0.9187262 -0.9201176 0.999247 0.9187262 -0.9205098 0.999247 0.9187262 -0.9210061 0.999247 0.9187262 -0.9216339 0.999247 0.9187262 -0.9224281 0.999247 0.9187262 -0.9234329 0.999247 0.9187262 -0.9247041 0.999247 0.9187262 -0.9263124 0.999247 0.9187262 -0.928347 0.999247 0.9187262 -0.9309211 0.999247 0.9187262 -0.9341777 0.999247 0.9187262 -0.9382977 0.999247 0.9187262 -0.94351 0.999247 0.9187262 -0.9501042 0.999247 0.9187262 -0.9584468 0.999247 0.9187262 -0.9690013 0.999247 0.9187262 -0.982354 0.999247 0.9187262 -0.999247 0.999247 0.9187262 -0.9994057 0.9858591 0.9348204 -0.9995308 0.9801368 0.9478785 -0.9996295 0.978759 0.9584178 -0.9997074 0.9796909 0.9668884 -0.9997688 0.981719 0.9736733 -0.9998174 0.9841433 0.9790931 -0.9998557 0.9865801 0.9834132 -0.999886 0.9888351 0.9868507 -0.9999099 0.9908248 0.9895821 -0.9999288 0.992528 0.9917502 -0.9999437 0.9939562 0.9934695 -0.9348153 0.999406 0.9348697 -0.9348149 0.999406 0.934869 -0.9348146 0.999406 0.9348682 -0.9348141 0.999406 0.9348672 -0.9348135 0.999406 0.9348659 -0.9348128 0.9994059 0.9348643 -0.9348119 0.9994059 0.9348623 -0.9348109 0.9994059 0.9348599 -0.9348097 0.9994059 0.9348569 -0.9348083 0.9994059 0.9348533 -0.9348069 0.9994059 0.9348491 -0.9348055 0.9994059 0.9348441 -0.9348044 0.9994058 0.9348384 -0.9348042 0.9994058 0.9348324 -0.9348056 0.9994058 0.9348265 -0.9348102 0.9994057 0.9348219 -0.9348204 0.9994057 0.9348204 -0.9348352 0.9994057 0.9348204 -0.9348539 0.9994057 0.9348204 -0.9348776 0.9994057 0.9348204 -0.9349075 0.9994057 0.9348204 -0.9349454 0.9994057 0.9348204 -0.9349933 0.9994057 0.9348204 -0.935054 0.9994057 0.9348204 -0.9351307 0.9994057 0.9348204 -0.9352277 0.9994057 0.9348204 -0.9353505 0.9994057 0.9348204 -0.9355059 0.9994057 0.9348204 -0.9357024 0.9994057 0.9348204 -0.935951 0.9994057 0.9348204 -0.9362655 0.9994057 0.9348204 -0.9366635 0.9994057 0.9348204 -0.9371669 0.9994057 0.9348204 -0.9378038 0.9994057 0.9348204 -0.9386096 0.9994057 0.9348204 -0.939629 0.9994057 0.9348204 -0.9409186 0.9994057 0.9348204 -0.9425502 0.9994057 0.9348204 -0.9446144 0.9994057 0.9348204 -0.9472259 0.9994057 0.9348204 -0.9505298 0.9994057 0.9348204 -0.9547096 0.9994057 0.9348204 -0.9599976 0.9994057 0.9348204 -0.9666876 0.9994057 0.9348204 -0.9751513 0.9994057 0.9348204 -0.9858591 0.9994057 0.9348204 -0.9994057 0.9994057 0.9348204 -0.9995308 0.9886988 0.9478785 -0.9996295 0.9841579 0.9584178 -0.9997074 0.983089 0.9668884 -0.9997688 0.9838545 0.9736733 -0.9998174 0.9854838 0.9790931 -0.9998557 0.9874207 0.9834132 -0.999886 0.9893618 0.9868507 -0.9999099 0.9911547 0.9895821 -0.9999288 0.9927345 0.9917502 -0.9999437 0.9940854 0.9934695 -0.9478754 0.999531 0.9479098 -0.9478752 0.999531 0.9479094 -0.947875 0.999531 0.9479089 -0.9478746 0.999531 0.9479082 -0.9478743 0.999531 0.9479074 -0.9478738 0.999531 0.9479064 -0.9478733 0.999531 0.9479051 -0.9478726 0.999531 0.9479036 -0.9478718 0.999531 0.9479017 -0.947871 0.9995309 0.9478994 -0.94787 0.9995309 0.9478967 -0.9478691 0.9995309 0.9478935 -0.9478684 0.9995309 0.9478899 -0.9478683 0.9995309 0.9478861 -0.9478691 0.9995309 0.9478824 -0.947872 0.9995309 0.9478794 -0.9478785 0.9995308 0.9478785 -0.9478878 0.9995308 0.9478785 -0.9478997 0.9995308 0.9478785 -0.9479146 0.9995308 0.9478785 -0.9479335 0.9995308 0.9478785 -0.9479575 0.9995308 0.9478785 -0.9479878 0.9995308 0.9478785 -0.9480261 0.9995308 0.9478785 -0.9480746 0.9995308 0.9478785 -0.9481359 0.9995308 0.9478785 -0.9482135 0.9995308 0.9478785 -0.9483117 0.9995308 0.9478785 -0.9484359 0.9995308 0.9478785 -0.9485931 0.9995308 0.9478785 -0.9487918 0.9995308 0.9478785 -0.9490434 0.9995308 0.9478785 -0.9493615 0.9995308 0.9478785 -0.9497641 0.9995308 0.9478785 -0.9502734 0.9995308 0.9478785 -0.9509177 0.9995308 0.9478785 -0.9517328 0.9995308 0.9478785 -0.952764 0.9995308 0.9478785 -0.9540687 0.9995308 0.9478785 -0.9557192 0.9995308 0.9478785 -0.9578074 0.9995308 0.9478785 -0.9604492 0.9995308 0.9478785 -0.9637914 0.9995308 0.9478785 -0.9680197 0.9995308 0.9478785 -0.9733691 0.9995308 0.9478785 -0.9801368 0.9995308 0.9478785 -0.9886988 0.9995308 0.9478785 -0.9995308 0.9995308 0.9478785 -0.9996295 0.9909882 0.9584178 -0.9997074 0.9873879 0.9668884 -0.9997688 0.9865561 0.9736733 -0.9998174 0.9871796 0.9790931 -0.9998557 0.9884841 0.9834132 -0.999886 0.9900282 0.9868507 -0.9999099 0.991572 0.9895821 -0.9999288 0.9929957 0.9917502 -0.9999437 0.9942488 0.9934695 -0.958416 0.9996296 0.9584377 -0.9584159 0.9996296 0.9584374 -0.9584157 0.9996296 0.9584371 -0.9584155 0.9996296 0.9584367 -0.9584153 0.9996296 0.9584362 -0.958415 0.9996296 0.9584355 -0.9584146 0.9996296 0.9584347 -0.9584142 0.9996296 0.9584337 -0.9584137 0.9996296 0.9584325 -0.9584132 0.9996296 0.9584311 -0.9584126 0.9996296 0.9584294 -0.958412 0.9996296 0.9584274 -0.9584115 0.9996296 0.9584251 -0.9584114 0.9996295 0.9584227 -0.958412 0.9996295 0.9584203 -0.9584138 0.9996295 0.9584184 -0.9584178 0.9996295 0.9584178 -0.9584237 0.9996295 0.9584178 -0.9584312 0.9996295 0.9584178 -0.9584406 0.9996295 0.9584178 -0.9584526 0.9996295 0.9584178 -0.9584677 0.9996295 0.9584178 -0.9584868 0.9996295 0.9584178 -0.9585109 0.9996295 0.9584178 -0.9585415 0.9996295 0.9584178 -0.9585802 0.9996295 0.9584178 -0.9586291 0.9996295 0.9584178 -0.958691 0.9996295 0.9584178 -0.9587693 0.9996295 0.9584178 -0.9588684 0.9996295 0.9584178 -0.9589938 0.9996295 0.9584178 -0.9591524 0.9996295 0.9584178 -0.959353 0.9996295 0.9584178 -0.9596068 0.9996295 0.9584178 -0.959928 0.9996295 0.9584178 -0.9603343 0.9996295 0.9584178 -0.9608482 0.9996295 0.9584178 -0.9614985 0.9996295 0.9584178 -0.9623212 0.9996295 0.9584178 -0.963362 0.9996295 0.9584178 -0.9646787 0.9996295 0.9584178 -0.9663445 0.9996295 0.9584178 -0.968452 0.9996295 0.9584178 -0.9711183 0.9996295 0.9584178 -0.9744915 0.9996295 0.9584178 -0.978759 0.9996295 0.9584178 -0.9841579 0.9996295 0.9584178 -0.9909882 0.9996295 0.9584178 -0.9996295 0.9996295 0.9584178 -0.9997074 0.9928267 0.9668884 -0.9997688 0.9899741 0.9736733 -0.9998174 0.989325 0.9790931 -0.9998557 0.9898295 0.9834132 -0.999886 0.9908712 0.9868507 -0.9999099 0.9920999 0.9895821 -0.9999288 0.9933261 0.9917502 -0.9999437 0.9944556 0.9934695 -0.9668873 0.9997074 0.966901 -0.9668872 0.9997074 0.9669008 -0.9668871 0.9997074 0.9669006 -0.966887 0.9997074 0.9669003 -0.9668869 0.9997074 0.9669 -0.9668867 0.9997074 0.9668996 -0.9668865 0.9997074 0.9668991 -0.9668862 0.9997074 0.9668985 -0.9668859 0.9997074 0.9668977 -0.9668855 0.9997074 0.9668968 -0.9668852 0.9997074 0.9668957 -0.9668848 0.9997074 0.9668945 -0.9668845 0.9997074 0.966893 -0.9668844 0.9997074 0.9668915 -0.9668847 0.9997074 0.96689 -0.9668859 0.9997074 0.9668888 -0.9668884 0.9997074 0.9668884 -0.9668922 0.9997074 0.9668884 -0.9668969 0.9997074 0.9668884 -0.9669028 0.9997074 0.9668884 -0.9669103 0.9997074 0.9668884 -0.9669198 0.9997074 0.9668884 -0.9669318 0.9997074 0.9668884 -0.966947 0.9997074 0.9668884 -0.9669663 0.9997074 0.9668884 -0.9669906 0.9997074 0.9668884 -0.9670214 0.9997074 0.9668884 -0.9670604 0.9997074 0.9668884 -0.9671097 0.9997074 0.9668884 -0.967172 0.9997074 0.9668884 -0.9672509 0.9997074 0.9668884 -0.9673508 0.9997074 0.9668884 -0.967477 0.9997074 0.9668884 -0.9676368 0.9997074 0.9668884 -0.9678389 0.9997074 0.9668884 -0.9680946 0.9997074 0.9668884 -0.9684181 0.9997074 0.9668884 -0.9688274 0.9997074 0.9668884 -0.9693452 0.9997074 0.9668884 -0.9700002 0.9997074 0.9668884 -0.970829 0.9997074 0.9668884 -0.9718774 0.9997074 0.9668884 -0.9732039 0.9997074 0.9668884 -0.974882 0.9997074 0.9668884 -0.977005 0.9997074 0.9668884 -0.9796909 0.9997074 0.9668884 -0.983089 0.9997074 0.9668884 -0.9873879 0.9997074 0.9668884 -0.9928267 0.9997074 0.9668884 -0.9997074 0.9997074 0.9668884 -0.9997688 0.9942982 0.9736733 -0.9998174 0.9920392 0.9790931 -0.9998557 0.9915316 0.9834132 -0.999886 0.9919377 0.9868507 -0.9999099 0.9927678 0.9895821 -0.9999288 0.9937442 0.9917502 -0.9999437 0.9947172 0.9934695 -0.9736726 0.9997689 0.9736812 -0.9736726 0.9997689 0.9736811 -0.9736725 0.9997689 0.973681 -0.9736724 0.9997689 0.9736808 -0.9736723 0.9997689 0.9736806 -0.9736722 0.9997689 0.9736803 -0.9736721 0.9997689 0.97368 -0.9736719 0.9997689 0.9736796 -0.9736717 0.9997689 0.9736792 -0.9736715 0.9997689 0.9736786 -0.9736712 0.9997689 0.9736779 -0.973671 0.9997689 0.9736771 -0.9736708 0.9997689 0.9736762 -0.9736708 0.9997689 0.9736752 -0.973671 0.9997688 0.9736743 -0.9736717 0.9997688 0.9736735 -0.9736733 0.9997688 0.9736733 -0.9736756 0.9997688 0.9736733 -0.9736786 0.9997688 0.9736733 -0.9736823 0.9997688 0.9736733 -0.973687 0.9997688 0.9736733 -0.973693 0.9997688 0.9736733 -0.9737006 0.9997688 0.9736733 -0.9737101 0.9997688 0.9736733 -0.9737222 0.9997688 0.9736733 -0.9737375 0.9997688 0.9736733 -0.9737569 0.9997688 0.9736733 -0.9737814 0.9997688 0.9736733 -0.9738123 0.9997688 0.9736733 -0.9738515 0.9997688 0.9736733 -0.9739011 0.9997688 0.9736733 -0.9739638 0.9997688 0.9736733 -0.9740432 0.9997688 0.9736733 -0.9741436 0.9997688 0.9736733 -0.9742706 0.9997688 0.9736733 -0.9744313 0.9997688 0.9736733 -0.9746346 0.9997688 0.9736733 -0.9748918 0.9997688 0.9736733 -0.9752172 0.9997688 0.9736733 -0.9756289 0.9997688 0.9736733 -0.9761497 0.9997688 0.9736733 -0.9768086 0.9997688 0.9736733 -0.9776422 0.9997688 0.9736733 -0.9786968 0.9997688 0.9736733 -0.980031 0.9997688 0.9736733 -0.981719 0.9997688 0.9736733 -0.9838545 0.9997688 0.9736733 -0.9865561 0.9997688 0.9736733 -0.9899741 0.9997688 0.9736733 -0.9942982 0.9997688 0.9736733 -0.9997688 0.9997688 0.9736733 -0.9998174 0.9954731 0.9790931 -0.9998557 0.9936849 0.9834132 -0.999886 0.993287 0.9868507 -0.9999099 0.9936128 0.9895821 -0.9999288 0.9942731 0.9917502 -0.9999437 0.9950481 0.9934695 -0.9790927 0.9998174 0.9790981 -0.9790927 0.9998174 0.979098 -0.9790927 0.9998174 0.979098 -0.9790926 0.9998174 0.9790979 -0.9790925 0.9998174 0.9790977 -0.9790925 0.9998174 0.9790976 -0.9790924 0.9998174 0.9790974 -0.9790923 0.9998174 0.9790971 -0.9790921 0.9998174 0.9790968 -0.979092 0.9998174 0.9790965 -0.9790919 0.9998174 0.979096 -0.9790917 0.9998174 0.9790955 -0.9790916 0.9998174 0.979095 -0.9790916 0.9998174 0.9790943 -0.9790917 0.9998174 0.9790938 -0.9790921 0.9998174 0.9790933 -0.9790931 0.9998174 0.9790931 -0.9790946 0.9998174 0.9790931 -0.9790965 0.9998174 0.9790931 -0.9790988 0.9998174 0.9790931 -0.9791018 0.9998174 0.9790931 -0.9791055 0.9998174 0.9790931 -0.9791103 0.9998174 0.9790931 -0.9791163 0.9998174 0.9790931 -0.9791238 0.9998174 0.9790931 -0.9791334 0.9998174 0.9790931 -0.9791456 0.9998174 0.9790931 -0.979161 0.9998174 0.9790931 -0.9791804 0.9998174 0.9790931 -0.979205 0.9998174 0.9790931 -0.9792361 0.9998174 0.9790931 -0.9792755 0.9998174 0.9790931 -0.9793253 0.9998174 0.9790931 -0.9793883 0.9998174 0.9790931 -0.9794681 0.9998174 0.9790931 -0.9795689 0.9998174 0.9790931 -0.9796966 0.9998174 0.9790931 -0.979858 0.9998174 0.9790931 -0.9800622 0.9998174 0.9790931 -0.9803206 0.9998174 0.9790931 -0.9806476 0.9998174 0.9790931 -0.9810611 0.9998174 0.9790931 -0.9815844 0.9998174 0.9790931 -0.9822464 0.9998174 0.9790931 -0.9830838 0.9998174 0.9790931 -0.9841433 0.9998174 0.9790931 -0.9854838 0.9998174 0.9790931 -0.9871796 0.9998174 0.9790931 -0.989325 0.9998174 0.9790931 -0.9920392 0.9998174 0.9790931 -0.9954731 0.9998174 0.9790931 -0.9998174 0.9998174 0.9790931 -0.9998557 0.9964092 0.9834132 -0.999886 0.9949941 0.9868507 -0.9999099 0.9946818 0.9895821 -0.9999288 0.9949422 0.9917502 -0.9999437 0.9954668 0.9934695 -0.9834129 0.9998557 0.9834163 -0.9834129 0.9998557 0.9834163 -0.9834129 0.9998557 0.9834162 -0.9834129 0.9998557 0.9834162 -0.9834128 0.9998557 0.9834161 -0.9834128 0.9998557 0.983416 -0.9834127 0.9998557 0.9834158 -0.9834127 0.9998557 0.9834157 -0.9834126 0.9998557 0.9834155 -0.9834125 0.9998557 0.9834153 -0.9834124 0.9998557 0.983415 -0.9834123 0.9998557 0.9834147 -0.9834122 0.9998557 0.9834143 -0.9834122 0.9998557 0.9834139 -0.9834123 0.9998557 0.9834136 -0.9834126 0.9998557 0.9834133 -0.9834132 0.9998557 0.9834132 -0.9834141 0.9998557 0.9834132 -0.9834153 0.9998557 0.9834132 -0.9834167 0.9998557 0.9834132 -0.9834186 0.9998557 0.9834132 -0.9834209 0.9998557 0.9834132 -0.9834239 0.9998557 0.9834132 -0.9834277 0.9998557 0.9834132 -0.9834324 0.9998557 0.9834132 -0.9834385 0.9998557 0.9834132 -0.9834461 0.9998557 0.9834132 -0.9834557 0.9998557 0.9834132 -0.9834679 0.9998557 0.9834132 -0.9834833 0.9998557 0.9834132 -0.9835029 0.9998557 0.9834132 -0.9835276 0.9998557 0.9834132 -0.9835588 0.9998557 0.9834132 -0.9835983 0.9998557 0.9834132 -0.9836483 0.9998557 0.9834132 -0.9837116 0.9998557 0.9834132 -0.9837916 0.9998557 0.9834132 -0.9838928 0.9998557 0.9834132 -0.9840209 0.9998557 0.9834132 -0.9841829 0.9998557 0.9834132 -0.984388 0.9998557 0.9834132 -0.9846473 0.9998557 0.9834132 -0.9849754 0.9998557 0.9834132 -0.9853905 0.9998557 0.9834132 -0.9859157 0.9998557 0.9834132 -0.9865801 0.9998557 0.9834132 -0.9874207 0.9998557 0.9834132 -0.9884841 0.9998557 0.9834132 -0.9898295 0.9998557 0.9834132 -0.9915316 0.9998557 0.9834132 -0.9936849 0.9998557 0.9834132 -0.9964092 0.9998557 0.9834132 -0.9998557 0.9998557 0.9834132 -0.999886 0.9971537 0.9868507 -0.9999099 0.9960342 0.9895821 -0.9999288 0.9957887 0.9917502 -0.9999437 0.9959964 0.9934695 -0.9868505 0.999886 0.9868526 -0.9868505 0.999886 0.9868526 -0.9868505 0.999886 0.9868526 -0.9868505 0.999886 0.9868525 -0.9868504 0.999886 0.9868525 -0.9868504 0.999886 0.9868524 -0.9868504 0.999886 0.9868523 -0.9868503 0.999886 0.9868522 -0.9868503 0.999886 0.9868521 -0.9868502 0.999886 0.986852 -0.9868502 0.999886 0.9868518 -0.9868501 0.999886 0.9868516 -0.9868501 0.999886 0.9868514 -0.98685 0.999886 0.9868511 -0.9868501 0.999886 0.9868509 -0.9868503 0.999886 0.9868507 -0.9868507 0.999886 0.9868507 -0.9868512 0.999886 0.9868507 -0.986852 0.999886 0.9868507 -0.9868529 0.999886 0.9868507 -0.9868541 0.999886 0.9868507 -0.9868555 0.999886 0.9868507 -0.9868574 0.999886 0.9868507 -0.9868597 0.999886 0.9868507 -0.9868627 0.999886 0.9868507 -0.9868665 0.999886 0.9868507 -0.9868713 0.999886 0.9868507 -0.9868773 0.999886 0.9868507 -0.986885 0.999886 0.9868507 -0.9868946 0.999886 0.9868507 -0.9869069 0.999886 0.9868507 -0.9869223 0.999886 0.9868507 -0.9869419 0.999886 0.9868507 -0.9869667 0.999886 0.9868507 -0.986998 0.999886 0.9868507 -0.9870376 0.999886 0.9868507 -0.9870878 0.999886 0.9868507 -0.9871512 0.999886 0.9868507 -0.9872315 0.999886 0.9868507 -0.987333 0.999886 0.9868507 -0.9874615 0.999886 0.9868507 -0.987624 0.999886 0.9868507 -0.9878296 0.999886 0.9868507 -0.9880897 0.999886 0.9868507 -0.9884188 0.999886 0.9868507 -0.9888351 0.999886 0.9868507 -0.9893618 0.999886 0.9868507 -0.9900282 0.999886 0.9868507 -0.9908712 0.999886 0.9868507 -0.9919377 0.999886 0.9868507 -0.993287 0.999886 0.9868507 -0.9949941 0.999886 0.9868507 -0.9971537 0.999886 0.9868507 -0.999886 0.999886 0.9868507 -0.9999099 0.9977452 0.9895821 -0.9999288 0.9968597 0.9917502 -0.9999437 0.9966665 0.9934695 -0.989582 0.9999099 0.9895833 -0.989582 0.9999099 0.9895833 -0.989582 0.9999099 0.9895833 -0.989582 0.9999099 0.9895833 -0.989582 0.9999099 0.9895832 -0.9895819 0.9999099 0.9895832 -0.9895819 0.9999099 0.9895832 -0.9895819 0.9999099 0.9895831 -0.9895819 0.9999099 0.989583 -0.9895818 0.9999099 0.9895829 -0.9895818 0.9999099 0.9895828 -0.9895818 0.9999099 0.9895827 -0.9895817 0.9999099 0.9895826 -0.9895817 0.9999099 0.9895824 -0.9895817 0.9999099 0.9895823 -0.9895819 0.9999099 0.9895821 -0.9895821 0.9999099 0.9895821 -0.9895825 0.9999099 0.9895821 -0.9895829 0.9999099 0.9895821 -0.9895835 0.9999099 0.9895821 -0.9895842 0.9999099 0.9895821 -0.9895851 0.9999099 0.9895821 -0.9895863 0.9999099 0.9895821 -0.9895878 0.9999099 0.9895821 -0.9895897 0.9999099 0.9895821 -0.989592 0.9999099 0.9895821 -0.989595 0.9999099 0.9895821 -0.9895988 0.9999099 0.9895821 -0.9896036 0.9999099 0.9895821 -0.9896096 0.9999099 0.9895821 -0.9896173 0.9999099 0.9895821 -0.989627 0.9999099 0.9895821 -0.9896392 0.9999099 0.9895821 -0.9896547 0.9999099 0.9895821 -0.9896744 0.9999099 0.9895821 -0.9896992 0.9999099 0.9895821 -0.9897306 0.9999099 0.9895821 -0.9897703 0.9999099 0.9895821 -0.9898206 0.9999099 0.9895821 -0.9898842 0.9999099 0.9895821 -0.9899646 0.9999099 0.9895821 -0.9900664 0.9999099 0.9895821 -0.9901951 0.9999099 0.9895821 -0.990358 0.9999099 0.9895821 -0.9905641 0.9999099 0.9895821 -0.9908248 0.9999099 0.9895821 -0.9911547 0.9999099 0.9895821 -0.991572 0.9999099 0.9895821 -0.9920999 0.9999099 0.9895821 -0.9927678 0.9999099 0.9895821 -0.9936128 0.9999099 0.9895821 -0.9946818 0.9999099 0.9895821 -0.9960342 0.9999099 0.9895821 -0.9977452 0.9999099 0.9895821 -0.9999099 0.9999099 0.9895821 -0.9999288 0.9982146 0.9917502 -0.9999437 0.9975143 0.9934695 -0.9917501 0.9999288 0.9917509 -0.9917501 0.9999288 0.9917509 -0.9917501 0.9999288 0.9917509 -0.9917501 0.9999288 0.9917509 -0.9917501 0.9999288 0.9917509 -0.9917501 0.9999288 0.9917508 -0.99175 0.9999288 0.9917508 -0.99175 0.9999288 0.9917508 -0.99175 0.9999288 0.9917507 -0.99175 0.9999288 0.9917507 -0.99175 0.9999288 0.9917506 -0.9917499 0.9999288 0.9917505 -0.9917499 0.9999288 0.9917504 -0.9917499 0.9999288 0.9917503 -0.9917499 0.9999288 0.9917502 -0.99175 0.9999288 0.9917502 -0.9917502 0.9999288 0.9917502 -0.9917504 0.9999288 0.9917502 -0.9917507 0.9999288 0.9917502 -0.991751 0.9999288 0.9917502 -0.9917515 0.9999288 0.9917502 -0.9917521 0.9999288 0.9917502 -0.9917528 0.9999288 0.9917502 -0.9917537 0.9999288 0.9917502 -0.9917549 0.9999288 0.9917502 -0.9917564 0.9999288 0.9917502 -0.9917582 0.9999288 0.9917502 -0.9917606 0.9999288 0.9917502 -0.9917636 0.9999288 0.9917502 -0.9917674 0.9999288 0.9917502 -0.9917722 0.9999288 0.9917502 -0.9917782 0.9999288 0.9917502 -0.9917859 0.9999288 0.9917502 -0.9917956 0.9999288 0.9917502 -0.9918079 0.9999288 0.9917502 -0.9918234 0.9999288 0.9917502 -0.9918431 0.9999288 0.9917502 -0.991868 0.9999288 0.9917502 -0.9918994 0.9999288 0.9917502 -0.9919392 0.9999288 0.9917502 -0.9919896 0.9999288 0.9917502 -0.9920533 0.9999288 0.9917502 -0.9921339 0.9999288 0.9917502 -0.9922358 0.9999288 0.9917502 -0.9923648 0.9999288 0.9917502 -0.992528 0.9999288 0.9917502 -0.9927345 0.9999288 0.9917502 -0.9929957 0.9999288 0.9917502 -0.9933261 0.9999288 0.9917502 -0.9937442 0.9999288 0.9917502 -0.9942731 0.9999288 0.9917502 -0.9949422 0.9999288 0.9917502 -0.9957887 0.9999288 0.9917502 -0.9968597 0.9999288 0.9917502 -0.9982146 0.9999288 0.9917502 -0.9999288 0.9999288 0.9917502 -0.9999437 0.9985868 0.9934695 -0.9934695 0.9999437 0.99347 -0.9934695 0.9999437 0.99347 -0.9934695 0.9999437 0.99347 -0.9934695 0.9999437 0.99347 -0.9934695 0.9999437 0.99347 -0.9934695 0.9999437 0.99347 -0.9934695 0.9999437 0.9934699 -0.9934694 0.9999437 0.9934699 -0.9934694 0.9999437 0.9934699 -0.9934694 0.9999437 0.9934698 -0.9934694 0.9999437 0.9934698 -0.9934694 0.9999437 0.9934698 -0.9934694 0.9999437 0.9934697 -0.9934694 0.9999437 0.9934696 -0.9934694 0.9999437 0.9934696 -0.9934694 0.9999437 0.9934695 -0.9934695 0.9999437 0.9934695 -0.9934697 0.9999437 0.9934695 -0.9934698 0.9999437 0.9934695 -0.9934701 0.9999437 0.9934695 -0.9934704 0.9999437 0.9934695 -0.9934707 0.9999437 0.9934695 -0.9934712 0.9999437 0.9934695 -0.9934718 0.9999437 0.9934695 -0.9934725 0.9999437 0.9934695 -0.9934734 0.9999437 0.9934695 -0.9934746 0.9999437 0.9934695 -0.9934761 0.9999437 0.9934695 -0.9934779 0.9999437 0.9934695 -0.9934803 0.9999437 0.9934695 -0.9934833 0.9999437 0.9934695 -0.9934871 0.9999437 0.9934695 -0.9934919 0.9999437 0.9934695 -0.993498 0.9999437 0.9934695 -0.9935057 0.9999437 0.9934695 -0.9935154 0.9999437 0.9934695 -0.9935277 0.9999437 0.9934695 -0.9935432 0.9999437 0.9934695 -0.9935629 0.9999437 0.9934695 -0.9935878 0.9999437 0.9934695 -0.9936193 0.9999437 0.9934695 -0.9936592 0.9999437 0.9934695 -0.9937096 0.9999437 0.9934695 -0.9937734 0.9999437 0.9934695 -0.9938541 0.9999437 0.9934695 -0.9939562 0.9999437 0.9934695 -0.9940854 0.9999437 0.9934695 -0.9942488 0.9999437 0.9934695 -0.9944556 0.9999437 0.9934695 -0.9947172 0.9999437 0.9934695 -0.9950481 0.9999437 0.9934695 -0.9954668 0.9999437 0.9934695 -0.9959964 0.9999437 0.9934695 -0.9966665 0.9999437 0.9934695 -0.9975143 0.9999437 0.9934695 -0.9985868 0.9999437 0.9934695 -0.9999437 0.9999437 0.9934695 -0.0000238 0.0000238 0.1044919 -0.0005417 0.0000238 0.1044919 -0.0011968 0.0000238 0.1044919 -0.0020256 0.0000238 0.1044919 -0.0030742 0.0000238 0.1044919 -0.0044007 0.0000238 0.1044919 -0.006079 0.0000238 0.1044919 -0.0082023 0.0000238 0.1044919 -0.0108885 0.0000238 0.1044919 -0.0142868 0.0000238 0.1044919 -0.0185862 0.0000238 0.1044919 -0.0240255 0.0000238 0.1044919 -0.0309069 0.0000238 0.1044919 -0.0396127 0.0000238 0.1044919 -0.0506267 0.0000238 0.1044919 -0.0645609 0.0000238 0.1044919 -0.0821895 0.0000238 0.1044919 -0.1044919 0.0000238 0.1044919 -0.1327073 0.0000238 0.1044919 -0.1684036 0.0000238 0.1044919 -0.2135639 0.0000238 0.1044919 -0.2706977 0.0000238 0.1044919 -0.3429792 0.0000238 0.1044919 -0.4344249 0.0000238 0.1044919 -0.5501155 0.0000238 0.1044919 -0.6964791 0.0000238 0.1044919 -0.8407292 0.0051514 0.1041632 -0.9033413 0.0279321 0.1098869 -0.9354466 0.0624569 0.1270339 -0.9545467 0.1059991 0.1555993 -0.9669269 0.1572498 0.1946509 -0.9754027 0.2151269 0.2428812 -0.9814251 0.2783684 0.2986524 -0.9858181 0.3454107 0.3600134 -0.9890841 0.4144197 0.4247763 -0.9915469 0.4834235 0.4906613 -0.993424 0.5504963 0.5554829 -0.9948662 0.6139459 0.6173355 -0.9959813 0.6724572 0.6747327 -0.9968475 0.7251659 0.7266763 -0.997523 0.7716588 0.7726513 -0.9980513 0.8119154 0.8125619 -0.9984653 0.8462171 0.846635 -0.9987905 0.8750477 0.8753162 -0.9990461 0.8990028 0.8991744 -0.9992474 0.9187175 0.9188267 -0.999406 0.9348153 0.9348845 -0.999531 0.9478754 0.9479192 -0.9996296 0.958416 0.9584436 -0.9997074 0.9668873 0.9669047 -0.9997689 0.9736726 0.9736835 -0.9998174 0.9790927 0.9790996 -0.9998557 0.9834129 0.9834172 -0.999886 0.9868505 0.9868532 -0.9999099 0.989582 0.9895837 -0.9999288 0.9917501 0.9917511 -0.9999437 0.9934695 0.9934701 -0.0000238 0.0005417 0.1044919 -0.0000382 0.0000382 0.1039884 -0.0006933 0.0000382 0.1039884 -0.0015221 0.0000382 0.1039884 -0.0025707 0.0000382 0.1039884 -0.0038972 0.0000382 0.1039884 -0.0055755 0.0000382 0.1039884 -0.0076988 0.0000382 0.1039884 -0.0103849 0.0000382 0.1039884 -0.0137833 0.0000382 0.1039884 -0.0180827 0.0000382 0.1039884 -0.023522 0.0000382 0.1039884 -0.0304033 0.0000382 0.1039884 -0.0391092 0.0000382 0.1039884 -0.0501232 0.0000382 0.1039884 -0.0640574 0.0000382 0.1039884 -0.081686 0.0000382 0.1039884 -0.1039884 0.0000382 0.1039884 -0.1322038 0.0000382 0.1039884 -0.1679 0.0000382 0.1039884 -0.2130604 0.0000382 0.1039884 -0.2701941 0.0000382 0.1039884 -0.3424757 0.0000382 0.1039884 -0.4339214 0.0000382 0.1039884 -0.549612 0.0000382 0.1039884 -0.6959756 0.0000382 0.1039884 -0.8405071 0.0051286 0.1036839 -0.9032596 0.0278872 0.1094702 -0.9354101 0.0624063 0.1266878 -0.9545286 0.1059489 0.1553195 -0.9669173 0.1572031 0.1944291 -0.9753975 0.2150852 0.2427083 -0.9814221 0.2783325 0.2985198 -0.9858163 0.3453807 0.3599134 -0.9890831 0.4143955 0.4247022 -0.9915463 0.4834045 0.4906072 -0.9934236 0.5504818 0.5554442 -0.994866 0.6139352 0.6173083 -0.9959811 0.6724495 0.6747138 -0.9968474 0.7251605 0.7266635 -0.997523 0.7716551 0.7726427 -0.9980512 0.8119128 0.8125561 -0.9984653 0.8462154 0.8466313 -0.9987905 0.8750466 0.8753137 -0.9990461 0.899002 0.8991728 -0.9992474 0.918717 0.9188257 -0.999406 0.9348149 0.9348838 -0.999531 0.9478752 0.9479187 -0.9996296 0.9584159 0.9584433 -0.9997074 0.9668872 0.9669045 -0.9997689 0.9736726 0.9736834 -0.9998174 0.9790927 0.9790995 -0.9998557 0.9834129 0.9834172 -0.999886 0.9868505 0.9868532 -0.9999099 0.989582 0.9895837 -0.9999288 0.9917501 0.9917511 -0.9999437 0.9934695 0.9934701 -0.0000238 0.0011968 0.1044919 -0.0000382 0.0006933 0.1039884 -0.0000611 0.0000611 0.1033562 -0.0008899 0.0000611 0.1033562 -0.0019385 0.0000611 0.1033562 -0.003265 0.0000611 0.1033562 -0.0049433 0.0000611 0.1033562 -0.0070666 0.0000611 0.1033562 -0.0097527 0.0000611 0.1033562 -0.0131511 0.0000611 0.1033562 -0.0174505 0.0000611 0.1033562 -0.0228898 0.0000611 0.1033562 -0.0297711 0.0000611 0.1033562 -0.038477 0.0000611 0.1033562 -0.049491 0.0000611 0.1033562 -0.0634252 0.0000611 0.1033562 -0.0810538 0.0000611 0.1033562 -0.1033562 0.0000611 0.1033562 -0.1315716 0.0000611 0.1033562 -0.1672678 0.0000611 0.1033562 -0.2124282 0.0000611 0.1033562 -0.2695619 0.0000611 0.1033562 -0.3418435 0.0000611 0.1033562 -0.4332891 0.0000611 0.1033562 -0.5489798 0.0000611 0.1033562 -0.6953434 0.0000611 0.1033562 -0.8402274 0.0051047 0.1030818 -0.9031567 0.0278347 0.1089464 -0.9353643 0.0623458 0.1262529 -0.9545059 0.1058883 0.1549679 -0.9669053 0.1571463 0.1941504 -0.9753908 0.2150342 0.2424911 -0.9814183 0.2782884 0.2983532 -0.9858141 0.3453439 0.3597877 -0.9890818 0.4143657 0.424609 -0.9915455 0.4833811 0.4905393 -0.9934231 0.550464 0.5553956 -0.9948657 0.6139219 0.6172741 -0.9959809 0.6724399 0.6746901 -0.9968473 0.7251537 0.7266473 -0.9975229 0.7716504 0.7726318 -0.9980512 0.8119096 0.8125489 -0.9984653 0.8462132 0.8466265 -0.9987904 0.8750451 0.8753107 -0.9990461 0.8990011 0.8991708 -0.9992474 0.9187164 0.9188244 -0.999406 0.9348146 0.934883 -0.999531 0.947875 0.9479182 -0.9996296 0.9584157 0.958443 -0.9997074 0.9668871 0.9669043 -0.9997689 0.9736725 0.9736833 -0.9998174 0.9790927 0.9790994 -0.9998557 0.9834129 0.9834171 -0.999886 0.9868505 0.9868531 -0.9999099 0.989582 0.9895837 -0.9999288 0.9917501 0.9917511 -0.9999437 0.9934695 0.9934701 -0.0000238 0.0020256 0.1044919 -0.0000382 0.0015221 0.1039884 -0.0000611 0.0008899 0.1033562 -0.0000978 0.0000978 0.102564 -0.0011463 0.0000978 0.102564 -0.0024729 0.0000978 0.102564 -0.0041512 0.0000978 0.102564 -0.0062744 0.0000978 0.102564 -0.0089606 0.0000978 0.102564 -0.012359 0.0000978 0.102564 -0.0166583 0.0000978 0.102564 -0.0220976 0.0000978 0.102564 -0.028979 0.0000978 0.102564 -0.0376849 0.0000978 0.102564 -0.0486989 0.0000978 0.102564 -0.0626331 0.0000978 0.102564 -0.0802616 0.0000978 0.102564 -0.102564 0.0000978 0.102564 -0.1307795 0.0000978 0.102564 -0.1664757 0.0000978 0.102564 -0.2116361 0.0000978 0.102564 -0.2687698 0.0000978 0.102564 -0.3410514 0.0000978 0.102564 -0.432497 0.0000978 0.102564 -0.5481876 0.0000978 0.102564 -0.6945513 0.0000978 0.102564 -0.8398756 0.0050826 0.1023268 -0.9030276 0.0277752 0.1082896 -0.9353068 0.0622749 0.1257074 -0.9544774 0.1058162 0.1545271 -0.9668902 0.1570779 0.1938011 -0.9753825 0.2149725 0.2422188 -0.9814136 0.2782347 0.2981445 -0.9858113 0.3452987 0.3596303 -0.9890801 0.414329 0.4244922 -0.9915446 0.4833522 0.4904542 -0.9934225 0.5504419 0.5553347 -0.9948653 0.6139056 0.6172312 -0.9959807 0.672428 0.6746604 -0.9968472 0.7251454 0.7266271 -0.9975228 0.7716446 0.7726182 -0.9980511 0.8119057 0.8125399 -0.9984653 0.8462106 0.8466206 -0.9987904 0.8750434 0.8753068 -0.9990461 0.899 0.8991683 -0.9992474 0.9187157 0.9188228 -0.999406 0.9348141 0.934882 -0.999531 0.9478746 0.9479176 -0.9996296 0.9584155 0.9584426 -0.9997074 0.966887 0.9669041 -0.9997689 0.9736724 0.9736831 -0.9998174 0.9790926 0.9790993 -0.9998557 0.9834129 0.9834171 -0.999886 0.9868505 0.9868531 -0.9999099 0.989582 0.9895836 -0.9999288 0.9917501 0.9917511 -0.9999437 0.9934695 0.9934701 -0.0000238 0.0030742 0.1044919 -0.0000382 0.0025707 0.1039884 -0.0000611 0.0019385 0.1033562 -0.0000978 0.0011463 0.102564 -0.0001565 0.0001565 0.1015742 -0.001483 0.0001565 0.1015742 -0.0031613 0.0001565 0.1015742 -0.0052846 0.0001565 0.1015742 -0.0079707 0.0001565 0.1015742 -0.0113691 0.0001565 0.1015742 -0.0156685 0.0001565 0.1015742 -0.0211078 0.0001565 0.1015742 -0.0279891 0.0001565 0.1015742 -0.036695 0.0001565 0.1015742 -0.047709 0.0001565 0.1015742 -0.0616432 0.0001565 0.1015742 -0.0792718 0.0001565 0.1015742 -0.1015742 0.0001565 0.1015742 -0.1297896 0.0001565 0.1015742 -0.1654858 0.0001565 0.1015742 -0.2106462 0.0001565 0.1015742 -0.2677799 0.0001565 0.1015742 -0.3400615 0.0001565 0.1015742 -0.4315072 0.0001565 0.1015742 -0.5471978 0.0001565 0.1015742 -0.6935614 0.0001565 0.1015742 -0.8394338 0.0050676 0.1013822 -0.9028657 0.0277111 0.1074677 -0.9352348 0.0621943 0.125025 -0.9544418 0.1057322 0.1539757 -0.9668714 0.1569971 0.1933641 -0.9753721 0.2148987 0.2418784 -0.9814076 0.2781701 0.2978834 -0.9858079 0.3452442 0.3594334 -0.9890781 0.4142845 0.4243463 -0.9915433 0.4833171 0.4903479 -0.9934218 0.550415 0.5552585 -0.9948649 0.6138855 0.6171776 -0.9959804 0.6724135 0.6746233 -0.996847 0.7251351 0.7266018 -0.9975227 0.7716375 0.7726012 -0.9980511 0.8119009 0.8125286 -0.9984652 0.8462073 0.8466132 -0.9987904 0.8750412 0.875302 -0.9990461 0.8989986 0.8991652 -0.9992474 0.9187148 0.9188208 -0.999406 0.9348135 0.9348807 -0.999531 0.9478743 0.9479168 -0.9996296 0.9584153 0.9584421 -0.9997074 0.9668869 0.9669037 -0.9997689 0.9736723 0.9736829 -0.9998174 0.9790925 0.9790992 -0.9998557 0.9834128 0.983417 -0.999886 0.9868504 0.986853 -0.9999099 0.989582 0.9895836 -0.9999288 0.9917501 0.9917511 -0.9999437 0.9934695 0.9934701 -0.0000238 0.0044007 0.1044919 -0.0000382 0.0038972 0.1039884 -0.0000611 0.003265 0.1033562 -0.0000978 0.0024729 0.102564 -0.0001565 0.001483 0.1015742 -0.0002504 0.0002504 0.1003416 -0.0019287 0.0002504 0.1003416 -0.004052 0.0002504 0.1003416 -0.0067381 0.0002504 0.1003416 -0.0101365 0.0002504 0.1003416 -0.0144359 0.0002504 0.1003416 -0.0198752 0.0002504 0.1003416 -0.0267565 0.0002504 0.1003416 -0.0354624 0.0002504 0.1003416 -0.0464764 0.0002504 0.1003416 -0.0604106 0.0002504 0.1003416 -0.0780392 0.0002504 0.1003416 -0.1003416 0.0002504 0.1003416 -0.128557 0.0002504 0.1003416 -0.1642532 0.0002504 0.1003416 -0.2094136 0.0002504 0.1003416 -0.2665473 0.0002504 0.1003416 -0.3388289 0.0002504 0.1003416 -0.4302746 0.0002504 0.1003416 -0.5459652 0.0002504 0.1003416 -0.6923288 0.0002504 0.1003416 -0.8388802 0.0050694 0.1002045 -0.9026634 0.0276479 0.1064427 -0.9351449 0.0621069 0.1241741 -0.9543974 0.1056375 0.1532882 -0.9668479 0.156904 0.1928195 -0.9753591 0.2148124 0.2414541 -0.9814002 0.2780936 0.2975582 -0.9858036 0.3451791 0.3591882 -0.9890755 0.4142311 0.4241644 -0.9915418 0.4832747 0.4902154 -0.9934209 0.5503825 0.5551637 -0.9948643 0.6138613 0.6171109 -0.9959801 0.6723959 0.6745771 -0.9968468 0.7251226 0.7265703 -0.9975226 0.7716288 0.77258 -0.998051 0.8118949 0.8125145 -0.9984652 0.8462034 0.8466039 -0.9987904 0.8750386 0.8752959 -0.9990461 0.8989969 0.8991613 -0.9992474 0.9187137 0.9188183 -0.9994059 0.9348128 0.9348791 -0.999531 0.9478738 0.9479157 -0.9996296 0.958415 0.9584414 -0.9997074 0.9668867 0.9669033 -0.9997689 0.9736722 0.9736827 -0.9998174 0.9790925 0.979099 -0.9998557 0.9834128 0.9834169 -0.999886 0.9868504 0.986853 -0.9999099 0.9895819 0.9895836 -0.9999288 0.9917501 0.9917511 -0.9999437 0.9934695 0.9934701 -0.0000238 0.006079 0.1044919 -0.0000382 0.0055755 0.1039884 -0.0000611 0.0049433 0.1033562 -0.0000978 0.0041512 0.102564 -0.0001565 0.0031613 0.1015742 -0.0002504 0.0019287 0.1003416 -0.0004008 0.0004008 0.0988137 -0.0025241 0.0004008 0.0988137 -0.0052103 0.0004008 0.0988137 -0.0086086 0.0004008 0.0988137 -0.012908 0.0004008 0.0988137 -0.0183473 0.0004008 0.0988137 -0.0252287 0.0004008 0.0988137 -0.0339345 0.0004008 0.0988137 -0.0449485 0.0004008 0.0988137 -0.0588827 0.0004008 0.0988137 -0.0765113 0.0004008 0.0988137 -0.0988137 0.0004008 0.0988137 -0.1270291 0.0004008 0.0988137 -0.1627254 0.0004008 0.0988137 -0.2078857 0.0004008 0.0988137 -0.2650195 0.0004008 0.0988137 -0.337301 0.0004008 0.0988137 -0.4287467 0.0004008 0.0988137 -0.5444373 0.0004008 0.0988137 -0.6908009 0.0004008 0.0988137 -0.8381886 0.0051048 0.0987424 -0.9024114 0.0275966 0.1051696 -0.9350332 0.0620199 0.1231174 -0.9543421 0.1055364 0.1524348 -0.9668187 0.1568008 0.1921435 -0.975343 0.2147144 0.2409276 -0.9813911 0.2780055 0.2971547 -0.9857982 0.3451032 0.3588839 -0.9890723 0.4141683 0.4239389 -0.9915399 0.4832246 0.4900511 -0.9934197 0.5503438 0.5550461 -0.9948636 0.6138323 0.6170281 -0.9959797 0.6723748 0.6745198 -0.9968465 0.7251076 0.7265312 -0.9975224 0.7716184 0.7725538 -0.9980509 0.8118878 0.8124971 -0.9984651 0.8461986 0.8465925 -0.9987903 0.8750355 0.8752885 -0.9990461 0.8989948 0.8991565 -0.9992473 0.9187123 0.9188152 -0.9994059 0.9348119 0.9348771 -0.999531 0.9478733 0.9479145 -0.9996296 0.9584146 0.9584406 -0.9997074 0.9668865 0.9669028 -0.9997689 0.9736721 0.9736824 -0.9998174 0.9790924 0.9790988 -0.9998557 0.9834127 0.9834168 -0.999886 0.9868504 0.9868529 -0.9999099 0.9895819 0.9895835 -0.9999288 0.99175 0.991751 -0.9999437 0.9934695 0.9934701 -0.0000238 0.0082023 0.1044919 -0.0000382 0.0076988 0.1039884 -0.0000611 0.0070666 0.1033562 -0.0000978 0.0062744 0.102564 -0.0001565 0.0052846 0.1015742 -0.0002504 0.004052 0.1003416 -0.0004008 0.0025241 0.0988137 -0.0006416 0.0006416 0.0969312 -0.0033277 0.0006416 0.0969312 -0.0067261 0.0006416 0.0969312 -0.0110255 0.0006416 0.0969312 -0.0164648 0.0006416 0.0969312 -0.0233461 0.0006416 0.0969312 -0.032052 0.0006416 0.0969312 -0.043066 0.0006416 0.0969312 -0.0570002 0.0006416 0.0969312 -0.0746288 0.0006416 0.0969312 -0.0969312 0.0006416 0.0969312 -0.1251466 0.0006416 0.0969312 -0.1608428 0.0006416 0.0969312 -0.2060032 0.0006416 0.0969312 -0.2631369 0.0006416 0.0969312 -0.3354185 0.0006416 0.0969312 -0.4268641 0.0006416 0.0969312 -0.5425548 0.0006416 0.0969312 -0.6889184 0.0006416 0.0969312 -0.8373283 0.0052028 0.0969372 -0.9020992 0.0275778 0.1035972 -0.9348949 0.0619473 0.1218126 -0.9542739 0.1054384 0.1513813 -0.9667827 0.1566936 0.1913094 -0.9753231 0.2146085 0.2402781 -0.9813797 0.2779077 0.296657 -0.9857916 0.3450175 0.3585088 -0.9890684 0.4140964 0.4236608 -0.9915376 0.4831666 0.4898485 -0.9934183 0.5502987 0.5549011 -0.9948628 0.6137984 0.6169261 -0.9959791 0.67235 0.6744492 -0.9968462 0.7250899 0.7264831 -0.9975222 0.7716061 0.7725214 -0.9980508 0.8118794 0.8124756 -0.998465 0.8461929 0.8465783 -0.9987903 0.8750317 0.8752793 -0.999046 0.8989923 0.8991505 -0.9992473 0.9187107 0.9188114 -0.9994059 0.9348109 0.9348747 -0.999531 0.9478726 0.9479129 -0.9996296 0.9584142 0.9584396 -0.9997074 0.9668862 0.9669022 -0.9997689 0.9736719 0.973682 -0.9998174 0.9790923 0.9790986 -0.9998557 0.9834127 0.9834166 -0.999886 0.9868503 0.9868528 -0.9999099 0.9895819 0.9895834 -0.9999288 0.99175 0.991751 -0.9999437 0.9934694 0.9934701 -0.0000238 0.0108885 0.1044919 -0.0000382 0.0103849 0.1039884 -0.0000611 0.0097527 0.1033562 -0.0000978 0.0089606 0.102564 -0.0001565 0.0079707 0.1015742 -0.0002504 0.0067381 0.1003416 -0.0004008 0.0052103 0.0988137 -0.0006416 0.0033277 0.0969312 -0.0010268 0.0010268 0.0946303 -0.0044252 0.0010268 0.0946303 -0.0087246 0.0010268 0.0946303 -0.0141639 0.0010268 0.0946303 -0.0210452 0.0010268 0.0946303 -0.0297511 0.0010268 0.0946303 -0.0407651 0.0010268 0.0946303 -0.0546993 0.0010268 0.0946303 -0.0723279 0.0010268 0.0946303 -0.0946303 0.0010268 0.0946303 -0.1228457 0.0010268 0.0946303 -0.1585419 0.0010268 0.0946303 -0.2037023 0.0010268 0.0946303 -0.260836 0.0010268 0.0946303 -0.3331176 0.0010268 0.0946303 -0.4245633 0.0010268 0.0946303 -0.5402539 0.0010268 0.0946303 -0.6866175 0.0010268 0.0946303 -0.8362644 0.0054121 0.0947256 -0.9017148 0.0276281 0.1016696 -0.9347252 0.061916 0.1202135 -0.9541902 0.1053624 0.1500908 -0.9667385 0.1565954 0.190288 -0.9752987 0.2145034 0.2394831 -0.9813659 0.2778058 0.296048 -0.9857835 0.3449254 0.3580498 -0.9890637 0.4140176 0.4233207 -0.9915347 0.4831021 0.4896008 -0.9934166 0.550248 0.5547238 -0.9948617 0.6137599 0.6168013 -0.9959785 0.6723217 0.6743629 -0.9968458 0.7250697 0.7264242 -0.997522 0.7715919 0.7724818 -0.9980506 0.8118697 0.8124493 -0.9984649 0.8461864 0.8465611 -0.9987902 0.8750274 0.875268 -0.999046 0.8989895 0.8991433 -0.9992473 0.9187089 0.9188067 -0.9994059 0.9348097 0.9348717 -0.999531 0.9478718 0.947911 -0.9996296 0.9584137 0.9584384 -0.9997074 0.9668859 0.9669014 -0.9997689 0.9736717 0.9736815 -0.9998174 0.9790921 0.9790983 -0.9998557 0.9834126 0.9834164 -0.999886 0.9868503 0.9868527 -0.9999099 0.9895819 0.9895834 -0.9999288 0.99175 0.991751 -0.9999437 0.9934694 0.99347 -0.0000238 0.0142868 0.1044919 -0.0000382 0.0137833 0.1039884 -0.0000611 0.0131511 0.1033562 -0.0000978 0.012359 0.102564 -0.0001565 0.0113691 0.1015742 -0.0002504 0.0101365 0.1003416 -0.0004008 0.0086086 0.0988137 -0.0006416 0.0067261 0.0969312 -0.0010268 0.0044252 0.0946303 -0.0016435 0.0016435 0.0918486 -0.0059429 0.0016435 0.0918486 -0.0113822 0.0016435 0.0918486 -0.0182636 0.0016435 0.0918486 -0.0269694 0.0016435 0.0918486 -0.0379834 0.0016435 0.0918486 -0.0519176 0.0016435 0.0918486 -0.0695462 0.0016435 0.0918486 -0.0918486 0.0016435 0.0918486 -0.120064 0.0016435 0.0918486 -0.1557603 0.0016435 0.0918486 -0.2009206 0.0016435 0.0918486 -0.2580543 0.0016435 0.0918486 -0.3303359 0.0016435 0.0918486 -0.4217816 0.0016435 0.0918486 -0.5374722 0.0016435 0.0918486 -0.6838358 0.0016435 0.0918486 -0.8349593 0.0058134 0.0920441 -0.9012461 0.0278105 0.0993306 -0.9345187 0.0619734 0.1182739 -0.9540886 0.1053433 0.1485263 -0.966685 0.1565315 0.1890504 -0.9752692 0.2144168 0.2385201 -0.9813491 0.2777122 0.2953106 -0.9857738 0.3448353 0.3574942 -0.9890579 0.4139373 0.4229091 -0.9915312 0.4830346 0.489301 -0.9934145 0.5501939 0.5545093 -0.9948604 0.6137183 0.6166504 -0.9959777 0.6722907 0.6742585 -0.9968453 0.7250473 0.726353 -0.9975217 0.7715762 0.772434 -0.9980504 0.8118589 0.8124175 -0.9984648 0.8461791 0.8465402 -0.9987902 0.8750225 0.8752545 -0.9990459 0.8989863 0.8991345 -0.9992473 0.9187068 0.9188011 -0.9994059 0.9348083 0.9348681 -0.9995309 0.947871 0.9479088 -0.9996296 0.9584132 0.958437 -0.9997074 0.9668855 0.9669005 -0.9997689 0.9736715 0.9736809 -0.9998174 0.979092 0.9790979 -0.9998557 0.9834125 0.9834162 -0.999886 0.9868502 0.9868525 -0.9999099 0.9895818 0.9895833 -0.9999288 0.99175 0.9917509 -0.9999437 0.9934694 0.99347 -0.0000238 0.0185862 0.1044919 -0.0000382 0.0180827 0.1039884 -0.0000611 0.0174505 0.1033562 -0.0000978 0.0166583 0.102564 -0.0001565 0.0156685 0.1015742 -0.0002504 0.0144359 0.1003416 -0.0004008 0.012908 0.0988137 -0.0006416 0.0110255 0.0969312 -0.0010268 0.0087246 0.0946303 -0.0016435 0.0059429 0.0918486 -0.0026305 0.0026305 0.0885362 -0.0080698 0.0026305 0.0885362 -0.0149512 0.0026305 0.0885362 -0.023657 0.0026305 0.0885362 -0.0346711 0.0026305 0.0885362 -0.0486053 0.0026305 0.0885362 -0.0662338 0.0026305 0.0885362 -0.0885362 0.0026305 0.0885362 -0.1167517 0.0026305 0.0885362 -0.1524479 0.0026305 0.0885362 -0.1976083 0.0026305 0.0885362 -0.254742 0.0026305 0.0885362 -0.3270236 0.0026305 0.0885362 -0.4184692 0.0026305 0.0885362 -0.5341598 0.0026305 0.0885362 -0.6805235 0.0026305 0.0885362 -0.8333779 0.0065402 0.0888403 -0.900682 0.0282324 0.0965334 -0.9342712 0.062202 0.1159552 -0.9539671 0.1054431 0.1466571 -0.9666211 0.1565473 0.1875725 -0.975234 0.2143816 0.2373708 -0.9813291 0.2776503 0.2944309 -0.9857621 0.3447636 0.3568316 -0.989051 0.4138668 0.4224183 -0.9915271 0.4829718 0.4889438 -0.993412 0.5501416 0.5542536 -0.9948589 0.6136769 0.6164706 -0.9959768 0.6722594 0.674134 -0.9968448 0.7250244 0.7262683 -0.9975213 0.7715599 0.772377 -0.9980502 0.8118476 0.8123797 -0.9984647 0.8461714 0.8465153 -0.9987901 0.8750173 0.8752383 -0.9990459 0.8989829 0.899124 -0.9992472 0.9187045 0.9187944 -0.9994059 0.9348069 0.9348638 -0.9995309 0.94787 0.947906 -0.9996296 0.9584126 0.9584353 -0.9997074 0.9668852 0.9668994 -0.9997689 0.9736712 0.9736802 -0.9998174 0.9790919 0.9790975 -0.9998557 0.9834124 0.9834159 -0.999886 0.9868502 0.9868524 -0.9999099 0.9895818 0.9895832 -0.9999288 0.99175 0.9917508 -0.9999437 0.9934694 0.9934699 -0.0000238 0.0240255 0.1044919 -0.0000382 0.023522 0.1039884 -0.0000611 0.0228898 0.1033562 -0.0000978 0.0220976 0.102564 -0.0001565 0.0211078 0.1015742 -0.0002504 0.0198752 0.1003416 -0.0004008 0.0183473 0.0988137 -0.0006416 0.0164648 0.0969312 -0.0010268 0.0141639 0.0946303 -0.0016435 0.0113822 0.0918486 -0.0026305 0.0080698 0.0885362 -0.0042103 0.0042103 0.0846767 -0.0110917 0.0042103 0.0846767 -0.0197975 0.0042103 0.0846767 -0.0308116 0.0042103 0.0846767 -0.0447458 0.0042103 0.0846767 -0.0623743 0.0042103 0.0846767 -0.0846767 0.0042103 0.0846767 -0.1128922 0.0042103 0.0846767 -0.1485884 0.0042103 0.0846767 -0.1937488 0.0042103 0.0846767 -0.2508825 0.0042103 0.0846767 -0.3231641 0.0042103 0.0846767 -0.4146097 0.0042103 0.0846767 -0.5303003 0.0042103 0.0846767 -0.676664 0.0042103 0.0846767 -0.8314967 0.0078103 0.0850926 -0.9000167 0.0290732 0.0932573 -0.9339805 0.062742 0.1132408 -0.9538247 0.1057683 0.1444705 -0.9665463 0.1567226 0.185845 -0.9751928 0.2144566 0.2360282 -0.9813057 0.2776626 0.2934037 -0.9857485 0.3447407 0.3560582 -0.989043 0.4138277 0.4218457 -0.9915223 0.4829286 0.488527 -0.9934091 0.5501012 0.5539555 -0.9948571 0.6136427 0.616261 -0.9959757 0.6722322 0.673989 -0.9968441 0.7250039 0.7261694 -0.9975209 0.7715449 0.7723106 -0.99805 0.811837 0.8123356 -0.9984645 0.8461641 0.8464864 -0.99879 0.8750124 0.8752194 -0.9990458 0.8989796 0.8991118 -0.9992472 0.9187024 0.9187865 -0.9994059 0.9348055 0.9348588 -0.9995309 0.9478691 0.9479029 -0.9996296 0.958412 0.9584333 -0.9997074 0.9668848 0.9668982 -0.9997689 0.973671 0.9736794 -0.9998174 0.9790917 0.979097 -0.9998557 0.9834123 0.9834156 -0.999886 0.9868501 0.9868522 -0.9999099 0.9895818 0.9895831 -0.9999288 0.9917499 0.9917507 -0.9999437 0.9934694 0.9934699 -0.0000238 0.0309069 0.1044919 -0.0000382 0.0304033 0.1039884 -0.0000611 0.0297711 0.1033562 -0.0000978 0.028979 0.102564 -0.0001565 0.0279891 0.1015742 -0.0002504 0.0267565 0.1003416 -0.0004008 0.0252287 0.0988137 -0.0006416 0.0233461 0.0969312 -0.0010268 0.0210452 0.0946303 -0.0016435 0.0182636 0.0918486 -0.0026305 0.0149512 0.0885362 -0.0042103 0.0110917 0.0846767 -0.0067388 0.0067388 0.0803239 -0.0154447 0.0067388 0.0803239 -0.0264587 0.0067388 0.0803239 -0.0403929 0.0067388 0.0803239 -0.0580214 0.0067388 0.0803239 -0.0803239 0.0067388 0.0803239 -0.1085393 0.0067388 0.0803239 -0.1442355 0.0067388 0.0803239 -0.1893959 0.0067388 0.0803239 -0.2465296 0.0067388 0.0803239 -0.3188112 0.0067388 0.0803239 -0.4102568 0.0067388 0.0803239 -0.5259474 0.0067388 0.0803239 -0.6723111 0.0067388 0.0803239 -0.8293233 0.0099781 0.0808475 -0.8992555 0.0306306 0.0895408 -0.9336494 0.0638283 0.1101631 -0.953663 0.1064997 0.1419934 -0.9664615 0.1571937 0.1838895 -0.9751462 0.2147432 0.2345093 -0.9812792 0.2778236 0.2922423 -0.9857332 0.3448204 0.3551842 -0.9890339 0.4138582 0.4211988 -0.9915169 0.4829319 0.4880563 -0.9934058 0.5500915 0.5536189 -0.9948551 0.6136284 0.6160243 -0.9959745 0.672218 0.6738253 -0.9968433 0.7249916 0.7260579 -0.9975204 0.7715352 0.7722356 -0.9980497 0.8118298 0.8122858 -0.9984643 0.8461589 0.8464537 -0.9987899 0.8750088 0.8751981 -0.9990458 0.8989771 0.8990981 -0.9992472 0.9187008 0.9187777 -0.9994058 0.9348044 0.9348532 -0.9995309 0.9478684 0.9478993 -0.9996296 0.9584115 0.958431 -0.9997074 0.9668845 0.9668967 -0.9997689 0.9736708 0.9736785 -0.9998174 0.9790916 0.9790964 -0.9998557 0.9834122 0.9834152 -0.999886 0.9868501 0.986852 -0.9999099 0.9895817 0.9895829 -0.9999288 0.9917499 0.9917507 -0.9999437 0.9934694 0.9934698 -0.0000238 0.0396127 0.1044919 -0.0000382 0.0391092 0.1039884 -0.0000611 0.038477 0.1033562 -0.0000978 0.0376849 0.102564 -0.0001565 0.036695 0.1015742 -0.0002504 0.0354624 0.1003416 -0.0004008 0.0339345 0.0988137 -0.0006416 0.032052 0.0969312 -0.0010268 0.0297511 0.0946303 -0.0016435 0.0269694 0.0918486 -0.0026305 0.023657 0.0885362 -0.0042103 0.0197975 0.0846767 -0.0067388 0.0154447 0.0803239 -0.0107859 0.0107859 0.075665 -0.0217999 0.0107859 0.075665 -0.0357341 0.0107859 0.075665 -0.0533626 0.0107859 0.075665 -0.075665 0.0107859 0.075665 -0.1038805 0.0107859 0.075665 -0.1395767 0.0107859 0.075665 -0.1847371 0.0107859 0.075665 -0.2418708 0.0107859 0.075665 -0.3141524 0.0107859 0.075665 -0.405598 0.0107859 0.075665 -0.5212886 0.0107859 0.075665 -0.6676523 0.0107859 0.075665 -0.8269342 0.0136166 0.0762831 -0.8984278 0.0333932 0.0855374 -0.9332914 0.0658501 0.1068496 -0.9534887 0.1079385 0.139329 -0.9663702 0.15819 0.1817879 -0.9750962 0.2154135 0.2328783 -0.9812508 0.2782606 0.2909959 -0.9857167 0.3450957 0.3542467 -0.9890241 0.4140252 0.4205051 -0.991511 0.4830292 0.4875517 -0.9934023 0.5501456 0.5532582 -0.994853 0.6136569 0.6157707 -0.9959732 0.672232 0.6736499 -0.9968425 0.7249978 0.7259384 -0.9975199 0.7715376 0.7721553 -0.9980494 0.8118303 0.8122325 -0.9984642 0.8461587 0.8464187 -0.9987897 0.8750084 0.8751754 -0.9990457 0.8989767 0.8990834 -0.9992471 0.9187004 0.9187683 -0.9994058 0.9348042 0.9348472 -0.9995309 0.9478683 0.9478954 -0.9996295 0.9584114 0.9584286 -0.9997074 0.9668844 0.9668952 -0.9997689 0.9736708 0.9736776 -0.9998174 0.9790916 0.9790958 -0.9998557 0.9834122 0.9834149 -0.999886 0.98685 0.9868517 -0.9999099 0.9895817 0.9895828 -0.9999288 0.9917499 0.9917506 -0.9999437 0.9934694 0.9934698 -0.0000238 0.0506267 0.1044919 -0.0000382 0.0501232 0.1039884 -0.0000611 0.049491 0.1033562 -0.0000978 0.0486989 0.102564 -0.0001565 0.047709 0.1015742 -0.0002504 0.0464764 0.1003416 -0.0004008 0.0449485 0.0988137 -0.0006416 0.043066 0.0969312 -0.0010268 0.0407651 0.0946303 -0.0016435 0.0379834 0.0918486 -0.0026305 0.0346711 0.0885362 -0.0042103 0.0308116 0.0846767 -0.0067388 0.0264587 0.0803239 -0.0107859 0.0217999 0.075665 -0.0172633 0.0172633 0.0711285 -0.0311975 0.0172633 0.0711285 -0.0488261 0.0172633 0.0711285 -0.0711285 0.0172633 0.0711285 -0.099344 0.0172633 0.0711285 -0.1350402 0.0172633 0.0711285 -0.1802005 0.0172633 0.0711285 -0.2373343 0.0172633 0.0711285 -0.3096159 0.0172633 0.0711285 -0.4010615 0.0172633 0.0711285 -0.5167521 0.0172633 0.0711285 -0.6631157 0.0172633 0.0711285 -0.8245426 0.0196467 0.0718184 -0.8976087 0.0381561 0.0816135 -0.9329391 0.0694453 0.1036038 -0.9533177 0.1105818 0.1367213 -0.9662809 0.160092 0.179733 -0.9750472 0.2167545 0.2312846 -0.9812231 0.2791873 0.2897788 -0.9857006 0.3457234 0.3533318 -0.9890146 0.4144423 0.4198285 -0.9915054 0.4833013 0.4870597 -0.9933988 0.5503203 0.5529065 -0.9948509 0.6137675 0.6155236 -0.9959719 0.6723012 0.673479 -0.9968418 0.7250408 0.725822 -0.9975194 0.7715641 0.7720771 -0.9980491 0.8118466 0.8121806 -0.998464 0.8461687 0.8463846 -0.9987896 0.8750145 0.8751532 -0.9990456 0.8989805 0.8990691 -0.9992471 0.9187027 0.9187591 -0.9994058 0.9348056 0.9348413 -0.9995309 0.9478691 0.9478917 -0.9996295 0.958412 0.9584262 -0.9997074 0.9668847 0.9668937 -0.9997688 0.973671 0.9736766 -0.9998174 0.9790917 0.9790952 -0.9998557 0.9834123 0.9834145 -0.999886 0.9868501 0.9868515 -0.9999099 0.9895817 0.9895826 -0.9999288 0.9917499 0.9917505 -0.9999437 0.9934694 0.9934697 -0.0000238 0.0645609 0.1044919 -0.0000382 0.0640574 0.1039884 -0.0000611 0.0634252 0.1033562 -0.0000978 0.0626331 0.102564 -0.0001565 0.0616432 0.1015742 -0.0002504 0.0604106 0.1003416 -0.0004008 0.0588827 0.0988137 -0.0006416 0.0570002 0.0969312 -0.0010268 0.0546993 0.0946303 -0.0016435 0.0519176 0.0918486 -0.0026305 0.0486053 0.0885362 -0.0042103 0.0447458 0.0846767 -0.0067388 0.0403929 0.0803239 -0.0107859 0.0357341 0.075665 -0.0172633 0.0311975 0.0711285 -0.0276309 0.0276309 0.0675619 -0.0452595 0.0276309 0.0675619 -0.0675619 0.0276309 0.0675619 -0.0957773 0.0276309 0.0675619 -0.1314736 0.0276309 0.0675619 -0.1766339 0.0276309 0.0675619 -0.2337676 0.0276309 0.0675619 -0.3060492 0.0276309 0.0675619 -0.3974949 0.0276309 0.0675619 -0.5131855 0.0276309 0.0675619 -0.6595491 0.0276309 0.0675619 -0.8226154 0.0295373 0.068295 -0.8969554 0.0461985 0.0785108 -0.9326595 0.0756464 0.1010384 -0.9531823 0.1152388 0.134662 -0.9662104 0.1635226 0.1781114 -0.9750086 0.2192389 0.2300279 -0.9812013 0.2809573 0.2888196 -0.9856879 0.3469645 0.352611 -0.9890072 0.4152991 0.4192956 -0.9915009 0.4838841 0.4866724 -0.9933961 0.5507113 0.5526297 -0.9948493 0.6140266 0.6153291 -0.9959709 0.6724711 0.6733446 -0.9968411 0.7251511 0.7257304 -0.9975191 0.7716352 0.7720156 -0.9980488 0.8118921 0.8121398 -0.9984638 0.8461977 0.8463578 -0.9987895 0.8750329 0.8751357 -0.9990456 0.8989921 0.8990578 -0.999247 0.9187101 0.9187518 -0.9994057 0.9348102 0.9348367 -0.9995309 0.947872 0.9478888 -0.9996295 0.9584138 0.9584243 -0.9997074 0.9668859 0.9668925 -0.9997688 0.9736717 0.9736759 -0.9998174 0.9790921 0.9790948 -0.9998557 0.9834126 0.9834142 -0.999886 0.9868503 0.9868513 -0.9999099 0.9895819 0.9895825 -0.9999288 0.99175 0.9917504 -0.9999437 0.9934694 0.9934697 -0.0000238 0.0821895 0.1044919 -0.0000382 0.081686 0.1039884 -0.0000611 0.0810538 0.1033562 -0.0000978 0.0802616 0.102564 -0.0001565 0.0792718 0.1015742 -0.0002504 0.0780392 0.1003416 -0.0004008 0.0765113 0.0988137 -0.0006416 0.0746288 0.0969312 -0.0010268 0.0723279 0.0946303 -0.0016435 0.0695462 0.0918486 -0.0026305 0.0662338 0.0885362 -0.0042103 0.0623743 0.0846767 -0.0067388 0.0580214 0.0803239 -0.0107859 0.0533626 0.075665 -0.0172633 0.0488261 0.0711285 -0.0276309 0.0452595 0.0675619 -0.0441188 0.0441188 0.0664212 -0.0664212 0.0441188 0.0664212 -0.0946366 0.0441188 0.0664212 -0.1303328 0.0441188 0.0664212 -0.1754932 0.0441188 0.0664212 -0.2326269 0.0441188 0.0664212 -0.3049085 0.0441188 0.0664212 -0.3963542 0.0441188 0.0664212 -0.5120448 0.0441188 0.0664212 -0.6584084 0.0441188 0.0664212 -0.8219901 0.0455041 0.0671656 -0.8967447 0.0594506 0.0775151 -0.9325696 0.0860209 0.1002154 -0.9531389 0.1231452 0.1340017 -0.9661878 0.1694384 0.1775917 -0.9749962 0.2235962 0.2296253 -0.9811943 0.2841192 0.2885124 -0.9856839 0.3492254 0.3523802 -0.9890048 0.4168922 0.419125 -0.9914995 0.4849907 0.4865484 -0.9933953 0.5514695 0.5525411 -0.9948487 0.6145393 0.6152669 -0.9959706 0.6728136 0.6733015 -0.9968409 0.7253775 0.7257011 -0.9975189 0.7717834 0.7719959 -0.9980488 0.8119884 0.8121268 -0.9984638 0.8462598 0.8463492 -0.9987895 0.8750727 0.8751301 -0.9990455 0.8990175 0.8990542 -0.999247 0.9187262 0.9187495 -0.9994057 0.9348204 0.9348352 -0.9995308 0.9478785 0.9478878 -0.9996295 0.9584178 0.9584237 -0.9997074 0.9668884 0.9668922 -0.9997688 0.9736733 0.9736756 -0.9998174 0.9790931 0.9790946 -0.9998557 0.9834132 0.9834141 -0.999886 0.9868507 0.9868512 -0.9999099 0.9895821 0.9895825 -0.9999288 0.9917502 0.9917504 -0.9999437 0.9934695 0.9934697 -0.0000238 0.1044919 0.1044919 -0.0000382 0.1039884 0.1039884 -0.0000611 0.1033562 0.1033562 -0.0000978 0.102564 0.102564 -0.0001565 0.1015742 0.1015742 -0.0002504 0.1003416 0.1003416 -0.0004008 0.0988137 0.0988137 -0.0006416 0.0969312 0.0969312 -0.0010268 0.0946303 0.0946303 -0.0016435 0.0918486 0.0918486 -0.0026305 0.0885362 0.0885362 -0.0042103 0.0846767 0.0846767 -0.0067388 0.0803239 0.0803239 -0.0107859 0.075665 0.075665 -0.0172633 0.0711285 0.0711285 -0.0276309 0.0675619 0.0675619 -0.0441188 0.0664212 0.0664212 -0.0664212 0.0664212 0.0664212 -0.0946366 0.0664212 0.0664212 -0.1303328 0.0664212 0.0664212 -0.1754932 0.0664212 0.0664212 -0.2326269 0.0664212 0.0664212 -0.3049085 0.0664212 0.0664212 -0.3963542 0.0664212 0.0664212 -0.5120448 0.0664212 0.0664212 -0.6584084 0.0664212 0.0664212 -0.8219901 0.0671656 0.0671656 -0.8967447 0.0775151 0.0775151 -0.9325696 0.1002154 0.1002154 -0.9531389 0.1340017 0.1340017 -0.9661878 0.1775917 0.1775917 -0.9749962 0.2296253 0.2296253 -0.9811943 0.2885124 0.2885124 -0.9856839 0.3523802 0.3523802 -0.9890048 0.419125 0.419125 -0.9914995 0.4865484 0.4865484 -0.9933953 0.5525411 0.5525411 -0.9948487 0.6152669 0.6152669 -0.9959706 0.6733015 0.6733015 -0.9968409 0.7257011 0.7257011 -0.9975189 0.7719959 0.7719959 -0.9980488 0.8121268 0.8121268 -0.9984638 0.8463492 0.8463492 -0.9987895 0.8751301 0.8751301 -0.9990455 0.8990542 0.8990542 -0.999247 0.9187495 0.9187495 -0.9994057 0.9348352 0.9348352 -0.9995308 0.9478878 0.9478878 -0.9996295 0.9584237 0.9584237 -0.9997074 0.9668922 0.9668922 -0.9997688 0.9736756 0.9736756 -0.9998174 0.9790946 0.9790946 -0.9998557 0.9834141 0.9834141 -0.999886 0.9868512 0.9868512 -0.9999099 0.9895825 0.9895825 -0.9999288 0.9917504 0.9917504 -0.9999437 0.9934697 0.9934697 -0.0000238 0.1327073 0.1044919 -0.0000382 0.1322038 0.1039884 -0.0000611 0.1315716 0.1033562 -0.0000978 0.1307795 0.102564 -0.0001565 0.1297896 0.1015742 -0.0002504 0.128557 0.1003416 -0.0004008 0.1270291 0.0988137 -0.0006416 0.1251466 0.0969312 -0.0010268 0.1228457 0.0946303 -0.0016435 0.120064 0.0918486 -0.0026305 0.1167517 0.0885362 -0.0042103 0.1128922 0.0846767 -0.0067388 0.1085393 0.0803239 -0.0107859 0.1038805 0.075665 -0.0172633 0.099344 0.0711285 -0.0276309 0.0957773 0.0675619 -0.0441188 0.0946366 0.0664212 -0.0664212 0.0946366 0.0664212 -0.0946366 0.0946366 0.0664212 -0.1303328 0.0946366 0.0664212 -0.1754932 0.0946366 0.0664212 -0.2326269 0.0946366 0.0664212 -0.3049085 0.0946366 0.0664212 -0.3963542 0.0946366 0.0664212 -0.5120448 0.0946366 0.0664212 -0.6584084 0.0946366 0.0664212 -0.8219901 0.0945703 0.0671656 -0.8967447 0.1003691 0.0775151 -0.9325696 0.1181733 0.1002154 -0.9531389 0.1477366 0.1340017 -0.9661878 0.1879067 0.1775917 -0.9749962 0.2372529 0.2296253 -0.9811943 0.2940703 0.2885124 -0.9856839 0.3563715 0.3523802 -0.9890048 0.4219498 0.419125 -0.9914995 0.4885191 0.4865484 -0.9933953 0.5538969 0.5525411 -0.9948487 0.6161874 0.6152669 -0.9959706 0.6739188 0.6733015 -0.9968409 0.7261105 0.7257011 -0.9975189 0.7722648 0.7719959 -0.9980488 0.8123018 0.8121268 -0.9984638 0.8464623 0.8463492 -0.9987895 0.8752028 0.8751301 -0.9990455 0.8991006 0.8990542 -0.999247 0.9187791 0.9187495 -0.9994057 0.9348539 0.9348352 -0.9995308 0.9478997 0.9478878 -0.9996295 0.9584312 0.9584237 -0.9997074 0.9668969 0.9668922 -0.9997688 0.9736786 0.9736756 -0.9998174 0.9790965 0.9790946 -0.9998557 0.9834153 0.9834141 -0.999886 0.986852 0.9868512 -0.9999099 0.9895829 0.9895825 -0.9999288 0.9917507 0.9917504 -0.9999437 0.9934698 0.9934697 -0.0000238 0.1684036 0.1044919 -0.0000382 0.1679 0.1039884 -0.0000611 0.1672678 0.1033562 -0.0000978 0.1664757 0.102564 -0.0001565 0.1654858 0.1015742 -0.0002504 0.1642532 0.1003416 -0.0004008 0.1627254 0.0988137 -0.0006416 0.1608428 0.0969312 -0.0010268 0.1585419 0.0946303 -0.0016435 0.1557603 0.0918486 -0.0026305 0.1524479 0.0885362 -0.0042103 0.1485884 0.0846767 -0.0067388 0.1442355 0.0803239 -0.0107859 0.1395767 0.075665 -0.0172633 0.1350402 0.0711285 -0.0276309 0.1314736 0.0675619 -0.0441188 0.1303328 0.0664212 -0.0664212 0.1303328 0.0664212 -0.0946366 0.1303328 0.0664212 -0.1303328 0.1303328 0.0664212 -0.1754932 0.1303328 0.0664212 -0.2326269 0.1303328 0.0664212 -0.3049085 0.1303328 0.0664212 -0.3963542 0.1303328 0.0664212 -0.5120448 0.1303328 0.0664212 -0.6584084 0.1303328 0.0664212 -0.8219901 0.1292408 0.0671656 -0.8967447 0.1292823 0.0775151 -0.9325696 0.1408925 0.1002154 -0.9531389 0.1651131 0.1340017 -0.9661878 0.2009566 0.1775917 -0.9749962 0.2469027 0.2296253 -0.9811943 0.3011018 0.2885124 -0.9856839 0.3614209 0.3523802 -0.9890048 0.4255236 0.419125 -0.9914995 0.4910123 0.4865484 -0.9933953 0.5556122 0.5525411 -0.9948487 0.6173519 0.6152669 -0.9959706 0.6746998 0.6733015 -0.9968409 0.7266285 0.7257011 -0.9975189 0.7726049 0.7719959 -0.9980488 0.8125232 0.8121268 -0.9984638 0.8466054 0.8463492 -0.9987895 0.8752947 0.8751301 -0.9990455 0.8991593 0.8990542 -0.999247 0.9188164 0.9187495 -0.9994057 0.9348776 0.9348352 -0.9995308 0.9479146 0.9478878 -0.9996295 0.9584406 0.9584237 -0.9997074 0.9669028 0.9668922 -0.9997688 0.9736823 0.9736756 -0.9998174 0.9790988 0.9790946 -0.9998557 0.9834167 0.9834141 -0.999886 0.9868529 0.9868512 -0.9999099 0.9895835 0.9895825 -0.9999288 0.991751 0.9917504 -0.9999437 0.9934701 0.9934697 -0.0000238 0.2135639 0.1044919 -0.0000382 0.2130604 0.1039884 -0.0000611 0.2124282 0.1033562 -0.0000978 0.2116361 0.102564 -0.0001565 0.2106462 0.1015742 -0.0002504 0.2094136 0.1003416 -0.0004008 0.2078857 0.0988137 -0.0006416 0.2060032 0.0969312 -0.0010268 0.2037023 0.0946303 -0.0016435 0.2009206 0.0918486 -0.0026305 0.1976083 0.0885362 -0.0042103 0.1937488 0.0846767 -0.0067388 0.1893959 0.0803239 -0.0107859 0.1847371 0.075665 -0.0172633 0.1802005 0.0711285 -0.0276309 0.1766339 0.0675619 -0.0441188 0.1754932 0.0664212 -0.0664212 0.1754932 0.0664212 -0.0946366 0.1754932 0.0664212 -0.1303328 0.1754932 0.0664212 -0.1754932 0.1754932 0.0664212 -0.2326269 0.1754932 0.0664212 -0.3049085 0.1754932 0.0664212 -0.3963542 0.1754932 0.0664212 -0.5120448 0.1754932 0.0664212 -0.6584084 0.1754932 0.0664212 -0.8219901 0.1731034 0.0671656 -0.8967447 0.1658613 0.0775151 -0.9325696 0.1696351 0.1002154 -0.9531389 0.1870965 0.1340017 -0.9661878 0.2174663 0.1775917 -0.9749962 0.2591111 0.2296253 -0.9811943 0.3099976 0.2885124 -0.9856839 0.3678092 0.3523802 -0.9890048 0.4300448 0.419125 -0.9914995 0.4941665 0.4865484 -0.9933953 0.5577822 0.5525411 -0.9948487 0.6188252 0.6152669 -0.9959706 0.6756878 0.6733015 -0.9968409 0.7272837 0.7257011 -0.9975189 0.7730352 0.7719959 -0.9980488 0.8128033 0.8121268 -0.9984638 0.8467864 0.8463492 -0.9987895 0.8754109 0.8751301 -0.9990455 0.8992336 0.8990542 -0.999247 0.9188636 0.9187495 -0.9994057 0.9349075 0.9348352 -0.9995308 0.9479335 0.9478878 -0.9996295 0.9584526 0.9584237 -0.9997074 0.9669103 0.9668922 -0.9997688 0.973687 0.9736756 -0.9998174 0.9791018 0.9790946 -0.9998557 0.9834186 0.9834141 -0.999886 0.9868541 0.9868512 -0.9999099 0.9895842 0.9895825 -0.9999288 0.9917515 0.9917504 -0.9999437 0.9934704 0.9934697 -0.0000238 0.2706977 0.1044919 -0.0000382 0.2701941 0.1039884 -0.0000611 0.2695619 0.1033562 -0.0000978 0.2687698 0.102564 -0.0001565 0.2677799 0.1015742 -0.0002504 0.2665473 0.1003416 -0.0004008 0.2650195 0.0988137 -0.0006416 0.2631369 0.0969312 -0.0010268 0.260836 0.0946303 -0.0016435 0.2580543 0.0918486 -0.0026305 0.254742 0.0885362 -0.0042103 0.2508825 0.0846767 -0.0067388 0.2465296 0.0803239 -0.0107859 0.2418708 0.075665 -0.0172633 0.2373343 0.0711285 -0.0276309 0.2337676 0.0675619 -0.0441188 0.2326269 0.0664212 -0.0664212 0.2326269 0.0664212 -0.0946366 0.2326269 0.0664212 -0.1303328 0.2326269 0.0664212 -0.1754932 0.2326269 0.0664212 -0.2326269 0.2326269 0.0664212 -0.3049085 0.2326269 0.0664212 -0.3963542 0.2326269 0.0664212 -0.5120448 0.2326269 0.0664212 -0.6584084 0.2326269 0.0664212 -0.8219901 0.2285954 0.0671656 -0.8967447 0.2121385 0.0775151 -0.9325696 0.2059983 0.1002154 -0.9531389 0.2149085 0.1340017 -0.9661878 0.2383533 0.1775917 -0.9749962 0.2745562 0.2296253 -0.9811943 0.3212519 0.2885124 -0.9856839 0.3758911 0.3523802 -0.9890048 0.4357648 0.419125 -0.9914995 0.498157 0.4865484 -0.9933953 0.5605276 0.5525411 -0.9948487 0.6206891 0.6152669 -0.9959706 0.6769378 0.6733015 -0.9968409 0.7281127 0.7257011 -0.9975189 0.7735795 0.7719959 -0.9980488 0.8131577 0.8121268 -0.9984638 0.8470154 0.8463492 -0.9987895 0.875558 0.8751301 -0.9990455 0.8993275 0.8990542 -0.999247 0.9189234 0.9187495 -0.9994057 0.9349454 0.9348352 -0.9995308 0.9479575 0.9478878 -0.9996295 0.9584677 0.9584237 -0.9997074 0.9669198 0.9668922 -0.9997688 0.973693 0.9736756 -0.9998174 0.9791055 0.9790946 -0.9998557 0.9834209 0.9834141 -0.999886 0.9868555 0.9868512 -0.9999099 0.9895851 0.9895825 -0.9999288 0.9917521 0.9917504 -0.9999437 0.9934707 0.9934697 -0.0000238 0.3429792 0.1044919 -0.0000382 0.3424757 0.1039884 -0.0000611 0.3418435 0.1033562 -0.0000978 0.3410514 0.102564 -0.0001565 0.3400615 0.1015742 -0.0002504 0.3388289 0.1003416 -0.0004008 0.337301 0.0988137 -0.0006416 0.3354185 0.0969312 -0.0010268 0.3331176 0.0946303 -0.0016435 0.3303359 0.0918486 -0.0026305 0.3270236 0.0885362 -0.0042103 0.3231641 0.0846767 -0.0067388 0.3188112 0.0803239 -0.0107859 0.3141524 0.075665 -0.0172633 0.3096159 0.0711285 -0.0276309 0.3060492 0.0675619 -0.0441188 0.3049085 0.0664212 -0.0664212 0.3049085 0.0664212 -0.0946366 0.3049085 0.0664212 -0.1303328 0.3049085 0.0664212 -0.1754932 0.3049085 0.0664212 -0.2326269 0.3049085 0.0664212 -0.3049085 0.3049085 0.0664212 -0.3963542 0.3049085 0.0664212 -0.5120448 0.3049085 0.0664212 -0.6584084 0.3049085 0.0664212 -0.8219901 0.2988 0.0671656 -0.8967447 0.2706852 0.0775151 -0.9325696 0.2520025 0.1002154 -0.9531389 0.2500942 0.1340017 -0.9661878 0.2647781 0.1775917 -0.9749962 0.2940963 0.2296253 -0.9811943 0.3354901 0.2885124 -0.9856839 0.3861159 0.3523802 -0.9890048 0.4430013 0.419125 -0.9914995 0.5032055 0.4865484 -0.9933953 0.5640008 0.5525411 -0.9948487 0.6230471 0.6152669 -0.9959706 0.6785192 0.6733015 -0.9968409 0.7291615 0.7257011 -0.9975189 0.7742682 0.7719959 -0.9980488 0.8136061 0.8121268 -0.9984638 0.8473052 0.8463492 -0.9987895 0.8757441 0.8751301 -0.9990455 0.8994464 0.8990542 -0.999247 0.918999 0.9187495 -0.9994057 0.9349933 0.9348352 -0.9995308 0.9479878 0.9478878 -0.9996295 0.9584868 0.9584237 -0.9997074 0.9669318 0.9668922 -0.9997688 0.9737006 0.9736756 -0.9998174 0.9791103 0.9790946 -0.9998557 0.9834239 0.9834141 -0.999886 0.9868574 0.9868512 -0.9999099 0.9895863 0.9895825 -0.9999288 0.9917528 0.9917504 -0.9999437 0.9934712 0.9934697 -0.0000238 0.4344249 0.1044919 -0.0000382 0.4339214 0.1039884 -0.0000611 0.4332891 0.1033562 -0.0000978 0.432497 0.102564 -0.0001565 0.4315072 0.1015742 -0.0002504 0.4302746 0.1003416 -0.0004008 0.4287467 0.0988137 -0.0006416 0.4268641 0.0969312 -0.0010268 0.4245633 0.0946303 -0.0016435 0.4217816 0.0918486 -0.0026305 0.4184692 0.0885362 -0.0042103 0.4146097 0.0846767 -0.0067388 0.4102568 0.0803239 -0.0107859 0.405598 0.075665 -0.0172633 0.4010615 0.0711285 -0.0276309 0.3974949 0.0675619 -0.0441188 0.3963542 0.0664212 -0.0664212 0.3963542 0.0664212 -0.0946366 0.3963542 0.0664212 -0.1303328 0.3963542 0.0664212 -0.1754932 0.3963542 0.0664212 -0.2326269 0.3963542 0.0664212 -0.3049085 0.3963542 0.0664212 -0.3963542 0.3963542 0.0664212 -0.5120448 0.3963542 0.0664212 -0.6584084 0.3963542 0.0664212 -0.8219901 0.3876179 0.0671656 -0.8967447 0.3447543 0.0775151 -0.9325696 0.3102037 0.1002154 -0.9531389 0.2946088 0.1340017 -0.9661878 0.2982089 0.1775917 -0.9749962 0.3188171 0.2296253 -0.9811943 0.3535032 0.2885124 -0.9856839 0.3990515 0.3523802 -0.9890048 0.4521565 0.419125 -0.9914995 0.5095925 0.4865484 -0.9933953 0.5683949 0.5525411 -0.9948487 0.6260304 0.6152669 -0.9959706 0.6805199 0.6733015 -0.9968409 0.7304884 0.7257011 -0.9975189 0.7751395 0.7719959 -0.9980488 0.8141733 0.8121268 -0.9984638 0.8476717 0.8463492 -0.9987895 0.8759795 0.8751301 -0.9990455 0.8995968 0.8990542 -0.999247 0.9190947 0.9187495 -0.9994057 0.935054 0.9348352 -0.9995308 0.9480261 0.9478878 -0.9996295 0.9585109 0.9584237 -0.9997074 0.966947 0.9668922 -0.9997688 0.9737101 0.9736756 -0.9998174 0.9791163 0.9790946 -0.9998557 0.9834277 0.9834141 -0.999886 0.9868597 0.9868512 -0.9999099 0.9895878 0.9895825 -0.9999288 0.9917537 0.9917504 -0.9999437 0.9934718 0.9934697 -0.0000238 0.5501155 0.1044919 -0.0000382 0.549612 0.1039884 -0.0000611 0.5489798 0.1033562 -0.0000978 0.5481876 0.102564 -0.0001565 0.5471978 0.1015742 -0.0002504 0.5459652 0.1003416 -0.0004008 0.5444373 0.0988137 -0.0006416 0.5425548 0.0969312 -0.0010268 0.5402539 0.0946303 -0.0016435 0.5374722 0.0918486 -0.0026305 0.5341598 0.0885362 -0.0042103 0.5303003 0.0846767 -0.0067388 0.5259474 0.0803239 -0.0107859 0.5212886 0.075665 -0.0172633 0.5167521 0.0711285 -0.0276309 0.5131855 0.0675619 -0.0441188 0.5120448 0.0664212 -0.0664212 0.5120448 0.0664212 -0.0946366 0.5120448 0.0664212 -0.1303328 0.5120448 0.0664212 -0.1754932 0.5120448 0.0664212 -0.2326269 0.5120448 0.0664212 -0.3049085 0.5120448 0.0664212 -0.3963542 0.5120448 0.0664212 -0.5120448 0.5120448 0.0664212 -0.6584084 0.5120448 0.0664212 -0.8219901 0.4999841 0.0671656 -0.8967447 0.4384614 0.0775151 -0.9325696 0.3838358 0.1002154 -0.9531389 0.3509254 0.1340017 -0.9661878 0.3405032 0.1775917 -0.9749962 0.3500921 0.2296253 -0.9811943 0.3762922 0.2885124 -0.9856839 0.4154167 0.3523802 -0.9890048 0.4637389 0.419125 -0.9914995 0.5176729 0.4865484 -0.9933953 0.573954 0.5525411 -0.9948487 0.6298046 0.6152669 -0.9959706 0.683051 0.6733015 -0.9968409 0.732167 0.7257011 -0.9975189 0.7762418 0.7719959 -0.9980488 0.8148909 0.8121268 -0.9984638 0.8481355 0.8463492 -0.9987895 0.8762773 0.8751301 -0.9990455 0.899787 0.8990542 -0.999247 0.9192157 0.9187495 -0.9994057 0.9351307 0.9348352 -0.9995308 0.9480746 0.9478878 -0.9996295 0.9585415 0.9584237 -0.9997074 0.9669663 0.9668922 -0.9997688 0.9737222 0.9736756 -0.9998174 0.9791238 0.9790946 -0.9998557 0.9834324 0.9834141 -0.999886 0.9868627 0.9868512 -0.9999099 0.9895897 0.9895825 -0.9999288 0.9917549 0.9917504 -0.9999437 0.9934725 0.9934697 -0.0000238 0.6964791 0.1044919 -0.0000382 0.6959756 0.1039884 -0.0000611 0.6953434 0.1033562 -0.0000978 0.6945513 0.102564 -0.0001565 0.6935614 0.1015742 -0.0002504 0.6923288 0.1003416 -0.0004008 0.6908009 0.0988137 -0.0006416 0.6889184 0.0969312 -0.0010268 0.6866175 0.0946303 -0.0016435 0.6838358 0.0918486 -0.0026305 0.6805235 0.0885362 -0.0042103 0.676664 0.0846767 -0.0067388 0.6723111 0.0803239 -0.0107859 0.6676523 0.075665 -0.0172633 0.6631157 0.0711285 -0.0276309 0.6595491 0.0675619 -0.0441188 0.6584084 0.0664212 -0.0664212 0.6584084 0.0664212 -0.0946366 0.6584084 0.0664212 -0.1303328 0.6584084 0.0664212 -0.1754932 0.6584084 0.0664212 -0.2326269 0.6584084 0.0664212 -0.3049085 0.6584084 0.0664212 -0.3963542 0.6584084 0.0664212 -0.5120448 0.6584084 0.0664212 -0.6584084 0.6584084 0.0664212 -0.8219901 0.6421419 0.0671656 -0.8967447 0.557013 0.0775151 -0.9325696 0.4769901 0.1002154 -0.9531389 0.4221733 0.1340017 -0.9661878 0.3940109 0.1775917 -0.9749962 0.389659 0.2296253 -0.9811943 0.4051232 0.2885124 -0.9856839 0.4361208 0.3523802 -0.9890048 0.4783922 0.419125 -0.9914995 0.5278957 0.4865484 -0.9933953 0.580987 0.5525411 -0.9948487 0.6345795 0.6152669 -0.9959706 0.6862532 0.6733015 -0.9968409 0.7342907 0.7257011 -0.9975189 0.7776364 0.7719959 -0.9980488 0.8157988 0.8121268 -0.9984638 0.8487222 0.8463492 -0.9987895 0.8766541 0.8751301 -0.9990455 0.9000277 0.8990542 -0.999247 0.9193688 0.9187495 -0.9994057 0.9352277 0.9348352 -0.9995308 0.9481359 0.9478878 -0.9996295 0.9585802 0.9584237 -0.9997074 0.9669906 0.9668922 -0.9997688 0.9737375 0.9736756 -0.9998174 0.9791334 0.9790946 -0.9998557 0.9834385 0.9834141 -0.999886 0.9868665 0.9868512 -0.9999099 0.989592 0.9895825 -0.9999288 0.9917564 0.9917504 -0.9999437 0.9934734 0.9934697 -0.0051514 0.8407292 0.1041632 -0.0051286 0.8405071 0.1036839 -0.0051047 0.8402274 0.1030818 -0.0050826 0.8398756 0.1023268 -0.0050676 0.8394338 0.1013822 -0.0050694 0.8388802 0.1002045 -0.0051048 0.8381886 0.0987424 -0.0052028 0.8373283 0.0969372 -0.0054121 0.8362644 0.0947256 -0.0058134 0.8349593 0.0920441 -0.0065402 0.8333779 0.0888403 -0.0078103 0.8314967 0.0850926 -0.0099781 0.8293233 0.0808475 -0.0136166 0.8269342 0.0762831 -0.0196467 0.8245426 0.0718184 -0.0295373 0.8226154 0.068295 -0.0455041 0.8219901 0.0671656 -0.0671656 0.8219901 0.0671656 -0.0945703 0.8219901 0.0671656 -0.1292408 0.8219901 0.0671656 -0.1731034 0.8219901 0.0671656 -0.2285954 0.8219901 0.0671656 -0.2988 0.8219901 0.0671656 -0.3876179 0.8219901 0.0671656 -0.4999841 0.8219901 0.0671656 -0.6421419 0.8219901 0.0671656 -0.8219901 0.8219901 0.0671656 -0.8967447 0.7069963 0.0775151 -0.9325696 0.5948423 0.1002154 -0.9531389 0.5123112 0.1340017 -0.9661878 0.4617052 0.1775917 -0.9749962 0.4397163 0.2296253 -0.9811943 0.4415982 0.2885124 -0.9856839 0.4623142 0.3523802 -0.9890048 0.4969305 0.419125 -0.9914995 0.5408288 0.4865484 -0.9933953 0.5898847 0.5525411 -0.9948487 0.6406203 0.6152669 -0.9959706 0.6903044 0.6733015 -0.9968409 0.7369774 0.7257011 -0.9975189 0.7794007 0.7719959 -0.9980488 0.8169474 0.8121268 -0.9984638 0.8494644 0.8463492 -0.9987895 0.8771307 0.8751301 -0.9990455 0.9003323 0.8990542 -0.999247 0.9195625 0.9187495 -0.9994057 0.9353505 0.9348352 -0.9995308 0.9482135 0.9478878 -0.9996295 0.9586291 0.9584237 -0.9997074 0.9670214 0.9668922 -0.9997688 0.9737569 0.9736756 -0.9998174 0.9791456 0.9790946 -0.9998557 0.9834461 0.9834141 -0.999886 0.9868713 0.9868512 -0.9999099 0.989595 0.9895825 -0.9999288 0.9917582 0.9917504 -0.9999437 0.9934746 0.9934697 -0.0279321 0.9033413 0.1098869 -0.0278872 0.9032596 0.1094702 -0.0278347 0.9031567 0.1089464 -0.0277752 0.9030276 0.1082896 -0.0277111 0.9028657 0.1074677 -0.0276479 0.9026634 0.1064427 -0.0275966 0.9024114 0.1051696 -0.0275778 0.9020992 0.1035972 -0.0276281 0.9017148 0.1016696 -0.0278105 0.9012461 0.0993306 -0.0282324 0.900682 0.0965334 -0.0290732 0.9000167 0.0932573 -0.0306306 0.8992555 0.0895408 -0.0333932 0.8984278 0.0855374 -0.0381561 0.8976087 0.0816135 -0.0461985 0.8969554 0.0785108 -0.0594506 0.8967447 0.0775151 -0.0775151 0.8967447 0.0775151 -0.1003691 0.8967447 0.0775151 -0.1292823 0.8967447 0.0775151 -0.1658613 0.8967447 0.0775151 -0.2121385 0.8967447 0.0775151 -0.2706852 0.8967447 0.0775151 -0.3447543 0.8967447 0.0775151 -0.4384614 0.8967447 0.0775151 -0.557013 0.8967447 0.0775151 -0.7069963 0.8967447 0.0775151 -0.8967447 0.8967447 0.0775151 -0.9325696 0.7439407 0.1002154 -0.9531389 0.6263473 0.1340017 -0.9661878 0.5473473 0.1775917 -0.9749962 0.5030453 0.2296253 -0.9811943 0.4877437 0.2885124 -0.9856839 0.4954523 0.3523802 -0.9890048 0.5203839 0.419125 -0.9914995 0.5571908 0.4865484 -0.9933953 0.6011414 0.5525411 -0.9948487 0.6482627 0.6152669 -0.9959706 0.6954296 0.6733015 -0.9968409 0.7403765 0.7257011 -0.9975189 0.7816327 0.7719959 -0.9980488 0.8184005 0.8121268 -0.9984638 0.8504035 0.8463492 -0.9987895 0.8777338 0.8751301 -0.9990455 0.9007175 0.8990542 -0.999247 0.9198076 0.9187495 -0.9994057 0.9355059 0.9348352 -0.9995308 0.9483117 0.9478878 -0.9996295 0.958691 0.9584237 -0.9997074 0.9670604 0.9668922 -0.9997688 0.9737814 0.9736756 -0.9998174 0.979161 0.9790946 -0.9998557 0.9834557 0.9834141 -0.999886 0.9868773 0.9868512 -0.9999099 0.9895988 0.9895825 -0.9999288 0.9917606 0.9917504 -0.9999437 0.9934761 0.9934697 -0.0624569 0.9354466 0.1270339 -0.0624063 0.9354101 0.1266878 -0.0623458 0.9353643 0.1262529 -0.0622749 0.9353068 0.1257074 -0.0621943 0.9352348 0.125025 -0.0621069 0.9351449 0.1241741 -0.0620199 0.9350332 0.1231174 -0.0619473 0.9348949 0.1218126 -0.061916 0.9347252 0.1202135 -0.0619734 0.9345187 0.1182739 -0.062202 0.9342712 0.1159552 -0.062742 0.9339805 0.1132408 -0.0638283 0.9336494 0.1101631 -0.0658501 0.9332914 0.1068496 -0.0694453 0.9329391 0.1036038 -0.0756464 0.9326595 0.1010384 -0.0860209 0.9325696 0.1002154 -0.1002154 0.9325696 0.1002154 -0.1181733 0.9325696 0.1002154 -0.1408925 0.9325696 0.1002154 -0.1696351 0.9325696 0.1002154 -0.2059983 0.9325696 0.1002154 -0.2520025 0.9325696 0.1002154 -0.3102037 0.9325696 0.1002154 -0.3838358 0.9325696 0.1002154 -0.4769901 0.9325696 0.1002154 -0.5948423 0.9325696 0.1002154 -0.7439407 0.9325696 0.1002154 -0.9325696 0.9325696 0.1002154 -0.9531389 0.7706179 0.1340017 -0.9661878 0.6556956 0.1775917 -0.9749962 0.5831647 0.2296253 -0.9811943 0.5461239 0.2885124 -0.9856839 0.5373763 0.3523802 -0.9890048 0.5500554 0.419125 -0.9914995 0.577891 0.4865484 -0.9933953 0.6153825 0.5525411 -0.9948487 0.6579314 0.6152669 -0.9959706 0.7019138 0.6733015 -0.9968409 0.7446768 0.7257011 -0.9975189 0.7844566 0.7719959 -0.9980488 0.8202389 0.8121268 -0.9984638 0.8515915 0.8463492 -0.9987895 0.8784967 0.8751301 -0.9990455 0.9012049 0.8990542 -0.999247 0.9201176 0.9187495 -0.9994057 0.9357024 0.9348352 -0.9995308 0.9484359 0.9478878 -0.9996295 0.9587693 0.9584237 -0.9997074 0.9671097 0.9668922 -0.9997688 0.9738123 0.9736756 -0.9998174 0.9791804 0.9790946 -0.9998557 0.9834679 0.9834141 -0.999886 0.986885 0.9868512 -0.9999099 0.9896036 0.9895825 -0.9999288 0.9917636 0.9917504 -0.9999437 0.9934779 0.9934697 -0.1059991 0.9545467 0.1555993 -0.1059489 0.9545286 0.1553195 -0.1058883 0.9545059 0.1549679 -0.1058162 0.9544774 0.1545271 -0.1057322 0.9544418 0.1539757 -0.1056375 0.9543974 0.1532882 -0.1055364 0.9543421 0.1524348 -0.1054384 0.9542739 0.1513813 -0.1053624 0.9541902 0.1500908 -0.1053433 0.9540886 0.1485263 -0.1054431 0.9539671 0.1466571 -0.1057683 0.9538247 0.1444705 -0.1064997 0.953663 0.1419934 -0.1079385 0.9534887 0.139329 -0.1105818 0.9533177 0.1367213 -0.1152388 0.9531823 0.134662 -0.1231452 0.9531389 0.1340017 -0.1340017 0.9531389 0.1340017 -0.1477366 0.9531389 0.1340017 -0.1651131 0.9531389 0.1340017 -0.1870965 0.9531389 0.1340017 -0.2149085 0.9531389 0.1340017 -0.2500942 0.9531389 0.1340017 -0.2946088 0.9531389 0.1340017 -0.3509254 0.9531389 0.1340017 -0.4221733 0.9531389 0.1340017 -0.5123112 0.9531389 0.1340017 -0.6263473 0.9531389 0.1340017 -0.7706179 0.9531389 0.1340017 -0.9531389 0.9531389 0.1340017 -0.9661878 0.7927704 0.1775917 -0.9749962 0.6845262 0.2296253 -0.9811943 0.6199824 0.2885124 -0.9856839 0.5904156 0.3523802 -0.9890048 0.5875938 0.419125 -0.9914995 0.6040793 0.4865484 -0.9933953 0.6333995 0.5525411 -0.9948487 0.6701635 0.6152669 -0.9959706 0.710117 0.6733015 -0.9968409 0.7501172 0.7257011 -0.9975189 0.7880291 0.7719959 -0.9980488 0.8225647 0.8121268 -0.9984638 0.8530945 0.8463492 -0.9987895 0.8794619 0.8751301 -0.9990455 0.9018215 0.8990542 -0.999247 0.9205098 0.9187495 -0.9994057 0.935951 0.9348352 -0.9995308 0.9485931 0.9478878 -0.9996295 0.9588684 0.9584237 -0.9997074 0.967172 0.9668922 -0.9997688 0.9738515 0.9736756 -0.9998174 0.979205 0.9790946 -0.9998557 0.9834833 0.9834141 -0.999886 0.9868946 0.9868512 -0.9999099 0.9896096 0.9895825 -0.9999288 0.9917674 0.9917504 -0.9999437 0.9934803 0.9934697 -0.1572498 0.9669269 0.1946509 -0.1572031 0.9669173 0.1944291 -0.1571463 0.9669053 0.1941504 -0.1570779 0.9668902 0.1938011 -0.1569971 0.9668714 0.1933641 -0.156904 0.9668479 0.1928195 -0.1568008 0.9668187 0.1921435 -0.1566936 0.9667827 0.1913094 -0.1565954 0.9667385 0.190288 -0.1565315 0.966685 0.1890504 -0.1565473 0.9666211 0.1875725 -0.1567226 0.9665463 0.185845 -0.1571937 0.9664615 0.1838895 -0.15819 0.9663702 0.1817879 -0.160092 0.9662809 0.179733 -0.1635226 0.9662104 0.1781114 -0.1694384 0.9661878 0.1775917 -0.1775917 0.9661878 0.1775917 -0.1879067 0.9661878 0.1775917 -0.2009566 0.9661878 0.1775917 -0.2174663 0.9661878 0.1775917 -0.2383533 0.9661878 0.1775917 -0.2647781 0.9661878 0.1775917 -0.2982089 0.9661878 0.1775917 -0.3405032 0.9661878 0.1775917 -0.3940109 0.9661878 0.1775917 -0.4617052 0.9661878 0.1775917 -0.5473473 0.9661878 0.1775917 -0.6556956 0.9661878 0.1775917 -0.7927704 0.9661878 0.1775917 -0.9661878 0.9661878 0.1775917 -0.9749962 0.8127617 0.2296253 -0.9811943 0.713423 0.2885124 -0.9856839 0.6575172 0.3523802 -0.9890048 0.6350848 0.419125 -0.9914995 0.637211 0.4865484 -0.9933953 0.6561933 0.5525411 -0.9948487 0.6856388 0.6152669 -0.9959706 0.7204952 0.6733015 -0.9968409 0.757 0.7257011 -0.9975189 0.7925488 0.7719959 -0.9980488 0.8255071 0.8121268 -0.9984638 0.8549959 0.8463492 -0.9987895 0.880683 0.8751301 -0.9990455 0.9026016 0.8990542 -0.999247 0.9210061 0.9187495 -0.9994057 0.9362655 0.9348352 -0.9995308 0.9487918 0.9478878 -0.9996295 0.9589938 0.9584237 -0.9997074 0.9672509 0.9668922 -0.9997688 0.9739011 0.9736756 -0.9998174 0.9792361 0.9790946 -0.9998557 0.9835029 0.9834141 -0.999886 0.9869069 0.9868512 -0.9999099 0.9896173 0.9895825 -0.9999288 0.9917722 0.9917504 -0.9999437 0.9934833 0.9934697 -0.2151269 0.9754027 0.2428812 -0.2150852 0.9753975 0.2427083 -0.2150342 0.9753908 0.2424911 -0.2149725 0.9753825 0.2422188 -0.2148987 0.9753721 0.2418784 -0.2148124 0.9753591 0.2414541 -0.2147144 0.975343 0.2409276 -0.2146085 0.9753231 0.2402781 -0.2145034 0.9752987 0.2394831 -0.2144168 0.9752692 0.2385201 -0.2143816 0.975234 0.2373708 -0.2144566 0.9751928 0.2360282 -0.2147432 0.9751462 0.2345093 -0.2154135 0.9750962 0.2328783 -0.2167545 0.9750472 0.2312846 -0.2192389 0.9750086 0.2300279 -0.2235962 0.9749962 0.2296253 -0.2296253 0.9749962 0.2296253 -0.2372529 0.9749962 0.2296253 -0.2469027 0.9749962 0.2296253 -0.2591111 0.9749962 0.2296253 -0.2745562 0.9749962 0.2296253 -0.2940963 0.9749962 0.2296253 -0.3188171 0.9749962 0.2296253 -0.3500921 0.9749962 0.2296253 -0.389659 0.9749962 0.2296253 -0.4397163 0.9749962 0.2296253 -0.5030453 0.9749962 0.2296253 -0.5831647 0.9749962 0.2296253 -0.6845262 0.9749962 0.2296253 -0.8127617 0.9749962 0.2296253 -0.9749962 0.9749962 0.2296253 -0.9811943 0.8316375 0.2885124 -0.9856839 0.7424095 0.3523802 -0.9890048 0.695167 0.419125 -0.9914995 0.6791269 0.4865484 -0.9933953 0.6850303 0.5525411 -0.9948487 0.7052169 0.6152669 -0.9959706 0.733625 0.6733015 -0.9968409 0.7657077 0.7257011 -0.9975189 0.7982669 0.7719959 -0.9980488 0.8292297 0.8121268 -0.9984638 0.8574015 0.8463492 -0.9987895 0.8822279 0.8751301 -0.9990455 0.9035886 0.8990542 -0.999247 0.9216339 0.9187495 -0.9994057 0.9366635 0.9348352 -0.9995308 0.9490434 0.9478878 -0.9996295 0.9591524 0.9584237 -0.9997074 0.9673508 0.9668922 -0.9997688 0.9739638 0.9736756 -0.9998174 0.9792755 0.9790946 -0.9998557 0.9835276 0.9834141 -0.999886 0.9869223 0.9868512 -0.9999099 0.989627 0.9895825 -0.9999288 0.9917782 0.9917504 -0.9999437 0.9934871 0.9934697 -0.2783684 0.9814251 0.2986524 -0.2783325 0.9814221 0.2985198 -0.2782884 0.9814183 0.2983532 -0.2782347 0.9814136 0.2981445 -0.2781701 0.9814076 0.2978834 -0.2780936 0.9814002 0.2975582 -0.2780055 0.9813911 0.2971547 -0.2779077 0.9813797 0.296657 -0.2778058 0.9813659 0.296048 -0.2777122 0.9813491 0.2953106 -0.2776503 0.9813291 0.2944309 -0.2776626 0.9813057 0.2934037 -0.2778236 0.9812792 0.2922423 -0.2782606 0.9812508 0.2909959 -0.2791873 0.9812231 0.2897788 -0.2809573 0.9812013 0.2888196 -0.2841192 0.9811943 0.2885124 -0.2885124 0.9811943 0.2885124 -0.2940703 0.9811943 0.2885124 -0.3011018 0.9811943 0.2885124 -0.3099976 0.9811943 0.2885124 -0.3212519 0.9811943 0.2885124 -0.3354901 0.9811943 0.2885124 -0.3535032 0.9811943 0.2885124 -0.3762922 0.9811943 0.2885124 -0.4051232 0.9811943 0.2885124 -0.4415982 0.9811943 0.2885124 -0.4877437 0.9811943 0.2885124 -0.5461239 0.9811943 0.2885124 -0.6199824 0.9811943 0.2885124 -0.713423 0.9811943 0.2885124 -0.8316375 0.9811943 0.2885124 -0.9811943 0.9811943 0.2885124 -0.9856839 0.8498092 0.3523802 -0.9890048 0.7711789 0.419125 -0.9914995 0.7321559 0.4865484 -0.9933953 0.721513 0.5525411 -0.9948487 0.7299859 0.6152669 -0.9959706 0.7502359 0.6733015 -0.9968409 0.776724 0.7257011 -0.9975189 0.8055009 0.7719959 -0.9980488 0.8339392 0.8121268 -0.9984638 0.8604449 0.8463492 -0.9987895 0.8841823 0.8751301 -0.9990455 0.9048372 0.8990542 -0.999247 0.9224281 0.9187495 -0.9994057 0.9371669 0.9348352 -0.9995308 0.9493615 0.9478878 -0.9996295 0.959353 0.9584237 -0.9997074 0.967477 0.9668922 -0.9997688 0.9740432 0.9736756 -0.9998174 0.9793253 0.9790946 -0.9998557 0.9835588 0.9834141 -0.999886 0.9869419 0.9868512 -0.9999099 0.9896392 0.9895825 -0.9999288 0.9917859 0.9917504 -0.9999437 0.9934919 0.9934697 -0.3454107 0.9858181 0.3600134 -0.3453807 0.9858163 0.3599134 -0.3453439 0.9858141 0.3597877 -0.3452987 0.9858113 0.3596303 -0.3452442 0.9858079 0.3594334 -0.3451791 0.9858036 0.3591882 -0.3451032 0.9857982 0.3588839 -0.3450175 0.9857916 0.3585088 -0.3449254 0.9857835 0.3580498 -0.3448353 0.9857738 0.3574942 -0.3447636 0.9857621 0.3568316 -0.3447407 0.9857485 0.3560582 -0.3448204 0.9857332 0.3551842 -0.3450957 0.9857167 0.3542467 -0.3457234 0.9857006 0.3533318 -0.3469645 0.9856879 0.352611 -0.3492254 0.9856839 0.3523802 -0.3523802 0.9856839 0.3523802 -0.3563715 0.9856839 0.3523802 -0.3614209 0.9856839 0.3523802 -0.3678092 0.9856839 0.3523802 -0.3758911 0.9856839 0.3523802 -0.3861159 0.9856839 0.3523802 -0.3990515 0.9856839 0.3523802 -0.4154167 0.9856839 0.3523802 -0.4361208 0.9856839 0.3523802 -0.4623142 0.9856839 0.3523802 -0.4954523 0.9856839 0.3523802 -0.5373763 0.9856839 0.3523802 -0.5904156 0.9856839 0.3523802 -0.6575172 0.9856839 0.3523802 -0.7424095 0.9856839 0.3523802 -0.8498092 0.9856839 0.3523802 -0.9856839 0.9856839 0.3523802 -0.9890048 0.8673437 0.419125 -0.9914995 0.7992446 0.4865484 -0.9933953 0.7676683 0.5525411 -0.9948487 0.7613218 0.6152669 -0.9959706 0.7712508 0.6733015 -0.9968409 0.7906611 0.7257011 -0.9975189 0.8146529 0.7719959 -0.9980488 0.8398974 0.8121268 -0.9984638 0.8642952 0.8463492 -0.9987895 0.886655 0.8751301 -0.9990455 0.9064168 0.8990542 -0.999247 0.9234329 0.9187495 -0.9994057 0.9378038 0.9348352 -0.9995308 0.9497641 0.9478878 -0.9996295 0.9596068 0.9584237 -0.9997074 0.9676368 0.9668922 -0.9997688 0.9741436 0.9736756 -0.9998174 0.9793883 0.9790946 -0.9998557 0.9835983 0.9834141 -0.999886 0.9869667 0.9868512 -0.9999099 0.9896547 0.9895825 -0.9999288 0.9917956 0.9917504 -0.9999437 0.993498 0.9934697 -0.4144197 0.9890841 0.4247763 -0.4143955 0.9890831 0.4247022 -0.4143657 0.9890818 0.424609 -0.414329 0.9890801 0.4244922 -0.4142845 0.9890781 0.4243463 -0.4142311 0.9890755 0.4241644 -0.4141683 0.9890723 0.4239389 -0.4140964 0.9890684 0.4236608 -0.4140176 0.9890637 0.4233207 -0.4139373 0.9890579 0.4229091 -0.4138668 0.989051 0.4224183 -0.4138277 0.989043 0.4218457 -0.4138582 0.9890339 0.4211988 -0.4140252 0.9890241 0.4205051 -0.4144423 0.9890146 0.4198285 -0.4152991 0.9890072 0.4192956 -0.4168922 0.9890048 0.419125 -0.419125 0.9890048 0.419125 -0.4219498 0.9890048 0.419125 -0.4255236 0.9890048 0.419125 -0.4300448 0.9890048 0.419125 -0.4357648 0.9890048 0.419125 -0.4430013 0.9890048 0.419125 -0.4521565 0.9890048 0.419125 -0.4637389 0.9890048 0.419125 -0.4783922 0.9890048 0.419125 -0.4969305 0.9890048 0.419125 -0.5203839 0.9890048 0.419125 -0.5500554 0.9890048 0.419125 -0.5875938 0.9890048 0.419125 -0.6350848 0.9890048 0.419125 -0.695167 0.9890048 0.419125 -0.7711789 0.9890048 0.419125 -0.8673437 0.9890048 0.419125 -0.9890048 0.9890048 0.419125 -0.9914995 0.8841204 0.4865484 -0.9933953 0.8260608 0.5525411 -0.9948487 0.8009659 0.6152669 -0.9959706 0.7978374 0.6733015 -0.9968409 0.8082934 0.7257011 -0.9975189 0.8262314 0.7719959 -0.9980488 0.8474353 0.8121268 -0.9984638 0.8691663 0.8463492 -0.9987895 0.8897832 0.8751301 -0.9990455 0.9084153 0.8990542 -0.999247 0.9247041 0.9187495 -0.9994057 0.9386096 0.9348352 -0.9995308 0.9502734 0.9478878 -0.9996295 0.959928 0.9584237 -0.9997074 0.9678389 0.9668922 -0.9997688 0.9742706 0.9736756 -0.9998174 0.9794681 0.9790946 -0.9998557 0.9836483 0.9834141 -0.999886 0.986998 0.9868512 -0.9999099 0.9896744 0.9895825 -0.9999288 0.9918079 0.9917504 -0.9999437 0.9935057 0.9934697 -0.4834235 0.9915469 0.4906613 -0.4834045 0.9915463 0.4906072 -0.4833811 0.9915455 0.4905393 -0.4833522 0.9915446 0.4904542 -0.4833171 0.9915433 0.4903479 -0.4832747 0.9915418 0.4902154 -0.4832246 0.9915399 0.4900511 -0.4831666 0.9915376 0.4898485 -0.4831021 0.9915347 0.4896008 -0.4830346 0.9915312 0.489301 -0.4829718 0.9915271 0.4889438 -0.4829286 0.9915223 0.488527 -0.4829319 0.9915169 0.4880563 -0.4830292 0.991511 0.4875517 -0.4833013 0.9915054 0.4870597 -0.4838841 0.9915009 0.4866724 -0.4849907 0.9914995 0.4865484 -0.4865484 0.9914995 0.4865484 -0.4885191 0.9914995 0.4865484 -0.4910123 0.9914995 0.4865484 -0.4941665 0.9914995 0.4865484 -0.498157 0.9914995 0.4865484 -0.5032055 0.9914995 0.4865484 -0.5095925 0.9914995 0.4865484 -0.5176729 0.9914995 0.4865484 -0.5278957 0.9914995 0.4865484 -0.5408288 0.9914995 0.4865484 -0.5571908 0.9914995 0.4865484 -0.577891 0.9914995 0.4865484 -0.6040793 0.9914995 0.4865484 -0.637211 0.9914995 0.4865484 -0.6791269 0.9914995 0.4865484 -0.7321559 0.9914995 0.4865484 -0.7992446 0.9914995 0.4865484 -0.8841204 0.9914995 0.4865484 -0.9914995 0.9914995 0.4865484 -0.9933953 0.8999349 0.5525411 -0.9948487 0.8511207 0.6152669 -0.9959706 0.8314729 0.6733015 -0.9968409 0.8306004 0.7257011 -0.9975189 0.8408797 0.7719959 -0.9980488 0.8569716 0.8121268 -0.9984638 0.875329 0.8463492 -0.9987895 0.8937407 0.8751301 -0.9990455 0.9109436 0.8990542 -0.999247 0.9263124 0.9187495 -0.9994057 0.939629 0.9348352 -0.9995308 0.9509177 0.9478878 -0.9996295 0.9603343 0.9584237 -0.9997074 0.9680946 0.9668922 -0.9997688 0.9744313 0.9736756 -0.9998174 0.9795689 0.9790946 -0.9998557 0.9837116 0.9834141 -0.999886 0.9870376 0.9868512 -0.9999099 0.9896992 0.9895825 -0.9999288 0.9918234 0.9917504 -0.9999437 0.9935154 0.9934697 -0.5504963 0.993424 0.5554829 -0.5504818 0.9934236 0.5554442 -0.550464 0.9934231 0.5553956 -0.5504419 0.9934225 0.5553347 -0.550415 0.9934218 0.5552585 -0.5503825 0.9934209 0.5551637 -0.5503438 0.9934197 0.5550461 -0.5502987 0.9934183 0.5549011 -0.550248 0.9934166 0.5547238 -0.5501939 0.9934145 0.5545093 -0.5501416 0.993412 0.5542536 -0.5501012 0.9934091 0.5539555 -0.5500915 0.9934058 0.5536189 -0.5501456 0.9934023 0.5532582 -0.5503203 0.9933988 0.5529065 -0.5507113 0.9933961 0.5526297 -0.5514695 0.9933953 0.5525411 -0.5525411 0.9933953 0.5525411 -0.5538969 0.9933953 0.5525411 -0.5556122 0.9933953 0.5525411 -0.5577822 0.9933953 0.5525411 -0.5605276 0.9933953 0.5525411 -0.5640008 0.9933953 0.5525411 -0.5683949 0.9933953 0.5525411 -0.573954 0.9933953 0.5525411 -0.580987 0.9933953 0.5525411 -0.5898847 0.9933953 0.5525411 -0.6011414 0.9933953 0.5525411 -0.6153825 0.9933953 0.5525411 -0.6333995 0.9933953 0.5525411 -0.6561933 0.9933953 0.5525411 -0.6850303 0.9933953 0.5525411 -0.721513 0.9933953 0.5525411 -0.7676683 0.9933953 0.5525411 -0.8260608 0.9933953 0.5525411 -0.8999349 0.9933953 0.5525411 -0.9933953 0.9933953 0.5525411 -0.9948487 0.9145732 0.6152669 -0.9959706 0.8740262 0.6733015 -0.9968409 0.8588218 0.7257011 -0.9975189 0.8594117 0.7719959 -0.9980488 0.8690364 0.8121268 -0.9984638 0.8831255 0.8463492 -0.9987895 0.8987476 0.8751301 -0.9990455 0.9141422 0.8990542 -0.999247 0.928347 0.9187495 -0.9994057 0.9409186 0.9348352 -0.9995308 0.9517328 0.9478878 -0.9996295 0.9608482 0.9584237 -0.9997074 0.9684181 0.9668922 -0.9997688 0.9746346 0.9736756 -0.9998174 0.9796966 0.9790946 -0.9998557 0.9837916 0.9834141 -0.999886 0.9870878 0.9868512 -0.9999099 0.9897306 0.9895825 -0.9999288 0.9918431 0.9917504 -0.9999437 0.9935277 0.9934697 -0.6139459 0.9948662 0.6173355 -0.6139352 0.994866 0.6173083 -0.6139219 0.9948657 0.6172741 -0.6139056 0.9948653 0.6172312 -0.6138855 0.9948649 0.6171776 -0.6138613 0.9948643 0.6171109 -0.6138323 0.9948636 0.6170281 -0.6137984 0.9948628 0.6169261 -0.6137599 0.9948617 0.6168013 -0.6137183 0.9948604 0.6166504 -0.6136769 0.9948589 0.6164706 -0.6136427 0.9948571 0.616261 -0.6136284 0.9948551 0.6160243 -0.6136569 0.994853 0.6157707 -0.6137675 0.9948509 0.6155236 -0.6140266 0.9948493 0.6153291 -0.6145393 0.9948487 0.6152669 -0.6152669 0.9948487 0.6152669 -0.6161874 0.9948487 0.6152669 -0.6173519 0.9948487 0.6152669 -0.6188252 0.9948487 0.6152669 -0.6206891 0.9948487 0.6152669 -0.6230471 0.9948487 0.6152669 -0.6260304 0.9948487 0.6152669 -0.6298046 0.9948487 0.6152669 -0.6345795 0.9948487 0.6152669 -0.6406203 0.9948487 0.6152669 -0.6482627 0.9948487 0.6152669 -0.6579314 0.9948487 0.6152669 -0.6701635 0.9948487 0.6152669 -0.6856388 0.9948487 0.6152669 -0.7052169 0.9948487 0.6152669 -0.7299859 0.9948487 0.6152669 -0.7613218 0.9948487 0.6152669 -0.8009659 0.9948487 0.6152669 -0.8511207 0.9948487 0.6152669 -0.9145732 0.9948487 0.6152669 -0.9948487 0.9948487 0.6152669 -0.9959706 0.9278617 0.6733015 -0.9968409 0.8945255 0.7257011 -0.9975189 0.8828571 0.7719959 -0.9980488 0.8842998 0.8121268 -0.9984638 0.892989 0.8463492 -0.9987895 0.9050819 0.8751301 -0.9990455 0.9181889 0.8990542 -0.999247 0.9309211 0.9187495 -0.9994057 0.9425502 0.9348352 -0.9995308 0.952764 0.9478878 -0.9996295 0.9614985 0.9584237 -0.9997074 0.9688274 0.9668922 -0.9997688 0.9748918 0.9736756 -0.9998174 0.979858 0.9790946 -0.9998557 0.9838928 0.9834141 -0.999886 0.9871512 0.9868512 -0.9999099 0.9897703 0.9895825 -0.9999288 0.991868 0.9917504 -0.9999437 0.9935432 0.9934697 -0.6724572 0.9959813 0.6747327 -0.6724495 0.9959811 0.6747138 -0.6724399 0.9959809 0.6746901 -0.672428 0.9959807 0.6746604 -0.6724135 0.9959804 0.6746233 -0.6723959 0.9959801 0.6745771 -0.6723748 0.9959797 0.6745198 -0.67235 0.9959791 0.6744492 -0.6723217 0.9959785 0.6743629 -0.6722907 0.9959777 0.6742585 -0.6722594 0.9959768 0.674134 -0.6722322 0.9959757 0.673989 -0.672218 0.9959745 0.6738253 -0.672232 0.9959732 0.6736499 -0.6723012 0.9959719 0.673479 -0.6724711 0.9959709 0.6733446 -0.6728136 0.9959706 0.6733015 -0.6733015 0.9959706 0.6733015 -0.6739188 0.9959706 0.6733015 -0.6746998 0.9959706 0.6733015 -0.6756878 0.9959706 0.6733015 -0.6769378 0.9959706 0.6733015 -0.6785192 0.9959706 0.6733015 -0.6805199 0.9959706 0.6733015 -0.683051 0.9959706 0.6733015 -0.6862532 0.9959706 0.6733015 -0.6903044 0.9959706 0.6733015 -0.6954296 0.9959706 0.6733015 -0.7019138 0.9959706 0.6733015 -0.710117 0.9959706 0.6733015 -0.7204952 0.9959706 0.6733015 -0.733625 0.9959706 0.6733015 -0.7502359 0.9959706 0.6733015 -0.7712508 0.9959706 0.6733015 -0.7978374 0.9959706 0.6733015 -0.8314729 0.9959706 0.6733015 -0.8740262 0.9959706 0.6733015 -0.9278617 0.9959706 0.6733015 -0.9959706 0.9959706 0.6733015 -0.9968409 0.9396953 0.7257011 -0.9975189 0.9125186 0.7719959 -0.9980488 0.9036101 0.8121268 -0.9984638 0.9054678 0.8463492 -0.9987895 0.9130957 0.8751301 -0.9990455 0.9233085 0.8990542 -0.999247 0.9341777 0.9187495 -0.9994057 0.9446144 0.9348352 -0.9995308 0.9540687 0.9478878 -0.9996295 0.9623212 0.9584237 -0.9997074 0.9693452 0.9668922 -0.9997688 0.9752172 0.9736756 -0.9998174 0.9800622 0.9790946 -0.9998557 0.9840209 0.9834141 -0.999886 0.9872315 0.9868512 -0.9999099 0.9898206 0.9895825 -0.9999288 0.9918994 0.9917504 -0.9999437 0.9935629 0.9934697 -0.7251659 0.9968475 0.7266763 -0.7251605 0.9968474 0.7266635 -0.7251537 0.9968473 0.7266473 -0.7251454 0.9968472 0.7266271 -0.7251351 0.996847 0.7266018 -0.7251226 0.9968468 0.7265703 -0.7251076 0.9968465 0.7265312 -0.7250899 0.9968462 0.7264831 -0.7250697 0.9968458 0.7264242 -0.7250473 0.9968453 0.726353 -0.7250244 0.9968448 0.7262683 -0.7250039 0.9968441 0.7261694 -0.7249916 0.9968433 0.7260579 -0.7249978 0.9968425 0.7259384 -0.7250408 0.9968418 0.725822 -0.7251511 0.9968411 0.7257304 -0.7253775 0.9968409 0.7257011 -0.7257011 0.9968409 0.7257011 -0.7261105 0.9968409 0.7257011 -0.7266285 0.9968409 0.7257011 -0.7272837 0.9968409 0.7257011 -0.7281127 0.9968409 0.7257011 -0.7291615 0.9968409 0.7257011 -0.7304884 0.9968409 0.7257011 -0.732167 0.9968409 0.7257011 -0.7342907 0.9968409 0.7257011 -0.7369774 0.9968409 0.7257011 -0.7403765 0.9968409 0.7257011 -0.7446768 0.9968409 0.7257011 -0.7501172 0.9968409 0.7257011 -0.757 0.9968409 0.7257011 -0.7657077 0.9968409 0.7257011 -0.776724 0.9968409 0.7257011 -0.7906611 0.9968409 0.7257011 -0.8082934 0.9968409 0.7257011 -0.8306004 0.9968409 0.7257011 -0.8588218 0.9968409 0.7257011 -0.8945255 0.9968409 0.7257011 -0.9396953 0.9968409 0.7257011 -0.9968409 0.9968409 0.7257011 -0.9975189 0.9500442 0.7719959 -0.9980488 0.9280401 0.8121268 -0.9984638 0.921255 0.8463492 -0.9987895 0.9232341 0.8751301 -0.9990455 0.9297854 0.8990542 -0.999247 0.9382977 0.9187495 -0.9994057 0.9472259 0.9348352 -0.9995308 0.9557192 0.9478878 -0.9996295 0.963362 0.9584237 -0.9997074 0.9700002 0.9668922 -0.9997688 0.9756289 0.9736756 -0.9998174 0.9803206 0.9790946 -0.9998557 0.9841829 0.9834141 -0.999886 0.987333 0.9868512 -0.9999099 0.9898842 0.9895825 -0.9999288 0.9919392 0.9917504 -0.9999437 0.9935878 0.9934697 -0.7716588 0.997523 0.7726513 -0.7716551 0.997523 0.7726427 -0.7716504 0.9975229 0.7726318 -0.7716446 0.9975228 0.7726182 -0.7716375 0.9975227 0.7726012 -0.7716288 0.9975226 0.77258 -0.7716184 0.9975224 0.7725538 -0.7716061 0.9975222 0.7725214 -0.7715919 0.997522 0.7724818 -0.7715762 0.9975217 0.772434 -0.7715599 0.9975213 0.772377 -0.7715449 0.9975209 0.7723106 -0.7715352 0.9975204 0.7722356 -0.7715376 0.9975199 0.7721553 -0.7715641 0.9975194 0.7720771 -0.7716352 0.9975191 0.7720156 -0.7717834 0.9975189 0.7719959 -0.7719959 0.9975189 0.7719959 -0.7722648 0.9975189 0.7719959 -0.7726049 0.9975189 0.7719959 -0.7730352 0.9975189 0.7719959 -0.7735795 0.9975189 0.7719959 -0.7742682 0.9975189 0.7719959 -0.7751395 0.9975189 0.7719959 -0.7762418 0.9975189 0.7719959 -0.7776364 0.9975189 0.7719959 -0.7794007 0.9975189 0.7719959 -0.7816327 0.9975189 0.7719959 -0.7844566 0.9975189 0.7719959 -0.7880291 0.9975189 0.7719959 -0.7925488 0.9975189 0.7719959 -0.7982669 0.9975189 0.7719959 -0.8055009 0.9975189 0.7719959 -0.8146529 0.9975189 0.7719959 -0.8262314 0.9975189 0.7719959 -0.8408797 0.9975189 0.7719959 -0.8594117 0.9975189 0.7719959 -0.8828571 0.9975189 0.7719959 -0.9125186 0.9975189 0.7719959 -0.9500442 0.9975189 0.7719959 -0.9975189 0.9975189 0.7719959 -0.9980488 0.9589472 0.8121268 -0.9984638 0.9412278 0.8463492 -0.9987895 0.9360606 0.8751301 -0.9990455 0.9379796 0.8990542 -0.999247 0.94351 0.9187495 -0.9994057 0.9505298 0.9348352 -0.9995308 0.9578074 0.9478878 -0.9996295 0.9646787 0.9584237 -0.9997074 0.970829 0.9668922 -0.9997688 0.9761497 0.9736756 -0.9998174 0.9806476 0.9790946 -0.9998557 0.984388 0.9834141 -0.999886 0.9874615 0.9868512 -0.9999099 0.9899646 0.9895825 -0.9999288 0.9919896 0.9917504 -0.9999437 0.9936193 0.9934697 -0.8119154 0.9980513 0.8125619 -0.8119128 0.9980512 0.8125561 -0.8119096 0.9980512 0.8125489 -0.8119057 0.9980511 0.8125399 -0.8119009 0.9980511 0.8125286 -0.8118949 0.998051 0.8125145 -0.8118878 0.9980509 0.8124971 -0.8118794 0.9980508 0.8124756 -0.8118697 0.9980506 0.8124493 -0.8118589 0.9980504 0.8124175 -0.8118476 0.9980502 0.8123797 -0.811837 0.99805 0.8123356 -0.8118298 0.9980497 0.8122858 -0.8118303 0.9980494 0.8122325 -0.8118466 0.9980491 0.8121806 -0.8118921 0.9980488 0.8121398 -0.8119884 0.9980488 0.8121268 -0.8121268 0.9980488 0.8121268 -0.8123018 0.9980488 0.8121268 -0.8125232 0.9980488 0.8121268 -0.8128033 0.9980488 0.8121268 -0.8131577 0.9980488 0.8121268 -0.8136061 0.9980488 0.8121268 -0.8141733 0.9980488 0.8121268 -0.8148909 0.9980488 0.8121268 -0.8157988 0.9980488 0.8121268 -0.8169474 0.9980488 0.8121268 -0.8184005 0.9980488 0.8121268 -0.8202389 0.9980488 0.8121268 -0.8225647 0.9980488 0.8121268 -0.8255071 0.9980488 0.8121268 -0.8292297 0.9980488 0.8121268 -0.8339392 0.9980488 0.8121268 -0.8398974 0.9980488 0.8121268 -0.8474353 0.9980488 0.8121268 -0.8569716 0.9980488 0.8121268 -0.8690364 0.9980488 0.8121268 -0.8842998 0.9980488 0.8121268 -0.9036101 0.9980488 0.8121268 -0.9280401 0.9980488 0.8121268 -0.9589472 0.9980488 0.8121268 -0.9980488 0.9980488 0.8121268 -0.9984638 0.9664961 0.8463492 -0.9987895 0.9522877 0.8751301 -0.9990455 0.9483463 0.8990542 -0.999247 0.9501042 0.9187495 -0.9994057 0.9547096 0.9348352 -0.9995308 0.9604492 0.9478878 -0.9996295 0.9663445 0.9584237 -0.9997074 0.9718774 0.9668922 -0.9997688 0.9768086 0.9736756 -0.9998174 0.9810611 0.9790946 -0.9998557 0.9846473 0.9834141 -0.999886 0.987624 0.9868512 -0.9999099 0.9900664 0.9895825 -0.9999288 0.9920533 0.9917504 -0.9999437 0.9936592 0.9934697 -0.8462171 0.9984653 0.846635 -0.8462154 0.9984653 0.8466313 -0.8462132 0.9984653 0.8466265 -0.8462106 0.9984653 0.8466206 -0.8462073 0.9984652 0.8466132 -0.8462034 0.9984652 0.8466039 -0.8461986 0.9984651 0.8465925 -0.8461929 0.998465 0.8465783 -0.8461864 0.9984649 0.8465611 -0.8461791 0.9984648 0.8465402 -0.8461714 0.9984647 0.8465153 -0.8461641 0.9984645 0.8464864 -0.8461589 0.9984643 0.8464537 -0.8461587 0.9984642 0.8464187 -0.8461687 0.998464 0.8463846 -0.8461977 0.9984638 0.8463578 -0.8462598 0.9984638 0.8463492 -0.8463492 0.9984638 0.8463492 -0.8464623 0.9984638 0.8463492 -0.8466054 0.9984638 0.8463492 -0.8467864 0.9984638 0.8463492 -0.8470154 0.9984638 0.8463492 -0.8473052 0.9984638 0.8463492 -0.8476717 0.9984638 0.8463492 -0.8481355 0.9984638 0.8463492 -0.8487222 0.9984638 0.8463492 -0.8494644 0.9984638 0.8463492 -0.8504035 0.9984638 0.8463492 -0.8515915 0.9984638 0.8463492 -0.8530945 0.9984638 0.8463492 -0.8549959 0.9984638 0.8463492 -0.8574015 0.9984638 0.8463492 -0.8604449 0.9984638 0.8463492 -0.8642952 0.9984638 0.8463492 -0.8691663 0.9984638 0.8463492 -0.875329 0.9984638 0.8463492 -0.8831255 0.9984638 0.8463492 -0.892989 0.9984638 0.8463492 -0.9054678 0.9984638 0.8463492 -0.921255 0.9984638 0.8463492 -0.9412278 0.9984638 0.8463492 -0.9664961 0.9984638 0.8463492 -0.9984638 0.9984638 0.8463492 -0.9987895 0.9728171 0.8751301 -0.9990455 0.9614615 0.8990542 -0.999247 0.9584468 0.9187495 -0.9994057 0.9599976 0.9348352 -0.9995308 0.9637914 0.9478878 -0.9996295 0.968452 0.9584237 -0.9997074 0.9732039 0.9668922 -0.9997688 0.9776422 0.9736756 -0.9998174 0.9815844 0.9790946 -0.9998557 0.9849754 0.9834141 -0.999886 0.9878296 0.9868512 -0.9999099 0.9901951 0.9895825 -0.9999288 0.9921339 0.9917504 -0.9999437 0.9937096 0.9934697 -0.8750477 0.9987905 0.8753162 -0.8750466 0.9987905 0.8753137 -0.8750451 0.9987904 0.8753107 -0.8750434 0.9987904 0.8753068 -0.8750412 0.9987904 0.875302 -0.8750386 0.9987904 0.8752959 -0.8750355 0.9987903 0.8752885 -0.8750317 0.9987903 0.8752793 -0.8750274 0.9987902 0.875268 -0.8750225 0.9987902 0.8752545 -0.8750173 0.9987901 0.8752383 -0.8750124 0.99879 0.8752194 -0.8750088 0.9987899 0.8751981 -0.8750084 0.9987897 0.8751754 -0.8750145 0.9987896 0.8751532 -0.8750329 0.9987895 0.8751357 -0.8750727 0.9987895 0.8751301 -0.8751301 0.9987895 0.8751301 -0.8752028 0.9987895 0.8751301 -0.8752947 0.9987895 0.8751301 -0.8754109 0.9987895 0.8751301 -0.875558 0.9987895 0.8751301 -0.8757441 0.9987895 0.8751301 -0.8759795 0.9987895 0.8751301 -0.8762773 0.9987895 0.8751301 -0.8766541 0.9987895 0.8751301 -0.8771307 0.9987895 0.8751301 -0.8777338 0.9987895 0.8751301 -0.8784967 0.9987895 0.8751301 -0.8794619 0.9987895 0.8751301 -0.880683 0.9987895 0.8751301 -0.8822279 0.9987895 0.8751301 -0.8841823 0.9987895 0.8751301 -0.886655 0.9987895 0.8751301 -0.8897832 0.9987895 0.8751301 -0.8937407 0.9987895 0.8751301 -0.8987476 0.9987895 0.8751301 -0.9050819 0.9987895 0.8751301 -0.9130957 0.9987895 0.8751301 -0.9232341 0.9987895 0.8751301 -0.9360606 0.9987895 0.8751301 -0.9522877 0.9987895 0.8751301 -0.9728171 0.9987895 0.8751301 -0.9987895 0.9987895 0.8751301 -0.9990455 0.9780539 0.8990542 -0.999247 0.9690013 0.9187495 -0.9994057 0.9666876 0.9348352 -0.9995308 0.9680197 0.9478878 -0.9996295 0.9711183 0.9584237 -0.9997074 0.974882 0.9668922 -0.9997688 0.9786968 0.9736756 -0.9998174 0.9822464 0.9790946 -0.9998557 0.9853905 0.9834141 -0.999886 0.9880897 0.9868512 -0.9999099 0.990358 0.9895825 -0.9999288 0.9922358 0.9917504 -0.9999437 0.9937734 0.9934697 -0.8990028 0.9990461 0.8991744 -0.899002 0.9990461 0.8991728 -0.8990011 0.9990461 0.8991708 -0.899 0.9990461 0.8991683 -0.8989986 0.9990461 0.8991652 -0.8989969 0.9990461 0.8991613 -0.8989948 0.9990461 0.8991565 -0.8989923 0.999046 0.8991505 -0.8989895 0.999046 0.8991433 -0.8989863 0.9990459 0.8991345 -0.8989829 0.9990459 0.899124 -0.8989796 0.9990458 0.8991118 -0.8989771 0.9990458 0.8990981 -0.8989767 0.9990457 0.8990834 -0.8989805 0.9990456 0.8990691 -0.8989921 0.9990456 0.8990578 -0.8990175 0.9990455 0.8990542 -0.8990542 0.9990455 0.8990542 -0.8991006 0.9990455 0.8990542 -0.8991593 0.9990455 0.8990542 -0.8992336 0.9990455 0.8990542 -0.8993275 0.9990455 0.8990542 -0.8994464 0.9990455 0.8990542 -0.8995968 0.9990455 0.8990542 -0.899787 0.9990455 0.8990542 -0.9000277 0.9990455 0.8990542 -0.9003323 0.9990455 0.8990542 -0.9007175 0.9990455 0.8990542 -0.9012049 0.9990455 0.8990542 -0.9018215 0.9990455 0.8990542 -0.9026016 0.9990455 0.8990542 -0.9035886 0.9990455 0.8990542 -0.9048372 0.9990455 0.8990542 -0.9064168 0.9990455 0.8990542 -0.9084153 0.9990455 0.8990542 -0.9109436 0.9990455 0.8990542 -0.9141422 0.9990455 0.8990542 -0.9181889 0.9990455 0.8990542 -0.9233085 0.9990455 0.8990542 -0.9297854 0.9990455 0.8990542 -0.9379796 0.9990455 0.8990542 -0.9483463 0.9990455 0.8990542 -0.9614615 0.9990455 0.8990542 -0.9780539 0.9990455 0.8990542 -0.9990455 0.9990455 0.8990542 -0.999247 0.982354 0.9187495 -0.9994057 0.9751513 0.9348352 -0.9995308 0.9733691 0.9478878 -0.9996295 0.9744915 0.9584237 -0.9997074 0.977005 0.9668922 -0.9997688 0.980031 0.9736756 -0.9998174 0.9830838 0.9790946 -0.9998557 0.9859157 0.9834141 -0.999886 0.9884188 0.9868512 -0.9999099 0.9905641 0.9895825 -0.9999288 0.9923648 0.9917504 -0.9999437 0.9938541 0.9934697 -0.9187175 0.9992474 0.9188267 -0.918717 0.9992474 0.9188257 -0.9187164 0.9992474 0.9188244 -0.9187157 0.9992474 0.9188228 -0.9187148 0.9992474 0.9188208 -0.9187137 0.9992474 0.9188183 -0.9187123 0.9992473 0.9188152 -0.9187107 0.9992473 0.9188114 -0.9187089 0.9992473 0.9188067 -0.9187068 0.9992473 0.9188011 -0.9187045 0.9992472 0.9187944 -0.9187024 0.9992472 0.9187865 -0.9187008 0.9992472 0.9187777 -0.9187004 0.9992471 0.9187683 -0.9187027 0.9992471 0.9187591 -0.9187101 0.999247 0.9187518 -0.9187262 0.999247 0.9187495 -0.9187495 0.999247 0.9187495 -0.9187791 0.999247 0.9187495 -0.9188164 0.999247 0.9187495 -0.9188636 0.999247 0.9187495 -0.9189234 0.999247 0.9187495 -0.918999 0.999247 0.9187495 -0.9190947 0.999247 0.9187495 -0.9192157 0.999247 0.9187495 -0.9193688 0.999247 0.9187495 -0.9195625 0.999247 0.9187495 -0.9198076 0.999247 0.9187495 -0.9201176 0.999247 0.9187495 -0.9205098 0.999247 0.9187495 -0.9210061 0.999247 0.9187495 -0.9216339 0.999247 0.9187495 -0.9224281 0.999247 0.9187495 -0.9234329 0.999247 0.9187495 -0.9247041 0.999247 0.9187495 -0.9263124 0.999247 0.9187495 -0.928347 0.999247 0.9187495 -0.9309211 0.999247 0.9187495 -0.9341777 0.999247 0.9187495 -0.9382977 0.999247 0.9187495 -0.94351 0.999247 0.9187495 -0.9501042 0.999247 0.9187495 -0.9584468 0.999247 0.9187495 -0.9690013 0.999247 0.9187495 -0.982354 0.999247 0.9187495 -0.999247 0.999247 0.9187495 -0.9994057 0.9858591 0.9348352 -0.9995308 0.9801368 0.9478878 -0.9996295 0.978759 0.9584237 -0.9997074 0.9796909 0.9668922 -0.9997688 0.981719 0.9736756 -0.9998174 0.9841433 0.9790946 -0.9998557 0.9865801 0.9834141 -0.999886 0.9888351 0.9868512 -0.9999099 0.9908248 0.9895825 -0.9999288 0.992528 0.9917504 -0.9999437 0.9939562 0.9934697 -0.9348153 0.999406 0.9348845 -0.9348149 0.999406 0.9348838 -0.9348146 0.999406 0.934883 -0.9348141 0.999406 0.934882 -0.9348135 0.999406 0.9348807 -0.9348128 0.9994059 0.9348791 -0.9348119 0.9994059 0.9348771 -0.9348109 0.9994059 0.9348747 -0.9348097 0.9994059 0.9348717 -0.9348083 0.9994059 0.9348681 -0.9348069 0.9994059 0.9348638 -0.9348055 0.9994059 0.9348588 -0.9348044 0.9994058 0.9348532 -0.9348042 0.9994058 0.9348472 -0.9348056 0.9994058 0.9348413 -0.9348102 0.9994057 0.9348367 -0.9348204 0.9994057 0.9348352 -0.9348352 0.9994057 0.9348352 -0.9348539 0.9994057 0.9348352 -0.9348776 0.9994057 0.9348352 -0.9349075 0.9994057 0.9348352 -0.9349454 0.9994057 0.9348352 -0.9349933 0.9994057 0.9348352 -0.935054 0.9994057 0.9348352 -0.9351307 0.9994057 0.9348352 -0.9352277 0.9994057 0.9348352 -0.9353505 0.9994057 0.9348352 -0.9355059 0.9994057 0.9348352 -0.9357024 0.9994057 0.9348352 -0.935951 0.9994057 0.9348352 -0.9362655 0.9994057 0.9348352 -0.9366635 0.9994057 0.9348352 -0.9371669 0.9994057 0.9348352 -0.9378038 0.9994057 0.9348352 -0.9386096 0.9994057 0.9348352 -0.939629 0.9994057 0.9348352 -0.9409186 0.9994057 0.9348352 -0.9425502 0.9994057 0.9348352 -0.9446144 0.9994057 0.9348352 -0.9472259 0.9994057 0.9348352 -0.9505298 0.9994057 0.9348352 -0.9547096 0.9994057 0.9348352 -0.9599976 0.9994057 0.9348352 -0.9666876 0.9994057 0.9348352 -0.9751513 0.9994057 0.9348352 -0.9858591 0.9994057 0.9348352 -0.9994057 0.9994057 0.9348352 -0.9995308 0.9886988 0.9478878 -0.9996295 0.9841579 0.9584237 -0.9997074 0.983089 0.9668922 -0.9997688 0.9838545 0.9736756 -0.9998174 0.9854838 0.9790946 -0.9998557 0.9874207 0.9834141 -0.999886 0.9893618 0.9868512 -0.9999099 0.9911547 0.9895825 -0.9999288 0.9927345 0.9917504 -0.9999437 0.9940854 0.9934697 -0.9478754 0.999531 0.9479192 -0.9478752 0.999531 0.9479187 -0.947875 0.999531 0.9479182 -0.9478746 0.999531 0.9479176 -0.9478743 0.999531 0.9479168 -0.9478738 0.999531 0.9479157 -0.9478733 0.999531 0.9479145 -0.9478726 0.999531 0.9479129 -0.9478718 0.999531 0.947911 -0.947871 0.9995309 0.9479088 -0.94787 0.9995309 0.947906 -0.9478691 0.9995309 0.9479029 -0.9478684 0.9995309 0.9478993 -0.9478683 0.9995309 0.9478954 -0.9478691 0.9995309 0.9478917 -0.947872 0.9995309 0.9478888 -0.9478785 0.9995308 0.9478878 -0.9478878 0.9995308 0.9478878 -0.9478997 0.9995308 0.9478878 -0.9479146 0.9995308 0.9478878 -0.9479335 0.9995308 0.9478878 -0.9479575 0.9995308 0.9478878 -0.9479878 0.9995308 0.9478878 -0.9480261 0.9995308 0.9478878 -0.9480746 0.9995308 0.9478878 -0.9481359 0.9995308 0.9478878 -0.9482135 0.9995308 0.9478878 -0.9483117 0.9995308 0.9478878 -0.9484359 0.9995308 0.9478878 -0.9485931 0.9995308 0.9478878 -0.9487918 0.9995308 0.9478878 -0.9490434 0.9995308 0.9478878 -0.9493615 0.9995308 0.9478878 -0.9497641 0.9995308 0.9478878 -0.9502734 0.9995308 0.9478878 -0.9509177 0.9995308 0.9478878 -0.9517328 0.9995308 0.9478878 -0.952764 0.9995308 0.9478878 -0.9540687 0.9995308 0.9478878 -0.9557192 0.9995308 0.9478878 -0.9578074 0.9995308 0.9478878 -0.9604492 0.9995308 0.9478878 -0.9637914 0.9995308 0.9478878 -0.9680197 0.9995308 0.9478878 -0.9733691 0.9995308 0.9478878 -0.9801368 0.9995308 0.9478878 -0.9886988 0.9995308 0.9478878 -0.9995308 0.9995308 0.9478878 -0.9996295 0.9909882 0.9584237 -0.9997074 0.9873879 0.9668922 -0.9997688 0.9865561 0.9736756 -0.9998174 0.9871796 0.9790946 -0.9998557 0.9884841 0.9834141 -0.999886 0.9900282 0.9868512 -0.9999099 0.991572 0.9895825 -0.9999288 0.9929957 0.9917504 -0.9999437 0.9942488 0.9934697 -0.958416 0.9996296 0.9584436 -0.9584159 0.9996296 0.9584433 -0.9584157 0.9996296 0.958443 -0.9584155 0.9996296 0.9584426 -0.9584153 0.9996296 0.9584421 -0.958415 0.9996296 0.9584414 -0.9584146 0.9996296 0.9584406 -0.9584142 0.9996296 0.9584396 -0.9584137 0.9996296 0.9584384 -0.9584132 0.9996296 0.958437 -0.9584126 0.9996296 0.9584353 -0.958412 0.9996296 0.9584333 -0.9584115 0.9996296 0.958431 -0.9584114 0.9996295 0.9584286 -0.958412 0.9996295 0.9584262 -0.9584138 0.9996295 0.9584243 -0.9584178 0.9996295 0.9584237 -0.9584237 0.9996295 0.9584237 -0.9584312 0.9996295 0.9584237 -0.9584406 0.9996295 0.9584237 -0.9584526 0.9996295 0.9584237 -0.9584677 0.9996295 0.9584237 -0.9584868 0.9996295 0.9584237 -0.9585109 0.9996295 0.9584237 -0.9585415 0.9996295 0.9584237 -0.9585802 0.9996295 0.9584237 -0.9586291 0.9996295 0.9584237 -0.958691 0.9996295 0.9584237 -0.9587693 0.9996295 0.9584237 -0.9588684 0.9996295 0.9584237 -0.9589938 0.9996295 0.9584237 -0.9591524 0.9996295 0.9584237 -0.959353 0.9996295 0.9584237 -0.9596068 0.9996295 0.9584237 -0.959928 0.9996295 0.9584237 -0.9603343 0.9996295 0.9584237 -0.9608482 0.9996295 0.9584237 -0.9614985 0.9996295 0.9584237 -0.9623212 0.9996295 0.9584237 -0.963362 0.9996295 0.9584237 -0.9646787 0.9996295 0.9584237 -0.9663445 0.9996295 0.9584237 -0.968452 0.9996295 0.9584237 -0.9711183 0.9996295 0.9584237 -0.9744915 0.9996295 0.9584237 -0.978759 0.9996295 0.9584237 -0.9841579 0.9996295 0.9584237 -0.9909882 0.9996295 0.9584237 -0.9996295 0.9996295 0.9584237 -0.9997074 0.9928267 0.9668922 -0.9997688 0.9899741 0.9736756 -0.9998174 0.989325 0.9790946 -0.9998557 0.9898295 0.9834141 -0.999886 0.9908712 0.9868512 -0.9999099 0.9920999 0.9895825 -0.9999288 0.9933261 0.9917504 -0.9999437 0.9944556 0.9934697 -0.9668873 0.9997074 0.9669047 -0.9668872 0.9997074 0.9669045 -0.9668871 0.9997074 0.9669043 -0.966887 0.9997074 0.9669041 -0.9668869 0.9997074 0.9669037 -0.9668867 0.9997074 0.9669033 -0.9668865 0.9997074 0.9669028 -0.9668862 0.9997074 0.9669022 -0.9668859 0.9997074 0.9669014 -0.9668855 0.9997074 0.9669005 -0.9668852 0.9997074 0.9668994 -0.9668848 0.9997074 0.9668982 -0.9668845 0.9997074 0.9668967 -0.9668844 0.9997074 0.9668952 -0.9668847 0.9997074 0.9668937 -0.9668859 0.9997074 0.9668925 -0.9668884 0.9997074 0.9668922 -0.9668922 0.9997074 0.9668922 -0.9668969 0.9997074 0.9668922 -0.9669028 0.9997074 0.9668922 -0.9669103 0.9997074 0.9668922 -0.9669198 0.9997074 0.9668922 -0.9669318 0.9997074 0.9668922 -0.966947 0.9997074 0.9668922 -0.9669663 0.9997074 0.9668922 -0.9669906 0.9997074 0.9668922 -0.9670214 0.9997074 0.9668922 -0.9670604 0.9997074 0.9668922 -0.9671097 0.9997074 0.9668922 -0.967172 0.9997074 0.9668922 -0.9672509 0.9997074 0.9668922 -0.9673508 0.9997074 0.9668922 -0.967477 0.9997074 0.9668922 -0.9676368 0.9997074 0.9668922 -0.9678389 0.9997074 0.9668922 -0.9680946 0.9997074 0.9668922 -0.9684181 0.9997074 0.9668922 -0.9688274 0.9997074 0.9668922 -0.9693452 0.9997074 0.9668922 -0.9700002 0.9997074 0.9668922 -0.970829 0.9997074 0.9668922 -0.9718774 0.9997074 0.9668922 -0.9732039 0.9997074 0.9668922 -0.974882 0.9997074 0.9668922 -0.977005 0.9997074 0.9668922 -0.9796909 0.9997074 0.9668922 -0.983089 0.9997074 0.9668922 -0.9873879 0.9997074 0.9668922 -0.9928267 0.9997074 0.9668922 -0.9997074 0.9997074 0.9668922 -0.9997688 0.9942982 0.9736756 -0.9998174 0.9920392 0.9790946 -0.9998557 0.9915316 0.9834141 -0.999886 0.9919377 0.9868512 -0.9999099 0.9927678 0.9895825 -0.9999288 0.9937442 0.9917504 -0.9999437 0.9947172 0.9934697 -0.9736726 0.9997689 0.9736835 -0.9736726 0.9997689 0.9736834 -0.9736725 0.9997689 0.9736833 -0.9736724 0.9997689 0.9736831 -0.9736723 0.9997689 0.9736829 -0.9736722 0.9997689 0.9736827 -0.9736721 0.9997689 0.9736824 -0.9736719 0.9997689 0.973682 -0.9736717 0.9997689 0.9736815 -0.9736715 0.9997689 0.9736809 -0.9736712 0.9997689 0.9736802 -0.973671 0.9997689 0.9736794 -0.9736708 0.9997689 0.9736785 -0.9736708 0.9997689 0.9736776 -0.973671 0.9997688 0.9736766 -0.9736717 0.9997688 0.9736759 -0.9736733 0.9997688 0.9736756 -0.9736756 0.9997688 0.9736756 -0.9736786 0.9997688 0.9736756 -0.9736823 0.9997688 0.9736756 -0.973687 0.9997688 0.9736756 -0.973693 0.9997688 0.9736756 -0.9737006 0.9997688 0.9736756 -0.9737101 0.9997688 0.9736756 -0.9737222 0.9997688 0.9736756 -0.9737375 0.9997688 0.9736756 -0.9737569 0.9997688 0.9736756 -0.9737814 0.9997688 0.9736756 -0.9738123 0.9997688 0.9736756 -0.9738515 0.9997688 0.9736756 -0.9739011 0.9997688 0.9736756 -0.9739638 0.9997688 0.9736756 -0.9740432 0.9997688 0.9736756 -0.9741436 0.9997688 0.9736756 -0.9742706 0.9997688 0.9736756 -0.9744313 0.9997688 0.9736756 -0.9746346 0.9997688 0.9736756 -0.9748918 0.9997688 0.9736756 -0.9752172 0.9997688 0.9736756 -0.9756289 0.9997688 0.9736756 -0.9761497 0.9997688 0.9736756 -0.9768086 0.9997688 0.9736756 -0.9776422 0.9997688 0.9736756 -0.9786968 0.9997688 0.9736756 -0.980031 0.9997688 0.9736756 -0.981719 0.9997688 0.9736756 -0.9838545 0.9997688 0.9736756 -0.9865561 0.9997688 0.9736756 -0.9899741 0.9997688 0.9736756 -0.9942982 0.9997688 0.9736756 -0.9997688 0.9997688 0.9736756 -0.9998174 0.9954731 0.9790946 -0.9998557 0.9936849 0.9834141 -0.999886 0.993287 0.9868512 -0.9999099 0.9936128 0.9895825 -0.9999288 0.9942731 0.9917504 -0.9999437 0.9950481 0.9934697 -0.9790927 0.9998174 0.9790996 -0.9790927 0.9998174 0.9790995 -0.9790927 0.9998174 0.9790994 -0.9790926 0.9998174 0.9790993 -0.9790925 0.9998174 0.9790992 -0.9790925 0.9998174 0.979099 -0.9790924 0.9998174 0.9790988 -0.9790923 0.9998174 0.9790986 -0.9790921 0.9998174 0.9790983 -0.979092 0.9998174 0.9790979 -0.9790919 0.9998174 0.9790975 -0.9790917 0.9998174 0.979097 -0.9790916 0.9998174 0.9790964 -0.9790916 0.9998174 0.9790958 -0.9790917 0.9998174 0.9790952 -0.9790921 0.9998174 0.9790948 -0.9790931 0.9998174 0.9790946 -0.9790946 0.9998174 0.9790946 -0.9790965 0.9998174 0.9790946 -0.9790988 0.9998174 0.9790946 -0.9791018 0.9998174 0.9790946 -0.9791055 0.9998174 0.9790946 -0.9791103 0.9998174 0.9790946 -0.9791163 0.9998174 0.9790946 -0.9791238 0.9998174 0.9790946 -0.9791334 0.9998174 0.9790946 -0.9791456 0.9998174 0.9790946 -0.979161 0.9998174 0.9790946 -0.9791804 0.9998174 0.9790946 -0.979205 0.9998174 0.9790946 -0.9792361 0.9998174 0.9790946 -0.9792755 0.9998174 0.9790946 -0.9793253 0.9998174 0.9790946 -0.9793883 0.9998174 0.9790946 -0.9794681 0.9998174 0.9790946 -0.9795689 0.9998174 0.9790946 -0.9796966 0.9998174 0.9790946 -0.979858 0.9998174 0.9790946 -0.9800622 0.9998174 0.9790946 -0.9803206 0.9998174 0.9790946 -0.9806476 0.9998174 0.9790946 -0.9810611 0.9998174 0.9790946 -0.9815844 0.9998174 0.9790946 -0.9822464 0.9998174 0.9790946 -0.9830838 0.9998174 0.9790946 -0.9841433 0.9998174 0.9790946 -0.9854838 0.9998174 0.9790946 -0.9871796 0.9998174 0.9790946 -0.989325 0.9998174 0.9790946 -0.9920392 0.9998174 0.9790946 -0.9954731 0.9998174 0.9790946 -0.9998174 0.9998174 0.9790946 -0.9998557 0.9964092 0.9834141 -0.999886 0.9949941 0.9868512 -0.9999099 0.9946818 0.9895825 -0.9999288 0.9949422 0.9917504 -0.9999437 0.9954668 0.9934697 -0.9834129 0.9998557 0.9834172 -0.9834129 0.9998557 0.9834172 -0.9834129 0.9998557 0.9834171 -0.9834129 0.9998557 0.9834171 -0.9834128 0.9998557 0.983417 -0.9834128 0.9998557 0.9834169 -0.9834127 0.9998557 0.9834168 -0.9834127 0.9998557 0.9834166 -0.9834126 0.9998557 0.9834164 -0.9834125 0.9998557 0.9834162 -0.9834124 0.9998557 0.9834159 -0.9834123 0.9998557 0.9834156 -0.9834122 0.9998557 0.9834152 -0.9834122 0.9998557 0.9834149 -0.9834123 0.9998557 0.9834145 -0.9834126 0.9998557 0.9834142 -0.9834132 0.9998557 0.9834141 -0.9834141 0.9998557 0.9834141 -0.9834153 0.9998557 0.9834141 -0.9834167 0.9998557 0.9834141 -0.9834186 0.9998557 0.9834141 -0.9834209 0.9998557 0.9834141 -0.9834239 0.9998557 0.9834141 -0.9834277 0.9998557 0.9834141 -0.9834324 0.9998557 0.9834141 -0.9834385 0.9998557 0.9834141 -0.9834461 0.9998557 0.9834141 -0.9834557 0.9998557 0.9834141 -0.9834679 0.9998557 0.9834141 -0.9834833 0.9998557 0.9834141 -0.9835029 0.9998557 0.9834141 -0.9835276 0.9998557 0.9834141 -0.9835588 0.9998557 0.9834141 -0.9835983 0.9998557 0.9834141 -0.9836483 0.9998557 0.9834141 -0.9837116 0.9998557 0.9834141 -0.9837916 0.9998557 0.9834141 -0.9838928 0.9998557 0.9834141 -0.9840209 0.9998557 0.9834141 -0.9841829 0.9998557 0.9834141 -0.984388 0.9998557 0.9834141 -0.9846473 0.9998557 0.9834141 -0.9849754 0.9998557 0.9834141 -0.9853905 0.9998557 0.9834141 -0.9859157 0.9998557 0.9834141 -0.9865801 0.9998557 0.9834141 -0.9874207 0.9998557 0.9834141 -0.9884841 0.9998557 0.9834141 -0.9898295 0.9998557 0.9834141 -0.9915316 0.9998557 0.9834141 -0.9936849 0.9998557 0.9834141 -0.9964092 0.9998557 0.9834141 -0.9998557 0.9998557 0.9834141 -0.999886 0.9971537 0.9868512 -0.9999099 0.9960342 0.9895825 -0.9999288 0.9957887 0.9917504 -0.9999437 0.9959964 0.9934697 -0.9868505 0.999886 0.9868532 -0.9868505 0.999886 0.9868532 -0.9868505 0.999886 0.9868531 -0.9868505 0.999886 0.9868531 -0.9868504 0.999886 0.986853 -0.9868504 0.999886 0.986853 -0.9868504 0.999886 0.9868529 -0.9868503 0.999886 0.9868528 -0.9868503 0.999886 0.9868527 -0.9868502 0.999886 0.9868525 -0.9868502 0.999886 0.9868524 -0.9868501 0.999886 0.9868522 -0.9868501 0.999886 0.986852 -0.98685 0.999886 0.9868517 -0.9868501 0.999886 0.9868515 -0.9868503 0.999886 0.9868513 -0.9868507 0.999886 0.9868512 -0.9868512 0.999886 0.9868512 -0.986852 0.999886 0.9868512 -0.9868529 0.999886 0.9868512 -0.9868541 0.999886 0.9868512 -0.9868555 0.999886 0.9868512 -0.9868574 0.999886 0.9868512 -0.9868597 0.999886 0.9868512 -0.9868627 0.999886 0.9868512 -0.9868665 0.999886 0.9868512 -0.9868713 0.999886 0.9868512 -0.9868773 0.999886 0.9868512 -0.986885 0.999886 0.9868512 -0.9868946 0.999886 0.9868512 -0.9869069 0.999886 0.9868512 -0.9869223 0.999886 0.9868512 -0.9869419 0.999886 0.9868512 -0.9869667 0.999886 0.9868512 -0.986998 0.999886 0.9868512 -0.9870376 0.999886 0.9868512 -0.9870878 0.999886 0.9868512 -0.9871512 0.999886 0.9868512 -0.9872315 0.999886 0.9868512 -0.987333 0.999886 0.9868512 -0.9874615 0.999886 0.9868512 -0.987624 0.999886 0.9868512 -0.9878296 0.999886 0.9868512 -0.9880897 0.999886 0.9868512 -0.9884188 0.999886 0.9868512 -0.9888351 0.999886 0.9868512 -0.9893618 0.999886 0.9868512 -0.9900282 0.999886 0.9868512 -0.9908712 0.999886 0.9868512 -0.9919377 0.999886 0.9868512 -0.993287 0.999886 0.9868512 -0.9949941 0.999886 0.9868512 -0.9971537 0.999886 0.9868512 -0.999886 0.999886 0.9868512 -0.9999099 0.9977452 0.9895825 -0.9999288 0.9968597 0.9917504 -0.9999437 0.9966665 0.9934697 -0.989582 0.9999099 0.9895837 -0.989582 0.9999099 0.9895837 -0.989582 0.9999099 0.9895837 -0.989582 0.9999099 0.9895836 -0.989582 0.9999099 0.9895836 -0.9895819 0.9999099 0.9895836 -0.9895819 0.9999099 0.9895835 -0.9895819 0.9999099 0.9895834 -0.9895819 0.9999099 0.9895834 -0.9895818 0.9999099 0.9895833 -0.9895818 0.9999099 0.9895832 -0.9895818 0.9999099 0.9895831 -0.9895817 0.9999099 0.9895829 -0.9895817 0.9999099 0.9895828 -0.9895817 0.9999099 0.9895826 -0.9895819 0.9999099 0.9895825 -0.9895821 0.9999099 0.9895825 -0.9895825 0.9999099 0.9895825 -0.9895829 0.9999099 0.9895825 -0.9895835 0.9999099 0.9895825 -0.9895842 0.9999099 0.9895825 -0.9895851 0.9999099 0.9895825 -0.9895863 0.9999099 0.9895825 -0.9895878 0.9999099 0.9895825 -0.9895897 0.9999099 0.9895825 -0.989592 0.9999099 0.9895825 -0.989595 0.9999099 0.9895825 -0.9895988 0.9999099 0.9895825 -0.9896036 0.9999099 0.9895825 -0.9896096 0.9999099 0.9895825 -0.9896173 0.9999099 0.9895825 -0.989627 0.9999099 0.9895825 -0.9896392 0.9999099 0.9895825 -0.9896547 0.9999099 0.9895825 -0.9896744 0.9999099 0.9895825 -0.9896992 0.9999099 0.9895825 -0.9897306 0.9999099 0.9895825 -0.9897703 0.9999099 0.9895825 -0.9898206 0.9999099 0.9895825 -0.9898842 0.9999099 0.9895825 -0.9899646 0.9999099 0.9895825 -0.9900664 0.9999099 0.9895825 -0.9901951 0.9999099 0.9895825 -0.990358 0.9999099 0.9895825 -0.9905641 0.9999099 0.9895825 -0.9908248 0.9999099 0.9895825 -0.9911547 0.9999099 0.9895825 -0.991572 0.9999099 0.9895825 -0.9920999 0.9999099 0.9895825 -0.9927678 0.9999099 0.9895825 -0.9936128 0.9999099 0.9895825 -0.9946818 0.9999099 0.9895825 -0.9960342 0.9999099 0.9895825 -0.9977452 0.9999099 0.9895825 -0.9999099 0.9999099 0.9895825 -0.9999288 0.9982146 0.9917504 -0.9999437 0.9975143 0.9934697 -0.9917501 0.9999288 0.9917511 -0.9917501 0.9999288 0.9917511 -0.9917501 0.9999288 0.9917511 -0.9917501 0.9999288 0.9917511 -0.9917501 0.9999288 0.9917511 -0.9917501 0.9999288 0.9917511 -0.99175 0.9999288 0.991751 -0.99175 0.9999288 0.991751 -0.99175 0.9999288 0.991751 -0.99175 0.9999288 0.9917509 -0.99175 0.9999288 0.9917508 -0.9917499 0.9999288 0.9917507 -0.9917499 0.9999288 0.9917507 -0.9917499 0.9999288 0.9917506 -0.9917499 0.9999288 0.9917505 -0.99175 0.9999288 0.9917504 -0.9917502 0.9999288 0.9917504 -0.9917504 0.9999288 0.9917504 -0.9917507 0.9999288 0.9917504 -0.991751 0.9999288 0.9917504 -0.9917515 0.9999288 0.9917504 -0.9917521 0.9999288 0.9917504 -0.9917528 0.9999288 0.9917504 -0.9917537 0.9999288 0.9917504 -0.9917549 0.9999288 0.9917504 -0.9917564 0.9999288 0.9917504 -0.9917582 0.9999288 0.9917504 -0.9917606 0.9999288 0.9917504 -0.9917636 0.9999288 0.9917504 -0.9917674 0.9999288 0.9917504 -0.9917722 0.9999288 0.9917504 -0.9917782 0.9999288 0.9917504 -0.9917859 0.9999288 0.9917504 -0.9917956 0.9999288 0.9917504 -0.9918079 0.9999288 0.9917504 -0.9918234 0.9999288 0.9917504 -0.9918431 0.9999288 0.9917504 -0.991868 0.9999288 0.9917504 -0.9918994 0.9999288 0.9917504 -0.9919392 0.9999288 0.9917504 -0.9919896 0.9999288 0.9917504 -0.9920533 0.9999288 0.9917504 -0.9921339 0.9999288 0.9917504 -0.9922358 0.9999288 0.9917504 -0.9923648 0.9999288 0.9917504 -0.992528 0.9999288 0.9917504 -0.9927345 0.9999288 0.9917504 -0.9929957 0.9999288 0.9917504 -0.9933261 0.9999288 0.9917504 -0.9937442 0.9999288 0.9917504 -0.9942731 0.9999288 0.9917504 -0.9949422 0.9999288 0.9917504 -0.9957887 0.9999288 0.9917504 -0.9968597 0.9999288 0.9917504 -0.9982146 0.9999288 0.9917504 -0.9999288 0.9999288 0.9917504 -0.9999437 0.9985868 0.9934697 -0.9934695 0.9999437 0.9934701 -0.9934695 0.9999437 0.9934701 -0.9934695 0.9999437 0.9934701 -0.9934695 0.9999437 0.9934701 -0.9934695 0.9999437 0.9934701 -0.9934695 0.9999437 0.9934701 -0.9934695 0.9999437 0.9934701 -0.9934694 0.9999437 0.9934701 -0.9934694 0.9999437 0.99347 -0.9934694 0.9999437 0.99347 -0.9934694 0.9999437 0.9934699 -0.9934694 0.9999437 0.9934699 -0.9934694 0.9999437 0.9934698 -0.9934694 0.9999437 0.9934698 -0.9934694 0.9999437 0.9934697 -0.9934694 0.9999437 0.9934697 -0.9934695 0.9999437 0.9934697 -0.9934697 0.9999437 0.9934697 -0.9934698 0.9999437 0.9934697 -0.9934701 0.9999437 0.9934697 -0.9934704 0.9999437 0.9934697 -0.9934707 0.9999437 0.9934697 -0.9934712 0.9999437 0.9934697 -0.9934718 0.9999437 0.9934697 -0.9934725 0.9999437 0.9934697 -0.9934734 0.9999437 0.9934697 -0.9934746 0.9999437 0.9934697 -0.9934761 0.9999437 0.9934697 -0.9934779 0.9999437 0.9934697 -0.9934803 0.9999437 0.9934697 -0.9934833 0.9999437 0.9934697 -0.9934871 0.9999437 0.9934697 -0.9934919 0.9999437 0.9934697 -0.993498 0.9999437 0.9934697 -0.9935057 0.9999437 0.9934697 -0.9935154 0.9999437 0.9934697 -0.9935277 0.9999437 0.9934697 -0.9935432 0.9999437 0.9934697 -0.9935629 0.9999437 0.9934697 -0.9935878 0.9999437 0.9934697 -0.9936193 0.9999437 0.9934697 -0.9936592 0.9999437 0.9934697 -0.9937096 0.9999437 0.9934697 -0.9937734 0.9999437 0.9934697 -0.9938541 0.9999437 0.9934697 -0.9939562 0.9999437 0.9934697 -0.9940854 0.9999437 0.9934697 -0.9942488 0.9999437 0.9934697 -0.9944556 0.9999437 0.9934697 -0.9947172 0.9999437 0.9934697 -0.9950481 0.9999437 0.9934697 -0.9954668 0.9999437 0.9934697 -0.9959964 0.9999437 0.9934697 -0.9966665 0.9999437 0.9934697 -0.9975143 0.9999437 0.9934697 -0.9985868 0.9999437 0.9934697 -0.9999437 0.9999437 0.9934697 -0.0000238 0.0000238 0.1327073 -0.0005417 0.0000238 0.1327073 -0.0011968 0.0000238 0.1327073 -0.0020256 0.0000238 0.1327073 -0.0030742 0.0000238 0.1327073 -0.0044007 0.0000238 0.1327073 -0.006079 0.0000238 0.1327073 -0.0082023 0.0000238 0.1327073 -0.0108885 0.0000238 0.1327073 -0.0142868 0.0000238 0.1327073 -0.0185862 0.0000238 0.1327073 -0.0240255 0.0000238 0.1327073 -0.0309069 0.0000238 0.1327073 -0.0396127 0.0000238 0.1327073 -0.0506267 0.0000238 0.1327073 -0.0645609 0.0000238 0.1327073 -0.0821895 0.0000238 0.1327073 -0.1044919 0.0000238 0.1327073 -0.1327073 0.0000238 0.1327073 -0.1684036 0.0000238 0.1327073 -0.2135639 0.0000238 0.1327073 -0.2706977 0.0000238 0.1327073 -0.3429792 0.0000238 0.1327073 -0.4344249 0.0000238 0.1327073 -0.5501155 0.0000238 0.1327073 -0.6964791 0.0000238 0.1327073 -0.8407292 0.0051514 0.1309049 -0.9033413 0.0279321 0.1320218 -0.9354466 0.0624569 0.1444753 -0.9545467 0.1059991 0.1689957 -0.9669269 0.1572498 0.2047525 -0.9754027 0.2151269 0.2503773 -0.9814251 0.2783684 0.3041308 -0.9858181 0.3454107 0.3639574 -0.9890841 0.4144197 0.4275735 -0.9915469 0.4834235 0.4926161 -0.993424 0.5504963 0.5568298 -0.9948662 0.6139459 0.6182511 -0.9959813 0.6724572 0.6753473 -0.9968475 0.7251659 0.7270843 -0.997523 0.7716588 0.7729194 -0.9980513 0.8119154 0.8127365 -0.9984653 0.8462171 0.8467479 -0.9987905 0.8750477 0.8753887 -0.9990461 0.8990028 0.8992207 -0.9992474 0.9187175 0.9188562 -0.999406 0.9348153 0.9349032 -0.999531 0.9478754 0.947931 -0.9996296 0.958416 0.958451 -0.9997074 0.9668873 0.9669094 -0.9997689 0.9736726 0.9736865 -0.9998174 0.9790927 0.9791014 -0.9998557 0.9834129 0.9834184 -0.999886 0.9868505 0.9868539 -0.9999099 0.989582 0.9895841 -0.9999288 0.9917501 0.9917514 -0.9999437 0.9934695 0.9934703 -0.0000238 0.0005417 0.1327073 -0.0000382 0.0000382 0.1322038 -0.0006933 0.0000382 0.1322038 -0.0015221 0.0000382 0.1322038 -0.0025707 0.0000382 0.1322038 -0.0038972 0.0000382 0.1322038 -0.0055755 0.0000382 0.1322038 -0.0076988 0.0000382 0.1322038 -0.0103849 0.0000382 0.1322038 -0.0137833 0.0000382 0.1322038 -0.0180827 0.0000382 0.1322038 -0.023522 0.0000382 0.1322038 -0.0304033 0.0000382 0.1322038 -0.0391092 0.0000382 0.1322038 -0.0501232 0.0000382 0.1322038 -0.0640574 0.0000382 0.1322038 -0.081686 0.0000382 0.1322038 -0.1039884 0.0000382 0.1322038 -0.1322038 0.0000382 0.1322038 -0.1679 0.0000382 0.1322038 -0.2130604 0.0000382 0.1322038 -0.2701941 0.0000382 0.1322038 -0.3424757 0.0000382 0.1322038 -0.4339214 0.0000382 0.1322038 -0.549612 0.0000382 0.1322038 -0.6959756 0.0000382 0.1322038 -0.8405071 0.0051286 0.1304351 -0.9032596 0.0278872 0.1316144 -0.9354101 0.0624063 0.1441359 -0.9545286 0.1059489 0.1687203 -0.9669173 0.1572031 0.2045334 -0.9753975 0.2150852 0.2502061 -0.9814221 0.2783325 0.3039992 -0.9858163 0.3453807 0.363858 -0.9890831 0.4143955 0.4274997 -0.9915463 0.4834045 0.4925623 -0.9934236 0.5504818 0.5567912 -0.994866 0.6139352 0.6182239 -0.9959811 0.6724495 0.6753284 -0.9968474 0.7251605 0.7270714 -0.997523 0.7716551 0.7729107 -0.9980512 0.8119128 0.8127308 -0.9984653 0.8462154 0.8467442 -0.9987905 0.8750466 0.8753863 -0.9990461 0.899002 0.8992191 -0.9992474 0.918717 0.9188551 -0.999406 0.9348149 0.9349025 -0.999531 0.9478752 0.9479306 -0.9996296 0.9584159 0.9584508 -0.9997074 0.9668872 0.9669092 -0.9997689 0.9736726 0.9736864 -0.9998174 0.9790927 0.9791014 -0.9998557 0.9834129 0.9834184 -0.999886 0.9868505 0.9868539 -0.9999099 0.989582 0.9895841 -0.9999288 0.9917501 0.9917514 -0.9999437 0.9934695 0.9934703 -0.0000238 0.0011968 0.1327073 -0.0000382 0.0006933 0.1322038 -0.0000611 0.0000611 0.1315716 -0.0008899 0.0000611 0.1315716 -0.0019385 0.0000611 0.1315716 -0.003265 0.0000611 0.1315716 -0.0049433 0.0000611 0.1315716 -0.0070666 0.0000611 0.1315716 -0.0097527 0.0000611 0.1315716 -0.0131511 0.0000611 0.1315716 -0.0174505 0.0000611 0.1315716 -0.0228898 0.0000611 0.1315716 -0.0297711 0.0000611 0.1315716 -0.038477 0.0000611 0.1315716 -0.049491 0.0000611 0.1315716 -0.0634252 0.0000611 0.1315716 -0.0810538 0.0000611 0.1315716 -0.1033562 0.0000611 0.1315716 -0.1315716 0.0000611 0.1315716 -0.1672678 0.0000611 0.1315716 -0.2124282 0.0000611 0.1315716 -0.2695619 0.0000611 0.1315716 -0.3418435 0.0000611 0.1315716 -0.4332891 0.0000611 0.1315716 -0.5489798 0.0000611 0.1315716 -0.6953434 0.0000611 0.1315716 -0.8402274 0.0051047 0.1298447 -0.9031567 0.0278347 0.1311024 -0.9353643 0.0623458 0.1437093 -0.9545059 0.1058883 0.1683742 -0.9669053 0.1571463 0.2042583 -0.9753908 0.2150342 0.249991 -0.9814183 0.2782884 0.303834 -0.9858141 0.3453439 0.3637331 -0.9890818 0.4143657 0.427407 -0.9915455 0.4833811 0.4924946 -0.9934231 0.550464 0.5567427 -0.9948657 0.6139219 0.6181897 -0.9959809 0.6724399 0.6753048 -0.9968473 0.7251537 0.7270553 -0.9975229 0.7716504 0.7728999 -0.9980512 0.8119096 0.8127235 -0.9984653 0.8462132 0.8467394 -0.9987904 0.8750451 0.8753832 -0.9990461 0.8990011 0.8992171 -0.9992474 0.9187164 0.9188539 -0.999406 0.9348146 0.9349017 -0.999531 0.947875 0.94793 -0.9996296 0.9584157 0.9584504 -0.9997074 0.9668871 0.966909 -0.9997689 0.9736725 0.9736863 -0.9998174 0.9790927 0.9791013 -0.9998557 0.9834129 0.9834183 -0.999886 0.9868505 0.9868539 -0.9999099 0.989582 0.9895841 -0.9999288 0.9917501 0.9917514 -0.9999437 0.9934695 0.9934703 -0.0000238 0.0020256 0.1327073 -0.0000382 0.0015221 0.1322038 -0.0000611 0.0008899 0.1315716 -0.0000978 0.0000978 0.1307795 -0.0011463 0.0000978 0.1307795 -0.0024729 0.0000978 0.1307795 -0.0041512 0.0000978 0.1307795 -0.0062744 0.0000978 0.1307795 -0.0089606 0.0000978 0.1307795 -0.012359 0.0000978 0.1307795 -0.0166583 0.0000978 0.1307795 -0.0220976 0.0000978 0.1307795 -0.028979 0.0000978 0.1307795 -0.0376849 0.0000978 0.1307795 -0.0486989 0.0000978 0.1307795 -0.0626331 0.0000978 0.1307795 -0.0802616 0.0000978 0.1307795 -0.102564 0.0000978 0.1307795 -0.1307795 0.0000978 0.1307795 -0.1664757 0.0000978 0.1307795 -0.2116361 0.0000978 0.1307795 -0.2687698 0.0000978 0.1307795 -0.3410514 0.0000978 0.1307795 -0.432497 0.0000978 0.1307795 -0.5481876 0.0000978 0.1307795 -0.6945513 0.0000978 0.1307795 -0.8398756 0.0050826 0.1291042 -0.9030276 0.0277752 0.1304603 -0.9353068 0.0622749 0.1431744 -0.9544774 0.1058162 0.1679403 -0.9668902 0.1570779 0.2039133 -0.9753825 0.2149725 0.2497215 -0.9814136 0.2782347 0.3036269 -0.9858113 0.3452987 0.3635767 -0.9890801 0.414329 0.4272908 -0.9915446 0.4833522 0.4924099 -0.9934225 0.5504419 0.556682 -0.9948653 0.6139056 0.618147 -0.9959807 0.672428 0.6752752 -0.9968472 0.7251454 0.7270351 -0.9975228 0.7716446 0.7728863 -0.9980511 0.8119057 0.8127145 -0.9984653 0.8462106 0.8467335 -0.9987904 0.8750434 0.8753793 -0.9990461 0.899 0.8992146 -0.9992474 0.9187157 0.9188523 -0.999406 0.9348141 0.9349007 -0.999531 0.9478746 0.9479294 -0.9996296 0.9584155 0.95845 -0.9997074 0.966887 0.9669087 -0.9997689 0.9736724 0.9736861 -0.9998174 0.9790926 0.9791012 -0.9998557 0.9834129 0.9834182 -0.999886 0.9868505 0.9868538 -0.9999099 0.989582 0.9895841 -0.9999288 0.9917501 0.9917514 -0.9999437 0.9934695 0.9934703 -0.0000238 0.0030742 0.1327073 -0.0000382 0.0025707 0.1322038 -0.0000611 0.0019385 0.1315716 -0.0000978 0.0011463 0.1307795 -0.0001565 0.0001565 0.1297896 -0.001483 0.0001565 0.1297896 -0.0031613 0.0001565 0.1297896 -0.0052846 0.0001565 0.1297896 -0.0079707 0.0001565 0.1297896 -0.0113691 0.0001565 0.1297896 -0.0156685 0.0001565 0.1297896 -0.0211078 0.0001565 0.1297896 -0.0279891 0.0001565 0.1297896 -0.036695 0.0001565 0.1297896 -0.047709 0.0001565 0.1297896 -0.0616432 0.0001565 0.1297896 -0.0792718 0.0001565 0.1297896 -0.1015742 0.0001565 0.1297896 -0.1297896 0.0001565 0.1297896 -0.1654858 0.0001565 0.1297896 -0.2106462 0.0001565 0.1297896 -0.2677799 0.0001565 0.1297896 -0.3400615 0.0001565 0.1297896 -0.4315072 0.0001565 0.1297896 -0.5471978 0.0001565 0.1297896 -0.6935614 0.0001565 0.1297896 -0.8394338 0.0050676 0.128178 -0.9028657 0.0277111 0.1296569 -0.9352348 0.0621943 0.1425052 -0.9544418 0.1057322 0.1673975 -0.9668714 0.1569971 0.2034818 -0.9753721 0.2148987 0.2493844 -0.9814076 0.2781701 0.3033679 -0.9858079 0.3452442 0.363381 -0.9890781 0.4142845 0.4271456 -0.9915433 0.4833171 0.4923039 -0.9934218 0.550415 0.5566061 -0.9948649 0.6138855 0.6180935 -0.9959804 0.6724135 0.6752381 -0.996847 0.7251351 0.7270098 -0.9975227 0.7716375 0.7728693 -0.9980511 0.8119009 0.8127032 -0.9984652 0.8462073 0.8467261 -0.9987904 0.8750412 0.8753745 -0.9990461 0.8989986 0.8992115 -0.9992474 0.9187148 0.9188503 -0.999406 0.9348135 0.9348994 -0.999531 0.9478743 0.9479286 -0.9996296 0.9584153 0.9584495 -0.9997074 0.9668869 0.9669084 -0.9997689 0.9736723 0.9736859 -0.9998174 0.9790925 0.979101 -0.9998557 0.9834128 0.9834182 -0.999886 0.9868504 0.9868538 -0.9999099 0.989582 0.9895841 -0.9999288 0.9917501 0.9917514 -0.9999437 0.9934695 0.9934703 -0.0000238 0.0044007 0.1327073 -0.0000382 0.0038972 0.1322038 -0.0000611 0.003265 0.1315716 -0.0000978 0.0024729 0.1307795 -0.0001565 0.001483 0.1297896 -0.0002504 0.0002504 0.128557 -0.0019287 0.0002504 0.128557 -0.004052 0.0002504 0.128557 -0.0067381 0.0002504 0.128557 -0.0101365 0.0002504 0.128557 -0.0144359 0.0002504 0.128557 -0.0198752 0.0002504 0.128557 -0.0267565 0.0002504 0.128557 -0.0354624 0.0002504 0.128557 -0.0464764 0.0002504 0.128557 -0.0604106 0.0002504 0.128557 -0.0780392 0.0002504 0.128557 -0.1003416 0.0002504 0.128557 -0.128557 0.0002504 0.128557 -0.1642532 0.0002504 0.128557 -0.2094136 0.0002504 0.128557 -0.2665473 0.0002504 0.128557 -0.3388289 0.0002504 0.128557 -0.4302746 0.0002504 0.128557 -0.5459652 0.0002504 0.128557 -0.6923288 0.0002504 0.128557 -0.8388802 0.0050694 0.1270229 -0.9026634 0.0276479 0.1286548 -0.9351449 0.0621069 0.1416707 -0.9543974 0.1056375 0.1667209 -0.9668479 0.156904 0.202944 -0.9753591 0.2148124 0.2489643 -0.9814002 0.2780936 0.3030452 -0.9858036 0.3451791 0.3631373 -0.9890755 0.4142311 0.4269646 -0.9915418 0.4832747 0.4921719 -0.9934209 0.5503825 0.5565115 -0.9948643 0.6138613 0.6180269 -0.9959801 0.6723959 0.675192 -0.9968468 0.7251226 0.7269784 -0.9975226 0.7716288 0.7728482 -0.998051 0.8118949 0.8126892 -0.9984652 0.8462034 0.8467168 -0.9987904 0.8750386 0.8753685 -0.9990461 0.8989969 0.8992076 -0.9992474 0.9187137 0.9188478 -0.9994059 0.9348128 0.9348978 -0.999531 0.9478738 0.9479276 -0.9996296 0.958415 0.9584489 -0.9997074 0.9668867 0.966908 -0.9997689 0.9736722 0.9736856 -0.9998174 0.9790925 0.9791009 -0.9998557 0.9834128 0.9834181 -0.999886 0.9868504 0.9868537 -0.9999099 0.9895819 0.989584 -0.9999288 0.9917501 0.9917514 -0.9999437 0.9934695 0.9934703 -0.0000238 0.006079 0.1327073 -0.0000382 0.0055755 0.1322038 -0.0000611 0.0049433 0.1315716 -0.0000978 0.0041512 0.1307795 -0.0001565 0.0031613 0.1297896 -0.0002504 0.0019287 0.128557 -0.0004008 0.0004008 0.1270291 -0.0025241 0.0004008 0.1270291 -0.0052103 0.0004008 0.1270291 -0.0086086 0.0004008 0.1270291 -0.012908 0.0004008 0.1270291 -0.0183473 0.0004008 0.1270291 -0.0252287 0.0004008 0.1270291 -0.0339345 0.0004008 0.1270291 -0.0449485 0.0004008 0.1270291 -0.0588827 0.0004008 0.1270291 -0.0765113 0.0004008 0.1270291 -0.0988137 0.0004008 0.1270291 -0.1270291 0.0004008 0.1270291 -0.1627254 0.0004008 0.1270291 -0.2078857 0.0004008 0.1270291 -0.2650195 0.0004008 0.1270291 -0.337301 0.0004008 0.1270291 -0.4287467 0.0004008 0.1270291 -0.5444373 0.0004008 0.1270291 -0.6908009 0.0004008 0.1270291 -0.8381886 0.0051048 0.1255887 -0.9024114 0.0275966 0.1274102 -0.9350332 0.0620199 0.1406344 -0.9543421 0.1055364 0.1658808 -0.9668187 0.1568008 0.2022765 -0.975343 0.2147144 0.2484431 -0.9813911 0.2780055 0.3026449 -0.9857982 0.3451032 0.3628349 -0.9890723 0.4141683 0.4267402 -0.9915399 0.4832246 0.4920083 -0.9934197 0.5503438 0.5563942 -0.9948636 0.6138323 0.6179443 -0.9959797 0.6723748 0.6751348 -0.9968465 0.7251076 0.7269394 -0.9975224 0.7716184 0.7728219 -0.9980509 0.8118878 0.8126718 -0.9984651 0.8461986 0.8467054 -0.9987903 0.8750355 0.875361 -0.9990461 0.8989948 0.8992028 -0.9992473 0.9187123 0.9188447 -0.9994059 0.9348119 0.9348958 -0.999531 0.9478733 0.9479263 -0.9996296 0.9584146 0.9584481 -0.9997074 0.9668865 0.9669075 -0.9997689 0.9736721 0.9736853 -0.9998174 0.9790924 0.9791007 -0.9998557 0.9834127 0.9834179 -0.999886 0.9868504 0.9868536 -0.9999099 0.9895819 0.989584 -0.9999288 0.99175 0.9917513 -0.9999437 0.9934695 0.9934703 -0.0000238 0.0082023 0.1327073 -0.0000382 0.0076988 0.1322038 -0.0000611 0.0070666 0.1315716 -0.0000978 0.0062744 0.1307795 -0.0001565 0.0052846 0.1297896 -0.0002504 0.004052 0.128557 -0.0004008 0.0025241 0.1270291 -0.0006416 0.0006416 0.1251466 -0.0033277 0.0006416 0.1251466 -0.0067261 0.0006416 0.1251466 -0.0110255 0.0006416 0.1251466 -0.0164648 0.0006416 0.1251466 -0.0233461 0.0006416 0.1251466 -0.032052 0.0006416 0.1251466 -0.043066 0.0006416 0.1251466 -0.0570002 0.0006416 0.1251466 -0.0746288 0.0006416 0.1251466 -0.0969312 0.0006416 0.1251466 -0.1251466 0.0006416 0.1251466 -0.1608428 0.0006416 0.1251466 -0.2060032 0.0006416 0.1251466 -0.2631369 0.0006416 0.1251466 -0.3354185 0.0006416 0.1251466 -0.4268641 0.0006416 0.1251466 -0.5425548 0.0006416 0.1251466 -0.6889184 0.0006416 0.1251466 -0.8373283 0.0052028 0.1238179 -0.9020992 0.0275778 0.1258729 -0.9348949 0.0619473 0.1393548 -0.9542739 0.1054384 0.1648439 -0.9667827 0.1566936 0.2014528 -0.9753231 0.2146085 0.2478 -0.9813797 0.2779077 0.3021511 -0.9857916 0.3450175 0.3624621 -0.9890684 0.4140964 0.4264635 -0.9915376 0.4831666 0.4918065 -0.9934183 0.5502987 0.5562497 -0.9948628 0.6137984 0.6178426 -0.9959791 0.67235 0.6750644 -0.9968462 0.7250899 0.7268913 -0.9975222 0.7716061 0.7727896 -0.9980508 0.8118794 0.8126503 -0.998465 0.8461929 0.8466913 -0.9987903 0.8750317 0.8753518 -0.999046 0.8989923 0.8991969 -0.9992473 0.9187107 0.9188409 -0.9994059 0.9348109 0.9348934 -0.999531 0.9478726 0.9479248 -0.9996296 0.9584142 0.9584471 -0.9997074 0.9668862 0.9669069 -0.9997689 0.9736719 0.9736849 -0.9998174 0.9790923 0.9791004 -0.9998557 0.9834127 0.9834178 -0.999886 0.9868503 0.9868535 -0.9999099 0.9895819 0.9895839 -0.9999288 0.99175 0.9917513 -0.9999437 0.9934694 0.9934702 -0.0000238 0.0108885 0.1327073 -0.0000382 0.0103849 0.1322038 -0.0000611 0.0097527 0.1315716 -0.0000978 0.0089606 0.1307795 -0.0001565 0.0079707 0.1297896 -0.0002504 0.0067381 0.128557 -0.0004008 0.0052103 0.1270291 -0.0006416 0.0033277 0.1251466 -0.0010268 0.0010268 0.1228457 -0.0044252 0.0010268 0.1228457 -0.0087246 0.0010268 0.1228457 -0.0141639 0.0010268 0.1228457 -0.0210452 0.0010268 0.1228457 -0.0297511 0.0010268 0.1228457 -0.0407651 0.0010268 0.1228457 -0.0546993 0.0010268 0.1228457 -0.0723279 0.0010268 0.1228457 -0.0946303 0.0010268 0.1228457 -0.1228457 0.0010268 0.1228457 -0.1585419 0.0010268 0.1228457 -0.2037023 0.0010268 0.1228457 -0.260836 0.0010268 0.1228457 -0.3331176 0.0010268 0.1228457 -0.4245633 0.0010268 0.1228457 -0.5402539 0.0010268 0.1228457 -0.6866175 0.0010268 0.1228457 -0.8362644 0.0054121 0.1216479 -0.9017148 0.0276281 0.1239883 -0.9347252 0.061916 0.1377865 -0.9541902 0.1053624 0.1635736 -0.9667385 0.1565954 0.2004442 -0.9752987 0.2145034 0.2470129 -0.9813659 0.2778058 0.3015469 -0.9857835 0.3449254 0.362006 -0.9890637 0.4140176 0.426125 -0.9915347 0.4831021 0.4915597 -0.9934166 0.550248 0.5560729 -0.9948617 0.6137599 0.6177181 -0.9959785 0.6723217 0.6749782 -0.9968458 0.7250697 0.7268325 -0.997522 0.7715919 0.7727501 -0.9980506 0.8118697 0.812624 -0.9984649 0.8461864 0.846674 -0.9987902 0.8750274 0.8753406 -0.999046 0.8989895 0.8991896 -0.9992473 0.9187089 0.9188362 -0.9994059 0.9348097 0.9348904 -0.999531 0.9478718 0.9479229 -0.9996296 0.9584137 0.9584459 -0.9997074 0.9668859 0.9669061 -0.9997689 0.9736717 0.9736844 -0.9998174 0.9790921 0.9791001 -0.9998557 0.9834126 0.9834176 -0.999886 0.9868503 0.9868534 -0.9999099 0.9895819 0.9895838 -0.9999288 0.99175 0.9917512 -0.9999437 0.9934694 0.9934702 -0.0000238 0.0142868 0.1327073 -0.0000382 0.0137833 0.1322038 -0.0000611 0.0131511 0.1315716 -0.0000978 0.012359 0.1307795 -0.0001565 0.0113691 0.1297896 -0.0002504 0.0101365 0.128557 -0.0004008 0.0086086 0.1270291 -0.0006416 0.0067261 0.1251466 -0.0010268 0.0044252 0.1228457 -0.0016435 0.0016435 0.120064 -0.0059429 0.0016435 0.120064 -0.0113822 0.0016435 0.120064 -0.0182636 0.0016435 0.120064 -0.0269694 0.0016435 0.120064 -0.0379834 0.0016435 0.120064 -0.0519176 0.0016435 0.120064 -0.0695462 0.0016435 0.120064 -0.0918486 0.0016435 0.120064 -0.120064 0.0016435 0.120064 -0.1557603 0.0016435 0.120064 -0.2009206 0.0016435 0.120064 -0.2580543 0.0016435 0.120064 -0.3303359 0.0016435 0.120064 -0.4217816 0.0016435 0.120064 -0.5374722 0.0016435 0.120064 -0.6838358 0.0016435 0.120064 -0.8349593 0.0058134 0.1190164 -0.9012461 0.0278105 0.1217016 -0.9345187 0.0619734 0.1358843 -0.9540886 0.1053433 0.1620336 -0.966685 0.1565315 0.199222 -0.9752692 0.2144168 0.2460594 -0.9813491 0.2777122 0.3008152 -0.9857738 0.3448353 0.3614538 -0.9890579 0.4139373 0.4257154 -0.9915312 0.4830346 0.4912611 -0.9934145 0.5501939 0.5558591 -0.9948604 0.6137183 0.6175676 -0.9959777 0.6722907 0.6748739 -0.9968453 0.7250473 0.7267615 -0.9975217 0.7715762 0.7727023 -0.9980504 0.8118589 0.8125923 -0.9984648 0.8461791 0.8466532 -0.9987902 0.8750225 0.875327 -0.9990459 0.8989863 0.8991809 -0.9992473 0.9187068 0.9188306 -0.9994059 0.9348083 0.9348868 -0.9995309 0.947871 0.9479206 -0.9996296 0.9584132 0.9584444 -0.9997074 0.9668855 0.9669052 -0.9997689 0.9736715 0.9736839 -0.9998174 0.979092 0.9790998 -0.9998557 0.9834125 0.9834174 -0.999886 0.9868502 0.9868533 -0.9999099 0.9895818 0.9895837 -0.9999288 0.99175 0.9917512 -0.9999437 0.9934694 0.9934702 -0.0000238 0.0185862 0.1327073 -0.0000382 0.0180827 0.1322038 -0.0000611 0.0174505 0.1315716 -0.0000978 0.0166583 0.1307795 -0.0001565 0.0156685 0.1297896 -0.0002504 0.0144359 0.128557 -0.0004008 0.012908 0.1270291 -0.0006416 0.0110255 0.1251466 -0.0010268 0.0087246 0.1228457 -0.0016435 0.0059429 0.120064 -0.0026305 0.0026305 0.1167517 -0.0080698 0.0026305 0.1167517 -0.0149512 0.0026305 0.1167517 -0.023657 0.0026305 0.1167517 -0.0346711 0.0026305 0.1167517 -0.0486053 0.0026305 0.1167517 -0.0662338 0.0026305 0.1167517 -0.0885362 0.0026305 0.1167517 -0.1167517 0.0026305 0.1167517 -0.1524479 0.0026305 0.1167517 -0.1976083 0.0026305 0.1167517 -0.254742 0.0026305 0.1167517 -0.3270236 0.0026305 0.1167517 -0.4184692 0.0026305 0.1167517 -0.5341598 0.0026305 0.1167517 -0.6805235 0.0026305 0.1167517 -0.8333779 0.0065402 0.1158715 -0.900682 0.0282324 0.1189666 -0.9342712 0.062202 0.1336102 -0.9539671 0.1054431 0.1601937 -0.9666211 0.1565473 0.1977627 -0.975234 0.2143816 0.2449216 -0.9813291 0.2776503 0.2999424 -0.9857621 0.3447636 0.3607953 -0.989051 0.4138668 0.425227 -0.9915271 0.4829718 0.4909052 -0.993412 0.5501416 0.5556042 -0.9948589 0.6136769 0.6173882 -0.9959768 0.6722594 0.6747498 -0.9968448 0.7250244 0.7266768 -0.9975213 0.7715599 0.7726454 -0.9980502 0.8118476 0.8125545 -0.9984647 0.8461714 0.8466283 -0.9987901 0.8750173 0.8753108 -0.9990459 0.8989829 0.8991704 -0.9992472 0.9187045 0.9188239 -0.9994059 0.9348069 0.9348825 -0.9995309 0.94787 0.9479179 -0.9996296 0.9584126 0.9584427 -0.9997074 0.9668852 0.9669041 -0.9997689 0.9736712 0.9736832 -0.9998174 0.9790919 0.9790993 -0.9998557 0.9834124 0.9834171 -0.999886 0.9868502 0.9868531 -0.9999099 0.9895818 0.9895836 -0.9999288 0.99175 0.9917511 -0.9999437 0.9934694 0.9934701 -0.0000238 0.0240255 0.1327073 -0.0000382 0.023522 0.1322038 -0.0000611 0.0228898 0.1315716 -0.0000978 0.0220976 0.1307795 -0.0001565 0.0211078 0.1297896 -0.0002504 0.0198752 0.128557 -0.0004008 0.0183473 0.1270291 -0.0006416 0.0164648 0.1251466 -0.0010268 0.0141639 0.1228457 -0.0016435 0.0113822 0.120064 -0.0026305 0.0080698 0.1167517 -0.0042103 0.0042103 0.1128922 -0.0110917 0.0042103 0.1128922 -0.0197975 0.0042103 0.1128922 -0.0308116 0.0042103 0.1128922 -0.0447458 0.0042103 0.1128922 -0.0623743 0.0042103 0.1128922 -0.0846767 0.0042103 0.1128922 -0.1128922 0.0042103 0.1128922 -0.1485884 0.0042103 0.1128922 -0.1937488 0.0042103 0.1128922 -0.2508825 0.0042103 0.1128922 -0.3231641 0.0042103 0.1128922 -0.4146097 0.0042103 0.1128922 -0.5303003 0.0042103 0.1128922 -0.676664 0.0042103 0.1128922 -0.8314967 0.0078103 0.1121916 -0.9000167 0.0290732 0.1157634 -0.9339805 0.062742 0.1309481 -0.9538247 0.1057683 0.1580414 -0.9665463 0.1567226 0.1960568 -0.9751928 0.2144566 0.2435923 -0.9813057 0.2776626 0.2989233 -0.9857485 0.3447407 0.3600267 -0.989043 0.4138277 0.4246572 -0.9915223 0.4829286 0.49049 -0.9934091 0.5501012 0.555307 -0.9948571 0.6136427 0.617179 -0.9959757 0.6722322 0.674605 -0.9968441 0.7250039 0.7265781 -0.9975209 0.7715449 0.772579 -0.99805 0.811837 0.8125104 -0.9984645 0.8461641 0.8465994 -0.99879 0.8750124 0.875292 -0.9990458 0.8989796 0.8991582 -0.9992472 0.9187024 0.918816 -0.9994059 0.9348055 0.9348775 -0.9995309 0.9478691 0.9479147 -0.9996296 0.958412 0.9584407 -0.9997074 0.9668848 0.9669029 -0.9997689 0.973671 0.9736824 -0.9998174 0.9790917 0.9790988 -0.9998557 0.9834123 0.9834168 -0.999886 0.9868501 0.9868529 -0.9999099 0.9895818 0.9895835 -0.9999288 0.9917499 0.991751 -0.9999437 0.9934694 0.9934701 -0.0000238 0.0309069 0.1327073 -0.0000382 0.0304033 0.1322038 -0.0000611 0.0297711 0.1315716 -0.0000978 0.028979 0.1307795 -0.0001565 0.0279891 0.1297896 -0.0002504 0.0267565 0.128557 -0.0004008 0.0252287 0.1270291 -0.0006416 0.0233461 0.1251466 -0.0010268 0.0210452 0.1228457 -0.0016435 0.0182636 0.120064 -0.0026305 0.0149512 0.1167517 -0.0042103 0.0110917 0.1128922 -0.0067388 0.0067388 0.1085393 -0.0154447 0.0067388 0.1085393 -0.0264587 0.0067388 0.1085393 -0.0403929 0.0067388 0.1085393 -0.0580214 0.0067388 0.1085393 -0.0803239 0.0067388 0.1085393 -0.1085393 0.0067388 0.1085393 -0.1442355 0.0067388 0.1085393 -0.1893959 0.0067388 0.1085393 -0.2465296 0.0067388 0.1085393 -0.3188112 0.0067388 0.1085393 -0.4102568 0.0067388 0.1085393 -0.5259474 0.0067388 0.1085393 -0.6723111 0.0067388 0.1085393 -0.8293233 0.0099781 0.1080217 -0.8992555 0.0306306 0.1121293 -0.9336494 0.0638283 0.1279297 -0.953663 0.1064997 0.1556031 -0.9664615 0.1571937 0.1941257 -0.9751462 0.2147432 0.2420885 -0.9812792 0.2778236 0.297771 -0.9857332 0.3448204 0.3591581 -0.9890339 0.4138582 0.4240134 -0.9915169 0.4829319 0.4900212 -0.9934058 0.5500915 0.5549714 -0.9948551 0.6136284 0.6169429 -0.9959745 0.672218 0.6744416 -0.9968433 0.7249916 0.7264667 -0.9975204 0.7715352 0.7725042 -0.9980497 0.8118298 0.8124607 -0.9984643 0.8461589 0.8465667 -0.9987899 0.8750088 0.8752707 -0.9990458 0.8989771 0.8991445 -0.9992472 0.9187008 0.9188072 -0.9994058 0.9348044 0.9348719 -0.9995309 0.9478684 0.9479111 -0.9996296 0.9584115 0.9584384 -0.9997074 0.9668845 0.9669014 -0.9997689 0.9736708 0.9736815 -0.9998174 0.9790916 0.9790983 -0.9998557 0.9834122 0.9834164 -0.999886 0.9868501 0.9868527 -0.9999099 0.9895817 0.9895834 -0.9999288 0.9917499 0.9917509 -0.9999437 0.9934694 0.99347 -0.0000238 0.0396127 0.1327073 -0.0000382 0.0391092 0.1322038 -0.0000611 0.038477 0.1315716 -0.0000978 0.0376849 0.1307795 -0.0001565 0.036695 0.1297896 -0.0002504 0.0354624 0.128557 -0.0004008 0.0339345 0.1270291 -0.0006416 0.032052 0.1251466 -0.0010268 0.0297511 0.1228457 -0.0016435 0.0269694 0.120064 -0.0026305 0.023657 0.1167517 -0.0042103 0.0197975 0.1128922 -0.0067388 0.0154447 0.1085393 -0.0107859 0.0107859 0.1038805 -0.0217999 0.0107859 0.1038805 -0.0357341 0.0107859 0.1038805 -0.0533626 0.0107859 0.1038805 -0.075665 0.0107859 0.1038805 -0.1038805 0.0107859 0.1038805 -0.1395767 0.0107859 0.1038805 -0.1847371 0.0107859 0.1038805 -0.2418708 0.0107859 0.1038805 -0.3141524 0.0107859 0.1038805 -0.405598 0.0107859 0.1038805 -0.5212886 0.0107859 0.1038805 -0.6676523 0.0107859 0.1038805 -0.8269342 0.0136166 0.1035362 -0.8984278 0.0333932 0.1082145 -0.9332914 0.0658501 0.12468 -0.9534887 0.1079385 0.1529804 -0.9663702 0.15819 0.1920504 -0.9750962 0.2154135 0.2404736 -0.9812508 0.2782606 0.2965343 -0.9857167 0.3450957 0.3582264 -0.9890241 0.4140252 0.4233232 -0.991511 0.4830292 0.4895186 -0.9934023 0.5501456 0.5546118 -0.994853 0.6136569 0.61669 -0.9959732 0.672232 0.6742666 -0.9968425 0.7249978 0.7263474 -0.9975199 0.7715376 0.772424 -0.9980494 0.8118303 0.8124075 -0.9984642 0.8461587 0.8465317 -0.9987897 0.8750084 0.875248 -0.9990457 0.8989767 0.8991298 -0.9992471 0.9187004 0.9187978 -0.9994058 0.9348042 0.9348659 -0.9995309 0.9478683 0.9479073 -0.9996295 0.9584114 0.958436 -0.9997074 0.9668844 0.9668999 -0.9997689 0.9736708 0.9736805 -0.9998174 0.9790916 0.9790977 -0.9998557 0.9834122 0.983416 -0.999886 0.98685 0.9868524 -0.9999099 0.9895817 0.9895832 -0.9999288 0.9917499 0.9917509 -0.9999437 0.9934694 0.99347 -0.0000238 0.0506267 0.1327073 -0.0000382 0.0501232 0.1322038 -0.0000611 0.049491 0.1315716 -0.0000978 0.0486989 0.1307795 -0.0001565 0.047709 0.1297896 -0.0002504 0.0464764 0.128557 -0.0004008 0.0449485 0.1270291 -0.0006416 0.043066 0.1251466 -0.0010268 0.0407651 0.1228457 -0.0016435 0.0379834 0.120064 -0.0026305 0.0346711 0.1167517 -0.0042103 0.0308116 0.1128922 -0.0067388 0.0264587 0.1085393 -0.0107859 0.0217999 0.1038805 -0.0172633 0.0172633 0.099344 -0.0311975 0.0172633 0.099344 -0.0488261 0.0172633 0.099344 -0.0711285 0.0172633 0.099344 -0.099344 0.0172633 0.099344 -0.1350402 0.0172633 0.099344 -0.1802005 0.0172633 0.099344 -0.2373343 0.0172633 0.099344 -0.3096159 0.0172633 0.099344 -0.4010615 0.0172633 0.099344 -0.5167521 0.0172633 0.099344 -0.6631157 0.0172633 0.099344 -0.8245426 0.0196467 0.0991468 -0.8976087 0.0381561 0.1043773 -0.9329391 0.0694453 0.1214966 -0.9533177 0.1105818 0.1504136 -0.9662809 0.160092 0.1900212 -0.9750472 0.2167545 0.2388957 -0.9812231 0.2791873 0.2953268 -0.9857006 0.3457234 0.3573171 -0.9890146 0.4144423 0.4226498 -0.9915054 0.4833013 0.4890285 -0.9933988 0.5503203 0.5542612 -0.9948509 0.6137675 0.6164434 -0.9959719 0.6723012 0.674096 -0.9968418 0.7250408 0.7262312 -0.9975194 0.7715641 0.7723459 -0.9980491 0.8118466 0.8123556 -0.998464 0.8461687 0.8464977 -0.9987896 0.8750145 0.8752258 -0.9990456 0.8989805 0.8991155 -0.9992471 0.9187027 0.9187886 -0.9994058 0.9348056 0.93486 -0.9995309 0.9478691 0.9479035 -0.9996295 0.958412 0.9584336 -0.9997074 0.9668847 0.9668984 -0.9997688 0.973671 0.9736796 -0.9998174 0.9790917 0.9790971 -0.9998557 0.9834123 0.9834157 -0.999886 0.9868501 0.9868522 -0.9999099 0.9895817 0.9895831 -0.9999288 0.9917499 0.9917508 -0.9999437 0.9934694 0.9934699 -0.0000238 0.0645609 0.1327073 -0.0000382 0.0640574 0.1322038 -0.0000611 0.0634252 0.1315716 -0.0000978 0.0626331 0.1307795 -0.0001565 0.0616432 0.1297896 -0.0002504 0.0604106 0.128557 -0.0004008 0.0588827 0.1270291 -0.0006416 0.0570002 0.1251466 -0.0010268 0.0546993 0.1228457 -0.0016435 0.0519176 0.120064 -0.0026305 0.0486053 0.1167517 -0.0042103 0.0447458 0.1128922 -0.0067388 0.0403929 0.1085393 -0.0107859 0.0357341 0.1038805 -0.0172633 0.0311975 0.099344 -0.0276309 0.0276309 0.0957773 -0.0452595 0.0276309 0.0957773 -0.0675619 0.0276309 0.0957773 -0.0957773 0.0276309 0.0957773 -0.1314736 0.0276309 0.0957773 -0.1766339 0.0276309 0.0957773 -0.2337676 0.0276309 0.0957773 -0.3060492 0.0276309 0.0957773 -0.3974949 0.0276309 0.0957773 -0.5131855 0.0276309 0.0957773 -0.6595491 0.0276309 0.0957773 -0.8226154 0.0295373 0.0956813 -0.8969554 0.0461985 0.1013429 -0.9326595 0.0756464 0.1189805 -0.9531823 0.1152388 0.1483866 -0.9662104 0.1635226 0.1884199 -0.9750086 0.2192389 0.2376515 -0.9812013 0.2809573 0.2943751 -0.9856879 0.3469645 0.3566008 -0.9890072 0.4152991 0.4221196 -0.9915009 0.4838841 0.4886426 -0.9933961 0.5507113 0.5539852 -0.9948493 0.6140266 0.6162494 -0.9959709 0.6724711 0.6739618 -0.9968411 0.7251511 0.7261398 -0.9975191 0.7716352 0.7722844 -0.9980488 0.8118921 0.8123148 -0.9984638 0.8461977 0.8464709 -0.9987895 0.8750329 0.8752084 -0.9990456 0.8989921 0.8991042 -0.999247 0.9187101 0.9187814 -0.9994057 0.9348102 0.9348554 -0.9995309 0.947872 0.9479006 -0.9996295 0.9584138 0.9584318 -0.9997074 0.9668859 0.9668972 -0.9997688 0.9736717 0.9736788 -0.9998174 0.9790921 0.9790966 -0.9998557 0.9834126 0.9834154 -0.999886 0.9868503 0.986852 -0.9999099 0.9895819 0.989583 -0.9999288 0.99175 0.9917507 -0.9999437 0.9934694 0.9934699 -0.0000238 0.0821895 0.1327073 -0.0000382 0.081686 0.1322038 -0.0000611 0.0810538 0.1315716 -0.0000978 0.0802616 0.1307795 -0.0001565 0.0792718 0.1297896 -0.0002504 0.0780392 0.128557 -0.0004008 0.0765113 0.1270291 -0.0006416 0.0746288 0.1251466 -0.0010268 0.0723279 0.1228457 -0.0016435 0.0695462 0.120064 -0.0026305 0.0662338 0.1167517 -0.0042103 0.0623743 0.1128922 -0.0067388 0.0580214 0.1085393 -0.0107859 0.0533626 0.1038805 -0.0172633 0.0488261 0.099344 -0.0276309 0.0452595 0.0957773 -0.0441188 0.0441188 0.0946366 -0.0664212 0.0441188 0.0946366 -0.0946366 0.0441188 0.0946366 -0.1303328 0.0441188 0.0946366 -0.1754932 0.0441188 0.0946366 -0.2326269 0.0441188 0.0946366 -0.3049085 0.0441188 0.0946366 -0.3963542 0.0441188 0.0946366 -0.5120448 0.0441188 0.0946366 -0.6584084 0.0441188 0.0946366 -0.8219901 0.0455041 0.0945703 -0.8967447 0.0594506 0.1003691 -0.9325696 0.0860209 0.1181733 -0.9531389 0.1231452 0.1477366 -0.9661878 0.1694384 0.1879067 -0.9749962 0.2235962 0.2372529 -0.9811943 0.2841192 0.2940703 -0.9856839 0.3492254 0.3563715 -0.9890048 0.4168922 0.4219498 -0.9914995 0.4849907 0.4885191 -0.9933953 0.5514695 0.5538969 -0.9948487 0.6145393 0.6161874 -0.9959706 0.6728136 0.6739188 -0.9968409 0.7253775 0.7261105 -0.9975189 0.7717834 0.7722648 -0.9980488 0.8119884 0.8123018 -0.9984638 0.8462598 0.8464623 -0.9987895 0.8750727 0.8752028 -0.9990455 0.8990175 0.8991006 -0.999247 0.9187262 0.9187791 -0.9994057 0.9348204 0.9348539 -0.9995308 0.9478785 0.9478997 -0.9996295 0.9584178 0.9584312 -0.9997074 0.9668884 0.9668969 -0.9997688 0.9736733 0.9736786 -0.9998174 0.9790931 0.9790965 -0.9998557 0.9834132 0.9834153 -0.999886 0.9868507 0.986852 -0.9999099 0.9895821 0.9895829 -0.9999288 0.9917502 0.9917507 -0.9999437 0.9934695 0.9934698 -0.0000238 0.1044919 0.1327073 -0.0000382 0.1039884 0.1322038 -0.0000611 0.1033562 0.1315716 -0.0000978 0.102564 0.1307795 -0.0001565 0.1015742 0.1297896 -0.0002504 0.1003416 0.128557 -0.0004008 0.0988137 0.1270291 -0.0006416 0.0969312 0.1251466 -0.0010268 0.0946303 0.1228457 -0.0016435 0.0918486 0.120064 -0.0026305 0.0885362 0.1167517 -0.0042103 0.0846767 0.1128922 -0.0067388 0.0803239 0.1085393 -0.0107859 0.075665 0.1038805 -0.0172633 0.0711285 0.099344 -0.0276309 0.0675619 0.0957773 -0.0441188 0.0664212 0.0946366 -0.0664212 0.0664212 0.0946366 -0.0946366 0.0664212 0.0946366 -0.1303328 0.0664212 0.0946366 -0.1754932 0.0664212 0.0946366 -0.2326269 0.0664212 0.0946366 -0.3049085 0.0664212 0.0946366 -0.3963542 0.0664212 0.0946366 -0.5120448 0.0664212 0.0946366 -0.6584084 0.0664212 0.0946366 -0.8219901 0.0671656 0.0945703 -0.8967447 0.0775151 0.1003691 -0.9325696 0.1002154 0.1181733 -0.9531389 0.1340017 0.1477366 -0.9661878 0.1775917 0.1879067 -0.9749962 0.2296253 0.2372529 -0.9811943 0.2885124 0.2940703 -0.9856839 0.3523802 0.3563715 -0.9890048 0.419125 0.4219498 -0.9914995 0.4865484 0.4885191 -0.9933953 0.5525411 0.5538969 -0.9948487 0.6152669 0.6161874 -0.9959706 0.6733015 0.6739188 -0.9968409 0.7257011 0.7261105 -0.9975189 0.7719959 0.7722648 -0.9980488 0.8121268 0.8123018 -0.9984638 0.8463492 0.8464623 -0.9987895 0.8751301 0.8752028 -0.9990455 0.8990542 0.8991006 -0.999247 0.9187495 0.9187791 -0.9994057 0.9348352 0.9348539 -0.9995308 0.9478878 0.9478997 -0.9996295 0.9584237 0.9584312 -0.9997074 0.9668922 0.9668969 -0.9997688 0.9736756 0.9736786 -0.9998174 0.9790946 0.9790965 -0.9998557 0.9834141 0.9834153 -0.999886 0.9868512 0.986852 -0.9999099 0.9895825 0.9895829 -0.9999288 0.9917504 0.9917507 -0.9999437 0.9934697 0.9934698 -0.0000238 0.1327073 0.1327073 -0.0000382 0.1322038 0.1322038 -0.0000611 0.1315716 0.1315716 -0.0000978 0.1307795 0.1307795 -0.0001565 0.1297896 0.1297896 -0.0002504 0.128557 0.128557 -0.0004008 0.1270291 0.1270291 -0.0006416 0.1251466 0.1251466 -0.0010268 0.1228457 0.1228457 -0.0016435 0.120064 0.120064 -0.0026305 0.1167517 0.1167517 -0.0042103 0.1128922 0.1128922 -0.0067388 0.1085393 0.1085393 -0.0107859 0.1038805 0.1038805 -0.0172633 0.099344 0.099344 -0.0276309 0.0957773 0.0957773 -0.0441188 0.0946366 0.0946366 -0.0664212 0.0946366 0.0946366 -0.0946366 0.0946366 0.0946366 -0.1303328 0.0946366 0.0946366 -0.1754932 0.0946366 0.0946366 -0.2326269 0.0946366 0.0946366 -0.3049085 0.0946366 0.0946366 -0.3963542 0.0946366 0.0946366 -0.5120448 0.0946366 0.0946366 -0.6584084 0.0946366 0.0946366 -0.8219901 0.0945703 0.0945703 -0.8967447 0.1003691 0.1003691 -0.9325696 0.1181733 0.1181733 -0.9531389 0.1477366 0.1477366 -0.9661878 0.1879067 0.1879067 -0.9749962 0.2372529 0.2372529 -0.9811943 0.2940703 0.2940703 -0.9856839 0.3563715 0.3563715 -0.9890048 0.4219498 0.4219498 -0.9914995 0.4885191 0.4885191 -0.9933953 0.5538969 0.5538969 -0.9948487 0.6161874 0.6161874 -0.9959706 0.6739188 0.6739188 -0.9968409 0.7261105 0.7261105 -0.9975189 0.7722648 0.7722648 -0.9980488 0.8123018 0.8123018 -0.9984638 0.8464623 0.8464623 -0.9987895 0.8752028 0.8752028 -0.9990455 0.8991006 0.8991006 -0.999247 0.9187791 0.9187791 -0.9994057 0.9348539 0.9348539 -0.9995308 0.9478997 0.9478997 -0.9996295 0.9584312 0.9584312 -0.9997074 0.9668969 0.9668969 -0.9997688 0.9736786 0.9736786 -0.9998174 0.9790965 0.9790965 -0.9998557 0.9834153 0.9834153 -0.999886 0.986852 0.986852 -0.9999099 0.9895829 0.9895829 -0.9999288 0.9917507 0.9917507 -0.9999437 0.9934698 0.9934698 -0.0000238 0.1684036 0.1327073 -0.0000382 0.1679 0.1322038 -0.0000611 0.1672678 0.1315716 -0.0000978 0.1664757 0.1307795 -0.0001565 0.1654858 0.1297896 -0.0002504 0.1642532 0.128557 -0.0004008 0.1627254 0.1270291 -0.0006416 0.1608428 0.1251466 -0.0010268 0.1585419 0.1228457 -0.0016435 0.1557603 0.120064 -0.0026305 0.1524479 0.1167517 -0.0042103 0.1485884 0.1128922 -0.0067388 0.1442355 0.1085393 -0.0107859 0.1395767 0.1038805 -0.0172633 0.1350402 0.099344 -0.0276309 0.1314736 0.0957773 -0.0441188 0.1303328 0.0946366 -0.0664212 0.1303328 0.0946366 -0.0946366 0.1303328 0.0946366 -0.1303328 0.1303328 0.0946366 -0.1754932 0.1303328 0.0946366 -0.2326269 0.1303328 0.0946366 -0.3049085 0.1303328 0.0946366 -0.3963542 0.1303328 0.0946366 -0.5120448 0.1303328 0.0946366 -0.6584084 0.1303328 0.0946366 -0.8219901 0.1292408 0.0945703 -0.8967447 0.1292823 0.1003691 -0.9325696 0.1408925 0.1181733 -0.9531389 0.1651131 0.1477366 -0.9661878 0.2009566 0.1879067 -0.9749962 0.2469027 0.2372529 -0.9811943 0.3011018 0.2940703 -0.9856839 0.3614209 0.3563715 -0.9890048 0.4255236 0.4219498 -0.9914995 0.4910123 0.4885191 -0.9933953 0.5556122 0.5538969 -0.9948487 0.6173519 0.6161874 -0.9959706 0.6746998 0.6739188 -0.9968409 0.7266285 0.7261105 -0.9975189 0.7726049 0.7722648 -0.9980488 0.8125232 0.8123018 -0.9984638 0.8466054 0.8464623 -0.9987895 0.8752947 0.8752028 -0.9990455 0.8991593 0.8991006 -0.999247 0.9188164 0.9187791 -0.9994057 0.9348776 0.9348539 -0.9995308 0.9479146 0.9478997 -0.9996295 0.9584406 0.9584312 -0.9997074 0.9669028 0.9668969 -0.9997688 0.9736823 0.9736786 -0.9998174 0.9790988 0.9790965 -0.9998557 0.9834167 0.9834153 -0.999886 0.9868529 0.986852 -0.9999099 0.9895835 0.9895829 -0.9999288 0.991751 0.9917507 -0.9999437 0.9934701 0.9934698 -0.0000238 0.2135639 0.1327073 -0.0000382 0.2130604 0.1322038 -0.0000611 0.2124282 0.1315716 -0.0000978 0.2116361 0.1307795 -0.0001565 0.2106462 0.1297896 -0.0002504 0.2094136 0.128557 -0.0004008 0.2078857 0.1270291 -0.0006416 0.2060032 0.1251466 -0.0010268 0.2037023 0.1228457 -0.0016435 0.2009206 0.120064 -0.0026305 0.1976083 0.1167517 -0.0042103 0.1937488 0.1128922 -0.0067388 0.1893959 0.1085393 -0.0107859 0.1847371 0.1038805 -0.0172633 0.1802005 0.099344 -0.0276309 0.1766339 0.0957773 -0.0441188 0.1754932 0.0946366 -0.0664212 0.1754932 0.0946366 -0.0946366 0.1754932 0.0946366 -0.1303328 0.1754932 0.0946366 -0.1754932 0.1754932 0.0946366 -0.2326269 0.1754932 0.0946366 -0.3049085 0.1754932 0.0946366 -0.3963542 0.1754932 0.0946366 -0.5120448 0.1754932 0.0946366 -0.6584084 0.1754932 0.0946366 -0.8219901 0.1731034 0.0945703 -0.8967447 0.1658613 0.1003691 -0.9325696 0.1696351 0.1181733 -0.9531389 0.1870965 0.1477366 -0.9661878 0.2174663 0.1879067 -0.9749962 0.2591111 0.2372529 -0.9811943 0.3099976 0.2940703 -0.9856839 0.3678092 0.3563715 -0.9890048 0.4300448 0.4219498 -0.9914995 0.4941665 0.4885191 -0.9933953 0.5577822 0.5538969 -0.9948487 0.6188252 0.6161874 -0.9959706 0.6756878 0.6739188 -0.9968409 0.7272837 0.7261105 -0.9975189 0.7730352 0.7722648 -0.9980488 0.8128033 0.8123018 -0.9984638 0.8467864 0.8464623 -0.9987895 0.8754109 0.8752028 -0.9990455 0.8992336 0.8991006 -0.999247 0.9188636 0.9187791 -0.9994057 0.9349075 0.9348539 -0.9995308 0.9479335 0.9478997 -0.9996295 0.9584526 0.9584312 -0.9997074 0.9669103 0.9668969 -0.9997688 0.973687 0.9736786 -0.9998174 0.9791018 0.9790965 -0.9998557 0.9834186 0.9834153 -0.999886 0.9868541 0.986852 -0.9999099 0.9895842 0.9895829 -0.9999288 0.9917515 0.9917507 -0.9999437 0.9934704 0.9934698 -0.0000238 0.2706977 0.1327073 -0.0000382 0.2701941 0.1322038 -0.0000611 0.2695619 0.1315716 -0.0000978 0.2687698 0.1307795 -0.0001565 0.2677799 0.1297896 -0.0002504 0.2665473 0.128557 -0.0004008 0.2650195 0.1270291 -0.0006416 0.2631369 0.1251466 -0.0010268 0.260836 0.1228457 -0.0016435 0.2580543 0.120064 -0.0026305 0.254742 0.1167517 -0.0042103 0.2508825 0.1128922 -0.0067388 0.2465296 0.1085393 -0.0107859 0.2418708 0.1038805 -0.0172633 0.2373343 0.099344 -0.0276309 0.2337676 0.0957773 -0.0441188 0.2326269 0.0946366 -0.0664212 0.2326269 0.0946366 -0.0946366 0.2326269 0.0946366 -0.1303328 0.2326269 0.0946366 -0.1754932 0.2326269 0.0946366 -0.2326269 0.2326269 0.0946366 -0.3049085 0.2326269 0.0946366 -0.3963542 0.2326269 0.0946366 -0.5120448 0.2326269 0.0946366 -0.6584084 0.2326269 0.0946366 -0.8219901 0.2285954 0.0945703 -0.8967447 0.2121385 0.1003691 -0.9325696 0.2059983 0.1181733 -0.9531389 0.2149085 0.1477366 -0.9661878 0.2383533 0.1879067 -0.9749962 0.2745562 0.2372529 -0.9811943 0.3212519 0.2940703 -0.9856839 0.3758911 0.3563715 -0.9890048 0.4357648 0.4219498 -0.9914995 0.498157 0.4885191 -0.9933953 0.5605276 0.5538969 -0.9948487 0.6206891 0.6161874 -0.9959706 0.6769378 0.6739188 -0.9968409 0.7281127 0.7261105 -0.9975189 0.7735795 0.7722648 -0.9980488 0.8131577 0.8123018 -0.9984638 0.8470154 0.8464623 -0.9987895 0.875558 0.8752028 -0.9990455 0.8993275 0.8991006 -0.999247 0.9189234 0.9187791 -0.9994057 0.9349454 0.9348539 -0.9995308 0.9479575 0.9478997 -0.9996295 0.9584677 0.9584312 -0.9997074 0.9669198 0.9668969 -0.9997688 0.973693 0.9736786 -0.9998174 0.9791055 0.9790965 -0.9998557 0.9834209 0.9834153 -0.999886 0.9868555 0.986852 -0.9999099 0.9895851 0.9895829 -0.9999288 0.9917521 0.9917507 -0.9999437 0.9934707 0.9934698 -0.0000238 0.3429792 0.1327073 -0.0000382 0.3424757 0.1322038 -0.0000611 0.3418435 0.1315716 -0.0000978 0.3410514 0.1307795 -0.0001565 0.3400615 0.1297896 -0.0002504 0.3388289 0.128557 -0.0004008 0.337301 0.1270291 -0.0006416 0.3354185 0.1251466 -0.0010268 0.3331176 0.1228457 -0.0016435 0.3303359 0.120064 -0.0026305 0.3270236 0.1167517 -0.0042103 0.3231641 0.1128922 -0.0067388 0.3188112 0.1085393 -0.0107859 0.3141524 0.1038805 -0.0172633 0.3096159 0.099344 -0.0276309 0.3060492 0.0957773 -0.0441188 0.3049085 0.0946366 -0.0664212 0.3049085 0.0946366 -0.0946366 0.3049085 0.0946366 -0.1303328 0.3049085 0.0946366 -0.1754932 0.3049085 0.0946366 -0.2326269 0.3049085 0.0946366 -0.3049085 0.3049085 0.0946366 -0.3963542 0.3049085 0.0946366 -0.5120448 0.3049085 0.0946366 -0.6584084 0.3049085 0.0946366 -0.8219901 0.2988 0.0945703 -0.8967447 0.2706852 0.1003691 -0.9325696 0.2520025 0.1181733 -0.9531389 0.2500942 0.1477366 -0.9661878 0.2647781 0.1879067 -0.9749962 0.2940963 0.2372529 -0.9811943 0.3354901 0.2940703 -0.9856839 0.3861159 0.3563715 -0.9890048 0.4430013 0.4219498 -0.9914995 0.5032055 0.4885191 -0.9933953 0.5640008 0.5538969 -0.9948487 0.6230471 0.6161874 -0.9959706 0.6785192 0.6739188 -0.9968409 0.7291615 0.7261105 -0.9975189 0.7742682 0.7722648 -0.9980488 0.8136061 0.8123018 -0.9984638 0.8473052 0.8464623 -0.9987895 0.8757441 0.8752028 -0.9990455 0.8994464 0.8991006 -0.999247 0.918999 0.9187791 -0.9994057 0.9349933 0.9348539 -0.9995308 0.9479878 0.9478997 -0.9996295 0.9584868 0.9584312 -0.9997074 0.9669318 0.9668969 -0.9997688 0.9737006 0.9736786 -0.9998174 0.9791103 0.9790965 -0.9998557 0.9834239 0.9834153 -0.999886 0.9868574 0.986852 -0.9999099 0.9895863 0.9895829 -0.9999288 0.9917528 0.9917507 -0.9999437 0.9934712 0.9934698 -0.0000238 0.4344249 0.1327073 -0.0000382 0.4339214 0.1322038 -0.0000611 0.4332891 0.1315716 -0.0000978 0.432497 0.1307795 -0.0001565 0.4315072 0.1297896 -0.0002504 0.4302746 0.128557 -0.0004008 0.4287467 0.1270291 -0.0006416 0.4268641 0.1251466 -0.0010268 0.4245633 0.1228457 -0.0016435 0.4217816 0.120064 -0.0026305 0.4184692 0.1167517 -0.0042103 0.4146097 0.1128922 -0.0067388 0.4102568 0.1085393 -0.0107859 0.405598 0.1038805 -0.0172633 0.4010615 0.099344 -0.0276309 0.3974949 0.0957773 -0.0441188 0.3963542 0.0946366 -0.0664212 0.3963542 0.0946366 -0.0946366 0.3963542 0.0946366 -0.1303328 0.3963542 0.0946366 -0.1754932 0.3963542 0.0946366 -0.2326269 0.3963542 0.0946366 -0.3049085 0.3963542 0.0946366 -0.3963542 0.3963542 0.0946366 -0.5120448 0.3963542 0.0946366 -0.6584084 0.3963542 0.0946366 -0.8219901 0.3876179 0.0945703 -0.8967447 0.3447543 0.1003691 -0.9325696 0.3102037 0.1181733 -0.9531389 0.2946088 0.1477366 -0.9661878 0.2982089 0.1879067 -0.9749962 0.3188171 0.2372529 -0.9811943 0.3535032 0.2940703 -0.9856839 0.3990515 0.3563715 -0.9890048 0.4521565 0.4219498 -0.9914995 0.5095925 0.4885191 -0.9933953 0.5683949 0.5538969 -0.9948487 0.6260304 0.6161874 -0.9959706 0.6805199 0.6739188 -0.9968409 0.7304884 0.7261105 -0.9975189 0.7751395 0.7722648 -0.9980488 0.8141733 0.8123018 -0.9984638 0.8476717 0.8464623 -0.9987895 0.8759795 0.8752028 -0.9990455 0.8995968 0.8991006 -0.999247 0.9190947 0.9187791 -0.9994057 0.935054 0.9348539 -0.9995308 0.9480261 0.9478997 -0.9996295 0.9585109 0.9584312 -0.9997074 0.966947 0.9668969 -0.9997688 0.9737101 0.9736786 -0.9998174 0.9791163 0.9790965 -0.9998557 0.9834277 0.9834153 -0.999886 0.9868597 0.986852 -0.9999099 0.9895878 0.9895829 -0.9999288 0.9917537 0.9917507 -0.9999437 0.9934718 0.9934698 -0.0000238 0.5501155 0.1327073 -0.0000382 0.549612 0.1322038 -0.0000611 0.5489798 0.1315716 -0.0000978 0.5481876 0.1307795 -0.0001565 0.5471978 0.1297896 -0.0002504 0.5459652 0.128557 -0.0004008 0.5444373 0.1270291 -0.0006416 0.5425548 0.1251466 -0.0010268 0.5402539 0.1228457 -0.0016435 0.5374722 0.120064 -0.0026305 0.5341598 0.1167517 -0.0042103 0.5303003 0.1128922 -0.0067388 0.5259474 0.1085393 -0.0107859 0.5212886 0.1038805 -0.0172633 0.5167521 0.099344 -0.0276309 0.5131855 0.0957773 -0.0441188 0.5120448 0.0946366 -0.0664212 0.5120448 0.0946366 -0.0946366 0.5120448 0.0946366 -0.1303328 0.5120448 0.0946366 -0.1754932 0.5120448 0.0946366 -0.2326269 0.5120448 0.0946366 -0.3049085 0.5120448 0.0946366 -0.3963542 0.5120448 0.0946366 -0.5120448 0.5120448 0.0946366 -0.6584084 0.5120448 0.0946366 -0.8219901 0.4999841 0.0945703 -0.8967447 0.4384614 0.1003691 -0.9325696 0.3838358 0.1181733 -0.9531389 0.3509254 0.1477366 -0.9661878 0.3405032 0.1879067 -0.9749962 0.3500921 0.2372529 -0.9811943 0.3762922 0.2940703 -0.9856839 0.4154167 0.3563715 -0.9890048 0.4637389 0.4219498 -0.9914995 0.5176729 0.4885191 -0.9933953 0.573954 0.5538969 -0.9948487 0.6298046 0.6161874 -0.9959706 0.683051 0.6739188 -0.9968409 0.732167 0.7261105 -0.9975189 0.7762418 0.7722648 -0.9980488 0.8148909 0.8123018 -0.9984638 0.8481355 0.8464623 -0.9987895 0.8762773 0.8752028 -0.9990455 0.899787 0.8991006 -0.999247 0.9192157 0.9187791 -0.9994057 0.9351307 0.9348539 -0.9995308 0.9480746 0.9478997 -0.9996295 0.9585415 0.9584312 -0.9997074 0.9669663 0.9668969 -0.9997688 0.9737222 0.9736786 -0.9998174 0.9791238 0.9790965 -0.9998557 0.9834324 0.9834153 -0.999886 0.9868627 0.986852 -0.9999099 0.9895897 0.9895829 -0.9999288 0.9917549 0.9917507 -0.9999437 0.9934725 0.9934698 -0.0000238 0.6964791 0.1327073 -0.0000382 0.6959756 0.1322038 -0.0000611 0.6953434 0.1315716 -0.0000978 0.6945513 0.1307795 -0.0001565 0.6935614 0.1297896 -0.0002504 0.6923288 0.128557 -0.0004008 0.6908009 0.1270291 -0.0006416 0.6889184 0.1251466 -0.0010268 0.6866175 0.1228457 -0.0016435 0.6838358 0.120064 -0.0026305 0.6805235 0.1167517 -0.0042103 0.676664 0.1128922 -0.0067388 0.6723111 0.1085393 -0.0107859 0.6676523 0.1038805 -0.0172633 0.6631157 0.099344 -0.0276309 0.6595491 0.0957773 -0.0441188 0.6584084 0.0946366 -0.0664212 0.6584084 0.0946366 -0.0946366 0.6584084 0.0946366 -0.1303328 0.6584084 0.0946366 -0.1754932 0.6584084 0.0946366 -0.2326269 0.6584084 0.0946366 -0.3049085 0.6584084 0.0946366 -0.3963542 0.6584084 0.0946366 -0.5120448 0.6584084 0.0946366 -0.6584084 0.6584084 0.0946366 -0.8219901 0.6421419 0.0945703 -0.8967447 0.557013 0.1003691 -0.9325696 0.4769901 0.1181733 -0.9531389 0.4221733 0.1477366 -0.9661878 0.3940109 0.1879067 -0.9749962 0.389659 0.2372529 -0.9811943 0.4051232 0.2940703 -0.9856839 0.4361208 0.3563715 -0.9890048 0.4783922 0.4219498 -0.9914995 0.5278957 0.4885191 -0.9933953 0.580987 0.5538969 -0.9948487 0.6345795 0.6161874 -0.9959706 0.6862532 0.6739188 -0.9968409 0.7342907 0.7261105 -0.9975189 0.7776364 0.7722648 -0.9980488 0.8157988 0.8123018 -0.9984638 0.8487222 0.8464623 -0.9987895 0.8766541 0.8752028 -0.9990455 0.9000277 0.8991006 -0.999247 0.9193688 0.9187791 -0.9994057 0.9352277 0.9348539 -0.9995308 0.9481359 0.9478997 -0.9996295 0.9585802 0.9584312 -0.9997074 0.9669906 0.9668969 -0.9997688 0.9737375 0.9736786 -0.9998174 0.9791334 0.9790965 -0.9998557 0.9834385 0.9834153 -0.999886 0.9868665 0.986852 -0.9999099 0.989592 0.9895829 -0.9999288 0.9917564 0.9917507 -0.9999437 0.9934734 0.9934698 -0.0051514 0.8407292 0.1309049 -0.0051286 0.8405071 0.1304351 -0.0051047 0.8402274 0.1298447 -0.0050826 0.8398756 0.1291042 -0.0050676 0.8394338 0.128178 -0.0050694 0.8388802 0.1270229 -0.0051048 0.8381886 0.1255887 -0.0052028 0.8373283 0.1238179 -0.0054121 0.8362644 0.1216479 -0.0058134 0.8349593 0.1190164 -0.0065402 0.8333779 0.1158715 -0.0078103 0.8314967 0.1121916 -0.0099781 0.8293233 0.1080217 -0.0136166 0.8269342 0.1035362 -0.0196467 0.8245426 0.0991468 -0.0295373 0.8226154 0.0956813 -0.0455041 0.8219901 0.0945703 -0.0671656 0.8219901 0.0945703 -0.0945703 0.8219901 0.0945703 -0.1292408 0.8219901 0.0945703 -0.1731034 0.8219901 0.0945703 -0.2285954 0.8219901 0.0945703 -0.2988 0.8219901 0.0945703 -0.3876179 0.8219901 0.0945703 -0.4999841 0.8219901 0.0945703 -0.6421419 0.8219901 0.0945703 -0.8219901 0.8219901 0.0945703 -0.8967447 0.7069963 0.1003691 -0.9325696 0.5948423 0.1181733 -0.9531389 0.5123112 0.1477366 -0.9661878 0.4617052 0.1879067 -0.9749962 0.4397163 0.2372529 -0.9811943 0.4415982 0.2940703 -0.9856839 0.4623142 0.3563715 -0.9890048 0.4969305 0.4219498 -0.9914995 0.5408288 0.4885191 -0.9933953 0.5898847 0.5538969 -0.9948487 0.6406203 0.6161874 -0.9959706 0.6903044 0.6739188 -0.9968409 0.7369774 0.7261105 -0.9975189 0.7794007 0.7722648 -0.9980488 0.8169474 0.8123018 -0.9984638 0.8494644 0.8464623 -0.9987895 0.8771307 0.8752028 -0.9990455 0.9003323 0.8991006 -0.999247 0.9195625 0.9187791 -0.9994057 0.9353505 0.9348539 -0.9995308 0.9482135 0.9478997 -0.9996295 0.9586291 0.9584312 -0.9997074 0.9670214 0.9668969 -0.9997688 0.9737569 0.9736786 -0.9998174 0.9791456 0.9790965 -0.9998557 0.9834461 0.9834153 -0.999886 0.9868713 0.986852 -0.9999099 0.989595 0.9895829 -0.9999288 0.9917582 0.9917507 -0.9999437 0.9934746 0.9934698 -0.0279321 0.9033413 0.1320218 -0.0278872 0.9032596 0.1316144 -0.0278347 0.9031567 0.1311024 -0.0277752 0.9030276 0.1304603 -0.0277111 0.9028657 0.1296569 -0.0276479 0.9026634 0.1286548 -0.0275966 0.9024114 0.1274102 -0.0275778 0.9020992 0.1258729 -0.0276281 0.9017148 0.1239883 -0.0278105 0.9012461 0.1217016 -0.0282324 0.900682 0.1189666 -0.0290732 0.9000167 0.1157634 -0.0306306 0.8992555 0.1121293 -0.0333932 0.8984278 0.1082145 -0.0381561 0.8976087 0.1043773 -0.0461985 0.8969554 0.1013429 -0.0594506 0.8967447 0.1003691 -0.0775151 0.8967447 0.1003691 -0.1003691 0.8967447 0.1003691 -0.1292823 0.8967447 0.1003691 -0.1658613 0.8967447 0.1003691 -0.2121385 0.8967447 0.1003691 -0.2706852 0.8967447 0.1003691 -0.3447543 0.8967447 0.1003691 -0.4384614 0.8967447 0.1003691 -0.557013 0.8967447 0.1003691 -0.7069963 0.8967447 0.1003691 -0.8967447 0.8967447 0.1003691 -0.9325696 0.7439407 0.1181733 -0.9531389 0.6263473 0.1477366 -0.9661878 0.5473473 0.1879067 -0.9749962 0.5030453 0.2372529 -0.9811943 0.4877437 0.2940703 -0.9856839 0.4954523 0.3563715 -0.9890048 0.5203839 0.4219498 -0.9914995 0.5571908 0.4885191 -0.9933953 0.6011414 0.5538969 -0.9948487 0.6482627 0.6161874 -0.9959706 0.6954296 0.6739188 -0.9968409 0.7403765 0.7261105 -0.9975189 0.7816327 0.7722648 -0.9980488 0.8184005 0.8123018 -0.9984638 0.8504035 0.8464623 -0.9987895 0.8777338 0.8752028 -0.9990455 0.9007175 0.8991006 -0.999247 0.9198076 0.9187791 -0.9994057 0.9355059 0.9348539 -0.9995308 0.9483117 0.9478997 -0.9996295 0.958691 0.9584312 -0.9997074 0.9670604 0.9668969 -0.9997688 0.9737814 0.9736786 -0.9998174 0.979161 0.9790965 -0.9998557 0.9834557 0.9834153 -0.999886 0.9868773 0.986852 -0.9999099 0.9895988 0.9895829 -0.9999288 0.9917606 0.9917507 -0.9999437 0.9934761 0.9934698 -0.0624569 0.9354466 0.1444753 -0.0624063 0.9354101 0.1441359 -0.0623458 0.9353643 0.1437093 -0.0622749 0.9353068 0.1431744 -0.0621943 0.9352348 0.1425052 -0.0621069 0.9351449 0.1416707 -0.0620199 0.9350332 0.1406344 -0.0619473 0.9348949 0.1393548 -0.061916 0.9347252 0.1377865 -0.0619734 0.9345187 0.1358843 -0.062202 0.9342712 0.1336102 -0.062742 0.9339805 0.1309481 -0.0638283 0.9336494 0.1279297 -0.0658501 0.9332914 0.12468 -0.0694453 0.9329391 0.1214966 -0.0756464 0.9326595 0.1189805 -0.0860209 0.9325696 0.1181733 -0.1002154 0.9325696 0.1181733 -0.1181733 0.9325696 0.1181733 -0.1408925 0.9325696 0.1181733 -0.1696351 0.9325696 0.1181733 -0.2059983 0.9325696 0.1181733 -0.2520025 0.9325696 0.1181733 -0.3102037 0.9325696 0.1181733 -0.3838358 0.9325696 0.1181733 -0.4769901 0.9325696 0.1181733 -0.5948423 0.9325696 0.1181733 -0.7439407 0.9325696 0.1181733 -0.9325696 0.9325696 0.1181733 -0.9531389 0.7706179 0.1477366 -0.9661878 0.6556956 0.1879067 -0.9749962 0.5831647 0.2372529 -0.9811943 0.5461239 0.2940703 -0.9856839 0.5373763 0.3563715 -0.9890048 0.5500554 0.4219498 -0.9914995 0.577891 0.4885191 -0.9933953 0.6153825 0.5538969 -0.9948487 0.6579314 0.6161874 -0.9959706 0.7019138 0.6739188 -0.9968409 0.7446768 0.7261105 -0.9975189 0.7844566 0.7722648 -0.9980488 0.8202389 0.8123018 -0.9984638 0.8515915 0.8464623 -0.9987895 0.8784967 0.8752028 -0.9990455 0.9012049 0.8991006 -0.999247 0.9201176 0.9187791 -0.9994057 0.9357024 0.9348539 -0.9995308 0.9484359 0.9478997 -0.9996295 0.9587693 0.9584312 -0.9997074 0.9671097 0.9668969 -0.9997688 0.9738123 0.9736786 -0.9998174 0.9791804 0.9790965 -0.9998557 0.9834679 0.9834153 -0.999886 0.986885 0.986852 -0.9999099 0.9896036 0.9895829 -0.9999288 0.9917636 0.9917507 -0.9999437 0.9934779 0.9934698 -0.1059991 0.9545467 0.1689957 -0.1059489 0.9545286 0.1687203 -0.1058883 0.9545059 0.1683742 -0.1058162 0.9544774 0.1679403 -0.1057322 0.9544418 0.1673975 -0.1056375 0.9543974 0.1667209 -0.1055364 0.9543421 0.1658808 -0.1054384 0.9542739 0.1648439 -0.1053624 0.9541902 0.1635736 -0.1053433 0.9540886 0.1620336 -0.1054431 0.9539671 0.1601937 -0.1057683 0.9538247 0.1580414 -0.1064997 0.953663 0.1556031 -0.1079385 0.9534887 0.1529804 -0.1105818 0.9533177 0.1504136 -0.1152388 0.9531823 0.1483866 -0.1231452 0.9531389 0.1477366 -0.1340017 0.9531389 0.1477366 -0.1477366 0.9531389 0.1477366 -0.1651131 0.9531389 0.1477366 -0.1870965 0.9531389 0.1477366 -0.2149085 0.9531389 0.1477366 -0.2500942 0.9531389 0.1477366 -0.2946088 0.9531389 0.1477366 -0.3509254 0.9531389 0.1477366 -0.4221733 0.9531389 0.1477366 -0.5123112 0.9531389 0.1477366 -0.6263473 0.9531389 0.1477366 -0.7706179 0.9531389 0.1477366 -0.9531389 0.9531389 0.1477366 -0.9661878 0.7927704 0.1879067 -0.9749962 0.6845262 0.2372529 -0.9811943 0.6199824 0.2940703 -0.9856839 0.5904156 0.3563715 -0.9890048 0.5875938 0.4219498 -0.9914995 0.6040793 0.4885191 -0.9933953 0.6333995 0.5538969 -0.9948487 0.6701635 0.6161874 -0.9959706 0.710117 0.6739188 -0.9968409 0.7501172 0.7261105 -0.9975189 0.7880291 0.7722648 -0.9980488 0.8225647 0.8123018 -0.9984638 0.8530945 0.8464623 -0.9987895 0.8794619 0.8752028 -0.9990455 0.9018215 0.8991006 -0.999247 0.9205098 0.9187791 -0.9994057 0.935951 0.9348539 -0.9995308 0.9485931 0.9478997 -0.9996295 0.9588684 0.9584312 -0.9997074 0.967172 0.9668969 -0.9997688 0.9738515 0.9736786 -0.9998174 0.979205 0.9790965 -0.9998557 0.9834833 0.9834153 -0.999886 0.9868946 0.986852 -0.9999099 0.9896096 0.9895829 -0.9999288 0.9917674 0.9917507 -0.9999437 0.9934803 0.9934698 -0.1572498 0.9669269 0.2047525 -0.1572031 0.9669173 0.2045334 -0.1571463 0.9669053 0.2042583 -0.1570779 0.9668902 0.2039133 -0.1569971 0.9668714 0.2034818 -0.156904 0.9668479 0.202944 -0.1568008 0.9668187 0.2022765 -0.1566936 0.9667827 0.2014528 -0.1565954 0.9667385 0.2004442 -0.1565315 0.966685 0.199222 -0.1565473 0.9666211 0.1977627 -0.1567226 0.9665463 0.1960568 -0.1571937 0.9664615 0.1941257 -0.15819 0.9663702 0.1920504 -0.160092 0.9662809 0.1900212 -0.1635226 0.9662104 0.1884199 -0.1694384 0.9661878 0.1879067 -0.1775917 0.9661878 0.1879067 -0.1879067 0.9661878 0.1879067 -0.2009566 0.9661878 0.1879067 -0.2174663 0.9661878 0.1879067 -0.2383533 0.9661878 0.1879067 -0.2647781 0.9661878 0.1879067 -0.2982089 0.9661878 0.1879067 -0.3405032 0.9661878 0.1879067 -0.3940109 0.9661878 0.1879067 -0.4617052 0.9661878 0.1879067 -0.5473473 0.9661878 0.1879067 -0.6556956 0.9661878 0.1879067 -0.7927704 0.9661878 0.1879067 -0.9661878 0.9661878 0.1879067 -0.9749962 0.8127617 0.2372529 -0.9811943 0.713423 0.2940703 -0.9856839 0.6575172 0.3563715 -0.9890048 0.6350848 0.4219498 -0.9914995 0.637211 0.4885191 -0.9933953 0.6561933 0.5538969 -0.9948487 0.6856388 0.6161874 -0.9959706 0.7204952 0.6739188 -0.9968409 0.757 0.7261105 -0.9975189 0.7925488 0.7722648 -0.9980488 0.8255071 0.8123018 -0.9984638 0.8549959 0.8464623 -0.9987895 0.880683 0.8752028 -0.9990455 0.9026016 0.8991006 -0.999247 0.9210061 0.9187791 -0.9994057 0.9362655 0.9348539 -0.9995308 0.9487918 0.9478997 -0.9996295 0.9589938 0.9584312 -0.9997074 0.9672509 0.9668969 -0.9997688 0.9739011 0.9736786 -0.9998174 0.9792361 0.9790965 -0.9998557 0.9835029 0.9834153 -0.999886 0.9869069 0.986852 -0.9999099 0.9896173 0.9895829 -0.9999288 0.9917722 0.9917507 -0.9999437 0.9934833 0.9934698 -0.2151269 0.9754027 0.2503773 -0.2150852 0.9753975 0.2502061 -0.2150342 0.9753908 0.249991 -0.2149725 0.9753825 0.2497215 -0.2148987 0.9753721 0.2493844 -0.2148124 0.9753591 0.2489643 -0.2147144 0.975343 0.2484431 -0.2146085 0.9753231 0.2478 -0.2145034 0.9752987 0.2470129 -0.2144168 0.9752692 0.2460594 -0.2143816 0.975234 0.2449216 -0.2144566 0.9751928 0.2435923 -0.2147432 0.9751462 0.2420885 -0.2154135 0.9750962 0.2404736 -0.2167545 0.9750472 0.2388957 -0.2192389 0.9750086 0.2376515 -0.2235962 0.9749962 0.2372529 -0.2296253 0.9749962 0.2372529 -0.2372529 0.9749962 0.2372529 -0.2469027 0.9749962 0.2372529 -0.2591111 0.9749962 0.2372529 -0.2745562 0.9749962 0.2372529 -0.2940963 0.9749962 0.2372529 -0.3188171 0.9749962 0.2372529 -0.3500921 0.9749962 0.2372529 -0.389659 0.9749962 0.2372529 -0.4397163 0.9749962 0.2372529 -0.5030453 0.9749962 0.2372529 -0.5831647 0.9749962 0.2372529 -0.6845262 0.9749962 0.2372529 -0.8127617 0.9749962 0.2372529 -0.9749962 0.9749962 0.2372529 -0.9811943 0.8316375 0.2940703 -0.9856839 0.7424095 0.3563715 -0.9890048 0.695167 0.4219498 -0.9914995 0.6791269 0.4885191 -0.9933953 0.6850303 0.5538969 -0.9948487 0.7052169 0.6161874 -0.9959706 0.733625 0.6739188 -0.9968409 0.7657077 0.7261105 -0.9975189 0.7982669 0.7722648 -0.9980488 0.8292297 0.8123018 -0.9984638 0.8574015 0.8464623 -0.9987895 0.8822279 0.8752028 -0.9990455 0.9035886 0.8991006 -0.999247 0.9216339 0.9187791 -0.9994057 0.9366635 0.9348539 -0.9995308 0.9490434 0.9478997 -0.9996295 0.9591524 0.9584312 -0.9997074 0.9673508 0.9668969 -0.9997688 0.9739638 0.9736786 -0.9998174 0.9792755 0.9790965 -0.9998557 0.9835276 0.9834153 -0.999886 0.9869223 0.986852 -0.9999099 0.989627 0.9895829 -0.9999288 0.9917782 0.9917507 -0.9999437 0.9934871 0.9934698 -0.2783684 0.9814251 0.3041308 -0.2783325 0.9814221 0.3039992 -0.2782884 0.9814183 0.303834 -0.2782347 0.9814136 0.3036269 -0.2781701 0.9814076 0.3033679 -0.2780936 0.9814002 0.3030452 -0.2780055 0.9813911 0.3026449 -0.2779077 0.9813797 0.3021511 -0.2778058 0.9813659 0.3015469 -0.2777122 0.9813491 0.3008152 -0.2776503 0.9813291 0.2999424 -0.2776626 0.9813057 0.2989233 -0.2778236 0.9812792 0.297771 -0.2782606 0.9812508 0.2965343 -0.2791873 0.9812231 0.2953268 -0.2809573 0.9812013 0.2943751 -0.2841192 0.9811943 0.2940703 -0.2885124 0.9811943 0.2940703 -0.2940703 0.9811943 0.2940703 -0.3011018 0.9811943 0.2940703 -0.3099976 0.9811943 0.2940703 -0.3212519 0.9811943 0.2940703 -0.3354901 0.9811943 0.2940703 -0.3535032 0.9811943 0.2940703 -0.3762922 0.9811943 0.2940703 -0.4051232 0.9811943 0.2940703 -0.4415982 0.9811943 0.2940703 -0.4877437 0.9811943 0.2940703 -0.5461239 0.9811943 0.2940703 -0.6199824 0.9811943 0.2940703 -0.713423 0.9811943 0.2940703 -0.8316375 0.9811943 0.2940703 -0.9811943 0.9811943 0.2940703 -0.9856839 0.8498092 0.3563715 -0.9890048 0.7711789 0.4219498 -0.9914995 0.7321559 0.4885191 -0.9933953 0.721513 0.5538969 -0.9948487 0.7299859 0.6161874 -0.9959706 0.7502359 0.6739188 -0.9968409 0.776724 0.7261105 -0.9975189 0.8055009 0.7722648 -0.9980488 0.8339392 0.8123018 -0.9984638 0.8604449 0.8464623 -0.9987895 0.8841823 0.8752028 -0.9990455 0.9048372 0.8991006 -0.999247 0.9224281 0.9187791 -0.9994057 0.9371669 0.9348539 -0.9995308 0.9493615 0.9478997 -0.9996295 0.959353 0.9584312 -0.9997074 0.967477 0.9668969 -0.9997688 0.9740432 0.9736786 -0.9998174 0.9793253 0.9790965 -0.9998557 0.9835588 0.9834153 -0.999886 0.9869419 0.986852 -0.9999099 0.9896392 0.9895829 -0.9999288 0.9917859 0.9917507 -0.9999437 0.9934919 0.9934698 -0.3454107 0.9858181 0.3639574 -0.3453807 0.9858163 0.363858 -0.3453439 0.9858141 0.3637331 -0.3452987 0.9858113 0.3635767 -0.3452442 0.9858079 0.363381 -0.3451791 0.9858036 0.3631373 -0.3451032 0.9857982 0.3628349 -0.3450175 0.9857916 0.3624621 -0.3449254 0.9857835 0.362006 -0.3448353 0.9857738 0.3614538 -0.3447636 0.9857621 0.3607953 -0.3447407 0.9857485 0.3600267 -0.3448204 0.9857332 0.3591581 -0.3450957 0.9857167 0.3582264 -0.3457234 0.9857006 0.3573171 -0.3469645 0.9856879 0.3566008 -0.3492254 0.9856839 0.3563715 -0.3523802 0.9856839 0.3563715 -0.3563715 0.9856839 0.3563715 -0.3614209 0.9856839 0.3563715 -0.3678092 0.9856839 0.3563715 -0.3758911 0.9856839 0.3563715 -0.3861159 0.9856839 0.3563715 -0.3990515 0.9856839 0.3563715 -0.4154167 0.9856839 0.3563715 -0.4361208 0.9856839 0.3563715 -0.4623142 0.9856839 0.3563715 -0.4954523 0.9856839 0.3563715 -0.5373763 0.9856839 0.3563715 -0.5904156 0.9856839 0.3563715 -0.6575172 0.9856839 0.3563715 -0.7424095 0.9856839 0.3563715 -0.8498092 0.9856839 0.3563715 -0.9856839 0.9856839 0.3563715 -0.9890048 0.8673437 0.4219498 -0.9914995 0.7992446 0.4885191 -0.9933953 0.7676683 0.5538969 -0.9948487 0.7613218 0.6161874 -0.9959706 0.7712508 0.6739188 -0.9968409 0.7906611 0.7261105 -0.9975189 0.8146529 0.7722648 -0.9980488 0.8398974 0.8123018 -0.9984638 0.8642952 0.8464623 -0.9987895 0.886655 0.8752028 -0.9990455 0.9064168 0.8991006 -0.999247 0.9234329 0.9187791 -0.9994057 0.9378038 0.9348539 -0.9995308 0.9497641 0.9478997 -0.9996295 0.9596068 0.9584312 -0.9997074 0.9676368 0.9668969 -0.9997688 0.9741436 0.9736786 -0.9998174 0.9793883 0.9790965 -0.9998557 0.9835983 0.9834153 -0.999886 0.9869667 0.986852 -0.9999099 0.9896547 0.9895829 -0.9999288 0.9917956 0.9917507 -0.9999437 0.993498 0.9934698 -0.4144197 0.9890841 0.4275735 -0.4143955 0.9890831 0.4274997 -0.4143657 0.9890818 0.427407 -0.414329 0.9890801 0.4272908 -0.4142845 0.9890781 0.4271456 -0.4142311 0.9890755 0.4269646 -0.4141683 0.9890723 0.4267402 -0.4140964 0.9890684 0.4264635 -0.4140176 0.9890637 0.426125 -0.4139373 0.9890579 0.4257154 -0.4138668 0.989051 0.425227 -0.4138277 0.989043 0.4246572 -0.4138582 0.9890339 0.4240134 -0.4140252 0.9890241 0.4233232 -0.4144423 0.9890146 0.4226498 -0.4152991 0.9890072 0.4221196 -0.4168922 0.9890048 0.4219498 -0.419125 0.9890048 0.4219498 -0.4219498 0.9890048 0.4219498 -0.4255236 0.9890048 0.4219498 -0.4300448 0.9890048 0.4219498 -0.4357648 0.9890048 0.4219498 -0.4430013 0.9890048 0.4219498 -0.4521565 0.9890048 0.4219498 -0.4637389 0.9890048 0.4219498 -0.4783922 0.9890048 0.4219498 -0.4969305 0.9890048 0.4219498 -0.5203839 0.9890048 0.4219498 -0.5500554 0.9890048 0.4219498 -0.5875938 0.9890048 0.4219498 -0.6350848 0.9890048 0.4219498 -0.695167 0.9890048 0.4219498 -0.7711789 0.9890048 0.4219498 -0.8673437 0.9890048 0.4219498 -0.9890048 0.9890048 0.4219498 -0.9914995 0.8841204 0.4885191 -0.9933953 0.8260608 0.5538969 -0.9948487 0.8009659 0.6161874 -0.9959706 0.7978374 0.6739188 -0.9968409 0.8082934 0.7261105 -0.9975189 0.8262314 0.7722648 -0.9980488 0.8474353 0.8123018 -0.9984638 0.8691663 0.8464623 -0.9987895 0.8897832 0.8752028 -0.9990455 0.9084153 0.8991006 -0.999247 0.9247041 0.9187791 -0.9994057 0.9386096 0.9348539 -0.9995308 0.9502734 0.9478997 -0.9996295 0.959928 0.9584312 -0.9997074 0.9678389 0.9668969 -0.9997688 0.9742706 0.9736786 -0.9998174 0.9794681 0.9790965 -0.9998557 0.9836483 0.9834153 -0.999886 0.986998 0.986852 -0.9999099 0.9896744 0.9895829 -0.9999288 0.9918079 0.9917507 -0.9999437 0.9935057 0.9934698 -0.4834235 0.9915469 0.4926161 -0.4834045 0.9915463 0.4925623 -0.4833811 0.9915455 0.4924946 -0.4833522 0.9915446 0.4924099 -0.4833171 0.9915433 0.4923039 -0.4832747 0.9915418 0.4921719 -0.4832246 0.9915399 0.4920083 -0.4831666 0.9915376 0.4918065 -0.4831021 0.9915347 0.4915597 -0.4830346 0.9915312 0.4912611 -0.4829718 0.9915271 0.4909052 -0.4829286 0.9915223 0.49049 -0.4829319 0.9915169 0.4900212 -0.4830292 0.991511 0.4895186 -0.4833013 0.9915054 0.4890285 -0.4838841 0.9915009 0.4886426 -0.4849907 0.9914995 0.4885191 -0.4865484 0.9914995 0.4885191 -0.4885191 0.9914995 0.4885191 -0.4910123 0.9914995 0.4885191 -0.4941665 0.9914995 0.4885191 -0.498157 0.9914995 0.4885191 -0.5032055 0.9914995 0.4885191 -0.5095925 0.9914995 0.4885191 -0.5176729 0.9914995 0.4885191 -0.5278957 0.9914995 0.4885191 -0.5408288 0.9914995 0.4885191 -0.5571908 0.9914995 0.4885191 -0.577891 0.9914995 0.4885191 -0.6040793 0.9914995 0.4885191 -0.637211 0.9914995 0.4885191 -0.6791269 0.9914995 0.4885191 -0.7321559 0.9914995 0.4885191 -0.7992446 0.9914995 0.4885191 -0.8841204 0.9914995 0.4885191 -0.9914995 0.9914995 0.4885191 -0.9933953 0.8999349 0.5538969 -0.9948487 0.8511207 0.6161874 -0.9959706 0.8314729 0.6739188 -0.9968409 0.8306004 0.7261105 -0.9975189 0.8408797 0.7722648 -0.9980488 0.8569716 0.8123018 -0.9984638 0.875329 0.8464623 -0.9987895 0.8937407 0.8752028 -0.9990455 0.9109436 0.8991006 -0.999247 0.9263124 0.9187791 -0.9994057 0.939629 0.9348539 -0.9995308 0.9509177 0.9478997 -0.9996295 0.9603343 0.9584312 -0.9997074 0.9680946 0.9668969 -0.9997688 0.9744313 0.9736786 -0.9998174 0.9795689 0.9790965 -0.9998557 0.9837116 0.9834153 -0.999886 0.9870376 0.986852 -0.9999099 0.9896992 0.9895829 -0.9999288 0.9918234 0.9917507 -0.9999437 0.9935154 0.9934698 -0.5504963 0.993424 0.5568298 -0.5504818 0.9934236 0.5567912 -0.550464 0.9934231 0.5567427 -0.5504419 0.9934225 0.556682 -0.550415 0.9934218 0.5566061 -0.5503825 0.9934209 0.5565115 -0.5503438 0.9934197 0.5563942 -0.5502987 0.9934183 0.5562497 -0.550248 0.9934166 0.5560729 -0.5501939 0.9934145 0.5558591 -0.5501416 0.993412 0.5556042 -0.5501012 0.9934091 0.555307 -0.5500915 0.9934058 0.5549714 -0.5501456 0.9934023 0.5546118 -0.5503203 0.9933988 0.5542612 -0.5507113 0.9933961 0.5539852 -0.5514695 0.9933953 0.5538969 -0.5525411 0.9933953 0.5538969 -0.5538969 0.9933953 0.5538969 -0.5556122 0.9933953 0.5538969 -0.5577822 0.9933953 0.5538969 -0.5605276 0.9933953 0.5538969 -0.5640008 0.9933953 0.5538969 -0.5683949 0.9933953 0.5538969 -0.573954 0.9933953 0.5538969 -0.580987 0.9933953 0.5538969 -0.5898847 0.9933953 0.5538969 -0.6011414 0.9933953 0.5538969 -0.6153825 0.9933953 0.5538969 -0.6333995 0.9933953 0.5538969 -0.6561933 0.9933953 0.5538969 -0.6850303 0.9933953 0.5538969 -0.721513 0.9933953 0.5538969 -0.7676683 0.9933953 0.5538969 -0.8260608 0.9933953 0.5538969 -0.8999349 0.9933953 0.5538969 -0.9933953 0.9933953 0.5538969 -0.9948487 0.9145732 0.6161874 -0.9959706 0.8740262 0.6739188 -0.9968409 0.8588218 0.7261105 -0.9975189 0.8594117 0.7722648 -0.9980488 0.8690364 0.8123018 -0.9984638 0.8831255 0.8464623 -0.9987895 0.8987476 0.8752028 -0.9990455 0.9141422 0.8991006 -0.999247 0.928347 0.9187791 -0.9994057 0.9409186 0.9348539 -0.9995308 0.9517328 0.9478997 -0.9996295 0.9608482 0.9584312 -0.9997074 0.9684181 0.9668969 -0.9997688 0.9746346 0.9736786 -0.9998174 0.9796966 0.9790965 -0.9998557 0.9837916 0.9834153 -0.999886 0.9870878 0.986852 -0.9999099 0.9897306 0.9895829 -0.9999288 0.9918431 0.9917507 -0.9999437 0.9935277 0.9934698 -0.6139459 0.9948662 0.6182511 -0.6139352 0.994866 0.6182239 -0.6139219 0.9948657 0.6181897 -0.6139056 0.9948653 0.618147 -0.6138855 0.9948649 0.6180935 -0.6138613 0.9948643 0.6180269 -0.6138323 0.9948636 0.6179443 -0.6137984 0.9948628 0.6178426 -0.6137599 0.9948617 0.6177181 -0.6137183 0.9948604 0.6175676 -0.6136769 0.9948589 0.6173882 -0.6136427 0.9948571 0.617179 -0.6136284 0.9948551 0.6169429 -0.6136569 0.994853 0.61669 -0.6137675 0.9948509 0.6164434 -0.6140266 0.9948493 0.6162494 -0.6145393 0.9948487 0.6161874 -0.6152669 0.9948487 0.6161874 -0.6161874 0.9948487 0.6161874 -0.6173519 0.9948487 0.6161874 -0.6188252 0.9948487 0.6161874 -0.6206891 0.9948487 0.6161874 -0.6230471 0.9948487 0.6161874 -0.6260304 0.9948487 0.6161874 -0.6298046 0.9948487 0.6161874 -0.6345795 0.9948487 0.6161874 -0.6406203 0.9948487 0.6161874 -0.6482627 0.9948487 0.6161874 -0.6579314 0.9948487 0.6161874 -0.6701635 0.9948487 0.6161874 -0.6856388 0.9948487 0.6161874 -0.7052169 0.9948487 0.6161874 -0.7299859 0.9948487 0.6161874 -0.7613218 0.9948487 0.6161874 -0.8009659 0.9948487 0.6161874 -0.8511207 0.9948487 0.6161874 -0.9145732 0.9948487 0.6161874 -0.9948487 0.9948487 0.6161874 -0.9959706 0.9278617 0.6739188 -0.9968409 0.8945255 0.7261105 -0.9975189 0.8828571 0.7722648 -0.9980488 0.8842998 0.8123018 -0.9984638 0.892989 0.8464623 -0.9987895 0.9050819 0.8752028 -0.9990455 0.9181889 0.8991006 -0.999247 0.9309211 0.9187791 -0.9994057 0.9425502 0.9348539 -0.9995308 0.952764 0.9478997 -0.9996295 0.9614985 0.9584312 -0.9997074 0.9688274 0.9668969 -0.9997688 0.9748918 0.9736786 -0.9998174 0.979858 0.9790965 -0.9998557 0.9838928 0.9834153 -0.999886 0.9871512 0.986852 -0.9999099 0.9897703 0.9895829 -0.9999288 0.991868 0.9917507 -0.9999437 0.9935432 0.9934698 -0.6724572 0.9959813 0.6753473 -0.6724495 0.9959811 0.6753284 -0.6724399 0.9959809 0.6753048 -0.672428 0.9959807 0.6752752 -0.6724135 0.9959804 0.6752381 -0.6723959 0.9959801 0.675192 -0.6723748 0.9959797 0.6751348 -0.67235 0.9959791 0.6750644 -0.6723217 0.9959785 0.6749782 -0.6722907 0.9959777 0.6748739 -0.6722594 0.9959768 0.6747498 -0.6722322 0.9959757 0.674605 -0.672218 0.9959745 0.6744416 -0.672232 0.9959732 0.6742666 -0.6723012 0.9959719 0.674096 -0.6724711 0.9959709 0.6739618 -0.6728136 0.9959706 0.6739188 -0.6733015 0.9959706 0.6739188 -0.6739188 0.9959706 0.6739188 -0.6746998 0.9959706 0.6739188 -0.6756878 0.9959706 0.6739188 -0.6769378 0.9959706 0.6739188 -0.6785192 0.9959706 0.6739188 -0.6805199 0.9959706 0.6739188 -0.683051 0.9959706 0.6739188 -0.6862532 0.9959706 0.6739188 -0.6903044 0.9959706 0.6739188 -0.6954296 0.9959706 0.6739188 -0.7019138 0.9959706 0.6739188 -0.710117 0.9959706 0.6739188 -0.7204952 0.9959706 0.6739188 -0.733625 0.9959706 0.6739188 -0.7502359 0.9959706 0.6739188 -0.7712508 0.9959706 0.6739188 -0.7978374 0.9959706 0.6739188 -0.8314729 0.9959706 0.6739188 -0.8740262 0.9959706 0.6739188 -0.9278617 0.9959706 0.6739188 -0.9959706 0.9959706 0.6739188 -0.9968409 0.9396953 0.7261105 -0.9975189 0.9125186 0.7722648 -0.9980488 0.9036101 0.8123018 -0.9984638 0.9054678 0.8464623 -0.9987895 0.9130957 0.8752028 -0.9990455 0.9233085 0.8991006 -0.999247 0.9341777 0.9187791 -0.9994057 0.9446144 0.9348539 -0.9995308 0.9540687 0.9478997 -0.9996295 0.9623212 0.9584312 -0.9997074 0.9693452 0.9668969 -0.9997688 0.9752172 0.9736786 -0.9998174 0.9800622 0.9790965 -0.9998557 0.9840209 0.9834153 -0.999886 0.9872315 0.986852 -0.9999099 0.9898206 0.9895829 -0.9999288 0.9918994 0.9917507 -0.9999437 0.9935629 0.9934698 -0.7251659 0.9968475 0.7270843 -0.7251605 0.9968474 0.7270714 -0.7251537 0.9968473 0.7270553 -0.7251454 0.9968472 0.7270351 -0.7251351 0.996847 0.7270098 -0.7251226 0.9968468 0.7269784 -0.7251076 0.9968465 0.7269394 -0.7250899 0.9968462 0.7268913 -0.7250697 0.9968458 0.7268325 -0.7250473 0.9968453 0.7267615 -0.7250244 0.9968448 0.7266768 -0.7250039 0.9968441 0.7265781 -0.7249916 0.9968433 0.7264667 -0.7249978 0.9968425 0.7263474 -0.7250408 0.9968418 0.7262312 -0.7251511 0.9968411 0.7261398 -0.7253775 0.9968409 0.7261105 -0.7257011 0.9968409 0.7261105 -0.7261105 0.9968409 0.7261105 -0.7266285 0.9968409 0.7261105 -0.7272837 0.9968409 0.7261105 -0.7281127 0.9968409 0.7261105 -0.7291615 0.9968409 0.7261105 -0.7304884 0.9968409 0.7261105 -0.732167 0.9968409 0.7261105 -0.7342907 0.9968409 0.7261105 -0.7369774 0.9968409 0.7261105 -0.7403765 0.9968409 0.7261105 -0.7446768 0.9968409 0.7261105 -0.7501172 0.9968409 0.7261105 -0.757 0.9968409 0.7261105 -0.7657077 0.9968409 0.7261105 -0.776724 0.9968409 0.7261105 -0.7906611 0.9968409 0.7261105 -0.8082934 0.9968409 0.7261105 -0.8306004 0.9968409 0.7261105 -0.8588218 0.9968409 0.7261105 -0.8945255 0.9968409 0.7261105 -0.9396953 0.9968409 0.7261105 -0.9968409 0.9968409 0.7261105 -0.9975189 0.9500442 0.7722648 -0.9980488 0.9280401 0.8123018 -0.9984638 0.921255 0.8464623 -0.9987895 0.9232341 0.8752028 -0.9990455 0.9297854 0.8991006 -0.999247 0.9382977 0.9187791 -0.9994057 0.9472259 0.9348539 -0.9995308 0.9557192 0.9478997 -0.9996295 0.963362 0.9584312 -0.9997074 0.9700002 0.9668969 -0.9997688 0.9756289 0.9736786 -0.9998174 0.9803206 0.9790965 -0.9998557 0.9841829 0.9834153 -0.999886 0.987333 0.986852 -0.9999099 0.9898842 0.9895829 -0.9999288 0.9919392 0.9917507 -0.9999437 0.9935878 0.9934698 -0.7716588 0.997523 0.7729194 -0.7716551 0.997523 0.7729107 -0.7716504 0.9975229 0.7728999 -0.7716446 0.9975228 0.7728863 -0.7716375 0.9975227 0.7728693 -0.7716288 0.9975226 0.7728482 -0.7716184 0.9975224 0.7728219 -0.7716061 0.9975222 0.7727896 -0.7715919 0.997522 0.7727501 -0.7715762 0.9975217 0.7727023 -0.7715599 0.9975213 0.7726454 -0.7715449 0.9975209 0.772579 -0.7715352 0.9975204 0.7725042 -0.7715376 0.9975199 0.772424 -0.7715641 0.9975194 0.7723459 -0.7716352 0.9975191 0.7722844 -0.7717834 0.9975189 0.7722648 -0.7719959 0.9975189 0.7722648 -0.7722648 0.9975189 0.7722648 -0.7726049 0.9975189 0.7722648 -0.7730352 0.9975189 0.7722648 -0.7735795 0.9975189 0.7722648 -0.7742682 0.9975189 0.7722648 -0.7751395 0.9975189 0.7722648 -0.7762418 0.9975189 0.7722648 -0.7776364 0.9975189 0.7722648 -0.7794007 0.9975189 0.7722648 -0.7816327 0.9975189 0.7722648 -0.7844566 0.9975189 0.7722648 -0.7880291 0.9975189 0.7722648 -0.7925488 0.9975189 0.7722648 -0.7982669 0.9975189 0.7722648 -0.8055009 0.9975189 0.7722648 -0.8146529 0.9975189 0.7722648 -0.8262314 0.9975189 0.7722648 -0.8408797 0.9975189 0.7722648 -0.8594117 0.9975189 0.7722648 -0.8828571 0.9975189 0.7722648 -0.9125186 0.9975189 0.7722648 -0.9500442 0.9975189 0.7722648 -0.9975189 0.9975189 0.7722648 -0.9980488 0.9589472 0.8123018 -0.9984638 0.9412278 0.8464623 -0.9987895 0.9360606 0.8752028 -0.9990455 0.9379796 0.8991006 -0.999247 0.94351 0.9187791 -0.9994057 0.9505298 0.9348539 -0.9995308 0.9578074 0.9478997 -0.9996295 0.9646787 0.9584312 -0.9997074 0.970829 0.9668969 -0.9997688 0.9761497 0.9736786 -0.9998174 0.9806476 0.9790965 -0.9998557 0.984388 0.9834153 -0.999886 0.9874615 0.986852 -0.9999099 0.9899646 0.9895829 -0.9999288 0.9919896 0.9917507 -0.9999437 0.9936193 0.9934698 -0.8119154 0.9980513 0.8127365 -0.8119128 0.9980512 0.8127308 -0.8119096 0.9980512 0.8127235 -0.8119057 0.9980511 0.8127145 -0.8119009 0.9980511 0.8127032 -0.8118949 0.998051 0.8126892 -0.8118878 0.9980509 0.8126718 -0.8118794 0.9980508 0.8126503 -0.8118697 0.9980506 0.812624 -0.8118589 0.9980504 0.8125923 -0.8118476 0.9980502 0.8125545 -0.811837 0.99805 0.8125104 -0.8118298 0.9980497 0.8124607 -0.8118303 0.9980494 0.8124075 -0.8118466 0.9980491 0.8123556 -0.8118921 0.9980488 0.8123148 -0.8119884 0.9980488 0.8123018 -0.8121268 0.9980488 0.8123018 -0.8123018 0.9980488 0.8123018 -0.8125232 0.9980488 0.8123018 -0.8128033 0.9980488 0.8123018 -0.8131577 0.9980488 0.8123018 -0.8136061 0.9980488 0.8123018 -0.8141733 0.9980488 0.8123018 -0.8148909 0.9980488 0.8123018 -0.8157988 0.9980488 0.8123018 -0.8169474 0.9980488 0.8123018 -0.8184005 0.9980488 0.8123018 -0.8202389 0.9980488 0.8123018 -0.8225647 0.9980488 0.8123018 -0.8255071 0.9980488 0.8123018 -0.8292297 0.9980488 0.8123018 -0.8339392 0.9980488 0.8123018 -0.8398974 0.9980488 0.8123018 -0.8474353 0.9980488 0.8123018 -0.8569716 0.9980488 0.8123018 -0.8690364 0.9980488 0.8123018 -0.8842998 0.9980488 0.8123018 -0.9036101 0.9980488 0.8123018 -0.9280401 0.9980488 0.8123018 -0.9589472 0.9980488 0.8123018 -0.9980488 0.9980488 0.8123018 -0.9984638 0.9664961 0.8464623 -0.9987895 0.9522877 0.8752028 -0.9990455 0.9483463 0.8991006 -0.999247 0.9501042 0.9187791 -0.9994057 0.9547096 0.9348539 -0.9995308 0.9604492 0.9478997 -0.9996295 0.9663445 0.9584312 -0.9997074 0.9718774 0.9668969 -0.9997688 0.9768086 0.9736786 -0.9998174 0.9810611 0.9790965 -0.9998557 0.9846473 0.9834153 -0.999886 0.987624 0.986852 -0.9999099 0.9900664 0.9895829 -0.9999288 0.9920533 0.9917507 -0.9999437 0.9936592 0.9934698 -0.8462171 0.9984653 0.8467479 -0.8462154 0.9984653 0.8467442 -0.8462132 0.9984653 0.8467394 -0.8462106 0.9984653 0.8467335 -0.8462073 0.9984652 0.8467261 -0.8462034 0.9984652 0.8467168 -0.8461986 0.9984651 0.8467054 -0.8461929 0.998465 0.8466913 -0.8461864 0.9984649 0.846674 -0.8461791 0.9984648 0.8466532 -0.8461714 0.9984647 0.8466283 -0.8461641 0.9984645 0.8465994 -0.8461589 0.9984643 0.8465667 -0.8461587 0.9984642 0.8465317 -0.8461687 0.998464 0.8464977 -0.8461977 0.9984638 0.8464709 -0.8462598 0.9984638 0.8464623 -0.8463492 0.9984638 0.8464623 -0.8464623 0.9984638 0.8464623 -0.8466054 0.9984638 0.8464623 -0.8467864 0.9984638 0.8464623 -0.8470154 0.9984638 0.8464623 -0.8473052 0.9984638 0.8464623 -0.8476717 0.9984638 0.8464623 -0.8481355 0.9984638 0.8464623 -0.8487222 0.9984638 0.8464623 -0.8494644 0.9984638 0.8464623 -0.8504035 0.9984638 0.8464623 -0.8515915 0.9984638 0.8464623 -0.8530945 0.9984638 0.8464623 -0.8549959 0.9984638 0.8464623 -0.8574015 0.9984638 0.8464623 -0.8604449 0.9984638 0.8464623 -0.8642952 0.9984638 0.8464623 -0.8691663 0.9984638 0.8464623 -0.875329 0.9984638 0.8464623 -0.8831255 0.9984638 0.8464623 -0.892989 0.9984638 0.8464623 -0.9054678 0.9984638 0.8464623 -0.921255 0.9984638 0.8464623 -0.9412278 0.9984638 0.8464623 -0.9664961 0.9984638 0.8464623 -0.9984638 0.9984638 0.8464623 -0.9987895 0.9728171 0.8752028 -0.9990455 0.9614615 0.8991006 -0.999247 0.9584468 0.9187791 -0.9994057 0.9599976 0.9348539 -0.9995308 0.9637914 0.9478997 -0.9996295 0.968452 0.9584312 -0.9997074 0.9732039 0.9668969 -0.9997688 0.9776422 0.9736786 -0.9998174 0.9815844 0.9790965 -0.9998557 0.9849754 0.9834153 -0.999886 0.9878296 0.986852 -0.9999099 0.9901951 0.9895829 -0.9999288 0.9921339 0.9917507 -0.9999437 0.9937096 0.9934698 -0.8750477 0.9987905 0.8753887 -0.8750466 0.9987905 0.8753863 -0.8750451 0.9987904 0.8753832 -0.8750434 0.9987904 0.8753793 -0.8750412 0.9987904 0.8753745 -0.8750386 0.9987904 0.8753685 -0.8750355 0.9987903 0.875361 -0.8750317 0.9987903 0.8753518 -0.8750274 0.9987902 0.8753406 -0.8750225 0.9987902 0.875327 -0.8750173 0.9987901 0.8753108 -0.8750124 0.99879 0.875292 -0.8750088 0.9987899 0.8752707 -0.8750084 0.9987897 0.875248 -0.8750145 0.9987896 0.8752258 -0.8750329 0.9987895 0.8752084 -0.8750727 0.9987895 0.8752028 -0.8751301 0.9987895 0.8752028 -0.8752028 0.9987895 0.8752028 -0.8752947 0.9987895 0.8752028 -0.8754109 0.9987895 0.8752028 -0.875558 0.9987895 0.8752028 -0.8757441 0.9987895 0.8752028 -0.8759795 0.9987895 0.8752028 -0.8762773 0.9987895 0.8752028 -0.8766541 0.9987895 0.8752028 -0.8771307 0.9987895 0.8752028 -0.8777338 0.9987895 0.8752028 -0.8784967 0.9987895 0.8752028 -0.8794619 0.9987895 0.8752028 -0.880683 0.9987895 0.8752028 -0.8822279 0.9987895 0.8752028 -0.8841823 0.9987895 0.8752028 -0.886655 0.9987895 0.8752028 -0.8897832 0.9987895 0.8752028 -0.8937407 0.9987895 0.8752028 -0.8987476 0.9987895 0.8752028 -0.9050819 0.9987895 0.8752028 -0.9130957 0.9987895 0.8752028 -0.9232341 0.9987895 0.8752028 -0.9360606 0.9987895 0.8752028 -0.9522877 0.9987895 0.8752028 -0.9728171 0.9987895 0.8752028 -0.9987895 0.9987895 0.8752028 -0.9990455 0.9780539 0.8991006 -0.999247 0.9690013 0.9187791 -0.9994057 0.9666876 0.9348539 -0.9995308 0.9680197 0.9478997 -0.9996295 0.9711183 0.9584312 -0.9997074 0.974882 0.9668969 -0.9997688 0.9786968 0.9736786 -0.9998174 0.9822464 0.9790965 -0.9998557 0.9853905 0.9834153 -0.999886 0.9880897 0.986852 -0.9999099 0.990358 0.9895829 -0.9999288 0.9922358 0.9917507 -0.9999437 0.9937734 0.9934698 -0.8990028 0.9990461 0.8992207 -0.899002 0.9990461 0.8992191 -0.8990011 0.9990461 0.8992171 -0.899 0.9990461 0.8992146 -0.8989986 0.9990461 0.8992115 -0.8989969 0.9990461 0.8992076 -0.8989948 0.9990461 0.8992028 -0.8989923 0.999046 0.8991969 -0.8989895 0.999046 0.8991896 -0.8989863 0.9990459 0.8991809 -0.8989829 0.9990459 0.8991704 -0.8989796 0.9990458 0.8991582 -0.8989771 0.9990458 0.8991445 -0.8989767 0.9990457 0.8991298 -0.8989805 0.9990456 0.8991155 -0.8989921 0.9990456 0.8991042 -0.8990175 0.9990455 0.8991006 -0.8990542 0.9990455 0.8991006 -0.8991006 0.9990455 0.8991006 -0.8991593 0.9990455 0.8991006 -0.8992336 0.9990455 0.8991006 -0.8993275 0.9990455 0.8991006 -0.8994464 0.9990455 0.8991006 -0.8995968 0.9990455 0.8991006 -0.899787 0.9990455 0.8991006 -0.9000277 0.9990455 0.8991006 -0.9003323 0.9990455 0.8991006 -0.9007175 0.9990455 0.8991006 -0.9012049 0.9990455 0.8991006 -0.9018215 0.9990455 0.8991006 -0.9026016 0.9990455 0.8991006 -0.9035886 0.9990455 0.8991006 -0.9048372 0.9990455 0.8991006 -0.9064168 0.9990455 0.8991006 -0.9084153 0.9990455 0.8991006 -0.9109436 0.9990455 0.8991006 -0.9141422 0.9990455 0.8991006 -0.9181889 0.9990455 0.8991006 -0.9233085 0.9990455 0.8991006 -0.9297854 0.9990455 0.8991006 -0.9379796 0.9990455 0.8991006 -0.9483463 0.9990455 0.8991006 -0.9614615 0.9990455 0.8991006 -0.9780539 0.9990455 0.8991006 -0.9990455 0.9990455 0.8991006 -0.999247 0.982354 0.9187791 -0.9994057 0.9751513 0.9348539 -0.9995308 0.9733691 0.9478997 -0.9996295 0.9744915 0.9584312 -0.9997074 0.977005 0.9668969 -0.9997688 0.980031 0.9736786 -0.9998174 0.9830838 0.9790965 -0.9998557 0.9859157 0.9834153 -0.999886 0.9884188 0.986852 -0.9999099 0.9905641 0.9895829 -0.9999288 0.9923648 0.9917507 -0.9999437 0.9938541 0.9934698 -0.9187175 0.9992474 0.9188562 -0.918717 0.9992474 0.9188551 -0.9187164 0.9992474 0.9188539 -0.9187157 0.9992474 0.9188523 -0.9187148 0.9992474 0.9188503 -0.9187137 0.9992474 0.9188478 -0.9187123 0.9992473 0.9188447 -0.9187107 0.9992473 0.9188409 -0.9187089 0.9992473 0.9188362 -0.9187068 0.9992473 0.9188306 -0.9187045 0.9992472 0.9188239 -0.9187024 0.9992472 0.918816 -0.9187008 0.9992472 0.9188072 -0.9187004 0.9992471 0.9187978 -0.9187027 0.9992471 0.9187886 -0.9187101 0.999247 0.9187814 -0.9187262 0.999247 0.9187791 -0.9187495 0.999247 0.9187791 -0.9187791 0.999247 0.9187791 -0.9188164 0.999247 0.9187791 -0.9188636 0.999247 0.9187791 -0.9189234 0.999247 0.9187791 -0.918999 0.999247 0.9187791 -0.9190947 0.999247 0.9187791 -0.9192157 0.999247 0.9187791 -0.9193688 0.999247 0.9187791 -0.9195625 0.999247 0.9187791 -0.9198076 0.999247 0.9187791 -0.9201176 0.999247 0.9187791 -0.9205098 0.999247 0.9187791 -0.9210061 0.999247 0.9187791 -0.9216339 0.999247 0.9187791 -0.9224281 0.999247 0.9187791 -0.9234329 0.999247 0.9187791 -0.9247041 0.999247 0.9187791 -0.9263124 0.999247 0.9187791 -0.928347 0.999247 0.9187791 -0.9309211 0.999247 0.9187791 -0.9341777 0.999247 0.9187791 -0.9382977 0.999247 0.9187791 -0.94351 0.999247 0.9187791 -0.9501042 0.999247 0.9187791 -0.9584468 0.999247 0.9187791 -0.9690013 0.999247 0.9187791 -0.982354 0.999247 0.9187791 -0.999247 0.999247 0.9187791 -0.9994057 0.9858591 0.9348539 -0.9995308 0.9801368 0.9478997 -0.9996295 0.978759 0.9584312 -0.9997074 0.9796909 0.9668969 -0.9997688 0.981719 0.9736786 -0.9998174 0.9841433 0.9790965 -0.9998557 0.9865801 0.9834153 -0.999886 0.9888351 0.986852 -0.9999099 0.9908248 0.9895829 -0.9999288 0.992528 0.9917507 -0.9999437 0.9939562 0.9934698 -0.9348153 0.999406 0.9349032 -0.9348149 0.999406 0.9349025 -0.9348146 0.999406 0.9349017 -0.9348141 0.999406 0.9349007 -0.9348135 0.999406 0.9348994 -0.9348128 0.9994059 0.9348978 -0.9348119 0.9994059 0.9348958 -0.9348109 0.9994059 0.9348934 -0.9348097 0.9994059 0.9348904 -0.9348083 0.9994059 0.9348868 -0.9348069 0.9994059 0.9348825 -0.9348055 0.9994059 0.9348775 -0.9348044 0.9994058 0.9348719 -0.9348042 0.9994058 0.9348659 -0.9348056 0.9994058 0.93486 -0.9348102 0.9994057 0.9348554 -0.9348204 0.9994057 0.9348539 -0.9348352 0.9994057 0.9348539 -0.9348539 0.9994057 0.9348539 -0.9348776 0.9994057 0.9348539 -0.9349075 0.9994057 0.9348539 -0.9349454 0.9994057 0.9348539 -0.9349933 0.9994057 0.9348539 -0.935054 0.9994057 0.9348539 -0.9351307 0.9994057 0.9348539 -0.9352277 0.9994057 0.9348539 -0.9353505 0.9994057 0.9348539 -0.9355059 0.9994057 0.9348539 -0.9357024 0.9994057 0.9348539 -0.935951 0.9994057 0.9348539 -0.9362655 0.9994057 0.9348539 -0.9366635 0.9994057 0.9348539 -0.9371669 0.9994057 0.9348539 -0.9378038 0.9994057 0.9348539 -0.9386096 0.9994057 0.9348539 -0.939629 0.9994057 0.9348539 -0.9409186 0.9994057 0.9348539 -0.9425502 0.9994057 0.9348539 -0.9446144 0.9994057 0.9348539 -0.9472259 0.9994057 0.9348539 -0.9505298 0.9994057 0.9348539 -0.9547096 0.9994057 0.9348539 -0.9599976 0.9994057 0.9348539 -0.9666876 0.9994057 0.9348539 -0.9751513 0.9994057 0.9348539 -0.9858591 0.9994057 0.9348539 -0.9994057 0.9994057 0.9348539 -0.9995308 0.9886988 0.9478997 -0.9996295 0.9841579 0.9584312 -0.9997074 0.983089 0.9668969 -0.9997688 0.9838545 0.9736786 -0.9998174 0.9854838 0.9790965 -0.9998557 0.9874207 0.9834153 -0.999886 0.9893618 0.986852 -0.9999099 0.9911547 0.9895829 -0.9999288 0.9927345 0.9917507 -0.9999437 0.9940854 0.9934698 -0.9478754 0.999531 0.947931 -0.9478752 0.999531 0.9479306 -0.947875 0.999531 0.94793 -0.9478746 0.999531 0.9479294 -0.9478743 0.999531 0.9479286 -0.9478738 0.999531 0.9479276 -0.9478733 0.999531 0.9479263 -0.9478726 0.999531 0.9479248 -0.9478718 0.999531 0.9479229 -0.947871 0.9995309 0.9479206 -0.94787 0.9995309 0.9479179 -0.9478691 0.9995309 0.9479147 -0.9478684 0.9995309 0.9479111 -0.9478683 0.9995309 0.9479073 -0.9478691 0.9995309 0.9479035 -0.947872 0.9995309 0.9479006 -0.9478785 0.9995308 0.9478997 -0.9478878 0.9995308 0.9478997 -0.9478997 0.9995308 0.9478997 -0.9479146 0.9995308 0.9478997 -0.9479335 0.9995308 0.9478997 -0.9479575 0.9995308 0.9478997 -0.9479878 0.9995308 0.9478997 -0.9480261 0.9995308 0.9478997 -0.9480746 0.9995308 0.9478997 -0.9481359 0.9995308 0.9478997 -0.9482135 0.9995308 0.9478997 -0.9483117 0.9995308 0.9478997 -0.9484359 0.9995308 0.9478997 -0.9485931 0.9995308 0.9478997 -0.9487918 0.9995308 0.9478997 -0.9490434 0.9995308 0.9478997 -0.9493615 0.9995308 0.9478997 -0.9497641 0.9995308 0.9478997 -0.9502734 0.9995308 0.9478997 -0.9509177 0.9995308 0.9478997 -0.9517328 0.9995308 0.9478997 -0.952764 0.9995308 0.9478997 -0.9540687 0.9995308 0.9478997 -0.9557192 0.9995308 0.9478997 -0.9578074 0.9995308 0.9478997 -0.9604492 0.9995308 0.9478997 -0.9637914 0.9995308 0.9478997 -0.9680197 0.9995308 0.9478997 -0.9733691 0.9995308 0.9478997 -0.9801368 0.9995308 0.9478997 -0.9886988 0.9995308 0.9478997 -0.9995308 0.9995308 0.9478997 -0.9996295 0.9909882 0.9584312 -0.9997074 0.9873879 0.9668969 -0.9997688 0.9865561 0.9736786 -0.9998174 0.9871796 0.9790965 -0.9998557 0.9884841 0.9834153 -0.999886 0.9900282 0.986852 -0.9999099 0.991572 0.9895829 -0.9999288 0.9929957 0.9917507 -0.9999437 0.9942488 0.9934698 -0.958416 0.9996296 0.958451 -0.9584159 0.9996296 0.9584508 -0.9584157 0.9996296 0.9584504 -0.9584155 0.9996296 0.95845 -0.9584153 0.9996296 0.9584495 -0.958415 0.9996296 0.9584489 -0.9584146 0.9996296 0.9584481 -0.9584142 0.9996296 0.9584471 -0.9584137 0.9996296 0.9584459 -0.9584132 0.9996296 0.9584444 -0.9584126 0.9996296 0.9584427 -0.958412 0.9996296 0.9584407 -0.9584115 0.9996296 0.9584384 -0.9584114 0.9996295 0.958436 -0.958412 0.9996295 0.9584336 -0.9584138 0.9996295 0.9584318 -0.9584178 0.9996295 0.9584312 -0.9584237 0.9996295 0.9584312 -0.9584312 0.9996295 0.9584312 -0.9584406 0.9996295 0.9584312 -0.9584526 0.9996295 0.9584312 -0.9584677 0.9996295 0.9584312 -0.9584868 0.9996295 0.9584312 -0.9585109 0.9996295 0.9584312 -0.9585415 0.9996295 0.9584312 -0.9585802 0.9996295 0.9584312 -0.9586291 0.9996295 0.9584312 -0.958691 0.9996295 0.9584312 -0.9587693 0.9996295 0.9584312 -0.9588684 0.9996295 0.9584312 -0.9589938 0.9996295 0.9584312 -0.9591524 0.9996295 0.9584312 -0.959353 0.9996295 0.9584312 -0.9596068 0.9996295 0.9584312 -0.959928 0.9996295 0.9584312 -0.9603343 0.9996295 0.9584312 -0.9608482 0.9996295 0.9584312 -0.9614985 0.9996295 0.9584312 -0.9623212 0.9996295 0.9584312 -0.963362 0.9996295 0.9584312 -0.9646787 0.9996295 0.9584312 -0.9663445 0.9996295 0.9584312 -0.968452 0.9996295 0.9584312 -0.9711183 0.9996295 0.9584312 -0.9744915 0.9996295 0.9584312 -0.978759 0.9996295 0.9584312 -0.9841579 0.9996295 0.9584312 -0.9909882 0.9996295 0.9584312 -0.9996295 0.9996295 0.9584312 -0.9997074 0.9928267 0.9668969 -0.9997688 0.9899741 0.9736786 -0.9998174 0.989325 0.9790965 -0.9998557 0.9898295 0.9834153 -0.999886 0.9908712 0.986852 -0.9999099 0.9920999 0.9895829 -0.9999288 0.9933261 0.9917507 -0.9999437 0.9944556 0.9934698 -0.9668873 0.9997074 0.9669094 -0.9668872 0.9997074 0.9669092 -0.9668871 0.9997074 0.966909 -0.966887 0.9997074 0.9669087 -0.9668869 0.9997074 0.9669084 -0.9668867 0.9997074 0.966908 -0.9668865 0.9997074 0.9669075 -0.9668862 0.9997074 0.9669069 -0.9668859 0.9997074 0.9669061 -0.9668855 0.9997074 0.9669052 -0.9668852 0.9997074 0.9669041 -0.9668848 0.9997074 0.9669029 -0.9668845 0.9997074 0.9669014 -0.9668844 0.9997074 0.9668999 -0.9668847 0.9997074 0.9668984 -0.9668859 0.9997074 0.9668972 -0.9668884 0.9997074 0.9668969 -0.9668922 0.9997074 0.9668969 -0.9668969 0.9997074 0.9668969 -0.9669028 0.9997074 0.9668969 -0.9669103 0.9997074 0.9668969 -0.9669198 0.9997074 0.9668969 -0.9669318 0.9997074 0.9668969 -0.966947 0.9997074 0.9668969 -0.9669663 0.9997074 0.9668969 -0.9669906 0.9997074 0.9668969 -0.9670214 0.9997074 0.9668969 -0.9670604 0.9997074 0.9668969 -0.9671097 0.9997074 0.9668969 -0.967172 0.9997074 0.9668969 -0.9672509 0.9997074 0.9668969 -0.9673508 0.9997074 0.9668969 -0.967477 0.9997074 0.9668969 -0.9676368 0.9997074 0.9668969 -0.9678389 0.9997074 0.9668969 -0.9680946 0.9997074 0.9668969 -0.9684181 0.9997074 0.9668969 -0.9688274 0.9997074 0.9668969 -0.9693452 0.9997074 0.9668969 -0.9700002 0.9997074 0.9668969 -0.970829 0.9997074 0.9668969 -0.9718774 0.9997074 0.9668969 -0.9732039 0.9997074 0.9668969 -0.974882 0.9997074 0.9668969 -0.977005 0.9997074 0.9668969 -0.9796909 0.9997074 0.9668969 -0.983089 0.9997074 0.9668969 -0.9873879 0.9997074 0.9668969 -0.9928267 0.9997074 0.9668969 -0.9997074 0.9997074 0.9668969 -0.9997688 0.9942982 0.9736786 -0.9998174 0.9920392 0.9790965 -0.9998557 0.9915316 0.9834153 -0.999886 0.9919377 0.986852 -0.9999099 0.9927678 0.9895829 -0.9999288 0.9937442 0.9917507 -0.9999437 0.9947172 0.9934698 -0.9736726 0.9997689 0.9736865 -0.9736726 0.9997689 0.9736864 -0.9736725 0.9997689 0.9736863 -0.9736724 0.9997689 0.9736861 -0.9736723 0.9997689 0.9736859 -0.9736722 0.9997689 0.9736856 -0.9736721 0.9997689 0.9736853 -0.9736719 0.9997689 0.9736849 -0.9736717 0.9997689 0.9736844 -0.9736715 0.9997689 0.9736839 -0.9736712 0.9997689 0.9736832 -0.973671 0.9997689 0.9736824 -0.9736708 0.9997689 0.9736815 -0.9736708 0.9997689 0.9736805 -0.973671 0.9997688 0.9736796 -0.9736717 0.9997688 0.9736788 -0.9736733 0.9997688 0.9736786 -0.9736756 0.9997688 0.9736786 -0.9736786 0.9997688 0.9736786 -0.9736823 0.9997688 0.9736786 -0.973687 0.9997688 0.9736786 -0.973693 0.9997688 0.9736786 -0.9737006 0.9997688 0.9736786 -0.9737101 0.9997688 0.9736786 -0.9737222 0.9997688 0.9736786 -0.9737375 0.9997688 0.9736786 -0.9737569 0.9997688 0.9736786 -0.9737814 0.9997688 0.9736786 -0.9738123 0.9997688 0.9736786 -0.9738515 0.9997688 0.9736786 -0.9739011 0.9997688 0.9736786 -0.9739638 0.9997688 0.9736786 -0.9740432 0.9997688 0.9736786 -0.9741436 0.9997688 0.9736786 -0.9742706 0.9997688 0.9736786 -0.9744313 0.9997688 0.9736786 -0.9746346 0.9997688 0.9736786 -0.9748918 0.9997688 0.9736786 -0.9752172 0.9997688 0.9736786 -0.9756289 0.9997688 0.9736786 -0.9761497 0.9997688 0.9736786 -0.9768086 0.9997688 0.9736786 -0.9776422 0.9997688 0.9736786 -0.9786968 0.9997688 0.9736786 -0.980031 0.9997688 0.9736786 -0.981719 0.9997688 0.9736786 -0.9838545 0.9997688 0.9736786 -0.9865561 0.9997688 0.9736786 -0.9899741 0.9997688 0.9736786 -0.9942982 0.9997688 0.9736786 -0.9997688 0.9997688 0.9736786 -0.9998174 0.9954731 0.9790965 -0.9998557 0.9936849 0.9834153 -0.999886 0.993287 0.986852 -0.9999099 0.9936128 0.9895829 -0.9999288 0.9942731 0.9917507 -0.9999437 0.9950481 0.9934698 -0.9790927 0.9998174 0.9791014 -0.9790927 0.9998174 0.9791014 -0.9790927 0.9998174 0.9791013 -0.9790926 0.9998174 0.9791012 -0.9790925 0.9998174 0.979101 -0.9790925 0.9998174 0.9791009 -0.9790924 0.9998174 0.9791007 -0.9790923 0.9998174 0.9791004 -0.9790921 0.9998174 0.9791001 -0.979092 0.9998174 0.9790998 -0.9790919 0.9998174 0.9790993 -0.9790917 0.9998174 0.9790988 -0.9790916 0.9998174 0.9790983 -0.9790916 0.9998174 0.9790977 -0.9790917 0.9998174 0.9790971 -0.9790921 0.9998174 0.9790966 -0.9790931 0.9998174 0.9790965 -0.9790946 0.9998174 0.9790965 -0.9790965 0.9998174 0.9790965 -0.9790988 0.9998174 0.9790965 -0.9791018 0.9998174 0.9790965 -0.9791055 0.9998174 0.9790965 -0.9791103 0.9998174 0.9790965 -0.9791163 0.9998174 0.9790965 -0.9791238 0.9998174 0.9790965 -0.9791334 0.9998174 0.9790965 -0.9791456 0.9998174 0.9790965 -0.979161 0.9998174 0.9790965 -0.9791804 0.9998174 0.9790965 -0.979205 0.9998174 0.9790965 -0.9792361 0.9998174 0.9790965 -0.9792755 0.9998174 0.9790965 -0.9793253 0.9998174 0.9790965 -0.9793883 0.9998174 0.9790965 -0.9794681 0.9998174 0.9790965 -0.9795689 0.9998174 0.9790965 -0.9796966 0.9998174 0.9790965 -0.979858 0.9998174 0.9790965 -0.9800622 0.9998174 0.9790965 -0.9803206 0.9998174 0.9790965 -0.9806476 0.9998174 0.9790965 -0.9810611 0.9998174 0.9790965 -0.9815844 0.9998174 0.9790965 -0.9822464 0.9998174 0.9790965 -0.9830838 0.9998174 0.9790965 -0.9841433 0.9998174 0.9790965 -0.9854838 0.9998174 0.9790965 -0.9871796 0.9998174 0.9790965 -0.989325 0.9998174 0.9790965 -0.9920392 0.9998174 0.9790965 -0.9954731 0.9998174 0.9790965 -0.9998174 0.9998174 0.9790965 -0.9998557 0.9964092 0.9834153 -0.999886 0.9949941 0.986852 -0.9999099 0.9946818 0.9895829 -0.9999288 0.9949422 0.9917507 -0.9999437 0.9954668 0.9934698 -0.9834129 0.9998557 0.9834184 -0.9834129 0.9998557 0.9834184 -0.9834129 0.9998557 0.9834183 -0.9834129 0.9998557 0.9834182 -0.9834128 0.9998557 0.9834182 -0.9834128 0.9998557 0.9834181 -0.9834127 0.9998557 0.9834179 -0.9834127 0.9998557 0.9834178 -0.9834126 0.9998557 0.9834176 -0.9834125 0.9998557 0.9834174 -0.9834124 0.9998557 0.9834171 -0.9834123 0.9998557 0.9834168 -0.9834122 0.9998557 0.9834164 -0.9834122 0.9998557 0.983416 -0.9834123 0.9998557 0.9834157 -0.9834126 0.9998557 0.9834154 -0.9834132 0.9998557 0.9834153 -0.9834141 0.9998557 0.9834153 -0.9834153 0.9998557 0.9834153 -0.9834167 0.9998557 0.9834153 -0.9834186 0.9998557 0.9834153 -0.9834209 0.9998557 0.9834153 -0.9834239 0.9998557 0.9834153 -0.9834277 0.9998557 0.9834153 -0.9834324 0.9998557 0.9834153 -0.9834385 0.9998557 0.9834153 -0.9834461 0.9998557 0.9834153 -0.9834557 0.9998557 0.9834153 -0.9834679 0.9998557 0.9834153 -0.9834833 0.9998557 0.9834153 -0.9835029 0.9998557 0.9834153 -0.9835276 0.9998557 0.9834153 -0.9835588 0.9998557 0.9834153 -0.9835983 0.9998557 0.9834153 -0.9836483 0.9998557 0.9834153 -0.9837116 0.9998557 0.9834153 -0.9837916 0.9998557 0.9834153 -0.9838928 0.9998557 0.9834153 -0.9840209 0.9998557 0.9834153 -0.9841829 0.9998557 0.9834153 -0.984388 0.9998557 0.9834153 -0.9846473 0.9998557 0.9834153 -0.9849754 0.9998557 0.9834153 -0.9853905 0.9998557 0.9834153 -0.9859157 0.9998557 0.9834153 -0.9865801 0.9998557 0.9834153 -0.9874207 0.9998557 0.9834153 -0.9884841 0.9998557 0.9834153 -0.9898295 0.9998557 0.9834153 -0.9915316 0.9998557 0.9834153 -0.9936849 0.9998557 0.9834153 -0.9964092 0.9998557 0.9834153 -0.9998557 0.9998557 0.9834153 -0.999886 0.9971537 0.986852 -0.9999099 0.9960342 0.9895829 -0.9999288 0.9957887 0.9917507 -0.9999437 0.9959964 0.9934698 -0.9868505 0.999886 0.9868539 -0.9868505 0.999886 0.9868539 -0.9868505 0.999886 0.9868539 -0.9868505 0.999886 0.9868538 -0.9868504 0.999886 0.9868538 -0.9868504 0.999886 0.9868537 -0.9868504 0.999886 0.9868536 -0.9868503 0.999886 0.9868535 -0.9868503 0.999886 0.9868534 -0.9868502 0.999886 0.9868533 -0.9868502 0.999886 0.9868531 -0.9868501 0.999886 0.9868529 -0.9868501 0.999886 0.9868527 -0.98685 0.999886 0.9868524 -0.9868501 0.999886 0.9868522 -0.9868503 0.999886 0.986852 -0.9868507 0.999886 0.986852 -0.9868512 0.999886 0.986852 -0.986852 0.999886 0.986852 -0.9868529 0.999886 0.986852 -0.9868541 0.999886 0.986852 -0.9868555 0.999886 0.986852 -0.9868574 0.999886 0.986852 -0.9868597 0.999886 0.986852 -0.9868627 0.999886 0.986852 -0.9868665 0.999886 0.986852 -0.9868713 0.999886 0.986852 -0.9868773 0.999886 0.986852 -0.986885 0.999886 0.986852 -0.9868946 0.999886 0.986852 -0.9869069 0.999886 0.986852 -0.9869223 0.999886 0.986852 -0.9869419 0.999886 0.986852 -0.9869667 0.999886 0.986852 -0.986998 0.999886 0.986852 -0.9870376 0.999886 0.986852 -0.9870878 0.999886 0.986852 -0.9871512 0.999886 0.986852 -0.9872315 0.999886 0.986852 -0.987333 0.999886 0.986852 -0.9874615 0.999886 0.986852 -0.987624 0.999886 0.986852 -0.9878296 0.999886 0.986852 -0.9880897 0.999886 0.986852 -0.9884188 0.999886 0.986852 -0.9888351 0.999886 0.986852 -0.9893618 0.999886 0.986852 -0.9900282 0.999886 0.986852 -0.9908712 0.999886 0.986852 -0.9919377 0.999886 0.986852 -0.993287 0.999886 0.986852 -0.9949941 0.999886 0.986852 -0.9971537 0.999886 0.986852 -0.999886 0.999886 0.986852 -0.9999099 0.9977452 0.9895829 -0.9999288 0.9968597 0.9917507 -0.9999437 0.9966665 0.9934698 -0.989582 0.9999099 0.9895841 -0.989582 0.9999099 0.9895841 -0.989582 0.9999099 0.9895841 -0.989582 0.9999099 0.9895841 -0.989582 0.9999099 0.9895841 -0.9895819 0.9999099 0.989584 -0.9895819 0.9999099 0.989584 -0.9895819 0.9999099 0.9895839 -0.9895819 0.9999099 0.9895838 -0.9895818 0.9999099 0.9895837 -0.9895818 0.9999099 0.9895836 -0.9895818 0.9999099 0.9895835 -0.9895817 0.9999099 0.9895834 -0.9895817 0.9999099 0.9895832 -0.9895817 0.9999099 0.9895831 -0.9895819 0.9999099 0.989583 -0.9895821 0.9999099 0.9895829 -0.9895825 0.9999099 0.9895829 -0.9895829 0.9999099 0.9895829 -0.9895835 0.9999099 0.9895829 -0.9895842 0.9999099 0.9895829 -0.9895851 0.9999099 0.9895829 -0.9895863 0.9999099 0.9895829 -0.9895878 0.9999099 0.9895829 -0.9895897 0.9999099 0.9895829 -0.989592 0.9999099 0.9895829 -0.989595 0.9999099 0.9895829 -0.9895988 0.9999099 0.9895829 -0.9896036 0.9999099 0.9895829 -0.9896096 0.9999099 0.9895829 -0.9896173 0.9999099 0.9895829 -0.989627 0.9999099 0.9895829 -0.9896392 0.9999099 0.9895829 -0.9896547 0.9999099 0.9895829 -0.9896744 0.9999099 0.9895829 -0.9896992 0.9999099 0.9895829 -0.9897306 0.9999099 0.9895829 -0.9897703 0.9999099 0.9895829 -0.9898206 0.9999099 0.9895829 -0.9898842 0.9999099 0.9895829 -0.9899646 0.9999099 0.9895829 -0.9900664 0.9999099 0.9895829 -0.9901951 0.9999099 0.9895829 -0.990358 0.9999099 0.9895829 -0.9905641 0.9999099 0.9895829 -0.9908248 0.9999099 0.9895829 -0.9911547 0.9999099 0.9895829 -0.991572 0.9999099 0.9895829 -0.9920999 0.9999099 0.9895829 -0.9927678 0.9999099 0.9895829 -0.9936128 0.9999099 0.9895829 -0.9946818 0.9999099 0.9895829 -0.9960342 0.9999099 0.9895829 -0.9977452 0.9999099 0.9895829 -0.9999099 0.9999099 0.9895829 -0.9999288 0.9982146 0.9917507 -0.9999437 0.9975143 0.9934698 -0.9917501 0.9999288 0.9917514 -0.9917501 0.9999288 0.9917514 -0.9917501 0.9999288 0.9917514 -0.9917501 0.9999288 0.9917514 -0.9917501 0.9999288 0.9917514 -0.9917501 0.9999288 0.9917514 -0.99175 0.9999288 0.9917513 -0.99175 0.9999288 0.9917513 -0.99175 0.9999288 0.9917512 -0.99175 0.9999288 0.9917512 -0.99175 0.9999288 0.9917511 -0.9917499 0.9999288 0.991751 -0.9917499 0.9999288 0.9917509 -0.9917499 0.9999288 0.9917509 -0.9917499 0.9999288 0.9917508 -0.99175 0.9999288 0.9917507 -0.9917502 0.9999288 0.9917507 -0.9917504 0.9999288 0.9917507 -0.9917507 0.9999288 0.9917507 -0.991751 0.9999288 0.9917507 -0.9917515 0.9999288 0.9917507 -0.9917521 0.9999288 0.9917507 -0.9917528 0.9999288 0.9917507 -0.9917537 0.9999288 0.9917507 -0.9917549 0.9999288 0.9917507 -0.9917564 0.9999288 0.9917507 -0.9917582 0.9999288 0.9917507 -0.9917606 0.9999288 0.9917507 -0.9917636 0.9999288 0.9917507 -0.9917674 0.9999288 0.9917507 -0.9917722 0.9999288 0.9917507 -0.9917782 0.9999288 0.9917507 -0.9917859 0.9999288 0.9917507 -0.9917956 0.9999288 0.9917507 -0.9918079 0.9999288 0.9917507 -0.9918234 0.9999288 0.9917507 -0.9918431 0.9999288 0.9917507 -0.991868 0.9999288 0.9917507 -0.9918994 0.9999288 0.9917507 -0.9919392 0.9999288 0.9917507 -0.9919896 0.9999288 0.9917507 -0.9920533 0.9999288 0.9917507 -0.9921339 0.9999288 0.9917507 -0.9922358 0.9999288 0.9917507 -0.9923648 0.9999288 0.9917507 -0.992528 0.9999288 0.9917507 -0.9927345 0.9999288 0.9917507 -0.9929957 0.9999288 0.9917507 -0.9933261 0.9999288 0.9917507 -0.9937442 0.9999288 0.9917507 -0.9942731 0.9999288 0.9917507 -0.9949422 0.9999288 0.9917507 -0.9957887 0.9999288 0.9917507 -0.9968597 0.9999288 0.9917507 -0.9982146 0.9999288 0.9917507 -0.9999288 0.9999288 0.9917507 -0.9999437 0.9985868 0.9934698 -0.9934695 0.9999437 0.9934703 -0.9934695 0.9999437 0.9934703 -0.9934695 0.9999437 0.9934703 -0.9934695 0.9999437 0.9934703 -0.9934695 0.9999437 0.9934703 -0.9934695 0.9999437 0.9934703 -0.9934695 0.9999437 0.9934703 -0.9934694 0.9999437 0.9934702 -0.9934694 0.9999437 0.9934702 -0.9934694 0.9999437 0.9934702 -0.9934694 0.9999437 0.9934701 -0.9934694 0.9999437 0.9934701 -0.9934694 0.9999437 0.99347 -0.9934694 0.9999437 0.99347 -0.9934694 0.9999437 0.9934699 -0.9934694 0.9999437 0.9934699 -0.9934695 0.9999437 0.9934698 -0.9934697 0.9999437 0.9934698 -0.9934698 0.9999437 0.9934698 -0.9934701 0.9999437 0.9934698 -0.9934704 0.9999437 0.9934698 -0.9934707 0.9999437 0.9934698 -0.9934712 0.9999437 0.9934698 -0.9934718 0.9999437 0.9934698 -0.9934725 0.9999437 0.9934698 -0.9934734 0.9999437 0.9934698 -0.9934746 0.9999437 0.9934698 -0.9934761 0.9999437 0.9934698 -0.9934779 0.9999437 0.9934698 -0.9934803 0.9999437 0.9934698 -0.9934833 0.9999437 0.9934698 -0.9934871 0.9999437 0.9934698 -0.9934919 0.9999437 0.9934698 -0.993498 0.9999437 0.9934698 -0.9935057 0.9999437 0.9934698 -0.9935154 0.9999437 0.9934698 -0.9935277 0.9999437 0.9934698 -0.9935432 0.9999437 0.9934698 -0.9935629 0.9999437 0.9934698 -0.9935878 0.9999437 0.9934698 -0.9936193 0.9999437 0.9934698 -0.9936592 0.9999437 0.9934698 -0.9937096 0.9999437 0.9934698 -0.9937734 0.9999437 0.9934698 -0.9938541 0.9999437 0.9934698 -0.9939562 0.9999437 0.9934698 -0.9940854 0.9999437 0.9934698 -0.9942488 0.9999437 0.9934698 -0.9944556 0.9999437 0.9934698 -0.9947172 0.9999437 0.9934698 -0.9950481 0.9999437 0.9934698 -0.9954668 0.9999437 0.9934698 -0.9959964 0.9999437 0.9934698 -0.9966665 0.9999437 0.9934698 -0.9975143 0.9999437 0.9934698 -0.9985868 0.9999437 0.9934698 -0.9999437 0.9999437 0.9934698 -0.0000238 0.0000238 0.1684036 -0.0005417 0.0000238 0.1684036 -0.0011968 0.0000238 0.1684036 -0.0020256 0.0000238 0.1684036 -0.0030742 0.0000238 0.1684036 -0.0044007 0.0000238 0.1684036 -0.006079 0.0000238 0.1684036 -0.0082023 0.0000238 0.1684036 -0.0108885 0.0000238 0.1684036 -0.0142868 0.0000238 0.1684036 -0.0185862 0.0000238 0.1684036 -0.0240255 0.0000238 0.1684036 -0.0309069 0.0000238 0.1684036 -0.0396127 0.0000238 0.1684036 -0.0506267 0.0000238 0.1684036 -0.0645609 0.0000238 0.1684036 -0.0821895 0.0000238 0.1684036 -0.1044919 0.0000238 0.1684036 -0.1327073 0.0000238 0.1684036 -0.1684036 0.0000238 0.1684036 -0.2135639 0.0000238 0.1684036 -0.2706977 0.0000238 0.1684036 -0.3429792 0.0000238 0.1684036 -0.4344249 0.0000238 0.1684036 -0.5501155 0.0000238 0.1684036 -0.6964791 0.0000238 0.1684036 -0.8407292 0.0051514 0.1647368 -0.9033413 0.0279321 0.1600254 -0.9354466 0.0624569 0.166541 -0.9545467 0.1059991 0.1859439 -0.9669269 0.1572498 0.2175323 -0.9754027 0.2151269 0.2598608 -0.9814251 0.2783684 0.3110617 -0.9858181 0.3454107 0.3689471 -0.9890841 0.4144197 0.4311123 -0.9915469 0.4834235 0.4950892 -0.993424 0.5504963 0.5585337 -0.9948662 0.6139459 0.6194093 -0.9959813 0.6724572 0.6761248 -0.9968475 0.7251659 0.7276003 -0.997523 0.7716588 0.7732585 -0.9980513 0.8119154 0.8129574 -0.9984653 0.8462171 0.8468908 -0.9987905 0.8750477 0.8754805 -0.9990461 0.8990028 0.8992794 -0.9992474 0.9187175 0.9188935 -0.999406 0.9348153 0.9349268 -0.999531 0.9478754 0.9479459 -0.9996296 0.958416 0.9584605 -0.9997074 0.9668873 0.9669153 -0.9997689 0.9736726 0.9736902 -0.9998174 0.9790927 0.9791038 -0.9998557 0.9834129 0.9834199 -0.999886 0.9868505 0.9868548 -0.9999099 0.989582 0.9895847 -0.9999288 0.9917501 0.9917518 -0.9999437 0.9934695 0.9934706 -0.0000238 0.0005417 0.1684036 -0.0000382 0.0000382 0.1679 -0.0006933 0.0000382 0.1679 -0.0015221 0.0000382 0.1679 -0.0025707 0.0000382 0.1679 -0.0038972 0.0000382 0.1679 -0.0055755 0.0000382 0.1679 -0.0076988 0.0000382 0.1679 -0.0103849 0.0000382 0.1679 -0.0137833 0.0000382 0.1679 -0.0180827 0.0000382 0.1679 -0.023522 0.0000382 0.1679 -0.0304033 0.0000382 0.1679 -0.0391092 0.0000382 0.1679 -0.0501232 0.0000382 0.1679 -0.0640574 0.0000382 0.1679 -0.081686 0.0000382 0.1679 -0.1039884 0.0000382 0.1679 -0.1322038 0.0000382 0.1679 -0.1679 0.0000382 0.1679 -0.2130604 0.0000382 0.1679 -0.2701941 0.0000382 0.1679 -0.3424757 0.0000382 0.1679 -0.4339214 0.0000382 0.1679 -0.549612 0.0000382 0.1679 -0.6959756 0.0000382 0.1679 -0.8405071 0.0051286 0.1642787 -0.9032596 0.0278872 0.1596298 -0.9354101 0.0624063 0.16621 -0.9545286 0.1059489 0.185674 -0.9669173 0.1572031 0.2173167 -0.9753975 0.2150852 0.2596918 -0.9814221 0.2783325 0.3109315 -0.9858163 0.3453807 0.3688485 -0.9890831 0.4143955 0.431039 -0.9915463 0.4834045 0.4950356 -0.9934236 0.5504818 0.5584953 -0.994866 0.6139352 0.6193822 -0.9959811 0.6724495 0.676106 -0.9968474 0.7251605 0.7275875 -0.997523 0.7716551 0.7732499 -0.9980512 0.8119128 0.8129517 -0.9984653 0.8462154 0.846887 -0.9987905 0.8750466 0.875478 -0.9990461 0.899002 0.8992778 -0.9992474 0.918717 0.9188925 -0.999406 0.9348149 0.9349262 -0.999531 0.9478752 0.9479455 -0.9996296 0.9584159 0.9584602 -0.9997074 0.9668872 0.9669152 -0.9997689 0.9736726 0.9736901 -0.9998174 0.9790927 0.9791037 -0.9998557 0.9834129 0.9834198 -0.999886 0.9868505 0.9868548 -0.9999099 0.989582 0.9895847 -0.9999288 0.9917501 0.9917518 -0.9999437 0.9934695 0.9934705 -0.0000238 0.0011968 0.1684036 -0.0000382 0.0006933 0.1679 -0.0000611 0.0000611 0.1672678 -0.0008899 0.0000611 0.1672678 -0.0019385 0.0000611 0.1672678 -0.003265 0.0000611 0.1672678 -0.0049433 0.0000611 0.1672678 -0.0070666 0.0000611 0.1672678 -0.0097527 0.0000611 0.1672678 -0.0131511 0.0000611 0.1672678 -0.0174505 0.0000611 0.1672678 -0.0228898 0.0000611 0.1672678 -0.0297711 0.0000611 0.1672678 -0.038477 0.0000611 0.1672678 -0.049491 0.0000611 0.1672678 -0.0634252 0.0000611 0.1672678 -0.0810538 0.0000611 0.1672678 -0.1033562 0.0000611 0.1672678 -0.1315716 0.0000611 0.1672678 -0.1672678 0.0000611 0.1672678 -0.2124282 0.0000611 0.1672678 -0.2695619 0.0000611 0.1672678 -0.3418435 0.0000611 0.1672678 -0.4332891 0.0000611 0.1672678 -0.5489798 0.0000611 0.1672678 -0.6953434 0.0000611 0.1672678 -0.8402274 0.0051047 0.1637031 -0.9031567 0.0278347 0.1591327 -0.9353643 0.0623458 0.1657941 -0.9545059 0.1058883 0.1853349 -0.9669053 0.1571463 0.217046 -0.9753908 0.2150342 0.2594794 -0.9814183 0.2782884 0.3107679 -0.9858141 0.3453439 0.3687246 -0.9890818 0.4143657 0.4309468 -0.9915455 0.4833811 0.4949683 -0.9934231 0.550464 0.558447 -0.9948657 0.6139219 0.6193482 -0.9959809 0.6724399 0.6760824 -0.9968473 0.7251537 0.7275714 -0.9975229 0.7716504 0.7732391 -0.9980512 0.8119096 0.8129445 -0.9984653 0.8462132 0.8468823 -0.9987904 0.8750451 0.8754749 -0.9990461 0.8990011 0.8992758 -0.9992474 0.9187164 0.9188912 -0.999406 0.9348146 0.9349253 -0.999531 0.947875 0.947945 -0.9996296 0.9584157 0.9584599 -0.9997074 0.9668871 0.9669149 -0.9997689 0.9736725 0.97369 -0.9998174 0.9790927 0.9791036 -0.9998557 0.9834129 0.9834198 -0.999886 0.9868505 0.9868548 -0.9999099 0.989582 0.9895847 -0.9999288 0.9917501 0.9917518 -0.9999437 0.9934695 0.9934705 -0.0000238 0.0020256 0.1684036 -0.0000382 0.0015221 0.1679 -0.0000611 0.0008899 0.1672678 -0.0000978 0.0000978 0.1664757 -0.0011463 0.0000978 0.1664757 -0.0024729 0.0000978 0.1664757 -0.0041512 0.0000978 0.1664757 -0.0062744 0.0000978 0.1664757 -0.0089606 0.0000978 0.1664757 -0.012359 0.0000978 0.1664757 -0.0166583 0.0000978 0.1664757 -0.0220976 0.0000978 0.1664757 -0.028979 0.0000978 0.1664757 -0.0376849 0.0000978 0.1664757 -0.0486989 0.0000978 0.1664757 -0.0626331 0.0000978 0.1664757 -0.0802616 0.0000978 0.1664757 -0.102564 0.0000978 0.1664757 -0.1307795 0.0000978 0.1664757 -0.1664757 0.0000978 0.1664757 -0.2116361 0.0000978 0.1664757 -0.2687698 0.0000978 0.1664757 -0.3410514 0.0000978 0.1664757 -0.432497 0.0000978 0.1664757 -0.5481876 0.0000978 0.1664757 -0.6945513 0.0000978 0.1664757 -0.8398756 0.0050826 0.1629812 -0.9030276 0.0277752 0.1585092 -0.9353068 0.0622749 0.1652725 -0.9544774 0.1058162 0.1849097 -0.9668902 0.1570779 0.2167065 -0.9753825 0.2149725 0.2592133 -0.9814136 0.2782347 0.3105628 -0.9858113 0.3452987 0.3685693 -0.9890801 0.414329 0.4308314 -0.9915446 0.4833522 0.494884 -0.9934225 0.5504419 0.5583865 -0.9948653 0.6139056 0.6193055 -0.9959807 0.672428 0.6760529 -0.9968472 0.7251454 0.7275513 -0.9975228 0.7716446 0.7732255 -0.9980511 0.8119057 0.8129354 -0.9984653 0.8462106 0.8468763 -0.9987904 0.8750434 0.8754711 -0.9990461 0.899 0.8992733 -0.9992474 0.9187157 0.9188896 -0.999406 0.9348141 0.9349243 -0.999531 0.9478746 0.9479443 -0.9996296 0.9584155 0.9584595 -0.9997074 0.966887 0.9669147 -0.9997689 0.9736724 0.9736898 -0.9998174 0.9790926 0.9791035 -0.9998557 0.9834129 0.9834197 -0.999886 0.9868505 0.9868547 -0.9999099 0.989582 0.9895847 -0.9999288 0.9917501 0.9917518 -0.9999437 0.9934695 0.9934705 -0.0000238 0.0030742 0.1684036 -0.0000382 0.0025707 0.1679 -0.0000611 0.0019385 0.1672678 -0.0000978 0.0011463 0.1664757 -0.0001565 0.0001565 0.1654858 -0.001483 0.0001565 0.1654858 -0.0031613 0.0001565 0.1654858 -0.0052846 0.0001565 0.1654858 -0.0079707 0.0001565 0.1654858 -0.0113691 0.0001565 0.1654858 -0.0156685 0.0001565 0.1654858 -0.0211078 0.0001565 0.1654858 -0.0279891 0.0001565 0.1654858 -0.036695 0.0001565 0.1654858 -0.047709 0.0001565 0.1654858 -0.0616432 0.0001565 0.1654858 -0.0792718 0.0001565 0.1654858 -0.1015742 0.0001565 0.1654858 -0.1297896 0.0001565 0.1654858 -0.1654858 0.0001565 0.1654858 -0.2106462 0.0001565 0.1654858 -0.2677799 0.0001565 0.1654858 -0.3400615 0.0001565 0.1654858 -0.4315072 0.0001565 0.1654858 -0.5471978 0.0001565 0.1654858 -0.6935614 0.0001565 0.1654858 -0.8394338 0.0050676 0.162078 -0.9028657 0.0277111 0.157729 -0.9352348 0.0621943 0.1646199 -0.9544418 0.1057322 0.1843779 -0.9668714 0.1569971 0.2162819 -0.9753721 0.2148987 0.2588805 -0.9814076 0.2781701 0.3103064 -0.9858079 0.3452442 0.3683752 -0.9890781 0.4142845 0.430687 -0.9915433 0.4833171 0.4947786 -0.9934218 0.550415 0.5583108 -0.9948649 0.6138855 0.6192522 -0.9959804 0.6724135 0.6760159 -0.996847 0.7251351 0.7275261 -0.9975227 0.7716375 0.7732085 -0.9980511 0.8119009 0.8129242 -0.9984652 0.8462073 0.8468689 -0.9987904 0.8750412 0.8754663 -0.9990461 0.8989986 0.8992702 -0.9992474 0.9187148 0.9188876 -0.999406 0.9348135 0.934923 -0.999531 0.9478743 0.9479435 -0.9996296 0.9584153 0.9584589 -0.9997074 0.9668869 0.9669144 -0.9997689 0.9736723 0.9736896 -0.9998174 0.9790925 0.9791034 -0.9998557 0.9834128 0.9834196 -0.999886 0.9868504 0.9868547 -0.9999099 0.989582 0.9895846 -0.9999288 0.9917501 0.9917517 -0.9999437 0.9934695 0.9934705 -0.0000238 0.0044007 0.1684036 -0.0000382 0.0038972 0.1679 -0.0000611 0.003265 0.1672678 -0.0000978 0.0024729 0.1664757 -0.0001565 0.001483 0.1654858 -0.0002504 0.0002504 0.1642532 -0.0019287 0.0002504 0.1642532 -0.004052 0.0002504 0.1642532 -0.0067381 0.0002504 0.1642532 -0.0101365 0.0002504 0.1642532 -0.0144359 0.0002504 0.1642532 -0.0198752 0.0002504 0.1642532 -0.0267565 0.0002504 0.1642532 -0.0354624 0.0002504 0.1642532 -0.0464764 0.0002504 0.1642532 -0.0604106 0.0002504 0.1642532 -0.0780392 0.0002504 0.1642532 -0.1003416 0.0002504 0.1642532 -0.128557 0.0002504 0.1642532 -0.1642532 0.0002504 0.1642532 -0.2094136 0.0002504 0.1642532 -0.2665473 0.0002504 0.1642532 -0.3388289 0.0002504 0.1642532 -0.4302746 0.0002504 0.1642532 -0.5459652 0.0002504 0.1642532 -0.6923288 0.0002504 0.1642532 -0.8388802 0.0050694 0.1609516 -0.9026634 0.0276479 0.156756 -0.9351449 0.0621069 0.1638062 -0.9543974 0.1056375 0.1837149 -0.9668479 0.156904 0.2157528 -0.9753591 0.2148124 0.2584657 -0.9814002 0.2780936 0.309987 -0.9858036 0.3451791 0.3681334 -0.9890755 0.4142311 0.4305072 -0.9915418 0.4832747 0.4946472 -0.9934209 0.5503825 0.5582166 -0.9948643 0.6138613 0.6191858 -0.9959801 0.6723959 0.6759699 -0.9968468 0.7251226 0.7274947 -0.9975226 0.7716288 0.7731874 -0.998051 0.8118949 0.8129101 -0.9984652 0.8462034 0.8468597 -0.9987904 0.8750386 0.8754602 -0.9990461 0.8989969 0.8992663 -0.9992474 0.9187137 0.9188851 -0.9994059 0.9348128 0.9349215 -0.999531 0.9478738 0.9479425 -0.9996296 0.958415 0.9584583 -0.9997074 0.9668867 0.966914 -0.9997689 0.9736722 0.9736894 -0.9998174 0.9790925 0.9791032 -0.9998557 0.9834128 0.9834195 -0.999886 0.9868504 0.9868546 -0.9999099 0.9895819 0.9895846 -0.9999288 0.9917501 0.9917517 -0.9999437 0.9934695 0.9934705 -0.0000238 0.006079 0.1684036 -0.0000382 0.0055755 0.1679 -0.0000611 0.0049433 0.1672678 -0.0000978 0.0041512 0.1664757 -0.0001565 0.0031613 0.1654858 -0.0002504 0.0019287 0.1642532 -0.0004008 0.0004008 0.1627254 -0.0025241 0.0004008 0.1627254 -0.0052103 0.0004008 0.1627254 -0.0086086 0.0004008 0.1627254 -0.012908 0.0004008 0.1627254 -0.0183473 0.0004008 0.1627254 -0.0252287 0.0004008 0.1627254 -0.0339345 0.0004008 0.1627254 -0.0449485 0.0004008 0.1627254 -0.0588827 0.0004008 0.1627254 -0.0765113 0.0004008 0.1627254 -0.0988137 0.0004008 0.1627254 -0.1270291 0.0004008 0.1627254 -0.1627254 0.0004008 0.1627254 -0.2078857 0.0004008 0.1627254 -0.2650195 0.0004008 0.1627254 -0.337301 0.0004008 0.1627254 -0.4287467 0.0004008 0.1627254 -0.5444373 0.0004008 0.1627254 -0.6908009 0.0004008 0.1627254 -0.8381886 0.0051048 0.1595528 -0.9024114 0.0275966 0.1555474 -0.9350332 0.0620199 0.1627957 -0.9543421 0.1055364 0.1828918 -0.9668187 0.1568008 0.215096 -0.975343 0.2147144 0.2579511 -0.9813911 0.2780055 0.3095906 -0.9857982 0.3451032 0.3678335 -0.9890723 0.4141683 0.4302842 -0.9915399 0.4832246 0.4944844 -0.9934197 0.5503438 0.5580998 -0.9948636 0.6138323 0.6191035 -0.9959797 0.6723748 0.6759129 -0.9968465 0.7251076 0.7274557 -0.9975224 0.7716184 0.7731612 -0.9980509 0.8118878 0.8128927 -0.9984651 0.8461986 0.8468482 -0.9987903 0.8750355 0.8754528 -0.9990461 0.8989948 0.8992615 -0.9992473 0.9187123 0.918882 -0.9994059 0.9348119 0.9349195 -0.999531 0.9478733 0.9479413 -0.9996296 0.9584146 0.9584575 -0.9997074 0.9668865 0.9669135 -0.9997689 0.9736721 0.973689 -0.9998174 0.9790924 0.979103 -0.9998557 0.9834127 0.9834194 -0.999886 0.9868504 0.9868546 -0.9999099 0.9895819 0.9895845 -0.9999288 0.99175 0.9917517 -0.9999437 0.9934695 0.9934705 -0.0000238 0.0082023 0.1684036 -0.0000382 0.0076988 0.1679 -0.0000611 0.0070666 0.1672678 -0.0000978 0.0062744 0.1664757 -0.0001565 0.0052846 0.1654858 -0.0002504 0.004052 0.1642532 -0.0004008 0.0025241 0.1627254 -0.0006416 0.0006416 0.1608428 -0.0033277 0.0006416 0.1608428 -0.0067261 0.0006416 0.1608428 -0.0110255 0.0006416 0.1608428 -0.0164648 0.0006416 0.1608428 -0.0233461 0.0006416 0.1608428 -0.032052 0.0006416 0.1608428 -0.043066 0.0006416 0.1608428 -0.0570002 0.0006416 0.1608428 -0.0746288 0.0006416 0.1608428 -0.0969312 0.0006416 0.1608428 -0.1251466 0.0006416 0.1608428 -0.1608428 0.0006416 0.1608428 -0.2060032 0.0006416 0.1608428 -0.2631369 0.0006416 0.1608428 -0.3354185 0.0006416 0.1608428 -0.4268641 0.0006416 0.1608428 -0.5425548 0.0006416 0.1608428 -0.6889184 0.0006416 0.1608428 -0.8373283 0.0052028 0.1578254 -0.9020992 0.0275778 0.1540546 -0.9348949 0.0619473 0.1615479 -0.9542739 0.1054384 0.1818757 -0.9667827 0.1566936 0.2142855 -0.9753231 0.2146085 0.2573162 -0.9813797 0.2779077 0.3091018 -0.9857916 0.3450175 0.3674636 -0.9890684 0.4140964 0.4300092 -0.9915376 0.4831666 0.4942836 -0.9934183 0.5502987 0.5579558 -0.9948628 0.6137984 0.619002 -0.9959791 0.67235 0.6758426 -0.9968462 0.7250899 0.7274078 -0.9975222 0.7716061 0.7731289 -0.9980508 0.8118794 0.8128713 -0.998465 0.8461929 0.8468341 -0.9987903 0.8750317 0.8754436 -0.999046 0.8989923 0.8992555 -0.9992473 0.9187107 0.9188782 -0.9994059 0.9348109 0.934917 -0.999531 0.9478726 0.9479397 -0.9996296 0.9584142 0.9584565 -0.9997074 0.9668862 0.9669128 -0.9997689 0.9736719 0.9736886 -0.9998174 0.9790923 0.9791028 -0.9998557 0.9834127 0.9834192 -0.999886 0.9868503 0.9868545 -0.9999099 0.9895819 0.9895845 -0.9999288 0.99175 0.9917516 -0.9999437 0.9934694 0.9934705 -0.0000238 0.0108885 0.1684036 -0.0000382 0.0103849 0.1679 -0.0000611 0.0097527 0.1672678 -0.0000978 0.0089606 0.1664757 -0.0001565 0.0079707 0.1654858 -0.0002504 0.0067381 0.1642532 -0.0004008 0.0052103 0.1627254 -0.0006416 0.0033277 0.1608428 -0.0010268 0.0010268 0.1585419 -0.0044252 0.0010268 0.1585419 -0.0087246 0.0010268 0.1585419 -0.0141639 0.0010268 0.1585419 -0.0210452 0.0010268 0.1585419 -0.0297511 0.0010268 0.1585419 -0.0407651 0.0010268 0.1585419 -0.0546993 0.0010268 0.1585419 -0.0723279 0.0010268 0.1585419 -0.0946303 0.0010268 0.1585419 -0.1228457 0.0010268 0.1585419 -0.1585419 0.0010268 0.1585419 -0.2037023 0.0010268 0.1585419 -0.260836 0.0010268 0.1585419 -0.3331176 0.0010268 0.1585419 -0.4245633 0.0010268 0.1585419 -0.5402539 0.0010268 0.1585419 -0.6866175 0.0010268 0.1585419 -0.8362644 0.0054121 0.1557082 -0.9017148 0.0276281 0.1522245 -0.9347252 0.061916 0.1600186 -0.9541902 0.1053624 0.180631 -0.9667385 0.1565954 0.2132931 -0.9752987 0.2145034 0.256539 -0.9813659 0.2778058 0.3085036 -0.9857835 0.3449254 0.367011 -0.9890637 0.4140176 0.4296728 -0.9915347 0.4831021 0.494038 -0.9934166 0.550248 0.5577798 -0.9948617 0.6137599 0.618878 -0.9959785 0.6723217 0.6757566 -0.9968458 0.7250697 0.7273491 -0.997522 0.7715919 0.7730895 -0.9980506 0.8118697 0.8128451 -0.9984649 0.8461864 0.8468169 -0.9987902 0.8750274 0.8754324 -0.999046 0.8989895 0.8992483 -0.9992473 0.9187089 0.9188735 -0.9994059 0.9348097 0.9349141 -0.999531 0.9478718 0.9479378 -0.9996296 0.9584137 0.9584553 -0.9997074 0.9668859 0.9669121 -0.9997689 0.9736717 0.9736882 -0.9998174 0.9790921 0.9791025 -0.9998557 0.9834126 0.9834191 -0.999886 0.9868503 0.9868543 -0.9999099 0.9895819 0.9895844 -0.9999288 0.99175 0.9917516 -0.9999437 0.9934694 0.9934704 -0.0000238 0.0142868 0.1684036 -0.0000382 0.0137833 0.1679 -0.0000611 0.0131511 0.1672678 -0.0000978 0.012359 0.1664757 -0.0001565 0.0113691 0.1654858 -0.0002504 0.0101365 0.1642532 -0.0004008 0.0086086 0.1627254 -0.0006416 0.0067261 0.1608428 -0.0010268 0.0044252 0.1585419 -0.0016435 0.0016435 0.1557603 -0.0059429 0.0016435 0.1557603 -0.0113822 0.0016435 0.1557603 -0.0182636 0.0016435 0.1557603 -0.0269694 0.0016435 0.1557603 -0.0379834 0.0016435 0.1557603 -0.0519176 0.0016435 0.1557603 -0.0695462 0.0016435 0.1557603 -0.0918486 0.0016435 0.1557603 -0.120064 0.0016435 0.1557603 -0.1557603 0.0016435 0.1557603 -0.2009206 0.0016435 0.1557603 -0.2580543 0.0016435 0.1557603 -0.3303359 0.0016435 0.1557603 -0.4217816 0.0016435 0.1557603 -0.5374722 0.0016435 0.1557603 -0.6838358 0.0016435 0.1557603 -0.8349593 0.0058134 0.1531399 -0.9012461 0.0278105 0.1500037 -0.9345187 0.0619734 0.1581637 -0.9540886 0.1053433 0.179122 -0.966685 0.1565315 0.2120905 -0.9752692 0.2144168 0.2555977 -0.9813491 0.2777122 0.3077793 -0.9857738 0.3448353 0.3664632 -0.9890579 0.4139373 0.4292657 -0.9915312 0.4830346 0.4937409 -0.9934145 0.5501939 0.5575667 -0.9948604 0.6137183 0.6187279 -0.9959777 0.6722907 0.6756526 -0.9968453 0.7250473 0.7272782 -0.9975217 0.7715762 0.7730418 -0.9980504 0.8118589 0.8128134 -0.9984648 0.8461791 0.8467961 -0.9987902 0.8750225 0.8754188 -0.9990459 0.8989863 0.8992395 -0.9992473 0.9187068 0.9188679 -0.9994059 0.9348083 0.9349105 -0.9995309 0.947871 0.9479355 -0.9996296 0.9584132 0.9584539 -0.9997074 0.9668855 0.9669112 -0.9997689 0.9736715 0.9736876 -0.9998174 0.979092 0.9791021 -0.9998557 0.9834125 0.9834188 -0.999886 0.9868502 0.9868542 -0.9999099 0.9895818 0.9895843 -0.9999288 0.99175 0.9917515 -0.9999437 0.9934694 0.9934704 -0.0000238 0.0185862 0.1684036 -0.0000382 0.0180827 0.1679 -0.0000611 0.0174505 0.1672678 -0.0000978 0.0166583 0.1664757 -0.0001565 0.0156685 0.1654858 -0.0002504 0.0144359 0.1642532 -0.0004008 0.012908 0.1627254 -0.0006416 0.0110255 0.1608428 -0.0010268 0.0087246 0.1585419 -0.0016435 0.0059429 0.1557603 -0.0026305 0.0026305 0.1524479 -0.0080698 0.0026305 0.1524479 -0.0149512 0.0026305 0.1524479 -0.023657 0.0026305 0.1524479 -0.0346711 0.0026305 0.1524479 -0.0486053 0.0026305 0.1524479 -0.0662338 0.0026305 0.1524479 -0.0885362 0.0026305 0.1524479 -0.1167517 0.0026305 0.1524479 -0.1524479 0.0026305 0.1524479 -0.1976083 0.0026305 0.1524479 -0.254742 0.0026305 0.1524479 -0.3270236 0.0026305 0.1524479 -0.4184692 0.0026305 0.1524479 -0.5341598 0.0026305 0.1524479 -0.6805235 0.0026305 0.1524479 -0.8333779 0.0065402 0.1500694 -0.900682 0.0282324 0.1473476 -0.9342712 0.062202 0.1559462 -0.9539671 0.1054431 0.1773192 -0.9666211 0.1565473 0.2106546 -0.975234 0.2143816 0.2544742 -0.9813291 0.2776503 0.3069152 -0.9857621 0.3447636 0.3658099 -0.989051 0.4138668 0.4287804 -0.9915271 0.4829718 0.4933867 -0.993412 0.5501416 0.5573129 -0.9948589 0.6136769 0.6185491 -0.9959768 0.6722594 0.6755287 -0.9968448 0.7250244 0.7271937 -0.9975213 0.7715599 0.7729849 -0.9980502 0.8118476 0.8127756 -0.9984647 0.8461714 0.8467713 -0.9987901 0.8750173 0.8754027 -0.9990459 0.8989829 0.8992291 -0.9992472 0.9187045 0.9188612 -0.9994059 0.9348069 0.9349062 -0.9995309 0.94787 0.9479328 -0.9996296 0.9584126 0.9584521 -0.9997074 0.9668852 0.9669101 -0.9997689 0.9736712 0.9736869 -0.9998174 0.9790919 0.9791017 -0.9998557 0.9834124 0.9834186 -0.999886 0.9868502 0.986854 -0.9999099 0.9895818 0.9895842 -0.9999288 0.99175 0.9917515 -0.9999437 0.9934694 0.9934703 -0.0000238 0.0240255 0.1684036 -0.0000382 0.023522 0.1679 -0.0000611 0.0228898 0.1672678 -0.0000978 0.0220976 0.1664757 -0.0001565 0.0211078 0.1654858 -0.0002504 0.0198752 0.1642532 -0.0004008 0.0183473 0.1627254 -0.0006416 0.0164648 0.1608428 -0.0010268 0.0141639 0.1585419 -0.0016435 0.0113822 0.1557603 -0.0026305 0.0080698 0.1524479 -0.0042103 0.0042103 0.1485884 -0.0110917 0.0042103 0.1485884 -0.0197975 0.0042103 0.1485884 -0.0308116 0.0042103 0.1485884 -0.0447458 0.0042103 0.1485884 -0.0623743 0.0042103 0.1485884 -0.0846767 0.0042103 0.1485884 -0.1128922 0.0042103 0.1485884 -0.1485884 0.0042103 0.1485884 -0.1937488 0.0042103 0.1485884 -0.2508825 0.0042103 0.1485884 -0.3231641 0.0042103 0.1485884 -0.4146097 0.0042103 0.1485884 -0.5303003 0.0042103 0.1485884 -0.676664 0.0042103 0.1485884 -0.8314967 0.0078103 0.1464753 -0.9000167 0.0290732 0.1442365 -0.9339805 0.062742 0.1533502 -0.9538247 0.1057683 0.1752103 -0.9665463 0.1567226 0.208976 -0.9751928 0.2144566 0.2531618 -0.9813057 0.2776626 0.3059062 -0.9857485 0.3447407 0.3650474 -0.989043 0.4138277 0.4282141 -0.9915223 0.4829286 0.4929736 -0.9934091 0.5501012 0.5570168 -0.9948571 0.6136427 0.6183406 -0.9959757 0.6722322 0.6753843 -0.9968441 0.7250039 0.7270952 -0.9975209 0.7715449 0.7729187 -0.99805 0.811837 0.8127316 -0.9984645 0.8461641 0.8467423 -0.99879 0.8750124 0.8753838 -0.9990458 0.8989796 0.8992169 -0.9992472 0.9187024 0.9188534 -0.9994059 0.9348055 0.9349012 -0.9995309 0.9478691 0.9479296 -0.9996296 0.958412 0.9584501 -0.9997074 0.9668848 0.9669088 -0.9997689 0.973671 0.9736861 -0.9998174 0.9790917 0.9791012 -0.9998557 0.9834123 0.9834182 -0.999886 0.9868501 0.9868538 -0.9999099 0.9895818 0.9895841 -0.9999288 0.9917499 0.9917514 -0.9999437 0.9934694 0.9934703 -0.0000238 0.0309069 0.1684036 -0.0000382 0.0304033 0.1679 -0.0000611 0.0297711 0.1672678 -0.0000978 0.028979 0.1664757 -0.0001565 0.0279891 0.1654858 -0.0002504 0.0267565 0.1642532 -0.0004008 0.0252287 0.1627254 -0.0006416 0.0233461 0.1608428 -0.0010268 0.0210452 0.1585419 -0.0016435 0.0182636 0.1557603 -0.0026305 0.0149512 0.1524479 -0.0042103 0.0110917 0.1485884 -0.0067388 0.0067388 0.1442355 -0.0154447 0.0067388 0.1442355 -0.0264587 0.0067388 0.1442355 -0.0403929 0.0067388 0.1442355 -0.0580214 0.0067388 0.1442355 -0.0803239 0.0067388 0.1442355 -0.1085393 0.0067388 0.1442355 -0.1442355 0.0067388 0.1442355 -0.1893959 0.0067388 0.1442355 -0.2465296 0.0067388 0.1442355 -0.3188112 0.0067388 0.1442355 -0.4102568 0.0067388 0.1442355 -0.5259474 0.0067388 0.1442355 -0.6723111 0.0067388 0.1442355 -0.8293233 0.0099781 0.1424005 -0.8992555 0.0306306 0.1407067 -0.9336494 0.0638283 0.1504067 -0.953663 0.1064997 0.1728211 -0.9664615 0.1571937 0.2070759 -0.9751462 0.2147432 0.251677 -0.9812792 0.2778236 0.3047655 -0.9857332 0.3448204 0.3641857 -0.9890339 0.4138582 0.4275744 -0.9915169 0.4829319 0.492507 -0.9934058 0.5500915 0.5566825 -0.9948551 0.6136284 0.6181052 -0.9959745 0.672218 0.6752213 -0.9968433 0.7249916 0.726984 -0.9975204 0.7715352 0.7728439 -0.9980497 0.8118298 0.8126819 -0.9984643 0.8461589 0.8467097 -0.9987899 0.8750088 0.8753626 -0.9990458 0.8989771 0.8992032 -0.9992472 0.9187008 0.9188446 -0.9994058 0.9348044 0.9348956 -0.9995309 0.9478684 0.9479261 -0.9996296 0.9584115 0.9584479 -0.9997074 0.9668845 0.9669074 -0.9997689 0.9736708 0.9736852 -0.9998174 0.9790916 0.9791006 -0.9998557 0.9834122 0.9834179 -0.999886 0.9868501 0.9868536 -0.9999099 0.9895817 0.9895839 -0.9999288 0.9917499 0.9917513 -0.9999437 0.9934694 0.9934702 -0.0000238 0.0396127 0.1684036 -0.0000382 0.0391092 0.1679 -0.0000611 0.038477 0.1672678 -0.0000978 0.0376849 0.1664757 -0.0001565 0.036695 0.1654858 -0.0002504 0.0354624 0.1642532 -0.0004008 0.0339345 0.1627254 -0.0006416 0.032052 0.1608428 -0.0010268 0.0297511 0.1585419 -0.0016435 0.0269694 0.1557603 -0.0026305 0.023657 0.1524479 -0.0042103 0.0197975 0.1485884 -0.0067388 0.0154447 0.1442355 -0.0107859 0.0107859 0.1395767 -0.0217999 0.0107859 0.1395767 -0.0357341 0.0107859 0.1395767 -0.0533626 0.0107859 0.1395767 -0.075665 0.0107859 0.1395767 -0.1038805 0.0107859 0.1395767 -0.1395767 0.0107859 0.1395767 -0.1847371 0.0107859 0.1395767 -0.2418708 0.0107859 0.1395767 -0.3141524 0.0107859 0.1395767 -0.405598 0.0107859 0.1395767 -0.5212886 0.0107859 0.1395767 -0.6676523 0.0107859 0.1395767 -0.8269342 0.0136166 0.138015 -0.8984278 0.0333932 0.136904 -0.9332914 0.0658501 0.1472378 -0.9534887 0.1079385 0.1702513 -0.9663702 0.15819 0.2050339 -0.9750962 0.2154135 0.2500826 -0.9812508 0.2782606 0.3035412 -0.9857167 0.3450957 0.3632613 -0.9890241 0.4140252 0.4268884 -0.991511 0.4830292 0.4920069 -0.9934023 0.5501456 0.5563243 -0.994853 0.6136569 0.617853 -0.9959732 0.672232 0.6750467 -0.9968425 0.7249978 0.7268649 -0.9975199 0.7715376 0.7727638 -0.9980494 0.8118303 0.8126288 -0.9984642 0.8461587 0.8466748 -0.9987897 0.8750084 0.8753398 -0.9990457 0.8989767 0.8991885 -0.9992471 0.9187004 0.9188351 -0.9994058 0.9348042 0.9348895 -0.9995309 0.9478683 0.9479222 -0.9996295 0.9584114 0.9584454 -0.9997074 0.9668844 0.9669058 -0.9997689 0.9736708 0.9736842 -0.9998174 0.9790916 0.9791 -0.9998557 0.9834122 0.9834175 -0.999886 0.98685 0.9868534 -0.9999099 0.9895817 0.9895838 -0.9999288 0.9917499 0.9917512 -0.9999437 0.9934694 0.9934702 -0.0000238 0.0506267 0.1684036 -0.0000382 0.0501232 0.1679 -0.0000611 0.049491 0.1672678 -0.0000978 0.0486989 0.1664757 -0.0001565 0.047709 0.1654858 -0.0002504 0.0464764 0.1642532 -0.0004008 0.0449485 0.1627254 -0.0006416 0.043066 0.1608428 -0.0010268 0.0407651 0.1585419 -0.0016435 0.0379834 0.1557603 -0.0026305 0.0346711 0.1524479 -0.0042103 0.0308116 0.1485884 -0.0067388 0.0264587 0.1442355 -0.0107859 0.0217999 0.1395767 -0.0172633 0.0172633 0.1350402 -0.0311975 0.0172633 0.1350402 -0.0488261 0.0172633 0.1350402 -0.0711285 0.0172633 0.1350402 -0.099344 0.0172633 0.1350402 -0.1350402 0.0172633 0.1350402 -0.1802005 0.0172633 0.1350402 -0.2373343 0.0172633 0.1350402 -0.3096159 0.0172633 0.1350402 -0.4010615 0.0172633 0.1350402 -0.5167521 0.0172633 0.1350402 -0.6631157 0.0172633 0.1350402 -0.8245426 0.0196467 0.1337208 -0.8976087 0.0381561 0.1331763 -0.9329391 0.0694453 0.1441333 -0.9533177 0.1105818 0.1677362 -0.9662809 0.160092 0.2030372 -0.9750472 0.2167545 0.2485248 -0.9812231 0.2791873 0.3023458 -0.9857006 0.3457234 0.3623592 -0.9890146 0.4144423 0.4262192 -0.9915054 0.4833013 0.4915192 -0.9933988 0.5503203 0.555975 -0.9948509 0.6137675 0.6176072 -0.9959719 0.6723012 0.6748765 -0.9968418 0.7250408 0.7267489 -0.9975194 0.7715641 0.7726859 -0.9980491 0.8118466 0.812577 -0.998464 0.8461687 0.8466407 -0.9987896 0.8750145 0.8753177 -0.9990456 0.8989805 0.8991742 -0.9992471 0.9187027 0.9188259 -0.9994058 0.9348056 0.9348837 -0.9995309 0.9478691 0.9479185 -0.9996295 0.958412 0.9584431 -0.9997074 0.9668847 0.9669043 -0.9997688 0.973671 0.9736833 -0.9998174 0.9790917 0.9790994 -0.9998557 0.9834123 0.9834171 -0.999886 0.9868501 0.9868531 -0.9999099 0.9895817 0.9895836 -0.9999288 0.9917499 0.9917511 -0.9999437 0.9934694 0.9934701 -0.0000238 0.0645609 0.1684036 -0.0000382 0.0640574 0.1679 -0.0000611 0.0634252 0.1672678 -0.0000978 0.0626331 0.1664757 -0.0001565 0.0616432 0.1654858 -0.0002504 0.0604106 0.1642532 -0.0004008 0.0588827 0.1627254 -0.0006416 0.0570002 0.1608428 -0.0010268 0.0546993 0.1585419 -0.0016435 0.0519176 0.1557603 -0.0026305 0.0486053 0.1524479 -0.0042103 0.0447458 0.1485884 -0.0067388 0.0403929 0.1442355 -0.0107859 0.0357341 0.1395767 -0.0172633 0.0311975 0.1350402 -0.0276309 0.0276309 0.1314736 -0.0452595 0.0276309 0.1314736 -0.0675619 0.0276309 0.1314736 -0.0957773 0.0276309 0.1314736 -0.1314736 0.0276309 0.1314736 -0.1766339 0.0276309 0.1314736 -0.2337676 0.0276309 0.1314736 -0.3060492 0.0276309 0.1314736 -0.3974949 0.0276309 0.1314736 -0.5131855 0.0276309 0.1314736 -0.6595491 0.0276309 0.1314736 -0.8226154 0.0295373 0.1303287 -0.8969554 0.0461985 0.1302284 -0.9326595 0.0756464 0.1416797 -0.9531823 0.1152388 0.16575 -0.9662104 0.1635226 0.2014616 -0.9750086 0.2192389 0.2472963 -0.9812013 0.2809573 0.3014036 -0.9856879 0.3469645 0.3616485 -0.9890072 0.4152991 0.4256923 -0.9915009 0.4838841 0.4911352 -0.9933961 0.5507113 0.5557001 -0.9948493 0.6140266 0.6174138 -0.9959709 0.6724711 0.6747426 -0.9968411 0.7251511 0.7266577 -0.9975191 0.7716352 0.7726245 -0.9980488 0.8118921 0.8125362 -0.9984638 0.8461977 0.846614 -0.9987895 0.8750329 0.8753002 -0.9990456 0.8989921 0.8991629 -0.999247 0.9187101 0.9188187 -0.9994057 0.9348102 0.9348791 -0.9995309 0.947872 0.9479156 -0.9996295 0.9584138 0.9584412 -0.9997074 0.9668859 0.9669032 -0.9997688 0.9736717 0.9736826 -0.9998174 0.9790921 0.9790989 -0.9998557 0.9834126 0.9834168 -0.999886 0.9868503 0.9868529 -0.9999099 0.9895819 0.9895835 -0.9999288 0.99175 0.991751 -0.9999437 0.9934694 0.9934701 -0.0000238 0.0821895 0.1684036 -0.0000382 0.081686 0.1679 -0.0000611 0.0810538 0.1672678 -0.0000978 0.0802616 0.1664757 -0.0001565 0.0792718 0.1654858 -0.0002504 0.0780392 0.1642532 -0.0004008 0.0765113 0.1627254 -0.0006416 0.0746288 0.1608428 -0.0010268 0.0723279 0.1585419 -0.0016435 0.0695462 0.1557603 -0.0026305 0.0662338 0.1524479 -0.0042103 0.0623743 0.1485884 -0.0067388 0.0580214 0.1442355 -0.0107859 0.0533626 0.1395767 -0.0172633 0.0488261 0.1350402 -0.0276309 0.0452595 0.1314736 -0.0441188 0.0441188 0.1303328 -0.0664212 0.0441188 0.1303328 -0.0946366 0.0441188 0.1303328 -0.1303328 0.0441188 0.1303328 -0.1754932 0.0441188 0.1303328 -0.2326269 0.0441188 0.1303328 -0.3049085 0.0441188 0.1303328 -0.3963542 0.0441188 0.1303328 -0.5120448 0.0441188 0.1303328 -0.6584084 0.0441188 0.1303328 -0.8219901 0.0455041 0.1292408 -0.8967447 0.0594506 0.1292823 -0.9325696 0.0860209 0.1408925 -0.9531389 0.1231452 0.1651131 -0.9661878 0.1694384 0.2009566 -0.9749962 0.2235962 0.2469027 -0.9811943 0.2841192 0.3011018 -0.9856839 0.3492254 0.3614209 -0.9890048 0.4168922 0.4255236 -0.9914995 0.4849907 0.4910123 -0.9933953 0.5514695 0.5556122 -0.9948487 0.6145393 0.6173519 -0.9959706 0.6728136 0.6746998 -0.9968409 0.7253775 0.7266285 -0.9975189 0.7717834 0.7726049 -0.9980488 0.8119884 0.8125232 -0.9984638 0.8462598 0.8466054 -0.9987895 0.8750727 0.8752947 -0.9990455 0.8990175 0.8991593 -0.999247 0.9187262 0.9188164 -0.9994057 0.9348204 0.9348776 -0.9995308 0.9478785 0.9479146 -0.9996295 0.9584178 0.9584406 -0.9997074 0.9668884 0.9669028 -0.9997688 0.9736733 0.9736823 -0.9998174 0.9790931 0.9790988 -0.9998557 0.9834132 0.9834167 -0.999886 0.9868507 0.9868529 -0.9999099 0.9895821 0.9895835 -0.9999288 0.9917502 0.991751 -0.9999437 0.9934695 0.9934701 -0.0000238 0.1044919 0.1684036 -0.0000382 0.1039884 0.1679 -0.0000611 0.1033562 0.1672678 -0.0000978 0.102564 0.1664757 -0.0001565 0.1015742 0.1654858 -0.0002504 0.1003416 0.1642532 -0.0004008 0.0988137 0.1627254 -0.0006416 0.0969312 0.1608428 -0.0010268 0.0946303 0.1585419 -0.0016435 0.0918486 0.1557603 -0.0026305 0.0885362 0.1524479 -0.0042103 0.0846767 0.1485884 -0.0067388 0.0803239 0.1442355 -0.0107859 0.075665 0.1395767 -0.0172633 0.0711285 0.1350402 -0.0276309 0.0675619 0.1314736 -0.0441188 0.0664212 0.1303328 -0.0664212 0.0664212 0.1303328 -0.0946366 0.0664212 0.1303328 -0.1303328 0.0664212 0.1303328 -0.1754932 0.0664212 0.1303328 -0.2326269 0.0664212 0.1303328 -0.3049085 0.0664212 0.1303328 -0.3963542 0.0664212 0.1303328 -0.5120448 0.0664212 0.1303328 -0.6584084 0.0664212 0.1303328 -0.8219901 0.0671656 0.1292408 -0.8967447 0.0775151 0.1292823 -0.9325696 0.1002154 0.1408925 -0.9531389 0.1340017 0.1651131 -0.9661878 0.1775917 0.2009566 -0.9749962 0.2296253 0.2469027 -0.9811943 0.2885124 0.3011018 -0.9856839 0.3523802 0.3614209 -0.9890048 0.419125 0.4255236 -0.9914995 0.4865484 0.4910123 -0.9933953 0.5525411 0.5556122 -0.9948487 0.6152669 0.6173519 -0.9959706 0.6733015 0.6746998 -0.9968409 0.7257011 0.7266285 -0.9975189 0.7719959 0.7726049 -0.9980488 0.8121268 0.8125232 -0.9984638 0.8463492 0.8466054 -0.9987895 0.8751301 0.8752947 -0.9990455 0.8990542 0.8991593 -0.999247 0.9187495 0.9188164 -0.9994057 0.9348352 0.9348776 -0.9995308 0.9478878 0.9479146 -0.9996295 0.9584237 0.9584406 -0.9997074 0.9668922 0.9669028 -0.9997688 0.9736756 0.9736823 -0.9998174 0.9790946 0.9790988 -0.9998557 0.9834141 0.9834167 -0.999886 0.9868512 0.9868529 -0.9999099 0.9895825 0.9895835 -0.9999288 0.9917504 0.991751 -0.9999437 0.9934697 0.9934701 -0.0000238 0.1327073 0.1684036 -0.0000382 0.1322038 0.1679 -0.0000611 0.1315716 0.1672678 -0.0000978 0.1307795 0.1664757 -0.0001565 0.1297896 0.1654858 -0.0002504 0.128557 0.1642532 -0.0004008 0.1270291 0.1627254 -0.0006416 0.1251466 0.1608428 -0.0010268 0.1228457 0.1585419 -0.0016435 0.120064 0.1557603 -0.0026305 0.1167517 0.1524479 -0.0042103 0.1128922 0.1485884 -0.0067388 0.1085393 0.1442355 -0.0107859 0.1038805 0.1395767 -0.0172633 0.099344 0.1350402 -0.0276309 0.0957773 0.1314736 -0.0441188 0.0946366 0.1303328 -0.0664212 0.0946366 0.1303328 -0.0946366 0.0946366 0.1303328 -0.1303328 0.0946366 0.1303328 -0.1754932 0.0946366 0.1303328 -0.2326269 0.0946366 0.1303328 -0.3049085 0.0946366 0.1303328 -0.3963542 0.0946366 0.1303328 -0.5120448 0.0946366 0.1303328 -0.6584084 0.0946366 0.1303328 -0.8219901 0.0945703 0.1292408 -0.8967447 0.1003691 0.1292823 -0.9325696 0.1181733 0.1408925 -0.9531389 0.1477366 0.1651131 -0.9661878 0.1879067 0.2009566 -0.9749962 0.2372529 0.2469027 -0.9811943 0.2940703 0.3011018 -0.9856839 0.3563715 0.3614209 -0.9890048 0.4219498 0.4255236 -0.9914995 0.4885191 0.4910123 -0.9933953 0.5538969 0.5556122 -0.9948487 0.6161874 0.6173519 -0.9959706 0.6739188 0.6746998 -0.9968409 0.7261105 0.7266285 -0.9975189 0.7722648 0.7726049 -0.9980488 0.8123018 0.8125232 -0.9984638 0.8464623 0.8466054 -0.9987895 0.8752028 0.8752947 -0.9990455 0.8991006 0.8991593 -0.999247 0.9187791 0.9188164 -0.9994057 0.9348539 0.9348776 -0.9995308 0.9478997 0.9479146 -0.9996295 0.9584312 0.9584406 -0.9997074 0.9668969 0.9669028 -0.9997688 0.9736786 0.9736823 -0.9998174 0.9790965 0.9790988 -0.9998557 0.9834153 0.9834167 -0.999886 0.986852 0.9868529 -0.9999099 0.9895829 0.9895835 -0.9999288 0.9917507 0.991751 -0.9999437 0.9934698 0.9934701 -0.0000238 0.1684036 0.1684036 -0.0000382 0.1679 0.1679 -0.0000611 0.1672678 0.1672678 -0.0000978 0.1664757 0.1664757 -0.0001565 0.1654858 0.1654858 -0.0002504 0.1642532 0.1642532 -0.0004008 0.1627254 0.1627254 -0.0006416 0.1608428 0.1608428 -0.0010268 0.1585419 0.1585419 -0.0016435 0.1557603 0.1557603 -0.0026305 0.1524479 0.1524479 -0.0042103 0.1485884 0.1485884 -0.0067388 0.1442355 0.1442355 -0.0107859 0.1395767 0.1395767 -0.0172633 0.1350402 0.1350402 -0.0276309 0.1314736 0.1314736 -0.0441188 0.1303328 0.1303328 -0.0664212 0.1303328 0.1303328 -0.0946366 0.1303328 0.1303328 -0.1303328 0.1303328 0.1303328 -0.1754932 0.1303328 0.1303328 -0.2326269 0.1303328 0.1303328 -0.3049085 0.1303328 0.1303328 -0.3963542 0.1303328 0.1303328 -0.5120448 0.1303328 0.1303328 -0.6584084 0.1303328 0.1303328 -0.8219901 0.1292408 0.1292408 -0.8967447 0.1292823 0.1292823 -0.9325696 0.1408925 0.1408925 -0.9531389 0.1651131 0.1651131 -0.9661878 0.2009566 0.2009566 -0.9749962 0.2469027 0.2469027 -0.9811943 0.3011018 0.3011018 -0.9856839 0.3614209 0.3614209 -0.9890048 0.4255236 0.4255236 -0.9914995 0.4910123 0.4910123 -0.9933953 0.5556122 0.5556122 -0.9948487 0.6173519 0.6173519 -0.9959706 0.6746998 0.6746998 -0.9968409 0.7266285 0.7266285 -0.9975189 0.7726049 0.7726049 -0.9980488 0.8125232 0.8125232 -0.9984638 0.8466054 0.8466054 -0.9987895 0.8752947 0.8752947 -0.9990455 0.8991593 0.8991593 -0.999247 0.9188164 0.9188164 -0.9994057 0.9348776 0.9348776 -0.9995308 0.9479146 0.9479146 -0.9996295 0.9584406 0.9584406 -0.9997074 0.9669028 0.9669028 -0.9997688 0.9736823 0.9736823 -0.9998174 0.9790988 0.9790988 -0.9998557 0.9834167 0.9834167 -0.999886 0.9868529 0.9868529 -0.9999099 0.9895835 0.9895835 -0.9999288 0.991751 0.991751 -0.9999437 0.9934701 0.9934701 -0.0000238 0.2135639 0.1684036 -0.0000382 0.2130604 0.1679 -0.0000611 0.2124282 0.1672678 -0.0000978 0.2116361 0.1664757 -0.0001565 0.2106462 0.1654858 -0.0002504 0.2094136 0.1642532 -0.0004008 0.2078857 0.1627254 -0.0006416 0.2060032 0.1608428 -0.0010268 0.2037023 0.1585419 -0.0016435 0.2009206 0.1557603 -0.0026305 0.1976083 0.1524479 -0.0042103 0.1937488 0.1485884 -0.0067388 0.1893959 0.1442355 -0.0107859 0.1847371 0.1395767 -0.0172633 0.1802005 0.1350402 -0.0276309 0.1766339 0.1314736 -0.0441188 0.1754932 0.1303328 -0.0664212 0.1754932 0.1303328 -0.0946366 0.1754932 0.1303328 -0.1303328 0.1754932 0.1303328 -0.1754932 0.1754932 0.1303328 -0.2326269 0.1754932 0.1303328 -0.3049085 0.1754932 0.1303328 -0.3963542 0.1754932 0.1303328 -0.5120448 0.1754932 0.1303328 -0.6584084 0.1754932 0.1303328 -0.8219901 0.1731034 0.1292408 -0.8967447 0.1658613 0.1292823 -0.9325696 0.1696351 0.1408925 -0.9531389 0.1870965 0.1651131 -0.9661878 0.2174663 0.2009566 -0.9749962 0.2591111 0.2469027 -0.9811943 0.3099976 0.3011018 -0.9856839 0.3678092 0.3614209 -0.9890048 0.4300448 0.4255236 -0.9914995 0.4941665 0.4910123 -0.9933953 0.5577822 0.5556122 -0.9948487 0.6188252 0.6173519 -0.9959706 0.6756878 0.6746998 -0.9968409 0.7272837 0.7266285 -0.9975189 0.7730352 0.7726049 -0.9980488 0.8128033 0.8125232 -0.9984638 0.8467864 0.8466054 -0.9987895 0.8754109 0.8752947 -0.9990455 0.8992336 0.8991593 -0.999247 0.9188636 0.9188164 -0.9994057 0.9349075 0.9348776 -0.9995308 0.9479335 0.9479146 -0.9996295 0.9584526 0.9584406 -0.9997074 0.9669103 0.9669028 -0.9997688 0.973687 0.9736823 -0.9998174 0.9791018 0.9790988 -0.9998557 0.9834186 0.9834167 -0.999886 0.9868541 0.9868529 -0.9999099 0.9895842 0.9895835 -0.9999288 0.9917515 0.991751 -0.9999437 0.9934704 0.9934701 -0.0000238 0.2706977 0.1684036 -0.0000382 0.2701941 0.1679 -0.0000611 0.2695619 0.1672678 -0.0000978 0.2687698 0.1664757 -0.0001565 0.2677799 0.1654858 -0.0002504 0.2665473 0.1642532 -0.0004008 0.2650195 0.1627254 -0.0006416 0.2631369 0.1608428 -0.0010268 0.260836 0.1585419 -0.0016435 0.2580543 0.1557603 -0.0026305 0.254742 0.1524479 -0.0042103 0.2508825 0.1485884 -0.0067388 0.2465296 0.1442355 -0.0107859 0.2418708 0.1395767 -0.0172633 0.2373343 0.1350402 -0.0276309 0.2337676 0.1314736 -0.0441188 0.2326269 0.1303328 -0.0664212 0.2326269 0.1303328 -0.0946366 0.2326269 0.1303328 -0.1303328 0.2326269 0.1303328 -0.1754932 0.2326269 0.1303328 -0.2326269 0.2326269 0.1303328 -0.3049085 0.2326269 0.1303328 -0.3963542 0.2326269 0.1303328 -0.5120448 0.2326269 0.1303328 -0.6584084 0.2326269 0.1303328 -0.8219901 0.2285954 0.1292408 -0.8967447 0.2121385 0.1292823 -0.9325696 0.2059983 0.1408925 -0.9531389 0.2149085 0.1651131 -0.9661878 0.2383533 0.2009566 -0.9749962 0.2745562 0.2469027 -0.9811943 0.3212519 0.3011018 -0.9856839 0.3758911 0.3614209 -0.9890048 0.4357648 0.4255236 -0.9914995 0.498157 0.4910123 -0.9933953 0.5605276 0.5556122 -0.9948487 0.6206891 0.6173519 -0.9959706 0.6769378 0.6746998 -0.9968409 0.7281127 0.7266285 -0.9975189 0.7735795 0.7726049 -0.9980488 0.8131577 0.8125232 -0.9984638 0.8470154 0.8466054 -0.9987895 0.875558 0.8752947 -0.9990455 0.8993275 0.8991593 -0.999247 0.9189234 0.9188164 -0.9994057 0.9349454 0.9348776 -0.9995308 0.9479575 0.9479146 -0.9996295 0.9584677 0.9584406 -0.9997074 0.9669198 0.9669028 -0.9997688 0.973693 0.9736823 -0.9998174 0.9791055 0.9790988 -0.9998557 0.9834209 0.9834167 -0.999886 0.9868555 0.9868529 -0.9999099 0.9895851 0.9895835 -0.9999288 0.9917521 0.991751 -0.9999437 0.9934707 0.9934701 -0.0000238 0.3429792 0.1684036 -0.0000382 0.3424757 0.1679 -0.0000611 0.3418435 0.1672678 -0.0000978 0.3410514 0.1664757 -0.0001565 0.3400615 0.1654858 -0.0002504 0.3388289 0.1642532 -0.0004008 0.337301 0.1627254 -0.0006416 0.3354185 0.1608428 -0.0010268 0.3331176 0.1585419 -0.0016435 0.3303359 0.1557603 -0.0026305 0.3270236 0.1524479 -0.0042103 0.3231641 0.1485884 -0.0067388 0.3188112 0.1442355 -0.0107859 0.3141524 0.1395767 -0.0172633 0.3096159 0.1350402 -0.0276309 0.3060492 0.1314736 -0.0441188 0.3049085 0.1303328 -0.0664212 0.3049085 0.1303328 -0.0946366 0.3049085 0.1303328 -0.1303328 0.3049085 0.1303328 -0.1754932 0.3049085 0.1303328 -0.2326269 0.3049085 0.1303328 -0.3049085 0.3049085 0.1303328 -0.3963542 0.3049085 0.1303328 -0.5120448 0.3049085 0.1303328 -0.6584084 0.3049085 0.1303328 -0.8219901 0.2988 0.1292408 -0.8967447 0.2706852 0.1292823 -0.9325696 0.2520025 0.1408925 -0.9531389 0.2500942 0.1651131 -0.9661878 0.2647781 0.2009566 -0.9749962 0.2940963 0.2469027 -0.9811943 0.3354901 0.3011018 -0.9856839 0.3861159 0.3614209 -0.9890048 0.4430013 0.4255236 -0.9914995 0.5032055 0.4910123 -0.9933953 0.5640008 0.5556122 -0.9948487 0.6230471 0.6173519 -0.9959706 0.6785192 0.6746998 -0.9968409 0.7291615 0.7266285 -0.9975189 0.7742682 0.7726049 -0.9980488 0.8136061 0.8125232 -0.9984638 0.8473052 0.8466054 -0.9987895 0.8757441 0.8752947 -0.9990455 0.8994464 0.8991593 -0.999247 0.918999 0.9188164 -0.9994057 0.9349933 0.9348776 -0.9995308 0.9479878 0.9479146 -0.9996295 0.9584868 0.9584406 -0.9997074 0.9669318 0.9669028 -0.9997688 0.9737006 0.9736823 -0.9998174 0.9791103 0.9790988 -0.9998557 0.9834239 0.9834167 -0.999886 0.9868574 0.9868529 -0.9999099 0.9895863 0.9895835 -0.9999288 0.9917528 0.991751 -0.9999437 0.9934712 0.9934701 -0.0000238 0.4344249 0.1684036 -0.0000382 0.4339214 0.1679 -0.0000611 0.4332891 0.1672678 -0.0000978 0.432497 0.1664757 -0.0001565 0.4315072 0.1654858 -0.0002504 0.4302746 0.1642532 -0.0004008 0.4287467 0.1627254 -0.0006416 0.4268641 0.1608428 -0.0010268 0.4245633 0.1585419 -0.0016435 0.4217816 0.1557603 -0.0026305 0.4184692 0.1524479 -0.0042103 0.4146097 0.1485884 -0.0067388 0.4102568 0.1442355 -0.0107859 0.405598 0.1395767 -0.0172633 0.4010615 0.1350402 -0.0276309 0.3974949 0.1314736 -0.0441188 0.3963542 0.1303328 -0.0664212 0.3963542 0.1303328 -0.0946366 0.3963542 0.1303328 -0.1303328 0.3963542 0.1303328 -0.1754932 0.3963542 0.1303328 -0.2326269 0.3963542 0.1303328 -0.3049085 0.3963542 0.1303328 -0.3963542 0.3963542 0.1303328 -0.5120448 0.3963542 0.1303328 -0.6584084 0.3963542 0.1303328 -0.8219901 0.3876179 0.1292408 -0.8967447 0.3447543 0.1292823 -0.9325696 0.3102037 0.1408925 -0.9531389 0.2946088 0.1651131 -0.9661878 0.2982089 0.2009566 -0.9749962 0.3188171 0.2469027 -0.9811943 0.3535032 0.3011018 -0.9856839 0.3990515 0.3614209 -0.9890048 0.4521565 0.4255236 -0.9914995 0.5095925 0.4910123 -0.9933953 0.5683949 0.5556122 -0.9948487 0.6260304 0.6173519 -0.9959706 0.6805199 0.6746998 -0.9968409 0.7304884 0.7266285 -0.9975189 0.7751395 0.7726049 -0.9980488 0.8141733 0.8125232 -0.9984638 0.8476717 0.8466054 -0.9987895 0.8759795 0.8752947 -0.9990455 0.8995968 0.8991593 -0.999247 0.9190947 0.9188164 -0.9994057 0.935054 0.9348776 -0.9995308 0.9480261 0.9479146 -0.9996295 0.9585109 0.9584406 -0.9997074 0.966947 0.9669028 -0.9997688 0.9737101 0.9736823 -0.9998174 0.9791163 0.9790988 -0.9998557 0.9834277 0.9834167 -0.999886 0.9868597 0.9868529 -0.9999099 0.9895878 0.9895835 -0.9999288 0.9917537 0.991751 -0.9999437 0.9934718 0.9934701 -0.0000238 0.5501155 0.1684036 -0.0000382 0.549612 0.1679 -0.0000611 0.5489798 0.1672678 -0.0000978 0.5481876 0.1664757 -0.0001565 0.5471978 0.1654858 -0.0002504 0.5459652 0.1642532 -0.0004008 0.5444373 0.1627254 -0.0006416 0.5425548 0.1608428 -0.0010268 0.5402539 0.1585419 -0.0016435 0.5374722 0.1557603 -0.0026305 0.5341598 0.1524479 -0.0042103 0.5303003 0.1485884 -0.0067388 0.5259474 0.1442355 -0.0107859 0.5212886 0.1395767 -0.0172633 0.5167521 0.1350402 -0.0276309 0.5131855 0.1314736 -0.0441188 0.5120448 0.1303328 -0.0664212 0.5120448 0.1303328 -0.0946366 0.5120448 0.1303328 -0.1303328 0.5120448 0.1303328 -0.1754932 0.5120448 0.1303328 -0.2326269 0.5120448 0.1303328 -0.3049085 0.5120448 0.1303328 -0.3963542 0.5120448 0.1303328 -0.5120448 0.5120448 0.1303328 -0.6584084 0.5120448 0.1303328 -0.8219901 0.4999841 0.1292408 -0.8967447 0.4384614 0.1292823 -0.9325696 0.3838358 0.1408925 -0.9531389 0.3509254 0.1651131 -0.9661878 0.3405032 0.2009566 -0.9749962 0.3500921 0.2469027 -0.9811943 0.3762922 0.3011018 -0.9856839 0.4154167 0.3614209 -0.9890048 0.4637389 0.4255236 -0.9914995 0.5176729 0.4910123 -0.9933953 0.573954 0.5556122 -0.9948487 0.6298046 0.6173519 -0.9959706 0.683051 0.6746998 -0.9968409 0.732167 0.7266285 -0.9975189 0.7762418 0.7726049 -0.9980488 0.8148909 0.8125232 -0.9984638 0.8481355 0.8466054 -0.9987895 0.8762773 0.8752947 -0.9990455 0.899787 0.8991593 -0.999247 0.9192157 0.9188164 -0.9994057 0.9351307 0.9348776 -0.9995308 0.9480746 0.9479146 -0.9996295 0.9585415 0.9584406 -0.9997074 0.9669663 0.9669028 -0.9997688 0.9737222 0.9736823 -0.9998174 0.9791238 0.9790988 -0.9998557 0.9834324 0.9834167 -0.999886 0.9868627 0.9868529 -0.9999099 0.9895897 0.9895835 -0.9999288 0.9917549 0.991751 -0.9999437 0.9934725 0.9934701 -0.0000238 0.6964791 0.1684036 -0.0000382 0.6959756 0.1679 -0.0000611 0.6953434 0.1672678 -0.0000978 0.6945513 0.1664757 -0.0001565 0.6935614 0.1654858 -0.0002504 0.6923288 0.1642532 -0.0004008 0.6908009 0.1627254 -0.0006416 0.6889184 0.1608428 -0.0010268 0.6866175 0.1585419 -0.0016435 0.6838358 0.1557603 -0.0026305 0.6805235 0.1524479 -0.0042103 0.676664 0.1485884 -0.0067388 0.6723111 0.1442355 -0.0107859 0.6676523 0.1395767 -0.0172633 0.6631157 0.1350402 -0.0276309 0.6595491 0.1314736 -0.0441188 0.6584084 0.1303328 -0.0664212 0.6584084 0.1303328 -0.0946366 0.6584084 0.1303328 -0.1303328 0.6584084 0.1303328 -0.1754932 0.6584084 0.1303328 -0.2326269 0.6584084 0.1303328 -0.3049085 0.6584084 0.1303328 -0.3963542 0.6584084 0.1303328 -0.5120448 0.6584084 0.1303328 -0.6584084 0.6584084 0.1303328 -0.8219901 0.6421419 0.1292408 -0.8967447 0.557013 0.1292823 -0.9325696 0.4769901 0.1408925 -0.9531389 0.4221733 0.1651131 -0.9661878 0.3940109 0.2009566 -0.9749962 0.389659 0.2469027 -0.9811943 0.4051232 0.3011018 -0.9856839 0.4361208 0.3614209 -0.9890048 0.4783922 0.4255236 -0.9914995 0.5278957 0.4910123 -0.9933953 0.580987 0.5556122 -0.9948487 0.6345795 0.6173519 -0.9959706 0.6862532 0.6746998 -0.9968409 0.7342907 0.7266285 -0.9975189 0.7776364 0.7726049 -0.9980488 0.8157988 0.8125232 -0.9984638 0.8487222 0.8466054 -0.9987895 0.8766541 0.8752947 -0.9990455 0.9000277 0.8991593 -0.999247 0.9193688 0.9188164 -0.9994057 0.9352277 0.9348776 -0.9995308 0.9481359 0.9479146 -0.9996295 0.9585802 0.9584406 -0.9997074 0.9669906 0.9669028 -0.9997688 0.9737375 0.9736823 -0.9998174 0.9791334 0.9790988 -0.9998557 0.9834385 0.9834167 -0.999886 0.9868665 0.9868529 -0.9999099 0.989592 0.9895835 -0.9999288 0.9917564 0.991751 -0.9999437 0.9934734 0.9934701 -0.0051514 0.8407292 0.1647368 -0.0051286 0.8405071 0.1642787 -0.0051047 0.8402274 0.1637031 -0.0050826 0.8398756 0.1629812 -0.0050676 0.8394338 0.162078 -0.0050694 0.8388802 0.1609516 -0.0051048 0.8381886 0.1595528 -0.0052028 0.8373283 0.1578254 -0.0054121 0.8362644 0.1557082 -0.0058134 0.8349593 0.1531399 -0.0065402 0.8333779 0.1500694 -0.0078103 0.8314967 0.1464753 -0.0099781 0.8293233 0.1424005 -0.0136166 0.8269342 0.138015 -0.0196467 0.8245426 0.1337208 -0.0295373 0.8226154 0.1303287 -0.0455041 0.8219901 0.1292408 -0.0671656 0.8219901 0.1292408 -0.0945703 0.8219901 0.1292408 -0.1292408 0.8219901 0.1292408 -0.1731034 0.8219901 0.1292408 -0.2285954 0.8219901 0.1292408 -0.2988 0.8219901 0.1292408 -0.3876179 0.8219901 0.1292408 -0.4999841 0.8219901 0.1292408 -0.6421419 0.8219901 0.1292408 -0.8219901 0.8219901 0.1292408 -0.8967447 0.7069963 0.1292823 -0.9325696 0.5948423 0.1408925 -0.9531389 0.5123112 0.1651131 -0.9661878 0.4617052 0.2009566 -0.9749962 0.4397163 0.2469027 -0.9811943 0.4415982 0.3011018 -0.9856839 0.4623142 0.3614209 -0.9890048 0.4969305 0.4255236 -0.9914995 0.5408288 0.4910123 -0.9933953 0.5898847 0.5556122 -0.9948487 0.6406203 0.6173519 -0.9959706 0.6903044 0.6746998 -0.9968409 0.7369774 0.7266285 -0.9975189 0.7794007 0.7726049 -0.9980488 0.8169474 0.8125232 -0.9984638 0.8494644 0.8466054 -0.9987895 0.8771307 0.8752947 -0.9990455 0.9003323 0.8991593 -0.999247 0.9195625 0.9188164 -0.9994057 0.9353505 0.9348776 -0.9995308 0.9482135 0.9479146 -0.9996295 0.9586291 0.9584406 -0.9997074 0.9670214 0.9669028 -0.9997688 0.9737569 0.9736823 -0.9998174 0.9791456 0.9790988 -0.9998557 0.9834461 0.9834167 -0.999886 0.9868713 0.9868529 -0.9999099 0.989595 0.9895835 -0.9999288 0.9917582 0.991751 -0.9999437 0.9934746 0.9934701 -0.0279321 0.9033413 0.1600254 -0.0278872 0.9032596 0.1596298 -0.0278347 0.9031567 0.1591327 -0.0277752 0.9030276 0.1585092 -0.0277111 0.9028657 0.157729 -0.0276479 0.9026634 0.156756 -0.0275966 0.9024114 0.1555474 -0.0275778 0.9020992 0.1540546 -0.0276281 0.9017148 0.1522245 -0.0278105 0.9012461 0.1500037 -0.0282324 0.900682 0.1473476 -0.0290732 0.9000167 0.1442365 -0.0306306 0.8992555 0.1407067 -0.0333932 0.8984278 0.136904 -0.0381561 0.8976087 0.1331763 -0.0461985 0.8969554 0.1302284 -0.0594506 0.8967447 0.1292823 -0.0775151 0.8967447 0.1292823 -0.1003691 0.8967447 0.1292823 -0.1292823 0.8967447 0.1292823 -0.1658613 0.8967447 0.1292823 -0.2121385 0.8967447 0.1292823 -0.2706852 0.8967447 0.1292823 -0.3447543 0.8967447 0.1292823 -0.4384614 0.8967447 0.1292823 -0.557013 0.8967447 0.1292823 -0.7069963 0.8967447 0.1292823 -0.8967447 0.8967447 0.1292823 -0.9325696 0.7439407 0.1408925 -0.9531389 0.6263473 0.1651131 -0.9661878 0.5473473 0.2009566 -0.9749962 0.5030453 0.2469027 -0.9811943 0.4877437 0.3011018 -0.9856839 0.4954523 0.3614209 -0.9890048 0.5203839 0.4255236 -0.9914995 0.5571908 0.4910123 -0.9933953 0.6011414 0.5556122 -0.9948487 0.6482627 0.6173519 -0.9959706 0.6954296 0.6746998 -0.9968409 0.7403765 0.7266285 -0.9975189 0.7816327 0.7726049 -0.9980488 0.8184005 0.8125232 -0.9984638 0.8504035 0.8466054 -0.9987895 0.8777338 0.8752947 -0.9990455 0.9007175 0.8991593 -0.999247 0.9198076 0.9188164 -0.9994057 0.9355059 0.9348776 -0.9995308 0.9483117 0.9479146 -0.9996295 0.958691 0.9584406 -0.9997074 0.9670604 0.9669028 -0.9997688 0.9737814 0.9736823 -0.9998174 0.979161 0.9790988 -0.9998557 0.9834557 0.9834167 -0.999886 0.9868773 0.9868529 -0.9999099 0.9895988 0.9895835 -0.9999288 0.9917606 0.991751 -0.9999437 0.9934761 0.9934701 -0.0624569 0.9354466 0.166541 -0.0624063 0.9354101 0.16621 -0.0623458 0.9353643 0.1657941 -0.0622749 0.9353068 0.1652725 -0.0621943 0.9352348 0.1646199 -0.0621069 0.9351449 0.1638062 -0.0620199 0.9350332 0.1627957 -0.0619473 0.9348949 0.1615479 -0.061916 0.9347252 0.1600186 -0.0619734 0.9345187 0.1581637 -0.062202 0.9342712 0.1559462 -0.062742 0.9339805 0.1533502 -0.0638283 0.9336494 0.1504067 -0.0658501 0.9332914 0.1472378 -0.0694453 0.9329391 0.1441333 -0.0756464 0.9326595 0.1416797 -0.0860209 0.9325696 0.1408925 -0.1002154 0.9325696 0.1408925 -0.1181733 0.9325696 0.1408925 -0.1408925 0.9325696 0.1408925 -0.1696351 0.9325696 0.1408925 -0.2059983 0.9325696 0.1408925 -0.2520025 0.9325696 0.1408925 -0.3102037 0.9325696 0.1408925 -0.3838358 0.9325696 0.1408925 -0.4769901 0.9325696 0.1408925 -0.5948423 0.9325696 0.1408925 -0.7439407 0.9325696 0.1408925 -0.9325696 0.9325696 0.1408925 -0.9531389 0.7706179 0.1651131 -0.9661878 0.6556956 0.2009566 -0.9749962 0.5831647 0.2469027 -0.9811943 0.5461239 0.3011018 -0.9856839 0.5373763 0.3614209 -0.9890048 0.5500554 0.4255236 -0.9914995 0.577891 0.4910123 -0.9933953 0.6153825 0.5556122 -0.9948487 0.6579314 0.6173519 -0.9959706 0.7019138 0.6746998 -0.9968409 0.7446768 0.7266285 -0.9975189 0.7844566 0.7726049 -0.9980488 0.8202389 0.8125232 -0.9984638 0.8515915 0.8466054 -0.9987895 0.8784967 0.8752947 -0.9990455 0.9012049 0.8991593 -0.999247 0.9201176 0.9188164 -0.9994057 0.9357024 0.9348776 -0.9995308 0.9484359 0.9479146 -0.9996295 0.9587693 0.9584406 -0.9997074 0.9671097 0.9669028 -0.9997688 0.9738123 0.9736823 -0.9998174 0.9791804 0.9790988 -0.9998557 0.9834679 0.9834167 -0.999886 0.986885 0.9868529 -0.9999099 0.9896036 0.9895835 -0.9999288 0.9917636 0.991751 -0.9999437 0.9934779 0.9934701 -0.1059991 0.9545467 0.1859439 -0.1059489 0.9545286 0.185674 -0.1058883 0.9545059 0.1853349 -0.1058162 0.9544774 0.1849097 -0.1057322 0.9544418 0.1843779 -0.1056375 0.9543974 0.1837149 -0.1055364 0.9543421 0.1828918 -0.1054384 0.9542739 0.1818757 -0.1053624 0.9541902 0.180631 -0.1053433 0.9540886 0.179122 -0.1054431 0.9539671 0.1773192 -0.1057683 0.9538247 0.1752103 -0.1064997 0.953663 0.1728211 -0.1079385 0.9534887 0.1702513 -0.1105818 0.9533177 0.1677362 -0.1152388 0.9531823 0.16575 -0.1231452 0.9531389 0.1651131 -0.1340017 0.9531389 0.1651131 -0.1477366 0.9531389 0.1651131 -0.1651131 0.9531389 0.1651131 -0.1870965 0.9531389 0.1651131 -0.2149085 0.9531389 0.1651131 -0.2500942 0.9531389 0.1651131 -0.2946088 0.9531389 0.1651131 -0.3509254 0.9531389 0.1651131 -0.4221733 0.9531389 0.1651131 -0.5123112 0.9531389 0.1651131 -0.6263473 0.9531389 0.1651131 -0.7706179 0.9531389 0.1651131 -0.9531389 0.9531389 0.1651131 -0.9661878 0.7927704 0.2009566 -0.9749962 0.6845262 0.2469027 -0.9811943 0.6199824 0.3011018 -0.9856839 0.5904156 0.3614209 -0.9890048 0.5875938 0.4255236 -0.9914995 0.6040793 0.4910123 -0.9933953 0.6333995 0.5556122 -0.9948487 0.6701635 0.6173519 -0.9959706 0.710117 0.6746998 -0.9968409 0.7501172 0.7266285 -0.9975189 0.7880291 0.7726049 -0.9980488 0.8225647 0.8125232 -0.9984638 0.8530945 0.8466054 -0.9987895 0.8794619 0.8752947 -0.9990455 0.9018215 0.8991593 -0.999247 0.9205098 0.9188164 -0.9994057 0.935951 0.9348776 -0.9995308 0.9485931 0.9479146 -0.9996295 0.9588684 0.9584406 -0.9997074 0.967172 0.9669028 -0.9997688 0.9738515 0.9736823 -0.9998174 0.979205 0.9790988 -0.9998557 0.9834833 0.9834167 -0.999886 0.9868946 0.9868529 -0.9999099 0.9896096 0.9895835 -0.9999288 0.9917674 0.991751 -0.9999437 0.9934803 0.9934701 -0.1572498 0.9669269 0.2175323 -0.1572031 0.9669173 0.2173167 -0.1571463 0.9669053 0.217046 -0.1570779 0.9668902 0.2167065 -0.1569971 0.9668714 0.2162819 -0.156904 0.9668479 0.2157528 -0.1568008 0.9668187 0.215096 -0.1566936 0.9667827 0.2142855 -0.1565954 0.9667385 0.2132931 -0.1565315 0.966685 0.2120905 -0.1565473 0.9666211 0.2106546 -0.1567226 0.9665463 0.208976 -0.1571937 0.9664615 0.2070759 -0.15819 0.9663702 0.2050339 -0.160092 0.9662809 0.2030372 -0.1635226 0.9662104 0.2014616 -0.1694384 0.9661878 0.2009566 -0.1775917 0.9661878 0.2009566 -0.1879067 0.9661878 0.2009566 -0.2009566 0.9661878 0.2009566 -0.2174663 0.9661878 0.2009566 -0.2383533 0.9661878 0.2009566 -0.2647781 0.9661878 0.2009566 -0.2982089 0.9661878 0.2009566 -0.3405032 0.9661878 0.2009566 -0.3940109 0.9661878 0.2009566 -0.4617052 0.9661878 0.2009566 -0.5473473 0.9661878 0.2009566 -0.6556956 0.9661878 0.2009566 -0.7927704 0.9661878 0.2009566 -0.9661878 0.9661878 0.2009566 -0.9749962 0.8127617 0.2469027 -0.9811943 0.713423 0.3011018 -0.9856839 0.6575172 0.3614209 -0.9890048 0.6350848 0.4255236 -0.9914995 0.637211 0.4910123 -0.9933953 0.6561933 0.5556122 -0.9948487 0.6856388 0.6173519 -0.9959706 0.7204952 0.6746998 -0.9968409 0.757 0.7266285 -0.9975189 0.7925488 0.7726049 -0.9980488 0.8255071 0.8125232 -0.9984638 0.8549959 0.8466054 -0.9987895 0.880683 0.8752947 -0.9990455 0.9026016 0.8991593 -0.999247 0.9210061 0.9188164 -0.9994057 0.9362655 0.9348776 -0.9995308 0.9487918 0.9479146 -0.9996295 0.9589938 0.9584406 -0.9997074 0.9672509 0.9669028 -0.9997688 0.9739011 0.9736823 -0.9998174 0.9792361 0.9790988 -0.9998557 0.9835029 0.9834167 -0.999886 0.9869069 0.9868529 -0.9999099 0.9896173 0.9895835 -0.9999288 0.9917722 0.991751 -0.9999437 0.9934833 0.9934701 -0.2151269 0.9754027 0.2598608 -0.2150852 0.9753975 0.2596918 -0.2150342 0.9753908 0.2594794 -0.2149725 0.9753825 0.2592133 -0.2148987 0.9753721 0.2588805 -0.2148124 0.9753591 0.2584657 -0.2147144 0.975343 0.2579511 -0.2146085 0.9753231 0.2573162 -0.2145034 0.9752987 0.256539 -0.2144168 0.9752692 0.2555977 -0.2143816 0.975234 0.2544742 -0.2144566 0.9751928 0.2531618 -0.2147432 0.9751462 0.251677 -0.2154135 0.9750962 0.2500826 -0.2167545 0.9750472 0.2485248 -0.2192389 0.9750086 0.2472963 -0.2235962 0.9749962 0.2469027 -0.2296253 0.9749962 0.2469027 -0.2372529 0.9749962 0.2469027 -0.2469027 0.9749962 0.2469027 -0.2591111 0.9749962 0.2469027 -0.2745562 0.9749962 0.2469027 -0.2940963 0.9749962 0.2469027 -0.3188171 0.9749962 0.2469027 -0.3500921 0.9749962 0.2469027 -0.389659 0.9749962 0.2469027 -0.4397163 0.9749962 0.2469027 -0.5030453 0.9749962 0.2469027 -0.5831647 0.9749962 0.2469027 -0.6845262 0.9749962 0.2469027 -0.8127617 0.9749962 0.2469027 -0.9749962 0.9749962 0.2469027 -0.9811943 0.8316375 0.3011018 -0.9856839 0.7424095 0.3614209 -0.9890048 0.695167 0.4255236 -0.9914995 0.6791269 0.4910123 -0.9933953 0.6850303 0.5556122 -0.9948487 0.7052169 0.6173519 -0.9959706 0.733625 0.6746998 -0.9968409 0.7657077 0.7266285 -0.9975189 0.7982669 0.7726049 -0.9980488 0.8292297 0.8125232 -0.9984638 0.8574015 0.8466054 -0.9987895 0.8822279 0.8752947 -0.9990455 0.9035886 0.8991593 -0.999247 0.9216339 0.9188164 -0.9994057 0.9366635 0.9348776 -0.9995308 0.9490434 0.9479146 -0.9996295 0.9591524 0.9584406 -0.9997074 0.9673508 0.9669028 -0.9997688 0.9739638 0.9736823 -0.9998174 0.9792755 0.9790988 -0.9998557 0.9835276 0.9834167 -0.999886 0.9869223 0.9868529 -0.9999099 0.989627 0.9895835 -0.9999288 0.9917782 0.991751 -0.9999437 0.9934871 0.9934701 -0.2783684 0.9814251 0.3110617 -0.2783325 0.9814221 0.3109315 -0.2782884 0.9814183 0.3107679 -0.2782347 0.9814136 0.3105628 -0.2781701 0.9814076 0.3103064 -0.2780936 0.9814002 0.309987 -0.2780055 0.9813911 0.3095906 -0.2779077 0.9813797 0.3091018 -0.2778058 0.9813659 0.3085036 -0.2777122 0.9813491 0.3077793 -0.2776503 0.9813291 0.3069152 -0.2776626 0.9813057 0.3059062 -0.2778236 0.9812792 0.3047655 -0.2782606 0.9812508 0.3035412 -0.2791873 0.9812231 0.3023458 -0.2809573 0.9812013 0.3014036 -0.2841192 0.9811943 0.3011018 -0.2885124 0.9811943 0.3011018 -0.2940703 0.9811943 0.3011018 -0.3011018 0.9811943 0.3011018 -0.3099976 0.9811943 0.3011018 -0.3212519 0.9811943 0.3011018 -0.3354901 0.9811943 0.3011018 -0.3535032 0.9811943 0.3011018 -0.3762922 0.9811943 0.3011018 -0.4051232 0.9811943 0.3011018 -0.4415982 0.9811943 0.3011018 -0.4877437 0.9811943 0.3011018 -0.5461239 0.9811943 0.3011018 -0.6199824 0.9811943 0.3011018 -0.713423 0.9811943 0.3011018 -0.8316375 0.9811943 0.3011018 -0.9811943 0.9811943 0.3011018 -0.9856839 0.8498092 0.3614209 -0.9890048 0.7711789 0.4255236 -0.9914995 0.7321559 0.4910123 -0.9933953 0.721513 0.5556122 -0.9948487 0.7299859 0.6173519 -0.9959706 0.7502359 0.6746998 -0.9968409 0.776724 0.7266285 -0.9975189 0.8055009 0.7726049 -0.9980488 0.8339392 0.8125232 -0.9984638 0.8604449 0.8466054 -0.9987895 0.8841823 0.8752947 -0.9990455 0.9048372 0.8991593 -0.999247 0.9224281 0.9188164 -0.9994057 0.9371669 0.9348776 -0.9995308 0.9493615 0.9479146 -0.9996295 0.959353 0.9584406 -0.9997074 0.967477 0.9669028 -0.9997688 0.9740432 0.9736823 -0.9998174 0.9793253 0.9790988 -0.9998557 0.9835588 0.9834167 -0.999886 0.9869419 0.9868529 -0.9999099 0.9896392 0.9895835 -0.9999288 0.9917859 0.991751 -0.9999437 0.9934919 0.9934701 -0.3454107 0.9858181 0.3689471 -0.3453807 0.9858163 0.3688485 -0.3453439 0.9858141 0.3687246 -0.3452987 0.9858113 0.3685693 -0.3452442 0.9858079 0.3683752 -0.3451791 0.9858036 0.3681334 -0.3451032 0.9857982 0.3678335 -0.3450175 0.9857916 0.3674636 -0.3449254 0.9857835 0.367011 -0.3448353 0.9857738 0.3664632 -0.3447636 0.9857621 0.3658099 -0.3447407 0.9857485 0.3650474 -0.3448204 0.9857332 0.3641857 -0.3450957 0.9857167 0.3632613 -0.3457234 0.9857006 0.3623592 -0.3469645 0.9856879 0.3616485 -0.3492254 0.9856839 0.3614209 -0.3523802 0.9856839 0.3614209 -0.3563715 0.9856839 0.3614209 -0.3614209 0.9856839 0.3614209 -0.3678092 0.9856839 0.3614209 -0.3758911 0.9856839 0.3614209 -0.3861159 0.9856839 0.3614209 -0.3990515 0.9856839 0.3614209 -0.4154167 0.9856839 0.3614209 -0.4361208 0.9856839 0.3614209 -0.4623142 0.9856839 0.3614209 -0.4954523 0.9856839 0.3614209 -0.5373763 0.9856839 0.3614209 -0.5904156 0.9856839 0.3614209 -0.6575172 0.9856839 0.3614209 -0.7424095 0.9856839 0.3614209 -0.8498092 0.9856839 0.3614209 -0.9856839 0.9856839 0.3614209 -0.9890048 0.8673437 0.4255236 -0.9914995 0.7992446 0.4910123 -0.9933953 0.7676683 0.5556122 -0.9948487 0.7613218 0.6173519 -0.9959706 0.7712508 0.6746998 -0.9968409 0.7906611 0.7266285 -0.9975189 0.8146529 0.7726049 -0.9980488 0.8398974 0.8125232 -0.9984638 0.8642952 0.8466054 -0.9987895 0.886655 0.8752947 -0.9990455 0.9064168 0.8991593 -0.999247 0.9234329 0.9188164 -0.9994057 0.9378038 0.9348776 -0.9995308 0.9497641 0.9479146 -0.9996295 0.9596068 0.9584406 -0.9997074 0.9676368 0.9669028 -0.9997688 0.9741436 0.9736823 -0.9998174 0.9793883 0.9790988 -0.9998557 0.9835983 0.9834167 -0.999886 0.9869667 0.9868529 -0.9999099 0.9896547 0.9895835 -0.9999288 0.9917956 0.991751 -0.9999437 0.993498 0.9934701 -0.4144197 0.9890841 0.4311123 -0.4143955 0.9890831 0.431039 -0.4143657 0.9890818 0.4309468 -0.414329 0.9890801 0.4308314 -0.4142845 0.9890781 0.430687 -0.4142311 0.9890755 0.4305072 -0.4141683 0.9890723 0.4302842 -0.4140964 0.9890684 0.4300092 -0.4140176 0.9890637 0.4296728 -0.4139373 0.9890579 0.4292657 -0.4138668 0.989051 0.4287804 -0.4138277 0.989043 0.4282141 -0.4138582 0.9890339 0.4275744 -0.4140252 0.9890241 0.4268884 -0.4144423 0.9890146 0.4262192 -0.4152991 0.9890072 0.4256923 -0.4168922 0.9890048 0.4255236 -0.419125 0.9890048 0.4255236 -0.4219498 0.9890048 0.4255236 -0.4255236 0.9890048 0.4255236 -0.4300448 0.9890048 0.4255236 -0.4357648 0.9890048 0.4255236 -0.4430013 0.9890048 0.4255236 -0.4521565 0.9890048 0.4255236 -0.4637389 0.9890048 0.4255236 -0.4783922 0.9890048 0.4255236 -0.4969305 0.9890048 0.4255236 -0.5203839 0.9890048 0.4255236 -0.5500554 0.9890048 0.4255236 -0.5875938 0.9890048 0.4255236 -0.6350848 0.9890048 0.4255236 -0.695167 0.9890048 0.4255236 -0.7711789 0.9890048 0.4255236 -0.8673437 0.9890048 0.4255236 -0.9890048 0.9890048 0.4255236 -0.9914995 0.8841204 0.4910123 -0.9933953 0.8260608 0.5556122 -0.9948487 0.8009659 0.6173519 -0.9959706 0.7978374 0.6746998 -0.9968409 0.8082934 0.7266285 -0.9975189 0.8262314 0.7726049 -0.9980488 0.8474353 0.8125232 -0.9984638 0.8691663 0.8466054 -0.9987895 0.8897832 0.8752947 -0.9990455 0.9084153 0.8991593 -0.999247 0.9247041 0.9188164 -0.9994057 0.9386096 0.9348776 -0.9995308 0.9502734 0.9479146 -0.9996295 0.959928 0.9584406 -0.9997074 0.9678389 0.9669028 -0.9997688 0.9742706 0.9736823 -0.9998174 0.9794681 0.9790988 -0.9998557 0.9836483 0.9834167 -0.999886 0.986998 0.9868529 -0.9999099 0.9896744 0.9895835 -0.9999288 0.9918079 0.991751 -0.9999437 0.9935057 0.9934701 -0.4834235 0.9915469 0.4950892 -0.4834045 0.9915463 0.4950356 -0.4833811 0.9915455 0.4949683 -0.4833522 0.9915446 0.494884 -0.4833171 0.9915433 0.4947786 -0.4832747 0.9915418 0.4946472 -0.4832246 0.9915399 0.4944844 -0.4831666 0.9915376 0.4942836 -0.4831021 0.9915347 0.494038 -0.4830346 0.9915312 0.4937409 -0.4829718 0.9915271 0.4933867 -0.4829286 0.9915223 0.4929736 -0.4829319 0.9915169 0.492507 -0.4830292 0.991511 0.4920069 -0.4833013 0.9915054 0.4915192 -0.4838841 0.9915009 0.4911352 -0.4849907 0.9914995 0.4910123 -0.4865484 0.9914995 0.4910123 -0.4885191 0.9914995 0.4910123 -0.4910123 0.9914995 0.4910123 -0.4941665 0.9914995 0.4910123 -0.498157 0.9914995 0.4910123 -0.5032055 0.9914995 0.4910123 -0.5095925 0.9914995 0.4910123 -0.5176729 0.9914995 0.4910123 -0.5278957 0.9914995 0.4910123 -0.5408288 0.9914995 0.4910123 -0.5571908 0.9914995 0.4910123 -0.577891 0.9914995 0.4910123 -0.6040793 0.9914995 0.4910123 -0.637211 0.9914995 0.4910123 -0.6791269 0.9914995 0.4910123 -0.7321559 0.9914995 0.4910123 -0.7992446 0.9914995 0.4910123 -0.8841204 0.9914995 0.4910123 -0.9914995 0.9914995 0.4910123 -0.9933953 0.8999349 0.5556122 -0.9948487 0.8511207 0.6173519 -0.9959706 0.8314729 0.6746998 -0.9968409 0.8306004 0.7266285 -0.9975189 0.8408797 0.7726049 -0.9980488 0.8569716 0.8125232 -0.9984638 0.875329 0.8466054 -0.9987895 0.8937407 0.8752947 -0.9990455 0.9109436 0.8991593 -0.999247 0.9263124 0.9188164 -0.9994057 0.939629 0.9348776 -0.9995308 0.9509177 0.9479146 -0.9996295 0.9603343 0.9584406 -0.9997074 0.9680946 0.9669028 -0.9997688 0.9744313 0.9736823 -0.9998174 0.9795689 0.9790988 -0.9998557 0.9837116 0.9834167 -0.999886 0.9870376 0.9868529 -0.9999099 0.9896992 0.9895835 -0.9999288 0.9918234 0.991751 -0.9999437 0.9935154 0.9934701 -0.5504963 0.993424 0.5585337 -0.5504818 0.9934236 0.5584953 -0.550464 0.9934231 0.558447 -0.5504419 0.9934225 0.5583865 -0.550415 0.9934218 0.5583108 -0.5503825 0.9934209 0.5582166 -0.5503438 0.9934197 0.5580998 -0.5502987 0.9934183 0.5579558 -0.550248 0.9934166 0.5577798 -0.5501939 0.9934145 0.5575667 -0.5501416 0.993412 0.5573129 -0.5501012 0.9934091 0.5570168 -0.5500915 0.9934058 0.5566825 -0.5501456 0.9934023 0.5563243 -0.5503203 0.9933988 0.555975 -0.5507113 0.9933961 0.5557001 -0.5514695 0.9933953 0.5556122 -0.5525411 0.9933953 0.5556122 -0.5538969 0.9933953 0.5556122 -0.5556122 0.9933953 0.5556122 -0.5577822 0.9933953 0.5556122 -0.5605276 0.9933953 0.5556122 -0.5640008 0.9933953 0.5556122 -0.5683949 0.9933953 0.5556122 -0.573954 0.9933953 0.5556122 -0.580987 0.9933953 0.5556122 -0.5898847 0.9933953 0.5556122 -0.6011414 0.9933953 0.5556122 -0.6153825 0.9933953 0.5556122 -0.6333995 0.9933953 0.5556122 -0.6561933 0.9933953 0.5556122 -0.6850303 0.9933953 0.5556122 -0.721513 0.9933953 0.5556122 -0.7676683 0.9933953 0.5556122 -0.8260608 0.9933953 0.5556122 -0.8999349 0.9933953 0.5556122 -0.9933953 0.9933953 0.5556122 -0.9948487 0.9145732 0.6173519 -0.9959706 0.8740262 0.6746998 -0.9968409 0.8588218 0.7266285 -0.9975189 0.8594117 0.7726049 -0.9980488 0.8690364 0.8125232 -0.9984638 0.8831255 0.8466054 -0.9987895 0.8987476 0.8752947 -0.9990455 0.9141422 0.8991593 -0.999247 0.928347 0.9188164 -0.9994057 0.9409186 0.9348776 -0.9995308 0.9517328 0.9479146 -0.9996295 0.9608482 0.9584406 -0.9997074 0.9684181 0.9669028 -0.9997688 0.9746346 0.9736823 -0.9998174 0.9796966 0.9790988 -0.9998557 0.9837916 0.9834167 -0.999886 0.9870878 0.9868529 -0.9999099 0.9897306 0.9895835 -0.9999288 0.9918431 0.991751 -0.9999437 0.9935277 0.9934701 -0.6139459 0.9948662 0.6194093 -0.6139352 0.994866 0.6193822 -0.6139219 0.9948657 0.6193482 -0.6139056 0.9948653 0.6193055 -0.6138855 0.9948649 0.6192522 -0.6138613 0.9948643 0.6191858 -0.6138323 0.9948636 0.6191035 -0.6137984 0.9948628 0.619002 -0.6137599 0.9948617 0.618878 -0.6137183 0.9948604 0.6187279 -0.6136769 0.9948589 0.6185491 -0.6136427 0.9948571 0.6183406 -0.6136284 0.9948551 0.6181052 -0.6136569 0.994853 0.617853 -0.6137675 0.9948509 0.6176072 -0.6140266 0.9948493 0.6174138 -0.6145393 0.9948487 0.6173519 -0.6152669 0.9948487 0.6173519 -0.6161874 0.9948487 0.6173519 -0.6173519 0.9948487 0.6173519 -0.6188252 0.9948487 0.6173519 -0.6206891 0.9948487 0.6173519 -0.6230471 0.9948487 0.6173519 -0.6260304 0.9948487 0.6173519 -0.6298046 0.9948487 0.6173519 -0.6345795 0.9948487 0.6173519 -0.6406203 0.9948487 0.6173519 -0.6482627 0.9948487 0.6173519 -0.6579314 0.9948487 0.6173519 -0.6701635 0.9948487 0.6173519 -0.6856388 0.9948487 0.6173519 -0.7052169 0.9948487 0.6173519 -0.7299859 0.9948487 0.6173519 -0.7613218 0.9948487 0.6173519 -0.8009659 0.9948487 0.6173519 -0.8511207 0.9948487 0.6173519 -0.9145732 0.9948487 0.6173519 -0.9948487 0.9948487 0.6173519 -0.9959706 0.9278617 0.6746998 -0.9968409 0.8945255 0.7266285 -0.9975189 0.8828571 0.7726049 -0.9980488 0.8842998 0.8125232 -0.9984638 0.892989 0.8466054 -0.9987895 0.9050819 0.8752947 -0.9990455 0.9181889 0.8991593 -0.999247 0.9309211 0.9188164 -0.9994057 0.9425502 0.9348776 -0.9995308 0.952764 0.9479146 -0.9996295 0.9614985 0.9584406 -0.9997074 0.9688274 0.9669028 -0.9997688 0.9748918 0.9736823 -0.9998174 0.979858 0.9790988 -0.9998557 0.9838928 0.9834167 -0.999886 0.9871512 0.9868529 -0.9999099 0.9897703 0.9895835 -0.9999288 0.991868 0.991751 -0.9999437 0.9935432 0.9934701 -0.6724572 0.9959813 0.6761248 -0.6724495 0.9959811 0.676106 -0.6724399 0.9959809 0.6760824 -0.672428 0.9959807 0.6760529 -0.6724135 0.9959804 0.6760159 -0.6723959 0.9959801 0.6759699 -0.6723748 0.9959797 0.6759129 -0.67235 0.9959791 0.6758426 -0.6723217 0.9959785 0.6757566 -0.6722907 0.9959777 0.6756526 -0.6722594 0.9959768 0.6755287 -0.6722322 0.9959757 0.6753843 -0.672218 0.9959745 0.6752213 -0.672232 0.9959732 0.6750467 -0.6723012 0.9959719 0.6748765 -0.6724711 0.9959709 0.6747426 -0.6728136 0.9959706 0.6746998 -0.6733015 0.9959706 0.6746998 -0.6739188 0.9959706 0.6746998 -0.6746998 0.9959706 0.6746998 -0.6756878 0.9959706 0.6746998 -0.6769378 0.9959706 0.6746998 -0.6785192 0.9959706 0.6746998 -0.6805199 0.9959706 0.6746998 -0.683051 0.9959706 0.6746998 -0.6862532 0.9959706 0.6746998 -0.6903044 0.9959706 0.6746998 -0.6954296 0.9959706 0.6746998 -0.7019138 0.9959706 0.6746998 -0.710117 0.9959706 0.6746998 -0.7204952 0.9959706 0.6746998 -0.733625 0.9959706 0.6746998 -0.7502359 0.9959706 0.6746998 -0.7712508 0.9959706 0.6746998 -0.7978374 0.9959706 0.6746998 -0.8314729 0.9959706 0.6746998 -0.8740262 0.9959706 0.6746998 -0.9278617 0.9959706 0.6746998 -0.9959706 0.9959706 0.6746998 -0.9968409 0.9396953 0.7266285 -0.9975189 0.9125186 0.7726049 -0.9980488 0.9036101 0.8125232 -0.9984638 0.9054678 0.8466054 -0.9987895 0.9130957 0.8752947 -0.9990455 0.9233085 0.8991593 -0.999247 0.9341777 0.9188164 -0.9994057 0.9446144 0.9348776 -0.9995308 0.9540687 0.9479146 -0.9996295 0.9623212 0.9584406 -0.9997074 0.9693452 0.9669028 -0.9997688 0.9752172 0.9736823 -0.9998174 0.9800622 0.9790988 -0.9998557 0.9840209 0.9834167 -0.999886 0.9872315 0.9868529 -0.9999099 0.9898206 0.9895835 -0.9999288 0.9918994 0.991751 -0.9999437 0.9935629 0.9934701 -0.7251659 0.9968475 0.7276003 -0.7251605 0.9968474 0.7275875 -0.7251537 0.9968473 0.7275714 -0.7251454 0.9968472 0.7275513 -0.7251351 0.996847 0.7275261 -0.7251226 0.9968468 0.7274947 -0.7251076 0.9968465 0.7274557 -0.7250899 0.9968462 0.7274078 -0.7250697 0.9968458 0.7273491 -0.7250473 0.9968453 0.7272782 -0.7250244 0.9968448 0.7271937 -0.7250039 0.9968441 0.7270952 -0.7249916 0.9968433 0.726984 -0.7249978 0.9968425 0.7268649 -0.7250408 0.9968418 0.7267489 -0.7251511 0.9968411 0.7266577 -0.7253775 0.9968409 0.7266285 -0.7257011 0.9968409 0.7266285 -0.7261105 0.9968409 0.7266285 -0.7266285 0.9968409 0.7266285 -0.7272837 0.9968409 0.7266285 -0.7281127 0.9968409 0.7266285 -0.7291615 0.9968409 0.7266285 -0.7304884 0.9968409 0.7266285 -0.732167 0.9968409 0.7266285 -0.7342907 0.9968409 0.7266285 -0.7369774 0.9968409 0.7266285 -0.7403765 0.9968409 0.7266285 -0.7446768 0.9968409 0.7266285 -0.7501172 0.9968409 0.7266285 -0.757 0.9968409 0.7266285 -0.7657077 0.9968409 0.7266285 -0.776724 0.9968409 0.7266285 -0.7906611 0.9968409 0.7266285 -0.8082934 0.9968409 0.7266285 -0.8306004 0.9968409 0.7266285 -0.8588218 0.9968409 0.7266285 -0.8945255 0.9968409 0.7266285 -0.9396953 0.9968409 0.7266285 -0.9968409 0.9968409 0.7266285 -0.9975189 0.9500442 0.7726049 -0.9980488 0.9280401 0.8125232 -0.9984638 0.921255 0.8466054 -0.9987895 0.9232341 0.8752947 -0.9990455 0.9297854 0.8991593 -0.999247 0.9382977 0.9188164 -0.9994057 0.9472259 0.9348776 -0.9995308 0.9557192 0.9479146 -0.9996295 0.963362 0.9584406 -0.9997074 0.9700002 0.9669028 -0.9997688 0.9756289 0.9736823 -0.9998174 0.9803206 0.9790988 -0.9998557 0.9841829 0.9834167 -0.999886 0.987333 0.9868529 -0.9999099 0.9898842 0.9895835 -0.9999288 0.9919392 0.991751 -0.9999437 0.9935878 0.9934701 -0.7716588 0.997523 0.7732585 -0.7716551 0.997523 0.7732499 -0.7716504 0.9975229 0.7732391 -0.7716446 0.9975228 0.7732255 -0.7716375 0.9975227 0.7732085 -0.7716288 0.9975226 0.7731874 -0.7716184 0.9975224 0.7731612 -0.7716061 0.9975222 0.7731289 -0.7715919 0.997522 0.7730895 -0.7715762 0.9975217 0.7730418 -0.7715599 0.9975213 0.7729849 -0.7715449 0.9975209 0.7729187 -0.7715352 0.9975204 0.7728439 -0.7715376 0.9975199 0.7727638 -0.7715641 0.9975194 0.7726859 -0.7716352 0.9975191 0.7726245 -0.7717834 0.9975189 0.7726049 -0.7719959 0.9975189 0.7726049 -0.7722648 0.9975189 0.7726049 -0.7726049 0.9975189 0.7726049 -0.7730352 0.9975189 0.7726049 -0.7735795 0.9975189 0.7726049 -0.7742682 0.9975189 0.7726049 -0.7751395 0.9975189 0.7726049 -0.7762418 0.9975189 0.7726049 -0.7776364 0.9975189 0.7726049 -0.7794007 0.9975189 0.7726049 -0.7816327 0.9975189 0.7726049 -0.7844566 0.9975189 0.7726049 -0.7880291 0.9975189 0.7726049 -0.7925488 0.9975189 0.7726049 -0.7982669 0.9975189 0.7726049 -0.8055009 0.9975189 0.7726049 -0.8146529 0.9975189 0.7726049 -0.8262314 0.9975189 0.7726049 -0.8408797 0.9975189 0.7726049 -0.8594117 0.9975189 0.7726049 -0.8828571 0.9975189 0.7726049 -0.9125186 0.9975189 0.7726049 -0.9500442 0.9975189 0.7726049 -0.9975189 0.9975189 0.7726049 -0.9980488 0.9589472 0.8125232 -0.9984638 0.9412278 0.8466054 -0.9987895 0.9360606 0.8752947 -0.9990455 0.9379796 0.8991593 -0.999247 0.94351 0.9188164 -0.9994057 0.9505298 0.9348776 -0.9995308 0.9578074 0.9479146 -0.9996295 0.9646787 0.9584406 -0.9997074 0.970829 0.9669028 -0.9997688 0.9761497 0.9736823 -0.9998174 0.9806476 0.9790988 -0.9998557 0.984388 0.9834167 -0.999886 0.9874615 0.9868529 -0.9999099 0.9899646 0.9895835 -0.9999288 0.9919896 0.991751 -0.9999437 0.9936193 0.9934701 -0.8119154 0.9980513 0.8129574 -0.8119128 0.9980512 0.8129517 -0.8119096 0.9980512 0.8129445 -0.8119057 0.9980511 0.8129354 -0.8119009 0.9980511 0.8129242 -0.8118949 0.998051 0.8129101 -0.8118878 0.9980509 0.8128927 -0.8118794 0.9980508 0.8128713 -0.8118697 0.9980506 0.8128451 -0.8118589 0.9980504 0.8128134 -0.8118476 0.9980502 0.8127756 -0.811837 0.99805 0.8127316 -0.8118298 0.9980497 0.8126819 -0.8118303 0.9980494 0.8126288 -0.8118466 0.9980491 0.812577 -0.8118921 0.9980488 0.8125362 -0.8119884 0.9980488 0.8125232 -0.8121268 0.9980488 0.8125232 -0.8123018 0.9980488 0.8125232 -0.8125232 0.9980488 0.8125232 -0.8128033 0.9980488 0.8125232 -0.8131577 0.9980488 0.8125232 -0.8136061 0.9980488 0.8125232 -0.8141733 0.9980488 0.8125232 -0.8148909 0.9980488 0.8125232 -0.8157988 0.9980488 0.8125232 -0.8169474 0.9980488 0.8125232 -0.8184005 0.9980488 0.8125232 -0.8202389 0.9980488 0.8125232 -0.8225647 0.9980488 0.8125232 -0.8255071 0.9980488 0.8125232 -0.8292297 0.9980488 0.8125232 -0.8339392 0.9980488 0.8125232 -0.8398974 0.9980488 0.8125232 -0.8474353 0.9980488 0.8125232 -0.8569716 0.9980488 0.8125232 -0.8690364 0.9980488 0.8125232 -0.8842998 0.9980488 0.8125232 -0.9036101 0.9980488 0.8125232 -0.9280401 0.9980488 0.8125232 -0.9589472 0.9980488 0.8125232 -0.9980488 0.9980488 0.8125232 -0.9984638 0.9664961 0.8466054 -0.9987895 0.9522877 0.8752947 -0.9990455 0.9483463 0.8991593 -0.999247 0.9501042 0.9188164 -0.9994057 0.9547096 0.9348776 -0.9995308 0.9604492 0.9479146 -0.9996295 0.9663445 0.9584406 -0.9997074 0.9718774 0.9669028 -0.9997688 0.9768086 0.9736823 -0.9998174 0.9810611 0.9790988 -0.9998557 0.9846473 0.9834167 -0.999886 0.987624 0.9868529 -0.9999099 0.9900664 0.9895835 -0.9999288 0.9920533 0.991751 -0.9999437 0.9936592 0.9934701 -0.8462171 0.9984653 0.8468908 -0.8462154 0.9984653 0.846887 -0.8462132 0.9984653 0.8468823 -0.8462106 0.9984653 0.8468763 -0.8462073 0.9984652 0.8468689 -0.8462034 0.9984652 0.8468597 -0.8461986 0.9984651 0.8468482 -0.8461929 0.998465 0.8468341 -0.8461864 0.9984649 0.8468169 -0.8461791 0.9984648 0.8467961 -0.8461714 0.9984647 0.8467713 -0.8461641 0.9984645 0.8467423 -0.8461589 0.9984643 0.8467097 -0.8461587 0.9984642 0.8466748 -0.8461687 0.998464 0.8466407 -0.8461977 0.9984638 0.846614 -0.8462598 0.9984638 0.8466054 -0.8463492 0.9984638 0.8466054 -0.8464623 0.9984638 0.8466054 -0.8466054 0.9984638 0.8466054 -0.8467864 0.9984638 0.8466054 -0.8470154 0.9984638 0.8466054 -0.8473052 0.9984638 0.8466054 -0.8476717 0.9984638 0.8466054 -0.8481355 0.9984638 0.8466054 -0.8487222 0.9984638 0.8466054 -0.8494644 0.9984638 0.8466054 -0.8504035 0.9984638 0.8466054 -0.8515915 0.9984638 0.8466054 -0.8530945 0.9984638 0.8466054 -0.8549959 0.9984638 0.8466054 -0.8574015 0.9984638 0.8466054 -0.8604449 0.9984638 0.8466054 -0.8642952 0.9984638 0.8466054 -0.8691663 0.9984638 0.8466054 -0.875329 0.9984638 0.8466054 -0.8831255 0.9984638 0.8466054 -0.892989 0.9984638 0.8466054 -0.9054678 0.9984638 0.8466054 -0.921255 0.9984638 0.8466054 -0.9412278 0.9984638 0.8466054 -0.9664961 0.9984638 0.8466054 -0.9984638 0.9984638 0.8466054 -0.9987895 0.9728171 0.8752947 -0.9990455 0.9614615 0.8991593 -0.999247 0.9584468 0.9188164 -0.9994057 0.9599976 0.9348776 -0.9995308 0.9637914 0.9479146 -0.9996295 0.968452 0.9584406 -0.9997074 0.9732039 0.9669028 -0.9997688 0.9776422 0.9736823 -0.9998174 0.9815844 0.9790988 -0.9998557 0.9849754 0.9834167 -0.999886 0.9878296 0.9868529 -0.9999099 0.9901951 0.9895835 -0.9999288 0.9921339 0.991751 -0.9999437 0.9937096 0.9934701 -0.8750477 0.9987905 0.8754805 -0.8750466 0.9987905 0.875478 -0.8750451 0.9987904 0.8754749 -0.8750434 0.9987904 0.8754711 -0.8750412 0.9987904 0.8754663 -0.8750386 0.9987904 0.8754602 -0.8750355 0.9987903 0.8754528 -0.8750317 0.9987903 0.8754436 -0.8750274 0.9987902 0.8754324 -0.8750225 0.9987902 0.8754188 -0.8750173 0.9987901 0.8754027 -0.8750124 0.99879 0.8753838 -0.8750088 0.9987899 0.8753626 -0.8750084 0.9987897 0.8753398 -0.8750145 0.9987896 0.8753177 -0.8750329 0.9987895 0.8753002 -0.8750727 0.9987895 0.8752947 -0.8751301 0.9987895 0.8752947 -0.8752028 0.9987895 0.8752947 -0.8752947 0.9987895 0.8752947 -0.8754109 0.9987895 0.8752947 -0.875558 0.9987895 0.8752947 -0.8757441 0.9987895 0.8752947 -0.8759795 0.9987895 0.8752947 -0.8762773 0.9987895 0.8752947 -0.8766541 0.9987895 0.8752947 -0.8771307 0.9987895 0.8752947 -0.8777338 0.9987895 0.8752947 -0.8784967 0.9987895 0.8752947 -0.8794619 0.9987895 0.8752947 -0.880683 0.9987895 0.8752947 -0.8822279 0.9987895 0.8752947 -0.8841823 0.9987895 0.8752947 -0.886655 0.9987895 0.8752947 -0.8897832 0.9987895 0.8752947 -0.8937407 0.9987895 0.8752947 -0.8987476 0.9987895 0.8752947 -0.9050819 0.9987895 0.8752947 -0.9130957 0.9987895 0.8752947 -0.9232341 0.9987895 0.8752947 -0.9360606 0.9987895 0.8752947 -0.9522877 0.9987895 0.8752947 -0.9728171 0.9987895 0.8752947 -0.9987895 0.9987895 0.8752947 -0.9990455 0.9780539 0.8991593 -0.999247 0.9690013 0.9188164 -0.9994057 0.9666876 0.9348776 -0.9995308 0.9680197 0.9479146 -0.9996295 0.9711183 0.9584406 -0.9997074 0.974882 0.9669028 -0.9997688 0.9786968 0.9736823 -0.9998174 0.9822464 0.9790988 -0.9998557 0.9853905 0.9834167 -0.999886 0.9880897 0.9868529 -0.9999099 0.990358 0.9895835 -0.9999288 0.9922358 0.991751 -0.9999437 0.9937734 0.9934701 -0.8990028 0.9990461 0.8992794 -0.899002 0.9990461 0.8992778 -0.8990011 0.9990461 0.8992758 -0.899 0.9990461 0.8992733 -0.8989986 0.9990461 0.8992702 -0.8989969 0.9990461 0.8992663 -0.8989948 0.9990461 0.8992615 -0.8989923 0.999046 0.8992555 -0.8989895 0.999046 0.8992483 -0.8989863 0.9990459 0.8992395 -0.8989829 0.9990459 0.8992291 -0.8989796 0.9990458 0.8992169 -0.8989771 0.9990458 0.8992032 -0.8989767 0.9990457 0.8991885 -0.8989805 0.9990456 0.8991742 -0.8989921 0.9990456 0.8991629 -0.8990175 0.9990455 0.8991593 -0.8990542 0.9990455 0.8991593 -0.8991006 0.9990455 0.8991593 -0.8991593 0.9990455 0.8991593 -0.8992336 0.9990455 0.8991593 -0.8993275 0.9990455 0.8991593 -0.8994464 0.9990455 0.8991593 -0.8995968 0.9990455 0.8991593 -0.899787 0.9990455 0.8991593 -0.9000277 0.9990455 0.8991593 -0.9003323 0.9990455 0.8991593 -0.9007175 0.9990455 0.8991593 -0.9012049 0.9990455 0.8991593 -0.9018215 0.9990455 0.8991593 -0.9026016 0.9990455 0.8991593 -0.9035886 0.9990455 0.8991593 -0.9048372 0.9990455 0.8991593 -0.9064168 0.9990455 0.8991593 -0.9084153 0.9990455 0.8991593 -0.9109436 0.9990455 0.8991593 -0.9141422 0.9990455 0.8991593 -0.9181889 0.9990455 0.8991593 -0.9233085 0.9990455 0.8991593 -0.9297854 0.9990455 0.8991593 -0.9379796 0.9990455 0.8991593 -0.9483463 0.9990455 0.8991593 -0.9614615 0.9990455 0.8991593 -0.9780539 0.9990455 0.8991593 -0.9990455 0.9990455 0.8991593 -0.999247 0.982354 0.9188164 -0.9994057 0.9751513 0.9348776 -0.9995308 0.9733691 0.9479146 -0.9996295 0.9744915 0.9584406 -0.9997074 0.977005 0.9669028 -0.9997688 0.980031 0.9736823 -0.9998174 0.9830838 0.9790988 -0.9998557 0.9859157 0.9834167 -0.999886 0.9884188 0.9868529 -0.9999099 0.9905641 0.9895835 -0.9999288 0.9923648 0.991751 -0.9999437 0.9938541 0.9934701 -0.9187175 0.9992474 0.9188935 -0.918717 0.9992474 0.9188925 -0.9187164 0.9992474 0.9188912 -0.9187157 0.9992474 0.9188896 -0.9187148 0.9992474 0.9188876 -0.9187137 0.9992474 0.9188851 -0.9187123 0.9992473 0.918882 -0.9187107 0.9992473 0.9188782 -0.9187089 0.9992473 0.9188735 -0.9187068 0.9992473 0.9188679 -0.9187045 0.9992472 0.9188612 -0.9187024 0.9992472 0.9188534 -0.9187008 0.9992472 0.9188446 -0.9187004 0.9992471 0.9188351 -0.9187027 0.9992471 0.9188259 -0.9187101 0.999247 0.9188187 -0.9187262 0.999247 0.9188164 -0.9187495 0.999247 0.9188164 -0.9187791 0.999247 0.9188164 -0.9188164 0.999247 0.9188164 -0.9188636 0.999247 0.9188164 -0.9189234 0.999247 0.9188164 -0.918999 0.999247 0.9188164 -0.9190947 0.999247 0.9188164 -0.9192157 0.999247 0.9188164 -0.9193688 0.999247 0.9188164 -0.9195625 0.999247 0.9188164 -0.9198076 0.999247 0.9188164 -0.9201176 0.999247 0.9188164 -0.9205098 0.999247 0.9188164 -0.9210061 0.999247 0.9188164 -0.9216339 0.999247 0.9188164 -0.9224281 0.999247 0.9188164 -0.9234329 0.999247 0.9188164 -0.9247041 0.999247 0.9188164 -0.9263124 0.999247 0.9188164 -0.928347 0.999247 0.9188164 -0.9309211 0.999247 0.9188164 -0.9341777 0.999247 0.9188164 -0.9382977 0.999247 0.9188164 -0.94351 0.999247 0.9188164 -0.9501042 0.999247 0.9188164 -0.9584468 0.999247 0.9188164 -0.9690013 0.999247 0.9188164 -0.982354 0.999247 0.9188164 -0.999247 0.999247 0.9188164 -0.9994057 0.9858591 0.9348776 -0.9995308 0.9801368 0.9479146 -0.9996295 0.978759 0.9584406 -0.9997074 0.9796909 0.9669028 -0.9997688 0.981719 0.9736823 -0.9998174 0.9841433 0.9790988 -0.9998557 0.9865801 0.9834167 -0.999886 0.9888351 0.9868529 -0.9999099 0.9908248 0.9895835 -0.9999288 0.992528 0.991751 -0.9999437 0.9939562 0.9934701 -0.9348153 0.999406 0.9349268 -0.9348149 0.999406 0.9349262 -0.9348146 0.999406 0.9349253 -0.9348141 0.999406 0.9349243 -0.9348135 0.999406 0.934923 -0.9348128 0.9994059 0.9349215 -0.9348119 0.9994059 0.9349195 -0.9348109 0.9994059 0.934917 -0.9348097 0.9994059 0.9349141 -0.9348083 0.9994059 0.9349105 -0.9348069 0.9994059 0.9349062 -0.9348055 0.9994059 0.9349012 -0.9348044 0.9994058 0.9348956 -0.9348042 0.9994058 0.9348895 -0.9348056 0.9994058 0.9348837 -0.9348102 0.9994057 0.9348791 -0.9348204 0.9994057 0.9348776 -0.9348352 0.9994057 0.9348776 -0.9348539 0.9994057 0.9348776 -0.9348776 0.9994057 0.9348776 -0.9349075 0.9994057 0.9348776 -0.9349454 0.9994057 0.9348776 -0.9349933 0.9994057 0.9348776 -0.935054 0.9994057 0.9348776 -0.9351307 0.9994057 0.9348776 -0.9352277 0.9994057 0.9348776 -0.9353505 0.9994057 0.9348776 -0.9355059 0.9994057 0.9348776 -0.9357024 0.9994057 0.9348776 -0.935951 0.9994057 0.9348776 -0.9362655 0.9994057 0.9348776 -0.9366635 0.9994057 0.9348776 -0.9371669 0.9994057 0.9348776 -0.9378038 0.9994057 0.9348776 -0.9386096 0.9994057 0.9348776 -0.939629 0.9994057 0.9348776 -0.9409186 0.9994057 0.9348776 -0.9425502 0.9994057 0.9348776 -0.9446144 0.9994057 0.9348776 -0.9472259 0.9994057 0.9348776 -0.9505298 0.9994057 0.9348776 -0.9547096 0.9994057 0.9348776 -0.9599976 0.9994057 0.9348776 -0.9666876 0.9994057 0.9348776 -0.9751513 0.9994057 0.9348776 -0.9858591 0.9994057 0.9348776 -0.9994057 0.9994057 0.9348776 -0.9995308 0.9886988 0.9479146 -0.9996295 0.9841579 0.9584406 -0.9997074 0.983089 0.9669028 -0.9997688 0.9838545 0.9736823 -0.9998174 0.9854838 0.9790988 -0.9998557 0.9874207 0.9834167 -0.999886 0.9893618 0.9868529 -0.9999099 0.9911547 0.9895835 -0.9999288 0.9927345 0.991751 -0.9999437 0.9940854 0.9934701 -0.9478754 0.999531 0.9479459 -0.9478752 0.999531 0.9479455 -0.947875 0.999531 0.947945 -0.9478746 0.999531 0.9479443 -0.9478743 0.999531 0.9479435 -0.9478738 0.999531 0.9479425 -0.9478733 0.999531 0.9479413 -0.9478726 0.999531 0.9479397 -0.9478718 0.999531 0.9479378 -0.947871 0.9995309 0.9479355 -0.94787 0.9995309 0.9479328 -0.9478691 0.9995309 0.9479296 -0.9478684 0.9995309 0.9479261 -0.9478683 0.9995309 0.9479222 -0.9478691 0.9995309 0.9479185 -0.947872 0.9995309 0.9479156 -0.9478785 0.9995308 0.9479146 -0.9478878 0.9995308 0.9479146 -0.9478997 0.9995308 0.9479146 -0.9479146 0.9995308 0.9479146 -0.9479335 0.9995308 0.9479146 -0.9479575 0.9995308 0.9479146 -0.9479878 0.9995308 0.9479146 -0.9480261 0.9995308 0.9479146 -0.9480746 0.9995308 0.9479146 -0.9481359 0.9995308 0.9479146 -0.9482135 0.9995308 0.9479146 -0.9483117 0.9995308 0.9479146 -0.9484359 0.9995308 0.9479146 -0.9485931 0.9995308 0.9479146 -0.9487918 0.9995308 0.9479146 -0.9490434 0.9995308 0.9479146 -0.9493615 0.9995308 0.9479146 -0.9497641 0.9995308 0.9479146 -0.9502734 0.9995308 0.9479146 -0.9509177 0.9995308 0.9479146 -0.9517328 0.9995308 0.9479146 -0.952764 0.9995308 0.9479146 -0.9540687 0.9995308 0.9479146 -0.9557192 0.9995308 0.9479146 -0.9578074 0.9995308 0.9479146 -0.9604492 0.9995308 0.9479146 -0.9637914 0.9995308 0.9479146 -0.9680197 0.9995308 0.9479146 -0.9733691 0.9995308 0.9479146 -0.9801368 0.9995308 0.9479146 -0.9886988 0.9995308 0.9479146 -0.9995308 0.9995308 0.9479146 -0.9996295 0.9909882 0.9584406 -0.9997074 0.9873879 0.9669028 -0.9997688 0.9865561 0.9736823 -0.9998174 0.9871796 0.9790988 -0.9998557 0.9884841 0.9834167 -0.999886 0.9900282 0.9868529 -0.9999099 0.991572 0.9895835 -0.9999288 0.9929957 0.991751 -0.9999437 0.9942488 0.9934701 -0.958416 0.9996296 0.9584605 -0.9584159 0.9996296 0.9584602 -0.9584157 0.9996296 0.9584599 -0.9584155 0.9996296 0.9584595 -0.9584153 0.9996296 0.9584589 -0.958415 0.9996296 0.9584583 -0.9584146 0.9996296 0.9584575 -0.9584142 0.9996296 0.9584565 -0.9584137 0.9996296 0.9584553 -0.9584132 0.9996296 0.9584539 -0.9584126 0.9996296 0.9584521 -0.958412 0.9996296 0.9584501 -0.9584115 0.9996296 0.9584479 -0.9584114 0.9996295 0.9584454 -0.958412 0.9996295 0.9584431 -0.9584138 0.9996295 0.9584412 -0.9584178 0.9996295 0.9584406 -0.9584237 0.9996295 0.9584406 -0.9584312 0.9996295 0.9584406 -0.9584406 0.9996295 0.9584406 -0.9584526 0.9996295 0.9584406 -0.9584677 0.9996295 0.9584406 -0.9584868 0.9996295 0.9584406 -0.9585109 0.9996295 0.9584406 -0.9585415 0.9996295 0.9584406 -0.9585802 0.9996295 0.9584406 -0.9586291 0.9996295 0.9584406 -0.958691 0.9996295 0.9584406 -0.9587693 0.9996295 0.9584406 -0.9588684 0.9996295 0.9584406 -0.9589938 0.9996295 0.9584406 -0.9591524 0.9996295 0.9584406 -0.959353 0.9996295 0.9584406 -0.9596068 0.9996295 0.9584406 -0.959928 0.9996295 0.9584406 -0.9603343 0.9996295 0.9584406 -0.9608482 0.9996295 0.9584406 -0.9614985 0.9996295 0.9584406 -0.9623212 0.9996295 0.9584406 -0.963362 0.9996295 0.9584406 -0.9646787 0.9996295 0.9584406 -0.9663445 0.9996295 0.9584406 -0.968452 0.9996295 0.9584406 -0.9711183 0.9996295 0.9584406 -0.9744915 0.9996295 0.9584406 -0.978759 0.9996295 0.9584406 -0.9841579 0.9996295 0.9584406 -0.9909882 0.9996295 0.9584406 -0.9996295 0.9996295 0.9584406 -0.9997074 0.9928267 0.9669028 -0.9997688 0.9899741 0.9736823 -0.9998174 0.989325 0.9790988 -0.9998557 0.9898295 0.9834167 -0.999886 0.9908712 0.9868529 -0.9999099 0.9920999 0.9895835 -0.9999288 0.9933261 0.991751 -0.9999437 0.9944556 0.9934701 -0.9668873 0.9997074 0.9669153 -0.9668872 0.9997074 0.9669152 -0.9668871 0.9997074 0.9669149 -0.966887 0.9997074 0.9669147 -0.9668869 0.9997074 0.9669144 -0.9668867 0.9997074 0.966914 -0.9668865 0.9997074 0.9669135 -0.9668862 0.9997074 0.9669128 -0.9668859 0.9997074 0.9669121 -0.9668855 0.9997074 0.9669112 -0.9668852 0.9997074 0.9669101 -0.9668848 0.9997074 0.9669088 -0.9668845 0.9997074 0.9669074 -0.9668844 0.9997074 0.9669058 -0.9668847 0.9997074 0.9669043 -0.9668859 0.9997074 0.9669032 -0.9668884 0.9997074 0.9669028 -0.9668922 0.9997074 0.9669028 -0.9668969 0.9997074 0.9669028 -0.9669028 0.9997074 0.9669028 -0.9669103 0.9997074 0.9669028 -0.9669198 0.9997074 0.9669028 -0.9669318 0.9997074 0.9669028 -0.966947 0.9997074 0.9669028 -0.9669663 0.9997074 0.9669028 -0.9669906 0.9997074 0.9669028 -0.9670214 0.9997074 0.9669028 -0.9670604 0.9997074 0.9669028 -0.9671097 0.9997074 0.9669028 -0.967172 0.9997074 0.9669028 -0.9672509 0.9997074 0.9669028 -0.9673508 0.9997074 0.9669028 -0.967477 0.9997074 0.9669028 -0.9676368 0.9997074 0.9669028 -0.9678389 0.9997074 0.9669028 -0.9680946 0.9997074 0.9669028 -0.9684181 0.9997074 0.9669028 -0.9688274 0.9997074 0.9669028 -0.9693452 0.9997074 0.9669028 -0.9700002 0.9997074 0.9669028 -0.970829 0.9997074 0.9669028 -0.9718774 0.9997074 0.9669028 -0.9732039 0.9997074 0.9669028 -0.974882 0.9997074 0.9669028 -0.977005 0.9997074 0.9669028 -0.9796909 0.9997074 0.9669028 -0.983089 0.9997074 0.9669028 -0.9873879 0.9997074 0.9669028 -0.9928267 0.9997074 0.9669028 -0.9997074 0.9997074 0.9669028 -0.9997688 0.9942982 0.9736823 -0.9998174 0.9920392 0.9790988 -0.9998557 0.9915316 0.9834167 -0.999886 0.9919377 0.9868529 -0.9999099 0.9927678 0.9895835 -0.9999288 0.9937442 0.991751 -0.9999437 0.9947172 0.9934701 -0.9736726 0.9997689 0.9736902 -0.9736726 0.9997689 0.9736901 -0.9736725 0.9997689 0.97369 -0.9736724 0.9997689 0.9736898 -0.9736723 0.9997689 0.9736896 -0.9736722 0.9997689 0.9736894 -0.9736721 0.9997689 0.973689 -0.9736719 0.9997689 0.9736886 -0.9736717 0.9997689 0.9736882 -0.9736715 0.9997689 0.9736876 -0.9736712 0.9997689 0.9736869 -0.973671 0.9997689 0.9736861 -0.9736708 0.9997689 0.9736852 -0.9736708 0.9997689 0.9736842 -0.973671 0.9997688 0.9736833 -0.9736717 0.9997688 0.9736826 -0.9736733 0.9997688 0.9736823 -0.9736756 0.9997688 0.9736823 -0.9736786 0.9997688 0.9736823 -0.9736823 0.9997688 0.9736823 -0.973687 0.9997688 0.9736823 -0.973693 0.9997688 0.9736823 -0.9737006 0.9997688 0.9736823 -0.9737101 0.9997688 0.9736823 -0.9737222 0.9997688 0.9736823 -0.9737375 0.9997688 0.9736823 -0.9737569 0.9997688 0.9736823 -0.9737814 0.9997688 0.9736823 -0.9738123 0.9997688 0.9736823 -0.9738515 0.9997688 0.9736823 -0.9739011 0.9997688 0.9736823 -0.9739638 0.9997688 0.9736823 -0.9740432 0.9997688 0.9736823 -0.9741436 0.9997688 0.9736823 -0.9742706 0.9997688 0.9736823 -0.9744313 0.9997688 0.9736823 -0.9746346 0.9997688 0.9736823 -0.9748918 0.9997688 0.9736823 -0.9752172 0.9997688 0.9736823 -0.9756289 0.9997688 0.9736823 -0.9761497 0.9997688 0.9736823 -0.9768086 0.9997688 0.9736823 -0.9776422 0.9997688 0.9736823 -0.9786968 0.9997688 0.9736823 -0.980031 0.9997688 0.9736823 -0.981719 0.9997688 0.9736823 -0.9838545 0.9997688 0.9736823 -0.9865561 0.9997688 0.9736823 -0.9899741 0.9997688 0.9736823 -0.9942982 0.9997688 0.9736823 -0.9997688 0.9997688 0.9736823 -0.9998174 0.9954731 0.9790988 -0.9998557 0.9936849 0.9834167 -0.999886 0.993287 0.9868529 -0.9999099 0.9936128 0.9895835 -0.9999288 0.9942731 0.991751 -0.9999437 0.9950481 0.9934701 -0.9790927 0.9998174 0.9791038 -0.9790927 0.9998174 0.9791037 -0.9790927 0.9998174 0.9791036 -0.9790926 0.9998174 0.9791035 -0.9790925 0.9998174 0.9791034 -0.9790925 0.9998174 0.9791032 -0.9790924 0.9998174 0.979103 -0.9790923 0.9998174 0.9791028 -0.9790921 0.9998174 0.9791025 -0.979092 0.9998174 0.9791021 -0.9790919 0.9998174 0.9791017 -0.9790917 0.9998174 0.9791012 -0.9790916 0.9998174 0.9791006 -0.9790916 0.9998174 0.9791 -0.9790917 0.9998174 0.9790994 -0.9790921 0.9998174 0.9790989 -0.9790931 0.9998174 0.9790988 -0.9790946 0.9998174 0.9790988 -0.9790965 0.9998174 0.9790988 -0.9790988 0.9998174 0.9790988 -0.9791018 0.9998174 0.9790988 -0.9791055 0.9998174 0.9790988 -0.9791103 0.9998174 0.9790988 -0.9791163 0.9998174 0.9790988 -0.9791238 0.9998174 0.9790988 -0.9791334 0.9998174 0.9790988 -0.9791456 0.9998174 0.9790988 -0.979161 0.9998174 0.9790988 -0.9791804 0.9998174 0.9790988 -0.979205 0.9998174 0.9790988 -0.9792361 0.9998174 0.9790988 -0.9792755 0.9998174 0.9790988 -0.9793253 0.9998174 0.9790988 -0.9793883 0.9998174 0.9790988 -0.9794681 0.9998174 0.9790988 -0.9795689 0.9998174 0.9790988 -0.9796966 0.9998174 0.9790988 -0.979858 0.9998174 0.9790988 -0.9800622 0.9998174 0.9790988 -0.9803206 0.9998174 0.9790988 -0.9806476 0.9998174 0.9790988 -0.9810611 0.9998174 0.9790988 -0.9815844 0.9998174 0.9790988 -0.9822464 0.9998174 0.9790988 -0.9830838 0.9998174 0.9790988 -0.9841433 0.9998174 0.9790988 -0.9854838 0.9998174 0.9790988 -0.9871796 0.9998174 0.9790988 -0.989325 0.9998174 0.9790988 -0.9920392 0.9998174 0.9790988 -0.9954731 0.9998174 0.9790988 -0.9998174 0.9998174 0.9790988 -0.9998557 0.9964092 0.9834167 -0.999886 0.9949941 0.9868529 -0.9999099 0.9946818 0.9895835 -0.9999288 0.9949422 0.991751 -0.9999437 0.9954668 0.9934701 -0.9834129 0.9998557 0.9834199 -0.9834129 0.9998557 0.9834198 -0.9834129 0.9998557 0.9834198 -0.9834129 0.9998557 0.9834197 -0.9834128 0.9998557 0.9834196 -0.9834128 0.9998557 0.9834195 -0.9834127 0.9998557 0.9834194 -0.9834127 0.9998557 0.9834192 -0.9834126 0.9998557 0.9834191 -0.9834125 0.9998557 0.9834188 -0.9834124 0.9998557 0.9834186 -0.9834123 0.9998557 0.9834182 -0.9834122 0.9998557 0.9834179 -0.9834122 0.9998557 0.9834175 -0.9834123 0.9998557 0.9834171 -0.9834126 0.9998557 0.9834168 -0.9834132 0.9998557 0.9834167 -0.9834141 0.9998557 0.9834167 -0.9834153 0.9998557 0.9834167 -0.9834167 0.9998557 0.9834167 -0.9834186 0.9998557 0.9834167 -0.9834209 0.9998557 0.9834167 -0.9834239 0.9998557 0.9834167 -0.9834277 0.9998557 0.9834167 -0.9834324 0.9998557 0.9834167 -0.9834385 0.9998557 0.9834167 -0.9834461 0.9998557 0.9834167 -0.9834557 0.9998557 0.9834167 -0.9834679 0.9998557 0.9834167 -0.9834833 0.9998557 0.9834167 -0.9835029 0.9998557 0.9834167 -0.9835276 0.9998557 0.9834167 -0.9835588 0.9998557 0.9834167 -0.9835983 0.9998557 0.9834167 -0.9836483 0.9998557 0.9834167 -0.9837116 0.9998557 0.9834167 -0.9837916 0.9998557 0.9834167 -0.9838928 0.9998557 0.9834167 -0.9840209 0.9998557 0.9834167 -0.9841829 0.9998557 0.9834167 -0.984388 0.9998557 0.9834167 -0.9846473 0.9998557 0.9834167 -0.9849754 0.9998557 0.9834167 -0.9853905 0.9998557 0.9834167 -0.9859157 0.9998557 0.9834167 -0.9865801 0.9998557 0.9834167 -0.9874207 0.9998557 0.9834167 -0.9884841 0.9998557 0.9834167 -0.9898295 0.9998557 0.9834167 -0.9915316 0.9998557 0.9834167 -0.9936849 0.9998557 0.9834167 -0.9964092 0.9998557 0.9834167 -0.9998557 0.9998557 0.9834167 -0.999886 0.9971537 0.9868529 -0.9999099 0.9960342 0.9895835 -0.9999288 0.9957887 0.991751 -0.9999437 0.9959964 0.9934701 -0.9868505 0.999886 0.9868548 -0.9868505 0.999886 0.9868548 -0.9868505 0.999886 0.9868548 -0.9868505 0.999886 0.9868547 -0.9868504 0.999886 0.9868547 -0.9868504 0.999886 0.9868546 -0.9868504 0.999886 0.9868546 -0.9868503 0.999886 0.9868545 -0.9868503 0.999886 0.9868543 -0.9868502 0.999886 0.9868542 -0.9868502 0.999886 0.986854 -0.9868501 0.999886 0.9868538 -0.9868501 0.999886 0.9868536 -0.98685 0.999886 0.9868534 -0.9868501 0.999886 0.9868531 -0.9868503 0.999886 0.9868529 -0.9868507 0.999886 0.9868529 -0.9868512 0.999886 0.9868529 -0.986852 0.999886 0.9868529 -0.9868529 0.999886 0.9868529 -0.9868541 0.999886 0.9868529 -0.9868555 0.999886 0.9868529 -0.9868574 0.999886 0.9868529 -0.9868597 0.999886 0.9868529 -0.9868627 0.999886 0.9868529 -0.9868665 0.999886 0.9868529 -0.9868713 0.999886 0.9868529 -0.9868773 0.999886 0.9868529 -0.986885 0.999886 0.9868529 -0.9868946 0.999886 0.9868529 -0.9869069 0.999886 0.9868529 -0.9869223 0.999886 0.9868529 -0.9869419 0.999886 0.9868529 -0.9869667 0.999886 0.9868529 -0.986998 0.999886 0.9868529 -0.9870376 0.999886 0.9868529 -0.9870878 0.999886 0.9868529 -0.9871512 0.999886 0.9868529 -0.9872315 0.999886 0.9868529 -0.987333 0.999886 0.9868529 -0.9874615 0.999886 0.9868529 -0.987624 0.999886 0.9868529 -0.9878296 0.999886 0.9868529 -0.9880897 0.999886 0.9868529 -0.9884188 0.999886 0.9868529 -0.9888351 0.999886 0.9868529 -0.9893618 0.999886 0.9868529 -0.9900282 0.999886 0.9868529 -0.9908712 0.999886 0.9868529 -0.9919377 0.999886 0.9868529 -0.993287 0.999886 0.9868529 -0.9949941 0.999886 0.9868529 -0.9971537 0.999886 0.9868529 -0.999886 0.999886 0.9868529 -0.9999099 0.9977452 0.9895835 -0.9999288 0.9968597 0.991751 -0.9999437 0.9966665 0.9934701 -0.989582 0.9999099 0.9895847 -0.989582 0.9999099 0.9895847 -0.989582 0.9999099 0.9895847 -0.989582 0.9999099 0.9895847 -0.989582 0.9999099 0.9895846 -0.9895819 0.9999099 0.9895846 -0.9895819 0.9999099 0.9895845 -0.9895819 0.9999099 0.9895845 -0.9895819 0.9999099 0.9895844 -0.9895818 0.9999099 0.9895843 -0.9895818 0.9999099 0.9895842 -0.9895818 0.9999099 0.9895841 -0.9895817 0.9999099 0.9895839 -0.9895817 0.9999099 0.9895838 -0.9895817 0.9999099 0.9895836 -0.9895819 0.9999099 0.9895835 -0.9895821 0.9999099 0.9895835 -0.9895825 0.9999099 0.9895835 -0.9895829 0.9999099 0.9895835 -0.9895835 0.9999099 0.9895835 -0.9895842 0.9999099 0.9895835 -0.9895851 0.9999099 0.9895835 -0.9895863 0.9999099 0.9895835 -0.9895878 0.9999099 0.9895835 -0.9895897 0.9999099 0.9895835 -0.989592 0.9999099 0.9895835 -0.989595 0.9999099 0.9895835 -0.9895988 0.9999099 0.9895835 -0.9896036 0.9999099 0.9895835 -0.9896096 0.9999099 0.9895835 -0.9896173 0.9999099 0.9895835 -0.989627 0.9999099 0.9895835 -0.9896392 0.9999099 0.9895835 -0.9896547 0.9999099 0.9895835 -0.9896744 0.9999099 0.9895835 -0.9896992 0.9999099 0.9895835 -0.9897306 0.9999099 0.9895835 -0.9897703 0.9999099 0.9895835 -0.9898206 0.9999099 0.9895835 -0.9898842 0.9999099 0.9895835 -0.9899646 0.9999099 0.9895835 -0.9900664 0.9999099 0.9895835 -0.9901951 0.9999099 0.9895835 -0.990358 0.9999099 0.9895835 -0.9905641 0.9999099 0.9895835 -0.9908248 0.9999099 0.9895835 -0.9911547 0.9999099 0.9895835 -0.991572 0.9999099 0.9895835 -0.9920999 0.9999099 0.9895835 -0.9927678 0.9999099 0.9895835 -0.9936128 0.9999099 0.9895835 -0.9946818 0.9999099 0.9895835 -0.9960342 0.9999099 0.9895835 -0.9977452 0.9999099 0.9895835 -0.9999099 0.9999099 0.9895835 -0.9999288 0.9982146 0.991751 -0.9999437 0.9975143 0.9934701 -0.9917501 0.9999288 0.9917518 -0.9917501 0.9999288 0.9917518 -0.9917501 0.9999288 0.9917518 -0.9917501 0.9999288 0.9917518 -0.9917501 0.9999288 0.9917517 -0.9917501 0.9999288 0.9917517 -0.99175 0.9999288 0.9917517 -0.99175 0.9999288 0.9917516 -0.99175 0.9999288 0.9917516 -0.99175 0.9999288 0.9917515 -0.99175 0.9999288 0.9917515 -0.9917499 0.9999288 0.9917514 -0.9917499 0.9999288 0.9917513 -0.9917499 0.9999288 0.9917512 -0.9917499 0.9999288 0.9917511 -0.99175 0.9999288 0.991751 -0.9917502 0.9999288 0.991751 -0.9917504 0.9999288 0.991751 -0.9917507 0.9999288 0.991751 -0.991751 0.9999288 0.991751 -0.9917515 0.9999288 0.991751 -0.9917521 0.9999288 0.991751 -0.9917528 0.9999288 0.991751 -0.9917537 0.9999288 0.991751 -0.9917549 0.9999288 0.991751 -0.9917564 0.9999288 0.991751 -0.9917582 0.9999288 0.991751 -0.9917606 0.9999288 0.991751 -0.9917636 0.9999288 0.991751 -0.9917674 0.9999288 0.991751 -0.9917722 0.9999288 0.991751 -0.9917782 0.9999288 0.991751 -0.9917859 0.9999288 0.991751 -0.9917956 0.9999288 0.991751 -0.9918079 0.9999288 0.991751 -0.9918234 0.9999288 0.991751 -0.9918431 0.9999288 0.991751 -0.991868 0.9999288 0.991751 -0.9918994 0.9999288 0.991751 -0.9919392 0.9999288 0.991751 -0.9919896 0.9999288 0.991751 -0.9920533 0.9999288 0.991751 -0.9921339 0.9999288 0.991751 -0.9922358 0.9999288 0.991751 -0.9923648 0.9999288 0.991751 -0.992528 0.9999288 0.991751 -0.9927345 0.9999288 0.991751 -0.9929957 0.9999288 0.991751 -0.9933261 0.9999288 0.991751 -0.9937442 0.9999288 0.991751 -0.9942731 0.9999288 0.991751 -0.9949422 0.9999288 0.991751 -0.9957887 0.9999288 0.991751 -0.9968597 0.9999288 0.991751 -0.9982146 0.9999288 0.991751 -0.9999288 0.9999288 0.991751 -0.9999437 0.9985868 0.9934701 -0.9934695 0.9999437 0.9934706 -0.9934695 0.9999437 0.9934705 -0.9934695 0.9999437 0.9934705 -0.9934695 0.9999437 0.9934705 -0.9934695 0.9999437 0.9934705 -0.9934695 0.9999437 0.9934705 -0.9934695 0.9999437 0.9934705 -0.9934694 0.9999437 0.9934705 -0.9934694 0.9999437 0.9934704 -0.9934694 0.9999437 0.9934704 -0.9934694 0.9999437 0.9934703 -0.9934694 0.9999437 0.9934703 -0.9934694 0.9999437 0.9934702 -0.9934694 0.9999437 0.9934702 -0.9934694 0.9999437 0.9934701 -0.9934694 0.9999437 0.9934701 -0.9934695 0.9999437 0.9934701 -0.9934697 0.9999437 0.9934701 -0.9934698 0.9999437 0.9934701 -0.9934701 0.9999437 0.9934701 -0.9934704 0.9999437 0.9934701 -0.9934707 0.9999437 0.9934701 -0.9934712 0.9999437 0.9934701 -0.9934718 0.9999437 0.9934701 -0.9934725 0.9999437 0.9934701 -0.9934734 0.9999437 0.9934701 -0.9934746 0.9999437 0.9934701 -0.9934761 0.9999437 0.9934701 -0.9934779 0.9999437 0.9934701 -0.9934803 0.9999437 0.9934701 -0.9934833 0.9999437 0.9934701 -0.9934871 0.9999437 0.9934701 -0.9934919 0.9999437 0.9934701 -0.993498 0.9999437 0.9934701 -0.9935057 0.9999437 0.9934701 -0.9935154 0.9999437 0.9934701 -0.9935277 0.9999437 0.9934701 -0.9935432 0.9999437 0.9934701 -0.9935629 0.9999437 0.9934701 -0.9935878 0.9999437 0.9934701 -0.9936193 0.9999437 0.9934701 -0.9936592 0.9999437 0.9934701 -0.9937096 0.9999437 0.9934701 -0.9937734 0.9999437 0.9934701 -0.9938541 0.9999437 0.9934701 -0.9939562 0.9999437 0.9934701 -0.9940854 0.9999437 0.9934701 -0.9942488 0.9999437 0.9934701 -0.9944556 0.9999437 0.9934701 -0.9947172 0.9999437 0.9934701 -0.9950481 0.9999437 0.9934701 -0.9954668 0.9999437 0.9934701 -0.9959964 0.9999437 0.9934701 -0.9966665 0.9999437 0.9934701 -0.9975143 0.9999437 0.9934701 -0.9985868 0.9999437 0.9934701 -0.9999437 0.9999437 0.9934701 -0.0000238 0.0000238 0.2135639 -0.0005417 0.0000238 0.2135639 -0.0011968 0.0000238 0.2135639 -0.0020256 0.0000238 0.2135639 -0.0030742 0.0000238 0.2135639 -0.0044007 0.0000238 0.2135639 -0.006079 0.0000238 0.2135639 -0.0082023 0.0000238 0.2135639 -0.0108885 0.0000238 0.2135639 -0.0142868 0.0000238 0.2135639 -0.0185862 0.0000238 0.2135639 -0.0240255 0.0000238 0.2135639 -0.0309069 0.0000238 0.2135639 -0.0396127 0.0000238 0.2135639 -0.0506267 0.0000238 0.2135639 -0.0645609 0.0000238 0.2135639 -0.0821895 0.0000238 0.2135639 -0.1044919 0.0000238 0.2135639 -0.1327073 0.0000238 0.2135639 -0.1684036 0.0000238 0.2135639 -0.2135639 0.0000238 0.2135639 -0.2706977 0.0000238 0.2135639 -0.3429792 0.0000238 0.2135639 -0.4344249 0.0000238 0.2135639 -0.5501155 0.0000238 0.2135639 -0.6964791 0.0000238 0.2135639 -0.8407292 0.0051514 0.2075384 -0.9033413 0.0279321 0.1954535 -0.9354466 0.0624569 0.1944569 -0.9545467 0.1059991 0.2073855 -0.9669269 0.1572498 0.2337004 -0.9754027 0.2151269 0.2718587 -0.9814251 0.2783684 0.3198302 -0.9858181 0.3454107 0.3752597 -0.9890841 0.4144197 0.4355894 -0.9915469 0.4834235 0.4982181 -0.993424 0.5504963 0.5606894 -0.9948662 0.6139459 0.6208746 -0.9959813 0.6724572 0.6771085 -0.9968475 0.7251659 0.7282533 -0.997523 0.7716588 0.7736876 -0.9980513 0.8119154 0.8132369 -0.9984653 0.8462171 0.8470714 -0.9987905 0.8750477 0.8755966 -0.9990461 0.8990028 0.8993535 -0.9992474 0.9187175 0.9189407 -0.999406 0.9348153 0.9349567 -0.999531 0.9478754 0.9479648 -0.9996296 0.958416 0.9584724 -0.9997074 0.9668873 0.9669228 -0.9997689 0.9736726 0.9736949 -0.9998174 0.9790927 0.9791067 -0.9998557 0.9834129 0.9834217 -0.999886 0.9868505 0.986856 -0.9999099 0.989582 0.9895855 -0.9999288 0.9917501 0.9917523 -0.9999437 0.9934695 0.9934708 -0.0000238 0.0005417 0.2135639 -0.0000382 0.0000382 0.2130604 -0.0006933 0.0000382 0.2130604 -0.0015221 0.0000382 0.2130604 -0.0025707 0.0000382 0.2130604 -0.0038972 0.0000382 0.2130604 -0.0055755 0.0000382 0.2130604 -0.0076988 0.0000382 0.2130604 -0.0103849 0.0000382 0.2130604 -0.0137833 0.0000382 0.2130604 -0.0180827 0.0000382 0.2130604 -0.023522 0.0000382 0.2130604 -0.0304033 0.0000382 0.2130604 -0.0391092 0.0000382 0.2130604 -0.0501232 0.0000382 0.2130604 -0.0640574 0.0000382 0.2130604 -0.081686 0.0000382 0.2130604 -0.1039884 0.0000382 0.2130604 -0.1322038 0.0000382 0.2130604 -0.1679 0.0000382 0.2130604 -0.2130604 0.0000382 0.2130604 -0.2701941 0.0000382 0.2130604 -0.3424757 0.0000382 0.2130604 -0.4339214 0.0000382 0.2130604 -0.549612 0.0000382 0.2130604 -0.6959756 0.0000382 0.2130604 -0.8405071 0.0051286 0.2070953 -0.9032596 0.0278872 0.1950729 -0.9354101 0.0624063 0.1941366 -0.9545286 0.1059489 0.2071226 -0.9669173 0.1572031 0.2334893 -0.9753975 0.2150852 0.2716924 -0.9814221 0.2783325 0.3197017 -0.9858163 0.3453807 0.3751621 -0.9890831 0.4143955 0.4355166 -0.9915463 0.4834045 0.4981648 -0.9934236 0.5504818 0.5606511 -0.994866 0.6139352 0.6208476 -0.9959811 0.6724495 0.6770898 -0.9968474 0.7251605 0.7282405 -0.997523 0.7716551 0.773679 -0.9980512 0.8119128 0.8132312 -0.9984653 0.8462154 0.8470677 -0.9987905 0.8750466 0.8755941 -0.9990461 0.899002 0.899352 -0.9992474 0.918717 0.9189397 -0.999406 0.9348149 0.9349561 -0.999531 0.9478752 0.9479644 -0.9996296 0.9584159 0.9584721 -0.9997074 0.9668872 0.9669227 -0.9997689 0.9736726 0.9736948 -0.9998174 0.9790927 0.9791067 -0.9998557 0.9834129 0.9834217 -0.999886 0.9868505 0.986856 -0.9999099 0.989582 0.9895854 -0.9999288 0.9917501 0.9917522 -0.9999437 0.9934695 0.9934708 -0.0000238 0.0011968 0.2135639 -0.0000382 0.0006933 0.2130604 -0.0000611 0.0000611 0.2124282 -0.0008899 0.0000611 0.2124282 -0.0019385 0.0000611 0.2124282 -0.003265 0.0000611 0.2124282 -0.0049433 0.0000611 0.2124282 -0.0070666 0.0000611 0.2124282 -0.0097527 0.0000611 0.2124282 -0.0131511 0.0000611 0.2124282 -0.0174505 0.0000611 0.2124282 -0.0228898 0.0000611 0.2124282 -0.0297711 0.0000611 0.2124282 -0.038477 0.0000611 0.2124282 -0.049491 0.0000611 0.2124282 -0.0634252 0.0000611 0.2124282 -0.0810538 0.0000611 0.2124282 -0.1033562 0.0000611 0.2124282 -0.1315716 0.0000611 0.2124282 -0.1672678 0.0000611 0.2124282 -0.2124282 0.0000611 0.2124282 -0.2695619 0.0000611 0.2124282 -0.3418435 0.0000611 0.2124282 -0.4332891 0.0000611 0.2124282 -0.5489798 0.0000611 0.2124282 -0.6953434 0.0000611 0.2124282 -0.8402274 0.0051047 0.2065385 -0.9031567 0.0278347 0.1945945 -0.9353643 0.0623458 0.1937341 -0.9545059 0.1058883 0.2067924 -0.9669053 0.1571463 0.2332241 -0.9753908 0.2150342 0.2714835 -0.9814183 0.2782884 0.3195402 -0.9858141 0.3453439 0.3750394 -0.9890818 0.4143657 0.4354252 -0.9915455 0.4833811 0.4980979 -0.9934231 0.550464 0.5606031 -0.9948657 0.6139219 0.6208137 -0.9959809 0.6724399 0.6770662 -0.9968473 0.7251537 0.7282244 -0.9975229 0.7716504 0.7736681 -0.9980512 0.8119096 0.813224 -0.9984653 0.8462132 0.8470629 -0.9987904 0.8750451 0.875591 -0.9990461 0.8990011 0.89935 -0.9992474 0.9187164 0.9189384 -0.999406 0.9348146 0.9349553 -0.999531 0.947875 0.9479639 -0.9996296 0.9584157 0.9584718 -0.9997074 0.9668871 0.9669225 -0.9997689 0.9736725 0.9736947 -0.9998174 0.9790927 0.9791066 -0.9998557 0.9834129 0.9834216 -0.999886 0.9868505 0.986856 -0.9999099 0.989582 0.9895854 -0.9999288 0.9917501 0.9917522 -0.9999437 0.9934695 0.9934708 -0.0000238 0.0020256 0.2135639 -0.0000382 0.0015221 0.2130604 -0.0000611 0.0008899 0.2124282 -0.0000978 0.0000978 0.2116361 -0.0011463 0.0000978 0.2116361 -0.0024729 0.0000978 0.2116361 -0.0041512 0.0000978 0.2116361 -0.0062744 0.0000978 0.2116361 -0.0089606 0.0000978 0.2116361 -0.012359 0.0000978 0.2116361 -0.0166583 0.0000978 0.2116361 -0.0220976 0.0000978 0.2116361 -0.028979 0.0000978 0.2116361 -0.0376849 0.0000978 0.2116361 -0.0486989 0.0000978 0.2116361 -0.0626331 0.0000978 0.2116361 -0.0802616 0.0000978 0.2116361 -0.102564 0.0000978 0.2116361 -0.1307795 0.0000978 0.2116361 -0.1664757 0.0000978 0.2116361 -0.2116361 0.0000978 0.2116361 -0.2687698 0.0000978 0.2116361 -0.3410514 0.0000978 0.2116361 -0.432497 0.0000978 0.2116361 -0.5481876 0.0000978 0.2116361 -0.6945513 0.0000978 0.2116361 -0.8398756 0.0050826 0.20584 -0.9030276 0.0277752 0.1939946 -0.9353068 0.0622749 0.1932293 -0.9544774 0.1058162 0.2063783 -0.9668902 0.1570779 0.2328916 -0.9753825 0.2149725 0.2712217 -0.9814136 0.2782347 0.3193377 -0.9858113 0.3452987 0.3748857 -0.9890801 0.414329 0.4353106 -0.9915446 0.4833522 0.4980141 -0.9934225 0.5504419 0.5605429 -0.9948653 0.6139056 0.6207712 -0.9959807 0.672428 0.6770368 -0.9968472 0.7251454 0.7282043 -0.9975228 0.7716446 0.7736546 -0.9980511 0.8119057 0.813215 -0.9984653 0.8462106 0.847057 -0.9987904 0.8750434 0.8755872 -0.9990461 0.899 0.8993475 -0.9992474 0.9187157 0.9189368 -0.999406 0.9348141 0.9349542 -0.999531 0.9478746 0.9479633 -0.9996296 0.9584155 0.9584714 -0.9997074 0.966887 0.9669222 -0.9997689 0.9736724 0.9736945 -0.9998174 0.9790926 0.9791065 -0.9998557 0.9834129 0.9834216 -0.999886 0.9868505 0.9868559 -0.9999099 0.989582 0.9895854 -0.9999288 0.9917501 0.9917522 -0.9999437 0.9934695 0.9934708 -0.0000238 0.0030742 0.2135639 -0.0000382 0.0025707 0.2130604 -0.0000611 0.0019385 0.2124282 -0.0000978 0.0011463 0.2116361 -0.0001565 0.0001565 0.2106462 -0.001483 0.0001565 0.2106462 -0.0031613 0.0001565 0.2106462 -0.0052846 0.0001565 0.2106462 -0.0079707 0.0001565 0.2106462 -0.0113691 0.0001565 0.2106462 -0.0156685 0.0001565 0.2106462 -0.0211078 0.0001565 0.2106462 -0.0279891 0.0001565 0.2106462 -0.036695 0.0001565 0.2106462 -0.047709 0.0001565 0.2106462 -0.0616432 0.0001565 0.2106462 -0.0792718 0.0001565 0.2106462 -0.1015742 0.0001565 0.2106462 -0.1297896 0.0001565 0.2106462 -0.1654858 0.0001565 0.2106462 -0.2106462 0.0001565 0.2106462 -0.2677799 0.0001565 0.2106462 -0.3400615 0.0001565 0.2106462 -0.4315072 0.0001565 0.2106462 -0.5471978 0.0001565 0.2106462 -0.6935614 0.0001565 0.2106462 -0.8394338 0.0050676 0.204966 -0.9028657 0.0277111 0.1932439 -0.9352348 0.0621943 0.1925979 -0.9544418 0.1057322 0.2058603 -0.9668714 0.1569971 0.2324758 -0.9753721 0.2148987 0.2708943 -0.9814076 0.2781701 0.3190846 -0.9858079 0.3452442 0.3746936 -0.9890781 0.4142845 0.4351674 -0.9915433 0.4833171 0.4979093 -0.9934218 0.550415 0.5604676 -0.9948649 0.6138855 0.6207181 -0.9959804 0.6724135 0.677 -0.996847 0.7251351 0.7281792 -0.9975227 0.7716375 0.7736377 -0.9980511 0.8119009 0.8132037 -0.9984652 0.8462073 0.8470496 -0.9987904 0.8750412 0.8755823 -0.9990461 0.8989986 0.8993443 -0.9992474 0.9187148 0.9189348 -0.999406 0.9348135 0.934953 -0.999531 0.9478743 0.9479624 -0.9996296 0.9584153 0.9584709 -0.9997074 0.9668869 0.9669219 -0.9997689 0.9736723 0.9736943 -0.9998174 0.9790925 0.9791064 -0.9998557 0.9834128 0.9834215 -0.999886 0.9868504 0.9868559 -0.9999099 0.989582 0.9895854 -0.9999288 0.9917501 0.9917522 -0.9999437 0.9934695 0.9934708 -0.0000238 0.0044007 0.2135639 -0.0000382 0.0038972 0.2130604 -0.0000611 0.003265 0.2124282 -0.0000978 0.0024729 0.2116361 -0.0001565 0.001483 0.2106462 -0.0002504 0.0002504 0.2094136 -0.0019287 0.0002504 0.2094136 -0.004052 0.0002504 0.2094136 -0.0067381 0.0002504 0.2094136 -0.0101365 0.0002504 0.2094136 -0.0144359 0.0002504 0.2094136 -0.0198752 0.0002504 0.2094136 -0.0267565 0.0002504 0.2094136 -0.0354624 0.0002504 0.2094136 -0.0464764 0.0002504 0.2094136 -0.0604106 0.0002504 0.2094136 -0.0780392 0.0002504 0.2094136 -0.1003416 0.0002504 0.2094136 -0.128557 0.0002504 0.2094136 -0.1642532 0.0002504 0.2094136 -0.2094136 0.0002504 0.2094136 -0.2665473 0.0002504 0.2094136 -0.3388289 0.0002504 0.2094136 -0.4302746 0.0002504 0.2094136 -0.5459652 0.0002504 0.2094136 -0.6923288 0.0002504 0.2094136 -0.8388802 0.0050694 0.2038759 -0.9026634 0.0276479 0.1923076 -0.9351449 0.0621069 0.1918104 -0.9543974 0.1056375 0.2052145 -0.9668479 0.156904 0.2319575 -0.9753591 0.2148124 0.2704863 -0.9814002 0.2780936 0.3187692 -0.9858036 0.3451791 0.3744542 -0.9890755 0.4142311 0.434989 -0.9915418 0.4832747 0.4977788 -0.9934209 0.5503825 0.5603739 -0.9948643 0.6138613 0.620652 -0.9959801 0.6723959 0.6769541 -0.9968468 0.7251226 0.7281478 -0.9975226 0.7716288 0.7736166 -0.998051 0.8118949 0.8131897 -0.9984652 0.8462034 0.8470404 -0.9987904 0.8750386 0.8755763 -0.9990461 0.8989969 0.8993405 -0.9992474 0.9187137 0.9189323 -0.9994059 0.9348128 0.9349514 -0.999531 0.9478738 0.9479614 -0.9996296 0.958415 0.9584702 -0.9997074 0.9668867 0.9669215 -0.9997689 0.9736722 0.9736941 -0.9998174 0.9790925 0.9791062 -0.9998557 0.9834128 0.9834214 -0.999886 0.9868504 0.9868558 -0.9999099 0.9895819 0.9895853 -0.9999288 0.9917501 0.9917522 -0.9999437 0.9934695 0.9934708 -0.0000238 0.006079 0.2135639 -0.0000382 0.0055755 0.2130604 -0.0000611 0.0049433 0.2124282 -0.0000978 0.0041512 0.2116361 -0.0001565 0.0031613 0.2106462 -0.0002504 0.0019287 0.2094136 -0.0004008 0.0004008 0.2078857 -0.0025241 0.0004008 0.2078857 -0.0052103 0.0004008 0.2078857 -0.0086086 0.0004008 0.2078857 -0.012908 0.0004008 0.2078857 -0.0183473 0.0004008 0.2078857 -0.0252287 0.0004008 0.2078857 -0.0339345 0.0004008 0.2078857 -0.0449485 0.0004008 0.2078857 -0.0588827 0.0004008 0.2078857 -0.0765113 0.0004008 0.2078857 -0.0988137 0.0004008 0.2078857 -0.1270291 0.0004008 0.2078857 -0.1627254 0.0004008 0.2078857 -0.2078857 0.0004008 0.2078857 -0.2650195 0.0004008 0.2078857 -0.337301 0.0004008 0.2078857 -0.4287467 0.0004008 0.2078857 -0.5444373 0.0004008 0.2078857 -0.6908009 0.0004008 0.2078857 -0.8381886 0.0051048 0.2025219 -0.9024114 0.0275966 0.1911446 -0.9350332 0.0620199 0.1908325 -0.9543421 0.1055364 0.2044128 -0.9668187 0.1568008 0.2313143 -0.975343 0.2147144 0.26998 -0.9813911 0.2780055 0.318378 -0.9857982 0.3451032 0.3741573 -0.9890723 0.4141683 0.4347678 -0.9915399 0.4832246 0.497617 -0.9934197 0.5503438 0.5602576 -0.9948636 0.6138323 0.62057 -0.9959797 0.6723748 0.6768972 -0.9968465 0.7251076 0.728109 -0.9975224 0.7716184 0.7735904 -0.9980509 0.8118878 0.8131723 -0.9984651 0.8461986 0.847029 -0.9987903 0.8750355 0.8755689 -0.9990461 0.8989948 0.8993357 -0.9992473 0.9187123 0.9189292 -0.9994059 0.9348119 0.9349494 -0.999531 0.9478733 0.9479602 -0.9996296 0.9584146 0.9584694 -0.9997074 0.9668865 0.966921 -0.9997689 0.9736721 0.9736938 -0.9998174 0.9790924 0.979106 -0.9998557 0.9834127 0.9834213 -0.999886 0.9868504 0.9868557 -0.9999099 0.9895819 0.9895853 -0.9999288 0.99175 0.9917521 -0.9999437 0.9934695 0.9934708 -0.0000238 0.0082023 0.2135639 -0.0000382 0.0076988 0.2130604 -0.0000611 0.0070666 0.2124282 -0.0000978 0.0062744 0.2116361 -0.0001565 0.0052846 0.2106462 -0.0002504 0.004052 0.2094136 -0.0004008 0.0025241 0.2078857 -0.0006416 0.0006416 0.2060032 -0.0033277 0.0006416 0.2060032 -0.0067261 0.0006416 0.2060032 -0.0110255 0.0006416 0.2060032 -0.0164648 0.0006416 0.2060032 -0.0233461 0.0006416 0.2060032 -0.032052 0.0006416 0.2060032 -0.043066 0.0006416 0.2060032 -0.0570002 0.0006416 0.2060032 -0.0746288 0.0006416 0.2060032 -0.0969312 0.0006416 0.2060032 -0.1251466 0.0006416 0.2060032 -0.1608428 0.0006416 0.2060032 -0.2060032 0.0006416 0.2060032 -0.2631369 0.0006416 0.2060032 -0.3354185 0.0006416 0.2060032 -0.4268641 0.0006416 0.2060032 -0.5425548 0.0006416 0.2060032 -0.6889184 0.0006416 0.2060032 -0.8373283 0.0052028 0.2008493 -0.9020992 0.0275778 0.1897081 -0.9348949 0.0619473 0.189625 -0.9542739 0.1054384 0.2034232 -0.9667827 0.1566936 0.2305205 -0.9753231 0.2146085 0.2693554 -0.9813797 0.2779077 0.3178954 -0.9857916 0.3450175 0.3737911 -0.9890684 0.4140964 0.434495 -0.9915376 0.4831666 0.4974174 -0.9934183 0.5502987 0.5601144 -0.9948628 0.6137984 0.6204689 -0.9959791 0.67235 0.6768271 -0.9968462 0.7250899 0.7280611 -0.9975222 0.7716061 0.7735582 -0.9980508 0.8118794 0.8131509 -0.998465 0.8461929 0.8470149 -0.9987903 0.8750317 0.8755597 -0.999046 0.8989923 0.8993297 -0.9992473 0.9187107 0.9189254 -0.9994059 0.9348109 0.934947 -0.999531 0.9478726 0.9479586 -0.9996296 0.9584142 0.9584685 -0.9997074 0.9668862 0.9669203 -0.9997689 0.9736719 0.9736934 -0.9998174 0.9790923 0.9791057 -0.9998557 0.9834127 0.9834211 -0.999886 0.9868503 0.9868556 -0.9999099 0.9895819 0.9895852 -0.9999288 0.99175 0.9917521 -0.9999437 0.9934694 0.9934707 -0.0000238 0.0108885 0.2135639 -0.0000382 0.0103849 0.2130604 -0.0000611 0.0097527 0.2124282 -0.0000978 0.0089606 0.2116361 -0.0001565 0.0079707 0.2106462 -0.0002504 0.0067381 0.2094136 -0.0004008 0.0052103 0.2078857 -0.0006416 0.0033277 0.2060032 -0.0010268 0.0010268 0.2037023 -0.0044252 0.0010268 0.2037023 -0.0087246 0.0010268 0.2037023 -0.0141639 0.0010268 0.2037023 -0.0210452 0.0010268 0.2037023 -0.0297511 0.0010268 0.2037023 -0.0407651 0.0010268 0.2037023 -0.0546993 0.0010268 0.2037023 -0.0723279 0.0010268 0.2037023 -0.0946303 0.0010268 0.2037023 -0.1228457 0.0010268 0.2037023 -0.1585419 0.0010268 0.2037023 -0.2037023 0.0010268 0.2037023 -0.260836 0.0010268 0.2037023 -0.3331176 0.0010268 0.2037023 -0.4245633 0.0010268 0.2037023 -0.5402539 0.0010268 0.2037023 -0.6866175 0.0010268 0.2037023 -0.8362644 0.0054121 0.1987988 -0.9017148 0.0276281 0.1879469 -0.9347252 0.061916 0.1881451 -0.9541902 0.1053624 0.2022109 -0.9667385 0.1565954 0.2295486 -0.9752987 0.2145034 0.2685909 -0.9813659 0.2778058 0.3173048 -0.9857835 0.3449254 0.3733431 -0.9890637 0.4140176 0.4341613 -0.9915347 0.4831021 0.4971734 -0.9934166 0.550248 0.5599391 -0.9948617 0.6137599 0.6203453 -0.9959785 0.6723217 0.6767414 -0.9968458 0.7250697 0.7280026 -0.997522 0.7715919 0.7735188 -0.9980506 0.8118697 0.8131247 -0.9984649 0.8461864 0.8469977 -0.9987902 0.8750274 0.8755485 -0.999046 0.8989895 0.8993225 -0.9992473 0.9187089 0.9189207 -0.9994059 0.9348097 0.934944 -0.999531 0.9478718 0.9479567 -0.9996296 0.9584137 0.9584673 -0.9997074 0.9668859 0.9669196 -0.9997689 0.9736717 0.9736929 -0.9998174 0.9790921 0.9791054 -0.9998557 0.9834126 0.9834209 -0.999886 0.9868503 0.9868555 -0.9999099 0.9895819 0.9895851 -0.9999288 0.99175 0.9917521 -0.9999437 0.9934694 0.9934707 -0.0000238 0.0142868 0.2135639 -0.0000382 0.0137833 0.2130604 -0.0000611 0.0131511 0.2124282 -0.0000978 0.012359 0.2116361 -0.0001565 0.0113691 0.2106462 -0.0002504 0.0101365 0.2094136 -0.0004008 0.0086086 0.2078857 -0.0006416 0.0067261 0.2060032 -0.0010268 0.0044252 0.2037023 -0.0016435 0.0016435 0.2009206 -0.0059429 0.0016435 0.2009206 -0.0113822 0.0016435 0.2009206 -0.0182636 0.0016435 0.2009206 -0.0269694 0.0016435 0.2009206 -0.0379834 0.0016435 0.2009206 -0.0519176 0.0016435 0.2009206 -0.0695462 0.0016435 0.2009206 -0.0918486 0.0016435 0.2009206 -0.120064 0.0016435 0.2009206 -0.1557603 0.0016435 0.2009206 -0.2009206 0.0016435 0.2009206 -0.2580543 0.0016435 0.2009206 -0.3303359 0.0016435 0.2009206 -0.4217816 0.0016435 0.2009206 -0.5374722 0.0016435 0.2009206 -0.6838358 0.0016435 0.2009206 -0.8349593 0.0058134 0.1963105 -0.9012461 0.0278105 0.1858097 -0.9345187 0.0619734 0.1863501 -0.9540886 0.1053433 0.2007412 -0.966685 0.1565315 0.2283708 -0.9752692 0.2144168 0.2676648 -0.9813491 0.2777122 0.3165898 -0.9857738 0.3448353 0.3728008 -0.9890579 0.4139373 0.4337574 -0.9915312 0.4830346 0.4968781 -0.9934145 0.5501939 0.5597272 -0.9948604 0.6137183 0.6201959 -0.9959777 0.6722907 0.6766377 -0.9968453 0.7250473 0.7279319 -0.9975217 0.7715762 0.7734712 -0.9980504 0.8118589 0.8130931 -0.9984648 0.8461791 0.8469769 -0.9987902 0.8750225 0.875535 -0.9990459 0.8989863 0.8993137 -0.9992473 0.9187068 0.9189151 -0.9994059 0.9348083 0.9349404 -0.9995309 0.947871 0.9479544 -0.9996296 0.9584132 0.9584658 -0.9997074 0.9668855 0.9669187 -0.9997689 0.9736715 0.9736923 -0.9998174 0.979092 0.9791051 -0.9998557 0.9834125 0.9834207 -0.999886 0.9868502 0.9868554 -0.9999099 0.9895818 0.989585 -0.9999288 0.99175 0.991752 -0.9999437 0.9934694 0.9934707 -0.0000238 0.0185862 0.2135639 -0.0000382 0.0180827 0.2130604 -0.0000611 0.0174505 0.2124282 -0.0000978 0.0166583 0.2116361 -0.0001565 0.0156685 0.2106462 -0.0002504 0.0144359 0.2094136 -0.0004008 0.012908 0.2078857 -0.0006416 0.0110255 0.2060032 -0.0010268 0.0087246 0.2037023 -0.0016435 0.0059429 0.2009206 -0.0026305 0.0026305 0.1976083 -0.0080698 0.0026305 0.1976083 -0.0149512 0.0026305 0.1976083 -0.023657 0.0026305 0.1976083 -0.0346711 0.0026305 0.1976083 -0.0486053 0.0026305 0.1976083 -0.0662338 0.0026305 0.1976083 -0.0885362 0.0026305 0.1976083 -0.1167517 0.0026305 0.1976083 -0.1524479 0.0026305 0.1976083 -0.1976083 0.0026305 0.1976083 -0.254742 0.0026305 0.1976083 -0.3270236 0.0026305 0.1976083 -0.4184692 0.0026305 0.1976083 -0.5341598 0.0026305 0.1976083 -0.6805235 0.0026305 0.1976083 -0.8333779 0.0065402 0.1933343 -0.900682 0.0282324 0.1832532 -0.9342712 0.062202 0.1842041 -0.9539671 0.1054431 0.1989853 -0.9666211 0.1565473 0.2269644 -0.975234 0.2143816 0.2665596 -0.9813291 0.2776503 0.3157367 -0.9857621 0.3447636 0.3721541 -0.989051 0.4138668 0.4332759 -0.9915271 0.4829718 0.4965262 -0.993412 0.5501416 0.5594745 -0.9948589 0.6136769 0.6200177 -0.9959768 0.6722594 0.6765142 -0.9968448 0.7250244 0.7278476 -0.9975213 0.7715599 0.7734145 -0.9980502 0.8118476 0.8130554 -0.9984647 0.8461714 0.8469521 -0.9987901 0.8750173 0.8755188 -0.9990459 0.8989829 0.8993033 -0.9992472 0.9187045 0.9189084 -0.9994059 0.9348069 0.9349361 -0.9995309 0.94787 0.9479517 -0.9996296 0.9584126 0.9584641 -0.9997074 0.9668852 0.9669176 -0.9997689 0.9736712 0.9736916 -0.9998174 0.9790919 0.9791046 -0.9998557 0.9834124 0.9834204 -0.999886 0.9868502 0.9868552 -0.9999099 0.9895818 0.9895849 -0.9999288 0.99175 0.9917519 -0.9999437 0.9934694 0.9934706 -0.0000238 0.0240255 0.2135639 -0.0000382 0.023522 0.2130604 -0.0000611 0.0228898 0.2124282 -0.0000978 0.0220976 0.2116361 -0.0001565 0.0211078 0.2106462 -0.0002504 0.0198752 0.2094136 -0.0004008 0.0183473 0.2078857 -0.0006416 0.0164648 0.2060032 -0.0010268 0.0141639 0.2037023 -0.0016435 0.0113822 0.2009206 -0.0026305 0.0080698 0.1976083 -0.0042103 0.0042103 0.1937488 -0.0110917 0.0042103 0.1937488 -0.0197975 0.0042103 0.1937488 -0.0308116 0.0042103 0.1937488 -0.0447458 0.0042103 0.1937488 -0.0623743 0.0042103 0.1937488 -0.0846767 0.0042103 0.1937488 -0.1128922 0.0042103 0.1937488 -0.1485884 0.0042103 0.1937488 -0.1937488 0.0042103 0.1937488 -0.2508825 0.0042103 0.1937488 -0.3231641 0.0042103 0.1937488 -0.4146097 0.0042103 0.1937488 -0.5303003 0.0042103 0.1937488 -0.676664 0.0042103 0.1937488 -0.8314967 0.0078103 0.1898486 -0.9000167 0.0290732 0.1802587 -0.9339805 0.062742 0.1816918 -0.9538247 0.1057683 0.1969312 -0.9665463 0.1567226 0.2253205 -0.9751928 0.2144566 0.2652685 -0.9813057 0.2776626 0.3147406 -0.9857485 0.3447407 0.3713992 -0.989043 0.4138277 0.4327141 -0.9915223 0.4829286 0.4961156 -0.9934091 0.5501012 0.5591799 -0.9948571 0.6136427 0.61981 -0.9959757 0.6722322 0.6763703 -0.9968441 0.7250039 0.7277493 -0.9975209 0.7715449 0.7733484 -0.99805 0.811837 0.8130114 -0.9984645 0.8461641 0.8469232 -0.99879 0.8750124 0.8755 -0.9990458 0.8989796 0.8992911 -0.9992472 0.9187024 0.9189006 -0.9994059 0.9348055 0.9349311 -0.9995309 0.9478691 0.9479486 -0.9996296 0.958412 0.9584621 -0.9997074 0.9668848 0.9669163 -0.9997689 0.973671 0.9736908 -0.9998174 0.9790917 0.9791041 -0.9998557 0.9834123 0.9834201 -0.999886 0.9868501 0.986855 -0.9999099 0.9895818 0.9895848 -0.9999288 0.9917499 0.9917519 -0.9999437 0.9934694 0.9934706 -0.0000238 0.0309069 0.2135639 -0.0000382 0.0304033 0.2130604 -0.0000611 0.0297711 0.2124282 -0.0000978 0.028979 0.2116361 -0.0001565 0.0279891 0.2106462 -0.0002504 0.0267565 0.2094136 -0.0004008 0.0252287 0.2078857 -0.0006416 0.0233461 0.2060032 -0.0010268 0.0210452 0.2037023 -0.0016435 0.0182636 0.2009206 -0.0026305 0.0149512 0.1976083 -0.0042103 0.0110917 0.1937488 -0.0067388 0.0067388 0.1893959 -0.0154447 0.0067388 0.1893959 -0.0264587 0.0067388 0.1893959 -0.0403929 0.0067388 0.1893959 -0.0580214 0.0067388 0.1893959 -0.0803239 0.0067388 0.1893959 -0.1085393 0.0067388 0.1893959 -0.1442355 0.0067388 0.1893959 -0.1893959 0.0067388 0.1893959 -0.2465296 0.0067388 0.1893959 -0.3188112 0.0067388 0.1893959 -0.4102568 0.0067388 0.1893959 -0.5259474 0.0067388 0.1893959 -0.6723111 0.0067388 0.1893959 -0.8293233 0.0099781 0.1858943 -0.8992555 0.0306306 0.1768609 -0.9336494 0.0638283 0.1788432 -0.953663 0.1064997 0.1946042 -0.9664615 0.1571937 0.2234595 -0.9751462 0.2147432 0.2638078 -0.9812792 0.2778236 0.3136144 -0.9857332 0.3448204 0.3705461 -0.9890339 0.4138582 0.4320794 -0.9915169 0.4829319 0.4956519 -0.9934058 0.5500915 0.5588473 -0.9948551 0.6136284 0.6195755 -0.9959745 0.672218 0.6762077 -0.9968433 0.7249916 0.7276384 -0.9975204 0.7715352 0.7732737 -0.9980497 0.8118298 0.8129618 -0.9984643 0.8461589 0.8468906 -0.9987899 0.8750088 0.8754788 -0.9990458 0.8989771 0.8992774 -0.9992472 0.9187008 0.9188918 -0.9994058 0.9348044 0.9349255 -0.9995309 0.9478684 0.947945 -0.9996296 0.9584115 0.9584598 -0.9997074 0.9668845 0.9669149 -0.9997689 0.9736708 0.9736899 -0.9998174 0.9790916 0.9791036 -0.9998557 0.9834122 0.9834197 -0.999886 0.9868501 0.9868548 -0.9999099 0.9895817 0.9895847 -0.9999288 0.9917499 0.9917518 -0.9999437 0.9934694 0.9934705 -0.0000238 0.0396127 0.2135639 -0.0000382 0.0391092 0.2130604 -0.0000611 0.038477 0.2124282 -0.0000978 0.0376849 0.2116361 -0.0001565 0.036695 0.2106462 -0.0002504 0.0354624 0.2094136 -0.0004008 0.0339345 0.2078857 -0.0006416 0.032052 0.2060032 -0.0010268 0.0297511 0.2037023 -0.0016435 0.0269694 0.2009206 -0.0026305 0.023657 0.1976083 -0.0042103 0.0197975 0.1937488 -0.0067388 0.0154447 0.1893959 -0.0107859 0.0107859 0.1847371 -0.0217999 0.0107859 0.1847371 -0.0357341 0.0107859 0.1847371 -0.0533626 0.0107859 0.1847371 -0.075665 0.0107859 0.1847371 -0.1038805 0.0107859 0.1847371 -0.1395767 0.0107859 0.1847371 -0.1847371 0.0107859 0.1847371 -0.2418708 0.0107859 0.1847371 -0.3141524 0.0107859 0.1847371 -0.405598 0.0107859 0.1847371 -0.5212886 0.0107859 0.1847371 -0.6676523 0.0107859 0.1847371 -0.8269342 0.0136166 0.1816352 -0.8984278 0.0333932 0.1732 -0.9332914 0.0658501 0.1757762 -0.9534887 0.1079385 0.1921012 -0.9663702 0.15819 0.2214596 -0.9750962 0.2154135 0.2622393 -0.9812508 0.2782606 0.3124058 -0.9857167 0.3450957 0.369631 -0.9890241 0.4140252 0.4313989 -0.991511 0.4830292 0.4951549 -0.9934023 0.5501456 0.5584908 -0.994853 0.6136569 0.6193243 -0.9959732 0.672232 0.6760337 -0.9968425 0.7249978 0.7275196 -0.9975199 0.7715376 0.7731938 -0.9980494 0.8118303 0.8129087 -0.9984642 0.8461587 0.8468557 -0.9987897 0.8750084 0.875456 -0.9990457 0.8989767 0.8992627 -0.9992471 0.9187004 0.9188823 -0.9994058 0.9348042 0.9349195 -0.9995309 0.9478683 0.9479411 -0.9996295 0.9584114 0.9584574 -0.9997074 0.9668844 0.9669133 -0.9997689 0.9736708 0.973689 -0.9998174 0.9790916 0.979103 -0.9998557 0.9834122 0.9834194 -0.999886 0.98685 0.9868545 -0.9999099 0.9895817 0.9895845 -0.9999288 0.9917499 0.9917517 -0.9999437 0.9934694 0.9934705 -0.0000238 0.0506267 0.2135639 -0.0000382 0.0501232 0.2130604 -0.0000611 0.049491 0.2124282 -0.0000978 0.0486989 0.2116361 -0.0001565 0.047709 0.2106462 -0.0002504 0.0464764 0.2094136 -0.0004008 0.0449485 0.2078857 -0.0006416 0.043066 0.2060032 -0.0010268 0.0407651 0.2037023 -0.0016435 0.0379834 0.2009206 -0.0026305 0.0346711 0.1976083 -0.0042103 0.0308116 0.1937488 -0.0067388 0.0264587 0.1893959 -0.0107859 0.0217999 0.1847371 -0.0172633 0.0172633 0.1802005 -0.0311975 0.0172633 0.1802005 -0.0488261 0.0172633 0.1802005 -0.0711285 0.0172633 0.1802005 -0.099344 0.0172633 0.1802005 -0.1350402 0.0172633 0.1802005 -0.1802005 0.0172633 0.1802005 -0.2373343 0.0172633 0.1802005 -0.3096159 0.0172633 0.1802005 -0.4010615 0.0172633 0.1802005 -0.5167521 0.0172633 0.1802005 -0.6631157 0.0172633 0.1802005 -0.8245426 0.0196467 0.1774615 -0.8976087 0.0381561 0.1696109 -0.9329391 0.0694453 0.1727717 -0.9533177 0.1105818 0.1896515 -0.9662809 0.160092 0.219504 -0.9750472 0.2167545 0.2607068 -0.9812231 0.2791873 0.3112256 -0.9857006 0.3457234 0.368738 -0.9890146 0.4144423 0.430735 -0.9915054 0.4833013 0.4946702 -0.9933988 0.5503203 0.5581433 -0.9948509 0.6137675 0.6190795 -0.9959719 0.6723012 0.675864 -0.9968418 0.7250408 0.7274039 -0.9975194 0.7715641 0.773116 -0.9980491 0.8118466 0.812857 -0.998464 0.8461687 0.8468217 -0.9987896 0.8750145 0.8754339 -0.9990456 0.8989805 0.8992484 -0.9992471 0.9187027 0.9188732 -0.9994058 0.9348056 0.9349136 -0.9995309 0.9478691 0.9479374 -0.9996295 0.958412 0.958455 -0.9997074 0.9668847 0.9669118 -0.9997688 0.973671 0.973688 -0.9998174 0.9790917 0.9791024 -0.9998557 0.9834123 0.983419 -0.999886 0.9868501 0.9868543 -0.9999099 0.9895817 0.9895844 -0.9999288 0.9917499 0.9917516 -0.9999437 0.9934694 0.9934704 -0.0000238 0.0645609 0.2135639 -0.0000382 0.0640574 0.2130604 -0.0000611 0.0634252 0.2124282 -0.0000978 0.0626331 0.2116361 -0.0001565 0.0616432 0.2106462 -0.0002504 0.0604106 0.2094136 -0.0004008 0.0588827 0.2078857 -0.0006416 0.0570002 0.2060032 -0.0010268 0.0546993 0.2037023 -0.0016435 0.0519176 0.2009206 -0.0026305 0.0486053 0.1976083 -0.0042103 0.0447458 0.1937488 -0.0067388 0.0403929 0.1893959 -0.0107859 0.0357341 0.1847371 -0.0172633 0.0311975 0.1802005 -0.0276309 0.0276309 0.1766339 -0.0452595 0.0276309 0.1766339 -0.0675619 0.0276309 0.1766339 -0.0957773 0.0276309 0.1766339 -0.1314736 0.0276309 0.1766339 -0.1766339 0.0276309 0.1766339 -0.2337676 0.0276309 0.1766339 -0.3060492 0.0276309 0.1766339 -0.3974949 0.0276309 0.1766339 -0.5131855 0.0276309 0.1766339 -0.6595491 0.0276309 0.1766339 -0.8226154 0.0295373 0.174162 -0.8969554 0.0461985 0.1667723 -0.9326595 0.0756464 0.170397 -0.9531823 0.1152388 0.1877169 -0.9662104 0.1635226 0.2179609 -0.9750086 0.2192389 0.2594983 -0.9812013 0.2809573 0.3102955 -0.9856879 0.3469645 0.3680344 -0.9890072 0.4152991 0.4302122 -0.9915009 0.4838841 0.4942887 -0.9933961 0.5507113 0.5578697 -0.9948493 0.6140266 0.6188868 -0.9959709 0.6724711 0.6757305 -0.9968411 0.7251511 0.7273129 -0.9975191 0.7716352 0.7730548 -0.9980488 0.8118921 0.8128163 -0.9984638 0.8461977 0.846795 -0.9987895 0.8750329 0.8754165 -0.9990456 0.8989921 0.8992372 -0.999247 0.9187101 0.9188659 -0.9994057 0.9348102 0.934909 -0.9995309 0.947872 0.9479345 -0.9996295 0.9584138 0.9584532 -0.9997074 0.9668859 0.9669107 -0.9997688 0.9736717 0.9736873 -0.9998174 0.9790921 0.9791019 -0.9998557 0.9834126 0.9834187 -0.999886 0.9868503 0.9868541 -0.9999099 0.9895819 0.9895843 -0.9999288 0.99175 0.9917515 -0.9999437 0.9934694 0.9934704 -0.0000238 0.0821895 0.2135639 -0.0000382 0.081686 0.2130604 -0.0000611 0.0810538 0.2124282 -0.0000978 0.0802616 0.2116361 -0.0001565 0.0792718 0.2106462 -0.0002504 0.0780392 0.2094136 -0.0004008 0.0765113 0.2078857 -0.0006416 0.0746288 0.2060032 -0.0010268 0.0723279 0.2037023 -0.0016435 0.0695462 0.2009206 -0.0026305 0.0662338 0.1976083 -0.0042103 0.0623743 0.1937488 -0.0067388 0.0580214 0.1893959 -0.0107859 0.0533626 0.1847371 -0.0172633 0.0488261 0.1802005 -0.0276309 0.0452595 0.1766339 -0.0441188 0.0441188 0.1754932 -0.0664212 0.0441188 0.1754932 -0.0946366 0.0441188 0.1754932 -0.1303328 0.0441188 0.1754932 -0.1754932 0.0441188 0.1754932 -0.2326269 0.0441188 0.1754932 -0.3049085 0.0441188 0.1754932 -0.3963542 0.0441188 0.1754932 -0.5120448 0.0441188 0.1754932 -0.6584084 0.0441188 0.1754932 -0.8219901 0.0455041 0.1731034 -0.8967447 0.0594506 0.1658613 -0.9325696 0.0860209 0.1696351 -0.9531389 0.1231452 0.1870965 -0.9661878 0.1694384 0.2174663 -0.9749962 0.2235962 0.2591111 -0.9811943 0.2841192 0.3099976 -0.9856839 0.3492254 0.3678092 -0.9890048 0.4168922 0.4300448 -0.9914995 0.4849907 0.4941665 -0.9933953 0.5514695 0.5577822 -0.9948487 0.6145393 0.6188252 -0.9959706 0.6728136 0.6756878 -0.9968409 0.7253775 0.7272837 -0.9975189 0.7717834 0.7730352 -0.9980488 0.8119884 0.8128033 -0.9984638 0.8462598 0.8467864 -0.9987895 0.8750727 0.8754109 -0.9990455 0.8990175 0.8992336 -0.999247 0.9187262 0.9188636 -0.9994057 0.9348204 0.9349075 -0.9995308 0.9478785 0.9479335 -0.9996295 0.9584178 0.9584526 -0.9997074 0.9668884 0.9669103 -0.9997688 0.9736733 0.973687 -0.9998174 0.9790931 0.9791018 -0.9998557 0.9834132 0.9834186 -0.999886 0.9868507 0.9868541 -0.9999099 0.9895821 0.9895842 -0.9999288 0.9917502 0.9917515 -0.9999437 0.9934695 0.9934704 -0.0000238 0.1044919 0.2135639 -0.0000382 0.1039884 0.2130604 -0.0000611 0.1033562 0.2124282 -0.0000978 0.102564 0.2116361 -0.0001565 0.1015742 0.2106462 -0.0002504 0.1003416 0.2094136 -0.0004008 0.0988137 0.2078857 -0.0006416 0.0969312 0.2060032 -0.0010268 0.0946303 0.2037023 -0.0016435 0.0918486 0.2009206 -0.0026305 0.0885362 0.1976083 -0.0042103 0.0846767 0.1937488 -0.0067388 0.0803239 0.1893959 -0.0107859 0.075665 0.1847371 -0.0172633 0.0711285 0.1802005 -0.0276309 0.0675619 0.1766339 -0.0441188 0.0664212 0.1754932 -0.0664212 0.0664212 0.1754932 -0.0946366 0.0664212 0.1754932 -0.1303328 0.0664212 0.1754932 -0.1754932 0.0664212 0.1754932 -0.2326269 0.0664212 0.1754932 -0.3049085 0.0664212 0.1754932 -0.3963542 0.0664212 0.1754932 -0.5120448 0.0664212 0.1754932 -0.6584084 0.0664212 0.1754932 -0.8219901 0.0671656 0.1731034 -0.8967447 0.0775151 0.1658613 -0.9325696 0.1002154 0.1696351 -0.9531389 0.1340017 0.1870965 -0.9661878 0.1775917 0.2174663 -0.9749962 0.2296253 0.2591111 -0.9811943 0.2885124 0.3099976 -0.9856839 0.3523802 0.3678092 -0.9890048 0.419125 0.4300448 -0.9914995 0.4865484 0.4941665 -0.9933953 0.5525411 0.5577822 -0.9948487 0.6152669 0.6188252 -0.9959706 0.6733015 0.6756878 -0.9968409 0.7257011 0.7272837 -0.9975189 0.7719959 0.7730352 -0.9980488 0.8121268 0.8128033 -0.9984638 0.8463492 0.8467864 -0.9987895 0.8751301 0.8754109 -0.9990455 0.8990542 0.8992336 -0.999247 0.9187495 0.9188636 -0.9994057 0.9348352 0.9349075 -0.9995308 0.9478878 0.9479335 -0.9996295 0.9584237 0.9584526 -0.9997074 0.9668922 0.9669103 -0.9997688 0.9736756 0.973687 -0.9998174 0.9790946 0.9791018 -0.9998557 0.9834141 0.9834186 -0.999886 0.9868512 0.9868541 -0.9999099 0.9895825 0.9895842 -0.9999288 0.9917504 0.9917515 -0.9999437 0.9934697 0.9934704 -0.0000238 0.1327073 0.2135639 -0.0000382 0.1322038 0.2130604 -0.0000611 0.1315716 0.2124282 -0.0000978 0.1307795 0.2116361 -0.0001565 0.1297896 0.2106462 -0.0002504 0.128557 0.2094136 -0.0004008 0.1270291 0.2078857 -0.0006416 0.1251466 0.2060032 -0.0010268 0.1228457 0.2037023 -0.0016435 0.120064 0.2009206 -0.0026305 0.1167517 0.1976083 -0.0042103 0.1128922 0.1937488 -0.0067388 0.1085393 0.1893959 -0.0107859 0.1038805 0.1847371 -0.0172633 0.099344 0.1802005 -0.0276309 0.0957773 0.1766339 -0.0441188 0.0946366 0.1754932 -0.0664212 0.0946366 0.1754932 -0.0946366 0.0946366 0.1754932 -0.1303328 0.0946366 0.1754932 -0.1754932 0.0946366 0.1754932 -0.2326269 0.0946366 0.1754932 -0.3049085 0.0946366 0.1754932 -0.3963542 0.0946366 0.1754932 -0.5120448 0.0946366 0.1754932 -0.6584084 0.0946366 0.1754932 -0.8219901 0.0945703 0.1731034 -0.8967447 0.1003691 0.1658613 -0.9325696 0.1181733 0.1696351 -0.9531389 0.1477366 0.1870965 -0.9661878 0.1879067 0.2174663 -0.9749962 0.2372529 0.2591111 -0.9811943 0.2940703 0.3099976 -0.9856839 0.3563715 0.3678092 -0.9890048 0.4219498 0.4300448 -0.9914995 0.4885191 0.4941665 -0.9933953 0.5538969 0.5577822 -0.9948487 0.6161874 0.6188252 -0.9959706 0.6739188 0.6756878 -0.9968409 0.7261105 0.7272837 -0.9975189 0.7722648 0.7730352 -0.9980488 0.8123018 0.8128033 -0.9984638 0.8464623 0.8467864 -0.9987895 0.8752028 0.8754109 -0.9990455 0.8991006 0.8992336 -0.999247 0.9187791 0.9188636 -0.9994057 0.9348539 0.9349075 -0.9995308 0.9478997 0.9479335 -0.9996295 0.9584312 0.9584526 -0.9997074 0.9668969 0.9669103 -0.9997688 0.9736786 0.973687 -0.9998174 0.9790965 0.9791018 -0.9998557 0.9834153 0.9834186 -0.999886 0.986852 0.9868541 -0.9999099 0.9895829 0.9895842 -0.9999288 0.9917507 0.9917515 -0.9999437 0.9934698 0.9934704 -0.0000238 0.1684036 0.2135639 -0.0000382 0.1679 0.2130604 -0.0000611 0.1672678 0.2124282 -0.0000978 0.1664757 0.2116361 -0.0001565 0.1654858 0.2106462 -0.0002504 0.1642532 0.2094136 -0.0004008 0.1627254 0.2078857 -0.0006416 0.1608428 0.2060032 -0.0010268 0.1585419 0.2037023 -0.0016435 0.1557603 0.2009206 -0.0026305 0.1524479 0.1976083 -0.0042103 0.1485884 0.1937488 -0.0067388 0.1442355 0.1893959 -0.0107859 0.1395767 0.1847371 -0.0172633 0.1350402 0.1802005 -0.0276309 0.1314736 0.1766339 -0.0441188 0.1303328 0.1754932 -0.0664212 0.1303328 0.1754932 -0.0946366 0.1303328 0.1754932 -0.1303328 0.1303328 0.1754932 -0.1754932 0.1303328 0.1754932 -0.2326269 0.1303328 0.1754932 -0.3049085 0.1303328 0.1754932 -0.3963542 0.1303328 0.1754932 -0.5120448 0.1303328 0.1754932 -0.6584084 0.1303328 0.1754932 -0.8219901 0.1292408 0.1731034 -0.8967447 0.1292823 0.1658613 -0.9325696 0.1408925 0.1696351 -0.9531389 0.1651131 0.1870965 -0.9661878 0.2009566 0.2174663 -0.9749962 0.2469027 0.2591111 -0.9811943 0.3011018 0.3099976 -0.9856839 0.3614209 0.3678092 -0.9890048 0.4255236 0.4300448 -0.9914995 0.4910123 0.4941665 -0.9933953 0.5556122 0.5577822 -0.9948487 0.6173519 0.6188252 -0.9959706 0.6746998 0.6756878 -0.9968409 0.7266285 0.7272837 -0.9975189 0.7726049 0.7730352 -0.9980488 0.8125232 0.8128033 -0.9984638 0.8466054 0.8467864 -0.9987895 0.8752947 0.8754109 -0.9990455 0.8991593 0.8992336 -0.999247 0.9188164 0.9188636 -0.9994057 0.9348776 0.9349075 -0.9995308 0.9479146 0.9479335 -0.9996295 0.9584406 0.9584526 -0.9997074 0.9669028 0.9669103 -0.9997688 0.9736823 0.973687 -0.9998174 0.9790988 0.9791018 -0.9998557 0.9834167 0.9834186 -0.999886 0.9868529 0.9868541 -0.9999099 0.9895835 0.9895842 -0.9999288 0.991751 0.9917515 -0.9999437 0.9934701 0.9934704 -0.0000238 0.2135639 0.2135639 -0.0000382 0.2130604 0.2130604 -0.0000611 0.2124282 0.2124282 -0.0000978 0.2116361 0.2116361 -0.0001565 0.2106462 0.2106462 -0.0002504 0.2094136 0.2094136 -0.0004008 0.2078857 0.2078857 -0.0006416 0.2060032 0.2060032 -0.0010268 0.2037023 0.2037023 -0.0016435 0.2009206 0.2009206 -0.0026305 0.1976083 0.1976083 -0.0042103 0.1937488 0.1937488 -0.0067388 0.1893959 0.1893959 -0.0107859 0.1847371 0.1847371 -0.0172633 0.1802005 0.1802005 -0.0276309 0.1766339 0.1766339 -0.0441188 0.1754932 0.1754932 -0.0664212 0.1754932 0.1754932 -0.0946366 0.1754932 0.1754932 -0.1303328 0.1754932 0.1754932 -0.1754932 0.1754932 0.1754932 -0.2326269 0.1754932 0.1754932 -0.3049085 0.1754932 0.1754932 -0.3963542 0.1754932 0.1754932 -0.5120448 0.1754932 0.1754932 -0.6584084 0.1754932 0.1754932 -0.8219901 0.1731034 0.1731034 -0.8967447 0.1658613 0.1658613 -0.9325696 0.1696351 0.1696351 -0.9531389 0.1870965 0.1870965 -0.9661878 0.2174663 0.2174663 -0.9749962 0.2591111 0.2591111 -0.9811943 0.3099976 0.3099976 -0.9856839 0.3678092 0.3678092 -0.9890048 0.4300448 0.4300448 -0.9914995 0.4941665 0.4941665 -0.9933953 0.5577822 0.5577822 -0.9948487 0.6188252 0.6188252 -0.9959706 0.6756878 0.6756878 -0.9968409 0.7272837 0.7272837 -0.9975189 0.7730352 0.7730352 -0.9980488 0.8128033 0.8128033 -0.9984638 0.8467864 0.8467864 -0.9987895 0.8754109 0.8754109 -0.9990455 0.8992336 0.8992336 -0.999247 0.9188636 0.9188636 -0.9994057 0.9349075 0.9349075 -0.9995308 0.9479335 0.9479335 -0.9996295 0.9584526 0.9584526 -0.9997074 0.9669103 0.9669103 -0.9997688 0.973687 0.973687 -0.9998174 0.9791018 0.9791018 -0.9998557 0.9834186 0.9834186 -0.999886 0.9868541 0.9868541 -0.9999099 0.9895842 0.9895842 -0.9999288 0.9917515 0.9917515 -0.9999437 0.9934704 0.9934704 -0.0000238 0.2706977 0.2135639 -0.0000382 0.2701941 0.2130604 -0.0000611 0.2695619 0.2124282 -0.0000978 0.2687698 0.2116361 -0.0001565 0.2677799 0.2106462 -0.0002504 0.2665473 0.2094136 -0.0004008 0.2650195 0.2078857 -0.0006416 0.2631369 0.2060032 -0.0010268 0.260836 0.2037023 -0.0016435 0.2580543 0.2009206 -0.0026305 0.254742 0.1976083 -0.0042103 0.2508825 0.1937488 -0.0067388 0.2465296 0.1893959 -0.0107859 0.2418708 0.1847371 -0.0172633 0.2373343 0.1802005 -0.0276309 0.2337676 0.1766339 -0.0441188 0.2326269 0.1754932 -0.0664212 0.2326269 0.1754932 -0.0946366 0.2326269 0.1754932 -0.1303328 0.2326269 0.1754932 -0.1754932 0.2326269 0.1754932 -0.2326269 0.2326269 0.1754932 -0.3049085 0.2326269 0.1754932 -0.3963542 0.2326269 0.1754932 -0.5120448 0.2326269 0.1754932 -0.6584084 0.2326269 0.1754932 -0.8219901 0.2285954 0.1731034 -0.8967447 0.2121385 0.1658613 -0.9325696 0.2059983 0.1696351 -0.9531389 0.2149085 0.1870965 -0.9661878 0.2383533 0.2174663 -0.9749962 0.2745562 0.2591111 -0.9811943 0.3212519 0.3099976 -0.9856839 0.3758911 0.3678092 -0.9890048 0.4357648 0.4300448 -0.9914995 0.498157 0.4941665 -0.9933953 0.5605276 0.5577822 -0.9948487 0.6206891 0.6188252 -0.9959706 0.6769378 0.6756878 -0.9968409 0.7281127 0.7272837 -0.9975189 0.7735795 0.7730352 -0.9980488 0.8131577 0.8128033 -0.9984638 0.8470154 0.8467864 -0.9987895 0.875558 0.8754109 -0.9990455 0.8993275 0.8992336 -0.999247 0.9189234 0.9188636 -0.9994057 0.9349454 0.9349075 -0.9995308 0.9479575 0.9479335 -0.9996295 0.9584677 0.9584526 -0.9997074 0.9669198 0.9669103 -0.9997688 0.973693 0.973687 -0.9998174 0.9791055 0.9791018 -0.9998557 0.9834209 0.9834186 -0.999886 0.9868555 0.9868541 -0.9999099 0.9895851 0.9895842 -0.9999288 0.9917521 0.9917515 -0.9999437 0.9934707 0.9934704 -0.0000238 0.3429792 0.2135639 -0.0000382 0.3424757 0.2130604 -0.0000611 0.3418435 0.2124282 -0.0000978 0.3410514 0.2116361 -0.0001565 0.3400615 0.2106462 -0.0002504 0.3388289 0.2094136 -0.0004008 0.337301 0.2078857 -0.0006416 0.3354185 0.2060032 -0.0010268 0.3331176 0.2037023 -0.0016435 0.3303359 0.2009206 -0.0026305 0.3270236 0.1976083 -0.0042103 0.3231641 0.1937488 -0.0067388 0.3188112 0.1893959 -0.0107859 0.3141524 0.1847371 -0.0172633 0.3096159 0.1802005 -0.0276309 0.3060492 0.1766339 -0.0441188 0.3049085 0.1754932 -0.0664212 0.3049085 0.1754932 -0.0946366 0.3049085 0.1754932 -0.1303328 0.3049085 0.1754932 -0.1754932 0.3049085 0.1754932 -0.2326269 0.3049085 0.1754932 -0.3049085 0.3049085 0.1754932 -0.3963542 0.3049085 0.1754932 -0.5120448 0.3049085 0.1754932 -0.6584084 0.3049085 0.1754932 -0.8219901 0.2988 0.1731034 -0.8967447 0.2706852 0.1658613 -0.9325696 0.2520025 0.1696351 -0.9531389 0.2500942 0.1870965 -0.9661878 0.2647781 0.2174663 -0.9749962 0.2940963 0.2591111 -0.9811943 0.3354901 0.3099976 -0.9856839 0.3861159 0.3678092 -0.9890048 0.4430013 0.4300448 -0.9914995 0.5032055 0.4941665 -0.9933953 0.5640008 0.5577822 -0.9948487 0.6230471 0.6188252 -0.9959706 0.6785192 0.6756878 -0.9968409 0.7291615 0.7272837 -0.9975189 0.7742682 0.7730352 -0.9980488 0.8136061 0.8128033 -0.9984638 0.8473052 0.8467864 -0.9987895 0.8757441 0.8754109 -0.9990455 0.8994464 0.8992336 -0.999247 0.918999 0.9188636 -0.9994057 0.9349933 0.9349075 -0.9995308 0.9479878 0.9479335 -0.9996295 0.9584868 0.9584526 -0.9997074 0.9669318 0.9669103 -0.9997688 0.9737006 0.973687 -0.9998174 0.9791103 0.9791018 -0.9998557 0.9834239 0.9834186 -0.999886 0.9868574 0.9868541 -0.9999099 0.9895863 0.9895842 -0.9999288 0.9917528 0.9917515 -0.9999437 0.9934712 0.9934704 -0.0000238 0.4344249 0.2135639 -0.0000382 0.4339214 0.2130604 -0.0000611 0.4332891 0.2124282 -0.0000978 0.432497 0.2116361 -0.0001565 0.4315072 0.2106462 -0.0002504 0.4302746 0.2094136 -0.0004008 0.4287467 0.2078857 -0.0006416 0.4268641 0.2060032 -0.0010268 0.4245633 0.2037023 -0.0016435 0.4217816 0.2009206 -0.0026305 0.4184692 0.1976083 -0.0042103 0.4146097 0.1937488 -0.0067388 0.4102568 0.1893959 -0.0107859 0.405598 0.1847371 -0.0172633 0.4010615 0.1802005 -0.0276309 0.3974949 0.1766339 -0.0441188 0.3963542 0.1754932 -0.0664212 0.3963542 0.1754932 -0.0946366 0.3963542 0.1754932 -0.1303328 0.3963542 0.1754932 -0.1754932 0.3963542 0.1754932 -0.2326269 0.3963542 0.1754932 -0.3049085 0.3963542 0.1754932 -0.3963542 0.3963542 0.1754932 -0.5120448 0.3963542 0.1754932 -0.6584084 0.3963542 0.1754932 -0.8219901 0.3876179 0.1731034 -0.8967447 0.3447543 0.1658613 -0.9325696 0.3102037 0.1696351 -0.9531389 0.2946088 0.1870965 -0.9661878 0.2982089 0.2174663 -0.9749962 0.3188171 0.2591111 -0.9811943 0.3535032 0.3099976 -0.9856839 0.3990515 0.3678092 -0.9890048 0.4521565 0.4300448 -0.9914995 0.5095925 0.4941665 -0.9933953 0.5683949 0.5577822 -0.9948487 0.6260304 0.6188252 -0.9959706 0.6805199 0.6756878 -0.9968409 0.7304884 0.7272837 -0.9975189 0.7751395 0.7730352 -0.9980488 0.8141733 0.8128033 -0.9984638 0.8476717 0.8467864 -0.9987895 0.8759795 0.8754109 -0.9990455 0.8995968 0.8992336 -0.999247 0.9190947 0.9188636 -0.9994057 0.935054 0.9349075 -0.9995308 0.9480261 0.9479335 -0.9996295 0.9585109 0.9584526 -0.9997074 0.966947 0.9669103 -0.9997688 0.9737101 0.973687 -0.9998174 0.9791163 0.9791018 -0.9998557 0.9834277 0.9834186 -0.999886 0.9868597 0.9868541 -0.9999099 0.9895878 0.9895842 -0.9999288 0.9917537 0.9917515 -0.9999437 0.9934718 0.9934704 -0.0000238 0.5501155 0.2135639 -0.0000382 0.549612 0.2130604 -0.0000611 0.5489798 0.2124282 -0.0000978 0.5481876 0.2116361 -0.0001565 0.5471978 0.2106462 -0.0002504 0.5459652 0.2094136 -0.0004008 0.5444373 0.2078857 -0.0006416 0.5425548 0.2060032 -0.0010268 0.5402539 0.2037023 -0.0016435 0.5374722 0.2009206 -0.0026305 0.5341598 0.1976083 -0.0042103 0.5303003 0.1937488 -0.0067388 0.5259474 0.1893959 -0.0107859 0.5212886 0.1847371 -0.0172633 0.5167521 0.1802005 -0.0276309 0.5131855 0.1766339 -0.0441188 0.5120448 0.1754932 -0.0664212 0.5120448 0.1754932 -0.0946366 0.5120448 0.1754932 -0.1303328 0.5120448 0.1754932 -0.1754932 0.5120448 0.1754932 -0.2326269 0.5120448 0.1754932 -0.3049085 0.5120448 0.1754932 -0.3963542 0.5120448 0.1754932 -0.5120448 0.5120448 0.1754932 -0.6584084 0.5120448 0.1754932 -0.8219901 0.4999841 0.1731034 -0.8967447 0.4384614 0.1658613 -0.9325696 0.3838358 0.1696351 -0.9531389 0.3509254 0.1870965 -0.9661878 0.3405032 0.2174663 -0.9749962 0.3500921 0.2591111 -0.9811943 0.3762922 0.3099976 -0.9856839 0.4154167 0.3678092 -0.9890048 0.4637389 0.4300448 -0.9914995 0.5176729 0.4941665 -0.9933953 0.573954 0.5577822 -0.9948487 0.6298046 0.6188252 -0.9959706 0.683051 0.6756878 -0.9968409 0.732167 0.7272837 -0.9975189 0.7762418 0.7730352 -0.9980488 0.8148909 0.8128033 -0.9984638 0.8481355 0.8467864 -0.9987895 0.8762773 0.8754109 -0.9990455 0.899787 0.8992336 -0.999247 0.9192157 0.9188636 -0.9994057 0.9351307 0.9349075 -0.9995308 0.9480746 0.9479335 -0.9996295 0.9585415 0.9584526 -0.9997074 0.9669663 0.9669103 -0.9997688 0.9737222 0.973687 -0.9998174 0.9791238 0.9791018 -0.9998557 0.9834324 0.9834186 -0.999886 0.9868627 0.9868541 -0.9999099 0.9895897 0.9895842 -0.9999288 0.9917549 0.9917515 -0.9999437 0.9934725 0.9934704 -0.0000238 0.6964791 0.2135639 -0.0000382 0.6959756 0.2130604 -0.0000611 0.6953434 0.2124282 -0.0000978 0.6945513 0.2116361 -0.0001565 0.6935614 0.2106462 -0.0002504 0.6923288 0.2094136 -0.0004008 0.6908009 0.2078857 -0.0006416 0.6889184 0.2060032 -0.0010268 0.6866175 0.2037023 -0.0016435 0.6838358 0.2009206 -0.0026305 0.6805235 0.1976083 -0.0042103 0.676664 0.1937488 -0.0067388 0.6723111 0.1893959 -0.0107859 0.6676523 0.1847371 -0.0172633 0.6631157 0.1802005 -0.0276309 0.6595491 0.1766339 -0.0441188 0.6584084 0.1754932 -0.0664212 0.6584084 0.1754932 -0.0946366 0.6584084 0.1754932 -0.1303328 0.6584084 0.1754932 -0.1754932 0.6584084 0.1754932 -0.2326269 0.6584084 0.1754932 -0.3049085 0.6584084 0.1754932 -0.3963542 0.6584084 0.1754932 -0.5120448 0.6584084 0.1754932 -0.6584084 0.6584084 0.1754932 -0.8219901 0.6421419 0.1731034 -0.8967447 0.557013 0.1658613 -0.9325696 0.4769901 0.1696351 -0.9531389 0.4221733 0.1870965 -0.9661878 0.3940109 0.2174663 -0.9749962 0.389659 0.2591111 -0.9811943 0.4051232 0.3099976 -0.9856839 0.4361208 0.3678092 -0.9890048 0.4783922 0.4300448 -0.9914995 0.5278957 0.4941665 -0.9933953 0.580987 0.5577822 -0.9948487 0.6345795 0.6188252 -0.9959706 0.6862532 0.6756878 -0.9968409 0.7342907 0.7272837 -0.9975189 0.7776364 0.7730352 -0.9980488 0.8157988 0.8128033 -0.9984638 0.8487222 0.8467864 -0.9987895 0.8766541 0.8754109 -0.9990455 0.9000277 0.8992336 -0.999247 0.9193688 0.9188636 -0.9994057 0.9352277 0.9349075 -0.9995308 0.9481359 0.9479335 -0.9996295 0.9585802 0.9584526 -0.9997074 0.9669906 0.9669103 -0.9997688 0.9737375 0.973687 -0.9998174 0.9791334 0.9791018 -0.9998557 0.9834385 0.9834186 -0.999886 0.9868665 0.9868541 -0.9999099 0.989592 0.9895842 -0.9999288 0.9917564 0.9917515 -0.9999437 0.9934734 0.9934704 -0.0051514 0.8407292 0.2075384 -0.0051286 0.8405071 0.2070953 -0.0051047 0.8402274 0.2065385 -0.0050826 0.8398756 0.20584 -0.0050676 0.8394338 0.204966 -0.0050694 0.8388802 0.2038759 -0.0051048 0.8381886 0.2025219 -0.0052028 0.8373283 0.2008493 -0.0054121 0.8362644 0.1987988 -0.0058134 0.8349593 0.1963105 -0.0065402 0.8333779 0.1933343 -0.0078103 0.8314967 0.1898486 -0.0099781 0.8293233 0.1858943 -0.0136166 0.8269342 0.1816352 -0.0196467 0.8245426 0.1774615 -0.0295373 0.8226154 0.174162 -0.0455041 0.8219901 0.1731034 -0.0671656 0.8219901 0.1731034 -0.0945703 0.8219901 0.1731034 -0.1292408 0.8219901 0.1731034 -0.1731034 0.8219901 0.1731034 -0.2285954 0.8219901 0.1731034 -0.2988 0.8219901 0.1731034 -0.3876179 0.8219901 0.1731034 -0.4999841 0.8219901 0.1731034 -0.6421419 0.8219901 0.1731034 -0.8219901 0.8219901 0.1731034 -0.8967447 0.7069963 0.1658613 -0.9325696 0.5948423 0.1696351 -0.9531389 0.5123112 0.1870965 -0.9661878 0.4617052 0.2174663 -0.9749962 0.4397163 0.2591111 -0.9811943 0.4415982 0.3099976 -0.9856839 0.4623142 0.3678092 -0.9890048 0.4969305 0.4300448 -0.9914995 0.5408288 0.4941665 -0.9933953 0.5898847 0.5577822 -0.9948487 0.6406203 0.6188252 -0.9959706 0.6903044 0.6756878 -0.9968409 0.7369774 0.7272837 -0.9975189 0.7794007 0.7730352 -0.9980488 0.8169474 0.8128033 -0.9984638 0.8494644 0.8467864 -0.9987895 0.8771307 0.8754109 -0.9990455 0.9003323 0.8992336 -0.999247 0.9195625 0.9188636 -0.9994057 0.9353505 0.9349075 -0.9995308 0.9482135 0.9479335 -0.9996295 0.9586291 0.9584526 -0.9997074 0.9670214 0.9669103 -0.9997688 0.9737569 0.973687 -0.9998174 0.9791456 0.9791018 -0.9998557 0.9834461 0.9834186 -0.999886 0.9868713 0.9868541 -0.9999099 0.989595 0.9895842 -0.9999288 0.9917582 0.9917515 -0.9999437 0.9934746 0.9934704 -0.0279321 0.9033413 0.1954535 -0.0278872 0.9032596 0.1950729 -0.0278347 0.9031567 0.1945945 -0.0277752 0.9030276 0.1939946 -0.0277111 0.9028657 0.1932439 -0.0276479 0.9026634 0.1923076 -0.0275966 0.9024114 0.1911446 -0.0275778 0.9020992 0.1897081 -0.0276281 0.9017148 0.1879469 -0.0278105 0.9012461 0.1858097 -0.0282324 0.900682 0.1832532 -0.0290732 0.9000167 0.1802587 -0.0306306 0.8992555 0.1768609 -0.0333932 0.8984278 0.1732 -0.0381561 0.8976087 0.1696109 -0.0461985 0.8969554 0.1667723 -0.0594506 0.8967447 0.1658613 -0.0775151 0.8967447 0.1658613 -0.1003691 0.8967447 0.1658613 -0.1292823 0.8967447 0.1658613 -0.1658613 0.8967447 0.1658613 -0.2121385 0.8967447 0.1658613 -0.2706852 0.8967447 0.1658613 -0.3447543 0.8967447 0.1658613 -0.4384614 0.8967447 0.1658613 -0.557013 0.8967447 0.1658613 -0.7069963 0.8967447 0.1658613 -0.8967447 0.8967447 0.1658613 -0.9325696 0.7439407 0.1696351 -0.9531389 0.6263473 0.1870965 -0.9661878 0.5473473 0.2174663 -0.9749962 0.5030453 0.2591111 -0.9811943 0.4877437 0.3099976 -0.9856839 0.4954523 0.3678092 -0.9890048 0.5203839 0.4300448 -0.9914995 0.5571908 0.4941665 -0.9933953 0.6011414 0.5577822 -0.9948487 0.6482627 0.6188252 -0.9959706 0.6954296 0.6756878 -0.9968409 0.7403765 0.7272837 -0.9975189 0.7816327 0.7730352 -0.9980488 0.8184005 0.8128033 -0.9984638 0.8504035 0.8467864 -0.9987895 0.8777338 0.8754109 -0.9990455 0.9007175 0.8992336 -0.999247 0.9198076 0.9188636 -0.9994057 0.9355059 0.9349075 -0.9995308 0.9483117 0.9479335 -0.9996295 0.958691 0.9584526 -0.9997074 0.9670604 0.9669103 -0.9997688 0.9737814 0.973687 -0.9998174 0.979161 0.9791018 -0.9998557 0.9834557 0.9834186 -0.999886 0.9868773 0.9868541 -0.9999099 0.9895988 0.9895842 -0.9999288 0.9917606 0.9917515 -0.9999437 0.9934761 0.9934704 -0.0624569 0.9354466 0.1944569 -0.0624063 0.9354101 0.1941366 -0.0623458 0.9353643 0.1937341 -0.0622749 0.9353068 0.1932293 -0.0621943 0.9352348 0.1925979 -0.0621069 0.9351449 0.1918104 -0.0620199 0.9350332 0.1908325 -0.0619473 0.9348949 0.189625 -0.061916 0.9347252 0.1881451 -0.0619734 0.9345187 0.1863501 -0.062202 0.9342712 0.1842041 -0.062742 0.9339805 0.1816918 -0.0638283 0.9336494 0.1788432 -0.0658501 0.9332914 0.1757762 -0.0694453 0.9329391 0.1727717 -0.0756464 0.9326595 0.170397 -0.0860209 0.9325696 0.1696351 -0.1002154 0.9325696 0.1696351 -0.1181733 0.9325696 0.1696351 -0.1408925 0.9325696 0.1696351 -0.1696351 0.9325696 0.1696351 -0.2059983 0.9325696 0.1696351 -0.2520025 0.9325696 0.1696351 -0.3102037 0.9325696 0.1696351 -0.3838358 0.9325696 0.1696351 -0.4769901 0.9325696 0.1696351 -0.5948423 0.9325696 0.1696351 -0.7439407 0.9325696 0.1696351 -0.9325696 0.9325696 0.1696351 -0.9531389 0.7706179 0.1870965 -0.9661878 0.6556956 0.2174663 -0.9749962 0.5831647 0.2591111 -0.9811943 0.5461239 0.3099976 -0.9856839 0.5373763 0.3678092 -0.9890048 0.5500554 0.4300448 -0.9914995 0.577891 0.4941665 -0.9933953 0.6153825 0.5577822 -0.9948487 0.6579314 0.6188252 -0.9959706 0.7019138 0.6756878 -0.9968409 0.7446768 0.7272837 -0.9975189 0.7844566 0.7730352 -0.9980488 0.8202389 0.8128033 -0.9984638 0.8515915 0.8467864 -0.9987895 0.8784967 0.8754109 -0.9990455 0.9012049 0.8992336 -0.999247 0.9201176 0.9188636 -0.9994057 0.9357024 0.9349075 -0.9995308 0.9484359 0.9479335 -0.9996295 0.9587693 0.9584526 -0.9997074 0.9671097 0.9669103 -0.9997688 0.9738123 0.973687 -0.9998174 0.9791804 0.9791018 -0.9998557 0.9834679 0.9834186 -0.999886 0.986885 0.9868541 -0.9999099 0.9896036 0.9895842 -0.9999288 0.9917636 0.9917515 -0.9999437 0.9934779 0.9934704 -0.1059991 0.9545467 0.2073855 -0.1059489 0.9545286 0.2071226 -0.1058883 0.9545059 0.2067924 -0.1058162 0.9544774 0.2063783 -0.1057322 0.9544418 0.2058603 -0.1056375 0.9543974 0.2052145 -0.1055364 0.9543421 0.2044128 -0.1054384 0.9542739 0.2034232 -0.1053624 0.9541902 0.2022109 -0.1053433 0.9540886 0.2007412 -0.1054431 0.9539671 0.1989853 -0.1057683 0.9538247 0.1969312 -0.1064997 0.953663 0.1946042 -0.1079385 0.9534887 0.1921012 -0.1105818 0.9533177 0.1896515 -0.1152388 0.9531823 0.1877169 -0.1231452 0.9531389 0.1870965 -0.1340017 0.9531389 0.1870965 -0.1477366 0.9531389 0.1870965 -0.1651131 0.9531389 0.1870965 -0.1870965 0.9531389 0.1870965 -0.2149085 0.9531389 0.1870965 -0.2500942 0.9531389 0.1870965 -0.2946088 0.9531389 0.1870965 -0.3509254 0.9531389 0.1870965 -0.4221733 0.9531389 0.1870965 -0.5123112 0.9531389 0.1870965 -0.6263473 0.9531389 0.1870965 -0.7706179 0.9531389 0.1870965 -0.9531389 0.9531389 0.1870965 -0.9661878 0.7927704 0.2174663 -0.9749962 0.6845262 0.2591111 -0.9811943 0.6199824 0.3099976 -0.9856839 0.5904156 0.3678092 -0.9890048 0.5875938 0.4300448 -0.9914995 0.6040793 0.4941665 -0.9933953 0.6333995 0.5577822 -0.9948487 0.6701635 0.6188252 -0.9959706 0.710117 0.6756878 -0.9968409 0.7501172 0.7272837 -0.9975189 0.7880291 0.7730352 -0.9980488 0.8225647 0.8128033 -0.9984638 0.8530945 0.8467864 -0.9987895 0.8794619 0.8754109 -0.9990455 0.9018215 0.8992336 -0.999247 0.9205098 0.9188636 -0.9994057 0.935951 0.9349075 -0.9995308 0.9485931 0.9479335 -0.9996295 0.9588684 0.9584526 -0.9997074 0.967172 0.9669103 -0.9997688 0.9738515 0.973687 -0.9998174 0.979205 0.9791018 -0.9998557 0.9834833 0.9834186 -0.999886 0.9868946 0.9868541 -0.9999099 0.9896096 0.9895842 -0.9999288 0.9917674 0.9917515 -0.9999437 0.9934803 0.9934704 -0.1572498 0.9669269 0.2337004 -0.1572031 0.9669173 0.2334893 -0.1571463 0.9669053 0.2332241 -0.1570779 0.9668902 0.2328916 -0.1569971 0.9668714 0.2324758 -0.156904 0.9668479 0.2319575 -0.1568008 0.9668187 0.2313143 -0.1566936 0.9667827 0.2305205 -0.1565954 0.9667385 0.2295486 -0.1565315 0.966685 0.2283708 -0.1565473 0.9666211 0.2269644 -0.1567226 0.9665463 0.2253205 -0.1571937 0.9664615 0.2234595 -0.15819 0.9663702 0.2214596 -0.160092 0.9662809 0.219504 -0.1635226 0.9662104 0.2179609 -0.1694384 0.9661878 0.2174663 -0.1775917 0.9661878 0.2174663 -0.1879067 0.9661878 0.2174663 -0.2009566 0.9661878 0.2174663 -0.2174663 0.9661878 0.2174663 -0.2383533 0.9661878 0.2174663 -0.2647781 0.9661878 0.2174663 -0.2982089 0.9661878 0.2174663 -0.3405032 0.9661878 0.2174663 -0.3940109 0.9661878 0.2174663 -0.4617052 0.9661878 0.2174663 -0.5473473 0.9661878 0.2174663 -0.6556956 0.9661878 0.2174663 -0.7927704 0.9661878 0.2174663 -0.9661878 0.9661878 0.2174663 -0.9749962 0.8127617 0.2591111 -0.9811943 0.713423 0.3099976 -0.9856839 0.6575172 0.3678092 -0.9890048 0.6350848 0.4300448 -0.9914995 0.637211 0.4941665 -0.9933953 0.6561933 0.5577822 -0.9948487 0.6856388 0.6188252 -0.9959706 0.7204952 0.6756878 -0.9968409 0.757 0.7272837 -0.9975189 0.7925488 0.7730352 -0.9980488 0.8255071 0.8128033 -0.9984638 0.8549959 0.8467864 -0.9987895 0.880683 0.8754109 -0.9990455 0.9026016 0.8992336 -0.999247 0.9210061 0.9188636 -0.9994057 0.9362655 0.9349075 -0.9995308 0.9487918 0.9479335 -0.9996295 0.9589938 0.9584526 -0.9997074 0.9672509 0.9669103 -0.9997688 0.9739011 0.973687 -0.9998174 0.9792361 0.9791018 -0.9998557 0.9835029 0.9834186 -0.999886 0.9869069 0.9868541 -0.9999099 0.9896173 0.9895842 -0.9999288 0.9917722 0.9917515 -0.9999437 0.9934833 0.9934704 -0.2151269 0.9754027 0.2718587 -0.2150852 0.9753975 0.2716924 -0.2150342 0.9753908 0.2714835 -0.2149725 0.9753825 0.2712217 -0.2148987 0.9753721 0.2708943 -0.2148124 0.9753591 0.2704863 -0.2147144 0.975343 0.26998 -0.2146085 0.9753231 0.2693554 -0.2145034 0.9752987 0.2685909 -0.2144168 0.9752692 0.2676648 -0.2143816 0.975234 0.2665596 -0.2144566 0.9751928 0.2652685 -0.2147432 0.9751462 0.2638078 -0.2154135 0.9750962 0.2622393 -0.2167545 0.9750472 0.2607068 -0.2192389 0.9750086 0.2594983 -0.2235962 0.9749962 0.2591111 -0.2296253 0.9749962 0.2591111 -0.2372529 0.9749962 0.2591111 -0.2469027 0.9749962 0.2591111 -0.2591111 0.9749962 0.2591111 -0.2745562 0.9749962 0.2591111 -0.2940963 0.9749962 0.2591111 -0.3188171 0.9749962 0.2591111 -0.3500921 0.9749962 0.2591111 -0.389659 0.9749962 0.2591111 -0.4397163 0.9749962 0.2591111 -0.5030453 0.9749962 0.2591111 -0.5831647 0.9749962 0.2591111 -0.6845262 0.9749962 0.2591111 -0.8127617 0.9749962 0.2591111 -0.9749962 0.9749962 0.2591111 -0.9811943 0.8316375 0.3099976 -0.9856839 0.7424095 0.3678092 -0.9890048 0.695167 0.4300448 -0.9914995 0.6791269 0.4941665 -0.9933953 0.6850303 0.5577822 -0.9948487 0.7052169 0.6188252 -0.9959706 0.733625 0.6756878 -0.9968409 0.7657077 0.7272837 -0.9975189 0.7982669 0.7730352 -0.9980488 0.8292297 0.8128033 -0.9984638 0.8574015 0.8467864 -0.9987895 0.8822279 0.8754109 -0.9990455 0.9035886 0.8992336 -0.999247 0.9216339 0.9188636 -0.9994057 0.9366635 0.9349075 -0.9995308 0.9490434 0.9479335 -0.9996295 0.9591524 0.9584526 -0.9997074 0.9673508 0.9669103 -0.9997688 0.9739638 0.973687 -0.9998174 0.9792755 0.9791018 -0.9998557 0.9835276 0.9834186 -0.999886 0.9869223 0.9868541 -0.9999099 0.989627 0.9895842 -0.9999288 0.9917782 0.9917515 -0.9999437 0.9934871 0.9934704 -0.2783684 0.9814251 0.3198302 -0.2783325 0.9814221 0.3197017 -0.2782884 0.9814183 0.3195402 -0.2782347 0.9814136 0.3193377 -0.2781701 0.9814076 0.3190846 -0.2780936 0.9814002 0.3187692 -0.2780055 0.9813911 0.318378 -0.2779077 0.9813797 0.3178954 -0.2778058 0.9813659 0.3173048 -0.2777122 0.9813491 0.3165898 -0.2776503 0.9813291 0.3157367 -0.2776626 0.9813057 0.3147406 -0.2778236 0.9812792 0.3136144 -0.2782606 0.9812508 0.3124058 -0.2791873 0.9812231 0.3112256 -0.2809573 0.9812013 0.3102955 -0.2841192 0.9811943 0.3099976 -0.2885124 0.9811943 0.3099976 -0.2940703 0.9811943 0.3099976 -0.3011018 0.9811943 0.3099976 -0.3099976 0.9811943 0.3099976 -0.3212519 0.9811943 0.3099976 -0.3354901 0.9811943 0.3099976 -0.3535032 0.9811943 0.3099976 -0.3762922 0.9811943 0.3099976 -0.4051232 0.9811943 0.3099976 -0.4415982 0.9811943 0.3099976 -0.4877437 0.9811943 0.3099976 -0.5461239 0.9811943 0.3099976 -0.6199824 0.9811943 0.3099976 -0.713423 0.9811943 0.3099976 -0.8316375 0.9811943 0.3099976 -0.9811943 0.9811943 0.3099976 -0.9856839 0.8498092 0.3678092 -0.9890048 0.7711789 0.4300448 -0.9914995 0.7321559 0.4941665 -0.9933953 0.721513 0.5577822 -0.9948487 0.7299859 0.6188252 -0.9959706 0.7502359 0.6756878 -0.9968409 0.776724 0.7272837 -0.9975189 0.8055009 0.7730352 -0.9980488 0.8339392 0.8128033 -0.9984638 0.8604449 0.8467864 -0.9987895 0.8841823 0.8754109 -0.9990455 0.9048372 0.8992336 -0.999247 0.9224281 0.9188636 -0.9994057 0.9371669 0.9349075 -0.9995308 0.9493615 0.9479335 -0.9996295 0.959353 0.9584526 -0.9997074 0.967477 0.9669103 -0.9997688 0.9740432 0.973687 -0.9998174 0.9793253 0.9791018 -0.9998557 0.9835588 0.9834186 -0.999886 0.9869419 0.9868541 -0.9999099 0.9896392 0.9895842 -0.9999288 0.9917859 0.9917515 -0.9999437 0.9934919 0.9934704 -0.3454107 0.9858181 0.3752597 -0.3453807 0.9858163 0.3751621 -0.3453439 0.9858141 0.3750394 -0.3452987 0.9858113 0.3748857 -0.3452442 0.9858079 0.3746936 -0.3451791 0.9858036 0.3744542 -0.3451032 0.9857982 0.3741573 -0.3450175 0.9857916 0.3737911 -0.3449254 0.9857835 0.3733431 -0.3448353 0.9857738 0.3728008 -0.3447636 0.9857621 0.3721541 -0.3447407 0.9857485 0.3713992 -0.3448204 0.9857332 0.3705461 -0.3450957 0.9857167 0.369631 -0.3457234 0.9857006 0.368738 -0.3469645 0.9856879 0.3680344 -0.3492254 0.9856839 0.3678092 -0.3523802 0.9856839 0.3678092 -0.3563715 0.9856839 0.3678092 -0.3614209 0.9856839 0.3678092 -0.3678092 0.9856839 0.3678092 -0.3758911 0.9856839 0.3678092 -0.3861159 0.9856839 0.3678092 -0.3990515 0.9856839 0.3678092 -0.4154167 0.9856839 0.3678092 -0.4361208 0.9856839 0.3678092 -0.4623142 0.9856839 0.3678092 -0.4954523 0.9856839 0.3678092 -0.5373763 0.9856839 0.3678092 -0.5904156 0.9856839 0.3678092 -0.6575172 0.9856839 0.3678092 -0.7424095 0.9856839 0.3678092 -0.8498092 0.9856839 0.3678092 -0.9856839 0.9856839 0.3678092 -0.9890048 0.8673437 0.4300448 -0.9914995 0.7992446 0.4941665 -0.9933953 0.7676683 0.5577822 -0.9948487 0.7613218 0.6188252 -0.9959706 0.7712508 0.6756878 -0.9968409 0.7906611 0.7272837 -0.9975189 0.8146529 0.7730352 -0.9980488 0.8398974 0.8128033 -0.9984638 0.8642952 0.8467864 -0.9987895 0.886655 0.8754109 -0.9990455 0.9064168 0.8992336 -0.999247 0.9234329 0.9188636 -0.9994057 0.9378038 0.9349075 -0.9995308 0.9497641 0.9479335 -0.9996295 0.9596068 0.9584526 -0.9997074 0.9676368 0.9669103 -0.9997688 0.9741436 0.973687 -0.9998174 0.9793883 0.9791018 -0.9998557 0.9835983 0.9834186 -0.999886 0.9869667 0.9868541 -0.9999099 0.9896547 0.9895842 -0.9999288 0.9917956 0.9917515 -0.9999437 0.993498 0.9934704 -0.4144197 0.9890841 0.4355894 -0.4143955 0.9890831 0.4355166 -0.4143657 0.9890818 0.4354252 -0.414329 0.9890801 0.4353106 -0.4142845 0.9890781 0.4351674 -0.4142311 0.9890755 0.434989 -0.4141683 0.9890723 0.4347678 -0.4140964 0.9890684 0.434495 -0.4140176 0.9890637 0.4341613 -0.4139373 0.9890579 0.4337574 -0.4138668 0.989051 0.4332759 -0.4138277 0.989043 0.4327141 -0.4138582 0.9890339 0.4320794 -0.4140252 0.9890241 0.4313989 -0.4144423 0.9890146 0.430735 -0.4152991 0.9890072 0.4302122 -0.4168922 0.9890048 0.4300448 -0.419125 0.9890048 0.4300448 -0.4219498 0.9890048 0.4300448 -0.4255236 0.9890048 0.4300448 -0.4300448 0.9890048 0.4300448 -0.4357648 0.9890048 0.4300448 -0.4430013 0.9890048 0.4300448 -0.4521565 0.9890048 0.4300448 -0.4637389 0.9890048 0.4300448 -0.4783922 0.9890048 0.4300448 -0.4969305 0.9890048 0.4300448 -0.5203839 0.9890048 0.4300448 -0.5500554 0.9890048 0.4300448 -0.5875938 0.9890048 0.4300448 -0.6350848 0.9890048 0.4300448 -0.695167 0.9890048 0.4300448 -0.7711789 0.9890048 0.4300448 -0.8673437 0.9890048 0.4300448 -0.9890048 0.9890048 0.4300448 -0.9914995 0.8841204 0.4941665 -0.9933953 0.8260608 0.5577822 -0.9948487 0.8009659 0.6188252 -0.9959706 0.7978374 0.6756878 -0.9968409 0.8082934 0.7272837 -0.9975189 0.8262314 0.7730352 -0.9980488 0.8474353 0.8128033 -0.9984638 0.8691663 0.8467864 -0.9987895 0.8897832 0.8754109 -0.9990455 0.9084153 0.8992336 -0.999247 0.9247041 0.9188636 -0.9994057 0.9386096 0.9349075 -0.9995308 0.9502734 0.9479335 -0.9996295 0.959928 0.9584526 -0.9997074 0.9678389 0.9669103 -0.9997688 0.9742706 0.973687 -0.9998174 0.9794681 0.9791018 -0.9998557 0.9836483 0.9834186 -0.999886 0.986998 0.9868541 -0.9999099 0.9896744 0.9895842 -0.9999288 0.9918079 0.9917515 -0.9999437 0.9935057 0.9934704 -0.4834235 0.9915469 0.4982181 -0.4834045 0.9915463 0.4981648 -0.4833811 0.9915455 0.4980979 -0.4833522 0.9915446 0.4980141 -0.4833171 0.9915433 0.4979093 -0.4832747 0.9915418 0.4977788 -0.4832246 0.9915399 0.497617 -0.4831666 0.9915376 0.4974174 -0.4831021 0.9915347 0.4971734 -0.4830346 0.9915312 0.4968781 -0.4829718 0.9915271 0.4965262 -0.4829286 0.9915223 0.4961156 -0.4829319 0.9915169 0.4956519 -0.4830292 0.991511 0.4951549 -0.4833013 0.9915054 0.4946702 -0.4838841 0.9915009 0.4942887 -0.4849907 0.9914995 0.4941665 -0.4865484 0.9914995 0.4941665 -0.4885191 0.9914995 0.4941665 -0.4910123 0.9914995 0.4941665 -0.4941665 0.9914995 0.4941665 -0.498157 0.9914995 0.4941665 -0.5032055 0.9914995 0.4941665 -0.5095925 0.9914995 0.4941665 -0.5176729 0.9914995 0.4941665 -0.5278957 0.9914995 0.4941665 -0.5408288 0.9914995 0.4941665 -0.5571908 0.9914995 0.4941665 -0.577891 0.9914995 0.4941665 -0.6040793 0.9914995 0.4941665 -0.637211 0.9914995 0.4941665 -0.6791269 0.9914995 0.4941665 -0.7321559 0.9914995 0.4941665 -0.7992446 0.9914995 0.4941665 -0.8841204 0.9914995 0.4941665 -0.9914995 0.9914995 0.4941665 -0.9933953 0.8999349 0.5577822 -0.9948487 0.8511207 0.6188252 -0.9959706 0.8314729 0.6756878 -0.9968409 0.8306004 0.7272837 -0.9975189 0.8408797 0.7730352 -0.9980488 0.8569716 0.8128033 -0.9984638 0.875329 0.8467864 -0.9987895 0.8937407 0.8754109 -0.9990455 0.9109436 0.8992336 -0.999247 0.9263124 0.9188636 -0.9994057 0.939629 0.9349075 -0.9995308 0.9509177 0.9479335 -0.9996295 0.9603343 0.9584526 -0.9997074 0.9680946 0.9669103 -0.9997688 0.9744313 0.973687 -0.9998174 0.9795689 0.9791018 -0.9998557 0.9837116 0.9834186 -0.999886 0.9870376 0.9868541 -0.9999099 0.9896992 0.9895842 -0.9999288 0.9918234 0.9917515 -0.9999437 0.9935154 0.9934704 -0.5504963 0.993424 0.5606894 -0.5504818 0.9934236 0.5606511 -0.550464 0.9934231 0.5606031 -0.5504419 0.9934225 0.5605429 -0.550415 0.9934218 0.5604676 -0.5503825 0.9934209 0.5603739 -0.5503438 0.9934197 0.5602576 -0.5502987 0.9934183 0.5601144 -0.550248 0.9934166 0.5599391 -0.5501939 0.9934145 0.5597272 -0.5501416 0.993412 0.5594745 -0.5501012 0.9934091 0.5591799 -0.5500915 0.9934058 0.5588473 -0.5501456 0.9934023 0.5584908 -0.5503203 0.9933988 0.5581433 -0.5507113 0.9933961 0.5578697 -0.5514695 0.9933953 0.5577822 -0.5525411 0.9933953 0.5577822 -0.5538969 0.9933953 0.5577822 -0.5556122 0.9933953 0.5577822 -0.5577822 0.9933953 0.5577822 -0.5605276 0.9933953 0.5577822 -0.5640008 0.9933953 0.5577822 -0.5683949 0.9933953 0.5577822 -0.573954 0.9933953 0.5577822 -0.580987 0.9933953 0.5577822 -0.5898847 0.9933953 0.5577822 -0.6011414 0.9933953 0.5577822 -0.6153825 0.9933953 0.5577822 -0.6333995 0.9933953 0.5577822 -0.6561933 0.9933953 0.5577822 -0.6850303 0.9933953 0.5577822 -0.721513 0.9933953 0.5577822 -0.7676683 0.9933953 0.5577822 -0.8260608 0.9933953 0.5577822 -0.8999349 0.9933953 0.5577822 -0.9933953 0.9933953 0.5577822 -0.9948487 0.9145732 0.6188252 -0.9959706 0.8740262 0.6756878 -0.9968409 0.8588218 0.7272837 -0.9975189 0.8594117 0.7730352 -0.9980488 0.8690364 0.8128033 -0.9984638 0.8831255 0.8467864 -0.9987895 0.8987476 0.8754109 -0.9990455 0.9141422 0.8992336 -0.999247 0.928347 0.9188636 -0.9994057 0.9409186 0.9349075 -0.9995308 0.9517328 0.9479335 -0.9996295 0.9608482 0.9584526 -0.9997074 0.9684181 0.9669103 -0.9997688 0.9746346 0.973687 -0.9998174 0.9796966 0.9791018 -0.9998557 0.9837916 0.9834186 -0.999886 0.9870878 0.9868541 -0.9999099 0.9897306 0.9895842 -0.9999288 0.9918431 0.9917515 -0.9999437 0.9935277 0.9934704 -0.6139459 0.9948662 0.6208746 -0.6139352 0.994866 0.6208476 -0.6139219 0.9948657 0.6208137 -0.6139056 0.9948653 0.6207712 -0.6138855 0.9948649 0.6207181 -0.6138613 0.9948643 0.620652 -0.6138323 0.9948636 0.62057 -0.6137984 0.9948628 0.6204689 -0.6137599 0.9948617 0.6203453 -0.6137183 0.9948604 0.6201959 -0.6136769 0.9948589 0.6200177 -0.6136427 0.9948571 0.61981 -0.6136284 0.9948551 0.6195755 -0.6136569 0.994853 0.6193243 -0.6137675 0.9948509 0.6190795 -0.6140266 0.9948493 0.6188868 -0.6145393 0.9948487 0.6188252 -0.6152669 0.9948487 0.6188252 -0.6161874 0.9948487 0.6188252 -0.6173519 0.9948487 0.6188252 -0.6188252 0.9948487 0.6188252 -0.6206891 0.9948487 0.6188252 -0.6230471 0.9948487 0.6188252 -0.6260304 0.9948487 0.6188252 -0.6298046 0.9948487 0.6188252 -0.6345795 0.9948487 0.6188252 -0.6406203 0.9948487 0.6188252 -0.6482627 0.9948487 0.6188252 -0.6579314 0.9948487 0.6188252 -0.6701635 0.9948487 0.6188252 -0.6856388 0.9948487 0.6188252 -0.7052169 0.9948487 0.6188252 -0.7299859 0.9948487 0.6188252 -0.7613218 0.9948487 0.6188252 -0.8009659 0.9948487 0.6188252 -0.8511207 0.9948487 0.6188252 -0.9145732 0.9948487 0.6188252 -0.9948487 0.9948487 0.6188252 -0.9959706 0.9278617 0.6756878 -0.9968409 0.8945255 0.7272837 -0.9975189 0.8828571 0.7730352 -0.9980488 0.8842998 0.8128033 -0.9984638 0.892989 0.8467864 -0.9987895 0.9050819 0.8754109 -0.9990455 0.9181889 0.8992336 -0.999247 0.9309211 0.9188636 -0.9994057 0.9425502 0.9349075 -0.9995308 0.952764 0.9479335 -0.9996295 0.9614985 0.9584526 -0.9997074 0.9688274 0.9669103 -0.9997688 0.9748918 0.973687 -0.9998174 0.979858 0.9791018 -0.9998557 0.9838928 0.9834186 -0.999886 0.9871512 0.9868541 -0.9999099 0.9897703 0.9895842 -0.9999288 0.991868 0.9917515 -0.9999437 0.9935432 0.9934704 -0.6724572 0.9959813 0.6771085 -0.6724495 0.9959811 0.6770898 -0.6724399 0.9959809 0.6770662 -0.672428 0.9959807 0.6770368 -0.6724135 0.9959804 0.677 -0.6723959 0.9959801 0.6769541 -0.6723748 0.9959797 0.6768972 -0.67235 0.9959791 0.6768271 -0.6723217 0.9959785 0.6767414 -0.6722907 0.9959777 0.6766377 -0.6722594 0.9959768 0.6765142 -0.6722322 0.9959757 0.6763703 -0.672218 0.9959745 0.6762077 -0.672232 0.9959732 0.6760337 -0.6723012 0.9959719 0.675864 -0.6724711 0.9959709 0.6757305 -0.6728136 0.9959706 0.6756878 -0.6733015 0.9959706 0.6756878 -0.6739188 0.9959706 0.6756878 -0.6746998 0.9959706 0.6756878 -0.6756878 0.9959706 0.6756878 -0.6769378 0.9959706 0.6756878 -0.6785192 0.9959706 0.6756878 -0.6805199 0.9959706 0.6756878 -0.683051 0.9959706 0.6756878 -0.6862532 0.9959706 0.6756878 -0.6903044 0.9959706 0.6756878 -0.6954296 0.9959706 0.6756878 -0.7019138 0.9959706 0.6756878 -0.710117 0.9959706 0.6756878 -0.7204952 0.9959706 0.6756878 -0.733625 0.9959706 0.6756878 -0.7502359 0.9959706 0.6756878 -0.7712508 0.9959706 0.6756878 -0.7978374 0.9959706 0.6756878 -0.8314729 0.9959706 0.6756878 -0.8740262 0.9959706 0.6756878 -0.9278617 0.9959706 0.6756878 -0.9959706 0.9959706 0.6756878 -0.9968409 0.9396953 0.7272837 -0.9975189 0.9125186 0.7730352 -0.9980488 0.9036101 0.8128033 -0.9984638 0.9054678 0.8467864 -0.9987895 0.9130957 0.8754109 -0.9990455 0.9233085 0.8992336 -0.999247 0.9341777 0.9188636 -0.9994057 0.9446144 0.9349075 -0.9995308 0.9540687 0.9479335 -0.9996295 0.9623212 0.9584526 -0.9997074 0.9693452 0.9669103 -0.9997688 0.9752172 0.973687 -0.9998174 0.9800622 0.9791018 -0.9998557 0.9840209 0.9834186 -0.999886 0.9872315 0.9868541 -0.9999099 0.9898206 0.9895842 -0.9999288 0.9918994 0.9917515 -0.9999437 0.9935629 0.9934704 -0.7251659 0.9968475 0.7282533 -0.7251605 0.9968474 0.7282405 -0.7251537 0.9968473 0.7282244 -0.7251454 0.9968472 0.7282043 -0.7251351 0.996847 0.7281792 -0.7251226 0.9968468 0.7281478 -0.7251076 0.9968465 0.728109 -0.7250899 0.9968462 0.7280611 -0.7250697 0.9968458 0.7280026 -0.7250473 0.9968453 0.7279319 -0.7250244 0.9968448 0.7278476 -0.7250039 0.9968441 0.7277493 -0.7249916 0.9968433 0.7276384 -0.7249978 0.9968425 0.7275196 -0.7250408 0.9968418 0.7274039 -0.7251511 0.9968411 0.7273129 -0.7253775 0.9968409 0.7272837 -0.7257011 0.9968409 0.7272837 -0.7261105 0.9968409 0.7272837 -0.7266285 0.9968409 0.7272837 -0.7272837 0.9968409 0.7272837 -0.7281127 0.9968409 0.7272837 -0.7291615 0.9968409 0.7272837 -0.7304884 0.9968409 0.7272837 -0.732167 0.9968409 0.7272837 -0.7342907 0.9968409 0.7272837 -0.7369774 0.9968409 0.7272837 -0.7403765 0.9968409 0.7272837 -0.7446768 0.9968409 0.7272837 -0.7501172 0.9968409 0.7272837 -0.757 0.9968409 0.7272837 -0.7657077 0.9968409 0.7272837 -0.776724 0.9968409 0.7272837 -0.7906611 0.9968409 0.7272837 -0.8082934 0.9968409 0.7272837 -0.8306004 0.9968409 0.7272837 -0.8588218 0.9968409 0.7272837 -0.8945255 0.9968409 0.7272837 -0.9396953 0.9968409 0.7272837 -0.9968409 0.9968409 0.7272837 -0.9975189 0.9500442 0.7730352 -0.9980488 0.9280401 0.8128033 -0.9984638 0.921255 0.8467864 -0.9987895 0.9232341 0.8754109 -0.9990455 0.9297854 0.8992336 -0.999247 0.9382977 0.9188636 -0.9994057 0.9472259 0.9349075 -0.9995308 0.9557192 0.9479335 -0.9996295 0.963362 0.9584526 -0.9997074 0.9700002 0.9669103 -0.9997688 0.9756289 0.973687 -0.9998174 0.9803206 0.9791018 -0.9998557 0.9841829 0.9834186 -0.999886 0.987333 0.9868541 -0.9999099 0.9898842 0.9895842 -0.9999288 0.9919392 0.9917515 -0.9999437 0.9935878 0.9934704 -0.7716588 0.997523 0.7736876 -0.7716551 0.997523 0.773679 -0.7716504 0.9975229 0.7736681 -0.7716446 0.9975228 0.7736546 -0.7716375 0.9975227 0.7736377 -0.7716288 0.9975226 0.7736166 -0.7716184 0.9975224 0.7735904 -0.7716061 0.9975222 0.7735582 -0.7715919 0.997522 0.7735188 -0.7715762 0.9975217 0.7734712 -0.7715599 0.9975213 0.7734145 -0.7715449 0.9975209 0.7733484 -0.7715352 0.9975204 0.7732737 -0.7715376 0.9975199 0.7731938 -0.7715641 0.9975194 0.773116 -0.7716352 0.9975191 0.7730548 -0.7717834 0.9975189 0.7730352 -0.7719959 0.9975189 0.7730352 -0.7722648 0.9975189 0.7730352 -0.7726049 0.9975189 0.7730352 -0.7730352 0.9975189 0.7730352 -0.7735795 0.9975189 0.7730352 -0.7742682 0.9975189 0.7730352 -0.7751395 0.9975189 0.7730352 -0.7762418 0.9975189 0.7730352 -0.7776364 0.9975189 0.7730352 -0.7794007 0.9975189 0.7730352 -0.7816327 0.9975189 0.7730352 -0.7844566 0.9975189 0.7730352 -0.7880291 0.9975189 0.7730352 -0.7925488 0.9975189 0.7730352 -0.7982669 0.9975189 0.7730352 -0.8055009 0.9975189 0.7730352 -0.8146529 0.9975189 0.7730352 -0.8262314 0.9975189 0.7730352 -0.8408797 0.9975189 0.7730352 -0.8594117 0.9975189 0.7730352 -0.8828571 0.9975189 0.7730352 -0.9125186 0.9975189 0.7730352 -0.9500442 0.9975189 0.7730352 -0.9975189 0.9975189 0.7730352 -0.9980488 0.9589472 0.8128033 -0.9984638 0.9412278 0.8467864 -0.9987895 0.9360606 0.8754109 -0.9990455 0.9379796 0.8992336 -0.999247 0.94351 0.9188636 -0.9994057 0.9505298 0.9349075 -0.9995308 0.9578074 0.9479335 -0.9996295 0.9646787 0.9584526 -0.9997074 0.970829 0.9669103 -0.9997688 0.9761497 0.973687 -0.9998174 0.9806476 0.9791018 -0.9998557 0.984388 0.9834186 -0.999886 0.9874615 0.9868541 -0.9999099 0.9899646 0.9895842 -0.9999288 0.9919896 0.9917515 -0.9999437 0.9936193 0.9934704 -0.8119154 0.9980513 0.8132369 -0.8119128 0.9980512 0.8132312 -0.8119096 0.9980512 0.813224 -0.8119057 0.9980511 0.813215 -0.8119009 0.9980511 0.8132037 -0.8118949 0.998051 0.8131897 -0.8118878 0.9980509 0.8131723 -0.8118794 0.9980508 0.8131509 -0.8118697 0.9980506 0.8131247 -0.8118589 0.9980504 0.8130931 -0.8118476 0.9980502 0.8130554 -0.811837 0.99805 0.8130114 -0.8118298 0.9980497 0.8129618 -0.8118303 0.9980494 0.8129087 -0.8118466 0.9980491 0.812857 -0.8118921 0.9980488 0.8128163 -0.8119884 0.9980488 0.8128033 -0.8121268 0.9980488 0.8128033 -0.8123018 0.9980488 0.8128033 -0.8125232 0.9980488 0.8128033 -0.8128033 0.9980488 0.8128033 -0.8131577 0.9980488 0.8128033 -0.8136061 0.9980488 0.8128033 -0.8141733 0.9980488 0.8128033 -0.8148909 0.9980488 0.8128033 -0.8157988 0.9980488 0.8128033 -0.8169474 0.9980488 0.8128033 -0.8184005 0.9980488 0.8128033 -0.8202389 0.9980488 0.8128033 -0.8225647 0.9980488 0.8128033 -0.8255071 0.9980488 0.8128033 -0.8292297 0.9980488 0.8128033 -0.8339392 0.9980488 0.8128033 -0.8398974 0.9980488 0.8128033 -0.8474353 0.9980488 0.8128033 -0.8569716 0.9980488 0.8128033 -0.8690364 0.9980488 0.8128033 -0.8842998 0.9980488 0.8128033 -0.9036101 0.9980488 0.8128033 -0.9280401 0.9980488 0.8128033 -0.9589472 0.9980488 0.8128033 -0.9980488 0.9980488 0.8128033 -0.9984638 0.9664961 0.8467864 -0.9987895 0.9522877 0.8754109 -0.9990455 0.9483463 0.8992336 -0.999247 0.9501042 0.9188636 -0.9994057 0.9547096 0.9349075 -0.9995308 0.9604492 0.9479335 -0.9996295 0.9663445 0.9584526 -0.9997074 0.9718774 0.9669103 -0.9997688 0.9768086 0.973687 -0.9998174 0.9810611 0.9791018 -0.9998557 0.9846473 0.9834186 -0.999886 0.987624 0.9868541 -0.9999099 0.9900664 0.9895842 -0.9999288 0.9920533 0.9917515 -0.9999437 0.9936592 0.9934704 -0.8462171 0.9984653 0.8470714 -0.8462154 0.9984653 0.8470677 -0.8462132 0.9984653 0.8470629 -0.8462106 0.9984653 0.847057 -0.8462073 0.9984652 0.8470496 -0.8462034 0.9984652 0.8470404 -0.8461986 0.9984651 0.847029 -0.8461929 0.998465 0.8470149 -0.8461864 0.9984649 0.8469977 -0.8461791 0.9984648 0.8469769 -0.8461714 0.9984647 0.8469521 -0.8461641 0.9984645 0.8469232 -0.8461589 0.9984643 0.8468906 -0.8461587 0.9984642 0.8468557 -0.8461687 0.998464 0.8468217 -0.8461977 0.9984638 0.846795 -0.8462598 0.9984638 0.8467864 -0.8463492 0.9984638 0.8467864 -0.8464623 0.9984638 0.8467864 -0.8466054 0.9984638 0.8467864 -0.8467864 0.9984638 0.8467864 -0.8470154 0.9984638 0.8467864 -0.8473052 0.9984638 0.8467864 -0.8476717 0.9984638 0.8467864 -0.8481355 0.9984638 0.8467864 -0.8487222 0.9984638 0.8467864 -0.8494644 0.9984638 0.8467864 -0.8504035 0.9984638 0.8467864 -0.8515915 0.9984638 0.8467864 -0.8530945 0.9984638 0.8467864 -0.8549959 0.9984638 0.8467864 -0.8574015 0.9984638 0.8467864 -0.8604449 0.9984638 0.8467864 -0.8642952 0.9984638 0.8467864 -0.8691663 0.9984638 0.8467864 -0.875329 0.9984638 0.8467864 -0.8831255 0.9984638 0.8467864 -0.892989 0.9984638 0.8467864 -0.9054678 0.9984638 0.8467864 -0.921255 0.9984638 0.8467864 -0.9412278 0.9984638 0.8467864 -0.9664961 0.9984638 0.8467864 -0.9984638 0.9984638 0.8467864 -0.9987895 0.9728171 0.8754109 -0.9990455 0.9614615 0.8992336 -0.999247 0.9584468 0.9188636 -0.9994057 0.9599976 0.9349075 -0.9995308 0.9637914 0.9479335 -0.9996295 0.968452 0.9584526 -0.9997074 0.9732039 0.9669103 -0.9997688 0.9776422 0.973687 -0.9998174 0.9815844 0.9791018 -0.9998557 0.9849754 0.9834186 -0.999886 0.9878296 0.9868541 -0.9999099 0.9901951 0.9895842 -0.9999288 0.9921339 0.9917515 -0.9999437 0.9937096 0.9934704 -0.8750477 0.9987905 0.8755966 -0.8750466 0.9987905 0.8755941 -0.8750451 0.9987904 0.875591 -0.8750434 0.9987904 0.8755872 -0.8750412 0.9987904 0.8755823 -0.8750386 0.9987904 0.8755763 -0.8750355 0.9987903 0.8755689 -0.8750317 0.9987903 0.8755597 -0.8750274 0.9987902 0.8755485 -0.8750225 0.9987902 0.875535 -0.8750173 0.9987901 0.8755188 -0.8750124 0.99879 0.8755 -0.8750088 0.9987899 0.8754788 -0.8750084 0.9987897 0.875456 -0.8750145 0.9987896 0.8754339 -0.8750329 0.9987895 0.8754165 -0.8750727 0.9987895 0.8754109 -0.8751301 0.9987895 0.8754109 -0.8752028 0.9987895 0.8754109 -0.8752947 0.9987895 0.8754109 -0.8754109 0.9987895 0.8754109 -0.875558 0.9987895 0.8754109 -0.8757441 0.9987895 0.8754109 -0.8759795 0.9987895 0.8754109 -0.8762773 0.9987895 0.8754109 -0.8766541 0.9987895 0.8754109 -0.8771307 0.9987895 0.8754109 -0.8777338 0.9987895 0.8754109 -0.8784967 0.9987895 0.8754109 -0.8794619 0.9987895 0.8754109 -0.880683 0.9987895 0.8754109 -0.8822279 0.9987895 0.8754109 -0.8841823 0.9987895 0.8754109 -0.886655 0.9987895 0.8754109 -0.8897832 0.9987895 0.8754109 -0.8937407 0.9987895 0.8754109 -0.8987476 0.9987895 0.8754109 -0.9050819 0.9987895 0.8754109 -0.9130957 0.9987895 0.8754109 -0.9232341 0.9987895 0.8754109 -0.9360606 0.9987895 0.8754109 -0.9522877 0.9987895 0.8754109 -0.9728171 0.9987895 0.8754109 -0.9987895 0.9987895 0.8754109 -0.9990455 0.9780539 0.8992336 -0.999247 0.9690013 0.9188636 -0.9994057 0.9666876 0.9349075 -0.9995308 0.9680197 0.9479335 -0.9996295 0.9711183 0.9584526 -0.9997074 0.974882 0.9669103 -0.9997688 0.9786968 0.973687 -0.9998174 0.9822464 0.9791018 -0.9998557 0.9853905 0.9834186 -0.999886 0.9880897 0.9868541 -0.9999099 0.990358 0.9895842 -0.9999288 0.9922358 0.9917515 -0.9999437 0.9937734 0.9934704 -0.8990028 0.9990461 0.8993535 -0.899002 0.9990461 0.899352 -0.8990011 0.9990461 0.89935 -0.899 0.9990461 0.8993475 -0.8989986 0.9990461 0.8993443 -0.8989969 0.9990461 0.8993405 -0.8989948 0.9990461 0.8993357 -0.8989923 0.999046 0.8993297 -0.8989895 0.999046 0.8993225 -0.8989863 0.9990459 0.8993137 -0.8989829 0.9990459 0.8993033 -0.8989796 0.9990458 0.8992911 -0.8989771 0.9990458 0.8992774 -0.8989767 0.9990457 0.8992627 -0.8989805 0.9990456 0.8992484 -0.8989921 0.9990456 0.8992372 -0.8990175 0.9990455 0.8992336 -0.8990542 0.9990455 0.8992336 -0.8991006 0.9990455 0.8992336 -0.8991593 0.9990455 0.8992336 -0.8992336 0.9990455 0.8992336 -0.8993275 0.9990455 0.8992336 -0.8994464 0.9990455 0.8992336 -0.8995968 0.9990455 0.8992336 -0.899787 0.9990455 0.8992336 -0.9000277 0.9990455 0.8992336 -0.9003323 0.9990455 0.8992336 -0.9007175 0.9990455 0.8992336 -0.9012049 0.9990455 0.8992336 -0.9018215 0.9990455 0.8992336 -0.9026016 0.9990455 0.8992336 -0.9035886 0.9990455 0.8992336 -0.9048372 0.9990455 0.8992336 -0.9064168 0.9990455 0.8992336 -0.9084153 0.9990455 0.8992336 -0.9109436 0.9990455 0.8992336 -0.9141422 0.9990455 0.8992336 -0.9181889 0.9990455 0.8992336 -0.9233085 0.9990455 0.8992336 -0.9297854 0.9990455 0.8992336 -0.9379796 0.9990455 0.8992336 -0.9483463 0.9990455 0.8992336 -0.9614615 0.9990455 0.8992336 -0.9780539 0.9990455 0.8992336 -0.9990455 0.9990455 0.8992336 -0.999247 0.982354 0.9188636 -0.9994057 0.9751513 0.9349075 -0.9995308 0.9733691 0.9479335 -0.9996295 0.9744915 0.9584526 -0.9997074 0.977005 0.9669103 -0.9997688 0.980031 0.973687 -0.9998174 0.9830838 0.9791018 -0.9998557 0.9859157 0.9834186 -0.999886 0.9884188 0.9868541 -0.9999099 0.9905641 0.9895842 -0.9999288 0.9923648 0.9917515 -0.9999437 0.9938541 0.9934704 -0.9187175 0.9992474 0.9189407 -0.918717 0.9992474 0.9189397 -0.9187164 0.9992474 0.9189384 -0.9187157 0.9992474 0.9189368 -0.9187148 0.9992474 0.9189348 -0.9187137 0.9992474 0.9189323 -0.9187123 0.9992473 0.9189292 -0.9187107 0.9992473 0.9189254 -0.9187089 0.9992473 0.9189207 -0.9187068 0.9992473 0.9189151 -0.9187045 0.9992472 0.9189084 -0.9187024 0.9992472 0.9189006 -0.9187008 0.9992472 0.9188918 -0.9187004 0.9992471 0.9188823 -0.9187027 0.9992471 0.9188732 -0.9187101 0.999247 0.9188659 -0.9187262 0.999247 0.9188636 -0.9187495 0.999247 0.9188636 -0.9187791 0.999247 0.9188636 -0.9188164 0.999247 0.9188636 -0.9188636 0.999247 0.9188636 -0.9189234 0.999247 0.9188636 -0.918999 0.999247 0.9188636 -0.9190947 0.999247 0.9188636 -0.9192157 0.999247 0.9188636 -0.9193688 0.999247 0.9188636 -0.9195625 0.999247 0.9188636 -0.9198076 0.999247 0.9188636 -0.9201176 0.999247 0.9188636 -0.9205098 0.999247 0.9188636 -0.9210061 0.999247 0.9188636 -0.9216339 0.999247 0.9188636 -0.9224281 0.999247 0.9188636 -0.9234329 0.999247 0.9188636 -0.9247041 0.999247 0.9188636 -0.9263124 0.999247 0.9188636 -0.928347 0.999247 0.9188636 -0.9309211 0.999247 0.9188636 -0.9341777 0.999247 0.9188636 -0.9382977 0.999247 0.9188636 -0.94351 0.999247 0.9188636 -0.9501042 0.999247 0.9188636 -0.9584468 0.999247 0.9188636 -0.9690013 0.999247 0.9188636 -0.982354 0.999247 0.9188636 -0.999247 0.999247 0.9188636 -0.9994057 0.9858591 0.9349075 -0.9995308 0.9801368 0.9479335 -0.9996295 0.978759 0.9584526 -0.9997074 0.9796909 0.9669103 -0.9997688 0.981719 0.973687 -0.9998174 0.9841433 0.9791018 -0.9998557 0.9865801 0.9834186 -0.999886 0.9888351 0.9868541 -0.9999099 0.9908248 0.9895842 -0.9999288 0.992528 0.9917515 -0.9999437 0.9939562 0.9934704 -0.9348153 0.999406 0.9349567 -0.9348149 0.999406 0.9349561 -0.9348146 0.999406 0.9349553 -0.9348141 0.999406 0.9349542 -0.9348135 0.999406 0.934953 -0.9348128 0.9994059 0.9349514 -0.9348119 0.9994059 0.9349494 -0.9348109 0.9994059 0.934947 -0.9348097 0.9994059 0.934944 -0.9348083 0.9994059 0.9349404 -0.9348069 0.9994059 0.9349361 -0.9348055 0.9994059 0.9349311 -0.9348044 0.9994058 0.9349255 -0.9348042 0.9994058 0.9349195 -0.9348056 0.9994058 0.9349136 -0.9348102 0.9994057 0.934909 -0.9348204 0.9994057 0.9349075 -0.9348352 0.9994057 0.9349075 -0.9348539 0.9994057 0.9349075 -0.9348776 0.9994057 0.9349075 -0.9349075 0.9994057 0.9349075 -0.9349454 0.9994057 0.9349075 -0.9349933 0.9994057 0.9349075 -0.935054 0.9994057 0.9349075 -0.9351307 0.9994057 0.9349075 -0.9352277 0.9994057 0.9349075 -0.9353505 0.9994057 0.9349075 -0.9355059 0.9994057 0.9349075 -0.9357024 0.9994057 0.9349075 -0.935951 0.9994057 0.9349075 -0.9362655 0.9994057 0.9349075 -0.9366635 0.9994057 0.9349075 -0.9371669 0.9994057 0.9349075 -0.9378038 0.9994057 0.9349075 -0.9386096 0.9994057 0.9349075 -0.939629 0.9994057 0.9349075 -0.9409186 0.9994057 0.9349075 -0.9425502 0.9994057 0.9349075 -0.9446144 0.9994057 0.9349075 -0.9472259 0.9994057 0.9349075 -0.9505298 0.9994057 0.9349075 -0.9547096 0.9994057 0.9349075 -0.9599976 0.9994057 0.9349075 -0.9666876 0.9994057 0.9349075 -0.9751513 0.9994057 0.9349075 -0.9858591 0.9994057 0.9349075 -0.9994057 0.9994057 0.9349075 -0.9995308 0.9886988 0.9479335 -0.9996295 0.9841579 0.9584526 -0.9997074 0.983089 0.9669103 -0.9997688 0.9838545 0.973687 -0.9998174 0.9854838 0.9791018 -0.9998557 0.9874207 0.9834186 -0.999886 0.9893618 0.9868541 -0.9999099 0.9911547 0.9895842 -0.9999288 0.9927345 0.9917515 -0.9999437 0.9940854 0.9934704 -0.9478754 0.999531 0.9479648 -0.9478752 0.999531 0.9479644 -0.947875 0.999531 0.9479639 -0.9478746 0.999531 0.9479633 -0.9478743 0.999531 0.9479624 -0.9478738 0.999531 0.9479614 -0.9478733 0.999531 0.9479602 -0.9478726 0.999531 0.9479586 -0.9478718 0.999531 0.9479567 -0.947871 0.9995309 0.9479544 -0.94787 0.9995309 0.9479517 -0.9478691 0.9995309 0.9479486 -0.9478684 0.9995309 0.947945 -0.9478683 0.9995309 0.9479411 -0.9478691 0.9995309 0.9479374 -0.947872 0.9995309 0.9479345 -0.9478785 0.9995308 0.9479335 -0.9478878 0.9995308 0.9479335 -0.9478997 0.9995308 0.9479335 -0.9479146 0.9995308 0.9479335 -0.9479335 0.9995308 0.9479335 -0.9479575 0.9995308 0.9479335 -0.9479878 0.9995308 0.9479335 -0.9480261 0.9995308 0.9479335 -0.9480746 0.9995308 0.9479335 -0.9481359 0.9995308 0.9479335 -0.9482135 0.9995308 0.9479335 -0.9483117 0.9995308 0.9479335 -0.9484359 0.9995308 0.9479335 -0.9485931 0.9995308 0.9479335 -0.9487918 0.9995308 0.9479335 -0.9490434 0.9995308 0.9479335 -0.9493615 0.9995308 0.9479335 -0.9497641 0.9995308 0.9479335 -0.9502734 0.9995308 0.9479335 -0.9509177 0.9995308 0.9479335 -0.9517328 0.9995308 0.9479335 -0.952764 0.9995308 0.9479335 -0.9540687 0.9995308 0.9479335 -0.9557192 0.9995308 0.9479335 -0.9578074 0.9995308 0.9479335 -0.9604492 0.9995308 0.9479335 -0.9637914 0.9995308 0.9479335 -0.9680197 0.9995308 0.9479335 -0.9733691 0.9995308 0.9479335 -0.9801368 0.9995308 0.9479335 -0.9886988 0.9995308 0.9479335 -0.9995308 0.9995308 0.9479335 -0.9996295 0.9909882 0.9584526 -0.9997074 0.9873879 0.9669103 -0.9997688 0.9865561 0.973687 -0.9998174 0.9871796 0.9791018 -0.9998557 0.9884841 0.9834186 -0.999886 0.9900282 0.9868541 -0.9999099 0.991572 0.9895842 -0.9999288 0.9929957 0.9917515 -0.9999437 0.9942488 0.9934704 -0.958416 0.9996296 0.9584724 -0.9584159 0.9996296 0.9584721 -0.9584157 0.9996296 0.9584718 -0.9584155 0.9996296 0.9584714 -0.9584153 0.9996296 0.9584709 -0.958415 0.9996296 0.9584702 -0.9584146 0.9996296 0.9584694 -0.9584142 0.9996296 0.9584685 -0.9584137 0.9996296 0.9584673 -0.9584132 0.9996296 0.9584658 -0.9584126 0.9996296 0.9584641 -0.958412 0.9996296 0.9584621 -0.9584115 0.9996296 0.9584598 -0.9584114 0.9996295 0.9584574 -0.958412 0.9996295 0.958455 -0.9584138 0.9996295 0.9584532 -0.9584178 0.9996295 0.9584526 -0.9584237 0.9996295 0.9584526 -0.9584312 0.9996295 0.9584526 -0.9584406 0.9996295 0.9584526 -0.9584526 0.9996295 0.9584526 -0.9584677 0.9996295 0.9584526 -0.9584868 0.9996295 0.9584526 -0.9585109 0.9996295 0.9584526 -0.9585415 0.9996295 0.9584526 -0.9585802 0.9996295 0.9584526 -0.9586291 0.9996295 0.9584526 -0.958691 0.9996295 0.9584526 -0.9587693 0.9996295 0.9584526 -0.9588684 0.9996295 0.9584526 -0.9589938 0.9996295 0.9584526 -0.9591524 0.9996295 0.9584526 -0.959353 0.9996295 0.9584526 -0.9596068 0.9996295 0.9584526 -0.959928 0.9996295 0.9584526 -0.9603343 0.9996295 0.9584526 -0.9608482 0.9996295 0.9584526 -0.9614985 0.9996295 0.9584526 -0.9623212 0.9996295 0.9584526 -0.963362 0.9996295 0.9584526 -0.9646787 0.9996295 0.9584526 -0.9663445 0.9996295 0.9584526 -0.968452 0.9996295 0.9584526 -0.9711183 0.9996295 0.9584526 -0.9744915 0.9996295 0.9584526 -0.978759 0.9996295 0.9584526 -0.9841579 0.9996295 0.9584526 -0.9909882 0.9996295 0.9584526 -0.9996295 0.9996295 0.9584526 -0.9997074 0.9928267 0.9669103 -0.9997688 0.9899741 0.973687 -0.9998174 0.989325 0.9791018 -0.9998557 0.9898295 0.9834186 -0.999886 0.9908712 0.9868541 -0.9999099 0.9920999 0.9895842 -0.9999288 0.9933261 0.9917515 -0.9999437 0.9944556 0.9934704 -0.9668873 0.9997074 0.9669228 -0.9668872 0.9997074 0.9669227 -0.9668871 0.9997074 0.9669225 -0.966887 0.9997074 0.9669222 -0.9668869 0.9997074 0.9669219 -0.9668867 0.9997074 0.9669215 -0.9668865 0.9997074 0.966921 -0.9668862 0.9997074 0.9669203 -0.9668859 0.9997074 0.9669196 -0.9668855 0.9997074 0.9669187 -0.9668852 0.9997074 0.9669176 -0.9668848 0.9997074 0.9669163 -0.9668845 0.9997074 0.9669149 -0.9668844 0.9997074 0.9669133 -0.9668847 0.9997074 0.9669118 -0.9668859 0.9997074 0.9669107 -0.9668884 0.9997074 0.9669103 -0.9668922 0.9997074 0.9669103 -0.9668969 0.9997074 0.9669103 -0.9669028 0.9997074 0.9669103 -0.9669103 0.9997074 0.9669103 -0.9669198 0.9997074 0.9669103 -0.9669318 0.9997074 0.9669103 -0.966947 0.9997074 0.9669103 -0.9669663 0.9997074 0.9669103 -0.9669906 0.9997074 0.9669103 -0.9670214 0.9997074 0.9669103 -0.9670604 0.9997074 0.9669103 -0.9671097 0.9997074 0.9669103 -0.967172 0.9997074 0.9669103 -0.9672509 0.9997074 0.9669103 -0.9673508 0.9997074 0.9669103 -0.967477 0.9997074 0.9669103 -0.9676368 0.9997074 0.9669103 -0.9678389 0.9997074 0.9669103 -0.9680946 0.9997074 0.9669103 -0.9684181 0.9997074 0.9669103 -0.9688274 0.9997074 0.9669103 -0.9693452 0.9997074 0.9669103 -0.9700002 0.9997074 0.9669103 -0.970829 0.9997074 0.9669103 -0.9718774 0.9997074 0.9669103 -0.9732039 0.9997074 0.9669103 -0.974882 0.9997074 0.9669103 -0.977005 0.9997074 0.9669103 -0.9796909 0.9997074 0.9669103 -0.983089 0.9997074 0.9669103 -0.9873879 0.9997074 0.9669103 -0.9928267 0.9997074 0.9669103 -0.9997074 0.9997074 0.9669103 -0.9997688 0.9942982 0.973687 -0.9998174 0.9920392 0.9791018 -0.9998557 0.9915316 0.9834186 -0.999886 0.9919377 0.9868541 -0.9999099 0.9927678 0.9895842 -0.9999288 0.9937442 0.9917515 -0.9999437 0.9947172 0.9934704 -0.9736726 0.9997689 0.9736949 -0.9736726 0.9997689 0.9736948 -0.9736725 0.9997689 0.9736947 -0.9736724 0.9997689 0.9736945 -0.9736723 0.9997689 0.9736943 -0.9736722 0.9997689 0.9736941 -0.9736721 0.9997689 0.9736938 -0.9736719 0.9997689 0.9736934 -0.9736717 0.9997689 0.9736929 -0.9736715 0.9997689 0.9736923 -0.9736712 0.9997689 0.9736916 -0.973671 0.9997689 0.9736908 -0.9736708 0.9997689 0.9736899 -0.9736708 0.9997689 0.973689 -0.973671 0.9997688 0.973688 -0.9736717 0.9997688 0.9736873 -0.9736733 0.9997688 0.973687 -0.9736756 0.9997688 0.973687 -0.9736786 0.9997688 0.973687 -0.9736823 0.9997688 0.973687 -0.973687 0.9997688 0.973687 -0.973693 0.9997688 0.973687 -0.9737006 0.9997688 0.973687 -0.9737101 0.9997688 0.973687 -0.9737222 0.9997688 0.973687 -0.9737375 0.9997688 0.973687 -0.9737569 0.9997688 0.973687 -0.9737814 0.9997688 0.973687 -0.9738123 0.9997688 0.973687 -0.9738515 0.9997688 0.973687 -0.9739011 0.9997688 0.973687 -0.9739638 0.9997688 0.973687 -0.9740432 0.9997688 0.973687 -0.9741436 0.9997688 0.973687 -0.9742706 0.9997688 0.973687 -0.9744313 0.9997688 0.973687 -0.9746346 0.9997688 0.973687 -0.9748918 0.9997688 0.973687 -0.9752172 0.9997688 0.973687 -0.9756289 0.9997688 0.973687 -0.9761497 0.9997688 0.973687 -0.9768086 0.9997688 0.973687 -0.9776422 0.9997688 0.973687 -0.9786968 0.9997688 0.973687 -0.980031 0.9997688 0.973687 -0.981719 0.9997688 0.973687 -0.9838545 0.9997688 0.973687 -0.9865561 0.9997688 0.973687 -0.9899741 0.9997688 0.973687 -0.9942982 0.9997688 0.973687 -0.9997688 0.9997688 0.973687 -0.9998174 0.9954731 0.9791018 -0.9998557 0.9936849 0.9834186 -0.999886 0.993287 0.9868541 -0.9999099 0.9936128 0.9895842 -0.9999288 0.9942731 0.9917515 -0.9999437 0.9950481 0.9934704 -0.9790927 0.9998174 0.9791067 -0.9790927 0.9998174 0.9791067 -0.9790927 0.9998174 0.9791066 -0.9790926 0.9998174 0.9791065 -0.9790925 0.9998174 0.9791064 -0.9790925 0.9998174 0.9791062 -0.9790924 0.9998174 0.979106 -0.9790923 0.9998174 0.9791057 -0.9790921 0.9998174 0.9791054 -0.979092 0.9998174 0.9791051 -0.9790919 0.9998174 0.9791046 -0.9790917 0.9998174 0.9791041 -0.9790916 0.9998174 0.9791036 -0.9790916 0.9998174 0.979103 -0.9790917 0.9998174 0.9791024 -0.9790921 0.9998174 0.9791019 -0.9790931 0.9998174 0.9791018 -0.9790946 0.9998174 0.9791018 -0.9790965 0.9998174 0.9791018 -0.9790988 0.9998174 0.9791018 -0.9791018 0.9998174 0.9791018 -0.9791055 0.9998174 0.9791018 -0.9791103 0.9998174 0.9791018 -0.9791163 0.9998174 0.9791018 -0.9791238 0.9998174 0.9791018 -0.9791334 0.9998174 0.9791018 -0.9791456 0.9998174 0.9791018 -0.979161 0.9998174 0.9791018 -0.9791804 0.9998174 0.9791018 -0.979205 0.9998174 0.9791018 -0.9792361 0.9998174 0.9791018 -0.9792755 0.9998174 0.9791018 -0.9793253 0.9998174 0.9791018 -0.9793883 0.9998174 0.9791018 -0.9794681 0.9998174 0.9791018 -0.9795689 0.9998174 0.9791018 -0.9796966 0.9998174 0.9791018 -0.979858 0.9998174 0.9791018 -0.9800622 0.9998174 0.9791018 -0.9803206 0.9998174 0.9791018 -0.9806476 0.9998174 0.9791018 -0.9810611 0.9998174 0.9791018 -0.9815844 0.9998174 0.9791018 -0.9822464 0.9998174 0.9791018 -0.9830838 0.9998174 0.9791018 -0.9841433 0.9998174 0.9791018 -0.9854838 0.9998174 0.9791018 -0.9871796 0.9998174 0.9791018 -0.989325 0.9998174 0.9791018 -0.9920392 0.9998174 0.9791018 -0.9954731 0.9998174 0.9791018 -0.9998174 0.9998174 0.9791018 -0.9998557 0.9964092 0.9834186 -0.999886 0.9949941 0.9868541 -0.9999099 0.9946818 0.9895842 -0.9999288 0.9949422 0.9917515 -0.9999437 0.9954668 0.9934704 -0.9834129 0.9998557 0.9834217 -0.9834129 0.9998557 0.9834217 -0.9834129 0.9998557 0.9834216 -0.9834129 0.9998557 0.9834216 -0.9834128 0.9998557 0.9834215 -0.9834128 0.9998557 0.9834214 -0.9834127 0.9998557 0.9834213 -0.9834127 0.9998557 0.9834211 -0.9834126 0.9998557 0.9834209 -0.9834125 0.9998557 0.9834207 -0.9834124 0.9998557 0.9834204 -0.9834123 0.9998557 0.9834201 -0.9834122 0.9998557 0.9834197 -0.9834122 0.9998557 0.9834194 -0.9834123 0.9998557 0.983419 -0.9834126 0.9998557 0.9834187 -0.9834132 0.9998557 0.9834186 -0.9834141 0.9998557 0.9834186 -0.9834153 0.9998557 0.9834186 -0.9834167 0.9998557 0.9834186 -0.9834186 0.9998557 0.9834186 -0.9834209 0.9998557 0.9834186 -0.9834239 0.9998557 0.9834186 -0.9834277 0.9998557 0.9834186 -0.9834324 0.9998557 0.9834186 -0.9834385 0.9998557 0.9834186 -0.9834461 0.9998557 0.9834186 -0.9834557 0.9998557 0.9834186 -0.9834679 0.9998557 0.9834186 -0.9834833 0.9998557 0.9834186 -0.9835029 0.9998557 0.9834186 -0.9835276 0.9998557 0.9834186 -0.9835588 0.9998557 0.9834186 -0.9835983 0.9998557 0.9834186 -0.9836483 0.9998557 0.9834186 -0.9837116 0.9998557 0.9834186 -0.9837916 0.9998557 0.9834186 -0.9838928 0.9998557 0.9834186 -0.9840209 0.9998557 0.9834186 -0.9841829 0.9998557 0.9834186 -0.984388 0.9998557 0.9834186 -0.9846473 0.9998557 0.9834186 -0.9849754 0.9998557 0.9834186 -0.9853905 0.9998557 0.9834186 -0.9859157 0.9998557 0.9834186 -0.9865801 0.9998557 0.9834186 -0.9874207 0.9998557 0.9834186 -0.9884841 0.9998557 0.9834186 -0.9898295 0.9998557 0.9834186 -0.9915316 0.9998557 0.9834186 -0.9936849 0.9998557 0.9834186 -0.9964092 0.9998557 0.9834186 -0.9998557 0.9998557 0.9834186 -0.999886 0.9971537 0.9868541 -0.9999099 0.9960342 0.9895842 -0.9999288 0.9957887 0.9917515 -0.9999437 0.9959964 0.9934704 -0.9868505 0.999886 0.986856 -0.9868505 0.999886 0.986856 -0.9868505 0.999886 0.986856 -0.9868505 0.999886 0.9868559 -0.9868504 0.999886 0.9868559 -0.9868504 0.999886 0.9868558 -0.9868504 0.999886 0.9868557 -0.9868503 0.999886 0.9868556 -0.9868503 0.999886 0.9868555 -0.9868502 0.999886 0.9868554 -0.9868502 0.999886 0.9868552 -0.9868501 0.999886 0.986855 -0.9868501 0.999886 0.9868548 -0.98685 0.999886 0.9868545 -0.9868501 0.999886 0.9868543 -0.9868503 0.999886 0.9868541 -0.9868507 0.999886 0.9868541 -0.9868512 0.999886 0.9868541 -0.986852 0.999886 0.9868541 -0.9868529 0.999886 0.9868541 -0.9868541 0.999886 0.9868541 -0.9868555 0.999886 0.9868541 -0.9868574 0.999886 0.9868541 -0.9868597 0.999886 0.9868541 -0.9868627 0.999886 0.9868541 -0.9868665 0.999886 0.9868541 -0.9868713 0.999886 0.9868541 -0.9868773 0.999886 0.9868541 -0.986885 0.999886 0.9868541 -0.9868946 0.999886 0.9868541 -0.9869069 0.999886 0.9868541 -0.9869223 0.999886 0.9868541 -0.9869419 0.999886 0.9868541 -0.9869667 0.999886 0.9868541 -0.986998 0.999886 0.9868541 -0.9870376 0.999886 0.9868541 -0.9870878 0.999886 0.9868541 -0.9871512 0.999886 0.9868541 -0.9872315 0.999886 0.9868541 -0.987333 0.999886 0.9868541 -0.9874615 0.999886 0.9868541 -0.987624 0.999886 0.9868541 -0.9878296 0.999886 0.9868541 -0.9880897 0.999886 0.9868541 -0.9884188 0.999886 0.9868541 -0.9888351 0.999886 0.9868541 -0.9893618 0.999886 0.9868541 -0.9900282 0.999886 0.9868541 -0.9908712 0.999886 0.9868541 -0.9919377 0.999886 0.9868541 -0.993287 0.999886 0.9868541 -0.9949941 0.999886 0.9868541 -0.9971537 0.999886 0.9868541 -0.999886 0.999886 0.9868541 -0.9999099 0.9977452 0.9895842 -0.9999288 0.9968597 0.9917515 -0.9999437 0.9966665 0.9934704 -0.989582 0.9999099 0.9895855 -0.989582 0.9999099 0.9895854 -0.989582 0.9999099 0.9895854 -0.989582 0.9999099 0.9895854 -0.989582 0.9999099 0.9895854 -0.9895819 0.9999099 0.9895853 -0.9895819 0.9999099 0.9895853 -0.9895819 0.9999099 0.9895852 -0.9895819 0.9999099 0.9895851 -0.9895818 0.9999099 0.989585 -0.9895818 0.9999099 0.9895849 -0.9895818 0.9999099 0.9895848 -0.9895817 0.9999099 0.9895847 -0.9895817 0.9999099 0.9895845 -0.9895817 0.9999099 0.9895844 -0.9895819 0.9999099 0.9895843 -0.9895821 0.9999099 0.9895842 -0.9895825 0.9999099 0.9895842 -0.9895829 0.9999099 0.9895842 -0.9895835 0.9999099 0.9895842 -0.9895842 0.9999099 0.9895842 -0.9895851 0.9999099 0.9895842 -0.9895863 0.9999099 0.9895842 -0.9895878 0.9999099 0.9895842 -0.9895897 0.9999099 0.9895842 -0.989592 0.9999099 0.9895842 -0.989595 0.9999099 0.9895842 -0.9895988 0.9999099 0.9895842 -0.9896036 0.9999099 0.9895842 -0.9896096 0.9999099 0.9895842 -0.9896173 0.9999099 0.9895842 -0.989627 0.9999099 0.9895842 -0.9896392 0.9999099 0.9895842 -0.9896547 0.9999099 0.9895842 -0.9896744 0.9999099 0.9895842 -0.9896992 0.9999099 0.9895842 -0.9897306 0.9999099 0.9895842 -0.9897703 0.9999099 0.9895842 -0.9898206 0.9999099 0.9895842 -0.9898842 0.9999099 0.9895842 -0.9899646 0.9999099 0.9895842 -0.9900664 0.9999099 0.9895842 -0.9901951 0.9999099 0.9895842 -0.990358 0.9999099 0.9895842 -0.9905641 0.9999099 0.9895842 -0.9908248 0.9999099 0.9895842 -0.9911547 0.9999099 0.9895842 -0.991572 0.9999099 0.9895842 -0.9920999 0.9999099 0.9895842 -0.9927678 0.9999099 0.9895842 -0.9936128 0.9999099 0.9895842 -0.9946818 0.9999099 0.9895842 -0.9960342 0.9999099 0.9895842 -0.9977452 0.9999099 0.9895842 -0.9999099 0.9999099 0.9895842 -0.9999288 0.9982146 0.9917515 -0.9999437 0.9975143 0.9934704 -0.9917501 0.9999288 0.9917523 -0.9917501 0.9999288 0.9917522 -0.9917501 0.9999288 0.9917522 -0.9917501 0.9999288 0.9917522 -0.9917501 0.9999288 0.9917522 -0.9917501 0.9999288 0.9917522 -0.99175 0.9999288 0.9917521 -0.99175 0.9999288 0.9917521 -0.99175 0.9999288 0.9917521 -0.99175 0.9999288 0.991752 -0.99175 0.9999288 0.9917519 -0.9917499 0.9999288 0.9917519 -0.9917499 0.9999288 0.9917518 -0.9917499 0.9999288 0.9917517 -0.9917499 0.9999288 0.9917516 -0.99175 0.9999288 0.9917515 -0.9917502 0.9999288 0.9917515 -0.9917504 0.9999288 0.9917515 -0.9917507 0.9999288 0.9917515 -0.991751 0.9999288 0.9917515 -0.9917515 0.9999288 0.9917515 -0.9917521 0.9999288 0.9917515 -0.9917528 0.9999288 0.9917515 -0.9917537 0.9999288 0.9917515 -0.9917549 0.9999288 0.9917515 -0.9917564 0.9999288 0.9917515 -0.9917582 0.9999288 0.9917515 -0.9917606 0.9999288 0.9917515 -0.9917636 0.9999288 0.9917515 -0.9917674 0.9999288 0.9917515 -0.9917722 0.9999288 0.9917515 -0.9917782 0.9999288 0.9917515 -0.9917859 0.9999288 0.9917515 -0.9917956 0.9999288 0.9917515 -0.9918079 0.9999288 0.9917515 -0.9918234 0.9999288 0.9917515 -0.9918431 0.9999288 0.9917515 -0.991868 0.9999288 0.9917515 -0.9918994 0.9999288 0.9917515 -0.9919392 0.9999288 0.9917515 -0.9919896 0.9999288 0.9917515 -0.9920533 0.9999288 0.9917515 -0.9921339 0.9999288 0.9917515 -0.9922358 0.9999288 0.9917515 -0.9923648 0.9999288 0.9917515 -0.992528 0.9999288 0.9917515 -0.9927345 0.9999288 0.9917515 -0.9929957 0.9999288 0.9917515 -0.9933261 0.9999288 0.9917515 -0.9937442 0.9999288 0.9917515 -0.9942731 0.9999288 0.9917515 -0.9949422 0.9999288 0.9917515 -0.9957887 0.9999288 0.9917515 -0.9968597 0.9999288 0.9917515 -0.9982146 0.9999288 0.9917515 -0.9999288 0.9999288 0.9917515 -0.9999437 0.9985868 0.9934704 -0.9934695 0.9999437 0.9934708 -0.9934695 0.9999437 0.9934708 -0.9934695 0.9999437 0.9934708 -0.9934695 0.9999437 0.9934708 -0.9934695 0.9999437 0.9934708 -0.9934695 0.9999437 0.9934708 -0.9934695 0.9999437 0.9934708 -0.9934694 0.9999437 0.9934707 -0.9934694 0.9999437 0.9934707 -0.9934694 0.9999437 0.9934707 -0.9934694 0.9999437 0.9934706 -0.9934694 0.9999437 0.9934706 -0.9934694 0.9999437 0.9934705 -0.9934694 0.9999437 0.9934705 -0.9934694 0.9999437 0.9934704 -0.9934694 0.9999437 0.9934704 -0.9934695 0.9999437 0.9934704 -0.9934697 0.9999437 0.9934704 -0.9934698 0.9999437 0.9934704 -0.9934701 0.9999437 0.9934704 -0.9934704 0.9999437 0.9934704 -0.9934707 0.9999437 0.9934704 -0.9934712 0.9999437 0.9934704 -0.9934718 0.9999437 0.9934704 -0.9934725 0.9999437 0.9934704 -0.9934734 0.9999437 0.9934704 -0.9934746 0.9999437 0.9934704 -0.9934761 0.9999437 0.9934704 -0.9934779 0.9999437 0.9934704 -0.9934803 0.9999437 0.9934704 -0.9934833 0.9999437 0.9934704 -0.9934871 0.9999437 0.9934704 -0.9934919 0.9999437 0.9934704 -0.993498 0.9999437 0.9934704 -0.9935057 0.9999437 0.9934704 -0.9935154 0.9999437 0.9934704 -0.9935277 0.9999437 0.9934704 -0.9935432 0.9999437 0.9934704 -0.9935629 0.9999437 0.9934704 -0.9935878 0.9999437 0.9934704 -0.9936193 0.9999437 0.9934704 -0.9936592 0.9999437 0.9934704 -0.9937096 0.9999437 0.9934704 -0.9937734 0.9999437 0.9934704 -0.9938541 0.9999437 0.9934704 -0.9939562 0.9999437 0.9934704 -0.9940854 0.9999437 0.9934704 -0.9942488 0.9999437 0.9934704 -0.9944556 0.9999437 0.9934704 -0.9947172 0.9999437 0.9934704 -0.9950481 0.9999437 0.9934704 -0.9954668 0.9999437 0.9934704 -0.9959964 0.9999437 0.9934704 -0.9966665 0.9999437 0.9934704 -0.9975143 0.9999437 0.9934704 -0.9985868 0.9999437 0.9934704 -0.9999437 0.9999437 0.9934704 -0.0000238 0.0000238 0.2706977 -0.0005417 0.0000238 0.2706977 -0.0011968 0.0000238 0.2706977 -0.0020256 0.0000238 0.2706977 -0.0030742 0.0000238 0.2706977 -0.0044007 0.0000238 0.2706977 -0.006079 0.0000238 0.2706977 -0.0082023 0.0000238 0.2706977 -0.0108885 0.0000238 0.2706977 -0.0142868 0.0000238 0.2706977 -0.0185862 0.0000238 0.2706977 -0.0240255 0.0000238 0.2706977 -0.0309069 0.0000238 0.2706977 -0.0396127 0.0000238 0.2706977 -0.0506267 0.0000238 0.2706977 -0.0645609 0.0000238 0.2706977 -0.0821895 0.0000238 0.2706977 -0.1044919 0.0000238 0.2706977 -0.1327073 0.0000238 0.2706977 -0.1684036 0.0000238 0.2706977 -0.2135639 0.0000238 0.2706977 -0.2706977 0.0000238 0.2706977 -0.3429792 0.0000238 0.2706977 -0.4344249 0.0000238 0.2706977 -0.5501155 0.0000238 0.2706977 -0.6964791 0.0000238 0.2706977 -0.8407292 0.0051514 0.2616881 -0.9033413 0.0279321 0.2402747 -0.9354466 0.0624569 0.2297741 -0.9545467 0.1059991 0.2345119 -0.9669269 0.1572498 0.2541551 -0.9754027 0.2151269 0.2870375 -0.9814251 0.2783684 0.3309236 -0.9858181 0.3454107 0.3832459 -0.9890841 0.4144197 0.4412534 -0.9915469 0.4834235 0.5021764 -0.993424 0.5504963 0.5634166 -0.9948662 0.6139459 0.6227284 -0.9959813 0.6724572 0.678353 -0.9968475 0.7251659 0.7290793 -0.997523 0.7716588 0.7742304 -0.9980513 0.8119154 0.8135904 -0.9984653 0.8462171 0.8473 -0.9987905 0.8750477 0.8757434 -0.9990461 0.8990028 0.8994474 -0.9992474 0.9187175 0.9190004 -0.999406 0.9348153 0.9349946 -0.999531 0.9478754 0.9479888 -0.9996296 0.958416 0.9584875 -0.9997074 0.9668873 0.9669323 -0.9997689 0.9736726 0.9737009 -0.9998174 0.9790927 0.9791105 -0.9998557 0.9834129 0.9834241 -0.999886 0.9868505 0.9868575 -0.9999099 0.989582 0.9895864 -0.9999288 0.9917501 0.9917528 -0.9999437 0.9934695 0.9934712 -0.0000238 0.0005417 0.2706977 -0.0000382 0.0000382 0.2701941 -0.0006933 0.0000382 0.2701941 -0.0015221 0.0000382 0.2701941 -0.0025707 0.0000382 0.2701941 -0.0038972 0.0000382 0.2701941 -0.0055755 0.0000382 0.2701941 -0.0076988 0.0000382 0.2701941 -0.0103849 0.0000382 0.2701941 -0.0137833 0.0000382 0.2701941 -0.0180827 0.0000382 0.2701941 -0.023522 0.0000382 0.2701941 -0.0304033 0.0000382 0.2701941 -0.0391092 0.0000382 0.2701941 -0.0501232 0.0000382 0.2701941 -0.0640574 0.0000382 0.2701941 -0.081686 0.0000382 0.2701941 -0.1039884 0.0000382 0.2701941 -0.1322038 0.0000382 0.2701941 -0.1679 0.0000382 0.2701941 -0.2130604 0.0000382 0.2701941 -0.2701941 0.0000382 0.2701941 -0.3424757 0.0000382 0.2701941 -0.4339214 0.0000382 0.2701941 -0.549612 0.0000382 0.2701941 -0.6959756 0.0000382 0.2701941 -0.8405071 0.0051286 0.2612639 -0.9032596 0.0278872 0.239913 -0.9354101 0.0624063 0.2294673 -0.9545286 0.1059489 0.234258 -0.9669173 0.1572031 0.2539496 -0.9753975 0.2150852 0.2868747 -0.9814221 0.2783325 0.3307971 -0.9858163 0.3453807 0.3831496 -0.9890831 0.4143955 0.4411814 -0.9915463 0.4834045 0.5021236 -0.9934236 0.5504818 0.5633786 -0.994866 0.6139352 0.6227016 -0.9959811 0.6724495 0.6783343 -0.9968474 0.7251605 0.7290666 -0.997523 0.7716551 0.7742218 -0.9980512 0.8119128 0.8135847 -0.9984653 0.8462154 0.8472963 -0.9987905 0.8750466 0.875741 -0.9990461 0.899002 0.8994458 -0.9992474 0.918717 0.9189994 -0.999406 0.9348149 0.9349939 -0.999531 0.9478752 0.9479884 -0.9996296 0.9584159 0.9584872 -0.9997074 0.9668872 0.9669322 -0.9997689 0.9736726 0.9737008 -0.9998174 0.9790927 0.9791104 -0.9998557 0.9834129 0.983424 -0.999886 0.9868505 0.9868575 -0.9999099 0.989582 0.9895864 -0.9999288 0.9917501 0.9917528 -0.9999437 0.9934695 0.9934712 -0.0000238 0.0011968 0.2706977 -0.0000382 0.0006933 0.2701941 -0.0000611 0.0000611 0.2695619 -0.0008899 0.0000611 0.2695619 -0.0019385 0.0000611 0.2695619 -0.003265 0.0000611 0.2695619 -0.0049433 0.0000611 0.2695619 -0.0070666 0.0000611 0.2695619 -0.0097527 0.0000611 0.2695619 -0.0131511 0.0000611 0.2695619 -0.0174505 0.0000611 0.2695619 -0.0228898 0.0000611 0.2695619 -0.0297711 0.0000611 0.2695619 -0.038477 0.0000611 0.2695619 -0.049491 0.0000611 0.2695619 -0.0634252 0.0000611 0.2695619 -0.0810538 0.0000611 0.2695619 -0.1033562 0.0000611 0.2695619 -0.1315716 0.0000611 0.2695619 -0.1672678 0.0000611 0.2695619 -0.2124282 0.0000611 0.2695619 -0.2695619 0.0000611 0.2695619 -0.3418435 0.0000611 0.2695619 -0.4332891 0.0000611 0.2695619 -0.5489798 0.0000611 0.2695619 -0.6953434 0.0000611 0.2695619 -0.8402274 0.0051047 0.2607307 -0.9031567 0.0278347 0.2394584 -0.9353643 0.0623458 0.2290819 -0.9545059 0.1058883 0.2339389 -0.9669053 0.1571463 0.2536915 -0.9753908 0.2150342 0.2866702 -0.9814183 0.2782884 0.3306382 -0.9858141 0.3453439 0.3830285 -0.9890818 0.4143657 0.4410909 -0.9915455 0.4833811 0.5020572 -0.9934231 0.550464 0.5633309 -0.9948657 0.6139219 0.6226678 -0.9959809 0.6724399 0.6783109 -0.9968473 0.7251537 0.7290505 -0.9975229 0.7716504 0.774211 -0.9980512 0.8119096 0.8135776 -0.9984653 0.8462132 0.8472916 -0.9987904 0.8750451 0.8757379 -0.9990461 0.8990011 0.8994438 -0.9992474 0.9187164 0.9189981 -0.999406 0.9348146 0.9349931 -0.999531 0.947875 0.9479878 -0.9996296 0.9584157 0.9584869 -0.9997074 0.9668871 0.966932 -0.9997689 0.9736725 0.9737007 -0.9998174 0.9790927 0.9791103 -0.9998557 0.9834129 0.983424 -0.999886 0.9868505 0.9868574 -0.9999099 0.989582 0.9895863 -0.9999288 0.9917501 0.9917528 -0.9999437 0.9934695 0.9934712 -0.0000238 0.0020256 0.2706977 -0.0000382 0.0015221 0.2701941 -0.0000611 0.0008899 0.2695619 -0.0000978 0.0000978 0.2687698 -0.0011463 0.0000978 0.2687698 -0.0024729 0.0000978 0.2687698 -0.0041512 0.0000978 0.2687698 -0.0062744 0.0000978 0.2687698 -0.0089606 0.0000978 0.2687698 -0.012359 0.0000978 0.2687698 -0.0166583 0.0000978 0.2687698 -0.0220976 0.0000978 0.2687698 -0.028979 0.0000978 0.2687698 -0.0376849 0.0000978 0.2687698 -0.0486989 0.0000978 0.2687698 -0.0626331 0.0000978 0.2687698 -0.0802616 0.0000978 0.2687698 -0.102564 0.0000978 0.2687698 -0.1307795 0.0000978 0.2687698 -0.1664757 0.0000978 0.2687698 -0.2116361 0.0000978 0.2687698 -0.2687698 0.0000978 0.2687698 -0.3410514 0.0000978 0.2687698 -0.432497 0.0000978 0.2687698 -0.5481876 0.0000978 0.2687698 -0.6945513 0.0000978 0.2687698 -0.8398756 0.0050826 0.2600619 -0.9030276 0.0277752 0.2388883 -0.9353068 0.0622749 0.2285984 -0.9544774 0.1058162 0.2335388 -0.9668902 0.1570779 0.2533679 -0.9753825 0.2149725 0.2864139 -0.9814136 0.2782347 0.3304391 -0.9858113 0.3452987 0.3828768 -0.9890801 0.414329 0.4409775 -0.9915446 0.4833522 0.5019741 -0.9934225 0.5504419 0.563271 -0.9948653 0.6139056 0.6226256 -0.9959807 0.672428 0.6782815 -0.9968472 0.7251454 0.7290305 -0.9975228 0.7716446 0.7741975 -0.9980511 0.8119057 0.8135686 -0.9984653 0.8462106 0.8472856 -0.9987904 0.8750434 0.875734 -0.9990461 0.899 0.8994413 -0.9992474 0.9187157 0.9189965 -0.999406 0.9348141 0.9349921 -0.999531 0.9478746 0.9479872 -0.9996296 0.9584155 0.9584865 -0.9997074 0.966887 0.9669317 -0.9997689 0.9736724 0.9737005 -0.9998174 0.9790926 0.9791102 -0.9998557 0.9834129 0.9834239 -0.999886 0.9868505 0.9868574 -0.9999099 0.989582 0.9895863 -0.9999288 0.9917501 0.9917528 -0.9999437 0.9934695 0.9934712 -0.0000238 0.0030742 0.2706977 -0.0000382 0.0025707 0.2701941 -0.0000611 0.0019385 0.2695619 -0.0000978 0.0011463 0.2687698 -0.0001565 0.0001565 0.2677799 -0.001483 0.0001565 0.2677799 -0.0031613 0.0001565 0.2677799 -0.0052846 0.0001565 0.2677799 -0.0079707 0.0001565 0.2677799 -0.0113691 0.0001565 0.2677799 -0.0156685 0.0001565 0.2677799 -0.0211078 0.0001565 0.2677799 -0.0279891 0.0001565 0.2677799 -0.036695 0.0001565 0.2677799 -0.047709 0.0001565 0.2677799 -0.0616432 0.0001565 0.2677799 -0.0792718 0.0001565 0.2677799 -0.1015742 0.0001565 0.2677799 -0.1297896 0.0001565 0.2677799 -0.1654858 0.0001565 0.2677799 -0.2106462 0.0001565 0.2677799 -0.2677799 0.0001565 0.2677799 -0.3400615 0.0001565 0.2677799 -0.4315072 0.0001565 0.2677799 -0.5471978 0.0001565 0.2677799 -0.6935614 0.0001565 0.2677799 -0.8394338 0.0050676 0.2592249 -0.9028657 0.0277111 0.2381749 -0.9352348 0.0621943 0.2279936 -0.9544418 0.1057322 0.2330383 -0.9668714 0.1569971 0.2529632 -0.9753721 0.2148987 0.2860933 -0.9814076 0.2781701 0.3301901 -0.9858079 0.3452442 0.3826871 -0.9890781 0.4142845 0.4408357 -0.9915433 0.4833171 0.5018701 -0.9934218 0.550415 0.5631962 -0.9948649 0.6138855 0.6225727 -0.9959804 0.6724135 0.6782449 -0.996847 0.7251351 0.7290054 -0.9975227 0.7716375 0.7741806 -0.9980511 0.8119009 0.8135573 -0.9984652 0.8462073 0.8472782 -0.9987904 0.8750412 0.8757292 -0.9990461 0.8989986 0.8994382 -0.9992474 0.9187148 0.9189945 -0.999406 0.9348135 0.9349908 -0.999531 0.9478743 0.9479864 -0.9996296 0.9584153 0.958486 -0.9997074 0.9668869 0.9669314 -0.9997689 0.9736723 0.9737003 -0.9998174 0.9790925 0.9791101 -0.9998557 0.9834128 0.9834238 -0.999886 0.9868504 0.9868573 -0.9999099 0.989582 0.9895863 -0.9999288 0.9917501 0.9917528 -0.9999437 0.9934695 0.9934712 -0.0000238 0.0044007 0.2706977 -0.0000382 0.0038972 0.2701941 -0.0000611 0.003265 0.2695619 -0.0000978 0.0024729 0.2687698 -0.0001565 0.001483 0.2677799 -0.0002504 0.0002504 0.2665473 -0.0019287 0.0002504 0.2665473 -0.004052 0.0002504 0.2665473 -0.0067381 0.0002504 0.2665473 -0.0101365 0.0002504 0.2665473 -0.0144359 0.0002504 0.2665473 -0.0198752 0.0002504 0.2665473 -0.0267565 0.0002504 0.2665473 -0.0354624 0.0002504 0.2665473 -0.0464764 0.0002504 0.2665473 -0.0604106 0.0002504 0.2665473 -0.0780392 0.0002504 0.2665473 -0.1003416 0.0002504 0.2665473 -0.128557 0.0002504 0.2665473 -0.1642532 0.0002504 0.2665473 -0.2094136 0.0002504 0.2665473 -0.2665473 0.0002504 0.2665473 -0.3388289 0.0002504 0.2665473 -0.4302746 0.0002504 0.2665473 -0.5459652 0.0002504 0.2665473 -0.6923288 0.0002504 0.2665473 -0.8388802 0.0050694 0.2581807 -0.9026634 0.0276479 0.2372851 -0.9351449 0.0621069 0.2272394 -0.9543974 0.1056375 0.2324144 -0.9668479 0.156904 0.2524587 -0.9753591 0.2148124 0.2856938 -0.9814002 0.2780936 0.3298799 -0.9858036 0.3451791 0.3824508 -0.9890755 0.4142311 0.4406591 -0.9915418 0.4832747 0.5017407 -0.9934209 0.5503825 0.5631031 -0.9948643 0.6138613 0.6225069 -0.9959801 0.6723959 0.6781992 -0.9968468 0.7251226 0.7289742 -0.9975226 0.7716288 0.7741595 -0.998051 0.8118949 0.8135433 -0.9984652 0.8462034 0.847269 -0.9987904 0.8750386 0.8757232 -0.9990461 0.8989969 0.8994343 -0.9992474 0.9187137 0.918992 -0.9994059 0.9348128 0.9349892 -0.999531 0.9478738 0.9479854 -0.9996296 0.958415 0.9584853 -0.9997074 0.9668867 0.966931 -0.9997689 0.9736722 0.9737 -0.9998174 0.9790925 0.9791099 -0.9998557 0.9834128 0.9834237 -0.999886 0.9868504 0.9868573 -0.9999099 0.9895819 0.9895862 -0.9999288 0.9917501 0.9917527 -0.9999437 0.9934695 0.9934711 -0.0000238 0.006079 0.2706977 -0.0000382 0.0055755 0.2701941 -0.0000611 0.0049433 0.2695619 -0.0000978 0.0041512 0.2687698 -0.0001565 0.0031613 0.2677799 -0.0002504 0.0019287 0.2665473 -0.0004008 0.0004008 0.2650195 -0.0025241 0.0004008 0.2650195 -0.0052103 0.0004008 0.2650195 -0.0086086 0.0004008 0.2650195 -0.012908 0.0004008 0.2650195 -0.0183473 0.0004008 0.2650195 -0.0252287 0.0004008 0.2650195 -0.0339345 0.0004008 0.2650195 -0.0449485 0.0004008 0.2650195 -0.0588827 0.0004008 0.2650195 -0.0765113 0.0004008 0.2650195 -0.0988137 0.0004008 0.2650195 -0.1270291 0.0004008 0.2650195 -0.1627254 0.0004008 0.2650195 -0.2078857 0.0004008 0.2650195 -0.2650195 0.0004008 0.2650195 -0.337301 0.0004008 0.2650195 -0.4287467 0.0004008 0.2650195 -0.5444373 0.0004008 0.2650195 -0.6908009 0.0004008 0.2650195 -0.8381886 0.0051048 0.2568833 -0.9024114 0.0275966 0.2361798 -0.9350332 0.0620199 0.2263028 -0.9543421 0.1055364 0.2316398 -0.9668187 0.1568008 0.2518326 -0.975343 0.2147144 0.2851981 -0.9813911 0.2780055 0.3294951 -0.9857982 0.3451032 0.3821577 -0.9890723 0.4141683 0.4404401 -0.9915399 0.4832246 0.5015801 -0.9934197 0.5503438 0.5629876 -0.9948636 0.6138323 0.6224253 -0.9959797 0.6723748 0.6781425 -0.9968465 0.7251076 0.7289355 -0.9975224 0.7716184 0.7741335 -0.9980509 0.8118878 0.813526 -0.9984651 0.8461986 0.8472576 -0.9987903 0.8750355 0.8757158 -0.9990461 0.8989948 0.8994295 -0.9992473 0.9187123 0.9189889 -0.9994059 0.9348119 0.9349873 -0.999531 0.9478733 0.9479841 -0.9996296 0.9584146 0.9584845 -0.9997074 0.9668865 0.9669305 -0.9997689 0.9736721 0.9736997 -0.9998174 0.9790924 0.9791097 -0.9998557 0.9834127 0.9834236 -0.999886 0.9868504 0.9868572 -0.9999099 0.9895819 0.9895862 -0.9999288 0.99175 0.9917527 -0.9999437 0.9934695 0.9934711 -0.0000238 0.0082023 0.2706977 -0.0000382 0.0076988 0.2701941 -0.0000611 0.0070666 0.2695619 -0.0000978 0.0062744 0.2687698 -0.0001565 0.0052846 0.2677799 -0.0002504 0.004052 0.2665473 -0.0004008 0.0025241 0.2650195 -0.0006416 0.0006416 0.2631369 -0.0033277 0.0006416 0.2631369 -0.0067261 0.0006416 0.2631369 -0.0110255 0.0006416 0.2631369 -0.0164648 0.0006416 0.2631369 -0.0233461 0.0006416 0.2631369 -0.032052 0.0006416 0.2631369 -0.043066 0.0006416 0.2631369 -0.0570002 0.0006416 0.2631369 -0.0746288 0.0006416 0.2631369 -0.0969312 0.0006416 0.2631369 -0.1251466 0.0006416 0.2631369 -0.1608428 0.0006416 0.2631369 -0.2060032 0.0006416 0.2631369 -0.2631369 0.0006416 0.2631369 -0.3354185 0.0006416 0.2631369 -0.4268641 0.0006416 0.2631369 -0.5425548 0.0006416 0.2631369 -0.6889184 0.0006416 0.2631369 -0.8373283 0.0052028 0.2552802 -0.9020992 0.0275778 0.2348144 -0.9348949 0.0619473 0.2251463 -0.9542739 0.1054384 0.2306836 -0.9667827 0.1566936 0.25106 -0.9753231 0.2146085 0.2845866 -0.9813797 0.2779077 0.3290204 -0.9857916 0.3450175 0.3817962 -0.9890684 0.4140964 0.4401701 -0.9915376 0.4831666 0.5013822 -0.9934183 0.5502987 0.5628452 -0.9948628 0.6137984 0.6223247 -0.9959791 0.67235 0.6780727 -0.9968462 0.7250899 0.7288878 -0.9975222 0.7716061 0.7741013 -0.9980508 0.8118794 0.8135046 -0.998465 0.8461929 0.8472436 -0.9987903 0.8750317 0.8757066 -0.999046 0.8989923 0.8994236 -0.9992473 0.9187107 0.9189851 -0.9994059 0.9348109 0.9349848 -0.999531 0.9478726 0.9479826 -0.9996296 0.9584142 0.9584835 -0.9997074 0.9668862 0.9669298 -0.9997689 0.9736719 0.9736993 -0.9998174 0.9790923 0.9791095 -0.9998557 0.9834127 0.9834234 -0.999886 0.9868503 0.9868571 -0.9999099 0.9895819 0.9895861 -0.9999288 0.99175 0.9917527 -0.9999437 0.9934694 0.9934711 -0.0000238 0.0108885 0.2706977 -0.0000382 0.0103849 0.2701941 -0.0000611 0.0097527 0.2695619 -0.0000978 0.0089606 0.2687698 -0.0001565 0.0079707 0.2677799 -0.0002504 0.0067381 0.2665473 -0.0004008 0.0052103 0.2650195 -0.0006416 0.0033277 0.2631369 -0.0010268 0.0010268 0.260836 -0.0044252 0.0010268 0.260836 -0.0087246 0.0010268 0.260836 -0.0141639 0.0010268 0.260836 -0.0210452 0.0010268 0.260836 -0.0297511 0.0010268 0.260836 -0.0407651 0.0010268 0.260836 -0.0546993 0.0010268 0.260836 -0.0723279 0.0010268 0.260836 -0.0946303 0.0010268 0.260836 -0.1228457 0.0010268 0.260836 -0.1585419 0.0010268 0.260836 -0.2037023 0.0010268 0.260836 -0.260836 0.0010268 0.260836 -0.3331176 0.0010268 0.260836 -0.4245633 0.0010268 0.260836 -0.5402539 0.0010268 0.260836 -0.6866175 0.0010268 0.260836 -0.8362644 0.0054121 0.253314 -0.9017148 0.0276281 0.2331404 -0.9347252 0.061916 0.2237288 -0.9541902 0.1053624 0.2295123 -0.9667385 0.1565954 0.2501139 -0.9752987 0.2145034 0.283838 -0.9813659 0.2778058 0.3284395 -0.9857835 0.3449254 0.3813539 -0.9890637 0.4140176 0.4398397 -0.9915347 0.4831021 0.50114 -0.9934166 0.550248 0.562671 -0.9948617 0.6137599 0.6222018 -0.9959785 0.6723217 0.6779873 -0.9968458 0.7250697 0.7288294 -0.997522 0.7715919 0.774062 -0.9980506 0.8118697 0.8134785 -0.9984649 0.8461864 0.8472264 -0.9987902 0.8750274 0.8756954 -0.999046 0.8989895 0.8994164 -0.9992473 0.9187089 0.9189805 -0.9994059 0.9348097 0.9349819 -0.999531 0.9478718 0.9479807 -0.9996296 0.9584137 0.9584823 -0.9997074 0.9668859 0.9669291 -0.9997689 0.9736717 0.9736989 -0.9998174 0.9790921 0.9791092 -0.9998557 0.9834126 0.9834233 -0.999886 0.9868503 0.986857 -0.9999099 0.9895819 0.9895861 -0.9999288 0.99175 0.9917526 -0.9999437 0.9934694 0.9934711 -0.0000238 0.0142868 0.2706977 -0.0000382 0.0137833 0.2701941 -0.0000611 0.0131511 0.2695619 -0.0000978 0.012359 0.2687698 -0.0001565 0.0113691 0.2677799 -0.0002504 0.0101365 0.2665473 -0.0004008 0.0086086 0.2650195 -0.0006416 0.0067261 0.2631369 -0.0010268 0.0044252 0.260836 -0.0016435 0.0016435 0.2580543 -0.0059429 0.0016435 0.2580543 -0.0113822 0.0016435 0.2580543 -0.0182636 0.0016435 0.2580543 -0.0269694 0.0016435 0.2580543 -0.0379834 0.0016435 0.2580543 -0.0519176 0.0016435 0.2580543 -0.0695462 0.0016435 0.2580543 -0.0918486 0.0016435 0.2580543 -0.120064 0.0016435 0.2580543 -0.1557603 0.0016435 0.2580543 -0.2009206 0.0016435 0.2580543 -0.2580543 0.0016435 0.2580543 -0.3303359 0.0016435 0.2580543 -0.4217816 0.0016435 0.2580543 -0.5374722 0.0016435 0.2580543 -0.6838358 0.0016435 0.2580543 -0.8349593 0.0058134 0.2509269 -0.9012461 0.0278105 0.2311088 -0.9345187 0.0619734 0.2220095 -0.9540886 0.1053433 0.2280923 -0.966685 0.1565315 0.2489674 -0.9752692 0.2144168 0.2829313 -0.9813491 0.2777122 0.3277361 -0.9857738 0.3448353 0.3808186 -0.9890579 0.4139373 0.4394399 -0.9915312 0.4830346 0.5008471 -0.9934145 0.5501939 0.5624604 -0.9948604 0.6137183 0.622053 -0.9959777 0.6722907 0.6778841 -0.9968453 0.7250473 0.7287589 -0.9975217 0.7715762 0.7740145 -0.9980504 0.8118589 0.8134469 -0.9984648 0.8461791 0.8472056 -0.9987902 0.8750225 0.8756819 -0.9990459 0.8989863 0.8994076 -0.9992473 0.9187068 0.9189748 -0.9994059 0.9348083 0.9349783 -0.9995309 0.947871 0.9479784 -0.9996296 0.9584132 0.9584809 -0.9997074 0.9668855 0.9669282 -0.9997689 0.9736715 0.9736983 -0.9998174 0.979092 0.9791088 -0.9998557 0.9834125 0.983423 -0.999886 0.9868502 0.9868568 -0.9999099 0.9895818 0.989586 -0.9999288 0.99175 0.9917526 -0.9999437 0.9934694 0.993471 -0.0000238 0.0185862 0.2706977 -0.0000382 0.0180827 0.2701941 -0.0000611 0.0174505 0.2695619 -0.0000978 0.0166583 0.2687698 -0.0001565 0.0156685 0.2677799 -0.0002504 0.0144359 0.2665473 -0.0004008 0.012908 0.2650195 -0.0006416 0.0110255 0.2631369 -0.0010268 0.0087246 0.260836 -0.0016435 0.0059429 0.2580543 -0.0026305 0.0026305 0.254742 -0.0080698 0.0026305 0.254742 -0.0149512 0.0026305 0.254742 -0.023657 0.0026305 0.254742 -0.0346711 0.0026305 0.254742 -0.0486053 0.0026305 0.254742 -0.0662338 0.0026305 0.254742 -0.0885362 0.0026305 0.254742 -0.1167517 0.0026305 0.254742 -0.1524479 0.0026305 0.254742 -0.1976083 0.0026305 0.254742 -0.254742 0.0026305 0.254742 -0.3270236 0.0026305 0.254742 -0.4184692 0.0026305 0.254742 -0.5341598 0.0026305 0.254742 -0.6805235 0.0026305 0.254742 -0.8333779 0.0065402 0.2480701 -0.900682 0.0282324 0.2286785 -0.9342712 0.062202 0.219954 -0.9539671 0.1054431 0.2263957 -0.9666211 0.1565473 0.2475986 -0.975234 0.2143816 0.2818492 -0.9813291 0.2776503 0.3268971 -0.9857621 0.3447636 0.3801802 -0.989051 0.4138668 0.4389633 -0.9915271 0.4829718 0.5004979 -0.993412 0.5501416 0.5622093 -0.9948589 0.6136769 0.6218758 -0.9959768 0.6722594 0.677761 -0.9968448 0.7250244 0.7286748 -0.9975213 0.7715599 0.7739579 -0.9980502 0.8118476 0.8134093 -0.9984647 0.8461714 0.8471809 -0.9987901 0.8750173 0.8756658 -0.9990459 0.8989829 0.8993972 -0.9992472 0.9187045 0.9189681 -0.9994059 0.9348069 0.934974 -0.9995309 0.94787 0.9479757 -0.9996296 0.9584126 0.9584792 -0.9997074 0.9668852 0.9669271 -0.9997689 0.9736712 0.9736976 -0.9998174 0.9790919 0.9791084 -0.9998557 0.9834124 0.9834228 -0.999886 0.9868502 0.9868567 -0.9999099 0.9895818 0.9895859 -0.9999288 0.99175 0.9917525 -0.9999437 0.9934694 0.993471 -0.0000238 0.0240255 0.2706977 -0.0000382 0.023522 0.2701941 -0.0000611 0.0228898 0.2695619 -0.0000978 0.0220976 0.2687698 -0.0001565 0.0211078 0.2677799 -0.0002504 0.0198752 0.2665473 -0.0004008 0.0183473 0.2650195 -0.0006416 0.0164648 0.2631369 -0.0010268 0.0141639 0.260836 -0.0016435 0.0113822 0.2580543 -0.0026305 0.0080698 0.254742 -0.0042103 0.0042103 0.2508825 -0.0110917 0.0042103 0.2508825 -0.0197975 0.0042103 0.2508825 -0.0308116 0.0042103 0.2508825 -0.0447458 0.0042103 0.2508825 -0.0623743 0.0042103 0.2508825 -0.0846767 0.0042103 0.2508825 -0.1128922 0.0042103 0.2508825 -0.1485884 0.0042103 0.2508825 -0.1937488 0.0042103 0.2508825 -0.2508825 0.0042103 0.2508825 -0.3231641 0.0042103 0.2508825 -0.4146097 0.0042103 0.2508825 -0.5303003 0.0042103 0.2508825 -0.676664 0.0042103 0.2508825 -0.8314967 0.0078103 0.2447216 -0.9000167 0.0290732 0.2258315 -0.9339805 0.062742 0.2175476 -0.9538247 0.1057683 0.224411 -0.9665463 0.1567226 0.2459984 -0.9751928 0.2144566 0.280585 -0.9813057 0.2776626 0.3259173 -0.9857485 0.3447407 0.379435 -0.989043 0.4138277 0.4384071 -0.9915223 0.4829286 0.5000906 -0.9934091 0.5501012 0.5619166 -0.9948571 0.6136427 0.6216691 -0.9959757 0.6722322 0.6776176 -0.9968441 0.7250039 0.7285769 -0.9975209 0.7715449 0.773892 -0.99805 0.811837 0.8133654 -0.9984645 0.8461641 0.847152 -0.99879 0.8750124 0.875647 -0.9990458 0.8989796 0.899385 -0.9992472 0.9187024 0.9189603 -0.9994059 0.9348055 0.934969 -0.9995309 0.9478691 0.9479725 -0.9996296 0.958412 0.9584772 -0.9997074 0.9668848 0.9669258 -0.9997689 0.973671 0.9736968 -0.9998174 0.9790917 0.9791079 -0.9998557 0.9834123 0.9834224 -0.999886 0.9868501 0.9868565 -0.9999099 0.9895818 0.9895857 -0.9999288 0.9917499 0.9917524 -0.9999437 0.9934694 0.9934709 -0.0000238 0.0309069 0.2706977 -0.0000382 0.0304033 0.2701941 -0.0000611 0.0297711 0.2695619 -0.0000978 0.028979 0.2687698 -0.0001565 0.0279891 0.2677799 -0.0002504 0.0267565 0.2665473 -0.0004008 0.0252287 0.2650195 -0.0006416 0.0233461 0.2631369 -0.0010268 0.0210452 0.260836 -0.0016435 0.0182636 0.2580543 -0.0026305 0.0149512 0.254742 -0.0042103 0.0110917 0.2508825 -0.0067388 0.0067388 0.2465296 -0.0154447 0.0067388 0.2465296 -0.0264587 0.0067388 0.2465296 -0.0403929 0.0067388 0.2465296 -0.0580214 0.0067388 0.2465296 -0.0803239 0.0067388 0.2465296 -0.1085393 0.0067388 0.2465296 -0.1442355 0.0067388 0.2465296 -0.1893959 0.0067388 0.2465296 -0.2465296 0.0067388 0.2465296 -0.3188112 0.0067388 0.2465296 -0.4102568 0.0067388 0.2465296 -0.5259474 0.0067388 0.2465296 -0.6723111 0.0067388 0.2465296 -0.8293233 0.0099781 0.2409195 -0.8992555 0.0306306 0.2226006 -0.9336494 0.0638283 0.2148189 -0.953663 0.1064997 0.2221626 -0.9664615 0.1571937 0.244187 -0.9751462 0.2147432 0.2791549 -0.9812792 0.2778236 0.3248095 -0.9857332 0.3448204 0.3785929 -0.9890339 0.4138582 0.4377789 -0.9915169 0.4829319 0.4996306 -0.9934058 0.5500915 0.561586 -0.9948551 0.6136284 0.6214357 -0.9959745 0.672218 0.6774557 -0.9968433 0.7249916 0.7284663 -0.9975204 0.7715352 0.7738175 -0.9980497 0.8118298 0.8133159 -0.9984643 0.8461589 0.8471195 -0.9987899 0.8750088 0.8756258 -0.9990458 0.8989771 0.8993713 -0.9992472 0.9187008 0.9189515 -0.9994058 0.9348044 0.9349634 -0.9995309 0.9478684 0.9479689 -0.9996296 0.9584115 0.9584749 -0.9997074 0.9668845 0.9669244 -0.9997689 0.9736708 0.9736959 -0.9998174 0.9790916 0.9791073 -0.9998557 0.9834122 0.9834221 -0.999886 0.9868501 0.9868562 -0.9999099 0.9895817 0.9895856 -0.9999288 0.9917499 0.9917523 -0.9999437 0.9934694 0.9934709 -0.0000238 0.0396127 0.2706977 -0.0000382 0.0391092 0.2701941 -0.0000611 0.038477 0.2695619 -0.0000978 0.0376849 0.2687698 -0.0001565 0.036695 0.2677799 -0.0002504 0.0354624 0.2665473 -0.0004008 0.0339345 0.2650195 -0.0006416 0.032052 0.2631369 -0.0010268 0.0297511 0.260836 -0.0016435 0.0269694 0.2580543 -0.0026305 0.023657 0.254742 -0.0042103 0.0197975 0.2508825 -0.0067388 0.0154447 0.2465296 -0.0107859 0.0107859 0.2418708 -0.0217999 0.0107859 0.2418708 -0.0357341 0.0107859 0.2418708 -0.0533626 0.0107859 0.2418708 -0.075665 0.0107859 0.2418708 -0.1038805 0.0107859 0.2418708 -0.1395767 0.0107859 0.2418708 -0.1847371 0.0107859 0.2418708 -0.2418708 0.0107859 0.2418708 -0.3141524 0.0107859 0.2418708 -0.405598 0.0107859 0.2418708 -0.5212886 0.0107859 0.2418708 -0.6676523 0.0107859 0.2418708 -0.8269342 0.0136166 0.2368203 -0.8984278 0.0333932 0.2191191 -0.9332914 0.0658501 0.2118811 -0.9534887 0.1079385 0.2197441 -0.9663702 0.15819 0.2422403 -0.9750962 0.2154135 0.2776191 -0.9812508 0.2782606 0.3236207 -0.9857167 0.3450957 0.3776896 -0.9890241 0.4140252 0.4371052 -0.991511 0.4830292 0.4991376 -0.9934023 0.5501456 0.5612317 -0.994853 0.6136569 0.6211858 -0.9959732 0.672232 0.6772823 -0.9968425 0.7249978 0.7283479 -0.9975199 0.7715376 0.7737378 -0.9980494 0.8118303 0.8132629 -0.9984642 0.8461587 0.8470846 -0.9987897 0.8750084 0.8756031 -0.9990457 0.8989767 0.8993566 -0.9992471 0.9187004 0.9189421 -0.9994058 0.9348042 0.9349574 -0.9995309 0.9478683 0.9479651 -0.9996295 0.9584114 0.9584725 -0.9997074 0.9668844 0.9669228 -0.9997689 0.9736708 0.9736949 -0.9998174 0.9790916 0.9791067 -0.9998557 0.9834122 0.9834217 -0.999886 0.98685 0.986856 -0.9999099 0.9895817 0.9895854 -0.9999288 0.9917499 0.9917522 -0.9999437 0.9934694 0.9934708 -0.0000238 0.0506267 0.2706977 -0.0000382 0.0501232 0.2701941 -0.0000611 0.049491 0.2695619 -0.0000978 0.0486989 0.2687698 -0.0001565 0.047709 0.2677799 -0.0002504 0.0464764 0.2665473 -0.0004008 0.0449485 0.2650195 -0.0006416 0.043066 0.2631369 -0.0010268 0.0407651 0.260836 -0.0016435 0.0379834 0.2580543 -0.0026305 0.0346711 0.254742 -0.0042103 0.0308116 0.2508825 -0.0067388 0.0264587 0.2465296 -0.0107859 0.0217999 0.2418708 -0.0172633 0.0172633 0.2373343 -0.0311975 0.0172633 0.2373343 -0.0488261 0.0172633 0.2373343 -0.0711285 0.0172633 0.2373343 -0.099344 0.0172633 0.2373343 -0.1350402 0.0172633 0.2373343 -0.1802005 0.0172633 0.2373343 -0.2373343 0.0172633 0.2373343 -0.3096159 0.0172633 0.2373343 -0.4010615 0.0172633 0.2373343 -0.5167521 0.0172633 0.2373343 -0.6631157 0.0172633 0.2373343 -0.8245426 0.0196467 0.232799 -0.8976087 0.0381561 0.2157054 -0.9329391 0.0694453 0.209003 -0.9533177 0.1105818 0.2173771 -0.9662809 0.160092 0.2403368 -0.9750472 0.2167545 0.2761186 -0.9812231 0.2791873 0.3224598 -0.9857006 0.3457234 0.376808 -0.9890146 0.4144423 0.436448 -0.9915054 0.4833013 0.4986567 -0.9933988 0.5503203 0.5608864 -0.9948509 0.6137675 0.6209421 -0.9959719 0.6723012 0.6771133 -0.9968418 0.7250408 0.7282325 -0.9975194 0.7715641 0.7736602 -0.9980491 0.8118466 0.8132113 -0.998464 0.8461687 0.8470507 -0.9987896 0.8750145 0.8755809 -0.9990456 0.8989805 0.8993424 -0.9992471 0.9187027 0.9189329 -0.9994058 0.9348056 0.9349515 -0.9995309 0.9478691 0.9479614 -0.9996295 0.958412 0.9584701 -0.9997074 0.9668847 0.9669214 -0.9997688 0.973671 0.973694 -0.9998174 0.9790917 0.9791061 -0.9998557 0.9834123 0.9834213 -0.999886 0.9868501 0.9868558 -0.9999099 0.9895817 0.9895853 -0.9999288 0.9917499 0.9917522 -0.9999437 0.9934694 0.9934708 -0.0000238 0.0645609 0.2706977 -0.0000382 0.0640574 0.2701941 -0.0000611 0.0634252 0.2695619 -0.0000978 0.0626331 0.2687698 -0.0001565 0.0616432 0.2677799 -0.0002504 0.0604106 0.2665473 -0.0004008 0.0588827 0.2650195 -0.0006416 0.0570002 0.2631369 -0.0010268 0.0546993 0.260836 -0.0016435 0.0519176 0.2580543 -0.0026305 0.0486053 0.254742 -0.0042103 0.0447458 0.2508825 -0.0067388 0.0403929 0.2465296 -0.0107859 0.0357341 0.2418708 -0.0172633 0.0311975 0.2373343 -0.0276309 0.0276309 0.2337676 -0.0452595 0.0276309 0.2337676 -0.0675619 0.0276309 0.2337676 -0.0957773 0.0276309 0.2337676 -0.1314736 0.0276309 0.2337676 -0.1766339 0.0276309 0.2337676 -0.2337676 0.0276309 0.2337676 -0.3060492 0.0276309 0.2337676 -0.3974949 0.0276309 0.2337676 -0.5131855 0.0276309 0.2337676 -0.6595491 0.0276309 0.2337676 -0.8226154 0.0295373 0.229617 -0.8969554 0.0461985 0.2130052 -0.9326595 0.0756464 0.2067281 -0.9531823 0.1152388 0.2155079 -0.9662104 0.1635226 0.2388348 -0.9750086 0.2192389 0.2749353 -0.9812013 0.2809573 0.321545 -0.9856879 0.3469645 0.3761135 -0.9890072 0.4152991 0.4359305 -0.9915009 0.4838841 0.4982782 -0.9933961 0.5507113 0.5606145 -0.9948493 0.6140266 0.6207504 -0.9959709 0.6724711 0.6769804 -0.9968411 0.7251511 0.7281418 -0.9975191 0.7716352 0.7735991 -0.9980488 0.8118921 0.8131707 -0.9984638 0.8461977 0.847024 -0.9987895 0.8750329 0.8755636 -0.9990456 0.8989921 0.8993311 -0.999247 0.9187101 0.9189257 -0.9994057 0.9348102 0.9349469 -0.9995309 0.947872 0.9479584 -0.9996295 0.9584138 0.9584683 -0.9997074 0.9668859 0.9669202 -0.9997688 0.9736717 0.9736932 -0.9998174 0.9790921 0.9791057 -0.9998557 0.9834126 0.983421 -0.999886 0.9868503 0.9868556 -0.9999099 0.9895819 0.9895852 -0.9999288 0.99175 0.9917521 -0.9999437 0.9934694 0.9934707 -0.0000238 0.0821895 0.2706977 -0.0000382 0.081686 0.2701941 -0.0000611 0.0810538 0.2695619 -0.0000978 0.0802616 0.2687698 -0.0001565 0.0792718 0.2677799 -0.0002504 0.0780392 0.2665473 -0.0004008 0.0765113 0.2650195 -0.0006416 0.0746288 0.2631369 -0.0010268 0.0723279 0.260836 -0.0016435 0.0695462 0.2580543 -0.0026305 0.0662338 0.254742 -0.0042103 0.0623743 0.2508825 -0.0067388 0.0580214 0.2465296 -0.0107859 0.0533626 0.2418708 -0.0172633 0.0488261 0.2373343 -0.0276309 0.0452595 0.2337676 -0.0441188 0.0441188 0.2326269 -0.0664212 0.0441188 0.2326269 -0.0946366 0.0441188 0.2326269 -0.1303328 0.0441188 0.2326269 -0.1754932 0.0441188 0.2326269 -0.2326269 0.0441188 0.2326269 -0.3049085 0.0441188 0.2326269 -0.3963542 0.0441188 0.2326269 -0.5120448 0.0441188 0.2326269 -0.6584084 0.0441188 0.2326269 -0.8219901 0.0455041 0.2285954 -0.8967447 0.0594506 0.2121385 -0.9325696 0.0860209 0.2059983 -0.9531389 0.1231452 0.2149085 -0.9661878 0.1694384 0.2383533 -0.9749962 0.2235962 0.2745562 -0.9811943 0.2841192 0.3212519 -0.9856839 0.3492254 0.3758911 -0.9890048 0.4168922 0.4357648 -0.9914995 0.4849907 0.498157 -0.9933953 0.5514695 0.5605276 -0.9948487 0.6145393 0.6206891 -0.9959706 0.6728136 0.6769378 -0.9968409 0.7253775 0.7281127 -0.9975189 0.7717834 0.7735795 -0.9980488 0.8119884 0.8131577 -0.9984638 0.8462598 0.8470154 -0.9987895 0.8750727 0.875558 -0.9990455 0.8990175 0.8993275 -0.999247 0.9187262 0.9189234 -0.9994057 0.9348204 0.9349454 -0.9995308 0.9478785 0.9479575 -0.9996295 0.9584178 0.9584677 -0.9997074 0.9668884 0.9669198 -0.9997688 0.9736733 0.973693 -0.9998174 0.9790931 0.9791055 -0.9998557 0.9834132 0.9834209 -0.999886 0.9868507 0.9868555 -0.9999099 0.9895821 0.9895851 -0.9999288 0.9917502 0.9917521 -0.9999437 0.9934695 0.9934707 -0.0000238 0.1044919 0.2706977 -0.0000382 0.1039884 0.2701941 -0.0000611 0.1033562 0.2695619 -0.0000978 0.102564 0.2687698 -0.0001565 0.1015742 0.2677799 -0.0002504 0.1003416 0.2665473 -0.0004008 0.0988137 0.2650195 -0.0006416 0.0969312 0.2631369 -0.0010268 0.0946303 0.260836 -0.0016435 0.0918486 0.2580543 -0.0026305 0.0885362 0.254742 -0.0042103 0.0846767 0.2508825 -0.0067388 0.0803239 0.2465296 -0.0107859 0.075665 0.2418708 -0.0172633 0.0711285 0.2373343 -0.0276309 0.0675619 0.2337676 -0.0441188 0.0664212 0.2326269 -0.0664212 0.0664212 0.2326269 -0.0946366 0.0664212 0.2326269 -0.1303328 0.0664212 0.2326269 -0.1754932 0.0664212 0.2326269 -0.2326269 0.0664212 0.2326269 -0.3049085 0.0664212 0.2326269 -0.3963542 0.0664212 0.2326269 -0.5120448 0.0664212 0.2326269 -0.6584084 0.0664212 0.2326269 -0.8219901 0.0671656 0.2285954 -0.8967447 0.0775151 0.2121385 -0.9325696 0.1002154 0.2059983 -0.9531389 0.1340017 0.2149085 -0.9661878 0.1775917 0.2383533 -0.9749962 0.2296253 0.2745562 -0.9811943 0.2885124 0.3212519 -0.9856839 0.3523802 0.3758911 -0.9890048 0.419125 0.4357648 -0.9914995 0.4865484 0.498157 -0.9933953 0.5525411 0.5605276 -0.9948487 0.6152669 0.6206891 -0.9959706 0.6733015 0.6769378 -0.9968409 0.7257011 0.7281127 -0.9975189 0.7719959 0.7735795 -0.9980488 0.8121268 0.8131577 -0.9984638 0.8463492 0.8470154 -0.9987895 0.8751301 0.875558 -0.9990455 0.8990542 0.8993275 -0.999247 0.9187495 0.9189234 -0.9994057 0.9348352 0.9349454 -0.9995308 0.9478878 0.9479575 -0.9996295 0.9584237 0.9584677 -0.9997074 0.9668922 0.9669198 -0.9997688 0.9736756 0.973693 -0.9998174 0.9790946 0.9791055 -0.9998557 0.9834141 0.9834209 -0.999886 0.9868512 0.9868555 -0.9999099 0.9895825 0.9895851 -0.9999288 0.9917504 0.9917521 -0.9999437 0.9934697 0.9934707 -0.0000238 0.1327073 0.2706977 -0.0000382 0.1322038 0.2701941 -0.0000611 0.1315716 0.2695619 -0.0000978 0.1307795 0.2687698 -0.0001565 0.1297896 0.2677799 -0.0002504 0.128557 0.2665473 -0.0004008 0.1270291 0.2650195 -0.0006416 0.1251466 0.2631369 -0.0010268 0.1228457 0.260836 -0.0016435 0.120064 0.2580543 -0.0026305 0.1167517 0.254742 -0.0042103 0.1128922 0.2508825 -0.0067388 0.1085393 0.2465296 -0.0107859 0.1038805 0.2418708 -0.0172633 0.099344 0.2373343 -0.0276309 0.0957773 0.2337676 -0.0441188 0.0946366 0.2326269 -0.0664212 0.0946366 0.2326269 -0.0946366 0.0946366 0.2326269 -0.1303328 0.0946366 0.2326269 -0.1754932 0.0946366 0.2326269 -0.2326269 0.0946366 0.2326269 -0.3049085 0.0946366 0.2326269 -0.3963542 0.0946366 0.2326269 -0.5120448 0.0946366 0.2326269 -0.6584084 0.0946366 0.2326269 -0.8219901 0.0945703 0.2285954 -0.8967447 0.1003691 0.2121385 -0.9325696 0.1181733 0.2059983 -0.9531389 0.1477366 0.2149085 -0.9661878 0.1879067 0.2383533 -0.9749962 0.2372529 0.2745562 -0.9811943 0.2940703 0.3212519 -0.9856839 0.3563715 0.3758911 -0.9890048 0.4219498 0.4357648 -0.9914995 0.4885191 0.498157 -0.9933953 0.5538969 0.5605276 -0.9948487 0.6161874 0.6206891 -0.9959706 0.6739188 0.6769378 -0.9968409 0.7261105 0.7281127 -0.9975189 0.7722648 0.7735795 -0.9980488 0.8123018 0.8131577 -0.9984638 0.8464623 0.8470154 -0.9987895 0.8752028 0.875558 -0.9990455 0.8991006 0.8993275 -0.999247 0.9187791 0.9189234 -0.9994057 0.9348539 0.9349454 -0.9995308 0.9478997 0.9479575 -0.9996295 0.9584312 0.9584677 -0.9997074 0.9668969 0.9669198 -0.9997688 0.9736786 0.973693 -0.9998174 0.9790965 0.9791055 -0.9998557 0.9834153 0.9834209 -0.999886 0.986852 0.9868555 -0.9999099 0.9895829 0.9895851 -0.9999288 0.9917507 0.9917521 -0.9999437 0.9934698 0.9934707 -0.0000238 0.1684036 0.2706977 -0.0000382 0.1679 0.2701941 -0.0000611 0.1672678 0.2695619 -0.0000978 0.1664757 0.2687698 -0.0001565 0.1654858 0.2677799 -0.0002504 0.1642532 0.2665473 -0.0004008 0.1627254 0.2650195 -0.0006416 0.1608428 0.2631369 -0.0010268 0.1585419 0.260836 -0.0016435 0.1557603 0.2580543 -0.0026305 0.1524479 0.254742 -0.0042103 0.1485884 0.2508825 -0.0067388 0.1442355 0.2465296 -0.0107859 0.1395767 0.2418708 -0.0172633 0.1350402 0.2373343 -0.0276309 0.1314736 0.2337676 -0.0441188 0.1303328 0.2326269 -0.0664212 0.1303328 0.2326269 -0.0946366 0.1303328 0.2326269 -0.1303328 0.1303328 0.2326269 -0.1754932 0.1303328 0.2326269 -0.2326269 0.1303328 0.2326269 -0.3049085 0.1303328 0.2326269 -0.3963542 0.1303328 0.2326269 -0.5120448 0.1303328 0.2326269 -0.6584084 0.1303328 0.2326269 -0.8219901 0.1292408 0.2285954 -0.8967447 0.1292823 0.2121385 -0.9325696 0.1408925 0.2059983 -0.9531389 0.1651131 0.2149085 -0.9661878 0.2009566 0.2383533 -0.9749962 0.2469027 0.2745562 -0.9811943 0.3011018 0.3212519 -0.9856839 0.3614209 0.3758911 -0.9890048 0.4255236 0.4357648 -0.9914995 0.4910123 0.498157 -0.9933953 0.5556122 0.5605276 -0.9948487 0.6173519 0.6206891 -0.9959706 0.6746998 0.6769378 -0.9968409 0.7266285 0.7281127 -0.9975189 0.7726049 0.7735795 -0.9980488 0.8125232 0.8131577 -0.9984638 0.8466054 0.8470154 -0.9987895 0.8752947 0.875558 -0.9990455 0.8991593 0.8993275 -0.999247 0.9188164 0.9189234 -0.9994057 0.9348776 0.9349454 -0.9995308 0.9479146 0.9479575 -0.9996295 0.9584406 0.9584677 -0.9997074 0.9669028 0.9669198 -0.9997688 0.9736823 0.973693 -0.9998174 0.9790988 0.9791055 -0.9998557 0.9834167 0.9834209 -0.999886 0.9868529 0.9868555 -0.9999099 0.9895835 0.9895851 -0.9999288 0.991751 0.9917521 -0.9999437 0.9934701 0.9934707 -0.0000238 0.2135639 0.2706977 -0.0000382 0.2130604 0.2701941 -0.0000611 0.2124282 0.2695619 -0.0000978 0.2116361 0.2687698 -0.0001565 0.2106462 0.2677799 -0.0002504 0.2094136 0.2665473 -0.0004008 0.2078857 0.2650195 -0.0006416 0.2060032 0.2631369 -0.0010268 0.2037023 0.260836 -0.0016435 0.2009206 0.2580543 -0.0026305 0.1976083 0.254742 -0.0042103 0.1937488 0.2508825 -0.0067388 0.1893959 0.2465296 -0.0107859 0.1847371 0.2418708 -0.0172633 0.1802005 0.2373343 -0.0276309 0.1766339 0.2337676 -0.0441188 0.1754932 0.2326269 -0.0664212 0.1754932 0.2326269 -0.0946366 0.1754932 0.2326269 -0.1303328 0.1754932 0.2326269 -0.1754932 0.1754932 0.2326269 -0.2326269 0.1754932 0.2326269 -0.3049085 0.1754932 0.2326269 -0.3963542 0.1754932 0.2326269 -0.5120448 0.1754932 0.2326269 -0.6584084 0.1754932 0.2326269 -0.8219901 0.1731034 0.2285954 -0.8967447 0.1658613 0.2121385 -0.9325696 0.1696351 0.2059983 -0.9531389 0.1870965 0.2149085 -0.9661878 0.2174663 0.2383533 -0.9749962 0.2591111 0.2745562 -0.9811943 0.3099976 0.3212519 -0.9856839 0.3678092 0.3758911 -0.9890048 0.4300448 0.4357648 -0.9914995 0.4941665 0.498157 -0.9933953 0.5577822 0.5605276 -0.9948487 0.6188252 0.6206891 -0.9959706 0.6756878 0.6769378 -0.9968409 0.7272837 0.7281127 -0.9975189 0.7730352 0.7735795 -0.9980488 0.8128033 0.8131577 -0.9984638 0.8467864 0.8470154 -0.9987895 0.8754109 0.875558 -0.9990455 0.8992336 0.8993275 -0.999247 0.9188636 0.9189234 -0.9994057 0.9349075 0.9349454 -0.9995308 0.9479335 0.9479575 -0.9996295 0.9584526 0.9584677 -0.9997074 0.9669103 0.9669198 -0.9997688 0.973687 0.973693 -0.9998174 0.9791018 0.9791055 -0.9998557 0.9834186 0.9834209 -0.999886 0.9868541 0.9868555 -0.9999099 0.9895842 0.9895851 -0.9999288 0.9917515 0.9917521 -0.9999437 0.9934704 0.9934707 -0.0000238 0.2706977 0.2706977 -0.0000382 0.2701941 0.2701941 -0.0000611 0.2695619 0.2695619 -0.0000978 0.2687698 0.2687698 -0.0001565 0.2677799 0.2677799 -0.0002504 0.2665473 0.2665473 -0.0004008 0.2650195 0.2650195 -0.0006416 0.2631369 0.2631369 -0.0010268 0.260836 0.260836 -0.0016435 0.2580543 0.2580543 -0.0026305 0.254742 0.254742 -0.0042103 0.2508825 0.2508825 -0.0067388 0.2465296 0.2465296 -0.0107859 0.2418708 0.2418708 -0.0172633 0.2373343 0.2373343 -0.0276309 0.2337676 0.2337676 -0.0441188 0.2326269 0.2326269 -0.0664212 0.2326269 0.2326269 -0.0946366 0.2326269 0.2326269 -0.1303328 0.2326269 0.2326269 -0.1754932 0.2326269 0.2326269 -0.2326269 0.2326269 0.2326269 -0.3049085 0.2326269 0.2326269 -0.3963542 0.2326269 0.2326269 -0.5120448 0.2326269 0.2326269 -0.6584084 0.2326269 0.2326269 -0.8219901 0.2285954 0.2285954 -0.8967447 0.2121385 0.2121385 -0.9325696 0.2059983 0.2059983 -0.9531389 0.2149085 0.2149085 -0.9661878 0.2383533 0.2383533 -0.9749962 0.2745562 0.2745562 -0.9811943 0.3212519 0.3212519 -0.9856839 0.3758911 0.3758911 -0.9890048 0.4357648 0.4357648 -0.9914995 0.498157 0.498157 -0.9933953 0.5605276 0.5605276 -0.9948487 0.6206891 0.6206891 -0.9959706 0.6769378 0.6769378 -0.9968409 0.7281127 0.7281127 -0.9975189 0.7735795 0.7735795 -0.9980488 0.8131577 0.8131577 -0.9984638 0.8470154 0.8470154 -0.9987895 0.875558 0.875558 -0.9990455 0.8993275 0.8993275 -0.999247 0.9189234 0.9189234 -0.9994057 0.9349454 0.9349454 -0.9995308 0.9479575 0.9479575 -0.9996295 0.9584677 0.9584677 -0.9997074 0.9669198 0.9669198 -0.9997688 0.973693 0.973693 -0.9998174 0.9791055 0.9791055 -0.9998557 0.9834209 0.9834209 -0.999886 0.9868555 0.9868555 -0.9999099 0.9895851 0.9895851 -0.9999288 0.9917521 0.9917521 -0.9999437 0.9934707 0.9934707 -0.0000238 0.3429792 0.2706977 -0.0000382 0.3424757 0.2701941 -0.0000611 0.3418435 0.2695619 -0.0000978 0.3410514 0.2687698 -0.0001565 0.3400615 0.2677799 -0.0002504 0.3388289 0.2665473 -0.0004008 0.337301 0.2650195 -0.0006416 0.3354185 0.2631369 -0.0010268 0.3331176 0.260836 -0.0016435 0.3303359 0.2580543 -0.0026305 0.3270236 0.254742 -0.0042103 0.3231641 0.2508825 -0.0067388 0.3188112 0.2465296 -0.0107859 0.3141524 0.2418708 -0.0172633 0.3096159 0.2373343 -0.0276309 0.3060492 0.2337676 -0.0441188 0.3049085 0.2326269 -0.0664212 0.3049085 0.2326269 -0.0946366 0.3049085 0.2326269 -0.1303328 0.3049085 0.2326269 -0.1754932 0.3049085 0.2326269 -0.2326269 0.3049085 0.2326269 -0.3049085 0.3049085 0.2326269 -0.3963542 0.3049085 0.2326269 -0.5120448 0.3049085 0.2326269 -0.6584084 0.3049085 0.2326269 -0.8219901 0.2988 0.2285954 -0.8967447 0.2706852 0.2121385 -0.9325696 0.2520025 0.2059983 -0.9531389 0.2500942 0.2149085 -0.9661878 0.2647781 0.2383533 -0.9749962 0.2940963 0.2745562 -0.9811943 0.3354901 0.3212519 -0.9856839 0.3861159 0.3758911 -0.9890048 0.4430013 0.4357648 -0.9914995 0.5032055 0.498157 -0.9933953 0.5640008 0.5605276 -0.9948487 0.6230471 0.6206891 -0.9959706 0.6785192 0.6769378 -0.9968409 0.7291615 0.7281127 -0.9975189 0.7742682 0.7735795 -0.9980488 0.8136061 0.8131577 -0.9984638 0.8473052 0.8470154 -0.9987895 0.8757441 0.875558 -0.9990455 0.8994464 0.8993275 -0.999247 0.918999 0.9189234 -0.9994057 0.9349933 0.9349454 -0.9995308 0.9479878 0.9479575 -0.9996295 0.9584868 0.9584677 -0.9997074 0.9669318 0.9669198 -0.9997688 0.9737006 0.973693 -0.9998174 0.9791103 0.9791055 -0.9998557 0.9834239 0.9834209 -0.999886 0.9868574 0.9868555 -0.9999099 0.9895863 0.9895851 -0.9999288 0.9917528 0.9917521 -0.9999437 0.9934712 0.9934707 -0.0000238 0.4344249 0.2706977 -0.0000382 0.4339214 0.2701941 -0.0000611 0.4332891 0.2695619 -0.0000978 0.432497 0.2687698 -0.0001565 0.4315072 0.2677799 -0.0002504 0.4302746 0.2665473 -0.0004008 0.4287467 0.2650195 -0.0006416 0.4268641 0.2631369 -0.0010268 0.4245633 0.260836 -0.0016435 0.4217816 0.2580543 -0.0026305 0.4184692 0.254742 -0.0042103 0.4146097 0.2508825 -0.0067388 0.4102568 0.2465296 -0.0107859 0.405598 0.2418708 -0.0172633 0.4010615 0.2373343 -0.0276309 0.3974949 0.2337676 -0.0441188 0.3963542 0.2326269 -0.0664212 0.3963542 0.2326269 -0.0946366 0.3963542 0.2326269 -0.1303328 0.3963542 0.2326269 -0.1754932 0.3963542 0.2326269 -0.2326269 0.3963542 0.2326269 -0.3049085 0.3963542 0.2326269 -0.3963542 0.3963542 0.2326269 -0.5120448 0.3963542 0.2326269 -0.6584084 0.3963542 0.2326269 -0.8219901 0.3876179 0.2285954 -0.8967447 0.3447543 0.2121385 -0.9325696 0.3102037 0.2059983 -0.9531389 0.2946088 0.2149085 -0.9661878 0.2982089 0.2383533 -0.9749962 0.3188171 0.2745562 -0.9811943 0.3535032 0.3212519 -0.9856839 0.3990515 0.3758911 -0.9890048 0.4521565 0.4357648 -0.9914995 0.5095925 0.498157 -0.9933953 0.5683949 0.5605276 -0.9948487 0.6260304 0.6206891 -0.9959706 0.6805199 0.6769378 -0.9968409 0.7304884 0.7281127 -0.9975189 0.7751395 0.7735795 -0.9980488 0.8141733 0.8131577 -0.9984638 0.8476717 0.8470154 -0.9987895 0.8759795 0.875558 -0.9990455 0.8995968 0.8993275 -0.999247 0.9190947 0.9189234 -0.9994057 0.935054 0.9349454 -0.9995308 0.9480261 0.9479575 -0.9996295 0.9585109 0.9584677 -0.9997074 0.966947 0.9669198 -0.9997688 0.9737101 0.973693 -0.9998174 0.9791163 0.9791055 -0.9998557 0.9834277 0.9834209 -0.999886 0.9868597 0.9868555 -0.9999099 0.9895878 0.9895851 -0.9999288 0.9917537 0.9917521 -0.9999437 0.9934718 0.9934707 -0.0000238 0.5501155 0.2706977 -0.0000382 0.549612 0.2701941 -0.0000611 0.5489798 0.2695619 -0.0000978 0.5481876 0.2687698 -0.0001565 0.5471978 0.2677799 -0.0002504 0.5459652 0.2665473 -0.0004008 0.5444373 0.2650195 -0.0006416 0.5425548 0.2631369 -0.0010268 0.5402539 0.260836 -0.0016435 0.5374722 0.2580543 -0.0026305 0.5341598 0.254742 -0.0042103 0.5303003 0.2508825 -0.0067388 0.5259474 0.2465296 -0.0107859 0.5212886 0.2418708 -0.0172633 0.5167521 0.2373343 -0.0276309 0.5131855 0.2337676 -0.0441188 0.5120448 0.2326269 -0.0664212 0.5120448 0.2326269 -0.0946366 0.5120448 0.2326269 -0.1303328 0.5120448 0.2326269 -0.1754932 0.5120448 0.2326269 -0.2326269 0.5120448 0.2326269 -0.3049085 0.5120448 0.2326269 -0.3963542 0.5120448 0.2326269 -0.5120448 0.5120448 0.2326269 -0.6584084 0.5120448 0.2326269 -0.8219901 0.4999841 0.2285954 -0.8967447 0.4384614 0.2121385 -0.9325696 0.3838358 0.2059983 -0.9531389 0.3509254 0.2149085 -0.9661878 0.3405032 0.2383533 -0.9749962 0.3500921 0.2745562 -0.9811943 0.3762922 0.3212519 -0.9856839 0.4154167 0.3758911 -0.9890048 0.4637389 0.4357648 -0.9914995 0.5176729 0.498157 -0.9933953 0.573954 0.5605276 -0.9948487 0.6298046 0.6206891 -0.9959706 0.683051 0.6769378 -0.9968409 0.732167 0.7281127 -0.9975189 0.7762418 0.7735795 -0.9980488 0.8148909 0.8131577 -0.9984638 0.8481355 0.8470154 -0.9987895 0.8762773 0.875558 -0.9990455 0.899787 0.8993275 -0.999247 0.9192157 0.9189234 -0.9994057 0.9351307 0.9349454 -0.9995308 0.9480746 0.9479575 -0.9996295 0.9585415 0.9584677 -0.9997074 0.9669663 0.9669198 -0.9997688 0.9737222 0.973693 -0.9998174 0.9791238 0.9791055 -0.9998557 0.9834324 0.9834209 -0.999886 0.9868627 0.9868555 -0.9999099 0.9895897 0.9895851 -0.9999288 0.9917549 0.9917521 -0.9999437 0.9934725 0.9934707 -0.0000238 0.6964791 0.2706977 -0.0000382 0.6959756 0.2701941 -0.0000611 0.6953434 0.2695619 -0.0000978 0.6945513 0.2687698 -0.0001565 0.6935614 0.2677799 -0.0002504 0.6923288 0.2665473 -0.0004008 0.6908009 0.2650195 -0.0006416 0.6889184 0.2631369 -0.0010268 0.6866175 0.260836 -0.0016435 0.6838358 0.2580543 -0.0026305 0.6805235 0.254742 -0.0042103 0.676664 0.2508825 -0.0067388 0.6723111 0.2465296 -0.0107859 0.6676523 0.2418708 -0.0172633 0.6631157 0.2373343 -0.0276309 0.6595491 0.2337676 -0.0441188 0.6584084 0.2326269 -0.0664212 0.6584084 0.2326269 -0.0946366 0.6584084 0.2326269 -0.1303328 0.6584084 0.2326269 -0.1754932 0.6584084 0.2326269 -0.2326269 0.6584084 0.2326269 -0.3049085 0.6584084 0.2326269 -0.3963542 0.6584084 0.2326269 -0.5120448 0.6584084 0.2326269 -0.6584084 0.6584084 0.2326269 -0.8219901 0.6421419 0.2285954 -0.8967447 0.557013 0.2121385 -0.9325696 0.4769901 0.2059983 -0.9531389 0.4221733 0.2149085 -0.9661878 0.3940109 0.2383533 -0.9749962 0.389659 0.2745562 -0.9811943 0.4051232 0.3212519 -0.9856839 0.4361208 0.3758911 -0.9890048 0.4783922 0.4357648 -0.9914995 0.5278957 0.498157 -0.9933953 0.580987 0.5605276 -0.9948487 0.6345795 0.6206891 -0.9959706 0.6862532 0.6769378 -0.9968409 0.7342907 0.7281127 -0.9975189 0.7776364 0.7735795 -0.9980488 0.8157988 0.8131577 -0.9984638 0.8487222 0.8470154 -0.9987895 0.8766541 0.875558 -0.9990455 0.9000277 0.8993275 -0.999247 0.9193688 0.9189234 -0.9994057 0.9352277 0.9349454 -0.9995308 0.9481359 0.9479575 -0.9996295 0.9585802 0.9584677 -0.9997074 0.9669906 0.9669198 -0.9997688 0.9737375 0.973693 -0.9998174 0.9791334 0.9791055 -0.9998557 0.9834385 0.9834209 -0.999886 0.9868665 0.9868555 -0.9999099 0.989592 0.9895851 -0.9999288 0.9917564 0.9917521 -0.9999437 0.9934734 0.9934707 -0.0051514 0.8407292 0.2616881 -0.0051286 0.8405071 0.2612639 -0.0051047 0.8402274 0.2607307 -0.0050826 0.8398756 0.2600619 -0.0050676 0.8394338 0.2592249 -0.0050694 0.8388802 0.2581807 -0.0051048 0.8381886 0.2568833 -0.0052028 0.8373283 0.2552802 -0.0054121 0.8362644 0.253314 -0.0058134 0.8349593 0.2509269 -0.0065402 0.8333779 0.2480701 -0.0078103 0.8314967 0.2447216 -0.0099781 0.8293233 0.2409195 -0.0136166 0.8269342 0.2368203 -0.0196467 0.8245426 0.232799 -0.0295373 0.8226154 0.229617 -0.0455041 0.8219901 0.2285954 -0.0671656 0.8219901 0.2285954 -0.0945703 0.8219901 0.2285954 -0.1292408 0.8219901 0.2285954 -0.1731034 0.8219901 0.2285954 -0.2285954 0.8219901 0.2285954 -0.2988 0.8219901 0.2285954 -0.3876179 0.8219901 0.2285954 -0.4999841 0.8219901 0.2285954 -0.6421419 0.8219901 0.2285954 -0.8219901 0.8219901 0.2285954 -0.8967447 0.7069963 0.2121385 -0.9325696 0.5948423 0.2059983 -0.9531389 0.5123112 0.2149085 -0.9661878 0.4617052 0.2383533 -0.9749962 0.4397163 0.2745562 -0.9811943 0.4415982 0.3212519 -0.9856839 0.4623142 0.3758911 -0.9890048 0.4969305 0.4357648 -0.9914995 0.5408288 0.498157 -0.9933953 0.5898847 0.5605276 -0.9948487 0.6406203 0.6206891 -0.9959706 0.6903044 0.6769378 -0.9968409 0.7369774 0.7281127 -0.9975189 0.7794007 0.7735795 -0.9980488 0.8169474 0.8131577 -0.9984638 0.8494644 0.8470154 -0.9987895 0.8771307 0.875558 -0.9990455 0.9003323 0.8993275 -0.999247 0.9195625 0.9189234 -0.9994057 0.9353505 0.9349454 -0.9995308 0.9482135 0.9479575 -0.9996295 0.9586291 0.9584677 -0.9997074 0.9670214 0.9669198 -0.9997688 0.9737569 0.973693 -0.9998174 0.9791456 0.9791055 -0.9998557 0.9834461 0.9834209 -0.999886 0.9868713 0.9868555 -0.9999099 0.989595 0.9895851 -0.9999288 0.9917582 0.9917521 -0.9999437 0.9934746 0.9934707 -0.0279321 0.9033413 0.2402747 -0.0278872 0.9032596 0.239913 -0.0278347 0.9031567 0.2394584 -0.0277752 0.9030276 0.2388883 -0.0277111 0.9028657 0.2381749 -0.0276479 0.9026634 0.2372851 -0.0275966 0.9024114 0.2361798 -0.0275778 0.9020992 0.2348144 -0.0276281 0.9017148 0.2331404 -0.0278105 0.9012461 0.2311088 -0.0282324 0.900682 0.2286785 -0.0290732 0.9000167 0.2258315 -0.0306306 0.8992555 0.2226006 -0.0333932 0.8984278 0.2191191 -0.0381561 0.8976087 0.2157054 -0.0461985 0.8969554 0.2130052 -0.0594506 0.8967447 0.2121385 -0.0775151 0.8967447 0.2121385 -0.1003691 0.8967447 0.2121385 -0.1292823 0.8967447 0.2121385 -0.1658613 0.8967447 0.2121385 -0.2121385 0.8967447 0.2121385 -0.2706852 0.8967447 0.2121385 -0.3447543 0.8967447 0.2121385 -0.4384614 0.8967447 0.2121385 -0.557013 0.8967447 0.2121385 -0.7069963 0.8967447 0.2121385 -0.8967447 0.8967447 0.2121385 -0.9325696 0.7439407 0.2059983 -0.9531389 0.6263473 0.2149085 -0.9661878 0.5473473 0.2383533 -0.9749962 0.5030453 0.2745562 -0.9811943 0.4877437 0.3212519 -0.9856839 0.4954523 0.3758911 -0.9890048 0.5203839 0.4357648 -0.9914995 0.5571908 0.498157 -0.9933953 0.6011414 0.5605276 -0.9948487 0.6482627 0.6206891 -0.9959706 0.6954296 0.6769378 -0.9968409 0.7403765 0.7281127 -0.9975189 0.7816327 0.7735795 -0.9980488 0.8184005 0.8131577 -0.9984638 0.8504035 0.8470154 -0.9987895 0.8777338 0.875558 -0.9990455 0.9007175 0.8993275 -0.999247 0.9198076 0.9189234 -0.9994057 0.9355059 0.9349454 -0.9995308 0.9483117 0.9479575 -0.9996295 0.958691 0.9584677 -0.9997074 0.9670604 0.9669198 -0.9997688 0.9737814 0.973693 -0.9998174 0.979161 0.9791055 -0.9998557 0.9834557 0.9834209 -0.999886 0.9868773 0.9868555 -0.9999099 0.9895988 0.9895851 -0.9999288 0.9917606 0.9917521 -0.9999437 0.9934761 0.9934707 -0.0624569 0.9354466 0.2297741 -0.0624063 0.9354101 0.2294673 -0.0623458 0.9353643 0.2290819 -0.0622749 0.9353068 0.2285984 -0.0621943 0.9352348 0.2279936 -0.0621069 0.9351449 0.2272394 -0.0620199 0.9350332 0.2263028 -0.0619473 0.9348949 0.2251463 -0.061916 0.9347252 0.2237288 -0.0619734 0.9345187 0.2220095 -0.062202 0.9342712 0.219954 -0.062742 0.9339805 0.2175476 -0.0638283 0.9336494 0.2148189 -0.0658501 0.9332914 0.2118811 -0.0694453 0.9329391 0.209003 -0.0756464 0.9326595 0.2067281 -0.0860209 0.9325696 0.2059983 -0.1002154 0.9325696 0.2059983 -0.1181733 0.9325696 0.2059983 -0.1408925 0.9325696 0.2059983 -0.1696351 0.9325696 0.2059983 -0.2059983 0.9325696 0.2059983 -0.2520025 0.9325696 0.2059983 -0.3102037 0.9325696 0.2059983 -0.3838358 0.9325696 0.2059983 -0.4769901 0.9325696 0.2059983 -0.5948423 0.9325696 0.2059983 -0.7439407 0.9325696 0.2059983 -0.9325696 0.9325696 0.2059983 -0.9531389 0.7706179 0.2149085 -0.9661878 0.6556956 0.2383533 -0.9749962 0.5831647 0.2745562 -0.9811943 0.5461239 0.3212519 -0.9856839 0.5373763 0.3758911 -0.9890048 0.5500554 0.4357648 -0.9914995 0.577891 0.498157 -0.9933953 0.6153825 0.5605276 -0.9948487 0.6579314 0.6206891 -0.9959706 0.7019138 0.6769378 -0.9968409 0.7446768 0.7281127 -0.9975189 0.7844566 0.7735795 -0.9980488 0.8202389 0.8131577 -0.9984638 0.8515915 0.8470154 -0.9987895 0.8784967 0.875558 -0.9990455 0.9012049 0.8993275 -0.999247 0.9201176 0.9189234 -0.9994057 0.9357024 0.9349454 -0.9995308 0.9484359 0.9479575 -0.9996295 0.9587693 0.9584677 -0.9997074 0.9671097 0.9669198 -0.9997688 0.9738123 0.973693 -0.9998174 0.9791804 0.9791055 -0.9998557 0.9834679 0.9834209 -0.999886 0.986885 0.9868555 -0.9999099 0.9896036 0.9895851 -0.9999288 0.9917636 0.9917521 -0.9999437 0.9934779 0.9934707 -0.1059991 0.9545467 0.2345119 -0.1059489 0.9545286 0.234258 -0.1058883 0.9545059 0.2339389 -0.1058162 0.9544774 0.2335388 -0.1057322 0.9544418 0.2330383 -0.1056375 0.9543974 0.2324144 -0.1055364 0.9543421 0.2316398 -0.1054384 0.9542739 0.2306836 -0.1053624 0.9541902 0.2295123 -0.1053433 0.9540886 0.2280923 -0.1054431 0.9539671 0.2263957 -0.1057683 0.9538247 0.224411 -0.1064997 0.953663 0.2221626 -0.1079385 0.9534887 0.2197441 -0.1105818 0.9533177 0.2173771 -0.1152388 0.9531823 0.2155079 -0.1231452 0.9531389 0.2149085 -0.1340017 0.9531389 0.2149085 -0.1477366 0.9531389 0.2149085 -0.1651131 0.9531389 0.2149085 -0.1870965 0.9531389 0.2149085 -0.2149085 0.9531389 0.2149085 -0.2500942 0.9531389 0.2149085 -0.2946088 0.9531389 0.2149085 -0.3509254 0.9531389 0.2149085 -0.4221733 0.9531389 0.2149085 -0.5123112 0.9531389 0.2149085 -0.6263473 0.9531389 0.2149085 -0.7706179 0.9531389 0.2149085 -0.9531389 0.9531389 0.2149085 -0.9661878 0.7927704 0.2383533 -0.9749962 0.6845262 0.2745562 -0.9811943 0.6199824 0.3212519 -0.9856839 0.5904156 0.3758911 -0.9890048 0.5875938 0.4357648 -0.9914995 0.6040793 0.498157 -0.9933953 0.6333995 0.5605276 -0.9948487 0.6701635 0.6206891 -0.9959706 0.710117 0.6769378 -0.9968409 0.7501172 0.7281127 -0.9975189 0.7880291 0.7735795 -0.9980488 0.8225647 0.8131577 -0.9984638 0.8530945 0.8470154 -0.9987895 0.8794619 0.875558 -0.9990455 0.9018215 0.8993275 -0.999247 0.9205098 0.9189234 -0.9994057 0.935951 0.9349454 -0.9995308 0.9485931 0.9479575 -0.9996295 0.9588684 0.9584677 -0.9997074 0.967172 0.9669198 -0.9997688 0.9738515 0.973693 -0.9998174 0.979205 0.9791055 -0.9998557 0.9834833 0.9834209 -0.999886 0.9868946 0.9868555 -0.9999099 0.9896096 0.9895851 -0.9999288 0.9917674 0.9917521 -0.9999437 0.9934803 0.9934707 -0.1572498 0.9669269 0.2541551 -0.1572031 0.9669173 0.2539496 -0.1571463 0.9669053 0.2536915 -0.1570779 0.9668902 0.2533679 -0.1569971 0.9668714 0.2529632 -0.156904 0.9668479 0.2524587 -0.1568008 0.9668187 0.2518326 -0.1566936 0.9667827 0.25106 -0.1565954 0.9667385 0.2501139 -0.1565315 0.966685 0.2489674 -0.1565473 0.9666211 0.2475986 -0.1567226 0.9665463 0.2459984 -0.1571937 0.9664615 0.244187 -0.15819 0.9663702 0.2422403 -0.160092 0.9662809 0.2403368 -0.1635226 0.9662104 0.2388348 -0.1694384 0.9661878 0.2383533 -0.1775917 0.9661878 0.2383533 -0.1879067 0.9661878 0.2383533 -0.2009566 0.9661878 0.2383533 -0.2174663 0.9661878 0.2383533 -0.2383533 0.9661878 0.2383533 -0.2647781 0.9661878 0.2383533 -0.2982089 0.9661878 0.2383533 -0.3405032 0.9661878 0.2383533 -0.3940109 0.9661878 0.2383533 -0.4617052 0.9661878 0.2383533 -0.5473473 0.9661878 0.2383533 -0.6556956 0.9661878 0.2383533 -0.7927704 0.9661878 0.2383533 -0.9661878 0.9661878 0.2383533 -0.9749962 0.8127617 0.2745562 -0.9811943 0.713423 0.3212519 -0.9856839 0.6575172 0.3758911 -0.9890048 0.6350848 0.4357648 -0.9914995 0.637211 0.498157 -0.9933953 0.6561933 0.5605276 -0.9948487 0.6856388 0.6206891 -0.9959706 0.7204952 0.6769378 -0.9968409 0.757 0.7281127 -0.9975189 0.7925488 0.7735795 -0.9980488 0.8255071 0.8131577 -0.9984638 0.8549959 0.8470154 -0.9987895 0.880683 0.875558 -0.9990455 0.9026016 0.8993275 -0.999247 0.9210061 0.9189234 -0.9994057 0.9362655 0.9349454 -0.9995308 0.9487918 0.9479575 -0.9996295 0.9589938 0.9584677 -0.9997074 0.9672509 0.9669198 -0.9997688 0.9739011 0.973693 -0.9998174 0.9792361 0.9791055 -0.9998557 0.9835029 0.9834209 -0.999886 0.9869069 0.9868555 -0.9999099 0.9896173 0.9895851 -0.9999288 0.9917722 0.9917521 -0.9999437 0.9934833 0.9934707 -0.2151269 0.9754027 0.2870375 -0.2150852 0.9753975 0.2868747 -0.2150342 0.9753908 0.2866702 -0.2149725 0.9753825 0.2864139 -0.2148987 0.9753721 0.2860933 -0.2148124 0.9753591 0.2856938 -0.2147144 0.975343 0.2851981 -0.2146085 0.9753231 0.2845866 -0.2145034 0.9752987 0.283838 -0.2144168 0.9752692 0.2829313 -0.2143816 0.975234 0.2818492 -0.2144566 0.9751928 0.280585 -0.2147432 0.9751462 0.2791549 -0.2154135 0.9750962 0.2776191 -0.2167545 0.9750472 0.2761186 -0.2192389 0.9750086 0.2749353 -0.2235962 0.9749962 0.2745562 -0.2296253 0.9749962 0.2745562 -0.2372529 0.9749962 0.2745562 -0.2469027 0.9749962 0.2745562 -0.2591111 0.9749962 0.2745562 -0.2745562 0.9749962 0.2745562 -0.2940963 0.9749962 0.2745562 -0.3188171 0.9749962 0.2745562 -0.3500921 0.9749962 0.2745562 -0.389659 0.9749962 0.2745562 -0.4397163 0.9749962 0.2745562 -0.5030453 0.9749962 0.2745562 -0.5831647 0.9749962 0.2745562 -0.6845262 0.9749962 0.2745562 -0.8127617 0.9749962 0.2745562 -0.9749962 0.9749962 0.2745562 -0.9811943 0.8316375 0.3212519 -0.9856839 0.7424095 0.3758911 -0.9890048 0.695167 0.4357648 -0.9914995 0.6791269 0.498157 -0.9933953 0.6850303 0.5605276 -0.9948487 0.7052169 0.6206891 -0.9959706 0.733625 0.6769378 -0.9968409 0.7657077 0.7281127 -0.9975189 0.7982669 0.7735795 -0.9980488 0.8292297 0.8131577 -0.9984638 0.8574015 0.8470154 -0.9987895 0.8822279 0.875558 -0.9990455 0.9035886 0.8993275 -0.999247 0.9216339 0.9189234 -0.9994057 0.9366635 0.9349454 -0.9995308 0.9490434 0.9479575 -0.9996295 0.9591524 0.9584677 -0.9997074 0.9673508 0.9669198 -0.9997688 0.9739638 0.973693 -0.9998174 0.9792755 0.9791055 -0.9998557 0.9835276 0.9834209 -0.999886 0.9869223 0.9868555 -0.9999099 0.989627 0.9895851 -0.9999288 0.9917782 0.9917521 -0.9999437 0.9934871 0.9934707 -0.2783684 0.9814251 0.3309236 -0.2783325 0.9814221 0.3307971 -0.2782884 0.9814183 0.3306382 -0.2782347 0.9814136 0.3304391 -0.2781701 0.9814076 0.3301901 -0.2780936 0.9814002 0.3298799 -0.2780055 0.9813911 0.3294951 -0.2779077 0.9813797 0.3290204 -0.2778058 0.9813659 0.3284395 -0.2777122 0.9813491 0.3277361 -0.2776503 0.9813291 0.3268971 -0.2776626 0.9813057 0.3259173 -0.2778236 0.9812792 0.3248095 -0.2782606 0.9812508 0.3236207 -0.2791873 0.9812231 0.3224598 -0.2809573 0.9812013 0.321545 -0.2841192 0.9811943 0.3212519 -0.2885124 0.9811943 0.3212519 -0.2940703 0.9811943 0.3212519 -0.3011018 0.9811943 0.3212519 -0.3099976 0.9811943 0.3212519 -0.3212519 0.9811943 0.3212519 -0.3354901 0.9811943 0.3212519 -0.3535032 0.9811943 0.3212519 -0.3762922 0.9811943 0.3212519 -0.4051232 0.9811943 0.3212519 -0.4415982 0.9811943 0.3212519 -0.4877437 0.9811943 0.3212519 -0.5461239 0.9811943 0.3212519 -0.6199824 0.9811943 0.3212519 -0.713423 0.9811943 0.3212519 -0.8316375 0.9811943 0.3212519 -0.9811943 0.9811943 0.3212519 -0.9856839 0.8498092 0.3758911 -0.9890048 0.7711789 0.4357648 -0.9914995 0.7321559 0.498157 -0.9933953 0.721513 0.5605276 -0.9948487 0.7299859 0.6206891 -0.9959706 0.7502359 0.6769378 -0.9968409 0.776724 0.7281127 -0.9975189 0.8055009 0.7735795 -0.9980488 0.8339392 0.8131577 -0.9984638 0.8604449 0.8470154 -0.9987895 0.8841823 0.875558 -0.9990455 0.9048372 0.8993275 -0.999247 0.9224281 0.9189234 -0.9994057 0.9371669 0.9349454 -0.9995308 0.9493615 0.9479575 -0.9996295 0.959353 0.9584677 -0.9997074 0.967477 0.9669198 -0.9997688 0.9740432 0.973693 -0.9998174 0.9793253 0.9791055 -0.9998557 0.9835588 0.9834209 -0.999886 0.9869419 0.9868555 -0.9999099 0.9896392 0.9895851 -0.9999288 0.9917859 0.9917521 -0.9999437 0.9934919 0.9934707 -0.3454107 0.9858181 0.3832459 -0.3453807 0.9858163 0.3831496 -0.3453439 0.9858141 0.3830285 -0.3452987 0.9858113 0.3828768 -0.3452442 0.9858079 0.3826871 -0.3451791 0.9858036 0.3824508 -0.3451032 0.9857982 0.3821577 -0.3450175 0.9857916 0.3817962 -0.3449254 0.9857835 0.3813539 -0.3448353 0.9857738 0.3808186 -0.3447636 0.9857621 0.3801802 -0.3447407 0.9857485 0.379435 -0.3448204 0.9857332 0.3785929 -0.3450957 0.9857167 0.3776896 -0.3457234 0.9857006 0.376808 -0.3469645 0.9856879 0.3761135 -0.3492254 0.9856839 0.3758911 -0.3523802 0.9856839 0.3758911 -0.3563715 0.9856839 0.3758911 -0.3614209 0.9856839 0.3758911 -0.3678092 0.9856839 0.3758911 -0.3758911 0.9856839 0.3758911 -0.3861159 0.9856839 0.3758911 -0.3990515 0.9856839 0.3758911 -0.4154167 0.9856839 0.3758911 -0.4361208 0.9856839 0.3758911 -0.4623142 0.9856839 0.3758911 -0.4954523 0.9856839 0.3758911 -0.5373763 0.9856839 0.3758911 -0.5904156 0.9856839 0.3758911 -0.6575172 0.9856839 0.3758911 -0.7424095 0.9856839 0.3758911 -0.8498092 0.9856839 0.3758911 -0.9856839 0.9856839 0.3758911 -0.9890048 0.8673437 0.4357648 -0.9914995 0.7992446 0.498157 -0.9933953 0.7676683 0.5605276 -0.9948487 0.7613218 0.6206891 -0.9959706 0.7712508 0.6769378 -0.9968409 0.7906611 0.7281127 -0.9975189 0.8146529 0.7735795 -0.9980488 0.8398974 0.8131577 -0.9984638 0.8642952 0.8470154 -0.9987895 0.886655 0.875558 -0.9990455 0.9064168 0.8993275 -0.999247 0.9234329 0.9189234 -0.9994057 0.9378038 0.9349454 -0.9995308 0.9497641 0.9479575 -0.9996295 0.9596068 0.9584677 -0.9997074 0.9676368 0.9669198 -0.9997688 0.9741436 0.973693 -0.9998174 0.9793883 0.9791055 -0.9998557 0.9835983 0.9834209 -0.999886 0.9869667 0.9868555 -0.9999099 0.9896547 0.9895851 -0.9999288 0.9917956 0.9917521 -0.9999437 0.993498 0.9934707 -0.4144197 0.9890841 0.4412534 -0.4143955 0.9890831 0.4411814 -0.4143657 0.9890818 0.4410909 -0.414329 0.9890801 0.4409775 -0.4142845 0.9890781 0.4408357 -0.4142311 0.9890755 0.4406591 -0.4141683 0.9890723 0.4404401 -0.4140964 0.9890684 0.4401701 -0.4140176 0.9890637 0.4398397 -0.4139373 0.9890579 0.4394399 -0.4138668 0.989051 0.4389633 -0.4138277 0.989043 0.4384071 -0.4138582 0.9890339 0.4377789 -0.4140252 0.9890241 0.4371052 -0.4144423 0.9890146 0.436448 -0.4152991 0.9890072 0.4359305 -0.4168922 0.9890048 0.4357648 -0.419125 0.9890048 0.4357648 -0.4219498 0.9890048 0.4357648 -0.4255236 0.9890048 0.4357648 -0.4300448 0.9890048 0.4357648 -0.4357648 0.9890048 0.4357648 -0.4430013 0.9890048 0.4357648 -0.4521565 0.9890048 0.4357648 -0.4637389 0.9890048 0.4357648 -0.4783922 0.9890048 0.4357648 -0.4969305 0.9890048 0.4357648 -0.5203839 0.9890048 0.4357648 -0.5500554 0.9890048 0.4357648 -0.5875938 0.9890048 0.4357648 -0.6350848 0.9890048 0.4357648 -0.695167 0.9890048 0.4357648 -0.7711789 0.9890048 0.4357648 -0.8673437 0.9890048 0.4357648 -0.9890048 0.9890048 0.4357648 -0.9914995 0.8841204 0.498157 -0.9933953 0.8260608 0.5605276 -0.9948487 0.8009659 0.6206891 -0.9959706 0.7978374 0.6769378 -0.9968409 0.8082934 0.7281127 -0.9975189 0.8262314 0.7735795 -0.9980488 0.8474353 0.8131577 -0.9984638 0.8691663 0.8470154 -0.9987895 0.8897832 0.875558 -0.9990455 0.9084153 0.8993275 -0.999247 0.9247041 0.9189234 -0.9994057 0.9386096 0.9349454 -0.9995308 0.9502734 0.9479575 -0.9996295 0.959928 0.9584677 -0.9997074 0.9678389 0.9669198 -0.9997688 0.9742706 0.973693 -0.9998174 0.9794681 0.9791055 -0.9998557 0.9836483 0.9834209 -0.999886 0.986998 0.9868555 -0.9999099 0.9896744 0.9895851 -0.9999288 0.9918079 0.9917521 -0.9999437 0.9935057 0.9934707 -0.4834235 0.9915469 0.5021764 -0.4834045 0.9915463 0.5021236 -0.4833811 0.9915455 0.5020572 -0.4833522 0.9915446 0.5019741 -0.4833171 0.9915433 0.5018701 -0.4832747 0.9915418 0.5017407 -0.4832246 0.9915399 0.5015801 -0.4831666 0.9915376 0.5013822 -0.4831021 0.9915347 0.50114 -0.4830346 0.9915312 0.5008471 -0.4829718 0.9915271 0.5004979 -0.4829286 0.9915223 0.5000906 -0.4829319 0.9915169 0.4996306 -0.4830292 0.991511 0.4991376 -0.4833013 0.9915054 0.4986567 -0.4838841 0.9915009 0.4982782 -0.4849907 0.9914995 0.498157 -0.4865484 0.9914995 0.498157 -0.4885191 0.9914995 0.498157 -0.4910123 0.9914995 0.498157 -0.4941665 0.9914995 0.498157 -0.498157 0.9914995 0.498157 -0.5032055 0.9914995 0.498157 -0.5095925 0.9914995 0.498157 -0.5176729 0.9914995 0.498157 -0.5278957 0.9914995 0.498157 -0.5408288 0.9914995 0.498157 -0.5571908 0.9914995 0.498157 -0.577891 0.9914995 0.498157 -0.6040793 0.9914995 0.498157 -0.637211 0.9914995 0.498157 -0.6791269 0.9914995 0.498157 -0.7321559 0.9914995 0.498157 -0.7992446 0.9914995 0.498157 -0.8841204 0.9914995 0.498157 -0.9914995 0.9914995 0.498157 -0.9933953 0.8999349 0.5605276 -0.9948487 0.8511207 0.6206891 -0.9959706 0.8314729 0.6769378 -0.9968409 0.8306004 0.7281127 -0.9975189 0.8408797 0.7735795 -0.9980488 0.8569716 0.8131577 -0.9984638 0.875329 0.8470154 -0.9987895 0.8937407 0.875558 -0.9990455 0.9109436 0.8993275 -0.999247 0.9263124 0.9189234 -0.9994057 0.939629 0.9349454 -0.9995308 0.9509177 0.9479575 -0.9996295 0.9603343 0.9584677 -0.9997074 0.9680946 0.9669198 -0.9997688 0.9744313 0.973693 -0.9998174 0.9795689 0.9791055 -0.9998557 0.9837116 0.9834209 -0.999886 0.9870376 0.9868555 -0.9999099 0.9896992 0.9895851 -0.9999288 0.9918234 0.9917521 -0.9999437 0.9935154 0.9934707 -0.5504963 0.993424 0.5634166 -0.5504818 0.9934236 0.5633786 -0.550464 0.9934231 0.5633309 -0.5504419 0.9934225 0.563271 -0.550415 0.9934218 0.5631962 -0.5503825 0.9934209 0.5631031 -0.5503438 0.9934197 0.5629876 -0.5502987 0.9934183 0.5628452 -0.550248 0.9934166 0.562671 -0.5501939 0.9934145 0.5624604 -0.5501416 0.993412 0.5622093 -0.5501012 0.9934091 0.5619166 -0.5500915 0.9934058 0.561586 -0.5501456 0.9934023 0.5612317 -0.5503203 0.9933988 0.5608864 -0.5507113 0.9933961 0.5606145 -0.5514695 0.9933953 0.5605276 -0.5525411 0.9933953 0.5605276 -0.5538969 0.9933953 0.5605276 -0.5556122 0.9933953 0.5605276 -0.5577822 0.9933953 0.5605276 -0.5605276 0.9933953 0.5605276 -0.5640008 0.9933953 0.5605276 -0.5683949 0.9933953 0.5605276 -0.573954 0.9933953 0.5605276 -0.580987 0.9933953 0.5605276 -0.5898847 0.9933953 0.5605276 -0.6011414 0.9933953 0.5605276 -0.6153825 0.9933953 0.5605276 -0.6333995 0.9933953 0.5605276 -0.6561933 0.9933953 0.5605276 -0.6850303 0.9933953 0.5605276 -0.721513 0.9933953 0.5605276 -0.7676683 0.9933953 0.5605276 -0.8260608 0.9933953 0.5605276 -0.8999349 0.9933953 0.5605276 -0.9933953 0.9933953 0.5605276 -0.9948487 0.9145732 0.6206891 -0.9959706 0.8740262 0.6769378 -0.9968409 0.8588218 0.7281127 -0.9975189 0.8594117 0.7735795 -0.9980488 0.8690364 0.8131577 -0.9984638 0.8831255 0.8470154 -0.9987895 0.8987476 0.875558 -0.9990455 0.9141422 0.8993275 -0.999247 0.928347 0.9189234 -0.9994057 0.9409186 0.9349454 -0.9995308 0.9517328 0.9479575 -0.9996295 0.9608482 0.9584677 -0.9997074 0.9684181 0.9669198 -0.9997688 0.9746346 0.973693 -0.9998174 0.9796966 0.9791055 -0.9998557 0.9837916 0.9834209 -0.999886 0.9870878 0.9868555 -0.9999099 0.9897306 0.9895851 -0.9999288 0.9918431 0.9917521 -0.9999437 0.9935277 0.9934707 -0.6139459 0.9948662 0.6227284 -0.6139352 0.994866 0.6227016 -0.6139219 0.9948657 0.6226678 -0.6139056 0.9948653 0.6226256 -0.6138855 0.9948649 0.6225727 -0.6138613 0.9948643 0.6225069 -0.6138323 0.9948636 0.6224253 -0.6137984 0.9948628 0.6223247 -0.6137599 0.9948617 0.6222018 -0.6137183 0.9948604 0.622053 -0.6136769 0.9948589 0.6218758 -0.6136427 0.9948571 0.6216691 -0.6136284 0.9948551 0.6214357 -0.6136569 0.994853 0.6211858 -0.6137675 0.9948509 0.6209421 -0.6140266 0.9948493 0.6207504 -0.6145393 0.9948487 0.6206891 -0.6152669 0.9948487 0.6206891 -0.6161874 0.9948487 0.6206891 -0.6173519 0.9948487 0.6206891 -0.6188252 0.9948487 0.6206891 -0.6206891 0.9948487 0.6206891 -0.6230471 0.9948487 0.6206891 -0.6260304 0.9948487 0.6206891 -0.6298046 0.9948487 0.6206891 -0.6345795 0.9948487 0.6206891 -0.6406203 0.9948487 0.6206891 -0.6482627 0.9948487 0.6206891 -0.6579314 0.9948487 0.6206891 -0.6701635 0.9948487 0.6206891 -0.6856388 0.9948487 0.6206891 -0.7052169 0.9948487 0.6206891 -0.7299859 0.9948487 0.6206891 -0.7613218 0.9948487 0.6206891 -0.8009659 0.9948487 0.6206891 -0.8511207 0.9948487 0.6206891 -0.9145732 0.9948487 0.6206891 -0.9948487 0.9948487 0.6206891 -0.9959706 0.9278617 0.6769378 -0.9968409 0.8945255 0.7281127 -0.9975189 0.8828571 0.7735795 -0.9980488 0.8842998 0.8131577 -0.9984638 0.892989 0.8470154 -0.9987895 0.9050819 0.875558 -0.9990455 0.9181889 0.8993275 -0.999247 0.9309211 0.9189234 -0.9994057 0.9425502 0.9349454 -0.9995308 0.952764 0.9479575 -0.9996295 0.9614985 0.9584677 -0.9997074 0.9688274 0.9669198 -0.9997688 0.9748918 0.973693 -0.9998174 0.979858 0.9791055 -0.9998557 0.9838928 0.9834209 -0.999886 0.9871512 0.9868555 -0.9999099 0.9897703 0.9895851 -0.9999288 0.991868 0.9917521 -0.9999437 0.9935432 0.9934707 -0.6724572 0.9959813 0.678353 -0.6724495 0.9959811 0.6783343 -0.6724399 0.9959809 0.6783109 -0.672428 0.9959807 0.6782815 -0.6724135 0.9959804 0.6782449 -0.6723959 0.9959801 0.6781992 -0.6723748 0.9959797 0.6781425 -0.67235 0.9959791 0.6780727 -0.6723217 0.9959785 0.6779873 -0.6722907 0.9959777 0.6778841 -0.6722594 0.9959768 0.677761 -0.6722322 0.9959757 0.6776176 -0.672218 0.9959745 0.6774557 -0.672232 0.9959732 0.6772823 -0.6723012 0.9959719 0.6771133 -0.6724711 0.9959709 0.6769804 -0.6728136 0.9959706 0.6769378 -0.6733015 0.9959706 0.6769378 -0.6739188 0.9959706 0.6769378 -0.6746998 0.9959706 0.6769378 -0.6756878 0.9959706 0.6769378 -0.6769378 0.9959706 0.6769378 -0.6785192 0.9959706 0.6769378 -0.6805199 0.9959706 0.6769378 -0.683051 0.9959706 0.6769378 -0.6862532 0.9959706 0.6769378 -0.6903044 0.9959706 0.6769378 -0.6954296 0.9959706 0.6769378 -0.7019138 0.9959706 0.6769378 -0.710117 0.9959706 0.6769378 -0.7204952 0.9959706 0.6769378 -0.733625 0.9959706 0.6769378 -0.7502359 0.9959706 0.6769378 -0.7712508 0.9959706 0.6769378 -0.7978374 0.9959706 0.6769378 -0.8314729 0.9959706 0.6769378 -0.8740262 0.9959706 0.6769378 -0.9278617 0.9959706 0.6769378 -0.9959706 0.9959706 0.6769378 -0.9968409 0.9396953 0.7281127 -0.9975189 0.9125186 0.7735795 -0.9980488 0.9036101 0.8131577 -0.9984638 0.9054678 0.8470154 -0.9987895 0.9130957 0.875558 -0.9990455 0.9233085 0.8993275 -0.999247 0.9341777 0.9189234 -0.9994057 0.9446144 0.9349454 -0.9995308 0.9540687 0.9479575 -0.9996295 0.9623212 0.9584677 -0.9997074 0.9693452 0.9669198 -0.9997688 0.9752172 0.973693 -0.9998174 0.9800622 0.9791055 -0.9998557 0.9840209 0.9834209 -0.999886 0.9872315 0.9868555 -0.9999099 0.9898206 0.9895851 -0.9999288 0.9918994 0.9917521 -0.9999437 0.9935629 0.9934707 -0.7251659 0.9968475 0.7290793 -0.7251605 0.9968474 0.7290666 -0.7251537 0.9968473 0.7290505 -0.7251454 0.9968472 0.7290305 -0.7251351 0.996847 0.7290054 -0.7251226 0.9968468 0.7289742 -0.7251076 0.9968465 0.7289355 -0.7250899 0.9968462 0.7288878 -0.7250697 0.9968458 0.7288294 -0.7250473 0.9968453 0.7287589 -0.7250244 0.9968448 0.7286748 -0.7250039 0.9968441 0.7285769 -0.7249916 0.9968433 0.7284663 -0.7249978 0.9968425 0.7283479 -0.7250408 0.9968418 0.7282325 -0.7251511 0.9968411 0.7281418 -0.7253775 0.9968409 0.7281127 -0.7257011 0.9968409 0.7281127 -0.7261105 0.9968409 0.7281127 -0.7266285 0.9968409 0.7281127 -0.7272837 0.9968409 0.7281127 -0.7281127 0.9968409 0.7281127 -0.7291615 0.9968409 0.7281127 -0.7304884 0.9968409 0.7281127 -0.732167 0.9968409 0.7281127 -0.7342907 0.9968409 0.7281127 -0.7369774 0.9968409 0.7281127 -0.7403765 0.9968409 0.7281127 -0.7446768 0.9968409 0.7281127 -0.7501172 0.9968409 0.7281127 -0.757 0.9968409 0.7281127 -0.7657077 0.9968409 0.7281127 -0.776724 0.9968409 0.7281127 -0.7906611 0.9968409 0.7281127 -0.8082934 0.9968409 0.7281127 -0.8306004 0.9968409 0.7281127 -0.8588218 0.9968409 0.7281127 -0.8945255 0.9968409 0.7281127 -0.9396953 0.9968409 0.7281127 -0.9968409 0.9968409 0.7281127 -0.9975189 0.9500442 0.7735795 -0.9980488 0.9280401 0.8131577 -0.9984638 0.921255 0.8470154 -0.9987895 0.9232341 0.875558 -0.9990455 0.9297854 0.8993275 -0.999247 0.9382977 0.9189234 -0.9994057 0.9472259 0.9349454 -0.9995308 0.9557192 0.9479575 -0.9996295 0.963362 0.9584677 -0.9997074 0.9700002 0.9669198 -0.9997688 0.9756289 0.973693 -0.9998174 0.9803206 0.9791055 -0.9998557 0.9841829 0.9834209 -0.999886 0.987333 0.9868555 -0.9999099 0.9898842 0.9895851 -0.9999288 0.9919392 0.9917521 -0.9999437 0.9935878 0.9934707 -0.7716588 0.997523 0.7742304 -0.7716551 0.997523 0.7742218 -0.7716504 0.9975229 0.774211 -0.7716446 0.9975228 0.7741975 -0.7716375 0.9975227 0.7741806 -0.7716288 0.9975226 0.7741595 -0.7716184 0.9975224 0.7741335 -0.7716061 0.9975222 0.7741013 -0.7715919 0.997522 0.774062 -0.7715762 0.9975217 0.7740145 -0.7715599 0.9975213 0.7739579 -0.7715449 0.9975209 0.773892 -0.7715352 0.9975204 0.7738175 -0.7715376 0.9975199 0.7737378 -0.7715641 0.9975194 0.7736602 -0.7716352 0.9975191 0.7735991 -0.7717834 0.9975189 0.7735795 -0.7719959 0.9975189 0.7735795 -0.7722648 0.9975189 0.7735795 -0.7726049 0.9975189 0.7735795 -0.7730352 0.9975189 0.7735795 -0.7735795 0.9975189 0.7735795 -0.7742682 0.9975189 0.7735795 -0.7751395 0.9975189 0.7735795 -0.7762418 0.9975189 0.7735795 -0.7776364 0.9975189 0.7735795 -0.7794007 0.9975189 0.7735795 -0.7816327 0.9975189 0.7735795 -0.7844566 0.9975189 0.7735795 -0.7880291 0.9975189 0.7735795 -0.7925488 0.9975189 0.7735795 -0.7982669 0.9975189 0.7735795 -0.8055009 0.9975189 0.7735795 -0.8146529 0.9975189 0.7735795 -0.8262314 0.9975189 0.7735795 -0.8408797 0.9975189 0.7735795 -0.8594117 0.9975189 0.7735795 -0.8828571 0.9975189 0.7735795 -0.9125186 0.9975189 0.7735795 -0.9500442 0.9975189 0.7735795 -0.9975189 0.9975189 0.7735795 -0.9980488 0.9589472 0.8131577 -0.9984638 0.9412278 0.8470154 -0.9987895 0.9360606 0.875558 -0.9990455 0.9379796 0.8993275 -0.999247 0.94351 0.9189234 -0.9994057 0.9505298 0.9349454 -0.9995308 0.9578074 0.9479575 -0.9996295 0.9646787 0.9584677 -0.9997074 0.970829 0.9669198 -0.9997688 0.9761497 0.973693 -0.9998174 0.9806476 0.9791055 -0.9998557 0.984388 0.9834209 -0.999886 0.9874615 0.9868555 -0.9999099 0.9899646 0.9895851 -0.9999288 0.9919896 0.9917521 -0.9999437 0.9936193 0.9934707 -0.8119154 0.9980513 0.8135904 -0.8119128 0.9980512 0.8135847 -0.8119096 0.9980512 0.8135776 -0.8119057 0.9980511 0.8135686 -0.8119009 0.9980511 0.8135573 -0.8118949 0.998051 0.8135433 -0.8118878 0.9980509 0.813526 -0.8118794 0.9980508 0.8135046 -0.8118697 0.9980506 0.8134785 -0.8118589 0.9980504 0.8134469 -0.8118476 0.9980502 0.8134093 -0.811837 0.99805 0.8133654 -0.8118298 0.9980497 0.8133159 -0.8118303 0.9980494 0.8132629 -0.8118466 0.9980491 0.8132113 -0.8118921 0.9980488 0.8131707 -0.8119884 0.9980488 0.8131577 -0.8121268 0.9980488 0.8131577 -0.8123018 0.9980488 0.8131577 -0.8125232 0.9980488 0.8131577 -0.8128033 0.9980488 0.8131577 -0.8131577 0.9980488 0.8131577 -0.8136061 0.9980488 0.8131577 -0.8141733 0.9980488 0.8131577 -0.8148909 0.9980488 0.8131577 -0.8157988 0.9980488 0.8131577 -0.8169474 0.9980488 0.8131577 -0.8184005 0.9980488 0.8131577 -0.8202389 0.9980488 0.8131577 -0.8225647 0.9980488 0.8131577 -0.8255071 0.9980488 0.8131577 -0.8292297 0.9980488 0.8131577 -0.8339392 0.9980488 0.8131577 -0.8398974 0.9980488 0.8131577 -0.8474353 0.9980488 0.8131577 -0.8569716 0.9980488 0.8131577 -0.8690364 0.9980488 0.8131577 -0.8842998 0.9980488 0.8131577 -0.9036101 0.9980488 0.8131577 -0.9280401 0.9980488 0.8131577 -0.9589472 0.9980488 0.8131577 -0.9980488 0.9980488 0.8131577 -0.9984638 0.9664961 0.8470154 -0.9987895 0.9522877 0.875558 -0.9990455 0.9483463 0.8993275 -0.999247 0.9501042 0.9189234 -0.9994057 0.9547096 0.9349454 -0.9995308 0.9604492 0.9479575 -0.9996295 0.9663445 0.9584677 -0.9997074 0.9718774 0.9669198 -0.9997688 0.9768086 0.973693 -0.9998174 0.9810611 0.9791055 -0.9998557 0.9846473 0.9834209 -0.999886 0.987624 0.9868555 -0.9999099 0.9900664 0.9895851 -0.9999288 0.9920533 0.9917521 -0.9999437 0.9936592 0.9934707 -0.8462171 0.9984653 0.8473 -0.8462154 0.9984653 0.8472963 -0.8462132 0.9984653 0.8472916 -0.8462106 0.9984653 0.8472856 -0.8462073 0.9984652 0.8472782 -0.8462034 0.9984652 0.847269 -0.8461986 0.9984651 0.8472576 -0.8461929 0.998465 0.8472436 -0.8461864 0.9984649 0.8472264 -0.8461791 0.9984648 0.8472056 -0.8461714 0.9984647 0.8471809 -0.8461641 0.9984645 0.847152 -0.8461589 0.9984643 0.8471195 -0.8461587 0.9984642 0.8470846 -0.8461687 0.998464 0.8470507 -0.8461977 0.9984638 0.847024 -0.8462598 0.9984638 0.8470154 -0.8463492 0.9984638 0.8470154 -0.8464623 0.9984638 0.8470154 -0.8466054 0.9984638 0.8470154 -0.8467864 0.9984638 0.8470154 -0.8470154 0.9984638 0.8470154 -0.8473052 0.9984638 0.8470154 -0.8476717 0.9984638 0.8470154 -0.8481355 0.9984638 0.8470154 -0.8487222 0.9984638 0.8470154 -0.8494644 0.9984638 0.8470154 -0.8504035 0.9984638 0.8470154 -0.8515915 0.9984638 0.8470154 -0.8530945 0.9984638 0.8470154 -0.8549959 0.9984638 0.8470154 -0.8574015 0.9984638 0.8470154 -0.8604449 0.9984638 0.8470154 -0.8642952 0.9984638 0.8470154 -0.8691663 0.9984638 0.8470154 -0.875329 0.9984638 0.8470154 -0.8831255 0.9984638 0.8470154 -0.892989 0.9984638 0.8470154 -0.9054678 0.9984638 0.8470154 -0.921255 0.9984638 0.8470154 -0.9412278 0.9984638 0.8470154 -0.9664961 0.9984638 0.8470154 -0.9984638 0.9984638 0.8470154 -0.9987895 0.9728171 0.875558 -0.9990455 0.9614615 0.8993275 -0.999247 0.9584468 0.9189234 -0.9994057 0.9599976 0.9349454 -0.9995308 0.9637914 0.9479575 -0.9996295 0.968452 0.9584677 -0.9997074 0.9732039 0.9669198 -0.9997688 0.9776422 0.973693 -0.9998174 0.9815844 0.9791055 -0.9998557 0.9849754 0.9834209 -0.999886 0.9878296 0.9868555 -0.9999099 0.9901951 0.9895851 -0.9999288 0.9921339 0.9917521 -0.9999437 0.9937096 0.9934707 -0.8750477 0.9987905 0.8757434 -0.8750466 0.9987905 0.875741 -0.8750451 0.9987904 0.8757379 -0.8750434 0.9987904 0.875734 -0.8750412 0.9987904 0.8757292 -0.8750386 0.9987904 0.8757232 -0.8750355 0.9987903 0.8757158 -0.8750317 0.9987903 0.8757066 -0.8750274 0.9987902 0.8756954 -0.8750225 0.9987902 0.8756819 -0.8750173 0.9987901 0.8756658 -0.8750124 0.99879 0.875647 -0.8750088 0.9987899 0.8756258 -0.8750084 0.9987897 0.8756031 -0.8750145 0.9987896 0.8755809 -0.8750329 0.9987895 0.8755636 -0.8750727 0.9987895 0.875558 -0.8751301 0.9987895 0.875558 -0.8752028 0.9987895 0.875558 -0.8752947 0.9987895 0.875558 -0.8754109 0.9987895 0.875558 -0.875558 0.9987895 0.875558 -0.8757441 0.9987895 0.875558 -0.8759795 0.9987895 0.875558 -0.8762773 0.9987895 0.875558 -0.8766541 0.9987895 0.875558 -0.8771307 0.9987895 0.875558 -0.8777338 0.9987895 0.875558 -0.8784967 0.9987895 0.875558 -0.8794619 0.9987895 0.875558 -0.880683 0.9987895 0.875558 -0.8822279 0.9987895 0.875558 -0.8841823 0.9987895 0.875558 -0.886655 0.9987895 0.875558 -0.8897832 0.9987895 0.875558 -0.8937407 0.9987895 0.875558 -0.8987476 0.9987895 0.875558 -0.9050819 0.9987895 0.875558 -0.9130957 0.9987895 0.875558 -0.9232341 0.9987895 0.875558 -0.9360606 0.9987895 0.875558 -0.9522877 0.9987895 0.875558 -0.9728171 0.9987895 0.875558 -0.9987895 0.9987895 0.875558 -0.9990455 0.9780539 0.8993275 -0.999247 0.9690013 0.9189234 -0.9994057 0.9666876 0.9349454 -0.9995308 0.9680197 0.9479575 -0.9996295 0.9711183 0.9584677 -0.9997074 0.974882 0.9669198 -0.9997688 0.9786968 0.973693 -0.9998174 0.9822464 0.9791055 -0.9998557 0.9853905 0.9834209 -0.999886 0.9880897 0.9868555 -0.9999099 0.990358 0.9895851 -0.9999288 0.9922358 0.9917521 -0.9999437 0.9937734 0.9934707 -0.8990028 0.9990461 0.8994474 -0.899002 0.9990461 0.8994458 -0.8990011 0.9990461 0.8994438 -0.899 0.9990461 0.8994413 -0.8989986 0.9990461 0.8994382 -0.8989969 0.9990461 0.8994343 -0.8989948 0.9990461 0.8994295 -0.8989923 0.999046 0.8994236 -0.8989895 0.999046 0.8994164 -0.8989863 0.9990459 0.8994076 -0.8989829 0.9990459 0.8993972 -0.8989796 0.9990458 0.899385 -0.8989771 0.9990458 0.8993713 -0.8989767 0.9990457 0.8993566 -0.8989805 0.9990456 0.8993424 -0.8989921 0.9990456 0.8993311 -0.8990175 0.9990455 0.8993275 -0.8990542 0.9990455 0.8993275 -0.8991006 0.9990455 0.8993275 -0.8991593 0.9990455 0.8993275 -0.8992336 0.9990455 0.8993275 -0.8993275 0.9990455 0.8993275 -0.8994464 0.9990455 0.8993275 -0.8995968 0.9990455 0.8993275 -0.899787 0.9990455 0.8993275 -0.9000277 0.9990455 0.8993275 -0.9003323 0.9990455 0.8993275 -0.9007175 0.9990455 0.8993275 -0.9012049 0.9990455 0.8993275 -0.9018215 0.9990455 0.8993275 -0.9026016 0.9990455 0.8993275 -0.9035886 0.9990455 0.8993275 -0.9048372 0.9990455 0.8993275 -0.9064168 0.9990455 0.8993275 -0.9084153 0.9990455 0.8993275 -0.9109436 0.9990455 0.8993275 -0.9141422 0.9990455 0.8993275 -0.9181889 0.9990455 0.8993275 -0.9233085 0.9990455 0.8993275 -0.9297854 0.9990455 0.8993275 -0.9379796 0.9990455 0.8993275 -0.9483463 0.9990455 0.8993275 -0.9614615 0.9990455 0.8993275 -0.9780539 0.9990455 0.8993275 -0.9990455 0.9990455 0.8993275 -0.999247 0.982354 0.9189234 -0.9994057 0.9751513 0.9349454 -0.9995308 0.9733691 0.9479575 -0.9996295 0.9744915 0.9584677 -0.9997074 0.977005 0.9669198 -0.9997688 0.980031 0.973693 -0.9998174 0.9830838 0.9791055 -0.9998557 0.9859157 0.9834209 -0.999886 0.9884188 0.9868555 -0.9999099 0.9905641 0.9895851 -0.9999288 0.9923648 0.9917521 -0.9999437 0.9938541 0.9934707 -0.9187175 0.9992474 0.9190004 -0.918717 0.9992474 0.9189994 -0.9187164 0.9992474 0.9189981 -0.9187157 0.9992474 0.9189965 -0.9187148 0.9992474 0.9189945 -0.9187137 0.9992474 0.918992 -0.9187123 0.9992473 0.9189889 -0.9187107 0.9992473 0.9189851 -0.9187089 0.9992473 0.9189805 -0.9187068 0.9992473 0.9189748 -0.9187045 0.9992472 0.9189681 -0.9187024 0.9992472 0.9189603 -0.9187008 0.9992472 0.9189515 -0.9187004 0.9992471 0.9189421 -0.9187027 0.9992471 0.9189329 -0.9187101 0.999247 0.9189257 -0.9187262 0.999247 0.9189234 -0.9187495 0.999247 0.9189234 -0.9187791 0.999247 0.9189234 -0.9188164 0.999247 0.9189234 -0.9188636 0.999247 0.9189234 -0.9189234 0.999247 0.9189234 -0.918999 0.999247 0.9189234 -0.9190947 0.999247 0.9189234 -0.9192157 0.999247 0.9189234 -0.9193688 0.999247 0.9189234 -0.9195625 0.999247 0.9189234 -0.9198076 0.999247 0.9189234 -0.9201176 0.999247 0.9189234 -0.9205098 0.999247 0.9189234 -0.9210061 0.999247 0.9189234 -0.9216339 0.999247 0.9189234 -0.9224281 0.999247 0.9189234 -0.9234329 0.999247 0.9189234 -0.9247041 0.999247 0.9189234 -0.9263124 0.999247 0.9189234 -0.928347 0.999247 0.9189234 -0.9309211 0.999247 0.9189234 -0.9341777 0.999247 0.9189234 -0.9382977 0.999247 0.9189234 -0.94351 0.999247 0.9189234 -0.9501042 0.999247 0.9189234 -0.9584468 0.999247 0.9189234 -0.9690013 0.999247 0.9189234 -0.982354 0.999247 0.9189234 -0.999247 0.999247 0.9189234 -0.9994057 0.9858591 0.9349454 -0.9995308 0.9801368 0.9479575 -0.9996295 0.978759 0.9584677 -0.9997074 0.9796909 0.9669198 -0.9997688 0.981719 0.973693 -0.9998174 0.9841433 0.9791055 -0.9998557 0.9865801 0.9834209 -0.999886 0.9888351 0.9868555 -0.9999099 0.9908248 0.9895851 -0.9999288 0.992528 0.9917521 -0.9999437 0.9939562 0.9934707 -0.9348153 0.999406 0.9349946 -0.9348149 0.999406 0.9349939 -0.9348146 0.999406 0.9349931 -0.9348141 0.999406 0.9349921 -0.9348135 0.999406 0.9349908 -0.9348128 0.9994059 0.9349892 -0.9348119 0.9994059 0.9349873 -0.9348109 0.9994059 0.9349848 -0.9348097 0.9994059 0.9349819 -0.9348083 0.9994059 0.9349783 -0.9348069 0.9994059 0.934974 -0.9348055 0.9994059 0.934969 -0.9348044 0.9994058 0.9349634 -0.9348042 0.9994058 0.9349574 -0.9348056 0.9994058 0.9349515 -0.9348102 0.9994057 0.9349469 -0.9348204 0.9994057 0.9349454 -0.9348352 0.9994057 0.9349454 -0.9348539 0.9994057 0.9349454 -0.9348776 0.9994057 0.9349454 -0.9349075 0.9994057 0.9349454 -0.9349454 0.9994057 0.9349454 -0.9349933 0.9994057 0.9349454 -0.935054 0.9994057 0.9349454 -0.9351307 0.9994057 0.9349454 -0.9352277 0.9994057 0.9349454 -0.9353505 0.9994057 0.9349454 -0.9355059 0.9994057 0.9349454 -0.9357024 0.9994057 0.9349454 -0.935951 0.9994057 0.9349454 -0.9362655 0.9994057 0.9349454 -0.9366635 0.9994057 0.9349454 -0.9371669 0.9994057 0.9349454 -0.9378038 0.9994057 0.9349454 -0.9386096 0.9994057 0.9349454 -0.939629 0.9994057 0.9349454 -0.9409186 0.9994057 0.9349454 -0.9425502 0.9994057 0.9349454 -0.9446144 0.9994057 0.9349454 -0.9472259 0.9994057 0.9349454 -0.9505298 0.9994057 0.9349454 -0.9547096 0.9994057 0.9349454 -0.9599976 0.9994057 0.9349454 -0.9666876 0.9994057 0.9349454 -0.9751513 0.9994057 0.9349454 -0.9858591 0.9994057 0.9349454 -0.9994057 0.9994057 0.9349454 -0.9995308 0.9886988 0.9479575 -0.9996295 0.9841579 0.9584677 -0.9997074 0.983089 0.9669198 -0.9997688 0.9838545 0.973693 -0.9998174 0.9854838 0.9791055 -0.9998557 0.9874207 0.9834209 -0.999886 0.9893618 0.9868555 -0.9999099 0.9911547 0.9895851 -0.9999288 0.9927345 0.9917521 -0.9999437 0.9940854 0.9934707 -0.9478754 0.999531 0.9479888 -0.9478752 0.999531 0.9479884 -0.947875 0.999531 0.9479878 -0.9478746 0.999531 0.9479872 -0.9478743 0.999531 0.9479864 -0.9478738 0.999531 0.9479854 -0.9478733 0.999531 0.9479841 -0.9478726 0.999531 0.9479826 -0.9478718 0.999531 0.9479807 -0.947871 0.9995309 0.9479784 -0.94787 0.9995309 0.9479757 -0.9478691 0.9995309 0.9479725 -0.9478684 0.9995309 0.9479689 -0.9478683 0.9995309 0.9479651 -0.9478691 0.9995309 0.9479614 -0.947872 0.9995309 0.9479584 -0.9478785 0.9995308 0.9479575 -0.9478878 0.9995308 0.9479575 -0.9478997 0.9995308 0.9479575 -0.9479146 0.9995308 0.9479575 -0.9479335 0.9995308 0.9479575 -0.9479575 0.9995308 0.9479575 -0.9479878 0.9995308 0.9479575 -0.9480261 0.9995308 0.9479575 -0.9480746 0.9995308 0.9479575 -0.9481359 0.9995308 0.9479575 -0.9482135 0.9995308 0.9479575 -0.9483117 0.9995308 0.9479575 -0.9484359 0.9995308 0.9479575 -0.9485931 0.9995308 0.9479575 -0.9487918 0.9995308 0.9479575 -0.9490434 0.9995308 0.9479575 -0.9493615 0.9995308 0.9479575 -0.9497641 0.9995308 0.9479575 -0.9502734 0.9995308 0.9479575 -0.9509177 0.9995308 0.9479575 -0.9517328 0.9995308 0.9479575 -0.952764 0.9995308 0.9479575 -0.9540687 0.9995308 0.9479575 -0.9557192 0.9995308 0.9479575 -0.9578074 0.9995308 0.9479575 -0.9604492 0.9995308 0.9479575 -0.9637914 0.9995308 0.9479575 -0.9680197 0.9995308 0.9479575 -0.9733691 0.9995308 0.9479575 -0.9801368 0.9995308 0.9479575 -0.9886988 0.9995308 0.9479575 -0.9995308 0.9995308 0.9479575 -0.9996295 0.9909882 0.9584677 -0.9997074 0.9873879 0.9669198 -0.9997688 0.9865561 0.973693 -0.9998174 0.9871796 0.9791055 -0.9998557 0.9884841 0.9834209 -0.999886 0.9900282 0.9868555 -0.9999099 0.991572 0.9895851 -0.9999288 0.9929957 0.9917521 -0.9999437 0.9942488 0.9934707 -0.958416 0.9996296 0.9584875 -0.9584159 0.9996296 0.9584872 -0.9584157 0.9996296 0.9584869 -0.9584155 0.9996296 0.9584865 -0.9584153 0.9996296 0.958486 -0.958415 0.9996296 0.9584853 -0.9584146 0.9996296 0.9584845 -0.9584142 0.9996296 0.9584835 -0.9584137 0.9996296 0.9584823 -0.9584132 0.9996296 0.9584809 -0.9584126 0.9996296 0.9584792 -0.958412 0.9996296 0.9584772 -0.9584115 0.9996296 0.9584749 -0.9584114 0.9996295 0.9584725 -0.958412 0.9996295 0.9584701 -0.9584138 0.9996295 0.9584683 -0.9584178 0.9996295 0.9584677 -0.9584237 0.9996295 0.9584677 -0.9584312 0.9996295 0.9584677 -0.9584406 0.9996295 0.9584677 -0.9584526 0.9996295 0.9584677 -0.9584677 0.9996295 0.9584677 -0.9584868 0.9996295 0.9584677 -0.9585109 0.9996295 0.9584677 -0.9585415 0.9996295 0.9584677 -0.9585802 0.9996295 0.9584677 -0.9586291 0.9996295 0.9584677 -0.958691 0.9996295 0.9584677 -0.9587693 0.9996295 0.9584677 -0.9588684 0.9996295 0.9584677 -0.9589938 0.9996295 0.9584677 -0.9591524 0.9996295 0.9584677 -0.959353 0.9996295 0.9584677 -0.9596068 0.9996295 0.9584677 -0.959928 0.9996295 0.9584677 -0.9603343 0.9996295 0.9584677 -0.9608482 0.9996295 0.9584677 -0.9614985 0.9996295 0.9584677 -0.9623212 0.9996295 0.9584677 -0.963362 0.9996295 0.9584677 -0.9646787 0.9996295 0.9584677 -0.9663445 0.9996295 0.9584677 -0.968452 0.9996295 0.9584677 -0.9711183 0.9996295 0.9584677 -0.9744915 0.9996295 0.9584677 -0.978759 0.9996295 0.9584677 -0.9841579 0.9996295 0.9584677 -0.9909882 0.9996295 0.9584677 -0.9996295 0.9996295 0.9584677 -0.9997074 0.9928267 0.9669198 -0.9997688 0.9899741 0.973693 -0.9998174 0.989325 0.9791055 -0.9998557 0.9898295 0.9834209 -0.999886 0.9908712 0.9868555 -0.9999099 0.9920999 0.9895851 -0.9999288 0.9933261 0.9917521 -0.9999437 0.9944556 0.9934707 -0.9668873 0.9997074 0.9669323 -0.9668872 0.9997074 0.9669322 -0.9668871 0.9997074 0.966932 -0.966887 0.9997074 0.9669317 -0.9668869 0.9997074 0.9669314 -0.9668867 0.9997074 0.966931 -0.9668865 0.9997074 0.9669305 -0.9668862 0.9997074 0.9669298 -0.9668859 0.9997074 0.9669291 -0.9668855 0.9997074 0.9669282 -0.9668852 0.9997074 0.9669271 -0.9668848 0.9997074 0.9669258 -0.9668845 0.9997074 0.9669244 -0.9668844 0.9997074 0.9669228 -0.9668847 0.9997074 0.9669214 -0.9668859 0.9997074 0.9669202 -0.9668884 0.9997074 0.9669198 -0.9668922 0.9997074 0.9669198 -0.9668969 0.9997074 0.9669198 -0.9669028 0.9997074 0.9669198 -0.9669103 0.9997074 0.9669198 -0.9669198 0.9997074 0.9669198 -0.9669318 0.9997074 0.9669198 -0.966947 0.9997074 0.9669198 -0.9669663 0.9997074 0.9669198 -0.9669906 0.9997074 0.9669198 -0.9670214 0.9997074 0.9669198 -0.9670604 0.9997074 0.9669198 -0.9671097 0.9997074 0.9669198 -0.967172 0.9997074 0.9669198 -0.9672509 0.9997074 0.9669198 -0.9673508 0.9997074 0.9669198 -0.967477 0.9997074 0.9669198 -0.9676368 0.9997074 0.9669198 -0.9678389 0.9997074 0.9669198 -0.9680946 0.9997074 0.9669198 -0.9684181 0.9997074 0.9669198 -0.9688274 0.9997074 0.9669198 -0.9693452 0.9997074 0.9669198 -0.9700002 0.9997074 0.9669198 -0.970829 0.9997074 0.9669198 -0.9718774 0.9997074 0.9669198 -0.9732039 0.9997074 0.9669198 -0.974882 0.9997074 0.9669198 -0.977005 0.9997074 0.9669198 -0.9796909 0.9997074 0.9669198 -0.983089 0.9997074 0.9669198 -0.9873879 0.9997074 0.9669198 -0.9928267 0.9997074 0.9669198 -0.9997074 0.9997074 0.9669198 -0.9997688 0.9942982 0.973693 -0.9998174 0.9920392 0.9791055 -0.9998557 0.9915316 0.9834209 -0.999886 0.9919377 0.9868555 -0.9999099 0.9927678 0.9895851 -0.9999288 0.9937442 0.9917521 -0.9999437 0.9947172 0.9934707 -0.9736726 0.9997689 0.9737009 -0.9736726 0.9997689 0.9737008 -0.9736725 0.9997689 0.9737007 -0.9736724 0.9997689 0.9737005 -0.9736723 0.9997689 0.9737003 -0.9736722 0.9997689 0.9737 -0.9736721 0.9997689 0.9736997 -0.9736719 0.9997689 0.9736993 -0.9736717 0.9997689 0.9736989 -0.9736715 0.9997689 0.9736983 -0.9736712 0.9997689 0.9736976 -0.973671 0.9997689 0.9736968 -0.9736708 0.9997689 0.9736959 -0.9736708 0.9997689 0.9736949 -0.973671 0.9997688 0.973694 -0.9736717 0.9997688 0.9736932 -0.9736733 0.9997688 0.973693 -0.9736756 0.9997688 0.973693 -0.9736786 0.9997688 0.973693 -0.9736823 0.9997688 0.973693 -0.973687 0.9997688 0.973693 -0.973693 0.9997688 0.973693 -0.9737006 0.9997688 0.973693 -0.9737101 0.9997688 0.973693 -0.9737222 0.9997688 0.973693 -0.9737375 0.9997688 0.973693 -0.9737569 0.9997688 0.973693 -0.9737814 0.9997688 0.973693 -0.9738123 0.9997688 0.973693 -0.9738515 0.9997688 0.973693 -0.9739011 0.9997688 0.973693 -0.9739638 0.9997688 0.973693 -0.9740432 0.9997688 0.973693 -0.9741436 0.9997688 0.973693 -0.9742706 0.9997688 0.973693 -0.9744313 0.9997688 0.973693 -0.9746346 0.9997688 0.973693 -0.9748918 0.9997688 0.973693 -0.9752172 0.9997688 0.973693 -0.9756289 0.9997688 0.973693 -0.9761497 0.9997688 0.973693 -0.9768086 0.9997688 0.973693 -0.9776422 0.9997688 0.973693 -0.9786968 0.9997688 0.973693 -0.980031 0.9997688 0.973693 -0.981719 0.9997688 0.973693 -0.9838545 0.9997688 0.973693 -0.9865561 0.9997688 0.973693 -0.9899741 0.9997688 0.973693 -0.9942982 0.9997688 0.973693 -0.9997688 0.9997688 0.973693 -0.9998174 0.9954731 0.9791055 -0.9998557 0.9936849 0.9834209 -0.999886 0.993287 0.9868555 -0.9999099 0.9936128 0.9895851 -0.9999288 0.9942731 0.9917521 -0.9999437 0.9950481 0.9934707 -0.9790927 0.9998174 0.9791105 -0.9790927 0.9998174 0.9791104 -0.9790927 0.9998174 0.9791103 -0.9790926 0.9998174 0.9791102 -0.9790925 0.9998174 0.9791101 -0.9790925 0.9998174 0.9791099 -0.9790924 0.9998174 0.9791097 -0.9790923 0.9998174 0.9791095 -0.9790921 0.9998174 0.9791092 -0.979092 0.9998174 0.9791088 -0.9790919 0.9998174 0.9791084 -0.9790917 0.9998174 0.9791079 -0.9790916 0.9998174 0.9791073 -0.9790916 0.9998174 0.9791067 -0.9790917 0.9998174 0.9791061 -0.9790921 0.9998174 0.9791057 -0.9790931 0.9998174 0.9791055 -0.9790946 0.9998174 0.9791055 -0.9790965 0.9998174 0.9791055 -0.9790988 0.9998174 0.9791055 -0.9791018 0.9998174 0.9791055 -0.9791055 0.9998174 0.9791055 -0.9791103 0.9998174 0.9791055 -0.9791163 0.9998174 0.9791055 -0.9791238 0.9998174 0.9791055 -0.9791334 0.9998174 0.9791055 -0.9791456 0.9998174 0.9791055 -0.979161 0.9998174 0.9791055 -0.9791804 0.9998174 0.9791055 -0.979205 0.9998174 0.9791055 -0.9792361 0.9998174 0.9791055 -0.9792755 0.9998174 0.9791055 -0.9793253 0.9998174 0.9791055 -0.9793883 0.9998174 0.9791055 -0.9794681 0.9998174 0.9791055 -0.9795689 0.9998174 0.9791055 -0.9796966 0.9998174 0.9791055 -0.979858 0.9998174 0.9791055 -0.9800622 0.9998174 0.9791055 -0.9803206 0.9998174 0.9791055 -0.9806476 0.9998174 0.9791055 -0.9810611 0.9998174 0.9791055 -0.9815844 0.9998174 0.9791055 -0.9822464 0.9998174 0.9791055 -0.9830838 0.9998174 0.9791055 -0.9841433 0.9998174 0.9791055 -0.9854838 0.9998174 0.9791055 -0.9871796 0.9998174 0.9791055 -0.989325 0.9998174 0.9791055 -0.9920392 0.9998174 0.9791055 -0.9954731 0.9998174 0.9791055 -0.9998174 0.9998174 0.9791055 -0.9998557 0.9964092 0.9834209 -0.999886 0.9949941 0.9868555 -0.9999099 0.9946818 0.9895851 -0.9999288 0.9949422 0.9917521 -0.9999437 0.9954668 0.9934707 -0.9834129 0.9998557 0.9834241 -0.9834129 0.9998557 0.983424 -0.9834129 0.9998557 0.983424 -0.9834129 0.9998557 0.9834239 -0.9834128 0.9998557 0.9834238 -0.9834128 0.9998557 0.9834237 -0.9834127 0.9998557 0.9834236 -0.9834127 0.9998557 0.9834234 -0.9834126 0.9998557 0.9834233 -0.9834125 0.9998557 0.983423 -0.9834124 0.9998557 0.9834228 -0.9834123 0.9998557 0.9834224 -0.9834122 0.9998557 0.9834221 -0.9834122 0.9998557 0.9834217 -0.9834123 0.9998557 0.9834213 -0.9834126 0.9998557 0.983421 -0.9834132 0.9998557 0.9834209 -0.9834141 0.9998557 0.9834209 -0.9834153 0.9998557 0.9834209 -0.9834167 0.9998557 0.9834209 -0.9834186 0.9998557 0.9834209 -0.9834209 0.9998557 0.9834209 -0.9834239 0.9998557 0.9834209 -0.9834277 0.9998557 0.9834209 -0.9834324 0.9998557 0.9834209 -0.9834385 0.9998557 0.9834209 -0.9834461 0.9998557 0.9834209 -0.9834557 0.9998557 0.9834209 -0.9834679 0.9998557 0.9834209 -0.9834833 0.9998557 0.9834209 -0.9835029 0.9998557 0.9834209 -0.9835276 0.9998557 0.9834209 -0.9835588 0.9998557 0.9834209 -0.9835983 0.9998557 0.9834209 -0.9836483 0.9998557 0.9834209 -0.9837116 0.9998557 0.9834209 -0.9837916 0.9998557 0.9834209 -0.9838928 0.9998557 0.9834209 -0.9840209 0.9998557 0.9834209 -0.9841829 0.9998557 0.9834209 -0.984388 0.9998557 0.9834209 -0.9846473 0.9998557 0.9834209 -0.9849754 0.9998557 0.9834209 -0.9853905 0.9998557 0.9834209 -0.9859157 0.9998557 0.9834209 -0.9865801 0.9998557 0.9834209 -0.9874207 0.9998557 0.9834209 -0.9884841 0.9998557 0.9834209 -0.9898295 0.9998557 0.9834209 -0.9915316 0.9998557 0.9834209 -0.9936849 0.9998557 0.9834209 -0.9964092 0.9998557 0.9834209 -0.9998557 0.9998557 0.9834209 -0.999886 0.9971537 0.9868555 -0.9999099 0.9960342 0.9895851 -0.9999288 0.9957887 0.9917521 -0.9999437 0.9959964 0.9934707 -0.9868505 0.999886 0.9868575 -0.9868505 0.999886 0.9868575 -0.9868505 0.999886 0.9868574 -0.9868505 0.999886 0.9868574 -0.9868504 0.999886 0.9868573 -0.9868504 0.999886 0.9868573 -0.9868504 0.999886 0.9868572 -0.9868503 0.999886 0.9868571 -0.9868503 0.999886 0.986857 -0.9868502 0.999886 0.9868568 -0.9868502 0.999886 0.9868567 -0.9868501 0.999886 0.9868565 -0.9868501 0.999886 0.9868562 -0.98685 0.999886 0.986856 -0.9868501 0.999886 0.9868558 -0.9868503 0.999886 0.9868556 -0.9868507 0.999886 0.9868555 -0.9868512 0.999886 0.9868555 -0.986852 0.999886 0.9868555 -0.9868529 0.999886 0.9868555 -0.9868541 0.999886 0.9868555 -0.9868555 0.999886 0.9868555 -0.9868574 0.999886 0.9868555 -0.9868597 0.999886 0.9868555 -0.9868627 0.999886 0.9868555 -0.9868665 0.999886 0.9868555 -0.9868713 0.999886 0.9868555 -0.9868773 0.999886 0.9868555 -0.986885 0.999886 0.9868555 -0.9868946 0.999886 0.9868555 -0.9869069 0.999886 0.9868555 -0.9869223 0.999886 0.9868555 -0.9869419 0.999886 0.9868555 -0.9869667 0.999886 0.9868555 -0.986998 0.999886 0.9868555 -0.9870376 0.999886 0.9868555 -0.9870878 0.999886 0.9868555 -0.9871512 0.999886 0.9868555 -0.9872315 0.999886 0.9868555 -0.987333 0.999886 0.9868555 -0.9874615 0.999886 0.9868555 -0.987624 0.999886 0.9868555 -0.9878296 0.999886 0.9868555 -0.9880897 0.999886 0.9868555 -0.9884188 0.999886 0.9868555 -0.9888351 0.999886 0.9868555 -0.9893618 0.999886 0.9868555 -0.9900282 0.999886 0.9868555 -0.9908712 0.999886 0.9868555 -0.9919377 0.999886 0.9868555 -0.993287 0.999886 0.9868555 -0.9949941 0.999886 0.9868555 -0.9971537 0.999886 0.9868555 -0.999886 0.999886 0.9868555 -0.9999099 0.9977452 0.9895851 -0.9999288 0.9968597 0.9917521 -0.9999437 0.9966665 0.9934707 -0.989582 0.9999099 0.9895864 -0.989582 0.9999099 0.9895864 -0.989582 0.9999099 0.9895863 -0.989582 0.9999099 0.9895863 -0.989582 0.9999099 0.9895863 -0.9895819 0.9999099 0.9895862 -0.9895819 0.9999099 0.9895862 -0.9895819 0.9999099 0.9895861 -0.9895819 0.9999099 0.9895861 -0.9895818 0.9999099 0.989586 -0.9895818 0.9999099 0.9895859 -0.9895818 0.9999099 0.9895857 -0.9895817 0.9999099 0.9895856 -0.9895817 0.9999099 0.9895854 -0.9895817 0.9999099 0.9895853 -0.9895819 0.9999099 0.9895852 -0.9895821 0.9999099 0.9895851 -0.9895825 0.9999099 0.9895851 -0.9895829 0.9999099 0.9895851 -0.9895835 0.9999099 0.9895851 -0.9895842 0.9999099 0.9895851 -0.9895851 0.9999099 0.9895851 -0.9895863 0.9999099 0.9895851 -0.9895878 0.9999099 0.9895851 -0.9895897 0.9999099 0.9895851 -0.989592 0.9999099 0.9895851 -0.989595 0.9999099 0.9895851 -0.9895988 0.9999099 0.9895851 -0.9896036 0.9999099 0.9895851 -0.9896096 0.9999099 0.9895851 -0.9896173 0.9999099 0.9895851 -0.989627 0.9999099 0.9895851 -0.9896392 0.9999099 0.9895851 -0.9896547 0.9999099 0.9895851 -0.9896744 0.9999099 0.9895851 -0.9896992 0.9999099 0.9895851 -0.9897306 0.9999099 0.9895851 -0.9897703 0.9999099 0.9895851 -0.9898206 0.9999099 0.9895851 -0.9898842 0.9999099 0.9895851 -0.9899646 0.9999099 0.9895851 -0.9900664 0.9999099 0.9895851 -0.9901951 0.9999099 0.9895851 -0.990358 0.9999099 0.9895851 -0.9905641 0.9999099 0.9895851 -0.9908248 0.9999099 0.9895851 -0.9911547 0.9999099 0.9895851 -0.991572 0.9999099 0.9895851 -0.9920999 0.9999099 0.9895851 -0.9927678 0.9999099 0.9895851 -0.9936128 0.9999099 0.9895851 -0.9946818 0.9999099 0.9895851 -0.9960342 0.9999099 0.9895851 -0.9977452 0.9999099 0.9895851 -0.9999099 0.9999099 0.9895851 -0.9999288 0.9982146 0.9917521 -0.9999437 0.9975143 0.9934707 -0.9917501 0.9999288 0.9917528 -0.9917501 0.9999288 0.9917528 -0.9917501 0.9999288 0.9917528 -0.9917501 0.9999288 0.9917528 -0.9917501 0.9999288 0.9917528 -0.9917501 0.9999288 0.9917527 -0.99175 0.9999288 0.9917527 -0.99175 0.9999288 0.9917527 -0.99175 0.9999288 0.9917526 -0.99175 0.9999288 0.9917526 -0.99175 0.9999288 0.9917525 -0.9917499 0.9999288 0.9917524 -0.9917499 0.9999288 0.9917523 -0.9917499 0.9999288 0.9917522 -0.9917499 0.9999288 0.9917522 -0.99175 0.9999288 0.9917521 -0.9917502 0.9999288 0.9917521 -0.9917504 0.9999288 0.9917521 -0.9917507 0.9999288 0.9917521 -0.991751 0.9999288 0.9917521 -0.9917515 0.9999288 0.9917521 -0.9917521 0.9999288 0.9917521 -0.9917528 0.9999288 0.9917521 -0.9917537 0.9999288 0.9917521 -0.9917549 0.9999288 0.9917521 -0.9917564 0.9999288 0.9917521 -0.9917582 0.9999288 0.9917521 -0.9917606 0.9999288 0.9917521 -0.9917636 0.9999288 0.9917521 -0.9917674 0.9999288 0.9917521 -0.9917722 0.9999288 0.9917521 -0.9917782 0.9999288 0.9917521 -0.9917859 0.9999288 0.9917521 -0.9917956 0.9999288 0.9917521 -0.9918079 0.9999288 0.9917521 -0.9918234 0.9999288 0.9917521 -0.9918431 0.9999288 0.9917521 -0.991868 0.9999288 0.9917521 -0.9918994 0.9999288 0.9917521 -0.9919392 0.9999288 0.9917521 -0.9919896 0.9999288 0.9917521 -0.9920533 0.9999288 0.9917521 -0.9921339 0.9999288 0.9917521 -0.9922358 0.9999288 0.9917521 -0.9923648 0.9999288 0.9917521 -0.992528 0.9999288 0.9917521 -0.9927345 0.9999288 0.9917521 -0.9929957 0.9999288 0.9917521 -0.9933261 0.9999288 0.9917521 -0.9937442 0.9999288 0.9917521 -0.9942731 0.9999288 0.9917521 -0.9949422 0.9999288 0.9917521 -0.9957887 0.9999288 0.9917521 -0.9968597 0.9999288 0.9917521 -0.9982146 0.9999288 0.9917521 -0.9999288 0.9999288 0.9917521 -0.9999437 0.9985868 0.9934707 -0.9934695 0.9999437 0.9934712 -0.9934695 0.9999437 0.9934712 -0.9934695 0.9999437 0.9934712 -0.9934695 0.9999437 0.9934712 -0.9934695 0.9999437 0.9934712 -0.9934695 0.9999437 0.9934711 -0.9934695 0.9999437 0.9934711 -0.9934694 0.9999437 0.9934711 -0.9934694 0.9999437 0.9934711 -0.9934694 0.9999437 0.993471 -0.9934694 0.9999437 0.993471 -0.9934694 0.9999437 0.9934709 -0.9934694 0.9999437 0.9934709 -0.9934694 0.9999437 0.9934708 -0.9934694 0.9999437 0.9934708 -0.9934694 0.9999437 0.9934707 -0.9934695 0.9999437 0.9934707 -0.9934697 0.9999437 0.9934707 -0.9934698 0.9999437 0.9934707 -0.9934701 0.9999437 0.9934707 -0.9934704 0.9999437 0.9934707 -0.9934707 0.9999437 0.9934707 -0.9934712 0.9999437 0.9934707 -0.9934718 0.9999437 0.9934707 -0.9934725 0.9999437 0.9934707 -0.9934734 0.9999437 0.9934707 -0.9934746 0.9999437 0.9934707 -0.9934761 0.9999437 0.9934707 -0.9934779 0.9999437 0.9934707 -0.9934803 0.9999437 0.9934707 -0.9934833 0.9999437 0.9934707 -0.9934871 0.9999437 0.9934707 -0.9934919 0.9999437 0.9934707 -0.993498 0.9999437 0.9934707 -0.9935057 0.9999437 0.9934707 -0.9935154 0.9999437 0.9934707 -0.9935277 0.9999437 0.9934707 -0.9935432 0.9999437 0.9934707 -0.9935629 0.9999437 0.9934707 -0.9935878 0.9999437 0.9934707 -0.9936193 0.9999437 0.9934707 -0.9936592 0.9999437 0.9934707 -0.9937096 0.9999437 0.9934707 -0.9937734 0.9999437 0.9934707 -0.9938541 0.9999437 0.9934707 -0.9939562 0.9999437 0.9934707 -0.9940854 0.9999437 0.9934707 -0.9942488 0.9999437 0.9934707 -0.9944556 0.9999437 0.9934707 -0.9947172 0.9999437 0.9934707 -0.9950481 0.9999437 0.9934707 -0.9954668 0.9999437 0.9934707 -0.9959964 0.9999437 0.9934707 -0.9966665 0.9999437 0.9934707 -0.9975143 0.9999437 0.9934707 -0.9985868 0.9999437 0.9934707 -0.9999437 0.9999437 0.9934707 -0.0000238 0.0000238 0.3429792 -0.0005417 0.0000238 0.3429792 -0.0011968 0.0000238 0.3429792 -0.0020256 0.0000238 0.3429792 -0.0030742 0.0000238 0.3429792 -0.0044007 0.0000238 0.3429792 -0.006079 0.0000238 0.3429792 -0.0082023 0.0000238 0.3429792 -0.0108885 0.0000238 0.3429792 -0.0142868 0.0000238 0.3429792 -0.0185862 0.0000238 0.3429792 -0.0240255 0.0000238 0.3429792 -0.0309069 0.0000238 0.3429792 -0.0396127 0.0000238 0.3429792 -0.0506267 0.0000238 0.3429792 -0.0645609 0.0000238 0.3429792 -0.0821895 0.0000238 0.3429792 -0.1044919 0.0000238 0.3429792 -0.1327073 0.0000238 0.3429792 -0.1684036 0.0000238 0.3429792 -0.2135639 0.0000238 0.3429792 -0.2706977 0.0000238 0.3429792 -0.3429792 0.0000238 0.3429792 -0.4344249 0.0000238 0.3429792 -0.5501155 0.0000238 0.3429792 -0.6964791 0.0000238 0.3429792 -0.8407292 0.0051514 0.3301945 -0.9033413 0.0279321 0.2969793 -0.9354466 0.0624569 0.274455 -0.9545467 0.1059991 0.2688304 -0.9669269 0.1572498 0.280033 -0.9754027 0.2151269 0.3062408 -0.9814251 0.2783684 0.344958 -0.9858181 0.3454107 0.3933496 -0.9890841 0.4144197 0.4484192 -0.9915469 0.4834235 0.5071843 -0.993424 0.5504963 0.5668669 -0.9948662 0.6139459 0.6250738 -0.9959813 0.6724572 0.6799274 -0.9968475 0.7251659 0.7301243 -0.997523 0.7716588 0.7749171 -0.9980513 0.8119154 0.8140378 -0.9984653 0.8462171 0.8475892 -0.9987905 0.8750477 0.8759292 -0.9990461 0.8990028 0.8995661 -0.9992474 0.9187175 0.9190759 -0.999406 0.9348153 0.9350425 -0.999531 0.9478754 0.948019 -0.9996296 0.958416 0.9585066 -0.9997074 0.9668873 0.9669443 -0.9997689 0.9736726 0.9737085 -0.9998174 0.9790927 0.9791152 -0.9998557 0.9834129 0.983427 -0.999886 0.9868505 0.9868593 -0.9999099 0.989582 0.9895875 -0.9999288 0.9917501 0.9917536 -0.9999437 0.9934695 0.9934717 -0.0000238 0.0005417 0.3429792 -0.0000382 0.0000382 0.3424757 -0.0006933 0.0000382 0.3424757 -0.0015221 0.0000382 0.3424757 -0.0025707 0.0000382 0.3424757 -0.0038972 0.0000382 0.3424757 -0.0055755 0.0000382 0.3424757 -0.0076988 0.0000382 0.3424757 -0.0103849 0.0000382 0.3424757 -0.0137833 0.0000382 0.3424757 -0.0180827 0.0000382 0.3424757 -0.023522 0.0000382 0.3424757 -0.0304033 0.0000382 0.3424757 -0.0391092 0.0000382 0.3424757 -0.0501232 0.0000382 0.3424757 -0.0640574 0.0000382 0.3424757 -0.081686 0.0000382 0.3424757 -0.1039884 0.0000382 0.3424757 -0.1322038 0.0000382 0.3424757 -0.1679 0.0000382 0.3424757 -0.2130604 0.0000382 0.3424757 -0.2701941 0.0000382 0.3424757 -0.3424757 0.0000382 0.3424757 -0.4339214 0.0000382 0.3424757 -0.549612 0.0000382 0.3424757 -0.6959756 0.0000382 0.3424757 -0.8405071 0.0051286 0.3297942 -0.9032596 0.0278872 0.2966415 -0.9354101 0.0624063 0.2741654 -0.9545286 0.1059489 0.2685877 -0.9669173 0.1572031 0.2798347 -0.9753975 0.2150852 0.3060824 -0.9814221 0.2783325 0.3448342 -0.9858163 0.3453807 0.3932548 -0.9890831 0.4143955 0.4483481 -0.9915463 0.4834045 0.507132 -0.9934236 0.5504818 0.5668292 -0.994866 0.6139352 0.6250471 -0.9959811 0.6724495 0.6799088 -0.9968474 0.7251605 0.7301116 -0.997523 0.7716551 0.7749085 -0.9980512 0.8119128 0.8140321 -0.9984653 0.8462154 0.8475855 -0.9987905 0.8750466 0.8759268 -0.9990461 0.899002 0.8995645 -0.9992474 0.918717 0.9190749 -0.999406 0.9348149 0.9350418 -0.999531 0.9478752 0.9480186 -0.9996296 0.9584159 0.9585063 -0.9997074 0.9668872 0.9669442 -0.9997689 0.9736726 0.9737084 -0.9998174 0.9790927 0.9791152 -0.9998557 0.9834129 0.983427 -0.999886 0.9868505 0.9868593 -0.9999099 0.989582 0.9895875 -0.9999288 0.9917501 0.9917535 -0.9999437 0.9934695 0.9934716 -0.0000238 0.0011968 0.3429792 -0.0000382 0.0006933 0.3424757 -0.0000611 0.0000611 0.3418435 -0.0008899 0.0000611 0.3418435 -0.0019385 0.0000611 0.3418435 -0.003265 0.0000611 0.3418435 -0.0049433 0.0000611 0.3418435 -0.0070666 0.0000611 0.3418435 -0.0097527 0.0000611 0.3418435 -0.0131511 0.0000611 0.3418435 -0.0174505 0.0000611 0.3418435 -0.0228898 0.0000611 0.3418435 -0.0297711 0.0000611 0.3418435 -0.038477 0.0000611 0.3418435 -0.049491 0.0000611 0.3418435 -0.0634252 0.0000611 0.3418435 -0.0810538 0.0000611 0.3418435 -0.1033562 0.0000611 0.3418435 -0.1315716 0.0000611 0.3418435 -0.1672678 0.0000611 0.3418435 -0.2124282 0.0000611 0.3418435 -0.2695619 0.0000611 0.3418435 -0.3418435 0.0000611 0.3418435 -0.4332891 0.0000611 0.3418435 -0.5489798 0.0000611 0.3418435 -0.6953434 0.0000611 0.3418435 -0.8402274 0.0051047 0.329291 -0.9031567 0.0278347 0.2962171 -0.9353643 0.0623458 0.2738014 -0.9545059 0.1058883 0.2682827 -0.9669053 0.1571463 0.2795855 -0.9753908 0.2150342 0.3058834 -0.9814183 0.2782884 0.3446787 -0.9858141 0.3453439 0.3931357 -0.9890818 0.4143657 0.4482588 -0.9915455 0.4833811 0.5070663 -0.9934231 0.550464 0.5667818 -0.9948657 0.6139219 0.6250135 -0.9959809 0.6724399 0.6798855 -0.9968473 0.7251537 0.7300957 -0.9975229 0.7716504 0.7748978 -0.9980512 0.8119096 0.8140249 -0.9984653 0.8462132 0.8475808 -0.9987904 0.8750451 0.8759237 -0.9990461 0.8990011 0.8995625 -0.9992474 0.9187164 0.9190736 -0.999406 0.9348146 0.935041 -0.999531 0.947875 0.9480181 -0.9996296 0.9584157 0.958506 -0.9997074 0.9668871 0.966944 -0.9997689 0.9736725 0.9737082 -0.9998174 0.9790927 0.9791151 -0.9998557 0.9834129 0.9834269 -0.999886 0.9868505 0.9868593 -0.9999099 0.989582 0.9895875 -0.9999288 0.9917501 0.9917535 -0.9999437 0.9934695 0.9934716 -0.0000238 0.0020256 0.3429792 -0.0000382 0.0015221 0.3424757 -0.0000611 0.0008899 0.3418435 -0.0000978 0.0000978 0.3410514 -0.0011463 0.0000978 0.3410514 -0.0024729 0.0000978 0.3410514 -0.0041512 0.0000978 0.3410514 -0.0062744 0.0000978 0.3410514 -0.0089606 0.0000978 0.3410514 -0.012359 0.0000978 0.3410514 -0.0166583 0.0000978 0.3410514 -0.0220976 0.0000978 0.3410514 -0.028979 0.0000978 0.3410514 -0.0376849 0.0000978 0.3410514 -0.0486989 0.0000978 0.3410514 -0.0626331 0.0000978 0.3410514 -0.0802616 0.0000978 0.3410514 -0.102564 0.0000978 0.3410514 -0.1307795 0.0000978 0.3410514 -0.1664757 0.0000978 0.3410514 -0.2116361 0.0000978 0.3410514 -0.2687698 0.0000978 0.3410514 -0.3410514 0.0000978 0.3410514 -0.432497 0.0000978 0.3410514 -0.5481876 0.0000978 0.3410514 -0.6945513 0.0000978 0.3410514 -0.8398756 0.0050826 0.3286597 -0.9030276 0.0277752 0.2956846 -0.9353068 0.0622749 0.2733449 -0.9544774 0.1058162 0.2679003 -0.9668902 0.1570779 0.2792731 -0.9753825 0.2149725 0.3056339 -0.9814136 0.2782347 0.3444838 -0.9858113 0.3452987 0.3929865 -0.9890801 0.414329 0.4481468 -0.9915446 0.4833522 0.506984 -0.9934225 0.5504419 0.5667225 -0.9948653 0.6139056 0.6249715 -0.9959807 0.672428 0.6798563 -0.9968472 0.7251454 0.7300757 -0.9975228 0.7716446 0.7748843 -0.9980511 0.8119057 0.8140159 -0.9984653 0.8462106 0.8475749 -0.9987904 0.8750434 0.8759198 -0.9990461 0.899 0.8995601 -0.9992474 0.9187157 0.919072 -0.999406 0.9348141 0.93504 -0.999531 0.9478746 0.9480175 -0.9996296 0.9584155 0.9585056 -0.9997074 0.966887 0.9669437 -0.9997689 0.9736724 0.9737081 -0.9998174 0.9790926 0.979115 -0.9998557 0.9834129 0.9834269 -0.999886 0.9868505 0.9868592 -0.9999099 0.989582 0.9895875 -0.9999288 0.9917501 0.9917535 -0.9999437 0.9934695 0.9934716 -0.0000238 0.0030742 0.3429792 -0.0000382 0.0025707 0.3424757 -0.0000611 0.0019385 0.3418435 -0.0000978 0.0011463 0.3410514 -0.0001565 0.0001565 0.3400615 -0.001483 0.0001565 0.3400615 -0.0031613 0.0001565 0.3400615 -0.0052846 0.0001565 0.3400615 -0.0079707 0.0001565 0.3400615 -0.0113691 0.0001565 0.3400615 -0.0156685 0.0001565 0.3400615 -0.0211078 0.0001565 0.3400615 -0.0279891 0.0001565 0.3400615 -0.036695 0.0001565 0.3400615 -0.047709 0.0001565 0.3400615 -0.0616432 0.0001565 0.3400615 -0.0792718 0.0001565 0.3400615 -0.1015742 0.0001565 0.3400615 -0.1297896 0.0001565 0.3400615 -0.1654858 0.0001565 0.3400615 -0.2106462 0.0001565 0.3400615 -0.2677799 0.0001565 0.3400615 -0.3400615 0.0001565 0.3400615 -0.4315072 0.0001565 0.3400615 -0.5471978 0.0001565 0.3400615 -0.6935614 0.0001565 0.3400615 -0.8394338 0.0050676 0.3278694 -0.9028657 0.0277111 0.2950184 -0.9352348 0.0621943 0.2727739 -0.9544418 0.1057322 0.267422 -0.9668714 0.1569971 0.2788823 -0.9753721 0.2148987 0.305322 -0.9814076 0.2781701 0.3442401 -0.9858079 0.3452442 0.3928 -0.9890781 0.4142845 0.4480069 -0.9915433 0.4833171 0.5068811 -0.9934218 0.550415 0.5666483 -0.9948649 0.6138855 0.624919 -0.9959804 0.6724135 0.6798198 -0.996847 0.7251351 0.7300507 -0.9975227 0.7716375 0.7748674 -0.9980511 0.8119009 0.8140047 -0.9984652 0.8462073 0.8475675 -0.9987904 0.8750412 0.875915 -0.9990461 0.8989986 0.8995569 -0.9992474 0.9187148 0.91907 -0.999406 0.9348135 0.9350387 -0.999531 0.9478743 0.9480166 -0.9996296 0.9584153 0.9585051 -0.9997074 0.9668869 0.9669434 -0.9997689 0.9736723 0.9737079 -0.9998174 0.9790925 0.9791148 -0.9998557 0.9834128 0.9834268 -0.999886 0.9868504 0.9868592 -0.9999099 0.989582 0.9895874 -0.9999288 0.9917501 0.9917535 -0.9999437 0.9934695 0.9934716 -0.0000238 0.0044007 0.3429792 -0.0000382 0.0038972 0.3424757 -0.0000611 0.003265 0.3418435 -0.0000978 0.0024729 0.3410514 -0.0001565 0.001483 0.3400615 -0.0002504 0.0002504 0.3388289 -0.0019287 0.0002504 0.3388289 -0.004052 0.0002504 0.3388289 -0.0067381 0.0002504 0.3388289 -0.0101365 0.0002504 0.3388289 -0.0144359 0.0002504 0.3388289 -0.0198752 0.0002504 0.3388289 -0.0267565 0.0002504 0.3388289 -0.0354624 0.0002504 0.3388289 -0.0464764 0.0002504 0.3388289 -0.0604106 0.0002504 0.3388289 -0.0780392 0.0002504 0.3388289 -0.1003416 0.0002504 0.3388289 -0.128557 0.0002504 0.3388289 -0.1642532 0.0002504 0.3388289 -0.2094136 0.0002504 0.3388289 -0.2665473 0.0002504 0.3388289 -0.3388289 0.0002504 0.3388289 -0.4302746 0.0002504 0.3388289 -0.5459652 0.0002504 0.3388289 -0.6923288 0.0002504 0.3388289 -0.8388802 0.0050694 0.3268833 -0.9026634 0.0276479 0.2941874 -0.9351449 0.0621069 0.2720617 -0.9543974 0.1056375 0.2668257 -0.9668479 0.156904 0.2783953 -0.9753591 0.2148124 0.3049333 -0.9814002 0.2780936 0.3439364 -0.9858036 0.3451791 0.3925675 -0.9890755 0.4142311 0.4478326 -0.9915418 0.4832747 0.5067529 -0.9934209 0.5503825 0.5665559 -0.9948643 0.6138613 0.6248536 -0.9959801 0.6723959 0.6797744 -0.9968468 0.7251226 0.7300196 -0.9975226 0.7716288 0.7748465 -0.998051 0.8118949 0.8139908 -0.9984652 0.8462034 0.8475583 -0.9987904 0.8750386 0.875909 -0.9990461 0.8989969 0.8995531 -0.9992474 0.9187137 0.9190675 -0.9994059 0.9348128 0.9350371 -0.999531 0.9478738 0.9480156 -0.9996296 0.958415 0.9585044 -0.9997074 0.9668867 0.966943 -0.9997689 0.9736722 0.9737076 -0.9998174 0.9790925 0.9791147 -0.9998557 0.9834128 0.9834267 -0.999886 0.9868504 0.9868591 -0.9999099 0.9895819 0.9895874 -0.9999288 0.9917501 0.9917535 -0.9999437 0.9934695 0.9934716 -0.0000238 0.006079 0.3429792 -0.0000382 0.0055755 0.3424757 -0.0000611 0.0049433 0.3418435 -0.0000978 0.0041512 0.3410514 -0.0001565 0.0031613 0.3400615 -0.0002504 0.0019287 0.3388289 -0.0004008 0.0004008 0.337301 -0.0025241 0.0004008 0.337301 -0.0052103 0.0004008 0.337301 -0.0086086 0.0004008 0.337301 -0.012908 0.0004008 0.337301 -0.0183473 0.0004008 0.337301 -0.0252287 0.0004008 0.337301 -0.0339345 0.0004008 0.337301 -0.0449485 0.0004008 0.337301 -0.0588827 0.0004008 0.337301 -0.0765113 0.0004008 0.337301 -0.0988137 0.0004008 0.337301 -0.1270291 0.0004008 0.337301 -0.1627254 0.0004008 0.337301 -0.2078857 0.0004008 0.337301 -0.2650195 0.0004008 0.337301 -0.337301 0.0004008 0.337301 -0.4287467 0.0004008 0.337301 -0.5444373 0.0004008 0.337301 -0.6908009 0.0004008 0.337301 -0.8381886 0.0051048 0.3256576 -0.9024114 0.0275966 0.2931551 -0.9350332 0.0620199 0.2711774 -0.9543421 0.1055364 0.2660854 -0.9668187 0.1568008 0.2777909 -0.975343 0.2147144 0.304451 -0.9813911 0.2780055 0.3435596 -0.9857982 0.3451032 0.3922792 -0.9890723 0.4141683 0.4476164 -0.9915399 0.4832246 0.506594 -0.9934197 0.5503438 0.5664413 -0.9948636 0.6138323 0.6247725 -0.9959797 0.6723748 0.679718 -0.9968465 0.7251076 0.7299811 -0.9975224 0.7716184 0.7748205 -0.9980509 0.8118878 0.8139735 -0.9984651 0.8461986 0.8475469 -0.9987903 0.8750355 0.8759016 -0.9990461 0.8989948 0.8995483 -0.9992473 0.9187123 0.9190645 -0.9994059 0.9348119 0.9350352 -0.999531 0.9478733 0.9480144 -0.9996296 0.9584146 0.9585036 -0.9997074 0.9668865 0.9669425 -0.9997689 0.9736721 0.9737073 -0.9998174 0.9790924 0.9791145 -0.9998557 0.9834127 0.9834266 -0.999886 0.9868504 0.9868591 -0.9999099 0.9895819 0.9895874 -0.9999288 0.99175 0.9917534 -0.9999437 0.9934695 0.9934716 -0.0000238 0.0082023 0.3429792 -0.0000382 0.0076988 0.3424757 -0.0000611 0.0070666 0.3418435 -0.0000978 0.0062744 0.3410514 -0.0001565 0.0052846 0.3400615 -0.0002504 0.004052 0.3388289 -0.0004008 0.0025241 0.337301 -0.0006416 0.0006416 0.3354185 -0.0033277 0.0006416 0.3354185 -0.0067261 0.0006416 0.3354185 -0.0110255 0.0006416 0.3354185 -0.0164648 0.0006416 0.3354185 -0.0233461 0.0006416 0.3354185 -0.032052 0.0006416 0.3354185 -0.043066 0.0006416 0.3354185 -0.0570002 0.0006416 0.3354185 -0.0746288 0.0006416 0.3354185 -0.0969312 0.0006416 0.3354185 -0.1251466 0.0006416 0.3354185 -0.1608428 0.0006416 0.3354185 -0.2060032 0.0006416 0.3354185 -0.2631369 0.0006416 0.3354185 -0.3354185 0.0006416 0.3354185 -0.4268641 0.0006416 0.3354185 -0.5425548 0.0006416 0.3354185 -0.6889184 0.0006416 0.3354185 -0.8373283 0.0052028 0.3241424 -0.9020992 0.0275778 0.2918798 -0.9348949 0.0619473 0.2700853 -0.9542739 0.1054384 0.2651716 -0.9667827 0.1566936 0.277045 -0.9753231 0.2146085 0.303856 -0.9813797 0.2779077 0.3430949 -0.9857916 0.3450175 0.3919237 -0.9890684 0.4140964 0.4473498 -0.9915376 0.4831666 0.506398 -0.9934183 0.5502987 0.5663 -0.9948628 0.6137984 0.6246726 -0.9959791 0.67235 0.6796485 -0.9968462 0.7250899 0.7299335 -0.9975222 0.7716061 0.7747884 -0.9980508 0.8118794 0.8139522 -0.998465 0.8461929 0.8475329 -0.9987903 0.8750317 0.8758925 -0.999046 0.8989923 0.8995424 -0.9992473 0.9187107 0.9190607 -0.9994059 0.9348109 0.9350327 -0.999531 0.9478726 0.9480128 -0.9996296 0.9584142 0.9585026 -0.9997074 0.9668862 0.9669419 -0.9997689 0.9736719 0.9737069 -0.9998174 0.9790923 0.9791142 -0.9998557 0.9834127 0.9834264 -0.999886 0.9868503 0.986859 -0.9999099 0.9895819 0.9895873 -0.9999288 0.99175 0.9917534 -0.9999437 0.9934694 0.9934716 -0.0000238 0.0108885 0.3429792 -0.0000382 0.0103849 0.3424757 -0.0000611 0.0097527 0.3418435 -0.0000978 0.0089606 0.3410514 -0.0001565 0.0079707 0.3400615 -0.0002504 0.0067381 0.3388289 -0.0004008 0.0052103 0.337301 -0.0006416 0.0033277 0.3354185 -0.0010268 0.0010268 0.3331176 -0.0044252 0.0010268 0.3331176 -0.0087246 0.0010268 0.3331176 -0.0141639 0.0010268 0.3331176 -0.0210452 0.0010268 0.3331176 -0.0297511 0.0010268 0.3331176 -0.0407651 0.0010268 0.3331176 -0.0546993 0.0010268 0.3331176 -0.0723279 0.0010268 0.3331176 -0.0946303 0.0010268 0.3331176 -0.1228457 0.0010268 0.3331176 -0.1585419 0.0010268 0.3331176 -0.2037023 0.0010268 0.3331176 -0.260836 0.0010268 0.3331176 -0.3331176 0.0010268 0.3331176 -0.4245633 0.0010268 0.3331176 -0.5402539 0.0010268 0.3331176 -0.6866175 0.0010268 0.3331176 -0.8362644 0.0054121 0.3222829 -0.9017148 0.0276281 0.290316 -0.9347252 0.061916 0.2687468 -0.9541902 0.1053624 0.2640521 -0.9667385 0.1565954 0.2761317 -0.9752987 0.2145034 0.3031276 -0.9813659 0.2778058 0.3425263 -0.9857835 0.3449254 0.3914887 -0.9890637 0.4140176 0.4470237 -0.9915347 0.4831021 0.5061584 -0.9934166 0.550248 0.5661273 -0.9948617 0.6137599 0.6245504 -0.9959785 0.6723217 0.6795635 -0.9968458 0.7250697 0.7298754 -0.997522 0.7715919 0.7747493 -0.9980506 0.8118697 0.8139261 -0.9984649 0.8461864 0.8475157 -0.9987902 0.8750274 0.8758813 -0.999046 0.8989895 0.8995351 -0.9992473 0.9187089 0.919056 -0.9994059 0.9348097 0.9350298 -0.999531 0.9478718 0.9480109 -0.9996296 0.9584137 0.9585014 -0.9997074 0.9668859 0.9669411 -0.9997689 0.9736717 0.9737064 -0.9998174 0.9790921 0.9791139 -0.9998557 0.9834126 0.9834262 -0.999886 0.9868503 0.9868588 -0.9999099 0.9895819 0.9895872 -0.9999288 0.99175 0.9917534 -0.9999437 0.9934694 0.9934715 -0.0000238 0.0142868 0.3429792 -0.0000382 0.0137833 0.3424757 -0.0000611 0.0131511 0.3418435 -0.0000978 0.012359 0.3410514 -0.0001565 0.0113691 0.3400615 -0.0002504 0.0101365 0.3388289 -0.0004008 0.0086086 0.337301 -0.0006416 0.0067261 0.3354185 -0.0010268 0.0044252 0.3331176 -0.0016435 0.0016435 0.3303359 -0.0059429 0.0016435 0.3303359 -0.0113822 0.0016435 0.3303359 -0.0182636 0.0016435 0.3303359 -0.0269694 0.0016435 0.3303359 -0.0379834 0.0016435 0.3303359 -0.0519176 0.0016435 0.3303359 -0.0695462 0.0016435 0.3303359 -0.0918486 0.0016435 0.3303359 -0.120064 0.0016435 0.3303359 -0.1557603 0.0016435 0.3303359 -0.2009206 0.0016435 0.3303359 -0.2580543 0.0016435 0.3303359 -0.3303359 0.0016435 0.3303359 -0.4217816 0.0016435 0.3303359 -0.5374722 0.0016435 0.3303359 -0.6838358 0.0016435 0.3303359 -0.8349593 0.0058134 0.3200238 -0.9012461 0.0278105 0.2884181 -0.9345187 0.0619734 0.2671233 -0.9540886 0.1053433 0.2626949 -0.966685 0.1565315 0.2750249 -0.9752692 0.2144168 0.3022454 -0.9813491 0.2777122 0.3418377 -0.9857738 0.3448353 0.3909622 -0.9890579 0.4139373 0.4466291 -0.9915312 0.4830346 0.5058684 -0.9934145 0.5501939 0.5659183 -0.9948604 0.6137183 0.6244026 -0.9959777 0.6722907 0.6794608 -0.9968453 0.7250473 0.7298052 -0.9975217 0.7715762 0.7747019 -0.9980504 0.8118589 0.8138946 -0.9984648 0.8461791 0.847495 -0.9987902 0.8750225 0.8758678 -0.9990459 0.8989863 0.8995264 -0.9992473 0.9187068 0.9190504 -0.9994059 0.9348083 0.9350262 -0.9995309 0.947871 0.9480087 -0.9996296 0.9584132 0.9585 -0.9997074 0.9668855 0.9669402 -0.9997689 0.9736715 0.9737058 -0.9998174 0.979092 0.9791136 -0.9998557 0.9834125 0.983426 -0.999886 0.9868502 0.9868587 -0.9999099 0.9895818 0.9895871 -0.9999288 0.99175 0.9917533 -0.9999437 0.9934694 0.9934715 -0.0000238 0.0185862 0.3429792 -0.0000382 0.0180827 0.3424757 -0.0000611 0.0174505 0.3418435 -0.0000978 0.0166583 0.3410514 -0.0001565 0.0156685 0.3400615 -0.0002504 0.0144359 0.3388289 -0.0004008 0.012908 0.337301 -0.0006416 0.0110255 0.3354185 -0.0010268 0.0087246 0.3331176 -0.0016435 0.0059429 0.3303359 -0.0026305 0.0026305 0.3270236 -0.0080698 0.0026305 0.3270236 -0.0149512 0.0026305 0.3270236 -0.023657 0.0026305 0.3270236 -0.0346711 0.0026305 0.3270236 -0.0486053 0.0026305 0.3270236 -0.0662338 0.0026305 0.3270236 -0.0885362 0.0026305 0.3270236 -0.1167517 0.0026305 0.3270236 -0.1524479 0.0026305 0.3270236 -0.1976083 0.0026305 0.3270236 -0.254742 0.0026305 0.3270236 -0.3270236 0.0026305 0.3270236 -0.4184692 0.0026305 0.3270236 -0.5341598 0.0026305 0.3270236 -0.6805235 0.0026305 0.3270236 -0.8333779 0.0065402 0.3173179 -0.900682 0.0282324 0.2861474 -0.9342712 0.062202 0.2651822 -0.9539671 0.1054431 0.2610734 -0.9666211 0.1565473 0.2737034 -0.975234 0.2143816 0.3011925 -0.9813291 0.2776503 0.3410164 -0.9857621 0.3447636 0.3903343 -0.989051 0.4138668 0.4461586 -0.9915271 0.4829718 0.5055228 -0.993412 0.5501416 0.5656692 -0.9948589 0.6136769 0.6242264 -0.9959768 0.6722594 0.6793384 -0.9968448 0.7250244 0.7297214 -0.9975213 0.7715599 0.7746455 -0.9980502 0.8118476 0.813857 -0.9984647 0.8461714 0.8474703 -0.9987901 0.8750173 0.8758517 -0.9990459 0.8989829 0.899516 -0.9992472 0.9187045 0.9190437 -0.9994059 0.9348069 0.9350219 -0.9995309 0.94787 0.9480059 -0.9996296 0.9584126 0.9584983 -0.9997074 0.9668852 0.9669391 -0.9997689 0.9736712 0.9737052 -0.9998174 0.9790919 0.9791131 -0.9998557 0.9834124 0.9834257 -0.999886 0.9868502 0.9868585 -0.9999099 0.9895818 0.989587 -0.9999288 0.99175 0.9917532 -0.9999437 0.9934694 0.9934715 -0.0000238 0.0240255 0.3429792 -0.0000382 0.023522 0.3424757 -0.0000611 0.0228898 0.3418435 -0.0000978 0.0220976 0.3410514 -0.0001565 0.0211078 0.3400615 -0.0002504 0.0198752 0.3388289 -0.0004008 0.0183473 0.337301 -0.0006416 0.0164648 0.3354185 -0.0010268 0.0141639 0.3331176 -0.0016435 0.0113822 0.3303359 -0.0026305 0.0080698 0.3270236 -0.0042103 0.0042103 0.3231641 -0.0110917 0.0042103 0.3231641 -0.0197975 0.0042103 0.3231641 -0.0308116 0.0042103 0.3231641 -0.0447458 0.0042103 0.3231641 -0.0623743 0.0042103 0.3231641 -0.0846767 0.0042103 0.3231641 -0.1128922 0.0042103 0.3231641 -0.1485884 0.0042103 0.3231641 -0.1937488 0.0042103 0.3231641 -0.2508825 0.0042103 0.3231641 -0.3231641 0.0042103 0.3231641 -0.4146097 0.0042103 0.3231641 -0.5303003 0.0042103 0.3231641 -0.676664 0.0042103 0.3231641 -0.8314967 0.0078103 0.314143 -0.9000167 0.0290732 0.2834869 -0.9339805 0.062742 0.2629098 -0.9538247 0.1057683 0.2591765 -0.9665463 0.1567226 0.2721586 -0.9751928 0.2144566 0.2999624 -0.9813057 0.2776626 0.3400572 -0.9857485 0.3447407 0.3896014 -0.989043 0.4138277 0.4456096 -0.9915223 0.4829286 0.5051196 -0.9934091 0.5501012 0.5653788 -0.9948571 0.6136427 0.624021 -0.9959757 0.6722322 0.6791956 -0.9968441 0.7250039 0.7296238 -0.9975209 0.7715449 0.7745797 -0.99805 0.811837 0.8138133 -0.9984645 0.8461641 0.8474415 -0.99879 0.8750124 0.8758329 -0.9990458 0.8989796 0.8995038 -0.9992472 0.9187024 0.9190359 -0.9994059 0.9348055 0.9350169 -0.9995309 0.9478691 0.9480028 -0.9996296 0.958412 0.9584963 -0.9997074 0.9668848 0.9669378 -0.9997689 0.973671 0.9737044 -0.9998174 0.9790917 0.9791126 -0.9998557 0.9834123 0.9834254 -0.999886 0.9868501 0.9868583 -0.9999099 0.9895818 0.9895869 -0.9999288 0.9917499 0.9917532 -0.9999437 0.9934694 0.9934714 -0.0000238 0.0309069 0.3429792 -0.0000382 0.0304033 0.3424757 -0.0000611 0.0297711 0.3418435 -0.0000978 0.028979 0.3410514 -0.0001565 0.0279891 0.3400615 -0.0002504 0.0267565 0.3388289 -0.0004008 0.0252287 0.337301 -0.0006416 0.0233461 0.3354185 -0.0010268 0.0210452 0.3331176 -0.0016435 0.0182636 0.3303359 -0.0026305 0.0149512 0.3270236 -0.0042103 0.0110917 0.3231641 -0.0067388 0.0067388 0.3188112 -0.0154447 0.0067388 0.3188112 -0.0264587 0.0067388 0.3188112 -0.0403929 0.0067388 0.3188112 -0.0580214 0.0067388 0.3188112 -0.0803239 0.0067388 0.3188112 -0.1085393 0.0067388 0.3188112 -0.1442355 0.0067388 0.3188112 -0.1893959 0.0067388 0.3188112 -0.2465296 0.0067388 0.3188112 -0.3188112 0.0067388 0.3188112 -0.4102568 0.0067388 0.3188112 -0.5259474 0.0067388 0.3188112 -0.6723111 0.0067388 0.3188112 -0.8293233 0.0099781 0.3105336 -0.8992555 0.0306306 0.2804673 -0.9336494 0.0638283 0.260333 -0.953663 0.1064997 0.2570275 -0.9664615 0.1571937 0.2704099 -0.9751462 0.2147432 0.2985709 -0.9812792 0.2778236 0.3389728 -0.9857332 0.3448204 0.3887731 -0.9890339 0.4138582 0.4449894 -0.9915169 0.4829319 0.5046642 -0.9934058 0.5500915 0.5650508 -0.9948551 0.6136284 0.6237891 -0.9959745 0.672218 0.6790346 -0.9968433 0.7249916 0.7295137 -0.9975204 0.7715352 0.7745055 -0.9980497 0.8118298 0.8137639 -0.9984643 0.8461589 0.847409 -0.9987899 0.8750088 0.8758117 -0.9990458 0.8989771 0.8994901 -0.9992472 0.9187008 0.9190271 -0.9994058 0.9348044 0.9350113 -0.9995309 0.9478684 0.9479992 -0.9996296 0.9584115 0.958494 -0.9997074 0.9668845 0.9669364 -0.9997689 0.9736708 0.9737034 -0.9998174 0.9790916 0.9791121 -0.9998557 0.9834122 0.9834251 -0.999886 0.9868501 0.9868581 -0.9999099 0.9895817 0.9895868 -0.9999288 0.9917499 0.9917531 -0.9999437 0.9934694 0.9934713 -0.0000238 0.0396127 0.3429792 -0.0000382 0.0391092 0.3424757 -0.0000611 0.038477 0.3418435 -0.0000978 0.0376849 0.3410514 -0.0001565 0.036695 0.3400615 -0.0002504 0.0354624 0.3388289 -0.0004008 0.0339345 0.337301 -0.0006416 0.032052 0.3354185 -0.0010268 0.0297511 0.3331176 -0.0016435 0.0269694 0.3303359 -0.0026305 0.023657 0.3270236 -0.0042103 0.0197975 0.3231641 -0.0067388 0.0154447 0.3188112 -0.0107859 0.0107859 0.3141524 -0.0217999 0.0107859 0.3141524 -0.0357341 0.0107859 0.3141524 -0.0533626 0.0107859 0.3141524 -0.075665 0.0107859 0.3141524 -0.1038805 0.0107859 0.3141524 -0.1395767 0.0107859 0.3141524 -0.1847371 0.0107859 0.3141524 -0.2418708 0.0107859 0.3141524 -0.3141524 0.0107859 0.3141524 -0.405598 0.0107859 0.3141524 -0.5212886 0.0107859 0.3141524 -0.6676523 0.0107859 0.3141524 -0.8269342 0.0136166 0.3066367 -0.8984278 0.0333932 0.2772127 -0.9332914 0.0658501 0.2575585 -0.9534887 0.1079385 0.254716 -0.9663702 0.15819 0.2685306 -0.9750962 0.2154135 0.2970766 -0.9812508 0.2782606 0.337809 -0.9857167 0.3450957 0.3878847 -0.9890241 0.4140252 0.4443244 -0.991511 0.4830292 0.5041761 -0.9934023 0.5501456 0.5646994 -0.994853 0.6136569 0.6235407 -0.9959732 0.672232 0.678862 -0.9968425 0.7249978 0.7293958 -0.9975199 0.7715376 0.774426 -0.9980494 0.8118303 0.813711 -0.9984642 0.8461587 0.8473742 -0.9987897 0.8750084 0.8757891 -0.9990457 0.8989767 0.8994755 -0.9992471 0.9187004 0.9190177 -0.9994058 0.9348042 0.9350053 -0.9995309 0.9478683 0.9479954 -0.9996295 0.9584114 0.9584916 -0.9997074 0.9668844 0.9669349 -0.9997689 0.9736708 0.9737025 -0.9998174 0.9790916 0.9791115 -0.9998557 0.9834122 0.9834247 -0.999886 0.98685 0.9868579 -0.9999099 0.9895817 0.9895866 -0.9999288 0.9917499 0.991753 -0.9999437 0.9934694 0.9934713 -0.0000238 0.0506267 0.3429792 -0.0000382 0.0501232 0.3424757 -0.0000611 0.049491 0.3418435 -0.0000978 0.0486989 0.3410514 -0.0001565 0.047709 0.3400615 -0.0002504 0.0464764 0.3388289 -0.0004008 0.0449485 0.337301 -0.0006416 0.043066 0.3354185 -0.0010268 0.0407651 0.3331176 -0.0016435 0.0379834 0.3303359 -0.0026305 0.0346711 0.3270236 -0.0042103 0.0308116 0.3231641 -0.0067388 0.0264587 0.3188112 -0.0107859 0.0217999 0.3141524 -0.0172633 0.0172633 0.3096159 -0.0311975 0.0172633 0.3096159 -0.0488261 0.0172633 0.3096159 -0.0711285 0.0172633 0.3096159 -0.099344 0.0172633 0.3096159 -0.1350402 0.0172633 0.3096159 -0.1802005 0.0172633 0.3096159 -0.2373343 0.0172633 0.3096159 -0.3096159 0.0172633 0.3096159 -0.4010615 0.0172633 0.3096159 -0.5167521 0.0172633 0.3096159 -0.6631157 0.0172633 0.3096159 -0.8245426 0.0196467 0.3028082 -0.8976087 0.0381561 0.2740209 -0.9329391 0.0694453 0.2548403 -0.9533177 0.1105818 0.2524537 -0.9662809 0.160092 0.2666929 -0.9750472 0.2167545 0.2956165 -0.9812231 0.2791873 0.3366726 -0.9857006 0.3457234 0.3870176 -0.9890146 0.4144423 0.4436757 -0.9915054 0.4833013 0.5037002 -0.9933988 0.5503203 0.5643568 -0.9948509 0.6137675 0.6232986 -0.9959719 0.6723012 0.6786939 -0.9968418 0.7250408 0.7292808 -0.9975194 0.7715641 0.7743486 -0.9980491 0.8118466 0.8136595 -0.998464 0.8461687 0.8473404 -0.9987896 0.8750145 0.875767 -0.9990456 0.8989805 0.8994612 -0.9992471 0.9187027 0.9190085 -0.9994058 0.9348056 0.9349994 -0.9995309 0.9478691 0.9479916 -0.9996295 0.958412 0.9584892 -0.9997074 0.9668847 0.9669334 -0.9997688 0.973671 0.9737015 -0.9998174 0.9790917 0.9791109 -0.9998557 0.9834123 0.9834243 -0.999886 0.9868501 0.9868576 -0.9999099 0.9895817 0.9895865 -0.9999288 0.9917499 0.9917529 -0.9999437 0.9934694 0.9934712 -0.0000238 0.0645609 0.3429792 -0.0000382 0.0640574 0.3424757 -0.0000611 0.0634252 0.3418435 -0.0000978 0.0626331 0.3410514 -0.0001565 0.0616432 0.3400615 -0.0002504 0.0604106 0.3388289 -0.0004008 0.0588827 0.337301 -0.0006416 0.0570002 0.3354185 -0.0010268 0.0546993 0.3331176 -0.0016435 0.0519176 0.3303359 -0.0026305 0.0486053 0.3270236 -0.0042103 0.0447458 0.3231641 -0.0067388 0.0403929 0.3188112 -0.0107859 0.0357341 0.3141524 -0.0172633 0.0311975 0.3096159 -0.0276309 0.0276309 0.3060492 -0.0452595 0.0276309 0.3060492 -0.0675619 0.0276309 0.3060492 -0.0957773 0.0276309 0.3060492 -0.1314736 0.0276309 0.3060492 -0.1766339 0.0276309 0.3060492 -0.2337676 0.0276309 0.3060492 -0.3060492 0.0276309 0.3060492 -0.3974949 0.0276309 0.3060492 -0.5131855 0.0276309 0.3060492 -0.6595491 0.0276309 0.3060492 -0.8226154 0.0295373 0.2997746 -0.8969554 0.0461985 0.2714957 -0.9326595 0.0756464 0.2526918 -0.9531823 0.1152388 0.2506671 -0.9662104 0.1635226 0.2652429 -0.9750086 0.2192389 0.2944652 -0.9812013 0.2809573 0.335777 -0.9856879 0.3469645 0.3863346 -0.9890072 0.4152991 0.4431649 -0.9915009 0.4838841 0.5033255 -0.9933961 0.5507113 0.5640871 -0.9948493 0.6140266 0.6231081 -0.9959709 0.6724711 0.6785616 -0.9968411 0.7251511 0.7291904 -0.9975191 0.7716352 0.7742877 -0.9980488 0.8118921 0.813619 -0.9984638 0.8461977 0.8473137 -0.9987895 0.8750329 0.8757496 -0.9990456 0.8989921 0.89945 -0.999247 0.9187101 0.9190013 -0.9994057 0.9348102 0.9349948 -0.9995309 0.947872 0.9479887 -0.9996295 0.9584138 0.9584874 -0.9997074 0.9668859 0.9669322 -0.9997688 0.9736717 0.9737008 -0.9998174 0.9790921 0.9791104 -0.9998557 0.9834126 0.983424 -0.999886 0.9868503 0.9868574 -0.9999099 0.9895819 0.9895864 -0.9999288 0.99175 0.9917528 -0.9999437 0.9934694 0.9934712 -0.0000238 0.0821895 0.3429792 -0.0000382 0.081686 0.3424757 -0.0000611 0.0810538 0.3418435 -0.0000978 0.0802616 0.3410514 -0.0001565 0.0792718 0.3400615 -0.0002504 0.0780392 0.3388289 -0.0004008 0.0765113 0.337301 -0.0006416 0.0746288 0.3354185 -0.0010268 0.0723279 0.3331176 -0.0016435 0.0695462 0.3303359 -0.0026305 0.0662338 0.3270236 -0.0042103 0.0623743 0.3231641 -0.0067388 0.0580214 0.3188112 -0.0107859 0.0533626 0.3141524 -0.0172633 0.0488261 0.3096159 -0.0276309 0.0452595 0.3060492 -0.0441188 0.0441188 0.3049085 -0.0664212 0.0441188 0.3049085 -0.0946366 0.0441188 0.3049085 -0.1303328 0.0441188 0.3049085 -0.1754932 0.0441188 0.3049085 -0.2326269 0.0441188 0.3049085 -0.3049085 0.0441188 0.3049085 -0.3963542 0.0441188 0.3049085 -0.5120448 0.0441188 0.3049085 -0.6584084 0.0441188 0.3049085 -0.8219901 0.0455041 0.2988 -0.8967447 0.0594506 0.2706852 -0.9325696 0.0860209 0.2520025 -0.9531389 0.1231452 0.2500942 -0.9661878 0.1694384 0.2647781 -0.9749962 0.2235962 0.2940963 -0.9811943 0.2841192 0.3354901 -0.9856839 0.3492254 0.3861159 -0.9890048 0.4168922 0.4430013 -0.9914995 0.4849907 0.5032055 -0.9933953 0.5514695 0.5640008 -0.9948487 0.6145393 0.6230471 -0.9959706 0.6728136 0.6785192 -0.9968409 0.7253775 0.7291615 -0.9975189 0.7717834 0.7742682 -0.9980488 0.8119884 0.8136061 -0.9984638 0.8462598 0.8473052 -0.9987895 0.8750727 0.8757441 -0.9990455 0.8990175 0.8994464 -0.999247 0.9187262 0.918999 -0.9994057 0.9348204 0.9349933 -0.9995308 0.9478785 0.9479878 -0.9996295 0.9584178 0.9584868 -0.9997074 0.9668884 0.9669318 -0.9997688 0.9736733 0.9737006 -0.9998174 0.9790931 0.9791103 -0.9998557 0.9834132 0.9834239 -0.999886 0.9868507 0.9868574 -0.9999099 0.9895821 0.9895863 -0.9999288 0.9917502 0.9917528 -0.9999437 0.9934695 0.9934712 -0.0000238 0.1044919 0.3429792 -0.0000382 0.1039884 0.3424757 -0.0000611 0.1033562 0.3418435 -0.0000978 0.102564 0.3410514 -0.0001565 0.1015742 0.3400615 -0.0002504 0.1003416 0.3388289 -0.0004008 0.0988137 0.337301 -0.0006416 0.0969312 0.3354185 -0.0010268 0.0946303 0.3331176 -0.0016435 0.0918486 0.3303359 -0.0026305 0.0885362 0.3270236 -0.0042103 0.0846767 0.3231641 -0.0067388 0.0803239 0.3188112 -0.0107859 0.075665 0.3141524 -0.0172633 0.0711285 0.3096159 -0.0276309 0.0675619 0.3060492 -0.0441188 0.0664212 0.3049085 -0.0664212 0.0664212 0.3049085 -0.0946366 0.0664212 0.3049085 -0.1303328 0.0664212 0.3049085 -0.1754932 0.0664212 0.3049085 -0.2326269 0.0664212 0.3049085 -0.3049085 0.0664212 0.3049085 -0.3963542 0.0664212 0.3049085 -0.5120448 0.0664212 0.3049085 -0.6584084 0.0664212 0.3049085 -0.8219901 0.0671656 0.2988 -0.8967447 0.0775151 0.2706852 -0.9325696 0.1002154 0.2520025 -0.9531389 0.1340017 0.2500942 -0.9661878 0.1775917 0.2647781 -0.9749962 0.2296253 0.2940963 -0.9811943 0.2885124 0.3354901 -0.9856839 0.3523802 0.3861159 -0.9890048 0.419125 0.4430013 -0.9914995 0.4865484 0.5032055 -0.9933953 0.5525411 0.5640008 -0.9948487 0.6152669 0.6230471 -0.9959706 0.6733015 0.6785192 -0.9968409 0.7257011 0.7291615 -0.9975189 0.7719959 0.7742682 -0.9980488 0.8121268 0.8136061 -0.9984638 0.8463492 0.8473052 -0.9987895 0.8751301 0.8757441 -0.9990455 0.8990542 0.8994464 -0.999247 0.9187495 0.918999 -0.9994057 0.9348352 0.9349933 -0.9995308 0.9478878 0.9479878 -0.9996295 0.9584237 0.9584868 -0.9997074 0.9668922 0.9669318 -0.9997688 0.9736756 0.9737006 -0.9998174 0.9790946 0.9791103 -0.9998557 0.9834141 0.9834239 -0.999886 0.9868512 0.9868574 -0.9999099 0.9895825 0.9895863 -0.9999288 0.9917504 0.9917528 -0.9999437 0.9934697 0.9934712 -0.0000238 0.1327073 0.3429792 -0.0000382 0.1322038 0.3424757 -0.0000611 0.1315716 0.3418435 -0.0000978 0.1307795 0.3410514 -0.0001565 0.1297896 0.3400615 -0.0002504 0.128557 0.3388289 -0.0004008 0.1270291 0.337301 -0.0006416 0.1251466 0.3354185 -0.0010268 0.1228457 0.3331176 -0.0016435 0.120064 0.3303359 -0.0026305 0.1167517 0.3270236 -0.0042103 0.1128922 0.3231641 -0.0067388 0.1085393 0.3188112 -0.0107859 0.1038805 0.3141524 -0.0172633 0.099344 0.3096159 -0.0276309 0.0957773 0.3060492 -0.0441188 0.0946366 0.3049085 -0.0664212 0.0946366 0.3049085 -0.0946366 0.0946366 0.3049085 -0.1303328 0.0946366 0.3049085 -0.1754932 0.0946366 0.3049085 -0.2326269 0.0946366 0.3049085 -0.3049085 0.0946366 0.3049085 -0.3963542 0.0946366 0.3049085 -0.5120448 0.0946366 0.3049085 -0.6584084 0.0946366 0.3049085 -0.8219901 0.0945703 0.2988 -0.8967447 0.1003691 0.2706852 -0.9325696 0.1181733 0.2520025 -0.9531389 0.1477366 0.2500942 -0.9661878 0.1879067 0.2647781 -0.9749962 0.2372529 0.2940963 -0.9811943 0.2940703 0.3354901 -0.9856839 0.3563715 0.3861159 -0.9890048 0.4219498 0.4430013 -0.9914995 0.4885191 0.5032055 -0.9933953 0.5538969 0.5640008 -0.9948487 0.6161874 0.6230471 -0.9959706 0.6739188 0.6785192 -0.9968409 0.7261105 0.7291615 -0.9975189 0.7722648 0.7742682 -0.9980488 0.8123018 0.8136061 -0.9984638 0.8464623 0.8473052 -0.9987895 0.8752028 0.8757441 -0.9990455 0.8991006 0.8994464 -0.999247 0.9187791 0.918999 -0.9994057 0.9348539 0.9349933 -0.9995308 0.9478997 0.9479878 -0.9996295 0.9584312 0.9584868 -0.9997074 0.9668969 0.9669318 -0.9997688 0.9736786 0.9737006 -0.9998174 0.9790965 0.9791103 -0.9998557 0.9834153 0.9834239 -0.999886 0.986852 0.9868574 -0.9999099 0.9895829 0.9895863 -0.9999288 0.9917507 0.9917528 -0.9999437 0.9934698 0.9934712 -0.0000238 0.1684036 0.3429792 -0.0000382 0.1679 0.3424757 -0.0000611 0.1672678 0.3418435 -0.0000978 0.1664757 0.3410514 -0.0001565 0.1654858 0.3400615 -0.0002504 0.1642532 0.3388289 -0.0004008 0.1627254 0.337301 -0.0006416 0.1608428 0.3354185 -0.0010268 0.1585419 0.3331176 -0.0016435 0.1557603 0.3303359 -0.0026305 0.1524479 0.3270236 -0.0042103 0.1485884 0.3231641 -0.0067388 0.1442355 0.3188112 -0.0107859 0.1395767 0.3141524 -0.0172633 0.1350402 0.3096159 -0.0276309 0.1314736 0.3060492 -0.0441188 0.1303328 0.3049085 -0.0664212 0.1303328 0.3049085 -0.0946366 0.1303328 0.3049085 -0.1303328 0.1303328 0.3049085 -0.1754932 0.1303328 0.3049085 -0.2326269 0.1303328 0.3049085 -0.3049085 0.1303328 0.3049085 -0.3963542 0.1303328 0.3049085 -0.5120448 0.1303328 0.3049085 -0.6584084 0.1303328 0.3049085 -0.8219901 0.1292408 0.2988 -0.8967447 0.1292823 0.2706852 -0.9325696 0.1408925 0.2520025 -0.9531389 0.1651131 0.2500942 -0.9661878 0.2009566 0.2647781 -0.9749962 0.2469027 0.2940963 -0.9811943 0.3011018 0.3354901 -0.9856839 0.3614209 0.3861159 -0.9890048 0.4255236 0.4430013 -0.9914995 0.4910123 0.5032055 -0.9933953 0.5556122 0.5640008 -0.9948487 0.6173519 0.6230471 -0.9959706 0.6746998 0.6785192 -0.9968409 0.7266285 0.7291615 -0.9975189 0.7726049 0.7742682 -0.9980488 0.8125232 0.8136061 -0.9984638 0.8466054 0.8473052 -0.9987895 0.8752947 0.8757441 -0.9990455 0.8991593 0.8994464 -0.999247 0.9188164 0.918999 -0.9994057 0.9348776 0.9349933 -0.9995308 0.9479146 0.9479878 -0.9996295 0.9584406 0.9584868 -0.9997074 0.9669028 0.9669318 -0.9997688 0.9736823 0.9737006 -0.9998174 0.9790988 0.9791103 -0.9998557 0.9834167 0.9834239 -0.999886 0.9868529 0.9868574 -0.9999099 0.9895835 0.9895863 -0.9999288 0.991751 0.9917528 -0.9999437 0.9934701 0.9934712 -0.0000238 0.2135639 0.3429792 -0.0000382 0.2130604 0.3424757 -0.0000611 0.2124282 0.3418435 -0.0000978 0.2116361 0.3410514 -0.0001565 0.2106462 0.3400615 -0.0002504 0.2094136 0.3388289 -0.0004008 0.2078857 0.337301 -0.0006416 0.2060032 0.3354185 -0.0010268 0.2037023 0.3331176 -0.0016435 0.2009206 0.3303359 -0.0026305 0.1976083 0.3270236 -0.0042103 0.1937488 0.3231641 -0.0067388 0.1893959 0.3188112 -0.0107859 0.1847371 0.3141524 -0.0172633 0.1802005 0.3096159 -0.0276309 0.1766339 0.3060492 -0.0441188 0.1754932 0.3049085 -0.0664212 0.1754932 0.3049085 -0.0946366 0.1754932 0.3049085 -0.1303328 0.1754932 0.3049085 -0.1754932 0.1754932 0.3049085 -0.2326269 0.1754932 0.3049085 -0.3049085 0.1754932 0.3049085 -0.3963542 0.1754932 0.3049085 -0.5120448 0.1754932 0.3049085 -0.6584084 0.1754932 0.3049085 -0.8219901 0.1731034 0.2988 -0.8967447 0.1658613 0.2706852 -0.9325696 0.1696351 0.2520025 -0.9531389 0.1870965 0.2500942 -0.9661878 0.2174663 0.2647781 -0.9749962 0.2591111 0.2940963 -0.9811943 0.3099976 0.3354901 -0.9856839 0.3678092 0.3861159 -0.9890048 0.4300448 0.4430013 -0.9914995 0.4941665 0.5032055 -0.9933953 0.5577822 0.5640008 -0.9948487 0.6188252 0.6230471 -0.9959706 0.6756878 0.6785192 -0.9968409 0.7272837 0.7291615 -0.9975189 0.7730352 0.7742682 -0.9980488 0.8128033 0.8136061 -0.9984638 0.8467864 0.8473052 -0.9987895 0.8754109 0.8757441 -0.9990455 0.8992336 0.8994464 -0.999247 0.9188636 0.918999 -0.9994057 0.9349075 0.9349933 -0.9995308 0.9479335 0.9479878 -0.9996295 0.9584526 0.9584868 -0.9997074 0.9669103 0.9669318 -0.9997688 0.973687 0.9737006 -0.9998174 0.9791018 0.9791103 -0.9998557 0.9834186 0.9834239 -0.999886 0.9868541 0.9868574 -0.9999099 0.9895842 0.9895863 -0.9999288 0.9917515 0.9917528 -0.9999437 0.9934704 0.9934712 -0.0000238 0.2706977 0.3429792 -0.0000382 0.2701941 0.3424757 -0.0000611 0.2695619 0.3418435 -0.0000978 0.2687698 0.3410514 -0.0001565 0.2677799 0.3400615 -0.0002504 0.2665473 0.3388289 -0.0004008 0.2650195 0.337301 -0.0006416 0.2631369 0.3354185 -0.0010268 0.260836 0.3331176 -0.0016435 0.2580543 0.3303359 -0.0026305 0.254742 0.3270236 -0.0042103 0.2508825 0.3231641 -0.0067388 0.2465296 0.3188112 -0.0107859 0.2418708 0.3141524 -0.0172633 0.2373343 0.3096159 -0.0276309 0.2337676 0.3060492 -0.0441188 0.2326269 0.3049085 -0.0664212 0.2326269 0.3049085 -0.0946366 0.2326269 0.3049085 -0.1303328 0.2326269 0.3049085 -0.1754932 0.2326269 0.3049085 -0.2326269 0.2326269 0.3049085 -0.3049085 0.2326269 0.3049085 -0.3963542 0.2326269 0.3049085 -0.5120448 0.2326269 0.3049085 -0.6584084 0.2326269 0.3049085 -0.8219901 0.2285954 0.2988 -0.8967447 0.2121385 0.2706852 -0.9325696 0.2059983 0.2520025 -0.9531389 0.2149085 0.2500942 -0.9661878 0.2383533 0.2647781 -0.9749962 0.2745562 0.2940963 -0.9811943 0.3212519 0.3354901 -0.9856839 0.3758911 0.3861159 -0.9890048 0.4357648 0.4430013 -0.9914995 0.498157 0.5032055 -0.9933953 0.5605276 0.5640008 -0.9948487 0.6206891 0.6230471 -0.9959706 0.6769378 0.6785192 -0.9968409 0.7281127 0.7291615 -0.9975189 0.7735795 0.7742682 -0.9980488 0.8131577 0.8136061 -0.9984638 0.8470154 0.8473052 -0.9987895 0.875558 0.8757441 -0.9990455 0.8993275 0.8994464 -0.999247 0.9189234 0.918999 -0.9994057 0.9349454 0.9349933 -0.9995308 0.9479575 0.9479878 -0.9996295 0.9584677 0.9584868 -0.9997074 0.9669198 0.9669318 -0.9997688 0.973693 0.9737006 -0.9998174 0.9791055 0.9791103 -0.9998557 0.9834209 0.9834239 -0.999886 0.9868555 0.9868574 -0.9999099 0.9895851 0.9895863 -0.9999288 0.9917521 0.9917528 -0.9999437 0.9934707 0.9934712 -0.0000238 0.3429792 0.3429792 -0.0000382 0.3424757 0.3424757 -0.0000611 0.3418435 0.3418435 -0.0000978 0.3410514 0.3410514 -0.0001565 0.3400615 0.3400615 -0.0002504 0.3388289 0.3388289 -0.0004008 0.337301 0.337301 -0.0006416 0.3354185 0.3354185 -0.0010268 0.3331176 0.3331176 -0.0016435 0.3303359 0.3303359 -0.0026305 0.3270236 0.3270236 -0.0042103 0.3231641 0.3231641 -0.0067388 0.3188112 0.3188112 -0.0107859 0.3141524 0.3141524 -0.0172633 0.3096159 0.3096159 -0.0276309 0.3060492 0.3060492 -0.0441188 0.3049085 0.3049085 -0.0664212 0.3049085 0.3049085 -0.0946366 0.3049085 0.3049085 -0.1303328 0.3049085 0.3049085 -0.1754932 0.3049085 0.3049085 -0.2326269 0.3049085 0.3049085 -0.3049085 0.3049085 0.3049085 -0.3963542 0.3049085 0.3049085 -0.5120448 0.3049085 0.3049085 -0.6584084 0.3049085 0.3049085 -0.8219901 0.2988 0.2988 -0.8967447 0.2706852 0.2706852 -0.9325696 0.2520025 0.2520025 -0.9531389 0.2500942 0.2500942 -0.9661878 0.2647781 0.2647781 -0.9749962 0.2940963 0.2940963 -0.9811943 0.3354901 0.3354901 -0.9856839 0.3861159 0.3861159 -0.9890048 0.4430013 0.4430013 -0.9914995 0.5032055 0.5032055 -0.9933953 0.5640008 0.5640008 -0.9948487 0.6230471 0.6230471 -0.9959706 0.6785192 0.6785192 -0.9968409 0.7291615 0.7291615 -0.9975189 0.7742682 0.7742682 -0.9980488 0.8136061 0.8136061 -0.9984638 0.8473052 0.8473052 -0.9987895 0.8757441 0.8757441 -0.9990455 0.8994464 0.8994464 -0.999247 0.918999 0.918999 -0.9994057 0.9349933 0.9349933 -0.9995308 0.9479878 0.9479878 -0.9996295 0.9584868 0.9584868 -0.9997074 0.9669318 0.9669318 -0.9997688 0.9737006 0.9737006 -0.9998174 0.9791103 0.9791103 -0.9998557 0.9834239 0.9834239 -0.999886 0.9868574 0.9868574 -0.9999099 0.9895863 0.9895863 -0.9999288 0.9917528 0.9917528 -0.9999437 0.9934712 0.9934712 -0.0000238 0.4344249 0.3429792 -0.0000382 0.4339214 0.3424757 -0.0000611 0.4332891 0.3418435 -0.0000978 0.432497 0.3410514 -0.0001565 0.4315072 0.3400615 -0.0002504 0.4302746 0.3388289 -0.0004008 0.4287467 0.337301 -0.0006416 0.4268641 0.3354185 -0.0010268 0.4245633 0.3331176 -0.0016435 0.4217816 0.3303359 -0.0026305 0.4184692 0.3270236 -0.0042103 0.4146097 0.3231641 -0.0067388 0.4102568 0.3188112 -0.0107859 0.405598 0.3141524 -0.0172633 0.4010615 0.3096159 -0.0276309 0.3974949 0.3060492 -0.0441188 0.3963542 0.3049085 -0.0664212 0.3963542 0.3049085 -0.0946366 0.3963542 0.3049085 -0.1303328 0.3963542 0.3049085 -0.1754932 0.3963542 0.3049085 -0.2326269 0.3963542 0.3049085 -0.3049085 0.3963542 0.3049085 -0.3963542 0.3963542 0.3049085 -0.5120448 0.3963542 0.3049085 -0.6584084 0.3963542 0.3049085 -0.8219901 0.3876179 0.2988 -0.8967447 0.3447543 0.2706852 -0.9325696 0.3102037 0.2520025 -0.9531389 0.2946088 0.2500942 -0.9661878 0.2982089 0.2647781 -0.9749962 0.3188171 0.2940963 -0.9811943 0.3535032 0.3354901 -0.9856839 0.3990515 0.3861159 -0.9890048 0.4521565 0.4430013 -0.9914995 0.5095925 0.5032055 -0.9933953 0.5683949 0.5640008 -0.9948487 0.6260304 0.6230471 -0.9959706 0.6805199 0.6785192 -0.9968409 0.7304884 0.7291615 -0.9975189 0.7751395 0.7742682 -0.9980488 0.8141733 0.8136061 -0.9984638 0.8476717 0.8473052 -0.9987895 0.8759795 0.8757441 -0.9990455 0.8995968 0.8994464 -0.999247 0.9190947 0.918999 -0.9994057 0.935054 0.9349933 -0.9995308 0.9480261 0.9479878 -0.9996295 0.9585109 0.9584868 -0.9997074 0.966947 0.9669318 -0.9997688 0.9737101 0.9737006 -0.9998174 0.9791163 0.9791103 -0.9998557 0.9834277 0.9834239 -0.999886 0.9868597 0.9868574 -0.9999099 0.9895878 0.9895863 -0.9999288 0.9917537 0.9917528 -0.9999437 0.9934718 0.9934712 -0.0000238 0.5501155 0.3429792 -0.0000382 0.549612 0.3424757 -0.0000611 0.5489798 0.3418435 -0.0000978 0.5481876 0.3410514 -0.0001565 0.5471978 0.3400615 -0.0002504 0.5459652 0.3388289 -0.0004008 0.5444373 0.337301 -0.0006416 0.5425548 0.3354185 -0.0010268 0.5402539 0.3331176 -0.0016435 0.5374722 0.3303359 -0.0026305 0.5341598 0.3270236 -0.0042103 0.5303003 0.3231641 -0.0067388 0.5259474 0.3188112 -0.0107859 0.5212886 0.3141524 -0.0172633 0.5167521 0.3096159 -0.0276309 0.5131855 0.3060492 -0.0441188 0.5120448 0.3049085 -0.0664212 0.5120448 0.3049085 -0.0946366 0.5120448 0.3049085 -0.1303328 0.5120448 0.3049085 -0.1754932 0.5120448 0.3049085 -0.2326269 0.5120448 0.3049085 -0.3049085 0.5120448 0.3049085 -0.3963542 0.5120448 0.3049085 -0.5120448 0.5120448 0.3049085 -0.6584084 0.5120448 0.3049085 -0.8219901 0.4999841 0.2988 -0.8967447 0.4384614 0.2706852 -0.9325696 0.3838358 0.2520025 -0.9531389 0.3509254 0.2500942 -0.9661878 0.3405032 0.2647781 -0.9749962 0.3500921 0.2940963 -0.9811943 0.3762922 0.3354901 -0.9856839 0.4154167 0.3861159 -0.9890048 0.4637389 0.4430013 -0.9914995 0.5176729 0.5032055 -0.9933953 0.573954 0.5640008 -0.9948487 0.6298046 0.6230471 -0.9959706 0.683051 0.6785192 -0.9968409 0.732167 0.7291615 -0.9975189 0.7762418 0.7742682 -0.9980488 0.8148909 0.8136061 -0.9984638 0.8481355 0.8473052 -0.9987895 0.8762773 0.8757441 -0.9990455 0.899787 0.8994464 -0.999247 0.9192157 0.918999 -0.9994057 0.9351307 0.9349933 -0.9995308 0.9480746 0.9479878 -0.9996295 0.9585415 0.9584868 -0.9997074 0.9669663 0.9669318 -0.9997688 0.9737222 0.9737006 -0.9998174 0.9791238 0.9791103 -0.9998557 0.9834324 0.9834239 -0.999886 0.9868627 0.9868574 -0.9999099 0.9895897 0.9895863 -0.9999288 0.9917549 0.9917528 -0.9999437 0.9934725 0.9934712 -0.0000238 0.6964791 0.3429792 -0.0000382 0.6959756 0.3424757 -0.0000611 0.6953434 0.3418435 -0.0000978 0.6945513 0.3410514 -0.0001565 0.6935614 0.3400615 -0.0002504 0.6923288 0.3388289 -0.0004008 0.6908009 0.337301 -0.0006416 0.6889184 0.3354185 -0.0010268 0.6866175 0.3331176 -0.0016435 0.6838358 0.3303359 -0.0026305 0.6805235 0.3270236 -0.0042103 0.676664 0.3231641 -0.0067388 0.6723111 0.3188112 -0.0107859 0.6676523 0.3141524 -0.0172633 0.6631157 0.3096159 -0.0276309 0.6595491 0.3060492 -0.0441188 0.6584084 0.3049085 -0.0664212 0.6584084 0.3049085 -0.0946366 0.6584084 0.3049085 -0.1303328 0.6584084 0.3049085 -0.1754932 0.6584084 0.3049085 -0.2326269 0.6584084 0.3049085 -0.3049085 0.6584084 0.3049085 -0.3963542 0.6584084 0.3049085 -0.5120448 0.6584084 0.3049085 -0.6584084 0.6584084 0.3049085 -0.8219901 0.6421419 0.2988 -0.8967447 0.557013 0.2706852 -0.9325696 0.4769901 0.2520025 -0.9531389 0.4221733 0.2500942 -0.9661878 0.3940109 0.2647781 -0.9749962 0.389659 0.2940963 -0.9811943 0.4051232 0.3354901 -0.9856839 0.4361208 0.3861159 -0.9890048 0.4783922 0.4430013 -0.9914995 0.5278957 0.5032055 -0.9933953 0.580987 0.5640008 -0.9948487 0.6345795 0.6230471 -0.9959706 0.6862532 0.6785192 -0.9968409 0.7342907 0.7291615 -0.9975189 0.7776364 0.7742682 -0.9980488 0.8157988 0.8136061 -0.9984638 0.8487222 0.8473052 -0.9987895 0.8766541 0.8757441 -0.9990455 0.9000277 0.8994464 -0.999247 0.9193688 0.918999 -0.9994057 0.9352277 0.9349933 -0.9995308 0.9481359 0.9479878 -0.9996295 0.9585802 0.9584868 -0.9997074 0.9669906 0.9669318 -0.9997688 0.9737375 0.9737006 -0.9998174 0.9791334 0.9791103 -0.9998557 0.9834385 0.9834239 -0.999886 0.9868665 0.9868574 -0.9999099 0.989592 0.9895863 -0.9999288 0.9917564 0.9917528 -0.9999437 0.9934734 0.9934712 -0.0051514 0.8407292 0.3301945 -0.0051286 0.8405071 0.3297942 -0.0051047 0.8402274 0.329291 -0.0050826 0.8398756 0.3286597 -0.0050676 0.8394338 0.3278694 -0.0050694 0.8388802 0.3268833 -0.0051048 0.8381886 0.3256576 -0.0052028 0.8373283 0.3241424 -0.0054121 0.8362644 0.3222829 -0.0058134 0.8349593 0.3200238 -0.0065402 0.8333779 0.3173179 -0.0078103 0.8314967 0.314143 -0.0099781 0.8293233 0.3105336 -0.0136166 0.8269342 0.3066367 -0.0196467 0.8245426 0.3028082 -0.0295373 0.8226154 0.2997746 -0.0455041 0.8219901 0.2988 -0.0671656 0.8219901 0.2988 -0.0945703 0.8219901 0.2988 -0.1292408 0.8219901 0.2988 -0.1731034 0.8219901 0.2988 -0.2285954 0.8219901 0.2988 -0.2988 0.8219901 0.2988 -0.3876179 0.8219901 0.2988 -0.4999841 0.8219901 0.2988 -0.6421419 0.8219901 0.2988 -0.8219901 0.8219901 0.2988 -0.8967447 0.7069963 0.2706852 -0.9325696 0.5948423 0.2520025 -0.9531389 0.5123112 0.2500942 -0.9661878 0.4617052 0.2647781 -0.9749962 0.4397163 0.2940963 -0.9811943 0.4415982 0.3354901 -0.9856839 0.4623142 0.3861159 -0.9890048 0.4969305 0.4430013 -0.9914995 0.5408288 0.5032055 -0.9933953 0.5898847 0.5640008 -0.9948487 0.6406203 0.6230471 -0.9959706 0.6903044 0.6785192 -0.9968409 0.7369774 0.7291615 -0.9975189 0.7794007 0.7742682 -0.9980488 0.8169474 0.8136061 -0.9984638 0.8494644 0.8473052 -0.9987895 0.8771307 0.8757441 -0.9990455 0.9003323 0.8994464 -0.999247 0.9195625 0.918999 -0.9994057 0.9353505 0.9349933 -0.9995308 0.9482135 0.9479878 -0.9996295 0.9586291 0.9584868 -0.9997074 0.9670214 0.9669318 -0.9997688 0.9737569 0.9737006 -0.9998174 0.9791456 0.9791103 -0.9998557 0.9834461 0.9834239 -0.999886 0.9868713 0.9868574 -0.9999099 0.989595 0.9895863 -0.9999288 0.9917582 0.9917528 -0.9999437 0.9934746 0.9934712 -0.0279321 0.9033413 0.2969793 -0.0278872 0.9032596 0.2966415 -0.0278347 0.9031567 0.2962171 -0.0277752 0.9030276 0.2956846 -0.0277111 0.9028657 0.2950184 -0.0276479 0.9026634 0.2941874 -0.0275966 0.9024114 0.2931551 -0.0275778 0.9020992 0.2918798 -0.0276281 0.9017148 0.290316 -0.0278105 0.9012461 0.2884181 -0.0282324 0.900682 0.2861474 -0.0290732 0.9000167 0.2834869 -0.0306306 0.8992555 0.2804673 -0.0333932 0.8984278 0.2772127 -0.0381561 0.8976087 0.2740209 -0.0461985 0.8969554 0.2714957 -0.0594506 0.8967447 0.2706852 -0.0775151 0.8967447 0.2706852 -0.1003691 0.8967447 0.2706852 -0.1292823 0.8967447 0.2706852 -0.1658613 0.8967447 0.2706852 -0.2121385 0.8967447 0.2706852 -0.2706852 0.8967447 0.2706852 -0.3447543 0.8967447 0.2706852 -0.4384614 0.8967447 0.2706852 -0.557013 0.8967447 0.2706852 -0.7069963 0.8967447 0.2706852 -0.8967447 0.8967447 0.2706852 -0.9325696 0.7439407 0.2520025 -0.9531389 0.6263473 0.2500942 -0.9661878 0.5473473 0.2647781 -0.9749962 0.5030453 0.2940963 -0.9811943 0.4877437 0.3354901 -0.9856839 0.4954523 0.3861159 -0.9890048 0.5203839 0.4430013 -0.9914995 0.5571908 0.5032055 -0.9933953 0.6011414 0.5640008 -0.9948487 0.6482627 0.6230471 -0.9959706 0.6954296 0.6785192 -0.9968409 0.7403765 0.7291615 -0.9975189 0.7816327 0.7742682 -0.9980488 0.8184005 0.8136061 -0.9984638 0.8504035 0.8473052 -0.9987895 0.8777338 0.8757441 -0.9990455 0.9007175 0.8994464 -0.999247 0.9198076 0.918999 -0.9994057 0.9355059 0.9349933 -0.9995308 0.9483117 0.9479878 -0.9996295 0.958691 0.9584868 -0.9997074 0.9670604 0.9669318 -0.9997688 0.9737814 0.9737006 -0.9998174 0.979161 0.9791103 -0.9998557 0.9834557 0.9834239 -0.999886 0.9868773 0.9868574 -0.9999099 0.9895988 0.9895863 -0.9999288 0.9917606 0.9917528 -0.9999437 0.9934761 0.9934712 -0.0624569 0.9354466 0.274455 -0.0624063 0.9354101 0.2741654 -0.0623458 0.9353643 0.2738014 -0.0622749 0.9353068 0.2733449 -0.0621943 0.9352348 0.2727739 -0.0621069 0.9351449 0.2720617 -0.0620199 0.9350332 0.2711774 -0.0619473 0.9348949 0.2700853 -0.061916 0.9347252 0.2687468 -0.0619734 0.9345187 0.2671233 -0.062202 0.9342712 0.2651822 -0.062742 0.9339805 0.2629098 -0.0638283 0.9336494 0.260333 -0.0658501 0.9332914 0.2575585 -0.0694453 0.9329391 0.2548403 -0.0756464 0.9326595 0.2526918 -0.0860209 0.9325696 0.2520025 -0.1002154 0.9325696 0.2520025 -0.1181733 0.9325696 0.2520025 -0.1408925 0.9325696 0.2520025 -0.1696351 0.9325696 0.2520025 -0.2059983 0.9325696 0.2520025 -0.2520025 0.9325696 0.2520025 -0.3102037 0.9325696 0.2520025 -0.3838358 0.9325696 0.2520025 -0.4769901 0.9325696 0.2520025 -0.5948423 0.9325696 0.2520025 -0.7439407 0.9325696 0.2520025 -0.9325696 0.9325696 0.2520025 -0.9531389 0.7706179 0.2500942 -0.9661878 0.6556956 0.2647781 -0.9749962 0.5831647 0.2940963 -0.9811943 0.5461239 0.3354901 -0.9856839 0.5373763 0.3861159 -0.9890048 0.5500554 0.4430013 -0.9914995 0.577891 0.5032055 -0.9933953 0.6153825 0.5640008 -0.9948487 0.6579314 0.6230471 -0.9959706 0.7019138 0.6785192 -0.9968409 0.7446768 0.7291615 -0.9975189 0.7844566 0.7742682 -0.9980488 0.8202389 0.8136061 -0.9984638 0.8515915 0.8473052 -0.9987895 0.8784967 0.8757441 -0.9990455 0.9012049 0.8994464 -0.999247 0.9201176 0.918999 -0.9994057 0.9357024 0.9349933 -0.9995308 0.9484359 0.9479878 -0.9996295 0.9587693 0.9584868 -0.9997074 0.9671097 0.9669318 -0.9997688 0.9738123 0.9737006 -0.9998174 0.9791804 0.9791103 -0.9998557 0.9834679 0.9834239 -0.999886 0.986885 0.9868574 -0.9999099 0.9896036 0.9895863 -0.9999288 0.9917636 0.9917528 -0.9999437 0.9934779 0.9934712 -0.1059991 0.9545467 0.2688304 -0.1059489 0.9545286 0.2685877 -0.1058883 0.9545059 0.2682827 -0.1058162 0.9544774 0.2679003 -0.1057322 0.9544418 0.267422 -0.1056375 0.9543974 0.2668257 -0.1055364 0.9543421 0.2660854 -0.1054384 0.9542739 0.2651716 -0.1053624 0.9541902 0.2640521 -0.1053433 0.9540886 0.2626949 -0.1054431 0.9539671 0.2610734 -0.1057683 0.9538247 0.2591765 -0.1064997 0.953663 0.2570275 -0.1079385 0.9534887 0.254716 -0.1105818 0.9533177 0.2524537 -0.1152388 0.9531823 0.2506671 -0.1231452 0.9531389 0.2500942 -0.1340017 0.9531389 0.2500942 -0.1477366 0.9531389 0.2500942 -0.1651131 0.9531389 0.2500942 -0.1870965 0.9531389 0.2500942 -0.2149085 0.9531389 0.2500942 -0.2500942 0.9531389 0.2500942 -0.2946088 0.9531389 0.2500942 -0.3509254 0.9531389 0.2500942 -0.4221733 0.9531389 0.2500942 -0.5123112 0.9531389 0.2500942 -0.6263473 0.9531389 0.2500942 -0.7706179 0.9531389 0.2500942 -0.9531389 0.9531389 0.2500942 -0.9661878 0.7927704 0.2647781 -0.9749962 0.6845262 0.2940963 -0.9811943 0.6199824 0.3354901 -0.9856839 0.5904156 0.3861159 -0.9890048 0.5875938 0.4430013 -0.9914995 0.6040793 0.5032055 -0.9933953 0.6333995 0.5640008 -0.9948487 0.6701635 0.6230471 -0.9959706 0.710117 0.6785192 -0.9968409 0.7501172 0.7291615 -0.9975189 0.7880291 0.7742682 -0.9980488 0.8225647 0.8136061 -0.9984638 0.8530945 0.8473052 -0.9987895 0.8794619 0.8757441 -0.9990455 0.9018215 0.8994464 -0.999247 0.9205098 0.918999 -0.9994057 0.935951 0.9349933 -0.9995308 0.9485931 0.9479878 -0.9996295 0.9588684 0.9584868 -0.9997074 0.967172 0.9669318 -0.9997688 0.9738515 0.9737006 -0.9998174 0.979205 0.9791103 -0.9998557 0.9834833 0.9834239 -0.999886 0.9868946 0.9868574 -0.9999099 0.9896096 0.9895863 -0.9999288 0.9917674 0.9917528 -0.9999437 0.9934803 0.9934712 -0.1572498 0.9669269 0.280033 -0.1572031 0.9669173 0.2798347 -0.1571463 0.9669053 0.2795855 -0.1570779 0.9668902 0.2792731 -0.1569971 0.9668714 0.2788823 -0.156904 0.9668479 0.2783953 -0.1568008 0.9668187 0.2777909 -0.1566936 0.9667827 0.277045 -0.1565954 0.9667385 0.2761317 -0.1565315 0.966685 0.2750249 -0.1565473 0.9666211 0.2737034 -0.1567226 0.9665463 0.2721586 -0.1571937 0.9664615 0.2704099 -0.15819 0.9663702 0.2685306 -0.160092 0.9662809 0.2666929 -0.1635226 0.9662104 0.2652429 -0.1694384 0.9661878 0.2647781 -0.1775917 0.9661878 0.2647781 -0.1879067 0.9661878 0.2647781 -0.2009566 0.9661878 0.2647781 -0.2174663 0.9661878 0.2647781 -0.2383533 0.9661878 0.2647781 -0.2647781 0.9661878 0.2647781 -0.2982089 0.9661878 0.2647781 -0.3405032 0.9661878 0.2647781 -0.3940109 0.9661878 0.2647781 -0.4617052 0.9661878 0.2647781 -0.5473473 0.9661878 0.2647781 -0.6556956 0.9661878 0.2647781 -0.7927704 0.9661878 0.2647781 -0.9661878 0.9661878 0.2647781 -0.9749962 0.8127617 0.2940963 -0.9811943 0.713423 0.3354901 -0.9856839 0.6575172 0.3861159 -0.9890048 0.6350848 0.4430013 -0.9914995 0.637211 0.5032055 -0.9933953 0.6561933 0.5640008 -0.9948487 0.6856388 0.6230471 -0.9959706 0.7204952 0.6785192 -0.9968409 0.757 0.7291615 -0.9975189 0.7925488 0.7742682 -0.9980488 0.8255071 0.8136061 -0.9984638 0.8549959 0.8473052 -0.9987895 0.880683 0.8757441 -0.9990455 0.9026016 0.8994464 -0.999247 0.9210061 0.918999 -0.9994057 0.9362655 0.9349933 -0.9995308 0.9487918 0.9479878 -0.9996295 0.9589938 0.9584868 -0.9997074 0.9672509 0.9669318 -0.9997688 0.9739011 0.9737006 -0.9998174 0.9792361 0.9791103 -0.9998557 0.9835029 0.9834239 -0.999886 0.9869069 0.9868574 -0.9999099 0.9896173 0.9895863 -0.9999288 0.9917722 0.9917528 -0.9999437 0.9934833 0.9934712 -0.2151269 0.9754027 0.3062408 -0.2150852 0.9753975 0.3060824 -0.2150342 0.9753908 0.3058834 -0.2149725 0.9753825 0.3056339 -0.2148987 0.9753721 0.305322 -0.2148124 0.9753591 0.3049333 -0.2147144 0.975343 0.304451 -0.2146085 0.9753231 0.303856 -0.2145034 0.9752987 0.3031276 -0.2144168 0.9752692 0.3022454 -0.2143816 0.975234 0.3011925 -0.2144566 0.9751928 0.2999624 -0.2147432 0.9751462 0.2985709 -0.2154135 0.9750962 0.2970766 -0.2167545 0.9750472 0.2956165 -0.2192389 0.9750086 0.2944652 -0.2235962 0.9749962 0.2940963 -0.2296253 0.9749962 0.2940963 -0.2372529 0.9749962 0.2940963 -0.2469027 0.9749962 0.2940963 -0.2591111 0.9749962 0.2940963 -0.2745562 0.9749962 0.2940963 -0.2940963 0.9749962 0.2940963 -0.3188171 0.9749962 0.2940963 -0.3500921 0.9749962 0.2940963 -0.389659 0.9749962 0.2940963 -0.4397163 0.9749962 0.2940963 -0.5030453 0.9749962 0.2940963 -0.5831647 0.9749962 0.2940963 -0.6845262 0.9749962 0.2940963 -0.8127617 0.9749962 0.2940963 -0.9749962 0.9749962 0.2940963 -0.9811943 0.8316375 0.3354901 -0.9856839 0.7424095 0.3861159 -0.9890048 0.695167 0.4430013 -0.9914995 0.6791269 0.5032055 -0.9933953 0.6850303 0.5640008 -0.9948487 0.7052169 0.6230471 -0.9959706 0.733625 0.6785192 -0.9968409 0.7657077 0.7291615 -0.9975189 0.7982669 0.7742682 -0.9980488 0.8292297 0.8136061 -0.9984638 0.8574015 0.8473052 -0.9987895 0.8822279 0.8757441 -0.9990455 0.9035886 0.8994464 -0.999247 0.9216339 0.918999 -0.9994057 0.9366635 0.9349933 -0.9995308 0.9490434 0.9479878 -0.9996295 0.9591524 0.9584868 -0.9997074 0.9673508 0.9669318 -0.9997688 0.9739638 0.9737006 -0.9998174 0.9792755 0.9791103 -0.9998557 0.9835276 0.9834239 -0.999886 0.9869223 0.9868574 -0.9999099 0.989627 0.9895863 -0.9999288 0.9917782 0.9917528 -0.9999437 0.9934871 0.9934712 -0.2783684 0.9814251 0.344958 -0.2783325 0.9814221 0.3448342 -0.2782884 0.9814183 0.3446787 -0.2782347 0.9814136 0.3444838 -0.2781701 0.9814076 0.3442401 -0.2780936 0.9814002 0.3439364 -0.2780055 0.9813911 0.3435596 -0.2779077 0.9813797 0.3430949 -0.2778058 0.9813659 0.3425263 -0.2777122 0.9813491 0.3418377 -0.2776503 0.9813291 0.3410164 -0.2776626 0.9813057 0.3400572 -0.2778236 0.9812792 0.3389728 -0.2782606 0.9812508 0.337809 -0.2791873 0.9812231 0.3366726 -0.2809573 0.9812013 0.335777 -0.2841192 0.9811943 0.3354901 -0.2885124 0.9811943 0.3354901 -0.2940703 0.9811943 0.3354901 -0.3011018 0.9811943 0.3354901 -0.3099976 0.9811943 0.3354901 -0.3212519 0.9811943 0.3354901 -0.3354901 0.9811943 0.3354901 -0.3535032 0.9811943 0.3354901 -0.3762922 0.9811943 0.3354901 -0.4051232 0.9811943 0.3354901 -0.4415982 0.9811943 0.3354901 -0.4877437 0.9811943 0.3354901 -0.5461239 0.9811943 0.3354901 -0.6199824 0.9811943 0.3354901 -0.713423 0.9811943 0.3354901 -0.8316375 0.9811943 0.3354901 -0.9811943 0.9811943 0.3354901 -0.9856839 0.8498092 0.3861159 -0.9890048 0.7711789 0.4430013 -0.9914995 0.7321559 0.5032055 -0.9933953 0.721513 0.5640008 -0.9948487 0.7299859 0.6230471 -0.9959706 0.7502359 0.6785192 -0.9968409 0.776724 0.7291615 -0.9975189 0.8055009 0.7742682 -0.9980488 0.8339392 0.8136061 -0.9984638 0.8604449 0.8473052 -0.9987895 0.8841823 0.8757441 -0.9990455 0.9048372 0.8994464 -0.999247 0.9224281 0.918999 -0.9994057 0.9371669 0.9349933 -0.9995308 0.9493615 0.9479878 -0.9996295 0.959353 0.9584868 -0.9997074 0.967477 0.9669318 -0.9997688 0.9740432 0.9737006 -0.9998174 0.9793253 0.9791103 -0.9998557 0.9835588 0.9834239 -0.999886 0.9869419 0.9868574 -0.9999099 0.9896392 0.9895863 -0.9999288 0.9917859 0.9917528 -0.9999437 0.9934919 0.9934712 -0.3454107 0.9858181 0.3933496 -0.3453807 0.9858163 0.3932548 -0.3453439 0.9858141 0.3931357 -0.3452987 0.9858113 0.3929865 -0.3452442 0.9858079 0.3928 -0.3451791 0.9858036 0.3925675 -0.3451032 0.9857982 0.3922792 -0.3450175 0.9857916 0.3919237 -0.3449254 0.9857835 0.3914887 -0.3448353 0.9857738 0.3909622 -0.3447636 0.9857621 0.3903343 -0.3447407 0.9857485 0.3896014 -0.3448204 0.9857332 0.3887731 -0.3450957 0.9857167 0.3878847 -0.3457234 0.9857006 0.3870176 -0.3469645 0.9856879 0.3863346 -0.3492254 0.9856839 0.3861159 -0.3523802 0.9856839 0.3861159 -0.3563715 0.9856839 0.3861159 -0.3614209 0.9856839 0.3861159 -0.3678092 0.9856839 0.3861159 -0.3758911 0.9856839 0.3861159 -0.3861159 0.9856839 0.3861159 -0.3990515 0.9856839 0.3861159 -0.4154167 0.9856839 0.3861159 -0.4361208 0.9856839 0.3861159 -0.4623142 0.9856839 0.3861159 -0.4954523 0.9856839 0.3861159 -0.5373763 0.9856839 0.3861159 -0.5904156 0.9856839 0.3861159 -0.6575172 0.9856839 0.3861159 -0.7424095 0.9856839 0.3861159 -0.8498092 0.9856839 0.3861159 -0.9856839 0.9856839 0.3861159 -0.9890048 0.8673437 0.4430013 -0.9914995 0.7992446 0.5032055 -0.9933953 0.7676683 0.5640008 -0.9948487 0.7613218 0.6230471 -0.9959706 0.7712508 0.6785192 -0.9968409 0.7906611 0.7291615 -0.9975189 0.8146529 0.7742682 -0.9980488 0.8398974 0.8136061 -0.9984638 0.8642952 0.8473052 -0.9987895 0.886655 0.8757441 -0.9990455 0.9064168 0.8994464 -0.999247 0.9234329 0.918999 -0.9994057 0.9378038 0.9349933 -0.9995308 0.9497641 0.9479878 -0.9996295 0.9596068 0.9584868 -0.9997074 0.9676368 0.9669318 -0.9997688 0.9741436 0.9737006 -0.9998174 0.9793883 0.9791103 -0.9998557 0.9835983 0.9834239 -0.999886 0.9869667 0.9868574 -0.9999099 0.9896547 0.9895863 -0.9999288 0.9917956 0.9917528 -0.9999437 0.993498 0.9934712 -0.4144197 0.9890841 0.4484192 -0.4143955 0.9890831 0.4483481 -0.4143657 0.9890818 0.4482588 -0.414329 0.9890801 0.4481468 -0.4142845 0.9890781 0.4480069 -0.4142311 0.9890755 0.4478326 -0.4141683 0.9890723 0.4476164 -0.4140964 0.9890684 0.4473498 -0.4140176 0.9890637 0.4470237 -0.4139373 0.9890579 0.4466291 -0.4138668 0.989051 0.4461586 -0.4138277 0.989043 0.4456096 -0.4138582 0.9890339 0.4449894 -0.4140252 0.9890241 0.4443244 -0.4144423 0.9890146 0.4436757 -0.4152991 0.9890072 0.4431649 -0.4168922 0.9890048 0.4430013 -0.419125 0.9890048 0.4430013 -0.4219498 0.9890048 0.4430013 -0.4255236 0.9890048 0.4430013 -0.4300448 0.9890048 0.4430013 -0.4357648 0.9890048 0.4430013 -0.4430013 0.9890048 0.4430013 -0.4521565 0.9890048 0.4430013 -0.4637389 0.9890048 0.4430013 -0.4783922 0.9890048 0.4430013 -0.4969305 0.9890048 0.4430013 -0.5203839 0.9890048 0.4430013 -0.5500554 0.9890048 0.4430013 -0.5875938 0.9890048 0.4430013 -0.6350848 0.9890048 0.4430013 -0.695167 0.9890048 0.4430013 -0.7711789 0.9890048 0.4430013 -0.8673437 0.9890048 0.4430013 -0.9890048 0.9890048 0.4430013 -0.9914995 0.8841204 0.5032055 -0.9933953 0.8260608 0.5640008 -0.9948487 0.8009659 0.6230471 -0.9959706 0.7978374 0.6785192 -0.9968409 0.8082934 0.7291615 -0.9975189 0.8262314 0.7742682 -0.9980488 0.8474353 0.8136061 -0.9984638 0.8691663 0.8473052 -0.9987895 0.8897832 0.8757441 -0.9990455 0.9084153 0.8994464 -0.999247 0.9247041 0.918999 -0.9994057 0.9386096 0.9349933 -0.9995308 0.9502734 0.9479878 -0.9996295 0.959928 0.9584868 -0.9997074 0.9678389 0.9669318 -0.9997688 0.9742706 0.9737006 -0.9998174 0.9794681 0.9791103 -0.9998557 0.9836483 0.9834239 -0.999886 0.986998 0.9868574 -0.9999099 0.9896744 0.9895863 -0.9999288 0.9918079 0.9917528 -0.9999437 0.9935057 0.9934712 -0.4834235 0.9915469 0.5071843 -0.4834045 0.9915463 0.507132 -0.4833811 0.9915455 0.5070663 -0.4833522 0.9915446 0.506984 -0.4833171 0.9915433 0.5068811 -0.4832747 0.9915418 0.5067529 -0.4832246 0.9915399 0.506594 -0.4831666 0.9915376 0.506398 -0.4831021 0.9915347 0.5061584 -0.4830346 0.9915312 0.5058684 -0.4829718 0.9915271 0.5055228 -0.4829286 0.9915223 0.5051196 -0.4829319 0.9915169 0.5046642 -0.4830292 0.991511 0.5041761 -0.4833013 0.9915054 0.5037002 -0.4838841 0.9915009 0.5033255 -0.4849907 0.9914995 0.5032055 -0.4865484 0.9914995 0.5032055 -0.4885191 0.9914995 0.5032055 -0.4910123 0.9914995 0.5032055 -0.4941665 0.9914995 0.5032055 -0.498157 0.9914995 0.5032055 -0.5032055 0.9914995 0.5032055 -0.5095925 0.9914995 0.5032055 -0.5176729 0.9914995 0.5032055 -0.5278957 0.9914995 0.5032055 -0.5408288 0.9914995 0.5032055 -0.5571908 0.9914995 0.5032055 -0.577891 0.9914995 0.5032055 -0.6040793 0.9914995 0.5032055 -0.637211 0.9914995 0.5032055 -0.6791269 0.9914995 0.5032055 -0.7321559 0.9914995 0.5032055 -0.7992446 0.9914995 0.5032055 -0.8841204 0.9914995 0.5032055 -0.9914995 0.9914995 0.5032055 -0.9933953 0.8999349 0.5640008 -0.9948487 0.8511207 0.6230471 -0.9959706 0.8314729 0.6785192 -0.9968409 0.8306004 0.7291615 -0.9975189 0.8408797 0.7742682 -0.9980488 0.8569716 0.8136061 -0.9984638 0.875329 0.8473052 -0.9987895 0.8937407 0.8757441 -0.9990455 0.9109436 0.8994464 -0.999247 0.9263124 0.918999 -0.9994057 0.939629 0.9349933 -0.9995308 0.9509177 0.9479878 -0.9996295 0.9603343 0.9584868 -0.9997074 0.9680946 0.9669318 -0.9997688 0.9744313 0.9737006 -0.9998174 0.9795689 0.9791103 -0.9998557 0.9837116 0.9834239 -0.999886 0.9870376 0.9868574 -0.9999099 0.9896992 0.9895863 -0.9999288 0.9918234 0.9917528 -0.9999437 0.9935154 0.9934712 -0.5504963 0.993424 0.5668669 -0.5504818 0.9934236 0.5668292 -0.550464 0.9934231 0.5667818 -0.5504419 0.9934225 0.5667225 -0.550415 0.9934218 0.5666483 -0.5503825 0.9934209 0.5665559 -0.5503438 0.9934197 0.5664413 -0.5502987 0.9934183 0.5663 -0.550248 0.9934166 0.5661273 -0.5501939 0.9934145 0.5659183 -0.5501416 0.993412 0.5656692 -0.5501012 0.9934091 0.5653788 -0.5500915 0.9934058 0.5650508 -0.5501456 0.9934023 0.5646994 -0.5503203 0.9933988 0.5643568 -0.5507113 0.9933961 0.5640871 -0.5514695 0.9933953 0.5640008 -0.5525411 0.9933953 0.5640008 -0.5538969 0.9933953 0.5640008 -0.5556122 0.9933953 0.5640008 -0.5577822 0.9933953 0.5640008 -0.5605276 0.9933953 0.5640008 -0.5640008 0.9933953 0.5640008 -0.5683949 0.9933953 0.5640008 -0.573954 0.9933953 0.5640008 -0.580987 0.9933953 0.5640008 -0.5898847 0.9933953 0.5640008 -0.6011414 0.9933953 0.5640008 -0.6153825 0.9933953 0.5640008 -0.6333995 0.9933953 0.5640008 -0.6561933 0.9933953 0.5640008 -0.6850303 0.9933953 0.5640008 -0.721513 0.9933953 0.5640008 -0.7676683 0.9933953 0.5640008 -0.8260608 0.9933953 0.5640008 -0.8999349 0.9933953 0.5640008 -0.9933953 0.9933953 0.5640008 -0.9948487 0.9145732 0.6230471 -0.9959706 0.8740262 0.6785192 -0.9968409 0.8588218 0.7291615 -0.9975189 0.8594117 0.7742682 -0.9980488 0.8690364 0.8136061 -0.9984638 0.8831255 0.8473052 -0.9987895 0.8987476 0.8757441 -0.9990455 0.9141422 0.8994464 -0.999247 0.928347 0.918999 -0.9994057 0.9409186 0.9349933 -0.9995308 0.9517328 0.9479878 -0.9996295 0.9608482 0.9584868 -0.9997074 0.9684181 0.9669318 -0.9997688 0.9746346 0.9737006 -0.9998174 0.9796966 0.9791103 -0.9998557 0.9837916 0.9834239 -0.999886 0.9870878 0.9868574 -0.9999099 0.9897306 0.9895863 -0.9999288 0.9918431 0.9917528 -0.9999437 0.9935277 0.9934712 -0.6139459 0.9948662 0.6250738 -0.6139352 0.994866 0.6250471 -0.6139219 0.9948657 0.6250135 -0.6139056 0.9948653 0.6249715 -0.6138855 0.9948649 0.624919 -0.6138613 0.9948643 0.6248536 -0.6138323 0.9948636 0.6247725 -0.6137984 0.9948628 0.6246726 -0.6137599 0.9948617 0.6245504 -0.6137183 0.9948604 0.6244026 -0.6136769 0.9948589 0.6242264 -0.6136427 0.9948571 0.624021 -0.6136284 0.9948551 0.6237891 -0.6136569 0.994853 0.6235407 -0.6137675 0.9948509 0.6232986 -0.6140266 0.9948493 0.6231081 -0.6145393 0.9948487 0.6230471 -0.6152669 0.9948487 0.6230471 -0.6161874 0.9948487 0.6230471 -0.6173519 0.9948487 0.6230471 -0.6188252 0.9948487 0.6230471 -0.6206891 0.9948487 0.6230471 -0.6230471 0.9948487 0.6230471 -0.6260304 0.9948487 0.6230471 -0.6298046 0.9948487 0.6230471 -0.6345795 0.9948487 0.6230471 -0.6406203 0.9948487 0.6230471 -0.6482627 0.9948487 0.6230471 -0.6579314 0.9948487 0.6230471 -0.6701635 0.9948487 0.6230471 -0.6856388 0.9948487 0.6230471 -0.7052169 0.9948487 0.6230471 -0.7299859 0.9948487 0.6230471 -0.7613218 0.9948487 0.6230471 -0.8009659 0.9948487 0.6230471 -0.8511207 0.9948487 0.6230471 -0.9145732 0.9948487 0.6230471 -0.9948487 0.9948487 0.6230471 -0.9959706 0.9278617 0.6785192 -0.9968409 0.8945255 0.7291615 -0.9975189 0.8828571 0.7742682 -0.9980488 0.8842998 0.8136061 -0.9984638 0.892989 0.8473052 -0.9987895 0.9050819 0.8757441 -0.9990455 0.9181889 0.8994464 -0.999247 0.9309211 0.918999 -0.9994057 0.9425502 0.9349933 -0.9995308 0.952764 0.9479878 -0.9996295 0.9614985 0.9584868 -0.9997074 0.9688274 0.9669318 -0.9997688 0.9748918 0.9737006 -0.9998174 0.979858 0.9791103 -0.9998557 0.9838928 0.9834239 -0.999886 0.9871512 0.9868574 -0.9999099 0.9897703 0.9895863 -0.9999288 0.991868 0.9917528 -0.9999437 0.9935432 0.9934712 -0.6724572 0.9959813 0.6799274 -0.6724495 0.9959811 0.6799088 -0.6724399 0.9959809 0.6798855 -0.672428 0.9959807 0.6798563 -0.6724135 0.9959804 0.6798198 -0.6723959 0.9959801 0.6797744 -0.6723748 0.9959797 0.679718 -0.67235 0.9959791 0.6796485 -0.6723217 0.9959785 0.6795635 -0.6722907 0.9959777 0.6794608 -0.6722594 0.9959768 0.6793384 -0.6722322 0.9959757 0.6791956 -0.672218 0.9959745 0.6790346 -0.672232 0.9959732 0.678862 -0.6723012 0.9959719 0.6786939 -0.6724711 0.9959709 0.6785616 -0.6728136 0.9959706 0.6785192 -0.6733015 0.9959706 0.6785192 -0.6739188 0.9959706 0.6785192 -0.6746998 0.9959706 0.6785192 -0.6756878 0.9959706 0.6785192 -0.6769378 0.9959706 0.6785192 -0.6785192 0.9959706 0.6785192 -0.6805199 0.9959706 0.6785192 -0.683051 0.9959706 0.6785192 -0.6862532 0.9959706 0.6785192 -0.6903044 0.9959706 0.6785192 -0.6954296 0.9959706 0.6785192 -0.7019138 0.9959706 0.6785192 -0.710117 0.9959706 0.6785192 -0.7204952 0.9959706 0.6785192 -0.733625 0.9959706 0.6785192 -0.7502359 0.9959706 0.6785192 -0.7712508 0.9959706 0.6785192 -0.7978374 0.9959706 0.6785192 -0.8314729 0.9959706 0.6785192 -0.8740262 0.9959706 0.6785192 -0.9278617 0.9959706 0.6785192 -0.9959706 0.9959706 0.6785192 -0.9968409 0.9396953 0.7291615 -0.9975189 0.9125186 0.7742682 -0.9980488 0.9036101 0.8136061 -0.9984638 0.9054678 0.8473052 -0.9987895 0.9130957 0.8757441 -0.9990455 0.9233085 0.8994464 -0.999247 0.9341777 0.918999 -0.9994057 0.9446144 0.9349933 -0.9995308 0.9540687 0.9479878 -0.9996295 0.9623212 0.9584868 -0.9997074 0.9693452 0.9669318 -0.9997688 0.9752172 0.9737006 -0.9998174 0.9800622 0.9791103 -0.9998557 0.9840209 0.9834239 -0.999886 0.9872315 0.9868574 -0.9999099 0.9898206 0.9895863 -0.9999288 0.9918994 0.9917528 -0.9999437 0.9935629 0.9934712 -0.7251659 0.9968475 0.7301243 -0.7251605 0.9968474 0.7301116 -0.7251537 0.9968473 0.7300957 -0.7251454 0.9968472 0.7300757 -0.7251351 0.996847 0.7300507 -0.7251226 0.9968468 0.7300196 -0.7251076 0.9968465 0.7299811 -0.7250899 0.9968462 0.7299335 -0.7250697 0.9968458 0.7298754 -0.7250473 0.9968453 0.7298052 -0.7250244 0.9968448 0.7297214 -0.7250039 0.9968441 0.7296238 -0.7249916 0.9968433 0.7295137 -0.7249978 0.9968425 0.7293958 -0.7250408 0.9968418 0.7292808 -0.7251511 0.9968411 0.7291904 -0.7253775 0.9968409 0.7291615 -0.7257011 0.9968409 0.7291615 -0.7261105 0.9968409 0.7291615 -0.7266285 0.9968409 0.7291615 -0.7272837 0.9968409 0.7291615 -0.7281127 0.9968409 0.7291615 -0.7291615 0.9968409 0.7291615 -0.7304884 0.9968409 0.7291615 -0.732167 0.9968409 0.7291615 -0.7342907 0.9968409 0.7291615 -0.7369774 0.9968409 0.7291615 -0.7403765 0.9968409 0.7291615 -0.7446768 0.9968409 0.7291615 -0.7501172 0.9968409 0.7291615 -0.757 0.9968409 0.7291615 -0.7657077 0.9968409 0.7291615 -0.776724 0.9968409 0.7291615 -0.7906611 0.9968409 0.7291615 -0.8082934 0.9968409 0.7291615 -0.8306004 0.9968409 0.7291615 -0.8588218 0.9968409 0.7291615 -0.8945255 0.9968409 0.7291615 -0.9396953 0.9968409 0.7291615 -0.9968409 0.9968409 0.7291615 -0.9975189 0.9500442 0.7742682 -0.9980488 0.9280401 0.8136061 -0.9984638 0.921255 0.8473052 -0.9987895 0.9232341 0.8757441 -0.9990455 0.9297854 0.8994464 -0.999247 0.9382977 0.918999 -0.9994057 0.9472259 0.9349933 -0.9995308 0.9557192 0.9479878 -0.9996295 0.963362 0.9584868 -0.9997074 0.9700002 0.9669318 -0.9997688 0.9756289 0.9737006 -0.9998174 0.9803206 0.9791103 -0.9998557 0.9841829 0.9834239 -0.999886 0.987333 0.9868574 -0.9999099 0.9898842 0.9895863 -0.9999288 0.9919392 0.9917528 -0.9999437 0.9935878 0.9934712 -0.7716588 0.997523 0.7749171 -0.7716551 0.997523 0.7749085 -0.7716504 0.9975229 0.7748978 -0.7716446 0.9975228 0.7748843 -0.7716375 0.9975227 0.7748674 -0.7716288 0.9975226 0.7748465 -0.7716184 0.9975224 0.7748205 -0.7716061 0.9975222 0.7747884 -0.7715919 0.997522 0.7747493 -0.7715762 0.9975217 0.7747019 -0.7715599 0.9975213 0.7746455 -0.7715449 0.9975209 0.7745797 -0.7715352 0.9975204 0.7745055 -0.7715376 0.9975199 0.774426 -0.7715641 0.9975194 0.7743486 -0.7716352 0.9975191 0.7742877 -0.7717834 0.9975189 0.7742682 -0.7719959 0.9975189 0.7742682 -0.7722648 0.9975189 0.7742682 -0.7726049 0.9975189 0.7742682 -0.7730352 0.9975189 0.7742682 -0.7735795 0.9975189 0.7742682 -0.7742682 0.9975189 0.7742682 -0.7751395 0.9975189 0.7742682 -0.7762418 0.9975189 0.7742682 -0.7776364 0.9975189 0.7742682 -0.7794007 0.9975189 0.7742682 -0.7816327 0.9975189 0.7742682 -0.7844566 0.9975189 0.7742682 -0.7880291 0.9975189 0.7742682 -0.7925488 0.9975189 0.7742682 -0.7982669 0.9975189 0.7742682 -0.8055009 0.9975189 0.7742682 -0.8146529 0.9975189 0.7742682 -0.8262314 0.9975189 0.7742682 -0.8408797 0.9975189 0.7742682 -0.8594117 0.9975189 0.7742682 -0.8828571 0.9975189 0.7742682 -0.9125186 0.9975189 0.7742682 -0.9500442 0.9975189 0.7742682 -0.9975189 0.9975189 0.7742682 -0.9980488 0.9589472 0.8136061 -0.9984638 0.9412278 0.8473052 -0.9987895 0.9360606 0.8757441 -0.9990455 0.9379796 0.8994464 -0.999247 0.94351 0.918999 -0.9994057 0.9505298 0.9349933 -0.9995308 0.9578074 0.9479878 -0.9996295 0.9646787 0.9584868 -0.9997074 0.970829 0.9669318 -0.9997688 0.9761497 0.9737006 -0.9998174 0.9806476 0.9791103 -0.9998557 0.984388 0.9834239 -0.999886 0.9874615 0.9868574 -0.9999099 0.9899646 0.9895863 -0.9999288 0.9919896 0.9917528 -0.9999437 0.9936193 0.9934712 -0.8119154 0.9980513 0.8140378 -0.8119128 0.9980512 0.8140321 -0.8119096 0.9980512 0.8140249 -0.8119057 0.9980511 0.8140159 -0.8119009 0.9980511 0.8140047 -0.8118949 0.998051 0.8139908 -0.8118878 0.9980509 0.8139735 -0.8118794 0.9980508 0.8139522 -0.8118697 0.9980506 0.8139261 -0.8118589 0.9980504 0.8138946 -0.8118476 0.9980502 0.813857 -0.811837 0.99805 0.8138133 -0.8118298 0.9980497 0.8137639 -0.8118303 0.9980494 0.813711 -0.8118466 0.9980491 0.8136595 -0.8118921 0.9980488 0.813619 -0.8119884 0.9980488 0.8136061 -0.8121268 0.9980488 0.8136061 -0.8123018 0.9980488 0.8136061 -0.8125232 0.9980488 0.8136061 -0.8128033 0.9980488 0.8136061 -0.8131577 0.9980488 0.8136061 -0.8136061 0.9980488 0.8136061 -0.8141733 0.9980488 0.8136061 -0.8148909 0.9980488 0.8136061 -0.8157988 0.9980488 0.8136061 -0.8169474 0.9980488 0.8136061 -0.8184005 0.9980488 0.8136061 -0.8202389 0.9980488 0.8136061 -0.8225647 0.9980488 0.8136061 -0.8255071 0.9980488 0.8136061 -0.8292297 0.9980488 0.8136061 -0.8339392 0.9980488 0.8136061 -0.8398974 0.9980488 0.8136061 -0.8474353 0.9980488 0.8136061 -0.8569716 0.9980488 0.8136061 -0.8690364 0.9980488 0.8136061 -0.8842998 0.9980488 0.8136061 -0.9036101 0.9980488 0.8136061 -0.9280401 0.9980488 0.8136061 -0.9589472 0.9980488 0.8136061 -0.9980488 0.9980488 0.8136061 -0.9984638 0.9664961 0.8473052 -0.9987895 0.9522877 0.8757441 -0.9990455 0.9483463 0.8994464 -0.999247 0.9501042 0.918999 -0.9994057 0.9547096 0.9349933 -0.9995308 0.9604492 0.9479878 -0.9996295 0.9663445 0.9584868 -0.9997074 0.9718774 0.9669318 -0.9997688 0.9768086 0.9737006 -0.9998174 0.9810611 0.9791103 -0.9998557 0.9846473 0.9834239 -0.999886 0.987624 0.9868574 -0.9999099 0.9900664 0.9895863 -0.9999288 0.9920533 0.9917528 -0.9999437 0.9936592 0.9934712 -0.8462171 0.9984653 0.8475892 -0.8462154 0.9984653 0.8475855 -0.8462132 0.9984653 0.8475808 -0.8462106 0.9984653 0.8475749 -0.8462073 0.9984652 0.8475675 -0.8462034 0.9984652 0.8475583 -0.8461986 0.9984651 0.8475469 -0.8461929 0.998465 0.8475329 -0.8461864 0.9984649 0.8475157 -0.8461791 0.9984648 0.847495 -0.8461714 0.9984647 0.8474703 -0.8461641 0.9984645 0.8474415 -0.8461589 0.9984643 0.847409 -0.8461587 0.9984642 0.8473742 -0.8461687 0.998464 0.8473404 -0.8461977 0.9984638 0.8473137 -0.8462598 0.9984638 0.8473052 -0.8463492 0.9984638 0.8473052 -0.8464623 0.9984638 0.8473052 -0.8466054 0.9984638 0.8473052 -0.8467864 0.9984638 0.8473052 -0.8470154 0.9984638 0.8473052 -0.8473052 0.9984638 0.8473052 -0.8476717 0.9984638 0.8473052 -0.8481355 0.9984638 0.8473052 -0.8487222 0.9984638 0.8473052 -0.8494644 0.9984638 0.8473052 -0.8504035 0.9984638 0.8473052 -0.8515915 0.9984638 0.8473052 -0.8530945 0.9984638 0.8473052 -0.8549959 0.9984638 0.8473052 -0.8574015 0.9984638 0.8473052 -0.8604449 0.9984638 0.8473052 -0.8642952 0.9984638 0.8473052 -0.8691663 0.9984638 0.8473052 -0.875329 0.9984638 0.8473052 -0.8831255 0.9984638 0.8473052 -0.892989 0.9984638 0.8473052 -0.9054678 0.9984638 0.8473052 -0.921255 0.9984638 0.8473052 -0.9412278 0.9984638 0.8473052 -0.9664961 0.9984638 0.8473052 -0.9984638 0.9984638 0.8473052 -0.9987895 0.9728171 0.8757441 -0.9990455 0.9614615 0.8994464 -0.999247 0.9584468 0.918999 -0.9994057 0.9599976 0.9349933 -0.9995308 0.9637914 0.9479878 -0.9996295 0.968452 0.9584868 -0.9997074 0.9732039 0.9669318 -0.9997688 0.9776422 0.9737006 -0.9998174 0.9815844 0.9791103 -0.9998557 0.9849754 0.9834239 -0.999886 0.9878296 0.9868574 -0.9999099 0.9901951 0.9895863 -0.9999288 0.9921339 0.9917528 -0.9999437 0.9937096 0.9934712 -0.8750477 0.9987905 0.8759292 -0.8750466 0.9987905 0.8759268 -0.8750451 0.9987904 0.8759237 -0.8750434 0.9987904 0.8759198 -0.8750412 0.9987904 0.875915 -0.8750386 0.9987904 0.875909 -0.8750355 0.9987903 0.8759016 -0.8750317 0.9987903 0.8758925 -0.8750274 0.9987902 0.8758813 -0.8750225 0.9987902 0.8758678 -0.8750173 0.9987901 0.8758517 -0.8750124 0.99879 0.8758329 -0.8750088 0.9987899 0.8758117 -0.8750084 0.9987897 0.8757891 -0.8750145 0.9987896 0.875767 -0.8750329 0.9987895 0.8757496 -0.8750727 0.9987895 0.8757441 -0.8751301 0.9987895 0.8757441 -0.8752028 0.9987895 0.8757441 -0.8752947 0.9987895 0.8757441 -0.8754109 0.9987895 0.8757441 -0.875558 0.9987895 0.8757441 -0.8757441 0.9987895 0.8757441 -0.8759795 0.9987895 0.8757441 -0.8762773 0.9987895 0.8757441 -0.8766541 0.9987895 0.8757441 -0.8771307 0.9987895 0.8757441 -0.8777338 0.9987895 0.8757441 -0.8784967 0.9987895 0.8757441 -0.8794619 0.9987895 0.8757441 -0.880683 0.9987895 0.8757441 -0.8822279 0.9987895 0.8757441 -0.8841823 0.9987895 0.8757441 -0.886655 0.9987895 0.8757441 -0.8897832 0.9987895 0.8757441 -0.8937407 0.9987895 0.8757441 -0.8987476 0.9987895 0.8757441 -0.9050819 0.9987895 0.8757441 -0.9130957 0.9987895 0.8757441 -0.9232341 0.9987895 0.8757441 -0.9360606 0.9987895 0.8757441 -0.9522877 0.9987895 0.8757441 -0.9728171 0.9987895 0.8757441 -0.9987895 0.9987895 0.8757441 -0.9990455 0.9780539 0.8994464 -0.999247 0.9690013 0.918999 -0.9994057 0.9666876 0.9349933 -0.9995308 0.9680197 0.9479878 -0.9996295 0.9711183 0.9584868 -0.9997074 0.974882 0.9669318 -0.9997688 0.9786968 0.9737006 -0.9998174 0.9822464 0.9791103 -0.9998557 0.9853905 0.9834239 -0.999886 0.9880897 0.9868574 -0.9999099 0.990358 0.9895863 -0.9999288 0.9922358 0.9917528 -0.9999437 0.9937734 0.9934712 -0.8990028 0.9990461 0.8995661 -0.899002 0.9990461 0.8995645 -0.8990011 0.9990461 0.8995625 -0.899 0.9990461 0.8995601 -0.8989986 0.9990461 0.8995569 -0.8989969 0.9990461 0.8995531 -0.8989948 0.9990461 0.8995483 -0.8989923 0.999046 0.8995424 -0.8989895 0.999046 0.8995351 -0.8989863 0.9990459 0.8995264 -0.8989829 0.9990459 0.899516 -0.8989796 0.9990458 0.8995038 -0.8989771 0.9990458 0.8994901 -0.8989767 0.9990457 0.8994755 -0.8989805 0.9990456 0.8994612 -0.8989921 0.9990456 0.89945 -0.8990175 0.9990455 0.8994464 -0.8990542 0.9990455 0.8994464 -0.8991006 0.9990455 0.8994464 -0.8991593 0.9990455 0.8994464 -0.8992336 0.9990455 0.8994464 -0.8993275 0.9990455 0.8994464 -0.8994464 0.9990455 0.8994464 -0.8995968 0.9990455 0.8994464 -0.899787 0.9990455 0.8994464 -0.9000277 0.9990455 0.8994464 -0.9003323 0.9990455 0.8994464 -0.9007175 0.9990455 0.8994464 -0.9012049 0.9990455 0.8994464 -0.9018215 0.9990455 0.8994464 -0.9026016 0.9990455 0.8994464 -0.9035886 0.9990455 0.8994464 -0.9048372 0.9990455 0.8994464 -0.9064168 0.9990455 0.8994464 -0.9084153 0.9990455 0.8994464 -0.9109436 0.9990455 0.8994464 -0.9141422 0.9990455 0.8994464 -0.9181889 0.9990455 0.8994464 -0.9233085 0.9990455 0.8994464 -0.9297854 0.9990455 0.8994464 -0.9379796 0.9990455 0.8994464 -0.9483463 0.9990455 0.8994464 -0.9614615 0.9990455 0.8994464 -0.9780539 0.9990455 0.8994464 -0.9990455 0.9990455 0.8994464 -0.999247 0.982354 0.918999 -0.9994057 0.9751513 0.9349933 -0.9995308 0.9733691 0.9479878 -0.9996295 0.9744915 0.9584868 -0.9997074 0.977005 0.9669318 -0.9997688 0.980031 0.9737006 -0.9998174 0.9830838 0.9791103 -0.9998557 0.9859157 0.9834239 -0.999886 0.9884188 0.9868574 -0.9999099 0.9905641 0.9895863 -0.9999288 0.9923648 0.9917528 -0.9999437 0.9938541 0.9934712 -0.9187175 0.9992474 0.9190759 -0.918717 0.9992474 0.9190749 -0.9187164 0.9992474 0.9190736 -0.9187157 0.9992474 0.919072 -0.9187148 0.9992474 0.91907 -0.9187137 0.9992474 0.9190675 -0.9187123 0.9992473 0.9190645 -0.9187107 0.9992473 0.9190607 -0.9187089 0.9992473 0.919056 -0.9187068 0.9992473 0.9190504 -0.9187045 0.9992472 0.9190437 -0.9187024 0.9992472 0.9190359 -0.9187008 0.9992472 0.9190271 -0.9187004 0.9992471 0.9190177 -0.9187027 0.9992471 0.9190085 -0.9187101 0.999247 0.9190013 -0.9187262 0.999247 0.918999 -0.9187495 0.999247 0.918999 -0.9187791 0.999247 0.918999 -0.9188164 0.999247 0.918999 -0.9188636 0.999247 0.918999 -0.9189234 0.999247 0.918999 -0.918999 0.999247 0.918999 -0.9190947 0.999247 0.918999 -0.9192157 0.999247 0.918999 -0.9193688 0.999247 0.918999 -0.9195625 0.999247 0.918999 -0.9198076 0.999247 0.918999 -0.9201176 0.999247 0.918999 -0.9205098 0.999247 0.918999 -0.9210061 0.999247 0.918999 -0.9216339 0.999247 0.918999 -0.9224281 0.999247 0.918999 -0.9234329 0.999247 0.918999 -0.9247041 0.999247 0.918999 -0.9263124 0.999247 0.918999 -0.928347 0.999247 0.918999 -0.9309211 0.999247 0.918999 -0.9341777 0.999247 0.918999 -0.9382977 0.999247 0.918999 -0.94351 0.999247 0.918999 -0.9501042 0.999247 0.918999 -0.9584468 0.999247 0.918999 -0.9690013 0.999247 0.918999 -0.982354 0.999247 0.918999 -0.999247 0.999247 0.918999 -0.9994057 0.9858591 0.9349933 -0.9995308 0.9801368 0.9479878 -0.9996295 0.978759 0.9584868 -0.9997074 0.9796909 0.9669318 -0.9997688 0.981719 0.9737006 -0.9998174 0.9841433 0.9791103 -0.9998557 0.9865801 0.9834239 -0.999886 0.9888351 0.9868574 -0.9999099 0.9908248 0.9895863 -0.9999288 0.992528 0.9917528 -0.9999437 0.9939562 0.9934712 -0.9348153 0.999406 0.9350425 -0.9348149 0.999406 0.9350418 -0.9348146 0.999406 0.935041 -0.9348141 0.999406 0.93504 -0.9348135 0.999406 0.9350387 -0.9348128 0.9994059 0.9350371 -0.9348119 0.9994059 0.9350352 -0.9348109 0.9994059 0.9350327 -0.9348097 0.9994059 0.9350298 -0.9348083 0.9994059 0.9350262 -0.9348069 0.9994059 0.9350219 -0.9348055 0.9994059 0.9350169 -0.9348044 0.9994058 0.9350113 -0.9348042 0.9994058 0.9350053 -0.9348056 0.9994058 0.9349994 -0.9348102 0.9994057 0.9349948 -0.9348204 0.9994057 0.9349933 -0.9348352 0.9994057 0.9349933 -0.9348539 0.9994057 0.9349933 -0.9348776 0.9994057 0.9349933 -0.9349075 0.9994057 0.9349933 -0.9349454 0.9994057 0.9349933 -0.9349933 0.9994057 0.9349933 -0.935054 0.9994057 0.9349933 -0.9351307 0.9994057 0.9349933 -0.9352277 0.9994057 0.9349933 -0.9353505 0.9994057 0.9349933 -0.9355059 0.9994057 0.9349933 -0.9357024 0.9994057 0.9349933 -0.935951 0.9994057 0.9349933 -0.9362655 0.9994057 0.9349933 -0.9366635 0.9994057 0.9349933 -0.9371669 0.9994057 0.9349933 -0.9378038 0.9994057 0.9349933 -0.9386096 0.9994057 0.9349933 -0.939629 0.9994057 0.9349933 -0.9409186 0.9994057 0.9349933 -0.9425502 0.9994057 0.9349933 -0.9446144 0.9994057 0.9349933 -0.9472259 0.9994057 0.9349933 -0.9505298 0.9994057 0.9349933 -0.9547096 0.9994057 0.9349933 -0.9599976 0.9994057 0.9349933 -0.9666876 0.9994057 0.9349933 -0.9751513 0.9994057 0.9349933 -0.9858591 0.9994057 0.9349933 -0.9994057 0.9994057 0.9349933 -0.9995308 0.9886988 0.9479878 -0.9996295 0.9841579 0.9584868 -0.9997074 0.983089 0.9669318 -0.9997688 0.9838545 0.9737006 -0.9998174 0.9854838 0.9791103 -0.9998557 0.9874207 0.9834239 -0.999886 0.9893618 0.9868574 -0.9999099 0.9911547 0.9895863 -0.9999288 0.9927345 0.9917528 -0.9999437 0.9940854 0.9934712 -0.9478754 0.999531 0.948019 -0.9478752 0.999531 0.9480186 -0.947875 0.999531 0.9480181 -0.9478746 0.999531 0.9480175 -0.9478743 0.999531 0.9480166 -0.9478738 0.999531 0.9480156 -0.9478733 0.999531 0.9480144 -0.9478726 0.999531 0.9480128 -0.9478718 0.999531 0.9480109 -0.947871 0.9995309 0.9480087 -0.94787 0.9995309 0.9480059 -0.9478691 0.9995309 0.9480028 -0.9478684 0.9995309 0.9479992 -0.9478683 0.9995309 0.9479954 -0.9478691 0.9995309 0.9479916 -0.947872 0.9995309 0.9479887 -0.9478785 0.9995308 0.9479878 -0.9478878 0.9995308 0.9479878 -0.9478997 0.9995308 0.9479878 -0.9479146 0.9995308 0.9479878 -0.9479335 0.9995308 0.9479878 -0.9479575 0.9995308 0.9479878 -0.9479878 0.9995308 0.9479878 -0.9480261 0.9995308 0.9479878 -0.9480746 0.9995308 0.9479878 -0.9481359 0.9995308 0.9479878 -0.9482135 0.9995308 0.9479878 -0.9483117 0.9995308 0.9479878 -0.9484359 0.9995308 0.9479878 -0.9485931 0.9995308 0.9479878 -0.9487918 0.9995308 0.9479878 -0.9490434 0.9995308 0.9479878 -0.9493615 0.9995308 0.9479878 -0.9497641 0.9995308 0.9479878 -0.9502734 0.9995308 0.9479878 -0.9509177 0.9995308 0.9479878 -0.9517328 0.9995308 0.9479878 -0.952764 0.9995308 0.9479878 -0.9540687 0.9995308 0.9479878 -0.9557192 0.9995308 0.9479878 -0.9578074 0.9995308 0.9479878 -0.9604492 0.9995308 0.9479878 -0.9637914 0.9995308 0.9479878 -0.9680197 0.9995308 0.9479878 -0.9733691 0.9995308 0.9479878 -0.9801368 0.9995308 0.9479878 -0.9886988 0.9995308 0.9479878 -0.9995308 0.9995308 0.9479878 -0.9996295 0.9909882 0.9584868 -0.9997074 0.9873879 0.9669318 -0.9997688 0.9865561 0.9737006 -0.9998174 0.9871796 0.9791103 -0.9998557 0.9884841 0.9834239 -0.999886 0.9900282 0.9868574 -0.9999099 0.991572 0.9895863 -0.9999288 0.9929957 0.9917528 -0.9999437 0.9942488 0.9934712 -0.958416 0.9996296 0.9585066 -0.9584159 0.9996296 0.9585063 -0.9584157 0.9996296 0.958506 -0.9584155 0.9996296 0.9585056 -0.9584153 0.9996296 0.9585051 -0.958415 0.9996296 0.9585044 -0.9584146 0.9996296 0.9585036 -0.9584142 0.9996296 0.9585026 -0.9584137 0.9996296 0.9585014 -0.9584132 0.9996296 0.9585 -0.9584126 0.9996296 0.9584983 -0.958412 0.9996296 0.9584963 -0.9584115 0.9996296 0.958494 -0.9584114 0.9996295 0.9584916 -0.958412 0.9996295 0.9584892 -0.9584138 0.9996295 0.9584874 -0.9584178 0.9996295 0.9584868 -0.9584237 0.9996295 0.9584868 -0.9584312 0.9996295 0.9584868 -0.9584406 0.9996295 0.9584868 -0.9584526 0.9996295 0.9584868 -0.9584677 0.9996295 0.9584868 -0.9584868 0.9996295 0.9584868 -0.9585109 0.9996295 0.9584868 -0.9585415 0.9996295 0.9584868 -0.9585802 0.9996295 0.9584868 -0.9586291 0.9996295 0.9584868 -0.958691 0.9996295 0.9584868 -0.9587693 0.9996295 0.9584868 -0.9588684 0.9996295 0.9584868 -0.9589938 0.9996295 0.9584868 -0.9591524 0.9996295 0.9584868 -0.959353 0.9996295 0.9584868 -0.9596068 0.9996295 0.9584868 -0.959928 0.9996295 0.9584868 -0.9603343 0.9996295 0.9584868 -0.9608482 0.9996295 0.9584868 -0.9614985 0.9996295 0.9584868 -0.9623212 0.9996295 0.9584868 -0.963362 0.9996295 0.9584868 -0.9646787 0.9996295 0.9584868 -0.9663445 0.9996295 0.9584868 -0.968452 0.9996295 0.9584868 -0.9711183 0.9996295 0.9584868 -0.9744915 0.9996295 0.9584868 -0.978759 0.9996295 0.9584868 -0.9841579 0.9996295 0.9584868 -0.9909882 0.9996295 0.9584868 -0.9996295 0.9996295 0.9584868 -0.9997074 0.9928267 0.9669318 -0.9997688 0.9899741 0.9737006 -0.9998174 0.989325 0.9791103 -0.9998557 0.9898295 0.9834239 -0.999886 0.9908712 0.9868574 -0.9999099 0.9920999 0.9895863 -0.9999288 0.9933261 0.9917528 -0.9999437 0.9944556 0.9934712 -0.9668873 0.9997074 0.9669443 -0.9668872 0.9997074 0.9669442 -0.9668871 0.9997074 0.966944 -0.966887 0.9997074 0.9669437 -0.9668869 0.9997074 0.9669434 -0.9668867 0.9997074 0.966943 -0.9668865 0.9997074 0.9669425 -0.9668862 0.9997074 0.9669419 -0.9668859 0.9997074 0.9669411 -0.9668855 0.9997074 0.9669402 -0.9668852 0.9997074 0.9669391 -0.9668848 0.9997074 0.9669378 -0.9668845 0.9997074 0.9669364 -0.9668844 0.9997074 0.9669349 -0.9668847 0.9997074 0.9669334 -0.9668859 0.9997074 0.9669322 -0.9668884 0.9997074 0.9669318 -0.9668922 0.9997074 0.9669318 -0.9668969 0.9997074 0.9669318 -0.9669028 0.9997074 0.9669318 -0.9669103 0.9997074 0.9669318 -0.9669198 0.9997074 0.9669318 -0.9669318 0.9997074 0.9669318 -0.966947 0.9997074 0.9669318 -0.9669663 0.9997074 0.9669318 -0.9669906 0.9997074 0.9669318 -0.9670214 0.9997074 0.9669318 -0.9670604 0.9997074 0.9669318 -0.9671097 0.9997074 0.9669318 -0.967172 0.9997074 0.9669318 -0.9672509 0.9997074 0.9669318 -0.9673508 0.9997074 0.9669318 -0.967477 0.9997074 0.9669318 -0.9676368 0.9997074 0.9669318 -0.9678389 0.9997074 0.9669318 -0.9680946 0.9997074 0.9669318 -0.9684181 0.9997074 0.9669318 -0.9688274 0.9997074 0.9669318 -0.9693452 0.9997074 0.9669318 -0.9700002 0.9997074 0.9669318 -0.970829 0.9997074 0.9669318 -0.9718774 0.9997074 0.9669318 -0.9732039 0.9997074 0.9669318 -0.974882 0.9997074 0.9669318 -0.977005 0.9997074 0.9669318 -0.9796909 0.9997074 0.9669318 -0.983089 0.9997074 0.9669318 -0.9873879 0.9997074 0.9669318 -0.9928267 0.9997074 0.9669318 -0.9997074 0.9997074 0.9669318 -0.9997688 0.9942982 0.9737006 -0.9998174 0.9920392 0.9791103 -0.9998557 0.9915316 0.9834239 -0.999886 0.9919377 0.9868574 -0.9999099 0.9927678 0.9895863 -0.9999288 0.9937442 0.9917528 -0.9999437 0.9947172 0.9934712 -0.9736726 0.9997689 0.9737085 -0.9736726 0.9997689 0.9737084 -0.9736725 0.9997689 0.9737082 -0.9736724 0.9997689 0.9737081 -0.9736723 0.9997689 0.9737079 -0.9736722 0.9997689 0.9737076 -0.9736721 0.9997689 0.9737073 -0.9736719 0.9997689 0.9737069 -0.9736717 0.9997689 0.9737064 -0.9736715 0.9997689 0.9737058 -0.9736712 0.9997689 0.9737052 -0.973671 0.9997689 0.9737044 -0.9736708 0.9997689 0.9737034 -0.9736708 0.9997689 0.9737025 -0.973671 0.9997688 0.9737015 -0.9736717 0.9997688 0.9737008 -0.9736733 0.9997688 0.9737006 -0.9736756 0.9997688 0.9737006 -0.9736786 0.9997688 0.9737006 -0.9736823 0.9997688 0.9737006 -0.973687 0.9997688 0.9737006 -0.973693 0.9997688 0.9737006 -0.9737006 0.9997688 0.9737006 -0.9737101 0.9997688 0.9737006 -0.9737222 0.9997688 0.9737006 -0.9737375 0.9997688 0.9737006 -0.9737569 0.9997688 0.9737006 -0.9737814 0.9997688 0.9737006 -0.9738123 0.9997688 0.9737006 -0.9738515 0.9997688 0.9737006 -0.9739011 0.9997688 0.9737006 -0.9739638 0.9997688 0.9737006 -0.9740432 0.9997688 0.9737006 -0.9741436 0.9997688 0.9737006 -0.9742706 0.9997688 0.9737006 -0.9744313 0.9997688 0.9737006 -0.9746346 0.9997688 0.9737006 -0.9748918 0.9997688 0.9737006 -0.9752172 0.9997688 0.9737006 -0.9756289 0.9997688 0.9737006 -0.9761497 0.9997688 0.9737006 -0.9768086 0.9997688 0.9737006 -0.9776422 0.9997688 0.9737006 -0.9786968 0.9997688 0.9737006 -0.980031 0.9997688 0.9737006 -0.981719 0.9997688 0.9737006 -0.9838545 0.9997688 0.9737006 -0.9865561 0.9997688 0.9737006 -0.9899741 0.9997688 0.9737006 -0.9942982 0.9997688 0.9737006 -0.9997688 0.9997688 0.9737006 -0.9998174 0.9954731 0.9791103 -0.9998557 0.9936849 0.9834239 -0.999886 0.993287 0.9868574 -0.9999099 0.9936128 0.9895863 -0.9999288 0.9942731 0.9917528 -0.9999437 0.9950481 0.9934712 -0.9790927 0.9998174 0.9791152 -0.9790927 0.9998174 0.9791152 -0.9790927 0.9998174 0.9791151 -0.9790926 0.9998174 0.979115 -0.9790925 0.9998174 0.9791148 -0.9790925 0.9998174 0.9791147 -0.9790924 0.9998174 0.9791145 -0.9790923 0.9998174 0.9791142 -0.9790921 0.9998174 0.9791139 -0.979092 0.9998174 0.9791136 -0.9790919 0.9998174 0.9791131 -0.9790917 0.9998174 0.9791126 -0.9790916 0.9998174 0.9791121 -0.9790916 0.9998174 0.9791115 -0.9790917 0.9998174 0.9791109 -0.9790921 0.9998174 0.9791104 -0.9790931 0.9998174 0.9791103 -0.9790946 0.9998174 0.9791103 -0.9790965 0.9998174 0.9791103 -0.9790988 0.9998174 0.9791103 -0.9791018 0.9998174 0.9791103 -0.9791055 0.9998174 0.9791103 -0.9791103 0.9998174 0.9791103 -0.9791163 0.9998174 0.9791103 -0.9791238 0.9998174 0.9791103 -0.9791334 0.9998174 0.9791103 -0.9791456 0.9998174 0.9791103 -0.979161 0.9998174 0.9791103 -0.9791804 0.9998174 0.9791103 -0.979205 0.9998174 0.9791103 -0.9792361 0.9998174 0.9791103 -0.9792755 0.9998174 0.9791103 -0.9793253 0.9998174 0.9791103 -0.9793883 0.9998174 0.9791103 -0.9794681 0.9998174 0.9791103 -0.9795689 0.9998174 0.9791103 -0.9796966 0.9998174 0.9791103 -0.979858 0.9998174 0.9791103 -0.9800622 0.9998174 0.9791103 -0.9803206 0.9998174 0.9791103 -0.9806476 0.9998174 0.9791103 -0.9810611 0.9998174 0.9791103 -0.9815844 0.9998174 0.9791103 -0.9822464 0.9998174 0.9791103 -0.9830838 0.9998174 0.9791103 -0.9841433 0.9998174 0.9791103 -0.9854838 0.9998174 0.9791103 -0.9871796 0.9998174 0.9791103 -0.989325 0.9998174 0.9791103 -0.9920392 0.9998174 0.9791103 -0.9954731 0.9998174 0.9791103 -0.9998174 0.9998174 0.9791103 -0.9998557 0.9964092 0.9834239 -0.999886 0.9949941 0.9868574 -0.9999099 0.9946818 0.9895863 -0.9999288 0.9949422 0.9917528 -0.9999437 0.9954668 0.9934712 -0.9834129 0.9998557 0.983427 -0.9834129 0.9998557 0.983427 -0.9834129 0.9998557 0.9834269 -0.9834129 0.9998557 0.9834269 -0.9834128 0.9998557 0.9834268 -0.9834128 0.9998557 0.9834267 -0.9834127 0.9998557 0.9834266 -0.9834127 0.9998557 0.9834264 -0.9834126 0.9998557 0.9834262 -0.9834125 0.9998557 0.983426 -0.9834124 0.9998557 0.9834257 -0.9834123 0.9998557 0.9834254 -0.9834122 0.9998557 0.9834251 -0.9834122 0.9998557 0.9834247 -0.9834123 0.9998557 0.9834243 -0.9834126 0.9998557 0.983424 -0.9834132 0.9998557 0.9834239 -0.9834141 0.9998557 0.9834239 -0.9834153 0.9998557 0.9834239 -0.9834167 0.9998557 0.9834239 -0.9834186 0.9998557 0.9834239 -0.9834209 0.9998557 0.9834239 -0.9834239 0.9998557 0.9834239 -0.9834277 0.9998557 0.9834239 -0.9834324 0.9998557 0.9834239 -0.9834385 0.9998557 0.9834239 -0.9834461 0.9998557 0.9834239 -0.9834557 0.9998557 0.9834239 -0.9834679 0.9998557 0.9834239 -0.9834833 0.9998557 0.9834239 -0.9835029 0.9998557 0.9834239 -0.9835276 0.9998557 0.9834239 -0.9835588 0.9998557 0.9834239 -0.9835983 0.9998557 0.9834239 -0.9836483 0.9998557 0.9834239 -0.9837116 0.9998557 0.9834239 -0.9837916 0.9998557 0.9834239 -0.9838928 0.9998557 0.9834239 -0.9840209 0.9998557 0.9834239 -0.9841829 0.9998557 0.9834239 -0.984388 0.9998557 0.9834239 -0.9846473 0.9998557 0.9834239 -0.9849754 0.9998557 0.9834239 -0.9853905 0.9998557 0.9834239 -0.9859157 0.9998557 0.9834239 -0.9865801 0.9998557 0.9834239 -0.9874207 0.9998557 0.9834239 -0.9884841 0.9998557 0.9834239 -0.9898295 0.9998557 0.9834239 -0.9915316 0.9998557 0.9834239 -0.9936849 0.9998557 0.9834239 -0.9964092 0.9998557 0.9834239 -0.9998557 0.9998557 0.9834239 -0.999886 0.9971537 0.9868574 -0.9999099 0.9960342 0.9895863 -0.9999288 0.9957887 0.9917528 -0.9999437 0.9959964 0.9934712 -0.9868505 0.999886 0.9868593 -0.9868505 0.999886 0.9868593 -0.9868505 0.999886 0.9868593 -0.9868505 0.999886 0.9868592 -0.9868504 0.999886 0.9868592 -0.9868504 0.999886 0.9868591 -0.9868504 0.999886 0.9868591 -0.9868503 0.999886 0.986859 -0.9868503 0.999886 0.9868588 -0.9868502 0.999886 0.9868587 -0.9868502 0.999886 0.9868585 -0.9868501 0.999886 0.9868583 -0.9868501 0.999886 0.9868581 -0.98685 0.999886 0.9868579 -0.9868501 0.999886 0.9868576 -0.9868503 0.999886 0.9868574 -0.9868507 0.999886 0.9868574 -0.9868512 0.999886 0.9868574 -0.986852 0.999886 0.9868574 -0.9868529 0.999886 0.9868574 -0.9868541 0.999886 0.9868574 -0.9868555 0.999886 0.9868574 -0.9868574 0.999886 0.9868574 -0.9868597 0.999886 0.9868574 -0.9868627 0.999886 0.9868574 -0.9868665 0.999886 0.9868574 -0.9868713 0.999886 0.9868574 -0.9868773 0.999886 0.9868574 -0.986885 0.999886 0.9868574 -0.9868946 0.999886 0.9868574 -0.9869069 0.999886 0.9868574 -0.9869223 0.999886 0.9868574 -0.9869419 0.999886 0.9868574 -0.9869667 0.999886 0.9868574 -0.986998 0.999886 0.9868574 -0.9870376 0.999886 0.9868574 -0.9870878 0.999886 0.9868574 -0.9871512 0.999886 0.9868574 -0.9872315 0.999886 0.9868574 -0.987333 0.999886 0.9868574 -0.9874615 0.999886 0.9868574 -0.987624 0.999886 0.9868574 -0.9878296 0.999886 0.9868574 -0.9880897 0.999886 0.9868574 -0.9884188 0.999886 0.9868574 -0.9888351 0.999886 0.9868574 -0.9893618 0.999886 0.9868574 -0.9900282 0.999886 0.9868574 -0.9908712 0.999886 0.9868574 -0.9919377 0.999886 0.9868574 -0.993287 0.999886 0.9868574 -0.9949941 0.999886 0.9868574 -0.9971537 0.999886 0.9868574 -0.999886 0.999886 0.9868574 -0.9999099 0.9977452 0.9895863 -0.9999288 0.9968597 0.9917528 -0.9999437 0.9966665 0.9934712 -0.989582 0.9999099 0.9895875 -0.989582 0.9999099 0.9895875 -0.989582 0.9999099 0.9895875 -0.989582 0.9999099 0.9895875 -0.989582 0.9999099 0.9895874 -0.9895819 0.9999099 0.9895874 -0.9895819 0.9999099 0.9895874 -0.9895819 0.9999099 0.9895873 -0.9895819 0.9999099 0.9895872 -0.9895818 0.9999099 0.9895871 -0.9895818 0.9999099 0.989587 -0.9895818 0.9999099 0.9895869 -0.9895817 0.9999099 0.9895868 -0.9895817 0.9999099 0.9895866 -0.9895817 0.9999099 0.9895865 -0.9895819 0.9999099 0.9895864 -0.9895821 0.9999099 0.9895863 -0.9895825 0.9999099 0.9895863 -0.9895829 0.9999099 0.9895863 -0.9895835 0.9999099 0.9895863 -0.9895842 0.9999099 0.9895863 -0.9895851 0.9999099 0.9895863 -0.9895863 0.9999099 0.9895863 -0.9895878 0.9999099 0.9895863 -0.9895897 0.9999099 0.9895863 -0.989592 0.9999099 0.9895863 -0.989595 0.9999099 0.9895863 -0.9895988 0.9999099 0.9895863 -0.9896036 0.9999099 0.9895863 -0.9896096 0.9999099 0.9895863 -0.9896173 0.9999099 0.9895863 -0.989627 0.9999099 0.9895863 -0.9896392 0.9999099 0.9895863 -0.9896547 0.9999099 0.9895863 -0.9896744 0.9999099 0.9895863 -0.9896992 0.9999099 0.9895863 -0.9897306 0.9999099 0.9895863 -0.9897703 0.9999099 0.9895863 -0.9898206 0.9999099 0.9895863 -0.9898842 0.9999099 0.9895863 -0.9899646 0.9999099 0.9895863 -0.9900664 0.9999099 0.9895863 -0.9901951 0.9999099 0.9895863 -0.990358 0.9999099 0.9895863 -0.9905641 0.9999099 0.9895863 -0.9908248 0.9999099 0.9895863 -0.9911547 0.9999099 0.9895863 -0.991572 0.9999099 0.9895863 -0.9920999 0.9999099 0.9895863 -0.9927678 0.9999099 0.9895863 -0.9936128 0.9999099 0.9895863 -0.9946818 0.9999099 0.9895863 -0.9960342 0.9999099 0.9895863 -0.9977452 0.9999099 0.9895863 -0.9999099 0.9999099 0.9895863 -0.9999288 0.9982146 0.9917528 -0.9999437 0.9975143 0.9934712 -0.9917501 0.9999288 0.9917536 -0.9917501 0.9999288 0.9917535 -0.9917501 0.9999288 0.9917535 -0.9917501 0.9999288 0.9917535 -0.9917501 0.9999288 0.9917535 -0.9917501 0.9999288 0.9917535 -0.99175 0.9999288 0.9917534 -0.99175 0.9999288 0.9917534 -0.99175 0.9999288 0.9917534 -0.99175 0.9999288 0.9917533 -0.99175 0.9999288 0.9917532 -0.9917499 0.9999288 0.9917532 -0.9917499 0.9999288 0.9917531 -0.9917499 0.9999288 0.991753 -0.9917499 0.9999288 0.9917529 -0.99175 0.9999288 0.9917528 -0.9917502 0.9999288 0.9917528 -0.9917504 0.9999288 0.9917528 -0.9917507 0.9999288 0.9917528 -0.991751 0.9999288 0.9917528 -0.9917515 0.9999288 0.9917528 -0.9917521 0.9999288 0.9917528 -0.9917528 0.9999288 0.9917528 -0.9917537 0.9999288 0.9917528 -0.9917549 0.9999288 0.9917528 -0.9917564 0.9999288 0.9917528 -0.9917582 0.9999288 0.9917528 -0.9917606 0.9999288 0.9917528 -0.9917636 0.9999288 0.9917528 -0.9917674 0.9999288 0.9917528 -0.9917722 0.9999288 0.9917528 -0.9917782 0.9999288 0.9917528 -0.9917859 0.9999288 0.9917528 -0.9917956 0.9999288 0.9917528 -0.9918079 0.9999288 0.9917528 -0.9918234 0.9999288 0.9917528 -0.9918431 0.9999288 0.9917528 -0.991868 0.9999288 0.9917528 -0.9918994 0.9999288 0.9917528 -0.9919392 0.9999288 0.9917528 -0.9919896 0.9999288 0.9917528 -0.9920533 0.9999288 0.9917528 -0.9921339 0.9999288 0.9917528 -0.9922358 0.9999288 0.9917528 -0.9923648 0.9999288 0.9917528 -0.992528 0.9999288 0.9917528 -0.9927345 0.9999288 0.9917528 -0.9929957 0.9999288 0.9917528 -0.9933261 0.9999288 0.9917528 -0.9937442 0.9999288 0.9917528 -0.9942731 0.9999288 0.9917528 -0.9949422 0.9999288 0.9917528 -0.9957887 0.9999288 0.9917528 -0.9968597 0.9999288 0.9917528 -0.9982146 0.9999288 0.9917528 -0.9999288 0.9999288 0.9917528 -0.9999437 0.9985868 0.9934712 -0.9934695 0.9999437 0.9934717 -0.9934695 0.9999437 0.9934716 -0.9934695 0.9999437 0.9934716 -0.9934695 0.9999437 0.9934716 -0.9934695 0.9999437 0.9934716 -0.9934695 0.9999437 0.9934716 -0.9934695 0.9999437 0.9934716 -0.9934694 0.9999437 0.9934716 -0.9934694 0.9999437 0.9934715 -0.9934694 0.9999437 0.9934715 -0.9934694 0.9999437 0.9934715 -0.9934694 0.9999437 0.9934714 -0.9934694 0.9999437 0.9934713 -0.9934694 0.9999437 0.9934713 -0.9934694 0.9999437 0.9934712 -0.9934694 0.9999437 0.9934712 -0.9934695 0.9999437 0.9934712 -0.9934697 0.9999437 0.9934712 -0.9934698 0.9999437 0.9934712 -0.9934701 0.9999437 0.9934712 -0.9934704 0.9999437 0.9934712 -0.9934707 0.9999437 0.9934712 -0.9934712 0.9999437 0.9934712 -0.9934718 0.9999437 0.9934712 -0.9934725 0.9999437 0.9934712 -0.9934734 0.9999437 0.9934712 -0.9934746 0.9999437 0.9934712 -0.9934761 0.9999437 0.9934712 -0.9934779 0.9999437 0.9934712 -0.9934803 0.9999437 0.9934712 -0.9934833 0.9999437 0.9934712 -0.9934871 0.9999437 0.9934712 -0.9934919 0.9999437 0.9934712 -0.993498 0.9999437 0.9934712 -0.9935057 0.9999437 0.9934712 -0.9935154 0.9999437 0.9934712 -0.9935277 0.9999437 0.9934712 -0.9935432 0.9999437 0.9934712 -0.9935629 0.9999437 0.9934712 -0.9935878 0.9999437 0.9934712 -0.9936193 0.9999437 0.9934712 -0.9936592 0.9999437 0.9934712 -0.9937096 0.9999437 0.9934712 -0.9937734 0.9999437 0.9934712 -0.9938541 0.9999437 0.9934712 -0.9939562 0.9999437 0.9934712 -0.9940854 0.9999437 0.9934712 -0.9942488 0.9999437 0.9934712 -0.9944556 0.9999437 0.9934712 -0.9947172 0.9999437 0.9934712 -0.9950481 0.9999437 0.9934712 -0.9954668 0.9999437 0.9934712 -0.9959964 0.9999437 0.9934712 -0.9966665 0.9999437 0.9934712 -0.9975143 0.9999437 0.9934712 -0.9985868 0.9999437 0.9934712 -0.9999437 0.9999437 0.9934712 -0.0000238 0.0000238 0.4344249 -0.0005417 0.0000238 0.4344249 -0.0011968 0.0000238 0.4344249 -0.0020256 0.0000238 0.4344249 -0.0030742 0.0000238 0.4344249 -0.0044007 0.0000238 0.4344249 -0.006079 0.0000238 0.4344249 -0.0082023 0.0000238 0.4344249 -0.0108885 0.0000238 0.4344249 -0.0142868 0.0000238 0.4344249 -0.0185862 0.0000238 0.4344249 -0.0240255 0.0000238 0.4344249 -0.0309069 0.0000238 0.4344249 -0.0396127 0.0000238 0.4344249 -0.0506267 0.0000238 0.4344249 -0.0645609 0.0000238 0.4344249 -0.0821895 0.0000238 0.4344249 -0.1044919 0.0000238 0.4344249 -0.1327073 0.0000238 0.4344249 -0.1684036 0.0000238 0.4344249 -0.2135639 0.0000238 0.4344249 -0.2706977 0.0000238 0.4344249 -0.3429792 0.0000238 0.4344249 -0.4344249 0.0000238 0.4344249 -0.5501155 0.0000238 0.4344249 -0.6964791 0.0000238 0.4344249 -0.8407292 0.0051514 0.416864 -0.9033413 0.0279321 0.368718 -0.9354466 0.0624569 0.3309822 -0.9545467 0.1059991 0.3122478 -0.9669269 0.1572498 0.3127719 -0.9754027 0.2151269 0.3305354 -0.9814251 0.2783684 0.3627135 -0.9858181 0.3454107 0.406132 -0.9890841 0.4144197 0.4574848 -0.9915469 0.4834235 0.5135199 -0.993424 0.5504963 0.571232 -0.9948662 0.6139459 0.6280409 -0.9959813 0.6724572 0.6819193 -0.9968475 0.7251659 0.7314464 -0.997523 0.7716588 0.7757859 -0.9980513 0.8119154 0.8146037 -0.9984653 0.8462171 0.8479551 -0.9987905 0.8750477 0.8761643 -0.9990461 0.8990028 0.8997163 -0.9992474 0.9187175 0.9191715 -0.999406 0.9348153 0.9351031 -0.999531 0.9478754 0.9480573 -0.9996296 0.958416 0.9585307 -0.9997074 0.9668873 0.9669595 -0.9997689 0.9736726 0.973718 -0.9998174 0.9790927 0.9791212 -0.9998557 0.9834129 0.9834308 -0.999886 0.9868505 0.9868617 -0.9999099 0.989582 0.989589 -0.9999288 0.9917501 0.9917545 -0.9999437 0.9934695 0.9934722 -0.0000238 0.0005417 0.4344249 -0.0000382 0.0000382 0.4339214 -0.0006933 0.0000382 0.4339214 -0.0015221 0.0000382 0.4339214 -0.0025707 0.0000382 0.4339214 -0.0038972 0.0000382 0.4339214 -0.0055755 0.0000382 0.4339214 -0.0076988 0.0000382 0.4339214 -0.0103849 0.0000382 0.4339214 -0.0137833 0.0000382 0.4339214 -0.0180827 0.0000382 0.4339214 -0.023522 0.0000382 0.4339214 -0.0304033 0.0000382 0.4339214 -0.0391092 0.0000382 0.4339214 -0.0501232 0.0000382 0.4339214 -0.0640574 0.0000382 0.4339214 -0.081686 0.0000382 0.4339214 -0.1039884 0.0000382 0.4339214 -0.1322038 0.0000382 0.4339214 -0.1679 0.0000382 0.4339214 -0.2130604 0.0000382 0.4339214 -0.2701941 0.0000382 0.4339214 -0.3424757 0.0000382 0.4339214 -0.4339214 0.0000382 0.4339214 -0.549612 0.0000382 0.4339214 -0.6959756 0.0000382 0.4339214 -0.8405071 0.0051286 0.4164939 -0.9032596 0.0278872 0.3684105 -0.9354101 0.0624063 0.3307142 -0.9545286 0.1059489 0.3120193 -0.9669173 0.1572031 0.3125826 -0.9753975 0.2150852 0.3303825 -0.9814221 0.2783325 0.3625931 -0.9858163 0.3453807 0.4060392 -0.9890831 0.4143955 0.4574149 -0.9915463 0.4834045 0.5134682 -0.9934236 0.5504818 0.5711946 -0.994866 0.6139352 0.6280144 -0.9959811 0.6724495 0.6819008 -0.9968474 0.7251605 0.7314338 -0.997523 0.7716551 0.7757773 -0.9980512 0.8119128 0.814598 -0.9984653 0.8462154 0.8479514 -0.9987905 0.8750466 0.8761618 -0.9990461 0.899002 0.8997147 -0.9992474 0.918717 0.9191705 -0.999406 0.9348149 0.9351024 -0.999531 0.9478752 0.9480569 -0.9996296 0.9584159 0.9585305 -0.9997074 0.9668872 0.9669594 -0.9997689 0.9736726 0.9737179 -0.9998174 0.9790927 0.9791212 -0.9998557 0.9834129 0.9834308 -0.999886 0.9868505 0.9868617 -0.9999099 0.989582 0.989589 -0.9999288 0.9917501 0.9917545 -0.9999437 0.9934695 0.9934722 -0.0000238 0.0011968 0.4344249 -0.0000382 0.0006933 0.4339214 -0.0000611 0.0000611 0.4332891 -0.0008899 0.0000611 0.4332891 -0.0019385 0.0000611 0.4332891 -0.003265 0.0000611 0.4332891 -0.0049433 0.0000611 0.4332891 -0.0070666 0.0000611 0.4332891 -0.0097527 0.0000611 0.4332891 -0.0131511 0.0000611 0.4332891 -0.0174505 0.0000611 0.4332891 -0.0228898 0.0000611 0.4332891 -0.0297711 0.0000611 0.4332891 -0.038477 0.0000611 0.4332891 -0.049491 0.0000611 0.4332891 -0.0634252 0.0000611 0.4332891 -0.0810538 0.0000611 0.4332891 -0.1033562 0.0000611 0.4332891 -0.1315716 0.0000611 0.4332891 -0.1672678 0.0000611 0.4332891 -0.2124282 0.0000611 0.4332891 -0.2695619 0.0000611 0.4332891 -0.3418435 0.0000611 0.4332891 -0.4332891 0.0000611 0.4332891 -0.5489798 0.0000611 0.4332891 -0.6953434 0.0000611 0.4332891 -0.8402274 0.0051047 0.4160287 -0.9031567 0.0278347 0.3680241 -0.9353643 0.0623458 0.3303774 -0.9545059 0.1058883 0.3117322 -0.9669053 0.1571463 0.3123447 -0.9753908 0.2150342 0.3301905 -0.9814183 0.2782884 0.3624418 -0.9858141 0.3453439 0.4059227 -0.9890818 0.4143657 0.457327 -0.9915455 0.4833811 0.5134034 -0.9934231 0.550464 0.5711477 -0.9948657 0.6139219 0.6279812 -0.9959809 0.6724399 0.6818777 -0.9968473 0.7251537 0.7314179 -0.9975229 0.7716504 0.7757666 -0.9980512 0.8119096 0.8145909 -0.9984653 0.8462132 0.8479467 -0.9987904 0.8750451 0.8761587 -0.9990461 0.8990011 0.8997128 -0.9992474 0.9187164 0.9191692 -0.999406 0.9348146 0.9351016 -0.999531 0.947875 0.9480564 -0.9996296 0.9584157 0.9585301 -0.9997074 0.9668871 0.9669592 -0.9997689 0.9736725 0.9737178 -0.9998174 0.9790927 0.9791211 -0.9998557 0.9834129 0.9834307 -0.999886 0.9868505 0.9868616 -0.9999099 0.989582 0.989589 -0.9999288 0.9917501 0.9917545 -0.9999437 0.9934695 0.9934722 -0.0000238 0.0020256 0.4344249 -0.0000382 0.0015221 0.4339214 -0.0000611 0.0008899 0.4332891 -0.0000978 0.0000978 0.432497 -0.0011463 0.0000978 0.432497 -0.0024729 0.0000978 0.432497 -0.0041512 0.0000978 0.432497 -0.0062744 0.0000978 0.432497 -0.0089606 0.0000978 0.432497 -0.012359 0.0000978 0.432497 -0.0166583 0.0000978 0.432497 -0.0220976 0.0000978 0.432497 -0.028979 0.0000978 0.432497 -0.0376849 0.0000978 0.432497 -0.0486989 0.0000978 0.432497 -0.0626331 0.0000978 0.432497 -0.0802616 0.0000978 0.432497 -0.102564 0.0000978 0.432497 -0.1307795 0.0000978 0.432497 -0.1664757 0.0000978 0.432497 -0.2116361 0.0000978 0.432497 -0.2687698 0.0000978 0.432497 -0.3410514 0.0000978 0.432497 -0.432497 0.0000978 0.432497 -0.5481876 0.0000978 0.432497 -0.6945513 0.0000978 0.432497 -0.8398756 0.0050826 0.4154448 -0.9030276 0.0277752 0.3675394 -0.9353068 0.0622749 0.3299551 -0.9544774 0.1058162 0.3113722 -0.9668902 0.1570779 0.3120464 -0.9753825 0.2149725 0.3299499 -0.9814136 0.2782347 0.3622521 -0.9858113 0.3452987 0.4057766 -0.9890801 0.414329 0.4572169 -0.9915446 0.4833522 0.5133222 -0.9934225 0.5504419 0.571089 -0.9948653 0.6139056 0.6279395 -0.9959807 0.672428 0.6818486 -0.9968472 0.7251454 0.731398 -0.9975228 0.7716446 0.7757532 -0.9980511 0.8119057 0.8145819 -0.9984653 0.8462106 0.8479408 -0.9987904 0.8750434 0.8761549 -0.9990461 0.899 0.8997103 -0.9992474 0.9187157 0.9191676 -0.999406 0.9348141 0.9351006 -0.999531 0.9478746 0.9480558 -0.9996296 0.9584155 0.9585297 -0.9997074 0.966887 0.9669589 -0.9997689 0.9736724 0.9737176 -0.9998174 0.9790926 0.979121 -0.9998557 0.9834129 0.9834306 -0.999886 0.9868505 0.9868616 -0.9999099 0.989582 0.989589 -0.9999288 0.9917501 0.9917544 -0.9999437 0.9934695 0.9934722 -0.0000238 0.0030742 0.4344249 -0.0000382 0.0025707 0.4339214 -0.0000611 0.0019385 0.4332891 -0.0000978 0.0011463 0.432497 -0.0001565 0.0001565 0.4315072 -0.001483 0.0001565 0.4315072 -0.0031613 0.0001565 0.4315072 -0.0052846 0.0001565 0.4315072 -0.0079707 0.0001565 0.4315072 -0.0113691 0.0001565 0.4315072 -0.0156685 0.0001565 0.4315072 -0.0211078 0.0001565 0.4315072 -0.0279891 0.0001565 0.4315072 -0.036695 0.0001565 0.4315072 -0.047709 0.0001565 0.4315072 -0.0616432 0.0001565 0.4315072 -0.0792718 0.0001565 0.4315072 -0.1015742 0.0001565 0.4315072 -0.1297896 0.0001565 0.4315072 -0.1654858 0.0001565 0.4315072 -0.2106462 0.0001565 0.4315072 -0.2677799 0.0001565 0.4315072 -0.3400615 0.0001565 0.4315072 -0.4315072 0.0001565 0.4315072 -0.5471978 0.0001565 0.4315072 -0.6935614 0.0001565 0.4315072 -0.8394338 0.0050676 0.4147137 -0.9028657 0.0277111 0.3669329 -0.9352348 0.0621943 0.3294267 -0.9544418 0.1057322 0.3109219 -0.9668714 0.1569971 0.3116735 -0.9753721 0.2148987 0.3296489 -0.9814076 0.2781701 0.3620151 -0.9858079 0.3452442 0.405594 -0.9890781 0.4142845 0.4570793 -0.9915433 0.4833171 0.5132206 -0.9934218 0.550415 0.5710156 -0.9948649 0.6138855 0.6278874 -0.9959804 0.6724135 0.6818124 -0.996847 0.7251351 0.7313732 -0.9975227 0.7716375 0.7757364 -0.9980511 0.8119009 0.8145707 -0.9984652 0.8462073 0.8479334 -0.9987904 0.8750412 0.8761501 -0.9990461 0.8989986 0.8997072 -0.9992474 0.9187148 0.9191656 -0.999406 0.9348135 0.9350993 -0.999531 0.9478743 0.9480549 -0.9996296 0.9584153 0.9585292 -0.9997074 0.9668869 0.9669586 -0.9997689 0.9736723 0.9737174 -0.9998174 0.9790925 0.9791208 -0.9998557 0.9834128 0.9834306 -0.999886 0.9868504 0.9868616 -0.9999099 0.989582 0.9895889 -0.9999288 0.9917501 0.9917544 -0.9999437 0.9934695 0.9934722 -0.0000238 0.0044007 0.4344249 -0.0000382 0.0038972 0.4339214 -0.0000611 0.003265 0.4332891 -0.0000978 0.0024729 0.432497 -0.0001565 0.001483 0.4315072 -0.0002504 0.0002504 0.4302746 -0.0019287 0.0002504 0.4302746 -0.004052 0.0002504 0.4302746 -0.0067381 0.0002504 0.4302746 -0.0101365 0.0002504 0.4302746 -0.0144359 0.0002504 0.4302746 -0.0198752 0.0002504 0.4302746 -0.0267565 0.0002504 0.4302746 -0.0354624 0.0002504 0.4302746 -0.0464764 0.0002504 0.4302746 -0.0604106 0.0002504 0.4302746 -0.0780392 0.0002504 0.4302746 -0.1003416 0.0002504 0.4302746 -0.128557 0.0002504 0.4302746 -0.1642532 0.0002504 0.4302746 -0.2094136 0.0002504 0.4302746 -0.2665473 0.0002504 0.4302746 -0.3388289 0.0002504 0.4302746 -0.4302746 0.0002504 0.4302746 -0.5459652 0.0002504 0.4302746 -0.6923288 0.0002504 0.4302746 -0.8388802 0.0050694 0.413801 -0.9026634 0.0276479 0.3661762 -0.9351449 0.0621069 0.3287678 -0.9543974 0.1056375 0.3103605 -0.9668479 0.156904 0.3112085 -0.9753591 0.2148124 0.3292738 -0.9814002 0.2780936 0.3617196 -0.9858036 0.3451791 0.4053665 -0.9890755 0.4142311 0.4569079 -0.9915418 0.4832747 0.5130941 -0.9934209 0.5503825 0.5709241 -0.9948643 0.6138613 0.6278225 -0.9959801 0.6723959 0.6817672 -0.9968468 0.7251226 0.7313422 -0.9975226 0.7716288 0.7757155 -0.998051 0.8118949 0.8145568 -0.9984652 0.8462034 0.8479242 -0.9987904 0.8750386 0.8761441 -0.9990461 0.8989969 0.8997033 -0.9992474 0.9187137 0.9191631 -0.9994059 0.9348128 0.9350977 -0.999531 0.9478738 0.9480539 -0.9996296 0.958415 0.9585286 -0.9997074 0.9668867 0.9669582 -0.9997689 0.9736722 0.9737172 -0.9998174 0.9790925 0.9791207 -0.9998557 0.9834128 0.9834305 -0.999886 0.9868504 0.9868615 -0.9999099 0.9895819 0.9895889 -0.9999288 0.9917501 0.9917544 -0.9999437 0.9934695 0.9934722 -0.0000238 0.006079 0.4344249 -0.0000382 0.0055755 0.4339214 -0.0000611 0.0049433 0.4332891 -0.0000978 0.0041512 0.432497 -0.0001565 0.0031613 0.4315072 -0.0002504 0.0019287 0.4302746 -0.0004008 0.0004008 0.4287467 -0.0025241 0.0004008 0.4287467 -0.0052103 0.0004008 0.4287467 -0.0086086 0.0004008 0.4287467 -0.012908 0.0004008 0.4287467 -0.0183473 0.0004008 0.4287467 -0.0252287 0.0004008 0.4287467 -0.0339345 0.0004008 0.4287467 -0.0449485 0.0004008 0.4287467 -0.0588827 0.0004008 0.4287467 -0.0765113 0.0004008 0.4287467 -0.0988137 0.0004008 0.4287467 -0.1270291 0.0004008 0.4287467 -0.1627254 0.0004008 0.4287467 -0.2078857 0.0004008 0.4287467 -0.2650195 0.0004008 0.4287467 -0.337301 0.0004008 0.4287467 -0.4287467 0.0004008 0.4287467 -0.5444373 0.0004008 0.4287467 -0.6908009 0.0004008 0.4287467 -0.8381886 0.0051048 0.412666 -0.9024114 0.0275966 0.3652362 -0.9350332 0.0620199 0.3279495 -0.9543421 0.1055364 0.3096636 -0.9668187 0.1568008 0.3106315 -0.975343 0.2147144 0.3288084 -0.9813911 0.2780055 0.3613531 -0.9857982 0.3451032 0.4050843 -0.9890723 0.4141683 0.4566952 -0.9915399 0.4832246 0.5129372 -0.9934197 0.5503438 0.5708106 -0.9948636 0.6138323 0.6277421 -0.9959797 0.6723748 0.6817112 -0.9968465 0.7251076 0.7313039 -0.9975224 0.7716184 0.7756896 -0.9980509 0.8118878 0.8145396 -0.9984651 0.8461986 0.8479129 -0.9987903 0.8750355 0.8761367 -0.9990461 0.8989948 0.8996985 -0.9992473 0.9187123 0.91916 -0.9994059 0.9348119 0.9350958 -0.999531 0.9478733 0.9480527 -0.9996296 0.9584146 0.9585278 -0.9997074 0.9668865 0.9669577 -0.9997689 0.9736721 0.9737168 -0.9998174 0.9790924 0.9791205 -0.9998557 0.9834127 0.9834303 -0.999886 0.9868504 0.9868614 -0.9999099 0.9895819 0.9895888 -0.9999288 0.99175 0.9917544 -0.9999437 0.9934695 0.9934722 -0.0000238 0.0082023 0.4344249 -0.0000382 0.0076988 0.4339214 -0.0000611 0.0070666 0.4332891 -0.0000978 0.0062744 0.432497 -0.0001565 0.0052846 0.4315072 -0.0002504 0.004052 0.4302746 -0.0004008 0.0025241 0.4287467 -0.0006416 0.0006416 0.4268641 -0.0033277 0.0006416 0.4268641 -0.0067261 0.0006416 0.4268641 -0.0110255 0.0006416 0.4268641 -0.0164648 0.0006416 0.4268641 -0.0233461 0.0006416 0.4268641 -0.032052 0.0006416 0.4268641 -0.043066 0.0006416 0.4268641 -0.0570002 0.0006416 0.4268641 -0.0746288 0.0006416 0.4268641 -0.0969312 0.0006416 0.4268641 -0.1251466 0.0006416 0.4268641 -0.1608428 0.0006416 0.4268641 -0.2060032 0.0006416 0.4268641 -0.2631369 0.0006416 0.4268641 -0.3354185 0.0006416 0.4268641 -0.4268641 0.0006416 0.4268641 -0.5425548 0.0006416 0.4268641 -0.6889184 0.0006416 0.4268641 -0.8373283 0.0052028 0.4112619 -0.9020992 0.0275778 0.3640749 -0.9348949 0.0619473 0.326939 -0.9542739 0.1054384 0.3088033 -0.9667827 0.1566936 0.3099195 -0.9753231 0.2146085 0.3282343 -0.9813797 0.2779077 0.3609011 -0.9857916 0.3450175 0.4047363 -0.9890684 0.4140964 0.4564331 -0.9915376 0.4831666 0.5127438 -0.9934183 0.5502987 0.5706708 -0.9948628 0.6137984 0.6276429 -0.9959791 0.67235 0.6816421 -0.9968462 0.7250899 0.7312566 -0.9975222 0.7716061 0.7756577 -0.9980508 0.8118794 0.8145183 -0.998465 0.8461929 0.8478989 -0.9987903 0.8750317 0.8761276 -0.999046 0.8989923 0.8996926 -0.9992473 0.9187107 0.9191562 -0.9994059 0.9348109 0.9350933 -0.999531 0.9478726 0.9480511 -0.9996296 0.9584142 0.9585268 -0.9997074 0.9668862 0.9669571 -0.9997689 0.9736719 0.9737164 -0.9998174 0.9790923 0.9791202 -0.9998557 0.9834127 0.9834302 -0.999886 0.9868503 0.9868613 -0.9999099 0.9895819 0.9895888 -0.9999288 0.99175 0.9917543 -0.9999437 0.9934694 0.9934721 -0.0000238 0.0108885 0.4344249 -0.0000382 0.0103849 0.4339214 -0.0000611 0.0097527 0.4332891 -0.0000978 0.0089606 0.432497 -0.0001565 0.0079707 0.4315072 -0.0002504 0.0067381 0.4302746 -0.0004008 0.0052103 0.4287467 -0.0006416 0.0033277 0.4268641 -0.0010268 0.0010268 0.4245633 -0.0044252 0.0010268 0.4245633 -0.0087246 0.0010268 0.4245633 -0.0141639 0.0010268 0.4245633 -0.0210452 0.0010268 0.4245633 -0.0297511 0.0010268 0.4245633 -0.0407651 0.0010268 0.4245633 -0.0546993 0.0010268 0.4245633 -0.0723279 0.0010268 0.4245633 -0.0946303 0.0010268 0.4245633 -0.1228457 0.0010268 0.4245633 -0.1585419 0.0010268 0.4245633 -0.2037023 0.0010268 0.4245633 -0.260836 0.0010268 0.4245633 -0.3331176 0.0010268 0.4245633 -0.4245633 0.0010268 0.4245633 -0.5402539 0.0010268 0.4245633 -0.6866175 0.0010268 0.4245633 -0.8362644 0.0054121 0.4095375 -0.9017148 0.0276281 0.3626507 -0.9347252 0.061916 0.3257005 -0.9541902 0.1053624 0.3077494 -0.9667385 0.1565954 0.3090475 -0.9752987 0.2145034 0.3275315 -0.9813659 0.2778058 0.3603479 -0.9857835 0.3449254 0.4043106 -0.9890637 0.4140176 0.4561124 -0.9915347 0.4831021 0.5125072 -0.9934166 0.550248 0.5704998 -0.9948617 0.6137599 0.6275217 -0.9959785 0.6723217 0.6815577 -0.9968458 0.7250697 0.7311988 -0.997522 0.7715919 0.7756187 -0.9980506 0.8118697 0.8144923 -0.9984649 0.8461864 0.8478818 -0.9987902 0.8750274 0.8761164 -0.999046 0.8989895 0.8996854 -0.9992473 0.9187089 0.9191516 -0.9994059 0.9348097 0.9350904 -0.999531 0.9478718 0.9480493 -0.9996296 0.9584137 0.9585256 -0.9997074 0.9668859 0.9669563 -0.9997689 0.9736717 0.973716 -0.9998174 0.9790921 0.9791199 -0.9998557 0.9834126 0.98343 -0.999886 0.9868503 0.9868612 -0.9999099 0.9895819 0.9895887 -0.9999288 0.99175 0.9917543 -0.9999437 0.9934694 0.9934721 -0.0000238 0.0142868 0.4344249 -0.0000382 0.0137833 0.4339214 -0.0000611 0.0131511 0.4332891 -0.0000978 0.012359 0.432497 -0.0001565 0.0113691 0.4315072 -0.0002504 0.0101365 0.4302746 -0.0004008 0.0086086 0.4287467 -0.0006416 0.0067261 0.4268641 -0.0010268 0.0044252 0.4245633 -0.0016435 0.0016435 0.4217816 -0.0059429 0.0016435 0.4217816 -0.0113822 0.0016435 0.4217816 -0.0182636 0.0016435 0.4217816 -0.0269694 0.0016435 0.4217816 -0.0379834 0.0016435 0.4217816 -0.0519176 0.0016435 0.4217816 -0.0695462 0.0016435 0.4217816 -0.0918486 0.0016435 0.4217816 -0.120064 0.0016435 0.4217816 -0.1557603 0.0016435 0.4217816 -0.2009206 0.0016435 0.4217816 -0.2580543 0.0016435 0.4217816 -0.3303359 0.0016435 0.4217816 -0.4217816 0.0016435 0.4217816 -0.5374722 0.0016435 0.4217816 -0.6838358 0.0016435 0.4217816 -0.8349593 0.0058134 0.4074404 -0.9012461 0.0278105 0.3609218 -0.9345187 0.0619734 0.3241981 -0.9540886 0.1053433 0.3064717 -0.966685 0.1565315 0.307991 -0.9752692 0.2144168 0.3266802 -0.9813491 0.2777122 0.3596781 -0.9857738 0.3448353 0.4037952 -0.9890579 0.4139373 0.4557243 -0.9915312 0.4830346 0.512221 -0.9934145 0.5501939 0.570293 -0.9948604 0.6137183 0.627375 -0.9959777 0.6722907 0.6814556 -0.9968453 0.7250473 0.7311288 -0.9975217 0.7715762 0.7755715 -0.9980504 0.8118589 0.8144609 -0.9984648 0.8461791 0.8478611 -0.9987902 0.8750225 0.8761029 -0.9990459 0.8989863 0.8996766 -0.9992473 0.9187068 0.919146 -0.9994059 0.9348083 0.9350868 -0.9995309 0.947871 0.948047 -0.9996296 0.9584132 0.9585242 -0.9997074 0.9668855 0.9669554 -0.9997689 0.9736715 0.9737154 -0.9998174 0.979092 0.9791196 -0.9998557 0.9834125 0.9834298 -0.999886 0.9868502 0.9868611 -0.9999099 0.9895818 0.9895886 -0.9999288 0.99175 0.9917542 -0.9999437 0.9934694 0.9934721 -0.0000238 0.0185862 0.4344249 -0.0000382 0.0180827 0.4339214 -0.0000611 0.0174505 0.4332891 -0.0000978 0.0166583 0.432497 -0.0001565 0.0156685 0.4315072 -0.0002504 0.0144359 0.4302746 -0.0004008 0.012908 0.4287467 -0.0006416 0.0110255 0.4268641 -0.0010268 0.0087246 0.4245633 -0.0016435 0.0059429 0.4217816 -0.0026305 0.0026305 0.4184692 -0.0080698 0.0026305 0.4184692 -0.0149512 0.0026305 0.4184692 -0.023657 0.0026305 0.4184692 -0.0346711 0.0026305 0.4184692 -0.0486053 0.0026305 0.4184692 -0.0662338 0.0026305 0.4184692 -0.0885362 0.0026305 0.4184692 -0.1167517 0.0026305 0.4184692 -0.1524479 0.0026305 0.4184692 -0.1976083 0.0026305 0.4184692 -0.254742 0.0026305 0.4184692 -0.3270236 0.0026305 0.4184692 -0.4184692 0.0026305 0.4184692 -0.5341598 0.0026305 0.4184692 -0.6805235 0.0026305 0.4184692 -0.8333779 0.0065402 0.4049254 -0.900682 0.0282324 0.358853 -0.9342712 0.062202 0.3224019 -0.9539671 0.1054431 0.3049452 -0.9666211 0.1565473 0.3067294 -0.975234 0.2143816 0.3256642 -0.9813291 0.2776503 0.3588791 -0.9857621 0.3447636 0.4031806 -0.989051 0.4138668 0.4552615 -0.9915271 0.4829718 0.5118798 -0.993412 0.5501416 0.5700464 -0.9948589 0.6136769 0.6272003 -0.9959768 0.6722594 0.6813339 -0.9968448 0.7250244 0.7310455 -0.9975213 0.7715599 0.7755153 -0.9980502 0.8118476 0.8144235 -0.9984647 0.8461714 0.8478364 -0.9987901 0.8750173 0.8760869 -0.9990459 0.8989829 0.8996662 -0.9992472 0.9187045 0.9191393 -0.9994059 0.9348069 0.9350825 -0.9995309 0.94787 0.9480443 -0.9996296 0.9584126 0.9585224 -0.9997074 0.9668852 0.9669543 -0.9997689 0.9736712 0.9737147 -0.9998174 0.9790919 0.9791191 -0.9998557 0.9834124 0.9834295 -0.999886 0.9868502 0.9868609 -0.9999099 0.9895818 0.9895885 -0.9999288 0.99175 0.9917542 -0.9999437 0.9934694 0.993472 -0.0000238 0.0240255 0.4344249 -0.0000382 0.023522 0.4339214 -0.0000611 0.0228898 0.4332891 -0.0000978 0.0220976 0.432497 -0.0001565 0.0211078 0.4315072 -0.0002504 0.0198752 0.4302746 -0.0004008 0.0183473 0.4287467 -0.0006416 0.0164648 0.4268641 -0.0010268 0.0141639 0.4245633 -0.0016435 0.0113822 0.4217816 -0.0026305 0.0080698 0.4184692 -0.0042103 0.0042103 0.4146097 -0.0110917 0.0042103 0.4146097 -0.0197975 0.0042103 0.4146097 -0.0308116 0.0042103 0.4146097 -0.0447458 0.0042103 0.4146097 -0.0623743 0.0042103 0.4146097 -0.0846767 0.0042103 0.4146097 -0.1128922 0.0042103 0.4146097 -0.1485884 0.0042103 0.4146097 -0.1937488 0.0042103 0.4146097 -0.2508825 0.0042103 0.4146097 -0.3231641 0.0042103 0.4146097 -0.4146097 0.0042103 0.4146097 -0.5303003 0.0042103 0.4146097 -0.676664 0.0042103 0.4146097 -0.8314967 0.0078103 0.4019701 -0.9000167 0.0290732 0.3564286 -0.9339805 0.062742 0.3202989 -0.9538247 0.1057683 0.3031594 -0.9665463 0.1567226 0.3052547 -0.9751928 0.2144566 0.3244773 -0.9813057 0.2776626 0.357946 -0.9857485 0.3447407 0.4024632 -0.989043 0.4138277 0.4547216 -0.9915223 0.4829286 0.5114818 -0.9934091 0.5501012 0.5697589 -0.9948571 0.6136427 0.6269965 -0.9959757 0.6722322 0.6811921 -0.9968441 0.7250039 0.7309484 -0.9975209 0.7715449 0.7754498 -0.99805 0.811837 0.8143799 -0.9984645 0.8461641 0.8478077 -0.99879 0.8750124 0.8760681 -0.9990458 0.8989796 0.8996541 -0.9992472 0.9187024 0.9191315 -0.9994059 0.9348055 0.9350775 -0.9995309 0.9478691 0.9480411 -0.9996296 0.958412 0.9585204 -0.9997074 0.9668848 0.966953 -0.9997689 0.973671 0.9737139 -0.9998174 0.9790917 0.9791186 -0.9998557 0.9834123 0.9834292 -0.999886 0.9868501 0.9868607 -0.9999099 0.9895818 0.9895884 -0.9999288 0.9917499 0.9917541 -0.9999437 0.9934694 0.993472 -0.0000238 0.0309069 0.4344249 -0.0000382 0.0304033 0.4339214 -0.0000611 0.0297711 0.4332891 -0.0000978 0.028979 0.432497 -0.0001565 0.0279891 0.4315072 -0.0002504 0.0267565 0.4302746 -0.0004008 0.0252287 0.4287467 -0.0006416 0.0233461 0.4268641 -0.0010268 0.0210452 0.4245633 -0.0016435 0.0182636 0.4217816 -0.0026305 0.0149512 0.4184692 -0.0042103 0.0110917 0.4146097 -0.0067388 0.0067388 0.4102568 -0.0154447 0.0067388 0.4102568 -0.0264587 0.0067388 0.4102568 -0.0403929 0.0067388 0.4102568 -0.0580214 0.0067388 0.4102568 -0.0803239 0.0067388 0.4102568 -0.1085393 0.0067388 0.4102568 -0.1442355 0.0067388 0.4102568 -0.1893959 0.0067388 0.4102568 -0.2465296 0.0067388 0.4102568 -0.3188112 0.0067388 0.4102568 -0.4102568 0.0067388 0.4102568 -0.5259474 0.0067388 0.4102568 -0.6723111 0.0067388 0.4102568 -0.8293233 0.0099781 0.3986045 -0.8992555 0.0306306 0.3536761 -0.9336494 0.0638283 0.3179142 -0.953663 0.1064997 0.3011363 -0.9664615 0.1571937 0.3035853 -0.9751462 0.2147432 0.3231346 -0.9812792 0.2778236 0.3568911 -0.9857332 0.3448204 0.4016525 -0.9890339 0.4138582 0.4541117 -0.9915169 0.4829319 0.5110324 -0.9934058 0.5500915 0.5694343 -0.9948551 0.6136284 0.6267665 -0.9959745 0.672218 0.681032 -0.9968433 0.7249916 0.7308388 -0.9975204 0.7715352 0.7753759 -0.9980497 0.8118298 0.8143306 -0.9984643 0.8461589 0.8477753 -0.9987899 0.8750088 0.876047 -0.9990458 0.8989771 0.8996405 -0.9992472 0.9187008 0.9191227 -0.9994058 0.9348044 0.9350719 -0.9995309 0.9478684 0.9480375 -0.9996296 0.9584115 0.9585182 -0.9997074 0.9668845 0.9669516 -0.9997689 0.9736708 0.973713 -0.9998174 0.9790916 0.9791181 -0.9998557 0.9834122 0.9834288 -0.999886 0.9868501 0.9868605 -0.9999099 0.9895817 0.9895882 -0.9999288 0.9917499 0.991754 -0.9999437 0.9934694 0.9934719 -0.0000238 0.0396127 0.4344249 -0.0000382 0.0391092 0.4339214 -0.0000611 0.038477 0.4332891 -0.0000978 0.0376849 0.432497 -0.0001565 0.036695 0.4315072 -0.0002504 0.0354624 0.4302746 -0.0004008 0.0339345 0.4287467 -0.0006416 0.032052 0.4268641 -0.0010268 0.0297511 0.4245633 -0.0016435 0.0269694 0.4217816 -0.0026305 0.023657 0.4184692 -0.0042103 0.0197975 0.4146097 -0.0067388 0.0154447 0.4102568 -0.0107859 0.0107859 0.405598 -0.0217999 0.0107859 0.405598 -0.0357341 0.0107859 0.405598 -0.0533626 0.0107859 0.405598 -0.075665 0.0107859 0.405598 -0.1038805 0.0107859 0.405598 -0.1395767 0.0107859 0.405598 -0.1847371 0.0107859 0.405598 -0.2418708 0.0107859 0.405598 -0.3141524 0.0107859 0.405598 -0.405598 0.0107859 0.405598 -0.5212886 0.0107859 0.405598 -0.6676523 0.0107859 0.405598 -0.8269342 0.0136166 0.3949636 -0.8984278 0.0333932 0.3507087 -0.9332914 0.0658501 0.3153463 -0.9534887 0.1079385 0.2989601 -0.9663702 0.15819 0.3017912 -0.9750962 0.2154135 0.3216928 -0.9812508 0.2782606 0.355759 -0.9857167 0.3450957 0.4007829 -0.9890241 0.4140252 0.4534577 -0.991511 0.4830292 0.5105506 -0.9934023 0.5501456 0.5690864 -0.994853 0.6136569 0.6265201 -0.9959732 0.672232 0.6808605 -0.9968425 0.7249978 0.7307215 -0.9975199 0.7715376 0.7752967 -0.9980494 0.8118303 0.8142779 -0.9984642 0.8461587 0.8477406 -0.9987897 0.8750084 0.8760244 -0.9990457 0.8989767 0.8996258 -0.9992471 0.9187004 0.9191133 -0.9994058 0.9348042 0.9350659 -0.9995309 0.9478683 0.9480337 -0.9996295 0.9584114 0.9585157 -0.9997074 0.9668844 0.9669501 -0.9997689 0.9736708 0.973712 -0.9998174 0.9790916 0.9791175 -0.9998557 0.9834122 0.9834284 -0.999886 0.98685 0.9868602 -0.9999099 0.9895817 0.9895881 -0.9999288 0.9917499 0.9917539 -0.9999437 0.9934694 0.9934719 -0.0000238 0.0506267 0.4344249 -0.0000382 0.0501232 0.4339214 -0.0000611 0.049491 0.4332891 -0.0000978 0.0486989 0.432497 -0.0001565 0.047709 0.4315072 -0.0002504 0.0464764 0.4302746 -0.0004008 0.0449485 0.4287467 -0.0006416 0.043066 0.4268641 -0.0010268 0.0407651 0.4245633 -0.0016435 0.0379834 0.4217816 -0.0026305 0.0346711 0.4184692 -0.0042103 0.0308116 0.4146097 -0.0067388 0.0264587 0.4102568 -0.0107859 0.0217999 0.405598 -0.0172633 0.0172633 0.4010615 -0.0311975 0.0172633 0.4010615 -0.0488261 0.0172633 0.4010615 -0.0711285 0.0172633 0.4010615 -0.099344 0.0172633 0.4010615 -0.1350402 0.0172633 0.4010615 -0.1802005 0.0172633 0.4010615 -0.2373343 0.0172633 0.4010615 -0.3096159 0.0172633 0.4010615 -0.4010615 0.0172633 0.4010615 -0.5167521 0.0172633 0.4010615 -0.6631157 0.0172633 0.4010615 -0.8245426 0.0196467 0.391379 -0.8976087 0.0381561 0.3477976 -0.9329391 0.0694453 0.3128305 -0.9533177 0.1105818 0.2968302 -0.9662809 0.160092 0.3000369 -0.9750472 0.2167545 0.3202839 -0.9812231 0.2791873 0.3546535 -0.9857006 0.3457234 0.3999341 -0.9890146 0.4144423 0.4528197 -0.9915054 0.4833013 0.5100808 -0.9933988 0.5503203 0.5687472 -0.9948509 0.6137675 0.6262799 -0.9959719 0.6723012 0.6806934 -0.9968418 0.7250408 0.7306071 -0.9975194 0.7715641 0.7752196 -0.9980491 0.8118466 0.8142266 -0.998464 0.8461687 0.8477068 -0.9987896 0.8750145 0.8760023 -0.9990456 0.8989805 0.8996116 -0.9992471 0.9187027 0.9191042 -0.9994058 0.9348056 0.9350601 -0.9995309 0.9478691 0.94803 -0.9996295 0.958412 0.9585134 -0.9997074 0.9668847 0.9669486 -0.9997688 0.973671 0.9737111 -0.9998174 0.9790917 0.9791169 -0.9998557 0.9834123 0.9834281 -0.999886 0.9868501 0.98686 -0.9999099 0.9895817 0.9895879 -0.9999288 0.9917499 0.9917538 -0.9999437 0.9934694 0.9934718 -0.0000238 0.0645609 0.4344249 -0.0000382 0.0640574 0.4339214 -0.0000611 0.0634252 0.4332891 -0.0000978 0.0626331 0.432497 -0.0001565 0.0616432 0.4315072 -0.0002504 0.0604106 0.4302746 -0.0004008 0.0588827 0.4287467 -0.0006416 0.0570002 0.4268641 -0.0010268 0.0546993 0.4245633 -0.0016435 0.0519176 0.4217816 -0.0026305 0.0486053 0.4184692 -0.0042103 0.0447458 0.4146097 -0.0067388 0.0403929 0.4102568 -0.0107859 0.0357341 0.405598 -0.0172633 0.0311975 0.4010615 -0.0276309 0.0276309 0.3974949 -0.0452595 0.0276309 0.3974949 -0.0675619 0.0276309 0.3974949 -0.0957773 0.0276309 0.3974949 -0.1314736 0.0276309 0.3974949 -0.1766339 0.0276309 0.3974949 -0.2337676 0.0276309 0.3974949 -0.3060492 0.0276309 0.3974949 -0.3974949 0.0276309 0.3974949 -0.5131855 0.0276309 0.3974949 -0.6595491 0.0276309 0.3974949 -0.8226154 0.0295373 0.3885332 -0.8969554 0.0461985 0.3454939 -0.9326595 0.0756464 0.3108418 -0.9531823 0.1152388 0.2951481 -0.9662104 0.1635226 0.2986526 -0.9750086 0.2192389 0.319173 -0.9812013 0.2809573 0.3537823 -0.9856879 0.3469645 0.3992655 -0.9890072 0.4152991 0.4523173 -0.9915009 0.4838841 0.5097109 -0.9933961 0.5507113 0.5684803 -0.9948493 0.6140266 0.6260909 -0.9959709 0.6724711 0.680562 -0.9968411 0.7251511 0.7305171 -0.9975191 0.7716352 0.7751589 -0.9980488 0.8118921 0.8141862 -0.9984638 0.8461977 0.8476802 -0.9987895 0.8750329 0.875985 -0.9990456 0.8989921 0.8996004 -0.999247 0.9187101 0.919097 -0.9994057 0.9348102 0.9350555 -0.9995309 0.947872 0.948027 -0.9996295 0.9584138 0.9585115 -0.9997074 0.9668859 0.9669474 -0.9997688 0.9736717 0.9737104 -0.9998174 0.9790921 0.9791164 -0.9998557 0.9834126 0.9834278 -0.999886 0.9868503 0.9868598 -0.9999099 0.9895819 0.9895878 -0.9999288 0.99175 0.9917537 -0.9999437 0.9934694 0.9934718 -0.0000238 0.0821895 0.4344249 -0.0000382 0.081686 0.4339214 -0.0000611 0.0810538 0.4332891 -0.0000978 0.0802616 0.432497 -0.0001565 0.0792718 0.4315072 -0.0002504 0.0780392 0.4302746 -0.0004008 0.0765113 0.4287467 -0.0006416 0.0746288 0.4268641 -0.0010268 0.0723279 0.4245633 -0.0016435 0.0695462 0.4217816 -0.0026305 0.0662338 0.4184692 -0.0042103 0.0623743 0.4146097 -0.0067388 0.0580214 0.4102568 -0.0107859 0.0533626 0.405598 -0.0172633 0.0488261 0.4010615 -0.0276309 0.0452595 0.3974949 -0.0441188 0.0441188 0.3963542 -0.0664212 0.0441188 0.3963542 -0.0946366 0.0441188 0.3963542 -0.1303328 0.0441188 0.3963542 -0.1754932 0.0441188 0.3963542 -0.2326269 0.0441188 0.3963542 -0.3049085 0.0441188 0.3963542 -0.3963542 0.0441188 0.3963542 -0.5120448 0.0441188 0.3963542 -0.6584084 0.0441188 0.3963542 -0.8219901 0.0455041 0.3876179 -0.8967447 0.0594506 0.3447543 -0.9325696 0.0860209 0.3102037 -0.9531389 0.1231452 0.2946088 -0.9661878 0.1694384 0.2982089 -0.9749962 0.2235962 0.3188171 -0.9811943 0.2841192 0.3535032 -0.9856839 0.3492254 0.3990515 -0.9890048 0.4168922 0.4521565 -0.9914995 0.4849907 0.5095925 -0.9933953 0.5514695 0.5683949 -0.9948487 0.6145393 0.6260304 -0.9959706 0.6728136 0.6805199 -0.9968409 0.7253775 0.7304884 -0.9975189 0.7717834 0.7751395 -0.9980488 0.8119884 0.8141733 -0.9984638 0.8462598 0.8476717 -0.9987895 0.8750727 0.8759795 -0.9990455 0.8990175 0.8995968 -0.999247 0.9187262 0.9190947 -0.9994057 0.9348204 0.935054 -0.9995308 0.9478785 0.9480261 -0.9996295 0.9584178 0.9585109 -0.9997074 0.9668884 0.966947 -0.9997688 0.9736733 0.9737101 -0.9998174 0.9790931 0.9791163 -0.9998557 0.9834132 0.9834277 -0.999886 0.9868507 0.9868597 -0.9999099 0.9895821 0.9895878 -0.9999288 0.9917502 0.9917537 -0.9999437 0.9934695 0.9934718 -0.0000238 0.1044919 0.4344249 -0.0000382 0.1039884 0.4339214 -0.0000611 0.1033562 0.4332891 -0.0000978 0.102564 0.432497 -0.0001565 0.1015742 0.4315072 -0.0002504 0.1003416 0.4302746 -0.0004008 0.0988137 0.4287467 -0.0006416 0.0969312 0.4268641 -0.0010268 0.0946303 0.4245633 -0.0016435 0.0918486 0.4217816 -0.0026305 0.0885362 0.4184692 -0.0042103 0.0846767 0.4146097 -0.0067388 0.0803239 0.4102568 -0.0107859 0.075665 0.405598 -0.0172633 0.0711285 0.4010615 -0.0276309 0.0675619 0.3974949 -0.0441188 0.0664212 0.3963542 -0.0664212 0.0664212 0.3963542 -0.0946366 0.0664212 0.3963542 -0.1303328 0.0664212 0.3963542 -0.1754932 0.0664212 0.3963542 -0.2326269 0.0664212 0.3963542 -0.3049085 0.0664212 0.3963542 -0.3963542 0.0664212 0.3963542 -0.5120448 0.0664212 0.3963542 -0.6584084 0.0664212 0.3963542 -0.8219901 0.0671656 0.3876179 -0.8967447 0.0775151 0.3447543 -0.9325696 0.1002154 0.3102037 -0.9531389 0.1340017 0.2946088 -0.9661878 0.1775917 0.2982089 -0.9749962 0.2296253 0.3188171 -0.9811943 0.2885124 0.3535032 -0.9856839 0.3523802 0.3990515 -0.9890048 0.419125 0.4521565 -0.9914995 0.4865484 0.5095925 -0.9933953 0.5525411 0.5683949 -0.9948487 0.6152669 0.6260304 -0.9959706 0.6733015 0.6805199 -0.9968409 0.7257011 0.7304884 -0.9975189 0.7719959 0.7751395 -0.9980488 0.8121268 0.8141733 -0.9984638 0.8463492 0.8476717 -0.9987895 0.8751301 0.8759795 -0.9990455 0.8990542 0.8995968 -0.999247 0.9187495 0.9190947 -0.9994057 0.9348352 0.935054 -0.9995308 0.9478878 0.9480261 -0.9996295 0.9584237 0.9585109 -0.9997074 0.9668922 0.966947 -0.9997688 0.9736756 0.9737101 -0.9998174 0.9790946 0.9791163 -0.9998557 0.9834141 0.9834277 -0.999886 0.9868512 0.9868597 -0.9999099 0.9895825 0.9895878 -0.9999288 0.9917504 0.9917537 -0.9999437 0.9934697 0.9934718 -0.0000238 0.1327073 0.4344249 -0.0000382 0.1322038 0.4339214 -0.0000611 0.1315716 0.4332891 -0.0000978 0.1307795 0.432497 -0.0001565 0.1297896 0.4315072 -0.0002504 0.128557 0.4302746 -0.0004008 0.1270291 0.4287467 -0.0006416 0.1251466 0.4268641 -0.0010268 0.1228457 0.4245633 -0.0016435 0.120064 0.4217816 -0.0026305 0.1167517 0.4184692 -0.0042103 0.1128922 0.4146097 -0.0067388 0.1085393 0.4102568 -0.0107859 0.1038805 0.405598 -0.0172633 0.099344 0.4010615 -0.0276309 0.0957773 0.3974949 -0.0441188 0.0946366 0.3963542 -0.0664212 0.0946366 0.3963542 -0.0946366 0.0946366 0.3963542 -0.1303328 0.0946366 0.3963542 -0.1754932 0.0946366 0.3963542 -0.2326269 0.0946366 0.3963542 -0.3049085 0.0946366 0.3963542 -0.3963542 0.0946366 0.3963542 -0.5120448 0.0946366 0.3963542 -0.6584084 0.0946366 0.3963542 -0.8219901 0.0945703 0.3876179 -0.8967447 0.1003691 0.3447543 -0.9325696 0.1181733 0.3102037 -0.9531389 0.1477366 0.2946088 -0.9661878 0.1879067 0.2982089 -0.9749962 0.2372529 0.3188171 -0.9811943 0.2940703 0.3535032 -0.9856839 0.3563715 0.3990515 -0.9890048 0.4219498 0.4521565 -0.9914995 0.4885191 0.5095925 -0.9933953 0.5538969 0.5683949 -0.9948487 0.6161874 0.6260304 -0.9959706 0.6739188 0.6805199 -0.9968409 0.7261105 0.7304884 -0.9975189 0.7722648 0.7751395 -0.9980488 0.8123018 0.8141733 -0.9984638 0.8464623 0.8476717 -0.9987895 0.8752028 0.8759795 -0.9990455 0.8991006 0.8995968 -0.999247 0.9187791 0.9190947 -0.9994057 0.9348539 0.935054 -0.9995308 0.9478997 0.9480261 -0.9996295 0.9584312 0.9585109 -0.9997074 0.9668969 0.966947 -0.9997688 0.9736786 0.9737101 -0.9998174 0.9790965 0.9791163 -0.9998557 0.9834153 0.9834277 -0.999886 0.986852 0.9868597 -0.9999099 0.9895829 0.9895878 -0.9999288 0.9917507 0.9917537 -0.9999437 0.9934698 0.9934718 -0.0000238 0.1684036 0.4344249 -0.0000382 0.1679 0.4339214 -0.0000611 0.1672678 0.4332891 -0.0000978 0.1664757 0.432497 -0.0001565 0.1654858 0.4315072 -0.0002504 0.1642532 0.4302746 -0.0004008 0.1627254 0.4287467 -0.0006416 0.1608428 0.4268641 -0.0010268 0.1585419 0.4245633 -0.0016435 0.1557603 0.4217816 -0.0026305 0.1524479 0.4184692 -0.0042103 0.1485884 0.4146097 -0.0067388 0.1442355 0.4102568 -0.0107859 0.1395767 0.405598 -0.0172633 0.1350402 0.4010615 -0.0276309 0.1314736 0.3974949 -0.0441188 0.1303328 0.3963542 -0.0664212 0.1303328 0.3963542 -0.0946366 0.1303328 0.3963542 -0.1303328 0.1303328 0.3963542 -0.1754932 0.1303328 0.3963542 -0.2326269 0.1303328 0.3963542 -0.3049085 0.1303328 0.3963542 -0.3963542 0.1303328 0.3963542 -0.5120448 0.1303328 0.3963542 -0.6584084 0.1303328 0.3963542 -0.8219901 0.1292408 0.3876179 -0.8967447 0.1292823 0.3447543 -0.9325696 0.1408925 0.3102037 -0.9531389 0.1651131 0.2946088 -0.9661878 0.2009566 0.2982089 -0.9749962 0.2469027 0.3188171 -0.9811943 0.3011018 0.3535032 -0.9856839 0.3614209 0.3990515 -0.9890048 0.4255236 0.4521565 -0.9914995 0.4910123 0.5095925 -0.9933953 0.5556122 0.5683949 -0.9948487 0.6173519 0.6260304 -0.9959706 0.6746998 0.6805199 -0.9968409 0.7266285 0.7304884 -0.9975189 0.7726049 0.7751395 -0.9980488 0.8125232 0.8141733 -0.9984638 0.8466054 0.8476717 -0.9987895 0.8752947 0.8759795 -0.9990455 0.8991593 0.8995968 -0.999247 0.9188164 0.9190947 -0.9994057 0.9348776 0.935054 -0.9995308 0.9479146 0.9480261 -0.9996295 0.9584406 0.9585109 -0.9997074 0.9669028 0.966947 -0.9997688 0.9736823 0.9737101 -0.9998174 0.9790988 0.9791163 -0.9998557 0.9834167 0.9834277 -0.999886 0.9868529 0.9868597 -0.9999099 0.9895835 0.9895878 -0.9999288 0.991751 0.9917537 -0.9999437 0.9934701 0.9934718 -0.0000238 0.2135639 0.4344249 -0.0000382 0.2130604 0.4339214 -0.0000611 0.2124282 0.4332891 -0.0000978 0.2116361 0.432497 -0.0001565 0.2106462 0.4315072 -0.0002504 0.2094136 0.4302746 -0.0004008 0.2078857 0.4287467 -0.0006416 0.2060032 0.4268641 -0.0010268 0.2037023 0.4245633 -0.0016435 0.2009206 0.4217816 -0.0026305 0.1976083 0.4184692 -0.0042103 0.1937488 0.4146097 -0.0067388 0.1893959 0.4102568 -0.0107859 0.1847371 0.405598 -0.0172633 0.1802005 0.4010615 -0.0276309 0.1766339 0.3974949 -0.0441188 0.1754932 0.3963542 -0.0664212 0.1754932 0.3963542 -0.0946366 0.1754932 0.3963542 -0.1303328 0.1754932 0.3963542 -0.1754932 0.1754932 0.3963542 -0.2326269 0.1754932 0.3963542 -0.3049085 0.1754932 0.3963542 -0.3963542 0.1754932 0.3963542 -0.5120448 0.1754932 0.3963542 -0.6584084 0.1754932 0.3963542 -0.8219901 0.1731034 0.3876179 -0.8967447 0.1658613 0.3447543 -0.9325696 0.1696351 0.3102037 -0.9531389 0.1870965 0.2946088 -0.9661878 0.2174663 0.2982089 -0.9749962 0.2591111 0.3188171 -0.9811943 0.3099976 0.3535032 -0.9856839 0.3678092 0.3990515 -0.9890048 0.4300448 0.4521565 -0.9914995 0.4941665 0.5095925 -0.9933953 0.5577822 0.5683949 -0.9948487 0.6188252 0.6260304 -0.9959706 0.6756878 0.6805199 -0.9968409 0.7272837 0.7304884 -0.9975189 0.7730352 0.7751395 -0.9980488 0.8128033 0.8141733 -0.9984638 0.8467864 0.8476717 -0.9987895 0.8754109 0.8759795 -0.9990455 0.8992336 0.8995968 -0.999247 0.9188636 0.9190947 -0.9994057 0.9349075 0.935054 -0.9995308 0.9479335 0.9480261 -0.9996295 0.9584526 0.9585109 -0.9997074 0.9669103 0.966947 -0.9997688 0.973687 0.9737101 -0.9998174 0.9791018 0.9791163 -0.9998557 0.9834186 0.9834277 -0.999886 0.9868541 0.9868597 -0.9999099 0.9895842 0.9895878 -0.9999288 0.9917515 0.9917537 -0.9999437 0.9934704 0.9934718 -0.0000238 0.2706977 0.4344249 -0.0000382 0.2701941 0.4339214 -0.0000611 0.2695619 0.4332891 -0.0000978 0.2687698 0.432497 -0.0001565 0.2677799 0.4315072 -0.0002504 0.2665473 0.4302746 -0.0004008 0.2650195 0.4287467 -0.0006416 0.2631369 0.4268641 -0.0010268 0.260836 0.4245633 -0.0016435 0.2580543 0.4217816 -0.0026305 0.254742 0.4184692 -0.0042103 0.2508825 0.4146097 -0.0067388 0.2465296 0.4102568 -0.0107859 0.2418708 0.405598 -0.0172633 0.2373343 0.4010615 -0.0276309 0.2337676 0.3974949 -0.0441188 0.2326269 0.3963542 -0.0664212 0.2326269 0.3963542 -0.0946366 0.2326269 0.3963542 -0.1303328 0.2326269 0.3963542 -0.1754932 0.2326269 0.3963542 -0.2326269 0.2326269 0.3963542 -0.3049085 0.2326269 0.3963542 -0.3963542 0.2326269 0.3963542 -0.5120448 0.2326269 0.3963542 -0.6584084 0.2326269 0.3963542 -0.8219901 0.2285954 0.3876179 -0.8967447 0.2121385 0.3447543 -0.9325696 0.2059983 0.3102037 -0.9531389 0.2149085 0.2946088 -0.9661878 0.2383533 0.2982089 -0.9749962 0.2745562 0.3188171 -0.9811943 0.3212519 0.3535032 -0.9856839 0.3758911 0.3990515 -0.9890048 0.4357648 0.4521565 -0.9914995 0.498157 0.5095925 -0.9933953 0.5605276 0.5683949 -0.9948487 0.6206891 0.6260304 -0.9959706 0.6769378 0.6805199 -0.9968409 0.7281127 0.7304884 -0.9975189 0.7735795 0.7751395 -0.9980488 0.8131577 0.8141733 -0.9984638 0.8470154 0.8476717 -0.9987895 0.875558 0.8759795 -0.9990455 0.8993275 0.8995968 -0.999247 0.9189234 0.9190947 -0.9994057 0.9349454 0.935054 -0.9995308 0.9479575 0.9480261 -0.9996295 0.9584677 0.9585109 -0.9997074 0.9669198 0.966947 -0.9997688 0.973693 0.9737101 -0.9998174 0.9791055 0.9791163 -0.9998557 0.9834209 0.9834277 -0.999886 0.9868555 0.9868597 -0.9999099 0.9895851 0.9895878 -0.9999288 0.9917521 0.9917537 -0.9999437 0.9934707 0.9934718 -0.0000238 0.3429792 0.4344249 -0.0000382 0.3424757 0.4339214 -0.0000611 0.3418435 0.4332891 -0.0000978 0.3410514 0.432497 -0.0001565 0.3400615 0.4315072 -0.0002504 0.3388289 0.4302746 -0.0004008 0.337301 0.4287467 -0.0006416 0.3354185 0.4268641 -0.0010268 0.3331176 0.4245633 -0.0016435 0.3303359 0.4217816 -0.0026305 0.3270236 0.4184692 -0.0042103 0.3231641 0.4146097 -0.0067388 0.3188112 0.4102568 -0.0107859 0.3141524 0.405598 -0.0172633 0.3096159 0.4010615 -0.0276309 0.3060492 0.3974949 -0.0441188 0.3049085 0.3963542 -0.0664212 0.3049085 0.3963542 -0.0946366 0.3049085 0.3963542 -0.1303328 0.3049085 0.3963542 -0.1754932 0.3049085 0.3963542 -0.2326269 0.3049085 0.3963542 -0.3049085 0.3049085 0.3963542 -0.3963542 0.3049085 0.3963542 -0.5120448 0.3049085 0.3963542 -0.6584084 0.3049085 0.3963542 -0.8219901 0.2988 0.3876179 -0.8967447 0.2706852 0.3447543 -0.9325696 0.2520025 0.3102037 -0.9531389 0.2500942 0.2946088 -0.9661878 0.2647781 0.2982089 -0.9749962 0.2940963 0.3188171 -0.9811943 0.3354901 0.3535032 -0.9856839 0.3861159 0.3990515 -0.9890048 0.4430013 0.4521565 -0.9914995 0.5032055 0.5095925 -0.9933953 0.5640008 0.5683949 -0.9948487 0.6230471 0.6260304 -0.9959706 0.6785192 0.6805199 -0.9968409 0.7291615 0.7304884 -0.9975189 0.7742682 0.7751395 -0.9980488 0.8136061 0.8141733 -0.9984638 0.8473052 0.8476717 -0.9987895 0.8757441 0.8759795 -0.9990455 0.8994464 0.8995968 -0.999247 0.918999 0.9190947 -0.9994057 0.9349933 0.935054 -0.9995308 0.9479878 0.9480261 -0.9996295 0.9584868 0.9585109 -0.9997074 0.9669318 0.966947 -0.9997688 0.9737006 0.9737101 -0.9998174 0.9791103 0.9791163 -0.9998557 0.9834239 0.9834277 -0.999886 0.9868574 0.9868597 -0.9999099 0.9895863 0.9895878 -0.9999288 0.9917528 0.9917537 -0.9999437 0.9934712 0.9934718 -0.0000238 0.4344249 0.4344249 -0.0000382 0.4339214 0.4339214 -0.0000611 0.4332891 0.4332891 -0.0000978 0.432497 0.432497 -0.0001565 0.4315072 0.4315072 -0.0002504 0.4302746 0.4302746 -0.0004008 0.4287467 0.4287467 -0.0006416 0.4268641 0.4268641 -0.0010268 0.4245633 0.4245633 -0.0016435 0.4217816 0.4217816 -0.0026305 0.4184692 0.4184692 -0.0042103 0.4146097 0.4146097 -0.0067388 0.4102568 0.4102568 -0.0107859 0.405598 0.405598 -0.0172633 0.4010615 0.4010615 -0.0276309 0.3974949 0.3974949 -0.0441188 0.3963542 0.3963542 -0.0664212 0.3963542 0.3963542 -0.0946366 0.3963542 0.3963542 -0.1303328 0.3963542 0.3963542 -0.1754932 0.3963542 0.3963542 -0.2326269 0.3963542 0.3963542 -0.3049085 0.3963542 0.3963542 -0.3963542 0.3963542 0.3963542 -0.5120448 0.3963542 0.3963542 -0.6584084 0.3963542 0.3963542 -0.8219901 0.3876179 0.3876179 -0.8967447 0.3447543 0.3447543 -0.9325696 0.3102037 0.3102037 -0.9531389 0.2946088 0.2946088 -0.9661878 0.2982089 0.2982089 -0.9749962 0.3188171 0.3188171 -0.9811943 0.3535032 0.3535032 -0.9856839 0.3990515 0.3990515 -0.9890048 0.4521565 0.4521565 -0.9914995 0.5095925 0.5095925 -0.9933953 0.5683949 0.5683949 -0.9948487 0.6260304 0.6260304 -0.9959706 0.6805199 0.6805199 -0.9968409 0.7304884 0.7304884 -0.9975189 0.7751395 0.7751395 -0.9980488 0.8141733 0.8141733 -0.9984638 0.8476717 0.8476717 -0.9987895 0.8759795 0.8759795 -0.9990455 0.8995968 0.8995968 -0.999247 0.9190947 0.9190947 -0.9994057 0.935054 0.935054 -0.9995308 0.9480261 0.9480261 -0.9996295 0.9585109 0.9585109 -0.9997074 0.966947 0.966947 -0.9997688 0.9737101 0.9737101 -0.9998174 0.9791163 0.9791163 -0.9998557 0.9834277 0.9834277 -0.999886 0.9868597 0.9868597 -0.9999099 0.9895878 0.9895878 -0.9999288 0.9917537 0.9917537 -0.9999437 0.9934718 0.9934718 -0.0000238 0.5501155 0.4344249 -0.0000382 0.549612 0.4339214 -0.0000611 0.5489798 0.4332891 -0.0000978 0.5481876 0.432497 -0.0001565 0.5471978 0.4315072 -0.0002504 0.5459652 0.4302746 -0.0004008 0.5444373 0.4287467 -0.0006416 0.5425548 0.4268641 -0.0010268 0.5402539 0.4245633 -0.0016435 0.5374722 0.4217816 -0.0026305 0.5341598 0.4184692 -0.0042103 0.5303003 0.4146097 -0.0067388 0.5259474 0.4102568 -0.0107859 0.5212886 0.405598 -0.0172633 0.5167521 0.4010615 -0.0276309 0.5131855 0.3974949 -0.0441188 0.5120448 0.3963542 -0.0664212 0.5120448 0.3963542 -0.0946366 0.5120448 0.3963542 -0.1303328 0.5120448 0.3963542 -0.1754932 0.5120448 0.3963542 -0.2326269 0.5120448 0.3963542 -0.3049085 0.5120448 0.3963542 -0.3963542 0.5120448 0.3963542 -0.5120448 0.5120448 0.3963542 -0.6584084 0.5120448 0.3963542 -0.8219901 0.4999841 0.3876179 -0.8967447 0.4384614 0.3447543 -0.9325696 0.3838358 0.3102037 -0.9531389 0.3509254 0.2946088 -0.9661878 0.3405032 0.2982089 -0.9749962 0.3500921 0.3188171 -0.9811943 0.3762922 0.3535032 -0.9856839 0.4154167 0.3990515 -0.9890048 0.4637389 0.4521565 -0.9914995 0.5176729 0.5095925 -0.9933953 0.573954 0.5683949 -0.9948487 0.6298046 0.6260304 -0.9959706 0.683051 0.6805199 -0.9968409 0.732167 0.7304884 -0.9975189 0.7762418 0.7751395 -0.9980488 0.8148909 0.8141733 -0.9984638 0.8481355 0.8476717 -0.9987895 0.8762773 0.8759795 -0.9990455 0.899787 0.8995968 -0.999247 0.9192157 0.9190947 -0.9994057 0.9351307 0.935054 -0.9995308 0.9480746 0.9480261 -0.9996295 0.9585415 0.9585109 -0.9997074 0.9669663 0.966947 -0.9997688 0.9737222 0.9737101 -0.9998174 0.9791238 0.9791163 -0.9998557 0.9834324 0.9834277 -0.999886 0.9868627 0.9868597 -0.9999099 0.9895897 0.9895878 -0.9999288 0.9917549 0.9917537 -0.9999437 0.9934725 0.9934718 -0.0000238 0.6964791 0.4344249 -0.0000382 0.6959756 0.4339214 -0.0000611 0.6953434 0.4332891 -0.0000978 0.6945513 0.432497 -0.0001565 0.6935614 0.4315072 -0.0002504 0.6923288 0.4302746 -0.0004008 0.6908009 0.4287467 -0.0006416 0.6889184 0.4268641 -0.0010268 0.6866175 0.4245633 -0.0016435 0.6838358 0.4217816 -0.0026305 0.6805235 0.4184692 -0.0042103 0.676664 0.4146097 -0.0067388 0.6723111 0.4102568 -0.0107859 0.6676523 0.405598 -0.0172633 0.6631157 0.4010615 -0.0276309 0.6595491 0.3974949 -0.0441188 0.6584084 0.3963542 -0.0664212 0.6584084 0.3963542 -0.0946366 0.6584084 0.3963542 -0.1303328 0.6584084 0.3963542 -0.1754932 0.6584084 0.3963542 -0.2326269 0.6584084 0.3963542 -0.3049085 0.6584084 0.3963542 -0.3963542 0.6584084 0.3963542 -0.5120448 0.6584084 0.3963542 -0.6584084 0.6584084 0.3963542 -0.8219901 0.6421419 0.3876179 -0.8967447 0.557013 0.3447543 -0.9325696 0.4769901 0.3102037 -0.9531389 0.4221733 0.2946088 -0.9661878 0.3940109 0.2982089 -0.9749962 0.389659 0.3188171 -0.9811943 0.4051232 0.3535032 -0.9856839 0.4361208 0.3990515 -0.9890048 0.4783922 0.4521565 -0.9914995 0.5278957 0.5095925 -0.9933953 0.580987 0.5683949 -0.9948487 0.6345795 0.6260304 -0.9959706 0.6862532 0.6805199 -0.9968409 0.7342907 0.7304884 -0.9975189 0.7776364 0.7751395 -0.9980488 0.8157988 0.8141733 -0.9984638 0.8487222 0.8476717 -0.9987895 0.8766541 0.8759795 -0.9990455 0.9000277 0.8995968 -0.999247 0.9193688 0.9190947 -0.9994057 0.9352277 0.935054 -0.9995308 0.9481359 0.9480261 -0.9996295 0.9585802 0.9585109 -0.9997074 0.9669906 0.966947 -0.9997688 0.9737375 0.9737101 -0.9998174 0.9791334 0.9791163 -0.9998557 0.9834385 0.9834277 -0.999886 0.9868665 0.9868597 -0.9999099 0.989592 0.9895878 -0.9999288 0.9917564 0.9917537 -0.9999437 0.9934734 0.9934718 -0.0051514 0.8407292 0.416864 -0.0051286 0.8405071 0.4164939 -0.0051047 0.8402274 0.4160287 -0.0050826 0.8398756 0.4154448 -0.0050676 0.8394338 0.4147137 -0.0050694 0.8388802 0.413801 -0.0051048 0.8381886 0.412666 -0.0052028 0.8373283 0.4112619 -0.0054121 0.8362644 0.4095375 -0.0058134 0.8349593 0.4074404 -0.0065402 0.8333779 0.4049254 -0.0078103 0.8314967 0.4019701 -0.0099781 0.8293233 0.3986045 -0.0136166 0.8269342 0.3949636 -0.0196467 0.8245426 0.391379 -0.0295373 0.8226154 0.3885332 -0.0455041 0.8219901 0.3876179 -0.0671656 0.8219901 0.3876179 -0.0945703 0.8219901 0.3876179 -0.1292408 0.8219901 0.3876179 -0.1731034 0.8219901 0.3876179 -0.2285954 0.8219901 0.3876179 -0.2988 0.8219901 0.3876179 -0.3876179 0.8219901 0.3876179 -0.4999841 0.8219901 0.3876179 -0.6421419 0.8219901 0.3876179 -0.8219901 0.8219901 0.3876179 -0.8967447 0.7069963 0.3447543 -0.9325696 0.5948423 0.3102037 -0.9531389 0.5123112 0.2946088 -0.9661878 0.4617052 0.2982089 -0.9749962 0.4397163 0.3188171 -0.9811943 0.4415982 0.3535032 -0.9856839 0.4623142 0.3990515 -0.9890048 0.4969305 0.4521565 -0.9914995 0.5408288 0.5095925 -0.9933953 0.5898847 0.5683949 -0.9948487 0.6406203 0.6260304 -0.9959706 0.6903044 0.6805199 -0.9968409 0.7369774 0.7304884 -0.9975189 0.7794007 0.7751395 -0.9980488 0.8169474 0.8141733 -0.9984638 0.8494644 0.8476717 -0.9987895 0.8771307 0.8759795 -0.9990455 0.9003323 0.8995968 -0.999247 0.9195625 0.9190947 -0.9994057 0.9353505 0.935054 -0.9995308 0.9482135 0.9480261 -0.9996295 0.9586291 0.9585109 -0.9997074 0.9670214 0.966947 -0.9997688 0.9737569 0.9737101 -0.9998174 0.9791456 0.9791163 -0.9998557 0.9834461 0.9834277 -0.999886 0.9868713 0.9868597 -0.9999099 0.989595 0.9895878 -0.9999288 0.9917582 0.9917537 -0.9999437 0.9934746 0.9934718 -0.0279321 0.9033413 0.368718 -0.0278872 0.9032596 0.3684105 -0.0278347 0.9031567 0.3680241 -0.0277752 0.9030276 0.3675394 -0.0277111 0.9028657 0.3669329 -0.0276479 0.9026634 0.3661762 -0.0275966 0.9024114 0.3652362 -0.0275778 0.9020992 0.3640749 -0.0276281 0.9017148 0.3626507 -0.0278105 0.9012461 0.3609218 -0.0282324 0.900682 0.358853 -0.0290732 0.9000167 0.3564286 -0.0306306 0.8992555 0.3536761 -0.0333932 0.8984278 0.3507087 -0.0381561 0.8976087 0.3477976 -0.0461985 0.8969554 0.3454939 -0.0594506 0.8967447 0.3447543 -0.0775151 0.8967447 0.3447543 -0.1003691 0.8967447 0.3447543 -0.1292823 0.8967447 0.3447543 -0.1658613 0.8967447 0.3447543 -0.2121385 0.8967447 0.3447543 -0.2706852 0.8967447 0.3447543 -0.3447543 0.8967447 0.3447543 -0.4384614 0.8967447 0.3447543 -0.557013 0.8967447 0.3447543 -0.7069963 0.8967447 0.3447543 -0.8967447 0.8967447 0.3447543 -0.9325696 0.7439407 0.3102037 -0.9531389 0.6263473 0.2946088 -0.9661878 0.5473473 0.2982089 -0.9749962 0.5030453 0.3188171 -0.9811943 0.4877437 0.3535032 -0.9856839 0.4954523 0.3990515 -0.9890048 0.5203839 0.4521565 -0.9914995 0.5571908 0.5095925 -0.9933953 0.6011414 0.5683949 -0.9948487 0.6482627 0.6260304 -0.9959706 0.6954296 0.6805199 -0.9968409 0.7403765 0.7304884 -0.9975189 0.7816327 0.7751395 -0.9980488 0.8184005 0.8141733 -0.9984638 0.8504035 0.8476717 -0.9987895 0.8777338 0.8759795 -0.9990455 0.9007175 0.8995968 -0.999247 0.9198076 0.9190947 -0.9994057 0.9355059 0.935054 -0.9995308 0.9483117 0.9480261 -0.9996295 0.958691 0.9585109 -0.9997074 0.9670604 0.966947 -0.9997688 0.9737814 0.9737101 -0.9998174 0.979161 0.9791163 -0.9998557 0.9834557 0.9834277 -0.999886 0.9868773 0.9868597 -0.9999099 0.9895988 0.9895878 -0.9999288 0.9917606 0.9917537 -0.9999437 0.9934761 0.9934718 -0.0624569 0.9354466 0.3309822 -0.0624063 0.9354101 0.3307142 -0.0623458 0.9353643 0.3303774 -0.0622749 0.9353068 0.3299551 -0.0621943 0.9352348 0.3294267 -0.0621069 0.9351449 0.3287678 -0.0620199 0.9350332 0.3279495 -0.0619473 0.9348949 0.326939 -0.061916 0.9347252 0.3257005 -0.0619734 0.9345187 0.3241981 -0.062202 0.9342712 0.3224019 -0.062742 0.9339805 0.3202989 -0.0638283 0.9336494 0.3179142 -0.0658501 0.9332914 0.3153463 -0.0694453 0.9329391 0.3128305 -0.0756464 0.9326595 0.3108418 -0.0860209 0.9325696 0.3102037 -0.1002154 0.9325696 0.3102037 -0.1181733 0.9325696 0.3102037 -0.1408925 0.9325696 0.3102037 -0.1696351 0.9325696 0.3102037 -0.2059983 0.9325696 0.3102037 -0.2520025 0.9325696 0.3102037 -0.3102037 0.9325696 0.3102037 -0.3838358 0.9325696 0.3102037 -0.4769901 0.9325696 0.3102037 -0.5948423 0.9325696 0.3102037 -0.7439407 0.9325696 0.3102037 -0.9325696 0.9325696 0.3102037 -0.9531389 0.7706179 0.2946088 -0.9661878 0.6556956 0.2982089 -0.9749962 0.5831647 0.3188171 -0.9811943 0.5461239 0.3535032 -0.9856839 0.5373763 0.3990515 -0.9890048 0.5500554 0.4521565 -0.9914995 0.577891 0.5095925 -0.9933953 0.6153825 0.5683949 -0.9948487 0.6579314 0.6260304 -0.9959706 0.7019138 0.6805199 -0.9968409 0.7446768 0.7304884 -0.9975189 0.7844566 0.7751395 -0.9980488 0.8202389 0.8141733 -0.9984638 0.8515915 0.8476717 -0.9987895 0.8784967 0.8759795 -0.9990455 0.9012049 0.8995968 -0.999247 0.9201176 0.9190947 -0.9994057 0.9357024 0.935054 -0.9995308 0.9484359 0.9480261 -0.9996295 0.9587693 0.9585109 -0.9997074 0.9671097 0.966947 -0.9997688 0.9738123 0.9737101 -0.9998174 0.9791804 0.9791163 -0.9998557 0.9834679 0.9834277 -0.999886 0.986885 0.9868597 -0.9999099 0.9896036 0.9895878 -0.9999288 0.9917636 0.9917537 -0.9999437 0.9934779 0.9934718 -0.1059991 0.9545467 0.3122478 -0.1059489 0.9545286 0.3120193 -0.1058883 0.9545059 0.3117322 -0.1058162 0.9544774 0.3113722 -0.1057322 0.9544418 0.3109219 -0.1056375 0.9543974 0.3103605 -0.1055364 0.9543421 0.3096636 -0.1054384 0.9542739 0.3088033 -0.1053624 0.9541902 0.3077494 -0.1053433 0.9540886 0.3064717 -0.1054431 0.9539671 0.3049452 -0.1057683 0.9538247 0.3031594 -0.1064997 0.953663 0.3011363 -0.1079385 0.9534887 0.2989601 -0.1105818 0.9533177 0.2968302 -0.1152388 0.9531823 0.2951481 -0.1231452 0.9531389 0.2946088 -0.1340017 0.9531389 0.2946088 -0.1477366 0.9531389 0.2946088 -0.1651131 0.9531389 0.2946088 -0.1870965 0.9531389 0.2946088 -0.2149085 0.9531389 0.2946088 -0.2500942 0.9531389 0.2946088 -0.2946088 0.9531389 0.2946088 -0.3509254 0.9531389 0.2946088 -0.4221733 0.9531389 0.2946088 -0.5123112 0.9531389 0.2946088 -0.6263473 0.9531389 0.2946088 -0.7706179 0.9531389 0.2946088 -0.9531389 0.9531389 0.2946088 -0.9661878 0.7927704 0.2982089 -0.9749962 0.6845262 0.3188171 -0.9811943 0.6199824 0.3535032 -0.9856839 0.5904156 0.3990515 -0.9890048 0.5875938 0.4521565 -0.9914995 0.6040793 0.5095925 -0.9933953 0.6333995 0.5683949 -0.9948487 0.6701635 0.6260304 -0.9959706 0.710117 0.6805199 -0.9968409 0.7501172 0.7304884 -0.9975189 0.7880291 0.7751395 -0.9980488 0.8225647 0.8141733 -0.9984638 0.8530945 0.8476717 -0.9987895 0.8794619 0.8759795 -0.9990455 0.9018215 0.8995968 -0.999247 0.9205098 0.9190947 -0.9994057 0.935951 0.935054 -0.9995308 0.9485931 0.9480261 -0.9996295 0.9588684 0.9585109 -0.9997074 0.967172 0.966947 -0.9997688 0.9738515 0.9737101 -0.9998174 0.979205 0.9791163 -0.9998557 0.9834833 0.9834277 -0.999886 0.9868946 0.9868597 -0.9999099 0.9896096 0.9895878 -0.9999288 0.9917674 0.9917537 -0.9999437 0.9934803 0.9934718 -0.1572498 0.9669269 0.3127719 -0.1572031 0.9669173 0.3125826 -0.1571463 0.9669053 0.3123447 -0.1570779 0.9668902 0.3120464 -0.1569971 0.9668714 0.3116735 -0.156904 0.9668479 0.3112085 -0.1568008 0.9668187 0.3106315 -0.1566936 0.9667827 0.3099195 -0.1565954 0.9667385 0.3090475 -0.1565315 0.966685 0.307991 -0.1565473 0.9666211 0.3067294 -0.1567226 0.9665463 0.3052547 -0.1571937 0.9664615 0.3035853 -0.15819 0.9663702 0.3017912 -0.160092 0.9662809 0.3000369 -0.1635226 0.9662104 0.2986526 -0.1694384 0.9661878 0.2982089 -0.1775917 0.9661878 0.2982089 -0.1879067 0.9661878 0.2982089 -0.2009566 0.9661878 0.2982089 -0.2174663 0.9661878 0.2982089 -0.2383533 0.9661878 0.2982089 -0.2647781 0.9661878 0.2982089 -0.2982089 0.9661878 0.2982089 -0.3405032 0.9661878 0.2982089 -0.3940109 0.9661878 0.2982089 -0.4617052 0.9661878 0.2982089 -0.5473473 0.9661878 0.2982089 -0.6556956 0.9661878 0.2982089 -0.7927704 0.9661878 0.2982089 -0.9661878 0.9661878 0.2982089 -0.9749962 0.8127617 0.3188171 -0.9811943 0.713423 0.3535032 -0.9856839 0.6575172 0.3990515 -0.9890048 0.6350848 0.4521565 -0.9914995 0.637211 0.5095925 -0.9933953 0.6561933 0.5683949 -0.9948487 0.6856388 0.6260304 -0.9959706 0.7204952 0.6805199 -0.9968409 0.757 0.7304884 -0.9975189 0.7925488 0.7751395 -0.9980488 0.8255071 0.8141733 -0.9984638 0.8549959 0.8476717 -0.9987895 0.880683 0.8759795 -0.9990455 0.9026016 0.8995968 -0.999247 0.9210061 0.9190947 -0.9994057 0.9362655 0.935054 -0.9995308 0.9487918 0.9480261 -0.9996295 0.9589938 0.9585109 -0.9997074 0.9672509 0.966947 -0.9997688 0.9739011 0.9737101 -0.9998174 0.9792361 0.9791163 -0.9998557 0.9835029 0.9834277 -0.999886 0.9869069 0.9868597 -0.9999099 0.9896173 0.9895878 -0.9999288 0.9917722 0.9917537 -0.9999437 0.9934833 0.9934718 -0.2151269 0.9754027 0.3305354 -0.2150852 0.9753975 0.3303825 -0.2150342 0.9753908 0.3301905 -0.2149725 0.9753825 0.3299499 -0.2148987 0.9753721 0.3296489 -0.2148124 0.9753591 0.3292738 -0.2147144 0.975343 0.3288084 -0.2146085 0.9753231 0.3282343 -0.2145034 0.9752987 0.3275315 -0.2144168 0.9752692 0.3266802 -0.2143816 0.975234 0.3256642 -0.2144566 0.9751928 0.3244773 -0.2147432 0.9751462 0.3231346 -0.2154135 0.9750962 0.3216928 -0.2167545 0.9750472 0.3202839 -0.2192389 0.9750086 0.319173 -0.2235962 0.9749962 0.3188171 -0.2296253 0.9749962 0.3188171 -0.2372529 0.9749962 0.3188171 -0.2469027 0.9749962 0.3188171 -0.2591111 0.9749962 0.3188171 -0.2745562 0.9749962 0.3188171 -0.2940963 0.9749962 0.3188171 -0.3188171 0.9749962 0.3188171 -0.3500921 0.9749962 0.3188171 -0.389659 0.9749962 0.3188171 -0.4397163 0.9749962 0.3188171 -0.5030453 0.9749962 0.3188171 -0.5831647 0.9749962 0.3188171 -0.6845262 0.9749962 0.3188171 -0.8127617 0.9749962 0.3188171 -0.9749962 0.9749962 0.3188171 -0.9811943 0.8316375 0.3535032 -0.9856839 0.7424095 0.3990515 -0.9890048 0.695167 0.4521565 -0.9914995 0.6791269 0.5095925 -0.9933953 0.6850303 0.5683949 -0.9948487 0.7052169 0.6260304 -0.9959706 0.733625 0.6805199 -0.9968409 0.7657077 0.7304884 -0.9975189 0.7982669 0.7751395 -0.9980488 0.8292297 0.8141733 -0.9984638 0.8574015 0.8476717 -0.9987895 0.8822279 0.8759795 -0.9990455 0.9035886 0.8995968 -0.999247 0.9216339 0.9190947 -0.9994057 0.9366635 0.935054 -0.9995308 0.9490434 0.9480261 -0.9996295 0.9591524 0.9585109 -0.9997074 0.9673508 0.966947 -0.9997688 0.9739638 0.9737101 -0.9998174 0.9792755 0.9791163 -0.9998557 0.9835276 0.9834277 -0.999886 0.9869223 0.9868597 -0.9999099 0.989627 0.9895878 -0.9999288 0.9917782 0.9917537 -0.9999437 0.9934871 0.9934718 -0.2783684 0.9814251 0.3627135 -0.2783325 0.9814221 0.3625931 -0.2782884 0.9814183 0.3624418 -0.2782347 0.9814136 0.3622521 -0.2781701 0.9814076 0.3620151 -0.2780936 0.9814002 0.3617196 -0.2780055 0.9813911 0.3613531 -0.2779077 0.9813797 0.3609011 -0.2778058 0.9813659 0.3603479 -0.2777122 0.9813491 0.3596781 -0.2776503 0.9813291 0.3588791 -0.2776626 0.9813057 0.357946 -0.2778236 0.9812792 0.3568911 -0.2782606 0.9812508 0.355759 -0.2791873 0.9812231 0.3546535 -0.2809573 0.9812013 0.3537823 -0.2841192 0.9811943 0.3535032 -0.2885124 0.9811943 0.3535032 -0.2940703 0.9811943 0.3535032 -0.3011018 0.9811943 0.3535032 -0.3099976 0.9811943 0.3535032 -0.3212519 0.9811943 0.3535032 -0.3354901 0.9811943 0.3535032 -0.3535032 0.9811943 0.3535032 -0.3762922 0.9811943 0.3535032 -0.4051232 0.9811943 0.3535032 -0.4415982 0.9811943 0.3535032 -0.4877437 0.9811943 0.3535032 -0.5461239 0.9811943 0.3535032 -0.6199824 0.9811943 0.3535032 -0.713423 0.9811943 0.3535032 -0.8316375 0.9811943 0.3535032 -0.9811943 0.9811943 0.3535032 -0.9856839 0.8498092 0.3990515 -0.9890048 0.7711789 0.4521565 -0.9914995 0.7321559 0.5095925 -0.9933953 0.721513 0.5683949 -0.9948487 0.7299859 0.6260304 -0.9959706 0.7502359 0.6805199 -0.9968409 0.776724 0.7304884 -0.9975189 0.8055009 0.7751395 -0.9980488 0.8339392 0.8141733 -0.9984638 0.8604449 0.8476717 -0.9987895 0.8841823 0.8759795 -0.9990455 0.9048372 0.8995968 -0.999247 0.9224281 0.9190947 -0.9994057 0.9371669 0.935054 -0.9995308 0.9493615 0.9480261 -0.9996295 0.959353 0.9585109 -0.9997074 0.967477 0.966947 -0.9997688 0.9740432 0.9737101 -0.9998174 0.9793253 0.9791163 -0.9998557 0.9835588 0.9834277 -0.999886 0.9869419 0.9868597 -0.9999099 0.9896392 0.9895878 -0.9999288 0.9917859 0.9917537 -0.9999437 0.9934919 0.9934718 -0.3454107 0.9858181 0.406132 -0.3453807 0.9858163 0.4060392 -0.3453439 0.9858141 0.4059227 -0.3452987 0.9858113 0.4057766 -0.3452442 0.9858079 0.405594 -0.3451791 0.9858036 0.4053665 -0.3451032 0.9857982 0.4050843 -0.3450175 0.9857916 0.4047363 -0.3449254 0.9857835 0.4043106 -0.3448353 0.9857738 0.4037952 -0.3447636 0.9857621 0.4031806 -0.3447407 0.9857485 0.4024632 -0.3448204 0.9857332 0.4016525 -0.3450957 0.9857167 0.4007829 -0.3457234 0.9857006 0.3999341 -0.3469645 0.9856879 0.3992655 -0.3492254 0.9856839 0.3990515 -0.3523802 0.9856839 0.3990515 -0.3563715 0.9856839 0.3990515 -0.3614209 0.9856839 0.3990515 -0.3678092 0.9856839 0.3990515 -0.3758911 0.9856839 0.3990515 -0.3861159 0.9856839 0.3990515 -0.3990515 0.9856839 0.3990515 -0.4154167 0.9856839 0.3990515 -0.4361208 0.9856839 0.3990515 -0.4623142 0.9856839 0.3990515 -0.4954523 0.9856839 0.3990515 -0.5373763 0.9856839 0.3990515 -0.5904156 0.9856839 0.3990515 -0.6575172 0.9856839 0.3990515 -0.7424095 0.9856839 0.3990515 -0.8498092 0.9856839 0.3990515 -0.9856839 0.9856839 0.3990515 -0.9890048 0.8673437 0.4521565 -0.9914995 0.7992446 0.5095925 -0.9933953 0.7676683 0.5683949 -0.9948487 0.7613218 0.6260304 -0.9959706 0.7712508 0.6805199 -0.9968409 0.7906611 0.7304884 -0.9975189 0.8146529 0.7751395 -0.9980488 0.8398974 0.8141733 -0.9984638 0.8642952 0.8476717 -0.9987895 0.886655 0.8759795 -0.9990455 0.9064168 0.8995968 -0.999247 0.9234329 0.9190947 -0.9994057 0.9378038 0.935054 -0.9995308 0.9497641 0.9480261 -0.9996295 0.9596068 0.9585109 -0.9997074 0.9676368 0.966947 -0.9997688 0.9741436 0.9737101 -0.9998174 0.9793883 0.9791163 -0.9998557 0.9835983 0.9834277 -0.999886 0.9869667 0.9868597 -0.9999099 0.9896547 0.9895878 -0.9999288 0.9917956 0.9917537 -0.9999437 0.993498 0.9934718 -0.4144197 0.9890841 0.4574848 -0.4143955 0.9890831 0.4574149 -0.4143657 0.9890818 0.457327 -0.414329 0.9890801 0.4572169 -0.4142845 0.9890781 0.4570793 -0.4142311 0.9890755 0.4569079 -0.4141683 0.9890723 0.4566952 -0.4140964 0.9890684 0.4564331 -0.4140176 0.9890637 0.4561124 -0.4139373 0.9890579 0.4557243 -0.4138668 0.989051 0.4552615 -0.4138277 0.989043 0.4547216 -0.4138582 0.9890339 0.4541117 -0.4140252 0.9890241 0.4534577 -0.4144423 0.9890146 0.4528197 -0.4152991 0.9890072 0.4523173 -0.4168922 0.9890048 0.4521565 -0.419125 0.9890048 0.4521565 -0.4219498 0.9890048 0.4521565 -0.4255236 0.9890048 0.4521565 -0.4300448 0.9890048 0.4521565 -0.4357648 0.9890048 0.4521565 -0.4430013 0.9890048 0.4521565 -0.4521565 0.9890048 0.4521565 -0.4637389 0.9890048 0.4521565 -0.4783922 0.9890048 0.4521565 -0.4969305 0.9890048 0.4521565 -0.5203839 0.9890048 0.4521565 -0.5500554 0.9890048 0.4521565 -0.5875938 0.9890048 0.4521565 -0.6350848 0.9890048 0.4521565 -0.695167 0.9890048 0.4521565 -0.7711789 0.9890048 0.4521565 -0.8673437 0.9890048 0.4521565 -0.9890048 0.9890048 0.4521565 -0.9914995 0.8841204 0.5095925 -0.9933953 0.8260608 0.5683949 -0.9948487 0.8009659 0.6260304 -0.9959706 0.7978374 0.6805199 -0.9968409 0.8082934 0.7304884 -0.9975189 0.8262314 0.7751395 -0.9980488 0.8474353 0.8141733 -0.9984638 0.8691663 0.8476717 -0.9987895 0.8897832 0.8759795 -0.9990455 0.9084153 0.8995968 -0.999247 0.9247041 0.9190947 -0.9994057 0.9386096 0.935054 -0.9995308 0.9502734 0.9480261 -0.9996295 0.959928 0.9585109 -0.9997074 0.9678389 0.966947 -0.9997688 0.9742706 0.9737101 -0.9998174 0.9794681 0.9791163 -0.9998557 0.9836483 0.9834277 -0.999886 0.986998 0.9868597 -0.9999099 0.9896744 0.9895878 -0.9999288 0.9918079 0.9917537 -0.9999437 0.9935057 0.9934718 -0.4834235 0.9915469 0.5135199 -0.4834045 0.9915463 0.5134682 -0.4833811 0.9915455 0.5134034 -0.4833522 0.9915446 0.5133222 -0.4833171 0.9915433 0.5132206 -0.4832747 0.9915418 0.5130941 -0.4832246 0.9915399 0.5129372 -0.4831666 0.9915376 0.5127438 -0.4831021 0.9915347 0.5125072 -0.4830346 0.9915312 0.512221 -0.4829718 0.9915271 0.5118798 -0.4829286 0.9915223 0.5114818 -0.4829319 0.9915169 0.5110324 -0.4830292 0.991511 0.5105506 -0.4833013 0.9915054 0.5100808 -0.4838841 0.9915009 0.5097109 -0.4849907 0.9914995 0.5095925 -0.4865484 0.9914995 0.5095925 -0.4885191 0.9914995 0.5095925 -0.4910123 0.9914995 0.5095925 -0.4941665 0.9914995 0.5095925 -0.498157 0.9914995 0.5095925 -0.5032055 0.9914995 0.5095925 -0.5095925 0.9914995 0.5095925 -0.5176729 0.9914995 0.5095925 -0.5278957 0.9914995 0.5095925 -0.5408288 0.9914995 0.5095925 -0.5571908 0.9914995 0.5095925 -0.577891 0.9914995 0.5095925 -0.6040793 0.9914995 0.5095925 -0.637211 0.9914995 0.5095925 -0.6791269 0.9914995 0.5095925 -0.7321559 0.9914995 0.5095925 -0.7992446 0.9914995 0.5095925 -0.8841204 0.9914995 0.5095925 -0.9914995 0.9914995 0.5095925 -0.9933953 0.8999349 0.5683949 -0.9948487 0.8511207 0.6260304 -0.9959706 0.8314729 0.6805199 -0.9968409 0.8306004 0.7304884 -0.9975189 0.8408797 0.7751395 -0.9980488 0.8569716 0.8141733 -0.9984638 0.875329 0.8476717 -0.9987895 0.8937407 0.8759795 -0.9990455 0.9109436 0.8995968 -0.999247 0.9263124 0.9190947 -0.9994057 0.939629 0.935054 -0.9995308 0.9509177 0.9480261 -0.9996295 0.9603343 0.9585109 -0.9997074 0.9680946 0.966947 -0.9997688 0.9744313 0.9737101 -0.9998174 0.9795689 0.9791163 -0.9998557 0.9837116 0.9834277 -0.999886 0.9870376 0.9868597 -0.9999099 0.9896992 0.9895878 -0.9999288 0.9918234 0.9917537 -0.9999437 0.9935154 0.9934718 -0.5504963 0.993424 0.571232 -0.5504818 0.9934236 0.5711946 -0.550464 0.9934231 0.5711477 -0.5504419 0.9934225 0.571089 -0.550415 0.9934218 0.5710156 -0.5503825 0.9934209 0.5709241 -0.5503438 0.9934197 0.5708106 -0.5502987 0.9934183 0.5706708 -0.550248 0.9934166 0.5704998 -0.5501939 0.9934145 0.570293 -0.5501416 0.993412 0.5700464 -0.5501012 0.9934091 0.5697589 -0.5500915 0.9934058 0.5694343 -0.5501456 0.9934023 0.5690864 -0.5503203 0.9933988 0.5687472 -0.5507113 0.9933961 0.5684803 -0.5514695 0.9933953 0.5683949 -0.5525411 0.9933953 0.5683949 -0.5538969 0.9933953 0.5683949 -0.5556122 0.9933953 0.5683949 -0.5577822 0.9933953 0.5683949 -0.5605276 0.9933953 0.5683949 -0.5640008 0.9933953 0.5683949 -0.5683949 0.9933953 0.5683949 -0.573954 0.9933953 0.5683949 -0.580987 0.9933953 0.5683949 -0.5898847 0.9933953 0.5683949 -0.6011414 0.9933953 0.5683949 -0.6153825 0.9933953 0.5683949 -0.6333995 0.9933953 0.5683949 -0.6561933 0.9933953 0.5683949 -0.6850303 0.9933953 0.5683949 -0.721513 0.9933953 0.5683949 -0.7676683 0.9933953 0.5683949 -0.8260608 0.9933953 0.5683949 -0.8999349 0.9933953 0.5683949 -0.9933953 0.9933953 0.5683949 -0.9948487 0.9145732 0.6260304 -0.9959706 0.8740262 0.6805199 -0.9968409 0.8588218 0.7304884 -0.9975189 0.8594117 0.7751395 -0.9980488 0.8690364 0.8141733 -0.9984638 0.8831255 0.8476717 -0.9987895 0.8987476 0.8759795 -0.9990455 0.9141422 0.8995968 -0.999247 0.928347 0.9190947 -0.9994057 0.9409186 0.935054 -0.9995308 0.9517328 0.9480261 -0.9996295 0.9608482 0.9585109 -0.9997074 0.9684181 0.966947 -0.9997688 0.9746346 0.9737101 -0.9998174 0.9796966 0.9791163 -0.9998557 0.9837916 0.9834277 -0.999886 0.9870878 0.9868597 -0.9999099 0.9897306 0.9895878 -0.9999288 0.9918431 0.9917537 -0.9999437 0.9935277 0.9934718 -0.6139459 0.9948662 0.6280409 -0.6139352 0.994866 0.6280144 -0.6139219 0.9948657 0.6279812 -0.6139056 0.9948653 0.6279395 -0.6138855 0.9948649 0.6278874 -0.6138613 0.9948643 0.6278225 -0.6138323 0.9948636 0.6277421 -0.6137984 0.9948628 0.6276429 -0.6137599 0.9948617 0.6275217 -0.6137183 0.9948604 0.627375 -0.6136769 0.9948589 0.6272003 -0.6136427 0.9948571 0.6269965 -0.6136284 0.9948551 0.6267665 -0.6136569 0.994853 0.6265201 -0.6137675 0.9948509 0.6262799 -0.6140266 0.9948493 0.6260909 -0.6145393 0.9948487 0.6260304 -0.6152669 0.9948487 0.6260304 -0.6161874 0.9948487 0.6260304 -0.6173519 0.9948487 0.6260304 -0.6188252 0.9948487 0.6260304 -0.6206891 0.9948487 0.6260304 -0.6230471 0.9948487 0.6260304 -0.6260304 0.9948487 0.6260304 -0.6298046 0.9948487 0.6260304 -0.6345795 0.9948487 0.6260304 -0.6406203 0.9948487 0.6260304 -0.6482627 0.9948487 0.6260304 -0.6579314 0.9948487 0.6260304 -0.6701635 0.9948487 0.6260304 -0.6856388 0.9948487 0.6260304 -0.7052169 0.9948487 0.6260304 -0.7299859 0.9948487 0.6260304 -0.7613218 0.9948487 0.6260304 -0.8009659 0.9948487 0.6260304 -0.8511207 0.9948487 0.6260304 -0.9145732 0.9948487 0.6260304 -0.9948487 0.9948487 0.6260304 -0.9959706 0.9278617 0.6805199 -0.9968409 0.8945255 0.7304884 -0.9975189 0.8828571 0.7751395 -0.9980488 0.8842998 0.8141733 -0.9984638 0.892989 0.8476717 -0.9987895 0.9050819 0.8759795 -0.9990455 0.9181889 0.8995968 -0.999247 0.9309211 0.9190947 -0.9994057 0.9425502 0.935054 -0.9995308 0.952764 0.9480261 -0.9996295 0.9614985 0.9585109 -0.9997074 0.9688274 0.966947 -0.9997688 0.9748918 0.9737101 -0.9998174 0.979858 0.9791163 -0.9998557 0.9838928 0.9834277 -0.999886 0.9871512 0.9868597 -0.9999099 0.9897703 0.9895878 -0.9999288 0.991868 0.9917537 -0.9999437 0.9935432 0.9934718 -0.6724572 0.9959813 0.6819193 -0.6724495 0.9959811 0.6819008 -0.6724399 0.9959809 0.6818777 -0.672428 0.9959807 0.6818486 -0.6724135 0.9959804 0.6818124 -0.6723959 0.9959801 0.6817672 -0.6723748 0.9959797 0.6817112 -0.67235 0.9959791 0.6816421 -0.6723217 0.9959785 0.6815577 -0.6722907 0.9959777 0.6814556 -0.6722594 0.9959768 0.6813339 -0.6722322 0.9959757 0.6811921 -0.672218 0.9959745 0.681032 -0.672232 0.9959732 0.6808605 -0.6723012 0.9959719 0.6806934 -0.6724711 0.9959709 0.680562 -0.6728136 0.9959706 0.6805199 -0.6733015 0.9959706 0.6805199 -0.6739188 0.9959706 0.6805199 -0.6746998 0.9959706 0.6805199 -0.6756878 0.9959706 0.6805199 -0.6769378 0.9959706 0.6805199 -0.6785192 0.9959706 0.6805199 -0.6805199 0.9959706 0.6805199 -0.683051 0.9959706 0.6805199 -0.6862532 0.9959706 0.6805199 -0.6903044 0.9959706 0.6805199 -0.6954296 0.9959706 0.6805199 -0.7019138 0.9959706 0.6805199 -0.710117 0.9959706 0.6805199 -0.7204952 0.9959706 0.6805199 -0.733625 0.9959706 0.6805199 -0.7502359 0.9959706 0.6805199 -0.7712508 0.9959706 0.6805199 -0.7978374 0.9959706 0.6805199 -0.8314729 0.9959706 0.6805199 -0.8740262 0.9959706 0.6805199 -0.9278617 0.9959706 0.6805199 -0.9959706 0.9959706 0.6805199 -0.9968409 0.9396953 0.7304884 -0.9975189 0.9125186 0.7751395 -0.9980488 0.9036101 0.8141733 -0.9984638 0.9054678 0.8476717 -0.9987895 0.9130957 0.8759795 -0.9990455 0.9233085 0.8995968 -0.999247 0.9341777 0.9190947 -0.9994057 0.9446144 0.935054 -0.9995308 0.9540687 0.9480261 -0.9996295 0.9623212 0.9585109 -0.9997074 0.9693452 0.966947 -0.9997688 0.9752172 0.9737101 -0.9998174 0.9800622 0.9791163 -0.9998557 0.9840209 0.9834277 -0.999886 0.9872315 0.9868597 -0.9999099 0.9898206 0.9895878 -0.9999288 0.9918994 0.9917537 -0.9999437 0.9935629 0.9934718 -0.7251659 0.9968475 0.7314464 -0.7251605 0.9968474 0.7314338 -0.7251537 0.9968473 0.7314179 -0.7251454 0.9968472 0.731398 -0.7251351 0.996847 0.7313732 -0.7251226 0.9968468 0.7313422 -0.7251076 0.9968465 0.7313039 -0.7250899 0.9968462 0.7312566 -0.7250697 0.9968458 0.7311988 -0.7250473 0.9968453 0.7311288 -0.7250244 0.9968448 0.7310455 -0.7250039 0.9968441 0.7309484 -0.7249916 0.9968433 0.7308388 -0.7249978 0.9968425 0.7307215 -0.7250408 0.9968418 0.7306071 -0.7251511 0.9968411 0.7305171 -0.7253775 0.9968409 0.7304884 -0.7257011 0.9968409 0.7304884 -0.7261105 0.9968409 0.7304884 -0.7266285 0.9968409 0.7304884 -0.7272837 0.9968409 0.7304884 -0.7281127 0.9968409 0.7304884 -0.7291615 0.9968409 0.7304884 -0.7304884 0.9968409 0.7304884 -0.732167 0.9968409 0.7304884 -0.7342907 0.9968409 0.7304884 -0.7369774 0.9968409 0.7304884 -0.7403765 0.9968409 0.7304884 -0.7446768 0.9968409 0.7304884 -0.7501172 0.9968409 0.7304884 -0.757 0.9968409 0.7304884 -0.7657077 0.9968409 0.7304884 -0.776724 0.9968409 0.7304884 -0.7906611 0.9968409 0.7304884 -0.8082934 0.9968409 0.7304884 -0.8306004 0.9968409 0.7304884 -0.8588218 0.9968409 0.7304884 -0.8945255 0.9968409 0.7304884 -0.9396953 0.9968409 0.7304884 -0.9968409 0.9968409 0.7304884 -0.9975189 0.9500442 0.7751395 -0.9980488 0.9280401 0.8141733 -0.9984638 0.921255 0.8476717 -0.9987895 0.9232341 0.8759795 -0.9990455 0.9297854 0.8995968 -0.999247 0.9382977 0.9190947 -0.9994057 0.9472259 0.935054 -0.9995308 0.9557192 0.9480261 -0.9996295 0.963362 0.9585109 -0.9997074 0.9700002 0.966947 -0.9997688 0.9756289 0.9737101 -0.9998174 0.9803206 0.9791163 -0.9998557 0.9841829 0.9834277 -0.999886 0.987333 0.9868597 -0.9999099 0.9898842 0.9895878 -0.9999288 0.9919392 0.9917537 -0.9999437 0.9935878 0.9934718 -0.7716588 0.997523 0.7757859 -0.7716551 0.997523 0.7757773 -0.7716504 0.9975229 0.7757666 -0.7716446 0.9975228 0.7757532 -0.7716375 0.9975227 0.7757364 -0.7716288 0.9975226 0.7757155 -0.7716184 0.9975224 0.7756896 -0.7716061 0.9975222 0.7756577 -0.7715919 0.997522 0.7756187 -0.7715762 0.9975217 0.7755715 -0.7715599 0.9975213 0.7755153 -0.7715449 0.9975209 0.7754498 -0.7715352 0.9975204 0.7753759 -0.7715376 0.9975199 0.7752967 -0.7715641 0.9975194 0.7752196 -0.7716352 0.9975191 0.7751589 -0.7717834 0.9975189 0.7751395 -0.7719959 0.9975189 0.7751395 -0.7722648 0.9975189 0.7751395 -0.7726049 0.9975189 0.7751395 -0.7730352 0.9975189 0.7751395 -0.7735795 0.9975189 0.7751395 -0.7742682 0.9975189 0.7751395 -0.7751395 0.9975189 0.7751395 -0.7762418 0.9975189 0.7751395 -0.7776364 0.9975189 0.7751395 -0.7794007 0.9975189 0.7751395 -0.7816327 0.9975189 0.7751395 -0.7844566 0.9975189 0.7751395 -0.7880291 0.9975189 0.7751395 -0.7925488 0.9975189 0.7751395 -0.7982669 0.9975189 0.7751395 -0.8055009 0.9975189 0.7751395 -0.8146529 0.9975189 0.7751395 -0.8262314 0.9975189 0.7751395 -0.8408797 0.9975189 0.7751395 -0.8594117 0.9975189 0.7751395 -0.8828571 0.9975189 0.7751395 -0.9125186 0.9975189 0.7751395 -0.9500442 0.9975189 0.7751395 -0.9975189 0.9975189 0.7751395 -0.9980488 0.9589472 0.8141733 -0.9984638 0.9412278 0.8476717 -0.9987895 0.9360606 0.8759795 -0.9990455 0.9379796 0.8995968 -0.999247 0.94351 0.9190947 -0.9994057 0.9505298 0.935054 -0.9995308 0.9578074 0.9480261 -0.9996295 0.9646787 0.9585109 -0.9997074 0.970829 0.966947 -0.9997688 0.9761497 0.9737101 -0.9998174 0.9806476 0.9791163 -0.9998557 0.984388 0.9834277 -0.999886 0.9874615 0.9868597 -0.9999099 0.9899646 0.9895878 -0.9999288 0.9919896 0.9917537 -0.9999437 0.9936193 0.9934718 -0.8119154 0.9980513 0.8146037 -0.8119128 0.9980512 0.814598 -0.8119096 0.9980512 0.8145909 -0.8119057 0.9980511 0.8145819 -0.8119009 0.9980511 0.8145707 -0.8118949 0.998051 0.8145568 -0.8118878 0.9980509 0.8145396 -0.8118794 0.9980508 0.8145183 -0.8118697 0.9980506 0.8144923 -0.8118589 0.9980504 0.8144609 -0.8118476 0.9980502 0.8144235 -0.811837 0.99805 0.8143799 -0.8118298 0.9980497 0.8143306 -0.8118303 0.9980494 0.8142779 -0.8118466 0.9980491 0.8142266 -0.8118921 0.9980488 0.8141862 -0.8119884 0.9980488 0.8141733 -0.8121268 0.9980488 0.8141733 -0.8123018 0.9980488 0.8141733 -0.8125232 0.9980488 0.8141733 -0.8128033 0.9980488 0.8141733 -0.8131577 0.9980488 0.8141733 -0.8136061 0.9980488 0.8141733 -0.8141733 0.9980488 0.8141733 -0.8148909 0.9980488 0.8141733 -0.8157988 0.9980488 0.8141733 -0.8169474 0.9980488 0.8141733 -0.8184005 0.9980488 0.8141733 -0.8202389 0.9980488 0.8141733 -0.8225647 0.9980488 0.8141733 -0.8255071 0.9980488 0.8141733 -0.8292297 0.9980488 0.8141733 -0.8339392 0.9980488 0.8141733 -0.8398974 0.9980488 0.8141733 -0.8474353 0.9980488 0.8141733 -0.8569716 0.9980488 0.8141733 -0.8690364 0.9980488 0.8141733 -0.8842998 0.9980488 0.8141733 -0.9036101 0.9980488 0.8141733 -0.9280401 0.9980488 0.8141733 -0.9589472 0.9980488 0.8141733 -0.9980488 0.9980488 0.8141733 -0.9984638 0.9664961 0.8476717 -0.9987895 0.9522877 0.8759795 -0.9990455 0.9483463 0.8995968 -0.999247 0.9501042 0.9190947 -0.9994057 0.9547096 0.935054 -0.9995308 0.9604492 0.9480261 -0.9996295 0.9663445 0.9585109 -0.9997074 0.9718774 0.966947 -0.9997688 0.9768086 0.9737101 -0.9998174 0.9810611 0.9791163 -0.9998557 0.9846473 0.9834277 -0.999886 0.987624 0.9868597 -0.9999099 0.9900664 0.9895878 -0.9999288 0.9920533 0.9917537 -0.9999437 0.9936592 0.9934718 -0.8462171 0.9984653 0.8479551 -0.8462154 0.9984653 0.8479514 -0.8462132 0.9984653 0.8479467 -0.8462106 0.9984653 0.8479408 -0.8462073 0.9984652 0.8479334 -0.8462034 0.9984652 0.8479242 -0.8461986 0.9984651 0.8479129 -0.8461929 0.998465 0.8478989 -0.8461864 0.9984649 0.8478818 -0.8461791 0.9984648 0.8478611 -0.8461714 0.9984647 0.8478364 -0.8461641 0.9984645 0.8478077 -0.8461589 0.9984643 0.8477753 -0.8461587 0.9984642 0.8477406 -0.8461687 0.998464 0.8477068 -0.8461977 0.9984638 0.8476802 -0.8462598 0.9984638 0.8476717 -0.8463492 0.9984638 0.8476717 -0.8464623 0.9984638 0.8476717 -0.8466054 0.9984638 0.8476717 -0.8467864 0.9984638 0.8476717 -0.8470154 0.9984638 0.8476717 -0.8473052 0.9984638 0.8476717 -0.8476717 0.9984638 0.8476717 -0.8481355 0.9984638 0.8476717 -0.8487222 0.9984638 0.8476717 -0.8494644 0.9984638 0.8476717 -0.8504035 0.9984638 0.8476717 -0.8515915 0.9984638 0.8476717 -0.8530945 0.9984638 0.8476717 -0.8549959 0.9984638 0.8476717 -0.8574015 0.9984638 0.8476717 -0.8604449 0.9984638 0.8476717 -0.8642952 0.9984638 0.8476717 -0.8691663 0.9984638 0.8476717 -0.875329 0.9984638 0.8476717 -0.8831255 0.9984638 0.8476717 -0.892989 0.9984638 0.8476717 -0.9054678 0.9984638 0.8476717 -0.921255 0.9984638 0.8476717 -0.9412278 0.9984638 0.8476717 -0.9664961 0.9984638 0.8476717 -0.9984638 0.9984638 0.8476717 -0.9987895 0.9728171 0.8759795 -0.9990455 0.9614615 0.8995968 -0.999247 0.9584468 0.9190947 -0.9994057 0.9599976 0.935054 -0.9995308 0.9637914 0.9480261 -0.9996295 0.968452 0.9585109 -0.9997074 0.9732039 0.966947 -0.9997688 0.9776422 0.9737101 -0.9998174 0.9815844 0.9791163 -0.9998557 0.9849754 0.9834277 -0.999886 0.9878296 0.9868597 -0.9999099 0.9901951 0.9895878 -0.9999288 0.9921339 0.9917537 -0.9999437 0.9937096 0.9934718 -0.8750477 0.9987905 0.8761643 -0.8750466 0.9987905 0.8761618 -0.8750451 0.9987904 0.8761587 -0.8750434 0.9987904 0.8761549 -0.8750412 0.9987904 0.8761501 -0.8750386 0.9987904 0.8761441 -0.8750355 0.9987903 0.8761367 -0.8750317 0.9987903 0.8761276 -0.8750274 0.9987902 0.8761164 -0.8750225 0.9987902 0.8761029 -0.8750173 0.9987901 0.8760869 -0.8750124 0.99879 0.8760681 -0.8750088 0.9987899 0.876047 -0.8750084 0.9987897 0.8760244 -0.8750145 0.9987896 0.8760023 -0.8750329 0.9987895 0.875985 -0.8750727 0.9987895 0.8759795 -0.8751301 0.9987895 0.8759795 -0.8752028 0.9987895 0.8759795 -0.8752947 0.9987895 0.8759795 -0.8754109 0.9987895 0.8759795 -0.875558 0.9987895 0.8759795 -0.8757441 0.9987895 0.8759795 -0.8759795 0.9987895 0.8759795 -0.8762773 0.9987895 0.8759795 -0.8766541 0.9987895 0.8759795 -0.8771307 0.9987895 0.8759795 -0.8777338 0.9987895 0.8759795 -0.8784967 0.9987895 0.8759795 -0.8794619 0.9987895 0.8759795 -0.880683 0.9987895 0.8759795 -0.8822279 0.9987895 0.8759795 -0.8841823 0.9987895 0.8759795 -0.886655 0.9987895 0.8759795 -0.8897832 0.9987895 0.8759795 -0.8937407 0.9987895 0.8759795 -0.8987476 0.9987895 0.8759795 -0.9050819 0.9987895 0.8759795 -0.9130957 0.9987895 0.8759795 -0.9232341 0.9987895 0.8759795 -0.9360606 0.9987895 0.8759795 -0.9522877 0.9987895 0.8759795 -0.9728171 0.9987895 0.8759795 -0.9987895 0.9987895 0.8759795 -0.9990455 0.9780539 0.8995968 -0.999247 0.9690013 0.9190947 -0.9994057 0.9666876 0.935054 -0.9995308 0.9680197 0.9480261 -0.9996295 0.9711183 0.9585109 -0.9997074 0.974882 0.966947 -0.9997688 0.9786968 0.9737101 -0.9998174 0.9822464 0.9791163 -0.9998557 0.9853905 0.9834277 -0.999886 0.9880897 0.9868597 -0.9999099 0.990358 0.9895878 -0.9999288 0.9922358 0.9917537 -0.9999437 0.9937734 0.9934718 -0.8990028 0.9990461 0.8997163 -0.899002 0.9990461 0.8997147 -0.8990011 0.9990461 0.8997128 -0.899 0.9990461 0.8997103 -0.8989986 0.9990461 0.8997072 -0.8989969 0.9990461 0.8997033 -0.8989948 0.9990461 0.8996985 -0.8989923 0.999046 0.8996926 -0.8989895 0.999046 0.8996854 -0.8989863 0.9990459 0.8996766 -0.8989829 0.9990459 0.8996662 -0.8989796 0.9990458 0.8996541 -0.8989771 0.9990458 0.8996405 -0.8989767 0.9990457 0.8996258 -0.8989805 0.9990456 0.8996116 -0.8989921 0.9990456 0.8996004 -0.8990175 0.9990455 0.8995968 -0.8990542 0.9990455 0.8995968 -0.8991006 0.9990455 0.8995968 -0.8991593 0.9990455 0.8995968 -0.8992336 0.9990455 0.8995968 -0.8993275 0.9990455 0.8995968 -0.8994464 0.9990455 0.8995968 -0.8995968 0.9990455 0.8995968 -0.899787 0.9990455 0.8995968 -0.9000277 0.9990455 0.8995968 -0.9003323 0.9990455 0.8995968 -0.9007175 0.9990455 0.8995968 -0.9012049 0.9990455 0.8995968 -0.9018215 0.9990455 0.8995968 -0.9026016 0.9990455 0.8995968 -0.9035886 0.9990455 0.8995968 -0.9048372 0.9990455 0.8995968 -0.9064168 0.9990455 0.8995968 -0.9084153 0.9990455 0.8995968 -0.9109436 0.9990455 0.8995968 -0.9141422 0.9990455 0.8995968 -0.9181889 0.9990455 0.8995968 -0.9233085 0.9990455 0.8995968 -0.9297854 0.9990455 0.8995968 -0.9379796 0.9990455 0.8995968 -0.9483463 0.9990455 0.8995968 -0.9614615 0.9990455 0.8995968 -0.9780539 0.9990455 0.8995968 -0.9990455 0.9990455 0.8995968 -0.999247 0.982354 0.9190947 -0.9994057 0.9751513 0.935054 -0.9995308 0.9733691 0.9480261 -0.9996295 0.9744915 0.9585109 -0.9997074 0.977005 0.966947 -0.9997688 0.980031 0.9737101 -0.9998174 0.9830838 0.9791163 -0.9998557 0.9859157 0.9834277 -0.999886 0.9884188 0.9868597 -0.9999099 0.9905641 0.9895878 -0.9999288 0.9923648 0.9917537 -0.9999437 0.9938541 0.9934718 -0.9187175 0.9992474 0.9191715 -0.918717 0.9992474 0.9191705 -0.9187164 0.9992474 0.9191692 -0.9187157 0.9992474 0.9191676 -0.9187148 0.9992474 0.9191656 -0.9187137 0.9992474 0.9191631 -0.9187123 0.9992473 0.91916 -0.9187107 0.9992473 0.9191562 -0.9187089 0.9992473 0.9191516 -0.9187068 0.9992473 0.919146 -0.9187045 0.9992472 0.9191393 -0.9187024 0.9992472 0.9191315 -0.9187008 0.9992472 0.9191227 -0.9187004 0.9992471 0.9191133 -0.9187027 0.9992471 0.9191042 -0.9187101 0.999247 0.919097 -0.9187262 0.999247 0.9190947 -0.9187495 0.999247 0.9190947 -0.9187791 0.999247 0.9190947 -0.9188164 0.999247 0.9190947 -0.9188636 0.999247 0.9190947 -0.9189234 0.999247 0.9190947 -0.918999 0.999247 0.9190947 -0.9190947 0.999247 0.9190947 -0.9192157 0.999247 0.9190947 -0.9193688 0.999247 0.9190947 -0.9195625 0.999247 0.9190947 -0.9198076 0.999247 0.9190947 -0.9201176 0.999247 0.9190947 -0.9205098 0.999247 0.9190947 -0.9210061 0.999247 0.9190947 -0.9216339 0.999247 0.9190947 -0.9224281 0.999247 0.9190947 -0.9234329 0.999247 0.9190947 -0.9247041 0.999247 0.9190947 -0.9263124 0.999247 0.9190947 -0.928347 0.999247 0.9190947 -0.9309211 0.999247 0.9190947 -0.9341777 0.999247 0.9190947 -0.9382977 0.999247 0.9190947 -0.94351 0.999247 0.9190947 -0.9501042 0.999247 0.9190947 -0.9584468 0.999247 0.9190947 -0.9690013 0.999247 0.9190947 -0.982354 0.999247 0.9190947 -0.999247 0.999247 0.9190947 -0.9994057 0.9858591 0.935054 -0.9995308 0.9801368 0.9480261 -0.9996295 0.978759 0.9585109 -0.9997074 0.9796909 0.966947 -0.9997688 0.981719 0.9737101 -0.9998174 0.9841433 0.9791163 -0.9998557 0.9865801 0.9834277 -0.999886 0.9888351 0.9868597 -0.9999099 0.9908248 0.9895878 -0.9999288 0.992528 0.9917537 -0.9999437 0.9939562 0.9934718 -0.9348153 0.999406 0.9351031 -0.9348149 0.999406 0.9351024 -0.9348146 0.999406 0.9351016 -0.9348141 0.999406 0.9351006 -0.9348135 0.999406 0.9350993 -0.9348128 0.9994059 0.9350977 -0.9348119 0.9994059 0.9350958 -0.9348109 0.9994059 0.9350933 -0.9348097 0.9994059 0.9350904 -0.9348083 0.9994059 0.9350868 -0.9348069 0.9994059 0.9350825 -0.9348055 0.9994059 0.9350775 -0.9348044 0.9994058 0.9350719 -0.9348042 0.9994058 0.9350659 -0.9348056 0.9994058 0.9350601 -0.9348102 0.9994057 0.9350555 -0.9348204 0.9994057 0.935054 -0.9348352 0.9994057 0.935054 -0.9348539 0.9994057 0.935054 -0.9348776 0.9994057 0.935054 -0.9349075 0.9994057 0.935054 -0.9349454 0.9994057 0.935054 -0.9349933 0.9994057 0.935054 -0.935054 0.9994057 0.935054 -0.9351307 0.9994057 0.935054 -0.9352277 0.9994057 0.935054 -0.9353505 0.9994057 0.935054 -0.9355059 0.9994057 0.935054 -0.9357024 0.9994057 0.935054 -0.935951 0.9994057 0.935054 -0.9362655 0.9994057 0.935054 -0.9366635 0.9994057 0.935054 -0.9371669 0.9994057 0.935054 -0.9378038 0.9994057 0.935054 -0.9386096 0.9994057 0.935054 -0.939629 0.9994057 0.935054 -0.9409186 0.9994057 0.935054 -0.9425502 0.9994057 0.935054 -0.9446144 0.9994057 0.935054 -0.9472259 0.9994057 0.935054 -0.9505298 0.9994057 0.935054 -0.9547096 0.9994057 0.935054 -0.9599976 0.9994057 0.935054 -0.9666876 0.9994057 0.935054 -0.9751513 0.9994057 0.935054 -0.9858591 0.9994057 0.935054 -0.9994057 0.9994057 0.935054 -0.9995308 0.9886988 0.9480261 -0.9996295 0.9841579 0.9585109 -0.9997074 0.983089 0.966947 -0.9997688 0.9838545 0.9737101 -0.9998174 0.9854838 0.9791163 -0.9998557 0.9874207 0.9834277 -0.999886 0.9893618 0.9868597 -0.9999099 0.9911547 0.9895878 -0.9999288 0.9927345 0.9917537 -0.9999437 0.9940854 0.9934718 -0.9478754 0.999531 0.9480573 -0.9478752 0.999531 0.9480569 -0.947875 0.999531 0.9480564 -0.9478746 0.999531 0.9480558 -0.9478743 0.999531 0.9480549 -0.9478738 0.999531 0.9480539 -0.9478733 0.999531 0.9480527 -0.9478726 0.999531 0.9480511 -0.9478718 0.999531 0.9480493 -0.947871 0.9995309 0.948047 -0.94787 0.9995309 0.9480443 -0.9478691 0.9995309 0.9480411 -0.9478684 0.9995309 0.9480375 -0.9478683 0.9995309 0.9480337 -0.9478691 0.9995309 0.94803 -0.947872 0.9995309 0.948027 -0.9478785 0.9995308 0.9480261 -0.9478878 0.9995308 0.9480261 -0.9478997 0.9995308 0.9480261 -0.9479146 0.9995308 0.9480261 -0.9479335 0.9995308 0.9480261 -0.9479575 0.9995308 0.9480261 -0.9479878 0.9995308 0.9480261 -0.9480261 0.9995308 0.9480261 -0.9480746 0.9995308 0.9480261 -0.9481359 0.9995308 0.9480261 -0.9482135 0.9995308 0.9480261 -0.9483117 0.9995308 0.9480261 -0.9484359 0.9995308 0.9480261 -0.9485931 0.9995308 0.9480261 -0.9487918 0.9995308 0.9480261 -0.9490434 0.9995308 0.9480261 -0.9493615 0.9995308 0.9480261 -0.9497641 0.9995308 0.9480261 -0.9502734 0.9995308 0.9480261 -0.9509177 0.9995308 0.9480261 -0.9517328 0.9995308 0.9480261 -0.952764 0.9995308 0.9480261 -0.9540687 0.9995308 0.9480261 -0.9557192 0.9995308 0.9480261 -0.9578074 0.9995308 0.9480261 -0.9604492 0.9995308 0.9480261 -0.9637914 0.9995308 0.9480261 -0.9680197 0.9995308 0.9480261 -0.9733691 0.9995308 0.9480261 -0.9801368 0.9995308 0.9480261 -0.9886988 0.9995308 0.9480261 -0.9995308 0.9995308 0.9480261 -0.9996295 0.9909882 0.9585109 -0.9997074 0.9873879 0.966947 -0.9997688 0.9865561 0.9737101 -0.9998174 0.9871796 0.9791163 -0.9998557 0.9884841 0.9834277 -0.999886 0.9900282 0.9868597 -0.9999099 0.991572 0.9895878 -0.9999288 0.9929957 0.9917537 -0.9999437 0.9942488 0.9934718 -0.958416 0.9996296 0.9585307 -0.9584159 0.9996296 0.9585305 -0.9584157 0.9996296 0.9585301 -0.9584155 0.9996296 0.9585297 -0.9584153 0.9996296 0.9585292 -0.958415 0.9996296 0.9585286 -0.9584146 0.9996296 0.9585278 -0.9584142 0.9996296 0.9585268 -0.9584137 0.9996296 0.9585256 -0.9584132 0.9996296 0.9585242 -0.9584126 0.9996296 0.9585224 -0.958412 0.9996296 0.9585204 -0.9584115 0.9996296 0.9585182 -0.9584114 0.9996295 0.9585157 -0.958412 0.9996295 0.9585134 -0.9584138 0.9996295 0.9585115 -0.9584178 0.9996295 0.9585109 -0.9584237 0.9996295 0.9585109 -0.9584312 0.9996295 0.9585109 -0.9584406 0.9996295 0.9585109 -0.9584526 0.9996295 0.9585109 -0.9584677 0.9996295 0.9585109 -0.9584868 0.9996295 0.9585109 -0.9585109 0.9996295 0.9585109 -0.9585415 0.9996295 0.9585109 -0.9585802 0.9996295 0.9585109 -0.9586291 0.9996295 0.9585109 -0.958691 0.9996295 0.9585109 -0.9587693 0.9996295 0.9585109 -0.9588684 0.9996295 0.9585109 -0.9589938 0.9996295 0.9585109 -0.9591524 0.9996295 0.9585109 -0.959353 0.9996295 0.9585109 -0.9596068 0.9996295 0.9585109 -0.959928 0.9996295 0.9585109 -0.9603343 0.9996295 0.9585109 -0.9608482 0.9996295 0.9585109 -0.9614985 0.9996295 0.9585109 -0.9623212 0.9996295 0.9585109 -0.963362 0.9996295 0.9585109 -0.9646787 0.9996295 0.9585109 -0.9663445 0.9996295 0.9585109 -0.968452 0.9996295 0.9585109 -0.9711183 0.9996295 0.9585109 -0.9744915 0.9996295 0.9585109 -0.978759 0.9996295 0.9585109 -0.9841579 0.9996295 0.9585109 -0.9909882 0.9996295 0.9585109 -0.9996295 0.9996295 0.9585109 -0.9997074 0.9928267 0.966947 -0.9997688 0.9899741 0.9737101 -0.9998174 0.989325 0.9791163 -0.9998557 0.9898295 0.9834277 -0.999886 0.9908712 0.9868597 -0.9999099 0.9920999 0.9895878 -0.9999288 0.9933261 0.9917537 -0.9999437 0.9944556 0.9934718 -0.9668873 0.9997074 0.9669595 -0.9668872 0.9997074 0.9669594 -0.9668871 0.9997074 0.9669592 -0.966887 0.9997074 0.9669589 -0.9668869 0.9997074 0.9669586 -0.9668867 0.9997074 0.9669582 -0.9668865 0.9997074 0.9669577 -0.9668862 0.9997074 0.9669571 -0.9668859 0.9997074 0.9669563 -0.9668855 0.9997074 0.9669554 -0.9668852 0.9997074 0.9669543 -0.9668848 0.9997074 0.966953 -0.9668845 0.9997074 0.9669516 -0.9668844 0.9997074 0.9669501 -0.9668847 0.9997074 0.9669486 -0.9668859 0.9997074 0.9669474 -0.9668884 0.9997074 0.966947 -0.9668922 0.9997074 0.966947 -0.9668969 0.9997074 0.966947 -0.9669028 0.9997074 0.966947 -0.9669103 0.9997074 0.966947 -0.9669198 0.9997074 0.966947 -0.9669318 0.9997074 0.966947 -0.966947 0.9997074 0.966947 -0.9669663 0.9997074 0.966947 -0.9669906 0.9997074 0.966947 -0.9670214 0.9997074 0.966947 -0.9670604 0.9997074 0.966947 -0.9671097 0.9997074 0.966947 -0.967172 0.9997074 0.966947 -0.9672509 0.9997074 0.966947 -0.9673508 0.9997074 0.966947 -0.967477 0.9997074 0.966947 -0.9676368 0.9997074 0.966947 -0.9678389 0.9997074 0.966947 -0.9680946 0.9997074 0.966947 -0.9684181 0.9997074 0.966947 -0.9688274 0.9997074 0.966947 -0.9693452 0.9997074 0.966947 -0.9700002 0.9997074 0.966947 -0.970829 0.9997074 0.966947 -0.9718774 0.9997074 0.966947 -0.9732039 0.9997074 0.966947 -0.974882 0.9997074 0.966947 -0.977005 0.9997074 0.966947 -0.9796909 0.9997074 0.966947 -0.983089 0.9997074 0.966947 -0.9873879 0.9997074 0.966947 -0.9928267 0.9997074 0.966947 -0.9997074 0.9997074 0.966947 -0.9997688 0.9942982 0.9737101 -0.9998174 0.9920392 0.9791163 -0.9998557 0.9915316 0.9834277 -0.999886 0.9919377 0.9868597 -0.9999099 0.9927678 0.9895878 -0.9999288 0.9937442 0.9917537 -0.9999437 0.9947172 0.9934718 -0.9736726 0.9997689 0.973718 -0.9736726 0.9997689 0.9737179 -0.9736725 0.9997689 0.9737178 -0.9736724 0.9997689 0.9737176 -0.9736723 0.9997689 0.9737174 -0.9736722 0.9997689 0.9737172 -0.9736721 0.9997689 0.9737168 -0.9736719 0.9997689 0.9737164 -0.9736717 0.9997689 0.973716 -0.9736715 0.9997689 0.9737154 -0.9736712 0.9997689 0.9737147 -0.973671 0.9997689 0.9737139 -0.9736708 0.9997689 0.973713 -0.9736708 0.9997689 0.973712 -0.973671 0.9997688 0.9737111 -0.9736717 0.9997688 0.9737104 -0.9736733 0.9997688 0.9737101 -0.9736756 0.9997688 0.9737101 -0.9736786 0.9997688 0.9737101 -0.9736823 0.9997688 0.9737101 -0.973687 0.9997688 0.9737101 -0.973693 0.9997688 0.9737101 -0.9737006 0.9997688 0.9737101 -0.9737101 0.9997688 0.9737101 -0.9737222 0.9997688 0.9737101 -0.9737375 0.9997688 0.9737101 -0.9737569 0.9997688 0.9737101 -0.9737814 0.9997688 0.9737101 -0.9738123 0.9997688 0.9737101 -0.9738515 0.9997688 0.9737101 -0.9739011 0.9997688 0.9737101 -0.9739638 0.9997688 0.9737101 -0.9740432 0.9997688 0.9737101 -0.9741436 0.9997688 0.9737101 -0.9742706 0.9997688 0.9737101 -0.9744313 0.9997688 0.9737101 -0.9746346 0.9997688 0.9737101 -0.9748918 0.9997688 0.9737101 -0.9752172 0.9997688 0.9737101 -0.9756289 0.9997688 0.9737101 -0.9761497 0.9997688 0.9737101 -0.9768086 0.9997688 0.9737101 -0.9776422 0.9997688 0.9737101 -0.9786968 0.9997688 0.9737101 -0.980031 0.9997688 0.9737101 -0.981719 0.9997688 0.9737101 -0.9838545 0.9997688 0.9737101 -0.9865561 0.9997688 0.9737101 -0.9899741 0.9997688 0.9737101 -0.9942982 0.9997688 0.9737101 -0.9997688 0.9997688 0.9737101 -0.9998174 0.9954731 0.9791163 -0.9998557 0.9936849 0.9834277 -0.999886 0.993287 0.9868597 -0.9999099 0.9936128 0.9895878 -0.9999288 0.9942731 0.9917537 -0.9999437 0.9950481 0.9934718 -0.9790927 0.9998174 0.9791212 -0.9790927 0.9998174 0.9791212 -0.9790927 0.9998174 0.9791211 -0.9790926 0.9998174 0.979121 -0.9790925 0.9998174 0.9791208 -0.9790925 0.9998174 0.9791207 -0.9790924 0.9998174 0.9791205 -0.9790923 0.9998174 0.9791202 -0.9790921 0.9998174 0.9791199 -0.979092 0.9998174 0.9791196 -0.9790919 0.9998174 0.9791191 -0.9790917 0.9998174 0.9791186 -0.9790916 0.9998174 0.9791181 -0.9790916 0.9998174 0.9791175 -0.9790917 0.9998174 0.9791169 -0.9790921 0.9998174 0.9791164 -0.9790931 0.9998174 0.9791163 -0.9790946 0.9998174 0.9791163 -0.9790965 0.9998174 0.9791163 -0.9790988 0.9998174 0.9791163 -0.9791018 0.9998174 0.9791163 -0.9791055 0.9998174 0.9791163 -0.9791103 0.9998174 0.9791163 -0.9791163 0.9998174 0.9791163 -0.9791238 0.9998174 0.9791163 -0.9791334 0.9998174 0.9791163 -0.9791456 0.9998174 0.9791163 -0.979161 0.9998174 0.9791163 -0.9791804 0.9998174 0.9791163 -0.979205 0.9998174 0.9791163 -0.9792361 0.9998174 0.9791163 -0.9792755 0.9998174 0.9791163 -0.9793253 0.9998174 0.9791163 -0.9793883 0.9998174 0.9791163 -0.9794681 0.9998174 0.9791163 -0.9795689 0.9998174 0.9791163 -0.9796966 0.9998174 0.9791163 -0.979858 0.9998174 0.9791163 -0.9800622 0.9998174 0.9791163 -0.9803206 0.9998174 0.9791163 -0.9806476 0.9998174 0.9791163 -0.9810611 0.9998174 0.9791163 -0.9815844 0.9998174 0.9791163 -0.9822464 0.9998174 0.9791163 -0.9830838 0.9998174 0.9791163 -0.9841433 0.9998174 0.9791163 -0.9854838 0.9998174 0.9791163 -0.9871796 0.9998174 0.9791163 -0.989325 0.9998174 0.9791163 -0.9920392 0.9998174 0.9791163 -0.9954731 0.9998174 0.9791163 -0.9998174 0.9998174 0.9791163 -0.9998557 0.9964092 0.9834277 -0.999886 0.9949941 0.9868597 -0.9999099 0.9946818 0.9895878 -0.9999288 0.9949422 0.9917537 -0.9999437 0.9954668 0.9934718 -0.9834129 0.9998557 0.9834308 -0.9834129 0.9998557 0.9834308 -0.9834129 0.9998557 0.9834307 -0.9834129 0.9998557 0.9834306 -0.9834128 0.9998557 0.9834306 -0.9834128 0.9998557 0.9834305 -0.9834127 0.9998557 0.9834303 -0.9834127 0.9998557 0.9834302 -0.9834126 0.9998557 0.98343 -0.9834125 0.9998557 0.9834298 -0.9834124 0.9998557 0.9834295 -0.9834123 0.9998557 0.9834292 -0.9834122 0.9998557 0.9834288 -0.9834122 0.9998557 0.9834284 -0.9834123 0.9998557 0.9834281 -0.9834126 0.9998557 0.9834278 -0.9834132 0.9998557 0.9834277 -0.9834141 0.9998557 0.9834277 -0.9834153 0.9998557 0.9834277 -0.9834167 0.9998557 0.9834277 -0.9834186 0.9998557 0.9834277 -0.9834209 0.9998557 0.9834277 -0.9834239 0.9998557 0.9834277 -0.9834277 0.9998557 0.9834277 -0.9834324 0.9998557 0.9834277 -0.9834385 0.9998557 0.9834277 -0.9834461 0.9998557 0.9834277 -0.9834557 0.9998557 0.9834277 -0.9834679 0.9998557 0.9834277 -0.9834833 0.9998557 0.9834277 -0.9835029 0.9998557 0.9834277 -0.9835276 0.9998557 0.9834277 -0.9835588 0.9998557 0.9834277 -0.9835983 0.9998557 0.9834277 -0.9836483 0.9998557 0.9834277 -0.9837116 0.9998557 0.9834277 -0.9837916 0.9998557 0.9834277 -0.9838928 0.9998557 0.9834277 -0.9840209 0.9998557 0.9834277 -0.9841829 0.9998557 0.9834277 -0.984388 0.9998557 0.9834277 -0.9846473 0.9998557 0.9834277 -0.9849754 0.9998557 0.9834277 -0.9853905 0.9998557 0.9834277 -0.9859157 0.9998557 0.9834277 -0.9865801 0.9998557 0.9834277 -0.9874207 0.9998557 0.9834277 -0.9884841 0.9998557 0.9834277 -0.9898295 0.9998557 0.9834277 -0.9915316 0.9998557 0.9834277 -0.9936849 0.9998557 0.9834277 -0.9964092 0.9998557 0.9834277 -0.9998557 0.9998557 0.9834277 -0.999886 0.9971537 0.9868597 -0.9999099 0.9960342 0.9895878 -0.9999288 0.9957887 0.9917537 -0.9999437 0.9959964 0.9934718 -0.9868505 0.999886 0.9868617 -0.9868505 0.999886 0.9868617 -0.9868505 0.999886 0.9868616 -0.9868505 0.999886 0.9868616 -0.9868504 0.999886 0.9868616 -0.9868504 0.999886 0.9868615 -0.9868504 0.999886 0.9868614 -0.9868503 0.999886 0.9868613 -0.9868503 0.999886 0.9868612 -0.9868502 0.999886 0.9868611 -0.9868502 0.999886 0.9868609 -0.9868501 0.999886 0.9868607 -0.9868501 0.999886 0.9868605 -0.98685 0.999886 0.9868602 -0.9868501 0.999886 0.98686 -0.9868503 0.999886 0.9868598 -0.9868507 0.999886 0.9868597 -0.9868512 0.999886 0.9868597 -0.986852 0.999886 0.9868597 -0.9868529 0.999886 0.9868597 -0.9868541 0.999886 0.9868597 -0.9868555 0.999886 0.9868597 -0.9868574 0.999886 0.9868597 -0.9868597 0.999886 0.9868597 -0.9868627 0.999886 0.9868597 -0.9868665 0.999886 0.9868597 -0.9868713 0.999886 0.9868597 -0.9868773 0.999886 0.9868597 -0.986885 0.999886 0.9868597 -0.9868946 0.999886 0.9868597 -0.9869069 0.999886 0.9868597 -0.9869223 0.999886 0.9868597 -0.9869419 0.999886 0.9868597 -0.9869667 0.999886 0.9868597 -0.986998 0.999886 0.9868597 -0.9870376 0.999886 0.9868597 -0.9870878 0.999886 0.9868597 -0.9871512 0.999886 0.9868597 -0.9872315 0.999886 0.9868597 -0.987333 0.999886 0.9868597 -0.9874615 0.999886 0.9868597 -0.987624 0.999886 0.9868597 -0.9878296 0.999886 0.9868597 -0.9880897 0.999886 0.9868597 -0.9884188 0.999886 0.9868597 -0.9888351 0.999886 0.9868597 -0.9893618 0.999886 0.9868597 -0.9900282 0.999886 0.9868597 -0.9908712 0.999886 0.9868597 -0.9919377 0.999886 0.9868597 -0.993287 0.999886 0.9868597 -0.9949941 0.999886 0.9868597 -0.9971537 0.999886 0.9868597 -0.999886 0.999886 0.9868597 -0.9999099 0.9977452 0.9895878 -0.9999288 0.9968597 0.9917537 -0.9999437 0.9966665 0.9934718 -0.989582 0.9999099 0.989589 -0.989582 0.9999099 0.989589 -0.989582 0.9999099 0.989589 -0.989582 0.9999099 0.989589 -0.989582 0.9999099 0.9895889 -0.9895819 0.9999099 0.9895889 -0.9895819 0.9999099 0.9895888 -0.9895819 0.9999099 0.9895888 -0.9895819 0.9999099 0.9895887 -0.9895818 0.9999099 0.9895886 -0.9895818 0.9999099 0.9895885 -0.9895818 0.9999099 0.9895884 -0.9895817 0.9999099 0.9895882 -0.9895817 0.9999099 0.9895881 -0.9895817 0.9999099 0.9895879 -0.9895819 0.9999099 0.9895878 -0.9895821 0.9999099 0.9895878 -0.9895825 0.9999099 0.9895878 -0.9895829 0.9999099 0.9895878 -0.9895835 0.9999099 0.9895878 -0.9895842 0.9999099 0.9895878 -0.9895851 0.9999099 0.9895878 -0.9895863 0.9999099 0.9895878 -0.9895878 0.9999099 0.9895878 -0.9895897 0.9999099 0.9895878 -0.989592 0.9999099 0.9895878 -0.989595 0.9999099 0.9895878 -0.9895988 0.9999099 0.9895878 -0.9896036 0.9999099 0.9895878 -0.9896096 0.9999099 0.9895878 -0.9896173 0.9999099 0.9895878 -0.989627 0.9999099 0.9895878 -0.9896392 0.9999099 0.9895878 -0.9896547 0.9999099 0.9895878 -0.9896744 0.9999099 0.9895878 -0.9896992 0.9999099 0.9895878 -0.9897306 0.9999099 0.9895878 -0.9897703 0.9999099 0.9895878 -0.9898206 0.9999099 0.9895878 -0.9898842 0.9999099 0.9895878 -0.9899646 0.9999099 0.9895878 -0.9900664 0.9999099 0.9895878 -0.9901951 0.9999099 0.9895878 -0.990358 0.9999099 0.9895878 -0.9905641 0.9999099 0.9895878 -0.9908248 0.9999099 0.9895878 -0.9911547 0.9999099 0.9895878 -0.991572 0.9999099 0.9895878 -0.9920999 0.9999099 0.9895878 -0.9927678 0.9999099 0.9895878 -0.9936128 0.9999099 0.9895878 -0.9946818 0.9999099 0.9895878 -0.9960342 0.9999099 0.9895878 -0.9977452 0.9999099 0.9895878 -0.9999099 0.9999099 0.9895878 -0.9999288 0.9982146 0.9917537 -0.9999437 0.9975143 0.9934718 -0.9917501 0.9999288 0.9917545 -0.9917501 0.9999288 0.9917545 -0.9917501 0.9999288 0.9917545 -0.9917501 0.9999288 0.9917544 -0.9917501 0.9999288 0.9917544 -0.9917501 0.9999288 0.9917544 -0.99175 0.9999288 0.9917544 -0.99175 0.9999288 0.9917543 -0.99175 0.9999288 0.9917543 -0.99175 0.9999288 0.9917542 -0.99175 0.9999288 0.9917542 -0.9917499 0.9999288 0.9917541 -0.9917499 0.9999288 0.991754 -0.9917499 0.9999288 0.9917539 -0.9917499 0.9999288 0.9917538 -0.99175 0.9999288 0.9917537 -0.9917502 0.9999288 0.9917537 -0.9917504 0.9999288 0.9917537 -0.9917507 0.9999288 0.9917537 -0.991751 0.9999288 0.9917537 -0.9917515 0.9999288 0.9917537 -0.9917521 0.9999288 0.9917537 -0.9917528 0.9999288 0.9917537 -0.9917537 0.9999288 0.9917537 -0.9917549 0.9999288 0.9917537 -0.9917564 0.9999288 0.9917537 -0.9917582 0.9999288 0.9917537 -0.9917606 0.9999288 0.9917537 -0.9917636 0.9999288 0.9917537 -0.9917674 0.9999288 0.9917537 -0.9917722 0.9999288 0.9917537 -0.9917782 0.9999288 0.9917537 -0.9917859 0.9999288 0.9917537 -0.9917956 0.9999288 0.9917537 -0.9918079 0.9999288 0.9917537 -0.9918234 0.9999288 0.9917537 -0.9918431 0.9999288 0.9917537 -0.991868 0.9999288 0.9917537 -0.9918994 0.9999288 0.9917537 -0.9919392 0.9999288 0.9917537 -0.9919896 0.9999288 0.9917537 -0.9920533 0.9999288 0.9917537 -0.9921339 0.9999288 0.9917537 -0.9922358 0.9999288 0.9917537 -0.9923648 0.9999288 0.9917537 -0.992528 0.9999288 0.9917537 -0.9927345 0.9999288 0.9917537 -0.9929957 0.9999288 0.9917537 -0.9933261 0.9999288 0.9917537 -0.9937442 0.9999288 0.9917537 -0.9942731 0.9999288 0.9917537 -0.9949422 0.9999288 0.9917537 -0.9957887 0.9999288 0.9917537 -0.9968597 0.9999288 0.9917537 -0.9982146 0.9999288 0.9917537 -0.9999288 0.9999288 0.9917537 -0.9999437 0.9985868 0.9934718 -0.9934695 0.9999437 0.9934722 -0.9934695 0.9999437 0.9934722 -0.9934695 0.9999437 0.9934722 -0.9934695 0.9999437 0.9934722 -0.9934695 0.9999437 0.9934722 -0.9934695 0.9999437 0.9934722 -0.9934695 0.9999437 0.9934722 -0.9934694 0.9999437 0.9934721 -0.9934694 0.9999437 0.9934721 -0.9934694 0.9999437 0.9934721 -0.9934694 0.9999437 0.993472 -0.9934694 0.9999437 0.993472 -0.9934694 0.9999437 0.9934719 -0.9934694 0.9999437 0.9934719 -0.9934694 0.9999437 0.9934718 -0.9934694 0.9999437 0.9934718 -0.9934695 0.9999437 0.9934718 -0.9934697 0.9999437 0.9934718 -0.9934698 0.9999437 0.9934718 -0.9934701 0.9999437 0.9934718 -0.9934704 0.9999437 0.9934718 -0.9934707 0.9999437 0.9934718 -0.9934712 0.9999437 0.9934718 -0.9934718 0.9999437 0.9934718 -0.9934725 0.9999437 0.9934718 -0.9934734 0.9999437 0.9934718 -0.9934746 0.9999437 0.9934718 -0.9934761 0.9999437 0.9934718 -0.9934779 0.9999437 0.9934718 -0.9934803 0.9999437 0.9934718 -0.9934833 0.9999437 0.9934718 -0.9934871 0.9999437 0.9934718 -0.9934919 0.9999437 0.9934718 -0.993498 0.9999437 0.9934718 -0.9935057 0.9999437 0.9934718 -0.9935154 0.9999437 0.9934718 -0.9935277 0.9999437 0.9934718 -0.9935432 0.9999437 0.9934718 -0.9935629 0.9999437 0.9934718 -0.9935878 0.9999437 0.9934718 -0.9936193 0.9999437 0.9934718 -0.9936592 0.9999437 0.9934718 -0.9937096 0.9999437 0.9934718 -0.9937734 0.9999437 0.9934718 -0.9938541 0.9999437 0.9934718 -0.9939562 0.9999437 0.9934718 -0.9940854 0.9999437 0.9934718 -0.9942488 0.9999437 0.9934718 -0.9944556 0.9999437 0.9934718 -0.9947172 0.9999437 0.9934718 -0.9950481 0.9999437 0.9934718 -0.9954668 0.9999437 0.9934718 -0.9959964 0.9999437 0.9934718 -0.9966665 0.9999437 0.9934718 -0.9975143 0.9999437 0.9934718 -0.9985868 0.9999437 0.9934718 -0.9999437 0.9999437 0.9934718 -0.0000238 0.0000238 0.5501155 -0.0005417 0.0000238 0.5501155 -0.0011968 0.0000238 0.5501155 -0.0020256 0.0000238 0.5501155 -0.0030742 0.0000238 0.5501155 -0.0044007 0.0000238 0.5501155 -0.006079 0.0000238 0.5501155 -0.0082023 0.0000238 0.5501155 -0.0108885 0.0000238 0.5501155 -0.0142868 0.0000238 0.5501155 -0.0185862 0.0000238 0.5501155 -0.0240255 0.0000238 0.5501155 -0.0309069 0.0000238 0.5501155 -0.0396127 0.0000238 0.5501155 -0.0506267 0.0000238 0.5501155 -0.0645609 0.0000238 0.5501155 -0.0821895 0.0000238 0.5501155 -0.1044919 0.0000238 0.5501155 -0.1327073 0.0000238 0.5501155 -0.1684036 0.0000238 0.5501155 -0.2135639 0.0000238 0.5501155 -0.2706977 0.0000238 0.5501155 -0.3429792 0.0000238 0.5501155 -0.4344249 0.0000238 0.5501155 -0.5501155 0.0000238 0.5501155 -0.6964791 0.0000238 0.5501155 -0.8407292 0.0051514 0.5265122 -0.9033413 0.0279321 0.4594768 -0.9354466 0.0624569 0.4024964 -0.9545467 0.1059991 0.3671764 -0.9669269 0.1572498 0.3541909 -0.9754027 0.2151269 0.3612712 -0.9814251 0.2783684 0.3851765 -0.9858181 0.3454107 0.4223035 -0.9890841 0.4144197 0.468954 -0.9915469 0.4834235 0.5215352 -0.993424 0.5504963 0.5767543 -0.9948662 0.6139459 0.6317947 -0.9959813 0.6724572 0.6844392 -0.9968475 0.7251659 0.7331191 -0.997523 0.7716588 0.776885 -0.9980513 0.8119154 0.8153196 -0.9984653 0.8462171 0.848418 -0.9987905 0.8750477 0.8764616 -0.9990461 0.8990028 0.8999063 -0.9992474 0.9187175 0.9192924 -0.999406 0.9348153 0.9351797 -0.999531 0.9478754 0.9481058 -0.9996296 0.958416 0.9585613 -0.9997074 0.9668873 0.9669788 -0.9997689 0.9736726 0.9737301 -0.9998174 0.9790927 0.9791288 -0.9998557 0.9834129 0.9834356 -0.999886 0.9868505 0.9868647 -0.9999099 0.989582 0.9895909 -0.9999288 0.9917501 0.9917557 -0.9999437 0.9934695 0.993473 -0.0000238 0.0005417 0.5501155 -0.0000382 0.0000382 0.549612 -0.0006933 0.0000382 0.549612 -0.0015221 0.0000382 0.549612 -0.0025707 0.0000382 0.549612 -0.0038972 0.0000382 0.549612 -0.0055755 0.0000382 0.549612 -0.0076988 0.0000382 0.549612 -0.0103849 0.0000382 0.549612 -0.0137833 0.0000382 0.549612 -0.0180827 0.0000382 0.549612 -0.023522 0.0000382 0.549612 -0.0304033 0.0000382 0.549612 -0.0391092 0.0000382 0.549612 -0.0501232 0.0000382 0.549612 -0.0640574 0.0000382 0.549612 -0.081686 0.0000382 0.549612 -0.1039884 0.0000382 0.549612 -0.1322038 0.0000382 0.549612 -0.1679 0.0000382 0.549612 -0.2130604 0.0000382 0.549612 -0.2701941 0.0000382 0.549612 -0.3424757 0.0000382 0.549612 -0.4339214 0.0000382 0.549612 -0.549612 0.0000382 0.549612 -0.6959756 0.0000382 0.549612 -0.8405071 0.0051286 0.5261804 -0.9032596 0.0278872 0.4592077 -0.9354101 0.0624063 0.4022558 -0.9545286 0.1059489 0.3669659 -0.9669173 0.1572031 0.3540129 -0.9753975 0.2150852 0.3611254 -0.9814221 0.2783325 0.3850603 -0.9858163 0.3453807 0.4222132 -0.9890831 0.4143955 0.4688855 -0.9915463 0.4834045 0.5214844 -0.9934236 0.5504818 0.5767175 -0.994866 0.6139352 0.6317685 -0.9959811 0.6724495 0.6844209 -0.9968474 0.7251605 0.7331065 -0.997523 0.7716551 0.7768765 -0.9980512 0.8119128 0.815314 -0.9984653 0.8462154 0.8484142 -0.9987905 0.8750466 0.8764592 -0.9990461 0.899002 0.8999048 -0.9992474 0.918717 0.9192914 -0.999406 0.9348149 0.9351791 -0.999531 0.9478752 0.9481054 -0.9996296 0.9584159 0.958561 -0.9997074 0.9668872 0.9669786 -0.9997689 0.9736726 0.97373 -0.9998174 0.9790927 0.9791287 -0.9998557 0.9834129 0.9834355 -0.999886 0.9868505 0.9868647 -0.9999099 0.989582 0.9895909 -0.9999288 0.9917501 0.9917556 -0.9999437 0.9934695 0.993473 -0.0000238 0.0011968 0.5501155 -0.0000382 0.0006933 0.549612 -0.0000611 0.0000611 0.5489798 -0.0008899 0.0000611 0.5489798 -0.0019385 0.0000611 0.5489798 -0.003265 0.0000611 0.5489798 -0.0049433 0.0000611 0.5489798 -0.0070666 0.0000611 0.5489798 -0.0097527 0.0000611 0.5489798 -0.0131511 0.0000611 0.5489798 -0.0174505 0.0000611 0.5489798 -0.0228898 0.0000611 0.5489798 -0.0297711 0.0000611 0.5489798 -0.038477 0.0000611 0.5489798 -0.049491 0.0000611 0.5489798 -0.0634252 0.0000611 0.5489798 -0.0810538 0.0000611 0.5489798 -0.1033562 0.0000611 0.5489798 -0.1315716 0.0000611 0.5489798 -0.1672678 0.0000611 0.5489798 -0.2124282 0.0000611 0.5489798 -0.2695619 0.0000611 0.5489798 -0.3418435 0.0000611 0.5489798 -0.4332891 0.0000611 0.5489798 -0.5489798 0.0000611 0.5489798 -0.6953434 0.0000611 0.5489798 -0.8402274 0.0051047 0.5257632 -0.9031567 0.0278347 0.4588694 -0.9353643 0.0623458 0.4019535 -0.9545059 0.1058883 0.3667014 -0.9669053 0.1571463 0.3537894 -0.9753908 0.2150342 0.3609422 -0.9814183 0.2782884 0.3849144 -0.9858141 0.3453439 0.4220999 -0.9890818 0.4143657 0.4687996 -0.9915455 0.4833811 0.5214207 -0.9934231 0.550464 0.5766712 -0.9948657 0.6139219 0.6317356 -0.9959809 0.6724399 0.684398 -0.9968473 0.7251537 0.7330907 -0.9975229 0.7716504 0.7768658 -0.9980512 0.8119096 0.8153069 -0.9984653 0.8462132 0.8484096 -0.9987904 0.8750451 0.8764561 -0.9990461 0.8990011 0.8999028 -0.9992474 0.9187164 0.9192901 -0.999406 0.9348146 0.9351783 -0.999531 0.947875 0.9481049 -0.9996296 0.9584157 0.9585607 -0.9997074 0.9668871 0.9669784 -0.9997689 0.9736725 0.9737299 -0.9998174 0.9790927 0.9791287 -0.9998557 0.9834129 0.9834355 -0.999886 0.9868505 0.9868646 -0.9999099 0.989582 0.9895909 -0.9999288 0.9917501 0.9917556 -0.9999437 0.9934695 0.993473 -0.0000238 0.0020256 0.5501155 -0.0000382 0.0015221 0.549612 -0.0000611 0.0008899 0.5489798 -0.0000978 0.0000978 0.5481876 -0.0011463 0.0000978 0.5481876 -0.0024729 0.0000978 0.5481876 -0.0041512 0.0000978 0.5481876 -0.0062744 0.0000978 0.5481876 -0.0089606 0.0000978 0.5481876 -0.012359 0.0000978 0.5481876 -0.0166583 0.0000978 0.5481876 -0.0220976 0.0000978 0.5481876 -0.028979 0.0000978 0.5481876 -0.0376849 0.0000978 0.5481876 -0.0486989 0.0000978 0.5481876 -0.0626331 0.0000978 0.5481876 -0.0802616 0.0000978 0.5481876 -0.102564 0.0000978 0.5481876 -0.1307795 0.0000978 0.5481876 -0.1664757 0.0000978 0.5481876 -0.2116361 0.0000978 0.5481876 -0.2687698 0.0000978 0.5481876 -0.3410514 0.0000978 0.5481876 -0.432497 0.0000978 0.5481876 -0.5481876 0.0000978 0.5481876 -0.6945513 0.0000978 0.5481876 -0.8398756 0.0050826 0.5252393 -0.9030276 0.0277752 0.4584451 -0.9353068 0.0622749 0.4015743 -0.9544774 0.1058162 0.3663698 -0.9668902 0.1570779 0.353509 -0.9753825 0.2149725 0.3607126 -0.9814136 0.2782347 0.3847314 -0.9858113 0.3452987 0.4219578 -0.9890801 0.414329 0.4686918 -0.9915446 0.4833522 0.5213408 -0.9934225 0.5504419 0.5766132 -0.9948653 0.6139056 0.6316943 -0.9959807 0.672428 0.6843692 -0.9968472 0.7251454 0.733071 -0.9975228 0.7716446 0.7768525 -0.9980511 0.8119057 0.815298 -0.9984653 0.8462106 0.8484037 -0.9987904 0.8750434 0.8764523 -0.9990461 0.899 0.8999003 -0.9992474 0.9187157 0.9192885 -0.999406 0.9348141 0.9351772 -0.999531 0.9478746 0.9481042 -0.9996296 0.9584155 0.9585603 -0.9997074 0.966887 0.9669781 -0.9997689 0.9736724 0.9737297 -0.9998174 0.9790926 0.9791286 -0.9998557 0.9834129 0.9834354 -0.999886 0.9868505 0.9868646 -0.9999099 0.989582 0.9895908 -0.9999288 0.9917501 0.9917556 -0.9999437 0.9934695 0.9934729 -0.0000238 0.0030742 0.5501155 -0.0000382 0.0025707 0.549612 -0.0000611 0.0019385 0.5489798 -0.0000978 0.0011463 0.5481876 -0.0001565 0.0001565 0.5471978 -0.001483 0.0001565 0.5471978 -0.0031613 0.0001565 0.5471978 -0.0052846 0.0001565 0.5471978 -0.0079707 0.0001565 0.5471978 -0.0113691 0.0001565 0.5471978 -0.0156685 0.0001565 0.5471978 -0.0211078 0.0001565 0.5471978 -0.0279891 0.0001565 0.5471978 -0.036695 0.0001565 0.5471978 -0.047709 0.0001565 0.5471978 -0.0616432 0.0001565 0.5471978 -0.0792718 0.0001565 0.5471978 -0.1015742 0.0001565 0.5471978 -0.1297896 0.0001565 0.5471978 -0.1654858 0.0001565 0.5471978 -0.2106462 0.0001565 0.5471978 -0.2677799 0.0001565 0.5471978 -0.3400615 0.0001565 0.5471978 -0.4315072 0.0001565 0.5471978 -0.5471978 0.0001565 0.5471978 -0.6935614 0.0001565 0.5471978 -0.8394338 0.0050676 0.524583 -0.9028657 0.0277111 0.457914 -0.9352348 0.0621943 0.4010999 -0.9544418 0.1057322 0.3659549 -0.9668714 0.1569971 0.3531585 -0.9753721 0.2148987 0.3604255 -0.9814076 0.2781701 0.3845027 -0.9858079 0.3452442 0.4217802 -0.9890781 0.4142845 0.4685571 -0.9915433 0.4833171 0.5212409 -0.9934218 0.550415 0.5765407 -0.9948649 0.6138855 0.6316428 -0.9959804 0.6724135 0.6843332 -0.996847 0.7251351 0.7330463 -0.9975227 0.7716375 0.7768358 -0.9980511 0.8119009 0.8152868 -0.9984652 0.8462073 0.8483964 -0.9987904 0.8750412 0.8764475 -0.9990461 0.8989986 0.8998972 -0.9992474 0.9187148 0.9192865 -0.999406 0.9348135 0.935176 -0.999531 0.9478743 0.9481034 -0.9996296 0.9584153 0.9585598 -0.9997074 0.9668869 0.9669778 -0.9997689 0.9736723 0.9737295 -0.9998174 0.9790925 0.9791284 -0.9998557 0.9834128 0.9834353 -0.999886 0.9868504 0.9868645 -0.9999099 0.989582 0.9895908 -0.9999288 0.9917501 0.9917556 -0.9999437 0.9934695 0.9934729 -0.0000238 0.0044007 0.5501155 -0.0000382 0.0038972 0.549612 -0.0000611 0.003265 0.5489798 -0.0000978 0.0024729 0.5481876 -0.0001565 0.001483 0.5471978 -0.0002504 0.0002504 0.5459652 -0.0019287 0.0002504 0.5459652 -0.004052 0.0002504 0.5459652 -0.0067381 0.0002504 0.5459652 -0.0101365 0.0002504 0.5459652 -0.0144359 0.0002504 0.5459652 -0.0198752 0.0002504 0.5459652 -0.0267565 0.0002504 0.5459652 -0.0354624 0.0002504 0.5459652 -0.0464764 0.0002504 0.5459652 -0.0604106 0.0002504 0.5459652 -0.0780392 0.0002504 0.5459652 -0.1003416 0.0002504 0.5459652 -0.128557 0.0002504 0.5459652 -0.1642532 0.0002504 0.5459652 -0.2094136 0.0002504 0.5459652 -0.2665473 0.0002504 0.5459652 -0.3388289 0.0002504 0.5459652 -0.4302746 0.0002504 0.5459652 -0.5459652 0.0002504 0.5459652 -0.6923288 0.0002504 0.5459652 -0.8388802 0.0050694 0.5237632 -0.9026634 0.0276479 0.4572514 -0.9351449 0.0621069 0.4005083 -0.9543974 0.1056375 0.3654378 -0.9668479 0.156904 0.3527215 -0.9753591 0.2148124 0.3600677 -0.9814002 0.2780936 0.3842178 -0.9858036 0.3451791 0.4215589 -0.9890755 0.4142311 0.4683893 -0.9915418 0.4832747 0.5211165 -0.9934209 0.5503825 0.5764504 -0.9948643 0.6138613 0.6315785 -0.9959801 0.6723959 0.6842884 -0.9968468 0.7251226 0.7330155 -0.9975226 0.7716288 0.776815 -0.998051 0.8118949 0.815273 -0.9984652 0.8462034 0.8483872 -0.9987904 0.8750386 0.8764415 -0.9990461 0.8989969 0.8998934 -0.9992474 0.9187137 0.919284 -0.9994059 0.9348128 0.9351744 -0.999531 0.9478738 0.9481024 -0.9996296 0.958415 0.9585591 -0.9997074 0.9668867 0.9669774 -0.9997689 0.9736722 0.9737292 -0.9998174 0.9790925 0.9791283 -0.9998557 0.9834128 0.9834352 -0.999886 0.9868504 0.9868645 -0.9999099 0.9895819 0.9895908 -0.9999288 0.9917501 0.9917556 -0.9999437 0.9934695 0.9934729 -0.0000238 0.006079 0.5501155 -0.0000382 0.0055755 0.549612 -0.0000611 0.0049433 0.5489798 -0.0000978 0.0041512 0.5481876 -0.0001565 0.0031613 0.5471978 -0.0002504 0.0019287 0.5459652 -0.0004008 0.0004008 0.5444373 -0.0025241 0.0004008 0.5444373 -0.0052103 0.0004008 0.5444373 -0.0086086 0.0004008 0.5444373 -0.012908 0.0004008 0.5444373 -0.0183473 0.0004008 0.5444373 -0.0252287 0.0004008 0.5444373 -0.0339345 0.0004008 0.5444373 -0.0449485 0.0004008 0.5444373 -0.0588827 0.0004008 0.5444373 -0.0765113 0.0004008 0.5444373 -0.0988137 0.0004008 0.5444373 -0.1270291 0.0004008 0.5444373 -0.1627254 0.0004008 0.5444373 -0.2078857 0.0004008 0.5444373 -0.2650195 0.0004008 0.5444373 -0.337301 0.0004008 0.5444373 -0.4287467 0.0004008 0.5444373 -0.5444373 0.0004008 0.5444373 -0.6908009 0.0004008 0.5444373 -0.8381886 0.0051048 0.5227429 -0.9024114 0.0275966 0.4564282 -0.9350332 0.0620199 0.3997736 -0.9543421 0.1055364 0.3647957 -0.9668187 0.1568008 0.3521792 -0.975343 0.2147144 0.3596237 -0.9813911 0.2780055 0.3838642 -0.9857982 0.3451032 0.4212844 -0.9890723 0.4141683 0.4681812 -0.9915399 0.4832246 0.5209622 -0.9934197 0.5503438 0.5763385 -0.9948636 0.6138323 0.6314989 -0.9959797 0.6723748 0.6842328 -0.9968465 0.7251076 0.7329774 -0.9975224 0.7716184 0.7767892 -0.9980509 0.8118878 0.8152558 -0.9984651 0.8461986 0.8483759 -0.9987903 0.8750355 0.8764342 -0.9990461 0.8989948 0.8998886 -0.9992473 0.9187123 0.919281 -0.9994059 0.9348119 0.9351724 -0.999531 0.9478733 0.9481011 -0.9996296 0.9584146 0.9585583 -0.9997074 0.9668865 0.9669769 -0.9997689 0.9736721 0.9737289 -0.9998174 0.9790924 0.9791281 -0.9998557 0.9834127 0.9834351 -0.999886 0.9868504 0.9868644 -0.9999099 0.9895819 0.9895907 -0.9999288 0.99175 0.9917555 -0.9999437 0.9934695 0.9934729 -0.0000238 0.0082023 0.5501155 -0.0000382 0.0076988 0.549612 -0.0000611 0.0070666 0.5489798 -0.0000978 0.0062744 0.5481876 -0.0001565 0.0052846 0.5471978 -0.0002504 0.004052 0.5459652 -0.0004008 0.0025241 0.5444373 -0.0006416 0.0006416 0.5425548 -0.0033277 0.0006416 0.5425548 -0.0067261 0.0006416 0.5425548 -0.0110255 0.0006416 0.5425548 -0.0164648 0.0006416 0.5425548 -0.0233461 0.0006416 0.5425548 -0.032052 0.0006416 0.5425548 -0.043066 0.0006416 0.5425548 -0.0570002 0.0006416 0.5425548 -0.0746288 0.0006416 0.5425548 -0.0969312 0.0006416 0.5425548 -0.1251466 0.0006416 0.5425548 -0.1608428 0.0006416 0.5425548 -0.2060032 0.0006416 0.5425548 -0.2631369 0.0006416 0.5425548 -0.3354185 0.0006416 0.5425548 -0.4268641 0.0006416 0.5425548 -0.5425548 0.0006416 0.5425548 -0.6889184 0.0006416 0.5425548 -0.8373283 0.0052028 0.5214795 -0.9020992 0.0275778 0.455411 -0.9348949 0.0619473 0.3988663 -0.9542739 0.1054384 0.3640031 -0.9667827 0.1566936 0.3515099 -0.9753231 0.2146085 0.359076 -0.9813797 0.2779077 0.3834282 -0.9857916 0.3450175 0.420946 -0.9890684 0.4140964 0.4679246 -0.9915376 0.4831666 0.520772 -0.9934183 0.5502987 0.5762005 -0.9948628 0.6137984 0.6314008 -0.9959791 0.67235 0.6841643 -0.9968462 0.7250899 0.7329304 -0.9975222 0.7716061 0.7767575 -0.9980508 0.8118794 0.8152346 -0.998465 0.8461929 0.8483619 -0.9987903 0.8750317 0.876425 -0.999046 0.8989923 0.8998827 -0.9992473 0.9187107 0.9192772 -0.9994059 0.9348109 0.93517 -0.999531 0.9478726 0.9480996 -0.9996296 0.9584142 0.9585574 -0.9997074 0.9668862 0.9669763 -0.9997689 0.9736719 0.9737285 -0.9998174 0.9790923 0.9791278 -0.9998557 0.9834127 0.9834349 -0.999886 0.9868503 0.9868643 -0.9999099 0.9895819 0.9895906 -0.9999288 0.99175 0.9917555 -0.9999437 0.9934694 0.9934729 -0.0000238 0.0108885 0.5501155 -0.0000382 0.0103849 0.549612 -0.0000611 0.0097527 0.5489798 -0.0000978 0.0089606 0.5481876 -0.0001565 0.0079707 0.5471978 -0.0002504 0.0067381 0.5459652 -0.0004008 0.0052103 0.5444373 -0.0006416 0.0033277 0.5425548 -0.0010268 0.0010268 0.5402539 -0.0044252 0.0010268 0.5402539 -0.0087246 0.0010268 0.5402539 -0.0141639 0.0010268 0.5402539 -0.0210452 0.0010268 0.5402539 -0.0297511 0.0010268 0.5402539 -0.0407651 0.0010268 0.5402539 -0.0546993 0.0010268 0.5402539 -0.0723279 0.0010268 0.5402539 -0.0946303 0.0010268 0.5402539 -0.1228457 0.0010268 0.5402539 -0.1585419 0.0010268 0.5402539 -0.2037023 0.0010268 0.5402539 -0.260836 0.0010268 0.5402539 -0.3331176 0.0010268 0.5402539 -0.4245633 0.0010268 0.5402539 -0.5402539 0.0010268 0.5402539 -0.6866175 0.0010268 0.5402539 -0.8362644 0.0054121 0.519926 -0.9017148 0.0276281 0.4541634 -0.9347252 0.061916 0.3977542 -0.9541902 0.1053624 0.3630322 -0.9667385 0.1565954 0.3506904 -0.9752987 0.2145034 0.3584055 -0.9813659 0.2778058 0.3828946 -0.9857835 0.3449254 0.4205319 -0.9890637 0.4140176 0.4676107 -0.9915347 0.4831021 0.5205393 -0.9934166 0.550248 0.5760317 -0.9948617 0.6137599 0.6312808 -0.9959785 0.6723217 0.6840805 -0.9968458 0.7250697 0.7328729 -0.997522 0.7715919 0.7767186 -0.9980506 0.8118697 0.8152087 -0.9984649 0.8461864 0.8483449 -0.9987902 0.8750274 0.8764139 -0.999046 0.8989895 0.8998755 -0.9992473 0.9187089 0.9192725 -0.9994059 0.9348097 0.935167 -0.999531 0.9478718 0.9480977 -0.9996296 0.9584137 0.9585562 -0.9997074 0.9668859 0.9669755 -0.9997689 0.9736717 0.9737281 -0.9998174 0.9790921 0.9791275 -0.9998557 0.9834126 0.9834348 -0.999886 0.9868503 0.9868642 -0.9999099 0.9895819 0.9895906 -0.9999288 0.99175 0.9917555 -0.9999437 0.9934694 0.9934728 -0.0000238 0.0142868 0.5501155 -0.0000382 0.0137833 0.549612 -0.0000611 0.0131511 0.5489798 -0.0000978 0.012359 0.5481876 -0.0001565 0.0113691 0.5471978 -0.0002504 0.0101365 0.5459652 -0.0004008 0.0086086 0.5444373 -0.0006416 0.0067261 0.5425548 -0.0010268 0.0044252 0.5402539 -0.0016435 0.0016435 0.5374722 -0.0059429 0.0016435 0.5374722 -0.0113822 0.0016435 0.5374722 -0.0182636 0.0016435 0.5374722 -0.0269694 0.0016435 0.5374722 -0.0379834 0.0016435 0.5374722 -0.0519176 0.0016435 0.5374722 -0.0695462 0.0016435 0.5374722 -0.0918486 0.0016435 0.5374722 -0.120064 0.0016435 0.5374722 -0.1557603 0.0016435 0.5374722 -0.2009206 0.0016435 0.5374722 -0.2580543 0.0016435 0.5374722 -0.3303359 0.0016435 0.5374722 -0.4217816 0.0016435 0.5374722 -0.5374722 0.0016435 0.5374722 -0.6838358 0.0016435 0.5374722 -0.8349593 0.0058134 0.5180338 -0.9012461 0.0278105 0.4526484 -0.9345187 0.0619734 0.3964052 -0.9540886 0.1053433 0.3618551 -0.966685 0.1565315 0.3496974 -0.9752692 0.2144168 0.3575934 -0.9813491 0.2777122 0.3822485 -0.9857738 0.3448353 0.4200306 -0.9890579 0.4139373 0.4672309 -0.9915312 0.4830346 0.5202578 -0.9934145 0.5501939 0.5758275 -0.9948604 0.6137183 0.6311356 -0.9959777 0.6722907 0.6839792 -0.9968453 0.7250473 0.7328035 -0.9975217 0.7715762 0.7766717 -0.9980504 0.8118589 0.8151774 -0.9984648 0.8461791 0.8483242 -0.9987902 0.8750225 0.8764004 -0.9990459 0.8989863 0.8998667 -0.9992473 0.9187068 0.9192669 -0.9994059 0.9348083 0.9351634 -0.9995309 0.947871 0.9480954 -0.9996296 0.9584132 0.9585547 -0.9997074 0.9668855 0.9669746 -0.9997689 0.9736715 0.9737275 -0.9998174 0.979092 0.9791272 -0.9998557 0.9834125 0.9834345 -0.999886 0.9868502 0.986864 -0.9999099 0.9895818 0.9895905 -0.9999288 0.99175 0.9917554 -0.9999437 0.9934694 0.9934728 -0.0000238 0.0185862 0.5501155 -0.0000382 0.0180827 0.549612 -0.0000611 0.0174505 0.5489798 -0.0000978 0.0166583 0.5481876 -0.0001565 0.0156685 0.5471978 -0.0002504 0.0144359 0.5459652 -0.0004008 0.012908 0.5444373 -0.0006416 0.0110255 0.5425548 -0.0010268 0.0087246 0.5402539 -0.0016435 0.0059429 0.5374722 -0.0026305 0.0026305 0.5341598 -0.0080698 0.0026305 0.5341598 -0.0149512 0.0026305 0.5341598 -0.023657 0.0026305 0.5341598 -0.0346711 0.0026305 0.5341598 -0.0486053 0.0026305 0.5341598 -0.0662338 0.0026305 0.5341598 -0.0885362 0.0026305 0.5341598 -0.1167517 0.0026305 0.5341598 -0.1524479 0.0026305 0.5341598 -0.1976083 0.0026305 0.5341598 -0.254742 0.0026305 0.5341598 -0.3270236 0.0026305 0.5341598 -0.4184692 0.0026305 0.5341598 -0.5341598 0.0026305 0.5341598 -0.6805235 0.0026305 0.5341598 -0.8333779 0.0065402 0.5157602 -0.900682 0.0282324 0.4508351 -0.9342712 0.062202 0.3947922 -0.9539671 0.1054431 0.3604487 -0.9666211 0.1565473 0.3485116 -0.975234 0.2143816 0.3566242 -0.9813291 0.2776503 0.3814778 -0.9857621 0.3447636 0.4194328 -0.989051 0.4138668 0.466778 -0.9915271 0.4829718 0.5199223 -0.993412 0.5501416 0.5755841 -0.9948589 0.6136769 0.6309626 -0.9959768 0.6722594 0.6838586 -0.9968448 0.7250244 0.7327207 -0.9975213 0.7715599 0.7766158 -0.9980502 0.8118476 0.8151401 -0.9984647 0.8461714 0.8482997 -0.9987901 0.8750173 0.8763844 -0.9990459 0.8989829 0.8998564 -0.9992472 0.9187045 0.9192603 -0.9994059 0.9348069 0.9351592 -0.9995309 0.94787 0.9480927 -0.9996296 0.9584126 0.958553 -0.9997074 0.9668852 0.9669735 -0.9997689 0.9736712 0.9737268 -0.9998174 0.9790919 0.9791267 -0.9998557 0.9834124 0.9834343 -0.999886 0.9868502 0.9868639 -0.9999099 0.9895818 0.9895904 -0.9999288 0.99175 0.9917553 -0.9999437 0.9934694 0.9934728 -0.0000238 0.0240255 0.5501155 -0.0000382 0.023522 0.549612 -0.0000611 0.0228898 0.5489798 -0.0000978 0.0220976 0.5481876 -0.0001565 0.0211078 0.5471978 -0.0002504 0.0198752 0.5459652 -0.0004008 0.0183473 0.5444373 -0.0006416 0.0164648 0.5425548 -0.0010268 0.0141639 0.5402539 -0.0016435 0.0113822 0.5374722 -0.0026305 0.0080698 0.5341598 -0.0042103 0.0042103 0.5303003 -0.0110917 0.0042103 0.5303003 -0.0197975 0.0042103 0.5303003 -0.0308116 0.0042103 0.5303003 -0.0447458 0.0042103 0.5303003 -0.0623743 0.0042103 0.5303003 -0.0846767 0.0042103 0.5303003 -0.1128922 0.0042103 0.5303003 -0.1485884 0.0042103 0.5303003 -0.1937488 0.0042103 0.5303003 -0.2508825 0.0042103 0.5303003 -0.3231641 0.0042103 0.5303003 -0.4146097 0.0042103 0.5303003 -0.5303003 0.0042103 0.5303003 -0.676664 0.0042103 0.5303003 -0.8314967 0.0078103 0.5130828 -0.9000167 0.0290732 0.4487093 -0.9339805 0.062742 0.3929036 -0.9538247 0.1057683 0.3588035 -0.9665463 0.1567226 0.3471256 -0.9751928 0.2144566 0.3554919 -0.9813057 0.2776626 0.3805778 -0.9857485 0.3447407 0.4187351 -0.989043 0.4138277 0.4662495 -0.9915223 0.4829286 0.5195309 -0.9934091 0.5501012 0.5753003 -0.9948571 0.6136427 0.6307609 -0.9959757 0.6722322 0.6837178 -0.9968441 0.7250039 0.7326242 -0.9975209 0.7715449 0.7765506 -0.99805 0.811837 0.8150967 -0.9984645 0.8461641 0.848271 -0.99879 0.8750124 0.8763657 -0.9990458 0.8989796 0.8998443 -0.9992472 0.9187024 0.9192525 -0.9994059 0.9348055 0.9351542 -0.9995309 0.9478691 0.9480896 -0.9996296 0.958412 0.958551 -0.9997074 0.9668848 0.9669723 -0.9997689 0.973671 0.973726 -0.9998174 0.9790917 0.9791262 -0.9998557 0.9834123 0.9834339 -0.999886 0.9868501 0.9868637 -0.9999099 0.9895818 0.9895902 -0.9999288 0.9917499 0.9917553 -0.9999437 0.9934694 0.9934727 -0.0000238 0.0309069 0.5501155 -0.0000382 0.0304033 0.549612 -0.0000611 0.0297711 0.5489798 -0.0000978 0.028979 0.5481876 -0.0001565 0.0279891 0.5471978 -0.0002504 0.0267565 0.5459652 -0.0004008 0.0252287 0.5444373 -0.0006416 0.0233461 0.5425548 -0.0010268 0.0210452 0.5402539 -0.0016435 0.0182636 0.5374722 -0.0026305 0.0149512 0.5341598 -0.0042103 0.0110917 0.5303003 -0.0067388 0.0067388 0.5259474 -0.0154447 0.0067388 0.5259474 -0.0264587 0.0067388 0.5259474 -0.0403929 0.0067388 0.5259474 -0.0580214 0.0067388 0.5259474 -0.0803239 0.0067388 0.5259474 -0.1085393 0.0067388 0.5259474 -0.1442355 0.0067388 0.5259474 -0.1893959 0.0067388 0.5259474 -0.2465296 0.0067388 0.5259474 -0.3188112 0.0067388 0.5259474 -0.4102568 0.0067388 0.5259474 -0.5259474 0.0067388 0.5259474 -0.6723111 0.0067388 0.5259474 -0.8293233 0.0099781 0.5100256 -0.8992555 0.0306306 0.4462949 -0.9336494 0.0638283 0.3907618 -0.953663 0.1064997 0.3569395 -0.9664615 0.1571937 0.3455565 -0.9751462 0.2147432 0.354211 -0.9812792 0.2778236 0.3795602 -0.9857332 0.3448204 0.4179465 -0.9890339 0.4138582 0.4656526 -0.9915169 0.4829319 0.5190889 -0.9934058 0.5500915 0.5749799 -0.9948551 0.6136284 0.6305332 -0.9959745 0.672218 0.683559 -0.9968433 0.7249916 0.7325153 -0.9975204 0.7715352 0.776477 -0.9980497 0.8118298 0.8150477 -0.9984643 0.8461589 0.8482387 -0.9987899 0.8750088 0.8763446 -0.9990458 0.8989771 0.8998306 -0.9992472 0.9187008 0.9192437 -0.9994058 0.9348044 0.9351486 -0.9995309 0.9478684 0.948086 -0.9996296 0.9584115 0.9585487 -0.9997074 0.9668845 0.9669708 -0.9997689 0.9736708 0.9737251 -0.9998174 0.9790916 0.9791257 -0.9998557 0.9834122 0.9834336 -0.999886 0.9868501 0.9868634 -0.9999099 0.9895817 0.9895901 -0.9999288 0.9917499 0.9917552 -0.9999437 0.9934694 0.9934727 -0.0000238 0.0396127 0.5501155 -0.0000382 0.0391092 0.549612 -0.0000611 0.038477 0.5489798 -0.0000978 0.0376849 0.5481876 -0.0001565 0.036695 0.5471978 -0.0002504 0.0354624 0.5459652 -0.0004008 0.0339345 0.5444373 -0.0006416 0.032052 0.5425548 -0.0010268 0.0297511 0.5402539 -0.0016435 0.0269694 0.5374722 -0.0026305 0.023657 0.5341598 -0.0042103 0.0197975 0.5303003 -0.0067388 0.0154447 0.5259474 -0.0107859 0.0107859 0.5212886 -0.0217999 0.0107859 0.5212886 -0.0357341 0.0107859 0.5212886 -0.0533626 0.0107859 0.5212886 -0.075665 0.0107859 0.5212886 -0.1038805 0.0107859 0.5212886 -0.1395767 0.0107859 0.5212886 -0.1847371 0.0107859 0.5212886 -0.2418708 0.0107859 0.5212886 -0.3141524 0.0107859 0.5212886 -0.405598 0.0107859 0.5212886 -0.5212886 0.0107859 0.5212886 -0.6676523 0.0107859 0.5212886 -0.8269342 0.0136166 0.5067085 -0.8984278 0.0333932 0.4436907 -0.9332914 0.0658501 0.3884555 -0.9534887 0.1079385 0.3549345 -0.9663702 0.15819 0.3438702 -0.9750962 0.2154135 0.3528354 -0.9812508 0.2782606 0.3784681 -0.9857167 0.3450957 0.4171007 -0.9890241 0.4140252 0.4650125 -0.991511 0.4830292 0.5186151 -0.9934023 0.5501456 0.5746366 -0.994853 0.6136569 0.6302893 -0.9959732 0.672232 0.6833889 -0.9968425 0.7249978 0.7323986 -0.9975199 0.7715376 0.7763982 -0.9980494 0.8118303 0.8149952 -0.9984642 0.8461587 0.8482042 -0.9987897 0.8750084 0.8763221 -0.9990457 0.8989767 0.899816 -0.9992471 0.9187004 0.9192343 -0.9994058 0.9348042 0.9351426 -0.9995309 0.9478683 0.9480822 -0.9996295 0.9584114 0.9585463 -0.9997074 0.9668844 0.9669693 -0.9997689 0.9736708 0.9737241 -0.9998174 0.9790916 0.979125 -0.9998557 0.9834122 0.9834332 -0.999886 0.98685 0.9868632 -0.9999099 0.9895817 0.98959 -0.9999288 0.9917499 0.9917551 -0.9999437 0.9934694 0.9934726 -0.0000238 0.0506267 0.5501155 -0.0000382 0.0501232 0.549612 -0.0000611 0.049491 0.5489798 -0.0000978 0.0486989 0.5481876 -0.0001565 0.047709 0.5471978 -0.0002504 0.0464764 0.5459652 -0.0004008 0.0449485 0.5444373 -0.0006416 0.043066 0.5425548 -0.0010268 0.0407651 0.5402539 -0.0016435 0.0379834 0.5374722 -0.0026305 0.0346711 0.5341598 -0.0042103 0.0308116 0.5303003 -0.0067388 0.0264587 0.5259474 -0.0107859 0.0217999 0.5212886 -0.0172633 0.0172633 0.5167521 -0.0311975 0.0172633 0.5167521 -0.0488261 0.0172633 0.5167521 -0.0711285 0.0172633 0.5167521 -0.099344 0.0172633 0.5167521 -0.1350402 0.0172633 0.5167521 -0.1802005 0.0172633 0.5167521 -0.2373343 0.0172633 0.5167521 -0.3096159 0.0172633 0.5167521 -0.4010615 0.0172633 0.5167521 -0.5167521 0.0172633 0.5167521 -0.6631157 0.0172633 0.5167521 -0.8245426 0.0196467 0.5034325 -0.8976087 0.0381561 0.4411348 -0.9329391 0.0694453 0.3861956 -0.9533177 0.1105818 0.3529722 -0.9662809 0.160092 0.3422213 -0.9750472 0.2167545 0.3514914 -0.9812231 0.2791873 0.3774018 -0.9857006 0.3457234 0.4162752 -0.9890146 0.4144423 0.464388 -0.9915054 0.4833013 0.5181531 -0.9933988 0.5503203 0.5743018 -0.9948509 0.6137675 0.6300515 -0.9959719 0.6723012 0.6832232 -0.9968418 0.7250408 0.732285 -0.9975194 0.7715641 0.7763215 -0.9980491 0.8118466 0.814944 -0.998464 0.8461687 0.8481705 -0.9987896 0.8750145 0.8763001 -0.9990456 0.8989805 0.8998018 -0.9992471 0.9187027 0.9192252 -0.9994058 0.9348056 0.9351368 -0.9995309 0.9478691 0.9480785 -0.9996295 0.958412 0.9585439 -0.9997074 0.9668847 0.9669678 -0.9997688 0.973671 0.9737232 -0.9998174 0.9790917 0.9791245 -0.9998557 0.9834123 0.9834328 -0.999886 0.9868501 0.986863 -0.9999099 0.9895817 0.9895898 -0.9999288 0.9917499 0.991755 -0.9999437 0.9934694 0.9934725 -0.0000238 0.0645609 0.5501155 -0.0000382 0.0640574 0.549612 -0.0000611 0.0634252 0.5489798 -0.0000978 0.0626331 0.5481876 -0.0001565 0.0616432 0.5471978 -0.0002504 0.0604106 0.5459652 -0.0004008 0.0588827 0.5444373 -0.0006416 0.0570002 0.5425548 -0.0010268 0.0546993 0.5402539 -0.0016435 0.0519176 0.5374722 -0.0026305 0.0486053 0.5341598 -0.0042103 0.0447458 0.5303003 -0.0067388 0.0403929 0.5259474 -0.0107859 0.0357341 0.5212886 -0.0172633 0.0311975 0.5167521 -0.0276309 0.0276309 0.5131855 -0.0452595 0.0276309 0.5131855 -0.0675619 0.0276309 0.5131855 -0.0957773 0.0276309 0.5131855 -0.1314736 0.0276309 0.5131855 -0.1766339 0.0276309 0.5131855 -0.2337676 0.0276309 0.5131855 -0.3060492 0.0276309 0.5131855 -0.3974949 0.0276309 0.5131855 -0.5131855 0.0276309 0.5131855 -0.6595491 0.0276309 0.5131855 -0.8226154 0.0295373 0.5008244 -0.8969554 0.0461985 0.4391112 -0.9326595 0.0756464 0.3844091 -0.9531823 0.1152388 0.3514224 -0.9662104 0.1635226 0.3409202 -0.9750086 0.2192389 0.3504316 -0.9812013 0.2809573 0.3765614 -0.9856879 0.3469645 0.4156249 -0.9890072 0.4152991 0.4638963 -0.9915009 0.4838841 0.5177893 -0.9933961 0.5507113 0.5740383 -0.9948493 0.6140266 0.6298645 -0.9959709 0.6724711 0.6830927 -0.9968411 0.7251511 0.7321956 -0.9975191 0.7716352 0.7762611 -0.9980488 0.8118921 0.8149038 -0.9984638 0.8461977 0.848144 -0.9987895 0.8750329 0.8762828 -0.9990456 0.8989921 0.8997906 -0.999247 0.9187101 0.919218 -0.9994057 0.9348102 0.9351322 -0.9995309 0.947872 0.9480755 -0.9996295 0.9584138 0.9585421 -0.9997074 0.9668859 0.9669667 -0.9997688 0.9736717 0.9737225 -0.9998174 0.9790921 0.979124 -0.9998557 0.9834126 0.9834325 -0.999886 0.9868503 0.9868628 -0.9999099 0.9895819 0.9895897 -0.9999288 0.99175 0.9917549 -0.9999437 0.9934694 0.9934725 -0.0000238 0.0821895 0.5501155 -0.0000382 0.081686 0.549612 -0.0000611 0.0810538 0.5489798 -0.0000978 0.0802616 0.5481876 -0.0001565 0.0792718 0.5471978 -0.0002504 0.0780392 0.5459652 -0.0004008 0.0765113 0.5444373 -0.0006416 0.0746288 0.5425548 -0.0010268 0.0723279 0.5402539 -0.0016435 0.0695462 0.5374722 -0.0026305 0.0662338 0.5341598 -0.0042103 0.0623743 0.5303003 -0.0067388 0.0580214 0.5259474 -0.0107859 0.0533626 0.5212886 -0.0172633 0.0488261 0.5167521 -0.0276309 0.0452595 0.5131855 -0.0441188 0.0441188 0.5120448 -0.0664212 0.0441188 0.5120448 -0.0946366 0.0441188 0.5120448 -0.1303328 0.0441188 0.5120448 -0.1754932 0.0441188 0.5120448 -0.2326269 0.0441188 0.5120448 -0.3049085 0.0441188 0.5120448 -0.3963542 0.0441188 0.5120448 -0.5120448 0.0441188 0.5120448 -0.6584084 0.0441188 0.5120448 -0.8219901 0.0455041 0.4999841 -0.8967447 0.0594506 0.4384614 -0.9325696 0.0860209 0.3838358 -0.9531389 0.1231452 0.3509254 -0.9661878 0.1694384 0.3405032 -0.9749962 0.2235962 0.3500921 -0.9811943 0.2841192 0.3762922 -0.9856839 0.3492254 0.4154167 -0.9890048 0.4168922 0.4637389 -0.9914995 0.4849907 0.5176729 -0.9933953 0.5514695 0.573954 -0.9948487 0.6145393 0.6298046 -0.9959706 0.6728136 0.683051 -0.9968409 0.7253775 0.732167 -0.9975189 0.7717834 0.7762418 -0.9980488 0.8119884 0.8148909 -0.9984638 0.8462598 0.8481355 -0.9987895 0.8750727 0.8762773 -0.9990455 0.8990175 0.899787 -0.999247 0.9187262 0.9192157 -0.9994057 0.9348204 0.9351307 -0.9995308 0.9478785 0.9480746 -0.9996295 0.9584178 0.9585415 -0.9997074 0.9668884 0.9669663 -0.9997688 0.9736733 0.9737222 -0.9998174 0.9790931 0.9791238 -0.9998557 0.9834132 0.9834324 -0.999886 0.9868507 0.9868627 -0.9999099 0.9895821 0.9895897 -0.9999288 0.9917502 0.9917549 -0.9999437 0.9934695 0.9934725 -0.0000238 0.1044919 0.5501155 -0.0000382 0.1039884 0.549612 -0.0000611 0.1033562 0.5489798 -0.0000978 0.102564 0.5481876 -0.0001565 0.1015742 0.5471978 -0.0002504 0.1003416 0.5459652 -0.0004008 0.0988137 0.5444373 -0.0006416 0.0969312 0.5425548 -0.0010268 0.0946303 0.5402539 -0.0016435 0.0918486 0.5374722 -0.0026305 0.0885362 0.5341598 -0.0042103 0.0846767 0.5303003 -0.0067388 0.0803239 0.5259474 -0.0107859 0.075665 0.5212886 -0.0172633 0.0711285 0.5167521 -0.0276309 0.0675619 0.5131855 -0.0441188 0.0664212 0.5120448 -0.0664212 0.0664212 0.5120448 -0.0946366 0.0664212 0.5120448 -0.1303328 0.0664212 0.5120448 -0.1754932 0.0664212 0.5120448 -0.2326269 0.0664212 0.5120448 -0.3049085 0.0664212 0.5120448 -0.3963542 0.0664212 0.5120448 -0.5120448 0.0664212 0.5120448 -0.6584084 0.0664212 0.5120448 -0.8219901 0.0671656 0.4999841 -0.8967447 0.0775151 0.4384614 -0.9325696 0.1002154 0.3838358 -0.9531389 0.1340017 0.3509254 -0.9661878 0.1775917 0.3405032 -0.9749962 0.2296253 0.3500921 -0.9811943 0.2885124 0.3762922 -0.9856839 0.3523802 0.4154167 -0.9890048 0.419125 0.4637389 -0.9914995 0.4865484 0.5176729 -0.9933953 0.5525411 0.573954 -0.9948487 0.6152669 0.6298046 -0.9959706 0.6733015 0.683051 -0.9968409 0.7257011 0.732167 -0.9975189 0.7719959 0.7762418 -0.9980488 0.8121268 0.8148909 -0.9984638 0.8463492 0.8481355 -0.9987895 0.8751301 0.8762773 -0.9990455 0.8990542 0.899787 -0.999247 0.9187495 0.9192157 -0.9994057 0.9348352 0.9351307 -0.9995308 0.9478878 0.9480746 -0.9996295 0.9584237 0.9585415 -0.9997074 0.9668922 0.9669663 -0.9997688 0.9736756 0.9737222 -0.9998174 0.9790946 0.9791238 -0.9998557 0.9834141 0.9834324 -0.999886 0.9868512 0.9868627 -0.9999099 0.9895825 0.9895897 -0.9999288 0.9917504 0.9917549 -0.9999437 0.9934697 0.9934725 -0.0000238 0.1327073 0.5501155 -0.0000382 0.1322038 0.549612 -0.0000611 0.1315716 0.5489798 -0.0000978 0.1307795 0.5481876 -0.0001565 0.1297896 0.5471978 -0.0002504 0.128557 0.5459652 -0.0004008 0.1270291 0.5444373 -0.0006416 0.1251466 0.5425548 -0.0010268 0.1228457 0.5402539 -0.0016435 0.120064 0.5374722 -0.0026305 0.1167517 0.5341598 -0.0042103 0.1128922 0.5303003 -0.0067388 0.1085393 0.5259474 -0.0107859 0.1038805 0.5212886 -0.0172633 0.099344 0.5167521 -0.0276309 0.0957773 0.5131855 -0.0441188 0.0946366 0.5120448 -0.0664212 0.0946366 0.5120448 -0.0946366 0.0946366 0.5120448 -0.1303328 0.0946366 0.5120448 -0.1754932 0.0946366 0.5120448 -0.2326269 0.0946366 0.5120448 -0.3049085 0.0946366 0.5120448 -0.3963542 0.0946366 0.5120448 -0.5120448 0.0946366 0.5120448 -0.6584084 0.0946366 0.5120448 -0.8219901 0.0945703 0.4999841 -0.8967447 0.1003691 0.4384614 -0.9325696 0.1181733 0.3838358 -0.9531389 0.1477366 0.3509254 -0.9661878 0.1879067 0.3405032 -0.9749962 0.2372529 0.3500921 -0.9811943 0.2940703 0.3762922 -0.9856839 0.3563715 0.4154167 -0.9890048 0.4219498 0.4637389 -0.9914995 0.4885191 0.5176729 -0.9933953 0.5538969 0.573954 -0.9948487 0.6161874 0.6298046 -0.9959706 0.6739188 0.683051 -0.9968409 0.7261105 0.732167 -0.9975189 0.7722648 0.7762418 -0.9980488 0.8123018 0.8148909 -0.9984638 0.8464623 0.8481355 -0.9987895 0.8752028 0.8762773 -0.9990455 0.8991006 0.899787 -0.999247 0.9187791 0.9192157 -0.9994057 0.9348539 0.9351307 -0.9995308 0.9478997 0.9480746 -0.9996295 0.9584312 0.9585415 -0.9997074 0.9668969 0.9669663 -0.9997688 0.9736786 0.9737222 -0.9998174 0.9790965 0.9791238 -0.9998557 0.9834153 0.9834324 -0.999886 0.986852 0.9868627 -0.9999099 0.9895829 0.9895897 -0.9999288 0.9917507 0.9917549 -0.9999437 0.9934698 0.9934725 -0.0000238 0.1684036 0.5501155 -0.0000382 0.1679 0.549612 -0.0000611 0.1672678 0.5489798 -0.0000978 0.1664757 0.5481876 -0.0001565 0.1654858 0.5471978 -0.0002504 0.1642532 0.5459652 -0.0004008 0.1627254 0.5444373 -0.0006416 0.1608428 0.5425548 -0.0010268 0.1585419 0.5402539 -0.0016435 0.1557603 0.5374722 -0.0026305 0.1524479 0.5341598 -0.0042103 0.1485884 0.5303003 -0.0067388 0.1442355 0.5259474 -0.0107859 0.1395767 0.5212886 -0.0172633 0.1350402 0.5167521 -0.0276309 0.1314736 0.5131855 -0.0441188 0.1303328 0.5120448 -0.0664212 0.1303328 0.5120448 -0.0946366 0.1303328 0.5120448 -0.1303328 0.1303328 0.5120448 -0.1754932 0.1303328 0.5120448 -0.2326269 0.1303328 0.5120448 -0.3049085 0.1303328 0.5120448 -0.3963542 0.1303328 0.5120448 -0.5120448 0.1303328 0.5120448 -0.6584084 0.1303328 0.5120448 -0.8219901 0.1292408 0.4999841 -0.8967447 0.1292823 0.4384614 -0.9325696 0.1408925 0.3838358 -0.9531389 0.1651131 0.3509254 -0.9661878 0.2009566 0.3405032 -0.9749962 0.2469027 0.3500921 -0.9811943 0.3011018 0.3762922 -0.9856839 0.3614209 0.4154167 -0.9890048 0.4255236 0.4637389 -0.9914995 0.4910123 0.5176729 -0.9933953 0.5556122 0.573954 -0.9948487 0.6173519 0.6298046 -0.9959706 0.6746998 0.683051 -0.9968409 0.7266285 0.732167 -0.9975189 0.7726049 0.7762418 -0.9980488 0.8125232 0.8148909 -0.9984638 0.8466054 0.8481355 -0.9987895 0.8752947 0.8762773 -0.9990455 0.8991593 0.899787 -0.999247 0.9188164 0.9192157 -0.9994057 0.9348776 0.9351307 -0.9995308 0.9479146 0.9480746 -0.9996295 0.9584406 0.9585415 -0.9997074 0.9669028 0.9669663 -0.9997688 0.9736823 0.9737222 -0.9998174 0.9790988 0.9791238 -0.9998557 0.9834167 0.9834324 -0.999886 0.9868529 0.9868627 -0.9999099 0.9895835 0.9895897 -0.9999288 0.991751 0.9917549 -0.9999437 0.9934701 0.9934725 -0.0000238 0.2135639 0.5501155 -0.0000382 0.2130604 0.549612 -0.0000611 0.2124282 0.5489798 -0.0000978 0.2116361 0.5481876 -0.0001565 0.2106462 0.5471978 -0.0002504 0.2094136 0.5459652 -0.0004008 0.2078857 0.5444373 -0.0006416 0.2060032 0.5425548 -0.0010268 0.2037023 0.5402539 -0.0016435 0.2009206 0.5374722 -0.0026305 0.1976083 0.5341598 -0.0042103 0.1937488 0.5303003 -0.0067388 0.1893959 0.5259474 -0.0107859 0.1847371 0.5212886 -0.0172633 0.1802005 0.5167521 -0.0276309 0.1766339 0.5131855 -0.0441188 0.1754932 0.5120448 -0.0664212 0.1754932 0.5120448 -0.0946366 0.1754932 0.5120448 -0.1303328 0.1754932 0.5120448 -0.1754932 0.1754932 0.5120448 -0.2326269 0.1754932 0.5120448 -0.3049085 0.1754932 0.5120448 -0.3963542 0.1754932 0.5120448 -0.5120448 0.1754932 0.5120448 -0.6584084 0.1754932 0.5120448 -0.8219901 0.1731034 0.4999841 -0.8967447 0.1658613 0.4384614 -0.9325696 0.1696351 0.3838358 -0.9531389 0.1870965 0.3509254 -0.9661878 0.2174663 0.3405032 -0.9749962 0.2591111 0.3500921 -0.9811943 0.3099976 0.3762922 -0.9856839 0.3678092 0.4154167 -0.9890048 0.4300448 0.4637389 -0.9914995 0.4941665 0.5176729 -0.9933953 0.5577822 0.573954 -0.9948487 0.6188252 0.6298046 -0.9959706 0.6756878 0.683051 -0.9968409 0.7272837 0.732167 -0.9975189 0.7730352 0.7762418 -0.9980488 0.8128033 0.8148909 -0.9984638 0.8467864 0.8481355 -0.9987895 0.8754109 0.8762773 -0.9990455 0.8992336 0.899787 -0.999247 0.9188636 0.9192157 -0.9994057 0.9349075 0.9351307 -0.9995308 0.9479335 0.9480746 -0.9996295 0.9584526 0.9585415 -0.9997074 0.9669103 0.9669663 -0.9997688 0.973687 0.9737222 -0.9998174 0.9791018 0.9791238 -0.9998557 0.9834186 0.9834324 -0.999886 0.9868541 0.9868627 -0.9999099 0.9895842 0.9895897 -0.9999288 0.9917515 0.9917549 -0.9999437 0.9934704 0.9934725 -0.0000238 0.2706977 0.5501155 -0.0000382 0.2701941 0.549612 -0.0000611 0.2695619 0.5489798 -0.0000978 0.2687698 0.5481876 -0.0001565 0.2677799 0.5471978 -0.0002504 0.2665473 0.5459652 -0.0004008 0.2650195 0.5444373 -0.0006416 0.2631369 0.5425548 -0.0010268 0.260836 0.5402539 -0.0016435 0.2580543 0.5374722 -0.0026305 0.254742 0.5341598 -0.0042103 0.2508825 0.5303003 -0.0067388 0.2465296 0.5259474 -0.0107859 0.2418708 0.5212886 -0.0172633 0.2373343 0.5167521 -0.0276309 0.2337676 0.5131855 -0.0441188 0.2326269 0.5120448 -0.0664212 0.2326269 0.5120448 -0.0946366 0.2326269 0.5120448 -0.1303328 0.2326269 0.5120448 -0.1754932 0.2326269 0.5120448 -0.2326269 0.2326269 0.5120448 -0.3049085 0.2326269 0.5120448 -0.3963542 0.2326269 0.5120448 -0.5120448 0.2326269 0.5120448 -0.6584084 0.2326269 0.5120448 -0.8219901 0.2285954 0.4999841 -0.8967447 0.2121385 0.4384614 -0.9325696 0.2059983 0.3838358 -0.9531389 0.2149085 0.3509254 -0.9661878 0.2383533 0.3405032 -0.9749962 0.2745562 0.3500921 -0.9811943 0.3212519 0.3762922 -0.9856839 0.3758911 0.4154167 -0.9890048 0.4357648 0.4637389 -0.9914995 0.498157 0.5176729 -0.9933953 0.5605276 0.573954 -0.9948487 0.6206891 0.6298046 -0.9959706 0.6769378 0.683051 -0.9968409 0.7281127 0.732167 -0.9975189 0.7735795 0.7762418 -0.9980488 0.8131577 0.8148909 -0.9984638 0.8470154 0.8481355 -0.9987895 0.875558 0.8762773 -0.9990455 0.8993275 0.899787 -0.999247 0.9189234 0.9192157 -0.9994057 0.9349454 0.9351307 -0.9995308 0.9479575 0.9480746 -0.9996295 0.9584677 0.9585415 -0.9997074 0.9669198 0.9669663 -0.9997688 0.973693 0.9737222 -0.9998174 0.9791055 0.9791238 -0.9998557 0.9834209 0.9834324 -0.999886 0.9868555 0.9868627 -0.9999099 0.9895851 0.9895897 -0.9999288 0.9917521 0.9917549 -0.9999437 0.9934707 0.9934725 -0.0000238 0.3429792 0.5501155 -0.0000382 0.3424757 0.549612 -0.0000611 0.3418435 0.5489798 -0.0000978 0.3410514 0.5481876 -0.0001565 0.3400615 0.5471978 -0.0002504 0.3388289 0.5459652 -0.0004008 0.337301 0.5444373 -0.0006416 0.3354185 0.5425548 -0.0010268 0.3331176 0.5402539 -0.0016435 0.3303359 0.5374722 -0.0026305 0.3270236 0.5341598 -0.0042103 0.3231641 0.5303003 -0.0067388 0.3188112 0.5259474 -0.0107859 0.3141524 0.5212886 -0.0172633 0.3096159 0.5167521 -0.0276309 0.3060492 0.5131855 -0.0441188 0.3049085 0.5120448 -0.0664212 0.3049085 0.5120448 -0.0946366 0.3049085 0.5120448 -0.1303328 0.3049085 0.5120448 -0.1754932 0.3049085 0.5120448 -0.2326269 0.3049085 0.5120448 -0.3049085 0.3049085 0.5120448 -0.3963542 0.3049085 0.5120448 -0.5120448 0.3049085 0.5120448 -0.6584084 0.3049085 0.5120448 -0.8219901 0.2988 0.4999841 -0.8967447 0.2706852 0.4384614 -0.9325696 0.2520025 0.3838358 -0.9531389 0.2500942 0.3509254 -0.9661878 0.2647781 0.3405032 -0.9749962 0.2940963 0.3500921 -0.9811943 0.3354901 0.3762922 -0.9856839 0.3861159 0.4154167 -0.9890048 0.4430013 0.4637389 -0.9914995 0.5032055 0.5176729 -0.9933953 0.5640008 0.573954 -0.9948487 0.6230471 0.6298046 -0.9959706 0.6785192 0.683051 -0.9968409 0.7291615 0.732167 -0.9975189 0.7742682 0.7762418 -0.9980488 0.8136061 0.8148909 -0.9984638 0.8473052 0.8481355 -0.9987895 0.8757441 0.8762773 -0.9990455 0.8994464 0.899787 -0.999247 0.918999 0.9192157 -0.9994057 0.9349933 0.9351307 -0.9995308 0.9479878 0.9480746 -0.9996295 0.9584868 0.9585415 -0.9997074 0.9669318 0.9669663 -0.9997688 0.9737006 0.9737222 -0.9998174 0.9791103 0.9791238 -0.9998557 0.9834239 0.9834324 -0.999886 0.9868574 0.9868627 -0.9999099 0.9895863 0.9895897 -0.9999288 0.9917528 0.9917549 -0.9999437 0.9934712 0.9934725 -0.0000238 0.4344249 0.5501155 -0.0000382 0.4339214 0.549612 -0.0000611 0.4332891 0.5489798 -0.0000978 0.432497 0.5481876 -0.0001565 0.4315072 0.5471978 -0.0002504 0.4302746 0.5459652 -0.0004008 0.4287467 0.5444373 -0.0006416 0.4268641 0.5425548 -0.0010268 0.4245633 0.5402539 -0.0016435 0.4217816 0.5374722 -0.0026305 0.4184692 0.5341598 -0.0042103 0.4146097 0.5303003 -0.0067388 0.4102568 0.5259474 -0.0107859 0.405598 0.5212886 -0.0172633 0.4010615 0.5167521 -0.0276309 0.3974949 0.5131855 -0.0441188 0.3963542 0.5120448 -0.0664212 0.3963542 0.5120448 -0.0946366 0.3963542 0.5120448 -0.1303328 0.3963542 0.5120448 -0.1754932 0.3963542 0.5120448 -0.2326269 0.3963542 0.5120448 -0.3049085 0.3963542 0.5120448 -0.3963542 0.3963542 0.5120448 -0.5120448 0.3963542 0.5120448 -0.6584084 0.3963542 0.5120448 -0.8219901 0.3876179 0.4999841 -0.8967447 0.3447543 0.4384614 -0.9325696 0.3102037 0.3838358 -0.9531389 0.2946088 0.3509254 -0.9661878 0.2982089 0.3405032 -0.9749962 0.3188171 0.3500921 -0.9811943 0.3535032 0.3762922 -0.9856839 0.3990515 0.4154167 -0.9890048 0.4521565 0.4637389 -0.9914995 0.5095925 0.5176729 -0.9933953 0.5683949 0.573954 -0.9948487 0.6260304 0.6298046 -0.9959706 0.6805199 0.683051 -0.9968409 0.7304884 0.732167 -0.9975189 0.7751395 0.7762418 -0.9980488 0.8141733 0.8148909 -0.9984638 0.8476717 0.8481355 -0.9987895 0.8759795 0.8762773 -0.9990455 0.8995968 0.899787 -0.999247 0.9190947 0.9192157 -0.9994057 0.935054 0.9351307 -0.9995308 0.9480261 0.9480746 -0.9996295 0.9585109 0.9585415 -0.9997074 0.966947 0.9669663 -0.9997688 0.9737101 0.9737222 -0.9998174 0.9791163 0.9791238 -0.9998557 0.9834277 0.9834324 -0.999886 0.9868597 0.9868627 -0.9999099 0.9895878 0.9895897 -0.9999288 0.9917537 0.9917549 -0.9999437 0.9934718 0.9934725 -0.0000238 0.5501155 0.5501155 -0.0000382 0.549612 0.549612 -0.0000611 0.5489798 0.5489798 -0.0000978 0.5481876 0.5481876 -0.0001565 0.5471978 0.5471978 -0.0002504 0.5459652 0.5459652 -0.0004008 0.5444373 0.5444373 -0.0006416 0.5425548 0.5425548 -0.0010268 0.5402539 0.5402539 -0.0016435 0.5374722 0.5374722 -0.0026305 0.5341598 0.5341598 -0.0042103 0.5303003 0.5303003 -0.0067388 0.5259474 0.5259474 -0.0107859 0.5212886 0.5212886 -0.0172633 0.5167521 0.5167521 -0.0276309 0.5131855 0.5131855 -0.0441188 0.5120448 0.5120448 -0.0664212 0.5120448 0.5120448 -0.0946366 0.5120448 0.5120448 -0.1303328 0.5120448 0.5120448 -0.1754932 0.5120448 0.5120448 -0.2326269 0.5120448 0.5120448 -0.3049085 0.5120448 0.5120448 -0.3963542 0.5120448 0.5120448 -0.5120448 0.5120448 0.5120448 -0.6584084 0.5120448 0.5120448 -0.8219901 0.4999841 0.4999841 -0.8967447 0.4384614 0.4384614 -0.9325696 0.3838358 0.3838358 -0.9531389 0.3509254 0.3509254 -0.9661878 0.3405032 0.3405032 -0.9749962 0.3500921 0.3500921 -0.9811943 0.3762922 0.3762922 -0.9856839 0.4154167 0.4154167 -0.9890048 0.4637389 0.4637389 -0.9914995 0.5176729 0.5176729 -0.9933953 0.573954 0.573954 -0.9948487 0.6298046 0.6298046 -0.9959706 0.683051 0.683051 -0.9968409 0.732167 0.732167 -0.9975189 0.7762418 0.7762418 -0.9980488 0.8148909 0.8148909 -0.9984638 0.8481355 0.8481355 -0.9987895 0.8762773 0.8762773 -0.9990455 0.899787 0.899787 -0.999247 0.9192157 0.9192157 -0.9994057 0.9351307 0.9351307 -0.9995308 0.9480746 0.9480746 -0.9996295 0.9585415 0.9585415 -0.9997074 0.9669663 0.9669663 -0.9997688 0.9737222 0.9737222 -0.9998174 0.9791238 0.9791238 -0.9998557 0.9834324 0.9834324 -0.999886 0.9868627 0.9868627 -0.9999099 0.9895897 0.9895897 -0.9999288 0.9917549 0.9917549 -0.9999437 0.9934725 0.9934725 -0.0000238 0.6964791 0.5501155 -0.0000382 0.6959756 0.549612 -0.0000611 0.6953434 0.5489798 -0.0000978 0.6945513 0.5481876 -0.0001565 0.6935614 0.5471978 -0.0002504 0.6923288 0.5459652 -0.0004008 0.6908009 0.5444373 -0.0006416 0.6889184 0.5425548 -0.0010268 0.6866175 0.5402539 -0.0016435 0.6838358 0.5374722 -0.0026305 0.6805235 0.5341598 -0.0042103 0.676664 0.5303003 -0.0067388 0.6723111 0.5259474 -0.0107859 0.6676523 0.5212886 -0.0172633 0.6631157 0.5167521 -0.0276309 0.6595491 0.5131855 -0.0441188 0.6584084 0.5120448 -0.0664212 0.6584084 0.5120448 -0.0946366 0.6584084 0.5120448 -0.1303328 0.6584084 0.5120448 -0.1754932 0.6584084 0.5120448 -0.2326269 0.6584084 0.5120448 -0.3049085 0.6584084 0.5120448 -0.3963542 0.6584084 0.5120448 -0.5120448 0.6584084 0.5120448 -0.6584084 0.6584084 0.5120448 -0.8219901 0.6421419 0.4999841 -0.8967447 0.557013 0.4384614 -0.9325696 0.4769901 0.3838358 -0.9531389 0.4221733 0.3509254 -0.9661878 0.3940109 0.3405032 -0.9749962 0.389659 0.3500921 -0.9811943 0.4051232 0.3762922 -0.9856839 0.4361208 0.4154167 -0.9890048 0.4783922 0.4637389 -0.9914995 0.5278957 0.5176729 -0.9933953 0.580987 0.573954 -0.9948487 0.6345795 0.6298046 -0.9959706 0.6862532 0.683051 -0.9968409 0.7342907 0.732167 -0.9975189 0.7776364 0.7762418 -0.9980488 0.8157988 0.8148909 -0.9984638 0.8487222 0.8481355 -0.9987895 0.8766541 0.8762773 -0.9990455 0.9000277 0.899787 -0.999247 0.9193688 0.9192157 -0.9994057 0.9352277 0.9351307 -0.9995308 0.9481359 0.9480746 -0.9996295 0.9585802 0.9585415 -0.9997074 0.9669906 0.9669663 -0.9997688 0.9737375 0.9737222 -0.9998174 0.9791334 0.9791238 -0.9998557 0.9834385 0.9834324 -0.999886 0.9868665 0.9868627 -0.9999099 0.989592 0.9895897 -0.9999288 0.9917564 0.9917549 -0.9999437 0.9934734 0.9934725 -0.0051514 0.8407292 0.5265122 -0.0051286 0.8405071 0.5261804 -0.0051047 0.8402274 0.5257632 -0.0050826 0.8398756 0.5252393 -0.0050676 0.8394338 0.524583 -0.0050694 0.8388802 0.5237632 -0.0051048 0.8381886 0.5227429 -0.0052028 0.8373283 0.5214795 -0.0054121 0.8362644 0.519926 -0.0058134 0.8349593 0.5180338 -0.0065402 0.8333779 0.5157602 -0.0078103 0.8314967 0.5130828 -0.0099781 0.8293233 0.5100256 -0.0136166 0.8269342 0.5067085 -0.0196467 0.8245426 0.5034325 -0.0295373 0.8226154 0.5008244 -0.0455041 0.8219901 0.4999841 -0.0671656 0.8219901 0.4999841 -0.0945703 0.8219901 0.4999841 -0.1292408 0.8219901 0.4999841 -0.1731034 0.8219901 0.4999841 -0.2285954 0.8219901 0.4999841 -0.2988 0.8219901 0.4999841 -0.3876179 0.8219901 0.4999841 -0.4999841 0.8219901 0.4999841 -0.6421419 0.8219901 0.4999841 -0.8219901 0.8219901 0.4999841 -0.8967447 0.7069963 0.4384614 -0.9325696 0.5948423 0.3838358 -0.9531389 0.5123112 0.3509254 -0.9661878 0.4617052 0.3405032 -0.9749962 0.4397163 0.3500921 -0.9811943 0.4415982 0.3762922 -0.9856839 0.4623142 0.4154167 -0.9890048 0.4969305 0.4637389 -0.9914995 0.5408288 0.5176729 -0.9933953 0.5898847 0.573954 -0.9948487 0.6406203 0.6298046 -0.9959706 0.6903044 0.683051 -0.9968409 0.7369774 0.732167 -0.9975189 0.7794007 0.7762418 -0.9980488 0.8169474 0.8148909 -0.9984638 0.8494644 0.8481355 -0.9987895 0.8771307 0.8762773 -0.9990455 0.9003323 0.899787 -0.999247 0.9195625 0.9192157 -0.9994057 0.9353505 0.9351307 -0.9995308 0.9482135 0.9480746 -0.9996295 0.9586291 0.9585415 -0.9997074 0.9670214 0.9669663 -0.9997688 0.9737569 0.9737222 -0.9998174 0.9791456 0.9791238 -0.9998557 0.9834461 0.9834324 -0.999886 0.9868713 0.9868627 -0.9999099 0.989595 0.9895897 -0.9999288 0.9917582 0.9917549 -0.9999437 0.9934746 0.9934725 -0.0279321 0.9033413 0.4594768 -0.0278872 0.9032596 0.4592077 -0.0278347 0.9031567 0.4588694 -0.0277752 0.9030276 0.4584451 -0.0277111 0.9028657 0.457914 -0.0276479 0.9026634 0.4572514 -0.0275966 0.9024114 0.4564282 -0.0275778 0.9020992 0.455411 -0.0276281 0.9017148 0.4541634 -0.0278105 0.9012461 0.4526484 -0.0282324 0.900682 0.4508351 -0.0290732 0.9000167 0.4487093 -0.0306306 0.8992555 0.4462949 -0.0333932 0.8984278 0.4436907 -0.0381561 0.8976087 0.4411348 -0.0461985 0.8969554 0.4391112 -0.0594506 0.8967447 0.4384614 -0.0775151 0.8967447 0.4384614 -0.1003691 0.8967447 0.4384614 -0.1292823 0.8967447 0.4384614 -0.1658613 0.8967447 0.4384614 -0.2121385 0.8967447 0.4384614 -0.2706852 0.8967447 0.4384614 -0.3447543 0.8967447 0.4384614 -0.4384614 0.8967447 0.4384614 -0.557013 0.8967447 0.4384614 -0.7069963 0.8967447 0.4384614 -0.8967447 0.8967447 0.4384614 -0.9325696 0.7439407 0.3838358 -0.9531389 0.6263473 0.3509254 -0.9661878 0.5473473 0.3405032 -0.9749962 0.5030453 0.3500921 -0.9811943 0.4877437 0.3762922 -0.9856839 0.4954523 0.4154167 -0.9890048 0.5203839 0.4637389 -0.9914995 0.5571908 0.5176729 -0.9933953 0.6011414 0.573954 -0.9948487 0.6482627 0.6298046 -0.9959706 0.6954296 0.683051 -0.9968409 0.7403765 0.732167 -0.9975189 0.7816327 0.7762418 -0.9980488 0.8184005 0.8148909 -0.9984638 0.8504035 0.8481355 -0.9987895 0.8777338 0.8762773 -0.9990455 0.9007175 0.899787 -0.999247 0.9198076 0.9192157 -0.9994057 0.9355059 0.9351307 -0.9995308 0.9483117 0.9480746 -0.9996295 0.958691 0.9585415 -0.9997074 0.9670604 0.9669663 -0.9997688 0.9737814 0.9737222 -0.9998174 0.979161 0.9791238 -0.9998557 0.9834557 0.9834324 -0.999886 0.9868773 0.9868627 -0.9999099 0.9895988 0.9895897 -0.9999288 0.9917606 0.9917549 -0.9999437 0.9934761 0.9934725 -0.0624569 0.9354466 0.4024964 -0.0624063 0.9354101 0.4022558 -0.0623458 0.9353643 0.4019535 -0.0622749 0.9353068 0.4015743 -0.0621943 0.9352348 0.4010999 -0.0621069 0.9351449 0.4005083 -0.0620199 0.9350332 0.3997736 -0.0619473 0.9348949 0.3988663 -0.061916 0.9347252 0.3977542 -0.0619734 0.9345187 0.3964052 -0.062202 0.9342712 0.3947922 -0.062742 0.9339805 0.3929036 -0.0638283 0.9336494 0.3907618 -0.0658501 0.9332914 0.3884555 -0.0694453 0.9329391 0.3861956 -0.0756464 0.9326595 0.3844091 -0.0860209 0.9325696 0.3838358 -0.1002154 0.9325696 0.3838358 -0.1181733 0.9325696 0.3838358 -0.1408925 0.9325696 0.3838358 -0.1696351 0.9325696 0.3838358 -0.2059983 0.9325696 0.3838358 -0.2520025 0.9325696 0.3838358 -0.3102037 0.9325696 0.3838358 -0.3838358 0.9325696 0.3838358 -0.4769901 0.9325696 0.3838358 -0.5948423 0.9325696 0.3838358 -0.7439407 0.9325696 0.3838358 -0.9325696 0.9325696 0.3838358 -0.9531389 0.7706179 0.3509254 -0.9661878 0.6556956 0.3405032 -0.9749962 0.5831647 0.3500921 -0.9811943 0.5461239 0.3762922 -0.9856839 0.5373763 0.4154167 -0.9890048 0.5500554 0.4637389 -0.9914995 0.577891 0.5176729 -0.9933953 0.6153825 0.573954 -0.9948487 0.6579314 0.6298046 -0.9959706 0.7019138 0.683051 -0.9968409 0.7446768 0.732167 -0.9975189 0.7844566 0.7762418 -0.9980488 0.8202389 0.8148909 -0.9984638 0.8515915 0.8481355 -0.9987895 0.8784967 0.8762773 -0.9990455 0.9012049 0.899787 -0.999247 0.9201176 0.9192157 -0.9994057 0.9357024 0.9351307 -0.9995308 0.9484359 0.9480746 -0.9996295 0.9587693 0.9585415 -0.9997074 0.9671097 0.9669663 -0.9997688 0.9738123 0.9737222 -0.9998174 0.9791804 0.9791238 -0.9998557 0.9834679 0.9834324 -0.999886 0.986885 0.9868627 -0.9999099 0.9896036 0.9895897 -0.9999288 0.9917636 0.9917549 -0.9999437 0.9934779 0.9934725 -0.1059991 0.9545467 0.3671764 -0.1059489 0.9545286 0.3669659 -0.1058883 0.9545059 0.3667014 -0.1058162 0.9544774 0.3663698 -0.1057322 0.9544418 0.3659549 -0.1056375 0.9543974 0.3654378 -0.1055364 0.9543421 0.3647957 -0.1054384 0.9542739 0.3640031 -0.1053624 0.9541902 0.3630322 -0.1053433 0.9540886 0.3618551 -0.1054431 0.9539671 0.3604487 -0.1057683 0.9538247 0.3588035 -0.1064997 0.953663 0.3569395 -0.1079385 0.9534887 0.3549345 -0.1105818 0.9533177 0.3529722 -0.1152388 0.9531823 0.3514224 -0.1231452 0.9531389 0.3509254 -0.1340017 0.9531389 0.3509254 -0.1477366 0.9531389 0.3509254 -0.1651131 0.9531389 0.3509254 -0.1870965 0.9531389 0.3509254 -0.2149085 0.9531389 0.3509254 -0.2500942 0.9531389 0.3509254 -0.2946088 0.9531389 0.3509254 -0.3509254 0.9531389 0.3509254 -0.4221733 0.9531389 0.3509254 -0.5123112 0.9531389 0.3509254 -0.6263473 0.9531389 0.3509254 -0.7706179 0.9531389 0.3509254 -0.9531389 0.9531389 0.3509254 -0.9661878 0.7927704 0.3405032 -0.9749962 0.6845262 0.3500921 -0.9811943 0.6199824 0.3762922 -0.9856839 0.5904156 0.4154167 -0.9890048 0.5875938 0.4637389 -0.9914995 0.6040793 0.5176729 -0.9933953 0.6333995 0.573954 -0.9948487 0.6701635 0.6298046 -0.9959706 0.710117 0.683051 -0.9968409 0.7501172 0.732167 -0.9975189 0.7880291 0.7762418 -0.9980488 0.8225647 0.8148909 -0.9984638 0.8530945 0.8481355 -0.9987895 0.8794619 0.8762773 -0.9990455 0.9018215 0.899787 -0.999247 0.9205098 0.9192157 -0.9994057 0.935951 0.9351307 -0.9995308 0.9485931 0.9480746 -0.9996295 0.9588684 0.9585415 -0.9997074 0.967172 0.9669663 -0.9997688 0.9738515 0.9737222 -0.9998174 0.979205 0.9791238 -0.9998557 0.9834833 0.9834324 -0.999886 0.9868946 0.9868627 -0.9999099 0.9896096 0.9895897 -0.9999288 0.9917674 0.9917549 -0.9999437 0.9934803 0.9934725 -0.1572498 0.9669269 0.3541909 -0.1572031 0.9669173 0.3540129 -0.1571463 0.9669053 0.3537894 -0.1570779 0.9668902 0.353509 -0.1569971 0.9668714 0.3531585 -0.156904 0.9668479 0.3527215 -0.1568008 0.9668187 0.3521792 -0.1566936 0.9667827 0.3515099 -0.1565954 0.9667385 0.3506904 -0.1565315 0.966685 0.3496974 -0.1565473 0.9666211 0.3485116 -0.1567226 0.9665463 0.3471256 -0.1571937 0.9664615 0.3455565 -0.15819 0.9663702 0.3438702 -0.160092 0.9662809 0.3422213 -0.1635226 0.9662104 0.3409202 -0.1694384 0.9661878 0.3405032 -0.1775917 0.9661878 0.3405032 -0.1879067 0.9661878 0.3405032 -0.2009566 0.9661878 0.3405032 -0.2174663 0.9661878 0.3405032 -0.2383533 0.9661878 0.3405032 -0.2647781 0.9661878 0.3405032 -0.2982089 0.9661878 0.3405032 -0.3405032 0.9661878 0.3405032 -0.3940109 0.9661878 0.3405032 -0.4617052 0.9661878 0.3405032 -0.5473473 0.9661878 0.3405032 -0.6556956 0.9661878 0.3405032 -0.7927704 0.9661878 0.3405032 -0.9661878 0.9661878 0.3405032 -0.9749962 0.8127617 0.3500921 -0.9811943 0.713423 0.3762922 -0.9856839 0.6575172 0.4154167 -0.9890048 0.6350848 0.4637389 -0.9914995 0.637211 0.5176729 -0.9933953 0.6561933 0.573954 -0.9948487 0.6856388 0.6298046 -0.9959706 0.7204952 0.683051 -0.9968409 0.757 0.732167 -0.9975189 0.7925488 0.7762418 -0.9980488 0.8255071 0.8148909 -0.9984638 0.8549959 0.8481355 -0.9987895 0.880683 0.8762773 -0.9990455 0.9026016 0.899787 -0.999247 0.9210061 0.9192157 -0.9994057 0.9362655 0.9351307 -0.9995308 0.9487918 0.9480746 -0.9996295 0.9589938 0.9585415 -0.9997074 0.9672509 0.9669663 -0.9997688 0.9739011 0.9737222 -0.9998174 0.9792361 0.9791238 -0.9998557 0.9835029 0.9834324 -0.999886 0.9869069 0.9868627 -0.9999099 0.9896173 0.9895897 -0.9999288 0.9917722 0.9917549 -0.9999437 0.9934833 0.9934725 -0.2151269 0.9754027 0.3612712 -0.2150852 0.9753975 0.3611254 -0.2150342 0.9753908 0.3609422 -0.2149725 0.9753825 0.3607126 -0.2148987 0.9753721 0.3604255 -0.2148124 0.9753591 0.3600677 -0.2147144 0.975343 0.3596237 -0.2146085 0.9753231 0.359076 -0.2145034 0.9752987 0.3584055 -0.2144168 0.9752692 0.3575934 -0.2143816 0.975234 0.3566242 -0.2144566 0.9751928 0.3554919 -0.2147432 0.9751462 0.354211 -0.2154135 0.9750962 0.3528354 -0.2167545 0.9750472 0.3514914 -0.2192389 0.9750086 0.3504316 -0.2235962 0.9749962 0.3500921 -0.2296253 0.9749962 0.3500921 -0.2372529 0.9749962 0.3500921 -0.2469027 0.9749962 0.3500921 -0.2591111 0.9749962 0.3500921 -0.2745562 0.9749962 0.3500921 -0.2940963 0.9749962 0.3500921 -0.3188171 0.9749962 0.3500921 -0.3500921 0.9749962 0.3500921 -0.389659 0.9749962 0.3500921 -0.4397163 0.9749962 0.3500921 -0.5030453 0.9749962 0.3500921 -0.5831647 0.9749962 0.3500921 -0.6845262 0.9749962 0.3500921 -0.8127617 0.9749962 0.3500921 -0.9749962 0.9749962 0.3500921 -0.9811943 0.8316375 0.3762922 -0.9856839 0.7424095 0.4154167 -0.9890048 0.695167 0.4637389 -0.9914995 0.6791269 0.5176729 -0.9933953 0.6850303 0.573954 -0.9948487 0.7052169 0.6298046 -0.9959706 0.733625 0.683051 -0.9968409 0.7657077 0.732167 -0.9975189 0.7982669 0.7762418 -0.9980488 0.8292297 0.8148909 -0.9984638 0.8574015 0.8481355 -0.9987895 0.8822279 0.8762773 -0.9990455 0.9035886 0.899787 -0.999247 0.9216339 0.9192157 -0.9994057 0.9366635 0.9351307 -0.9995308 0.9490434 0.9480746 -0.9996295 0.9591524 0.9585415 -0.9997074 0.9673508 0.9669663 -0.9997688 0.9739638 0.9737222 -0.9998174 0.9792755 0.9791238 -0.9998557 0.9835276 0.9834324 -0.999886 0.9869223 0.9868627 -0.9999099 0.989627 0.9895897 -0.9999288 0.9917782 0.9917549 -0.9999437 0.9934871 0.9934725 -0.2783684 0.9814251 0.3851765 -0.2783325 0.9814221 0.3850603 -0.2782884 0.9814183 0.3849144 -0.2782347 0.9814136 0.3847314 -0.2781701 0.9814076 0.3845027 -0.2780936 0.9814002 0.3842178 -0.2780055 0.9813911 0.3838642 -0.2779077 0.9813797 0.3834282 -0.2778058 0.9813659 0.3828946 -0.2777122 0.9813491 0.3822485 -0.2776503 0.9813291 0.3814778 -0.2776626 0.9813057 0.3805778 -0.2778236 0.9812792 0.3795602 -0.2782606 0.9812508 0.3784681 -0.2791873 0.9812231 0.3774018 -0.2809573 0.9812013 0.3765614 -0.2841192 0.9811943 0.3762922 -0.2885124 0.9811943 0.3762922 -0.2940703 0.9811943 0.3762922 -0.3011018 0.9811943 0.3762922 -0.3099976 0.9811943 0.3762922 -0.3212519 0.9811943 0.3762922 -0.3354901 0.9811943 0.3762922 -0.3535032 0.9811943 0.3762922 -0.3762922 0.9811943 0.3762922 -0.4051232 0.9811943 0.3762922 -0.4415982 0.9811943 0.3762922 -0.4877437 0.9811943 0.3762922 -0.5461239 0.9811943 0.3762922 -0.6199824 0.9811943 0.3762922 -0.713423 0.9811943 0.3762922 -0.8316375 0.9811943 0.3762922 -0.9811943 0.9811943 0.3762922 -0.9856839 0.8498092 0.4154167 -0.9890048 0.7711789 0.4637389 -0.9914995 0.7321559 0.5176729 -0.9933953 0.721513 0.573954 -0.9948487 0.7299859 0.6298046 -0.9959706 0.7502359 0.683051 -0.9968409 0.776724 0.732167 -0.9975189 0.8055009 0.7762418 -0.9980488 0.8339392 0.8148909 -0.9984638 0.8604449 0.8481355 -0.9987895 0.8841823 0.8762773 -0.9990455 0.9048372 0.899787 -0.999247 0.9224281 0.9192157 -0.9994057 0.9371669 0.9351307 -0.9995308 0.9493615 0.9480746 -0.9996295 0.959353 0.9585415 -0.9997074 0.967477 0.9669663 -0.9997688 0.9740432 0.9737222 -0.9998174 0.9793253 0.9791238 -0.9998557 0.9835588 0.9834324 -0.999886 0.9869419 0.9868627 -0.9999099 0.9896392 0.9895897 -0.9999288 0.9917859 0.9917549 -0.9999437 0.9934919 0.9934725 -0.3454107 0.9858181 0.4223035 -0.3453807 0.9858163 0.4222132 -0.3453439 0.9858141 0.4220999 -0.3452987 0.9858113 0.4219578 -0.3452442 0.9858079 0.4217802 -0.3451791 0.9858036 0.4215589 -0.3451032 0.9857982 0.4212844 -0.3450175 0.9857916 0.420946 -0.3449254 0.9857835 0.4205319 -0.3448353 0.9857738 0.4200306 -0.3447636 0.9857621 0.4194328 -0.3447407 0.9857485 0.4187351 -0.3448204 0.9857332 0.4179465 -0.3450957 0.9857167 0.4171007 -0.3457234 0.9857006 0.4162752 -0.3469645 0.9856879 0.4156249 -0.3492254 0.9856839 0.4154167 -0.3523802 0.9856839 0.4154167 -0.3563715 0.9856839 0.4154167 -0.3614209 0.9856839 0.4154167 -0.3678092 0.9856839 0.4154167 -0.3758911 0.9856839 0.4154167 -0.3861159 0.9856839 0.4154167 -0.3990515 0.9856839 0.4154167 -0.4154167 0.9856839 0.4154167 -0.4361208 0.9856839 0.4154167 -0.4623142 0.9856839 0.4154167 -0.4954523 0.9856839 0.4154167 -0.5373763 0.9856839 0.4154167 -0.5904156 0.9856839 0.4154167 -0.6575172 0.9856839 0.4154167 -0.7424095 0.9856839 0.4154167 -0.8498092 0.9856839 0.4154167 -0.9856839 0.9856839 0.4154167 -0.9890048 0.8673437 0.4637389 -0.9914995 0.7992446 0.5176729 -0.9933953 0.7676683 0.573954 -0.9948487 0.7613218 0.6298046 -0.9959706 0.7712508 0.683051 -0.9968409 0.7906611 0.732167 -0.9975189 0.8146529 0.7762418 -0.9980488 0.8398974 0.8148909 -0.9984638 0.8642952 0.8481355 -0.9987895 0.886655 0.8762773 -0.9990455 0.9064168 0.899787 -0.999247 0.9234329 0.9192157 -0.9994057 0.9378038 0.9351307 -0.9995308 0.9497641 0.9480746 -0.9996295 0.9596068 0.9585415 -0.9997074 0.9676368 0.9669663 -0.9997688 0.9741436 0.9737222 -0.9998174 0.9793883 0.9791238 -0.9998557 0.9835983 0.9834324 -0.999886 0.9869667 0.9868627 -0.9999099 0.9896547 0.9895897 -0.9999288 0.9917956 0.9917549 -0.9999437 0.993498 0.9934725 -0.4144197 0.9890841 0.468954 -0.4143955 0.9890831 0.4688855 -0.4143657 0.9890818 0.4687996 -0.414329 0.9890801 0.4686918 -0.4142845 0.9890781 0.4685571 -0.4142311 0.9890755 0.4683893 -0.4141683 0.9890723 0.4681812 -0.4140964 0.9890684 0.4679246 -0.4140176 0.9890637 0.4676107 -0.4139373 0.9890579 0.4672309 -0.4138668 0.989051 0.466778 -0.4138277 0.989043 0.4662495 -0.4138582 0.9890339 0.4656526 -0.4140252 0.9890241 0.4650125 -0.4144423 0.9890146 0.464388 -0.4152991 0.9890072 0.4638963 -0.4168922 0.9890048 0.4637389 -0.419125 0.9890048 0.4637389 -0.4219498 0.9890048 0.4637389 -0.4255236 0.9890048 0.4637389 -0.4300448 0.9890048 0.4637389 -0.4357648 0.9890048 0.4637389 -0.4430013 0.9890048 0.4637389 -0.4521565 0.9890048 0.4637389 -0.4637389 0.9890048 0.4637389 -0.4783922 0.9890048 0.4637389 -0.4969305 0.9890048 0.4637389 -0.5203839 0.9890048 0.4637389 -0.5500554 0.9890048 0.4637389 -0.5875938 0.9890048 0.4637389 -0.6350848 0.9890048 0.4637389 -0.695167 0.9890048 0.4637389 -0.7711789 0.9890048 0.4637389 -0.8673437 0.9890048 0.4637389 -0.9890048 0.9890048 0.4637389 -0.9914995 0.8841204 0.5176729 -0.9933953 0.8260608 0.573954 -0.9948487 0.8009659 0.6298046 -0.9959706 0.7978374 0.683051 -0.9968409 0.8082934 0.732167 -0.9975189 0.8262314 0.7762418 -0.9980488 0.8474353 0.8148909 -0.9984638 0.8691663 0.8481355 -0.9987895 0.8897832 0.8762773 -0.9990455 0.9084153 0.899787 -0.999247 0.9247041 0.9192157 -0.9994057 0.9386096 0.9351307 -0.9995308 0.9502734 0.9480746 -0.9996295 0.959928 0.9585415 -0.9997074 0.9678389 0.9669663 -0.9997688 0.9742706 0.9737222 -0.9998174 0.9794681 0.9791238 -0.9998557 0.9836483 0.9834324 -0.999886 0.986998 0.9868627 -0.9999099 0.9896744 0.9895897 -0.9999288 0.9918079 0.9917549 -0.9999437 0.9935057 0.9934725 -0.4834235 0.9915469 0.5215352 -0.4834045 0.9915463 0.5214844 -0.4833811 0.9915455 0.5214207 -0.4833522 0.9915446 0.5213408 -0.4833171 0.9915433 0.5212409 -0.4832747 0.9915418 0.5211165 -0.4832246 0.9915399 0.5209622 -0.4831666 0.9915376 0.520772 -0.4831021 0.9915347 0.5205393 -0.4830346 0.9915312 0.5202578 -0.4829718 0.9915271 0.5199223 -0.4829286 0.9915223 0.5195309 -0.4829319 0.9915169 0.5190889 -0.4830292 0.991511 0.5186151 -0.4833013 0.9915054 0.5181531 -0.4838841 0.9915009 0.5177893 -0.4849907 0.9914995 0.5176729 -0.4865484 0.9914995 0.5176729 -0.4885191 0.9914995 0.5176729 -0.4910123 0.9914995 0.5176729 -0.4941665 0.9914995 0.5176729 -0.498157 0.9914995 0.5176729 -0.5032055 0.9914995 0.5176729 -0.5095925 0.9914995 0.5176729 -0.5176729 0.9914995 0.5176729 -0.5278957 0.9914995 0.5176729 -0.5408288 0.9914995 0.5176729 -0.5571908 0.9914995 0.5176729 -0.577891 0.9914995 0.5176729 -0.6040793 0.9914995 0.5176729 -0.637211 0.9914995 0.5176729 -0.6791269 0.9914995 0.5176729 -0.7321559 0.9914995 0.5176729 -0.7992446 0.9914995 0.5176729 -0.8841204 0.9914995 0.5176729 -0.9914995 0.9914995 0.5176729 -0.9933953 0.8999349 0.573954 -0.9948487 0.8511207 0.6298046 -0.9959706 0.8314729 0.683051 -0.9968409 0.8306004 0.732167 -0.9975189 0.8408797 0.7762418 -0.9980488 0.8569716 0.8148909 -0.9984638 0.875329 0.8481355 -0.9987895 0.8937407 0.8762773 -0.9990455 0.9109436 0.899787 -0.999247 0.9263124 0.9192157 -0.9994057 0.939629 0.9351307 -0.9995308 0.9509177 0.9480746 -0.9996295 0.9603343 0.9585415 -0.9997074 0.9680946 0.9669663 -0.9997688 0.9744313 0.9737222 -0.9998174 0.9795689 0.9791238 -0.9998557 0.9837116 0.9834324 -0.999886 0.9870376 0.9868627 -0.9999099 0.9896992 0.9895897 -0.9999288 0.9918234 0.9917549 -0.9999437 0.9935154 0.9934725 -0.5504963 0.993424 0.5767543 -0.5504818 0.9934236 0.5767175 -0.550464 0.9934231 0.5766712 -0.5504419 0.9934225 0.5766132 -0.550415 0.9934218 0.5765407 -0.5503825 0.9934209 0.5764504 -0.5503438 0.9934197 0.5763385 -0.5502987 0.9934183 0.5762005 -0.550248 0.9934166 0.5760317 -0.5501939 0.9934145 0.5758275 -0.5501416 0.993412 0.5755841 -0.5501012 0.9934091 0.5753003 -0.5500915 0.9934058 0.5749799 -0.5501456 0.9934023 0.5746366 -0.5503203 0.9933988 0.5743018 -0.5507113 0.9933961 0.5740383 -0.5514695 0.9933953 0.573954 -0.5525411 0.9933953 0.573954 -0.5538969 0.9933953 0.573954 -0.5556122 0.9933953 0.573954 -0.5577822 0.9933953 0.573954 -0.5605276 0.9933953 0.573954 -0.5640008 0.9933953 0.573954 -0.5683949 0.9933953 0.573954 -0.573954 0.9933953 0.573954 -0.580987 0.9933953 0.573954 -0.5898847 0.9933953 0.573954 -0.6011414 0.9933953 0.573954 -0.6153825 0.9933953 0.573954 -0.6333995 0.9933953 0.573954 -0.6561933 0.9933953 0.573954 -0.6850303 0.9933953 0.573954 -0.721513 0.9933953 0.573954 -0.7676683 0.9933953 0.573954 -0.8260608 0.9933953 0.573954 -0.8999349 0.9933953 0.573954 -0.9933953 0.9933953 0.573954 -0.9948487 0.9145732 0.6298046 -0.9959706 0.8740262 0.683051 -0.9968409 0.8588218 0.732167 -0.9975189 0.8594117 0.7762418 -0.9980488 0.8690364 0.8148909 -0.9984638 0.8831255 0.8481355 -0.9987895 0.8987476 0.8762773 -0.9990455 0.9141422 0.899787 -0.999247 0.928347 0.9192157 -0.9994057 0.9409186 0.9351307 -0.9995308 0.9517328 0.9480746 -0.9996295 0.9608482 0.9585415 -0.9997074 0.9684181 0.9669663 -0.9997688 0.9746346 0.9737222 -0.9998174 0.9796966 0.9791238 -0.9998557 0.9837916 0.9834324 -0.999886 0.9870878 0.9868627 -0.9999099 0.9897306 0.9895897 -0.9999288 0.9918431 0.9917549 -0.9999437 0.9935277 0.9934725 -0.6139459 0.9948662 0.6317947 -0.6139352 0.994866 0.6317685 -0.6139219 0.9948657 0.6317356 -0.6139056 0.9948653 0.6316943 -0.6138855 0.9948649 0.6316428 -0.6138613 0.9948643 0.6315785 -0.6138323 0.9948636 0.6314989 -0.6137984 0.9948628 0.6314008 -0.6137599 0.9948617 0.6312808 -0.6137183 0.9948604 0.6311356 -0.6136769 0.9948589 0.6309626 -0.6136427 0.9948571 0.6307609 -0.6136284 0.9948551 0.6305332 -0.6136569 0.994853 0.6302893 -0.6137675 0.9948509 0.6300515 -0.6140266 0.9948493 0.6298645 -0.6145393 0.9948487 0.6298046 -0.6152669 0.9948487 0.6298046 -0.6161874 0.9948487 0.6298046 -0.6173519 0.9948487 0.6298046 -0.6188252 0.9948487 0.6298046 -0.6206891 0.9948487 0.6298046 -0.6230471 0.9948487 0.6298046 -0.6260304 0.9948487 0.6298046 -0.6298046 0.9948487 0.6298046 -0.6345795 0.9948487 0.6298046 -0.6406203 0.9948487 0.6298046 -0.6482627 0.9948487 0.6298046 -0.6579314 0.9948487 0.6298046 -0.6701635 0.9948487 0.6298046 -0.6856388 0.9948487 0.6298046 -0.7052169 0.9948487 0.6298046 -0.7299859 0.9948487 0.6298046 -0.7613218 0.9948487 0.6298046 -0.8009659 0.9948487 0.6298046 -0.8511207 0.9948487 0.6298046 -0.9145732 0.9948487 0.6298046 -0.9948487 0.9948487 0.6298046 -0.9959706 0.9278617 0.683051 -0.9968409 0.8945255 0.732167 -0.9975189 0.8828571 0.7762418 -0.9980488 0.8842998 0.8148909 -0.9984638 0.892989 0.8481355 -0.9987895 0.9050819 0.8762773 -0.9990455 0.9181889 0.899787 -0.999247 0.9309211 0.9192157 -0.9994057 0.9425502 0.9351307 -0.9995308 0.952764 0.9480746 -0.9996295 0.9614985 0.9585415 -0.9997074 0.9688274 0.9669663 -0.9997688 0.9748918 0.9737222 -0.9998174 0.979858 0.9791238 -0.9998557 0.9838928 0.9834324 -0.999886 0.9871512 0.9868627 -0.9999099 0.9897703 0.9895897 -0.9999288 0.991868 0.9917549 -0.9999437 0.9935432 0.9934725 -0.6724572 0.9959813 0.6844392 -0.6724495 0.9959811 0.6844209 -0.6724399 0.9959809 0.684398 -0.672428 0.9959807 0.6843692 -0.6724135 0.9959804 0.6843332 -0.6723959 0.9959801 0.6842884 -0.6723748 0.9959797 0.6842328 -0.67235 0.9959791 0.6841643 -0.6723217 0.9959785 0.6840805 -0.6722907 0.9959777 0.6839792 -0.6722594 0.9959768 0.6838586 -0.6722322 0.9959757 0.6837178 -0.672218 0.9959745 0.683559 -0.672232 0.9959732 0.6833889 -0.6723012 0.9959719 0.6832232 -0.6724711 0.9959709 0.6830927 -0.6728136 0.9959706 0.683051 -0.6733015 0.9959706 0.683051 -0.6739188 0.9959706 0.683051 -0.6746998 0.9959706 0.683051 -0.6756878 0.9959706 0.683051 -0.6769378 0.9959706 0.683051 -0.6785192 0.9959706 0.683051 -0.6805199 0.9959706 0.683051 -0.683051 0.9959706 0.683051 -0.6862532 0.9959706 0.683051 -0.6903044 0.9959706 0.683051 -0.6954296 0.9959706 0.683051 -0.7019138 0.9959706 0.683051 -0.710117 0.9959706 0.683051 -0.7204952 0.9959706 0.683051 -0.733625 0.9959706 0.683051 -0.7502359 0.9959706 0.683051 -0.7712508 0.9959706 0.683051 -0.7978374 0.9959706 0.683051 -0.8314729 0.9959706 0.683051 -0.8740262 0.9959706 0.683051 -0.9278617 0.9959706 0.683051 -0.9959706 0.9959706 0.683051 -0.9968409 0.9396953 0.732167 -0.9975189 0.9125186 0.7762418 -0.9980488 0.9036101 0.8148909 -0.9984638 0.9054678 0.8481355 -0.9987895 0.9130957 0.8762773 -0.9990455 0.9233085 0.899787 -0.999247 0.9341777 0.9192157 -0.9994057 0.9446144 0.9351307 -0.9995308 0.9540687 0.9480746 -0.9996295 0.9623212 0.9585415 -0.9997074 0.9693452 0.9669663 -0.9997688 0.9752172 0.9737222 -0.9998174 0.9800622 0.9791238 -0.9998557 0.9840209 0.9834324 -0.999886 0.9872315 0.9868627 -0.9999099 0.9898206 0.9895897 -0.9999288 0.9918994 0.9917549 -0.9999437 0.9935629 0.9934725 -0.7251659 0.9968475 0.7331191 -0.7251605 0.9968474 0.7331065 -0.7251537 0.9968473 0.7330907 -0.7251454 0.9968472 0.733071 -0.7251351 0.996847 0.7330463 -0.7251226 0.9968468 0.7330155 -0.7251076 0.9968465 0.7329774 -0.7250899 0.9968462 0.7329304 -0.7250697 0.9968458 0.7328729 -0.7250473 0.9968453 0.7328035 -0.7250244 0.9968448 0.7327207 -0.7250039 0.9968441 0.7326242 -0.7249916 0.9968433 0.7325153 -0.7249978 0.9968425 0.7323986 -0.7250408 0.9968418 0.732285 -0.7251511 0.9968411 0.7321956 -0.7253775 0.9968409 0.732167 -0.7257011 0.9968409 0.732167 -0.7261105 0.9968409 0.732167 -0.7266285 0.9968409 0.732167 -0.7272837 0.9968409 0.732167 -0.7281127 0.9968409 0.732167 -0.7291615 0.9968409 0.732167 -0.7304884 0.9968409 0.732167 -0.732167 0.9968409 0.732167 -0.7342907 0.9968409 0.732167 -0.7369774 0.9968409 0.732167 -0.7403765 0.9968409 0.732167 -0.7446768 0.9968409 0.732167 -0.7501172 0.9968409 0.732167 -0.757 0.9968409 0.732167 -0.7657077 0.9968409 0.732167 -0.776724 0.9968409 0.732167 -0.7906611 0.9968409 0.732167 -0.8082934 0.9968409 0.732167 -0.8306004 0.9968409 0.732167 -0.8588218 0.9968409 0.732167 -0.8945255 0.9968409 0.732167 -0.9396953 0.9968409 0.732167 -0.9968409 0.9968409 0.732167 -0.9975189 0.9500442 0.7762418 -0.9980488 0.9280401 0.8148909 -0.9984638 0.921255 0.8481355 -0.9987895 0.9232341 0.8762773 -0.9990455 0.9297854 0.899787 -0.999247 0.9382977 0.9192157 -0.9994057 0.9472259 0.9351307 -0.9995308 0.9557192 0.9480746 -0.9996295 0.963362 0.9585415 -0.9997074 0.9700002 0.9669663 -0.9997688 0.9756289 0.9737222 -0.9998174 0.9803206 0.9791238 -0.9998557 0.9841829 0.9834324 -0.999886 0.987333 0.9868627 -0.9999099 0.9898842 0.9895897 -0.9999288 0.9919392 0.9917549 -0.9999437 0.9935878 0.9934725 -0.7716588 0.997523 0.776885 -0.7716551 0.997523 0.7768765 -0.7716504 0.9975229 0.7768658 -0.7716446 0.9975228 0.7768525 -0.7716375 0.9975227 0.7768358 -0.7716288 0.9975226 0.776815 -0.7716184 0.9975224 0.7767892 -0.7716061 0.9975222 0.7767575 -0.7715919 0.997522 0.7767186 -0.7715762 0.9975217 0.7766717 -0.7715599 0.9975213 0.7766158 -0.7715449 0.9975209 0.7765506 -0.7715352 0.9975204 0.776477 -0.7715376 0.9975199 0.7763982 -0.7715641 0.9975194 0.7763215 -0.7716352 0.9975191 0.7762611 -0.7717834 0.9975189 0.7762418 -0.7719959 0.9975189 0.7762418 -0.7722648 0.9975189 0.7762418 -0.7726049 0.9975189 0.7762418 -0.7730352 0.9975189 0.7762418 -0.7735795 0.9975189 0.7762418 -0.7742682 0.9975189 0.7762418 -0.7751395 0.9975189 0.7762418 -0.7762418 0.9975189 0.7762418 -0.7776364 0.9975189 0.7762418 -0.7794007 0.9975189 0.7762418 -0.7816327 0.9975189 0.7762418 -0.7844566 0.9975189 0.7762418 -0.7880291 0.9975189 0.7762418 -0.7925488 0.9975189 0.7762418 -0.7982669 0.9975189 0.7762418 -0.8055009 0.9975189 0.7762418 -0.8146529 0.9975189 0.7762418 -0.8262314 0.9975189 0.7762418 -0.8408797 0.9975189 0.7762418 -0.8594117 0.9975189 0.7762418 -0.8828571 0.9975189 0.7762418 -0.9125186 0.9975189 0.7762418 -0.9500442 0.9975189 0.7762418 -0.9975189 0.9975189 0.7762418 -0.9980488 0.9589472 0.8148909 -0.9984638 0.9412278 0.8481355 -0.9987895 0.9360606 0.8762773 -0.9990455 0.9379796 0.899787 -0.999247 0.94351 0.9192157 -0.9994057 0.9505298 0.9351307 -0.9995308 0.9578074 0.9480746 -0.9996295 0.9646787 0.9585415 -0.9997074 0.970829 0.9669663 -0.9997688 0.9761497 0.9737222 -0.9998174 0.9806476 0.9791238 -0.9998557 0.984388 0.9834324 -0.999886 0.9874615 0.9868627 -0.9999099 0.9899646 0.9895897 -0.9999288 0.9919896 0.9917549 -0.9999437 0.9936193 0.9934725 -0.8119154 0.9980513 0.8153196 -0.8119128 0.9980512 0.815314 -0.8119096 0.9980512 0.8153069 -0.8119057 0.9980511 0.815298 -0.8119009 0.9980511 0.8152868 -0.8118949 0.998051 0.815273 -0.8118878 0.9980509 0.8152558 -0.8118794 0.9980508 0.8152346 -0.8118697 0.9980506 0.8152087 -0.8118589 0.9980504 0.8151774 -0.8118476 0.9980502 0.8151401 -0.811837 0.99805 0.8150967 -0.8118298 0.9980497 0.8150477 -0.8118303 0.9980494 0.8149952 -0.8118466 0.9980491 0.814944 -0.8118921 0.9980488 0.8149038 -0.8119884 0.9980488 0.8148909 -0.8121268 0.9980488 0.8148909 -0.8123018 0.9980488 0.8148909 -0.8125232 0.9980488 0.8148909 -0.8128033 0.9980488 0.8148909 -0.8131577 0.9980488 0.8148909 -0.8136061 0.9980488 0.8148909 -0.8141733 0.9980488 0.8148909 -0.8148909 0.9980488 0.8148909 -0.8157988 0.9980488 0.8148909 -0.8169474 0.9980488 0.8148909 -0.8184005 0.9980488 0.8148909 -0.8202389 0.9980488 0.8148909 -0.8225647 0.9980488 0.8148909 -0.8255071 0.9980488 0.8148909 -0.8292297 0.9980488 0.8148909 -0.8339392 0.9980488 0.8148909 -0.8398974 0.9980488 0.8148909 -0.8474353 0.9980488 0.8148909 -0.8569716 0.9980488 0.8148909 -0.8690364 0.9980488 0.8148909 -0.8842998 0.9980488 0.8148909 -0.9036101 0.9980488 0.8148909 -0.9280401 0.9980488 0.8148909 -0.9589472 0.9980488 0.8148909 -0.9980488 0.9980488 0.8148909 -0.9984638 0.9664961 0.8481355 -0.9987895 0.9522877 0.8762773 -0.9990455 0.9483463 0.899787 -0.999247 0.9501042 0.9192157 -0.9994057 0.9547096 0.9351307 -0.9995308 0.9604492 0.9480746 -0.9996295 0.9663445 0.9585415 -0.9997074 0.9718774 0.9669663 -0.9997688 0.9768086 0.9737222 -0.9998174 0.9810611 0.9791238 -0.9998557 0.9846473 0.9834324 -0.999886 0.987624 0.9868627 -0.9999099 0.9900664 0.9895897 -0.9999288 0.9920533 0.9917549 -0.9999437 0.9936592 0.9934725 -0.8462171 0.9984653 0.848418 -0.8462154 0.9984653 0.8484142 -0.8462132 0.9984653 0.8484096 -0.8462106 0.9984653 0.8484037 -0.8462073 0.9984652 0.8483964 -0.8462034 0.9984652 0.8483872 -0.8461986 0.9984651 0.8483759 -0.8461929 0.998465 0.8483619 -0.8461864 0.9984649 0.8483449 -0.8461791 0.9984648 0.8483242 -0.8461714 0.9984647 0.8482997 -0.8461641 0.9984645 0.848271 -0.8461589 0.9984643 0.8482387 -0.8461587 0.9984642 0.8482042 -0.8461687 0.998464 0.8481705 -0.8461977 0.9984638 0.848144 -0.8462598 0.9984638 0.8481355 -0.8463492 0.9984638 0.8481355 -0.8464623 0.9984638 0.8481355 -0.8466054 0.9984638 0.8481355 -0.8467864 0.9984638 0.8481355 -0.8470154 0.9984638 0.8481355 -0.8473052 0.9984638 0.8481355 -0.8476717 0.9984638 0.8481355 -0.8481355 0.9984638 0.8481355 -0.8487222 0.9984638 0.8481355 -0.8494644 0.9984638 0.8481355 -0.8504035 0.9984638 0.8481355 -0.8515915 0.9984638 0.8481355 -0.8530945 0.9984638 0.8481355 -0.8549959 0.9984638 0.8481355 -0.8574015 0.9984638 0.8481355 -0.8604449 0.9984638 0.8481355 -0.8642952 0.9984638 0.8481355 -0.8691663 0.9984638 0.8481355 -0.875329 0.9984638 0.8481355 -0.8831255 0.9984638 0.8481355 -0.892989 0.9984638 0.8481355 -0.9054678 0.9984638 0.8481355 -0.921255 0.9984638 0.8481355 -0.9412278 0.9984638 0.8481355 -0.9664961 0.9984638 0.8481355 -0.9984638 0.9984638 0.8481355 -0.9987895 0.9728171 0.8762773 -0.9990455 0.9614615 0.899787 -0.999247 0.9584468 0.9192157 -0.9994057 0.9599976 0.9351307 -0.9995308 0.9637914 0.9480746 -0.9996295 0.968452 0.9585415 -0.9997074 0.9732039 0.9669663 -0.9997688 0.9776422 0.9737222 -0.9998174 0.9815844 0.9791238 -0.9998557 0.9849754 0.9834324 -0.999886 0.9878296 0.9868627 -0.9999099 0.9901951 0.9895897 -0.9999288 0.9921339 0.9917549 -0.9999437 0.9937096 0.9934725 -0.8750477 0.9987905 0.8764616 -0.8750466 0.9987905 0.8764592 -0.8750451 0.9987904 0.8764561 -0.8750434 0.9987904 0.8764523 -0.8750412 0.9987904 0.8764475 -0.8750386 0.9987904 0.8764415 -0.8750355 0.9987903 0.8764342 -0.8750317 0.9987903 0.876425 -0.8750274 0.9987902 0.8764139 -0.8750225 0.9987902 0.8764004 -0.8750173 0.9987901 0.8763844 -0.8750124 0.99879 0.8763657 -0.8750088 0.9987899 0.8763446 -0.8750084 0.9987897 0.8763221 -0.8750145 0.9987896 0.8763001 -0.8750329 0.9987895 0.8762828 -0.8750727 0.9987895 0.8762773 -0.8751301 0.9987895 0.8762773 -0.8752028 0.9987895 0.8762773 -0.8752947 0.9987895 0.8762773 -0.8754109 0.9987895 0.8762773 -0.875558 0.9987895 0.8762773 -0.8757441 0.9987895 0.8762773 -0.8759795 0.9987895 0.8762773 -0.8762773 0.9987895 0.8762773 -0.8766541 0.9987895 0.8762773 -0.8771307 0.9987895 0.8762773 -0.8777338 0.9987895 0.8762773 -0.8784967 0.9987895 0.8762773 -0.8794619 0.9987895 0.8762773 -0.880683 0.9987895 0.8762773 -0.8822279 0.9987895 0.8762773 -0.8841823 0.9987895 0.8762773 -0.886655 0.9987895 0.8762773 -0.8897832 0.9987895 0.8762773 -0.8937407 0.9987895 0.8762773 -0.8987476 0.9987895 0.8762773 -0.9050819 0.9987895 0.8762773 -0.9130957 0.9987895 0.8762773 -0.9232341 0.9987895 0.8762773 -0.9360606 0.9987895 0.8762773 -0.9522877 0.9987895 0.8762773 -0.9728171 0.9987895 0.8762773 -0.9987895 0.9987895 0.8762773 -0.9990455 0.9780539 0.899787 -0.999247 0.9690013 0.9192157 -0.9994057 0.9666876 0.9351307 -0.9995308 0.9680197 0.9480746 -0.9996295 0.9711183 0.9585415 -0.9997074 0.974882 0.9669663 -0.9997688 0.9786968 0.9737222 -0.9998174 0.9822464 0.9791238 -0.9998557 0.9853905 0.9834324 -0.999886 0.9880897 0.9868627 -0.9999099 0.990358 0.9895897 -0.9999288 0.9922358 0.9917549 -0.9999437 0.9937734 0.9934725 -0.8990028 0.9990461 0.8999063 -0.899002 0.9990461 0.8999048 -0.8990011 0.9990461 0.8999028 -0.899 0.9990461 0.8999003 -0.8989986 0.9990461 0.8998972 -0.8989969 0.9990461 0.8998934 -0.8989948 0.9990461 0.8998886 -0.8989923 0.999046 0.8998827 -0.8989895 0.999046 0.8998755 -0.8989863 0.9990459 0.8998667 -0.8989829 0.9990459 0.8998564 -0.8989796 0.9990458 0.8998443 -0.8989771 0.9990458 0.8998306 -0.8989767 0.9990457 0.899816 -0.8989805 0.9990456 0.8998018 -0.8989921 0.9990456 0.8997906 -0.8990175 0.9990455 0.899787 -0.8990542 0.9990455 0.899787 -0.8991006 0.9990455 0.899787 -0.8991593 0.9990455 0.899787 -0.8992336 0.9990455 0.899787 -0.8993275 0.9990455 0.899787 -0.8994464 0.9990455 0.899787 -0.8995968 0.9990455 0.899787 -0.899787 0.9990455 0.899787 -0.9000277 0.9990455 0.899787 -0.9003323 0.9990455 0.899787 -0.9007175 0.9990455 0.899787 -0.9012049 0.9990455 0.899787 -0.9018215 0.9990455 0.899787 -0.9026016 0.9990455 0.899787 -0.9035886 0.9990455 0.899787 -0.9048372 0.9990455 0.899787 -0.9064168 0.9990455 0.899787 -0.9084153 0.9990455 0.899787 -0.9109436 0.9990455 0.899787 -0.9141422 0.9990455 0.899787 -0.9181889 0.9990455 0.899787 -0.9233085 0.9990455 0.899787 -0.9297854 0.9990455 0.899787 -0.9379796 0.9990455 0.899787 -0.9483463 0.9990455 0.899787 -0.9614615 0.9990455 0.899787 -0.9780539 0.9990455 0.899787 -0.9990455 0.9990455 0.899787 -0.999247 0.982354 0.9192157 -0.9994057 0.9751513 0.9351307 -0.9995308 0.9733691 0.9480746 -0.9996295 0.9744915 0.9585415 -0.9997074 0.977005 0.9669663 -0.9997688 0.980031 0.9737222 -0.9998174 0.9830838 0.9791238 -0.9998557 0.9859157 0.9834324 -0.999886 0.9884188 0.9868627 -0.9999099 0.9905641 0.9895897 -0.9999288 0.9923648 0.9917549 -0.9999437 0.9938541 0.9934725 -0.9187175 0.9992474 0.9192924 -0.918717 0.9992474 0.9192914 -0.9187164 0.9992474 0.9192901 -0.9187157 0.9992474 0.9192885 -0.9187148 0.9992474 0.9192865 -0.9187137 0.9992474 0.919284 -0.9187123 0.9992473 0.919281 -0.9187107 0.9992473 0.9192772 -0.9187089 0.9992473 0.9192725 -0.9187068 0.9992473 0.9192669 -0.9187045 0.9992472 0.9192603 -0.9187024 0.9992472 0.9192525 -0.9187008 0.9992472 0.9192437 -0.9187004 0.9992471 0.9192343 -0.9187027 0.9992471 0.9192252 -0.9187101 0.999247 0.919218 -0.9187262 0.999247 0.9192157 -0.9187495 0.999247 0.9192157 -0.9187791 0.999247 0.9192157 -0.9188164 0.999247 0.9192157 -0.9188636 0.999247 0.9192157 -0.9189234 0.999247 0.9192157 -0.918999 0.999247 0.9192157 -0.9190947 0.999247 0.9192157 -0.9192157 0.999247 0.9192157 -0.9193688 0.999247 0.9192157 -0.9195625 0.999247 0.9192157 -0.9198076 0.999247 0.9192157 -0.9201176 0.999247 0.9192157 -0.9205098 0.999247 0.9192157 -0.9210061 0.999247 0.9192157 -0.9216339 0.999247 0.9192157 -0.9224281 0.999247 0.9192157 -0.9234329 0.999247 0.9192157 -0.9247041 0.999247 0.9192157 -0.9263124 0.999247 0.9192157 -0.928347 0.999247 0.9192157 -0.9309211 0.999247 0.9192157 -0.9341777 0.999247 0.9192157 -0.9382977 0.999247 0.9192157 -0.94351 0.999247 0.9192157 -0.9501042 0.999247 0.9192157 -0.9584468 0.999247 0.9192157 -0.9690013 0.999247 0.9192157 -0.982354 0.999247 0.9192157 -0.999247 0.999247 0.9192157 -0.9994057 0.9858591 0.9351307 -0.9995308 0.9801368 0.9480746 -0.9996295 0.978759 0.9585415 -0.9997074 0.9796909 0.9669663 -0.9997688 0.981719 0.9737222 -0.9998174 0.9841433 0.9791238 -0.9998557 0.9865801 0.9834324 -0.999886 0.9888351 0.9868627 -0.9999099 0.9908248 0.9895897 -0.9999288 0.992528 0.9917549 -0.9999437 0.9939562 0.9934725 -0.9348153 0.999406 0.9351797 -0.9348149 0.999406 0.9351791 -0.9348146 0.999406 0.9351783 -0.9348141 0.999406 0.9351772 -0.9348135 0.999406 0.935176 -0.9348128 0.9994059 0.9351744 -0.9348119 0.9994059 0.9351724 -0.9348109 0.9994059 0.93517 -0.9348097 0.9994059 0.935167 -0.9348083 0.9994059 0.9351634 -0.9348069 0.9994059 0.9351592 -0.9348055 0.9994059 0.9351542 -0.9348044 0.9994058 0.9351486 -0.9348042 0.9994058 0.9351426 -0.9348056 0.9994058 0.9351368 -0.9348102 0.9994057 0.9351322 -0.9348204 0.9994057 0.9351307 -0.9348352 0.9994057 0.9351307 -0.9348539 0.9994057 0.9351307 -0.9348776 0.9994057 0.9351307 -0.9349075 0.9994057 0.9351307 -0.9349454 0.9994057 0.9351307 -0.9349933 0.9994057 0.9351307 -0.935054 0.9994057 0.9351307 -0.9351307 0.9994057 0.9351307 -0.9352277 0.9994057 0.9351307 -0.9353505 0.9994057 0.9351307 -0.9355059 0.9994057 0.9351307 -0.9357024 0.9994057 0.9351307 -0.935951 0.9994057 0.9351307 -0.9362655 0.9994057 0.9351307 -0.9366635 0.9994057 0.9351307 -0.9371669 0.9994057 0.9351307 -0.9378038 0.9994057 0.9351307 -0.9386096 0.9994057 0.9351307 -0.939629 0.9994057 0.9351307 -0.9409186 0.9994057 0.9351307 -0.9425502 0.9994057 0.9351307 -0.9446144 0.9994057 0.9351307 -0.9472259 0.9994057 0.9351307 -0.9505298 0.9994057 0.9351307 -0.9547096 0.9994057 0.9351307 -0.9599976 0.9994057 0.9351307 -0.9666876 0.9994057 0.9351307 -0.9751513 0.9994057 0.9351307 -0.9858591 0.9994057 0.9351307 -0.9994057 0.9994057 0.9351307 -0.9995308 0.9886988 0.9480746 -0.9996295 0.9841579 0.9585415 -0.9997074 0.983089 0.9669663 -0.9997688 0.9838545 0.9737222 -0.9998174 0.9854838 0.9791238 -0.9998557 0.9874207 0.9834324 -0.999886 0.9893618 0.9868627 -0.9999099 0.9911547 0.9895897 -0.9999288 0.9927345 0.9917549 -0.9999437 0.9940854 0.9934725 -0.9478754 0.999531 0.9481058 -0.9478752 0.999531 0.9481054 -0.947875 0.999531 0.9481049 -0.9478746 0.999531 0.9481042 -0.9478743 0.999531 0.9481034 -0.9478738 0.999531 0.9481024 -0.9478733 0.999531 0.9481011 -0.9478726 0.999531 0.9480996 -0.9478718 0.999531 0.9480977 -0.947871 0.9995309 0.9480954 -0.94787 0.9995309 0.9480927 -0.9478691 0.9995309 0.9480896 -0.9478684 0.9995309 0.948086 -0.9478683 0.9995309 0.9480822 -0.9478691 0.9995309 0.9480785 -0.947872 0.9995309 0.9480755 -0.9478785 0.9995308 0.9480746 -0.9478878 0.9995308 0.9480746 -0.9478997 0.9995308 0.9480746 -0.9479146 0.9995308 0.9480746 -0.9479335 0.9995308 0.9480746 -0.9479575 0.9995308 0.9480746 -0.9479878 0.9995308 0.9480746 -0.9480261 0.9995308 0.9480746 -0.9480746 0.9995308 0.9480746 -0.9481359 0.9995308 0.9480746 -0.9482135 0.9995308 0.9480746 -0.9483117 0.9995308 0.9480746 -0.9484359 0.9995308 0.9480746 -0.9485931 0.9995308 0.9480746 -0.9487918 0.9995308 0.9480746 -0.9490434 0.9995308 0.9480746 -0.9493615 0.9995308 0.9480746 -0.9497641 0.9995308 0.9480746 -0.9502734 0.9995308 0.9480746 -0.9509177 0.9995308 0.9480746 -0.9517328 0.9995308 0.9480746 -0.952764 0.9995308 0.9480746 -0.9540687 0.9995308 0.9480746 -0.9557192 0.9995308 0.9480746 -0.9578074 0.9995308 0.9480746 -0.9604492 0.9995308 0.9480746 -0.9637914 0.9995308 0.9480746 -0.9680197 0.9995308 0.9480746 -0.9733691 0.9995308 0.9480746 -0.9801368 0.9995308 0.9480746 -0.9886988 0.9995308 0.9480746 -0.9995308 0.9995308 0.9480746 -0.9996295 0.9909882 0.9585415 -0.9997074 0.9873879 0.9669663 -0.9997688 0.9865561 0.9737222 -0.9998174 0.9871796 0.9791238 -0.9998557 0.9884841 0.9834324 -0.999886 0.9900282 0.9868627 -0.9999099 0.991572 0.9895897 -0.9999288 0.9929957 0.9917549 -0.9999437 0.9942488 0.9934725 -0.958416 0.9996296 0.9585613 -0.9584159 0.9996296 0.958561 -0.9584157 0.9996296 0.9585607 -0.9584155 0.9996296 0.9585603 -0.9584153 0.9996296 0.9585598 -0.958415 0.9996296 0.9585591 -0.9584146 0.9996296 0.9585583 -0.9584142 0.9996296 0.9585574 -0.9584137 0.9996296 0.9585562 -0.9584132 0.9996296 0.9585547 -0.9584126 0.9996296 0.958553 -0.958412 0.9996296 0.958551 -0.9584115 0.9996296 0.9585487 -0.9584114 0.9996295 0.9585463 -0.958412 0.9996295 0.9585439 -0.9584138 0.9996295 0.9585421 -0.9584178 0.9996295 0.9585415 -0.9584237 0.9996295 0.9585415 -0.9584312 0.9996295 0.9585415 -0.9584406 0.9996295 0.9585415 -0.9584526 0.9996295 0.9585415 -0.9584677 0.9996295 0.9585415 -0.9584868 0.9996295 0.9585415 -0.9585109 0.9996295 0.9585415 -0.9585415 0.9996295 0.9585415 -0.9585802 0.9996295 0.9585415 -0.9586291 0.9996295 0.9585415 -0.958691 0.9996295 0.9585415 -0.9587693 0.9996295 0.9585415 -0.9588684 0.9996295 0.9585415 -0.9589938 0.9996295 0.9585415 -0.9591524 0.9996295 0.9585415 -0.959353 0.9996295 0.9585415 -0.9596068 0.9996295 0.9585415 -0.959928 0.9996295 0.9585415 -0.9603343 0.9996295 0.9585415 -0.9608482 0.9996295 0.9585415 -0.9614985 0.9996295 0.9585415 -0.9623212 0.9996295 0.9585415 -0.963362 0.9996295 0.9585415 -0.9646787 0.9996295 0.9585415 -0.9663445 0.9996295 0.9585415 -0.968452 0.9996295 0.9585415 -0.9711183 0.9996295 0.9585415 -0.9744915 0.9996295 0.9585415 -0.978759 0.9996295 0.9585415 -0.9841579 0.9996295 0.9585415 -0.9909882 0.9996295 0.9585415 -0.9996295 0.9996295 0.9585415 -0.9997074 0.9928267 0.9669663 -0.9997688 0.9899741 0.9737222 -0.9998174 0.989325 0.9791238 -0.9998557 0.9898295 0.9834324 -0.999886 0.9908712 0.9868627 -0.9999099 0.9920999 0.9895897 -0.9999288 0.9933261 0.9917549 -0.9999437 0.9944556 0.9934725 -0.9668873 0.9997074 0.9669788 -0.9668872 0.9997074 0.9669786 -0.9668871 0.9997074 0.9669784 -0.966887 0.9997074 0.9669781 -0.9668869 0.9997074 0.9669778 -0.9668867 0.9997074 0.9669774 -0.9668865 0.9997074 0.9669769 -0.9668862 0.9997074 0.9669763 -0.9668859 0.9997074 0.9669755 -0.9668855 0.9997074 0.9669746 -0.9668852 0.9997074 0.9669735 -0.9668848 0.9997074 0.9669723 -0.9668845 0.9997074 0.9669708 -0.9668844 0.9997074 0.9669693 -0.9668847 0.9997074 0.9669678 -0.9668859 0.9997074 0.9669667 -0.9668884 0.9997074 0.9669663 -0.9668922 0.9997074 0.9669663 -0.9668969 0.9997074 0.9669663 -0.9669028 0.9997074 0.9669663 -0.9669103 0.9997074 0.9669663 -0.9669198 0.9997074 0.9669663 -0.9669318 0.9997074 0.9669663 -0.966947 0.9997074 0.9669663 -0.9669663 0.9997074 0.9669663 -0.9669906 0.9997074 0.9669663 -0.9670214 0.9997074 0.9669663 -0.9670604 0.9997074 0.9669663 -0.9671097 0.9997074 0.9669663 -0.967172 0.9997074 0.9669663 -0.9672509 0.9997074 0.9669663 -0.9673508 0.9997074 0.9669663 -0.967477 0.9997074 0.9669663 -0.9676368 0.9997074 0.9669663 -0.9678389 0.9997074 0.9669663 -0.9680946 0.9997074 0.9669663 -0.9684181 0.9997074 0.9669663 -0.9688274 0.9997074 0.9669663 -0.9693452 0.9997074 0.9669663 -0.9700002 0.9997074 0.9669663 -0.970829 0.9997074 0.9669663 -0.9718774 0.9997074 0.9669663 -0.9732039 0.9997074 0.9669663 -0.974882 0.9997074 0.9669663 -0.977005 0.9997074 0.9669663 -0.9796909 0.9997074 0.9669663 -0.983089 0.9997074 0.9669663 -0.9873879 0.9997074 0.9669663 -0.9928267 0.9997074 0.9669663 -0.9997074 0.9997074 0.9669663 -0.9997688 0.9942982 0.9737222 -0.9998174 0.9920392 0.9791238 -0.9998557 0.9915316 0.9834324 -0.999886 0.9919377 0.9868627 -0.9999099 0.9927678 0.9895897 -0.9999288 0.9937442 0.9917549 -0.9999437 0.9947172 0.9934725 -0.9736726 0.9997689 0.9737301 -0.9736726 0.9997689 0.97373 -0.9736725 0.9997689 0.9737299 -0.9736724 0.9997689 0.9737297 -0.9736723 0.9997689 0.9737295 -0.9736722 0.9997689 0.9737292 -0.9736721 0.9997689 0.9737289 -0.9736719 0.9997689 0.9737285 -0.9736717 0.9997689 0.9737281 -0.9736715 0.9997689 0.9737275 -0.9736712 0.9997689 0.9737268 -0.973671 0.9997689 0.973726 -0.9736708 0.9997689 0.9737251 -0.9736708 0.9997689 0.9737241 -0.973671 0.9997688 0.9737232 -0.9736717 0.9997688 0.9737225 -0.9736733 0.9997688 0.9737222 -0.9736756 0.9997688 0.9737222 -0.9736786 0.9997688 0.9737222 -0.9736823 0.9997688 0.9737222 -0.973687 0.9997688 0.9737222 -0.973693 0.9997688 0.9737222 -0.9737006 0.9997688 0.9737222 -0.9737101 0.9997688 0.9737222 -0.9737222 0.9997688 0.9737222 -0.9737375 0.9997688 0.9737222 -0.9737569 0.9997688 0.9737222 -0.9737814 0.9997688 0.9737222 -0.9738123 0.9997688 0.9737222 -0.9738515 0.9997688 0.9737222 -0.9739011 0.9997688 0.9737222 -0.9739638 0.9997688 0.9737222 -0.9740432 0.9997688 0.9737222 -0.9741436 0.9997688 0.9737222 -0.9742706 0.9997688 0.9737222 -0.9744313 0.9997688 0.9737222 -0.9746346 0.9997688 0.9737222 -0.9748918 0.9997688 0.9737222 -0.9752172 0.9997688 0.9737222 -0.9756289 0.9997688 0.9737222 -0.9761497 0.9997688 0.9737222 -0.9768086 0.9997688 0.9737222 -0.9776422 0.9997688 0.9737222 -0.9786968 0.9997688 0.9737222 -0.980031 0.9997688 0.9737222 -0.981719 0.9997688 0.9737222 -0.9838545 0.9997688 0.9737222 -0.9865561 0.9997688 0.9737222 -0.9899741 0.9997688 0.9737222 -0.9942982 0.9997688 0.9737222 -0.9997688 0.9997688 0.9737222 -0.9998174 0.9954731 0.9791238 -0.9998557 0.9936849 0.9834324 -0.999886 0.993287 0.9868627 -0.9999099 0.9936128 0.9895897 -0.9999288 0.9942731 0.9917549 -0.9999437 0.9950481 0.9934725 -0.9790927 0.9998174 0.9791288 -0.9790927 0.9998174 0.9791287 -0.9790927 0.9998174 0.9791287 -0.9790926 0.9998174 0.9791286 -0.9790925 0.9998174 0.9791284 -0.9790925 0.9998174 0.9791283 -0.9790924 0.9998174 0.9791281 -0.9790923 0.9998174 0.9791278 -0.9790921 0.9998174 0.9791275 -0.979092 0.9998174 0.9791272 -0.9790919 0.9998174 0.9791267 -0.9790917 0.9998174 0.9791262 -0.9790916 0.9998174 0.9791257 -0.9790916 0.9998174 0.979125 -0.9790917 0.9998174 0.9791245 -0.9790921 0.9998174 0.979124 -0.9790931 0.9998174 0.9791238 -0.9790946 0.9998174 0.9791238 -0.9790965 0.9998174 0.9791238 -0.9790988 0.9998174 0.9791238 -0.9791018 0.9998174 0.9791238 -0.9791055 0.9998174 0.9791238 -0.9791103 0.9998174 0.9791238 -0.9791163 0.9998174 0.9791238 -0.9791238 0.9998174 0.9791238 -0.9791334 0.9998174 0.9791238 -0.9791456 0.9998174 0.9791238 -0.979161 0.9998174 0.9791238 -0.9791804 0.9998174 0.9791238 -0.979205 0.9998174 0.9791238 -0.9792361 0.9998174 0.9791238 -0.9792755 0.9998174 0.9791238 -0.9793253 0.9998174 0.9791238 -0.9793883 0.9998174 0.9791238 -0.9794681 0.9998174 0.9791238 -0.9795689 0.9998174 0.9791238 -0.9796966 0.9998174 0.9791238 -0.979858 0.9998174 0.9791238 -0.9800622 0.9998174 0.9791238 -0.9803206 0.9998174 0.9791238 -0.9806476 0.9998174 0.9791238 -0.9810611 0.9998174 0.9791238 -0.9815844 0.9998174 0.9791238 -0.9822464 0.9998174 0.9791238 -0.9830838 0.9998174 0.9791238 -0.9841433 0.9998174 0.9791238 -0.9854838 0.9998174 0.9791238 -0.9871796 0.9998174 0.9791238 -0.989325 0.9998174 0.9791238 -0.9920392 0.9998174 0.9791238 -0.9954731 0.9998174 0.9791238 -0.9998174 0.9998174 0.9791238 -0.9998557 0.9964092 0.9834324 -0.999886 0.9949941 0.9868627 -0.9999099 0.9946818 0.9895897 -0.9999288 0.9949422 0.9917549 -0.9999437 0.9954668 0.9934725 -0.9834129 0.9998557 0.9834356 -0.9834129 0.9998557 0.9834355 -0.9834129 0.9998557 0.9834355 -0.9834129 0.9998557 0.9834354 -0.9834128 0.9998557 0.9834353 -0.9834128 0.9998557 0.9834352 -0.9834127 0.9998557 0.9834351 -0.9834127 0.9998557 0.9834349 -0.9834126 0.9998557 0.9834348 -0.9834125 0.9998557 0.9834345 -0.9834124 0.9998557 0.9834343 -0.9834123 0.9998557 0.9834339 -0.9834122 0.9998557 0.9834336 -0.9834122 0.9998557 0.9834332 -0.9834123 0.9998557 0.9834328 -0.9834126 0.9998557 0.9834325 -0.9834132 0.9998557 0.9834324 -0.9834141 0.9998557 0.9834324 -0.9834153 0.9998557 0.9834324 -0.9834167 0.9998557 0.9834324 -0.9834186 0.9998557 0.9834324 -0.9834209 0.9998557 0.9834324 -0.9834239 0.9998557 0.9834324 -0.9834277 0.9998557 0.9834324 -0.9834324 0.9998557 0.9834324 -0.9834385 0.9998557 0.9834324 -0.9834461 0.9998557 0.9834324 -0.9834557 0.9998557 0.9834324 -0.9834679 0.9998557 0.9834324 -0.9834833 0.9998557 0.9834324 -0.9835029 0.9998557 0.9834324 -0.9835276 0.9998557 0.9834324 -0.9835588 0.9998557 0.9834324 -0.9835983 0.9998557 0.9834324 -0.9836483 0.9998557 0.9834324 -0.9837116 0.9998557 0.9834324 -0.9837916 0.9998557 0.9834324 -0.9838928 0.9998557 0.9834324 -0.9840209 0.9998557 0.9834324 -0.9841829 0.9998557 0.9834324 -0.984388 0.9998557 0.9834324 -0.9846473 0.9998557 0.9834324 -0.9849754 0.9998557 0.9834324 -0.9853905 0.9998557 0.9834324 -0.9859157 0.9998557 0.9834324 -0.9865801 0.9998557 0.9834324 -0.9874207 0.9998557 0.9834324 -0.9884841 0.9998557 0.9834324 -0.9898295 0.9998557 0.9834324 -0.9915316 0.9998557 0.9834324 -0.9936849 0.9998557 0.9834324 -0.9964092 0.9998557 0.9834324 -0.9998557 0.9998557 0.9834324 -0.999886 0.9971537 0.9868627 -0.9999099 0.9960342 0.9895897 -0.9999288 0.9957887 0.9917549 -0.9999437 0.9959964 0.9934725 -0.9868505 0.999886 0.9868647 -0.9868505 0.999886 0.9868647 -0.9868505 0.999886 0.9868646 -0.9868505 0.999886 0.9868646 -0.9868504 0.999886 0.9868645 -0.9868504 0.999886 0.9868645 -0.9868504 0.999886 0.9868644 -0.9868503 0.999886 0.9868643 -0.9868503 0.999886 0.9868642 -0.9868502 0.999886 0.986864 -0.9868502 0.999886 0.9868639 -0.9868501 0.999886 0.9868637 -0.9868501 0.999886 0.9868634 -0.98685 0.999886 0.9868632 -0.9868501 0.999886 0.986863 -0.9868503 0.999886 0.9868628 -0.9868507 0.999886 0.9868627 -0.9868512 0.999886 0.9868627 -0.986852 0.999886 0.9868627 -0.9868529 0.999886 0.9868627 -0.9868541 0.999886 0.9868627 -0.9868555 0.999886 0.9868627 -0.9868574 0.999886 0.9868627 -0.9868597 0.999886 0.9868627 -0.9868627 0.999886 0.9868627 -0.9868665 0.999886 0.9868627 -0.9868713 0.999886 0.9868627 -0.9868773 0.999886 0.9868627 -0.986885 0.999886 0.9868627 -0.9868946 0.999886 0.9868627 -0.9869069 0.999886 0.9868627 -0.9869223 0.999886 0.9868627 -0.9869419 0.999886 0.9868627 -0.9869667 0.999886 0.9868627 -0.986998 0.999886 0.9868627 -0.9870376 0.999886 0.9868627 -0.9870878 0.999886 0.9868627 -0.9871512 0.999886 0.9868627 -0.9872315 0.999886 0.9868627 -0.987333 0.999886 0.9868627 -0.9874615 0.999886 0.9868627 -0.987624 0.999886 0.9868627 -0.9878296 0.999886 0.9868627 -0.9880897 0.999886 0.9868627 -0.9884188 0.999886 0.9868627 -0.9888351 0.999886 0.9868627 -0.9893618 0.999886 0.9868627 -0.9900282 0.999886 0.9868627 -0.9908712 0.999886 0.9868627 -0.9919377 0.999886 0.9868627 -0.993287 0.999886 0.9868627 -0.9949941 0.999886 0.9868627 -0.9971537 0.999886 0.9868627 -0.999886 0.999886 0.9868627 -0.9999099 0.9977452 0.9895897 -0.9999288 0.9968597 0.9917549 -0.9999437 0.9966665 0.9934725 -0.989582 0.9999099 0.9895909 -0.989582 0.9999099 0.9895909 -0.989582 0.9999099 0.9895909 -0.989582 0.9999099 0.9895908 -0.989582 0.9999099 0.9895908 -0.9895819 0.9999099 0.9895908 -0.9895819 0.9999099 0.9895907 -0.9895819 0.9999099 0.9895906 -0.9895819 0.9999099 0.9895906 -0.9895818 0.9999099 0.9895905 -0.9895818 0.9999099 0.9895904 -0.9895818 0.9999099 0.9895902 -0.9895817 0.9999099 0.9895901 -0.9895817 0.9999099 0.98959 -0.9895817 0.9999099 0.9895898 -0.9895819 0.9999099 0.9895897 -0.9895821 0.9999099 0.9895897 -0.9895825 0.9999099 0.9895897 -0.9895829 0.9999099 0.9895897 -0.9895835 0.9999099 0.9895897 -0.9895842 0.9999099 0.9895897 -0.9895851 0.9999099 0.9895897 -0.9895863 0.9999099 0.9895897 -0.9895878 0.9999099 0.9895897 -0.9895897 0.9999099 0.9895897 -0.989592 0.9999099 0.9895897 -0.989595 0.9999099 0.9895897 -0.9895988 0.9999099 0.9895897 -0.9896036 0.9999099 0.9895897 -0.9896096 0.9999099 0.9895897 -0.9896173 0.9999099 0.9895897 -0.989627 0.9999099 0.9895897 -0.9896392 0.9999099 0.9895897 -0.9896547 0.9999099 0.9895897 -0.9896744 0.9999099 0.9895897 -0.9896992 0.9999099 0.9895897 -0.9897306 0.9999099 0.9895897 -0.9897703 0.9999099 0.9895897 -0.9898206 0.9999099 0.9895897 -0.9898842 0.9999099 0.9895897 -0.9899646 0.9999099 0.9895897 -0.9900664 0.9999099 0.9895897 -0.9901951 0.9999099 0.9895897 -0.990358 0.9999099 0.9895897 -0.9905641 0.9999099 0.9895897 -0.9908248 0.9999099 0.9895897 -0.9911547 0.9999099 0.9895897 -0.991572 0.9999099 0.9895897 -0.9920999 0.9999099 0.9895897 -0.9927678 0.9999099 0.9895897 -0.9936128 0.9999099 0.9895897 -0.9946818 0.9999099 0.9895897 -0.9960342 0.9999099 0.9895897 -0.9977452 0.9999099 0.9895897 -0.9999099 0.9999099 0.9895897 -0.9999288 0.9982146 0.9917549 -0.9999437 0.9975143 0.9934725 -0.9917501 0.9999288 0.9917557 -0.9917501 0.9999288 0.9917556 -0.9917501 0.9999288 0.9917556 -0.9917501 0.9999288 0.9917556 -0.9917501 0.9999288 0.9917556 -0.9917501 0.9999288 0.9917556 -0.99175 0.9999288 0.9917555 -0.99175 0.9999288 0.9917555 -0.99175 0.9999288 0.9917555 -0.99175 0.9999288 0.9917554 -0.99175 0.9999288 0.9917553 -0.9917499 0.9999288 0.9917553 -0.9917499 0.9999288 0.9917552 -0.9917499 0.9999288 0.9917551 -0.9917499 0.9999288 0.991755 -0.99175 0.9999288 0.9917549 -0.9917502 0.9999288 0.9917549 -0.9917504 0.9999288 0.9917549 -0.9917507 0.9999288 0.9917549 -0.991751 0.9999288 0.9917549 -0.9917515 0.9999288 0.9917549 -0.9917521 0.9999288 0.9917549 -0.9917528 0.9999288 0.9917549 -0.9917537 0.9999288 0.9917549 -0.9917549 0.9999288 0.9917549 -0.9917564 0.9999288 0.9917549 -0.9917582 0.9999288 0.9917549 -0.9917606 0.9999288 0.9917549 -0.9917636 0.9999288 0.9917549 -0.9917674 0.9999288 0.9917549 -0.9917722 0.9999288 0.9917549 -0.9917782 0.9999288 0.9917549 -0.9917859 0.9999288 0.9917549 -0.9917956 0.9999288 0.9917549 -0.9918079 0.9999288 0.9917549 -0.9918234 0.9999288 0.9917549 -0.9918431 0.9999288 0.9917549 -0.991868 0.9999288 0.9917549 -0.9918994 0.9999288 0.9917549 -0.9919392 0.9999288 0.9917549 -0.9919896 0.9999288 0.9917549 -0.9920533 0.9999288 0.9917549 -0.9921339 0.9999288 0.9917549 -0.9922358 0.9999288 0.9917549 -0.9923648 0.9999288 0.9917549 -0.992528 0.9999288 0.9917549 -0.9927345 0.9999288 0.9917549 -0.9929957 0.9999288 0.9917549 -0.9933261 0.9999288 0.9917549 -0.9937442 0.9999288 0.9917549 -0.9942731 0.9999288 0.9917549 -0.9949422 0.9999288 0.9917549 -0.9957887 0.9999288 0.9917549 -0.9968597 0.9999288 0.9917549 -0.9982146 0.9999288 0.9917549 -0.9999288 0.9999288 0.9917549 -0.9999437 0.9985868 0.9934725 -0.9934695 0.9999437 0.993473 -0.9934695 0.9999437 0.993473 -0.9934695 0.9999437 0.993473 -0.9934695 0.9999437 0.9934729 -0.9934695 0.9999437 0.9934729 -0.9934695 0.9999437 0.9934729 -0.9934695 0.9999437 0.9934729 -0.9934694 0.9999437 0.9934729 -0.9934694 0.9999437 0.9934728 -0.9934694 0.9999437 0.9934728 -0.9934694 0.9999437 0.9934728 -0.9934694 0.9999437 0.9934727 -0.9934694 0.9999437 0.9934727 -0.9934694 0.9999437 0.9934726 -0.9934694 0.9999437 0.9934725 -0.9934694 0.9999437 0.9934725 -0.9934695 0.9999437 0.9934725 -0.9934697 0.9999437 0.9934725 -0.9934698 0.9999437 0.9934725 -0.9934701 0.9999437 0.9934725 -0.9934704 0.9999437 0.9934725 -0.9934707 0.9999437 0.9934725 -0.9934712 0.9999437 0.9934725 -0.9934718 0.9999437 0.9934725 -0.9934725 0.9999437 0.9934725 -0.9934734 0.9999437 0.9934725 -0.9934746 0.9999437 0.9934725 -0.9934761 0.9999437 0.9934725 -0.9934779 0.9999437 0.9934725 -0.9934803 0.9999437 0.9934725 -0.9934833 0.9999437 0.9934725 -0.9934871 0.9999437 0.9934725 -0.9934919 0.9999437 0.9934725 -0.993498 0.9999437 0.9934725 -0.9935057 0.9999437 0.9934725 -0.9935154 0.9999437 0.9934725 -0.9935277 0.9999437 0.9934725 -0.9935432 0.9999437 0.9934725 -0.9935629 0.9999437 0.9934725 -0.9935878 0.9999437 0.9934725 -0.9936193 0.9999437 0.9934725 -0.9936592 0.9999437 0.9934725 -0.9937096 0.9999437 0.9934725 -0.9937734 0.9999437 0.9934725 -0.9938541 0.9999437 0.9934725 -0.9939562 0.9999437 0.9934725 -0.9940854 0.9999437 0.9934725 -0.9942488 0.9999437 0.9934725 -0.9944556 0.9999437 0.9934725 -0.9947172 0.9999437 0.9934725 -0.9950481 0.9999437 0.9934725 -0.9954668 0.9999437 0.9934725 -0.9959964 0.9999437 0.9934725 -0.9966665 0.9999437 0.9934725 -0.9975143 0.9999437 0.9934725 -0.9985868 0.9999437 0.9934725 -0.9999437 0.9999437 0.9934725 -0.0000238 0.0000238 0.6964791 -0.0005417 0.0000238 0.6964791 -0.0011968 0.0000238 0.6964791 -0.0020256 0.0000238 0.6964791 -0.0030742 0.0000238 0.6964791 -0.0044007 0.0000238 0.6964791 -0.006079 0.0000238 0.6964791 -0.0082023 0.0000238 0.6964791 -0.0108885 0.0000238 0.6964791 -0.0142868 0.0000238 0.6964791 -0.0185862 0.0000238 0.6964791 -0.0240255 0.0000238 0.6964791 -0.0309069 0.0000238 0.6964791 -0.0396127 0.0000238 0.6964791 -0.0506267 0.0000238 0.6964791 -0.0645609 0.0000238 0.6964791 -0.0821895 0.0000238 0.6964791 -0.1044919 0.0000238 0.6964791 -0.1327073 0.0000238 0.6964791 -0.1684036 0.0000238 0.6964791 -0.2135639 0.0000238 0.6964791 -0.2706977 0.0000238 0.6964791 -0.3429792 0.0000238 0.6964791 -0.4344249 0.0000238 0.6964791 -0.5501155 0.0000238 0.6964791 -0.6964791 0.0000238 0.6964791 -0.8407292 0.0051514 0.6652314 -0.9033413 0.0279321 0.5742985 -0.9354466 0.0624569 0.4929712 -0.9545467 0.1059991 0.4366682 -0.9669269 0.1572498 0.4065913 -0.9754027 0.2151269 0.4001561 -0.9814251 0.2783684 0.413595 -0.9858181 0.3454107 0.4427624 -0.9890841 0.4144197 0.483464 -0.9915469 0.4834235 0.5316756 -0.993424 0.5504963 0.5837409 -0.9948662 0.6139459 0.6365438 -0.9959813 0.6724572 0.6876273 -0.9968475 0.7251659 0.7352352 -0.997523 0.7716588 0.7782755 -0.9980513 0.8119154 0.8162254 -0.9984653 0.8462171 0.8490036 -0.9987905 0.8750477 0.8768378 -0.9990461 0.8990028 0.9001468 -0.9992474 0.9187175 0.9194454 -0.999406 0.9348153 0.9352767 -0.999531 0.9478754 0.9481671 -0.9996296 0.958416 0.9585999 -0.9997074 0.9668873 0.9670031 -0.9997689 0.9736726 0.9737454 -0.9998174 0.9790927 0.9791384 -0.9998557 0.9834129 0.9834416 -0.999886 0.9868505 0.9868685 -0.9999099 0.989582 0.9895933 -0.9999288 0.9917501 0.9917571 -0.9999437 0.9934695 0.9934739 -0.0000238 0.0005417 0.6964791 -0.0000382 0.0000382 0.6959756 -0.0006933 0.0000382 0.6959756 -0.0015221 0.0000382 0.6959756 -0.0025707 0.0000382 0.6959756 -0.0038972 0.0000382 0.6959756 -0.0055755 0.0000382 0.6959756 -0.0076988 0.0000382 0.6959756 -0.0103849 0.0000382 0.6959756 -0.0137833 0.0000382 0.6959756 -0.0180827 0.0000382 0.6959756 -0.023522 0.0000382 0.6959756 -0.0304033 0.0000382 0.6959756 -0.0391092 0.0000382 0.6959756 -0.0501232 0.0000382 0.6959756 -0.0640574 0.0000382 0.6959756 -0.081686 0.0000382 0.6959756 -0.1039884 0.0000382 0.6959756 -0.1322038 0.0000382 0.6959756 -0.1679 0.0000382 0.6959756 -0.2130604 0.0000382 0.6959756 -0.2701941 0.0000382 0.6959756 -0.3424757 0.0000382 0.6959756 -0.4339214 0.0000382 0.6959756 -0.549612 0.0000382 0.6959756 -0.6959756 0.0000382 0.6959756 -0.8405071 0.0051286 0.664948 -0.9032596 0.0278872 0.5740779 -0.9354101 0.0624063 0.4927653 -0.9545286 0.1059489 0.4364805 -0.9669173 0.1572031 0.4064278 -0.9753975 0.2150852 0.4000191 -0.9814221 0.2783325 0.4134842 -0.9858163 0.3453807 0.4426754 -0.9890831 0.4143955 0.4833974 -0.9915463 0.4834045 0.531626 -0.9934236 0.5504818 0.5837046 -0.994866 0.6139352 0.6365179 -0.9959811 0.6724495 0.6876092 -0.9968474 0.7251605 0.7352227 -0.997523 0.7716551 0.7782671 -0.9980512 0.8119128 0.8162198 -0.9984653 0.8462154 0.8489999 -0.9987905 0.8750466 0.8768354 -0.9990461 0.899002 0.9001452 -0.9992474 0.918717 0.9194443 -0.999406 0.9348149 0.9352761 -0.999531 0.9478752 0.9481667 -0.9996296 0.9584159 0.9585997 -0.9997074 0.9668872 0.967003 -0.9997689 0.9736726 0.9737453 -0.9998174 0.9790927 0.9791383 -0.9998557 0.9834129 0.9834415 -0.999886 0.9868505 0.9868684 -0.9999099 0.989582 0.9895932 -0.9999288 0.9917501 0.9917571 -0.9999437 0.9934695 0.9934739 -0.0000238 0.0011968 0.6964791 -0.0000382 0.0006933 0.6959756 -0.0000611 0.0000611 0.6953434 -0.0008899 0.0000611 0.6953434 -0.0019385 0.0000611 0.6953434 -0.003265 0.0000611 0.6953434 -0.0049433 0.0000611 0.6953434 -0.0070666 0.0000611 0.6953434 -0.0097527 0.0000611 0.6953434 -0.0131511 0.0000611 0.6953434 -0.0174505 0.0000611 0.6953434 -0.0228898 0.0000611 0.6953434 -0.0297711 0.0000611 0.6953434 -0.038477 0.0000611 0.6953434 -0.049491 0.0000611 0.6953434 -0.0634252 0.0000611 0.6953434 -0.0810538 0.0000611 0.6953434 -0.1033562 0.0000611 0.6953434 -0.1315716 0.0000611 0.6953434 -0.1672678 0.0000611 0.6953434 -0.2124282 0.0000611 0.6953434 -0.2695619 0.0000611 0.6953434 -0.3418435 0.0000611 0.6953434 -0.4332891 0.0000611 0.6953434 -0.5489798 0.0000611 0.6953434 -0.6953434 0.0000611 0.6953434 -0.8402274 0.0051047 0.6645915 -0.9031567 0.0278347 0.5738005 -0.9353643 0.0623458 0.4925065 -0.9545059 0.1058883 0.4362446 -0.9669053 0.1571463 0.4062223 -0.9753908 0.2150342 0.3998472 -0.9814183 0.2782884 0.4133451 -0.9858141 0.3453439 0.4425661 -0.9890818 0.4143657 0.4833138 -0.9915455 0.4833811 0.5315636 -0.9934231 0.550464 0.5836591 -0.9948657 0.6139219 0.6364854 -0.9959809 0.6724399 0.6875865 -0.9968473 0.7251537 0.7352071 -0.9975229 0.7716504 0.7782565 -0.9980512 0.8119096 0.8162127 -0.9984653 0.8462132 0.8489952 -0.9987904 0.8750451 0.8768324 -0.9990461 0.8990011 0.9001432 -0.9992474 0.9187164 0.9194431 -0.999406 0.9348146 0.9352752 -0.999531 0.947875 0.9481662 -0.9996296 0.9584157 0.9585994 -0.9997074 0.9668871 0.9670027 -0.9997689 0.9736725 0.9737452 -0.9998174 0.9790927 0.9791383 -0.9998557 0.9834129 0.9834415 -0.999886 0.9868505 0.9868684 -0.9999099 0.989582 0.9895932 -0.9999288 0.9917501 0.9917571 -0.9999437 0.9934695 0.9934739 -0.0000238 0.0020256 0.6964791 -0.0000382 0.0015221 0.6959756 -0.0000611 0.0008899 0.6953434 -0.0000978 0.0000978 0.6945513 -0.0011463 0.0000978 0.6945513 -0.0024729 0.0000978 0.6945513 -0.0041512 0.0000978 0.6945513 -0.0062744 0.0000978 0.6945513 -0.0089606 0.0000978 0.6945513 -0.012359 0.0000978 0.6945513 -0.0166583 0.0000978 0.6945513 -0.0220976 0.0000978 0.6945513 -0.028979 0.0000978 0.6945513 -0.0376849 0.0000978 0.6945513 -0.0486989 0.0000978 0.6945513 -0.0626331 0.0000978 0.6945513 -0.0802616 0.0000978 0.6945513 -0.102564 0.0000978 0.6945513 -0.1307795 0.0000978 0.6945513 -0.1664757 0.0000978 0.6945513 -0.2116361 0.0000978 0.6945513 -0.2687698 0.0000978 0.6945513 -0.3410514 0.0000978 0.6945513 -0.432497 0.0000978 0.6945513 -0.5481876 0.0000978 0.6945513 -0.6945513 0.0000978 0.6945513 -0.8398756 0.0050826 0.6641436 -0.9030276 0.0277752 0.5734525 -0.9353068 0.0622749 0.4921819 -0.9544774 0.1058162 0.4359488 -0.9668902 0.1570779 0.4059646 -0.9753825 0.2149725 0.3996316 -0.9814136 0.2782347 0.4131707 -0.9858113 0.3452987 0.4424291 -0.9890801 0.414329 0.483209 -0.9915446 0.4833522 0.5314854 -0.9934225 0.5504419 0.5836021 -0.9948653 0.6139056 0.6364447 -0.9959807 0.672428 0.687558 -0.9968472 0.7251454 0.7351875 -0.9975228 0.7716446 0.7782432 -0.9980511 0.8119057 0.8162038 -0.9984653 0.8462106 0.8489893 -0.9987904 0.8750434 0.8768285 -0.9990461 0.899 0.9001407 -0.9992474 0.9187157 0.9194415 -0.999406 0.9348141 0.9352742 -0.999531 0.9478746 0.9481655 -0.9996296 0.9584155 0.9585989 -0.9997074 0.966887 0.9670025 -0.9997689 0.9736724 0.973745 -0.9998174 0.9790926 0.9791382 -0.9998557 0.9834129 0.9834414 -0.999886 0.9868505 0.9868684 -0.9999099 0.989582 0.9895932 -0.9999288 0.9917501 0.9917571 -0.9999437 0.9934695 0.9934739 -0.0000238 0.0030742 0.6964791 -0.0000382 0.0025707 0.6959756 -0.0000611 0.0019385 0.6953434 -0.0000978 0.0011463 0.6945513 -0.0001565 0.0001565 0.6935614 -0.001483 0.0001565 0.6935614 -0.0031613 0.0001565 0.6935614 -0.0052846 0.0001565 0.6935614 -0.0079707 0.0001565 0.6935614 -0.0113691 0.0001565 0.6935614 -0.0156685 0.0001565 0.6935614 -0.0211078 0.0001565 0.6935614 -0.0279891 0.0001565 0.6935614 -0.036695 0.0001565 0.6935614 -0.047709 0.0001565 0.6935614 -0.0616432 0.0001565 0.6935614 -0.0792718 0.0001565 0.6935614 -0.1015742 0.0001565 0.6935614 -0.1297896 0.0001565 0.6935614 -0.1654858 0.0001565 0.6935614 -0.2106462 0.0001565 0.6935614 -0.2677799 0.0001565 0.6935614 -0.3400615 0.0001565 0.6935614 -0.4315072 0.0001565 0.6935614 -0.5471978 0.0001565 0.6935614 -0.6935614 0.0001565 0.6935614 -0.8394338 0.0050676 0.663582 -0.9028657 0.0277111 0.573017 -0.9352348 0.0621943 0.4917758 -0.9544418 0.1057322 0.4355789 -0.9668714 0.1569971 0.4056424 -0.9753721 0.2148987 0.399362 -0.9814076 0.2781701 0.4129526 -0.9858079 0.3452442 0.4422578 -0.9890781 0.4142845 0.483078 -0.9915433 0.4833171 0.5313876 -0.9934218 0.550415 0.5835308 -0.9948649 0.6138855 0.6363938 -0.9959804 0.6724135 0.6875223 -0.996847 0.7251351 0.735163 -0.9975227 0.7716375 0.7782266 -0.9980511 0.8119009 0.8161928 -0.9984652 0.8462073 0.848982 -0.9987904 0.8750412 0.8768238 -0.9990461 0.8989986 0.9001376 -0.9992474 0.9187148 0.9194395 -0.999406 0.9348135 0.935273 -0.999531 0.9478743 0.9481647 -0.9996296 0.9584153 0.9585984 -0.9997074 0.9668869 0.9670022 -0.9997689 0.9736723 0.9737448 -0.9998174 0.9790925 0.979138 -0.9998557 0.9834128 0.9834413 -0.999886 0.9868504 0.9868683 -0.9999099 0.989582 0.9895932 -0.9999288 0.9917501 0.9917571 -0.9999437 0.9934695 0.9934739 -0.0000238 0.0044007 0.6964791 -0.0000382 0.0038972 0.6959756 -0.0000611 0.003265 0.6953434 -0.0000978 0.0024729 0.6945513 -0.0001565 0.001483 0.6935614 -0.0002504 0.0002504 0.6923288 -0.0019287 0.0002504 0.6923288 -0.004052 0.0002504 0.6923288 -0.0067381 0.0002504 0.6923288 -0.0101365 0.0002504 0.6923288 -0.0144359 0.0002504 0.6923288 -0.0198752 0.0002504 0.6923288 -0.0267565 0.0002504 0.6923288 -0.0354624 0.0002504 0.6923288 -0.0464764 0.0002504 0.6923288 -0.0604106 0.0002504 0.6923288 -0.0780392 0.0002504 0.6923288 -0.1003416 0.0002504 0.6923288 -0.128557 0.0002504 0.6923288 -0.1642532 0.0002504 0.6923288 -0.2094136 0.0002504 0.6923288 -0.2665473 0.0002504 0.6923288 -0.3388289 0.0002504 0.6923288 -0.4302746 0.0002504 0.6923288 -0.5459652 0.0002504 0.6923288 -0.6923288 0.0002504 0.6923288 -0.8388802 0.0050694 0.6628797 -0.9026634 0.0276479 0.5724735 -0.9351449 0.0621069 0.4912694 -0.9543974 0.1056375 0.4351176 -0.9668479 0.156904 0.4052408 -0.9753591 0.2148124 0.399026 -0.9814002 0.2780936 0.4126808 -0.9858036 0.3451791 0.4420444 -0.9890755 0.4142311 0.4829148 -0.9915418 0.4832747 0.5312658 -0.9934209 0.5503825 0.583442 -0.9948643 0.6138613 0.6363304 -0.9959801 0.6723959 0.687478 -0.9968468 0.7251226 0.7351325 -0.9975226 0.7716288 0.778206 -0.998051 0.8118949 0.816179 -0.9984652 0.8462034 0.8489729 -0.9987904 0.8750386 0.8768178 -0.9990461 0.8989969 0.9001338 -0.9992474 0.9187137 0.919437 -0.9994059 0.9348128 0.9352714 -0.999531 0.9478738 0.9481637 -0.9996296 0.958415 0.9585978 -0.9997074 0.9668867 0.9670018 -0.9997689 0.9736722 0.9737445 -0.9998174 0.9790925 0.9791379 -0.9998557 0.9834128 0.9834412 -0.999886 0.9868504 0.9868682 -0.9999099 0.9895819 0.9895931 -0.9999288 0.9917501 0.991757 -0.9999437 0.9934695 0.9934738 -0.0000238 0.006079 0.6964791 -0.0000382 0.0055755 0.6959756 -0.0000611 0.0049433 0.6953434 -0.0000978 0.0041512 0.6945513 -0.0001565 0.0031613 0.6935614 -0.0002504 0.0019287 0.6923288 -0.0004008 0.0004008 0.6908009 -0.0025241 0.0004008 0.6908009 -0.0052103 0.0004008 0.6908009 -0.0086086 0.0004008 0.6908009 -0.012908 0.0004008 0.6908009 -0.0183473 0.0004008 0.6908009 -0.0252287 0.0004008 0.6908009 -0.0339345 0.0004008 0.6908009 -0.0449485 0.0004008 0.6908009 -0.0588827 0.0004008 0.6908009 -0.0765113 0.0004008 0.6908009 -0.0988137 0.0004008 0.6908009 -0.1270291 0.0004008 0.6908009 -0.1627254 0.0004008 0.6908009 -0.2078857 0.0004008 0.6908009 -0.2650195 0.0004008 0.6908009 -0.337301 0.0004008 0.6908009 -0.4287467 0.0004008 0.6908009 -0.5444373 0.0004008 0.6908009 -0.6908009 0.0004008 0.6908009 -0.8381886 0.0051048 0.6620045 -0.9024114 0.0275966 0.571798 -0.9350332 0.0620199 0.4906404 -0.9543421 0.1055364 0.434545 -0.9668187 0.1568008 0.4047424 -0.975343 0.2147144 0.3986091 -0.9813911 0.2780055 0.4123437 -0.9857982 0.3451032 0.4417797 -0.9890723 0.4141683 0.4827124 -0.9915399 0.4832246 0.5311148 -0.9934197 0.5503438 0.5833319 -0.9948636 0.6138323 0.6362518 -0.9959797 0.6723748 0.687423 -0.9968465 0.7251076 0.7350946 -0.9975224 0.7716184 0.7781803 -0.9980509 0.8118878 0.8161619 -0.9984651 0.8461986 0.8489617 -0.9987903 0.8750355 0.8768104 -0.9990461 0.8989948 0.900129 -0.9992473 0.9187123 0.919434 -0.9994059 0.9348119 0.9352694 -0.999531 0.9478733 0.9481624 -0.9996296 0.9584146 0.958597 -0.9997074 0.9668865 0.9670013 -0.9997689 0.9736721 0.9737442 -0.9998174 0.9790924 0.9791377 -0.9998557 0.9834127 0.9834411 -0.999886 0.9868504 0.9868682 -0.9999099 0.9895819 0.9895931 -0.9999288 0.99175 0.991757 -0.9999437 0.9934695 0.9934738 -0.0000238 0.0082023 0.6964791 -0.0000382 0.0076988 0.6959756 -0.0000611 0.0070666 0.6953434 -0.0000978 0.0062744 0.6945513 -0.0001565 0.0052846 0.6935614 -0.0002504 0.004052 0.6923288 -0.0004008 0.0025241 0.6908009 -0.0006416 0.0006416 0.6889184 -0.0033277 0.0006416 0.6889184 -0.0067261 0.0006416 0.6889184 -0.0110255 0.0006416 0.6889184 -0.0164648 0.0006416 0.6889184 -0.0233461 0.0006416 0.6889184 -0.032052 0.0006416 0.6889184 -0.043066 0.0006416 0.6889184 -0.0570002 0.0006416 0.6889184 -0.0746288 0.0006416 0.6889184 -0.0969312 0.0006416 0.6889184 -0.1251466 0.0006416 0.6889184 -0.1608428 0.0006416 0.6889184 -0.2060032 0.0006416 0.6889184 -0.2631369 0.0006416 0.6889184 -0.3354185 0.0006416 0.6889184 -0.4268641 0.0006416 0.6889184 -0.5425548 0.0006416 0.6889184 -0.6889184 0.0006416 0.6889184 -0.8373283 0.0052028 0.6609191 -0.9020992 0.0275778 0.5709632 -0.9348949 0.0619473 0.4898637 -0.9542739 0.1054384 0.4338381 -0.9667827 0.1566936 0.4041273 -0.9753231 0.2146085 0.3980948 -0.9813797 0.2779077 0.4119279 -0.9857916 0.3450175 0.4414533 -0.9890684 0.4140964 0.4824629 -0.9915376 0.4831666 0.5309287 -0.9934183 0.5502987 0.5831962 -0.9948628 0.6137984 0.6361549 -0.9959791 0.67235 0.6873552 -0.9968462 0.7250899 0.735048 -0.9975222 0.7716061 0.7781488 -0.9980508 0.8118794 0.8161408 -0.998465 0.8461929 0.8489478 -0.9987903 0.8750317 0.8768014 -0.999046 0.8989923 0.9001231 -0.9992473 0.9187107 0.9194302 -0.9994059 0.9348109 0.935267 -0.999531 0.9478726 0.9481609 -0.9996296 0.9584142 0.958596 -0.9997074 0.9668862 0.9670006 -0.9997689 0.9736719 0.9737438 -0.9998174 0.9790923 0.9791374 -0.9998557 0.9834127 0.983441 -0.999886 0.9868503 0.9868681 -0.9999099 0.9895819 0.989593 -0.9999288 0.99175 0.991757 -0.9999437 0.9934694 0.9934738 -0.0000238 0.0108885 0.6964791 -0.0000382 0.0103849 0.6959756 -0.0000611 0.0097527 0.6953434 -0.0000978 0.0089606 0.6945513 -0.0001565 0.0079707 0.6935614 -0.0002504 0.0067381 0.6923288 -0.0004008 0.0052103 0.6908009 -0.0006416 0.0033277 0.6889184 -0.0010268 0.0010268 0.6866175 -0.0044252 0.0010268 0.6866175 -0.0087246 0.0010268 0.6866175 -0.0141639 0.0010268 0.6866175 -0.0210452 0.0010268 0.6866175 -0.0297511 0.0010268 0.6866175 -0.0407651 0.0010268 0.6866175 -0.0546993 0.0010268 0.6866175 -0.0723279 0.0010268 0.6866175 -0.0946303 0.0010268 0.6866175 -0.1228457 0.0010268 0.6866175 -0.1585419 0.0010268 0.6866175 -0.2037023 0.0010268 0.6866175 -0.260836 0.0010268 0.6866175 -0.3331176 0.0010268 0.6866175 -0.4245633 0.0010268 0.6866175 -0.5402539 0.0010268 0.6866175 -0.6866175 0.0010268 0.6866175 -0.8362644 0.0054121 0.6595817 -0.9017148 0.0276281 0.5699388 -0.9347252 0.061916 0.4889116 -0.9541902 0.1053624 0.4329722 -0.9667385 0.1565954 0.4033741 -0.9752987 0.2145034 0.3974652 -0.9813659 0.2778058 0.4114191 -0.9857835 0.3449254 0.4410539 -0.9890637 0.4140176 0.4821576 -0.9915347 0.4831021 0.530701 -0.9934166 0.550248 0.5830302 -0.9948617 0.6137599 0.6360365 -0.9959785 0.6723217 0.6872723 -0.9968458 0.7250697 0.734991 -0.997522 0.7715919 0.7781102 -0.9980506 0.8118697 0.816115 -0.9984649 0.8461864 0.8489308 -0.9987902 0.8750274 0.8767903 -0.999046 0.8989895 0.9001159 -0.9992473 0.9187089 0.9194255 -0.9994059 0.9348097 0.935264 -0.999531 0.9478718 0.948159 -0.9996296 0.9584137 0.9585948 -0.9997074 0.9668859 0.9669999 -0.9997689 0.9736717 0.9737434 -0.9998174 0.9790921 0.9791371 -0.9998557 0.9834126 0.9834408 -0.999886 0.9868503 0.986868 -0.9999099 0.9895819 0.9895929 -0.9999288 0.99175 0.9917569 -0.9999437 0.9934694 0.9934738 -0.0000238 0.0142868 0.6964791 -0.0000382 0.0137833 0.6959756 -0.0000611 0.0131511 0.6953434 -0.0000978 0.012359 0.6945513 -0.0001565 0.0113691 0.6935614 -0.0002504 0.0101365 0.6923288 -0.0004008 0.0086086 0.6908009 -0.0006416 0.0067261 0.6889184 -0.0010268 0.0044252 0.6866175 -0.0016435 0.0016435 0.6838358 -0.0059429 0.0016435 0.6838358 -0.0113822 0.0016435 0.6838358 -0.0182636 0.0016435 0.6838358 -0.0269694 0.0016435 0.6838358 -0.0379834 0.0016435 0.6838358 -0.0519176 0.0016435 0.6838358 -0.0695462 0.0016435 0.6838358 -0.0918486 0.0016435 0.6838358 -0.120064 0.0016435 0.6838358 -0.1557603 0.0016435 0.6838358 -0.2009206 0.0016435 0.6838358 -0.2580543 0.0016435 0.6838358 -0.3303359 0.0016435 0.6838358 -0.4217816 0.0016435 0.6838358 -0.5374722 0.0016435 0.6838358 -0.6838358 0.0016435 0.6838358 -0.8349593 0.0058134 0.6579487 -0.9012461 0.0278105 0.5686945 -0.9345187 0.0619734 0.4877565 -0.9540886 0.1053433 0.4319223 -0.966685 0.1565315 0.4024614 -0.9752692 0.2144168 0.3967026 -0.9813491 0.2777122 0.410803 -0.9857738 0.3448353 0.4405705 -0.9890579 0.4139373 0.4817882 -0.9915312 0.4830346 0.5304255 -0.9934145 0.5501939 0.5828294 -0.9948604 0.6137183 0.6358932 -0.9959777 0.6722907 0.687172 -0.9968453 0.7250473 0.7349221 -0.9975217 0.7715762 0.7780636 -0.9980504 0.8118589 0.8160839 -0.9984648 0.8461791 0.8489102 -0.9987902 0.8750225 0.8767768 -0.9990459 0.8989863 0.9001073 -0.9992473 0.9187068 0.9194199 -0.9994059 0.9348083 0.9352604 -0.9995309 0.947871 0.9481567 -0.9996296 0.9584132 0.9585934 -0.9997074 0.9668855 0.966999 -0.9997689 0.9736715 0.9737428 -0.9998174 0.979092 0.9791368 -0.9998557 0.9834125 0.9834405 -0.999886 0.9868502 0.9868678 -0.9999099 0.9895818 0.9895928 -0.9999288 0.99175 0.9917569 -0.9999437 0.9934694 0.9934737 -0.0000238 0.0185862 0.6964791 -0.0000382 0.0180827 0.6959756 -0.0000611 0.0174505 0.6953434 -0.0000978 0.0166583 0.6945513 -0.0001565 0.0156685 0.6935614 -0.0002504 0.0144359 0.6923288 -0.0004008 0.012908 0.6908009 -0.0006416 0.0110255 0.6889184 -0.0010268 0.0087246 0.6866175 -0.0016435 0.0059429 0.6838358 -0.0026305 0.0026305 0.6805235 -0.0080698 0.0026305 0.6805235 -0.0149512 0.0026305 0.6805235 -0.023657 0.0026305 0.6805235 -0.0346711 0.0026305 0.6805235 -0.0486053 0.0026305 0.6805235 -0.0662338 0.0026305 0.6805235 -0.0885362 0.0026305 0.6805235 -0.1167517 0.0026305 0.6805235 -0.1524479 0.0026305 0.6805235 -0.1976083 0.0026305 0.6805235 -0.254742 0.0026305 0.6805235 -0.3270236 0.0026305 0.6805235 -0.4184692 0.0026305 0.6805235 -0.5341598 0.0026305 0.6805235 -0.6805235 0.0026305 0.6805235 -0.8333779 0.0065402 0.6559807 -0.900682 0.0282324 0.5672044 -0.9342712 0.062202 0.4863753 -0.9539671 0.1054431 0.4306679 -0.9666211 0.1565473 0.4013716 -0.975234 0.2143816 0.3957926 -0.9813291 0.2776503 0.410068 -0.9857621 0.3447636 0.439994 -0.989051 0.4138668 0.4813478 -0.9915271 0.4829718 0.5300971 -0.993412 0.5501416 0.5825901 -0.9948589 0.6136769 0.6357225 -0.9959768 0.6722594 0.6870525 -0.9968448 0.7250244 0.73484 -0.9975213 0.7715599 0.778008 -0.9980502 0.8118476 0.8160468 -0.9984647 0.8461714 0.8488857 -0.9987901 0.8750173 0.8767609 -0.9990459 0.8989829 0.9000969 -0.9992472 0.9187045 0.9194133 -0.9994059 0.9348069 0.9352562 -0.9995309 0.94787 0.948154 -0.9996296 0.9584126 0.9585917 -0.9997074 0.9668852 0.9669979 -0.9997689 0.9736712 0.9737421 -0.9998174 0.9790919 0.9791363 -0.9998557 0.9834124 0.9834403 -0.999886 0.9868502 0.9868676 -0.9999099 0.9895818 0.9895927 -0.9999288 0.99175 0.9917568 -0.9999437 0.9934694 0.9934737 -0.0000238 0.0240255 0.6964791 -0.0000382 0.023522 0.6959756 -0.0000611 0.0228898 0.6953434 -0.0000978 0.0220976 0.6945513 -0.0001565 0.0211078 0.6935614 -0.0002504 0.0198752 0.6923288 -0.0004008 0.0183473 0.6908009 -0.0006416 0.0164648 0.6889184 -0.0010268 0.0141639 0.6866175 -0.0016435 0.0113822 0.6838358 -0.0026305 0.0080698 0.6805235 -0.0042103 0.0042103 0.676664 -0.0110917 0.0042103 0.676664 -0.0197975 0.0042103 0.676664 -0.0308116 0.0042103 0.676664 -0.0447458 0.0042103 0.676664 -0.0623743 0.0042103 0.676664 -0.0846767 0.0042103 0.676664 -0.1128922 0.0042103 0.676664 -0.1485884 0.0042103 0.676664 -0.1937488 0.0042103 0.676664 -0.2508825 0.0042103 0.676664 -0.3231641 0.0042103 0.676664 -0.4146097 0.0042103 0.676664 -0.5303003 0.0042103 0.676664 -0.676664 0.0042103 0.676664 -0.8314967 0.0078103 0.6536548 -0.9000167 0.0290732 0.5654564 -0.9339805 0.062742 0.484758 -0.9538247 0.1057683 0.4292005 -0.9665463 0.1567226 0.4000976 -0.9751928 0.2144566 0.3947294 -0.9813057 0.2776626 0.4092098 -0.9857485 0.3447407 0.4393211 -0.989043 0.4138277 0.4808339 -0.9915223 0.4829286 0.5297141 -0.9934091 0.5501012 0.582311 -0.9948571 0.6136427 0.6355234 -0.9959757 0.6722322 0.6869133 -0.9968441 0.7250039 0.7347442 -0.9975209 0.7715449 0.7779432 -0.99805 0.811837 0.8160036 -0.9984645 0.8461641 0.8488572 -0.99879 0.8750124 0.8767422 -0.9990458 0.8989796 0.9000848 -0.9992472 0.9187024 0.9194055 -0.9994059 0.9348055 0.9352512 -0.9995309 0.9478691 0.9481509 -0.9996296 0.958412 0.9585897 -0.9997074 0.9668848 0.9669966 -0.9997689 0.973671 0.9737413 -0.9998174 0.9790917 0.9791358 -0.9998557 0.9834123 0.98344 -0.999886 0.9868501 0.9868674 -0.9999099 0.9895818 0.9895926 -0.9999288 0.9917499 0.9917567 -0.9999437 0.9934694 0.9934736 -0.0000238 0.0309069 0.6964791 -0.0000382 0.0304033 0.6959756 -0.0000611 0.0297711 0.6953434 -0.0000978 0.028979 0.6945513 -0.0001565 0.0279891 0.6935614 -0.0002504 0.0267565 0.6923288 -0.0004008 0.0252287 0.6908009 -0.0006416 0.0233461 0.6889184 -0.0010268 0.0210452 0.6866175 -0.0016435 0.0182636 0.6838358 -0.0026305 0.0149512 0.6805235 -0.0042103 0.0110917 0.676664 -0.0067388 0.0067388 0.6723111 -0.0154447 0.0067388 0.6723111 -0.0264587 0.0067388 0.6723111 -0.0403929 0.0067388 0.6723111 -0.0580214 0.0067388 0.6723111 -0.0803239 0.0067388 0.6723111 -0.1085393 0.0067388 0.6723111 -0.1442355 0.0067388 0.6723111 -0.1893959 0.0067388 0.6723111 -0.2465296 0.0067388 0.6723111 -0.3188112 0.0067388 0.6723111 -0.4102568 0.0067388 0.6723111 -0.5259474 0.0067388 0.6723111 -0.6723111 0.0067388 0.6723111 -0.8293233 0.0099781 0.6509878 -0.8992555 0.0306306 0.5634696 -0.9336494 0.0638283 0.4829236 -0.953663 0.1064997 0.4275379 -0.9664615 0.1571937 0.3986555 -0.9751462 0.2147432 0.3935266 -0.9812792 0.2778236 0.4082395 -0.9857332 0.3448204 0.4385606 -0.9890339 0.4138582 0.4802533 -0.9915169 0.4829319 0.5292815 -0.9934058 0.5500915 0.5819959 -0.9948551 0.6136284 0.6352987 -0.9959745 0.672218 0.6867561 -0.9968433 0.7249916 0.7346362 -0.9975204 0.7715352 0.7778701 -0.9980497 0.8118298 0.8159548 -0.9984643 0.8461589 0.848825 -0.9987899 0.8750088 0.8767212 -0.9990458 0.8989771 0.9000712 -0.9992472 0.9187008 0.9193968 -0.9994058 0.9348044 0.9352456 -0.9995309 0.9478684 0.9481473 -0.9996296 0.9584115 0.9585874 -0.9997074 0.9668845 0.9669952 -0.9997689 0.9736708 0.9737404 -0.9998174 0.9790916 0.9791353 -0.9998557 0.9834122 0.9834396 -0.999886 0.9868501 0.9868672 -0.9999099 0.9895817 0.9895925 -0.9999288 0.9917499 0.9917566 -0.9999437 0.9934694 0.9934736 -0.0000238 0.0396127 0.6964791 -0.0000382 0.0391092 0.6959756 -0.0000611 0.038477 0.6953434 -0.0000978 0.0376849 0.6945513 -0.0001565 0.036695 0.6935614 -0.0002504 0.0354624 0.6923288 -0.0004008 0.0339345 0.6908009 -0.0006416 0.032052 0.6889184 -0.0010268 0.0297511 0.6866175 -0.0016435 0.0269694 0.6838358 -0.0026305 0.023657 0.6805235 -0.0042103 0.0197975 0.676664 -0.0067388 0.0154447 0.6723111 -0.0107859 0.0107859 0.6676523 -0.0217999 0.0107859 0.6676523 -0.0357341 0.0107859 0.6676523 -0.0533626 0.0107859 0.6676523 -0.075665 0.0107859 0.6676523 -0.1038805 0.0107859 0.6676523 -0.1395767 0.0107859 0.6676523 -0.1847371 0.0107859 0.6676523 -0.2418708 0.0107859 0.6676523 -0.3141524 0.0107859 0.6676523 -0.405598 0.0107859 0.6676523 -0.5212886 0.0107859 0.6676523 -0.6676523 0.0107859 0.6676523 -0.8269342 0.0136166 0.6480804 -0.8984278 0.0333932 0.561325 -0.9332914 0.0658501 0.480948 -0.9534887 0.1079385 0.4257495 -0.9663702 0.15819 0.3971056 -0.9750962 0.2154135 0.392235 -0.9812508 0.2782606 0.4071981 -0.9857167 0.3450957 0.4377449 -0.9890241 0.4140252 0.4796308 -0.991511 0.4830292 0.5288178 -0.9934023 0.5501456 0.5816582 -0.994853 0.6136569 0.6350579 -0.9959732 0.672232 0.6865877 -0.9968425 0.7249978 0.7345205 -0.9975199 0.7715376 0.7777918 -0.9980494 0.8118303 0.8159025 -0.9984642 0.8461587 0.8487906 -0.9987897 0.8750084 0.8766987 -0.9990457 0.8989767 0.9000567 -0.9992471 0.9187004 0.9193874 -0.9994058 0.9348042 0.9352396 -0.9995309 0.9478683 0.9481435 -0.9996295 0.9584114 0.958585 -0.9997074 0.9668844 0.9669937 -0.9997689 0.9736708 0.9737394 -0.9998174 0.9790916 0.9791347 -0.9998557 0.9834122 0.9834392 -0.999886 0.98685 0.986867 -0.9999099 0.9895817 0.9895923 -0.9999288 0.9917499 0.9917565 -0.9999437 0.9934694 0.9934735 -0.0000238 0.0506267 0.6964791 -0.0000382 0.0501232 0.6959756 -0.0000611 0.049491 0.6953434 -0.0000978 0.0486989 0.6945513 -0.0001565 0.047709 0.6935614 -0.0002504 0.0464764 0.6923288 -0.0004008 0.0449485 0.6908009 -0.0006416 0.043066 0.6889184 -0.0010268 0.0407651 0.6866175 -0.0016435 0.0379834 0.6838358 -0.0026305 0.0346711 0.6805235 -0.0042103 0.0308116 0.676664 -0.0067388 0.0264587 0.6723111 -0.0107859 0.0217999 0.6676523 -0.0172633 0.0172633 0.6631157 -0.0311975 0.0172633 0.6631157 -0.0488261 0.0172633 0.6631157 -0.0711285 0.0172633 0.6631157 -0.099344 0.0172633 0.6631157 -0.1350402 0.0172633 0.6631157 -0.1802005 0.0172633 0.6631157 -0.2373343 0.0172633 0.6631157 -0.3096159 0.0172633 0.6631157 -0.4010615 0.0172633 0.6631157 -0.5167521 0.0172633 0.6631157 -0.6631157 0.0172633 0.6631157 -0.8245426 0.0196467 0.6451948 -0.8976087 0.0381561 0.5592184 -0.9329391 0.0694453 0.479012 -0.9533177 0.1105818 0.4239991 -0.9662809 0.160092 0.3955901 -0.9750472 0.2167545 0.390973 -0.9812231 0.2791873 0.4061813 -0.9857006 0.3457234 0.4369488 -0.9890146 0.4144423 0.4790235 -0.9915054 0.4833013 0.5283656 -0.9933988 0.5503203 0.581329 -0.9948509 0.6137675 0.6348232 -0.9959719 0.6723012 0.6864236 -0.9968418 0.7250408 0.7344077 -0.9975194 0.7715641 0.7777156 -0.9980491 0.8118466 0.8158516 -0.998464 0.8461687 0.848757 -0.9987896 0.8750145 0.8766768 -0.9990456 0.8989805 0.9000425 -0.9992471 0.9187027 0.9193783 -0.9994058 0.9348056 0.9352338 -0.9995309 0.9478691 0.9481398 -0.9996295 0.958412 0.9585826 -0.9997074 0.9668847 0.9669922 -0.9997688 0.973671 0.9737385 -0.9998174 0.9790917 0.9791341 -0.9998557 0.9834123 0.9834389 -0.999886 0.9868501 0.9868667 -0.9999099 0.9895817 0.9895922 -0.9999288 0.9917499 0.9917565 -0.9999437 0.9934694 0.9934735 -0.0000238 0.0645609 0.6964791 -0.0000382 0.0640574 0.6959756 -0.0000611 0.0634252 0.6953434 -0.0000978 0.0626331 0.6945513 -0.0001565 0.0616432 0.6935614 -0.0002504 0.0604106 0.6923288 -0.0004008 0.0588827 0.6908009 -0.0006416 0.0570002 0.6889184 -0.0010268 0.0546993 0.6866175 -0.0016435 0.0519176 0.6838358 -0.0026305 0.0486053 0.6805235 -0.0042103 0.0447458 0.676664 -0.0067388 0.0403929 0.6723111 -0.0107859 0.0357341 0.6676523 -0.0172633 0.0311975 0.6631157 -0.0276309 0.0276309 0.6595491 -0.0452595 0.0276309 0.6595491 -0.0675619 0.0276309 0.6595491 -0.0957773 0.0276309 0.6595491 -0.1314736 0.0276309 0.6595491 -0.1766339 0.0276309 0.6595491 -0.2337676 0.0276309 0.6595491 -0.3060492 0.0276309 0.6595491 -0.3974949 0.0276309 0.6595491 -0.5131855 0.0276309 0.6595491 -0.6595491 0.0276309 0.6595491 -0.8226154 0.0295373 0.6428873 -0.8969554 0.0461985 0.5575493 -0.9326595 0.0756464 0.4774812 -0.9531823 0.1152388 0.4226166 -0.9662104 0.1635226 0.3943942 -0.9750086 0.2192389 0.3899778 -0.9812013 0.2809573 0.4053799 -0.9856879 0.3469645 0.4363216 -0.9890072 0.4152991 0.4785453 -0.9915009 0.4838841 0.5280096 -0.9933961 0.5507113 0.5810699 -0.9948493 0.6140266 0.6346385 -0.9959709 0.6724711 0.6862945 -0.9968411 0.7251511 0.7343191 -0.9975191 0.7716352 0.7776556 -0.9980488 0.8118921 0.8158116 -0.9984638 0.8461977 0.8487306 -0.9987895 0.8750329 0.8766596 -0.9990456 0.8989921 0.9000313 -0.999247 0.9187101 0.9193711 -0.9994057 0.9348102 0.9352292 -0.9995309 0.947872 0.9481369 -0.9996295 0.9584138 0.9585808 -0.9997074 0.9668859 0.966991 -0.9997688 0.9736717 0.9737378 -0.9998174 0.9790921 0.9791336 -0.9998557 0.9834126 0.9834386 -0.999886 0.9868503 0.9868666 -0.9999099 0.9895819 0.9895921 -0.9999288 0.99175 0.9917564 -0.9999437 0.9934694 0.9934734 -0.0000238 0.0821895 0.6964791 -0.0000382 0.081686 0.6959756 -0.0000611 0.0810538 0.6953434 -0.0000978 0.0802616 0.6945513 -0.0001565 0.0792718 0.6935614 -0.0002504 0.0780392 0.6923288 -0.0004008 0.0765113 0.6908009 -0.0006416 0.0746288 0.6889184 -0.0010268 0.0723279 0.6866175 -0.0016435 0.0695462 0.6838358 -0.0026305 0.0662338 0.6805235 -0.0042103 0.0623743 0.676664 -0.0067388 0.0580214 0.6723111 -0.0107859 0.0533626 0.6676523 -0.0172633 0.0488261 0.6631157 -0.0276309 0.0452595 0.6595491 -0.0441188 0.0441188 0.6584084 -0.0664212 0.0441188 0.6584084 -0.0946366 0.0441188 0.6584084 -0.1303328 0.0441188 0.6584084 -0.1754932 0.0441188 0.6584084 -0.2326269 0.0441188 0.6584084 -0.3049085 0.0441188 0.6584084 -0.3963542 0.0441188 0.6584084 -0.5120448 0.0441188 0.6584084 -0.6584084 0.0441188 0.6584084 -0.8219901 0.0455041 0.6421419 -0.8967447 0.0594506 0.557013 -0.9325696 0.0860209 0.4769901 -0.9531389 0.1231452 0.4221733 -0.9661878 0.1694384 0.3940109 -0.9749962 0.2235962 0.389659 -0.9811943 0.2841192 0.4051232 -0.9856839 0.3492254 0.4361208 -0.9890048 0.4168922 0.4783922 -0.9914995 0.4849907 0.5278957 -0.9933953 0.5514695 0.580987 -0.9948487 0.6145393 0.6345795 -0.9959706 0.6728136 0.6862532 -0.9968409 0.7253775 0.7342907 -0.9975189 0.7717834 0.7776364 -0.9980488 0.8119884 0.8157988 -0.9984638 0.8462598 0.8487222 -0.9987895 0.8750727 0.8766541 -0.9990455 0.8990175 0.9000277 -0.999247 0.9187262 0.9193688 -0.9994057 0.9348204 0.9352277 -0.9995308 0.9478785 0.9481359 -0.9996295 0.9584178 0.9585802 -0.9997074 0.9668884 0.9669906 -0.9997688 0.9736733 0.9737375 -0.9998174 0.9790931 0.9791334 -0.9998557 0.9834132 0.9834385 -0.999886 0.9868507 0.9868665 -0.9999099 0.9895821 0.989592 -0.9999288 0.9917502 0.9917564 -0.9999437 0.9934695 0.9934734 -0.0000238 0.1044919 0.6964791 -0.0000382 0.1039884 0.6959756 -0.0000611 0.1033562 0.6953434 -0.0000978 0.102564 0.6945513 -0.0001565 0.1015742 0.6935614 -0.0002504 0.1003416 0.6923288 -0.0004008 0.0988137 0.6908009 -0.0006416 0.0969312 0.6889184 -0.0010268 0.0946303 0.6866175 -0.0016435 0.0918486 0.6838358 -0.0026305 0.0885362 0.6805235 -0.0042103 0.0846767 0.676664 -0.0067388 0.0803239 0.6723111 -0.0107859 0.075665 0.6676523 -0.0172633 0.0711285 0.6631157 -0.0276309 0.0675619 0.6595491 -0.0441188 0.0664212 0.6584084 -0.0664212 0.0664212 0.6584084 -0.0946366 0.0664212 0.6584084 -0.1303328 0.0664212 0.6584084 -0.1754932 0.0664212 0.6584084 -0.2326269 0.0664212 0.6584084 -0.3049085 0.0664212 0.6584084 -0.3963542 0.0664212 0.6584084 -0.5120448 0.0664212 0.6584084 -0.6584084 0.0664212 0.6584084 -0.8219901 0.0671656 0.6421419 -0.8967447 0.0775151 0.557013 -0.9325696 0.1002154 0.4769901 -0.9531389 0.1340017 0.4221733 -0.9661878 0.1775917 0.3940109 -0.9749962 0.2296253 0.389659 -0.9811943 0.2885124 0.4051232 -0.9856839 0.3523802 0.4361208 -0.9890048 0.419125 0.4783922 -0.9914995 0.4865484 0.5278957 -0.9933953 0.5525411 0.580987 -0.9948487 0.6152669 0.6345795 -0.9959706 0.6733015 0.6862532 -0.9968409 0.7257011 0.7342907 -0.9975189 0.7719959 0.7776364 -0.9980488 0.8121268 0.8157988 -0.9984638 0.8463492 0.8487222 -0.9987895 0.8751301 0.8766541 -0.9990455 0.8990542 0.9000277 -0.999247 0.9187495 0.9193688 -0.9994057 0.9348352 0.9352277 -0.9995308 0.9478878 0.9481359 -0.9996295 0.9584237 0.9585802 -0.9997074 0.9668922 0.9669906 -0.9997688 0.9736756 0.9737375 -0.9998174 0.9790946 0.9791334 -0.9998557 0.9834141 0.9834385 -0.999886 0.9868512 0.9868665 -0.9999099 0.9895825 0.989592 -0.9999288 0.9917504 0.9917564 -0.9999437 0.9934697 0.9934734 -0.0000238 0.1327073 0.6964791 -0.0000382 0.1322038 0.6959756 -0.0000611 0.1315716 0.6953434 -0.0000978 0.1307795 0.6945513 -0.0001565 0.1297896 0.6935614 -0.0002504 0.128557 0.6923288 -0.0004008 0.1270291 0.6908009 -0.0006416 0.1251466 0.6889184 -0.0010268 0.1228457 0.6866175 -0.0016435 0.120064 0.6838358 -0.0026305 0.1167517 0.6805235 -0.0042103 0.1128922 0.676664 -0.0067388 0.1085393 0.6723111 -0.0107859 0.1038805 0.6676523 -0.0172633 0.099344 0.6631157 -0.0276309 0.0957773 0.6595491 -0.0441188 0.0946366 0.6584084 -0.0664212 0.0946366 0.6584084 -0.0946366 0.0946366 0.6584084 -0.1303328 0.0946366 0.6584084 -0.1754932 0.0946366 0.6584084 -0.2326269 0.0946366 0.6584084 -0.3049085 0.0946366 0.6584084 -0.3963542 0.0946366 0.6584084 -0.5120448 0.0946366 0.6584084 -0.6584084 0.0946366 0.6584084 -0.8219901 0.0945703 0.6421419 -0.8967447 0.1003691 0.557013 -0.9325696 0.1181733 0.4769901 -0.9531389 0.1477366 0.4221733 -0.9661878 0.1879067 0.3940109 -0.9749962 0.2372529 0.389659 -0.9811943 0.2940703 0.4051232 -0.9856839 0.3563715 0.4361208 -0.9890048 0.4219498 0.4783922 -0.9914995 0.4885191 0.5278957 -0.9933953 0.5538969 0.580987 -0.9948487 0.6161874 0.6345795 -0.9959706 0.6739188 0.6862532 -0.9968409 0.7261105 0.7342907 -0.9975189 0.7722648 0.7776364 -0.9980488 0.8123018 0.8157988 -0.9984638 0.8464623 0.8487222 -0.9987895 0.8752028 0.8766541 -0.9990455 0.8991006 0.9000277 -0.999247 0.9187791 0.9193688 -0.9994057 0.9348539 0.9352277 -0.9995308 0.9478997 0.9481359 -0.9996295 0.9584312 0.9585802 -0.9997074 0.9668969 0.9669906 -0.9997688 0.9736786 0.9737375 -0.9998174 0.9790965 0.9791334 -0.9998557 0.9834153 0.9834385 -0.999886 0.986852 0.9868665 -0.9999099 0.9895829 0.989592 -0.9999288 0.9917507 0.9917564 -0.9999437 0.9934698 0.9934734 -0.0000238 0.1684036 0.6964791 -0.0000382 0.1679 0.6959756 -0.0000611 0.1672678 0.6953434 -0.0000978 0.1664757 0.6945513 -0.0001565 0.1654858 0.6935614 -0.0002504 0.1642532 0.6923288 -0.0004008 0.1627254 0.6908009 -0.0006416 0.1608428 0.6889184 -0.0010268 0.1585419 0.6866175 -0.0016435 0.1557603 0.6838358 -0.0026305 0.1524479 0.6805235 -0.0042103 0.1485884 0.676664 -0.0067388 0.1442355 0.6723111 -0.0107859 0.1395767 0.6676523 -0.0172633 0.1350402 0.6631157 -0.0276309 0.1314736 0.6595491 -0.0441188 0.1303328 0.6584084 -0.0664212 0.1303328 0.6584084 -0.0946366 0.1303328 0.6584084 -0.1303328 0.1303328 0.6584084 -0.1754932 0.1303328 0.6584084 -0.2326269 0.1303328 0.6584084 -0.3049085 0.1303328 0.6584084 -0.3963542 0.1303328 0.6584084 -0.5120448 0.1303328 0.6584084 -0.6584084 0.1303328 0.6584084 -0.8219901 0.1292408 0.6421419 -0.8967447 0.1292823 0.557013 -0.9325696 0.1408925 0.4769901 -0.9531389 0.1651131 0.4221733 -0.9661878 0.2009566 0.3940109 -0.9749962 0.2469027 0.389659 -0.9811943 0.3011018 0.4051232 -0.9856839 0.3614209 0.4361208 -0.9890048 0.4255236 0.4783922 -0.9914995 0.4910123 0.5278957 -0.9933953 0.5556122 0.580987 -0.9948487 0.6173519 0.6345795 -0.9959706 0.6746998 0.6862532 -0.9968409 0.7266285 0.7342907 -0.9975189 0.7726049 0.7776364 -0.9980488 0.8125232 0.8157988 -0.9984638 0.8466054 0.8487222 -0.9987895 0.8752947 0.8766541 -0.9990455 0.8991593 0.9000277 -0.999247 0.9188164 0.9193688 -0.9994057 0.9348776 0.9352277 -0.9995308 0.9479146 0.9481359 -0.9996295 0.9584406 0.9585802 -0.9997074 0.9669028 0.9669906 -0.9997688 0.9736823 0.9737375 -0.9998174 0.9790988 0.9791334 -0.9998557 0.9834167 0.9834385 -0.999886 0.9868529 0.9868665 -0.9999099 0.9895835 0.989592 -0.9999288 0.991751 0.9917564 -0.9999437 0.9934701 0.9934734 -0.0000238 0.2135639 0.6964791 -0.0000382 0.2130604 0.6959756 -0.0000611 0.2124282 0.6953434 -0.0000978 0.2116361 0.6945513 -0.0001565 0.2106462 0.6935614 -0.0002504 0.2094136 0.6923288 -0.0004008 0.2078857 0.6908009 -0.0006416 0.2060032 0.6889184 -0.0010268 0.2037023 0.6866175 -0.0016435 0.2009206 0.6838358 -0.0026305 0.1976083 0.6805235 -0.0042103 0.1937488 0.676664 -0.0067388 0.1893959 0.6723111 -0.0107859 0.1847371 0.6676523 -0.0172633 0.1802005 0.6631157 -0.0276309 0.1766339 0.6595491 -0.0441188 0.1754932 0.6584084 -0.0664212 0.1754932 0.6584084 -0.0946366 0.1754932 0.6584084 -0.1303328 0.1754932 0.6584084 -0.1754932 0.1754932 0.6584084 -0.2326269 0.1754932 0.6584084 -0.3049085 0.1754932 0.6584084 -0.3963542 0.1754932 0.6584084 -0.5120448 0.1754932 0.6584084 -0.6584084 0.1754932 0.6584084 -0.8219901 0.1731034 0.6421419 -0.8967447 0.1658613 0.557013 -0.9325696 0.1696351 0.4769901 -0.9531389 0.1870965 0.4221733 -0.9661878 0.2174663 0.3940109 -0.9749962 0.2591111 0.389659 -0.9811943 0.3099976 0.4051232 -0.9856839 0.3678092 0.4361208 -0.9890048 0.4300448 0.4783922 -0.9914995 0.4941665 0.5278957 -0.9933953 0.5577822 0.580987 -0.9948487 0.6188252 0.6345795 -0.9959706 0.6756878 0.6862532 -0.9968409 0.7272837 0.7342907 -0.9975189 0.7730352 0.7776364 -0.9980488 0.8128033 0.8157988 -0.9984638 0.8467864 0.8487222 -0.9987895 0.8754109 0.8766541 -0.9990455 0.8992336 0.9000277 -0.999247 0.9188636 0.9193688 -0.9994057 0.9349075 0.9352277 -0.9995308 0.9479335 0.9481359 -0.9996295 0.9584526 0.9585802 -0.9997074 0.9669103 0.9669906 -0.9997688 0.973687 0.9737375 -0.9998174 0.9791018 0.9791334 -0.9998557 0.9834186 0.9834385 -0.999886 0.9868541 0.9868665 -0.9999099 0.9895842 0.989592 -0.9999288 0.9917515 0.9917564 -0.9999437 0.9934704 0.9934734 -0.0000238 0.2706977 0.6964791 -0.0000382 0.2701941 0.6959756 -0.0000611 0.2695619 0.6953434 -0.0000978 0.2687698 0.6945513 -0.0001565 0.2677799 0.6935614 -0.0002504 0.2665473 0.6923288 -0.0004008 0.2650195 0.6908009 -0.0006416 0.2631369 0.6889184 -0.0010268 0.260836 0.6866175 -0.0016435 0.2580543 0.6838358 -0.0026305 0.254742 0.6805235 -0.0042103 0.2508825 0.676664 -0.0067388 0.2465296 0.6723111 -0.0107859 0.2418708 0.6676523 -0.0172633 0.2373343 0.6631157 -0.0276309 0.2337676 0.6595491 -0.0441188 0.2326269 0.6584084 -0.0664212 0.2326269 0.6584084 -0.0946366 0.2326269 0.6584084 -0.1303328 0.2326269 0.6584084 -0.1754932 0.2326269 0.6584084 -0.2326269 0.2326269 0.6584084 -0.3049085 0.2326269 0.6584084 -0.3963542 0.2326269 0.6584084 -0.5120448 0.2326269 0.6584084 -0.6584084 0.2326269 0.6584084 -0.8219901 0.2285954 0.6421419 -0.8967447 0.2121385 0.557013 -0.9325696 0.2059983 0.4769901 -0.9531389 0.2149085 0.4221733 -0.9661878 0.2383533 0.3940109 -0.9749962 0.2745562 0.389659 -0.9811943 0.3212519 0.4051232 -0.9856839 0.3758911 0.4361208 -0.9890048 0.4357648 0.4783922 -0.9914995 0.498157 0.5278957 -0.9933953 0.5605276 0.580987 -0.9948487 0.6206891 0.6345795 -0.9959706 0.6769378 0.6862532 -0.9968409 0.7281127 0.7342907 -0.9975189 0.7735795 0.7776364 -0.9980488 0.8131577 0.8157988 -0.9984638 0.8470154 0.8487222 -0.9987895 0.875558 0.8766541 -0.9990455 0.8993275 0.9000277 -0.999247 0.9189234 0.9193688 -0.9994057 0.9349454 0.9352277 -0.9995308 0.9479575 0.9481359 -0.9996295 0.9584677 0.9585802 -0.9997074 0.9669198 0.9669906 -0.9997688 0.973693 0.9737375 -0.9998174 0.9791055 0.9791334 -0.9998557 0.9834209 0.9834385 -0.999886 0.9868555 0.9868665 -0.9999099 0.9895851 0.989592 -0.9999288 0.9917521 0.9917564 -0.9999437 0.9934707 0.9934734 -0.0000238 0.3429792 0.6964791 -0.0000382 0.3424757 0.6959756 -0.0000611 0.3418435 0.6953434 -0.0000978 0.3410514 0.6945513 -0.0001565 0.3400615 0.6935614 -0.0002504 0.3388289 0.6923288 -0.0004008 0.337301 0.6908009 -0.0006416 0.3354185 0.6889184 -0.0010268 0.3331176 0.6866175 -0.0016435 0.3303359 0.6838358 -0.0026305 0.3270236 0.6805235 -0.0042103 0.3231641 0.676664 -0.0067388 0.3188112 0.6723111 -0.0107859 0.3141524 0.6676523 -0.0172633 0.3096159 0.6631157 -0.0276309 0.3060492 0.6595491 -0.0441188 0.3049085 0.6584084 -0.0664212 0.3049085 0.6584084 -0.0946366 0.3049085 0.6584084 -0.1303328 0.3049085 0.6584084 -0.1754932 0.3049085 0.6584084 -0.2326269 0.3049085 0.6584084 -0.3049085 0.3049085 0.6584084 -0.3963542 0.3049085 0.6584084 -0.5120448 0.3049085 0.6584084 -0.6584084 0.3049085 0.6584084 -0.8219901 0.2988 0.6421419 -0.8967447 0.2706852 0.557013 -0.9325696 0.2520025 0.4769901 -0.9531389 0.2500942 0.4221733 -0.9661878 0.2647781 0.3940109 -0.9749962 0.2940963 0.389659 -0.9811943 0.3354901 0.4051232 -0.9856839 0.3861159 0.4361208 -0.9890048 0.4430013 0.4783922 -0.9914995 0.5032055 0.5278957 -0.9933953 0.5640008 0.580987 -0.9948487 0.6230471 0.6345795 -0.9959706 0.6785192 0.6862532 -0.9968409 0.7291615 0.7342907 -0.9975189 0.7742682 0.7776364 -0.9980488 0.8136061 0.8157988 -0.9984638 0.8473052 0.8487222 -0.9987895 0.8757441 0.8766541 -0.9990455 0.8994464 0.9000277 -0.999247 0.918999 0.9193688 -0.9994057 0.9349933 0.9352277 -0.9995308 0.9479878 0.9481359 -0.9996295 0.9584868 0.9585802 -0.9997074 0.9669318 0.9669906 -0.9997688 0.9737006 0.9737375 -0.9998174 0.9791103 0.9791334 -0.9998557 0.9834239 0.9834385 -0.999886 0.9868574 0.9868665 -0.9999099 0.9895863 0.989592 -0.9999288 0.9917528 0.9917564 -0.9999437 0.9934712 0.9934734 -0.0000238 0.4344249 0.6964791 -0.0000382 0.4339214 0.6959756 -0.0000611 0.4332891 0.6953434 -0.0000978 0.432497 0.6945513 -0.0001565 0.4315072 0.6935614 -0.0002504 0.4302746 0.6923288 -0.0004008 0.4287467 0.6908009 -0.0006416 0.4268641 0.6889184 -0.0010268 0.4245633 0.6866175 -0.0016435 0.4217816 0.6838358 -0.0026305 0.4184692 0.6805235 -0.0042103 0.4146097 0.676664 -0.0067388 0.4102568 0.6723111 -0.0107859 0.405598 0.6676523 -0.0172633 0.4010615 0.6631157 -0.0276309 0.3974949 0.6595491 -0.0441188 0.3963542 0.6584084 -0.0664212 0.3963542 0.6584084 -0.0946366 0.3963542 0.6584084 -0.1303328 0.3963542 0.6584084 -0.1754932 0.3963542 0.6584084 -0.2326269 0.3963542 0.6584084 -0.3049085 0.3963542 0.6584084 -0.3963542 0.3963542 0.6584084 -0.5120448 0.3963542 0.6584084 -0.6584084 0.3963542 0.6584084 -0.8219901 0.3876179 0.6421419 -0.8967447 0.3447543 0.557013 -0.9325696 0.3102037 0.4769901 -0.9531389 0.2946088 0.4221733 -0.9661878 0.2982089 0.3940109 -0.9749962 0.3188171 0.389659 -0.9811943 0.3535032 0.4051232 -0.9856839 0.3990515 0.4361208 -0.9890048 0.4521565 0.4783922 -0.9914995 0.5095925 0.5278957 -0.9933953 0.5683949 0.580987 -0.9948487 0.6260304 0.6345795 -0.9959706 0.6805199 0.6862532 -0.9968409 0.7304884 0.7342907 -0.9975189 0.7751395 0.7776364 -0.9980488 0.8141733 0.8157988 -0.9984638 0.8476717 0.8487222 -0.9987895 0.8759795 0.8766541 -0.9990455 0.8995968 0.9000277 -0.999247 0.9190947 0.9193688 -0.9994057 0.935054 0.9352277 -0.9995308 0.9480261 0.9481359 -0.9996295 0.9585109 0.9585802 -0.9997074 0.966947 0.9669906 -0.9997688 0.9737101 0.9737375 -0.9998174 0.9791163 0.9791334 -0.9998557 0.9834277 0.9834385 -0.999886 0.9868597 0.9868665 -0.9999099 0.9895878 0.989592 -0.9999288 0.9917537 0.9917564 -0.9999437 0.9934718 0.9934734 -0.0000238 0.5501155 0.6964791 -0.0000382 0.549612 0.6959756 -0.0000611 0.5489798 0.6953434 -0.0000978 0.5481876 0.6945513 -0.0001565 0.5471978 0.6935614 -0.0002504 0.5459652 0.6923288 -0.0004008 0.5444373 0.6908009 -0.0006416 0.5425548 0.6889184 -0.0010268 0.5402539 0.6866175 -0.0016435 0.5374722 0.6838358 -0.0026305 0.5341598 0.6805235 -0.0042103 0.5303003 0.676664 -0.0067388 0.5259474 0.6723111 -0.0107859 0.5212886 0.6676523 -0.0172633 0.5167521 0.6631157 -0.0276309 0.5131855 0.6595491 -0.0441188 0.5120448 0.6584084 -0.0664212 0.5120448 0.6584084 -0.0946366 0.5120448 0.6584084 -0.1303328 0.5120448 0.6584084 -0.1754932 0.5120448 0.6584084 -0.2326269 0.5120448 0.6584084 -0.3049085 0.5120448 0.6584084 -0.3963542 0.5120448 0.6584084 -0.5120448 0.5120448 0.6584084 -0.6584084 0.5120448 0.6584084 -0.8219901 0.4999841 0.6421419 -0.8967447 0.4384614 0.557013 -0.9325696 0.3838358 0.4769901 -0.9531389 0.3509254 0.4221733 -0.9661878 0.3405032 0.3940109 -0.9749962 0.3500921 0.389659 -0.9811943 0.3762922 0.4051232 -0.9856839 0.4154167 0.4361208 -0.9890048 0.4637389 0.4783922 -0.9914995 0.5176729 0.5278957 -0.9933953 0.573954 0.580987 -0.9948487 0.6298046 0.6345795 -0.9959706 0.683051 0.6862532 -0.9968409 0.732167 0.7342907 -0.9975189 0.7762418 0.7776364 -0.9980488 0.8148909 0.8157988 -0.9984638 0.8481355 0.8487222 -0.9987895 0.8762773 0.8766541 -0.9990455 0.899787 0.9000277 -0.999247 0.9192157 0.9193688 -0.9994057 0.9351307 0.9352277 -0.9995308 0.9480746 0.9481359 -0.9996295 0.9585415 0.9585802 -0.9997074 0.9669663 0.9669906 -0.9997688 0.9737222 0.9737375 -0.9998174 0.9791238 0.9791334 -0.9998557 0.9834324 0.9834385 -0.999886 0.9868627 0.9868665 -0.9999099 0.9895897 0.989592 -0.9999288 0.9917549 0.9917564 -0.9999437 0.9934725 0.9934734 -0.0000238 0.6964791 0.6964791 -0.0000382 0.6959756 0.6959756 -0.0000611 0.6953434 0.6953434 -0.0000978 0.6945513 0.6945513 -0.0001565 0.6935614 0.6935614 -0.0002504 0.6923288 0.6923288 -0.0004008 0.6908009 0.6908009 -0.0006416 0.6889184 0.6889184 -0.0010268 0.6866175 0.6866175 -0.0016435 0.6838358 0.6838358 -0.0026305 0.6805235 0.6805235 -0.0042103 0.676664 0.676664 -0.0067388 0.6723111 0.6723111 -0.0107859 0.6676523 0.6676523 -0.0172633 0.6631157 0.6631157 -0.0276309 0.6595491 0.6595491 -0.0441188 0.6584084 0.6584084 -0.0664212 0.6584084 0.6584084 -0.0946366 0.6584084 0.6584084 -0.1303328 0.6584084 0.6584084 -0.1754932 0.6584084 0.6584084 -0.2326269 0.6584084 0.6584084 -0.3049085 0.6584084 0.6584084 -0.3963542 0.6584084 0.6584084 -0.5120448 0.6584084 0.6584084 -0.6584084 0.6584084 0.6584084 -0.8219901 0.6421419 0.6421419 -0.8967447 0.557013 0.557013 -0.9325696 0.4769901 0.4769901 -0.9531389 0.4221733 0.4221733 -0.9661878 0.3940109 0.3940109 -0.9749962 0.389659 0.389659 -0.9811943 0.4051232 0.4051232 -0.9856839 0.4361208 0.4361208 -0.9890048 0.4783922 0.4783922 -0.9914995 0.5278957 0.5278957 -0.9933953 0.580987 0.580987 -0.9948487 0.6345795 0.6345795 -0.9959706 0.6862532 0.6862532 -0.9968409 0.7342907 0.7342907 -0.9975189 0.7776364 0.7776364 -0.9980488 0.8157988 0.8157988 -0.9984638 0.8487222 0.8487222 -0.9987895 0.8766541 0.8766541 -0.9990455 0.9000277 0.9000277 -0.999247 0.9193688 0.9193688 -0.9994057 0.9352277 0.9352277 -0.9995308 0.9481359 0.9481359 -0.9996295 0.9585802 0.9585802 -0.9997074 0.9669906 0.9669906 -0.9997688 0.9737375 0.9737375 -0.9998174 0.9791334 0.9791334 -0.9998557 0.9834385 0.9834385 -0.999886 0.9868665 0.9868665 -0.9999099 0.989592 0.989592 -0.9999288 0.9917564 0.9917564 -0.9999437 0.9934734 0.9934734 -0.0051514 0.8407292 0.6652314 -0.0051286 0.8405071 0.664948 -0.0051047 0.8402274 0.6645915 -0.0050826 0.8398756 0.6641436 -0.0050676 0.8394338 0.663582 -0.0050694 0.8388802 0.6628797 -0.0051048 0.8381886 0.6620045 -0.0052028 0.8373283 0.6609191 -0.0054121 0.8362644 0.6595817 -0.0058134 0.8349593 0.6579487 -0.0065402 0.8333779 0.6559807 -0.0078103 0.8314967 0.6536548 -0.0099781 0.8293233 0.6509878 -0.0136166 0.8269342 0.6480804 -0.0196467 0.8245426 0.6451948 -0.0295373 0.8226154 0.6428873 -0.0455041 0.8219901 0.6421419 -0.0671656 0.8219901 0.6421419 -0.0945703 0.8219901 0.6421419 -0.1292408 0.8219901 0.6421419 -0.1731034 0.8219901 0.6421419 -0.2285954 0.8219901 0.6421419 -0.2988 0.8219901 0.6421419 -0.3876179 0.8219901 0.6421419 -0.4999841 0.8219901 0.6421419 -0.6421419 0.8219901 0.6421419 -0.8219901 0.8219901 0.6421419 -0.8967447 0.7069963 0.557013 -0.9325696 0.5948423 0.4769901 -0.9531389 0.5123112 0.4221733 -0.9661878 0.4617052 0.3940109 -0.9749962 0.4397163 0.389659 -0.9811943 0.4415982 0.4051232 -0.9856839 0.4623142 0.4361208 -0.9890048 0.4969305 0.4783922 -0.9914995 0.5408288 0.5278957 -0.9933953 0.5898847 0.580987 -0.9948487 0.6406203 0.6345795 -0.9959706 0.6903044 0.6862532 -0.9968409 0.7369774 0.7342907 -0.9975189 0.7794007 0.7776364 -0.9980488 0.8169474 0.8157988 -0.9984638 0.8494644 0.8487222 -0.9987895 0.8771307 0.8766541 -0.9990455 0.9003323 0.9000277 -0.999247 0.9195625 0.9193688 -0.9994057 0.9353505 0.9352277 -0.9995308 0.9482135 0.9481359 -0.9996295 0.9586291 0.9585802 -0.9997074 0.9670214 0.9669906 -0.9997688 0.9737569 0.9737375 -0.9998174 0.9791456 0.9791334 -0.9998557 0.9834461 0.9834385 -0.999886 0.9868713 0.9868665 -0.9999099 0.989595 0.989592 -0.9999288 0.9917582 0.9917564 -0.9999437 0.9934746 0.9934734 -0.0279321 0.9033413 0.5742985 -0.0278872 0.9032596 0.5740779 -0.0278347 0.9031567 0.5738005 -0.0277752 0.9030276 0.5734525 -0.0277111 0.9028657 0.573017 -0.0276479 0.9026634 0.5724735 -0.0275966 0.9024114 0.571798 -0.0275778 0.9020992 0.5709632 -0.0276281 0.9017148 0.5699388 -0.0278105 0.9012461 0.5686945 -0.0282324 0.900682 0.5672044 -0.0290732 0.9000167 0.5654564 -0.0306306 0.8992555 0.5634696 -0.0333932 0.8984278 0.561325 -0.0381561 0.8976087 0.5592184 -0.0461985 0.8969554 0.5575493 -0.0594506 0.8967447 0.557013 -0.0775151 0.8967447 0.557013 -0.1003691 0.8967447 0.557013 -0.1292823 0.8967447 0.557013 -0.1658613 0.8967447 0.557013 -0.2121385 0.8967447 0.557013 -0.2706852 0.8967447 0.557013 -0.3447543 0.8967447 0.557013 -0.4384614 0.8967447 0.557013 -0.557013 0.8967447 0.557013 -0.7069963 0.8967447 0.557013 -0.8967447 0.8967447 0.557013 -0.9325696 0.7439407 0.4769901 -0.9531389 0.6263473 0.4221733 -0.9661878 0.5473473 0.3940109 -0.9749962 0.5030453 0.389659 -0.9811943 0.4877437 0.4051232 -0.9856839 0.4954523 0.4361208 -0.9890048 0.5203839 0.4783922 -0.9914995 0.5571908 0.5278957 -0.9933953 0.6011414 0.580987 -0.9948487 0.6482627 0.6345795 -0.9959706 0.6954296 0.6862532 -0.9968409 0.7403765 0.7342907 -0.9975189 0.7816327 0.7776364 -0.9980488 0.8184005 0.8157988 -0.9984638 0.8504035 0.8487222 -0.9987895 0.8777338 0.8766541 -0.9990455 0.9007175 0.9000277 -0.999247 0.9198076 0.9193688 -0.9994057 0.9355059 0.9352277 -0.9995308 0.9483117 0.9481359 -0.9996295 0.958691 0.9585802 -0.9997074 0.9670604 0.9669906 -0.9997688 0.9737814 0.9737375 -0.9998174 0.979161 0.9791334 -0.9998557 0.9834557 0.9834385 -0.999886 0.9868773 0.9868665 -0.9999099 0.9895988 0.989592 -0.9999288 0.9917606 0.9917564 -0.9999437 0.9934761 0.9934734 -0.0624569 0.9354466 0.4929712 -0.0624063 0.9354101 0.4927653 -0.0623458 0.9353643 0.4925065 -0.0622749 0.9353068 0.4921819 -0.0621943 0.9352348 0.4917758 -0.0621069 0.9351449 0.4912694 -0.0620199 0.9350332 0.4906404 -0.0619473 0.9348949 0.4898637 -0.061916 0.9347252 0.4889116 -0.0619734 0.9345187 0.4877565 -0.062202 0.9342712 0.4863753 -0.062742 0.9339805 0.484758 -0.0638283 0.9336494 0.4829236 -0.0658501 0.9332914 0.480948 -0.0694453 0.9329391 0.479012 -0.0756464 0.9326595 0.4774812 -0.0860209 0.9325696 0.4769901 -0.1002154 0.9325696 0.4769901 -0.1181733 0.9325696 0.4769901 -0.1408925 0.9325696 0.4769901 -0.1696351 0.9325696 0.4769901 -0.2059983 0.9325696 0.4769901 -0.2520025 0.9325696 0.4769901 -0.3102037 0.9325696 0.4769901 -0.3838358 0.9325696 0.4769901 -0.4769901 0.9325696 0.4769901 -0.5948423 0.9325696 0.4769901 -0.7439407 0.9325696 0.4769901 -0.9325696 0.9325696 0.4769901 -0.9531389 0.7706179 0.4221733 -0.9661878 0.6556956 0.3940109 -0.9749962 0.5831647 0.389659 -0.9811943 0.5461239 0.4051232 -0.9856839 0.5373763 0.4361208 -0.9890048 0.5500554 0.4783922 -0.9914995 0.577891 0.5278957 -0.9933953 0.6153825 0.580987 -0.9948487 0.6579314 0.6345795 -0.9959706 0.7019138 0.6862532 -0.9968409 0.7446768 0.7342907 -0.9975189 0.7844566 0.7776364 -0.9980488 0.8202389 0.8157988 -0.9984638 0.8515915 0.8487222 -0.9987895 0.8784967 0.8766541 -0.9990455 0.9012049 0.9000277 -0.999247 0.9201176 0.9193688 -0.9994057 0.9357024 0.9352277 -0.9995308 0.9484359 0.9481359 -0.9996295 0.9587693 0.9585802 -0.9997074 0.9671097 0.9669906 -0.9997688 0.9738123 0.9737375 -0.9998174 0.9791804 0.9791334 -0.9998557 0.9834679 0.9834385 -0.999886 0.986885 0.9868665 -0.9999099 0.9896036 0.989592 -0.9999288 0.9917636 0.9917564 -0.9999437 0.9934779 0.9934734 -0.1059991 0.9545467 0.4366682 -0.1059489 0.9545286 0.4364805 -0.1058883 0.9545059 0.4362446 -0.1058162 0.9544774 0.4359488 -0.1057322 0.9544418 0.4355789 -0.1056375 0.9543974 0.4351176 -0.1055364 0.9543421 0.434545 -0.1054384 0.9542739 0.4338381 -0.1053624 0.9541902 0.4329722 -0.1053433 0.9540886 0.4319223 -0.1054431 0.9539671 0.4306679 -0.1057683 0.9538247 0.4292005 -0.1064997 0.953663 0.4275379 -0.1079385 0.9534887 0.4257495 -0.1105818 0.9533177 0.4239991 -0.1152388 0.9531823 0.4226166 -0.1231452 0.9531389 0.4221733 -0.1340017 0.9531389 0.4221733 -0.1477366 0.9531389 0.4221733 -0.1651131 0.9531389 0.4221733 -0.1870965 0.9531389 0.4221733 -0.2149085 0.9531389 0.4221733 -0.2500942 0.9531389 0.4221733 -0.2946088 0.9531389 0.4221733 -0.3509254 0.9531389 0.4221733 -0.4221733 0.9531389 0.4221733 -0.5123112 0.9531389 0.4221733 -0.6263473 0.9531389 0.4221733 -0.7706179 0.9531389 0.4221733 -0.9531389 0.9531389 0.4221733 -0.9661878 0.7927704 0.3940109 -0.9749962 0.6845262 0.389659 -0.9811943 0.6199824 0.4051232 -0.9856839 0.5904156 0.4361208 -0.9890048 0.5875938 0.4783922 -0.9914995 0.6040793 0.5278957 -0.9933953 0.6333995 0.580987 -0.9948487 0.6701635 0.6345795 -0.9959706 0.710117 0.6862532 -0.9968409 0.7501172 0.7342907 -0.9975189 0.7880291 0.7776364 -0.9980488 0.8225647 0.8157988 -0.9984638 0.8530945 0.8487222 -0.9987895 0.8794619 0.8766541 -0.9990455 0.9018215 0.9000277 -0.999247 0.9205098 0.9193688 -0.9994057 0.935951 0.9352277 -0.9995308 0.9485931 0.9481359 -0.9996295 0.9588684 0.9585802 -0.9997074 0.967172 0.9669906 -0.9997688 0.9738515 0.9737375 -0.9998174 0.979205 0.9791334 -0.9998557 0.9834833 0.9834385 -0.999886 0.9868946 0.9868665 -0.9999099 0.9896096 0.989592 -0.9999288 0.9917674 0.9917564 -0.9999437 0.9934803 0.9934734 -0.1572498 0.9669269 0.4065913 -0.1572031 0.9669173 0.4064278 -0.1571463 0.9669053 0.4062223 -0.1570779 0.9668902 0.4059646 -0.1569971 0.9668714 0.4056424 -0.156904 0.9668479 0.4052408 -0.1568008 0.9668187 0.4047424 -0.1566936 0.9667827 0.4041273 -0.1565954 0.9667385 0.4033741 -0.1565315 0.966685 0.4024614 -0.1565473 0.9666211 0.4013716 -0.1567226 0.9665463 0.4000976 -0.1571937 0.9664615 0.3986555 -0.15819 0.9663702 0.3971056 -0.160092 0.9662809 0.3955901 -0.1635226 0.9662104 0.3943942 -0.1694384 0.9661878 0.3940109 -0.1775917 0.9661878 0.3940109 -0.1879067 0.9661878 0.3940109 -0.2009566 0.9661878 0.3940109 -0.2174663 0.9661878 0.3940109 -0.2383533 0.9661878 0.3940109 -0.2647781 0.9661878 0.3940109 -0.2982089 0.9661878 0.3940109 -0.3405032 0.9661878 0.3940109 -0.3940109 0.9661878 0.3940109 -0.4617052 0.9661878 0.3940109 -0.5473473 0.9661878 0.3940109 -0.6556956 0.9661878 0.3940109 -0.7927704 0.9661878 0.3940109 -0.9661878 0.9661878 0.3940109 -0.9749962 0.8127617 0.389659 -0.9811943 0.713423 0.4051232 -0.9856839 0.6575172 0.4361208 -0.9890048 0.6350848 0.4783922 -0.9914995 0.637211 0.5278957 -0.9933953 0.6561933 0.580987 -0.9948487 0.6856388 0.6345795 -0.9959706 0.7204952 0.6862532 -0.9968409 0.757 0.7342907 -0.9975189 0.7925488 0.7776364 -0.9980488 0.8255071 0.8157988 -0.9984638 0.8549959 0.8487222 -0.9987895 0.880683 0.8766541 -0.9990455 0.9026016 0.9000277 -0.999247 0.9210061 0.9193688 -0.9994057 0.9362655 0.9352277 -0.9995308 0.9487918 0.9481359 -0.9996295 0.9589938 0.9585802 -0.9997074 0.9672509 0.9669906 -0.9997688 0.9739011 0.9737375 -0.9998174 0.9792361 0.9791334 -0.9998557 0.9835029 0.9834385 -0.999886 0.9869069 0.9868665 -0.9999099 0.9896173 0.989592 -0.9999288 0.9917722 0.9917564 -0.9999437 0.9934833 0.9934734 -0.2151269 0.9754027 0.4001561 -0.2150852 0.9753975 0.4000191 -0.2150342 0.9753908 0.3998472 -0.2149725 0.9753825 0.3996316 -0.2148987 0.9753721 0.399362 -0.2148124 0.9753591 0.399026 -0.2147144 0.975343 0.3986091 -0.2146085 0.9753231 0.3980948 -0.2145034 0.9752987 0.3974652 -0.2144168 0.9752692 0.3967026 -0.2143816 0.975234 0.3957926 -0.2144566 0.9751928 0.3947294 -0.2147432 0.9751462 0.3935266 -0.2154135 0.9750962 0.392235 -0.2167545 0.9750472 0.390973 -0.2192389 0.9750086 0.3899778 -0.2235962 0.9749962 0.389659 -0.2296253 0.9749962 0.389659 -0.2372529 0.9749962 0.389659 -0.2469027 0.9749962 0.389659 -0.2591111 0.9749962 0.389659 -0.2745562 0.9749962 0.389659 -0.2940963 0.9749962 0.389659 -0.3188171 0.9749962 0.389659 -0.3500921 0.9749962 0.389659 -0.389659 0.9749962 0.389659 -0.4397163 0.9749962 0.389659 -0.5030453 0.9749962 0.389659 -0.5831647 0.9749962 0.389659 -0.6845262 0.9749962 0.389659 -0.8127617 0.9749962 0.389659 -0.9749962 0.9749962 0.389659 -0.9811943 0.8316375 0.4051232 -0.9856839 0.7424095 0.4361208 -0.9890048 0.695167 0.4783922 -0.9914995 0.6791269 0.5278957 -0.9933953 0.6850303 0.580987 -0.9948487 0.7052169 0.6345795 -0.9959706 0.733625 0.6862532 -0.9968409 0.7657077 0.7342907 -0.9975189 0.7982669 0.7776364 -0.9980488 0.8292297 0.8157988 -0.9984638 0.8574015 0.8487222 -0.9987895 0.8822279 0.8766541 -0.9990455 0.9035886 0.9000277 -0.999247 0.9216339 0.9193688 -0.9994057 0.9366635 0.9352277 -0.9995308 0.9490434 0.9481359 -0.9996295 0.9591524 0.9585802 -0.9997074 0.9673508 0.9669906 -0.9997688 0.9739638 0.9737375 -0.9998174 0.9792755 0.9791334 -0.9998557 0.9835276 0.9834385 -0.999886 0.9869223 0.9868665 -0.9999099 0.989627 0.989592 -0.9999288 0.9917782 0.9917564 -0.9999437 0.9934871 0.9934734 -0.2783684 0.9814251 0.413595 -0.2783325 0.9814221 0.4134842 -0.2782884 0.9814183 0.4133451 -0.2782347 0.9814136 0.4131707 -0.2781701 0.9814076 0.4129526 -0.2780936 0.9814002 0.4126808 -0.2780055 0.9813911 0.4123437 -0.2779077 0.9813797 0.4119279 -0.2778058 0.9813659 0.4114191 -0.2777122 0.9813491 0.410803 -0.2776503 0.9813291 0.410068 -0.2776626 0.9813057 0.4092098 -0.2778236 0.9812792 0.4082395 -0.2782606 0.9812508 0.4071981 -0.2791873 0.9812231 0.4061813 -0.2809573 0.9812013 0.4053799 -0.2841192 0.9811943 0.4051232 -0.2885124 0.9811943 0.4051232 -0.2940703 0.9811943 0.4051232 -0.3011018 0.9811943 0.4051232 -0.3099976 0.9811943 0.4051232 -0.3212519 0.9811943 0.4051232 -0.3354901 0.9811943 0.4051232 -0.3535032 0.9811943 0.4051232 -0.3762922 0.9811943 0.4051232 -0.4051232 0.9811943 0.4051232 -0.4415982 0.9811943 0.4051232 -0.4877437 0.9811943 0.4051232 -0.5461239 0.9811943 0.4051232 -0.6199824 0.9811943 0.4051232 -0.713423 0.9811943 0.4051232 -0.8316375 0.9811943 0.4051232 -0.9811943 0.9811943 0.4051232 -0.9856839 0.8498092 0.4361208 -0.9890048 0.7711789 0.4783922 -0.9914995 0.7321559 0.5278957 -0.9933953 0.721513 0.580987 -0.9948487 0.7299859 0.6345795 -0.9959706 0.7502359 0.6862532 -0.9968409 0.776724 0.7342907 -0.9975189 0.8055009 0.7776364 -0.9980488 0.8339392 0.8157988 -0.9984638 0.8604449 0.8487222 -0.9987895 0.8841823 0.8766541 -0.9990455 0.9048372 0.9000277 -0.999247 0.9224281 0.9193688 -0.9994057 0.9371669 0.9352277 -0.9995308 0.9493615 0.9481359 -0.9996295 0.959353 0.9585802 -0.9997074 0.967477 0.9669906 -0.9997688 0.9740432 0.9737375 -0.9998174 0.9793253 0.9791334 -0.9998557 0.9835588 0.9834385 -0.999886 0.9869419 0.9868665 -0.9999099 0.9896392 0.989592 -0.9999288 0.9917859 0.9917564 -0.9999437 0.9934919 0.9934734 -0.3454107 0.9858181 0.4427624 -0.3453807 0.9858163 0.4426754 -0.3453439 0.9858141 0.4425661 -0.3452987 0.9858113 0.4424291 -0.3452442 0.9858079 0.4422578 -0.3451791 0.9858036 0.4420444 -0.3451032 0.9857982 0.4417797 -0.3450175 0.9857916 0.4414533 -0.3449254 0.9857835 0.4410539 -0.3448353 0.9857738 0.4405705 -0.3447636 0.9857621 0.439994 -0.3447407 0.9857485 0.4393211 -0.3448204 0.9857332 0.4385606 -0.3450957 0.9857167 0.4377449 -0.3457234 0.9857006 0.4369488 -0.3469645 0.9856879 0.4363216 -0.3492254 0.9856839 0.4361208 -0.3523802 0.9856839 0.4361208 -0.3563715 0.9856839 0.4361208 -0.3614209 0.9856839 0.4361208 -0.3678092 0.9856839 0.4361208 -0.3758911 0.9856839 0.4361208 -0.3861159 0.9856839 0.4361208 -0.3990515 0.9856839 0.4361208 -0.4154167 0.9856839 0.4361208 -0.4361208 0.9856839 0.4361208 -0.4623142 0.9856839 0.4361208 -0.4954523 0.9856839 0.4361208 -0.5373763 0.9856839 0.4361208 -0.5904156 0.9856839 0.4361208 -0.6575172 0.9856839 0.4361208 -0.7424095 0.9856839 0.4361208 -0.8498092 0.9856839 0.4361208 -0.9856839 0.9856839 0.4361208 -0.9890048 0.8673437 0.4783922 -0.9914995 0.7992446 0.5278957 -0.9933953 0.7676683 0.580987 -0.9948487 0.7613218 0.6345795 -0.9959706 0.7712508 0.6862532 -0.9968409 0.7906611 0.7342907 -0.9975189 0.8146529 0.7776364 -0.9980488 0.8398974 0.8157988 -0.9984638 0.8642952 0.8487222 -0.9987895 0.886655 0.8766541 -0.9990455 0.9064168 0.9000277 -0.999247 0.9234329 0.9193688 -0.9994057 0.9378038 0.9352277 -0.9995308 0.9497641 0.9481359 -0.9996295 0.9596068 0.9585802 -0.9997074 0.9676368 0.9669906 -0.9997688 0.9741436 0.9737375 -0.9998174 0.9793883 0.9791334 -0.9998557 0.9835983 0.9834385 -0.999886 0.9869667 0.9868665 -0.9999099 0.9896547 0.989592 -0.9999288 0.9917956 0.9917564 -0.9999437 0.993498 0.9934734 -0.4144197 0.9890841 0.483464 -0.4143955 0.9890831 0.4833974 -0.4143657 0.9890818 0.4833138 -0.414329 0.9890801 0.483209 -0.4142845 0.9890781 0.483078 -0.4142311 0.9890755 0.4829148 -0.4141683 0.9890723 0.4827124 -0.4140964 0.9890684 0.4824629 -0.4140176 0.9890637 0.4821576 -0.4139373 0.9890579 0.4817882 -0.4138668 0.989051 0.4813478 -0.4138277 0.989043 0.4808339 -0.4138582 0.9890339 0.4802533 -0.4140252 0.9890241 0.4796308 -0.4144423 0.9890146 0.4790235 -0.4152991 0.9890072 0.4785453 -0.4168922 0.9890048 0.4783922 -0.419125 0.9890048 0.4783922 -0.4219498 0.9890048 0.4783922 -0.4255236 0.9890048 0.4783922 -0.4300448 0.9890048 0.4783922 -0.4357648 0.9890048 0.4783922 -0.4430013 0.9890048 0.4783922 -0.4521565 0.9890048 0.4783922 -0.4637389 0.9890048 0.4783922 -0.4783922 0.9890048 0.4783922 -0.4969305 0.9890048 0.4783922 -0.5203839 0.9890048 0.4783922 -0.5500554 0.9890048 0.4783922 -0.5875938 0.9890048 0.4783922 -0.6350848 0.9890048 0.4783922 -0.695167 0.9890048 0.4783922 -0.7711789 0.9890048 0.4783922 -0.8673437 0.9890048 0.4783922 -0.9890048 0.9890048 0.4783922 -0.9914995 0.8841204 0.5278957 -0.9933953 0.8260608 0.580987 -0.9948487 0.8009659 0.6345795 -0.9959706 0.7978374 0.6862532 -0.9968409 0.8082934 0.7342907 -0.9975189 0.8262314 0.7776364 -0.9980488 0.8474353 0.8157988 -0.9984638 0.8691663 0.8487222 -0.9987895 0.8897832 0.8766541 -0.9990455 0.9084153 0.9000277 -0.999247 0.9247041 0.9193688 -0.9994057 0.9386096 0.9352277 -0.9995308 0.9502734 0.9481359 -0.9996295 0.959928 0.9585802 -0.9997074 0.9678389 0.9669906 -0.9997688 0.9742706 0.9737375 -0.9998174 0.9794681 0.9791334 -0.9998557 0.9836483 0.9834385 -0.999886 0.986998 0.9868665 -0.9999099 0.9896744 0.989592 -0.9999288 0.9918079 0.9917564 -0.9999437 0.9935057 0.9934734 -0.4834235 0.9915469 0.5316756 -0.4834045 0.9915463 0.531626 -0.4833811 0.9915455 0.5315636 -0.4833522 0.9915446 0.5314854 -0.4833171 0.9915433 0.5313876 -0.4832747 0.9915418 0.5312658 -0.4832246 0.9915399 0.5311148 -0.4831666 0.9915376 0.5309287 -0.4831021 0.9915347 0.530701 -0.4830346 0.9915312 0.5304255 -0.4829718 0.9915271 0.5300971 -0.4829286 0.9915223 0.5297141 -0.4829319 0.9915169 0.5292815 -0.4830292 0.991511 0.5288178 -0.4833013 0.9915054 0.5283656 -0.4838841 0.9915009 0.5280096 -0.4849907 0.9914995 0.5278957 -0.4865484 0.9914995 0.5278957 -0.4885191 0.9914995 0.5278957 -0.4910123 0.9914995 0.5278957 -0.4941665 0.9914995 0.5278957 -0.498157 0.9914995 0.5278957 -0.5032055 0.9914995 0.5278957 -0.5095925 0.9914995 0.5278957 -0.5176729 0.9914995 0.5278957 -0.5278957 0.9914995 0.5278957 -0.5408288 0.9914995 0.5278957 -0.5571908 0.9914995 0.5278957 -0.577891 0.9914995 0.5278957 -0.6040793 0.9914995 0.5278957 -0.637211 0.9914995 0.5278957 -0.6791269 0.9914995 0.5278957 -0.7321559 0.9914995 0.5278957 -0.7992446 0.9914995 0.5278957 -0.8841204 0.9914995 0.5278957 -0.9914995 0.9914995 0.5278957 -0.9933953 0.8999349 0.580987 -0.9948487 0.8511207 0.6345795 -0.9959706 0.8314729 0.6862532 -0.9968409 0.8306004 0.7342907 -0.9975189 0.8408797 0.7776364 -0.9980488 0.8569716 0.8157988 -0.9984638 0.875329 0.8487222 -0.9987895 0.8937407 0.8766541 -0.9990455 0.9109436 0.9000277 -0.999247 0.9263124 0.9193688 -0.9994057 0.939629 0.9352277 -0.9995308 0.9509177 0.9481359 -0.9996295 0.9603343 0.9585802 -0.9997074 0.9680946 0.9669906 -0.9997688 0.9744313 0.9737375 -0.9998174 0.9795689 0.9791334 -0.9998557 0.9837116 0.9834385 -0.999886 0.9870376 0.9868665 -0.9999099 0.9896992 0.989592 -0.9999288 0.9918234 0.9917564 -0.9999437 0.9935154 0.9934734 -0.5504963 0.993424 0.5837409 -0.5504818 0.9934236 0.5837046 -0.550464 0.9934231 0.5836591 -0.5504419 0.9934225 0.5836021 -0.550415 0.9934218 0.5835308 -0.5503825 0.9934209 0.583442 -0.5503438 0.9934197 0.5833319 -0.5502987 0.9934183 0.5831962 -0.550248 0.9934166 0.5830302 -0.5501939 0.9934145 0.5828294 -0.5501416 0.993412 0.5825901 -0.5501012 0.9934091 0.582311 -0.5500915 0.9934058 0.5819959 -0.5501456 0.9934023 0.5816582 -0.5503203 0.9933988 0.581329 -0.5507113 0.9933961 0.5810699 -0.5514695 0.9933953 0.580987 -0.5525411 0.9933953 0.580987 -0.5538969 0.9933953 0.580987 -0.5556122 0.9933953 0.580987 -0.5577822 0.9933953 0.580987 -0.5605276 0.9933953 0.580987 -0.5640008 0.9933953 0.580987 -0.5683949 0.9933953 0.580987 -0.573954 0.9933953 0.580987 -0.580987 0.9933953 0.580987 -0.5898847 0.9933953 0.580987 -0.6011414 0.9933953 0.580987 -0.6153825 0.9933953 0.580987 -0.6333995 0.9933953 0.580987 -0.6561933 0.9933953 0.580987 -0.6850303 0.9933953 0.580987 -0.721513 0.9933953 0.580987 -0.7676683 0.9933953 0.580987 -0.8260608 0.9933953 0.580987 -0.8999349 0.9933953 0.580987 -0.9933953 0.9933953 0.580987 -0.9948487 0.9145732 0.6345795 -0.9959706 0.8740262 0.6862532 -0.9968409 0.8588218 0.7342907 -0.9975189 0.8594117 0.7776364 -0.9980488 0.8690364 0.8157988 -0.9984638 0.8831255 0.8487222 -0.9987895 0.8987476 0.8766541 -0.9990455 0.9141422 0.9000277 -0.999247 0.928347 0.9193688 -0.9994057 0.9409186 0.9352277 -0.9995308 0.9517328 0.9481359 -0.9996295 0.9608482 0.9585802 -0.9997074 0.9684181 0.9669906 -0.9997688 0.9746346 0.9737375 -0.9998174 0.9796966 0.9791334 -0.9998557 0.9837916 0.9834385 -0.999886 0.9870878 0.9868665 -0.9999099 0.9897306 0.989592 -0.9999288 0.9918431 0.9917564 -0.9999437 0.9935277 0.9934734 -0.6139459 0.9948662 0.6365438 -0.6139352 0.994866 0.6365179 -0.6139219 0.9948657 0.6364854 -0.6139056 0.9948653 0.6364447 -0.6138855 0.9948649 0.6363938 -0.6138613 0.9948643 0.6363304 -0.6138323 0.9948636 0.6362518 -0.6137984 0.9948628 0.6361549 -0.6137599 0.9948617 0.6360365 -0.6137183 0.9948604 0.6358932 -0.6136769 0.9948589 0.6357225 -0.6136427 0.9948571 0.6355234 -0.6136284 0.9948551 0.6352987 -0.6136569 0.994853 0.6350579 -0.6137675 0.9948509 0.6348232 -0.6140266 0.9948493 0.6346385 -0.6145393 0.9948487 0.6345795 -0.6152669 0.9948487 0.6345795 -0.6161874 0.9948487 0.6345795 -0.6173519 0.9948487 0.6345795 -0.6188252 0.9948487 0.6345795 -0.6206891 0.9948487 0.6345795 -0.6230471 0.9948487 0.6345795 -0.6260304 0.9948487 0.6345795 -0.6298046 0.9948487 0.6345795 -0.6345795 0.9948487 0.6345795 -0.6406203 0.9948487 0.6345795 -0.6482627 0.9948487 0.6345795 -0.6579314 0.9948487 0.6345795 -0.6701635 0.9948487 0.6345795 -0.6856388 0.9948487 0.6345795 -0.7052169 0.9948487 0.6345795 -0.7299859 0.9948487 0.6345795 -0.7613218 0.9948487 0.6345795 -0.8009659 0.9948487 0.6345795 -0.8511207 0.9948487 0.6345795 -0.9145732 0.9948487 0.6345795 -0.9948487 0.9948487 0.6345795 -0.9959706 0.9278617 0.6862532 -0.9968409 0.8945255 0.7342907 -0.9975189 0.8828571 0.7776364 -0.9980488 0.8842998 0.8157988 -0.9984638 0.892989 0.8487222 -0.9987895 0.9050819 0.8766541 -0.9990455 0.9181889 0.9000277 -0.999247 0.9309211 0.9193688 -0.9994057 0.9425502 0.9352277 -0.9995308 0.952764 0.9481359 -0.9996295 0.9614985 0.9585802 -0.9997074 0.9688274 0.9669906 -0.9997688 0.9748918 0.9737375 -0.9998174 0.979858 0.9791334 -0.9998557 0.9838928 0.9834385 -0.999886 0.9871512 0.9868665 -0.9999099 0.9897703 0.989592 -0.9999288 0.991868 0.9917564 -0.9999437 0.9935432 0.9934734 -0.6724572 0.9959813 0.6876273 -0.6724495 0.9959811 0.6876092 -0.6724399 0.9959809 0.6875865 -0.672428 0.9959807 0.687558 -0.6724135 0.9959804 0.6875223 -0.6723959 0.9959801 0.687478 -0.6723748 0.9959797 0.687423 -0.67235 0.9959791 0.6873552 -0.6723217 0.9959785 0.6872723 -0.6722907 0.9959777 0.687172 -0.6722594 0.9959768 0.6870525 -0.6722322 0.9959757 0.6869133 -0.672218 0.9959745 0.6867561 -0.672232 0.9959732 0.6865877 -0.6723012 0.9959719 0.6864236 -0.6724711 0.9959709 0.6862945 -0.6728136 0.9959706 0.6862532 -0.6733015 0.9959706 0.6862532 -0.6739188 0.9959706 0.6862532 -0.6746998 0.9959706 0.6862532 -0.6756878 0.9959706 0.6862532 -0.6769378 0.9959706 0.6862532 -0.6785192 0.9959706 0.6862532 -0.6805199 0.9959706 0.6862532 -0.683051 0.9959706 0.6862532 -0.6862532 0.9959706 0.6862532 -0.6903044 0.9959706 0.6862532 -0.6954296 0.9959706 0.6862532 -0.7019138 0.9959706 0.6862532 -0.710117 0.9959706 0.6862532 -0.7204952 0.9959706 0.6862532 -0.733625 0.9959706 0.6862532 -0.7502359 0.9959706 0.6862532 -0.7712508 0.9959706 0.6862532 -0.7978374 0.9959706 0.6862532 -0.8314729 0.9959706 0.6862532 -0.8740262 0.9959706 0.6862532 -0.9278617 0.9959706 0.6862532 -0.9959706 0.9959706 0.6862532 -0.9968409 0.9396953 0.7342907 -0.9975189 0.9125186 0.7776364 -0.9980488 0.9036101 0.8157988 -0.9984638 0.9054678 0.8487222 -0.9987895 0.9130957 0.8766541 -0.9990455 0.9233085 0.9000277 -0.999247 0.9341777 0.9193688 -0.9994057 0.9446144 0.9352277 -0.9995308 0.9540687 0.9481359 -0.9996295 0.9623212 0.9585802 -0.9997074 0.9693452 0.9669906 -0.9997688 0.9752172 0.9737375 -0.9998174 0.9800622 0.9791334 -0.9998557 0.9840209 0.9834385 -0.999886 0.9872315 0.9868665 -0.9999099 0.9898206 0.989592 -0.9999288 0.9918994 0.9917564 -0.9999437 0.9935629 0.9934734 -0.7251659 0.9968475 0.7352352 -0.7251605 0.9968474 0.7352227 -0.7251537 0.9968473 0.7352071 -0.7251454 0.9968472 0.7351875 -0.7251351 0.996847 0.735163 -0.7251226 0.9968468 0.7351325 -0.7251076 0.9968465 0.7350946 -0.7250899 0.9968462 0.735048 -0.7250697 0.9968458 0.734991 -0.7250473 0.9968453 0.7349221 -0.7250244 0.9968448 0.73484 -0.7250039 0.9968441 0.7347442 -0.7249916 0.9968433 0.7346362 -0.7249978 0.9968425 0.7345205 -0.7250408 0.9968418 0.7344077 -0.7251511 0.9968411 0.7343191 -0.7253775 0.9968409 0.7342907 -0.7257011 0.9968409 0.7342907 -0.7261105 0.9968409 0.7342907 -0.7266285 0.9968409 0.7342907 -0.7272837 0.9968409 0.7342907 -0.7281127 0.9968409 0.7342907 -0.7291615 0.9968409 0.7342907 -0.7304884 0.9968409 0.7342907 -0.732167 0.9968409 0.7342907 -0.7342907 0.9968409 0.7342907 -0.7369774 0.9968409 0.7342907 -0.7403765 0.9968409 0.7342907 -0.7446768 0.9968409 0.7342907 -0.7501172 0.9968409 0.7342907 -0.757 0.9968409 0.7342907 -0.7657077 0.9968409 0.7342907 -0.776724 0.9968409 0.7342907 -0.7906611 0.9968409 0.7342907 -0.8082934 0.9968409 0.7342907 -0.8306004 0.9968409 0.7342907 -0.8588218 0.9968409 0.7342907 -0.8945255 0.9968409 0.7342907 -0.9396953 0.9968409 0.7342907 -0.9968409 0.9968409 0.7342907 -0.9975189 0.9500442 0.7776364 -0.9980488 0.9280401 0.8157988 -0.9984638 0.921255 0.8487222 -0.9987895 0.9232341 0.8766541 -0.9990455 0.9297854 0.9000277 -0.999247 0.9382977 0.9193688 -0.9994057 0.9472259 0.9352277 -0.9995308 0.9557192 0.9481359 -0.9996295 0.963362 0.9585802 -0.9997074 0.9700002 0.9669906 -0.9997688 0.9756289 0.9737375 -0.9998174 0.9803206 0.9791334 -0.9998557 0.9841829 0.9834385 -0.999886 0.987333 0.9868665 -0.9999099 0.9898842 0.989592 -0.9999288 0.9919392 0.9917564 -0.9999437 0.9935878 0.9934734 -0.7716588 0.997523 0.7782755 -0.7716551 0.997523 0.7782671 -0.7716504 0.9975229 0.7782565 -0.7716446 0.9975228 0.7782432 -0.7716375 0.9975227 0.7782266 -0.7716288 0.9975226 0.778206 -0.7716184 0.9975224 0.7781803 -0.7716061 0.9975222 0.7781488 -0.7715919 0.997522 0.7781102 -0.7715762 0.9975217 0.7780636 -0.7715599 0.9975213 0.778008 -0.7715449 0.9975209 0.7779432 -0.7715352 0.9975204 0.7778701 -0.7715376 0.9975199 0.7777918 -0.7715641 0.9975194 0.7777156 -0.7716352 0.9975191 0.7776556 -0.7717834 0.9975189 0.7776364 -0.7719959 0.9975189 0.7776364 -0.7722648 0.9975189 0.7776364 -0.7726049 0.9975189 0.7776364 -0.7730352 0.9975189 0.7776364 -0.7735795 0.9975189 0.7776364 -0.7742682 0.9975189 0.7776364 -0.7751395 0.9975189 0.7776364 -0.7762418 0.9975189 0.7776364 -0.7776364 0.9975189 0.7776364 -0.7794007 0.9975189 0.7776364 -0.7816327 0.9975189 0.7776364 -0.7844566 0.9975189 0.7776364 -0.7880291 0.9975189 0.7776364 -0.7925488 0.9975189 0.7776364 -0.7982669 0.9975189 0.7776364 -0.8055009 0.9975189 0.7776364 -0.8146529 0.9975189 0.7776364 -0.8262314 0.9975189 0.7776364 -0.8408797 0.9975189 0.7776364 -0.8594117 0.9975189 0.7776364 -0.8828571 0.9975189 0.7776364 -0.9125186 0.9975189 0.7776364 -0.9500442 0.9975189 0.7776364 -0.9975189 0.9975189 0.7776364 -0.9980488 0.9589472 0.8157988 -0.9984638 0.9412278 0.8487222 -0.9987895 0.9360606 0.8766541 -0.9990455 0.9379796 0.9000277 -0.999247 0.94351 0.9193688 -0.9994057 0.9505298 0.9352277 -0.9995308 0.9578074 0.9481359 -0.9996295 0.9646787 0.9585802 -0.9997074 0.970829 0.9669906 -0.9997688 0.9761497 0.9737375 -0.9998174 0.9806476 0.9791334 -0.9998557 0.984388 0.9834385 -0.999886 0.9874615 0.9868665 -0.9999099 0.9899646 0.989592 -0.9999288 0.9919896 0.9917564 -0.9999437 0.9936193 0.9934734 -0.8119154 0.9980513 0.8162254 -0.8119128 0.9980512 0.8162198 -0.8119096 0.9980512 0.8162127 -0.8119057 0.9980511 0.8162038 -0.8119009 0.9980511 0.8161928 -0.8118949 0.998051 0.816179 -0.8118878 0.9980509 0.8161619 -0.8118794 0.9980508 0.8161408 -0.8118697 0.9980506 0.816115 -0.8118589 0.9980504 0.8160839 -0.8118476 0.9980502 0.8160468 -0.811837 0.99805 0.8160036 -0.8118298 0.9980497 0.8159548 -0.8118303 0.9980494 0.8159025 -0.8118466 0.9980491 0.8158516 -0.8118921 0.9980488 0.8158116 -0.8119884 0.9980488 0.8157988 -0.8121268 0.9980488 0.8157988 -0.8123018 0.9980488 0.8157988 -0.8125232 0.9980488 0.8157988 -0.8128033 0.9980488 0.8157988 -0.8131577 0.9980488 0.8157988 -0.8136061 0.9980488 0.8157988 -0.8141733 0.9980488 0.8157988 -0.8148909 0.9980488 0.8157988 -0.8157988 0.9980488 0.8157988 -0.8169474 0.9980488 0.8157988 -0.8184005 0.9980488 0.8157988 -0.8202389 0.9980488 0.8157988 -0.8225647 0.9980488 0.8157988 -0.8255071 0.9980488 0.8157988 -0.8292297 0.9980488 0.8157988 -0.8339392 0.9980488 0.8157988 -0.8398974 0.9980488 0.8157988 -0.8474353 0.9980488 0.8157988 -0.8569716 0.9980488 0.8157988 -0.8690364 0.9980488 0.8157988 -0.8842998 0.9980488 0.8157988 -0.9036101 0.9980488 0.8157988 -0.9280401 0.9980488 0.8157988 -0.9589472 0.9980488 0.8157988 -0.9980488 0.9980488 0.8157988 -0.9984638 0.9664961 0.8487222 -0.9987895 0.9522877 0.8766541 -0.9990455 0.9483463 0.9000277 -0.999247 0.9501042 0.9193688 -0.9994057 0.9547096 0.9352277 -0.9995308 0.9604492 0.9481359 -0.9996295 0.9663445 0.9585802 -0.9997074 0.9718774 0.9669906 -0.9997688 0.9768086 0.9737375 -0.9998174 0.9810611 0.9791334 -0.9998557 0.9846473 0.9834385 -0.999886 0.987624 0.9868665 -0.9999099 0.9900664 0.989592 -0.9999288 0.9920533 0.9917564 -0.9999437 0.9936592 0.9934734 -0.8462171 0.9984653 0.8490036 -0.8462154 0.9984653 0.8489999 -0.8462132 0.9984653 0.8489952 -0.8462106 0.9984653 0.8489893 -0.8462073 0.9984652 0.848982 -0.8462034 0.9984652 0.8489729 -0.8461986 0.9984651 0.8489617 -0.8461929 0.998465 0.8489478 -0.8461864 0.9984649 0.8489308 -0.8461791 0.9984648 0.8489102 -0.8461714 0.9984647 0.8488857 -0.8461641 0.9984645 0.8488572 -0.8461589 0.9984643 0.848825 -0.8461587 0.9984642 0.8487906 -0.8461687 0.998464 0.848757 -0.8461977 0.9984638 0.8487306 -0.8462598 0.9984638 0.8487222 -0.8463492 0.9984638 0.8487222 -0.8464623 0.9984638 0.8487222 -0.8466054 0.9984638 0.8487222 -0.8467864 0.9984638 0.8487222 -0.8470154 0.9984638 0.8487222 -0.8473052 0.9984638 0.8487222 -0.8476717 0.9984638 0.8487222 -0.8481355 0.9984638 0.8487222 -0.8487222 0.9984638 0.8487222 -0.8494644 0.9984638 0.8487222 -0.8504035 0.9984638 0.8487222 -0.8515915 0.9984638 0.8487222 -0.8530945 0.9984638 0.8487222 -0.8549959 0.9984638 0.8487222 -0.8574015 0.9984638 0.8487222 -0.8604449 0.9984638 0.8487222 -0.8642952 0.9984638 0.8487222 -0.8691663 0.9984638 0.8487222 -0.875329 0.9984638 0.8487222 -0.8831255 0.9984638 0.8487222 -0.892989 0.9984638 0.8487222 -0.9054678 0.9984638 0.8487222 -0.921255 0.9984638 0.8487222 -0.9412278 0.9984638 0.8487222 -0.9664961 0.9984638 0.8487222 -0.9984638 0.9984638 0.8487222 -0.9987895 0.9728171 0.8766541 -0.9990455 0.9614615 0.9000277 -0.999247 0.9584468 0.9193688 -0.9994057 0.9599976 0.9352277 -0.9995308 0.9637914 0.9481359 -0.9996295 0.968452 0.9585802 -0.9997074 0.9732039 0.9669906 -0.9997688 0.9776422 0.9737375 -0.9998174 0.9815844 0.9791334 -0.9998557 0.9849754 0.9834385 -0.999886 0.9878296 0.9868665 -0.9999099 0.9901951 0.989592 -0.9999288 0.9921339 0.9917564 -0.9999437 0.9937096 0.9934734 -0.8750477 0.9987905 0.8768378 -0.8750466 0.9987905 0.8768354 -0.8750451 0.9987904 0.8768324 -0.8750434 0.9987904 0.8768285 -0.8750412 0.9987904 0.8768238 -0.8750386 0.9987904 0.8768178 -0.8750355 0.9987903 0.8768104 -0.8750317 0.9987903 0.8768014 -0.8750274 0.9987902 0.8767903 -0.8750225 0.9987902 0.8767768 -0.8750173 0.9987901 0.8767609 -0.8750124 0.99879 0.8767422 -0.8750088 0.9987899 0.8767212 -0.8750084 0.9987897 0.8766987 -0.8750145 0.9987896 0.8766768 -0.8750329 0.9987895 0.8766596 -0.8750727 0.9987895 0.8766541 -0.8751301 0.9987895 0.8766541 -0.8752028 0.9987895 0.8766541 -0.8752947 0.9987895 0.8766541 -0.8754109 0.9987895 0.8766541 -0.875558 0.9987895 0.8766541 -0.8757441 0.9987895 0.8766541 -0.8759795 0.9987895 0.8766541 -0.8762773 0.9987895 0.8766541 -0.8766541 0.9987895 0.8766541 -0.8771307 0.9987895 0.8766541 -0.8777338 0.9987895 0.8766541 -0.8784967 0.9987895 0.8766541 -0.8794619 0.9987895 0.8766541 -0.880683 0.9987895 0.8766541 -0.8822279 0.9987895 0.8766541 -0.8841823 0.9987895 0.8766541 -0.886655 0.9987895 0.8766541 -0.8897832 0.9987895 0.8766541 -0.8937407 0.9987895 0.8766541 -0.8987476 0.9987895 0.8766541 -0.9050819 0.9987895 0.8766541 -0.9130957 0.9987895 0.8766541 -0.9232341 0.9987895 0.8766541 -0.9360606 0.9987895 0.8766541 -0.9522877 0.9987895 0.8766541 -0.9728171 0.9987895 0.8766541 -0.9987895 0.9987895 0.8766541 -0.9990455 0.9780539 0.9000277 -0.999247 0.9690013 0.9193688 -0.9994057 0.9666876 0.9352277 -0.9995308 0.9680197 0.9481359 -0.9996295 0.9711183 0.9585802 -0.9997074 0.974882 0.9669906 -0.9997688 0.9786968 0.9737375 -0.9998174 0.9822464 0.9791334 -0.9998557 0.9853905 0.9834385 -0.999886 0.9880897 0.9868665 -0.9999099 0.990358 0.989592 -0.9999288 0.9922358 0.9917564 -0.9999437 0.9937734 0.9934734 -0.8990028 0.9990461 0.9001468 -0.899002 0.9990461 0.9001452 -0.8990011 0.9990461 0.9001432 -0.899 0.9990461 0.9001407 -0.8989986 0.9990461 0.9001376 -0.8989969 0.9990461 0.9001338 -0.8989948 0.9990461 0.900129 -0.8989923 0.999046 0.9001231 -0.8989895 0.999046 0.9001159 -0.8989863 0.9990459 0.9001073 -0.8989829 0.9990459 0.9000969 -0.8989796 0.9990458 0.9000848 -0.8989771 0.9990458 0.9000712 -0.8989767 0.9990457 0.9000567 -0.8989805 0.9990456 0.9000425 -0.8989921 0.9990456 0.9000313 -0.8990175 0.9990455 0.9000277 -0.8990542 0.9990455 0.9000277 -0.8991006 0.9990455 0.9000277 -0.8991593 0.9990455 0.9000277 -0.8992336 0.9990455 0.9000277 -0.8993275 0.9990455 0.9000277 -0.8994464 0.9990455 0.9000277 -0.8995968 0.9990455 0.9000277 -0.899787 0.9990455 0.9000277 -0.9000277 0.9990455 0.9000277 -0.9003323 0.9990455 0.9000277 -0.9007175 0.9990455 0.9000277 -0.9012049 0.9990455 0.9000277 -0.9018215 0.9990455 0.9000277 -0.9026016 0.9990455 0.9000277 -0.9035886 0.9990455 0.9000277 -0.9048372 0.9990455 0.9000277 -0.9064168 0.9990455 0.9000277 -0.9084153 0.9990455 0.9000277 -0.9109436 0.9990455 0.9000277 -0.9141422 0.9990455 0.9000277 -0.9181889 0.9990455 0.9000277 -0.9233085 0.9990455 0.9000277 -0.9297854 0.9990455 0.9000277 -0.9379796 0.9990455 0.9000277 -0.9483463 0.9990455 0.9000277 -0.9614615 0.9990455 0.9000277 -0.9780539 0.9990455 0.9000277 -0.9990455 0.9990455 0.9000277 -0.999247 0.982354 0.9193688 -0.9994057 0.9751513 0.9352277 -0.9995308 0.9733691 0.9481359 -0.9996295 0.9744915 0.9585802 -0.9997074 0.977005 0.9669906 -0.9997688 0.980031 0.9737375 -0.9998174 0.9830838 0.9791334 -0.9998557 0.9859157 0.9834385 -0.999886 0.9884188 0.9868665 -0.9999099 0.9905641 0.989592 -0.9999288 0.9923648 0.9917564 -0.9999437 0.9938541 0.9934734 -0.9187175 0.9992474 0.9194454 -0.918717 0.9992474 0.9194443 -0.9187164 0.9992474 0.9194431 -0.9187157 0.9992474 0.9194415 -0.9187148 0.9992474 0.9194395 -0.9187137 0.9992474 0.919437 -0.9187123 0.9992473 0.919434 -0.9187107 0.9992473 0.9194302 -0.9187089 0.9992473 0.9194255 -0.9187068 0.9992473 0.9194199 -0.9187045 0.9992472 0.9194133 -0.9187024 0.9992472 0.9194055 -0.9187008 0.9992472 0.9193968 -0.9187004 0.9992471 0.9193874 -0.9187027 0.9992471 0.9193783 -0.9187101 0.999247 0.9193711 -0.9187262 0.999247 0.9193688 -0.9187495 0.999247 0.9193688 -0.9187791 0.999247 0.9193688 -0.9188164 0.999247 0.9193688 -0.9188636 0.999247 0.9193688 -0.9189234 0.999247 0.9193688 -0.918999 0.999247 0.9193688 -0.9190947 0.999247 0.9193688 -0.9192157 0.999247 0.9193688 -0.9193688 0.999247 0.9193688 -0.9195625 0.999247 0.9193688 -0.9198076 0.999247 0.9193688 -0.9201176 0.999247 0.9193688 -0.9205098 0.999247 0.9193688 -0.9210061 0.999247 0.9193688 -0.9216339 0.999247 0.9193688 -0.9224281 0.999247 0.9193688 -0.9234329 0.999247 0.9193688 -0.9247041 0.999247 0.9193688 -0.9263124 0.999247 0.9193688 -0.928347 0.999247 0.9193688 -0.9309211 0.999247 0.9193688 -0.9341777 0.999247 0.9193688 -0.9382977 0.999247 0.9193688 -0.94351 0.999247 0.9193688 -0.9501042 0.999247 0.9193688 -0.9584468 0.999247 0.9193688 -0.9690013 0.999247 0.9193688 -0.982354 0.999247 0.9193688 -0.999247 0.999247 0.9193688 -0.9994057 0.9858591 0.9352277 -0.9995308 0.9801368 0.9481359 -0.9996295 0.978759 0.9585802 -0.9997074 0.9796909 0.9669906 -0.9997688 0.981719 0.9737375 -0.9998174 0.9841433 0.9791334 -0.9998557 0.9865801 0.9834385 -0.999886 0.9888351 0.9868665 -0.9999099 0.9908248 0.989592 -0.9999288 0.992528 0.9917564 -0.9999437 0.9939562 0.9934734 -0.9348153 0.999406 0.9352767 -0.9348149 0.999406 0.9352761 -0.9348146 0.999406 0.9352752 -0.9348141 0.999406 0.9352742 -0.9348135 0.999406 0.935273 -0.9348128 0.9994059 0.9352714 -0.9348119 0.9994059 0.9352694 -0.9348109 0.9994059 0.935267 -0.9348097 0.9994059 0.935264 -0.9348083 0.9994059 0.9352604 -0.9348069 0.9994059 0.9352562 -0.9348055 0.9994059 0.9352512 -0.9348044 0.9994058 0.9352456 -0.9348042 0.9994058 0.9352396 -0.9348056 0.9994058 0.9352338 -0.9348102 0.9994057 0.9352292 -0.9348204 0.9994057 0.9352277 -0.9348352 0.9994057 0.9352277 -0.9348539 0.9994057 0.9352277 -0.9348776 0.9994057 0.9352277 -0.9349075 0.9994057 0.9352277 -0.9349454 0.9994057 0.9352277 -0.9349933 0.9994057 0.9352277 -0.935054 0.9994057 0.9352277 -0.9351307 0.9994057 0.9352277 -0.9352277 0.9994057 0.9352277 -0.9353505 0.9994057 0.9352277 -0.9355059 0.9994057 0.9352277 -0.9357024 0.9994057 0.9352277 -0.935951 0.9994057 0.9352277 -0.9362655 0.9994057 0.9352277 -0.9366635 0.9994057 0.9352277 -0.9371669 0.9994057 0.9352277 -0.9378038 0.9994057 0.9352277 -0.9386096 0.9994057 0.9352277 -0.939629 0.9994057 0.9352277 -0.9409186 0.9994057 0.9352277 -0.9425502 0.9994057 0.9352277 -0.9446144 0.9994057 0.9352277 -0.9472259 0.9994057 0.9352277 -0.9505298 0.9994057 0.9352277 -0.9547096 0.9994057 0.9352277 -0.9599976 0.9994057 0.9352277 -0.9666876 0.9994057 0.9352277 -0.9751513 0.9994057 0.9352277 -0.9858591 0.9994057 0.9352277 -0.9994057 0.9994057 0.9352277 -0.9995308 0.9886988 0.9481359 -0.9996295 0.9841579 0.9585802 -0.9997074 0.983089 0.9669906 -0.9997688 0.9838545 0.9737375 -0.9998174 0.9854838 0.9791334 -0.9998557 0.9874207 0.9834385 -0.999886 0.9893618 0.9868665 -0.9999099 0.9911547 0.989592 -0.9999288 0.9927345 0.9917564 -0.9999437 0.9940854 0.9934734 -0.9478754 0.999531 0.9481671 -0.9478752 0.999531 0.9481667 -0.947875 0.999531 0.9481662 -0.9478746 0.999531 0.9481655 -0.9478743 0.999531 0.9481647 -0.9478738 0.999531 0.9481637 -0.9478733 0.999531 0.9481624 -0.9478726 0.999531 0.9481609 -0.9478718 0.999531 0.948159 -0.947871 0.9995309 0.9481567 -0.94787 0.9995309 0.948154 -0.9478691 0.9995309 0.9481509 -0.9478684 0.9995309 0.9481473 -0.9478683 0.9995309 0.9481435 -0.9478691 0.9995309 0.9481398 -0.947872 0.9995309 0.9481369 -0.9478785 0.9995308 0.9481359 -0.9478878 0.9995308 0.9481359 -0.9478997 0.9995308 0.9481359 -0.9479146 0.9995308 0.9481359 -0.9479335 0.9995308 0.9481359 -0.9479575 0.9995308 0.9481359 -0.9479878 0.9995308 0.9481359 -0.9480261 0.9995308 0.9481359 -0.9480746 0.9995308 0.9481359 -0.9481359 0.9995308 0.9481359 -0.9482135 0.9995308 0.9481359 -0.9483117 0.9995308 0.9481359 -0.9484359 0.9995308 0.9481359 -0.9485931 0.9995308 0.9481359 -0.9487918 0.9995308 0.9481359 -0.9490434 0.9995308 0.9481359 -0.9493615 0.9995308 0.9481359 -0.9497641 0.9995308 0.9481359 -0.9502734 0.9995308 0.9481359 -0.9509177 0.9995308 0.9481359 -0.9517328 0.9995308 0.9481359 -0.952764 0.9995308 0.9481359 -0.9540687 0.9995308 0.9481359 -0.9557192 0.9995308 0.9481359 -0.9578074 0.9995308 0.9481359 -0.9604492 0.9995308 0.9481359 -0.9637914 0.9995308 0.9481359 -0.9680197 0.9995308 0.9481359 -0.9733691 0.9995308 0.9481359 -0.9801368 0.9995308 0.9481359 -0.9886988 0.9995308 0.9481359 -0.9995308 0.9995308 0.9481359 -0.9996295 0.9909882 0.9585802 -0.9997074 0.9873879 0.9669906 -0.9997688 0.9865561 0.9737375 -0.9998174 0.9871796 0.9791334 -0.9998557 0.9884841 0.9834385 -0.999886 0.9900282 0.9868665 -0.9999099 0.991572 0.989592 -0.9999288 0.9929957 0.9917564 -0.9999437 0.9942488 0.9934734 -0.958416 0.9996296 0.9585999 -0.9584159 0.9996296 0.9585997 -0.9584157 0.9996296 0.9585994 -0.9584155 0.9996296 0.9585989 -0.9584153 0.9996296 0.9585984 -0.958415 0.9996296 0.9585978 -0.9584146 0.9996296 0.958597 -0.9584142 0.9996296 0.958596 -0.9584137 0.9996296 0.9585948 -0.9584132 0.9996296 0.9585934 -0.9584126 0.9996296 0.9585917 -0.958412 0.9996296 0.9585897 -0.9584115 0.9996296 0.9585874 -0.9584114 0.9996295 0.958585 -0.958412 0.9996295 0.9585826 -0.9584138 0.9996295 0.9585808 -0.9584178 0.9996295 0.9585802 -0.9584237 0.9996295 0.9585802 -0.9584312 0.9996295 0.9585802 -0.9584406 0.9996295 0.9585802 -0.9584526 0.9996295 0.9585802 -0.9584677 0.9996295 0.9585802 -0.9584868 0.9996295 0.9585802 -0.9585109 0.9996295 0.9585802 -0.9585415 0.9996295 0.9585802 -0.9585802 0.9996295 0.9585802 -0.9586291 0.9996295 0.9585802 -0.958691 0.9996295 0.9585802 -0.9587693 0.9996295 0.9585802 -0.9588684 0.9996295 0.9585802 -0.9589938 0.9996295 0.9585802 -0.9591524 0.9996295 0.9585802 -0.959353 0.9996295 0.9585802 -0.9596068 0.9996295 0.9585802 -0.959928 0.9996295 0.9585802 -0.9603343 0.9996295 0.9585802 -0.9608482 0.9996295 0.9585802 -0.9614985 0.9996295 0.9585802 -0.9623212 0.9996295 0.9585802 -0.963362 0.9996295 0.9585802 -0.9646787 0.9996295 0.9585802 -0.9663445 0.9996295 0.9585802 -0.968452 0.9996295 0.9585802 -0.9711183 0.9996295 0.9585802 -0.9744915 0.9996295 0.9585802 -0.978759 0.9996295 0.9585802 -0.9841579 0.9996295 0.9585802 -0.9909882 0.9996295 0.9585802 -0.9996295 0.9996295 0.9585802 -0.9997074 0.9928267 0.9669906 -0.9997688 0.9899741 0.9737375 -0.9998174 0.989325 0.9791334 -0.9998557 0.9898295 0.9834385 -0.999886 0.9908712 0.9868665 -0.9999099 0.9920999 0.989592 -0.9999288 0.9933261 0.9917564 -0.9999437 0.9944556 0.9934734 -0.9668873 0.9997074 0.9670031 -0.9668872 0.9997074 0.967003 -0.9668871 0.9997074 0.9670027 -0.966887 0.9997074 0.9670025 -0.9668869 0.9997074 0.9670022 -0.9668867 0.9997074 0.9670018 -0.9668865 0.9997074 0.9670013 -0.9668862 0.9997074 0.9670006 -0.9668859 0.9997074 0.9669999 -0.9668855 0.9997074 0.966999 -0.9668852 0.9997074 0.9669979 -0.9668848 0.9997074 0.9669966 -0.9668845 0.9997074 0.9669952 -0.9668844 0.9997074 0.9669937 -0.9668847 0.9997074 0.9669922 -0.9668859 0.9997074 0.966991 -0.9668884 0.9997074 0.9669906 -0.9668922 0.9997074 0.9669906 -0.9668969 0.9997074 0.9669906 -0.9669028 0.9997074 0.9669906 -0.9669103 0.9997074 0.9669906 -0.9669198 0.9997074 0.9669906 -0.9669318 0.9997074 0.9669906 -0.966947 0.9997074 0.9669906 -0.9669663 0.9997074 0.9669906 -0.9669906 0.9997074 0.9669906 -0.9670214 0.9997074 0.9669906 -0.9670604 0.9997074 0.9669906 -0.9671097 0.9997074 0.9669906 -0.967172 0.9997074 0.9669906 -0.9672509 0.9997074 0.9669906 -0.9673508 0.9997074 0.9669906 -0.967477 0.9997074 0.9669906 -0.9676368 0.9997074 0.9669906 -0.9678389 0.9997074 0.9669906 -0.9680946 0.9997074 0.9669906 -0.9684181 0.9997074 0.9669906 -0.9688274 0.9997074 0.9669906 -0.9693452 0.9997074 0.9669906 -0.9700002 0.9997074 0.9669906 -0.970829 0.9997074 0.9669906 -0.9718774 0.9997074 0.9669906 -0.9732039 0.9997074 0.9669906 -0.974882 0.9997074 0.9669906 -0.977005 0.9997074 0.9669906 -0.9796909 0.9997074 0.9669906 -0.983089 0.9997074 0.9669906 -0.9873879 0.9997074 0.9669906 -0.9928267 0.9997074 0.9669906 -0.9997074 0.9997074 0.9669906 -0.9997688 0.9942982 0.9737375 -0.9998174 0.9920392 0.9791334 -0.9998557 0.9915316 0.9834385 -0.999886 0.9919377 0.9868665 -0.9999099 0.9927678 0.989592 -0.9999288 0.9937442 0.9917564 -0.9999437 0.9947172 0.9934734 -0.9736726 0.9997689 0.9737454 -0.9736726 0.9997689 0.9737453 -0.9736725 0.9997689 0.9737452 -0.9736724 0.9997689 0.973745 -0.9736723 0.9997689 0.9737448 -0.9736722 0.9997689 0.9737445 -0.9736721 0.9997689 0.9737442 -0.9736719 0.9997689 0.9737438 -0.9736717 0.9997689 0.9737434 -0.9736715 0.9997689 0.9737428 -0.9736712 0.9997689 0.9737421 -0.973671 0.9997689 0.9737413 -0.9736708 0.9997689 0.9737404 -0.9736708 0.9997689 0.9737394 -0.973671 0.9997688 0.9737385 -0.9736717 0.9997688 0.9737378 -0.9736733 0.9997688 0.9737375 -0.9736756 0.9997688 0.9737375 -0.9736786 0.9997688 0.9737375 -0.9736823 0.9997688 0.9737375 -0.973687 0.9997688 0.9737375 -0.973693 0.9997688 0.9737375 -0.9737006 0.9997688 0.9737375 -0.9737101 0.9997688 0.9737375 -0.9737222 0.9997688 0.9737375 -0.9737375 0.9997688 0.9737375 -0.9737569 0.9997688 0.9737375 -0.9737814 0.9997688 0.9737375 -0.9738123 0.9997688 0.9737375 -0.9738515 0.9997688 0.9737375 -0.9739011 0.9997688 0.9737375 -0.9739638 0.9997688 0.9737375 -0.9740432 0.9997688 0.9737375 -0.9741436 0.9997688 0.9737375 -0.9742706 0.9997688 0.9737375 -0.9744313 0.9997688 0.9737375 -0.9746346 0.9997688 0.9737375 -0.9748918 0.9997688 0.9737375 -0.9752172 0.9997688 0.9737375 -0.9756289 0.9997688 0.9737375 -0.9761497 0.9997688 0.9737375 -0.9768086 0.9997688 0.9737375 -0.9776422 0.9997688 0.9737375 -0.9786968 0.9997688 0.9737375 -0.980031 0.9997688 0.9737375 -0.981719 0.9997688 0.9737375 -0.9838545 0.9997688 0.9737375 -0.9865561 0.9997688 0.9737375 -0.9899741 0.9997688 0.9737375 -0.9942982 0.9997688 0.9737375 -0.9997688 0.9997688 0.9737375 -0.9998174 0.9954731 0.9791334 -0.9998557 0.9936849 0.9834385 -0.999886 0.993287 0.9868665 -0.9999099 0.9936128 0.989592 -0.9999288 0.9942731 0.9917564 -0.9999437 0.9950481 0.9934734 -0.9790927 0.9998174 0.9791384 -0.9790927 0.9998174 0.9791383 -0.9790927 0.9998174 0.9791383 -0.9790926 0.9998174 0.9791382 -0.9790925 0.9998174 0.979138 -0.9790925 0.9998174 0.9791379 -0.9790924 0.9998174 0.9791377 -0.9790923 0.9998174 0.9791374 -0.9790921 0.9998174 0.9791371 -0.979092 0.9998174 0.9791368 -0.9790919 0.9998174 0.9791363 -0.9790917 0.9998174 0.9791358 -0.9790916 0.9998174 0.9791353 -0.9790916 0.9998174 0.9791347 -0.9790917 0.9998174 0.9791341 -0.9790921 0.9998174 0.9791336 -0.9790931 0.9998174 0.9791334 -0.9790946 0.9998174 0.9791334 -0.9790965 0.9998174 0.9791334 -0.9790988 0.9998174 0.9791334 -0.9791018 0.9998174 0.9791334 -0.9791055 0.9998174 0.9791334 -0.9791103 0.9998174 0.9791334 -0.9791163 0.9998174 0.9791334 -0.9791238 0.9998174 0.9791334 -0.9791334 0.9998174 0.9791334 -0.9791456 0.9998174 0.9791334 -0.979161 0.9998174 0.9791334 -0.9791804 0.9998174 0.9791334 -0.979205 0.9998174 0.9791334 -0.9792361 0.9998174 0.9791334 -0.9792755 0.9998174 0.9791334 -0.9793253 0.9998174 0.9791334 -0.9793883 0.9998174 0.9791334 -0.9794681 0.9998174 0.9791334 -0.9795689 0.9998174 0.9791334 -0.9796966 0.9998174 0.9791334 -0.979858 0.9998174 0.9791334 -0.9800622 0.9998174 0.9791334 -0.9803206 0.9998174 0.9791334 -0.9806476 0.9998174 0.9791334 -0.9810611 0.9998174 0.9791334 -0.9815844 0.9998174 0.9791334 -0.9822464 0.9998174 0.9791334 -0.9830838 0.9998174 0.9791334 -0.9841433 0.9998174 0.9791334 -0.9854838 0.9998174 0.9791334 -0.9871796 0.9998174 0.9791334 -0.989325 0.9998174 0.9791334 -0.9920392 0.9998174 0.9791334 -0.9954731 0.9998174 0.9791334 -0.9998174 0.9998174 0.9791334 -0.9998557 0.9964092 0.9834385 -0.999886 0.9949941 0.9868665 -0.9999099 0.9946818 0.989592 -0.9999288 0.9949422 0.9917564 -0.9999437 0.9954668 0.9934734 -0.9834129 0.9998557 0.9834416 -0.9834129 0.9998557 0.9834415 -0.9834129 0.9998557 0.9834415 -0.9834129 0.9998557 0.9834414 -0.9834128 0.9998557 0.9834413 -0.9834128 0.9998557 0.9834412 -0.9834127 0.9998557 0.9834411 -0.9834127 0.9998557 0.983441 -0.9834126 0.9998557 0.9834408 -0.9834125 0.9998557 0.9834405 -0.9834124 0.9998557 0.9834403 -0.9834123 0.9998557 0.98344 -0.9834122 0.9998557 0.9834396 -0.9834122 0.9998557 0.9834392 -0.9834123 0.9998557 0.9834389 -0.9834126 0.9998557 0.9834386 -0.9834132 0.9998557 0.9834385 -0.9834141 0.9998557 0.9834385 -0.9834153 0.9998557 0.9834385 -0.9834167 0.9998557 0.9834385 -0.9834186 0.9998557 0.9834385 -0.9834209 0.9998557 0.9834385 -0.9834239 0.9998557 0.9834385 -0.9834277 0.9998557 0.9834385 -0.9834324 0.9998557 0.9834385 -0.9834385 0.9998557 0.9834385 -0.9834461 0.9998557 0.9834385 -0.9834557 0.9998557 0.9834385 -0.9834679 0.9998557 0.9834385 -0.9834833 0.9998557 0.9834385 -0.9835029 0.9998557 0.9834385 -0.9835276 0.9998557 0.9834385 -0.9835588 0.9998557 0.9834385 -0.9835983 0.9998557 0.9834385 -0.9836483 0.9998557 0.9834385 -0.9837116 0.9998557 0.9834385 -0.9837916 0.9998557 0.9834385 -0.9838928 0.9998557 0.9834385 -0.9840209 0.9998557 0.9834385 -0.9841829 0.9998557 0.9834385 -0.984388 0.9998557 0.9834385 -0.9846473 0.9998557 0.9834385 -0.9849754 0.9998557 0.9834385 -0.9853905 0.9998557 0.9834385 -0.9859157 0.9998557 0.9834385 -0.9865801 0.9998557 0.9834385 -0.9874207 0.9998557 0.9834385 -0.9884841 0.9998557 0.9834385 -0.9898295 0.9998557 0.9834385 -0.9915316 0.9998557 0.9834385 -0.9936849 0.9998557 0.9834385 -0.9964092 0.9998557 0.9834385 -0.9998557 0.9998557 0.9834385 -0.999886 0.9971537 0.9868665 -0.9999099 0.9960342 0.989592 -0.9999288 0.9957887 0.9917564 -0.9999437 0.9959964 0.9934734 -0.9868505 0.999886 0.9868685 -0.9868505 0.999886 0.9868684 -0.9868505 0.999886 0.9868684 -0.9868505 0.999886 0.9868684 -0.9868504 0.999886 0.9868683 -0.9868504 0.999886 0.9868682 -0.9868504 0.999886 0.9868682 -0.9868503 0.999886 0.9868681 -0.9868503 0.999886 0.986868 -0.9868502 0.999886 0.9868678 -0.9868502 0.999886 0.9868676 -0.9868501 0.999886 0.9868674 -0.9868501 0.999886 0.9868672 -0.98685 0.999886 0.986867 -0.9868501 0.999886 0.9868667 -0.9868503 0.999886 0.9868666 -0.9868507 0.999886 0.9868665 -0.9868512 0.999886 0.9868665 -0.986852 0.999886 0.9868665 -0.9868529 0.999886 0.9868665 -0.9868541 0.999886 0.9868665 -0.9868555 0.999886 0.9868665 -0.9868574 0.999886 0.9868665 -0.9868597 0.999886 0.9868665 -0.9868627 0.999886 0.9868665 -0.9868665 0.999886 0.9868665 -0.9868713 0.999886 0.9868665 -0.9868773 0.999886 0.9868665 -0.986885 0.999886 0.9868665 -0.9868946 0.999886 0.9868665 -0.9869069 0.999886 0.9868665 -0.9869223 0.999886 0.9868665 -0.9869419 0.999886 0.9868665 -0.9869667 0.999886 0.9868665 -0.986998 0.999886 0.9868665 -0.9870376 0.999886 0.9868665 -0.9870878 0.999886 0.9868665 -0.9871512 0.999886 0.9868665 -0.9872315 0.999886 0.9868665 -0.987333 0.999886 0.9868665 -0.9874615 0.999886 0.9868665 -0.987624 0.999886 0.9868665 -0.9878296 0.999886 0.9868665 -0.9880897 0.999886 0.9868665 -0.9884188 0.999886 0.9868665 -0.9888351 0.999886 0.9868665 -0.9893618 0.999886 0.9868665 -0.9900282 0.999886 0.9868665 -0.9908712 0.999886 0.9868665 -0.9919377 0.999886 0.9868665 -0.993287 0.999886 0.9868665 -0.9949941 0.999886 0.9868665 -0.9971537 0.999886 0.9868665 -0.999886 0.999886 0.9868665 -0.9999099 0.9977452 0.989592 -0.9999288 0.9968597 0.9917564 -0.9999437 0.9966665 0.9934734 -0.989582 0.9999099 0.9895933 -0.989582 0.9999099 0.9895932 -0.989582 0.9999099 0.9895932 -0.989582 0.9999099 0.9895932 -0.989582 0.9999099 0.9895932 -0.9895819 0.9999099 0.9895931 -0.9895819 0.9999099 0.9895931 -0.9895819 0.9999099 0.989593 -0.9895819 0.9999099 0.9895929 -0.9895818 0.9999099 0.9895928 -0.9895818 0.9999099 0.9895927 -0.9895818 0.9999099 0.9895926 -0.9895817 0.9999099 0.9895925 -0.9895817 0.9999099 0.9895923 -0.9895817 0.9999099 0.9895922 -0.9895819 0.9999099 0.9895921 -0.9895821 0.9999099 0.989592 -0.9895825 0.9999099 0.989592 -0.9895829 0.9999099 0.989592 -0.9895835 0.9999099 0.989592 -0.9895842 0.9999099 0.989592 -0.9895851 0.9999099 0.989592 -0.9895863 0.9999099 0.989592 -0.9895878 0.9999099 0.989592 -0.9895897 0.9999099 0.989592 -0.989592 0.9999099 0.989592 -0.989595 0.9999099 0.989592 -0.9895988 0.9999099 0.989592 -0.9896036 0.9999099 0.989592 -0.9896096 0.9999099 0.989592 -0.9896173 0.9999099 0.989592 -0.989627 0.9999099 0.989592 -0.9896392 0.9999099 0.989592 -0.9896547 0.9999099 0.989592 -0.9896744 0.9999099 0.989592 -0.9896992 0.9999099 0.989592 -0.9897306 0.9999099 0.989592 -0.9897703 0.9999099 0.989592 -0.9898206 0.9999099 0.989592 -0.9898842 0.9999099 0.989592 -0.9899646 0.9999099 0.989592 -0.9900664 0.9999099 0.989592 -0.9901951 0.9999099 0.989592 -0.990358 0.9999099 0.989592 -0.9905641 0.9999099 0.989592 -0.9908248 0.9999099 0.989592 -0.9911547 0.9999099 0.989592 -0.991572 0.9999099 0.989592 -0.9920999 0.9999099 0.989592 -0.9927678 0.9999099 0.989592 -0.9936128 0.9999099 0.989592 -0.9946818 0.9999099 0.989592 -0.9960342 0.9999099 0.989592 -0.9977452 0.9999099 0.989592 -0.9999099 0.9999099 0.989592 -0.9999288 0.9982146 0.9917564 -0.9999437 0.9975143 0.9934734 -0.9917501 0.9999288 0.9917571 -0.9917501 0.9999288 0.9917571 -0.9917501 0.9999288 0.9917571 -0.9917501 0.9999288 0.9917571 -0.9917501 0.9999288 0.9917571 -0.9917501 0.9999288 0.991757 -0.99175 0.9999288 0.991757 -0.99175 0.9999288 0.991757 -0.99175 0.9999288 0.9917569 -0.99175 0.9999288 0.9917569 -0.99175 0.9999288 0.9917568 -0.9917499 0.9999288 0.9917567 -0.9917499 0.9999288 0.9917566 -0.9917499 0.9999288 0.9917565 -0.9917499 0.9999288 0.9917565 -0.99175 0.9999288 0.9917564 -0.9917502 0.9999288 0.9917564 -0.9917504 0.9999288 0.9917564 -0.9917507 0.9999288 0.9917564 -0.991751 0.9999288 0.9917564 -0.9917515 0.9999288 0.9917564 -0.9917521 0.9999288 0.9917564 -0.9917528 0.9999288 0.9917564 -0.9917537 0.9999288 0.9917564 -0.9917549 0.9999288 0.9917564 -0.9917564 0.9999288 0.9917564 -0.9917582 0.9999288 0.9917564 -0.9917606 0.9999288 0.9917564 -0.9917636 0.9999288 0.9917564 -0.9917674 0.9999288 0.9917564 -0.9917722 0.9999288 0.9917564 -0.9917782 0.9999288 0.9917564 -0.9917859 0.9999288 0.9917564 -0.9917956 0.9999288 0.9917564 -0.9918079 0.9999288 0.9917564 -0.9918234 0.9999288 0.9917564 -0.9918431 0.9999288 0.9917564 -0.991868 0.9999288 0.9917564 -0.9918994 0.9999288 0.9917564 -0.9919392 0.9999288 0.9917564 -0.9919896 0.9999288 0.9917564 -0.9920533 0.9999288 0.9917564 -0.9921339 0.9999288 0.9917564 -0.9922358 0.9999288 0.9917564 -0.9923648 0.9999288 0.9917564 -0.992528 0.9999288 0.9917564 -0.9927345 0.9999288 0.9917564 -0.9929957 0.9999288 0.9917564 -0.9933261 0.9999288 0.9917564 -0.9937442 0.9999288 0.9917564 -0.9942731 0.9999288 0.9917564 -0.9949422 0.9999288 0.9917564 -0.9957887 0.9999288 0.9917564 -0.9968597 0.9999288 0.9917564 -0.9982146 0.9999288 0.9917564 -0.9999288 0.9999288 0.9917564 -0.9999437 0.9985868 0.9934734 -0.9934695 0.9999437 0.9934739 -0.9934695 0.9999437 0.9934739 -0.9934695 0.9999437 0.9934739 -0.9934695 0.9999437 0.9934739 -0.9934695 0.9999437 0.9934739 -0.9934695 0.9999437 0.9934738 -0.9934695 0.9999437 0.9934738 -0.9934694 0.9999437 0.9934738 -0.9934694 0.9999437 0.9934738 -0.9934694 0.9999437 0.9934737 -0.9934694 0.9999437 0.9934737 -0.9934694 0.9999437 0.9934736 -0.9934694 0.9999437 0.9934736 -0.9934694 0.9999437 0.9934735 -0.9934694 0.9999437 0.9934735 -0.9934694 0.9999437 0.9934734 -0.9934695 0.9999437 0.9934734 -0.9934697 0.9999437 0.9934734 -0.9934698 0.9999437 0.9934734 -0.9934701 0.9999437 0.9934734 -0.9934704 0.9999437 0.9934734 -0.9934707 0.9999437 0.9934734 -0.9934712 0.9999437 0.9934734 -0.9934718 0.9999437 0.9934734 -0.9934725 0.9999437 0.9934734 -0.9934734 0.9999437 0.9934734 -0.9934746 0.9999437 0.9934734 -0.9934761 0.9999437 0.9934734 -0.9934779 0.9999437 0.9934734 -0.9934803 0.9999437 0.9934734 -0.9934833 0.9999437 0.9934734 -0.9934871 0.9999437 0.9934734 -0.9934919 0.9999437 0.9934734 -0.993498 0.9999437 0.9934734 -0.9935057 0.9999437 0.9934734 -0.9935154 0.9999437 0.9934734 -0.9935277 0.9999437 0.9934734 -0.9935432 0.9999437 0.9934734 -0.9935629 0.9999437 0.9934734 -0.9935878 0.9999437 0.9934734 -0.9936193 0.9999437 0.9934734 -0.9936592 0.9999437 0.9934734 -0.9937096 0.9999437 0.9934734 -0.9937734 0.9999437 0.9934734 -0.9938541 0.9999437 0.9934734 -0.9939562 0.9999437 0.9934734 -0.9940854 0.9999437 0.9934734 -0.9942488 0.9999437 0.9934734 -0.9944556 0.9999437 0.9934734 -0.9947172 0.9999437 0.9934734 -0.9950481 0.9999437 0.9934734 -0.9954668 0.9999437 0.9934734 -0.9959964 0.9999437 0.9934734 -0.9966665 0.9999437 0.9934734 -0.9975143 0.9999437 0.9934734 -0.9985868 0.9999437 0.9934734 -0.9999437 0.9999437 0.9934734 -0.0051514 0.0051514 0.8407292 -0.0056422 0.0051514 0.8407292 -0.0062631 0.0051514 0.8407292 -0.0070486 0.0051514 0.8407292 -0.0080424 0.0051514 0.8407292 -0.0092997 0.0051514 0.8407292 -0.0108903 0.0051514 0.8407292 -0.0129027 0.0051514 0.8407292 -0.0154486 0.0051514 0.8407292 -0.0186694 0.0051514 0.8407292 -0.0227443 0.0051514 0.8407292 -0.0278994 0.0051514 0.8407292 -0.0344214 0.0051514 0.8407292 -0.0426726 0.0051514 0.8407292 -0.0531113 0.0051514 0.8407292 -0.0663177 0.0051514 0.8407292 -0.0830256 0.0051514 0.8407292 -0.1041632 0.0051514 0.8407292 -0.1309049 0.0051514 0.8407292 -0.1647368 0.0051514 0.8407292 -0.2075384 0.0051514 0.8407292 -0.2616881 0.0051514 0.8407292 -0.3301945 0.0051514 0.8407292 -0.416864 0.0051514 0.8407292 -0.5265122 0.0051514 0.8407292 -0.6652314 0.0051514 0.8407292 -0.8407292 0.0051514 0.8407292 -0.9033413 0.0279321 0.7195629 -0.9354466 0.0624569 0.6074336 -0.9545467 0.1059991 0.5245844 -0.9669269 0.1572498 0.4728847 -0.9754027 0.2151269 0.4493504 -0.9814251 0.2783684 0.4495482 -0.9858181 0.3454107 0.4686457 -0.9890841 0.4144197 0.5018211 -0.9915469 0.4834235 0.5445046 -0.993424 0.5504963 0.5925797 -0.9948662 0.6139459 0.642552 -0.9959813 0.6724572 0.6916607 -0.9968475 0.7251659 0.7379123 -0.997523 0.7716588 0.7800347 -0.9980513 0.8119154 0.8173713 -0.9984653 0.8462171 0.8497444 -0.9987905 0.8750477 0.8773138 -0.9990461 0.8990028 0.9004509 -0.9992474 0.9187175 0.9196389 -0.999406 0.9348153 0.9353994 -0.999531 0.9478754 0.9482447 -0.9996296 0.958416 0.9586489 -0.9997074 0.9668873 0.9670339 -0.9997689 0.9736726 0.9737647 -0.9998174 0.9790927 0.9791506 -0.9998557 0.9834129 0.9834492 -0.999886 0.9868505 0.9868732 -0.9999099 0.989582 0.9895962 -0.9999288 0.9917501 0.991759 -0.9999437 0.9934695 0.9934751 -0.0051514 0.0056422 0.8407292 -0.0051286 0.0051286 0.8405071 -0.0057497 0.0051286 0.8405071 -0.0065355 0.0051286 0.8405071 -0.0075296 0.0051286 0.8405071 -0.0087874 0.0051286 0.8405071 -0.0103785 0.0051286 0.8405071 -0.0123916 0.0051286 0.8405071 -0.0149384 0.0051286 0.8405071 -0.0181604 0.0051286 0.8405071 -0.0222366 0.0051286 0.8405071 -0.0273936 0.0051286 0.8405071 -0.0339178 0.0051286 0.8405071 -0.0421719 0.0051286 0.8405071 -0.0526143 0.0051286 0.8405071 -0.0658253 0.0051286 0.8405071 -0.082539 0.0051286 0.8405071 -0.1036839 0.0051286 0.8405071 -0.1304351 0.0051286 0.8405071 -0.1642787 0.0051286 0.8405071 -0.2070953 0.0051286 0.8405071 -0.2612639 0.0051286 0.8405071 -0.3297942 0.0051286 0.8405071 -0.4164939 0.0051286 0.8405071 -0.5261804 0.0051286 0.8405071 -0.664948 0.0051286 0.8405071 -0.8405071 0.0051286 0.8405071 -0.9032596 0.0278872 0.7194036 -0.9354101 0.0624063 0.6072715 -0.9545286 0.1059489 0.5244254 -0.9669173 0.1572031 0.4727393 -0.9753975 0.2150852 0.4492248 -0.9814221 0.2783325 0.4494442 -0.9858163 0.3453807 0.4685627 -0.9890831 0.4143955 0.5017569 -0.9915463 0.4834045 0.5444563 -0.9934236 0.5504818 0.5925443 -0.994866 0.6139352 0.6425265 -0.9959811 0.6724495 0.6916428 -0.9968474 0.7251605 0.7379 -0.997523 0.7716551 0.7800263 -0.9980512 0.8119128 0.8173657 -0.9984653 0.8462154 0.8497407 -0.9987905 0.8750466 0.8773114 -0.9990461 0.899002 0.9004493 -0.9992474 0.918717 0.9196379 -0.999406 0.9348149 0.9353987 -0.999531 0.9478752 0.9482442 -0.9996296 0.9584159 0.9586486 -0.9997074 0.9668872 0.9670337 -0.9997689 0.9736726 0.9737646 -0.9998174 0.9790927 0.9791505 -0.9998557 0.9834129 0.9834492 -0.999886 0.9868505 0.9868732 -0.9999099 0.989582 0.9895962 -0.9999288 0.9917501 0.991759 -0.9999437 0.9934695 0.9934751 -0.0051514 0.0062631 0.8407292 -0.0051286 0.0057497 0.8405071 -0.0051047 0.0051047 0.8402274 -0.0058909 0.0051047 0.8402274 -0.0068855 0.0051047 0.8402274 -0.0081437 0.0051047 0.8402274 -0.0097356 0.0051047 0.8402274 -0.0117495 0.0051047 0.8402274 -0.0142974 0.0051047 0.8402274 -0.0175208 0.0051047 0.8402274 -0.0215989 0.0051047 0.8402274 -0.0267581 0.0051047 0.8402274 -0.0332852 0.0051047 0.8402274 -0.0415429 0.0051047 0.8402274 -0.0519898 0.0051047 0.8402274 -0.0652066 0.0051047 0.8402274 -0.0819276 0.0051047 0.8402274 -0.1030818 0.0051047 0.8402274 -0.1298447 0.0051047 0.8402274 -0.1637031 0.0051047 0.8402274 -0.2065385 0.0051047 0.8402274 -0.2607307 0.0051047 0.8402274 -0.329291 0.0051047 0.8402274 -0.4160287 0.0051047 0.8402274 -0.5257632 0.0051047 0.8402274 -0.6645915 0.0051047 0.8402274 -0.8402274 0.0051047 0.8402274 -0.9031567 0.0278347 0.7192033 -0.9353643 0.0623458 0.6070678 -0.9545059 0.1058883 0.5242258 -0.9669053 0.1571463 0.4725567 -0.9753908 0.2150342 0.4490669 -0.9814183 0.2782884 0.4493137 -0.9858141 0.3453439 0.4684585 -0.9890818 0.4143657 0.5016763 -0.9915455 0.4833811 0.5443956 -0.9934231 0.550464 0.5924997 -0.9948657 0.6139219 0.6424946 -0.9959809 0.6724399 0.6916203 -0.9968473 0.7251537 0.7378845 -0.9975229 0.7716504 0.7800158 -0.9980512 0.8119096 0.8173587 -0.9984653 0.8462132 0.8497361 -0.9987904 0.8750451 0.8773083 -0.9990461 0.8990011 0.9004474 -0.9992474 0.9187164 0.9196366 -0.999406 0.9348146 0.9353979 -0.999531 0.947875 0.9482437 -0.9996296 0.9584157 0.9586483 -0.9997074 0.9668871 0.9670335 -0.9997689 0.9736725 0.9737645 -0.9998174 0.9790927 0.9791504 -0.9998557 0.9834129 0.9834491 -0.999886 0.9868505 0.9868732 -0.9999099 0.989582 0.9895962 -0.9999288 0.9917501 0.991759 -0.9999437 0.9934695 0.993475 -0.0051514 0.0070486 0.8407292 -0.0051286 0.0065355 0.8405071 -0.0051047 0.0058909 0.8402274 -0.0050826 0.0050826 0.8398756 -0.0060778 0.0050826 0.8398756 -0.0073367 0.0050826 0.8398756 -0.0089295 0.0050826 0.8398756 -0.0109445 0.0050826 0.8398756 -0.0134938 0.0050826 0.8398756 -0.016719 0.0050826 0.8398756 -0.0207992 0.0050826 0.8398756 -0.0259613 0.0050826 0.8398756 -0.032492 0.0050826 0.8398756 -0.0407541 0.0050826 0.8398756 -0.0512068 0.0050826 0.8398756 -0.0644309 0.0050826 0.8398756 -0.081161 0.0050826 0.8398756 -0.1023268 0.0050826 0.8398756 -0.1291042 0.0050826 0.8398756 -0.1629812 0.0050826 0.8398756 -0.20584 0.0050826 0.8398756 -0.2600619 0.0050826 0.8398756 -0.3286597 0.0050826 0.8398756 -0.4154448 0.0050826 0.8398756 -0.5252393 0.0050826 0.8398756 -0.6641436 0.0050826 0.8398756 -0.8398756 0.0050826 0.8398756 -0.9030276 0.0277752 0.7189519 -0.9353068 0.0622749 0.6068123 -0.9544774 0.1058162 0.5239754 -0.9668902 0.1570779 0.4723278 -0.9753825 0.2149725 0.448869 -0.9814136 0.2782347 0.44915 -0.9858113 0.3452987 0.4683279 -0.9890801 0.414329 0.5015752 -0.9915446 0.4833522 0.5443196 -0.9934225 0.5504419 0.5924439 -0.9948653 0.6139056 0.6424545 -0.9959807 0.672428 0.6915922 -0.9968472 0.7251454 0.7378651 -0.9975228 0.7716446 0.7800027 -0.9980511 0.8119057 0.8173499 -0.9984653 0.8462106 0.8497303 -0.9987904 0.8750434 0.8773045 -0.9990461 0.899 0.9004449 -0.9992474 0.9187157 0.919635 -0.999406 0.9348141 0.9353969 -0.999531 0.9478746 0.9482431 -0.9996296 0.9584155 0.9586479 -0.9997074 0.966887 0.9670333 -0.9997689 0.9736724 0.9737643 -0.9998174 0.9790926 0.9791503 -0.9998557 0.9834129 0.983449 -0.999886 0.9868505 0.9868731 -0.9999099 0.989582 0.9895962 -0.9999288 0.9917501 0.991759 -0.9999437 0.9934695 0.993475 -0.0051514 0.0080424 0.8407292 -0.0051286 0.0075296 0.8405071 -0.0051047 0.0068855 0.8402274 -0.0050826 0.0060778 0.8398756 -0.0050676 0.0050676 0.8394338 -0.0063275 0.0050676 0.8394338 -0.0079213 0.0050676 0.8394338 -0.0099377 0.0050676 0.8394338 -0.0124887 0.0050676 0.8394338 -0.0157161 0.0050676 0.8394338 -0.0197991 0.0050676 0.8394338 -0.0249647 0.0050676 0.8394338 -0.0314998 0.0050676 0.8394338 -0.0397676 0.0050676 0.8394338 -0.0502275 0.0050676 0.8394338 -0.0634605 0.0050676 0.8394338 -0.080202 0.0050676 0.8394338 -0.1013822 0.0050676 0.8394338 -0.128178 0.0050676 0.8394338 -0.162078 0.0050676 0.8394338 -0.204966 0.0050676 0.8394338 -0.2592249 0.0050676 0.8394338 -0.3278694 0.0050676 0.8394338 -0.4147137 0.0050676 0.8394338 -0.524583 0.0050676 0.8394338 -0.663582 0.0050676 0.8394338 -0.8394338 0.0050676 0.8394338 -0.9028657 0.0277111 0.7186372 -0.9352348 0.0621943 0.6064926 -0.9544418 0.1057322 0.5236622 -0.9668714 0.1569971 0.4720415 -0.9753721 0.2148987 0.4486216 -0.9814076 0.2781701 0.4489453 -0.9858079 0.3452442 0.4681646 -0.9890781 0.4142845 0.5014489 -0.9915433 0.4833171 0.5442245 -0.9934218 0.550415 0.5923741 -0.9948649 0.6138855 0.6424045 -0.9959804 0.6724135 0.6915571 -0.996847 0.7251351 0.7378409 -0.9975227 0.7716375 0.7799862 -0.9980511 0.8119009 0.8173389 -0.9984652 0.8462073 0.849723 -0.9987904 0.8750412 0.8772998 -0.9990461 0.8989986 0.9004418 -0.9992474 0.9187148 0.919633 -0.999406 0.9348135 0.9353956 -0.999531 0.9478743 0.9482423 -0.9996296 0.9584153 0.9586473 -0.9997074 0.9668869 0.9670329 -0.9997689 0.9736723 0.9737641 -0.9998174 0.9790925 0.9791502 -0.9998557 0.9834128 0.983449 -0.999886 0.9868504 0.9868731 -0.9999099 0.989582 0.9895961 -0.9999288 0.9917501 0.9917589 -0.9999437 0.9934695 0.993475 -0.0051514 0.0092997 0.8407292 -0.0051286 0.0087874 0.8405071 -0.0051047 0.0081437 0.8402274 -0.0050826 0.0073367 0.8398756 -0.0050676 0.0063275 0.8394338 -0.0050694 0.0050694 0.8388802 -0.0066646 0.0050694 0.8388802 -0.0086827 0.0050694 0.8388802 -0.0112359 0.0050694 0.8388802 -0.014466 0.0050694 0.8388802 -0.0185525 0.0050694 0.8388802 -0.0237224 0.0050694 0.8388802 -0.0302631 0.0050694 0.8388802 -0.0385378 0.0050694 0.8388802 -0.0490065 0.0050694 0.8388802 -0.0622508 0.0050694 0.8388802 -0.0790064 0.0050694 0.8388802 -0.1002045 0.0050694 0.8388802 -0.1270229 0.0050694 0.8388802 -0.1609516 0.0050694 0.8388802 -0.2038759 0.0050694 0.8388802 -0.2581807 0.0050694 0.8388802 -0.3268833 0.0050694 0.8388802 -0.413801 0.0050694 0.8388802 -0.5237632 0.0050694 0.8388802 -0.6628797 0.0050694 0.8388802 -0.8388802 0.0050694 0.8388802 -0.9026634 0.0276479 0.7182443 -0.9351449 0.0621069 0.6060939 -0.9543974 0.1056375 0.5232717 -0.9668479 0.156904 0.4716846 -0.9753591 0.2148124 0.4483133 -0.9814002 0.2780936 0.4486903 -0.9858036 0.3451791 0.4679612 -0.9890755 0.4142311 0.5012915 -0.9915418 0.4832747 0.5441061 -0.9934209 0.5503825 0.5922872 -0.9948643 0.6138613 0.6423421 -0.9959801 0.6723959 0.6915133 -0.9968468 0.7251226 0.7378107 -0.9975226 0.7716288 0.7799657 -0.998051 0.8118949 0.8173252 -0.9984652 0.8462034 0.8497139 -0.9987904 0.8750386 0.8772938 -0.9990461 0.8989969 0.900438 -0.9992474 0.9187137 0.9196306 -0.9994059 0.9348128 0.9353941 -0.999531 0.9478738 0.9482413 -0.9996296 0.958415 0.9586467 -0.9997074 0.9668867 0.9670325 -0.9997689 0.9736722 0.9737639 -0.9998174 0.9790925 0.97915 -0.9998557 0.9834128 0.9834489 -0.999886 0.9868504 0.986873 -0.9999099 0.9895819 0.9895961 -0.9999288 0.9917501 0.9917589 -0.9999437 0.9934695 0.993475 -0.0051514 0.0108903 0.8407292 -0.0051286 0.0103785 0.8405071 -0.0051047 0.0097356 0.8402274 -0.0050826 0.0089295 0.8398756 -0.0050676 0.0079213 0.8394338 -0.0050694 0.0066646 0.8388802 -0.0051048 0.0051048 0.8381886 -0.007125 0.0051048 0.8381886 -0.0096809 0.0051048 0.8381886 -0.0129143 0.0051048 0.8381886 -0.0170051 0.0051048 0.8381886 -0.0221804 0.0051048 0.8381886 -0.0287279 0.0051048 0.8381886 -0.0370113 0.0051048 0.8381886 -0.0474909 0.0051048 0.8381886 -0.060749 0.0051048 0.8381886 -0.0775221 0.0051048 0.8381886 -0.0987424 0.0051048 0.8381886 -0.1255887 0.0051048 0.8381886 -0.1595528 0.0051048 0.8381886 -0.2025219 0.0051048 0.8381886 -0.2568833 0.0051048 0.8381886 -0.3256576 0.0051048 0.8381886 -0.412666 0.0051048 0.8381886 -0.5227429 0.0051048 0.8381886 -0.6620045 0.0051048 0.8381886 -0.8381886 0.0051048 0.8381886 -0.9024114 0.0275966 0.7177558 -0.9350332 0.0620199 0.6055988 -0.9543421 0.1055364 0.5227869 -0.9668187 0.1568008 0.4712417 -0.975343 0.2147144 0.4479306 -0.9813911 0.2780055 0.448374 -0.9857982 0.3451032 0.4677088 -0.9890723 0.4141683 0.5010964 -0.9915399 0.4832246 0.5439593 -0.9934197 0.5503438 0.5921795 -0.9948636 0.6138323 0.6422649 -0.9959797 0.6723748 0.691459 -0.9968465 0.7251076 0.7377732 -0.9975224 0.7716184 0.7799403 -0.9980509 0.8118878 0.8173082 -0.9984651 0.8461986 0.8497027 -0.9987903 0.8750355 0.8772865 -0.9990461 0.8989948 0.9004332 -0.9992473 0.9187123 0.9196275 -0.9994059 0.9348119 0.9353921 -0.999531 0.9478733 0.94824 -0.9996296 0.9584146 0.9586459 -0.9997074 0.9668865 0.967032 -0.9997689 0.9736721 0.9737636 -0.9998174 0.9790924 0.9791498 -0.9998557 0.9834127 0.9834487 -0.999886 0.9868504 0.9868729 -0.9999099 0.9895819 0.9895961 -0.9999288 0.99175 0.9917589 -0.9999437 0.9934695 0.993475 -0.0051514 0.0129027 0.8407292 -0.0051286 0.0123916 0.8405071 -0.0051047 0.0117495 0.8402274 -0.0050826 0.0109445 0.8398756 -0.0050676 0.0099377 0.8394338 -0.0050694 0.0086827 0.8388802 -0.0051048 0.007125 0.8381886 -0.0052028 0.0052028 0.8373283 -0.0077619 0.0052028 0.8373283 -0.0109995 0.0052028 0.8373283 -0.0150955 0.0052028 0.8373283 -0.0202775 0.0052028 0.8373283 -0.0268333 0.0052028 0.8373283 -0.0351273 0.0052028 0.8373283 -0.0456203 0.0052028 0.8373283 -0.0588953 0.0052028 0.8373283 -0.0756899 0.0052028 0.8373283 -0.0969372 0.0052028 0.8373283 -0.1238179 0.0052028 0.8373283 -0.1578254 0.0052028 0.8373283 -0.2008493 0.0052028 0.8373283 -0.2552802 0.0052028 0.8373283 -0.3241424 0.0052028 0.8373283 -0.4112619 0.0052028 0.8373283 -0.5214795 0.0052028 0.8373283 -0.6609191 0.0052028 0.8373283 -0.8373283 0.0052028 0.8373283 -0.9020992 0.0275778 0.7171517 -0.9348949 0.0619473 0.6049872 -0.9542739 0.1054384 0.5221884 -0.9667827 0.1566936 0.4706951 -0.9753231 0.2146085 0.4474586 -0.9813797 0.2779077 0.4479838 -0.9857916 0.3450175 0.4673977 -0.9890684 0.4140964 0.5008557 -0.9915376 0.4831666 0.5437782 -0.9934183 0.5502987 0.5920467 -0.9948628 0.6137984 0.6421696 -0.9959791 0.67235 0.691392 -0.9968462 0.7250899 0.7377271 -0.9975222 0.7716061 0.779909 -0.9980508 0.8118794 0.8172873 -0.998465 0.8461929 0.8496889 -0.9987903 0.8750317 0.8772775 -0.999046 0.8989923 0.9004274 -0.9992473 0.9187107 0.9196237 -0.9994059 0.9348109 0.9353897 -0.999531 0.9478726 0.9482385 -0.9996296 0.9584142 0.9586449 -0.9997074 0.9668862 0.9670314 -0.9997689 0.9736719 0.9737632 -0.9998174 0.9790923 0.9791496 -0.9998557 0.9834127 0.9834486 -0.999886 0.9868503 0.9868728 -0.9999099 0.9895819 0.989596 -0.9999288 0.99175 0.9917588 -0.9999437 0.9934694 0.993475 -0.0051514 0.0154486 0.8407292 -0.0051286 0.0149384 0.8405071 -0.0051047 0.0142974 0.8402274 -0.0050826 0.0134938 0.8398756 -0.0050676 0.0124887 0.8394338 -0.0050694 0.0112359 0.8388802 -0.0051048 0.0096809 0.8381886 -0.0052028 0.0077619 0.8373283 -0.0054121 0.0054121 0.8362644 -0.0086547 0.0054121 0.8362644 -0.012757 0.0054121 0.8362644 -0.017947 0.0054121 0.8362644 -0.024513 0.0054121 0.8362644 -0.0328199 0.0054121 0.8362644 -0.0433291 0.0054121 0.8362644 -0.0566247 0.0054121 0.8362644 -0.0734453 0.0054121 0.8362644 -0.0947256 0.0054121 0.8362644 -0.1216479 0.0054121 0.8362644 -0.1557082 0.0054121 0.8362644 -0.1987988 0.0054121 0.8362644 -0.253314 0.0054121 0.8362644 -0.3222829 0.0054121 0.8362644 -0.4095375 0.0054121 0.8362644 -0.519926 0.0054121 0.8362644 -0.6595817 0.0054121 0.8362644 -0.8362644 0.0054121 0.8362644 -0.9017148 0.0276281 0.7164099 -0.9347252 0.061916 0.6042375 -0.9541902 0.1053624 0.5214553 -0.9667385 0.1565954 0.4700258 -0.9752987 0.2145034 0.4468808 -0.9813659 0.2778058 0.4475063 -0.9857835 0.3449254 0.467017 -0.9890637 0.4140176 0.5005614 -0.9915347 0.4831021 0.5435568 -0.9934166 0.550248 0.5918842 -0.9948617 0.6137599 0.6420531 -0.9959785 0.6723217 0.6913102 -0.9968458 0.7250697 0.7376706 -0.997522 0.7715919 0.7798707 -0.9980506 0.8118697 0.8172617 -0.9984649 0.8461864 0.849672 -0.9987902 0.8750274 0.8772664 -0.999046 0.8989895 0.9004202 -0.9992473 0.9187089 0.9196191 -0.9994059 0.9348097 0.9353867 -0.999531 0.9478718 0.9482366 -0.9996296 0.9584137 0.9586437 -0.9997074 0.9668859 0.9670307 -0.9997689 0.9736717 0.9737627 -0.9998174 0.9790921 0.9791493 -0.9998557 0.9834126 0.9834484 -0.999886 0.9868503 0.9868727 -0.9999099 0.9895819 0.9895959 -0.9999288 0.99175 0.9917588 -0.9999437 0.9934694 0.9934749 -0.0051514 0.0186694 0.8407292 -0.0051286 0.0181604 0.8405071 -0.0051047 0.0175208 0.8402274 -0.0050826 0.016719 0.8398756 -0.0050676 0.0157161 0.8394338 -0.0050694 0.014466 0.8388802 -0.0051048 0.0129143 0.8381886 -0.0052028 0.0109995 0.8373283 -0.0054121 0.0086547 0.8362644 -0.0058134 0.0058134 0.8349593 -0.0099234 0.0058134 0.8349593 -0.015123 0.0058134 0.8349593 -0.0217012 0.0058134 0.8349593 -0.0300235 0.0058134 0.8349593 -0.0405522 0.0058134 0.8349593 -0.0538725 0.0058134 0.8349593 -0.0707243 0.0058134 0.8349593 -0.0920441 0.0058134 0.8349593 -0.1190164 0.0058134 0.8349593 -0.1531399 0.0058134 0.8349593 -0.1963105 0.0058134 0.8349593 -0.2509269 0.0058134 0.8349593 -0.3200238 0.0058134 0.8349593 -0.4074404 0.0058134 0.8349593 -0.5180338 0.0058134 0.8349593 -0.6579487 0.0058134 0.8349593 -0.8349593 0.0058134 0.8349593 -0.9012461 0.0278105 0.715508 -0.9345187 0.0619734 0.6033278 -0.9540886 0.1053433 0.5205664 -0.966685 0.1565315 0.4692147 -0.9752692 0.2144168 0.4461809 -0.9813491 0.2777122 0.4469282 -0.9857738 0.3448353 0.4665561 -0.9890579 0.4139373 0.5002052 -0.9915312 0.4830346 0.5432889 -0.9934145 0.5501939 0.5916877 -0.9948604 0.6137183 0.6419122 -0.9959777 0.6722907 0.6912113 -0.9968453 0.7250473 0.7376024 -0.9975217 0.7715762 0.7798244 -0.9980504 0.8118589 0.8172307 -0.9984648 0.8461791 0.8496515 -0.9987902 0.8750225 0.877253 -0.9990459 0.8989863 0.9004115 -0.9992473 0.9187068 0.9196135 -0.9994059 0.9348083 0.9353832 -0.9995309 0.947871 0.9482343 -0.9996296 0.9584132 0.9586423 -0.9997074 0.9668855 0.9670298 -0.9997689 0.9736715 0.9737621 -0.9998174 0.979092 0.9791489 -0.9998557 0.9834125 0.9834482 -0.999886 0.9868502 0.9868726 -0.9999099 0.9895818 0.9895958 -0.9999288 0.99175 0.9917587 -0.9999437 0.9934694 0.9934749 -0.0051514 0.0227443 0.8407292 -0.0051286 0.0222366 0.8405071 -0.0051047 0.0215989 0.8402274 -0.0050826 0.0207992 0.8398756 -0.0050676 0.0197991 0.8394338 -0.0050694 0.0185525 0.8388802 -0.0051048 0.0170051 0.8381886 -0.0052028 0.0150955 0.8373283 -0.0054121 0.012757 0.8362644 -0.0058134 0.0099234 0.8349593 -0.0065402 0.0065402 0.8333779 -0.0117512 0.0065402 0.8333779 -0.0183437 0.0065402 0.8333779 -0.0266842 0.0065402 0.8333779 -0.0372359 0.0065402 0.8333779 -0.0505853 0.0065402 0.8333779 -0.0674739 0.0065402 0.8333779 -0.0888403 0.0065402 0.8333779 -0.1158715 0.0065402 0.8333779 -0.1500694 0.0065402 0.8333779 -0.1933343 0.0065402 0.8333779 -0.2480701 0.0065402 0.8333779 -0.3173179 0.0065402 0.8333779 -0.4049254 0.0065402 0.8333779 -0.5157602 0.0065402 0.8333779 -0.6559807 0.0065402 0.8333779 -0.8333779 0.0065402 0.8333779 -0.900682 0.0282324 0.7144267 -0.9342712 0.062202 0.6022399 -0.9539671 0.1054431 0.5195043 -0.9666211 0.1565473 0.4682463 -0.975234 0.2143816 0.4453457 -0.9813291 0.2776503 0.4462385 -0.9857621 0.3447636 0.4660065 -0.989051 0.4138668 0.4997805 -0.9915271 0.4829718 0.5429696 -0.993412 0.5501416 0.5914535 -0.9948589 0.6136769 0.6417443 -0.9959768 0.6722594 0.6910933 -0.9968448 0.7250244 0.7375211 -0.9975213 0.7715599 0.7797693 -0.9980502 0.8118476 0.8171938 -0.9984647 0.8461714 0.8496272 -0.9987901 0.8750173 0.8772371 -0.9990459 0.8989829 0.9004012 -0.9992472 0.9187045 0.9196069 -0.9994059 0.9348069 0.9353789 -0.9995309 0.94787 0.9482316 -0.9996296 0.9584126 0.9586406 -0.9997074 0.9668852 0.9670287 -0.9997689 0.9736712 0.9737614 -0.9998174 0.9790919 0.9791485 -0.9998557 0.9834124 0.9834479 -0.999886 0.9868502 0.9868724 -0.9999099 0.9895818 0.9895957 -0.9999288 0.99175 0.9917587 -0.9999437 0.9934694 0.9934749 -0.0051514 0.0278994 0.8407292 -0.0051286 0.0273936 0.8405071 -0.0051047 0.0267581 0.8402274 -0.0050826 0.0259613 0.8398756 -0.0050676 0.0249647 0.8394338 -0.0050694 0.0237224 0.8388802 -0.0051048 0.0221804 0.8381886 -0.0052028 0.0202775 0.8373283 -0.0054121 0.017947 0.8362644 -0.0058134 0.015123 0.8349593 -0.0065402 0.0117512 0.8333779 -0.0078103 0.0078103 0.8314967 -0.0144193 0.0078103 0.8314967 -0.0227807 0.0078103 0.8314967 -0.0333589 0.0078103 0.8314967 -0.0467417 0.0078103 0.8314967 -0.0636727 0.0078103 0.8314967 -0.0850926 0.0078103 0.8314967 -0.1121916 0.0078103 0.8314967 -0.1464753 0.0078103 0.8314967 -0.1898486 0.0078103 0.8314967 -0.2447216 0.0078103 0.8314967 -0.314143 0.0078103 0.8314967 -0.4019701 0.0078103 0.8314967 -0.5130828 0.0078103 0.8314967 -0.6536548 0.0078103 0.8314967 -0.8314967 0.0078103 0.8314967 -0.9000167 0.0290732 0.7131566 -0.9339805 0.062742 0.6009658 -0.9538247 0.1057683 0.5182618 -0.9665463 0.1567226 0.4671142 -0.9751928 0.2144566 0.4443699 -0.9813057 0.2776626 0.4454331 -0.9857485 0.3447407 0.465365 -0.989043 0.4138277 0.4992849 -0.9915223 0.4829286 0.5425971 -0.9934091 0.5501012 0.5911804 -0.9948571 0.6136427 0.6415485 -0.9959757 0.6722322 0.6909559 -0.9968441 0.7250039 0.7374264 -0.9975209 0.7715449 0.779705 -0.99805 0.811837 0.8171509 -0.9984645 0.8461641 0.8495988 -0.99879 0.8750124 0.8772186 -0.9990458 0.8989796 0.9003892 -0.9992472 0.9187024 0.9195991 -0.9994059 0.9348055 0.935374 -0.9995309 0.9478691 0.9482285 -0.9996296 0.958412 0.9586386 -0.9997074 0.9668848 0.9670274 -0.9997689 0.973671 0.9737606 -0.9998174 0.9790917 0.979148 -0.9998557 0.9834123 0.9834476 -0.999886 0.9868501 0.9868722 -0.9999099 0.9895818 0.9895956 -0.9999288 0.9917499 0.9917586 -0.9999437 0.9934694 0.9934748 -0.0051514 0.0344214 0.8407292 -0.0051286 0.0339178 0.8405071 -0.0051047 0.0332852 0.8402274 -0.0050826 0.032492 0.8398756 -0.0050676 0.0314998 0.8394338 -0.0050694 0.0302631 0.8388802 -0.0051048 0.0287279 0.8381886 -0.0052028 0.0268333 0.8373283 -0.0054121 0.024513 0.8362644 -0.0058134 0.0217012 0.8349593 -0.0065402 0.0183437 0.8333779 -0.0078103 0.0144193 0.8314967 -0.0099781 0.0099781 0.8293233 -0.0183626 0.0099781 0.8293233 -0.0289702 0.0099781 0.8293233 -0.0423902 0.0099781 0.8293233 -0.0593681 0.0099781 0.8293233 -0.0808475 0.0099781 0.8293233 -0.1080217 0.0099781 0.8293233 -0.1424005 0.0099781 0.8293233 -0.1858943 0.0099781 0.8293233 -0.2409195 0.0099781 0.8293233 -0.3105336 0.0099781 0.8293233 -0.3986045 0.0099781 0.8293233 -0.5100256 0.0099781 0.8293233 -0.6509878 0.0099781 0.8293233 -0.8293233 0.0099781 0.8293233 -0.8992555 0.0306306 0.7117109 -0.9336494 0.0638283 0.5995203 -0.953663 0.1064997 0.5168541 -0.9664615 0.1571937 0.4658326 -0.9751462 0.2147432 0.443266 -0.9812792 0.2778236 0.4445225 -0.9857332 0.3448204 0.4646401 -0.9890339 0.4138582 0.4987251 -0.9915169 0.4829319 0.5421764 -0.9934058 0.5500915 0.590872 -0.9948551 0.6136284 0.6413275 -0.9959745 0.672218 0.6908007 -0.9968433 0.7249916 0.7373194 -0.9975204 0.7715352 0.7796325 -0.9980497 0.8118298 0.8171024 -0.9984643 0.8461589 0.8495668 -0.9987899 0.8750088 0.8771976 -0.9990458 0.8989771 0.9003756 -0.9992472 0.9187008 0.9195904 -0.9994058 0.9348044 0.9353684 -0.9995309 0.9478684 0.9482249 -0.9996296 0.9584115 0.9586363 -0.9997074 0.9668845 0.967026 -0.9997689 0.9736708 0.9737597 -0.9998174 0.9790916 0.9791474 -0.9998557 0.9834122 0.9834472 -0.999886 0.9868501 0.986872 -0.9999099 0.9895817 0.9895955 -0.9999288 0.9917499 0.9917585 -0.9999437 0.9934694 0.9934748 -0.0051514 0.0426726 0.8407292 -0.0051286 0.0421719 0.8405071 -0.0051047 0.0415429 0.8402274 -0.0050826 0.0407541 0.8398756 -0.0050676 0.0397676 0.8394338 -0.0050694 0.0385378 0.8388802 -0.0051048 0.0370113 0.8381886 -0.0052028 0.0351273 0.8373283 -0.0054121 0.0328199 0.8362644 -0.0058134 0.0300235 0.8349593 -0.0065402 0.0266842 0.8333779 -0.0078103 0.0227807 0.8314967 -0.0099781 0.0183626 0.8293233 -0.0136166 0.0136166 0.8269342 -0.024255 0.0136166 0.8269342 -0.037714 0.0136166 0.8269342 -0.0547413 0.0136166 0.8269342 -0.0762831 0.0136166 0.8269342 -0.1035362 0.0136166 0.8269342 -0.138015 0.0136166 0.8269342 -0.1816352 0.0136166 0.8269342 -0.2368203 0.0136166 0.8269342 -0.3066367 0.0136166 0.8269342 -0.3949636 0.0136166 0.8269342 -0.5067085 0.0136166 0.8269342 -0.6480804 0.0136166 0.8269342 -0.8269342 0.0136166 0.8269342 -0.8984278 0.0333932 0.7101477 -0.9332914 0.0658501 0.5979631 -0.9534887 0.1079385 0.5153397 -0.9663702 0.15819 0.4644554 -0.9750962 0.2154135 0.4420805 -0.9812508 0.2782606 0.4435453 -0.9857167 0.3450957 0.4638625 -0.9890241 0.4140252 0.4981248 -0.991511 0.4830292 0.5417255 -0.9934023 0.5501456 0.5905415 -0.994853 0.6136569 0.6410908 -0.9959732 0.672232 0.6906345 -0.9968425 0.7249978 0.7372049 -0.9975199 0.7715376 0.7795549 -0.9980494 0.8118303 0.8170505 -0.9984642 0.8461587 0.8495325 -0.9987897 0.8750084 0.8771752 -0.9990457 0.8989767 0.9003611 -0.9992471 0.9187004 0.9195811 -0.9994058 0.9348042 0.9353624 -0.9995309 0.9478683 0.9482211 -0.9996295 0.9584114 0.9586339 -0.9997074 0.9668844 0.9670245 -0.9997689 0.9736708 0.9737588 -0.9998174 0.9790916 0.9791468 -0.9998557 0.9834122 0.9834468 -0.999886 0.98685 0.9868717 -0.9999099 0.9895817 0.9895953 -0.9999288 0.9917499 0.9917584 -0.9999437 0.9934694 0.9934747 -0.0051514 0.0531113 0.8407292 -0.0051286 0.0526143 0.8405071 -0.0051047 0.0519898 0.8402274 -0.0050826 0.0512068 0.8398756 -0.0050676 0.0502275 0.8394338 -0.0050694 0.0490065 0.8388802 -0.0051048 0.0474909 0.8381886 -0.0052028 0.0456203 0.8373283 -0.0054121 0.0433291 0.8362644 -0.0058134 0.0405522 0.8349593 -0.0065402 0.0372359 0.8333779 -0.0078103 0.0333589 0.8314967 -0.0099781 0.0289702 0.8293233 -0.0136166 0.024255 0.8269342 -0.0196467 0.0196467 0.8245426 -0.0331428 0.0196467 0.8245426 -0.0502171 0.0196467 0.8245426 -0.0718184 0.0196467 0.8245426 -0.0991468 0.0196467 0.8245426 -0.1337208 0.0196467 0.8245426 -0.1774615 0.0196467 0.8245426 -0.232799 0.0196467 0.8245426 -0.3028082 0.0196467 0.8245426 -0.391379 0.0196467 0.8245426 -0.5034325 0.0196467 0.8245426 -0.6451948 0.0196467 0.8245426 -0.8245426 0.0196467 0.8245426 -0.8976087 0.0381561 0.7086095 -0.9329391 0.0694453 0.5964367 -0.9533177 0.1105818 0.5138574 -0.9662809 0.160092 0.4631086 -0.9750472 0.2167545 0.4409223 -0.9812231 0.2791873 0.4425911 -0.9857006 0.3457234 0.4631035 -0.9890146 0.4144423 0.4975392 -0.9915054 0.4833013 0.5412858 -0.9933988 0.5503203 0.5902194 -0.9948509 0.6137675 0.64086 -0.9959719 0.6723012 0.6904726 -0.9968418 0.7250408 0.7370933 -0.9975194 0.7715641 0.7794792 -0.9980491 0.8118466 0.8169999 -0.998464 0.8461687 0.8494991 -0.9987896 0.8750145 0.8771534 -0.9990456 0.8989805 0.9003469 -0.9992471 0.9187027 0.919572 -0.9994058 0.9348056 0.9353566 -0.9995309 0.9478691 0.9482174 -0.9996295 0.958412 0.9586316 -0.9997074 0.9668847 0.967023 -0.9997688 0.973671 0.9737578 -0.9998174 0.9790917 0.9791462 -0.9998557 0.9834123 0.9834465 -0.999886 0.9868501 0.9868715 -0.9999099 0.9895817 0.9895952 -0.9999288 0.9917499 0.9917583 -0.9999437 0.9934694 0.9934746 -0.0051514 0.0663177 0.8407292 -0.0051286 0.0658253 0.8405071 -0.0051047 0.0652066 0.8402274 -0.0050826 0.0644309 0.8398756 -0.0050676 0.0634605 0.8394338 -0.0050694 0.0622508 0.8388802 -0.0051048 0.060749 0.8381886 -0.0052028 0.0588953 0.8373283 -0.0054121 0.0566247 0.8362644 -0.0058134 0.0538725 0.8349593 -0.0065402 0.0505853 0.8333779 -0.0078103 0.0467417 0.8314967 -0.0099781 0.0423902 0.8293233 -0.0136166 0.037714 0.8269342 -0.0196467 0.0331428 0.8245426 -0.0295373 0.0295373 0.8226154 -0.0466479 0.0295373 0.8226154 -0.068295 0.0295373 0.8226154 -0.0956813 0.0295373 0.8226154 -0.1303287 0.0295373 0.8226154 -0.174162 0.0295373 0.8226154 -0.229617 0.0295373 0.8226154 -0.2997746 0.0295373 0.8226154 -0.3885332 0.0295373 0.8226154 -0.5008244 0.0295373 0.8226154 -0.6428873 0.0295373 0.8226154 -0.8226154 0.0295373 0.8226154 -0.8969554 0.0461985 0.7073888 -0.9326595 0.0756464 0.5952297 -0.9531823 0.1152388 0.5126866 -0.9662104 0.1635226 0.4620458 -0.9750086 0.2192389 0.4400089 -0.9812013 0.2809573 0.441839 -0.9856879 0.3469645 0.4625057 -0.9890072 0.4152991 0.4970781 -0.9915009 0.4838841 0.5409396 -0.9933961 0.5507113 0.5899658 -0.9948493 0.6140266 0.6406784 -0.9959709 0.6724711 0.6903451 -0.9968411 0.7251511 0.7370055 -0.9975191 0.7716352 0.7794197 -0.9980488 0.8118921 0.8169601 -0.9984638 0.8461977 0.8494728 -0.9987895 0.8750329 0.8771362 -0.9990456 0.8989921 0.9003358 -0.999247 0.9187101 0.9195648 -0.9994057 0.9348102 0.935352 -0.9995309 0.947872 0.9482145 -0.9996295 0.9584138 0.9586297 -0.9997074 0.9668859 0.9670218 -0.9997688 0.9736717 0.9737571 -0.9998174 0.9790921 0.9791457 -0.9998557 0.9834126 0.9834462 -0.999886 0.9868503 0.9868713 -0.9999099 0.9895819 0.989595 -0.9999288 0.99175 0.9917583 -0.9999437 0.9934694 0.9934746 -0.0051514 0.0830256 0.8407292 -0.0051286 0.082539 0.8405071 -0.0051047 0.0819276 0.8402274 -0.0050826 0.081161 0.8398756 -0.0050676 0.080202 0.8394338 -0.0050694 0.0790064 0.8388802 -0.0051048 0.0775221 0.8381886 -0.0052028 0.0756899 0.8373283 -0.0054121 0.0734453 0.8362644 -0.0058134 0.0707243 0.8349593 -0.0065402 0.0674739 0.8333779 -0.0078103 0.0636727 0.8314967 -0.0099781 0.0593681 0.8293233 -0.0136166 0.0547413 0.8269342 -0.0196467 0.0502171 0.8245426 -0.0295373 0.0466479 0.8226154 -0.0455041 0.0455041 0.8219901 -0.0671656 0.0455041 0.8219901 -0.0945703 0.0455041 0.8219901 -0.1292408 0.0455041 0.8219901 -0.1731034 0.0455041 0.8219901 -0.2285954 0.0455041 0.8219901 -0.2988 0.0455041 0.8219901 -0.3876179 0.0455041 0.8219901 -0.4999841 0.0455041 0.8219901 -0.6421419 0.0455041 0.8219901 -0.8219901 0.0455041 0.8219901 -0.8967447 0.0594506 0.7069963 -0.9325696 0.0860209 0.5948423 -0.9531389 0.1231452 0.5123112 -0.9661878 0.1694384 0.4617052 -0.9749962 0.2235962 0.4397163 -0.9811943 0.2841192 0.4415982 -0.9856839 0.3492254 0.4623142 -0.9890048 0.4168922 0.4969305 -0.9914995 0.4849907 0.5408288 -0.9933953 0.5514695 0.5898847 -0.9948487 0.6145393 0.6406203 -0.9959706 0.6728136 0.6903044 -0.9968409 0.7253775 0.7369774 -0.9975189 0.7717834 0.7794007 -0.9980488 0.8119884 0.8169474 -0.9984638 0.8462598 0.8494644 -0.9987895 0.8750727 0.8771307 -0.9990455 0.8990175 0.9003323 -0.999247 0.9187262 0.9195625 -0.9994057 0.9348204 0.9353505 -0.9995308 0.9478785 0.9482135 -0.9996295 0.9584178 0.9586291 -0.9997074 0.9668884 0.9670214 -0.9997688 0.9736733 0.9737569 -0.9998174 0.9790931 0.9791456 -0.9998557 0.9834132 0.9834461 -0.999886 0.9868507 0.9868713 -0.9999099 0.9895821 0.989595 -0.9999288 0.9917502 0.9917582 -0.9999437 0.9934695 0.9934746 -0.0051514 0.1041632 0.8407292 -0.0051286 0.1036839 0.8405071 -0.0051047 0.1030818 0.8402274 -0.0050826 0.1023268 0.8398756 -0.0050676 0.1013822 0.8394338 -0.0050694 0.1002045 0.8388802 -0.0051048 0.0987424 0.8381886 -0.0052028 0.0969372 0.8373283 -0.0054121 0.0947256 0.8362644 -0.0058134 0.0920441 0.8349593 -0.0065402 0.0888403 0.8333779 -0.0078103 0.0850926 0.8314967 -0.0099781 0.0808475 0.8293233 -0.0136166 0.0762831 0.8269342 -0.0196467 0.0718184 0.8245426 -0.0295373 0.068295 0.8226154 -0.0455041 0.0671656 0.8219901 -0.0671656 0.0671656 0.8219901 -0.0945703 0.0671656 0.8219901 -0.1292408 0.0671656 0.8219901 -0.1731034 0.0671656 0.8219901 -0.2285954 0.0671656 0.8219901 -0.2988 0.0671656 0.8219901 -0.3876179 0.0671656 0.8219901 -0.4999841 0.0671656 0.8219901 -0.6421419 0.0671656 0.8219901 -0.8219901 0.0671656 0.8219901 -0.8967447 0.0775151 0.7069963 -0.9325696 0.1002154 0.5948423 -0.9531389 0.1340017 0.5123112 -0.9661878 0.1775917 0.4617052 -0.9749962 0.2296253 0.4397163 -0.9811943 0.2885124 0.4415982 -0.9856839 0.3523802 0.4623142 -0.9890048 0.419125 0.4969305 -0.9914995 0.4865484 0.5408288 -0.9933953 0.5525411 0.5898847 -0.9948487 0.6152669 0.6406203 -0.9959706 0.6733015 0.6903044 -0.9968409 0.7257011 0.7369774 -0.9975189 0.7719959 0.7794007 -0.9980488 0.8121268 0.8169474 -0.9984638 0.8463492 0.8494644 -0.9987895 0.8751301 0.8771307 -0.9990455 0.8990542 0.9003323 -0.999247 0.9187495 0.9195625 -0.9994057 0.9348352 0.9353505 -0.9995308 0.9478878 0.9482135 -0.9996295 0.9584237 0.9586291 -0.9997074 0.9668922 0.9670214 -0.9997688 0.9736756 0.9737569 -0.9998174 0.9790946 0.9791456 -0.9998557 0.9834141 0.9834461 -0.999886 0.9868512 0.9868713 -0.9999099 0.9895825 0.989595 -0.9999288 0.9917504 0.9917582 -0.9999437 0.9934697 0.9934746 -0.0051514 0.1309049 0.8407292 -0.0051286 0.1304351 0.8405071 -0.0051047 0.1298447 0.8402274 -0.0050826 0.1291042 0.8398756 -0.0050676 0.128178 0.8394338 -0.0050694 0.1270229 0.8388802 -0.0051048 0.1255887 0.8381886 -0.0052028 0.1238179 0.8373283 -0.0054121 0.1216479 0.8362644 -0.0058134 0.1190164 0.8349593 -0.0065402 0.1158715 0.8333779 -0.0078103 0.1121916 0.8314967 -0.0099781 0.1080217 0.8293233 -0.0136166 0.1035362 0.8269342 -0.0196467 0.0991468 0.8245426 -0.0295373 0.0956813 0.8226154 -0.0455041 0.0945703 0.8219901 -0.0671656 0.0945703 0.8219901 -0.0945703 0.0945703 0.8219901 -0.1292408 0.0945703 0.8219901 -0.1731034 0.0945703 0.8219901 -0.2285954 0.0945703 0.8219901 -0.2988 0.0945703 0.8219901 -0.3876179 0.0945703 0.8219901 -0.4999841 0.0945703 0.8219901 -0.6421419 0.0945703 0.8219901 -0.8219901 0.0945703 0.8219901 -0.8967447 0.1003691 0.7069963 -0.9325696 0.1181733 0.5948423 -0.9531389 0.1477366 0.5123112 -0.9661878 0.1879067 0.4617052 -0.9749962 0.2372529 0.4397163 -0.9811943 0.2940703 0.4415982 -0.9856839 0.3563715 0.4623142 -0.9890048 0.4219498 0.4969305 -0.9914995 0.4885191 0.5408288 -0.9933953 0.5538969 0.5898847 -0.9948487 0.6161874 0.6406203 -0.9959706 0.6739188 0.6903044 -0.9968409 0.7261105 0.7369774 -0.9975189 0.7722648 0.7794007 -0.9980488 0.8123018 0.8169474 -0.9984638 0.8464623 0.8494644 -0.9987895 0.8752028 0.8771307 -0.9990455 0.8991006 0.9003323 -0.999247 0.9187791 0.9195625 -0.9994057 0.9348539 0.9353505 -0.9995308 0.9478997 0.9482135 -0.9996295 0.9584312 0.9586291 -0.9997074 0.9668969 0.9670214 -0.9997688 0.9736786 0.9737569 -0.9998174 0.9790965 0.9791456 -0.9998557 0.9834153 0.9834461 -0.999886 0.986852 0.9868713 -0.9999099 0.9895829 0.989595 -0.9999288 0.9917507 0.9917582 -0.9999437 0.9934698 0.9934746 -0.0051514 0.1647368 0.8407292 -0.0051286 0.1642787 0.8405071 -0.0051047 0.1637031 0.8402274 -0.0050826 0.1629812 0.8398756 -0.0050676 0.162078 0.8394338 -0.0050694 0.1609516 0.8388802 -0.0051048 0.1595528 0.8381886 -0.0052028 0.1578254 0.8373283 -0.0054121 0.1557082 0.8362644 -0.0058134 0.1531399 0.8349593 -0.0065402 0.1500694 0.8333779 -0.0078103 0.1464753 0.8314967 -0.0099781 0.1424005 0.8293233 -0.0136166 0.138015 0.8269342 -0.0196467 0.1337208 0.8245426 -0.0295373 0.1303287 0.8226154 -0.0455041 0.1292408 0.8219901 -0.0671656 0.1292408 0.8219901 -0.0945703 0.1292408 0.8219901 -0.1292408 0.1292408 0.8219901 -0.1731034 0.1292408 0.8219901 -0.2285954 0.1292408 0.8219901 -0.2988 0.1292408 0.8219901 -0.3876179 0.1292408 0.8219901 -0.4999841 0.1292408 0.8219901 -0.6421419 0.1292408 0.8219901 -0.8219901 0.1292408 0.8219901 -0.8967447 0.1292823 0.7069963 -0.9325696 0.1408925 0.5948423 -0.9531389 0.1651131 0.5123112 -0.9661878 0.2009566 0.4617052 -0.9749962 0.2469027 0.4397163 -0.9811943 0.3011018 0.4415982 -0.9856839 0.3614209 0.4623142 -0.9890048 0.4255236 0.4969305 -0.9914995 0.4910123 0.5408288 -0.9933953 0.5556122 0.5898847 -0.9948487 0.6173519 0.6406203 -0.9959706 0.6746998 0.6903044 -0.9968409 0.7266285 0.7369774 -0.9975189 0.7726049 0.7794007 -0.9980488 0.8125232 0.8169474 -0.9984638 0.8466054 0.8494644 -0.9987895 0.8752947 0.8771307 -0.9990455 0.8991593 0.9003323 -0.999247 0.9188164 0.9195625 -0.9994057 0.9348776 0.9353505 -0.9995308 0.9479146 0.9482135 -0.9996295 0.9584406 0.9586291 -0.9997074 0.9669028 0.9670214 -0.9997688 0.9736823 0.9737569 -0.9998174 0.9790988 0.9791456 -0.9998557 0.9834167 0.9834461 -0.999886 0.9868529 0.9868713 -0.9999099 0.9895835 0.989595 -0.9999288 0.991751 0.9917582 -0.9999437 0.9934701 0.9934746 -0.0051514 0.2075384 0.8407292 -0.0051286 0.2070953 0.8405071 -0.0051047 0.2065385 0.8402274 -0.0050826 0.20584 0.8398756 -0.0050676 0.204966 0.8394338 -0.0050694 0.2038759 0.8388802 -0.0051048 0.2025219 0.8381886 -0.0052028 0.2008493 0.8373283 -0.0054121 0.1987988 0.8362644 -0.0058134 0.1963105 0.8349593 -0.0065402 0.1933343 0.8333779 -0.0078103 0.1898486 0.8314967 -0.0099781 0.1858943 0.8293233 -0.0136166 0.1816352 0.8269342 -0.0196467 0.1774615 0.8245426 -0.0295373 0.174162 0.8226154 -0.0455041 0.1731034 0.8219901 -0.0671656 0.1731034 0.8219901 -0.0945703 0.1731034 0.8219901 -0.1292408 0.1731034 0.8219901 -0.1731034 0.1731034 0.8219901 -0.2285954 0.1731034 0.8219901 -0.2988 0.1731034 0.8219901 -0.3876179 0.1731034 0.8219901 -0.4999841 0.1731034 0.8219901 -0.6421419 0.1731034 0.8219901 -0.8219901 0.1731034 0.8219901 -0.8967447 0.1658613 0.7069963 -0.9325696 0.1696351 0.5948423 -0.9531389 0.1870965 0.5123112 -0.9661878 0.2174663 0.4617052 -0.9749962 0.2591111 0.4397163 -0.9811943 0.3099976 0.4415982 -0.9856839 0.3678092 0.4623142 -0.9890048 0.4300448 0.4969305 -0.9914995 0.4941665 0.5408288 -0.9933953 0.5577822 0.5898847 -0.9948487 0.6188252 0.6406203 -0.9959706 0.6756878 0.6903044 -0.9968409 0.7272837 0.7369774 -0.9975189 0.7730352 0.7794007 -0.9980488 0.8128033 0.8169474 -0.9984638 0.8467864 0.8494644 -0.9987895 0.8754109 0.8771307 -0.9990455 0.8992336 0.9003323 -0.999247 0.9188636 0.9195625 -0.9994057 0.9349075 0.9353505 -0.9995308 0.9479335 0.9482135 -0.9996295 0.9584526 0.9586291 -0.9997074 0.9669103 0.9670214 -0.9997688 0.973687 0.9737569 -0.9998174 0.9791018 0.9791456 -0.9998557 0.9834186 0.9834461 -0.999886 0.9868541 0.9868713 -0.9999099 0.9895842 0.989595 -0.9999288 0.9917515 0.9917582 -0.9999437 0.9934704 0.9934746 -0.0051514 0.2616881 0.8407292 -0.0051286 0.2612639 0.8405071 -0.0051047 0.2607307 0.8402274 -0.0050826 0.2600619 0.8398756 -0.0050676 0.2592249 0.8394338 -0.0050694 0.2581807 0.8388802 -0.0051048 0.2568833 0.8381886 -0.0052028 0.2552802 0.8373283 -0.0054121 0.253314 0.8362644 -0.0058134 0.2509269 0.8349593 -0.0065402 0.2480701 0.8333779 -0.0078103 0.2447216 0.8314967 -0.0099781 0.2409195 0.8293233 -0.0136166 0.2368203 0.8269342 -0.0196467 0.232799 0.8245426 -0.0295373 0.229617 0.8226154 -0.0455041 0.2285954 0.8219901 -0.0671656 0.2285954 0.8219901 -0.0945703 0.2285954 0.8219901 -0.1292408 0.2285954 0.8219901 -0.1731034 0.2285954 0.8219901 -0.2285954 0.2285954 0.8219901 -0.2988 0.2285954 0.8219901 -0.3876179 0.2285954 0.8219901 -0.4999841 0.2285954 0.8219901 -0.6421419 0.2285954 0.8219901 -0.8219901 0.2285954 0.8219901 -0.8967447 0.2121385 0.7069963 -0.9325696 0.2059983 0.5948423 -0.9531389 0.2149085 0.5123112 -0.9661878 0.2383533 0.4617052 -0.9749962 0.2745562 0.4397163 -0.9811943 0.3212519 0.4415982 -0.9856839 0.3758911 0.4623142 -0.9890048 0.4357648 0.4969305 -0.9914995 0.498157 0.5408288 -0.9933953 0.5605276 0.5898847 -0.9948487 0.6206891 0.6406203 -0.9959706 0.6769378 0.6903044 -0.9968409 0.7281127 0.7369774 -0.9975189 0.7735795 0.7794007 -0.9980488 0.8131577 0.8169474 -0.9984638 0.8470154 0.8494644 -0.9987895 0.875558 0.8771307 -0.9990455 0.8993275 0.9003323 -0.999247 0.9189234 0.9195625 -0.9994057 0.9349454 0.9353505 -0.9995308 0.9479575 0.9482135 -0.9996295 0.9584677 0.9586291 -0.9997074 0.9669198 0.9670214 -0.9997688 0.973693 0.9737569 -0.9998174 0.9791055 0.9791456 -0.9998557 0.9834209 0.9834461 -0.999886 0.9868555 0.9868713 -0.9999099 0.9895851 0.989595 -0.9999288 0.9917521 0.9917582 -0.9999437 0.9934707 0.9934746 -0.0051514 0.3301945 0.8407292 -0.0051286 0.3297942 0.8405071 -0.0051047 0.329291 0.8402274 -0.0050826 0.3286597 0.8398756 -0.0050676 0.3278694 0.8394338 -0.0050694 0.3268833 0.8388802 -0.0051048 0.3256576 0.8381886 -0.0052028 0.3241424 0.8373283 -0.0054121 0.3222829 0.8362644 -0.0058134 0.3200238 0.8349593 -0.0065402 0.3173179 0.8333779 -0.0078103 0.314143 0.8314967 -0.0099781 0.3105336 0.8293233 -0.0136166 0.3066367 0.8269342 -0.0196467 0.3028082 0.8245426 -0.0295373 0.2997746 0.8226154 -0.0455041 0.2988 0.8219901 -0.0671656 0.2988 0.8219901 -0.0945703 0.2988 0.8219901 -0.1292408 0.2988 0.8219901 -0.1731034 0.2988 0.8219901 -0.2285954 0.2988 0.8219901 -0.2988 0.2988 0.8219901 -0.3876179 0.2988 0.8219901 -0.4999841 0.2988 0.8219901 -0.6421419 0.2988 0.8219901 -0.8219901 0.2988 0.8219901 -0.8967447 0.2706852 0.7069963 -0.9325696 0.2520025 0.5948423 -0.9531389 0.2500942 0.5123112 -0.9661878 0.2647781 0.4617052 -0.9749962 0.2940963 0.4397163 -0.9811943 0.3354901 0.4415982 -0.9856839 0.3861159 0.4623142 -0.9890048 0.4430013 0.4969305 -0.9914995 0.5032055 0.5408288 -0.9933953 0.5640008 0.5898847 -0.9948487 0.6230471 0.6406203 -0.9959706 0.6785192 0.6903044 -0.9968409 0.7291615 0.7369774 -0.9975189 0.7742682 0.7794007 -0.9980488 0.8136061 0.8169474 -0.9984638 0.8473052 0.8494644 -0.9987895 0.8757441 0.8771307 -0.9990455 0.8994464 0.9003323 -0.999247 0.918999 0.9195625 -0.9994057 0.9349933 0.9353505 -0.9995308 0.9479878 0.9482135 -0.9996295 0.9584868 0.9586291 -0.9997074 0.9669318 0.9670214 -0.9997688 0.9737006 0.9737569 -0.9998174 0.9791103 0.9791456 -0.9998557 0.9834239 0.9834461 -0.999886 0.9868574 0.9868713 -0.9999099 0.9895863 0.989595 -0.9999288 0.9917528 0.9917582 -0.9999437 0.9934712 0.9934746 -0.0051514 0.416864 0.8407292 -0.0051286 0.4164939 0.8405071 -0.0051047 0.4160287 0.8402274 -0.0050826 0.4154448 0.8398756 -0.0050676 0.4147137 0.8394338 -0.0050694 0.413801 0.8388802 -0.0051048 0.412666 0.8381886 -0.0052028 0.4112619 0.8373283 -0.0054121 0.4095375 0.8362644 -0.0058134 0.4074404 0.8349593 -0.0065402 0.4049254 0.8333779 -0.0078103 0.4019701 0.8314967 -0.0099781 0.3986045 0.8293233 -0.0136166 0.3949636 0.8269342 -0.0196467 0.391379 0.8245426 -0.0295373 0.3885332 0.8226154 -0.0455041 0.3876179 0.8219901 -0.0671656 0.3876179 0.8219901 -0.0945703 0.3876179 0.8219901 -0.1292408 0.3876179 0.8219901 -0.1731034 0.3876179 0.8219901 -0.2285954 0.3876179 0.8219901 -0.2988 0.3876179 0.8219901 -0.3876179 0.3876179 0.8219901 -0.4999841 0.3876179 0.8219901 -0.6421419 0.3876179 0.8219901 -0.8219901 0.3876179 0.8219901 -0.8967447 0.3447543 0.7069963 -0.9325696 0.3102037 0.5948423 -0.9531389 0.2946088 0.5123112 -0.9661878 0.2982089 0.4617052 -0.9749962 0.3188171 0.4397163 -0.9811943 0.3535032 0.4415982 -0.9856839 0.3990515 0.4623142 -0.9890048 0.4521565 0.4969305 -0.9914995 0.5095925 0.5408288 -0.9933953 0.5683949 0.5898847 -0.9948487 0.6260304 0.6406203 -0.9959706 0.6805199 0.6903044 -0.9968409 0.7304884 0.7369774 -0.9975189 0.7751395 0.7794007 -0.9980488 0.8141733 0.8169474 -0.9984638 0.8476717 0.8494644 -0.9987895 0.8759795 0.8771307 -0.9990455 0.8995968 0.9003323 -0.999247 0.9190947 0.9195625 -0.9994057 0.935054 0.9353505 -0.9995308 0.9480261 0.9482135 -0.9996295 0.9585109 0.9586291 -0.9997074 0.966947 0.9670214 -0.9997688 0.9737101 0.9737569 -0.9998174 0.9791163 0.9791456 -0.9998557 0.9834277 0.9834461 -0.999886 0.9868597 0.9868713 -0.9999099 0.9895878 0.989595 -0.9999288 0.9917537 0.9917582 -0.9999437 0.9934718 0.9934746 -0.0051514 0.5265122 0.8407292 -0.0051286 0.5261804 0.8405071 -0.0051047 0.5257632 0.8402274 -0.0050826 0.5252393 0.8398756 -0.0050676 0.524583 0.8394338 -0.0050694 0.5237632 0.8388802 -0.0051048 0.5227429 0.8381886 -0.0052028 0.5214795 0.8373283 -0.0054121 0.519926 0.8362644 -0.0058134 0.5180338 0.8349593 -0.0065402 0.5157602 0.8333779 -0.0078103 0.5130828 0.8314967 -0.0099781 0.5100256 0.8293233 -0.0136166 0.5067085 0.8269342 -0.0196467 0.5034325 0.8245426 -0.0295373 0.5008244 0.8226154 -0.0455041 0.4999841 0.8219901 -0.0671656 0.4999841 0.8219901 -0.0945703 0.4999841 0.8219901 -0.1292408 0.4999841 0.8219901 -0.1731034 0.4999841 0.8219901 -0.2285954 0.4999841 0.8219901 -0.2988 0.4999841 0.8219901 -0.3876179 0.4999841 0.8219901 -0.4999841 0.4999841 0.8219901 -0.6421419 0.4999841 0.8219901 -0.8219901 0.4999841 0.8219901 -0.8967447 0.4384614 0.7069963 -0.9325696 0.3838358 0.5948423 -0.9531389 0.3509254 0.5123112 -0.9661878 0.3405032 0.4617052 -0.9749962 0.3500921 0.4397163 -0.9811943 0.3762922 0.4415982 -0.9856839 0.4154167 0.4623142 -0.9890048 0.4637389 0.4969305 -0.9914995 0.5176729 0.5408288 -0.9933953 0.573954 0.5898847 -0.9948487 0.6298046 0.6406203 -0.9959706 0.683051 0.6903044 -0.9968409 0.732167 0.7369774 -0.9975189 0.7762418 0.7794007 -0.9980488 0.8148909 0.8169474 -0.9984638 0.8481355 0.8494644 -0.9987895 0.8762773 0.8771307 -0.9990455 0.899787 0.9003323 -0.999247 0.9192157 0.9195625 -0.9994057 0.9351307 0.9353505 -0.9995308 0.9480746 0.9482135 -0.9996295 0.9585415 0.9586291 -0.9997074 0.9669663 0.9670214 -0.9997688 0.9737222 0.9737569 -0.9998174 0.9791238 0.9791456 -0.9998557 0.9834324 0.9834461 -0.999886 0.9868627 0.9868713 -0.9999099 0.9895897 0.989595 -0.9999288 0.9917549 0.9917582 -0.9999437 0.9934725 0.9934746 -0.0051514 0.6652314 0.8407292 -0.0051286 0.664948 0.8405071 -0.0051047 0.6645915 0.8402274 -0.0050826 0.6641436 0.8398756 -0.0050676 0.663582 0.8394338 -0.0050694 0.6628797 0.8388802 -0.0051048 0.6620045 0.8381886 -0.0052028 0.6609191 0.8373283 -0.0054121 0.6595817 0.8362644 -0.0058134 0.6579487 0.8349593 -0.0065402 0.6559807 0.8333779 -0.0078103 0.6536548 0.8314967 -0.0099781 0.6509878 0.8293233 -0.0136166 0.6480804 0.8269342 -0.0196467 0.6451948 0.8245426 -0.0295373 0.6428873 0.8226154 -0.0455041 0.6421419 0.8219901 -0.0671656 0.6421419 0.8219901 -0.0945703 0.6421419 0.8219901 -0.1292408 0.6421419 0.8219901 -0.1731034 0.6421419 0.8219901 -0.2285954 0.6421419 0.8219901 -0.2988 0.6421419 0.8219901 -0.3876179 0.6421419 0.8219901 -0.4999841 0.6421419 0.8219901 -0.6421419 0.6421419 0.8219901 -0.8219901 0.6421419 0.8219901 -0.8967447 0.557013 0.7069963 -0.9325696 0.4769901 0.5948423 -0.9531389 0.4221733 0.5123112 -0.9661878 0.3940109 0.4617052 -0.9749962 0.389659 0.4397163 -0.9811943 0.4051232 0.4415982 -0.9856839 0.4361208 0.4623142 -0.9890048 0.4783922 0.4969305 -0.9914995 0.5278957 0.5408288 -0.9933953 0.580987 0.5898847 -0.9948487 0.6345795 0.6406203 -0.9959706 0.6862532 0.6903044 -0.9968409 0.7342907 0.7369774 -0.9975189 0.7776364 0.7794007 -0.9980488 0.8157988 0.8169474 -0.9984638 0.8487222 0.8494644 -0.9987895 0.8766541 0.8771307 -0.9990455 0.9000277 0.9003323 -0.999247 0.9193688 0.9195625 -0.9994057 0.9352277 0.9353505 -0.9995308 0.9481359 0.9482135 -0.9996295 0.9585802 0.9586291 -0.9997074 0.9669906 0.9670214 -0.9997688 0.9737375 0.9737569 -0.9998174 0.9791334 0.9791456 -0.9998557 0.9834385 0.9834461 -0.999886 0.9868665 0.9868713 -0.9999099 0.989592 0.989595 -0.9999288 0.9917564 0.9917582 -0.9999437 0.9934734 0.9934746 -0.0051514 0.8407292 0.8407292 -0.0051286 0.8405071 0.8405071 -0.0051047 0.8402274 0.8402274 -0.0050826 0.8398756 0.8398756 -0.0050676 0.8394338 0.8394338 -0.0050694 0.8388802 0.8388802 -0.0051048 0.8381886 0.8381886 -0.0052028 0.8373283 0.8373283 -0.0054121 0.8362644 0.8362644 -0.0058134 0.8349593 0.8349593 -0.0065402 0.8333779 0.8333779 -0.0078103 0.8314967 0.8314967 -0.0099781 0.8293233 0.8293233 -0.0136166 0.8269342 0.8269342 -0.0196467 0.8245426 0.8245426 -0.0295373 0.8226154 0.8226154 -0.0455041 0.8219901 0.8219901 -0.0671656 0.8219901 0.8219901 -0.0945703 0.8219901 0.8219901 -0.1292408 0.8219901 0.8219901 -0.1731034 0.8219901 0.8219901 -0.2285954 0.8219901 0.8219901 -0.2988 0.8219901 0.8219901 -0.3876179 0.8219901 0.8219901 -0.4999841 0.8219901 0.8219901 -0.6421419 0.8219901 0.8219901 -0.8219901 0.8219901 0.8219901 -0.8967447 0.7069963 0.7069963 -0.9325696 0.5948423 0.5948423 -0.9531389 0.5123112 0.5123112 -0.9661878 0.4617052 0.4617052 -0.9749962 0.4397163 0.4397163 -0.9811943 0.4415982 0.4415982 -0.9856839 0.4623142 0.4623142 -0.9890048 0.4969305 0.4969305 -0.9914995 0.5408288 0.5408288 -0.9933953 0.5898847 0.5898847 -0.9948487 0.6406203 0.6406203 -0.9959706 0.6903044 0.6903044 -0.9968409 0.7369774 0.7369774 -0.9975189 0.7794007 0.7794007 -0.9980488 0.8169474 0.8169474 -0.9984638 0.8494644 0.8494644 -0.9987895 0.8771307 0.8771307 -0.9990455 0.9003323 0.9003323 -0.999247 0.9195625 0.9195625 -0.9994057 0.9353505 0.9353505 -0.9995308 0.9482135 0.9482135 -0.9996295 0.9586291 0.9586291 -0.9997074 0.9670214 0.9670214 -0.9997688 0.9737569 0.9737569 -0.9998174 0.9791456 0.9791456 -0.9998557 0.9834461 0.9834461 -0.999886 0.9868713 0.9868713 -0.9999099 0.989595 0.989595 -0.9999288 0.9917582 0.9917582 -0.9999437 0.9934746 0.9934746 -0.0279321 0.9033413 0.7195629 -0.0278872 0.9032596 0.7194036 -0.0278347 0.9031567 0.7192033 -0.0277752 0.9030276 0.7189519 -0.0277111 0.9028657 0.7186372 -0.0276479 0.9026634 0.7182443 -0.0275966 0.9024114 0.7177558 -0.0275778 0.9020992 0.7171517 -0.0276281 0.9017148 0.7164099 -0.0278105 0.9012461 0.715508 -0.0282324 0.900682 0.7144267 -0.0290732 0.9000167 0.7131566 -0.0306306 0.8992555 0.7117109 -0.0333932 0.8984278 0.7101477 -0.0381561 0.8976087 0.7086095 -0.0461985 0.8969554 0.7073888 -0.0594506 0.8967447 0.7069963 -0.0775151 0.8967447 0.7069963 -0.1003691 0.8967447 0.7069963 -0.1292823 0.8967447 0.7069963 -0.1658613 0.8967447 0.7069963 -0.2121385 0.8967447 0.7069963 -0.2706852 0.8967447 0.7069963 -0.3447543 0.8967447 0.7069963 -0.4384614 0.8967447 0.7069963 -0.557013 0.8967447 0.7069963 -0.7069963 0.8967447 0.7069963 -0.8967447 0.8967447 0.7069963 -0.9325696 0.7439407 0.5948423 -0.9531389 0.6263473 0.5123112 -0.9661878 0.5473473 0.4617052 -0.9749962 0.5030453 0.4397163 -0.9811943 0.4877437 0.4415982 -0.9856839 0.4954523 0.4623142 -0.9890048 0.5203839 0.4969305 -0.9914995 0.5571908 0.5408288 -0.9933953 0.6011414 0.5898847 -0.9948487 0.6482627 0.6406203 -0.9959706 0.6954296 0.6903044 -0.9968409 0.7403765 0.7369774 -0.9975189 0.7816327 0.7794007 -0.9980488 0.8184005 0.8169474 -0.9984638 0.8504035 0.8494644 -0.9987895 0.8777338 0.8771307 -0.9990455 0.9007175 0.9003323 -0.999247 0.9198076 0.9195625 -0.9994057 0.9355059 0.9353505 -0.9995308 0.9483117 0.9482135 -0.9996295 0.958691 0.9586291 -0.9997074 0.9670604 0.9670214 -0.9997688 0.9737814 0.9737569 -0.9998174 0.979161 0.9791456 -0.9998557 0.9834557 0.9834461 -0.999886 0.9868773 0.9868713 -0.9999099 0.9895988 0.989595 -0.9999288 0.9917606 0.9917582 -0.9999437 0.9934761 0.9934746 -0.0624569 0.9354466 0.6074336 -0.0624063 0.9354101 0.6072715 -0.0623458 0.9353643 0.6070678 -0.0622749 0.9353068 0.6068123 -0.0621943 0.9352348 0.6064926 -0.0621069 0.9351449 0.6060939 -0.0620199 0.9350332 0.6055988 -0.0619473 0.9348949 0.6049872 -0.061916 0.9347252 0.6042375 -0.0619734 0.9345187 0.6033278 -0.062202 0.9342712 0.6022399 -0.062742 0.9339805 0.6009658 -0.0638283 0.9336494 0.5995203 -0.0658501 0.9332914 0.5979631 -0.0694453 0.9329391 0.5964367 -0.0756464 0.9326595 0.5952297 -0.0860209 0.9325696 0.5948423 -0.1002154 0.9325696 0.5948423 -0.1181733 0.9325696 0.5948423 -0.1408925 0.9325696 0.5948423 -0.1696351 0.9325696 0.5948423 -0.2059983 0.9325696 0.5948423 -0.2520025 0.9325696 0.5948423 -0.3102037 0.9325696 0.5948423 -0.3838358 0.9325696 0.5948423 -0.4769901 0.9325696 0.5948423 -0.5948423 0.9325696 0.5948423 -0.7439407 0.9325696 0.5948423 -0.9325696 0.9325696 0.5948423 -0.9531389 0.7706179 0.5123112 -0.9661878 0.6556956 0.4617052 -0.9749962 0.5831647 0.4397163 -0.9811943 0.5461239 0.4415982 -0.9856839 0.5373763 0.4623142 -0.9890048 0.5500554 0.4969305 -0.9914995 0.577891 0.5408288 -0.9933953 0.6153825 0.5898847 -0.9948487 0.6579314 0.6406203 -0.9959706 0.7019138 0.6903044 -0.9968409 0.7446768 0.7369774 -0.9975189 0.7844566 0.7794007 -0.9980488 0.8202389 0.8169474 -0.9984638 0.8515915 0.8494644 -0.9987895 0.8784967 0.8771307 -0.9990455 0.9012049 0.9003323 -0.999247 0.9201176 0.9195625 -0.9994057 0.9357024 0.9353505 -0.9995308 0.9484359 0.9482135 -0.9996295 0.9587693 0.9586291 -0.9997074 0.9671097 0.9670214 -0.9997688 0.9738123 0.9737569 -0.9998174 0.9791804 0.9791456 -0.9998557 0.9834679 0.9834461 -0.999886 0.986885 0.9868713 -0.9999099 0.9896036 0.989595 -0.9999288 0.9917636 0.9917582 -0.9999437 0.9934779 0.9934746 -0.1059991 0.9545467 0.5245844 -0.1059489 0.9545286 0.5244254 -0.1058883 0.9545059 0.5242258 -0.1058162 0.9544774 0.5239754 -0.1057322 0.9544418 0.5236622 -0.1056375 0.9543974 0.5232717 -0.1055364 0.9543421 0.5227869 -0.1054384 0.9542739 0.5221884 -0.1053624 0.9541902 0.5214553 -0.1053433 0.9540886 0.5205664 -0.1054431 0.9539671 0.5195043 -0.1057683 0.9538247 0.5182618 -0.1064997 0.953663 0.5168541 -0.1079385 0.9534887 0.5153397 -0.1105818 0.9533177 0.5138574 -0.1152388 0.9531823 0.5126866 -0.1231452 0.9531389 0.5123112 -0.1340017 0.9531389 0.5123112 -0.1477366 0.9531389 0.5123112 -0.1651131 0.9531389 0.5123112 -0.1870965 0.9531389 0.5123112 -0.2149085 0.9531389 0.5123112 -0.2500942 0.9531389 0.5123112 -0.2946088 0.9531389 0.5123112 -0.3509254 0.9531389 0.5123112 -0.4221733 0.9531389 0.5123112 -0.5123112 0.9531389 0.5123112 -0.6263473 0.9531389 0.5123112 -0.7706179 0.9531389 0.5123112 -0.9531389 0.9531389 0.5123112 -0.9661878 0.7927704 0.4617052 -0.9749962 0.6845262 0.4397163 -0.9811943 0.6199824 0.4415982 -0.9856839 0.5904156 0.4623142 -0.9890048 0.5875938 0.4969305 -0.9914995 0.6040793 0.5408288 -0.9933953 0.6333995 0.5898847 -0.9948487 0.6701635 0.6406203 -0.9959706 0.710117 0.6903044 -0.9968409 0.7501172 0.7369774 -0.9975189 0.7880291 0.7794007 -0.9980488 0.8225647 0.8169474 -0.9984638 0.8530945 0.8494644 -0.9987895 0.8794619 0.8771307 -0.9990455 0.9018215 0.9003323 -0.999247 0.9205098 0.9195625 -0.9994057 0.935951 0.9353505 -0.9995308 0.9485931 0.9482135 -0.9996295 0.9588684 0.9586291 -0.9997074 0.967172 0.9670214 -0.9997688 0.9738515 0.9737569 -0.9998174 0.979205 0.9791456 -0.9998557 0.9834833 0.9834461 -0.999886 0.9868946 0.9868713 -0.9999099 0.9896096 0.989595 -0.9999288 0.9917674 0.9917582 -0.9999437 0.9934803 0.9934746 -0.1572498 0.9669269 0.4728847 -0.1572031 0.9669173 0.4727393 -0.1571463 0.9669053 0.4725567 -0.1570779 0.9668902 0.4723278 -0.1569971 0.9668714 0.4720415 -0.156904 0.9668479 0.4716846 -0.1568008 0.9668187 0.4712417 -0.1566936 0.9667827 0.4706951 -0.1565954 0.9667385 0.4700258 -0.1565315 0.966685 0.4692147 -0.1565473 0.9666211 0.4682463 -0.1567226 0.9665463 0.4671142 -0.1571937 0.9664615 0.4658326 -0.15819 0.9663702 0.4644554 -0.160092 0.9662809 0.4631086 -0.1635226 0.9662104 0.4620458 -0.1694384 0.9661878 0.4617052 -0.1775917 0.9661878 0.4617052 -0.1879067 0.9661878 0.4617052 -0.2009566 0.9661878 0.4617052 -0.2174663 0.9661878 0.4617052 -0.2383533 0.9661878 0.4617052 -0.2647781 0.9661878 0.4617052 -0.2982089 0.9661878 0.4617052 -0.3405032 0.9661878 0.4617052 -0.3940109 0.9661878 0.4617052 -0.4617052 0.9661878 0.4617052 -0.5473473 0.9661878 0.4617052 -0.6556956 0.9661878 0.4617052 -0.7927704 0.9661878 0.4617052 -0.9661878 0.9661878 0.4617052 -0.9749962 0.8127617 0.4397163 -0.9811943 0.713423 0.4415982 -0.9856839 0.6575172 0.4623142 -0.9890048 0.6350848 0.4969305 -0.9914995 0.637211 0.5408288 -0.9933953 0.6561933 0.5898847 -0.9948487 0.6856388 0.6406203 -0.9959706 0.7204952 0.6903044 -0.9968409 0.757 0.7369774 -0.9975189 0.7925488 0.7794007 -0.9980488 0.8255071 0.8169474 -0.9984638 0.8549959 0.8494644 -0.9987895 0.880683 0.8771307 -0.9990455 0.9026016 0.9003323 -0.999247 0.9210061 0.9195625 -0.9994057 0.9362655 0.9353505 -0.9995308 0.9487918 0.9482135 -0.9996295 0.9589938 0.9586291 -0.9997074 0.9672509 0.9670214 -0.9997688 0.9739011 0.9737569 -0.9998174 0.9792361 0.9791456 -0.9998557 0.9835029 0.9834461 -0.999886 0.9869069 0.9868713 -0.9999099 0.9896173 0.989595 -0.9999288 0.9917722 0.9917582 -0.9999437 0.9934833 0.9934746 -0.2151269 0.9754027 0.4493504 -0.2150852 0.9753975 0.4492248 -0.2150342 0.9753908 0.4490669 -0.2149725 0.9753825 0.448869 -0.2148987 0.9753721 0.4486216 -0.2148124 0.9753591 0.4483133 -0.2147144 0.975343 0.4479306 -0.2146085 0.9753231 0.4474586 -0.2145034 0.9752987 0.4468808 -0.2144168 0.9752692 0.4461809 -0.2143816 0.975234 0.4453457 -0.2144566 0.9751928 0.4443699 -0.2147432 0.9751462 0.443266 -0.2154135 0.9750962 0.4420805 -0.2167545 0.9750472 0.4409223 -0.2192389 0.9750086 0.4400089 -0.2235962 0.9749962 0.4397163 -0.2296253 0.9749962 0.4397163 -0.2372529 0.9749962 0.4397163 -0.2469027 0.9749962 0.4397163 -0.2591111 0.9749962 0.4397163 -0.2745562 0.9749962 0.4397163 -0.2940963 0.9749962 0.4397163 -0.3188171 0.9749962 0.4397163 -0.3500921 0.9749962 0.4397163 -0.389659 0.9749962 0.4397163 -0.4397163 0.9749962 0.4397163 -0.5030453 0.9749962 0.4397163 -0.5831647 0.9749962 0.4397163 -0.6845262 0.9749962 0.4397163 -0.8127617 0.9749962 0.4397163 -0.9749962 0.9749962 0.4397163 -0.9811943 0.8316375 0.4415982 -0.9856839 0.7424095 0.4623142 -0.9890048 0.695167 0.4969305 -0.9914995 0.6791269 0.5408288 -0.9933953 0.6850303 0.5898847 -0.9948487 0.7052169 0.6406203 -0.9959706 0.733625 0.6903044 -0.9968409 0.7657077 0.7369774 -0.9975189 0.7982669 0.7794007 -0.9980488 0.8292297 0.8169474 -0.9984638 0.8574015 0.8494644 -0.9987895 0.8822279 0.8771307 -0.9990455 0.9035886 0.9003323 -0.999247 0.9216339 0.9195625 -0.9994057 0.9366635 0.9353505 -0.9995308 0.9490434 0.9482135 -0.9996295 0.9591524 0.9586291 -0.9997074 0.9673508 0.9670214 -0.9997688 0.9739638 0.9737569 -0.9998174 0.9792755 0.9791456 -0.9998557 0.9835276 0.9834461 -0.999886 0.9869223 0.9868713 -0.9999099 0.989627 0.989595 -0.9999288 0.9917782 0.9917582 -0.9999437 0.9934871 0.9934746 -0.2783684 0.9814251 0.4495482 -0.2783325 0.9814221 0.4494442 -0.2782884 0.9814183 0.4493137 -0.2782347 0.9814136 0.44915 -0.2781701 0.9814076 0.4489453 -0.2780936 0.9814002 0.4486903 -0.2780055 0.9813911 0.448374 -0.2779077 0.9813797 0.4479838 -0.2778058 0.9813659 0.4475063 -0.2777122 0.9813491 0.4469282 -0.2776503 0.9813291 0.4462385 -0.2776626 0.9813057 0.4454331 -0.2778236 0.9812792 0.4445225 -0.2782606 0.9812508 0.4435453 -0.2791873 0.9812231 0.4425911 -0.2809573 0.9812013 0.441839 -0.2841192 0.9811943 0.4415982 -0.2885124 0.9811943 0.4415982 -0.2940703 0.9811943 0.4415982 -0.3011018 0.9811943 0.4415982 -0.3099976 0.9811943 0.4415982 -0.3212519 0.9811943 0.4415982 -0.3354901 0.9811943 0.4415982 -0.3535032 0.9811943 0.4415982 -0.3762922 0.9811943 0.4415982 -0.4051232 0.9811943 0.4415982 -0.4415982 0.9811943 0.4415982 -0.4877437 0.9811943 0.4415982 -0.5461239 0.9811943 0.4415982 -0.6199824 0.9811943 0.4415982 -0.713423 0.9811943 0.4415982 -0.8316375 0.9811943 0.4415982 -0.9811943 0.9811943 0.4415982 -0.9856839 0.8498092 0.4623142 -0.9890048 0.7711789 0.4969305 -0.9914995 0.7321559 0.5408288 -0.9933953 0.721513 0.5898847 -0.9948487 0.7299859 0.6406203 -0.9959706 0.7502359 0.6903044 -0.9968409 0.776724 0.7369774 -0.9975189 0.8055009 0.7794007 -0.9980488 0.8339392 0.8169474 -0.9984638 0.8604449 0.8494644 -0.9987895 0.8841823 0.8771307 -0.9990455 0.9048372 0.9003323 -0.999247 0.9224281 0.9195625 -0.9994057 0.9371669 0.9353505 -0.9995308 0.9493615 0.9482135 -0.9996295 0.959353 0.9586291 -0.9997074 0.967477 0.9670214 -0.9997688 0.9740432 0.9737569 -0.9998174 0.9793253 0.9791456 -0.9998557 0.9835588 0.9834461 -0.999886 0.9869419 0.9868713 -0.9999099 0.9896392 0.989595 -0.9999288 0.9917859 0.9917582 -0.9999437 0.9934919 0.9934746 -0.3454107 0.9858181 0.4686457 -0.3453807 0.9858163 0.4685627 -0.3453439 0.9858141 0.4684585 -0.3452987 0.9858113 0.4683279 -0.3452442 0.9858079 0.4681646 -0.3451791 0.9858036 0.4679612 -0.3451032 0.9857982 0.4677088 -0.3450175 0.9857916 0.4673977 -0.3449254 0.9857835 0.467017 -0.3448353 0.9857738 0.4665561 -0.3447636 0.9857621 0.4660065 -0.3447407 0.9857485 0.465365 -0.3448204 0.9857332 0.4646401 -0.3450957 0.9857167 0.4638625 -0.3457234 0.9857006 0.4631035 -0.3469645 0.9856879 0.4625057 -0.3492254 0.9856839 0.4623142 -0.3523802 0.9856839 0.4623142 -0.3563715 0.9856839 0.4623142 -0.3614209 0.9856839 0.4623142 -0.3678092 0.9856839 0.4623142 -0.3758911 0.9856839 0.4623142 -0.3861159 0.9856839 0.4623142 -0.3990515 0.9856839 0.4623142 -0.4154167 0.9856839 0.4623142 -0.4361208 0.9856839 0.4623142 -0.4623142 0.9856839 0.4623142 -0.4954523 0.9856839 0.4623142 -0.5373763 0.9856839 0.4623142 -0.5904156 0.9856839 0.4623142 -0.6575172 0.9856839 0.4623142 -0.7424095 0.9856839 0.4623142 -0.8498092 0.9856839 0.4623142 -0.9856839 0.9856839 0.4623142 -0.9890048 0.8673437 0.4969305 -0.9914995 0.7992446 0.5408288 -0.9933953 0.7676683 0.5898847 -0.9948487 0.7613218 0.6406203 -0.9959706 0.7712508 0.6903044 -0.9968409 0.7906611 0.7369774 -0.9975189 0.8146529 0.7794007 -0.9980488 0.8398974 0.8169474 -0.9984638 0.8642952 0.8494644 -0.9987895 0.886655 0.8771307 -0.9990455 0.9064168 0.9003323 -0.999247 0.9234329 0.9195625 -0.9994057 0.9378038 0.9353505 -0.9995308 0.9497641 0.9482135 -0.9996295 0.9596068 0.9586291 -0.9997074 0.9676368 0.9670214 -0.9997688 0.9741436 0.9737569 -0.9998174 0.9793883 0.9791456 -0.9998557 0.9835983 0.9834461 -0.999886 0.9869667 0.9868713 -0.9999099 0.9896547 0.989595 -0.9999288 0.9917956 0.9917582 -0.9999437 0.993498 0.9934746 -0.4144197 0.9890841 0.5018211 -0.4143955 0.9890831 0.5017569 -0.4143657 0.9890818 0.5016763 -0.414329 0.9890801 0.5015752 -0.4142845 0.9890781 0.5014489 -0.4142311 0.9890755 0.5012915 -0.4141683 0.9890723 0.5010964 -0.4140964 0.9890684 0.5008557 -0.4140176 0.9890637 0.5005614 -0.4139373 0.9890579 0.5002052 -0.4138668 0.989051 0.4997805 -0.4138277 0.989043 0.4992849 -0.4138582 0.9890339 0.4987251 -0.4140252 0.9890241 0.4981248 -0.4144423 0.9890146 0.4975392 -0.4152991 0.9890072 0.4970781 -0.4168922 0.9890048 0.4969305 -0.419125 0.9890048 0.4969305 -0.4219498 0.9890048 0.4969305 -0.4255236 0.9890048 0.4969305 -0.4300448 0.9890048 0.4969305 -0.4357648 0.9890048 0.4969305 -0.4430013 0.9890048 0.4969305 -0.4521565 0.9890048 0.4969305 -0.4637389 0.9890048 0.4969305 -0.4783922 0.9890048 0.4969305 -0.4969305 0.9890048 0.4969305 -0.5203839 0.9890048 0.4969305 -0.5500554 0.9890048 0.4969305 -0.5875938 0.9890048 0.4969305 -0.6350848 0.9890048 0.4969305 -0.695167 0.9890048 0.4969305 -0.7711789 0.9890048 0.4969305 -0.8673437 0.9890048 0.4969305 -0.9890048 0.9890048 0.4969305 -0.9914995 0.8841204 0.5408288 -0.9933953 0.8260608 0.5898847 -0.9948487 0.8009659 0.6406203 -0.9959706 0.7978374 0.6903044 -0.9968409 0.8082934 0.7369774 -0.9975189 0.8262314 0.7794007 -0.9980488 0.8474353 0.8169474 -0.9984638 0.8691663 0.8494644 -0.9987895 0.8897832 0.8771307 -0.9990455 0.9084153 0.9003323 -0.999247 0.9247041 0.9195625 -0.9994057 0.9386096 0.9353505 -0.9995308 0.9502734 0.9482135 -0.9996295 0.959928 0.9586291 -0.9997074 0.9678389 0.9670214 -0.9997688 0.9742706 0.9737569 -0.9998174 0.9794681 0.9791456 -0.9998557 0.9836483 0.9834461 -0.999886 0.986998 0.9868713 -0.9999099 0.9896744 0.989595 -0.9999288 0.9918079 0.9917582 -0.9999437 0.9935057 0.9934746 -0.4834235 0.9915469 0.5445046 -0.4834045 0.9915463 0.5444563 -0.4833811 0.9915455 0.5443956 -0.4833522 0.9915446 0.5443196 -0.4833171 0.9915433 0.5442245 -0.4832747 0.9915418 0.5441061 -0.4832246 0.9915399 0.5439593 -0.4831666 0.9915376 0.5437782 -0.4831021 0.9915347 0.5435568 -0.4830346 0.9915312 0.5432889 -0.4829718 0.9915271 0.5429696 -0.4829286 0.9915223 0.5425971 -0.4829319 0.9915169 0.5421764 -0.4830292 0.991511 0.5417255 -0.4833013 0.9915054 0.5412858 -0.4838841 0.9915009 0.5409396 -0.4849907 0.9914995 0.5408288 -0.4865484 0.9914995 0.5408288 -0.4885191 0.9914995 0.5408288 -0.4910123 0.9914995 0.5408288 -0.4941665 0.9914995 0.5408288 -0.498157 0.9914995 0.5408288 -0.5032055 0.9914995 0.5408288 -0.5095925 0.9914995 0.5408288 -0.5176729 0.9914995 0.5408288 -0.5278957 0.9914995 0.5408288 -0.5408288 0.9914995 0.5408288 -0.5571908 0.9914995 0.5408288 -0.577891 0.9914995 0.5408288 -0.6040793 0.9914995 0.5408288 -0.637211 0.9914995 0.5408288 -0.6791269 0.9914995 0.5408288 -0.7321559 0.9914995 0.5408288 -0.7992446 0.9914995 0.5408288 -0.8841204 0.9914995 0.5408288 -0.9914995 0.9914995 0.5408288 -0.9933953 0.8999349 0.5898847 -0.9948487 0.8511207 0.6406203 -0.9959706 0.8314729 0.6903044 -0.9968409 0.8306004 0.7369774 -0.9975189 0.8408797 0.7794007 -0.9980488 0.8569716 0.8169474 -0.9984638 0.875329 0.8494644 -0.9987895 0.8937407 0.8771307 -0.9990455 0.9109436 0.9003323 -0.999247 0.9263124 0.9195625 -0.9994057 0.939629 0.9353505 -0.9995308 0.9509177 0.9482135 -0.9996295 0.9603343 0.9586291 -0.9997074 0.9680946 0.9670214 -0.9997688 0.9744313 0.9737569 -0.9998174 0.9795689 0.9791456 -0.9998557 0.9837116 0.9834461 -0.999886 0.9870376 0.9868713 -0.9999099 0.9896992 0.989595 -0.9999288 0.9918234 0.9917582 -0.9999437 0.9935154 0.9934746 -0.5504963 0.993424 0.5925797 -0.5504818 0.9934236 0.5925443 -0.550464 0.9934231 0.5924997 -0.5504419 0.9934225 0.5924439 -0.550415 0.9934218 0.5923741 -0.5503825 0.9934209 0.5922872 -0.5503438 0.9934197 0.5921795 -0.5502987 0.9934183 0.5920467 -0.550248 0.9934166 0.5918842 -0.5501939 0.9934145 0.5916877 -0.5501416 0.993412 0.5914535 -0.5501012 0.9934091 0.5911804 -0.5500915 0.9934058 0.590872 -0.5501456 0.9934023 0.5905415 -0.5503203 0.9933988 0.5902194 -0.5507113 0.9933961 0.5899658 -0.5514695 0.9933953 0.5898847 -0.5525411 0.9933953 0.5898847 -0.5538969 0.9933953 0.5898847 -0.5556122 0.9933953 0.5898847 -0.5577822 0.9933953 0.5898847 -0.5605276 0.9933953 0.5898847 -0.5640008 0.9933953 0.5898847 -0.5683949 0.9933953 0.5898847 -0.573954 0.9933953 0.5898847 -0.580987 0.9933953 0.5898847 -0.5898847 0.9933953 0.5898847 -0.6011414 0.9933953 0.5898847 -0.6153825 0.9933953 0.5898847 -0.6333995 0.9933953 0.5898847 -0.6561933 0.9933953 0.5898847 -0.6850303 0.9933953 0.5898847 -0.721513 0.9933953 0.5898847 -0.7676683 0.9933953 0.5898847 -0.8260608 0.9933953 0.5898847 -0.8999349 0.9933953 0.5898847 -0.9933953 0.9933953 0.5898847 -0.9948487 0.9145732 0.6406203 -0.9959706 0.8740262 0.6903044 -0.9968409 0.8588218 0.7369774 -0.9975189 0.8594117 0.7794007 -0.9980488 0.8690364 0.8169474 -0.9984638 0.8831255 0.8494644 -0.9987895 0.8987476 0.8771307 -0.9990455 0.9141422 0.9003323 -0.999247 0.928347 0.9195625 -0.9994057 0.9409186 0.9353505 -0.9995308 0.9517328 0.9482135 -0.9996295 0.9608482 0.9586291 -0.9997074 0.9684181 0.9670214 -0.9997688 0.9746346 0.9737569 -0.9998174 0.9796966 0.9791456 -0.9998557 0.9837916 0.9834461 -0.999886 0.9870878 0.9868713 -0.9999099 0.9897306 0.989595 -0.9999288 0.9918431 0.9917582 -0.9999437 0.9935277 0.9934746 -0.6139459 0.9948662 0.642552 -0.6139352 0.994866 0.6425265 -0.6139219 0.9948657 0.6424946 -0.6139056 0.9948653 0.6424545 -0.6138855 0.9948649 0.6424045 -0.6138613 0.9948643 0.6423421 -0.6138323 0.9948636 0.6422649 -0.6137984 0.9948628 0.6421696 -0.6137599 0.9948617 0.6420531 -0.6137183 0.9948604 0.6419122 -0.6136769 0.9948589 0.6417443 -0.6136427 0.9948571 0.6415485 -0.6136284 0.9948551 0.6413275 -0.6136569 0.994853 0.6410908 -0.6137675 0.9948509 0.64086 -0.6140266 0.9948493 0.6406784 -0.6145393 0.9948487 0.6406203 -0.6152669 0.9948487 0.6406203 -0.6161874 0.9948487 0.6406203 -0.6173519 0.9948487 0.6406203 -0.6188252 0.9948487 0.6406203 -0.6206891 0.9948487 0.6406203 -0.6230471 0.9948487 0.6406203 -0.6260304 0.9948487 0.6406203 -0.6298046 0.9948487 0.6406203 -0.6345795 0.9948487 0.6406203 -0.6406203 0.9948487 0.6406203 -0.6482627 0.9948487 0.6406203 -0.6579314 0.9948487 0.6406203 -0.6701635 0.9948487 0.6406203 -0.6856388 0.9948487 0.6406203 -0.7052169 0.9948487 0.6406203 -0.7299859 0.9948487 0.6406203 -0.7613218 0.9948487 0.6406203 -0.8009659 0.9948487 0.6406203 -0.8511207 0.9948487 0.6406203 -0.9145732 0.9948487 0.6406203 -0.9948487 0.9948487 0.6406203 -0.9959706 0.9278617 0.6903044 -0.9968409 0.8945255 0.7369774 -0.9975189 0.8828571 0.7794007 -0.9980488 0.8842998 0.8169474 -0.9984638 0.892989 0.8494644 -0.9987895 0.9050819 0.8771307 -0.9990455 0.9181889 0.9003323 -0.999247 0.9309211 0.9195625 -0.9994057 0.9425502 0.9353505 -0.9995308 0.952764 0.9482135 -0.9996295 0.9614985 0.9586291 -0.9997074 0.9688274 0.9670214 -0.9997688 0.9748918 0.9737569 -0.9998174 0.979858 0.9791456 -0.9998557 0.9838928 0.9834461 -0.999886 0.9871512 0.9868713 -0.9999099 0.9897703 0.989595 -0.9999288 0.991868 0.9917582 -0.9999437 0.9935432 0.9934746 -0.6724572 0.9959813 0.6916607 -0.6724495 0.9959811 0.6916428 -0.6724399 0.9959809 0.6916203 -0.672428 0.9959807 0.6915922 -0.6724135 0.9959804 0.6915571 -0.6723959 0.9959801 0.6915133 -0.6723748 0.9959797 0.691459 -0.67235 0.9959791 0.691392 -0.6723217 0.9959785 0.6913102 -0.6722907 0.9959777 0.6912113 -0.6722594 0.9959768 0.6910933 -0.6722322 0.9959757 0.6909559 -0.672218 0.9959745 0.6908007 -0.672232 0.9959732 0.6906345 -0.6723012 0.9959719 0.6904726 -0.6724711 0.9959709 0.6903451 -0.6728136 0.9959706 0.6903044 -0.6733015 0.9959706 0.6903044 -0.6739188 0.9959706 0.6903044 -0.6746998 0.9959706 0.6903044 -0.6756878 0.9959706 0.6903044 -0.6769378 0.9959706 0.6903044 -0.6785192 0.9959706 0.6903044 -0.6805199 0.9959706 0.6903044 -0.683051 0.9959706 0.6903044 -0.6862532 0.9959706 0.6903044 -0.6903044 0.9959706 0.6903044 -0.6954296 0.9959706 0.6903044 -0.7019138 0.9959706 0.6903044 -0.710117 0.9959706 0.6903044 -0.7204952 0.9959706 0.6903044 -0.733625 0.9959706 0.6903044 -0.7502359 0.9959706 0.6903044 -0.7712508 0.9959706 0.6903044 -0.7978374 0.9959706 0.6903044 -0.8314729 0.9959706 0.6903044 -0.8740262 0.9959706 0.6903044 -0.9278617 0.9959706 0.6903044 -0.9959706 0.9959706 0.6903044 -0.9968409 0.9396953 0.7369774 -0.9975189 0.9125186 0.7794007 -0.9980488 0.9036101 0.8169474 -0.9984638 0.9054678 0.8494644 -0.9987895 0.9130957 0.8771307 -0.9990455 0.9233085 0.9003323 -0.999247 0.9341777 0.9195625 -0.9994057 0.9446144 0.9353505 -0.9995308 0.9540687 0.9482135 -0.9996295 0.9623212 0.9586291 -0.9997074 0.9693452 0.9670214 -0.9997688 0.9752172 0.9737569 -0.9998174 0.9800622 0.9791456 -0.9998557 0.9840209 0.9834461 -0.999886 0.9872315 0.9868713 -0.9999099 0.9898206 0.989595 -0.9999288 0.9918994 0.9917582 -0.9999437 0.9935629 0.9934746 -0.7251659 0.9968475 0.7379123 -0.7251605 0.9968474 0.7379 -0.7251537 0.9968473 0.7378845 -0.7251454 0.9968472 0.7378651 -0.7251351 0.996847 0.7378409 -0.7251226 0.9968468 0.7378107 -0.7251076 0.9968465 0.7377732 -0.7250899 0.9968462 0.7377271 -0.7250697 0.9968458 0.7376706 -0.7250473 0.9968453 0.7376024 -0.7250244 0.9968448 0.7375211 -0.7250039 0.9968441 0.7374264 -0.7249916 0.9968433 0.7373194 -0.7249978 0.9968425 0.7372049 -0.7250408 0.9968418 0.7370933 -0.7251511 0.9968411 0.7370055 -0.7253775 0.9968409 0.7369774 -0.7257011 0.9968409 0.7369774 -0.7261105 0.9968409 0.7369774 -0.7266285 0.9968409 0.7369774 -0.7272837 0.9968409 0.7369774 -0.7281127 0.9968409 0.7369774 -0.7291615 0.9968409 0.7369774 -0.7304884 0.9968409 0.7369774 -0.732167 0.9968409 0.7369774 -0.7342907 0.9968409 0.7369774 -0.7369774 0.9968409 0.7369774 -0.7403765 0.9968409 0.7369774 -0.7446768 0.9968409 0.7369774 -0.7501172 0.9968409 0.7369774 -0.757 0.9968409 0.7369774 -0.7657077 0.9968409 0.7369774 -0.776724 0.9968409 0.7369774 -0.7906611 0.9968409 0.7369774 -0.8082934 0.9968409 0.7369774 -0.8306004 0.9968409 0.7369774 -0.8588218 0.9968409 0.7369774 -0.8945255 0.9968409 0.7369774 -0.9396953 0.9968409 0.7369774 -0.9968409 0.9968409 0.7369774 -0.9975189 0.9500442 0.7794007 -0.9980488 0.9280401 0.8169474 -0.9984638 0.921255 0.8494644 -0.9987895 0.9232341 0.8771307 -0.9990455 0.9297854 0.9003323 -0.999247 0.9382977 0.9195625 -0.9994057 0.9472259 0.9353505 -0.9995308 0.9557192 0.9482135 -0.9996295 0.963362 0.9586291 -0.9997074 0.9700002 0.9670214 -0.9997688 0.9756289 0.9737569 -0.9998174 0.9803206 0.9791456 -0.9998557 0.9841829 0.9834461 -0.999886 0.987333 0.9868713 -0.9999099 0.9898842 0.989595 -0.9999288 0.9919392 0.9917582 -0.9999437 0.9935878 0.9934746 -0.7716588 0.997523 0.7800347 -0.7716551 0.997523 0.7800263 -0.7716504 0.9975229 0.7800158 -0.7716446 0.9975228 0.7800027 -0.7716375 0.9975227 0.7799862 -0.7716288 0.9975226 0.7799657 -0.7716184 0.9975224 0.7799403 -0.7716061 0.9975222 0.779909 -0.7715919 0.997522 0.7798707 -0.7715762 0.9975217 0.7798244 -0.7715599 0.9975213 0.7797693 -0.7715449 0.9975209 0.779705 -0.7715352 0.9975204 0.7796325 -0.7715376 0.9975199 0.7795549 -0.7715641 0.9975194 0.7794792 -0.7716352 0.9975191 0.7794197 -0.7717834 0.9975189 0.7794007 -0.7719959 0.9975189 0.7794007 -0.7722648 0.9975189 0.7794007 -0.7726049 0.9975189 0.7794007 -0.7730352 0.9975189 0.7794007 -0.7735795 0.9975189 0.7794007 -0.7742682 0.9975189 0.7794007 -0.7751395 0.9975189 0.7794007 -0.7762418 0.9975189 0.7794007 -0.7776364 0.9975189 0.7794007 -0.7794007 0.9975189 0.7794007 -0.7816327 0.9975189 0.7794007 -0.7844566 0.9975189 0.7794007 -0.7880291 0.9975189 0.7794007 -0.7925488 0.9975189 0.7794007 -0.7982669 0.9975189 0.7794007 -0.8055009 0.9975189 0.7794007 -0.8146529 0.9975189 0.7794007 -0.8262314 0.9975189 0.7794007 -0.8408797 0.9975189 0.7794007 -0.8594117 0.9975189 0.7794007 -0.8828571 0.9975189 0.7794007 -0.9125186 0.9975189 0.7794007 -0.9500442 0.9975189 0.7794007 -0.9975189 0.9975189 0.7794007 -0.9980488 0.9589472 0.8169474 -0.9984638 0.9412278 0.8494644 -0.9987895 0.9360606 0.8771307 -0.9990455 0.9379796 0.9003323 -0.999247 0.94351 0.9195625 -0.9994057 0.9505298 0.9353505 -0.9995308 0.9578074 0.9482135 -0.9996295 0.9646787 0.9586291 -0.9997074 0.970829 0.9670214 -0.9997688 0.9761497 0.9737569 -0.9998174 0.9806476 0.9791456 -0.9998557 0.984388 0.9834461 -0.999886 0.9874615 0.9868713 -0.9999099 0.9899646 0.989595 -0.9999288 0.9919896 0.9917582 -0.9999437 0.9936193 0.9934746 -0.8119154 0.9980513 0.8173713 -0.8119128 0.9980512 0.8173657 -0.8119096 0.9980512 0.8173587 -0.8119057 0.9980511 0.8173499 -0.8119009 0.9980511 0.8173389 -0.8118949 0.998051 0.8173252 -0.8118878 0.9980509 0.8173082 -0.8118794 0.9980508 0.8172873 -0.8118697 0.9980506 0.8172617 -0.8118589 0.9980504 0.8172307 -0.8118476 0.9980502 0.8171938 -0.811837 0.99805 0.8171509 -0.8118298 0.9980497 0.8171024 -0.8118303 0.9980494 0.8170505 -0.8118466 0.9980491 0.8169999 -0.8118921 0.9980488 0.8169601 -0.8119884 0.9980488 0.8169474 -0.8121268 0.9980488 0.8169474 -0.8123018 0.9980488 0.8169474 -0.8125232 0.9980488 0.8169474 -0.8128033 0.9980488 0.8169474 -0.8131577 0.9980488 0.8169474 -0.8136061 0.9980488 0.8169474 -0.8141733 0.9980488 0.8169474 -0.8148909 0.9980488 0.8169474 -0.8157988 0.9980488 0.8169474 -0.8169474 0.9980488 0.8169474 -0.8184005 0.9980488 0.8169474 -0.8202389 0.9980488 0.8169474 -0.8225647 0.9980488 0.8169474 -0.8255071 0.9980488 0.8169474 -0.8292297 0.9980488 0.8169474 -0.8339392 0.9980488 0.8169474 -0.8398974 0.9980488 0.8169474 -0.8474353 0.9980488 0.8169474 -0.8569716 0.9980488 0.8169474 -0.8690364 0.9980488 0.8169474 -0.8842998 0.9980488 0.8169474 -0.9036101 0.9980488 0.8169474 -0.9280401 0.9980488 0.8169474 -0.9589472 0.9980488 0.8169474 -0.9980488 0.9980488 0.8169474 -0.9984638 0.9664961 0.8494644 -0.9987895 0.9522877 0.8771307 -0.9990455 0.9483463 0.9003323 -0.999247 0.9501042 0.9195625 -0.9994057 0.9547096 0.9353505 -0.9995308 0.9604492 0.9482135 -0.9996295 0.9663445 0.9586291 -0.9997074 0.9718774 0.9670214 -0.9997688 0.9768086 0.9737569 -0.9998174 0.9810611 0.9791456 -0.9998557 0.9846473 0.9834461 -0.999886 0.987624 0.9868713 -0.9999099 0.9900664 0.989595 -0.9999288 0.9920533 0.9917582 -0.9999437 0.9936592 0.9934746 -0.8462171 0.9984653 0.8497444 -0.8462154 0.9984653 0.8497407 -0.8462132 0.9984653 0.8497361 -0.8462106 0.9984653 0.8497303 -0.8462073 0.9984652 0.849723 -0.8462034 0.9984652 0.8497139 -0.8461986 0.9984651 0.8497027 -0.8461929 0.998465 0.8496889 -0.8461864 0.9984649 0.849672 -0.8461791 0.9984648 0.8496515 -0.8461714 0.9984647 0.8496272 -0.8461641 0.9984645 0.8495988 -0.8461589 0.9984643 0.8495668 -0.8461587 0.9984642 0.8495325 -0.8461687 0.998464 0.8494991 -0.8461977 0.9984638 0.8494728 -0.8462598 0.9984638 0.8494644 -0.8463492 0.9984638 0.8494644 -0.8464623 0.9984638 0.8494644 -0.8466054 0.9984638 0.8494644 -0.8467864 0.9984638 0.8494644 -0.8470154 0.9984638 0.8494644 -0.8473052 0.9984638 0.8494644 -0.8476717 0.9984638 0.8494644 -0.8481355 0.9984638 0.8494644 -0.8487222 0.9984638 0.8494644 -0.8494644 0.9984638 0.8494644 -0.8504035 0.9984638 0.8494644 -0.8515915 0.9984638 0.8494644 -0.8530945 0.9984638 0.8494644 -0.8549959 0.9984638 0.8494644 -0.8574015 0.9984638 0.8494644 -0.8604449 0.9984638 0.8494644 -0.8642952 0.9984638 0.8494644 -0.8691663 0.9984638 0.8494644 -0.875329 0.9984638 0.8494644 -0.8831255 0.9984638 0.8494644 -0.892989 0.9984638 0.8494644 -0.9054678 0.9984638 0.8494644 -0.921255 0.9984638 0.8494644 -0.9412278 0.9984638 0.8494644 -0.9664961 0.9984638 0.8494644 -0.9984638 0.9984638 0.8494644 -0.9987895 0.9728171 0.8771307 -0.9990455 0.9614615 0.9003323 -0.999247 0.9584468 0.9195625 -0.9994057 0.9599976 0.9353505 -0.9995308 0.9637914 0.9482135 -0.9996295 0.968452 0.9586291 -0.9997074 0.9732039 0.9670214 -0.9997688 0.9776422 0.9737569 -0.9998174 0.9815844 0.9791456 -0.9998557 0.9849754 0.9834461 -0.999886 0.9878296 0.9868713 -0.9999099 0.9901951 0.989595 -0.9999288 0.9921339 0.9917582 -0.9999437 0.9937096 0.9934746 -0.8750477 0.9987905 0.8773138 -0.8750466 0.9987905 0.8773114 -0.8750451 0.9987904 0.8773083 -0.8750434 0.9987904 0.8773045 -0.8750412 0.9987904 0.8772998 -0.8750386 0.9987904 0.8772938 -0.8750355 0.9987903 0.8772865 -0.8750317 0.9987903 0.8772775 -0.8750274 0.9987902 0.8772664 -0.8750225 0.9987902 0.877253 -0.8750173 0.9987901 0.8772371 -0.8750124 0.99879 0.8772186 -0.8750088 0.9987899 0.8771976 -0.8750084 0.9987897 0.8771752 -0.8750145 0.9987896 0.8771534 -0.8750329 0.9987895 0.8771362 -0.8750727 0.9987895 0.8771307 -0.8751301 0.9987895 0.8771307 -0.8752028 0.9987895 0.8771307 -0.8752947 0.9987895 0.8771307 -0.8754109 0.9987895 0.8771307 -0.875558 0.9987895 0.8771307 -0.8757441 0.9987895 0.8771307 -0.8759795 0.9987895 0.8771307 -0.8762773 0.9987895 0.8771307 -0.8766541 0.9987895 0.8771307 -0.8771307 0.9987895 0.8771307 -0.8777338 0.9987895 0.8771307 -0.8784967 0.9987895 0.8771307 -0.8794619 0.9987895 0.8771307 -0.880683 0.9987895 0.8771307 -0.8822279 0.9987895 0.8771307 -0.8841823 0.9987895 0.8771307 -0.886655 0.9987895 0.8771307 -0.8897832 0.9987895 0.8771307 -0.8937407 0.9987895 0.8771307 -0.8987476 0.9987895 0.8771307 -0.9050819 0.9987895 0.8771307 -0.9130957 0.9987895 0.8771307 -0.9232341 0.9987895 0.8771307 -0.9360606 0.9987895 0.8771307 -0.9522877 0.9987895 0.8771307 -0.9728171 0.9987895 0.8771307 -0.9987895 0.9987895 0.8771307 -0.9990455 0.9780539 0.9003323 -0.999247 0.9690013 0.9195625 -0.9994057 0.9666876 0.9353505 -0.9995308 0.9680197 0.9482135 -0.9996295 0.9711183 0.9586291 -0.9997074 0.974882 0.9670214 -0.9997688 0.9786968 0.9737569 -0.9998174 0.9822464 0.9791456 -0.9998557 0.9853905 0.9834461 -0.999886 0.9880897 0.9868713 -0.9999099 0.990358 0.989595 -0.9999288 0.9922358 0.9917582 -0.9999437 0.9937734 0.9934746 -0.8990028 0.9990461 0.9004509 -0.899002 0.9990461 0.9004493 -0.8990011 0.9990461 0.9004474 -0.899 0.9990461 0.9004449 -0.8989986 0.9990461 0.9004418 -0.8989969 0.9990461 0.900438 -0.8989948 0.9990461 0.9004332 -0.8989923 0.999046 0.9004274 -0.8989895 0.999046 0.9004202 -0.8989863 0.9990459 0.9004115 -0.8989829 0.9990459 0.9004012 -0.8989796 0.9990458 0.9003892 -0.8989771 0.9990458 0.9003756 -0.8989767 0.9990457 0.9003611 -0.8989805 0.9990456 0.9003469 -0.8989921 0.9990456 0.9003358 -0.8990175 0.9990455 0.9003323 -0.8990542 0.9990455 0.9003323 -0.8991006 0.9990455 0.9003323 -0.8991593 0.9990455 0.9003323 -0.8992336 0.9990455 0.9003323 -0.8993275 0.9990455 0.9003323 -0.8994464 0.9990455 0.9003323 -0.8995968 0.9990455 0.9003323 -0.899787 0.9990455 0.9003323 -0.9000277 0.9990455 0.9003323 -0.9003323 0.9990455 0.9003323 -0.9007175 0.9990455 0.9003323 -0.9012049 0.9990455 0.9003323 -0.9018215 0.9990455 0.9003323 -0.9026016 0.9990455 0.9003323 -0.9035886 0.9990455 0.9003323 -0.9048372 0.9990455 0.9003323 -0.9064168 0.9990455 0.9003323 -0.9084153 0.9990455 0.9003323 -0.9109436 0.9990455 0.9003323 -0.9141422 0.9990455 0.9003323 -0.9181889 0.9990455 0.9003323 -0.9233085 0.9990455 0.9003323 -0.9297854 0.9990455 0.9003323 -0.9379796 0.9990455 0.9003323 -0.9483463 0.9990455 0.9003323 -0.9614615 0.9990455 0.9003323 -0.9780539 0.9990455 0.9003323 -0.9990455 0.9990455 0.9003323 -0.999247 0.982354 0.9195625 -0.9994057 0.9751513 0.9353505 -0.9995308 0.9733691 0.9482135 -0.9996295 0.9744915 0.9586291 -0.9997074 0.977005 0.9670214 -0.9997688 0.980031 0.9737569 -0.9998174 0.9830838 0.9791456 -0.9998557 0.9859157 0.9834461 -0.999886 0.9884188 0.9868713 -0.9999099 0.9905641 0.989595 -0.9999288 0.9923648 0.9917582 -0.9999437 0.9938541 0.9934746 -0.9187175 0.9992474 0.9196389 -0.918717 0.9992474 0.9196379 -0.9187164 0.9992474 0.9196366 -0.9187157 0.9992474 0.919635 -0.9187148 0.9992474 0.919633 -0.9187137 0.9992474 0.9196306 -0.9187123 0.9992473 0.9196275 -0.9187107 0.9992473 0.9196237 -0.9187089 0.9992473 0.9196191 -0.9187068 0.9992473 0.9196135 -0.9187045 0.9992472 0.9196069 -0.9187024 0.9992472 0.9195991 -0.9187008 0.9992472 0.9195904 -0.9187004 0.9992471 0.9195811 -0.9187027 0.9992471 0.919572 -0.9187101 0.999247 0.9195648 -0.9187262 0.999247 0.9195625 -0.9187495 0.999247 0.9195625 -0.9187791 0.999247 0.9195625 -0.9188164 0.999247 0.9195625 -0.9188636 0.999247 0.9195625 -0.9189234 0.999247 0.9195625 -0.918999 0.999247 0.9195625 -0.9190947 0.999247 0.9195625 -0.9192157 0.999247 0.9195625 -0.9193688 0.999247 0.9195625 -0.9195625 0.999247 0.9195625 -0.9198076 0.999247 0.9195625 -0.9201176 0.999247 0.9195625 -0.9205098 0.999247 0.9195625 -0.9210061 0.999247 0.9195625 -0.9216339 0.999247 0.9195625 -0.9224281 0.999247 0.9195625 -0.9234329 0.999247 0.9195625 -0.9247041 0.999247 0.9195625 -0.9263124 0.999247 0.9195625 -0.928347 0.999247 0.9195625 -0.9309211 0.999247 0.9195625 -0.9341777 0.999247 0.9195625 -0.9382977 0.999247 0.9195625 -0.94351 0.999247 0.9195625 -0.9501042 0.999247 0.9195625 -0.9584468 0.999247 0.9195625 -0.9690013 0.999247 0.9195625 -0.982354 0.999247 0.9195625 -0.999247 0.999247 0.9195625 -0.9994057 0.9858591 0.9353505 -0.9995308 0.9801368 0.9482135 -0.9996295 0.978759 0.9586291 -0.9997074 0.9796909 0.9670214 -0.9997688 0.981719 0.9737569 -0.9998174 0.9841433 0.9791456 -0.9998557 0.9865801 0.9834461 -0.999886 0.9888351 0.9868713 -0.9999099 0.9908248 0.989595 -0.9999288 0.992528 0.9917582 -0.9999437 0.9939562 0.9934746 -0.9348153 0.999406 0.9353994 -0.9348149 0.999406 0.9353987 -0.9348146 0.999406 0.9353979 -0.9348141 0.999406 0.9353969 -0.9348135 0.999406 0.9353956 -0.9348128 0.9994059 0.9353941 -0.9348119 0.9994059 0.9353921 -0.9348109 0.9994059 0.9353897 -0.9348097 0.9994059 0.9353867 -0.9348083 0.9994059 0.9353832 -0.9348069 0.9994059 0.9353789 -0.9348055 0.9994059 0.935374 -0.9348044 0.9994058 0.9353684 -0.9348042 0.9994058 0.9353624 -0.9348056 0.9994058 0.9353566 -0.9348102 0.9994057 0.935352 -0.9348204 0.9994057 0.9353505 -0.9348352 0.9994057 0.9353505 -0.9348539 0.9994057 0.9353505 -0.9348776 0.9994057 0.9353505 -0.9349075 0.9994057 0.9353505 -0.9349454 0.9994057 0.9353505 -0.9349933 0.9994057 0.9353505 -0.935054 0.9994057 0.9353505 -0.9351307 0.9994057 0.9353505 -0.9352277 0.9994057 0.9353505 -0.9353505 0.9994057 0.9353505 -0.9355059 0.9994057 0.9353505 -0.9357024 0.9994057 0.9353505 -0.935951 0.9994057 0.9353505 -0.9362655 0.9994057 0.9353505 -0.9366635 0.9994057 0.9353505 -0.9371669 0.9994057 0.9353505 -0.9378038 0.9994057 0.9353505 -0.9386096 0.9994057 0.9353505 -0.939629 0.9994057 0.9353505 -0.9409186 0.9994057 0.9353505 -0.9425502 0.9994057 0.9353505 -0.9446144 0.9994057 0.9353505 -0.9472259 0.9994057 0.9353505 -0.9505298 0.9994057 0.9353505 -0.9547096 0.9994057 0.9353505 -0.9599976 0.9994057 0.9353505 -0.9666876 0.9994057 0.9353505 -0.9751513 0.9994057 0.9353505 -0.9858591 0.9994057 0.9353505 -0.9994057 0.9994057 0.9353505 -0.9995308 0.9886988 0.9482135 -0.9996295 0.9841579 0.9586291 -0.9997074 0.983089 0.9670214 -0.9997688 0.9838545 0.9737569 -0.9998174 0.9854838 0.9791456 -0.9998557 0.9874207 0.9834461 -0.999886 0.9893618 0.9868713 -0.9999099 0.9911547 0.989595 -0.9999288 0.9927345 0.9917582 -0.9999437 0.9940854 0.9934746 -0.9478754 0.999531 0.9482447 -0.9478752 0.999531 0.9482442 -0.947875 0.999531 0.9482437 -0.9478746 0.999531 0.9482431 -0.9478743 0.999531 0.9482423 -0.9478738 0.999531 0.9482413 -0.9478733 0.999531 0.94824 -0.9478726 0.999531 0.9482385 -0.9478718 0.999531 0.9482366 -0.947871 0.9995309 0.9482343 -0.94787 0.9995309 0.9482316 -0.9478691 0.9995309 0.9482285 -0.9478684 0.9995309 0.9482249 -0.9478683 0.9995309 0.9482211 -0.9478691 0.9995309 0.9482174 -0.947872 0.9995309 0.9482145 -0.9478785 0.9995308 0.9482135 -0.9478878 0.9995308 0.9482135 -0.9478997 0.9995308 0.9482135 -0.9479146 0.9995308 0.9482135 -0.9479335 0.9995308 0.9482135 -0.9479575 0.9995308 0.9482135 -0.9479878 0.9995308 0.9482135 -0.9480261 0.9995308 0.9482135 -0.9480746 0.9995308 0.9482135 -0.9481359 0.9995308 0.9482135 -0.9482135 0.9995308 0.9482135 -0.9483117 0.9995308 0.9482135 -0.9484359 0.9995308 0.9482135 -0.9485931 0.9995308 0.9482135 -0.9487918 0.9995308 0.9482135 -0.9490434 0.9995308 0.9482135 -0.9493615 0.9995308 0.9482135 -0.9497641 0.9995308 0.9482135 -0.9502734 0.9995308 0.9482135 -0.9509177 0.9995308 0.9482135 -0.9517328 0.9995308 0.9482135 -0.952764 0.9995308 0.9482135 -0.9540687 0.9995308 0.9482135 -0.9557192 0.9995308 0.9482135 -0.9578074 0.9995308 0.9482135 -0.9604492 0.9995308 0.9482135 -0.9637914 0.9995308 0.9482135 -0.9680197 0.9995308 0.9482135 -0.9733691 0.9995308 0.9482135 -0.9801368 0.9995308 0.9482135 -0.9886988 0.9995308 0.9482135 -0.9995308 0.9995308 0.9482135 -0.9996295 0.9909882 0.9586291 -0.9997074 0.9873879 0.9670214 -0.9997688 0.9865561 0.9737569 -0.9998174 0.9871796 0.9791456 -0.9998557 0.9884841 0.9834461 -0.999886 0.9900282 0.9868713 -0.9999099 0.991572 0.989595 -0.9999288 0.9929957 0.9917582 -0.9999437 0.9942488 0.9934746 -0.958416 0.9996296 0.9586489 -0.9584159 0.9996296 0.9586486 -0.9584157 0.9996296 0.9586483 -0.9584155 0.9996296 0.9586479 -0.9584153 0.9996296 0.9586473 -0.958415 0.9996296 0.9586467 -0.9584146 0.9996296 0.9586459 -0.9584142 0.9996296 0.9586449 -0.9584137 0.9996296 0.9586437 -0.9584132 0.9996296 0.9586423 -0.9584126 0.9996296 0.9586406 -0.958412 0.9996296 0.9586386 -0.9584115 0.9996296 0.9586363 -0.9584114 0.9996295 0.9586339 -0.958412 0.9996295 0.9586316 -0.9584138 0.9996295 0.9586297 -0.9584178 0.9996295 0.9586291 -0.9584237 0.9996295 0.9586291 -0.9584312 0.9996295 0.9586291 -0.9584406 0.9996295 0.9586291 -0.9584526 0.9996295 0.9586291 -0.9584677 0.9996295 0.9586291 -0.9584868 0.9996295 0.9586291 -0.9585109 0.9996295 0.9586291 -0.9585415 0.9996295 0.9586291 -0.9585802 0.9996295 0.9586291 -0.9586291 0.9996295 0.9586291 -0.958691 0.9996295 0.9586291 -0.9587693 0.9996295 0.9586291 -0.9588684 0.9996295 0.9586291 -0.9589938 0.9996295 0.9586291 -0.9591524 0.9996295 0.9586291 -0.959353 0.9996295 0.9586291 -0.9596068 0.9996295 0.9586291 -0.959928 0.9996295 0.9586291 -0.9603343 0.9996295 0.9586291 -0.9608482 0.9996295 0.9586291 -0.9614985 0.9996295 0.9586291 -0.9623212 0.9996295 0.9586291 -0.963362 0.9996295 0.9586291 -0.9646787 0.9996295 0.9586291 -0.9663445 0.9996295 0.9586291 -0.968452 0.9996295 0.9586291 -0.9711183 0.9996295 0.9586291 -0.9744915 0.9996295 0.9586291 -0.978759 0.9996295 0.9586291 -0.9841579 0.9996295 0.9586291 -0.9909882 0.9996295 0.9586291 -0.9996295 0.9996295 0.9586291 -0.9997074 0.9928267 0.9670214 -0.9997688 0.9899741 0.9737569 -0.9998174 0.989325 0.9791456 -0.9998557 0.9898295 0.9834461 -0.999886 0.9908712 0.9868713 -0.9999099 0.9920999 0.989595 -0.9999288 0.9933261 0.9917582 -0.9999437 0.9944556 0.9934746 -0.9668873 0.9997074 0.9670339 -0.9668872 0.9997074 0.9670337 -0.9668871 0.9997074 0.9670335 -0.966887 0.9997074 0.9670333 -0.9668869 0.9997074 0.9670329 -0.9668867 0.9997074 0.9670325 -0.9668865 0.9997074 0.967032 -0.9668862 0.9997074 0.9670314 -0.9668859 0.9997074 0.9670307 -0.9668855 0.9997074 0.9670298 -0.9668852 0.9997074 0.9670287 -0.9668848 0.9997074 0.9670274 -0.9668845 0.9997074 0.967026 -0.9668844 0.9997074 0.9670245 -0.9668847 0.9997074 0.967023 -0.9668859 0.9997074 0.9670218 -0.9668884 0.9997074 0.9670214 -0.9668922 0.9997074 0.9670214 -0.9668969 0.9997074 0.9670214 -0.9669028 0.9997074 0.9670214 -0.9669103 0.9997074 0.9670214 -0.9669198 0.9997074 0.9670214 -0.9669318 0.9997074 0.9670214 -0.966947 0.9997074 0.9670214 -0.9669663 0.9997074 0.9670214 -0.9669906 0.9997074 0.9670214 -0.9670214 0.9997074 0.9670214 -0.9670604 0.9997074 0.9670214 -0.9671097 0.9997074 0.9670214 -0.967172 0.9997074 0.9670214 -0.9672509 0.9997074 0.9670214 -0.9673508 0.9997074 0.9670214 -0.967477 0.9997074 0.9670214 -0.9676368 0.9997074 0.9670214 -0.9678389 0.9997074 0.9670214 -0.9680946 0.9997074 0.9670214 -0.9684181 0.9997074 0.9670214 -0.9688274 0.9997074 0.9670214 -0.9693452 0.9997074 0.9670214 -0.9700002 0.9997074 0.9670214 -0.970829 0.9997074 0.9670214 -0.9718774 0.9997074 0.9670214 -0.9732039 0.9997074 0.9670214 -0.974882 0.9997074 0.9670214 -0.977005 0.9997074 0.9670214 -0.9796909 0.9997074 0.9670214 -0.983089 0.9997074 0.9670214 -0.9873879 0.9997074 0.9670214 -0.9928267 0.9997074 0.9670214 -0.9997074 0.9997074 0.9670214 -0.9997688 0.9942982 0.9737569 -0.9998174 0.9920392 0.9791456 -0.9998557 0.9915316 0.9834461 -0.999886 0.9919377 0.9868713 -0.9999099 0.9927678 0.989595 -0.9999288 0.9937442 0.9917582 -0.9999437 0.9947172 0.9934746 -0.9736726 0.9997689 0.9737647 -0.9736726 0.9997689 0.9737646 -0.9736725 0.9997689 0.9737645 -0.9736724 0.9997689 0.9737643 -0.9736723 0.9997689 0.9737641 -0.9736722 0.9997689 0.9737639 -0.9736721 0.9997689 0.9737636 -0.9736719 0.9997689 0.9737632 -0.9736717 0.9997689 0.9737627 -0.9736715 0.9997689 0.9737621 -0.9736712 0.9997689 0.9737614 -0.973671 0.9997689 0.9737606 -0.9736708 0.9997689 0.9737597 -0.9736708 0.9997689 0.9737588 -0.973671 0.9997688 0.9737578 -0.9736717 0.9997688 0.9737571 -0.9736733 0.9997688 0.9737569 -0.9736756 0.9997688 0.9737569 -0.9736786 0.9997688 0.9737569 -0.9736823 0.9997688 0.9737569 -0.973687 0.9997688 0.9737569 -0.973693 0.9997688 0.9737569 -0.9737006 0.9997688 0.9737569 -0.9737101 0.9997688 0.9737569 -0.9737222 0.9997688 0.9737569 -0.9737375 0.9997688 0.9737569 -0.9737569 0.9997688 0.9737569 -0.9737814 0.9997688 0.9737569 -0.9738123 0.9997688 0.9737569 -0.9738515 0.9997688 0.9737569 -0.9739011 0.9997688 0.9737569 -0.9739638 0.9997688 0.9737569 -0.9740432 0.9997688 0.9737569 -0.9741436 0.9997688 0.9737569 -0.9742706 0.9997688 0.9737569 -0.9744313 0.9997688 0.9737569 -0.9746346 0.9997688 0.9737569 -0.9748918 0.9997688 0.9737569 -0.9752172 0.9997688 0.9737569 -0.9756289 0.9997688 0.9737569 -0.9761497 0.9997688 0.9737569 -0.9768086 0.9997688 0.9737569 -0.9776422 0.9997688 0.9737569 -0.9786968 0.9997688 0.9737569 -0.980031 0.9997688 0.9737569 -0.981719 0.9997688 0.9737569 -0.9838545 0.9997688 0.9737569 -0.9865561 0.9997688 0.9737569 -0.9899741 0.9997688 0.9737569 -0.9942982 0.9997688 0.9737569 -0.9997688 0.9997688 0.9737569 -0.9998174 0.9954731 0.9791456 -0.9998557 0.9936849 0.9834461 -0.999886 0.993287 0.9868713 -0.9999099 0.9936128 0.989595 -0.9999288 0.9942731 0.9917582 -0.9999437 0.9950481 0.9934746 -0.9790927 0.9998174 0.9791506 -0.9790927 0.9998174 0.9791505 -0.9790927 0.9998174 0.9791504 -0.9790926 0.9998174 0.9791503 -0.9790925 0.9998174 0.9791502 -0.9790925 0.9998174 0.97915 -0.9790924 0.9998174 0.9791498 -0.9790923 0.9998174 0.9791496 -0.9790921 0.9998174 0.9791493 -0.979092 0.9998174 0.9791489 -0.9790919 0.9998174 0.9791485 -0.9790917 0.9998174 0.979148 -0.9790916 0.9998174 0.9791474 -0.9790916 0.9998174 0.9791468 -0.9790917 0.9998174 0.9791462 -0.9790921 0.9998174 0.9791457 -0.9790931 0.9998174 0.9791456 -0.9790946 0.9998174 0.9791456 -0.9790965 0.9998174 0.9791456 -0.9790988 0.9998174 0.9791456 -0.9791018 0.9998174 0.9791456 -0.9791055 0.9998174 0.9791456 -0.9791103 0.9998174 0.9791456 -0.9791163 0.9998174 0.9791456 -0.9791238 0.9998174 0.9791456 -0.9791334 0.9998174 0.9791456 -0.9791456 0.9998174 0.9791456 -0.979161 0.9998174 0.9791456 -0.9791804 0.9998174 0.9791456 -0.979205 0.9998174 0.9791456 -0.9792361 0.9998174 0.9791456 -0.9792755 0.9998174 0.9791456 -0.9793253 0.9998174 0.9791456 -0.9793883 0.9998174 0.9791456 -0.9794681 0.9998174 0.9791456 -0.9795689 0.9998174 0.9791456 -0.9796966 0.9998174 0.9791456 -0.979858 0.9998174 0.9791456 -0.9800622 0.9998174 0.9791456 -0.9803206 0.9998174 0.9791456 -0.9806476 0.9998174 0.9791456 -0.9810611 0.9998174 0.9791456 -0.9815844 0.9998174 0.9791456 -0.9822464 0.9998174 0.9791456 -0.9830838 0.9998174 0.9791456 -0.9841433 0.9998174 0.9791456 -0.9854838 0.9998174 0.9791456 -0.9871796 0.9998174 0.9791456 -0.989325 0.9998174 0.9791456 -0.9920392 0.9998174 0.9791456 -0.9954731 0.9998174 0.9791456 -0.9998174 0.9998174 0.9791456 -0.9998557 0.9964092 0.9834461 -0.999886 0.9949941 0.9868713 -0.9999099 0.9946818 0.989595 -0.9999288 0.9949422 0.9917582 -0.9999437 0.9954668 0.9934746 -0.9834129 0.9998557 0.9834492 -0.9834129 0.9998557 0.9834492 -0.9834129 0.9998557 0.9834491 -0.9834129 0.9998557 0.983449 -0.9834128 0.9998557 0.983449 -0.9834128 0.9998557 0.9834489 -0.9834127 0.9998557 0.9834487 -0.9834127 0.9998557 0.9834486 -0.9834126 0.9998557 0.9834484 -0.9834125 0.9998557 0.9834482 -0.9834124 0.9998557 0.9834479 -0.9834123 0.9998557 0.9834476 -0.9834122 0.9998557 0.9834472 -0.9834122 0.9998557 0.9834468 -0.9834123 0.9998557 0.9834465 -0.9834126 0.9998557 0.9834462 -0.9834132 0.9998557 0.9834461 -0.9834141 0.9998557 0.9834461 -0.9834153 0.9998557 0.9834461 -0.9834167 0.9998557 0.9834461 -0.9834186 0.9998557 0.9834461 -0.9834209 0.9998557 0.9834461 -0.9834239 0.9998557 0.9834461 -0.9834277 0.9998557 0.9834461 -0.9834324 0.9998557 0.9834461 -0.9834385 0.9998557 0.9834461 -0.9834461 0.9998557 0.9834461 -0.9834557 0.9998557 0.9834461 -0.9834679 0.9998557 0.9834461 -0.9834833 0.9998557 0.9834461 -0.9835029 0.9998557 0.9834461 -0.9835276 0.9998557 0.9834461 -0.9835588 0.9998557 0.9834461 -0.9835983 0.9998557 0.9834461 -0.9836483 0.9998557 0.9834461 -0.9837116 0.9998557 0.9834461 -0.9837916 0.9998557 0.9834461 -0.9838928 0.9998557 0.9834461 -0.9840209 0.9998557 0.9834461 -0.9841829 0.9998557 0.9834461 -0.984388 0.9998557 0.9834461 -0.9846473 0.9998557 0.9834461 -0.9849754 0.9998557 0.9834461 -0.9853905 0.9998557 0.9834461 -0.9859157 0.9998557 0.9834461 -0.9865801 0.9998557 0.9834461 -0.9874207 0.9998557 0.9834461 -0.9884841 0.9998557 0.9834461 -0.9898295 0.9998557 0.9834461 -0.9915316 0.9998557 0.9834461 -0.9936849 0.9998557 0.9834461 -0.9964092 0.9998557 0.9834461 -0.9998557 0.9998557 0.9834461 -0.999886 0.9971537 0.9868713 -0.9999099 0.9960342 0.989595 -0.9999288 0.9957887 0.9917582 -0.9999437 0.9959964 0.9934746 -0.9868505 0.999886 0.9868732 -0.9868505 0.999886 0.9868732 -0.9868505 0.999886 0.9868732 -0.9868505 0.999886 0.9868731 -0.9868504 0.999886 0.9868731 -0.9868504 0.999886 0.986873 -0.9868504 0.999886 0.9868729 -0.9868503 0.999886 0.9868728 -0.9868503 0.999886 0.9868727 -0.9868502 0.999886 0.9868726 -0.9868502 0.999886 0.9868724 -0.9868501 0.999886 0.9868722 -0.9868501 0.999886 0.986872 -0.98685 0.999886 0.9868717 -0.9868501 0.999886 0.9868715 -0.9868503 0.999886 0.9868713 -0.9868507 0.999886 0.9868713 -0.9868512 0.999886 0.9868713 -0.986852 0.999886 0.9868713 -0.9868529 0.999886 0.9868713 -0.9868541 0.999886 0.9868713 -0.9868555 0.999886 0.9868713 -0.9868574 0.999886 0.9868713 -0.9868597 0.999886 0.9868713 -0.9868627 0.999886 0.9868713 -0.9868665 0.999886 0.9868713 -0.9868713 0.999886 0.9868713 -0.9868773 0.999886 0.9868713 -0.986885 0.999886 0.9868713 -0.9868946 0.999886 0.9868713 -0.9869069 0.999886 0.9868713 -0.9869223 0.999886 0.9868713 -0.9869419 0.999886 0.9868713 -0.9869667 0.999886 0.9868713 -0.986998 0.999886 0.9868713 -0.9870376 0.999886 0.9868713 -0.9870878 0.999886 0.9868713 -0.9871512 0.999886 0.9868713 -0.9872315 0.999886 0.9868713 -0.987333 0.999886 0.9868713 -0.9874615 0.999886 0.9868713 -0.987624 0.999886 0.9868713 -0.9878296 0.999886 0.9868713 -0.9880897 0.999886 0.9868713 -0.9884188 0.999886 0.9868713 -0.9888351 0.999886 0.9868713 -0.9893618 0.999886 0.9868713 -0.9900282 0.999886 0.9868713 -0.9908712 0.999886 0.9868713 -0.9919377 0.999886 0.9868713 -0.993287 0.999886 0.9868713 -0.9949941 0.999886 0.9868713 -0.9971537 0.999886 0.9868713 -0.999886 0.999886 0.9868713 -0.9999099 0.9977452 0.989595 -0.9999288 0.9968597 0.9917582 -0.9999437 0.9966665 0.9934746 -0.989582 0.9999099 0.9895962 -0.989582 0.9999099 0.9895962 -0.989582 0.9999099 0.9895962 -0.989582 0.9999099 0.9895962 -0.989582 0.9999099 0.9895961 -0.9895819 0.9999099 0.9895961 -0.9895819 0.9999099 0.9895961 -0.9895819 0.9999099 0.989596 -0.9895819 0.9999099 0.9895959 -0.9895818 0.9999099 0.9895958 -0.9895818 0.9999099 0.9895957 -0.9895818 0.9999099 0.9895956 -0.9895817 0.9999099 0.9895955 -0.9895817 0.9999099 0.9895953 -0.9895817 0.9999099 0.9895952 -0.9895819 0.9999099 0.989595 -0.9895821 0.9999099 0.989595 -0.9895825 0.9999099 0.989595 -0.9895829 0.9999099 0.989595 -0.9895835 0.9999099 0.989595 -0.9895842 0.9999099 0.989595 -0.9895851 0.9999099 0.989595 -0.9895863 0.9999099 0.989595 -0.9895878 0.9999099 0.989595 -0.9895897 0.9999099 0.989595 -0.989592 0.9999099 0.989595 -0.989595 0.9999099 0.989595 -0.9895988 0.9999099 0.989595 -0.9896036 0.9999099 0.989595 -0.9896096 0.9999099 0.989595 -0.9896173 0.9999099 0.989595 -0.989627 0.9999099 0.989595 -0.9896392 0.9999099 0.989595 -0.9896547 0.9999099 0.989595 -0.9896744 0.9999099 0.989595 -0.9896992 0.9999099 0.989595 -0.9897306 0.9999099 0.989595 -0.9897703 0.9999099 0.989595 -0.9898206 0.9999099 0.989595 -0.9898842 0.9999099 0.989595 -0.9899646 0.9999099 0.989595 -0.9900664 0.9999099 0.989595 -0.9901951 0.9999099 0.989595 -0.990358 0.9999099 0.989595 -0.9905641 0.9999099 0.989595 -0.9908248 0.9999099 0.989595 -0.9911547 0.9999099 0.989595 -0.991572 0.9999099 0.989595 -0.9920999 0.9999099 0.989595 -0.9927678 0.9999099 0.989595 -0.9936128 0.9999099 0.989595 -0.9946818 0.9999099 0.989595 -0.9960342 0.9999099 0.989595 -0.9977452 0.9999099 0.989595 -0.9999099 0.9999099 0.989595 -0.9999288 0.9982146 0.9917582 -0.9999437 0.9975143 0.9934746 -0.9917501 0.9999288 0.991759 -0.9917501 0.9999288 0.991759 -0.9917501 0.9999288 0.991759 -0.9917501 0.9999288 0.991759 -0.9917501 0.9999288 0.9917589 -0.9917501 0.9999288 0.9917589 -0.99175 0.9999288 0.9917589 -0.99175 0.9999288 0.9917588 -0.99175 0.9999288 0.9917588 -0.99175 0.9999288 0.9917587 -0.99175 0.9999288 0.9917587 -0.9917499 0.9999288 0.9917586 -0.9917499 0.9999288 0.9917585 -0.9917499 0.9999288 0.9917584 -0.9917499 0.9999288 0.9917583 -0.99175 0.9999288 0.9917583 -0.9917502 0.9999288 0.9917582 -0.9917504 0.9999288 0.9917582 -0.9917507 0.9999288 0.9917582 -0.991751 0.9999288 0.9917582 -0.9917515 0.9999288 0.9917582 -0.9917521 0.9999288 0.9917582 -0.9917528 0.9999288 0.9917582 -0.9917537 0.9999288 0.9917582 -0.9917549 0.9999288 0.9917582 -0.9917564 0.9999288 0.9917582 -0.9917582 0.9999288 0.9917582 -0.9917606 0.9999288 0.9917582 -0.9917636 0.9999288 0.9917582 -0.9917674 0.9999288 0.9917582 -0.9917722 0.9999288 0.9917582 -0.9917782 0.9999288 0.9917582 -0.9917859 0.9999288 0.9917582 -0.9917956 0.9999288 0.9917582 -0.9918079 0.9999288 0.9917582 -0.9918234 0.9999288 0.9917582 -0.9918431 0.9999288 0.9917582 -0.991868 0.9999288 0.9917582 -0.9918994 0.9999288 0.9917582 -0.9919392 0.9999288 0.9917582 -0.9919896 0.9999288 0.9917582 -0.9920533 0.9999288 0.9917582 -0.9921339 0.9999288 0.9917582 -0.9922358 0.9999288 0.9917582 -0.9923648 0.9999288 0.9917582 -0.992528 0.9999288 0.9917582 -0.9927345 0.9999288 0.9917582 -0.9929957 0.9999288 0.9917582 -0.9933261 0.9999288 0.9917582 -0.9937442 0.9999288 0.9917582 -0.9942731 0.9999288 0.9917582 -0.9949422 0.9999288 0.9917582 -0.9957887 0.9999288 0.9917582 -0.9968597 0.9999288 0.9917582 -0.9982146 0.9999288 0.9917582 -0.9999288 0.9999288 0.9917582 -0.9999437 0.9985868 0.9934746 -0.9934695 0.9999437 0.9934751 -0.9934695 0.9999437 0.9934751 -0.9934695 0.9999437 0.993475 -0.9934695 0.9999437 0.993475 -0.9934695 0.9999437 0.993475 -0.9934695 0.9999437 0.993475 -0.9934695 0.9999437 0.993475 -0.9934694 0.9999437 0.993475 -0.9934694 0.9999437 0.9934749 -0.9934694 0.9999437 0.9934749 -0.9934694 0.9999437 0.9934749 -0.9934694 0.9999437 0.9934748 -0.9934694 0.9999437 0.9934748 -0.9934694 0.9999437 0.9934747 -0.9934694 0.9999437 0.9934746 -0.9934694 0.9999437 0.9934746 -0.9934695 0.9999437 0.9934746 -0.9934697 0.9999437 0.9934746 -0.9934698 0.9999437 0.9934746 -0.9934701 0.9999437 0.9934746 -0.9934704 0.9999437 0.9934746 -0.9934707 0.9999437 0.9934746 -0.9934712 0.9999437 0.9934746 -0.9934718 0.9999437 0.9934746 -0.9934725 0.9999437 0.9934746 -0.9934734 0.9999437 0.9934746 -0.9934746 0.9999437 0.9934746 -0.9934761 0.9999437 0.9934746 -0.9934779 0.9999437 0.9934746 -0.9934803 0.9999437 0.9934746 -0.9934833 0.9999437 0.9934746 -0.9934871 0.9999437 0.9934746 -0.9934919 0.9999437 0.9934746 -0.993498 0.9999437 0.9934746 -0.9935057 0.9999437 0.9934746 -0.9935154 0.9999437 0.9934746 -0.9935277 0.9999437 0.9934746 -0.9935432 0.9999437 0.9934746 -0.9935629 0.9999437 0.9934746 -0.9935878 0.9999437 0.9934746 -0.9936193 0.9999437 0.9934746 -0.9936592 0.9999437 0.9934746 -0.9937096 0.9999437 0.9934746 -0.9937734 0.9999437 0.9934746 -0.9938541 0.9999437 0.9934746 -0.9939562 0.9999437 0.9934746 -0.9940854 0.9999437 0.9934746 -0.9942488 0.9999437 0.9934746 -0.9944556 0.9999437 0.9934746 -0.9947172 0.9999437 0.9934746 -0.9950481 0.9999437 0.9934746 -0.9954668 0.9999437 0.9934746 -0.9959964 0.9999437 0.9934746 -0.9966665 0.9999437 0.9934746 -0.9975143 0.9999437 0.9934746 -0.9985868 0.9999437 0.9934746 -0.9999437 0.9999437 0.9934746 -0.0279321 0.0279321 0.9033413 -0.0283384 0.0279321 0.9033413 -0.0288523 0.0279321 0.9033413 -0.0295025 0.0279321 0.9033413 -0.0303251 0.0279321 0.9033413 -0.0313658 0.0279321 0.9033413 -0.0326824 0.0279321 0.9033413 -0.0343481 0.0279321 0.9033413 -0.0364554 0.0279321 0.9033413 -0.0391214 0.0279321 0.9033413 -0.0424942 0.0279321 0.9033413 -0.0467613 0.0279321 0.9033413 -0.0521597 0.0279321 0.9033413 -0.0589895 0.0279321 0.9033413 -0.0676299 0.0279321 0.9033413 -0.0785612 0.0279321 0.9033413 -0.0923908 0.0279321 0.9033413 -0.1098869 0.0279321 0.9033413 -0.1320218 0.0279321 0.9033413 -0.1600254 0.0279321 0.9033413 -0.1954535 0.0279321 0.9033413 -0.2402747 0.0279321 0.9033413 -0.2969793 0.0279321 0.9033413 -0.368718 0.0279321 0.9033413 -0.4594768 0.0279321 0.9033413 -0.5742985 0.0279321 0.9033413 -0.7195629 0.0279321 0.9033413 -0.9033413 0.0279321 0.9033413 -0.9354466 0.0624569 0.7522434 -0.9545467 0.1059991 0.6358098 -0.9669269 0.1572498 0.5567544 -0.9754027 0.2151269 0.5115877 -0.9814251 0.2783684 0.4950336 -0.9858181 0.3454107 0.5013914 -0.9890841 0.4144197 0.5250451 -0.9915469 0.4834235 0.560735 -0.993424 0.5504963 0.603762 -0.9948662 0.6139459 0.6501531 -0.9959813 0.6724572 0.6967634 -0.9968475 0.7251659 0.7412993 -0.997523 0.7716588 0.7822603 -0.9980513 0.8119154 0.8188211 -0.9984653 0.8462171 0.8506817 -0.9987905 0.8750477 0.8779159 -0.9990461 0.8990028 0.9008357 -0.9992474 0.9187175 0.9198837 -0.999406 0.9348153 0.9355546 -0.999531 0.9478754 0.9483428 -0.9996296 0.958416 0.9587107 -0.9997074 0.9668873 0.9670729 -0.9997689 0.9736726 0.9737892 -0.9998174 0.9790927 0.9791659 -0.9998557 0.9834129 0.9834588 -0.999886 0.9868505 0.9868793 -0.9999099 0.989582 0.9896 -0.9999288 0.9917501 0.9917614 -0.9999437 0.9934695 0.9934765 -0.0279321 0.0283384 0.9033413 -0.0278872 0.0278872 0.9032596 -0.0284013 0.0278872 0.9032596 -0.0290518 0.0278872 0.9032596 -0.0298748 0.0278872 0.9032596 -0.0309159 0.0278872 0.9032596 -0.0322331 0.0278872 0.9032596 -0.0338994 0.0278872 0.9032596 -0.0360076 0.0278872 0.9032596 -0.0386748 0.0278872 0.9032596 -0.042049 0.0278872 0.9032596 -0.0463179 0.0278872 0.9032596 -0.0517186 0.0278872 0.9032596 -0.0585512 0.0278872 0.9032596 -0.0671953 0.0278872 0.9032596 -0.0781312 0.0278872 0.9032596 -0.0919666 0.0278872 0.9032596 -0.1094702 0.0278872 0.9032596 -0.1316144 0.0278872 0.9032596 -0.1596298 0.0278872 0.9032596 -0.1950729 0.0278872 0.9032596 -0.239913 0.0278872 0.9032596 -0.2966415 0.0278872 0.9032596 -0.3684105 0.0278872 0.9032596 -0.4592077 0.0278872 0.9032596 -0.5740779 0.0278872 0.9032596 -0.7194036 0.0278872 0.9032596 -0.9032596 0.0278872 0.9032596 -0.9354101 0.0624063 0.7521367 -0.9545286 0.1059489 0.6356873 -0.9669173 0.1572031 0.5566321 -0.9753975 0.2150852 0.5114763 -0.9814221 0.2783325 0.4949383 -0.9858163 0.3453807 0.5013136 -0.9890831 0.4143955 0.5249839 -0.9915463 0.4834045 0.5606884 -0.9934236 0.5504818 0.6037276 -0.994866 0.6139352 0.6501282 -0.9959811 0.6724495 0.6967458 -0.9968474 0.7251605 0.7412871 -0.997523 0.7716551 0.782252 -0.9980512 0.8119128 0.8188155 -0.9984653 0.8462154 0.850678 -0.9987905 0.8750466 0.8779135 -0.9990461 0.899002 0.9008341 -0.9992474 0.918717 0.9198827 -0.999406 0.9348149 0.935554 -0.999531 0.9478752 0.9483424 -0.9996296 0.9584159 0.9587105 -0.9997074 0.9668872 0.9670727 -0.9997689 0.9736726 0.9737891 -0.9998174 0.9790927 0.9791659 -0.9998557 0.9834129 0.9834588 -0.999886 0.9868505 0.9868792 -0.9999099 0.989582 0.9896 -0.9999288 0.9917501 0.9917614 -0.9999437 0.9934695 0.9934765 -0.0279321 0.0288523 0.9033413 -0.0278872 0.0284013 0.9032596 -0.0278347 0.0278347 0.9031567 -0.0284855 0.0278347 0.9031567 -0.0293089 0.0278347 0.9031567 -0.0303505 0.0278347 0.9031567 -0.0316684 0.0278347 0.9031567 -0.0333357 0.0278347 0.9031567 -0.035445 0.0278347 0.9031567 -0.0381135 0.0278347 0.9031567 -0.0414896 0.0278347 0.9031567 -0.0457607 0.0278347 0.9031567 -0.0511643 0.0278347 0.9031567 -0.0580005 0.0278347 0.9031567 -0.0666492 0.0278347 0.9031567 -0.0775909 0.0278347 0.9031567 -0.0914336 0.0278347 0.9031567 -0.1089464 0.0278347 0.9031567 -0.1311024 0.0278347 0.9031567 -0.1591327 0.0278347 0.9031567 -0.1945945 0.0278347 0.9031567 -0.2394584 0.0278347 0.9031567 -0.2962171 0.0278347 0.9031567 -0.3680241 0.0278347 0.9031567 -0.4588694 0.0278347 0.9031567 -0.5738005 0.0278347 0.9031567 -0.7192033 0.0278347 0.9031567 -0.9031567 0.0278347 0.9031567 -0.9353643 0.0623458 0.7520027 -0.9545059 0.1058883 0.6355334 -0.9669053 0.1571463 0.5564784 -0.9753908 0.2150342 0.5113363 -0.9814183 0.2782884 0.4948186 -0.9858141 0.3453439 0.5012158 -0.9890818 0.4143657 0.5249071 -0.9915455 0.4833811 0.5606299 -0.9934231 0.550464 0.6036842 -0.9948657 0.6139219 0.6500969 -0.9959809 0.6724399 0.6967237 -0.9968473 0.7251537 0.7412718 -0.9975229 0.7716504 0.7822416 -0.9980512 0.8119096 0.8188085 -0.9984653 0.8462132 0.8506734 -0.9987904 0.8750451 0.8779105 -0.9990461 0.8990011 0.9008322 -0.9992474 0.9187164 0.9198814 -0.999406 0.9348146 0.9355532 -0.999531 0.947875 0.9483418 -0.9996296 0.9584157 0.9587101 -0.9997074 0.9668871 0.9670725 -0.9997689 0.9736725 0.973789 -0.9998174 0.9790927 0.9791658 -0.9998557 0.9834129 0.9834587 -0.999886 0.9868505 0.9868792 -0.9999099 0.989582 0.9896 -0.9999288 0.9917501 0.9917613 -0.9999437 0.9934695 0.9934765 -0.0279321 0.0295025 0.9033413 -0.0278872 0.0290518 0.9032596 -0.0278347 0.0284855 0.9031567 -0.0277752 0.0277752 0.9030276 -0.0285991 0.0277752 0.9030276 -0.0296415 0.0277752 0.9030276 -0.0309602 0.0277752 0.9030276 -0.0326286 0.0277752 0.9030276 -0.0347393 0.0277752 0.9030276 -0.0374096 0.0277752 0.9030276 -0.0407879 0.0277752 0.9030276 -0.0450619 0.0277752 0.9030276 -0.050469 0.0277752 0.9030276 -0.0573098 0.0277752 0.9030276 -0.0659642 0.0277752 0.9030276 -0.0769132 0.0277752 0.9030276 -0.0907651 0.0277752 0.9030276 -0.1082896 0.0277752 0.9030276 -0.1304603 0.0277752 0.9030276 -0.1585092 0.0277752 0.9030276 -0.1939946 0.0277752 0.9030276 -0.2388883 0.0277752 0.9030276 -0.2956846 0.0277752 0.9030276 -0.3675394 0.0277752 0.9030276 -0.4584451 0.0277752 0.9030276 -0.5734525 0.0277752 0.9030276 -0.7189519 0.0277752 0.9030276 -0.9030276 0.0277752 0.9030276 -0.9353068 0.0622749 0.7518347 -0.9544774 0.1058162 0.6353404 -0.9668902 0.1570779 0.5562858 -0.9753825 0.2149725 0.5111609 -0.9814136 0.2782347 0.4946685 -0.9858113 0.3452987 0.5010933 -0.9890801 0.414329 0.5248108 -0.9915446 0.4833522 0.5605565 -0.9934225 0.5504419 0.60363 -0.9948653 0.6139056 0.6500577 -0.9959807 0.672428 0.6966961 -0.9968472 0.7251454 0.7412527 -0.9975228 0.7716446 0.7822286 -0.9980511 0.8119057 0.8187998 -0.9984653 0.8462106 0.8506676 -0.9987904 0.8750434 0.8779067 -0.9990461 0.899 0.9008297 -0.9992474 0.9187157 0.9198799 -0.999406 0.9348141 0.9355521 -0.999531 0.9478746 0.9483412 -0.9996296 0.9584155 0.9587097 -0.9997074 0.966887 0.9670722 -0.9997689 0.9736724 0.9737888 -0.9998174 0.9790926 0.9791657 -0.9998557 0.9834129 0.9834587 -0.999886 0.9868505 0.9868792 -0.9999099 0.989582 0.9896 -0.9999288 0.9917501 0.9917613 -0.9999437 0.9934695 0.9934765 -0.0279321 0.0303251 0.9033413 -0.0278872 0.0298748 0.9032596 -0.0278347 0.0293089 0.9031567 -0.0277752 0.0285991 0.9030276 -0.0277111 0.0277111 0.9028657 -0.0287543 0.0277111 0.9028657 -0.0300741 0.0277111 0.9028657 -0.0317439 0.0277111 0.9028657 -0.0338564 0.0277111 0.9028657 -0.0365289 0.0277111 0.9028657 -0.03991 0.0277111 0.9028657 -0.0441875 0.0277111 0.9028657 -0.0495992 0.0277111 0.9028657 -0.0564456 0.0277111 0.9028657 -0.0651072 0.0277111 0.9028657 -0.0760653 0.0277111 0.9028657 -0.0899287 0.0277111 0.9028657 -0.1074677 0.0277111 0.9028657 -0.1296569 0.0277111 0.9028657 -0.157729 0.0277111 0.9028657 -0.1932439 0.0277111 0.9028657 -0.2381749 0.0277111 0.9028657 -0.2950184 0.0277111 0.9028657 -0.3669329 0.0277111 0.9028657 -0.457914 0.0277111 0.9028657 -0.573017 0.0277111 0.9028657 -0.7186372 0.0277111 0.9028657 -0.9028657 0.0277111 0.9028657 -0.9352348 0.0621943 0.7516243 -0.9544418 0.1057322 0.635099 -0.9668714 0.1569971 0.5560449 -0.9753721 0.2148987 0.5109415 -0.9814076 0.2781701 0.4944808 -0.9858079 0.3452442 0.5009401 -0.9890781 0.4142845 0.5246904 -0.9915433 0.4833171 0.5604649 -0.9934218 0.550415 0.6035621 -0.9948649 0.6138855 0.6500088 -0.9959804 0.6724135 0.6966615 -0.996847 0.7251351 0.7412287 -0.9975227 0.7716375 0.7822123 -0.9980511 0.8119009 0.8187889 -0.9984652 0.8462073 0.8506604 -0.9987904 0.8750412 0.877902 -0.9990461 0.8989986 0.9008267 -0.9992474 0.9187148 0.9198779 -0.999406 0.9348135 0.9355509 -0.999531 0.9478743 0.9483404 -0.9996296 0.9584153 0.9587092 -0.9997074 0.9668869 0.9670719 -0.9997689 0.9736723 0.9737886 -0.9998174 0.9790925 0.9791655 -0.9998557 0.9834128 0.9834586 -0.999886 0.9868504 0.9868791 -0.9999099 0.989582 0.9895999 -0.9999288 0.9917501 0.9917613 -0.9999437 0.9934695 0.9934765 -0.0279321 0.0313658 0.9033413 -0.0278872 0.0309159 0.9032596 -0.0278347 0.0303505 0.9031567 -0.0277752 0.0296415 0.9030276 -0.0277111 0.0287543 0.9028657 -0.0276479 0.0276479 0.9026634 -0.0289691 0.0276479 0.9026634 -0.0306405 0.0276479 0.9026634 -0.0327552 0.0276479 0.9026634 -0.0354305 0.0276479 0.9026634 -0.0388151 0.0276479 0.9026634 -0.0430971 0.0276479 0.9026634 -0.0485143 0.0276479 0.9026634 -0.0553678 0.0276479 0.9026634 -0.0640384 0.0276479 0.9026634 -0.0750078 0.0276479 0.9026634 -0.0888856 0.0276479 0.9026634 -0.1064427 0.0276479 0.9026634 -0.1286548 0.0276479 0.9026634 -0.156756 0.0276479 0.9026634 -0.1923076 0.0276479 0.9026634 -0.2372851 0.0276479 0.9026634 -0.2941874 0.0276479 0.9026634 -0.3661762 0.0276479 0.9026634 -0.4572514 0.0276479 0.9026634 -0.5724735 0.0276479 0.9026634 -0.7182443 0.0276479 0.9026634 -0.9026634 0.0276479 0.9026634 -0.9351449 0.0621069 0.751362 -0.9543974 0.1056375 0.634798 -0.9668479 0.156904 0.5557446 -0.9753591 0.2148124 0.5106681 -0.9814002 0.2780936 0.494247 -0.9858036 0.3451791 0.5007493 -0.9890755 0.4142311 0.5245404 -0.9915418 0.4832747 0.5603507 -0.9934209 0.5503825 0.6034776 -0.9948643 0.6138613 0.6499478 -0.9959801 0.6723959 0.6966184 -0.9968468 0.7251226 0.7411989 -0.9975226 0.7716288 0.782192 -0.998051 0.8118949 0.8187753 -0.9984652 0.8462034 0.8506514 -0.9987904 0.8750386 0.8778961 -0.9990461 0.8989969 0.9008228 -0.9992474 0.9187137 0.9198754 -0.9994059 0.9348128 0.9355493 -0.999531 0.9478738 0.9483394 -0.9996296 0.958415 0.9587086 -0.9997074 0.9668867 0.9670715 -0.9997689 0.9736722 0.9737884 -0.9998174 0.9790925 0.9791654 -0.9998557 0.9834128 0.9834585 -0.999886 0.9868504 0.9868791 -0.9999099 0.9895819 0.9895999 -0.9999288 0.9917501 0.9917613 -0.9999437 0.9934695 0.9934765 -0.0279321 0.0326824 0.9033413 -0.0278872 0.0322331 0.9032596 -0.0278347 0.0316684 0.9031567 -0.0277752 0.0309602 0.9030276 -0.0277111 0.0300741 0.9028657 -0.0276479 0.0289691 0.9026634 -0.0275966 0.0275966 0.9024114 -0.0292702 0.0275966 0.9024114 -0.0313876 0.0275966 0.9024114 -0.0340663 0.0275966 0.9024114 -0.0374553 0.0275966 0.9024114 -0.0417427 0.0275966 0.9024114 -0.0471669 0.0275966 0.9024114 -0.0540292 0.0275966 0.9024114 -0.0627109 0.0275966 0.9024114 -0.0736944 0.0275966 0.9024114 -0.08759 0.0275966 0.9024114 -0.1051696 0.0275966 0.9024114 -0.1274102 0.0275966 0.9024114 -0.1555474 0.0275966 0.9024114 -0.1911446 0.0275966 0.9024114 -0.2361798 0.0275966 0.9024114 -0.2931551 0.0275966 0.9024114 -0.3652362 0.0275966 0.9024114 -0.4564282 0.0275966 0.9024114 -0.571798 0.0275966 0.9024114 -0.7177558 0.0275966 0.9024114 -0.9024114 0.0275966 0.9024114 -0.9350332 0.0620199 0.7510361 -0.9543421 0.1055364 0.6344244 -0.9668187 0.1568008 0.5553719 -0.975343 0.2147144 0.5103288 -0.9813911 0.2780055 0.4939569 -0.9857982 0.3451032 0.5005126 -0.9890723 0.4141683 0.5243544 -0.9915399 0.4832246 0.5602091 -0.9934197 0.5503438 0.6033728 -0.9948636 0.6138323 0.6498721 -0.9959797 0.6723748 0.696565 -0.9968465 0.7251076 0.7411619 -0.9975224 0.7716184 0.7821669 -0.9980509 0.8118878 0.8187584 -0.9984651 0.8461986 0.8506403 -0.9987903 0.8750355 0.8778888 -0.9990461 0.8989948 0.9008181 -0.9992473 0.9187123 0.9198724 -0.9994059 0.9348119 0.9355473 -0.999531 0.9478733 0.9483381 -0.9996296 0.9584146 0.9587078 -0.9997074 0.9668865 0.967071 -0.9997689 0.9736721 0.9737881 -0.9998174 0.9790924 0.9791652 -0.9998557 0.9834127 0.9834584 -0.999886 0.9868504 0.986879 -0.9999099 0.9895819 0.9895998 -0.9999288 0.99175 0.9917613 -0.9999437 0.9934695 0.9934765 -0.0279321 0.0343481 0.9033413 -0.0278872 0.0338994 0.9032596 -0.0278347 0.0333357 0.9031567 -0.0277752 0.0326286 0.9030276 -0.0277111 0.0317439 0.9028657 -0.0276479 0.0306405 0.9026634 -0.0275966 0.0292702 0.9024114 -0.0275778 0.0275778 0.9020992 -0.0296985 0.0275778 0.9020992 -0.0323815 0.0275778 0.9020992 -0.0357758 0.0275778 0.9020992 -0.04007 0.0275778 0.9020992 -0.0455028 0.0275778 0.9020992 -0.052376 0.0275778 0.9020992 -0.0610714 0.0275778 0.9020992 -0.0720722 0.0275778 0.9020992 -0.0859897 0.0275778 0.9020992 -0.1035972 0.0275778 0.9020992 -0.1258729 0.0275778 0.9020992 -0.1540546 0.0275778 0.9020992 -0.1897081 0.0275778 0.9020992 -0.2348144 0.0275778 0.9020992 -0.2918798 0.0275778 0.9020992 -0.3640749 0.0275778 0.9020992 -0.455411 0.0275778 0.9020992 -0.5709632 0.0275778 0.9020992 -0.7171517 0.0275778 0.9020992 -0.9020992 0.0275778 0.9020992 -0.9348949 0.0619473 0.7506335 -0.9542739 0.1054384 0.6339631 -0.9667827 0.1566936 0.554912 -0.9753231 0.2146085 0.5099103 -0.9813797 0.2779077 0.4935991 -0.9857916 0.3450175 0.5002207 -0.9890684 0.4140964 0.5241251 -0.9915376 0.4831666 0.5600346 -0.9934183 0.5502987 0.6032437 -0.9948628 0.6137984 0.6497789 -0.9959791 0.67235 0.6964992 -0.9968462 0.7250899 0.7411164 -0.9975222 0.7716061 0.7821359 -0.9980508 0.8118794 0.8187377 -0.998465 0.8461929 0.8506265 -0.9987903 0.8750317 0.8778798 -0.999046 0.8989923 0.9008122 -0.9992473 0.9187107 0.9198686 -0.9994059 0.9348109 0.9355449 -0.999531 0.9478726 0.9483366 -0.9996296 0.9584142 0.9587068 -0.9997074 0.9668862 0.9670704 -0.9997689 0.9736719 0.9737877 -0.9998174 0.9790923 0.9791649 -0.9998557 0.9834127 0.9834582 -0.999886 0.9868503 0.9868789 -0.9999099 0.9895819 0.9895998 -0.9999288 0.99175 0.9917612 -0.9999437 0.9934694 0.9934764 -0.0279321 0.0364554 0.9033413 -0.0278872 0.0360076 0.9032596 -0.0278347 0.035445 0.9031567 -0.0277752 0.0347393 0.9030276 -0.0277111 0.0338564 0.9028657 -0.0276479 0.0327552 0.9026634 -0.0275966 0.0313876 0.9024114 -0.0275778 0.0296985 0.9020992 -0.0276281 0.0276281 0.9017148 -0.0303162 0.0276281 0.9017148 -0.0337171 0.0276281 0.9017148 -0.0380196 0.0276281 0.9017148 -0.0434629 0.0276281 0.9017148 -0.0503493 0.0276281 0.9017148 -0.0590616 0.0276281 0.9017148 -0.0700837 0.0276281 0.9017148 -0.0840281 0.0276281 0.9017148 -0.1016696 0.0276281 0.9017148 -0.1239883 0.0276281 0.9017148 -0.1522245 0.0276281 0.9017148 -0.1879469 0.0276281 0.9017148 -0.2331404 0.0276281 0.9017148 -0.290316 0.0276281 0.9017148 -0.3626507 0.0276281 0.9017148 -0.4541634 0.0276281 0.9017148 -0.5699388 0.0276281 0.9017148 -0.7164099 0.0276281 0.9017148 -0.9017148 0.0276281 0.9017148 -0.9347252 0.061916 0.7501398 -0.9541902 0.1053624 0.6333979 -0.9667385 0.1565954 0.5543488 -0.9752987 0.2145034 0.509398 -0.9813659 0.2778058 0.4931613 -0.9857835 0.3449254 0.4998636 -0.9890637 0.4140176 0.5238445 -0.9915347 0.4831021 0.5598211 -0.9934166 0.550248 0.6030857 -0.9948617 0.6137599 0.6496649 -0.9959785 0.6723217 0.6964188 -0.9968458 0.7250697 0.7410607 -0.997522 0.7715919 0.782098 -0.9980506 0.8118697 0.8187123 -0.9984649 0.8461864 0.8506097 -0.9987902 0.8750274 0.8778688 -0.999046 0.8989895 0.9008051 -0.9992473 0.9187089 0.919864 -0.9994059 0.9348097 0.935542 -0.999531 0.9478718 0.9483347 -0.9996296 0.9584137 0.9587056 -0.9997074 0.9668859 0.9670696 -0.9997689 0.9736717 0.9737872 -0.9998174 0.9790921 0.9791646 -0.9998557 0.9834126 0.983458 -0.999886 0.9868503 0.9868788 -0.9999099 0.9895819 0.9895997 -0.9999288 0.99175 0.9917612 -0.9999437 0.9934694 0.9934764 -0.0279321 0.0391214 0.9033413 -0.0278872 0.0386748 0.9032596 -0.0278347 0.0381135 0.9031567 -0.0277752 0.0374096 0.9030276 -0.0277111 0.0365289 0.9028657 -0.0276479 0.0354305 0.9026634 -0.0275966 0.0340663 0.9024114 -0.0275778 0.0323815 0.9020992 -0.0276281 0.0303162 0.9017148 -0.0278105 0.0278105 0.9012461 -0.0312193 0.0278105 0.9012461 -0.0355319 0.0278105 0.9012461 -0.0409879 0.0278105 0.9012461 -0.0478904 0.0278105 0.9012461 -0.056623 0.0278105 0.9012461 -0.0676709 0.0278105 0.9012461 -0.0816479 0.0278105 0.9012461 -0.0993306 0.0278105 0.9012461 -0.1217016 0.0278105 0.9012461 -0.1500037 0.0278105 0.9012461 -0.1858097 0.0278105 0.9012461 -0.2311088 0.0278105 0.9012461 -0.2884181 0.0278105 0.9012461 -0.3609218 0.0278105 0.9012461 -0.4526484 0.0278105 0.9012461 -0.5686945 0.0278105 0.9012461 -0.715508 0.0278105 0.9012461 -0.9012461 0.0278105 0.9012461 -0.9345187 0.0619734 0.7495406 -0.9540886 0.1053433 0.6327127 -0.966685 0.1565315 0.5536664 -0.9752692 0.2144168 0.5087774 -0.9813491 0.2777122 0.4926312 -0.9857738 0.3448353 0.4994313 -0.9890579 0.4139373 0.523505 -0.9915312 0.4830346 0.5595628 -0.9934145 0.5501939 0.6028946 -0.9948604 0.6137183 0.649527 -0.9959777 0.6722907 0.6963214 -0.9968453 0.7250473 0.7409934 -0.9975217 0.7715762 0.7820522 -0.9980504 0.8118589 0.8186816 -0.9984648 0.8461791 0.8505894 -0.9987902 0.8750225 0.8778555 -0.9990459 0.8989863 0.9007965 -0.9992473 0.9187068 0.9198584 -0.9994059 0.9348083 0.9355384 -0.9995309 0.947871 0.9483325 -0.9996296 0.9584132 0.9587042 -0.9997074 0.9668855 0.9670687 -0.9997689 0.9736715 0.9737866 -0.9998174 0.979092 0.9791643 -0.9998557 0.9834125 0.9834578 -0.999886 0.9868502 0.9868786 -0.9999099 0.9895818 0.9895996 -0.9999288 0.99175 0.9917611 -0.9999437 0.9934694 0.9934764 -0.0279321 0.0424942 0.9033413 -0.0278872 0.042049 0.9032596 -0.0278347 0.0414896 0.9031567 -0.0277752 0.0407879 0.9030276 -0.0277111 0.03991 0.9028657 -0.0276479 0.0388151 0.9026634 -0.0275966 0.0374553 0.9024114 -0.0275778 0.0357758 0.9020992 -0.0276281 0.0337171 0.9017148 -0.0278105 0.0312193 0.9012461 -0.0282324 0.0282324 0.900682 -0.032557 0.0282324 0.900682 -0.0380282 0.0282324 0.900682 -0.0449499 0.0282324 0.900682 -0.0537068 0.0282324 0.900682 -0.0647855 0.0282324 0.900682 -0.0788014 0.0282324 0.900682 -0.0965334 0.0282324 0.900682 -0.1189666 0.0282324 0.900682 -0.1473476 0.0282324 0.900682 -0.1832532 0.0282324 0.900682 -0.2286785 0.0282324 0.900682 -0.2861474 0.0282324 0.900682 -0.358853 0.0282324 0.900682 -0.4508351 0.0282324 0.900682 -0.5672044 0.0282324 0.900682 -0.7144267 0.0282324 0.900682 -0.900682 0.0282324 0.900682 -0.9342712 0.062202 0.7488237 -0.9539671 0.1054431 0.6318939 -0.9666211 0.1565473 0.5528515 -0.975234 0.2143816 0.5080368 -0.9813291 0.2776503 0.4919987 -0.9857621 0.3447636 0.4989158 -0.989051 0.4138668 0.5231002 -0.9915271 0.4829718 0.5592549 -0.993412 0.5501416 0.6026669 -0.9948589 0.6136769 0.6493627 -0.9959768 0.6722594 0.6962055 -0.9968448 0.7250244 0.7409131 -0.9975213 0.7715599 0.7819976 -0.9980502 0.8118476 0.818645 -0.9984647 0.8461714 0.8505652 -0.9987901 0.8750173 0.8778396 -0.9990459 0.8989829 0.9007862 -0.9992472 0.9187045 0.9198518 -0.9994059 0.9348069 0.9355342 -0.9995309 0.94787 0.9483298 -0.9996296 0.9584126 0.9587025 -0.9997074 0.9668852 0.9670676 -0.9997689 0.9736712 0.9737859 -0.9998174 0.9790919 0.9791638 -0.9998557 0.9834124 0.9834575 -0.999886 0.9868502 0.9868785 -0.9999099 0.9895818 0.9895995 -0.9999288 0.99175 0.991761 -0.9999437 0.9934694 0.9934763 -0.0279321 0.0467613 0.9033413 -0.0278872 0.0463179 0.9032596 -0.0278347 0.0457607 0.9031567 -0.0277752 0.0450619 0.9030276 -0.0277111 0.0441875 0.9028657 -0.0276479 0.0430971 0.9026634 -0.0275966 0.0417427 0.9024114 -0.0275778 0.04007 0.9020992 -0.0276281 0.0380196 0.9017148 -0.0278105 0.0355319 0.9012461 -0.0282324 0.032557 0.900682 -0.0290732 0.0290732 0.9000167 -0.0345622 0.0290732 0.9000167 -0.0415064 0.0290732 0.9000167 -0.0502918 0.0290732 0.9000167 -0.0614064 0.0290732 0.9000167 -0.0754678 0.0290732 0.9000167 -0.0932573 0.0290732 0.9000167 -0.1157634 0.0290732 0.9000167 -0.1442365 0.0290732 0.9000167 -0.1802587 0.0290732 0.9000167 -0.2258315 0.0290732 0.9000167 -0.2834869 0.0290732 0.9000167 -0.3564286 0.0290732 0.9000167 -0.4487093 0.0290732 0.9000167 -0.5654564 0.0290732 0.9000167 -0.7131566 0.0290732 0.9000167 -0.9000167 0.0290732 0.9000167 -0.9339805 0.062742 0.7479837 -0.9538247 0.1057683 0.630936 -0.9665463 0.1567226 0.5518989 -0.9751928 0.2144566 0.5071716 -0.9813057 0.2776626 0.4912602 -0.9857485 0.3447407 0.498314 -0.989043 0.4138277 0.5226279 -0.9915223 0.4829286 0.5588958 -0.9934091 0.5501012 0.6024013 -0.9948571 0.6136427 0.6491711 -0.9959757 0.6722322 0.6960703 -0.9968441 0.7250039 0.7408196 -0.9975209 0.7715449 0.781934 -0.99805 0.811837 0.8186024 -0.9984645 0.8461641 0.850537 -0.99879 0.8750124 0.8778212 -0.9990458 0.8989796 0.9007742 -0.9992472 0.9187024 0.9198441 -0.9994059 0.9348055 0.9355292 -0.9995309 0.9478691 0.9483266 -0.9996296 0.958412 0.9587005 -0.9997074 0.9668848 0.9670664 -0.9997689 0.973671 0.9737851 -0.9998174 0.9790917 0.9791633 -0.9998557 0.9834123 0.9834572 -0.999886 0.9868501 0.9868783 -0.9999099 0.9895818 0.9895994 -0.9999288 0.9917499 0.991761 -0.9999437 0.9934694 0.9934763 -0.0279321 0.0521597 0.9033413 -0.0278872 0.0517186 0.9032596 -0.0278347 0.0511643 0.9031567 -0.0277752 0.050469 0.9030276 -0.0277111 0.0495992 0.9028657 -0.0276479 0.0485143 0.9026634 -0.0275966 0.0471669 0.9024114 -0.0275778 0.0455028 0.9020992 -0.0276281 0.0434629 0.9017148 -0.0278105 0.0409879 0.9012461 -0.0282324 0.0380282 0.900682 -0.0290732 0.0345622 0.9000167 -0.0306306 0.0306306 0.8992555 -0.0376003 0.0306306 0.8992555 -0.0464178 0.0306306 0.8992555 -0.0575732 0.0306306 0.8992555 -0.0716861 0.0306306 0.8992555 -0.0895408 0.0306306 0.8992555 -0.1121293 0.0306306 0.8992555 -0.1407067 0.0306306 0.8992555 -0.1768609 0.0306306 0.8992555 -0.2226006 0.0306306 0.8992555 -0.2804673 0.0306306 0.8992555 -0.3536761 0.0306306 0.8992555 -0.4462949 0.0306306 0.8992555 -0.5634696 0.0306306 0.8992555 -0.7117109 0.0306306 0.8992555 -0.8992555 0.0306306 0.8992555 -0.9336494 0.0638283 0.7470302 -0.953663 0.1064997 0.6298506 -0.9664615 0.1571937 0.5508205 -0.9751462 0.2147432 0.5061928 -0.9812792 0.2778236 0.4904253 -0.9857332 0.3448204 0.497634 -0.9890339 0.4138582 0.5220943 -0.9915169 0.4829319 0.5584902 -0.9934058 0.5500915 0.6021014 -0.9948551 0.6136284 0.6489548 -0.9959745 0.672218 0.6959177 -0.9968433 0.7249916 0.7407141 -0.9975204 0.7715352 0.7818622 -0.9980497 0.8118298 0.8185543 -0.9984643 0.8461589 0.8505052 -0.9987899 0.8750088 0.8778003 -0.9990458 0.8989771 0.9007607 -0.9992472 0.9187008 0.9198354 -0.9994058 0.9348044 0.9355237 -0.9995309 0.9478684 0.9483231 -0.9996296 0.9584115 0.9586982 -0.9997074 0.9668845 0.9670649 -0.9997689 0.9736708 0.9737842 -0.9998174 0.9790916 0.9791628 -0.9998557 0.9834122 0.9834569 -0.999886 0.9868501 0.986878 -0.9999099 0.9895817 0.9895992 -0.9999288 0.9917499 0.9917609 -0.9999437 0.9934694 0.9934762 -0.0279321 0.0589895 0.9033413 -0.0278872 0.0585512 0.9032596 -0.0278347 0.0580005 0.9031567 -0.0277752 0.0573098 0.9030276 -0.0277111 0.0564456 0.9028657 -0.0276479 0.0553678 0.9026634 -0.0275966 0.0540292 0.9024114 -0.0275778 0.052376 0.9020992 -0.0276281 0.0503493 0.9017148 -0.0278105 0.0478904 0.9012461 -0.0282324 0.0449499 0.900682 -0.0290732 0.0415064 0.9000167 -0.0306306 0.0376003 0.8992555 -0.0333932 0.0333932 0.8984278 -0.0422453 0.0333932 0.8984278 -0.0534444 0.0333932 0.8984278 -0.0676127 0.0333932 0.8984278 -0.0855374 0.0333932 0.8984278 -0.1082145 0.0333932 0.8984278 -0.136904 0.0333932 0.8984278 -0.1732 0.0333932 0.8984278 -0.2191191 0.0333932 0.8984278 -0.2772127 0.0333932 0.8984278 -0.3507087 0.0333932 0.8984278 -0.4436907 0.0333932 0.8984278 -0.561325 0.0333932 0.8984278 -0.7101477 0.0333932 0.8984278 -0.8984278 0.0333932 0.8984278 -0.9332914 0.0658501 0.7460024 -0.9534887 0.1079385 0.6286829 -0.9663702 0.15819 0.5496615 -0.9750962 0.2154135 0.5051417 -0.9812508 0.2782606 0.4895292 -0.9857167 0.3450957 0.4969046 -0.9890241 0.4140252 0.5215222 -0.991511 0.4830292 0.5580554 -0.9934023 0.5501456 0.6017801 -0.994853 0.6136569 0.6487231 -0.9959732 0.672232 0.6957543 -0.9968425 0.7249978 0.740601 -0.9975199 0.7715376 0.7817854 -0.9980494 0.8118303 0.8185028 -0.9984642 0.8461587 0.8504711 -0.9987897 0.8750084 0.877778 -0.9990457 0.8989767 0.9007462 -0.9992471 0.9187004 0.9198261 -0.9994058 0.9348042 0.9355177 -0.9995309 0.9478683 0.9483193 -0.9996295 0.9584114 0.9586958 -0.9997074 0.9668844 0.9670634 -0.9997689 0.9736708 0.9737833 -0.9998174 0.9790916 0.9791622 -0.9998557 0.9834122 0.9834565 -0.999886 0.98685 0.9868778 -0.9999099 0.9895817 0.9895991 -0.9999288 0.9917499 0.9917608 -0.9999437 0.9934694 0.9934762 -0.0279321 0.0676299 0.9033413 -0.0278872 0.0671953 0.9032596 -0.0278347 0.0666492 0.9031567 -0.0277752 0.0659642 0.9030276 -0.0277111 0.0651072 0.9028657 -0.0276479 0.0640384 0.9026634 -0.0275966 0.0627109 0.9024114 -0.0275778 0.0610714 0.9020992 -0.0276281 0.0590616 0.9017148 -0.0278105 0.056623 0.9012461 -0.0282324 0.0537068 0.900682 -0.0290732 0.0502918 0.9000167 -0.0306306 0.0464178 0.8992555 -0.0333932 0.0422453 0.8984278 -0.0381561 0.0381561 0.8976087 -0.0493979 0.0381561 0.8976087 -0.0636203 0.0381561 0.8976087 -0.0816135 0.0381561 0.8976087 -0.1043773 0.0381561 0.8976087 -0.1331763 0.0381561 0.8976087 -0.1696109 0.0381561 0.8976087 -0.2157054 0.0381561 0.8976087 -0.2740209 0.0381561 0.8976087 -0.3477976 0.0381561 0.8976087 -0.4411348 0.0381561 0.8976087 -0.5592184 0.0381561 0.8976087 -0.7086095 0.0381561 0.8976087 -0.8976087 0.0381561 0.8976087 -0.9329391 0.0694453 0.7449944 -0.9533177 0.1105818 0.6275398 -0.9662809 0.160092 0.5485282 -0.9750472 0.2167545 0.5041146 -0.9812231 0.2791873 0.4886542 -0.9857006 0.3457234 0.4961927 -0.9890146 0.4144423 0.5209641 -0.9915054 0.4833013 0.5576314 -0.9933988 0.5503203 0.6014668 -0.9948509 0.6137675 0.6484973 -0.9959719 0.6723012 0.695595 -0.9968418 0.7250408 0.7404909 -0.9975194 0.7715641 0.7817105 -0.9980491 0.8118466 0.8184526 -0.998464 0.8461687 0.8504379 -0.9987896 0.8750145 0.8777563 -0.9990456 0.8989805 0.9007321 -0.9992471 0.9187027 0.919817 -0.9994058 0.9348056 0.9355119 -0.9995309 0.9478691 0.9483155 -0.9996295 0.958412 0.9586935 -0.9997074 0.9668847 0.9670619 -0.9997688 0.973671 0.9737823 -0.9998174 0.9790917 0.9791616 -0.9998557 0.9834123 0.9834561 -0.999886 0.9868501 0.9868776 -0.9999099 0.9895817 0.9895989 -0.9999288 0.9917499 0.9917607 -0.9999437 0.9934694 0.9934761 -0.0279321 0.0785612 0.9033413 -0.0278872 0.0781312 0.9032596 -0.0278347 0.0775909 0.9031567 -0.0277752 0.0769132 0.9030276 -0.0277111 0.0760653 0.9028657 -0.0276479 0.0750078 0.9026634 -0.0275966 0.0736944 0.9024114 -0.0275778 0.0720722 0.9020992 -0.0276281 0.0700837 0.9017148 -0.0278105 0.0676709 0.9012461 -0.0282324 0.0647855 0.900682 -0.0290732 0.0614064 0.9000167 -0.0306306 0.0575732 0.8992555 -0.0333932 0.0534444 0.8984278 -0.0381561 0.0493979 0.8976087 -0.0461985 0.0461985 0.8969554 -0.0604636 0.0461985 0.8969554 -0.0785108 0.0461985 0.8969554 -0.1013429 0.0461985 0.8969554 -0.1302284 0.0461985 0.8969554 -0.1667723 0.0461985 0.8969554 -0.2130052 0.0461985 0.8969554 -0.2714957 0.0461985 0.8969554 -0.3454939 0.0461985 0.8969554 -0.4391112 0.0461985 0.8969554 -0.5575493 0.0461985 0.8969554 -0.7073888 0.0461985 0.8969554 -0.8969554 0.0461985 0.8969554 -0.9326595 0.0756464 0.7441968 -0.9531823 0.1152388 0.6266369 -0.9662104 0.1635226 0.5476339 -0.9750086 0.2192389 0.5033048 -0.9812013 0.2809573 0.4879646 -0.9856879 0.3469645 0.4956319 -0.9890072 0.4152991 0.5205246 -0.9915009 0.4838841 0.5572977 -0.9933961 0.5507113 0.6012203 -0.9948493 0.6140266 0.6483196 -0.9959709 0.6724711 0.6954697 -0.9968411 0.7251511 0.7404042 -0.9975191 0.7716352 0.7816516 -0.9980488 0.8118921 0.8184132 -0.9984638 0.8461977 0.8504118 -0.9987895 0.8750329 0.8777392 -0.9990456 0.8989921 0.9007211 -0.999247 0.9187101 0.9198099 -0.9994057 0.9348102 0.9355073 -0.9995309 0.947872 0.9483126 -0.9996295 0.9584138 0.9586916 -0.9997074 0.9668859 0.9670608 -0.9997688 0.9736717 0.9737816 -0.9998174 0.9790921 0.9791611 -0.9998557 0.9834126 0.9834558 -0.999886 0.9868503 0.9868774 -0.9999099 0.9895819 0.9895988 -0.9999288 0.99175 0.9917606 -0.9999437 0.9934694 0.9934761 -0.0279321 0.0923908 0.9033413 -0.0278872 0.0919666 0.9032596 -0.0278347 0.0914336 0.9031567 -0.0277752 0.0907651 0.9030276 -0.0277111 0.0899287 0.9028657 -0.0276479 0.0888856 0.9026634 -0.0275966 0.08759 0.9024114 -0.0275778 0.0859897 0.9020992 -0.0276281 0.0840281 0.9017148 -0.0278105 0.0816479 0.9012461 -0.0282324 0.0788014 0.900682 -0.0290732 0.0754678 0.9000167 -0.0306306 0.0716861 0.8992555 -0.0333932 0.0676127 0.8984278 -0.0381561 0.0636203 0.8976087 -0.0461985 0.0604636 0.8969554 -0.0594506 0.0594506 0.8967447 -0.0775151 0.0594506 0.8967447 -0.1003691 0.0594506 0.8967447 -0.1292823 0.0594506 0.8967447 -0.1658613 0.0594506 0.8967447 -0.2121385 0.0594506 0.8967447 -0.2706852 0.0594506 0.8967447 -0.3447543 0.0594506 0.8967447 -0.4384614 0.0594506 0.8967447 -0.557013 0.0594506 0.8967447 -0.7069963 0.0594506 0.8967447 -0.8967447 0.0594506 0.8967447 -0.9325696 0.0860209 0.7439407 -0.9531389 0.1231452 0.6263473 -0.9661878 0.1694384 0.5473473 -0.9749962 0.2235962 0.5030453 -0.9811943 0.2841192 0.4877437 -0.9856839 0.3492254 0.4954523 -0.9890048 0.4168922 0.5203839 -0.9914995 0.4849907 0.5571908 -0.9933953 0.5514695 0.6011414 -0.9948487 0.6145393 0.6482627 -0.9959706 0.6728136 0.6954296 -0.9968409 0.7253775 0.7403765 -0.9975189 0.7717834 0.7816327 -0.9980488 0.8119884 0.8184005 -0.9984638 0.8462598 0.8504035 -0.9987895 0.8750727 0.8777338 -0.9990455 0.8990175 0.9007175 -0.999247 0.9187262 0.9198076 -0.9994057 0.9348204 0.9355059 -0.9995308 0.9478785 0.9483117 -0.9996295 0.9584178 0.958691 -0.9997074 0.9668884 0.9670604 -0.9997688 0.9736733 0.9737814 -0.9998174 0.9790931 0.979161 -0.9998557 0.9834132 0.9834557 -0.999886 0.9868507 0.9868773 -0.9999099 0.9895821 0.9895988 -0.9999288 0.9917502 0.9917606 -0.9999437 0.9934695 0.9934761 -0.0279321 0.1098869 0.9033413 -0.0278872 0.1094702 0.9032596 -0.0278347 0.1089464 0.9031567 -0.0277752 0.1082896 0.9030276 -0.0277111 0.1074677 0.9028657 -0.0276479 0.1064427 0.9026634 -0.0275966 0.1051696 0.9024114 -0.0275778 0.1035972 0.9020992 -0.0276281 0.1016696 0.9017148 -0.0278105 0.0993306 0.9012461 -0.0282324 0.0965334 0.900682 -0.0290732 0.0932573 0.9000167 -0.0306306 0.0895408 0.8992555 -0.0333932 0.0855374 0.8984278 -0.0381561 0.0816135 0.8976087 -0.0461985 0.0785108 0.8969554 -0.0594506 0.0775151 0.8967447 -0.0775151 0.0775151 0.8967447 -0.1003691 0.0775151 0.8967447 -0.1292823 0.0775151 0.8967447 -0.1658613 0.0775151 0.8967447 -0.2121385 0.0775151 0.8967447 -0.2706852 0.0775151 0.8967447 -0.3447543 0.0775151 0.8967447 -0.4384614 0.0775151 0.8967447 -0.557013 0.0775151 0.8967447 -0.7069963 0.0775151 0.8967447 -0.8967447 0.0775151 0.8967447 -0.9325696 0.1002154 0.7439407 -0.9531389 0.1340017 0.6263473 -0.9661878 0.1775917 0.5473473 -0.9749962 0.2296253 0.5030453 -0.9811943 0.2885124 0.4877437 -0.9856839 0.3523802 0.4954523 -0.9890048 0.419125 0.5203839 -0.9914995 0.4865484 0.5571908 -0.9933953 0.5525411 0.6011414 -0.9948487 0.6152669 0.6482627 -0.9959706 0.6733015 0.6954296 -0.9968409 0.7257011 0.7403765 -0.9975189 0.7719959 0.7816327 -0.9980488 0.8121268 0.8184005 -0.9984638 0.8463492 0.8504035 -0.9987895 0.8751301 0.8777338 -0.9990455 0.8990542 0.9007175 -0.999247 0.9187495 0.9198076 -0.9994057 0.9348352 0.9355059 -0.9995308 0.9478878 0.9483117 -0.9996295 0.9584237 0.958691 -0.9997074 0.9668922 0.9670604 -0.9997688 0.9736756 0.9737814 -0.9998174 0.9790946 0.979161 -0.9998557 0.9834141 0.9834557 -0.999886 0.9868512 0.9868773 -0.9999099 0.9895825 0.9895988 -0.9999288 0.9917504 0.9917606 -0.9999437 0.9934697 0.9934761 -0.0279321 0.1320218 0.9033413 -0.0278872 0.1316144 0.9032596 -0.0278347 0.1311024 0.9031567 -0.0277752 0.1304603 0.9030276 -0.0277111 0.1296569 0.9028657 -0.0276479 0.1286548 0.9026634 -0.0275966 0.1274102 0.9024114 -0.0275778 0.1258729 0.9020992 -0.0276281 0.1239883 0.9017148 -0.0278105 0.1217016 0.9012461 -0.0282324 0.1189666 0.900682 -0.0290732 0.1157634 0.9000167 -0.0306306 0.1121293 0.8992555 -0.0333932 0.1082145 0.8984278 -0.0381561 0.1043773 0.8976087 -0.0461985 0.1013429 0.8969554 -0.0594506 0.1003691 0.8967447 -0.0775151 0.1003691 0.8967447 -0.1003691 0.1003691 0.8967447 -0.1292823 0.1003691 0.8967447 -0.1658613 0.1003691 0.8967447 -0.2121385 0.1003691 0.8967447 -0.2706852 0.1003691 0.8967447 -0.3447543 0.1003691 0.8967447 -0.4384614 0.1003691 0.8967447 -0.557013 0.1003691 0.8967447 -0.7069963 0.1003691 0.8967447 -0.8967447 0.1003691 0.8967447 -0.9325696 0.1181733 0.7439407 -0.9531389 0.1477366 0.6263473 -0.9661878 0.1879067 0.5473473 -0.9749962 0.2372529 0.5030453 -0.9811943 0.2940703 0.4877437 -0.9856839 0.3563715 0.4954523 -0.9890048 0.4219498 0.5203839 -0.9914995 0.4885191 0.5571908 -0.9933953 0.5538969 0.6011414 -0.9948487 0.6161874 0.6482627 -0.9959706 0.6739188 0.6954296 -0.9968409 0.7261105 0.7403765 -0.9975189 0.7722648 0.7816327 -0.9980488 0.8123018 0.8184005 -0.9984638 0.8464623 0.8504035 -0.9987895 0.8752028 0.8777338 -0.9990455 0.8991006 0.9007175 -0.999247 0.9187791 0.9198076 -0.9994057 0.9348539 0.9355059 -0.9995308 0.9478997 0.9483117 -0.9996295 0.9584312 0.958691 -0.9997074 0.9668969 0.9670604 -0.9997688 0.9736786 0.9737814 -0.9998174 0.9790965 0.979161 -0.9998557 0.9834153 0.9834557 -0.999886 0.986852 0.9868773 -0.9999099 0.9895829 0.9895988 -0.9999288 0.9917507 0.9917606 -0.9999437 0.9934698 0.9934761 -0.0279321 0.1600254 0.9033413 -0.0278872 0.1596298 0.9032596 -0.0278347 0.1591327 0.9031567 -0.0277752 0.1585092 0.9030276 -0.0277111 0.157729 0.9028657 -0.0276479 0.156756 0.9026634 -0.0275966 0.1555474 0.9024114 -0.0275778 0.1540546 0.9020992 -0.0276281 0.1522245 0.9017148 -0.0278105 0.1500037 0.9012461 -0.0282324 0.1473476 0.900682 -0.0290732 0.1442365 0.9000167 -0.0306306 0.1407067 0.8992555 -0.0333932 0.136904 0.8984278 -0.0381561 0.1331763 0.8976087 -0.0461985 0.1302284 0.8969554 -0.0594506 0.1292823 0.8967447 -0.0775151 0.1292823 0.8967447 -0.1003691 0.1292823 0.8967447 -0.1292823 0.1292823 0.8967447 -0.1658613 0.1292823 0.8967447 -0.2121385 0.1292823 0.8967447 -0.2706852 0.1292823 0.8967447 -0.3447543 0.1292823 0.8967447 -0.4384614 0.1292823 0.8967447 -0.557013 0.1292823 0.8967447 -0.7069963 0.1292823 0.8967447 -0.8967447 0.1292823 0.8967447 -0.9325696 0.1408925 0.7439407 -0.9531389 0.1651131 0.6263473 -0.9661878 0.2009566 0.5473473 -0.9749962 0.2469027 0.5030453 -0.9811943 0.3011018 0.4877437 -0.9856839 0.3614209 0.4954523 -0.9890048 0.4255236 0.5203839 -0.9914995 0.4910123 0.5571908 -0.9933953 0.5556122 0.6011414 -0.9948487 0.6173519 0.6482627 -0.9959706 0.6746998 0.6954296 -0.9968409 0.7266285 0.7403765 -0.9975189 0.7726049 0.7816327 -0.9980488 0.8125232 0.8184005 -0.9984638 0.8466054 0.8504035 -0.9987895 0.8752947 0.8777338 -0.9990455 0.8991593 0.9007175 -0.999247 0.9188164 0.9198076 -0.9994057 0.9348776 0.9355059 -0.9995308 0.9479146 0.9483117 -0.9996295 0.9584406 0.958691 -0.9997074 0.9669028 0.9670604 -0.9997688 0.9736823 0.9737814 -0.9998174 0.9790988 0.979161 -0.9998557 0.9834167 0.9834557 -0.999886 0.9868529 0.9868773 -0.9999099 0.9895835 0.9895988 -0.9999288 0.991751 0.9917606 -0.9999437 0.9934701 0.9934761 -0.0279321 0.1954535 0.9033413 -0.0278872 0.1950729 0.9032596 -0.0278347 0.1945945 0.9031567 -0.0277752 0.1939946 0.9030276 -0.0277111 0.1932439 0.9028657 -0.0276479 0.1923076 0.9026634 -0.0275966 0.1911446 0.9024114 -0.0275778 0.1897081 0.9020992 -0.0276281 0.1879469 0.9017148 -0.0278105 0.1858097 0.9012461 -0.0282324 0.1832532 0.900682 -0.0290732 0.1802587 0.9000167 -0.0306306 0.1768609 0.8992555 -0.0333932 0.1732 0.8984278 -0.0381561 0.1696109 0.8976087 -0.0461985 0.1667723 0.8969554 -0.0594506 0.1658613 0.8967447 -0.0775151 0.1658613 0.8967447 -0.1003691 0.1658613 0.8967447 -0.1292823 0.1658613 0.8967447 -0.1658613 0.1658613 0.8967447 -0.2121385 0.1658613 0.8967447 -0.2706852 0.1658613 0.8967447 -0.3447543 0.1658613 0.8967447 -0.4384614 0.1658613 0.8967447 -0.557013 0.1658613 0.8967447 -0.7069963 0.1658613 0.8967447 -0.8967447 0.1658613 0.8967447 -0.9325696 0.1696351 0.7439407 -0.9531389 0.1870965 0.6263473 -0.9661878 0.2174663 0.5473473 -0.9749962 0.2591111 0.5030453 -0.9811943 0.3099976 0.4877437 -0.9856839 0.3678092 0.4954523 -0.9890048 0.4300448 0.5203839 -0.9914995 0.4941665 0.5571908 -0.9933953 0.5577822 0.6011414 -0.9948487 0.6188252 0.6482627 -0.9959706 0.6756878 0.6954296 -0.9968409 0.7272837 0.7403765 -0.9975189 0.7730352 0.7816327 -0.9980488 0.8128033 0.8184005 -0.9984638 0.8467864 0.8504035 -0.9987895 0.8754109 0.8777338 -0.9990455 0.8992336 0.9007175 -0.999247 0.9188636 0.9198076 -0.9994057 0.9349075 0.9355059 -0.9995308 0.9479335 0.9483117 -0.9996295 0.9584526 0.958691 -0.9997074 0.9669103 0.9670604 -0.9997688 0.973687 0.9737814 -0.9998174 0.9791018 0.979161 -0.9998557 0.9834186 0.9834557 -0.999886 0.9868541 0.9868773 -0.9999099 0.9895842 0.9895988 -0.9999288 0.9917515 0.9917606 -0.9999437 0.9934704 0.9934761 -0.0279321 0.2402747 0.9033413 -0.0278872 0.239913 0.9032596 -0.0278347 0.2394584 0.9031567 -0.0277752 0.2388883 0.9030276 -0.0277111 0.2381749 0.9028657 -0.0276479 0.2372851 0.9026634 -0.0275966 0.2361798 0.9024114 -0.0275778 0.2348144 0.9020992 -0.0276281 0.2331404 0.9017148 -0.0278105 0.2311088 0.9012461 -0.0282324 0.2286785 0.900682 -0.0290732 0.2258315 0.9000167 -0.0306306 0.2226006 0.8992555 -0.0333932 0.2191191 0.8984278 -0.0381561 0.2157054 0.8976087 -0.0461985 0.2130052 0.8969554 -0.0594506 0.2121385 0.8967447 -0.0775151 0.2121385 0.8967447 -0.1003691 0.2121385 0.8967447 -0.1292823 0.2121385 0.8967447 -0.1658613 0.2121385 0.8967447 -0.2121385 0.2121385 0.8967447 -0.2706852 0.2121385 0.8967447 -0.3447543 0.2121385 0.8967447 -0.4384614 0.2121385 0.8967447 -0.557013 0.2121385 0.8967447 -0.7069963 0.2121385 0.8967447 -0.8967447 0.2121385 0.8967447 -0.9325696 0.2059983 0.7439407 -0.9531389 0.2149085 0.6263473 -0.9661878 0.2383533 0.5473473 -0.9749962 0.2745562 0.5030453 -0.9811943 0.3212519 0.4877437 -0.9856839 0.3758911 0.4954523 -0.9890048 0.4357648 0.5203839 -0.9914995 0.498157 0.5571908 -0.9933953 0.5605276 0.6011414 -0.9948487 0.6206891 0.6482627 -0.9959706 0.6769378 0.6954296 -0.9968409 0.7281127 0.7403765 -0.9975189 0.7735795 0.7816327 -0.9980488 0.8131577 0.8184005 -0.9984638 0.8470154 0.8504035 -0.9987895 0.875558 0.8777338 -0.9990455 0.8993275 0.9007175 -0.999247 0.9189234 0.9198076 -0.9994057 0.9349454 0.9355059 -0.9995308 0.9479575 0.9483117 -0.9996295 0.9584677 0.958691 -0.9997074 0.9669198 0.9670604 -0.9997688 0.973693 0.9737814 -0.9998174 0.9791055 0.979161 -0.9998557 0.9834209 0.9834557 -0.999886 0.9868555 0.9868773 -0.9999099 0.9895851 0.9895988 -0.9999288 0.9917521 0.9917606 -0.9999437 0.9934707 0.9934761 -0.0279321 0.2969793 0.9033413 -0.0278872 0.2966415 0.9032596 -0.0278347 0.2962171 0.9031567 -0.0277752 0.2956846 0.9030276 -0.0277111 0.2950184 0.9028657 -0.0276479 0.2941874 0.9026634 -0.0275966 0.2931551 0.9024114 -0.0275778 0.2918798 0.9020992 -0.0276281 0.290316 0.9017148 -0.0278105 0.2884181 0.9012461 -0.0282324 0.2861474 0.900682 -0.0290732 0.2834869 0.9000167 -0.0306306 0.2804673 0.8992555 -0.0333932 0.2772127 0.8984278 -0.0381561 0.2740209 0.8976087 -0.0461985 0.2714957 0.8969554 -0.0594506 0.2706852 0.8967447 -0.0775151 0.2706852 0.8967447 -0.1003691 0.2706852 0.8967447 -0.1292823 0.2706852 0.8967447 -0.1658613 0.2706852 0.8967447 -0.2121385 0.2706852 0.8967447 -0.2706852 0.2706852 0.8967447 -0.3447543 0.2706852 0.8967447 -0.4384614 0.2706852 0.8967447 -0.557013 0.2706852 0.8967447 -0.7069963 0.2706852 0.8967447 -0.8967447 0.2706852 0.8967447 -0.9325696 0.2520025 0.7439407 -0.9531389 0.2500942 0.6263473 -0.9661878 0.2647781 0.5473473 -0.9749962 0.2940963 0.5030453 -0.9811943 0.3354901 0.4877437 -0.9856839 0.3861159 0.4954523 -0.9890048 0.4430013 0.5203839 -0.9914995 0.5032055 0.5571908 -0.9933953 0.5640008 0.6011414 -0.9948487 0.6230471 0.6482627 -0.9959706 0.6785192 0.6954296 -0.9968409 0.7291615 0.7403765 -0.9975189 0.7742682 0.7816327 -0.9980488 0.8136061 0.8184005 -0.9984638 0.8473052 0.8504035 -0.9987895 0.8757441 0.8777338 -0.9990455 0.8994464 0.9007175 -0.999247 0.918999 0.9198076 -0.9994057 0.9349933 0.9355059 -0.9995308 0.9479878 0.9483117 -0.9996295 0.9584868 0.958691 -0.9997074 0.9669318 0.9670604 -0.9997688 0.9737006 0.9737814 -0.9998174 0.9791103 0.979161 -0.9998557 0.9834239 0.9834557 -0.999886 0.9868574 0.9868773 -0.9999099 0.9895863 0.9895988 -0.9999288 0.9917528 0.9917606 -0.9999437 0.9934712 0.9934761 -0.0279321 0.368718 0.9033413 -0.0278872 0.3684105 0.9032596 -0.0278347 0.3680241 0.9031567 -0.0277752 0.3675394 0.9030276 -0.0277111 0.3669329 0.9028657 -0.0276479 0.3661762 0.9026634 -0.0275966 0.3652362 0.9024114 -0.0275778 0.3640749 0.9020992 -0.0276281 0.3626507 0.9017148 -0.0278105 0.3609218 0.9012461 -0.0282324 0.358853 0.900682 -0.0290732 0.3564286 0.9000167 -0.0306306 0.3536761 0.8992555 -0.0333932 0.3507087 0.8984278 -0.0381561 0.3477976 0.8976087 -0.0461985 0.3454939 0.8969554 -0.0594506 0.3447543 0.8967447 -0.0775151 0.3447543 0.8967447 -0.1003691 0.3447543 0.8967447 -0.1292823 0.3447543 0.8967447 -0.1658613 0.3447543 0.8967447 -0.2121385 0.3447543 0.8967447 -0.2706852 0.3447543 0.8967447 -0.3447543 0.3447543 0.8967447 -0.4384614 0.3447543 0.8967447 -0.557013 0.3447543 0.8967447 -0.7069963 0.3447543 0.8967447 -0.8967447 0.3447543 0.8967447 -0.9325696 0.3102037 0.7439407 -0.9531389 0.2946088 0.6263473 -0.9661878 0.2982089 0.5473473 -0.9749962 0.3188171 0.5030453 -0.9811943 0.3535032 0.4877437 -0.9856839 0.3990515 0.4954523 -0.9890048 0.4521565 0.5203839 -0.9914995 0.5095925 0.5571908 -0.9933953 0.5683949 0.6011414 -0.9948487 0.6260304 0.6482627 -0.9959706 0.6805199 0.6954296 -0.9968409 0.7304884 0.7403765 -0.9975189 0.7751395 0.7816327 -0.9980488 0.8141733 0.8184005 -0.9984638 0.8476717 0.8504035 -0.9987895 0.8759795 0.8777338 -0.9990455 0.8995968 0.9007175 -0.999247 0.9190947 0.9198076 -0.9994057 0.935054 0.9355059 -0.9995308 0.9480261 0.9483117 -0.9996295 0.9585109 0.958691 -0.9997074 0.966947 0.9670604 -0.9997688 0.9737101 0.9737814 -0.9998174 0.9791163 0.979161 -0.9998557 0.9834277 0.9834557 -0.999886 0.9868597 0.9868773 -0.9999099 0.9895878 0.9895988 -0.9999288 0.9917537 0.9917606 -0.9999437 0.9934718 0.9934761 -0.0279321 0.4594768 0.9033413 -0.0278872 0.4592077 0.9032596 -0.0278347 0.4588694 0.9031567 -0.0277752 0.4584451 0.9030276 -0.0277111 0.457914 0.9028657 -0.0276479 0.4572514 0.9026634 -0.0275966 0.4564282 0.9024114 -0.0275778 0.455411 0.9020992 -0.0276281 0.4541634 0.9017148 -0.0278105 0.4526484 0.9012461 -0.0282324 0.4508351 0.900682 -0.0290732 0.4487093 0.9000167 -0.0306306 0.4462949 0.8992555 -0.0333932 0.4436907 0.8984278 -0.0381561 0.4411348 0.8976087 -0.0461985 0.4391112 0.8969554 -0.0594506 0.4384614 0.8967447 -0.0775151 0.4384614 0.8967447 -0.1003691 0.4384614 0.8967447 -0.1292823 0.4384614 0.8967447 -0.1658613 0.4384614 0.8967447 -0.2121385 0.4384614 0.8967447 -0.2706852 0.4384614 0.8967447 -0.3447543 0.4384614 0.8967447 -0.4384614 0.4384614 0.8967447 -0.557013 0.4384614 0.8967447 -0.7069963 0.4384614 0.8967447 -0.8967447 0.4384614 0.8967447 -0.9325696 0.3838358 0.7439407 -0.9531389 0.3509254 0.6263473 -0.9661878 0.3405032 0.5473473 -0.9749962 0.3500921 0.5030453 -0.9811943 0.3762922 0.4877437 -0.9856839 0.4154167 0.4954523 -0.9890048 0.4637389 0.5203839 -0.9914995 0.5176729 0.5571908 -0.9933953 0.573954 0.6011414 -0.9948487 0.6298046 0.6482627 -0.9959706 0.683051 0.6954296 -0.9968409 0.732167 0.7403765 -0.9975189 0.7762418 0.7816327 -0.9980488 0.8148909 0.8184005 -0.9984638 0.8481355 0.8504035 -0.9987895 0.8762773 0.8777338 -0.9990455 0.899787 0.9007175 -0.999247 0.9192157 0.9198076 -0.9994057 0.9351307 0.9355059 -0.9995308 0.9480746 0.9483117 -0.9996295 0.9585415 0.958691 -0.9997074 0.9669663 0.9670604 -0.9997688 0.9737222 0.9737814 -0.9998174 0.9791238 0.979161 -0.9998557 0.9834324 0.9834557 -0.999886 0.9868627 0.9868773 -0.9999099 0.9895897 0.9895988 -0.9999288 0.9917549 0.9917606 -0.9999437 0.9934725 0.9934761 -0.0279321 0.5742985 0.9033413 -0.0278872 0.5740779 0.9032596 -0.0278347 0.5738005 0.9031567 -0.0277752 0.5734525 0.9030276 -0.0277111 0.573017 0.9028657 -0.0276479 0.5724735 0.9026634 -0.0275966 0.571798 0.9024114 -0.0275778 0.5709632 0.9020992 -0.0276281 0.5699388 0.9017148 -0.0278105 0.5686945 0.9012461 -0.0282324 0.5672044 0.900682 -0.0290732 0.5654564 0.9000167 -0.0306306 0.5634696 0.8992555 -0.0333932 0.561325 0.8984278 -0.0381561 0.5592184 0.8976087 -0.0461985 0.5575493 0.8969554 -0.0594506 0.557013 0.8967447 -0.0775151 0.557013 0.8967447 -0.1003691 0.557013 0.8967447 -0.1292823 0.557013 0.8967447 -0.1658613 0.557013 0.8967447 -0.2121385 0.557013 0.8967447 -0.2706852 0.557013 0.8967447 -0.3447543 0.557013 0.8967447 -0.4384614 0.557013 0.8967447 -0.557013 0.557013 0.8967447 -0.7069963 0.557013 0.8967447 -0.8967447 0.557013 0.8967447 -0.9325696 0.4769901 0.7439407 -0.9531389 0.4221733 0.6263473 -0.9661878 0.3940109 0.5473473 -0.9749962 0.389659 0.5030453 -0.9811943 0.4051232 0.4877437 -0.9856839 0.4361208 0.4954523 -0.9890048 0.4783922 0.5203839 -0.9914995 0.5278957 0.5571908 -0.9933953 0.580987 0.6011414 -0.9948487 0.6345795 0.6482627 -0.9959706 0.6862532 0.6954296 -0.9968409 0.7342907 0.7403765 -0.9975189 0.7776364 0.7816327 -0.9980488 0.8157988 0.8184005 -0.9984638 0.8487222 0.8504035 -0.9987895 0.8766541 0.8777338 -0.9990455 0.9000277 0.9007175 -0.999247 0.9193688 0.9198076 -0.9994057 0.9352277 0.9355059 -0.9995308 0.9481359 0.9483117 -0.9996295 0.9585802 0.958691 -0.9997074 0.9669906 0.9670604 -0.9997688 0.9737375 0.9737814 -0.9998174 0.9791334 0.979161 -0.9998557 0.9834385 0.9834557 -0.999886 0.9868665 0.9868773 -0.9999099 0.989592 0.9895988 -0.9999288 0.9917564 0.9917606 -0.9999437 0.9934734 0.9934761 -0.0279321 0.7195629 0.9033413 -0.0278872 0.7194036 0.9032596 -0.0278347 0.7192033 0.9031567 -0.0277752 0.7189519 0.9030276 -0.0277111 0.7186372 0.9028657 -0.0276479 0.7182443 0.9026634 -0.0275966 0.7177558 0.9024114 -0.0275778 0.7171517 0.9020992 -0.0276281 0.7164099 0.9017148 -0.0278105 0.715508 0.9012461 -0.0282324 0.7144267 0.900682 -0.0290732 0.7131566 0.9000167 -0.0306306 0.7117109 0.8992555 -0.0333932 0.7101477 0.8984278 -0.0381561 0.7086095 0.8976087 -0.0461985 0.7073888 0.8969554 -0.0594506 0.7069963 0.8967447 -0.0775151 0.7069963 0.8967447 -0.1003691 0.7069963 0.8967447 -0.1292823 0.7069963 0.8967447 -0.1658613 0.7069963 0.8967447 -0.2121385 0.7069963 0.8967447 -0.2706852 0.7069963 0.8967447 -0.3447543 0.7069963 0.8967447 -0.4384614 0.7069963 0.8967447 -0.557013 0.7069963 0.8967447 -0.7069963 0.7069963 0.8967447 -0.8967447 0.7069963 0.8967447 -0.9325696 0.5948423 0.7439407 -0.9531389 0.5123112 0.6263473 -0.9661878 0.4617052 0.5473473 -0.9749962 0.4397163 0.5030453 -0.9811943 0.4415982 0.4877437 -0.9856839 0.4623142 0.4954523 -0.9890048 0.4969305 0.5203839 -0.9914995 0.5408288 0.5571908 -0.9933953 0.5898847 0.6011414 -0.9948487 0.6406203 0.6482627 -0.9959706 0.6903044 0.6954296 -0.9968409 0.7369774 0.7403765 -0.9975189 0.7794007 0.7816327 -0.9980488 0.8169474 0.8184005 -0.9984638 0.8494644 0.8504035 -0.9987895 0.8771307 0.8777338 -0.9990455 0.9003323 0.9007175 -0.999247 0.9195625 0.9198076 -0.9994057 0.9353505 0.9355059 -0.9995308 0.9482135 0.9483117 -0.9996295 0.9586291 0.958691 -0.9997074 0.9670214 0.9670604 -0.9997688 0.9737569 0.9737814 -0.9998174 0.9791456 0.979161 -0.9998557 0.9834461 0.9834557 -0.999886 0.9868713 0.9868773 -0.9999099 0.989595 0.9895988 -0.9999288 0.9917582 0.9917606 -0.9999437 0.9934746 0.9934761 -0.0279321 0.9033413 0.9033413 -0.0278872 0.9032596 0.9032596 -0.0278347 0.9031567 0.9031567 -0.0277752 0.9030276 0.9030276 -0.0277111 0.9028657 0.9028657 -0.0276479 0.9026634 0.9026634 -0.0275966 0.9024114 0.9024114 -0.0275778 0.9020992 0.9020992 -0.0276281 0.9017148 0.9017148 -0.0278105 0.9012461 0.9012461 -0.0282324 0.900682 0.900682 -0.0290732 0.9000167 0.9000167 -0.0306306 0.8992555 0.8992555 -0.0333932 0.8984278 0.8984278 -0.0381561 0.8976087 0.8976087 -0.0461985 0.8969554 0.8969554 -0.0594506 0.8967447 0.8967447 -0.0775151 0.8967447 0.8967447 -0.1003691 0.8967447 0.8967447 -0.1292823 0.8967447 0.8967447 -0.1658613 0.8967447 0.8967447 -0.2121385 0.8967447 0.8967447 -0.2706852 0.8967447 0.8967447 -0.3447543 0.8967447 0.8967447 -0.4384614 0.8967447 0.8967447 -0.557013 0.8967447 0.8967447 -0.7069963 0.8967447 0.8967447 -0.8967447 0.8967447 0.8967447 -0.9325696 0.7439407 0.7439407 -0.9531389 0.6263473 0.6263473 -0.9661878 0.5473473 0.5473473 -0.9749962 0.5030453 0.5030453 -0.9811943 0.4877437 0.4877437 -0.9856839 0.4954523 0.4954523 -0.9890048 0.5203839 0.5203839 -0.9914995 0.5571908 0.5571908 -0.9933953 0.6011414 0.6011414 -0.9948487 0.6482627 0.6482627 -0.9959706 0.6954296 0.6954296 -0.9968409 0.7403765 0.7403765 -0.9975189 0.7816327 0.7816327 -0.9980488 0.8184005 0.8184005 -0.9984638 0.8504035 0.8504035 -0.9987895 0.8777338 0.8777338 -0.9990455 0.9007175 0.9007175 -0.999247 0.9198076 0.9198076 -0.9994057 0.9355059 0.9355059 -0.9995308 0.9483117 0.9483117 -0.9996295 0.958691 0.958691 -0.9997074 0.9670604 0.9670604 -0.9997688 0.9737814 0.9737814 -0.9998174 0.979161 0.979161 -0.9998557 0.9834557 0.9834557 -0.999886 0.9868773 0.9868773 -0.9999099 0.9895988 0.9895988 -0.9999288 0.9917606 0.9917606 -0.9999437 0.9934761 0.9934761 -0.0624569 0.9354466 0.7522434 -0.0624063 0.9354101 0.7521367 -0.0623458 0.9353643 0.7520027 -0.0622749 0.9353068 0.7518347 -0.0621943 0.9352348 0.7516243 -0.0621069 0.9351449 0.751362 -0.0620199 0.9350332 0.7510361 -0.0619473 0.9348949 0.7506335 -0.061916 0.9347252 0.7501398 -0.0619734 0.9345187 0.7495406 -0.062202 0.9342712 0.7488237 -0.062742 0.9339805 0.7479837 -0.0638283 0.9336494 0.7470302 -0.0658501 0.9332914 0.7460024 -0.0694453 0.9329391 0.7449944 -0.0756464 0.9326595 0.7441968 -0.0860209 0.9325696 0.7439407 -0.1002154 0.9325696 0.7439407 -0.1181733 0.9325696 0.7439407 -0.1408925 0.9325696 0.7439407 -0.1696351 0.9325696 0.7439407 -0.2059983 0.9325696 0.7439407 -0.2520025 0.9325696 0.7439407 -0.3102037 0.9325696 0.7439407 -0.3838358 0.9325696 0.7439407 -0.4769901 0.9325696 0.7439407 -0.5948423 0.9325696 0.7439407 -0.7439407 0.9325696 0.7439407 -0.9325696 0.9325696 0.7439407 -0.9531389 0.7706179 0.6263473 -0.9661878 0.6556956 0.5473473 -0.9749962 0.5831647 0.5030453 -0.9811943 0.5461239 0.4877437 -0.9856839 0.5373763 0.4954523 -0.9890048 0.5500554 0.5203839 -0.9914995 0.577891 0.5571908 -0.9933953 0.6153825 0.6011414 -0.9948487 0.6579314 0.6482627 -0.9959706 0.7019138 0.6954296 -0.9968409 0.7446768 0.7403765 -0.9975189 0.7844566 0.7816327 -0.9980488 0.8202389 0.8184005 -0.9984638 0.8515915 0.8504035 -0.9987895 0.8784967 0.8777338 -0.9990455 0.9012049 0.9007175 -0.999247 0.9201176 0.9198076 -0.9994057 0.9357024 0.9355059 -0.9995308 0.9484359 0.9483117 -0.9996295 0.9587693 0.958691 -0.9997074 0.9671097 0.9670604 -0.9997688 0.9738123 0.9737814 -0.9998174 0.9791804 0.979161 -0.9998557 0.9834679 0.9834557 -0.999886 0.986885 0.9868773 -0.9999099 0.9896036 0.9895988 -0.9999288 0.9917636 0.9917606 -0.9999437 0.9934779 0.9934761 -0.1059991 0.9545467 0.6358098 -0.1059489 0.9545286 0.6356873 -0.1058883 0.9545059 0.6355334 -0.1058162 0.9544774 0.6353404 -0.1057322 0.9544418 0.635099 -0.1056375 0.9543974 0.634798 -0.1055364 0.9543421 0.6344244 -0.1054384 0.9542739 0.6339631 -0.1053624 0.9541902 0.6333979 -0.1053433 0.9540886 0.6327127 -0.1054431 0.9539671 0.6318939 -0.1057683 0.9538247 0.630936 -0.1064997 0.953663 0.6298506 -0.1079385 0.9534887 0.6286829 -0.1105818 0.9533177 0.6275398 -0.1152388 0.9531823 0.6266369 -0.1231452 0.9531389 0.6263473 -0.1340017 0.9531389 0.6263473 -0.1477366 0.9531389 0.6263473 -0.1651131 0.9531389 0.6263473 -0.1870965 0.9531389 0.6263473 -0.2149085 0.9531389 0.6263473 -0.2500942 0.9531389 0.6263473 -0.2946088 0.9531389 0.6263473 -0.3509254 0.9531389 0.6263473 -0.4221733 0.9531389 0.6263473 -0.5123112 0.9531389 0.6263473 -0.6263473 0.9531389 0.6263473 -0.7706179 0.9531389 0.6263473 -0.9531389 0.9531389 0.6263473 -0.9661878 0.7927704 0.5473473 -0.9749962 0.6845262 0.5030453 -0.9811943 0.6199824 0.4877437 -0.9856839 0.5904156 0.4954523 -0.9890048 0.5875938 0.5203839 -0.9914995 0.6040793 0.5571908 -0.9933953 0.6333995 0.6011414 -0.9948487 0.6701635 0.6482627 -0.9959706 0.710117 0.6954296 -0.9968409 0.7501172 0.7403765 -0.9975189 0.7880291 0.7816327 -0.9980488 0.8225647 0.8184005 -0.9984638 0.8530945 0.8504035 -0.9987895 0.8794619 0.8777338 -0.9990455 0.9018215 0.9007175 -0.999247 0.9205098 0.9198076 -0.9994057 0.935951 0.9355059 -0.9995308 0.9485931 0.9483117 -0.9996295 0.9588684 0.958691 -0.9997074 0.967172 0.9670604 -0.9997688 0.9738515 0.9737814 -0.9998174 0.979205 0.979161 -0.9998557 0.9834833 0.9834557 -0.999886 0.9868946 0.9868773 -0.9999099 0.9896096 0.9895988 -0.9999288 0.9917674 0.9917606 -0.9999437 0.9934803 0.9934761 -0.1572498 0.9669269 0.5567544 -0.1572031 0.9669173 0.5566321 -0.1571463 0.9669053 0.5564784 -0.1570779 0.9668902 0.5562858 -0.1569971 0.9668714 0.5560449 -0.156904 0.9668479 0.5557446 -0.1568008 0.9668187 0.5553719 -0.1566936 0.9667827 0.554912 -0.1565954 0.9667385 0.5543488 -0.1565315 0.966685 0.5536664 -0.1565473 0.9666211 0.5528515 -0.1567226 0.9665463 0.5518989 -0.1571937 0.9664615 0.5508205 -0.15819 0.9663702 0.5496615 -0.160092 0.9662809 0.5485282 -0.1635226 0.9662104 0.5476339 -0.1694384 0.9661878 0.5473473 -0.1775917 0.9661878 0.5473473 -0.1879067 0.9661878 0.5473473 -0.2009566 0.9661878 0.5473473 -0.2174663 0.9661878 0.5473473 -0.2383533 0.9661878 0.5473473 -0.2647781 0.9661878 0.5473473 -0.2982089 0.9661878 0.5473473 -0.3405032 0.9661878 0.5473473 -0.3940109 0.9661878 0.5473473 -0.4617052 0.9661878 0.5473473 -0.5473473 0.9661878 0.5473473 -0.6556956 0.9661878 0.5473473 -0.7927704 0.9661878 0.5473473 -0.9661878 0.9661878 0.5473473 -0.9749962 0.8127617 0.5030453 -0.9811943 0.713423 0.4877437 -0.9856839 0.6575172 0.4954523 -0.9890048 0.6350848 0.5203839 -0.9914995 0.637211 0.5571908 -0.9933953 0.6561933 0.6011414 -0.9948487 0.6856388 0.6482627 -0.9959706 0.7204952 0.6954296 -0.9968409 0.757 0.7403765 -0.9975189 0.7925488 0.7816327 -0.9980488 0.8255071 0.8184005 -0.9984638 0.8549959 0.8504035 -0.9987895 0.880683 0.8777338 -0.9990455 0.9026016 0.9007175 -0.999247 0.9210061 0.9198076 -0.9994057 0.9362655 0.9355059 -0.9995308 0.9487918 0.9483117 -0.9996295 0.9589938 0.958691 -0.9997074 0.9672509 0.9670604 -0.9997688 0.9739011 0.9737814 -0.9998174 0.9792361 0.979161 -0.9998557 0.9835029 0.9834557 -0.999886 0.9869069 0.9868773 -0.9999099 0.9896173 0.9895988 -0.9999288 0.9917722 0.9917606 -0.9999437 0.9934833 0.9934761 -0.2151269 0.9754027 0.5115877 -0.2150852 0.9753975 0.5114763 -0.2150342 0.9753908 0.5113363 -0.2149725 0.9753825 0.5111609 -0.2148987 0.9753721 0.5109415 -0.2148124 0.9753591 0.5106681 -0.2147144 0.975343 0.5103288 -0.2146085 0.9753231 0.5099103 -0.2145034 0.9752987 0.509398 -0.2144168 0.9752692 0.5087774 -0.2143816 0.975234 0.5080368 -0.2144566 0.9751928 0.5071716 -0.2147432 0.9751462 0.5061928 -0.2154135 0.9750962 0.5051417 -0.2167545 0.9750472 0.5041146 -0.2192389 0.9750086 0.5033048 -0.2235962 0.9749962 0.5030453 -0.2296253 0.9749962 0.5030453 -0.2372529 0.9749962 0.5030453 -0.2469027 0.9749962 0.5030453 -0.2591111 0.9749962 0.5030453 -0.2745562 0.9749962 0.5030453 -0.2940963 0.9749962 0.5030453 -0.3188171 0.9749962 0.5030453 -0.3500921 0.9749962 0.5030453 -0.389659 0.9749962 0.5030453 -0.4397163 0.9749962 0.5030453 -0.5030453 0.9749962 0.5030453 -0.5831647 0.9749962 0.5030453 -0.6845262 0.9749962 0.5030453 -0.8127617 0.9749962 0.5030453 -0.9749962 0.9749962 0.5030453 -0.9811943 0.8316375 0.4877437 -0.9856839 0.7424095 0.4954523 -0.9890048 0.695167 0.5203839 -0.9914995 0.6791269 0.5571908 -0.9933953 0.6850303 0.6011414 -0.9948487 0.7052169 0.6482627 -0.9959706 0.733625 0.6954296 -0.9968409 0.7657077 0.7403765 -0.9975189 0.7982669 0.7816327 -0.9980488 0.8292297 0.8184005 -0.9984638 0.8574015 0.8504035 -0.9987895 0.8822279 0.8777338 -0.9990455 0.9035886 0.9007175 -0.999247 0.9216339 0.9198076 -0.9994057 0.9366635 0.9355059 -0.9995308 0.9490434 0.9483117 -0.9996295 0.9591524 0.958691 -0.9997074 0.9673508 0.9670604 -0.9997688 0.9739638 0.9737814 -0.9998174 0.9792755 0.979161 -0.9998557 0.9835276 0.9834557 -0.999886 0.9869223 0.9868773 -0.9999099 0.989627 0.9895988 -0.9999288 0.9917782 0.9917606 -0.9999437 0.9934871 0.9934761 -0.2783684 0.9814251 0.4950336 -0.2783325 0.9814221 0.4949383 -0.2782884 0.9814183 0.4948186 -0.2782347 0.9814136 0.4946685 -0.2781701 0.9814076 0.4944808 -0.2780936 0.9814002 0.494247 -0.2780055 0.9813911 0.4939569 -0.2779077 0.9813797 0.4935991 -0.2778058 0.9813659 0.4931613 -0.2777122 0.9813491 0.4926312 -0.2776503 0.9813291 0.4919987 -0.2776626 0.9813057 0.4912602 -0.2778236 0.9812792 0.4904253 -0.2782606 0.9812508 0.4895292 -0.2791873 0.9812231 0.4886542 -0.2809573 0.9812013 0.4879646 -0.2841192 0.9811943 0.4877437 -0.2885124 0.9811943 0.4877437 -0.2940703 0.9811943 0.4877437 -0.3011018 0.9811943 0.4877437 -0.3099976 0.9811943 0.4877437 -0.3212519 0.9811943 0.4877437 -0.3354901 0.9811943 0.4877437 -0.3535032 0.9811943 0.4877437 -0.3762922 0.9811943 0.4877437 -0.4051232 0.9811943 0.4877437 -0.4415982 0.9811943 0.4877437 -0.4877437 0.9811943 0.4877437 -0.5461239 0.9811943 0.4877437 -0.6199824 0.9811943 0.4877437 -0.713423 0.9811943 0.4877437 -0.8316375 0.9811943 0.4877437 -0.9811943 0.9811943 0.4877437 -0.9856839 0.8498092 0.4954523 -0.9890048 0.7711789 0.5203839 -0.9914995 0.7321559 0.5571908 -0.9933953 0.721513 0.6011414 -0.9948487 0.7299859 0.6482627 -0.9959706 0.7502359 0.6954296 -0.9968409 0.776724 0.7403765 -0.9975189 0.8055009 0.7816327 -0.9980488 0.8339392 0.8184005 -0.9984638 0.8604449 0.8504035 -0.9987895 0.8841823 0.8777338 -0.9990455 0.9048372 0.9007175 -0.999247 0.9224281 0.9198076 -0.9994057 0.9371669 0.9355059 -0.9995308 0.9493615 0.9483117 -0.9996295 0.959353 0.958691 -0.9997074 0.967477 0.9670604 -0.9997688 0.9740432 0.9737814 -0.9998174 0.9793253 0.979161 -0.9998557 0.9835588 0.9834557 -0.999886 0.9869419 0.9868773 -0.9999099 0.9896392 0.9895988 -0.9999288 0.9917859 0.9917606 -0.9999437 0.9934919 0.9934761 -0.3454107 0.9858181 0.5013914 -0.3453807 0.9858163 0.5013136 -0.3453439 0.9858141 0.5012158 -0.3452987 0.9858113 0.5010933 -0.3452442 0.9858079 0.5009401 -0.3451791 0.9858036 0.5007493 -0.3451032 0.9857982 0.5005126 -0.3450175 0.9857916 0.5002207 -0.3449254 0.9857835 0.4998636 -0.3448353 0.9857738 0.4994313 -0.3447636 0.9857621 0.4989158 -0.3447407 0.9857485 0.498314 -0.3448204 0.9857332 0.497634 -0.3450957 0.9857167 0.4969046 -0.3457234 0.9857006 0.4961927 -0.3469645 0.9856879 0.4956319 -0.3492254 0.9856839 0.4954523 -0.3523802 0.9856839 0.4954523 -0.3563715 0.9856839 0.4954523 -0.3614209 0.9856839 0.4954523 -0.3678092 0.9856839 0.4954523 -0.3758911 0.9856839 0.4954523 -0.3861159 0.9856839 0.4954523 -0.3990515 0.9856839 0.4954523 -0.4154167 0.9856839 0.4954523 -0.4361208 0.9856839 0.4954523 -0.4623142 0.9856839 0.4954523 -0.4954523 0.9856839 0.4954523 -0.5373763 0.9856839 0.4954523 -0.5904156 0.9856839 0.4954523 -0.6575172 0.9856839 0.4954523 -0.7424095 0.9856839 0.4954523 -0.8498092 0.9856839 0.4954523 -0.9856839 0.9856839 0.4954523 -0.9890048 0.8673437 0.5203839 -0.9914995 0.7992446 0.5571908 -0.9933953 0.7676683 0.6011414 -0.9948487 0.7613218 0.6482627 -0.9959706 0.7712508 0.6954296 -0.9968409 0.7906611 0.7403765 -0.9975189 0.8146529 0.7816327 -0.9980488 0.8398974 0.8184005 -0.9984638 0.8642952 0.8504035 -0.9987895 0.886655 0.8777338 -0.9990455 0.9064168 0.9007175 -0.999247 0.9234329 0.9198076 -0.9994057 0.9378038 0.9355059 -0.9995308 0.9497641 0.9483117 -0.9996295 0.9596068 0.958691 -0.9997074 0.9676368 0.9670604 -0.9997688 0.9741436 0.9737814 -0.9998174 0.9793883 0.979161 -0.9998557 0.9835983 0.9834557 -0.999886 0.9869667 0.9868773 -0.9999099 0.9896547 0.9895988 -0.9999288 0.9917956 0.9917606 -0.9999437 0.993498 0.9934761 -0.4144197 0.9890841 0.5250451 -0.4143955 0.9890831 0.5249839 -0.4143657 0.9890818 0.5249071 -0.414329 0.9890801 0.5248108 -0.4142845 0.9890781 0.5246904 -0.4142311 0.9890755 0.5245404 -0.4141683 0.9890723 0.5243544 -0.4140964 0.9890684 0.5241251 -0.4140176 0.9890637 0.5238445 -0.4139373 0.9890579 0.523505 -0.4138668 0.989051 0.5231002 -0.4138277 0.989043 0.5226279 -0.4138582 0.9890339 0.5220943 -0.4140252 0.9890241 0.5215222 -0.4144423 0.9890146 0.5209641 -0.4152991 0.9890072 0.5205246 -0.4168922 0.9890048 0.5203839 -0.419125 0.9890048 0.5203839 -0.4219498 0.9890048 0.5203839 -0.4255236 0.9890048 0.5203839 -0.4300448 0.9890048 0.5203839 -0.4357648 0.9890048 0.5203839 -0.4430013 0.9890048 0.5203839 -0.4521565 0.9890048 0.5203839 -0.4637389 0.9890048 0.5203839 -0.4783922 0.9890048 0.5203839 -0.4969305 0.9890048 0.5203839 -0.5203839 0.9890048 0.5203839 -0.5500554 0.9890048 0.5203839 -0.5875938 0.9890048 0.5203839 -0.6350848 0.9890048 0.5203839 -0.695167 0.9890048 0.5203839 -0.7711789 0.9890048 0.5203839 -0.8673437 0.9890048 0.5203839 -0.9890048 0.9890048 0.5203839 -0.9914995 0.8841204 0.5571908 -0.9933953 0.8260608 0.6011414 -0.9948487 0.8009659 0.6482627 -0.9959706 0.7978374 0.6954296 -0.9968409 0.8082934 0.7403765 -0.9975189 0.8262314 0.7816327 -0.9980488 0.8474353 0.8184005 -0.9984638 0.8691663 0.8504035 -0.9987895 0.8897832 0.8777338 -0.9990455 0.9084153 0.9007175 -0.999247 0.9247041 0.9198076 -0.9994057 0.9386096 0.9355059 -0.9995308 0.9502734 0.9483117 -0.9996295 0.959928 0.958691 -0.9997074 0.9678389 0.9670604 -0.9997688 0.9742706 0.9737814 -0.9998174 0.9794681 0.979161 -0.9998557 0.9836483 0.9834557 -0.999886 0.986998 0.9868773 -0.9999099 0.9896744 0.9895988 -0.9999288 0.9918079 0.9917606 -0.9999437 0.9935057 0.9934761 -0.4834235 0.9915469 0.560735 -0.4834045 0.9915463 0.5606884 -0.4833811 0.9915455 0.5606299 -0.4833522 0.9915446 0.5605565 -0.4833171 0.9915433 0.5604649 -0.4832747 0.9915418 0.5603507 -0.4832246 0.9915399 0.5602091 -0.4831666 0.9915376 0.5600346 -0.4831021 0.9915347 0.5598211 -0.4830346 0.9915312 0.5595628 -0.4829718 0.9915271 0.5592549 -0.4829286 0.9915223 0.5588958 -0.4829319 0.9915169 0.5584902 -0.4830292 0.991511 0.5580554 -0.4833013 0.9915054 0.5576314 -0.4838841 0.9915009 0.5572977 -0.4849907 0.9914995 0.5571908 -0.4865484 0.9914995 0.5571908 -0.4885191 0.9914995 0.5571908 -0.4910123 0.9914995 0.5571908 -0.4941665 0.9914995 0.5571908 -0.498157 0.9914995 0.5571908 -0.5032055 0.9914995 0.5571908 -0.5095925 0.9914995 0.5571908 -0.5176729 0.9914995 0.5571908 -0.5278957 0.9914995 0.5571908 -0.5408288 0.9914995 0.5571908 -0.5571908 0.9914995 0.5571908 -0.577891 0.9914995 0.5571908 -0.6040793 0.9914995 0.5571908 -0.637211 0.9914995 0.5571908 -0.6791269 0.9914995 0.5571908 -0.7321559 0.9914995 0.5571908 -0.7992446 0.9914995 0.5571908 -0.8841204 0.9914995 0.5571908 -0.9914995 0.9914995 0.5571908 -0.9933953 0.8999349 0.6011414 -0.9948487 0.8511207 0.6482627 -0.9959706 0.8314729 0.6954296 -0.9968409 0.8306004 0.7403765 -0.9975189 0.8408797 0.7816327 -0.9980488 0.8569716 0.8184005 -0.9984638 0.875329 0.8504035 -0.9987895 0.8937407 0.8777338 -0.9990455 0.9109436 0.9007175 -0.999247 0.9263124 0.9198076 -0.9994057 0.939629 0.9355059 -0.9995308 0.9509177 0.9483117 -0.9996295 0.9603343 0.958691 -0.9997074 0.9680946 0.9670604 -0.9997688 0.9744313 0.9737814 -0.9998174 0.9795689 0.979161 -0.9998557 0.9837116 0.9834557 -0.999886 0.9870376 0.9868773 -0.9999099 0.9896992 0.9895988 -0.9999288 0.9918234 0.9917606 -0.9999437 0.9935154 0.9934761 -0.5504963 0.993424 0.603762 -0.5504818 0.9934236 0.6037276 -0.550464 0.9934231 0.6036842 -0.5504419 0.9934225 0.60363 -0.550415 0.9934218 0.6035621 -0.5503825 0.9934209 0.6034776 -0.5503438 0.9934197 0.6033728 -0.5502987 0.9934183 0.6032437 -0.550248 0.9934166 0.6030857 -0.5501939 0.9934145 0.6028946 -0.5501416 0.993412 0.6026669 -0.5501012 0.9934091 0.6024013 -0.5500915 0.9934058 0.6021014 -0.5501456 0.9934023 0.6017801 -0.5503203 0.9933988 0.6014668 -0.5507113 0.9933961 0.6012203 -0.5514695 0.9933953 0.6011414 -0.5525411 0.9933953 0.6011414 -0.5538969 0.9933953 0.6011414 -0.5556122 0.9933953 0.6011414 -0.5577822 0.9933953 0.6011414 -0.5605276 0.9933953 0.6011414 -0.5640008 0.9933953 0.6011414 -0.5683949 0.9933953 0.6011414 -0.573954 0.9933953 0.6011414 -0.580987 0.9933953 0.6011414 -0.5898847 0.9933953 0.6011414 -0.6011414 0.9933953 0.6011414 -0.6153825 0.9933953 0.6011414 -0.6333995 0.9933953 0.6011414 -0.6561933 0.9933953 0.6011414 -0.6850303 0.9933953 0.6011414 -0.721513 0.9933953 0.6011414 -0.7676683 0.9933953 0.6011414 -0.8260608 0.9933953 0.6011414 -0.8999349 0.9933953 0.6011414 -0.9933953 0.9933953 0.6011414 -0.9948487 0.9145732 0.6482627 -0.9959706 0.8740262 0.6954296 -0.9968409 0.8588218 0.7403765 -0.9975189 0.8594117 0.7816327 -0.9980488 0.8690364 0.8184005 -0.9984638 0.8831255 0.8504035 -0.9987895 0.8987476 0.8777338 -0.9990455 0.9141422 0.9007175 -0.999247 0.928347 0.9198076 -0.9994057 0.9409186 0.9355059 -0.9995308 0.9517328 0.9483117 -0.9996295 0.9608482 0.958691 -0.9997074 0.9684181 0.9670604 -0.9997688 0.9746346 0.9737814 -0.9998174 0.9796966 0.979161 -0.9998557 0.9837916 0.9834557 -0.999886 0.9870878 0.9868773 -0.9999099 0.9897306 0.9895988 -0.9999288 0.9918431 0.9917606 -0.9999437 0.9935277 0.9934761 -0.6139459 0.9948662 0.6501531 -0.6139352 0.994866 0.6501282 -0.6139219 0.9948657 0.6500969 -0.6139056 0.9948653 0.6500577 -0.6138855 0.9948649 0.6500088 -0.6138613 0.9948643 0.6499478 -0.6138323 0.9948636 0.6498721 -0.6137984 0.9948628 0.6497789 -0.6137599 0.9948617 0.6496649 -0.6137183 0.9948604 0.649527 -0.6136769 0.9948589 0.6493627 -0.6136427 0.9948571 0.6491711 -0.6136284 0.9948551 0.6489548 -0.6136569 0.994853 0.6487231 -0.6137675 0.9948509 0.6484973 -0.6140266 0.9948493 0.6483196 -0.6145393 0.9948487 0.6482627 -0.6152669 0.9948487 0.6482627 -0.6161874 0.9948487 0.6482627 -0.6173519 0.9948487 0.6482627 -0.6188252 0.9948487 0.6482627 -0.6206891 0.9948487 0.6482627 -0.6230471 0.9948487 0.6482627 -0.6260304 0.9948487 0.6482627 -0.6298046 0.9948487 0.6482627 -0.6345795 0.9948487 0.6482627 -0.6406203 0.9948487 0.6482627 -0.6482627 0.9948487 0.6482627 -0.6579314 0.9948487 0.6482627 -0.6701635 0.9948487 0.6482627 -0.6856388 0.9948487 0.6482627 -0.7052169 0.9948487 0.6482627 -0.7299859 0.9948487 0.6482627 -0.7613218 0.9948487 0.6482627 -0.8009659 0.9948487 0.6482627 -0.8511207 0.9948487 0.6482627 -0.9145732 0.9948487 0.6482627 -0.9948487 0.9948487 0.6482627 -0.9959706 0.9278617 0.6954296 -0.9968409 0.8945255 0.7403765 -0.9975189 0.8828571 0.7816327 -0.9980488 0.8842998 0.8184005 -0.9984638 0.892989 0.8504035 -0.9987895 0.9050819 0.8777338 -0.9990455 0.9181889 0.9007175 -0.999247 0.9309211 0.9198076 -0.9994057 0.9425502 0.9355059 -0.9995308 0.952764 0.9483117 -0.9996295 0.9614985 0.958691 -0.9997074 0.9688274 0.9670604 -0.9997688 0.9748918 0.9737814 -0.9998174 0.979858 0.979161 -0.9998557 0.9838928 0.9834557 -0.999886 0.9871512 0.9868773 -0.9999099 0.9897703 0.9895988 -0.9999288 0.991868 0.9917606 -0.9999437 0.9935432 0.9934761 -0.6724572 0.9959813 0.6967634 -0.6724495 0.9959811 0.6967458 -0.6724399 0.9959809 0.6967237 -0.672428 0.9959807 0.6966961 -0.6724135 0.9959804 0.6966615 -0.6723959 0.9959801 0.6966184 -0.6723748 0.9959797 0.696565 -0.67235 0.9959791 0.6964992 -0.6723217 0.9959785 0.6964188 -0.6722907 0.9959777 0.6963214 -0.6722594 0.9959768 0.6962055 -0.6722322 0.9959757 0.6960703 -0.672218 0.9959745 0.6959177 -0.672232 0.9959732 0.6957543 -0.6723012 0.9959719 0.695595 -0.6724711 0.9959709 0.6954697 -0.6728136 0.9959706 0.6954296 -0.6733015 0.9959706 0.6954296 -0.6739188 0.9959706 0.6954296 -0.6746998 0.9959706 0.6954296 -0.6756878 0.9959706 0.6954296 -0.6769378 0.9959706 0.6954296 -0.6785192 0.9959706 0.6954296 -0.6805199 0.9959706 0.6954296 -0.683051 0.9959706 0.6954296 -0.6862532 0.9959706 0.6954296 -0.6903044 0.9959706 0.6954296 -0.6954296 0.9959706 0.6954296 -0.7019138 0.9959706 0.6954296 -0.710117 0.9959706 0.6954296 -0.7204952 0.9959706 0.6954296 -0.733625 0.9959706 0.6954296 -0.7502359 0.9959706 0.6954296 -0.7712508 0.9959706 0.6954296 -0.7978374 0.9959706 0.6954296 -0.8314729 0.9959706 0.6954296 -0.8740262 0.9959706 0.6954296 -0.9278617 0.9959706 0.6954296 -0.9959706 0.9959706 0.6954296 -0.9968409 0.9396953 0.7403765 -0.9975189 0.9125186 0.7816327 -0.9980488 0.9036101 0.8184005 -0.9984638 0.9054678 0.8504035 -0.9987895 0.9130957 0.8777338 -0.9990455 0.9233085 0.9007175 -0.999247 0.9341777 0.9198076 -0.9994057 0.9446144 0.9355059 -0.9995308 0.9540687 0.9483117 -0.9996295 0.9623212 0.958691 -0.9997074 0.9693452 0.9670604 -0.9997688 0.9752172 0.9737814 -0.9998174 0.9800622 0.979161 -0.9998557 0.9840209 0.9834557 -0.999886 0.9872315 0.9868773 -0.9999099 0.9898206 0.9895988 -0.9999288 0.9918994 0.9917606 -0.9999437 0.9935629 0.9934761 -0.7251659 0.9968475 0.7412993 -0.7251605 0.9968474 0.7412871 -0.7251537 0.9968473 0.7412718 -0.7251454 0.9968472 0.7412527 -0.7251351 0.996847 0.7412287 -0.7251226 0.9968468 0.7411989 -0.7251076 0.9968465 0.7411619 -0.7250899 0.9968462 0.7411164 -0.7250697 0.9968458 0.7410607 -0.7250473 0.9968453 0.7409934 -0.7250244 0.9968448 0.7409131 -0.7250039 0.9968441 0.7408196 -0.7249916 0.9968433 0.7407141 -0.7249978 0.9968425 0.740601 -0.7250408 0.9968418 0.7404909 -0.7251511 0.9968411 0.7404042 -0.7253775 0.9968409 0.7403765 -0.7257011 0.9968409 0.7403765 -0.7261105 0.9968409 0.7403765 -0.7266285 0.9968409 0.7403765 -0.7272837 0.9968409 0.7403765 -0.7281127 0.9968409 0.7403765 -0.7291615 0.9968409 0.7403765 -0.7304884 0.9968409 0.7403765 -0.732167 0.9968409 0.7403765 -0.7342907 0.9968409 0.7403765 -0.7369774 0.9968409 0.7403765 -0.7403765 0.9968409 0.7403765 -0.7446768 0.9968409 0.7403765 -0.7501172 0.9968409 0.7403765 -0.757 0.9968409 0.7403765 -0.7657077 0.9968409 0.7403765 -0.776724 0.9968409 0.7403765 -0.7906611 0.9968409 0.7403765 -0.8082934 0.9968409 0.7403765 -0.8306004 0.9968409 0.7403765 -0.8588218 0.9968409 0.7403765 -0.8945255 0.9968409 0.7403765 -0.9396953 0.9968409 0.7403765 -0.9968409 0.9968409 0.7403765 -0.9975189 0.9500442 0.7816327 -0.9980488 0.9280401 0.8184005 -0.9984638 0.921255 0.8504035 -0.9987895 0.9232341 0.8777338 -0.9990455 0.9297854 0.9007175 -0.999247 0.9382977 0.9198076 -0.9994057 0.9472259 0.9355059 -0.9995308 0.9557192 0.9483117 -0.9996295 0.963362 0.958691 -0.9997074 0.9700002 0.9670604 -0.9997688 0.9756289 0.9737814 -0.9998174 0.9803206 0.979161 -0.9998557 0.9841829 0.9834557 -0.999886 0.987333 0.9868773 -0.9999099 0.9898842 0.9895988 -0.9999288 0.9919392 0.9917606 -0.9999437 0.9935878 0.9934761 -0.7716588 0.997523 0.7822603 -0.7716551 0.997523 0.782252 -0.7716504 0.9975229 0.7822416 -0.7716446 0.9975228 0.7822286 -0.7716375 0.9975227 0.7822123 -0.7716288 0.9975226 0.782192 -0.7716184 0.9975224 0.7821669 -0.7716061 0.9975222 0.7821359 -0.7715919 0.997522 0.782098 -0.7715762 0.9975217 0.7820522 -0.7715599 0.9975213 0.7819976 -0.7715449 0.9975209 0.781934 -0.7715352 0.9975204 0.7818622 -0.7715376 0.9975199 0.7817854 -0.7715641 0.9975194 0.7817105 -0.7716352 0.9975191 0.7816516 -0.7717834 0.9975189 0.7816327 -0.7719959 0.9975189 0.7816327 -0.7722648 0.9975189 0.7816327 -0.7726049 0.9975189 0.7816327 -0.7730352 0.9975189 0.7816327 -0.7735795 0.9975189 0.7816327 -0.7742682 0.9975189 0.7816327 -0.7751395 0.9975189 0.7816327 -0.7762418 0.9975189 0.7816327 -0.7776364 0.9975189 0.7816327 -0.7794007 0.9975189 0.7816327 -0.7816327 0.9975189 0.7816327 -0.7844566 0.9975189 0.7816327 -0.7880291 0.9975189 0.7816327 -0.7925488 0.9975189 0.7816327 -0.7982669 0.9975189 0.7816327 -0.8055009 0.9975189 0.7816327 -0.8146529 0.9975189 0.7816327 -0.8262314 0.9975189 0.7816327 -0.8408797 0.9975189 0.7816327 -0.8594117 0.9975189 0.7816327 -0.8828571 0.9975189 0.7816327 -0.9125186 0.9975189 0.7816327 -0.9500442 0.9975189 0.7816327 -0.9975189 0.9975189 0.7816327 -0.9980488 0.9589472 0.8184005 -0.9984638 0.9412278 0.8504035 -0.9987895 0.9360606 0.8777338 -0.9990455 0.9379796 0.9007175 -0.999247 0.94351 0.9198076 -0.9994057 0.9505298 0.9355059 -0.9995308 0.9578074 0.9483117 -0.9996295 0.9646787 0.958691 -0.9997074 0.970829 0.9670604 -0.9997688 0.9761497 0.9737814 -0.9998174 0.9806476 0.979161 -0.9998557 0.984388 0.9834557 -0.999886 0.9874615 0.9868773 -0.9999099 0.9899646 0.9895988 -0.9999288 0.9919896 0.9917606 -0.9999437 0.9936193 0.9934761 -0.8119154 0.9980513 0.8188211 -0.8119128 0.9980512 0.8188155 -0.8119096 0.9980512 0.8188085 -0.8119057 0.9980511 0.8187998 -0.8119009 0.9980511 0.8187889 -0.8118949 0.998051 0.8187753 -0.8118878 0.9980509 0.8187584 -0.8118794 0.9980508 0.8187377 -0.8118697 0.9980506 0.8187123 -0.8118589 0.9980504 0.8186816 -0.8118476 0.9980502 0.818645 -0.811837 0.99805 0.8186024 -0.8118298 0.9980497 0.8185543 -0.8118303 0.9980494 0.8185028 -0.8118466 0.9980491 0.8184526 -0.8118921 0.9980488 0.8184132 -0.8119884 0.9980488 0.8184005 -0.8121268 0.9980488 0.8184005 -0.8123018 0.9980488 0.8184005 -0.8125232 0.9980488 0.8184005 -0.8128033 0.9980488 0.8184005 -0.8131577 0.9980488 0.8184005 -0.8136061 0.9980488 0.8184005 -0.8141733 0.9980488 0.8184005 -0.8148909 0.9980488 0.8184005 -0.8157988 0.9980488 0.8184005 -0.8169474 0.9980488 0.8184005 -0.8184005 0.9980488 0.8184005 -0.8202389 0.9980488 0.8184005 -0.8225647 0.9980488 0.8184005 -0.8255071 0.9980488 0.8184005 -0.8292297 0.9980488 0.8184005 -0.8339392 0.9980488 0.8184005 -0.8398974 0.9980488 0.8184005 -0.8474353 0.9980488 0.8184005 -0.8569716 0.9980488 0.8184005 -0.8690364 0.9980488 0.8184005 -0.8842998 0.9980488 0.8184005 -0.9036101 0.9980488 0.8184005 -0.9280401 0.9980488 0.8184005 -0.9589472 0.9980488 0.8184005 -0.9980488 0.9980488 0.8184005 -0.9984638 0.9664961 0.8504035 -0.9987895 0.9522877 0.8777338 -0.9990455 0.9483463 0.9007175 -0.999247 0.9501042 0.9198076 -0.9994057 0.9547096 0.9355059 -0.9995308 0.9604492 0.9483117 -0.9996295 0.9663445 0.958691 -0.9997074 0.9718774 0.9670604 -0.9997688 0.9768086 0.9737814 -0.9998174 0.9810611 0.979161 -0.9998557 0.9846473 0.9834557 -0.999886 0.987624 0.9868773 -0.9999099 0.9900664 0.9895988 -0.9999288 0.9920533 0.9917606 -0.9999437 0.9936592 0.9934761 -0.8462171 0.9984653 0.8506817 -0.8462154 0.9984653 0.850678 -0.8462132 0.9984653 0.8506734 -0.8462106 0.9984653 0.8506676 -0.8462073 0.9984652 0.8506604 -0.8462034 0.9984652 0.8506514 -0.8461986 0.9984651 0.8506403 -0.8461929 0.998465 0.8506265 -0.8461864 0.9984649 0.8506097 -0.8461791 0.9984648 0.8505894 -0.8461714 0.9984647 0.8505652 -0.8461641 0.9984645 0.850537 -0.8461589 0.9984643 0.8505052 -0.8461587 0.9984642 0.8504711 -0.8461687 0.998464 0.8504379 -0.8461977 0.9984638 0.8504118 -0.8462598 0.9984638 0.8504035 -0.8463492 0.9984638 0.8504035 -0.8464623 0.9984638 0.8504035 -0.8466054 0.9984638 0.8504035 -0.8467864 0.9984638 0.8504035 -0.8470154 0.9984638 0.8504035 -0.8473052 0.9984638 0.8504035 -0.8476717 0.9984638 0.8504035 -0.8481355 0.9984638 0.8504035 -0.8487222 0.9984638 0.8504035 -0.8494644 0.9984638 0.8504035 -0.8504035 0.9984638 0.8504035 -0.8515915 0.9984638 0.8504035 -0.8530945 0.9984638 0.8504035 -0.8549959 0.9984638 0.8504035 -0.8574015 0.9984638 0.8504035 -0.8604449 0.9984638 0.8504035 -0.8642952 0.9984638 0.8504035 -0.8691663 0.9984638 0.8504035 -0.875329 0.9984638 0.8504035 -0.8831255 0.9984638 0.8504035 -0.892989 0.9984638 0.8504035 -0.9054678 0.9984638 0.8504035 -0.921255 0.9984638 0.8504035 -0.9412278 0.9984638 0.8504035 -0.9664961 0.9984638 0.8504035 -0.9984638 0.9984638 0.8504035 -0.9987895 0.9728171 0.8777338 -0.9990455 0.9614615 0.9007175 -0.999247 0.9584468 0.9198076 -0.9994057 0.9599976 0.9355059 -0.9995308 0.9637914 0.9483117 -0.9996295 0.968452 0.958691 -0.9997074 0.9732039 0.9670604 -0.9997688 0.9776422 0.9737814 -0.9998174 0.9815844 0.979161 -0.9998557 0.9849754 0.9834557 -0.999886 0.9878296 0.9868773 -0.9999099 0.9901951 0.9895988 -0.9999288 0.9921339 0.9917606 -0.9999437 0.9937096 0.9934761 -0.8750477 0.9987905 0.8779159 -0.8750466 0.9987905 0.8779135 -0.8750451 0.9987904 0.8779105 -0.8750434 0.9987904 0.8779067 -0.8750412 0.9987904 0.877902 -0.8750386 0.9987904 0.8778961 -0.8750355 0.9987903 0.8778888 -0.8750317 0.9987903 0.8778798 -0.8750274 0.9987902 0.8778688 -0.8750225 0.9987902 0.8778555 -0.8750173 0.9987901 0.8778396 -0.8750124 0.99879 0.8778212 -0.8750088 0.9987899 0.8778003 -0.8750084 0.9987897 0.877778 -0.8750145 0.9987896 0.8777563 -0.8750329 0.9987895 0.8777392 -0.8750727 0.9987895 0.8777338 -0.8751301 0.9987895 0.8777338 -0.8752028 0.9987895 0.8777338 -0.8752947 0.9987895 0.8777338 -0.8754109 0.9987895 0.8777338 -0.875558 0.9987895 0.8777338 -0.8757441 0.9987895 0.8777338 -0.8759795 0.9987895 0.8777338 -0.8762773 0.9987895 0.8777338 -0.8766541 0.9987895 0.8777338 -0.8771307 0.9987895 0.8777338 -0.8777338 0.9987895 0.8777338 -0.8784967 0.9987895 0.8777338 -0.8794619 0.9987895 0.8777338 -0.880683 0.9987895 0.8777338 -0.8822279 0.9987895 0.8777338 -0.8841823 0.9987895 0.8777338 -0.886655 0.9987895 0.8777338 -0.8897832 0.9987895 0.8777338 -0.8937407 0.9987895 0.8777338 -0.8987476 0.9987895 0.8777338 -0.9050819 0.9987895 0.8777338 -0.9130957 0.9987895 0.8777338 -0.9232341 0.9987895 0.8777338 -0.9360606 0.9987895 0.8777338 -0.9522877 0.9987895 0.8777338 -0.9728171 0.9987895 0.8777338 -0.9987895 0.9987895 0.8777338 -0.9990455 0.9780539 0.9007175 -0.999247 0.9690013 0.9198076 -0.9994057 0.9666876 0.9355059 -0.9995308 0.9680197 0.9483117 -0.9996295 0.9711183 0.958691 -0.9997074 0.974882 0.9670604 -0.9997688 0.9786968 0.9737814 -0.9998174 0.9822464 0.979161 -0.9998557 0.9853905 0.9834557 -0.999886 0.9880897 0.9868773 -0.9999099 0.990358 0.9895988 -0.9999288 0.9922358 0.9917606 -0.9999437 0.9937734 0.9934761 -0.8990028 0.9990461 0.9008357 -0.899002 0.9990461 0.9008341 -0.8990011 0.9990461 0.9008322 -0.899 0.9990461 0.9008297 -0.8989986 0.9990461 0.9008267 -0.8989969 0.9990461 0.9008228 -0.8989948 0.9990461 0.9008181 -0.8989923 0.999046 0.9008122 -0.8989895 0.999046 0.9008051 -0.8989863 0.9990459 0.9007965 -0.8989829 0.9990459 0.9007862 -0.8989796 0.9990458 0.9007742 -0.8989771 0.9990458 0.9007607 -0.8989767 0.9990457 0.9007462 -0.8989805 0.9990456 0.9007321 -0.8989921 0.9990456 0.9007211 -0.8990175 0.9990455 0.9007175 -0.8990542 0.9990455 0.9007175 -0.8991006 0.9990455 0.9007175 -0.8991593 0.9990455 0.9007175 -0.8992336 0.9990455 0.9007175 -0.8993275 0.9990455 0.9007175 -0.8994464 0.9990455 0.9007175 -0.8995968 0.9990455 0.9007175 -0.899787 0.9990455 0.9007175 -0.9000277 0.9990455 0.9007175 -0.9003323 0.9990455 0.9007175 -0.9007175 0.9990455 0.9007175 -0.9012049 0.9990455 0.9007175 -0.9018215 0.9990455 0.9007175 -0.9026016 0.9990455 0.9007175 -0.9035886 0.9990455 0.9007175 -0.9048372 0.9990455 0.9007175 -0.9064168 0.9990455 0.9007175 -0.9084153 0.9990455 0.9007175 -0.9109436 0.9990455 0.9007175 -0.9141422 0.9990455 0.9007175 -0.9181889 0.9990455 0.9007175 -0.9233085 0.9990455 0.9007175 -0.9297854 0.9990455 0.9007175 -0.9379796 0.9990455 0.9007175 -0.9483463 0.9990455 0.9007175 -0.9614615 0.9990455 0.9007175 -0.9780539 0.9990455 0.9007175 -0.9990455 0.9990455 0.9007175 -0.999247 0.982354 0.9198076 -0.9994057 0.9751513 0.9355059 -0.9995308 0.9733691 0.9483117 -0.9996295 0.9744915 0.958691 -0.9997074 0.977005 0.9670604 -0.9997688 0.980031 0.9737814 -0.9998174 0.9830838 0.979161 -0.9998557 0.9859157 0.9834557 -0.999886 0.9884188 0.9868773 -0.9999099 0.9905641 0.9895988 -0.9999288 0.9923648 0.9917606 -0.9999437 0.9938541 0.9934761 -0.9187175 0.9992474 0.9198837 -0.918717 0.9992474 0.9198827 -0.9187164 0.9992474 0.9198814 -0.9187157 0.9992474 0.9198799 -0.9187148 0.9992474 0.9198779 -0.9187137 0.9992474 0.9198754 -0.9187123 0.9992473 0.9198724 -0.9187107 0.9992473 0.9198686 -0.9187089 0.9992473 0.919864 -0.9187068 0.9992473 0.9198584 -0.9187045 0.9992472 0.9198518 -0.9187024 0.9992472 0.9198441 -0.9187008 0.9992472 0.9198354 -0.9187004 0.9992471 0.9198261 -0.9187027 0.9992471 0.919817 -0.9187101 0.999247 0.9198099 -0.9187262 0.999247 0.9198076 -0.9187495 0.999247 0.9198076 -0.9187791 0.999247 0.9198076 -0.9188164 0.999247 0.9198076 -0.9188636 0.999247 0.9198076 -0.9189234 0.999247 0.9198076 -0.918999 0.999247 0.9198076 -0.9190947 0.999247 0.9198076 -0.9192157 0.999247 0.9198076 -0.9193688 0.999247 0.9198076 -0.9195625 0.999247 0.9198076 -0.9198076 0.999247 0.9198076 -0.9201176 0.999247 0.9198076 -0.9205098 0.999247 0.9198076 -0.9210061 0.999247 0.9198076 -0.9216339 0.999247 0.9198076 -0.9224281 0.999247 0.9198076 -0.9234329 0.999247 0.9198076 -0.9247041 0.999247 0.9198076 -0.9263124 0.999247 0.9198076 -0.928347 0.999247 0.9198076 -0.9309211 0.999247 0.9198076 -0.9341777 0.999247 0.9198076 -0.9382977 0.999247 0.9198076 -0.94351 0.999247 0.9198076 -0.9501042 0.999247 0.9198076 -0.9584468 0.999247 0.9198076 -0.9690013 0.999247 0.9198076 -0.982354 0.999247 0.9198076 -0.999247 0.999247 0.9198076 -0.9994057 0.9858591 0.9355059 -0.9995308 0.9801368 0.9483117 -0.9996295 0.978759 0.958691 -0.9997074 0.9796909 0.9670604 -0.9997688 0.981719 0.9737814 -0.9998174 0.9841433 0.979161 -0.9998557 0.9865801 0.9834557 -0.999886 0.9888351 0.9868773 -0.9999099 0.9908248 0.9895988 -0.9999288 0.992528 0.9917606 -0.9999437 0.9939562 0.9934761 -0.9348153 0.999406 0.9355546 -0.9348149 0.999406 0.935554 -0.9348146 0.999406 0.9355532 -0.9348141 0.999406 0.9355521 -0.9348135 0.999406 0.9355509 -0.9348128 0.9994059 0.9355493 -0.9348119 0.9994059 0.9355473 -0.9348109 0.9994059 0.9355449 -0.9348097 0.9994059 0.935542 -0.9348083 0.9994059 0.9355384 -0.9348069 0.9994059 0.9355342 -0.9348055 0.9994059 0.9355292 -0.9348044 0.9994058 0.9355237 -0.9348042 0.9994058 0.9355177 -0.9348056 0.9994058 0.9355119 -0.9348102 0.9994057 0.9355073 -0.9348204 0.9994057 0.9355059 -0.9348352 0.9994057 0.9355059 -0.9348539 0.9994057 0.9355059 -0.9348776 0.9994057 0.9355059 -0.9349075 0.9994057 0.9355059 -0.9349454 0.9994057 0.9355059 -0.9349933 0.9994057 0.9355059 -0.935054 0.9994057 0.9355059 -0.9351307 0.9994057 0.9355059 -0.9352277 0.9994057 0.9355059 -0.9353505 0.9994057 0.9355059 -0.9355059 0.9994057 0.9355059 -0.9357024 0.9994057 0.9355059 -0.935951 0.9994057 0.9355059 -0.9362655 0.9994057 0.9355059 -0.9366635 0.9994057 0.9355059 -0.9371669 0.9994057 0.9355059 -0.9378038 0.9994057 0.9355059 -0.9386096 0.9994057 0.9355059 -0.939629 0.9994057 0.9355059 -0.9409186 0.9994057 0.9355059 -0.9425502 0.9994057 0.9355059 -0.9446144 0.9994057 0.9355059 -0.9472259 0.9994057 0.9355059 -0.9505298 0.9994057 0.9355059 -0.9547096 0.9994057 0.9355059 -0.9599976 0.9994057 0.9355059 -0.9666876 0.9994057 0.9355059 -0.9751513 0.9994057 0.9355059 -0.9858591 0.9994057 0.9355059 -0.9994057 0.9994057 0.9355059 -0.9995308 0.9886988 0.9483117 -0.9996295 0.9841579 0.958691 -0.9997074 0.983089 0.9670604 -0.9997688 0.9838545 0.9737814 -0.9998174 0.9854838 0.979161 -0.9998557 0.9874207 0.9834557 -0.999886 0.9893618 0.9868773 -0.9999099 0.9911547 0.9895988 -0.9999288 0.9927345 0.9917606 -0.9999437 0.9940854 0.9934761 -0.9478754 0.999531 0.9483428 -0.9478752 0.999531 0.9483424 -0.947875 0.999531 0.9483418 -0.9478746 0.999531 0.9483412 -0.9478743 0.999531 0.9483404 -0.9478738 0.999531 0.9483394 -0.9478733 0.999531 0.9483381 -0.9478726 0.999531 0.9483366 -0.9478718 0.999531 0.9483347 -0.947871 0.9995309 0.9483325 -0.94787 0.9995309 0.9483298 -0.9478691 0.9995309 0.9483266 -0.9478684 0.9995309 0.9483231 -0.9478683 0.9995309 0.9483193 -0.9478691 0.9995309 0.9483155 -0.947872 0.9995309 0.9483126 -0.9478785 0.9995308 0.9483117 -0.9478878 0.9995308 0.9483117 -0.9478997 0.9995308 0.9483117 -0.9479146 0.9995308 0.9483117 -0.9479335 0.9995308 0.9483117 -0.9479575 0.9995308 0.9483117 -0.9479878 0.9995308 0.9483117 -0.9480261 0.9995308 0.9483117 -0.9480746 0.9995308 0.9483117 -0.9481359 0.9995308 0.9483117 -0.9482135 0.9995308 0.9483117 -0.9483117 0.9995308 0.9483117 -0.9484359 0.9995308 0.9483117 -0.9485931 0.9995308 0.9483117 -0.9487918 0.9995308 0.9483117 -0.9490434 0.9995308 0.9483117 -0.9493615 0.9995308 0.9483117 -0.9497641 0.9995308 0.9483117 -0.9502734 0.9995308 0.9483117 -0.9509177 0.9995308 0.9483117 -0.9517328 0.9995308 0.9483117 -0.952764 0.9995308 0.9483117 -0.9540687 0.9995308 0.9483117 -0.9557192 0.9995308 0.9483117 -0.9578074 0.9995308 0.9483117 -0.9604492 0.9995308 0.9483117 -0.9637914 0.9995308 0.9483117 -0.9680197 0.9995308 0.9483117 -0.9733691 0.9995308 0.9483117 -0.9801368 0.9995308 0.9483117 -0.9886988 0.9995308 0.9483117 -0.9995308 0.9995308 0.9483117 -0.9996295 0.9909882 0.958691 -0.9997074 0.9873879 0.9670604 -0.9997688 0.9865561 0.9737814 -0.9998174 0.9871796 0.979161 -0.9998557 0.9884841 0.9834557 -0.999886 0.9900282 0.9868773 -0.9999099 0.991572 0.9895988 -0.9999288 0.9929957 0.9917606 -0.9999437 0.9942488 0.9934761 -0.958416 0.9996296 0.9587107 -0.9584159 0.9996296 0.9587105 -0.9584157 0.9996296 0.9587101 -0.9584155 0.9996296 0.9587097 -0.9584153 0.9996296 0.9587092 -0.958415 0.9996296 0.9587086 -0.9584146 0.9996296 0.9587078 -0.9584142 0.9996296 0.9587068 -0.9584137 0.9996296 0.9587056 -0.9584132 0.9996296 0.9587042 -0.9584126 0.9996296 0.9587025 -0.958412 0.9996296 0.9587005 -0.9584115 0.9996296 0.9586982 -0.9584114 0.9996295 0.9586958 -0.958412 0.9996295 0.9586935 -0.9584138 0.9996295 0.9586916 -0.9584178 0.9996295 0.958691 -0.9584237 0.9996295 0.958691 -0.9584312 0.9996295 0.958691 -0.9584406 0.9996295 0.958691 -0.9584526 0.9996295 0.958691 -0.9584677 0.9996295 0.958691 -0.9584868 0.9996295 0.958691 -0.9585109 0.9996295 0.958691 -0.9585415 0.9996295 0.958691 -0.9585802 0.9996295 0.958691 -0.9586291 0.9996295 0.958691 -0.958691 0.9996295 0.958691 -0.9587693 0.9996295 0.958691 -0.9588684 0.9996295 0.958691 -0.9589938 0.9996295 0.958691 -0.9591524 0.9996295 0.958691 -0.959353 0.9996295 0.958691 -0.9596068 0.9996295 0.958691 -0.959928 0.9996295 0.958691 -0.9603343 0.9996295 0.958691 -0.9608482 0.9996295 0.958691 -0.9614985 0.9996295 0.958691 -0.9623212 0.9996295 0.958691 -0.963362 0.9996295 0.958691 -0.9646787 0.9996295 0.958691 -0.9663445 0.9996295 0.958691 -0.968452 0.9996295 0.958691 -0.9711183 0.9996295 0.958691 -0.9744915 0.9996295 0.958691 -0.978759 0.9996295 0.958691 -0.9841579 0.9996295 0.958691 -0.9909882 0.9996295 0.958691 -0.9996295 0.9996295 0.958691 -0.9997074 0.9928267 0.9670604 -0.9997688 0.9899741 0.9737814 -0.9998174 0.989325 0.979161 -0.9998557 0.9898295 0.9834557 -0.999886 0.9908712 0.9868773 -0.9999099 0.9920999 0.9895988 -0.9999288 0.9933261 0.9917606 -0.9999437 0.9944556 0.9934761 -0.9668873 0.9997074 0.9670729 -0.9668872 0.9997074 0.9670727 -0.9668871 0.9997074 0.9670725 -0.966887 0.9997074 0.9670722 -0.9668869 0.9997074 0.9670719 -0.9668867 0.9997074 0.9670715 -0.9668865 0.9997074 0.967071 -0.9668862 0.9997074 0.9670704 -0.9668859 0.9997074 0.9670696 -0.9668855 0.9997074 0.9670687 -0.9668852 0.9997074 0.9670676 -0.9668848 0.9997074 0.9670664 -0.9668845 0.9997074 0.9670649 -0.9668844 0.9997074 0.9670634 -0.9668847 0.9997074 0.9670619 -0.9668859 0.9997074 0.9670608 -0.9668884 0.9997074 0.9670604 -0.9668922 0.9997074 0.9670604 -0.9668969 0.9997074 0.9670604 -0.9669028 0.9997074 0.9670604 -0.9669103 0.9997074 0.9670604 -0.9669198 0.9997074 0.9670604 -0.9669318 0.9997074 0.9670604 -0.966947 0.9997074 0.9670604 -0.9669663 0.9997074 0.9670604 -0.9669906 0.9997074 0.9670604 -0.9670214 0.9997074 0.9670604 -0.9670604 0.9997074 0.9670604 -0.9671097 0.9997074 0.9670604 -0.967172 0.9997074 0.9670604 -0.9672509 0.9997074 0.9670604 -0.9673508 0.9997074 0.9670604 -0.967477 0.9997074 0.9670604 -0.9676368 0.9997074 0.9670604 -0.9678389 0.9997074 0.9670604 -0.9680946 0.9997074 0.9670604 -0.9684181 0.9997074 0.9670604 -0.9688274 0.9997074 0.9670604 -0.9693452 0.9997074 0.9670604 -0.9700002 0.9997074 0.9670604 -0.970829 0.9997074 0.9670604 -0.9718774 0.9997074 0.9670604 -0.9732039 0.9997074 0.9670604 -0.974882 0.9997074 0.9670604 -0.977005 0.9997074 0.9670604 -0.9796909 0.9997074 0.9670604 -0.983089 0.9997074 0.9670604 -0.9873879 0.9997074 0.9670604 -0.9928267 0.9997074 0.9670604 -0.9997074 0.9997074 0.9670604 -0.9997688 0.9942982 0.9737814 -0.9998174 0.9920392 0.979161 -0.9998557 0.9915316 0.9834557 -0.999886 0.9919377 0.9868773 -0.9999099 0.9927678 0.9895988 -0.9999288 0.9937442 0.9917606 -0.9999437 0.9947172 0.9934761 -0.9736726 0.9997689 0.9737892 -0.9736726 0.9997689 0.9737891 -0.9736725 0.9997689 0.973789 -0.9736724 0.9997689 0.9737888 -0.9736723 0.9997689 0.9737886 -0.9736722 0.9997689 0.9737884 -0.9736721 0.9997689 0.9737881 -0.9736719 0.9997689 0.9737877 -0.9736717 0.9997689 0.9737872 -0.9736715 0.9997689 0.9737866 -0.9736712 0.9997689 0.9737859 -0.973671 0.9997689 0.9737851 -0.9736708 0.9997689 0.9737842 -0.9736708 0.9997689 0.9737833 -0.973671 0.9997688 0.9737823 -0.9736717 0.9997688 0.9737816 -0.9736733 0.9997688 0.9737814 -0.9736756 0.9997688 0.9737814 -0.9736786 0.9997688 0.9737814 -0.9736823 0.9997688 0.9737814 -0.973687 0.9997688 0.9737814 -0.973693 0.9997688 0.9737814 -0.9737006 0.9997688 0.9737814 -0.9737101 0.9997688 0.9737814 -0.9737222 0.9997688 0.9737814 -0.9737375 0.9997688 0.9737814 -0.9737569 0.9997688 0.9737814 -0.9737814 0.9997688 0.9737814 -0.9738123 0.9997688 0.9737814 -0.9738515 0.9997688 0.9737814 -0.9739011 0.9997688 0.9737814 -0.9739638 0.9997688 0.9737814 -0.9740432 0.9997688 0.9737814 -0.9741436 0.9997688 0.9737814 -0.9742706 0.9997688 0.9737814 -0.9744313 0.9997688 0.9737814 -0.9746346 0.9997688 0.9737814 -0.9748918 0.9997688 0.9737814 -0.9752172 0.9997688 0.9737814 -0.9756289 0.9997688 0.9737814 -0.9761497 0.9997688 0.9737814 -0.9768086 0.9997688 0.9737814 -0.9776422 0.9997688 0.9737814 -0.9786968 0.9997688 0.9737814 -0.980031 0.9997688 0.9737814 -0.981719 0.9997688 0.9737814 -0.9838545 0.9997688 0.9737814 -0.9865561 0.9997688 0.9737814 -0.9899741 0.9997688 0.9737814 -0.9942982 0.9997688 0.9737814 -0.9997688 0.9997688 0.9737814 -0.9998174 0.9954731 0.979161 -0.9998557 0.9936849 0.9834557 -0.999886 0.993287 0.9868773 -0.9999099 0.9936128 0.9895988 -0.9999288 0.9942731 0.9917606 -0.9999437 0.9950481 0.9934761 -0.9790927 0.9998174 0.9791659 -0.9790927 0.9998174 0.9791659 -0.9790927 0.9998174 0.9791658 -0.9790926 0.9998174 0.9791657 -0.9790925 0.9998174 0.9791655 -0.9790925 0.9998174 0.9791654 -0.9790924 0.9998174 0.9791652 -0.9790923 0.9998174 0.9791649 -0.9790921 0.9998174 0.9791646 -0.979092 0.9998174 0.9791643 -0.9790919 0.9998174 0.9791638 -0.9790917 0.9998174 0.9791633 -0.9790916 0.9998174 0.9791628 -0.9790916 0.9998174 0.9791622 -0.9790917 0.9998174 0.9791616 -0.9790921 0.9998174 0.9791611 -0.9790931 0.9998174 0.979161 -0.9790946 0.9998174 0.979161 -0.9790965 0.9998174 0.979161 -0.9790988 0.9998174 0.979161 -0.9791018 0.9998174 0.979161 -0.9791055 0.9998174 0.979161 -0.9791103 0.9998174 0.979161 -0.9791163 0.9998174 0.979161 -0.9791238 0.9998174 0.979161 -0.9791334 0.9998174 0.979161 -0.9791456 0.9998174 0.979161 -0.979161 0.9998174 0.979161 -0.9791804 0.9998174 0.979161 -0.979205 0.9998174 0.979161 -0.9792361 0.9998174 0.979161 -0.9792755 0.9998174 0.979161 -0.9793253 0.9998174 0.979161 -0.9793883 0.9998174 0.979161 -0.9794681 0.9998174 0.979161 -0.9795689 0.9998174 0.979161 -0.9796966 0.9998174 0.979161 -0.979858 0.9998174 0.979161 -0.9800622 0.9998174 0.979161 -0.9803206 0.9998174 0.979161 -0.9806476 0.9998174 0.979161 -0.9810611 0.9998174 0.979161 -0.9815844 0.9998174 0.979161 -0.9822464 0.9998174 0.979161 -0.9830838 0.9998174 0.979161 -0.9841433 0.9998174 0.979161 -0.9854838 0.9998174 0.979161 -0.9871796 0.9998174 0.979161 -0.989325 0.9998174 0.979161 -0.9920392 0.9998174 0.979161 -0.9954731 0.9998174 0.979161 -0.9998174 0.9998174 0.979161 -0.9998557 0.9964092 0.9834557 -0.999886 0.9949941 0.9868773 -0.9999099 0.9946818 0.9895988 -0.9999288 0.9949422 0.9917606 -0.9999437 0.9954668 0.9934761 -0.9834129 0.9998557 0.9834588 -0.9834129 0.9998557 0.9834588 -0.9834129 0.9998557 0.9834587 -0.9834129 0.9998557 0.9834587 -0.9834128 0.9998557 0.9834586 -0.9834128 0.9998557 0.9834585 -0.9834127 0.9998557 0.9834584 -0.9834127 0.9998557 0.9834582 -0.9834126 0.9998557 0.983458 -0.9834125 0.9998557 0.9834578 -0.9834124 0.9998557 0.9834575 -0.9834123 0.9998557 0.9834572 -0.9834122 0.9998557 0.9834569 -0.9834122 0.9998557 0.9834565 -0.9834123 0.9998557 0.9834561 -0.9834126 0.9998557 0.9834558 -0.9834132 0.9998557 0.9834557 -0.9834141 0.9998557 0.9834557 -0.9834153 0.9998557 0.9834557 -0.9834167 0.9998557 0.9834557 -0.9834186 0.9998557 0.9834557 -0.9834209 0.9998557 0.9834557 -0.9834239 0.9998557 0.9834557 -0.9834277 0.9998557 0.9834557 -0.9834324 0.9998557 0.9834557 -0.9834385 0.9998557 0.9834557 -0.9834461 0.9998557 0.9834557 -0.9834557 0.9998557 0.9834557 -0.9834679 0.9998557 0.9834557 -0.9834833 0.9998557 0.9834557 -0.9835029 0.9998557 0.9834557 -0.9835276 0.9998557 0.9834557 -0.9835588 0.9998557 0.9834557 -0.9835983 0.9998557 0.9834557 -0.9836483 0.9998557 0.9834557 -0.9837116 0.9998557 0.9834557 -0.9837916 0.9998557 0.9834557 -0.9838928 0.9998557 0.9834557 -0.9840209 0.9998557 0.9834557 -0.9841829 0.9998557 0.9834557 -0.984388 0.9998557 0.9834557 -0.9846473 0.9998557 0.9834557 -0.9849754 0.9998557 0.9834557 -0.9853905 0.9998557 0.9834557 -0.9859157 0.9998557 0.9834557 -0.9865801 0.9998557 0.9834557 -0.9874207 0.9998557 0.9834557 -0.9884841 0.9998557 0.9834557 -0.9898295 0.9998557 0.9834557 -0.9915316 0.9998557 0.9834557 -0.9936849 0.9998557 0.9834557 -0.9964092 0.9998557 0.9834557 -0.9998557 0.9998557 0.9834557 -0.999886 0.9971537 0.9868773 -0.9999099 0.9960342 0.9895988 -0.9999288 0.9957887 0.9917606 -0.9999437 0.9959964 0.9934761 -0.9868505 0.999886 0.9868793 -0.9868505 0.999886 0.9868792 -0.9868505 0.999886 0.9868792 -0.9868505 0.999886 0.9868792 -0.9868504 0.999886 0.9868791 -0.9868504 0.999886 0.9868791 -0.9868504 0.999886 0.986879 -0.9868503 0.999886 0.9868789 -0.9868503 0.999886 0.9868788 -0.9868502 0.999886 0.9868786 -0.9868502 0.999886 0.9868785 -0.9868501 0.999886 0.9868783 -0.9868501 0.999886 0.986878 -0.98685 0.999886 0.9868778 -0.9868501 0.999886 0.9868776 -0.9868503 0.999886 0.9868774 -0.9868507 0.999886 0.9868773 -0.9868512 0.999886 0.9868773 -0.986852 0.999886 0.9868773 -0.9868529 0.999886 0.9868773 -0.9868541 0.999886 0.9868773 -0.9868555 0.999886 0.9868773 -0.9868574 0.999886 0.9868773 -0.9868597 0.999886 0.9868773 -0.9868627 0.999886 0.9868773 -0.9868665 0.999886 0.9868773 -0.9868713 0.999886 0.9868773 -0.9868773 0.999886 0.9868773 -0.986885 0.999886 0.9868773 -0.9868946 0.999886 0.9868773 -0.9869069 0.999886 0.9868773 -0.9869223 0.999886 0.9868773 -0.9869419 0.999886 0.9868773 -0.9869667 0.999886 0.9868773 -0.986998 0.999886 0.9868773 -0.9870376 0.999886 0.9868773 -0.9870878 0.999886 0.9868773 -0.9871512 0.999886 0.9868773 -0.9872315 0.999886 0.9868773 -0.987333 0.999886 0.9868773 -0.9874615 0.999886 0.9868773 -0.987624 0.999886 0.9868773 -0.9878296 0.999886 0.9868773 -0.9880897 0.999886 0.9868773 -0.9884188 0.999886 0.9868773 -0.9888351 0.999886 0.9868773 -0.9893618 0.999886 0.9868773 -0.9900282 0.999886 0.9868773 -0.9908712 0.999886 0.9868773 -0.9919377 0.999886 0.9868773 -0.993287 0.999886 0.9868773 -0.9949941 0.999886 0.9868773 -0.9971537 0.999886 0.9868773 -0.999886 0.999886 0.9868773 -0.9999099 0.9977452 0.9895988 -0.9999288 0.9968597 0.9917606 -0.9999437 0.9966665 0.9934761 -0.989582 0.9999099 0.9896 -0.989582 0.9999099 0.9896 -0.989582 0.9999099 0.9896 -0.989582 0.9999099 0.9896 -0.989582 0.9999099 0.9895999 -0.9895819 0.9999099 0.9895999 -0.9895819 0.9999099 0.9895998 -0.9895819 0.9999099 0.9895998 -0.9895819 0.9999099 0.9895997 -0.9895818 0.9999099 0.9895996 -0.9895818 0.9999099 0.9895995 -0.9895818 0.9999099 0.9895994 -0.9895817 0.9999099 0.9895992 -0.9895817 0.9999099 0.9895991 -0.9895817 0.9999099 0.9895989 -0.9895819 0.9999099 0.9895988 -0.9895821 0.9999099 0.9895988 -0.9895825 0.9999099 0.9895988 -0.9895829 0.9999099 0.9895988 -0.9895835 0.9999099 0.9895988 -0.9895842 0.9999099 0.9895988 -0.9895851 0.9999099 0.9895988 -0.9895863 0.9999099 0.9895988 -0.9895878 0.9999099 0.9895988 -0.9895897 0.9999099 0.9895988 -0.989592 0.9999099 0.9895988 -0.989595 0.9999099 0.9895988 -0.9895988 0.9999099 0.9895988 -0.9896036 0.9999099 0.9895988 -0.9896096 0.9999099 0.9895988 -0.9896173 0.9999099 0.9895988 -0.989627 0.9999099 0.9895988 -0.9896392 0.9999099 0.9895988 -0.9896547 0.9999099 0.9895988 -0.9896744 0.9999099 0.9895988 -0.9896992 0.9999099 0.9895988 -0.9897306 0.9999099 0.9895988 -0.9897703 0.9999099 0.9895988 -0.9898206 0.9999099 0.9895988 -0.9898842 0.9999099 0.9895988 -0.9899646 0.9999099 0.9895988 -0.9900664 0.9999099 0.9895988 -0.9901951 0.9999099 0.9895988 -0.990358 0.9999099 0.9895988 -0.9905641 0.9999099 0.9895988 -0.9908248 0.9999099 0.9895988 -0.9911547 0.9999099 0.9895988 -0.991572 0.9999099 0.9895988 -0.9920999 0.9999099 0.9895988 -0.9927678 0.9999099 0.9895988 -0.9936128 0.9999099 0.9895988 -0.9946818 0.9999099 0.9895988 -0.9960342 0.9999099 0.9895988 -0.9977452 0.9999099 0.9895988 -0.9999099 0.9999099 0.9895988 -0.9999288 0.9982146 0.9917606 -0.9999437 0.9975143 0.9934761 -0.9917501 0.9999288 0.9917614 -0.9917501 0.9999288 0.9917614 -0.9917501 0.9999288 0.9917613 -0.9917501 0.9999288 0.9917613 -0.9917501 0.9999288 0.9917613 -0.9917501 0.9999288 0.9917613 -0.99175 0.9999288 0.9917613 -0.99175 0.9999288 0.9917612 -0.99175 0.9999288 0.9917612 -0.99175 0.9999288 0.9917611 -0.99175 0.9999288 0.991761 -0.9917499 0.9999288 0.991761 -0.9917499 0.9999288 0.9917609 -0.9917499 0.9999288 0.9917608 -0.9917499 0.9999288 0.9917607 -0.99175 0.9999288 0.9917606 -0.9917502 0.9999288 0.9917606 -0.9917504 0.9999288 0.9917606 -0.9917507 0.9999288 0.9917606 -0.991751 0.9999288 0.9917606 -0.9917515 0.9999288 0.9917606 -0.9917521 0.9999288 0.9917606 -0.9917528 0.9999288 0.9917606 -0.9917537 0.9999288 0.9917606 -0.9917549 0.9999288 0.9917606 -0.9917564 0.9999288 0.9917606 -0.9917582 0.9999288 0.9917606 -0.9917606 0.9999288 0.9917606 -0.9917636 0.9999288 0.9917606 -0.9917674 0.9999288 0.9917606 -0.9917722 0.9999288 0.9917606 -0.9917782 0.9999288 0.9917606 -0.9917859 0.9999288 0.9917606 -0.9917956 0.9999288 0.9917606 -0.9918079 0.9999288 0.9917606 -0.9918234 0.9999288 0.9917606 -0.9918431 0.9999288 0.9917606 -0.991868 0.9999288 0.9917606 -0.9918994 0.9999288 0.9917606 -0.9919392 0.9999288 0.9917606 -0.9919896 0.9999288 0.9917606 -0.9920533 0.9999288 0.9917606 -0.9921339 0.9999288 0.9917606 -0.9922358 0.9999288 0.9917606 -0.9923648 0.9999288 0.9917606 -0.992528 0.9999288 0.9917606 -0.9927345 0.9999288 0.9917606 -0.9929957 0.9999288 0.9917606 -0.9933261 0.9999288 0.9917606 -0.9937442 0.9999288 0.9917606 -0.9942731 0.9999288 0.9917606 -0.9949422 0.9999288 0.9917606 -0.9957887 0.9999288 0.9917606 -0.9968597 0.9999288 0.9917606 -0.9982146 0.9999288 0.9917606 -0.9999288 0.9999288 0.9917606 -0.9999437 0.9985868 0.9934761 -0.9934695 0.9999437 0.9934765 -0.9934695 0.9999437 0.9934765 -0.9934695 0.9999437 0.9934765 -0.9934695 0.9999437 0.9934765 -0.9934695 0.9999437 0.9934765 -0.9934695 0.9999437 0.9934765 -0.9934695 0.9999437 0.9934765 -0.9934694 0.9999437 0.9934764 -0.9934694 0.9999437 0.9934764 -0.9934694 0.9999437 0.9934764 -0.9934694 0.9999437 0.9934763 -0.9934694 0.9999437 0.9934763 -0.9934694 0.9999437 0.9934762 -0.9934694 0.9999437 0.9934762 -0.9934694 0.9999437 0.9934761 -0.9934694 0.9999437 0.9934761 -0.9934695 0.9999437 0.9934761 -0.9934697 0.9999437 0.9934761 -0.9934698 0.9999437 0.9934761 -0.9934701 0.9999437 0.9934761 -0.9934704 0.9999437 0.9934761 -0.9934707 0.9999437 0.9934761 -0.9934712 0.9999437 0.9934761 -0.9934718 0.9999437 0.9934761 -0.9934725 0.9999437 0.9934761 -0.9934734 0.9999437 0.9934761 -0.9934746 0.9999437 0.9934761 -0.9934761 0.9999437 0.9934761 -0.9934779 0.9999437 0.9934761 -0.9934803 0.9999437 0.9934761 -0.9934833 0.9999437 0.9934761 -0.9934871 0.9999437 0.9934761 -0.9934919 0.9999437 0.9934761 -0.993498 0.9999437 0.9934761 -0.9935057 0.9999437 0.9934761 -0.9935154 0.9999437 0.9934761 -0.9935277 0.9999437 0.9934761 -0.9935432 0.9999437 0.9934761 -0.9935629 0.9999437 0.9934761 -0.9935878 0.9999437 0.9934761 -0.9936193 0.9999437 0.9934761 -0.9936592 0.9999437 0.9934761 -0.9937096 0.9999437 0.9934761 -0.9937734 0.9999437 0.9934761 -0.9938541 0.9999437 0.9934761 -0.9939562 0.9999437 0.9934761 -0.9940854 0.9999437 0.9934761 -0.9942488 0.9999437 0.9934761 -0.9944556 0.9999437 0.9934761 -0.9947172 0.9999437 0.9934761 -0.9950481 0.9999437 0.9934761 -0.9954668 0.9999437 0.9934761 -0.9959964 0.9999437 0.9934761 -0.9966665 0.9999437 0.9934761 -0.9975143 0.9999437 0.9934761 -0.9985868 0.9999437 0.9934761 -0.9999437 0.9999437 0.9934761 -0.0624569 0.0624569 0.9354466 -0.062777 0.0624569 0.9354466 -0.063182 0.0624569 0.9354466 -0.0636943 0.0624569 0.9354466 -0.0643425 0.0624569 0.9354466 -0.0651625 0.0624569 0.9354466 -0.0662 0.0624569 0.9354466 -0.0675125 0.0624569 0.9354466 -0.0691729 0.0624569 0.9354466 -0.0712736 0.0624569 0.9354466 -0.0739313 0.0624569 0.9354466 -0.0772936 0.0624569 0.9354466 -0.0815473 0.0624569 0.9354466 -0.0869288 0.0624569 0.9354466 -0.0937372 0.0624569 0.9354466 -0.1023506 0.0624569 0.9354466 -0.1132477 0.0624569 0.9354466 -0.1270339 0.0624569 0.9354466 -0.1444753 0.0624569 0.9354466 -0.166541 0.0624569 0.9354466 -0.1944569 0.0624569 0.9354466 -0.2297741 0.0624569 0.9354466 -0.274455 0.0624569 0.9354466 -0.3309822 0.0624569 0.9354466 -0.4024964 0.0624569 0.9354466 -0.4929712 0.0624569 0.9354466 -0.6074336 0.0624569 0.9354466 -0.7522434 0.0624569 0.9354466 -0.9354466 0.0624569 0.9354466 -0.9545467 0.1059991 0.7765244 -0.9669269 0.1572498 0.6628604 -0.9754027 0.2151269 0.590326 -0.9814251 0.2783684 0.5525787 -0.9858181 0.3454107 0.5428189 -0.9890841 0.4144197 0.5544266 -0.9915469 0.4834235 0.5812684 -0.993424 0.5504963 0.6179091 -0.9948662 0.6139459 0.6597695 -0.9959813 0.6724572 0.703219 -0.9968475 0.7251659 0.7455842 -0.997523 0.7716588 0.785076 -0.9980513 0.8119154 0.8206552 -0.9984653 0.8462171 0.8518675 -0.9987905 0.8750477 0.8786777 -0.9990461 0.8990028 0.9013225 -0.9992474 0.9187175 0.9201934 -0.999406 0.9348153 0.935751 -0.999531 0.9478754 0.9484669 -0.9996296 0.958416 0.958789 -0.9997074 0.9668873 0.9671221 -0.9997689 0.9736726 0.9738202 -0.9998174 0.9790927 0.9791854 -0.9998557 0.9834129 0.983471 -0.999886 0.9868505 0.9868869 -0.9999099 0.989582 0.9896048 -0.9999288 0.9917501 0.9917644 -0.9999437 0.9934695 0.9934784 -0.0624569 0.062777 0.9354466 -0.0624063 0.0624063 0.9354101 -0.0628114 0.0624063 0.9354101 -0.0633239 0.0624063 0.9354101 -0.0639724 0.0624063 0.9354101 -0.0647927 0.0624063 0.9354101 -0.0658305 0.0624063 0.9354101 -0.0671435 0.0624063 0.9354101 -0.0688046 0.0624063 0.9354101 -0.0709061 0.0624063 0.9354101 -0.0735648 0.0624063 0.9354101 -0.0769284 0.0624063 0.9354101 -0.0811837 0.0624063 0.9354101 -0.0865673 0.0624063 0.9354101 -0.0933783 0.0624063 0.9354101 -0.101995 0.0624063 0.9354101 -0.1128963 0.0624063 0.9354101 -0.1266878 0.0624063 0.9354101 -0.1441359 0.0624063 0.9354101 -0.16621 0.0624063 0.9354101 -0.1941366 0.0624063 0.9354101 -0.2294673 0.0624063 0.9354101 -0.2741654 0.0624063 0.9354101 -0.3307142 0.0624063 0.9354101 -0.4022558 0.0624063 0.9354101 -0.4927653 0.0624063 0.9354101 -0.6072715 0.0624063 0.9354101 -0.7521367 0.0624063 0.9354101 -0.9354101 0.0624063 0.9354101 -0.9545286 0.1059489 0.776448 -0.9669173 0.1572031 0.6627673 -0.9753975 0.2150852 0.5902326 -0.9814221 0.2783325 0.5524942 -0.9858163 0.3453807 0.5427476 -0.9890831 0.4143955 0.5543692 -0.9915463 0.4834045 0.581224 -0.9934236 0.5504818 0.6178759 -0.994866 0.6139352 0.6597453 -0.9959811 0.6724495 0.7032018 -0.9968474 0.7251605 0.7455722 -0.997523 0.7716551 0.7850678 -0.9980512 0.8119128 0.8206497 -0.9984653 0.8462154 0.8518639 -0.9987905 0.8750466 0.8786753 -0.9990461 0.899002 0.901321 -0.9992474 0.918717 0.9201924 -0.999406 0.9348149 0.9357503 -0.999531 0.9478752 0.9484665 -0.9996296 0.9584159 0.9587888 -0.9997074 0.9668872 0.967122 -0.9997689 0.9736726 0.9738201 -0.9998174 0.9790927 0.9791853 -0.9998557 0.9834129 0.983471 -0.999886 0.9868505 0.9868869 -0.9999099 0.989582 0.9896048 -0.9999288 0.9917501 0.9917644 -0.9999437 0.9934695 0.9934784 -0.0624569 0.063182 0.9354466 -0.0624063 0.0628114 0.9354101 -0.0623458 0.0623458 0.9353643 -0.0628585 0.0623458 0.9353643 -0.0635073 0.0623458 0.9353643 -0.064328 0.0623458 0.9353643 -0.0653663 0.0623458 0.9353643 -0.0666799 0.0623458 0.9353643 -0.0683418 0.0623458 0.9353643 -0.0704444 0.0623458 0.9353643 -0.0731043 0.0623458 0.9353643 -0.0764695 0.0623458 0.9353643 -0.0807269 0.0623458 0.9353643 -0.0861131 0.0623458 0.9353643 -0.0929273 0.0623458 0.9353643 -0.1015482 0.0623458 0.9353643 -0.1124547 0.0623458 0.9353643 -0.1262529 0.0623458 0.9353643 -0.1437093 0.0623458 0.9353643 -0.1657941 0.0623458 0.9353643 -0.1937341 0.0623458 0.9353643 -0.2290819 0.0623458 0.9353643 -0.2738014 0.0623458 0.9353643 -0.3303774 0.0623458 0.9353643 -0.4019535 0.0623458 0.9353643 -0.4925065 0.0623458 0.9353643 -0.6070678 0.0623458 0.9353643 -0.7520027 0.0623458 0.9353643 -0.9353643 0.0623458 0.9353643 -0.9545059 0.1058883 0.776352 -0.9669053 0.1571463 0.6626503 -0.9753908 0.2150342 0.5901152 -0.9814183 0.2782884 0.5523882 -0.9858141 0.3453439 0.542658 -0.9890818 0.4143657 0.5542971 -0.9915455 0.4833811 0.5811683 -0.9934231 0.550464 0.6178341 -0.9948657 0.6139219 0.6597149 -0.9959809 0.6724399 0.7031802 -0.9968473 0.7251537 0.7455572 -0.9975229 0.7716504 0.7850576 -0.9980512 0.8119096 0.8206428 -0.9984653 0.8462132 0.8518593 -0.9987904 0.8750451 0.8786723 -0.9990461 0.8990011 0.901319 -0.9992474 0.9187164 0.9201912 -0.999406 0.9348146 0.9357495 -0.999531 0.947875 0.948466 -0.9996296 0.9584157 0.9587884 -0.9997074 0.9668871 0.9671218 -0.9997689 0.9736725 0.97382 -0.9998174 0.9790927 0.9791852 -0.9998557 0.9834129 0.9834709 -0.999886 0.9868505 0.9868869 -0.9999099 0.989582 0.9896048 -0.9999288 0.9917501 0.9917643 -0.9999437 0.9934695 0.9934784 -0.0624569 0.0636943 0.9354466 -0.0624063 0.0633239 0.9354101 -0.0623458 0.0628585 0.9353643 -0.0622749 0.0622749 0.9353068 -0.062924 0.0622749 0.9353068 -0.0637452 0.0622749 0.9353068 -0.0647842 0.0622749 0.9353068 -0.0660986 0.0622749 0.9353068 -0.0677615 0.0622749 0.9353068 -0.0698653 0.0622749 0.9353068 -0.0725268 0.0622749 0.9353068 -0.075894 0.0622749 0.9353068 -0.080154 0.0622749 0.9353068 -0.0855434 0.0622749 0.9353068 -0.0923618 0.0622749 0.9353068 -0.1009878 0.0622749 0.9353068 -0.1119009 0.0622749 0.9353068 -0.1257074 0.0622749 0.9353068 -0.1431744 0.0622749 0.9353068 -0.1652725 0.0622749 0.9353068 -0.1932293 0.0622749 0.9353068 -0.2285984 0.0622749 0.9353068 -0.2733449 0.0622749 0.9353068 -0.3299551 0.0622749 0.9353068 -0.4015743 0.0622749 0.9353068 -0.4921819 0.0622749 0.9353068 -0.6068123 0.0622749 0.9353068 -0.7518347 0.0622749 0.9353068 -0.9353068 0.0622749 0.9353068 -0.9544774 0.1058162 0.7762317 -0.9668902 0.1570779 0.6625036 -0.9753825 0.2149725 0.5899682 -0.9814136 0.2782347 0.5522553 -0.9858113 0.3452987 0.5425458 -0.9890801 0.414329 0.5542068 -0.9915446 0.4833522 0.5810984 -0.9934225 0.5504419 0.6177818 -0.9948653 0.6139056 0.6596768 -0.9959807 0.672428 0.7031531 -0.9968472 0.7251454 0.7455383 -0.9975228 0.7716446 0.7850447 -0.9980511 0.8119057 0.8206341 -0.9984653 0.8462106 0.8518535 -0.9987904 0.8750434 0.8786686 -0.9990461 0.899 0.9013166 -0.9992474 0.9187157 0.9201896 -0.999406 0.9348141 0.9357485 -0.999531 0.9478746 0.9484653 -0.9996296 0.9584155 0.958788 -0.9997074 0.966887 0.9671215 -0.9997689 0.9736724 0.9738198 -0.9998174 0.9790926 0.9791851 -0.9998557 0.9834129 0.9834709 -0.999886 0.9868505 0.9868868 -0.9999099 0.989582 0.9896047 -0.9999288 0.9917501 0.9917643 -0.9999437 0.9934695 0.9934784 -0.0624569 0.0643425 0.9354466 -0.0624063 0.0639724 0.9354101 -0.0623458 0.0635073 0.9353643 -0.0622749 0.062924 0.9353068 -0.0621943 0.0621943 0.9352348 -0.0630161 0.0621943 0.9352348 -0.0640558 0.0621943 0.9352348 -0.0653712 0.0621943 0.9352348 -0.0670354 0.0621943 0.9352348 -0.0691408 0.0621943 0.9352348 -0.0718043 0.0621943 0.9352348 -0.0751741 0.0621943 0.9352348 -0.0794373 0.0621943 0.9352348 -0.0848308 0.0621943 0.9352348 -0.0916543 0.0621943 0.9352348 -0.1002868 0.0621943 0.9352348 -0.1112082 0.0621943 0.9352348 -0.125025 0.0621943 0.9352348 -0.1425052 0.0621943 0.9352348 -0.1646199 0.0621943 0.9352348 -0.1925979 0.0621943 0.9352348 -0.2279936 0.0621943 0.9352348 -0.2727739 0.0621943 0.9352348 -0.3294267 0.0621943 0.9352348 -0.4010999 0.0621943 0.9352348 -0.4917758 0.0621943 0.9352348 -0.6064926 0.0621943 0.9352348 -0.7516243 0.0621943 0.9352348 -0.9352348 0.0621943 0.9352348 -0.9544418 0.1057322 0.7760811 -0.9668714 0.1569971 0.6623201 -0.9753721 0.2148987 0.5897842 -0.9814076 0.2781701 0.5520892 -0.9858079 0.3452442 0.5424054 -0.9890781 0.4142845 0.5540939 -0.9915433 0.4833171 0.5810111 -0.9934218 0.550415 0.6177164 -0.9948649 0.6138855 0.6596292 -0.9959804 0.6724135 0.7031193 -0.996847 0.7251351 0.7455148 -0.9975227 0.7716375 0.7850286 -0.9980511 0.8119009 0.8206233 -0.9984652 0.8462073 0.8518464 -0.9987904 0.8750412 0.8786638 -0.9990461 0.8989986 0.9013135 -0.9992474 0.9187148 0.9201876 -0.999406 0.9348135 0.9357472 -0.999531 0.9478743 0.9484645 -0.9996296 0.9584153 0.9587875 -0.9997074 0.9668869 0.9671212 -0.9997689 0.9736723 0.9738196 -0.9998174 0.9790925 0.979185 -0.9998557 0.9834128 0.9834708 -0.999886 0.9868504 0.9868868 -0.9999099 0.989582 0.9896047 -0.9999288 0.9917501 0.9917643 -0.9999437 0.9934695 0.9934784 -0.0624569 0.0651625 0.9354466 -0.0624063 0.0647927 0.9354101 -0.0623458 0.064328 0.9353643 -0.0622749 0.0637452 0.9353068 -0.0621943 0.0630161 0.9352348 -0.0621069 0.0621069 0.9351449 -0.0631476 0.0621069 0.9351449 -0.0644643 0.0621069 0.9351449 -0.06613 0.0621069 0.9351449 -0.0682373 0.0621069 0.9351449 -0.0709034 0.0621069 0.9351449 -0.0742763 0.0621069 0.9351449 -0.0785435 0.0621069 0.9351449 -0.0839421 0.0621069 0.9351449 -0.090772 0.0621069 0.9351449 -0.0994127 0.0621069 0.9351449 -0.1103442 0.0621069 0.9351449 -0.1241741 0.0621069 0.9351449 -0.1416707 0.0621069 0.9351449 -0.1638062 0.0621069 0.9351449 -0.1918104 0.0621069 0.9351449 -0.2272394 0.0621069 0.9351449 -0.2720617 0.0621069 0.9351449 -0.3287678 0.0621069 0.9351449 -0.4005083 0.0621069 0.9351449 -0.4912694 0.0621069 0.9351449 -0.6060939 0.0621069 0.9351449 -0.751362 0.0621069 0.9351449 -0.9351449 0.0621069 0.9351449 -0.9543974 0.1056375 0.7758934 -0.9668479 0.156904 0.6620914 -0.9753591 0.2148124 0.589555 -0.9814002 0.2780936 0.5518821 -0.9858036 0.3451791 0.5422305 -0.9890755 0.4142311 0.5539533 -0.9915418 0.4832747 0.5809023 -0.9934209 0.5503825 0.6176349 -0.9948643 0.6138613 0.6595699 -0.9959801 0.6723959 0.7030771 -0.9968468 0.7251226 0.7454855 -0.9975226 0.7716288 0.7850086 -0.998051 0.8118949 0.8206099 -0.9984652 0.8462034 0.8518374 -0.9987904 0.8750386 0.878658 -0.9990461 0.8989969 0.9013097 -0.9992474 0.9187137 0.9201852 -0.9994059 0.9348128 0.9357457 -0.999531 0.9478738 0.9484635 -0.9996296 0.958415 0.9587869 -0.9997074 0.9668867 0.9671208 -0.9997689 0.9736722 0.9738193 -0.9998174 0.9790925 0.9791848 -0.9998557 0.9834128 0.9834707 -0.999886 0.9868504 0.9868867 -0.9999099 0.9895819 0.9896047 -0.9999288 0.9917501 0.9917643 -0.9999437 0.9934695 0.9934784 -0.0624569 0.0662 0.9354466 -0.0624063 0.0658305 0.9354101 -0.0623458 0.0653663 0.9353643 -0.0622749 0.0647842 0.9353068 -0.0621943 0.0640558 0.9352348 -0.0621069 0.0631476 0.9351449 -0.0620199 0.0620199 0.9350332 -0.063338 0.0620199 0.9350332 -0.0650057 0.0620199 0.9350332 -0.0671155 0.0620199 0.9350332 -0.0697847 0.0620199 0.9350332 -0.0731615 0.0620199 0.9350332 -0.0774337 0.0620199 0.9350332 -0.0828386 0.0620199 0.9350332 -0.0896764 0.0620199 0.9350332 -0.0983271 0.0620199 0.9350332 -0.1092715 0.0620199 0.9350332 -0.1231174 0.0620199 0.9350332 -0.1406344 0.0620199 0.9350332 -0.1627957 0.0620199 0.9350332 -0.1908325 0.0620199 0.9350332 -0.2263028 0.0620199 0.9350332 -0.2711774 0.0620199 0.9350332 -0.3279495 0.0620199 0.9350332 -0.3997736 0.0620199 0.9350332 -0.4906404 0.0620199 0.9350332 -0.6055988 0.0620199 0.9350332 -0.7510361 0.0620199 0.9350332 -0.9350332 0.0620199 0.9350332 -0.9543421 0.1055364 0.7756603 -0.9668187 0.1568008 0.6618076 -0.975343 0.2147144 0.5892706 -0.9813911 0.2780055 0.5516253 -0.9857982 0.3451032 0.5420136 -0.9890723 0.4141683 0.5537789 -0.9915399 0.4832246 0.5807673 -0.9934197 0.5503438 0.6175339 -0.9948636 0.6138323 0.6594963 -0.9959797 0.6723748 0.7030249 -0.9968465 0.7251076 0.7454491 -0.9975224 0.7716184 0.7849838 -0.9980509 0.8118878 0.8205932 -0.9984651 0.8461986 0.8518264 -0.9987903 0.8750355 0.8786507 -0.9990461 0.8989948 0.901305 -0.9992473 0.9187123 0.9201821 -0.9994059 0.9348119 0.9357437 -0.999531 0.9478733 0.9484623 -0.9996296 0.9584146 0.9587861 -0.9997074 0.9668865 0.9671203 -0.9997689 0.9736721 0.973819 -0.9998174 0.9790924 0.9791846 -0.9998557 0.9834127 0.9834706 -0.999886 0.9868504 0.9868866 -0.9999099 0.9895819 0.9896046 -0.9999288 0.99175 0.9917642 -0.9999437 0.9934695 0.9934783 -0.0624569 0.0675125 0.9354466 -0.0624063 0.0671435 0.9354101 -0.0623458 0.0666799 0.9353643 -0.0622749 0.0660986 0.9353068 -0.0621943 0.0653712 0.9352348 -0.0621069 0.0644643 0.9351449 -0.0620199 0.063338 0.9350332 -0.0619473 0.0619473 0.9348949 -0.0636174 0.0619473 0.9348949 -0.0657302 0.0619473 0.9348949 -0.0684033 0.0619473 0.9348949 -0.071785 0.0619473 0.9348949 -0.0760633 0.0619473 0.9348949 -0.0814759 0.0619473 0.9348949 -0.0883235 0.0619473 0.9348949 -0.0969867 0.0619473 0.9348949 -0.1079468 0.0619473 0.9348949 -0.1218126 0.0619473 0.9348949 -0.1393548 0.0619473 0.9348949 -0.1615479 0.0619473 0.9348949 -0.189625 0.0619473 0.9348949 -0.2251463 0.0619473 0.9348949 -0.2700853 0.0619473 0.9348949 -0.326939 0.0619473 0.9348949 -0.3988663 0.0619473 0.9348949 -0.4898637 0.0619473 0.9348949 -0.6049872 0.0619473 0.9348949 -0.7506335 0.0619473 0.9348949 -0.9348949 0.0619473 0.9348949 -0.9542739 0.1054384 0.7753725 -0.9667827 0.1566936 0.6614574 -0.9753231 0.2146085 0.5889198 -0.9813797 0.2779077 0.5513085 -0.9857916 0.3450175 0.5417461 -0.9890684 0.4140964 0.5535638 -0.9915376 0.4831666 0.580601 -0.9934183 0.5502987 0.6174094 -0.9948628 0.6137984 0.6594057 -0.9959791 0.67235 0.7029605 -0.9968462 0.7250899 0.7454044 -0.9975222 0.7716061 0.7849532 -0.9980508 0.8118794 0.8205726 -0.998465 0.8461929 0.8518127 -0.9987903 0.8750317 0.8786418 -0.999046 0.8989923 0.9012992 -0.9992473 0.9187107 0.9201784 -0.9994059 0.9348109 0.9357413 -0.999531 0.9478726 0.9484607 -0.9996296 0.9584142 0.9587851 -0.9997074 0.9668862 0.9671197 -0.9997689 0.9736719 0.9738186 -0.9998174 0.9790923 0.9791844 -0.9998557 0.9834127 0.9834704 -0.999886 0.9868503 0.9868865 -0.9999099 0.9895819 0.9896046 -0.9999288 0.99175 0.9917642 -0.9999437 0.9934694 0.9934783 -0.0624569 0.0691729 0.9354466 -0.0624063 0.0688046 0.9354101 -0.0623458 0.0683418 0.9353643 -0.0622749 0.0677615 0.9353068 -0.0621943 0.0670354 0.9352348 -0.0621069 0.06613 0.9351449 -0.0620199 0.0650057 0.9350332 -0.0619473 0.0636174 0.9348949 -0.061916 0.061916 0.9347252 -0.0640325 0.061916 0.9347252 -0.0667103 0.061916 0.9347252 -0.0700979 0.061916 0.9347252 -0.0743837 0.061916 0.9347252 -0.0798059 0.061916 0.9347252 -0.0866656 0.061916 0.9347252 -0.095344 0.061916 0.9347252 -0.1063233 0.061916 0.9347252 -0.1202135 0.061916 0.9347252 -0.1377865 0.061916 0.9347252 -0.1600186 0.061916 0.9347252 -0.1881451 0.061916 0.9347252 -0.2237288 0.061916 0.9347252 -0.2687468 0.061916 0.9347252 -0.3257005 0.061916 0.9347252 -0.3977542 0.061916 0.9347252 -0.4889116 0.061916 0.9347252 -0.6042375 0.061916 0.9347252 -0.7501398 0.061916 0.9347252 -0.9347252 0.061916 0.9347252 -0.9541902 0.1053624 0.7750199 -0.9667385 0.1565954 0.6610284 -0.9752987 0.2145034 0.5884903 -0.9813659 0.2778058 0.5509208 -0.9857835 0.3449254 0.5414188 -0.9890637 0.4140176 0.5533007 -0.9915347 0.4831021 0.5803976 -0.9934166 0.550248 0.6172571 -0.9948617 0.6137599 0.6592948 -0.9959785 0.6723217 0.7028817 -0.9968458 0.7250697 0.7453496 -0.997522 0.7715919 0.7849158 -0.9980506 0.8118697 0.8205475 -0.9984649 0.8461864 0.8517961 -0.9987902 0.8750274 0.8786309 -0.999046 0.8989895 0.9012921 -0.9992473 0.9187089 0.9201738 -0.9994059 0.9348097 0.9357384 -0.999531 0.9478718 0.9484589 -0.9996296 0.9584137 0.9587839 -0.9997074 0.9668859 0.9671189 -0.9997689 0.9736717 0.9738182 -0.9998174 0.9790921 0.9791841 -0.9998557 0.9834126 0.9834702 -0.999886 0.9868503 0.9868864 -0.9999099 0.9895819 0.9896045 -0.9999288 0.99175 0.9917642 -0.9999437 0.9934694 0.9934783 -0.0624569 0.0712736 0.9354466 -0.0624063 0.0709061 0.9354101 -0.0623458 0.0704444 0.9353643 -0.0622749 0.0698653 0.9353068 -0.0621943 0.0691408 0.9352348 -0.0621069 0.0682373 0.9351449 -0.0620199 0.0671155 0.9350332 -0.0619473 0.0657302 0.9348949 -0.061916 0.0640325 0.9347252 -0.0619734 0.0619734 0.9345187 -0.0646568 0.0619734 0.9345187 -0.0680517 0.0619734 0.9345187 -0.0723466 0.0619734 0.9345187 -0.0777803 0.0619734 0.9345187 -0.0846546 0.0619734 0.9345187 -0.0933514 0.0619734 0.9345187 -0.1043541 0.0619734 0.9345187 -0.1182739 0.0619734 0.9345187 -0.1358843 0.0619734 0.9345187 -0.1581637 0.0619734 0.9345187 -0.1863501 0.0619734 0.9345187 -0.2220095 0.0619734 0.9345187 -0.2671233 0.0619734 0.9345187 -0.3241981 0.0619734 0.9345187 -0.3964052 0.0619734 0.9345187 -0.4877565 0.0619734 0.9345187 -0.6033278 0.0619734 0.9345187 -0.7495406 0.0619734 0.9345187 -0.9345187 0.0619734 0.9345187 -0.9540886 0.1053433 0.7745924 -0.966685 0.1565315 0.6605087 -0.9752692 0.2144168 0.5879701 -0.9813491 0.2777122 0.5504514 -0.9857738 0.3448353 0.5410227 -0.9890579 0.4139373 0.5529823 -0.9915312 0.4830346 0.5801514 -0.9934145 0.5501939 0.6170729 -0.9948604 0.6137183 0.6591607 -0.9959777 0.6722907 0.7027865 -0.9968453 0.7250473 0.7452834 -0.9975217 0.7715762 0.7848706 -0.9980504 0.8118589 0.8205171 -0.9984648 0.8461791 0.8517759 -0.9987902 0.8750225 0.8786176 -0.9990459 0.8989863 0.9012835 -0.9992473 0.9187068 0.9201683 -0.9994059 0.9348083 0.9357348 -0.9995309 0.947871 0.9484566 -0.9996296 0.9584132 0.9587825 -0.9997074 0.9668855 0.967118 -0.9997689 0.9736715 0.9738176 -0.9998174 0.979092 0.9791837 -0.9998557 0.9834125 0.98347 -0.999886 0.9868502 0.9868863 -0.9999099 0.9895818 0.9896044 -0.9999288 0.99175 0.9917641 -0.9999437 0.9934694 0.9934783 -0.0624569 0.0739313 0.9354466 -0.0624063 0.0735648 0.9354101 -0.0623458 0.0731043 0.9353643 -0.0622749 0.0725268 0.9353068 -0.0621943 0.0718043 0.9352348 -0.0621069 0.0709034 0.9351449 -0.0620199 0.0697847 0.9350332 -0.0619473 0.0684033 0.9348949 -0.061916 0.0667103 0.9347252 -0.0619734 0.0646568 0.9345187 -0.062202 0.062202 0.9342712 -0.0656055 0.062202 0.9342712 -0.0699113 0.062202 0.9342712 -0.0753587 0.062202 0.9342712 -0.0822505 0.062202 0.9342712 -0.0909694 0.062202 0.9342712 -0.102 0.062202 0.9342712 -0.1159552 0.062202 0.9342712 -0.1336102 0.062202 0.9342712 -0.1559462 0.062202 0.9342712 -0.1842041 0.062202 0.9342712 -0.219954 0.062202 0.9342712 -0.2651822 0.062202 0.9342712 -0.3224019 0.062202 0.9342712 -0.3947922 0.062202 0.9342712 -0.4863753 0.062202 0.9342712 -0.6022399 0.062202 0.9342712 -0.7488237 0.062202 0.9342712 -0.9342712 0.062202 0.9342712 -0.9539671 0.1054431 0.7740814 -0.9666211 0.1565473 0.6598881 -0.975234 0.2143816 0.5873492 -0.9813291 0.2776503 0.5498914 -0.9857621 0.3447636 0.5405503 -0.989051 0.4138668 0.5526027 -0.9915271 0.4829718 0.579858 -0.993412 0.5501416 0.6168533 -0.9948589 0.6136769 0.659001 -0.9959768 0.6722594 0.702673 -0.9968448 0.7250244 0.7452045 -0.9975213 0.7715599 0.7848167 -0.9980502 0.8118476 0.8204809 -0.9984647 0.8461714 0.8517519 -0.9987901 0.8750173 0.8786019 -0.9990459 0.8989829 0.9012733 -0.9992472 0.9187045 0.9201617 -0.9994059 0.9348069 0.9357306 -0.9995309 0.94787 0.9484539 -0.9996296 0.9584126 0.9587808 -0.9997074 0.9668852 0.9671169 -0.9997689 0.9736712 0.9738169 -0.9998174 0.9790919 0.9791833 -0.9998557 0.9834124 0.9834697 -0.999886 0.9868502 0.9868861 -0.9999099 0.9895818 0.9896043 -0.9999288 0.99175 0.991764 -0.9999437 0.9934694 0.9934782 -0.0624569 0.0772936 0.9354466 -0.0624063 0.0769284 0.9354101 -0.0623458 0.0764695 0.9353643 -0.0622749 0.075894 0.9353068 -0.0621943 0.0751741 0.9352348 -0.0621069 0.0742763 0.9351449 -0.0620199 0.0731615 0.9350332 -0.0619473 0.071785 0.9348949 -0.061916 0.0700979 0.9347252 -0.0619734 0.0680517 0.9345187 -0.062202 0.0656055 0.9342712 -0.062742 0.062742 0.9339805 -0.0670606 0.062742 0.9339805 -0.0725241 0.062742 0.9339805 -0.0794363 0.062742 0.9339805 -0.088181 0.062742 0.9339805 -0.0992443 0.062742 0.9339805 -0.1132408 0.062742 0.9339805 -0.1309481 0.062742 0.9339805 -0.1533502 0.062742 0.9339805 -0.1816918 0.062742 0.9339805 -0.2175476 0.062742 0.9339805 -0.2629098 0.062742 0.9339805 -0.3202989 0.062742 0.9339805 -0.3929036 0.062742 0.9339805 -0.484758 0.062742 0.9339805 -0.6009658 0.062742 0.9339805 -0.7479837 0.062742 0.9339805 -0.9339805 0.062742 0.9339805 -0.9538247 0.1057683 0.7734835 -0.9665463 0.1567226 0.6591625 -0.9751928 0.2144566 0.5866239 -0.9813057 0.2776626 0.5492375 -0.9857485 0.3447407 0.5399988 -0.989043 0.4138277 0.5521598 -0.9915223 0.4829286 0.5795157 -0.9934091 0.5501012 0.6165973 -0.9948571 0.6136427 0.6588147 -0.9959757 0.6722322 0.7025407 -0.9968441 0.7250039 0.7451125 -0.9975209 0.7715449 0.7847539 -0.99805 0.811837 0.8204387 -0.9984645 0.8461641 0.8517239 -0.99879 0.8750124 0.8785835 -0.9990458 0.8989796 0.9012613 -0.9992472 0.9187024 0.920154 -0.9994059 0.9348055 0.9357257 -0.9995309 0.9478691 0.9484508 -0.9996296 0.958412 0.9587788 -0.9997074 0.9668848 0.9671156 -0.9997689 0.973671 0.9738161 -0.9998174 0.9790917 0.9791828 -0.9998557 0.9834123 0.9834694 -0.999886 0.9868501 0.9868859 -0.9999099 0.9895818 0.9896042 -0.9999288 0.9917499 0.991764 -0.9999437 0.9934694 0.9934782 -0.0624569 0.0815473 0.9354466 -0.0624063 0.0811837 0.9354101 -0.0623458 0.0807269 0.9353643 -0.0622749 0.080154 0.9353068 -0.0621943 0.0794373 0.9352348 -0.0621069 0.0785435 0.9351449 -0.0620199 0.0774337 0.9350332 -0.0619473 0.0760633 0.9348949 -0.061916 0.0743837 0.9347252 -0.0619734 0.0723466 0.9345187 -0.062202 0.0699113 0.9342712 -0.062742 0.0670606 0.9339805 -0.0638283 0.0638283 0.9336494 -0.0693101 0.0638283 0.9336494 -0.0762454 0.0638283 0.9336494 -0.0850195 0.0638283 0.9336494 -0.0961197 0.0638283 0.9336494 -0.1101631 0.0638283 0.9336494 -0.1279297 0.0638283 0.9336494 -0.1504067 0.0638283 0.9336494 -0.1788432 0.0638283 0.9336494 -0.2148189 0.0638283 0.9336494 -0.260333 0.0638283 0.9336494 -0.3179142 0.0638283 0.9336494 -0.3907618 0.0638283 0.9336494 -0.4829236 0.0638283 0.9336494 -0.5995203 0.0638283 0.9336494 -0.7470302 0.0638283 0.9336494 -0.9336494 0.0638283 0.9336494 -0.953663 0.1064997 0.7728059 -0.9664615 0.1571937 0.6583412 -0.9751462 0.2147432 0.5858033 -0.9812792 0.2778236 0.5484982 -0.9857332 0.3448204 0.5393756 -0.9890339 0.4138582 0.5516594 -0.9915169 0.4829319 0.5791292 -0.9934058 0.5500915 0.6163081 -0.9948551 0.6136284 0.6586044 -0.9959745 0.672218 0.7023914 -0.9968433 0.7249916 0.7450087 -0.9975204 0.7715352 0.7846831 -0.9980497 0.8118298 0.8203911 -0.9984643 0.8461589 0.8516924 -0.9987899 0.8750088 0.8785628 -0.9990458 0.8989771 0.9012479 -0.9992472 0.9187008 0.9201453 -0.9994058 0.9348044 0.9357201 -0.9995309 0.9478684 0.9484472 -0.9996296 0.9584115 0.9587765 -0.9997074 0.9668845 0.9671142 -0.9997689 0.9736708 0.9738152 -0.9998174 0.9790916 0.9791822 -0.9998557 0.9834122 0.9834691 -0.999886 0.9868501 0.9868857 -0.9999099 0.9895817 0.989604 -0.9999288 0.9917499 0.9917639 -0.9999437 0.9934694 0.9934781 -0.0624569 0.0869288 0.9354466 -0.0624063 0.0865673 0.9354101 -0.0623458 0.0861131 0.9353643 -0.0622749 0.0855434 0.9353068 -0.0621943 0.0848308 0.9352348 -0.0621069 0.0839421 0.9351449 -0.0620199 0.0828386 0.9350332 -0.0619473 0.0814759 0.9348949 -0.061916 0.0798059 0.9347252 -0.0619734 0.0777803 0.9345187 -0.062202 0.0753587 0.9342712 -0.062742 0.0725241 0.9339805 -0.0638283 0.0693101 0.9336494 -0.0658501 0.0658501 0.9332914 -0.0728103 0.0658501 0.9332914 -0.0816158 0.0658501 0.9332914 -0.0927559 0.0658501 0.9332914 -0.1068496 0.0658501 0.9332914 -0.12468 0.0658501 0.9332914 -0.1472378 0.0658501 0.9332914 -0.1757762 0.0658501 0.9332914 -0.2118811 0.0658501 0.9332914 -0.2575585 0.0658501 0.9332914 -0.3153463 0.0658501 0.9332914 -0.3884555 0.0658501 0.9332914 -0.480948 0.0658501 0.9332914 -0.5979631 0.0658501 0.9332914 -0.7460024 0.0658501 0.9332914 -0.9332914 0.0658501 0.9332914 -0.9534887 0.1079385 0.7720768 -0.9663702 0.15819 0.6574584 -0.9750962 0.2154135 0.5849222 -0.9812508 0.2782606 0.5477048 -0.9857167 0.3450957 0.5387072 -0.9890241 0.4140252 0.5511229 -0.991511 0.4830292 0.5787149 -0.9934023 0.5501456 0.6159984 -0.994853 0.6136569 0.6583791 -0.9959732 0.672232 0.7022315 -0.9968425 0.7249978 0.7448975 -0.9975199 0.7715376 0.7846072 -0.9980494 0.8118303 0.8203401 -0.9984642 0.8461587 0.8516586 -0.9987897 0.8750084 0.8785407 -0.9990457 0.8989767 0.9012335 -0.9992471 0.9187004 0.920136 -0.9994058 0.9348042 0.9357142 -0.9995309 0.9478683 0.9484434 -0.9996295 0.9584114 0.9587741 -0.9997074 0.9668844 0.9671127 -0.9997689 0.9736708 0.9738142 -0.9998174 0.9790916 0.9791816 -0.9998557 0.9834122 0.9834687 -0.999886 0.98685 0.9868854 -0.9999099 0.9895817 0.9896039 -0.9999288 0.9917499 0.9917638 -0.9999437 0.9934694 0.9934781 -0.0624569 0.0937372 0.9354466 -0.0624063 0.0933783 0.9354101 -0.0623458 0.0929273 0.9353643 -0.0622749 0.0923618 0.9353068 -0.0621943 0.0916543 0.9352348 -0.0621069 0.090772 0.9351449 -0.0620199 0.0896764 0.9350332 -0.0619473 0.0883235 0.9348949 -0.061916 0.0866656 0.9347252 -0.0619734 0.0846546 0.9345187 -0.062202 0.0822505 0.9342712 -0.062742 0.0794363 0.9339805 -0.0638283 0.0762454 0.9336494 -0.0658501 0.0728103 0.9332914 -0.0694453 0.0694453 0.9329391 -0.0782816 0.0694453 0.9329391 -0.0894608 0.0694453 0.9329391 -0.1036038 0.0694453 0.9329391 -0.1214966 0.0694453 0.9329391 -0.1441333 0.0694453 0.9329391 -0.1727717 0.0694453 0.9329391 -0.209003 0.0694453 0.9329391 -0.2548403 0.0694453 0.9329391 -0.3128305 0.0694453 0.9329391 -0.3861956 0.0694453 0.9329391 -0.479012 0.0694453 0.9329391 -0.5964367 0.0694453 0.9329391 -0.7449944 0.0694453 0.9329391 -0.9329391 0.0694453 0.9329391 -0.9533177 0.1105818 0.7713628 -0.9662809 0.160092 0.6565952 -0.9750472 0.2167545 0.5840612 -0.9812231 0.2791873 0.5469301 -0.9857006 0.3457234 0.5380548 -0.9890146 0.4144423 0.5505995 -0.9915054 0.4833013 0.5783109 -0.9933988 0.5503203 0.6156963 -0.9948509 0.6137675 0.6581595 -0.9959719 0.6723012 0.7020756 -0.9968418 0.7250408 0.7447892 -0.9975194 0.7715641 0.7845333 -0.9980491 0.8118466 0.8202905 -0.998464 0.8461687 0.8516256 -0.9987896 0.8750145 0.8785191 -0.9990456 0.8989805 0.9012195 -0.9992471 0.9187027 0.920127 -0.9994058 0.9348056 0.9357084 -0.9995309 0.9478691 0.9484397 -0.9996295 0.958412 0.9587718 -0.9997074 0.9668847 0.9671112 -0.9997688 0.973671 0.9738133 -0.9998174 0.9790917 0.979181 -0.9998557 0.9834123 0.9834683 -0.999886 0.9868501 0.9868852 -0.9999099 0.9895817 0.9896037 -0.9999288 0.9917499 0.9917637 -0.9999437 0.9934694 0.993478 -0.0624569 0.1023506 0.9354466 -0.0624063 0.101995 0.9354101 -0.0623458 0.1015482 0.9353643 -0.0622749 0.1009878 0.9353068 -0.0621943 0.1002868 0.9352348 -0.0621069 0.0994127 0.9351449 -0.0620199 0.0983271 0.9350332 -0.0619473 0.0969867 0.9348949 -0.061916 0.095344 0.9347252 -0.0619734 0.0933514 0.9345187 -0.062202 0.0909694 0.9342712 -0.062742 0.088181 0.9339805 -0.0638283 0.0850195 0.9336494 -0.0658501 0.0816158 0.9332914 -0.0694453 0.0782816 0.9329391 -0.0756464 0.0756464 0.9326595 -0.0868564 0.0756464 0.9326595 -0.1010384 0.0756464 0.9326595 -0.1189805 0.0756464 0.9326595 -0.1416797 0.0756464 0.9326595 -0.170397 0.0756464 0.9326595 -0.2067281 0.0756464 0.9326595 -0.2526918 0.0756464 0.9326595 -0.3108418 0.0756464 0.9326595 -0.3844091 0.0756464 0.9326595 -0.4774812 0.0756464 0.9326595 -0.5952297 0.0756464 0.9326595 -0.7441968 0.0756464 0.9326595 -0.9326595 0.0756464 0.9326595 -0.9531823 0.1152388 0.7707988 -0.9662104 0.1635226 0.655914 -0.9750086 0.2192389 0.5833822 -0.9812013 0.2809573 0.5463195 -0.9856879 0.3469645 0.5375409 -0.9890072 0.4152991 0.5501874 -0.9915009 0.4838841 0.5779928 -0.9933961 0.5507113 0.6154586 -0.9948493 0.6140266 0.6579867 -0.9959709 0.6724711 0.701953 -0.9968411 0.7251511 0.744704 -0.9975191 0.7716352 0.7844752 -0.9980488 0.8118921 0.8202514 -0.9984638 0.8461977 0.8515998 -0.9987895 0.8750329 0.8785021 -0.9990456 0.8989921 0.9012084 -0.999247 0.9187101 0.9201199 -0.9994057 0.9348102 0.9357038 -0.9995309 0.947872 0.9484368 -0.9996295 0.9584138 0.9587699 -0.9997074 0.9668859 0.96711 -0.9997688 0.9736717 0.9738126 -0.9998174 0.9790921 0.9791806 -0.9998557 0.9834126 0.983468 -0.999886 0.9868503 0.986885 -0.9999099 0.9895819 0.9896036 -0.9999288 0.99175 0.9917636 -0.9999437 0.9934694 0.9934779 -0.0624569 0.1132477 0.9354466 -0.0624063 0.1128963 0.9354101 -0.0623458 0.1124547 0.9353643 -0.0622749 0.1119009 0.9353068 -0.0621943 0.1112082 0.9352348 -0.0621069 0.1103442 0.9351449 -0.0620199 0.1092715 0.9350332 -0.0619473 0.1079468 0.9348949 -0.061916 0.1063233 0.9347252 -0.0619734 0.1043541 0.9345187 -0.062202 0.102 0.9342712 -0.062742 0.0992443 0.9339805 -0.0638283 0.0961197 0.9336494 -0.0658501 0.0927559 0.9332914 -0.0694453 0.0894608 0.9329391 -0.0756464 0.0868564 0.9326595 -0.0860209 0.0860209 0.9325696 -0.1002154 0.0860209 0.9325696 -0.1181733 0.0860209 0.9325696 -0.1408925 0.0860209 0.9325696 -0.1696351 0.0860209 0.9325696 -0.2059983 0.0860209 0.9325696 -0.2520025 0.0860209 0.9325696 -0.3102037 0.0860209 0.9325696 -0.3838358 0.0860209 0.9325696 -0.4769901 0.0860209 0.9325696 -0.5948423 0.0860209 0.9325696 -0.7439407 0.0860209 0.9325696 -0.9325696 0.0860209 0.9325696 -0.9531389 0.1231452 0.7706179 -0.9661878 0.1694384 0.6556956 -0.9749962 0.2235962 0.5831647 -0.9811943 0.2841192 0.5461239 -0.9856839 0.3492254 0.5373763 -0.9890048 0.4168922 0.5500554 -0.9914995 0.4849907 0.577891 -0.9933953 0.5514695 0.6153825 -0.9948487 0.6145393 0.6579314 -0.9959706 0.6728136 0.7019138 -0.9968409 0.7253775 0.7446768 -0.9975189 0.7717834 0.7844566 -0.9980488 0.8119884 0.8202389 -0.9984638 0.8462598 0.8515915 -0.9987895 0.8750727 0.8784967 -0.9990455 0.8990175 0.9012049 -0.999247 0.9187262 0.9201176 -0.9994057 0.9348204 0.9357024 -0.9995308 0.9478785 0.9484359 -0.9996295 0.9584178 0.9587693 -0.9997074 0.9668884 0.9671097 -0.9997688 0.9736733 0.9738123 -0.9998174 0.9790931 0.9791804 -0.9998557 0.9834132 0.9834679 -0.999886 0.9868507 0.986885 -0.9999099 0.9895821 0.9896036 -0.9999288 0.9917502 0.9917636 -0.9999437 0.9934695 0.9934779 -0.0624569 0.1270339 0.9354466 -0.0624063 0.1266878 0.9354101 -0.0623458 0.1262529 0.9353643 -0.0622749 0.1257074 0.9353068 -0.0621943 0.125025 0.9352348 -0.0621069 0.1241741 0.9351449 -0.0620199 0.1231174 0.9350332 -0.0619473 0.1218126 0.9348949 -0.061916 0.1202135 0.9347252 -0.0619734 0.1182739 0.9345187 -0.062202 0.1159552 0.9342712 -0.062742 0.1132408 0.9339805 -0.0638283 0.1101631 0.9336494 -0.0658501 0.1068496 0.9332914 -0.0694453 0.1036038 0.9329391 -0.0756464 0.1010384 0.9326595 -0.0860209 0.1002154 0.9325696 -0.1002154 0.1002154 0.9325696 -0.1181733 0.1002154 0.9325696 -0.1408925 0.1002154 0.9325696 -0.1696351 0.1002154 0.9325696 -0.2059983 0.1002154 0.9325696 -0.2520025 0.1002154 0.9325696 -0.3102037 0.1002154 0.9325696 -0.3838358 0.1002154 0.9325696 -0.4769901 0.1002154 0.9325696 -0.5948423 0.1002154 0.9325696 -0.7439407 0.1002154 0.9325696 -0.9325696 0.1002154 0.9325696 -0.9531389 0.1340017 0.7706179 -0.9661878 0.1775917 0.6556956 -0.9749962 0.2296253 0.5831647 -0.9811943 0.2885124 0.5461239 -0.9856839 0.3523802 0.5373763 -0.9890048 0.419125 0.5500554 -0.9914995 0.4865484 0.577891 -0.9933953 0.5525411 0.6153825 -0.9948487 0.6152669 0.6579314 -0.9959706 0.6733015 0.7019138 -0.9968409 0.7257011 0.7446768 -0.9975189 0.7719959 0.7844566 -0.9980488 0.8121268 0.8202389 -0.9984638 0.8463492 0.8515915 -0.9987895 0.8751301 0.8784967 -0.9990455 0.8990542 0.9012049 -0.999247 0.9187495 0.9201176 -0.9994057 0.9348352 0.9357024 -0.9995308 0.9478878 0.9484359 -0.9996295 0.9584237 0.9587693 -0.9997074 0.9668922 0.9671097 -0.9997688 0.9736756 0.9738123 -0.9998174 0.9790946 0.9791804 -0.9998557 0.9834141 0.9834679 -0.999886 0.9868512 0.986885 -0.9999099 0.9895825 0.9896036 -0.9999288 0.9917504 0.9917636 -0.9999437 0.9934697 0.9934779 -0.0624569 0.1444753 0.9354466 -0.0624063 0.1441359 0.9354101 -0.0623458 0.1437093 0.9353643 -0.0622749 0.1431744 0.9353068 -0.0621943 0.1425052 0.9352348 -0.0621069 0.1416707 0.9351449 -0.0620199 0.1406344 0.9350332 -0.0619473 0.1393548 0.9348949 -0.061916 0.1377865 0.9347252 -0.0619734 0.1358843 0.9345187 -0.062202 0.1336102 0.9342712 -0.062742 0.1309481 0.9339805 -0.0638283 0.1279297 0.9336494 -0.0658501 0.12468 0.9332914 -0.0694453 0.1214966 0.9329391 -0.0756464 0.1189805 0.9326595 -0.0860209 0.1181733 0.9325696 -0.1002154 0.1181733 0.9325696 -0.1181733 0.1181733 0.9325696 -0.1408925 0.1181733 0.9325696 -0.1696351 0.1181733 0.9325696 -0.2059983 0.1181733 0.9325696 -0.2520025 0.1181733 0.9325696 -0.3102037 0.1181733 0.9325696 -0.3838358 0.1181733 0.9325696 -0.4769901 0.1181733 0.9325696 -0.5948423 0.1181733 0.9325696 -0.7439407 0.1181733 0.9325696 -0.9325696 0.1181733 0.9325696 -0.9531389 0.1477366 0.7706179 -0.9661878 0.1879067 0.6556956 -0.9749962 0.2372529 0.5831647 -0.9811943 0.2940703 0.5461239 -0.9856839 0.3563715 0.5373763 -0.9890048 0.4219498 0.5500554 -0.9914995 0.4885191 0.577891 -0.9933953 0.5538969 0.6153825 -0.9948487 0.6161874 0.6579314 -0.9959706 0.6739188 0.7019138 -0.9968409 0.7261105 0.7446768 -0.9975189 0.7722648 0.7844566 -0.9980488 0.8123018 0.8202389 -0.9984638 0.8464623 0.8515915 -0.9987895 0.8752028 0.8784967 -0.9990455 0.8991006 0.9012049 -0.999247 0.9187791 0.9201176 -0.9994057 0.9348539 0.9357024 -0.9995308 0.9478997 0.9484359 -0.9996295 0.9584312 0.9587693 -0.9997074 0.9668969 0.9671097 -0.9997688 0.9736786 0.9738123 -0.9998174 0.9790965 0.9791804 -0.9998557 0.9834153 0.9834679 -0.999886 0.986852 0.986885 -0.9999099 0.9895829 0.9896036 -0.9999288 0.9917507 0.9917636 -0.9999437 0.9934698 0.9934779 -0.0624569 0.166541 0.9354466 -0.0624063 0.16621 0.9354101 -0.0623458 0.1657941 0.9353643 -0.0622749 0.1652725 0.9353068 -0.0621943 0.1646199 0.9352348 -0.0621069 0.1638062 0.9351449 -0.0620199 0.1627957 0.9350332 -0.0619473 0.1615479 0.9348949 -0.061916 0.1600186 0.9347252 -0.0619734 0.1581637 0.9345187 -0.062202 0.1559462 0.9342712 -0.062742 0.1533502 0.9339805 -0.0638283 0.1504067 0.9336494 -0.0658501 0.1472378 0.9332914 -0.0694453 0.1441333 0.9329391 -0.0756464 0.1416797 0.9326595 -0.0860209 0.1408925 0.9325696 -0.1002154 0.1408925 0.9325696 -0.1181733 0.1408925 0.9325696 -0.1408925 0.1408925 0.9325696 -0.1696351 0.1408925 0.9325696 -0.2059983 0.1408925 0.9325696 -0.2520025 0.1408925 0.9325696 -0.3102037 0.1408925 0.9325696 -0.3838358 0.1408925 0.9325696 -0.4769901 0.1408925 0.9325696 -0.5948423 0.1408925 0.9325696 -0.7439407 0.1408925 0.9325696 -0.9325696 0.1408925 0.9325696 -0.9531389 0.1651131 0.7706179 -0.9661878 0.2009566 0.6556956 -0.9749962 0.2469027 0.5831647 -0.9811943 0.3011018 0.5461239 -0.9856839 0.3614209 0.5373763 -0.9890048 0.4255236 0.5500554 -0.9914995 0.4910123 0.577891 -0.9933953 0.5556122 0.6153825 -0.9948487 0.6173519 0.6579314 -0.9959706 0.6746998 0.7019138 -0.9968409 0.7266285 0.7446768 -0.9975189 0.7726049 0.7844566 -0.9980488 0.8125232 0.8202389 -0.9984638 0.8466054 0.8515915 -0.9987895 0.8752947 0.8784967 -0.9990455 0.8991593 0.9012049 -0.999247 0.9188164 0.9201176 -0.9994057 0.9348776 0.9357024 -0.9995308 0.9479146 0.9484359 -0.9996295 0.9584406 0.9587693 -0.9997074 0.9669028 0.9671097 -0.9997688 0.9736823 0.9738123 -0.9998174 0.9790988 0.9791804 -0.9998557 0.9834167 0.9834679 -0.999886 0.9868529 0.986885 -0.9999099 0.9895835 0.9896036 -0.9999288 0.991751 0.9917636 -0.9999437 0.9934701 0.9934779 -0.0624569 0.1944569 0.9354466 -0.0624063 0.1941366 0.9354101 -0.0623458 0.1937341 0.9353643 -0.0622749 0.1932293 0.9353068 -0.0621943 0.1925979 0.9352348 -0.0621069 0.1918104 0.9351449 -0.0620199 0.1908325 0.9350332 -0.0619473 0.189625 0.9348949 -0.061916 0.1881451 0.9347252 -0.0619734 0.1863501 0.9345187 -0.062202 0.1842041 0.9342712 -0.062742 0.1816918 0.9339805 -0.0638283 0.1788432 0.9336494 -0.0658501 0.1757762 0.9332914 -0.0694453 0.1727717 0.9329391 -0.0756464 0.170397 0.9326595 -0.0860209 0.1696351 0.9325696 -0.1002154 0.1696351 0.9325696 -0.1181733 0.1696351 0.9325696 -0.1408925 0.1696351 0.9325696 -0.1696351 0.1696351 0.9325696 -0.2059983 0.1696351 0.9325696 -0.2520025 0.1696351 0.9325696 -0.3102037 0.1696351 0.9325696 -0.3838358 0.1696351 0.9325696 -0.4769901 0.1696351 0.9325696 -0.5948423 0.1696351 0.9325696 -0.7439407 0.1696351 0.9325696 -0.9325696 0.1696351 0.9325696 -0.9531389 0.1870965 0.7706179 -0.9661878 0.2174663 0.6556956 -0.9749962 0.2591111 0.5831647 -0.9811943 0.3099976 0.5461239 -0.9856839 0.3678092 0.5373763 -0.9890048 0.4300448 0.5500554 -0.9914995 0.4941665 0.577891 -0.9933953 0.5577822 0.6153825 -0.9948487 0.6188252 0.6579314 -0.9959706 0.6756878 0.7019138 -0.9968409 0.7272837 0.7446768 -0.9975189 0.7730352 0.7844566 -0.9980488 0.8128033 0.8202389 -0.9984638 0.8467864 0.8515915 -0.9987895 0.8754109 0.8784967 -0.9990455 0.8992336 0.9012049 -0.999247 0.9188636 0.9201176 -0.9994057 0.9349075 0.9357024 -0.9995308 0.9479335 0.9484359 -0.9996295 0.9584526 0.9587693 -0.9997074 0.9669103 0.9671097 -0.9997688 0.973687 0.9738123 -0.9998174 0.9791018 0.9791804 -0.9998557 0.9834186 0.9834679 -0.999886 0.9868541 0.986885 -0.9999099 0.9895842 0.9896036 -0.9999288 0.9917515 0.9917636 -0.9999437 0.9934704 0.9934779 -0.0624569 0.2297741 0.9354466 -0.0624063 0.2294673 0.9354101 -0.0623458 0.2290819 0.9353643 -0.0622749 0.2285984 0.9353068 -0.0621943 0.2279936 0.9352348 -0.0621069 0.2272394 0.9351449 -0.0620199 0.2263028 0.9350332 -0.0619473 0.2251463 0.9348949 -0.061916 0.2237288 0.9347252 -0.0619734 0.2220095 0.9345187 -0.062202 0.219954 0.9342712 -0.062742 0.2175476 0.9339805 -0.0638283 0.2148189 0.9336494 -0.0658501 0.2118811 0.9332914 -0.0694453 0.209003 0.9329391 -0.0756464 0.2067281 0.9326595 -0.0860209 0.2059983 0.9325696 -0.1002154 0.2059983 0.9325696 -0.1181733 0.2059983 0.9325696 -0.1408925 0.2059983 0.9325696 -0.1696351 0.2059983 0.9325696 -0.2059983 0.2059983 0.9325696 -0.2520025 0.2059983 0.9325696 -0.3102037 0.2059983 0.9325696 -0.3838358 0.2059983 0.9325696 -0.4769901 0.2059983 0.9325696 -0.5948423 0.2059983 0.9325696 -0.7439407 0.2059983 0.9325696 -0.9325696 0.2059983 0.9325696 -0.9531389 0.2149085 0.7706179 -0.9661878 0.2383533 0.6556956 -0.9749962 0.2745562 0.5831647 -0.9811943 0.3212519 0.5461239 -0.9856839 0.3758911 0.5373763 -0.9890048 0.4357648 0.5500554 -0.9914995 0.498157 0.577891 -0.9933953 0.5605276 0.6153825 -0.9948487 0.6206891 0.6579314 -0.9959706 0.6769378 0.7019138 -0.9968409 0.7281127 0.7446768 -0.9975189 0.7735795 0.7844566 -0.9980488 0.8131577 0.8202389 -0.9984638 0.8470154 0.8515915 -0.9987895 0.875558 0.8784967 -0.9990455 0.8993275 0.9012049 -0.999247 0.9189234 0.9201176 -0.9994057 0.9349454 0.9357024 -0.9995308 0.9479575 0.9484359 -0.9996295 0.9584677 0.9587693 -0.9997074 0.9669198 0.9671097 -0.9997688 0.973693 0.9738123 -0.9998174 0.9791055 0.9791804 -0.9998557 0.9834209 0.9834679 -0.999886 0.9868555 0.986885 -0.9999099 0.9895851 0.9896036 -0.9999288 0.9917521 0.9917636 -0.9999437 0.9934707 0.9934779 -0.0624569 0.274455 0.9354466 -0.0624063 0.2741654 0.9354101 -0.0623458 0.2738014 0.9353643 -0.0622749 0.2733449 0.9353068 -0.0621943 0.2727739 0.9352348 -0.0621069 0.2720617 0.9351449 -0.0620199 0.2711774 0.9350332 -0.0619473 0.2700853 0.9348949 -0.061916 0.2687468 0.9347252 -0.0619734 0.2671233 0.9345187 -0.062202 0.2651822 0.9342712 -0.062742 0.2629098 0.9339805 -0.0638283 0.260333 0.9336494 -0.0658501 0.2575585 0.9332914 -0.0694453 0.2548403 0.9329391 -0.0756464 0.2526918 0.9326595 -0.0860209 0.2520025 0.9325696 -0.1002154 0.2520025 0.9325696 -0.1181733 0.2520025 0.9325696 -0.1408925 0.2520025 0.9325696 -0.1696351 0.2520025 0.9325696 -0.2059983 0.2520025 0.9325696 -0.2520025 0.2520025 0.9325696 -0.3102037 0.2520025 0.9325696 -0.3838358 0.2520025 0.9325696 -0.4769901 0.2520025 0.9325696 -0.5948423 0.2520025 0.9325696 -0.7439407 0.2520025 0.9325696 -0.9325696 0.2520025 0.9325696 -0.9531389 0.2500942 0.7706179 -0.9661878 0.2647781 0.6556956 -0.9749962 0.2940963 0.5831647 -0.9811943 0.3354901 0.5461239 -0.9856839 0.3861159 0.5373763 -0.9890048 0.4430013 0.5500554 -0.9914995 0.5032055 0.577891 -0.9933953 0.5640008 0.6153825 -0.9948487 0.6230471 0.6579314 -0.9959706 0.6785192 0.7019138 -0.9968409 0.7291615 0.7446768 -0.9975189 0.7742682 0.7844566 -0.9980488 0.8136061 0.8202389 -0.9984638 0.8473052 0.8515915 -0.9987895 0.8757441 0.8784967 -0.9990455 0.8994464 0.9012049 -0.999247 0.918999 0.9201176 -0.9994057 0.9349933 0.9357024 -0.9995308 0.9479878 0.9484359 -0.9996295 0.9584868 0.9587693 -0.9997074 0.9669318 0.9671097 -0.9997688 0.9737006 0.9738123 -0.9998174 0.9791103 0.9791804 -0.9998557 0.9834239 0.9834679 -0.999886 0.9868574 0.986885 -0.9999099 0.9895863 0.9896036 -0.9999288 0.9917528 0.9917636 -0.9999437 0.9934712 0.9934779 -0.0624569 0.3309822 0.9354466 -0.0624063 0.3307142 0.9354101 -0.0623458 0.3303774 0.9353643 -0.0622749 0.3299551 0.9353068 -0.0621943 0.3294267 0.9352348 -0.0621069 0.3287678 0.9351449 -0.0620199 0.3279495 0.9350332 -0.0619473 0.326939 0.9348949 -0.061916 0.3257005 0.9347252 -0.0619734 0.3241981 0.9345187 -0.062202 0.3224019 0.9342712 -0.062742 0.3202989 0.9339805 -0.0638283 0.3179142 0.9336494 -0.0658501 0.3153463 0.9332914 -0.0694453 0.3128305 0.9329391 -0.0756464 0.3108418 0.9326595 -0.0860209 0.3102037 0.9325696 -0.1002154 0.3102037 0.9325696 -0.1181733 0.3102037 0.9325696 -0.1408925 0.3102037 0.9325696 -0.1696351 0.3102037 0.9325696 -0.2059983 0.3102037 0.9325696 -0.2520025 0.3102037 0.9325696 -0.3102037 0.3102037 0.9325696 -0.3838358 0.3102037 0.9325696 -0.4769901 0.3102037 0.9325696 -0.5948423 0.3102037 0.9325696 -0.7439407 0.3102037 0.9325696 -0.9325696 0.3102037 0.9325696 -0.9531389 0.2946088 0.7706179 -0.9661878 0.2982089 0.6556956 -0.9749962 0.3188171 0.5831647 -0.9811943 0.3535032 0.5461239 -0.9856839 0.3990515 0.5373763 -0.9890048 0.4521565 0.5500554 -0.9914995 0.5095925 0.577891 -0.9933953 0.5683949 0.6153825 -0.9948487 0.6260304 0.6579314 -0.9959706 0.6805199 0.7019138 -0.9968409 0.7304884 0.7446768 -0.9975189 0.7751395 0.7844566 -0.9980488 0.8141733 0.8202389 -0.9984638 0.8476717 0.8515915 -0.9987895 0.8759795 0.8784967 -0.9990455 0.8995968 0.9012049 -0.999247 0.9190947 0.9201176 -0.9994057 0.935054 0.9357024 -0.9995308 0.9480261 0.9484359 -0.9996295 0.9585109 0.9587693 -0.9997074 0.966947 0.9671097 -0.9997688 0.9737101 0.9738123 -0.9998174 0.9791163 0.9791804 -0.9998557 0.9834277 0.9834679 -0.999886 0.9868597 0.986885 -0.9999099 0.9895878 0.9896036 -0.9999288 0.9917537 0.9917636 -0.9999437 0.9934718 0.9934779 -0.0624569 0.4024964 0.9354466 -0.0624063 0.4022558 0.9354101 -0.0623458 0.4019535 0.9353643 -0.0622749 0.4015743 0.9353068 -0.0621943 0.4010999 0.9352348 -0.0621069 0.4005083 0.9351449 -0.0620199 0.3997736 0.9350332 -0.0619473 0.3988663 0.9348949 -0.061916 0.3977542 0.9347252 -0.0619734 0.3964052 0.9345187 -0.062202 0.3947922 0.9342712 -0.062742 0.3929036 0.9339805 -0.0638283 0.3907618 0.9336494 -0.0658501 0.3884555 0.9332914 -0.0694453 0.3861956 0.9329391 -0.0756464 0.3844091 0.9326595 -0.0860209 0.3838358 0.9325696 -0.1002154 0.3838358 0.9325696 -0.1181733 0.3838358 0.9325696 -0.1408925 0.3838358 0.9325696 -0.1696351 0.3838358 0.9325696 -0.2059983 0.3838358 0.9325696 -0.2520025 0.3838358 0.9325696 -0.3102037 0.3838358 0.9325696 -0.3838358 0.3838358 0.9325696 -0.4769901 0.3838358 0.9325696 -0.5948423 0.3838358 0.9325696 -0.7439407 0.3838358 0.9325696 -0.9325696 0.3838358 0.9325696 -0.9531389 0.3509254 0.7706179 -0.9661878 0.3405032 0.6556956 -0.9749962 0.3500921 0.5831647 -0.9811943 0.3762922 0.5461239 -0.9856839 0.4154167 0.5373763 -0.9890048 0.4637389 0.5500554 -0.9914995 0.5176729 0.577891 -0.9933953 0.573954 0.6153825 -0.9948487 0.6298046 0.6579314 -0.9959706 0.683051 0.7019138 -0.9968409 0.732167 0.7446768 -0.9975189 0.7762418 0.7844566 -0.9980488 0.8148909 0.8202389 -0.9984638 0.8481355 0.8515915 -0.9987895 0.8762773 0.8784967 -0.9990455 0.899787 0.9012049 -0.999247 0.9192157 0.9201176 -0.9994057 0.9351307 0.9357024 -0.9995308 0.9480746 0.9484359 -0.9996295 0.9585415 0.9587693 -0.9997074 0.9669663 0.9671097 -0.9997688 0.9737222 0.9738123 -0.9998174 0.9791238 0.9791804 -0.9998557 0.9834324 0.9834679 -0.999886 0.9868627 0.986885 -0.9999099 0.9895897 0.9896036 -0.9999288 0.9917549 0.9917636 -0.9999437 0.9934725 0.9934779 -0.0624569 0.4929712 0.9354466 -0.0624063 0.4927653 0.9354101 -0.0623458 0.4925065 0.9353643 -0.0622749 0.4921819 0.9353068 -0.0621943 0.4917758 0.9352348 -0.0621069 0.4912694 0.9351449 -0.0620199 0.4906404 0.9350332 -0.0619473 0.4898637 0.9348949 -0.061916 0.4889116 0.9347252 -0.0619734 0.4877565 0.9345187 -0.062202 0.4863753 0.9342712 -0.062742 0.484758 0.9339805 -0.0638283 0.4829236 0.9336494 -0.0658501 0.480948 0.9332914 -0.0694453 0.479012 0.9329391 -0.0756464 0.4774812 0.9326595 -0.0860209 0.4769901 0.9325696 -0.1002154 0.4769901 0.9325696 -0.1181733 0.4769901 0.9325696 -0.1408925 0.4769901 0.9325696 -0.1696351 0.4769901 0.9325696 -0.2059983 0.4769901 0.9325696 -0.2520025 0.4769901 0.9325696 -0.3102037 0.4769901 0.9325696 -0.3838358 0.4769901 0.9325696 -0.4769901 0.4769901 0.9325696 -0.5948423 0.4769901 0.9325696 -0.7439407 0.4769901 0.9325696 -0.9325696 0.4769901 0.9325696 -0.9531389 0.4221733 0.7706179 -0.9661878 0.3940109 0.6556956 -0.9749962 0.389659 0.5831647 -0.9811943 0.4051232 0.5461239 -0.9856839 0.4361208 0.5373763 -0.9890048 0.4783922 0.5500554 -0.9914995 0.5278957 0.577891 -0.9933953 0.580987 0.6153825 -0.9948487 0.6345795 0.6579314 -0.9959706 0.6862532 0.7019138 -0.9968409 0.7342907 0.7446768 -0.9975189 0.7776364 0.7844566 -0.9980488 0.8157988 0.8202389 -0.9984638 0.8487222 0.8515915 -0.9987895 0.8766541 0.8784967 -0.9990455 0.9000277 0.9012049 -0.999247 0.9193688 0.9201176 -0.9994057 0.9352277 0.9357024 -0.9995308 0.9481359 0.9484359 -0.9996295 0.9585802 0.9587693 -0.9997074 0.9669906 0.9671097 -0.9997688 0.9737375 0.9738123 -0.9998174 0.9791334 0.9791804 -0.9998557 0.9834385 0.9834679 -0.999886 0.9868665 0.986885 -0.9999099 0.989592 0.9896036 -0.9999288 0.9917564 0.9917636 -0.9999437 0.9934734 0.9934779 -0.0624569 0.6074336 0.9354466 -0.0624063 0.6072715 0.9354101 -0.0623458 0.6070678 0.9353643 -0.0622749 0.6068123 0.9353068 -0.0621943 0.6064926 0.9352348 -0.0621069 0.6060939 0.9351449 -0.0620199 0.6055988 0.9350332 -0.0619473 0.6049872 0.9348949 -0.061916 0.6042375 0.9347252 -0.0619734 0.6033278 0.9345187 -0.062202 0.6022399 0.9342712 -0.062742 0.6009658 0.9339805 -0.0638283 0.5995203 0.9336494 -0.0658501 0.5979631 0.9332914 -0.0694453 0.5964367 0.9329391 -0.0756464 0.5952297 0.9326595 -0.0860209 0.5948423 0.9325696 -0.1002154 0.5948423 0.9325696 -0.1181733 0.5948423 0.9325696 -0.1408925 0.5948423 0.9325696 -0.1696351 0.5948423 0.9325696 -0.2059983 0.5948423 0.9325696 -0.2520025 0.5948423 0.9325696 -0.3102037 0.5948423 0.9325696 -0.3838358 0.5948423 0.9325696 -0.4769901 0.5948423 0.9325696 -0.5948423 0.5948423 0.9325696 -0.7439407 0.5948423 0.9325696 -0.9325696 0.5948423 0.9325696 -0.9531389 0.5123112 0.7706179 -0.9661878 0.4617052 0.6556956 -0.9749962 0.4397163 0.5831647 -0.9811943 0.4415982 0.5461239 -0.9856839 0.4623142 0.5373763 -0.9890048 0.4969305 0.5500554 -0.9914995 0.5408288 0.577891 -0.9933953 0.5898847 0.6153825 -0.9948487 0.6406203 0.6579314 -0.9959706 0.6903044 0.7019138 -0.9968409 0.7369774 0.7446768 -0.9975189 0.7794007 0.7844566 -0.9980488 0.8169474 0.8202389 -0.9984638 0.8494644 0.8515915 -0.9987895 0.8771307 0.8784967 -0.9990455 0.9003323 0.9012049 -0.999247 0.9195625 0.9201176 -0.9994057 0.9353505 0.9357024 -0.9995308 0.9482135 0.9484359 -0.9996295 0.9586291 0.9587693 -0.9997074 0.9670214 0.9671097 -0.9997688 0.9737569 0.9738123 -0.9998174 0.9791456 0.9791804 -0.9998557 0.9834461 0.9834679 -0.999886 0.9868713 0.986885 -0.9999099 0.989595 0.9896036 -0.9999288 0.9917582 0.9917636 -0.9999437 0.9934746 0.9934779 -0.0624569 0.7522434 0.9354466 -0.0624063 0.7521367 0.9354101 -0.0623458 0.7520027 0.9353643 -0.0622749 0.7518347 0.9353068 -0.0621943 0.7516243 0.9352348 -0.0621069 0.751362 0.9351449 -0.0620199 0.7510361 0.9350332 -0.0619473 0.7506335 0.9348949 -0.061916 0.7501398 0.9347252 -0.0619734 0.7495406 0.9345187 -0.062202 0.7488237 0.9342712 -0.062742 0.7479837 0.9339805 -0.0638283 0.7470302 0.9336494 -0.0658501 0.7460024 0.9332914 -0.0694453 0.7449944 0.9329391 -0.0756464 0.7441968 0.9326595 -0.0860209 0.7439407 0.9325696 -0.1002154 0.7439407 0.9325696 -0.1181733 0.7439407 0.9325696 -0.1408925 0.7439407 0.9325696 -0.1696351 0.7439407 0.9325696 -0.2059983 0.7439407 0.9325696 -0.2520025 0.7439407 0.9325696 -0.3102037 0.7439407 0.9325696 -0.3838358 0.7439407 0.9325696 -0.4769901 0.7439407 0.9325696 -0.5948423 0.7439407 0.9325696 -0.7439407 0.7439407 0.9325696 -0.9325696 0.7439407 0.9325696 -0.9531389 0.6263473 0.7706179 -0.9661878 0.5473473 0.6556956 -0.9749962 0.5030453 0.5831647 -0.9811943 0.4877437 0.5461239 -0.9856839 0.4954523 0.5373763 -0.9890048 0.5203839 0.5500554 -0.9914995 0.5571908 0.577891 -0.9933953 0.6011414 0.6153825 -0.9948487 0.6482627 0.6579314 -0.9959706 0.6954296 0.7019138 -0.9968409 0.7403765 0.7446768 -0.9975189 0.7816327 0.7844566 -0.9980488 0.8184005 0.8202389 -0.9984638 0.8504035 0.8515915 -0.9987895 0.8777338 0.8784967 -0.9990455 0.9007175 0.9012049 -0.999247 0.9198076 0.9201176 -0.9994057 0.9355059 0.9357024 -0.9995308 0.9483117 0.9484359 -0.9996295 0.958691 0.9587693 -0.9997074 0.9670604 0.9671097 -0.9997688 0.9737814 0.9738123 -0.9998174 0.979161 0.9791804 -0.9998557 0.9834557 0.9834679 -0.999886 0.9868773 0.986885 -0.9999099 0.9895988 0.9896036 -0.9999288 0.9917606 0.9917636 -0.9999437 0.9934761 0.9934779 -0.0624569 0.9354466 0.9354466 -0.0624063 0.9354101 0.9354101 -0.0623458 0.9353643 0.9353643 -0.0622749 0.9353068 0.9353068 -0.0621943 0.9352348 0.9352348 -0.0621069 0.9351449 0.9351449 -0.0620199 0.9350332 0.9350332 -0.0619473 0.9348949 0.9348949 -0.061916 0.9347252 0.9347252 -0.0619734 0.9345187 0.9345187 -0.062202 0.9342712 0.9342712 -0.062742 0.9339805 0.9339805 -0.0638283 0.9336494 0.9336494 -0.0658501 0.9332914 0.9332914 -0.0694453 0.9329391 0.9329391 -0.0756464 0.9326595 0.9326595 -0.0860209 0.9325696 0.9325696 -0.1002154 0.9325696 0.9325696 -0.1181733 0.9325696 0.9325696 -0.1408925 0.9325696 0.9325696 -0.1696351 0.9325696 0.9325696 -0.2059983 0.9325696 0.9325696 -0.2520025 0.9325696 0.9325696 -0.3102037 0.9325696 0.9325696 -0.3838358 0.9325696 0.9325696 -0.4769901 0.9325696 0.9325696 -0.5948423 0.9325696 0.9325696 -0.7439407 0.9325696 0.9325696 -0.9325696 0.9325696 0.9325696 -0.9531389 0.7706179 0.7706179 -0.9661878 0.6556956 0.6556956 -0.9749962 0.5831647 0.5831647 -0.9811943 0.5461239 0.5461239 -0.9856839 0.5373763 0.5373763 -0.9890048 0.5500554 0.5500554 -0.9914995 0.577891 0.577891 -0.9933953 0.6153825 0.6153825 -0.9948487 0.6579314 0.6579314 -0.9959706 0.7019138 0.7019138 -0.9968409 0.7446768 0.7446768 -0.9975189 0.7844566 0.7844566 -0.9980488 0.8202389 0.8202389 -0.9984638 0.8515915 0.8515915 -0.9987895 0.8784967 0.8784967 -0.9990455 0.9012049 0.9012049 -0.999247 0.9201176 0.9201176 -0.9994057 0.9357024 0.9357024 -0.9995308 0.9484359 0.9484359 -0.9996295 0.9587693 0.9587693 -0.9997074 0.9671097 0.9671097 -0.9997688 0.9738123 0.9738123 -0.9998174 0.9791804 0.9791804 -0.9998557 0.9834679 0.9834679 -0.999886 0.986885 0.986885 -0.9999099 0.9896036 0.9896036 -0.9999288 0.9917636 0.9917636 -0.9999437 0.9934779 0.9934779 -0.1059991 0.9545467 0.7765244 -0.1059489 0.9545286 0.776448 -0.1058883 0.9545059 0.776352 -0.1058162 0.9544774 0.7762317 -0.1057322 0.9544418 0.7760811 -0.1056375 0.9543974 0.7758934 -0.1055364 0.9543421 0.7756603 -0.1054384 0.9542739 0.7753725 -0.1053624 0.9541902 0.7750199 -0.1053433 0.9540886 0.7745924 -0.1054431 0.9539671 0.7740814 -0.1057683 0.9538247 0.7734835 -0.1064997 0.953663 0.7728059 -0.1079385 0.9534887 0.7720768 -0.1105818 0.9533177 0.7713628 -0.1152388 0.9531823 0.7707988 -0.1231452 0.9531389 0.7706179 -0.1340017 0.9531389 0.7706179 -0.1477366 0.9531389 0.7706179 -0.1651131 0.9531389 0.7706179 -0.1870965 0.9531389 0.7706179 -0.2149085 0.9531389 0.7706179 -0.2500942 0.9531389 0.7706179 -0.2946088 0.9531389 0.7706179 -0.3509254 0.9531389 0.7706179 -0.4221733 0.9531389 0.7706179 -0.5123112 0.9531389 0.7706179 -0.6263473 0.9531389 0.7706179 -0.7706179 0.9531389 0.7706179 -0.9531389 0.9531389 0.7706179 -0.9661878 0.7927704 0.6556956 -0.9749962 0.6845262 0.5831647 -0.9811943 0.6199824 0.5461239 -0.9856839 0.5904156 0.5373763 -0.9890048 0.5875938 0.5500554 -0.9914995 0.6040793 0.577891 -0.9933953 0.6333995 0.6153825 -0.9948487 0.6701635 0.6579314 -0.9959706 0.710117 0.7019138 -0.9968409 0.7501172 0.7446768 -0.9975189 0.7880291 0.7844566 -0.9980488 0.8225647 0.8202389 -0.9984638 0.8530945 0.8515915 -0.9987895 0.8794619 0.8784967 -0.9990455 0.9018215 0.9012049 -0.999247 0.9205098 0.9201176 -0.9994057 0.935951 0.9357024 -0.9995308 0.9485931 0.9484359 -0.9996295 0.9588684 0.9587693 -0.9997074 0.967172 0.9671097 -0.9997688 0.9738515 0.9738123 -0.9998174 0.979205 0.9791804 -0.9998557 0.9834833 0.9834679 -0.999886 0.9868946 0.986885 -0.9999099 0.9896096 0.9896036 -0.9999288 0.9917674 0.9917636 -0.9999437 0.9934803 0.9934779 -0.1572498 0.9669269 0.6628604 -0.1572031 0.9669173 0.6627673 -0.1571463 0.9669053 0.6626503 -0.1570779 0.9668902 0.6625036 -0.1569971 0.9668714 0.6623201 -0.156904 0.9668479 0.6620914 -0.1568008 0.9668187 0.6618076 -0.1566936 0.9667827 0.6614574 -0.1565954 0.9667385 0.6610284 -0.1565315 0.966685 0.6605087 -0.1565473 0.9666211 0.6598881 -0.1567226 0.9665463 0.6591625 -0.1571937 0.9664615 0.6583412 -0.15819 0.9663702 0.6574584 -0.160092 0.9662809 0.6565952 -0.1635226 0.9662104 0.655914 -0.1694384 0.9661878 0.6556956 -0.1775917 0.9661878 0.6556956 -0.1879067 0.9661878 0.6556956 -0.2009566 0.9661878 0.6556956 -0.2174663 0.9661878 0.6556956 -0.2383533 0.9661878 0.6556956 -0.2647781 0.9661878 0.6556956 -0.2982089 0.9661878 0.6556956 -0.3405032 0.9661878 0.6556956 -0.3940109 0.9661878 0.6556956 -0.4617052 0.9661878 0.6556956 -0.5473473 0.9661878 0.6556956 -0.6556956 0.9661878 0.6556956 -0.7927704 0.9661878 0.6556956 -0.9661878 0.9661878 0.6556956 -0.9749962 0.8127617 0.5831647 -0.9811943 0.713423 0.5461239 -0.9856839 0.6575172 0.5373763 -0.9890048 0.6350848 0.5500554 -0.9914995 0.637211 0.577891 -0.9933953 0.6561933 0.6153825 -0.9948487 0.6856388 0.6579314 -0.9959706 0.7204952 0.7019138 -0.9968409 0.757 0.7446768 -0.9975189 0.7925488 0.7844566 -0.9980488 0.8255071 0.8202389 -0.9984638 0.8549959 0.8515915 -0.9987895 0.880683 0.8784967 -0.9990455 0.9026016 0.9012049 -0.999247 0.9210061 0.9201176 -0.9994057 0.9362655 0.9357024 -0.9995308 0.9487918 0.9484359 -0.9996295 0.9589938 0.9587693 -0.9997074 0.9672509 0.9671097 -0.9997688 0.9739011 0.9738123 -0.9998174 0.9792361 0.9791804 -0.9998557 0.9835029 0.9834679 -0.999886 0.9869069 0.986885 -0.9999099 0.9896173 0.9896036 -0.9999288 0.9917722 0.9917636 -0.9999437 0.9934833 0.9934779 -0.2151269 0.9754027 0.590326 -0.2150852 0.9753975 0.5902326 -0.2150342 0.9753908 0.5901152 -0.2149725 0.9753825 0.5899682 -0.2148987 0.9753721 0.5897842 -0.2148124 0.9753591 0.589555 -0.2147144 0.975343 0.5892706 -0.2146085 0.9753231 0.5889198 -0.2145034 0.9752987 0.5884903 -0.2144168 0.9752692 0.5879701 -0.2143816 0.975234 0.5873492 -0.2144566 0.9751928 0.5866239 -0.2147432 0.9751462 0.5858033 -0.2154135 0.9750962 0.5849222 -0.2167545 0.9750472 0.5840612 -0.2192389 0.9750086 0.5833822 -0.2235962 0.9749962 0.5831647 -0.2296253 0.9749962 0.5831647 -0.2372529 0.9749962 0.5831647 -0.2469027 0.9749962 0.5831647 -0.2591111 0.9749962 0.5831647 -0.2745562 0.9749962 0.5831647 -0.2940963 0.9749962 0.5831647 -0.3188171 0.9749962 0.5831647 -0.3500921 0.9749962 0.5831647 -0.389659 0.9749962 0.5831647 -0.4397163 0.9749962 0.5831647 -0.5030453 0.9749962 0.5831647 -0.5831647 0.9749962 0.5831647 -0.6845262 0.9749962 0.5831647 -0.8127617 0.9749962 0.5831647 -0.9749962 0.9749962 0.5831647 -0.9811943 0.8316375 0.5461239 -0.9856839 0.7424095 0.5373763 -0.9890048 0.695167 0.5500554 -0.9914995 0.6791269 0.577891 -0.9933953 0.6850303 0.6153825 -0.9948487 0.7052169 0.6579314 -0.9959706 0.733625 0.7019138 -0.9968409 0.7657077 0.7446768 -0.9975189 0.7982669 0.7844566 -0.9980488 0.8292297 0.8202389 -0.9984638 0.8574015 0.8515915 -0.9987895 0.8822279 0.8784967 -0.9990455 0.9035886 0.9012049 -0.999247 0.9216339 0.9201176 -0.9994057 0.9366635 0.9357024 -0.9995308 0.9490434 0.9484359 -0.9996295 0.9591524 0.9587693 -0.9997074 0.9673508 0.9671097 -0.9997688 0.9739638 0.9738123 -0.9998174 0.9792755 0.9791804 -0.9998557 0.9835276 0.9834679 -0.999886 0.9869223 0.986885 -0.9999099 0.989627 0.9896036 -0.9999288 0.9917782 0.9917636 -0.9999437 0.9934871 0.9934779 -0.2783684 0.9814251 0.5525787 -0.2783325 0.9814221 0.5524942 -0.2782884 0.9814183 0.5523882 -0.2782347 0.9814136 0.5522553 -0.2781701 0.9814076 0.5520892 -0.2780936 0.9814002 0.5518821 -0.2780055 0.9813911 0.5516253 -0.2779077 0.9813797 0.5513085 -0.2778058 0.9813659 0.5509208 -0.2777122 0.9813491 0.5504514 -0.2776503 0.9813291 0.5498914 -0.2776626 0.9813057 0.5492375 -0.2778236 0.9812792 0.5484982 -0.2782606 0.9812508 0.5477048 -0.2791873 0.9812231 0.5469301 -0.2809573 0.9812013 0.5463195 -0.2841192 0.9811943 0.5461239 -0.2885124 0.9811943 0.5461239 -0.2940703 0.9811943 0.5461239 -0.3011018 0.9811943 0.5461239 -0.3099976 0.9811943 0.5461239 -0.3212519 0.9811943 0.5461239 -0.3354901 0.9811943 0.5461239 -0.3535032 0.9811943 0.5461239 -0.3762922 0.9811943 0.5461239 -0.4051232 0.9811943 0.5461239 -0.4415982 0.9811943 0.5461239 -0.4877437 0.9811943 0.5461239 -0.5461239 0.9811943 0.5461239 -0.6199824 0.9811943 0.5461239 -0.713423 0.9811943 0.5461239 -0.8316375 0.9811943 0.5461239 -0.9811943 0.9811943 0.5461239 -0.9856839 0.8498092 0.5373763 -0.9890048 0.7711789 0.5500554 -0.9914995 0.7321559 0.577891 -0.9933953 0.721513 0.6153825 -0.9948487 0.7299859 0.6579314 -0.9959706 0.7502359 0.7019138 -0.9968409 0.776724 0.7446768 -0.9975189 0.8055009 0.7844566 -0.9980488 0.8339392 0.8202389 -0.9984638 0.8604449 0.8515915 -0.9987895 0.8841823 0.8784967 -0.9990455 0.9048372 0.9012049 -0.999247 0.9224281 0.9201176 -0.9994057 0.9371669 0.9357024 -0.9995308 0.9493615 0.9484359 -0.9996295 0.959353 0.9587693 -0.9997074 0.967477 0.9671097 -0.9997688 0.9740432 0.9738123 -0.9998174 0.9793253 0.9791804 -0.9998557 0.9835588 0.9834679 -0.999886 0.9869419 0.986885 -0.9999099 0.9896392 0.9896036 -0.9999288 0.9917859 0.9917636 -0.9999437 0.9934919 0.9934779 -0.3454107 0.9858181 0.5428189 -0.3453807 0.9858163 0.5427476 -0.3453439 0.9858141 0.542658 -0.3452987 0.9858113 0.5425458 -0.3452442 0.9858079 0.5424054 -0.3451791 0.9858036 0.5422305 -0.3451032 0.9857982 0.5420136 -0.3450175 0.9857916 0.5417461 -0.3449254 0.9857835 0.5414188 -0.3448353 0.9857738 0.5410227 -0.3447636 0.9857621 0.5405503 -0.3447407 0.9857485 0.5399988 -0.3448204 0.9857332 0.5393756 -0.3450957 0.9857167 0.5387072 -0.3457234 0.9857006 0.5380548 -0.3469645 0.9856879 0.5375409 -0.3492254 0.9856839 0.5373763 -0.3523802 0.9856839 0.5373763 -0.3563715 0.9856839 0.5373763 -0.3614209 0.9856839 0.5373763 -0.3678092 0.9856839 0.5373763 -0.3758911 0.9856839 0.5373763 -0.3861159 0.9856839 0.5373763 -0.3990515 0.9856839 0.5373763 -0.4154167 0.9856839 0.5373763 -0.4361208 0.9856839 0.5373763 -0.4623142 0.9856839 0.5373763 -0.4954523 0.9856839 0.5373763 -0.5373763 0.9856839 0.5373763 -0.5904156 0.9856839 0.5373763 -0.6575172 0.9856839 0.5373763 -0.7424095 0.9856839 0.5373763 -0.8498092 0.9856839 0.5373763 -0.9856839 0.9856839 0.5373763 -0.9890048 0.8673437 0.5500554 -0.9914995 0.7992446 0.577891 -0.9933953 0.7676683 0.6153825 -0.9948487 0.7613218 0.6579314 -0.9959706 0.7712508 0.7019138 -0.9968409 0.7906611 0.7446768 -0.9975189 0.8146529 0.7844566 -0.9980488 0.8398974 0.8202389 -0.9984638 0.8642952 0.8515915 -0.9987895 0.886655 0.8784967 -0.9990455 0.9064168 0.9012049 -0.999247 0.9234329 0.9201176 -0.9994057 0.9378038 0.9357024 -0.9995308 0.9497641 0.9484359 -0.9996295 0.9596068 0.9587693 -0.9997074 0.9676368 0.9671097 -0.9997688 0.9741436 0.9738123 -0.9998174 0.9793883 0.9791804 -0.9998557 0.9835983 0.9834679 -0.999886 0.9869667 0.986885 -0.9999099 0.9896547 0.9896036 -0.9999288 0.9917956 0.9917636 -0.9999437 0.993498 0.9934779 -0.4144197 0.9890841 0.5544266 -0.4143955 0.9890831 0.5543692 -0.4143657 0.9890818 0.5542971 -0.414329 0.9890801 0.5542068 -0.4142845 0.9890781 0.5540939 -0.4142311 0.9890755 0.5539533 -0.4141683 0.9890723 0.5537789 -0.4140964 0.9890684 0.5535638 -0.4140176 0.9890637 0.5533007 -0.4139373 0.9890579 0.5529823 -0.4138668 0.989051 0.5526027 -0.4138277 0.989043 0.5521598 -0.4138582 0.9890339 0.5516594 -0.4140252 0.9890241 0.5511229 -0.4144423 0.9890146 0.5505995 -0.4152991 0.9890072 0.5501874 -0.4168922 0.9890048 0.5500554 -0.419125 0.9890048 0.5500554 -0.4219498 0.9890048 0.5500554 -0.4255236 0.9890048 0.5500554 -0.4300448 0.9890048 0.5500554 -0.4357648 0.9890048 0.5500554 -0.4430013 0.9890048 0.5500554 -0.4521565 0.9890048 0.5500554 -0.4637389 0.9890048 0.5500554 -0.4783922 0.9890048 0.5500554 -0.4969305 0.9890048 0.5500554 -0.5203839 0.9890048 0.5500554 -0.5500554 0.9890048 0.5500554 -0.5875938 0.9890048 0.5500554 -0.6350848 0.9890048 0.5500554 -0.695167 0.9890048 0.5500554 -0.7711789 0.9890048 0.5500554 -0.8673437 0.9890048 0.5500554 -0.9890048 0.9890048 0.5500554 -0.9914995 0.8841204 0.577891 -0.9933953 0.8260608 0.6153825 -0.9948487 0.8009659 0.6579314 -0.9959706 0.7978374 0.7019138 -0.9968409 0.8082934 0.7446768 -0.9975189 0.8262314 0.7844566 -0.9980488 0.8474353 0.8202389 -0.9984638 0.8691663 0.8515915 -0.9987895 0.8897832 0.8784967 -0.9990455 0.9084153 0.9012049 -0.999247 0.9247041 0.9201176 -0.9994057 0.9386096 0.9357024 -0.9995308 0.9502734 0.9484359 -0.9996295 0.959928 0.9587693 -0.9997074 0.9678389 0.9671097 -0.9997688 0.9742706 0.9738123 -0.9998174 0.9794681 0.9791804 -0.9998557 0.9836483 0.9834679 -0.999886 0.986998 0.986885 -0.9999099 0.9896744 0.9896036 -0.9999288 0.9918079 0.9917636 -0.9999437 0.9935057 0.9934779 -0.4834235 0.9915469 0.5812684 -0.4834045 0.9915463 0.581224 -0.4833811 0.9915455 0.5811683 -0.4833522 0.9915446 0.5810984 -0.4833171 0.9915433 0.5810111 -0.4832747 0.9915418 0.5809023 -0.4832246 0.9915399 0.5807673 -0.4831666 0.9915376 0.580601 -0.4831021 0.9915347 0.5803976 -0.4830346 0.9915312 0.5801514 -0.4829718 0.9915271 0.579858 -0.4829286 0.9915223 0.5795157 -0.4829319 0.9915169 0.5791292 -0.4830292 0.991511 0.5787149 -0.4833013 0.9915054 0.5783109 -0.4838841 0.9915009 0.5779928 -0.4849907 0.9914995 0.577891 -0.4865484 0.9914995 0.577891 -0.4885191 0.9914995 0.577891 -0.4910123 0.9914995 0.577891 -0.4941665 0.9914995 0.577891 -0.498157 0.9914995 0.577891 -0.5032055 0.9914995 0.577891 -0.5095925 0.9914995 0.577891 -0.5176729 0.9914995 0.577891 -0.5278957 0.9914995 0.577891 -0.5408288 0.9914995 0.577891 -0.5571908 0.9914995 0.577891 -0.577891 0.9914995 0.577891 -0.6040793 0.9914995 0.577891 -0.637211 0.9914995 0.577891 -0.6791269 0.9914995 0.577891 -0.7321559 0.9914995 0.577891 -0.7992446 0.9914995 0.577891 -0.8841204 0.9914995 0.577891 -0.9914995 0.9914995 0.577891 -0.9933953 0.8999349 0.6153825 -0.9948487 0.8511207 0.6579314 -0.9959706 0.8314729 0.7019138 -0.9968409 0.8306004 0.7446768 -0.9975189 0.8408797 0.7844566 -0.9980488 0.8569716 0.8202389 -0.9984638 0.875329 0.8515915 -0.9987895 0.8937407 0.8784967 -0.9990455 0.9109436 0.9012049 -0.999247 0.9263124 0.9201176 -0.9994057 0.939629 0.9357024 -0.9995308 0.9509177 0.9484359 -0.9996295 0.9603343 0.9587693 -0.9997074 0.9680946 0.9671097 -0.9997688 0.9744313 0.9738123 -0.9998174 0.9795689 0.9791804 -0.9998557 0.9837116 0.9834679 -0.999886 0.9870376 0.986885 -0.9999099 0.9896992 0.9896036 -0.9999288 0.9918234 0.9917636 -0.9999437 0.9935154 0.9934779 -0.5504963 0.993424 0.6179091 -0.5504818 0.9934236 0.6178759 -0.550464 0.9934231 0.6178341 -0.5504419 0.9934225 0.6177818 -0.550415 0.9934218 0.6177164 -0.5503825 0.9934209 0.6176349 -0.5503438 0.9934197 0.6175339 -0.5502987 0.9934183 0.6174094 -0.550248 0.9934166 0.6172571 -0.5501939 0.9934145 0.6170729 -0.5501416 0.993412 0.6168533 -0.5501012 0.9934091 0.6165973 -0.5500915 0.9934058 0.6163081 -0.5501456 0.9934023 0.6159984 -0.5503203 0.9933988 0.6156963 -0.5507113 0.9933961 0.6154586 -0.5514695 0.9933953 0.6153825 -0.5525411 0.9933953 0.6153825 -0.5538969 0.9933953 0.6153825 -0.5556122 0.9933953 0.6153825 -0.5577822 0.9933953 0.6153825 -0.5605276 0.9933953 0.6153825 -0.5640008 0.9933953 0.6153825 -0.5683949 0.9933953 0.6153825 -0.573954 0.9933953 0.6153825 -0.580987 0.9933953 0.6153825 -0.5898847 0.9933953 0.6153825 -0.6011414 0.9933953 0.6153825 -0.6153825 0.9933953 0.6153825 -0.6333995 0.9933953 0.6153825 -0.6561933 0.9933953 0.6153825 -0.6850303 0.9933953 0.6153825 -0.721513 0.9933953 0.6153825 -0.7676683 0.9933953 0.6153825 -0.8260608 0.9933953 0.6153825 -0.8999349 0.9933953 0.6153825 -0.9933953 0.9933953 0.6153825 -0.9948487 0.9145732 0.6579314 -0.9959706 0.8740262 0.7019138 -0.9968409 0.8588218 0.7446768 -0.9975189 0.8594117 0.7844566 -0.9980488 0.8690364 0.8202389 -0.9984638 0.8831255 0.8515915 -0.9987895 0.8987476 0.8784967 -0.9990455 0.9141422 0.9012049 -0.999247 0.928347 0.9201176 -0.9994057 0.9409186 0.9357024 -0.9995308 0.9517328 0.9484359 -0.9996295 0.9608482 0.9587693 -0.9997074 0.9684181 0.9671097 -0.9997688 0.9746346 0.9738123 -0.9998174 0.9796966 0.9791804 -0.9998557 0.9837916 0.9834679 -0.999886 0.9870878 0.986885 -0.9999099 0.9897306 0.9896036 -0.9999288 0.9918431 0.9917636 -0.9999437 0.9935277 0.9934779 -0.6139459 0.9948662 0.6597695 -0.6139352 0.994866 0.6597453 -0.6139219 0.9948657 0.6597149 -0.6139056 0.9948653 0.6596768 -0.6138855 0.9948649 0.6596292 -0.6138613 0.9948643 0.6595699 -0.6138323 0.9948636 0.6594963 -0.6137984 0.9948628 0.6594057 -0.6137599 0.9948617 0.6592948 -0.6137183 0.9948604 0.6591607 -0.6136769 0.9948589 0.659001 -0.6136427 0.9948571 0.6588147 -0.6136284 0.9948551 0.6586044 -0.6136569 0.994853 0.6583791 -0.6137675 0.9948509 0.6581595 -0.6140266 0.9948493 0.6579867 -0.6145393 0.9948487 0.6579314 -0.6152669 0.9948487 0.6579314 -0.6161874 0.9948487 0.6579314 -0.6173519 0.9948487 0.6579314 -0.6188252 0.9948487 0.6579314 -0.6206891 0.9948487 0.6579314 -0.6230471 0.9948487 0.6579314 -0.6260304 0.9948487 0.6579314 -0.6298046 0.9948487 0.6579314 -0.6345795 0.9948487 0.6579314 -0.6406203 0.9948487 0.6579314 -0.6482627 0.9948487 0.6579314 -0.6579314 0.9948487 0.6579314 -0.6701635 0.9948487 0.6579314 -0.6856388 0.9948487 0.6579314 -0.7052169 0.9948487 0.6579314 -0.7299859 0.9948487 0.6579314 -0.7613218 0.9948487 0.6579314 -0.8009659 0.9948487 0.6579314 -0.8511207 0.9948487 0.6579314 -0.9145732 0.9948487 0.6579314 -0.9948487 0.9948487 0.6579314 -0.9959706 0.9278617 0.7019138 -0.9968409 0.8945255 0.7446768 -0.9975189 0.8828571 0.7844566 -0.9980488 0.8842998 0.8202389 -0.9984638 0.892989 0.8515915 -0.9987895 0.9050819 0.8784967 -0.9990455 0.9181889 0.9012049 -0.999247 0.9309211 0.9201176 -0.9994057 0.9425502 0.9357024 -0.9995308 0.952764 0.9484359 -0.9996295 0.9614985 0.9587693 -0.9997074 0.9688274 0.9671097 -0.9997688 0.9748918 0.9738123 -0.9998174 0.979858 0.9791804 -0.9998557 0.9838928 0.9834679 -0.999886 0.9871512 0.986885 -0.9999099 0.9897703 0.9896036 -0.9999288 0.991868 0.9917636 -0.9999437 0.9935432 0.9934779 -0.6724572 0.9959813 0.703219 -0.6724495 0.9959811 0.7032018 -0.6724399 0.9959809 0.7031802 -0.672428 0.9959807 0.7031531 -0.6724135 0.9959804 0.7031193 -0.6723959 0.9959801 0.7030771 -0.6723748 0.9959797 0.7030249 -0.67235 0.9959791 0.7029605 -0.6723217 0.9959785 0.7028817 -0.6722907 0.9959777 0.7027865 -0.6722594 0.9959768 0.702673 -0.6722322 0.9959757 0.7025407 -0.672218 0.9959745 0.7023914 -0.672232 0.9959732 0.7022315 -0.6723012 0.9959719 0.7020756 -0.6724711 0.9959709 0.701953 -0.6728136 0.9959706 0.7019138 -0.6733015 0.9959706 0.7019138 -0.6739188 0.9959706 0.7019138 -0.6746998 0.9959706 0.7019138 -0.6756878 0.9959706 0.7019138 -0.6769378 0.9959706 0.7019138 -0.6785192 0.9959706 0.7019138 -0.6805199 0.9959706 0.7019138 -0.683051 0.9959706 0.7019138 -0.6862532 0.9959706 0.7019138 -0.6903044 0.9959706 0.7019138 -0.6954296 0.9959706 0.7019138 -0.7019138 0.9959706 0.7019138 -0.710117 0.9959706 0.7019138 -0.7204952 0.9959706 0.7019138 -0.733625 0.9959706 0.7019138 -0.7502359 0.9959706 0.7019138 -0.7712508 0.9959706 0.7019138 -0.7978374 0.9959706 0.7019138 -0.8314729 0.9959706 0.7019138 -0.8740262 0.9959706 0.7019138 -0.9278617 0.9959706 0.7019138 -0.9959706 0.9959706 0.7019138 -0.9968409 0.9396953 0.7446768 -0.9975189 0.9125186 0.7844566 -0.9980488 0.9036101 0.8202389 -0.9984638 0.9054678 0.8515915 -0.9987895 0.9130957 0.8784967 -0.9990455 0.9233085 0.9012049 -0.999247 0.9341777 0.9201176 -0.9994057 0.9446144 0.9357024 -0.9995308 0.9540687 0.9484359 -0.9996295 0.9623212 0.9587693 -0.9997074 0.9693452 0.9671097 -0.9997688 0.9752172 0.9738123 -0.9998174 0.9800622 0.9791804 -0.9998557 0.9840209 0.9834679 -0.999886 0.9872315 0.986885 -0.9999099 0.9898206 0.9896036 -0.9999288 0.9918994 0.9917636 -0.9999437 0.9935629 0.9934779 -0.7251659 0.9968475 0.7455842 -0.7251605 0.9968474 0.7455722 -0.7251537 0.9968473 0.7455572 -0.7251454 0.9968472 0.7455383 -0.7251351 0.996847 0.7455148 -0.7251226 0.9968468 0.7454855 -0.7251076 0.9968465 0.7454491 -0.7250899 0.9968462 0.7454044 -0.7250697 0.9968458 0.7453496 -0.7250473 0.9968453 0.7452834 -0.7250244 0.9968448 0.7452045 -0.7250039 0.9968441 0.7451125 -0.7249916 0.9968433 0.7450087 -0.7249978 0.9968425 0.7448975 -0.7250408 0.9968418 0.7447892 -0.7251511 0.9968411 0.744704 -0.7253775 0.9968409 0.7446768 -0.7257011 0.9968409 0.7446768 -0.7261105 0.9968409 0.7446768 -0.7266285 0.9968409 0.7446768 -0.7272837 0.9968409 0.7446768 -0.7281127 0.9968409 0.7446768 -0.7291615 0.9968409 0.7446768 -0.7304884 0.9968409 0.7446768 -0.732167 0.9968409 0.7446768 -0.7342907 0.9968409 0.7446768 -0.7369774 0.9968409 0.7446768 -0.7403765 0.9968409 0.7446768 -0.7446768 0.9968409 0.7446768 -0.7501172 0.9968409 0.7446768 -0.757 0.9968409 0.7446768 -0.7657077 0.9968409 0.7446768 -0.776724 0.9968409 0.7446768 -0.7906611 0.9968409 0.7446768 -0.8082934 0.9968409 0.7446768 -0.8306004 0.9968409 0.7446768 -0.8588218 0.9968409 0.7446768 -0.8945255 0.9968409 0.7446768 -0.9396953 0.9968409 0.7446768 -0.9968409 0.9968409 0.7446768 -0.9975189 0.9500442 0.7844566 -0.9980488 0.9280401 0.8202389 -0.9984638 0.921255 0.8515915 -0.9987895 0.9232341 0.8784967 -0.9990455 0.9297854 0.9012049 -0.999247 0.9382977 0.9201176 -0.9994057 0.9472259 0.9357024 -0.9995308 0.9557192 0.9484359 -0.9996295 0.963362 0.9587693 -0.9997074 0.9700002 0.9671097 -0.9997688 0.9756289 0.9738123 -0.9998174 0.9803206 0.9791804 -0.9998557 0.9841829 0.9834679 -0.999886 0.987333 0.986885 -0.9999099 0.9898842 0.9896036 -0.9999288 0.9919392 0.9917636 -0.9999437 0.9935878 0.9934779 -0.7716588 0.997523 0.785076 -0.7716551 0.997523 0.7850678 -0.7716504 0.9975229 0.7850576 -0.7716446 0.9975228 0.7850447 -0.7716375 0.9975227 0.7850286 -0.7716288 0.9975226 0.7850086 -0.7716184 0.9975224 0.7849838 -0.7716061 0.9975222 0.7849532 -0.7715919 0.997522 0.7849158 -0.7715762 0.9975217 0.7848706 -0.7715599 0.9975213 0.7848167 -0.7715449 0.9975209 0.7847539 -0.7715352 0.9975204 0.7846831 -0.7715376 0.9975199 0.7846072 -0.7715641 0.9975194 0.7845333 -0.7716352 0.9975191 0.7844752 -0.7717834 0.9975189 0.7844566 -0.7719959 0.9975189 0.7844566 -0.7722648 0.9975189 0.7844566 -0.7726049 0.9975189 0.7844566 -0.7730352 0.9975189 0.7844566 -0.7735795 0.9975189 0.7844566 -0.7742682 0.9975189 0.7844566 -0.7751395 0.9975189 0.7844566 -0.7762418 0.9975189 0.7844566 -0.7776364 0.9975189 0.7844566 -0.7794007 0.9975189 0.7844566 -0.7816327 0.9975189 0.7844566 -0.7844566 0.9975189 0.7844566 -0.7880291 0.9975189 0.7844566 -0.7925488 0.9975189 0.7844566 -0.7982669 0.9975189 0.7844566 -0.8055009 0.9975189 0.7844566 -0.8146529 0.9975189 0.7844566 -0.8262314 0.9975189 0.7844566 -0.8408797 0.9975189 0.7844566 -0.8594117 0.9975189 0.7844566 -0.8828571 0.9975189 0.7844566 -0.9125186 0.9975189 0.7844566 -0.9500442 0.9975189 0.7844566 -0.9975189 0.9975189 0.7844566 -0.9980488 0.9589472 0.8202389 -0.9984638 0.9412278 0.8515915 -0.9987895 0.9360606 0.8784967 -0.9990455 0.9379796 0.9012049 -0.999247 0.94351 0.9201176 -0.9994057 0.9505298 0.9357024 -0.9995308 0.9578074 0.9484359 -0.9996295 0.9646787 0.9587693 -0.9997074 0.970829 0.9671097 -0.9997688 0.9761497 0.9738123 -0.9998174 0.9806476 0.9791804 -0.9998557 0.984388 0.9834679 -0.999886 0.9874615 0.986885 -0.9999099 0.9899646 0.9896036 -0.9999288 0.9919896 0.9917636 -0.9999437 0.9936193 0.9934779 -0.8119154 0.9980513 0.8206552 -0.8119128 0.9980512 0.8206497 -0.8119096 0.9980512 0.8206428 -0.8119057 0.9980511 0.8206341 -0.8119009 0.9980511 0.8206233 -0.8118949 0.998051 0.8206099 -0.8118878 0.9980509 0.8205932 -0.8118794 0.9980508 0.8205726 -0.8118697 0.9980506 0.8205475 -0.8118589 0.9980504 0.8205171 -0.8118476 0.9980502 0.8204809 -0.811837 0.99805 0.8204387 -0.8118298 0.9980497 0.8203911 -0.8118303 0.9980494 0.8203401 -0.8118466 0.9980491 0.8202905 -0.8118921 0.9980488 0.8202514 -0.8119884 0.9980488 0.8202389 -0.8121268 0.9980488 0.8202389 -0.8123018 0.9980488 0.8202389 -0.8125232 0.9980488 0.8202389 -0.8128033 0.9980488 0.8202389 -0.8131577 0.9980488 0.8202389 -0.8136061 0.9980488 0.8202389 -0.8141733 0.9980488 0.8202389 -0.8148909 0.9980488 0.8202389 -0.8157988 0.9980488 0.8202389 -0.8169474 0.9980488 0.8202389 -0.8184005 0.9980488 0.8202389 -0.8202389 0.9980488 0.8202389 -0.8225647 0.9980488 0.8202389 -0.8255071 0.9980488 0.8202389 -0.8292297 0.9980488 0.8202389 -0.8339392 0.9980488 0.8202389 -0.8398974 0.9980488 0.8202389 -0.8474353 0.9980488 0.8202389 -0.8569716 0.9980488 0.8202389 -0.8690364 0.9980488 0.8202389 -0.8842998 0.9980488 0.8202389 -0.9036101 0.9980488 0.8202389 -0.9280401 0.9980488 0.8202389 -0.9589472 0.9980488 0.8202389 -0.9980488 0.9980488 0.8202389 -0.9984638 0.9664961 0.8515915 -0.9987895 0.9522877 0.8784967 -0.9990455 0.9483463 0.9012049 -0.999247 0.9501042 0.9201176 -0.9994057 0.9547096 0.9357024 -0.9995308 0.9604492 0.9484359 -0.9996295 0.9663445 0.9587693 -0.9997074 0.9718774 0.9671097 -0.9997688 0.9768086 0.9738123 -0.9998174 0.9810611 0.9791804 -0.9998557 0.9846473 0.9834679 -0.999886 0.987624 0.986885 -0.9999099 0.9900664 0.9896036 -0.9999288 0.9920533 0.9917636 -0.9999437 0.9936592 0.9934779 -0.8462171 0.9984653 0.8518675 -0.8462154 0.9984653 0.8518639 -0.8462132 0.9984653 0.8518593 -0.8462106 0.9984653 0.8518535 -0.8462073 0.9984652 0.8518464 -0.8462034 0.9984652 0.8518374 -0.8461986 0.9984651 0.8518264 -0.8461929 0.998465 0.8518127 -0.8461864 0.9984649 0.8517961 -0.8461791 0.9984648 0.8517759 -0.8461714 0.9984647 0.8517519 -0.8461641 0.9984645 0.8517239 -0.8461589 0.9984643 0.8516924 -0.8461587 0.9984642 0.8516586 -0.8461687 0.998464 0.8516256 -0.8461977 0.9984638 0.8515998 -0.8462598 0.9984638 0.8515915 -0.8463492 0.9984638 0.8515915 -0.8464623 0.9984638 0.8515915 -0.8466054 0.9984638 0.8515915 -0.8467864 0.9984638 0.8515915 -0.8470154 0.9984638 0.8515915 -0.8473052 0.9984638 0.8515915 -0.8476717 0.9984638 0.8515915 -0.8481355 0.9984638 0.8515915 -0.8487222 0.9984638 0.8515915 -0.8494644 0.9984638 0.8515915 -0.8504035 0.9984638 0.8515915 -0.8515915 0.9984638 0.8515915 -0.8530945 0.9984638 0.8515915 -0.8549959 0.9984638 0.8515915 -0.8574015 0.9984638 0.8515915 -0.8604449 0.9984638 0.8515915 -0.8642952 0.9984638 0.8515915 -0.8691663 0.9984638 0.8515915 -0.875329 0.9984638 0.8515915 -0.8831255 0.9984638 0.8515915 -0.892989 0.9984638 0.8515915 -0.9054678 0.9984638 0.8515915 -0.921255 0.9984638 0.8515915 -0.9412278 0.9984638 0.8515915 -0.9664961 0.9984638 0.8515915 -0.9984638 0.9984638 0.8515915 -0.9987895 0.9728171 0.8784967 -0.9990455 0.9614615 0.9012049 -0.999247 0.9584468 0.9201176 -0.9994057 0.9599976 0.9357024 -0.9995308 0.9637914 0.9484359 -0.9996295 0.968452 0.9587693 -0.9997074 0.9732039 0.9671097 -0.9997688 0.9776422 0.9738123 -0.9998174 0.9815844 0.9791804 -0.9998557 0.9849754 0.9834679 -0.999886 0.9878296 0.986885 -0.9999099 0.9901951 0.9896036 -0.9999288 0.9921339 0.9917636 -0.9999437 0.9937096 0.9934779 -0.8750477 0.9987905 0.8786777 -0.8750466 0.9987905 0.8786753 -0.8750451 0.9987904 0.8786723 -0.8750434 0.9987904 0.8786686 -0.8750412 0.9987904 0.8786638 -0.8750386 0.9987904 0.878658 -0.8750355 0.9987903 0.8786507 -0.8750317 0.9987903 0.8786418 -0.8750274 0.9987902 0.8786309 -0.8750225 0.9987902 0.8786176 -0.8750173 0.9987901 0.8786019 -0.8750124 0.99879 0.8785835 -0.8750088 0.9987899 0.8785628 -0.8750084 0.9987897 0.8785407 -0.8750145 0.9987896 0.8785191 -0.8750329 0.9987895 0.8785021 -0.8750727 0.9987895 0.8784967 -0.8751301 0.9987895 0.8784967 -0.8752028 0.9987895 0.8784967 -0.8752947 0.9987895 0.8784967 -0.8754109 0.9987895 0.8784967 -0.875558 0.9987895 0.8784967 -0.8757441 0.9987895 0.8784967 -0.8759795 0.9987895 0.8784967 -0.8762773 0.9987895 0.8784967 -0.8766541 0.9987895 0.8784967 -0.8771307 0.9987895 0.8784967 -0.8777338 0.9987895 0.8784967 -0.8784967 0.9987895 0.8784967 -0.8794619 0.9987895 0.8784967 -0.880683 0.9987895 0.8784967 -0.8822279 0.9987895 0.8784967 -0.8841823 0.9987895 0.8784967 -0.886655 0.9987895 0.8784967 -0.8897832 0.9987895 0.8784967 -0.8937407 0.9987895 0.8784967 -0.8987476 0.9987895 0.8784967 -0.9050819 0.9987895 0.8784967 -0.9130957 0.9987895 0.8784967 -0.9232341 0.9987895 0.8784967 -0.9360606 0.9987895 0.8784967 -0.9522877 0.9987895 0.8784967 -0.9728171 0.9987895 0.8784967 -0.9987895 0.9987895 0.8784967 -0.9990455 0.9780539 0.9012049 -0.999247 0.9690013 0.9201176 -0.9994057 0.9666876 0.9357024 -0.9995308 0.9680197 0.9484359 -0.9996295 0.9711183 0.9587693 -0.9997074 0.974882 0.9671097 -0.9997688 0.9786968 0.9738123 -0.9998174 0.9822464 0.9791804 -0.9998557 0.9853905 0.9834679 -0.999886 0.9880897 0.986885 -0.9999099 0.990358 0.9896036 -0.9999288 0.9922358 0.9917636 -0.9999437 0.9937734 0.9934779 -0.8990028 0.9990461 0.9013225 -0.899002 0.9990461 0.901321 -0.8990011 0.9990461 0.901319 -0.899 0.9990461 0.9013166 -0.8989986 0.9990461 0.9013135 -0.8989969 0.9990461 0.9013097 -0.8989948 0.9990461 0.901305 -0.8989923 0.999046 0.9012992 -0.8989895 0.999046 0.9012921 -0.8989863 0.9990459 0.9012835 -0.8989829 0.9990459 0.9012733 -0.8989796 0.9990458 0.9012613 -0.8989771 0.9990458 0.9012479 -0.8989767 0.9990457 0.9012335 -0.8989805 0.9990456 0.9012195 -0.8989921 0.9990456 0.9012084 -0.8990175 0.9990455 0.9012049 -0.8990542 0.9990455 0.9012049 -0.8991006 0.9990455 0.9012049 -0.8991593 0.9990455 0.9012049 -0.8992336 0.9990455 0.9012049 -0.8993275 0.9990455 0.9012049 -0.8994464 0.9990455 0.9012049 -0.8995968 0.9990455 0.9012049 -0.899787 0.9990455 0.9012049 -0.9000277 0.9990455 0.9012049 -0.9003323 0.9990455 0.9012049 -0.9007175 0.9990455 0.9012049 -0.9012049 0.9990455 0.9012049 -0.9018215 0.9990455 0.9012049 -0.9026016 0.9990455 0.9012049 -0.9035886 0.9990455 0.9012049 -0.9048372 0.9990455 0.9012049 -0.9064168 0.9990455 0.9012049 -0.9084153 0.9990455 0.9012049 -0.9109436 0.9990455 0.9012049 -0.9141422 0.9990455 0.9012049 -0.9181889 0.9990455 0.9012049 -0.9233085 0.9990455 0.9012049 -0.9297854 0.9990455 0.9012049 -0.9379796 0.9990455 0.9012049 -0.9483463 0.9990455 0.9012049 -0.9614615 0.9990455 0.9012049 -0.9780539 0.9990455 0.9012049 -0.9990455 0.9990455 0.9012049 -0.999247 0.982354 0.9201176 -0.9994057 0.9751513 0.9357024 -0.9995308 0.9733691 0.9484359 -0.9996295 0.9744915 0.9587693 -0.9997074 0.977005 0.9671097 -0.9997688 0.980031 0.9738123 -0.9998174 0.9830838 0.9791804 -0.9998557 0.9859157 0.9834679 -0.999886 0.9884188 0.986885 -0.9999099 0.9905641 0.9896036 -0.9999288 0.9923648 0.9917636 -0.9999437 0.9938541 0.9934779 -0.9187175 0.9992474 0.9201934 -0.918717 0.9992474 0.9201924 -0.9187164 0.9992474 0.9201912 -0.9187157 0.9992474 0.9201896 -0.9187148 0.9992474 0.9201876 -0.9187137 0.9992474 0.9201852 -0.9187123 0.9992473 0.9201821 -0.9187107 0.9992473 0.9201784 -0.9187089 0.9992473 0.9201738 -0.9187068 0.9992473 0.9201683 -0.9187045 0.9992472 0.9201617 -0.9187024 0.9992472 0.920154 -0.9187008 0.9992472 0.9201453 -0.9187004 0.9992471 0.920136 -0.9187027 0.9992471 0.920127 -0.9187101 0.999247 0.9201199 -0.9187262 0.999247 0.9201176 -0.9187495 0.999247 0.9201176 -0.9187791 0.999247 0.9201176 -0.9188164 0.999247 0.9201176 -0.9188636 0.999247 0.9201176 -0.9189234 0.999247 0.9201176 -0.918999 0.999247 0.9201176 -0.9190947 0.999247 0.9201176 -0.9192157 0.999247 0.9201176 -0.9193688 0.999247 0.9201176 -0.9195625 0.999247 0.9201176 -0.9198076 0.999247 0.9201176 -0.9201176 0.999247 0.9201176 -0.9205098 0.999247 0.9201176 -0.9210061 0.999247 0.9201176 -0.9216339 0.999247 0.9201176 -0.9224281 0.999247 0.9201176 -0.9234329 0.999247 0.9201176 -0.9247041 0.999247 0.9201176 -0.9263124 0.999247 0.9201176 -0.928347 0.999247 0.9201176 -0.9309211 0.999247 0.9201176 -0.9341777 0.999247 0.9201176 -0.9382977 0.999247 0.9201176 -0.94351 0.999247 0.9201176 -0.9501042 0.999247 0.9201176 -0.9584468 0.999247 0.9201176 -0.9690013 0.999247 0.9201176 -0.982354 0.999247 0.9201176 -0.999247 0.999247 0.9201176 -0.9994057 0.9858591 0.9357024 -0.9995308 0.9801368 0.9484359 -0.9996295 0.978759 0.9587693 -0.9997074 0.9796909 0.9671097 -0.9997688 0.981719 0.9738123 -0.9998174 0.9841433 0.9791804 -0.9998557 0.9865801 0.9834679 -0.999886 0.9888351 0.986885 -0.9999099 0.9908248 0.9896036 -0.9999288 0.992528 0.9917636 -0.9999437 0.9939562 0.9934779 -0.9348153 0.999406 0.935751 -0.9348149 0.999406 0.9357503 -0.9348146 0.999406 0.9357495 -0.9348141 0.999406 0.9357485 -0.9348135 0.999406 0.9357472 -0.9348128 0.9994059 0.9357457 -0.9348119 0.9994059 0.9357437 -0.9348109 0.9994059 0.9357413 -0.9348097 0.9994059 0.9357384 -0.9348083 0.9994059 0.9357348 -0.9348069 0.9994059 0.9357306 -0.9348055 0.9994059 0.9357257 -0.9348044 0.9994058 0.9357201 -0.9348042 0.9994058 0.9357142 -0.9348056 0.9994058 0.9357084 -0.9348102 0.9994057 0.9357038 -0.9348204 0.9994057 0.9357024 -0.9348352 0.9994057 0.9357024 -0.9348539 0.9994057 0.9357024 -0.9348776 0.9994057 0.9357024 -0.9349075 0.9994057 0.9357024 -0.9349454 0.9994057 0.9357024 -0.9349933 0.9994057 0.9357024 -0.935054 0.9994057 0.9357024 -0.9351307 0.9994057 0.9357024 -0.9352277 0.9994057 0.9357024 -0.9353505 0.9994057 0.9357024 -0.9355059 0.9994057 0.9357024 -0.9357024 0.9994057 0.9357024 -0.935951 0.9994057 0.9357024 -0.9362655 0.9994057 0.9357024 -0.9366635 0.9994057 0.9357024 -0.9371669 0.9994057 0.9357024 -0.9378038 0.9994057 0.9357024 -0.9386096 0.9994057 0.9357024 -0.939629 0.9994057 0.9357024 -0.9409186 0.9994057 0.9357024 -0.9425502 0.9994057 0.9357024 -0.9446144 0.9994057 0.9357024 -0.9472259 0.9994057 0.9357024 -0.9505298 0.9994057 0.9357024 -0.9547096 0.9994057 0.9357024 -0.9599976 0.9994057 0.9357024 -0.9666876 0.9994057 0.9357024 -0.9751513 0.9994057 0.9357024 -0.9858591 0.9994057 0.9357024 -0.9994057 0.9994057 0.9357024 -0.9995308 0.9886988 0.9484359 -0.9996295 0.9841579 0.9587693 -0.9997074 0.983089 0.9671097 -0.9997688 0.9838545 0.9738123 -0.9998174 0.9854838 0.9791804 -0.9998557 0.9874207 0.9834679 -0.999886 0.9893618 0.986885 -0.9999099 0.9911547 0.9896036 -0.9999288 0.9927345 0.9917636 -0.9999437 0.9940854 0.9934779 -0.9478754 0.999531 0.9484669 -0.9478752 0.999531 0.9484665 -0.947875 0.999531 0.948466 -0.9478746 0.999531 0.9484653 -0.9478743 0.999531 0.9484645 -0.9478738 0.999531 0.9484635 -0.9478733 0.999531 0.9484623 -0.9478726 0.999531 0.9484607 -0.9478718 0.999531 0.9484589 -0.947871 0.9995309 0.9484566 -0.94787 0.9995309 0.9484539 -0.9478691 0.9995309 0.9484508 -0.9478684 0.9995309 0.9484472 -0.9478683 0.9995309 0.9484434 -0.9478691 0.9995309 0.9484397 -0.947872 0.9995309 0.9484368 -0.9478785 0.9995308 0.9484359 -0.9478878 0.9995308 0.9484359 -0.9478997 0.9995308 0.9484359 -0.9479146 0.9995308 0.9484359 -0.9479335 0.9995308 0.9484359 -0.9479575 0.9995308 0.9484359 -0.9479878 0.9995308 0.9484359 -0.9480261 0.9995308 0.9484359 -0.9480746 0.9995308 0.9484359 -0.9481359 0.9995308 0.9484359 -0.9482135 0.9995308 0.9484359 -0.9483117 0.9995308 0.9484359 -0.9484359 0.9995308 0.9484359 -0.9485931 0.9995308 0.9484359 -0.9487918 0.9995308 0.9484359 -0.9490434 0.9995308 0.9484359 -0.9493615 0.9995308 0.9484359 -0.9497641 0.9995308 0.9484359 -0.9502734 0.9995308 0.9484359 -0.9509177 0.9995308 0.9484359 -0.9517328 0.9995308 0.9484359 -0.952764 0.9995308 0.9484359 -0.9540687 0.9995308 0.9484359 -0.9557192 0.9995308 0.9484359 -0.9578074 0.9995308 0.9484359 -0.9604492 0.9995308 0.9484359 -0.9637914 0.9995308 0.9484359 -0.9680197 0.9995308 0.9484359 -0.9733691 0.9995308 0.9484359 -0.9801368 0.9995308 0.9484359 -0.9886988 0.9995308 0.9484359 -0.9995308 0.9995308 0.9484359 -0.9996295 0.9909882 0.9587693 -0.9997074 0.9873879 0.9671097 -0.9997688 0.9865561 0.9738123 -0.9998174 0.9871796 0.9791804 -0.9998557 0.9884841 0.9834679 -0.999886 0.9900282 0.986885 -0.9999099 0.991572 0.9896036 -0.9999288 0.9929957 0.9917636 -0.9999437 0.9942488 0.9934779 -0.958416 0.9996296 0.958789 -0.9584159 0.9996296 0.9587888 -0.9584157 0.9996296 0.9587884 -0.9584155 0.9996296 0.958788 -0.9584153 0.9996296 0.9587875 -0.958415 0.9996296 0.9587869 -0.9584146 0.9996296 0.9587861 -0.9584142 0.9996296 0.9587851 -0.9584137 0.9996296 0.9587839 -0.9584132 0.9996296 0.9587825 -0.9584126 0.9996296 0.9587808 -0.958412 0.9996296 0.9587788 -0.9584115 0.9996296 0.9587765 -0.9584114 0.9996295 0.9587741 -0.958412 0.9996295 0.9587718 -0.9584138 0.9996295 0.9587699 -0.9584178 0.9996295 0.9587693 -0.9584237 0.9996295 0.9587693 -0.9584312 0.9996295 0.9587693 -0.9584406 0.9996295 0.9587693 -0.9584526 0.9996295 0.9587693 -0.9584677 0.9996295 0.9587693 -0.9584868 0.9996295 0.9587693 -0.9585109 0.9996295 0.9587693 -0.9585415 0.9996295 0.9587693 -0.9585802 0.9996295 0.9587693 -0.9586291 0.9996295 0.9587693 -0.958691 0.9996295 0.9587693 -0.9587693 0.9996295 0.9587693 -0.9588684 0.9996295 0.9587693 -0.9589938 0.9996295 0.9587693 -0.9591524 0.9996295 0.9587693 -0.959353 0.9996295 0.9587693 -0.9596068 0.9996295 0.9587693 -0.959928 0.9996295 0.9587693 -0.9603343 0.9996295 0.9587693 -0.9608482 0.9996295 0.9587693 -0.9614985 0.9996295 0.9587693 -0.9623212 0.9996295 0.9587693 -0.963362 0.9996295 0.9587693 -0.9646787 0.9996295 0.9587693 -0.9663445 0.9996295 0.9587693 -0.968452 0.9996295 0.9587693 -0.9711183 0.9996295 0.9587693 -0.9744915 0.9996295 0.9587693 -0.978759 0.9996295 0.9587693 -0.9841579 0.9996295 0.9587693 -0.9909882 0.9996295 0.9587693 -0.9996295 0.9996295 0.9587693 -0.9997074 0.9928267 0.9671097 -0.9997688 0.9899741 0.9738123 -0.9998174 0.989325 0.9791804 -0.9998557 0.9898295 0.9834679 -0.999886 0.9908712 0.986885 -0.9999099 0.9920999 0.9896036 -0.9999288 0.9933261 0.9917636 -0.9999437 0.9944556 0.9934779 -0.9668873 0.9997074 0.9671221 -0.9668872 0.9997074 0.967122 -0.9668871 0.9997074 0.9671218 -0.966887 0.9997074 0.9671215 -0.9668869 0.9997074 0.9671212 -0.9668867 0.9997074 0.9671208 -0.9668865 0.9997074 0.9671203 -0.9668862 0.9997074 0.9671197 -0.9668859 0.9997074 0.9671189 -0.9668855 0.9997074 0.967118 -0.9668852 0.9997074 0.9671169 -0.9668848 0.9997074 0.9671156 -0.9668845 0.9997074 0.9671142 -0.9668844 0.9997074 0.9671127 -0.9668847 0.9997074 0.9671112 -0.9668859 0.9997074 0.96711 -0.9668884 0.9997074 0.9671097 -0.9668922 0.9997074 0.9671097 -0.9668969 0.9997074 0.9671097 -0.9669028 0.9997074 0.9671097 -0.9669103 0.9997074 0.9671097 -0.9669198 0.9997074 0.9671097 -0.9669318 0.9997074 0.9671097 -0.966947 0.9997074 0.9671097 -0.9669663 0.9997074 0.9671097 -0.9669906 0.9997074 0.9671097 -0.9670214 0.9997074 0.9671097 -0.9670604 0.9997074 0.9671097 -0.9671097 0.9997074 0.9671097 -0.967172 0.9997074 0.9671097 -0.9672509 0.9997074 0.9671097 -0.9673508 0.9997074 0.9671097 -0.967477 0.9997074 0.9671097 -0.9676368 0.9997074 0.9671097 -0.9678389 0.9997074 0.9671097 -0.9680946 0.9997074 0.9671097 -0.9684181 0.9997074 0.9671097 -0.9688274 0.9997074 0.9671097 -0.9693452 0.9997074 0.9671097 -0.9700002 0.9997074 0.9671097 -0.970829 0.9997074 0.9671097 -0.9718774 0.9997074 0.9671097 -0.9732039 0.9997074 0.9671097 -0.974882 0.9997074 0.9671097 -0.977005 0.9997074 0.9671097 -0.9796909 0.9997074 0.9671097 -0.983089 0.9997074 0.9671097 -0.9873879 0.9997074 0.9671097 -0.9928267 0.9997074 0.9671097 -0.9997074 0.9997074 0.9671097 -0.9997688 0.9942982 0.9738123 -0.9998174 0.9920392 0.9791804 -0.9998557 0.9915316 0.9834679 -0.999886 0.9919377 0.986885 -0.9999099 0.9927678 0.9896036 -0.9999288 0.9937442 0.9917636 -0.9999437 0.9947172 0.9934779 -0.9736726 0.9997689 0.9738202 -0.9736726 0.9997689 0.9738201 -0.9736725 0.9997689 0.97382 -0.9736724 0.9997689 0.9738198 -0.9736723 0.9997689 0.9738196 -0.9736722 0.9997689 0.9738193 -0.9736721 0.9997689 0.973819 -0.9736719 0.9997689 0.9738186 -0.9736717 0.9997689 0.9738182 -0.9736715 0.9997689 0.9738176 -0.9736712 0.9997689 0.9738169 -0.973671 0.9997689 0.9738161 -0.9736708 0.9997689 0.9738152 -0.9736708 0.9997689 0.9738142 -0.973671 0.9997688 0.9738133 -0.9736717 0.9997688 0.9738126 -0.9736733 0.9997688 0.9738123 -0.9736756 0.9997688 0.9738123 -0.9736786 0.9997688 0.9738123 -0.9736823 0.9997688 0.9738123 -0.973687 0.9997688 0.9738123 -0.973693 0.9997688 0.9738123 -0.9737006 0.9997688 0.9738123 -0.9737101 0.9997688 0.9738123 -0.9737222 0.9997688 0.9738123 -0.9737375 0.9997688 0.9738123 -0.9737569 0.9997688 0.9738123 -0.9737814 0.9997688 0.9738123 -0.9738123 0.9997688 0.9738123 -0.9738515 0.9997688 0.9738123 -0.9739011 0.9997688 0.9738123 -0.9739638 0.9997688 0.9738123 -0.9740432 0.9997688 0.9738123 -0.9741436 0.9997688 0.9738123 -0.9742706 0.9997688 0.9738123 -0.9744313 0.9997688 0.9738123 -0.9746346 0.9997688 0.9738123 -0.9748918 0.9997688 0.9738123 -0.9752172 0.9997688 0.9738123 -0.9756289 0.9997688 0.9738123 -0.9761497 0.9997688 0.9738123 -0.9768086 0.9997688 0.9738123 -0.9776422 0.9997688 0.9738123 -0.9786968 0.9997688 0.9738123 -0.980031 0.9997688 0.9738123 -0.981719 0.9997688 0.9738123 -0.9838545 0.9997688 0.9738123 -0.9865561 0.9997688 0.9738123 -0.9899741 0.9997688 0.9738123 -0.9942982 0.9997688 0.9738123 -0.9997688 0.9997688 0.9738123 -0.9998174 0.9954731 0.9791804 -0.9998557 0.9936849 0.9834679 -0.999886 0.993287 0.986885 -0.9999099 0.9936128 0.9896036 -0.9999288 0.9942731 0.9917636 -0.9999437 0.9950481 0.9934779 -0.9790927 0.9998174 0.9791854 -0.9790927 0.9998174 0.9791853 -0.9790927 0.9998174 0.9791852 -0.9790926 0.9998174 0.9791851 -0.9790925 0.9998174 0.979185 -0.9790925 0.9998174 0.9791848 -0.9790924 0.9998174 0.9791846 -0.9790923 0.9998174 0.9791844 -0.9790921 0.9998174 0.9791841 -0.979092 0.9998174 0.9791837 -0.9790919 0.9998174 0.9791833 -0.9790917 0.9998174 0.9791828 -0.9790916 0.9998174 0.9791822 -0.9790916 0.9998174 0.9791816 -0.9790917 0.9998174 0.979181 -0.9790921 0.9998174 0.9791806 -0.9790931 0.9998174 0.9791804 -0.9790946 0.9998174 0.9791804 -0.9790965 0.9998174 0.9791804 -0.9790988 0.9998174 0.9791804 -0.9791018 0.9998174 0.9791804 -0.9791055 0.9998174 0.9791804 -0.9791103 0.9998174 0.9791804 -0.9791163 0.9998174 0.9791804 -0.9791238 0.9998174 0.9791804 -0.9791334 0.9998174 0.9791804 -0.9791456 0.9998174 0.9791804 -0.979161 0.9998174 0.9791804 -0.9791804 0.9998174 0.9791804 -0.979205 0.9998174 0.9791804 -0.9792361 0.9998174 0.9791804 -0.9792755 0.9998174 0.9791804 -0.9793253 0.9998174 0.9791804 -0.9793883 0.9998174 0.9791804 -0.9794681 0.9998174 0.9791804 -0.9795689 0.9998174 0.9791804 -0.9796966 0.9998174 0.9791804 -0.979858 0.9998174 0.9791804 -0.9800622 0.9998174 0.9791804 -0.9803206 0.9998174 0.9791804 -0.9806476 0.9998174 0.9791804 -0.9810611 0.9998174 0.9791804 -0.9815844 0.9998174 0.9791804 -0.9822464 0.9998174 0.9791804 -0.9830838 0.9998174 0.9791804 -0.9841433 0.9998174 0.9791804 -0.9854838 0.9998174 0.9791804 -0.9871796 0.9998174 0.9791804 -0.989325 0.9998174 0.9791804 -0.9920392 0.9998174 0.9791804 -0.9954731 0.9998174 0.9791804 -0.9998174 0.9998174 0.9791804 -0.9998557 0.9964092 0.9834679 -0.999886 0.9949941 0.986885 -0.9999099 0.9946818 0.9896036 -0.9999288 0.9949422 0.9917636 -0.9999437 0.9954668 0.9934779 -0.9834129 0.9998557 0.983471 -0.9834129 0.9998557 0.983471 -0.9834129 0.9998557 0.9834709 -0.9834129 0.9998557 0.9834709 -0.9834128 0.9998557 0.9834708 -0.9834128 0.9998557 0.9834707 -0.9834127 0.9998557 0.9834706 -0.9834127 0.9998557 0.9834704 -0.9834126 0.9998557 0.9834702 -0.9834125 0.9998557 0.98347 -0.9834124 0.9998557 0.9834697 -0.9834123 0.9998557 0.9834694 -0.9834122 0.9998557 0.9834691 -0.9834122 0.9998557 0.9834687 -0.9834123 0.9998557 0.9834683 -0.9834126 0.9998557 0.983468 -0.9834132 0.9998557 0.9834679 -0.9834141 0.9998557 0.9834679 -0.9834153 0.9998557 0.9834679 -0.9834167 0.9998557 0.9834679 -0.9834186 0.9998557 0.9834679 -0.9834209 0.9998557 0.9834679 -0.9834239 0.9998557 0.9834679 -0.9834277 0.9998557 0.9834679 -0.9834324 0.9998557 0.9834679 -0.9834385 0.9998557 0.9834679 -0.9834461 0.9998557 0.9834679 -0.9834557 0.9998557 0.9834679 -0.9834679 0.9998557 0.9834679 -0.9834833 0.9998557 0.9834679 -0.9835029 0.9998557 0.9834679 -0.9835276 0.9998557 0.9834679 -0.9835588 0.9998557 0.9834679 -0.9835983 0.9998557 0.9834679 -0.9836483 0.9998557 0.9834679 -0.9837116 0.9998557 0.9834679 -0.9837916 0.9998557 0.9834679 -0.9838928 0.9998557 0.9834679 -0.9840209 0.9998557 0.9834679 -0.9841829 0.9998557 0.9834679 -0.984388 0.9998557 0.9834679 -0.9846473 0.9998557 0.9834679 -0.9849754 0.9998557 0.9834679 -0.9853905 0.9998557 0.9834679 -0.9859157 0.9998557 0.9834679 -0.9865801 0.9998557 0.9834679 -0.9874207 0.9998557 0.9834679 -0.9884841 0.9998557 0.9834679 -0.9898295 0.9998557 0.9834679 -0.9915316 0.9998557 0.9834679 -0.9936849 0.9998557 0.9834679 -0.9964092 0.9998557 0.9834679 -0.9998557 0.9998557 0.9834679 -0.999886 0.9971537 0.986885 -0.9999099 0.9960342 0.9896036 -0.9999288 0.9957887 0.9917636 -0.9999437 0.9959964 0.9934779 -0.9868505 0.999886 0.9868869 -0.9868505 0.999886 0.9868869 -0.9868505 0.999886 0.9868869 -0.9868505 0.999886 0.9868868 -0.9868504 0.999886 0.9868868 -0.9868504 0.999886 0.9868867 -0.9868504 0.999886 0.9868866 -0.9868503 0.999886 0.9868865 -0.9868503 0.999886 0.9868864 -0.9868502 0.999886 0.9868863 -0.9868502 0.999886 0.9868861 -0.9868501 0.999886 0.9868859 -0.9868501 0.999886 0.9868857 -0.98685 0.999886 0.9868854 -0.9868501 0.999886 0.9868852 -0.9868503 0.999886 0.986885 -0.9868507 0.999886 0.986885 -0.9868512 0.999886 0.986885 -0.986852 0.999886 0.986885 -0.9868529 0.999886 0.986885 -0.9868541 0.999886 0.986885 -0.9868555 0.999886 0.986885 -0.9868574 0.999886 0.986885 -0.9868597 0.999886 0.986885 -0.9868627 0.999886 0.986885 -0.9868665 0.999886 0.986885 -0.9868713 0.999886 0.986885 -0.9868773 0.999886 0.986885 -0.986885 0.999886 0.986885 -0.9868946 0.999886 0.986885 -0.9869069 0.999886 0.986885 -0.9869223 0.999886 0.986885 -0.9869419 0.999886 0.986885 -0.9869667 0.999886 0.986885 -0.986998 0.999886 0.986885 -0.9870376 0.999886 0.986885 -0.9870878 0.999886 0.986885 -0.9871512 0.999886 0.986885 -0.9872315 0.999886 0.986885 -0.987333 0.999886 0.986885 -0.9874615 0.999886 0.986885 -0.987624 0.999886 0.986885 -0.9878296 0.999886 0.986885 -0.9880897 0.999886 0.986885 -0.9884188 0.999886 0.986885 -0.9888351 0.999886 0.986885 -0.9893618 0.999886 0.986885 -0.9900282 0.999886 0.986885 -0.9908712 0.999886 0.986885 -0.9919377 0.999886 0.986885 -0.993287 0.999886 0.986885 -0.9949941 0.999886 0.986885 -0.9971537 0.999886 0.986885 -0.999886 0.999886 0.986885 -0.9999099 0.9977452 0.9896036 -0.9999288 0.9968597 0.9917636 -0.9999437 0.9966665 0.9934779 -0.989582 0.9999099 0.9896048 -0.989582 0.9999099 0.9896048 -0.989582 0.9999099 0.9896048 -0.989582 0.9999099 0.9896047 -0.989582 0.9999099 0.9896047 -0.9895819 0.9999099 0.9896047 -0.9895819 0.9999099 0.9896046 -0.9895819 0.9999099 0.9896046 -0.9895819 0.9999099 0.9896045 -0.9895818 0.9999099 0.9896044 -0.9895818 0.9999099 0.9896043 -0.9895818 0.9999099 0.9896042 -0.9895817 0.9999099 0.989604 -0.9895817 0.9999099 0.9896039 -0.9895817 0.9999099 0.9896037 -0.9895819 0.9999099 0.9896036 -0.9895821 0.9999099 0.9896036 -0.9895825 0.9999099 0.9896036 -0.9895829 0.9999099 0.9896036 -0.9895835 0.9999099 0.9896036 -0.9895842 0.9999099 0.9896036 -0.9895851 0.9999099 0.9896036 -0.9895863 0.9999099 0.9896036 -0.9895878 0.9999099 0.9896036 -0.9895897 0.9999099 0.9896036 -0.989592 0.9999099 0.9896036 -0.989595 0.9999099 0.9896036 -0.9895988 0.9999099 0.9896036 -0.9896036 0.9999099 0.9896036 -0.9896096 0.9999099 0.9896036 -0.9896173 0.9999099 0.9896036 -0.989627 0.9999099 0.9896036 -0.9896392 0.9999099 0.9896036 -0.9896547 0.9999099 0.9896036 -0.9896744 0.9999099 0.9896036 -0.9896992 0.9999099 0.9896036 -0.9897306 0.9999099 0.9896036 -0.9897703 0.9999099 0.9896036 -0.9898206 0.9999099 0.9896036 -0.9898842 0.9999099 0.9896036 -0.9899646 0.9999099 0.9896036 -0.9900664 0.9999099 0.9896036 -0.9901951 0.9999099 0.9896036 -0.990358 0.9999099 0.9896036 -0.9905641 0.9999099 0.9896036 -0.9908248 0.9999099 0.9896036 -0.9911547 0.9999099 0.9896036 -0.991572 0.9999099 0.9896036 -0.9920999 0.9999099 0.9896036 -0.9927678 0.9999099 0.9896036 -0.9936128 0.9999099 0.9896036 -0.9946818 0.9999099 0.9896036 -0.9960342 0.9999099 0.9896036 -0.9977452 0.9999099 0.9896036 -0.9999099 0.9999099 0.9896036 -0.9999288 0.9982146 0.9917636 -0.9999437 0.9975143 0.9934779 -0.9917501 0.9999288 0.9917644 -0.9917501 0.9999288 0.9917644 -0.9917501 0.9999288 0.9917643 -0.9917501 0.9999288 0.9917643 -0.9917501 0.9999288 0.9917643 -0.9917501 0.9999288 0.9917643 -0.99175 0.9999288 0.9917642 -0.99175 0.9999288 0.9917642 -0.99175 0.9999288 0.9917642 -0.99175 0.9999288 0.9917641 -0.99175 0.9999288 0.991764 -0.9917499 0.9999288 0.991764 -0.9917499 0.9999288 0.9917639 -0.9917499 0.9999288 0.9917638 -0.9917499 0.9999288 0.9917637 -0.99175 0.9999288 0.9917636 -0.9917502 0.9999288 0.9917636 -0.9917504 0.9999288 0.9917636 -0.9917507 0.9999288 0.9917636 -0.991751 0.9999288 0.9917636 -0.9917515 0.9999288 0.9917636 -0.9917521 0.9999288 0.9917636 -0.9917528 0.9999288 0.9917636 -0.9917537 0.9999288 0.9917636 -0.9917549 0.9999288 0.9917636 -0.9917564 0.9999288 0.9917636 -0.9917582 0.9999288 0.9917636 -0.9917606 0.9999288 0.9917636 -0.9917636 0.9999288 0.9917636 -0.9917674 0.9999288 0.9917636 -0.9917722 0.9999288 0.9917636 -0.9917782 0.9999288 0.9917636 -0.9917859 0.9999288 0.9917636 -0.9917956 0.9999288 0.9917636 -0.9918079 0.9999288 0.9917636 -0.9918234 0.9999288 0.9917636 -0.9918431 0.9999288 0.9917636 -0.991868 0.9999288 0.9917636 -0.9918994 0.9999288 0.9917636 -0.9919392 0.9999288 0.9917636 -0.9919896 0.9999288 0.9917636 -0.9920533 0.9999288 0.9917636 -0.9921339 0.9999288 0.9917636 -0.9922358 0.9999288 0.9917636 -0.9923648 0.9999288 0.9917636 -0.992528 0.9999288 0.9917636 -0.9927345 0.9999288 0.9917636 -0.9929957 0.9999288 0.9917636 -0.9933261 0.9999288 0.9917636 -0.9937442 0.9999288 0.9917636 -0.9942731 0.9999288 0.9917636 -0.9949422 0.9999288 0.9917636 -0.9957887 0.9999288 0.9917636 -0.9968597 0.9999288 0.9917636 -0.9982146 0.9999288 0.9917636 -0.9999288 0.9999288 0.9917636 -0.9999437 0.9985868 0.9934779 -0.9934695 0.9999437 0.9934784 -0.9934695 0.9999437 0.9934784 -0.9934695 0.9999437 0.9934784 -0.9934695 0.9999437 0.9934784 -0.9934695 0.9999437 0.9934784 -0.9934695 0.9999437 0.9934784 -0.9934695 0.9999437 0.9934783 -0.9934694 0.9999437 0.9934783 -0.9934694 0.9999437 0.9934783 -0.9934694 0.9999437 0.9934783 -0.9934694 0.9999437 0.9934782 -0.9934694 0.9999437 0.9934782 -0.9934694 0.9999437 0.9934781 -0.9934694 0.9999437 0.9934781 -0.9934694 0.9999437 0.993478 -0.9934694 0.9999437 0.9934779 -0.9934695 0.9999437 0.9934779 -0.9934697 0.9999437 0.9934779 -0.9934698 0.9999437 0.9934779 -0.9934701 0.9999437 0.9934779 -0.9934704 0.9999437 0.9934779 -0.9934707 0.9999437 0.9934779 -0.9934712 0.9999437 0.9934779 -0.9934718 0.9999437 0.9934779 -0.9934725 0.9999437 0.9934779 -0.9934734 0.9999437 0.9934779 -0.9934746 0.9999437 0.9934779 -0.9934761 0.9999437 0.9934779 -0.9934779 0.9999437 0.9934779 -0.9934803 0.9999437 0.9934779 -0.9934833 0.9999437 0.9934779 -0.9934871 0.9999437 0.9934779 -0.9934919 0.9999437 0.9934779 -0.993498 0.9999437 0.9934779 -0.9935057 0.9999437 0.9934779 -0.9935154 0.9999437 0.9934779 -0.9935277 0.9999437 0.9934779 -0.9935432 0.9999437 0.9934779 -0.9935629 0.9999437 0.9934779 -0.9935878 0.9999437 0.9934779 -0.9936193 0.9999437 0.9934779 -0.9936592 0.9999437 0.9934779 -0.9937096 0.9999437 0.9934779 -0.9937734 0.9999437 0.9934779 -0.9938541 0.9999437 0.9934779 -0.9939562 0.9999437 0.9934779 -0.9940854 0.9999437 0.9934779 -0.9942488 0.9999437 0.9934779 -0.9944556 0.9999437 0.9934779 -0.9947172 0.9999437 0.9934779 -0.9950481 0.9999437 0.9934779 -0.9954668 0.9999437 0.9934779 -0.9959964 0.9999437 0.9934779 -0.9966665 0.9999437 0.9934779 -0.9975143 0.9999437 0.9934779 -0.9985868 0.9999437 0.9934779 -0.9999437 0.9999437 0.9934779 -0.1059991 0.1059991 0.9545467 -0.1062449 0.1059991 0.9545467 -0.106556 0.1059991 0.9545467 -0.1069495 0.1059991 0.9545467 -0.1074473 0.1059991 0.9545467 -0.1080772 0.1059991 0.9545467 -0.108874 0.1059991 0.9545467 -0.1098821 0.1059991 0.9545467 -0.1111575 0.1059991 0.9545467 -0.112771 0.1059991 0.9545467 -0.1148123 0.1059991 0.9545467 -0.1173948 0.1059991 0.9545467 -0.120662 0.1059991 0.9545467 -0.1247954 0.1059991 0.9545467 -0.1300248 0.1059991 0.9545467 -0.1366405 0.1059991 0.9545467 -0.1450104 0.1059991 0.9545467 -0.1555993 0.1059991 0.9545467 -0.1689957 0.1059991 0.9545467 -0.1859439 0.1059991 0.9545467 -0.2073855 0.1059991 0.9545467 -0.2345119 0.1059991 0.9545467 -0.2688304 0.1059991 0.9545467 -0.3122478 0.1059991 0.9545467 -0.3671764 0.1059991 0.9545467 -0.4366682 0.1059991 0.9545467 -0.5245844 0.1059991 0.9545467 -0.6358098 0.1059991 0.9545467 -0.7765244 0.1059991 0.9545467 -0.9545467 0.1059991 0.9545467 -0.9669269 0.1572498 0.7970984 -0.9754027 0.2151269 0.6899401 -0.9814251 0.2783684 0.6253806 -0.9858181 0.3454107 0.5952302 -0.9890841 0.4144197 0.591598 -0.9915469 0.4834235 0.6072459 -0.993424 0.5504963 0.635807 -0.9948662 0.6139459 0.6719355 -0.9959813 0.6724572 0.7113861 -0.9968475 0.7251659 0.7510052 -0.997523 0.7716588 0.7886382 -0.9980513 0.8119154 0.8229756 -0.9984653 0.8462171 0.8533677 -0.9987905 0.8750477 0.8796415 -0.9990461 0.8990028 0.9019384 -0.9992474 0.9187175 0.9205853 -0.999406 0.9348153 0.9359994 -0.999531 0.9478754 0.9486239 -0.9996296 0.958416 0.958888 -0.9997074 0.9668873 0.9671845 -0.9997689 0.9736726 0.9738594 -0.9998174 0.9790927 0.97921 -0.9998557 0.9834129 0.9834865 -0.999886 0.9868505 0.9868966 -0.9999099 0.989582 0.9896109 -0.9999288 0.9917501 0.9917682 -0.9999437 0.9934695 0.9934808 -0.1059991 0.1062449 0.9545467 -0.1059489 0.1059489 0.9545286 -0.1062601 0.1059489 0.9545286 -0.1066537 0.1059489 0.9545286 -0.1071517 0.1059489 0.9545286 -0.1077818 0.1059489 0.9545286 -0.1085789 0.1059489 0.9545286 -0.1095873 0.1059489 0.9545286 -0.1108631 0.1059489 0.9545286 -0.1124771 0.1059489 0.9545286 -0.1145191 0.1059489 0.9545286 -0.1171024 0.1059489 0.9545286 -0.1203707 0.1059489 0.9545286 -0.1245055 0.1059489 0.9545286 -0.1297365 0.1059489 0.9545286 -0.1363545 0.1059489 0.9545286 -0.1447271 0.1059489 0.9545286 -0.1553195 0.1059489 0.9545286 -0.1687203 0.1059489 0.9545286 -0.185674 0.1059489 0.9545286 -0.2071226 0.1059489 0.9545286 -0.234258 0.1059489 0.9545286 -0.2685877 0.1059489 0.9545286 -0.3120193 0.1059489 0.9545286 -0.3669659 0.1059489 0.9545286 -0.4364805 0.1059489 0.9545286 -0.5244254 0.1059489 0.9545286 -0.6356873 0.1059489 0.9545286 -0.776448 0.1059489 0.9545286 -0.9545286 0.1059489 0.9545286 -0.9669173 0.1572031 0.7970422 -0.9753975 0.2150852 0.6898695 -0.9814221 0.2783325 0.62531 -0.9858163 0.3453807 0.5951671 -0.9890831 0.4143955 0.5915454 -0.9915463 0.4834045 0.6072043 -0.9934236 0.5504818 0.6357753 -0.994866 0.6139352 0.6719122 -0.9959811 0.6724495 0.7113694 -0.9968474 0.7251605 0.7509934 -0.997523 0.7716551 0.7886302 -0.9980512 0.8119128 0.8229701 -0.9984653 0.8462154 0.8533641 -0.9987905 0.8750466 0.8796391 -0.9990461 0.899002 0.9019369 -0.9992474 0.918717 0.9205843 -0.999406 0.9348149 0.9359988 -0.999531 0.9478752 0.9486235 -0.9996296 0.9584159 0.9588878 -0.9997074 0.9668872 0.9671843 -0.9997689 0.9736726 0.9738593 -0.9998174 0.9790927 0.9792099 -0.9998557 0.9834129 0.9834864 -0.999886 0.9868505 0.9868965 -0.9999099 0.989582 0.9896108 -0.9999288 0.9917501 0.9917681 -0.9999437 0.9934695 0.9934808 -0.1059991 0.106556 0.9545467 -0.1059489 0.1062601 0.9545286 -0.1058883 0.1058883 0.9545059 -0.1062821 0.1058883 0.9545059 -0.1067803 0.1058883 0.9545059 -0.1074107 0.1058883 0.9545059 -0.1082081 0.1058883 0.9545059 -0.1092169 0.1058883 0.9545059 -0.1104932 0.1058883 0.9545059 -0.1121079 0.1058883 0.9545059 -0.1141507 0.1058883 0.9545059 -0.1167351 0.1058883 0.9545059 -0.1200048 0.1058883 0.9545059 -0.1241413 0.1058883 0.9545059 -0.1293745 0.1058883 0.9545059 -0.1359951 0.1058883 0.9545059 -0.1443712 0.1058883 0.9545059 -0.1549679 0.1058883 0.9545059 -0.1683742 0.1058883 0.9545059 -0.1853349 0.1058883 0.9545059 -0.2067924 0.1058883 0.9545059 -0.2339389 0.1058883 0.9545059 -0.2682827 0.1058883 0.9545059 -0.3117322 0.1058883 0.9545059 -0.3667014 0.1058883 0.9545059 -0.4362446 0.1058883 0.9545059 -0.5242258 0.1058883 0.9545059 -0.6355334 0.1058883 0.9545059 -0.776352 0.1058883 0.9545059 -0.9545059 0.1058883 0.9545059 -0.9669053 0.1571463 0.7969715 -0.9753908 0.2150342 0.6897808 -0.9814183 0.2782884 0.6252213 -0.9858141 0.3453439 0.5950879 -0.9890818 0.4143657 0.5914794 -0.9915455 0.4833811 0.607152 -0.9934231 0.550464 0.6357355 -0.9948657 0.6139219 0.6718829 -0.9959809 0.6724399 0.7113484 -0.9968473 0.7251537 0.7509787 -0.9975229 0.7716504 0.7886201 -0.9980512 0.8119096 0.8229633 -0.9984653 0.8462132 0.8533595 -0.9987904 0.8750451 0.8796361 -0.9990461 0.8990011 0.9019349 -0.9992474 0.9187164 0.9205831 -0.999406 0.9348146 0.935998 -0.999531 0.947875 0.948623 -0.9996296 0.9584157 0.9588875 -0.9997074 0.9668871 0.9671841 -0.9997689 0.9736725 0.9738591 -0.9998174 0.9790927 0.9792098 -0.9998557 0.9834129 0.9834864 -0.999886 0.9868505 0.9868965 -0.9999099 0.989582 0.9896108 -0.9999288 0.9917501 0.9917681 -0.9999437 0.9934695 0.9934808 -0.1059991 0.1069495 0.9545467 -0.1059489 0.1066537 0.9545286 -0.1058883 0.1062821 0.9545059 -0.1058162 0.1058162 0.9544774 -0.1063147 0.1058162 0.9544774 -0.1069453 0.1058162 0.9544774 -0.1077431 0.1058162 0.9544774 -0.1087525 0.1058162 0.9544774 -0.1100294 0.1058162 0.9544774 -0.111645 0.1058162 0.9544774 -0.1136888 0.1058162 0.9544774 -0.1162746 0.1058162 0.9544774 -0.1195459 0.1058162 0.9544774 -0.1236845 0.1058162 0.9544774 -0.1289204 0.1058162 0.9544774 -0.1355445 0.1058162 0.9544774 -0.1439249 0.1058162 0.9544774 -0.1545271 0.1058162 0.9544774 -0.1679403 0.1058162 0.9544774 -0.1849097 0.1058162 0.9544774 -0.2063783 0.1058162 0.9544774 -0.2335388 0.1058162 0.9544774 -0.2679003 0.1058162 0.9544774 -0.3113722 0.1058162 0.9544774 -0.3663698 0.1058162 0.9544774 -0.4359488 0.1058162 0.9544774 -0.5239754 0.1058162 0.9544774 -0.6353404 0.1058162 0.9544774 -0.7762317 0.1058162 0.9544774 -0.9544774 0.1058162 0.9544774 -0.9668902 0.1570779 0.7968829 -0.9753825 0.2149725 0.6896696 -0.9814136 0.2782347 0.6251102 -0.9858113 0.3452987 0.5949885 -0.9890801 0.414329 0.5913967 -0.9915446 0.4833522 0.6070865 -0.9934225 0.5504419 0.6356857 -0.9948653 0.6139056 0.6718462 -0.9959807 0.672428 0.7113221 -0.9968472 0.7251454 0.7509603 -0.9975228 0.7716446 0.7886074 -0.9980511 0.8119057 0.8229548 -0.9984653 0.8462106 0.8533539 -0.9987904 0.8750434 0.8796324 -0.9990461 0.899 0.9019325 -0.9992474 0.9187157 0.9205815 -0.999406 0.9348141 0.935997 -0.999531 0.9478746 0.9486224 -0.9996296 0.9584155 0.9588871 -0.9997074 0.966887 0.9671838 -0.9997689 0.9736724 0.973859 -0.9998174 0.9790926 0.9792097 -0.9998557 0.9834129 0.9834863 -0.999886 0.9868505 0.9868965 -0.9999099 0.989582 0.9896108 -0.9999288 0.9917501 0.9917681 -0.9999437 0.9934695 0.9934808 -0.1059991 0.1074473 0.9545467 -0.1059489 0.1071517 0.9545286 -0.1058883 0.1067803 0.9545059 -0.1058162 0.1063147 0.9544774 -0.1057322 0.1057322 0.9544418 -0.1063632 0.1057322 0.9544418 -0.1071616 0.1057322 0.9544418 -0.1081716 0.1057322 0.9544418 -0.1094494 0.1057322 0.9544418 -0.1110659 0.1057322 0.9544418 -0.1131111 0.1057322 0.9544418 -0.1156985 0.1057322 0.9544418 -0.1189719 0.1057322 0.9544418 -0.1231132 0.1057322 0.9544418 -0.1283525 0.1057322 0.9544418 -0.1349809 0.1057322 0.9544418 -0.1433666 0.1057322 0.9544418 -0.1539757 0.1057322 0.9544418 -0.1673975 0.1057322 0.9544418 -0.1843779 0.1057322 0.9544418 -0.2058603 0.1057322 0.9544418 -0.2330383 0.1057322 0.9544418 -0.267422 0.1057322 0.9544418 -0.3109219 0.1057322 0.9544418 -0.3659549 0.1057322 0.9544418 -0.4355789 0.1057322 0.9544418 -0.5236622 0.1057322 0.9544418 -0.635099 0.1057322 0.9544418 -0.7760811 0.1057322 0.9544418 -0.9544418 0.1057322 0.9544418 -0.9668714 0.1569971 0.7967721 -0.9753721 0.2148987 0.6895306 -0.9814076 0.2781701 0.6249712 -0.9858079 0.3452442 0.5948644 -0.9890781 0.4142845 0.5912932 -0.9915433 0.4833171 0.6070046 -0.9934218 0.550415 0.6356233 -0.9948649 0.6138855 0.6718002 -0.9959804 0.6724135 0.7112892 -0.996847 0.7251351 0.7509373 -0.9975227 0.7716375 0.7885916 -0.9980511 0.8119009 0.8229441 -0.9984652 0.8462073 0.8533468 -0.9987904 0.8750412 0.8796277 -0.9990461 0.8989986 0.9019295 -0.9992474 0.9187148 0.9205795 -0.999406 0.9348135 0.9359957 -0.999531 0.9478743 0.9486216 -0.9996296 0.9584153 0.9588865 -0.9997074 0.9668869 0.9671835 -0.9997689 0.9736723 0.9738588 -0.9998174 0.9790925 0.9792096 -0.9998557 0.9834128 0.9834862 -0.999886 0.9868504 0.9868964 -0.9999099 0.989582 0.9896108 -0.9999288 0.9917501 0.9917681 -0.9999437 0.9934695 0.9934807 -0.1059991 0.1080772 0.9545467 -0.1059489 0.1077818 0.9545286 -0.1058883 0.1074107 0.9545059 -0.1058162 0.1069453 0.9544774 -0.1057322 0.1063632 0.9544418 -0.1056375 0.1056375 0.9543974 -0.1064365 0.1056375 0.9543974 -0.1074473 0.1056375 0.9543974 -0.1087261 0.1056375 0.9543974 -0.110344 0.1056375 0.9543974 -0.1123908 0.1056375 0.9543974 -0.1149803 0.1056375 0.9543974 -0.1182564 0.1056375 0.9543974 -0.122401 0.1056375 0.9543974 -0.1276445 0.1056375 0.9543974 -0.1342782 0.1056375 0.9543974 -0.1426706 0.1056375 0.9543974 -0.1532882 0.1056375 0.9543974 -0.1667209 0.1056375 0.9543974 -0.1837149 0.1056375 0.9543974 -0.2052145 0.1056375 0.9543974 -0.2324144 0.1056375 0.9543974 -0.2668257 0.1056375 0.9543974 -0.3103605 0.1056375 0.9543974 -0.3654378 0.1056375 0.9543974 -0.4351176 0.1056375 0.9543974 -0.5232717 0.1056375 0.9543974 -0.634798 0.1056375 0.9543974 -0.7758934 0.1056375 0.9543974 -0.9543974 0.1056375 0.9543974 -0.9668479 0.156904 0.796634 -0.9753591 0.2148124 0.6893573 -0.9814002 0.2780936 0.6247981 -0.9858036 0.3451791 0.5947097 -0.9890755 0.4142311 0.5911644 -0.9915418 0.4832747 0.6069026 -0.9934209 0.5503825 0.6355457 -0.9948643 0.6138613 0.6717431 -0.9959801 0.6723959 0.7112482 -0.9968468 0.7251226 0.7509086 -0.9975226 0.7716288 0.7885719 -0.998051 0.8118949 0.8229308 -0.9984652 0.8462034 0.8533379 -0.9987904 0.8750386 0.8796219 -0.9990461 0.8989969 0.9019257 -0.9992474 0.9187137 0.9205771 -0.9994059 0.9348128 0.9359941 -0.999531 0.9478738 0.9486206 -0.9996296 0.958415 0.9588859 -0.9997074 0.9668867 0.9671831 -0.9997689 0.9736722 0.9738585 -0.9998174 0.9790925 0.9792094 -0.9998557 0.9834128 0.9834861 -0.999886 0.9868504 0.9868964 -0.9999099 0.9895819 0.9896107 -0.9999288 0.9917501 0.9917681 -0.9999437 0.9934695 0.9934807 -0.1059991 0.108874 0.9545467 -0.1059489 0.1085789 0.9545286 -0.1058883 0.1082081 0.9545059 -0.1058162 0.1077431 0.9544774 -0.1057322 0.1071616 0.9544418 -0.1056375 0.1064365 0.9543974 -0.1055364 0.1055364 0.9543421 -0.1065482 0.1055364 0.9543421 -0.1078283 0.1055364 0.9543421 -0.1094478 0.1055364 0.9543421 -0.1114966 0.1055364 0.9543421 -0.1140887 0.1055364 0.9543421 -0.117368 0.1055364 0.9543421 -0.1215168 0.1055364 0.9543421 -0.1267655 0.1055364 0.9543421 -0.1334058 0.1055364 0.9543421 -0.1418066 0.1055364 0.9543421 -0.1524348 0.1055364 0.9543421 -0.1658808 0.1055364 0.9543421 -0.1828918 0.1055364 0.9543421 -0.2044128 0.1055364 0.9543421 -0.2316398 0.1055364 0.9543421 -0.2660854 0.1055364 0.9543421 -0.3096636 0.1055364 0.9543421 -0.3647957 0.1055364 0.9543421 -0.434545 0.1055364 0.9543421 -0.5227869 0.1055364 0.9543421 -0.6344244 0.1055364 0.9543421 -0.7756603 0.1055364 0.9543421 -0.9543421 0.1055364 0.9543421 -0.9668187 0.1568008 0.7964626 -0.975343 0.2147144 0.6891423 -0.9813911 0.2780055 0.6245833 -0.9857982 0.3451032 0.5945178 -0.9890723 0.4141683 0.5910046 -0.9915399 0.4832246 0.6067761 -0.9934197 0.5503438 0.6354495 -0.9948636 0.6138323 0.6716722 -0.9959797 0.6723748 0.7111974 -0.9968465 0.7251076 0.750873 -0.9975224 0.7716184 0.7885475 -0.9980509 0.8118878 0.8229144 -0.9984651 0.8461986 0.853327 -0.9987903 0.8750355 0.8796147 -0.9990461 0.8989948 0.901921 -0.9992473 0.9187123 0.9205741 -0.9994059 0.9348119 0.9359922 -0.999531 0.9478733 0.9486193 -0.9996296 0.9584146 0.9588851 -0.9997074 0.9668865 0.9671826 -0.9997689 0.9736721 0.9738582 -0.9998174 0.9790924 0.9792092 -0.9998557 0.9834127 0.983486 -0.999886 0.9868504 0.9868963 -0.9999099 0.9895819 0.9896107 -0.9999288 0.99175 0.991768 -0.9999437 0.9934695 0.9934807 -0.1059991 0.1098821 0.9545467 -0.1059489 0.1095873 0.9545286 -0.1058883 0.1092169 0.9545059 -0.1058162 0.1087525 0.9544774 -0.1057322 0.1081716 0.9544418 -0.1056375 0.1074473 0.9543974 -0.1055364 0.1065482 0.9543421 -0.1054384 0.1054384 0.9542739 -0.10672 0.1054384 0.9542739 -0.1083415 0.1054384 0.9542739 -0.1103929 0.1054384 0.9542739 -0.1129881 0.1054384 0.9542739 -0.1162715 0.1054384 0.9542739 -0.1204253 0.1054384 0.9542739 -0.1256805 0.1054384 0.9542739 -0.1323289 0.1054384 0.9542739 -0.1407401 0.1054384 0.9542739 -0.1513813 0.1054384 0.9542739 -0.1648439 0.1054384 0.9542739 -0.1818757 0.1054384 0.9542739 -0.2034232 0.1054384 0.9542739 -0.2306836 0.1054384 0.9542739 -0.2651716 0.1054384 0.9542739 -0.3088033 0.1054384 0.9542739 -0.3640031 0.1054384 0.9542739 -0.4338381 0.1054384 0.9542739 -0.5221884 0.1054384 0.9542739 -0.6339631 0.1054384 0.9542739 -0.7753725 0.1054384 0.9542739 -0.9542739 0.1054384 0.9542739 -0.9667827 0.1566936 0.7962511 -0.9753231 0.2146085 0.6888771 -0.9813797 0.2779077 0.6243183 -0.9857916 0.3450175 0.5942812 -0.9890684 0.4140964 0.5908076 -0.9915376 0.4831666 0.6066202 -0.9934183 0.5502987 0.6353308 -0.9948628 0.6137984 0.6715848 -0.9959791 0.67235 0.7111348 -0.9968462 0.7250899 0.7508292 -0.9975222 0.7716061 0.7885175 -0.9980508 0.8118794 0.8228941 -0.998465 0.8461929 0.8533135 -0.9987903 0.8750317 0.8796058 -0.999046 0.8989923 0.9019152 -0.9992473 0.9187107 0.9205703 -0.9994059 0.9348109 0.9359898 -0.999531 0.9478726 0.9486178 -0.9996296 0.9584142 0.9588842 -0.9997074 0.9668862 0.967182 -0.9997689 0.9736719 0.9738578 -0.9998174 0.9790923 0.979209 -0.9998557 0.9834127 0.9834858 -0.999886 0.9868503 0.9868962 -0.9999099 0.9895819 0.9896106 -0.9999288 0.99175 0.991768 -0.9999437 0.9934694 0.9934807 -0.1059991 0.1111575 0.9545467 -0.1059489 0.1108631 0.9545286 -0.1058883 0.1104932 0.9545059 -0.1058162 0.1100294 0.9544774 -0.1057322 0.1094494 0.9544418 -0.1056375 0.1087261 0.9543974 -0.1055364 0.1078283 0.9543421 -0.1054384 0.10672 0.9542739 -0.1053624 0.1053624 0.9541902 -0.1069863 0.1053624 0.9541902 -0.1090407 0.1053624 0.9541902 -0.1116399 0.1053624 0.9541902 -0.1149282 0.1053624 0.9541902 -0.1190883 0.1053624 0.9541902 -0.1243513 0.1053624 0.9541902 -0.1310098 0.1053624 0.9541902 -0.1394336 0.1053624 0.9541902 -0.1500908 0.1053624 0.9541902 -0.1635736 0.1053624 0.9541902 -0.180631 0.1053624 0.9541902 -0.2022109 0.1053624 0.9541902 -0.2295123 0.1053624 0.9541902 -0.2640521 0.1053624 0.9541902 -0.3077494 0.1053624 0.9541902 -0.3630322 0.1053624 0.9541902 -0.4329722 0.1053624 0.9541902 -0.5214553 0.1053624 0.9541902 -0.6333979 0.1053624 0.9541902 -0.7750199 0.1053624 0.9541902 -0.9541902 0.1053624 0.9541902 -0.9667385 0.1565954 0.795992 -0.9752987 0.2145034 0.6885524 -0.9813659 0.2778058 0.6239941 -0.9857835 0.3449254 0.5939917 -0.9890637 0.4140176 0.5905666 -0.9915347 0.4831021 0.6064294 -0.9934166 0.550248 0.6351857 -0.9948617 0.6137599 0.6714779 -0.9959785 0.6723217 0.7110582 -0.9968458 0.7250697 0.7507756 -0.997522 0.7715919 0.7884807 -0.9980506 0.8118697 0.8228693 -0.9984649 0.8461864 0.853297 -0.9987902 0.8750274 0.879595 -0.999046 0.8989895 0.9019081 -0.9992473 0.9187089 0.9205658 -0.9994059 0.9348097 0.9359869 -0.999531 0.9478718 0.9486159 -0.9996296 0.9584137 0.958883 -0.9997074 0.9668859 0.9671812 -0.9997689 0.9736717 0.9738573 -0.9998174 0.9790921 0.9792087 -0.9998557 0.9834126 0.9834856 -0.999886 0.9868503 0.9868961 -0.9999099 0.9895819 0.9896105 -0.9999288 0.99175 0.991768 -0.9999437 0.9934694 0.9934807 -0.1059991 0.112771 0.9545467 -0.1059489 0.1124771 0.9545286 -0.1058883 0.1121079 0.9545059 -0.1058162 0.111645 0.9544774 -0.1057322 0.1110659 0.9544418 -0.1056375 0.110344 0.9543974 -0.1055364 0.1094478 0.9543421 -0.1054384 0.1083415 0.9542739 -0.1053624 0.1069863 0.9541902 -0.1053433 0.1053433 0.9540886 -0.1074015 0.1053433 0.9540886 -0.1100054 0.1053433 0.9540886 -0.1132997 0.1053433 0.9540886 -0.1174673 0.1053433 0.9540886 -0.12274 0.1053433 0.9540886 -0.1294105 0.1053433 0.9540886 -0.1378497 0.1053433 0.9540886 -0.1485263 0.1053433 0.9540886 -0.1620336 0.1053433 0.9540886 -0.179122 0.1053433 0.9540886 -0.2007412 0.1053433 0.9540886 -0.2280923 0.1053433 0.9540886 -0.2626949 0.1053433 0.9540886 -0.3064717 0.1053433 0.9540886 -0.3618551 0.1053433 0.9540886 -0.4319223 0.1053433 0.9540886 -0.5205664 0.1053433 0.9540886 -0.6327127 0.1053433 0.9540886 -0.7745924 0.1053433 0.9540886 -0.9540886 0.1053433 0.9540886 -0.966685 0.1565315 0.7956781 -0.9752692 0.2144168 0.6881591 -0.9813491 0.2777122 0.6236015 -0.9857738 0.3448353 0.5936412 -0.9890579 0.4139373 0.5902749 -0.9915312 0.4830346 0.6061987 -0.9934145 0.5501939 0.6350102 -0.9948604 0.6137183 0.6713487 -0.9959777 0.6722907 0.7109656 -0.9968453 0.7250473 0.7507108 -0.9975217 0.7715762 0.7884362 -0.9980504 0.8118589 0.8228393 -0.9984648 0.8461791 0.853277 -0.9987902 0.8750225 0.8795819 -0.9990459 0.8989863 0.9018996 -0.9992473 0.9187068 0.9205603 -0.9994059 0.9348083 0.9359833 -0.9995309 0.947871 0.9486137 -0.9996296 0.9584132 0.9588815 -0.9997074 0.9668855 0.9671803 -0.9997689 0.9736715 0.9738568 -0.9998174 0.979092 0.9792083 -0.9998557 0.9834125 0.9834854 -0.999886 0.9868502 0.9868959 -0.9999099 0.9895818 0.9896105 -0.9999288 0.99175 0.9917679 -0.9999437 0.9934694 0.9934806 -0.1059991 0.1148123 0.9545467 -0.1059489 0.1145191 0.9545286 -0.1058883 0.1141507 0.9545059 -0.1058162 0.1136888 0.9544774 -0.1057322 0.1131111 0.9544418 -0.1056375 0.1123908 0.9543974 -0.1055364 0.1114966 0.9543421 -0.1054384 0.1103929 0.9542739 -0.1053624 0.1090407 0.9541902 -0.1053433 0.1074015 0.9540886 -0.1054431 0.1054431 0.9539671 -0.1080526 0.1054431 0.9539671 -0.111354 0.1054431 0.9539671 -0.1155307 0.1054431 0.9539671 -0.1208148 0.1054431 0.9539671 -0.1274998 0.1054431 0.9539671 -0.1359573 0.1054431 0.9539671 -0.1466571 0.1054431 0.9539671 -0.1601937 0.1054431 0.9539671 -0.1773192 0.1054431 0.9539671 -0.1989853 0.1054431 0.9539671 -0.2263957 0.1054431 0.9539671 -0.2610734 0.1054431 0.9539671 -0.3049452 0.1054431 0.9539671 -0.3604487 0.1054431 0.9539671 -0.4306679 0.1054431 0.9539671 -0.5195043 0.1054431 0.9539671 -0.6318939 0.1054431 0.9539671 -0.7740814 0.1054431 0.9539671 -0.9539671 0.1054431 0.9539671 -0.9666211 0.1565473 0.7953033 -0.975234 0.2143816 0.6876897 -0.9813291 0.2776503 0.6231332 -0.9857621 0.3447636 0.5932233 -0.989051 0.4138668 0.5899272 -0.9915271 0.4829718 0.6059236 -0.993412 0.5501416 0.634801 -0.9948589 0.6136769 0.6711946 -0.9959768 0.6722594 0.7108553 -0.9968448 0.7250244 0.7506336 -0.9975213 0.7715599 0.7883833 -0.9980502 0.8118476 0.8228035 -0.9984647 0.8461714 0.8532533 -0.9987901 0.8750173 0.8795663 -0.9990459 0.8989829 0.9018894 -0.9992472 0.9187045 0.9205537 -0.9994059 0.9348069 0.9359791 -0.9995309 0.94787 0.948611 -0.9996296 0.9584126 0.9588798 -0.9997074 0.9668852 0.9671793 -0.9997689 0.9736712 0.9738561 -0.9998174 0.9790919 0.9792079 -0.9998557 0.9834124 0.9834851 -0.999886 0.9868502 0.9868958 -0.9999099 0.9895818 0.9896103 -0.9999288 0.99175 0.9917678 -0.9999437 0.9934694 0.9934806 -0.1059991 0.1173948 0.9545467 -0.1059489 0.1171024 0.9545286 -0.1058883 0.1167351 0.9545059 -0.1058162 0.1162746 0.9544774 -0.1057322 0.1156985 0.9544418 -0.1056375 0.1149803 0.9543974 -0.1055364 0.1140887 0.9543421 -0.1054384 0.1129881 0.9542739 -0.1053624 0.1116399 0.9541902 -0.1053433 0.1100054 0.9540886 -0.1054431 0.1080526 0.9539671 -0.1057683 0.1057683 0.9538247 -0.1090781 0.1057683 0.9538247 -0.1132654 0.1057683 0.9538247 -0.1185628 0.1057683 0.9538247 -0.1252648 0.1057683 0.9538247 -0.1337437 0.1057683 0.9538247 -0.1444705 0.1057683 0.9538247 -0.1580414 0.1057683 0.9538247 -0.1752103 0.1057683 0.9538247 -0.1969312 0.1057683 0.9538247 -0.224411 0.1057683 0.9538247 -0.2591765 0.1057683 0.9538247 -0.3031594 0.1057683 0.9538247 -0.3588035 0.1057683 0.9538247 -0.4292005 0.1057683 0.9538247 -0.5182618 0.1057683 0.9538247 -0.630936 0.1057683 0.9538247 -0.7734835 0.1057683 0.9538247 -0.9538247 0.1057683 0.9538247 -0.9665463 0.1567226 0.794865 -0.9751928 0.2144566 0.6871414 -0.9813057 0.2776626 0.6225864 -0.9857485 0.3447407 0.5927355 -0.989043 0.4138277 0.5895215 -0.9915223 0.4829286 0.6056027 -0.9934091 0.5501012 0.634557 -0.9948571 0.6136427 0.671015 -0.9959757 0.6722322 0.7107266 -0.9968441 0.7250039 0.7505436 -0.9975209 0.7715449 0.7883215 -0.99805 0.811837 0.8227619 -0.9984645 0.8461641 0.8532256 -0.99879 0.8750124 0.8795481 -0.9990458 0.8989796 0.9018776 -0.9992472 0.9187024 0.920546 -0.9994059 0.9348055 0.9359742 -0.9995309 0.9478691 0.9486079 -0.9996296 0.958412 0.9588778 -0.9997074 0.9668848 0.967178 -0.9997689 0.973671 0.9738553 -0.9998174 0.9790917 0.9792074 -0.9998557 0.9834123 0.9834848 -0.999886 0.9868501 0.9868956 -0.9999099 0.9895818 0.9896102 -0.9999288 0.9917499 0.9917678 -0.9999437 0.9934694 0.9934805 -0.1059991 0.120662 0.9545467 -0.1059489 0.1203707 0.9545286 -0.1058883 0.1200048 0.9545059 -0.1058162 0.1195459 0.9544774 -0.1057322 0.1189719 0.9544418 -0.1056375 0.1182564 0.9543974 -0.1055364 0.117368 0.9543421 -0.1054384 0.1162715 0.9542739 -0.1053624 0.1149282 0.9541902 -0.1053433 0.1132997 0.9540886 -0.1054431 0.111354 0.9539671 -0.1057683 0.1090781 0.9538247 -0.1064997 0.1064997 0.953663 -0.1106989 0.1064997 0.953663 -0.1160116 0.1064997 0.953663 -0.1227327 0.1064997 0.953663 -0.1312358 0.1064997 0.953663 -0.1419934 0.1064997 0.953663 -0.1556031 0.1064997 0.953663 -0.1728211 0.1064997 0.953663 -0.1946042 0.1064997 0.953663 -0.2221626 0.1064997 0.953663 -0.2570275 0.1064997 0.953663 -0.3011363 0.1064997 0.953663 -0.3569395 0.1064997 0.953663 -0.4275379 0.1064997 0.953663 -0.5168541 0.1064997 0.953663 -0.6298506 0.1064997 0.953663 -0.7728059 0.1064997 0.953663 -0.953663 0.1064997 0.953663 -0.9664615 0.1571937 0.7943688 -0.9751462 0.2147432 0.6865211 -0.9812792 0.2778236 0.6219681 -0.9857332 0.3448204 0.5921842 -0.9890339 0.4138582 0.5890631 -0.9915169 0.4829319 0.6052403 -0.9934058 0.5500915 0.6342815 -0.9948551 0.6136284 0.6708123 -0.9959745 0.672218 0.7105815 -0.9968433 0.7249916 0.750442 -0.9975204 0.7715352 0.7882518 -0.9980497 0.8118298 0.8227149 -0.9984643 0.8461589 0.8531943 -0.9987899 0.8750088 0.8795275 -0.9990458 0.8989771 0.9018642 -0.9992472 0.9187008 0.9205374 -0.9994058 0.9348044 0.9359687 -0.9995309 0.9478684 0.9486043 -0.9996296 0.9584115 0.9588756 -0.9997074 0.9668845 0.9671766 -0.9997689 0.9736708 0.9738544 -0.9998174 0.9790916 0.9792068 -0.9998557 0.9834122 0.9834845 -0.999886 0.9868501 0.9868953 -0.9999099 0.9895817 0.9896101 -0.9999288 0.9917499 0.9917677 -0.9999437 0.9934694 0.9934805 -0.1059991 0.1247954 0.9545467 -0.1059489 0.1245055 0.9545286 -0.1058883 0.1241413 0.9545059 -0.1058162 0.1236845 0.9544774 -0.1057322 0.1231132 0.9544418 -0.1056375 0.122401 0.9543974 -0.1055364 0.1215168 0.9543421 -0.1054384 0.1204253 0.9542739 -0.1053624 0.1190883 0.9541902 -0.1053433 0.1174673 0.9540886 -0.1054431 0.1155307 0.9539671 -0.1057683 0.1132654 0.9538247 -0.1064997 0.1106989 0.953663 -0.1079385 0.1079385 0.9534887 -0.1132674 0.1079385 0.9534887 -0.1200092 0.1079385 0.9534887 -0.1285384 0.1079385 0.9534887 -0.139329 0.1079385 0.9534887 -0.1529804 0.1079385 0.9534887 -0.1702513 0.1079385 0.9534887 -0.1921012 0.1079385 0.9534887 -0.2197441 0.1079385 0.9534887 -0.254716 0.1079385 0.9534887 -0.2989601 0.1079385 0.9534887 -0.3549345 0.1079385 0.9534887 -0.4257495 0.1079385 0.9534887 -0.5153397 0.1079385 0.9534887 -0.6286829 0.1079385 0.9534887 -0.7720768 0.1079385 0.9534887 -0.9534887 0.1079385 0.9534887 -0.9663702 0.15819 0.7938355 -0.9750962 0.2154135 0.6858549 -0.9812508 0.2782606 0.6213045 -0.9857167 0.3450957 0.5915929 -0.9890241 0.4140252 0.5885717 -0.991511 0.4830292 0.6048518 -0.9934023 0.5501456 0.6339863 -0.994853 0.6136569 0.6705951 -0.9959732 0.672232 0.710426 -0.9968425 0.7249978 0.7503332 -0.9975199 0.7715376 0.7881772 -0.9980494 0.8118303 0.8226646 -0.9984642 0.8461587 0.8531609 -0.9987897 0.8750084 0.8795055 -0.9990457 0.8989767 0.9018499 -0.9992471 0.9187004 0.9205282 -0.9994058 0.9348042 0.9359628 -0.9995309 0.9478683 0.9486006 -0.9996295 0.9584114 0.9588732 -0.9997074 0.9668844 0.9671751 -0.9997689 0.9736708 0.9738534 -0.9998174 0.9790916 0.9792062 -0.9998557 0.9834122 0.9834841 -0.999886 0.98685 0.9868951 -0.9999099 0.9895817 0.9896099 -0.9999288 0.9917499 0.9917676 -0.9999437 0.9934694 0.9934804 -0.1059991 0.1300248 0.9545467 -0.1059489 0.1297365 0.9545286 -0.1058883 0.1293745 0.9545059 -0.1058162 0.1289204 0.9544774 -0.1057322 0.1283525 0.9544418 -0.1056375 0.1276445 0.9543974 -0.1055364 0.1267655 0.9543421 -0.1054384 0.1256805 0.9542739 -0.1053624 0.1243513 0.9541902 -0.1053433 0.12274 0.9540886 -0.1054431 0.1208148 0.9539671 -0.1057683 0.1185628 0.9538247 -0.1064997 0.1160116 0.953663 -0.1079385 0.1132674 0.9534887 -0.1105818 0.1105818 0.9533177 -0.1173437 0.1105818 0.9533177 -0.1258985 0.1105818 0.9533177 -0.1367213 0.1105818 0.9533177 -0.1504136 0.1105818 0.9533177 -0.1677362 0.1105818 0.9533177 -0.1896515 0.1105818 0.9533177 -0.2173771 0.1105818 0.9533177 -0.2524537 0.1105818 0.9533177 -0.2968302 0.1105818 0.9533177 -0.3529722 0.1105818 0.9533177 -0.4239991 0.1105818 0.9533177 -0.5138574 0.1105818 0.9533177 -0.6275398 0.1105818 0.9533177 -0.7713628 0.1105818 0.9533177 -0.9533177 0.1105818 0.9533177 -0.9662809 0.160092 0.7933139 -0.9750472 0.2167545 0.685204 -0.9812231 0.2791873 0.6206566 -0.9857006 0.3457234 0.5910158 -0.9890146 0.4144423 0.5880922 -0.9915054 0.4833013 0.604473 -0.9933988 0.5503203 0.6336985 -0.9948509 0.6137675 0.6703834 -0.9959719 0.6723012 0.7102744 -0.9968418 0.7250408 0.7502272 -0.9975194 0.7715641 0.7881046 -0.9980491 0.8118466 0.8226156 -0.998464 0.8461687 0.8531283 -0.9987896 0.8750145 0.8794841 -0.9990456 0.8989805 0.901836 -0.9992471 0.9187027 0.9205192 -0.9994058 0.9348056 0.935957 -0.9995309 0.9478691 0.9485969 -0.9996295 0.958412 0.9588709 -0.9997074 0.9668847 0.9671736 -0.9997688 0.973671 0.9738525 -0.9998174 0.9790917 0.9792056 -0.9998557 0.9834123 0.9834837 -0.999886 0.9868501 0.9868949 -0.9999099 0.9895817 0.9896098 -0.9999288 0.9917499 0.9917675 -0.9999437 0.9934694 0.9934804 -0.1059991 0.1366405 0.9545467 -0.1059489 0.1363545 0.9545286 -0.1058883 0.1359951 0.9545059 -0.1058162 0.1355445 0.9544774 -0.1057322 0.1349809 0.9544418 -0.1056375 0.1342782 0.9543974 -0.1055364 0.1334058 0.9543421 -0.1054384 0.1323289 0.9542739 -0.1053624 0.1310098 0.9541902 -0.1053433 0.1294105 0.9540886 -0.1054431 0.1274998 0.9539671 -0.1057683 0.1252648 0.9538247 -0.1064997 0.1227327 0.953663 -0.1079385 0.1200092 0.9534887 -0.1105818 0.1173437 0.9533177 -0.1152388 0.1152388 0.9531823 -0.1238137 0.1152388 0.9531823 -0.134662 0.1152388 0.9531823 -0.1483866 0.1152388 0.9531823 -0.16575 0.1152388 0.9531823 -0.1877169 0.1152388 0.9531823 -0.2155079 0.1152388 0.9531823 -0.2506671 0.1152388 0.9531823 -0.2951481 0.1152388 0.9531823 -0.3514224 0.1152388 0.9531823 -0.4226166 0.1152388 0.9531823 -0.5126866 0.1152388 0.9531823 -0.6266369 0.1152388 0.9531823 -0.7707988 0.1152388 0.9531823 -0.9531823 0.1152388 0.9531823 -0.9662104 0.1635226 0.7929023 -0.9750086 0.2192389 0.6846907 -0.9812013 0.2809573 0.620146 -0.9856879 0.3469645 0.5905612 -0.9890072 0.4152991 0.5877147 -0.9915009 0.4838841 0.6041748 -0.9933961 0.5507113 0.633472 -0.9948493 0.6140266 0.6702168 -0.9959709 0.6724711 0.7101552 -0.9968411 0.7251511 0.7501439 -0.9975191 0.7716352 0.7880474 -0.9980488 0.8118921 0.822577 -0.9984638 0.8461977 0.8531027 -0.9987895 0.8750329 0.8794673 -0.9990456 0.8989921 0.901825 -0.999247 0.9187101 0.9205121 -0.9994057 0.9348102 0.9359524 -0.9995309 0.947872 0.948594 -0.9996295 0.9584138 0.958869 -0.9997074 0.9668859 0.9671724 -0.9997688 0.9736717 0.9738518 -0.9998174 0.9790921 0.9792052 -0.9998557 0.9834126 0.9834834 -0.999886 0.9868503 0.9868947 -0.9999099 0.9895819 0.9896097 -0.9999288 0.99175 0.9917674 -0.9999437 0.9934694 0.9934803 -0.1059991 0.1450104 0.9545467 -0.1059489 0.1447271 0.9545286 -0.1058883 0.1443712 0.9545059 -0.1058162 0.1439249 0.9544774 -0.1057322 0.1433666 0.9544418 -0.1056375 0.1426706 0.9543974 -0.1055364 0.1418066 0.9543421 -0.1054384 0.1407401 0.9542739 -0.1053624 0.1394336 0.9541902 -0.1053433 0.1378497 0.9540886 -0.1054431 0.1359573 0.9539671 -0.1057683 0.1337437 0.9538247 -0.1064997 0.1312358 0.953663 -0.1079385 0.1285384 0.9534887 -0.1105818 0.1258985 0.9533177 -0.1152388 0.1238137 0.9531823 -0.1231452 0.1231452 0.9531389 -0.1340017 0.1231452 0.9531389 -0.1477366 0.1231452 0.9531389 -0.1651131 0.1231452 0.9531389 -0.1870965 0.1231452 0.9531389 -0.2149085 0.1231452 0.9531389 -0.2500942 0.1231452 0.9531389 -0.2946088 0.1231452 0.9531389 -0.3509254 0.1231452 0.9531389 -0.4221733 0.1231452 0.9531389 -0.5123112 0.1231452 0.9531389 -0.6263473 0.1231452 0.9531389 -0.7706179 0.1231452 0.9531389 -0.9531389 0.1231452 0.9531389 -0.9661878 0.1694384 0.7927704 -0.9749962 0.2235962 0.6845262 -0.9811943 0.2841192 0.6199824 -0.9856839 0.3492254 0.5904156 -0.9890048 0.4168922 0.5875938 -0.9914995 0.4849907 0.6040793 -0.9933953 0.5514695 0.6333995 -0.9948487 0.6145393 0.6701635 -0.9959706 0.6728136 0.710117 -0.9968409 0.7253775 0.7501172 -0.9975189 0.7717834 0.7880291 -0.9980488 0.8119884 0.8225647 -0.9984638 0.8462598 0.8530945 -0.9987895 0.8750727 0.8794619 -0.9990455 0.8990175 0.9018215 -0.999247 0.9187262 0.9205098 -0.9994057 0.9348204 0.935951 -0.9995308 0.9478785 0.9485931 -0.9996295 0.9584178 0.9588684 -0.9997074 0.9668884 0.967172 -0.9997688 0.9736733 0.9738515 -0.9998174 0.9790931 0.979205 -0.9998557 0.9834132 0.9834833 -0.999886 0.9868507 0.9868946 -0.9999099 0.9895821 0.9896096 -0.9999288 0.9917502 0.9917674 -0.9999437 0.9934695 0.9934803 -0.1059991 0.1555993 0.9545467 -0.1059489 0.1553195 0.9545286 -0.1058883 0.1549679 0.9545059 -0.1058162 0.1545271 0.9544774 -0.1057322 0.1539757 0.9544418 -0.1056375 0.1532882 0.9543974 -0.1055364 0.1524348 0.9543421 -0.1054384 0.1513813 0.9542739 -0.1053624 0.1500908 0.9541902 -0.1053433 0.1485263 0.9540886 -0.1054431 0.1466571 0.9539671 -0.1057683 0.1444705 0.9538247 -0.1064997 0.1419934 0.953663 -0.1079385 0.139329 0.9534887 -0.1105818 0.1367213 0.9533177 -0.1152388 0.134662 0.9531823 -0.1231452 0.1340017 0.9531389 -0.1340017 0.1340017 0.9531389 -0.1477366 0.1340017 0.9531389 -0.1651131 0.1340017 0.9531389 -0.1870965 0.1340017 0.9531389 -0.2149085 0.1340017 0.9531389 -0.2500942 0.1340017 0.9531389 -0.2946088 0.1340017 0.9531389 -0.3509254 0.1340017 0.9531389 -0.4221733 0.1340017 0.9531389 -0.5123112 0.1340017 0.9531389 -0.6263473 0.1340017 0.9531389 -0.7706179 0.1340017 0.9531389 -0.9531389 0.1340017 0.9531389 -0.9661878 0.1775917 0.7927704 -0.9749962 0.2296253 0.6845262 -0.9811943 0.2885124 0.6199824 -0.9856839 0.3523802 0.5904156 -0.9890048 0.419125 0.5875938 -0.9914995 0.4865484 0.6040793 -0.9933953 0.5525411 0.6333995 -0.9948487 0.6152669 0.6701635 -0.9959706 0.6733015 0.710117 -0.9968409 0.7257011 0.7501172 -0.9975189 0.7719959 0.7880291 -0.9980488 0.8121268 0.8225647 -0.9984638 0.8463492 0.8530945 -0.9987895 0.8751301 0.8794619 -0.9990455 0.8990542 0.9018215 -0.999247 0.9187495 0.9205098 -0.9994057 0.9348352 0.935951 -0.9995308 0.9478878 0.9485931 -0.9996295 0.9584237 0.9588684 -0.9997074 0.9668922 0.967172 -0.9997688 0.9736756 0.9738515 -0.9998174 0.9790946 0.979205 -0.9998557 0.9834141 0.9834833 -0.999886 0.9868512 0.9868946 -0.9999099 0.9895825 0.9896096 -0.9999288 0.9917504 0.9917674 -0.9999437 0.9934697 0.9934803 -0.1059991 0.1689957 0.9545467 -0.1059489 0.1687203 0.9545286 -0.1058883 0.1683742 0.9545059 -0.1058162 0.1679403 0.9544774 -0.1057322 0.1673975 0.9544418 -0.1056375 0.1667209 0.9543974 -0.1055364 0.1658808 0.9543421 -0.1054384 0.1648439 0.9542739 -0.1053624 0.1635736 0.9541902 -0.1053433 0.1620336 0.9540886 -0.1054431 0.1601937 0.9539671 -0.1057683 0.1580414 0.9538247 -0.1064997 0.1556031 0.953663 -0.1079385 0.1529804 0.9534887 -0.1105818 0.1504136 0.9533177 -0.1152388 0.1483866 0.9531823 -0.1231452 0.1477366 0.9531389 -0.1340017 0.1477366 0.9531389 -0.1477366 0.1477366 0.9531389 -0.1651131 0.1477366 0.9531389 -0.1870965 0.1477366 0.9531389 -0.2149085 0.1477366 0.9531389 -0.2500942 0.1477366 0.9531389 -0.2946088 0.1477366 0.9531389 -0.3509254 0.1477366 0.9531389 -0.4221733 0.1477366 0.9531389 -0.5123112 0.1477366 0.9531389 -0.6263473 0.1477366 0.9531389 -0.7706179 0.1477366 0.9531389 -0.9531389 0.1477366 0.9531389 -0.9661878 0.1879067 0.7927704 -0.9749962 0.2372529 0.6845262 -0.9811943 0.2940703 0.6199824 -0.9856839 0.3563715 0.5904156 -0.9890048 0.4219498 0.5875938 -0.9914995 0.4885191 0.6040793 -0.9933953 0.5538969 0.6333995 -0.9948487 0.6161874 0.6701635 -0.9959706 0.6739188 0.710117 -0.9968409 0.7261105 0.7501172 -0.9975189 0.7722648 0.7880291 -0.9980488 0.8123018 0.8225647 -0.9984638 0.8464623 0.8530945 -0.9987895 0.8752028 0.8794619 -0.9990455 0.8991006 0.9018215 -0.999247 0.9187791 0.9205098 -0.9994057 0.9348539 0.935951 -0.9995308 0.9478997 0.9485931 -0.9996295 0.9584312 0.9588684 -0.9997074 0.9668969 0.967172 -0.9997688 0.9736786 0.9738515 -0.9998174 0.9790965 0.979205 -0.9998557 0.9834153 0.9834833 -0.999886 0.986852 0.9868946 -0.9999099 0.9895829 0.9896096 -0.9999288 0.9917507 0.9917674 -0.9999437 0.9934698 0.9934803 -0.1059991 0.1859439 0.9545467 -0.1059489 0.185674 0.9545286 -0.1058883 0.1853349 0.9545059 -0.1058162 0.1849097 0.9544774 -0.1057322 0.1843779 0.9544418 -0.1056375 0.1837149 0.9543974 -0.1055364 0.1828918 0.9543421 -0.1054384 0.1818757 0.9542739 -0.1053624 0.180631 0.9541902 -0.1053433 0.179122 0.9540886 -0.1054431 0.1773192 0.9539671 -0.1057683 0.1752103 0.9538247 -0.1064997 0.1728211 0.953663 -0.1079385 0.1702513 0.9534887 -0.1105818 0.1677362 0.9533177 -0.1152388 0.16575 0.9531823 -0.1231452 0.1651131 0.9531389 -0.1340017 0.1651131 0.9531389 -0.1477366 0.1651131 0.9531389 -0.1651131 0.1651131 0.9531389 -0.1870965 0.1651131 0.9531389 -0.2149085 0.1651131 0.9531389 -0.2500942 0.1651131 0.9531389 -0.2946088 0.1651131 0.9531389 -0.3509254 0.1651131 0.9531389 -0.4221733 0.1651131 0.9531389 -0.5123112 0.1651131 0.9531389 -0.6263473 0.1651131 0.9531389 -0.7706179 0.1651131 0.9531389 -0.9531389 0.1651131 0.9531389 -0.9661878 0.2009566 0.7927704 -0.9749962 0.2469027 0.6845262 -0.9811943 0.3011018 0.6199824 -0.9856839 0.3614209 0.5904156 -0.9890048 0.4255236 0.5875938 -0.9914995 0.4910123 0.6040793 -0.9933953 0.5556122 0.6333995 -0.9948487 0.6173519 0.6701635 -0.9959706 0.6746998 0.710117 -0.9968409 0.7266285 0.7501172 -0.9975189 0.7726049 0.7880291 -0.9980488 0.8125232 0.8225647 -0.9984638 0.8466054 0.8530945 -0.9987895 0.8752947 0.8794619 -0.9990455 0.8991593 0.9018215 -0.999247 0.9188164 0.9205098 -0.9994057 0.9348776 0.935951 -0.9995308 0.9479146 0.9485931 -0.9996295 0.9584406 0.9588684 -0.9997074 0.9669028 0.967172 -0.9997688 0.9736823 0.9738515 -0.9998174 0.9790988 0.979205 -0.9998557 0.9834167 0.9834833 -0.999886 0.9868529 0.9868946 -0.9999099 0.9895835 0.9896096 -0.9999288 0.991751 0.9917674 -0.9999437 0.9934701 0.9934803 -0.1059991 0.2073855 0.9545467 -0.1059489 0.2071226 0.9545286 -0.1058883 0.2067924 0.9545059 -0.1058162 0.2063783 0.9544774 -0.1057322 0.2058603 0.9544418 -0.1056375 0.2052145 0.9543974 -0.1055364 0.2044128 0.9543421 -0.1054384 0.2034232 0.9542739 -0.1053624 0.2022109 0.9541902 -0.1053433 0.2007412 0.9540886 -0.1054431 0.1989853 0.9539671 -0.1057683 0.1969312 0.9538247 -0.1064997 0.1946042 0.953663 -0.1079385 0.1921012 0.9534887 -0.1105818 0.1896515 0.9533177 -0.1152388 0.1877169 0.9531823 -0.1231452 0.1870965 0.9531389 -0.1340017 0.1870965 0.9531389 -0.1477366 0.1870965 0.9531389 -0.1651131 0.1870965 0.9531389 -0.1870965 0.1870965 0.9531389 -0.2149085 0.1870965 0.9531389 -0.2500942 0.1870965 0.9531389 -0.2946088 0.1870965 0.9531389 -0.3509254 0.1870965 0.9531389 -0.4221733 0.1870965 0.9531389 -0.5123112 0.1870965 0.9531389 -0.6263473 0.1870965 0.9531389 -0.7706179 0.1870965 0.9531389 -0.9531389 0.1870965 0.9531389 -0.9661878 0.2174663 0.7927704 -0.9749962 0.2591111 0.6845262 -0.9811943 0.3099976 0.6199824 -0.9856839 0.3678092 0.5904156 -0.9890048 0.4300448 0.5875938 -0.9914995 0.4941665 0.6040793 -0.9933953 0.5577822 0.6333995 -0.9948487 0.6188252 0.6701635 -0.9959706 0.6756878 0.710117 -0.9968409 0.7272837 0.7501172 -0.9975189 0.7730352 0.7880291 -0.9980488 0.8128033 0.8225647 -0.9984638 0.8467864 0.8530945 -0.9987895 0.8754109 0.8794619 -0.9990455 0.8992336 0.9018215 -0.999247 0.9188636 0.9205098 -0.9994057 0.9349075 0.935951 -0.9995308 0.9479335 0.9485931 -0.9996295 0.9584526 0.9588684 -0.9997074 0.9669103 0.967172 -0.9997688 0.973687 0.9738515 -0.9998174 0.9791018 0.979205 -0.9998557 0.9834186 0.9834833 -0.999886 0.9868541 0.9868946 -0.9999099 0.9895842 0.9896096 -0.9999288 0.9917515 0.9917674 -0.9999437 0.9934704 0.9934803 -0.1059991 0.2345119 0.9545467 -0.1059489 0.234258 0.9545286 -0.1058883 0.2339389 0.9545059 -0.1058162 0.2335388 0.9544774 -0.1057322 0.2330383 0.9544418 -0.1056375 0.2324144 0.9543974 -0.1055364 0.2316398 0.9543421 -0.1054384 0.2306836 0.9542739 -0.1053624 0.2295123 0.9541902 -0.1053433 0.2280923 0.9540886 -0.1054431 0.2263957 0.9539671 -0.1057683 0.224411 0.9538247 -0.1064997 0.2221626 0.953663 -0.1079385 0.2197441 0.9534887 -0.1105818 0.2173771 0.9533177 -0.1152388 0.2155079 0.9531823 -0.1231452 0.2149085 0.9531389 -0.1340017 0.2149085 0.9531389 -0.1477366 0.2149085 0.9531389 -0.1651131 0.2149085 0.9531389 -0.1870965 0.2149085 0.9531389 -0.2149085 0.2149085 0.9531389 -0.2500942 0.2149085 0.9531389 -0.2946088 0.2149085 0.9531389 -0.3509254 0.2149085 0.9531389 -0.4221733 0.2149085 0.9531389 -0.5123112 0.2149085 0.9531389 -0.6263473 0.2149085 0.9531389 -0.7706179 0.2149085 0.9531389 -0.9531389 0.2149085 0.9531389 -0.9661878 0.2383533 0.7927704 -0.9749962 0.2745562 0.6845262 -0.9811943 0.3212519 0.6199824 -0.9856839 0.3758911 0.5904156 -0.9890048 0.4357648 0.5875938 -0.9914995 0.498157 0.6040793 -0.9933953 0.5605276 0.6333995 -0.9948487 0.6206891 0.6701635 -0.9959706 0.6769378 0.710117 -0.9968409 0.7281127 0.7501172 -0.9975189 0.7735795 0.7880291 -0.9980488 0.8131577 0.8225647 -0.9984638 0.8470154 0.8530945 -0.9987895 0.875558 0.8794619 -0.9990455 0.8993275 0.9018215 -0.999247 0.9189234 0.9205098 -0.9994057 0.9349454 0.935951 -0.9995308 0.9479575 0.9485931 -0.9996295 0.9584677 0.9588684 -0.9997074 0.9669198 0.967172 -0.9997688 0.973693 0.9738515 -0.9998174 0.9791055 0.979205 -0.9998557 0.9834209 0.9834833 -0.999886 0.9868555 0.9868946 -0.9999099 0.9895851 0.9896096 -0.9999288 0.9917521 0.9917674 -0.9999437 0.9934707 0.9934803 -0.1059991 0.2688304 0.9545467 -0.1059489 0.2685877 0.9545286 -0.1058883 0.2682827 0.9545059 -0.1058162 0.2679003 0.9544774 -0.1057322 0.267422 0.9544418 -0.1056375 0.2668257 0.9543974 -0.1055364 0.2660854 0.9543421 -0.1054384 0.2651716 0.9542739 -0.1053624 0.2640521 0.9541902 -0.1053433 0.2626949 0.9540886 -0.1054431 0.2610734 0.9539671 -0.1057683 0.2591765 0.9538247 -0.1064997 0.2570275 0.953663 -0.1079385 0.254716 0.9534887 -0.1105818 0.2524537 0.9533177 -0.1152388 0.2506671 0.9531823 -0.1231452 0.2500942 0.9531389 -0.1340017 0.2500942 0.9531389 -0.1477366 0.2500942 0.9531389 -0.1651131 0.2500942 0.9531389 -0.1870965 0.2500942 0.9531389 -0.2149085 0.2500942 0.9531389 -0.2500942 0.2500942 0.9531389 -0.2946088 0.2500942 0.9531389 -0.3509254 0.2500942 0.9531389 -0.4221733 0.2500942 0.9531389 -0.5123112 0.2500942 0.9531389 -0.6263473 0.2500942 0.9531389 -0.7706179 0.2500942 0.9531389 -0.9531389 0.2500942 0.9531389 -0.9661878 0.2647781 0.7927704 -0.9749962 0.2940963 0.6845262 -0.9811943 0.3354901 0.6199824 -0.9856839 0.3861159 0.5904156 -0.9890048 0.4430013 0.5875938 -0.9914995 0.5032055 0.6040793 -0.9933953 0.5640008 0.6333995 -0.9948487 0.6230471 0.6701635 -0.9959706 0.6785192 0.710117 -0.9968409 0.7291615 0.7501172 -0.9975189 0.7742682 0.7880291 -0.9980488 0.8136061 0.8225647 -0.9984638 0.8473052 0.8530945 -0.9987895 0.8757441 0.8794619 -0.9990455 0.8994464 0.9018215 -0.999247 0.918999 0.9205098 -0.9994057 0.9349933 0.935951 -0.9995308 0.9479878 0.9485931 -0.9996295 0.9584868 0.9588684 -0.9997074 0.9669318 0.967172 -0.9997688 0.9737006 0.9738515 -0.9998174 0.9791103 0.979205 -0.9998557 0.9834239 0.9834833 -0.999886 0.9868574 0.9868946 -0.9999099 0.9895863 0.9896096 -0.9999288 0.9917528 0.9917674 -0.9999437 0.9934712 0.9934803 -0.1059991 0.3122478 0.9545467 -0.1059489 0.3120193 0.9545286 -0.1058883 0.3117322 0.9545059 -0.1058162 0.3113722 0.9544774 -0.1057322 0.3109219 0.9544418 -0.1056375 0.3103605 0.9543974 -0.1055364 0.3096636 0.9543421 -0.1054384 0.3088033 0.9542739 -0.1053624 0.3077494 0.9541902 -0.1053433 0.3064717 0.9540886 -0.1054431 0.3049452 0.9539671 -0.1057683 0.3031594 0.9538247 -0.1064997 0.3011363 0.953663 -0.1079385 0.2989601 0.9534887 -0.1105818 0.2968302 0.9533177 -0.1152388 0.2951481 0.9531823 -0.1231452 0.2946088 0.9531389 -0.1340017 0.2946088 0.9531389 -0.1477366 0.2946088 0.9531389 -0.1651131 0.2946088 0.9531389 -0.1870965 0.2946088 0.9531389 -0.2149085 0.2946088 0.9531389 -0.2500942 0.2946088 0.9531389 -0.2946088 0.2946088 0.9531389 -0.3509254 0.2946088 0.9531389 -0.4221733 0.2946088 0.9531389 -0.5123112 0.2946088 0.9531389 -0.6263473 0.2946088 0.9531389 -0.7706179 0.2946088 0.9531389 -0.9531389 0.2946088 0.9531389 -0.9661878 0.2982089 0.7927704 -0.9749962 0.3188171 0.6845262 -0.9811943 0.3535032 0.6199824 -0.9856839 0.3990515 0.5904156 -0.9890048 0.4521565 0.5875938 -0.9914995 0.5095925 0.6040793 -0.9933953 0.5683949 0.6333995 -0.9948487 0.6260304 0.6701635 -0.9959706 0.6805199 0.710117 -0.9968409 0.7304884 0.7501172 -0.9975189 0.7751395 0.7880291 -0.9980488 0.8141733 0.8225647 -0.9984638 0.8476717 0.8530945 -0.9987895 0.8759795 0.8794619 -0.9990455 0.8995968 0.9018215 -0.999247 0.9190947 0.9205098 -0.9994057 0.935054 0.935951 -0.9995308 0.9480261 0.9485931 -0.9996295 0.9585109 0.9588684 -0.9997074 0.966947 0.967172 -0.9997688 0.9737101 0.9738515 -0.9998174 0.9791163 0.979205 -0.9998557 0.9834277 0.9834833 -0.999886 0.9868597 0.9868946 -0.9999099 0.9895878 0.9896096 -0.9999288 0.9917537 0.9917674 -0.9999437 0.9934718 0.9934803 -0.1059991 0.3671764 0.9545467 -0.1059489 0.3669659 0.9545286 -0.1058883 0.3667014 0.9545059 -0.1058162 0.3663698 0.9544774 -0.1057322 0.3659549 0.9544418 -0.1056375 0.3654378 0.9543974 -0.1055364 0.3647957 0.9543421 -0.1054384 0.3640031 0.9542739 -0.1053624 0.3630322 0.9541902 -0.1053433 0.3618551 0.9540886 -0.1054431 0.3604487 0.9539671 -0.1057683 0.3588035 0.9538247 -0.1064997 0.3569395 0.953663 -0.1079385 0.3549345 0.9534887 -0.1105818 0.3529722 0.9533177 -0.1152388 0.3514224 0.9531823 -0.1231452 0.3509254 0.9531389 -0.1340017 0.3509254 0.9531389 -0.1477366 0.3509254 0.9531389 -0.1651131 0.3509254 0.9531389 -0.1870965 0.3509254 0.9531389 -0.2149085 0.3509254 0.9531389 -0.2500942 0.3509254 0.9531389 -0.2946088 0.3509254 0.9531389 -0.3509254 0.3509254 0.9531389 -0.4221733 0.3509254 0.9531389 -0.5123112 0.3509254 0.9531389 -0.6263473 0.3509254 0.9531389 -0.7706179 0.3509254 0.9531389 -0.9531389 0.3509254 0.9531389 -0.9661878 0.3405032 0.7927704 -0.9749962 0.3500921 0.6845262 -0.9811943 0.3762922 0.6199824 -0.9856839 0.4154167 0.5904156 -0.9890048 0.4637389 0.5875938 -0.9914995 0.5176729 0.6040793 -0.9933953 0.573954 0.6333995 -0.9948487 0.6298046 0.6701635 -0.9959706 0.683051 0.710117 -0.9968409 0.732167 0.7501172 -0.9975189 0.7762418 0.7880291 -0.9980488 0.8148909 0.8225647 -0.9984638 0.8481355 0.8530945 -0.9987895 0.8762773 0.8794619 -0.9990455 0.899787 0.9018215 -0.999247 0.9192157 0.9205098 -0.9994057 0.9351307 0.935951 -0.9995308 0.9480746 0.9485931 -0.9996295 0.9585415 0.9588684 -0.9997074 0.9669663 0.967172 -0.9997688 0.9737222 0.9738515 -0.9998174 0.9791238 0.979205 -0.9998557 0.9834324 0.9834833 -0.999886 0.9868627 0.9868946 -0.9999099 0.9895897 0.9896096 -0.9999288 0.9917549 0.9917674 -0.9999437 0.9934725 0.9934803 -0.1059991 0.4366682 0.9545467 -0.1059489 0.4364805 0.9545286 -0.1058883 0.4362446 0.9545059 -0.1058162 0.4359488 0.9544774 -0.1057322 0.4355789 0.9544418 -0.1056375 0.4351176 0.9543974 -0.1055364 0.434545 0.9543421 -0.1054384 0.4338381 0.9542739 -0.1053624 0.4329722 0.9541902 -0.1053433 0.4319223 0.9540886 -0.1054431 0.4306679 0.9539671 -0.1057683 0.4292005 0.9538247 -0.1064997 0.4275379 0.953663 -0.1079385 0.4257495 0.9534887 -0.1105818 0.4239991 0.9533177 -0.1152388 0.4226166 0.9531823 -0.1231452 0.4221733 0.9531389 -0.1340017 0.4221733 0.9531389 -0.1477366 0.4221733 0.9531389 -0.1651131 0.4221733 0.9531389 -0.1870965 0.4221733 0.9531389 -0.2149085 0.4221733 0.9531389 -0.2500942 0.4221733 0.9531389 -0.2946088 0.4221733 0.9531389 -0.3509254 0.4221733 0.9531389 -0.4221733 0.4221733 0.9531389 -0.5123112 0.4221733 0.9531389 -0.6263473 0.4221733 0.9531389 -0.7706179 0.4221733 0.9531389 -0.9531389 0.4221733 0.9531389 -0.9661878 0.3940109 0.7927704 -0.9749962 0.389659 0.6845262 -0.9811943 0.4051232 0.6199824 -0.9856839 0.4361208 0.5904156 -0.9890048 0.4783922 0.5875938 -0.9914995 0.5278957 0.6040793 -0.9933953 0.580987 0.6333995 -0.9948487 0.6345795 0.6701635 -0.9959706 0.6862532 0.710117 -0.9968409 0.7342907 0.7501172 -0.9975189 0.7776364 0.7880291 -0.9980488 0.8157988 0.8225647 -0.9984638 0.8487222 0.8530945 -0.9987895 0.8766541 0.8794619 -0.9990455 0.9000277 0.9018215 -0.999247 0.9193688 0.9205098 -0.9994057 0.9352277 0.935951 -0.9995308 0.9481359 0.9485931 -0.9996295 0.9585802 0.9588684 -0.9997074 0.9669906 0.967172 -0.9997688 0.9737375 0.9738515 -0.9998174 0.9791334 0.979205 -0.9998557 0.9834385 0.9834833 -0.999886 0.9868665 0.9868946 -0.9999099 0.989592 0.9896096 -0.9999288 0.9917564 0.9917674 -0.9999437 0.9934734 0.9934803 -0.1059991 0.5245844 0.9545467 -0.1059489 0.5244254 0.9545286 -0.1058883 0.5242258 0.9545059 -0.1058162 0.5239754 0.9544774 -0.1057322 0.5236622 0.9544418 -0.1056375 0.5232717 0.9543974 -0.1055364 0.5227869 0.9543421 -0.1054384 0.5221884 0.9542739 -0.1053624 0.5214553 0.9541902 -0.1053433 0.5205664 0.9540886 -0.1054431 0.5195043 0.9539671 -0.1057683 0.5182618 0.9538247 -0.1064997 0.5168541 0.953663 -0.1079385 0.5153397 0.9534887 -0.1105818 0.5138574 0.9533177 -0.1152388 0.5126866 0.9531823 -0.1231452 0.5123112 0.9531389 -0.1340017 0.5123112 0.9531389 -0.1477366 0.5123112 0.9531389 -0.1651131 0.5123112 0.9531389 -0.1870965 0.5123112 0.9531389 -0.2149085 0.5123112 0.9531389 -0.2500942 0.5123112 0.9531389 -0.2946088 0.5123112 0.9531389 -0.3509254 0.5123112 0.9531389 -0.4221733 0.5123112 0.9531389 -0.5123112 0.5123112 0.9531389 -0.6263473 0.5123112 0.9531389 -0.7706179 0.5123112 0.9531389 -0.9531389 0.5123112 0.9531389 -0.9661878 0.4617052 0.7927704 -0.9749962 0.4397163 0.6845262 -0.9811943 0.4415982 0.6199824 -0.9856839 0.4623142 0.5904156 -0.9890048 0.4969305 0.5875938 -0.9914995 0.5408288 0.6040793 -0.9933953 0.5898847 0.6333995 -0.9948487 0.6406203 0.6701635 -0.9959706 0.6903044 0.710117 -0.9968409 0.7369774 0.7501172 -0.9975189 0.7794007 0.7880291 -0.9980488 0.8169474 0.8225647 -0.9984638 0.8494644 0.8530945 -0.9987895 0.8771307 0.8794619 -0.9990455 0.9003323 0.9018215 -0.999247 0.9195625 0.9205098 -0.9994057 0.9353505 0.935951 -0.9995308 0.9482135 0.9485931 -0.9996295 0.9586291 0.9588684 -0.9997074 0.9670214 0.967172 -0.9997688 0.9737569 0.9738515 -0.9998174 0.9791456 0.979205 -0.9998557 0.9834461 0.9834833 -0.999886 0.9868713 0.9868946 -0.9999099 0.989595 0.9896096 -0.9999288 0.9917582 0.9917674 -0.9999437 0.9934746 0.9934803 -0.1059991 0.6358098 0.9545467 -0.1059489 0.6356873 0.9545286 -0.1058883 0.6355334 0.9545059 -0.1058162 0.6353404 0.9544774 -0.1057322 0.635099 0.9544418 -0.1056375 0.634798 0.9543974 -0.1055364 0.6344244 0.9543421 -0.1054384 0.6339631 0.9542739 -0.1053624 0.6333979 0.9541902 -0.1053433 0.6327127 0.9540886 -0.1054431 0.6318939 0.9539671 -0.1057683 0.630936 0.9538247 -0.1064997 0.6298506 0.953663 -0.1079385 0.6286829 0.9534887 -0.1105818 0.6275398 0.9533177 -0.1152388 0.6266369 0.9531823 -0.1231452 0.6263473 0.9531389 -0.1340017 0.6263473 0.9531389 -0.1477366 0.6263473 0.9531389 -0.1651131 0.6263473 0.9531389 -0.1870965 0.6263473 0.9531389 -0.2149085 0.6263473 0.9531389 -0.2500942 0.6263473 0.9531389 -0.2946088 0.6263473 0.9531389 -0.3509254 0.6263473 0.9531389 -0.4221733 0.6263473 0.9531389 -0.5123112 0.6263473 0.9531389 -0.6263473 0.6263473 0.9531389 -0.7706179 0.6263473 0.9531389 -0.9531389 0.6263473 0.9531389 -0.9661878 0.5473473 0.7927704 -0.9749962 0.5030453 0.6845262 -0.9811943 0.4877437 0.6199824 -0.9856839 0.4954523 0.5904156 -0.9890048 0.5203839 0.5875938 -0.9914995 0.5571908 0.6040793 -0.9933953 0.6011414 0.6333995 -0.9948487 0.6482627 0.6701635 -0.9959706 0.6954296 0.710117 -0.9968409 0.7403765 0.7501172 -0.9975189 0.7816327 0.7880291 -0.9980488 0.8184005 0.8225647 -0.9984638 0.8504035 0.8530945 -0.9987895 0.8777338 0.8794619 -0.9990455 0.9007175 0.9018215 -0.999247 0.9198076 0.9205098 -0.9994057 0.9355059 0.935951 -0.9995308 0.9483117 0.9485931 -0.9996295 0.958691 0.9588684 -0.9997074 0.9670604 0.967172 -0.9997688 0.9737814 0.9738515 -0.9998174 0.979161 0.979205 -0.9998557 0.9834557 0.9834833 -0.999886 0.9868773 0.9868946 -0.9999099 0.9895988 0.9896096 -0.9999288 0.9917606 0.9917674 -0.9999437 0.9934761 0.9934803 -0.1059991 0.7765244 0.9545467 -0.1059489 0.776448 0.9545286 -0.1058883 0.776352 0.9545059 -0.1058162 0.7762317 0.9544774 -0.1057322 0.7760811 0.9544418 -0.1056375 0.7758934 0.9543974 -0.1055364 0.7756603 0.9543421 -0.1054384 0.7753725 0.9542739 -0.1053624 0.7750199 0.9541902 -0.1053433 0.7745924 0.9540886 -0.1054431 0.7740814 0.9539671 -0.1057683 0.7734835 0.9538247 -0.1064997 0.7728059 0.953663 -0.1079385 0.7720768 0.9534887 -0.1105818 0.7713628 0.9533177 -0.1152388 0.7707988 0.9531823 -0.1231452 0.7706179 0.9531389 -0.1340017 0.7706179 0.9531389 -0.1477366 0.7706179 0.9531389 -0.1651131 0.7706179 0.9531389 -0.1870965 0.7706179 0.9531389 -0.2149085 0.7706179 0.9531389 -0.2500942 0.7706179 0.9531389 -0.2946088 0.7706179 0.9531389 -0.3509254 0.7706179 0.9531389 -0.4221733 0.7706179 0.9531389 -0.5123112 0.7706179 0.9531389 -0.6263473 0.7706179 0.9531389 -0.7706179 0.7706179 0.9531389 -0.9531389 0.7706179 0.9531389 -0.9661878 0.6556956 0.7927704 -0.9749962 0.5831647 0.6845262 -0.9811943 0.5461239 0.6199824 -0.9856839 0.5373763 0.5904156 -0.9890048 0.5500554 0.5875938 -0.9914995 0.577891 0.6040793 -0.9933953 0.6153825 0.6333995 -0.9948487 0.6579314 0.6701635 -0.9959706 0.7019138 0.710117 -0.9968409 0.7446768 0.7501172 -0.9975189 0.7844566 0.7880291 -0.9980488 0.8202389 0.8225647 -0.9984638 0.8515915 0.8530945 -0.9987895 0.8784967 0.8794619 -0.9990455 0.9012049 0.9018215 -0.999247 0.9201176 0.9205098 -0.9994057 0.9357024 0.935951 -0.9995308 0.9484359 0.9485931 -0.9996295 0.9587693 0.9588684 -0.9997074 0.9671097 0.967172 -0.9997688 0.9738123 0.9738515 -0.9998174 0.9791804 0.979205 -0.9998557 0.9834679 0.9834833 -0.999886 0.986885 0.9868946 -0.9999099 0.9896036 0.9896096 -0.9999288 0.9917636 0.9917674 -0.9999437 0.9934779 0.9934803 -0.1059991 0.9545467 0.9545467 -0.1059489 0.9545286 0.9545286 -0.1058883 0.9545059 0.9545059 -0.1058162 0.9544774 0.9544774 -0.1057322 0.9544418 0.9544418 -0.1056375 0.9543974 0.9543974 -0.1055364 0.9543421 0.9543421 -0.1054384 0.9542739 0.9542739 -0.1053624 0.9541902 0.9541902 -0.1053433 0.9540886 0.9540886 -0.1054431 0.9539671 0.9539671 -0.1057683 0.9538247 0.9538247 -0.1064997 0.953663 0.953663 -0.1079385 0.9534887 0.9534887 -0.1105818 0.9533177 0.9533177 -0.1152388 0.9531823 0.9531823 -0.1231452 0.9531389 0.9531389 -0.1340017 0.9531389 0.9531389 -0.1477366 0.9531389 0.9531389 -0.1651131 0.9531389 0.9531389 -0.1870965 0.9531389 0.9531389 -0.2149085 0.9531389 0.9531389 -0.2500942 0.9531389 0.9531389 -0.2946088 0.9531389 0.9531389 -0.3509254 0.9531389 0.9531389 -0.4221733 0.9531389 0.9531389 -0.5123112 0.9531389 0.9531389 -0.6263473 0.9531389 0.9531389 -0.7706179 0.9531389 0.9531389 -0.9531389 0.9531389 0.9531389 -0.9661878 0.7927704 0.7927704 -0.9749962 0.6845262 0.6845262 -0.9811943 0.6199824 0.6199824 -0.9856839 0.5904156 0.5904156 -0.9890048 0.5875938 0.5875938 -0.9914995 0.6040793 0.6040793 -0.9933953 0.6333995 0.6333995 -0.9948487 0.6701635 0.6701635 -0.9959706 0.710117 0.710117 -0.9968409 0.7501172 0.7501172 -0.9975189 0.7880291 0.7880291 -0.9980488 0.8225647 0.8225647 -0.9984638 0.8530945 0.8530945 -0.9987895 0.8794619 0.8794619 -0.9990455 0.9018215 0.9018215 -0.999247 0.9205098 0.9205098 -0.9994057 0.935951 0.935951 -0.9995308 0.9485931 0.9485931 -0.9996295 0.9588684 0.9588684 -0.9997074 0.967172 0.967172 -0.9997688 0.9738515 0.9738515 -0.9998174 0.979205 0.979205 -0.9998557 0.9834833 0.9834833 -0.999886 0.9868946 0.9868946 -0.9999099 0.9896096 0.9896096 -0.9999288 0.9917674 0.9917674 -0.9999437 0.9934803 0.9934803 -0.1572498 0.9669269 0.7970984 -0.1572031 0.9669173 0.7970422 -0.1571463 0.9669053 0.7969715 -0.1570779 0.9668902 0.7968829 -0.1569971 0.9668714 0.7967721 -0.156904 0.9668479 0.796634 -0.1568008 0.9668187 0.7964626 -0.1566936 0.9667827 0.7962511 -0.1565954 0.9667385 0.795992 -0.1565315 0.966685 0.7956781 -0.1565473 0.9666211 0.7953033 -0.1567226 0.9665463 0.794865 -0.1571937 0.9664615 0.7943688 -0.15819 0.9663702 0.7938355 -0.160092 0.9662809 0.7933139 -0.1635226 0.9662104 0.7929023 -0.1694384 0.9661878 0.7927704 -0.1775917 0.9661878 0.7927704 -0.1879067 0.9661878 0.7927704 -0.2009566 0.9661878 0.7927704 -0.2174663 0.9661878 0.7927704 -0.2383533 0.9661878 0.7927704 -0.2647781 0.9661878 0.7927704 -0.2982089 0.9661878 0.7927704 -0.3405032 0.9661878 0.7927704 -0.3940109 0.9661878 0.7927704 -0.4617052 0.9661878 0.7927704 -0.5473473 0.9661878 0.7927704 -0.6556956 0.9661878 0.7927704 -0.7927704 0.9661878 0.7927704 -0.9661878 0.9661878 0.7927704 -0.9749962 0.8127617 0.6845262 -0.9811943 0.713423 0.6199824 -0.9856839 0.6575172 0.5904156 -0.9890048 0.6350848 0.5875938 -0.9914995 0.637211 0.6040793 -0.9933953 0.6561933 0.6333995 -0.9948487 0.6856388 0.6701635 -0.9959706 0.7204952 0.710117 -0.9968409 0.757 0.7501172 -0.9975189 0.7925488 0.7880291 -0.9980488 0.8255071 0.8225647 -0.9984638 0.8549959 0.8530945 -0.9987895 0.880683 0.8794619 -0.9990455 0.9026016 0.9018215 -0.999247 0.9210061 0.9205098 -0.9994057 0.9362655 0.935951 -0.9995308 0.9487918 0.9485931 -0.9996295 0.9589938 0.9588684 -0.9997074 0.9672509 0.967172 -0.9997688 0.9739011 0.9738515 -0.9998174 0.9792361 0.979205 -0.9998557 0.9835029 0.9834833 -0.999886 0.9869069 0.9868946 -0.9999099 0.9896173 0.9896096 -0.9999288 0.9917722 0.9917674 -0.9999437 0.9934833 0.9934803 -0.2151269 0.9754027 0.6899401 -0.2150852 0.9753975 0.6898695 -0.2150342 0.9753908 0.6897808 -0.2149725 0.9753825 0.6896696 -0.2148987 0.9753721 0.6895306 -0.2148124 0.9753591 0.6893573 -0.2147144 0.975343 0.6891423 -0.2146085 0.9753231 0.6888771 -0.2145034 0.9752987 0.6885524 -0.2144168 0.9752692 0.6881591 -0.2143816 0.975234 0.6876897 -0.2144566 0.9751928 0.6871414 -0.2147432 0.9751462 0.6865211 -0.2154135 0.9750962 0.6858549 -0.2167545 0.9750472 0.685204 -0.2192389 0.9750086 0.6846907 -0.2235962 0.9749962 0.6845262 -0.2296253 0.9749962 0.6845262 -0.2372529 0.9749962 0.6845262 -0.2469027 0.9749962 0.6845262 -0.2591111 0.9749962 0.6845262 -0.2745562 0.9749962 0.6845262 -0.2940963 0.9749962 0.6845262 -0.3188171 0.9749962 0.6845262 -0.3500921 0.9749962 0.6845262 -0.389659 0.9749962 0.6845262 -0.4397163 0.9749962 0.6845262 -0.5030453 0.9749962 0.6845262 -0.5831647 0.9749962 0.6845262 -0.6845262 0.9749962 0.6845262 -0.8127617 0.9749962 0.6845262 -0.9749962 0.9749962 0.6845262 -0.9811943 0.8316375 0.6199824 -0.9856839 0.7424095 0.5904156 -0.9890048 0.695167 0.5875938 -0.9914995 0.6791269 0.6040793 -0.9933953 0.6850303 0.6333995 -0.9948487 0.7052169 0.6701635 -0.9959706 0.733625 0.710117 -0.9968409 0.7657077 0.7501172 -0.9975189 0.7982669 0.7880291 -0.9980488 0.8292297 0.8225647 -0.9984638 0.8574015 0.8530945 -0.9987895 0.8822279 0.8794619 -0.9990455 0.9035886 0.9018215 -0.999247 0.9216339 0.9205098 -0.9994057 0.9366635 0.935951 -0.9995308 0.9490434 0.9485931 -0.9996295 0.9591524 0.9588684 -0.9997074 0.9673508 0.967172 -0.9997688 0.9739638 0.9738515 -0.9998174 0.9792755 0.979205 -0.9998557 0.9835276 0.9834833 -0.999886 0.9869223 0.9868946 -0.9999099 0.989627 0.9896096 -0.9999288 0.9917782 0.9917674 -0.9999437 0.9934871 0.9934803 -0.2783684 0.9814251 0.6253806 -0.2783325 0.9814221 0.62531 -0.2782884 0.9814183 0.6252213 -0.2782347 0.9814136 0.6251102 -0.2781701 0.9814076 0.6249712 -0.2780936 0.9814002 0.6247981 -0.2780055 0.9813911 0.6245833 -0.2779077 0.9813797 0.6243183 -0.2778058 0.9813659 0.6239941 -0.2777122 0.9813491 0.6236015 -0.2776503 0.9813291 0.6231332 -0.2776626 0.9813057 0.6225864 -0.2778236 0.9812792 0.6219681 -0.2782606 0.9812508 0.6213045 -0.2791873 0.9812231 0.6206566 -0.2809573 0.9812013 0.620146 -0.2841192 0.9811943 0.6199824 -0.2885124 0.9811943 0.6199824 -0.2940703 0.9811943 0.6199824 -0.3011018 0.9811943 0.6199824 -0.3099976 0.9811943 0.6199824 -0.3212519 0.9811943 0.6199824 -0.3354901 0.9811943 0.6199824 -0.3535032 0.9811943 0.6199824 -0.3762922 0.9811943 0.6199824 -0.4051232 0.9811943 0.6199824 -0.4415982 0.9811943 0.6199824 -0.4877437 0.9811943 0.6199824 -0.5461239 0.9811943 0.6199824 -0.6199824 0.9811943 0.6199824 -0.713423 0.9811943 0.6199824 -0.8316375 0.9811943 0.6199824 -0.9811943 0.9811943 0.6199824 -0.9856839 0.8498092 0.5904156 -0.9890048 0.7711789 0.5875938 -0.9914995 0.7321559 0.6040793 -0.9933953 0.721513 0.6333995 -0.9948487 0.7299859 0.6701635 -0.9959706 0.7502359 0.710117 -0.9968409 0.776724 0.7501172 -0.9975189 0.8055009 0.7880291 -0.9980488 0.8339392 0.8225647 -0.9984638 0.8604449 0.8530945 -0.9987895 0.8841823 0.8794619 -0.9990455 0.9048372 0.9018215 -0.999247 0.9224281 0.9205098 -0.9994057 0.9371669 0.935951 -0.9995308 0.9493615 0.9485931 -0.9996295 0.959353 0.9588684 -0.9997074 0.967477 0.967172 -0.9997688 0.9740432 0.9738515 -0.9998174 0.9793253 0.979205 -0.9998557 0.9835588 0.9834833 -0.999886 0.9869419 0.9868946 -0.9999099 0.9896392 0.9896096 -0.9999288 0.9917859 0.9917674 -0.9999437 0.9934919 0.9934803 -0.3454107 0.9858181 0.5952302 -0.3453807 0.9858163 0.5951671 -0.3453439 0.9858141 0.5950879 -0.3452987 0.9858113 0.5949885 -0.3452442 0.9858079 0.5948644 -0.3451791 0.9858036 0.5947097 -0.3451032 0.9857982 0.5945178 -0.3450175 0.9857916 0.5942812 -0.3449254 0.9857835 0.5939917 -0.3448353 0.9857738 0.5936412 -0.3447636 0.9857621 0.5932233 -0.3447407 0.9857485 0.5927355 -0.3448204 0.9857332 0.5921842 -0.3450957 0.9857167 0.5915929 -0.3457234 0.9857006 0.5910158 -0.3469645 0.9856879 0.5905612 -0.3492254 0.9856839 0.5904156 -0.3523802 0.9856839 0.5904156 -0.3563715 0.9856839 0.5904156 -0.3614209 0.9856839 0.5904156 -0.3678092 0.9856839 0.5904156 -0.3758911 0.9856839 0.5904156 -0.3861159 0.9856839 0.5904156 -0.3990515 0.9856839 0.5904156 -0.4154167 0.9856839 0.5904156 -0.4361208 0.9856839 0.5904156 -0.4623142 0.9856839 0.5904156 -0.4954523 0.9856839 0.5904156 -0.5373763 0.9856839 0.5904156 -0.5904156 0.9856839 0.5904156 -0.6575172 0.9856839 0.5904156 -0.7424095 0.9856839 0.5904156 -0.8498092 0.9856839 0.5904156 -0.9856839 0.9856839 0.5904156 -0.9890048 0.8673437 0.5875938 -0.9914995 0.7992446 0.6040793 -0.9933953 0.7676683 0.6333995 -0.9948487 0.7613218 0.6701635 -0.9959706 0.7712508 0.710117 -0.9968409 0.7906611 0.7501172 -0.9975189 0.8146529 0.7880291 -0.9980488 0.8398974 0.8225647 -0.9984638 0.8642952 0.8530945 -0.9987895 0.886655 0.8794619 -0.9990455 0.9064168 0.9018215 -0.999247 0.9234329 0.9205098 -0.9994057 0.9378038 0.935951 -0.9995308 0.9497641 0.9485931 -0.9996295 0.9596068 0.9588684 -0.9997074 0.9676368 0.967172 -0.9997688 0.9741436 0.9738515 -0.9998174 0.9793883 0.979205 -0.9998557 0.9835983 0.9834833 -0.999886 0.9869667 0.9868946 -0.9999099 0.9896547 0.9896096 -0.9999288 0.9917956 0.9917674 -0.9999437 0.993498 0.9934803 -0.4144197 0.9890841 0.591598 -0.4143955 0.9890831 0.5915454 -0.4143657 0.9890818 0.5914794 -0.414329 0.9890801 0.5913967 -0.4142845 0.9890781 0.5912932 -0.4142311 0.9890755 0.5911644 -0.4141683 0.9890723 0.5910046 -0.4140964 0.9890684 0.5908076 -0.4140176 0.9890637 0.5905666 -0.4139373 0.9890579 0.5902749 -0.4138668 0.989051 0.5899272 -0.4138277 0.989043 0.5895215 -0.4138582 0.9890339 0.5890631 -0.4140252 0.9890241 0.5885717 -0.4144423 0.9890146 0.5880922 -0.4152991 0.9890072 0.5877147 -0.4168922 0.9890048 0.5875938 -0.419125 0.9890048 0.5875938 -0.4219498 0.9890048 0.5875938 -0.4255236 0.9890048 0.5875938 -0.4300448 0.9890048 0.5875938 -0.4357648 0.9890048 0.5875938 -0.4430013 0.9890048 0.5875938 -0.4521565 0.9890048 0.5875938 -0.4637389 0.9890048 0.5875938 -0.4783922 0.9890048 0.5875938 -0.4969305 0.9890048 0.5875938 -0.5203839 0.9890048 0.5875938 -0.5500554 0.9890048 0.5875938 -0.5875938 0.9890048 0.5875938 -0.6350848 0.9890048 0.5875938 -0.695167 0.9890048 0.5875938 -0.7711789 0.9890048 0.5875938 -0.8673437 0.9890048 0.5875938 -0.9890048 0.9890048 0.5875938 -0.9914995 0.8841204 0.6040793 -0.9933953 0.8260608 0.6333995 -0.9948487 0.8009659 0.6701635 -0.9959706 0.7978374 0.710117 -0.9968409 0.8082934 0.7501172 -0.9975189 0.8262314 0.7880291 -0.9980488 0.8474353 0.8225647 -0.9984638 0.8691663 0.8530945 -0.9987895 0.8897832 0.8794619 -0.9990455 0.9084153 0.9018215 -0.999247 0.9247041 0.9205098 -0.9994057 0.9386096 0.935951 -0.9995308 0.9502734 0.9485931 -0.9996295 0.959928 0.9588684 -0.9997074 0.9678389 0.967172 -0.9997688 0.9742706 0.9738515 -0.9998174 0.9794681 0.979205 -0.9998557 0.9836483 0.9834833 -0.999886 0.986998 0.9868946 -0.9999099 0.9896744 0.9896096 -0.9999288 0.9918079 0.9917674 -0.9999437 0.9935057 0.9934803 -0.4834235 0.9915469 0.6072459 -0.4834045 0.9915463 0.6072043 -0.4833811 0.9915455 0.607152 -0.4833522 0.9915446 0.6070865 -0.4833171 0.9915433 0.6070046 -0.4832747 0.9915418 0.6069026 -0.4832246 0.9915399 0.6067761 -0.4831666 0.9915376 0.6066202 -0.4831021 0.9915347 0.6064294 -0.4830346 0.9915312 0.6061987 -0.4829718 0.9915271 0.6059236 -0.4829286 0.9915223 0.6056027 -0.4829319 0.9915169 0.6052403 -0.4830292 0.991511 0.6048518 -0.4833013 0.9915054 0.604473 -0.4838841 0.9915009 0.6041748 -0.4849907 0.9914995 0.6040793 -0.4865484 0.9914995 0.6040793 -0.4885191 0.9914995 0.6040793 -0.4910123 0.9914995 0.6040793 -0.4941665 0.9914995 0.6040793 -0.498157 0.9914995 0.6040793 -0.5032055 0.9914995 0.6040793 -0.5095925 0.9914995 0.6040793 -0.5176729 0.9914995 0.6040793 -0.5278957 0.9914995 0.6040793 -0.5408288 0.9914995 0.6040793 -0.5571908 0.9914995 0.6040793 -0.577891 0.9914995 0.6040793 -0.6040793 0.9914995 0.6040793 -0.637211 0.9914995 0.6040793 -0.6791269 0.9914995 0.6040793 -0.7321559 0.9914995 0.6040793 -0.7992446 0.9914995 0.6040793 -0.8841204 0.9914995 0.6040793 -0.9914995 0.9914995 0.6040793 -0.9933953 0.8999349 0.6333995 -0.9948487 0.8511207 0.6701635 -0.9959706 0.8314729 0.710117 -0.9968409 0.8306004 0.7501172 -0.9975189 0.8408797 0.7880291 -0.9980488 0.8569716 0.8225647 -0.9984638 0.875329 0.8530945 -0.9987895 0.8937407 0.8794619 -0.9990455 0.9109436 0.9018215 -0.999247 0.9263124 0.9205098 -0.9994057 0.939629 0.935951 -0.9995308 0.9509177 0.9485931 -0.9996295 0.9603343 0.9588684 -0.9997074 0.9680946 0.967172 -0.9997688 0.9744313 0.9738515 -0.9998174 0.9795689 0.979205 -0.9998557 0.9837116 0.9834833 -0.999886 0.9870376 0.9868946 -0.9999099 0.9896992 0.9896096 -0.9999288 0.9918234 0.9917674 -0.9999437 0.9935154 0.9934803 -0.5504963 0.993424 0.635807 -0.5504818 0.9934236 0.6357753 -0.550464 0.9934231 0.6357355 -0.5504419 0.9934225 0.6356857 -0.550415 0.9934218 0.6356233 -0.5503825 0.9934209 0.6355457 -0.5503438 0.9934197 0.6354495 -0.5502987 0.9934183 0.6353308 -0.550248 0.9934166 0.6351857 -0.5501939 0.9934145 0.6350102 -0.5501416 0.993412 0.634801 -0.5501012 0.9934091 0.634557 -0.5500915 0.9934058 0.6342815 -0.5501456 0.9934023 0.6339863 -0.5503203 0.9933988 0.6336985 -0.5507113 0.9933961 0.633472 -0.5514695 0.9933953 0.6333995 -0.5525411 0.9933953 0.6333995 -0.5538969 0.9933953 0.6333995 -0.5556122 0.9933953 0.6333995 -0.5577822 0.9933953 0.6333995 -0.5605276 0.9933953 0.6333995 -0.5640008 0.9933953 0.6333995 -0.5683949 0.9933953 0.6333995 -0.573954 0.9933953 0.6333995 -0.580987 0.9933953 0.6333995 -0.5898847 0.9933953 0.6333995 -0.6011414 0.9933953 0.6333995 -0.6153825 0.9933953 0.6333995 -0.6333995 0.9933953 0.6333995 -0.6561933 0.9933953 0.6333995 -0.6850303 0.9933953 0.6333995 -0.721513 0.9933953 0.6333995 -0.7676683 0.9933953 0.6333995 -0.8260608 0.9933953 0.6333995 -0.8999349 0.9933953 0.6333995 -0.9933953 0.9933953 0.6333995 -0.9948487 0.9145732 0.6701635 -0.9959706 0.8740262 0.710117 -0.9968409 0.8588218 0.7501172 -0.9975189 0.8594117 0.7880291 -0.9980488 0.8690364 0.8225647 -0.9984638 0.8831255 0.8530945 -0.9987895 0.8987476 0.8794619 -0.9990455 0.9141422 0.9018215 -0.999247 0.928347 0.9205098 -0.9994057 0.9409186 0.935951 -0.9995308 0.9517328 0.9485931 -0.9996295 0.9608482 0.9588684 -0.9997074 0.9684181 0.967172 -0.9997688 0.9746346 0.9738515 -0.9998174 0.9796966 0.979205 -0.9998557 0.9837916 0.9834833 -0.999886 0.9870878 0.9868946 -0.9999099 0.9897306 0.9896096 -0.9999288 0.9918431 0.9917674 -0.9999437 0.9935277 0.9934803 -0.6139459 0.9948662 0.6719355 -0.6139352 0.994866 0.6719122 -0.6139219 0.9948657 0.6718829 -0.6139056 0.9948653 0.6718462 -0.6138855 0.9948649 0.6718002 -0.6138613 0.9948643 0.6717431 -0.6138323 0.9948636 0.6716722 -0.6137984 0.9948628 0.6715848 -0.6137599 0.9948617 0.6714779 -0.6137183 0.9948604 0.6713487 -0.6136769 0.9948589 0.6711946 -0.6136427 0.9948571 0.671015 -0.6136284 0.9948551 0.6708123 -0.6136569 0.994853 0.6705951 -0.6137675 0.9948509 0.6703834 -0.6140266 0.9948493 0.6702168 -0.6145393 0.9948487 0.6701635 -0.6152669 0.9948487 0.6701635 -0.6161874 0.9948487 0.6701635 -0.6173519 0.9948487 0.6701635 -0.6188252 0.9948487 0.6701635 -0.6206891 0.9948487 0.6701635 -0.6230471 0.9948487 0.6701635 -0.6260304 0.9948487 0.6701635 -0.6298046 0.9948487 0.6701635 -0.6345795 0.9948487 0.6701635 -0.6406203 0.9948487 0.6701635 -0.6482627 0.9948487 0.6701635 -0.6579314 0.9948487 0.6701635 -0.6701635 0.9948487 0.6701635 -0.6856388 0.9948487 0.6701635 -0.7052169 0.9948487 0.6701635 -0.7299859 0.9948487 0.6701635 -0.7613218 0.9948487 0.6701635 -0.8009659 0.9948487 0.6701635 -0.8511207 0.9948487 0.6701635 -0.9145732 0.9948487 0.6701635 -0.9948487 0.9948487 0.6701635 -0.9959706 0.9278617 0.710117 -0.9968409 0.8945255 0.7501172 -0.9975189 0.8828571 0.7880291 -0.9980488 0.8842998 0.8225647 -0.9984638 0.892989 0.8530945 -0.9987895 0.9050819 0.8794619 -0.9990455 0.9181889 0.9018215 -0.999247 0.9309211 0.9205098 -0.9994057 0.9425502 0.935951 -0.9995308 0.952764 0.9485931 -0.9996295 0.9614985 0.9588684 -0.9997074 0.9688274 0.967172 -0.9997688 0.9748918 0.9738515 -0.9998174 0.979858 0.979205 -0.9998557 0.9838928 0.9834833 -0.999886 0.9871512 0.9868946 -0.9999099 0.9897703 0.9896096 -0.9999288 0.991868 0.9917674 -0.9999437 0.9935432 0.9934803 -0.6724572 0.9959813 0.7113861 -0.6724495 0.9959811 0.7113694 -0.6724399 0.9959809 0.7113484 -0.672428 0.9959807 0.7113221 -0.6724135 0.9959804 0.7112892 -0.6723959 0.9959801 0.7112482 -0.6723748 0.9959797 0.7111974 -0.67235 0.9959791 0.7111348 -0.6723217 0.9959785 0.7110582 -0.6722907 0.9959777 0.7109656 -0.6722594 0.9959768 0.7108553 -0.6722322 0.9959757 0.7107266 -0.672218 0.9959745 0.7105815 -0.672232 0.9959732 0.710426 -0.6723012 0.9959719 0.7102744 -0.6724711 0.9959709 0.7101552 -0.6728136 0.9959706 0.710117 -0.6733015 0.9959706 0.710117 -0.6739188 0.9959706 0.710117 -0.6746998 0.9959706 0.710117 -0.6756878 0.9959706 0.710117 -0.6769378 0.9959706 0.710117 -0.6785192 0.9959706 0.710117 -0.6805199 0.9959706 0.710117 -0.683051 0.9959706 0.710117 -0.6862532 0.9959706 0.710117 -0.6903044 0.9959706 0.710117 -0.6954296 0.9959706 0.710117 -0.7019138 0.9959706 0.710117 -0.710117 0.9959706 0.710117 -0.7204952 0.9959706 0.710117 -0.733625 0.9959706 0.710117 -0.7502359 0.9959706 0.710117 -0.7712508 0.9959706 0.710117 -0.7978374 0.9959706 0.710117 -0.8314729 0.9959706 0.710117 -0.8740262 0.9959706 0.710117 -0.9278617 0.9959706 0.710117 -0.9959706 0.9959706 0.710117 -0.9968409 0.9396953 0.7501172 -0.9975189 0.9125186 0.7880291 -0.9980488 0.9036101 0.8225647 -0.9984638 0.9054678 0.8530945 -0.9987895 0.9130957 0.8794619 -0.9990455 0.9233085 0.9018215 -0.999247 0.9341777 0.9205098 -0.9994057 0.9446144 0.935951 -0.9995308 0.9540687 0.9485931 -0.9996295 0.9623212 0.9588684 -0.9997074 0.9693452 0.967172 -0.9997688 0.9752172 0.9738515 -0.9998174 0.9800622 0.979205 -0.9998557 0.9840209 0.9834833 -0.999886 0.9872315 0.9868946 -0.9999099 0.9898206 0.9896096 -0.9999288 0.9918994 0.9917674 -0.9999437 0.9935629 0.9934803 -0.7251659 0.9968475 0.7510052 -0.7251605 0.9968474 0.7509934 -0.7251537 0.9968473 0.7509787 -0.7251454 0.9968472 0.7509603 -0.7251351 0.996847 0.7509373 -0.7251226 0.9968468 0.7509086 -0.7251076 0.9968465 0.750873 -0.7250899 0.9968462 0.7508292 -0.7250697 0.9968458 0.7507756 -0.7250473 0.9968453 0.7507108 -0.7250244 0.9968448 0.7506336 -0.7250039 0.9968441 0.7505436 -0.7249916 0.9968433 0.750442 -0.7249978 0.9968425 0.7503332 -0.7250408 0.9968418 0.7502272 -0.7251511 0.9968411 0.7501439 -0.7253775 0.9968409 0.7501172 -0.7257011 0.9968409 0.7501172 -0.7261105 0.9968409 0.7501172 -0.7266285 0.9968409 0.7501172 -0.7272837 0.9968409 0.7501172 -0.7281127 0.9968409 0.7501172 -0.7291615 0.9968409 0.7501172 -0.7304884 0.9968409 0.7501172 -0.732167 0.9968409 0.7501172 -0.7342907 0.9968409 0.7501172 -0.7369774 0.9968409 0.7501172 -0.7403765 0.9968409 0.7501172 -0.7446768 0.9968409 0.7501172 -0.7501172 0.9968409 0.7501172 -0.757 0.9968409 0.7501172 -0.7657077 0.9968409 0.7501172 -0.776724 0.9968409 0.7501172 -0.7906611 0.9968409 0.7501172 -0.8082934 0.9968409 0.7501172 -0.8306004 0.9968409 0.7501172 -0.8588218 0.9968409 0.7501172 -0.8945255 0.9968409 0.7501172 -0.9396953 0.9968409 0.7501172 -0.9968409 0.9968409 0.7501172 -0.9975189 0.9500442 0.7880291 -0.9980488 0.9280401 0.8225647 -0.9984638 0.921255 0.8530945 -0.9987895 0.9232341 0.8794619 -0.9990455 0.9297854 0.9018215 -0.999247 0.9382977 0.9205098 -0.9994057 0.9472259 0.935951 -0.9995308 0.9557192 0.9485931 -0.9996295 0.963362 0.9588684 -0.9997074 0.9700002 0.967172 -0.9997688 0.9756289 0.9738515 -0.9998174 0.9803206 0.979205 -0.9998557 0.9841829 0.9834833 -0.999886 0.987333 0.9868946 -0.9999099 0.9898842 0.9896096 -0.9999288 0.9919392 0.9917674 -0.9999437 0.9935878 0.9934803 -0.7716588 0.997523 0.7886382 -0.7716551 0.997523 0.7886302 -0.7716504 0.9975229 0.7886201 -0.7716446 0.9975228 0.7886074 -0.7716375 0.9975227 0.7885916 -0.7716288 0.9975226 0.7885719 -0.7716184 0.9975224 0.7885475 -0.7716061 0.9975222 0.7885175 -0.7715919 0.997522 0.7884807 -0.7715762 0.9975217 0.7884362 -0.7715599 0.9975213 0.7883833 -0.7715449 0.9975209 0.7883215 -0.7715352 0.9975204 0.7882518 -0.7715376 0.9975199 0.7881772 -0.7715641 0.9975194 0.7881046 -0.7716352 0.9975191 0.7880474 -0.7717834 0.9975189 0.7880291 -0.7719959 0.9975189 0.7880291 -0.7722648 0.9975189 0.7880291 -0.7726049 0.9975189 0.7880291 -0.7730352 0.9975189 0.7880291 -0.7735795 0.9975189 0.7880291 -0.7742682 0.9975189 0.7880291 -0.7751395 0.9975189 0.7880291 -0.7762418 0.9975189 0.7880291 -0.7776364 0.9975189 0.7880291 -0.7794007 0.9975189 0.7880291 -0.7816327 0.9975189 0.7880291 -0.7844566 0.9975189 0.7880291 -0.7880291 0.9975189 0.7880291 -0.7925488 0.9975189 0.7880291 -0.7982669 0.9975189 0.7880291 -0.8055009 0.9975189 0.7880291 -0.8146529 0.9975189 0.7880291 -0.8262314 0.9975189 0.7880291 -0.8408797 0.9975189 0.7880291 -0.8594117 0.9975189 0.7880291 -0.8828571 0.9975189 0.7880291 -0.9125186 0.9975189 0.7880291 -0.9500442 0.9975189 0.7880291 -0.9975189 0.9975189 0.7880291 -0.9980488 0.9589472 0.8225647 -0.9984638 0.9412278 0.8530945 -0.9987895 0.9360606 0.8794619 -0.9990455 0.9379796 0.9018215 -0.999247 0.94351 0.9205098 -0.9994057 0.9505298 0.935951 -0.9995308 0.9578074 0.9485931 -0.9996295 0.9646787 0.9588684 -0.9997074 0.970829 0.967172 -0.9997688 0.9761497 0.9738515 -0.9998174 0.9806476 0.979205 -0.9998557 0.984388 0.9834833 -0.999886 0.9874615 0.9868946 -0.9999099 0.9899646 0.9896096 -0.9999288 0.9919896 0.9917674 -0.9999437 0.9936193 0.9934803 -0.8119154 0.9980513 0.8229756 -0.8119128 0.9980512 0.8229701 -0.8119096 0.9980512 0.8229633 -0.8119057 0.9980511 0.8229548 -0.8119009 0.9980511 0.8229441 -0.8118949 0.998051 0.8229308 -0.8118878 0.9980509 0.8229144 -0.8118794 0.9980508 0.8228941 -0.8118697 0.9980506 0.8228693 -0.8118589 0.9980504 0.8228393 -0.8118476 0.9980502 0.8228035 -0.811837 0.99805 0.8227619 -0.8118298 0.9980497 0.8227149 -0.8118303 0.9980494 0.8226646 -0.8118466 0.9980491 0.8226156 -0.8118921 0.9980488 0.822577 -0.8119884 0.9980488 0.8225647 -0.8121268 0.9980488 0.8225647 -0.8123018 0.9980488 0.8225647 -0.8125232 0.9980488 0.8225647 -0.8128033 0.9980488 0.8225647 -0.8131577 0.9980488 0.8225647 -0.8136061 0.9980488 0.8225647 -0.8141733 0.9980488 0.8225647 -0.8148909 0.9980488 0.8225647 -0.8157988 0.9980488 0.8225647 -0.8169474 0.9980488 0.8225647 -0.8184005 0.9980488 0.8225647 -0.8202389 0.9980488 0.8225647 -0.8225647 0.9980488 0.8225647 -0.8255071 0.9980488 0.8225647 -0.8292297 0.9980488 0.8225647 -0.8339392 0.9980488 0.8225647 -0.8398974 0.9980488 0.8225647 -0.8474353 0.9980488 0.8225647 -0.8569716 0.9980488 0.8225647 -0.8690364 0.9980488 0.8225647 -0.8842998 0.9980488 0.8225647 -0.9036101 0.9980488 0.8225647 -0.9280401 0.9980488 0.8225647 -0.9589472 0.9980488 0.8225647 -0.9980488 0.9980488 0.8225647 -0.9984638 0.9664961 0.8530945 -0.9987895 0.9522877 0.8794619 -0.9990455 0.9483463 0.9018215 -0.999247 0.9501042 0.9205098 -0.9994057 0.9547096 0.935951 -0.9995308 0.9604492 0.9485931 -0.9996295 0.9663445 0.9588684 -0.9997074 0.9718774 0.967172 -0.9997688 0.9768086 0.9738515 -0.9998174 0.9810611 0.979205 -0.9998557 0.9846473 0.9834833 -0.999886 0.987624 0.9868946 -0.9999099 0.9900664 0.9896096 -0.9999288 0.9920533 0.9917674 -0.9999437 0.9936592 0.9934803 -0.8462171 0.9984653 0.8533677 -0.8462154 0.9984653 0.8533641 -0.8462132 0.9984653 0.8533595 -0.8462106 0.9984653 0.8533539 -0.8462073 0.9984652 0.8533468 -0.8462034 0.9984652 0.8533379 -0.8461986 0.9984651 0.853327 -0.8461929 0.998465 0.8533135 -0.8461864 0.9984649 0.853297 -0.8461791 0.9984648 0.853277 -0.8461714 0.9984647 0.8532533 -0.8461641 0.9984645 0.8532256 -0.8461589 0.9984643 0.8531943 -0.8461587 0.9984642 0.8531609 -0.8461687 0.998464 0.8531283 -0.8461977 0.9984638 0.8531027 -0.8462598 0.9984638 0.8530945 -0.8463492 0.9984638 0.8530945 -0.8464623 0.9984638 0.8530945 -0.8466054 0.9984638 0.8530945 -0.8467864 0.9984638 0.8530945 -0.8470154 0.9984638 0.8530945 -0.8473052 0.9984638 0.8530945 -0.8476717 0.9984638 0.8530945 -0.8481355 0.9984638 0.8530945 -0.8487222 0.9984638 0.8530945 -0.8494644 0.9984638 0.8530945 -0.8504035 0.9984638 0.8530945 -0.8515915 0.9984638 0.8530945 -0.8530945 0.9984638 0.8530945 -0.8549959 0.9984638 0.8530945 -0.8574015 0.9984638 0.8530945 -0.8604449 0.9984638 0.8530945 -0.8642952 0.9984638 0.8530945 -0.8691663 0.9984638 0.8530945 -0.875329 0.9984638 0.8530945 -0.8831255 0.9984638 0.8530945 -0.892989 0.9984638 0.8530945 -0.9054678 0.9984638 0.8530945 -0.921255 0.9984638 0.8530945 -0.9412278 0.9984638 0.8530945 -0.9664961 0.9984638 0.8530945 -0.9984638 0.9984638 0.8530945 -0.9987895 0.9728171 0.8794619 -0.9990455 0.9614615 0.9018215 -0.999247 0.9584468 0.9205098 -0.9994057 0.9599976 0.935951 -0.9995308 0.9637914 0.9485931 -0.9996295 0.968452 0.9588684 -0.9997074 0.9732039 0.967172 -0.9997688 0.9776422 0.9738515 -0.9998174 0.9815844 0.979205 -0.9998557 0.9849754 0.9834833 -0.999886 0.9878296 0.9868946 -0.9999099 0.9901951 0.9896096 -0.9999288 0.9921339 0.9917674 -0.9999437 0.9937096 0.9934803 -0.8750477 0.9987905 0.8796415 -0.8750466 0.9987905 0.8796391 -0.8750451 0.9987904 0.8796361 -0.8750434 0.9987904 0.8796324 -0.8750412 0.9987904 0.8796277 -0.8750386 0.9987904 0.8796219 -0.8750355 0.9987903 0.8796147 -0.8750317 0.9987903 0.8796058 -0.8750274 0.9987902 0.879595 -0.8750225 0.9987902 0.8795819 -0.8750173 0.9987901 0.8795663 -0.8750124 0.99879 0.8795481 -0.8750088 0.9987899 0.8795275 -0.8750084 0.9987897 0.8795055 -0.8750145 0.9987896 0.8794841 -0.8750329 0.9987895 0.8794673 -0.8750727 0.9987895 0.8794619 -0.8751301 0.9987895 0.8794619 -0.8752028 0.9987895 0.8794619 -0.8752947 0.9987895 0.8794619 -0.8754109 0.9987895 0.8794619 -0.875558 0.9987895 0.8794619 -0.8757441 0.9987895 0.8794619 -0.8759795 0.9987895 0.8794619 -0.8762773 0.9987895 0.8794619 -0.8766541 0.9987895 0.8794619 -0.8771307 0.9987895 0.8794619 -0.8777338 0.9987895 0.8794619 -0.8784967 0.9987895 0.8794619 -0.8794619 0.9987895 0.8794619 -0.880683 0.9987895 0.8794619 -0.8822279 0.9987895 0.8794619 -0.8841823 0.9987895 0.8794619 -0.886655 0.9987895 0.8794619 -0.8897832 0.9987895 0.8794619 -0.8937407 0.9987895 0.8794619 -0.8987476 0.9987895 0.8794619 -0.9050819 0.9987895 0.8794619 -0.9130957 0.9987895 0.8794619 -0.9232341 0.9987895 0.8794619 -0.9360606 0.9987895 0.8794619 -0.9522877 0.9987895 0.8794619 -0.9728171 0.9987895 0.8794619 -0.9987895 0.9987895 0.8794619 -0.9990455 0.9780539 0.9018215 -0.999247 0.9690013 0.9205098 -0.9994057 0.9666876 0.935951 -0.9995308 0.9680197 0.9485931 -0.9996295 0.9711183 0.9588684 -0.9997074 0.974882 0.967172 -0.9997688 0.9786968 0.9738515 -0.9998174 0.9822464 0.979205 -0.9998557 0.9853905 0.9834833 -0.999886 0.9880897 0.9868946 -0.9999099 0.990358 0.9896096 -0.9999288 0.9922358 0.9917674 -0.9999437 0.9937734 0.9934803 -0.8990028 0.9990461 0.9019384 -0.899002 0.9990461 0.9019369 -0.8990011 0.9990461 0.9019349 -0.899 0.9990461 0.9019325 -0.8989986 0.9990461 0.9019295 -0.8989969 0.9990461 0.9019257 -0.8989948 0.9990461 0.901921 -0.8989923 0.999046 0.9019152 -0.8989895 0.999046 0.9019081 -0.8989863 0.9990459 0.9018996 -0.8989829 0.9990459 0.9018894 -0.8989796 0.9990458 0.9018776 -0.8989771 0.9990458 0.9018642 -0.8989767 0.9990457 0.9018499 -0.8989805 0.9990456 0.901836 -0.8989921 0.9990456 0.901825 -0.8990175 0.9990455 0.9018215 -0.8990542 0.9990455 0.9018215 -0.8991006 0.9990455 0.9018215 -0.8991593 0.9990455 0.9018215 -0.8992336 0.9990455 0.9018215 -0.8993275 0.9990455 0.9018215 -0.8994464 0.9990455 0.9018215 -0.8995968 0.9990455 0.9018215 -0.899787 0.9990455 0.9018215 -0.9000277 0.9990455 0.9018215 -0.9003323 0.9990455 0.9018215 -0.9007175 0.9990455 0.9018215 -0.9012049 0.9990455 0.9018215 -0.9018215 0.9990455 0.9018215 -0.9026016 0.9990455 0.9018215 -0.9035886 0.9990455 0.9018215 -0.9048372 0.9990455 0.9018215 -0.9064168 0.9990455 0.9018215 -0.9084153 0.9990455 0.9018215 -0.9109436 0.9990455 0.9018215 -0.9141422 0.9990455 0.9018215 -0.9181889 0.9990455 0.9018215 -0.9233085 0.9990455 0.9018215 -0.9297854 0.9990455 0.9018215 -0.9379796 0.9990455 0.9018215 -0.9483463 0.9990455 0.9018215 -0.9614615 0.9990455 0.9018215 -0.9780539 0.9990455 0.9018215 -0.9990455 0.9990455 0.9018215 -0.999247 0.982354 0.9205098 -0.9994057 0.9751513 0.935951 -0.9995308 0.9733691 0.9485931 -0.9996295 0.9744915 0.9588684 -0.9997074 0.977005 0.967172 -0.9997688 0.980031 0.9738515 -0.9998174 0.9830838 0.979205 -0.9998557 0.9859157 0.9834833 -0.999886 0.9884188 0.9868946 -0.9999099 0.9905641 0.9896096 -0.9999288 0.9923648 0.9917674 -0.9999437 0.9938541 0.9934803 -0.9187175 0.9992474 0.9205853 -0.918717 0.9992474 0.9205843 -0.9187164 0.9992474 0.9205831 -0.9187157 0.9992474 0.9205815 -0.9187148 0.9992474 0.9205795 -0.9187137 0.9992474 0.9205771 -0.9187123 0.9992473 0.9205741 -0.9187107 0.9992473 0.9205703 -0.9187089 0.9992473 0.9205658 -0.9187068 0.9992473 0.9205603 -0.9187045 0.9992472 0.9205537 -0.9187024 0.9992472 0.920546 -0.9187008 0.9992472 0.9205374 -0.9187004 0.9992471 0.9205282 -0.9187027 0.9992471 0.9205192 -0.9187101 0.999247 0.9205121 -0.9187262 0.999247 0.9205098 -0.9187495 0.999247 0.9205098 -0.9187791 0.999247 0.9205098 -0.9188164 0.999247 0.9205098 -0.9188636 0.999247 0.9205098 -0.9189234 0.999247 0.9205098 -0.918999 0.999247 0.9205098 -0.9190947 0.999247 0.9205098 -0.9192157 0.999247 0.9205098 -0.9193688 0.999247 0.9205098 -0.9195625 0.999247 0.9205098 -0.9198076 0.999247 0.9205098 -0.9201176 0.999247 0.9205098 -0.9205098 0.999247 0.9205098 -0.9210061 0.999247 0.9205098 -0.9216339 0.999247 0.9205098 -0.9224281 0.999247 0.9205098 -0.9234329 0.999247 0.9205098 -0.9247041 0.999247 0.9205098 -0.9263124 0.999247 0.9205098 -0.928347 0.999247 0.9205098 -0.9309211 0.999247 0.9205098 -0.9341777 0.999247 0.9205098 -0.9382977 0.999247 0.9205098 -0.94351 0.999247 0.9205098 -0.9501042 0.999247 0.9205098 -0.9584468 0.999247 0.9205098 -0.9690013 0.999247 0.9205098 -0.982354 0.999247 0.9205098 -0.999247 0.999247 0.9205098 -0.9994057 0.9858591 0.935951 -0.9995308 0.9801368 0.9485931 -0.9996295 0.978759 0.9588684 -0.9997074 0.9796909 0.967172 -0.9997688 0.981719 0.9738515 -0.9998174 0.9841433 0.979205 -0.9998557 0.9865801 0.9834833 -0.999886 0.9888351 0.9868946 -0.9999099 0.9908248 0.9896096 -0.9999288 0.992528 0.9917674 -0.9999437 0.9939562 0.9934803 -0.9348153 0.999406 0.9359994 -0.9348149 0.999406 0.9359988 -0.9348146 0.999406 0.935998 -0.9348141 0.999406 0.935997 -0.9348135 0.999406 0.9359957 -0.9348128 0.9994059 0.9359941 -0.9348119 0.9994059 0.9359922 -0.9348109 0.9994059 0.9359898 -0.9348097 0.9994059 0.9359869 -0.9348083 0.9994059 0.9359833 -0.9348069 0.9994059 0.9359791 -0.9348055 0.9994059 0.9359742 -0.9348044 0.9994058 0.9359687 -0.9348042 0.9994058 0.9359628 -0.9348056 0.9994058 0.935957 -0.9348102 0.9994057 0.9359524 -0.9348204 0.9994057 0.935951 -0.9348352 0.9994057 0.935951 -0.9348539 0.9994057 0.935951 -0.9348776 0.9994057 0.935951 -0.9349075 0.9994057 0.935951 -0.9349454 0.9994057 0.935951 -0.9349933 0.9994057 0.935951 -0.935054 0.9994057 0.935951 -0.9351307 0.9994057 0.935951 -0.9352277 0.9994057 0.935951 -0.9353505 0.9994057 0.935951 -0.9355059 0.9994057 0.935951 -0.9357024 0.9994057 0.935951 -0.935951 0.9994057 0.935951 -0.9362655 0.9994057 0.935951 -0.9366635 0.9994057 0.935951 -0.9371669 0.9994057 0.935951 -0.9378038 0.9994057 0.935951 -0.9386096 0.9994057 0.935951 -0.939629 0.9994057 0.935951 -0.9409186 0.9994057 0.935951 -0.9425502 0.9994057 0.935951 -0.9446144 0.9994057 0.935951 -0.9472259 0.9994057 0.935951 -0.9505298 0.9994057 0.935951 -0.9547096 0.9994057 0.935951 -0.9599976 0.9994057 0.935951 -0.9666876 0.9994057 0.935951 -0.9751513 0.9994057 0.935951 -0.9858591 0.9994057 0.935951 -0.9994057 0.9994057 0.935951 -0.9995308 0.9886988 0.9485931 -0.9996295 0.9841579 0.9588684 -0.9997074 0.983089 0.967172 -0.9997688 0.9838545 0.9738515 -0.9998174 0.9854838 0.979205 -0.9998557 0.9874207 0.9834833 -0.999886 0.9893618 0.9868946 -0.9999099 0.9911547 0.9896096 -0.9999288 0.9927345 0.9917674 -0.9999437 0.9940854 0.9934803 -0.9478754 0.999531 0.9486239 -0.9478752 0.999531 0.9486235 -0.947875 0.999531 0.948623 -0.9478746 0.999531 0.9486224 -0.9478743 0.999531 0.9486216 -0.9478738 0.999531 0.9486206 -0.9478733 0.999531 0.9486193 -0.9478726 0.999531 0.9486178 -0.9478718 0.999531 0.9486159 -0.947871 0.9995309 0.9486137 -0.94787 0.9995309 0.948611 -0.9478691 0.9995309 0.9486079 -0.9478684 0.9995309 0.9486043 -0.9478683 0.9995309 0.9486006 -0.9478691 0.9995309 0.9485969 -0.947872 0.9995309 0.948594 -0.9478785 0.9995308 0.9485931 -0.9478878 0.9995308 0.9485931 -0.9478997 0.9995308 0.9485931 -0.9479146 0.9995308 0.9485931 -0.9479335 0.9995308 0.9485931 -0.9479575 0.9995308 0.9485931 -0.9479878 0.9995308 0.9485931 -0.9480261 0.9995308 0.9485931 -0.9480746 0.9995308 0.9485931 -0.9481359 0.9995308 0.9485931 -0.9482135 0.9995308 0.9485931 -0.9483117 0.9995308 0.9485931 -0.9484359 0.9995308 0.9485931 -0.9485931 0.9995308 0.9485931 -0.9487918 0.9995308 0.9485931 -0.9490434 0.9995308 0.9485931 -0.9493615 0.9995308 0.9485931 -0.9497641 0.9995308 0.9485931 -0.9502734 0.9995308 0.9485931 -0.9509177 0.9995308 0.9485931 -0.9517328 0.9995308 0.9485931 -0.952764 0.9995308 0.9485931 -0.9540687 0.9995308 0.9485931 -0.9557192 0.9995308 0.9485931 -0.9578074 0.9995308 0.9485931 -0.9604492 0.9995308 0.9485931 -0.9637914 0.9995308 0.9485931 -0.9680197 0.9995308 0.9485931 -0.9733691 0.9995308 0.9485931 -0.9801368 0.9995308 0.9485931 -0.9886988 0.9995308 0.9485931 -0.9995308 0.9995308 0.9485931 -0.9996295 0.9909882 0.9588684 -0.9997074 0.9873879 0.967172 -0.9997688 0.9865561 0.9738515 -0.9998174 0.9871796 0.979205 -0.9998557 0.9884841 0.9834833 -0.999886 0.9900282 0.9868946 -0.9999099 0.991572 0.9896096 -0.9999288 0.9929957 0.9917674 -0.9999437 0.9942488 0.9934803 -0.958416 0.9996296 0.958888 -0.9584159 0.9996296 0.9588878 -0.9584157 0.9996296 0.9588875 -0.9584155 0.9996296 0.9588871 -0.9584153 0.9996296 0.9588865 -0.958415 0.9996296 0.9588859 -0.9584146 0.9996296 0.9588851 -0.9584142 0.9996296 0.9588842 -0.9584137 0.9996296 0.958883 -0.9584132 0.9996296 0.9588815 -0.9584126 0.9996296 0.9588798 -0.958412 0.9996296 0.9588778 -0.9584115 0.9996296 0.9588756 -0.9584114 0.9996295 0.9588732 -0.958412 0.9996295 0.9588709 -0.9584138 0.9996295 0.958869 -0.9584178 0.9996295 0.9588684 -0.9584237 0.9996295 0.9588684 -0.9584312 0.9996295 0.9588684 -0.9584406 0.9996295 0.9588684 -0.9584526 0.9996295 0.9588684 -0.9584677 0.9996295 0.9588684 -0.9584868 0.9996295 0.9588684 -0.9585109 0.9996295 0.9588684 -0.9585415 0.9996295 0.9588684 -0.9585802 0.9996295 0.9588684 -0.9586291 0.9996295 0.9588684 -0.958691 0.9996295 0.9588684 -0.9587693 0.9996295 0.9588684 -0.9588684 0.9996295 0.9588684 -0.9589938 0.9996295 0.9588684 -0.9591524 0.9996295 0.9588684 -0.959353 0.9996295 0.9588684 -0.9596068 0.9996295 0.9588684 -0.959928 0.9996295 0.9588684 -0.9603343 0.9996295 0.9588684 -0.9608482 0.9996295 0.9588684 -0.9614985 0.9996295 0.9588684 -0.9623212 0.9996295 0.9588684 -0.963362 0.9996295 0.9588684 -0.9646787 0.9996295 0.9588684 -0.9663445 0.9996295 0.9588684 -0.968452 0.9996295 0.9588684 -0.9711183 0.9996295 0.9588684 -0.9744915 0.9996295 0.9588684 -0.978759 0.9996295 0.9588684 -0.9841579 0.9996295 0.9588684 -0.9909882 0.9996295 0.9588684 -0.9996295 0.9996295 0.9588684 -0.9997074 0.9928267 0.967172 -0.9997688 0.9899741 0.9738515 -0.9998174 0.989325 0.979205 -0.9998557 0.9898295 0.9834833 -0.999886 0.9908712 0.9868946 -0.9999099 0.9920999 0.9896096 -0.9999288 0.9933261 0.9917674 -0.9999437 0.9944556 0.9934803 -0.9668873 0.9997074 0.9671845 -0.9668872 0.9997074 0.9671843 -0.9668871 0.9997074 0.9671841 -0.966887 0.9997074 0.9671838 -0.9668869 0.9997074 0.9671835 -0.9668867 0.9997074 0.9671831 -0.9668865 0.9997074 0.9671826 -0.9668862 0.9997074 0.967182 -0.9668859 0.9997074 0.9671812 -0.9668855 0.9997074 0.9671803 -0.9668852 0.9997074 0.9671793 -0.9668848 0.9997074 0.967178 -0.9668845 0.9997074 0.9671766 -0.9668844 0.9997074 0.9671751 -0.9668847 0.9997074 0.9671736 -0.9668859 0.9997074 0.9671724 -0.9668884 0.9997074 0.967172 -0.9668922 0.9997074 0.967172 -0.9668969 0.9997074 0.967172 -0.9669028 0.9997074 0.967172 -0.9669103 0.9997074 0.967172 -0.9669198 0.9997074 0.967172 -0.9669318 0.9997074 0.967172 -0.966947 0.9997074 0.967172 -0.9669663 0.9997074 0.967172 -0.9669906 0.9997074 0.967172 -0.9670214 0.9997074 0.967172 -0.9670604 0.9997074 0.967172 -0.9671097 0.9997074 0.967172 -0.967172 0.9997074 0.967172 -0.9672509 0.9997074 0.967172 -0.9673508 0.9997074 0.967172 -0.967477 0.9997074 0.967172 -0.9676368 0.9997074 0.967172 -0.9678389 0.9997074 0.967172 -0.9680946 0.9997074 0.967172 -0.9684181 0.9997074 0.967172 -0.9688274 0.9997074 0.967172 -0.9693452 0.9997074 0.967172 -0.9700002 0.9997074 0.967172 -0.970829 0.9997074 0.967172 -0.9718774 0.9997074 0.967172 -0.9732039 0.9997074 0.967172 -0.974882 0.9997074 0.967172 -0.977005 0.9997074 0.967172 -0.9796909 0.9997074 0.967172 -0.983089 0.9997074 0.967172 -0.9873879 0.9997074 0.967172 -0.9928267 0.9997074 0.967172 -0.9997074 0.9997074 0.967172 -0.9997688 0.9942982 0.9738515 -0.9998174 0.9920392 0.979205 -0.9998557 0.9915316 0.9834833 -0.999886 0.9919377 0.9868946 -0.9999099 0.9927678 0.9896096 -0.9999288 0.9937442 0.9917674 -0.9999437 0.9947172 0.9934803 -0.9736726 0.9997689 0.9738594 -0.9736726 0.9997689 0.9738593 -0.9736725 0.9997689 0.9738591 -0.9736724 0.9997689 0.973859 -0.9736723 0.9997689 0.9738588 -0.9736722 0.9997689 0.9738585 -0.9736721 0.9997689 0.9738582 -0.9736719 0.9997689 0.9738578 -0.9736717 0.9997689 0.9738573 -0.9736715 0.9997689 0.9738568 -0.9736712 0.9997689 0.9738561 -0.973671 0.9997689 0.9738553 -0.9736708 0.9997689 0.9738544 -0.9736708 0.9997689 0.9738534 -0.973671 0.9997688 0.9738525 -0.9736717 0.9997688 0.9738518 -0.9736733 0.9997688 0.9738515 -0.9736756 0.9997688 0.9738515 -0.9736786 0.9997688 0.9738515 -0.9736823 0.9997688 0.9738515 -0.973687 0.9997688 0.9738515 -0.973693 0.9997688 0.9738515 -0.9737006 0.9997688 0.9738515 -0.9737101 0.9997688 0.9738515 -0.9737222 0.9997688 0.9738515 -0.9737375 0.9997688 0.9738515 -0.9737569 0.9997688 0.9738515 -0.9737814 0.9997688 0.9738515 -0.9738123 0.9997688 0.9738515 -0.9738515 0.9997688 0.9738515 -0.9739011 0.9997688 0.9738515 -0.9739638 0.9997688 0.9738515 -0.9740432 0.9997688 0.9738515 -0.9741436 0.9997688 0.9738515 -0.9742706 0.9997688 0.9738515 -0.9744313 0.9997688 0.9738515 -0.9746346 0.9997688 0.9738515 -0.9748918 0.9997688 0.9738515 -0.9752172 0.9997688 0.9738515 -0.9756289 0.9997688 0.9738515 -0.9761497 0.9997688 0.9738515 -0.9768086 0.9997688 0.9738515 -0.9776422 0.9997688 0.9738515 -0.9786968 0.9997688 0.9738515 -0.980031 0.9997688 0.9738515 -0.981719 0.9997688 0.9738515 -0.9838545 0.9997688 0.9738515 -0.9865561 0.9997688 0.9738515 -0.9899741 0.9997688 0.9738515 -0.9942982 0.9997688 0.9738515 -0.9997688 0.9997688 0.9738515 -0.9998174 0.9954731 0.979205 -0.9998557 0.9936849 0.9834833 -0.999886 0.993287 0.9868946 -0.9999099 0.9936128 0.9896096 -0.9999288 0.9942731 0.9917674 -0.9999437 0.9950481 0.9934803 -0.9790927 0.9998174 0.97921 -0.9790927 0.9998174 0.9792099 -0.9790927 0.9998174 0.9792098 -0.9790926 0.9998174 0.9792097 -0.9790925 0.9998174 0.9792096 -0.9790925 0.9998174 0.9792094 -0.9790924 0.9998174 0.9792092 -0.9790923 0.9998174 0.979209 -0.9790921 0.9998174 0.9792087 -0.979092 0.9998174 0.9792083 -0.9790919 0.9998174 0.9792079 -0.9790917 0.9998174 0.9792074 -0.9790916 0.9998174 0.9792068 -0.9790916 0.9998174 0.9792062 -0.9790917 0.9998174 0.9792056 -0.9790921 0.9998174 0.9792052 -0.9790931 0.9998174 0.979205 -0.9790946 0.9998174 0.979205 -0.9790965 0.9998174 0.979205 -0.9790988 0.9998174 0.979205 -0.9791018 0.9998174 0.979205 -0.9791055 0.9998174 0.979205 -0.9791103 0.9998174 0.979205 -0.9791163 0.9998174 0.979205 -0.9791238 0.9998174 0.979205 -0.9791334 0.9998174 0.979205 -0.9791456 0.9998174 0.979205 -0.979161 0.9998174 0.979205 -0.9791804 0.9998174 0.979205 -0.979205 0.9998174 0.979205 -0.9792361 0.9998174 0.979205 -0.9792755 0.9998174 0.979205 -0.9793253 0.9998174 0.979205 -0.9793883 0.9998174 0.979205 -0.9794681 0.9998174 0.979205 -0.9795689 0.9998174 0.979205 -0.9796966 0.9998174 0.979205 -0.979858 0.9998174 0.979205 -0.9800622 0.9998174 0.979205 -0.9803206 0.9998174 0.979205 -0.9806476 0.9998174 0.979205 -0.9810611 0.9998174 0.979205 -0.9815844 0.9998174 0.979205 -0.9822464 0.9998174 0.979205 -0.9830838 0.9998174 0.979205 -0.9841433 0.9998174 0.979205 -0.9854838 0.9998174 0.979205 -0.9871796 0.9998174 0.979205 -0.989325 0.9998174 0.979205 -0.9920392 0.9998174 0.979205 -0.9954731 0.9998174 0.979205 -0.9998174 0.9998174 0.979205 -0.9998557 0.9964092 0.9834833 -0.999886 0.9949941 0.9868946 -0.9999099 0.9946818 0.9896096 -0.9999288 0.9949422 0.9917674 -0.9999437 0.9954668 0.9934803 -0.9834129 0.9998557 0.9834865 -0.9834129 0.9998557 0.9834864 -0.9834129 0.9998557 0.9834864 -0.9834129 0.9998557 0.9834863 -0.9834128 0.9998557 0.9834862 -0.9834128 0.9998557 0.9834861 -0.9834127 0.9998557 0.983486 -0.9834127 0.9998557 0.9834858 -0.9834126 0.9998557 0.9834856 -0.9834125 0.9998557 0.9834854 -0.9834124 0.9998557 0.9834851 -0.9834123 0.9998557 0.9834848 -0.9834122 0.9998557 0.9834845 -0.9834122 0.9998557 0.9834841 -0.9834123 0.9998557 0.9834837 -0.9834126 0.9998557 0.9834834 -0.9834132 0.9998557 0.9834833 -0.9834141 0.9998557 0.9834833 -0.9834153 0.9998557 0.9834833 -0.9834167 0.9998557 0.9834833 -0.9834186 0.9998557 0.9834833 -0.9834209 0.9998557 0.9834833 -0.9834239 0.9998557 0.9834833 -0.9834277 0.9998557 0.9834833 -0.9834324 0.9998557 0.9834833 -0.9834385 0.9998557 0.9834833 -0.9834461 0.9998557 0.9834833 -0.9834557 0.9998557 0.9834833 -0.9834679 0.9998557 0.9834833 -0.9834833 0.9998557 0.9834833 -0.9835029 0.9998557 0.9834833 -0.9835276 0.9998557 0.9834833 -0.9835588 0.9998557 0.9834833 -0.9835983 0.9998557 0.9834833 -0.9836483 0.9998557 0.9834833 -0.9837116 0.9998557 0.9834833 -0.9837916 0.9998557 0.9834833 -0.9838928 0.9998557 0.9834833 -0.9840209 0.9998557 0.9834833 -0.9841829 0.9998557 0.9834833 -0.984388 0.9998557 0.9834833 -0.9846473 0.9998557 0.9834833 -0.9849754 0.9998557 0.9834833 -0.9853905 0.9998557 0.9834833 -0.9859157 0.9998557 0.9834833 -0.9865801 0.9998557 0.9834833 -0.9874207 0.9998557 0.9834833 -0.9884841 0.9998557 0.9834833 -0.9898295 0.9998557 0.9834833 -0.9915316 0.9998557 0.9834833 -0.9936849 0.9998557 0.9834833 -0.9964092 0.9998557 0.9834833 -0.9998557 0.9998557 0.9834833 -0.999886 0.9971537 0.9868946 -0.9999099 0.9960342 0.9896096 -0.9999288 0.9957887 0.9917674 -0.9999437 0.9959964 0.9934803 -0.9868505 0.999886 0.9868966 -0.9868505 0.999886 0.9868965 -0.9868505 0.999886 0.9868965 -0.9868505 0.999886 0.9868965 -0.9868504 0.999886 0.9868964 -0.9868504 0.999886 0.9868964 -0.9868504 0.999886 0.9868963 -0.9868503 0.999886 0.9868962 -0.9868503 0.999886 0.9868961 -0.9868502 0.999886 0.9868959 -0.9868502 0.999886 0.9868958 -0.9868501 0.999886 0.9868956 -0.9868501 0.999886 0.9868953 -0.98685 0.999886 0.9868951 -0.9868501 0.999886 0.9868949 -0.9868503 0.999886 0.9868947 -0.9868507 0.999886 0.9868946 -0.9868512 0.999886 0.9868946 -0.986852 0.999886 0.9868946 -0.9868529 0.999886 0.9868946 -0.9868541 0.999886 0.9868946 -0.9868555 0.999886 0.9868946 -0.9868574 0.999886 0.9868946 -0.9868597 0.999886 0.9868946 -0.9868627 0.999886 0.9868946 -0.9868665 0.999886 0.9868946 -0.9868713 0.999886 0.9868946 -0.9868773 0.999886 0.9868946 -0.986885 0.999886 0.9868946 -0.9868946 0.999886 0.9868946 -0.9869069 0.999886 0.9868946 -0.9869223 0.999886 0.9868946 -0.9869419 0.999886 0.9868946 -0.9869667 0.999886 0.9868946 -0.986998 0.999886 0.9868946 -0.9870376 0.999886 0.9868946 -0.9870878 0.999886 0.9868946 -0.9871512 0.999886 0.9868946 -0.9872315 0.999886 0.9868946 -0.987333 0.999886 0.9868946 -0.9874615 0.999886 0.9868946 -0.987624 0.999886 0.9868946 -0.9878296 0.999886 0.9868946 -0.9880897 0.999886 0.9868946 -0.9884188 0.999886 0.9868946 -0.9888351 0.999886 0.9868946 -0.9893618 0.999886 0.9868946 -0.9900282 0.999886 0.9868946 -0.9908712 0.999886 0.9868946 -0.9919377 0.999886 0.9868946 -0.993287 0.999886 0.9868946 -0.9949941 0.999886 0.9868946 -0.9971537 0.999886 0.9868946 -0.999886 0.999886 0.9868946 -0.9999099 0.9977452 0.9896096 -0.9999288 0.9968597 0.9917674 -0.9999437 0.9966665 0.9934803 -0.989582 0.9999099 0.9896109 -0.989582 0.9999099 0.9896108 -0.989582 0.9999099 0.9896108 -0.989582 0.9999099 0.9896108 -0.989582 0.9999099 0.9896108 -0.9895819 0.9999099 0.9896107 -0.9895819 0.9999099 0.9896107 -0.9895819 0.9999099 0.9896106 -0.9895819 0.9999099 0.9896105 -0.9895818 0.9999099 0.9896105 -0.9895818 0.9999099 0.9896103 -0.9895818 0.9999099 0.9896102 -0.9895817 0.9999099 0.9896101 -0.9895817 0.9999099 0.9896099 -0.9895817 0.9999099 0.9896098 -0.9895819 0.9999099 0.9896097 -0.9895821 0.9999099 0.9896096 -0.9895825 0.9999099 0.9896096 -0.9895829 0.9999099 0.9896096 -0.9895835 0.9999099 0.9896096 -0.9895842 0.9999099 0.9896096 -0.9895851 0.9999099 0.9896096 -0.9895863 0.9999099 0.9896096 -0.9895878 0.9999099 0.9896096 -0.9895897 0.9999099 0.9896096 -0.989592 0.9999099 0.9896096 -0.989595 0.9999099 0.9896096 -0.9895988 0.9999099 0.9896096 -0.9896036 0.9999099 0.9896096 -0.9896096 0.9999099 0.9896096 -0.9896173 0.9999099 0.9896096 -0.989627 0.9999099 0.9896096 -0.9896392 0.9999099 0.9896096 -0.9896547 0.9999099 0.9896096 -0.9896744 0.9999099 0.9896096 -0.9896992 0.9999099 0.9896096 -0.9897306 0.9999099 0.9896096 -0.9897703 0.9999099 0.9896096 -0.9898206 0.9999099 0.9896096 -0.9898842 0.9999099 0.9896096 -0.9899646 0.9999099 0.9896096 -0.9900664 0.9999099 0.9896096 -0.9901951 0.9999099 0.9896096 -0.990358 0.9999099 0.9896096 -0.9905641 0.9999099 0.9896096 -0.9908248 0.9999099 0.9896096 -0.9911547 0.9999099 0.9896096 -0.991572 0.9999099 0.9896096 -0.9920999 0.9999099 0.9896096 -0.9927678 0.9999099 0.9896096 -0.9936128 0.9999099 0.9896096 -0.9946818 0.9999099 0.9896096 -0.9960342 0.9999099 0.9896096 -0.9977452 0.9999099 0.9896096 -0.9999099 0.9999099 0.9896096 -0.9999288 0.9982146 0.9917674 -0.9999437 0.9975143 0.9934803 -0.9917501 0.9999288 0.9917682 -0.9917501 0.9999288 0.9917681 -0.9917501 0.9999288 0.9917681 -0.9917501 0.9999288 0.9917681 -0.9917501 0.9999288 0.9917681 -0.9917501 0.9999288 0.9917681 -0.99175 0.9999288 0.991768 -0.99175 0.9999288 0.991768 -0.99175 0.9999288 0.991768 -0.99175 0.9999288 0.9917679 -0.99175 0.9999288 0.9917678 -0.9917499 0.9999288 0.9917678 -0.9917499 0.9999288 0.9917677 -0.9917499 0.9999288 0.9917676 -0.9917499 0.9999288 0.9917675 -0.99175 0.9999288 0.9917674 -0.9917502 0.9999288 0.9917674 -0.9917504 0.9999288 0.9917674 -0.9917507 0.9999288 0.9917674 -0.991751 0.9999288 0.9917674 -0.9917515 0.9999288 0.9917674 -0.9917521 0.9999288 0.9917674 -0.9917528 0.9999288 0.9917674 -0.9917537 0.9999288 0.9917674 -0.9917549 0.9999288 0.9917674 -0.9917564 0.9999288 0.9917674 -0.9917582 0.9999288 0.9917674 -0.9917606 0.9999288 0.9917674 -0.9917636 0.9999288 0.9917674 -0.9917674 0.9999288 0.9917674 -0.9917722 0.9999288 0.9917674 -0.9917782 0.9999288 0.9917674 -0.9917859 0.9999288 0.9917674 -0.9917956 0.9999288 0.9917674 -0.9918079 0.9999288 0.9917674 -0.9918234 0.9999288 0.9917674 -0.9918431 0.9999288 0.9917674 -0.991868 0.9999288 0.9917674 -0.9918994 0.9999288 0.9917674 -0.9919392 0.9999288 0.9917674 -0.9919896 0.9999288 0.9917674 -0.9920533 0.9999288 0.9917674 -0.9921339 0.9999288 0.9917674 -0.9922358 0.9999288 0.9917674 -0.9923648 0.9999288 0.9917674 -0.992528 0.9999288 0.9917674 -0.9927345 0.9999288 0.9917674 -0.9929957 0.9999288 0.9917674 -0.9933261 0.9999288 0.9917674 -0.9937442 0.9999288 0.9917674 -0.9942731 0.9999288 0.9917674 -0.9949422 0.9999288 0.9917674 -0.9957887 0.9999288 0.9917674 -0.9968597 0.9999288 0.9917674 -0.9982146 0.9999288 0.9917674 -0.9999288 0.9999288 0.9917674 -0.9999437 0.9985868 0.9934803 -0.9934695 0.9999437 0.9934808 -0.9934695 0.9999437 0.9934808 -0.9934695 0.9999437 0.9934808 -0.9934695 0.9999437 0.9934808 -0.9934695 0.9999437 0.9934807 -0.9934695 0.9999437 0.9934807 -0.9934695 0.9999437 0.9934807 -0.9934694 0.9999437 0.9934807 -0.9934694 0.9999437 0.9934807 -0.9934694 0.9999437 0.9934806 -0.9934694 0.9999437 0.9934806 -0.9934694 0.9999437 0.9934805 -0.9934694 0.9999437 0.9934805 -0.9934694 0.9999437 0.9934804 -0.9934694 0.9999437 0.9934804 -0.9934694 0.9999437 0.9934803 -0.9934695 0.9999437 0.9934803 -0.9934697 0.9999437 0.9934803 -0.9934698 0.9999437 0.9934803 -0.9934701 0.9999437 0.9934803 -0.9934704 0.9999437 0.9934803 -0.9934707 0.9999437 0.9934803 -0.9934712 0.9999437 0.9934803 -0.9934718 0.9999437 0.9934803 -0.9934725 0.9999437 0.9934803 -0.9934734 0.9999437 0.9934803 -0.9934746 0.9999437 0.9934803 -0.9934761 0.9999437 0.9934803 -0.9934779 0.9999437 0.9934803 -0.9934803 0.9999437 0.9934803 -0.9934833 0.9999437 0.9934803 -0.9934871 0.9999437 0.9934803 -0.9934919 0.9999437 0.9934803 -0.993498 0.9999437 0.9934803 -0.9935057 0.9999437 0.9934803 -0.9935154 0.9999437 0.9934803 -0.9935277 0.9999437 0.9934803 -0.9935432 0.9999437 0.9934803 -0.9935629 0.9999437 0.9934803 -0.9935878 0.9999437 0.9934803 -0.9936193 0.9999437 0.9934803 -0.9936592 0.9999437 0.9934803 -0.9937096 0.9999437 0.9934803 -0.9937734 0.9999437 0.9934803 -0.9938541 0.9999437 0.9934803 -0.9939562 0.9999437 0.9934803 -0.9940854 0.9999437 0.9934803 -0.9942488 0.9999437 0.9934803 -0.9944556 0.9999437 0.9934803 -0.9947172 0.9999437 0.9934803 -0.9950481 0.9999437 0.9934803 -0.9954668 0.9999437 0.9934803 -0.9959964 0.9999437 0.9934803 -0.9966665 0.9999437 0.9934803 -0.9975143 0.9999437 0.9934803 -0.9985868 0.9999437 0.9934803 -0.9999437 0.9999437 0.9934803 -0.1572498 0.1572498 0.9669269 -0.1574352 0.1572498 0.9669269 -0.1576697 0.1572498 0.9669269 -0.1579665 0.1572498 0.9669269 -0.1583419 0.1572498 0.9669269 -0.1588168 0.1572498 0.9669269 -0.1594176 0.1572498 0.9669269 -0.1601778 0.1572498 0.9669269 -0.1611395 0.1572498 0.9669269 -0.1623561 0.1572498 0.9669269 -0.1638954 0.1572498 0.9669269 -0.1658427 0.1572498 0.9669269 -0.1683064 0.1572498 0.9669269 -0.1714232 0.1572498 0.9669269 -0.1753664 0.1572498 0.9669269 -0.180355 0.1572498 0.9669269 -0.1866663 0.1572498 0.9669269 -0.1946509 0.1572498 0.9669269 -0.2047525 0.1572498 0.9669269 -0.2175323 0.1572498 0.9669269 -0.2337004 0.1572498 0.9669269 -0.2541551 0.1572498 0.9669269 -0.280033 0.1572498 0.9669269 -0.3127719 0.1572498 0.9669269 -0.3541909 0.1572498 0.9669269 -0.4065913 0.1572498 0.9669269 -0.4728847 0.1572498 0.9669269 -0.5567544 0.1572498 0.9669269 -0.6628604 0.1572498 0.9669269 -0.7970984 0.1572498 0.9669269 -0.9669269 0.1572498 0.9669269 -0.9754027 0.2151269 0.8159649 -0.9814251 0.2783684 0.7174845 -0.9858181 0.3454107 0.6615372 -0.9890841 0.4144197 0.6386246 -0.9915469 0.4834235 0.6401109 -0.993424 0.5504963 0.6584502 -0.9948662 0.6139459 0.6873271 -0.9959813 0.6724572 0.7217186 -0.9968475 0.7251659 0.7578634 -0.997523 0.7716588 0.7931449 -0.9980513 0.8119154 0.8259111 -0.9984653 0.8462171 0.8552656 -0.9987905 0.8750477 0.8808607 -0.9990461 0.8990028 0.9027176 -0.9992474 0.9187175 0.9210811 -0.999406 0.9348153 0.9363137 -0.999531 0.9478754 0.9488226 -0.9996296 0.958416 0.9590133 -0.9997074 0.9668873 0.9672633 -0.9997689 0.9736726 0.9739089 -0.9998174 0.9790927 0.9792411 -0.9998557 0.9834129 0.983506 -0.999886 0.9868505 0.9869088 -0.9999099 0.989582 0.9896185 -0.9999288 0.9917501 0.9917729 -0.9999437 0.9934695 0.9934838 -0.1572498 0.1574352 0.9669269 -0.1572031 0.1572031 0.9669173 -0.1574377 0.1572031 0.9669173 -0.1577345 0.1572031 0.9669173 -0.15811 0.1572031 0.9669173 -0.1585851 0.1572031 0.9669173 -0.1591861 0.1572031 0.9669173 -0.1599465 0.1572031 0.9669173 -0.1609084 0.1572031 0.9669173 -0.1621254 0.1572031 0.9669173 -0.1636651 0.1572031 0.9669173 -0.165613 0.1572031 0.9669173 -0.1680773 0.1572031 0.9669173 -0.171195 0.1572031 0.9669173 -0.1751393 0.1572031 0.9669173 -0.1801293 0.1572031 0.9669173 -0.1864423 0.1572031 0.9669173 -0.1944291 0.1572031 0.9669173 -0.2045334 0.1572031 0.9669173 -0.2173167 0.1572031 0.9669173 -0.2334893 0.1572031 0.9669173 -0.2539496 0.1572031 0.9669173 -0.2798347 0.1572031 0.9669173 -0.3125826 0.1572031 0.9669173 -0.3540129 0.1572031 0.9669173 -0.4064278 0.1572031 0.9669173 -0.4727393 0.1572031 0.9669173 -0.5566321 0.1572031 0.9669173 -0.6627673 0.1572031 0.9669173 -0.7970422 0.1572031 0.9669173 -0.9669173 0.1572031 0.9669173 -0.9753975 0.2150852 0.8159232 -0.9814221 0.2783325 0.7174314 -0.9858163 0.3453807 0.6614846 -0.9890831 0.4143955 0.6385781 -0.9915463 0.4834045 0.6400728 -0.9934236 0.5504818 0.6584205 -0.994866 0.6139352 0.6873049 -0.9959811 0.6724495 0.7217025 -0.9968474 0.7251605 0.757852 -0.997523 0.7716551 0.793137 -0.9980512 0.8119128 0.8259058 -0.9984653 0.8462154 0.855262 -0.9987905 0.8750466 0.8808584 -0.9990461 0.899002 0.902716 -0.9992474 0.918717 0.9210801 -0.999406 0.9348149 0.9363131 -0.999531 0.9478752 0.9488222 -0.9996296 0.9584159 0.9590131 -0.9997074 0.9668872 0.9672632 -0.9997689 0.9736726 0.9739088 -0.9998174 0.9790927 0.979241 -0.9998557 0.9834129 0.9835059 -0.999886 0.9868505 0.9869088 -0.9999099 0.989582 0.9896185 -0.9999288 0.9917501 0.9917729 -0.9999437 0.9934695 0.9934838 -0.1572498 0.1576697 0.9669269 -0.1572031 0.1574377 0.9669173 -0.1571463 0.1571463 0.9669053 -0.1574432 0.1571463 0.9669053 -0.1578188 0.1571463 0.9669053 -0.1582941 0.1571463 0.9669053 -0.1588953 0.1571463 0.9669053 -0.1596559 0.1571463 0.9669053 -0.1606182 0.1571463 0.9669053 -0.1618356 0.1571463 0.9669053 -0.1633758 0.1571463 0.9669053 -0.1653244 0.1571463 0.9669053 -0.1677895 0.1571463 0.9669053 -0.1709083 0.1571463 0.9669053 -0.1748539 0.1571463 0.9669053 -0.1798457 0.1571463 0.9669053 -0.1861609 0.1571463 0.9669053 -0.1941504 0.1571463 0.9669053 -0.2042583 0.1571463 0.9669053 -0.217046 0.1571463 0.9669053 -0.2332241 0.1571463 0.9669053 -0.2536915 0.1571463 0.9669053 -0.2795855 0.1571463 0.9669053 -0.3123447 0.1571463 0.9669053 -0.3537894 0.1571463 0.9669053 -0.4062223 0.1571463 0.9669053 -0.4725567 0.1571463 0.9669053 -0.5564784 0.1571463 0.9669053 -0.6626503 0.1571463 0.9669053 -0.7969715 0.1571463 0.9669053 -0.9669053 0.1571463 0.9669053 -0.9753908 0.2150342 0.8158707 -0.9814183 0.2782884 0.7173646 -0.9858141 0.3453439 0.6614184 -0.9890818 0.4143657 0.6385197 -0.9915455 0.4833811 0.6400249 -0.9934231 0.550464 0.6583832 -0.9948657 0.6139219 0.687277 -0.9959809 0.6724399 0.7216823 -0.9968473 0.7251537 0.7578377 -0.9975229 0.7716504 0.7931271 -0.9980512 0.8119096 0.8258991 -0.9984653 0.8462132 0.8552576 -0.9987904 0.8750451 0.8808555 -0.9990461 0.8990011 0.9027141 -0.9992474 0.9187164 0.9210788 -0.999406 0.9348146 0.9363123 -0.999531 0.947875 0.9488217 -0.9996296 0.9584157 0.9590128 -0.9997074 0.9668871 0.967263 -0.9997689 0.9736725 0.9739087 -0.9998174 0.9790927 0.9792409 -0.9998557 0.9834129 0.9835059 -0.999886 0.9868505 0.9869087 -0.9999099 0.989582 0.9896185 -0.9999288 0.9917501 0.9917729 -0.9999437 0.9934695 0.9934838 -0.1572498 0.1579665 0.9669269 -0.1572031 0.1577345 0.9669173 -0.1571463 0.1574432 0.9669053 -0.1570779 0.1570779 0.9668902 -0.1574537 0.1570779 0.9668902 -0.1579292 0.1570779 0.9668902 -0.1585307 0.1570779 0.9668902 -0.1592916 0.1570779 0.9668902 -0.1602543 0.1570779 0.9668902 -0.1614723 0.1570779 0.9668902 -0.1630131 0.1570779 0.9668902 -0.1649625 0.1570779 0.9668902 -0.1674288 0.1570779 0.9668902 -0.1705489 0.1570779 0.9668902 -0.1744962 0.1570779 0.9668902 -0.1794901 0.1570779 0.9668902 -0.185808 0.1570779 0.9668902 -0.1938011 0.1570779 0.9668902 -0.2039133 0.1570779 0.9668902 -0.2167065 0.1570779 0.9668902 -0.2328916 0.1570779 0.9668902 -0.2533679 0.1570779 0.9668902 -0.2792731 0.1570779 0.9668902 -0.3120464 0.1570779 0.9668902 -0.353509 0.1570779 0.9668902 -0.4059646 0.1570779 0.9668902 -0.4723278 0.1570779 0.9668902 -0.5562858 0.1570779 0.9668902 -0.6625036 0.1570779 0.9668902 -0.7968829 0.1570779 0.9668902 -0.9668902 0.1570779 0.9668902 -0.9753825 0.2149725 0.8158049 -0.9814136 0.2782347 0.717281 -0.9858113 0.3452987 0.6613355 -0.9890801 0.414329 0.6384466 -0.9915446 0.4833522 0.6399649 -0.9934225 0.5504419 0.6583364 -0.9948653 0.6139056 0.687242 -0.9959807 0.672428 0.7216569 -0.9968472 0.7251454 0.7578198 -0.9975228 0.7716446 0.7931147 -0.9980511 0.8119057 0.8258907 -0.9984653 0.8462106 0.855252 -0.9987904 0.8750434 0.8808518 -0.9990461 0.899 0.9027117 -0.9992474 0.9187157 0.9210773 -0.999406 0.9348141 0.9363113 -0.999531 0.9478746 0.9488211 -0.9996296 0.9584155 0.9590124 -0.9997074 0.966887 0.9672627 -0.9997689 0.9736724 0.9739085 -0.9998174 0.9790926 0.9792408 -0.9998557 0.9834129 0.9835058 -0.999886 0.9868505 0.9869087 -0.9999099 0.989582 0.9896185 -0.9999288 0.9917501 0.9917729 -0.9999437 0.9934695 0.9934838 -0.1572498 0.1583419 0.9669269 -0.1572031 0.15811 0.9669173 -0.1571463 0.1578188 0.9669053 -0.1570779 0.1574537 0.9668902 -0.1569971 0.1569971 0.9668714 -0.1574728 0.1569971 0.9668714 -0.1580746 0.1569971 0.9668714 -0.158836 0.1569971 0.9668714 -0.1597992 0.1569971 0.9668714 -0.1610178 0.1569971 0.9668714 -0.1625595 0.1569971 0.9668714 -0.16451 0.1569971 0.9668714 -0.1669776 0.1569971 0.9668714 -0.1700994 0.1569971 0.9668714 -0.1740488 0.1569971 0.9668714 -0.1790454 0.1569971 0.9668714 -0.1853668 0.1569971 0.9668714 -0.1933641 0.1569971 0.9668714 -0.2034818 0.1569971 0.9668714 -0.2162819 0.1569971 0.9668714 -0.2324758 0.1569971 0.9668714 -0.2529632 0.1569971 0.9668714 -0.2788823 0.1569971 0.9668714 -0.3116735 0.1569971 0.9668714 -0.3531585 0.1569971 0.9668714 -0.4056424 0.1569971 0.9668714 -0.4720415 0.1569971 0.9668714 -0.5560449 0.1569971 0.9668714 -0.6623201 0.1569971 0.9668714 -0.7967721 0.1569971 0.9668714 -0.9668714 0.1569971 0.9668714 -0.9753721 0.2148987 0.8157227 -0.9814076 0.2781701 0.7171765 -0.9858079 0.3452442 0.6612318 -0.9890781 0.4142845 0.6383552 -0.9915433 0.4833171 0.6398899 -0.9934218 0.550415 0.658278 -0.9948649 0.6138855 0.6871982 -0.9959804 0.6724135 0.7216252 -0.996847 0.7251351 0.7577974 -0.9975227 0.7716375 0.7930993 -0.9980511 0.8119009 0.8258802 -0.9984652 0.8462073 0.8552449 -0.9987904 0.8750412 0.8808471 -0.9990461 0.8989986 0.9027087 -0.9992474 0.9187148 0.9210753 -0.999406 0.9348135 0.93631 -0.999531 0.9478743 0.9488203 -0.9996296 0.9584153 0.9590118 -0.9997074 0.9668869 0.9672624 -0.9997689 0.9736723 0.9739083 -0.9998174 0.9790925 0.9792407 -0.9998557 0.9834128 0.9835057 -0.999886 0.9868504 0.9869087 -0.9999099 0.989582 0.9896184 -0.9999288 0.9917501 0.9917729 -0.9999437 0.9934695 0.9934837 -0.1572498 0.1588168 0.9669269 -0.1572031 0.1585851 0.9669173 -0.1571463 0.1582941 0.9669053 -0.1570779 0.1579292 0.9668902 -0.1569971 0.1574728 0.9668714 -0.156904 0.156904 0.9668479 -0.1575062 0.156904 0.9668479 -0.1582681 0.156904 0.9668479 -0.159232 0.156904 0.9668479 -0.1604514 0.156904 0.9668479 -0.1619942 0.156904 0.9668479 -0.1639459 0.156904 0.9668479 -0.1664151 0.156904 0.9668479 -0.169539 0.156904 0.9668479 -0.1734912 0.156904 0.9668479 -0.1784912 0.156904 0.9668479 -0.1848168 0.156904 0.9668479 -0.1928195 0.156904 0.9668479 -0.202944 0.156904 0.9668479 -0.2157528 0.156904 0.9668479 -0.2319575 0.156904 0.9668479 -0.2524587 0.156904 0.9668479 -0.2783953 0.156904 0.9668479 -0.3112085 0.156904 0.9668479 -0.3527215 0.156904 0.9668479 -0.4052408 0.156904 0.9668479 -0.4716846 0.156904 0.9668479 -0.5557446 0.156904 0.9668479 -0.6620914 0.156904 0.9668479 -0.796634 0.156904 0.9668479 -0.9668479 0.156904 0.9668479 -0.9753591 0.2148124 0.8156201 -0.9814002 0.2780936 0.7170462 -0.9858036 0.3451791 0.6611026 -0.9890755 0.4142311 0.6382413 -0.9915418 0.4832747 0.6397965 -0.9934209 0.5503825 0.6582052 -0.9948643 0.6138613 0.6871438 -0.9959801 0.6723959 0.7215857 -0.9968468 0.7251226 0.7577695 -0.9975226 0.7716288 0.79308 -0.998051 0.8118949 0.8258672 -0.9984652 0.8462034 0.8552362 -0.9987904 0.8750386 0.8808414 -0.9990461 0.8989969 0.9027049 -0.9992474 0.9187137 0.9210729 -0.9994059 0.9348128 0.9363085 -0.999531 0.9478738 0.9488193 -0.9996296 0.958415 0.9590112 -0.9997074 0.9668867 0.967262 -0.9997689 0.9736722 0.9739081 -0.9998174 0.9790925 0.9792405 -0.9998557 0.9834128 0.9835056 -0.999886 0.9868504 0.9869086 -0.9999099 0.9895819 0.9896184 -0.9999288 0.9917501 0.9917729 -0.9999437 0.9934695 0.9934837 -0.1572498 0.1594176 0.9669269 -0.1572031 0.1591861 0.9669173 -0.1571463 0.1588953 0.9669053 -0.1570779 0.1585307 0.9668902 -0.1569971 0.1580746 0.9668714 -0.156904 0.1575062 0.9668479 -0.1568008 0.1568008 0.9668187 -0.1575633 0.1568008 0.9668187 -0.158528 0.1568008 0.9668187 -0.1597484 0.1568008 0.9668187 -0.1612925 0.1568008 0.9668187 -0.1632458 0.1568008 0.9668187 -0.1657171 0.1568008 0.9668187 -0.1688437 0.1568008 0.9668187 -0.1727991 0.1568008 0.9668187 -0.1778032 0.1568008 0.9668187 -0.1841341 0.1568008 0.9668187 -0.1921435 0.1568008 0.9668187 -0.2022765 0.1568008 0.9668187 -0.215096 0.1568008 0.9668187 -0.2313143 0.1568008 0.9668187 -0.2518326 0.1568008 0.9668187 -0.2777909 0.1568008 0.9668187 -0.3106315 0.1568008 0.9668187 -0.3521792 0.1568008 0.9668187 -0.4047424 0.1568008 0.9668187 -0.4712417 0.1568008 0.9668187 -0.5553719 0.1568008 0.9668187 -0.6618076 0.1568008 0.9668187 -0.7964626 0.1568008 0.9668187 -0.9668187 0.1568008 0.9668187 -0.975343 0.2147144 0.815493 -0.9813911 0.2780055 0.7168846 -0.9857982 0.3451032 0.6609424 -0.9890723 0.4141683 0.6381 -0.9915399 0.4832246 0.6396806 -0.9934197 0.5503438 0.658115 -0.9948636 0.6138323 0.6870762 -0.9959797 0.6723748 0.7215367 -0.9968465 0.7251076 0.7577349 -0.9975224 0.7716184 0.7930561 -0.9980509 0.8118878 0.825851 -0.9984651 0.8461986 0.8552254 -0.9987903 0.8750355 0.8808343 -0.9990461 0.8989948 0.9027003 -0.9992473 0.9187123 0.9210699 -0.9994059 0.9348119 0.9363065 -0.999531 0.9478733 0.948818 -0.9996296 0.9584146 0.9590104 -0.9997074 0.9668865 0.9672615 -0.9997689 0.9736721 0.9739078 -0.9998174 0.9790924 0.9792403 -0.9998557 0.9834127 0.9835055 -0.999886 0.9868504 0.9869085 -0.9999099 0.9895819 0.9896183 -0.9999288 0.99175 0.9917728 -0.9999437 0.9934695 0.9934837 -0.1572498 0.1601778 0.9669269 -0.1572031 0.1599465 0.9669173 -0.1571463 0.1596559 0.9669053 -0.1570779 0.1592916 0.9668902 -0.1569971 0.158836 0.9668714 -0.156904 0.1582681 0.9668479 -0.1568008 0.1575633 0.9668187 -0.1566936 0.1566936 0.9667827 -0.1576592 0.1566936 0.9667827 -0.1588809 0.1566936 0.9667827 -0.1604266 0.1566936 0.9667827 -0.162382 0.1566936 0.9667827 -0.1648558 0.1566936 0.9667827 -0.1679855 0.1566936 0.9667827 -0.1719451 0.1566936 0.9667827 -0.1769544 0.1566936 0.9667827 -0.1832918 0.1566936 0.9667827 -0.1913094 0.1566936 0.9667827 -0.2014528 0.1566936 0.9667827 -0.2142855 0.1566936 0.9667827 -0.2305205 0.1566936 0.9667827 -0.25106 0.1566936 0.9667827 -0.277045 0.1566936 0.9667827 -0.3099195 0.1566936 0.9667827 -0.3515099 0.1566936 0.9667827 -0.4041273 0.1566936 0.9667827 -0.4706951 0.1566936 0.9667827 -0.554912 0.1566936 0.9667827 -0.6614574 0.1566936 0.9667827 -0.7962511 0.1566936 0.9667827 -0.9667827 0.1566936 0.9667827 -0.9753231 0.2146085 0.815336 -0.9813797 0.2779077 0.7166853 -0.9857916 0.3450175 0.6607448 -0.9890684 0.4140964 0.6379259 -0.9915376 0.4831666 0.6395378 -0.9934183 0.5502987 0.6580038 -0.9948628 0.6137984 0.6869929 -0.9959791 0.67235 0.7214763 -0.9968462 0.7250899 0.7576923 -0.9975222 0.7716061 0.7930267 -0.9980508 0.8118794 0.825831 -0.998465 0.8461929 0.8552121 -0.9987903 0.8750317 0.8808255 -0.999046 0.8989923 0.9026946 -0.9992473 0.9187107 0.9210662 -0.9994059 0.9348109 0.9363041 -0.999531 0.9478726 0.9488165 -0.9996296 0.9584142 0.9590095 -0.9997074 0.9668862 0.9672609 -0.9997689 0.9736719 0.9739074 -0.9998174 0.9790923 0.9792401 -0.9998557 0.9834127 0.9835053 -0.999886 0.9868503 0.9869084 -0.9999099 0.9895819 0.9896183 -0.9999288 0.99175 0.9917728 -0.9999437 0.9934694 0.9934837 -0.1572498 0.1611395 0.9669269 -0.1572031 0.1609084 0.9669173 -0.1571463 0.1606182 0.9669053 -0.1570779 0.1602543 0.9668902 -0.1569971 0.1597992 0.9668714 -0.156904 0.159232 0.9668479 -0.1568008 0.158528 0.9668187 -0.1566936 0.1576592 0.9667827 -0.1565954 0.1565954 0.9667385 -0.1578187 0.1565954 0.9667385 -0.1593662 0.1565954 0.9667385 -0.1613241 0.1565954 0.9667385 -0.1638011 0.1565954 0.9667385 -0.1669347 0.1565954 0.9667385 -0.1708992 0.1565954 0.9667385 -0.1759149 0.1565954 0.9667385 -0.1822603 0.1565954 0.9667385 -0.190288 0.1565954 0.9667385 -0.2004442 0.1565954 0.9667385 -0.2132931 0.1565954 0.9667385 -0.2295486 0.1565954 0.9667385 -0.2501139 0.1565954 0.9667385 -0.2761317 0.1565954 0.9667385 -0.3090475 0.1565954 0.9667385 -0.3506904 0.1565954 0.9667385 -0.4033741 0.1565954 0.9667385 -0.4700258 0.1565954 0.9667385 -0.5543488 0.1565954 0.9667385 -0.6610284 0.1565954 0.9667385 -0.795992 0.1565954 0.9667385 -0.9667385 0.1565954 0.9667385 -0.9752987 0.2145034 0.8151439 -0.9813659 0.2778058 0.7164413 -0.9857835 0.3449254 0.6605031 -0.9890637 0.4140176 0.6377128 -0.9915347 0.4831021 0.6393632 -0.9934166 0.550248 0.6578677 -0.9948617 0.6137599 0.6868911 -0.9959785 0.6723217 0.7214025 -0.9968458 0.7250697 0.7576402 -0.997522 0.7715919 0.7929907 -0.9980506 0.8118697 0.8258066 -0.9984649 0.8461864 0.8551958 -0.9987902 0.8750274 0.8808147 -0.999046 0.8989895 0.9026876 -0.9992473 0.9187089 0.9210616 -0.9994059 0.9348097 0.9363012 -0.999531 0.9478718 0.9488147 -0.9996296 0.9584137 0.9590083 -0.9997074 0.9668859 0.9672601 -0.9997689 0.9736717 0.9739069 -0.9998174 0.9790921 0.9792398 -0.9998557 0.9834126 0.9835052 -0.999886 0.9868503 0.9869083 -0.9999099 0.9895819 0.9896182 -0.9999288 0.99175 0.9917727 -0.9999437 0.9934694 0.9934837 -0.1572498 0.1623561 0.9669269 -0.1572031 0.1621254 0.9669173 -0.1571463 0.1618356 0.9669053 -0.1570779 0.1614723 0.9668902 -0.1569971 0.1610178 0.9668714 -0.156904 0.1604514 0.9668479 -0.1568008 0.1597484 0.9668187 -0.1566936 0.1588809 0.9667827 -0.1565954 0.1578187 0.9667385 -0.1565315 0.1565315 0.966685 -0.1580814 0.1565315 0.966685 -0.1600423 0.1565315 0.966685 -0.162523 0.1565315 0.966685 -0.1656615 0.1565315 0.966685 -0.169632 0.1565315 0.966685 -0.1746553 0.1565315 0.966685 -0.1810104 0.1565315 0.966685 -0.1890504 0.1565315 0.966685 -0.199222 0.1565315 0.966685 -0.2120905 0.1565315 0.966685 -0.2283708 0.1565315 0.966685 -0.2489674 0.1565315 0.966685 -0.2750249 0.1565315 0.966685 -0.307991 0.1565315 0.966685 -0.3496974 0.1565315 0.966685 -0.4024614 0.1565315 0.966685 -0.4692147 0.1565315 0.966685 -0.5536664 0.1565315 0.966685 -0.6605087 0.1565315 0.966685 -0.7956781 0.1565315 0.966685 -0.966685 0.1565315 0.966685 -0.9752692 0.2144168 0.8149113 -0.9813491 0.2777122 0.716146 -0.9857738 0.3448353 0.6602105 -0.9890579 0.4139373 0.637455 -0.9915312 0.4830346 0.6391518 -0.9934145 0.5501939 0.6577032 -0.9948604 0.6137183 0.686768 -0.9959777 0.6722907 0.7213133 -0.9968453 0.7250473 0.7575772 -0.9975217 0.7715762 0.7929472 -0.9980504 0.8118589 0.8257771 -0.9984648 0.8461791 0.8551761 -0.9987902 0.8750225 0.8808018 -0.9990459 0.8989863 0.9026791 -0.9992473 0.9187068 0.9210562 -0.9994059 0.9348083 0.9362977 -0.9995309 0.947871 0.9488124 -0.9996296 0.9584132 0.9590068 -0.9997074 0.9668855 0.9672592 -0.9997689 0.9736715 0.9739063 -0.9998174 0.979092 0.9792394 -0.9998557 0.9834125 0.9835049 -0.999886 0.9868502 0.9869082 -0.9999099 0.9895818 0.9896181 -0.9999288 0.99175 0.9917727 -0.9999437 0.9934694 0.9934836 -0.1572498 0.1638954 0.9669269 -0.1572031 0.1636651 0.9669173 -0.1571463 0.1633758 0.9669053 -0.1570779 0.1630131 0.9668902 -0.1569971 0.1625595 0.9668714 -0.156904 0.1619942 0.9668479 -0.1568008 0.1612925 0.9668187 -0.1566936 0.1604266 0.9667827 -0.1565954 0.1593662 0.9667385 -0.1565315 0.1580814 0.966685 -0.1565473 0.1565473 0.9666211 -0.1585117 0.1565473 0.9666211 -0.160997 0.1565473 0.9666211 -0.1641411 0.1565473 0.9666211 -0.1681189 0.1565473 0.9666211 -0.1731513 0.1565473 0.9666211 -0.1795179 0.1565473 0.9666211 -0.1875725 0.1565473 0.9666211 -0.1977627 0.1565473 0.9666211 -0.2106546 0.1565473 0.9666211 -0.2269644 0.1565473 0.9666211 -0.2475986 0.1565473 0.9666211 -0.2737034 0.1565473 0.9666211 -0.3067294 0.1565473 0.9666211 -0.3485116 0.1565473 0.9666211 -0.4013716 0.1565473 0.9666211 -0.4682463 0.1565473 0.9666211 -0.5528515 0.1565473 0.9666211 -0.6598881 0.1565473 0.9666211 -0.7953033 0.1565473 0.9666211 -0.9666211 0.1565473 0.9666211 -0.975234 0.2143816 0.8146336 -0.9813291 0.2776503 0.7157936 -0.9857621 0.3447636 0.6598616 -0.989051 0.4138668 0.6371476 -0.9915271 0.4829718 0.6388999 -0.993412 0.5501416 0.657507 -0.9948589 0.6136769 0.6866212 -0.9959768 0.6722594 0.7212069 -0.9968448 0.7250244 0.7575021 -0.9975213 0.7715599 0.7928954 -0.9980502 0.8118476 0.825742 -0.9984647 0.8461714 0.8551527 -0.9987901 0.8750173 0.8807863 -0.9990459 0.8989829 0.902669 -0.9992472 0.9187045 0.9210496 -0.9994059 0.9348069 0.9362935 -0.9995309 0.94787 0.9488097 -0.9996296 0.9584126 0.9590051 -0.9997074 0.9668852 0.9672581 -0.9997689 0.9736712 0.9739057 -0.9998174 0.9790919 0.979239 -0.9998557 0.9834124 0.9835047 -0.999886 0.9868502 0.986908 -0.9999099 0.9895818 0.989618 -0.9999288 0.99175 0.9917726 -0.9999437 0.9934694 0.9934836 -0.1572498 0.1658427 0.9669269 -0.1572031 0.165613 0.9669173 -0.1571463 0.1653244 0.9669053 -0.1570779 0.1649625 0.9668902 -0.1569971 0.16451 0.9668714 -0.156904 0.1639459 0.9668479 -0.1568008 0.1632458 0.9668187 -0.1566936 0.162382 0.9667827 -0.1565954 0.1613241 0.9667385 -0.1565315 0.1600423 0.966685 -0.1565473 0.1585117 0.9666211 -0.1567226 0.1567226 0.9665463 -0.1592131 0.1567226 0.9665463 -0.1623639 0.1567226 0.9665463 -0.1663501 0.1567226 0.9665463 -0.1713932 0.1567226 0.9665463 -0.1777733 0.1567226 0.9665463 -0.185845 0.1567226 0.9665463 -0.1960568 0.1567226 0.9665463 -0.208976 0.1567226 0.9665463 -0.2253205 0.1567226 0.9665463 -0.2459984 0.1567226 0.9665463 -0.2721586 0.1567226 0.9665463 -0.3052547 0.1567226 0.9665463 -0.3471256 0.1567226 0.9665463 -0.4000976 0.1567226 0.9665463 -0.4671142 0.1567226 0.9665463 -0.5518989 0.1567226 0.9665463 -0.6591625 0.1567226 0.9665463 -0.794865 0.1567226 0.9665463 -0.9665463 0.1567226 0.9665463 -0.9751928 0.2144566 0.8143091 -0.9813057 0.2776626 0.7153822 -0.9857485 0.3447407 0.6594543 -0.989043 0.4138277 0.6367889 -0.9915223 0.4829286 0.638606 -0.9934091 0.5501012 0.6572783 -0.9948571 0.6136427 0.6864501 -0.9959757 0.6722322 0.7210829 -0.9968441 0.7250039 0.7574146 -0.9975209 0.7715449 0.792835 -0.99805 0.811837 0.825701 -0.9984645 0.8461641 0.8551253 -0.99879 0.8750124 0.8807683 -0.9990458 0.8989796 0.9026573 -0.9992472 0.9187024 0.921042 -0.9994059 0.9348055 0.9362886 -0.9995309 0.9478691 0.9488066 -0.9996296 0.958412 0.9590032 -0.9997074 0.9668848 0.9672569 -0.9997689 0.973671 0.9739049 -0.9998174 0.9790917 0.9792385 -0.9998557 0.9834123 0.9835043 -0.999886 0.9868501 0.9869078 -0.9999099 0.9895818 0.9896179 -0.9999288 0.9917499 0.9917725 -0.9999437 0.9934694 0.9934835 -0.1572498 0.1683064 0.9669269 -0.1572031 0.1680773 0.9669173 -0.1571463 0.1677895 0.9669053 -0.1570779 0.1674288 0.9668902 -0.1569971 0.1669776 0.9668714 -0.156904 0.1664151 0.9668479 -0.1568008 0.1657171 0.9668187 -0.1566936 0.1648558 0.9667827 -0.1565954 0.1638011 0.9667385 -0.1565315 0.162523 0.966685 -0.1565473 0.160997 0.9666211 -0.1567226 0.1592131 0.9665463 -0.1571937 0.1571937 0.9664615 -0.1603521 0.1571937 0.9664615 -0.1643478 0.1571937 0.9664615 -0.169403 0.1571937 0.9664615 -0.1757984 0.1571937 0.9664615 -0.1838895 0.1571937 0.9664615 -0.1941257 0.1571937 0.9664615 -0.2070759 0.1571937 0.9664615 -0.2234595 0.1571937 0.9664615 -0.244187 0.1571937 0.9664615 -0.2704099 0.1571937 0.9664615 -0.3035853 0.1571937 0.9664615 -0.3455565 0.1571937 0.9664615 -0.3986555 0.1571937 0.9664615 -0.4658326 0.1571937 0.9664615 -0.5508205 0.1571937 0.9664615 -0.6583412 0.1571937 0.9664615 -0.7943688 0.1571937 0.9664615 -0.9664615 0.1571937 0.9664615 -0.9751462 0.2147432 0.8139421 -0.9812792 0.2778236 0.714917 -0.9857332 0.3448204 0.658994 -0.9890339 0.4138582 0.6363837 -0.9915169 0.4829319 0.6382742 -0.9934058 0.5500915 0.6570201 -0.9948551 0.6136284 0.6862569 -0.9959745 0.672218 0.720943 -0.9968433 0.7249916 0.7573158 -0.9975204 0.7715352 0.7927668 -0.9980497 0.8118298 0.8256548 -0.9984643 0.8461589 0.8550945 -0.9987899 0.8750088 0.880748 -0.9990458 0.8989771 0.902644 -0.9992472 0.9187008 0.9210335 -0.9994058 0.9348044 0.9362831 -0.9995309 0.9478684 0.9488031 -0.9996296 0.9584115 0.9590009 -0.9997074 0.9668845 0.9672555 -0.9997689 0.9736708 0.973904 -0.9998174 0.9790916 0.9792379 -0.9998557 0.9834122 0.983504 -0.999886 0.9868501 0.9869076 -0.9999099 0.9895817 0.9896177 -0.9999288 0.9917499 0.9917725 -0.9999437 0.9934694 0.9934835 -0.1572498 0.1714232 0.9669269 -0.1572031 0.171195 0.9669173 -0.1571463 0.1709083 0.9669053 -0.1570779 0.1705489 0.9668902 -0.1569971 0.1700994 0.9668714 -0.156904 0.169539 0.9668479 -0.1568008 0.1688437 0.9668187 -0.1566936 0.1679855 0.9667827 -0.1565954 0.1669347 0.9667385 -0.1565315 0.1656615 0.966685 -0.1565473 0.1641411 0.9666211 -0.1567226 0.1623639 0.9665463 -0.1571937 0.1603521 0.9664615 -0.15819 0.15819 0.9663702 -0.1621961 0.15819 0.9663702 -0.1672642 0.15819 0.9663702 -0.1736761 0.15819 0.9663702 -0.1817879 0.15819 0.9663702 -0.1920504 0.15819 0.9663702 -0.2050339 0.15819 0.9663702 -0.2214596 0.15819 0.9663702 -0.2422403 0.15819 0.9663702 -0.2685306 0.15819 0.9663702 -0.3017912 0.15819 0.9663702 -0.3438702 0.15819 0.9663702 -0.3971056 0.15819 0.9663702 -0.4644554 0.15819 0.9663702 -0.5496615 0.15819 0.9663702 -0.6574584 0.15819 0.9663702 -0.7938355 0.15819 0.9663702 -0.9663702 0.15819 0.9663702 -0.9750962 0.2154135 0.8135479 -0.9812508 0.2782606 0.7144178 -0.9857167 0.3450957 0.6585002 -0.9890241 0.4140252 0.6359492 -0.991511 0.4830292 0.6379184 -0.9934023 0.5501456 0.6567433 -0.994853 0.6136569 0.68605 -0.9959732 0.672232 0.720793 -0.9968425 0.7249978 0.7572101 -0.9975199 0.7715376 0.7926938 -0.9980494 0.8118303 0.8256054 -0.9984642 0.8461587 0.8550615 -0.9987897 0.8750084 0.8807262 -0.9990457 0.8989767 0.9026298 -0.9992471 0.9187004 0.9210243 -0.9994058 0.9348042 0.9362772 -0.9995309 0.9478683 0.9487993 -0.9996295 0.9584114 0.9589985 -0.9997074 0.9668844 0.9672539 -0.9997689 0.9736708 0.973903 -0.9998174 0.9790916 0.9792373 -0.9998557 0.9834122 0.9835036 -0.999886 0.98685 0.9869073 -0.9999099 0.9895817 0.9896176 -0.9999288 0.9917499 0.9917724 -0.9999437 0.9934694 0.9934834 -0.1572498 0.1753664 0.9669269 -0.1572031 0.1751393 0.9669173 -0.1571463 0.1748539 0.9669053 -0.1570779 0.1744962 0.9668902 -0.1569971 0.1740488 0.9668714 -0.156904 0.1734912 0.9668479 -0.1568008 0.1727991 0.9668187 -0.1566936 0.1719451 0.9667827 -0.1565954 0.1708992 0.9667385 -0.1565315 0.169632 0.966685 -0.1565473 0.1681189 0.9666211 -0.1567226 0.1663501 0.9665463 -0.1571937 0.1643478 0.9664615 -0.15819 0.1621961 0.9663702 -0.160092 0.160092 0.9662809 -0.1651729 0.160092 0.9662809 -0.1716008 0.160092 0.9662809 -0.179733 0.160092 0.9662809 -0.1900212 0.160092 0.9662809 -0.2030372 0.160092 0.9662809 -0.219504 0.160092 0.9662809 -0.2403368 0.160092 0.9662809 -0.2666929 0.160092 0.9662809 -0.3000369 0.160092 0.9662809 -0.3422213 0.160092 0.9662809 -0.3955901 0.160092 0.9662809 -0.4631086 0.160092 0.9662809 -0.5485282 0.160092 0.9662809 -0.6565952 0.160092 0.9662809 -0.7933139 0.160092 0.9662809 -0.9662809 0.160092 0.9662809 -0.9750472 0.2167545 0.8131627 -0.9812231 0.2791873 0.7139303 -0.9857006 0.3457234 0.6580183 -0.9890146 0.4144423 0.6355254 -0.9915054 0.4833013 0.6375715 -0.9933988 0.5503203 0.6564735 -0.9948509 0.6137675 0.6858483 -0.9959719 0.6723012 0.720647 -0.9968418 0.7250408 0.757107 -0.9975194 0.7715641 0.7926227 -0.9980491 0.8118466 0.8255572 -0.998464 0.8461687 0.8550293 -0.9987896 0.8750145 0.880705 -0.9990456 0.8989805 0.902616 -0.9992471 0.9187027 0.9210153 -0.9994058 0.9348056 0.9362715 -0.9995309 0.9478691 0.9487957 -0.9996295 0.958412 0.9589962 -0.9997074 0.9668847 0.9672525 -0.9997688 0.973671 0.9739021 -0.9998174 0.9790917 0.9792367 -0.9998557 0.9834123 0.9835032 -0.999886 0.9868501 0.9869071 -0.9999099 0.9895817 0.9896174 -0.9999288 0.9917499 0.9917723 -0.9999437 0.9934694 0.9934834 -0.1572498 0.180355 0.9669269 -0.1572031 0.1801293 0.9669173 -0.1571463 0.1798457 0.9669053 -0.1570779 0.1794901 0.9668902 -0.1569971 0.1790454 0.9668714 -0.156904 0.1784912 0.9668479 -0.1568008 0.1778032 0.9668187 -0.1566936 0.1769544 0.9667827 -0.1565954 0.1759149 0.9667385 -0.1565315 0.1746553 0.966685 -0.1565473 0.1731513 0.9666211 -0.1567226 0.1713932 0.9665463 -0.1571937 0.169403 0.9664615 -0.15819 0.1672642 0.9663702 -0.160092 0.1651729 0.9662809 -0.1635226 0.1635226 0.9662104 -0.1699632 0.1635226 0.9662104 -0.1781114 0.1635226 0.9662104 -0.1884199 0.1635226 0.9662104 -0.2014616 0.1635226 0.9662104 -0.2179609 0.1635226 0.9662104 -0.2388348 0.1635226 0.9662104 -0.2652429 0.1635226 0.9662104 -0.2986526 0.1635226 0.9662104 -0.3409202 0.1635226 0.9662104 -0.3943942 0.1635226 0.9662104 -0.4620458 0.1635226 0.9662104 -0.5476339 0.1635226 0.9662104 -0.655914 0.1635226 0.9662104 -0.7929023 0.1635226 0.9662104 -0.9662104 0.1635226 0.9662104 -0.9750086 0.2192389 0.812859 -0.9812013 0.2809573 0.7135461 -0.9856879 0.3469645 0.6576388 -0.9890072 0.4152991 0.6351916 -0.9915009 0.4838841 0.6372984 -0.9933961 0.5507113 0.6562612 -0.9948493 0.6140266 0.6856895 -0.9959709 0.6724711 0.720532 -0.9968411 0.7251511 0.7570259 -0.9975191 0.7716352 0.7925667 -0.9980488 0.8118921 0.8255193 -0.9984638 0.8461977 0.855004 -0.9987895 0.8750329 0.8806883 -0.9990456 0.8989921 0.9026051 -0.999247 0.9187101 0.9210083 -0.9994057 0.9348102 0.936267 -0.9995309 0.947872 0.9487928 -0.9996295 0.9584138 0.9589944 -0.9997074 0.9668859 0.9672513 -0.9997688 0.9736717 0.9739013 -0.9998174 0.9790921 0.9792363 -0.9998557 0.9834126 0.983503 -0.999886 0.9868503 0.9869069 -0.9999099 0.9895819 0.9896173 -0.9999288 0.99175 0.9917722 -0.9999437 0.9934694 0.9934833 -0.1572498 0.1866663 0.9669269 -0.1572031 0.1864423 0.9669173 -0.1571463 0.1861609 0.9669053 -0.1570779 0.185808 0.9668902 -0.1569971 0.1853668 0.9668714 -0.156904 0.1848168 0.9668479 -0.1568008 0.1841341 0.9668187 -0.1566936 0.1832918 0.9667827 -0.1565954 0.1822603 0.9667385 -0.1565315 0.1810104 0.966685 -0.1565473 0.1795179 0.9666211 -0.1567226 0.1777733 0.9665463 -0.1571937 0.1757984 0.9664615 -0.15819 0.1736761 0.9663702 -0.160092 0.1716008 0.9662809 -0.1635226 0.1699632 0.9662104 -0.1694384 0.1694384 0.9661878 -0.1775917 0.1694384 0.9661878 -0.1879067 0.1694384 0.9661878 -0.2009566 0.1694384 0.9661878 -0.2174663 0.1694384 0.9661878 -0.2383533 0.1694384 0.9661878 -0.2647781 0.1694384 0.9661878 -0.2982089 0.1694384 0.9661878 -0.3405032 0.1694384 0.9661878 -0.3940109 0.1694384 0.9661878 -0.4617052 0.1694384 0.9661878 -0.5473473 0.1694384 0.9661878 -0.6556956 0.1694384 0.9661878 -0.7927704 0.1694384 0.9661878 -0.9661878 0.1694384 0.9661878 -0.9749962 0.2235962 0.8127617 -0.9811943 0.2841192 0.713423 -0.9856839 0.3492254 0.6575172 -0.9890048 0.4168922 0.6350848 -0.9914995 0.4849907 0.637211 -0.9933953 0.5514695 0.6561933 -0.9948487 0.6145393 0.6856388 -0.9959706 0.6728136 0.7204952 -0.9968409 0.7253775 0.757 -0.9975189 0.7717834 0.7925488 -0.9980488 0.8119884 0.8255071 -0.9984638 0.8462598 0.8549959 -0.9987895 0.8750727 0.880683 -0.9990455 0.8990175 0.9026016 -0.999247 0.9187262 0.9210061 -0.9994057 0.9348204 0.9362655 -0.9995308 0.9478785 0.9487918 -0.9996295 0.9584178 0.9589938 -0.9997074 0.9668884 0.9672509 -0.9997688 0.9736733 0.9739011 -0.9998174 0.9790931 0.9792361 -0.9998557 0.9834132 0.9835029 -0.999886 0.9868507 0.9869069 -0.9999099 0.9895821 0.9896173 -0.9999288 0.9917502 0.9917722 -0.9999437 0.9934695 0.9934833 -0.1572498 0.1946509 0.9669269 -0.1572031 0.1944291 0.9669173 -0.1571463 0.1941504 0.9669053 -0.1570779 0.1938011 0.9668902 -0.1569971 0.1933641 0.9668714 -0.156904 0.1928195 0.9668479 -0.1568008 0.1921435 0.9668187 -0.1566936 0.1913094 0.9667827 -0.1565954 0.190288 0.9667385 -0.1565315 0.1890504 0.966685 -0.1565473 0.1875725 0.9666211 -0.1567226 0.185845 0.9665463 -0.1571937 0.1838895 0.9664615 -0.15819 0.1817879 0.9663702 -0.160092 0.179733 0.9662809 -0.1635226 0.1781114 0.9662104 -0.1694384 0.1775917 0.9661878 -0.1775917 0.1775917 0.9661878 -0.1879067 0.1775917 0.9661878 -0.2009566 0.1775917 0.9661878 -0.2174663 0.1775917 0.9661878 -0.2383533 0.1775917 0.9661878 -0.2647781 0.1775917 0.9661878 -0.2982089 0.1775917 0.9661878 -0.3405032 0.1775917 0.9661878 -0.3940109 0.1775917 0.9661878 -0.4617052 0.1775917 0.9661878 -0.5473473 0.1775917 0.9661878 -0.6556956 0.1775917 0.9661878 -0.7927704 0.1775917 0.9661878 -0.9661878 0.1775917 0.9661878 -0.9749962 0.2296253 0.8127617 -0.9811943 0.2885124 0.713423 -0.9856839 0.3523802 0.6575172 -0.9890048 0.419125 0.6350848 -0.9914995 0.4865484 0.637211 -0.9933953 0.5525411 0.6561933 -0.9948487 0.6152669 0.6856388 -0.9959706 0.6733015 0.7204952 -0.9968409 0.7257011 0.757 -0.9975189 0.7719959 0.7925488 -0.9980488 0.8121268 0.8255071 -0.9984638 0.8463492 0.8549959 -0.9987895 0.8751301 0.880683 -0.9990455 0.8990542 0.9026016 -0.999247 0.9187495 0.9210061 -0.9994057 0.9348352 0.9362655 -0.9995308 0.9478878 0.9487918 -0.9996295 0.9584237 0.9589938 -0.9997074 0.9668922 0.9672509 -0.9997688 0.9736756 0.9739011 -0.9998174 0.9790946 0.9792361 -0.9998557 0.9834141 0.9835029 -0.999886 0.9868512 0.9869069 -0.9999099 0.9895825 0.9896173 -0.9999288 0.9917504 0.9917722 -0.9999437 0.9934697 0.9934833 -0.1572498 0.2047525 0.9669269 -0.1572031 0.2045334 0.9669173 -0.1571463 0.2042583 0.9669053 -0.1570779 0.2039133 0.9668902 -0.1569971 0.2034818 0.9668714 -0.156904 0.202944 0.9668479 -0.1568008 0.2022765 0.9668187 -0.1566936 0.2014528 0.9667827 -0.1565954 0.2004442 0.9667385 -0.1565315 0.199222 0.966685 -0.1565473 0.1977627 0.9666211 -0.1567226 0.1960568 0.9665463 -0.1571937 0.1941257 0.9664615 -0.15819 0.1920504 0.9663702 -0.160092 0.1900212 0.9662809 -0.1635226 0.1884199 0.9662104 -0.1694384 0.1879067 0.9661878 -0.1775917 0.1879067 0.9661878 -0.1879067 0.1879067 0.9661878 -0.2009566 0.1879067 0.9661878 -0.2174663 0.1879067 0.9661878 -0.2383533 0.1879067 0.9661878 -0.2647781 0.1879067 0.9661878 -0.2982089 0.1879067 0.9661878 -0.3405032 0.1879067 0.9661878 -0.3940109 0.1879067 0.9661878 -0.4617052 0.1879067 0.9661878 -0.5473473 0.1879067 0.9661878 -0.6556956 0.1879067 0.9661878 -0.7927704 0.1879067 0.9661878 -0.9661878 0.1879067 0.9661878 -0.9749962 0.2372529 0.8127617 -0.9811943 0.2940703 0.713423 -0.9856839 0.3563715 0.6575172 -0.9890048 0.4219498 0.6350848 -0.9914995 0.4885191 0.637211 -0.9933953 0.5538969 0.6561933 -0.9948487 0.6161874 0.6856388 -0.9959706 0.6739188 0.7204952 -0.9968409 0.7261105 0.757 -0.9975189 0.7722648 0.7925488 -0.9980488 0.8123018 0.8255071 -0.9984638 0.8464623 0.8549959 -0.9987895 0.8752028 0.880683 -0.9990455 0.8991006 0.9026016 -0.999247 0.9187791 0.9210061 -0.9994057 0.9348539 0.9362655 -0.9995308 0.9478997 0.9487918 -0.9996295 0.9584312 0.9589938 -0.9997074 0.9668969 0.9672509 -0.9997688 0.9736786 0.9739011 -0.9998174 0.9790965 0.9792361 -0.9998557 0.9834153 0.9835029 -0.999886 0.986852 0.9869069 -0.9999099 0.9895829 0.9896173 -0.9999288 0.9917507 0.9917722 -0.9999437 0.9934698 0.9934833 -0.1572498 0.2175323 0.9669269 -0.1572031 0.2173167 0.9669173 -0.1571463 0.217046 0.9669053 -0.1570779 0.2167065 0.9668902 -0.1569971 0.2162819 0.9668714 -0.156904 0.2157528 0.9668479 -0.1568008 0.215096 0.9668187 -0.1566936 0.2142855 0.9667827 -0.1565954 0.2132931 0.9667385 -0.1565315 0.2120905 0.966685 -0.1565473 0.2106546 0.9666211 -0.1567226 0.208976 0.9665463 -0.1571937 0.2070759 0.9664615 -0.15819 0.2050339 0.9663702 -0.160092 0.2030372 0.9662809 -0.1635226 0.2014616 0.9662104 -0.1694384 0.2009566 0.9661878 -0.1775917 0.2009566 0.9661878 -0.1879067 0.2009566 0.9661878 -0.2009566 0.2009566 0.9661878 -0.2174663 0.2009566 0.9661878 -0.2383533 0.2009566 0.9661878 -0.2647781 0.2009566 0.9661878 -0.2982089 0.2009566 0.9661878 -0.3405032 0.2009566 0.9661878 -0.3940109 0.2009566 0.9661878 -0.4617052 0.2009566 0.9661878 -0.5473473 0.2009566 0.9661878 -0.6556956 0.2009566 0.9661878 -0.7927704 0.2009566 0.9661878 -0.9661878 0.2009566 0.9661878 -0.9749962 0.2469027 0.8127617 -0.9811943 0.3011018 0.713423 -0.9856839 0.3614209 0.6575172 -0.9890048 0.4255236 0.6350848 -0.9914995 0.4910123 0.637211 -0.9933953 0.5556122 0.6561933 -0.9948487 0.6173519 0.6856388 -0.9959706 0.6746998 0.7204952 -0.9968409 0.7266285 0.757 -0.9975189 0.7726049 0.7925488 -0.9980488 0.8125232 0.8255071 -0.9984638 0.8466054 0.8549959 -0.9987895 0.8752947 0.880683 -0.9990455 0.8991593 0.9026016 -0.999247 0.9188164 0.9210061 -0.9994057 0.9348776 0.9362655 -0.9995308 0.9479146 0.9487918 -0.9996295 0.9584406 0.9589938 -0.9997074 0.9669028 0.9672509 -0.9997688 0.9736823 0.9739011 -0.9998174 0.9790988 0.9792361 -0.9998557 0.9834167 0.9835029 -0.999886 0.9868529 0.9869069 -0.9999099 0.9895835 0.9896173 -0.9999288 0.991751 0.9917722 -0.9999437 0.9934701 0.9934833 -0.1572498 0.2337004 0.9669269 -0.1572031 0.2334893 0.9669173 -0.1571463 0.2332241 0.9669053 -0.1570779 0.2328916 0.9668902 -0.1569971 0.2324758 0.9668714 -0.156904 0.2319575 0.9668479 -0.1568008 0.2313143 0.9668187 -0.1566936 0.2305205 0.9667827 -0.1565954 0.2295486 0.9667385 -0.1565315 0.2283708 0.966685 -0.1565473 0.2269644 0.9666211 -0.1567226 0.2253205 0.9665463 -0.1571937 0.2234595 0.9664615 -0.15819 0.2214596 0.9663702 -0.160092 0.219504 0.9662809 -0.1635226 0.2179609 0.9662104 -0.1694384 0.2174663 0.9661878 -0.1775917 0.2174663 0.9661878 -0.1879067 0.2174663 0.9661878 -0.2009566 0.2174663 0.9661878 -0.2174663 0.2174663 0.9661878 -0.2383533 0.2174663 0.9661878 -0.2647781 0.2174663 0.9661878 -0.2982089 0.2174663 0.9661878 -0.3405032 0.2174663 0.9661878 -0.3940109 0.2174663 0.9661878 -0.4617052 0.2174663 0.9661878 -0.5473473 0.2174663 0.9661878 -0.6556956 0.2174663 0.9661878 -0.7927704 0.2174663 0.9661878 -0.9661878 0.2174663 0.9661878 -0.9749962 0.2591111 0.8127617 -0.9811943 0.3099976 0.713423 -0.9856839 0.3678092 0.6575172 -0.9890048 0.4300448 0.6350848 -0.9914995 0.4941665 0.637211 -0.9933953 0.5577822 0.6561933 -0.9948487 0.6188252 0.6856388 -0.9959706 0.6756878 0.7204952 -0.9968409 0.7272837 0.757 -0.9975189 0.7730352 0.7925488 -0.9980488 0.8128033 0.8255071 -0.9984638 0.8467864 0.8549959 -0.9987895 0.8754109 0.880683 -0.9990455 0.8992336 0.9026016 -0.999247 0.9188636 0.9210061 -0.9994057 0.9349075 0.9362655 -0.9995308 0.9479335 0.9487918 -0.9996295 0.9584526 0.9589938 -0.9997074 0.9669103 0.9672509 -0.9997688 0.973687 0.9739011 -0.9998174 0.9791018 0.9792361 -0.9998557 0.9834186 0.9835029 -0.999886 0.9868541 0.9869069 -0.9999099 0.9895842 0.9896173 -0.9999288 0.9917515 0.9917722 -0.9999437 0.9934704 0.9934833 -0.1572498 0.2541551 0.9669269 -0.1572031 0.2539496 0.9669173 -0.1571463 0.2536915 0.9669053 -0.1570779 0.2533679 0.9668902 -0.1569971 0.2529632 0.9668714 -0.156904 0.2524587 0.9668479 -0.1568008 0.2518326 0.9668187 -0.1566936 0.25106 0.9667827 -0.1565954 0.2501139 0.9667385 -0.1565315 0.2489674 0.966685 -0.1565473 0.2475986 0.9666211 -0.1567226 0.2459984 0.9665463 -0.1571937 0.244187 0.9664615 -0.15819 0.2422403 0.9663702 -0.160092 0.2403368 0.9662809 -0.1635226 0.2388348 0.9662104 -0.1694384 0.2383533 0.9661878 -0.1775917 0.2383533 0.9661878 -0.1879067 0.2383533 0.9661878 -0.2009566 0.2383533 0.9661878 -0.2174663 0.2383533 0.9661878 -0.2383533 0.2383533 0.9661878 -0.2647781 0.2383533 0.9661878 -0.2982089 0.2383533 0.9661878 -0.3405032 0.2383533 0.9661878 -0.3940109 0.2383533 0.9661878 -0.4617052 0.2383533 0.9661878 -0.5473473 0.2383533 0.9661878 -0.6556956 0.2383533 0.9661878 -0.7927704 0.2383533 0.9661878 -0.9661878 0.2383533 0.9661878 -0.9749962 0.2745562 0.8127617 -0.9811943 0.3212519 0.713423 -0.9856839 0.3758911 0.6575172 -0.9890048 0.4357648 0.6350848 -0.9914995 0.498157 0.637211 -0.9933953 0.5605276 0.6561933 -0.9948487 0.6206891 0.6856388 -0.9959706 0.6769378 0.7204952 -0.9968409 0.7281127 0.757 -0.9975189 0.7735795 0.7925488 -0.9980488 0.8131577 0.8255071 -0.9984638 0.8470154 0.8549959 -0.9987895 0.875558 0.880683 -0.9990455 0.8993275 0.9026016 -0.999247 0.9189234 0.9210061 -0.9994057 0.9349454 0.9362655 -0.9995308 0.9479575 0.9487918 -0.9996295 0.9584677 0.9589938 -0.9997074 0.9669198 0.9672509 -0.9997688 0.973693 0.9739011 -0.9998174 0.9791055 0.9792361 -0.9998557 0.9834209 0.9835029 -0.999886 0.9868555 0.9869069 -0.9999099 0.9895851 0.9896173 -0.9999288 0.9917521 0.9917722 -0.9999437 0.9934707 0.9934833 -0.1572498 0.280033 0.9669269 -0.1572031 0.2798347 0.9669173 -0.1571463 0.2795855 0.9669053 -0.1570779 0.2792731 0.9668902 -0.1569971 0.2788823 0.9668714 -0.156904 0.2783953 0.9668479 -0.1568008 0.2777909 0.9668187 -0.1566936 0.277045 0.9667827 -0.1565954 0.2761317 0.9667385 -0.1565315 0.2750249 0.966685 -0.1565473 0.2737034 0.9666211 -0.1567226 0.2721586 0.9665463 -0.1571937 0.2704099 0.9664615 -0.15819 0.2685306 0.9663702 -0.160092 0.2666929 0.9662809 -0.1635226 0.2652429 0.9662104 -0.1694384 0.2647781 0.9661878 -0.1775917 0.2647781 0.9661878 -0.1879067 0.2647781 0.9661878 -0.2009566 0.2647781 0.9661878 -0.2174663 0.2647781 0.9661878 -0.2383533 0.2647781 0.9661878 -0.2647781 0.2647781 0.9661878 -0.2982089 0.2647781 0.9661878 -0.3405032 0.2647781 0.9661878 -0.3940109 0.2647781 0.9661878 -0.4617052 0.2647781 0.9661878 -0.5473473 0.2647781 0.9661878 -0.6556956 0.2647781 0.9661878 -0.7927704 0.2647781 0.9661878 -0.9661878 0.2647781 0.9661878 -0.9749962 0.2940963 0.8127617 -0.9811943 0.3354901 0.713423 -0.9856839 0.3861159 0.6575172 -0.9890048 0.4430013 0.6350848 -0.9914995 0.5032055 0.637211 -0.9933953 0.5640008 0.6561933 -0.9948487 0.6230471 0.6856388 -0.9959706 0.6785192 0.7204952 -0.9968409 0.7291615 0.757 -0.9975189 0.7742682 0.7925488 -0.9980488 0.8136061 0.8255071 -0.9984638 0.8473052 0.8549959 -0.9987895 0.8757441 0.880683 -0.9990455 0.8994464 0.9026016 -0.999247 0.918999 0.9210061 -0.9994057 0.9349933 0.9362655 -0.9995308 0.9479878 0.9487918 -0.9996295 0.9584868 0.9589938 -0.9997074 0.9669318 0.9672509 -0.9997688 0.9737006 0.9739011 -0.9998174 0.9791103 0.9792361 -0.9998557 0.9834239 0.9835029 -0.999886 0.9868574 0.9869069 -0.9999099 0.9895863 0.9896173 -0.9999288 0.9917528 0.9917722 -0.9999437 0.9934712 0.9934833 -0.1572498 0.3127719 0.9669269 -0.1572031 0.3125826 0.9669173 -0.1571463 0.3123447 0.9669053 -0.1570779 0.3120464 0.9668902 -0.1569971 0.3116735 0.9668714 -0.156904 0.3112085 0.9668479 -0.1568008 0.3106315 0.9668187 -0.1566936 0.3099195 0.9667827 -0.1565954 0.3090475 0.9667385 -0.1565315 0.307991 0.966685 -0.1565473 0.3067294 0.9666211 -0.1567226 0.3052547 0.9665463 -0.1571937 0.3035853 0.9664615 -0.15819 0.3017912 0.9663702 -0.160092 0.3000369 0.9662809 -0.1635226 0.2986526 0.9662104 -0.1694384 0.2982089 0.9661878 -0.1775917 0.2982089 0.9661878 -0.1879067 0.2982089 0.9661878 -0.2009566 0.2982089 0.9661878 -0.2174663 0.2982089 0.9661878 -0.2383533 0.2982089 0.9661878 -0.2647781 0.2982089 0.9661878 -0.2982089 0.2982089 0.9661878 -0.3405032 0.2982089 0.9661878 -0.3940109 0.2982089 0.9661878 -0.4617052 0.2982089 0.9661878 -0.5473473 0.2982089 0.9661878 -0.6556956 0.2982089 0.9661878 -0.7927704 0.2982089 0.9661878 -0.9661878 0.2982089 0.9661878 -0.9749962 0.3188171 0.8127617 -0.9811943 0.3535032 0.713423 -0.9856839 0.3990515 0.6575172 -0.9890048 0.4521565 0.6350848 -0.9914995 0.5095925 0.637211 -0.9933953 0.5683949 0.6561933 -0.9948487 0.6260304 0.6856388 -0.9959706 0.6805199 0.7204952 -0.9968409 0.7304884 0.757 -0.9975189 0.7751395 0.7925488 -0.9980488 0.8141733 0.8255071 -0.9984638 0.8476717 0.8549959 -0.9987895 0.8759795 0.880683 -0.9990455 0.8995968 0.9026016 -0.999247 0.9190947 0.9210061 -0.9994057 0.935054 0.9362655 -0.9995308 0.9480261 0.9487918 -0.9996295 0.9585109 0.9589938 -0.9997074 0.966947 0.9672509 -0.9997688 0.9737101 0.9739011 -0.9998174 0.9791163 0.9792361 -0.9998557 0.9834277 0.9835029 -0.999886 0.9868597 0.9869069 -0.9999099 0.9895878 0.9896173 -0.9999288 0.9917537 0.9917722 -0.9999437 0.9934718 0.9934833 -0.1572498 0.3541909 0.9669269 -0.1572031 0.3540129 0.9669173 -0.1571463 0.3537894 0.9669053 -0.1570779 0.353509 0.9668902 -0.1569971 0.3531585 0.9668714 -0.156904 0.3527215 0.9668479 -0.1568008 0.3521792 0.9668187 -0.1566936 0.3515099 0.9667827 -0.1565954 0.3506904 0.9667385 -0.1565315 0.3496974 0.966685 -0.1565473 0.3485116 0.9666211 -0.1567226 0.3471256 0.9665463 -0.1571937 0.3455565 0.9664615 -0.15819 0.3438702 0.9663702 -0.160092 0.3422213 0.9662809 -0.1635226 0.3409202 0.9662104 -0.1694384 0.3405032 0.9661878 -0.1775917 0.3405032 0.9661878 -0.1879067 0.3405032 0.9661878 -0.2009566 0.3405032 0.9661878 -0.2174663 0.3405032 0.9661878 -0.2383533 0.3405032 0.9661878 -0.2647781 0.3405032 0.9661878 -0.2982089 0.3405032 0.9661878 -0.3405032 0.3405032 0.9661878 -0.3940109 0.3405032 0.9661878 -0.4617052 0.3405032 0.9661878 -0.5473473 0.3405032 0.9661878 -0.6556956 0.3405032 0.9661878 -0.7927704 0.3405032 0.9661878 -0.9661878 0.3405032 0.9661878 -0.9749962 0.3500921 0.8127617 -0.9811943 0.3762922 0.713423 -0.9856839 0.4154167 0.6575172 -0.9890048 0.4637389 0.6350848 -0.9914995 0.5176729 0.637211 -0.9933953 0.573954 0.6561933 -0.9948487 0.6298046 0.6856388 -0.9959706 0.683051 0.7204952 -0.9968409 0.732167 0.757 -0.9975189 0.7762418 0.7925488 -0.9980488 0.8148909 0.8255071 -0.9984638 0.8481355 0.8549959 -0.9987895 0.8762773 0.880683 -0.9990455 0.899787 0.9026016 -0.999247 0.9192157 0.9210061 -0.9994057 0.9351307 0.9362655 -0.9995308 0.9480746 0.9487918 -0.9996295 0.9585415 0.9589938 -0.9997074 0.9669663 0.9672509 -0.9997688 0.9737222 0.9739011 -0.9998174 0.9791238 0.9792361 -0.9998557 0.9834324 0.9835029 -0.999886 0.9868627 0.9869069 -0.9999099 0.9895897 0.9896173 -0.9999288 0.9917549 0.9917722 -0.9999437 0.9934725 0.9934833 -0.1572498 0.4065913 0.9669269 -0.1572031 0.4064278 0.9669173 -0.1571463 0.4062223 0.9669053 -0.1570779 0.4059646 0.9668902 -0.1569971 0.4056424 0.9668714 -0.156904 0.4052408 0.9668479 -0.1568008 0.4047424 0.9668187 -0.1566936 0.4041273 0.9667827 -0.1565954 0.4033741 0.9667385 -0.1565315 0.4024614 0.966685 -0.1565473 0.4013716 0.9666211 -0.1567226 0.4000976 0.9665463 -0.1571937 0.3986555 0.9664615 -0.15819 0.3971056 0.9663702 -0.160092 0.3955901 0.9662809 -0.1635226 0.3943942 0.9662104 -0.1694384 0.3940109 0.9661878 -0.1775917 0.3940109 0.9661878 -0.1879067 0.3940109 0.9661878 -0.2009566 0.3940109 0.9661878 -0.2174663 0.3940109 0.9661878 -0.2383533 0.3940109 0.9661878 -0.2647781 0.3940109 0.9661878 -0.2982089 0.3940109 0.9661878 -0.3405032 0.3940109 0.9661878 -0.3940109 0.3940109 0.9661878 -0.4617052 0.3940109 0.9661878 -0.5473473 0.3940109 0.9661878 -0.6556956 0.3940109 0.9661878 -0.7927704 0.3940109 0.9661878 -0.9661878 0.3940109 0.9661878 -0.9749962 0.389659 0.8127617 -0.9811943 0.4051232 0.713423 -0.9856839 0.4361208 0.6575172 -0.9890048 0.4783922 0.6350848 -0.9914995 0.5278957 0.637211 -0.9933953 0.580987 0.6561933 -0.9948487 0.6345795 0.6856388 -0.9959706 0.6862532 0.7204952 -0.9968409 0.7342907 0.757 -0.9975189 0.7776364 0.7925488 -0.9980488 0.8157988 0.8255071 -0.9984638 0.8487222 0.8549959 -0.9987895 0.8766541 0.880683 -0.9990455 0.9000277 0.9026016 -0.999247 0.9193688 0.9210061 -0.9994057 0.9352277 0.9362655 -0.9995308 0.9481359 0.9487918 -0.9996295 0.9585802 0.9589938 -0.9997074 0.9669906 0.9672509 -0.9997688 0.9737375 0.9739011 -0.9998174 0.9791334 0.9792361 -0.9998557 0.9834385 0.9835029 -0.999886 0.9868665 0.9869069 -0.9999099 0.989592 0.9896173 -0.9999288 0.9917564 0.9917722 -0.9999437 0.9934734 0.9934833 -0.1572498 0.4728847 0.9669269 -0.1572031 0.4727393 0.9669173 -0.1571463 0.4725567 0.9669053 -0.1570779 0.4723278 0.9668902 -0.1569971 0.4720415 0.9668714 -0.156904 0.4716846 0.9668479 -0.1568008 0.4712417 0.9668187 -0.1566936 0.4706951 0.9667827 -0.1565954 0.4700258 0.9667385 -0.1565315 0.4692147 0.966685 -0.1565473 0.4682463 0.9666211 -0.1567226 0.4671142 0.9665463 -0.1571937 0.4658326 0.9664615 -0.15819 0.4644554 0.9663702 -0.160092 0.4631086 0.9662809 -0.1635226 0.4620458 0.9662104 -0.1694384 0.4617052 0.9661878 -0.1775917 0.4617052 0.9661878 -0.1879067 0.4617052 0.9661878 -0.2009566 0.4617052 0.9661878 -0.2174663 0.4617052 0.9661878 -0.2383533 0.4617052 0.9661878 -0.2647781 0.4617052 0.9661878 -0.2982089 0.4617052 0.9661878 -0.3405032 0.4617052 0.9661878 -0.3940109 0.4617052 0.9661878 -0.4617052 0.4617052 0.9661878 -0.5473473 0.4617052 0.9661878 -0.6556956 0.4617052 0.9661878 -0.7927704 0.4617052 0.9661878 -0.9661878 0.4617052 0.9661878 -0.9749962 0.4397163 0.8127617 -0.9811943 0.4415982 0.713423 -0.9856839 0.4623142 0.6575172 -0.9890048 0.4969305 0.6350848 -0.9914995 0.5408288 0.637211 -0.9933953 0.5898847 0.6561933 -0.9948487 0.6406203 0.6856388 -0.9959706 0.6903044 0.7204952 -0.9968409 0.7369774 0.757 -0.9975189 0.7794007 0.7925488 -0.9980488 0.8169474 0.8255071 -0.9984638 0.8494644 0.8549959 -0.9987895 0.8771307 0.880683 -0.9990455 0.9003323 0.9026016 -0.999247 0.9195625 0.9210061 -0.9994057 0.9353505 0.9362655 -0.9995308 0.9482135 0.9487918 -0.9996295 0.9586291 0.9589938 -0.9997074 0.9670214 0.9672509 -0.9997688 0.9737569 0.9739011 -0.9998174 0.9791456 0.9792361 -0.9998557 0.9834461 0.9835029 -0.999886 0.9868713 0.9869069 -0.9999099 0.989595 0.9896173 -0.9999288 0.9917582 0.9917722 -0.9999437 0.9934746 0.9934833 -0.1572498 0.5567544 0.9669269 -0.1572031 0.5566321 0.9669173 -0.1571463 0.5564784 0.9669053 -0.1570779 0.5562858 0.9668902 -0.1569971 0.5560449 0.9668714 -0.156904 0.5557446 0.9668479 -0.1568008 0.5553719 0.9668187 -0.1566936 0.554912 0.9667827 -0.1565954 0.5543488 0.9667385 -0.1565315 0.5536664 0.966685 -0.1565473 0.5528515 0.9666211 -0.1567226 0.5518989 0.9665463 -0.1571937 0.5508205 0.9664615 -0.15819 0.5496615 0.9663702 -0.160092 0.5485282 0.9662809 -0.1635226 0.5476339 0.9662104 -0.1694384 0.5473473 0.9661878 -0.1775917 0.5473473 0.9661878 -0.1879067 0.5473473 0.9661878 -0.2009566 0.5473473 0.9661878 -0.2174663 0.5473473 0.9661878 -0.2383533 0.5473473 0.9661878 -0.2647781 0.5473473 0.9661878 -0.2982089 0.5473473 0.9661878 -0.3405032 0.5473473 0.9661878 -0.3940109 0.5473473 0.9661878 -0.4617052 0.5473473 0.9661878 -0.5473473 0.5473473 0.9661878 -0.6556956 0.5473473 0.9661878 -0.7927704 0.5473473 0.9661878 -0.9661878 0.5473473 0.9661878 -0.9749962 0.5030453 0.8127617 -0.9811943 0.4877437 0.713423 -0.9856839 0.4954523 0.6575172 -0.9890048 0.5203839 0.6350848 -0.9914995 0.5571908 0.637211 -0.9933953 0.6011414 0.6561933 -0.9948487 0.6482627 0.6856388 -0.9959706 0.6954296 0.7204952 -0.9968409 0.7403765 0.757 -0.9975189 0.7816327 0.7925488 -0.9980488 0.8184005 0.8255071 -0.9984638 0.8504035 0.8549959 -0.9987895 0.8777338 0.880683 -0.9990455 0.9007175 0.9026016 -0.999247 0.9198076 0.9210061 -0.9994057 0.9355059 0.9362655 -0.9995308 0.9483117 0.9487918 -0.9996295 0.958691 0.9589938 -0.9997074 0.9670604 0.9672509 -0.9997688 0.9737814 0.9739011 -0.9998174 0.979161 0.9792361 -0.9998557 0.9834557 0.9835029 -0.999886 0.9868773 0.9869069 -0.9999099 0.9895988 0.9896173 -0.9999288 0.9917606 0.9917722 -0.9999437 0.9934761 0.9934833 -0.1572498 0.6628604 0.9669269 -0.1572031 0.6627673 0.9669173 -0.1571463 0.6626503 0.9669053 -0.1570779 0.6625036 0.9668902 -0.1569971 0.6623201 0.9668714 -0.156904 0.6620914 0.9668479 -0.1568008 0.6618076 0.9668187 -0.1566936 0.6614574 0.9667827 -0.1565954 0.6610284 0.9667385 -0.1565315 0.6605087 0.966685 -0.1565473 0.6598881 0.9666211 -0.1567226 0.6591625 0.9665463 -0.1571937 0.6583412 0.9664615 -0.15819 0.6574584 0.9663702 -0.160092 0.6565952 0.9662809 -0.1635226 0.655914 0.9662104 -0.1694384 0.6556956 0.9661878 -0.1775917 0.6556956 0.9661878 -0.1879067 0.6556956 0.9661878 -0.2009566 0.6556956 0.9661878 -0.2174663 0.6556956 0.9661878 -0.2383533 0.6556956 0.9661878 -0.2647781 0.6556956 0.9661878 -0.2982089 0.6556956 0.9661878 -0.3405032 0.6556956 0.9661878 -0.3940109 0.6556956 0.9661878 -0.4617052 0.6556956 0.9661878 -0.5473473 0.6556956 0.9661878 -0.6556956 0.6556956 0.9661878 -0.7927704 0.6556956 0.9661878 -0.9661878 0.6556956 0.9661878 -0.9749962 0.5831647 0.8127617 -0.9811943 0.5461239 0.713423 -0.9856839 0.5373763 0.6575172 -0.9890048 0.5500554 0.6350848 -0.9914995 0.577891 0.637211 -0.9933953 0.6153825 0.6561933 -0.9948487 0.6579314 0.6856388 -0.9959706 0.7019138 0.7204952 -0.9968409 0.7446768 0.757 -0.9975189 0.7844566 0.7925488 -0.9980488 0.8202389 0.8255071 -0.9984638 0.8515915 0.8549959 -0.9987895 0.8784967 0.880683 -0.9990455 0.9012049 0.9026016 -0.999247 0.9201176 0.9210061 -0.9994057 0.9357024 0.9362655 -0.9995308 0.9484359 0.9487918 -0.9996295 0.9587693 0.9589938 -0.9997074 0.9671097 0.9672509 -0.9997688 0.9738123 0.9739011 -0.9998174 0.9791804 0.9792361 -0.9998557 0.9834679 0.9835029 -0.999886 0.986885 0.9869069 -0.9999099 0.9896036 0.9896173 -0.9999288 0.9917636 0.9917722 -0.9999437 0.9934779 0.9934833 -0.1572498 0.7970984 0.9669269 -0.1572031 0.7970422 0.9669173 -0.1571463 0.7969715 0.9669053 -0.1570779 0.7968829 0.9668902 -0.1569971 0.7967721 0.9668714 -0.156904 0.796634 0.9668479 -0.1568008 0.7964626 0.9668187 -0.1566936 0.7962511 0.9667827 -0.1565954 0.795992 0.9667385 -0.1565315 0.7956781 0.966685 -0.1565473 0.7953033 0.9666211 -0.1567226 0.794865 0.9665463 -0.1571937 0.7943688 0.9664615 -0.15819 0.7938355 0.9663702 -0.160092 0.7933139 0.9662809 -0.1635226 0.7929023 0.9662104 -0.1694384 0.7927704 0.9661878 -0.1775917 0.7927704 0.9661878 -0.1879067 0.7927704 0.9661878 -0.2009566 0.7927704 0.9661878 -0.2174663 0.7927704 0.9661878 -0.2383533 0.7927704 0.9661878 -0.2647781 0.7927704 0.9661878 -0.2982089 0.7927704 0.9661878 -0.3405032 0.7927704 0.9661878 -0.3940109 0.7927704 0.9661878 -0.4617052 0.7927704 0.9661878 -0.5473473 0.7927704 0.9661878 -0.6556956 0.7927704 0.9661878 -0.7927704 0.7927704 0.9661878 -0.9661878 0.7927704 0.9661878 -0.9749962 0.6845262 0.8127617 -0.9811943 0.6199824 0.713423 -0.9856839 0.5904156 0.6575172 -0.9890048 0.5875938 0.6350848 -0.9914995 0.6040793 0.637211 -0.9933953 0.6333995 0.6561933 -0.9948487 0.6701635 0.6856388 -0.9959706 0.710117 0.7204952 -0.9968409 0.7501172 0.757 -0.9975189 0.7880291 0.7925488 -0.9980488 0.8225647 0.8255071 -0.9984638 0.8530945 0.8549959 -0.9987895 0.8794619 0.880683 -0.9990455 0.9018215 0.9026016 -0.999247 0.9205098 0.9210061 -0.9994057 0.935951 0.9362655 -0.9995308 0.9485931 0.9487918 -0.9996295 0.9588684 0.9589938 -0.9997074 0.967172 0.9672509 -0.9997688 0.9738515 0.9739011 -0.9998174 0.979205 0.9792361 -0.9998557 0.9834833 0.9835029 -0.999886 0.9868946 0.9869069 -0.9999099 0.9896096 0.9896173 -0.9999288 0.9917674 0.9917722 -0.9999437 0.9934803 0.9934833 -0.1572498 0.9669269 0.9669269 -0.1572031 0.9669173 0.9669173 -0.1571463 0.9669053 0.9669053 -0.1570779 0.9668902 0.9668902 -0.1569971 0.9668714 0.9668714 -0.156904 0.9668479 0.9668479 -0.1568008 0.9668187 0.9668187 -0.1566936 0.9667827 0.9667827 -0.1565954 0.9667385 0.9667385 -0.1565315 0.966685 0.966685 -0.1565473 0.9666211 0.9666211 -0.1567226 0.9665463 0.9665463 -0.1571937 0.9664615 0.9664615 -0.15819 0.9663702 0.9663702 -0.160092 0.9662809 0.9662809 -0.1635226 0.9662104 0.9662104 -0.1694384 0.9661878 0.9661878 -0.1775917 0.9661878 0.9661878 -0.1879067 0.9661878 0.9661878 -0.2009566 0.9661878 0.9661878 -0.2174663 0.9661878 0.9661878 -0.2383533 0.9661878 0.9661878 -0.2647781 0.9661878 0.9661878 -0.2982089 0.9661878 0.9661878 -0.3405032 0.9661878 0.9661878 -0.3940109 0.9661878 0.9661878 -0.4617052 0.9661878 0.9661878 -0.5473473 0.9661878 0.9661878 -0.6556956 0.9661878 0.9661878 -0.7927704 0.9661878 0.9661878 -0.9661878 0.9661878 0.9661878 -0.9749962 0.8127617 0.8127617 -0.9811943 0.713423 0.713423 -0.9856839 0.6575172 0.6575172 -0.9890048 0.6350848 0.6350848 -0.9914995 0.637211 0.637211 -0.9933953 0.6561933 0.6561933 -0.9948487 0.6856388 0.6856388 -0.9959706 0.7204952 0.7204952 -0.9968409 0.757 0.757 -0.9975189 0.7925488 0.7925488 -0.9980488 0.8255071 0.8255071 -0.9984638 0.8549959 0.8549959 -0.9987895 0.880683 0.880683 -0.9990455 0.9026016 0.9026016 -0.999247 0.9210061 0.9210061 -0.9994057 0.9362655 0.9362655 -0.9995308 0.9487918 0.9487918 -0.9996295 0.9589938 0.9589938 -0.9997074 0.9672509 0.9672509 -0.9997688 0.9739011 0.9739011 -0.9998174 0.9792361 0.9792361 -0.9998557 0.9835029 0.9835029 -0.999886 0.9869069 0.9869069 -0.9999099 0.9896173 0.9896173 -0.9999288 0.9917722 0.9917722 -0.9999437 0.9934833 0.9934833 -0.2151269 0.9754027 0.8159649 -0.2150852 0.9753975 0.8159232 -0.2150342 0.9753908 0.8158707 -0.2149725 0.9753825 0.8158049 -0.2148987 0.9753721 0.8157227 -0.2148124 0.9753591 0.8156201 -0.2147144 0.975343 0.815493 -0.2146085 0.9753231 0.815336 -0.2145034 0.9752987 0.8151439 -0.2144168 0.9752692 0.8149113 -0.2143816 0.975234 0.8146336 -0.2144566 0.9751928 0.8143091 -0.2147432 0.9751462 0.8139421 -0.2154135 0.9750962 0.8135479 -0.2167545 0.9750472 0.8131627 -0.2192389 0.9750086 0.812859 -0.2235962 0.9749962 0.8127617 -0.2296253 0.9749962 0.8127617 -0.2372529 0.9749962 0.8127617 -0.2469027 0.9749962 0.8127617 -0.2591111 0.9749962 0.8127617 -0.2745562 0.9749962 0.8127617 -0.2940963 0.9749962 0.8127617 -0.3188171 0.9749962 0.8127617 -0.3500921 0.9749962 0.8127617 -0.389659 0.9749962 0.8127617 -0.4397163 0.9749962 0.8127617 -0.5030453 0.9749962 0.8127617 -0.5831647 0.9749962 0.8127617 -0.6845262 0.9749962 0.8127617 -0.8127617 0.9749962 0.8127617 -0.9749962 0.9749962 0.8127617 -0.9811943 0.8316375 0.713423 -0.9856839 0.7424095 0.6575172 -0.9890048 0.695167 0.6350848 -0.9914995 0.6791269 0.637211 -0.9933953 0.6850303 0.6561933 -0.9948487 0.7052169 0.6856388 -0.9959706 0.733625 0.7204952 -0.9968409 0.7657077 0.757 -0.9975189 0.7982669 0.7925488 -0.9980488 0.8292297 0.8255071 -0.9984638 0.8574015 0.8549959 -0.9987895 0.8822279 0.880683 -0.9990455 0.9035886 0.9026016 -0.999247 0.9216339 0.9210061 -0.9994057 0.9366635 0.9362655 -0.9995308 0.9490434 0.9487918 -0.9996295 0.9591524 0.9589938 -0.9997074 0.9673508 0.9672509 -0.9997688 0.9739638 0.9739011 -0.9998174 0.9792755 0.9792361 -0.9998557 0.9835276 0.9835029 -0.999886 0.9869223 0.9869069 -0.9999099 0.989627 0.9896173 -0.9999288 0.9917782 0.9917722 -0.9999437 0.9934871 0.9934833 -0.2783684 0.9814251 0.7174845 -0.2783325 0.9814221 0.7174314 -0.2782884 0.9814183 0.7173646 -0.2782347 0.9814136 0.717281 -0.2781701 0.9814076 0.7171765 -0.2780936 0.9814002 0.7170462 -0.2780055 0.9813911 0.7168846 -0.2779077 0.9813797 0.7166853 -0.2778058 0.9813659 0.7164413 -0.2777122 0.9813491 0.716146 -0.2776503 0.9813291 0.7157936 -0.2776626 0.9813057 0.7153822 -0.2778236 0.9812792 0.714917 -0.2782606 0.9812508 0.7144178 -0.2791873 0.9812231 0.7139303 -0.2809573 0.9812013 0.7135461 -0.2841192 0.9811943 0.713423 -0.2885124 0.9811943 0.713423 -0.2940703 0.9811943 0.713423 -0.3011018 0.9811943 0.713423 -0.3099976 0.9811943 0.713423 -0.3212519 0.9811943 0.713423 -0.3354901 0.9811943 0.713423 -0.3535032 0.9811943 0.713423 -0.3762922 0.9811943 0.713423 -0.4051232 0.9811943 0.713423 -0.4415982 0.9811943 0.713423 -0.4877437 0.9811943 0.713423 -0.5461239 0.9811943 0.713423 -0.6199824 0.9811943 0.713423 -0.713423 0.9811943 0.713423 -0.8316375 0.9811943 0.713423 -0.9811943 0.9811943 0.713423 -0.9856839 0.8498092 0.6575172 -0.9890048 0.7711789 0.6350848 -0.9914995 0.7321559 0.637211 -0.9933953 0.721513 0.6561933 -0.9948487 0.7299859 0.6856388 -0.9959706 0.7502359 0.7204952 -0.9968409 0.776724 0.757 -0.9975189 0.8055009 0.7925488 -0.9980488 0.8339392 0.8255071 -0.9984638 0.8604449 0.8549959 -0.9987895 0.8841823 0.880683 -0.9990455 0.9048372 0.9026016 -0.999247 0.9224281 0.9210061 -0.9994057 0.9371669 0.9362655 -0.9995308 0.9493615 0.9487918 -0.9996295 0.959353 0.9589938 -0.9997074 0.967477 0.9672509 -0.9997688 0.9740432 0.9739011 -0.9998174 0.9793253 0.9792361 -0.9998557 0.9835588 0.9835029 -0.999886 0.9869419 0.9869069 -0.9999099 0.9896392 0.9896173 -0.9999288 0.9917859 0.9917722 -0.9999437 0.9934919 0.9934833 -0.3454107 0.9858181 0.6615372 -0.3453807 0.9858163 0.6614846 -0.3453439 0.9858141 0.6614184 -0.3452987 0.9858113 0.6613355 -0.3452442 0.9858079 0.6612318 -0.3451791 0.9858036 0.6611026 -0.3451032 0.9857982 0.6609424 -0.3450175 0.9857916 0.6607448 -0.3449254 0.9857835 0.6605031 -0.3448353 0.9857738 0.6602105 -0.3447636 0.9857621 0.6598616 -0.3447407 0.9857485 0.6594543 -0.3448204 0.9857332 0.658994 -0.3450957 0.9857167 0.6585002 -0.3457234 0.9857006 0.6580183 -0.3469645 0.9856879 0.6576388 -0.3492254 0.9856839 0.6575172 -0.3523802 0.9856839 0.6575172 -0.3563715 0.9856839 0.6575172 -0.3614209 0.9856839 0.6575172 -0.3678092 0.9856839 0.6575172 -0.3758911 0.9856839 0.6575172 -0.3861159 0.9856839 0.6575172 -0.3990515 0.9856839 0.6575172 -0.4154167 0.9856839 0.6575172 -0.4361208 0.9856839 0.6575172 -0.4623142 0.9856839 0.6575172 -0.4954523 0.9856839 0.6575172 -0.5373763 0.9856839 0.6575172 -0.5904156 0.9856839 0.6575172 -0.6575172 0.9856839 0.6575172 -0.7424095 0.9856839 0.6575172 -0.8498092 0.9856839 0.6575172 -0.9856839 0.9856839 0.6575172 -0.9890048 0.8673437 0.6350848 -0.9914995 0.7992446 0.637211 -0.9933953 0.7676683 0.6561933 -0.9948487 0.7613218 0.6856388 -0.9959706 0.7712508 0.7204952 -0.9968409 0.7906611 0.757 -0.9975189 0.8146529 0.7925488 -0.9980488 0.8398974 0.8255071 -0.9984638 0.8642952 0.8549959 -0.9987895 0.886655 0.880683 -0.9990455 0.9064168 0.9026016 -0.999247 0.9234329 0.9210061 -0.9994057 0.9378038 0.9362655 -0.9995308 0.9497641 0.9487918 -0.9996295 0.9596068 0.9589938 -0.9997074 0.9676368 0.9672509 -0.9997688 0.9741436 0.9739011 -0.9998174 0.9793883 0.9792361 -0.9998557 0.9835983 0.9835029 -0.999886 0.9869667 0.9869069 -0.9999099 0.9896547 0.9896173 -0.9999288 0.9917956 0.9917722 -0.9999437 0.993498 0.9934833 -0.4144197 0.9890841 0.6386246 -0.4143955 0.9890831 0.6385781 -0.4143657 0.9890818 0.6385197 -0.414329 0.9890801 0.6384466 -0.4142845 0.9890781 0.6383552 -0.4142311 0.9890755 0.6382413 -0.4141683 0.9890723 0.6381 -0.4140964 0.9890684 0.6379259 -0.4140176 0.9890637 0.6377128 -0.4139373 0.9890579 0.637455 -0.4138668 0.989051 0.6371476 -0.4138277 0.989043 0.6367889 -0.4138582 0.9890339 0.6363837 -0.4140252 0.9890241 0.6359492 -0.4144423 0.9890146 0.6355254 -0.4152991 0.9890072 0.6351916 -0.4168922 0.9890048 0.6350848 -0.419125 0.9890048 0.6350848 -0.4219498 0.9890048 0.6350848 -0.4255236 0.9890048 0.6350848 -0.4300448 0.9890048 0.6350848 -0.4357648 0.9890048 0.6350848 -0.4430013 0.9890048 0.6350848 -0.4521565 0.9890048 0.6350848 -0.4637389 0.9890048 0.6350848 -0.4783922 0.9890048 0.6350848 -0.4969305 0.9890048 0.6350848 -0.5203839 0.9890048 0.6350848 -0.5500554 0.9890048 0.6350848 -0.5875938 0.9890048 0.6350848 -0.6350848 0.9890048 0.6350848 -0.695167 0.9890048 0.6350848 -0.7711789 0.9890048 0.6350848 -0.8673437 0.9890048 0.6350848 -0.9890048 0.9890048 0.6350848 -0.9914995 0.8841204 0.637211 -0.9933953 0.8260608 0.6561933 -0.9948487 0.8009659 0.6856388 -0.9959706 0.7978374 0.7204952 -0.9968409 0.8082934 0.757 -0.9975189 0.8262314 0.7925488 -0.9980488 0.8474353 0.8255071 -0.9984638 0.8691663 0.8549959 -0.9987895 0.8897832 0.880683 -0.9990455 0.9084153 0.9026016 -0.999247 0.9247041 0.9210061 -0.9994057 0.9386096 0.9362655 -0.9995308 0.9502734 0.9487918 -0.9996295 0.959928 0.9589938 -0.9997074 0.9678389 0.9672509 -0.9997688 0.9742706 0.9739011 -0.9998174 0.9794681 0.9792361 -0.9998557 0.9836483 0.9835029 -0.999886 0.986998 0.9869069 -0.9999099 0.9896744 0.9896173 -0.9999288 0.9918079 0.9917722 -0.9999437 0.9935057 0.9934833 -0.4834235 0.9915469 0.6401109 -0.4834045 0.9915463 0.6400728 -0.4833811 0.9915455 0.6400249 -0.4833522 0.9915446 0.6399649 -0.4833171 0.9915433 0.6398899 -0.4832747 0.9915418 0.6397965 -0.4832246 0.9915399 0.6396806 -0.4831666 0.9915376 0.6395378 -0.4831021 0.9915347 0.6393632 -0.4830346 0.9915312 0.6391518 -0.4829718 0.9915271 0.6388999 -0.4829286 0.9915223 0.638606 -0.4829319 0.9915169 0.6382742 -0.4830292 0.991511 0.6379184 -0.4833013 0.9915054 0.6375715 -0.4838841 0.9915009 0.6372984 -0.4849907 0.9914995 0.637211 -0.4865484 0.9914995 0.637211 -0.4885191 0.9914995 0.637211 -0.4910123 0.9914995 0.637211 -0.4941665 0.9914995 0.637211 -0.498157 0.9914995 0.637211 -0.5032055 0.9914995 0.637211 -0.5095925 0.9914995 0.637211 -0.5176729 0.9914995 0.637211 -0.5278957 0.9914995 0.637211 -0.5408288 0.9914995 0.637211 -0.5571908 0.9914995 0.637211 -0.577891 0.9914995 0.637211 -0.6040793 0.9914995 0.637211 -0.637211 0.9914995 0.637211 -0.6791269 0.9914995 0.637211 -0.7321559 0.9914995 0.637211 -0.7992446 0.9914995 0.637211 -0.8841204 0.9914995 0.637211 -0.9914995 0.9914995 0.637211 -0.9933953 0.8999349 0.6561933 -0.9948487 0.8511207 0.6856388 -0.9959706 0.8314729 0.7204952 -0.9968409 0.8306004 0.757 -0.9975189 0.8408797 0.7925488 -0.9980488 0.8569716 0.8255071 -0.9984638 0.875329 0.8549959 -0.9987895 0.8937407 0.880683 -0.9990455 0.9109436 0.9026016 -0.999247 0.9263124 0.9210061 -0.9994057 0.939629 0.9362655 -0.9995308 0.9509177 0.9487918 -0.9996295 0.9603343 0.9589938 -0.9997074 0.9680946 0.9672509 -0.9997688 0.9744313 0.9739011 -0.9998174 0.9795689 0.9792361 -0.9998557 0.9837116 0.9835029 -0.999886 0.9870376 0.9869069 -0.9999099 0.9896992 0.9896173 -0.9999288 0.9918234 0.9917722 -0.9999437 0.9935154 0.9934833 -0.5504963 0.993424 0.6584502 -0.5504818 0.9934236 0.6584205 -0.550464 0.9934231 0.6583832 -0.5504419 0.9934225 0.6583364 -0.550415 0.9934218 0.658278 -0.5503825 0.9934209 0.6582052 -0.5503438 0.9934197 0.658115 -0.5502987 0.9934183 0.6580038 -0.550248 0.9934166 0.6578677 -0.5501939 0.9934145 0.6577032 -0.5501416 0.993412 0.657507 -0.5501012 0.9934091 0.6572783 -0.5500915 0.9934058 0.6570201 -0.5501456 0.9934023 0.6567433 -0.5503203 0.9933988 0.6564735 -0.5507113 0.9933961 0.6562612 -0.5514695 0.9933953 0.6561933 -0.5525411 0.9933953 0.6561933 -0.5538969 0.9933953 0.6561933 -0.5556122 0.9933953 0.6561933 -0.5577822 0.9933953 0.6561933 -0.5605276 0.9933953 0.6561933 -0.5640008 0.9933953 0.6561933 -0.5683949 0.9933953 0.6561933 -0.573954 0.9933953 0.6561933 -0.580987 0.9933953 0.6561933 -0.5898847 0.9933953 0.6561933 -0.6011414 0.9933953 0.6561933 -0.6153825 0.9933953 0.6561933 -0.6333995 0.9933953 0.6561933 -0.6561933 0.9933953 0.6561933 -0.6850303 0.9933953 0.6561933 -0.721513 0.9933953 0.6561933 -0.7676683 0.9933953 0.6561933 -0.8260608 0.9933953 0.6561933 -0.8999349 0.9933953 0.6561933 -0.9933953 0.9933953 0.6561933 -0.9948487 0.9145732 0.6856388 -0.9959706 0.8740262 0.7204952 -0.9968409 0.8588218 0.757 -0.9975189 0.8594117 0.7925488 -0.9980488 0.8690364 0.8255071 -0.9984638 0.8831255 0.8549959 -0.9987895 0.8987476 0.880683 -0.9990455 0.9141422 0.9026016 -0.999247 0.928347 0.9210061 -0.9994057 0.9409186 0.9362655 -0.9995308 0.9517328 0.9487918 -0.9996295 0.9608482 0.9589938 -0.9997074 0.9684181 0.9672509 -0.9997688 0.9746346 0.9739011 -0.9998174 0.9796966 0.9792361 -0.9998557 0.9837916 0.9835029 -0.999886 0.9870878 0.9869069 -0.9999099 0.9897306 0.9896173 -0.9999288 0.9918431 0.9917722 -0.9999437 0.9935277 0.9934833 -0.6139459 0.9948662 0.6873271 -0.6139352 0.994866 0.6873049 -0.6139219 0.9948657 0.687277 -0.6139056 0.9948653 0.687242 -0.6138855 0.9948649 0.6871982 -0.6138613 0.9948643 0.6871438 -0.6138323 0.9948636 0.6870762 -0.6137984 0.9948628 0.6869929 -0.6137599 0.9948617 0.6868911 -0.6137183 0.9948604 0.686768 -0.6136769 0.9948589 0.6866212 -0.6136427 0.9948571 0.6864501 -0.6136284 0.9948551 0.6862569 -0.6136569 0.994853 0.68605 -0.6137675 0.9948509 0.6858483 -0.6140266 0.9948493 0.6856895 -0.6145393 0.9948487 0.6856388 -0.6152669 0.9948487 0.6856388 -0.6161874 0.9948487 0.6856388 -0.6173519 0.9948487 0.6856388 -0.6188252 0.9948487 0.6856388 -0.6206891 0.9948487 0.6856388 -0.6230471 0.9948487 0.6856388 -0.6260304 0.9948487 0.6856388 -0.6298046 0.9948487 0.6856388 -0.6345795 0.9948487 0.6856388 -0.6406203 0.9948487 0.6856388 -0.6482627 0.9948487 0.6856388 -0.6579314 0.9948487 0.6856388 -0.6701635 0.9948487 0.6856388 -0.6856388 0.9948487 0.6856388 -0.7052169 0.9948487 0.6856388 -0.7299859 0.9948487 0.6856388 -0.7613218 0.9948487 0.6856388 -0.8009659 0.9948487 0.6856388 -0.8511207 0.9948487 0.6856388 -0.9145732 0.9948487 0.6856388 -0.9948487 0.9948487 0.6856388 -0.9959706 0.9278617 0.7204952 -0.9968409 0.8945255 0.757 -0.9975189 0.8828571 0.7925488 -0.9980488 0.8842998 0.8255071 -0.9984638 0.892989 0.8549959 -0.9987895 0.9050819 0.880683 -0.9990455 0.9181889 0.9026016 -0.999247 0.9309211 0.9210061 -0.9994057 0.9425502 0.9362655 -0.9995308 0.952764 0.9487918 -0.9996295 0.9614985 0.9589938 -0.9997074 0.9688274 0.9672509 -0.9997688 0.9748918 0.9739011 -0.9998174 0.979858 0.9792361 -0.9998557 0.9838928 0.9835029 -0.999886 0.9871512 0.9869069 -0.9999099 0.9897703 0.9896173 -0.9999288 0.991868 0.9917722 -0.9999437 0.9935432 0.9934833 -0.6724572 0.9959813 0.7217186 -0.6724495 0.9959811 0.7217025 -0.6724399 0.9959809 0.7216823 -0.672428 0.9959807 0.7216569 -0.6724135 0.9959804 0.7216252 -0.6723959 0.9959801 0.7215857 -0.6723748 0.9959797 0.7215367 -0.67235 0.9959791 0.7214763 -0.6723217 0.9959785 0.7214025 -0.6722907 0.9959777 0.7213133 -0.6722594 0.9959768 0.7212069 -0.6722322 0.9959757 0.7210829 -0.672218 0.9959745 0.720943 -0.672232 0.9959732 0.720793 -0.6723012 0.9959719 0.720647 -0.6724711 0.9959709 0.720532 -0.6728136 0.9959706 0.7204952 -0.6733015 0.9959706 0.7204952 -0.6739188 0.9959706 0.7204952 -0.6746998 0.9959706 0.7204952 -0.6756878 0.9959706 0.7204952 -0.6769378 0.9959706 0.7204952 -0.6785192 0.9959706 0.7204952 -0.6805199 0.9959706 0.7204952 -0.683051 0.9959706 0.7204952 -0.6862532 0.9959706 0.7204952 -0.6903044 0.9959706 0.7204952 -0.6954296 0.9959706 0.7204952 -0.7019138 0.9959706 0.7204952 -0.710117 0.9959706 0.7204952 -0.7204952 0.9959706 0.7204952 -0.733625 0.9959706 0.7204952 -0.7502359 0.9959706 0.7204952 -0.7712508 0.9959706 0.7204952 -0.7978374 0.9959706 0.7204952 -0.8314729 0.9959706 0.7204952 -0.8740262 0.9959706 0.7204952 -0.9278617 0.9959706 0.7204952 -0.9959706 0.9959706 0.7204952 -0.9968409 0.9396953 0.757 -0.9975189 0.9125186 0.7925488 -0.9980488 0.9036101 0.8255071 -0.9984638 0.9054678 0.8549959 -0.9987895 0.9130957 0.880683 -0.9990455 0.9233085 0.9026016 -0.999247 0.9341777 0.9210061 -0.9994057 0.9446144 0.9362655 -0.9995308 0.9540687 0.9487918 -0.9996295 0.9623212 0.9589938 -0.9997074 0.9693452 0.9672509 -0.9997688 0.9752172 0.9739011 -0.9998174 0.9800622 0.9792361 -0.9998557 0.9840209 0.9835029 -0.999886 0.9872315 0.9869069 -0.9999099 0.9898206 0.9896173 -0.9999288 0.9918994 0.9917722 -0.9999437 0.9935629 0.9934833 -0.7251659 0.9968475 0.7578634 -0.7251605 0.9968474 0.757852 -0.7251537 0.9968473 0.7578377 -0.7251454 0.9968472 0.7578198 -0.7251351 0.996847 0.7577974 -0.7251226 0.9968468 0.7577695 -0.7251076 0.9968465 0.7577349 -0.7250899 0.9968462 0.7576923 -0.7250697 0.9968458 0.7576402 -0.7250473 0.9968453 0.7575772 -0.7250244 0.9968448 0.7575021 -0.7250039 0.9968441 0.7574146 -0.7249916 0.9968433 0.7573158 -0.7249978 0.9968425 0.7572101 -0.7250408 0.9968418 0.757107 -0.7251511 0.9968411 0.7570259 -0.7253775 0.9968409 0.757 -0.7257011 0.9968409 0.757 -0.7261105 0.9968409 0.757 -0.7266285 0.9968409 0.757 -0.7272837 0.9968409 0.757 -0.7281127 0.9968409 0.757 -0.7291615 0.9968409 0.757 -0.7304884 0.9968409 0.757 -0.732167 0.9968409 0.757 -0.7342907 0.9968409 0.757 -0.7369774 0.9968409 0.757 -0.7403765 0.9968409 0.757 -0.7446768 0.9968409 0.757 -0.7501172 0.9968409 0.757 -0.757 0.9968409 0.757 -0.7657077 0.9968409 0.757 -0.776724 0.9968409 0.757 -0.7906611 0.9968409 0.757 -0.8082934 0.9968409 0.757 -0.8306004 0.9968409 0.757 -0.8588218 0.9968409 0.757 -0.8945255 0.9968409 0.757 -0.9396953 0.9968409 0.757 -0.9968409 0.9968409 0.757 -0.9975189 0.9500442 0.7925488 -0.9980488 0.9280401 0.8255071 -0.9984638 0.921255 0.8549959 -0.9987895 0.9232341 0.880683 -0.9990455 0.9297854 0.9026016 -0.999247 0.9382977 0.9210061 -0.9994057 0.9472259 0.9362655 -0.9995308 0.9557192 0.9487918 -0.9996295 0.963362 0.9589938 -0.9997074 0.9700002 0.9672509 -0.9997688 0.9756289 0.9739011 -0.9998174 0.9803206 0.9792361 -0.9998557 0.9841829 0.9835029 -0.999886 0.987333 0.9869069 -0.9999099 0.9898842 0.9896173 -0.9999288 0.9919392 0.9917722 -0.9999437 0.9935878 0.9934833 -0.7716588 0.997523 0.7931449 -0.7716551 0.997523 0.793137 -0.7716504 0.9975229 0.7931271 -0.7716446 0.9975228 0.7931147 -0.7716375 0.9975227 0.7930993 -0.7716288 0.9975226 0.79308 -0.7716184 0.9975224 0.7930561 -0.7716061 0.9975222 0.7930267 -0.7715919 0.997522 0.7929907 -0.7715762 0.9975217 0.7929472 -0.7715599 0.9975213 0.7928954 -0.7715449 0.9975209 0.792835 -0.7715352 0.9975204 0.7927668 -0.7715376 0.9975199 0.7926938 -0.7715641 0.9975194 0.7926227 -0.7716352 0.9975191 0.7925667 -0.7717834 0.9975189 0.7925488 -0.7719959 0.9975189 0.7925488 -0.7722648 0.9975189 0.7925488 -0.7726049 0.9975189 0.7925488 -0.7730352 0.9975189 0.7925488 -0.7735795 0.9975189 0.7925488 -0.7742682 0.9975189 0.7925488 -0.7751395 0.9975189 0.7925488 -0.7762418 0.9975189 0.7925488 -0.7776364 0.9975189 0.7925488 -0.7794007 0.9975189 0.7925488 -0.7816327 0.9975189 0.7925488 -0.7844566 0.9975189 0.7925488 -0.7880291 0.9975189 0.7925488 -0.7925488 0.9975189 0.7925488 -0.7982669 0.9975189 0.7925488 -0.8055009 0.9975189 0.7925488 -0.8146529 0.9975189 0.7925488 -0.8262314 0.9975189 0.7925488 -0.8408797 0.9975189 0.7925488 -0.8594117 0.9975189 0.7925488 -0.8828571 0.9975189 0.7925488 -0.9125186 0.9975189 0.7925488 -0.9500442 0.9975189 0.7925488 -0.9975189 0.9975189 0.7925488 -0.9980488 0.9589472 0.8255071 -0.9984638 0.9412278 0.8549959 -0.9987895 0.9360606 0.880683 -0.9990455 0.9379796 0.9026016 -0.999247 0.94351 0.9210061 -0.9994057 0.9505298 0.9362655 -0.9995308 0.9578074 0.9487918 -0.9996295 0.9646787 0.9589938 -0.9997074 0.970829 0.9672509 -0.9997688 0.9761497 0.9739011 -0.9998174 0.9806476 0.9792361 -0.9998557 0.984388 0.9835029 -0.999886 0.9874615 0.9869069 -0.9999099 0.9899646 0.9896173 -0.9999288 0.9919896 0.9917722 -0.9999437 0.9936193 0.9934833 -0.8119154 0.9980513 0.8259111 -0.8119128 0.9980512 0.8259058 -0.8119096 0.9980512 0.8258991 -0.8119057 0.9980511 0.8258907 -0.8119009 0.9980511 0.8258802 -0.8118949 0.998051 0.8258672 -0.8118878 0.9980509 0.825851 -0.8118794 0.9980508 0.825831 -0.8118697 0.9980506 0.8258066 -0.8118589 0.9980504 0.8257771 -0.8118476 0.9980502 0.825742 -0.811837 0.99805 0.825701 -0.8118298 0.9980497 0.8256548 -0.8118303 0.9980494 0.8256054 -0.8118466 0.9980491 0.8255572 -0.8118921 0.9980488 0.8255193 -0.8119884 0.9980488 0.8255071 -0.8121268 0.9980488 0.8255071 -0.8123018 0.9980488 0.8255071 -0.8125232 0.9980488 0.8255071 -0.8128033 0.9980488 0.8255071 -0.8131577 0.9980488 0.8255071 -0.8136061 0.9980488 0.8255071 -0.8141733 0.9980488 0.8255071 -0.8148909 0.9980488 0.8255071 -0.8157988 0.9980488 0.8255071 -0.8169474 0.9980488 0.8255071 -0.8184005 0.9980488 0.8255071 -0.8202389 0.9980488 0.8255071 -0.8225647 0.9980488 0.8255071 -0.8255071 0.9980488 0.8255071 -0.8292297 0.9980488 0.8255071 -0.8339392 0.9980488 0.8255071 -0.8398974 0.9980488 0.8255071 -0.8474353 0.9980488 0.8255071 -0.8569716 0.9980488 0.8255071 -0.8690364 0.9980488 0.8255071 -0.8842998 0.9980488 0.8255071 -0.9036101 0.9980488 0.8255071 -0.9280401 0.9980488 0.8255071 -0.9589472 0.9980488 0.8255071 -0.9980488 0.9980488 0.8255071 -0.9984638 0.9664961 0.8549959 -0.9987895 0.9522877 0.880683 -0.9990455 0.9483463 0.9026016 -0.999247 0.9501042 0.9210061 -0.9994057 0.9547096 0.9362655 -0.9995308 0.9604492 0.9487918 -0.9996295 0.9663445 0.9589938 -0.9997074 0.9718774 0.9672509 -0.9997688 0.9768086 0.9739011 -0.9998174 0.9810611 0.9792361 -0.9998557 0.9846473 0.9835029 -0.999886 0.987624 0.9869069 -0.9999099 0.9900664 0.9896173 -0.9999288 0.9920533 0.9917722 -0.9999437 0.9936592 0.9934833 -0.8462171 0.9984653 0.8552656 -0.8462154 0.9984653 0.855262 -0.8462132 0.9984653 0.8552576 -0.8462106 0.9984653 0.855252 -0.8462073 0.9984652 0.8552449 -0.8462034 0.9984652 0.8552362 -0.8461986 0.9984651 0.8552254 -0.8461929 0.998465 0.8552121 -0.8461864 0.9984649 0.8551958 -0.8461791 0.9984648 0.8551761 -0.8461714 0.9984647 0.8551527 -0.8461641 0.9984645 0.8551253 -0.8461589 0.9984643 0.8550945 -0.8461587 0.9984642 0.8550615 -0.8461687 0.998464 0.8550293 -0.8461977 0.9984638 0.855004 -0.8462598 0.9984638 0.8549959 -0.8463492 0.9984638 0.8549959 -0.8464623 0.9984638 0.8549959 -0.8466054 0.9984638 0.8549959 -0.8467864 0.9984638 0.8549959 -0.8470154 0.9984638 0.8549959 -0.8473052 0.9984638 0.8549959 -0.8476717 0.9984638 0.8549959 -0.8481355 0.9984638 0.8549959 -0.8487222 0.9984638 0.8549959 -0.8494644 0.9984638 0.8549959 -0.8504035 0.9984638 0.8549959 -0.8515915 0.9984638 0.8549959 -0.8530945 0.9984638 0.8549959 -0.8549959 0.9984638 0.8549959 -0.8574015 0.9984638 0.8549959 -0.8604449 0.9984638 0.8549959 -0.8642952 0.9984638 0.8549959 -0.8691663 0.9984638 0.8549959 -0.875329 0.9984638 0.8549959 -0.8831255 0.9984638 0.8549959 -0.892989 0.9984638 0.8549959 -0.9054678 0.9984638 0.8549959 -0.921255 0.9984638 0.8549959 -0.9412278 0.9984638 0.8549959 -0.9664961 0.9984638 0.8549959 -0.9984638 0.9984638 0.8549959 -0.9987895 0.9728171 0.880683 -0.9990455 0.9614615 0.9026016 -0.999247 0.9584468 0.9210061 -0.9994057 0.9599976 0.9362655 -0.9995308 0.9637914 0.9487918 -0.9996295 0.968452 0.9589938 -0.9997074 0.9732039 0.9672509 -0.9997688 0.9776422 0.9739011 -0.9998174 0.9815844 0.9792361 -0.9998557 0.9849754 0.9835029 -0.999886 0.9878296 0.9869069 -0.9999099 0.9901951 0.9896173 -0.9999288 0.9921339 0.9917722 -0.9999437 0.9937096 0.9934833 -0.8750477 0.9987905 0.8808607 -0.8750466 0.9987905 0.8808584 -0.8750451 0.9987904 0.8808555 -0.8750434 0.9987904 0.8808518 -0.8750412 0.9987904 0.8808471 -0.8750386 0.9987904 0.8808414 -0.8750355 0.9987903 0.8808343 -0.8750317 0.9987903 0.8808255 -0.8750274 0.9987902 0.8808147 -0.8750225 0.9987902 0.8808018 -0.8750173 0.9987901 0.8807863 -0.8750124 0.99879 0.8807683 -0.8750088 0.9987899 0.880748 -0.8750084 0.9987897 0.8807262 -0.8750145 0.9987896 0.880705 -0.8750329 0.9987895 0.8806883 -0.8750727 0.9987895 0.880683 -0.8751301 0.9987895 0.880683 -0.8752028 0.9987895 0.880683 -0.8752947 0.9987895 0.880683 -0.8754109 0.9987895 0.880683 -0.875558 0.9987895 0.880683 -0.8757441 0.9987895 0.880683 -0.8759795 0.9987895 0.880683 -0.8762773 0.9987895 0.880683 -0.8766541 0.9987895 0.880683 -0.8771307 0.9987895 0.880683 -0.8777338 0.9987895 0.880683 -0.8784967 0.9987895 0.880683 -0.8794619 0.9987895 0.880683 -0.880683 0.9987895 0.880683 -0.8822279 0.9987895 0.880683 -0.8841823 0.9987895 0.880683 -0.886655 0.9987895 0.880683 -0.8897832 0.9987895 0.880683 -0.8937407 0.9987895 0.880683 -0.8987476 0.9987895 0.880683 -0.9050819 0.9987895 0.880683 -0.9130957 0.9987895 0.880683 -0.9232341 0.9987895 0.880683 -0.9360606 0.9987895 0.880683 -0.9522877 0.9987895 0.880683 -0.9728171 0.9987895 0.880683 -0.9987895 0.9987895 0.880683 -0.9990455 0.9780539 0.9026016 -0.999247 0.9690013 0.9210061 -0.9994057 0.9666876 0.9362655 -0.9995308 0.9680197 0.9487918 -0.9996295 0.9711183 0.9589938 -0.9997074 0.974882 0.9672509 -0.9997688 0.9786968 0.9739011 -0.9998174 0.9822464 0.9792361 -0.9998557 0.9853905 0.9835029 -0.999886 0.9880897 0.9869069 -0.9999099 0.990358 0.9896173 -0.9999288 0.9922358 0.9917722 -0.9999437 0.9937734 0.9934833 -0.8990028 0.9990461 0.9027176 -0.899002 0.9990461 0.902716 -0.8990011 0.9990461 0.9027141 -0.899 0.9990461 0.9027117 -0.8989986 0.9990461 0.9027087 -0.8989969 0.9990461 0.9027049 -0.8989948 0.9990461 0.9027003 -0.8989923 0.999046 0.9026946 -0.8989895 0.999046 0.9026876 -0.8989863 0.9990459 0.9026791 -0.8989829 0.9990459 0.902669 -0.8989796 0.9990458 0.9026573 -0.8989771 0.9990458 0.902644 -0.8989767 0.9990457 0.9026298 -0.8989805 0.9990456 0.902616 -0.8989921 0.9990456 0.9026051 -0.8990175 0.9990455 0.9026016 -0.8990542 0.9990455 0.9026016 -0.8991006 0.9990455 0.9026016 -0.8991593 0.9990455 0.9026016 -0.8992336 0.9990455 0.9026016 -0.8993275 0.9990455 0.9026016 -0.8994464 0.9990455 0.9026016 -0.8995968 0.9990455 0.9026016 -0.899787 0.9990455 0.9026016 -0.9000277 0.9990455 0.9026016 -0.9003323 0.9990455 0.9026016 -0.9007175 0.9990455 0.9026016 -0.9012049 0.9990455 0.9026016 -0.9018215 0.9990455 0.9026016 -0.9026016 0.9990455 0.9026016 -0.9035886 0.9990455 0.9026016 -0.9048372 0.9990455 0.9026016 -0.9064168 0.9990455 0.9026016 -0.9084153 0.9990455 0.9026016 -0.9109436 0.9990455 0.9026016 -0.9141422 0.9990455 0.9026016 -0.9181889 0.9990455 0.9026016 -0.9233085 0.9990455 0.9026016 -0.9297854 0.9990455 0.9026016 -0.9379796 0.9990455 0.9026016 -0.9483463 0.9990455 0.9026016 -0.9614615 0.9990455 0.9026016 -0.9780539 0.9990455 0.9026016 -0.9990455 0.9990455 0.9026016 -0.999247 0.982354 0.9210061 -0.9994057 0.9751513 0.9362655 -0.9995308 0.9733691 0.9487918 -0.9996295 0.9744915 0.9589938 -0.9997074 0.977005 0.9672509 -0.9997688 0.980031 0.9739011 -0.9998174 0.9830838 0.9792361 -0.9998557 0.9859157 0.9835029 -0.999886 0.9884188 0.9869069 -0.9999099 0.9905641 0.9896173 -0.9999288 0.9923648 0.9917722 -0.9999437 0.9938541 0.9934833 -0.9187175 0.9992474 0.9210811 -0.918717 0.9992474 0.9210801 -0.9187164 0.9992474 0.9210788 -0.9187157 0.9992474 0.9210773 -0.9187148 0.9992474 0.9210753 -0.9187137 0.9992474 0.9210729 -0.9187123 0.9992473 0.9210699 -0.9187107 0.9992473 0.9210662 -0.9187089 0.9992473 0.9210616 -0.9187068 0.9992473 0.9210562 -0.9187045 0.9992472 0.9210496 -0.9187024 0.9992472 0.921042 -0.9187008 0.9992472 0.9210335 -0.9187004 0.9992471 0.9210243 -0.9187027 0.9992471 0.9210153 -0.9187101 0.999247 0.9210083 -0.9187262 0.999247 0.9210061 -0.9187495 0.999247 0.9210061 -0.9187791 0.999247 0.9210061 -0.9188164 0.999247 0.9210061 -0.9188636 0.999247 0.9210061 -0.9189234 0.999247 0.9210061 -0.918999 0.999247 0.9210061 -0.9190947 0.999247 0.9210061 -0.9192157 0.999247 0.9210061 -0.9193688 0.999247 0.9210061 -0.9195625 0.999247 0.9210061 -0.9198076 0.999247 0.9210061 -0.9201176 0.999247 0.9210061 -0.9205098 0.999247 0.9210061 -0.9210061 0.999247 0.9210061 -0.9216339 0.999247 0.9210061 -0.9224281 0.999247 0.9210061 -0.9234329 0.999247 0.9210061 -0.9247041 0.999247 0.9210061 -0.9263124 0.999247 0.9210061 -0.928347 0.999247 0.9210061 -0.9309211 0.999247 0.9210061 -0.9341777 0.999247 0.9210061 -0.9382977 0.999247 0.9210061 -0.94351 0.999247 0.9210061 -0.9501042 0.999247 0.9210061 -0.9584468 0.999247 0.9210061 -0.9690013 0.999247 0.9210061 -0.982354 0.999247 0.9210061 -0.999247 0.999247 0.9210061 -0.9994057 0.9858591 0.9362655 -0.9995308 0.9801368 0.9487918 -0.9996295 0.978759 0.9589938 -0.9997074 0.9796909 0.9672509 -0.9997688 0.981719 0.9739011 -0.9998174 0.9841433 0.9792361 -0.9998557 0.9865801 0.9835029 -0.999886 0.9888351 0.9869069 -0.9999099 0.9908248 0.9896173 -0.9999288 0.992528 0.9917722 -0.9999437 0.9939562 0.9934833 -0.9348153 0.999406 0.9363137 -0.9348149 0.999406 0.9363131 -0.9348146 0.999406 0.9363123 -0.9348141 0.999406 0.9363113 -0.9348135 0.999406 0.93631 -0.9348128 0.9994059 0.9363085 -0.9348119 0.9994059 0.9363065 -0.9348109 0.9994059 0.9363041 -0.9348097 0.9994059 0.9363012 -0.9348083 0.9994059 0.9362977 -0.9348069 0.9994059 0.9362935 -0.9348055 0.9994059 0.9362886 -0.9348044 0.9994058 0.9362831 -0.9348042 0.9994058 0.9362772 -0.9348056 0.9994058 0.9362715 -0.9348102 0.9994057 0.936267 -0.9348204 0.9994057 0.9362655 -0.9348352 0.9994057 0.9362655 -0.9348539 0.9994057 0.9362655 -0.9348776 0.9994057 0.9362655 -0.9349075 0.9994057 0.9362655 -0.9349454 0.9994057 0.9362655 -0.9349933 0.9994057 0.9362655 -0.935054 0.9994057 0.9362655 -0.9351307 0.9994057 0.9362655 -0.9352277 0.9994057 0.9362655 -0.9353505 0.9994057 0.9362655 -0.9355059 0.9994057 0.9362655 -0.9357024 0.9994057 0.9362655 -0.935951 0.9994057 0.9362655 -0.9362655 0.9994057 0.9362655 -0.9366635 0.9994057 0.9362655 -0.9371669 0.9994057 0.9362655 -0.9378038 0.9994057 0.9362655 -0.9386096 0.9994057 0.9362655 -0.939629 0.9994057 0.9362655 -0.9409186 0.9994057 0.9362655 -0.9425502 0.9994057 0.9362655 -0.9446144 0.9994057 0.9362655 -0.9472259 0.9994057 0.9362655 -0.9505298 0.9994057 0.9362655 -0.9547096 0.9994057 0.9362655 -0.9599976 0.9994057 0.9362655 -0.9666876 0.9994057 0.9362655 -0.9751513 0.9994057 0.9362655 -0.9858591 0.9994057 0.9362655 -0.9994057 0.9994057 0.9362655 -0.9995308 0.9886988 0.9487918 -0.9996295 0.9841579 0.9589938 -0.9997074 0.983089 0.9672509 -0.9997688 0.9838545 0.9739011 -0.9998174 0.9854838 0.9792361 -0.9998557 0.9874207 0.9835029 -0.999886 0.9893618 0.9869069 -0.9999099 0.9911547 0.9896173 -0.9999288 0.9927345 0.9917722 -0.9999437 0.9940854 0.9934833 -0.9478754 0.999531 0.9488226 -0.9478752 0.999531 0.9488222 -0.947875 0.999531 0.9488217 -0.9478746 0.999531 0.9488211 -0.9478743 0.999531 0.9488203 -0.9478738 0.999531 0.9488193 -0.9478733 0.999531 0.948818 -0.9478726 0.999531 0.9488165 -0.9478718 0.999531 0.9488147 -0.947871 0.9995309 0.9488124 -0.94787 0.9995309 0.9488097 -0.9478691 0.9995309 0.9488066 -0.9478684 0.9995309 0.9488031 -0.9478683 0.9995309 0.9487993 -0.9478691 0.9995309 0.9487957 -0.947872 0.9995309 0.9487928 -0.9478785 0.9995308 0.9487918 -0.9478878 0.9995308 0.9487918 -0.9478997 0.9995308 0.9487918 -0.9479146 0.9995308 0.9487918 -0.9479335 0.9995308 0.9487918 -0.9479575 0.9995308 0.9487918 -0.9479878 0.9995308 0.9487918 -0.9480261 0.9995308 0.9487918 -0.9480746 0.9995308 0.9487918 -0.9481359 0.9995308 0.9487918 -0.9482135 0.9995308 0.9487918 -0.9483117 0.9995308 0.9487918 -0.9484359 0.9995308 0.9487918 -0.9485931 0.9995308 0.9487918 -0.9487918 0.9995308 0.9487918 -0.9490434 0.9995308 0.9487918 -0.9493615 0.9995308 0.9487918 -0.9497641 0.9995308 0.9487918 -0.9502734 0.9995308 0.9487918 -0.9509177 0.9995308 0.9487918 -0.9517328 0.9995308 0.9487918 -0.952764 0.9995308 0.9487918 -0.9540687 0.9995308 0.9487918 -0.9557192 0.9995308 0.9487918 -0.9578074 0.9995308 0.9487918 -0.9604492 0.9995308 0.9487918 -0.9637914 0.9995308 0.9487918 -0.9680197 0.9995308 0.9487918 -0.9733691 0.9995308 0.9487918 -0.9801368 0.9995308 0.9487918 -0.9886988 0.9995308 0.9487918 -0.9995308 0.9995308 0.9487918 -0.9996295 0.9909882 0.9589938 -0.9997074 0.9873879 0.9672509 -0.9997688 0.9865561 0.9739011 -0.9998174 0.9871796 0.9792361 -0.9998557 0.9884841 0.9835029 -0.999886 0.9900282 0.9869069 -0.9999099 0.991572 0.9896173 -0.9999288 0.9929957 0.9917722 -0.9999437 0.9942488 0.9934833 -0.958416 0.9996296 0.9590133 -0.9584159 0.9996296 0.9590131 -0.9584157 0.9996296 0.9590128 -0.9584155 0.9996296 0.9590124 -0.9584153 0.9996296 0.9590118 -0.958415 0.9996296 0.9590112 -0.9584146 0.9996296 0.9590104 -0.9584142 0.9996296 0.9590095 -0.9584137 0.9996296 0.9590083 -0.9584132 0.9996296 0.9590068 -0.9584126 0.9996296 0.9590051 -0.958412 0.9996296 0.9590032 -0.9584115 0.9996296 0.9590009 -0.9584114 0.9996295 0.9589985 -0.958412 0.9996295 0.9589962 -0.9584138 0.9996295 0.9589944 -0.9584178 0.9996295 0.9589938 -0.9584237 0.9996295 0.9589938 -0.9584312 0.9996295 0.9589938 -0.9584406 0.9996295 0.9589938 -0.9584526 0.9996295 0.9589938 -0.9584677 0.9996295 0.9589938 -0.9584868 0.9996295 0.9589938 -0.9585109 0.9996295 0.9589938 -0.9585415 0.9996295 0.9589938 -0.9585802 0.9996295 0.9589938 -0.9586291 0.9996295 0.9589938 -0.958691 0.9996295 0.9589938 -0.9587693 0.9996295 0.9589938 -0.9588684 0.9996295 0.9589938 -0.9589938 0.9996295 0.9589938 -0.9591524 0.9996295 0.9589938 -0.959353 0.9996295 0.9589938 -0.9596068 0.9996295 0.9589938 -0.959928 0.9996295 0.9589938 -0.9603343 0.9996295 0.9589938 -0.9608482 0.9996295 0.9589938 -0.9614985 0.9996295 0.9589938 -0.9623212 0.9996295 0.9589938 -0.963362 0.9996295 0.9589938 -0.9646787 0.9996295 0.9589938 -0.9663445 0.9996295 0.9589938 -0.968452 0.9996295 0.9589938 -0.9711183 0.9996295 0.9589938 -0.9744915 0.9996295 0.9589938 -0.978759 0.9996295 0.9589938 -0.9841579 0.9996295 0.9589938 -0.9909882 0.9996295 0.9589938 -0.9996295 0.9996295 0.9589938 -0.9997074 0.9928267 0.9672509 -0.9997688 0.9899741 0.9739011 -0.9998174 0.989325 0.9792361 -0.9998557 0.9898295 0.9835029 -0.999886 0.9908712 0.9869069 -0.9999099 0.9920999 0.9896173 -0.9999288 0.9933261 0.9917722 -0.9999437 0.9944556 0.9934833 -0.9668873 0.9997074 0.9672633 -0.9668872 0.9997074 0.9672632 -0.9668871 0.9997074 0.967263 -0.966887 0.9997074 0.9672627 -0.9668869 0.9997074 0.9672624 -0.9668867 0.9997074 0.967262 -0.9668865 0.9997074 0.9672615 -0.9668862 0.9997074 0.9672609 -0.9668859 0.9997074 0.9672601 -0.9668855 0.9997074 0.9672592 -0.9668852 0.9997074 0.9672581 -0.9668848 0.9997074 0.9672569 -0.9668845 0.9997074 0.9672555 -0.9668844 0.9997074 0.9672539 -0.9668847 0.9997074 0.9672525 -0.9668859 0.9997074 0.9672513 -0.9668884 0.9997074 0.9672509 -0.9668922 0.9997074 0.9672509 -0.9668969 0.9997074 0.9672509 -0.9669028 0.9997074 0.9672509 -0.9669103 0.9997074 0.9672509 -0.9669198 0.9997074 0.9672509 -0.9669318 0.9997074 0.9672509 -0.966947 0.9997074 0.9672509 -0.9669663 0.9997074 0.9672509 -0.9669906 0.9997074 0.9672509 -0.9670214 0.9997074 0.9672509 -0.9670604 0.9997074 0.9672509 -0.9671097 0.9997074 0.9672509 -0.967172 0.9997074 0.9672509 -0.9672509 0.9997074 0.9672509 -0.9673508 0.9997074 0.9672509 -0.967477 0.9997074 0.9672509 -0.9676368 0.9997074 0.9672509 -0.9678389 0.9997074 0.9672509 -0.9680946 0.9997074 0.9672509 -0.9684181 0.9997074 0.9672509 -0.9688274 0.9997074 0.9672509 -0.9693452 0.9997074 0.9672509 -0.9700002 0.9997074 0.9672509 -0.970829 0.9997074 0.9672509 -0.9718774 0.9997074 0.9672509 -0.9732039 0.9997074 0.9672509 -0.974882 0.9997074 0.9672509 -0.977005 0.9997074 0.9672509 -0.9796909 0.9997074 0.9672509 -0.983089 0.9997074 0.9672509 -0.9873879 0.9997074 0.9672509 -0.9928267 0.9997074 0.9672509 -0.9997074 0.9997074 0.9672509 -0.9997688 0.9942982 0.9739011 -0.9998174 0.9920392 0.9792361 -0.9998557 0.9915316 0.9835029 -0.999886 0.9919377 0.9869069 -0.9999099 0.9927678 0.9896173 -0.9999288 0.9937442 0.9917722 -0.9999437 0.9947172 0.9934833 -0.9736726 0.9997689 0.9739089 -0.9736726 0.9997689 0.9739088 -0.9736725 0.9997689 0.9739087 -0.9736724 0.9997689 0.9739085 -0.9736723 0.9997689 0.9739083 -0.9736722 0.9997689 0.9739081 -0.9736721 0.9997689 0.9739078 -0.9736719 0.9997689 0.9739074 -0.9736717 0.9997689 0.9739069 -0.9736715 0.9997689 0.9739063 -0.9736712 0.9997689 0.9739057 -0.973671 0.9997689 0.9739049 -0.9736708 0.9997689 0.973904 -0.9736708 0.9997689 0.973903 -0.973671 0.9997688 0.9739021 -0.9736717 0.9997688 0.9739013 -0.9736733 0.9997688 0.9739011 -0.9736756 0.9997688 0.9739011 -0.9736786 0.9997688 0.9739011 -0.9736823 0.9997688 0.9739011 -0.973687 0.9997688 0.9739011 -0.973693 0.9997688 0.9739011 -0.9737006 0.9997688 0.9739011 -0.9737101 0.9997688 0.9739011 -0.9737222 0.9997688 0.9739011 -0.9737375 0.9997688 0.9739011 -0.9737569 0.9997688 0.9739011 -0.9737814 0.9997688 0.9739011 -0.9738123 0.9997688 0.9739011 -0.9738515 0.9997688 0.9739011 -0.9739011 0.9997688 0.9739011 -0.9739638 0.9997688 0.9739011 -0.9740432 0.9997688 0.9739011 -0.9741436 0.9997688 0.9739011 -0.9742706 0.9997688 0.9739011 -0.9744313 0.9997688 0.9739011 -0.9746346 0.9997688 0.9739011 -0.9748918 0.9997688 0.9739011 -0.9752172 0.9997688 0.9739011 -0.9756289 0.9997688 0.9739011 -0.9761497 0.9997688 0.9739011 -0.9768086 0.9997688 0.9739011 -0.9776422 0.9997688 0.9739011 -0.9786968 0.9997688 0.9739011 -0.980031 0.9997688 0.9739011 -0.981719 0.9997688 0.9739011 -0.9838545 0.9997688 0.9739011 -0.9865561 0.9997688 0.9739011 -0.9899741 0.9997688 0.9739011 -0.9942982 0.9997688 0.9739011 -0.9997688 0.9997688 0.9739011 -0.9998174 0.9954731 0.9792361 -0.9998557 0.9936849 0.9835029 -0.999886 0.993287 0.9869069 -0.9999099 0.9936128 0.9896173 -0.9999288 0.9942731 0.9917722 -0.9999437 0.9950481 0.9934833 -0.9790927 0.9998174 0.9792411 -0.9790927 0.9998174 0.979241 -0.9790927 0.9998174 0.9792409 -0.9790926 0.9998174 0.9792408 -0.9790925 0.9998174 0.9792407 -0.9790925 0.9998174 0.9792405 -0.9790924 0.9998174 0.9792403 -0.9790923 0.9998174 0.9792401 -0.9790921 0.9998174 0.9792398 -0.979092 0.9998174 0.9792394 -0.9790919 0.9998174 0.979239 -0.9790917 0.9998174 0.9792385 -0.9790916 0.9998174 0.9792379 -0.9790916 0.9998174 0.9792373 -0.9790917 0.9998174 0.9792367 -0.9790921 0.9998174 0.9792363 -0.9790931 0.9998174 0.9792361 -0.9790946 0.9998174 0.9792361 -0.9790965 0.9998174 0.9792361 -0.9790988 0.9998174 0.9792361 -0.9791018 0.9998174 0.9792361 -0.9791055 0.9998174 0.9792361 -0.9791103 0.9998174 0.9792361 -0.9791163 0.9998174 0.9792361 -0.9791238 0.9998174 0.9792361 -0.9791334 0.9998174 0.9792361 -0.9791456 0.9998174 0.9792361 -0.979161 0.9998174 0.9792361 -0.9791804 0.9998174 0.9792361 -0.979205 0.9998174 0.9792361 -0.9792361 0.9998174 0.9792361 -0.9792755 0.9998174 0.9792361 -0.9793253 0.9998174 0.9792361 -0.9793883 0.9998174 0.9792361 -0.9794681 0.9998174 0.9792361 -0.9795689 0.9998174 0.9792361 -0.9796966 0.9998174 0.9792361 -0.979858 0.9998174 0.9792361 -0.9800622 0.9998174 0.9792361 -0.9803206 0.9998174 0.9792361 -0.9806476 0.9998174 0.9792361 -0.9810611 0.9998174 0.9792361 -0.9815844 0.9998174 0.9792361 -0.9822464 0.9998174 0.9792361 -0.9830838 0.9998174 0.9792361 -0.9841433 0.9998174 0.9792361 -0.9854838 0.9998174 0.9792361 -0.9871796 0.9998174 0.9792361 -0.989325 0.9998174 0.9792361 -0.9920392 0.9998174 0.9792361 -0.9954731 0.9998174 0.9792361 -0.9998174 0.9998174 0.9792361 -0.9998557 0.9964092 0.9835029 -0.999886 0.9949941 0.9869069 -0.9999099 0.9946818 0.9896173 -0.9999288 0.9949422 0.9917722 -0.9999437 0.9954668 0.9934833 -0.9834129 0.9998557 0.983506 -0.9834129 0.9998557 0.9835059 -0.9834129 0.9998557 0.9835059 -0.9834129 0.9998557 0.9835058 -0.9834128 0.9998557 0.9835057 -0.9834128 0.9998557 0.9835056 -0.9834127 0.9998557 0.9835055 -0.9834127 0.9998557 0.9835053 -0.9834126 0.9998557 0.9835052 -0.9834125 0.9998557 0.9835049 -0.9834124 0.9998557 0.9835047 -0.9834123 0.9998557 0.9835043 -0.9834122 0.9998557 0.983504 -0.9834122 0.9998557 0.9835036 -0.9834123 0.9998557 0.9835032 -0.9834126 0.9998557 0.983503 -0.9834132 0.9998557 0.9835029 -0.9834141 0.9998557 0.9835029 -0.9834153 0.9998557 0.9835029 -0.9834167 0.9998557 0.9835029 -0.9834186 0.9998557 0.9835029 -0.9834209 0.9998557 0.9835029 -0.9834239 0.9998557 0.9835029 -0.9834277 0.9998557 0.9835029 -0.9834324 0.9998557 0.9835029 -0.9834385 0.9998557 0.9835029 -0.9834461 0.9998557 0.9835029 -0.9834557 0.9998557 0.9835029 -0.9834679 0.9998557 0.9835029 -0.9834833 0.9998557 0.9835029 -0.9835029 0.9998557 0.9835029 -0.9835276 0.9998557 0.9835029 -0.9835588 0.9998557 0.9835029 -0.9835983 0.9998557 0.9835029 -0.9836483 0.9998557 0.9835029 -0.9837116 0.9998557 0.9835029 -0.9837916 0.9998557 0.9835029 -0.9838928 0.9998557 0.9835029 -0.9840209 0.9998557 0.9835029 -0.9841829 0.9998557 0.9835029 -0.984388 0.9998557 0.9835029 -0.9846473 0.9998557 0.9835029 -0.9849754 0.9998557 0.9835029 -0.9853905 0.9998557 0.9835029 -0.9859157 0.9998557 0.9835029 -0.9865801 0.9998557 0.9835029 -0.9874207 0.9998557 0.9835029 -0.9884841 0.9998557 0.9835029 -0.9898295 0.9998557 0.9835029 -0.9915316 0.9998557 0.9835029 -0.9936849 0.9998557 0.9835029 -0.9964092 0.9998557 0.9835029 -0.9998557 0.9998557 0.9835029 -0.999886 0.9971537 0.9869069 -0.9999099 0.9960342 0.9896173 -0.9999288 0.9957887 0.9917722 -0.9999437 0.9959964 0.9934833 -0.9868505 0.999886 0.9869088 -0.9868505 0.999886 0.9869088 -0.9868505 0.999886 0.9869087 -0.9868505 0.999886 0.9869087 -0.9868504 0.999886 0.9869087 -0.9868504 0.999886 0.9869086 -0.9868504 0.999886 0.9869085 -0.9868503 0.999886 0.9869084 -0.9868503 0.999886 0.9869083 -0.9868502 0.999886 0.9869082 -0.9868502 0.999886 0.986908 -0.9868501 0.999886 0.9869078 -0.9868501 0.999886 0.9869076 -0.98685 0.999886 0.9869073 -0.9868501 0.999886 0.9869071 -0.9868503 0.999886 0.9869069 -0.9868507 0.999886 0.9869069 -0.9868512 0.999886 0.9869069 -0.986852 0.999886 0.9869069 -0.9868529 0.999886 0.9869069 -0.9868541 0.999886 0.9869069 -0.9868555 0.999886 0.9869069 -0.9868574 0.999886 0.9869069 -0.9868597 0.999886 0.9869069 -0.9868627 0.999886 0.9869069 -0.9868665 0.999886 0.9869069 -0.9868713 0.999886 0.9869069 -0.9868773 0.999886 0.9869069 -0.986885 0.999886 0.9869069 -0.9868946 0.999886 0.9869069 -0.9869069 0.999886 0.9869069 -0.9869223 0.999886 0.9869069 -0.9869419 0.999886 0.9869069 -0.9869667 0.999886 0.9869069 -0.986998 0.999886 0.9869069 -0.9870376 0.999886 0.9869069 -0.9870878 0.999886 0.9869069 -0.9871512 0.999886 0.9869069 -0.9872315 0.999886 0.9869069 -0.987333 0.999886 0.9869069 -0.9874615 0.999886 0.9869069 -0.987624 0.999886 0.9869069 -0.9878296 0.999886 0.9869069 -0.9880897 0.999886 0.9869069 -0.9884188 0.999886 0.9869069 -0.9888351 0.999886 0.9869069 -0.9893618 0.999886 0.9869069 -0.9900282 0.999886 0.9869069 -0.9908712 0.999886 0.9869069 -0.9919377 0.999886 0.9869069 -0.993287 0.999886 0.9869069 -0.9949941 0.999886 0.9869069 -0.9971537 0.999886 0.9869069 -0.999886 0.999886 0.9869069 -0.9999099 0.9977452 0.9896173 -0.9999288 0.9968597 0.9917722 -0.9999437 0.9966665 0.9934833 -0.989582 0.9999099 0.9896185 -0.989582 0.9999099 0.9896185 -0.989582 0.9999099 0.9896185 -0.989582 0.9999099 0.9896185 -0.989582 0.9999099 0.9896184 -0.9895819 0.9999099 0.9896184 -0.9895819 0.9999099 0.9896183 -0.9895819 0.9999099 0.9896183 -0.9895819 0.9999099 0.9896182 -0.9895818 0.9999099 0.9896181 -0.9895818 0.9999099 0.989618 -0.9895818 0.9999099 0.9896179 -0.9895817 0.9999099 0.9896177 -0.9895817 0.9999099 0.9896176 -0.9895817 0.9999099 0.9896174 -0.9895819 0.9999099 0.9896173 -0.9895821 0.9999099 0.9896173 -0.9895825 0.9999099 0.9896173 -0.9895829 0.9999099 0.9896173 -0.9895835 0.9999099 0.9896173 -0.9895842 0.9999099 0.9896173 -0.9895851 0.9999099 0.9896173 -0.9895863 0.9999099 0.9896173 -0.9895878 0.9999099 0.9896173 -0.9895897 0.9999099 0.9896173 -0.989592 0.9999099 0.9896173 -0.989595 0.9999099 0.9896173 -0.9895988 0.9999099 0.9896173 -0.9896036 0.9999099 0.9896173 -0.9896096 0.9999099 0.9896173 -0.9896173 0.9999099 0.9896173 -0.989627 0.9999099 0.9896173 -0.9896392 0.9999099 0.9896173 -0.9896547 0.9999099 0.9896173 -0.9896744 0.9999099 0.9896173 -0.9896992 0.9999099 0.9896173 -0.9897306 0.9999099 0.9896173 -0.9897703 0.9999099 0.9896173 -0.9898206 0.9999099 0.9896173 -0.9898842 0.9999099 0.9896173 -0.9899646 0.9999099 0.9896173 -0.9900664 0.9999099 0.9896173 -0.9901951 0.9999099 0.9896173 -0.990358 0.9999099 0.9896173 -0.9905641 0.9999099 0.9896173 -0.9908248 0.9999099 0.9896173 -0.9911547 0.9999099 0.9896173 -0.991572 0.9999099 0.9896173 -0.9920999 0.9999099 0.9896173 -0.9927678 0.9999099 0.9896173 -0.9936128 0.9999099 0.9896173 -0.9946818 0.9999099 0.9896173 -0.9960342 0.9999099 0.9896173 -0.9977452 0.9999099 0.9896173 -0.9999099 0.9999099 0.9896173 -0.9999288 0.9982146 0.9917722 -0.9999437 0.9975143 0.9934833 -0.9917501 0.9999288 0.9917729 -0.9917501 0.9999288 0.9917729 -0.9917501 0.9999288 0.9917729 -0.9917501 0.9999288 0.9917729 -0.9917501 0.9999288 0.9917729 -0.9917501 0.9999288 0.9917729 -0.99175 0.9999288 0.9917728 -0.99175 0.9999288 0.9917728 -0.99175 0.9999288 0.9917727 -0.99175 0.9999288 0.9917727 -0.99175 0.9999288 0.9917726 -0.9917499 0.9999288 0.9917725 -0.9917499 0.9999288 0.9917725 -0.9917499 0.9999288 0.9917724 -0.9917499 0.9999288 0.9917723 -0.99175 0.9999288 0.9917722 -0.9917502 0.9999288 0.9917722 -0.9917504 0.9999288 0.9917722 -0.9917507 0.9999288 0.9917722 -0.991751 0.9999288 0.9917722 -0.9917515 0.9999288 0.9917722 -0.9917521 0.9999288 0.9917722 -0.9917528 0.9999288 0.9917722 -0.9917537 0.9999288 0.9917722 -0.9917549 0.9999288 0.9917722 -0.9917564 0.9999288 0.9917722 -0.9917582 0.9999288 0.9917722 -0.9917606 0.9999288 0.9917722 -0.9917636 0.9999288 0.9917722 -0.9917674 0.9999288 0.9917722 -0.9917722 0.9999288 0.9917722 -0.9917782 0.9999288 0.9917722 -0.9917859 0.9999288 0.9917722 -0.9917956 0.9999288 0.9917722 -0.9918079 0.9999288 0.9917722 -0.9918234 0.9999288 0.9917722 -0.9918431 0.9999288 0.9917722 -0.991868 0.9999288 0.9917722 -0.9918994 0.9999288 0.9917722 -0.9919392 0.9999288 0.9917722 -0.9919896 0.9999288 0.9917722 -0.9920533 0.9999288 0.9917722 -0.9921339 0.9999288 0.9917722 -0.9922358 0.9999288 0.9917722 -0.9923648 0.9999288 0.9917722 -0.992528 0.9999288 0.9917722 -0.9927345 0.9999288 0.9917722 -0.9929957 0.9999288 0.9917722 -0.9933261 0.9999288 0.9917722 -0.9937442 0.9999288 0.9917722 -0.9942731 0.9999288 0.9917722 -0.9949422 0.9999288 0.9917722 -0.9957887 0.9999288 0.9917722 -0.9968597 0.9999288 0.9917722 -0.9982146 0.9999288 0.9917722 -0.9999288 0.9999288 0.9917722 -0.9999437 0.9985868 0.9934833 -0.9934695 0.9999437 0.9934838 -0.9934695 0.9999437 0.9934838 -0.9934695 0.9999437 0.9934838 -0.9934695 0.9999437 0.9934838 -0.9934695 0.9999437 0.9934837 -0.9934695 0.9999437 0.9934837 -0.9934695 0.9999437 0.9934837 -0.9934694 0.9999437 0.9934837 -0.9934694 0.9999437 0.9934837 -0.9934694 0.9999437 0.9934836 -0.9934694 0.9999437 0.9934836 -0.9934694 0.9999437 0.9934835 -0.9934694 0.9999437 0.9934835 -0.9934694 0.9999437 0.9934834 -0.9934694 0.9999437 0.9934834 -0.9934694 0.9999437 0.9934833 -0.9934695 0.9999437 0.9934833 -0.9934697 0.9999437 0.9934833 -0.9934698 0.9999437 0.9934833 -0.9934701 0.9999437 0.9934833 -0.9934704 0.9999437 0.9934833 -0.9934707 0.9999437 0.9934833 -0.9934712 0.9999437 0.9934833 -0.9934718 0.9999437 0.9934833 -0.9934725 0.9999437 0.9934833 -0.9934734 0.9999437 0.9934833 -0.9934746 0.9999437 0.9934833 -0.9934761 0.9999437 0.9934833 -0.9934779 0.9999437 0.9934833 -0.9934803 0.9999437 0.9934833 -0.9934833 0.9999437 0.9934833 -0.9934871 0.9999437 0.9934833 -0.9934919 0.9999437 0.9934833 -0.993498 0.9999437 0.9934833 -0.9935057 0.9999437 0.9934833 -0.9935154 0.9999437 0.9934833 -0.9935277 0.9999437 0.9934833 -0.9935432 0.9999437 0.9934833 -0.9935629 0.9999437 0.9934833 -0.9935878 0.9999437 0.9934833 -0.9936193 0.9999437 0.9934833 -0.9936592 0.9999437 0.9934833 -0.9937096 0.9999437 0.9934833 -0.9937734 0.9999437 0.9934833 -0.9938541 0.9999437 0.9934833 -0.9939562 0.9999437 0.9934833 -0.9940854 0.9999437 0.9934833 -0.9942488 0.9999437 0.9934833 -0.9944556 0.9999437 0.9934833 -0.9947172 0.9999437 0.9934833 -0.9950481 0.9999437 0.9934833 -0.9954668 0.9999437 0.9934833 -0.9959964 0.9999437 0.9934833 -0.9966665 0.9999437 0.9934833 -0.9975143 0.9999437 0.9934833 -0.9985868 0.9999437 0.9934833 -0.9999437 0.9999437 0.9934833 -0.2151269 0.2151269 0.9754027 -0.2152645 0.2151269 0.9754027 -0.2154385 0.2151269 0.9754027 -0.2156587 0.2151269 0.9754027 -0.2159373 0.2151269 0.9754027 -0.2162897 0.2151269 0.9754027 -0.2167356 0.2151269 0.9754027 -0.2172997 0.2151269 0.9754027 -0.2180133 0.2151269 0.9754027 -0.2189162 0.2151269 0.9754027 -0.2200584 0.2151269 0.9754027 -0.2215035 0.2151269 0.9754027 -0.2233317 0.2151269 0.9754027 -0.2256446 0.2151269 0.9754027 -0.2285707 0.2151269 0.9754027 -0.2322726 0.2151269 0.9754027 -0.236956 0.2151269 0.9754027 -0.2428812 0.2151269 0.9754027 -0.2503773 0.2151269 0.9754027 -0.2598608 0.2151269 0.9754027 -0.2718587 0.2151269 0.9754027 -0.2870375 0.2151269 0.9754027 -0.3062408 0.2151269 0.9754027 -0.3305354 0.2151269 0.9754027 -0.3612712 0.2151269 0.9754027 -0.4001561 0.2151269 0.9754027 -0.4493504 0.2151269 0.9754027 -0.5115877 0.2151269 0.9754027 -0.590326 0.2151269 0.9754027 -0.6899401 0.2151269 0.9754027 -0.8159649 0.2151269 0.9754027 -0.9754027 0.2151269 0.9754027 -0.9814251 0.2783684 0.8340079 -0.9858181 0.3454107 0.7454243 -0.9890841 0.4144197 0.6981193 -0.9915469 0.4834235 0.6816893 -0.993424 0.5504963 0.6870967 -0.9948662 0.6139459 0.7067995 -0.9959813 0.6724572 0.7347906 -0.9968475 0.7251659 0.76654 -0.997523 0.7716588 0.7988464 -0.9980513 0.8119154 0.829625 -0.9984653 0.8462171 0.8576667 -0.9987905 0.8750477 0.8824033 -0.9990461 0.8990028 0.9037033 -0.9992474 0.9187175 0.9217082 -0.999406 0.9348153 0.9367113 -0.999531 0.9478754 0.949074 -0.9996296 0.958416 0.9591719 -0.9997074 0.9668873 0.9673631 -0.9997689 0.9736726 0.9739717 -0.9998174 0.9790927 0.9792804 -0.9998557 0.9834129 0.9835307 -0.999886 0.9868505 0.9869243 -0.9999099 0.989582 0.9896282 -0.9999288 0.9917501 0.991779 -0.9999437 0.9934695 0.9934876 -0.2151269 0.2152645 0.9754027 -0.2150852 0.2150852 0.9753975 -0.2152593 0.2150852 0.9753975 -0.2154796 0.2150852 0.9753975 -0.2157582 0.2150852 0.9753975 -0.2161107 0.2150852 0.9753975 -0.2165567 0.2150852 0.9753975 -0.2171209 0.2150852 0.9753975 -0.2178347 0.2150852 0.9753975 -0.2187378 0.2150852 0.9753975 -0.2198803 0.2150852 0.9753975 -0.2213257 0.2150852 0.9753975 -0.2231543 0.2150852 0.9753975 -0.2254677 0.2150852 0.9753975 -0.2283945 0.2150852 0.9753975 -0.2320973 0.2150852 0.9753975 -0.2367818 0.2150852 0.9753975 -0.2427083 0.2150852 0.9753975 -0.2502061 0.2150852 0.9753975 -0.2596918 0.2150852 0.9753975 -0.2716924 0.2150852 0.9753975 -0.2868747 0.2150852 0.9753975 -0.3060824 0.2150852 0.9753975 -0.3303825 0.2150852 0.9753975 -0.3611254 0.2150852 0.9753975 -0.4000191 0.2150852 0.9753975 -0.4492248 0.2150852 0.9753975 -0.5114763 0.2150852 0.9753975 -0.5902326 0.2150852 0.9753975 -0.6898695 0.2150852 0.9753975 -0.8159232 0.2150852 0.9753975 -0.9753975 0.2150852 0.9753975 -0.9814221 0.2783325 0.8339769 -0.9858163 0.3453807 0.7453848 -0.9890831 0.4143955 0.6980806 -0.9915463 0.4834045 0.6816556 -0.9934236 0.5504818 0.6870695 -0.994866 0.6139352 0.7067787 -0.9959811 0.6724495 0.7347753 -0.9968474 0.7251605 0.766529 -0.997523 0.7716551 0.7988387 -0.9980512 0.8119128 0.8296198 -0.9984653 0.8462154 0.8576632 -0.9987905 0.8750466 0.882401 -0.9990461 0.899002 0.9037018 -0.9992474 0.918717 0.9217073 -0.999406 0.9348149 0.9367107 -0.999531 0.9478752 0.9490736 -0.9996296 0.9584159 0.9591716 -0.9997074 0.9668872 0.9673629 -0.9997689 0.9736726 0.9739715 -0.9998174 0.9790927 0.9792804 -0.9998557 0.9834129 0.9835306 -0.999886 0.9868505 0.9869242 -0.9999099 0.989582 0.9896282 -0.9999288 0.9917501 0.991779 -0.9999437 0.9934695 0.9934876 -0.2151269 0.2154385 0.9754027 -0.2150852 0.2152593 0.9753975 -0.2150342 0.2150342 0.9753908 -0.2152545 0.2150342 0.9753908 -0.2155333 0.2150342 0.9753908 -0.2158859 0.2150342 0.9753908 -0.216332 0.2150342 0.9753908 -0.2168964 0.2150342 0.9753908 -0.2176104 0.2150342 0.9753908 -0.2185137 0.2150342 0.9753908 -0.2196565 0.2150342 0.9753908 -0.2211023 0.2150342 0.9753908 -0.2229315 0.2150342 0.9753908 -0.2252456 0.2150342 0.9753908 -0.2281732 0.2150342 0.9753908 -0.2318771 0.2150342 0.9753908 -0.2365629 0.2150342 0.9753908 -0.2424911 0.2150342 0.9753908 -0.249991 0.2150342 0.9753908 -0.2594794 0.2150342 0.9753908 -0.2714835 0.2150342 0.9753908 -0.2866702 0.2150342 0.9753908 -0.3058834 0.2150342 0.9753908 -0.3301905 0.2150342 0.9753908 -0.3609422 0.2150342 0.9753908 -0.3998472 0.2150342 0.9753908 -0.4490669 0.2150342 0.9753908 -0.5113363 0.2150342 0.9753908 -0.5901152 0.2150342 0.9753908 -0.6897808 0.2150342 0.9753908 -0.8158707 0.2150342 0.9753908 -0.9753908 0.2150342 0.9753908 -0.9814183 0.2782884 0.8339379 -0.9858141 0.3453439 0.7453352 -0.9890818 0.4143657 0.6980319 -0.9915455 0.4833811 0.6816133 -0.9934231 0.550464 0.6870354 -0.9948657 0.6139219 0.7067525 -0.9959809 0.6724399 0.734756 -0.9968473 0.7251537 0.7665152 -0.9975229 0.7716504 0.7988291 -0.9980512 0.8119096 0.8296133 -0.9984653 0.8462132 0.8576588 -0.9987904 0.8750451 0.8823981 -0.9990461 0.8990011 0.9036999 -0.9992474 0.9187164 0.921706 -0.999406 0.9348146 0.9367099 -0.999531 0.947875 0.9490731 -0.9996296 0.9584157 0.9591713 -0.9997074 0.9668871 0.9673627 -0.9997689 0.9736725 0.9739714 -0.9998174 0.9790927 0.9792803 -0.9998557 0.9834129 0.9835306 -0.999886 0.9868505 0.9869242 -0.9999099 0.989582 0.9896282 -0.9999288 0.9917501 0.991779 -0.9999437 0.9934695 0.9934876 -0.2151269 0.2156587 0.9754027 -0.2150852 0.2154796 0.9753975 -0.2150342 0.2152545 0.9753908 -0.2149725 0.2149725 0.9753825 -0.2152513 0.2149725 0.9753825 -0.215604 0.2149725 0.9753825 -0.2160503 0.2149725 0.9753825 -0.2166149 0.2149725 0.9753825 -0.2173291 0.2149725 0.9753825 -0.2182328 0.2149725 0.9753825 -0.219376 0.2149725 0.9753825 -0.2208224 0.2149725 0.9753825 -0.2226522 0.2149725 0.9753825 -0.2249671 0.2149725 0.9753825 -0.2278958 0.2149725 0.9753825 -0.231601 0.2149725 0.9753825 -0.2362885 0.2149725 0.9753825 -0.2422188 0.2149725 0.9753825 -0.2497215 0.2149725 0.9753825 -0.2592133 0.2149725 0.9753825 -0.2712217 0.2149725 0.9753825 -0.2864139 0.2149725 0.9753825 -0.3056339 0.2149725 0.9753825 -0.3299499 0.2149725 0.9753825 -0.3607126 0.2149725 0.9753825 -0.3996316 0.2149725 0.9753825 -0.448869 0.2149725 0.9753825 -0.5111609 0.2149725 0.9753825 -0.5899682 0.2149725 0.9753825 -0.6896696 0.2149725 0.9753825 -0.8158049 0.2149725 0.9753825 -0.9753825 0.2149725 0.9753825 -0.9814136 0.2782347 0.8338891 -0.9858113 0.3452987 0.745273 -0.9890801 0.414329 0.6979709 -0.9915446 0.4833522 0.6815603 -0.9934225 0.5504419 0.6869926 -0.9948653 0.6139056 0.7067197 -0.9959807 0.672428 0.7347318 -0.9968472 0.7251454 0.7664979 -0.9975228 0.7716446 0.7988171 -0.9980511 0.8119057 0.8296051 -0.9984653 0.8462106 0.8576533 -0.9987904 0.8750434 0.8823944 -0.9990461 0.899 0.9036975 -0.9992474 0.9187157 0.9217045 -0.999406 0.9348141 0.9367089 -0.999531 0.9478746 0.9490724 -0.9996296 0.9584155 0.9591709 -0.9997074 0.966887 0.9673625 -0.9997689 0.9736724 0.9739713 -0.9998174 0.9790926 0.9792802 -0.9998557 0.9834129 0.9835305 -0.999886 0.9868505 0.9869242 -0.9999099 0.989582 0.9896281 -0.9999288 0.9917501 0.991779 -0.9999437 0.9934695 0.9934876 -0.2151269 0.2159373 0.9754027 -0.2150852 0.2157582 0.9753975 -0.2150342 0.2155333 0.9753908 -0.2149725 0.2152513 0.9753825 -0.2148987 0.2148987 0.9753721 -0.2152516 0.2148987 0.9753721 -0.2156981 0.2148987 0.9753721 -0.2162629 0.2148987 0.9753721 -0.2169775 0.2148987 0.9753721 -0.2178815 0.2148987 0.9753721 -0.2190253 0.2148987 0.9753721 -0.2204723 0.2148987 0.9753721 -0.2223029 0.2148987 0.9753721 -0.2246189 0.2148987 0.9753721 -0.2275489 0.2148987 0.9753721 -0.2312557 0.2148987 0.9753721 -0.2359454 0.2148987 0.9753721 -0.2418784 0.2148987 0.9753721 -0.2493844 0.2148987 0.9753721 -0.2588805 0.2148987 0.9753721 -0.2708943 0.2148987 0.9753721 -0.2860933 0.2148987 0.9753721 -0.305322 0.2148987 0.9753721 -0.3296489 0.2148987 0.9753721 -0.3604255 0.2148987 0.9753721 -0.399362 0.2148987 0.9753721 -0.4486216 0.2148987 0.9753721 -0.5109415 0.2148987 0.9753721 -0.5897842 0.2148987 0.9753721 -0.6895306 0.2148987 0.9753721 -0.8157227 0.2148987 0.9753721 -0.9753721 0.2148987 0.9753721 -0.9814076 0.2781701 0.8338281 -0.9858079 0.3452442 0.7451952 -0.9890781 0.4142845 0.6978947 -0.9915433 0.4833171 0.681494 -0.9934218 0.550415 0.6869391 -0.9948649 0.6138855 0.7066787 -0.9959804 0.6724135 0.7347016 -0.996847 0.7251351 0.7664763 -0.9975227 0.7716375 0.7988021 -0.9980511 0.8119009 0.8295948 -0.9984652 0.8462073 0.8576464 -0.9987904 0.8750412 0.8823899 -0.9990461 0.8989986 0.9036945 -0.9992474 0.9187148 0.9217025 -0.999406 0.9348135 0.9367077 -0.999531 0.9478743 0.9490716 -0.9996296 0.9584153 0.9591704 -0.9997074 0.9668869 0.9673622 -0.9997689 0.9736723 0.9739711 -0.9998174 0.9790925 0.9792801 -0.9998557 0.9834128 0.9835304 -0.999886 0.9868504 0.9869241 -0.9999099 0.989582 0.9896281 -0.9999288 0.9917501 0.991779 -0.9999437 0.9934695 0.9934875 -0.2151269 0.2162897 0.9754027 -0.2150852 0.2161107 0.9753975 -0.2150342 0.2158859 0.9753908 -0.2149725 0.215604 0.9753825 -0.2148987 0.2152516 0.9753721 -0.2148124 0.2148124 0.9753591 -0.2152591 0.2148124 0.9753591 -0.2158242 0.2148124 0.9753591 -0.2165392 0.2148124 0.9753591 -0.2174438 0.2148124 0.9753591 -0.2185882 0.2148124 0.9753591 -0.220036 0.2148124 0.9753591 -0.2218676 0.2148124 0.9753591 -0.2241849 0.2148124 0.9753591 -0.2271165 0.2148124 0.9753591 -0.2308255 0.2148124 0.9753591 -0.2355177 0.2148124 0.9753591 -0.2414541 0.2148124 0.9753591 -0.2489643 0.2148124 0.9753591 -0.2584657 0.2148124 0.9753591 -0.2704863 0.2148124 0.9753591 -0.2856938 0.2148124 0.9753591 -0.3049333 0.2148124 0.9753591 -0.3292738 0.2148124 0.9753591 -0.3600677 0.2148124 0.9753591 -0.399026 0.2148124 0.9753591 -0.4483133 0.2148124 0.9753591 -0.5106681 0.2148124 0.9753591 -0.589555 0.2148124 0.9753591 -0.6893573 0.2148124 0.9753591 -0.8156201 0.2148124 0.9753591 -0.9753591 0.2148124 0.9753591 -0.9814002 0.2780936 0.8337521 -0.9858036 0.3451791 0.7450984 -0.9890755 0.4142311 0.6977997 -0.9915418 0.4832747 0.6814115 -0.9934209 0.5503825 0.6868724 -0.9948643 0.6138613 0.7066276 -0.9959801 0.6723959 0.7346639 -0.9968468 0.7251226 0.7664494 -0.9975226 0.7716288 0.7987833 -0.998051 0.8118949 0.829582 -0.9984652 0.8462034 0.8576378 -0.9987904 0.8750386 0.8823842 -0.9990461 0.8989969 0.9036908 -0.9992474 0.9187137 0.9217001 -0.9994059 0.9348128 0.9367061 -0.999531 0.9478738 0.9490706 -0.9996296 0.958415 0.9591697 -0.9997074 0.9668867 0.9673618 -0.9997689 0.9736722 0.9739708 -0.9998174 0.9790925 0.9792799 -0.9998557 0.9834128 0.9835303 -0.999886 0.9868504 0.9869241 -0.9999099 0.9895819 0.9896281 -0.9999288 0.9917501 0.9917789 -0.9999437 0.9934695 0.9934875 -0.2151269 0.2167356 0.9754027 -0.2150852 0.2165567 0.9753975 -0.2150342 0.216332 0.9753908 -0.2149725 0.2160503 0.9753825 -0.2148987 0.2156981 0.9753721 -0.2148124 0.2152591 0.9753591 -0.2147144 0.2147144 0.975343 -0.2152799 0.2147144 0.975343 -0.2159954 0.2147144 0.975343 -0.2169006 0.2147144 0.975343 -0.2180458 0.2147144 0.975343 -0.2194946 0.2147144 0.975343 -0.2213275 0.2147144 0.975343 -0.2236464 0.2147144 0.975343 -0.2265801 0.2147144 0.975343 -0.2302916 0.2147144 0.975343 -0.2349871 0.2147144 0.975343 -0.2409276 0.2147144 0.975343 -0.2484431 0.2147144 0.975343 -0.2579511 0.2147144 0.975343 -0.26998 0.2147144 0.975343 -0.2851981 0.2147144 0.975343 -0.304451 0.2147144 0.975343 -0.3288084 0.2147144 0.975343 -0.3596237 0.2147144 0.975343 -0.3986091 0.2147144 0.975343 -0.4479306 0.2147144 0.975343 -0.5103288 0.2147144 0.975343 -0.5892706 0.2147144 0.975343 -0.6891423 0.2147144 0.975343 -0.815493 0.2147144 0.975343 -0.975343 0.2147144 0.975343 -0.9813911 0.2780055 0.8336578 -0.9857982 0.3451032 0.7449782 -0.9890723 0.4141683 0.6976819 -0.9915399 0.4832246 0.6813091 -0.9934197 0.5503438 0.6867898 -0.9948636 0.6138323 0.7065643 -0.9959797 0.6723748 0.7346173 -0.9968465 0.7251076 0.7664161 -0.9975224 0.7716184 0.7987601 -0.9980509 0.8118878 0.8295662 -0.9984651 0.8461986 0.8576272 -0.9987903 0.8750355 0.8823772 -0.9990461 0.8989948 0.9036862 -0.9992473 0.9187123 0.9216972 -0.9994059 0.9348119 0.9367042 -0.999531 0.9478733 0.9490694 -0.9996296 0.9584146 0.959169 -0.9997074 0.9668865 0.9673613 -0.9997689 0.9736721 0.9739705 -0.9998174 0.9790924 0.9792797 -0.9998557 0.9834127 0.9835302 -0.999886 0.9868504 0.986924 -0.9999099 0.9895819 0.989628 -0.9999288 0.99175 0.9917789 -0.9999437 0.9934695 0.9934875 -0.2151269 0.2172997 0.9754027 -0.2150852 0.2171209 0.9753975 -0.2150342 0.2168964 0.9753908 -0.2149725 0.2166149 0.9753825 -0.2148987 0.2162629 0.9753721 -0.2148124 0.2158242 0.9753591 -0.2147144 0.2152799 0.975343 -0.2146085 0.2146085 0.9753231 -0.2153246 0.2146085 0.9753231 -0.2162305 0.2146085 0.9753231 -0.2173767 0.2146085 0.9753231 -0.2188268 0.2146085 0.9753231 -0.2206612 0.2146085 0.9753231 -0.2229821 0.2146085 0.9753231 -0.2259183 0.2146085 0.9753231 -0.229633 0.2146085 0.9753231 -0.2343326 0.2146085 0.9753231 -0.2402781 0.2146085 0.9753231 -0.2478 0.2146085 0.9753231 -0.2573162 0.2146085 0.9753231 -0.2693554 0.2146085 0.9753231 -0.2845866 0.2146085 0.9753231 -0.303856 0.2146085 0.9753231 -0.3282343 0.2146085 0.9753231 -0.359076 0.2146085 0.9753231 -0.3980948 0.2146085 0.9753231 -0.4474586 0.2146085 0.9753231 -0.5099103 0.2146085 0.9753231 -0.5889198 0.2146085 0.9753231 -0.6888771 0.2146085 0.9753231 -0.815336 0.2146085 0.9753231 -0.9753231 0.2146085 0.9753231 -0.9813797 0.2779077 0.8335415 -0.9857916 0.3450175 0.74483 -0.9890684 0.4140964 0.6975366 -0.9915376 0.4831666 0.6811829 -0.9934183 0.5502987 0.686688 -0.9948628 0.6137984 0.7064863 -0.9959791 0.67235 0.7345598 -0.9968462 0.7250899 0.766375 -0.9975222 0.7716061 0.7987315 -0.9980508 0.8118794 0.8295466 -0.998465 0.8461929 0.8576141 -0.9987903 0.8750317 0.8823685 -0.999046 0.8989923 0.9036806 -0.9992473 0.9187107 0.9216935 -0.9994059 0.9348109 0.9367018 -0.999531 0.9478726 0.9490679 -0.9996296 0.9584142 0.959168 -0.9997074 0.9668862 0.9673607 -0.9997689 0.9736719 0.9739701 -0.9998174 0.9790923 0.9792795 -0.9998557 0.9834127 0.98353 -0.999886 0.9868503 0.9869239 -0.9999099 0.9895819 0.989628 -0.9999288 0.99175 0.9917789 -0.9999437 0.9934694 0.9934875 -0.2151269 0.2180133 0.9754027 -0.2150852 0.2178347 0.9753975 -0.2150342 0.2176104 0.9753908 -0.2149725 0.2173291 0.9753825 -0.2148987 0.2169775 0.9753721 -0.2148124 0.2165392 0.9753591 -0.2147144 0.2159954 0.975343 -0.2146085 0.2153246 0.9753231 -0.2145034 0.2145034 0.9752987 -0.2154103 0.2145034 0.9752987 -0.2165577 0.2145034 0.9752987 -0.2180092 0.2145034 0.9752987 -0.2198456 0.2145034 0.9752987 -0.2221689 0.2145034 0.9752987 -0.2251082 0.2145034 0.9752987 -0.2288268 0.2145034 0.9752987 -0.2335313 0.2145034 0.9752987 -0.2394831 0.2145034 0.9752987 -0.2470129 0.2145034 0.9752987 -0.256539 0.2145034 0.9752987 -0.2685909 0.2145034 0.9752987 -0.283838 0.2145034 0.9752987 -0.3031276 0.2145034 0.9752987 -0.3275315 0.2145034 0.9752987 -0.3584055 0.2145034 0.9752987 -0.3974652 0.2145034 0.9752987 -0.4468808 0.2145034 0.9752987 -0.509398 0.2145034 0.9752987 -0.5884903 0.2145034 0.9752987 -0.6885524 0.2145034 0.9752987 -0.8151439 0.2145034 0.9752987 -0.9752987 0.2145034 0.9752987 -0.9813659 0.2778058 0.8333991 -0.9857835 0.3449254 0.7446487 -0.9890637 0.4140176 0.6973589 -0.9915347 0.4831021 0.6810286 -0.9934166 0.550248 0.6865634 -0.9948617 0.6137599 0.7063908 -0.9959785 0.6723217 0.7344894 -0.9968458 0.7250697 0.7663248 -0.997522 0.7715919 0.7986965 -0.9980506 0.8118697 0.8295228 -0.9984649 0.8461864 0.8575981 -0.9987902 0.8750274 0.8823579 -0.999046 0.8989895 0.9036736 -0.9992473 0.9187089 0.921689 -0.9994059 0.9348097 0.9366989 -0.999531 0.9478718 0.949066 -0.9996296 0.9584137 0.9591668 -0.9997074 0.9668859 0.9673599 -0.9997689 0.9736717 0.9739696 -0.9998174 0.9790921 0.9792792 -0.9998557 0.9834126 0.9835298 -0.999886 0.9868503 0.9869238 -0.9999099 0.9895819 0.9896279 -0.9999288 0.99175 0.9917788 -0.9999437 0.9934694 0.9934875 -0.2151269 0.2189162 0.9754027 -0.2150852 0.2187378 0.9753975 -0.2150342 0.2185137 0.9753908 -0.2149725 0.2182328 0.9753825 -0.2148987 0.2178815 0.9753721 -0.2148124 0.2174438 0.9753591 -0.2147144 0.2169006 0.975343 -0.2146085 0.2162305 0.9753231 -0.2145034 0.2154103 0.9752987 -0.2144168 0.2144168 0.9752692 -0.2155656 0.2144168 0.9752692 -0.217019 0.2144168 0.9752692 -0.2188577 0.2144168 0.9752692 -0.221184 0.2144168 0.9752692 -0.224127 0.2144168 0.9752692 -0.2278503 0.2144168 0.9752692 -0.2325608 0.2144168 0.9752692 -0.2385201 0.2144168 0.9752692 -0.2460594 0.2144168 0.9752692 -0.2555977 0.2144168 0.9752692 -0.2676648 0.2144168 0.9752692 -0.2829313 0.2144168 0.9752692 -0.3022454 0.2144168 0.9752692 -0.3266802 0.2144168 0.9752692 -0.3575934 0.2144168 0.9752692 -0.3967026 0.2144168 0.9752692 -0.4461809 0.2144168 0.9752692 -0.5087774 0.2144168 0.9752692 -0.5879701 0.2144168 0.9752692 -0.6881591 0.2144168 0.9752692 -0.8149113 0.2144168 0.9752692 -0.9752692 0.2144168 0.9752692 -0.9813491 0.2777122 0.8332267 -0.9857738 0.3448353 0.7444293 -0.9890579 0.4139373 0.6971439 -0.9915312 0.4830346 0.6808418 -0.9934145 0.5501939 0.6864128 -0.9948604 0.6137183 0.7062754 -0.9959777 0.6722907 0.7344044 -0.9968453 0.7250473 0.7662641 -0.9975217 0.7715762 0.7986542 -0.9980504 0.8118589 0.8294939 -0.9984648 0.8461791 0.8575787 -0.9987902 0.8750225 0.8823451 -0.9990459 0.8989863 0.9036652 -0.9992473 0.9187068 0.9216836 -0.9994059 0.9348083 0.9366954 -0.9995309 0.947871 0.9490638 -0.9996296 0.9584132 0.9591654 -0.9997074 0.9668855 0.967359 -0.9997689 0.9736715 0.9739691 -0.9998174 0.979092 0.9792788 -0.9998557 0.9834125 0.9835296 -0.999886 0.9868502 0.9869236 -0.9999099 0.9895818 0.9896278 -0.9999288 0.99175 0.9917788 -0.9999437 0.9934694 0.9934874 -0.2151269 0.2200584 0.9754027 -0.2150852 0.2198803 0.9753975 -0.2150342 0.2196565 0.9753908 -0.2149725 0.219376 0.9753825 -0.2148987 0.2190253 0.9753721 -0.2148124 0.2185882 0.9753591 -0.2147144 0.2180458 0.975343 -0.2146085 0.2173767 0.9753231 -0.2145034 0.2165577 0.9752987 -0.2144168 0.2155656 0.9752692 -0.2143816 0.2143816 0.975234 -0.2158372 0.2143816 0.975234 -0.2176788 0.2143816 0.975234 -0.2200085 0.2143816 0.975234 -0.222956 0.2143816 0.975234 -0.2266849 0.2143816 0.975234 -0.2314025 0.2143816 0.975234 -0.2373708 0.2143816 0.975234 -0.2449216 0.2143816 0.975234 -0.2544742 0.2143816 0.975234 -0.2665596 0.2143816 0.975234 -0.2818492 0.2143816 0.975234 -0.3011925 0.2143816 0.975234 -0.3256642 0.2143816 0.975234 -0.3566242 0.2143816 0.975234 -0.3957926 0.2143816 0.975234 -0.4453457 0.2143816 0.975234 -0.5080368 0.2143816 0.975234 -0.5873492 0.2143816 0.975234 -0.6876897 0.2143816 0.975234 -0.8146336 0.2143816 0.975234 -0.975234 0.2143816 0.975234 -0.9813291 0.2776503 0.8330211 -0.9857621 0.3447636 0.7441676 -0.989051 0.4138668 0.6968875 -0.9915271 0.4829718 0.6806192 -0.993412 0.5501416 0.6862332 -0.9948589 0.6136769 0.7061378 -0.9959768 0.6722594 0.7343031 -0.9968448 0.7250244 0.7661917 -0.9975213 0.7715599 0.7986038 -0.9980502 0.8118476 0.8294595 -0.9984647 0.8461714 0.8575557 -0.9987901 0.8750173 0.8823298 -0.9990459 0.8989829 0.9036553 -0.9992472 0.9187045 0.9216771 -0.9994059 0.9348069 0.9366913 -0.9995309 0.94787 0.9490611 -0.9996296 0.9584126 0.9591637 -0.9997074 0.9668852 0.9673579 -0.9997689 0.9736712 0.9739684 -0.9998174 0.9790919 0.9792784 -0.9998557 0.9834124 0.9835294 -0.999886 0.9868502 0.9869235 -0.9999099 0.9895818 0.9896277 -0.9999288 0.99175 0.9917787 -0.9999437 0.9934694 0.9934874 -0.2151269 0.2215035 0.9754027 -0.2150852 0.2213257 0.9753975 -0.2150342 0.2211023 0.9753908 -0.2149725 0.2208224 0.9753825 -0.2148987 0.2204723 0.9753721 -0.2148124 0.220036 0.9753591 -0.2147144 0.2194946 0.975343 -0.2146085 0.2188268 0.9753231 -0.2145034 0.2180092 0.9752987 -0.2144168 0.217019 0.9752692 -0.2143816 0.2158372 0.975234 -0.2144566 0.2144566 0.9751928 -0.2163014 0.2144566 0.9751928 -0.2186353 0.2144566 0.9751928 -0.2215879 0.2144566 0.9751928 -0.2253234 0.2144566 0.9751928 -0.2300493 0.2144566 0.9751928 -0.2360282 0.2144566 0.9751928 -0.2435923 0.2144566 0.9751928 -0.2531618 0.2144566 0.9751928 -0.2652685 0.2144566 0.9751928 -0.280585 0.2144566 0.9751928 -0.2999624 0.2144566 0.9751928 -0.3244773 0.2144566 0.9751928 -0.3554919 0.2144566 0.9751928 -0.3947294 0.2144566 0.9751928 -0.4443699 0.2144566 0.9751928 -0.5071716 0.2144566 0.9751928 -0.5866239 0.2144566 0.9751928 -0.6871414 0.2144566 0.9751928 -0.8143091 0.2144566 0.9751928 -0.9751928 0.2144566 0.9751928 -0.9813057 0.2776626 0.832781 -0.9857485 0.3447407 0.7438622 -0.989043 0.4138277 0.6965883 -0.9915223 0.4829286 0.6803596 -0.9934091 0.5501012 0.6860238 -0.9948571 0.6136427 0.7059774 -0.9959757 0.6722322 0.7341849 -0.9968441 0.7250039 0.7661073 -0.9975209 0.7715449 0.7985451 -0.99805 0.811837 0.8294195 -0.9984645 0.8461641 0.8575288 -0.99879 0.8750124 0.882312 -0.9990458 0.8989796 0.9036436 -0.9992472 0.9187024 0.9216695 -0.9994059 0.9348055 0.9366864 -0.9995309 0.9478691 0.949058 -0.9996296 0.958412 0.9591617 -0.9997074 0.9668848 0.9673567 -0.9997689 0.973671 0.9739676 -0.9998174 0.9790917 0.9792779 -0.9998557 0.9834123 0.983529 -0.999886 0.9868501 0.9869233 -0.9999099 0.9895818 0.9896276 -0.9999288 0.9917499 0.9917786 -0.9999437 0.9934694 0.9934873 -0.2151269 0.2233317 0.9754027 -0.2150852 0.2231543 0.9753975 -0.2150342 0.2229315 0.9753908 -0.2149725 0.2226522 0.9753825 -0.2148987 0.2223029 0.9753721 -0.2148124 0.2218676 0.9753591 -0.2147144 0.2213275 0.975343 -0.2146085 0.2206612 0.9753231 -0.2145034 0.2198456 0.9752987 -0.2144168 0.2188577 0.9752692 -0.2143816 0.2176788 0.975234 -0.2144566 0.2163014 0.9751928 -0.2147432 0.2147432 0.9751462 -0.2170817 0.2147432 0.9751462 -0.2200403 0.2147432 0.9751462 -0.2237832 0.2147432 0.9751462 -0.2285185 0.2147432 0.9751462 -0.2345093 0.2147432 0.9751462 -0.2420885 0.2147432 0.9751462 -0.251677 0.2147432 0.9751462 -0.2638078 0.2147432 0.9751462 -0.2791549 0.2147432 0.9751462 -0.2985709 0.2147432 0.9751462 -0.3231346 0.2147432 0.9751462 -0.354211 0.2147432 0.9751462 -0.3935266 0.2147432 0.9751462 -0.443266 0.2147432 0.9751462 -0.5061928 0.2147432 0.9751462 -0.5858033 0.2147432 0.9751462 -0.6865211 0.2147432 0.9751462 -0.8139421 0.2147432 0.9751462 -0.9751462 0.2147432 0.9751462 -0.9812792 0.2778236 0.8325095 -0.9857332 0.3448204 0.743517 -0.9890339 0.4138582 0.6962504 -0.9915169 0.4829319 0.6800663 -0.9934058 0.5500915 0.6857874 -0.9948551 0.6136284 0.7057964 -0.9959745 0.672218 0.7340516 -0.9968433 0.7249916 0.7660121 -0.9975204 0.7715352 0.7984788 -0.9980497 0.8118298 0.8293742 -0.9984643 0.8461589 0.8574984 -0.9987899 0.8750088 0.882292 -0.9990458 0.8989771 0.9036305 -0.9992472 0.9187008 0.921661 -0.9994058 0.9348044 0.9366809 -0.9995309 0.9478684 0.9490545 -0.9996296 0.9584115 0.9591595 -0.9997074 0.9668845 0.9673553 -0.9997689 0.9736708 0.9739667 -0.9998174 0.9790916 0.9792773 -0.9998557 0.9834122 0.9835287 -0.999886 0.9868501 0.986923 -0.9999099 0.9895817 0.9896274 -0.9999288 0.9917499 0.9917785 -0.9999437 0.9934694 0.9934873 -0.2151269 0.2256446 0.9754027 -0.2150852 0.2254677 0.9753975 -0.2150342 0.2252456 0.9753908 -0.2149725 0.2249671 0.9753825 -0.2148987 0.2246189 0.9753721 -0.2148124 0.2241849 0.9753591 -0.2147144 0.2236464 0.975343 -0.2146085 0.2229821 0.9753231 -0.2145034 0.2221689 0.9752987 -0.2144168 0.221184 0.9752692 -0.2143816 0.2200085 0.975234 -0.2144566 0.2186353 0.9751928 -0.2147432 0.2170817 0.9751462 -0.2154135 0.2154135 0.9750962 -0.2183784 0.2154135 0.9750962 -0.2221293 0.2154135 0.9750962 -0.2268747 0.2154135 0.9750962 -0.2328783 0.2154135 0.9750962 -0.2404736 0.2154135 0.9750962 -0.2500826 0.2154135 0.9750962 -0.2622393 0.2154135 0.9750962 -0.2776191 0.2154135 0.9750962 -0.2970766 0.2154135 0.9750962 -0.3216928 0.2154135 0.9750962 -0.3528354 0.2154135 0.9750962 -0.392235 0.2154135 0.9750962 -0.4420805 0.2154135 0.9750962 -0.5051417 0.2154135 0.9750962 -0.5849222 0.2154135 0.9750962 -0.6858549 0.2154135 0.9750962 -0.8135479 0.2154135 0.9750962 -0.9750962 0.2154135 0.9750962 -0.9812508 0.2782606 0.8322181 -0.9857167 0.3450957 0.7431467 -0.9890241 0.4140252 0.695888 -0.991511 0.4830292 0.679752 -0.9934023 0.5501456 0.685534 -0.994853 0.6136569 0.7056024 -0.9959732 0.672232 0.7339088 -0.9968425 0.7249978 0.7659102 -0.9975199 0.7715376 0.7984078 -0.9980494 0.8118303 0.8293258 -0.9984642 0.8461587 0.857466 -0.9987897 0.8750084 0.8822705 -0.9990457 0.8989767 0.9036165 -0.9992471 0.9187004 0.9216519 -0.9994058 0.9348042 0.9366751 -0.9995309 0.9478683 0.9490508 -0.9996295 0.9584114 0.9591571 -0.9997074 0.9668844 0.9673538 -0.9997689 0.9736708 0.9739657 -0.9998174 0.9790916 0.9792767 -0.9998557 0.9834122 0.9835283 -0.999886 0.98685 0.9869228 -0.9999099 0.9895817 0.9896273 -0.9999288 0.9917499 0.9917784 -0.9999437 0.9934694 0.9934872 -0.2151269 0.2285707 0.9754027 -0.2150852 0.2283945 0.9753975 -0.2150342 0.2281732 0.9753908 -0.2149725 0.2278958 0.9753825 -0.2148987 0.2275489 0.9753721 -0.2148124 0.2271165 0.9753591 -0.2147144 0.2265801 0.975343 -0.2146085 0.2259183 0.9753231 -0.2145034 0.2251082 0.9752987 -0.2144168 0.224127 0.9752692 -0.2143816 0.222956 0.975234 -0.2144566 0.2215879 0.9751928 -0.2147432 0.2200403 0.9751462 -0.2154135 0.2183784 0.9750962 -0.2167545 0.2167545 0.9750472 -0.2205133 0.2167545 0.9750472 -0.2252686 0.2167545 0.9750472 -0.2312846 0.2167545 0.9750472 -0.2388957 0.2167545 0.9750472 -0.2485248 0.2167545 0.9750472 -0.2607068 0.2167545 0.9750472 -0.2761186 0.2167545 0.9750472 -0.2956165 0.2167545 0.9750472 -0.3202839 0.2167545 0.9750472 -0.3514914 0.2167545 0.9750472 -0.390973 0.2167545 0.9750472 -0.4409223 0.2167545 0.9750472 -0.5041146 0.2167545 0.9750472 -0.5840612 0.2167545 0.9750472 -0.685204 0.2167545 0.9750472 -0.8131627 0.2167545 0.9750472 -0.9750472 0.2167545 0.9750472 -0.9812231 0.2791873 0.8319336 -0.9857006 0.3457234 0.7427853 -0.9890146 0.4144423 0.6955345 -0.9915054 0.4833013 0.6794455 -0.9933988 0.5503203 0.685287 -0.9948509 0.6137675 0.7054133 -0.9959719 0.6723012 0.7337696 -0.9968418 0.7250408 0.7658108 -0.9975194 0.7715641 0.7983387 -0.9980491 0.8118466 0.8292787 -0.998464 0.8461687 0.8574344 -0.9987896 0.8750145 0.8822496 -0.9990456 0.8989805 0.9036028 -0.9992471 0.9187027 0.9216431 -0.9994058 0.9348056 0.9366694 -0.9995309 0.9478691 0.9490471 -0.9996295 0.958412 0.9591548 -0.9997074 0.9668847 0.9673523 -0.9997688 0.973671 0.9739648 -0.9998174 0.9790917 0.9792761 -0.9998557 0.9834123 0.9835279 -0.999886 0.9868501 0.9869226 -0.9999099 0.9895817 0.9896271 -0.9999288 0.9917499 0.9917783 -0.9999437 0.9934694 0.9934872 -0.2151269 0.2322726 0.9754027 -0.2150852 0.2320973 0.9753975 -0.2150342 0.2318771 0.9753908 -0.2149725 0.231601 0.9753825 -0.2148987 0.2312557 0.9753721 -0.2148124 0.2308255 0.9753591 -0.2147144 0.2302916 0.975343 -0.2146085 0.229633 0.9753231 -0.2145034 0.2288268 0.9752987 -0.2144168 0.2278503 0.9752692 -0.2143816 0.2266849 0.975234 -0.2144566 0.2253234 0.9751928 -0.2147432 0.2237832 0.9751462 -0.2154135 0.2221293 0.9750962 -0.2167545 0.2205133 0.9750472 -0.2192389 0.2192389 0.9750086 -0.224002 0.2192389 0.9750086 -0.2300279 0.2192389 0.9750086 -0.2376515 0.2192389 0.9750086 -0.2472963 0.2192389 0.9750086 -0.2594983 0.2192389 0.9750086 -0.2749353 0.2192389 0.9750086 -0.2944652 0.2192389 0.9750086 -0.319173 0.2192389 0.9750086 -0.3504316 0.2192389 0.9750086 -0.3899778 0.2192389 0.9750086 -0.4400089 0.2192389 0.9750086 -0.5033048 0.2192389 0.9750086 -0.5833822 0.2192389 0.9750086 -0.6846907 0.2192389 0.9750086 -0.812859 0.2192389 0.9750086 -0.9750086 0.2192389 0.9750086 -0.9812013 0.2809573 0.8317093 -0.9856879 0.3469645 0.7425006 -0.9890072 0.4152991 0.6952561 -0.9915009 0.4838841 0.6792041 -0.9933961 0.5507113 0.6850926 -0.9948493 0.6140266 0.7052645 -0.9959709 0.6724711 0.7336601 -0.9968411 0.7251511 0.7657327 -0.9975191 0.7716352 0.7982843 -0.9980488 0.8118921 0.8292416 -0.9984638 0.8461977 0.8574095 -0.9987895 0.8750329 0.8822331 -0.9990456 0.8989921 0.903592 -0.999247 0.9187101 0.9216361 -0.9994057 0.9348102 0.9366649 -0.9995309 0.947872 0.9490443 -0.9996295 0.9584138 0.959153 -0.9997074 0.9668859 0.9673511 -0.9997688 0.9736717 0.9739641 -0.9998174 0.9790921 0.9792757 -0.9998557 0.9834126 0.9835276 -0.999886 0.9868503 0.9869224 -0.9999099 0.9895819 0.989627 -0.9999288 0.99175 0.9917783 -0.9999437 0.9934694 0.9934871 -0.2151269 0.236956 0.9754027 -0.2150852 0.2367818 0.9753975 -0.2150342 0.2365629 0.9753908 -0.2149725 0.2362885 0.9753825 -0.2148987 0.2359454 0.9753721 -0.2148124 0.2355177 0.9753591 -0.2147144 0.2349871 0.975343 -0.2146085 0.2343326 0.9753231 -0.2145034 0.2335313 0.9752987 -0.2144168 0.2325608 0.9752692 -0.2143816 0.2314025 0.975234 -0.2144566 0.2300493 0.9751928 -0.2147432 0.2285185 0.9751462 -0.2154135 0.2268747 0.9750962 -0.2167545 0.2252686 0.9750472 -0.2192389 0.224002 0.9750086 -0.2235962 0.2235962 0.9749962 -0.2296253 0.2235962 0.9749962 -0.2372529 0.2235962 0.9749962 -0.2469027 0.2235962 0.9749962 -0.2591111 0.2235962 0.9749962 -0.2745562 0.2235962 0.9749962 -0.2940963 0.2235962 0.9749962 -0.3188171 0.2235962 0.9749962 -0.3500921 0.2235962 0.9749962 -0.389659 0.2235962 0.9749962 -0.4397163 0.2235962 0.9749962 -0.5030453 0.2235962 0.9749962 -0.5831647 0.2235962 0.9749962 -0.6845262 0.2235962 0.9749962 -0.8127617 0.2235962 0.9749962 -0.9749962 0.2235962 0.9749962 -0.9811943 0.2841192 0.8316375 -0.9856839 0.3492254 0.7424095 -0.9890048 0.4168922 0.695167 -0.9914995 0.4849907 0.6791269 -0.9933953 0.5514695 0.6850303 -0.9948487 0.6145393 0.7052169 -0.9959706 0.6728136 0.733625 -0.9968409 0.7253775 0.7657077 -0.9975189 0.7717834 0.7982669 -0.9980488 0.8119884 0.8292297 -0.9984638 0.8462598 0.8574015 -0.9987895 0.8750727 0.8822279 -0.9990455 0.8990175 0.9035886 -0.999247 0.9187262 0.9216339 -0.9994057 0.9348204 0.9366635 -0.9995308 0.9478785 0.9490434 -0.9996295 0.9584178 0.9591524 -0.9997074 0.9668884 0.9673508 -0.9997688 0.9736733 0.9739638 -0.9998174 0.9790931 0.9792755 -0.9998557 0.9834132 0.9835276 -0.999886 0.9868507 0.9869223 -0.9999099 0.9895821 0.989627 -0.9999288 0.9917502 0.9917782 -0.9999437 0.9934695 0.9934871 -0.2151269 0.2428812 0.9754027 -0.2150852 0.2427083 0.9753975 -0.2150342 0.2424911 0.9753908 -0.2149725 0.2422188 0.9753825 -0.2148987 0.2418784 0.9753721 -0.2148124 0.2414541 0.9753591 -0.2147144 0.2409276 0.975343 -0.2146085 0.2402781 0.9753231 -0.2145034 0.2394831 0.9752987 -0.2144168 0.2385201 0.9752692 -0.2143816 0.2373708 0.975234 -0.2144566 0.2360282 0.9751928 -0.2147432 0.2345093 0.9751462 -0.2154135 0.2328783 0.9750962 -0.2167545 0.2312846 0.9750472 -0.2192389 0.2300279 0.9750086 -0.2235962 0.2296253 0.9749962 -0.2296253 0.2296253 0.9749962 -0.2372529 0.2296253 0.9749962 -0.2469027 0.2296253 0.9749962 -0.2591111 0.2296253 0.9749962 -0.2745562 0.2296253 0.9749962 -0.2940963 0.2296253 0.9749962 -0.3188171 0.2296253 0.9749962 -0.3500921 0.2296253 0.9749962 -0.389659 0.2296253 0.9749962 -0.4397163 0.2296253 0.9749962 -0.5030453 0.2296253 0.9749962 -0.5831647 0.2296253 0.9749962 -0.6845262 0.2296253 0.9749962 -0.8127617 0.2296253 0.9749962 -0.9749962 0.2296253 0.9749962 -0.9811943 0.2885124 0.8316375 -0.9856839 0.3523802 0.7424095 -0.9890048 0.419125 0.695167 -0.9914995 0.4865484 0.6791269 -0.9933953 0.5525411 0.6850303 -0.9948487 0.6152669 0.7052169 -0.9959706 0.6733015 0.733625 -0.9968409 0.7257011 0.7657077 -0.9975189 0.7719959 0.7982669 -0.9980488 0.8121268 0.8292297 -0.9984638 0.8463492 0.8574015 -0.9987895 0.8751301 0.8822279 -0.9990455 0.8990542 0.9035886 -0.999247 0.9187495 0.9216339 -0.9994057 0.9348352 0.9366635 -0.9995308 0.9478878 0.9490434 -0.9996295 0.9584237 0.9591524 -0.9997074 0.9668922 0.9673508 -0.9997688 0.9736756 0.9739638 -0.9998174 0.9790946 0.9792755 -0.9998557 0.9834141 0.9835276 -0.999886 0.9868512 0.9869223 -0.9999099 0.9895825 0.989627 -0.9999288 0.9917504 0.9917782 -0.9999437 0.9934697 0.9934871 -0.2151269 0.2503773 0.9754027 -0.2150852 0.2502061 0.9753975 -0.2150342 0.249991 0.9753908 -0.2149725 0.2497215 0.9753825 -0.2148987 0.2493844 0.9753721 -0.2148124 0.2489643 0.9753591 -0.2147144 0.2484431 0.975343 -0.2146085 0.2478 0.9753231 -0.2145034 0.2470129 0.9752987 -0.2144168 0.2460594 0.9752692 -0.2143816 0.2449216 0.975234 -0.2144566 0.2435923 0.9751928 -0.2147432 0.2420885 0.9751462 -0.2154135 0.2404736 0.9750962 -0.2167545 0.2388957 0.9750472 -0.2192389 0.2376515 0.9750086 -0.2235962 0.2372529 0.9749962 -0.2296253 0.2372529 0.9749962 -0.2372529 0.2372529 0.9749962 -0.2469027 0.2372529 0.9749962 -0.2591111 0.2372529 0.9749962 -0.2745562 0.2372529 0.9749962 -0.2940963 0.2372529 0.9749962 -0.3188171 0.2372529 0.9749962 -0.3500921 0.2372529 0.9749962 -0.389659 0.2372529 0.9749962 -0.4397163 0.2372529 0.9749962 -0.5030453 0.2372529 0.9749962 -0.5831647 0.2372529 0.9749962 -0.6845262 0.2372529 0.9749962 -0.8127617 0.2372529 0.9749962 -0.9749962 0.2372529 0.9749962 -0.9811943 0.2940703 0.8316375 -0.9856839 0.3563715 0.7424095 -0.9890048 0.4219498 0.695167 -0.9914995 0.4885191 0.6791269 -0.9933953 0.5538969 0.6850303 -0.9948487 0.6161874 0.7052169 -0.9959706 0.6739188 0.733625 -0.9968409 0.7261105 0.7657077 -0.9975189 0.7722648 0.7982669 -0.9980488 0.8123018 0.8292297 -0.9984638 0.8464623 0.8574015 -0.9987895 0.8752028 0.8822279 -0.9990455 0.8991006 0.9035886 -0.999247 0.9187791 0.9216339 -0.9994057 0.9348539 0.9366635 -0.9995308 0.9478997 0.9490434 -0.9996295 0.9584312 0.9591524 -0.9997074 0.9668969 0.9673508 -0.9997688 0.9736786 0.9739638 -0.9998174 0.9790965 0.9792755 -0.9998557 0.9834153 0.9835276 -0.999886 0.986852 0.9869223 -0.9999099 0.9895829 0.989627 -0.9999288 0.9917507 0.9917782 -0.9999437 0.9934698 0.9934871 -0.2151269 0.2598608 0.9754027 -0.2150852 0.2596918 0.9753975 -0.2150342 0.2594794 0.9753908 -0.2149725 0.2592133 0.9753825 -0.2148987 0.2588805 0.9753721 -0.2148124 0.2584657 0.9753591 -0.2147144 0.2579511 0.975343 -0.2146085 0.2573162 0.9753231 -0.2145034 0.256539 0.9752987 -0.2144168 0.2555977 0.9752692 -0.2143816 0.2544742 0.975234 -0.2144566 0.2531618 0.9751928 -0.2147432 0.251677 0.9751462 -0.2154135 0.2500826 0.9750962 -0.2167545 0.2485248 0.9750472 -0.2192389 0.2472963 0.9750086 -0.2235962 0.2469027 0.9749962 -0.2296253 0.2469027 0.9749962 -0.2372529 0.2469027 0.9749962 -0.2469027 0.2469027 0.9749962 -0.2591111 0.2469027 0.9749962 -0.2745562 0.2469027 0.9749962 -0.2940963 0.2469027 0.9749962 -0.3188171 0.2469027 0.9749962 -0.3500921 0.2469027 0.9749962 -0.389659 0.2469027 0.9749962 -0.4397163 0.2469027 0.9749962 -0.5030453 0.2469027 0.9749962 -0.5831647 0.2469027 0.9749962 -0.6845262 0.2469027 0.9749962 -0.8127617 0.2469027 0.9749962 -0.9749962 0.2469027 0.9749962 -0.9811943 0.3011018 0.8316375 -0.9856839 0.3614209 0.7424095 -0.9890048 0.4255236 0.695167 -0.9914995 0.4910123 0.6791269 -0.9933953 0.5556122 0.6850303 -0.9948487 0.6173519 0.7052169 -0.9959706 0.6746998 0.733625 -0.9968409 0.7266285 0.7657077 -0.9975189 0.7726049 0.7982669 -0.9980488 0.8125232 0.8292297 -0.9984638 0.8466054 0.8574015 -0.9987895 0.8752947 0.8822279 -0.9990455 0.8991593 0.9035886 -0.999247 0.9188164 0.9216339 -0.9994057 0.9348776 0.9366635 -0.9995308 0.9479146 0.9490434 -0.9996295 0.9584406 0.9591524 -0.9997074 0.9669028 0.9673508 -0.9997688 0.9736823 0.9739638 -0.9998174 0.9790988 0.9792755 -0.9998557 0.9834167 0.9835276 -0.999886 0.9868529 0.9869223 -0.9999099 0.9895835 0.989627 -0.9999288 0.991751 0.9917782 -0.9999437 0.9934701 0.9934871 -0.2151269 0.2718587 0.9754027 -0.2150852 0.2716924 0.9753975 -0.2150342 0.2714835 0.9753908 -0.2149725 0.2712217 0.9753825 -0.2148987 0.2708943 0.9753721 -0.2148124 0.2704863 0.9753591 -0.2147144 0.26998 0.975343 -0.2146085 0.2693554 0.9753231 -0.2145034 0.2685909 0.9752987 -0.2144168 0.2676648 0.9752692 -0.2143816 0.2665596 0.975234 -0.2144566 0.2652685 0.9751928 -0.2147432 0.2638078 0.9751462 -0.2154135 0.2622393 0.9750962 -0.2167545 0.2607068 0.9750472 -0.2192389 0.2594983 0.9750086 -0.2235962 0.2591111 0.9749962 -0.2296253 0.2591111 0.9749962 -0.2372529 0.2591111 0.9749962 -0.2469027 0.2591111 0.9749962 -0.2591111 0.2591111 0.9749962 -0.2745562 0.2591111 0.9749962 -0.2940963 0.2591111 0.9749962 -0.3188171 0.2591111 0.9749962 -0.3500921 0.2591111 0.9749962 -0.389659 0.2591111 0.9749962 -0.4397163 0.2591111 0.9749962 -0.5030453 0.2591111 0.9749962 -0.5831647 0.2591111 0.9749962 -0.6845262 0.2591111 0.9749962 -0.8127617 0.2591111 0.9749962 -0.9749962 0.2591111 0.9749962 -0.9811943 0.3099976 0.8316375 -0.9856839 0.3678092 0.7424095 -0.9890048 0.4300448 0.695167 -0.9914995 0.4941665 0.6791269 -0.9933953 0.5577822 0.6850303 -0.9948487 0.6188252 0.7052169 -0.9959706 0.6756878 0.733625 -0.9968409 0.7272837 0.7657077 -0.9975189 0.7730352 0.7982669 -0.9980488 0.8128033 0.8292297 -0.9984638 0.8467864 0.8574015 -0.9987895 0.8754109 0.8822279 -0.9990455 0.8992336 0.9035886 -0.999247 0.9188636 0.9216339 -0.9994057 0.9349075 0.9366635 -0.9995308 0.9479335 0.9490434 -0.9996295 0.9584526 0.9591524 -0.9997074 0.9669103 0.9673508 -0.9997688 0.973687 0.9739638 -0.9998174 0.9791018 0.9792755 -0.9998557 0.9834186 0.9835276 -0.999886 0.9868541 0.9869223 -0.9999099 0.9895842 0.989627 -0.9999288 0.9917515 0.9917782 -0.9999437 0.9934704 0.9934871 -0.2151269 0.2870375 0.9754027 -0.2150852 0.2868747 0.9753975 -0.2150342 0.2866702 0.9753908 -0.2149725 0.2864139 0.9753825 -0.2148987 0.2860933 0.9753721 -0.2148124 0.2856938 0.9753591 -0.2147144 0.2851981 0.975343 -0.2146085 0.2845866 0.9753231 -0.2145034 0.283838 0.9752987 -0.2144168 0.2829313 0.9752692 -0.2143816 0.2818492 0.975234 -0.2144566 0.280585 0.9751928 -0.2147432 0.2791549 0.9751462 -0.2154135 0.2776191 0.9750962 -0.2167545 0.2761186 0.9750472 -0.2192389 0.2749353 0.9750086 -0.2235962 0.2745562 0.9749962 -0.2296253 0.2745562 0.9749962 -0.2372529 0.2745562 0.9749962 -0.2469027 0.2745562 0.9749962 -0.2591111 0.2745562 0.9749962 -0.2745562 0.2745562 0.9749962 -0.2940963 0.2745562 0.9749962 -0.3188171 0.2745562 0.9749962 -0.3500921 0.2745562 0.9749962 -0.389659 0.2745562 0.9749962 -0.4397163 0.2745562 0.9749962 -0.5030453 0.2745562 0.9749962 -0.5831647 0.2745562 0.9749962 -0.6845262 0.2745562 0.9749962 -0.8127617 0.2745562 0.9749962 -0.9749962 0.2745562 0.9749962 -0.9811943 0.3212519 0.8316375 -0.9856839 0.3758911 0.7424095 -0.9890048 0.4357648 0.695167 -0.9914995 0.498157 0.6791269 -0.9933953 0.5605276 0.6850303 -0.9948487 0.6206891 0.7052169 -0.9959706 0.6769378 0.733625 -0.9968409 0.7281127 0.7657077 -0.9975189 0.7735795 0.7982669 -0.9980488 0.8131577 0.8292297 -0.9984638 0.8470154 0.8574015 -0.9987895 0.875558 0.8822279 -0.9990455 0.8993275 0.9035886 -0.999247 0.9189234 0.9216339 -0.9994057 0.9349454 0.9366635 -0.9995308 0.9479575 0.9490434 -0.9996295 0.9584677 0.9591524 -0.9997074 0.9669198 0.9673508 -0.9997688 0.973693 0.9739638 -0.9998174 0.9791055 0.9792755 -0.9998557 0.9834209 0.9835276 -0.999886 0.9868555 0.9869223 -0.9999099 0.9895851 0.989627 -0.9999288 0.9917521 0.9917782 -0.9999437 0.9934707 0.9934871 -0.2151269 0.3062408 0.9754027 -0.2150852 0.3060824 0.9753975 -0.2150342 0.3058834 0.9753908 -0.2149725 0.3056339 0.9753825 -0.2148987 0.305322 0.9753721 -0.2148124 0.3049333 0.9753591 -0.2147144 0.304451 0.975343 -0.2146085 0.303856 0.9753231 -0.2145034 0.3031276 0.9752987 -0.2144168 0.3022454 0.9752692 -0.2143816 0.3011925 0.975234 -0.2144566 0.2999624 0.9751928 -0.2147432 0.2985709 0.9751462 -0.2154135 0.2970766 0.9750962 -0.2167545 0.2956165 0.9750472 -0.2192389 0.2944652 0.9750086 -0.2235962 0.2940963 0.9749962 -0.2296253 0.2940963 0.9749962 -0.2372529 0.2940963 0.9749962 -0.2469027 0.2940963 0.9749962 -0.2591111 0.2940963 0.9749962 -0.2745562 0.2940963 0.9749962 -0.2940963 0.2940963 0.9749962 -0.3188171 0.2940963 0.9749962 -0.3500921 0.2940963 0.9749962 -0.389659 0.2940963 0.9749962 -0.4397163 0.2940963 0.9749962 -0.5030453 0.2940963 0.9749962 -0.5831647 0.2940963 0.9749962 -0.6845262 0.2940963 0.9749962 -0.8127617 0.2940963 0.9749962 -0.9749962 0.2940963 0.9749962 -0.9811943 0.3354901 0.8316375 -0.9856839 0.3861159 0.7424095 -0.9890048 0.4430013 0.695167 -0.9914995 0.5032055 0.6791269 -0.9933953 0.5640008 0.6850303 -0.9948487 0.6230471 0.7052169 -0.9959706 0.6785192 0.733625 -0.9968409 0.7291615 0.7657077 -0.9975189 0.7742682 0.7982669 -0.9980488 0.8136061 0.8292297 -0.9984638 0.8473052 0.8574015 -0.9987895 0.8757441 0.8822279 -0.9990455 0.8994464 0.9035886 -0.999247 0.918999 0.9216339 -0.9994057 0.9349933 0.9366635 -0.9995308 0.9479878 0.9490434 -0.9996295 0.9584868 0.9591524 -0.9997074 0.9669318 0.9673508 -0.9997688 0.9737006 0.9739638 -0.9998174 0.9791103 0.9792755 -0.9998557 0.9834239 0.9835276 -0.999886 0.9868574 0.9869223 -0.9999099 0.9895863 0.989627 -0.9999288 0.9917528 0.9917782 -0.9999437 0.9934712 0.9934871 -0.2151269 0.3305354 0.9754027 -0.2150852 0.3303825 0.9753975 -0.2150342 0.3301905 0.9753908 -0.2149725 0.3299499 0.9753825 -0.2148987 0.3296489 0.9753721 -0.2148124 0.3292738 0.9753591 -0.2147144 0.3288084 0.975343 -0.2146085 0.3282343 0.9753231 -0.2145034 0.3275315 0.9752987 -0.2144168 0.3266802 0.9752692 -0.2143816 0.3256642 0.975234 -0.2144566 0.3244773 0.9751928 -0.2147432 0.3231346 0.9751462 -0.2154135 0.3216928 0.9750962 -0.2167545 0.3202839 0.9750472 -0.2192389 0.319173 0.9750086 -0.2235962 0.3188171 0.9749962 -0.2296253 0.3188171 0.9749962 -0.2372529 0.3188171 0.9749962 -0.2469027 0.3188171 0.9749962 -0.2591111 0.3188171 0.9749962 -0.2745562 0.3188171 0.9749962 -0.2940963 0.3188171 0.9749962 -0.3188171 0.3188171 0.9749962 -0.3500921 0.3188171 0.9749962 -0.389659 0.3188171 0.9749962 -0.4397163 0.3188171 0.9749962 -0.5030453 0.3188171 0.9749962 -0.5831647 0.3188171 0.9749962 -0.6845262 0.3188171 0.9749962 -0.8127617 0.3188171 0.9749962 -0.9749962 0.3188171 0.9749962 -0.9811943 0.3535032 0.8316375 -0.9856839 0.3990515 0.7424095 -0.9890048 0.4521565 0.695167 -0.9914995 0.5095925 0.6791269 -0.9933953 0.5683949 0.6850303 -0.9948487 0.6260304 0.7052169 -0.9959706 0.6805199 0.733625 -0.9968409 0.7304884 0.7657077 -0.9975189 0.7751395 0.7982669 -0.9980488 0.8141733 0.8292297 -0.9984638 0.8476717 0.8574015 -0.9987895 0.8759795 0.8822279 -0.9990455 0.8995968 0.9035886 -0.999247 0.9190947 0.9216339 -0.9994057 0.935054 0.9366635 -0.9995308 0.9480261 0.9490434 -0.9996295 0.9585109 0.9591524 -0.9997074 0.966947 0.9673508 -0.9997688 0.9737101 0.9739638 -0.9998174 0.9791163 0.9792755 -0.9998557 0.9834277 0.9835276 -0.999886 0.9868597 0.9869223 -0.9999099 0.9895878 0.989627 -0.9999288 0.9917537 0.9917782 -0.9999437 0.9934718 0.9934871 -0.2151269 0.3612712 0.9754027 -0.2150852 0.3611254 0.9753975 -0.2150342 0.3609422 0.9753908 -0.2149725 0.3607126 0.9753825 -0.2148987 0.3604255 0.9753721 -0.2148124 0.3600677 0.9753591 -0.2147144 0.3596237 0.975343 -0.2146085 0.359076 0.9753231 -0.2145034 0.3584055 0.9752987 -0.2144168 0.3575934 0.9752692 -0.2143816 0.3566242 0.975234 -0.2144566 0.3554919 0.9751928 -0.2147432 0.354211 0.9751462 -0.2154135 0.3528354 0.9750962 -0.2167545 0.3514914 0.9750472 -0.2192389 0.3504316 0.9750086 -0.2235962 0.3500921 0.9749962 -0.2296253 0.3500921 0.9749962 -0.2372529 0.3500921 0.9749962 -0.2469027 0.3500921 0.9749962 -0.2591111 0.3500921 0.9749962 -0.2745562 0.3500921 0.9749962 -0.2940963 0.3500921 0.9749962 -0.3188171 0.3500921 0.9749962 -0.3500921 0.3500921 0.9749962 -0.389659 0.3500921 0.9749962 -0.4397163 0.3500921 0.9749962 -0.5030453 0.3500921 0.9749962 -0.5831647 0.3500921 0.9749962 -0.6845262 0.3500921 0.9749962 -0.8127617 0.3500921 0.9749962 -0.9749962 0.3500921 0.9749962 -0.9811943 0.3762922 0.8316375 -0.9856839 0.4154167 0.7424095 -0.9890048 0.4637389 0.695167 -0.9914995 0.5176729 0.6791269 -0.9933953 0.573954 0.6850303 -0.9948487 0.6298046 0.7052169 -0.9959706 0.683051 0.733625 -0.9968409 0.732167 0.7657077 -0.9975189 0.7762418 0.7982669 -0.9980488 0.8148909 0.8292297 -0.9984638 0.8481355 0.8574015 -0.9987895 0.8762773 0.8822279 -0.9990455 0.899787 0.9035886 -0.999247 0.9192157 0.9216339 -0.9994057 0.9351307 0.9366635 -0.9995308 0.9480746 0.9490434 -0.9996295 0.9585415 0.9591524 -0.9997074 0.9669663 0.9673508 -0.9997688 0.9737222 0.9739638 -0.9998174 0.9791238 0.9792755 -0.9998557 0.9834324 0.9835276 -0.999886 0.9868627 0.9869223 -0.9999099 0.9895897 0.989627 -0.9999288 0.9917549 0.9917782 -0.9999437 0.9934725 0.9934871 -0.2151269 0.4001561 0.9754027 -0.2150852 0.4000191 0.9753975 -0.2150342 0.3998472 0.9753908 -0.2149725 0.3996316 0.9753825 -0.2148987 0.399362 0.9753721 -0.2148124 0.399026 0.9753591 -0.2147144 0.3986091 0.975343 -0.2146085 0.3980948 0.9753231 -0.2145034 0.3974652 0.9752987 -0.2144168 0.3967026 0.9752692 -0.2143816 0.3957926 0.975234 -0.2144566 0.3947294 0.9751928 -0.2147432 0.3935266 0.9751462 -0.2154135 0.392235 0.9750962 -0.2167545 0.390973 0.9750472 -0.2192389 0.3899778 0.9750086 -0.2235962 0.389659 0.9749962 -0.2296253 0.389659 0.9749962 -0.2372529 0.389659 0.9749962 -0.2469027 0.389659 0.9749962 -0.2591111 0.389659 0.9749962 -0.2745562 0.389659 0.9749962 -0.2940963 0.389659 0.9749962 -0.3188171 0.389659 0.9749962 -0.3500921 0.389659 0.9749962 -0.389659 0.389659 0.9749962 -0.4397163 0.389659 0.9749962 -0.5030453 0.389659 0.9749962 -0.5831647 0.389659 0.9749962 -0.6845262 0.389659 0.9749962 -0.8127617 0.389659 0.9749962 -0.9749962 0.389659 0.9749962 -0.9811943 0.4051232 0.8316375 -0.9856839 0.4361208 0.7424095 -0.9890048 0.4783922 0.695167 -0.9914995 0.5278957 0.6791269 -0.9933953 0.580987 0.6850303 -0.9948487 0.6345795 0.7052169 -0.9959706 0.6862532 0.733625 -0.9968409 0.7342907 0.7657077 -0.9975189 0.7776364 0.7982669 -0.9980488 0.8157988 0.8292297 -0.9984638 0.8487222 0.8574015 -0.9987895 0.8766541 0.8822279 -0.9990455 0.9000277 0.9035886 -0.999247 0.9193688 0.9216339 -0.9994057 0.9352277 0.9366635 -0.9995308 0.9481359 0.9490434 -0.9996295 0.9585802 0.9591524 -0.9997074 0.9669906 0.9673508 -0.9997688 0.9737375 0.9739638 -0.9998174 0.9791334 0.9792755 -0.9998557 0.9834385 0.9835276 -0.999886 0.9868665 0.9869223 -0.9999099 0.989592 0.989627 -0.9999288 0.9917564 0.9917782 -0.9999437 0.9934734 0.9934871 -0.2151269 0.4493504 0.9754027 -0.2150852 0.4492248 0.9753975 -0.2150342 0.4490669 0.9753908 -0.2149725 0.448869 0.9753825 -0.2148987 0.4486216 0.9753721 -0.2148124 0.4483133 0.9753591 -0.2147144 0.4479306 0.975343 -0.2146085 0.4474586 0.9753231 -0.2145034 0.4468808 0.9752987 -0.2144168 0.4461809 0.9752692 -0.2143816 0.4453457 0.975234 -0.2144566 0.4443699 0.9751928 -0.2147432 0.443266 0.9751462 -0.2154135 0.4420805 0.9750962 -0.2167545 0.4409223 0.9750472 -0.2192389 0.4400089 0.9750086 -0.2235962 0.4397163 0.9749962 -0.2296253 0.4397163 0.9749962 -0.2372529 0.4397163 0.9749962 -0.2469027 0.4397163 0.9749962 -0.2591111 0.4397163 0.9749962 -0.2745562 0.4397163 0.9749962 -0.2940963 0.4397163 0.9749962 -0.3188171 0.4397163 0.9749962 -0.3500921 0.4397163 0.9749962 -0.389659 0.4397163 0.9749962 -0.4397163 0.4397163 0.9749962 -0.5030453 0.4397163 0.9749962 -0.5831647 0.4397163 0.9749962 -0.6845262 0.4397163 0.9749962 -0.8127617 0.4397163 0.9749962 -0.9749962 0.4397163 0.9749962 -0.9811943 0.4415982 0.8316375 -0.9856839 0.4623142 0.7424095 -0.9890048 0.4969305 0.695167 -0.9914995 0.5408288 0.6791269 -0.9933953 0.5898847 0.6850303 -0.9948487 0.6406203 0.7052169 -0.9959706 0.6903044 0.733625 -0.9968409 0.7369774 0.7657077 -0.9975189 0.7794007 0.7982669 -0.9980488 0.8169474 0.8292297 -0.9984638 0.8494644 0.8574015 -0.9987895 0.8771307 0.8822279 -0.9990455 0.9003323 0.9035886 -0.999247 0.9195625 0.9216339 -0.9994057 0.9353505 0.9366635 -0.9995308 0.9482135 0.9490434 -0.9996295 0.9586291 0.9591524 -0.9997074 0.9670214 0.9673508 -0.9997688 0.9737569 0.9739638 -0.9998174 0.9791456 0.9792755 -0.9998557 0.9834461 0.9835276 -0.999886 0.9868713 0.9869223 -0.9999099 0.989595 0.989627 -0.9999288 0.9917582 0.9917782 -0.9999437 0.9934746 0.9934871 -0.2151269 0.5115877 0.9754027 -0.2150852 0.5114763 0.9753975 -0.2150342 0.5113363 0.9753908 -0.2149725 0.5111609 0.9753825 -0.2148987 0.5109415 0.9753721 -0.2148124 0.5106681 0.9753591 -0.2147144 0.5103288 0.975343 -0.2146085 0.5099103 0.9753231 -0.2145034 0.509398 0.9752987 -0.2144168 0.5087774 0.9752692 -0.2143816 0.5080368 0.975234 -0.2144566 0.5071716 0.9751928 -0.2147432 0.5061928 0.9751462 -0.2154135 0.5051417 0.9750962 -0.2167545 0.5041146 0.9750472 -0.2192389 0.5033048 0.9750086 -0.2235962 0.5030453 0.9749962 -0.2296253 0.5030453 0.9749962 -0.2372529 0.5030453 0.9749962 -0.2469027 0.5030453 0.9749962 -0.2591111 0.5030453 0.9749962 -0.2745562 0.5030453 0.9749962 -0.2940963 0.5030453 0.9749962 -0.3188171 0.5030453 0.9749962 -0.3500921 0.5030453 0.9749962 -0.389659 0.5030453 0.9749962 -0.4397163 0.5030453 0.9749962 -0.5030453 0.5030453 0.9749962 -0.5831647 0.5030453 0.9749962 -0.6845262 0.5030453 0.9749962 -0.8127617 0.5030453 0.9749962 -0.9749962 0.5030453 0.9749962 -0.9811943 0.4877437 0.8316375 -0.9856839 0.4954523 0.7424095 -0.9890048 0.5203839 0.695167 -0.9914995 0.5571908 0.6791269 -0.9933953 0.6011414 0.6850303 -0.9948487 0.6482627 0.7052169 -0.9959706 0.6954296 0.733625 -0.9968409 0.7403765 0.7657077 -0.9975189 0.7816327 0.7982669 -0.9980488 0.8184005 0.8292297 -0.9984638 0.8504035 0.8574015 -0.9987895 0.8777338 0.8822279 -0.9990455 0.9007175 0.9035886 -0.999247 0.9198076 0.9216339 -0.9994057 0.9355059 0.9366635 -0.9995308 0.9483117 0.9490434 -0.9996295 0.958691 0.9591524 -0.9997074 0.9670604 0.9673508 -0.9997688 0.9737814 0.9739638 -0.9998174 0.979161 0.9792755 -0.9998557 0.9834557 0.9835276 -0.999886 0.9868773 0.9869223 -0.9999099 0.9895988 0.989627 -0.9999288 0.9917606 0.9917782 -0.9999437 0.9934761 0.9934871 -0.2151269 0.590326 0.9754027 -0.2150852 0.5902326 0.9753975 -0.2150342 0.5901152 0.9753908 -0.2149725 0.5899682 0.9753825 -0.2148987 0.5897842 0.9753721 -0.2148124 0.589555 0.9753591 -0.2147144 0.5892706 0.975343 -0.2146085 0.5889198 0.9753231 -0.2145034 0.5884903 0.9752987 -0.2144168 0.5879701 0.9752692 -0.2143816 0.5873492 0.975234 -0.2144566 0.5866239 0.9751928 -0.2147432 0.5858033 0.9751462 -0.2154135 0.5849222 0.9750962 -0.2167545 0.5840612 0.9750472 -0.2192389 0.5833822 0.9750086 -0.2235962 0.5831647 0.9749962 -0.2296253 0.5831647 0.9749962 -0.2372529 0.5831647 0.9749962 -0.2469027 0.5831647 0.9749962 -0.2591111 0.5831647 0.9749962 -0.2745562 0.5831647 0.9749962 -0.2940963 0.5831647 0.9749962 -0.3188171 0.5831647 0.9749962 -0.3500921 0.5831647 0.9749962 -0.389659 0.5831647 0.9749962 -0.4397163 0.5831647 0.9749962 -0.5030453 0.5831647 0.9749962 -0.5831647 0.5831647 0.9749962 -0.6845262 0.5831647 0.9749962 -0.8127617 0.5831647 0.9749962 -0.9749962 0.5831647 0.9749962 -0.9811943 0.5461239 0.8316375 -0.9856839 0.5373763 0.7424095 -0.9890048 0.5500554 0.695167 -0.9914995 0.577891 0.6791269 -0.9933953 0.6153825 0.6850303 -0.9948487 0.6579314 0.7052169 -0.9959706 0.7019138 0.733625 -0.9968409 0.7446768 0.7657077 -0.9975189 0.7844566 0.7982669 -0.9980488 0.8202389 0.8292297 -0.9984638 0.8515915 0.8574015 -0.9987895 0.8784967 0.8822279 -0.9990455 0.9012049 0.9035886 -0.999247 0.9201176 0.9216339 -0.9994057 0.9357024 0.9366635 -0.9995308 0.9484359 0.9490434 -0.9996295 0.9587693 0.9591524 -0.9997074 0.9671097 0.9673508 -0.9997688 0.9738123 0.9739638 -0.9998174 0.9791804 0.9792755 -0.9998557 0.9834679 0.9835276 -0.999886 0.986885 0.9869223 -0.9999099 0.9896036 0.989627 -0.9999288 0.9917636 0.9917782 -0.9999437 0.9934779 0.9934871 -0.2151269 0.6899401 0.9754027 -0.2150852 0.6898695 0.9753975 -0.2150342 0.6897808 0.9753908 -0.2149725 0.6896696 0.9753825 -0.2148987 0.6895306 0.9753721 -0.2148124 0.6893573 0.9753591 -0.2147144 0.6891423 0.975343 -0.2146085 0.6888771 0.9753231 -0.2145034 0.6885524 0.9752987 -0.2144168 0.6881591 0.9752692 -0.2143816 0.6876897 0.975234 -0.2144566 0.6871414 0.9751928 -0.2147432 0.6865211 0.9751462 -0.2154135 0.6858549 0.9750962 -0.2167545 0.685204 0.9750472 -0.2192389 0.6846907 0.9750086 -0.2235962 0.6845262 0.9749962 -0.2296253 0.6845262 0.9749962 -0.2372529 0.6845262 0.9749962 -0.2469027 0.6845262 0.9749962 -0.2591111 0.6845262 0.9749962 -0.2745562 0.6845262 0.9749962 -0.2940963 0.6845262 0.9749962 -0.3188171 0.6845262 0.9749962 -0.3500921 0.6845262 0.9749962 -0.389659 0.6845262 0.9749962 -0.4397163 0.6845262 0.9749962 -0.5030453 0.6845262 0.9749962 -0.5831647 0.6845262 0.9749962 -0.6845262 0.6845262 0.9749962 -0.8127617 0.6845262 0.9749962 -0.9749962 0.6845262 0.9749962 -0.9811943 0.6199824 0.8316375 -0.9856839 0.5904156 0.7424095 -0.9890048 0.5875938 0.695167 -0.9914995 0.6040793 0.6791269 -0.9933953 0.6333995 0.6850303 -0.9948487 0.6701635 0.7052169 -0.9959706 0.710117 0.733625 -0.9968409 0.7501172 0.7657077 -0.9975189 0.7880291 0.7982669 -0.9980488 0.8225647 0.8292297 -0.9984638 0.8530945 0.8574015 -0.9987895 0.8794619 0.8822279 -0.9990455 0.9018215 0.9035886 -0.999247 0.9205098 0.9216339 -0.9994057 0.935951 0.9366635 -0.9995308 0.9485931 0.9490434 -0.9996295 0.9588684 0.9591524 -0.9997074 0.967172 0.9673508 -0.9997688 0.9738515 0.9739638 -0.9998174 0.979205 0.9792755 -0.9998557 0.9834833 0.9835276 -0.999886 0.9868946 0.9869223 -0.9999099 0.9896096 0.989627 -0.9999288 0.9917674 0.9917782 -0.9999437 0.9934803 0.9934871 -0.2151269 0.8159649 0.9754027 -0.2150852 0.8159232 0.9753975 -0.2150342 0.8158707 0.9753908 -0.2149725 0.8158049 0.9753825 -0.2148987 0.8157227 0.9753721 -0.2148124 0.8156201 0.9753591 -0.2147144 0.815493 0.975343 -0.2146085 0.815336 0.9753231 -0.2145034 0.8151439 0.9752987 -0.2144168 0.8149113 0.9752692 -0.2143816 0.8146336 0.975234 -0.2144566 0.8143091 0.9751928 -0.2147432 0.8139421 0.9751462 -0.2154135 0.8135479 0.9750962 -0.2167545 0.8131627 0.9750472 -0.2192389 0.812859 0.9750086 -0.2235962 0.8127617 0.9749962 -0.2296253 0.8127617 0.9749962 -0.2372529 0.8127617 0.9749962 -0.2469027 0.8127617 0.9749962 -0.2591111 0.8127617 0.9749962 -0.2745562 0.8127617 0.9749962 -0.2940963 0.8127617 0.9749962 -0.3188171 0.8127617 0.9749962 -0.3500921 0.8127617 0.9749962 -0.389659 0.8127617 0.9749962 -0.4397163 0.8127617 0.9749962 -0.5030453 0.8127617 0.9749962 -0.5831647 0.8127617 0.9749962 -0.6845262 0.8127617 0.9749962 -0.8127617 0.8127617 0.9749962 -0.9749962 0.8127617 0.9749962 -0.9811943 0.713423 0.8316375 -0.9856839 0.6575172 0.7424095 -0.9890048 0.6350848 0.695167 -0.9914995 0.637211 0.6791269 -0.9933953 0.6561933 0.6850303 -0.9948487 0.6856388 0.7052169 -0.9959706 0.7204952 0.733625 -0.9968409 0.757 0.7657077 -0.9975189 0.7925488 0.7982669 -0.9980488 0.8255071 0.8292297 -0.9984638 0.8549959 0.8574015 -0.9987895 0.880683 0.8822279 -0.9990455 0.9026016 0.9035886 -0.999247 0.9210061 0.9216339 -0.9994057 0.9362655 0.9366635 -0.9995308 0.9487918 0.9490434 -0.9996295 0.9589938 0.9591524 -0.9997074 0.9672509 0.9673508 -0.9997688 0.9739011 0.9739638 -0.9998174 0.9792361 0.9792755 -0.9998557 0.9835029 0.9835276 -0.999886 0.9869069 0.9869223 -0.9999099 0.9896173 0.989627 -0.9999288 0.9917722 0.9917782 -0.9999437 0.9934833 0.9934871 -0.2151269 0.9754027 0.9754027 -0.2150852 0.9753975 0.9753975 -0.2150342 0.9753908 0.9753908 -0.2149725 0.9753825 0.9753825 -0.2148987 0.9753721 0.9753721 -0.2148124 0.9753591 0.9753591 -0.2147144 0.975343 0.975343 -0.2146085 0.9753231 0.9753231 -0.2145034 0.9752987 0.9752987 -0.2144168 0.9752692 0.9752692 -0.2143816 0.975234 0.975234 -0.2144566 0.9751928 0.9751928 -0.2147432 0.9751462 0.9751462 -0.2154135 0.9750962 0.9750962 -0.2167545 0.9750472 0.9750472 -0.2192389 0.9750086 0.9750086 -0.2235962 0.9749962 0.9749962 -0.2296253 0.9749962 0.9749962 -0.2372529 0.9749962 0.9749962 -0.2469027 0.9749962 0.9749962 -0.2591111 0.9749962 0.9749962 -0.2745562 0.9749962 0.9749962 -0.2940963 0.9749962 0.9749962 -0.3188171 0.9749962 0.9749962 -0.3500921 0.9749962 0.9749962 -0.389659 0.9749962 0.9749962 -0.4397163 0.9749962 0.9749962 -0.5030453 0.9749962 0.9749962 -0.5831647 0.9749962 0.9749962 -0.6845262 0.9749962 0.9749962 -0.8127617 0.9749962 0.9749962 -0.9749962 0.9749962 0.9749962 -0.9811943 0.8316375 0.8316375 -0.9856839 0.7424095 0.7424095 -0.9890048 0.695167 0.695167 -0.9914995 0.6791269 0.6791269 -0.9933953 0.6850303 0.6850303 -0.9948487 0.7052169 0.7052169 -0.9959706 0.733625 0.733625 -0.9968409 0.7657077 0.7657077 -0.9975189 0.7982669 0.7982669 -0.9980488 0.8292297 0.8292297 -0.9984638 0.8574015 0.8574015 -0.9987895 0.8822279 0.8822279 -0.9990455 0.9035886 0.9035886 -0.999247 0.9216339 0.9216339 -0.9994057 0.9366635 0.9366635 -0.9995308 0.9490434 0.9490434 -0.9996295 0.9591524 0.9591524 -0.9997074 0.9673508 0.9673508 -0.9997688 0.9739638 0.9739638 -0.9998174 0.9792755 0.9792755 -0.9998557 0.9835276 0.9835276 -0.999886 0.9869223 0.9869223 -0.9999099 0.989627 0.989627 -0.9999288 0.9917782 0.9917782 -0.9999437 0.9934871 0.9934871 -0.2783684 0.9814251 0.8340079 -0.2783325 0.9814221 0.8339769 -0.2782884 0.9814183 0.8339379 -0.2782347 0.9814136 0.8338891 -0.2781701 0.9814076 0.8338281 -0.2780936 0.9814002 0.8337521 -0.2780055 0.9813911 0.8336578 -0.2779077 0.9813797 0.8335415 -0.2778058 0.9813659 0.8333991 -0.2777122 0.9813491 0.8332267 -0.2776503 0.9813291 0.8330211 -0.2776626 0.9813057 0.832781 -0.2778236 0.9812792 0.8325095 -0.2782606 0.9812508 0.8322181 -0.2791873 0.9812231 0.8319336 -0.2809573 0.9812013 0.8317093 -0.2841192 0.9811943 0.8316375 -0.2885124 0.9811943 0.8316375 -0.2940703 0.9811943 0.8316375 -0.3011018 0.9811943 0.8316375 -0.3099976 0.9811943 0.8316375 -0.3212519 0.9811943 0.8316375 -0.3354901 0.9811943 0.8316375 -0.3535032 0.9811943 0.8316375 -0.3762922 0.9811943 0.8316375 -0.4051232 0.9811943 0.8316375 -0.4415982 0.9811943 0.8316375 -0.4877437 0.9811943 0.8316375 -0.5461239 0.9811943 0.8316375 -0.6199824 0.9811943 0.8316375 -0.713423 0.9811943 0.8316375 -0.8316375 0.9811943 0.8316375 -0.9811943 0.9811943 0.8316375 -0.9856839 0.8498092 0.7424095 -0.9890048 0.7711789 0.695167 -0.9914995 0.7321559 0.6791269 -0.9933953 0.721513 0.6850303 -0.9948487 0.7299859 0.7052169 -0.9959706 0.7502359 0.733625 -0.9968409 0.776724 0.7657077 -0.9975189 0.8055009 0.7982669 -0.9980488 0.8339392 0.8292297 -0.9984638 0.8604449 0.8574015 -0.9987895 0.8841823 0.8822279 -0.9990455 0.9048372 0.9035886 -0.999247 0.9224281 0.9216339 -0.9994057 0.9371669 0.9366635 -0.9995308 0.9493615 0.9490434 -0.9996295 0.959353 0.9591524 -0.9997074 0.967477 0.9673508 -0.9997688 0.9740432 0.9739638 -0.9998174 0.9793253 0.9792755 -0.9998557 0.9835588 0.9835276 -0.999886 0.9869419 0.9869223 -0.9999099 0.9896392 0.989627 -0.9999288 0.9917859 0.9917782 -0.9999437 0.9934919 0.9934871 -0.3454107 0.9858181 0.7454243 -0.3453807 0.9858163 0.7453848 -0.3453439 0.9858141 0.7453352 -0.3452987 0.9858113 0.745273 -0.3452442 0.9858079 0.7451952 -0.3451791 0.9858036 0.7450984 -0.3451032 0.9857982 0.7449782 -0.3450175 0.9857916 0.74483 -0.3449254 0.9857835 0.7446487 -0.3448353 0.9857738 0.7444293 -0.3447636 0.9857621 0.7441676 -0.3447407 0.9857485 0.7438622 -0.3448204 0.9857332 0.743517 -0.3450957 0.9857167 0.7431467 -0.3457234 0.9857006 0.7427853 -0.3469645 0.9856879 0.7425006 -0.3492254 0.9856839 0.7424095 -0.3523802 0.9856839 0.7424095 -0.3563715 0.9856839 0.7424095 -0.3614209 0.9856839 0.7424095 -0.3678092 0.9856839 0.7424095 -0.3758911 0.9856839 0.7424095 -0.3861159 0.9856839 0.7424095 -0.3990515 0.9856839 0.7424095 -0.4154167 0.9856839 0.7424095 -0.4361208 0.9856839 0.7424095 -0.4623142 0.9856839 0.7424095 -0.4954523 0.9856839 0.7424095 -0.5373763 0.9856839 0.7424095 -0.5904156 0.9856839 0.7424095 -0.6575172 0.9856839 0.7424095 -0.7424095 0.9856839 0.7424095 -0.8498092 0.9856839 0.7424095 -0.9856839 0.9856839 0.7424095 -0.9890048 0.8673437 0.695167 -0.9914995 0.7992446 0.6791269 -0.9933953 0.7676683 0.6850303 -0.9948487 0.7613218 0.7052169 -0.9959706 0.7712508 0.733625 -0.9968409 0.7906611 0.7657077 -0.9975189 0.8146529 0.7982669 -0.9980488 0.8398974 0.8292297 -0.9984638 0.8642952 0.8574015 -0.9987895 0.886655 0.8822279 -0.9990455 0.9064168 0.9035886 -0.999247 0.9234329 0.9216339 -0.9994057 0.9378038 0.9366635 -0.9995308 0.9497641 0.9490434 -0.9996295 0.9596068 0.9591524 -0.9997074 0.9676368 0.9673508 -0.9997688 0.9741436 0.9739638 -0.9998174 0.9793883 0.9792755 -0.9998557 0.9835983 0.9835276 -0.999886 0.9869667 0.9869223 -0.9999099 0.9896547 0.989627 -0.9999288 0.9917956 0.9917782 -0.9999437 0.993498 0.9934871 -0.4144197 0.9890841 0.6981193 -0.4143955 0.9890831 0.6980806 -0.4143657 0.9890818 0.6980319 -0.414329 0.9890801 0.6979709 -0.4142845 0.9890781 0.6978947 -0.4142311 0.9890755 0.6977997 -0.4141683 0.9890723 0.6976819 -0.4140964 0.9890684 0.6975366 -0.4140176 0.9890637 0.6973589 -0.4139373 0.9890579 0.6971439 -0.4138668 0.989051 0.6968875 -0.4138277 0.989043 0.6965883 -0.4138582 0.9890339 0.6962504 -0.4140252 0.9890241 0.695888 -0.4144423 0.9890146 0.6955345 -0.4152991 0.9890072 0.6952561 -0.4168922 0.9890048 0.695167 -0.419125 0.9890048 0.695167 -0.4219498 0.9890048 0.695167 -0.4255236 0.9890048 0.695167 -0.4300448 0.9890048 0.695167 -0.4357648 0.9890048 0.695167 -0.4430013 0.9890048 0.695167 -0.4521565 0.9890048 0.695167 -0.4637389 0.9890048 0.695167 -0.4783922 0.9890048 0.695167 -0.4969305 0.9890048 0.695167 -0.5203839 0.9890048 0.695167 -0.5500554 0.9890048 0.695167 -0.5875938 0.9890048 0.695167 -0.6350848 0.9890048 0.695167 -0.695167 0.9890048 0.695167 -0.7711789 0.9890048 0.695167 -0.8673437 0.9890048 0.695167 -0.9890048 0.9890048 0.695167 -0.9914995 0.8841204 0.6791269 -0.9933953 0.8260608 0.6850303 -0.9948487 0.8009659 0.7052169 -0.9959706 0.7978374 0.733625 -0.9968409 0.8082934 0.7657077 -0.9975189 0.8262314 0.7982669 -0.9980488 0.8474353 0.8292297 -0.9984638 0.8691663 0.8574015 -0.9987895 0.8897832 0.8822279 -0.9990455 0.9084153 0.9035886 -0.999247 0.9247041 0.9216339 -0.9994057 0.9386096 0.9366635 -0.9995308 0.9502734 0.9490434 -0.9996295 0.959928 0.9591524 -0.9997074 0.9678389 0.9673508 -0.9997688 0.9742706 0.9739638 -0.9998174 0.9794681 0.9792755 -0.9998557 0.9836483 0.9835276 -0.999886 0.986998 0.9869223 -0.9999099 0.9896744 0.989627 -0.9999288 0.9918079 0.9917782 -0.9999437 0.9935057 0.9934871 -0.4834235 0.9915469 0.6816893 -0.4834045 0.9915463 0.6816556 -0.4833811 0.9915455 0.6816133 -0.4833522 0.9915446 0.6815603 -0.4833171 0.9915433 0.681494 -0.4832747 0.9915418 0.6814115 -0.4832246 0.9915399 0.6813091 -0.4831666 0.9915376 0.6811829 -0.4831021 0.9915347 0.6810286 -0.4830346 0.9915312 0.6808418 -0.4829718 0.9915271 0.6806192 -0.4829286 0.9915223 0.6803596 -0.4829319 0.9915169 0.6800663 -0.4830292 0.991511 0.679752 -0.4833013 0.9915054 0.6794455 -0.4838841 0.9915009 0.6792041 -0.4849907 0.9914995 0.6791269 -0.4865484 0.9914995 0.6791269 -0.4885191 0.9914995 0.6791269 -0.4910123 0.9914995 0.6791269 -0.4941665 0.9914995 0.6791269 -0.498157 0.9914995 0.6791269 -0.5032055 0.9914995 0.6791269 -0.5095925 0.9914995 0.6791269 -0.5176729 0.9914995 0.6791269 -0.5278957 0.9914995 0.6791269 -0.5408288 0.9914995 0.6791269 -0.5571908 0.9914995 0.6791269 -0.577891 0.9914995 0.6791269 -0.6040793 0.9914995 0.6791269 -0.637211 0.9914995 0.6791269 -0.6791269 0.9914995 0.6791269 -0.7321559 0.9914995 0.6791269 -0.7992446 0.9914995 0.6791269 -0.8841204 0.9914995 0.6791269 -0.9914995 0.9914995 0.6791269 -0.9933953 0.8999349 0.6850303 -0.9948487 0.8511207 0.7052169 -0.9959706 0.8314729 0.733625 -0.9968409 0.8306004 0.7657077 -0.9975189 0.8408797 0.7982669 -0.9980488 0.8569716 0.8292297 -0.9984638 0.875329 0.8574015 -0.9987895 0.8937407 0.8822279 -0.9990455 0.9109436 0.9035886 -0.999247 0.9263124 0.9216339 -0.9994057 0.939629 0.9366635 -0.9995308 0.9509177 0.9490434 -0.9996295 0.9603343 0.9591524 -0.9997074 0.9680946 0.9673508 -0.9997688 0.9744313 0.9739638 -0.9998174 0.9795689 0.9792755 -0.9998557 0.9837116 0.9835276 -0.999886 0.9870376 0.9869223 -0.9999099 0.9896992 0.989627 -0.9999288 0.9918234 0.9917782 -0.9999437 0.9935154 0.9934871 -0.5504963 0.993424 0.6870967 -0.5504818 0.9934236 0.6870695 -0.550464 0.9934231 0.6870354 -0.5504419 0.9934225 0.6869926 -0.550415 0.9934218 0.6869391 -0.5503825 0.9934209 0.6868724 -0.5503438 0.9934197 0.6867898 -0.5502987 0.9934183 0.686688 -0.550248 0.9934166 0.6865634 -0.5501939 0.9934145 0.6864128 -0.5501416 0.993412 0.6862332 -0.5501012 0.9934091 0.6860238 -0.5500915 0.9934058 0.6857874 -0.5501456 0.9934023 0.685534 -0.5503203 0.9933988 0.685287 -0.5507113 0.9933961 0.6850926 -0.5514695 0.9933953 0.6850303 -0.5525411 0.9933953 0.6850303 -0.5538969 0.9933953 0.6850303 -0.5556122 0.9933953 0.6850303 -0.5577822 0.9933953 0.6850303 -0.5605276 0.9933953 0.6850303 -0.5640008 0.9933953 0.6850303 -0.5683949 0.9933953 0.6850303 -0.573954 0.9933953 0.6850303 -0.580987 0.9933953 0.6850303 -0.5898847 0.9933953 0.6850303 -0.6011414 0.9933953 0.6850303 -0.6153825 0.9933953 0.6850303 -0.6333995 0.9933953 0.6850303 -0.6561933 0.9933953 0.6850303 -0.6850303 0.9933953 0.6850303 -0.721513 0.9933953 0.6850303 -0.7676683 0.9933953 0.6850303 -0.8260608 0.9933953 0.6850303 -0.8999349 0.9933953 0.6850303 -0.9933953 0.9933953 0.6850303 -0.9948487 0.9145732 0.7052169 -0.9959706 0.8740262 0.733625 -0.9968409 0.8588218 0.7657077 -0.9975189 0.8594117 0.7982669 -0.9980488 0.8690364 0.8292297 -0.9984638 0.8831255 0.8574015 -0.9987895 0.8987476 0.8822279 -0.9990455 0.9141422 0.9035886 -0.999247 0.928347 0.9216339 -0.9994057 0.9409186 0.9366635 -0.9995308 0.9517328 0.9490434 -0.9996295 0.9608482 0.9591524 -0.9997074 0.9684181 0.9673508 -0.9997688 0.9746346 0.9739638 -0.9998174 0.9796966 0.9792755 -0.9998557 0.9837916 0.9835276 -0.999886 0.9870878 0.9869223 -0.9999099 0.9897306 0.989627 -0.9999288 0.9918431 0.9917782 -0.9999437 0.9935277 0.9934871 -0.6139459 0.9948662 0.7067995 -0.6139352 0.994866 0.7067787 -0.6139219 0.9948657 0.7067525 -0.6139056 0.9948653 0.7067197 -0.6138855 0.9948649 0.7066787 -0.6138613 0.9948643 0.7066276 -0.6138323 0.9948636 0.7065643 -0.6137984 0.9948628 0.7064863 -0.6137599 0.9948617 0.7063908 -0.6137183 0.9948604 0.7062754 -0.6136769 0.9948589 0.7061378 -0.6136427 0.9948571 0.7059774 -0.6136284 0.9948551 0.7057964 -0.6136569 0.994853 0.7056024 -0.6137675 0.9948509 0.7054133 -0.6140266 0.9948493 0.7052645 -0.6145393 0.9948487 0.7052169 -0.6152669 0.9948487 0.7052169 -0.6161874 0.9948487 0.7052169 -0.6173519 0.9948487 0.7052169 -0.6188252 0.9948487 0.7052169 -0.6206891 0.9948487 0.7052169 -0.6230471 0.9948487 0.7052169 -0.6260304 0.9948487 0.7052169 -0.6298046 0.9948487 0.7052169 -0.6345795 0.9948487 0.7052169 -0.6406203 0.9948487 0.7052169 -0.6482627 0.9948487 0.7052169 -0.6579314 0.9948487 0.7052169 -0.6701635 0.9948487 0.7052169 -0.6856388 0.9948487 0.7052169 -0.7052169 0.9948487 0.7052169 -0.7299859 0.9948487 0.7052169 -0.7613218 0.9948487 0.7052169 -0.8009659 0.9948487 0.7052169 -0.8511207 0.9948487 0.7052169 -0.9145732 0.9948487 0.7052169 -0.9948487 0.9948487 0.7052169 -0.9959706 0.9278617 0.733625 -0.9968409 0.8945255 0.7657077 -0.9975189 0.8828571 0.7982669 -0.9980488 0.8842998 0.8292297 -0.9984638 0.892989 0.8574015 -0.9987895 0.9050819 0.8822279 -0.9990455 0.9181889 0.9035886 -0.999247 0.9309211 0.9216339 -0.9994057 0.9425502 0.9366635 -0.9995308 0.952764 0.9490434 -0.9996295 0.9614985 0.9591524 -0.9997074 0.9688274 0.9673508 -0.9997688 0.9748918 0.9739638 -0.9998174 0.979858 0.9792755 -0.9998557 0.9838928 0.9835276 -0.999886 0.9871512 0.9869223 -0.9999099 0.9897703 0.989627 -0.9999288 0.991868 0.9917782 -0.9999437 0.9935432 0.9934871 -0.6724572 0.9959813 0.7347906 -0.6724495 0.9959811 0.7347753 -0.6724399 0.9959809 0.734756 -0.672428 0.9959807 0.7347318 -0.6724135 0.9959804 0.7347016 -0.6723959 0.9959801 0.7346639 -0.6723748 0.9959797 0.7346173 -0.67235 0.9959791 0.7345598 -0.6723217 0.9959785 0.7344894 -0.6722907 0.9959777 0.7344044 -0.6722594 0.9959768 0.7343031 -0.6722322 0.9959757 0.7341849 -0.672218 0.9959745 0.7340516 -0.672232 0.9959732 0.7339088 -0.6723012 0.9959719 0.7337696 -0.6724711 0.9959709 0.7336601 -0.6728136 0.9959706 0.733625 -0.6733015 0.9959706 0.733625 -0.6739188 0.9959706 0.733625 -0.6746998 0.9959706 0.733625 -0.6756878 0.9959706 0.733625 -0.6769378 0.9959706 0.733625 -0.6785192 0.9959706 0.733625 -0.6805199 0.9959706 0.733625 -0.683051 0.9959706 0.733625 -0.6862532 0.9959706 0.733625 -0.6903044 0.9959706 0.733625 -0.6954296 0.9959706 0.733625 -0.7019138 0.9959706 0.733625 -0.710117 0.9959706 0.733625 -0.7204952 0.9959706 0.733625 -0.733625 0.9959706 0.733625 -0.7502359 0.9959706 0.733625 -0.7712508 0.9959706 0.733625 -0.7978374 0.9959706 0.733625 -0.8314729 0.9959706 0.733625 -0.8740262 0.9959706 0.733625 -0.9278617 0.9959706 0.733625 -0.9959706 0.9959706 0.733625 -0.9968409 0.9396953 0.7657077 -0.9975189 0.9125186 0.7982669 -0.9980488 0.9036101 0.8292297 -0.9984638 0.9054678 0.8574015 -0.9987895 0.9130957 0.8822279 -0.9990455 0.9233085 0.9035886 -0.999247 0.9341777 0.9216339 -0.9994057 0.9446144 0.9366635 -0.9995308 0.9540687 0.9490434 -0.9996295 0.9623212 0.9591524 -0.9997074 0.9693452 0.9673508 -0.9997688 0.9752172 0.9739638 -0.9998174 0.9800622 0.9792755 -0.9998557 0.9840209 0.9835276 -0.999886 0.9872315 0.9869223 -0.9999099 0.9898206 0.989627 -0.9999288 0.9918994 0.9917782 -0.9999437 0.9935629 0.9934871 -0.7251659 0.9968475 0.76654 -0.7251605 0.9968474 0.766529 -0.7251537 0.9968473 0.7665152 -0.7251454 0.9968472 0.7664979 -0.7251351 0.996847 0.7664763 -0.7251226 0.9968468 0.7664494 -0.7251076 0.9968465 0.7664161 -0.7250899 0.9968462 0.766375 -0.7250697 0.9968458 0.7663248 -0.7250473 0.9968453 0.7662641 -0.7250244 0.9968448 0.7661917 -0.7250039 0.9968441 0.7661073 -0.7249916 0.9968433 0.7660121 -0.7249978 0.9968425 0.7659102 -0.7250408 0.9968418 0.7658108 -0.7251511 0.9968411 0.7657327 -0.7253775 0.9968409 0.7657077 -0.7257011 0.9968409 0.7657077 -0.7261105 0.9968409 0.7657077 -0.7266285 0.9968409 0.7657077 -0.7272837 0.9968409 0.7657077 -0.7281127 0.9968409 0.7657077 -0.7291615 0.9968409 0.7657077 -0.7304884 0.9968409 0.7657077 -0.732167 0.9968409 0.7657077 -0.7342907 0.9968409 0.7657077 -0.7369774 0.9968409 0.7657077 -0.7403765 0.9968409 0.7657077 -0.7446768 0.9968409 0.7657077 -0.7501172 0.9968409 0.7657077 -0.757 0.9968409 0.7657077 -0.7657077 0.9968409 0.7657077 -0.776724 0.9968409 0.7657077 -0.7906611 0.9968409 0.7657077 -0.8082934 0.9968409 0.7657077 -0.8306004 0.9968409 0.7657077 -0.8588218 0.9968409 0.7657077 -0.8945255 0.9968409 0.7657077 -0.9396953 0.9968409 0.7657077 -0.9968409 0.9968409 0.7657077 -0.9975189 0.9500442 0.7982669 -0.9980488 0.9280401 0.8292297 -0.9984638 0.921255 0.8574015 -0.9987895 0.9232341 0.8822279 -0.9990455 0.9297854 0.9035886 -0.999247 0.9382977 0.9216339 -0.9994057 0.9472259 0.9366635 -0.9995308 0.9557192 0.9490434 -0.9996295 0.963362 0.9591524 -0.9997074 0.9700002 0.9673508 -0.9997688 0.9756289 0.9739638 -0.9998174 0.9803206 0.9792755 -0.9998557 0.9841829 0.9835276 -0.999886 0.987333 0.9869223 -0.9999099 0.9898842 0.989627 -0.9999288 0.9919392 0.9917782 -0.9999437 0.9935878 0.9934871 -0.7716588 0.997523 0.7988464 -0.7716551 0.997523 0.7988387 -0.7716504 0.9975229 0.7988291 -0.7716446 0.9975228 0.7988171 -0.7716375 0.9975227 0.7988021 -0.7716288 0.9975226 0.7987833 -0.7716184 0.9975224 0.7987601 -0.7716061 0.9975222 0.7987315 -0.7715919 0.997522 0.7986965 -0.7715762 0.9975217 0.7986542 -0.7715599 0.9975213 0.7986038 -0.7715449 0.9975209 0.7985451 -0.7715352 0.9975204 0.7984788 -0.7715376 0.9975199 0.7984078 -0.7715641 0.9975194 0.7983387 -0.7716352 0.9975191 0.7982843 -0.7717834 0.9975189 0.7982669 -0.7719959 0.9975189 0.7982669 -0.7722648 0.9975189 0.7982669 -0.7726049 0.9975189 0.7982669 -0.7730352 0.9975189 0.7982669 -0.7735795 0.9975189 0.7982669 -0.7742682 0.9975189 0.7982669 -0.7751395 0.9975189 0.7982669 -0.7762418 0.9975189 0.7982669 -0.7776364 0.9975189 0.7982669 -0.7794007 0.9975189 0.7982669 -0.7816327 0.9975189 0.7982669 -0.7844566 0.9975189 0.7982669 -0.7880291 0.9975189 0.7982669 -0.7925488 0.9975189 0.7982669 -0.7982669 0.9975189 0.7982669 -0.8055009 0.9975189 0.7982669 -0.8146529 0.9975189 0.7982669 -0.8262314 0.9975189 0.7982669 -0.8408797 0.9975189 0.7982669 -0.8594117 0.9975189 0.7982669 -0.8828571 0.9975189 0.7982669 -0.9125186 0.9975189 0.7982669 -0.9500442 0.9975189 0.7982669 -0.9975189 0.9975189 0.7982669 -0.9980488 0.9589472 0.8292297 -0.9984638 0.9412278 0.8574015 -0.9987895 0.9360606 0.8822279 -0.9990455 0.9379796 0.9035886 -0.999247 0.94351 0.9216339 -0.9994057 0.9505298 0.9366635 -0.9995308 0.9578074 0.9490434 -0.9996295 0.9646787 0.9591524 -0.9997074 0.970829 0.9673508 -0.9997688 0.9761497 0.9739638 -0.9998174 0.9806476 0.9792755 -0.9998557 0.984388 0.9835276 -0.999886 0.9874615 0.9869223 -0.9999099 0.9899646 0.989627 -0.9999288 0.9919896 0.9917782 -0.9999437 0.9936193 0.9934871 -0.8119154 0.9980513 0.829625 -0.8119128 0.9980512 0.8296198 -0.8119096 0.9980512 0.8296133 -0.8119057 0.9980511 0.8296051 -0.8119009 0.9980511 0.8295948 -0.8118949 0.998051 0.829582 -0.8118878 0.9980509 0.8295662 -0.8118794 0.9980508 0.8295466 -0.8118697 0.9980506 0.8295228 -0.8118589 0.9980504 0.8294939 -0.8118476 0.9980502 0.8294595 -0.811837 0.99805 0.8294195 -0.8118298 0.9980497 0.8293742 -0.8118303 0.9980494 0.8293258 -0.8118466 0.9980491 0.8292787 -0.8118921 0.9980488 0.8292416 -0.8119884 0.9980488 0.8292297 -0.8121268 0.9980488 0.8292297 -0.8123018 0.9980488 0.8292297 -0.8125232 0.9980488 0.8292297 -0.8128033 0.9980488 0.8292297 -0.8131577 0.9980488 0.8292297 -0.8136061 0.9980488 0.8292297 -0.8141733 0.9980488 0.8292297 -0.8148909 0.9980488 0.8292297 -0.8157988 0.9980488 0.8292297 -0.8169474 0.9980488 0.8292297 -0.8184005 0.9980488 0.8292297 -0.8202389 0.9980488 0.8292297 -0.8225647 0.9980488 0.8292297 -0.8255071 0.9980488 0.8292297 -0.8292297 0.9980488 0.8292297 -0.8339392 0.9980488 0.8292297 -0.8398974 0.9980488 0.8292297 -0.8474353 0.9980488 0.8292297 -0.8569716 0.9980488 0.8292297 -0.8690364 0.9980488 0.8292297 -0.8842998 0.9980488 0.8292297 -0.9036101 0.9980488 0.8292297 -0.9280401 0.9980488 0.8292297 -0.9589472 0.9980488 0.8292297 -0.9980488 0.9980488 0.8292297 -0.9984638 0.9664961 0.8574015 -0.9987895 0.9522877 0.8822279 -0.9990455 0.9483463 0.9035886 -0.999247 0.9501042 0.9216339 -0.9994057 0.9547096 0.9366635 -0.9995308 0.9604492 0.9490434 -0.9996295 0.9663445 0.9591524 -0.9997074 0.9718774 0.9673508 -0.9997688 0.9768086 0.9739638 -0.9998174 0.9810611 0.9792755 -0.9998557 0.9846473 0.9835276 -0.999886 0.987624 0.9869223 -0.9999099 0.9900664 0.989627 -0.9999288 0.9920533 0.9917782 -0.9999437 0.9936592 0.9934871 -0.8462171 0.9984653 0.8576667 -0.8462154 0.9984653 0.8576632 -0.8462132 0.9984653 0.8576588 -0.8462106 0.9984653 0.8576533 -0.8462073 0.9984652 0.8576464 -0.8462034 0.9984652 0.8576378 -0.8461986 0.9984651 0.8576272 -0.8461929 0.998465 0.8576141 -0.8461864 0.9984649 0.8575981 -0.8461791 0.9984648 0.8575787 -0.8461714 0.9984647 0.8575557 -0.8461641 0.9984645 0.8575288 -0.8461589 0.9984643 0.8574984 -0.8461587 0.9984642 0.857466 -0.8461687 0.998464 0.8574344 -0.8461977 0.9984638 0.8574095 -0.8462598 0.9984638 0.8574015 -0.8463492 0.9984638 0.8574015 -0.8464623 0.9984638 0.8574015 -0.8466054 0.9984638 0.8574015 -0.8467864 0.9984638 0.8574015 -0.8470154 0.9984638 0.8574015 -0.8473052 0.9984638 0.8574015 -0.8476717 0.9984638 0.8574015 -0.8481355 0.9984638 0.8574015 -0.8487222 0.9984638 0.8574015 -0.8494644 0.9984638 0.8574015 -0.8504035 0.9984638 0.8574015 -0.8515915 0.9984638 0.8574015 -0.8530945 0.9984638 0.8574015 -0.8549959 0.9984638 0.8574015 -0.8574015 0.9984638 0.8574015 -0.8604449 0.9984638 0.8574015 -0.8642952 0.9984638 0.8574015 -0.8691663 0.9984638 0.8574015 -0.875329 0.9984638 0.8574015 -0.8831255 0.9984638 0.8574015 -0.892989 0.9984638 0.8574015 -0.9054678 0.9984638 0.8574015 -0.921255 0.9984638 0.8574015 -0.9412278 0.9984638 0.8574015 -0.9664961 0.9984638 0.8574015 -0.9984638 0.9984638 0.8574015 -0.9987895 0.9728171 0.8822279 -0.9990455 0.9614615 0.9035886 -0.999247 0.9584468 0.9216339 -0.9994057 0.9599976 0.9366635 -0.9995308 0.9637914 0.9490434 -0.9996295 0.968452 0.9591524 -0.9997074 0.9732039 0.9673508 -0.9997688 0.9776422 0.9739638 -0.9998174 0.9815844 0.9792755 -0.9998557 0.9849754 0.9835276 -0.999886 0.9878296 0.9869223 -0.9999099 0.9901951 0.989627 -0.9999288 0.9921339 0.9917782 -0.9999437 0.9937096 0.9934871 -0.8750477 0.9987905 0.8824033 -0.8750466 0.9987905 0.882401 -0.8750451 0.9987904 0.8823981 -0.8750434 0.9987904 0.8823944 -0.8750412 0.9987904 0.8823899 -0.8750386 0.9987904 0.8823842 -0.8750355 0.9987903 0.8823772 -0.8750317 0.9987903 0.8823685 -0.8750274 0.9987902 0.8823579 -0.8750225 0.9987902 0.8823451 -0.8750173 0.9987901 0.8823298 -0.8750124 0.99879 0.882312 -0.8750088 0.9987899 0.882292 -0.8750084 0.9987897 0.8822705 -0.8750145 0.9987896 0.8822496 -0.8750329 0.9987895 0.8822331 -0.8750727 0.9987895 0.8822279 -0.8751301 0.9987895 0.8822279 -0.8752028 0.9987895 0.8822279 -0.8752947 0.9987895 0.8822279 -0.8754109 0.9987895 0.8822279 -0.875558 0.9987895 0.8822279 -0.8757441 0.9987895 0.8822279 -0.8759795 0.9987895 0.8822279 -0.8762773 0.9987895 0.8822279 -0.8766541 0.9987895 0.8822279 -0.8771307 0.9987895 0.8822279 -0.8777338 0.9987895 0.8822279 -0.8784967 0.9987895 0.8822279 -0.8794619 0.9987895 0.8822279 -0.880683 0.9987895 0.8822279 -0.8822279 0.9987895 0.8822279 -0.8841823 0.9987895 0.8822279 -0.886655 0.9987895 0.8822279 -0.8897832 0.9987895 0.8822279 -0.8937407 0.9987895 0.8822279 -0.8987476 0.9987895 0.8822279 -0.9050819 0.9987895 0.8822279 -0.9130957 0.9987895 0.8822279 -0.9232341 0.9987895 0.8822279 -0.9360606 0.9987895 0.8822279 -0.9522877 0.9987895 0.8822279 -0.9728171 0.9987895 0.8822279 -0.9987895 0.9987895 0.8822279 -0.9990455 0.9780539 0.9035886 -0.999247 0.9690013 0.9216339 -0.9994057 0.9666876 0.9366635 -0.9995308 0.9680197 0.9490434 -0.9996295 0.9711183 0.9591524 -0.9997074 0.974882 0.9673508 -0.9997688 0.9786968 0.9739638 -0.9998174 0.9822464 0.9792755 -0.9998557 0.9853905 0.9835276 -0.999886 0.9880897 0.9869223 -0.9999099 0.990358 0.989627 -0.9999288 0.9922358 0.9917782 -0.9999437 0.9937734 0.9934871 -0.8990028 0.9990461 0.9037033 -0.899002 0.9990461 0.9037018 -0.8990011 0.9990461 0.9036999 -0.899 0.9990461 0.9036975 -0.8989986 0.9990461 0.9036945 -0.8989969 0.9990461 0.9036908 -0.8989948 0.9990461 0.9036862 -0.8989923 0.999046 0.9036806 -0.8989895 0.999046 0.9036736 -0.8989863 0.9990459 0.9036652 -0.8989829 0.9990459 0.9036553 -0.8989796 0.9990458 0.9036436 -0.8989771 0.9990458 0.9036305 -0.8989767 0.9990457 0.9036165 -0.8989805 0.9990456 0.9036028 -0.8989921 0.9990456 0.903592 -0.8990175 0.9990455 0.9035886 -0.8990542 0.9990455 0.9035886 -0.8991006 0.9990455 0.9035886 -0.8991593 0.9990455 0.9035886 -0.8992336 0.9990455 0.9035886 -0.8993275 0.9990455 0.9035886 -0.8994464 0.9990455 0.9035886 -0.8995968 0.9990455 0.9035886 -0.899787 0.9990455 0.9035886 -0.9000277 0.9990455 0.9035886 -0.9003323 0.9990455 0.9035886 -0.9007175 0.9990455 0.9035886 -0.9012049 0.9990455 0.9035886 -0.9018215 0.9990455 0.9035886 -0.9026016 0.9990455 0.9035886 -0.9035886 0.9990455 0.9035886 -0.9048372 0.9990455 0.9035886 -0.9064168 0.9990455 0.9035886 -0.9084153 0.9990455 0.9035886 -0.9109436 0.9990455 0.9035886 -0.9141422 0.9990455 0.9035886 -0.9181889 0.9990455 0.9035886 -0.9233085 0.9990455 0.9035886 -0.9297854 0.9990455 0.9035886 -0.9379796 0.9990455 0.9035886 -0.9483463 0.9990455 0.9035886 -0.9614615 0.9990455 0.9035886 -0.9780539 0.9990455 0.9035886 -0.9990455 0.9990455 0.9035886 -0.999247 0.982354 0.9216339 -0.9994057 0.9751513 0.9366635 -0.9995308 0.9733691 0.9490434 -0.9996295 0.9744915 0.9591524 -0.9997074 0.977005 0.9673508 -0.9997688 0.980031 0.9739638 -0.9998174 0.9830838 0.9792755 -0.9998557 0.9859157 0.9835276 -0.999886 0.9884188 0.9869223 -0.9999099 0.9905641 0.989627 -0.9999288 0.9923648 0.9917782 -0.9999437 0.9938541 0.9934871 -0.9187175 0.9992474 0.9217082 -0.918717 0.9992474 0.9217073 -0.9187164 0.9992474 0.921706 -0.9187157 0.9992474 0.9217045 -0.9187148 0.9992474 0.9217025 -0.9187137 0.9992474 0.9217001 -0.9187123 0.9992473 0.9216972 -0.9187107 0.9992473 0.9216935 -0.9187089 0.9992473 0.921689 -0.9187068 0.9992473 0.9216836 -0.9187045 0.9992472 0.9216771 -0.9187024 0.9992472 0.9216695 -0.9187008 0.9992472 0.921661 -0.9187004 0.9992471 0.9216519 -0.9187027 0.9992471 0.9216431 -0.9187101 0.999247 0.9216361 -0.9187262 0.999247 0.9216339 -0.9187495 0.999247 0.9216339 -0.9187791 0.999247 0.9216339 -0.9188164 0.999247 0.9216339 -0.9188636 0.999247 0.9216339 -0.9189234 0.999247 0.9216339 -0.918999 0.999247 0.9216339 -0.9190947 0.999247 0.9216339 -0.9192157 0.999247 0.9216339 -0.9193688 0.999247 0.9216339 -0.9195625 0.999247 0.9216339 -0.9198076 0.999247 0.9216339 -0.9201176 0.999247 0.9216339 -0.9205098 0.999247 0.9216339 -0.9210061 0.999247 0.9216339 -0.9216339 0.999247 0.9216339 -0.9224281 0.999247 0.9216339 -0.9234329 0.999247 0.9216339 -0.9247041 0.999247 0.9216339 -0.9263124 0.999247 0.9216339 -0.928347 0.999247 0.9216339 -0.9309211 0.999247 0.9216339 -0.9341777 0.999247 0.9216339 -0.9382977 0.999247 0.9216339 -0.94351 0.999247 0.9216339 -0.9501042 0.999247 0.9216339 -0.9584468 0.999247 0.9216339 -0.9690013 0.999247 0.9216339 -0.982354 0.999247 0.9216339 -0.999247 0.999247 0.9216339 -0.9994057 0.9858591 0.9366635 -0.9995308 0.9801368 0.9490434 -0.9996295 0.978759 0.9591524 -0.9997074 0.9796909 0.9673508 -0.9997688 0.981719 0.9739638 -0.9998174 0.9841433 0.9792755 -0.9998557 0.9865801 0.9835276 -0.999886 0.9888351 0.9869223 -0.9999099 0.9908248 0.989627 -0.9999288 0.992528 0.9917782 -0.9999437 0.9939562 0.9934871 -0.9348153 0.999406 0.9367113 -0.9348149 0.999406 0.9367107 -0.9348146 0.999406 0.9367099 -0.9348141 0.999406 0.9367089 -0.9348135 0.999406 0.9367077 -0.9348128 0.9994059 0.9367061 -0.9348119 0.9994059 0.9367042 -0.9348109 0.9994059 0.9367018 -0.9348097 0.9994059 0.9366989 -0.9348083 0.9994059 0.9366954 -0.9348069 0.9994059 0.9366913 -0.9348055 0.9994059 0.9366864 -0.9348044 0.9994058 0.9366809 -0.9348042 0.9994058 0.9366751 -0.9348056 0.9994058 0.9366694 -0.9348102 0.9994057 0.9366649 -0.9348204 0.9994057 0.9366635 -0.9348352 0.9994057 0.9366635 -0.9348539 0.9994057 0.9366635 -0.9348776 0.9994057 0.9366635 -0.9349075 0.9994057 0.9366635 -0.9349454 0.9994057 0.9366635 -0.9349933 0.9994057 0.9366635 -0.935054 0.9994057 0.9366635 -0.9351307 0.9994057 0.9366635 -0.9352277 0.9994057 0.9366635 -0.9353505 0.9994057 0.9366635 -0.9355059 0.9994057 0.9366635 -0.9357024 0.9994057 0.9366635 -0.935951 0.9994057 0.9366635 -0.9362655 0.9994057 0.9366635 -0.9366635 0.9994057 0.9366635 -0.9371669 0.9994057 0.9366635 -0.9378038 0.9994057 0.9366635 -0.9386096 0.9994057 0.9366635 -0.939629 0.9994057 0.9366635 -0.9409186 0.9994057 0.9366635 -0.9425502 0.9994057 0.9366635 -0.9446144 0.9994057 0.9366635 -0.9472259 0.9994057 0.9366635 -0.9505298 0.9994057 0.9366635 -0.9547096 0.9994057 0.9366635 -0.9599976 0.9994057 0.9366635 -0.9666876 0.9994057 0.9366635 -0.9751513 0.9994057 0.9366635 -0.9858591 0.9994057 0.9366635 -0.9994057 0.9994057 0.9366635 -0.9995308 0.9886988 0.9490434 -0.9996295 0.9841579 0.9591524 -0.9997074 0.983089 0.9673508 -0.9997688 0.9838545 0.9739638 -0.9998174 0.9854838 0.9792755 -0.9998557 0.9874207 0.9835276 -0.999886 0.9893618 0.9869223 -0.9999099 0.9911547 0.989627 -0.9999288 0.9927345 0.9917782 -0.9999437 0.9940854 0.9934871 -0.9478754 0.999531 0.949074 -0.9478752 0.999531 0.9490736 -0.947875 0.999531 0.9490731 -0.9478746 0.999531 0.9490724 -0.9478743 0.999531 0.9490716 -0.9478738 0.999531 0.9490706 -0.9478733 0.999531 0.9490694 -0.9478726 0.999531 0.9490679 -0.9478718 0.999531 0.949066 -0.947871 0.9995309 0.9490638 -0.94787 0.9995309 0.9490611 -0.9478691 0.9995309 0.949058 -0.9478684 0.9995309 0.9490545 -0.9478683 0.9995309 0.9490508 -0.9478691 0.9995309 0.9490471 -0.947872 0.9995309 0.9490443 -0.9478785 0.9995308 0.9490434 -0.9478878 0.9995308 0.9490434 -0.9478997 0.9995308 0.9490434 -0.9479146 0.9995308 0.9490434 -0.9479335 0.9995308 0.9490434 -0.9479575 0.9995308 0.9490434 -0.9479878 0.9995308 0.9490434 -0.9480261 0.9995308 0.9490434 -0.9480746 0.9995308 0.9490434 -0.9481359 0.9995308 0.9490434 -0.9482135 0.9995308 0.9490434 -0.9483117 0.9995308 0.9490434 -0.9484359 0.9995308 0.9490434 -0.9485931 0.9995308 0.9490434 -0.9487918 0.9995308 0.9490434 -0.9490434 0.9995308 0.9490434 -0.9493615 0.9995308 0.9490434 -0.9497641 0.9995308 0.9490434 -0.9502734 0.9995308 0.9490434 -0.9509177 0.9995308 0.9490434 -0.9517328 0.9995308 0.9490434 -0.952764 0.9995308 0.9490434 -0.9540687 0.9995308 0.9490434 -0.9557192 0.9995308 0.9490434 -0.9578074 0.9995308 0.9490434 -0.9604492 0.9995308 0.9490434 -0.9637914 0.9995308 0.9490434 -0.9680197 0.9995308 0.9490434 -0.9733691 0.9995308 0.9490434 -0.9801368 0.9995308 0.9490434 -0.9886988 0.9995308 0.9490434 -0.9995308 0.9995308 0.9490434 -0.9996295 0.9909882 0.9591524 -0.9997074 0.9873879 0.9673508 -0.9997688 0.9865561 0.9739638 -0.9998174 0.9871796 0.9792755 -0.9998557 0.9884841 0.9835276 -0.999886 0.9900282 0.9869223 -0.9999099 0.991572 0.989627 -0.9999288 0.9929957 0.9917782 -0.9999437 0.9942488 0.9934871 -0.958416 0.9996296 0.9591719 -0.9584159 0.9996296 0.9591716 -0.9584157 0.9996296 0.9591713 -0.9584155 0.9996296 0.9591709 -0.9584153 0.9996296 0.9591704 -0.958415 0.9996296 0.9591697 -0.9584146 0.9996296 0.959169 -0.9584142 0.9996296 0.959168 -0.9584137 0.9996296 0.9591668 -0.9584132 0.9996296 0.9591654 -0.9584126 0.9996296 0.9591637 -0.958412 0.9996296 0.9591617 -0.9584115 0.9996296 0.9591595 -0.9584114 0.9996295 0.9591571 -0.958412 0.9996295 0.9591548 -0.9584138 0.9996295 0.959153 -0.9584178 0.9996295 0.9591524 -0.9584237 0.9996295 0.9591524 -0.9584312 0.9996295 0.9591524 -0.9584406 0.9996295 0.9591524 -0.9584526 0.9996295 0.9591524 -0.9584677 0.9996295 0.9591524 -0.9584868 0.9996295 0.9591524 -0.9585109 0.9996295 0.9591524 -0.9585415 0.9996295 0.9591524 -0.9585802 0.9996295 0.9591524 -0.9586291 0.9996295 0.9591524 -0.958691 0.9996295 0.9591524 -0.9587693 0.9996295 0.9591524 -0.9588684 0.9996295 0.9591524 -0.9589938 0.9996295 0.9591524 -0.9591524 0.9996295 0.9591524 -0.959353 0.9996295 0.9591524 -0.9596068 0.9996295 0.9591524 -0.959928 0.9996295 0.9591524 -0.9603343 0.9996295 0.9591524 -0.9608482 0.9996295 0.9591524 -0.9614985 0.9996295 0.9591524 -0.9623212 0.9996295 0.9591524 -0.963362 0.9996295 0.9591524 -0.9646787 0.9996295 0.9591524 -0.9663445 0.9996295 0.9591524 -0.968452 0.9996295 0.9591524 -0.9711183 0.9996295 0.9591524 -0.9744915 0.9996295 0.9591524 -0.978759 0.9996295 0.9591524 -0.9841579 0.9996295 0.9591524 -0.9909882 0.9996295 0.9591524 -0.9996295 0.9996295 0.9591524 -0.9997074 0.9928267 0.9673508 -0.9997688 0.9899741 0.9739638 -0.9998174 0.989325 0.9792755 -0.9998557 0.9898295 0.9835276 -0.999886 0.9908712 0.9869223 -0.9999099 0.9920999 0.989627 -0.9999288 0.9933261 0.9917782 -0.9999437 0.9944556 0.9934871 -0.9668873 0.9997074 0.9673631 -0.9668872 0.9997074 0.9673629 -0.9668871 0.9997074 0.9673627 -0.966887 0.9997074 0.9673625 -0.9668869 0.9997074 0.9673622 -0.9668867 0.9997074 0.9673618 -0.9668865 0.9997074 0.9673613 -0.9668862 0.9997074 0.9673607 -0.9668859 0.9997074 0.9673599 -0.9668855 0.9997074 0.967359 -0.9668852 0.9997074 0.9673579 -0.9668848 0.9997074 0.9673567 -0.9668845 0.9997074 0.9673553 -0.9668844 0.9997074 0.9673538 -0.9668847 0.9997074 0.9673523 -0.9668859 0.9997074 0.9673511 -0.9668884 0.9997074 0.9673508 -0.9668922 0.9997074 0.9673508 -0.9668969 0.9997074 0.9673508 -0.9669028 0.9997074 0.9673508 -0.9669103 0.9997074 0.9673508 -0.9669198 0.9997074 0.9673508 -0.9669318 0.9997074 0.9673508 -0.966947 0.9997074 0.9673508 -0.9669663 0.9997074 0.9673508 -0.9669906 0.9997074 0.9673508 -0.9670214 0.9997074 0.9673508 -0.9670604 0.9997074 0.9673508 -0.9671097 0.9997074 0.9673508 -0.967172 0.9997074 0.9673508 -0.9672509 0.9997074 0.9673508 -0.9673508 0.9997074 0.9673508 -0.967477 0.9997074 0.9673508 -0.9676368 0.9997074 0.9673508 -0.9678389 0.9997074 0.9673508 -0.9680946 0.9997074 0.9673508 -0.9684181 0.9997074 0.9673508 -0.9688274 0.9997074 0.9673508 -0.9693452 0.9997074 0.9673508 -0.9700002 0.9997074 0.9673508 -0.970829 0.9997074 0.9673508 -0.9718774 0.9997074 0.9673508 -0.9732039 0.9997074 0.9673508 -0.974882 0.9997074 0.9673508 -0.977005 0.9997074 0.9673508 -0.9796909 0.9997074 0.9673508 -0.983089 0.9997074 0.9673508 -0.9873879 0.9997074 0.9673508 -0.9928267 0.9997074 0.9673508 -0.9997074 0.9997074 0.9673508 -0.9997688 0.9942982 0.9739638 -0.9998174 0.9920392 0.9792755 -0.9998557 0.9915316 0.9835276 -0.999886 0.9919377 0.9869223 -0.9999099 0.9927678 0.989627 -0.9999288 0.9937442 0.9917782 -0.9999437 0.9947172 0.9934871 -0.9736726 0.9997689 0.9739717 -0.9736726 0.9997689 0.9739715 -0.9736725 0.9997689 0.9739714 -0.9736724 0.9997689 0.9739713 -0.9736723 0.9997689 0.9739711 -0.9736722 0.9997689 0.9739708 -0.9736721 0.9997689 0.9739705 -0.9736719 0.9997689 0.9739701 -0.9736717 0.9997689 0.9739696 -0.9736715 0.9997689 0.9739691 -0.9736712 0.9997689 0.9739684 -0.973671 0.9997689 0.9739676 -0.9736708 0.9997689 0.9739667 -0.9736708 0.9997689 0.9739657 -0.973671 0.9997688 0.9739648 -0.9736717 0.9997688 0.9739641 -0.9736733 0.9997688 0.9739638 -0.9736756 0.9997688 0.9739638 -0.9736786 0.9997688 0.9739638 -0.9736823 0.9997688 0.9739638 -0.973687 0.9997688 0.9739638 -0.973693 0.9997688 0.9739638 -0.9737006 0.9997688 0.9739638 -0.9737101 0.9997688 0.9739638 -0.9737222 0.9997688 0.9739638 -0.9737375 0.9997688 0.9739638 -0.9737569 0.9997688 0.9739638 -0.9737814 0.9997688 0.9739638 -0.9738123 0.9997688 0.9739638 -0.9738515 0.9997688 0.9739638 -0.9739011 0.9997688 0.9739638 -0.9739638 0.9997688 0.9739638 -0.9740432 0.9997688 0.9739638 -0.9741436 0.9997688 0.9739638 -0.9742706 0.9997688 0.9739638 -0.9744313 0.9997688 0.9739638 -0.9746346 0.9997688 0.9739638 -0.9748918 0.9997688 0.9739638 -0.9752172 0.9997688 0.9739638 -0.9756289 0.9997688 0.9739638 -0.9761497 0.9997688 0.9739638 -0.9768086 0.9997688 0.9739638 -0.9776422 0.9997688 0.9739638 -0.9786968 0.9997688 0.9739638 -0.980031 0.9997688 0.9739638 -0.981719 0.9997688 0.9739638 -0.9838545 0.9997688 0.9739638 -0.9865561 0.9997688 0.9739638 -0.9899741 0.9997688 0.9739638 -0.9942982 0.9997688 0.9739638 -0.9997688 0.9997688 0.9739638 -0.9998174 0.9954731 0.9792755 -0.9998557 0.9936849 0.9835276 -0.999886 0.993287 0.9869223 -0.9999099 0.9936128 0.989627 -0.9999288 0.9942731 0.9917782 -0.9999437 0.9950481 0.9934871 -0.9790927 0.9998174 0.9792804 -0.9790927 0.9998174 0.9792804 -0.9790927 0.9998174 0.9792803 -0.9790926 0.9998174 0.9792802 -0.9790925 0.9998174 0.9792801 -0.9790925 0.9998174 0.9792799 -0.9790924 0.9998174 0.9792797 -0.9790923 0.9998174 0.9792795 -0.9790921 0.9998174 0.9792792 -0.979092 0.9998174 0.9792788 -0.9790919 0.9998174 0.9792784 -0.9790917 0.9998174 0.9792779 -0.9790916 0.9998174 0.9792773 -0.9790916 0.9998174 0.9792767 -0.9790917 0.9998174 0.9792761 -0.9790921 0.9998174 0.9792757 -0.9790931 0.9998174 0.9792755 -0.9790946 0.9998174 0.9792755 -0.9790965 0.9998174 0.9792755 -0.9790988 0.9998174 0.9792755 -0.9791018 0.9998174 0.9792755 -0.9791055 0.9998174 0.9792755 -0.9791103 0.9998174 0.9792755 -0.9791163 0.9998174 0.9792755 -0.9791238 0.9998174 0.9792755 -0.9791334 0.9998174 0.9792755 -0.9791456 0.9998174 0.9792755 -0.979161 0.9998174 0.9792755 -0.9791804 0.9998174 0.9792755 -0.979205 0.9998174 0.9792755 -0.9792361 0.9998174 0.9792755 -0.9792755 0.9998174 0.9792755 -0.9793253 0.9998174 0.9792755 -0.9793883 0.9998174 0.9792755 -0.9794681 0.9998174 0.9792755 -0.9795689 0.9998174 0.9792755 -0.9796966 0.9998174 0.9792755 -0.979858 0.9998174 0.9792755 -0.9800622 0.9998174 0.9792755 -0.9803206 0.9998174 0.9792755 -0.9806476 0.9998174 0.9792755 -0.9810611 0.9998174 0.9792755 -0.9815844 0.9998174 0.9792755 -0.9822464 0.9998174 0.9792755 -0.9830838 0.9998174 0.9792755 -0.9841433 0.9998174 0.9792755 -0.9854838 0.9998174 0.9792755 -0.9871796 0.9998174 0.9792755 -0.989325 0.9998174 0.9792755 -0.9920392 0.9998174 0.9792755 -0.9954731 0.9998174 0.9792755 -0.9998174 0.9998174 0.9792755 -0.9998557 0.9964092 0.9835276 -0.999886 0.9949941 0.9869223 -0.9999099 0.9946818 0.989627 -0.9999288 0.9949422 0.9917782 -0.9999437 0.9954668 0.9934871 -0.9834129 0.9998557 0.9835307 -0.9834129 0.9998557 0.9835306 -0.9834129 0.9998557 0.9835306 -0.9834129 0.9998557 0.9835305 -0.9834128 0.9998557 0.9835304 -0.9834128 0.9998557 0.9835303 -0.9834127 0.9998557 0.9835302 -0.9834127 0.9998557 0.98353 -0.9834126 0.9998557 0.9835298 -0.9834125 0.9998557 0.9835296 -0.9834124 0.9998557 0.9835294 -0.9834123 0.9998557 0.983529 -0.9834122 0.9998557 0.9835287 -0.9834122 0.9998557 0.9835283 -0.9834123 0.9998557 0.9835279 -0.9834126 0.9998557 0.9835276 -0.9834132 0.9998557 0.9835276 -0.9834141 0.9998557 0.9835276 -0.9834153 0.9998557 0.9835276 -0.9834167 0.9998557 0.9835276 -0.9834186 0.9998557 0.9835276 -0.9834209 0.9998557 0.9835276 -0.9834239 0.9998557 0.9835276 -0.9834277 0.9998557 0.9835276 -0.9834324 0.9998557 0.9835276 -0.9834385 0.9998557 0.9835276 -0.9834461 0.9998557 0.9835276 -0.9834557 0.9998557 0.9835276 -0.9834679 0.9998557 0.9835276 -0.9834833 0.9998557 0.9835276 -0.9835029 0.9998557 0.9835276 -0.9835276 0.9998557 0.9835276 -0.9835588 0.9998557 0.9835276 -0.9835983 0.9998557 0.9835276 -0.9836483 0.9998557 0.9835276 -0.9837116 0.9998557 0.9835276 -0.9837916 0.9998557 0.9835276 -0.9838928 0.9998557 0.9835276 -0.9840209 0.9998557 0.9835276 -0.9841829 0.9998557 0.9835276 -0.984388 0.9998557 0.9835276 -0.9846473 0.9998557 0.9835276 -0.9849754 0.9998557 0.9835276 -0.9853905 0.9998557 0.9835276 -0.9859157 0.9998557 0.9835276 -0.9865801 0.9998557 0.9835276 -0.9874207 0.9998557 0.9835276 -0.9884841 0.9998557 0.9835276 -0.9898295 0.9998557 0.9835276 -0.9915316 0.9998557 0.9835276 -0.9936849 0.9998557 0.9835276 -0.9964092 0.9998557 0.9835276 -0.9998557 0.9998557 0.9835276 -0.999886 0.9971537 0.9869223 -0.9999099 0.9960342 0.989627 -0.9999288 0.9957887 0.9917782 -0.9999437 0.9959964 0.9934871 -0.9868505 0.999886 0.9869243 -0.9868505 0.999886 0.9869242 -0.9868505 0.999886 0.9869242 -0.9868505 0.999886 0.9869242 -0.9868504 0.999886 0.9869241 -0.9868504 0.999886 0.9869241 -0.9868504 0.999886 0.986924 -0.9868503 0.999886 0.9869239 -0.9868503 0.999886 0.9869238 -0.9868502 0.999886 0.9869236 -0.9868502 0.999886 0.9869235 -0.9868501 0.999886 0.9869233 -0.9868501 0.999886 0.986923 -0.98685 0.999886 0.9869228 -0.9868501 0.999886 0.9869226 -0.9868503 0.999886 0.9869224 -0.9868507 0.999886 0.9869223 -0.9868512 0.999886 0.9869223 -0.986852 0.999886 0.9869223 -0.9868529 0.999886 0.9869223 -0.9868541 0.999886 0.9869223 -0.9868555 0.999886 0.9869223 -0.9868574 0.999886 0.9869223 -0.9868597 0.999886 0.9869223 -0.9868627 0.999886 0.9869223 -0.9868665 0.999886 0.9869223 -0.9868713 0.999886 0.9869223 -0.9868773 0.999886 0.9869223 -0.986885 0.999886 0.9869223 -0.9868946 0.999886 0.9869223 -0.9869069 0.999886 0.9869223 -0.9869223 0.999886 0.9869223 -0.9869419 0.999886 0.9869223 -0.9869667 0.999886 0.9869223 -0.986998 0.999886 0.9869223 -0.9870376 0.999886 0.9869223 -0.9870878 0.999886 0.9869223 -0.9871512 0.999886 0.9869223 -0.9872315 0.999886 0.9869223 -0.987333 0.999886 0.9869223 -0.9874615 0.999886 0.9869223 -0.987624 0.999886 0.9869223 -0.9878296 0.999886 0.9869223 -0.9880897 0.999886 0.9869223 -0.9884188 0.999886 0.9869223 -0.9888351 0.999886 0.9869223 -0.9893618 0.999886 0.9869223 -0.9900282 0.999886 0.9869223 -0.9908712 0.999886 0.9869223 -0.9919377 0.999886 0.9869223 -0.993287 0.999886 0.9869223 -0.9949941 0.999886 0.9869223 -0.9971537 0.999886 0.9869223 -0.999886 0.999886 0.9869223 -0.9999099 0.9977452 0.989627 -0.9999288 0.9968597 0.9917782 -0.9999437 0.9966665 0.9934871 -0.989582 0.9999099 0.9896282 -0.989582 0.9999099 0.9896282 -0.989582 0.9999099 0.9896282 -0.989582 0.9999099 0.9896281 -0.989582 0.9999099 0.9896281 -0.9895819 0.9999099 0.9896281 -0.9895819 0.9999099 0.989628 -0.9895819 0.9999099 0.989628 -0.9895819 0.9999099 0.9896279 -0.9895818 0.9999099 0.9896278 -0.9895818 0.9999099 0.9896277 -0.9895818 0.9999099 0.9896276 -0.9895817 0.9999099 0.9896274 -0.9895817 0.9999099 0.9896273 -0.9895817 0.9999099 0.9896271 -0.9895819 0.9999099 0.989627 -0.9895821 0.9999099 0.989627 -0.9895825 0.9999099 0.989627 -0.9895829 0.9999099 0.989627 -0.9895835 0.9999099 0.989627 -0.9895842 0.9999099 0.989627 -0.9895851 0.9999099 0.989627 -0.9895863 0.9999099 0.989627 -0.9895878 0.9999099 0.989627 -0.9895897 0.9999099 0.989627 -0.989592 0.9999099 0.989627 -0.989595 0.9999099 0.989627 -0.9895988 0.9999099 0.989627 -0.9896036 0.9999099 0.989627 -0.9896096 0.9999099 0.989627 -0.9896173 0.9999099 0.989627 -0.989627 0.9999099 0.989627 -0.9896392 0.9999099 0.989627 -0.9896547 0.9999099 0.989627 -0.9896744 0.9999099 0.989627 -0.9896992 0.9999099 0.989627 -0.9897306 0.9999099 0.989627 -0.9897703 0.9999099 0.989627 -0.9898206 0.9999099 0.989627 -0.9898842 0.9999099 0.989627 -0.9899646 0.9999099 0.989627 -0.9900664 0.9999099 0.989627 -0.9901951 0.9999099 0.989627 -0.990358 0.9999099 0.989627 -0.9905641 0.9999099 0.989627 -0.9908248 0.9999099 0.989627 -0.9911547 0.9999099 0.989627 -0.991572 0.9999099 0.989627 -0.9920999 0.9999099 0.989627 -0.9927678 0.9999099 0.989627 -0.9936128 0.9999099 0.989627 -0.9946818 0.9999099 0.989627 -0.9960342 0.9999099 0.989627 -0.9977452 0.9999099 0.989627 -0.9999099 0.9999099 0.989627 -0.9999288 0.9982146 0.9917782 -0.9999437 0.9975143 0.9934871 -0.9917501 0.9999288 0.991779 -0.9917501 0.9999288 0.991779 -0.9917501 0.9999288 0.991779 -0.9917501 0.9999288 0.991779 -0.9917501 0.9999288 0.991779 -0.9917501 0.9999288 0.9917789 -0.99175 0.9999288 0.9917789 -0.99175 0.9999288 0.9917789 -0.99175 0.9999288 0.9917788 -0.99175 0.9999288 0.9917788 -0.99175 0.9999288 0.9917787 -0.9917499 0.9999288 0.9917786 -0.9917499 0.9999288 0.9917785 -0.9917499 0.9999288 0.9917784 -0.9917499 0.9999288 0.9917783 -0.99175 0.9999288 0.9917783 -0.9917502 0.9999288 0.9917782 -0.9917504 0.9999288 0.9917782 -0.9917507 0.9999288 0.9917782 -0.991751 0.9999288 0.9917782 -0.9917515 0.9999288 0.9917782 -0.9917521 0.9999288 0.9917782 -0.9917528 0.9999288 0.9917782 -0.9917537 0.9999288 0.9917782 -0.9917549 0.9999288 0.9917782 -0.9917564 0.9999288 0.9917782 -0.9917582 0.9999288 0.9917782 -0.9917606 0.9999288 0.9917782 -0.9917636 0.9999288 0.9917782 -0.9917674 0.9999288 0.9917782 -0.9917722 0.9999288 0.9917782 -0.9917782 0.9999288 0.9917782 -0.9917859 0.9999288 0.9917782 -0.9917956 0.9999288 0.9917782 -0.9918079 0.9999288 0.9917782 -0.9918234 0.9999288 0.9917782 -0.9918431 0.9999288 0.9917782 -0.991868 0.9999288 0.9917782 -0.9918994 0.9999288 0.9917782 -0.9919392 0.9999288 0.9917782 -0.9919896 0.9999288 0.9917782 -0.9920533 0.9999288 0.9917782 -0.9921339 0.9999288 0.9917782 -0.9922358 0.9999288 0.9917782 -0.9923648 0.9999288 0.9917782 -0.992528 0.9999288 0.9917782 -0.9927345 0.9999288 0.9917782 -0.9929957 0.9999288 0.9917782 -0.9933261 0.9999288 0.9917782 -0.9937442 0.9999288 0.9917782 -0.9942731 0.9999288 0.9917782 -0.9949422 0.9999288 0.9917782 -0.9957887 0.9999288 0.9917782 -0.9968597 0.9999288 0.9917782 -0.9982146 0.9999288 0.9917782 -0.9999288 0.9999288 0.9917782 -0.9999437 0.9985868 0.9934871 -0.9934695 0.9999437 0.9934876 -0.9934695 0.9999437 0.9934876 -0.9934695 0.9999437 0.9934876 -0.9934695 0.9999437 0.9934876 -0.9934695 0.9999437 0.9934875 -0.9934695 0.9999437 0.9934875 -0.9934695 0.9999437 0.9934875 -0.9934694 0.9999437 0.9934875 -0.9934694 0.9999437 0.9934875 -0.9934694 0.9999437 0.9934874 -0.9934694 0.9999437 0.9934874 -0.9934694 0.9999437 0.9934873 -0.9934694 0.9999437 0.9934873 -0.9934694 0.9999437 0.9934872 -0.9934694 0.9999437 0.9934872 -0.9934694 0.9999437 0.9934871 -0.9934695 0.9999437 0.9934871 -0.9934697 0.9999437 0.9934871 -0.9934698 0.9999437 0.9934871 -0.9934701 0.9999437 0.9934871 -0.9934704 0.9999437 0.9934871 -0.9934707 0.9999437 0.9934871 -0.9934712 0.9999437 0.9934871 -0.9934718 0.9999437 0.9934871 -0.9934725 0.9999437 0.9934871 -0.9934734 0.9999437 0.9934871 -0.9934746 0.9999437 0.9934871 -0.9934761 0.9999437 0.9934871 -0.9934779 0.9999437 0.9934871 -0.9934803 0.9999437 0.9934871 -0.9934833 0.9999437 0.9934871 -0.9934871 0.9999437 0.9934871 -0.9934919 0.9999437 0.9934871 -0.993498 0.9999437 0.9934871 -0.9935057 0.9999437 0.9934871 -0.9935154 0.9999437 0.9934871 -0.9935277 0.9999437 0.9934871 -0.9935432 0.9999437 0.9934871 -0.9935629 0.9999437 0.9934871 -0.9935878 0.9999437 0.9934871 -0.9936193 0.9999437 0.9934871 -0.9936592 0.9999437 0.9934871 -0.9937096 0.9999437 0.9934871 -0.9937734 0.9999437 0.9934871 -0.9938541 0.9999437 0.9934871 -0.9939562 0.9999437 0.9934871 -0.9940854 0.9999437 0.9934871 -0.9942488 0.9999437 0.9934871 -0.9944556 0.9999437 0.9934871 -0.9947172 0.9999437 0.9934871 -0.9950481 0.9999437 0.9934871 -0.9954668 0.9999437 0.9934871 -0.9959964 0.9999437 0.9934871 -0.9966665 0.9999437 0.9934871 -0.9975143 0.9999437 0.9934871 -0.9985868 0.9999437 0.9934871 -0.9999437 0.9999437 0.9934871 -0.2783684 0.2783684 0.9814251 -0.278469 0.2783684 0.9814251 -0.2785962 0.2783684 0.9814251 -0.2787571 0.2783684 0.9814251 -0.2789607 0.2783684 0.9814251 -0.2792183 0.2783684 0.9814251 -0.2795441 0.2783684 0.9814251 -0.2799564 0.2783684 0.9814251 -0.2804779 0.2783684 0.9814251 -0.2811378 0.2783684 0.9814251 -0.2819726 0.2783684 0.9814251 -0.2830287 0.2783684 0.9814251 -0.2843648 0.2783684 0.9814251 -0.2860552 0.2783684 0.9814251 -0.2881937 0.2783684 0.9814251 -0.2908992 0.2783684 0.9814251 -0.294322 0.2783684 0.9814251 -0.2986524 0.2783684 0.9814251 -0.3041308 0.2783684 0.9814251 -0.3110617 0.2783684 0.9814251 -0.3198302 0.2783684 0.9814251 -0.3309236 0.2783684 0.9814251 -0.344958 0.2783684 0.9814251 -0.3627135 0.2783684 0.9814251 -0.3851765 0.2783684 0.9814251 -0.413595 0.2783684 0.9814251 -0.4495482 0.2783684 0.9814251 -0.4950336 0.2783684 0.9814251 -0.5525787 0.2783684 0.9814251 -0.6253806 0.2783684 0.9814251 -0.7174845 0.2783684 0.9814251 -0.8340079 0.2783684 0.9814251 -0.9814251 0.2783684 0.9814251 -0.9858181 0.3454107 0.8515523 -0.9890841 0.4144197 0.773388 -0.9915469 0.4834235 0.7342914 -0.993424 0.5504963 0.7233383 -0.9948662 0.6139459 0.7314346 -0.9959813 0.6724572 0.7513284 -0.9968475 0.7251659 0.7775169 -0.997523 0.7716588 0.8060595 -0.9980513 0.8119154 0.8343236 -0.9984653 0.8462171 0.8607044 -0.9987905 0.8750477 0.8843548 -0.9990461 0.8990028 0.9049504 -0.9992474 0.9187175 0.9225017 -0.999406 0.9348153 0.9372144 -0.999531 0.9478754 0.949392 -0.9996296 0.958416 0.9593724 -0.9997074 0.9668873 0.9674893 -0.9997689 0.9736726 0.974051 -0.9998174 0.9790927 0.9793302 -0.9998557 0.9834129 0.9835619 -0.999886 0.9868505 0.9869438 -0.9999099 0.989582 0.9896405 -0.9999288 0.9917501 0.9917867 -0.9999437 0.9934695 0.9934924 -0.2783684 0.278469 0.9814251 -0.2783325 0.2783325 0.9814221 -0.2784598 0.2783325 0.9814221 -0.2786207 0.2783325 0.9814221 -0.2788244 0.2783325 0.9814221 -0.279082 0.2783325 0.9814221 -0.2794079 0.2783325 0.9814221 -0.2798202 0.2783325 0.9814221 -0.2803419 0.2783325 0.9814221 -0.2810019 0.2783325 0.9814221 -0.2818368 0.2783325 0.9814221 -0.2828931 0.2783325 0.9814221 -0.2842295 0.2783325 0.9814221 -0.2859202 0.2783325 0.9814221 -0.2880591 0.2783325 0.9814221 -0.2907651 0.2783325 0.9814221 -0.2941886 0.2783325 0.9814221 -0.2985198 0.2783325 0.9814221 -0.3039992 0.2783325 0.9814221 -0.3109315 0.2783325 0.9814221 -0.3197017 0.2783325 0.9814221 -0.3307971 0.2783325 0.9814221 -0.3448342 0.2783325 0.9814221 -0.3625931 0.2783325 0.9814221 -0.3850603 0.2783325 0.9814221 -0.4134842 0.2783325 0.9814221 -0.4494442 0.2783325 0.9814221 -0.4949383 0.2783325 0.9814221 -0.5524942 0.2783325 0.9814221 -0.62531 0.2783325 0.9814221 -0.7174314 0.2783325 0.9814221 -0.8339769 0.2783325 0.9814221 -0.9814221 0.2783325 0.9814221 -0.9858163 0.3453807 0.8515295 -0.9890831 0.4143955 0.773359 -0.9915463 0.4834045 0.7342633 -0.9934236 0.5504818 0.7233143 -0.994866 0.6139352 0.7314156 -0.9959811 0.6724495 0.751314 -0.9968474 0.7251605 0.7775065 -0.997523 0.7716551 0.8060522 -0.9980512 0.8119128 0.8343185 -0.9984653 0.8462154 0.860701 -0.9987905 0.8750466 0.8843525 -0.9990461 0.899002 0.9049489 -0.9992474 0.918717 0.9225007 -0.999406 0.9348149 0.9372137 -0.999531 0.9478752 0.9493916 -0.9996296 0.9584159 0.9593721 -0.9997074 0.9668872 0.9674892 -0.9997689 0.9736726 0.9740509 -0.9998174 0.9790927 0.9793302 -0.9998557 0.9834129 0.9835618 -0.999886 0.9868505 0.9869438 -0.9999099 0.989582 0.9896404 -0.9999288 0.9917501 0.9917867 -0.9999437 0.9934695 0.9934924 -0.2783684 0.2785962 0.9814251 -0.2783325 0.2784598 0.9814221 -0.2782884 0.2782884 0.9814183 -0.2784494 0.2782884 0.9814183 -0.2786531 0.2782884 0.9814183 -0.2789108 0.2782884 0.9814183 -0.2792368 0.2782884 0.9814183 -0.2796492 0.2782884 0.9814183 -0.280171 0.2782884 0.9814183 -0.2808311 0.2782884 0.9814183 -0.2816663 0.2782884 0.9814183 -0.2827228 0.2782884 0.9814183 -0.2840595 0.2782884 0.9814183 -0.2857506 0.2782884 0.9814183 -0.2878901 0.2782884 0.9814183 -0.2905967 0.2782884 0.9814183 -0.294021 0.2782884 0.9814183 -0.2983532 0.2782884 0.9814183 -0.303834 0.2782884 0.9814183 -0.3107679 0.2782884 0.9814183 -0.3195402 0.2782884 0.9814183 -0.3306382 0.2782884 0.9814183 -0.3446787 0.2782884 0.9814183 -0.3624418 0.2782884 0.9814183 -0.3849144 0.2782884 0.9814183 -0.4133451 0.2782884 0.9814183 -0.4493137 0.2782884 0.9814183 -0.4948186 0.2782884 0.9814183 -0.5523882 0.2782884 0.9814183 -0.6252213 0.2782884 0.9814183 -0.7173646 0.2782884 0.9814183 -0.8339379 0.2782884 0.9814183 -0.9814183 0.2782884 0.9814183 -0.9858141 0.3453439 0.8515008 -0.9890818 0.4143657 0.7733226 -0.9915455 0.4833811 0.7342281 -0.9934231 0.550464 0.7232841 -0.9948657 0.6139219 0.7313916 -0.9959809 0.6724399 0.7512959 -0.9968473 0.7251537 0.7774933 -0.9975229 0.7716504 0.8060429 -0.9980512 0.8119096 0.8343122 -0.9984653 0.8462132 0.8606967 -0.9987904 0.8750451 0.8843497 -0.9990461 0.8990011 0.9049471 -0.9992474 0.9187164 0.9224995 -0.999406 0.9348146 0.937213 -0.999531 0.947875 0.9493911 -0.9996296 0.9584157 0.9593718 -0.9997074 0.9668871 0.967489 -0.9997689 0.9736725 0.9740508 -0.9998174 0.9790927 0.9793301 -0.9998557 0.9834129 0.9835618 -0.999886 0.9868505 0.9869438 -0.9999099 0.989582 0.9896404 -0.9999288 0.9917501 0.9917867 -0.9999437 0.9934695 0.9934924 -0.2783684 0.2787571 0.9814251 -0.2783325 0.2786207 0.9814221 -0.2782884 0.2784494 0.9814183 -0.2782347 0.2782347 0.9814136 -0.2784385 0.2782347 0.9814136 -0.2786962 0.2782347 0.9814136 -0.2790223 0.2782347 0.9814136 -0.2794349 0.2782347 0.9814136 -0.2799568 0.2782347 0.9814136 -0.2806171 0.2782347 0.9814136 -0.2814525 0.2782347 0.9814136 -0.2825094 0.2782347 0.9814136 -0.2838465 0.2782347 0.9814136 -0.2855381 0.2782347 0.9814136 -0.2876782 0.2782347 0.9814136 -0.2903857 0.2782347 0.9814136 -0.293811 0.2782347 0.9814136 -0.2981445 0.2782347 0.9814136 -0.3036269 0.2782347 0.9814136 -0.3105628 0.2782347 0.9814136 -0.3193377 0.2782347 0.9814136 -0.3304391 0.2782347 0.9814136 -0.3444838 0.2782347 0.9814136 -0.3622521 0.2782347 0.9814136 -0.3847314 0.2782347 0.9814136 -0.4131707 0.2782347 0.9814136 -0.44915 0.2782347 0.9814136 -0.4946685 0.2782347 0.9814136 -0.5522553 0.2782347 0.9814136 -0.6251102 0.2782347 0.9814136 -0.717281 0.2782347 0.9814136 -0.8338891 0.2782347 0.9814136 -0.9814136 0.2782347 0.9814136 -0.9858113 0.3452987 0.8514648 -0.9890801 0.414329 0.7732769 -0.9915446 0.4833522 0.7341839 -0.9934225 0.5504419 0.7232463 -0.9948653 0.6139056 0.7313616 -0.9959807 0.672428 0.7512732 -0.9968472 0.7251454 0.7774769 -0.9975228 0.7716446 0.8060313 -0.9980511 0.8119057 0.8343042 -0.9984653 0.8462106 0.8606913 -0.9987904 0.8750434 0.8843461 -0.9990461 0.899 0.9049447 -0.9992474 0.9187157 0.922498 -0.999406 0.9348141 0.937212 -0.999531 0.9478746 0.9493904 -0.9996296 0.9584155 0.9593714 -0.9997074 0.966887 0.9674887 -0.9997689 0.9736724 0.9740506 -0.9998174 0.9790926 0.97933 -0.9998557 0.9834129 0.9835617 -0.999886 0.9868505 0.9869437 -0.9999099 0.989582 0.9896404 -0.9999288 0.9917501 0.9917866 -0.9999437 0.9934695 0.9934924 -0.2783684 0.2789607 0.9814251 -0.2783325 0.2788244 0.9814221 -0.2782884 0.2786531 0.9814183 -0.2782347 0.2784385 0.9814136 -0.2781701 0.2781701 0.9814076 -0.2784279 0.2781701 0.9814076 -0.2787542 0.2781701 0.9814076 -0.2791669 0.2781701 0.9814076 -0.279689 0.2781701 0.9814076 -0.2803496 0.2781701 0.9814076 -0.2811853 0.2781701 0.9814076 -0.2822426 0.2781701 0.9814076 -0.2835801 0.2781701 0.9814076 -0.2852724 0.2781701 0.9814076 -0.2874132 0.2781701 0.9814076 -0.2901217 0.2781701 0.9814076 -0.2935483 0.2781701 0.9814076 -0.2978834 0.2781701 0.9814076 -0.3033679 0.2781701 0.9814076 -0.3103064 0.2781701 0.9814076 -0.3190846 0.2781701 0.9814076 -0.3301901 0.2781701 0.9814076 -0.3442401 0.2781701 0.9814076 -0.3620151 0.2781701 0.9814076 -0.3845027 0.2781701 0.9814076 -0.4129526 0.2781701 0.9814076 -0.4489453 0.2781701 0.9814076 -0.4944808 0.2781701 0.9814076 -0.5520892 0.2781701 0.9814076 -0.6249712 0.2781701 0.9814076 -0.7171765 0.2781701 0.9814076 -0.8338281 0.2781701 0.9814076 -0.9814076 0.2781701 0.9814076 -0.9858079 0.3452442 0.8514199 -0.9890781 0.4142845 0.7732199 -0.9915433 0.4833171 0.7341287 -0.9934218 0.550415 0.7231991 -0.9948649 0.6138855 0.731324 -0.9959804 0.6724135 0.7512449 -0.996847 0.7251351 0.7774563 -0.9975227 0.7716375 0.8060168 -0.9980511 0.8119009 0.8342942 -0.9984652 0.8462073 0.8606845 -0.9987904 0.8750412 0.8843416 -0.9990461 0.8989986 0.9049418 -0.9992474 0.9187148 0.9224961 -0.999406 0.9348135 0.9372107 -0.999531 0.9478743 0.9493896 -0.9996296 0.9584153 0.9593709 -0.9997074 0.9668869 0.9674884 -0.9997689 0.9736723 0.9740504 -0.9998174 0.9790925 0.9793299 -0.9998557 0.9834128 0.9835616 -0.999886 0.9868504 0.9869437 -0.9999099 0.989582 0.9896404 -0.9999288 0.9917501 0.9917866 -0.9999437 0.9934695 0.9934923 -0.2783684 0.2792183 0.9814251 -0.2783325 0.279082 0.9814221 -0.2782884 0.2789108 0.9814183 -0.2782347 0.2786962 0.9814136 -0.2781701 0.2784279 0.9814076 -0.2780936 0.2780936 0.9814002 -0.27842 0.2780936 0.9814002 -0.2788329 0.2780936 0.9814002 -0.2793553 0.2780936 0.9814002 -0.2800162 0.2780936 0.9814002 -0.2808523 0.2780936 0.9814002 -0.28191 0.2780936 0.9814002 -0.2832482 0.2780936 0.9814002 -0.2849413 0.2780936 0.9814002 -0.2870831 0.2780936 0.9814002 -0.2897929 0.2780936 0.9814002 -0.2932211 0.2780936 0.9814002 -0.2975582 0.2780936 0.9814002 -0.3030452 0.2780936 0.9814002 -0.309987 0.2780936 0.9814002 -0.3187692 0.2780936 0.9814002 -0.3298799 0.2780936 0.9814002 -0.3439364 0.2780936 0.9814002 -0.3617196 0.2780936 0.9814002 -0.3842178 0.2780936 0.9814002 -0.4126808 0.2780936 0.9814002 -0.4486903 0.2780936 0.9814002 -0.494247 0.2780936 0.9814002 -0.5518821 0.2780936 0.9814002 -0.6247981 0.2780936 0.9814002 -0.7170462 0.2780936 0.9814002 -0.8337521 0.2780936 0.9814002 -0.9814002 0.2780936 0.9814002 -0.9858036 0.3451791 0.8513639 -0.9890755 0.4142311 0.7731488 -0.9915418 0.4832747 0.7340599 -0.9934209 0.5503825 0.7231402 -0.9948643 0.6138613 0.7312773 -0.9959801 0.6723959 0.7512096 -0.9968468 0.7251226 0.7774307 -0.9975226 0.7716288 0.8059988 -0.998051 0.8118949 0.8342818 -0.9984652 0.8462034 0.8606762 -0.9987904 0.8750386 0.884336 -0.9990461 0.8989969 0.9049381 -0.9992474 0.9187137 0.9224937 -0.9994059 0.9348128 0.9372092 -0.999531 0.9478738 0.9493887 -0.9996296 0.958415 0.9593703 -0.9997074 0.9668867 0.967488 -0.9997689 0.9736722 0.9740501 -0.9998174 0.9790925 0.9793297 -0.9998557 0.9834128 0.9835615 -0.999886 0.9868504 0.9869436 -0.9999099 0.9895819 0.9896403 -0.9999288 0.9917501 0.9917866 -0.9999437 0.9934695 0.9934923 -0.2783684 0.2795441 0.9814251 -0.2783325 0.2794079 0.9814221 -0.2782884 0.2792368 0.9814183 -0.2782347 0.2790223 0.9814136 -0.2781701 0.2787542 0.9814076 -0.2780936 0.27842 0.9814002 -0.2780055 0.2780055 0.9813911 -0.2784186 0.2780055 0.9813911 -0.2789413 0.2780055 0.9813911 -0.2796026 0.2780055 0.9813911 -0.2804391 0.2780055 0.9813911 -0.2814975 0.2780055 0.9813911 -0.2828365 0.2780055 0.9813911 -0.2845305 0.2780055 0.9813911 -0.2866736 0.2780055 0.9813911 -0.2893849 0.2780055 0.9813911 -0.2928151 0.2780055 0.9813911 -0.2971547 0.2780055 0.9813911 -0.3026449 0.2780055 0.9813911 -0.3095906 0.2780055 0.9813911 -0.318378 0.2780055 0.9813911 -0.3294951 0.2780055 0.9813911 -0.3435596 0.2780055 0.9813911 -0.3613531 0.2780055 0.9813911 -0.3838642 0.2780055 0.9813911 -0.4123437 0.2780055 0.9813911 -0.448374 0.2780055 0.9813911 -0.4939569 0.2780055 0.9813911 -0.5516253 0.2780055 0.9813911 -0.6245833 0.2780055 0.9813911 -0.7168846 0.2780055 0.9813911 -0.8336578 0.2780055 0.9813911 -0.9813911 0.2780055 0.9813911 -0.9857982 0.3451032 0.8512944 -0.9890723 0.4141683 0.7730606 -0.9915399 0.4832246 0.7339746 -0.9934197 0.5503438 0.7230672 -0.9948636 0.6138323 0.7312193 -0.9959797 0.6723748 0.7511659 -0.9968465 0.7251076 0.7773989 -0.9975224 0.7716184 0.8059764 -0.9980509 0.8118878 0.8342664 -0.9984651 0.8461986 0.8606658 -0.9987903 0.8750355 0.8843291 -0.9990461 0.8989948 0.9049336 -0.9992473 0.9187123 0.9224907 -0.9994059 0.9348119 0.9372073 -0.999531 0.9478733 0.9493874 -0.9996296 0.9584146 0.9593695 -0.9997074 0.9668865 0.9674875 -0.9997689 0.9736721 0.9740498 -0.9998174 0.9790924 0.9793295 -0.9998557 0.9834127 0.9835614 -0.999886 0.9868504 0.9869436 -0.9999099 0.9895819 0.9896403 -0.9999288 0.99175 0.9917866 -0.9999437 0.9934695 0.9934923 -0.2783684 0.2799564 0.9814251 -0.2783325 0.2798202 0.9814221 -0.2782884 0.2796492 0.9814183 -0.2782347 0.2794349 0.9814136 -0.2781701 0.2791669 0.9814076 -0.2780936 0.2788329 0.9814002 -0.2780055 0.2784186 0.9813911 -0.2779077 0.2779077 0.9813797 -0.2784307 0.2779077 0.9813797 -0.2790924 0.2779077 0.9813797 -0.2799296 0.2779077 0.9813797 -0.2809887 0.2779077 0.9813797 -0.2823287 0.2779077 0.9813797 -0.2840238 0.2779077 0.9813797 -0.2861685 0.2779077 0.9813797 -0.2888817 0.2779077 0.9813797 -0.2923143 0.2779077 0.9813797 -0.296657 0.2779077 0.9813797 -0.3021511 0.2779077 0.9813797 -0.3091018 0.2779077 0.9813797 -0.3178954 0.2779077 0.9813797 -0.3290204 0.2779077 0.9813797 -0.3430949 0.2779077 0.9813797 -0.3609011 0.2779077 0.9813797 -0.3834282 0.2779077 0.9813797 -0.4119279 0.2779077 0.9813797 -0.4479838 0.2779077 0.9813797 -0.4935991 0.2779077 0.9813797 -0.5513085 0.2779077 0.9813797 -0.6243183 0.2779077 0.9813797 -0.7166853 0.2779077 0.9813797 -0.8335415 0.2779077 0.9813797 -0.9813797 0.2779077 0.9813797 -0.9857916 0.3450175 0.8512087 -0.9890684 0.4140964 0.7729519 -0.9915376 0.4831666 0.7338694 -0.9934183 0.5502987 0.7229773 -0.9948628 0.6137984 0.7311479 -0.9959791 0.67235 0.751112 -0.9968462 0.7250899 0.7773598 -0.9975222 0.7716061 0.8059488 -0.9980508 0.8118794 0.8342474 -0.998465 0.8461929 0.8606529 -0.9987903 0.8750317 0.8843206 -0.999046 0.8989923 0.904928 -0.9992473 0.9187107 0.9224871 -0.9994059 0.9348109 0.9372049 -0.999531 0.9478726 0.9493859 -0.9996296 0.9584142 0.9593686 -0.9997074 0.9668862 0.9674869 -0.9997689 0.9736719 0.9740494 -0.9998174 0.9790923 0.9793293 -0.9998557 0.9834127 0.9835613 -0.999886 0.9868503 0.9869435 -0.9999099 0.9895819 0.9896402 -0.9999288 0.99175 0.9917865 -0.9999437 0.9934694 0.9934923 -0.2783684 0.2804779 0.9814251 -0.2783325 0.2803419 0.9814221 -0.2782884 0.280171 0.9814183 -0.2782347 0.2799568 0.9814136 -0.2781701 0.279689 0.9814076 -0.2780936 0.2793553 0.9814002 -0.2780055 0.2789413 0.9813911 -0.2779077 0.2784307 0.9813797 -0.2778058 0.2778058 0.9813659 -0.2784681 0.2778058 0.9813659 -0.279306 0.2778058 0.9813659 -0.2803661 0.2778058 0.9813659 -0.2817072 0.2778058 0.9813659 -0.2834038 0.2778058 0.9813659 -0.2855503 0.2778058 0.9813659 -0.2882659 0.2778058 0.9813659 -0.2917015 0.2778058 0.9813659 -0.296048 0.2778058 0.9813659 -0.3015469 0.2778058 0.9813659 -0.3085036 0.2778058 0.9813659 -0.3173048 0.2778058 0.9813659 -0.3284395 0.2778058 0.9813659 -0.3425263 0.2778058 0.9813659 -0.3603479 0.2778058 0.9813659 -0.3828946 0.2778058 0.9813659 -0.4114191 0.2778058 0.9813659 -0.4475063 0.2778058 0.9813659 -0.4931613 0.2778058 0.9813659 -0.5509208 0.2778058 0.9813659 -0.6239941 0.2778058 0.9813659 -0.7164413 0.2778058 0.9813659 -0.8333991 0.2778058 0.9813659 -0.9813659 0.2778058 0.9813659 -0.9857835 0.3449254 0.8511039 -0.9890637 0.4140176 0.772819 -0.9915347 0.4831021 0.7337408 -0.9934166 0.550248 0.7228673 -0.9948617 0.6137599 0.7310605 -0.9959785 0.6723217 0.7510461 -0.9968458 0.7250697 0.7773119 -0.997522 0.7715919 0.8059151 -0.9980506 0.8118697 0.8342242 -0.9984649 0.8461864 0.8606373 -0.9987902 0.8750274 0.8843102 -0.999046 0.8989895 0.9049211 -0.9992473 0.9187089 0.9224827 -0.9994059 0.9348097 0.9372021 -0.999531 0.9478718 0.9493841 -0.9996296 0.9584137 0.9593674 -0.9997074 0.9668859 0.9674862 -0.9997689 0.9736717 0.974049 -0.9998174 0.9790921 0.979329 -0.9998557 0.9834126 0.9835611 -0.999886 0.9868503 0.9869433 -0.9999099 0.9895819 0.9896401 -0.9999288 0.99175 0.9917865 -0.9999437 0.9934694 0.9934923 -0.2783684 0.2811378 0.9814251 -0.2783325 0.2810019 0.9814221 -0.2782884 0.2808311 0.9814183 -0.2782347 0.2806171 0.9814136 -0.2781701 0.2803496 0.9814076 -0.2780936 0.2800162 0.9814002 -0.2780055 0.2796026 0.9813911 -0.2779077 0.2790924 0.9813797 -0.2778058 0.2784681 0.9813659 -0.2777122 0.2777122 0.9813491 -0.278551 0.2777122 0.9813491 -0.2796122 0.2777122 0.9813491 -0.2809547 0.2777122 0.9813491 -0.2826531 0.2777122 0.9813491 -0.2848019 0.2777122 0.9813491 -0.2875203 0.2777122 0.9813491 -0.2909596 0.2777122 0.9813491 -0.2953106 0.2777122 0.9813491 -0.3008152 0.2777122 0.9813491 -0.3077793 0.2777122 0.9813491 -0.3165898 0.2777122 0.9813491 -0.3277361 0.2777122 0.9813491 -0.3418377 0.2777122 0.9813491 -0.3596781 0.2777122 0.9813491 -0.3822485 0.2777122 0.9813491 -0.410803 0.2777122 0.9813491 -0.4469282 0.2777122 0.9813491 -0.4926312 0.2777122 0.9813491 -0.5504514 0.2777122 0.9813491 -0.6236015 0.2777122 0.9813491 -0.716146 0.2777122 0.9813491 -0.8332267 0.2777122 0.9813491 -0.9813491 0.2777122 0.9813491 -0.9857738 0.3448353 0.850977 -0.9890579 0.4139373 0.772658 -0.9915312 0.4830346 0.7335852 -0.9934145 0.5501939 0.7227342 -0.9948604 0.6137183 0.7309548 -0.9959777 0.6722907 0.7509664 -0.9968453 0.7250473 0.7772541 -0.9975217 0.7715762 0.8058743 -0.9980504 0.8118589 0.8341961 -0.9984648 0.8461791 0.8606183 -0.9987902 0.8750225 0.8842976 -0.9990459 0.8989863 0.9049128 -0.9992473 0.9187068 0.9224773 -0.9994059 0.9348083 0.9371986 -0.9995309 0.947871 0.9493819 -0.9996296 0.9584132 0.959366 -0.9997074 0.9668855 0.9674853 -0.9997689 0.9736715 0.9740484 -0.9998174 0.979092 0.9793286 -0.9998557 0.9834125 0.9835609 -0.999886 0.9868502 0.9869432 -0.9999099 0.9895818 0.9896401 -0.9999288 0.99175 0.9917864 -0.9999437 0.9934694 0.9934922 -0.2783684 0.2819726 0.9814251 -0.2783325 0.2818368 0.9814221 -0.2782884 0.2816663 0.9814183 -0.2782347 0.2814525 0.9814136 -0.2781701 0.2811853 0.9814076 -0.2780936 0.2808523 0.9814002 -0.2780055 0.2804391 0.9813911 -0.2779077 0.2799296 0.9813797 -0.2778058 0.279306 0.9813659 -0.2777122 0.278551 0.9813491 -0.2776503 0.2776503 0.9813291 -0.2787128 0.2776503 0.9813291 -0.280057 0.2776503 0.9813291 -0.2817576 0.2776503 0.9813291 -0.283909 0.2776503 0.9813291 -0.2866309 0.2776503 0.9813291 -0.2900744 0.2776503 0.9813291 -0.2944309 0.2776503 0.9813291 -0.2999424 0.2776503 0.9813291 -0.3069152 0.2776503 0.9813291 -0.3157367 0.2776503 0.9813291 -0.3268971 0.2776503 0.9813291 -0.3410164 0.2776503 0.9813291 -0.3588791 0.2776503 0.9813291 -0.3814778 0.2776503 0.9813291 -0.410068 0.2776503 0.9813291 -0.4462385 0.2776503 0.9813291 -0.4919987 0.2776503 0.9813291 -0.5498914 0.2776503 0.9813291 -0.6231332 0.2776503 0.9813291 -0.7157936 0.2776503 0.9813291 -0.8330211 0.2776503 0.9813291 -0.9813291 0.2776503 0.9813291 -0.9857621 0.3447636 0.8508257 -0.989051 0.4138668 0.7724662 -0.9915271 0.4829718 0.7333996 -0.993412 0.5501416 0.7225756 -0.9948589 0.6136769 0.7308289 -0.9959768 0.6722594 0.7508714 -0.9968448 0.7250244 0.7771851 -0.9975213 0.7715599 0.8058257 -0.9980502 0.8118476 0.8341627 -0.9984647 0.8461714 0.8605957 -0.9987901 0.8750173 0.8842826 -0.9990459 0.8989829 0.904903 -0.9992472 0.9187045 0.9224709 -0.9994059 0.9348069 0.9371945 -0.9995309 0.94787 0.9493792 -0.9996296 0.9584126 0.9593643 -0.9997074 0.9668852 0.9674842 -0.9997689 0.9736712 0.9740477 -0.9998174 0.9790919 0.9793282 -0.9998557 0.9834124 0.9835606 -0.999886 0.9868502 0.986943 -0.9999099 0.9895818 0.9896399 -0.9999288 0.99175 0.9917864 -0.9999437 0.9934694 0.9934922 -0.2783684 0.2830287 0.9814251 -0.2783325 0.2828931 0.9814221 -0.2782884 0.2827228 0.9814183 -0.2782347 0.2825094 0.9814136 -0.2781701 0.2822426 0.9814076 -0.2780936 0.28191 0.9814002 -0.2780055 0.2814975 0.9813911 -0.2779077 0.2809887 0.9813797 -0.2778058 0.2803661 0.9813659 -0.2777122 0.2796122 0.9813491 -0.2776503 0.2787128 0.9813291 -0.2776626 0.2776626 0.9813057 -0.2790088 0.2776626 0.9813057 -0.2807118 0.2776626 0.9813057 -0.2828664 0.2776626 0.9813057 -0.2855923 0.2776626 0.9813057 -0.2890408 0.2776626 0.9813057 -0.2934037 0.2776626 0.9813057 -0.2989233 0.2776626 0.9813057 -0.3059062 0.2776626 0.9813057 -0.3147406 0.2776626 0.9813057 -0.3259173 0.2776626 0.9813057 -0.3400572 0.2776626 0.9813057 -0.357946 0.2776626 0.9813057 -0.3805778 0.2776626 0.9813057 -0.4092098 0.2776626 0.9813057 -0.4454331 0.2776626 0.9813057 -0.4912602 0.2776626 0.9813057 -0.5492375 0.2776626 0.9813057 -0.6225864 0.2776626 0.9813057 -0.7153822 0.2776626 0.9813057 -0.832781 0.2776626 0.9813057 -0.9813057 0.2776626 0.9813057 -0.9857485 0.3447407 0.8506491 -0.989043 0.4138277 0.7722424 -0.9915223 0.4829286 0.7331832 -0.9934091 0.5501012 0.7223906 -0.9948571 0.6136427 0.7306821 -0.9959757 0.6722322 0.7507607 -0.9968441 0.7250039 0.7771048 -0.9975209 0.7715449 0.8057691 -0.99805 0.811837 0.8341237 -0.9984645 0.8461641 0.8605694 -0.99879 0.8750124 0.8842651 -0.9990458 0.8989796 0.9048915 -0.9992472 0.9187024 0.9224634 -0.9994059 0.9348055 0.9371897 -0.9995309 0.9478691 0.9493761 -0.9996296 0.958412 0.9593623 -0.9997074 0.9668848 0.9674829 -0.9997689 0.973671 0.9740469 -0.9998174 0.9790917 0.9793277 -0.9998557 0.9834123 0.9835603 -0.999886 0.9868501 0.9869428 -0.9999099 0.9895818 0.9896398 -0.9999288 0.9917499 0.9917863 -0.9999437 0.9934694 0.9934921 -0.2783684 0.2843648 0.9814251 -0.2783325 0.2842295 0.9814221 -0.2782884 0.2840595 0.9814183 -0.2782347 0.2838465 0.9814136 -0.2781701 0.2835801 0.9814076 -0.2780936 0.2832482 0.9814002 -0.2780055 0.2828365 0.9813911 -0.2779077 0.2823287 0.9813797 -0.2778058 0.2817072 0.9813659 -0.2777122 0.2809547 0.9813491 -0.2776503 0.280057 0.9813291 -0.2776626 0.2790088 0.9813057 -0.2778236 0.2778236 0.9812792 -0.2795295 0.2778236 0.9812792 -0.2816876 0.2778236 0.9812792 -0.284418 0.2778236 0.9812792 -0.2878722 0.2778236 0.9812792 -0.2922423 0.2778236 0.9812792 -0.297771 0.2778236 0.9812792 -0.3047655 0.2778236 0.9812792 -0.3136144 0.2778236 0.9812792 -0.3248095 0.2778236 0.9812792 -0.3389728 0.2778236 0.9812792 -0.3568911 0.2778236 0.9812792 -0.3795602 0.2778236 0.9812792 -0.4082395 0.2778236 0.9812792 -0.4445225 0.2778236 0.9812792 -0.4904253 0.2778236 0.9812792 -0.5484982 0.2778236 0.9812792 -0.6219681 0.2778236 0.9812792 -0.714917 0.2778236 0.9812792 -0.8325095 0.2778236 0.9812792 -0.9812792 0.2778236 0.9812792 -0.9857332 0.3448204 0.8504495 -0.9890339 0.4138582 0.7719895 -0.9915169 0.4829319 0.7329388 -0.9934058 0.5500915 0.7221817 -0.9948551 0.6136284 0.7305163 -0.9959745 0.672218 0.7506357 -0.9968433 0.7249916 0.7770141 -0.9975204 0.7715352 0.8057052 -0.9980497 0.8118298 0.8340798 -0.9984643 0.8461589 0.8605398 -0.9987899 0.8750088 0.8842454 -0.9990458 0.8989771 0.9048786 -0.9992472 0.9187008 0.922455 -0.9994058 0.9348044 0.9371842 -0.9995309 0.9478684 0.9493727 -0.9996296 0.9584115 0.9593601 -0.9997074 0.9668845 0.9674815 -0.9997689 0.9736708 0.974046 -0.9998174 0.9790916 0.9793271 -0.9998557 0.9834122 0.9835599 -0.999886 0.9868501 0.9869426 -0.9999099 0.9895817 0.9896397 -0.9999288 0.9917499 0.9917862 -0.9999437 0.9934694 0.9934921 -0.2783684 0.2860552 0.9814251 -0.2783325 0.2859202 0.9814221 -0.2782884 0.2857506 0.9814183 -0.2782347 0.2855381 0.9814136 -0.2781701 0.2852724 0.9814076 -0.2780936 0.2849413 0.9814002 -0.2780055 0.2845305 0.9813911 -0.2779077 0.2840238 0.9813797 -0.2778058 0.2834038 0.9813659 -0.2777122 0.2826531 0.9813491 -0.2776503 0.2817576 0.9813291 -0.2776626 0.2807118 0.9813057 -0.2778236 0.2795295 0.9812792 -0.2782606 0.2782606 0.9812508 -0.2804226 0.2782606 0.9812508 -0.2831577 0.2782606 0.9812508 -0.2866181 0.2782606 0.9812508 -0.2909959 0.2782606 0.9812508 -0.2965343 0.2782606 0.9812508 -0.3035412 0.2782606 0.9812508 -0.3124058 0.2782606 0.9812508 -0.3236207 0.2782606 0.9812508 -0.337809 0.2782606 0.9812508 -0.355759 0.2782606 0.9812508 -0.3784681 0.2782606 0.9812508 -0.4071981 0.2782606 0.9812508 -0.4435453 0.2782606 0.9812508 -0.4895292 0.2782606 0.9812508 -0.5477048 0.2782606 0.9812508 -0.6213045 0.2782606 0.9812508 -0.7144178 0.2782606 0.9812508 -0.8322181 0.2782606 0.9812508 -0.9812508 0.2782606 0.9812508 -0.9857167 0.3450957 0.8502355 -0.9890241 0.4140252 0.7717183 -0.991511 0.4830292 0.7326769 -0.9934023 0.5501456 0.7219579 -0.994853 0.6136569 0.7303387 -0.9959732 0.672232 0.7505018 -0.9968425 0.7249978 0.7769169 -0.9975199 0.7715376 0.8056368 -0.9980494 0.8118303 0.8340327 -0.9984642 0.8461587 0.860508 -0.9987897 0.8750084 0.8842242 -0.9990457 0.8989767 0.9048647 -0.9992471 0.9187004 0.922446 -0.9994058 0.9348042 0.9371784 -0.9995309 0.9478683 0.9493689 -0.9996295 0.9584114 0.9593577 -0.9997074 0.9668844 0.96748 -0.9997689 0.9736708 0.9740451 -0.9998174 0.9790916 0.9793265 -0.9998557 0.9834122 0.9835595 -0.999886 0.98685 0.9869424 -0.9999099 0.9895817 0.9896395 -0.9999288 0.9917499 0.9917861 -0.9999437 0.9934694 0.993492 -0.2783684 0.2881937 0.9814251 -0.2783325 0.2880591 0.9814221 -0.2782884 0.2878901 0.9814183 -0.2782347 0.2876782 0.9814136 -0.2781701 0.2874132 0.9814076 -0.2780936 0.2870831 0.9814002 -0.2780055 0.2866736 0.9813911 -0.2779077 0.2861685 0.9813797 -0.2778058 0.2855503 0.9813659 -0.2777122 0.2848019 0.9813491 -0.2776503 0.283909 0.9813291 -0.2776626 0.2828664 0.9813057 -0.2778236 0.2816876 0.9812792 -0.2782606 0.2804226 0.9812508 -0.2791873 0.2791873 0.9812231 -0.2819272 0.2791873 0.9812231 -0.2853935 0.2791873 0.9812231 -0.2897788 0.2791873 0.9812231 -0.2953268 0.2791873 0.9812231 -0.3023458 0.2791873 0.9812231 -0.3112256 0.2791873 0.9812231 -0.3224598 0.2791873 0.9812231 -0.3366726 0.2791873 0.9812231 -0.3546535 0.2791873 0.9812231 -0.3774018 0.2791873 0.9812231 -0.4061813 0.2791873 0.9812231 -0.4425911 0.2791873 0.9812231 -0.4886542 0.2791873 0.9812231 -0.5469301 0.2791873 0.9812231 -0.6206566 0.2791873 0.9812231 -0.7139303 0.2791873 0.9812231 -0.8319336 0.2791873 0.9812231 -0.9812231 0.2791873 0.9812231 -0.9857006 0.3457234 0.8500265 -0.9890146 0.4144423 0.7714538 -0.9915054 0.4833013 0.7324214 -0.9933988 0.5503203 0.7217397 -0.9948509 0.6137675 0.7301657 -0.9959719 0.6723012 0.7503714 -0.9968418 0.7250408 0.7768223 -0.9975194 0.7715641 0.8055701 -0.9980491 0.8118466 0.8339868 -0.998464 0.8461687 0.860477 -0.9987896 0.8750145 0.8842037 -0.9990456 0.8989805 0.9048512 -0.9992471 0.9187027 0.9224372 -0.9994058 0.9348056 0.9371728 -0.9995309 0.9478691 0.9493653 -0.9996295 0.958412 0.9593554 -0.9997074 0.9668847 0.9674786 -0.9997688 0.973671 0.9740442 -0.9998174 0.9790917 0.9793259 -0.9998557 0.9834123 0.9835592 -0.999886 0.9868501 0.9869421 -0.9999099 0.9895817 0.9896394 -0.9999288 0.9917499 0.991786 -0.9999437 0.9934694 0.993492 -0.2783684 0.2908992 0.9814251 -0.2783325 0.2907651 0.9814221 -0.2782884 0.2905967 0.9814183 -0.2782347 0.2903857 0.9814136 -0.2781701 0.2901217 0.9814076 -0.2780936 0.2897929 0.9814002 -0.2780055 0.2893849 0.9813911 -0.2779077 0.2888817 0.9813797 -0.2778058 0.2882659 0.9813659 -0.2777122 0.2875203 0.9813491 -0.2776503 0.2866309 0.9813291 -0.2776626 0.2855923 0.9813057 -0.2778236 0.284418 0.9812792 -0.2782606 0.2831577 0.9812508 -0.2791873 0.2819272 0.9812231 -0.2809573 0.2809573 0.9812013 -0.2844283 0.2809573 0.9812013 -0.2888196 0.2809573 0.9812013 -0.2943751 0.2809573 0.9812013 -0.3014036 0.2809573 0.9812013 -0.3102955 0.2809573 0.9812013 -0.321545 0.2809573 0.9812013 -0.335777 0.2809573 0.9812013 -0.3537823 0.2809573 0.9812013 -0.3765614 0.2809573 0.9812013 -0.4053799 0.2809573 0.9812013 -0.441839 0.2809573 0.9812013 -0.4879646 0.2809573 0.9812013 -0.5463195 0.2809573 0.9812013 -0.620146 0.2809573 0.9812013 -0.7135461 0.2809573 0.9812013 -0.8317093 0.2809573 0.9812013 -0.9812013 0.2809573 0.9812013 -0.9856879 0.3469645 0.8498619 -0.9890072 0.4152991 0.7712455 -0.9915009 0.4838841 0.7322203 -0.9933961 0.5507113 0.721568 -0.9948493 0.6140266 0.7300295 -0.9959709 0.6724711 0.7502687 -0.9968411 0.7251511 0.7767478 -0.9975191 0.7716352 0.8055177 -0.9980488 0.8118921 0.8339508 -0.9984638 0.8461977 0.8604527 -0.9987895 0.8750329 0.8841875 -0.9990456 0.8989921 0.9048406 -0.999247 0.9187101 0.9224303 -0.9994057 0.9348102 0.9371683 -0.9995309 0.947872 0.9493625 -0.9996295 0.9584138 0.9593536 -0.9997074 0.9668859 0.9674774 -0.9997688 0.9736717 0.9740434 -0.9998174 0.9790921 0.9793255 -0.9998557 0.9834126 0.9835589 -0.999886 0.9868503 0.986942 -0.9999099 0.9895819 0.9896393 -0.9999288 0.99175 0.9917859 -0.9999437 0.9934694 0.9934919 -0.2783684 0.294322 0.9814251 -0.2783325 0.2941886 0.9814221 -0.2782884 0.294021 0.9814183 -0.2782347 0.293811 0.9814136 -0.2781701 0.2935483 0.9814076 -0.2780936 0.2932211 0.9814002 -0.2780055 0.2928151 0.9813911 -0.2779077 0.2923143 0.9813797 -0.2778058 0.2917015 0.9813659 -0.2777122 0.2909596 0.9813491 -0.2776503 0.2900744 0.9813291 -0.2776626 0.2890408 0.9813057 -0.2778236 0.2878722 0.9812792 -0.2782606 0.2866181 0.9812508 -0.2791873 0.2853935 0.9812231 -0.2809573 0.2844283 0.9812013 -0.2841192 0.2841192 0.9811943 -0.2885124 0.2841192 0.9811943 -0.2940703 0.2841192 0.9811943 -0.3011018 0.2841192 0.9811943 -0.3099976 0.2841192 0.9811943 -0.3212519 0.2841192 0.9811943 -0.3354901 0.2841192 0.9811943 -0.3535032 0.2841192 0.9811943 -0.3762922 0.2841192 0.9811943 -0.4051232 0.2841192 0.9811943 -0.4415982 0.2841192 0.9811943 -0.4877437 0.2841192 0.9811943 -0.5461239 0.2841192 0.9811943 -0.6199824 0.2841192 0.9811943 -0.713423 0.2841192 0.9811943 -0.8316375 0.2841192 0.9811943 -0.9811943 0.2841192 0.9811943 -0.9856839 0.3492254 0.8498092 -0.9890048 0.4168922 0.7711789 -0.9914995 0.4849907 0.7321559 -0.9933953 0.5514695 0.721513 -0.9948487 0.6145393 0.7299859 -0.9959706 0.6728136 0.7502359 -0.9968409 0.7253775 0.776724 -0.9975189 0.7717834 0.8055009 -0.9980488 0.8119884 0.8339392 -0.9984638 0.8462598 0.8604449 -0.9987895 0.8750727 0.8841823 -0.9990455 0.8990175 0.9048372 -0.999247 0.9187262 0.9224281 -0.9994057 0.9348204 0.9371669 -0.9995308 0.9478785 0.9493615 -0.9996295 0.9584178 0.959353 -0.9997074 0.9668884 0.967477 -0.9997688 0.9736733 0.9740432 -0.9998174 0.9790931 0.9793253 -0.9998557 0.9834132 0.9835588 -0.999886 0.9868507 0.9869419 -0.9999099 0.9895821 0.9896392 -0.9999288 0.9917502 0.9917859 -0.9999437 0.9934695 0.9934919 -0.2783684 0.2986524 0.9814251 -0.2783325 0.2985198 0.9814221 -0.2782884 0.2983532 0.9814183 -0.2782347 0.2981445 0.9814136 -0.2781701 0.2978834 0.9814076 -0.2780936 0.2975582 0.9814002 -0.2780055 0.2971547 0.9813911 -0.2779077 0.296657 0.9813797 -0.2778058 0.296048 0.9813659 -0.2777122 0.2953106 0.9813491 -0.2776503 0.2944309 0.9813291 -0.2776626 0.2934037 0.9813057 -0.2778236 0.2922423 0.9812792 -0.2782606 0.2909959 0.9812508 -0.2791873 0.2897788 0.9812231 -0.2809573 0.2888196 0.9812013 -0.2841192 0.2885124 0.9811943 -0.2885124 0.2885124 0.9811943 -0.2940703 0.2885124 0.9811943 -0.3011018 0.2885124 0.9811943 -0.3099976 0.2885124 0.9811943 -0.3212519 0.2885124 0.9811943 -0.3354901 0.2885124 0.9811943 -0.3535032 0.2885124 0.9811943 -0.3762922 0.2885124 0.9811943 -0.4051232 0.2885124 0.9811943 -0.4415982 0.2885124 0.9811943 -0.4877437 0.2885124 0.9811943 -0.5461239 0.2885124 0.9811943 -0.6199824 0.2885124 0.9811943 -0.713423 0.2885124 0.9811943 -0.8316375 0.2885124 0.9811943 -0.9811943 0.2885124 0.9811943 -0.9856839 0.3523802 0.8498092 -0.9890048 0.419125 0.7711789 -0.9914995 0.4865484 0.7321559 -0.9933953 0.5525411 0.721513 -0.9948487 0.6152669 0.7299859 -0.9959706 0.6733015 0.7502359 -0.9968409 0.7257011 0.776724 -0.9975189 0.7719959 0.8055009 -0.9980488 0.8121268 0.8339392 -0.9984638 0.8463492 0.8604449 -0.9987895 0.8751301 0.8841823 -0.9990455 0.8990542 0.9048372 -0.999247 0.9187495 0.9224281 -0.9994057 0.9348352 0.9371669 -0.9995308 0.9478878 0.9493615 -0.9996295 0.9584237 0.959353 -0.9997074 0.9668922 0.967477 -0.9997688 0.9736756 0.9740432 -0.9998174 0.9790946 0.9793253 -0.9998557 0.9834141 0.9835588 -0.999886 0.9868512 0.9869419 -0.9999099 0.9895825 0.9896392 -0.9999288 0.9917504 0.9917859 -0.9999437 0.9934697 0.9934919 -0.2783684 0.3041308 0.9814251 -0.2783325 0.3039992 0.9814221 -0.2782884 0.303834 0.9814183 -0.2782347 0.3036269 0.9814136 -0.2781701 0.3033679 0.9814076 -0.2780936 0.3030452 0.9814002 -0.2780055 0.3026449 0.9813911 -0.2779077 0.3021511 0.9813797 -0.2778058 0.3015469 0.9813659 -0.2777122 0.3008152 0.9813491 -0.2776503 0.2999424 0.9813291 -0.2776626 0.2989233 0.9813057 -0.2778236 0.297771 0.9812792 -0.2782606 0.2965343 0.9812508 -0.2791873 0.2953268 0.9812231 -0.2809573 0.2943751 0.9812013 -0.2841192 0.2940703 0.9811943 -0.2885124 0.2940703 0.9811943 -0.2940703 0.2940703 0.9811943 -0.3011018 0.2940703 0.9811943 -0.3099976 0.2940703 0.9811943 -0.3212519 0.2940703 0.9811943 -0.3354901 0.2940703 0.9811943 -0.3535032 0.2940703 0.9811943 -0.3762922 0.2940703 0.9811943 -0.4051232 0.2940703 0.9811943 -0.4415982 0.2940703 0.9811943 -0.4877437 0.2940703 0.9811943 -0.5461239 0.2940703 0.9811943 -0.6199824 0.2940703 0.9811943 -0.713423 0.2940703 0.9811943 -0.8316375 0.2940703 0.9811943 -0.9811943 0.2940703 0.9811943 -0.9856839 0.3563715 0.8498092 -0.9890048 0.4219498 0.7711789 -0.9914995 0.4885191 0.7321559 -0.9933953 0.5538969 0.721513 -0.9948487 0.6161874 0.7299859 -0.9959706 0.6739188 0.7502359 -0.9968409 0.7261105 0.776724 -0.9975189 0.7722648 0.8055009 -0.9980488 0.8123018 0.8339392 -0.9984638 0.8464623 0.8604449 -0.9987895 0.8752028 0.8841823 -0.9990455 0.8991006 0.9048372 -0.999247 0.9187791 0.9224281 -0.9994057 0.9348539 0.9371669 -0.9995308 0.9478997 0.9493615 -0.9996295 0.9584312 0.959353 -0.9997074 0.9668969 0.967477 -0.9997688 0.9736786 0.9740432 -0.9998174 0.9790965 0.9793253 -0.9998557 0.9834153 0.9835588 -0.999886 0.986852 0.9869419 -0.9999099 0.9895829 0.9896392 -0.9999288 0.9917507 0.9917859 -0.9999437 0.9934698 0.9934919 -0.2783684 0.3110617 0.9814251 -0.2783325 0.3109315 0.9814221 -0.2782884 0.3107679 0.9814183 -0.2782347 0.3105628 0.9814136 -0.2781701 0.3103064 0.9814076 -0.2780936 0.309987 0.9814002 -0.2780055 0.3095906 0.9813911 -0.2779077 0.3091018 0.9813797 -0.2778058 0.3085036 0.9813659 -0.2777122 0.3077793 0.9813491 -0.2776503 0.3069152 0.9813291 -0.2776626 0.3059062 0.9813057 -0.2778236 0.3047655 0.9812792 -0.2782606 0.3035412 0.9812508 -0.2791873 0.3023458 0.9812231 -0.2809573 0.3014036 0.9812013 -0.2841192 0.3011018 0.9811943 -0.2885124 0.3011018 0.9811943 -0.2940703 0.3011018 0.9811943 -0.3011018 0.3011018 0.9811943 -0.3099976 0.3011018 0.9811943 -0.3212519 0.3011018 0.9811943 -0.3354901 0.3011018 0.9811943 -0.3535032 0.3011018 0.9811943 -0.3762922 0.3011018 0.9811943 -0.4051232 0.3011018 0.9811943 -0.4415982 0.3011018 0.9811943 -0.4877437 0.3011018 0.9811943 -0.5461239 0.3011018 0.9811943 -0.6199824 0.3011018 0.9811943 -0.713423 0.3011018 0.9811943 -0.8316375 0.3011018 0.9811943 -0.9811943 0.3011018 0.9811943 -0.9856839 0.3614209 0.8498092 -0.9890048 0.4255236 0.7711789 -0.9914995 0.4910123 0.7321559 -0.9933953 0.5556122 0.721513 -0.9948487 0.6173519 0.7299859 -0.9959706 0.6746998 0.7502359 -0.9968409 0.7266285 0.776724 -0.9975189 0.7726049 0.8055009 -0.9980488 0.8125232 0.8339392 -0.9984638 0.8466054 0.8604449 -0.9987895 0.8752947 0.8841823 -0.9990455 0.8991593 0.9048372 -0.999247 0.9188164 0.9224281 -0.9994057 0.9348776 0.9371669 -0.9995308 0.9479146 0.9493615 -0.9996295 0.9584406 0.959353 -0.9997074 0.9669028 0.967477 -0.9997688 0.9736823 0.9740432 -0.9998174 0.9790988 0.9793253 -0.9998557 0.9834167 0.9835588 -0.999886 0.9868529 0.9869419 -0.9999099 0.9895835 0.9896392 -0.9999288 0.991751 0.9917859 -0.9999437 0.9934701 0.9934919 -0.2783684 0.3198302 0.9814251 -0.2783325 0.3197017 0.9814221 -0.2782884 0.3195402 0.9814183 -0.2782347 0.3193377 0.9814136 -0.2781701 0.3190846 0.9814076 -0.2780936 0.3187692 0.9814002 -0.2780055 0.318378 0.9813911 -0.2779077 0.3178954 0.9813797 -0.2778058 0.3173048 0.9813659 -0.2777122 0.3165898 0.9813491 -0.2776503 0.3157367 0.9813291 -0.2776626 0.3147406 0.9813057 -0.2778236 0.3136144 0.9812792 -0.2782606 0.3124058 0.9812508 -0.2791873 0.3112256 0.9812231 -0.2809573 0.3102955 0.9812013 -0.2841192 0.3099976 0.9811943 -0.2885124 0.3099976 0.9811943 -0.2940703 0.3099976 0.9811943 -0.3011018 0.3099976 0.9811943 -0.3099976 0.3099976 0.9811943 -0.3212519 0.3099976 0.9811943 -0.3354901 0.3099976 0.9811943 -0.3535032 0.3099976 0.9811943 -0.3762922 0.3099976 0.9811943 -0.4051232 0.3099976 0.9811943 -0.4415982 0.3099976 0.9811943 -0.4877437 0.3099976 0.9811943 -0.5461239 0.3099976 0.9811943 -0.6199824 0.3099976 0.9811943 -0.713423 0.3099976 0.9811943 -0.8316375 0.3099976 0.9811943 -0.9811943 0.3099976 0.9811943 -0.9856839 0.3678092 0.8498092 -0.9890048 0.4300448 0.7711789 -0.9914995 0.4941665 0.7321559 -0.9933953 0.5577822 0.721513 -0.9948487 0.6188252 0.7299859 -0.9959706 0.6756878 0.7502359 -0.9968409 0.7272837 0.776724 -0.9975189 0.7730352 0.8055009 -0.9980488 0.8128033 0.8339392 -0.9984638 0.8467864 0.8604449 -0.9987895 0.8754109 0.8841823 -0.9990455 0.8992336 0.9048372 -0.999247 0.9188636 0.9224281 -0.9994057 0.9349075 0.9371669 -0.9995308 0.9479335 0.9493615 -0.9996295 0.9584526 0.959353 -0.9997074 0.9669103 0.967477 -0.9997688 0.973687 0.9740432 -0.9998174 0.9791018 0.9793253 -0.9998557 0.9834186 0.9835588 -0.999886 0.9868541 0.9869419 -0.9999099 0.9895842 0.9896392 -0.9999288 0.9917515 0.9917859 -0.9999437 0.9934704 0.9934919 -0.2783684 0.3309236 0.9814251 -0.2783325 0.3307971 0.9814221 -0.2782884 0.3306382 0.9814183 -0.2782347 0.3304391 0.9814136 -0.2781701 0.3301901 0.9814076 -0.2780936 0.3298799 0.9814002 -0.2780055 0.3294951 0.9813911 -0.2779077 0.3290204 0.9813797 -0.2778058 0.3284395 0.9813659 -0.2777122 0.3277361 0.9813491 -0.2776503 0.3268971 0.9813291 -0.2776626 0.3259173 0.9813057 -0.2778236 0.3248095 0.9812792 -0.2782606 0.3236207 0.9812508 -0.2791873 0.3224598 0.9812231 -0.2809573 0.321545 0.9812013 -0.2841192 0.3212519 0.9811943 -0.2885124 0.3212519 0.9811943 -0.2940703 0.3212519 0.9811943 -0.3011018 0.3212519 0.9811943 -0.3099976 0.3212519 0.9811943 -0.3212519 0.3212519 0.9811943 -0.3354901 0.3212519 0.9811943 -0.3535032 0.3212519 0.9811943 -0.3762922 0.3212519 0.9811943 -0.4051232 0.3212519 0.9811943 -0.4415982 0.3212519 0.9811943 -0.4877437 0.3212519 0.9811943 -0.5461239 0.3212519 0.9811943 -0.6199824 0.3212519 0.9811943 -0.713423 0.3212519 0.9811943 -0.8316375 0.3212519 0.9811943 -0.9811943 0.3212519 0.9811943 -0.9856839 0.3758911 0.8498092 -0.9890048 0.4357648 0.7711789 -0.9914995 0.498157 0.7321559 -0.9933953 0.5605276 0.721513 -0.9948487 0.6206891 0.7299859 -0.9959706 0.6769378 0.7502359 -0.9968409 0.7281127 0.776724 -0.9975189 0.7735795 0.8055009 -0.9980488 0.8131577 0.8339392 -0.9984638 0.8470154 0.8604449 -0.9987895 0.875558 0.8841823 -0.9990455 0.8993275 0.9048372 -0.999247 0.9189234 0.9224281 -0.9994057 0.9349454 0.9371669 -0.9995308 0.9479575 0.9493615 -0.9996295 0.9584677 0.959353 -0.9997074 0.9669198 0.967477 -0.9997688 0.973693 0.9740432 -0.9998174 0.9791055 0.9793253 -0.9998557 0.9834209 0.9835588 -0.999886 0.9868555 0.9869419 -0.9999099 0.9895851 0.9896392 -0.9999288 0.9917521 0.9917859 -0.9999437 0.9934707 0.9934919 -0.2783684 0.344958 0.9814251 -0.2783325 0.3448342 0.9814221 -0.2782884 0.3446787 0.9814183 -0.2782347 0.3444838 0.9814136 -0.2781701 0.3442401 0.9814076 -0.2780936 0.3439364 0.9814002 -0.2780055 0.3435596 0.9813911 -0.2779077 0.3430949 0.9813797 -0.2778058 0.3425263 0.9813659 -0.2777122 0.3418377 0.9813491 -0.2776503 0.3410164 0.9813291 -0.2776626 0.3400572 0.9813057 -0.2778236 0.3389728 0.9812792 -0.2782606 0.337809 0.9812508 -0.2791873 0.3366726 0.9812231 -0.2809573 0.335777 0.9812013 -0.2841192 0.3354901 0.9811943 -0.2885124 0.3354901 0.9811943 -0.2940703 0.3354901 0.9811943 -0.3011018 0.3354901 0.9811943 -0.3099976 0.3354901 0.9811943 -0.3212519 0.3354901 0.9811943 -0.3354901 0.3354901 0.9811943 -0.3535032 0.3354901 0.9811943 -0.3762922 0.3354901 0.9811943 -0.4051232 0.3354901 0.9811943 -0.4415982 0.3354901 0.9811943 -0.4877437 0.3354901 0.9811943 -0.5461239 0.3354901 0.9811943 -0.6199824 0.3354901 0.9811943 -0.713423 0.3354901 0.9811943 -0.8316375 0.3354901 0.9811943 -0.9811943 0.3354901 0.9811943 -0.9856839 0.3861159 0.8498092 -0.9890048 0.4430013 0.7711789 -0.9914995 0.5032055 0.7321559 -0.9933953 0.5640008 0.721513 -0.9948487 0.6230471 0.7299859 -0.9959706 0.6785192 0.7502359 -0.9968409 0.7291615 0.776724 -0.9975189 0.7742682 0.8055009 -0.9980488 0.8136061 0.8339392 -0.9984638 0.8473052 0.8604449 -0.9987895 0.8757441 0.8841823 -0.9990455 0.8994464 0.9048372 -0.999247 0.918999 0.9224281 -0.9994057 0.9349933 0.9371669 -0.9995308 0.9479878 0.9493615 -0.9996295 0.9584868 0.959353 -0.9997074 0.9669318 0.967477 -0.9997688 0.9737006 0.9740432 -0.9998174 0.9791103 0.9793253 -0.9998557 0.9834239 0.9835588 -0.999886 0.9868574 0.9869419 -0.9999099 0.9895863 0.9896392 -0.9999288 0.9917528 0.9917859 -0.9999437 0.9934712 0.9934919 -0.2783684 0.3627135 0.9814251 -0.2783325 0.3625931 0.9814221 -0.2782884 0.3624418 0.9814183 -0.2782347 0.3622521 0.9814136 -0.2781701 0.3620151 0.9814076 -0.2780936 0.3617196 0.9814002 -0.2780055 0.3613531 0.9813911 -0.2779077 0.3609011 0.9813797 -0.2778058 0.3603479 0.9813659 -0.2777122 0.3596781 0.9813491 -0.2776503 0.3588791 0.9813291 -0.2776626 0.357946 0.9813057 -0.2778236 0.3568911 0.9812792 -0.2782606 0.355759 0.9812508 -0.2791873 0.3546535 0.9812231 -0.2809573 0.3537823 0.9812013 -0.2841192 0.3535032 0.9811943 -0.2885124 0.3535032 0.9811943 -0.2940703 0.3535032 0.9811943 -0.3011018 0.3535032 0.9811943 -0.3099976 0.3535032 0.9811943 -0.3212519 0.3535032 0.9811943 -0.3354901 0.3535032 0.9811943 -0.3535032 0.3535032 0.9811943 -0.3762922 0.3535032 0.9811943 -0.4051232 0.3535032 0.9811943 -0.4415982 0.3535032 0.9811943 -0.4877437 0.3535032 0.9811943 -0.5461239 0.3535032 0.9811943 -0.6199824 0.3535032 0.9811943 -0.713423 0.3535032 0.9811943 -0.8316375 0.3535032 0.9811943 -0.9811943 0.3535032 0.9811943 -0.9856839 0.3990515 0.8498092 -0.9890048 0.4521565 0.7711789 -0.9914995 0.5095925 0.7321559 -0.9933953 0.5683949 0.721513 -0.9948487 0.6260304 0.7299859 -0.9959706 0.6805199 0.7502359 -0.9968409 0.7304884 0.776724 -0.9975189 0.7751395 0.8055009 -0.9980488 0.8141733 0.8339392 -0.9984638 0.8476717 0.8604449 -0.9987895 0.8759795 0.8841823 -0.9990455 0.8995968 0.9048372 -0.999247 0.9190947 0.9224281 -0.9994057 0.935054 0.9371669 -0.9995308 0.9480261 0.9493615 -0.9996295 0.9585109 0.959353 -0.9997074 0.966947 0.967477 -0.9997688 0.9737101 0.9740432 -0.9998174 0.9791163 0.9793253 -0.9998557 0.9834277 0.9835588 -0.999886 0.9868597 0.9869419 -0.9999099 0.9895878 0.9896392 -0.9999288 0.9917537 0.9917859 -0.9999437 0.9934718 0.9934919 -0.2783684 0.3851765 0.9814251 -0.2783325 0.3850603 0.9814221 -0.2782884 0.3849144 0.9814183 -0.2782347 0.3847314 0.9814136 -0.2781701 0.3845027 0.9814076 -0.2780936 0.3842178 0.9814002 -0.2780055 0.3838642 0.9813911 -0.2779077 0.3834282 0.9813797 -0.2778058 0.3828946 0.9813659 -0.2777122 0.3822485 0.9813491 -0.2776503 0.3814778 0.9813291 -0.2776626 0.3805778 0.9813057 -0.2778236 0.3795602 0.9812792 -0.2782606 0.3784681 0.9812508 -0.2791873 0.3774018 0.9812231 -0.2809573 0.3765614 0.9812013 -0.2841192 0.3762922 0.9811943 -0.2885124 0.3762922 0.9811943 -0.2940703 0.3762922 0.9811943 -0.3011018 0.3762922 0.9811943 -0.3099976 0.3762922 0.9811943 -0.3212519 0.3762922 0.9811943 -0.3354901 0.3762922 0.9811943 -0.3535032 0.3762922 0.9811943 -0.3762922 0.3762922 0.9811943 -0.4051232 0.3762922 0.9811943 -0.4415982 0.3762922 0.9811943 -0.4877437 0.3762922 0.9811943 -0.5461239 0.3762922 0.9811943 -0.6199824 0.3762922 0.9811943 -0.713423 0.3762922 0.9811943 -0.8316375 0.3762922 0.9811943 -0.9811943 0.3762922 0.9811943 -0.9856839 0.4154167 0.8498092 -0.9890048 0.4637389 0.7711789 -0.9914995 0.5176729 0.7321559 -0.9933953 0.573954 0.721513 -0.9948487 0.6298046 0.7299859 -0.9959706 0.683051 0.7502359 -0.9968409 0.732167 0.776724 -0.9975189 0.7762418 0.8055009 -0.9980488 0.8148909 0.8339392 -0.9984638 0.8481355 0.8604449 -0.9987895 0.8762773 0.8841823 -0.9990455 0.899787 0.9048372 -0.999247 0.9192157 0.9224281 -0.9994057 0.9351307 0.9371669 -0.9995308 0.9480746 0.9493615 -0.9996295 0.9585415 0.959353 -0.9997074 0.9669663 0.967477 -0.9997688 0.9737222 0.9740432 -0.9998174 0.9791238 0.9793253 -0.9998557 0.9834324 0.9835588 -0.999886 0.9868627 0.9869419 -0.9999099 0.9895897 0.9896392 -0.9999288 0.9917549 0.9917859 -0.9999437 0.9934725 0.9934919 -0.2783684 0.413595 0.9814251 -0.2783325 0.4134842 0.9814221 -0.2782884 0.4133451 0.9814183 -0.2782347 0.4131707 0.9814136 -0.2781701 0.4129526 0.9814076 -0.2780936 0.4126808 0.9814002 -0.2780055 0.4123437 0.9813911 -0.2779077 0.4119279 0.9813797 -0.2778058 0.4114191 0.9813659 -0.2777122 0.410803 0.9813491 -0.2776503 0.410068 0.9813291 -0.2776626 0.4092098 0.9813057 -0.2778236 0.4082395 0.9812792 -0.2782606 0.4071981 0.9812508 -0.2791873 0.4061813 0.9812231 -0.2809573 0.4053799 0.9812013 -0.2841192 0.4051232 0.9811943 -0.2885124 0.4051232 0.9811943 -0.2940703 0.4051232 0.9811943 -0.3011018 0.4051232 0.9811943 -0.3099976 0.4051232 0.9811943 -0.3212519 0.4051232 0.9811943 -0.3354901 0.4051232 0.9811943 -0.3535032 0.4051232 0.9811943 -0.3762922 0.4051232 0.9811943 -0.4051232 0.4051232 0.9811943 -0.4415982 0.4051232 0.9811943 -0.4877437 0.4051232 0.9811943 -0.5461239 0.4051232 0.9811943 -0.6199824 0.4051232 0.9811943 -0.713423 0.4051232 0.9811943 -0.8316375 0.4051232 0.9811943 -0.9811943 0.4051232 0.9811943 -0.9856839 0.4361208 0.8498092 -0.9890048 0.4783922 0.7711789 -0.9914995 0.5278957 0.7321559 -0.9933953 0.580987 0.721513 -0.9948487 0.6345795 0.7299859 -0.9959706 0.6862532 0.7502359 -0.9968409 0.7342907 0.776724 -0.9975189 0.7776364 0.8055009 -0.9980488 0.8157988 0.8339392 -0.9984638 0.8487222 0.8604449 -0.9987895 0.8766541 0.8841823 -0.9990455 0.9000277 0.9048372 -0.999247 0.9193688 0.9224281 -0.9994057 0.9352277 0.9371669 -0.9995308 0.9481359 0.9493615 -0.9996295 0.9585802 0.959353 -0.9997074 0.9669906 0.967477 -0.9997688 0.9737375 0.9740432 -0.9998174 0.9791334 0.9793253 -0.9998557 0.9834385 0.9835588 -0.999886 0.9868665 0.9869419 -0.9999099 0.989592 0.9896392 -0.9999288 0.9917564 0.9917859 -0.9999437 0.9934734 0.9934919 -0.2783684 0.4495482 0.9814251 -0.2783325 0.4494442 0.9814221 -0.2782884 0.4493137 0.9814183 -0.2782347 0.44915 0.9814136 -0.2781701 0.4489453 0.9814076 -0.2780936 0.4486903 0.9814002 -0.2780055 0.448374 0.9813911 -0.2779077 0.4479838 0.9813797 -0.2778058 0.4475063 0.9813659 -0.2777122 0.4469282 0.9813491 -0.2776503 0.4462385 0.9813291 -0.2776626 0.4454331 0.9813057 -0.2778236 0.4445225 0.9812792 -0.2782606 0.4435453 0.9812508 -0.2791873 0.4425911 0.9812231 -0.2809573 0.441839 0.9812013 -0.2841192 0.4415982 0.9811943 -0.2885124 0.4415982 0.9811943 -0.2940703 0.4415982 0.9811943 -0.3011018 0.4415982 0.9811943 -0.3099976 0.4415982 0.9811943 -0.3212519 0.4415982 0.9811943 -0.3354901 0.4415982 0.9811943 -0.3535032 0.4415982 0.9811943 -0.3762922 0.4415982 0.9811943 -0.4051232 0.4415982 0.9811943 -0.4415982 0.4415982 0.9811943 -0.4877437 0.4415982 0.9811943 -0.5461239 0.4415982 0.9811943 -0.6199824 0.4415982 0.9811943 -0.713423 0.4415982 0.9811943 -0.8316375 0.4415982 0.9811943 -0.9811943 0.4415982 0.9811943 -0.9856839 0.4623142 0.8498092 -0.9890048 0.4969305 0.7711789 -0.9914995 0.5408288 0.7321559 -0.9933953 0.5898847 0.721513 -0.9948487 0.6406203 0.7299859 -0.9959706 0.6903044 0.7502359 -0.9968409 0.7369774 0.776724 -0.9975189 0.7794007 0.8055009 -0.9980488 0.8169474 0.8339392 -0.9984638 0.8494644 0.8604449 -0.9987895 0.8771307 0.8841823 -0.9990455 0.9003323 0.9048372 -0.999247 0.9195625 0.9224281 -0.9994057 0.9353505 0.9371669 -0.9995308 0.9482135 0.9493615 -0.9996295 0.9586291 0.959353 -0.9997074 0.9670214 0.967477 -0.9997688 0.9737569 0.9740432 -0.9998174 0.9791456 0.9793253 -0.9998557 0.9834461 0.9835588 -0.999886 0.9868713 0.9869419 -0.9999099 0.989595 0.9896392 -0.9999288 0.9917582 0.9917859 -0.9999437 0.9934746 0.9934919 -0.2783684 0.4950336 0.9814251 -0.2783325 0.4949383 0.9814221 -0.2782884 0.4948186 0.9814183 -0.2782347 0.4946685 0.9814136 -0.2781701 0.4944808 0.9814076 -0.2780936 0.494247 0.9814002 -0.2780055 0.4939569 0.9813911 -0.2779077 0.4935991 0.9813797 -0.2778058 0.4931613 0.9813659 -0.2777122 0.4926312 0.9813491 -0.2776503 0.4919987 0.9813291 -0.2776626 0.4912602 0.9813057 -0.2778236 0.4904253 0.9812792 -0.2782606 0.4895292 0.9812508 -0.2791873 0.4886542 0.9812231 -0.2809573 0.4879646 0.9812013 -0.2841192 0.4877437 0.9811943 -0.2885124 0.4877437 0.9811943 -0.2940703 0.4877437 0.9811943 -0.3011018 0.4877437 0.9811943 -0.3099976 0.4877437 0.9811943 -0.3212519 0.4877437 0.9811943 -0.3354901 0.4877437 0.9811943 -0.3535032 0.4877437 0.9811943 -0.3762922 0.4877437 0.9811943 -0.4051232 0.4877437 0.9811943 -0.4415982 0.4877437 0.9811943 -0.4877437 0.4877437 0.9811943 -0.5461239 0.4877437 0.9811943 -0.6199824 0.4877437 0.9811943 -0.713423 0.4877437 0.9811943 -0.8316375 0.4877437 0.9811943 -0.9811943 0.4877437 0.9811943 -0.9856839 0.4954523 0.8498092 -0.9890048 0.5203839 0.7711789 -0.9914995 0.5571908 0.7321559 -0.9933953 0.6011414 0.721513 -0.9948487 0.6482627 0.7299859 -0.9959706 0.6954296 0.7502359 -0.9968409 0.7403765 0.776724 -0.9975189 0.7816327 0.8055009 -0.9980488 0.8184005 0.8339392 -0.9984638 0.8504035 0.8604449 -0.9987895 0.8777338 0.8841823 -0.9990455 0.9007175 0.9048372 -0.999247 0.9198076 0.9224281 -0.9994057 0.9355059 0.9371669 -0.9995308 0.9483117 0.9493615 -0.9996295 0.958691 0.959353 -0.9997074 0.9670604 0.967477 -0.9997688 0.9737814 0.9740432 -0.9998174 0.979161 0.9793253 -0.9998557 0.9834557 0.9835588 -0.999886 0.9868773 0.9869419 -0.9999099 0.9895988 0.9896392 -0.9999288 0.9917606 0.9917859 -0.9999437 0.9934761 0.9934919 -0.2783684 0.5525787 0.9814251 -0.2783325 0.5524942 0.9814221 -0.2782884 0.5523882 0.9814183 -0.2782347 0.5522553 0.9814136 -0.2781701 0.5520892 0.9814076 -0.2780936 0.5518821 0.9814002 -0.2780055 0.5516253 0.9813911 -0.2779077 0.5513085 0.9813797 -0.2778058 0.5509208 0.9813659 -0.2777122 0.5504514 0.9813491 -0.2776503 0.5498914 0.9813291 -0.2776626 0.5492375 0.9813057 -0.2778236 0.5484982 0.9812792 -0.2782606 0.5477048 0.9812508 -0.2791873 0.5469301 0.9812231 -0.2809573 0.5463195 0.9812013 -0.2841192 0.5461239 0.9811943 -0.2885124 0.5461239 0.9811943 -0.2940703 0.5461239 0.9811943 -0.3011018 0.5461239 0.9811943 -0.3099976 0.5461239 0.9811943 -0.3212519 0.5461239 0.9811943 -0.3354901 0.5461239 0.9811943 -0.3535032 0.5461239 0.9811943 -0.3762922 0.5461239 0.9811943 -0.4051232 0.5461239 0.9811943 -0.4415982 0.5461239 0.9811943 -0.4877437 0.5461239 0.9811943 -0.5461239 0.5461239 0.9811943 -0.6199824 0.5461239 0.9811943 -0.713423 0.5461239 0.9811943 -0.8316375 0.5461239 0.9811943 -0.9811943 0.5461239 0.9811943 -0.9856839 0.5373763 0.8498092 -0.9890048 0.5500554 0.7711789 -0.9914995 0.577891 0.7321559 -0.9933953 0.6153825 0.721513 -0.9948487 0.6579314 0.7299859 -0.9959706 0.7019138 0.7502359 -0.9968409 0.7446768 0.776724 -0.9975189 0.7844566 0.8055009 -0.9980488 0.8202389 0.8339392 -0.9984638 0.8515915 0.8604449 -0.9987895 0.8784967 0.8841823 -0.9990455 0.9012049 0.9048372 -0.999247 0.9201176 0.9224281 -0.9994057 0.9357024 0.9371669 -0.9995308 0.9484359 0.9493615 -0.9996295 0.9587693 0.959353 -0.9997074 0.9671097 0.967477 -0.9997688 0.9738123 0.9740432 -0.9998174 0.9791804 0.9793253 -0.9998557 0.9834679 0.9835588 -0.999886 0.986885 0.9869419 -0.9999099 0.9896036 0.9896392 -0.9999288 0.9917636 0.9917859 -0.9999437 0.9934779 0.9934919 -0.2783684 0.6253806 0.9814251 -0.2783325 0.62531 0.9814221 -0.2782884 0.6252213 0.9814183 -0.2782347 0.6251102 0.9814136 -0.2781701 0.6249712 0.9814076 -0.2780936 0.6247981 0.9814002 -0.2780055 0.6245833 0.9813911 -0.2779077 0.6243183 0.9813797 -0.2778058 0.6239941 0.9813659 -0.2777122 0.6236015 0.9813491 -0.2776503 0.6231332 0.9813291 -0.2776626 0.6225864 0.9813057 -0.2778236 0.6219681 0.9812792 -0.2782606 0.6213045 0.9812508 -0.2791873 0.6206566 0.9812231 -0.2809573 0.620146 0.9812013 -0.2841192 0.6199824 0.9811943 -0.2885124 0.6199824 0.9811943 -0.2940703 0.6199824 0.9811943 -0.3011018 0.6199824 0.9811943 -0.3099976 0.6199824 0.9811943 -0.3212519 0.6199824 0.9811943 -0.3354901 0.6199824 0.9811943 -0.3535032 0.6199824 0.9811943 -0.3762922 0.6199824 0.9811943 -0.4051232 0.6199824 0.9811943 -0.4415982 0.6199824 0.9811943 -0.4877437 0.6199824 0.9811943 -0.5461239 0.6199824 0.9811943 -0.6199824 0.6199824 0.9811943 -0.713423 0.6199824 0.9811943 -0.8316375 0.6199824 0.9811943 -0.9811943 0.6199824 0.9811943 -0.9856839 0.5904156 0.8498092 -0.9890048 0.5875938 0.7711789 -0.9914995 0.6040793 0.7321559 -0.9933953 0.6333995 0.721513 -0.9948487 0.6701635 0.7299859 -0.9959706 0.710117 0.7502359 -0.9968409 0.7501172 0.776724 -0.9975189 0.7880291 0.8055009 -0.9980488 0.8225647 0.8339392 -0.9984638 0.8530945 0.8604449 -0.9987895 0.8794619 0.8841823 -0.9990455 0.9018215 0.9048372 -0.999247 0.9205098 0.9224281 -0.9994057 0.935951 0.9371669 -0.9995308 0.9485931 0.9493615 -0.9996295 0.9588684 0.959353 -0.9997074 0.967172 0.967477 -0.9997688 0.9738515 0.9740432 -0.9998174 0.979205 0.9793253 -0.9998557 0.9834833 0.9835588 -0.999886 0.9868946 0.9869419 -0.9999099 0.9896096 0.9896392 -0.9999288 0.9917674 0.9917859 -0.9999437 0.9934803 0.9934919 -0.2783684 0.7174845 0.9814251 -0.2783325 0.7174314 0.9814221 -0.2782884 0.7173646 0.9814183 -0.2782347 0.717281 0.9814136 -0.2781701 0.7171765 0.9814076 -0.2780936 0.7170462 0.9814002 -0.2780055 0.7168846 0.9813911 -0.2779077 0.7166853 0.9813797 -0.2778058 0.7164413 0.9813659 -0.2777122 0.716146 0.9813491 -0.2776503 0.7157936 0.9813291 -0.2776626 0.7153822 0.9813057 -0.2778236 0.714917 0.9812792 -0.2782606 0.7144178 0.9812508 -0.2791873 0.7139303 0.9812231 -0.2809573 0.7135461 0.9812013 -0.2841192 0.713423 0.9811943 -0.2885124 0.713423 0.9811943 -0.2940703 0.713423 0.9811943 -0.3011018 0.713423 0.9811943 -0.3099976 0.713423 0.9811943 -0.3212519 0.713423 0.9811943 -0.3354901 0.713423 0.9811943 -0.3535032 0.713423 0.9811943 -0.3762922 0.713423 0.9811943 -0.4051232 0.713423 0.9811943 -0.4415982 0.713423 0.9811943 -0.4877437 0.713423 0.9811943 -0.5461239 0.713423 0.9811943 -0.6199824 0.713423 0.9811943 -0.713423 0.713423 0.9811943 -0.8316375 0.713423 0.9811943 -0.9811943 0.713423 0.9811943 -0.9856839 0.6575172 0.8498092 -0.9890048 0.6350848 0.7711789 -0.9914995 0.637211 0.7321559 -0.9933953 0.6561933 0.721513 -0.9948487 0.6856388 0.7299859 -0.9959706 0.7204952 0.7502359 -0.9968409 0.757 0.776724 -0.9975189 0.7925488 0.8055009 -0.9980488 0.8255071 0.8339392 -0.9984638 0.8549959 0.8604449 -0.9987895 0.880683 0.8841823 -0.9990455 0.9026016 0.9048372 -0.999247 0.9210061 0.9224281 -0.9994057 0.9362655 0.9371669 -0.9995308 0.9487918 0.9493615 -0.9996295 0.9589938 0.959353 -0.9997074 0.9672509 0.967477 -0.9997688 0.9739011 0.9740432 -0.9998174 0.9792361 0.9793253 -0.9998557 0.9835029 0.9835588 -0.999886 0.9869069 0.9869419 -0.9999099 0.9896173 0.9896392 -0.9999288 0.9917722 0.9917859 -0.9999437 0.9934833 0.9934919 -0.2783684 0.8340079 0.9814251 -0.2783325 0.8339769 0.9814221 -0.2782884 0.8339379 0.9814183 -0.2782347 0.8338891 0.9814136 -0.2781701 0.8338281 0.9814076 -0.2780936 0.8337521 0.9814002 -0.2780055 0.8336578 0.9813911 -0.2779077 0.8335415 0.9813797 -0.2778058 0.8333991 0.9813659 -0.2777122 0.8332267 0.9813491 -0.2776503 0.8330211 0.9813291 -0.2776626 0.832781 0.9813057 -0.2778236 0.8325095 0.9812792 -0.2782606 0.8322181 0.9812508 -0.2791873 0.8319336 0.9812231 -0.2809573 0.8317093 0.9812013 -0.2841192 0.8316375 0.9811943 -0.2885124 0.8316375 0.9811943 -0.2940703 0.8316375 0.9811943 -0.3011018 0.8316375 0.9811943 -0.3099976 0.8316375 0.9811943 -0.3212519 0.8316375 0.9811943 -0.3354901 0.8316375 0.9811943 -0.3535032 0.8316375 0.9811943 -0.3762922 0.8316375 0.9811943 -0.4051232 0.8316375 0.9811943 -0.4415982 0.8316375 0.9811943 -0.4877437 0.8316375 0.9811943 -0.5461239 0.8316375 0.9811943 -0.6199824 0.8316375 0.9811943 -0.713423 0.8316375 0.9811943 -0.8316375 0.8316375 0.9811943 -0.9811943 0.8316375 0.9811943 -0.9856839 0.7424095 0.8498092 -0.9890048 0.695167 0.7711789 -0.9914995 0.6791269 0.7321559 -0.9933953 0.6850303 0.721513 -0.9948487 0.7052169 0.7299859 -0.9959706 0.733625 0.7502359 -0.9968409 0.7657077 0.776724 -0.9975189 0.7982669 0.8055009 -0.9980488 0.8292297 0.8339392 -0.9984638 0.8574015 0.8604449 -0.9987895 0.8822279 0.8841823 -0.9990455 0.9035886 0.9048372 -0.999247 0.9216339 0.9224281 -0.9994057 0.9366635 0.9371669 -0.9995308 0.9490434 0.9493615 -0.9996295 0.9591524 0.959353 -0.9997074 0.9673508 0.967477 -0.9997688 0.9739638 0.9740432 -0.9998174 0.9792755 0.9793253 -0.9998557 0.9835276 0.9835588 -0.999886 0.9869223 0.9869419 -0.9999099 0.989627 0.9896392 -0.9999288 0.9917782 0.9917859 -0.9999437 0.9934871 0.9934919 -0.2783684 0.9814251 0.9814251 -0.2783325 0.9814221 0.9814221 -0.2782884 0.9814183 0.9814183 -0.2782347 0.9814136 0.9814136 -0.2781701 0.9814076 0.9814076 -0.2780936 0.9814002 0.9814002 -0.2780055 0.9813911 0.9813911 -0.2779077 0.9813797 0.9813797 -0.2778058 0.9813659 0.9813659 -0.2777122 0.9813491 0.9813491 -0.2776503 0.9813291 0.9813291 -0.2776626 0.9813057 0.9813057 -0.2778236 0.9812792 0.9812792 -0.2782606 0.9812508 0.9812508 -0.2791873 0.9812231 0.9812231 -0.2809573 0.9812013 0.9812013 -0.2841192 0.9811943 0.9811943 -0.2885124 0.9811943 0.9811943 -0.2940703 0.9811943 0.9811943 -0.3011018 0.9811943 0.9811943 -0.3099976 0.9811943 0.9811943 -0.3212519 0.9811943 0.9811943 -0.3354901 0.9811943 0.9811943 -0.3535032 0.9811943 0.9811943 -0.3762922 0.9811943 0.9811943 -0.4051232 0.9811943 0.9811943 -0.4415982 0.9811943 0.9811943 -0.4877437 0.9811943 0.9811943 -0.5461239 0.9811943 0.9811943 -0.6199824 0.9811943 0.9811943 -0.713423 0.9811943 0.9811943 -0.8316375 0.9811943 0.9811943 -0.9811943 0.9811943 0.9811943 -0.9856839 0.8498092 0.8498092 -0.9890048 0.7711789 0.7711789 -0.9914995 0.7321559 0.7321559 -0.9933953 0.721513 0.721513 -0.9948487 0.7299859 0.7299859 -0.9959706 0.7502359 0.7502359 -0.9968409 0.776724 0.776724 -0.9975189 0.8055009 0.8055009 -0.9980488 0.8339392 0.8339392 -0.9984638 0.8604449 0.8604449 -0.9987895 0.8841823 0.8841823 -0.9990455 0.9048372 0.9048372 -0.999247 0.9224281 0.9224281 -0.9994057 0.9371669 0.9371669 -0.9995308 0.9493615 0.9493615 -0.9996295 0.959353 0.959353 -0.9997074 0.967477 0.967477 -0.9997688 0.9740432 0.9740432 -0.9998174 0.9793253 0.9793253 -0.9998557 0.9835588 0.9835588 -0.999886 0.9869419 0.9869419 -0.9999099 0.9896392 0.9896392 -0.9999288 0.9917859 0.9917859 -0.9999437 0.9934919 0.9934919 -0.3454107 0.9858181 0.8515523 -0.3453807 0.9858163 0.8515295 -0.3453439 0.9858141 0.8515008 -0.3452987 0.9858113 0.8514648 -0.3452442 0.9858079 0.8514199 -0.3451791 0.9858036 0.8513639 -0.3451032 0.9857982 0.8512944 -0.3450175 0.9857916 0.8512087 -0.3449254 0.9857835 0.8511039 -0.3448353 0.9857738 0.850977 -0.3447636 0.9857621 0.8508257 -0.3447407 0.9857485 0.8506491 -0.3448204 0.9857332 0.8504495 -0.3450957 0.9857167 0.8502355 -0.3457234 0.9857006 0.8500265 -0.3469645 0.9856879 0.8498619 -0.3492254 0.9856839 0.8498092 -0.3523802 0.9856839 0.8498092 -0.3563715 0.9856839 0.8498092 -0.3614209 0.9856839 0.8498092 -0.3678092 0.9856839 0.8498092 -0.3758911 0.9856839 0.8498092 -0.3861159 0.9856839 0.8498092 -0.3990515 0.9856839 0.8498092 -0.4154167 0.9856839 0.8498092 -0.4361208 0.9856839 0.8498092 -0.4623142 0.9856839 0.8498092 -0.4954523 0.9856839 0.8498092 -0.5373763 0.9856839 0.8498092 -0.5904156 0.9856839 0.8498092 -0.6575172 0.9856839 0.8498092 -0.7424095 0.9856839 0.8498092 -0.8498092 0.9856839 0.8498092 -0.9856839 0.9856839 0.8498092 -0.9890048 0.8673437 0.7711789 -0.9914995 0.7992446 0.7321559 -0.9933953 0.7676683 0.721513 -0.9948487 0.7613218 0.7299859 -0.9959706 0.7712508 0.7502359 -0.9968409 0.7906611 0.776724 -0.9975189 0.8146529 0.8055009 -0.9980488 0.8398974 0.8339392 -0.9984638 0.8642952 0.8604449 -0.9987895 0.886655 0.8841823 -0.9990455 0.9064168 0.9048372 -0.999247 0.9234329 0.9224281 -0.9994057 0.9378038 0.9371669 -0.9995308 0.9497641 0.9493615 -0.9996295 0.9596068 0.959353 -0.9997074 0.9676368 0.967477 -0.9997688 0.9741436 0.9740432 -0.9998174 0.9793883 0.9793253 -0.9998557 0.9835983 0.9835588 -0.999886 0.9869667 0.9869419 -0.9999099 0.9896547 0.9896392 -0.9999288 0.9917956 0.9917859 -0.9999437 0.993498 0.9934919 -0.4144197 0.9890841 0.773388 -0.4143955 0.9890831 0.773359 -0.4143657 0.9890818 0.7733226 -0.414329 0.9890801 0.7732769 -0.4142845 0.9890781 0.7732199 -0.4142311 0.9890755 0.7731488 -0.4141683 0.9890723 0.7730606 -0.4140964 0.9890684 0.7729519 -0.4140176 0.9890637 0.772819 -0.4139373 0.9890579 0.772658 -0.4138668 0.989051 0.7724662 -0.4138277 0.989043 0.7722424 -0.4138582 0.9890339 0.7719895 -0.4140252 0.9890241 0.7717183 -0.4144423 0.9890146 0.7714538 -0.4152991 0.9890072 0.7712455 -0.4168922 0.9890048 0.7711789 -0.419125 0.9890048 0.7711789 -0.4219498 0.9890048 0.7711789 -0.4255236 0.9890048 0.7711789 -0.4300448 0.9890048 0.7711789 -0.4357648 0.9890048 0.7711789 -0.4430013 0.9890048 0.7711789 -0.4521565 0.9890048 0.7711789 -0.4637389 0.9890048 0.7711789 -0.4783922 0.9890048 0.7711789 -0.4969305 0.9890048 0.7711789 -0.5203839 0.9890048 0.7711789 -0.5500554 0.9890048 0.7711789 -0.5875938 0.9890048 0.7711789 -0.6350848 0.9890048 0.7711789 -0.695167 0.9890048 0.7711789 -0.7711789 0.9890048 0.7711789 -0.8673437 0.9890048 0.7711789 -0.9890048 0.9890048 0.7711789 -0.9914995 0.8841204 0.7321559 -0.9933953 0.8260608 0.721513 -0.9948487 0.8009659 0.7299859 -0.9959706 0.7978374 0.7502359 -0.9968409 0.8082934 0.776724 -0.9975189 0.8262314 0.8055009 -0.9980488 0.8474353 0.8339392 -0.9984638 0.8691663 0.8604449 -0.9987895 0.8897832 0.8841823 -0.9990455 0.9084153 0.9048372 -0.999247 0.9247041 0.9224281 -0.9994057 0.9386096 0.9371669 -0.9995308 0.9502734 0.9493615 -0.9996295 0.959928 0.959353 -0.9997074 0.9678389 0.967477 -0.9997688 0.9742706 0.9740432 -0.9998174 0.9794681 0.9793253 -0.9998557 0.9836483 0.9835588 -0.999886 0.986998 0.9869419 -0.9999099 0.9896744 0.9896392 -0.9999288 0.9918079 0.9917859 -0.9999437 0.9935057 0.9934919 -0.4834235 0.9915469 0.7342914 -0.4834045 0.9915463 0.7342633 -0.4833811 0.9915455 0.7342281 -0.4833522 0.9915446 0.7341839 -0.4833171 0.9915433 0.7341287 -0.4832747 0.9915418 0.7340599 -0.4832246 0.9915399 0.7339746 -0.4831666 0.9915376 0.7338694 -0.4831021 0.9915347 0.7337408 -0.4830346 0.9915312 0.7335852 -0.4829718 0.9915271 0.7333996 -0.4829286 0.9915223 0.7331832 -0.4829319 0.9915169 0.7329388 -0.4830292 0.991511 0.7326769 -0.4833013 0.9915054 0.7324214 -0.4838841 0.9915009 0.7322203 -0.4849907 0.9914995 0.7321559 -0.4865484 0.9914995 0.7321559 -0.4885191 0.9914995 0.7321559 -0.4910123 0.9914995 0.7321559 -0.4941665 0.9914995 0.7321559 -0.498157 0.9914995 0.7321559 -0.5032055 0.9914995 0.7321559 -0.5095925 0.9914995 0.7321559 -0.5176729 0.9914995 0.7321559 -0.5278957 0.9914995 0.7321559 -0.5408288 0.9914995 0.7321559 -0.5571908 0.9914995 0.7321559 -0.577891 0.9914995 0.7321559 -0.6040793 0.9914995 0.7321559 -0.637211 0.9914995 0.7321559 -0.6791269 0.9914995 0.7321559 -0.7321559 0.9914995 0.7321559 -0.7992446 0.9914995 0.7321559 -0.8841204 0.9914995 0.7321559 -0.9914995 0.9914995 0.7321559 -0.9933953 0.8999349 0.721513 -0.9948487 0.8511207 0.7299859 -0.9959706 0.8314729 0.7502359 -0.9968409 0.8306004 0.776724 -0.9975189 0.8408797 0.8055009 -0.9980488 0.8569716 0.8339392 -0.9984638 0.875329 0.8604449 -0.9987895 0.8937407 0.8841823 -0.9990455 0.9109436 0.9048372 -0.999247 0.9263124 0.9224281 -0.9994057 0.939629 0.9371669 -0.9995308 0.9509177 0.9493615 -0.9996295 0.9603343 0.959353 -0.9997074 0.9680946 0.967477 -0.9997688 0.9744313 0.9740432 -0.9998174 0.9795689 0.9793253 -0.9998557 0.9837116 0.9835588 -0.999886 0.9870376 0.9869419 -0.9999099 0.9896992 0.9896392 -0.9999288 0.9918234 0.9917859 -0.9999437 0.9935154 0.9934919 -0.5504963 0.993424 0.7233383 -0.5504818 0.9934236 0.7233143 -0.550464 0.9934231 0.7232841 -0.5504419 0.9934225 0.7232463 -0.550415 0.9934218 0.7231991 -0.5503825 0.9934209 0.7231402 -0.5503438 0.9934197 0.7230672 -0.5502987 0.9934183 0.7229773 -0.550248 0.9934166 0.7228673 -0.5501939 0.9934145 0.7227342 -0.5501416 0.993412 0.7225756 -0.5501012 0.9934091 0.7223906 -0.5500915 0.9934058 0.7221817 -0.5501456 0.9934023 0.7219579 -0.5503203 0.9933988 0.7217397 -0.5507113 0.9933961 0.721568 -0.5514695 0.9933953 0.721513 -0.5525411 0.9933953 0.721513 -0.5538969 0.9933953 0.721513 -0.5556122 0.9933953 0.721513 -0.5577822 0.9933953 0.721513 -0.5605276 0.9933953 0.721513 -0.5640008 0.9933953 0.721513 -0.5683949 0.9933953 0.721513 -0.573954 0.9933953 0.721513 -0.580987 0.9933953 0.721513 -0.5898847 0.9933953 0.721513 -0.6011414 0.9933953 0.721513 -0.6153825 0.9933953 0.721513 -0.6333995 0.9933953 0.721513 -0.6561933 0.9933953 0.721513 -0.6850303 0.9933953 0.721513 -0.721513 0.9933953 0.721513 -0.7676683 0.9933953 0.721513 -0.8260608 0.9933953 0.721513 -0.8999349 0.9933953 0.721513 -0.9933953 0.9933953 0.721513 -0.9948487 0.9145732 0.7299859 -0.9959706 0.8740262 0.7502359 -0.9968409 0.8588218 0.776724 -0.9975189 0.8594117 0.8055009 -0.9980488 0.8690364 0.8339392 -0.9984638 0.8831255 0.8604449 -0.9987895 0.8987476 0.8841823 -0.9990455 0.9141422 0.9048372 -0.999247 0.928347 0.9224281 -0.9994057 0.9409186 0.9371669 -0.9995308 0.9517328 0.9493615 -0.9996295 0.9608482 0.959353 -0.9997074 0.9684181 0.967477 -0.9997688 0.9746346 0.9740432 -0.9998174 0.9796966 0.9793253 -0.9998557 0.9837916 0.9835588 -0.999886 0.9870878 0.9869419 -0.9999099 0.9897306 0.9896392 -0.9999288 0.9918431 0.9917859 -0.9999437 0.9935277 0.9934919 -0.6139459 0.9948662 0.7314346 -0.6139352 0.994866 0.7314156 -0.6139219 0.9948657 0.7313916 -0.6139056 0.9948653 0.7313616 -0.6138855 0.9948649 0.731324 -0.6138613 0.9948643 0.7312773 -0.6138323 0.9948636 0.7312193 -0.6137984 0.9948628 0.7311479 -0.6137599 0.9948617 0.7310605 -0.6137183 0.9948604 0.7309548 -0.6136769 0.9948589 0.7308289 -0.6136427 0.9948571 0.7306821 -0.6136284 0.9948551 0.7305163 -0.6136569 0.994853 0.7303387 -0.6137675 0.9948509 0.7301657 -0.6140266 0.9948493 0.7300295 -0.6145393 0.9948487 0.7299859 -0.6152669 0.9948487 0.7299859 -0.6161874 0.9948487 0.7299859 -0.6173519 0.9948487 0.7299859 -0.6188252 0.9948487 0.7299859 -0.6206891 0.9948487 0.7299859 -0.6230471 0.9948487 0.7299859 -0.6260304 0.9948487 0.7299859 -0.6298046 0.9948487 0.7299859 -0.6345795 0.9948487 0.7299859 -0.6406203 0.9948487 0.7299859 -0.6482627 0.9948487 0.7299859 -0.6579314 0.9948487 0.7299859 -0.6701635 0.9948487 0.7299859 -0.6856388 0.9948487 0.7299859 -0.7052169 0.9948487 0.7299859 -0.7299859 0.9948487 0.7299859 -0.7613218 0.9948487 0.7299859 -0.8009659 0.9948487 0.7299859 -0.8511207 0.9948487 0.7299859 -0.9145732 0.9948487 0.7299859 -0.9948487 0.9948487 0.7299859 -0.9959706 0.9278617 0.7502359 -0.9968409 0.8945255 0.776724 -0.9975189 0.8828571 0.8055009 -0.9980488 0.8842998 0.8339392 -0.9984638 0.892989 0.8604449 -0.9987895 0.9050819 0.8841823 -0.9990455 0.9181889 0.9048372 -0.999247 0.9309211 0.9224281 -0.9994057 0.9425502 0.9371669 -0.9995308 0.952764 0.9493615 -0.9996295 0.9614985 0.959353 -0.9997074 0.9688274 0.967477 -0.9997688 0.9748918 0.9740432 -0.9998174 0.979858 0.9793253 -0.9998557 0.9838928 0.9835588 -0.999886 0.9871512 0.9869419 -0.9999099 0.9897703 0.9896392 -0.9999288 0.991868 0.9917859 -0.9999437 0.9935432 0.9934919 -0.6724572 0.9959813 0.7513284 -0.6724495 0.9959811 0.751314 -0.6724399 0.9959809 0.7512959 -0.672428 0.9959807 0.7512732 -0.6724135 0.9959804 0.7512449 -0.6723959 0.9959801 0.7512096 -0.6723748 0.9959797 0.7511659 -0.67235 0.9959791 0.751112 -0.6723217 0.9959785 0.7510461 -0.6722907 0.9959777 0.7509664 -0.6722594 0.9959768 0.7508714 -0.6722322 0.9959757 0.7507607 -0.672218 0.9959745 0.7506357 -0.672232 0.9959732 0.7505018 -0.6723012 0.9959719 0.7503714 -0.6724711 0.9959709 0.7502687 -0.6728136 0.9959706 0.7502359 -0.6733015 0.9959706 0.7502359 -0.6739188 0.9959706 0.7502359 -0.6746998 0.9959706 0.7502359 -0.6756878 0.9959706 0.7502359 -0.6769378 0.9959706 0.7502359 -0.6785192 0.9959706 0.7502359 -0.6805199 0.9959706 0.7502359 -0.683051 0.9959706 0.7502359 -0.6862532 0.9959706 0.7502359 -0.6903044 0.9959706 0.7502359 -0.6954296 0.9959706 0.7502359 -0.7019138 0.9959706 0.7502359 -0.710117 0.9959706 0.7502359 -0.7204952 0.9959706 0.7502359 -0.733625 0.9959706 0.7502359 -0.7502359 0.9959706 0.7502359 -0.7712508 0.9959706 0.7502359 -0.7978374 0.9959706 0.7502359 -0.8314729 0.9959706 0.7502359 -0.8740262 0.9959706 0.7502359 -0.9278617 0.9959706 0.7502359 -0.9959706 0.9959706 0.7502359 -0.9968409 0.9396953 0.776724 -0.9975189 0.9125186 0.8055009 -0.9980488 0.9036101 0.8339392 -0.9984638 0.9054678 0.8604449 -0.9987895 0.9130957 0.8841823 -0.9990455 0.9233085 0.9048372 -0.999247 0.9341777 0.9224281 -0.9994057 0.9446144 0.9371669 -0.9995308 0.9540687 0.9493615 -0.9996295 0.9623212 0.959353 -0.9997074 0.9693452 0.967477 -0.9997688 0.9752172 0.9740432 -0.9998174 0.9800622 0.9793253 -0.9998557 0.9840209 0.9835588 -0.999886 0.9872315 0.9869419 -0.9999099 0.9898206 0.9896392 -0.9999288 0.9918994 0.9917859 -0.9999437 0.9935629 0.9934919 -0.7251659 0.9968475 0.7775169 -0.7251605 0.9968474 0.7775065 -0.7251537 0.9968473 0.7774933 -0.7251454 0.9968472 0.7774769 -0.7251351 0.996847 0.7774563 -0.7251226 0.9968468 0.7774307 -0.7251076 0.9968465 0.7773989 -0.7250899 0.9968462 0.7773598 -0.7250697 0.9968458 0.7773119 -0.7250473 0.9968453 0.7772541 -0.7250244 0.9968448 0.7771851 -0.7250039 0.9968441 0.7771048 -0.7249916 0.9968433 0.7770141 -0.7249978 0.9968425 0.7769169 -0.7250408 0.9968418 0.7768223 -0.7251511 0.9968411 0.7767478 -0.7253775 0.9968409 0.776724 -0.7257011 0.9968409 0.776724 -0.7261105 0.9968409 0.776724 -0.7266285 0.9968409 0.776724 -0.7272837 0.9968409 0.776724 -0.7281127 0.9968409 0.776724 -0.7291615 0.9968409 0.776724 -0.7304884 0.9968409 0.776724 -0.732167 0.9968409 0.776724 -0.7342907 0.9968409 0.776724 -0.7369774 0.9968409 0.776724 -0.7403765 0.9968409 0.776724 -0.7446768 0.9968409 0.776724 -0.7501172 0.9968409 0.776724 -0.757 0.9968409 0.776724 -0.7657077 0.9968409 0.776724 -0.776724 0.9968409 0.776724 -0.7906611 0.9968409 0.776724 -0.8082934 0.9968409 0.776724 -0.8306004 0.9968409 0.776724 -0.8588218 0.9968409 0.776724 -0.8945255 0.9968409 0.776724 -0.9396953 0.9968409 0.776724 -0.9968409 0.9968409 0.776724 -0.9975189 0.9500442 0.8055009 -0.9980488 0.9280401 0.8339392 -0.9984638 0.921255 0.8604449 -0.9987895 0.9232341 0.8841823 -0.9990455 0.9297854 0.9048372 -0.999247 0.9382977 0.9224281 -0.9994057 0.9472259 0.9371669 -0.9995308 0.9557192 0.9493615 -0.9996295 0.963362 0.959353 -0.9997074 0.9700002 0.967477 -0.9997688 0.9756289 0.9740432 -0.9998174 0.9803206 0.9793253 -0.9998557 0.9841829 0.9835588 -0.999886 0.987333 0.9869419 -0.9999099 0.9898842 0.9896392 -0.9999288 0.9919392 0.9917859 -0.9999437 0.9935878 0.9934919 -0.7716588 0.997523 0.8060595 -0.7716551 0.997523 0.8060522 -0.7716504 0.9975229 0.8060429 -0.7716446 0.9975228 0.8060313 -0.7716375 0.9975227 0.8060168 -0.7716288 0.9975226 0.8059988 -0.7716184 0.9975224 0.8059764 -0.7716061 0.9975222 0.8059488 -0.7715919 0.997522 0.8059151 -0.7715762 0.9975217 0.8058743 -0.7715599 0.9975213 0.8058257 -0.7715449 0.9975209 0.8057691 -0.7715352 0.9975204 0.8057052 -0.7715376 0.9975199 0.8056368 -0.7715641 0.9975194 0.8055701 -0.7716352 0.9975191 0.8055177 -0.7717834 0.9975189 0.8055009 -0.7719959 0.9975189 0.8055009 -0.7722648 0.9975189 0.8055009 -0.7726049 0.9975189 0.8055009 -0.7730352 0.9975189 0.8055009 -0.7735795 0.9975189 0.8055009 -0.7742682 0.9975189 0.8055009 -0.7751395 0.9975189 0.8055009 -0.7762418 0.9975189 0.8055009 -0.7776364 0.9975189 0.8055009 -0.7794007 0.9975189 0.8055009 -0.7816327 0.9975189 0.8055009 -0.7844566 0.9975189 0.8055009 -0.7880291 0.9975189 0.8055009 -0.7925488 0.9975189 0.8055009 -0.7982669 0.9975189 0.8055009 -0.8055009 0.9975189 0.8055009 -0.8146529 0.9975189 0.8055009 -0.8262314 0.9975189 0.8055009 -0.8408797 0.9975189 0.8055009 -0.8594117 0.9975189 0.8055009 -0.8828571 0.9975189 0.8055009 -0.9125186 0.9975189 0.8055009 -0.9500442 0.9975189 0.8055009 -0.9975189 0.9975189 0.8055009 -0.9980488 0.9589472 0.8339392 -0.9984638 0.9412278 0.8604449 -0.9987895 0.9360606 0.8841823 -0.9990455 0.9379796 0.9048372 -0.999247 0.94351 0.9224281 -0.9994057 0.9505298 0.9371669 -0.9995308 0.9578074 0.9493615 -0.9996295 0.9646787 0.959353 -0.9997074 0.970829 0.967477 -0.9997688 0.9761497 0.9740432 -0.9998174 0.9806476 0.9793253 -0.9998557 0.984388 0.9835588 -0.999886 0.9874615 0.9869419 -0.9999099 0.9899646 0.9896392 -0.9999288 0.9919896 0.9917859 -0.9999437 0.9936193 0.9934919 -0.8119154 0.9980513 0.8343236 -0.8119128 0.9980512 0.8343185 -0.8119096 0.9980512 0.8343122 -0.8119057 0.9980511 0.8343042 -0.8119009 0.9980511 0.8342942 -0.8118949 0.998051 0.8342818 -0.8118878 0.9980509 0.8342664 -0.8118794 0.9980508 0.8342474 -0.8118697 0.9980506 0.8342242 -0.8118589 0.9980504 0.8341961 -0.8118476 0.9980502 0.8341627 -0.811837 0.99805 0.8341237 -0.8118298 0.9980497 0.8340798 -0.8118303 0.9980494 0.8340327 -0.8118466 0.9980491 0.8339868 -0.8118921 0.9980488 0.8339508 -0.8119884 0.9980488 0.8339392 -0.8121268 0.9980488 0.8339392 -0.8123018 0.9980488 0.8339392 -0.8125232 0.9980488 0.8339392 -0.8128033 0.9980488 0.8339392 -0.8131577 0.9980488 0.8339392 -0.8136061 0.9980488 0.8339392 -0.8141733 0.9980488 0.8339392 -0.8148909 0.9980488 0.8339392 -0.8157988 0.9980488 0.8339392 -0.8169474 0.9980488 0.8339392 -0.8184005 0.9980488 0.8339392 -0.8202389 0.9980488 0.8339392 -0.8225647 0.9980488 0.8339392 -0.8255071 0.9980488 0.8339392 -0.8292297 0.9980488 0.8339392 -0.8339392 0.9980488 0.8339392 -0.8398974 0.9980488 0.8339392 -0.8474353 0.9980488 0.8339392 -0.8569716 0.9980488 0.8339392 -0.8690364 0.9980488 0.8339392 -0.8842998 0.9980488 0.8339392 -0.9036101 0.9980488 0.8339392 -0.9280401 0.9980488 0.8339392 -0.9589472 0.9980488 0.8339392 -0.9980488 0.9980488 0.8339392 -0.9984638 0.9664961 0.8604449 -0.9987895 0.9522877 0.8841823 -0.9990455 0.9483463 0.9048372 -0.999247 0.9501042 0.9224281 -0.9994057 0.9547096 0.9371669 -0.9995308 0.9604492 0.9493615 -0.9996295 0.9663445 0.959353 -0.9997074 0.9718774 0.967477 -0.9997688 0.9768086 0.9740432 -0.9998174 0.9810611 0.9793253 -0.9998557 0.9846473 0.9835588 -0.999886 0.987624 0.9869419 -0.9999099 0.9900664 0.9896392 -0.9999288 0.9920533 0.9917859 -0.9999437 0.9936592 0.9934919 -0.8462171 0.9984653 0.8607044 -0.8462154 0.9984653 0.860701 -0.8462132 0.9984653 0.8606967 -0.8462106 0.9984653 0.8606913 -0.8462073 0.9984652 0.8606845 -0.8462034 0.9984652 0.8606762 -0.8461986 0.9984651 0.8606658 -0.8461929 0.998465 0.8606529 -0.8461864 0.9984649 0.8606373 -0.8461791 0.9984648 0.8606183 -0.8461714 0.9984647 0.8605957 -0.8461641 0.9984645 0.8605694 -0.8461589 0.9984643 0.8605398 -0.8461587 0.9984642 0.860508 -0.8461687 0.998464 0.860477 -0.8461977 0.9984638 0.8604527 -0.8462598 0.9984638 0.8604449 -0.8463492 0.9984638 0.8604449 -0.8464623 0.9984638 0.8604449 -0.8466054 0.9984638 0.8604449 -0.8467864 0.9984638 0.8604449 -0.8470154 0.9984638 0.8604449 -0.8473052 0.9984638 0.8604449 -0.8476717 0.9984638 0.8604449 -0.8481355 0.9984638 0.8604449 -0.8487222 0.9984638 0.8604449 -0.8494644 0.9984638 0.8604449 -0.8504035 0.9984638 0.8604449 -0.8515915 0.9984638 0.8604449 -0.8530945 0.9984638 0.8604449 -0.8549959 0.9984638 0.8604449 -0.8574015 0.9984638 0.8604449 -0.8604449 0.9984638 0.8604449 -0.8642952 0.9984638 0.8604449 -0.8691663 0.9984638 0.8604449 -0.875329 0.9984638 0.8604449 -0.8831255 0.9984638 0.8604449 -0.892989 0.9984638 0.8604449 -0.9054678 0.9984638 0.8604449 -0.921255 0.9984638 0.8604449 -0.9412278 0.9984638 0.8604449 -0.9664961 0.9984638 0.8604449 -0.9984638 0.9984638 0.8604449 -0.9987895 0.9728171 0.8841823 -0.9990455 0.9614615 0.9048372 -0.999247 0.9584468 0.9224281 -0.9994057 0.9599976 0.9371669 -0.9995308 0.9637914 0.9493615 -0.9996295 0.968452 0.959353 -0.9997074 0.9732039 0.967477 -0.9997688 0.9776422 0.9740432 -0.9998174 0.9815844 0.9793253 -0.9998557 0.9849754 0.9835588 -0.999886 0.9878296 0.9869419 -0.9999099 0.9901951 0.9896392 -0.9999288 0.9921339 0.9917859 -0.9999437 0.9937096 0.9934919 -0.8750477 0.9987905 0.8843548 -0.8750466 0.9987905 0.8843525 -0.8750451 0.9987904 0.8843497 -0.8750434 0.9987904 0.8843461 -0.8750412 0.9987904 0.8843416 -0.8750386 0.9987904 0.884336 -0.8750355 0.9987903 0.8843291 -0.8750317 0.9987903 0.8843206 -0.8750274 0.9987902 0.8843102 -0.8750225 0.9987902 0.8842976 -0.8750173 0.9987901 0.8842826 -0.8750124 0.99879 0.8842651 -0.8750088 0.9987899 0.8842454 -0.8750084 0.9987897 0.8842242 -0.8750145 0.9987896 0.8842037 -0.8750329 0.9987895 0.8841875 -0.8750727 0.9987895 0.8841823 -0.8751301 0.9987895 0.8841823 -0.8752028 0.9987895 0.8841823 -0.8752947 0.9987895 0.8841823 -0.8754109 0.9987895 0.8841823 -0.875558 0.9987895 0.8841823 -0.8757441 0.9987895 0.8841823 -0.8759795 0.9987895 0.8841823 -0.8762773 0.9987895 0.8841823 -0.8766541 0.9987895 0.8841823 -0.8771307 0.9987895 0.8841823 -0.8777338 0.9987895 0.8841823 -0.8784967 0.9987895 0.8841823 -0.8794619 0.9987895 0.8841823 -0.880683 0.9987895 0.8841823 -0.8822279 0.9987895 0.8841823 -0.8841823 0.9987895 0.8841823 -0.886655 0.9987895 0.8841823 -0.8897832 0.9987895 0.8841823 -0.8937407 0.9987895 0.8841823 -0.8987476 0.9987895 0.8841823 -0.9050819 0.9987895 0.8841823 -0.9130957 0.9987895 0.8841823 -0.9232341 0.9987895 0.8841823 -0.9360606 0.9987895 0.8841823 -0.9522877 0.9987895 0.8841823 -0.9728171 0.9987895 0.8841823 -0.9987895 0.9987895 0.8841823 -0.9990455 0.9780539 0.9048372 -0.999247 0.9690013 0.9224281 -0.9994057 0.9666876 0.9371669 -0.9995308 0.9680197 0.9493615 -0.9996295 0.9711183 0.959353 -0.9997074 0.974882 0.967477 -0.9997688 0.9786968 0.9740432 -0.9998174 0.9822464 0.9793253 -0.9998557 0.9853905 0.9835588 -0.999886 0.9880897 0.9869419 -0.9999099 0.990358 0.9896392 -0.9999288 0.9922358 0.9917859 -0.9999437 0.9937734 0.9934919 -0.8990028 0.9990461 0.9049504 -0.899002 0.9990461 0.9049489 -0.8990011 0.9990461 0.9049471 -0.899 0.9990461 0.9049447 -0.8989986 0.9990461 0.9049418 -0.8989969 0.9990461 0.9049381 -0.8989948 0.9990461 0.9049336 -0.8989923 0.999046 0.904928 -0.8989895 0.999046 0.9049211 -0.8989863 0.9990459 0.9049128 -0.8989829 0.9990459 0.904903 -0.8989796 0.9990458 0.9048915 -0.8989771 0.9990458 0.9048786 -0.8989767 0.9990457 0.9048647 -0.8989805 0.9990456 0.9048512 -0.8989921 0.9990456 0.9048406 -0.8990175 0.9990455 0.9048372 -0.8990542 0.9990455 0.9048372 -0.8991006 0.9990455 0.9048372 -0.8991593 0.9990455 0.9048372 -0.8992336 0.9990455 0.9048372 -0.8993275 0.9990455 0.9048372 -0.8994464 0.9990455 0.9048372 -0.8995968 0.9990455 0.9048372 -0.899787 0.9990455 0.9048372 -0.9000277 0.9990455 0.9048372 -0.9003323 0.9990455 0.9048372 -0.9007175 0.9990455 0.9048372 -0.9012049 0.9990455 0.9048372 -0.9018215 0.9990455 0.9048372 -0.9026016 0.9990455 0.9048372 -0.9035886 0.9990455 0.9048372 -0.9048372 0.9990455 0.9048372 -0.9064168 0.9990455 0.9048372 -0.9084153 0.9990455 0.9048372 -0.9109436 0.9990455 0.9048372 -0.9141422 0.9990455 0.9048372 -0.9181889 0.9990455 0.9048372 -0.9233085 0.9990455 0.9048372 -0.9297854 0.9990455 0.9048372 -0.9379796 0.9990455 0.9048372 -0.9483463 0.9990455 0.9048372 -0.9614615 0.9990455 0.9048372 -0.9780539 0.9990455 0.9048372 -0.9990455 0.9990455 0.9048372 -0.999247 0.982354 0.9224281 -0.9994057 0.9751513 0.9371669 -0.9995308 0.9733691 0.9493615 -0.9996295 0.9744915 0.959353 -0.9997074 0.977005 0.967477 -0.9997688 0.980031 0.9740432 -0.9998174 0.9830838 0.9793253 -0.9998557 0.9859157 0.9835588 -0.999886 0.9884188 0.9869419 -0.9999099 0.9905641 0.9896392 -0.9999288 0.9923648 0.9917859 -0.9999437 0.9938541 0.9934919 -0.9187175 0.9992474 0.9225017 -0.918717 0.9992474 0.9225007 -0.9187164 0.9992474 0.9224995 -0.9187157 0.9992474 0.922498 -0.9187148 0.9992474 0.9224961 -0.9187137 0.9992474 0.9224937 -0.9187123 0.9992473 0.9224907 -0.9187107 0.9992473 0.9224871 -0.9187089 0.9992473 0.9224827 -0.9187068 0.9992473 0.9224773 -0.9187045 0.9992472 0.9224709 -0.9187024 0.9992472 0.9224634 -0.9187008 0.9992472 0.922455 -0.9187004 0.9992471 0.922446 -0.9187027 0.9992471 0.9224372 -0.9187101 0.999247 0.9224303 -0.9187262 0.999247 0.9224281 -0.9187495 0.999247 0.9224281 -0.9187791 0.999247 0.9224281 -0.9188164 0.999247 0.9224281 -0.9188636 0.999247 0.9224281 -0.9189234 0.999247 0.9224281 -0.918999 0.999247 0.9224281 -0.9190947 0.999247 0.9224281 -0.9192157 0.999247 0.9224281 -0.9193688 0.999247 0.9224281 -0.9195625 0.999247 0.9224281 -0.9198076 0.999247 0.9224281 -0.9201176 0.999247 0.9224281 -0.9205098 0.999247 0.9224281 -0.9210061 0.999247 0.9224281 -0.9216339 0.999247 0.9224281 -0.9224281 0.999247 0.9224281 -0.9234329 0.999247 0.9224281 -0.9247041 0.999247 0.9224281 -0.9263124 0.999247 0.9224281 -0.928347 0.999247 0.9224281 -0.9309211 0.999247 0.9224281 -0.9341777 0.999247 0.9224281 -0.9382977 0.999247 0.9224281 -0.94351 0.999247 0.9224281 -0.9501042 0.999247 0.9224281 -0.9584468 0.999247 0.9224281 -0.9690013 0.999247 0.9224281 -0.982354 0.999247 0.9224281 -0.999247 0.999247 0.9224281 -0.9994057 0.9858591 0.9371669 -0.9995308 0.9801368 0.9493615 -0.9996295 0.978759 0.959353 -0.9997074 0.9796909 0.967477 -0.9997688 0.981719 0.9740432 -0.9998174 0.9841433 0.9793253 -0.9998557 0.9865801 0.9835588 -0.999886 0.9888351 0.9869419 -0.9999099 0.9908248 0.9896392 -0.9999288 0.992528 0.9917859 -0.9999437 0.9939562 0.9934919 -0.9348153 0.999406 0.9372144 -0.9348149 0.999406 0.9372137 -0.9348146 0.999406 0.937213 -0.9348141 0.999406 0.937212 -0.9348135 0.999406 0.9372107 -0.9348128 0.9994059 0.9372092 -0.9348119 0.9994059 0.9372073 -0.9348109 0.9994059 0.9372049 -0.9348097 0.9994059 0.9372021 -0.9348083 0.9994059 0.9371986 -0.9348069 0.9994059 0.9371945 -0.9348055 0.9994059 0.9371897 -0.9348044 0.9994058 0.9371842 -0.9348042 0.9994058 0.9371784 -0.9348056 0.9994058 0.9371728 -0.9348102 0.9994057 0.9371683 -0.9348204 0.9994057 0.9371669 -0.9348352 0.9994057 0.9371669 -0.9348539 0.9994057 0.9371669 -0.9348776 0.9994057 0.9371669 -0.9349075 0.9994057 0.9371669 -0.9349454 0.9994057 0.9371669 -0.9349933 0.9994057 0.9371669 -0.935054 0.9994057 0.9371669 -0.9351307 0.9994057 0.9371669 -0.9352277 0.9994057 0.9371669 -0.9353505 0.9994057 0.9371669 -0.9355059 0.9994057 0.9371669 -0.9357024 0.9994057 0.9371669 -0.935951 0.9994057 0.9371669 -0.9362655 0.9994057 0.9371669 -0.9366635 0.9994057 0.9371669 -0.9371669 0.9994057 0.9371669 -0.9378038 0.9994057 0.9371669 -0.9386096 0.9994057 0.9371669 -0.939629 0.9994057 0.9371669 -0.9409186 0.9994057 0.9371669 -0.9425502 0.9994057 0.9371669 -0.9446144 0.9994057 0.9371669 -0.9472259 0.9994057 0.9371669 -0.9505298 0.9994057 0.9371669 -0.9547096 0.9994057 0.9371669 -0.9599976 0.9994057 0.9371669 -0.9666876 0.9994057 0.9371669 -0.9751513 0.9994057 0.9371669 -0.9858591 0.9994057 0.9371669 -0.9994057 0.9994057 0.9371669 -0.9995308 0.9886988 0.9493615 -0.9996295 0.9841579 0.959353 -0.9997074 0.983089 0.967477 -0.9997688 0.9838545 0.9740432 -0.9998174 0.9854838 0.9793253 -0.9998557 0.9874207 0.9835588 -0.999886 0.9893618 0.9869419 -0.9999099 0.9911547 0.9896392 -0.9999288 0.9927345 0.9917859 -0.9999437 0.9940854 0.9934919 -0.9478754 0.999531 0.949392 -0.9478752 0.999531 0.9493916 -0.947875 0.999531 0.9493911 -0.9478746 0.999531 0.9493904 -0.9478743 0.999531 0.9493896 -0.9478738 0.999531 0.9493887 -0.9478733 0.999531 0.9493874 -0.9478726 0.999531 0.9493859 -0.9478718 0.999531 0.9493841 -0.947871 0.9995309 0.9493819 -0.94787 0.9995309 0.9493792 -0.9478691 0.9995309 0.9493761 -0.9478684 0.9995309 0.9493727 -0.9478683 0.9995309 0.9493689 -0.9478691 0.9995309 0.9493653 -0.947872 0.9995309 0.9493625 -0.9478785 0.9995308 0.9493615 -0.9478878 0.9995308 0.9493615 -0.9478997 0.9995308 0.9493615 -0.9479146 0.9995308 0.9493615 -0.9479335 0.9995308 0.9493615 -0.9479575 0.9995308 0.9493615 -0.9479878 0.9995308 0.9493615 -0.9480261 0.9995308 0.9493615 -0.9480746 0.9995308 0.9493615 -0.9481359 0.9995308 0.9493615 -0.9482135 0.9995308 0.9493615 -0.9483117 0.9995308 0.9493615 -0.9484359 0.9995308 0.9493615 -0.9485931 0.9995308 0.9493615 -0.9487918 0.9995308 0.9493615 -0.9490434 0.9995308 0.9493615 -0.9493615 0.9995308 0.9493615 -0.9497641 0.9995308 0.9493615 -0.9502734 0.9995308 0.9493615 -0.9509177 0.9995308 0.9493615 -0.9517328 0.9995308 0.9493615 -0.952764 0.9995308 0.9493615 -0.9540687 0.9995308 0.9493615 -0.9557192 0.9995308 0.9493615 -0.9578074 0.9995308 0.9493615 -0.9604492 0.9995308 0.9493615 -0.9637914 0.9995308 0.9493615 -0.9680197 0.9995308 0.9493615 -0.9733691 0.9995308 0.9493615 -0.9801368 0.9995308 0.9493615 -0.9886988 0.9995308 0.9493615 -0.9995308 0.9995308 0.9493615 -0.9996295 0.9909882 0.959353 -0.9997074 0.9873879 0.967477 -0.9997688 0.9865561 0.9740432 -0.9998174 0.9871796 0.9793253 -0.9998557 0.9884841 0.9835588 -0.999886 0.9900282 0.9869419 -0.9999099 0.991572 0.9896392 -0.9999288 0.9929957 0.9917859 -0.9999437 0.9942488 0.9934919 -0.958416 0.9996296 0.9593724 -0.9584159 0.9996296 0.9593721 -0.9584157 0.9996296 0.9593718 -0.9584155 0.9996296 0.9593714 -0.9584153 0.9996296 0.9593709 -0.958415 0.9996296 0.9593703 -0.9584146 0.9996296 0.9593695 -0.9584142 0.9996296 0.9593686 -0.9584137 0.9996296 0.9593674 -0.9584132 0.9996296 0.959366 -0.9584126 0.9996296 0.9593643 -0.958412 0.9996296 0.9593623 -0.9584115 0.9996296 0.9593601 -0.9584114 0.9996295 0.9593577 -0.958412 0.9996295 0.9593554 -0.9584138 0.9996295 0.9593536 -0.9584178 0.9996295 0.959353 -0.9584237 0.9996295 0.959353 -0.9584312 0.9996295 0.959353 -0.9584406 0.9996295 0.959353 -0.9584526 0.9996295 0.959353 -0.9584677 0.9996295 0.959353 -0.9584868 0.9996295 0.959353 -0.9585109 0.9996295 0.959353 -0.9585415 0.9996295 0.959353 -0.9585802 0.9996295 0.959353 -0.9586291 0.9996295 0.959353 -0.958691 0.9996295 0.959353 -0.9587693 0.9996295 0.959353 -0.9588684 0.9996295 0.959353 -0.9589938 0.9996295 0.959353 -0.9591524 0.9996295 0.959353 -0.959353 0.9996295 0.959353 -0.9596068 0.9996295 0.959353 -0.959928 0.9996295 0.959353 -0.9603343 0.9996295 0.959353 -0.9608482 0.9996295 0.959353 -0.9614985 0.9996295 0.959353 -0.9623212 0.9996295 0.959353 -0.963362 0.9996295 0.959353 -0.9646787 0.9996295 0.959353 -0.9663445 0.9996295 0.959353 -0.968452 0.9996295 0.959353 -0.9711183 0.9996295 0.959353 -0.9744915 0.9996295 0.959353 -0.978759 0.9996295 0.959353 -0.9841579 0.9996295 0.959353 -0.9909882 0.9996295 0.959353 -0.9996295 0.9996295 0.959353 -0.9997074 0.9928267 0.967477 -0.9997688 0.9899741 0.9740432 -0.9998174 0.989325 0.9793253 -0.9998557 0.9898295 0.9835588 -0.999886 0.9908712 0.9869419 -0.9999099 0.9920999 0.9896392 -0.9999288 0.9933261 0.9917859 -0.9999437 0.9944556 0.9934919 -0.9668873 0.9997074 0.9674893 -0.9668872 0.9997074 0.9674892 -0.9668871 0.9997074 0.967489 -0.966887 0.9997074 0.9674887 -0.9668869 0.9997074 0.9674884 -0.9668867 0.9997074 0.967488 -0.9668865 0.9997074 0.9674875 -0.9668862 0.9997074 0.9674869 -0.9668859 0.9997074 0.9674862 -0.9668855 0.9997074 0.9674853 -0.9668852 0.9997074 0.9674842 -0.9668848 0.9997074 0.9674829 -0.9668845 0.9997074 0.9674815 -0.9668844 0.9997074 0.96748 -0.9668847 0.9997074 0.9674786 -0.9668859 0.9997074 0.9674774 -0.9668884 0.9997074 0.967477 -0.9668922 0.9997074 0.967477 -0.9668969 0.9997074 0.967477 -0.9669028 0.9997074 0.967477 -0.9669103 0.9997074 0.967477 -0.9669198 0.9997074 0.967477 -0.9669318 0.9997074 0.967477 -0.966947 0.9997074 0.967477 -0.9669663 0.9997074 0.967477 -0.9669906 0.9997074 0.967477 -0.9670214 0.9997074 0.967477 -0.9670604 0.9997074 0.967477 -0.9671097 0.9997074 0.967477 -0.967172 0.9997074 0.967477 -0.9672509 0.9997074 0.967477 -0.9673508 0.9997074 0.967477 -0.967477 0.9997074 0.967477 -0.9676368 0.9997074 0.967477 -0.9678389 0.9997074 0.967477 -0.9680946 0.9997074 0.967477 -0.9684181 0.9997074 0.967477 -0.9688274 0.9997074 0.967477 -0.9693452 0.9997074 0.967477 -0.9700002 0.9997074 0.967477 -0.970829 0.9997074 0.967477 -0.9718774 0.9997074 0.967477 -0.9732039 0.9997074 0.967477 -0.974882 0.9997074 0.967477 -0.977005 0.9997074 0.967477 -0.9796909 0.9997074 0.967477 -0.983089 0.9997074 0.967477 -0.9873879 0.9997074 0.967477 -0.9928267 0.9997074 0.967477 -0.9997074 0.9997074 0.967477 -0.9997688 0.9942982 0.9740432 -0.9998174 0.9920392 0.9793253 -0.9998557 0.9915316 0.9835588 -0.999886 0.9919377 0.9869419 -0.9999099 0.9927678 0.9896392 -0.9999288 0.9937442 0.9917859 -0.9999437 0.9947172 0.9934919 -0.9736726 0.9997689 0.974051 -0.9736726 0.9997689 0.9740509 -0.9736725 0.9997689 0.9740508 -0.9736724 0.9997689 0.9740506 -0.9736723 0.9997689 0.9740504 -0.9736722 0.9997689 0.9740501 -0.9736721 0.9997689 0.9740498 -0.9736719 0.9997689 0.9740494 -0.9736717 0.9997689 0.974049 -0.9736715 0.9997689 0.9740484 -0.9736712 0.9997689 0.9740477 -0.973671 0.9997689 0.9740469 -0.9736708 0.9997689 0.974046 -0.9736708 0.9997689 0.9740451 -0.973671 0.9997688 0.9740442 -0.9736717 0.9997688 0.9740434 -0.9736733 0.9997688 0.9740432 -0.9736756 0.9997688 0.9740432 -0.9736786 0.9997688 0.9740432 -0.9736823 0.9997688 0.9740432 -0.973687 0.9997688 0.9740432 -0.973693 0.9997688 0.9740432 -0.9737006 0.9997688 0.9740432 -0.9737101 0.9997688 0.9740432 -0.9737222 0.9997688 0.9740432 -0.9737375 0.9997688 0.9740432 -0.9737569 0.9997688 0.9740432 -0.9737814 0.9997688 0.9740432 -0.9738123 0.9997688 0.9740432 -0.9738515 0.9997688 0.9740432 -0.9739011 0.9997688 0.9740432 -0.9739638 0.9997688 0.9740432 -0.9740432 0.9997688 0.9740432 -0.9741436 0.9997688 0.9740432 -0.9742706 0.9997688 0.9740432 -0.9744313 0.9997688 0.9740432 -0.9746346 0.9997688 0.9740432 -0.9748918 0.9997688 0.9740432 -0.9752172 0.9997688 0.9740432 -0.9756289 0.9997688 0.9740432 -0.9761497 0.9997688 0.9740432 -0.9768086 0.9997688 0.9740432 -0.9776422 0.9997688 0.9740432 -0.9786968 0.9997688 0.9740432 -0.980031 0.9997688 0.9740432 -0.981719 0.9997688 0.9740432 -0.9838545 0.9997688 0.9740432 -0.9865561 0.9997688 0.9740432 -0.9899741 0.9997688 0.9740432 -0.9942982 0.9997688 0.9740432 -0.9997688 0.9997688 0.9740432 -0.9998174 0.9954731 0.9793253 -0.9998557 0.9936849 0.9835588 -0.999886 0.993287 0.9869419 -0.9999099 0.9936128 0.9896392 -0.9999288 0.9942731 0.9917859 -0.9999437 0.9950481 0.9934919 -0.9790927 0.9998174 0.9793302 -0.9790927 0.9998174 0.9793302 -0.9790927 0.9998174 0.9793301 -0.9790926 0.9998174 0.97933 -0.9790925 0.9998174 0.9793299 -0.9790925 0.9998174 0.9793297 -0.9790924 0.9998174 0.9793295 -0.9790923 0.9998174 0.9793293 -0.9790921 0.9998174 0.979329 -0.979092 0.9998174 0.9793286 -0.9790919 0.9998174 0.9793282 -0.9790917 0.9998174 0.9793277 -0.9790916 0.9998174 0.9793271 -0.9790916 0.9998174 0.9793265 -0.9790917 0.9998174 0.9793259 -0.9790921 0.9998174 0.9793255 -0.9790931 0.9998174 0.9793253 -0.9790946 0.9998174 0.9793253 -0.9790965 0.9998174 0.9793253 -0.9790988 0.9998174 0.9793253 -0.9791018 0.9998174 0.9793253 -0.9791055 0.9998174 0.9793253 -0.9791103 0.9998174 0.9793253 -0.9791163 0.9998174 0.9793253 -0.9791238 0.9998174 0.9793253 -0.9791334 0.9998174 0.9793253 -0.9791456 0.9998174 0.9793253 -0.979161 0.9998174 0.9793253 -0.9791804 0.9998174 0.9793253 -0.979205 0.9998174 0.9793253 -0.9792361 0.9998174 0.9793253 -0.9792755 0.9998174 0.9793253 -0.9793253 0.9998174 0.9793253 -0.9793883 0.9998174 0.9793253 -0.9794681 0.9998174 0.9793253 -0.9795689 0.9998174 0.9793253 -0.9796966 0.9998174 0.9793253 -0.979858 0.9998174 0.9793253 -0.9800622 0.9998174 0.9793253 -0.9803206 0.9998174 0.9793253 -0.9806476 0.9998174 0.9793253 -0.9810611 0.9998174 0.9793253 -0.9815844 0.9998174 0.9793253 -0.9822464 0.9998174 0.9793253 -0.9830838 0.9998174 0.9793253 -0.9841433 0.9998174 0.9793253 -0.9854838 0.9998174 0.9793253 -0.9871796 0.9998174 0.9793253 -0.989325 0.9998174 0.9793253 -0.9920392 0.9998174 0.9793253 -0.9954731 0.9998174 0.9793253 -0.9998174 0.9998174 0.9793253 -0.9998557 0.9964092 0.9835588 -0.999886 0.9949941 0.9869419 -0.9999099 0.9946818 0.9896392 -0.9999288 0.9949422 0.9917859 -0.9999437 0.9954668 0.9934919 -0.9834129 0.9998557 0.9835619 -0.9834129 0.9998557 0.9835618 -0.9834129 0.9998557 0.9835618 -0.9834129 0.9998557 0.9835617 -0.9834128 0.9998557 0.9835616 -0.9834128 0.9998557 0.9835615 -0.9834127 0.9998557 0.9835614 -0.9834127 0.9998557 0.9835613 -0.9834126 0.9998557 0.9835611 -0.9834125 0.9998557 0.9835609 -0.9834124 0.9998557 0.9835606 -0.9834123 0.9998557 0.9835603 -0.9834122 0.9998557 0.9835599 -0.9834122 0.9998557 0.9835595 -0.9834123 0.9998557 0.9835592 -0.9834126 0.9998557 0.9835589 -0.9834132 0.9998557 0.9835588 -0.9834141 0.9998557 0.9835588 -0.9834153 0.9998557 0.9835588 -0.9834167 0.9998557 0.9835588 -0.9834186 0.9998557 0.9835588 -0.9834209 0.9998557 0.9835588 -0.9834239 0.9998557 0.9835588 -0.9834277 0.9998557 0.9835588 -0.9834324 0.9998557 0.9835588 -0.9834385 0.9998557 0.9835588 -0.9834461 0.9998557 0.9835588 -0.9834557 0.9998557 0.9835588 -0.9834679 0.9998557 0.9835588 -0.9834833 0.9998557 0.9835588 -0.9835029 0.9998557 0.9835588 -0.9835276 0.9998557 0.9835588 -0.9835588 0.9998557 0.9835588 -0.9835983 0.9998557 0.9835588 -0.9836483 0.9998557 0.9835588 -0.9837116 0.9998557 0.9835588 -0.9837916 0.9998557 0.9835588 -0.9838928 0.9998557 0.9835588 -0.9840209 0.9998557 0.9835588 -0.9841829 0.9998557 0.9835588 -0.984388 0.9998557 0.9835588 -0.9846473 0.9998557 0.9835588 -0.9849754 0.9998557 0.9835588 -0.9853905 0.9998557 0.9835588 -0.9859157 0.9998557 0.9835588 -0.9865801 0.9998557 0.9835588 -0.9874207 0.9998557 0.9835588 -0.9884841 0.9998557 0.9835588 -0.9898295 0.9998557 0.9835588 -0.9915316 0.9998557 0.9835588 -0.9936849 0.9998557 0.9835588 -0.9964092 0.9998557 0.9835588 -0.9998557 0.9998557 0.9835588 -0.999886 0.9971537 0.9869419 -0.9999099 0.9960342 0.9896392 -0.9999288 0.9957887 0.9917859 -0.9999437 0.9959964 0.9934919 -0.9868505 0.999886 0.9869438 -0.9868505 0.999886 0.9869438 -0.9868505 0.999886 0.9869438 -0.9868505 0.999886 0.9869437 -0.9868504 0.999886 0.9869437 -0.9868504 0.999886 0.9869436 -0.9868504 0.999886 0.9869436 -0.9868503 0.999886 0.9869435 -0.9868503 0.999886 0.9869433 -0.9868502 0.999886 0.9869432 -0.9868502 0.999886 0.986943 -0.9868501 0.999886 0.9869428 -0.9868501 0.999886 0.9869426 -0.98685 0.999886 0.9869424 -0.9868501 0.999886 0.9869421 -0.9868503 0.999886 0.986942 -0.9868507 0.999886 0.9869419 -0.9868512 0.999886 0.9869419 -0.986852 0.999886 0.9869419 -0.9868529 0.999886 0.9869419 -0.9868541 0.999886 0.9869419 -0.9868555 0.999886 0.9869419 -0.9868574 0.999886 0.9869419 -0.9868597 0.999886 0.9869419 -0.9868627 0.999886 0.9869419 -0.9868665 0.999886 0.9869419 -0.9868713 0.999886 0.9869419 -0.9868773 0.999886 0.9869419 -0.986885 0.999886 0.9869419 -0.9868946 0.999886 0.9869419 -0.9869069 0.999886 0.9869419 -0.9869223 0.999886 0.9869419 -0.9869419 0.999886 0.9869419 -0.9869667 0.999886 0.9869419 -0.986998 0.999886 0.9869419 -0.9870376 0.999886 0.9869419 -0.9870878 0.999886 0.9869419 -0.9871512 0.999886 0.9869419 -0.9872315 0.999886 0.9869419 -0.987333 0.999886 0.9869419 -0.9874615 0.999886 0.9869419 -0.987624 0.999886 0.9869419 -0.9878296 0.999886 0.9869419 -0.9880897 0.999886 0.9869419 -0.9884188 0.999886 0.9869419 -0.9888351 0.999886 0.9869419 -0.9893618 0.999886 0.9869419 -0.9900282 0.999886 0.9869419 -0.9908712 0.999886 0.9869419 -0.9919377 0.999886 0.9869419 -0.993287 0.999886 0.9869419 -0.9949941 0.999886 0.9869419 -0.9971537 0.999886 0.9869419 -0.999886 0.999886 0.9869419 -0.9999099 0.9977452 0.9896392 -0.9999288 0.9968597 0.9917859 -0.9999437 0.9966665 0.9934919 -0.989582 0.9999099 0.9896405 -0.989582 0.9999099 0.9896404 -0.989582 0.9999099 0.9896404 -0.989582 0.9999099 0.9896404 -0.989582 0.9999099 0.9896404 -0.9895819 0.9999099 0.9896403 -0.9895819 0.9999099 0.9896403 -0.9895819 0.9999099 0.9896402 -0.9895819 0.9999099 0.9896401 -0.9895818 0.9999099 0.9896401 -0.9895818 0.9999099 0.9896399 -0.9895818 0.9999099 0.9896398 -0.9895817 0.9999099 0.9896397 -0.9895817 0.9999099 0.9896395 -0.9895817 0.9999099 0.9896394 -0.9895819 0.9999099 0.9896393 -0.9895821 0.9999099 0.9896392 -0.9895825 0.9999099 0.9896392 -0.9895829 0.9999099 0.9896392 -0.9895835 0.9999099 0.9896392 -0.9895842 0.9999099 0.9896392 -0.9895851 0.9999099 0.9896392 -0.9895863 0.9999099 0.9896392 -0.9895878 0.9999099 0.9896392 -0.9895897 0.9999099 0.9896392 -0.989592 0.9999099 0.9896392 -0.989595 0.9999099 0.9896392 -0.9895988 0.9999099 0.9896392 -0.9896036 0.9999099 0.9896392 -0.9896096 0.9999099 0.9896392 -0.9896173 0.9999099 0.9896392 -0.989627 0.9999099 0.9896392 -0.9896392 0.9999099 0.9896392 -0.9896547 0.9999099 0.9896392 -0.9896744 0.9999099 0.9896392 -0.9896992 0.9999099 0.9896392 -0.9897306 0.9999099 0.9896392 -0.9897703 0.9999099 0.9896392 -0.9898206 0.9999099 0.9896392 -0.9898842 0.9999099 0.9896392 -0.9899646 0.9999099 0.9896392 -0.9900664 0.9999099 0.9896392 -0.9901951 0.9999099 0.9896392 -0.990358 0.9999099 0.9896392 -0.9905641 0.9999099 0.9896392 -0.9908248 0.9999099 0.9896392 -0.9911547 0.9999099 0.9896392 -0.991572 0.9999099 0.9896392 -0.9920999 0.9999099 0.9896392 -0.9927678 0.9999099 0.9896392 -0.9936128 0.9999099 0.9896392 -0.9946818 0.9999099 0.9896392 -0.9960342 0.9999099 0.9896392 -0.9977452 0.9999099 0.9896392 -0.9999099 0.9999099 0.9896392 -0.9999288 0.9982146 0.9917859 -0.9999437 0.9975143 0.9934919 -0.9917501 0.9999288 0.9917867 -0.9917501 0.9999288 0.9917867 -0.9917501 0.9999288 0.9917867 -0.9917501 0.9999288 0.9917866 -0.9917501 0.9999288 0.9917866 -0.9917501 0.9999288 0.9917866 -0.99175 0.9999288 0.9917866 -0.99175 0.9999288 0.9917865 -0.99175 0.9999288 0.9917865 -0.99175 0.9999288 0.9917864 -0.99175 0.9999288 0.9917864 -0.9917499 0.9999288 0.9917863 -0.9917499 0.9999288 0.9917862 -0.9917499 0.9999288 0.9917861 -0.9917499 0.9999288 0.991786 -0.99175 0.9999288 0.9917859 -0.9917502 0.9999288 0.9917859 -0.9917504 0.9999288 0.9917859 -0.9917507 0.9999288 0.9917859 -0.991751 0.9999288 0.9917859 -0.9917515 0.9999288 0.9917859 -0.9917521 0.9999288 0.9917859 -0.9917528 0.9999288 0.9917859 -0.9917537 0.9999288 0.9917859 -0.9917549 0.9999288 0.9917859 -0.9917564 0.9999288 0.9917859 -0.9917582 0.9999288 0.9917859 -0.9917606 0.9999288 0.9917859 -0.9917636 0.9999288 0.9917859 -0.9917674 0.9999288 0.9917859 -0.9917722 0.9999288 0.9917859 -0.9917782 0.9999288 0.9917859 -0.9917859 0.9999288 0.9917859 -0.9917956 0.9999288 0.9917859 -0.9918079 0.9999288 0.9917859 -0.9918234 0.9999288 0.9917859 -0.9918431 0.9999288 0.9917859 -0.991868 0.9999288 0.9917859 -0.9918994 0.9999288 0.9917859 -0.9919392 0.9999288 0.9917859 -0.9919896 0.9999288 0.9917859 -0.9920533 0.9999288 0.9917859 -0.9921339 0.9999288 0.9917859 -0.9922358 0.9999288 0.9917859 -0.9923648 0.9999288 0.9917859 -0.992528 0.9999288 0.9917859 -0.9927345 0.9999288 0.9917859 -0.9929957 0.9999288 0.9917859 -0.9933261 0.9999288 0.9917859 -0.9937442 0.9999288 0.9917859 -0.9942731 0.9999288 0.9917859 -0.9949422 0.9999288 0.9917859 -0.9957887 0.9999288 0.9917859 -0.9968597 0.9999288 0.9917859 -0.9982146 0.9999288 0.9917859 -0.9999288 0.9999288 0.9917859 -0.9999437 0.9985868 0.9934919 -0.9934695 0.9999437 0.9934924 -0.9934695 0.9999437 0.9934924 -0.9934695 0.9999437 0.9934924 -0.9934695 0.9999437 0.9934924 -0.9934695 0.9999437 0.9934923 -0.9934695 0.9999437 0.9934923 -0.9934695 0.9999437 0.9934923 -0.9934694 0.9999437 0.9934923 -0.9934694 0.9999437 0.9934923 -0.9934694 0.9999437 0.9934922 -0.9934694 0.9999437 0.9934922 -0.9934694 0.9999437 0.9934921 -0.9934694 0.9999437 0.9934921 -0.9934694 0.9999437 0.993492 -0.9934694 0.9999437 0.993492 -0.9934694 0.9999437 0.9934919 -0.9934695 0.9999437 0.9934919 -0.9934697 0.9999437 0.9934919 -0.9934698 0.9999437 0.9934919 -0.9934701 0.9999437 0.9934919 -0.9934704 0.9999437 0.9934919 -0.9934707 0.9999437 0.9934919 -0.9934712 0.9999437 0.9934919 -0.9934718 0.9999437 0.9934919 -0.9934725 0.9999437 0.9934919 -0.9934734 0.9999437 0.9934919 -0.9934746 0.9999437 0.9934919 -0.9934761 0.9999437 0.9934919 -0.9934779 0.9999437 0.9934919 -0.9934803 0.9999437 0.9934919 -0.9934833 0.9999437 0.9934919 -0.9934871 0.9999437 0.9934919 -0.9934919 0.9999437 0.9934919 -0.993498 0.9999437 0.9934919 -0.9935057 0.9999437 0.9934919 -0.9935154 0.9999437 0.9934919 -0.9935277 0.9999437 0.9934919 -0.9935432 0.9999437 0.9934919 -0.9935629 0.9999437 0.9934919 -0.9935878 0.9999437 0.9934919 -0.9936193 0.9999437 0.9934919 -0.9936592 0.9999437 0.9934919 -0.9937096 0.9999437 0.9934919 -0.9937734 0.9999437 0.9934919 -0.9938541 0.9999437 0.9934919 -0.9939562 0.9999437 0.9934919 -0.9940854 0.9999437 0.9934919 -0.9942488 0.9999437 0.9934919 -0.9944556 0.9999437 0.9934919 -0.9947172 0.9999437 0.9934919 -0.9950481 0.9999437 0.9934919 -0.9954668 0.9999437 0.9934919 -0.9959964 0.9999437 0.9934919 -0.9966665 0.9999437 0.9934919 -0.9975143 0.9999437 0.9934919 -0.9985868 0.9999437 0.9934919 -0.9999437 0.9999437 0.9934919 -0.3454107 0.3454107 0.9858181 -0.3454831 0.3454107 0.9858181 -0.3455746 0.3454107 0.9858181 -0.3456905 0.3454107 0.9858181 -0.3458371 0.3454107 0.9858181 -0.3460225 0.3454107 0.9858181 -0.3462571 0.3454107 0.9858181 -0.3465539 0.3454107 0.9858181 -0.3469293 0.3454107 0.9858181 -0.3474044 0.3454107 0.9858181 -0.3480054 0.3454107 0.9858181 -0.3487657 0.3454107 0.9858181 -0.3497276 0.3454107 0.9858181 -0.3509445 0.3454107 0.9858181 -0.352484 0.3454107 0.9858181 -0.3544318 0.3454107 0.9858181 -0.3568959 0.3454107 0.9858181 -0.3600134 0.3454107 0.9858181 -0.3639574 0.3454107 0.9858181 -0.3689471 0.3454107 0.9858181 -0.3752597 0.3454107 0.9858181 -0.3832459 0.3454107 0.9858181 -0.3933496 0.3454107 0.9858181 -0.406132 0.3454107 0.9858181 -0.4223035 0.3454107 0.9858181 -0.4427624 0.3454107 0.9858181 -0.4686457 0.3454107 0.9858181 -0.5013914 0.3454107 0.9858181 -0.5428189 0.3454107 0.9858181 -0.5952302 0.3454107 0.9858181 -0.6615372 0.3454107 0.9858181 -0.7454243 0.3454107 0.9858181 -0.8515523 0.3454107 0.9858181 -0.9858181 0.3454107 0.9858181 -0.9890841 0.4144197 0.8686126 -0.9915469 0.4834235 0.8008399 -0.993424 0.5504963 0.7691886 -0.9948662 0.6139459 0.7626012 -0.9959813 0.6724572 0.7722508 -0.9968475 0.7251659 0.7914042 -0.997523 0.7716588 0.8151851 -0.9980513 0.8119154 0.8402679 -0.9984653 0.8462171 0.8645475 -0.9987905 0.8750477 0.8868238 -0.9990461 0.8990028 0.9065282 -0.9992474 0.9187175 0.9235056 -0.999406 0.9348153 0.9378508 -0.999531 0.9478754 0.9497943 -0.9996296 0.958416 0.9596261 -0.9997074 0.9668873 0.967649 -0.9997689 0.9736726 0.9741514 -0.9998174 0.9790927 0.9793932 -0.9998557 0.9834129 0.9836014 -0.999886 0.9868505 0.9869686 -0.9999099 0.989582 0.989656 -0.9999288 0.9917501 0.9917964 -0.9999437 0.9934695 0.9934985 -0.3454107 0.3454831 0.9858181 -0.3453807 0.3453807 0.9858163 -0.3454723 0.3453807 0.9858163 -0.3455882 0.3453807 0.9858163 -0.3457348 0.3453807 0.9858163 -0.3459203 0.3453807 0.9858163 -0.3461549 0.3453807 0.9858163 -0.3464517 0.3453807 0.9858163 -0.3468273 0.3453807 0.9858163 -0.3473024 0.3453807 0.9858163 -0.3479034 0.3453807 0.9858163 -0.3486639 0.3453807 0.9858163 -0.3496259 0.3453807 0.9858163 -0.350843 0.3453807 0.9858163 -0.3523828 0.3453807 0.9858163 -0.3543309 0.3453807 0.9858163 -0.3567954 0.3453807 0.9858163 -0.3599134 0.3453807 0.9858163 -0.363858 0.3453807 0.9858163 -0.3688485 0.3453807 0.9858163 -0.3751621 0.3453807 0.9858163 -0.3831496 0.3453807 0.9858163 -0.3932548 0.3453807 0.9858163 -0.4060392 0.3453807 0.9858163 -0.4222132 0.3453807 0.9858163 -0.4426754 0.3453807 0.9858163 -0.4685627 0.3453807 0.9858163 -0.5013136 0.3453807 0.9858163 -0.5427476 0.3453807 0.9858163 -0.5951671 0.3453807 0.9858163 -0.6614846 0.3453807 0.9858163 -0.7453848 0.3453807 0.9858163 -0.8515295 0.3453807 0.9858163 -0.9858163 0.3453807 0.9858163 -0.9890831 0.4143955 0.8685959 -0.9915463 0.4834045 0.800819 -0.9934236 0.5504818 0.7691686 -0.994866 0.6139352 0.7625844 -0.9959811 0.6724495 0.7722376 -0.9968474 0.7251605 0.7913944 -0.997523 0.7716551 0.8151781 -0.9980512 0.8119128 0.840263 -0.9984653 0.8462154 0.8645442 -0.9987905 0.8750466 0.8868215 -0.9990461 0.899002 0.9065267 -0.9992474 0.918717 0.9235046 -0.999406 0.9348149 0.9378502 -0.999531 0.9478752 0.9497939 -0.9996296 0.9584159 0.9596259 -0.9997074 0.9668872 0.9676489 -0.9997689 0.9736726 0.9741513 -0.9998174 0.9790927 0.9793932 -0.9998557 0.9834129 0.9836014 -0.999886 0.9868505 0.9869686 -0.9999099 0.989582 0.9896559 -0.9999288 0.9917501 0.9917964 -0.9999437 0.9934695 0.9934984 -0.3454107 0.3455746 0.9858181 -0.3453807 0.3454723 0.9858163 -0.3453439 0.3453439 0.9858141 -0.3454598 0.3453439 0.9858141 -0.3456064 0.3453439 0.9858141 -0.3457919 0.3453439 0.9858141 -0.3460265 0.3453439 0.9858141 -0.3463234 0.3453439 0.9858141 -0.3466991 0.3453439 0.9858141 -0.3471743 0.3453439 0.9858141 -0.3477754 0.3453439 0.9858141 -0.348536 0.3453439 0.9858141 -0.3494983 0.3453439 0.9858141 -0.3507156 0.3453439 0.9858141 -0.3522557 0.3453439 0.9858141 -0.3542041 0.3453439 0.9858141 -0.3566692 0.3453439 0.9858141 -0.3597877 0.3453439 0.9858141 -0.3637331 0.3453439 0.9858141 -0.3687246 0.3453439 0.9858141 -0.3750394 0.3453439 0.9858141 -0.3830285 0.3453439 0.9858141 -0.3931357 0.3453439 0.9858141 -0.4059227 0.3453439 0.9858141 -0.4220999 0.3453439 0.9858141 -0.4425661 0.3453439 0.9858141 -0.4684585 0.3453439 0.9858141 -0.5012158 0.3453439 0.9858141 -0.542658 0.3453439 0.9858141 -0.5950879 0.3453439 0.9858141 -0.6614184 0.3453439 0.9858141 -0.7453352 0.3453439 0.9858141 -0.8515008 0.3453439 0.9858141 -0.9858141 0.3453439 0.9858141 -0.9890818 0.4143657 0.868575 -0.9915455 0.4833811 0.8007926 -0.9934231 0.550464 0.7691435 -0.9948657 0.6139219 0.7625632 -0.9959809 0.6724399 0.772221 -0.9968473 0.7251537 0.7913821 -0.9975229 0.7716504 0.8151693 -0.9980512 0.8119096 0.8402569 -0.9984653 0.8462132 0.86454 -0.9987904 0.8750451 0.8868187 -0.9990461 0.8990011 0.9065249 -0.9992474 0.9187164 0.9235034 -0.999406 0.9348146 0.9378494 -0.999531 0.947875 0.9497934 -0.9996296 0.9584157 0.9596255 -0.9997074 0.9668871 0.9676487 -0.9997689 0.9736725 0.9741511 -0.9998174 0.9790927 0.9793931 -0.9998557 0.9834129 0.9836013 -0.999886 0.9868505 0.9869685 -0.9999099 0.989582 0.9896559 -0.9999288 0.9917501 0.9917964 -0.9999437 0.9934695 0.9934984 -0.3454107 0.3456905 0.9858181 -0.3453807 0.3455882 0.9858163 -0.3453439 0.3454598 0.9858141 -0.3452987 0.3452987 0.9858113 -0.3454454 0.3452987 0.9858113 -0.3456309 0.3452987 0.9858113 -0.3458657 0.3452987 0.9858113 -0.3461627 0.3452987 0.9858113 -0.3465384 0.3452987 0.9858113 -0.3470137 0.3452987 0.9858113 -0.347615 0.3452987 0.9858113 -0.3483758 0.3452987 0.9858113 -0.3493382 0.3452987 0.9858113 -0.3505559 0.3452987 0.9858113 -0.3520964 0.3452987 0.9858113 -0.3540453 0.3452987 0.9858113 -0.3565109 0.3452987 0.9858113 -0.3596303 0.3452987 0.9858113 -0.3635767 0.3452987 0.9858113 -0.3685693 0.3452987 0.9858113 -0.3748857 0.3452987 0.9858113 -0.3828768 0.3452987 0.9858113 -0.3929865 0.3452987 0.9858113 -0.4057766 0.3452987 0.9858113 -0.4219578 0.3452987 0.9858113 -0.4424291 0.3452987 0.9858113 -0.4683279 0.3452987 0.9858113 -0.5010933 0.3452987 0.9858113 -0.5425458 0.3452987 0.9858113 -0.5949885 0.3452987 0.9858113 -0.6613355 0.3452987 0.9858113 -0.745273 0.3452987 0.9858113 -0.8514648 0.3452987 0.9858113 -0.9858113 0.3452987 0.9858113 -0.9890801 0.414329 0.8685488 -0.9915446 0.4833522 0.8007596 -0.9934225 0.5504419 0.769112 -0.9948653 0.6139056 0.7625367 -0.9959807 0.672428 0.7722003 -0.9968472 0.7251454 0.7913667 -0.9975228 0.7716446 0.8151582 -0.9980511 0.8119057 0.8402492 -0.9984653 0.8462106 0.8645348 -0.9987904 0.8750434 0.8868152 -0.9990461 0.899 0.9065226 -0.9992474 0.9187157 0.9235019 -0.999406 0.9348141 0.9378484 -0.999531 0.9478746 0.9497927 -0.9996296 0.9584155 0.9596251 -0.9997074 0.966887 0.9676484 -0.9997689 0.9736724 0.974151 -0.9998174 0.9790926 0.979393 -0.9998557 0.9834129 0.9836012 -0.999886 0.9868505 0.9869685 -0.9999099 0.989582 0.9896559 -0.9999288 0.9917501 0.9917963 -0.9999437 0.9934695 0.9934984 -0.3454107 0.3458371 0.9858181 -0.3453807 0.3457348 0.9858163 -0.3453439 0.3456064 0.9858141 -0.3452987 0.3454454 0.9858113 -0.3452442 0.3452442 0.9858079 -0.3454298 0.3452442 0.9858079 -0.3456646 0.3452442 0.9858079 -0.3459616 0.3452442 0.9858079 -0.3463375 0.3452442 0.9858079 -0.3468129 0.3452442 0.9858079 -0.3474144 0.3452442 0.9858079 -0.3481754 0.3452442 0.9858079 -0.3491382 0.3452442 0.9858079 -0.3503562 0.3452442 0.9858079 -0.3518972 0.3452442 0.9858079 -0.3538467 0.3452442 0.9858079 -0.3563131 0.3452442 0.9858079 -0.3594334 0.3452442 0.9858079 -0.363381 0.3452442 0.9858079 -0.3683752 0.3452442 0.9858079 -0.3746936 0.3452442 0.9858079 -0.3826871 0.3452442 0.9858079 -0.3928 0.3452442 0.9858079 -0.405594 0.3452442 0.9858079 -0.4217802 0.3452442 0.9858079 -0.4422578 0.3452442 0.9858079 -0.4681646 0.3452442 0.9858079 -0.5009401 0.3452442 0.9858079 -0.5424054 0.3452442 0.9858079 -0.5948644 0.3452442 0.9858079 -0.6612318 0.3452442 0.9858079 -0.7451952 0.3452442 0.9858079 -0.8514199 0.3452442 0.9858079 -0.9858079 0.3452442 0.9858079 -0.9890781 0.4142845 0.868516 -0.9915433 0.4833171 0.8007184 -0.9934218 0.550415 0.7690727 -0.9948649 0.6138855 0.7625036 -0.9959804 0.6724135 0.7721744 -0.996847 0.7251351 0.7913474 -0.9975227 0.7716375 0.8151444 -0.9980511 0.8119009 0.8402396 -0.9984652 0.8462073 0.8645282 -0.9987904 0.8750412 0.8868108 -0.9990461 0.8989986 0.9065197 -0.9992474 0.9187148 0.9235 -0.999406 0.9348135 0.9378472 -0.999531 0.9478743 0.949792 -0.9996296 0.9584153 0.9596246 -0.9997074 0.9668869 0.9676481 -0.9997689 0.9736723 0.9741508 -0.9998174 0.9790925 0.9793929 -0.9998557 0.9834128 0.9836012 -0.999886 0.9868504 0.9869685 -0.9999099 0.989582 0.9896559 -0.9999288 0.9917501 0.9917963 -0.9999437 0.9934695 0.9934984 -0.3454107 0.3460225 0.9858181 -0.3453807 0.3459203 0.9858163 -0.3453439 0.3457919 0.9858141 -0.3452987 0.3456309 0.9858113 -0.3452442 0.3454298 0.9858079 -0.3451791 0.3451791 0.9858036 -0.345414 0.3451791 0.9858036 -0.3457112 0.3451791 0.9858036 -0.3460872 0.3451791 0.9858036 -0.3465628 0.3451791 0.9858036 -0.3471646 0.3451791 0.9858036 -0.3479259 0.3451791 0.9858036 -0.348889 0.3451791 0.9858036 -0.3501075 0.3451791 0.9858036 -0.351649 0.3451791 0.9858036 -0.3535993 0.3451791 0.9858036 -0.3560667 0.3451791 0.9858036 -0.3591882 0.3451791 0.9858036 -0.3631373 0.3451791 0.9858036 -0.3681334 0.3451791 0.9858036 -0.3744542 0.3451791 0.9858036 -0.3824508 0.3451791 0.9858036 -0.3925675 0.3451791 0.9858036 -0.4053665 0.3451791 0.9858036 -0.4215589 0.3451791 0.9858036 -0.4420444 0.3451791 0.9858036 -0.4679612 0.3451791 0.9858036 -0.5007493 0.3451791 0.9858036 -0.5422305 0.3451791 0.9858036 -0.5947097 0.3451791 0.9858036 -0.6611026 0.3451791 0.9858036 -0.7450984 0.3451791 0.9858036 -0.8513639 0.3451791 0.9858036 -0.9858036 0.3451791 0.9858036 -0.9890755 0.4142311 0.8684752 -0.9915418 0.4832747 0.800667 -0.9934209 0.5503825 0.7690236 -0.9948643 0.6138613 0.7624623 -0.9959801 0.6723959 0.7721421 -0.9968468 0.7251226 0.7913234 -0.9975226 0.7716288 0.8151272 -0.998051 0.8118949 0.8402276 -0.9984652 0.8462034 0.86452 -0.9987904 0.8750386 0.8868054 -0.9990461 0.8989969 0.9065161 -0.9992474 0.9187137 0.9234977 -0.9994059 0.9348128 0.9378457 -0.999531 0.9478738 0.949791 -0.9996296 0.958415 0.959624 -0.9997074 0.9668867 0.9676477 -0.9997689 0.9736722 0.9741505 -0.9998174 0.9790925 0.9793927 -0.9998557 0.9834128 0.9836011 -0.999886 0.9868504 0.9869684 -0.9999099 0.9895819 0.9896558 -0.9999288 0.9917501 0.9917963 -0.9999437 0.9934695 0.9934984 -0.3454107 0.3462571 0.9858181 -0.3453807 0.3461549 0.9858163 -0.3453439 0.3460265 0.9858141 -0.3452987 0.3458657 0.9858113 -0.3452442 0.3456646 0.9858079 -0.3451791 0.345414 0.9858036 -0.3451032 0.3451032 0.9857982 -0.3454005 0.3451032 0.9857982 -0.3457767 0.3451032 0.9857982 -0.3462526 0.3451032 0.9857982 -0.3468546 0.3451032 0.9857982 -0.3476163 0.3451032 0.9857982 -0.3485799 0.3451032 0.9857982 -0.3497989 0.3451032 0.9857982 -0.3513412 0.3451032 0.9857982 -0.3532924 0.3451032 0.9857982 -0.3557609 0.3451032 0.9857982 -0.3588839 0.3451032 0.9857982 -0.3628349 0.3451032 0.9857982 -0.3678335 0.3451032 0.9857982 -0.3741573 0.3451032 0.9857982 -0.3821577 0.3451032 0.9857982 -0.3922792 0.3451032 0.9857982 -0.4050843 0.3451032 0.9857982 -0.4212844 0.3451032 0.9857982 -0.4417797 0.3451032 0.9857982 -0.4677088 0.3451032 0.9857982 -0.5005126 0.3451032 0.9857982 -0.5420136 0.3451032 0.9857982 -0.5945178 0.3451032 0.9857982 -0.6609424 0.3451032 0.9857982 -0.7449782 0.3451032 0.9857982 -0.8512944 0.3451032 0.9857982 -0.9857982 0.3451032 0.9857982 -0.9890723 0.4141683 0.8684246 -0.9915399 0.4832246 0.8006032 -0.9934197 0.5503438 0.7689629 -0.9948636 0.6138323 0.7624111 -0.9959797 0.6723748 0.7721021 -0.9968465 0.7251076 0.7912937 -0.9975224 0.7716184 0.8151059 -0.9980509 0.8118878 0.8402127 -0.9984651 0.8461986 0.8645099 -0.9987903 0.8750355 0.8867986 -0.9990461 0.8989948 0.9065116 -0.9992473 0.9187123 0.9234947 -0.9994059 0.9348119 0.9378438 -0.999531 0.9478733 0.9497898 -0.9996296 0.9584146 0.9596232 -0.9997074 0.9668865 0.9676472 -0.9997689 0.9736721 0.9741502 -0.9998174 0.9790924 0.9793925 -0.9998557 0.9834127 0.9836009 -0.999886 0.9868504 0.9869683 -0.9999099 0.9895819 0.9896558 -0.9999288 0.99175 0.9917963 -0.9999437 0.9934695 0.9934984 -0.3454107 0.3465539 0.9858181 -0.3453807 0.3464517 0.9858163 -0.3453439 0.3463234 0.9858141 -0.3452987 0.3461627 0.9858113 -0.3452442 0.3459616 0.9858079 -0.3451791 0.3457112 0.9858036 -0.3451032 0.3454005 0.9857982 -0.3450175 0.3450175 0.9857916 -0.3453938 0.3450175 0.9857916 -0.34587 0.3450175 0.9857916 -0.3464724 0.3450175 0.9857916 -0.3472345 0.3450175 0.9857916 -0.3481986 0.3450175 0.9857916 -0.3494184 0.3450175 0.9857916 -0.3509616 0.3450175 0.9857916 -0.352914 0.3450175 0.9857916 -0.355384 0.3450175 0.9857916 -0.3585088 0.3450175 0.9857916 -0.3624621 0.3450175 0.9857916 -0.3674636 0.3450175 0.9857916 -0.3737911 0.3450175 0.9857916 -0.3817962 0.3450175 0.9857916 -0.3919237 0.3450175 0.9857916 -0.4047363 0.3450175 0.9857916 -0.420946 0.3450175 0.9857916 -0.4414533 0.3450175 0.9857916 -0.4673977 0.3450175 0.9857916 -0.5002207 0.3450175 0.9857916 -0.5417461 0.3450175 0.9857916 -0.5942812 0.3450175 0.9857916 -0.6607448 0.3450175 0.9857916 -0.74483 0.3450175 0.9857916 -0.8512087 0.3450175 0.9857916 -0.9857916 0.3450175 0.9857916 -0.9890684 0.4140964 0.8683621 -0.9915376 0.4831666 0.8005247 -0.9934183 0.5502987 0.7688879 -0.9948628 0.6137984 0.762348 -0.9959791 0.67235 0.7720527 -0.9968462 0.7250899 0.791257 -0.9975222 0.7716061 0.8150796 -0.9980508 0.8118794 0.8401944 -0.998465 0.8461929 0.8644975 -0.9987903 0.8750317 0.8867903 -0.999046 0.8989923 0.9065061 -0.9992473 0.9187107 0.9234912 -0.9994059 0.9348109 0.9378415 -0.999531 0.9478726 0.9497883 -0.9996296 0.9584142 0.9596223 -0.9997074 0.9668862 0.9676466 -0.9997689 0.9736719 0.9741498 -0.9998174 0.9790923 0.9793923 -0.9998557 0.9834127 0.9836008 -0.999886 0.9868503 0.9869682 -0.9999099 0.9895819 0.9896557 -0.9999288 0.99175 0.9917962 -0.9999437 0.9934694 0.9934984 -0.3454107 0.3469293 0.9858181 -0.3453807 0.3468273 0.9858163 -0.3453439 0.3466991 0.9858141 -0.3452987 0.3465384 0.9858113 -0.3452442 0.3463375 0.9858079 -0.3451791 0.3460872 0.9858036 -0.3451032 0.3457767 0.9857982 -0.3450175 0.3453938 0.9857916 -0.3449254 0.3449254 0.9857835 -0.3454019 0.3449254 0.9857835 -0.3460047 0.3449254 0.9857835 -0.3467674 0.3449254 0.9857835 -0.3477322 0.3449254 0.9857835 -0.3489529 0.3449254 0.9857835 -0.3504972 0.3449254 0.9857835 -0.352451 0.3449254 0.9857835 -0.3549227 0.3449254 0.9857835 -0.3580498 0.3449254 0.9857835 -0.362006 0.3449254 0.9857835 -0.367011 0.3449254 0.9857835 -0.3733431 0.3449254 0.9857835 -0.3813539 0.3449254 0.9857835 -0.3914887 0.3449254 0.9857835 -0.4043106 0.3449254 0.9857835 -0.4205319 0.3449254 0.9857835 -0.4410539 0.3449254 0.9857835 -0.467017 0.3449254 0.9857835 -0.4998636 0.3449254 0.9857835 -0.5414188 0.3449254 0.9857835 -0.5939917 0.3449254 0.9857835 -0.6605031 0.3449254 0.9857835 -0.7446487 0.3449254 0.9857835 -0.8511039 0.3449254 0.9857835 -0.9857835 0.3449254 0.9857835 -0.9890637 0.4140176 0.8682858 -0.9915347 0.4831021 0.8004286 -0.9934166 0.550248 0.7687963 -0.9948617 0.6137599 0.7622708 -0.9959785 0.6723217 0.7719924 -0.9968458 0.7250697 0.7912121 -0.997522 0.7715919 0.8150475 -0.9980506 0.8118697 0.8401721 -0.9984649 0.8461864 0.8644822 -0.9987902 0.8750274 0.8867801 -0.999046 0.8989895 0.9064994 -0.9992473 0.9187089 0.9234868 -0.9994059 0.9348097 0.9378386 -0.999531 0.9478718 0.9497865 -0.9996296 0.9584137 0.9596211 -0.9997074 0.9668859 0.9676459 -0.9997689 0.9736717 0.9741494 -0.9998174 0.9790921 0.979392 -0.9998557 0.9834126 0.9836006 -0.999886 0.9868503 0.9869681 -0.9999099 0.9895819 0.9896557 -0.9999288 0.99175 0.9917962 -0.9999437 0.9934694 0.9934983 -0.3454107 0.3474044 0.9858181 -0.3453807 0.3473024 0.9858163 -0.3453439 0.3471743 0.9858141 -0.3452987 0.3470137 0.9858113 -0.3452442 0.3468129 0.9858079 -0.3451791 0.3465628 0.9858036 -0.3451032 0.3462526 0.9857982 -0.3450175 0.34587 0.9857916 -0.3449254 0.3454019 0.9857835 -0.3448353 0.3448353 0.9857738 -0.3454387 0.3448353 0.9857738 -0.346202 0.3448353 0.9857738 -0.3471677 0.3448353 0.9857738 -0.3483894 0.3448353 0.9857738 -0.3499351 0.3448353 0.9857738 -0.3518905 0.3448353 0.9857738 -0.3543644 0.3448353 0.9857738 -0.3574942 0.3448353 0.9857738 -0.3614538 0.3448353 0.9857738 -0.3664632 0.3448353 0.9857738 -0.3728008 0.3448353 0.9857738 -0.3808186 0.3448353 0.9857738 -0.3909622 0.3448353 0.9857738 -0.4037952 0.3448353 0.9857738 -0.4200306 0.3448353 0.9857738 -0.4405705 0.3448353 0.9857738 -0.4665561 0.3448353 0.9857738 -0.4994313 0.3448353 0.9857738 -0.5410227 0.3448353 0.9857738 -0.5936412 0.3448353 0.9857738 -0.6602105 0.3448353 0.9857738 -0.7444293 0.3448353 0.9857738 -0.850977 0.3448353 0.9857738 -0.9857738 0.3448353 0.9857738 -0.9890579 0.4139373 0.8681933 -0.9915312 0.4830346 0.8003123 -0.9934145 0.5501939 0.7686854 -0.9948604 0.6137183 0.7621775 -0.9959777 0.6722907 0.7719194 -0.9968453 0.7250473 0.7911579 -0.9975217 0.7715762 0.8150086 -0.9980504 0.8118589 0.840145 -0.9984648 0.8461791 0.8644638 -0.9987902 0.8750225 0.8867677 -0.9990459 0.8989863 0.9064912 -0.9992473 0.9187068 0.9234815 -0.9994059 0.9348083 0.9378352 -0.9995309 0.947871 0.9497843 -0.9996296 0.9584132 0.9596197 -0.9997074 0.9668855 0.967645 -0.9997689 0.9736715 0.9741488 -0.9998174 0.979092 0.9793916 -0.9998557 0.9834125 0.9836004 -0.999886 0.9868502 0.986968 -0.9999099 0.9895818 0.9896556 -0.9999288 0.99175 0.9917961 -0.9999437 0.9934694 0.9934983 -0.3454107 0.3480054 0.9858181 -0.3453807 0.3479034 0.9858163 -0.3453439 0.3477754 0.9858141 -0.3452987 0.347615 0.9858113 -0.3452442 0.3474144 0.9858079 -0.3451791 0.3471646 0.9858036 -0.3451032 0.3468546 0.9857982 -0.3450175 0.3464724 0.9857916 -0.3449254 0.3460047 0.9857835 -0.3448353 0.3454387 0.9857738 -0.3447636 0.3447636 0.9857621 -0.3455277 0.3447636 0.9857621 -0.3464944 0.3447636 0.9857621 -0.3477174 0.3447636 0.9857621 -0.3492646 0.3447636 0.9857621 -0.3512221 0.3447636 0.9857621 -0.3536986 0.3447636 0.9857621 -0.3568316 0.3447636 0.9857621 -0.3607953 0.3447636 0.9857621 -0.3658099 0.3447636 0.9857621 -0.3721541 0.3447636 0.9857621 -0.3801802 0.3447636 0.9857621 -0.3903343 0.3447636 0.9857621 -0.4031806 0.3447636 0.9857621 -0.4194328 0.3447636 0.9857621 -0.439994 0.3447636 0.9857621 -0.4660065 0.3447636 0.9857621 -0.4989158 0.3447636 0.9857621 -0.5405503 0.3447636 0.9857621 -0.5932233 0.3447636 0.9857621 -0.6598616 0.3447636 0.9857621 -0.7441676 0.3447636 0.9857621 -0.8508257 0.3447636 0.9857621 -0.9857621 0.3447636 0.9857621 -0.989051 0.4138668 0.8680831 -0.9915271 0.4829718 0.8001737 -0.993412 0.5501416 0.7685533 -0.9948589 0.6136769 0.7620663 -0.9959768 0.6722594 0.7718325 -0.9968448 0.7250244 0.7910933 -0.9975213 0.7715599 0.8149624 -0.9980502 0.8118476 0.8401128 -0.9984647 0.8461714 0.8644419 -0.9987901 0.8750173 0.8867531 -0.9990459 0.8989829 0.9064815 -0.9992472 0.9187045 0.9234751 -0.9994059 0.9348069 0.9378311 -0.9995309 0.94787 0.9497816 -0.9996296 0.9584126 0.959618 -0.9997074 0.9668852 0.9676439 -0.9997689 0.9736712 0.9741481 -0.9998174 0.9790919 0.9793912 -0.9998557 0.9834124 0.9836001 -0.999886 0.9868502 0.9869678 -0.9999099 0.9895818 0.9896555 -0.9999288 0.99175 0.9917961 -0.9999437 0.9934694 0.9934983 -0.3454107 0.3487657 0.9858181 -0.3453807 0.3486639 0.9858163 -0.3453439 0.348536 0.9858141 -0.3452987 0.3483758 0.9858113 -0.3452442 0.3481754 0.9858079 -0.3451791 0.3479259 0.9858036 -0.3451032 0.3476163 0.9857982 -0.3450175 0.3472345 0.9857916 -0.3449254 0.3467674 0.9857835 -0.3448353 0.346202 0.9857738 -0.3447636 0.3455277 0.9857621 -0.3447407 0.3447407 0.9857485 -0.3457085 0.3447407 0.9857485 -0.346933 0.3447407 0.9857485 -0.3484821 0.3447407 0.9857485 -0.350442 0.3447407 0.9857485 -0.3529214 0.3447407 0.9857485 -0.3560582 0.3447407 0.9857485 -0.3600267 0.3447407 0.9857485 -0.3650474 0.3447407 0.9857485 -0.3713992 0.3447407 0.9857485 -0.379435 0.3447407 0.9857485 -0.3896014 0.3447407 0.9857485 -0.4024632 0.3447407 0.9857485 -0.4187351 0.3447407 0.9857485 -0.4393211 0.3447407 0.9857485 -0.465365 0.3447407 0.9857485 -0.498314 0.3447407 0.9857485 -0.5399988 0.3447407 0.9857485 -0.5927355 0.3447407 0.9857485 -0.6594543 0.3447407 0.9857485 -0.7438622 0.3447407 0.9857485 -0.8506491 0.3447407 0.9857485 -0.9857485 0.3447407 0.9857485 -0.989043 0.4138277 0.8679546 -0.9915223 0.4829286 0.800012 -0.9934091 0.5501012 0.7683993 -0.9948571 0.6136427 0.7619366 -0.9959757 0.6722322 0.7717312 -0.9968441 0.7250039 0.791018 -0.9975209 0.7715449 0.8149084 -0.99805 0.811837 0.8400752 -0.9984645 0.8461641 0.8644163 -0.99879 0.8750124 0.8867359 -0.9990458 0.8989796 0.9064702 -0.9992472 0.9187024 0.9234678 -0.9994059 0.9348055 0.9378263 -0.9995309 0.9478691 0.9497786 -0.9996296 0.958412 0.9596161 -0.9997074 0.9668848 0.9676427 -0.9997689 0.973671 0.9741473 -0.9998174 0.9790917 0.9793907 -0.9998557 0.9834123 0.9835998 -0.999886 0.9868501 0.9869676 -0.9999099 0.9895818 0.9896553 -0.9999288 0.9917499 0.991796 -0.9999437 0.9934694 0.9934982 -0.3454107 0.3497276 0.9858181 -0.3453807 0.3496259 0.9858163 -0.3453439 0.3494983 0.9858141 -0.3452987 0.3493382 0.9858113 -0.3452442 0.3491382 0.9858079 -0.3451791 0.348889 0.9858036 -0.3451032 0.3485799 0.9857982 -0.3450175 0.3481986 0.9857916 -0.3449254 0.3477322 0.9857835 -0.3448353 0.3471677 0.9857738 -0.3447636 0.3464944 0.9857621 -0.3447407 0.3457085 0.9857485 -0.3448204 0.3448204 0.9857332 -0.3460466 0.3448204 0.9857332 -0.3475978 0.3448204 0.9857332 -0.3495603 0.3448204 0.9857332 -0.3520431 0.3448204 0.9857332 -0.3551842 0.3448204 0.9857332 -0.3591581 0.3448204 0.9857332 -0.3641857 0.3448204 0.9857332 -0.3705461 0.3448204 0.9857332 -0.3785929 0.3448204 0.9857332 -0.3887731 0.3448204 0.9857332 -0.4016525 0.3448204 0.9857332 -0.4179465 0.3448204 0.9857332 -0.4385606 0.3448204 0.9857332 -0.4646401 0.3448204 0.9857332 -0.497634 0.3448204 0.9857332 -0.5393756 0.3448204 0.9857332 -0.5921842 0.3448204 0.9857332 -0.658994 0.3448204 0.9857332 -0.743517 0.3448204 0.9857332 -0.8504495 0.3448204 0.9857332 -0.9857332 0.3448204 0.9857332 -0.9890339 0.4138582 0.8678093 -0.9915169 0.4829319 0.7998295 -0.9934058 0.5500915 0.7682253 -0.9948551 0.6136284 0.7617903 -0.9959745 0.672218 0.7716168 -0.9968433 0.7249916 0.790933 -0.9975204 0.7715352 0.8148475 -0.9980497 0.8118298 0.8400329 -0.9984643 0.8461589 0.8643874 -0.9987899 0.8750088 0.8867166 -0.9990458 0.8989771 0.9064575 -0.9992472 0.9187008 0.9234595 -0.9994058 0.9348044 0.937821 -0.9995309 0.9478684 0.9497751 -0.9996296 0.9584115 0.9596139 -0.9997074 0.9668845 0.9676413 -0.9997689 0.9736708 0.9741464 -0.9998174 0.9790916 0.9793901 -0.9998557 0.9834122 0.9835994 -0.999886 0.9868501 0.9869674 -0.9999099 0.9895817 0.9896552 -0.9999288 0.9917499 0.9917959 -0.9999437 0.9934694 0.9934981 -0.3454107 0.3509445 0.9858181 -0.3453807 0.350843 0.9858163 -0.3453439 0.3507156 0.9858141 -0.3452987 0.3505559 0.9858113 -0.3452442 0.3503562 0.9858079 -0.3451791 0.3501075 0.9858036 -0.3451032 0.3497989 0.9857982 -0.3450175 0.3494184 0.9857916 -0.3449254 0.3489529 0.9857835 -0.3448353 0.3483894 0.9857738 -0.3447636 0.3477174 0.9857621 -0.3447407 0.346933 0.9857485 -0.3448204 0.3460466 0.9857332 -0.3450957 0.3450957 0.9857167 -0.3466492 0.3450957 0.9857167 -0.3486146 0.3450957 0.9857167 -0.351101 0.3450957 0.9857167 -0.3542467 0.3450957 0.9857167 -0.3582264 0.3450957 0.9857167 -0.3632613 0.3450957 0.9857167 -0.369631 0.3450957 0.9857167 -0.3776896 0.3450957 0.9857167 -0.3878847 0.3450957 0.9857167 -0.4007829 0.3450957 0.9857167 -0.4171007 0.3450957 0.9857167 -0.4377449 0.3450957 0.9857167 -0.4638625 0.3450957 0.9857167 -0.4969046 0.3450957 0.9857167 -0.5387072 0.3450957 0.9857167 -0.5915929 0.3450957 0.9857167 -0.6585002 0.3450957 0.9857167 -0.7431467 0.3450957 0.9857167 -0.8502355 0.3450957 0.9857167 -0.9857167 0.3450957 0.9857167 -0.9890241 0.4140252 0.8676536 -0.991511 0.4830292 0.7996338 -0.9934023 0.5501456 0.7680389 -0.994853 0.6136569 0.7616334 -0.9959732 0.672232 0.7714942 -0.9968425 0.7249978 0.7908419 -0.9975199 0.7715376 0.8147824 -0.9980494 0.8118303 0.8399875 -0.9984642 0.8461587 0.8643565 -0.9987897 0.8750084 0.886696 -0.9990457 0.8989767 0.9064439 -0.9992471 0.9187004 0.9234506 -0.9994058 0.9348042 0.9378152 -0.9995309 0.9478683 0.9497714 -0.9996295 0.9584114 0.9596115 -0.9997074 0.9668844 0.9676398 -0.9997689 0.9736708 0.9741455 -0.9998174 0.9790916 0.9793895 -0.9998557 0.9834122 0.9835991 -0.999886 0.98685 0.9869671 -0.9999099 0.9895817 0.989655 -0.9999288 0.9917499 0.9917958 -0.9999437 0.9934694 0.9934981 -0.3454107 0.352484 0.9858181 -0.3453807 0.3523828 0.9858163 -0.3453439 0.3522557 0.9858141 -0.3452987 0.3520964 0.9858113 -0.3452442 0.3518972 0.9858079 -0.3451791 0.351649 0.9858036 -0.3451032 0.3513412 0.9857982 -0.3450175 0.3509616 0.9857916 -0.3449254 0.3504972 0.9857835 -0.3448353 0.3499351 0.9857738 -0.3447636 0.3492646 0.9857621 -0.3447407 0.3484821 0.9857485 -0.3448204 0.3475978 0.9857332 -0.3450957 0.3466492 0.9857167 -0.3457234 0.3457234 0.9857006 -0.3476916 0.3457234 0.9857006 -0.3501816 0.3457234 0.9857006 -0.3533318 0.3457234 0.9857006 -0.3573171 0.3457234 0.9857006 -0.3623592 0.3457234 0.9857006 -0.368738 0.3457234 0.9857006 -0.376808 0.3457234 0.9857006 -0.3870176 0.3457234 0.9857006 -0.3999341 0.3457234 0.9857006 -0.4162752 0.3457234 0.9857006 -0.4369488 0.3457234 0.9857006 -0.4631035 0.3457234 0.9857006 -0.4961927 0.3457234 0.9857006 -0.5380548 0.3457234 0.9857006 -0.5910158 0.3457234 0.9857006 -0.6580183 0.3457234 0.9857006 -0.7427853 0.3457234 0.9857006 -0.8500265 0.3457234 0.9857006 -0.9857006 0.3457234 0.9857006 -0.9890146 0.4144423 0.8675017 -0.9915054 0.4833013 0.7994429 -0.9933988 0.5503203 0.7678572 -0.9948509 0.6137675 0.7614806 -0.9959719 0.6723012 0.7713748 -0.9968418 0.7250408 0.7907532 -0.9975194 0.7715641 0.8147189 -0.9980491 0.8118466 0.8399433 -0.998464 0.8461687 0.8643265 -0.9987896 0.8750145 0.8866758 -0.9990456 0.8989805 0.9064306 -0.9992471 0.9187027 0.9234419 -0.9994058 0.9348056 0.9378096 -0.9995309 0.9478691 0.9497678 -0.9996295 0.958412 0.9596092 -0.9997074 0.9668847 0.9676383 -0.9997688 0.973671 0.9741446 -0.9998174 0.9790917 0.9793889 -0.9998557 0.9834123 0.9835987 -0.999886 0.9868501 0.9869669 -0.9999099 0.9895817 0.9896549 -0.9999288 0.9917499 0.9917957 -0.9999437 0.9934694 0.993498 -0.3454107 0.3544318 0.9858181 -0.3453807 0.3543309 0.9858163 -0.3453439 0.3542041 0.9858141 -0.3452987 0.3540453 0.9858113 -0.3452442 0.3538467 0.9858079 -0.3451791 0.3535993 0.9858036 -0.3451032 0.3532924 0.9857982 -0.3450175 0.352914 0.9857916 -0.3449254 0.352451 0.9857835 -0.3448353 0.3518905 0.9857738 -0.3447636 0.3512221 0.9857621 -0.3447407 0.350442 0.9857485 -0.3448204 0.3495603 0.9857332 -0.3450957 0.3486146 0.9857167 -0.3457234 0.3476916 0.9857006 -0.3469645 0.3469645 0.9856879 -0.3494573 0.3469645 0.9856879 -0.352611 0.3469645 0.9856879 -0.3566008 0.3469645 0.9856879 -0.3616485 0.3469645 0.9856879 -0.3680344 0.3469645 0.9856879 -0.3761135 0.3469645 0.9856879 -0.3863346 0.3469645 0.9856879 -0.3992655 0.3469645 0.9856879 -0.4156249 0.3469645 0.9856879 -0.4363216 0.3469645 0.9856879 -0.4625057 0.3469645 0.9856879 -0.4956319 0.3469645 0.9856879 -0.5375409 0.3469645 0.9856879 -0.5905612 0.3469645 0.9856879 -0.6576388 0.3469645 0.9856879 -0.7425006 0.3469645 0.9856879 -0.8498619 0.3469645 0.9856879 -0.9856879 0.3469645 0.9856879 -0.9890072 0.4152991 0.867382 -0.9915009 0.4838841 0.7992927 -0.9933961 0.5507113 0.7677141 -0.9948493 0.6140266 0.7613603 -0.9959709 0.6724711 0.7712809 -0.9968411 0.7251511 0.7906834 -0.9975191 0.7716352 0.8146689 -0.9980488 0.8118921 0.8399085 -0.9984638 0.8461977 0.8643028 -0.9987895 0.8750329 0.88666 -0.9990456 0.8989921 0.9064202 -0.999247 0.9187101 0.9234351 -0.9994057 0.9348102 0.9378052 -0.9995309 0.947872 0.949765 -0.9996295 0.9584138 0.9596074 -0.9997074 0.9668859 0.9676372 -0.9997688 0.9736717 0.9741438 -0.9998174 0.9790921 0.9793885 -0.9998557 0.9834126 0.9835984 -0.999886 0.9868503 0.9869667 -0.9999099 0.9895819 0.9896548 -0.9999288 0.99175 0.9917956 -0.9999437 0.9934694 0.993498 -0.3454107 0.3568959 0.9858181 -0.3453807 0.3567954 0.9858163 -0.3453439 0.3566692 0.9858141 -0.3452987 0.3565109 0.9858113 -0.3452442 0.3563131 0.9858079 -0.3451791 0.3560667 0.9858036 -0.3451032 0.3557609 0.9857982 -0.3450175 0.355384 0.9857916 -0.3449254 0.3549227 0.9857835 -0.3448353 0.3543644 0.9857738 -0.3447636 0.3536986 0.9857621 -0.3447407 0.3529214 0.9857485 -0.3448204 0.3520431 0.9857332 -0.3450957 0.351101 0.9857167 -0.3457234 0.3501816 0.9857006 -0.3469645 0.3494573 0.9856879 -0.3492254 0.3492254 0.9856839 -0.3523802 0.3492254 0.9856839 -0.3563715 0.3492254 0.9856839 -0.3614209 0.3492254 0.9856839 -0.3678092 0.3492254 0.9856839 -0.3758911 0.3492254 0.9856839 -0.3861159 0.3492254 0.9856839 -0.3990515 0.3492254 0.9856839 -0.4154167 0.3492254 0.9856839 -0.4361208 0.3492254 0.9856839 -0.4623142 0.3492254 0.9856839 -0.4954523 0.3492254 0.9856839 -0.5373763 0.3492254 0.9856839 -0.5904156 0.3492254 0.9856839 -0.6575172 0.3492254 0.9856839 -0.7424095 0.3492254 0.9856839 -0.8498092 0.3492254 0.9856839 -0.9856839 0.3492254 0.9856839 -0.9890048 0.4168922 0.8673437 -0.9914995 0.4849907 0.7992446 -0.9933953 0.5514695 0.7676683 -0.9948487 0.6145393 0.7613218 -0.9959706 0.6728136 0.7712508 -0.9968409 0.7253775 0.7906611 -0.9975189 0.7717834 0.8146529 -0.9980488 0.8119884 0.8398974 -0.9984638 0.8462598 0.8642952 -0.9987895 0.8750727 0.886655 -0.9990455 0.8990175 0.9064168 -0.999247 0.9187262 0.9234329 -0.9994057 0.9348204 0.9378038 -0.9995308 0.9478785 0.9497641 -0.9996295 0.9584178 0.9596068 -0.9997074 0.9668884 0.9676368 -0.9997688 0.9736733 0.9741436 -0.9998174 0.9790931 0.9793883 -0.9998557 0.9834132 0.9835983 -0.999886 0.9868507 0.9869667 -0.9999099 0.9895821 0.9896547 -0.9999288 0.9917502 0.9917956 -0.9999437 0.9934695 0.993498 -0.3454107 0.3600134 0.9858181 -0.3453807 0.3599134 0.9858163 -0.3453439 0.3597877 0.9858141 -0.3452987 0.3596303 0.9858113 -0.3452442 0.3594334 0.9858079 -0.3451791 0.3591882 0.9858036 -0.3451032 0.3588839 0.9857982 -0.3450175 0.3585088 0.9857916 -0.3449254 0.3580498 0.9857835 -0.3448353 0.3574942 0.9857738 -0.3447636 0.3568316 0.9857621 -0.3447407 0.3560582 0.9857485 -0.3448204 0.3551842 0.9857332 -0.3450957 0.3542467 0.9857167 -0.3457234 0.3533318 0.9857006 -0.3469645 0.352611 0.9856879 -0.3492254 0.3523802 0.9856839 -0.3523802 0.3523802 0.9856839 -0.3563715 0.3523802 0.9856839 -0.3614209 0.3523802 0.9856839 -0.3678092 0.3523802 0.9856839 -0.3758911 0.3523802 0.9856839 -0.3861159 0.3523802 0.9856839 -0.3990515 0.3523802 0.9856839 -0.4154167 0.3523802 0.9856839 -0.4361208 0.3523802 0.9856839 -0.4623142 0.3523802 0.9856839 -0.4954523 0.3523802 0.9856839 -0.5373763 0.3523802 0.9856839 -0.5904156 0.3523802 0.9856839 -0.6575172 0.3523802 0.9856839 -0.7424095 0.3523802 0.9856839 -0.8498092 0.3523802 0.9856839 -0.9856839 0.3523802 0.9856839 -0.9890048 0.419125 0.8673437 -0.9914995 0.4865484 0.7992446 -0.9933953 0.5525411 0.7676683 -0.9948487 0.6152669 0.7613218 -0.9959706 0.6733015 0.7712508 -0.9968409 0.7257011 0.7906611 -0.9975189 0.7719959 0.8146529 -0.9980488 0.8121268 0.8398974 -0.9984638 0.8463492 0.8642952 -0.9987895 0.8751301 0.886655 -0.9990455 0.8990542 0.9064168 -0.999247 0.9187495 0.9234329 -0.9994057 0.9348352 0.9378038 -0.9995308 0.9478878 0.9497641 -0.9996295 0.9584237 0.9596068 -0.9997074 0.9668922 0.9676368 -0.9997688 0.9736756 0.9741436 -0.9998174 0.9790946 0.9793883 -0.9998557 0.9834141 0.9835983 -0.999886 0.9868512 0.9869667 -0.9999099 0.9895825 0.9896547 -0.9999288 0.9917504 0.9917956 -0.9999437 0.9934697 0.993498 -0.3454107 0.3639574 0.9858181 -0.3453807 0.363858 0.9858163 -0.3453439 0.3637331 0.9858141 -0.3452987 0.3635767 0.9858113 -0.3452442 0.363381 0.9858079 -0.3451791 0.3631373 0.9858036 -0.3451032 0.3628349 0.9857982 -0.3450175 0.3624621 0.9857916 -0.3449254 0.362006 0.9857835 -0.3448353 0.3614538 0.9857738 -0.3447636 0.3607953 0.9857621 -0.3447407 0.3600267 0.9857485 -0.3448204 0.3591581 0.9857332 -0.3450957 0.3582264 0.9857167 -0.3457234 0.3573171 0.9857006 -0.3469645 0.3566008 0.9856879 -0.3492254 0.3563715 0.9856839 -0.3523802 0.3563715 0.9856839 -0.3563715 0.3563715 0.9856839 -0.3614209 0.3563715 0.9856839 -0.3678092 0.3563715 0.9856839 -0.3758911 0.3563715 0.9856839 -0.3861159 0.3563715 0.9856839 -0.3990515 0.3563715 0.9856839 -0.4154167 0.3563715 0.9856839 -0.4361208 0.3563715 0.9856839 -0.4623142 0.3563715 0.9856839 -0.4954523 0.3563715 0.9856839 -0.5373763 0.3563715 0.9856839 -0.5904156 0.3563715 0.9856839 -0.6575172 0.3563715 0.9856839 -0.7424095 0.3563715 0.9856839 -0.8498092 0.3563715 0.9856839 -0.9856839 0.3563715 0.9856839 -0.9890048 0.4219498 0.8673437 -0.9914995 0.4885191 0.7992446 -0.9933953 0.5538969 0.7676683 -0.9948487 0.6161874 0.7613218 -0.9959706 0.6739188 0.7712508 -0.9968409 0.7261105 0.7906611 -0.9975189 0.7722648 0.8146529 -0.9980488 0.8123018 0.8398974 -0.9984638 0.8464623 0.8642952 -0.9987895 0.8752028 0.886655 -0.9990455 0.8991006 0.9064168 -0.999247 0.9187791 0.9234329 -0.9994057 0.9348539 0.9378038 -0.9995308 0.9478997 0.9497641 -0.9996295 0.9584312 0.9596068 -0.9997074 0.9668969 0.9676368 -0.9997688 0.9736786 0.9741436 -0.9998174 0.9790965 0.9793883 -0.9998557 0.9834153 0.9835983 -0.999886 0.986852 0.9869667 -0.9999099 0.9895829 0.9896547 -0.9999288 0.9917507 0.9917956 -0.9999437 0.9934698 0.993498 -0.3454107 0.3689471 0.9858181 -0.3453807 0.3688485 0.9858163 -0.3453439 0.3687246 0.9858141 -0.3452987 0.3685693 0.9858113 -0.3452442 0.3683752 0.9858079 -0.3451791 0.3681334 0.9858036 -0.3451032 0.3678335 0.9857982 -0.3450175 0.3674636 0.9857916 -0.3449254 0.367011 0.9857835 -0.3448353 0.3664632 0.9857738 -0.3447636 0.3658099 0.9857621 -0.3447407 0.3650474 0.9857485 -0.3448204 0.3641857 0.9857332 -0.3450957 0.3632613 0.9857167 -0.3457234 0.3623592 0.9857006 -0.3469645 0.3616485 0.9856879 -0.3492254 0.3614209 0.9856839 -0.3523802 0.3614209 0.9856839 -0.3563715 0.3614209 0.9856839 -0.3614209 0.3614209 0.9856839 -0.3678092 0.3614209 0.9856839 -0.3758911 0.3614209 0.9856839 -0.3861159 0.3614209 0.9856839 -0.3990515 0.3614209 0.9856839 -0.4154167 0.3614209 0.9856839 -0.4361208 0.3614209 0.9856839 -0.4623142 0.3614209 0.9856839 -0.4954523 0.3614209 0.9856839 -0.5373763 0.3614209 0.9856839 -0.5904156 0.3614209 0.9856839 -0.6575172 0.3614209 0.9856839 -0.7424095 0.3614209 0.9856839 -0.8498092 0.3614209 0.9856839 -0.9856839 0.3614209 0.9856839 -0.9890048 0.4255236 0.8673437 -0.9914995 0.4910123 0.7992446 -0.9933953 0.5556122 0.7676683 -0.9948487 0.6173519 0.7613218 -0.9959706 0.6746998 0.7712508 -0.9968409 0.7266285 0.7906611 -0.9975189 0.7726049 0.8146529 -0.9980488 0.8125232 0.8398974 -0.9984638 0.8466054 0.8642952 -0.9987895 0.8752947 0.886655 -0.9990455 0.8991593 0.9064168 -0.999247 0.9188164 0.9234329 -0.9994057 0.9348776 0.9378038 -0.9995308 0.9479146 0.9497641 -0.9996295 0.9584406 0.9596068 -0.9997074 0.9669028 0.9676368 -0.9997688 0.9736823 0.9741436 -0.9998174 0.9790988 0.9793883 -0.9998557 0.9834167 0.9835983 -0.999886 0.9868529 0.9869667 -0.9999099 0.9895835 0.9896547 -0.9999288 0.991751 0.9917956 -0.9999437 0.9934701 0.993498 -0.3454107 0.3752597 0.9858181 -0.3453807 0.3751621 0.9858163 -0.3453439 0.3750394 0.9858141 -0.3452987 0.3748857 0.9858113 -0.3452442 0.3746936 0.9858079 -0.3451791 0.3744542 0.9858036 -0.3451032 0.3741573 0.9857982 -0.3450175 0.3737911 0.9857916 -0.3449254 0.3733431 0.9857835 -0.3448353 0.3728008 0.9857738 -0.3447636 0.3721541 0.9857621 -0.3447407 0.3713992 0.9857485 -0.3448204 0.3705461 0.9857332 -0.3450957 0.369631 0.9857167 -0.3457234 0.368738 0.9857006 -0.3469645 0.3680344 0.9856879 -0.3492254 0.3678092 0.9856839 -0.3523802 0.3678092 0.9856839 -0.3563715 0.3678092 0.9856839 -0.3614209 0.3678092 0.9856839 -0.3678092 0.3678092 0.9856839 -0.3758911 0.3678092 0.9856839 -0.3861159 0.3678092 0.9856839 -0.3990515 0.3678092 0.9856839 -0.4154167 0.3678092 0.9856839 -0.4361208 0.3678092 0.9856839 -0.4623142 0.3678092 0.9856839 -0.4954523 0.3678092 0.9856839 -0.5373763 0.3678092 0.9856839 -0.5904156 0.3678092 0.9856839 -0.6575172 0.3678092 0.9856839 -0.7424095 0.3678092 0.9856839 -0.8498092 0.3678092 0.9856839 -0.9856839 0.3678092 0.9856839 -0.9890048 0.4300448 0.8673437 -0.9914995 0.4941665 0.7992446 -0.9933953 0.5577822 0.7676683 -0.9948487 0.6188252 0.7613218 -0.9959706 0.6756878 0.7712508 -0.9968409 0.7272837 0.7906611 -0.9975189 0.7730352 0.8146529 -0.9980488 0.8128033 0.8398974 -0.9984638 0.8467864 0.8642952 -0.9987895 0.8754109 0.886655 -0.9990455 0.8992336 0.9064168 -0.999247 0.9188636 0.9234329 -0.9994057 0.9349075 0.9378038 -0.9995308 0.9479335 0.9497641 -0.9996295 0.9584526 0.9596068 -0.9997074 0.9669103 0.9676368 -0.9997688 0.973687 0.9741436 -0.9998174 0.9791018 0.9793883 -0.9998557 0.9834186 0.9835983 -0.999886 0.9868541 0.9869667 -0.9999099 0.9895842 0.9896547 -0.9999288 0.9917515 0.9917956 -0.9999437 0.9934704 0.993498 -0.3454107 0.3832459 0.9858181 -0.3453807 0.3831496 0.9858163 -0.3453439 0.3830285 0.9858141 -0.3452987 0.3828768 0.9858113 -0.3452442 0.3826871 0.9858079 -0.3451791 0.3824508 0.9858036 -0.3451032 0.3821577 0.9857982 -0.3450175 0.3817962 0.9857916 -0.3449254 0.3813539 0.9857835 -0.3448353 0.3808186 0.9857738 -0.3447636 0.3801802 0.9857621 -0.3447407 0.379435 0.9857485 -0.3448204 0.3785929 0.9857332 -0.3450957 0.3776896 0.9857167 -0.3457234 0.376808 0.9857006 -0.3469645 0.3761135 0.9856879 -0.3492254 0.3758911 0.9856839 -0.3523802 0.3758911 0.9856839 -0.3563715 0.3758911 0.9856839 -0.3614209 0.3758911 0.9856839 -0.3678092 0.3758911 0.9856839 -0.3758911 0.3758911 0.9856839 -0.3861159 0.3758911 0.9856839 -0.3990515 0.3758911 0.9856839 -0.4154167 0.3758911 0.9856839 -0.4361208 0.3758911 0.9856839 -0.4623142 0.3758911 0.9856839 -0.4954523 0.3758911 0.9856839 -0.5373763 0.3758911 0.9856839 -0.5904156 0.3758911 0.9856839 -0.6575172 0.3758911 0.9856839 -0.7424095 0.3758911 0.9856839 -0.8498092 0.3758911 0.9856839 -0.9856839 0.3758911 0.9856839 -0.9890048 0.4357648 0.8673437 -0.9914995 0.498157 0.7992446 -0.9933953 0.5605276 0.7676683 -0.9948487 0.6206891 0.7613218 -0.9959706 0.6769378 0.7712508 -0.9968409 0.7281127 0.7906611 -0.9975189 0.7735795 0.8146529 -0.9980488 0.8131577 0.8398974 -0.9984638 0.8470154 0.8642952 -0.9987895 0.875558 0.886655 -0.9990455 0.8993275 0.9064168 -0.999247 0.9189234 0.9234329 -0.9994057 0.9349454 0.9378038 -0.9995308 0.9479575 0.9497641 -0.9996295 0.9584677 0.9596068 -0.9997074 0.9669198 0.9676368 -0.9997688 0.973693 0.9741436 -0.9998174 0.9791055 0.9793883 -0.9998557 0.9834209 0.9835983 -0.999886 0.9868555 0.9869667 -0.9999099 0.9895851 0.9896547 -0.9999288 0.9917521 0.9917956 -0.9999437 0.9934707 0.993498 -0.3454107 0.3933496 0.9858181 -0.3453807 0.3932548 0.9858163 -0.3453439 0.3931357 0.9858141 -0.3452987 0.3929865 0.9858113 -0.3452442 0.3928 0.9858079 -0.3451791 0.3925675 0.9858036 -0.3451032 0.3922792 0.9857982 -0.3450175 0.3919237 0.9857916 -0.3449254 0.3914887 0.9857835 -0.3448353 0.3909622 0.9857738 -0.3447636 0.3903343 0.9857621 -0.3447407 0.3896014 0.9857485 -0.3448204 0.3887731 0.9857332 -0.3450957 0.3878847 0.9857167 -0.3457234 0.3870176 0.9857006 -0.3469645 0.3863346 0.9856879 -0.3492254 0.3861159 0.9856839 -0.3523802 0.3861159 0.9856839 -0.3563715 0.3861159 0.9856839 -0.3614209 0.3861159 0.9856839 -0.3678092 0.3861159 0.9856839 -0.3758911 0.3861159 0.9856839 -0.3861159 0.3861159 0.9856839 -0.3990515 0.3861159 0.9856839 -0.4154167 0.3861159 0.9856839 -0.4361208 0.3861159 0.9856839 -0.4623142 0.3861159 0.9856839 -0.4954523 0.3861159 0.9856839 -0.5373763 0.3861159 0.9856839 -0.5904156 0.3861159 0.9856839 -0.6575172 0.3861159 0.9856839 -0.7424095 0.3861159 0.9856839 -0.8498092 0.3861159 0.9856839 -0.9856839 0.3861159 0.9856839 -0.9890048 0.4430013 0.8673437 -0.9914995 0.5032055 0.7992446 -0.9933953 0.5640008 0.7676683 -0.9948487 0.6230471 0.7613218 -0.9959706 0.6785192 0.7712508 -0.9968409 0.7291615 0.7906611 -0.9975189 0.7742682 0.8146529 -0.9980488 0.8136061 0.8398974 -0.9984638 0.8473052 0.8642952 -0.9987895 0.8757441 0.886655 -0.9990455 0.8994464 0.9064168 -0.999247 0.918999 0.9234329 -0.9994057 0.9349933 0.9378038 -0.9995308 0.9479878 0.9497641 -0.9996295 0.9584868 0.9596068 -0.9997074 0.9669318 0.9676368 -0.9997688 0.9737006 0.9741436 -0.9998174 0.9791103 0.9793883 -0.9998557 0.9834239 0.9835983 -0.999886 0.9868574 0.9869667 -0.9999099 0.9895863 0.9896547 -0.9999288 0.9917528 0.9917956 -0.9999437 0.9934712 0.993498 -0.3454107 0.406132 0.9858181 -0.3453807 0.4060392 0.9858163 -0.3453439 0.4059227 0.9858141 -0.3452987 0.4057766 0.9858113 -0.3452442 0.405594 0.9858079 -0.3451791 0.4053665 0.9858036 -0.3451032 0.4050843 0.9857982 -0.3450175 0.4047363 0.9857916 -0.3449254 0.4043106 0.9857835 -0.3448353 0.4037952 0.9857738 -0.3447636 0.4031806 0.9857621 -0.3447407 0.4024632 0.9857485 -0.3448204 0.4016525 0.9857332 -0.3450957 0.4007829 0.9857167 -0.3457234 0.3999341 0.9857006 -0.3469645 0.3992655 0.9856879 -0.3492254 0.3990515 0.9856839 -0.3523802 0.3990515 0.9856839 -0.3563715 0.3990515 0.9856839 -0.3614209 0.3990515 0.9856839 -0.3678092 0.3990515 0.9856839 -0.3758911 0.3990515 0.9856839 -0.3861159 0.3990515 0.9856839 -0.3990515 0.3990515 0.9856839 -0.4154167 0.3990515 0.9856839 -0.4361208 0.3990515 0.9856839 -0.4623142 0.3990515 0.9856839 -0.4954523 0.3990515 0.9856839 -0.5373763 0.3990515 0.9856839 -0.5904156 0.3990515 0.9856839 -0.6575172 0.3990515 0.9856839 -0.7424095 0.3990515 0.9856839 -0.8498092 0.3990515 0.9856839 -0.9856839 0.3990515 0.9856839 -0.9890048 0.4521565 0.8673437 -0.9914995 0.5095925 0.7992446 -0.9933953 0.5683949 0.7676683 -0.9948487 0.6260304 0.7613218 -0.9959706 0.6805199 0.7712508 -0.9968409 0.7304884 0.7906611 -0.9975189 0.7751395 0.8146529 -0.9980488 0.8141733 0.8398974 -0.9984638 0.8476717 0.8642952 -0.9987895 0.8759795 0.886655 -0.9990455 0.8995968 0.9064168 -0.999247 0.9190947 0.9234329 -0.9994057 0.935054 0.9378038 -0.9995308 0.9480261 0.9497641 -0.9996295 0.9585109 0.9596068 -0.9997074 0.966947 0.9676368 -0.9997688 0.9737101 0.9741436 -0.9998174 0.9791163 0.9793883 -0.9998557 0.9834277 0.9835983 -0.999886 0.9868597 0.9869667 -0.9999099 0.9895878 0.9896547 -0.9999288 0.9917537 0.9917956 -0.9999437 0.9934718 0.993498 -0.3454107 0.4223035 0.9858181 -0.3453807 0.4222132 0.9858163 -0.3453439 0.4220999 0.9858141 -0.3452987 0.4219578 0.9858113 -0.3452442 0.4217802 0.9858079 -0.3451791 0.4215589 0.9858036 -0.3451032 0.4212844 0.9857982 -0.3450175 0.420946 0.9857916 -0.3449254 0.4205319 0.9857835 -0.3448353 0.4200306 0.9857738 -0.3447636 0.4194328 0.9857621 -0.3447407 0.4187351 0.9857485 -0.3448204 0.4179465 0.9857332 -0.3450957 0.4171007 0.9857167 -0.3457234 0.4162752 0.9857006 -0.3469645 0.4156249 0.9856879 -0.3492254 0.4154167 0.9856839 -0.3523802 0.4154167 0.9856839 -0.3563715 0.4154167 0.9856839 -0.3614209 0.4154167 0.9856839 -0.3678092 0.4154167 0.9856839 -0.3758911 0.4154167 0.9856839 -0.3861159 0.4154167 0.9856839 -0.3990515 0.4154167 0.9856839 -0.4154167 0.4154167 0.9856839 -0.4361208 0.4154167 0.9856839 -0.4623142 0.4154167 0.9856839 -0.4954523 0.4154167 0.9856839 -0.5373763 0.4154167 0.9856839 -0.5904156 0.4154167 0.9856839 -0.6575172 0.4154167 0.9856839 -0.7424095 0.4154167 0.9856839 -0.8498092 0.4154167 0.9856839 -0.9856839 0.4154167 0.9856839 -0.9890048 0.4637389 0.8673437 -0.9914995 0.5176729 0.7992446 -0.9933953 0.573954 0.7676683 -0.9948487 0.6298046 0.7613218 -0.9959706 0.683051 0.7712508 -0.9968409 0.732167 0.7906611 -0.9975189 0.7762418 0.8146529 -0.9980488 0.8148909 0.8398974 -0.9984638 0.8481355 0.8642952 -0.9987895 0.8762773 0.886655 -0.9990455 0.899787 0.9064168 -0.999247 0.9192157 0.9234329 -0.9994057 0.9351307 0.9378038 -0.9995308 0.9480746 0.9497641 -0.9996295 0.9585415 0.9596068 -0.9997074 0.9669663 0.9676368 -0.9997688 0.9737222 0.9741436 -0.9998174 0.9791238 0.9793883 -0.9998557 0.9834324 0.9835983 -0.999886 0.9868627 0.9869667 -0.9999099 0.9895897 0.9896547 -0.9999288 0.9917549 0.9917956 -0.9999437 0.9934725 0.993498 -0.3454107 0.4427624 0.9858181 -0.3453807 0.4426754 0.9858163 -0.3453439 0.4425661 0.9858141 -0.3452987 0.4424291 0.9858113 -0.3452442 0.4422578 0.9858079 -0.3451791 0.4420444 0.9858036 -0.3451032 0.4417797 0.9857982 -0.3450175 0.4414533 0.9857916 -0.3449254 0.4410539 0.9857835 -0.3448353 0.4405705 0.9857738 -0.3447636 0.439994 0.9857621 -0.3447407 0.4393211 0.9857485 -0.3448204 0.4385606 0.9857332 -0.3450957 0.4377449 0.9857167 -0.3457234 0.4369488 0.9857006 -0.3469645 0.4363216 0.9856879 -0.3492254 0.4361208 0.9856839 -0.3523802 0.4361208 0.9856839 -0.3563715 0.4361208 0.9856839 -0.3614209 0.4361208 0.9856839 -0.3678092 0.4361208 0.9856839 -0.3758911 0.4361208 0.9856839 -0.3861159 0.4361208 0.9856839 -0.3990515 0.4361208 0.9856839 -0.4154167 0.4361208 0.9856839 -0.4361208 0.4361208 0.9856839 -0.4623142 0.4361208 0.9856839 -0.4954523 0.4361208 0.9856839 -0.5373763 0.4361208 0.9856839 -0.5904156 0.4361208 0.9856839 -0.6575172 0.4361208 0.9856839 -0.7424095 0.4361208 0.9856839 -0.8498092 0.4361208 0.9856839 -0.9856839 0.4361208 0.9856839 -0.9890048 0.4783922 0.8673437 -0.9914995 0.5278957 0.7992446 -0.9933953 0.580987 0.7676683 -0.9948487 0.6345795 0.7613218 -0.9959706 0.6862532 0.7712508 -0.9968409 0.7342907 0.7906611 -0.9975189 0.7776364 0.8146529 -0.9980488 0.8157988 0.8398974 -0.9984638 0.8487222 0.8642952 -0.9987895 0.8766541 0.886655 -0.9990455 0.9000277 0.9064168 -0.999247 0.9193688 0.9234329 -0.9994057 0.9352277 0.9378038 -0.9995308 0.9481359 0.9497641 -0.9996295 0.9585802 0.9596068 -0.9997074 0.9669906 0.9676368 -0.9997688 0.9737375 0.9741436 -0.9998174 0.9791334 0.9793883 -0.9998557 0.9834385 0.9835983 -0.999886 0.9868665 0.9869667 -0.9999099 0.989592 0.9896547 -0.9999288 0.9917564 0.9917956 -0.9999437 0.9934734 0.993498 -0.3454107 0.4686457 0.9858181 -0.3453807 0.4685627 0.9858163 -0.3453439 0.4684585 0.9858141 -0.3452987 0.4683279 0.9858113 -0.3452442 0.4681646 0.9858079 -0.3451791 0.4679612 0.9858036 -0.3451032 0.4677088 0.9857982 -0.3450175 0.4673977 0.9857916 -0.3449254 0.467017 0.9857835 -0.3448353 0.4665561 0.9857738 -0.3447636 0.4660065 0.9857621 -0.3447407 0.465365 0.9857485 -0.3448204 0.4646401 0.9857332 -0.3450957 0.4638625 0.9857167 -0.3457234 0.4631035 0.9857006 -0.3469645 0.4625057 0.9856879 -0.3492254 0.4623142 0.9856839 -0.3523802 0.4623142 0.9856839 -0.3563715 0.4623142 0.9856839 -0.3614209 0.4623142 0.9856839 -0.3678092 0.4623142 0.9856839 -0.3758911 0.4623142 0.9856839 -0.3861159 0.4623142 0.9856839 -0.3990515 0.4623142 0.9856839 -0.4154167 0.4623142 0.9856839 -0.4361208 0.4623142 0.9856839 -0.4623142 0.4623142 0.9856839 -0.4954523 0.4623142 0.9856839 -0.5373763 0.4623142 0.9856839 -0.5904156 0.4623142 0.9856839 -0.6575172 0.4623142 0.9856839 -0.7424095 0.4623142 0.9856839 -0.8498092 0.4623142 0.9856839 -0.9856839 0.4623142 0.9856839 -0.9890048 0.4969305 0.8673437 -0.9914995 0.5408288 0.7992446 -0.9933953 0.5898847 0.7676683 -0.9948487 0.6406203 0.7613218 -0.9959706 0.6903044 0.7712508 -0.9968409 0.7369774 0.7906611 -0.9975189 0.7794007 0.8146529 -0.9980488 0.8169474 0.8398974 -0.9984638 0.8494644 0.8642952 -0.9987895 0.8771307 0.886655 -0.9990455 0.9003323 0.9064168 -0.999247 0.9195625 0.9234329 -0.9994057 0.9353505 0.9378038 -0.9995308 0.9482135 0.9497641 -0.9996295 0.9586291 0.9596068 -0.9997074 0.9670214 0.9676368 -0.9997688 0.9737569 0.9741436 -0.9998174 0.9791456 0.9793883 -0.9998557 0.9834461 0.9835983 -0.999886 0.9868713 0.9869667 -0.9999099 0.989595 0.9896547 -0.9999288 0.9917582 0.9917956 -0.9999437 0.9934746 0.993498 -0.3454107 0.5013914 0.9858181 -0.3453807 0.5013136 0.9858163 -0.3453439 0.5012158 0.9858141 -0.3452987 0.5010933 0.9858113 -0.3452442 0.5009401 0.9858079 -0.3451791 0.5007493 0.9858036 -0.3451032 0.5005126 0.9857982 -0.3450175 0.5002207 0.9857916 -0.3449254 0.4998636 0.9857835 -0.3448353 0.4994313 0.9857738 -0.3447636 0.4989158 0.9857621 -0.3447407 0.498314 0.9857485 -0.3448204 0.497634 0.9857332 -0.3450957 0.4969046 0.9857167 -0.3457234 0.4961927 0.9857006 -0.3469645 0.4956319 0.9856879 -0.3492254 0.4954523 0.9856839 -0.3523802 0.4954523 0.9856839 -0.3563715 0.4954523 0.9856839 -0.3614209 0.4954523 0.9856839 -0.3678092 0.4954523 0.9856839 -0.3758911 0.4954523 0.9856839 -0.3861159 0.4954523 0.9856839 -0.3990515 0.4954523 0.9856839 -0.4154167 0.4954523 0.9856839 -0.4361208 0.4954523 0.9856839 -0.4623142 0.4954523 0.9856839 -0.4954523 0.4954523 0.9856839 -0.5373763 0.4954523 0.9856839 -0.5904156 0.4954523 0.9856839 -0.6575172 0.4954523 0.9856839 -0.7424095 0.4954523 0.9856839 -0.8498092 0.4954523 0.9856839 -0.9856839 0.4954523 0.9856839 -0.9890048 0.5203839 0.8673437 -0.9914995 0.5571908 0.7992446 -0.9933953 0.6011414 0.7676683 -0.9948487 0.6482627 0.7613218 -0.9959706 0.6954296 0.7712508 -0.9968409 0.7403765 0.7906611 -0.9975189 0.7816327 0.8146529 -0.9980488 0.8184005 0.8398974 -0.9984638 0.8504035 0.8642952 -0.9987895 0.8777338 0.886655 -0.9990455 0.9007175 0.9064168 -0.999247 0.9198076 0.9234329 -0.9994057 0.9355059 0.9378038 -0.9995308 0.9483117 0.9497641 -0.9996295 0.958691 0.9596068 -0.9997074 0.9670604 0.9676368 -0.9997688 0.9737814 0.9741436 -0.9998174 0.979161 0.9793883 -0.9998557 0.9834557 0.9835983 -0.999886 0.9868773 0.9869667 -0.9999099 0.9895988 0.9896547 -0.9999288 0.9917606 0.9917956 -0.9999437 0.9934761 0.993498 -0.3454107 0.5428189 0.9858181 -0.3453807 0.5427476 0.9858163 -0.3453439 0.542658 0.9858141 -0.3452987 0.5425458 0.9858113 -0.3452442 0.5424054 0.9858079 -0.3451791 0.5422305 0.9858036 -0.3451032 0.5420136 0.9857982 -0.3450175 0.5417461 0.9857916 -0.3449254 0.5414188 0.9857835 -0.3448353 0.5410227 0.9857738 -0.3447636 0.5405503 0.9857621 -0.3447407 0.5399988 0.9857485 -0.3448204 0.5393756 0.9857332 -0.3450957 0.5387072 0.9857167 -0.3457234 0.5380548 0.9857006 -0.3469645 0.5375409 0.9856879 -0.3492254 0.5373763 0.9856839 -0.3523802 0.5373763 0.9856839 -0.3563715 0.5373763 0.9856839 -0.3614209 0.5373763 0.9856839 -0.3678092 0.5373763 0.9856839 -0.3758911 0.5373763 0.9856839 -0.3861159 0.5373763 0.9856839 -0.3990515 0.5373763 0.9856839 -0.4154167 0.5373763 0.9856839 -0.4361208 0.5373763 0.9856839 -0.4623142 0.5373763 0.9856839 -0.4954523 0.5373763 0.9856839 -0.5373763 0.5373763 0.9856839 -0.5904156 0.5373763 0.9856839 -0.6575172 0.5373763 0.9856839 -0.7424095 0.5373763 0.9856839 -0.8498092 0.5373763 0.9856839 -0.9856839 0.5373763 0.9856839 -0.9890048 0.5500554 0.8673437 -0.9914995 0.577891 0.7992446 -0.9933953 0.6153825 0.7676683 -0.9948487 0.6579314 0.7613218 -0.9959706 0.7019138 0.7712508 -0.9968409 0.7446768 0.7906611 -0.9975189 0.7844566 0.8146529 -0.9980488 0.8202389 0.8398974 -0.9984638 0.8515915 0.8642952 -0.9987895 0.8784967 0.886655 -0.9990455 0.9012049 0.9064168 -0.999247 0.9201176 0.9234329 -0.9994057 0.9357024 0.9378038 -0.9995308 0.9484359 0.9497641 -0.9996295 0.9587693 0.9596068 -0.9997074 0.9671097 0.9676368 -0.9997688 0.9738123 0.9741436 -0.9998174 0.9791804 0.9793883 -0.9998557 0.9834679 0.9835983 -0.999886 0.986885 0.9869667 -0.9999099 0.9896036 0.9896547 -0.9999288 0.9917636 0.9917956 -0.9999437 0.9934779 0.993498 -0.3454107 0.5952302 0.9858181 -0.3453807 0.5951671 0.9858163 -0.3453439 0.5950879 0.9858141 -0.3452987 0.5949885 0.9858113 -0.3452442 0.5948644 0.9858079 -0.3451791 0.5947097 0.9858036 -0.3451032 0.5945178 0.9857982 -0.3450175 0.5942812 0.9857916 -0.3449254 0.5939917 0.9857835 -0.3448353 0.5936412 0.9857738 -0.3447636 0.5932233 0.9857621 -0.3447407 0.5927355 0.9857485 -0.3448204 0.5921842 0.9857332 -0.3450957 0.5915929 0.9857167 -0.3457234 0.5910158 0.9857006 -0.3469645 0.5905612 0.9856879 -0.3492254 0.5904156 0.9856839 -0.3523802 0.5904156 0.9856839 -0.3563715 0.5904156 0.9856839 -0.3614209 0.5904156 0.9856839 -0.3678092 0.5904156 0.9856839 -0.3758911 0.5904156 0.9856839 -0.3861159 0.5904156 0.9856839 -0.3990515 0.5904156 0.9856839 -0.4154167 0.5904156 0.9856839 -0.4361208 0.5904156 0.9856839 -0.4623142 0.5904156 0.9856839 -0.4954523 0.5904156 0.9856839 -0.5373763 0.5904156 0.9856839 -0.5904156 0.5904156 0.9856839 -0.6575172 0.5904156 0.9856839 -0.7424095 0.5904156 0.9856839 -0.8498092 0.5904156 0.9856839 -0.9856839 0.5904156 0.9856839 -0.9890048 0.5875938 0.8673437 -0.9914995 0.6040793 0.7992446 -0.9933953 0.6333995 0.7676683 -0.9948487 0.6701635 0.7613218 -0.9959706 0.710117 0.7712508 -0.9968409 0.7501172 0.7906611 -0.9975189 0.7880291 0.8146529 -0.9980488 0.8225647 0.8398974 -0.9984638 0.8530945 0.8642952 -0.9987895 0.8794619 0.886655 -0.9990455 0.9018215 0.9064168 -0.999247 0.9205098 0.9234329 -0.9994057 0.935951 0.9378038 -0.9995308 0.9485931 0.9497641 -0.9996295 0.9588684 0.9596068 -0.9997074 0.967172 0.9676368 -0.9997688 0.9738515 0.9741436 -0.9998174 0.979205 0.9793883 -0.9998557 0.9834833 0.9835983 -0.999886 0.9868946 0.9869667 -0.9999099 0.9896096 0.9896547 -0.9999288 0.9917674 0.9917956 -0.9999437 0.9934803 0.993498 -0.3454107 0.6615372 0.9858181 -0.3453807 0.6614846 0.9858163 -0.3453439 0.6614184 0.9858141 -0.3452987 0.6613355 0.9858113 -0.3452442 0.6612318 0.9858079 -0.3451791 0.6611026 0.9858036 -0.3451032 0.6609424 0.9857982 -0.3450175 0.6607448 0.9857916 -0.3449254 0.6605031 0.9857835 -0.3448353 0.6602105 0.9857738 -0.3447636 0.6598616 0.9857621 -0.3447407 0.6594543 0.9857485 -0.3448204 0.658994 0.9857332 -0.3450957 0.6585002 0.9857167 -0.3457234 0.6580183 0.9857006 -0.3469645 0.6576388 0.9856879 -0.3492254 0.6575172 0.9856839 -0.3523802 0.6575172 0.9856839 -0.3563715 0.6575172 0.9856839 -0.3614209 0.6575172 0.9856839 -0.3678092 0.6575172 0.9856839 -0.3758911 0.6575172 0.9856839 -0.3861159 0.6575172 0.9856839 -0.3990515 0.6575172 0.9856839 -0.4154167 0.6575172 0.9856839 -0.4361208 0.6575172 0.9856839 -0.4623142 0.6575172 0.9856839 -0.4954523 0.6575172 0.9856839 -0.5373763 0.6575172 0.9856839 -0.5904156 0.6575172 0.9856839 -0.6575172 0.6575172 0.9856839 -0.7424095 0.6575172 0.9856839 -0.8498092 0.6575172 0.9856839 -0.9856839 0.6575172 0.9856839 -0.9890048 0.6350848 0.8673437 -0.9914995 0.637211 0.7992446 -0.9933953 0.6561933 0.7676683 -0.9948487 0.6856388 0.7613218 -0.9959706 0.7204952 0.7712508 -0.9968409 0.757 0.7906611 -0.9975189 0.7925488 0.8146529 -0.9980488 0.8255071 0.8398974 -0.9984638 0.8549959 0.8642952 -0.9987895 0.880683 0.886655 -0.9990455 0.9026016 0.9064168 -0.999247 0.9210061 0.9234329 -0.9994057 0.9362655 0.9378038 -0.9995308 0.9487918 0.9497641 -0.9996295 0.9589938 0.9596068 -0.9997074 0.9672509 0.9676368 -0.9997688 0.9739011 0.9741436 -0.9998174 0.9792361 0.9793883 -0.9998557 0.9835029 0.9835983 -0.999886 0.9869069 0.9869667 -0.9999099 0.9896173 0.9896547 -0.9999288 0.9917722 0.9917956 -0.9999437 0.9934833 0.993498 -0.3454107 0.7454243 0.9858181 -0.3453807 0.7453848 0.9858163 -0.3453439 0.7453352 0.9858141 -0.3452987 0.745273 0.9858113 -0.3452442 0.7451952 0.9858079 -0.3451791 0.7450984 0.9858036 -0.3451032 0.7449782 0.9857982 -0.3450175 0.74483 0.9857916 -0.3449254 0.7446487 0.9857835 -0.3448353 0.7444293 0.9857738 -0.3447636 0.7441676 0.9857621 -0.3447407 0.7438622 0.9857485 -0.3448204 0.743517 0.9857332 -0.3450957 0.7431467 0.9857167 -0.3457234 0.7427853 0.9857006 -0.3469645 0.7425006 0.9856879 -0.3492254 0.7424095 0.9856839 -0.3523802 0.7424095 0.9856839 -0.3563715 0.7424095 0.9856839 -0.3614209 0.7424095 0.9856839 -0.3678092 0.7424095 0.9856839 -0.3758911 0.7424095 0.9856839 -0.3861159 0.7424095 0.9856839 -0.3990515 0.7424095 0.9856839 -0.4154167 0.7424095 0.9856839 -0.4361208 0.7424095 0.9856839 -0.4623142 0.7424095 0.9856839 -0.4954523 0.7424095 0.9856839 -0.5373763 0.7424095 0.9856839 -0.5904156 0.7424095 0.9856839 -0.6575172 0.7424095 0.9856839 -0.7424095 0.7424095 0.9856839 -0.8498092 0.7424095 0.9856839 -0.9856839 0.7424095 0.9856839 -0.9890048 0.695167 0.8673437 -0.9914995 0.6791269 0.7992446 -0.9933953 0.6850303 0.7676683 -0.9948487 0.7052169 0.7613218 -0.9959706 0.733625 0.7712508 -0.9968409 0.7657077 0.7906611 -0.9975189 0.7982669 0.8146529 -0.9980488 0.8292297 0.8398974 -0.9984638 0.8574015 0.8642952 -0.9987895 0.8822279 0.886655 -0.9990455 0.9035886 0.9064168 -0.999247 0.9216339 0.9234329 -0.9994057 0.9366635 0.9378038 -0.9995308 0.9490434 0.9497641 -0.9996295 0.9591524 0.9596068 -0.9997074 0.9673508 0.9676368 -0.9997688 0.9739638 0.9741436 -0.9998174 0.9792755 0.9793883 -0.9998557 0.9835276 0.9835983 -0.999886 0.9869223 0.9869667 -0.9999099 0.989627 0.9896547 -0.9999288 0.9917782 0.9917956 -0.9999437 0.9934871 0.993498 -0.3454107 0.8515523 0.9858181 -0.3453807 0.8515295 0.9858163 -0.3453439 0.8515008 0.9858141 -0.3452987 0.8514648 0.9858113 -0.3452442 0.8514199 0.9858079 -0.3451791 0.8513639 0.9858036 -0.3451032 0.8512944 0.9857982 -0.3450175 0.8512087 0.9857916 -0.3449254 0.8511039 0.9857835 -0.3448353 0.850977 0.9857738 -0.3447636 0.8508257 0.9857621 -0.3447407 0.8506491 0.9857485 -0.3448204 0.8504495 0.9857332 -0.3450957 0.8502355 0.9857167 -0.3457234 0.8500265 0.9857006 -0.3469645 0.8498619 0.9856879 -0.3492254 0.8498092 0.9856839 -0.3523802 0.8498092 0.9856839 -0.3563715 0.8498092 0.9856839 -0.3614209 0.8498092 0.9856839 -0.3678092 0.8498092 0.9856839 -0.3758911 0.8498092 0.9856839 -0.3861159 0.8498092 0.9856839 -0.3990515 0.8498092 0.9856839 -0.4154167 0.8498092 0.9856839 -0.4361208 0.8498092 0.9856839 -0.4623142 0.8498092 0.9856839 -0.4954523 0.8498092 0.9856839 -0.5373763 0.8498092 0.9856839 -0.5904156 0.8498092 0.9856839 -0.6575172 0.8498092 0.9856839 -0.7424095 0.8498092 0.9856839 -0.8498092 0.8498092 0.9856839 -0.9856839 0.8498092 0.9856839 -0.9890048 0.7711789 0.8673437 -0.9914995 0.7321559 0.7992446 -0.9933953 0.721513 0.7676683 -0.9948487 0.7299859 0.7613218 -0.9959706 0.7502359 0.7712508 -0.9968409 0.776724 0.7906611 -0.9975189 0.8055009 0.8146529 -0.9980488 0.8339392 0.8398974 -0.9984638 0.8604449 0.8642952 -0.9987895 0.8841823 0.886655 -0.9990455 0.9048372 0.9064168 -0.999247 0.9224281 0.9234329 -0.9994057 0.9371669 0.9378038 -0.9995308 0.9493615 0.9497641 -0.9996295 0.959353 0.9596068 -0.9997074 0.967477 0.9676368 -0.9997688 0.9740432 0.9741436 -0.9998174 0.9793253 0.9793883 -0.9998557 0.9835588 0.9835983 -0.999886 0.9869419 0.9869667 -0.9999099 0.9896392 0.9896547 -0.9999288 0.9917859 0.9917956 -0.9999437 0.9934919 0.993498 -0.3454107 0.9858181 0.9858181 -0.3453807 0.9858163 0.9858163 -0.3453439 0.9858141 0.9858141 -0.3452987 0.9858113 0.9858113 -0.3452442 0.9858079 0.9858079 -0.3451791 0.9858036 0.9858036 -0.3451032 0.9857982 0.9857982 -0.3450175 0.9857916 0.9857916 -0.3449254 0.9857835 0.9857835 -0.3448353 0.9857738 0.9857738 -0.3447636 0.9857621 0.9857621 -0.3447407 0.9857485 0.9857485 -0.3448204 0.9857332 0.9857332 -0.3450957 0.9857167 0.9857167 -0.3457234 0.9857006 0.9857006 -0.3469645 0.9856879 0.9856879 -0.3492254 0.9856839 0.9856839 -0.3523802 0.9856839 0.9856839 -0.3563715 0.9856839 0.9856839 -0.3614209 0.9856839 0.9856839 -0.3678092 0.9856839 0.9856839 -0.3758911 0.9856839 0.9856839 -0.3861159 0.9856839 0.9856839 -0.3990515 0.9856839 0.9856839 -0.4154167 0.9856839 0.9856839 -0.4361208 0.9856839 0.9856839 -0.4623142 0.9856839 0.9856839 -0.4954523 0.9856839 0.9856839 -0.5373763 0.9856839 0.9856839 -0.5904156 0.9856839 0.9856839 -0.6575172 0.9856839 0.9856839 -0.7424095 0.9856839 0.9856839 -0.8498092 0.9856839 0.9856839 -0.9856839 0.9856839 0.9856839 -0.9890048 0.8673437 0.8673437 -0.9914995 0.7992446 0.7992446 -0.9933953 0.7676683 0.7676683 -0.9948487 0.7613218 0.7613218 -0.9959706 0.7712508 0.7712508 -0.9968409 0.7906611 0.7906611 -0.9975189 0.8146529 0.8146529 -0.9980488 0.8398974 0.8398974 -0.9984638 0.8642952 0.8642952 -0.9987895 0.886655 0.886655 -0.9990455 0.9064168 0.9064168 -0.999247 0.9234329 0.9234329 -0.9994057 0.9378038 0.9378038 -0.9995308 0.9497641 0.9497641 -0.9996295 0.9596068 0.9596068 -0.9997074 0.9676368 0.9676368 -0.9997688 0.9741436 0.9741436 -0.9998174 0.9793883 0.9793883 -0.9998557 0.9835983 0.9835983 -0.999886 0.9869667 0.9869667 -0.9999099 0.9896547 0.9896547 -0.9999288 0.9917956 0.9917956 -0.9999437 0.993498 0.993498 -0.4144197 0.9890841 0.8686126 -0.4143955 0.9890831 0.8685959 -0.4143657 0.9890818 0.868575 -0.414329 0.9890801 0.8685488 -0.4142845 0.9890781 0.868516 -0.4142311 0.9890755 0.8684752 -0.4141683 0.9890723 0.8684246 -0.4140964 0.9890684 0.8683621 -0.4140176 0.9890637 0.8682858 -0.4139373 0.9890579 0.8681933 -0.4138668 0.989051 0.8680831 -0.4138277 0.989043 0.8679546 -0.4138582 0.9890339 0.8678093 -0.4140252 0.9890241 0.8676536 -0.4144423 0.9890146 0.8675017 -0.4152991 0.9890072 0.867382 -0.4168922 0.9890048 0.8673437 -0.419125 0.9890048 0.8673437 -0.4219498 0.9890048 0.8673437 -0.4255236 0.9890048 0.8673437 -0.4300448 0.9890048 0.8673437 -0.4357648 0.9890048 0.8673437 -0.4430013 0.9890048 0.8673437 -0.4521565 0.9890048 0.8673437 -0.4637389 0.9890048 0.8673437 -0.4783922 0.9890048 0.8673437 -0.4969305 0.9890048 0.8673437 -0.5203839 0.9890048 0.8673437 -0.5500554 0.9890048 0.8673437 -0.5875938 0.9890048 0.8673437 -0.6350848 0.9890048 0.8673437 -0.695167 0.9890048 0.8673437 -0.7711789 0.9890048 0.8673437 -0.8673437 0.9890048 0.8673437 -0.9890048 0.9890048 0.8673437 -0.9914995 0.8841204 0.7992446 -0.9933953 0.8260608 0.7676683 -0.9948487 0.8009659 0.7613218 -0.9959706 0.7978374 0.7712508 -0.9968409 0.8082934 0.7906611 -0.9975189 0.8262314 0.8146529 -0.9980488 0.8474353 0.8398974 -0.9984638 0.8691663 0.8642952 -0.9987895 0.8897832 0.886655 -0.9990455 0.9084153 0.9064168 -0.999247 0.9247041 0.9234329 -0.9994057 0.9386096 0.9378038 -0.9995308 0.9502734 0.9497641 -0.9996295 0.959928 0.9596068 -0.9997074 0.9678389 0.9676368 -0.9997688 0.9742706 0.9741436 -0.9998174 0.9794681 0.9793883 -0.9998557 0.9836483 0.9835983 -0.999886 0.986998 0.9869667 -0.9999099 0.9896744 0.9896547 -0.9999288 0.9918079 0.9917956 -0.9999437 0.9935057 0.993498 -0.4834235 0.9915469 0.8008399 -0.4834045 0.9915463 0.800819 -0.4833811 0.9915455 0.8007926 -0.4833522 0.9915446 0.8007596 -0.4833171 0.9915433 0.8007184 -0.4832747 0.9915418 0.800667 -0.4832246 0.9915399 0.8006032 -0.4831666 0.9915376 0.8005247 -0.4831021 0.9915347 0.8004286 -0.4830346 0.9915312 0.8003123 -0.4829718 0.9915271 0.8001737 -0.4829286 0.9915223 0.800012 -0.4829319 0.9915169 0.7998295 -0.4830292 0.991511 0.7996338 -0.4833013 0.9915054 0.7994429 -0.4838841 0.9915009 0.7992927 -0.4849907 0.9914995 0.7992446 -0.4865484 0.9914995 0.7992446 -0.4885191 0.9914995 0.7992446 -0.4910123 0.9914995 0.7992446 -0.4941665 0.9914995 0.7992446 -0.498157 0.9914995 0.7992446 -0.5032055 0.9914995 0.7992446 -0.5095925 0.9914995 0.7992446 -0.5176729 0.9914995 0.7992446 -0.5278957 0.9914995 0.7992446 -0.5408288 0.9914995 0.7992446 -0.5571908 0.9914995 0.7992446 -0.577891 0.9914995 0.7992446 -0.6040793 0.9914995 0.7992446 -0.637211 0.9914995 0.7992446 -0.6791269 0.9914995 0.7992446 -0.7321559 0.9914995 0.7992446 -0.7992446 0.9914995 0.7992446 -0.8841204 0.9914995 0.7992446 -0.9914995 0.9914995 0.7992446 -0.9933953 0.8999349 0.7676683 -0.9948487 0.8511207 0.7613218 -0.9959706 0.8314729 0.7712508 -0.9968409 0.8306004 0.7906611 -0.9975189 0.8408797 0.8146529 -0.9980488 0.8569716 0.8398974 -0.9984638 0.875329 0.8642952 -0.9987895 0.8937407 0.886655 -0.9990455 0.9109436 0.9064168 -0.999247 0.9263124 0.9234329 -0.9994057 0.939629 0.9378038 -0.9995308 0.9509177 0.9497641 -0.9996295 0.9603343 0.9596068 -0.9997074 0.9680946 0.9676368 -0.9997688 0.9744313 0.9741436 -0.9998174 0.9795689 0.9793883 -0.9998557 0.9837116 0.9835983 -0.999886 0.9870376 0.9869667 -0.9999099 0.9896992 0.9896547 -0.9999288 0.9918234 0.9917956 -0.9999437 0.9935154 0.993498 -0.5504963 0.993424 0.7691886 -0.5504818 0.9934236 0.7691686 -0.550464 0.9934231 0.7691435 -0.5504419 0.9934225 0.769112 -0.550415 0.9934218 0.7690727 -0.5503825 0.9934209 0.7690236 -0.5503438 0.9934197 0.7689629 -0.5502987 0.9934183 0.7688879 -0.550248 0.9934166 0.7687963 -0.5501939 0.9934145 0.7686854 -0.5501416 0.993412 0.7685533 -0.5501012 0.9934091 0.7683993 -0.5500915 0.9934058 0.7682253 -0.5501456 0.9934023 0.7680389 -0.5503203 0.9933988 0.7678572 -0.5507113 0.9933961 0.7677141 -0.5514695 0.9933953 0.7676683 -0.5525411 0.9933953 0.7676683 -0.5538969 0.9933953 0.7676683 -0.5556122 0.9933953 0.7676683 -0.5577822 0.9933953 0.7676683 -0.5605276 0.9933953 0.7676683 -0.5640008 0.9933953 0.7676683 -0.5683949 0.9933953 0.7676683 -0.573954 0.9933953 0.7676683 -0.580987 0.9933953 0.7676683 -0.5898847 0.9933953 0.7676683 -0.6011414 0.9933953 0.7676683 -0.6153825 0.9933953 0.7676683 -0.6333995 0.9933953 0.7676683 -0.6561933 0.9933953 0.7676683 -0.6850303 0.9933953 0.7676683 -0.721513 0.9933953 0.7676683 -0.7676683 0.9933953 0.7676683 -0.8260608 0.9933953 0.7676683 -0.8999349 0.9933953 0.7676683 -0.9933953 0.9933953 0.7676683 -0.9948487 0.9145732 0.7613218 -0.9959706 0.8740262 0.7712508 -0.9968409 0.8588218 0.7906611 -0.9975189 0.8594117 0.8146529 -0.9980488 0.8690364 0.8398974 -0.9984638 0.8831255 0.8642952 -0.9987895 0.8987476 0.886655 -0.9990455 0.9141422 0.9064168 -0.999247 0.928347 0.9234329 -0.9994057 0.9409186 0.9378038 -0.9995308 0.9517328 0.9497641 -0.9996295 0.9608482 0.9596068 -0.9997074 0.9684181 0.9676368 -0.9997688 0.9746346 0.9741436 -0.9998174 0.9796966 0.9793883 -0.9998557 0.9837916 0.9835983 -0.999886 0.9870878 0.9869667 -0.9999099 0.9897306 0.9896547 -0.9999288 0.9918431 0.9917956 -0.9999437 0.9935277 0.993498 -0.6139459 0.9948662 0.7626012 -0.6139352 0.994866 0.7625844 -0.6139219 0.9948657 0.7625632 -0.6139056 0.9948653 0.7625367 -0.6138855 0.9948649 0.7625036 -0.6138613 0.9948643 0.7624623 -0.6138323 0.9948636 0.7624111 -0.6137984 0.9948628 0.762348 -0.6137599 0.9948617 0.7622708 -0.6137183 0.9948604 0.7621775 -0.6136769 0.9948589 0.7620663 -0.6136427 0.9948571 0.7619366 -0.6136284 0.9948551 0.7617903 -0.6136569 0.994853 0.7616334 -0.6137675 0.9948509 0.7614806 -0.6140266 0.9948493 0.7613603 -0.6145393 0.9948487 0.7613218 -0.6152669 0.9948487 0.7613218 -0.6161874 0.9948487 0.7613218 -0.6173519 0.9948487 0.7613218 -0.6188252 0.9948487 0.7613218 -0.6206891 0.9948487 0.7613218 -0.6230471 0.9948487 0.7613218 -0.6260304 0.9948487 0.7613218 -0.6298046 0.9948487 0.7613218 -0.6345795 0.9948487 0.7613218 -0.6406203 0.9948487 0.7613218 -0.6482627 0.9948487 0.7613218 -0.6579314 0.9948487 0.7613218 -0.6701635 0.9948487 0.7613218 -0.6856388 0.9948487 0.7613218 -0.7052169 0.9948487 0.7613218 -0.7299859 0.9948487 0.7613218 -0.7613218 0.9948487 0.7613218 -0.8009659 0.9948487 0.7613218 -0.8511207 0.9948487 0.7613218 -0.9145732 0.9948487 0.7613218 -0.9948487 0.9948487 0.7613218 -0.9959706 0.9278617 0.7712508 -0.9968409 0.8945255 0.7906611 -0.9975189 0.8828571 0.8146529 -0.9980488 0.8842998 0.8398974 -0.9984638 0.892989 0.8642952 -0.9987895 0.9050819 0.886655 -0.9990455 0.9181889 0.9064168 -0.999247 0.9309211 0.9234329 -0.9994057 0.9425502 0.9378038 -0.9995308 0.952764 0.9497641 -0.9996295 0.9614985 0.9596068 -0.9997074 0.9688274 0.9676368 -0.9997688 0.9748918 0.9741436 -0.9998174 0.979858 0.9793883 -0.9998557 0.9838928 0.9835983 -0.999886 0.9871512 0.9869667 -0.9999099 0.9897703 0.9896547 -0.9999288 0.991868 0.9917956 -0.9999437 0.9935432 0.993498 -0.6724572 0.9959813 0.7722508 -0.6724495 0.9959811 0.7722376 -0.6724399 0.9959809 0.772221 -0.672428 0.9959807 0.7722003 -0.6724135 0.9959804 0.7721744 -0.6723959 0.9959801 0.7721421 -0.6723748 0.9959797 0.7721021 -0.67235 0.9959791 0.7720527 -0.6723217 0.9959785 0.7719924 -0.6722907 0.9959777 0.7719194 -0.6722594 0.9959768 0.7718325 -0.6722322 0.9959757 0.7717312 -0.672218 0.9959745 0.7716168 -0.672232 0.9959732 0.7714942 -0.6723012 0.9959719 0.7713748 -0.6724711 0.9959709 0.7712809 -0.6728136 0.9959706 0.7712508 -0.6733015 0.9959706 0.7712508 -0.6739188 0.9959706 0.7712508 -0.6746998 0.9959706 0.7712508 -0.6756878 0.9959706 0.7712508 -0.6769378 0.9959706 0.7712508 -0.6785192 0.9959706 0.7712508 -0.6805199 0.9959706 0.7712508 -0.683051 0.9959706 0.7712508 -0.6862532 0.9959706 0.7712508 -0.6903044 0.9959706 0.7712508 -0.6954296 0.9959706 0.7712508 -0.7019138 0.9959706 0.7712508 -0.710117 0.9959706 0.7712508 -0.7204952 0.9959706 0.7712508 -0.733625 0.9959706 0.7712508 -0.7502359 0.9959706 0.7712508 -0.7712508 0.9959706 0.7712508 -0.7978374 0.9959706 0.7712508 -0.8314729 0.9959706 0.7712508 -0.8740262 0.9959706 0.7712508 -0.9278617 0.9959706 0.7712508 -0.9959706 0.9959706 0.7712508 -0.9968409 0.9396953 0.7906611 -0.9975189 0.9125186 0.8146529 -0.9980488 0.9036101 0.8398974 -0.9984638 0.9054678 0.8642952 -0.9987895 0.9130957 0.886655 -0.9990455 0.9233085 0.9064168 -0.999247 0.9341777 0.9234329 -0.9994057 0.9446144 0.9378038 -0.9995308 0.9540687 0.9497641 -0.9996295 0.9623212 0.9596068 -0.9997074 0.9693452 0.9676368 -0.9997688 0.9752172 0.9741436 -0.9998174 0.9800622 0.9793883 -0.9998557 0.9840209 0.9835983 -0.999886 0.9872315 0.9869667 -0.9999099 0.9898206 0.9896547 -0.9999288 0.9918994 0.9917956 -0.9999437 0.9935629 0.993498 -0.7251659 0.9968475 0.7914042 -0.7251605 0.9968474 0.7913944 -0.7251537 0.9968473 0.7913821 -0.7251454 0.9968472 0.7913667 -0.7251351 0.996847 0.7913474 -0.7251226 0.9968468 0.7913234 -0.7251076 0.9968465 0.7912937 -0.7250899 0.9968462 0.791257 -0.7250697 0.9968458 0.7912121 -0.7250473 0.9968453 0.7911579 -0.7250244 0.9968448 0.7910933 -0.7250039 0.9968441 0.791018 -0.7249916 0.9968433 0.790933 -0.7249978 0.9968425 0.7908419 -0.7250408 0.9968418 0.7907532 -0.7251511 0.9968411 0.7906834 -0.7253775 0.9968409 0.7906611 -0.7257011 0.9968409 0.7906611 -0.7261105 0.9968409 0.7906611 -0.7266285 0.9968409 0.7906611 -0.7272837 0.9968409 0.7906611 -0.7281127 0.9968409 0.7906611 -0.7291615 0.9968409 0.7906611 -0.7304884 0.9968409 0.7906611 -0.732167 0.9968409 0.7906611 -0.7342907 0.9968409 0.7906611 -0.7369774 0.9968409 0.7906611 -0.7403765 0.9968409 0.7906611 -0.7446768 0.9968409 0.7906611 -0.7501172 0.9968409 0.7906611 -0.757 0.9968409 0.7906611 -0.7657077 0.9968409 0.7906611 -0.776724 0.9968409 0.7906611 -0.7906611 0.9968409 0.7906611 -0.8082934 0.9968409 0.7906611 -0.8306004 0.9968409 0.7906611 -0.8588218 0.9968409 0.7906611 -0.8945255 0.9968409 0.7906611 -0.9396953 0.9968409 0.7906611 -0.9968409 0.9968409 0.7906611 -0.9975189 0.9500442 0.8146529 -0.9980488 0.9280401 0.8398974 -0.9984638 0.921255 0.8642952 -0.9987895 0.9232341 0.886655 -0.9990455 0.9297854 0.9064168 -0.999247 0.9382977 0.9234329 -0.9994057 0.9472259 0.9378038 -0.9995308 0.9557192 0.9497641 -0.9996295 0.963362 0.9596068 -0.9997074 0.9700002 0.9676368 -0.9997688 0.9756289 0.9741436 -0.9998174 0.9803206 0.9793883 -0.9998557 0.9841829 0.9835983 -0.999886 0.987333 0.9869667 -0.9999099 0.9898842 0.9896547 -0.9999288 0.9919392 0.9917956 -0.9999437 0.9935878 0.993498 -0.7716588 0.997523 0.8151851 -0.7716551 0.997523 0.8151781 -0.7716504 0.9975229 0.8151693 -0.7716446 0.9975228 0.8151582 -0.7716375 0.9975227 0.8151444 -0.7716288 0.9975226 0.8151272 -0.7716184 0.9975224 0.8151059 -0.7716061 0.9975222 0.8150796 -0.7715919 0.997522 0.8150475 -0.7715762 0.9975217 0.8150086 -0.7715599 0.9975213 0.8149624 -0.7715449 0.9975209 0.8149084 -0.7715352 0.9975204 0.8148475 -0.7715376 0.9975199 0.8147824 -0.7715641 0.9975194 0.8147189 -0.7716352 0.9975191 0.8146689 -0.7717834 0.9975189 0.8146529 -0.7719959 0.9975189 0.8146529 -0.7722648 0.9975189 0.8146529 -0.7726049 0.9975189 0.8146529 -0.7730352 0.9975189 0.8146529 -0.7735795 0.9975189 0.8146529 -0.7742682 0.9975189 0.8146529 -0.7751395 0.9975189 0.8146529 -0.7762418 0.9975189 0.8146529 -0.7776364 0.9975189 0.8146529 -0.7794007 0.9975189 0.8146529 -0.7816327 0.9975189 0.8146529 -0.7844566 0.9975189 0.8146529 -0.7880291 0.9975189 0.8146529 -0.7925488 0.9975189 0.8146529 -0.7982669 0.9975189 0.8146529 -0.8055009 0.9975189 0.8146529 -0.8146529 0.9975189 0.8146529 -0.8262314 0.9975189 0.8146529 -0.8408797 0.9975189 0.8146529 -0.8594117 0.9975189 0.8146529 -0.8828571 0.9975189 0.8146529 -0.9125186 0.9975189 0.8146529 -0.9500442 0.9975189 0.8146529 -0.9975189 0.9975189 0.8146529 -0.9980488 0.9589472 0.8398974 -0.9984638 0.9412278 0.8642952 -0.9987895 0.9360606 0.886655 -0.9990455 0.9379796 0.9064168 -0.999247 0.94351 0.9234329 -0.9994057 0.9505298 0.9378038 -0.9995308 0.9578074 0.9497641 -0.9996295 0.9646787 0.9596068 -0.9997074 0.970829 0.9676368 -0.9997688 0.9761497 0.9741436 -0.9998174 0.9806476 0.9793883 -0.9998557 0.984388 0.9835983 -0.999886 0.9874615 0.9869667 -0.9999099 0.9899646 0.9896547 -0.9999288 0.9919896 0.9917956 -0.9999437 0.9936193 0.993498 -0.8119154 0.9980513 0.8402679 -0.8119128 0.9980512 0.840263 -0.8119096 0.9980512 0.8402569 -0.8119057 0.9980511 0.8402492 -0.8119009 0.9980511 0.8402396 -0.8118949 0.998051 0.8402276 -0.8118878 0.9980509 0.8402127 -0.8118794 0.9980508 0.8401944 -0.8118697 0.9980506 0.8401721 -0.8118589 0.9980504 0.840145 -0.8118476 0.9980502 0.8401128 -0.811837 0.99805 0.8400752 -0.8118298 0.9980497 0.8400329 -0.8118303 0.9980494 0.8399875 -0.8118466 0.9980491 0.8399433 -0.8118921 0.9980488 0.8399085 -0.8119884 0.9980488 0.8398974 -0.8121268 0.9980488 0.8398974 -0.8123018 0.9980488 0.8398974 -0.8125232 0.9980488 0.8398974 -0.8128033 0.9980488 0.8398974 -0.8131577 0.9980488 0.8398974 -0.8136061 0.9980488 0.8398974 -0.8141733 0.9980488 0.8398974 -0.8148909 0.9980488 0.8398974 -0.8157988 0.9980488 0.8398974 -0.8169474 0.9980488 0.8398974 -0.8184005 0.9980488 0.8398974 -0.8202389 0.9980488 0.8398974 -0.8225647 0.9980488 0.8398974 -0.8255071 0.9980488 0.8398974 -0.8292297 0.9980488 0.8398974 -0.8339392 0.9980488 0.8398974 -0.8398974 0.9980488 0.8398974 -0.8474353 0.9980488 0.8398974 -0.8569716 0.9980488 0.8398974 -0.8690364 0.9980488 0.8398974 -0.8842998 0.9980488 0.8398974 -0.9036101 0.9980488 0.8398974 -0.9280401 0.9980488 0.8398974 -0.9589472 0.9980488 0.8398974 -0.9980488 0.9980488 0.8398974 -0.9984638 0.9664961 0.8642952 -0.9987895 0.9522877 0.886655 -0.9990455 0.9483463 0.9064168 -0.999247 0.9501042 0.9234329 -0.9994057 0.9547096 0.9378038 -0.9995308 0.9604492 0.9497641 -0.9996295 0.9663445 0.9596068 -0.9997074 0.9718774 0.9676368 -0.9997688 0.9768086 0.9741436 -0.9998174 0.9810611 0.9793883 -0.9998557 0.9846473 0.9835983 -0.999886 0.987624 0.9869667 -0.9999099 0.9900664 0.9896547 -0.9999288 0.9920533 0.9917956 -0.9999437 0.9936592 0.993498 -0.8462171 0.9984653 0.8645475 -0.8462154 0.9984653 0.8645442 -0.8462132 0.9984653 0.86454 -0.8462106 0.9984653 0.8645348 -0.8462073 0.9984652 0.8645282 -0.8462034 0.9984652 0.86452 -0.8461986 0.9984651 0.8645099 -0.8461929 0.998465 0.8644975 -0.8461864 0.9984649 0.8644822 -0.8461791 0.9984648 0.8644638 -0.8461714 0.9984647 0.8644419 -0.8461641 0.9984645 0.8644163 -0.8461589 0.9984643 0.8643874 -0.8461587 0.9984642 0.8643565 -0.8461687 0.998464 0.8643265 -0.8461977 0.9984638 0.8643028 -0.8462598 0.9984638 0.8642952 -0.8463492 0.9984638 0.8642952 -0.8464623 0.9984638 0.8642952 -0.8466054 0.9984638 0.8642952 -0.8467864 0.9984638 0.8642952 -0.8470154 0.9984638 0.8642952 -0.8473052 0.9984638 0.8642952 -0.8476717 0.9984638 0.8642952 -0.8481355 0.9984638 0.8642952 -0.8487222 0.9984638 0.8642952 -0.8494644 0.9984638 0.8642952 -0.8504035 0.9984638 0.8642952 -0.8515915 0.9984638 0.8642952 -0.8530945 0.9984638 0.8642952 -0.8549959 0.9984638 0.8642952 -0.8574015 0.9984638 0.8642952 -0.8604449 0.9984638 0.8642952 -0.8642952 0.9984638 0.8642952 -0.8691663 0.9984638 0.8642952 -0.875329 0.9984638 0.8642952 -0.8831255 0.9984638 0.8642952 -0.892989 0.9984638 0.8642952 -0.9054678 0.9984638 0.8642952 -0.921255 0.9984638 0.8642952 -0.9412278 0.9984638 0.8642952 -0.9664961 0.9984638 0.8642952 -0.9984638 0.9984638 0.8642952 -0.9987895 0.9728171 0.886655 -0.9990455 0.9614615 0.9064168 -0.999247 0.9584468 0.9234329 -0.9994057 0.9599976 0.9378038 -0.9995308 0.9637914 0.9497641 -0.9996295 0.968452 0.9596068 -0.9997074 0.9732039 0.9676368 -0.9997688 0.9776422 0.9741436 -0.9998174 0.9815844 0.9793883 -0.9998557 0.9849754 0.9835983 -0.999886 0.9878296 0.9869667 -0.9999099 0.9901951 0.9896547 -0.9999288 0.9921339 0.9917956 -0.9999437 0.9937096 0.993498 -0.8750477 0.9987905 0.8868238 -0.8750466 0.9987905 0.8868215 -0.8750451 0.9987904 0.8868187 -0.8750434 0.9987904 0.8868152 -0.8750412 0.9987904 0.8868108 -0.8750386 0.9987904 0.8868054 -0.8750355 0.9987903 0.8867986 -0.8750317 0.9987903 0.8867903 -0.8750274 0.9987902 0.8867801 -0.8750225 0.9987902 0.8867677 -0.8750173 0.9987901 0.8867531 -0.8750124 0.99879 0.8867359 -0.8750088 0.9987899 0.8867166 -0.8750084 0.9987897 0.886696 -0.8750145 0.9987896 0.8866758 -0.8750329 0.9987895 0.88666 -0.8750727 0.9987895 0.886655 -0.8751301 0.9987895 0.886655 -0.8752028 0.9987895 0.886655 -0.8752947 0.9987895 0.886655 -0.8754109 0.9987895 0.886655 -0.875558 0.9987895 0.886655 -0.8757441 0.9987895 0.886655 -0.8759795 0.9987895 0.886655 -0.8762773 0.9987895 0.886655 -0.8766541 0.9987895 0.886655 -0.8771307 0.9987895 0.886655 -0.8777338 0.9987895 0.886655 -0.8784967 0.9987895 0.886655 -0.8794619 0.9987895 0.886655 -0.880683 0.9987895 0.886655 -0.8822279 0.9987895 0.886655 -0.8841823 0.9987895 0.886655 -0.886655 0.9987895 0.886655 -0.8897832 0.9987895 0.886655 -0.8937407 0.9987895 0.886655 -0.8987476 0.9987895 0.886655 -0.9050819 0.9987895 0.886655 -0.9130957 0.9987895 0.886655 -0.9232341 0.9987895 0.886655 -0.9360606 0.9987895 0.886655 -0.9522877 0.9987895 0.886655 -0.9728171 0.9987895 0.886655 -0.9987895 0.9987895 0.886655 -0.9990455 0.9780539 0.9064168 -0.999247 0.9690013 0.9234329 -0.9994057 0.9666876 0.9378038 -0.9995308 0.9680197 0.9497641 -0.9996295 0.9711183 0.9596068 -0.9997074 0.974882 0.9676368 -0.9997688 0.9786968 0.9741436 -0.9998174 0.9822464 0.9793883 -0.9998557 0.9853905 0.9835983 -0.999886 0.9880897 0.9869667 -0.9999099 0.990358 0.9896547 -0.9999288 0.9922358 0.9917956 -0.9999437 0.9937734 0.993498 -0.8990028 0.9990461 0.9065282 -0.899002 0.9990461 0.9065267 -0.8990011 0.9990461 0.9065249 -0.899 0.9990461 0.9065226 -0.8989986 0.9990461 0.9065197 -0.8989969 0.9990461 0.9065161 -0.8989948 0.9990461 0.9065116 -0.8989923 0.999046 0.9065061 -0.8989895 0.999046 0.9064994 -0.8989863 0.9990459 0.9064912 -0.8989829 0.9990459 0.9064815 -0.8989796 0.9990458 0.9064702 -0.8989771 0.9990458 0.9064575 -0.8989767 0.9990457 0.9064439 -0.8989805 0.9990456 0.9064306 -0.8989921 0.9990456 0.9064202 -0.8990175 0.9990455 0.9064168 -0.8990542 0.9990455 0.9064168 -0.8991006 0.9990455 0.9064168 -0.8991593 0.9990455 0.9064168 -0.8992336 0.9990455 0.9064168 -0.8993275 0.9990455 0.9064168 -0.8994464 0.9990455 0.9064168 -0.8995968 0.9990455 0.9064168 -0.899787 0.9990455 0.9064168 -0.9000277 0.9990455 0.9064168 -0.9003323 0.9990455 0.9064168 -0.9007175 0.9990455 0.9064168 -0.9012049 0.9990455 0.9064168 -0.9018215 0.9990455 0.9064168 -0.9026016 0.9990455 0.9064168 -0.9035886 0.9990455 0.9064168 -0.9048372 0.9990455 0.9064168 -0.9064168 0.9990455 0.9064168 -0.9084153 0.9990455 0.9064168 -0.9109436 0.9990455 0.9064168 -0.9141422 0.9990455 0.9064168 -0.9181889 0.9990455 0.9064168 -0.9233085 0.9990455 0.9064168 -0.9297854 0.9990455 0.9064168 -0.9379796 0.9990455 0.9064168 -0.9483463 0.9990455 0.9064168 -0.9614615 0.9990455 0.9064168 -0.9780539 0.9990455 0.9064168 -0.9990455 0.9990455 0.9064168 -0.999247 0.982354 0.9234329 -0.9994057 0.9751513 0.9378038 -0.9995308 0.9733691 0.9497641 -0.9996295 0.9744915 0.9596068 -0.9997074 0.977005 0.9676368 -0.9997688 0.980031 0.9741436 -0.9998174 0.9830838 0.9793883 -0.9998557 0.9859157 0.9835983 -0.999886 0.9884188 0.9869667 -0.9999099 0.9905641 0.9896547 -0.9999288 0.9923648 0.9917956 -0.9999437 0.9938541 0.993498 -0.9187175 0.9992474 0.9235056 -0.918717 0.9992474 0.9235046 -0.9187164 0.9992474 0.9235034 -0.9187157 0.9992474 0.9235019 -0.9187148 0.9992474 0.9235 -0.9187137 0.9992474 0.9234977 -0.9187123 0.9992473 0.9234947 -0.9187107 0.9992473 0.9234912 -0.9187089 0.9992473 0.9234868 -0.9187068 0.9992473 0.9234815 -0.9187045 0.9992472 0.9234751 -0.9187024 0.9992472 0.9234678 -0.9187008 0.9992472 0.9234595 -0.9187004 0.9992471 0.9234506 -0.9187027 0.9992471 0.9234419 -0.9187101 0.999247 0.9234351 -0.9187262 0.999247 0.9234329 -0.9187495 0.999247 0.9234329 -0.9187791 0.999247 0.9234329 -0.9188164 0.999247 0.9234329 -0.9188636 0.999247 0.9234329 -0.9189234 0.999247 0.9234329 -0.918999 0.999247 0.9234329 -0.9190947 0.999247 0.9234329 -0.9192157 0.999247 0.9234329 -0.9193688 0.999247 0.9234329 -0.9195625 0.999247 0.9234329 -0.9198076 0.999247 0.9234329 -0.9201176 0.999247 0.9234329 -0.9205098 0.999247 0.9234329 -0.9210061 0.999247 0.9234329 -0.9216339 0.999247 0.9234329 -0.9224281 0.999247 0.9234329 -0.9234329 0.999247 0.9234329 -0.9247041 0.999247 0.9234329 -0.9263124 0.999247 0.9234329 -0.928347 0.999247 0.9234329 -0.9309211 0.999247 0.9234329 -0.9341777 0.999247 0.9234329 -0.9382977 0.999247 0.9234329 -0.94351 0.999247 0.9234329 -0.9501042 0.999247 0.9234329 -0.9584468 0.999247 0.9234329 -0.9690013 0.999247 0.9234329 -0.982354 0.999247 0.9234329 -0.999247 0.999247 0.9234329 -0.9994057 0.9858591 0.9378038 -0.9995308 0.9801368 0.9497641 -0.9996295 0.978759 0.9596068 -0.9997074 0.9796909 0.9676368 -0.9997688 0.981719 0.9741436 -0.9998174 0.9841433 0.9793883 -0.9998557 0.9865801 0.9835983 -0.999886 0.9888351 0.9869667 -0.9999099 0.9908248 0.9896547 -0.9999288 0.992528 0.9917956 -0.9999437 0.9939562 0.993498 -0.9348153 0.999406 0.9378508 -0.9348149 0.999406 0.9378502 -0.9348146 0.999406 0.9378494 -0.9348141 0.999406 0.9378484 -0.9348135 0.999406 0.9378472 -0.9348128 0.9994059 0.9378457 -0.9348119 0.9994059 0.9378438 -0.9348109 0.9994059 0.9378415 -0.9348097 0.9994059 0.9378386 -0.9348083 0.9994059 0.9378352 -0.9348069 0.9994059 0.9378311 -0.9348055 0.9994059 0.9378263 -0.9348044 0.9994058 0.937821 -0.9348042 0.9994058 0.9378152 -0.9348056 0.9994058 0.9378096 -0.9348102 0.9994057 0.9378052 -0.9348204 0.9994057 0.9378038 -0.9348352 0.9994057 0.9378038 -0.9348539 0.9994057 0.9378038 -0.9348776 0.9994057 0.9378038 -0.9349075 0.9994057 0.9378038 -0.9349454 0.9994057 0.9378038 -0.9349933 0.9994057 0.9378038 -0.935054 0.9994057 0.9378038 -0.9351307 0.9994057 0.9378038 -0.9352277 0.9994057 0.9378038 -0.9353505 0.9994057 0.9378038 -0.9355059 0.9994057 0.9378038 -0.9357024 0.9994057 0.9378038 -0.935951 0.9994057 0.9378038 -0.9362655 0.9994057 0.9378038 -0.9366635 0.9994057 0.9378038 -0.9371669 0.9994057 0.9378038 -0.9378038 0.9994057 0.9378038 -0.9386096 0.9994057 0.9378038 -0.939629 0.9994057 0.9378038 -0.9409186 0.9994057 0.9378038 -0.9425502 0.9994057 0.9378038 -0.9446144 0.9994057 0.9378038 -0.9472259 0.9994057 0.9378038 -0.9505298 0.9994057 0.9378038 -0.9547096 0.9994057 0.9378038 -0.9599976 0.9994057 0.9378038 -0.9666876 0.9994057 0.9378038 -0.9751513 0.9994057 0.9378038 -0.9858591 0.9994057 0.9378038 -0.9994057 0.9994057 0.9378038 -0.9995308 0.9886988 0.9497641 -0.9996295 0.9841579 0.9596068 -0.9997074 0.983089 0.9676368 -0.9997688 0.9838545 0.9741436 -0.9998174 0.9854838 0.9793883 -0.9998557 0.9874207 0.9835983 -0.999886 0.9893618 0.9869667 -0.9999099 0.9911547 0.9896547 -0.9999288 0.9927345 0.9917956 -0.9999437 0.9940854 0.993498 -0.9478754 0.999531 0.9497943 -0.9478752 0.999531 0.9497939 -0.947875 0.999531 0.9497934 -0.9478746 0.999531 0.9497927 -0.9478743 0.999531 0.949792 -0.9478738 0.999531 0.949791 -0.9478733 0.999531 0.9497898 -0.9478726 0.999531 0.9497883 -0.9478718 0.999531 0.9497865 -0.947871 0.9995309 0.9497843 -0.94787 0.9995309 0.9497816 -0.9478691 0.9995309 0.9497786 -0.9478684 0.9995309 0.9497751 -0.9478683 0.9995309 0.9497714 -0.9478691 0.9995309 0.9497678 -0.947872 0.9995309 0.949765 -0.9478785 0.9995308 0.9497641 -0.9478878 0.9995308 0.9497641 -0.9478997 0.9995308 0.9497641 -0.9479146 0.9995308 0.9497641 -0.9479335 0.9995308 0.9497641 -0.9479575 0.9995308 0.9497641 -0.9479878 0.9995308 0.9497641 -0.9480261 0.9995308 0.9497641 -0.9480746 0.9995308 0.9497641 -0.9481359 0.9995308 0.9497641 -0.9482135 0.9995308 0.9497641 -0.9483117 0.9995308 0.9497641 -0.9484359 0.9995308 0.9497641 -0.9485931 0.9995308 0.9497641 -0.9487918 0.9995308 0.9497641 -0.9490434 0.9995308 0.9497641 -0.9493615 0.9995308 0.9497641 -0.9497641 0.9995308 0.9497641 -0.9502734 0.9995308 0.9497641 -0.9509177 0.9995308 0.9497641 -0.9517328 0.9995308 0.9497641 -0.952764 0.9995308 0.9497641 -0.9540687 0.9995308 0.9497641 -0.9557192 0.9995308 0.9497641 -0.9578074 0.9995308 0.9497641 -0.9604492 0.9995308 0.9497641 -0.9637914 0.9995308 0.9497641 -0.9680197 0.9995308 0.9497641 -0.9733691 0.9995308 0.9497641 -0.9801368 0.9995308 0.9497641 -0.9886988 0.9995308 0.9497641 -0.9995308 0.9995308 0.9497641 -0.9996295 0.9909882 0.9596068 -0.9997074 0.9873879 0.9676368 -0.9997688 0.9865561 0.9741436 -0.9998174 0.9871796 0.9793883 -0.9998557 0.9884841 0.9835983 -0.999886 0.9900282 0.9869667 -0.9999099 0.991572 0.9896547 -0.9999288 0.9929957 0.9917956 -0.9999437 0.9942488 0.993498 -0.958416 0.9996296 0.9596261 -0.9584159 0.9996296 0.9596259 -0.9584157 0.9996296 0.9596255 -0.9584155 0.9996296 0.9596251 -0.9584153 0.9996296 0.9596246 -0.958415 0.9996296 0.959624 -0.9584146 0.9996296 0.9596232 -0.9584142 0.9996296 0.9596223 -0.9584137 0.9996296 0.9596211 -0.9584132 0.9996296 0.9596197 -0.9584126 0.9996296 0.959618 -0.958412 0.9996296 0.9596161 -0.9584115 0.9996296 0.9596139 -0.9584114 0.9996295 0.9596115 -0.958412 0.9996295 0.9596092 -0.9584138 0.9996295 0.9596074 -0.9584178 0.9996295 0.9596068 -0.9584237 0.9996295 0.9596068 -0.9584312 0.9996295 0.9596068 -0.9584406 0.9996295 0.9596068 -0.9584526 0.9996295 0.9596068 -0.9584677 0.9996295 0.9596068 -0.9584868 0.9996295 0.9596068 -0.9585109 0.9996295 0.9596068 -0.9585415 0.9996295 0.9596068 -0.9585802 0.9996295 0.9596068 -0.9586291 0.9996295 0.9596068 -0.958691 0.9996295 0.9596068 -0.9587693 0.9996295 0.9596068 -0.9588684 0.9996295 0.9596068 -0.9589938 0.9996295 0.9596068 -0.9591524 0.9996295 0.9596068 -0.959353 0.9996295 0.9596068 -0.9596068 0.9996295 0.9596068 -0.959928 0.9996295 0.9596068 -0.9603343 0.9996295 0.9596068 -0.9608482 0.9996295 0.9596068 -0.9614985 0.9996295 0.9596068 -0.9623212 0.9996295 0.9596068 -0.963362 0.9996295 0.9596068 -0.9646787 0.9996295 0.9596068 -0.9663445 0.9996295 0.9596068 -0.968452 0.9996295 0.9596068 -0.9711183 0.9996295 0.9596068 -0.9744915 0.9996295 0.9596068 -0.978759 0.9996295 0.9596068 -0.9841579 0.9996295 0.9596068 -0.9909882 0.9996295 0.9596068 -0.9996295 0.9996295 0.9596068 -0.9997074 0.9928267 0.9676368 -0.9997688 0.9899741 0.9741436 -0.9998174 0.989325 0.9793883 -0.9998557 0.9898295 0.9835983 -0.999886 0.9908712 0.9869667 -0.9999099 0.9920999 0.9896547 -0.9999288 0.9933261 0.9917956 -0.9999437 0.9944556 0.993498 -0.9668873 0.9997074 0.967649 -0.9668872 0.9997074 0.9676489 -0.9668871 0.9997074 0.9676487 -0.966887 0.9997074 0.9676484 -0.9668869 0.9997074 0.9676481 -0.9668867 0.9997074 0.9676477 -0.9668865 0.9997074 0.9676472 -0.9668862 0.9997074 0.9676466 -0.9668859 0.9997074 0.9676459 -0.9668855 0.9997074 0.967645 -0.9668852 0.9997074 0.9676439 -0.9668848 0.9997074 0.9676427 -0.9668845 0.9997074 0.9676413 -0.9668844 0.9997074 0.9676398 -0.9668847 0.9997074 0.9676383 -0.9668859 0.9997074 0.9676372 -0.9668884 0.9997074 0.9676368 -0.9668922 0.9997074 0.9676368 -0.9668969 0.9997074 0.9676368 -0.9669028 0.9997074 0.9676368 -0.9669103 0.9997074 0.9676368 -0.9669198 0.9997074 0.9676368 -0.9669318 0.9997074 0.9676368 -0.966947 0.9997074 0.9676368 -0.9669663 0.9997074 0.9676368 -0.9669906 0.9997074 0.9676368 -0.9670214 0.9997074 0.9676368 -0.9670604 0.9997074 0.9676368 -0.9671097 0.9997074 0.9676368 -0.967172 0.9997074 0.9676368 -0.9672509 0.9997074 0.9676368 -0.9673508 0.9997074 0.9676368 -0.967477 0.9997074 0.9676368 -0.9676368 0.9997074 0.9676368 -0.9678389 0.9997074 0.9676368 -0.9680946 0.9997074 0.9676368 -0.9684181 0.9997074 0.9676368 -0.9688274 0.9997074 0.9676368 -0.9693452 0.9997074 0.9676368 -0.9700002 0.9997074 0.9676368 -0.970829 0.9997074 0.9676368 -0.9718774 0.9997074 0.9676368 -0.9732039 0.9997074 0.9676368 -0.974882 0.9997074 0.9676368 -0.977005 0.9997074 0.9676368 -0.9796909 0.9997074 0.9676368 -0.983089 0.9997074 0.9676368 -0.9873879 0.9997074 0.9676368 -0.9928267 0.9997074 0.9676368 -0.9997074 0.9997074 0.9676368 -0.9997688 0.9942982 0.9741436 -0.9998174 0.9920392 0.9793883 -0.9998557 0.9915316 0.9835983 -0.999886 0.9919377 0.9869667 -0.9999099 0.9927678 0.9896547 -0.9999288 0.9937442 0.9917956 -0.9999437 0.9947172 0.993498 -0.9736726 0.9997689 0.9741514 -0.9736726 0.9997689 0.9741513 -0.9736725 0.9997689 0.9741511 -0.9736724 0.9997689 0.974151 -0.9736723 0.9997689 0.9741508 -0.9736722 0.9997689 0.9741505 -0.9736721 0.9997689 0.9741502 -0.9736719 0.9997689 0.9741498 -0.9736717 0.9997689 0.9741494 -0.9736715 0.9997689 0.9741488 -0.9736712 0.9997689 0.9741481 -0.973671 0.9997689 0.9741473 -0.9736708 0.9997689 0.9741464 -0.9736708 0.9997689 0.9741455 -0.973671 0.9997688 0.9741446 -0.9736717 0.9997688 0.9741438 -0.9736733 0.9997688 0.9741436 -0.9736756 0.9997688 0.9741436 -0.9736786 0.9997688 0.9741436 -0.9736823 0.9997688 0.9741436 -0.973687 0.9997688 0.9741436 -0.973693 0.9997688 0.9741436 -0.9737006 0.9997688 0.9741436 -0.9737101 0.9997688 0.9741436 -0.9737222 0.9997688 0.9741436 -0.9737375 0.9997688 0.9741436 -0.9737569 0.9997688 0.9741436 -0.9737814 0.9997688 0.9741436 -0.9738123 0.9997688 0.9741436 -0.9738515 0.9997688 0.9741436 -0.9739011 0.9997688 0.9741436 -0.9739638 0.9997688 0.9741436 -0.9740432 0.9997688 0.9741436 -0.9741436 0.9997688 0.9741436 -0.9742706 0.9997688 0.9741436 -0.9744313 0.9997688 0.9741436 -0.9746346 0.9997688 0.9741436 -0.9748918 0.9997688 0.9741436 -0.9752172 0.9997688 0.9741436 -0.9756289 0.9997688 0.9741436 -0.9761497 0.9997688 0.9741436 -0.9768086 0.9997688 0.9741436 -0.9776422 0.9997688 0.9741436 -0.9786968 0.9997688 0.9741436 -0.980031 0.9997688 0.9741436 -0.981719 0.9997688 0.9741436 -0.9838545 0.9997688 0.9741436 -0.9865561 0.9997688 0.9741436 -0.9899741 0.9997688 0.9741436 -0.9942982 0.9997688 0.9741436 -0.9997688 0.9997688 0.9741436 -0.9998174 0.9954731 0.9793883 -0.9998557 0.9936849 0.9835983 -0.999886 0.993287 0.9869667 -0.9999099 0.9936128 0.9896547 -0.9999288 0.9942731 0.9917956 -0.9999437 0.9950481 0.993498 -0.9790927 0.9998174 0.9793932 -0.9790927 0.9998174 0.9793932 -0.9790927 0.9998174 0.9793931 -0.9790926 0.9998174 0.979393 -0.9790925 0.9998174 0.9793929 -0.9790925 0.9998174 0.9793927 -0.9790924 0.9998174 0.9793925 -0.9790923 0.9998174 0.9793923 -0.9790921 0.9998174 0.979392 -0.979092 0.9998174 0.9793916 -0.9790919 0.9998174 0.9793912 -0.9790917 0.9998174 0.9793907 -0.9790916 0.9998174 0.9793901 -0.9790916 0.9998174 0.9793895 -0.9790917 0.9998174 0.9793889 -0.9790921 0.9998174 0.9793885 -0.9790931 0.9998174 0.9793883 -0.9790946 0.9998174 0.9793883 -0.9790965 0.9998174 0.9793883 -0.9790988 0.9998174 0.9793883 -0.9791018 0.9998174 0.9793883 -0.9791055 0.9998174 0.9793883 -0.9791103 0.9998174 0.9793883 -0.9791163 0.9998174 0.9793883 -0.9791238 0.9998174 0.9793883 -0.9791334 0.9998174 0.9793883 -0.9791456 0.9998174 0.9793883 -0.979161 0.9998174 0.9793883 -0.9791804 0.9998174 0.9793883 -0.979205 0.9998174 0.9793883 -0.9792361 0.9998174 0.9793883 -0.9792755 0.9998174 0.9793883 -0.9793253 0.9998174 0.9793883 -0.9793883 0.9998174 0.9793883 -0.9794681 0.9998174 0.9793883 -0.9795689 0.9998174 0.9793883 -0.9796966 0.9998174 0.9793883 -0.979858 0.9998174 0.9793883 -0.9800622 0.9998174 0.9793883 -0.9803206 0.9998174 0.9793883 -0.9806476 0.9998174 0.9793883 -0.9810611 0.9998174 0.9793883 -0.9815844 0.9998174 0.9793883 -0.9822464 0.9998174 0.9793883 -0.9830838 0.9998174 0.9793883 -0.9841433 0.9998174 0.9793883 -0.9854838 0.9998174 0.9793883 -0.9871796 0.9998174 0.9793883 -0.989325 0.9998174 0.9793883 -0.9920392 0.9998174 0.9793883 -0.9954731 0.9998174 0.9793883 -0.9998174 0.9998174 0.9793883 -0.9998557 0.9964092 0.9835983 -0.999886 0.9949941 0.9869667 -0.9999099 0.9946818 0.9896547 -0.9999288 0.9949422 0.9917956 -0.9999437 0.9954668 0.993498 -0.9834129 0.9998557 0.9836014 -0.9834129 0.9998557 0.9836014 -0.9834129 0.9998557 0.9836013 -0.9834129 0.9998557 0.9836012 -0.9834128 0.9998557 0.9836012 -0.9834128 0.9998557 0.9836011 -0.9834127 0.9998557 0.9836009 -0.9834127 0.9998557 0.9836008 -0.9834126 0.9998557 0.9836006 -0.9834125 0.9998557 0.9836004 -0.9834124 0.9998557 0.9836001 -0.9834123 0.9998557 0.9835998 -0.9834122 0.9998557 0.9835994 -0.9834122 0.9998557 0.9835991 -0.9834123 0.9998557 0.9835987 -0.9834126 0.9998557 0.9835984 -0.9834132 0.9998557 0.9835983 -0.9834141 0.9998557 0.9835983 -0.9834153 0.9998557 0.9835983 -0.9834167 0.9998557 0.9835983 -0.9834186 0.9998557 0.9835983 -0.9834209 0.9998557 0.9835983 -0.9834239 0.9998557 0.9835983 -0.9834277 0.9998557 0.9835983 -0.9834324 0.9998557 0.9835983 -0.9834385 0.9998557 0.9835983 -0.9834461 0.9998557 0.9835983 -0.9834557 0.9998557 0.9835983 -0.9834679 0.9998557 0.9835983 -0.9834833 0.9998557 0.9835983 -0.9835029 0.9998557 0.9835983 -0.9835276 0.9998557 0.9835983 -0.9835588 0.9998557 0.9835983 -0.9835983 0.9998557 0.9835983 -0.9836483 0.9998557 0.9835983 -0.9837116 0.9998557 0.9835983 -0.9837916 0.9998557 0.9835983 -0.9838928 0.9998557 0.9835983 -0.9840209 0.9998557 0.9835983 -0.9841829 0.9998557 0.9835983 -0.984388 0.9998557 0.9835983 -0.9846473 0.9998557 0.9835983 -0.9849754 0.9998557 0.9835983 -0.9853905 0.9998557 0.9835983 -0.9859157 0.9998557 0.9835983 -0.9865801 0.9998557 0.9835983 -0.9874207 0.9998557 0.9835983 -0.9884841 0.9998557 0.9835983 -0.9898295 0.9998557 0.9835983 -0.9915316 0.9998557 0.9835983 -0.9936849 0.9998557 0.9835983 -0.9964092 0.9998557 0.9835983 -0.9998557 0.9998557 0.9835983 -0.999886 0.9971537 0.9869667 -0.9999099 0.9960342 0.9896547 -0.9999288 0.9957887 0.9917956 -0.9999437 0.9959964 0.993498 -0.9868505 0.999886 0.9869686 -0.9868505 0.999886 0.9869686 -0.9868505 0.999886 0.9869685 -0.9868505 0.999886 0.9869685 -0.9868504 0.999886 0.9869685 -0.9868504 0.999886 0.9869684 -0.9868504 0.999886 0.9869683 -0.9868503 0.999886 0.9869682 -0.9868503 0.999886 0.9869681 -0.9868502 0.999886 0.986968 -0.9868502 0.999886 0.9869678 -0.9868501 0.999886 0.9869676 -0.9868501 0.999886 0.9869674 -0.98685 0.999886 0.9869671 -0.9868501 0.999886 0.9869669 -0.9868503 0.999886 0.9869667 -0.9868507 0.999886 0.9869667 -0.9868512 0.999886 0.9869667 -0.986852 0.999886 0.9869667 -0.9868529 0.999886 0.9869667 -0.9868541 0.999886 0.9869667 -0.9868555 0.999886 0.9869667 -0.9868574 0.999886 0.9869667 -0.9868597 0.999886 0.9869667 -0.9868627 0.999886 0.9869667 -0.9868665 0.999886 0.9869667 -0.9868713 0.999886 0.9869667 -0.9868773 0.999886 0.9869667 -0.986885 0.999886 0.9869667 -0.9868946 0.999886 0.9869667 -0.9869069 0.999886 0.9869667 -0.9869223 0.999886 0.9869667 -0.9869419 0.999886 0.9869667 -0.9869667 0.999886 0.9869667 -0.986998 0.999886 0.9869667 -0.9870376 0.999886 0.9869667 -0.9870878 0.999886 0.9869667 -0.9871512 0.999886 0.9869667 -0.9872315 0.999886 0.9869667 -0.987333 0.999886 0.9869667 -0.9874615 0.999886 0.9869667 -0.987624 0.999886 0.9869667 -0.9878296 0.999886 0.9869667 -0.9880897 0.999886 0.9869667 -0.9884188 0.999886 0.9869667 -0.9888351 0.999886 0.9869667 -0.9893618 0.999886 0.9869667 -0.9900282 0.999886 0.9869667 -0.9908712 0.999886 0.9869667 -0.9919377 0.999886 0.9869667 -0.993287 0.999886 0.9869667 -0.9949941 0.999886 0.9869667 -0.9971537 0.999886 0.9869667 -0.999886 0.999886 0.9869667 -0.9999099 0.9977452 0.9896547 -0.9999288 0.9968597 0.9917956 -0.9999437 0.9966665 0.993498 -0.989582 0.9999099 0.989656 -0.989582 0.9999099 0.9896559 -0.989582 0.9999099 0.9896559 -0.989582 0.9999099 0.9896559 -0.989582 0.9999099 0.9896559 -0.9895819 0.9999099 0.9896558 -0.9895819 0.9999099 0.9896558 -0.9895819 0.9999099 0.9896557 -0.9895819 0.9999099 0.9896557 -0.9895818 0.9999099 0.9896556 -0.9895818 0.9999099 0.9896555 -0.9895818 0.9999099 0.9896553 -0.9895817 0.9999099 0.9896552 -0.9895817 0.9999099 0.989655 -0.9895817 0.9999099 0.9896549 -0.9895819 0.9999099 0.9896548 -0.9895821 0.9999099 0.9896547 -0.9895825 0.9999099 0.9896547 -0.9895829 0.9999099 0.9896547 -0.9895835 0.9999099 0.9896547 -0.9895842 0.9999099 0.9896547 -0.9895851 0.9999099 0.9896547 -0.9895863 0.9999099 0.9896547 -0.9895878 0.9999099 0.9896547 -0.9895897 0.9999099 0.9896547 -0.989592 0.9999099 0.9896547 -0.989595 0.9999099 0.9896547 -0.9895988 0.9999099 0.9896547 -0.9896036 0.9999099 0.9896547 -0.9896096 0.9999099 0.9896547 -0.9896173 0.9999099 0.9896547 -0.989627 0.9999099 0.9896547 -0.9896392 0.9999099 0.9896547 -0.9896547 0.9999099 0.9896547 -0.9896744 0.9999099 0.9896547 -0.9896992 0.9999099 0.9896547 -0.9897306 0.9999099 0.9896547 -0.9897703 0.9999099 0.9896547 -0.9898206 0.9999099 0.9896547 -0.9898842 0.9999099 0.9896547 -0.9899646 0.9999099 0.9896547 -0.9900664 0.9999099 0.9896547 -0.9901951 0.9999099 0.9896547 -0.990358 0.9999099 0.9896547 -0.9905641 0.9999099 0.9896547 -0.9908248 0.9999099 0.9896547 -0.9911547 0.9999099 0.9896547 -0.991572 0.9999099 0.9896547 -0.9920999 0.9999099 0.9896547 -0.9927678 0.9999099 0.9896547 -0.9936128 0.9999099 0.9896547 -0.9946818 0.9999099 0.9896547 -0.9960342 0.9999099 0.9896547 -0.9977452 0.9999099 0.9896547 -0.9999099 0.9999099 0.9896547 -0.9999288 0.9982146 0.9917956 -0.9999437 0.9975143 0.993498 -0.9917501 0.9999288 0.9917964 -0.9917501 0.9999288 0.9917964 -0.9917501 0.9999288 0.9917964 -0.9917501 0.9999288 0.9917963 -0.9917501 0.9999288 0.9917963 -0.9917501 0.9999288 0.9917963 -0.99175 0.9999288 0.9917963 -0.99175 0.9999288 0.9917962 -0.99175 0.9999288 0.9917962 -0.99175 0.9999288 0.9917961 -0.99175 0.9999288 0.9917961 -0.9917499 0.9999288 0.991796 -0.9917499 0.9999288 0.9917959 -0.9917499 0.9999288 0.9917958 -0.9917499 0.9999288 0.9917957 -0.99175 0.9999288 0.9917956 -0.9917502 0.9999288 0.9917956 -0.9917504 0.9999288 0.9917956 -0.9917507 0.9999288 0.9917956 -0.991751 0.9999288 0.9917956 -0.9917515 0.9999288 0.9917956 -0.9917521 0.9999288 0.9917956 -0.9917528 0.9999288 0.9917956 -0.9917537 0.9999288 0.9917956 -0.9917549 0.9999288 0.9917956 -0.9917564 0.9999288 0.9917956 -0.9917582 0.9999288 0.9917956 -0.9917606 0.9999288 0.9917956 -0.9917636 0.9999288 0.9917956 -0.9917674 0.9999288 0.9917956 -0.9917722 0.9999288 0.9917956 -0.9917782 0.9999288 0.9917956 -0.9917859 0.9999288 0.9917956 -0.9917956 0.9999288 0.9917956 -0.9918079 0.9999288 0.9917956 -0.9918234 0.9999288 0.9917956 -0.9918431 0.9999288 0.9917956 -0.991868 0.9999288 0.9917956 -0.9918994 0.9999288 0.9917956 -0.9919392 0.9999288 0.9917956 -0.9919896 0.9999288 0.9917956 -0.9920533 0.9999288 0.9917956 -0.9921339 0.9999288 0.9917956 -0.9922358 0.9999288 0.9917956 -0.9923648 0.9999288 0.9917956 -0.992528 0.9999288 0.9917956 -0.9927345 0.9999288 0.9917956 -0.9929957 0.9999288 0.9917956 -0.9933261 0.9999288 0.9917956 -0.9937442 0.9999288 0.9917956 -0.9942731 0.9999288 0.9917956 -0.9949422 0.9999288 0.9917956 -0.9957887 0.9999288 0.9917956 -0.9968597 0.9999288 0.9917956 -0.9982146 0.9999288 0.9917956 -0.9999288 0.9999288 0.9917956 -0.9999437 0.9985868 0.993498 -0.9934695 0.9999437 0.9934985 -0.9934695 0.9999437 0.9934984 -0.9934695 0.9999437 0.9934984 -0.9934695 0.9999437 0.9934984 -0.9934695 0.9999437 0.9934984 -0.9934695 0.9999437 0.9934984 -0.9934695 0.9999437 0.9934984 -0.9934694 0.9999437 0.9934984 -0.9934694 0.9999437 0.9934983 -0.9934694 0.9999437 0.9934983 -0.9934694 0.9999437 0.9934983 -0.9934694 0.9999437 0.9934982 -0.9934694 0.9999437 0.9934981 -0.9934694 0.9999437 0.9934981 -0.9934694 0.9999437 0.993498 -0.9934694 0.9999437 0.993498 -0.9934695 0.9999437 0.993498 -0.9934697 0.9999437 0.993498 -0.9934698 0.9999437 0.993498 -0.9934701 0.9999437 0.993498 -0.9934704 0.9999437 0.993498 -0.9934707 0.9999437 0.993498 -0.9934712 0.9999437 0.993498 -0.9934718 0.9999437 0.993498 -0.9934725 0.9999437 0.993498 -0.9934734 0.9999437 0.993498 -0.9934746 0.9999437 0.993498 -0.9934761 0.9999437 0.993498 -0.9934779 0.9999437 0.993498 -0.9934803 0.9999437 0.993498 -0.9934833 0.9999437 0.993498 -0.9934871 0.9999437 0.993498 -0.9934919 0.9999437 0.993498 -0.993498 0.9999437 0.993498 -0.9935057 0.9999437 0.993498 -0.9935154 0.9999437 0.993498 -0.9935277 0.9999437 0.993498 -0.9935432 0.9999437 0.993498 -0.9935629 0.9999437 0.993498 -0.9935878 0.9999437 0.993498 -0.9936193 0.9999437 0.993498 -0.9936592 0.9999437 0.993498 -0.9937096 0.9999437 0.993498 -0.9937734 0.9999437 0.993498 -0.9938541 0.9999437 0.993498 -0.9939562 0.9999437 0.993498 -0.9940854 0.9999437 0.993498 -0.9942488 0.9999437 0.993498 -0.9944556 0.9999437 0.993498 -0.9947172 0.9999437 0.993498 -0.9950481 0.9999437 0.993498 -0.9954668 0.9999437 0.993498 -0.9959964 0.9999437 0.993498 -0.9966665 0.9999437 0.993498 -0.9975143 0.9999437 0.993498 -0.9985868 0.9999437 0.993498 -0.9999437 0.9999437 0.993498 -0.4144197 0.4144197 0.9890841 -0.4144711 0.4144197 0.9890841 -0.414536 0.4144197 0.9890841 -0.4146182 0.4144197 0.9890841 -0.4147221 0.4144197 0.9890841 -0.4148536 0.4144197 0.9890841 -0.41502 0.4144197 0.9890841 -0.4152305 0.4144197 0.9890841 -0.4154968 0.4144197 0.9890841 -0.4158337 0.4144197 0.9890841 -0.4162599 0.4144197 0.9890841 -0.4167992 0.4144197 0.9890841 -0.4174814 0.4144197 0.9890841 -0.4183444 0.4144197 0.9890841 -0.4194363 0.4144197 0.9890841 -0.4208177 0.4144197 0.9890841 -0.4225654 0.4144197 0.9890841 -0.4247763 0.4144197 0.9890841 -0.4275735 0.4144197 0.9890841 -0.4311123 0.4144197 0.9890841 -0.4355894 0.4144197 0.9890841 -0.4412534 0.4144197 0.9890841 -0.4484192 0.4144197 0.9890841 -0.4574848 0.4144197 0.9890841 -0.468954 0.4144197 0.9890841 -0.483464 0.4144197 0.9890841 -0.5018211 0.4144197 0.9890841 -0.5250451 0.4144197 0.9890841 -0.5544266 0.4144197 0.9890841 -0.591598 0.4144197 0.9890841 -0.6386246 0.4144197 0.9890841 -0.6981193 0.4144197 0.9890841 -0.773388 0.4144197 0.9890841 -0.8686126 0.4144197 0.9890841 -0.9890841 0.4144197 0.9890841 -0.9915469 0.4834235 0.8850325 -0.993424 0.5504963 0.8271953 -0.9948662 0.6139459 0.802031 -0.9959813 0.6724572 0.7987204 -0.9968475 0.7251659 0.8089735 -0.997523 0.7716588 0.8267302 -0.9980513 0.8119154 0.8477882 -0.9984653 0.8462171 0.8694095 -0.9987905 0.8750477 0.8899473 -0.9990461 0.8990028 0.9085243 -0.9992474 0.9187175 0.9247756 -0.999406 0.9348153 0.938656 -0.999531 0.9478754 0.9503032 -0.9996296 0.958416 0.9599471 -0.9997074 0.9668873 0.9678511 -0.9997689 0.9736726 0.9742783 -0.9998174 0.9790927 0.979473 -0.9998557 0.9834129 0.9836514 -0.999886 0.9868505 0.9869999 -0.9999099 0.989582 0.9896756 -0.9999288 0.9917501 0.9918087 -0.9999437 0.9934695 0.9935061 -0.4144197 0.4144711 0.9890841 -0.4143955 0.4143955 0.9890831 -0.4144605 0.4143955 0.9890831 -0.4145427 0.4143955 0.9890831 -0.4146466 0.4143955 0.9890831 -0.4147782 0.4143955 0.9890831 -0.4149446 0.4143955 0.9890831 -0.4151551 0.4143955 0.9890831 -0.4154214 0.4143955 0.9890831 -0.4157584 0.4143955 0.9890831 -0.4161847 0.4143955 0.9890831 -0.416724 0.4143955 0.9890831 -0.4174062 0.4143955 0.9890831 -0.4182694 0.4143955 0.9890831 -0.4193615 0.4143955 0.9890831 -0.420743 0.4143955 0.9890831 -0.4224909 0.4143955 0.9890831 -0.4247022 0.4143955 0.9890831 -0.4274997 0.4143955 0.9890831 -0.431039 0.4143955 0.9890831 -0.4355166 0.4143955 0.9890831 -0.4411814 0.4143955 0.9890831 -0.4483481 0.4143955 0.9890831 -0.4574149 0.4143955 0.9890831 -0.4688855 0.4143955 0.9890831 -0.4833974 0.4143955 0.9890831 -0.5017569 0.4143955 0.9890831 -0.5249839 0.4143955 0.9890831 -0.5543692 0.4143955 0.9890831 -0.5915454 0.4143955 0.9890831 -0.6385781 0.4143955 0.9890831 -0.6980806 0.4143955 0.9890831 -0.773359 0.4143955 0.9890831 -0.8685959 0.4143955 0.9890831 -0.9890831 0.4143955 0.9890831 -0.9915463 0.4834045 0.8850205 -0.9934236 0.5504818 0.8271803 -0.994866 0.6139352 0.802017 -0.9959811 0.6724495 0.7987087 -0.9968474 0.7251605 0.8089645 -0.997523 0.7716551 0.8267236 -0.9980512 0.8119128 0.8477836 -0.9984653 0.8462154 0.8694063 -0.9987905 0.8750466 0.8899451 -0.9990461 0.899002 0.9085228 -0.9992474 0.918717 0.9247746 -0.999406 0.9348149 0.9386553 -0.999531 0.9478752 0.9503028 -0.9996296 0.9584159 0.9599468 -0.9997074 0.9668872 0.9678509 -0.9997689 0.9736726 0.9742782 -0.9998174 0.9790927 0.9794729 -0.9998557 0.9834129 0.9836513 -0.999886 0.9868505 0.9869999 -0.9999099 0.989582 0.9896756 -0.9999288 0.9917501 0.9918087 -0.9999437 0.9934695 0.9935061 -0.4144197 0.414536 0.9890841 -0.4143955 0.4144605 0.9890831 -0.4143657 0.4143657 0.9890818 -0.4144479 0.4143657 0.9890818 -0.4145518 0.4143657 0.9890818 -0.4146834 0.4143657 0.9890818 -0.4148498 0.4143657 0.9890818 -0.4150604 0.4143657 0.9890818 -0.4153268 0.4143657 0.9890818 -0.4156638 0.4143657 0.9890818 -0.4160901 0.4143657 0.9890818 -0.4166295 0.4143657 0.9890818 -0.4173119 0.4143657 0.9890818 -0.4181752 0.4143657 0.9890818 -0.4192674 0.4143657 0.9890818 -0.4206492 0.4143657 0.9890818 -0.4223974 0.4143657 0.9890818 -0.424609 0.4143657 0.9890818 -0.427407 0.4143657 0.9890818 -0.4309468 0.4143657 0.9890818 -0.4354252 0.4143657 0.9890818 -0.4410909 0.4143657 0.9890818 -0.4482588 0.4143657 0.9890818 -0.457327 0.4143657 0.9890818 -0.4687996 0.4143657 0.9890818 -0.4833138 0.4143657 0.9890818 -0.5016763 0.4143657 0.9890818 -0.5249071 0.4143657 0.9890818 -0.5542971 0.4143657 0.9890818 -0.5914794 0.4143657 0.9890818 -0.6385197 0.4143657 0.9890818 -0.6980319 0.4143657 0.9890818 -0.7733226 0.4143657 0.9890818 -0.868575 0.4143657 0.9890818 -0.9890818 0.4143657 0.9890818 -0.9915455 0.4833811 0.8850054 -0.9934231 0.550464 0.8271616 -0.9948657 0.6139219 0.8019994 -0.9959809 0.6724399 0.7986941 -0.9968473 0.7251537 0.8089533 -0.9975229 0.7716504 0.8267153 -0.9980512 0.8119096 0.8477777 -0.9984653 0.8462132 0.8694023 -0.9987904 0.8750451 0.8899424 -0.9990461 0.8990011 0.908521 -0.9992474 0.9187164 0.9247734 -0.999406 0.9348146 0.9386546 -0.999531 0.947875 0.9503023 -0.9996296 0.9584157 0.9599465 -0.9997074 0.9668871 0.9678507 -0.9997689 0.9736725 0.9742781 -0.9998174 0.9790927 0.9794728 -0.9998557 0.9834129 0.9836513 -0.999886 0.9868505 0.9869999 -0.9999099 0.989582 0.9896755 -0.9999288 0.9917501 0.9918086 -0.9999437 0.9934695 0.9935061 -0.4144197 0.4146182 0.9890841 -0.4143955 0.4145427 0.9890831 -0.4143657 0.4144479 0.9890818 -0.414329 0.414329 0.9890801 -0.414433 0.414329 0.9890801 -0.4145646 0.414329 0.9890801 -0.4147311 0.414329 0.9890801 -0.4149417 0.414329 0.9890801 -0.4152081 0.414329 0.9890801 -0.4155452 0.414329 0.9890801 -0.4159716 0.414329 0.9890801 -0.4165111 0.414329 0.9890801 -0.4171936 0.414329 0.9890801 -0.4180571 0.414329 0.9890801 -0.4191496 0.414329 0.9890801 -0.4205316 0.414329 0.9890801 -0.4222801 0.414329 0.9890801 -0.4244922 0.414329 0.9890801 -0.4272908 0.414329 0.9890801 -0.4308314 0.414329 0.9890801 -0.4353106 0.414329 0.9890801 -0.4409775 0.414329 0.9890801 -0.4481468 0.414329 0.9890801 -0.4572169 0.414329 0.9890801 -0.4686918 0.414329 0.9890801 -0.483209 0.414329 0.9890801 -0.5015752 0.414329 0.9890801 -0.5248108 0.414329 0.9890801 -0.5542068 0.414329 0.9890801 -0.5913967 0.414329 0.9890801 -0.6384466 0.414329 0.9890801 -0.6979709 0.414329 0.9890801 -0.7732769 0.414329 0.9890801 -0.8685488 0.414329 0.9890801 -0.9890801 0.414329 0.9890801 -0.9915446 0.4833522 0.8849865 -0.9934225 0.5504419 0.8271381 -0.9948653 0.6139056 0.8019773 -0.9959807 0.672428 0.7986758 -0.9968472 0.7251454 0.8089391 -0.9975228 0.7716446 0.826705 -0.9980511 0.8119057 0.8477704 -0.9984653 0.8462106 0.8693972 -0.9987904 0.8750434 0.889939 -0.9990461 0.899 0.9085187 -0.9992474 0.9187157 0.924772 -0.999406 0.9348141 0.9386536 -0.999531 0.9478746 0.9503017 -0.9996296 0.9584155 0.9599461 -0.9997074 0.966887 0.9678505 -0.9997689 0.9736724 0.974278 -0.9998174 0.9790926 0.9794727 -0.9998557 0.9834129 0.9836512 -0.999886 0.9868505 0.9869998 -0.9999099 0.989582 0.9896755 -0.9999288 0.9917501 0.9918086 -0.9999437 0.9934695 0.9935061 -0.4144197 0.4147221 0.9890841 -0.4143955 0.4146466 0.9890831 -0.4143657 0.4145518 0.9890818 -0.414329 0.414433 0.9890801 -0.4142845 0.4142845 0.9890781 -0.4144161 0.4142845 0.9890781 -0.4145826 0.4142845 0.9890781 -0.4147933 0.4142845 0.9890781 -0.4150598 0.4142845 0.9890781 -0.4153969 0.4142845 0.9890781 -0.4158235 0.4142845 0.9890781 -0.4163631 0.4142845 0.9890781 -0.4170458 0.4142845 0.9890781 -0.4179095 0.4142845 0.9890781 -0.4190022 0.4142845 0.9890781 -0.4203847 0.4142845 0.9890781 -0.4221336 0.4142845 0.9890781 -0.4243463 0.4142845 0.9890781 -0.4271456 0.4142845 0.9890781 -0.430687 0.4142845 0.9890781 -0.4351674 0.4142845 0.9890781 -0.4408357 0.4142845 0.9890781 -0.4480069 0.4142845 0.9890781 -0.4570793 0.4142845 0.9890781 -0.4685571 0.4142845 0.9890781 -0.483078 0.4142845 0.9890781 -0.5014489 0.4142845 0.9890781 -0.5246904 0.4142845 0.9890781 -0.5540939 0.4142845 0.9890781 -0.5912932 0.4142845 0.9890781 -0.6383552 0.4142845 0.9890781 -0.6978947 0.4142845 0.9890781 -0.7732199 0.4142845 0.9890781 -0.868516 0.4142845 0.9890781 -0.9890781 0.4142845 0.9890781 -0.9915433 0.4833171 0.884963 -0.9934218 0.550415 0.8271087 -0.9948649 0.6138855 0.8019497 -0.9959804 0.6724135 0.7986529 -0.996847 0.7251351 0.8089215 -0.9975227 0.7716375 0.826692 -0.9980511 0.8119009 0.8477612 -0.9984652 0.8462073 0.8693909 -0.9987904 0.8750412 0.8899347 -0.9990461 0.8989986 0.9085159 -0.9992474 0.9187148 0.9247701 -0.999406 0.9348135 0.9386524 -0.999531 0.9478743 0.950301 -0.9996296 0.9584153 0.9599456 -0.9997074 0.9668869 0.9678502 -0.9997689 0.9736723 0.9742778 -0.9998174 0.9790925 0.9794726 -0.9998557 0.9834128 0.9836511 -0.999886 0.9868504 0.9869998 -0.9999099 0.989582 0.9896755 -0.9999288 0.9917501 0.9918086 -0.9999437 0.9934695 0.9935061 -0.4144197 0.4148536 0.9890841 -0.4143955 0.4147782 0.9890831 -0.4143657 0.4146834 0.9890818 -0.414329 0.4145646 0.9890801 -0.4142845 0.4144161 0.9890781 -0.4142311 0.4142311 0.9890755 -0.4143977 0.4142311 0.9890755 -0.4146084 0.4142311 0.9890755 -0.414875 0.4142311 0.9890755 -0.4152122 0.4142311 0.9890755 -0.4156389 0.4142311 0.9890755 -0.4161787 0.4142311 0.9890755 -0.4168617 0.4142311 0.9890755 -0.4177256 0.4142311 0.9890755 -0.4188187 0.4142311 0.9890755 -0.4202016 0.4142311 0.9890755 -0.4219511 0.4142311 0.9890755 -0.4241644 0.4142311 0.9890755 -0.4269646 0.4142311 0.9890755 -0.4305072 0.4142311 0.9890755 -0.434989 0.4142311 0.9890755 -0.4406591 0.4142311 0.9890755 -0.4478326 0.4142311 0.9890755 -0.4569079 0.4142311 0.9890755 -0.4683893 0.4142311 0.9890755 -0.4829148 0.4142311 0.9890755 -0.5012915 0.4142311 0.9890755 -0.5245404 0.4142311 0.9890755 -0.5539533 0.4142311 0.9890755 -0.5911644 0.4142311 0.9890755 -0.6382413 0.4142311 0.9890755 -0.6977997 0.4142311 0.9890755 -0.7731488 0.4142311 0.9890755 -0.8684752 0.4142311 0.9890755 -0.9890755 0.4142311 0.9890755 -0.9915418 0.4832747 0.8849336 -0.9934209 0.5503825 0.8270722 -0.9948643 0.6138613 0.8019154 -0.9959801 0.6723959 0.7986244 -0.9968468 0.7251226 0.8088995 -0.9975226 0.7716288 0.8266759 -0.998051 0.8118949 0.8477498 -0.9984652 0.8462034 0.8693831 -0.9987904 0.8750386 0.8899294 -0.9990461 0.8989969 0.9085124 -0.9992474 0.9187137 0.9247678 -0.9994059 0.9348128 0.9386509 -0.999531 0.9478738 0.9503 -0.9996296 0.958415 0.959945 -0.9997074 0.9668867 0.9678498 -0.9997689 0.9736722 0.9742775 -0.9998174 0.9790925 0.9794724 -0.9998557 0.9834128 0.983651 -0.999886 0.9868504 0.9869997 -0.9999099 0.9895819 0.9896755 -0.9999288 0.9917501 0.9918086 -0.9999437 0.9934695 0.9935061 -0.4144197 0.41502 0.9890841 -0.4143955 0.4149446 0.9890831 -0.4143657 0.4148498 0.9890818 -0.414329 0.4147311 0.9890801 -0.4142845 0.4145826 0.9890781 -0.4142311 0.4143977 0.9890755 -0.4141683 0.4141683 0.9890723 -0.4143791 0.4141683 0.9890723 -0.4146458 0.4141683 0.9890723 -0.4149832 0.4141683 0.9890723 -0.41541 0.4141683 0.9890723 -0.4159501 0.4141683 0.9890723 -0.4166333 0.4141683 0.9890723 -0.4174976 0.4141683 0.9890723 -0.4185911 0.4141683 0.9890723 -0.4199745 0.4141683 0.9890723 -0.4217247 0.4141683 0.9890723 -0.4239389 0.4141683 0.9890723 -0.4267402 0.4141683 0.9890723 -0.4302842 0.4141683 0.9890723 -0.4347678 0.4141683 0.9890723 -0.4404401 0.4141683 0.9890723 -0.4476164 0.4141683 0.9890723 -0.4566952 0.4141683 0.9890723 -0.4681812 0.4141683 0.9890723 -0.4827124 0.4141683 0.9890723 -0.5010964 0.4141683 0.9890723 -0.5243544 0.4141683 0.9890723 -0.5537789 0.4141683 0.9890723 -0.5910046 0.4141683 0.9890723 -0.6381 0.4141683 0.9890723 -0.6976819 0.4141683 0.9890723 -0.7730606 0.4141683 0.9890723 -0.8684246 0.4141683 0.9890723 -0.9890723 0.4141683 0.9890723 -0.9915399 0.4832246 0.8848971 -0.9934197 0.5503438 0.8270268 -0.9948636 0.6138323 0.8018727 -0.9959797 0.6723748 0.798589 -0.9968465 0.7251076 0.8088723 -0.9975224 0.7716184 0.8266559 -0.9980509 0.8118878 0.8477357 -0.9984651 0.8461986 0.8693733 -0.9987903 0.8750355 0.8899228 -0.9990461 0.8989948 0.908508 -0.9992473 0.9187123 0.9247649 -0.9994059 0.9348119 0.938649 -0.999531 0.9478733 0.9502988 -0.9996296 0.9584146 0.9599442 -0.9997074 0.9668865 0.9678493 -0.9997689 0.9736721 0.9742772 -0.9998174 0.9790924 0.9794722 -0.9998557 0.9834127 0.9836509 -0.999886 0.9868504 0.9869996 -0.9999099 0.9895819 0.9896754 -0.9999288 0.99175 0.9918086 -0.9999437 0.9934695 0.9935061 -0.4144197 0.4152305 0.9890841 -0.4143955 0.4151551 0.9890831 -0.4143657 0.4150604 0.9890818 -0.414329 0.4149417 0.9890801 -0.4142845 0.4147933 0.9890781 -0.4142311 0.4146084 0.9890755 -0.4141683 0.4143791 0.9890723 -0.4140964 0.4140964 0.9890684 -0.4143632 0.4140964 0.9890684 -0.4147008 0.4140964 0.9890684 -0.4151278 0.4140964 0.9890684 -0.4156681 0.4140964 0.9890684 -0.4163517 0.4140964 0.9890684 -0.4172164 0.4140964 0.9890684 -0.4183104 0.4140964 0.9890684 -0.4196945 0.4140964 0.9890684 -0.4214456 0.4140964 0.9890684 -0.4236608 0.4140964 0.9890684 -0.4264635 0.4140964 0.9890684 -0.4300092 0.4140964 0.9890684 -0.434495 0.4140964 0.9890684 -0.4401701 0.4140964 0.9890684 -0.4473498 0.4140964 0.9890684 -0.4564331 0.4140964 0.9890684 -0.4679246 0.4140964 0.9890684 -0.4824629 0.4140964 0.9890684 -0.5008557 0.4140964 0.9890684 -0.5241251 0.4140964 0.9890684 -0.5535638 0.4140964 0.9890684 -0.5908076 0.4140964 0.9890684 -0.6379259 0.4140964 0.9890684 -0.6975366 0.4140964 0.9890684 -0.7729519 0.4140964 0.9890684 -0.8683621 0.4140964 0.9890684 -0.9890684 0.4140964 0.9890684 -0.9915376 0.4831666 0.8848522 -0.9934183 0.5502987 0.8269709 -0.9948628 0.6137984 0.8018202 -0.9959791 0.67235 0.7985455 -0.9968462 0.7250899 0.8088387 -0.9975222 0.7716061 0.8266313 -0.9980508 0.8118794 0.8477182 -0.998465 0.8461929 0.8693613 -0.9987903 0.8750317 0.8899147 -0.999046 0.8989923 0.9085026 -0.9992473 0.9187107 0.9247614 -0.9994059 0.9348109 0.9386467 -0.999531 0.9478726 0.9502973 -0.9996296 0.9584142 0.9599433 -0.9997074 0.9668862 0.9678487 -0.9997689 0.9736719 0.9742768 -0.9998174 0.9790923 0.979472 -0.9998557 0.9834127 0.9836508 -0.999886 0.9868503 0.9869995 -0.9999099 0.9895819 0.9896753 -0.9999288 0.99175 0.9918085 -0.9999437 0.9934694 0.993506 -0.4144197 0.4154968 0.9890841 -0.4143955 0.4154214 0.9890831 -0.4143657 0.4153268 0.9890818 -0.414329 0.4152081 0.9890801 -0.4142845 0.4150598 0.9890781 -0.4142311 0.414875 0.9890755 -0.4141683 0.4146458 0.9890723 -0.4140964 0.4143632 0.9890684 -0.4140176 0.4140176 0.9890637 -0.4143553 0.4140176 0.9890637 -0.4147826 0.4140176 0.9890637 -0.4153232 0.4140176 0.9890637 -0.4160072 0.4140176 0.9890637 -0.4168724 0.4140176 0.9890637 -0.4179671 0.4140176 0.9890637 -0.419352 0.4140176 0.9890637 -0.4211041 0.4140176 0.9890637 -0.4233207 0.4140176 0.9890637 -0.426125 0.4140176 0.9890637 -0.4296728 0.4140176 0.9890637 -0.4341613 0.4140176 0.9890637 -0.4398397 0.4140176 0.9890637 -0.4470237 0.4140176 0.9890637 -0.4561124 0.4140176 0.9890637 -0.4676107 0.4140176 0.9890637 -0.4821576 0.4140176 0.9890637 -0.5005614 0.4140176 0.9890637 -0.5238445 0.4140176 0.9890637 -0.5533007 0.4140176 0.9890637 -0.5905666 0.4140176 0.9890637 -0.6377128 0.4140176 0.9890637 -0.6973589 0.4140176 0.9890637 -0.772819 0.4140176 0.9890637 -0.8682858 0.4140176 0.9890637 -0.9890637 0.4140176 0.9890637 -0.9915347 0.4831021 0.8847973 -0.9934166 0.550248 0.8269025 -0.9948617 0.6137599 0.801756 -0.9959785 0.6723217 0.7984922 -0.9968458 0.7250697 0.8087977 -0.997522 0.7715919 0.8266012 -0.9980506 0.8118697 0.8476969 -0.9984649 0.8461864 0.8693466 -0.9987902 0.8750274 0.8899048 -0.999046 0.8989895 0.908496 -0.9992473 0.9187089 0.9247571 -0.9994059 0.9348097 0.9386439 -0.999531 0.9478718 0.9502955 -0.9996296 0.9584137 0.9599421 -0.9997074 0.9668859 0.9678479 -0.9997689 0.9736717 0.9742763 -0.9998174 0.9790921 0.9794717 -0.9998557 0.9834126 0.9836506 -0.999886 0.9868503 0.9869994 -0.9999099 0.9895819 0.9896753 -0.9999288 0.99175 0.9918085 -0.9999437 0.9934694 0.993506 -0.4144197 0.4158337 0.9890841 -0.4143955 0.4157584 0.9890831 -0.4143657 0.4156638 0.9890818 -0.414329 0.4155452 0.9890801 -0.4142845 0.4153969 0.9890781 -0.4142311 0.4152122 0.9890755 -0.4141683 0.4149832 0.9890723 -0.4140964 0.4147008 0.9890684 -0.4140176 0.4143553 0.9890637 -0.4139373 0.4139373 0.9890579 -0.4143649 0.4139373 0.9890579 -0.4149059 0.4139373 0.9890579 -0.4155903 0.4139373 0.9890579 -0.4164562 0.4139373 0.9890579 -0.4175516 0.4139373 0.9890579 -0.4189375 0.4139373 0.9890579 -0.4206909 0.4139373 0.9890579 -0.4229091 0.4139373 0.9890579 -0.4257154 0.4139373 0.9890579 -0.4292657 0.4139373 0.9890579 -0.4337574 0.4139373 0.9890579 -0.4394399 0.4139373 0.9890579 -0.4466291 0.4139373 0.9890579 -0.4557243 0.4139373 0.9890579 -0.4672309 0.4139373 0.9890579 -0.4817882 0.4139373 0.9890579 -0.5002052 0.4139373 0.9890579 -0.523505 0.4139373 0.9890579 -0.5529823 0.4139373 0.9890579 -0.5902749 0.4139373 0.9890579 -0.637455 0.4139373 0.9890579 -0.6971439 0.4139373 0.9890579 -0.772658 0.4139373 0.9890579 -0.8681933 0.4139373 0.9890579 -0.9890579 0.4139373 0.9890579 -0.9915312 0.4830346 0.8847308 -0.9934145 0.5501939 0.8268198 -0.9948604 0.6137183 0.8016783 -0.9959777 0.6722907 0.7984278 -0.9968453 0.7250473 0.808748 -0.9975217 0.7715762 0.8265648 -0.9980504 0.8118589 0.8476711 -0.9984648 0.8461791 0.8693288 -0.9987902 0.8750225 0.8898928 -0.9990459 0.8989863 0.9084881 -0.9992473 0.9187068 0.9247519 -0.9994059 0.9348083 0.9386406 -0.9995309 0.947871 0.9502933 -0.9996296 0.9584132 0.9599407 -0.9997074 0.9668855 0.967847 -0.9997689 0.9736715 0.9742758 -0.9998174 0.979092 0.9794713 -0.9998557 0.9834125 0.9836504 -0.999886 0.9868502 0.9869993 -0.9999099 0.9895818 0.9896752 -0.9999288 0.99175 0.9918084 -0.9999437 0.9934694 0.993506 -0.4144197 0.4162599 0.9890841 -0.4143955 0.4161847 0.9890831 -0.4143657 0.4160901 0.9890818 -0.414329 0.4159716 0.9890801 -0.4142845 0.4158235 0.9890781 -0.4142311 0.4156389 0.9890755 -0.4141683 0.41541 0.9890723 -0.4140964 0.4151278 0.9890684 -0.4140176 0.4147826 0.9890637 -0.4139373 0.4143649 0.9890579 -0.4138668 0.4138668 0.989051 -0.4144083 0.4138668 0.989051 -0.4150933 0.4138668 0.989051 -0.4159599 0.4138668 0.989051 -0.4170563 0.4138668 0.989051 -0.4184434 0.4138668 0.989051 -0.4201982 0.4138668 0.989051 -0.4224183 0.4138668 0.989051 -0.425227 0.4138668 0.989051 -0.4287804 0.4138668 0.989051 -0.4332759 0.4138668 0.989051 -0.4389633 0.4138668 0.989051 -0.4461586 0.4138668 0.989051 -0.4552615 0.4138668 0.989051 -0.466778 0.4138668 0.989051 -0.4813478 0.4138668 0.989051 -0.4997805 0.4138668 0.989051 -0.5231002 0.4138668 0.989051 -0.5526027 0.4138668 0.989051 -0.5899272 0.4138668 0.989051 -0.6371476 0.4138668 0.989051 -0.6968875 0.4138668 0.989051 -0.7724662 0.4138668 0.989051 -0.8680831 0.4138668 0.989051 -0.989051 0.4138668 0.989051 -0.9915271 0.4829718 0.8846516 -0.993412 0.5501416 0.8267212 -0.9948589 0.6136769 0.8015857 -0.9959768 0.6722594 0.798351 -0.9968448 0.7250244 0.8086889 -0.9975213 0.7715599 0.8265214 -0.9980502 0.8118476 0.8476404 -0.9984647 0.8461714 0.8693077 -0.9987901 0.8750173 0.8898785 -0.9990459 0.8989829 0.9084786 -0.9992472 0.9187045 0.9247456 -0.9994059 0.9348069 0.9386365 -0.9995309 0.94787 0.9502907 -0.9996296 0.9584126 0.9599391 -0.9997074 0.9668852 0.967846 -0.9997689 0.9736712 0.9742751 -0.9998174 0.9790919 0.9794709 -0.9998557 0.9834124 0.9836501 -0.999886 0.9868502 0.9869991 -0.9999099 0.9895818 0.9896751 -0.9999288 0.99175 0.9918083 -0.9999437 0.9934694 0.9935059 -0.4144197 0.4167992 0.9890841 -0.4143955 0.416724 0.9890831 -0.4143657 0.4166295 0.9890818 -0.414329 0.4165111 0.9890801 -0.4142845 0.4163631 0.9890781 -0.4142311 0.4161787 0.9890755 -0.4141683 0.4159501 0.9890723 -0.4140964 0.4156681 0.9890684 -0.4140176 0.4153232 0.9890637 -0.4139373 0.4149059 0.9890579 -0.4138668 0.4144083 0.989051 -0.4138277 0.4138277 0.989043 -0.4145133 0.4138277 0.989043 -0.4153808 0.4138277 0.989043 -0.4164783 0.4138277 0.989043 -0.4178668 0.4138277 0.989043 -0.4196234 0.4138277 0.989043 -0.4218457 0.4138277 0.989043 -0.4246572 0.4138277 0.989043 -0.4282141 0.4138277 0.989043 -0.4327141 0.4138277 0.989043 -0.4384071 0.4138277 0.989043 -0.4456096 0.4138277 0.989043 -0.4547216 0.4138277 0.989043 -0.4662495 0.4138277 0.989043 -0.4808339 0.4138277 0.989043 -0.4992849 0.4138277 0.989043 -0.5226279 0.4138277 0.989043 -0.5521598 0.4138277 0.989043 -0.5895215 0.4138277 0.989043 -0.6367889 0.4138277 0.989043 -0.6965883 0.4138277 0.989043 -0.7722424 0.4138277 0.989043 -0.8679546 0.4138277 0.989043 -0.989043 0.4138277 0.989043 -0.9915223 0.4829286 0.8845592 -0.9934091 0.5501012 0.8266062 -0.9948571 0.6136427 0.8014777 -0.9959757 0.6722322 0.7982615 -0.9968441 0.7250039 0.8086199 -0.9975209 0.7715449 0.8264708 -0.99805 0.811837 0.8476047 -0.9984645 0.8461641 0.869283 -0.99879 0.8750124 0.8898619 -0.9990458 0.8989796 0.9084676 -0.9992472 0.9187024 0.9247384 -0.9994059 0.9348055 0.9386318 -0.9995309 0.9478691 0.9502877 -0.9996296 0.958412 0.9599371 -0.9997074 0.9668848 0.9678448 -0.9997689 0.973671 0.9742743 -0.9998174 0.9790917 0.9794704 -0.9998557 0.9834123 0.9836498 -0.999886 0.9868501 0.9869989 -0.9999099 0.9895818 0.9896749 -0.9999288 0.9917499 0.9918083 -0.9999437 0.9934694 0.9935059 -0.4144197 0.4174814 0.9890841 -0.4143955 0.4174062 0.9890831 -0.4143657 0.4173119 0.9890818 -0.414329 0.4171936 0.9890801 -0.4142845 0.4170458 0.9890781 -0.4142311 0.4168617 0.9890755 -0.4141683 0.4166333 0.9890723 -0.4140964 0.4163517 0.9890684 -0.4140176 0.4160072 0.9890637 -0.4139373 0.4155903 0.9890579 -0.4138668 0.4150933 0.989051 -0.4138277 0.4145133 0.989043 -0.4138582 0.4138582 0.9890339 -0.4147267 0.4138582 0.9890339 -0.4158254 0.4138582 0.9890339 -0.4172154 0.4138582 0.9890339 -0.418974 0.4138582 0.9890339 -0.4211988 0.4138582 0.9890339 -0.4240134 0.4138582 0.9890339 -0.4275744 0.4138582 0.9890339 -0.4320794 0.4138582 0.9890339 -0.4377789 0.4138582 0.9890339 -0.4449894 0.4138582 0.9890339 -0.4541117 0.4138582 0.9890339 -0.4656526 0.4138582 0.9890339 -0.4802533 0.4138582 0.9890339 -0.4987251 0.4138582 0.9890339 -0.5220943 0.4138582 0.9890339 -0.5516594 0.4138582 0.9890339 -0.5890631 0.4138582 0.9890339 -0.6363837 0.4138582 0.9890339 -0.6962504 0.4138582 0.9890339 -0.7719895 0.4138582 0.9890339 -0.8678093 0.4138582 0.9890339 -0.9890339 0.4138582 0.9890339 -0.9915169 0.4829319 0.8844548 -0.9934058 0.5500915 0.8264764 -0.9948551 0.6136284 0.8013559 -0.9959745 0.672218 0.7981605 -0.9968433 0.7249916 0.8085421 -0.9975204 0.7715352 0.8264138 -0.9980497 0.8118298 0.8475643 -0.9984643 0.8461589 0.8692552 -0.9987899 0.8750088 0.8898431 -0.9990458 0.8989771 0.9084551 -0.9992472 0.9187008 0.9247302 -0.9994058 0.9348044 0.9386265 -0.9995309 0.9478684 0.9502843 -0.9996296 0.9584115 0.959935 -0.9997074 0.9668845 0.9678434 -0.9997689 0.9736708 0.9742734 -0.9998174 0.9790916 0.9794699 -0.9998557 0.9834122 0.9836494 -0.999886 0.9868501 0.9869987 -0.9999099 0.9895817 0.9896748 -0.9999288 0.9917499 0.9918082 -0.9999437 0.9934694 0.9935058 -0.4144197 0.4183444 0.9890841 -0.4143955 0.4182694 0.9890831 -0.4143657 0.4181752 0.9890818 -0.414329 0.4180571 0.9890801 -0.4142845 0.4179095 0.9890781 -0.4142311 0.4177256 0.9890755 -0.4141683 0.4174976 0.9890723 -0.4140964 0.4172164 0.9890684 -0.4140176 0.4168724 0.9890637 -0.4139373 0.4164562 0.9890579 -0.4138668 0.4159599 0.989051 -0.4138277 0.4153808 0.989043 -0.4138582 0.4147267 0.9890339 -0.4140252 0.4140252 0.9890241 -0.4151253 0.4140252 0.9890241 -0.416517 0.4140252 0.9890241 -0.4182777 0.4140252 0.9890241 -0.4205051 0.4140252 0.9890241 -0.4233232 0.4140252 0.9890241 -0.4268884 0.4140252 0.9890241 -0.4313989 0.4140252 0.9890241 -0.4371052 0.4140252 0.9890241 -0.4443244 0.4140252 0.9890241 -0.4534577 0.4140252 0.9890241 -0.4650125 0.4140252 0.9890241 -0.4796308 0.4140252 0.9890241 -0.4981248 0.4140252 0.9890241 -0.5215222 0.4140252 0.9890241 -0.5511229 0.4140252 0.9890241 -0.5885717 0.4140252 0.9890241 -0.6359492 0.4140252 0.9890241 -0.695888 0.4140252 0.9890241 -0.7717183 0.4140252 0.9890241 -0.8676536 0.4140252 0.9890241 -0.9890241 0.4140252 0.9890241 -0.991511 0.4830292 0.8843429 -0.9934023 0.5501456 0.8263373 -0.994853 0.6136569 0.8012253 -0.9959732 0.672232 0.7980523 -0.9968425 0.7249978 0.8084588 -0.9975199 0.7715376 0.8263527 -0.9980494 0.8118303 0.8475211 -0.9984642 0.8461587 0.8692255 -0.9987897 0.8750084 0.889823 -0.9990457 0.8989767 0.9084417 -0.9992471 0.9187004 0.9247215 -0.9994058 0.9348042 0.9386208 -0.9995309 0.9478683 0.9502806 -0.9996295 0.9584114 0.9599326 -0.9997074 0.9668844 0.9678419 -0.9997689 0.9736708 0.9742725 -0.9998174 0.9790916 0.9794693 -0.9998557 0.9834122 0.9836491 -0.999886 0.98685 0.9869985 -0.9999099 0.9895817 0.9896747 -0.9999288 0.9917499 0.9918081 -0.9999437 0.9934694 0.9935058 -0.4144197 0.4194363 0.9890841 -0.4143955 0.4193615 0.9890831 -0.4143657 0.4192674 0.9890818 -0.414329 0.4191496 0.9890801 -0.4142845 0.4190022 0.9890781 -0.4142311 0.4188187 0.9890755 -0.4141683 0.4185911 0.9890723 -0.4140964 0.4183104 0.9890684 -0.4140176 0.4179671 0.9890637 -0.4139373 0.4175516 0.9890579 -0.4138668 0.4170563 0.989051 -0.4138277 0.4164783 0.989043 -0.4138582 0.4158254 0.9890339 -0.4140252 0.4151253 0.9890241 -0.4144423 0.4144423 0.9890146 -0.4158356 0.4144423 0.9890146 -0.4175984 0.4144423 0.9890146 -0.4198285 0.4144423 0.9890146 -0.4226498 0.4144423 0.9890146 -0.4262192 0.4144423 0.9890146 -0.430735 0.4144423 0.9890146 -0.436448 0.4144423 0.9890146 -0.4436757 0.4144423 0.9890146 -0.4528197 0.4144423 0.9890146 -0.464388 0.4144423 0.9890146 -0.4790235 0.4144423 0.9890146 -0.4975392 0.4144423 0.9890146 -0.5209641 0.4144423 0.9890146 -0.5505995 0.4144423 0.9890146 -0.5880922 0.4144423 0.9890146 -0.6355254 0.4144423 0.9890146 -0.6955345 0.4144423 0.9890146 -0.7714538 0.4144423 0.9890146 -0.8675017 0.4144423 0.9890146 -0.9890146 0.4144423 0.9890146 -0.9915054 0.4833013 0.8842338 -0.9933988 0.5503203 0.8262017 -0.9948509 0.6137675 0.801098 -0.9959719 0.6723012 0.7979469 -0.9968418 0.7250408 0.8083776 -0.9975194 0.7715641 0.8262932 -0.9980491 0.8118466 0.847479 -0.998464 0.8461687 0.8691965 -0.9987896 0.8750145 0.8898035 -0.9990456 0.8989805 0.9084287 -0.9992471 0.9187027 0.924713 -0.9994058 0.9348056 0.9386153 -0.9995309 0.9478691 0.9502771 -0.9996295 0.958412 0.9599303 -0.9997074 0.9668847 0.9678404 -0.9997688 0.973671 0.9742716 -0.9998174 0.9790917 0.9794687 -0.9998557 0.9834123 0.9836487 -0.999886 0.9868501 0.9869982 -0.9999099 0.9895817 0.9896745 -0.9999288 0.9917499 0.991808 -0.9999437 0.9934694 0.9935057 -0.4144197 0.4208177 0.9890841 -0.4143955 0.420743 0.9890831 -0.4143657 0.4206492 0.9890818 -0.414329 0.4205316 0.9890801 -0.4142845 0.4203847 0.9890781 -0.4142311 0.4202016 0.9890755 -0.4141683 0.4199745 0.9890723 -0.4140964 0.4196945 0.9890684 -0.4140176 0.419352 0.9890637 -0.4139373 0.4189375 0.9890579 -0.4138668 0.4184434 0.989051 -0.4138277 0.4178668 0.989043 -0.4138582 0.4172154 0.9890339 -0.4140252 0.416517 0.9890241 -0.4144423 0.4158356 0.9890146 -0.4152991 0.4152991 0.9890072 -0.4170635 0.4152991 0.9890072 -0.4192956 0.4152991 0.9890072 -0.4221196 0.4152991 0.9890072 -0.4256923 0.4152991 0.9890072 -0.4302122 0.4152991 0.9890072 -0.4359305 0.4152991 0.9890072 -0.4431649 0.4152991 0.9890072 -0.4523173 0.4152991 0.9890072 -0.4638963 0.4152991 0.9890072 -0.4785453 0.4152991 0.9890072 -0.4970781 0.4152991 0.9890072 -0.5205246 0.4152991 0.9890072 -0.5501874 0.4152991 0.9890072 -0.5877147 0.4152991 0.9890072 -0.6351916 0.4152991 0.9890072 -0.6952561 0.4152991 0.9890072 -0.7712455 0.4152991 0.9890072 -0.867382 0.4152991 0.9890072 -0.9890072 0.4152991 0.9890072 -0.9915009 0.4838841 0.8841479 -0.9933961 0.5507113 0.826095 -0.9948493 0.6140266 0.8009979 -0.9959709 0.6724711 0.797864 -0.9968411 0.7251511 0.8083138 -0.9975191 0.7716352 0.8262464 -0.9980488 0.8118921 0.8474458 -0.9984638 0.8461977 0.8691736 -0.9987895 0.8750329 0.8897881 -0.9990456 0.8989921 0.9084185 -0.999247 0.9187101 0.9247063 -0.9994057 0.9348102 0.938611 -0.9995309 0.947872 0.9502743 -0.9996295 0.9584138 0.9599286 -0.9997074 0.9668859 0.9678393 -0.9997688 0.9736717 0.9742709 -0.9998174 0.9790921 0.9794682 -0.9998557 0.9834126 0.9836484 -0.999886 0.9868503 0.986998 -0.9999099 0.9895819 0.9896744 -0.9999288 0.99175 0.9918079 -0.9999437 0.9934694 0.9935057 -0.4144197 0.4225654 0.9890841 -0.4143955 0.4224909 0.9890831 -0.4143657 0.4223974 0.9890818 -0.414329 0.4222801 0.9890801 -0.4142845 0.4221336 0.9890781 -0.4142311 0.4219511 0.9890755 -0.4141683 0.4217247 0.9890723 -0.4140964 0.4214456 0.9890684 -0.4140176 0.4211041 0.9890637 -0.4139373 0.4206909 0.9890579 -0.4138668 0.4201982 0.989051 -0.4138277 0.4196234 0.989043 -0.4138582 0.418974 0.9890339 -0.4140252 0.4182777 0.9890241 -0.4144423 0.4175984 0.9890146 -0.4152991 0.4170635 0.9890072 -0.4168922 0.4168922 0.9890048 -0.419125 0.4168922 0.9890048 -0.4219498 0.4168922 0.9890048 -0.4255236 0.4168922 0.9890048 -0.4300448 0.4168922 0.9890048 -0.4357648 0.4168922 0.9890048 -0.4430013 0.4168922 0.9890048 -0.4521565 0.4168922 0.9890048 -0.4637389 0.4168922 0.9890048 -0.4783922 0.4168922 0.9890048 -0.4969305 0.4168922 0.9890048 -0.5203839 0.4168922 0.9890048 -0.5500554 0.4168922 0.9890048 -0.5875938 0.4168922 0.9890048 -0.6350848 0.4168922 0.9890048 -0.695167 0.4168922 0.9890048 -0.7711789 0.4168922 0.9890048 -0.8673437 0.4168922 0.9890048 -0.9890048 0.4168922 0.9890048 -0.9914995 0.4849907 0.8841204 -0.9933953 0.5514695 0.8260608 -0.9948487 0.6145393 0.8009659 -0.9959706 0.6728136 0.7978374 -0.9968409 0.7253775 0.8082934 -0.9975189 0.7717834 0.8262314 -0.9980488 0.8119884 0.8474353 -0.9984638 0.8462598 0.8691663 -0.9987895 0.8750727 0.8897832 -0.9990455 0.8990175 0.9084153 -0.999247 0.9187262 0.9247041 -0.9994057 0.9348204 0.9386096 -0.9995308 0.9478785 0.9502734 -0.9996295 0.9584178 0.959928 -0.9997074 0.9668884 0.9678389 -0.9997688 0.9736733 0.9742706 -0.9998174 0.9790931 0.9794681 -0.9998557 0.9834132 0.9836483 -0.999886 0.9868507 0.986998 -0.9999099 0.9895821 0.9896744 -0.9999288 0.9917502 0.9918079 -0.9999437 0.9934695 0.9935057 -0.4144197 0.4247763 0.9890841 -0.4143955 0.4247022 0.9890831 -0.4143657 0.424609 0.9890818 -0.414329 0.4244922 0.9890801 -0.4142845 0.4243463 0.9890781 -0.4142311 0.4241644 0.9890755 -0.4141683 0.4239389 0.9890723 -0.4140964 0.4236608 0.9890684 -0.4140176 0.4233207 0.9890637 -0.4139373 0.4229091 0.9890579 -0.4138668 0.4224183 0.989051 -0.4138277 0.4218457 0.989043 -0.4138582 0.4211988 0.9890339 -0.4140252 0.4205051 0.9890241 -0.4144423 0.4198285 0.9890146 -0.4152991 0.4192956 0.9890072 -0.4168922 0.419125 0.9890048 -0.419125 0.419125 0.9890048 -0.4219498 0.419125 0.9890048 -0.4255236 0.419125 0.9890048 -0.4300448 0.419125 0.9890048 -0.4357648 0.419125 0.9890048 -0.4430013 0.419125 0.9890048 -0.4521565 0.419125 0.9890048 -0.4637389 0.419125 0.9890048 -0.4783922 0.419125 0.9890048 -0.4969305 0.419125 0.9890048 -0.5203839 0.419125 0.9890048 -0.5500554 0.419125 0.9890048 -0.5875938 0.419125 0.9890048 -0.6350848 0.419125 0.9890048 -0.695167 0.419125 0.9890048 -0.7711789 0.419125 0.9890048 -0.8673437 0.419125 0.9890048 -0.9890048 0.419125 0.9890048 -0.9914995 0.4865484 0.8841204 -0.9933953 0.5525411 0.8260608 -0.9948487 0.6152669 0.8009659 -0.9959706 0.6733015 0.7978374 -0.9968409 0.7257011 0.8082934 -0.9975189 0.7719959 0.8262314 -0.9980488 0.8121268 0.8474353 -0.9984638 0.8463492 0.8691663 -0.9987895 0.8751301 0.8897832 -0.9990455 0.8990542 0.9084153 -0.999247 0.9187495 0.9247041 -0.9994057 0.9348352 0.9386096 -0.9995308 0.9478878 0.9502734 -0.9996295 0.9584237 0.959928 -0.9997074 0.9668922 0.9678389 -0.9997688 0.9736756 0.9742706 -0.9998174 0.9790946 0.9794681 -0.9998557 0.9834141 0.9836483 -0.999886 0.9868512 0.986998 -0.9999099 0.9895825 0.9896744 -0.9999288 0.9917504 0.9918079 -0.9999437 0.9934697 0.9935057 -0.4144197 0.4275735 0.9890841 -0.4143955 0.4274997 0.9890831 -0.4143657 0.427407 0.9890818 -0.414329 0.4272908 0.9890801 -0.4142845 0.4271456 0.9890781 -0.4142311 0.4269646 0.9890755 -0.4141683 0.4267402 0.9890723 -0.4140964 0.4264635 0.9890684 -0.4140176 0.426125 0.9890637 -0.4139373 0.4257154 0.9890579 -0.4138668 0.425227 0.989051 -0.4138277 0.4246572 0.989043 -0.4138582 0.4240134 0.9890339 -0.4140252 0.4233232 0.9890241 -0.4144423 0.4226498 0.9890146 -0.4152991 0.4221196 0.9890072 -0.4168922 0.4219498 0.9890048 -0.419125 0.4219498 0.9890048 -0.4219498 0.4219498 0.9890048 -0.4255236 0.4219498 0.9890048 -0.4300448 0.4219498 0.9890048 -0.4357648 0.4219498 0.9890048 -0.4430013 0.4219498 0.9890048 -0.4521565 0.4219498 0.9890048 -0.4637389 0.4219498 0.9890048 -0.4783922 0.4219498 0.9890048 -0.4969305 0.4219498 0.9890048 -0.5203839 0.4219498 0.9890048 -0.5500554 0.4219498 0.9890048 -0.5875938 0.4219498 0.9890048 -0.6350848 0.4219498 0.9890048 -0.695167 0.4219498 0.9890048 -0.7711789 0.4219498 0.9890048 -0.8673437 0.4219498 0.9890048 -0.9890048 0.4219498 0.9890048 -0.9914995 0.4885191 0.8841204 -0.9933953 0.5538969 0.8260608 -0.9948487 0.6161874 0.8009659 -0.9959706 0.6739188 0.7978374 -0.9968409 0.7261105 0.8082934 -0.9975189 0.7722648 0.8262314 -0.9980488 0.8123018 0.8474353 -0.9984638 0.8464623 0.8691663 -0.9987895 0.8752028 0.8897832 -0.9990455 0.8991006 0.9084153 -0.999247 0.9187791 0.9247041 -0.9994057 0.9348539 0.9386096 -0.9995308 0.9478997 0.9502734 -0.9996295 0.9584312 0.959928 -0.9997074 0.9668969 0.9678389 -0.9997688 0.9736786 0.9742706 -0.9998174 0.9790965 0.9794681 -0.9998557 0.9834153 0.9836483 -0.999886 0.986852 0.986998 -0.9999099 0.9895829 0.9896744 -0.9999288 0.9917507 0.9918079 -0.9999437 0.9934698 0.9935057 -0.4144197 0.4311123 0.9890841 -0.4143955 0.431039 0.9890831 -0.4143657 0.4309468 0.9890818 -0.414329 0.4308314 0.9890801 -0.4142845 0.430687 0.9890781 -0.4142311 0.4305072 0.9890755 -0.4141683 0.4302842 0.9890723 -0.4140964 0.4300092 0.9890684 -0.4140176 0.4296728 0.9890637 -0.4139373 0.4292657 0.9890579 -0.4138668 0.4287804 0.989051 -0.4138277 0.4282141 0.989043 -0.4138582 0.4275744 0.9890339 -0.4140252 0.4268884 0.9890241 -0.4144423 0.4262192 0.9890146 -0.4152991 0.4256923 0.9890072 -0.4168922 0.4255236 0.9890048 -0.419125 0.4255236 0.9890048 -0.4219498 0.4255236 0.9890048 -0.4255236 0.4255236 0.9890048 -0.4300448 0.4255236 0.9890048 -0.4357648 0.4255236 0.9890048 -0.4430013 0.4255236 0.9890048 -0.4521565 0.4255236 0.9890048 -0.4637389 0.4255236 0.9890048 -0.4783922 0.4255236 0.9890048 -0.4969305 0.4255236 0.9890048 -0.5203839 0.4255236 0.9890048 -0.5500554 0.4255236 0.9890048 -0.5875938 0.4255236 0.9890048 -0.6350848 0.4255236 0.9890048 -0.695167 0.4255236 0.9890048 -0.7711789 0.4255236 0.9890048 -0.8673437 0.4255236 0.9890048 -0.9890048 0.4255236 0.9890048 -0.9914995 0.4910123 0.8841204 -0.9933953 0.5556122 0.8260608 -0.9948487 0.6173519 0.8009659 -0.9959706 0.6746998 0.7978374 -0.9968409 0.7266285 0.8082934 -0.9975189 0.7726049 0.8262314 -0.9980488 0.8125232 0.8474353 -0.9984638 0.8466054 0.8691663 -0.9987895 0.8752947 0.8897832 -0.9990455 0.8991593 0.9084153 -0.999247 0.9188164 0.9247041 -0.9994057 0.9348776 0.9386096 -0.9995308 0.9479146 0.9502734 -0.9996295 0.9584406 0.959928 -0.9997074 0.9669028 0.9678389 -0.9997688 0.9736823 0.9742706 -0.9998174 0.9790988 0.9794681 -0.9998557 0.9834167 0.9836483 -0.999886 0.9868529 0.986998 -0.9999099 0.9895835 0.9896744 -0.9999288 0.991751 0.9918079 -0.9999437 0.9934701 0.9935057 -0.4144197 0.4355894 0.9890841 -0.4143955 0.4355166 0.9890831 -0.4143657 0.4354252 0.9890818 -0.414329 0.4353106 0.9890801 -0.4142845 0.4351674 0.9890781 -0.4142311 0.434989 0.9890755 -0.4141683 0.4347678 0.9890723 -0.4140964 0.434495 0.9890684 -0.4140176 0.4341613 0.9890637 -0.4139373 0.4337574 0.9890579 -0.4138668 0.4332759 0.989051 -0.4138277 0.4327141 0.989043 -0.4138582 0.4320794 0.9890339 -0.4140252 0.4313989 0.9890241 -0.4144423 0.430735 0.9890146 -0.4152991 0.4302122 0.9890072 -0.4168922 0.4300448 0.9890048 -0.419125 0.4300448 0.9890048 -0.4219498 0.4300448 0.9890048 -0.4255236 0.4300448 0.9890048 -0.4300448 0.4300448 0.9890048 -0.4357648 0.4300448 0.9890048 -0.4430013 0.4300448 0.9890048 -0.4521565 0.4300448 0.9890048 -0.4637389 0.4300448 0.9890048 -0.4783922 0.4300448 0.9890048 -0.4969305 0.4300448 0.9890048 -0.5203839 0.4300448 0.9890048 -0.5500554 0.4300448 0.9890048 -0.5875938 0.4300448 0.9890048 -0.6350848 0.4300448 0.9890048 -0.695167 0.4300448 0.9890048 -0.7711789 0.4300448 0.9890048 -0.8673437 0.4300448 0.9890048 -0.9890048 0.4300448 0.9890048 -0.9914995 0.4941665 0.8841204 -0.9933953 0.5577822 0.8260608 -0.9948487 0.6188252 0.8009659 -0.9959706 0.6756878 0.7978374 -0.9968409 0.7272837 0.8082934 -0.9975189 0.7730352 0.8262314 -0.9980488 0.8128033 0.8474353 -0.9984638 0.8467864 0.8691663 -0.9987895 0.8754109 0.8897832 -0.9990455 0.8992336 0.9084153 -0.999247 0.9188636 0.9247041 -0.9994057 0.9349075 0.9386096 -0.9995308 0.9479335 0.9502734 -0.9996295 0.9584526 0.959928 -0.9997074 0.9669103 0.9678389 -0.9997688 0.973687 0.9742706 -0.9998174 0.9791018 0.9794681 -0.9998557 0.9834186 0.9836483 -0.999886 0.9868541 0.986998 -0.9999099 0.9895842 0.9896744 -0.9999288 0.9917515 0.9918079 -0.9999437 0.9934704 0.9935057 -0.4144197 0.4412534 0.9890841 -0.4143955 0.4411814 0.9890831 -0.4143657 0.4410909 0.9890818 -0.414329 0.4409775 0.9890801 -0.4142845 0.4408357 0.9890781 -0.4142311 0.4406591 0.9890755 -0.4141683 0.4404401 0.9890723 -0.4140964 0.4401701 0.9890684 -0.4140176 0.4398397 0.9890637 -0.4139373 0.4394399 0.9890579 -0.4138668 0.4389633 0.989051 -0.4138277 0.4384071 0.989043 -0.4138582 0.4377789 0.9890339 -0.4140252 0.4371052 0.9890241 -0.4144423 0.436448 0.9890146 -0.4152991 0.4359305 0.9890072 -0.4168922 0.4357648 0.9890048 -0.419125 0.4357648 0.9890048 -0.4219498 0.4357648 0.9890048 -0.4255236 0.4357648 0.9890048 -0.4300448 0.4357648 0.9890048 -0.4357648 0.4357648 0.9890048 -0.4430013 0.4357648 0.9890048 -0.4521565 0.4357648 0.9890048 -0.4637389 0.4357648 0.9890048 -0.4783922 0.4357648 0.9890048 -0.4969305 0.4357648 0.9890048 -0.5203839 0.4357648 0.9890048 -0.5500554 0.4357648 0.9890048 -0.5875938 0.4357648 0.9890048 -0.6350848 0.4357648 0.9890048 -0.695167 0.4357648 0.9890048 -0.7711789 0.4357648 0.9890048 -0.8673437 0.4357648 0.9890048 -0.9890048 0.4357648 0.9890048 -0.9914995 0.498157 0.8841204 -0.9933953 0.5605276 0.8260608 -0.9948487 0.6206891 0.8009659 -0.9959706 0.6769378 0.7978374 -0.9968409 0.7281127 0.8082934 -0.9975189 0.7735795 0.8262314 -0.9980488 0.8131577 0.8474353 -0.9984638 0.8470154 0.8691663 -0.9987895 0.875558 0.8897832 -0.9990455 0.8993275 0.9084153 -0.999247 0.9189234 0.9247041 -0.9994057 0.9349454 0.9386096 -0.9995308 0.9479575 0.9502734 -0.9996295 0.9584677 0.959928 -0.9997074 0.9669198 0.9678389 -0.9997688 0.973693 0.9742706 -0.9998174 0.9791055 0.9794681 -0.9998557 0.9834209 0.9836483 -0.999886 0.9868555 0.986998 -0.9999099 0.9895851 0.9896744 -0.9999288 0.9917521 0.9918079 -0.9999437 0.9934707 0.9935057 -0.4144197 0.4484192 0.9890841 -0.4143955 0.4483481 0.9890831 -0.4143657 0.4482588 0.9890818 -0.414329 0.4481468 0.9890801 -0.4142845 0.4480069 0.9890781 -0.4142311 0.4478326 0.9890755 -0.4141683 0.4476164 0.9890723 -0.4140964 0.4473498 0.9890684 -0.4140176 0.4470237 0.9890637 -0.4139373 0.4466291 0.9890579 -0.4138668 0.4461586 0.989051 -0.4138277 0.4456096 0.989043 -0.4138582 0.4449894 0.9890339 -0.4140252 0.4443244 0.9890241 -0.4144423 0.4436757 0.9890146 -0.4152991 0.4431649 0.9890072 -0.4168922 0.4430013 0.9890048 -0.419125 0.4430013 0.9890048 -0.4219498 0.4430013 0.9890048 -0.4255236 0.4430013 0.9890048 -0.4300448 0.4430013 0.9890048 -0.4357648 0.4430013 0.9890048 -0.4430013 0.4430013 0.9890048 -0.4521565 0.4430013 0.9890048 -0.4637389 0.4430013 0.9890048 -0.4783922 0.4430013 0.9890048 -0.4969305 0.4430013 0.9890048 -0.5203839 0.4430013 0.9890048 -0.5500554 0.4430013 0.9890048 -0.5875938 0.4430013 0.9890048 -0.6350848 0.4430013 0.9890048 -0.695167 0.4430013 0.9890048 -0.7711789 0.4430013 0.9890048 -0.8673437 0.4430013 0.9890048 -0.9890048 0.4430013 0.9890048 -0.9914995 0.5032055 0.8841204 -0.9933953 0.5640008 0.8260608 -0.9948487 0.6230471 0.8009659 -0.9959706 0.6785192 0.7978374 -0.9968409 0.7291615 0.8082934 -0.9975189 0.7742682 0.8262314 -0.9980488 0.8136061 0.8474353 -0.9984638 0.8473052 0.8691663 -0.9987895 0.8757441 0.8897832 -0.9990455 0.8994464 0.9084153 -0.999247 0.918999 0.9247041 -0.9994057 0.9349933 0.9386096 -0.9995308 0.9479878 0.9502734 -0.9996295 0.9584868 0.959928 -0.9997074 0.9669318 0.9678389 -0.9997688 0.9737006 0.9742706 -0.9998174 0.9791103 0.9794681 -0.9998557 0.9834239 0.9836483 -0.999886 0.9868574 0.986998 -0.9999099 0.9895863 0.9896744 -0.9999288 0.9917528 0.9918079 -0.9999437 0.9934712 0.9935057 -0.4144197 0.4574848 0.9890841 -0.4143955 0.4574149 0.9890831 -0.4143657 0.457327 0.9890818 -0.414329 0.4572169 0.9890801 -0.4142845 0.4570793 0.9890781 -0.4142311 0.4569079 0.9890755 -0.4141683 0.4566952 0.9890723 -0.4140964 0.4564331 0.9890684 -0.4140176 0.4561124 0.9890637 -0.4139373 0.4557243 0.9890579 -0.4138668 0.4552615 0.989051 -0.4138277 0.4547216 0.989043 -0.4138582 0.4541117 0.9890339 -0.4140252 0.4534577 0.9890241 -0.4144423 0.4528197 0.9890146 -0.4152991 0.4523173 0.9890072 -0.4168922 0.4521565 0.9890048 -0.419125 0.4521565 0.9890048 -0.4219498 0.4521565 0.9890048 -0.4255236 0.4521565 0.9890048 -0.4300448 0.4521565 0.9890048 -0.4357648 0.4521565 0.9890048 -0.4430013 0.4521565 0.9890048 -0.4521565 0.4521565 0.9890048 -0.4637389 0.4521565 0.9890048 -0.4783922 0.4521565 0.9890048 -0.4969305 0.4521565 0.9890048 -0.5203839 0.4521565 0.9890048 -0.5500554 0.4521565 0.9890048 -0.5875938 0.4521565 0.9890048 -0.6350848 0.4521565 0.9890048 -0.695167 0.4521565 0.9890048 -0.7711789 0.4521565 0.9890048 -0.8673437 0.4521565 0.9890048 -0.9890048 0.4521565 0.9890048 -0.9914995 0.5095925 0.8841204 -0.9933953 0.5683949 0.8260608 -0.9948487 0.6260304 0.8009659 -0.9959706 0.6805199 0.7978374 -0.9968409 0.7304884 0.8082934 -0.9975189 0.7751395 0.8262314 -0.9980488 0.8141733 0.8474353 -0.9984638 0.8476717 0.8691663 -0.9987895 0.8759795 0.8897832 -0.9990455 0.8995968 0.9084153 -0.999247 0.9190947 0.9247041 -0.9994057 0.935054 0.9386096 -0.9995308 0.9480261 0.9502734 -0.9996295 0.9585109 0.959928 -0.9997074 0.966947 0.9678389 -0.9997688 0.9737101 0.9742706 -0.9998174 0.9791163 0.9794681 -0.9998557 0.9834277 0.9836483 -0.999886 0.9868597 0.986998 -0.9999099 0.9895878 0.9896744 -0.9999288 0.9917537 0.9918079 -0.9999437 0.9934718 0.9935057 -0.4144197 0.468954 0.9890841 -0.4143955 0.4688855 0.9890831 -0.4143657 0.4687996 0.9890818 -0.414329 0.4686918 0.9890801 -0.4142845 0.4685571 0.9890781 -0.4142311 0.4683893 0.9890755 -0.4141683 0.4681812 0.9890723 -0.4140964 0.4679246 0.9890684 -0.4140176 0.4676107 0.9890637 -0.4139373 0.4672309 0.9890579 -0.4138668 0.466778 0.989051 -0.4138277 0.4662495 0.989043 -0.4138582 0.4656526 0.9890339 -0.4140252 0.4650125 0.9890241 -0.4144423 0.464388 0.9890146 -0.4152991 0.4638963 0.9890072 -0.4168922 0.4637389 0.9890048 -0.419125 0.4637389 0.9890048 -0.4219498 0.4637389 0.9890048 -0.4255236 0.4637389 0.9890048 -0.4300448 0.4637389 0.9890048 -0.4357648 0.4637389 0.9890048 -0.4430013 0.4637389 0.9890048 -0.4521565 0.4637389 0.9890048 -0.4637389 0.4637389 0.9890048 -0.4783922 0.4637389 0.9890048 -0.4969305 0.4637389 0.9890048 -0.5203839 0.4637389 0.9890048 -0.5500554 0.4637389 0.9890048 -0.5875938 0.4637389 0.9890048 -0.6350848 0.4637389 0.9890048 -0.695167 0.4637389 0.9890048 -0.7711789 0.4637389 0.9890048 -0.8673437 0.4637389 0.9890048 -0.9890048 0.4637389 0.9890048 -0.9914995 0.5176729 0.8841204 -0.9933953 0.573954 0.8260608 -0.9948487 0.6298046 0.8009659 -0.9959706 0.683051 0.7978374 -0.9968409 0.732167 0.8082934 -0.9975189 0.7762418 0.8262314 -0.9980488 0.8148909 0.8474353 -0.9984638 0.8481355 0.8691663 -0.9987895 0.8762773 0.8897832 -0.9990455 0.899787 0.9084153 -0.999247 0.9192157 0.9247041 -0.9994057 0.9351307 0.9386096 -0.9995308 0.9480746 0.9502734 -0.9996295 0.9585415 0.959928 -0.9997074 0.9669663 0.9678389 -0.9997688 0.9737222 0.9742706 -0.9998174 0.9791238 0.9794681 -0.9998557 0.9834324 0.9836483 -0.999886 0.9868627 0.986998 -0.9999099 0.9895897 0.9896744 -0.9999288 0.9917549 0.9918079 -0.9999437 0.9934725 0.9935057 -0.4144197 0.483464 0.9890841 -0.4143955 0.4833974 0.9890831 -0.4143657 0.4833138 0.9890818 -0.414329 0.483209 0.9890801 -0.4142845 0.483078 0.9890781 -0.4142311 0.4829148 0.9890755 -0.4141683 0.4827124 0.9890723 -0.4140964 0.4824629 0.9890684 -0.4140176 0.4821576 0.9890637 -0.4139373 0.4817882 0.9890579 -0.4138668 0.4813478 0.989051 -0.4138277 0.4808339 0.989043 -0.4138582 0.4802533 0.9890339 -0.4140252 0.4796308 0.9890241 -0.4144423 0.4790235 0.9890146 -0.4152991 0.4785453 0.9890072 -0.4168922 0.4783922 0.9890048 -0.419125 0.4783922 0.9890048 -0.4219498 0.4783922 0.9890048 -0.4255236 0.4783922 0.9890048 -0.4300448 0.4783922 0.9890048 -0.4357648 0.4783922 0.9890048 -0.4430013 0.4783922 0.9890048 -0.4521565 0.4783922 0.9890048 -0.4637389 0.4783922 0.9890048 -0.4783922 0.4783922 0.9890048 -0.4969305 0.4783922 0.9890048 -0.5203839 0.4783922 0.9890048 -0.5500554 0.4783922 0.9890048 -0.5875938 0.4783922 0.9890048 -0.6350848 0.4783922 0.9890048 -0.695167 0.4783922 0.9890048 -0.7711789 0.4783922 0.9890048 -0.8673437 0.4783922 0.9890048 -0.9890048 0.4783922 0.9890048 -0.9914995 0.5278957 0.8841204 -0.9933953 0.580987 0.8260608 -0.9948487 0.6345795 0.8009659 -0.9959706 0.6862532 0.7978374 -0.9968409 0.7342907 0.8082934 -0.9975189 0.7776364 0.8262314 -0.9980488 0.8157988 0.8474353 -0.9984638 0.8487222 0.8691663 -0.9987895 0.8766541 0.8897832 -0.9990455 0.9000277 0.9084153 -0.999247 0.9193688 0.9247041 -0.9994057 0.9352277 0.9386096 -0.9995308 0.9481359 0.9502734 -0.9996295 0.9585802 0.959928 -0.9997074 0.9669906 0.9678389 -0.9997688 0.9737375 0.9742706 -0.9998174 0.9791334 0.9794681 -0.9998557 0.9834385 0.9836483 -0.999886 0.9868665 0.986998 -0.9999099 0.989592 0.9896744 -0.9999288 0.9917564 0.9918079 -0.9999437 0.9934734 0.9935057 -0.4144197 0.5018211 0.9890841 -0.4143955 0.5017569 0.9890831 -0.4143657 0.5016763 0.9890818 -0.414329 0.5015752 0.9890801 -0.4142845 0.5014489 0.9890781 -0.4142311 0.5012915 0.9890755 -0.4141683 0.5010964 0.9890723 -0.4140964 0.5008557 0.9890684 -0.4140176 0.5005614 0.9890637 -0.4139373 0.5002052 0.9890579 -0.4138668 0.4997805 0.989051 -0.4138277 0.4992849 0.989043 -0.4138582 0.4987251 0.9890339 -0.4140252 0.4981248 0.9890241 -0.4144423 0.4975392 0.9890146 -0.4152991 0.4970781 0.9890072 -0.4168922 0.4969305 0.9890048 -0.419125 0.4969305 0.9890048 -0.4219498 0.4969305 0.9890048 -0.4255236 0.4969305 0.9890048 -0.4300448 0.4969305 0.9890048 -0.4357648 0.4969305 0.9890048 -0.4430013 0.4969305 0.9890048 -0.4521565 0.4969305 0.9890048 -0.4637389 0.4969305 0.9890048 -0.4783922 0.4969305 0.9890048 -0.4969305 0.4969305 0.9890048 -0.5203839 0.4969305 0.9890048 -0.5500554 0.4969305 0.9890048 -0.5875938 0.4969305 0.9890048 -0.6350848 0.4969305 0.9890048 -0.695167 0.4969305 0.9890048 -0.7711789 0.4969305 0.9890048 -0.8673437 0.4969305 0.9890048 -0.9890048 0.4969305 0.9890048 -0.9914995 0.5408288 0.8841204 -0.9933953 0.5898847 0.8260608 -0.9948487 0.6406203 0.8009659 -0.9959706 0.6903044 0.7978374 -0.9968409 0.7369774 0.8082934 -0.9975189 0.7794007 0.8262314 -0.9980488 0.8169474 0.8474353 -0.9984638 0.8494644 0.8691663 -0.9987895 0.8771307 0.8897832 -0.9990455 0.9003323 0.9084153 -0.999247 0.9195625 0.9247041 -0.9994057 0.9353505 0.9386096 -0.9995308 0.9482135 0.9502734 -0.9996295 0.9586291 0.959928 -0.9997074 0.9670214 0.9678389 -0.9997688 0.9737569 0.9742706 -0.9998174 0.9791456 0.9794681 -0.9998557 0.9834461 0.9836483 -0.999886 0.9868713 0.986998 -0.9999099 0.989595 0.9896744 -0.9999288 0.9917582 0.9918079 -0.9999437 0.9934746 0.9935057 -0.4144197 0.5250451 0.9890841 -0.4143955 0.5249839 0.9890831 -0.4143657 0.5249071 0.9890818 -0.414329 0.5248108 0.9890801 -0.4142845 0.5246904 0.9890781 -0.4142311 0.5245404 0.9890755 -0.4141683 0.5243544 0.9890723 -0.4140964 0.5241251 0.9890684 -0.4140176 0.5238445 0.9890637 -0.4139373 0.523505 0.9890579 -0.4138668 0.5231002 0.989051 -0.4138277 0.5226279 0.989043 -0.4138582 0.5220943 0.9890339 -0.4140252 0.5215222 0.9890241 -0.4144423 0.5209641 0.9890146 -0.4152991 0.5205246 0.9890072 -0.4168922 0.5203839 0.9890048 -0.419125 0.5203839 0.9890048 -0.4219498 0.5203839 0.9890048 -0.4255236 0.5203839 0.9890048 -0.4300448 0.5203839 0.9890048 -0.4357648 0.5203839 0.9890048 -0.4430013 0.5203839 0.9890048 -0.4521565 0.5203839 0.9890048 -0.4637389 0.5203839 0.9890048 -0.4783922 0.5203839 0.9890048 -0.4969305 0.5203839 0.9890048 -0.5203839 0.5203839 0.9890048 -0.5500554 0.5203839 0.9890048 -0.5875938 0.5203839 0.9890048 -0.6350848 0.5203839 0.9890048 -0.695167 0.5203839 0.9890048 -0.7711789 0.5203839 0.9890048 -0.8673437 0.5203839 0.9890048 -0.9890048 0.5203839 0.9890048 -0.9914995 0.5571908 0.8841204 -0.9933953 0.6011414 0.8260608 -0.9948487 0.6482627 0.8009659 -0.9959706 0.6954296 0.7978374 -0.9968409 0.7403765 0.8082934 -0.9975189 0.7816327 0.8262314 -0.9980488 0.8184005 0.8474353 -0.9984638 0.8504035 0.8691663 -0.9987895 0.8777338 0.8897832 -0.9990455 0.9007175 0.9084153 -0.999247 0.9198076 0.9247041 -0.9994057 0.9355059 0.9386096 -0.9995308 0.9483117 0.9502734 -0.9996295 0.958691 0.959928 -0.9997074 0.9670604 0.9678389 -0.9997688 0.9737814 0.9742706 -0.9998174 0.979161 0.9794681 -0.9998557 0.9834557 0.9836483 -0.999886 0.9868773 0.986998 -0.9999099 0.9895988 0.9896744 -0.9999288 0.9917606 0.9918079 -0.9999437 0.9934761 0.9935057 -0.4144197 0.5544266 0.9890841 -0.4143955 0.5543692 0.9890831 -0.4143657 0.5542971 0.9890818 -0.414329 0.5542068 0.9890801 -0.4142845 0.5540939 0.9890781 -0.4142311 0.5539533 0.9890755 -0.4141683 0.5537789 0.9890723 -0.4140964 0.5535638 0.9890684 -0.4140176 0.5533007 0.9890637 -0.4139373 0.5529823 0.9890579 -0.4138668 0.5526027 0.989051 -0.4138277 0.5521598 0.989043 -0.4138582 0.5516594 0.9890339 -0.4140252 0.5511229 0.9890241 -0.4144423 0.5505995 0.9890146 -0.4152991 0.5501874 0.9890072 -0.4168922 0.5500554 0.9890048 -0.419125 0.5500554 0.9890048 -0.4219498 0.5500554 0.9890048 -0.4255236 0.5500554 0.9890048 -0.4300448 0.5500554 0.9890048 -0.4357648 0.5500554 0.9890048 -0.4430013 0.5500554 0.9890048 -0.4521565 0.5500554 0.9890048 -0.4637389 0.5500554 0.9890048 -0.4783922 0.5500554 0.9890048 -0.4969305 0.5500554 0.9890048 -0.5203839 0.5500554 0.9890048 -0.5500554 0.5500554 0.9890048 -0.5875938 0.5500554 0.9890048 -0.6350848 0.5500554 0.9890048 -0.695167 0.5500554 0.9890048 -0.7711789 0.5500554 0.9890048 -0.8673437 0.5500554 0.9890048 -0.9890048 0.5500554 0.9890048 -0.9914995 0.577891 0.8841204 -0.9933953 0.6153825 0.8260608 -0.9948487 0.6579314 0.8009659 -0.9959706 0.7019138 0.7978374 -0.9968409 0.7446768 0.8082934 -0.9975189 0.7844566 0.8262314 -0.9980488 0.8202389 0.8474353 -0.9984638 0.8515915 0.8691663 -0.9987895 0.8784967 0.8897832 -0.9990455 0.9012049 0.9084153 -0.999247 0.9201176 0.9247041 -0.9994057 0.9357024 0.9386096 -0.9995308 0.9484359 0.9502734 -0.9996295 0.9587693 0.959928 -0.9997074 0.9671097 0.9678389 -0.9997688 0.9738123 0.9742706 -0.9998174 0.9791804 0.9794681 -0.9998557 0.9834679 0.9836483 -0.999886 0.986885 0.986998 -0.9999099 0.9896036 0.9896744 -0.9999288 0.9917636 0.9918079 -0.9999437 0.9934779 0.9935057 -0.4144197 0.591598 0.9890841 -0.4143955 0.5915454 0.9890831 -0.4143657 0.5914794 0.9890818 -0.414329 0.5913967 0.9890801 -0.4142845 0.5912932 0.9890781 -0.4142311 0.5911644 0.9890755 -0.4141683 0.5910046 0.9890723 -0.4140964 0.5908076 0.9890684 -0.4140176 0.5905666 0.9890637 -0.4139373 0.5902749 0.9890579 -0.4138668 0.5899272 0.989051 -0.4138277 0.5895215 0.989043 -0.4138582 0.5890631 0.9890339 -0.4140252 0.5885717 0.9890241 -0.4144423 0.5880922 0.9890146 -0.4152991 0.5877147 0.9890072 -0.4168922 0.5875938 0.9890048 -0.419125 0.5875938 0.9890048 -0.4219498 0.5875938 0.9890048 -0.4255236 0.5875938 0.9890048 -0.4300448 0.5875938 0.9890048 -0.4357648 0.5875938 0.9890048 -0.4430013 0.5875938 0.9890048 -0.4521565 0.5875938 0.9890048 -0.4637389 0.5875938 0.9890048 -0.4783922 0.5875938 0.9890048 -0.4969305 0.5875938 0.9890048 -0.5203839 0.5875938 0.9890048 -0.5500554 0.5875938 0.9890048 -0.5875938 0.5875938 0.9890048 -0.6350848 0.5875938 0.9890048 -0.695167 0.5875938 0.9890048 -0.7711789 0.5875938 0.9890048 -0.8673437 0.5875938 0.9890048 -0.9890048 0.5875938 0.9890048 -0.9914995 0.6040793 0.8841204 -0.9933953 0.6333995 0.8260608 -0.9948487 0.6701635 0.8009659 -0.9959706 0.710117 0.7978374 -0.9968409 0.7501172 0.8082934 -0.9975189 0.7880291 0.8262314 -0.9980488 0.8225647 0.8474353 -0.9984638 0.8530945 0.8691663 -0.9987895 0.8794619 0.8897832 -0.9990455 0.9018215 0.9084153 -0.999247 0.9205098 0.9247041 -0.9994057 0.935951 0.9386096 -0.9995308 0.9485931 0.9502734 -0.9996295 0.9588684 0.959928 -0.9997074 0.967172 0.9678389 -0.9997688 0.9738515 0.9742706 -0.9998174 0.979205 0.9794681 -0.9998557 0.9834833 0.9836483 -0.999886 0.9868946 0.986998 -0.9999099 0.9896096 0.9896744 -0.9999288 0.9917674 0.9918079 -0.9999437 0.9934803 0.9935057 -0.4144197 0.6386246 0.9890841 -0.4143955 0.6385781 0.9890831 -0.4143657 0.6385197 0.9890818 -0.414329 0.6384466 0.9890801 -0.4142845 0.6383552 0.9890781 -0.4142311 0.6382413 0.9890755 -0.4141683 0.6381 0.9890723 -0.4140964 0.6379259 0.9890684 -0.4140176 0.6377128 0.9890637 -0.4139373 0.637455 0.9890579 -0.4138668 0.6371476 0.989051 -0.4138277 0.6367889 0.989043 -0.4138582 0.6363837 0.9890339 -0.4140252 0.6359492 0.9890241 -0.4144423 0.6355254 0.9890146 -0.4152991 0.6351916 0.9890072 -0.4168922 0.6350848 0.9890048 -0.419125 0.6350848 0.9890048 -0.4219498 0.6350848 0.9890048 -0.4255236 0.6350848 0.9890048 -0.4300448 0.6350848 0.9890048 -0.4357648 0.6350848 0.9890048 -0.4430013 0.6350848 0.9890048 -0.4521565 0.6350848 0.9890048 -0.4637389 0.6350848 0.9890048 -0.4783922 0.6350848 0.9890048 -0.4969305 0.6350848 0.9890048 -0.5203839 0.6350848 0.9890048 -0.5500554 0.6350848 0.9890048 -0.5875938 0.6350848 0.9890048 -0.6350848 0.6350848 0.9890048 -0.695167 0.6350848 0.9890048 -0.7711789 0.6350848 0.9890048 -0.8673437 0.6350848 0.9890048 -0.9890048 0.6350848 0.9890048 -0.9914995 0.637211 0.8841204 -0.9933953 0.6561933 0.8260608 -0.9948487 0.6856388 0.8009659 -0.9959706 0.7204952 0.7978374 -0.9968409 0.757 0.8082934 -0.9975189 0.7925488 0.8262314 -0.9980488 0.8255071 0.8474353 -0.9984638 0.8549959 0.8691663 -0.9987895 0.880683 0.8897832 -0.9990455 0.9026016 0.9084153 -0.999247 0.9210061 0.9247041 -0.9994057 0.9362655 0.9386096 -0.9995308 0.9487918 0.9502734 -0.9996295 0.9589938 0.959928 -0.9997074 0.9672509 0.9678389 -0.9997688 0.9739011 0.9742706 -0.9998174 0.9792361 0.9794681 -0.9998557 0.9835029 0.9836483 -0.999886 0.9869069 0.986998 -0.9999099 0.9896173 0.9896744 -0.9999288 0.9917722 0.9918079 -0.9999437 0.9934833 0.9935057 -0.4144197 0.6981193 0.9890841 -0.4143955 0.6980806 0.9890831 -0.4143657 0.6980319 0.9890818 -0.414329 0.6979709 0.9890801 -0.4142845 0.6978947 0.9890781 -0.4142311 0.6977997 0.9890755 -0.4141683 0.6976819 0.9890723 -0.4140964 0.6975366 0.9890684 -0.4140176 0.6973589 0.9890637 -0.4139373 0.6971439 0.9890579 -0.4138668 0.6968875 0.989051 -0.4138277 0.6965883 0.989043 -0.4138582 0.6962504 0.9890339 -0.4140252 0.695888 0.9890241 -0.4144423 0.6955345 0.9890146 -0.4152991 0.6952561 0.9890072 -0.4168922 0.695167 0.9890048 -0.419125 0.695167 0.9890048 -0.4219498 0.695167 0.9890048 -0.4255236 0.695167 0.9890048 -0.4300448 0.695167 0.9890048 -0.4357648 0.695167 0.9890048 -0.4430013 0.695167 0.9890048 -0.4521565 0.695167 0.9890048 -0.4637389 0.695167 0.9890048 -0.4783922 0.695167 0.9890048 -0.4969305 0.695167 0.9890048 -0.5203839 0.695167 0.9890048 -0.5500554 0.695167 0.9890048 -0.5875938 0.695167 0.9890048 -0.6350848 0.695167 0.9890048 -0.695167 0.695167 0.9890048 -0.7711789 0.695167 0.9890048 -0.8673437 0.695167 0.9890048 -0.9890048 0.695167 0.9890048 -0.9914995 0.6791269 0.8841204 -0.9933953 0.6850303 0.8260608 -0.9948487 0.7052169 0.8009659 -0.9959706 0.733625 0.7978374 -0.9968409 0.7657077 0.8082934 -0.9975189 0.7982669 0.8262314 -0.9980488 0.8292297 0.8474353 -0.9984638 0.8574015 0.8691663 -0.9987895 0.8822279 0.8897832 -0.9990455 0.9035886 0.9084153 -0.999247 0.9216339 0.9247041 -0.9994057 0.9366635 0.9386096 -0.9995308 0.9490434 0.9502734 -0.9996295 0.9591524 0.959928 -0.9997074 0.9673508 0.9678389 -0.9997688 0.9739638 0.9742706 -0.9998174 0.9792755 0.9794681 -0.9998557 0.9835276 0.9836483 -0.999886 0.9869223 0.986998 -0.9999099 0.989627 0.9896744 -0.9999288 0.9917782 0.9918079 -0.9999437 0.9934871 0.9935057 -0.4144197 0.773388 0.9890841 -0.4143955 0.773359 0.9890831 -0.4143657 0.7733226 0.9890818 -0.414329 0.7732769 0.9890801 -0.4142845 0.7732199 0.9890781 -0.4142311 0.7731488 0.9890755 -0.4141683 0.7730606 0.9890723 -0.4140964 0.7729519 0.9890684 -0.4140176 0.772819 0.9890637 -0.4139373 0.772658 0.9890579 -0.4138668 0.7724662 0.989051 -0.4138277 0.7722424 0.989043 -0.4138582 0.7719895 0.9890339 -0.4140252 0.7717183 0.9890241 -0.4144423 0.7714538 0.9890146 -0.4152991 0.7712455 0.9890072 -0.4168922 0.7711789 0.9890048 -0.419125 0.7711789 0.9890048 -0.4219498 0.7711789 0.9890048 -0.4255236 0.7711789 0.9890048 -0.4300448 0.7711789 0.9890048 -0.4357648 0.7711789 0.9890048 -0.4430013 0.7711789 0.9890048 -0.4521565 0.7711789 0.9890048 -0.4637389 0.7711789 0.9890048 -0.4783922 0.7711789 0.9890048 -0.4969305 0.7711789 0.9890048 -0.5203839 0.7711789 0.9890048 -0.5500554 0.7711789 0.9890048 -0.5875938 0.7711789 0.9890048 -0.6350848 0.7711789 0.9890048 -0.695167 0.7711789 0.9890048 -0.7711789 0.7711789 0.9890048 -0.8673437 0.7711789 0.9890048 -0.9890048 0.7711789 0.9890048 -0.9914995 0.7321559 0.8841204 -0.9933953 0.721513 0.8260608 -0.9948487 0.7299859 0.8009659 -0.9959706 0.7502359 0.7978374 -0.9968409 0.776724 0.8082934 -0.9975189 0.8055009 0.8262314 -0.9980488 0.8339392 0.8474353 -0.9984638 0.8604449 0.8691663 -0.9987895 0.8841823 0.8897832 -0.9990455 0.9048372 0.9084153 -0.999247 0.9224281 0.9247041 -0.9994057 0.9371669 0.9386096 -0.9995308 0.9493615 0.9502734 -0.9996295 0.959353 0.959928 -0.9997074 0.967477 0.9678389 -0.9997688 0.9740432 0.9742706 -0.9998174 0.9793253 0.9794681 -0.9998557 0.9835588 0.9836483 -0.999886 0.9869419 0.986998 -0.9999099 0.9896392 0.9896744 -0.9999288 0.9917859 0.9918079 -0.9999437 0.9934919 0.9935057 -0.4144197 0.8686126 0.9890841 -0.4143955 0.8685959 0.9890831 -0.4143657 0.868575 0.9890818 -0.414329 0.8685488 0.9890801 -0.4142845 0.868516 0.9890781 -0.4142311 0.8684752 0.9890755 -0.4141683 0.8684246 0.9890723 -0.4140964 0.8683621 0.9890684 -0.4140176 0.8682858 0.9890637 -0.4139373 0.8681933 0.9890579 -0.4138668 0.8680831 0.989051 -0.4138277 0.8679546 0.989043 -0.4138582 0.8678093 0.9890339 -0.4140252 0.8676536 0.9890241 -0.4144423 0.8675017 0.9890146 -0.4152991 0.867382 0.9890072 -0.4168922 0.8673437 0.9890048 -0.419125 0.8673437 0.9890048 -0.4219498 0.8673437 0.9890048 -0.4255236 0.8673437 0.9890048 -0.4300448 0.8673437 0.9890048 -0.4357648 0.8673437 0.9890048 -0.4430013 0.8673437 0.9890048 -0.4521565 0.8673437 0.9890048 -0.4637389 0.8673437 0.9890048 -0.4783922 0.8673437 0.9890048 -0.4969305 0.8673437 0.9890048 -0.5203839 0.8673437 0.9890048 -0.5500554 0.8673437 0.9890048 -0.5875938 0.8673437 0.9890048 -0.6350848 0.8673437 0.9890048 -0.695167 0.8673437 0.9890048 -0.7711789 0.8673437 0.9890048 -0.8673437 0.8673437 0.9890048 -0.9890048 0.8673437 0.9890048 -0.9914995 0.7992446 0.8841204 -0.9933953 0.7676683 0.8260608 -0.9948487 0.7613218 0.8009659 -0.9959706 0.7712508 0.7978374 -0.9968409 0.7906611 0.8082934 -0.9975189 0.8146529 0.8262314 -0.9980488 0.8398974 0.8474353 -0.9984638 0.8642952 0.8691663 -0.9987895 0.886655 0.8897832 -0.9990455 0.9064168 0.9084153 -0.999247 0.9234329 0.9247041 -0.9994057 0.9378038 0.9386096 -0.9995308 0.9497641 0.9502734 -0.9996295 0.9596068 0.959928 -0.9997074 0.9676368 0.9678389 -0.9997688 0.9741436 0.9742706 -0.9998174 0.9793883 0.9794681 -0.9998557 0.9835983 0.9836483 -0.999886 0.9869667 0.986998 -0.9999099 0.9896547 0.9896744 -0.9999288 0.9917956 0.9918079 -0.9999437 0.993498 0.9935057 -0.4144197 0.9890841 0.9890841 -0.4143955 0.9890831 0.9890831 -0.4143657 0.9890818 0.9890818 -0.414329 0.9890801 0.9890801 -0.4142845 0.9890781 0.9890781 -0.4142311 0.9890755 0.9890755 -0.4141683 0.9890723 0.9890723 -0.4140964 0.9890684 0.9890684 -0.4140176 0.9890637 0.9890637 -0.4139373 0.9890579 0.9890579 -0.4138668 0.989051 0.989051 -0.4138277 0.989043 0.989043 -0.4138582 0.9890339 0.9890339 -0.4140252 0.9890241 0.9890241 -0.4144423 0.9890146 0.9890146 -0.4152991 0.9890072 0.9890072 -0.4168922 0.9890048 0.9890048 -0.419125 0.9890048 0.9890048 -0.4219498 0.9890048 0.9890048 -0.4255236 0.9890048 0.9890048 -0.4300448 0.9890048 0.9890048 -0.4357648 0.9890048 0.9890048 -0.4430013 0.9890048 0.9890048 -0.4521565 0.9890048 0.9890048 -0.4637389 0.9890048 0.9890048 -0.4783922 0.9890048 0.9890048 -0.4969305 0.9890048 0.9890048 -0.5203839 0.9890048 0.9890048 -0.5500554 0.9890048 0.9890048 -0.5875938 0.9890048 0.9890048 -0.6350848 0.9890048 0.9890048 -0.695167 0.9890048 0.9890048 -0.7711789 0.9890048 0.9890048 -0.8673437 0.9890048 0.9890048 -0.9890048 0.9890048 0.9890048 -0.9914995 0.8841204 0.8841204 -0.9933953 0.8260608 0.8260608 -0.9948487 0.8009659 0.8009659 -0.9959706 0.7978374 0.7978374 -0.9968409 0.8082934 0.8082934 -0.9975189 0.8262314 0.8262314 -0.9980488 0.8474353 0.8474353 -0.9984638 0.8691663 0.8691663 -0.9987895 0.8897832 0.8897832 -0.9990455 0.9084153 0.9084153 -0.999247 0.9247041 0.9247041 -0.9994057 0.9386096 0.9386096 -0.9995308 0.9502734 0.9502734 -0.9996295 0.959928 0.959928 -0.9997074 0.9678389 0.9678389 -0.9997688 0.9742706 0.9742706 -0.9998174 0.9794681 0.9794681 -0.9998557 0.9836483 0.9836483 -0.999886 0.986998 0.986998 -0.9999099 0.9896744 0.9896744 -0.9999288 0.9918079 0.9918079 -0.9999437 0.9935057 0.9935057 -0.4834235 0.9915469 0.8850325 -0.4834045 0.9915463 0.8850205 -0.4833811 0.9915455 0.8850054 -0.4833522 0.9915446 0.8849865 -0.4833171 0.9915433 0.884963 -0.4832747 0.9915418 0.8849336 -0.4832246 0.9915399 0.8848971 -0.4831666 0.9915376 0.8848522 -0.4831021 0.9915347 0.8847973 -0.4830346 0.9915312 0.8847308 -0.4829718 0.9915271 0.8846516 -0.4829286 0.9915223 0.8845592 -0.4829319 0.9915169 0.8844548 -0.4830292 0.991511 0.8843429 -0.4833013 0.9915054 0.8842338 -0.4838841 0.9915009 0.8841479 -0.4849907 0.9914995 0.8841204 -0.4865484 0.9914995 0.8841204 -0.4885191 0.9914995 0.8841204 -0.4910123 0.9914995 0.8841204 -0.4941665 0.9914995 0.8841204 -0.498157 0.9914995 0.8841204 -0.5032055 0.9914995 0.8841204 -0.5095925 0.9914995 0.8841204 -0.5176729 0.9914995 0.8841204 -0.5278957 0.9914995 0.8841204 -0.5408288 0.9914995 0.8841204 -0.5571908 0.9914995 0.8841204 -0.577891 0.9914995 0.8841204 -0.6040793 0.9914995 0.8841204 -0.637211 0.9914995 0.8841204 -0.6791269 0.9914995 0.8841204 -0.7321559 0.9914995 0.8841204 -0.7992446 0.9914995 0.8841204 -0.8841204 0.9914995 0.8841204 -0.9914995 0.9914995 0.8841204 -0.9933953 0.8999349 0.8260608 -0.9948487 0.8511207 0.8009659 -0.9959706 0.8314729 0.7978374 -0.9968409 0.8306004 0.8082934 -0.9975189 0.8408797 0.8262314 -0.9980488 0.8569716 0.8474353 -0.9984638 0.875329 0.8691663 -0.9987895 0.8937407 0.8897832 -0.9990455 0.9109436 0.9084153 -0.999247 0.9263124 0.9247041 -0.9994057 0.939629 0.9386096 -0.9995308 0.9509177 0.9502734 -0.9996295 0.9603343 0.959928 -0.9997074 0.9680946 0.9678389 -0.9997688 0.9744313 0.9742706 -0.9998174 0.9795689 0.9794681 -0.9998557 0.9837116 0.9836483 -0.999886 0.9870376 0.986998 -0.9999099 0.9896992 0.9896744 -0.9999288 0.9918234 0.9918079 -0.9999437 0.9935154 0.9935057 -0.5504963 0.993424 0.8271953 -0.5504818 0.9934236 0.8271803 -0.550464 0.9934231 0.8271616 -0.5504419 0.9934225 0.8271381 -0.550415 0.9934218 0.8271087 -0.5503825 0.9934209 0.8270722 -0.5503438 0.9934197 0.8270268 -0.5502987 0.9934183 0.8269709 -0.550248 0.9934166 0.8269025 -0.5501939 0.9934145 0.8268198 -0.5501416 0.993412 0.8267212 -0.5501012 0.9934091 0.8266062 -0.5500915 0.9934058 0.8264764 -0.5501456 0.9934023 0.8263373 -0.5503203 0.9933988 0.8262017 -0.5507113 0.9933961 0.826095 -0.5514695 0.9933953 0.8260608 -0.5525411 0.9933953 0.8260608 -0.5538969 0.9933953 0.8260608 -0.5556122 0.9933953 0.8260608 -0.5577822 0.9933953 0.8260608 -0.5605276 0.9933953 0.8260608 -0.5640008 0.9933953 0.8260608 -0.5683949 0.9933953 0.8260608 -0.573954 0.9933953 0.8260608 -0.580987 0.9933953 0.8260608 -0.5898847 0.9933953 0.8260608 -0.6011414 0.9933953 0.8260608 -0.6153825 0.9933953 0.8260608 -0.6333995 0.9933953 0.8260608 -0.6561933 0.9933953 0.8260608 -0.6850303 0.9933953 0.8260608 -0.721513 0.9933953 0.8260608 -0.7676683 0.9933953 0.8260608 -0.8260608 0.9933953 0.8260608 -0.8999349 0.9933953 0.8260608 -0.9933953 0.9933953 0.8260608 -0.9948487 0.9145732 0.8009659 -0.9959706 0.8740262 0.7978374 -0.9968409 0.8588218 0.8082934 -0.9975189 0.8594117 0.8262314 -0.9980488 0.8690364 0.8474353 -0.9984638 0.8831255 0.8691663 -0.9987895 0.8987476 0.8897832 -0.9990455 0.9141422 0.9084153 -0.999247 0.928347 0.9247041 -0.9994057 0.9409186 0.9386096 -0.9995308 0.9517328 0.9502734 -0.9996295 0.9608482 0.959928 -0.9997074 0.9684181 0.9678389 -0.9997688 0.9746346 0.9742706 -0.9998174 0.9796966 0.9794681 -0.9998557 0.9837916 0.9836483 -0.999886 0.9870878 0.986998 -0.9999099 0.9897306 0.9896744 -0.9999288 0.9918431 0.9918079 -0.9999437 0.9935277 0.9935057 -0.6139459 0.9948662 0.802031 -0.6139352 0.994866 0.802017 -0.6139219 0.9948657 0.8019994 -0.6139056 0.9948653 0.8019773 -0.6138855 0.9948649 0.8019497 -0.6138613 0.9948643 0.8019154 -0.6138323 0.9948636 0.8018727 -0.6137984 0.9948628 0.8018202 -0.6137599 0.9948617 0.801756 -0.6137183 0.9948604 0.8016783 -0.6136769 0.9948589 0.8015857 -0.6136427 0.9948571 0.8014777 -0.6136284 0.9948551 0.8013559 -0.6136569 0.994853 0.8012253 -0.6137675 0.9948509 0.801098 -0.6140266 0.9948493 0.8009979 -0.6145393 0.9948487 0.8009659 -0.6152669 0.9948487 0.8009659 -0.6161874 0.9948487 0.8009659 -0.6173519 0.9948487 0.8009659 -0.6188252 0.9948487 0.8009659 -0.6206891 0.9948487 0.8009659 -0.6230471 0.9948487 0.8009659 -0.6260304 0.9948487 0.8009659 -0.6298046 0.9948487 0.8009659 -0.6345795 0.9948487 0.8009659 -0.6406203 0.9948487 0.8009659 -0.6482627 0.9948487 0.8009659 -0.6579314 0.9948487 0.8009659 -0.6701635 0.9948487 0.8009659 -0.6856388 0.9948487 0.8009659 -0.7052169 0.9948487 0.8009659 -0.7299859 0.9948487 0.8009659 -0.7613218 0.9948487 0.8009659 -0.8009659 0.9948487 0.8009659 -0.8511207 0.9948487 0.8009659 -0.9145732 0.9948487 0.8009659 -0.9948487 0.9948487 0.8009659 -0.9959706 0.9278617 0.7978374 -0.9968409 0.8945255 0.8082934 -0.9975189 0.8828571 0.8262314 -0.9980488 0.8842998 0.8474353 -0.9984638 0.892989 0.8691663 -0.9987895 0.9050819 0.8897832 -0.9990455 0.9181889 0.9084153 -0.999247 0.9309211 0.9247041 -0.9994057 0.9425502 0.9386096 -0.9995308 0.952764 0.9502734 -0.9996295 0.9614985 0.959928 -0.9997074 0.9688274 0.9678389 -0.9997688 0.9748918 0.9742706 -0.9998174 0.979858 0.9794681 -0.9998557 0.9838928 0.9836483 -0.999886 0.9871512 0.986998 -0.9999099 0.9897703 0.9896744 -0.9999288 0.991868 0.9918079 -0.9999437 0.9935432 0.9935057 -0.6724572 0.9959813 0.7987204 -0.6724495 0.9959811 0.7987087 -0.6724399 0.9959809 0.7986941 -0.672428 0.9959807 0.7986758 -0.6724135 0.9959804 0.7986529 -0.6723959 0.9959801 0.7986244 -0.6723748 0.9959797 0.798589 -0.67235 0.9959791 0.7985455 -0.6723217 0.9959785 0.7984922 -0.6722907 0.9959777 0.7984278 -0.6722594 0.9959768 0.798351 -0.6722322 0.9959757 0.7982615 -0.672218 0.9959745 0.7981605 -0.672232 0.9959732 0.7980523 -0.6723012 0.9959719 0.7979469 -0.6724711 0.9959709 0.797864 -0.6728136 0.9959706 0.7978374 -0.6733015 0.9959706 0.7978374 -0.6739188 0.9959706 0.7978374 -0.6746998 0.9959706 0.7978374 -0.6756878 0.9959706 0.7978374 -0.6769378 0.9959706 0.7978374 -0.6785192 0.9959706 0.7978374 -0.6805199 0.9959706 0.7978374 -0.683051 0.9959706 0.7978374 -0.6862532 0.9959706 0.7978374 -0.6903044 0.9959706 0.7978374 -0.6954296 0.9959706 0.7978374 -0.7019138 0.9959706 0.7978374 -0.710117 0.9959706 0.7978374 -0.7204952 0.9959706 0.7978374 -0.733625 0.9959706 0.7978374 -0.7502359 0.9959706 0.7978374 -0.7712508 0.9959706 0.7978374 -0.7978374 0.9959706 0.7978374 -0.8314729 0.9959706 0.7978374 -0.8740262 0.9959706 0.7978374 -0.9278617 0.9959706 0.7978374 -0.9959706 0.9959706 0.7978374 -0.9968409 0.9396953 0.8082934 -0.9975189 0.9125186 0.8262314 -0.9980488 0.9036101 0.8474353 -0.9984638 0.9054678 0.8691663 -0.9987895 0.9130957 0.8897832 -0.9990455 0.9233085 0.9084153 -0.999247 0.9341777 0.9247041 -0.9994057 0.9446144 0.9386096 -0.9995308 0.9540687 0.9502734 -0.9996295 0.9623212 0.959928 -0.9997074 0.9693452 0.9678389 -0.9997688 0.9752172 0.9742706 -0.9998174 0.9800622 0.9794681 -0.9998557 0.9840209 0.9836483 -0.999886 0.9872315 0.986998 -0.9999099 0.9898206 0.9896744 -0.9999288 0.9918994 0.9918079 -0.9999437 0.9935629 0.9935057 -0.7251659 0.9968475 0.8089735 -0.7251605 0.9968474 0.8089645 -0.7251537 0.9968473 0.8089533 -0.7251454 0.9968472 0.8089391 -0.7251351 0.996847 0.8089215 -0.7251226 0.9968468 0.8088995 -0.7251076 0.9968465 0.8088723 -0.7250899 0.9968462 0.8088387 -0.7250697 0.9968458 0.8087977 -0.7250473 0.9968453 0.808748 -0.7250244 0.9968448 0.8086889 -0.7250039 0.9968441 0.8086199 -0.7249916 0.9968433 0.8085421 -0.7249978 0.9968425 0.8084588 -0.7250408 0.9968418 0.8083776 -0.7251511 0.9968411 0.8083138 -0.7253775 0.9968409 0.8082934 -0.7257011 0.9968409 0.8082934 -0.7261105 0.9968409 0.8082934 -0.7266285 0.9968409 0.8082934 -0.7272837 0.9968409 0.8082934 -0.7281127 0.9968409 0.8082934 -0.7291615 0.9968409 0.8082934 -0.7304884 0.9968409 0.8082934 -0.732167 0.9968409 0.8082934 -0.7342907 0.9968409 0.8082934 -0.7369774 0.9968409 0.8082934 -0.7403765 0.9968409 0.8082934 -0.7446768 0.9968409 0.8082934 -0.7501172 0.9968409 0.8082934 -0.757 0.9968409 0.8082934 -0.7657077 0.9968409 0.8082934 -0.776724 0.9968409 0.8082934 -0.7906611 0.9968409 0.8082934 -0.8082934 0.9968409 0.8082934 -0.8306004 0.9968409 0.8082934 -0.8588218 0.9968409 0.8082934 -0.8945255 0.9968409 0.8082934 -0.9396953 0.9968409 0.8082934 -0.9968409 0.9968409 0.8082934 -0.9975189 0.9500442 0.8262314 -0.9980488 0.9280401 0.8474353 -0.9984638 0.921255 0.8691663 -0.9987895 0.9232341 0.8897832 -0.9990455 0.9297854 0.9084153 -0.999247 0.9382977 0.9247041 -0.9994057 0.9472259 0.9386096 -0.9995308 0.9557192 0.9502734 -0.9996295 0.963362 0.959928 -0.9997074 0.9700002 0.9678389 -0.9997688 0.9756289 0.9742706 -0.9998174 0.9803206 0.9794681 -0.9998557 0.9841829 0.9836483 -0.999886 0.987333 0.986998 -0.9999099 0.9898842 0.9896744 -0.9999288 0.9919392 0.9918079 -0.9999437 0.9935878 0.9935057 -0.7716588 0.997523 0.8267302 -0.7716551 0.997523 0.8267236 -0.7716504 0.9975229 0.8267153 -0.7716446 0.9975228 0.826705 -0.7716375 0.9975227 0.826692 -0.7716288 0.9975226 0.8266759 -0.7716184 0.9975224 0.8266559 -0.7716061 0.9975222 0.8266313 -0.7715919 0.997522 0.8266012 -0.7715762 0.9975217 0.8265648 -0.7715599 0.9975213 0.8265214 -0.7715449 0.9975209 0.8264708 -0.7715352 0.9975204 0.8264138 -0.7715376 0.9975199 0.8263527 -0.7715641 0.9975194 0.8262932 -0.7716352 0.9975191 0.8262464 -0.7717834 0.9975189 0.8262314 -0.7719959 0.9975189 0.8262314 -0.7722648 0.9975189 0.8262314 -0.7726049 0.9975189 0.8262314 -0.7730352 0.9975189 0.8262314 -0.7735795 0.9975189 0.8262314 -0.7742682 0.9975189 0.8262314 -0.7751395 0.9975189 0.8262314 -0.7762418 0.9975189 0.8262314 -0.7776364 0.9975189 0.8262314 -0.7794007 0.9975189 0.8262314 -0.7816327 0.9975189 0.8262314 -0.7844566 0.9975189 0.8262314 -0.7880291 0.9975189 0.8262314 -0.7925488 0.9975189 0.8262314 -0.7982669 0.9975189 0.8262314 -0.8055009 0.9975189 0.8262314 -0.8146529 0.9975189 0.8262314 -0.8262314 0.9975189 0.8262314 -0.8408797 0.9975189 0.8262314 -0.8594117 0.9975189 0.8262314 -0.8828571 0.9975189 0.8262314 -0.9125186 0.9975189 0.8262314 -0.9500442 0.9975189 0.8262314 -0.9975189 0.9975189 0.8262314 -0.9980488 0.9589472 0.8474353 -0.9984638 0.9412278 0.8691663 -0.9987895 0.9360606 0.8897832 -0.9990455 0.9379796 0.9084153 -0.999247 0.94351 0.9247041 -0.9994057 0.9505298 0.9386096 -0.9995308 0.9578074 0.9502734 -0.9996295 0.9646787 0.959928 -0.9997074 0.970829 0.9678389 -0.9997688 0.9761497 0.9742706 -0.9998174 0.9806476 0.9794681 -0.9998557 0.984388 0.9836483 -0.999886 0.9874615 0.986998 -0.9999099 0.9899646 0.9896744 -0.9999288 0.9919896 0.9918079 -0.9999437 0.9936193 0.9935057 -0.8119154 0.9980513 0.8477882 -0.8119128 0.9980512 0.8477836 -0.8119096 0.9980512 0.8477777 -0.8119057 0.9980511 0.8477704 -0.8119009 0.9980511 0.8477612 -0.8118949 0.998051 0.8477498 -0.8118878 0.9980509 0.8477357 -0.8118794 0.9980508 0.8477182 -0.8118697 0.9980506 0.8476969 -0.8118589 0.9980504 0.8476711 -0.8118476 0.9980502 0.8476404 -0.811837 0.99805 0.8476047 -0.8118298 0.9980497 0.8475643 -0.8118303 0.9980494 0.8475211 -0.8118466 0.9980491 0.847479 -0.8118921 0.9980488 0.8474458 -0.8119884 0.9980488 0.8474353 -0.8121268 0.9980488 0.8474353 -0.8123018 0.9980488 0.8474353 -0.8125232 0.9980488 0.8474353 -0.8128033 0.9980488 0.8474353 -0.8131577 0.9980488 0.8474353 -0.8136061 0.9980488 0.8474353 -0.8141733 0.9980488 0.8474353 -0.8148909 0.9980488 0.8474353 -0.8157988 0.9980488 0.8474353 -0.8169474 0.9980488 0.8474353 -0.8184005 0.9980488 0.8474353 -0.8202389 0.9980488 0.8474353 -0.8225647 0.9980488 0.8474353 -0.8255071 0.9980488 0.8474353 -0.8292297 0.9980488 0.8474353 -0.8339392 0.9980488 0.8474353 -0.8398974 0.9980488 0.8474353 -0.8474353 0.9980488 0.8474353 -0.8569716 0.9980488 0.8474353 -0.8690364 0.9980488 0.8474353 -0.8842998 0.9980488 0.8474353 -0.9036101 0.9980488 0.8474353 -0.9280401 0.9980488 0.8474353 -0.9589472 0.9980488 0.8474353 -0.9980488 0.9980488 0.8474353 -0.9984638 0.9664961 0.8691663 -0.9987895 0.9522877 0.8897832 -0.9990455 0.9483463 0.9084153 -0.999247 0.9501042 0.9247041 -0.9994057 0.9547096 0.9386096 -0.9995308 0.9604492 0.9502734 -0.9996295 0.9663445 0.959928 -0.9997074 0.9718774 0.9678389 -0.9997688 0.9768086 0.9742706 -0.9998174 0.9810611 0.9794681 -0.9998557 0.9846473 0.9836483 -0.999886 0.987624 0.986998 -0.9999099 0.9900664 0.9896744 -0.9999288 0.9920533 0.9918079 -0.9999437 0.9936592 0.9935057 -0.8462171 0.9984653 0.8694095 -0.8462154 0.9984653 0.8694063 -0.8462132 0.9984653 0.8694023 -0.8462106 0.9984653 0.8693972 -0.8462073 0.9984652 0.8693909 -0.8462034 0.9984652 0.8693831 -0.8461986 0.9984651 0.8693733 -0.8461929 0.998465 0.8693613 -0.8461864 0.9984649 0.8693466 -0.8461791 0.9984648 0.8693288 -0.8461714 0.9984647 0.8693077 -0.8461641 0.9984645 0.869283 -0.8461589 0.9984643 0.8692552 -0.8461587 0.9984642 0.8692255 -0.8461687 0.998464 0.8691965 -0.8461977 0.9984638 0.8691736 -0.8462598 0.9984638 0.8691663 -0.8463492 0.9984638 0.8691663 -0.8464623 0.9984638 0.8691663 -0.8466054 0.9984638 0.8691663 -0.8467864 0.9984638 0.8691663 -0.8470154 0.9984638 0.8691663 -0.8473052 0.9984638 0.8691663 -0.8476717 0.9984638 0.8691663 -0.8481355 0.9984638 0.8691663 -0.8487222 0.9984638 0.8691663 -0.8494644 0.9984638 0.8691663 -0.8504035 0.9984638 0.8691663 -0.8515915 0.9984638 0.8691663 -0.8530945 0.9984638 0.8691663 -0.8549959 0.9984638 0.8691663 -0.8574015 0.9984638 0.8691663 -0.8604449 0.9984638 0.8691663 -0.8642952 0.9984638 0.8691663 -0.8691663 0.9984638 0.8691663 -0.875329 0.9984638 0.8691663 -0.8831255 0.9984638 0.8691663 -0.892989 0.9984638 0.8691663 -0.9054678 0.9984638 0.8691663 -0.921255 0.9984638 0.8691663 -0.9412278 0.9984638 0.8691663 -0.9664961 0.9984638 0.8691663 -0.9984638 0.9984638 0.8691663 -0.9987895 0.9728171 0.8897832 -0.9990455 0.9614615 0.9084153 -0.999247 0.9584468 0.9247041 -0.9994057 0.9599976 0.9386096 -0.9995308 0.9637914 0.9502734 -0.9996295 0.968452 0.959928 -0.9997074 0.9732039 0.9678389 -0.9997688 0.9776422 0.9742706 -0.9998174 0.9815844 0.9794681 -0.9998557 0.9849754 0.9836483 -0.999886 0.9878296 0.986998 -0.9999099 0.9901951 0.9896744 -0.9999288 0.9921339 0.9918079 -0.9999437 0.9937096 0.9935057 -0.8750477 0.9987905 0.8899473 -0.8750466 0.9987905 0.8899451 -0.8750451 0.9987904 0.8899424 -0.8750434 0.9987904 0.889939 -0.8750412 0.9987904 0.8899347 -0.8750386 0.9987904 0.8899294 -0.8750355 0.9987903 0.8899228 -0.8750317 0.9987903 0.8899147 -0.8750274 0.9987902 0.8899048 -0.8750225 0.9987902 0.8898928 -0.8750173 0.9987901 0.8898785 -0.8750124 0.99879 0.8898619 -0.8750088 0.9987899 0.8898431 -0.8750084 0.9987897 0.889823 -0.8750145 0.9987896 0.8898035 -0.8750329 0.9987895 0.8897881 -0.8750727 0.9987895 0.8897832 -0.8751301 0.9987895 0.8897832 -0.8752028 0.9987895 0.8897832 -0.8752947 0.9987895 0.8897832 -0.8754109 0.9987895 0.8897832 -0.875558 0.9987895 0.8897832 -0.8757441 0.9987895 0.8897832 -0.8759795 0.9987895 0.8897832 -0.8762773 0.9987895 0.8897832 -0.8766541 0.9987895 0.8897832 -0.8771307 0.9987895 0.8897832 -0.8777338 0.9987895 0.8897832 -0.8784967 0.9987895 0.8897832 -0.8794619 0.9987895 0.8897832 -0.880683 0.9987895 0.8897832 -0.8822279 0.9987895 0.8897832 -0.8841823 0.9987895 0.8897832 -0.886655 0.9987895 0.8897832 -0.8897832 0.9987895 0.8897832 -0.8937407 0.9987895 0.8897832 -0.8987476 0.9987895 0.8897832 -0.9050819 0.9987895 0.8897832 -0.9130957 0.9987895 0.8897832 -0.9232341 0.9987895 0.8897832 -0.9360606 0.9987895 0.8897832 -0.9522877 0.9987895 0.8897832 -0.9728171 0.9987895 0.8897832 -0.9987895 0.9987895 0.8897832 -0.9990455 0.9780539 0.9084153 -0.999247 0.9690013 0.9247041 -0.9994057 0.9666876 0.9386096 -0.9995308 0.9680197 0.9502734 -0.9996295 0.9711183 0.959928 -0.9997074 0.974882 0.9678389 -0.9997688 0.9786968 0.9742706 -0.9998174 0.9822464 0.9794681 -0.9998557 0.9853905 0.9836483 -0.999886 0.9880897 0.986998 -0.9999099 0.990358 0.9896744 -0.9999288 0.9922358 0.9918079 -0.9999437 0.9937734 0.9935057 -0.8990028 0.9990461 0.9085243 -0.899002 0.9990461 0.9085228 -0.8990011 0.9990461 0.908521 -0.899 0.9990461 0.9085187 -0.8989986 0.9990461 0.9085159 -0.8989969 0.9990461 0.9085124 -0.8989948 0.9990461 0.908508 -0.8989923 0.999046 0.9085026 -0.8989895 0.999046 0.908496 -0.8989863 0.9990459 0.9084881 -0.8989829 0.9990459 0.9084786 -0.8989796 0.9990458 0.9084676 -0.8989771 0.9990458 0.9084551 -0.8989767 0.9990457 0.9084417 -0.8989805 0.9990456 0.9084287 -0.8989921 0.9990456 0.9084185 -0.8990175 0.9990455 0.9084153 -0.8990542 0.9990455 0.9084153 -0.8991006 0.9990455 0.9084153 -0.8991593 0.9990455 0.9084153 -0.8992336 0.9990455 0.9084153 -0.8993275 0.9990455 0.9084153 -0.8994464 0.9990455 0.9084153 -0.8995968 0.9990455 0.9084153 -0.899787 0.9990455 0.9084153 -0.9000277 0.9990455 0.9084153 -0.9003323 0.9990455 0.9084153 -0.9007175 0.9990455 0.9084153 -0.9012049 0.9990455 0.9084153 -0.9018215 0.9990455 0.9084153 -0.9026016 0.9990455 0.9084153 -0.9035886 0.9990455 0.9084153 -0.9048372 0.9990455 0.9084153 -0.9064168 0.9990455 0.9084153 -0.9084153 0.9990455 0.9084153 -0.9109436 0.9990455 0.9084153 -0.9141422 0.9990455 0.9084153 -0.9181889 0.9990455 0.9084153 -0.9233085 0.9990455 0.9084153 -0.9297854 0.9990455 0.9084153 -0.9379796 0.9990455 0.9084153 -0.9483463 0.9990455 0.9084153 -0.9614615 0.9990455 0.9084153 -0.9780539 0.9990455 0.9084153 -0.9990455 0.9990455 0.9084153 -0.999247 0.982354 0.9247041 -0.9994057 0.9751513 0.9386096 -0.9995308 0.9733691 0.9502734 -0.9996295 0.9744915 0.959928 -0.9997074 0.977005 0.9678389 -0.9997688 0.980031 0.9742706 -0.9998174 0.9830838 0.9794681 -0.9998557 0.9859157 0.9836483 -0.999886 0.9884188 0.986998 -0.9999099 0.9905641 0.9896744 -0.9999288 0.9923648 0.9918079 -0.9999437 0.9938541 0.9935057 -0.9187175 0.9992474 0.9247756 -0.918717 0.9992474 0.9247746 -0.9187164 0.9992474 0.9247734 -0.9187157 0.9992474 0.924772 -0.9187148 0.9992474 0.9247701 -0.9187137 0.9992474 0.9247678 -0.9187123 0.9992473 0.9247649 -0.9187107 0.9992473 0.9247614 -0.9187089 0.9992473 0.9247571 -0.9187068 0.9992473 0.9247519 -0.9187045 0.9992472 0.9247456 -0.9187024 0.9992472 0.9247384 -0.9187008 0.9992472 0.9247302 -0.9187004 0.9992471 0.9247215 -0.9187027 0.9992471 0.924713 -0.9187101 0.999247 0.9247063 -0.9187262 0.999247 0.9247041 -0.9187495 0.999247 0.9247041 -0.9187791 0.999247 0.9247041 -0.9188164 0.999247 0.9247041 -0.9188636 0.999247 0.9247041 -0.9189234 0.999247 0.9247041 -0.918999 0.999247 0.9247041 -0.9190947 0.999247 0.9247041 -0.9192157 0.999247 0.9247041 -0.9193688 0.999247 0.9247041 -0.9195625 0.999247 0.9247041 -0.9198076 0.999247 0.9247041 -0.9201176 0.999247 0.9247041 -0.9205098 0.999247 0.9247041 -0.9210061 0.999247 0.9247041 -0.9216339 0.999247 0.9247041 -0.9224281 0.999247 0.9247041 -0.9234329 0.999247 0.9247041 -0.9247041 0.999247 0.9247041 -0.9263124 0.999247 0.9247041 -0.928347 0.999247 0.9247041 -0.9309211 0.999247 0.9247041 -0.9341777 0.999247 0.9247041 -0.9382977 0.999247 0.9247041 -0.94351 0.999247 0.9247041 -0.9501042 0.999247 0.9247041 -0.9584468 0.999247 0.9247041 -0.9690013 0.999247 0.9247041 -0.982354 0.999247 0.9247041 -0.999247 0.999247 0.9247041 -0.9994057 0.9858591 0.9386096 -0.9995308 0.9801368 0.9502734 -0.9996295 0.978759 0.959928 -0.9997074 0.9796909 0.9678389 -0.9997688 0.981719 0.9742706 -0.9998174 0.9841433 0.9794681 -0.9998557 0.9865801 0.9836483 -0.999886 0.9888351 0.986998 -0.9999099 0.9908248 0.9896744 -0.9999288 0.992528 0.9918079 -0.9999437 0.9939562 0.9935057 -0.9348153 0.999406 0.938656 -0.9348149 0.999406 0.9386553 -0.9348146 0.999406 0.9386546 -0.9348141 0.999406 0.9386536 -0.9348135 0.999406 0.9386524 -0.9348128 0.9994059 0.9386509 -0.9348119 0.9994059 0.938649 -0.9348109 0.9994059 0.9386467 -0.9348097 0.9994059 0.9386439 -0.9348083 0.9994059 0.9386406 -0.9348069 0.9994059 0.9386365 -0.9348055 0.9994059 0.9386318 -0.9348044 0.9994058 0.9386265 -0.9348042 0.9994058 0.9386208 -0.9348056 0.9994058 0.9386153 -0.9348102 0.9994057 0.938611 -0.9348204 0.9994057 0.9386096 -0.9348352 0.9994057 0.9386096 -0.9348539 0.9994057 0.9386096 -0.9348776 0.9994057 0.9386096 -0.9349075 0.9994057 0.9386096 -0.9349454 0.9994057 0.9386096 -0.9349933 0.9994057 0.9386096 -0.935054 0.9994057 0.9386096 -0.9351307 0.9994057 0.9386096 -0.9352277 0.9994057 0.9386096 -0.9353505 0.9994057 0.9386096 -0.9355059 0.9994057 0.9386096 -0.9357024 0.9994057 0.9386096 -0.935951 0.9994057 0.9386096 -0.9362655 0.9994057 0.9386096 -0.9366635 0.9994057 0.9386096 -0.9371669 0.9994057 0.9386096 -0.9378038 0.9994057 0.9386096 -0.9386096 0.9994057 0.9386096 -0.939629 0.9994057 0.9386096 -0.9409186 0.9994057 0.9386096 -0.9425502 0.9994057 0.9386096 -0.9446144 0.9994057 0.9386096 -0.9472259 0.9994057 0.9386096 -0.9505298 0.9994057 0.9386096 -0.9547096 0.9994057 0.9386096 -0.9599976 0.9994057 0.9386096 -0.9666876 0.9994057 0.9386096 -0.9751513 0.9994057 0.9386096 -0.9858591 0.9994057 0.9386096 -0.9994057 0.9994057 0.9386096 -0.9995308 0.9886988 0.9502734 -0.9996295 0.9841579 0.959928 -0.9997074 0.983089 0.9678389 -0.9997688 0.9838545 0.9742706 -0.9998174 0.9854838 0.9794681 -0.9998557 0.9874207 0.9836483 -0.999886 0.9893618 0.986998 -0.9999099 0.9911547 0.9896744 -0.9999288 0.9927345 0.9918079 -0.9999437 0.9940854 0.9935057 -0.9478754 0.999531 0.9503032 -0.9478752 0.999531 0.9503028 -0.947875 0.999531 0.9503023 -0.9478746 0.999531 0.9503017 -0.9478743 0.999531 0.950301 -0.9478738 0.999531 0.9503 -0.9478733 0.999531 0.9502988 -0.9478726 0.999531 0.9502973 -0.9478718 0.999531 0.9502955 -0.947871 0.9995309 0.9502933 -0.94787 0.9995309 0.9502907 -0.9478691 0.9995309 0.9502877 -0.9478684 0.9995309 0.9502843 -0.9478683 0.9995309 0.9502806 -0.9478691 0.9995309 0.9502771 -0.947872 0.9995309 0.9502743 -0.9478785 0.9995308 0.9502734 -0.9478878 0.9995308 0.9502734 -0.9478997 0.9995308 0.9502734 -0.9479146 0.9995308 0.9502734 -0.9479335 0.9995308 0.9502734 -0.9479575 0.9995308 0.9502734 -0.9479878 0.9995308 0.9502734 -0.9480261 0.9995308 0.9502734 -0.9480746 0.9995308 0.9502734 -0.9481359 0.9995308 0.9502734 -0.9482135 0.9995308 0.9502734 -0.9483117 0.9995308 0.9502734 -0.9484359 0.9995308 0.9502734 -0.9485931 0.9995308 0.9502734 -0.9487918 0.9995308 0.9502734 -0.9490434 0.9995308 0.9502734 -0.9493615 0.9995308 0.9502734 -0.9497641 0.9995308 0.9502734 -0.9502734 0.9995308 0.9502734 -0.9509177 0.9995308 0.9502734 -0.9517328 0.9995308 0.9502734 -0.952764 0.9995308 0.9502734 -0.9540687 0.9995308 0.9502734 -0.9557192 0.9995308 0.9502734 -0.9578074 0.9995308 0.9502734 -0.9604492 0.9995308 0.9502734 -0.9637914 0.9995308 0.9502734 -0.9680197 0.9995308 0.9502734 -0.9733691 0.9995308 0.9502734 -0.9801368 0.9995308 0.9502734 -0.9886988 0.9995308 0.9502734 -0.9995308 0.9995308 0.9502734 -0.9996295 0.9909882 0.959928 -0.9997074 0.9873879 0.9678389 -0.9997688 0.9865561 0.9742706 -0.9998174 0.9871796 0.9794681 -0.9998557 0.9884841 0.9836483 -0.999886 0.9900282 0.986998 -0.9999099 0.991572 0.9896744 -0.9999288 0.9929957 0.9918079 -0.9999437 0.9942488 0.9935057 -0.958416 0.9996296 0.9599471 -0.9584159 0.9996296 0.9599468 -0.9584157 0.9996296 0.9599465 -0.9584155 0.9996296 0.9599461 -0.9584153 0.9996296 0.9599456 -0.958415 0.9996296 0.959945 -0.9584146 0.9996296 0.9599442 -0.9584142 0.9996296 0.9599433 -0.9584137 0.9996296 0.9599421 -0.9584132 0.9996296 0.9599407 -0.9584126 0.9996296 0.9599391 -0.958412 0.9996296 0.9599371 -0.9584115 0.9996296 0.959935 -0.9584114 0.9996295 0.9599326 -0.958412 0.9996295 0.9599303 -0.9584138 0.9996295 0.9599286 -0.9584178 0.9996295 0.959928 -0.9584237 0.9996295 0.959928 -0.9584312 0.9996295 0.959928 -0.9584406 0.9996295 0.959928 -0.9584526 0.9996295 0.959928 -0.9584677 0.9996295 0.959928 -0.9584868 0.9996295 0.959928 -0.9585109 0.9996295 0.959928 -0.9585415 0.9996295 0.959928 -0.9585802 0.9996295 0.959928 -0.9586291 0.9996295 0.959928 -0.958691 0.9996295 0.959928 -0.9587693 0.9996295 0.959928 -0.9588684 0.9996295 0.959928 -0.9589938 0.9996295 0.959928 -0.9591524 0.9996295 0.959928 -0.959353 0.9996295 0.959928 -0.9596068 0.9996295 0.959928 -0.959928 0.9996295 0.959928 -0.9603343 0.9996295 0.959928 -0.9608482 0.9996295 0.959928 -0.9614985 0.9996295 0.959928 -0.9623212 0.9996295 0.959928 -0.963362 0.9996295 0.959928 -0.9646787 0.9996295 0.959928 -0.9663445 0.9996295 0.959928 -0.968452 0.9996295 0.959928 -0.9711183 0.9996295 0.959928 -0.9744915 0.9996295 0.959928 -0.978759 0.9996295 0.959928 -0.9841579 0.9996295 0.959928 -0.9909882 0.9996295 0.959928 -0.9996295 0.9996295 0.959928 -0.9997074 0.9928267 0.9678389 -0.9997688 0.9899741 0.9742706 -0.9998174 0.989325 0.9794681 -0.9998557 0.9898295 0.9836483 -0.999886 0.9908712 0.986998 -0.9999099 0.9920999 0.9896744 -0.9999288 0.9933261 0.9918079 -0.9999437 0.9944556 0.9935057 -0.9668873 0.9997074 0.9678511 -0.9668872 0.9997074 0.9678509 -0.9668871 0.9997074 0.9678507 -0.966887 0.9997074 0.9678505 -0.9668869 0.9997074 0.9678502 -0.9668867 0.9997074 0.9678498 -0.9668865 0.9997074 0.9678493 -0.9668862 0.9997074 0.9678487 -0.9668859 0.9997074 0.9678479 -0.9668855 0.9997074 0.967847 -0.9668852 0.9997074 0.967846 -0.9668848 0.9997074 0.9678448 -0.9668845 0.9997074 0.9678434 -0.9668844 0.9997074 0.9678419 -0.9668847 0.9997074 0.9678404 -0.9668859 0.9997074 0.9678393 -0.9668884 0.9997074 0.9678389 -0.9668922 0.9997074 0.9678389 -0.9668969 0.9997074 0.9678389 -0.9669028 0.9997074 0.9678389 -0.9669103 0.9997074 0.9678389 -0.9669198 0.9997074 0.9678389 -0.9669318 0.9997074 0.9678389 -0.966947 0.9997074 0.9678389 -0.9669663 0.9997074 0.9678389 -0.9669906 0.9997074 0.9678389 -0.9670214 0.9997074 0.9678389 -0.9670604 0.9997074 0.9678389 -0.9671097 0.9997074 0.9678389 -0.967172 0.9997074 0.9678389 -0.9672509 0.9997074 0.9678389 -0.9673508 0.9997074 0.9678389 -0.967477 0.9997074 0.9678389 -0.9676368 0.9997074 0.9678389 -0.9678389 0.9997074 0.9678389 -0.9680946 0.9997074 0.9678389 -0.9684181 0.9997074 0.9678389 -0.9688274 0.9997074 0.9678389 -0.9693452 0.9997074 0.9678389 -0.9700002 0.9997074 0.9678389 -0.970829 0.9997074 0.9678389 -0.9718774 0.9997074 0.9678389 -0.9732039 0.9997074 0.9678389 -0.974882 0.9997074 0.9678389 -0.977005 0.9997074 0.9678389 -0.9796909 0.9997074 0.9678389 -0.983089 0.9997074 0.9678389 -0.9873879 0.9997074 0.9678389 -0.9928267 0.9997074 0.9678389 -0.9997074 0.9997074 0.9678389 -0.9997688 0.9942982 0.9742706 -0.9998174 0.9920392 0.9794681 -0.9998557 0.9915316 0.9836483 -0.999886 0.9919377 0.986998 -0.9999099 0.9927678 0.9896744 -0.9999288 0.9937442 0.9918079 -0.9999437 0.9947172 0.9935057 -0.9736726 0.9997689 0.9742783 -0.9736726 0.9997689 0.9742782 -0.9736725 0.9997689 0.9742781 -0.9736724 0.9997689 0.974278 -0.9736723 0.9997689 0.9742778 -0.9736722 0.9997689 0.9742775 -0.9736721 0.9997689 0.9742772 -0.9736719 0.9997689 0.9742768 -0.9736717 0.9997689 0.9742763 -0.9736715 0.9997689 0.9742758 -0.9736712 0.9997689 0.9742751 -0.973671 0.9997689 0.9742743 -0.9736708 0.9997689 0.9742734 -0.9736708 0.9997689 0.9742725 -0.973671 0.9997688 0.9742716 -0.9736717 0.9997688 0.9742709 -0.9736733 0.9997688 0.9742706 -0.9736756 0.9997688 0.9742706 -0.9736786 0.9997688 0.9742706 -0.9736823 0.9997688 0.9742706 -0.973687 0.9997688 0.9742706 -0.973693 0.9997688 0.9742706 -0.9737006 0.9997688 0.9742706 -0.9737101 0.9997688 0.9742706 -0.9737222 0.9997688 0.9742706 -0.9737375 0.9997688 0.9742706 -0.9737569 0.9997688 0.9742706 -0.9737814 0.9997688 0.9742706 -0.9738123 0.9997688 0.9742706 -0.9738515 0.9997688 0.9742706 -0.9739011 0.9997688 0.9742706 -0.9739638 0.9997688 0.9742706 -0.9740432 0.9997688 0.9742706 -0.9741436 0.9997688 0.9742706 -0.9742706 0.9997688 0.9742706 -0.9744313 0.9997688 0.9742706 -0.9746346 0.9997688 0.9742706 -0.9748918 0.9997688 0.9742706 -0.9752172 0.9997688 0.9742706 -0.9756289 0.9997688 0.9742706 -0.9761497 0.9997688 0.9742706 -0.9768086 0.9997688 0.9742706 -0.9776422 0.9997688 0.9742706 -0.9786968 0.9997688 0.9742706 -0.980031 0.9997688 0.9742706 -0.981719 0.9997688 0.9742706 -0.9838545 0.9997688 0.9742706 -0.9865561 0.9997688 0.9742706 -0.9899741 0.9997688 0.9742706 -0.9942982 0.9997688 0.9742706 -0.9997688 0.9997688 0.9742706 -0.9998174 0.9954731 0.9794681 -0.9998557 0.9936849 0.9836483 -0.999886 0.993287 0.986998 -0.9999099 0.9936128 0.9896744 -0.9999288 0.9942731 0.9918079 -0.9999437 0.9950481 0.9935057 -0.9790927 0.9998174 0.979473 -0.9790927 0.9998174 0.9794729 -0.9790927 0.9998174 0.9794728 -0.9790926 0.9998174 0.9794727 -0.9790925 0.9998174 0.9794726 -0.9790925 0.9998174 0.9794724 -0.9790924 0.9998174 0.9794722 -0.9790923 0.9998174 0.979472 -0.9790921 0.9998174 0.9794717 -0.979092 0.9998174 0.9794713 -0.9790919 0.9998174 0.9794709 -0.9790917 0.9998174 0.9794704 -0.9790916 0.9998174 0.9794699 -0.9790916 0.9998174 0.9794693 -0.9790917 0.9998174 0.9794687 -0.9790921 0.9998174 0.9794682 -0.9790931 0.9998174 0.9794681 -0.9790946 0.9998174 0.9794681 -0.9790965 0.9998174 0.9794681 -0.9790988 0.9998174 0.9794681 -0.9791018 0.9998174 0.9794681 -0.9791055 0.9998174 0.9794681 -0.9791103 0.9998174 0.9794681 -0.9791163 0.9998174 0.9794681 -0.9791238 0.9998174 0.9794681 -0.9791334 0.9998174 0.9794681 -0.9791456 0.9998174 0.9794681 -0.979161 0.9998174 0.9794681 -0.9791804 0.9998174 0.9794681 -0.979205 0.9998174 0.9794681 -0.9792361 0.9998174 0.9794681 -0.9792755 0.9998174 0.9794681 -0.9793253 0.9998174 0.9794681 -0.9793883 0.9998174 0.9794681 -0.9794681 0.9998174 0.9794681 -0.9795689 0.9998174 0.9794681 -0.9796966 0.9998174 0.9794681 -0.979858 0.9998174 0.9794681 -0.9800622 0.9998174 0.9794681 -0.9803206 0.9998174 0.9794681 -0.9806476 0.9998174 0.9794681 -0.9810611 0.9998174 0.9794681 -0.9815844 0.9998174 0.9794681 -0.9822464 0.9998174 0.9794681 -0.9830838 0.9998174 0.9794681 -0.9841433 0.9998174 0.9794681 -0.9854838 0.9998174 0.9794681 -0.9871796 0.9998174 0.9794681 -0.989325 0.9998174 0.9794681 -0.9920392 0.9998174 0.9794681 -0.9954731 0.9998174 0.9794681 -0.9998174 0.9998174 0.9794681 -0.9998557 0.9964092 0.9836483 -0.999886 0.9949941 0.986998 -0.9999099 0.9946818 0.9896744 -0.9999288 0.9949422 0.9918079 -0.9999437 0.9954668 0.9935057 -0.9834129 0.9998557 0.9836514 -0.9834129 0.9998557 0.9836513 -0.9834129 0.9998557 0.9836513 -0.9834129 0.9998557 0.9836512 -0.9834128 0.9998557 0.9836511 -0.9834128 0.9998557 0.983651 -0.9834127 0.9998557 0.9836509 -0.9834127 0.9998557 0.9836508 -0.9834126 0.9998557 0.9836506 -0.9834125 0.9998557 0.9836504 -0.9834124 0.9998557 0.9836501 -0.9834123 0.9998557 0.9836498 -0.9834122 0.9998557 0.9836494 -0.9834122 0.9998557 0.9836491 -0.9834123 0.9998557 0.9836487 -0.9834126 0.9998557 0.9836484 -0.9834132 0.9998557 0.9836483 -0.9834141 0.9998557 0.9836483 -0.9834153 0.9998557 0.9836483 -0.9834167 0.9998557 0.9836483 -0.9834186 0.9998557 0.9836483 -0.9834209 0.9998557 0.9836483 -0.9834239 0.9998557 0.9836483 -0.9834277 0.9998557 0.9836483 -0.9834324 0.9998557 0.9836483 -0.9834385 0.9998557 0.9836483 -0.9834461 0.9998557 0.9836483 -0.9834557 0.9998557 0.9836483 -0.9834679 0.9998557 0.9836483 -0.9834833 0.9998557 0.9836483 -0.9835029 0.9998557 0.9836483 -0.9835276 0.9998557 0.9836483 -0.9835588 0.9998557 0.9836483 -0.9835983 0.9998557 0.9836483 -0.9836483 0.9998557 0.9836483 -0.9837116 0.9998557 0.9836483 -0.9837916 0.9998557 0.9836483 -0.9838928 0.9998557 0.9836483 -0.9840209 0.9998557 0.9836483 -0.9841829 0.9998557 0.9836483 -0.984388 0.9998557 0.9836483 -0.9846473 0.9998557 0.9836483 -0.9849754 0.9998557 0.9836483 -0.9853905 0.9998557 0.9836483 -0.9859157 0.9998557 0.9836483 -0.9865801 0.9998557 0.9836483 -0.9874207 0.9998557 0.9836483 -0.9884841 0.9998557 0.9836483 -0.9898295 0.9998557 0.9836483 -0.9915316 0.9998557 0.9836483 -0.9936849 0.9998557 0.9836483 -0.9964092 0.9998557 0.9836483 -0.9998557 0.9998557 0.9836483 -0.999886 0.9971537 0.986998 -0.9999099 0.9960342 0.9896744 -0.9999288 0.9957887 0.9918079 -0.9999437 0.9959964 0.9935057 -0.9868505 0.999886 0.9869999 -0.9868505 0.999886 0.9869999 -0.9868505 0.999886 0.9869999 -0.9868505 0.999886 0.9869998 -0.9868504 0.999886 0.9869998 -0.9868504 0.999886 0.9869997 -0.9868504 0.999886 0.9869996 -0.9868503 0.999886 0.9869995 -0.9868503 0.999886 0.9869994 -0.9868502 0.999886 0.9869993 -0.9868502 0.999886 0.9869991 -0.9868501 0.999886 0.9869989 -0.9868501 0.999886 0.9869987 -0.98685 0.999886 0.9869985 -0.9868501 0.999886 0.9869982 -0.9868503 0.999886 0.986998 -0.9868507 0.999886 0.986998 -0.9868512 0.999886 0.986998 -0.986852 0.999886 0.986998 -0.9868529 0.999886 0.986998 -0.9868541 0.999886 0.986998 -0.9868555 0.999886 0.986998 -0.9868574 0.999886 0.986998 -0.9868597 0.999886 0.986998 -0.9868627 0.999886 0.986998 -0.9868665 0.999886 0.986998 -0.9868713 0.999886 0.986998 -0.9868773 0.999886 0.986998 -0.986885 0.999886 0.986998 -0.9868946 0.999886 0.986998 -0.9869069 0.999886 0.986998 -0.9869223 0.999886 0.986998 -0.9869419 0.999886 0.986998 -0.9869667 0.999886 0.986998 -0.986998 0.999886 0.986998 -0.9870376 0.999886 0.986998 -0.9870878 0.999886 0.986998 -0.9871512 0.999886 0.986998 -0.9872315 0.999886 0.986998 -0.987333 0.999886 0.986998 -0.9874615 0.999886 0.986998 -0.987624 0.999886 0.986998 -0.9878296 0.999886 0.986998 -0.9880897 0.999886 0.986998 -0.9884188 0.999886 0.986998 -0.9888351 0.999886 0.986998 -0.9893618 0.999886 0.986998 -0.9900282 0.999886 0.986998 -0.9908712 0.999886 0.986998 -0.9919377 0.999886 0.986998 -0.993287 0.999886 0.986998 -0.9949941 0.999886 0.986998 -0.9971537 0.999886 0.986998 -0.999886 0.999886 0.986998 -0.9999099 0.9977452 0.9896744 -0.9999288 0.9968597 0.9918079 -0.9999437 0.9966665 0.9935057 -0.989582 0.9999099 0.9896756 -0.989582 0.9999099 0.9896756 -0.989582 0.9999099 0.9896755 -0.989582 0.9999099 0.9896755 -0.989582 0.9999099 0.9896755 -0.9895819 0.9999099 0.9896755 -0.9895819 0.9999099 0.9896754 -0.9895819 0.9999099 0.9896753 -0.9895819 0.9999099 0.9896753 -0.9895818 0.9999099 0.9896752 -0.9895818 0.9999099 0.9896751 -0.9895818 0.9999099 0.9896749 -0.9895817 0.9999099 0.9896748 -0.9895817 0.9999099 0.9896747 -0.9895817 0.9999099 0.9896745 -0.9895819 0.9999099 0.9896744 -0.9895821 0.9999099 0.9896744 -0.9895825 0.9999099 0.9896744 -0.9895829 0.9999099 0.9896744 -0.9895835 0.9999099 0.9896744 -0.9895842 0.9999099 0.9896744 -0.9895851 0.9999099 0.9896744 -0.9895863 0.9999099 0.9896744 -0.9895878 0.9999099 0.9896744 -0.9895897 0.9999099 0.9896744 -0.989592 0.9999099 0.9896744 -0.989595 0.9999099 0.9896744 -0.9895988 0.9999099 0.9896744 -0.9896036 0.9999099 0.9896744 -0.9896096 0.9999099 0.9896744 -0.9896173 0.9999099 0.9896744 -0.989627 0.9999099 0.9896744 -0.9896392 0.9999099 0.9896744 -0.9896547 0.9999099 0.9896744 -0.9896744 0.9999099 0.9896744 -0.9896992 0.9999099 0.9896744 -0.9897306 0.9999099 0.9896744 -0.9897703 0.9999099 0.9896744 -0.9898206 0.9999099 0.9896744 -0.9898842 0.9999099 0.9896744 -0.9899646 0.9999099 0.9896744 -0.9900664 0.9999099 0.9896744 -0.9901951 0.9999099 0.9896744 -0.990358 0.9999099 0.9896744 -0.9905641 0.9999099 0.9896744 -0.9908248 0.9999099 0.9896744 -0.9911547 0.9999099 0.9896744 -0.991572 0.9999099 0.9896744 -0.9920999 0.9999099 0.9896744 -0.9927678 0.9999099 0.9896744 -0.9936128 0.9999099 0.9896744 -0.9946818 0.9999099 0.9896744 -0.9960342 0.9999099 0.9896744 -0.9977452 0.9999099 0.9896744 -0.9999099 0.9999099 0.9896744 -0.9999288 0.9982146 0.9918079 -0.9999437 0.9975143 0.9935057 -0.9917501 0.9999288 0.9918087 -0.9917501 0.9999288 0.9918087 -0.9917501 0.9999288 0.9918086 -0.9917501 0.9999288 0.9918086 -0.9917501 0.9999288 0.9918086 -0.9917501 0.9999288 0.9918086 -0.99175 0.9999288 0.9918086 -0.99175 0.9999288 0.9918085 -0.99175 0.9999288 0.9918085 -0.99175 0.9999288 0.9918084 -0.99175 0.9999288 0.9918083 -0.9917499 0.9999288 0.9918083 -0.9917499 0.9999288 0.9918082 -0.9917499 0.9999288 0.9918081 -0.9917499 0.9999288 0.991808 -0.99175 0.9999288 0.9918079 -0.9917502 0.9999288 0.9918079 -0.9917504 0.9999288 0.9918079 -0.9917507 0.9999288 0.9918079 -0.991751 0.9999288 0.9918079 -0.9917515 0.9999288 0.9918079 -0.9917521 0.9999288 0.9918079 -0.9917528 0.9999288 0.9918079 -0.9917537 0.9999288 0.9918079 -0.9917549 0.9999288 0.9918079 -0.9917564 0.9999288 0.9918079 -0.9917582 0.9999288 0.9918079 -0.9917606 0.9999288 0.9918079 -0.9917636 0.9999288 0.9918079 -0.9917674 0.9999288 0.9918079 -0.9917722 0.9999288 0.9918079 -0.9917782 0.9999288 0.9918079 -0.9917859 0.9999288 0.9918079 -0.9917956 0.9999288 0.9918079 -0.9918079 0.9999288 0.9918079 -0.9918234 0.9999288 0.9918079 -0.9918431 0.9999288 0.9918079 -0.991868 0.9999288 0.9918079 -0.9918994 0.9999288 0.9918079 -0.9919392 0.9999288 0.9918079 -0.9919896 0.9999288 0.9918079 -0.9920533 0.9999288 0.9918079 -0.9921339 0.9999288 0.9918079 -0.9922358 0.9999288 0.9918079 -0.9923648 0.9999288 0.9918079 -0.992528 0.9999288 0.9918079 -0.9927345 0.9999288 0.9918079 -0.9929957 0.9999288 0.9918079 -0.9933261 0.9999288 0.9918079 -0.9937442 0.9999288 0.9918079 -0.9942731 0.9999288 0.9918079 -0.9949422 0.9999288 0.9918079 -0.9957887 0.9999288 0.9918079 -0.9968597 0.9999288 0.9918079 -0.9982146 0.9999288 0.9918079 -0.9999288 0.9999288 0.9918079 -0.9999437 0.9985868 0.9935057 -0.9934695 0.9999437 0.9935061 -0.9934695 0.9999437 0.9935061 -0.9934695 0.9999437 0.9935061 -0.9934695 0.9999437 0.9935061 -0.9934695 0.9999437 0.9935061 -0.9934695 0.9999437 0.9935061 -0.9934695 0.9999437 0.9935061 -0.9934694 0.9999437 0.993506 -0.9934694 0.9999437 0.993506 -0.9934694 0.9999437 0.993506 -0.9934694 0.9999437 0.9935059 -0.9934694 0.9999437 0.9935059 -0.9934694 0.9999437 0.9935058 -0.9934694 0.9999437 0.9935058 -0.9934694 0.9999437 0.9935057 -0.9934694 0.9999437 0.9935057 -0.9934695 0.9999437 0.9935057 -0.9934697 0.9999437 0.9935057 -0.9934698 0.9999437 0.9935057 -0.9934701 0.9999437 0.9935057 -0.9934704 0.9999437 0.9935057 -0.9934707 0.9999437 0.9935057 -0.9934712 0.9999437 0.9935057 -0.9934718 0.9999437 0.9935057 -0.9934725 0.9999437 0.9935057 -0.9934734 0.9999437 0.9935057 -0.9934746 0.9999437 0.9935057 -0.9934761 0.9999437 0.9935057 -0.9934779 0.9999437 0.9935057 -0.9934803 0.9999437 0.9935057 -0.9934833 0.9999437 0.9935057 -0.9934871 0.9999437 0.9935057 -0.9934919 0.9999437 0.9935057 -0.993498 0.9999437 0.9935057 -0.9935057 0.9999437 0.9935057 -0.9935154 0.9999437 0.9935057 -0.9935277 0.9999437 0.9935057 -0.9935432 0.9999437 0.9935057 -0.9935629 0.9999437 0.9935057 -0.9935878 0.9999437 0.9935057 -0.9936193 0.9999437 0.9935057 -0.9936592 0.9999437 0.9935057 -0.9937096 0.9999437 0.9935057 -0.9937734 0.9999437 0.9935057 -0.9938541 0.9999437 0.9935057 -0.9939562 0.9999437 0.9935057 -0.9940854 0.9999437 0.9935057 -0.9942488 0.9999437 0.9935057 -0.9944556 0.9999437 0.9935057 -0.9947172 0.9999437 0.9935057 -0.9950481 0.9999437 0.9935057 -0.9954668 0.9999437 0.9935057 -0.9959964 0.9999437 0.9935057 -0.9966665 0.9999437 0.9935057 -0.9975143 0.9999437 0.9935057 -0.9985868 0.9999437 0.9935057 -0.9999437 0.9999437 0.9935057 -0.4834235 0.4834235 0.9915469 -0.4834593 0.4834235 0.9915469 -0.4835047 0.4834235 0.9915469 -0.4835622 0.4834235 0.9915469 -0.4836348 0.4834235 0.9915469 -0.4837267 0.4834235 0.9915469 -0.483843 0.4834235 0.9915469 -0.4839901 0.4834235 0.9915469 -0.4841762 0.4834235 0.9915469 -0.4844116 0.4834235 0.9915469 -0.4847095 0.4834235 0.9915469 -0.4850864 0.4834235 0.9915469 -0.4855631 0.4834235 0.9915469 -0.4861663 0.4834235 0.9915469 -0.4869294 0.4834235 0.9915469 -0.4878948 0.4834235 0.9915469 -0.4891161 0.4834235 0.9915469 -0.4906613 0.4834235 0.9915469 -0.4926161 0.4834235 0.9915469 -0.4950892 0.4834235 0.9915469 -0.4982181 0.4834235 0.9915469 -0.5021764 0.4834235 0.9915469 -0.5071843 0.4834235 0.9915469 -0.5135199 0.4834235 0.9915469 -0.5215352 0.4834235 0.9915469 -0.5316756 0.4834235 0.9915469 -0.5445046 0.4834235 0.9915469 -0.560735 0.4834235 0.9915469 -0.5812684 0.4834235 0.9915469 -0.6072459 0.4834235 0.9915469 -0.6401109 0.4834235 0.9915469 -0.6816893 0.4834235 0.9915469 -0.7342914 0.4834235 0.9915469 -0.8008399 0.4834235 0.9915469 -0.8850325 0.4834235 0.9915469 -0.9915469 0.4834235 0.9915469 -0.993424 0.5504963 0.9005812 -0.9948662 0.6139459 0.8519149 -0.9959813 0.6724572 0.8322078 -0.9968475 0.7251659 0.8312009 -0.997523 0.7716588 0.8413362 -0.9980513 0.8119154 0.8573024 -0.9984653 0.8462171 0.8755606 -0.9987905 0.8750477 0.8938989 -0.9990461 0.8990028 0.9110495 -0.9992474 0.9187175 0.9263823 -0.999406 0.9348153 0.9396746 -0.999531 0.9478754 0.9509472 -0.9996296 0.958416 0.9603532 -0.9997074 0.9668873 0.9681067 -0.9997689 0.9736726 0.974439 -0.9998174 0.9790927 0.9795738 -0.9998557 0.9834129 0.9837146 -0.999886 0.9868505 0.9870396 -0.9999099 0.989582 0.9897004 -0.9999288 0.9917501 0.9918242 -0.9999437 0.9934695 0.9935159 -0.4834235 0.4834593 0.9915469 -0.4834045 0.4834045 0.9915463 -0.4834499 0.4834045 0.9915463 -0.4835073 0.4834045 0.9915463 -0.48358 0.4834045 0.9915463 -0.4836719 0.4834045 0.9915463 -0.4837882 0.4834045 0.9915463 -0.4839353 0.4834045 0.9915463 -0.4841214 0.4834045 0.9915463 -0.4843569 0.4834045 0.9915463 -0.4846548 0.4834045 0.9915463 -0.4850317 0.4834045 0.9915463 -0.4855085 0.4834045 0.9915463 -0.4861117 0.4834045 0.9915463 -0.4868749 0.4834045 0.9915463 -0.4878404 0.4834045 0.9915463 -0.4890619 0.4834045 0.9915463 -0.4906072 0.4834045 0.9915463 -0.4925623 0.4834045 0.9915463 -0.4950356 0.4834045 0.9915463 -0.4981648 0.4834045 0.9915463 -0.5021236 0.4834045 0.9915463 -0.507132 0.4834045 0.9915463 -0.5134682 0.4834045 0.9915463 -0.5214844 0.4834045 0.9915463 -0.531626 0.4834045 0.9915463 -0.5444563 0.4834045 0.9915463 -0.5606884 0.4834045 0.9915463 -0.581224 0.4834045 0.9915463 -0.6072043 0.4834045 0.9915463 -0.6400728 0.4834045 0.9915463 -0.6816556 0.4834045 0.9915463 -0.7342633 0.4834045 0.9915463 -0.800819 0.4834045 0.9915463 -0.8850205 0.4834045 0.9915463 -0.9915463 0.4834045 0.9915463 -0.9934236 0.5504818 0.9005727 -0.994866 0.6139352 0.8519044 -0.9959811 0.6724495 0.8321981 -0.9968474 0.7251605 0.831193 -0.997523 0.7716551 0.8413301 -0.9980512 0.8119128 0.857298 -0.9984653 0.8462154 0.8755576 -0.9987905 0.8750466 0.8938969 -0.9990461 0.899002 0.9110481 -0.9992474 0.918717 0.9263814 -0.999406 0.9348149 0.939674 -0.999531 0.9478752 0.9509468 -0.9996296 0.9584159 0.9603529 -0.9997074 0.9668872 0.9681065 -0.9997689 0.9736726 0.9744389 -0.9998174 0.9790927 0.9795737 -0.9998557 0.9834129 0.9837146 -0.999886 0.9868505 0.9870395 -0.9999099 0.989582 0.9897004 -0.9999288 0.9917501 0.9918242 -0.9999437 0.9934695 0.9935159 -0.4834235 0.4835047 0.9915469 -0.4834045 0.4834499 0.9915463 -0.4833811 0.4833811 0.9915455 -0.4834385 0.4833811 0.9915455 -0.4835112 0.4833811 0.9915455 -0.4836031 0.4833811 0.9915455 -0.4837194 0.4833811 0.9915455 -0.4838665 0.4833811 0.9915455 -0.4840527 0.4833811 0.9915455 -0.4842882 0.4833811 0.9915455 -0.4845861 0.4833811 0.9915455 -0.4849631 0.4833811 0.9915455 -0.4854399 0.4833811 0.9915455 -0.4860432 0.4833811 0.9915455 -0.4868065 0.4833811 0.9915455 -0.4877721 0.4833811 0.9915455 -0.4889938 0.4833811 0.9915455 -0.4905393 0.4833811 0.9915455 -0.4924946 0.4833811 0.9915455 -0.4949683 0.4833811 0.9915455 -0.4980979 0.4833811 0.9915455 -0.5020572 0.4833811 0.9915455 -0.5070663 0.4833811 0.9915455 -0.5134034 0.4833811 0.9915455 -0.5214207 0.4833811 0.9915455 -0.5315636 0.4833811 0.9915455 -0.5443956 0.4833811 0.9915455 -0.5606299 0.4833811 0.9915455 -0.5811683 0.4833811 0.9915455 -0.607152 0.4833811 0.9915455 -0.6400249 0.4833811 0.9915455 -0.6816133 0.4833811 0.9915455 -0.7342281 0.4833811 0.9915455 -0.8007926 0.4833811 0.9915455 -0.8850054 0.4833811 0.9915455 -0.9915455 0.4833811 0.9915455 -0.9934231 0.550464 0.900562 -0.9948657 0.6139219 0.8518913 -0.9959809 0.6724399 0.8321859 -0.9968473 0.7251537 0.831183 -0.9975229 0.7716504 0.8413226 -0.9980512 0.8119096 0.8572925 -0.9984653 0.8462132 0.8755537 -0.9987904 0.8750451 0.8938942 -0.9990461 0.8990011 0.9110464 -0.9992474 0.9187164 0.9263802 -0.999406 0.9348146 0.9396732 -0.999531 0.947875 0.9509463 -0.9996296 0.9584157 0.9603526 -0.9997074 0.9668871 0.9681063 -0.9997689 0.9736725 0.9744388 -0.9998174 0.9790927 0.9795737 -0.9998557 0.9834129 0.9837145 -0.999886 0.9868505 0.9870395 -0.9999099 0.989582 0.9897004 -0.9999288 0.9917501 0.9918242 -0.9999437 0.9934695 0.9935158 -0.4834235 0.4835622 0.9915469 -0.4834045 0.4835073 0.9915463 -0.4833811 0.4834385 0.9915455 -0.4833522 0.4833522 0.9915446 -0.4834249 0.4833522 0.9915446 -0.4835168 0.4833522 0.9915446 -0.4836332 0.4833522 0.9915446 -0.4837803 0.4833522 0.9915446 -0.4839665 0.4833522 0.9915446 -0.484202 0.4833522 0.9915446 -0.4845 0.4833522 0.9915446 -0.484877 0.4833522 0.9915446 -0.485354 0.4833522 0.9915446 -0.4859574 0.4833522 0.9915446 -0.4867208 0.4833522 0.9915446 -0.4876866 0.4833522 0.9915446 -0.4889084 0.4833522 0.9915446 -0.4904542 0.4833522 0.9915446 -0.4924099 0.4833522 0.9915446 -0.494884 0.4833522 0.9915446 -0.4980141 0.4833522 0.9915446 -0.5019741 0.4833522 0.9915446 -0.506984 0.4833522 0.9915446 -0.5133222 0.4833522 0.9915446 -0.5213408 0.4833522 0.9915446 -0.5314854 0.4833522 0.9915446 -0.5443196 0.4833522 0.9915446 -0.5605565 0.4833522 0.9915446 -0.5810984 0.4833522 0.9915446 -0.6070865 0.4833522 0.9915446 -0.6399649 0.4833522 0.9915446 -0.6815603 0.4833522 0.9915446 -0.7341839 0.4833522 0.9915446 -0.8007596 0.4833522 0.9915446 -0.8849865 0.4833522 0.9915446 -0.9915446 0.4833522 0.9915446 -0.9934225 0.5504419 0.9005487 -0.9948653 0.6139056 0.8518748 -0.9959807 0.672428 0.8321707 -0.9968472 0.7251454 0.8311705 -0.9975228 0.7716446 0.8413131 -0.9980511 0.8119057 0.8572857 -0.9984653 0.8462106 0.8755489 -0.9987904 0.8750434 0.8938909 -0.9990461 0.899 0.9110442 -0.9992474 0.9187157 0.9263788 -0.999406 0.9348141 0.9396723 -0.999531 0.9478746 0.9509457 -0.9996296 0.9584155 0.9603522 -0.9997074 0.966887 0.9681061 -0.9997689 0.9736724 0.9744386 -0.9998174 0.9790926 0.9795736 -0.9998557 0.9834129 0.9837145 -0.999886 0.9868505 0.9870395 -0.9999099 0.989582 0.9897003 -0.9999288 0.9917501 0.9918242 -0.9999437 0.9934695 0.9935158 -0.4834235 0.4836348 0.9915469 -0.4834045 0.48358 0.9915463 -0.4833811 0.4835112 0.9915455 -0.4833522 0.4834249 0.9915446 -0.4833171 0.4833171 0.9915433 -0.483409 0.4833171 0.9915433 -0.4835254 0.4833171 0.9915433 -0.4836726 0.4833171 0.9915433 -0.4838588 0.4833171 0.9915433 -0.4840944 0.4833171 0.9915433 -0.4843924 0.4833171 0.9915433 -0.4847695 0.4833171 0.9915433 -0.4852466 0.4833171 0.9915433 -0.4858501 0.4833171 0.9915433 -0.4866137 0.4833171 0.9915433 -0.4875796 0.4833171 0.9915433 -0.4888018 0.4833171 0.9915433 -0.4903479 0.4833171 0.9915433 -0.4923039 0.4833171 0.9915433 -0.4947786 0.4833171 0.9915433 -0.4979093 0.4833171 0.9915433 -0.5018701 0.4833171 0.9915433 -0.5068811 0.4833171 0.9915433 -0.5132206 0.4833171 0.9915433 -0.5212409 0.4833171 0.9915433 -0.5313876 0.4833171 0.9915433 -0.5442245 0.4833171 0.9915433 -0.5604649 0.4833171 0.9915433 -0.5810111 0.4833171 0.9915433 -0.6070046 0.4833171 0.9915433 -0.6398899 0.4833171 0.9915433 -0.681494 0.4833171 0.9915433 -0.7341287 0.4833171 0.9915433 -0.8007184 0.4833171 0.9915433 -0.884963 0.4833171 0.9915433 -0.9915433 0.4833171 0.9915433 -0.9934218 0.550415 0.9005319 -0.9948649 0.6138855 0.8518543 -0.9959804 0.6724135 0.8321516 -0.996847 0.7251351 0.831155 -0.9975227 0.7716375 0.8413012 -0.9980511 0.8119009 0.8572771 -0.9984652 0.8462073 0.8755429 -0.9987904 0.8750412 0.8938868 -0.9990461 0.8989986 0.9110414 -0.9992474 0.9187148 0.9263769 -0.999406 0.9348135 0.9396711 -0.999531 0.9478743 0.9509449 -0.9996296 0.9584153 0.9603517 -0.9997074 0.9668869 0.9681058 -0.9997689 0.9736723 0.9744384 -0.9998174 0.9790925 0.9795734 -0.9998557 0.9834128 0.9837144 -0.999886 0.9868504 0.9870394 -0.9999099 0.989582 0.9897003 -0.9999288 0.9917501 0.9918241 -0.9999437 0.9934695 0.9935158 -0.4834235 0.4837267 0.9915469 -0.4834045 0.4836719 0.9915463 -0.4833811 0.4836031 0.9915455 -0.4833522 0.4835168 0.9915446 -0.4833171 0.483409 0.9915433 -0.4832747 0.4832747 0.9915418 -0.4833911 0.4832747 0.9915418 -0.4835383 0.4832747 0.9915418 -0.4837246 0.4832747 0.9915418 -0.4839603 0.4832747 0.9915418 -0.4842584 0.4832747 0.9915418 -0.4846356 0.4832747 0.9915418 -0.4851127 0.4832747 0.9915418 -0.4857164 0.4832747 0.9915418 -0.4864802 0.4832747 0.9915418 -0.4874464 0.4832747 0.9915418 -0.4886689 0.4832747 0.9915418 -0.4902154 0.4832747 0.9915418 -0.4921719 0.4832747 0.9915418 -0.4946472 0.4832747 0.9915418 -0.4977788 0.4832747 0.9915418 -0.5017407 0.4832747 0.9915418 -0.5067529 0.4832747 0.9915418 -0.5130941 0.4832747 0.9915418 -0.5211165 0.4832747 0.9915418 -0.5312658 0.4832747 0.9915418 -0.5441061 0.4832747 0.9915418 -0.5603507 0.4832747 0.9915418 -0.5809023 0.4832747 0.9915418 -0.6069026 0.4832747 0.9915418 -0.6397965 0.4832747 0.9915418 -0.6814115 0.4832747 0.9915418 -0.7340599 0.4832747 0.9915418 -0.800667 0.4832747 0.9915418 -0.8849336 0.4832747 0.9915418 -0.9915418 0.4832747 0.9915418 -0.9934209 0.5503825 0.9005111 -0.9948643 0.6138613 0.8518286 -0.9959801 0.6723959 0.8321279 -0.9968468 0.7251226 0.8311356 -0.9975226 0.7716288 0.8412865 -0.998051 0.8118949 0.8572664 -0.9984652 0.8462034 0.8755354 -0.9987904 0.8750386 0.8938817 -0.9990461 0.8989969 0.911038 -0.9992474 0.9187137 0.9263747 -0.9994059 0.9348128 0.9396696 -0.999531 0.9478738 0.9509439 -0.9996296 0.958415 0.9603511 -0.9997074 0.9668867 0.9681054 -0.9997689 0.9736722 0.9744382 -0.9998174 0.9790925 0.9795733 -0.9998557 0.9834128 0.9837143 -0.999886 0.9868504 0.9870393 -0.9999099 0.9895819 0.9897003 -0.9999288 0.9917501 0.9918241 -0.9999437 0.9934695 0.9935158 -0.4834235 0.483843 0.9915469 -0.4834045 0.4837882 0.9915463 -0.4833811 0.4837194 0.9915455 -0.4833522 0.4836332 0.9915446 -0.4833171 0.4835254 0.9915433 -0.4832747 0.4833911 0.9915418 -0.4832246 0.4832246 0.9915399 -0.4833719 0.4832246 0.9915399 -0.4835582 0.4832246 0.9915399 -0.4837939 0.4832246 0.9915399 -0.4840922 0.4832246 0.9915399 -0.4844695 0.4832246 0.9915399 -0.4849468 0.4832246 0.9915399 -0.4855507 0.4832246 0.9915399 -0.4863147 0.4832246 0.9915399 -0.4872812 0.4832246 0.9915399 -0.4885041 0.4832246 0.9915399 -0.4900511 0.4832246 0.9915399 -0.4920083 0.4832246 0.9915399 -0.4944844 0.4832246 0.9915399 -0.497617 0.4832246 0.9915399 -0.5015801 0.4832246 0.9915399 -0.506594 0.4832246 0.9915399 -0.5129372 0.4832246 0.9915399 -0.5209622 0.4832246 0.9915399 -0.5311148 0.4832246 0.9915399 -0.5439593 0.4832246 0.9915399 -0.5602091 0.4832246 0.9915399 -0.5807673 0.4832246 0.9915399 -0.6067761 0.4832246 0.9915399 -0.6396806 0.4832246 0.9915399 -0.6813091 0.4832246 0.9915399 -0.7339746 0.4832246 0.9915399 -0.8006032 0.4832246 0.9915399 -0.8848971 0.4832246 0.9915399 -0.9915399 0.4832246 0.9915399 -0.9934197 0.5503438 0.9004852 -0.9948636 0.6138323 0.8517969 -0.9959797 0.6723748 0.8320985 -0.9968465 0.7251076 0.8311115 -0.9975224 0.7716184 0.8412682 -0.9980509 0.8118878 0.8572531 -0.9984651 0.8461986 0.8755261 -0.9987903 0.8750355 0.8938754 -0.9990461 0.8989948 0.9110337 -0.9992473 0.9187123 0.9263719 -0.9994059 0.9348119 0.9396678 -0.999531 0.9478733 0.9509428 -0.9996296 0.9584146 0.9603504 -0.9997074 0.9668865 0.9681049 -0.9997689 0.9736721 0.9744378 -0.9998174 0.9790924 0.9795731 -0.9998557 0.9834127 0.9837142 -0.999886 0.9868504 0.9870393 -0.9999099 0.9895819 0.9897002 -0.9999288 0.99175 0.9918241 -0.9999437 0.9934695 0.9935158 -0.4834235 0.4839901 0.9915469 -0.4834045 0.4839353 0.9915463 -0.4833811 0.4838665 0.9915455 -0.4833522 0.4837803 0.9915446 -0.4833171 0.4836726 0.9915433 -0.4832747 0.4835383 0.9915418 -0.4832246 0.4833719 0.9915399 -0.4831666 0.4831666 0.9915376 -0.483353 0.4831666 0.9915376 -0.4835889 0.4831666 0.9915376 -0.4838872 0.4831666 0.9915376 -0.4842647 0.4831666 0.9915376 -0.4847422 0.4831666 0.9915376 -0.4853463 0.4831666 0.9915376 -0.4861106 0.4831666 0.9915376 -0.4870776 0.4831666 0.9915376 -0.4883009 0.4831666 0.9915376 -0.4898485 0.4831666 0.9915376 -0.4918065 0.4831666 0.9915376 -0.4942836 0.4831666 0.9915376 -0.4974174 0.4831666 0.9915376 -0.5013822 0.4831666 0.9915376 -0.506398 0.4831666 0.9915376 -0.5127438 0.4831666 0.9915376 -0.520772 0.4831666 0.9915376 -0.5309287 0.4831666 0.9915376 -0.5437782 0.4831666 0.9915376 -0.5600346 0.4831666 0.9915376 -0.580601 0.4831666 0.9915376 -0.6066202 0.4831666 0.9915376 -0.6395378 0.4831666 0.9915376 -0.6811829 0.4831666 0.9915376 -0.7338694 0.4831666 0.9915376 -0.8005247 0.4831666 0.9915376 -0.8848522 0.4831666 0.9915376 -0.9915376 0.4831666 0.9915376 -0.9934183 0.5502987 0.9004534 -0.9948628 0.6137984 0.8517577 -0.9959791 0.67235 0.8320622 -0.9968462 0.7250899 0.8310819 -0.9975222 0.7716061 0.8412457 -0.9980508 0.8118794 0.8572368 -0.998465 0.8461929 0.8755147 -0.9987903 0.8750317 0.8938676 -0.999046 0.8989923 0.9110285 -0.9992473 0.9187107 0.9263684 -0.9994059 0.9348109 0.9396655 -0.999531 0.9478726 0.9509413 -0.9996296 0.9584142 0.9603494 -0.9997074 0.9668862 0.9681043 -0.9997689 0.9736719 0.9744375 -0.9998174 0.9790923 0.9795728 -0.9998557 0.9834127 0.983714 -0.999886 0.9868503 0.9870392 -0.9999099 0.9895819 0.9897002 -0.9999288 0.99175 0.9918241 -0.9999437 0.9934694 0.9935158 -0.4834235 0.4841762 0.9915469 -0.4834045 0.4841214 0.9915463 -0.4833811 0.4840527 0.9915455 -0.4833522 0.4839665 0.9915446 -0.4833171 0.4838588 0.9915433 -0.4832747 0.4837246 0.9915418 -0.4832246 0.4835582 0.9915399 -0.4831666 0.483353 0.9915376 -0.4831021 0.4831021 0.9915347 -0.4833381 0.4831021 0.9915347 -0.4836366 0.4831021 0.9915347 -0.4840142 0.4831021 0.9915347 -0.484492 0.4831021 0.9915347 -0.4850964 0.4831021 0.9915347 -0.4858611 0.4831021 0.9915347 -0.4868285 0.4831021 0.9915347 -0.4880524 0.4831021 0.9915347 -0.4896008 0.4831021 0.9915347 -0.4915597 0.4831021 0.9915347 -0.494038 0.4831021 0.9915347 -0.4971734 0.4831021 0.9915347 -0.50114 0.4831021 0.9915347 -0.5061584 0.4831021 0.9915347 -0.5125072 0.4831021 0.9915347 -0.5205393 0.4831021 0.9915347 -0.530701 0.4831021 0.9915347 -0.5435568 0.4831021 0.9915347 -0.5598211 0.4831021 0.9915347 -0.5803976 0.4831021 0.9915347 -0.6064294 0.4831021 0.9915347 -0.6393632 0.4831021 0.9915347 -0.6810286 0.4831021 0.9915347 -0.7337408 0.4831021 0.9915347 -0.8004286 0.4831021 0.9915347 -0.8847973 0.4831021 0.9915347 -0.9915347 0.4831021 0.9915347 -0.9934166 0.550248 0.9004144 -0.9948617 0.6137599 0.8517098 -0.9959785 0.6723217 0.8320179 -0.9968458 0.7250697 0.8310457 -0.997522 0.7715919 0.8412181 -0.9980506 0.8118697 0.8572168 -0.9984649 0.8461864 0.8755007 -0.9987902 0.8750274 0.893858 -0.999046 0.8989895 0.9110221 -0.9992473 0.9187089 0.9263642 -0.9994059 0.9348097 0.9396628 -0.999531 0.9478718 0.9509395 -0.9996296 0.9584137 0.9603483 -0.9997074 0.9668859 0.9681036 -0.9997689 0.9736717 0.974437 -0.9998174 0.9790921 0.9795725 -0.9998557 0.9834126 0.9837138 -0.999886 0.9868503 0.9870391 -0.9999099 0.9895819 0.9897001 -0.9999288 0.99175 0.991824 -0.9999437 0.9934694 0.9935157 -0.4834235 0.4844116 0.9915469 -0.4834045 0.4843569 0.9915463 -0.4833811 0.4842882 0.9915455 -0.4833522 0.484202 0.9915446 -0.4833171 0.4840944 0.9915433 -0.4832747 0.4839603 0.9915418 -0.4832246 0.4837939 0.9915399 -0.4831666 0.4835889 0.9915376 -0.4831021 0.4833381 0.9915347 -0.4830346 0.4830346 0.9915312 -0.4833333 0.4830346 0.9915312 -0.4837112 0.4830346 0.9915312 -0.4841892 0.4830346 0.9915312 -0.484794 0.4830346 0.9915312 -0.4855591 0.4830346 0.9915312 -0.4865271 0.4830346 0.9915312 -0.4877517 0.4830346 0.9915312 -0.489301 0.4830346 0.9915312 -0.4912611 0.4830346 0.9915312 -0.4937409 0.4830346 0.9915312 -0.4968781 0.4830346 0.9915312 -0.5008471 0.4830346 0.9915312 -0.5058684 0.4830346 0.9915312 -0.512221 0.4830346 0.9915312 -0.5202578 0.4830346 0.9915312 -0.5304255 0.4830346 0.9915312 -0.5432889 0.4830346 0.9915312 -0.5595628 0.4830346 0.9915312 -0.5801514 0.4830346 0.9915312 -0.6061987 0.4830346 0.9915312 -0.6391518 0.4830346 0.9915312 -0.6808418 0.4830346 0.9915312 -0.7335852 0.4830346 0.9915312 -0.8003123 0.4830346 0.9915312 -0.8847308 0.4830346 0.9915312 -0.9915312 0.4830346 0.9915312 -0.9934145 0.5501939 0.9003673 -0.9948604 0.6137183 0.8516519 -0.9959777 0.6722907 0.8319643 -0.9968453 0.7250473 0.8310018 -0.9975217 0.7715762 0.8411848 -0.9980504 0.8118589 0.8571927 -0.9984648 0.8461791 0.8754838 -0.9987902 0.8750225 0.8938464 -0.9990459 0.8989863 0.9110144 -0.9992473 0.9187068 0.9263591 -0.9994059 0.9348083 0.9396594 -0.9995309 0.947871 0.9509374 -0.9996296 0.9584132 0.9603469 -0.9997074 0.9668855 0.9681027 -0.9997689 0.9736715 0.9744364 -0.9998174 0.979092 0.9795722 -0.9998557 0.9834125 0.9837136 -0.999886 0.9868502 0.9870389 -0.9999099 0.9895818 0.9897 -0.9999288 0.99175 0.9918239 -0.9999437 0.9934694 0.9935157 -0.4834235 0.4847095 0.9915469 -0.4834045 0.4846548 0.9915463 -0.4833811 0.4845861 0.9915455 -0.4833522 0.4845 0.9915446 -0.4833171 0.4843924 0.9915433 -0.4832747 0.4842584 0.9915418 -0.4832246 0.4840922 0.9915399 -0.4831666 0.4838872 0.9915376 -0.4831021 0.4836366 0.9915347 -0.4830346 0.4833333 0.9915312 -0.4829718 0.4829718 0.9915271 -0.48335 0.4829718 0.9915271 -0.4838283 0.4829718 0.9915271 -0.4844335 0.4829718 0.9915271 -0.4851992 0.4829718 0.9915271 -0.4861679 0.4829718 0.9915271 -0.4873934 0.4829718 0.9915271 -0.4889438 0.4829718 0.9915271 -0.4909052 0.4829718 0.9915271 -0.4933867 0.4829718 0.9915271 -0.4965262 0.4829718 0.9915271 -0.5004979 0.4829718 0.9915271 -0.5055228 0.4829718 0.9915271 -0.5118798 0.4829718 0.9915271 -0.5199223 0.4829718 0.9915271 -0.5300971 0.4829718 0.9915271 -0.5429696 0.4829718 0.9915271 -0.5592549 0.4829718 0.9915271 -0.579858 0.4829718 0.9915271 -0.6059236 0.4829718 0.9915271 -0.6388999 0.4829718 0.9915271 -0.6806192 0.4829718 0.9915271 -0.7333996 0.4829718 0.9915271 -0.8001737 0.4829718 0.9915271 -0.8846516 0.4829718 0.9915271 -0.9915271 0.4829718 0.9915271 -0.993412 0.5501416 0.9003112 -0.9948589 0.6136769 0.8515828 -0.9959768 0.6722594 0.8319004 -0.9968448 0.7250244 0.8309496 -0.9975213 0.7715599 0.8411451 -0.9980502 0.8118476 0.8571639 -0.9984647 0.8461714 0.8754636 -0.9987901 0.8750173 0.8938327 -0.9990459 0.8989829 0.9110051 -0.9992472 0.9187045 0.926353 -0.9994059 0.9348069 0.9396555 -0.9995309 0.94787 0.9509348 -0.9996296 0.9584126 0.9603452 -0.9997074 0.9668852 0.9681016 -0.9997689 0.9736712 0.9744358 -0.9998174 0.9790919 0.9795718 -0.9998557 0.9834124 0.9837133 -0.999886 0.9868502 0.9870387 -0.9999099 0.9895818 0.9896999 -0.9999288 0.99175 0.9918239 -0.9999437 0.9934694 0.9935157 -0.4834235 0.4850864 0.9915469 -0.4834045 0.4850317 0.9915463 -0.4833811 0.4849631 0.9915455 -0.4833522 0.484877 0.9915446 -0.4833171 0.4847695 0.9915433 -0.4832747 0.4846356 0.9915418 -0.4832246 0.4844695 0.9915399 -0.4831666 0.4842647 0.9915376 -0.4831021 0.4840142 0.9915347 -0.4830346 0.4837112 0.9915312 -0.4829718 0.48335 0.9915271 -0.4829286 0.4829286 0.9915223 -0.4834073 0.4829286 0.9915223 -0.484013 0.4829286 0.9915223 -0.4847793 0.4829286 0.9915223 -0.4857488 0.4829286 0.9915223 -0.4869753 0.4829286 0.9915223 -0.488527 0.4829286 0.9915223 -0.49049 0.4829286 0.9915223 -0.4929736 0.4829286 0.9915223 -0.4961156 0.4829286 0.9915223 -0.5000906 0.4829286 0.9915223 -0.5051196 0.4829286 0.9915223 -0.5114818 0.4829286 0.9915223 -0.5195309 0.4829286 0.9915223 -0.5297141 0.4829286 0.9915223 -0.5425971 0.4829286 0.9915223 -0.5588958 0.4829286 0.9915223 -0.5795157 0.4829286 0.9915223 -0.6056027 0.4829286 0.9915223 -0.638606 0.4829286 0.9915223 -0.6803596 0.4829286 0.9915223 -0.7331832 0.4829286 0.9915223 -0.800012 0.4829286 0.9915223 -0.8845592 0.4829286 0.9915223 -0.9915223 0.4829286 0.9915223 -0.9934091 0.5501012 0.9002457 -0.9948571 0.6136427 0.8515024 -0.9959757 0.6722322 0.8318259 -0.9968441 0.7250039 0.8308888 -0.9975209 0.7715449 0.8410988 -0.99805 0.811837 0.8571304 -0.9984645 0.8461641 0.8754401 -0.99879 0.8750124 0.8938167 -0.9990458 0.8989796 0.9109944 -0.9992472 0.9187024 0.9263459 -0.9994059 0.9348055 0.9396508 -0.9995309 0.9478691 0.9509318 -0.9996296 0.958412 0.9603433 -0.9997074 0.9668848 0.9681004 -0.9997689 0.973671 0.974435 -0.9998174 0.9790917 0.9795713 -0.9998557 0.9834123 0.983713 -0.999886 0.9868501 0.9870386 -0.9999099 0.9895818 0.9896998 -0.9999288 0.9917499 0.9918238 -0.9999437 0.9934694 0.9935156 -0.4834235 0.4855631 0.9915469 -0.4834045 0.4855085 0.9915463 -0.4833811 0.4854399 0.9915455 -0.4833522 0.485354 0.9915446 -0.4833171 0.4852466 0.9915433 -0.4832747 0.4851127 0.9915418 -0.4832246 0.4849468 0.9915399 -0.4831666 0.4847422 0.9915376 -0.4831021 0.484492 0.9915347 -0.4830346 0.4841892 0.9915312 -0.4829718 0.4838283 0.9915271 -0.4829286 0.4834073 0.9915223 -0.4829319 0.4829319 0.9915169 -0.4835382 0.4829319 0.9915169 -0.4843052 0.4829319 0.9915169 -0.4852755 0.4829319 0.9915169 -0.4865032 0.4829319 0.9915169 -0.4880563 0.4829319 0.9915169 -0.4900212 0.4829319 0.9915169 -0.492507 0.4829319 0.9915169 -0.4956519 0.4829319 0.9915169 -0.4996306 0.4829319 0.9915169 -0.5046642 0.4829319 0.9915169 -0.5110324 0.4829319 0.9915169 -0.5190889 0.4829319 0.9915169 -0.5292815 0.4829319 0.9915169 -0.5421764 0.4829319 0.9915169 -0.5584902 0.4829319 0.9915169 -0.5791292 0.4829319 0.9915169 -0.6052403 0.4829319 0.9915169 -0.6382742 0.4829319 0.9915169 -0.6800663 0.4829319 0.9915169 -0.7329388 0.4829319 0.9915169 -0.7998295 0.4829319 0.9915169 -0.8844548 0.4829319 0.9915169 -0.9915169 0.4829319 0.9915169 -0.9934058 0.5500915 0.9001717 -0.9948551 0.6136284 0.8514115 -0.9959745 0.672218 0.8317419 -0.9968433 0.7249916 0.8308201 -0.9975204 0.7715352 0.8410466 -0.9980497 0.8118298 0.8570925 -0.9984643 0.8461589 0.8754136 -0.9987899 0.8750088 0.8937986 -0.9990458 0.8989771 0.9109823 -0.9992472 0.9187008 0.9263379 -0.9994058 0.9348044 0.9396456 -0.9995309 0.9478684 0.9509284 -0.9996296 0.9584115 0.9603412 -0.9997074 0.9668845 0.968099 -0.9997689 0.9736708 0.9744341 -0.9998174 0.9790916 0.9795707 -0.9998557 0.9834122 0.9837127 -0.999886 0.9868501 0.9870383 -0.9999099 0.9895817 0.9896996 -0.9999288 0.9917499 0.9918237 -0.9999437 0.9934694 0.9935156 -0.4834235 0.4861663 0.9915469 -0.4834045 0.4861117 0.9915463 -0.4833811 0.4860432 0.9915455 -0.4833522 0.4859574 0.9915446 -0.4833171 0.4858501 0.9915433 -0.4832747 0.4857164 0.9915418 -0.4832246 0.4855507 0.9915399 -0.4831666 0.4853463 0.9915376 -0.4831021 0.4850964 0.9915347 -0.4830346 0.484794 0.9915312 -0.4829718 0.4844335 0.9915271 -0.4829286 0.484013 0.9915223 -0.4829319 0.4835382 0.9915169 -0.4830292 0.4830292 0.991511 -0.4837969 0.4830292 0.991511 -0.4847683 0.4830292 0.991511 -0.4859971 0.4830292 0.991511 -0.4875517 0.4830292 0.991511 -0.4895186 0.4830292 0.991511 -0.4920069 0.4830292 0.991511 -0.4951549 0.4830292 0.991511 -0.4991376 0.4830292 0.991511 -0.5041761 0.4830292 0.991511 -0.5105506 0.4830292 0.991511 -0.5186151 0.4830292 0.991511 -0.5288178 0.4830292 0.991511 -0.5417255 0.4830292 0.991511 -0.5580554 0.4830292 0.991511 -0.5787149 0.4830292 0.991511 -0.6048518 0.4830292 0.991511 -0.6379184 0.4830292 0.991511 -0.679752 0.4830292 0.991511 -0.7326769 0.4830292 0.991511 -0.7996338 0.4830292 0.991511 -0.8843429 0.4830292 0.991511 -0.991511 0.4830292 0.991511 -0.9934023 0.5501456 0.9000925 -0.994853 0.6136569 0.8513142 -0.9959732 0.672232 0.8316518 -0.9968425 0.7249978 0.8307465 -0.9975199 0.7715376 0.8409907 -0.9980494 0.8118303 0.857052 -0.9984642 0.8461587 0.8753853 -0.9987897 0.8750084 0.8937792 -0.9990457 0.8989767 0.9109693 -0.9992471 0.9187004 0.9263294 -0.9994058 0.9348042 0.93964 -0.9995309 0.9478683 0.9509248 -0.9996295 0.9584114 0.9603388 -0.9997074 0.9668844 0.9680976 -0.9997689 0.9736708 0.9744332 -0.9998174 0.9790916 0.9795701 -0.9998557 0.9834122 0.9837123 -0.999886 0.98685 0.9870381 -0.9999099 0.9895817 0.9896995 -0.9999288 0.9917499 0.9918236 -0.9999437 0.9934694 0.9935155 -0.4834235 0.4869294 0.9915469 -0.4834045 0.4868749 0.9915463 -0.4833811 0.4868065 0.9915455 -0.4833522 0.4867208 0.9915446 -0.4833171 0.4866137 0.9915433 -0.4832747 0.4864802 0.9915418 -0.4832246 0.4863147 0.9915399 -0.4831666 0.4861106 0.9915376 -0.4831021 0.4858611 0.9915347 -0.4830346 0.4855591 0.9915312 -0.4829718 0.4851992 0.9915271 -0.4829286 0.4847793 0.9915223 -0.4829319 0.4843052 0.9915169 -0.4830292 0.4837969 0.991511 -0.4833013 0.4833013 0.9915054 -0.4842735 0.4833013 0.9915054 -0.4855036 0.4833013 0.9915054 -0.4870597 0.4833013 0.9915054 -0.4890285 0.4833013 0.9915054 -0.4915192 0.4833013 0.9915054 -0.4946702 0.4833013 0.9915054 -0.4986567 0.4833013 0.9915054 -0.5037002 0.4833013 0.9915054 -0.5100808 0.4833013 0.9915054 -0.5181531 0.4833013 0.9915054 -0.5283656 0.4833013 0.9915054 -0.5412858 0.4833013 0.9915054 -0.5576314 0.4833013 0.9915054 -0.5783109 0.4833013 0.9915054 -0.604473 0.4833013 0.9915054 -0.6375715 0.4833013 0.9915054 -0.6794455 0.4833013 0.9915054 -0.7324214 0.4833013 0.9915054 -0.7994429 0.4833013 0.9915054 -0.8842338 0.4833013 0.9915054 -0.9915054 0.4833013 0.9915054 -0.9933988 0.5503203 0.9000152 -0.9948509 0.6137675 0.8512193 -0.9959719 0.6723012 0.8315641 -0.9968418 0.7250408 0.8306748 -0.9975194 0.7715641 0.8409363 -0.9980491 0.8118466 0.8570126 -0.998464 0.8461687 0.8753576 -0.9987896 0.8750145 0.8937603 -0.9990456 0.8989805 0.9109567 -0.9992471 0.9187027 0.926321 -0.9994058 0.9348056 0.9396346 -0.9995309 0.9478691 0.9509213 -0.9996295 0.958412 0.9603366 -0.9997074 0.9668847 0.9680961 -0.9997688 0.973671 0.9744323 -0.9998174 0.9790917 0.9795695 -0.9998557 0.9834123 0.9837119 -0.999886 0.9868501 0.9870379 -0.9999099 0.9895817 0.9896993 -0.9999288 0.9917499 0.9918235 -0.9999437 0.9934694 0.9935154 -0.4834235 0.4878948 0.9915469 -0.4834045 0.4878404 0.9915463 -0.4833811 0.4877721 0.9915455 -0.4833522 0.4876866 0.9915446 -0.4833171 0.4875796 0.9915433 -0.4832747 0.4874464 0.9915418 -0.4832246 0.4872812 0.9915399 -0.4831666 0.4870776 0.9915376 -0.4831021 0.4868285 0.9915347 -0.4830346 0.4865271 0.9915312 -0.4829718 0.4861679 0.9915271 -0.4829286 0.4857488 0.9915223 -0.4829319 0.4852755 0.9915169 -0.4830292 0.4847683 0.991511 -0.4833013 0.4842735 0.9915054 -0.4838841 0.4838841 0.9915009 -0.4851151 0.4838841 0.9915009 -0.4866724 0.4838841 0.9915009 -0.4886426 0.4838841 0.9915009 -0.4911352 0.4838841 0.9915009 -0.4942887 0.4838841 0.9915009 -0.4982782 0.4838841 0.9915009 -0.5033255 0.4838841 0.9915009 -0.5097109 0.4838841 0.9915009 -0.5177893 0.4838841 0.9915009 -0.5280096 0.4838841 0.9915009 -0.5409396 0.4838841 0.9915009 -0.5572977 0.4838841 0.9915009 -0.5779928 0.4838841 0.9915009 -0.6041748 0.4838841 0.9915009 -0.6372984 0.4838841 0.9915009 -0.6792041 0.4838841 0.9915009 -0.7322203 0.4838841 0.9915009 -0.7992927 0.4838841 0.9915009 -0.8841479 0.4838841 0.9915009 -0.9915009 0.4838841 0.9915009 -0.9933961 0.5507113 0.8999544 -0.9948493 0.6140266 0.8511446 -0.9959709 0.6724711 0.831495 -0.9968411 0.7251511 0.8306185 -0.9975191 0.7716352 0.8408934 -0.9980488 0.8118921 0.8569815 -0.9984638 0.8461977 0.8753359 -0.9987895 0.8750329 0.8937455 -0.9990456 0.8989921 0.9109467 -0.999247 0.9187101 0.9263145 -0.9994057 0.9348102 0.9396303 -0.9995309 0.947872 0.9509185 -0.9996295 0.9584138 0.9603348 -0.9997074 0.9668859 0.968095 -0.9997688 0.9736717 0.9744315 -0.9998174 0.9790921 0.9795691 -0.9998557 0.9834126 0.9837117 -0.999886 0.9868503 0.9870377 -0.9999099 0.9895819 0.9896992 -0.9999288 0.99175 0.9918235 -0.9999437 0.9934694 0.9935154 -0.4834235 0.4891161 0.9915469 -0.4834045 0.4890619 0.9915463 -0.4833811 0.4889938 0.9915455 -0.4833522 0.4889084 0.9915446 -0.4833171 0.4888018 0.9915433 -0.4832747 0.4886689 0.9915418 -0.4832246 0.4885041 0.9915399 -0.4831666 0.4883009 0.9915376 -0.4831021 0.4880524 0.9915347 -0.4830346 0.4877517 0.9915312 -0.4829718 0.4873934 0.9915271 -0.4829286 0.4869753 0.9915223 -0.4829319 0.4865032 0.9915169 -0.4830292 0.4859971 0.991511 -0.4833013 0.4855036 0.9915054 -0.4838841 0.4851151 0.9915009 -0.4849907 0.4849907 0.9914995 -0.4865484 0.4849907 0.9914995 -0.4885191 0.4849907 0.9914995 -0.4910123 0.4849907 0.9914995 -0.4941665 0.4849907 0.9914995 -0.498157 0.4849907 0.9914995 -0.5032055 0.4849907 0.9914995 -0.5095925 0.4849907 0.9914995 -0.5176729 0.4849907 0.9914995 -0.5278957 0.4849907 0.9914995 -0.5408288 0.4849907 0.9914995 -0.5571908 0.4849907 0.9914995 -0.577891 0.4849907 0.9914995 -0.6040793 0.4849907 0.9914995 -0.637211 0.4849907 0.9914995 -0.6791269 0.4849907 0.9914995 -0.7321559 0.4849907 0.9914995 -0.7992446 0.4849907 0.9914995 -0.8841204 0.4849907 0.9914995 -0.9914995 0.4849907 0.9914995 -0.9933953 0.5514695 0.8999349 -0.9948487 0.6145393 0.8511207 -0.9959706 0.6728136 0.8314729 -0.9968409 0.7253775 0.8306004 -0.9975189 0.7717834 0.8408797 -0.9980488 0.8119884 0.8569716 -0.9984638 0.8462598 0.875329 -0.9987895 0.8750727 0.8937407 -0.9990455 0.8990175 0.9109436 -0.999247 0.9187262 0.9263124 -0.9994057 0.9348204 0.939629 -0.9995308 0.9478785 0.9509177 -0.9996295 0.9584178 0.9603343 -0.9997074 0.9668884 0.9680946 -0.9997688 0.9736733 0.9744313 -0.9998174 0.9790931 0.9795689 -0.9998557 0.9834132 0.9837116 -0.999886 0.9868507 0.9870376 -0.9999099 0.9895821 0.9896992 -0.9999288 0.9917502 0.9918234 -0.9999437 0.9934695 0.9935154 -0.4834235 0.4906613 0.9915469 -0.4834045 0.4906072 0.9915463 -0.4833811 0.4905393 0.9915455 -0.4833522 0.4904542 0.9915446 -0.4833171 0.4903479 0.9915433 -0.4832747 0.4902154 0.9915418 -0.4832246 0.4900511 0.9915399 -0.4831666 0.4898485 0.9915376 -0.4831021 0.4896008 0.9915347 -0.4830346 0.489301 0.9915312 -0.4829718 0.4889438 0.9915271 -0.4829286 0.488527 0.9915223 -0.4829319 0.4880563 0.9915169 -0.4830292 0.4875517 0.991511 -0.4833013 0.4870597 0.9915054 -0.4838841 0.4866724 0.9915009 -0.4849907 0.4865484 0.9914995 -0.4865484 0.4865484 0.9914995 -0.4885191 0.4865484 0.9914995 -0.4910123 0.4865484 0.9914995 -0.4941665 0.4865484 0.9914995 -0.498157 0.4865484 0.9914995 -0.5032055 0.4865484 0.9914995 -0.5095925 0.4865484 0.9914995 -0.5176729 0.4865484 0.9914995 -0.5278957 0.4865484 0.9914995 -0.5408288 0.4865484 0.9914995 -0.5571908 0.4865484 0.9914995 -0.577891 0.4865484 0.9914995 -0.6040793 0.4865484 0.9914995 -0.637211 0.4865484 0.9914995 -0.6791269 0.4865484 0.9914995 -0.7321559 0.4865484 0.9914995 -0.7992446 0.4865484 0.9914995 -0.8841204 0.4865484 0.9914995 -0.9914995 0.4865484 0.9914995 -0.9933953 0.5525411 0.8999349 -0.9948487 0.6152669 0.8511207 -0.9959706 0.6733015 0.8314729 -0.9968409 0.7257011 0.8306004 -0.9975189 0.7719959 0.8408797 -0.9980488 0.8121268 0.8569716 -0.9984638 0.8463492 0.875329 -0.9987895 0.8751301 0.8937407 -0.9990455 0.8990542 0.9109436 -0.999247 0.9187495 0.9263124 -0.9994057 0.9348352 0.939629 -0.9995308 0.9478878 0.9509177 -0.9996295 0.9584237 0.9603343 -0.9997074 0.9668922 0.9680946 -0.9997688 0.9736756 0.9744313 -0.9998174 0.9790946 0.9795689 -0.9998557 0.9834141 0.9837116 -0.999886 0.9868512 0.9870376 -0.9999099 0.9895825 0.9896992 -0.9999288 0.9917504 0.9918234 -0.9999437 0.9934697 0.9935154 -0.4834235 0.4926161 0.9915469 -0.4834045 0.4925623 0.9915463 -0.4833811 0.4924946 0.9915455 -0.4833522 0.4924099 0.9915446 -0.4833171 0.4923039 0.9915433 -0.4832747 0.4921719 0.9915418 -0.4832246 0.4920083 0.9915399 -0.4831666 0.4918065 0.9915376 -0.4831021 0.4915597 0.9915347 -0.4830346 0.4912611 0.9915312 -0.4829718 0.4909052 0.9915271 -0.4829286 0.49049 0.9915223 -0.4829319 0.4900212 0.9915169 -0.4830292 0.4895186 0.991511 -0.4833013 0.4890285 0.9915054 -0.4838841 0.4886426 0.9915009 -0.4849907 0.4885191 0.9914995 -0.4865484 0.4885191 0.9914995 -0.4885191 0.4885191 0.9914995 -0.4910123 0.4885191 0.9914995 -0.4941665 0.4885191 0.9914995 -0.498157 0.4885191 0.9914995 -0.5032055 0.4885191 0.9914995 -0.5095925 0.4885191 0.9914995 -0.5176729 0.4885191 0.9914995 -0.5278957 0.4885191 0.9914995 -0.5408288 0.4885191 0.9914995 -0.5571908 0.4885191 0.9914995 -0.577891 0.4885191 0.9914995 -0.6040793 0.4885191 0.9914995 -0.637211 0.4885191 0.9914995 -0.6791269 0.4885191 0.9914995 -0.7321559 0.4885191 0.9914995 -0.7992446 0.4885191 0.9914995 -0.8841204 0.4885191 0.9914995 -0.9914995 0.4885191 0.9914995 -0.9933953 0.5538969 0.8999349 -0.9948487 0.6161874 0.8511207 -0.9959706 0.6739188 0.8314729 -0.9968409 0.7261105 0.8306004 -0.9975189 0.7722648 0.8408797 -0.9980488 0.8123018 0.8569716 -0.9984638 0.8464623 0.875329 -0.9987895 0.8752028 0.8937407 -0.9990455 0.8991006 0.9109436 -0.999247 0.9187791 0.9263124 -0.9994057 0.9348539 0.939629 -0.9995308 0.9478997 0.9509177 -0.9996295 0.9584312 0.9603343 -0.9997074 0.9668969 0.9680946 -0.9997688 0.9736786 0.9744313 -0.9998174 0.9790965 0.9795689 -0.9998557 0.9834153 0.9837116 -0.999886 0.986852 0.9870376 -0.9999099 0.9895829 0.9896992 -0.9999288 0.9917507 0.9918234 -0.9999437 0.9934698 0.9935154 -0.4834235 0.4950892 0.9915469 -0.4834045 0.4950356 0.9915463 -0.4833811 0.4949683 0.9915455 -0.4833522 0.494884 0.9915446 -0.4833171 0.4947786 0.9915433 -0.4832747 0.4946472 0.9915418 -0.4832246 0.4944844 0.9915399 -0.4831666 0.4942836 0.9915376 -0.4831021 0.494038 0.9915347 -0.4830346 0.4937409 0.9915312 -0.4829718 0.4933867 0.9915271 -0.4829286 0.4929736 0.9915223 -0.4829319 0.492507 0.9915169 -0.4830292 0.4920069 0.991511 -0.4833013 0.4915192 0.9915054 -0.4838841 0.4911352 0.9915009 -0.4849907 0.4910123 0.9914995 -0.4865484 0.4910123 0.9914995 -0.4885191 0.4910123 0.9914995 -0.4910123 0.4910123 0.9914995 -0.4941665 0.4910123 0.9914995 -0.498157 0.4910123 0.9914995 -0.5032055 0.4910123 0.9914995 -0.5095925 0.4910123 0.9914995 -0.5176729 0.4910123 0.9914995 -0.5278957 0.4910123 0.9914995 -0.5408288 0.4910123 0.9914995 -0.5571908 0.4910123 0.9914995 -0.577891 0.4910123 0.9914995 -0.6040793 0.4910123 0.9914995 -0.637211 0.4910123 0.9914995 -0.6791269 0.4910123 0.9914995 -0.7321559 0.4910123 0.9914995 -0.7992446 0.4910123 0.9914995 -0.8841204 0.4910123 0.9914995 -0.9914995 0.4910123 0.9914995 -0.9933953 0.5556122 0.8999349 -0.9948487 0.6173519 0.8511207 -0.9959706 0.6746998 0.8314729 -0.9968409 0.7266285 0.8306004 -0.9975189 0.7726049 0.8408797 -0.9980488 0.8125232 0.8569716 -0.9984638 0.8466054 0.875329 -0.9987895 0.8752947 0.8937407 -0.9990455 0.8991593 0.9109436 -0.999247 0.9188164 0.9263124 -0.9994057 0.9348776 0.939629 -0.9995308 0.9479146 0.9509177 -0.9996295 0.9584406 0.9603343 -0.9997074 0.9669028 0.9680946 -0.9997688 0.9736823 0.9744313 -0.9998174 0.9790988 0.9795689 -0.9998557 0.9834167 0.9837116 -0.999886 0.9868529 0.9870376 -0.9999099 0.9895835 0.9896992 -0.9999288 0.991751 0.9918234 -0.9999437 0.9934701 0.9935154 -0.4834235 0.4982181 0.9915469 -0.4834045 0.4981648 0.9915463 -0.4833811 0.4980979 0.9915455 -0.4833522 0.4980141 0.9915446 -0.4833171 0.4979093 0.9915433 -0.4832747 0.4977788 0.9915418 -0.4832246 0.497617 0.9915399 -0.4831666 0.4974174 0.9915376 -0.4831021 0.4971734 0.9915347 -0.4830346 0.4968781 0.9915312 -0.4829718 0.4965262 0.9915271 -0.4829286 0.4961156 0.9915223 -0.4829319 0.4956519 0.9915169 -0.4830292 0.4951549 0.991511 -0.4833013 0.4946702 0.9915054 -0.4838841 0.4942887 0.9915009 -0.4849907 0.4941665 0.9914995 -0.4865484 0.4941665 0.9914995 -0.4885191 0.4941665 0.9914995 -0.4910123 0.4941665 0.9914995 -0.4941665 0.4941665 0.9914995 -0.498157 0.4941665 0.9914995 -0.5032055 0.4941665 0.9914995 -0.5095925 0.4941665 0.9914995 -0.5176729 0.4941665 0.9914995 -0.5278957 0.4941665 0.9914995 -0.5408288 0.4941665 0.9914995 -0.5571908 0.4941665 0.9914995 -0.577891 0.4941665 0.9914995 -0.6040793 0.4941665 0.9914995 -0.637211 0.4941665 0.9914995 -0.6791269 0.4941665 0.9914995 -0.7321559 0.4941665 0.9914995 -0.7992446 0.4941665 0.9914995 -0.8841204 0.4941665 0.9914995 -0.9914995 0.4941665 0.9914995 -0.9933953 0.5577822 0.8999349 -0.9948487 0.6188252 0.8511207 -0.9959706 0.6756878 0.8314729 -0.9968409 0.7272837 0.8306004 -0.9975189 0.7730352 0.8408797 -0.9980488 0.8128033 0.8569716 -0.9984638 0.8467864 0.875329 -0.9987895 0.8754109 0.8937407 -0.9990455 0.8992336 0.9109436 -0.999247 0.9188636 0.9263124 -0.9994057 0.9349075 0.939629 -0.9995308 0.9479335 0.9509177 -0.9996295 0.9584526 0.9603343 -0.9997074 0.9669103 0.9680946 -0.9997688 0.973687 0.9744313 -0.9998174 0.9791018 0.9795689 -0.9998557 0.9834186 0.9837116 -0.999886 0.9868541 0.9870376 -0.9999099 0.9895842 0.9896992 -0.9999288 0.9917515 0.9918234 -0.9999437 0.9934704 0.9935154 -0.4834235 0.5021764 0.9915469 -0.4834045 0.5021236 0.9915463 -0.4833811 0.5020572 0.9915455 -0.4833522 0.5019741 0.9915446 -0.4833171 0.5018701 0.9915433 -0.4832747 0.5017407 0.9915418 -0.4832246 0.5015801 0.9915399 -0.4831666 0.5013822 0.9915376 -0.4831021 0.50114 0.9915347 -0.4830346 0.5008471 0.9915312 -0.4829718 0.5004979 0.9915271 -0.4829286 0.5000906 0.9915223 -0.4829319 0.4996306 0.9915169 -0.4830292 0.4991376 0.991511 -0.4833013 0.4986567 0.9915054 -0.4838841 0.4982782 0.9915009 -0.4849907 0.498157 0.9914995 -0.4865484 0.498157 0.9914995 -0.4885191 0.498157 0.9914995 -0.4910123 0.498157 0.9914995 -0.4941665 0.498157 0.9914995 -0.498157 0.498157 0.9914995 -0.5032055 0.498157 0.9914995 -0.5095925 0.498157 0.9914995 -0.5176729 0.498157 0.9914995 -0.5278957 0.498157 0.9914995 -0.5408288 0.498157 0.9914995 -0.5571908 0.498157 0.9914995 -0.577891 0.498157 0.9914995 -0.6040793 0.498157 0.9914995 -0.637211 0.498157 0.9914995 -0.6791269 0.498157 0.9914995 -0.7321559 0.498157 0.9914995 -0.7992446 0.498157 0.9914995 -0.8841204 0.498157 0.9914995 -0.9914995 0.498157 0.9914995 -0.9933953 0.5605276 0.8999349 -0.9948487 0.6206891 0.8511207 -0.9959706 0.6769378 0.8314729 -0.9968409 0.7281127 0.8306004 -0.9975189 0.7735795 0.8408797 -0.9980488 0.8131577 0.8569716 -0.9984638 0.8470154 0.875329 -0.9987895 0.875558 0.8937407 -0.9990455 0.8993275 0.9109436 -0.999247 0.9189234 0.9263124 -0.9994057 0.9349454 0.939629 -0.9995308 0.9479575 0.9509177 -0.9996295 0.9584677 0.9603343 -0.9997074 0.9669198 0.9680946 -0.9997688 0.973693 0.9744313 -0.9998174 0.9791055 0.9795689 -0.9998557 0.9834209 0.9837116 -0.999886 0.9868555 0.9870376 -0.9999099 0.9895851 0.9896992 -0.9999288 0.9917521 0.9918234 -0.9999437 0.9934707 0.9935154 -0.4834235 0.5071843 0.9915469 -0.4834045 0.507132 0.9915463 -0.4833811 0.5070663 0.9915455 -0.4833522 0.506984 0.9915446 -0.4833171 0.5068811 0.9915433 -0.4832747 0.5067529 0.9915418 -0.4832246 0.506594 0.9915399 -0.4831666 0.506398 0.9915376 -0.4831021 0.5061584 0.9915347 -0.4830346 0.5058684 0.9915312 -0.4829718 0.5055228 0.9915271 -0.4829286 0.5051196 0.9915223 -0.4829319 0.5046642 0.9915169 -0.4830292 0.5041761 0.991511 -0.4833013 0.5037002 0.9915054 -0.4838841 0.5033255 0.9915009 -0.4849907 0.5032055 0.9914995 -0.4865484 0.5032055 0.9914995 -0.4885191 0.5032055 0.9914995 -0.4910123 0.5032055 0.9914995 -0.4941665 0.5032055 0.9914995 -0.498157 0.5032055 0.9914995 -0.5032055 0.5032055 0.9914995 -0.5095925 0.5032055 0.9914995 -0.5176729 0.5032055 0.9914995 -0.5278957 0.5032055 0.9914995 -0.5408288 0.5032055 0.9914995 -0.5571908 0.5032055 0.9914995 -0.577891 0.5032055 0.9914995 -0.6040793 0.5032055 0.9914995 -0.637211 0.5032055 0.9914995 -0.6791269 0.5032055 0.9914995 -0.7321559 0.5032055 0.9914995 -0.7992446 0.5032055 0.9914995 -0.8841204 0.5032055 0.9914995 -0.9914995 0.5032055 0.9914995 -0.9933953 0.5640008 0.8999349 -0.9948487 0.6230471 0.8511207 -0.9959706 0.6785192 0.8314729 -0.9968409 0.7291615 0.8306004 -0.9975189 0.7742682 0.8408797 -0.9980488 0.8136061 0.8569716 -0.9984638 0.8473052 0.875329 -0.9987895 0.8757441 0.8937407 -0.9990455 0.8994464 0.9109436 -0.999247 0.918999 0.9263124 -0.9994057 0.9349933 0.939629 -0.9995308 0.9479878 0.9509177 -0.9996295 0.9584868 0.9603343 -0.9997074 0.9669318 0.9680946 -0.9997688 0.9737006 0.9744313 -0.9998174 0.9791103 0.9795689 -0.9998557 0.9834239 0.9837116 -0.999886 0.9868574 0.9870376 -0.9999099 0.9895863 0.9896992 -0.9999288 0.9917528 0.9918234 -0.9999437 0.9934712 0.9935154 -0.4834235 0.5135199 0.9915469 -0.4834045 0.5134682 0.9915463 -0.4833811 0.5134034 0.9915455 -0.4833522 0.5133222 0.9915446 -0.4833171 0.5132206 0.9915433 -0.4832747 0.5130941 0.9915418 -0.4832246 0.5129372 0.9915399 -0.4831666 0.5127438 0.9915376 -0.4831021 0.5125072 0.9915347 -0.4830346 0.512221 0.9915312 -0.4829718 0.5118798 0.9915271 -0.4829286 0.5114818 0.9915223 -0.4829319 0.5110324 0.9915169 -0.4830292 0.5105506 0.991511 -0.4833013 0.5100808 0.9915054 -0.4838841 0.5097109 0.9915009 -0.4849907 0.5095925 0.9914995 -0.4865484 0.5095925 0.9914995 -0.4885191 0.5095925 0.9914995 -0.4910123 0.5095925 0.9914995 -0.4941665 0.5095925 0.9914995 -0.498157 0.5095925 0.9914995 -0.5032055 0.5095925 0.9914995 -0.5095925 0.5095925 0.9914995 -0.5176729 0.5095925 0.9914995 -0.5278957 0.5095925 0.9914995 -0.5408288 0.5095925 0.9914995 -0.5571908 0.5095925 0.9914995 -0.577891 0.5095925 0.9914995 -0.6040793 0.5095925 0.9914995 -0.637211 0.5095925 0.9914995 -0.6791269 0.5095925 0.9914995 -0.7321559 0.5095925 0.9914995 -0.7992446 0.5095925 0.9914995 -0.8841204 0.5095925 0.9914995 -0.9914995 0.5095925 0.9914995 -0.9933953 0.5683949 0.8999349 -0.9948487 0.6260304 0.8511207 -0.9959706 0.6805199 0.8314729 -0.9968409 0.7304884 0.8306004 -0.9975189 0.7751395 0.8408797 -0.9980488 0.8141733 0.8569716 -0.9984638 0.8476717 0.875329 -0.9987895 0.8759795 0.8937407 -0.9990455 0.8995968 0.9109436 -0.999247 0.9190947 0.9263124 -0.9994057 0.935054 0.939629 -0.9995308 0.9480261 0.9509177 -0.9996295 0.9585109 0.9603343 -0.9997074 0.966947 0.9680946 -0.9997688 0.9737101 0.9744313 -0.9998174 0.9791163 0.9795689 -0.9998557 0.9834277 0.9837116 -0.999886 0.9868597 0.9870376 -0.9999099 0.9895878 0.9896992 -0.9999288 0.9917537 0.9918234 -0.9999437 0.9934718 0.9935154 -0.4834235 0.5215352 0.9915469 -0.4834045 0.5214844 0.9915463 -0.4833811 0.5214207 0.9915455 -0.4833522 0.5213408 0.9915446 -0.4833171 0.5212409 0.9915433 -0.4832747 0.5211165 0.9915418 -0.4832246 0.5209622 0.9915399 -0.4831666 0.520772 0.9915376 -0.4831021 0.5205393 0.9915347 -0.4830346 0.5202578 0.9915312 -0.4829718 0.5199223 0.9915271 -0.4829286 0.5195309 0.9915223 -0.4829319 0.5190889 0.9915169 -0.4830292 0.5186151 0.991511 -0.4833013 0.5181531 0.9915054 -0.4838841 0.5177893 0.9915009 -0.4849907 0.5176729 0.9914995 -0.4865484 0.5176729 0.9914995 -0.4885191 0.5176729 0.9914995 -0.4910123 0.5176729 0.9914995 -0.4941665 0.5176729 0.9914995 -0.498157 0.5176729 0.9914995 -0.5032055 0.5176729 0.9914995 -0.5095925 0.5176729 0.9914995 -0.5176729 0.5176729 0.9914995 -0.5278957 0.5176729 0.9914995 -0.5408288 0.5176729 0.9914995 -0.5571908 0.5176729 0.9914995 -0.577891 0.5176729 0.9914995 -0.6040793 0.5176729 0.9914995 -0.637211 0.5176729 0.9914995 -0.6791269 0.5176729 0.9914995 -0.7321559 0.5176729 0.9914995 -0.7992446 0.5176729 0.9914995 -0.8841204 0.5176729 0.9914995 -0.9914995 0.5176729 0.9914995 -0.9933953 0.573954 0.8999349 -0.9948487 0.6298046 0.8511207 -0.9959706 0.683051 0.8314729 -0.9968409 0.732167 0.8306004 -0.9975189 0.7762418 0.8408797 -0.9980488 0.8148909 0.8569716 -0.9984638 0.8481355 0.875329 -0.9987895 0.8762773 0.8937407 -0.9990455 0.899787 0.9109436 -0.999247 0.9192157 0.9263124 -0.9994057 0.9351307 0.939629 -0.9995308 0.9480746 0.9509177 -0.9996295 0.9585415 0.9603343 -0.9997074 0.9669663 0.9680946 -0.9997688 0.9737222 0.9744313 -0.9998174 0.9791238 0.9795689 -0.9998557 0.9834324 0.9837116 -0.999886 0.9868627 0.9870376 -0.9999099 0.9895897 0.9896992 -0.9999288 0.9917549 0.9918234 -0.9999437 0.9934725 0.9935154 -0.4834235 0.5316756 0.9915469 -0.4834045 0.531626 0.9915463 -0.4833811 0.5315636 0.9915455 -0.4833522 0.5314854 0.9915446 -0.4833171 0.5313876 0.9915433 -0.4832747 0.5312658 0.9915418 -0.4832246 0.5311148 0.9915399 -0.4831666 0.5309287 0.9915376 -0.4831021 0.530701 0.9915347 -0.4830346 0.5304255 0.9915312 -0.4829718 0.5300971 0.9915271 -0.4829286 0.5297141 0.9915223 -0.4829319 0.5292815 0.9915169 -0.4830292 0.5288178 0.991511 -0.4833013 0.5283656 0.9915054 -0.4838841 0.5280096 0.9915009 -0.4849907 0.5278957 0.9914995 -0.4865484 0.5278957 0.9914995 -0.4885191 0.5278957 0.9914995 -0.4910123 0.5278957 0.9914995 -0.4941665 0.5278957 0.9914995 -0.498157 0.5278957 0.9914995 -0.5032055 0.5278957 0.9914995 -0.5095925 0.5278957 0.9914995 -0.5176729 0.5278957 0.9914995 -0.5278957 0.5278957 0.9914995 -0.5408288 0.5278957 0.9914995 -0.5571908 0.5278957 0.9914995 -0.577891 0.5278957 0.9914995 -0.6040793 0.5278957 0.9914995 -0.637211 0.5278957 0.9914995 -0.6791269 0.5278957 0.9914995 -0.7321559 0.5278957 0.9914995 -0.7992446 0.5278957 0.9914995 -0.8841204 0.5278957 0.9914995 -0.9914995 0.5278957 0.9914995 -0.9933953 0.580987 0.8999349 -0.9948487 0.6345795 0.8511207 -0.9959706 0.6862532 0.8314729 -0.9968409 0.7342907 0.8306004 -0.9975189 0.7776364 0.8408797 -0.9980488 0.8157988 0.8569716 -0.9984638 0.8487222 0.875329 -0.9987895 0.8766541 0.8937407 -0.9990455 0.9000277 0.9109436 -0.999247 0.9193688 0.9263124 -0.9994057 0.9352277 0.939629 -0.9995308 0.9481359 0.9509177 -0.9996295 0.9585802 0.9603343 -0.9997074 0.9669906 0.9680946 -0.9997688 0.9737375 0.9744313 -0.9998174 0.9791334 0.9795689 -0.9998557 0.9834385 0.9837116 -0.999886 0.9868665 0.9870376 -0.9999099 0.989592 0.9896992 -0.9999288 0.9917564 0.9918234 -0.9999437 0.9934734 0.9935154 -0.4834235 0.5445046 0.9915469 -0.4834045 0.5444563 0.9915463 -0.4833811 0.5443956 0.9915455 -0.4833522 0.5443196 0.9915446 -0.4833171 0.5442245 0.9915433 -0.4832747 0.5441061 0.9915418 -0.4832246 0.5439593 0.9915399 -0.4831666 0.5437782 0.9915376 -0.4831021 0.5435568 0.9915347 -0.4830346 0.5432889 0.9915312 -0.4829718 0.5429696 0.9915271 -0.4829286 0.5425971 0.9915223 -0.4829319 0.5421764 0.9915169 -0.4830292 0.5417255 0.991511 -0.4833013 0.5412858 0.9915054 -0.4838841 0.5409396 0.9915009 -0.4849907 0.5408288 0.9914995 -0.4865484 0.5408288 0.9914995 -0.4885191 0.5408288 0.9914995 -0.4910123 0.5408288 0.9914995 -0.4941665 0.5408288 0.9914995 -0.498157 0.5408288 0.9914995 -0.5032055 0.5408288 0.9914995 -0.5095925 0.5408288 0.9914995 -0.5176729 0.5408288 0.9914995 -0.5278957 0.5408288 0.9914995 -0.5408288 0.5408288 0.9914995 -0.5571908 0.5408288 0.9914995 -0.577891 0.5408288 0.9914995 -0.6040793 0.5408288 0.9914995 -0.637211 0.5408288 0.9914995 -0.6791269 0.5408288 0.9914995 -0.7321559 0.5408288 0.9914995 -0.7992446 0.5408288 0.9914995 -0.8841204 0.5408288 0.9914995 -0.9914995 0.5408288 0.9914995 -0.9933953 0.5898847 0.8999349 -0.9948487 0.6406203 0.8511207 -0.9959706 0.6903044 0.8314729 -0.9968409 0.7369774 0.8306004 -0.9975189 0.7794007 0.8408797 -0.9980488 0.8169474 0.8569716 -0.9984638 0.8494644 0.875329 -0.9987895 0.8771307 0.8937407 -0.9990455 0.9003323 0.9109436 -0.999247 0.9195625 0.9263124 -0.9994057 0.9353505 0.939629 -0.9995308 0.9482135 0.9509177 -0.9996295 0.9586291 0.9603343 -0.9997074 0.9670214 0.9680946 -0.9997688 0.9737569 0.9744313 -0.9998174 0.9791456 0.9795689 -0.9998557 0.9834461 0.9837116 -0.999886 0.9868713 0.9870376 -0.9999099 0.989595 0.9896992 -0.9999288 0.9917582 0.9918234 -0.9999437 0.9934746 0.9935154 -0.4834235 0.560735 0.9915469 -0.4834045 0.5606884 0.9915463 -0.4833811 0.5606299 0.9915455 -0.4833522 0.5605565 0.9915446 -0.4833171 0.5604649 0.9915433 -0.4832747 0.5603507 0.9915418 -0.4832246 0.5602091 0.9915399 -0.4831666 0.5600346 0.9915376 -0.4831021 0.5598211 0.9915347 -0.4830346 0.5595628 0.9915312 -0.4829718 0.5592549 0.9915271 -0.4829286 0.5588958 0.9915223 -0.4829319 0.5584902 0.9915169 -0.4830292 0.5580554 0.991511 -0.4833013 0.5576314 0.9915054 -0.4838841 0.5572977 0.9915009 -0.4849907 0.5571908 0.9914995 -0.4865484 0.5571908 0.9914995 -0.4885191 0.5571908 0.9914995 -0.4910123 0.5571908 0.9914995 -0.4941665 0.5571908 0.9914995 -0.498157 0.5571908 0.9914995 -0.5032055 0.5571908 0.9914995 -0.5095925 0.5571908 0.9914995 -0.5176729 0.5571908 0.9914995 -0.5278957 0.5571908 0.9914995 -0.5408288 0.5571908 0.9914995 -0.5571908 0.5571908 0.9914995 -0.577891 0.5571908 0.9914995 -0.6040793 0.5571908 0.9914995 -0.637211 0.5571908 0.9914995 -0.6791269 0.5571908 0.9914995 -0.7321559 0.5571908 0.9914995 -0.7992446 0.5571908 0.9914995 -0.8841204 0.5571908 0.9914995 -0.9914995 0.5571908 0.9914995 -0.9933953 0.6011414 0.8999349 -0.9948487 0.6482627 0.8511207 -0.9959706 0.6954296 0.8314729 -0.9968409 0.7403765 0.8306004 -0.9975189 0.7816327 0.8408797 -0.9980488 0.8184005 0.8569716 -0.9984638 0.8504035 0.875329 -0.9987895 0.8777338 0.8937407 -0.9990455 0.9007175 0.9109436 -0.999247 0.9198076 0.9263124 -0.9994057 0.9355059 0.939629 -0.9995308 0.9483117 0.9509177 -0.9996295 0.958691 0.9603343 -0.9997074 0.9670604 0.9680946 -0.9997688 0.9737814 0.9744313 -0.9998174 0.979161 0.9795689 -0.9998557 0.9834557 0.9837116 -0.999886 0.9868773 0.9870376 -0.9999099 0.9895988 0.9896992 -0.9999288 0.9917606 0.9918234 -0.9999437 0.9934761 0.9935154 -0.4834235 0.5812684 0.9915469 -0.4834045 0.581224 0.9915463 -0.4833811 0.5811683 0.9915455 -0.4833522 0.5810984 0.9915446 -0.4833171 0.5810111 0.9915433 -0.4832747 0.5809023 0.9915418 -0.4832246 0.5807673 0.9915399 -0.4831666 0.580601 0.9915376 -0.4831021 0.5803976 0.9915347 -0.4830346 0.5801514 0.9915312 -0.4829718 0.579858 0.9915271 -0.4829286 0.5795157 0.9915223 -0.4829319 0.5791292 0.9915169 -0.4830292 0.5787149 0.991511 -0.4833013 0.5783109 0.9915054 -0.4838841 0.5779928 0.9915009 -0.4849907 0.577891 0.9914995 -0.4865484 0.577891 0.9914995 -0.4885191 0.577891 0.9914995 -0.4910123 0.577891 0.9914995 -0.4941665 0.577891 0.9914995 -0.498157 0.577891 0.9914995 -0.5032055 0.577891 0.9914995 -0.5095925 0.577891 0.9914995 -0.5176729 0.577891 0.9914995 -0.5278957 0.577891 0.9914995 -0.5408288 0.577891 0.9914995 -0.5571908 0.577891 0.9914995 -0.577891 0.577891 0.9914995 -0.6040793 0.577891 0.9914995 -0.637211 0.577891 0.9914995 -0.6791269 0.577891 0.9914995 -0.7321559 0.577891 0.9914995 -0.7992446 0.577891 0.9914995 -0.8841204 0.577891 0.9914995 -0.9914995 0.577891 0.9914995 -0.9933953 0.6153825 0.8999349 -0.9948487 0.6579314 0.8511207 -0.9959706 0.7019138 0.8314729 -0.9968409 0.7446768 0.8306004 -0.9975189 0.7844566 0.8408797 -0.9980488 0.8202389 0.8569716 -0.9984638 0.8515915 0.875329 -0.9987895 0.8784967 0.8937407 -0.9990455 0.9012049 0.9109436 -0.999247 0.9201176 0.9263124 -0.9994057 0.9357024 0.939629 -0.9995308 0.9484359 0.9509177 -0.9996295 0.9587693 0.9603343 -0.9997074 0.9671097 0.9680946 -0.9997688 0.9738123 0.9744313 -0.9998174 0.9791804 0.9795689 -0.9998557 0.9834679 0.9837116 -0.999886 0.986885 0.9870376 -0.9999099 0.9896036 0.9896992 -0.9999288 0.9917636 0.9918234 -0.9999437 0.9934779 0.9935154 -0.4834235 0.6072459 0.9915469 -0.4834045 0.6072043 0.9915463 -0.4833811 0.607152 0.9915455 -0.4833522 0.6070865 0.9915446 -0.4833171 0.6070046 0.9915433 -0.4832747 0.6069026 0.9915418 -0.4832246 0.6067761 0.9915399 -0.4831666 0.6066202 0.9915376 -0.4831021 0.6064294 0.9915347 -0.4830346 0.6061987 0.9915312 -0.4829718 0.6059236 0.9915271 -0.4829286 0.6056027 0.9915223 -0.4829319 0.6052403 0.9915169 -0.4830292 0.6048518 0.991511 -0.4833013 0.604473 0.9915054 -0.4838841 0.6041748 0.9915009 -0.4849907 0.6040793 0.9914995 -0.4865484 0.6040793 0.9914995 -0.4885191 0.6040793 0.9914995 -0.4910123 0.6040793 0.9914995 -0.4941665 0.6040793 0.9914995 -0.498157 0.6040793 0.9914995 -0.5032055 0.6040793 0.9914995 -0.5095925 0.6040793 0.9914995 -0.5176729 0.6040793 0.9914995 -0.5278957 0.6040793 0.9914995 -0.5408288 0.6040793 0.9914995 -0.5571908 0.6040793 0.9914995 -0.577891 0.6040793 0.9914995 -0.6040793 0.6040793 0.9914995 -0.637211 0.6040793 0.9914995 -0.6791269 0.6040793 0.9914995 -0.7321559 0.6040793 0.9914995 -0.7992446 0.6040793 0.9914995 -0.8841204 0.6040793 0.9914995 -0.9914995 0.6040793 0.9914995 -0.9933953 0.6333995 0.8999349 -0.9948487 0.6701635 0.8511207 -0.9959706 0.710117 0.8314729 -0.9968409 0.7501172 0.8306004 -0.9975189 0.7880291 0.8408797 -0.9980488 0.8225647 0.8569716 -0.9984638 0.8530945 0.875329 -0.9987895 0.8794619 0.8937407 -0.9990455 0.9018215 0.9109436 -0.999247 0.9205098 0.9263124 -0.9994057 0.935951 0.939629 -0.9995308 0.9485931 0.9509177 -0.9996295 0.9588684 0.9603343 -0.9997074 0.967172 0.9680946 -0.9997688 0.9738515 0.9744313 -0.9998174 0.979205 0.9795689 -0.9998557 0.9834833 0.9837116 -0.999886 0.9868946 0.9870376 -0.9999099 0.9896096 0.9896992 -0.9999288 0.9917674 0.9918234 -0.9999437 0.9934803 0.9935154 -0.4834235 0.6401109 0.9915469 -0.4834045 0.6400728 0.9915463 -0.4833811 0.6400249 0.9915455 -0.4833522 0.6399649 0.9915446 -0.4833171 0.6398899 0.9915433 -0.4832747 0.6397965 0.9915418 -0.4832246 0.6396806 0.9915399 -0.4831666 0.6395378 0.9915376 -0.4831021 0.6393632 0.9915347 -0.4830346 0.6391518 0.9915312 -0.4829718 0.6388999 0.9915271 -0.4829286 0.638606 0.9915223 -0.4829319 0.6382742 0.9915169 -0.4830292 0.6379184 0.991511 -0.4833013 0.6375715 0.9915054 -0.4838841 0.6372984 0.9915009 -0.4849907 0.637211 0.9914995 -0.4865484 0.637211 0.9914995 -0.4885191 0.637211 0.9914995 -0.4910123 0.637211 0.9914995 -0.4941665 0.637211 0.9914995 -0.498157 0.637211 0.9914995 -0.5032055 0.637211 0.9914995 -0.5095925 0.637211 0.9914995 -0.5176729 0.637211 0.9914995 -0.5278957 0.637211 0.9914995 -0.5408288 0.637211 0.9914995 -0.5571908 0.637211 0.9914995 -0.577891 0.637211 0.9914995 -0.6040793 0.637211 0.9914995 -0.637211 0.637211 0.9914995 -0.6791269 0.637211 0.9914995 -0.7321559 0.637211 0.9914995 -0.7992446 0.637211 0.9914995 -0.8841204 0.637211 0.9914995 -0.9914995 0.637211 0.9914995 -0.9933953 0.6561933 0.8999349 -0.9948487 0.6856388 0.8511207 -0.9959706 0.7204952 0.8314729 -0.9968409 0.757 0.8306004 -0.9975189 0.7925488 0.8408797 -0.9980488 0.8255071 0.8569716 -0.9984638 0.8549959 0.875329 -0.9987895 0.880683 0.8937407 -0.9990455 0.9026016 0.9109436 -0.999247 0.9210061 0.9263124 -0.9994057 0.9362655 0.939629 -0.9995308 0.9487918 0.9509177 -0.9996295 0.9589938 0.9603343 -0.9997074 0.9672509 0.9680946 -0.9997688 0.9739011 0.9744313 -0.9998174 0.9792361 0.9795689 -0.9998557 0.9835029 0.9837116 -0.999886 0.9869069 0.9870376 -0.9999099 0.9896173 0.9896992 -0.9999288 0.9917722 0.9918234 -0.9999437 0.9934833 0.9935154 -0.4834235 0.6816893 0.9915469 -0.4834045 0.6816556 0.9915463 -0.4833811 0.6816133 0.9915455 -0.4833522 0.6815603 0.9915446 -0.4833171 0.681494 0.9915433 -0.4832747 0.6814115 0.9915418 -0.4832246 0.6813091 0.9915399 -0.4831666 0.6811829 0.9915376 -0.4831021 0.6810286 0.9915347 -0.4830346 0.6808418 0.9915312 -0.4829718 0.6806192 0.9915271 -0.4829286 0.6803596 0.9915223 -0.4829319 0.6800663 0.9915169 -0.4830292 0.679752 0.991511 -0.4833013 0.6794455 0.9915054 -0.4838841 0.6792041 0.9915009 -0.4849907 0.6791269 0.9914995 -0.4865484 0.6791269 0.9914995 -0.4885191 0.6791269 0.9914995 -0.4910123 0.6791269 0.9914995 -0.4941665 0.6791269 0.9914995 -0.498157 0.6791269 0.9914995 -0.5032055 0.6791269 0.9914995 -0.5095925 0.6791269 0.9914995 -0.5176729 0.6791269 0.9914995 -0.5278957 0.6791269 0.9914995 -0.5408288 0.6791269 0.9914995 -0.5571908 0.6791269 0.9914995 -0.577891 0.6791269 0.9914995 -0.6040793 0.6791269 0.9914995 -0.637211 0.6791269 0.9914995 -0.6791269 0.6791269 0.9914995 -0.7321559 0.6791269 0.9914995 -0.7992446 0.6791269 0.9914995 -0.8841204 0.6791269 0.9914995 -0.9914995 0.6791269 0.9914995 -0.9933953 0.6850303 0.8999349 -0.9948487 0.7052169 0.8511207 -0.9959706 0.733625 0.8314729 -0.9968409 0.7657077 0.8306004 -0.9975189 0.7982669 0.8408797 -0.9980488 0.8292297 0.8569716 -0.9984638 0.8574015 0.875329 -0.9987895 0.8822279 0.8937407 -0.9990455 0.9035886 0.9109436 -0.999247 0.9216339 0.9263124 -0.9994057 0.9366635 0.939629 -0.9995308 0.9490434 0.9509177 -0.9996295 0.9591524 0.9603343 -0.9997074 0.9673508 0.9680946 -0.9997688 0.9739638 0.9744313 -0.9998174 0.9792755 0.9795689 -0.9998557 0.9835276 0.9837116 -0.999886 0.9869223 0.9870376 -0.9999099 0.989627 0.9896992 -0.9999288 0.9917782 0.9918234 -0.9999437 0.9934871 0.9935154 -0.4834235 0.7342914 0.9915469 -0.4834045 0.7342633 0.9915463 -0.4833811 0.7342281 0.9915455 -0.4833522 0.7341839 0.9915446 -0.4833171 0.7341287 0.9915433 -0.4832747 0.7340599 0.9915418 -0.4832246 0.7339746 0.9915399 -0.4831666 0.7338694 0.9915376 -0.4831021 0.7337408 0.9915347 -0.4830346 0.7335852 0.9915312 -0.4829718 0.7333996 0.9915271 -0.4829286 0.7331832 0.9915223 -0.4829319 0.7329388 0.9915169 -0.4830292 0.7326769 0.991511 -0.4833013 0.7324214 0.9915054 -0.4838841 0.7322203 0.9915009 -0.4849907 0.7321559 0.9914995 -0.4865484 0.7321559 0.9914995 -0.4885191 0.7321559 0.9914995 -0.4910123 0.7321559 0.9914995 -0.4941665 0.7321559 0.9914995 -0.498157 0.7321559 0.9914995 -0.5032055 0.7321559 0.9914995 -0.5095925 0.7321559 0.9914995 -0.5176729 0.7321559 0.9914995 -0.5278957 0.7321559 0.9914995 -0.5408288 0.7321559 0.9914995 -0.5571908 0.7321559 0.9914995 -0.577891 0.7321559 0.9914995 -0.6040793 0.7321559 0.9914995 -0.637211 0.7321559 0.9914995 -0.6791269 0.7321559 0.9914995 -0.7321559 0.7321559 0.9914995 -0.7992446 0.7321559 0.9914995 -0.8841204 0.7321559 0.9914995 -0.9914995 0.7321559 0.9914995 -0.9933953 0.721513 0.8999349 -0.9948487 0.7299859 0.8511207 -0.9959706 0.7502359 0.8314729 -0.9968409 0.776724 0.8306004 -0.9975189 0.8055009 0.8408797 -0.9980488 0.8339392 0.8569716 -0.9984638 0.8604449 0.875329 -0.9987895 0.8841823 0.8937407 -0.9990455 0.9048372 0.9109436 -0.999247 0.9224281 0.9263124 -0.9994057 0.9371669 0.939629 -0.9995308 0.9493615 0.9509177 -0.9996295 0.959353 0.9603343 -0.9997074 0.967477 0.9680946 -0.9997688 0.9740432 0.9744313 -0.9998174 0.9793253 0.9795689 -0.9998557 0.9835588 0.9837116 -0.999886 0.9869419 0.9870376 -0.9999099 0.9896392 0.9896992 -0.9999288 0.9917859 0.9918234 -0.9999437 0.9934919 0.9935154 -0.4834235 0.8008399 0.9915469 -0.4834045 0.800819 0.9915463 -0.4833811 0.8007926 0.9915455 -0.4833522 0.8007596 0.9915446 -0.4833171 0.8007184 0.9915433 -0.4832747 0.800667 0.9915418 -0.4832246 0.8006032 0.9915399 -0.4831666 0.8005247 0.9915376 -0.4831021 0.8004286 0.9915347 -0.4830346 0.8003123 0.9915312 -0.4829718 0.8001737 0.9915271 -0.4829286 0.800012 0.9915223 -0.4829319 0.7998295 0.9915169 -0.4830292 0.7996338 0.991511 -0.4833013 0.7994429 0.9915054 -0.4838841 0.7992927 0.9915009 -0.4849907 0.7992446 0.9914995 -0.4865484 0.7992446 0.9914995 -0.4885191 0.7992446 0.9914995 -0.4910123 0.7992446 0.9914995 -0.4941665 0.7992446 0.9914995 -0.498157 0.7992446 0.9914995 -0.5032055 0.7992446 0.9914995 -0.5095925 0.7992446 0.9914995 -0.5176729 0.7992446 0.9914995 -0.5278957 0.7992446 0.9914995 -0.5408288 0.7992446 0.9914995 -0.5571908 0.7992446 0.9914995 -0.577891 0.7992446 0.9914995 -0.6040793 0.7992446 0.9914995 -0.637211 0.7992446 0.9914995 -0.6791269 0.7992446 0.9914995 -0.7321559 0.7992446 0.9914995 -0.7992446 0.7992446 0.9914995 -0.8841204 0.7992446 0.9914995 -0.9914995 0.7992446 0.9914995 -0.9933953 0.7676683 0.8999349 -0.9948487 0.7613218 0.8511207 -0.9959706 0.7712508 0.8314729 -0.9968409 0.7906611 0.8306004 -0.9975189 0.8146529 0.8408797 -0.9980488 0.8398974 0.8569716 -0.9984638 0.8642952 0.875329 -0.9987895 0.886655 0.8937407 -0.9990455 0.9064168 0.9109436 -0.999247 0.9234329 0.9263124 -0.9994057 0.9378038 0.939629 -0.9995308 0.9497641 0.9509177 -0.9996295 0.9596068 0.9603343 -0.9997074 0.9676368 0.9680946 -0.9997688 0.9741436 0.9744313 -0.9998174 0.9793883 0.9795689 -0.9998557 0.9835983 0.9837116 -0.999886 0.9869667 0.9870376 -0.9999099 0.9896547 0.9896992 -0.9999288 0.9917956 0.9918234 -0.9999437 0.993498 0.9935154 -0.4834235 0.8850325 0.9915469 -0.4834045 0.8850205 0.9915463 -0.4833811 0.8850054 0.9915455 -0.4833522 0.8849865 0.9915446 -0.4833171 0.884963 0.9915433 -0.4832747 0.8849336 0.9915418 -0.4832246 0.8848971 0.9915399 -0.4831666 0.8848522 0.9915376 -0.4831021 0.8847973 0.9915347 -0.4830346 0.8847308 0.9915312 -0.4829718 0.8846516 0.9915271 -0.4829286 0.8845592 0.9915223 -0.4829319 0.8844548 0.9915169 -0.4830292 0.8843429 0.991511 -0.4833013 0.8842338 0.9915054 -0.4838841 0.8841479 0.9915009 -0.4849907 0.8841204 0.9914995 -0.4865484 0.8841204 0.9914995 -0.4885191 0.8841204 0.9914995 -0.4910123 0.8841204 0.9914995 -0.4941665 0.8841204 0.9914995 -0.498157 0.8841204 0.9914995 -0.5032055 0.8841204 0.9914995 -0.5095925 0.8841204 0.9914995 -0.5176729 0.8841204 0.9914995 -0.5278957 0.8841204 0.9914995 -0.5408288 0.8841204 0.9914995 -0.5571908 0.8841204 0.9914995 -0.577891 0.8841204 0.9914995 -0.6040793 0.8841204 0.9914995 -0.637211 0.8841204 0.9914995 -0.6791269 0.8841204 0.9914995 -0.7321559 0.8841204 0.9914995 -0.7992446 0.8841204 0.9914995 -0.8841204 0.8841204 0.9914995 -0.9914995 0.8841204 0.9914995 -0.9933953 0.8260608 0.8999349 -0.9948487 0.8009659 0.8511207 -0.9959706 0.7978374 0.8314729 -0.9968409 0.8082934 0.8306004 -0.9975189 0.8262314 0.8408797 -0.9980488 0.8474353 0.8569716 -0.9984638 0.8691663 0.875329 -0.9987895 0.8897832 0.8937407 -0.9990455 0.9084153 0.9109436 -0.999247 0.9247041 0.9263124 -0.9994057 0.9386096 0.939629 -0.9995308 0.9502734 0.9509177 -0.9996295 0.959928 0.9603343 -0.9997074 0.9678389 0.9680946 -0.9997688 0.9742706 0.9744313 -0.9998174 0.9794681 0.9795689 -0.9998557 0.9836483 0.9837116 -0.999886 0.986998 0.9870376 -0.9999099 0.9896744 0.9896992 -0.9999288 0.9918079 0.9918234 -0.9999437 0.9935057 0.9935154 -0.4834235 0.9915469 0.9915469 -0.4834045 0.9915463 0.9915463 -0.4833811 0.9915455 0.9915455 -0.4833522 0.9915446 0.9915446 -0.4833171 0.9915433 0.9915433 -0.4832747 0.9915418 0.9915418 -0.4832246 0.9915399 0.9915399 -0.4831666 0.9915376 0.9915376 -0.4831021 0.9915347 0.9915347 -0.4830346 0.9915312 0.9915312 -0.4829718 0.9915271 0.9915271 -0.4829286 0.9915223 0.9915223 -0.4829319 0.9915169 0.9915169 -0.4830292 0.991511 0.991511 -0.4833013 0.9915054 0.9915054 -0.4838841 0.9915009 0.9915009 -0.4849907 0.9914995 0.9914995 -0.4865484 0.9914995 0.9914995 -0.4885191 0.9914995 0.9914995 -0.4910123 0.9914995 0.9914995 -0.4941665 0.9914995 0.9914995 -0.498157 0.9914995 0.9914995 -0.5032055 0.9914995 0.9914995 -0.5095925 0.9914995 0.9914995 -0.5176729 0.9914995 0.9914995 -0.5278957 0.9914995 0.9914995 -0.5408288 0.9914995 0.9914995 -0.5571908 0.9914995 0.9914995 -0.577891 0.9914995 0.9914995 -0.6040793 0.9914995 0.9914995 -0.637211 0.9914995 0.9914995 -0.6791269 0.9914995 0.9914995 -0.7321559 0.9914995 0.9914995 -0.7992446 0.9914995 0.9914995 -0.8841204 0.9914995 0.9914995 -0.9914995 0.9914995 0.9914995 -0.9933953 0.8999349 0.8999349 -0.9948487 0.8511207 0.8511207 -0.9959706 0.8314729 0.8314729 -0.9968409 0.8306004 0.8306004 -0.9975189 0.8408797 0.8408797 -0.9980488 0.8569716 0.8569716 -0.9984638 0.875329 0.875329 -0.9987895 0.8937407 0.8937407 -0.9990455 0.9109436 0.9109436 -0.999247 0.9263124 0.9263124 -0.9994057 0.939629 0.939629 -0.9995308 0.9509177 0.9509177 -0.9996295 0.9603343 0.9603343 -0.9997074 0.9680946 0.9680946 -0.9997688 0.9744313 0.9744313 -0.9998174 0.9795689 0.9795689 -0.9998557 0.9837116 0.9837116 -0.999886 0.9870376 0.9870376 -0.9999099 0.9896992 0.9896992 -0.9999288 0.9918234 0.9918234 -0.9999437 0.9935154 0.9935154 -0.5504963 0.993424 0.9005812 -0.5504818 0.9934236 0.9005727 -0.550464 0.9934231 0.900562 -0.5504419 0.9934225 0.9005487 -0.550415 0.9934218 0.9005319 -0.5503825 0.9934209 0.9005111 -0.5503438 0.9934197 0.9004852 -0.5502987 0.9934183 0.9004534 -0.550248 0.9934166 0.9004144 -0.5501939 0.9934145 0.9003673 -0.5501416 0.993412 0.9003112 -0.5501012 0.9934091 0.9002457 -0.5500915 0.9934058 0.9001717 -0.5501456 0.9934023 0.9000925 -0.5503203 0.9933988 0.9000152 -0.5507113 0.9933961 0.8999544 -0.5514695 0.9933953 0.8999349 -0.5525411 0.9933953 0.8999349 -0.5538969 0.9933953 0.8999349 -0.5556122 0.9933953 0.8999349 -0.5577822 0.9933953 0.8999349 -0.5605276 0.9933953 0.8999349 -0.5640008 0.9933953 0.8999349 -0.5683949 0.9933953 0.8999349 -0.573954 0.9933953 0.8999349 -0.580987 0.9933953 0.8999349 -0.5898847 0.9933953 0.8999349 -0.6011414 0.9933953 0.8999349 -0.6153825 0.9933953 0.8999349 -0.6333995 0.9933953 0.8999349 -0.6561933 0.9933953 0.8999349 -0.6850303 0.9933953 0.8999349 -0.721513 0.9933953 0.8999349 -0.7676683 0.9933953 0.8999349 -0.8260608 0.9933953 0.8999349 -0.8999349 0.9933953 0.8999349 -0.9933953 0.9933953 0.8999349 -0.9948487 0.9145732 0.8511207 -0.9959706 0.8740262 0.8314729 -0.9968409 0.8588218 0.8306004 -0.9975189 0.8594117 0.8408797 -0.9980488 0.8690364 0.8569716 -0.9984638 0.8831255 0.875329 -0.9987895 0.8987476 0.8937407 -0.9990455 0.9141422 0.9109436 -0.999247 0.928347 0.9263124 -0.9994057 0.9409186 0.939629 -0.9995308 0.9517328 0.9509177 -0.9996295 0.9608482 0.9603343 -0.9997074 0.9684181 0.9680946 -0.9997688 0.9746346 0.9744313 -0.9998174 0.9796966 0.9795689 -0.9998557 0.9837916 0.9837116 -0.999886 0.9870878 0.9870376 -0.9999099 0.9897306 0.9896992 -0.9999288 0.9918431 0.9918234 -0.9999437 0.9935277 0.9935154 -0.6139459 0.9948662 0.8519149 -0.6139352 0.994866 0.8519044 -0.6139219 0.9948657 0.8518913 -0.6139056 0.9948653 0.8518748 -0.6138855 0.9948649 0.8518543 -0.6138613 0.9948643 0.8518286 -0.6138323 0.9948636 0.8517969 -0.6137984 0.9948628 0.8517577 -0.6137599 0.9948617 0.8517098 -0.6137183 0.9948604 0.8516519 -0.6136769 0.9948589 0.8515828 -0.6136427 0.9948571 0.8515024 -0.6136284 0.9948551 0.8514115 -0.6136569 0.994853 0.8513142 -0.6137675 0.9948509 0.8512193 -0.6140266 0.9948493 0.8511446 -0.6145393 0.9948487 0.8511207 -0.6152669 0.9948487 0.8511207 -0.6161874 0.9948487 0.8511207 -0.6173519 0.9948487 0.8511207 -0.6188252 0.9948487 0.8511207 -0.6206891 0.9948487 0.8511207 -0.6230471 0.9948487 0.8511207 -0.6260304 0.9948487 0.8511207 -0.6298046 0.9948487 0.8511207 -0.6345795 0.9948487 0.8511207 -0.6406203 0.9948487 0.8511207 -0.6482627 0.9948487 0.8511207 -0.6579314 0.9948487 0.8511207 -0.6701635 0.9948487 0.8511207 -0.6856388 0.9948487 0.8511207 -0.7052169 0.9948487 0.8511207 -0.7299859 0.9948487 0.8511207 -0.7613218 0.9948487 0.8511207 -0.8009659 0.9948487 0.8511207 -0.8511207 0.9948487 0.8511207 -0.9145732 0.9948487 0.8511207 -0.9948487 0.9948487 0.8511207 -0.9959706 0.9278617 0.8314729 -0.9968409 0.8945255 0.8306004 -0.9975189 0.8828571 0.8408797 -0.9980488 0.8842998 0.8569716 -0.9984638 0.892989 0.875329 -0.9987895 0.9050819 0.8937407 -0.9990455 0.9181889 0.9109436 -0.999247 0.9309211 0.9263124 -0.9994057 0.9425502 0.939629 -0.9995308 0.952764 0.9509177 -0.9996295 0.9614985 0.9603343 -0.9997074 0.9688274 0.9680946 -0.9997688 0.9748918 0.9744313 -0.9998174 0.979858 0.9795689 -0.9998557 0.9838928 0.9837116 -0.999886 0.9871512 0.9870376 -0.9999099 0.9897703 0.9896992 -0.9999288 0.991868 0.9918234 -0.9999437 0.9935432 0.9935154 -0.6724572 0.9959813 0.8322078 -0.6724495 0.9959811 0.8321981 -0.6724399 0.9959809 0.8321859 -0.672428 0.9959807 0.8321707 -0.6724135 0.9959804 0.8321516 -0.6723959 0.9959801 0.8321279 -0.6723748 0.9959797 0.8320985 -0.67235 0.9959791 0.8320622 -0.6723217 0.9959785 0.8320179 -0.6722907 0.9959777 0.8319643 -0.6722594 0.9959768 0.8319004 -0.6722322 0.9959757 0.8318259 -0.672218 0.9959745 0.8317419 -0.672232 0.9959732 0.8316518 -0.6723012 0.9959719 0.8315641 -0.6724711 0.9959709 0.831495 -0.6728136 0.9959706 0.8314729 -0.6733015 0.9959706 0.8314729 -0.6739188 0.9959706 0.8314729 -0.6746998 0.9959706 0.8314729 -0.6756878 0.9959706 0.8314729 -0.6769378 0.9959706 0.8314729 -0.6785192 0.9959706 0.8314729 -0.6805199 0.9959706 0.8314729 -0.683051 0.9959706 0.8314729 -0.6862532 0.9959706 0.8314729 -0.6903044 0.9959706 0.8314729 -0.6954296 0.9959706 0.8314729 -0.7019138 0.9959706 0.8314729 -0.710117 0.9959706 0.8314729 -0.7204952 0.9959706 0.8314729 -0.733625 0.9959706 0.8314729 -0.7502359 0.9959706 0.8314729 -0.7712508 0.9959706 0.8314729 -0.7978374 0.9959706 0.8314729 -0.8314729 0.9959706 0.8314729 -0.8740262 0.9959706 0.8314729 -0.9278617 0.9959706 0.8314729 -0.9959706 0.9959706 0.8314729 -0.9968409 0.9396953 0.8306004 -0.9975189 0.9125186 0.8408797 -0.9980488 0.9036101 0.8569716 -0.9984638 0.9054678 0.875329 -0.9987895 0.9130957 0.8937407 -0.9990455 0.9233085 0.9109436 -0.999247 0.9341777 0.9263124 -0.9994057 0.9446144 0.939629 -0.9995308 0.9540687 0.9509177 -0.9996295 0.9623212 0.9603343 -0.9997074 0.9693452 0.9680946 -0.9997688 0.9752172 0.9744313 -0.9998174 0.9800622 0.9795689 -0.9998557 0.9840209 0.9837116 -0.999886 0.9872315 0.9870376 -0.9999099 0.9898206 0.9896992 -0.9999288 0.9918994 0.9918234 -0.9999437 0.9935629 0.9935154 -0.7251659 0.9968475 0.8312009 -0.7251605 0.9968474 0.831193 -0.7251537 0.9968473 0.831183 -0.7251454 0.9968472 0.8311705 -0.7251351 0.996847 0.831155 -0.7251226 0.9968468 0.8311356 -0.7251076 0.9968465 0.8311115 -0.7250899 0.9968462 0.8310819 -0.7250697 0.9968458 0.8310457 -0.7250473 0.9968453 0.8310018 -0.7250244 0.9968448 0.8309496 -0.7250039 0.9968441 0.8308888 -0.7249916 0.9968433 0.8308201 -0.7249978 0.9968425 0.8307465 -0.7250408 0.9968418 0.8306748 -0.7251511 0.9968411 0.8306185 -0.7253775 0.9968409 0.8306004 -0.7257011 0.9968409 0.8306004 -0.7261105 0.9968409 0.8306004 -0.7266285 0.9968409 0.8306004 -0.7272837 0.9968409 0.8306004 -0.7281127 0.9968409 0.8306004 -0.7291615 0.9968409 0.8306004 -0.7304884 0.9968409 0.8306004 -0.732167 0.9968409 0.8306004 -0.7342907 0.9968409 0.8306004 -0.7369774 0.9968409 0.8306004 -0.7403765 0.9968409 0.8306004 -0.7446768 0.9968409 0.8306004 -0.7501172 0.9968409 0.8306004 -0.757 0.9968409 0.8306004 -0.7657077 0.9968409 0.8306004 -0.776724 0.9968409 0.8306004 -0.7906611 0.9968409 0.8306004 -0.8082934 0.9968409 0.8306004 -0.8306004 0.9968409 0.8306004 -0.8588218 0.9968409 0.8306004 -0.8945255 0.9968409 0.8306004 -0.9396953 0.9968409 0.8306004 -0.9968409 0.9968409 0.8306004 -0.9975189 0.9500442 0.8408797 -0.9980488 0.9280401 0.8569716 -0.9984638 0.921255 0.875329 -0.9987895 0.9232341 0.8937407 -0.9990455 0.9297854 0.9109436 -0.999247 0.9382977 0.9263124 -0.9994057 0.9472259 0.939629 -0.9995308 0.9557192 0.9509177 -0.9996295 0.963362 0.9603343 -0.9997074 0.9700002 0.9680946 -0.9997688 0.9756289 0.9744313 -0.9998174 0.9803206 0.9795689 -0.9998557 0.9841829 0.9837116 -0.999886 0.987333 0.9870376 -0.9999099 0.9898842 0.9896992 -0.9999288 0.9919392 0.9918234 -0.9999437 0.9935878 0.9935154 -0.7716588 0.997523 0.8413362 -0.7716551 0.997523 0.8413301 -0.7716504 0.9975229 0.8413226 -0.7716446 0.9975228 0.8413131 -0.7716375 0.9975227 0.8413012 -0.7716288 0.9975226 0.8412865 -0.7716184 0.9975224 0.8412682 -0.7716061 0.9975222 0.8412457 -0.7715919 0.997522 0.8412181 -0.7715762 0.9975217 0.8411848 -0.7715599 0.9975213 0.8411451 -0.7715449 0.9975209 0.8410988 -0.7715352 0.9975204 0.8410466 -0.7715376 0.9975199 0.8409907 -0.7715641 0.9975194 0.8409363 -0.7716352 0.9975191 0.8408934 -0.7717834 0.9975189 0.8408797 -0.7719959 0.9975189 0.8408797 -0.7722648 0.9975189 0.8408797 -0.7726049 0.9975189 0.8408797 -0.7730352 0.9975189 0.8408797 -0.7735795 0.9975189 0.8408797 -0.7742682 0.9975189 0.8408797 -0.7751395 0.9975189 0.8408797 -0.7762418 0.9975189 0.8408797 -0.7776364 0.9975189 0.8408797 -0.7794007 0.9975189 0.8408797 -0.7816327 0.9975189 0.8408797 -0.7844566 0.9975189 0.8408797 -0.7880291 0.9975189 0.8408797 -0.7925488 0.9975189 0.8408797 -0.7982669 0.9975189 0.8408797 -0.8055009 0.9975189 0.8408797 -0.8146529 0.9975189 0.8408797 -0.8262314 0.9975189 0.8408797 -0.8408797 0.9975189 0.8408797 -0.8594117 0.9975189 0.8408797 -0.8828571 0.9975189 0.8408797 -0.9125186 0.9975189 0.8408797 -0.9500442 0.9975189 0.8408797 -0.9975189 0.9975189 0.8408797 -0.9980488 0.9589472 0.8569716 -0.9984638 0.9412278 0.875329 -0.9987895 0.9360606 0.8937407 -0.9990455 0.9379796 0.9109436 -0.999247 0.94351 0.9263124 -0.9994057 0.9505298 0.939629 -0.9995308 0.9578074 0.9509177 -0.9996295 0.9646787 0.9603343 -0.9997074 0.970829 0.9680946 -0.9997688 0.9761497 0.9744313 -0.9998174 0.9806476 0.9795689 -0.9998557 0.984388 0.9837116 -0.999886 0.9874615 0.9870376 -0.9999099 0.9899646 0.9896992 -0.9999288 0.9919896 0.9918234 -0.9999437 0.9936193 0.9935154 -0.8119154 0.9980513 0.8573024 -0.8119128 0.9980512 0.857298 -0.8119096 0.9980512 0.8572925 -0.8119057 0.9980511 0.8572857 -0.8119009 0.9980511 0.8572771 -0.8118949 0.998051 0.8572664 -0.8118878 0.9980509 0.8572531 -0.8118794 0.9980508 0.8572368 -0.8118697 0.9980506 0.8572168 -0.8118589 0.9980504 0.8571927 -0.8118476 0.9980502 0.8571639 -0.811837 0.99805 0.8571304 -0.8118298 0.9980497 0.8570925 -0.8118303 0.9980494 0.857052 -0.8118466 0.9980491 0.8570126 -0.8118921 0.9980488 0.8569815 -0.8119884 0.9980488 0.8569716 -0.8121268 0.9980488 0.8569716 -0.8123018 0.9980488 0.8569716 -0.8125232 0.9980488 0.8569716 -0.8128033 0.9980488 0.8569716 -0.8131577 0.9980488 0.8569716 -0.8136061 0.9980488 0.8569716 -0.8141733 0.9980488 0.8569716 -0.8148909 0.9980488 0.8569716 -0.8157988 0.9980488 0.8569716 -0.8169474 0.9980488 0.8569716 -0.8184005 0.9980488 0.8569716 -0.8202389 0.9980488 0.8569716 -0.8225647 0.9980488 0.8569716 -0.8255071 0.9980488 0.8569716 -0.8292297 0.9980488 0.8569716 -0.8339392 0.9980488 0.8569716 -0.8398974 0.9980488 0.8569716 -0.8474353 0.9980488 0.8569716 -0.8569716 0.9980488 0.8569716 -0.8690364 0.9980488 0.8569716 -0.8842998 0.9980488 0.8569716 -0.9036101 0.9980488 0.8569716 -0.9280401 0.9980488 0.8569716 -0.9589472 0.9980488 0.8569716 -0.9980488 0.9980488 0.8569716 -0.9984638 0.9664961 0.875329 -0.9987895 0.9522877 0.8937407 -0.9990455 0.9483463 0.9109436 -0.999247 0.9501042 0.9263124 -0.9994057 0.9547096 0.939629 -0.9995308 0.9604492 0.9509177 -0.9996295 0.9663445 0.9603343 -0.9997074 0.9718774 0.9680946 -0.9997688 0.9768086 0.9744313 -0.9998174 0.9810611 0.9795689 -0.9998557 0.9846473 0.9837116 -0.999886 0.987624 0.9870376 -0.9999099 0.9900664 0.9896992 -0.9999288 0.9920533 0.9918234 -0.9999437 0.9936592 0.9935154 -0.8462171 0.9984653 0.8755606 -0.8462154 0.9984653 0.8755576 -0.8462132 0.9984653 0.8755537 -0.8462106 0.9984653 0.8755489 -0.8462073 0.9984652 0.8755429 -0.8462034 0.9984652 0.8755354 -0.8461986 0.9984651 0.8755261 -0.8461929 0.998465 0.8755147 -0.8461864 0.9984649 0.8755007 -0.8461791 0.9984648 0.8754838 -0.8461714 0.9984647 0.8754636 -0.8461641 0.9984645 0.8754401 -0.8461589 0.9984643 0.8754136 -0.8461587 0.9984642 0.8753853 -0.8461687 0.998464 0.8753576 -0.8461977 0.9984638 0.8753359 -0.8462598 0.9984638 0.875329 -0.8463492 0.9984638 0.875329 -0.8464623 0.9984638 0.875329 -0.8466054 0.9984638 0.875329 -0.8467864 0.9984638 0.875329 -0.8470154 0.9984638 0.875329 -0.8473052 0.9984638 0.875329 -0.8476717 0.9984638 0.875329 -0.8481355 0.9984638 0.875329 -0.8487222 0.9984638 0.875329 -0.8494644 0.9984638 0.875329 -0.8504035 0.9984638 0.875329 -0.8515915 0.9984638 0.875329 -0.8530945 0.9984638 0.875329 -0.8549959 0.9984638 0.875329 -0.8574015 0.9984638 0.875329 -0.8604449 0.9984638 0.875329 -0.8642952 0.9984638 0.875329 -0.8691663 0.9984638 0.875329 -0.875329 0.9984638 0.875329 -0.8831255 0.9984638 0.875329 -0.892989 0.9984638 0.875329 -0.9054678 0.9984638 0.875329 -0.921255 0.9984638 0.875329 -0.9412278 0.9984638 0.875329 -0.9664961 0.9984638 0.875329 -0.9984638 0.9984638 0.875329 -0.9987895 0.9728171 0.8937407 -0.9990455 0.9614615 0.9109436 -0.999247 0.9584468 0.9263124 -0.9994057 0.9599976 0.939629 -0.9995308 0.9637914 0.9509177 -0.9996295 0.968452 0.9603343 -0.9997074 0.9732039 0.9680946 -0.9997688 0.9776422 0.9744313 -0.9998174 0.9815844 0.9795689 -0.9998557 0.9849754 0.9837116 -0.999886 0.9878296 0.9870376 -0.9999099 0.9901951 0.9896992 -0.9999288 0.9921339 0.9918234 -0.9999437 0.9937096 0.9935154 -0.8750477 0.9987905 0.8938989 -0.8750466 0.9987905 0.8938969 -0.8750451 0.9987904 0.8938942 -0.8750434 0.9987904 0.8938909 -0.8750412 0.9987904 0.8938868 -0.8750386 0.9987904 0.8938817 -0.8750355 0.9987903 0.8938754 -0.8750317 0.9987903 0.8938676 -0.8750274 0.9987902 0.893858 -0.8750225 0.9987902 0.8938464 -0.8750173 0.9987901 0.8938327 -0.8750124 0.99879 0.8938167 -0.8750088 0.9987899 0.8937986 -0.8750084 0.9987897 0.8937792 -0.8750145 0.9987896 0.8937603 -0.8750329 0.9987895 0.8937455 -0.8750727 0.9987895 0.8937407 -0.8751301 0.9987895 0.8937407 -0.8752028 0.9987895 0.8937407 -0.8752947 0.9987895 0.8937407 -0.8754109 0.9987895 0.8937407 -0.875558 0.9987895 0.8937407 -0.8757441 0.9987895 0.8937407 -0.8759795 0.9987895 0.8937407 -0.8762773 0.9987895 0.8937407 -0.8766541 0.9987895 0.8937407 -0.8771307 0.9987895 0.8937407 -0.8777338 0.9987895 0.8937407 -0.8784967 0.9987895 0.8937407 -0.8794619 0.9987895 0.8937407 -0.880683 0.9987895 0.8937407 -0.8822279 0.9987895 0.8937407 -0.8841823 0.9987895 0.8937407 -0.886655 0.9987895 0.8937407 -0.8897832 0.9987895 0.8937407 -0.8937407 0.9987895 0.8937407 -0.8987476 0.9987895 0.8937407 -0.9050819 0.9987895 0.8937407 -0.9130957 0.9987895 0.8937407 -0.9232341 0.9987895 0.8937407 -0.9360606 0.9987895 0.8937407 -0.9522877 0.9987895 0.8937407 -0.9728171 0.9987895 0.8937407 -0.9987895 0.9987895 0.8937407 -0.9990455 0.9780539 0.9109436 -0.999247 0.9690013 0.9263124 -0.9994057 0.9666876 0.939629 -0.9995308 0.9680197 0.9509177 -0.9996295 0.9711183 0.9603343 -0.9997074 0.974882 0.9680946 -0.9997688 0.9786968 0.9744313 -0.9998174 0.9822464 0.9795689 -0.9998557 0.9853905 0.9837116 -0.999886 0.9880897 0.9870376 -0.9999099 0.990358 0.9896992 -0.9999288 0.9922358 0.9918234 -0.9999437 0.9937734 0.9935154 -0.8990028 0.9990461 0.9110495 -0.899002 0.9990461 0.9110481 -0.8990011 0.9990461 0.9110464 -0.899 0.9990461 0.9110442 -0.8989986 0.9990461 0.9110414 -0.8989969 0.9990461 0.911038 -0.8989948 0.9990461 0.9110337 -0.8989923 0.999046 0.9110285 -0.8989895 0.999046 0.9110221 -0.8989863 0.9990459 0.9110144 -0.8989829 0.9990459 0.9110051 -0.8989796 0.9990458 0.9109944 -0.8989771 0.9990458 0.9109823 -0.8989767 0.9990457 0.9109693 -0.8989805 0.9990456 0.9109567 -0.8989921 0.9990456 0.9109467 -0.8990175 0.9990455 0.9109436 -0.8990542 0.9990455 0.9109436 -0.8991006 0.9990455 0.9109436 -0.8991593 0.9990455 0.9109436 -0.8992336 0.9990455 0.9109436 -0.8993275 0.9990455 0.9109436 -0.8994464 0.9990455 0.9109436 -0.8995968 0.9990455 0.9109436 -0.899787 0.9990455 0.9109436 -0.9000277 0.9990455 0.9109436 -0.9003323 0.9990455 0.9109436 -0.9007175 0.9990455 0.9109436 -0.9012049 0.9990455 0.9109436 -0.9018215 0.9990455 0.9109436 -0.9026016 0.9990455 0.9109436 -0.9035886 0.9990455 0.9109436 -0.9048372 0.9990455 0.9109436 -0.9064168 0.9990455 0.9109436 -0.9084153 0.9990455 0.9109436 -0.9109436 0.9990455 0.9109436 -0.9141422 0.9990455 0.9109436 -0.9181889 0.9990455 0.9109436 -0.9233085 0.9990455 0.9109436 -0.9297854 0.9990455 0.9109436 -0.9379796 0.9990455 0.9109436 -0.9483463 0.9990455 0.9109436 -0.9614615 0.9990455 0.9109436 -0.9780539 0.9990455 0.9109436 -0.9990455 0.9990455 0.9109436 -0.999247 0.982354 0.9263124 -0.9994057 0.9751513 0.939629 -0.9995308 0.9733691 0.9509177 -0.9996295 0.9744915 0.9603343 -0.9997074 0.977005 0.9680946 -0.9997688 0.980031 0.9744313 -0.9998174 0.9830838 0.9795689 -0.9998557 0.9859157 0.9837116 -0.999886 0.9884188 0.9870376 -0.9999099 0.9905641 0.9896992 -0.9999288 0.9923648 0.9918234 -0.9999437 0.9938541 0.9935154 -0.9187175 0.9992474 0.9263823 -0.918717 0.9992474 0.9263814 -0.9187164 0.9992474 0.9263802 -0.9187157 0.9992474 0.9263788 -0.9187148 0.9992474 0.9263769 -0.9187137 0.9992474 0.9263747 -0.9187123 0.9992473 0.9263719 -0.9187107 0.9992473 0.9263684 -0.9187089 0.9992473 0.9263642 -0.9187068 0.9992473 0.9263591 -0.9187045 0.9992472 0.926353 -0.9187024 0.9992472 0.9263459 -0.9187008 0.9992472 0.9263379 -0.9187004 0.9992471 0.9263294 -0.9187027 0.9992471 0.926321 -0.9187101 0.999247 0.9263145 -0.9187262 0.999247 0.9263124 -0.9187495 0.999247 0.9263124 -0.9187791 0.999247 0.9263124 -0.9188164 0.999247 0.9263124 -0.9188636 0.999247 0.9263124 -0.9189234 0.999247 0.9263124 -0.918999 0.999247 0.9263124 -0.9190947 0.999247 0.9263124 -0.9192157 0.999247 0.9263124 -0.9193688 0.999247 0.9263124 -0.9195625 0.999247 0.9263124 -0.9198076 0.999247 0.9263124 -0.9201176 0.999247 0.9263124 -0.9205098 0.999247 0.9263124 -0.9210061 0.999247 0.9263124 -0.9216339 0.999247 0.9263124 -0.9224281 0.999247 0.9263124 -0.9234329 0.999247 0.9263124 -0.9247041 0.999247 0.9263124 -0.9263124 0.999247 0.9263124 -0.928347 0.999247 0.9263124 -0.9309211 0.999247 0.9263124 -0.9341777 0.999247 0.9263124 -0.9382977 0.999247 0.9263124 -0.94351 0.999247 0.9263124 -0.9501042 0.999247 0.9263124 -0.9584468 0.999247 0.9263124 -0.9690013 0.999247 0.9263124 -0.982354 0.999247 0.9263124 -0.999247 0.999247 0.9263124 -0.9994057 0.9858591 0.939629 -0.9995308 0.9801368 0.9509177 -0.9996295 0.978759 0.9603343 -0.9997074 0.9796909 0.9680946 -0.9997688 0.981719 0.9744313 -0.9998174 0.9841433 0.9795689 -0.9998557 0.9865801 0.9837116 -0.999886 0.9888351 0.9870376 -0.9999099 0.9908248 0.9896992 -0.9999288 0.992528 0.9918234 -0.9999437 0.9939562 0.9935154 -0.9348153 0.999406 0.9396746 -0.9348149 0.999406 0.939674 -0.9348146 0.999406 0.9396732 -0.9348141 0.999406 0.9396723 -0.9348135 0.999406 0.9396711 -0.9348128 0.9994059 0.9396696 -0.9348119 0.9994059 0.9396678 -0.9348109 0.9994059 0.9396655 -0.9348097 0.9994059 0.9396628 -0.9348083 0.9994059 0.9396594 -0.9348069 0.9994059 0.9396555 -0.9348055 0.9994059 0.9396508 -0.9348044 0.9994058 0.9396456 -0.9348042 0.9994058 0.93964 -0.9348056 0.9994058 0.9396346 -0.9348102 0.9994057 0.9396303 -0.9348204 0.9994057 0.939629 -0.9348352 0.9994057 0.939629 -0.9348539 0.9994057 0.939629 -0.9348776 0.9994057 0.939629 -0.9349075 0.9994057 0.939629 -0.9349454 0.9994057 0.939629 -0.9349933 0.9994057 0.939629 -0.935054 0.9994057 0.939629 -0.9351307 0.9994057 0.939629 -0.9352277 0.9994057 0.939629 -0.9353505 0.9994057 0.939629 -0.9355059 0.9994057 0.939629 -0.9357024 0.9994057 0.939629 -0.935951 0.9994057 0.939629 -0.9362655 0.9994057 0.939629 -0.9366635 0.9994057 0.939629 -0.9371669 0.9994057 0.939629 -0.9378038 0.9994057 0.939629 -0.9386096 0.9994057 0.939629 -0.939629 0.9994057 0.939629 -0.9409186 0.9994057 0.939629 -0.9425502 0.9994057 0.939629 -0.9446144 0.9994057 0.939629 -0.9472259 0.9994057 0.939629 -0.9505298 0.9994057 0.939629 -0.9547096 0.9994057 0.939629 -0.9599976 0.9994057 0.939629 -0.9666876 0.9994057 0.939629 -0.9751513 0.9994057 0.939629 -0.9858591 0.9994057 0.939629 -0.9994057 0.9994057 0.939629 -0.9995308 0.9886988 0.9509177 -0.9996295 0.9841579 0.9603343 -0.9997074 0.983089 0.9680946 -0.9997688 0.9838545 0.9744313 -0.9998174 0.9854838 0.9795689 -0.9998557 0.9874207 0.9837116 -0.999886 0.9893618 0.9870376 -0.9999099 0.9911547 0.9896992 -0.9999288 0.9927345 0.9918234 -0.9999437 0.9940854 0.9935154 -0.9478754 0.999531 0.9509472 -0.9478752 0.999531 0.9509468 -0.947875 0.999531 0.9509463 -0.9478746 0.999531 0.9509457 -0.9478743 0.999531 0.9509449 -0.9478738 0.999531 0.9509439 -0.9478733 0.999531 0.9509428 -0.9478726 0.999531 0.9509413 -0.9478718 0.999531 0.9509395 -0.947871 0.9995309 0.9509374 -0.94787 0.9995309 0.9509348 -0.9478691 0.9995309 0.9509318 -0.9478684 0.9995309 0.9509284 -0.9478683 0.9995309 0.9509248 -0.9478691 0.9995309 0.9509213 -0.947872 0.9995309 0.9509185 -0.9478785 0.9995308 0.9509177 -0.9478878 0.9995308 0.9509177 -0.9478997 0.9995308 0.9509177 -0.9479146 0.9995308 0.9509177 -0.9479335 0.9995308 0.9509177 -0.9479575 0.9995308 0.9509177 -0.9479878 0.9995308 0.9509177 -0.9480261 0.9995308 0.9509177 -0.9480746 0.9995308 0.9509177 -0.9481359 0.9995308 0.9509177 -0.9482135 0.9995308 0.9509177 -0.9483117 0.9995308 0.9509177 -0.9484359 0.9995308 0.9509177 -0.9485931 0.9995308 0.9509177 -0.9487918 0.9995308 0.9509177 -0.9490434 0.9995308 0.9509177 -0.9493615 0.9995308 0.9509177 -0.9497641 0.9995308 0.9509177 -0.9502734 0.9995308 0.9509177 -0.9509177 0.9995308 0.9509177 -0.9517328 0.9995308 0.9509177 -0.952764 0.9995308 0.9509177 -0.9540687 0.9995308 0.9509177 -0.9557192 0.9995308 0.9509177 -0.9578074 0.9995308 0.9509177 -0.9604492 0.9995308 0.9509177 -0.9637914 0.9995308 0.9509177 -0.9680197 0.9995308 0.9509177 -0.9733691 0.9995308 0.9509177 -0.9801368 0.9995308 0.9509177 -0.9886988 0.9995308 0.9509177 -0.9995308 0.9995308 0.9509177 -0.9996295 0.9909882 0.9603343 -0.9997074 0.9873879 0.9680946 -0.9997688 0.9865561 0.9744313 -0.9998174 0.9871796 0.9795689 -0.9998557 0.9884841 0.9837116 -0.999886 0.9900282 0.9870376 -0.9999099 0.991572 0.9896992 -0.9999288 0.9929957 0.9918234 -0.9999437 0.9942488 0.9935154 -0.958416 0.9996296 0.9603532 -0.9584159 0.9996296 0.9603529 -0.9584157 0.9996296 0.9603526 -0.9584155 0.9996296 0.9603522 -0.9584153 0.9996296 0.9603517 -0.958415 0.9996296 0.9603511 -0.9584146 0.9996296 0.9603504 -0.9584142 0.9996296 0.9603494 -0.9584137 0.9996296 0.9603483 -0.9584132 0.9996296 0.9603469 -0.9584126 0.9996296 0.9603452 -0.958412 0.9996296 0.9603433 -0.9584115 0.9996296 0.9603412 -0.9584114 0.9996295 0.9603388 -0.958412 0.9996295 0.9603366 -0.9584138 0.9996295 0.9603348 -0.9584178 0.9996295 0.9603343 -0.9584237 0.9996295 0.9603343 -0.9584312 0.9996295 0.9603343 -0.9584406 0.9996295 0.9603343 -0.9584526 0.9996295 0.9603343 -0.9584677 0.9996295 0.9603343 -0.9584868 0.9996295 0.9603343 -0.9585109 0.9996295 0.9603343 -0.9585415 0.9996295 0.9603343 -0.9585802 0.9996295 0.9603343 -0.9586291 0.9996295 0.9603343 -0.958691 0.9996295 0.9603343 -0.9587693 0.9996295 0.9603343 -0.9588684 0.9996295 0.9603343 -0.9589938 0.9996295 0.9603343 -0.9591524 0.9996295 0.9603343 -0.959353 0.9996295 0.9603343 -0.9596068 0.9996295 0.9603343 -0.959928 0.9996295 0.9603343 -0.9603343 0.9996295 0.9603343 -0.9608482 0.9996295 0.9603343 -0.9614985 0.9996295 0.9603343 -0.9623212 0.9996295 0.9603343 -0.963362 0.9996295 0.9603343 -0.9646787 0.9996295 0.9603343 -0.9663445 0.9996295 0.9603343 -0.968452 0.9996295 0.9603343 -0.9711183 0.9996295 0.9603343 -0.9744915 0.9996295 0.9603343 -0.978759 0.9996295 0.9603343 -0.9841579 0.9996295 0.9603343 -0.9909882 0.9996295 0.9603343 -0.9996295 0.9996295 0.9603343 -0.9997074 0.9928267 0.9680946 -0.9997688 0.9899741 0.9744313 -0.9998174 0.989325 0.9795689 -0.9998557 0.9898295 0.9837116 -0.999886 0.9908712 0.9870376 -0.9999099 0.9920999 0.9896992 -0.9999288 0.9933261 0.9918234 -0.9999437 0.9944556 0.9935154 -0.9668873 0.9997074 0.9681067 -0.9668872 0.9997074 0.9681065 -0.9668871 0.9997074 0.9681063 -0.966887 0.9997074 0.9681061 -0.9668869 0.9997074 0.9681058 -0.9668867 0.9997074 0.9681054 -0.9668865 0.9997074 0.9681049 -0.9668862 0.9997074 0.9681043 -0.9668859 0.9997074 0.9681036 -0.9668855 0.9997074 0.9681027 -0.9668852 0.9997074 0.9681016 -0.9668848 0.9997074 0.9681004 -0.9668845 0.9997074 0.968099 -0.9668844 0.9997074 0.9680976 -0.9668847 0.9997074 0.9680961 -0.9668859 0.9997074 0.968095 -0.9668884 0.9997074 0.9680946 -0.9668922 0.9997074 0.9680946 -0.9668969 0.9997074 0.9680946 -0.9669028 0.9997074 0.9680946 -0.9669103 0.9997074 0.9680946 -0.9669198 0.9997074 0.9680946 -0.9669318 0.9997074 0.9680946 -0.966947 0.9997074 0.9680946 -0.9669663 0.9997074 0.9680946 -0.9669906 0.9997074 0.9680946 -0.9670214 0.9997074 0.9680946 -0.9670604 0.9997074 0.9680946 -0.9671097 0.9997074 0.9680946 -0.967172 0.9997074 0.9680946 -0.9672509 0.9997074 0.9680946 -0.9673508 0.9997074 0.9680946 -0.967477 0.9997074 0.9680946 -0.9676368 0.9997074 0.9680946 -0.9678389 0.9997074 0.9680946 -0.9680946 0.9997074 0.9680946 -0.9684181 0.9997074 0.9680946 -0.9688274 0.9997074 0.9680946 -0.9693452 0.9997074 0.9680946 -0.9700002 0.9997074 0.9680946 -0.970829 0.9997074 0.9680946 -0.9718774 0.9997074 0.9680946 -0.9732039 0.9997074 0.9680946 -0.974882 0.9997074 0.9680946 -0.977005 0.9997074 0.9680946 -0.9796909 0.9997074 0.9680946 -0.983089 0.9997074 0.9680946 -0.9873879 0.9997074 0.9680946 -0.9928267 0.9997074 0.9680946 -0.9997074 0.9997074 0.9680946 -0.9997688 0.9942982 0.9744313 -0.9998174 0.9920392 0.9795689 -0.9998557 0.9915316 0.9837116 -0.999886 0.9919377 0.9870376 -0.9999099 0.9927678 0.9896992 -0.9999288 0.9937442 0.9918234 -0.9999437 0.9947172 0.9935154 -0.9736726 0.9997689 0.974439 -0.9736726 0.9997689 0.9744389 -0.9736725 0.9997689 0.9744388 -0.9736724 0.9997689 0.9744386 -0.9736723 0.9997689 0.9744384 -0.9736722 0.9997689 0.9744382 -0.9736721 0.9997689 0.9744378 -0.9736719 0.9997689 0.9744375 -0.9736717 0.9997689 0.974437 -0.9736715 0.9997689 0.9744364 -0.9736712 0.9997689 0.9744358 -0.973671 0.9997689 0.974435 -0.9736708 0.9997689 0.9744341 -0.9736708 0.9997689 0.9744332 -0.973671 0.9997688 0.9744323 -0.9736717 0.9997688 0.9744315 -0.9736733 0.9997688 0.9744313 -0.9736756 0.9997688 0.9744313 -0.9736786 0.9997688 0.9744313 -0.9736823 0.9997688 0.9744313 -0.973687 0.9997688 0.9744313 -0.973693 0.9997688 0.9744313 -0.9737006 0.9997688 0.9744313 -0.9737101 0.9997688 0.9744313 -0.9737222 0.9997688 0.9744313 -0.9737375 0.9997688 0.9744313 -0.9737569 0.9997688 0.9744313 -0.9737814 0.9997688 0.9744313 -0.9738123 0.9997688 0.9744313 -0.9738515 0.9997688 0.9744313 -0.9739011 0.9997688 0.9744313 -0.9739638 0.9997688 0.9744313 -0.9740432 0.9997688 0.9744313 -0.9741436 0.9997688 0.9744313 -0.9742706 0.9997688 0.9744313 -0.9744313 0.9997688 0.9744313 -0.9746346 0.9997688 0.9744313 -0.9748918 0.9997688 0.9744313 -0.9752172 0.9997688 0.9744313 -0.9756289 0.9997688 0.9744313 -0.9761497 0.9997688 0.9744313 -0.9768086 0.9997688 0.9744313 -0.9776422 0.9997688 0.9744313 -0.9786968 0.9997688 0.9744313 -0.980031 0.9997688 0.9744313 -0.981719 0.9997688 0.9744313 -0.9838545 0.9997688 0.9744313 -0.9865561 0.9997688 0.9744313 -0.9899741 0.9997688 0.9744313 -0.9942982 0.9997688 0.9744313 -0.9997688 0.9997688 0.9744313 -0.9998174 0.9954731 0.9795689 -0.9998557 0.9936849 0.9837116 -0.999886 0.993287 0.9870376 -0.9999099 0.9936128 0.9896992 -0.9999288 0.9942731 0.9918234 -0.9999437 0.9950481 0.9935154 -0.9790927 0.9998174 0.9795738 -0.9790927 0.9998174 0.9795737 -0.9790927 0.9998174 0.9795737 -0.9790926 0.9998174 0.9795736 -0.9790925 0.9998174 0.9795734 -0.9790925 0.9998174 0.9795733 -0.9790924 0.9998174 0.9795731 -0.9790923 0.9998174 0.9795728 -0.9790921 0.9998174 0.9795725 -0.979092 0.9998174 0.9795722 -0.9790919 0.9998174 0.9795718 -0.9790917 0.9998174 0.9795713 -0.9790916 0.9998174 0.9795707 -0.9790916 0.9998174 0.9795701 -0.9790917 0.9998174 0.9795695 -0.9790921 0.9998174 0.9795691 -0.9790931 0.9998174 0.9795689 -0.9790946 0.9998174 0.9795689 -0.9790965 0.9998174 0.9795689 -0.9790988 0.9998174 0.9795689 -0.9791018 0.9998174 0.9795689 -0.9791055 0.9998174 0.9795689 -0.9791103 0.9998174 0.9795689 -0.9791163 0.9998174 0.9795689 -0.9791238 0.9998174 0.9795689 -0.9791334 0.9998174 0.9795689 -0.9791456 0.9998174 0.9795689 -0.979161 0.9998174 0.9795689 -0.9791804 0.9998174 0.9795689 -0.979205 0.9998174 0.9795689 -0.9792361 0.9998174 0.9795689 -0.9792755 0.9998174 0.9795689 -0.9793253 0.9998174 0.9795689 -0.9793883 0.9998174 0.9795689 -0.9794681 0.9998174 0.9795689 -0.9795689 0.9998174 0.9795689 -0.9796966 0.9998174 0.9795689 -0.979858 0.9998174 0.9795689 -0.9800622 0.9998174 0.9795689 -0.9803206 0.9998174 0.9795689 -0.9806476 0.9998174 0.9795689 -0.9810611 0.9998174 0.9795689 -0.9815844 0.9998174 0.9795689 -0.9822464 0.9998174 0.9795689 -0.9830838 0.9998174 0.9795689 -0.9841433 0.9998174 0.9795689 -0.9854838 0.9998174 0.9795689 -0.9871796 0.9998174 0.9795689 -0.989325 0.9998174 0.9795689 -0.9920392 0.9998174 0.9795689 -0.9954731 0.9998174 0.9795689 -0.9998174 0.9998174 0.9795689 -0.9998557 0.9964092 0.9837116 -0.999886 0.9949941 0.9870376 -0.9999099 0.9946818 0.9896992 -0.9999288 0.9949422 0.9918234 -0.9999437 0.9954668 0.9935154 -0.9834129 0.9998557 0.9837146 -0.9834129 0.9998557 0.9837146 -0.9834129 0.9998557 0.9837145 -0.9834129 0.9998557 0.9837145 -0.9834128 0.9998557 0.9837144 -0.9834128 0.9998557 0.9837143 -0.9834127 0.9998557 0.9837142 -0.9834127 0.9998557 0.983714 -0.9834126 0.9998557 0.9837138 -0.9834125 0.9998557 0.9837136 -0.9834124 0.9998557 0.9837133 -0.9834123 0.9998557 0.983713 -0.9834122 0.9998557 0.9837127 -0.9834122 0.9998557 0.9837123 -0.9834123 0.9998557 0.9837119 -0.9834126 0.9998557 0.9837117 -0.9834132 0.9998557 0.9837116 -0.9834141 0.9998557 0.9837116 -0.9834153 0.9998557 0.9837116 -0.9834167 0.9998557 0.9837116 -0.9834186 0.9998557 0.9837116 -0.9834209 0.9998557 0.9837116 -0.9834239 0.9998557 0.9837116 -0.9834277 0.9998557 0.9837116 -0.9834324 0.9998557 0.9837116 -0.9834385 0.9998557 0.9837116 -0.9834461 0.9998557 0.9837116 -0.9834557 0.9998557 0.9837116 -0.9834679 0.9998557 0.9837116 -0.9834833 0.9998557 0.9837116 -0.9835029 0.9998557 0.9837116 -0.9835276 0.9998557 0.9837116 -0.9835588 0.9998557 0.9837116 -0.9835983 0.9998557 0.9837116 -0.9836483 0.9998557 0.9837116 -0.9837116 0.9998557 0.9837116 -0.9837916 0.9998557 0.9837116 -0.9838928 0.9998557 0.9837116 -0.9840209 0.9998557 0.9837116 -0.9841829 0.9998557 0.9837116 -0.984388 0.9998557 0.9837116 -0.9846473 0.9998557 0.9837116 -0.9849754 0.9998557 0.9837116 -0.9853905 0.9998557 0.9837116 -0.9859157 0.9998557 0.9837116 -0.9865801 0.9998557 0.9837116 -0.9874207 0.9998557 0.9837116 -0.9884841 0.9998557 0.9837116 -0.9898295 0.9998557 0.9837116 -0.9915316 0.9998557 0.9837116 -0.9936849 0.9998557 0.9837116 -0.9964092 0.9998557 0.9837116 -0.9998557 0.9998557 0.9837116 -0.999886 0.9971537 0.9870376 -0.9999099 0.9960342 0.9896992 -0.9999288 0.9957887 0.9918234 -0.9999437 0.9959964 0.9935154 -0.9868505 0.999886 0.9870396 -0.9868505 0.999886 0.9870395 -0.9868505 0.999886 0.9870395 -0.9868505 0.999886 0.9870395 -0.9868504 0.999886 0.9870394 -0.9868504 0.999886 0.9870393 -0.9868504 0.999886 0.9870393 -0.9868503 0.999886 0.9870392 -0.9868503 0.999886 0.9870391 -0.9868502 0.999886 0.9870389 -0.9868502 0.999886 0.9870387 -0.9868501 0.999886 0.9870386 -0.9868501 0.999886 0.9870383 -0.98685 0.999886 0.9870381 -0.9868501 0.999886 0.9870379 -0.9868503 0.999886 0.9870377 -0.9868507 0.999886 0.9870376 -0.9868512 0.999886 0.9870376 -0.986852 0.999886 0.9870376 -0.9868529 0.999886 0.9870376 -0.9868541 0.999886 0.9870376 -0.9868555 0.999886 0.9870376 -0.9868574 0.999886 0.9870376 -0.9868597 0.999886 0.9870376 -0.9868627 0.999886 0.9870376 -0.9868665 0.999886 0.9870376 -0.9868713 0.999886 0.9870376 -0.9868773 0.999886 0.9870376 -0.986885 0.999886 0.9870376 -0.9868946 0.999886 0.9870376 -0.9869069 0.999886 0.9870376 -0.9869223 0.999886 0.9870376 -0.9869419 0.999886 0.9870376 -0.9869667 0.999886 0.9870376 -0.986998 0.999886 0.9870376 -0.9870376 0.999886 0.9870376 -0.9870878 0.999886 0.9870376 -0.9871512 0.999886 0.9870376 -0.9872315 0.999886 0.9870376 -0.987333 0.999886 0.9870376 -0.9874615 0.999886 0.9870376 -0.987624 0.999886 0.9870376 -0.9878296 0.999886 0.9870376 -0.9880897 0.999886 0.9870376 -0.9884188 0.999886 0.9870376 -0.9888351 0.999886 0.9870376 -0.9893618 0.999886 0.9870376 -0.9900282 0.999886 0.9870376 -0.9908712 0.999886 0.9870376 -0.9919377 0.999886 0.9870376 -0.993287 0.999886 0.9870376 -0.9949941 0.999886 0.9870376 -0.9971537 0.999886 0.9870376 -0.999886 0.999886 0.9870376 -0.9999099 0.9977452 0.9896992 -0.9999288 0.9968597 0.9918234 -0.9999437 0.9966665 0.9935154 -0.989582 0.9999099 0.9897004 -0.989582 0.9999099 0.9897004 -0.989582 0.9999099 0.9897004 -0.989582 0.9999099 0.9897003 -0.989582 0.9999099 0.9897003 -0.9895819 0.9999099 0.9897003 -0.9895819 0.9999099 0.9897002 -0.9895819 0.9999099 0.9897002 -0.9895819 0.9999099 0.9897001 -0.9895818 0.9999099 0.9897 -0.9895818 0.9999099 0.9896999 -0.9895818 0.9999099 0.9896998 -0.9895817 0.9999099 0.9896996 -0.9895817 0.9999099 0.9896995 -0.9895817 0.9999099 0.9896993 -0.9895819 0.9999099 0.9896992 -0.9895821 0.9999099 0.9896992 -0.9895825 0.9999099 0.9896992 -0.9895829 0.9999099 0.9896992 -0.9895835 0.9999099 0.9896992 -0.9895842 0.9999099 0.9896992 -0.9895851 0.9999099 0.9896992 -0.9895863 0.9999099 0.9896992 -0.9895878 0.9999099 0.9896992 -0.9895897 0.9999099 0.9896992 -0.989592 0.9999099 0.9896992 -0.989595 0.9999099 0.9896992 -0.9895988 0.9999099 0.9896992 -0.9896036 0.9999099 0.9896992 -0.9896096 0.9999099 0.9896992 -0.9896173 0.9999099 0.9896992 -0.989627 0.9999099 0.9896992 -0.9896392 0.9999099 0.9896992 -0.9896547 0.9999099 0.9896992 -0.9896744 0.9999099 0.9896992 -0.9896992 0.9999099 0.9896992 -0.9897306 0.9999099 0.9896992 -0.9897703 0.9999099 0.9896992 -0.9898206 0.9999099 0.9896992 -0.9898842 0.9999099 0.9896992 -0.9899646 0.9999099 0.9896992 -0.9900664 0.9999099 0.9896992 -0.9901951 0.9999099 0.9896992 -0.990358 0.9999099 0.9896992 -0.9905641 0.9999099 0.9896992 -0.9908248 0.9999099 0.9896992 -0.9911547 0.9999099 0.9896992 -0.991572 0.9999099 0.9896992 -0.9920999 0.9999099 0.9896992 -0.9927678 0.9999099 0.9896992 -0.9936128 0.9999099 0.9896992 -0.9946818 0.9999099 0.9896992 -0.9960342 0.9999099 0.9896992 -0.9977452 0.9999099 0.9896992 -0.9999099 0.9999099 0.9896992 -0.9999288 0.9982146 0.9918234 -0.9999437 0.9975143 0.9935154 -0.9917501 0.9999288 0.9918242 -0.9917501 0.9999288 0.9918242 -0.9917501 0.9999288 0.9918242 -0.9917501 0.9999288 0.9918242 -0.9917501 0.9999288 0.9918241 -0.9917501 0.9999288 0.9918241 -0.99175 0.9999288 0.9918241 -0.99175 0.9999288 0.9918241 -0.99175 0.9999288 0.991824 -0.99175 0.9999288 0.9918239 -0.99175 0.9999288 0.9918239 -0.9917499 0.9999288 0.9918238 -0.9917499 0.9999288 0.9918237 -0.9917499 0.9999288 0.9918236 -0.9917499 0.9999288 0.9918235 -0.99175 0.9999288 0.9918235 -0.9917502 0.9999288 0.9918234 -0.9917504 0.9999288 0.9918234 -0.9917507 0.9999288 0.9918234 -0.991751 0.9999288 0.9918234 -0.9917515 0.9999288 0.9918234 -0.9917521 0.9999288 0.9918234 -0.9917528 0.9999288 0.9918234 -0.9917537 0.9999288 0.9918234 -0.9917549 0.9999288 0.9918234 -0.9917564 0.9999288 0.9918234 -0.9917582 0.9999288 0.9918234 -0.9917606 0.9999288 0.9918234 -0.9917636 0.9999288 0.9918234 -0.9917674 0.9999288 0.9918234 -0.9917722 0.9999288 0.9918234 -0.9917782 0.9999288 0.9918234 -0.9917859 0.9999288 0.9918234 -0.9917956 0.9999288 0.9918234 -0.9918079 0.9999288 0.9918234 -0.9918234 0.9999288 0.9918234 -0.9918431 0.9999288 0.9918234 -0.991868 0.9999288 0.9918234 -0.9918994 0.9999288 0.9918234 -0.9919392 0.9999288 0.9918234 -0.9919896 0.9999288 0.9918234 -0.9920533 0.9999288 0.9918234 -0.9921339 0.9999288 0.9918234 -0.9922358 0.9999288 0.9918234 -0.9923648 0.9999288 0.9918234 -0.992528 0.9999288 0.9918234 -0.9927345 0.9999288 0.9918234 -0.9929957 0.9999288 0.9918234 -0.9933261 0.9999288 0.9918234 -0.9937442 0.9999288 0.9918234 -0.9942731 0.9999288 0.9918234 -0.9949422 0.9999288 0.9918234 -0.9957887 0.9999288 0.9918234 -0.9968597 0.9999288 0.9918234 -0.9982146 0.9999288 0.9918234 -0.9999288 0.9999288 0.9918234 -0.9999437 0.9985868 0.9935154 -0.9934695 0.9999437 0.9935159 -0.9934695 0.9999437 0.9935159 -0.9934695 0.9999437 0.9935158 -0.9934695 0.9999437 0.9935158 -0.9934695 0.9999437 0.9935158 -0.9934695 0.9999437 0.9935158 -0.9934695 0.9999437 0.9935158 -0.9934694 0.9999437 0.9935158 -0.9934694 0.9999437 0.9935157 -0.9934694 0.9999437 0.9935157 -0.9934694 0.9999437 0.9935157 -0.9934694 0.9999437 0.9935156 -0.9934694 0.9999437 0.9935156 -0.9934694 0.9999437 0.9935155 -0.9934694 0.9999437 0.9935154 -0.9934694 0.9999437 0.9935154 -0.9934695 0.9999437 0.9935154 -0.9934697 0.9999437 0.9935154 -0.9934698 0.9999437 0.9935154 -0.9934701 0.9999437 0.9935154 -0.9934704 0.9999437 0.9935154 -0.9934707 0.9999437 0.9935154 -0.9934712 0.9999437 0.9935154 -0.9934718 0.9999437 0.9935154 -0.9934725 0.9999437 0.9935154 -0.9934734 0.9999437 0.9935154 -0.9934746 0.9999437 0.9935154 -0.9934761 0.9999437 0.9935154 -0.9934779 0.9999437 0.9935154 -0.9934803 0.9999437 0.9935154 -0.9934833 0.9999437 0.9935154 -0.9934871 0.9999437 0.9935154 -0.9934919 0.9999437 0.9935154 -0.993498 0.9999437 0.9935154 -0.9935057 0.9999437 0.9935154 -0.9935154 0.9999437 0.9935154 -0.9935277 0.9999437 0.9935154 -0.9935432 0.9999437 0.9935154 -0.9935629 0.9999437 0.9935154 -0.9935878 0.9999437 0.9935154 -0.9936193 0.9999437 0.9935154 -0.9936592 0.9999437 0.9935154 -0.9937096 0.9999437 0.9935154 -0.9937734 0.9999437 0.9935154 -0.9938541 0.9999437 0.9935154 -0.9939562 0.9999437 0.9935154 -0.9940854 0.9999437 0.9935154 -0.9942488 0.9999437 0.9935154 -0.9944556 0.9999437 0.9935154 -0.9947172 0.9999437 0.9935154 -0.9950481 0.9999437 0.9935154 -0.9954668 0.9999437 0.9935154 -0.9959964 0.9999437 0.9935154 -0.9966665 0.9999437 0.9935154 -0.9975143 0.9999437 0.9935154 -0.9985868 0.9999437 0.9935154 -0.9999437 0.9999437 0.9935154 -0.5504963 0.5504963 0.993424 -0.550521 0.5504963 0.993424 -0.5505523 0.5504963 0.993424 -0.5505918 0.5504963 0.993424 -0.5506419 0.5504963 0.993424 -0.5507052 0.5504963 0.993424 -0.5507853 0.5504963 0.993424 -0.5508867 0.5504963 0.993424 -0.5510149 0.5504963 0.993424 -0.5511771 0.5504963 0.993424 -0.5513823 0.5504963 0.993424 -0.551642 0.5504963 0.993424 -0.5519704 0.5504963 0.993424 -0.552386 0.5504963 0.993424 -0.5529117 0.5504963 0.993424 -0.5535769 0.5504963 0.993424 -0.5544184 0.5504963 0.993424 -0.5554829 0.5504963 0.993424 -0.5568298 0.5504963 0.993424 -0.5585337 0.5504963 0.993424 -0.5606894 0.5504963 0.993424 -0.5634166 0.5504963 0.993424 -0.5668669 0.5504963 0.993424 -0.571232 0.5504963 0.993424 -0.5767543 0.5504963 0.993424 -0.5837409 0.5504963 0.993424 -0.5925797 0.5504963 0.993424 -0.603762 0.5504963 0.993424 -0.6179091 0.5504963 0.993424 -0.635807 0.5504963 0.993424 -0.6584502 0.5504963 0.993424 -0.6870967 0.5504963 0.993424 -0.7233383 0.5504963 0.993424 -0.7691886 0.5504963 0.993424 -0.8271953 0.5504963 0.993424 -0.9005812 0.5504963 0.993424 -0.993424 0.5504963 0.993424 -0.9948662 0.6139459 0.9150244 -0.9959813 0.6724572 0.8745738 -0.9968475 0.7251659 0.8593214 -0.997523 0.7716588 0.8598146 -0.9980513 0.8119154 0.8693391 -0.9984653 0.8462171 0.8833426 -0.9987905 0.8750477 0.8988983 -0.9990461 0.8990028 0.9142443 -0.9992474 0.9187175 0.928415 -0.999406 0.9348153 0.9409633 -0.999531 0.9478754 0.9517618 -0.9996296 0.958416 0.9608669 -0.9997074 0.9668873 0.9684301 -0.9997689 0.9736726 0.9746422 -0.9998174 0.9790927 0.9797014 -0.9998557 0.9834129 0.9837946 -0.999886 0.9868505 0.9870897 -0.9999099 0.989582 0.9897318 -0.9999288 0.9917501 0.9918439 -0.9999437 0.9934695 0.9935282 -0.5504963 0.550521 0.993424 -0.5504818 0.5504818 0.9934236 -0.5505131 0.5504818 0.9934236 -0.5505527 0.5504818 0.9934236 -0.5506027 0.5504818 0.9934236 -0.5506661 0.5504818 0.9934236 -0.5507462 0.5504818 0.9934236 -0.5508475 0.5504818 0.9934236 -0.5509758 0.5504818 0.9934236 -0.551138 0.5504818 0.9934236 -0.5513433 0.5504818 0.9934236 -0.5516029 0.5504818 0.9934236 -0.5519314 0.5504818 0.9934236 -0.552347 0.5504818 0.9934236 -0.5528728 0.5504818 0.9934236 -0.553538 0.5504818 0.9934236 -0.5543796 0.5504818 0.9934236 -0.5554442 0.5504818 0.9934236 -0.5567912 0.5504818 0.9934236 -0.5584953 0.5504818 0.9934236 -0.5606511 0.5504818 0.9934236 -0.5633786 0.5504818 0.9934236 -0.5668292 0.5504818 0.9934236 -0.5711946 0.5504818 0.9934236 -0.5767175 0.5504818 0.9934236 -0.5837046 0.5504818 0.9934236 -0.5925443 0.5504818 0.9934236 -0.6037276 0.5504818 0.9934236 -0.6178759 0.5504818 0.9934236 -0.6357753 0.5504818 0.9934236 -0.6584205 0.5504818 0.9934236 -0.6870695 0.5504818 0.9934236 -0.7233143 0.5504818 0.9934236 -0.7691686 0.5504818 0.9934236 -0.8271803 0.5504818 0.9934236 -0.9005727 0.5504818 0.9934236 -0.9934236 0.5504818 0.9934236 -0.994866 0.6139352 0.9150185 -0.9959811 0.6724495 0.8745666 -0.9968474 0.7251605 0.8593148 -0.997523 0.7716551 0.8598093 -0.9980512 0.8119128 0.8693351 -0.9984653 0.8462154 0.8833397 -0.9987905 0.8750466 0.8988963 -0.9990461 0.899002 0.914243 -0.9992474 0.918717 0.9284141 -0.999406 0.9348149 0.9409627 -0.999531 0.9478752 0.9517614 -0.9996296 0.9584159 0.9608667 -0.9997074 0.9668872 0.9684299 -0.9997689 0.9736726 0.9746421 -0.9998174 0.9790927 0.9797013 -0.9998557 0.9834129 0.9837946 -0.999886 0.9868505 0.9870897 -0.9999099 0.989582 0.9897318 -0.9999288 0.9917501 0.9918438 -0.9999437 0.9934695 0.9935281 -0.5504963 0.5505523 0.993424 -0.5504818 0.5505131 0.9934236 -0.550464 0.550464 0.9934231 -0.5505035 0.550464 0.9934231 -0.5505536 0.550464 0.9934231 -0.5506169 0.550464 0.9934231 -0.5506971 0.550464 0.9934231 -0.5507984 0.550464 0.9934231 -0.5509267 0.550464 0.9934231 -0.5510889 0.550464 0.9934231 -0.5512942 0.550464 0.9934231 -0.5515539 0.550464 0.9934231 -0.5518824 0.550464 0.9934231 -0.5522981 0.550464 0.9934231 -0.5528239 0.550464 0.9934231 -0.5534892 0.550464 0.9934231 -0.5543308 0.550464 0.9934231 -0.5553956 0.550464 0.9934231 -0.5567427 0.550464 0.9934231 -0.558447 0.550464 0.9934231 -0.5606031 0.550464 0.9934231 -0.5633309 0.550464 0.9934231 -0.5667818 0.550464 0.9934231 -0.5711477 0.550464 0.9934231 -0.5766712 0.550464 0.9934231 -0.5836591 0.550464 0.9934231 -0.5924997 0.550464 0.9934231 -0.6036842 0.550464 0.9934231 -0.6178341 0.550464 0.9934231 -0.6357355 0.550464 0.9934231 -0.6583832 0.550464 0.9934231 -0.6870354 0.550464 0.9934231 -0.7232841 0.550464 0.9934231 -0.7691435 0.550464 0.9934231 -0.8271616 0.550464 0.9934231 -0.900562 0.550464 0.9934231 -0.9934231 0.550464 0.9934231 -0.9948657 0.6139219 0.915011 -0.9959809 0.6724399 0.8745575 -0.9968473 0.7251537 0.8593065 -0.9975229 0.7716504 0.8598026 -0.9980512 0.8119096 0.86933 -0.9984653 0.8462132 0.8833361 -0.9987904 0.8750451 0.8988938 -0.9990461 0.8990011 0.9142413 -0.9992474 0.9187164 0.928413 -0.999406 0.9348146 0.9409619 -0.999531 0.947875 0.9517609 -0.9996296 0.9584157 0.9608664 -0.9997074 0.9668871 0.9684297 -0.9997689 0.9736725 0.974642 -0.9998174 0.9790927 0.9797012 -0.9998557 0.9834129 0.9837945 -0.999886 0.9868505 0.9870896 -0.9999099 0.989582 0.9897318 -0.9999288 0.9917501 0.9918438 -0.9999437 0.9934695 0.9935281 -0.5504963 0.5505918 0.993424 -0.5504818 0.5505527 0.9934236 -0.550464 0.5505035 0.9934231 -0.5504419 0.5504419 0.9934225 -0.550492 0.5504419 0.9934225 -0.5505553 0.5504419 0.9934225 -0.5506355 0.5504419 0.9934225 -0.5507369 0.5504419 0.9934225 -0.5508651 0.5504419 0.9934225 -0.5510274 0.5504419 0.9934225 -0.5512327 0.5504419 0.9934225 -0.5514924 0.5504419 0.9934225 -0.551821 0.5504419 0.9934225 -0.5522367 0.5504419 0.9934225 -0.5527626 0.5504419 0.9934225 -0.553428 0.5504419 0.9934225 -0.5542698 0.5504419 0.9934225 -0.5553347 0.5504419 0.9934225 -0.556682 0.5504419 0.9934225 -0.5583865 0.5504419 0.9934225 -0.5605429 0.5504419 0.9934225 -0.563271 0.5504419 0.9934225 -0.5667225 0.5504419 0.9934225 -0.571089 0.5504419 0.9934225 -0.5766132 0.5504419 0.9934225 -0.5836021 0.5504419 0.9934225 -0.5924439 0.5504419 0.9934225 -0.60363 0.5504419 0.9934225 -0.6177818 0.5504419 0.9934225 -0.6356857 0.5504419 0.9934225 -0.6583364 0.5504419 0.9934225 -0.6869926 0.5504419 0.9934225 -0.7232463 0.5504419 0.9934225 -0.769112 0.5504419 0.9934225 -0.8271381 0.5504419 0.9934225 -0.9005487 0.5504419 0.9934225 -0.9934225 0.5504419 0.9934225 -0.9948653 0.6139056 0.9150017 -0.9959807 0.672428 0.8745461 -0.9968472 0.7251454 0.8592962 -0.9975228 0.7716446 0.8597943 -0.9980511 0.8119057 0.8693238 -0.9984653 0.8462106 0.8833316 -0.9987904 0.8750434 0.8988907 -0.9990461 0.899 0.9142392 -0.9992474 0.9187157 0.9284116 -0.999406 0.9348141 0.940961 -0.999531 0.9478746 0.9517603 -0.9996296 0.9584155 0.960866 -0.9997074 0.966887 0.9684295 -0.9997689 0.9736724 0.9746418 -0.9998174 0.9790926 0.9797011 -0.9998557 0.9834129 0.9837945 -0.999886 0.9868505 0.9870896 -0.9999099 0.989582 0.9897317 -0.9999288 0.9917501 0.9918438 -0.9999437 0.9934695 0.9935281 -0.5504963 0.5506419 0.993424 -0.5504818 0.5506027 0.9934236 -0.550464 0.5505536 0.9934231 -0.5504419 0.550492 0.9934225 -0.550415 0.550415 0.9934218 -0.5504784 0.550415 0.9934218 -0.5505585 0.550415 0.9934218 -0.5506599 0.550415 0.9934218 -0.5507882 0.550415 0.9934218 -0.5509505 0.550415 0.9934218 -0.5511558 0.550415 0.9934218 -0.5514156 0.550415 0.9934218 -0.5517442 0.550415 0.9934218 -0.55216 0.550415 0.9934218 -0.552686 0.550415 0.9934218 -0.5533515 0.550415 0.9934218 -0.5541934 0.550415 0.9934218 -0.5552585 0.550415 0.9934218 -0.5566061 0.550415 0.9934218 -0.5583108 0.550415 0.9934218 -0.5604676 0.550415 0.9934218 -0.5631962 0.550415 0.9934218 -0.5666483 0.550415 0.9934218 -0.5710156 0.550415 0.9934218 -0.5765407 0.550415 0.9934218 -0.5835308 0.550415 0.9934218 -0.5923741 0.550415 0.9934218 -0.6035621 0.550415 0.9934218 -0.6177164 0.550415 0.9934218 -0.6356233 0.550415 0.9934218 -0.658278 0.550415 0.9934218 -0.6869391 0.550415 0.9934218 -0.7231991 0.550415 0.9934218 -0.7690727 0.550415 0.9934218 -0.8271087 0.550415 0.9934218 -0.9005319 0.550415 0.9934218 -0.9934218 0.550415 0.9934218 -0.9948649 0.6138855 0.91499 -0.9959804 0.6724135 0.8745319 -0.996847 0.7251351 0.8592832 -0.9975227 0.7716375 0.8597838 -0.9980511 0.8119009 0.8693159 -0.9984652 0.8462073 0.8833259 -0.9987904 0.8750412 0.8988868 -0.9990461 0.8989986 0.9142365 -0.9992474 0.9187148 0.9284098 -0.999406 0.9348135 0.9409599 -0.999531 0.9478743 0.9517596 -0.9996296 0.9584153 0.9608655 -0.9997074 0.9668869 0.9684292 -0.9997689 0.9736723 0.9746416 -0.9998174 0.9790925 0.979701 -0.9998557 0.9834128 0.9837944 -0.999886 0.9868504 0.9870895 -0.9999099 0.989582 0.9897317 -0.9999288 0.9917501 0.9918438 -0.9999437 0.9934695 0.9935281 -0.5504963 0.5507052 0.993424 -0.5504818 0.5506661 0.9934236 -0.550464 0.5506169 0.9934231 -0.5504419 0.5505553 0.9934225 -0.550415 0.5504784 0.9934218 -0.5503825 0.5503825 0.9934209 -0.5504627 0.5503825 0.9934209 -0.5505641 0.5503825 0.9934209 -0.5506924 0.5503825 0.9934209 -0.5508547 0.5503825 0.9934209 -0.5510601 0.5503825 0.9934209 -0.5513199 0.5503825 0.9934209 -0.5516486 0.5503825 0.9934209 -0.5520645 0.5503825 0.9934209 -0.5525906 0.5503825 0.9934209 -0.5532562 0.5503825 0.9934209 -0.5540983 0.5503825 0.9934209 -0.5551637 0.5503825 0.9934209 -0.5565115 0.5503825 0.9934209 -0.5582166 0.5503825 0.9934209 -0.5603739 0.5503825 0.9934209 -0.5631031 0.5503825 0.9934209 -0.5665559 0.5503825 0.9934209 -0.5709241 0.5503825 0.9934209 -0.5764504 0.5503825 0.9934209 -0.583442 0.5503825 0.9934209 -0.5922872 0.5503825 0.9934209 -0.6034776 0.5503825 0.9934209 -0.6176349 0.5503825 0.9934209 -0.6355457 0.5503825 0.9934209 -0.6582052 0.5503825 0.9934209 -0.6868724 0.5503825 0.9934209 -0.7231402 0.5503825 0.9934209 -0.7690236 0.5503825 0.9934209 -0.8270722 0.5503825 0.9934209 -0.9005111 0.5503825 0.9934209 -0.9934209 0.5503825 0.9934209 -0.9948643 0.6138613 0.9149754 -0.9959801 0.6723959 0.8745143 -0.9968468 0.7251226 0.8592671 -0.9975226 0.7716288 0.8597708 -0.998051 0.8118949 0.8693061 -0.9984652 0.8462034 0.8833189 -0.9987904 0.8750386 0.8988819 -0.9990461 0.8989969 0.9142332 -0.9992474 0.9187137 0.9284076 -0.9994059 0.9348128 0.9409584 -0.999531 0.9478738 0.9517586 -0.9996296 0.958415 0.9608649 -0.9997074 0.9668867 0.9684288 -0.9997689 0.9736722 0.9746414 -0.9998174 0.9790925 0.9797009 -0.9998557 0.9834128 0.9837943 -0.999886 0.9868504 0.9870895 -0.9999099 0.9895819 0.9897317 -0.9999288 0.9917501 0.9918438 -0.9999437 0.9934695 0.9935281 -0.5504963 0.5507853 0.993424 -0.5504818 0.5507462 0.9934236 -0.550464 0.5506971 0.9934231 -0.5504419 0.5506355 0.9934225 -0.550415 0.5505585 0.9934218 -0.5503825 0.5504627 0.9934209 -0.5503438 0.5503438 0.9934197 -0.5504452 0.5503438 0.9934197 -0.5505736 0.5503438 0.9934197 -0.550736 0.5503438 0.9934197 -0.5509414 0.5503438 0.9934197 -0.5512013 0.5503438 0.9934197 -0.5515301 0.5503438 0.9934197 -0.5519461 0.5503438 0.9934197 -0.5524723 0.5503438 0.9934197 -0.5531381 0.5503438 0.9934197 -0.5539804 0.5503438 0.9934197 -0.5550461 0.5503438 0.9934197 -0.5563942 0.5503438 0.9934197 -0.5580998 0.5503438 0.9934197 -0.5602576 0.5503438 0.9934197 -0.5629876 0.5503438 0.9934197 -0.5664413 0.5503438 0.9934197 -0.5708106 0.5503438 0.9934197 -0.5763385 0.5503438 0.9934197 -0.5833319 0.5503438 0.9934197 -0.5921795 0.5503438 0.9934197 -0.6033728 0.5503438 0.9934197 -0.6175339 0.5503438 0.9934197 -0.6354495 0.5503438 0.9934197 -0.658115 0.5503438 0.9934197 -0.6867898 0.5503438 0.9934197 -0.7230672 0.5503438 0.9934197 -0.7689629 0.5503438 0.9934197 -0.8270268 0.5503438 0.9934197 -0.9004852 0.5503438 0.9934197 -0.9934197 0.5503438 0.9934197 -0.9948636 0.6138323 0.9149574 -0.9959797 0.6723748 0.8744923 -0.9968465 0.7251076 0.8592471 -0.9975224 0.7716184 0.8597546 -0.9980509 0.8118878 0.869294 -0.9984651 0.8461986 0.8833102 -0.9987903 0.8750355 0.8988759 -0.9990461 0.8989948 0.9142291 -0.9992473 0.9187123 0.9284049 -0.9994059 0.9348119 0.9409566 -0.999531 0.9478733 0.9517575 -0.9996296 0.9584146 0.9608641 -0.9997074 0.9668865 0.9684283 -0.9997689 0.9736721 0.9746411 -0.9998174 0.9790924 0.9797007 -0.9998557 0.9834127 0.9837942 -0.999886 0.9868504 0.9870894 -0.9999099 0.9895819 0.9897316 -0.9999288 0.99175 0.9918437 -0.9999437 0.9934695 0.9935281 -0.5504963 0.5508867 0.993424 -0.5504818 0.5508475 0.9934236 -0.550464 0.5507984 0.9934231 -0.5504419 0.5507369 0.9934225 -0.550415 0.5506599 0.9934218 -0.5503825 0.5505641 0.9934209 -0.5503438 0.5504452 0.9934197 -0.5502987 0.5502987 0.9934183 -0.5504271 0.5502987 0.9934183 -0.5505896 0.5502987 0.9934183 -0.5507951 0.5502987 0.9934183 -0.551055 0.5502987 0.9934183 -0.5513839 0.5502987 0.9934183 -0.5518001 0.5502987 0.9934183 -0.5523265 0.5502987 0.9934183 -0.5529925 0.5502987 0.9934183 -0.5538351 0.5502987 0.9934183 -0.5549011 0.5502987 0.9934183 -0.5562497 0.5502987 0.9934183 -0.5579558 0.5502987 0.9934183 -0.5601144 0.5502987 0.9934183 -0.5628452 0.5502987 0.9934183 -0.5663 0.5502987 0.9934183 -0.5706708 0.5502987 0.9934183 -0.5762005 0.5502987 0.9934183 -0.5831962 0.5502987 0.9934183 -0.5920467 0.5502987 0.9934183 -0.6032437 0.5502987 0.9934183 -0.6174094 0.5502987 0.9934183 -0.6353308 0.5502987 0.9934183 -0.6580038 0.5502987 0.9934183 -0.686688 0.5502987 0.9934183 -0.7229773 0.5502987 0.9934183 -0.7688879 0.5502987 0.9934183 -0.8269709 0.5502987 0.9934183 -0.9004534 0.5502987 0.9934183 -0.9934183 0.5502987 0.9934183 -0.9948628 0.6137984 0.9149351 -0.9959791 0.67235 0.8744653 -0.9968462 0.7250899 0.8592224 -0.9975222 0.7716061 0.8597348 -0.9980508 0.8118794 0.869279 -0.998465 0.8461929 0.8832995 -0.9987903 0.8750317 0.8988684 -0.999046 0.8989923 0.9142241 -0.9992473 0.9187107 0.9284015 -0.9994059 0.9348109 0.9409544 -0.999531 0.9478726 0.951756 -0.9996296 0.9584142 0.9608632 -0.9997074 0.9668862 0.9684277 -0.9997689 0.9736719 0.9746407 -0.9998174 0.9790923 0.9797004 -0.9998557 0.9834127 0.983794 -0.999886 0.9868503 0.9870893 -0.9999099 0.9895819 0.9897316 -0.9999288 0.99175 0.9918437 -0.9999437 0.9934694 0.9935281 -0.5504963 0.5510149 0.993424 -0.5504818 0.5509758 0.9934236 -0.550464 0.5509267 0.9934231 -0.5504419 0.5508651 0.9934225 -0.550415 0.5507882 0.9934218 -0.5503825 0.5506924 0.9934209 -0.5503438 0.5505736 0.9934197 -0.5502987 0.5504271 0.9934183 -0.550248 0.550248 0.9934166 -0.5504105 0.550248 0.9934166 -0.5506161 0.550248 0.9934166 -0.5508762 0.550248 0.9934166 -0.5512052 0.550248 0.9934166 -0.5516215 0.550248 0.9934166 -0.5521481 0.550248 0.9934166 -0.5528144 0.550248 0.9934166 -0.5536574 0.550248 0.9934166 -0.5547238 0.550248 0.9934166 -0.5560729 0.550248 0.9934166 -0.5577798 0.550248 0.9934166 -0.5599391 0.550248 0.9934166 -0.562671 0.550248 0.9934166 -0.5661273 0.550248 0.9934166 -0.5704998 0.550248 0.9934166 -0.5760317 0.550248 0.9934166 -0.5830302 0.550248 0.9934166 -0.5918842 0.550248 0.9934166 -0.6030857 0.550248 0.9934166 -0.6172571 0.550248 0.9934166 -0.6351857 0.550248 0.9934166 -0.6578677 0.550248 0.9934166 -0.6865634 0.550248 0.9934166 -0.7228673 0.550248 0.9934166 -0.7687963 0.550248 0.9934166 -0.8269025 0.550248 0.9934166 -0.9004144 0.550248 0.9934166 -0.9934166 0.550248 0.9934166 -0.9948617 0.6137599 0.9149079 -0.9959785 0.6723217 0.8744323 -0.9968458 0.7250697 0.8591922 -0.997522 0.7715919 0.8597104 -0.9980506 0.8118697 0.8692608 -0.9984649 0.8461864 0.8832864 -0.9987902 0.8750274 0.8988593 -0.999046 0.8989895 0.9142179 -0.9992473 0.9187089 0.9283974 -0.9994059 0.9348097 0.9409517 -0.999531 0.9478718 0.9517543 -0.9996296 0.9584137 0.9608621 -0.9997074 0.9668859 0.968427 -0.9997689 0.9736717 0.9746403 -0.9998174 0.9790921 0.9797001 -0.9998557 0.9834126 0.9837938 -0.999886 0.9868503 0.9870892 -0.9999099 0.9895819 0.9897315 -0.9999288 0.99175 0.9918437 -0.9999437 0.9934694 0.993528 -0.5504963 0.5511771 0.993424 -0.5504818 0.551138 0.9934236 -0.550464 0.5510889 0.9934231 -0.5504419 0.5510274 0.9934225 -0.550415 0.5509505 0.9934218 -0.5503825 0.5508547 0.9934209 -0.5503438 0.550736 0.9934197 -0.5502987 0.5505896 0.9934183 -0.550248 0.5504105 0.9934166 -0.5501939 0.5501939 0.9934145 -0.5503996 0.5501939 0.9934145 -0.5506598 0.5501939 0.9934145 -0.550989 0.5501939 0.9934145 -0.5514055 0.5501939 0.9934145 -0.5519324 0.5501939 0.9934145 -0.552599 0.5501939 0.9934145 -0.5534423 0.5501939 0.9934145 -0.5545093 0.5501939 0.9934145 -0.5558591 0.5501939 0.9934145 -0.5575667 0.5501939 0.9934145 -0.5597272 0.5501939 0.9934145 -0.5624604 0.5501939 0.9934145 -0.5659183 0.5501939 0.9934145 -0.570293 0.5501939 0.9934145 -0.5758275 0.5501939 0.9934145 -0.5828294 0.5501939 0.9934145 -0.5916877 0.5501939 0.9934145 -0.6028946 0.5501939 0.9934145 -0.6170729 0.5501939 0.9934145 -0.6350102 0.5501939 0.9934145 -0.6577032 0.5501939 0.9934145 -0.6864128 0.5501939 0.9934145 -0.7227342 0.5501939 0.9934145 -0.7686854 0.5501939 0.9934145 -0.8268198 0.5501939 0.9934145 -0.9003673 0.5501939 0.9934145 -0.9934145 0.5501939 0.9934145 -0.9948604 0.6137183 0.914875 -0.9959777 0.6722907 0.8743923 -0.9968453 0.7250473 0.8591558 -0.9975217 0.7715762 0.859681 -0.9980504 0.8118589 0.8692387 -0.9984648 0.8461791 0.8832705 -0.9987902 0.8750225 0.8988483 -0.9990459 0.8989863 0.9142104 -0.9992473 0.9187068 0.9283924 -0.9994059 0.9348083 0.9409485 -0.9995309 0.947871 0.9517522 -0.9996296 0.9584132 0.9608607 -0.9997074 0.9668855 0.9684261 -0.9997689 0.9736715 0.9746397 -0.9998174 0.979092 0.9796998 -0.9998557 0.9834125 0.9837936 -0.999886 0.9868502 0.9870891 -0.9999099 0.9895818 0.9897314 -0.9999288 0.99175 0.9918436 -0.9999437 0.9934694 0.993528 -0.5504963 0.5513823 0.993424 -0.5504818 0.5513433 0.9934236 -0.550464 0.5512942 0.9934231 -0.5504419 0.5512327 0.9934225 -0.550415 0.5511558 0.9934218 -0.5503825 0.5510601 0.9934209 -0.5503438 0.5509414 0.9934197 -0.5502987 0.5507951 0.9934183 -0.550248 0.5506161 0.9934166 -0.5501939 0.5503996 0.9934145 -0.5501416 0.5501416 0.993412 -0.550402 0.5501416 0.993412 -0.5507314 0.5501416 0.993412 -0.5511481 0.5501416 0.993412 -0.5516753 0.5501416 0.993412 -0.5523423 0.5501416 0.993412 -0.5531861 0.5501416 0.993412 -0.5542536 0.5501416 0.993412 -0.5556042 0.5501416 0.993412 -0.5573129 0.5501416 0.993412 -0.5594745 0.5501416 0.993412 -0.5622093 0.5501416 0.993412 -0.5656692 0.5501416 0.993412 -0.5700464 0.5501416 0.993412 -0.5755841 0.5501416 0.993412 -0.5825901 0.5501416 0.993412 -0.5914535 0.5501416 0.993412 -0.6026669 0.5501416 0.993412 -0.6168533 0.5501416 0.993412 -0.634801 0.5501416 0.993412 -0.657507 0.5501416 0.993412 -0.6862332 0.5501416 0.993412 -0.7225756 0.5501416 0.993412 -0.7685533 0.5501416 0.993412 -0.8267212 0.5501416 0.993412 -0.9003112 0.5501416 0.993412 -0.993412 0.5501416 0.993412 -0.9948589 0.6136769 0.9148357 -0.9959768 0.6722594 0.8743447 -0.9968448 0.7250244 0.8591123 -0.9975213 0.7715599 0.859646 -0.9980502 0.8118476 0.8692123 -0.9984647 0.8461714 0.8832516 -0.9987901 0.8750173 0.8988352 -0.9990459 0.8989829 0.9142016 -0.9992472 0.9187045 0.9283865 -0.9994059 0.9348069 0.9409446 -0.9995309 0.94787 0.9517496 -0.9996296 0.9584126 0.9608591 -0.9997074 0.9668852 0.9684251 -0.9997689 0.9736712 0.974639 -0.9998174 0.9790919 0.9796994 -0.9998557 0.9834124 0.9837934 -0.999886 0.9868502 0.9870889 -0.9999099 0.9895818 0.9897313 -0.9999288 0.99175 0.9918435 -0.9999437 0.9934694 0.993528 -0.5504963 0.551642 0.993424 -0.5504818 0.5516029 0.9934236 -0.550464 0.5515539 0.9934231 -0.5504419 0.5514924 0.9934225 -0.550415 0.5514156 0.9934218 -0.5503825 0.5513199 0.9934209 -0.5503438 0.5512013 0.9934197 -0.5502987 0.551055 0.9934183 -0.550248 0.5508762 0.9934166 -0.5501939 0.5506598 0.9934145 -0.5501416 0.550402 0.993412 -0.5501012 0.5501012 0.9934091 -0.5504308 0.5501012 0.9934091 -0.5508478 0.5501012 0.9934091 -0.5513754 0.5501012 0.9934091 -0.5520428 0.5501012 0.9934091 -0.5528872 0.5501012 0.9934091 -0.5539555 0.5501012 0.9934091 -0.555307 0.5501012 0.9934091 -0.5570168 0.5501012 0.9934091 -0.5591799 0.5501012 0.9934091 -0.5619166 0.5501012 0.9934091 -0.5653788 0.5501012 0.9934091 -0.5697589 0.5501012 0.9934091 -0.5753003 0.5501012 0.9934091 -0.582311 0.5501012 0.9934091 -0.5911804 0.5501012 0.9934091 -0.6024013 0.5501012 0.9934091 -0.6165973 0.5501012 0.9934091 -0.634557 0.5501012 0.9934091 -0.6572783 0.5501012 0.9934091 -0.6860238 0.5501012 0.9934091 -0.7223906 0.5501012 0.9934091 -0.7683993 0.5501012 0.9934091 -0.8266062 0.5501012 0.9934091 -0.9002457 0.5501012 0.9934091 -0.9934091 0.5501012 0.9934091 -0.9948571 0.6136427 0.91479 -0.9959757 0.6722322 0.8742892 -0.9968441 0.7250039 0.8590617 -0.9975209 0.7715449 0.8596051 -0.99805 0.811837 0.8691816 -0.9984645 0.8461641 0.8832296 -0.99879 0.8750124 0.8988199 -0.9990458 0.8989796 0.9141912 -0.9992472 0.9187024 0.9283796 -0.9994059 0.9348055 0.9409401 -0.9995309 0.9478691 0.9517467 -0.9996296 0.958412 0.9608572 -0.9997074 0.9668848 0.9684239 -0.9997689 0.973671 0.9746383 -0.9998174 0.9790917 0.9796989 -0.9998557 0.9834123 0.983793 -0.999886 0.9868501 0.9870887 -0.9999099 0.9895818 0.9897312 -0.9999288 0.9917499 0.9918435 -0.9999437 0.9934694 0.9935279 -0.5504963 0.5519704 0.993424 -0.5504818 0.5519314 0.9934236 -0.550464 0.5518824 0.9934231 -0.5504419 0.551821 0.9934225 -0.550415 0.5517442 0.9934218 -0.5503825 0.5516486 0.9934209 -0.5503438 0.5515301 0.9934197 -0.5502987 0.5513839 0.9934183 -0.550248 0.5512052 0.9934166 -0.5501939 0.550989 0.9934145 -0.5501416 0.5507314 0.993412 -0.5501012 0.5504308 0.9934091 -0.5500915 0.5500915 0.9934058 -0.5505089 0.5500915 0.9934058 -0.5510368 0.5500915 0.9934058 -0.5517048 0.5500915 0.9934058 -0.5525498 0.5500915 0.9934058 -0.5536189 0.5500915 0.9934058 -0.5549714 0.5500915 0.9934058 -0.5566825 0.5500915 0.9934058 -0.5588473 0.5500915 0.9934058 -0.561586 0.5500915 0.9934058 -0.5650508 0.5500915 0.9934058 -0.5694343 0.5500915 0.9934058 -0.5749799 0.5500915 0.9934058 -0.5819959 0.5500915 0.9934058 -0.590872 0.5500915 0.9934058 -0.6021014 0.5500915 0.9934058 -0.6163081 0.5500915 0.9934058 -0.6342815 0.5500915 0.9934058 -0.6570201 0.5500915 0.9934058 -0.6857874 0.5500915 0.9934058 -0.7221817 0.5500915 0.9934058 -0.7682253 0.5500915 0.9934058 -0.8264764 0.5500915 0.9934058 -0.9001717 0.5500915 0.9934058 -0.9934058 0.5500915 0.9934058 -0.9948551 0.6136284 0.9147384 -0.9959745 0.672218 0.8742266 -0.9968433 0.7249916 0.8590045 -0.9975204 0.7715352 0.859559 -0.9980497 0.8118298 0.869147 -0.9984643 0.8461589 0.8832048 -0.9987899 0.8750088 0.8988027 -0.9990458 0.8989771 0.9141795 -0.9992472 0.9187008 0.9283719 -0.9994058 0.9348044 0.9409349 -0.9995309 0.9478684 0.9517434 -0.9996296 0.9584115 0.9608551 -0.9997074 0.9668845 0.9684225 -0.9997689 0.9736708 0.9746374 -0.9998174 0.9790916 0.9796983 -0.9998557 0.9834122 0.9837927 -0.999886 0.9868501 0.9870885 -0.9999099 0.9895817 0.989731 -0.9999288 0.9917499 0.9918434 -0.9999437 0.9934694 0.9935279 -0.5504963 0.552386 0.993424 -0.5504818 0.552347 0.9934236 -0.550464 0.5522981 0.9934231 -0.5504419 0.5522367 0.9934225 -0.550415 0.55216 0.9934218 -0.5503825 0.5520645 0.9934209 -0.5503438 0.5519461 0.9934197 -0.5502987 0.5518001 0.9934183 -0.550248 0.5516215 0.9934166 -0.5501939 0.5514055 0.9934145 -0.5501416 0.5511481 0.993412 -0.5501012 0.5508478 0.9934091 -0.5500915 0.5505089 0.9934058 -0.5501456 0.5501456 0.9934023 -0.550674 0.5501456 0.9934023 -0.5513425 0.5501456 0.9934023 -0.5521882 0.5501456 0.9934023 -0.5532582 0.5501456 0.9934023 -0.5546118 0.5501456 0.9934023 -0.5563243 0.5501456 0.9934023 -0.5584908 0.5501456 0.9934023 -0.5612317 0.5501456 0.9934023 -0.5646994 0.5501456 0.9934023 -0.5690864 0.5501456 0.9934023 -0.5746366 0.5501456 0.9934023 -0.5816582 0.5501456 0.9934023 -0.5905415 0.5501456 0.9934023 -0.6017801 0.5501456 0.9934023 -0.6159984 0.5501456 0.9934023 -0.6339863 0.5501456 0.9934023 -0.6567433 0.5501456 0.9934023 -0.685534 0.5501456 0.9934023 -0.7219579 0.5501456 0.9934023 -0.7680389 0.5501456 0.9934023 -0.8263373 0.5501456 0.9934023 -0.9000925 0.5501456 0.9934023 -0.9934023 0.5501456 0.9934023 -0.994853 0.6136569 0.9146831 -0.9959732 0.672232 0.8741595 -0.9968425 0.7249978 0.8589433 -0.9975199 0.7715376 0.8595097 -0.9980494 0.8118303 0.86911 -0.9984642 0.8461587 0.8831782 -0.9987897 0.8750084 0.8987842 -0.9990457 0.8989767 0.914167 -0.9992471 0.9187004 0.9283635 -0.9994058 0.9348042 0.9409295 -0.9995309 0.9478683 0.9517398 -0.9996295 0.9584114 0.9608528 -0.9997074 0.9668844 0.968421 -0.9997689 0.9736708 0.9746365 -0.9998174 0.9790916 0.9796977 -0.9998557 0.9834122 0.9837923 -0.999886 0.98685 0.9870882 -0.9999099 0.9895817 0.9897309 -0.9999288 0.9917499 0.9918433 -0.9999437 0.9934694 0.9935278 -0.5504963 0.5529117 0.993424 -0.5504818 0.5528728 0.9934236 -0.550464 0.5528239 0.9934231 -0.5504419 0.5527626 0.9934225 -0.550415 0.552686 0.9934218 -0.5503825 0.5525906 0.9934209 -0.5503438 0.5524723 0.9934197 -0.5502987 0.5523265 0.9934183 -0.550248 0.5521481 0.9934166 -0.5501939 0.5519324 0.9934145 -0.5501416 0.5516753 0.993412 -0.5501012 0.5513754 0.9934091 -0.5500915 0.5510368 0.9934058 -0.5501456 0.550674 0.9934023 -0.5503203 0.5503203 0.9933988 -0.5509893 0.5503203 0.9933988 -0.5518357 0.5503203 0.9933988 -0.5529065 0.5503203 0.9933988 -0.5542612 0.5503203 0.9933988 -0.555975 0.5503203 0.9933988 -0.5581433 0.5503203 0.9933988 -0.5608864 0.5503203 0.9933988 -0.5643568 0.5503203 0.9933988 -0.5687472 0.5503203 0.9933988 -0.5743018 0.5503203 0.9933988 -0.581329 0.5503203 0.9933988 -0.5902194 0.5503203 0.9933988 -0.6014668 0.5503203 0.9933988 -0.6156963 0.5503203 0.9933988 -0.6336985 0.5503203 0.9933988 -0.6564735 0.5503203 0.9933988 -0.685287 0.5503203 0.9933988 -0.7217397 0.5503203 0.9933988 -0.7678572 0.5503203 0.9933988 -0.8262017 0.5503203 0.9933988 -0.9000152 0.5503203 0.9933988 -0.9933988 0.5503203 0.9933988 -0.9948509 0.6137675 0.9146292 -0.9959719 0.6723012 0.8740941 -0.9968418 0.7250408 0.8588837 -0.9975194 0.7715641 0.8594616 -0.9980491 0.8118466 0.8690738 -0.998464 0.8461687 0.8831523 -0.9987896 0.8750145 0.8987663 -0.9990456 0.8989805 0.9141548 -0.9992471 0.9187027 0.9283554 -0.9994058 0.9348056 0.9409242 -0.9995309 0.9478691 0.9517364 -0.9996295 0.958412 0.9608506 -0.9997074 0.9668847 0.9684196 -0.9997688 0.973671 0.9746356 -0.9998174 0.9790917 0.9796971 -0.9998557 0.9834123 0.983792 -0.999886 0.9868501 0.987088 -0.9999099 0.9895817 0.9897307 -0.9999288 0.9917499 0.9918432 -0.9999437 0.9934694 0.9935277 -0.5504963 0.5535769 0.993424 -0.5504818 0.553538 0.9934236 -0.550464 0.5534892 0.9934231 -0.5504419 0.553428 0.9934225 -0.550415 0.5533515 0.9934218 -0.5503825 0.5532562 0.9934209 -0.5503438 0.5531381 0.9934197 -0.5502987 0.5529925 0.9934183 -0.550248 0.5528144 0.9934166 -0.5501939 0.552599 0.9934145 -0.5501416 0.5523423 0.993412 -0.5501012 0.5520428 0.9934091 -0.5500915 0.5517048 0.9934058 -0.5501456 0.5513425 0.9934023 -0.5503203 0.5509893 0.9933988 -0.5507113 0.5507113 0.9933961 -0.5515582 0.5507113 0.9933961 -0.5526297 0.5507113 0.9933961 -0.5539852 0.5507113 0.9933961 -0.5557001 0.5507113 0.9933961 -0.5578697 0.5507113 0.9933961 -0.5606145 0.5507113 0.9933961 -0.5640871 0.5507113 0.9933961 -0.5684803 0.5507113 0.9933961 -0.5740383 0.5507113 0.9933961 -0.5810699 0.5507113 0.9933961 -0.5899658 0.5507113 0.9933961 -0.6012203 0.5507113 0.9933961 -0.6154586 0.5507113 0.9933961 -0.633472 0.5507113 0.9933961 -0.6562612 0.5507113 0.9933961 -0.6850926 0.5507113 0.9933961 -0.721568 0.5507113 0.9933961 -0.7677141 0.5507113 0.9933961 -0.826095 0.5507113 0.9933961 -0.8999544 0.5507113 0.9933961 -0.9933961 0.5507113 0.9933961 -0.9948493 0.6140266 0.9145867 -0.9959709 0.6724711 0.8740427 -0.9968411 0.7251511 0.8588368 -0.9975191 0.7716352 0.8594238 -0.9980488 0.8118921 0.8690454 -0.9984638 0.8461977 0.883132 -0.9987895 0.8750329 0.8987521 -0.9990456 0.8989921 0.9141453 -0.999247 0.9187101 0.9283491 -0.9994057 0.9348102 0.94092 -0.9995309 0.947872 0.9517337 -0.9996295 0.9584138 0.9608488 -0.9997074 0.9668859 0.9684185 -0.9997688 0.9736717 0.9746348 -0.9998174 0.9790921 0.9796967 -0.9998557 0.9834126 0.9837917 -0.999886 0.9868503 0.9870878 -0.9999099 0.9895819 0.9897306 -0.9999288 0.99175 0.9918431 -0.9999437 0.9934694 0.9935277 -0.5504963 0.5544184 0.993424 -0.5504818 0.5543796 0.9934236 -0.550464 0.5543308 0.9934231 -0.5504419 0.5542698 0.9934225 -0.550415 0.5541934 0.9934218 -0.5503825 0.5540983 0.9934209 -0.5503438 0.5539804 0.9934197 -0.5502987 0.5538351 0.9934183 -0.550248 0.5536574 0.9934166 -0.5501939 0.5534423 0.9934145 -0.5501416 0.5531861 0.993412 -0.5501012 0.5528872 0.9934091 -0.5500915 0.5525498 0.9934058 -0.5501456 0.5521882 0.9934023 -0.5503203 0.5518357 0.9933988 -0.5507113 0.5515582 0.9933961 -0.5514695 0.5514695 0.9933953 -0.5525411 0.5514695 0.9933953 -0.5538969 0.5514695 0.9933953 -0.5556122 0.5514695 0.9933953 -0.5577822 0.5514695 0.9933953 -0.5605276 0.5514695 0.9933953 -0.5640008 0.5514695 0.9933953 -0.5683949 0.5514695 0.9933953 -0.573954 0.5514695 0.9933953 -0.580987 0.5514695 0.9933953 -0.5898847 0.5514695 0.9933953 -0.6011414 0.5514695 0.9933953 -0.6153825 0.5514695 0.9933953 -0.6333995 0.5514695 0.9933953 -0.6561933 0.5514695 0.9933953 -0.6850303 0.5514695 0.9933953 -0.721513 0.5514695 0.9933953 -0.7676683 0.5514695 0.9933953 -0.8260608 0.5514695 0.9933953 -0.8999349 0.5514695 0.9933953 -0.9933953 0.5514695 0.9933953 -0.9948487 0.6145393 0.9145732 -0.9959706 0.6728136 0.8740262 -0.9968409 0.7253775 0.8588218 -0.9975189 0.7717834 0.8594117 -0.9980488 0.8119884 0.8690364 -0.9984638 0.8462598 0.8831255 -0.9987895 0.8750727 0.8987476 -0.9990455 0.8990175 0.9141422 -0.999247 0.9187262 0.928347 -0.9994057 0.9348204 0.9409186 -0.9995308 0.9478785 0.9517328 -0.9996295 0.9584178 0.9608482 -0.9997074 0.9668884 0.9684181 -0.9997688 0.9736733 0.9746346 -0.9998174 0.9790931 0.9796966 -0.9998557 0.9834132 0.9837916 -0.999886 0.9868507 0.9870878 -0.9999099 0.9895821 0.9897306 -0.9999288 0.9917502 0.9918431 -0.9999437 0.9934695 0.9935277 -0.5504963 0.5554829 0.993424 -0.5504818 0.5554442 0.9934236 -0.550464 0.5553956 0.9934231 -0.5504419 0.5553347 0.9934225 -0.550415 0.5552585 0.9934218 -0.5503825 0.5551637 0.9934209 -0.5503438 0.5550461 0.9934197 -0.5502987 0.5549011 0.9934183 -0.550248 0.5547238 0.9934166 -0.5501939 0.5545093 0.9934145 -0.5501416 0.5542536 0.993412 -0.5501012 0.5539555 0.9934091 -0.5500915 0.5536189 0.9934058 -0.5501456 0.5532582 0.9934023 -0.5503203 0.5529065 0.9933988 -0.5507113 0.5526297 0.9933961 -0.5514695 0.5525411 0.9933953 -0.5525411 0.5525411 0.9933953 -0.5538969 0.5525411 0.9933953 -0.5556122 0.5525411 0.9933953 -0.5577822 0.5525411 0.9933953 -0.5605276 0.5525411 0.9933953 -0.5640008 0.5525411 0.9933953 -0.5683949 0.5525411 0.9933953 -0.573954 0.5525411 0.9933953 -0.580987 0.5525411 0.9933953 -0.5898847 0.5525411 0.9933953 -0.6011414 0.5525411 0.9933953 -0.6153825 0.5525411 0.9933953 -0.6333995 0.5525411 0.9933953 -0.6561933 0.5525411 0.9933953 -0.6850303 0.5525411 0.9933953 -0.721513 0.5525411 0.9933953 -0.7676683 0.5525411 0.9933953 -0.8260608 0.5525411 0.9933953 -0.8999349 0.5525411 0.9933953 -0.9933953 0.5525411 0.9933953 -0.9948487 0.6152669 0.9145732 -0.9959706 0.6733015 0.8740262 -0.9968409 0.7257011 0.8588218 -0.9975189 0.7719959 0.8594117 -0.9980488 0.8121268 0.8690364 -0.9984638 0.8463492 0.8831255 -0.9987895 0.8751301 0.8987476 -0.9990455 0.8990542 0.9141422 -0.999247 0.9187495 0.928347 -0.9994057 0.9348352 0.9409186 -0.9995308 0.9478878 0.9517328 -0.9996295 0.9584237 0.9608482 -0.9997074 0.9668922 0.9684181 -0.9997688 0.9736756 0.9746346 -0.9998174 0.9790946 0.9796966 -0.9998557 0.9834141 0.9837916 -0.999886 0.9868512 0.9870878 -0.9999099 0.9895825 0.9897306 -0.9999288 0.9917504 0.9918431 -0.9999437 0.9934697 0.9935277 -0.5504963 0.5568298 0.993424 -0.5504818 0.5567912 0.9934236 -0.550464 0.5567427 0.9934231 -0.5504419 0.556682 0.9934225 -0.550415 0.5566061 0.9934218 -0.5503825 0.5565115 0.9934209 -0.5503438 0.5563942 0.9934197 -0.5502987 0.5562497 0.9934183 -0.550248 0.5560729 0.9934166 -0.5501939 0.5558591 0.9934145 -0.5501416 0.5556042 0.993412 -0.5501012 0.555307 0.9934091 -0.5500915 0.5549714 0.9934058 -0.5501456 0.5546118 0.9934023 -0.5503203 0.5542612 0.9933988 -0.5507113 0.5539852 0.9933961 -0.5514695 0.5538969 0.9933953 -0.5525411 0.5538969 0.9933953 -0.5538969 0.5538969 0.9933953 -0.5556122 0.5538969 0.9933953 -0.5577822 0.5538969 0.9933953 -0.5605276 0.5538969 0.9933953 -0.5640008 0.5538969 0.9933953 -0.5683949 0.5538969 0.9933953 -0.573954 0.5538969 0.9933953 -0.580987 0.5538969 0.9933953 -0.5898847 0.5538969 0.9933953 -0.6011414 0.5538969 0.9933953 -0.6153825 0.5538969 0.9933953 -0.6333995 0.5538969 0.9933953 -0.6561933 0.5538969 0.9933953 -0.6850303 0.5538969 0.9933953 -0.721513 0.5538969 0.9933953 -0.7676683 0.5538969 0.9933953 -0.8260608 0.5538969 0.9933953 -0.8999349 0.5538969 0.9933953 -0.9933953 0.5538969 0.9933953 -0.9948487 0.6161874 0.9145732 -0.9959706 0.6739188 0.8740262 -0.9968409 0.7261105 0.8588218 -0.9975189 0.7722648 0.8594117 -0.9980488 0.8123018 0.8690364 -0.9984638 0.8464623 0.8831255 -0.9987895 0.8752028 0.8987476 -0.9990455 0.8991006 0.9141422 -0.999247 0.9187791 0.928347 -0.9994057 0.9348539 0.9409186 -0.9995308 0.9478997 0.9517328 -0.9996295 0.9584312 0.9608482 -0.9997074 0.9668969 0.9684181 -0.9997688 0.9736786 0.9746346 -0.9998174 0.9790965 0.9796966 -0.9998557 0.9834153 0.9837916 -0.999886 0.986852 0.9870878 -0.9999099 0.9895829 0.9897306 -0.9999288 0.9917507 0.9918431 -0.9999437 0.9934698 0.9935277 -0.5504963 0.5585337 0.993424 -0.5504818 0.5584953 0.9934236 -0.550464 0.558447 0.9934231 -0.5504419 0.5583865 0.9934225 -0.550415 0.5583108 0.9934218 -0.5503825 0.5582166 0.9934209 -0.5503438 0.5580998 0.9934197 -0.5502987 0.5579558 0.9934183 -0.550248 0.5577798 0.9934166 -0.5501939 0.5575667 0.9934145 -0.5501416 0.5573129 0.993412 -0.5501012 0.5570168 0.9934091 -0.5500915 0.5566825 0.9934058 -0.5501456 0.5563243 0.9934023 -0.5503203 0.555975 0.9933988 -0.5507113 0.5557001 0.9933961 -0.5514695 0.5556122 0.9933953 -0.5525411 0.5556122 0.9933953 -0.5538969 0.5556122 0.9933953 -0.5556122 0.5556122 0.9933953 -0.5577822 0.5556122 0.9933953 -0.5605276 0.5556122 0.9933953 -0.5640008 0.5556122 0.9933953 -0.5683949 0.5556122 0.9933953 -0.573954 0.5556122 0.9933953 -0.580987 0.5556122 0.9933953 -0.5898847 0.5556122 0.9933953 -0.6011414 0.5556122 0.9933953 -0.6153825 0.5556122 0.9933953 -0.6333995 0.5556122 0.9933953 -0.6561933 0.5556122 0.9933953 -0.6850303 0.5556122 0.9933953 -0.721513 0.5556122 0.9933953 -0.7676683 0.5556122 0.9933953 -0.8260608 0.5556122 0.9933953 -0.8999349 0.5556122 0.9933953 -0.9933953 0.5556122 0.9933953 -0.9948487 0.6173519 0.9145732 -0.9959706 0.6746998 0.8740262 -0.9968409 0.7266285 0.8588218 -0.9975189 0.7726049 0.8594117 -0.9980488 0.8125232 0.8690364 -0.9984638 0.8466054 0.8831255 -0.9987895 0.8752947 0.8987476 -0.9990455 0.8991593 0.9141422 -0.999247 0.9188164 0.928347 -0.9994057 0.9348776 0.9409186 -0.9995308 0.9479146 0.9517328 -0.9996295 0.9584406 0.9608482 -0.9997074 0.9669028 0.9684181 -0.9997688 0.9736823 0.9746346 -0.9998174 0.9790988 0.9796966 -0.9998557 0.9834167 0.9837916 -0.999886 0.9868529 0.9870878 -0.9999099 0.9895835 0.9897306 -0.9999288 0.991751 0.9918431 -0.9999437 0.9934701 0.9935277 -0.5504963 0.5606894 0.993424 -0.5504818 0.5606511 0.9934236 -0.550464 0.5606031 0.9934231 -0.5504419 0.5605429 0.9934225 -0.550415 0.5604676 0.9934218 -0.5503825 0.5603739 0.9934209 -0.5503438 0.5602576 0.9934197 -0.5502987 0.5601144 0.9934183 -0.550248 0.5599391 0.9934166 -0.5501939 0.5597272 0.9934145 -0.5501416 0.5594745 0.993412 -0.5501012 0.5591799 0.9934091 -0.5500915 0.5588473 0.9934058 -0.5501456 0.5584908 0.9934023 -0.5503203 0.5581433 0.9933988 -0.5507113 0.5578697 0.9933961 -0.5514695 0.5577822 0.9933953 -0.5525411 0.5577822 0.9933953 -0.5538969 0.5577822 0.9933953 -0.5556122 0.5577822 0.9933953 -0.5577822 0.5577822 0.9933953 -0.5605276 0.5577822 0.9933953 -0.5640008 0.5577822 0.9933953 -0.5683949 0.5577822 0.9933953 -0.573954 0.5577822 0.9933953 -0.580987 0.5577822 0.9933953 -0.5898847 0.5577822 0.9933953 -0.6011414 0.5577822 0.9933953 -0.6153825 0.5577822 0.9933953 -0.6333995 0.5577822 0.9933953 -0.6561933 0.5577822 0.9933953 -0.6850303 0.5577822 0.9933953 -0.721513 0.5577822 0.9933953 -0.7676683 0.5577822 0.9933953 -0.8260608 0.5577822 0.9933953 -0.8999349 0.5577822 0.9933953 -0.9933953 0.5577822 0.9933953 -0.9948487 0.6188252 0.9145732 -0.9959706 0.6756878 0.8740262 -0.9968409 0.7272837 0.8588218 -0.9975189 0.7730352 0.8594117 -0.9980488 0.8128033 0.8690364 -0.9984638 0.8467864 0.8831255 -0.9987895 0.8754109 0.8987476 -0.9990455 0.8992336 0.9141422 -0.999247 0.9188636 0.928347 -0.9994057 0.9349075 0.9409186 -0.9995308 0.9479335 0.9517328 -0.9996295 0.9584526 0.9608482 -0.9997074 0.9669103 0.9684181 -0.9997688 0.973687 0.9746346 -0.9998174 0.9791018 0.9796966 -0.9998557 0.9834186 0.9837916 -0.999886 0.9868541 0.9870878 -0.9999099 0.9895842 0.9897306 -0.9999288 0.9917515 0.9918431 -0.9999437 0.9934704 0.9935277 -0.5504963 0.5634166 0.993424 -0.5504818 0.5633786 0.9934236 -0.550464 0.5633309 0.9934231 -0.5504419 0.563271 0.9934225 -0.550415 0.5631962 0.9934218 -0.5503825 0.5631031 0.9934209 -0.5503438 0.5629876 0.9934197 -0.5502987 0.5628452 0.9934183 -0.550248 0.562671 0.9934166 -0.5501939 0.5624604 0.9934145 -0.5501416 0.5622093 0.993412 -0.5501012 0.5619166 0.9934091 -0.5500915 0.561586 0.9934058 -0.5501456 0.5612317 0.9934023 -0.5503203 0.5608864 0.9933988 -0.5507113 0.5606145 0.9933961 -0.5514695 0.5605276 0.9933953 -0.5525411 0.5605276 0.9933953 -0.5538969 0.5605276 0.9933953 -0.5556122 0.5605276 0.9933953 -0.5577822 0.5605276 0.9933953 -0.5605276 0.5605276 0.9933953 -0.5640008 0.5605276 0.9933953 -0.5683949 0.5605276 0.9933953 -0.573954 0.5605276 0.9933953 -0.580987 0.5605276 0.9933953 -0.5898847 0.5605276 0.9933953 -0.6011414 0.5605276 0.9933953 -0.6153825 0.5605276 0.9933953 -0.6333995 0.5605276 0.9933953 -0.6561933 0.5605276 0.9933953 -0.6850303 0.5605276 0.9933953 -0.721513 0.5605276 0.9933953 -0.7676683 0.5605276 0.9933953 -0.8260608 0.5605276 0.9933953 -0.8999349 0.5605276 0.9933953 -0.9933953 0.5605276 0.9933953 -0.9948487 0.6206891 0.9145732 -0.9959706 0.6769378 0.8740262 -0.9968409 0.7281127 0.8588218 -0.9975189 0.7735795 0.8594117 -0.9980488 0.8131577 0.8690364 -0.9984638 0.8470154 0.8831255 -0.9987895 0.875558 0.8987476 -0.9990455 0.8993275 0.9141422 -0.999247 0.9189234 0.928347 -0.9994057 0.9349454 0.9409186 -0.9995308 0.9479575 0.9517328 -0.9996295 0.9584677 0.9608482 -0.9997074 0.9669198 0.9684181 -0.9997688 0.973693 0.9746346 -0.9998174 0.9791055 0.9796966 -0.9998557 0.9834209 0.9837916 -0.999886 0.9868555 0.9870878 -0.9999099 0.9895851 0.9897306 -0.9999288 0.9917521 0.9918431 -0.9999437 0.9934707 0.9935277 -0.5504963 0.5668669 0.993424 -0.5504818 0.5668292 0.9934236 -0.550464 0.5667818 0.9934231 -0.5504419 0.5667225 0.9934225 -0.550415 0.5666483 0.9934218 -0.5503825 0.5665559 0.9934209 -0.5503438 0.5664413 0.9934197 -0.5502987 0.5663 0.9934183 -0.550248 0.5661273 0.9934166 -0.5501939 0.5659183 0.9934145 -0.5501416 0.5656692 0.993412 -0.5501012 0.5653788 0.9934091 -0.5500915 0.5650508 0.9934058 -0.5501456 0.5646994 0.9934023 -0.5503203 0.5643568 0.9933988 -0.5507113 0.5640871 0.9933961 -0.5514695 0.5640008 0.9933953 -0.5525411 0.5640008 0.9933953 -0.5538969 0.5640008 0.9933953 -0.5556122 0.5640008 0.9933953 -0.5577822 0.5640008 0.9933953 -0.5605276 0.5640008 0.9933953 -0.5640008 0.5640008 0.9933953 -0.5683949 0.5640008 0.9933953 -0.573954 0.5640008 0.9933953 -0.580987 0.5640008 0.9933953 -0.5898847 0.5640008 0.9933953 -0.6011414 0.5640008 0.9933953 -0.6153825 0.5640008 0.9933953 -0.6333995 0.5640008 0.9933953 -0.6561933 0.5640008 0.9933953 -0.6850303 0.5640008 0.9933953 -0.721513 0.5640008 0.9933953 -0.7676683 0.5640008 0.9933953 -0.8260608 0.5640008 0.9933953 -0.8999349 0.5640008 0.9933953 -0.9933953 0.5640008 0.9933953 -0.9948487 0.6230471 0.9145732 -0.9959706 0.6785192 0.8740262 -0.9968409 0.7291615 0.8588218 -0.9975189 0.7742682 0.8594117 -0.9980488 0.8136061 0.8690364 -0.9984638 0.8473052 0.8831255 -0.9987895 0.8757441 0.8987476 -0.9990455 0.8994464 0.9141422 -0.999247 0.918999 0.928347 -0.9994057 0.9349933 0.9409186 -0.9995308 0.9479878 0.9517328 -0.9996295 0.9584868 0.9608482 -0.9997074 0.9669318 0.9684181 -0.9997688 0.9737006 0.9746346 -0.9998174 0.9791103 0.9796966 -0.9998557 0.9834239 0.9837916 -0.999886 0.9868574 0.9870878 -0.9999099 0.9895863 0.9897306 -0.9999288 0.9917528 0.9918431 -0.9999437 0.9934712 0.9935277 -0.5504963 0.571232 0.993424 -0.5504818 0.5711946 0.9934236 -0.550464 0.5711477 0.9934231 -0.5504419 0.571089 0.9934225 -0.550415 0.5710156 0.9934218 -0.5503825 0.5709241 0.9934209 -0.5503438 0.5708106 0.9934197 -0.5502987 0.5706708 0.9934183 -0.550248 0.5704998 0.9934166 -0.5501939 0.570293 0.9934145 -0.5501416 0.5700464 0.993412 -0.5501012 0.5697589 0.9934091 -0.5500915 0.5694343 0.9934058 -0.5501456 0.5690864 0.9934023 -0.5503203 0.5687472 0.9933988 -0.5507113 0.5684803 0.9933961 -0.5514695 0.5683949 0.9933953 -0.5525411 0.5683949 0.9933953 -0.5538969 0.5683949 0.9933953 -0.5556122 0.5683949 0.9933953 -0.5577822 0.5683949 0.9933953 -0.5605276 0.5683949 0.9933953 -0.5640008 0.5683949 0.9933953 -0.5683949 0.5683949 0.9933953 -0.573954 0.5683949 0.9933953 -0.580987 0.5683949 0.9933953 -0.5898847 0.5683949 0.9933953 -0.6011414 0.5683949 0.9933953 -0.6153825 0.5683949 0.9933953 -0.6333995 0.5683949 0.9933953 -0.6561933 0.5683949 0.9933953 -0.6850303 0.5683949 0.9933953 -0.721513 0.5683949 0.9933953 -0.7676683 0.5683949 0.9933953 -0.8260608 0.5683949 0.9933953 -0.8999349 0.5683949 0.9933953 -0.9933953 0.5683949 0.9933953 -0.9948487 0.6260304 0.9145732 -0.9959706 0.6805199 0.8740262 -0.9968409 0.7304884 0.8588218 -0.9975189 0.7751395 0.8594117 -0.9980488 0.8141733 0.8690364 -0.9984638 0.8476717 0.8831255 -0.9987895 0.8759795 0.8987476 -0.9990455 0.8995968 0.9141422 -0.999247 0.9190947 0.928347 -0.9994057 0.935054 0.9409186 -0.9995308 0.9480261 0.9517328 -0.9996295 0.9585109 0.9608482 -0.9997074 0.966947 0.9684181 -0.9997688 0.9737101 0.9746346 -0.9998174 0.9791163 0.9796966 -0.9998557 0.9834277 0.9837916 -0.999886 0.9868597 0.9870878 -0.9999099 0.9895878 0.9897306 -0.9999288 0.9917537 0.9918431 -0.9999437 0.9934718 0.9935277 -0.5504963 0.5767543 0.993424 -0.5504818 0.5767175 0.9934236 -0.550464 0.5766712 0.9934231 -0.5504419 0.5766132 0.9934225 -0.550415 0.5765407 0.9934218 -0.5503825 0.5764504 0.9934209 -0.5503438 0.5763385 0.9934197 -0.5502987 0.5762005 0.9934183 -0.550248 0.5760317 0.9934166 -0.5501939 0.5758275 0.9934145 -0.5501416 0.5755841 0.993412 -0.5501012 0.5753003 0.9934091 -0.5500915 0.5749799 0.9934058 -0.5501456 0.5746366 0.9934023 -0.5503203 0.5743018 0.9933988 -0.5507113 0.5740383 0.9933961 -0.5514695 0.573954 0.9933953 -0.5525411 0.573954 0.9933953 -0.5538969 0.573954 0.9933953 -0.5556122 0.573954 0.9933953 -0.5577822 0.573954 0.9933953 -0.5605276 0.573954 0.9933953 -0.5640008 0.573954 0.9933953 -0.5683949 0.573954 0.9933953 -0.573954 0.573954 0.9933953 -0.580987 0.573954 0.9933953 -0.5898847 0.573954 0.9933953 -0.6011414 0.573954 0.9933953 -0.6153825 0.573954 0.9933953 -0.6333995 0.573954 0.9933953 -0.6561933 0.573954 0.9933953 -0.6850303 0.573954 0.9933953 -0.721513 0.573954 0.9933953 -0.7676683 0.573954 0.9933953 -0.8260608 0.573954 0.9933953 -0.8999349 0.573954 0.9933953 -0.9933953 0.573954 0.9933953 -0.9948487 0.6298046 0.9145732 -0.9959706 0.683051 0.8740262 -0.9968409 0.732167 0.8588218 -0.9975189 0.7762418 0.8594117 -0.9980488 0.8148909 0.8690364 -0.9984638 0.8481355 0.8831255 -0.9987895 0.8762773 0.8987476 -0.9990455 0.899787 0.9141422 -0.999247 0.9192157 0.928347 -0.9994057 0.9351307 0.9409186 -0.9995308 0.9480746 0.9517328 -0.9996295 0.9585415 0.9608482 -0.9997074 0.9669663 0.9684181 -0.9997688 0.9737222 0.9746346 -0.9998174 0.9791238 0.9796966 -0.9998557 0.9834324 0.9837916 -0.999886 0.9868627 0.9870878 -0.9999099 0.9895897 0.9897306 -0.9999288 0.9917549 0.9918431 -0.9999437 0.9934725 0.9935277 -0.5504963 0.5837409 0.993424 -0.5504818 0.5837046 0.9934236 -0.550464 0.5836591 0.9934231 -0.5504419 0.5836021 0.9934225 -0.550415 0.5835308 0.9934218 -0.5503825 0.583442 0.9934209 -0.5503438 0.5833319 0.9934197 -0.5502987 0.5831962 0.9934183 -0.550248 0.5830302 0.9934166 -0.5501939 0.5828294 0.9934145 -0.5501416 0.5825901 0.993412 -0.5501012 0.582311 0.9934091 -0.5500915 0.5819959 0.9934058 -0.5501456 0.5816582 0.9934023 -0.5503203 0.581329 0.9933988 -0.5507113 0.5810699 0.9933961 -0.5514695 0.580987 0.9933953 -0.5525411 0.580987 0.9933953 -0.5538969 0.580987 0.9933953 -0.5556122 0.580987 0.9933953 -0.5577822 0.580987 0.9933953 -0.5605276 0.580987 0.9933953 -0.5640008 0.580987 0.9933953 -0.5683949 0.580987 0.9933953 -0.573954 0.580987 0.9933953 -0.580987 0.580987 0.9933953 -0.5898847 0.580987 0.9933953 -0.6011414 0.580987 0.9933953 -0.6153825 0.580987 0.9933953 -0.6333995 0.580987 0.9933953 -0.6561933 0.580987 0.9933953 -0.6850303 0.580987 0.9933953 -0.721513 0.580987 0.9933953 -0.7676683 0.580987 0.9933953 -0.8260608 0.580987 0.9933953 -0.8999349 0.580987 0.9933953 -0.9933953 0.580987 0.9933953 -0.9948487 0.6345795 0.9145732 -0.9959706 0.6862532 0.8740262 -0.9968409 0.7342907 0.8588218 -0.9975189 0.7776364 0.8594117 -0.9980488 0.8157988 0.8690364 -0.9984638 0.8487222 0.8831255 -0.9987895 0.8766541 0.8987476 -0.9990455 0.9000277 0.9141422 -0.999247 0.9193688 0.928347 -0.9994057 0.9352277 0.9409186 -0.9995308 0.9481359 0.9517328 -0.9996295 0.9585802 0.9608482 -0.9997074 0.9669906 0.9684181 -0.9997688 0.9737375 0.9746346 -0.9998174 0.9791334 0.9796966 -0.9998557 0.9834385 0.9837916 -0.999886 0.9868665 0.9870878 -0.9999099 0.989592 0.9897306 -0.9999288 0.9917564 0.9918431 -0.9999437 0.9934734 0.9935277 -0.5504963 0.5925797 0.993424 -0.5504818 0.5925443 0.9934236 -0.550464 0.5924997 0.9934231 -0.5504419 0.5924439 0.9934225 -0.550415 0.5923741 0.9934218 -0.5503825 0.5922872 0.9934209 -0.5503438 0.5921795 0.9934197 -0.5502987 0.5920467 0.9934183 -0.550248 0.5918842 0.9934166 -0.5501939 0.5916877 0.9934145 -0.5501416 0.5914535 0.993412 -0.5501012 0.5911804 0.9934091 -0.5500915 0.590872 0.9934058 -0.5501456 0.5905415 0.9934023 -0.5503203 0.5902194 0.9933988 -0.5507113 0.5899658 0.9933961 -0.5514695 0.5898847 0.9933953 -0.5525411 0.5898847 0.9933953 -0.5538969 0.5898847 0.9933953 -0.5556122 0.5898847 0.9933953 -0.5577822 0.5898847 0.9933953 -0.5605276 0.5898847 0.9933953 -0.5640008 0.5898847 0.9933953 -0.5683949 0.5898847 0.9933953 -0.573954 0.5898847 0.9933953 -0.580987 0.5898847 0.9933953 -0.5898847 0.5898847 0.9933953 -0.6011414 0.5898847 0.9933953 -0.6153825 0.5898847 0.9933953 -0.6333995 0.5898847 0.9933953 -0.6561933 0.5898847 0.9933953 -0.6850303 0.5898847 0.9933953 -0.721513 0.5898847 0.9933953 -0.7676683 0.5898847 0.9933953 -0.8260608 0.5898847 0.9933953 -0.8999349 0.5898847 0.9933953 -0.9933953 0.5898847 0.9933953 -0.9948487 0.6406203 0.9145732 -0.9959706 0.6903044 0.8740262 -0.9968409 0.7369774 0.8588218 -0.9975189 0.7794007 0.8594117 -0.9980488 0.8169474 0.8690364 -0.9984638 0.8494644 0.8831255 -0.9987895 0.8771307 0.8987476 -0.9990455 0.9003323 0.9141422 -0.999247 0.9195625 0.928347 -0.9994057 0.9353505 0.9409186 -0.9995308 0.9482135 0.9517328 -0.9996295 0.9586291 0.9608482 -0.9997074 0.9670214 0.9684181 -0.9997688 0.9737569 0.9746346 -0.9998174 0.9791456 0.9796966 -0.9998557 0.9834461 0.9837916 -0.999886 0.9868713 0.9870878 -0.9999099 0.989595 0.9897306 -0.9999288 0.9917582 0.9918431 -0.9999437 0.9934746 0.9935277 -0.5504963 0.603762 0.993424 -0.5504818 0.6037276 0.9934236 -0.550464 0.6036842 0.9934231 -0.5504419 0.60363 0.9934225 -0.550415 0.6035621 0.9934218 -0.5503825 0.6034776 0.9934209 -0.5503438 0.6033728 0.9934197 -0.5502987 0.6032437 0.9934183 -0.550248 0.6030857 0.9934166 -0.5501939 0.6028946 0.9934145 -0.5501416 0.6026669 0.993412 -0.5501012 0.6024013 0.9934091 -0.5500915 0.6021014 0.9934058 -0.5501456 0.6017801 0.9934023 -0.5503203 0.6014668 0.9933988 -0.5507113 0.6012203 0.9933961 -0.5514695 0.6011414 0.9933953 -0.5525411 0.6011414 0.9933953 -0.5538969 0.6011414 0.9933953 -0.5556122 0.6011414 0.9933953 -0.5577822 0.6011414 0.9933953 -0.5605276 0.6011414 0.9933953 -0.5640008 0.6011414 0.9933953 -0.5683949 0.6011414 0.9933953 -0.573954 0.6011414 0.9933953 -0.580987 0.6011414 0.9933953 -0.5898847 0.6011414 0.9933953 -0.6011414 0.6011414 0.9933953 -0.6153825 0.6011414 0.9933953 -0.6333995 0.6011414 0.9933953 -0.6561933 0.6011414 0.9933953 -0.6850303 0.6011414 0.9933953 -0.721513 0.6011414 0.9933953 -0.7676683 0.6011414 0.9933953 -0.8260608 0.6011414 0.9933953 -0.8999349 0.6011414 0.9933953 -0.9933953 0.6011414 0.9933953 -0.9948487 0.6482627 0.9145732 -0.9959706 0.6954296 0.8740262 -0.9968409 0.7403765 0.8588218 -0.9975189 0.7816327 0.8594117 -0.9980488 0.8184005 0.8690364 -0.9984638 0.8504035 0.8831255 -0.9987895 0.8777338 0.8987476 -0.9990455 0.9007175 0.9141422 -0.999247 0.9198076 0.928347 -0.9994057 0.9355059 0.9409186 -0.9995308 0.9483117 0.9517328 -0.9996295 0.958691 0.9608482 -0.9997074 0.9670604 0.9684181 -0.9997688 0.9737814 0.9746346 -0.9998174 0.979161 0.9796966 -0.9998557 0.9834557 0.9837916 -0.999886 0.9868773 0.9870878 -0.9999099 0.9895988 0.9897306 -0.9999288 0.9917606 0.9918431 -0.9999437 0.9934761 0.9935277 -0.5504963 0.6179091 0.993424 -0.5504818 0.6178759 0.9934236 -0.550464 0.6178341 0.9934231 -0.5504419 0.6177818 0.9934225 -0.550415 0.6177164 0.9934218 -0.5503825 0.6176349 0.9934209 -0.5503438 0.6175339 0.9934197 -0.5502987 0.6174094 0.9934183 -0.550248 0.6172571 0.9934166 -0.5501939 0.6170729 0.9934145 -0.5501416 0.6168533 0.993412 -0.5501012 0.6165973 0.9934091 -0.5500915 0.6163081 0.9934058 -0.5501456 0.6159984 0.9934023 -0.5503203 0.6156963 0.9933988 -0.5507113 0.6154586 0.9933961 -0.5514695 0.6153825 0.9933953 -0.5525411 0.6153825 0.9933953 -0.5538969 0.6153825 0.9933953 -0.5556122 0.6153825 0.9933953 -0.5577822 0.6153825 0.9933953 -0.5605276 0.6153825 0.9933953 -0.5640008 0.6153825 0.9933953 -0.5683949 0.6153825 0.9933953 -0.573954 0.6153825 0.9933953 -0.580987 0.6153825 0.9933953 -0.5898847 0.6153825 0.9933953 -0.6011414 0.6153825 0.9933953 -0.6153825 0.6153825 0.9933953 -0.6333995 0.6153825 0.9933953 -0.6561933 0.6153825 0.9933953 -0.6850303 0.6153825 0.9933953 -0.721513 0.6153825 0.9933953 -0.7676683 0.6153825 0.9933953 -0.8260608 0.6153825 0.9933953 -0.8999349 0.6153825 0.9933953 -0.9933953 0.6153825 0.9933953 -0.9948487 0.6579314 0.9145732 -0.9959706 0.7019138 0.8740262 -0.9968409 0.7446768 0.8588218 -0.9975189 0.7844566 0.8594117 -0.9980488 0.8202389 0.8690364 -0.9984638 0.8515915 0.8831255 -0.9987895 0.8784967 0.8987476 -0.9990455 0.9012049 0.9141422 -0.999247 0.9201176 0.928347 -0.9994057 0.9357024 0.9409186 -0.9995308 0.9484359 0.9517328 -0.9996295 0.9587693 0.9608482 -0.9997074 0.9671097 0.9684181 -0.9997688 0.9738123 0.9746346 -0.9998174 0.9791804 0.9796966 -0.9998557 0.9834679 0.9837916 -0.999886 0.986885 0.9870878 -0.9999099 0.9896036 0.9897306 -0.9999288 0.9917636 0.9918431 -0.9999437 0.9934779 0.9935277 -0.5504963 0.635807 0.993424 -0.5504818 0.6357753 0.9934236 -0.550464 0.6357355 0.9934231 -0.5504419 0.6356857 0.9934225 -0.550415 0.6356233 0.9934218 -0.5503825 0.6355457 0.9934209 -0.5503438 0.6354495 0.9934197 -0.5502987 0.6353308 0.9934183 -0.550248 0.6351857 0.9934166 -0.5501939 0.6350102 0.9934145 -0.5501416 0.634801 0.993412 -0.5501012 0.634557 0.9934091 -0.5500915 0.6342815 0.9934058 -0.5501456 0.6339863 0.9934023 -0.5503203 0.6336985 0.9933988 -0.5507113 0.633472 0.9933961 -0.5514695 0.6333995 0.9933953 -0.5525411 0.6333995 0.9933953 -0.5538969 0.6333995 0.9933953 -0.5556122 0.6333995 0.9933953 -0.5577822 0.6333995 0.9933953 -0.5605276 0.6333995 0.9933953 -0.5640008 0.6333995 0.9933953 -0.5683949 0.6333995 0.9933953 -0.573954 0.6333995 0.9933953 -0.580987 0.6333995 0.9933953 -0.5898847 0.6333995 0.9933953 -0.6011414 0.6333995 0.9933953 -0.6153825 0.6333995 0.9933953 -0.6333995 0.6333995 0.9933953 -0.6561933 0.6333995 0.9933953 -0.6850303 0.6333995 0.9933953 -0.721513 0.6333995 0.9933953 -0.7676683 0.6333995 0.9933953 -0.8260608 0.6333995 0.9933953 -0.8999349 0.6333995 0.9933953 -0.9933953 0.6333995 0.9933953 -0.9948487 0.6701635 0.9145732 -0.9959706 0.710117 0.8740262 -0.9968409 0.7501172 0.8588218 -0.9975189 0.7880291 0.8594117 -0.9980488 0.8225647 0.8690364 -0.9984638 0.8530945 0.8831255 -0.9987895 0.8794619 0.8987476 -0.9990455 0.9018215 0.9141422 -0.999247 0.9205098 0.928347 -0.9994057 0.935951 0.9409186 -0.9995308 0.9485931 0.9517328 -0.9996295 0.9588684 0.9608482 -0.9997074 0.967172 0.9684181 -0.9997688 0.9738515 0.9746346 -0.9998174 0.979205 0.9796966 -0.9998557 0.9834833 0.9837916 -0.999886 0.9868946 0.9870878 -0.9999099 0.9896096 0.9897306 -0.9999288 0.9917674 0.9918431 -0.9999437 0.9934803 0.9935277 -0.5504963 0.6584502 0.993424 -0.5504818 0.6584205 0.9934236 -0.550464 0.6583832 0.9934231 -0.5504419 0.6583364 0.9934225 -0.550415 0.658278 0.9934218 -0.5503825 0.6582052 0.9934209 -0.5503438 0.658115 0.9934197 -0.5502987 0.6580038 0.9934183 -0.550248 0.6578677 0.9934166 -0.5501939 0.6577032 0.9934145 -0.5501416 0.657507 0.993412 -0.5501012 0.6572783 0.9934091 -0.5500915 0.6570201 0.9934058 -0.5501456 0.6567433 0.9934023 -0.5503203 0.6564735 0.9933988 -0.5507113 0.6562612 0.9933961 -0.5514695 0.6561933 0.9933953 -0.5525411 0.6561933 0.9933953 -0.5538969 0.6561933 0.9933953 -0.5556122 0.6561933 0.9933953 -0.5577822 0.6561933 0.9933953 -0.5605276 0.6561933 0.9933953 -0.5640008 0.6561933 0.9933953 -0.5683949 0.6561933 0.9933953 -0.573954 0.6561933 0.9933953 -0.580987 0.6561933 0.9933953 -0.5898847 0.6561933 0.9933953 -0.6011414 0.6561933 0.9933953 -0.6153825 0.6561933 0.9933953 -0.6333995 0.6561933 0.9933953 -0.6561933 0.6561933 0.9933953 -0.6850303 0.6561933 0.9933953 -0.721513 0.6561933 0.9933953 -0.7676683 0.6561933 0.9933953 -0.8260608 0.6561933 0.9933953 -0.8999349 0.6561933 0.9933953 -0.9933953 0.6561933 0.9933953 -0.9948487 0.6856388 0.9145732 -0.9959706 0.7204952 0.8740262 -0.9968409 0.757 0.8588218 -0.9975189 0.7925488 0.8594117 -0.9980488 0.8255071 0.8690364 -0.9984638 0.8549959 0.8831255 -0.9987895 0.880683 0.8987476 -0.9990455 0.9026016 0.9141422 -0.999247 0.9210061 0.928347 -0.9994057 0.9362655 0.9409186 -0.9995308 0.9487918 0.9517328 -0.9996295 0.9589938 0.9608482 -0.9997074 0.9672509 0.9684181 -0.9997688 0.9739011 0.9746346 -0.9998174 0.9792361 0.9796966 -0.9998557 0.9835029 0.9837916 -0.999886 0.9869069 0.9870878 -0.9999099 0.9896173 0.9897306 -0.9999288 0.9917722 0.9918431 -0.9999437 0.9934833 0.9935277 -0.5504963 0.6870967 0.993424 -0.5504818 0.6870695 0.9934236 -0.550464 0.6870354 0.9934231 -0.5504419 0.6869926 0.9934225 -0.550415 0.6869391 0.9934218 -0.5503825 0.6868724 0.9934209 -0.5503438 0.6867898 0.9934197 -0.5502987 0.686688 0.9934183 -0.550248 0.6865634 0.9934166 -0.5501939 0.6864128 0.9934145 -0.5501416 0.6862332 0.993412 -0.5501012 0.6860238 0.9934091 -0.5500915 0.6857874 0.9934058 -0.5501456 0.685534 0.9934023 -0.5503203 0.685287 0.9933988 -0.5507113 0.6850926 0.9933961 -0.5514695 0.6850303 0.9933953 -0.5525411 0.6850303 0.9933953 -0.5538969 0.6850303 0.9933953 -0.5556122 0.6850303 0.9933953 -0.5577822 0.6850303 0.9933953 -0.5605276 0.6850303 0.9933953 -0.5640008 0.6850303 0.9933953 -0.5683949 0.6850303 0.9933953 -0.573954 0.6850303 0.9933953 -0.580987 0.6850303 0.9933953 -0.5898847 0.6850303 0.9933953 -0.6011414 0.6850303 0.9933953 -0.6153825 0.6850303 0.9933953 -0.6333995 0.6850303 0.9933953 -0.6561933 0.6850303 0.9933953 -0.6850303 0.6850303 0.9933953 -0.721513 0.6850303 0.9933953 -0.7676683 0.6850303 0.9933953 -0.8260608 0.6850303 0.9933953 -0.8999349 0.6850303 0.9933953 -0.9933953 0.6850303 0.9933953 -0.9948487 0.7052169 0.9145732 -0.9959706 0.733625 0.8740262 -0.9968409 0.7657077 0.8588218 -0.9975189 0.7982669 0.8594117 -0.9980488 0.8292297 0.8690364 -0.9984638 0.8574015 0.8831255 -0.9987895 0.8822279 0.8987476 -0.9990455 0.9035886 0.9141422 -0.999247 0.9216339 0.928347 -0.9994057 0.9366635 0.9409186 -0.9995308 0.9490434 0.9517328 -0.9996295 0.9591524 0.9608482 -0.9997074 0.9673508 0.9684181 -0.9997688 0.9739638 0.9746346 -0.9998174 0.9792755 0.9796966 -0.9998557 0.9835276 0.9837916 -0.999886 0.9869223 0.9870878 -0.9999099 0.989627 0.9897306 -0.9999288 0.9917782 0.9918431 -0.9999437 0.9934871 0.9935277 -0.5504963 0.7233383 0.993424 -0.5504818 0.7233143 0.9934236 -0.550464 0.7232841 0.9934231 -0.5504419 0.7232463 0.9934225 -0.550415 0.7231991 0.9934218 -0.5503825 0.7231402 0.9934209 -0.5503438 0.7230672 0.9934197 -0.5502987 0.7229773 0.9934183 -0.550248 0.7228673 0.9934166 -0.5501939 0.7227342 0.9934145 -0.5501416 0.7225756 0.993412 -0.5501012 0.7223906 0.9934091 -0.5500915 0.7221817 0.9934058 -0.5501456 0.7219579 0.9934023 -0.5503203 0.7217397 0.9933988 -0.5507113 0.721568 0.9933961 -0.5514695 0.721513 0.9933953 -0.5525411 0.721513 0.9933953 -0.5538969 0.721513 0.9933953 -0.5556122 0.721513 0.9933953 -0.5577822 0.721513 0.9933953 -0.5605276 0.721513 0.9933953 -0.5640008 0.721513 0.9933953 -0.5683949 0.721513 0.9933953 -0.573954 0.721513 0.9933953 -0.580987 0.721513 0.9933953 -0.5898847 0.721513 0.9933953 -0.6011414 0.721513 0.9933953 -0.6153825 0.721513 0.9933953 -0.6333995 0.721513 0.9933953 -0.6561933 0.721513 0.9933953 -0.6850303 0.721513 0.9933953 -0.721513 0.721513 0.9933953 -0.7676683 0.721513 0.9933953 -0.8260608 0.721513 0.9933953 -0.8999349 0.721513 0.9933953 -0.9933953 0.721513 0.9933953 -0.9948487 0.7299859 0.9145732 -0.9959706 0.7502359 0.8740262 -0.9968409 0.776724 0.8588218 -0.9975189 0.8055009 0.8594117 -0.9980488 0.8339392 0.8690364 -0.9984638 0.8604449 0.8831255 -0.9987895 0.8841823 0.8987476 -0.9990455 0.9048372 0.9141422 -0.999247 0.9224281 0.928347 -0.9994057 0.9371669 0.9409186 -0.9995308 0.9493615 0.9517328 -0.9996295 0.959353 0.9608482 -0.9997074 0.967477 0.9684181 -0.9997688 0.9740432 0.9746346 -0.9998174 0.9793253 0.9796966 -0.9998557 0.9835588 0.9837916 -0.999886 0.9869419 0.9870878 -0.9999099 0.9896392 0.9897306 -0.9999288 0.9917859 0.9918431 -0.9999437 0.9934919 0.9935277 -0.5504963 0.7691886 0.993424 -0.5504818 0.7691686 0.9934236 -0.550464 0.7691435 0.9934231 -0.5504419 0.769112 0.9934225 -0.550415 0.7690727 0.9934218 -0.5503825 0.7690236 0.9934209 -0.5503438 0.7689629 0.9934197 -0.5502987 0.7688879 0.9934183 -0.550248 0.7687963 0.9934166 -0.5501939 0.7686854 0.9934145 -0.5501416 0.7685533 0.993412 -0.5501012 0.7683993 0.9934091 -0.5500915 0.7682253 0.9934058 -0.5501456 0.7680389 0.9934023 -0.5503203 0.7678572 0.9933988 -0.5507113 0.7677141 0.9933961 -0.5514695 0.7676683 0.9933953 -0.5525411 0.7676683 0.9933953 -0.5538969 0.7676683 0.9933953 -0.5556122 0.7676683 0.9933953 -0.5577822 0.7676683 0.9933953 -0.5605276 0.7676683 0.9933953 -0.5640008 0.7676683 0.9933953 -0.5683949 0.7676683 0.9933953 -0.573954 0.7676683 0.9933953 -0.580987 0.7676683 0.9933953 -0.5898847 0.7676683 0.9933953 -0.6011414 0.7676683 0.9933953 -0.6153825 0.7676683 0.9933953 -0.6333995 0.7676683 0.9933953 -0.6561933 0.7676683 0.9933953 -0.6850303 0.7676683 0.9933953 -0.721513 0.7676683 0.9933953 -0.7676683 0.7676683 0.9933953 -0.8260608 0.7676683 0.9933953 -0.8999349 0.7676683 0.9933953 -0.9933953 0.7676683 0.9933953 -0.9948487 0.7613218 0.9145732 -0.9959706 0.7712508 0.8740262 -0.9968409 0.7906611 0.8588218 -0.9975189 0.8146529 0.8594117 -0.9980488 0.8398974 0.8690364 -0.9984638 0.8642952 0.8831255 -0.9987895 0.886655 0.8987476 -0.9990455 0.9064168 0.9141422 -0.999247 0.9234329 0.928347 -0.9994057 0.9378038 0.9409186 -0.9995308 0.9497641 0.9517328 -0.9996295 0.9596068 0.9608482 -0.9997074 0.9676368 0.9684181 -0.9997688 0.9741436 0.9746346 -0.9998174 0.9793883 0.9796966 -0.9998557 0.9835983 0.9837916 -0.999886 0.9869667 0.9870878 -0.9999099 0.9896547 0.9897306 -0.9999288 0.9917956 0.9918431 -0.9999437 0.993498 0.9935277 -0.5504963 0.8271953 0.993424 -0.5504818 0.8271803 0.9934236 -0.550464 0.8271616 0.9934231 -0.5504419 0.8271381 0.9934225 -0.550415 0.8271087 0.9934218 -0.5503825 0.8270722 0.9934209 -0.5503438 0.8270268 0.9934197 -0.5502987 0.8269709 0.9934183 -0.550248 0.8269025 0.9934166 -0.5501939 0.8268198 0.9934145 -0.5501416 0.8267212 0.993412 -0.5501012 0.8266062 0.9934091 -0.5500915 0.8264764 0.9934058 -0.5501456 0.8263373 0.9934023 -0.5503203 0.8262017 0.9933988 -0.5507113 0.826095 0.9933961 -0.5514695 0.8260608 0.9933953 -0.5525411 0.8260608 0.9933953 -0.5538969 0.8260608 0.9933953 -0.5556122 0.8260608 0.9933953 -0.5577822 0.8260608 0.9933953 -0.5605276 0.8260608 0.9933953 -0.5640008 0.8260608 0.9933953 -0.5683949 0.8260608 0.9933953 -0.573954 0.8260608 0.9933953 -0.580987 0.8260608 0.9933953 -0.5898847 0.8260608 0.9933953 -0.6011414 0.8260608 0.9933953 -0.6153825 0.8260608 0.9933953 -0.6333995 0.8260608 0.9933953 -0.6561933 0.8260608 0.9933953 -0.6850303 0.8260608 0.9933953 -0.721513 0.8260608 0.9933953 -0.7676683 0.8260608 0.9933953 -0.8260608 0.8260608 0.9933953 -0.8999349 0.8260608 0.9933953 -0.9933953 0.8260608 0.9933953 -0.9948487 0.8009659 0.9145732 -0.9959706 0.7978374 0.8740262 -0.9968409 0.8082934 0.8588218 -0.9975189 0.8262314 0.8594117 -0.9980488 0.8474353 0.8690364 -0.9984638 0.8691663 0.8831255 -0.9987895 0.8897832 0.8987476 -0.9990455 0.9084153 0.9141422 -0.999247 0.9247041 0.928347 -0.9994057 0.9386096 0.9409186 -0.9995308 0.9502734 0.9517328 -0.9996295 0.959928 0.9608482 -0.9997074 0.9678389 0.9684181 -0.9997688 0.9742706 0.9746346 -0.9998174 0.9794681 0.9796966 -0.9998557 0.9836483 0.9837916 -0.999886 0.986998 0.9870878 -0.9999099 0.9896744 0.9897306 -0.9999288 0.9918079 0.9918431 -0.9999437 0.9935057 0.9935277 -0.5504963 0.9005812 0.993424 -0.5504818 0.9005727 0.9934236 -0.550464 0.900562 0.9934231 -0.5504419 0.9005487 0.9934225 -0.550415 0.9005319 0.9934218 -0.5503825 0.9005111 0.9934209 -0.5503438 0.9004852 0.9934197 -0.5502987 0.9004534 0.9934183 -0.550248 0.9004144 0.9934166 -0.5501939 0.9003673 0.9934145 -0.5501416 0.9003112 0.993412 -0.5501012 0.9002457 0.9934091 -0.5500915 0.9001717 0.9934058 -0.5501456 0.9000925 0.9934023 -0.5503203 0.9000152 0.9933988 -0.5507113 0.8999544 0.9933961 -0.5514695 0.8999349 0.9933953 -0.5525411 0.8999349 0.9933953 -0.5538969 0.8999349 0.9933953 -0.5556122 0.8999349 0.9933953 -0.5577822 0.8999349 0.9933953 -0.5605276 0.8999349 0.9933953 -0.5640008 0.8999349 0.9933953 -0.5683949 0.8999349 0.9933953 -0.573954 0.8999349 0.9933953 -0.580987 0.8999349 0.9933953 -0.5898847 0.8999349 0.9933953 -0.6011414 0.8999349 0.9933953 -0.6153825 0.8999349 0.9933953 -0.6333995 0.8999349 0.9933953 -0.6561933 0.8999349 0.9933953 -0.6850303 0.8999349 0.9933953 -0.721513 0.8999349 0.9933953 -0.7676683 0.8999349 0.9933953 -0.8260608 0.8999349 0.9933953 -0.8999349 0.8999349 0.9933953 -0.9933953 0.8999349 0.9933953 -0.9948487 0.8511207 0.9145732 -0.9959706 0.8314729 0.8740262 -0.9968409 0.8306004 0.8588218 -0.9975189 0.8408797 0.8594117 -0.9980488 0.8569716 0.8690364 -0.9984638 0.875329 0.8831255 -0.9987895 0.8937407 0.8987476 -0.9990455 0.9109436 0.9141422 -0.999247 0.9263124 0.928347 -0.9994057 0.939629 0.9409186 -0.9995308 0.9509177 0.9517328 -0.9996295 0.9603343 0.9608482 -0.9997074 0.9680946 0.9684181 -0.9997688 0.9744313 0.9746346 -0.9998174 0.9795689 0.9796966 -0.9998557 0.9837116 0.9837916 -0.999886 0.9870376 0.9870878 -0.9999099 0.9896992 0.9897306 -0.9999288 0.9918234 0.9918431 -0.9999437 0.9935154 0.9935277 -0.5504963 0.993424 0.993424 -0.5504818 0.9934236 0.9934236 -0.550464 0.9934231 0.9934231 -0.5504419 0.9934225 0.9934225 -0.550415 0.9934218 0.9934218 -0.5503825 0.9934209 0.9934209 -0.5503438 0.9934197 0.9934197 -0.5502987 0.9934183 0.9934183 -0.550248 0.9934166 0.9934166 -0.5501939 0.9934145 0.9934145 -0.5501416 0.993412 0.993412 -0.5501012 0.9934091 0.9934091 -0.5500915 0.9934058 0.9934058 -0.5501456 0.9934023 0.9934023 -0.5503203 0.9933988 0.9933988 -0.5507113 0.9933961 0.9933961 -0.5514695 0.9933953 0.9933953 -0.5525411 0.9933953 0.9933953 -0.5538969 0.9933953 0.9933953 -0.5556122 0.9933953 0.9933953 -0.5577822 0.9933953 0.9933953 -0.5605276 0.9933953 0.9933953 -0.5640008 0.9933953 0.9933953 -0.5683949 0.9933953 0.9933953 -0.573954 0.9933953 0.9933953 -0.580987 0.9933953 0.9933953 -0.5898847 0.9933953 0.9933953 -0.6011414 0.9933953 0.9933953 -0.6153825 0.9933953 0.9933953 -0.6333995 0.9933953 0.9933953 -0.6561933 0.9933953 0.9933953 -0.6850303 0.9933953 0.9933953 -0.721513 0.9933953 0.9933953 -0.7676683 0.9933953 0.9933953 -0.8260608 0.9933953 0.9933953 -0.8999349 0.9933953 0.9933953 -0.9933953 0.9933953 0.9933953 -0.9948487 0.9145732 0.9145732 -0.9959706 0.8740262 0.8740262 -0.9968409 0.8588218 0.8588218 -0.9975189 0.8594117 0.8594117 -0.9980488 0.8690364 0.8690364 -0.9984638 0.8831255 0.8831255 -0.9987895 0.8987476 0.8987476 -0.9990455 0.9141422 0.9141422 -0.999247 0.928347 0.928347 -0.9994057 0.9409186 0.9409186 -0.9995308 0.9517328 0.9517328 -0.9996295 0.9608482 0.9608482 -0.9997074 0.9684181 0.9684181 -0.9997688 0.9746346 0.9746346 -0.9998174 0.9796966 0.9796966 -0.9998557 0.9837916 0.9837916 -0.999886 0.9870878 0.9870878 -0.9999099 0.9897306 0.9897306 -0.9999288 0.9918431 0.9918431 -0.9999437 0.9935277 0.9935277 -0.6139459 0.9948662 0.9150244 -0.6139352 0.994866 0.9150185 -0.6139219 0.9948657 0.915011 -0.6139056 0.9948653 0.9150017 -0.6138855 0.9948649 0.91499 -0.6138613 0.9948643 0.9149754 -0.6138323 0.9948636 0.9149574 -0.6137984 0.9948628 0.9149351 -0.6137599 0.9948617 0.9149079 -0.6137183 0.9948604 0.914875 -0.6136769 0.9948589 0.9148357 -0.6136427 0.9948571 0.91479 -0.6136284 0.9948551 0.9147384 -0.6136569 0.994853 0.9146831 -0.6137675 0.9948509 0.9146292 -0.6140266 0.9948493 0.9145867 -0.6145393 0.9948487 0.9145732 -0.6152669 0.9948487 0.9145732 -0.6161874 0.9948487 0.9145732 -0.6173519 0.9948487 0.9145732 -0.6188252 0.9948487 0.9145732 -0.6206891 0.9948487 0.9145732 -0.6230471 0.9948487 0.9145732 -0.6260304 0.9948487 0.9145732 -0.6298046 0.9948487 0.9145732 -0.6345795 0.9948487 0.9145732 -0.6406203 0.9948487 0.9145732 -0.6482627 0.9948487 0.9145732 -0.6579314 0.9948487 0.9145732 -0.6701635 0.9948487 0.9145732 -0.6856388 0.9948487 0.9145732 -0.7052169 0.9948487 0.9145732 -0.7299859 0.9948487 0.9145732 -0.7613218 0.9948487 0.9145732 -0.8009659 0.9948487 0.9145732 -0.8511207 0.9948487 0.9145732 -0.9145732 0.9948487 0.9145732 -0.9948487 0.9948487 0.9145732 -0.9959706 0.9278617 0.8740262 -0.9968409 0.8945255 0.8588218 -0.9975189 0.8828571 0.8594117 -0.9980488 0.8842998 0.8690364 -0.9984638 0.892989 0.8831255 -0.9987895 0.9050819 0.8987476 -0.9990455 0.9181889 0.9141422 -0.999247 0.9309211 0.928347 -0.9994057 0.9425502 0.9409186 -0.9995308 0.952764 0.9517328 -0.9996295 0.9614985 0.9608482 -0.9997074 0.9688274 0.9684181 -0.9997688 0.9748918 0.9746346 -0.9998174 0.979858 0.9796966 -0.9998557 0.9838928 0.9837916 -0.999886 0.9871512 0.9870878 -0.9999099 0.9897703 0.9897306 -0.9999288 0.991868 0.9918431 -0.9999437 0.9935432 0.9935277 -0.6724572 0.9959813 0.8745738 -0.6724495 0.9959811 0.8745666 -0.6724399 0.9959809 0.8745575 -0.672428 0.9959807 0.8745461 -0.6724135 0.9959804 0.8745319 -0.6723959 0.9959801 0.8745143 -0.6723748 0.9959797 0.8744923 -0.67235 0.9959791 0.8744653 -0.6723217 0.9959785 0.8744323 -0.6722907 0.9959777 0.8743923 -0.6722594 0.9959768 0.8743447 -0.6722322 0.9959757 0.8742892 -0.672218 0.9959745 0.8742266 -0.672232 0.9959732 0.8741595 -0.6723012 0.9959719 0.8740941 -0.6724711 0.9959709 0.8740427 -0.6728136 0.9959706 0.8740262 -0.6733015 0.9959706 0.8740262 -0.6739188 0.9959706 0.8740262 -0.6746998 0.9959706 0.8740262 -0.6756878 0.9959706 0.8740262 -0.6769378 0.9959706 0.8740262 -0.6785192 0.9959706 0.8740262 -0.6805199 0.9959706 0.8740262 -0.683051 0.9959706 0.8740262 -0.6862532 0.9959706 0.8740262 -0.6903044 0.9959706 0.8740262 -0.6954296 0.9959706 0.8740262 -0.7019138 0.9959706 0.8740262 -0.710117 0.9959706 0.8740262 -0.7204952 0.9959706 0.8740262 -0.733625 0.9959706 0.8740262 -0.7502359 0.9959706 0.8740262 -0.7712508 0.9959706 0.8740262 -0.7978374 0.9959706 0.8740262 -0.8314729 0.9959706 0.8740262 -0.8740262 0.9959706 0.8740262 -0.9278617 0.9959706 0.8740262 -0.9959706 0.9959706 0.8740262 -0.9968409 0.9396953 0.8588218 -0.9975189 0.9125186 0.8594117 -0.9980488 0.9036101 0.8690364 -0.9984638 0.9054678 0.8831255 -0.9987895 0.9130957 0.8987476 -0.9990455 0.9233085 0.9141422 -0.999247 0.9341777 0.928347 -0.9994057 0.9446144 0.9409186 -0.9995308 0.9540687 0.9517328 -0.9996295 0.9623212 0.9608482 -0.9997074 0.9693452 0.9684181 -0.9997688 0.9752172 0.9746346 -0.9998174 0.9800622 0.9796966 -0.9998557 0.9840209 0.9837916 -0.999886 0.9872315 0.9870878 -0.9999099 0.9898206 0.9897306 -0.9999288 0.9918994 0.9918431 -0.9999437 0.9935629 0.9935277 -0.7251659 0.9968475 0.8593214 -0.7251605 0.9968474 0.8593148 -0.7251537 0.9968473 0.8593065 -0.7251454 0.9968472 0.8592962 -0.7251351 0.996847 0.8592832 -0.7251226 0.9968468 0.8592671 -0.7251076 0.9968465 0.8592471 -0.7250899 0.9968462 0.8592224 -0.7250697 0.9968458 0.8591922 -0.7250473 0.9968453 0.8591558 -0.7250244 0.9968448 0.8591123 -0.7250039 0.9968441 0.8590617 -0.7249916 0.9968433 0.8590045 -0.7249978 0.9968425 0.8589433 -0.7250408 0.9968418 0.8588837 -0.7251511 0.9968411 0.8588368 -0.7253775 0.9968409 0.8588218 -0.7257011 0.9968409 0.8588218 -0.7261105 0.9968409 0.8588218 -0.7266285 0.9968409 0.8588218 -0.7272837 0.9968409 0.8588218 -0.7281127 0.9968409 0.8588218 -0.7291615 0.9968409 0.8588218 -0.7304884 0.9968409 0.8588218 -0.732167 0.9968409 0.8588218 -0.7342907 0.9968409 0.8588218 -0.7369774 0.9968409 0.8588218 -0.7403765 0.9968409 0.8588218 -0.7446768 0.9968409 0.8588218 -0.7501172 0.9968409 0.8588218 -0.757 0.9968409 0.8588218 -0.7657077 0.9968409 0.8588218 -0.776724 0.9968409 0.8588218 -0.7906611 0.9968409 0.8588218 -0.8082934 0.9968409 0.8588218 -0.8306004 0.9968409 0.8588218 -0.8588218 0.9968409 0.8588218 -0.8945255 0.9968409 0.8588218 -0.9396953 0.9968409 0.8588218 -0.9968409 0.9968409 0.8588218 -0.9975189 0.9500442 0.8594117 -0.9980488 0.9280401 0.8690364 -0.9984638 0.921255 0.8831255 -0.9987895 0.9232341 0.8987476 -0.9990455 0.9297854 0.9141422 -0.999247 0.9382977 0.928347 -0.9994057 0.9472259 0.9409186 -0.9995308 0.9557192 0.9517328 -0.9996295 0.963362 0.9608482 -0.9997074 0.9700002 0.9684181 -0.9997688 0.9756289 0.9746346 -0.9998174 0.9803206 0.9796966 -0.9998557 0.9841829 0.9837916 -0.999886 0.987333 0.9870878 -0.9999099 0.9898842 0.9897306 -0.9999288 0.9919392 0.9918431 -0.9999437 0.9935878 0.9935277 -0.7716588 0.997523 0.8598146 -0.7716551 0.997523 0.8598093 -0.7716504 0.9975229 0.8598026 -0.7716446 0.9975228 0.8597943 -0.7716375 0.9975227 0.8597838 -0.7716288 0.9975226 0.8597708 -0.7716184 0.9975224 0.8597546 -0.7716061 0.9975222 0.8597348 -0.7715919 0.997522 0.8597104 -0.7715762 0.9975217 0.859681 -0.7715599 0.9975213 0.859646 -0.7715449 0.9975209 0.8596051 -0.7715352 0.9975204 0.859559 -0.7715376 0.9975199 0.8595097 -0.7715641 0.9975194 0.8594616 -0.7716352 0.9975191 0.8594238 -0.7717834 0.9975189 0.8594117 -0.7719959 0.9975189 0.8594117 -0.7722648 0.9975189 0.8594117 -0.7726049 0.9975189 0.8594117 -0.7730352 0.9975189 0.8594117 -0.7735795 0.9975189 0.8594117 -0.7742682 0.9975189 0.8594117 -0.7751395 0.9975189 0.8594117 -0.7762418 0.9975189 0.8594117 -0.7776364 0.9975189 0.8594117 -0.7794007 0.9975189 0.8594117 -0.7816327 0.9975189 0.8594117 -0.7844566 0.9975189 0.8594117 -0.7880291 0.9975189 0.8594117 -0.7925488 0.9975189 0.8594117 -0.7982669 0.9975189 0.8594117 -0.8055009 0.9975189 0.8594117 -0.8146529 0.9975189 0.8594117 -0.8262314 0.9975189 0.8594117 -0.8408797 0.9975189 0.8594117 -0.8594117 0.9975189 0.8594117 -0.8828571 0.9975189 0.8594117 -0.9125186 0.9975189 0.8594117 -0.9500442 0.9975189 0.8594117 -0.9975189 0.9975189 0.8594117 -0.9980488 0.9589472 0.8690364 -0.9984638 0.9412278 0.8831255 -0.9987895 0.9360606 0.8987476 -0.9990455 0.9379796 0.9141422 -0.999247 0.94351 0.928347 -0.9994057 0.9505298 0.9409186 -0.9995308 0.9578074 0.9517328 -0.9996295 0.9646787 0.9608482 -0.9997074 0.970829 0.9684181 -0.9997688 0.9761497 0.9746346 -0.9998174 0.9806476 0.9796966 -0.9998557 0.984388 0.9837916 -0.999886 0.9874615 0.9870878 -0.9999099 0.9899646 0.9897306 -0.9999288 0.9919896 0.9918431 -0.9999437 0.9936193 0.9935277 -0.8119154 0.9980513 0.8693391 -0.8119128 0.9980512 0.8693351 -0.8119096 0.9980512 0.86933 -0.8119057 0.9980511 0.8693238 -0.8119009 0.9980511 0.8693159 -0.8118949 0.998051 0.8693061 -0.8118878 0.9980509 0.869294 -0.8118794 0.9980508 0.869279 -0.8118697 0.9980506 0.8692608 -0.8118589 0.9980504 0.8692387 -0.8118476 0.9980502 0.8692123 -0.811837 0.99805 0.8691816 -0.8118298 0.9980497 0.869147 -0.8118303 0.9980494 0.86911 -0.8118466 0.9980491 0.8690738 -0.8118921 0.9980488 0.8690454 -0.8119884 0.9980488 0.8690364 -0.8121268 0.9980488 0.8690364 -0.8123018 0.9980488 0.8690364 -0.8125232 0.9980488 0.8690364 -0.8128033 0.9980488 0.8690364 -0.8131577 0.9980488 0.8690364 -0.8136061 0.9980488 0.8690364 -0.8141733 0.9980488 0.8690364 -0.8148909 0.9980488 0.8690364 -0.8157988 0.9980488 0.8690364 -0.8169474 0.9980488 0.8690364 -0.8184005 0.9980488 0.8690364 -0.8202389 0.9980488 0.8690364 -0.8225647 0.9980488 0.8690364 -0.8255071 0.9980488 0.8690364 -0.8292297 0.9980488 0.8690364 -0.8339392 0.9980488 0.8690364 -0.8398974 0.9980488 0.8690364 -0.8474353 0.9980488 0.8690364 -0.8569716 0.9980488 0.8690364 -0.8690364 0.9980488 0.8690364 -0.8842998 0.9980488 0.8690364 -0.9036101 0.9980488 0.8690364 -0.9280401 0.9980488 0.8690364 -0.9589472 0.9980488 0.8690364 -0.9980488 0.9980488 0.8690364 -0.9984638 0.9664961 0.8831255 -0.9987895 0.9522877 0.8987476 -0.9990455 0.9483463 0.9141422 -0.999247 0.9501042 0.928347 -0.9994057 0.9547096 0.9409186 -0.9995308 0.9604492 0.9517328 -0.9996295 0.9663445 0.9608482 -0.9997074 0.9718774 0.9684181 -0.9997688 0.9768086 0.9746346 -0.9998174 0.9810611 0.9796966 -0.9998557 0.9846473 0.9837916 -0.999886 0.987624 0.9870878 -0.9999099 0.9900664 0.9897306 -0.9999288 0.9920533 0.9918431 -0.9999437 0.9936592 0.9935277 -0.8462171 0.9984653 0.8833426 -0.8462154 0.9984653 0.8833397 -0.8462132 0.9984653 0.8833361 -0.8462106 0.9984653 0.8833316 -0.8462073 0.9984652 0.8833259 -0.8462034 0.9984652 0.8833189 -0.8461986 0.9984651 0.8833102 -0.8461929 0.998465 0.8832995 -0.8461864 0.9984649 0.8832864 -0.8461791 0.9984648 0.8832705 -0.8461714 0.9984647 0.8832516 -0.8461641 0.9984645 0.8832296 -0.8461589 0.9984643 0.8832048 -0.8461587 0.9984642 0.8831782 -0.8461687 0.998464 0.8831523 -0.8461977 0.9984638 0.883132 -0.8462598 0.9984638 0.8831255 -0.8463492 0.9984638 0.8831255 -0.8464623 0.9984638 0.8831255 -0.8466054 0.9984638 0.8831255 -0.8467864 0.9984638 0.8831255 -0.8470154 0.9984638 0.8831255 -0.8473052 0.9984638 0.8831255 -0.8476717 0.9984638 0.8831255 -0.8481355 0.9984638 0.8831255 -0.8487222 0.9984638 0.8831255 -0.8494644 0.9984638 0.8831255 -0.8504035 0.9984638 0.8831255 -0.8515915 0.9984638 0.8831255 -0.8530945 0.9984638 0.8831255 -0.8549959 0.9984638 0.8831255 -0.8574015 0.9984638 0.8831255 -0.8604449 0.9984638 0.8831255 -0.8642952 0.9984638 0.8831255 -0.8691663 0.9984638 0.8831255 -0.875329 0.9984638 0.8831255 -0.8831255 0.9984638 0.8831255 -0.892989 0.9984638 0.8831255 -0.9054678 0.9984638 0.8831255 -0.921255 0.9984638 0.8831255 -0.9412278 0.9984638 0.8831255 -0.9664961 0.9984638 0.8831255 -0.9984638 0.9984638 0.8831255 -0.9987895 0.9728171 0.8987476 -0.9990455 0.9614615 0.9141422 -0.999247 0.9584468 0.928347 -0.9994057 0.9599976 0.9409186 -0.9995308 0.9637914 0.9517328 -0.9996295 0.968452 0.9608482 -0.9997074 0.9732039 0.9684181 -0.9997688 0.9776422 0.9746346 -0.9998174 0.9815844 0.9796966 -0.9998557 0.9849754 0.9837916 -0.999886 0.9878296 0.9870878 -0.9999099 0.9901951 0.9897306 -0.9999288 0.9921339 0.9918431 -0.9999437 0.9937096 0.9935277 -0.8750477 0.9987905 0.8988983 -0.8750466 0.9987905 0.8988963 -0.8750451 0.9987904 0.8988938 -0.8750434 0.9987904 0.8988907 -0.8750412 0.9987904 0.8988868 -0.8750386 0.9987904 0.8988819 -0.8750355 0.9987903 0.8988759 -0.8750317 0.9987903 0.8988684 -0.8750274 0.9987902 0.8988593 -0.8750225 0.9987902 0.8988483 -0.8750173 0.9987901 0.8988352 -0.8750124 0.99879 0.8988199 -0.8750088 0.9987899 0.8988027 -0.8750084 0.9987897 0.8987842 -0.8750145 0.9987896 0.8987663 -0.8750329 0.9987895 0.8987521 -0.8750727 0.9987895 0.8987476 -0.8751301 0.9987895 0.8987476 -0.8752028 0.9987895 0.8987476 -0.8752947 0.9987895 0.8987476 -0.8754109 0.9987895 0.8987476 -0.875558 0.9987895 0.8987476 -0.8757441 0.9987895 0.8987476 -0.8759795 0.9987895 0.8987476 -0.8762773 0.9987895 0.8987476 -0.8766541 0.9987895 0.8987476 -0.8771307 0.9987895 0.8987476 -0.8777338 0.9987895 0.8987476 -0.8784967 0.9987895 0.8987476 -0.8794619 0.9987895 0.8987476 -0.880683 0.9987895 0.8987476 -0.8822279 0.9987895 0.8987476 -0.8841823 0.9987895 0.8987476 -0.886655 0.9987895 0.8987476 -0.8897832 0.9987895 0.8987476 -0.8937407 0.9987895 0.8987476 -0.8987476 0.9987895 0.8987476 -0.9050819 0.9987895 0.8987476 -0.9130957 0.9987895 0.8987476 -0.9232341 0.9987895 0.8987476 -0.9360606 0.9987895 0.8987476 -0.9522877 0.9987895 0.8987476 -0.9728171 0.9987895 0.8987476 -0.9987895 0.9987895 0.8987476 -0.9990455 0.9780539 0.9141422 -0.999247 0.9690013 0.928347 -0.9994057 0.9666876 0.9409186 -0.9995308 0.9680197 0.9517328 -0.9996295 0.9711183 0.9608482 -0.9997074 0.974882 0.9684181 -0.9997688 0.9786968 0.9746346 -0.9998174 0.9822464 0.9796966 -0.9998557 0.9853905 0.9837916 -0.999886 0.9880897 0.9870878 -0.9999099 0.990358 0.9897306 -0.9999288 0.9922358 0.9918431 -0.9999437 0.9937734 0.9935277 -0.8990028 0.9990461 0.9142443 -0.899002 0.9990461 0.914243 -0.8990011 0.9990461 0.9142413 -0.899 0.9990461 0.9142392 -0.8989986 0.9990461 0.9142365 -0.8989969 0.9990461 0.9142332 -0.8989948 0.9990461 0.9142291 -0.8989923 0.999046 0.9142241 -0.8989895 0.999046 0.9142179 -0.8989863 0.9990459 0.9142104 -0.8989829 0.9990459 0.9142016 -0.8989796 0.9990458 0.9141912 -0.8989771 0.9990458 0.9141795 -0.8989767 0.9990457 0.914167 -0.8989805 0.9990456 0.9141548 -0.8989921 0.9990456 0.9141453 -0.8990175 0.9990455 0.9141422 -0.8990542 0.9990455 0.9141422 -0.8991006 0.9990455 0.9141422 -0.8991593 0.9990455 0.9141422 -0.8992336 0.9990455 0.9141422 -0.8993275 0.9990455 0.9141422 -0.8994464 0.9990455 0.9141422 -0.8995968 0.9990455 0.9141422 -0.899787 0.9990455 0.9141422 -0.9000277 0.9990455 0.9141422 -0.9003323 0.9990455 0.9141422 -0.9007175 0.9990455 0.9141422 -0.9012049 0.9990455 0.9141422 -0.9018215 0.9990455 0.9141422 -0.9026016 0.9990455 0.9141422 -0.9035886 0.9990455 0.9141422 -0.9048372 0.9990455 0.9141422 -0.9064168 0.9990455 0.9141422 -0.9084153 0.9990455 0.9141422 -0.9109436 0.9990455 0.9141422 -0.9141422 0.9990455 0.9141422 -0.9181889 0.9990455 0.9141422 -0.9233085 0.9990455 0.9141422 -0.9297854 0.9990455 0.9141422 -0.9379796 0.9990455 0.9141422 -0.9483463 0.9990455 0.9141422 -0.9614615 0.9990455 0.9141422 -0.9780539 0.9990455 0.9141422 -0.9990455 0.9990455 0.9141422 -0.999247 0.982354 0.928347 -0.9994057 0.9751513 0.9409186 -0.9995308 0.9733691 0.9517328 -0.9996295 0.9744915 0.9608482 -0.9997074 0.977005 0.9684181 -0.9997688 0.980031 0.9746346 -0.9998174 0.9830838 0.9796966 -0.9998557 0.9859157 0.9837916 -0.999886 0.9884188 0.9870878 -0.9999099 0.9905641 0.9897306 -0.9999288 0.9923648 0.9918431 -0.9999437 0.9938541 0.9935277 -0.9187175 0.9992474 0.928415 -0.918717 0.9992474 0.9284141 -0.9187164 0.9992474 0.928413 -0.9187157 0.9992474 0.9284116 -0.9187148 0.9992474 0.9284098 -0.9187137 0.9992474 0.9284076 -0.9187123 0.9992473 0.9284049 -0.9187107 0.9992473 0.9284015 -0.9187089 0.9992473 0.9283974 -0.9187068 0.9992473 0.9283924 -0.9187045 0.9992472 0.9283865 -0.9187024 0.9992472 0.9283796 -0.9187008 0.9992472 0.9283719 -0.9187004 0.9992471 0.9283635 -0.9187027 0.9992471 0.9283554 -0.9187101 0.999247 0.9283491 -0.9187262 0.999247 0.928347 -0.9187495 0.999247 0.928347 -0.9187791 0.999247 0.928347 -0.9188164 0.999247 0.928347 -0.9188636 0.999247 0.928347 -0.9189234 0.999247 0.928347 -0.918999 0.999247 0.928347 -0.9190947 0.999247 0.928347 -0.9192157 0.999247 0.928347 -0.9193688 0.999247 0.928347 -0.9195625 0.999247 0.928347 -0.9198076 0.999247 0.928347 -0.9201176 0.999247 0.928347 -0.9205098 0.999247 0.928347 -0.9210061 0.999247 0.928347 -0.9216339 0.999247 0.928347 -0.9224281 0.999247 0.928347 -0.9234329 0.999247 0.928347 -0.9247041 0.999247 0.928347 -0.9263124 0.999247 0.928347 -0.928347 0.999247 0.928347 -0.9309211 0.999247 0.928347 -0.9341777 0.999247 0.928347 -0.9382977 0.999247 0.928347 -0.94351 0.999247 0.928347 -0.9501042 0.999247 0.928347 -0.9584468 0.999247 0.928347 -0.9690013 0.999247 0.928347 -0.982354 0.999247 0.928347 -0.999247 0.999247 0.928347 -0.9994057 0.9858591 0.9409186 -0.9995308 0.9801368 0.9517328 -0.9996295 0.978759 0.9608482 -0.9997074 0.9796909 0.9684181 -0.9997688 0.981719 0.9746346 -0.9998174 0.9841433 0.9796966 -0.9998557 0.9865801 0.9837916 -0.999886 0.9888351 0.9870878 -0.9999099 0.9908248 0.9897306 -0.9999288 0.992528 0.9918431 -0.9999437 0.9939562 0.9935277 -0.9348153 0.999406 0.9409633 -0.9348149 0.999406 0.9409627 -0.9348146 0.999406 0.9409619 -0.9348141 0.999406 0.940961 -0.9348135 0.999406 0.9409599 -0.9348128 0.9994059 0.9409584 -0.9348119 0.9994059 0.9409566 -0.9348109 0.9994059 0.9409544 -0.9348097 0.9994059 0.9409517 -0.9348083 0.9994059 0.9409485 -0.9348069 0.9994059 0.9409446 -0.9348055 0.9994059 0.9409401 -0.9348044 0.9994058 0.9409349 -0.9348042 0.9994058 0.9409295 -0.9348056 0.9994058 0.9409242 -0.9348102 0.9994057 0.94092 -0.9348204 0.9994057 0.9409186 -0.9348352 0.9994057 0.9409186 -0.9348539 0.9994057 0.9409186 -0.9348776 0.9994057 0.9409186 -0.9349075 0.9994057 0.9409186 -0.9349454 0.9994057 0.9409186 -0.9349933 0.9994057 0.9409186 -0.935054 0.9994057 0.9409186 -0.9351307 0.9994057 0.9409186 -0.9352277 0.9994057 0.9409186 -0.9353505 0.9994057 0.9409186 -0.9355059 0.9994057 0.9409186 -0.9357024 0.9994057 0.9409186 -0.935951 0.9994057 0.9409186 -0.9362655 0.9994057 0.9409186 -0.9366635 0.9994057 0.9409186 -0.9371669 0.9994057 0.9409186 -0.9378038 0.9994057 0.9409186 -0.9386096 0.9994057 0.9409186 -0.939629 0.9994057 0.9409186 -0.9409186 0.9994057 0.9409186 -0.9425502 0.9994057 0.9409186 -0.9446144 0.9994057 0.9409186 -0.9472259 0.9994057 0.9409186 -0.9505298 0.9994057 0.9409186 -0.9547096 0.9994057 0.9409186 -0.9599976 0.9994057 0.9409186 -0.9666876 0.9994057 0.9409186 -0.9751513 0.9994057 0.9409186 -0.9858591 0.9994057 0.9409186 -0.9994057 0.9994057 0.9409186 -0.9995308 0.9886988 0.9517328 -0.9996295 0.9841579 0.9608482 -0.9997074 0.983089 0.9684181 -0.9997688 0.9838545 0.9746346 -0.9998174 0.9854838 0.9796966 -0.9998557 0.9874207 0.9837916 -0.999886 0.9893618 0.9870878 -0.9999099 0.9911547 0.9897306 -0.9999288 0.9927345 0.9918431 -0.9999437 0.9940854 0.9935277 -0.9478754 0.999531 0.9517618 -0.9478752 0.999531 0.9517614 -0.947875 0.999531 0.9517609 -0.9478746 0.999531 0.9517603 -0.9478743 0.999531 0.9517596 -0.9478738 0.999531 0.9517586 -0.9478733 0.999531 0.9517575 -0.9478726 0.999531 0.951756 -0.9478718 0.999531 0.9517543 -0.947871 0.9995309 0.9517522 -0.94787 0.9995309 0.9517496 -0.9478691 0.9995309 0.9517467 -0.9478684 0.9995309 0.9517434 -0.9478683 0.9995309 0.9517398 -0.9478691 0.9995309 0.9517364 -0.947872 0.9995309 0.9517337 -0.9478785 0.9995308 0.9517328 -0.9478878 0.9995308 0.9517328 -0.9478997 0.9995308 0.9517328 -0.9479146 0.9995308 0.9517328 -0.9479335 0.9995308 0.9517328 -0.9479575 0.9995308 0.9517328 -0.9479878 0.9995308 0.9517328 -0.9480261 0.9995308 0.9517328 -0.9480746 0.9995308 0.9517328 -0.9481359 0.9995308 0.9517328 -0.9482135 0.9995308 0.9517328 -0.9483117 0.9995308 0.9517328 -0.9484359 0.9995308 0.9517328 -0.9485931 0.9995308 0.9517328 -0.9487918 0.9995308 0.9517328 -0.9490434 0.9995308 0.9517328 -0.9493615 0.9995308 0.9517328 -0.9497641 0.9995308 0.9517328 -0.9502734 0.9995308 0.9517328 -0.9509177 0.9995308 0.9517328 -0.9517328 0.9995308 0.9517328 -0.952764 0.9995308 0.9517328 -0.9540687 0.9995308 0.9517328 -0.9557192 0.9995308 0.9517328 -0.9578074 0.9995308 0.9517328 -0.9604492 0.9995308 0.9517328 -0.9637914 0.9995308 0.9517328 -0.9680197 0.9995308 0.9517328 -0.9733691 0.9995308 0.9517328 -0.9801368 0.9995308 0.9517328 -0.9886988 0.9995308 0.9517328 -0.9995308 0.9995308 0.9517328 -0.9996295 0.9909882 0.9608482 -0.9997074 0.9873879 0.9684181 -0.9997688 0.9865561 0.9746346 -0.9998174 0.9871796 0.9796966 -0.9998557 0.9884841 0.9837916 -0.999886 0.9900282 0.9870878 -0.9999099 0.991572 0.9897306 -0.9999288 0.9929957 0.9918431 -0.9999437 0.9942488 0.9935277 -0.958416 0.9996296 0.9608669 -0.9584159 0.9996296 0.9608667 -0.9584157 0.9996296 0.9608664 -0.9584155 0.9996296 0.960866 -0.9584153 0.9996296 0.9608655 -0.958415 0.9996296 0.9608649 -0.9584146 0.9996296 0.9608641 -0.9584142 0.9996296 0.9608632 -0.9584137 0.9996296 0.9608621 -0.9584132 0.9996296 0.9608607 -0.9584126 0.9996296 0.9608591 -0.958412 0.9996296 0.9608572 -0.9584115 0.9996296 0.9608551 -0.9584114 0.9996295 0.9608528 -0.958412 0.9996295 0.9608506 -0.9584138 0.9996295 0.9608488 -0.9584178 0.9996295 0.9608482 -0.9584237 0.9996295 0.9608482 -0.9584312 0.9996295 0.9608482 -0.9584406 0.9996295 0.9608482 -0.9584526 0.9996295 0.9608482 -0.9584677 0.9996295 0.9608482 -0.9584868 0.9996295 0.9608482 -0.9585109 0.9996295 0.9608482 -0.9585415 0.9996295 0.9608482 -0.9585802 0.9996295 0.9608482 -0.9586291 0.9996295 0.9608482 -0.958691 0.9996295 0.9608482 -0.9587693 0.9996295 0.9608482 -0.9588684 0.9996295 0.9608482 -0.9589938 0.9996295 0.9608482 -0.9591524 0.9996295 0.9608482 -0.959353 0.9996295 0.9608482 -0.9596068 0.9996295 0.9608482 -0.959928 0.9996295 0.9608482 -0.9603343 0.9996295 0.9608482 -0.9608482 0.9996295 0.9608482 -0.9614985 0.9996295 0.9608482 -0.9623212 0.9996295 0.9608482 -0.963362 0.9996295 0.9608482 -0.9646787 0.9996295 0.9608482 -0.9663445 0.9996295 0.9608482 -0.968452 0.9996295 0.9608482 -0.9711183 0.9996295 0.9608482 -0.9744915 0.9996295 0.9608482 -0.978759 0.9996295 0.9608482 -0.9841579 0.9996295 0.9608482 -0.9909882 0.9996295 0.9608482 -0.9996295 0.9996295 0.9608482 -0.9997074 0.9928267 0.9684181 -0.9997688 0.9899741 0.9746346 -0.9998174 0.989325 0.9796966 -0.9998557 0.9898295 0.9837916 -0.999886 0.9908712 0.9870878 -0.9999099 0.9920999 0.9897306 -0.9999288 0.9933261 0.9918431 -0.9999437 0.9944556 0.9935277 -0.9668873 0.9997074 0.9684301 -0.9668872 0.9997074 0.9684299 -0.9668871 0.9997074 0.9684297 -0.966887 0.9997074 0.9684295 -0.9668869 0.9997074 0.9684292 -0.9668867 0.9997074 0.9684288 -0.9668865 0.9997074 0.9684283 -0.9668862 0.9997074 0.9684277 -0.9668859 0.9997074 0.968427 -0.9668855 0.9997074 0.9684261 -0.9668852 0.9997074 0.9684251 -0.9668848 0.9997074 0.9684239 -0.9668845 0.9997074 0.9684225 -0.9668844 0.9997074 0.968421 -0.9668847 0.9997074 0.9684196 -0.9668859 0.9997074 0.9684185 -0.9668884 0.9997074 0.9684181 -0.9668922 0.9997074 0.9684181 -0.9668969 0.9997074 0.9684181 -0.9669028 0.9997074 0.9684181 -0.9669103 0.9997074 0.9684181 -0.9669198 0.9997074 0.9684181 -0.9669318 0.9997074 0.9684181 -0.966947 0.9997074 0.9684181 -0.9669663 0.9997074 0.9684181 -0.9669906 0.9997074 0.9684181 -0.9670214 0.9997074 0.9684181 -0.9670604 0.9997074 0.9684181 -0.9671097 0.9997074 0.9684181 -0.967172 0.9997074 0.9684181 -0.9672509 0.9997074 0.9684181 -0.9673508 0.9997074 0.9684181 -0.967477 0.9997074 0.9684181 -0.9676368 0.9997074 0.9684181 -0.9678389 0.9997074 0.9684181 -0.9680946 0.9997074 0.9684181 -0.9684181 0.9997074 0.9684181 -0.9688274 0.9997074 0.9684181 -0.9693452 0.9997074 0.9684181 -0.9700002 0.9997074 0.9684181 -0.970829 0.9997074 0.9684181 -0.9718774 0.9997074 0.9684181 -0.9732039 0.9997074 0.9684181 -0.974882 0.9997074 0.9684181 -0.977005 0.9997074 0.9684181 -0.9796909 0.9997074 0.9684181 -0.983089 0.9997074 0.9684181 -0.9873879 0.9997074 0.9684181 -0.9928267 0.9997074 0.9684181 -0.9997074 0.9997074 0.9684181 -0.9997688 0.9942982 0.9746346 -0.9998174 0.9920392 0.9796966 -0.9998557 0.9915316 0.9837916 -0.999886 0.9919377 0.9870878 -0.9999099 0.9927678 0.9897306 -0.9999288 0.9937442 0.9918431 -0.9999437 0.9947172 0.9935277 -0.9736726 0.9997689 0.9746422 -0.9736726 0.9997689 0.9746421 -0.9736725 0.9997689 0.974642 -0.9736724 0.9997689 0.9746418 -0.9736723 0.9997689 0.9746416 -0.9736722 0.9997689 0.9746414 -0.9736721 0.9997689 0.9746411 -0.9736719 0.9997689 0.9746407 -0.9736717 0.9997689 0.9746403 -0.9736715 0.9997689 0.9746397 -0.9736712 0.9997689 0.974639 -0.973671 0.9997689 0.9746383 -0.9736708 0.9997689 0.9746374 -0.9736708 0.9997689 0.9746365 -0.973671 0.9997688 0.9746356 -0.9736717 0.9997688 0.9746348 -0.9736733 0.9997688 0.9746346 -0.9736756 0.9997688 0.9746346 -0.9736786 0.9997688 0.9746346 -0.9736823 0.9997688 0.9746346 -0.973687 0.9997688 0.9746346 -0.973693 0.9997688 0.9746346 -0.9737006 0.9997688 0.9746346 -0.9737101 0.9997688 0.9746346 -0.9737222 0.9997688 0.9746346 -0.9737375 0.9997688 0.9746346 -0.9737569 0.9997688 0.9746346 -0.9737814 0.9997688 0.9746346 -0.9738123 0.9997688 0.9746346 -0.9738515 0.9997688 0.9746346 -0.9739011 0.9997688 0.9746346 -0.9739638 0.9997688 0.9746346 -0.9740432 0.9997688 0.9746346 -0.9741436 0.9997688 0.9746346 -0.9742706 0.9997688 0.9746346 -0.9744313 0.9997688 0.9746346 -0.9746346 0.9997688 0.9746346 -0.9748918 0.9997688 0.9746346 -0.9752172 0.9997688 0.9746346 -0.9756289 0.9997688 0.9746346 -0.9761497 0.9997688 0.9746346 -0.9768086 0.9997688 0.9746346 -0.9776422 0.9997688 0.9746346 -0.9786968 0.9997688 0.9746346 -0.980031 0.9997688 0.9746346 -0.981719 0.9997688 0.9746346 -0.9838545 0.9997688 0.9746346 -0.9865561 0.9997688 0.9746346 -0.9899741 0.9997688 0.9746346 -0.9942982 0.9997688 0.9746346 -0.9997688 0.9997688 0.9746346 -0.9998174 0.9954731 0.9796966 -0.9998557 0.9936849 0.9837916 -0.999886 0.993287 0.9870878 -0.9999099 0.9936128 0.9897306 -0.9999288 0.9942731 0.9918431 -0.9999437 0.9950481 0.9935277 -0.9790927 0.9998174 0.9797014 -0.9790927 0.9998174 0.9797013 -0.9790927 0.9998174 0.9797012 -0.9790926 0.9998174 0.9797011 -0.9790925 0.9998174 0.979701 -0.9790925 0.9998174 0.9797009 -0.9790924 0.9998174 0.9797007 -0.9790923 0.9998174 0.9797004 -0.9790921 0.9998174 0.9797001 -0.979092 0.9998174 0.9796998 -0.9790919 0.9998174 0.9796994 -0.9790917 0.9998174 0.9796989 -0.9790916 0.9998174 0.9796983 -0.9790916 0.9998174 0.9796977 -0.9790917 0.9998174 0.9796971 -0.9790921 0.9998174 0.9796967 -0.9790931 0.9998174 0.9796966 -0.9790946 0.9998174 0.9796966 -0.9790965 0.9998174 0.9796966 -0.9790988 0.9998174 0.9796966 -0.9791018 0.9998174 0.9796966 -0.9791055 0.9998174 0.9796966 -0.9791103 0.9998174 0.9796966 -0.9791163 0.9998174 0.9796966 -0.9791238 0.9998174 0.9796966 -0.9791334 0.9998174 0.9796966 -0.9791456 0.9998174 0.9796966 -0.979161 0.9998174 0.9796966 -0.9791804 0.9998174 0.9796966 -0.979205 0.9998174 0.9796966 -0.9792361 0.9998174 0.9796966 -0.9792755 0.9998174 0.9796966 -0.9793253 0.9998174 0.9796966 -0.9793883 0.9998174 0.9796966 -0.9794681 0.9998174 0.9796966 -0.9795689 0.9998174 0.9796966 -0.9796966 0.9998174 0.9796966 -0.979858 0.9998174 0.9796966 -0.9800622 0.9998174 0.9796966 -0.9803206 0.9998174 0.9796966 -0.9806476 0.9998174 0.9796966 -0.9810611 0.9998174 0.9796966 -0.9815844 0.9998174 0.9796966 -0.9822464 0.9998174 0.9796966 -0.9830838 0.9998174 0.9796966 -0.9841433 0.9998174 0.9796966 -0.9854838 0.9998174 0.9796966 -0.9871796 0.9998174 0.9796966 -0.989325 0.9998174 0.9796966 -0.9920392 0.9998174 0.9796966 -0.9954731 0.9998174 0.9796966 -0.9998174 0.9998174 0.9796966 -0.9998557 0.9964092 0.9837916 -0.999886 0.9949941 0.9870878 -0.9999099 0.9946818 0.9897306 -0.9999288 0.9949422 0.9918431 -0.9999437 0.9954668 0.9935277 -0.9834129 0.9998557 0.9837946 -0.9834129 0.9998557 0.9837946 -0.9834129 0.9998557 0.9837945 -0.9834129 0.9998557 0.9837945 -0.9834128 0.9998557 0.9837944 -0.9834128 0.9998557 0.9837943 -0.9834127 0.9998557 0.9837942 -0.9834127 0.9998557 0.983794 -0.9834126 0.9998557 0.9837938 -0.9834125 0.9998557 0.9837936 -0.9834124 0.9998557 0.9837934 -0.9834123 0.9998557 0.983793 -0.9834122 0.9998557 0.9837927 -0.9834122 0.9998557 0.9837923 -0.9834123 0.9998557 0.983792 -0.9834126 0.9998557 0.9837917 -0.9834132 0.9998557 0.9837916 -0.9834141 0.9998557 0.9837916 -0.9834153 0.9998557 0.9837916 -0.9834167 0.9998557 0.9837916 -0.9834186 0.9998557 0.9837916 -0.9834209 0.9998557 0.9837916 -0.9834239 0.9998557 0.9837916 -0.9834277 0.9998557 0.9837916 -0.9834324 0.9998557 0.9837916 -0.9834385 0.9998557 0.9837916 -0.9834461 0.9998557 0.9837916 -0.9834557 0.9998557 0.9837916 -0.9834679 0.9998557 0.9837916 -0.9834833 0.9998557 0.9837916 -0.9835029 0.9998557 0.9837916 -0.9835276 0.9998557 0.9837916 -0.9835588 0.9998557 0.9837916 -0.9835983 0.9998557 0.9837916 -0.9836483 0.9998557 0.9837916 -0.9837116 0.9998557 0.9837916 -0.9837916 0.9998557 0.9837916 -0.9838928 0.9998557 0.9837916 -0.9840209 0.9998557 0.9837916 -0.9841829 0.9998557 0.9837916 -0.984388 0.9998557 0.9837916 -0.9846473 0.9998557 0.9837916 -0.9849754 0.9998557 0.9837916 -0.9853905 0.9998557 0.9837916 -0.9859157 0.9998557 0.9837916 -0.9865801 0.9998557 0.9837916 -0.9874207 0.9998557 0.9837916 -0.9884841 0.9998557 0.9837916 -0.9898295 0.9998557 0.9837916 -0.9915316 0.9998557 0.9837916 -0.9936849 0.9998557 0.9837916 -0.9964092 0.9998557 0.9837916 -0.9998557 0.9998557 0.9837916 -0.999886 0.9971537 0.9870878 -0.9999099 0.9960342 0.9897306 -0.9999288 0.9957887 0.9918431 -0.9999437 0.9959964 0.9935277 -0.9868505 0.999886 0.9870897 -0.9868505 0.999886 0.9870897 -0.9868505 0.999886 0.9870896 -0.9868505 0.999886 0.9870896 -0.9868504 0.999886 0.9870895 -0.9868504 0.999886 0.9870895 -0.9868504 0.999886 0.9870894 -0.9868503 0.999886 0.9870893 -0.9868503 0.999886 0.9870892 -0.9868502 0.999886 0.9870891 -0.9868502 0.999886 0.9870889 -0.9868501 0.999886 0.9870887 -0.9868501 0.999886 0.9870885 -0.98685 0.999886 0.9870882 -0.9868501 0.999886 0.987088 -0.9868503 0.999886 0.9870878 -0.9868507 0.999886 0.9870878 -0.9868512 0.999886 0.9870878 -0.986852 0.999886 0.9870878 -0.9868529 0.999886 0.9870878 -0.9868541 0.999886 0.9870878 -0.9868555 0.999886 0.9870878 -0.9868574 0.999886 0.9870878 -0.9868597 0.999886 0.9870878 -0.9868627 0.999886 0.9870878 -0.9868665 0.999886 0.9870878 -0.9868713 0.999886 0.9870878 -0.9868773 0.999886 0.9870878 -0.986885 0.999886 0.9870878 -0.9868946 0.999886 0.9870878 -0.9869069 0.999886 0.9870878 -0.9869223 0.999886 0.9870878 -0.9869419 0.999886 0.9870878 -0.9869667 0.999886 0.9870878 -0.986998 0.999886 0.9870878 -0.9870376 0.999886 0.9870878 -0.9870878 0.999886 0.9870878 -0.9871512 0.999886 0.9870878 -0.9872315 0.999886 0.9870878 -0.987333 0.999886 0.9870878 -0.9874615 0.999886 0.9870878 -0.987624 0.999886 0.9870878 -0.9878296 0.999886 0.9870878 -0.9880897 0.999886 0.9870878 -0.9884188 0.999886 0.9870878 -0.9888351 0.999886 0.9870878 -0.9893618 0.999886 0.9870878 -0.9900282 0.999886 0.9870878 -0.9908712 0.999886 0.9870878 -0.9919377 0.999886 0.9870878 -0.993287 0.999886 0.9870878 -0.9949941 0.999886 0.9870878 -0.9971537 0.999886 0.9870878 -0.999886 0.999886 0.9870878 -0.9999099 0.9977452 0.9897306 -0.9999288 0.9968597 0.9918431 -0.9999437 0.9966665 0.9935277 -0.989582 0.9999099 0.9897318 -0.989582 0.9999099 0.9897318 -0.989582 0.9999099 0.9897318 -0.989582 0.9999099 0.9897317 -0.989582 0.9999099 0.9897317 -0.9895819 0.9999099 0.9897317 -0.9895819 0.9999099 0.9897316 -0.9895819 0.9999099 0.9897316 -0.9895819 0.9999099 0.9897315 -0.9895818 0.9999099 0.9897314 -0.9895818 0.9999099 0.9897313 -0.9895818 0.9999099 0.9897312 -0.9895817 0.9999099 0.989731 -0.9895817 0.9999099 0.9897309 -0.9895817 0.9999099 0.9897307 -0.9895819 0.9999099 0.9897306 -0.9895821 0.9999099 0.9897306 -0.9895825 0.9999099 0.9897306 -0.9895829 0.9999099 0.9897306 -0.9895835 0.9999099 0.9897306 -0.9895842 0.9999099 0.9897306 -0.9895851 0.9999099 0.9897306 -0.9895863 0.9999099 0.9897306 -0.9895878 0.9999099 0.9897306 -0.9895897 0.9999099 0.9897306 -0.989592 0.9999099 0.9897306 -0.989595 0.9999099 0.9897306 -0.9895988 0.9999099 0.9897306 -0.9896036 0.9999099 0.9897306 -0.9896096 0.9999099 0.9897306 -0.9896173 0.9999099 0.9897306 -0.989627 0.9999099 0.9897306 -0.9896392 0.9999099 0.9897306 -0.9896547 0.9999099 0.9897306 -0.9896744 0.9999099 0.9897306 -0.9896992 0.9999099 0.9897306 -0.9897306 0.9999099 0.9897306 -0.9897703 0.9999099 0.9897306 -0.9898206 0.9999099 0.9897306 -0.9898842 0.9999099 0.9897306 -0.9899646 0.9999099 0.9897306 -0.9900664 0.9999099 0.9897306 -0.9901951 0.9999099 0.9897306 -0.990358 0.9999099 0.9897306 -0.9905641 0.9999099 0.9897306 -0.9908248 0.9999099 0.9897306 -0.9911547 0.9999099 0.9897306 -0.991572 0.9999099 0.9897306 -0.9920999 0.9999099 0.9897306 -0.9927678 0.9999099 0.9897306 -0.9936128 0.9999099 0.9897306 -0.9946818 0.9999099 0.9897306 -0.9960342 0.9999099 0.9897306 -0.9977452 0.9999099 0.9897306 -0.9999099 0.9999099 0.9897306 -0.9999288 0.9982146 0.9918431 -0.9999437 0.9975143 0.9935277 -0.9917501 0.9999288 0.9918439 -0.9917501 0.9999288 0.9918438 -0.9917501 0.9999288 0.9918438 -0.9917501 0.9999288 0.9918438 -0.9917501 0.9999288 0.9918438 -0.9917501 0.9999288 0.9918438 -0.99175 0.9999288 0.9918437 -0.99175 0.9999288 0.9918437 -0.99175 0.9999288 0.9918437 -0.99175 0.9999288 0.9918436 -0.99175 0.9999288 0.9918435 -0.9917499 0.9999288 0.9918435 -0.9917499 0.9999288 0.9918434 -0.9917499 0.9999288 0.9918433 -0.9917499 0.9999288 0.9918432 -0.99175 0.9999288 0.9918431 -0.9917502 0.9999288 0.9918431 -0.9917504 0.9999288 0.9918431 -0.9917507 0.9999288 0.9918431 -0.991751 0.9999288 0.9918431 -0.9917515 0.9999288 0.9918431 -0.9917521 0.9999288 0.9918431 -0.9917528 0.9999288 0.9918431 -0.9917537 0.9999288 0.9918431 -0.9917549 0.9999288 0.9918431 -0.9917564 0.9999288 0.9918431 -0.9917582 0.9999288 0.9918431 -0.9917606 0.9999288 0.9918431 -0.9917636 0.9999288 0.9918431 -0.9917674 0.9999288 0.9918431 -0.9917722 0.9999288 0.9918431 -0.9917782 0.9999288 0.9918431 -0.9917859 0.9999288 0.9918431 -0.9917956 0.9999288 0.9918431 -0.9918079 0.9999288 0.9918431 -0.9918234 0.9999288 0.9918431 -0.9918431 0.9999288 0.9918431 -0.991868 0.9999288 0.9918431 -0.9918994 0.9999288 0.9918431 -0.9919392 0.9999288 0.9918431 -0.9919896 0.9999288 0.9918431 -0.9920533 0.9999288 0.9918431 -0.9921339 0.9999288 0.9918431 -0.9922358 0.9999288 0.9918431 -0.9923648 0.9999288 0.9918431 -0.992528 0.9999288 0.9918431 -0.9927345 0.9999288 0.9918431 -0.9929957 0.9999288 0.9918431 -0.9933261 0.9999288 0.9918431 -0.9937442 0.9999288 0.9918431 -0.9942731 0.9999288 0.9918431 -0.9949422 0.9999288 0.9918431 -0.9957887 0.9999288 0.9918431 -0.9968597 0.9999288 0.9918431 -0.9982146 0.9999288 0.9918431 -0.9999288 0.9999288 0.9918431 -0.9999437 0.9985868 0.9935277 -0.9934695 0.9999437 0.9935282 -0.9934695 0.9999437 0.9935281 -0.9934695 0.9999437 0.9935281 -0.9934695 0.9999437 0.9935281 -0.9934695 0.9999437 0.9935281 -0.9934695 0.9999437 0.9935281 -0.9934695 0.9999437 0.9935281 -0.9934694 0.9999437 0.9935281 -0.9934694 0.9999437 0.993528 -0.9934694 0.9999437 0.993528 -0.9934694 0.9999437 0.993528 -0.9934694 0.9999437 0.9935279 -0.9934694 0.9999437 0.9935279 -0.9934694 0.9999437 0.9935278 -0.9934694 0.9999437 0.9935277 -0.9934694 0.9999437 0.9935277 -0.9934695 0.9999437 0.9935277 -0.9934697 0.9999437 0.9935277 -0.9934698 0.9999437 0.9935277 -0.9934701 0.9999437 0.9935277 -0.9934704 0.9999437 0.9935277 -0.9934707 0.9999437 0.9935277 -0.9934712 0.9999437 0.9935277 -0.9934718 0.9999437 0.9935277 -0.9934725 0.9999437 0.9935277 -0.9934734 0.9999437 0.9935277 -0.9934746 0.9999437 0.9935277 -0.9934761 0.9999437 0.9935277 -0.9934779 0.9999437 0.9935277 -0.9934803 0.9999437 0.9935277 -0.9934833 0.9999437 0.9935277 -0.9934871 0.9999437 0.9935277 -0.9934919 0.9999437 0.9935277 -0.993498 0.9999437 0.9935277 -0.9935057 0.9999437 0.9935277 -0.9935154 0.9999437 0.9935277 -0.9935277 0.9999437 0.9935277 -0.9935432 0.9999437 0.9935277 -0.9935629 0.9999437 0.9935277 -0.9935878 0.9999437 0.9935277 -0.9936193 0.9999437 0.9935277 -0.9936592 0.9999437 0.9935277 -0.9937096 0.9999437 0.9935277 -0.9937734 0.9999437 0.9935277 -0.9938541 0.9999437 0.9935277 -0.9939562 0.9999437 0.9935277 -0.9940854 0.9999437 0.9935277 -0.9942488 0.9999437 0.9935277 -0.9944556 0.9999437 0.9935277 -0.9947172 0.9999437 0.9935277 -0.9950481 0.9999437 0.9935277 -0.9954668 0.9999437 0.9935277 -0.9959964 0.9999437 0.9935277 -0.9966665 0.9999437 0.9935277 -0.9975143 0.9999437 0.9935277 -0.9985868 0.9999437 0.9935277 -0.9999437 0.9999437 0.9935277 -0.6139459 0.6139459 0.9948662 -0.6139627 0.6139459 0.9948662 -0.6139839 0.6139459 0.9948662 -0.6140108 0.6139459 0.9948662 -0.6140448 0.6139459 0.9948662 -0.6140879 0.6139459 0.9948662 -0.6141423 0.6139459 0.9948662 -0.6142112 0.6139459 0.9948662 -0.6142984 0.6139459 0.9948662 -0.6144087 0.6139459 0.9948662 -0.6145482 0.6139459 0.9948662 -0.6147247 0.6139459 0.9948662 -0.6149479 0.6139459 0.9948662 -0.6152304 0.6139459 0.9948662 -0.6155878 0.6139459 0.9948662 -0.6160399 0.6139459 0.9948662 -0.6166119 0.6139459 0.9948662 -0.6173355 0.6139459 0.9948662 -0.6182511 0.6139459 0.9948662 -0.6194093 0.6139459 0.9948662 -0.6208746 0.6139459 0.9948662 -0.6227284 0.6139459 0.9948662 -0.6250738 0.6139459 0.9948662 -0.6280409 0.6139459 0.9948662 -0.6317947 0.6139459 0.9948662 -0.6365438 0.6139459 0.9948662 -0.642552 0.6139459 0.9948662 -0.6501531 0.6139459 0.9948662 -0.6597695 0.6139459 0.9948662 -0.6719355 0.6139459 0.9948662 -0.6873271 0.6139459 0.9948662 -0.7067995 0.6139459 0.9948662 -0.7314346 0.6139459 0.9948662 -0.7626012 0.6139459 0.9948662 -0.802031 0.6139459 0.9948662 -0.8519149 0.6139459 0.9948662 -0.9150244 0.6139459 0.9948662 -0.9948662 0.6139459 0.9948662 -0.9959813 0.6724572 0.9281722 -0.9968475 0.7251659 0.8948976 -0.997523 0.7716588 0.8831923 -0.9980513 0.8119154 0.884567 -0.9984653 0.8462171 0.8931877 -0.9987905 0.8750477 0.9052232 -0.9990461 0.8990028 0.9182862 -0.9992474 0.9187175 0.9309867 -0.999406 0.9348153 0.9425936 -0.999531 0.9478754 0.9527924 -0.9996296 0.958416 0.9615169 -0.9997074 0.9668873 0.9688392 -0.9997689 0.9736726 0.9748994 -0.9998174 0.9790927 0.9798628 -0.9998557 0.9834129 0.9838959 -0.999886 0.9868505 0.9871531 -0.9999099 0.989582 0.9897715 -0.9999288 0.9917501 0.9918687 -0.9999437 0.9934695 0.9935437 -0.6139459 0.6139627 0.9948662 -0.6139352 0.6139352 0.994866 -0.6139564 0.6139352 0.994866 -0.6139833 0.6139352 0.994866 -0.6140174 0.6139352 0.994866 -0.6140604 0.6139352 0.994866 -0.6141149 0.6139352 0.994866 -0.6141838 0.6139352 0.994866 -0.6142709 0.6139352 0.994866 -0.6143812 0.6139352 0.994866 -0.6145207 0.6139352 0.994866 -0.6146972 0.6139352 0.994866 -0.6149205 0.6139352 0.994866 -0.615203 0.6139352 0.994866 -0.6155604 0.6139352 0.994866 -0.6160126 0.6139352 0.994866 -0.6165846 0.6139352 0.994866 -0.6173083 0.6139352 0.994866 -0.6182239 0.6139352 0.994866 -0.6193822 0.6139352 0.994866 -0.6208476 0.6139352 0.994866 -0.6227016 0.6139352 0.994866 -0.6250471 0.6139352 0.994866 -0.6280144 0.6139352 0.994866 -0.6317685 0.6139352 0.994866 -0.6365179 0.6139352 0.994866 -0.6425265 0.6139352 0.994866 -0.6501282 0.6139352 0.994866 -0.6597453 0.6139352 0.994866 -0.6719122 0.6139352 0.994866 -0.6873049 0.6139352 0.994866 -0.7067787 0.6139352 0.994866 -0.7314156 0.6139352 0.994866 -0.7625844 0.6139352 0.994866 -0.802017 0.6139352 0.994866 -0.8519044 0.6139352 0.994866 -0.9150185 0.6139352 0.994866 -0.994866 0.6139352 0.994866 -0.9959811 0.6724495 0.9281681 -0.9968474 0.7251605 0.8948926 -0.997523 0.7716551 0.8831879 -0.9980512 0.8119128 0.8845635 -0.9984653 0.8462154 0.8931851 -0.9987905 0.8750466 0.9052213 -0.9990461 0.899002 0.9182849 -0.9992474 0.918717 0.9309858 -0.999406 0.9348149 0.9425931 -0.999531 0.9478752 0.952792 -0.9996296 0.9584159 0.9615166 -0.9997074 0.9668872 0.968839 -0.9997689 0.9736726 0.9748993 -0.9998174 0.9790927 0.9798627 -0.9998557 0.9834129 0.9838958 -0.999886 0.9868505 0.9871531 -0.9999099 0.989582 0.9897715 -0.9999288 0.9917501 0.9918687 -0.9999437 0.9934695 0.9935437 -0.6139459 0.6139839 0.9948662 -0.6139352 0.6139564 0.994866 -0.6139219 0.6139219 0.9948657 -0.6139488 0.6139219 0.9948657 -0.6139828 0.6139219 0.9948657 -0.6140259 0.6139219 0.9948657 -0.6140804 0.6139219 0.9948657 -0.6141493 0.6139219 0.9948657 -0.6142364 0.6139219 0.9948657 -0.6143467 0.6139219 0.9948657 -0.6144862 0.6139219 0.9948657 -0.6146628 0.6139219 0.9948657 -0.6148861 0.6139219 0.9948657 -0.6151686 0.6139219 0.9948657 -0.615526 0.6139219 0.9948657 -0.6159782 0.6139219 0.9948657 -0.6165503 0.6139219 0.9948657 -0.6172741 0.6139219 0.9948657 -0.6181897 0.6139219 0.9948657 -0.6193482 0.6139219 0.9948657 -0.6208137 0.6139219 0.9948657 -0.6226678 0.6139219 0.9948657 -0.6250135 0.6139219 0.9948657 -0.6279812 0.6139219 0.9948657 -0.6317356 0.6139219 0.9948657 -0.6364854 0.6139219 0.9948657 -0.6424946 0.6139219 0.9948657 -0.6500969 0.6139219 0.9948657 -0.6597149 0.6139219 0.9948657 -0.6718829 0.6139219 0.9948657 -0.687277 0.6139219 0.9948657 -0.7067525 0.6139219 0.9948657 -0.7313916 0.6139219 0.9948657 -0.7625632 0.6139219 0.9948657 -0.8019994 0.6139219 0.9948657 -0.8518913 0.6139219 0.9948657 -0.915011 0.6139219 0.9948657 -0.9948657 0.6139219 0.9948657 -0.9959809 0.6724399 0.928163 -0.9968473 0.7251537 0.8948865 -0.9975229 0.7716504 0.8831823 -0.9980512 0.8119096 0.8845591 -0.9984653 0.8462132 0.8931818 -0.9987904 0.8750451 0.905219 -0.9990461 0.8990011 0.9182833 -0.9992474 0.9187164 0.9309847 -0.999406 0.9348146 0.9425924 -0.999531 0.947875 0.9527916 -0.9996296 0.9584157 0.9615163 -0.9997074 0.9668871 0.9688388 -0.9997689 0.9736725 0.9748991 -0.9998174 0.9790927 0.9798626 -0.9998557 0.9834129 0.9838958 -0.999886 0.9868505 0.9871531 -0.9999099 0.989582 0.9897715 -0.9999288 0.9917501 0.9918687 -0.9999437 0.9934695 0.9935437 -0.6139459 0.6140108 0.9948662 -0.6139352 0.6139833 0.994866 -0.6139219 0.6139488 0.9948657 -0.6139056 0.6139056 0.9948653 -0.6139396 0.6139056 0.9948653 -0.6139827 0.6139056 0.9948653 -0.6140371 0.6139056 0.9948653 -0.614106 0.6139056 0.9948653 -0.6141932 0.6139056 0.9948653 -0.6143035 0.6139056 0.9948653 -0.6144431 0.6139056 0.9948653 -0.6146196 0.6139056 0.9948653 -0.6148429 0.6139056 0.9948653 -0.6151255 0.6139056 0.9948653 -0.615483 0.6139056 0.9948653 -0.6159352 0.6139056 0.9948653 -0.6165074 0.6139056 0.9948653 -0.6172312 0.6139056 0.9948653 -0.618147 0.6139056 0.9948653 -0.6193055 0.6139056 0.9948653 -0.6207712 0.6139056 0.9948653 -0.6226256 0.6139056 0.9948653 -0.6249715 0.6139056 0.9948653 -0.6279395 0.6139056 0.9948653 -0.6316943 0.6139056 0.9948653 -0.6364447 0.6139056 0.9948653 -0.6424545 0.6139056 0.9948653 -0.6500577 0.6139056 0.9948653 -0.6596768 0.6139056 0.9948653 -0.6718462 0.6139056 0.9948653 -0.687242 0.6139056 0.9948653 -0.7067197 0.6139056 0.9948653 -0.7313616 0.6139056 0.9948653 -0.7625367 0.6139056 0.9948653 -0.8019773 0.6139056 0.9948653 -0.8518748 0.6139056 0.9948653 -0.9150017 0.6139056 0.9948653 -0.9948653 0.6139056 0.9948653 -0.9959807 0.672428 0.9281566 -0.9968472 0.7251454 0.8948788 -0.9975228 0.7716446 0.8831754 -0.9980511 0.8119057 0.8845535 -0.9984653 0.8462106 0.8931777 -0.9987904 0.8750434 0.905216 -0.9990461 0.899 0.9182813 -0.9992474 0.9187157 0.9309833 -0.999406 0.9348141 0.9425915 -0.999531 0.9478746 0.952791 -0.9996296 0.9584155 0.9615159 -0.9997074 0.966887 0.9688386 -0.9997689 0.9736724 0.974899 -0.9998174 0.9790926 0.9798625 -0.9998557 0.9834129 0.9838957 -0.999886 0.9868505 0.987153 -0.9999099 0.989582 0.9897715 -0.9999288 0.9917501 0.9918687 -0.9999437 0.9934695 0.9935437 -0.6139459 0.6140448 0.9948662 -0.6139352 0.6140174 0.994866 -0.6139219 0.6139828 0.9948657 -0.6139056 0.6139396 0.9948653 -0.6138855 0.6138855 0.9948649 -0.6139286 0.6138855 0.9948649 -0.6139831 0.6138855 0.9948649 -0.614052 0.6138855 0.9948649 -0.6141392 0.6138855 0.9948649 -0.6142495 0.6138855 0.9948649 -0.6143891 0.6138855 0.9948649 -0.6145656 0.6138855 0.9948649 -0.614789 0.6138855 0.9948649 -0.6150716 0.6138855 0.9948649 -0.6154291 0.6138855 0.9948649 -0.6158814 0.6138855 0.9948649 -0.6164537 0.6138855 0.9948649 -0.6171776 0.6138855 0.9948649 -0.6180935 0.6138855 0.9948649 -0.6192522 0.6138855 0.9948649 -0.6207181 0.6138855 0.9948649 -0.6225727 0.6138855 0.9948649 -0.624919 0.6138855 0.9948649 -0.6278874 0.6138855 0.9948649 -0.6316428 0.6138855 0.9948649 -0.6363938 0.6138855 0.9948649 -0.6424045 0.6138855 0.9948649 -0.6500088 0.6138855 0.9948649 -0.6596292 0.6138855 0.9948649 -0.6718002 0.6138855 0.9948649 -0.6871982 0.6138855 0.9948649 -0.7066787 0.6138855 0.9948649 -0.731324 0.6138855 0.9948649 -0.7625036 0.6138855 0.9948649 -0.8019497 0.6138855 0.9948649 -0.8518543 0.6138855 0.9948649 -0.91499 0.6138855 0.9948649 -0.9948649 0.6138855 0.9948649 -0.9959804 0.6724135 0.9281485 -0.996847 0.7251351 0.8948691 -0.9975227 0.7716375 0.8831667 -0.9980511 0.8119009 0.8845466 -0.9984652 0.8462073 0.8931725 -0.9987904 0.8750412 0.9052124 -0.9990461 0.8989986 0.9182787 -0.9992474 0.9187148 0.9309816 -0.999406 0.9348135 0.9425903 -0.999531 0.9478743 0.9527902 -0.9996296 0.9584153 0.9615155 -0.9997074 0.9668869 0.9688383 -0.9997689 0.9736723 0.9748988 -0.9998174 0.9790925 0.9798624 -0.9998557 0.9834128 0.9838956 -0.999886 0.9868504 0.987153 -0.9999099 0.989582 0.9897714 -0.9999288 0.9917501 0.9918687 -0.9999437 0.9934695 0.9935437 -0.6139459 0.6140879 0.9948662 -0.6139352 0.6140604 0.994866 -0.6139219 0.6140259 0.9948657 -0.6139056 0.6139827 0.9948653 -0.6138855 0.6139286 0.9948649 -0.6138613 0.6138613 0.9948643 -0.6139158 0.6138613 0.9948643 -0.6139847 0.6138613 0.9948643 -0.6140719 0.6138613 0.9948643 -0.6141822 0.6138613 0.9948643 -0.6143218 0.6138613 0.9948643 -0.6144984 0.6138613 0.9948643 -0.6147218 0.6138613 0.9948643 -0.6150045 0.6138613 0.9948643 -0.6153621 0.6138613 0.9948643 -0.6158144 0.6138613 0.9948643 -0.6163868 0.6138613 0.9948643 -0.6171109 0.6138613 0.9948643 -0.6180269 0.6138613 0.9948643 -0.6191858 0.6138613 0.9948643 -0.620652 0.6138613 0.9948643 -0.6225069 0.6138613 0.9948643 -0.6248536 0.6138613 0.9948643 -0.6278225 0.6138613 0.9948643 -0.6315785 0.6138613 0.9948643 -0.6363304 0.6138613 0.9948643 -0.6423421 0.6138613 0.9948643 -0.6499478 0.6138613 0.9948643 -0.6595699 0.6138613 0.9948643 -0.6717431 0.6138613 0.9948643 -0.6871438 0.6138613 0.9948643 -0.7066276 0.6138613 0.9948643 -0.7312773 0.6138613 0.9948643 -0.7624623 0.6138613 0.9948643 -0.8019154 0.6138613 0.9948643 -0.8518286 0.6138613 0.9948643 -0.9149754 0.6138613 0.9948643 -0.9948643 0.6138613 0.9948643 -0.9959801 0.6723959 0.9281385 -0.9968468 0.7251226 0.8948571 -0.9975226 0.7716288 0.8831558 -0.998051 0.8118949 0.8845379 -0.9984652 0.8462034 0.8931661 -0.9987904 0.8750386 0.9052078 -0.9990461 0.8989969 0.9182756 -0.9992474 0.9187137 0.9309795 -0.9994059 0.9348128 0.9425889 -0.999531 0.9478738 0.9527893 -0.9996296 0.958415 0.9615149 -0.9997074 0.9668867 0.9688379 -0.9997689 0.9736722 0.9748985 -0.9998174 0.9790925 0.9798623 -0.9998557 0.9834128 0.9838955 -0.999886 0.9868504 0.9871529 -0.9999099 0.9895819 0.9897714 -0.9999288 0.9917501 0.9918686 -0.9999437 0.9934695 0.9935437 -0.6139459 0.6141423 0.9948662 -0.6139352 0.6141149 0.994866 -0.6139219 0.6140804 0.9948657 -0.6139056 0.6140371 0.9948653 -0.6138855 0.6139831 0.9948649 -0.6138613 0.6139158 0.9948643 -0.6138323 0.6138323 0.9948636 -0.6139012 0.6138323 0.9948636 -0.6139885 0.6138323 0.9948636 -0.6140988 0.6138323 0.9948636 -0.6142384 0.6138323 0.9948636 -0.6144151 0.6138323 0.9948636 -0.6146385 0.6138323 0.9948636 -0.6149212 0.6138323 0.9948636 -0.6152789 0.6138323 0.9948636 -0.6157314 0.6138323 0.9948636 -0.6163039 0.6138323 0.9948636 -0.6170281 0.6138323 0.9948636 -0.6179443 0.6138323 0.9948636 -0.6191035 0.6138323 0.9948636 -0.62057 0.6138323 0.9948636 -0.6224253 0.6138323 0.9948636 -0.6247725 0.6138323 0.9948636 -0.6277421 0.6138323 0.9948636 -0.6314989 0.6138323 0.9948636 -0.6362518 0.6138323 0.9948636 -0.6422649 0.6138323 0.9948636 -0.6498721 0.6138323 0.9948636 -0.6594963 0.6138323 0.9948636 -0.6716722 0.6138323 0.9948636 -0.6870762 0.6138323 0.9948636 -0.7065643 0.6138323 0.9948636 -0.7312193 0.6138323 0.9948636 -0.7624111 0.6138323 0.9948636 -0.8018727 0.6138323 0.9948636 -0.8517969 0.6138323 0.9948636 -0.9149574 0.6138323 0.9948636 -0.9948636 0.6138323 0.9948636 -0.9959797 0.6723748 0.928126 -0.9968465 0.7251076 0.8948422 -0.9975224 0.7716184 0.8831424 -0.9980509 0.8118878 0.8845272 -0.9984651 0.8461986 0.8931581 -0.9987903 0.8750355 0.9052021 -0.9990461 0.8989948 0.9182717 -0.9992473 0.9187123 0.9309769 -0.9994059 0.9348119 0.9425872 -0.999531 0.9478733 0.9527882 -0.9996296 0.9584146 0.9615141 -0.9997074 0.9668865 0.9688374 -0.9997689 0.9736721 0.9748982 -0.9998174 0.9790924 0.9798621 -0.9998557 0.9834127 0.9838954 -0.999886 0.9868504 0.9871528 -0.9999099 0.9895819 0.9897713 -0.9999288 0.99175 0.9918686 -0.9999437 0.9934695 0.9935436 -0.6139459 0.6142112 0.9948662 -0.6139352 0.6141838 0.994866 -0.6139219 0.6141493 0.9948657 -0.6139056 0.614106 0.9948653 -0.6138855 0.614052 0.9948649 -0.6138613 0.6139847 0.9948643 -0.6138323 0.6139012 0.9948636 -0.6137984 0.6137984 0.9948628 -0.6138856 0.6137984 0.9948628 -0.613996 0.6137984 0.9948628 -0.6141357 0.6137984 0.9948628 -0.6143124 0.6137984 0.9948628 -0.6145359 0.6137984 0.9948628 -0.6148187 0.6137984 0.9948628 -0.6151764 0.6137984 0.9948628 -0.615629 0.6137984 0.9948628 -0.6162016 0.6137984 0.9948628 -0.6169261 0.6137984 0.9948628 -0.6178426 0.6137984 0.9948628 -0.619002 0.6137984 0.9948628 -0.6204689 0.6137984 0.9948628 -0.6223247 0.6137984 0.9948628 -0.6246726 0.6137984 0.9948628 -0.6276429 0.6137984 0.9948628 -0.6314008 0.6137984 0.9948628 -0.6361549 0.6137984 0.9948628 -0.6421696 0.6137984 0.9948628 -0.6497789 0.6137984 0.9948628 -0.6594057 0.6137984 0.9948628 -0.6715848 0.6137984 0.9948628 -0.6869929 0.6137984 0.9948628 -0.7064863 0.6137984 0.9948628 -0.7311479 0.6137984 0.9948628 -0.762348 0.6137984 0.9948628 -0.8018202 0.6137984 0.9948628 -0.8517577 0.6137984 0.9948628 -0.9149351 0.6137984 0.9948628 -0.9948628 0.6137984 0.9948628 -0.9959791 0.67235 0.9281107 -0.9968462 0.7250899 0.8948238 -0.9975222 0.7716061 0.8831259 -0.9980508 0.8118794 0.884514 -0.998465 0.8461929 0.8931483 -0.9987903 0.8750317 0.9051951 -0.999046 0.8989923 0.9182669 -0.9992473 0.9187107 0.9309736 -0.9994059 0.9348109 0.942585 -0.999531 0.9478726 0.9527868 -0.9996296 0.9584142 0.9615132 -0.9997074 0.9668862 0.9688368 -0.9997689 0.9736719 0.9748979 -0.9998174 0.9790923 0.9798618 -0.9998557 0.9834127 0.9838953 -0.999886 0.9868503 0.9871527 -0.9999099 0.9895819 0.9897713 -0.9999288 0.99175 0.9918686 -0.9999437 0.9934694 0.9935436 -0.6139459 0.6142984 0.9948662 -0.6139352 0.6142709 0.994866 -0.6139219 0.6142364 0.9948657 -0.6139056 0.6141932 0.9948653 -0.6138855 0.6141392 0.9948649 -0.6138613 0.6140719 0.9948643 -0.6138323 0.6139885 0.9948636 -0.6137984 0.6138856 0.9948628 -0.6137599 0.6137599 0.9948617 -0.6138703 0.6137599 0.9948617 -0.61401 0.6137599 0.9948617 -0.6141868 0.6137599 0.9948617 -0.6144104 0.6137599 0.9948617 -0.6146932 0.6137599 0.9948617 -0.6150511 0.6137599 0.9948617 -0.6155039 0.6137599 0.9948617 -0.6160767 0.6137599 0.9948617 -0.6168013 0.6137599 0.9948617 -0.6177181 0.6137599 0.9948617 -0.618878 0.6137599 0.9948617 -0.6203453 0.6137599 0.9948617 -0.6222018 0.6137599 0.9948617 -0.6245504 0.6137599 0.9948617 -0.6275217 0.6137599 0.9948617 -0.6312808 0.6137599 0.9948617 -0.6360365 0.6137599 0.9948617 -0.6420531 0.6137599 0.9948617 -0.6496649 0.6137599 0.9948617 -0.6592948 0.6137599 0.9948617 -0.6714779 0.6137599 0.9948617 -0.6868911 0.6137599 0.9948617 -0.7063908 0.6137599 0.9948617 -0.7310605 0.6137599 0.9948617 -0.7622708 0.6137599 0.9948617 -0.801756 0.6137599 0.9948617 -0.8517098 0.6137599 0.9948617 -0.9149079 0.6137599 0.9948617 -0.9948617 0.6137599 0.9948617 -0.9959785 0.6723217 0.928092 -0.9968458 0.7250697 0.8948014 -0.997522 0.7715919 0.8831056 -0.9980506 0.8118697 0.8844979 -0.9984649 0.8461864 0.8931363 -0.9987902 0.8750274 0.9051866 -0.999046 0.8989895 0.918261 -0.9992473 0.9187089 0.9309697 -0.9994059 0.9348097 0.9425824 -0.999531 0.9478718 0.9527851 -0.9996296 0.9584137 0.9615121 -0.9997074 0.9668859 0.9688361 -0.9997689 0.9736717 0.9748974 -0.9998174 0.9790921 0.9798615 -0.9998557 0.9834126 0.9838951 -0.999886 0.9868503 0.9871526 -0.9999099 0.9895819 0.9897712 -0.9999288 0.99175 0.9918685 -0.9999437 0.9934694 0.9935436 -0.6139459 0.6144087 0.9948662 -0.6139352 0.6143812 0.994866 -0.6139219 0.6143467 0.9948657 -0.6139056 0.6143035 0.9948653 -0.6138855 0.6142495 0.9948649 -0.6138613 0.6141822 0.9948643 -0.6138323 0.6140988 0.9948636 -0.6137984 0.613996 0.9948628 -0.6137599 0.6138703 0.9948617 -0.6137183 0.6137183 0.9948604 -0.613858 0.6137183 0.9948604 -0.6140348 0.6137183 0.9948604 -0.6142585 0.6137183 0.9948604 -0.6145415 0.6137183 0.9948604 -0.6148995 0.6137183 0.9948604 -0.6153525 0.6137183 0.9948604 -0.6159255 0.6137183 0.9948604 -0.6166504 0.6137183 0.9948604 -0.6175676 0.6137183 0.9948604 -0.6187279 0.6137183 0.9948604 -0.6201959 0.6137183 0.9948604 -0.622053 0.6137183 0.9948604 -0.6244026 0.6137183 0.9948604 -0.627375 0.6137183 0.9948604 -0.6311356 0.6137183 0.9948604 -0.6358932 0.6137183 0.9948604 -0.6419122 0.6137183 0.9948604 -0.649527 0.6137183 0.9948604 -0.6591607 0.6137183 0.9948604 -0.6713487 0.6137183 0.9948604 -0.686768 0.6137183 0.9948604 -0.7062754 0.6137183 0.9948604 -0.7309548 0.6137183 0.9948604 -0.7621775 0.6137183 0.9948604 -0.8016783 0.6137183 0.9948604 -0.8516519 0.6137183 0.9948604 -0.914875 0.6137183 0.9948604 -0.9948604 0.6137183 0.9948604 -0.9959777 0.6722907 0.9280693 -0.9968453 0.7250473 0.8947742 -0.9975217 0.7715762 0.8830811 -0.9980504 0.8118589 0.8844784 -0.9984648 0.8461791 0.8931218 -0.9987902 0.8750225 0.9051763 -0.9990459 0.8989863 0.9182539 -0.9992473 0.9187068 0.9309649 -0.9994059 0.9348083 0.9425792 -0.9995309 0.947871 0.952783 -0.9996296 0.9584132 0.9615108 -0.9997074 0.9668855 0.9688353 -0.9997689 0.9736715 0.9748969 -0.9998174 0.979092 0.9798612 -0.9998557 0.9834125 0.9838948 -0.999886 0.9868502 0.9871525 -0.9999099 0.9895818 0.9897711 -0.9999288 0.99175 0.9918685 -0.9999437 0.9934694 0.9935436 -0.6139459 0.6145482 0.9948662 -0.6139352 0.6145207 0.994866 -0.6139219 0.6144862 0.9948657 -0.6139056 0.6144431 0.9948653 -0.6138855 0.6143891 0.9948649 -0.6138613 0.6143218 0.9948643 -0.6138323 0.6142384 0.9948636 -0.6137984 0.6141357 0.9948628 -0.6137599 0.61401 0.9948617 -0.6137183 0.613858 0.9948604 -0.6136769 0.6136769 0.9948589 -0.6138538 0.6136769 0.9948589 -0.6140776 0.6136769 0.9948589 -0.6143607 0.6136769 0.9948589 -0.6147189 0.6136769 0.9948589 -0.615172 0.6136769 0.9948589 -0.6157453 0.6136769 0.9948589 -0.6164706 0.6136769 0.9948589 -0.6173882 0.6136769 0.9948589 -0.6185491 0.6136769 0.9948589 -0.6200177 0.6136769 0.9948589 -0.6218758 0.6136769 0.9948589 -0.6242264 0.6136769 0.9948589 -0.6272003 0.6136769 0.9948589 -0.6309626 0.6136769 0.9948589 -0.6357225 0.6136769 0.9948589 -0.6417443 0.6136769 0.9948589 -0.6493627 0.6136769 0.9948589 -0.659001 0.6136769 0.9948589 -0.6711946 0.6136769 0.9948589 -0.6866212 0.6136769 0.9948589 -0.7061378 0.6136769 0.9948589 -0.7308289 0.6136769 0.9948589 -0.7620663 0.6136769 0.9948589 -0.8015857 0.6136769 0.9948589 -0.8515828 0.6136769 0.9948589 -0.9148357 0.6136769 0.9948589 -0.9948589 0.6136769 0.9948589 -0.9959768 0.6722594 0.9280423 -0.9968448 0.7250244 0.8947418 -0.9975213 0.7715599 0.883052 -0.9980502 0.8118476 0.8844551 -0.9984647 0.8461714 0.8931045 -0.9987901 0.8750173 0.905164 -0.9990459 0.8989829 0.9182454 -0.9992472 0.9187045 0.9309592 -0.9994059 0.9348069 0.9425755 -0.9995309 0.94787 0.9527805 -0.9996296 0.9584126 0.9615092 -0.9997074 0.9668852 0.9688342 -0.9997689 0.9736712 0.9748962 -0.9998174 0.9790919 0.9798608 -0.9998557 0.9834124 0.9838946 -0.999886 0.9868502 0.9871523 -0.9999099 0.9895818 0.989771 -0.9999288 0.99175 0.9918684 -0.9999437 0.9934694 0.9935435 -0.6139459 0.6147247 0.9948662 -0.6139352 0.6146972 0.994866 -0.6139219 0.6146628 0.9948657 -0.6139056 0.6146196 0.9948653 -0.6138855 0.6145656 0.9948649 -0.6138613 0.6144984 0.9948643 -0.6138323 0.6144151 0.9948636 -0.6137984 0.6143124 0.9948628 -0.6137599 0.6141868 0.9948617 -0.6137183 0.6140348 0.9948604 -0.6136769 0.6138538 0.9948589 -0.6136427 0.6136427 0.9948571 -0.6138666 0.6136427 0.9948571 -0.6141499 0.6136427 0.9948571 -0.6145083 0.6136427 0.9948571 -0.6149617 0.6136427 0.9948571 -0.6155353 0.6136427 0.9948571 -0.616261 0.6136427 0.9948571 -0.617179 0.6136427 0.9948571 -0.6183406 0.6136427 0.9948571 -0.61981 0.6136427 0.9948571 -0.6216691 0.6136427 0.9948571 -0.624021 0.6136427 0.9948571 -0.6269965 0.6136427 0.9948571 -0.6307609 0.6136427 0.9948571 -0.6355234 0.6136427 0.9948571 -0.6415485 0.6136427 0.9948571 -0.6491711 0.6136427 0.9948571 -0.6588147 0.6136427 0.9948571 -0.671015 0.6136427 0.9948571 -0.6864501 0.6136427 0.9948571 -0.7059774 0.6136427 0.9948571 -0.7306821 0.6136427 0.9948571 -0.7619366 0.6136427 0.9948571 -0.8014777 0.6136427 0.9948571 -0.8515024 0.6136427 0.9948571 -0.91479 0.6136427 0.9948571 -0.9948571 0.6136427 0.9948571 -0.9959757 0.6722322 0.9280109 -0.9968441 0.7250039 0.8947041 -0.9975209 0.7715449 0.883018 -0.99805 0.811837 0.8844281 -0.9984645 0.8461641 0.8930844 -0.99879 0.8750124 0.9051497 -0.9990458 0.8989796 0.9182356 -0.9992472 0.9187024 0.9309526 -0.9994059 0.9348055 0.9425711 -0.9995309 0.9478691 0.9527776 -0.9996296 0.958412 0.9615073 -0.9997074 0.9668848 0.968833 -0.9997689 0.973671 0.9748954 -0.9998174 0.9790917 0.9798603 -0.9998557 0.9834123 0.9838943 -0.999886 0.9868501 0.9871521 -0.9999099 0.9895818 0.9897709 -0.9999288 0.9917499 0.9918683 -0.9999437 0.9934694 0.9935435 -0.6139459 0.6149479 0.9948662 -0.6139352 0.6149205 0.994866 -0.6139219 0.6148861 0.9948657 -0.6139056 0.6148429 0.9948653 -0.6138855 0.614789 0.9948649 -0.6138613 0.6147218 0.9948643 -0.6138323 0.6146385 0.9948636 -0.6137984 0.6145359 0.9948628 -0.6137599 0.6144104 0.9948617 -0.6137183 0.6142585 0.9948604 -0.6136769 0.6140776 0.9948589 -0.6136427 0.6138666 0.9948571 -0.6136284 0.6136284 0.9948551 -0.6139119 0.6136284 0.9948551 -0.6142705 0.6136284 0.9948551 -0.6147242 0.6136284 0.9948551 -0.6152981 0.6136284 0.9948551 -0.6160243 0.6136284 0.9948551 -0.6169429 0.6136284 0.9948551 -0.6181052 0.6136284 0.9948551 -0.6195755 0.6136284 0.9948551 -0.6214357 0.6136284 0.9948551 -0.6237891 0.6136284 0.9948551 -0.6267665 0.6136284 0.9948551 -0.6305332 0.6136284 0.9948551 -0.6352987 0.6136284 0.9948551 -0.6413275 0.6136284 0.9948551 -0.6489548 0.6136284 0.9948551 -0.6586044 0.6136284 0.9948551 -0.6708123 0.6136284 0.9948551 -0.6862569 0.6136284 0.9948551 -0.7057964 0.6136284 0.9948551 -0.7305163 0.6136284 0.9948551 -0.7617903 0.6136284 0.9948551 -0.8013559 0.6136284 0.9948551 -0.8514115 0.6136284 0.9948551 -0.9147384 0.6136284 0.9948551 -0.9948551 0.6136284 0.9948551 -0.9959745 0.672218 0.9279753 -0.9968433 0.7249916 0.8946616 -0.9975204 0.7715352 0.8829797 -0.9980497 0.8118298 0.8843975 -0.9984643 0.8461589 0.8930617 -0.9987899 0.8750088 0.9051336 -0.9990458 0.8989771 0.9182244 -0.9992472 0.9187008 0.9309451 -0.9994058 0.9348044 0.9425661 -0.9995309 0.9478684 0.9527744 -0.9996296 0.9584115 0.9615052 -0.9997074 0.9668845 0.9688317 -0.9997689 0.9736708 0.9748946 -0.9998174 0.9790916 0.9798597 -0.9998557 0.9834122 0.9838939 -0.999886 0.9868501 0.9871519 -0.9999099 0.9895817 0.9897708 -0.9999288 0.9917499 0.9918682 -0.9999437 0.9934694 0.9935434 -0.6139459 0.6152304 0.9948662 -0.6139352 0.615203 0.994866 -0.6139219 0.6151686 0.9948657 -0.6139056 0.6151255 0.9948653 -0.6138855 0.6150716 0.9948649 -0.6138613 0.6150045 0.9948643 -0.6138323 0.6149212 0.9948636 -0.6137984 0.6148187 0.9948628 -0.6137599 0.6146932 0.9948617 -0.6137183 0.6145415 0.9948604 -0.6136769 0.6143607 0.9948589 -0.6136427 0.6141499 0.9948571 -0.6136284 0.6139119 0.9948551 -0.6136569 0.6136569 0.994853 -0.6140158 0.6136569 0.994853 -0.6144698 0.6136569 0.994853 -0.6150441 0.6136569 0.994853 -0.6157707 0.6136569 0.994853 -0.61669 0.6136569 0.994853 -0.617853 0.6136569 0.994853 -0.6193243 0.6136569 0.994853 -0.6211858 0.6136569 0.994853 -0.6235407 0.6136569 0.994853 -0.6265201 0.6136569 0.994853 -0.6302893 0.6136569 0.994853 -0.6350579 0.6136569 0.994853 -0.6410908 0.6136569 0.994853 -0.6487231 0.6136569 0.994853 -0.6583791 0.6136569 0.994853 -0.6705951 0.6136569 0.994853 -0.68605 0.6136569 0.994853 -0.7056024 0.6136569 0.994853 -0.7303387 0.6136569 0.994853 -0.7616334 0.6136569 0.994853 -0.8012253 0.6136569 0.994853 -0.8513142 0.6136569 0.994853 -0.9146831 0.6136569 0.994853 -0.994853 0.6136569 0.994853 -0.9959732 0.672232 0.9279373 -0.9968425 0.7249978 0.894616 -0.9975199 0.7715376 0.8829386 -0.9980494 0.8118303 0.8843648 -0.9984642 0.8461587 0.8930373 -0.9987897 0.8750084 0.9051163 -0.9990457 0.8989767 0.9182125 -0.9992471 0.9187004 0.930937 -0.9994058 0.9348042 0.9425608 -0.9995309 0.9478683 0.9527709 -0.9996295 0.9584114 0.961503 -0.9997074 0.9668844 0.9688303 -0.9997689 0.9736708 0.9748937 -0.9998174 0.9790916 0.9798592 -0.9998557 0.9834122 0.9838936 -0.999886 0.98685 0.9871517 -0.9999099 0.9895817 0.9897706 -0.9999288 0.9917499 0.9918681 -0.9999437 0.9934694 0.9935434 -0.6139459 0.6155878 0.9948662 -0.6139352 0.6155604 0.994866 -0.6139219 0.615526 0.9948657 -0.6139056 0.615483 0.9948653 -0.6138855 0.6154291 0.9948649 -0.6138613 0.6153621 0.9948643 -0.6138323 0.6152789 0.9948636 -0.6137984 0.6151764 0.9948628 -0.6137599 0.6150511 0.9948617 -0.6137183 0.6148995 0.9948604 -0.6136769 0.6147189 0.9948589 -0.6136427 0.6145083 0.9948571 -0.6136284 0.6142705 0.9948551 -0.6136569 0.6140158 0.994853 -0.6137675 0.6137675 0.9948509 -0.6142218 0.6137675 0.9948509 -0.6147965 0.6137675 0.9948509 -0.6155236 0.6137675 0.9948509 -0.6164434 0.6137675 0.9948509 -0.6176072 0.6137675 0.9948509 -0.6190795 0.6137675 0.9948509 -0.6209421 0.6137675 0.9948509 -0.6232986 0.6137675 0.9948509 -0.6262799 0.6137675 0.9948509 -0.6300515 0.6137675 0.9948509 -0.6348232 0.6137675 0.9948509 -0.64086 0.6137675 0.9948509 -0.6484973 0.6137675 0.9948509 -0.6581595 0.6137675 0.9948509 -0.6703834 0.6137675 0.9948509 -0.6858483 0.6137675 0.9948509 -0.7054133 0.6137675 0.9948509 -0.7301657 0.6137675 0.9948509 -0.7614806 0.6137675 0.9948509 -0.801098 0.6137675 0.9948509 -0.8512193 0.6137675 0.9948509 -0.9146292 0.6137675 0.9948509 -0.9948509 0.6137675 0.9948509 -0.9959719 0.6723012 0.9279002 -0.9968418 0.7250408 0.8945716 -0.9975194 0.7715641 0.8828986 -0.9980491 0.8118466 0.8843329 -0.998464 0.8461687 0.8930136 -0.9987896 0.8750145 0.9050994 -0.9990456 0.8989805 0.9182009 -0.9992471 0.9187027 0.9309292 -0.9994058 0.9348056 0.9425556 -0.9995309 0.9478691 0.9527675 -0.9996295 0.958412 0.9615008 -0.9997074 0.9668847 0.9688289 -0.9997688 0.973671 0.9748928 -0.9998174 0.9790917 0.9798586 -0.9998557 0.9834123 0.9838932 -0.999886 0.9868501 0.9871514 -0.9999099 0.9895817 0.9897705 -0.9999288 0.9917499 0.9918681 -0.9999437 0.9934694 0.9935433 -0.6139459 0.6160399 0.9948662 -0.6139352 0.6160126 0.994866 -0.6139219 0.6159782 0.9948657 -0.6139056 0.6159352 0.9948653 -0.6138855 0.6158814 0.9948649 -0.6138613 0.6158144 0.9948643 -0.6138323 0.6157314 0.9948636 -0.6137984 0.615629 0.9948628 -0.6137599 0.6155039 0.9948617 -0.6137183 0.6153525 0.9948604 -0.6136769 0.615172 0.9948589 -0.6136427 0.6149617 0.9948571 -0.6136284 0.6147242 0.9948551 -0.6136569 0.6144698 0.994853 -0.6137675 0.6142218 0.9948509 -0.6140266 0.6140266 0.9948493 -0.6146016 0.6140266 0.9948493 -0.6153291 0.6140266 0.9948493 -0.6162494 0.6140266 0.9948493 -0.6174138 0.6140266 0.9948493 -0.6188868 0.6140266 0.9948493 -0.6207504 0.6140266 0.9948493 -0.6231081 0.6140266 0.9948493 -0.6260909 0.6140266 0.9948493 -0.6298645 0.6140266 0.9948493 -0.6346385 0.6140266 0.9948493 -0.6406784 0.6140266 0.9948493 -0.6483196 0.6140266 0.9948493 -0.6579867 0.6140266 0.9948493 -0.6702168 0.6140266 0.9948493 -0.6856895 0.6140266 0.9948493 -0.7052645 0.6140266 0.9948493 -0.7300295 0.6140266 0.9948493 -0.7613603 0.6140266 0.9948493 -0.8009979 0.6140266 0.9948493 -0.8511446 0.6140266 0.9948493 -0.9145867 0.6140266 0.9948493 -0.9948493 0.6140266 0.9948493 -0.9959709 0.6724711 0.927871 -0.9968411 0.7251511 0.8945366 -0.9975191 0.7716352 0.8828672 -0.9980488 0.8118921 0.8843078 -0.9984638 0.8461977 0.892995 -0.9987895 0.8750329 0.9050862 -0.9990456 0.8989921 0.9181918 -0.999247 0.9187101 0.9309231 -0.9994057 0.9348102 0.9425516 -0.9995309 0.947872 0.9527649 -0.9996295 0.9584138 0.9614991 -0.9997074 0.9668859 0.9688277 -0.9997688 0.9736717 0.9748921 -0.9998174 0.9790921 0.9798581 -0.9998557 0.9834126 0.9838929 -0.999886 0.9868503 0.9871513 -0.9999099 0.9895819 0.9897704 -0.9999288 0.99175 0.991868 -0.9999437 0.9934694 0.9935432 -0.6139459 0.6166119 0.9948662 -0.6139352 0.6165846 0.994866 -0.6139219 0.6165503 0.9948657 -0.6139056 0.6165074 0.9948653 -0.6138855 0.6164537 0.9948649 -0.6138613 0.6163868 0.9948643 -0.6138323 0.6163039 0.9948636 -0.6137984 0.6162016 0.9948628 -0.6137599 0.6160767 0.9948617 -0.6137183 0.6159255 0.9948604 -0.6136769 0.6157453 0.9948589 -0.6136427 0.6155353 0.9948571 -0.6136284 0.6152981 0.9948551 -0.6136569 0.6150441 0.994853 -0.6137675 0.6147965 0.9948509 -0.6140266 0.6146016 0.9948493 -0.6145393 0.6145393 0.9948487 -0.6152669 0.6145393 0.9948487 -0.6161874 0.6145393 0.9948487 -0.6173519 0.6145393 0.9948487 -0.6188252 0.6145393 0.9948487 -0.6206891 0.6145393 0.9948487 -0.6230471 0.6145393 0.9948487 -0.6260304 0.6145393 0.9948487 -0.6298046 0.6145393 0.9948487 -0.6345795 0.6145393 0.9948487 -0.6406203 0.6145393 0.9948487 -0.6482627 0.6145393 0.9948487 -0.6579314 0.6145393 0.9948487 -0.6701635 0.6145393 0.9948487 -0.6856388 0.6145393 0.9948487 -0.7052169 0.6145393 0.9948487 -0.7299859 0.6145393 0.9948487 -0.7613218 0.6145393 0.9948487 -0.8009659 0.6145393 0.9948487 -0.8511207 0.6145393 0.9948487 -0.9145732 0.6145393 0.9948487 -0.9948487 0.6145393 0.9948487 -0.9959706 0.6728136 0.9278617 -0.9968409 0.7253775 0.8945255 -0.9975189 0.7717834 0.8828571 -0.9980488 0.8119884 0.8842998 -0.9984638 0.8462598 0.892989 -0.9987895 0.8750727 0.9050819 -0.9990455 0.8990175 0.9181889 -0.999247 0.9187262 0.9309211 -0.9994057 0.9348204 0.9425502 -0.9995308 0.9478785 0.952764 -0.9996295 0.9584178 0.9614985 -0.9997074 0.9668884 0.9688274 -0.9997688 0.9736733 0.9748918 -0.9998174 0.9790931 0.979858 -0.9998557 0.9834132 0.9838928 -0.999886 0.9868507 0.9871512 -0.9999099 0.9895821 0.9897703 -0.9999288 0.9917502 0.991868 -0.9999437 0.9934695 0.9935432 -0.6139459 0.6173355 0.9948662 -0.6139352 0.6173083 0.994866 -0.6139219 0.6172741 0.9948657 -0.6139056 0.6172312 0.9948653 -0.6138855 0.6171776 0.9948649 -0.6138613 0.6171109 0.9948643 -0.6138323 0.6170281 0.9948636 -0.6137984 0.6169261 0.9948628 -0.6137599 0.6168013 0.9948617 -0.6137183 0.6166504 0.9948604 -0.6136769 0.6164706 0.9948589 -0.6136427 0.616261 0.9948571 -0.6136284 0.6160243 0.9948551 -0.6136569 0.6157707 0.994853 -0.6137675 0.6155236 0.9948509 -0.6140266 0.6153291 0.9948493 -0.6145393 0.6152669 0.9948487 -0.6152669 0.6152669 0.9948487 -0.6161874 0.6152669 0.9948487 -0.6173519 0.6152669 0.9948487 -0.6188252 0.6152669 0.9948487 -0.6206891 0.6152669 0.9948487 -0.6230471 0.6152669 0.9948487 -0.6260304 0.6152669 0.9948487 -0.6298046 0.6152669 0.9948487 -0.6345795 0.6152669 0.9948487 -0.6406203 0.6152669 0.9948487 -0.6482627 0.6152669 0.9948487 -0.6579314 0.6152669 0.9948487 -0.6701635 0.6152669 0.9948487 -0.6856388 0.6152669 0.9948487 -0.7052169 0.6152669 0.9948487 -0.7299859 0.6152669 0.9948487 -0.7613218 0.6152669 0.9948487 -0.8009659 0.6152669 0.9948487 -0.8511207 0.6152669 0.9948487 -0.9145732 0.6152669 0.9948487 -0.9948487 0.6152669 0.9948487 -0.9959706 0.6733015 0.9278617 -0.9968409 0.7257011 0.8945255 -0.9975189 0.7719959 0.8828571 -0.9980488 0.8121268 0.8842998 -0.9984638 0.8463492 0.892989 -0.9987895 0.8751301 0.9050819 -0.9990455 0.8990542 0.9181889 -0.999247 0.9187495 0.9309211 -0.9994057 0.9348352 0.9425502 -0.9995308 0.9478878 0.952764 -0.9996295 0.9584237 0.9614985 -0.9997074 0.9668922 0.9688274 -0.9997688 0.9736756 0.9748918 -0.9998174 0.9790946 0.979858 -0.9998557 0.9834141 0.9838928 -0.999886 0.9868512 0.9871512 -0.9999099 0.9895825 0.9897703 -0.9999288 0.9917504 0.991868 -0.9999437 0.9934697 0.9935432 -0.6139459 0.6182511 0.9948662 -0.6139352 0.6182239 0.994866 -0.6139219 0.6181897 0.9948657 -0.6139056 0.618147 0.9948653 -0.6138855 0.6180935 0.9948649 -0.6138613 0.6180269 0.9948643 -0.6138323 0.6179443 0.9948636 -0.6137984 0.6178426 0.9948628 -0.6137599 0.6177181 0.9948617 -0.6137183 0.6175676 0.9948604 -0.6136769 0.6173882 0.9948589 -0.6136427 0.617179 0.9948571 -0.6136284 0.6169429 0.9948551 -0.6136569 0.61669 0.994853 -0.6137675 0.6164434 0.9948509 -0.6140266 0.6162494 0.9948493 -0.6145393 0.6161874 0.9948487 -0.6152669 0.6161874 0.9948487 -0.6161874 0.6161874 0.9948487 -0.6173519 0.6161874 0.9948487 -0.6188252 0.6161874 0.9948487 -0.6206891 0.6161874 0.9948487 -0.6230471 0.6161874 0.9948487 -0.6260304 0.6161874 0.9948487 -0.6298046 0.6161874 0.9948487 -0.6345795 0.6161874 0.9948487 -0.6406203 0.6161874 0.9948487 -0.6482627 0.6161874 0.9948487 -0.6579314 0.6161874 0.9948487 -0.6701635 0.6161874 0.9948487 -0.6856388 0.6161874 0.9948487 -0.7052169 0.6161874 0.9948487 -0.7299859 0.6161874 0.9948487 -0.7613218 0.6161874 0.9948487 -0.8009659 0.6161874 0.9948487 -0.8511207 0.6161874 0.9948487 -0.9145732 0.6161874 0.9948487 -0.9948487 0.6161874 0.9948487 -0.9959706 0.6739188 0.9278617 -0.9968409 0.7261105 0.8945255 -0.9975189 0.7722648 0.8828571 -0.9980488 0.8123018 0.8842998 -0.9984638 0.8464623 0.892989 -0.9987895 0.8752028 0.9050819 -0.9990455 0.8991006 0.9181889 -0.999247 0.9187791 0.9309211 -0.9994057 0.9348539 0.9425502 -0.9995308 0.9478997 0.952764 -0.9996295 0.9584312 0.9614985 -0.9997074 0.9668969 0.9688274 -0.9997688 0.9736786 0.9748918 -0.9998174 0.9790965 0.979858 -0.9998557 0.9834153 0.9838928 -0.999886 0.986852 0.9871512 -0.9999099 0.9895829 0.9897703 -0.9999288 0.9917507 0.991868 -0.9999437 0.9934698 0.9935432 -0.6139459 0.6194093 0.9948662 -0.6139352 0.6193822 0.994866 -0.6139219 0.6193482 0.9948657 -0.6139056 0.6193055 0.9948653 -0.6138855 0.6192522 0.9948649 -0.6138613 0.6191858 0.9948643 -0.6138323 0.6191035 0.9948636 -0.6137984 0.619002 0.9948628 -0.6137599 0.618878 0.9948617 -0.6137183 0.6187279 0.9948604 -0.6136769 0.6185491 0.9948589 -0.6136427 0.6183406 0.9948571 -0.6136284 0.6181052 0.9948551 -0.6136569 0.617853 0.994853 -0.6137675 0.6176072 0.9948509 -0.6140266 0.6174138 0.9948493 -0.6145393 0.6173519 0.9948487 -0.6152669 0.6173519 0.9948487 -0.6161874 0.6173519 0.9948487 -0.6173519 0.6173519 0.9948487 -0.6188252 0.6173519 0.9948487 -0.6206891 0.6173519 0.9948487 -0.6230471 0.6173519 0.9948487 -0.6260304 0.6173519 0.9948487 -0.6298046 0.6173519 0.9948487 -0.6345795 0.6173519 0.9948487 -0.6406203 0.6173519 0.9948487 -0.6482627 0.6173519 0.9948487 -0.6579314 0.6173519 0.9948487 -0.6701635 0.6173519 0.9948487 -0.6856388 0.6173519 0.9948487 -0.7052169 0.6173519 0.9948487 -0.7299859 0.6173519 0.9948487 -0.7613218 0.6173519 0.9948487 -0.8009659 0.6173519 0.9948487 -0.8511207 0.6173519 0.9948487 -0.9145732 0.6173519 0.9948487 -0.9948487 0.6173519 0.9948487 -0.9959706 0.6746998 0.9278617 -0.9968409 0.7266285 0.8945255 -0.9975189 0.7726049 0.8828571 -0.9980488 0.8125232 0.8842998 -0.9984638 0.8466054 0.892989 -0.9987895 0.8752947 0.9050819 -0.9990455 0.8991593 0.9181889 -0.999247 0.9188164 0.9309211 -0.9994057 0.9348776 0.9425502 -0.9995308 0.9479146 0.952764 -0.9996295 0.9584406 0.9614985 -0.9997074 0.9669028 0.9688274 -0.9997688 0.9736823 0.9748918 -0.9998174 0.9790988 0.979858 -0.9998557 0.9834167 0.9838928 -0.999886 0.9868529 0.9871512 -0.9999099 0.9895835 0.9897703 -0.9999288 0.991751 0.991868 -0.9999437 0.9934701 0.9935432 -0.6139459 0.6208746 0.9948662 -0.6139352 0.6208476 0.994866 -0.6139219 0.6208137 0.9948657 -0.6139056 0.6207712 0.9948653 -0.6138855 0.6207181 0.9948649 -0.6138613 0.620652 0.9948643 -0.6138323 0.62057 0.9948636 -0.6137984 0.6204689 0.9948628 -0.6137599 0.6203453 0.9948617 -0.6137183 0.6201959 0.9948604 -0.6136769 0.6200177 0.9948589 -0.6136427 0.61981 0.9948571 -0.6136284 0.6195755 0.9948551 -0.6136569 0.6193243 0.994853 -0.6137675 0.6190795 0.9948509 -0.6140266 0.6188868 0.9948493 -0.6145393 0.6188252 0.9948487 -0.6152669 0.6188252 0.9948487 -0.6161874 0.6188252 0.9948487 -0.6173519 0.6188252 0.9948487 -0.6188252 0.6188252 0.9948487 -0.6206891 0.6188252 0.9948487 -0.6230471 0.6188252 0.9948487 -0.6260304 0.6188252 0.9948487 -0.6298046 0.6188252 0.9948487 -0.6345795 0.6188252 0.9948487 -0.6406203 0.6188252 0.9948487 -0.6482627 0.6188252 0.9948487 -0.6579314 0.6188252 0.9948487 -0.6701635 0.6188252 0.9948487 -0.6856388 0.6188252 0.9948487 -0.7052169 0.6188252 0.9948487 -0.7299859 0.6188252 0.9948487 -0.7613218 0.6188252 0.9948487 -0.8009659 0.6188252 0.9948487 -0.8511207 0.6188252 0.9948487 -0.9145732 0.6188252 0.9948487 -0.9948487 0.6188252 0.9948487 -0.9959706 0.6756878 0.9278617 -0.9968409 0.7272837 0.8945255 -0.9975189 0.7730352 0.8828571 -0.9980488 0.8128033 0.8842998 -0.9984638 0.8467864 0.892989 -0.9987895 0.8754109 0.9050819 -0.9990455 0.8992336 0.9181889 -0.999247 0.9188636 0.9309211 -0.9994057 0.9349075 0.9425502 -0.9995308 0.9479335 0.952764 -0.9996295 0.9584526 0.9614985 -0.9997074 0.9669103 0.9688274 -0.9997688 0.973687 0.9748918 -0.9998174 0.9791018 0.979858 -0.9998557 0.9834186 0.9838928 -0.999886 0.9868541 0.9871512 -0.9999099 0.9895842 0.9897703 -0.9999288 0.9917515 0.991868 -0.9999437 0.9934704 0.9935432 -0.6139459 0.6227284 0.9948662 -0.6139352 0.6227016 0.994866 -0.6139219 0.6226678 0.9948657 -0.6139056 0.6226256 0.9948653 -0.6138855 0.6225727 0.9948649 -0.6138613 0.6225069 0.9948643 -0.6138323 0.6224253 0.9948636 -0.6137984 0.6223247 0.9948628 -0.6137599 0.6222018 0.9948617 -0.6137183 0.622053 0.9948604 -0.6136769 0.6218758 0.9948589 -0.6136427 0.6216691 0.9948571 -0.6136284 0.6214357 0.9948551 -0.6136569 0.6211858 0.994853 -0.6137675 0.6209421 0.9948509 -0.6140266 0.6207504 0.9948493 -0.6145393 0.6206891 0.9948487 -0.6152669 0.6206891 0.9948487 -0.6161874 0.6206891 0.9948487 -0.6173519 0.6206891 0.9948487 -0.6188252 0.6206891 0.9948487 -0.6206891 0.6206891 0.9948487 -0.6230471 0.6206891 0.9948487 -0.6260304 0.6206891 0.9948487 -0.6298046 0.6206891 0.9948487 -0.6345795 0.6206891 0.9948487 -0.6406203 0.6206891 0.9948487 -0.6482627 0.6206891 0.9948487 -0.6579314 0.6206891 0.9948487 -0.6701635 0.6206891 0.9948487 -0.6856388 0.6206891 0.9948487 -0.7052169 0.6206891 0.9948487 -0.7299859 0.6206891 0.9948487 -0.7613218 0.6206891 0.9948487 -0.8009659 0.6206891 0.9948487 -0.8511207 0.6206891 0.9948487 -0.9145732 0.6206891 0.9948487 -0.9948487 0.6206891 0.9948487 -0.9959706 0.6769378 0.9278617 -0.9968409 0.7281127 0.8945255 -0.9975189 0.7735795 0.8828571 -0.9980488 0.8131577 0.8842998 -0.9984638 0.8470154 0.892989 -0.9987895 0.875558 0.9050819 -0.9990455 0.8993275 0.9181889 -0.999247 0.9189234 0.9309211 -0.9994057 0.9349454 0.9425502 -0.9995308 0.9479575 0.952764 -0.9996295 0.9584677 0.9614985 -0.9997074 0.9669198 0.9688274 -0.9997688 0.973693 0.9748918 -0.9998174 0.9791055 0.979858 -0.9998557 0.9834209 0.9838928 -0.999886 0.9868555 0.9871512 -0.9999099 0.9895851 0.9897703 -0.9999288 0.9917521 0.991868 -0.9999437 0.9934707 0.9935432 -0.6139459 0.6250738 0.9948662 -0.6139352 0.6250471 0.994866 -0.6139219 0.6250135 0.9948657 -0.6139056 0.6249715 0.9948653 -0.6138855 0.624919 0.9948649 -0.6138613 0.6248536 0.9948643 -0.6138323 0.6247725 0.9948636 -0.6137984 0.6246726 0.9948628 -0.6137599 0.6245504 0.9948617 -0.6137183 0.6244026 0.9948604 -0.6136769 0.6242264 0.9948589 -0.6136427 0.624021 0.9948571 -0.6136284 0.6237891 0.9948551 -0.6136569 0.6235407 0.994853 -0.6137675 0.6232986 0.9948509 -0.6140266 0.6231081 0.9948493 -0.6145393 0.6230471 0.9948487 -0.6152669 0.6230471 0.9948487 -0.6161874 0.6230471 0.9948487 -0.6173519 0.6230471 0.9948487 -0.6188252 0.6230471 0.9948487 -0.6206891 0.6230471 0.9948487 -0.6230471 0.6230471 0.9948487 -0.6260304 0.6230471 0.9948487 -0.6298046 0.6230471 0.9948487 -0.6345795 0.6230471 0.9948487 -0.6406203 0.6230471 0.9948487 -0.6482627 0.6230471 0.9948487 -0.6579314 0.6230471 0.9948487 -0.6701635 0.6230471 0.9948487 -0.6856388 0.6230471 0.9948487 -0.7052169 0.6230471 0.9948487 -0.7299859 0.6230471 0.9948487 -0.7613218 0.6230471 0.9948487 -0.8009659 0.6230471 0.9948487 -0.8511207 0.6230471 0.9948487 -0.9145732 0.6230471 0.9948487 -0.9948487 0.6230471 0.9948487 -0.9959706 0.6785192 0.9278617 -0.9968409 0.7291615 0.8945255 -0.9975189 0.7742682 0.8828571 -0.9980488 0.8136061 0.8842998 -0.9984638 0.8473052 0.892989 -0.9987895 0.8757441 0.9050819 -0.9990455 0.8994464 0.9181889 -0.999247 0.918999 0.9309211 -0.9994057 0.9349933 0.9425502 -0.9995308 0.9479878 0.952764 -0.9996295 0.9584868 0.9614985 -0.9997074 0.9669318 0.9688274 -0.9997688 0.9737006 0.9748918 -0.9998174 0.9791103 0.979858 -0.9998557 0.9834239 0.9838928 -0.999886 0.9868574 0.9871512 -0.9999099 0.9895863 0.9897703 -0.9999288 0.9917528 0.991868 -0.9999437 0.9934712 0.9935432 -0.6139459 0.6280409 0.9948662 -0.6139352 0.6280144 0.994866 -0.6139219 0.6279812 0.9948657 -0.6139056 0.6279395 0.9948653 -0.6138855 0.6278874 0.9948649 -0.6138613 0.6278225 0.9948643 -0.6138323 0.6277421 0.9948636 -0.6137984 0.6276429 0.9948628 -0.6137599 0.6275217 0.9948617 -0.6137183 0.627375 0.9948604 -0.6136769 0.6272003 0.9948589 -0.6136427 0.6269965 0.9948571 -0.6136284 0.6267665 0.9948551 -0.6136569 0.6265201 0.994853 -0.6137675 0.6262799 0.9948509 -0.6140266 0.6260909 0.9948493 -0.6145393 0.6260304 0.9948487 -0.6152669 0.6260304 0.9948487 -0.6161874 0.6260304 0.9948487 -0.6173519 0.6260304 0.9948487 -0.6188252 0.6260304 0.9948487 -0.6206891 0.6260304 0.9948487 -0.6230471 0.6260304 0.9948487 -0.6260304 0.6260304 0.9948487 -0.6298046 0.6260304 0.9948487 -0.6345795 0.6260304 0.9948487 -0.6406203 0.6260304 0.9948487 -0.6482627 0.6260304 0.9948487 -0.6579314 0.6260304 0.9948487 -0.6701635 0.6260304 0.9948487 -0.6856388 0.6260304 0.9948487 -0.7052169 0.6260304 0.9948487 -0.7299859 0.6260304 0.9948487 -0.7613218 0.6260304 0.9948487 -0.8009659 0.6260304 0.9948487 -0.8511207 0.6260304 0.9948487 -0.9145732 0.6260304 0.9948487 -0.9948487 0.6260304 0.9948487 -0.9959706 0.6805199 0.9278617 -0.9968409 0.7304884 0.8945255 -0.9975189 0.7751395 0.8828571 -0.9980488 0.8141733 0.8842998 -0.9984638 0.8476717 0.892989 -0.9987895 0.8759795 0.9050819 -0.9990455 0.8995968 0.9181889 -0.999247 0.9190947 0.9309211 -0.9994057 0.935054 0.9425502 -0.9995308 0.9480261 0.952764 -0.9996295 0.9585109 0.9614985 -0.9997074 0.966947 0.9688274 -0.9997688 0.9737101 0.9748918 -0.9998174 0.9791163 0.979858 -0.9998557 0.9834277 0.9838928 -0.999886 0.9868597 0.9871512 -0.9999099 0.9895878 0.9897703 -0.9999288 0.9917537 0.991868 -0.9999437 0.9934718 0.9935432 -0.6139459 0.6317947 0.9948662 -0.6139352 0.6317685 0.994866 -0.6139219 0.6317356 0.9948657 -0.6139056 0.6316943 0.9948653 -0.6138855 0.6316428 0.9948649 -0.6138613 0.6315785 0.9948643 -0.6138323 0.6314989 0.9948636 -0.6137984 0.6314008 0.9948628 -0.6137599 0.6312808 0.9948617 -0.6137183 0.6311356 0.9948604 -0.6136769 0.6309626 0.9948589 -0.6136427 0.6307609 0.9948571 -0.6136284 0.6305332 0.9948551 -0.6136569 0.6302893 0.994853 -0.6137675 0.6300515 0.9948509 -0.6140266 0.6298645 0.9948493 -0.6145393 0.6298046 0.9948487 -0.6152669 0.6298046 0.9948487 -0.6161874 0.6298046 0.9948487 -0.6173519 0.6298046 0.9948487 -0.6188252 0.6298046 0.9948487 -0.6206891 0.6298046 0.9948487 -0.6230471 0.6298046 0.9948487 -0.6260304 0.6298046 0.9948487 -0.6298046 0.6298046 0.9948487 -0.6345795 0.6298046 0.9948487 -0.6406203 0.6298046 0.9948487 -0.6482627 0.6298046 0.9948487 -0.6579314 0.6298046 0.9948487 -0.6701635 0.6298046 0.9948487 -0.6856388 0.6298046 0.9948487 -0.7052169 0.6298046 0.9948487 -0.7299859 0.6298046 0.9948487 -0.7613218 0.6298046 0.9948487 -0.8009659 0.6298046 0.9948487 -0.8511207 0.6298046 0.9948487 -0.9145732 0.6298046 0.9948487 -0.9948487 0.6298046 0.9948487 -0.9959706 0.683051 0.9278617 -0.9968409 0.732167 0.8945255 -0.9975189 0.7762418 0.8828571 -0.9980488 0.8148909 0.8842998 -0.9984638 0.8481355 0.892989 -0.9987895 0.8762773 0.9050819 -0.9990455 0.899787 0.9181889 -0.999247 0.9192157 0.9309211 -0.9994057 0.9351307 0.9425502 -0.9995308 0.9480746 0.952764 -0.9996295 0.9585415 0.9614985 -0.9997074 0.9669663 0.9688274 -0.9997688 0.9737222 0.9748918 -0.9998174 0.9791238 0.979858 -0.9998557 0.9834324 0.9838928 -0.999886 0.9868627 0.9871512 -0.9999099 0.9895897 0.9897703 -0.9999288 0.9917549 0.991868 -0.9999437 0.9934725 0.9935432 -0.6139459 0.6365438 0.9948662 -0.6139352 0.6365179 0.994866 -0.6139219 0.6364854 0.9948657 -0.6139056 0.6364447 0.9948653 -0.6138855 0.6363938 0.9948649 -0.6138613 0.6363304 0.9948643 -0.6138323 0.6362518 0.9948636 -0.6137984 0.6361549 0.9948628 -0.6137599 0.6360365 0.9948617 -0.6137183 0.6358932 0.9948604 -0.6136769 0.6357225 0.9948589 -0.6136427 0.6355234 0.9948571 -0.6136284 0.6352987 0.9948551 -0.6136569 0.6350579 0.994853 -0.6137675 0.6348232 0.9948509 -0.6140266 0.6346385 0.9948493 -0.6145393 0.6345795 0.9948487 -0.6152669 0.6345795 0.9948487 -0.6161874 0.6345795 0.9948487 -0.6173519 0.6345795 0.9948487 -0.6188252 0.6345795 0.9948487 -0.6206891 0.6345795 0.9948487 -0.6230471 0.6345795 0.9948487 -0.6260304 0.6345795 0.9948487 -0.6298046 0.6345795 0.9948487 -0.6345795 0.6345795 0.9948487 -0.6406203 0.6345795 0.9948487 -0.6482627 0.6345795 0.9948487 -0.6579314 0.6345795 0.9948487 -0.6701635 0.6345795 0.9948487 -0.6856388 0.6345795 0.9948487 -0.7052169 0.6345795 0.9948487 -0.7299859 0.6345795 0.9948487 -0.7613218 0.6345795 0.9948487 -0.8009659 0.6345795 0.9948487 -0.8511207 0.6345795 0.9948487 -0.9145732 0.6345795 0.9948487 -0.9948487 0.6345795 0.9948487 -0.9959706 0.6862532 0.9278617 -0.9968409 0.7342907 0.8945255 -0.9975189 0.7776364 0.8828571 -0.9980488 0.8157988 0.8842998 -0.9984638 0.8487222 0.892989 -0.9987895 0.8766541 0.9050819 -0.9990455 0.9000277 0.9181889 -0.999247 0.9193688 0.9309211 -0.9994057 0.9352277 0.9425502 -0.9995308 0.9481359 0.952764 -0.9996295 0.9585802 0.9614985 -0.9997074 0.9669906 0.9688274 -0.9997688 0.9737375 0.9748918 -0.9998174 0.9791334 0.979858 -0.9998557 0.9834385 0.9838928 -0.999886 0.9868665 0.9871512 -0.9999099 0.989592 0.9897703 -0.9999288 0.9917564 0.991868 -0.9999437 0.9934734 0.9935432 -0.6139459 0.642552 0.9948662 -0.6139352 0.6425265 0.994866 -0.6139219 0.6424946 0.9948657 -0.6139056 0.6424545 0.9948653 -0.6138855 0.6424045 0.9948649 -0.6138613 0.6423421 0.9948643 -0.6138323 0.6422649 0.9948636 -0.6137984 0.6421696 0.9948628 -0.6137599 0.6420531 0.9948617 -0.6137183 0.6419122 0.9948604 -0.6136769 0.6417443 0.9948589 -0.6136427 0.6415485 0.9948571 -0.6136284 0.6413275 0.9948551 -0.6136569 0.6410908 0.994853 -0.6137675 0.64086 0.9948509 -0.6140266 0.6406784 0.9948493 -0.6145393 0.6406203 0.9948487 -0.6152669 0.6406203 0.9948487 -0.6161874 0.6406203 0.9948487 -0.6173519 0.6406203 0.9948487 -0.6188252 0.6406203 0.9948487 -0.6206891 0.6406203 0.9948487 -0.6230471 0.6406203 0.9948487 -0.6260304 0.6406203 0.9948487 -0.6298046 0.6406203 0.9948487 -0.6345795 0.6406203 0.9948487 -0.6406203 0.6406203 0.9948487 -0.6482627 0.6406203 0.9948487 -0.6579314 0.6406203 0.9948487 -0.6701635 0.6406203 0.9948487 -0.6856388 0.6406203 0.9948487 -0.7052169 0.6406203 0.9948487 -0.7299859 0.6406203 0.9948487 -0.7613218 0.6406203 0.9948487 -0.8009659 0.6406203 0.9948487 -0.8511207 0.6406203 0.9948487 -0.9145732 0.6406203 0.9948487 -0.9948487 0.6406203 0.9948487 -0.9959706 0.6903044 0.9278617 -0.9968409 0.7369774 0.8945255 -0.9975189 0.7794007 0.8828571 -0.9980488 0.8169474 0.8842998 -0.9984638 0.8494644 0.892989 -0.9987895 0.8771307 0.9050819 -0.9990455 0.9003323 0.9181889 -0.999247 0.9195625 0.9309211 -0.9994057 0.9353505 0.9425502 -0.9995308 0.9482135 0.952764 -0.9996295 0.9586291 0.9614985 -0.9997074 0.9670214 0.9688274 -0.9997688 0.9737569 0.9748918 -0.9998174 0.9791456 0.979858 -0.9998557 0.9834461 0.9838928 -0.999886 0.9868713 0.9871512 -0.9999099 0.989595 0.9897703 -0.9999288 0.9917582 0.991868 -0.9999437 0.9934746 0.9935432 -0.6139459 0.6501531 0.9948662 -0.6139352 0.6501282 0.994866 -0.6139219 0.6500969 0.9948657 -0.6139056 0.6500577 0.9948653 -0.6138855 0.6500088 0.9948649 -0.6138613 0.6499478 0.9948643 -0.6138323 0.6498721 0.9948636 -0.6137984 0.6497789 0.9948628 -0.6137599 0.6496649 0.9948617 -0.6137183 0.649527 0.9948604 -0.6136769 0.6493627 0.9948589 -0.6136427 0.6491711 0.9948571 -0.6136284 0.6489548 0.9948551 -0.6136569 0.6487231 0.994853 -0.6137675 0.6484973 0.9948509 -0.6140266 0.6483196 0.9948493 -0.6145393 0.6482627 0.9948487 -0.6152669 0.6482627 0.9948487 -0.6161874 0.6482627 0.9948487 -0.6173519 0.6482627 0.9948487 -0.6188252 0.6482627 0.9948487 -0.6206891 0.6482627 0.9948487 -0.6230471 0.6482627 0.9948487 -0.6260304 0.6482627 0.9948487 -0.6298046 0.6482627 0.9948487 -0.6345795 0.6482627 0.9948487 -0.6406203 0.6482627 0.9948487 -0.6482627 0.6482627 0.9948487 -0.6579314 0.6482627 0.9948487 -0.6701635 0.6482627 0.9948487 -0.6856388 0.6482627 0.9948487 -0.7052169 0.6482627 0.9948487 -0.7299859 0.6482627 0.9948487 -0.7613218 0.6482627 0.9948487 -0.8009659 0.6482627 0.9948487 -0.8511207 0.6482627 0.9948487 -0.9145732 0.6482627 0.9948487 -0.9948487 0.6482627 0.9948487 -0.9959706 0.6954296 0.9278617 -0.9968409 0.7403765 0.8945255 -0.9975189 0.7816327 0.8828571 -0.9980488 0.8184005 0.8842998 -0.9984638 0.8504035 0.892989 -0.9987895 0.8777338 0.9050819 -0.9990455 0.9007175 0.9181889 -0.999247 0.9198076 0.9309211 -0.9994057 0.9355059 0.9425502 -0.9995308 0.9483117 0.952764 -0.9996295 0.958691 0.9614985 -0.9997074 0.9670604 0.9688274 -0.9997688 0.9737814 0.9748918 -0.9998174 0.979161 0.979858 -0.9998557 0.9834557 0.9838928 -0.999886 0.9868773 0.9871512 -0.9999099 0.9895988 0.9897703 -0.9999288 0.9917606 0.991868 -0.9999437 0.9934761 0.9935432 -0.6139459 0.6597695 0.9948662 -0.6139352 0.6597453 0.994866 -0.6139219 0.6597149 0.9948657 -0.6139056 0.6596768 0.9948653 -0.6138855 0.6596292 0.9948649 -0.6138613 0.6595699 0.9948643 -0.6138323 0.6594963 0.9948636 -0.6137984 0.6594057 0.9948628 -0.6137599 0.6592948 0.9948617 -0.6137183 0.6591607 0.9948604 -0.6136769 0.659001 0.9948589 -0.6136427 0.6588147 0.9948571 -0.6136284 0.6586044 0.9948551 -0.6136569 0.6583791 0.994853 -0.6137675 0.6581595 0.9948509 -0.6140266 0.6579867 0.9948493 -0.6145393 0.6579314 0.9948487 -0.6152669 0.6579314 0.9948487 -0.6161874 0.6579314 0.9948487 -0.6173519 0.6579314 0.9948487 -0.6188252 0.6579314 0.9948487 -0.6206891 0.6579314 0.9948487 -0.6230471 0.6579314 0.9948487 -0.6260304 0.6579314 0.9948487 -0.6298046 0.6579314 0.9948487 -0.6345795 0.6579314 0.9948487 -0.6406203 0.6579314 0.9948487 -0.6482627 0.6579314 0.9948487 -0.6579314 0.6579314 0.9948487 -0.6701635 0.6579314 0.9948487 -0.6856388 0.6579314 0.9948487 -0.7052169 0.6579314 0.9948487 -0.7299859 0.6579314 0.9948487 -0.7613218 0.6579314 0.9948487 -0.8009659 0.6579314 0.9948487 -0.8511207 0.6579314 0.9948487 -0.9145732 0.6579314 0.9948487 -0.9948487 0.6579314 0.9948487 -0.9959706 0.7019138 0.9278617 -0.9968409 0.7446768 0.8945255 -0.9975189 0.7844566 0.8828571 -0.9980488 0.8202389 0.8842998 -0.9984638 0.8515915 0.892989 -0.9987895 0.8784967 0.9050819 -0.9990455 0.9012049 0.9181889 -0.999247 0.9201176 0.9309211 -0.9994057 0.9357024 0.9425502 -0.9995308 0.9484359 0.952764 -0.9996295 0.9587693 0.9614985 -0.9997074 0.9671097 0.9688274 -0.9997688 0.9738123 0.9748918 -0.9998174 0.9791804 0.979858 -0.9998557 0.9834679 0.9838928 -0.999886 0.986885 0.9871512 -0.9999099 0.9896036 0.9897703 -0.9999288 0.9917636 0.991868 -0.9999437 0.9934779 0.9935432 -0.6139459 0.6719355 0.9948662 -0.6139352 0.6719122 0.994866 -0.6139219 0.6718829 0.9948657 -0.6139056 0.6718462 0.9948653 -0.6138855 0.6718002 0.9948649 -0.6138613 0.6717431 0.9948643 -0.6138323 0.6716722 0.9948636 -0.6137984 0.6715848 0.9948628 -0.6137599 0.6714779 0.9948617 -0.6137183 0.6713487 0.9948604 -0.6136769 0.6711946 0.9948589 -0.6136427 0.671015 0.9948571 -0.6136284 0.6708123 0.9948551 -0.6136569 0.6705951 0.994853 -0.6137675 0.6703834 0.9948509 -0.6140266 0.6702168 0.9948493 -0.6145393 0.6701635 0.9948487 -0.6152669 0.6701635 0.9948487 -0.6161874 0.6701635 0.9948487 -0.6173519 0.6701635 0.9948487 -0.6188252 0.6701635 0.9948487 -0.6206891 0.6701635 0.9948487 -0.6230471 0.6701635 0.9948487 -0.6260304 0.6701635 0.9948487 -0.6298046 0.6701635 0.9948487 -0.6345795 0.6701635 0.9948487 -0.6406203 0.6701635 0.9948487 -0.6482627 0.6701635 0.9948487 -0.6579314 0.6701635 0.9948487 -0.6701635 0.6701635 0.9948487 -0.6856388 0.6701635 0.9948487 -0.7052169 0.6701635 0.9948487 -0.7299859 0.6701635 0.9948487 -0.7613218 0.6701635 0.9948487 -0.8009659 0.6701635 0.9948487 -0.8511207 0.6701635 0.9948487 -0.9145732 0.6701635 0.9948487 -0.9948487 0.6701635 0.9948487 -0.9959706 0.710117 0.9278617 -0.9968409 0.7501172 0.8945255 -0.9975189 0.7880291 0.8828571 -0.9980488 0.8225647 0.8842998 -0.9984638 0.8530945 0.892989 -0.9987895 0.8794619 0.9050819 -0.9990455 0.9018215 0.9181889 -0.999247 0.9205098 0.9309211 -0.9994057 0.935951 0.9425502 -0.9995308 0.9485931 0.952764 -0.9996295 0.9588684 0.9614985 -0.9997074 0.967172 0.9688274 -0.9997688 0.9738515 0.9748918 -0.9998174 0.979205 0.979858 -0.9998557 0.9834833 0.9838928 -0.999886 0.9868946 0.9871512 -0.9999099 0.9896096 0.9897703 -0.9999288 0.9917674 0.991868 -0.9999437 0.9934803 0.9935432 -0.6139459 0.6873271 0.9948662 -0.6139352 0.6873049 0.994866 -0.6139219 0.687277 0.9948657 -0.6139056 0.687242 0.9948653 -0.6138855 0.6871982 0.9948649 -0.6138613 0.6871438 0.9948643 -0.6138323 0.6870762 0.9948636 -0.6137984 0.6869929 0.9948628 -0.6137599 0.6868911 0.9948617 -0.6137183 0.686768 0.9948604 -0.6136769 0.6866212 0.9948589 -0.6136427 0.6864501 0.9948571 -0.6136284 0.6862569 0.9948551 -0.6136569 0.68605 0.994853 -0.6137675 0.6858483 0.9948509 -0.6140266 0.6856895 0.9948493 -0.6145393 0.6856388 0.9948487 -0.6152669 0.6856388 0.9948487 -0.6161874 0.6856388 0.9948487 -0.6173519 0.6856388 0.9948487 -0.6188252 0.6856388 0.9948487 -0.6206891 0.6856388 0.9948487 -0.6230471 0.6856388 0.9948487 -0.6260304 0.6856388 0.9948487 -0.6298046 0.6856388 0.9948487 -0.6345795 0.6856388 0.9948487 -0.6406203 0.6856388 0.9948487 -0.6482627 0.6856388 0.9948487 -0.6579314 0.6856388 0.9948487 -0.6701635 0.6856388 0.9948487 -0.6856388 0.6856388 0.9948487 -0.7052169 0.6856388 0.9948487 -0.7299859 0.6856388 0.9948487 -0.7613218 0.6856388 0.9948487 -0.8009659 0.6856388 0.9948487 -0.8511207 0.6856388 0.9948487 -0.9145732 0.6856388 0.9948487 -0.9948487 0.6856388 0.9948487 -0.9959706 0.7204952 0.9278617 -0.9968409 0.757 0.8945255 -0.9975189 0.7925488 0.8828571 -0.9980488 0.8255071 0.8842998 -0.9984638 0.8549959 0.892989 -0.9987895 0.880683 0.9050819 -0.9990455 0.9026016 0.9181889 -0.999247 0.9210061 0.9309211 -0.9994057 0.9362655 0.9425502 -0.9995308 0.9487918 0.952764 -0.9996295 0.9589938 0.9614985 -0.9997074 0.9672509 0.9688274 -0.9997688 0.9739011 0.9748918 -0.9998174 0.9792361 0.979858 -0.9998557 0.9835029 0.9838928 -0.999886 0.9869069 0.9871512 -0.9999099 0.9896173 0.9897703 -0.9999288 0.9917722 0.991868 -0.9999437 0.9934833 0.9935432 -0.6139459 0.7067995 0.9948662 -0.6139352 0.7067787 0.994866 -0.6139219 0.7067525 0.9948657 -0.6139056 0.7067197 0.9948653 -0.6138855 0.7066787 0.9948649 -0.6138613 0.7066276 0.9948643 -0.6138323 0.7065643 0.9948636 -0.6137984 0.7064863 0.9948628 -0.6137599 0.7063908 0.9948617 -0.6137183 0.7062754 0.9948604 -0.6136769 0.7061378 0.9948589 -0.6136427 0.7059774 0.9948571 -0.6136284 0.7057964 0.9948551 -0.6136569 0.7056024 0.994853 -0.6137675 0.7054133 0.9948509 -0.6140266 0.7052645 0.9948493 -0.6145393 0.7052169 0.9948487 -0.6152669 0.7052169 0.9948487 -0.6161874 0.7052169 0.9948487 -0.6173519 0.7052169 0.9948487 -0.6188252 0.7052169 0.9948487 -0.6206891 0.7052169 0.9948487 -0.6230471 0.7052169 0.9948487 -0.6260304 0.7052169 0.9948487 -0.6298046 0.7052169 0.9948487 -0.6345795 0.7052169 0.9948487 -0.6406203 0.7052169 0.9948487 -0.6482627 0.7052169 0.9948487 -0.6579314 0.7052169 0.9948487 -0.6701635 0.7052169 0.9948487 -0.6856388 0.7052169 0.9948487 -0.7052169 0.7052169 0.9948487 -0.7299859 0.7052169 0.9948487 -0.7613218 0.7052169 0.9948487 -0.8009659 0.7052169 0.9948487 -0.8511207 0.7052169 0.9948487 -0.9145732 0.7052169 0.9948487 -0.9948487 0.7052169 0.9948487 -0.9959706 0.733625 0.9278617 -0.9968409 0.7657077 0.8945255 -0.9975189 0.7982669 0.8828571 -0.9980488 0.8292297 0.8842998 -0.9984638 0.8574015 0.892989 -0.9987895 0.8822279 0.9050819 -0.9990455 0.9035886 0.9181889 -0.999247 0.9216339 0.9309211 -0.9994057 0.9366635 0.9425502 -0.9995308 0.9490434 0.952764 -0.9996295 0.9591524 0.9614985 -0.9997074 0.9673508 0.9688274 -0.9997688 0.9739638 0.9748918 -0.9998174 0.9792755 0.979858 -0.9998557 0.9835276 0.9838928 -0.999886 0.9869223 0.9871512 -0.9999099 0.989627 0.9897703 -0.9999288 0.9917782 0.991868 -0.9999437 0.9934871 0.9935432 -0.6139459 0.7314346 0.9948662 -0.6139352 0.7314156 0.994866 -0.6139219 0.7313916 0.9948657 -0.6139056 0.7313616 0.9948653 -0.6138855 0.731324 0.9948649 -0.6138613 0.7312773 0.9948643 -0.6138323 0.7312193 0.9948636 -0.6137984 0.7311479 0.9948628 -0.6137599 0.7310605 0.9948617 -0.6137183 0.7309548 0.9948604 -0.6136769 0.7308289 0.9948589 -0.6136427 0.7306821 0.9948571 -0.6136284 0.7305163 0.9948551 -0.6136569 0.7303387 0.994853 -0.6137675 0.7301657 0.9948509 -0.6140266 0.7300295 0.9948493 -0.6145393 0.7299859 0.9948487 -0.6152669 0.7299859 0.9948487 -0.6161874 0.7299859 0.9948487 -0.6173519 0.7299859 0.9948487 -0.6188252 0.7299859 0.9948487 -0.6206891 0.7299859 0.9948487 -0.6230471 0.7299859 0.9948487 -0.6260304 0.7299859 0.9948487 -0.6298046 0.7299859 0.9948487 -0.6345795 0.7299859 0.9948487 -0.6406203 0.7299859 0.9948487 -0.6482627 0.7299859 0.9948487 -0.6579314 0.7299859 0.9948487 -0.6701635 0.7299859 0.9948487 -0.6856388 0.7299859 0.9948487 -0.7052169 0.7299859 0.9948487 -0.7299859 0.7299859 0.9948487 -0.7613218 0.7299859 0.9948487 -0.8009659 0.7299859 0.9948487 -0.8511207 0.7299859 0.9948487 -0.9145732 0.7299859 0.9948487 -0.9948487 0.7299859 0.9948487 -0.9959706 0.7502359 0.9278617 -0.9968409 0.776724 0.8945255 -0.9975189 0.8055009 0.8828571 -0.9980488 0.8339392 0.8842998 -0.9984638 0.8604449 0.892989 -0.9987895 0.8841823 0.9050819 -0.9990455 0.9048372 0.9181889 -0.999247 0.9224281 0.9309211 -0.9994057 0.9371669 0.9425502 -0.9995308 0.9493615 0.952764 -0.9996295 0.959353 0.9614985 -0.9997074 0.967477 0.9688274 -0.9997688 0.9740432 0.9748918 -0.9998174 0.9793253 0.979858 -0.9998557 0.9835588 0.9838928 -0.999886 0.9869419 0.9871512 -0.9999099 0.9896392 0.9897703 -0.9999288 0.9917859 0.991868 -0.9999437 0.9934919 0.9935432 -0.6139459 0.7626012 0.9948662 -0.6139352 0.7625844 0.994866 -0.6139219 0.7625632 0.9948657 -0.6139056 0.7625367 0.9948653 -0.6138855 0.7625036 0.9948649 -0.6138613 0.7624623 0.9948643 -0.6138323 0.7624111 0.9948636 -0.6137984 0.762348 0.9948628 -0.6137599 0.7622708 0.9948617 -0.6137183 0.7621775 0.9948604 -0.6136769 0.7620663 0.9948589 -0.6136427 0.7619366 0.9948571 -0.6136284 0.7617903 0.9948551 -0.6136569 0.7616334 0.994853 -0.6137675 0.7614806 0.9948509 -0.6140266 0.7613603 0.9948493 -0.6145393 0.7613218 0.9948487 -0.6152669 0.7613218 0.9948487 -0.6161874 0.7613218 0.9948487 -0.6173519 0.7613218 0.9948487 -0.6188252 0.7613218 0.9948487 -0.6206891 0.7613218 0.9948487 -0.6230471 0.7613218 0.9948487 -0.6260304 0.7613218 0.9948487 -0.6298046 0.7613218 0.9948487 -0.6345795 0.7613218 0.9948487 -0.6406203 0.7613218 0.9948487 -0.6482627 0.7613218 0.9948487 -0.6579314 0.7613218 0.9948487 -0.6701635 0.7613218 0.9948487 -0.6856388 0.7613218 0.9948487 -0.7052169 0.7613218 0.9948487 -0.7299859 0.7613218 0.9948487 -0.7613218 0.7613218 0.9948487 -0.8009659 0.7613218 0.9948487 -0.8511207 0.7613218 0.9948487 -0.9145732 0.7613218 0.9948487 -0.9948487 0.7613218 0.9948487 -0.9959706 0.7712508 0.9278617 -0.9968409 0.7906611 0.8945255 -0.9975189 0.8146529 0.8828571 -0.9980488 0.8398974 0.8842998 -0.9984638 0.8642952 0.892989 -0.9987895 0.886655 0.9050819 -0.9990455 0.9064168 0.9181889 -0.999247 0.9234329 0.9309211 -0.9994057 0.9378038 0.9425502 -0.9995308 0.9497641 0.952764 -0.9996295 0.9596068 0.9614985 -0.9997074 0.9676368 0.9688274 -0.9997688 0.9741436 0.9748918 -0.9998174 0.9793883 0.979858 -0.9998557 0.9835983 0.9838928 -0.999886 0.9869667 0.9871512 -0.9999099 0.9896547 0.9897703 -0.9999288 0.9917956 0.991868 -0.9999437 0.993498 0.9935432 -0.6139459 0.802031 0.9948662 -0.6139352 0.802017 0.994866 -0.6139219 0.8019994 0.9948657 -0.6139056 0.8019773 0.9948653 -0.6138855 0.8019497 0.9948649 -0.6138613 0.8019154 0.9948643 -0.6138323 0.8018727 0.9948636 -0.6137984 0.8018202 0.9948628 -0.6137599 0.801756 0.9948617 -0.6137183 0.8016783 0.9948604 -0.6136769 0.8015857 0.9948589 -0.6136427 0.8014777 0.9948571 -0.6136284 0.8013559 0.9948551 -0.6136569 0.8012253 0.994853 -0.6137675 0.801098 0.9948509 -0.6140266 0.8009979 0.9948493 -0.6145393 0.8009659 0.9948487 -0.6152669 0.8009659 0.9948487 -0.6161874 0.8009659 0.9948487 -0.6173519 0.8009659 0.9948487 -0.6188252 0.8009659 0.9948487 -0.6206891 0.8009659 0.9948487 -0.6230471 0.8009659 0.9948487 -0.6260304 0.8009659 0.9948487 -0.6298046 0.8009659 0.9948487 -0.6345795 0.8009659 0.9948487 -0.6406203 0.8009659 0.9948487 -0.6482627 0.8009659 0.9948487 -0.6579314 0.8009659 0.9948487 -0.6701635 0.8009659 0.9948487 -0.6856388 0.8009659 0.9948487 -0.7052169 0.8009659 0.9948487 -0.7299859 0.8009659 0.9948487 -0.7613218 0.8009659 0.9948487 -0.8009659 0.8009659 0.9948487 -0.8511207 0.8009659 0.9948487 -0.9145732 0.8009659 0.9948487 -0.9948487 0.8009659 0.9948487 -0.9959706 0.7978374 0.9278617 -0.9968409 0.8082934 0.8945255 -0.9975189 0.8262314 0.8828571 -0.9980488 0.8474353 0.8842998 -0.9984638 0.8691663 0.892989 -0.9987895 0.8897832 0.9050819 -0.9990455 0.9084153 0.9181889 -0.999247 0.9247041 0.9309211 -0.9994057 0.9386096 0.9425502 -0.9995308 0.9502734 0.952764 -0.9996295 0.959928 0.9614985 -0.9997074 0.9678389 0.9688274 -0.9997688 0.9742706 0.9748918 -0.9998174 0.9794681 0.979858 -0.9998557 0.9836483 0.9838928 -0.999886 0.986998 0.9871512 -0.9999099 0.9896744 0.9897703 -0.9999288 0.9918079 0.991868 -0.9999437 0.9935057 0.9935432 -0.6139459 0.8519149 0.9948662 -0.6139352 0.8519044 0.994866 -0.6139219 0.8518913 0.9948657 -0.6139056 0.8518748 0.9948653 -0.6138855 0.8518543 0.9948649 -0.6138613 0.8518286 0.9948643 -0.6138323 0.8517969 0.9948636 -0.6137984 0.8517577 0.9948628 -0.6137599 0.8517098 0.9948617 -0.6137183 0.8516519 0.9948604 -0.6136769 0.8515828 0.9948589 -0.6136427 0.8515024 0.9948571 -0.6136284 0.8514115 0.9948551 -0.6136569 0.8513142 0.994853 -0.6137675 0.8512193 0.9948509 -0.6140266 0.8511446 0.9948493 -0.6145393 0.8511207 0.9948487 -0.6152669 0.8511207 0.9948487 -0.6161874 0.8511207 0.9948487 -0.6173519 0.8511207 0.9948487 -0.6188252 0.8511207 0.9948487 -0.6206891 0.8511207 0.9948487 -0.6230471 0.8511207 0.9948487 -0.6260304 0.8511207 0.9948487 -0.6298046 0.8511207 0.9948487 -0.6345795 0.8511207 0.9948487 -0.6406203 0.8511207 0.9948487 -0.6482627 0.8511207 0.9948487 -0.6579314 0.8511207 0.9948487 -0.6701635 0.8511207 0.9948487 -0.6856388 0.8511207 0.9948487 -0.7052169 0.8511207 0.9948487 -0.7299859 0.8511207 0.9948487 -0.7613218 0.8511207 0.9948487 -0.8009659 0.8511207 0.9948487 -0.8511207 0.8511207 0.9948487 -0.9145732 0.8511207 0.9948487 -0.9948487 0.8511207 0.9948487 -0.9959706 0.8314729 0.9278617 -0.9968409 0.8306004 0.8945255 -0.9975189 0.8408797 0.8828571 -0.9980488 0.8569716 0.8842998 -0.9984638 0.875329 0.892989 -0.9987895 0.8937407 0.9050819 -0.9990455 0.9109436 0.9181889 -0.999247 0.9263124 0.9309211 -0.9994057 0.939629 0.9425502 -0.9995308 0.9509177 0.952764 -0.9996295 0.9603343 0.9614985 -0.9997074 0.9680946 0.9688274 -0.9997688 0.9744313 0.9748918 -0.9998174 0.9795689 0.979858 -0.9998557 0.9837116 0.9838928 -0.999886 0.9870376 0.9871512 -0.9999099 0.9896992 0.9897703 -0.9999288 0.9918234 0.991868 -0.9999437 0.9935154 0.9935432 -0.6139459 0.9150244 0.9948662 -0.6139352 0.9150185 0.994866 -0.6139219 0.915011 0.9948657 -0.6139056 0.9150017 0.9948653 -0.6138855 0.91499 0.9948649 -0.6138613 0.9149754 0.9948643 -0.6138323 0.9149574 0.9948636 -0.6137984 0.9149351 0.9948628 -0.6137599 0.9149079 0.9948617 -0.6137183 0.914875 0.9948604 -0.6136769 0.9148357 0.9948589 -0.6136427 0.91479 0.9948571 -0.6136284 0.9147384 0.9948551 -0.6136569 0.9146831 0.994853 -0.6137675 0.9146292 0.9948509 -0.6140266 0.9145867 0.9948493 -0.6145393 0.9145732 0.9948487 -0.6152669 0.9145732 0.9948487 -0.6161874 0.9145732 0.9948487 -0.6173519 0.9145732 0.9948487 -0.6188252 0.9145732 0.9948487 -0.6206891 0.9145732 0.9948487 -0.6230471 0.9145732 0.9948487 -0.6260304 0.9145732 0.9948487 -0.6298046 0.9145732 0.9948487 -0.6345795 0.9145732 0.9948487 -0.6406203 0.9145732 0.9948487 -0.6482627 0.9145732 0.9948487 -0.6579314 0.9145732 0.9948487 -0.6701635 0.9145732 0.9948487 -0.6856388 0.9145732 0.9948487 -0.7052169 0.9145732 0.9948487 -0.7299859 0.9145732 0.9948487 -0.7613218 0.9145732 0.9948487 -0.8009659 0.9145732 0.9948487 -0.8511207 0.9145732 0.9948487 -0.9145732 0.9145732 0.9948487 -0.9948487 0.9145732 0.9948487 -0.9959706 0.8740262 0.9278617 -0.9968409 0.8588218 0.8945255 -0.9975189 0.8594117 0.8828571 -0.9980488 0.8690364 0.8842998 -0.9984638 0.8831255 0.892989 -0.9987895 0.8987476 0.9050819 -0.9990455 0.9141422 0.9181889 -0.999247 0.928347 0.9309211 -0.9994057 0.9409186 0.9425502 -0.9995308 0.9517328 0.952764 -0.9996295 0.9608482 0.9614985 -0.9997074 0.9684181 0.9688274 -0.9997688 0.9746346 0.9748918 -0.9998174 0.9796966 0.979858 -0.9998557 0.9837916 0.9838928 -0.999886 0.9870878 0.9871512 -0.9999099 0.9897306 0.9897703 -0.9999288 0.9918431 0.991868 -0.9999437 0.9935277 0.9935432 -0.6139459 0.9948662 0.9948662 -0.6139352 0.994866 0.994866 -0.6139219 0.9948657 0.9948657 -0.6139056 0.9948653 0.9948653 -0.6138855 0.9948649 0.9948649 -0.6138613 0.9948643 0.9948643 -0.6138323 0.9948636 0.9948636 -0.6137984 0.9948628 0.9948628 -0.6137599 0.9948617 0.9948617 -0.6137183 0.9948604 0.9948604 -0.6136769 0.9948589 0.9948589 -0.6136427 0.9948571 0.9948571 -0.6136284 0.9948551 0.9948551 -0.6136569 0.994853 0.994853 -0.6137675 0.9948509 0.9948509 -0.6140266 0.9948493 0.9948493 -0.6145393 0.9948487 0.9948487 -0.6152669 0.9948487 0.9948487 -0.6161874 0.9948487 0.9948487 -0.6173519 0.9948487 0.9948487 -0.6188252 0.9948487 0.9948487 -0.6206891 0.9948487 0.9948487 -0.6230471 0.9948487 0.9948487 -0.6260304 0.9948487 0.9948487 -0.6298046 0.9948487 0.9948487 -0.6345795 0.9948487 0.9948487 -0.6406203 0.9948487 0.9948487 -0.6482627 0.9948487 0.9948487 -0.6579314 0.9948487 0.9948487 -0.6701635 0.9948487 0.9948487 -0.6856388 0.9948487 0.9948487 -0.7052169 0.9948487 0.9948487 -0.7299859 0.9948487 0.9948487 -0.7613218 0.9948487 0.9948487 -0.8009659 0.9948487 0.9948487 -0.8511207 0.9948487 0.9948487 -0.9145732 0.9948487 0.9948487 -0.9948487 0.9948487 0.9948487 -0.9959706 0.9278617 0.9278617 -0.9968409 0.8945255 0.8945255 -0.9975189 0.8828571 0.8828571 -0.9980488 0.8842998 0.8842998 -0.9984638 0.892989 0.892989 -0.9987895 0.9050819 0.9050819 -0.9990455 0.9181889 0.9181889 -0.999247 0.9309211 0.9309211 -0.9994057 0.9425502 0.9425502 -0.9995308 0.952764 0.952764 -0.9996295 0.9614985 0.9614985 -0.9997074 0.9688274 0.9688274 -0.9997688 0.9748918 0.9748918 -0.9998174 0.979858 0.979858 -0.9998557 0.9838928 0.9838928 -0.999886 0.9871512 0.9871512 -0.9999099 0.9897703 0.9897703 -0.9999288 0.991868 0.991868 -0.9999437 0.9935432 0.9935432 -0.6724572 0.9959813 0.9281722 -0.6724495 0.9959811 0.9281681 -0.6724399 0.9959809 0.928163 -0.672428 0.9959807 0.9281566 -0.6724135 0.9959804 0.9281485 -0.6723959 0.9959801 0.9281385 -0.6723748 0.9959797 0.928126 -0.67235 0.9959791 0.9281107 -0.6723217 0.9959785 0.928092 -0.6722907 0.9959777 0.9280693 -0.6722594 0.9959768 0.9280423 -0.6722322 0.9959757 0.9280109 -0.672218 0.9959745 0.9279753 -0.672232 0.9959732 0.9279373 -0.6723012 0.9959719 0.9279002 -0.6724711 0.9959709 0.927871 -0.6728136 0.9959706 0.9278617 -0.6733015 0.9959706 0.9278617 -0.6739188 0.9959706 0.9278617 -0.6746998 0.9959706 0.9278617 -0.6756878 0.9959706 0.9278617 -0.6769378 0.9959706 0.9278617 -0.6785192 0.9959706 0.9278617 -0.6805199 0.9959706 0.9278617 -0.683051 0.9959706 0.9278617 -0.6862532 0.9959706 0.9278617 -0.6903044 0.9959706 0.9278617 -0.6954296 0.9959706 0.9278617 -0.7019138 0.9959706 0.9278617 -0.710117 0.9959706 0.9278617 -0.7204952 0.9959706 0.9278617 -0.733625 0.9959706 0.9278617 -0.7502359 0.9959706 0.9278617 -0.7712508 0.9959706 0.9278617 -0.7978374 0.9959706 0.9278617 -0.8314729 0.9959706 0.9278617 -0.8740262 0.9959706 0.9278617 -0.9278617 0.9959706 0.9278617 -0.9959706 0.9959706 0.9278617 -0.9968409 0.9396953 0.8945255 -0.9975189 0.9125186 0.8828571 -0.9980488 0.9036101 0.8842998 -0.9984638 0.9054678 0.892989 -0.9987895 0.9130957 0.9050819 -0.9990455 0.9233085 0.9181889 -0.999247 0.9341777 0.9309211 -0.9994057 0.9446144 0.9425502 -0.9995308 0.9540687 0.952764 -0.9996295 0.9623212 0.9614985 -0.9997074 0.9693452 0.9688274 -0.9997688 0.9752172 0.9748918 -0.9998174 0.9800622 0.979858 -0.9998557 0.9840209 0.9838928 -0.999886 0.9872315 0.9871512 -0.9999099 0.9898206 0.9897703 -0.9999288 0.9918994 0.991868 -0.9999437 0.9935629 0.9935432 -0.7251659 0.9968475 0.8948976 -0.7251605 0.9968474 0.8948926 -0.7251537 0.9968473 0.8948865 -0.7251454 0.9968472 0.8948788 -0.7251351 0.996847 0.8948691 -0.7251226 0.9968468 0.8948571 -0.7251076 0.9968465 0.8948422 -0.7250899 0.9968462 0.8948238 -0.7250697 0.9968458 0.8948014 -0.7250473 0.9968453 0.8947742 -0.7250244 0.9968448 0.8947418 -0.7250039 0.9968441 0.8947041 -0.7249916 0.9968433 0.8946616 -0.7249978 0.9968425 0.894616 -0.7250408 0.9968418 0.8945716 -0.7251511 0.9968411 0.8945366 -0.7253775 0.9968409 0.8945255 -0.7257011 0.9968409 0.8945255 -0.7261105 0.9968409 0.8945255 -0.7266285 0.9968409 0.8945255 -0.7272837 0.9968409 0.8945255 -0.7281127 0.9968409 0.8945255 -0.7291615 0.9968409 0.8945255 -0.7304884 0.9968409 0.8945255 -0.732167 0.9968409 0.8945255 -0.7342907 0.9968409 0.8945255 -0.7369774 0.9968409 0.8945255 -0.7403765 0.9968409 0.8945255 -0.7446768 0.9968409 0.8945255 -0.7501172 0.9968409 0.8945255 -0.757 0.9968409 0.8945255 -0.7657077 0.9968409 0.8945255 -0.776724 0.9968409 0.8945255 -0.7906611 0.9968409 0.8945255 -0.8082934 0.9968409 0.8945255 -0.8306004 0.9968409 0.8945255 -0.8588218 0.9968409 0.8945255 -0.8945255 0.9968409 0.8945255 -0.9396953 0.9968409 0.8945255 -0.9968409 0.9968409 0.8945255 -0.9975189 0.9500442 0.8828571 -0.9980488 0.9280401 0.8842998 -0.9984638 0.921255 0.892989 -0.9987895 0.9232341 0.9050819 -0.9990455 0.9297854 0.9181889 -0.999247 0.9382977 0.9309211 -0.9994057 0.9472259 0.9425502 -0.9995308 0.9557192 0.952764 -0.9996295 0.963362 0.9614985 -0.9997074 0.9700002 0.9688274 -0.9997688 0.9756289 0.9748918 -0.9998174 0.9803206 0.979858 -0.9998557 0.9841829 0.9838928 -0.999886 0.987333 0.9871512 -0.9999099 0.9898842 0.9897703 -0.9999288 0.9919392 0.991868 -0.9999437 0.9935878 0.9935432 -0.7716588 0.997523 0.8831923 -0.7716551 0.997523 0.8831879 -0.7716504 0.9975229 0.8831823 -0.7716446 0.9975228 0.8831754 -0.7716375 0.9975227 0.8831667 -0.7716288 0.9975226 0.8831558 -0.7716184 0.9975224 0.8831424 -0.7716061 0.9975222 0.8831259 -0.7715919 0.997522 0.8831056 -0.7715762 0.9975217 0.8830811 -0.7715599 0.9975213 0.883052 -0.7715449 0.9975209 0.883018 -0.7715352 0.9975204 0.8829797 -0.7715376 0.9975199 0.8829386 -0.7715641 0.9975194 0.8828986 -0.7716352 0.9975191 0.8828672 -0.7717834 0.9975189 0.8828571 -0.7719959 0.9975189 0.8828571 -0.7722648 0.9975189 0.8828571 -0.7726049 0.9975189 0.8828571 -0.7730352 0.9975189 0.8828571 -0.7735795 0.9975189 0.8828571 -0.7742682 0.9975189 0.8828571 -0.7751395 0.9975189 0.8828571 -0.7762418 0.9975189 0.8828571 -0.7776364 0.9975189 0.8828571 -0.7794007 0.9975189 0.8828571 -0.7816327 0.9975189 0.8828571 -0.7844566 0.9975189 0.8828571 -0.7880291 0.9975189 0.8828571 -0.7925488 0.9975189 0.8828571 -0.7982669 0.9975189 0.8828571 -0.8055009 0.9975189 0.8828571 -0.8146529 0.9975189 0.8828571 -0.8262314 0.9975189 0.8828571 -0.8408797 0.9975189 0.8828571 -0.8594117 0.9975189 0.8828571 -0.8828571 0.9975189 0.8828571 -0.9125186 0.9975189 0.8828571 -0.9500442 0.9975189 0.8828571 -0.9975189 0.9975189 0.8828571 -0.9980488 0.9589472 0.8842998 -0.9984638 0.9412278 0.892989 -0.9987895 0.9360606 0.9050819 -0.9990455 0.9379796 0.9181889 -0.999247 0.94351 0.9309211 -0.9994057 0.9505298 0.9425502 -0.9995308 0.9578074 0.952764 -0.9996295 0.9646787 0.9614985 -0.9997074 0.970829 0.9688274 -0.9997688 0.9761497 0.9748918 -0.9998174 0.9806476 0.979858 -0.9998557 0.984388 0.9838928 -0.999886 0.9874615 0.9871512 -0.9999099 0.9899646 0.9897703 -0.9999288 0.9919896 0.991868 -0.9999437 0.9936193 0.9935432 -0.8119154 0.9980513 0.884567 -0.8119128 0.9980512 0.8845635 -0.8119096 0.9980512 0.8845591 -0.8119057 0.9980511 0.8845535 -0.8119009 0.9980511 0.8845466 -0.8118949 0.998051 0.8845379 -0.8118878 0.9980509 0.8845272 -0.8118794 0.9980508 0.884514 -0.8118697 0.9980506 0.8844979 -0.8118589 0.9980504 0.8844784 -0.8118476 0.9980502 0.8844551 -0.811837 0.99805 0.8844281 -0.8118298 0.9980497 0.8843975 -0.8118303 0.9980494 0.8843648 -0.8118466 0.9980491 0.8843329 -0.8118921 0.9980488 0.8843078 -0.8119884 0.9980488 0.8842998 -0.8121268 0.9980488 0.8842998 -0.8123018 0.9980488 0.8842998 -0.8125232 0.9980488 0.8842998 -0.8128033 0.9980488 0.8842998 -0.8131577 0.9980488 0.8842998 -0.8136061 0.9980488 0.8842998 -0.8141733 0.9980488 0.8842998 -0.8148909 0.9980488 0.8842998 -0.8157988 0.9980488 0.8842998 -0.8169474 0.9980488 0.8842998 -0.8184005 0.9980488 0.8842998 -0.8202389 0.9980488 0.8842998 -0.8225647 0.9980488 0.8842998 -0.8255071 0.9980488 0.8842998 -0.8292297 0.9980488 0.8842998 -0.8339392 0.9980488 0.8842998 -0.8398974 0.9980488 0.8842998 -0.8474353 0.9980488 0.8842998 -0.8569716 0.9980488 0.8842998 -0.8690364 0.9980488 0.8842998 -0.8842998 0.9980488 0.8842998 -0.9036101 0.9980488 0.8842998 -0.9280401 0.9980488 0.8842998 -0.9589472 0.9980488 0.8842998 -0.9980488 0.9980488 0.8842998 -0.9984638 0.9664961 0.892989 -0.9987895 0.9522877 0.9050819 -0.9990455 0.9483463 0.9181889 -0.999247 0.9501042 0.9309211 -0.9994057 0.9547096 0.9425502 -0.9995308 0.9604492 0.952764 -0.9996295 0.9663445 0.9614985 -0.9997074 0.9718774 0.9688274 -0.9997688 0.9768086 0.9748918 -0.9998174 0.9810611 0.979858 -0.9998557 0.9846473 0.9838928 -0.999886 0.987624 0.9871512 -0.9999099 0.9900664 0.9897703 -0.9999288 0.9920533 0.991868 -0.9999437 0.9936592 0.9935432 -0.8462171 0.9984653 0.8931877 -0.8462154 0.9984653 0.8931851 -0.8462132 0.9984653 0.8931818 -0.8462106 0.9984653 0.8931777 -0.8462073 0.9984652 0.8931725 -0.8462034 0.9984652 0.8931661 -0.8461986 0.9984651 0.8931581 -0.8461929 0.998465 0.8931483 -0.8461864 0.9984649 0.8931363 -0.8461791 0.9984648 0.8931218 -0.8461714 0.9984647 0.8931045 -0.8461641 0.9984645 0.8930844 -0.8461589 0.9984643 0.8930617 -0.8461587 0.9984642 0.8930373 -0.8461687 0.998464 0.8930136 -0.8461977 0.9984638 0.892995 -0.8462598 0.9984638 0.892989 -0.8463492 0.9984638 0.892989 -0.8464623 0.9984638 0.892989 -0.8466054 0.9984638 0.892989 -0.8467864 0.9984638 0.892989 -0.8470154 0.9984638 0.892989 -0.8473052 0.9984638 0.892989 -0.8476717 0.9984638 0.892989 -0.8481355 0.9984638 0.892989 -0.8487222 0.9984638 0.892989 -0.8494644 0.9984638 0.892989 -0.8504035 0.9984638 0.892989 -0.8515915 0.9984638 0.892989 -0.8530945 0.9984638 0.892989 -0.8549959 0.9984638 0.892989 -0.8574015 0.9984638 0.892989 -0.8604449 0.9984638 0.892989 -0.8642952 0.9984638 0.892989 -0.8691663 0.9984638 0.892989 -0.875329 0.9984638 0.892989 -0.8831255 0.9984638 0.892989 -0.892989 0.9984638 0.892989 -0.9054678 0.9984638 0.892989 -0.921255 0.9984638 0.892989 -0.9412278 0.9984638 0.892989 -0.9664961 0.9984638 0.892989 -0.9984638 0.9984638 0.892989 -0.9987895 0.9728171 0.9050819 -0.9990455 0.9614615 0.9181889 -0.999247 0.9584468 0.9309211 -0.9994057 0.9599976 0.9425502 -0.9995308 0.9637914 0.952764 -0.9996295 0.968452 0.9614985 -0.9997074 0.9732039 0.9688274 -0.9997688 0.9776422 0.9748918 -0.9998174 0.9815844 0.979858 -0.9998557 0.9849754 0.9838928 -0.999886 0.9878296 0.9871512 -0.9999099 0.9901951 0.9897703 -0.9999288 0.9921339 0.991868 -0.9999437 0.9937096 0.9935432 -0.8750477 0.9987905 0.9052232 -0.8750466 0.9987905 0.9052213 -0.8750451 0.9987904 0.905219 -0.8750434 0.9987904 0.905216 -0.8750412 0.9987904 0.9052124 -0.8750386 0.9987904 0.9052078 -0.8750355 0.9987903 0.9052021 -0.8750317 0.9987903 0.9051951 -0.8750274 0.9987902 0.9051866 -0.8750225 0.9987902 0.9051763 -0.8750173 0.9987901 0.905164 -0.8750124 0.99879 0.9051497 -0.8750088 0.9987899 0.9051336 -0.8750084 0.9987897 0.9051163 -0.8750145 0.9987896 0.9050994 -0.8750329 0.9987895 0.9050862 -0.8750727 0.9987895 0.9050819 -0.8751301 0.9987895 0.9050819 -0.8752028 0.9987895 0.9050819 -0.8752947 0.9987895 0.9050819 -0.8754109 0.9987895 0.9050819 -0.875558 0.9987895 0.9050819 -0.8757441 0.9987895 0.9050819 -0.8759795 0.9987895 0.9050819 -0.8762773 0.9987895 0.9050819 -0.8766541 0.9987895 0.9050819 -0.8771307 0.9987895 0.9050819 -0.8777338 0.9987895 0.9050819 -0.8784967 0.9987895 0.9050819 -0.8794619 0.9987895 0.9050819 -0.880683 0.9987895 0.9050819 -0.8822279 0.9987895 0.9050819 -0.8841823 0.9987895 0.9050819 -0.886655 0.9987895 0.9050819 -0.8897832 0.9987895 0.9050819 -0.8937407 0.9987895 0.9050819 -0.8987476 0.9987895 0.9050819 -0.9050819 0.9987895 0.9050819 -0.9130957 0.9987895 0.9050819 -0.9232341 0.9987895 0.9050819 -0.9360606 0.9987895 0.9050819 -0.9522877 0.9987895 0.9050819 -0.9728171 0.9987895 0.9050819 -0.9987895 0.9987895 0.9050819 -0.9990455 0.9780539 0.9181889 -0.999247 0.9690013 0.9309211 -0.9994057 0.9666876 0.9425502 -0.9995308 0.9680197 0.952764 -0.9996295 0.9711183 0.9614985 -0.9997074 0.974882 0.9688274 -0.9997688 0.9786968 0.9748918 -0.9998174 0.9822464 0.979858 -0.9998557 0.9853905 0.9838928 -0.999886 0.9880897 0.9871512 -0.9999099 0.990358 0.9897703 -0.9999288 0.9922358 0.991868 -0.9999437 0.9937734 0.9935432 -0.8990028 0.9990461 0.9182862 -0.899002 0.9990461 0.9182849 -0.8990011 0.9990461 0.9182833 -0.899 0.9990461 0.9182813 -0.8989986 0.9990461 0.9182787 -0.8989969 0.9990461 0.9182756 -0.8989948 0.9990461 0.9182717 -0.8989923 0.999046 0.9182669 -0.8989895 0.999046 0.918261 -0.8989863 0.9990459 0.9182539 -0.8989829 0.9990459 0.9182454 -0.8989796 0.9990458 0.9182356 -0.8989771 0.9990458 0.9182244 -0.8989767 0.9990457 0.9182125 -0.8989805 0.9990456 0.9182009 -0.8989921 0.9990456 0.9181918 -0.8990175 0.9990455 0.9181889 -0.8990542 0.9990455 0.9181889 -0.8991006 0.9990455 0.9181889 -0.8991593 0.9990455 0.9181889 -0.8992336 0.9990455 0.9181889 -0.8993275 0.9990455 0.9181889 -0.8994464 0.9990455 0.9181889 -0.8995968 0.9990455 0.9181889 -0.899787 0.9990455 0.9181889 -0.9000277 0.9990455 0.9181889 -0.9003323 0.9990455 0.9181889 -0.9007175 0.9990455 0.9181889 -0.9012049 0.9990455 0.9181889 -0.9018215 0.9990455 0.9181889 -0.9026016 0.9990455 0.9181889 -0.9035886 0.9990455 0.9181889 -0.9048372 0.9990455 0.9181889 -0.9064168 0.9990455 0.9181889 -0.9084153 0.9990455 0.9181889 -0.9109436 0.9990455 0.9181889 -0.9141422 0.9990455 0.9181889 -0.9181889 0.9990455 0.9181889 -0.9233085 0.9990455 0.9181889 -0.9297854 0.9990455 0.9181889 -0.9379796 0.9990455 0.9181889 -0.9483463 0.9990455 0.9181889 -0.9614615 0.9990455 0.9181889 -0.9780539 0.9990455 0.9181889 -0.9990455 0.9990455 0.9181889 -0.999247 0.982354 0.9309211 -0.9994057 0.9751513 0.9425502 -0.9995308 0.9733691 0.952764 -0.9996295 0.9744915 0.9614985 -0.9997074 0.977005 0.9688274 -0.9997688 0.980031 0.9748918 -0.9998174 0.9830838 0.979858 -0.9998557 0.9859157 0.9838928 -0.999886 0.9884188 0.9871512 -0.9999099 0.9905641 0.9897703 -0.9999288 0.9923648 0.991868 -0.9999437 0.9938541 0.9935432 -0.9187175 0.9992474 0.9309867 -0.918717 0.9992474 0.9309858 -0.9187164 0.9992474 0.9309847 -0.9187157 0.9992474 0.9309833 -0.9187148 0.9992474 0.9309816 -0.9187137 0.9992474 0.9309795 -0.9187123 0.9992473 0.9309769 -0.9187107 0.9992473 0.9309736 -0.9187089 0.9992473 0.9309697 -0.9187068 0.9992473 0.9309649 -0.9187045 0.9992472 0.9309592 -0.9187024 0.9992472 0.9309526 -0.9187008 0.9992472 0.9309451 -0.9187004 0.9992471 0.930937 -0.9187027 0.9992471 0.9309292 -0.9187101 0.999247 0.9309231 -0.9187262 0.999247 0.9309211 -0.9187495 0.999247 0.9309211 -0.9187791 0.999247 0.9309211 -0.9188164 0.999247 0.9309211 -0.9188636 0.999247 0.9309211 -0.9189234 0.999247 0.9309211 -0.918999 0.999247 0.9309211 -0.9190947 0.999247 0.9309211 -0.9192157 0.999247 0.9309211 -0.9193688 0.999247 0.9309211 -0.9195625 0.999247 0.9309211 -0.9198076 0.999247 0.9309211 -0.9201176 0.999247 0.9309211 -0.9205098 0.999247 0.9309211 -0.9210061 0.999247 0.9309211 -0.9216339 0.999247 0.9309211 -0.9224281 0.999247 0.9309211 -0.9234329 0.999247 0.9309211 -0.9247041 0.999247 0.9309211 -0.9263124 0.999247 0.9309211 -0.928347 0.999247 0.9309211 -0.9309211 0.999247 0.9309211 -0.9341777 0.999247 0.9309211 -0.9382977 0.999247 0.9309211 -0.94351 0.999247 0.9309211 -0.9501042 0.999247 0.9309211 -0.9584468 0.999247 0.9309211 -0.9690013 0.999247 0.9309211 -0.982354 0.999247 0.9309211 -0.999247 0.999247 0.9309211 -0.9994057 0.9858591 0.9425502 -0.9995308 0.9801368 0.952764 -0.9996295 0.978759 0.9614985 -0.9997074 0.9796909 0.9688274 -0.9997688 0.981719 0.9748918 -0.9998174 0.9841433 0.979858 -0.9998557 0.9865801 0.9838928 -0.999886 0.9888351 0.9871512 -0.9999099 0.9908248 0.9897703 -0.9999288 0.992528 0.991868 -0.9999437 0.9939562 0.9935432 -0.9348153 0.999406 0.9425936 -0.9348149 0.999406 0.9425931 -0.9348146 0.999406 0.9425924 -0.9348141 0.999406 0.9425915 -0.9348135 0.999406 0.9425903 -0.9348128 0.9994059 0.9425889 -0.9348119 0.9994059 0.9425872 -0.9348109 0.9994059 0.942585 -0.9348097 0.9994059 0.9425824 -0.9348083 0.9994059 0.9425792 -0.9348069 0.9994059 0.9425755 -0.9348055 0.9994059 0.9425711 -0.9348044 0.9994058 0.9425661 -0.9348042 0.9994058 0.9425608 -0.9348056 0.9994058 0.9425556 -0.9348102 0.9994057 0.9425516 -0.9348204 0.9994057 0.9425502 -0.9348352 0.9994057 0.9425502 -0.9348539 0.9994057 0.9425502 -0.9348776 0.9994057 0.9425502 -0.9349075 0.9994057 0.9425502 -0.9349454 0.9994057 0.9425502 -0.9349933 0.9994057 0.9425502 -0.935054 0.9994057 0.9425502 -0.9351307 0.9994057 0.9425502 -0.9352277 0.9994057 0.9425502 -0.9353505 0.9994057 0.9425502 -0.9355059 0.9994057 0.9425502 -0.9357024 0.9994057 0.9425502 -0.935951 0.9994057 0.9425502 -0.9362655 0.9994057 0.9425502 -0.9366635 0.9994057 0.9425502 -0.9371669 0.9994057 0.9425502 -0.9378038 0.9994057 0.9425502 -0.9386096 0.9994057 0.9425502 -0.939629 0.9994057 0.9425502 -0.9409186 0.9994057 0.9425502 -0.9425502 0.9994057 0.9425502 -0.9446144 0.9994057 0.9425502 -0.9472259 0.9994057 0.9425502 -0.9505298 0.9994057 0.9425502 -0.9547096 0.9994057 0.9425502 -0.9599976 0.9994057 0.9425502 -0.9666876 0.9994057 0.9425502 -0.9751513 0.9994057 0.9425502 -0.9858591 0.9994057 0.9425502 -0.9994057 0.9994057 0.9425502 -0.9995308 0.9886988 0.952764 -0.9996295 0.9841579 0.9614985 -0.9997074 0.983089 0.9688274 -0.9997688 0.9838545 0.9748918 -0.9998174 0.9854838 0.979858 -0.9998557 0.9874207 0.9838928 -0.999886 0.9893618 0.9871512 -0.9999099 0.9911547 0.9897703 -0.9999288 0.9927345 0.991868 -0.9999437 0.9940854 0.9935432 -0.9478754 0.999531 0.9527924 -0.9478752 0.999531 0.952792 -0.947875 0.999531 0.9527916 -0.9478746 0.999531 0.952791 -0.9478743 0.999531 0.9527902 -0.9478738 0.999531 0.9527893 -0.9478733 0.999531 0.9527882 -0.9478726 0.999531 0.9527868 -0.9478718 0.999531 0.9527851 -0.947871 0.9995309 0.952783 -0.94787 0.9995309 0.9527805 -0.9478691 0.9995309 0.9527776 -0.9478684 0.9995309 0.9527744 -0.9478683 0.9995309 0.9527709 -0.9478691 0.9995309 0.9527675 -0.947872 0.9995309 0.9527649 -0.9478785 0.9995308 0.952764 -0.9478878 0.9995308 0.952764 -0.9478997 0.9995308 0.952764 -0.9479146 0.9995308 0.952764 -0.9479335 0.9995308 0.952764 -0.9479575 0.9995308 0.952764 -0.9479878 0.9995308 0.952764 -0.9480261 0.9995308 0.952764 -0.9480746 0.9995308 0.952764 -0.9481359 0.9995308 0.952764 -0.9482135 0.9995308 0.952764 -0.9483117 0.9995308 0.952764 -0.9484359 0.9995308 0.952764 -0.9485931 0.9995308 0.952764 -0.9487918 0.9995308 0.952764 -0.9490434 0.9995308 0.952764 -0.9493615 0.9995308 0.952764 -0.9497641 0.9995308 0.952764 -0.9502734 0.9995308 0.952764 -0.9509177 0.9995308 0.952764 -0.9517328 0.9995308 0.952764 -0.952764 0.9995308 0.952764 -0.9540687 0.9995308 0.952764 -0.9557192 0.9995308 0.952764 -0.9578074 0.9995308 0.952764 -0.9604492 0.9995308 0.952764 -0.9637914 0.9995308 0.952764 -0.9680197 0.9995308 0.952764 -0.9733691 0.9995308 0.952764 -0.9801368 0.9995308 0.952764 -0.9886988 0.9995308 0.952764 -0.9995308 0.9995308 0.952764 -0.9996295 0.9909882 0.9614985 -0.9997074 0.9873879 0.9688274 -0.9997688 0.9865561 0.9748918 -0.9998174 0.9871796 0.979858 -0.9998557 0.9884841 0.9838928 -0.999886 0.9900282 0.9871512 -0.9999099 0.991572 0.9897703 -0.9999288 0.9929957 0.991868 -0.9999437 0.9942488 0.9935432 -0.958416 0.9996296 0.9615169 -0.9584159 0.9996296 0.9615166 -0.9584157 0.9996296 0.9615163 -0.9584155 0.9996296 0.9615159 -0.9584153 0.9996296 0.9615155 -0.958415 0.9996296 0.9615149 -0.9584146 0.9996296 0.9615141 -0.9584142 0.9996296 0.9615132 -0.9584137 0.9996296 0.9615121 -0.9584132 0.9996296 0.9615108 -0.9584126 0.9996296 0.9615092 -0.958412 0.9996296 0.9615073 -0.9584115 0.9996296 0.9615052 -0.9584114 0.9996295 0.961503 -0.958412 0.9996295 0.9615008 -0.9584138 0.9996295 0.9614991 -0.9584178 0.9996295 0.9614985 -0.9584237 0.9996295 0.9614985 -0.9584312 0.9996295 0.9614985 -0.9584406 0.9996295 0.9614985 -0.9584526 0.9996295 0.9614985 -0.9584677 0.9996295 0.9614985 -0.9584868 0.9996295 0.9614985 -0.9585109 0.9996295 0.9614985 -0.9585415 0.9996295 0.9614985 -0.9585802 0.9996295 0.9614985 -0.9586291 0.9996295 0.9614985 -0.958691 0.9996295 0.9614985 -0.9587693 0.9996295 0.9614985 -0.9588684 0.9996295 0.9614985 -0.9589938 0.9996295 0.9614985 -0.9591524 0.9996295 0.9614985 -0.959353 0.9996295 0.9614985 -0.9596068 0.9996295 0.9614985 -0.959928 0.9996295 0.9614985 -0.9603343 0.9996295 0.9614985 -0.9608482 0.9996295 0.9614985 -0.9614985 0.9996295 0.9614985 -0.9623212 0.9996295 0.9614985 -0.963362 0.9996295 0.9614985 -0.9646787 0.9996295 0.9614985 -0.9663445 0.9996295 0.9614985 -0.968452 0.9996295 0.9614985 -0.9711183 0.9996295 0.9614985 -0.9744915 0.9996295 0.9614985 -0.978759 0.9996295 0.9614985 -0.9841579 0.9996295 0.9614985 -0.9909882 0.9996295 0.9614985 -0.9996295 0.9996295 0.9614985 -0.9997074 0.9928267 0.9688274 -0.9997688 0.9899741 0.9748918 -0.9998174 0.989325 0.979858 -0.9998557 0.9898295 0.9838928 -0.999886 0.9908712 0.9871512 -0.9999099 0.9920999 0.9897703 -0.9999288 0.9933261 0.991868 -0.9999437 0.9944556 0.9935432 -0.9668873 0.9997074 0.9688392 -0.9668872 0.9997074 0.968839 -0.9668871 0.9997074 0.9688388 -0.966887 0.9997074 0.9688386 -0.9668869 0.9997074 0.9688383 -0.9668867 0.9997074 0.9688379 -0.9668865 0.9997074 0.9688374 -0.9668862 0.9997074 0.9688368 -0.9668859 0.9997074 0.9688361 -0.9668855 0.9997074 0.9688353 -0.9668852 0.9997074 0.9688342 -0.9668848 0.9997074 0.968833 -0.9668845 0.9997074 0.9688317 -0.9668844 0.9997074 0.9688303 -0.9668847 0.9997074 0.9688289 -0.9668859 0.9997074 0.9688277 -0.9668884 0.9997074 0.9688274 -0.9668922 0.9997074 0.9688274 -0.9668969 0.9997074 0.9688274 -0.9669028 0.9997074 0.9688274 -0.9669103 0.9997074 0.9688274 -0.9669198 0.9997074 0.9688274 -0.9669318 0.9997074 0.9688274 -0.966947 0.9997074 0.9688274 -0.9669663 0.9997074 0.9688274 -0.9669906 0.9997074 0.9688274 -0.9670214 0.9997074 0.9688274 -0.9670604 0.9997074 0.9688274 -0.9671097 0.9997074 0.9688274 -0.967172 0.9997074 0.9688274 -0.9672509 0.9997074 0.9688274 -0.9673508 0.9997074 0.9688274 -0.967477 0.9997074 0.9688274 -0.9676368 0.9997074 0.9688274 -0.9678389 0.9997074 0.9688274 -0.9680946 0.9997074 0.9688274 -0.9684181 0.9997074 0.9688274 -0.9688274 0.9997074 0.9688274 -0.9693452 0.9997074 0.9688274 -0.9700002 0.9997074 0.9688274 -0.970829 0.9997074 0.9688274 -0.9718774 0.9997074 0.9688274 -0.9732039 0.9997074 0.9688274 -0.974882 0.9997074 0.9688274 -0.977005 0.9997074 0.9688274 -0.9796909 0.9997074 0.9688274 -0.983089 0.9997074 0.9688274 -0.9873879 0.9997074 0.9688274 -0.9928267 0.9997074 0.9688274 -0.9997074 0.9997074 0.9688274 -0.9997688 0.9942982 0.9748918 -0.9998174 0.9920392 0.979858 -0.9998557 0.9915316 0.9838928 -0.999886 0.9919377 0.9871512 -0.9999099 0.9927678 0.9897703 -0.9999288 0.9937442 0.991868 -0.9999437 0.9947172 0.9935432 -0.9736726 0.9997689 0.9748994 -0.9736726 0.9997689 0.9748993 -0.9736725 0.9997689 0.9748991 -0.9736724 0.9997689 0.974899 -0.9736723 0.9997689 0.9748988 -0.9736722 0.9997689 0.9748985 -0.9736721 0.9997689 0.9748982 -0.9736719 0.9997689 0.9748979 -0.9736717 0.9997689 0.9748974 -0.9736715 0.9997689 0.9748969 -0.9736712 0.9997689 0.9748962 -0.973671 0.9997689 0.9748954 -0.9736708 0.9997689 0.9748946 -0.9736708 0.9997689 0.9748937 -0.973671 0.9997688 0.9748928 -0.9736717 0.9997688 0.9748921 -0.9736733 0.9997688 0.9748918 -0.9736756 0.9997688 0.9748918 -0.9736786 0.9997688 0.9748918 -0.9736823 0.9997688 0.9748918 -0.973687 0.9997688 0.9748918 -0.973693 0.9997688 0.9748918 -0.9737006 0.9997688 0.9748918 -0.9737101 0.9997688 0.9748918 -0.9737222 0.9997688 0.9748918 -0.9737375 0.9997688 0.9748918 -0.9737569 0.9997688 0.9748918 -0.9737814 0.9997688 0.9748918 -0.9738123 0.9997688 0.9748918 -0.9738515 0.9997688 0.9748918 -0.9739011 0.9997688 0.9748918 -0.9739638 0.9997688 0.9748918 -0.9740432 0.9997688 0.9748918 -0.9741436 0.9997688 0.9748918 -0.9742706 0.9997688 0.9748918 -0.9744313 0.9997688 0.9748918 -0.9746346 0.9997688 0.9748918 -0.9748918 0.9997688 0.9748918 -0.9752172 0.9997688 0.9748918 -0.9756289 0.9997688 0.9748918 -0.9761497 0.9997688 0.9748918 -0.9768086 0.9997688 0.9748918 -0.9776422 0.9997688 0.9748918 -0.9786968 0.9997688 0.9748918 -0.980031 0.9997688 0.9748918 -0.981719 0.9997688 0.9748918 -0.9838545 0.9997688 0.9748918 -0.9865561 0.9997688 0.9748918 -0.9899741 0.9997688 0.9748918 -0.9942982 0.9997688 0.9748918 -0.9997688 0.9997688 0.9748918 -0.9998174 0.9954731 0.979858 -0.9998557 0.9936849 0.9838928 -0.999886 0.993287 0.9871512 -0.9999099 0.9936128 0.9897703 -0.9999288 0.9942731 0.991868 -0.9999437 0.9950481 0.9935432 -0.9790927 0.9998174 0.9798628 -0.9790927 0.9998174 0.9798627 -0.9790927 0.9998174 0.9798626 -0.9790926 0.9998174 0.9798625 -0.9790925 0.9998174 0.9798624 -0.9790925 0.9998174 0.9798623 -0.9790924 0.9998174 0.9798621 -0.9790923 0.9998174 0.9798618 -0.9790921 0.9998174 0.9798615 -0.979092 0.9998174 0.9798612 -0.9790919 0.9998174 0.9798608 -0.9790917 0.9998174 0.9798603 -0.9790916 0.9998174 0.9798597 -0.9790916 0.9998174 0.9798592 -0.9790917 0.9998174 0.9798586 -0.9790921 0.9998174 0.9798581 -0.9790931 0.9998174 0.979858 -0.9790946 0.9998174 0.979858 -0.9790965 0.9998174 0.979858 -0.9790988 0.9998174 0.979858 -0.9791018 0.9998174 0.979858 -0.9791055 0.9998174 0.979858 -0.9791103 0.9998174 0.979858 -0.9791163 0.9998174 0.979858 -0.9791238 0.9998174 0.979858 -0.9791334 0.9998174 0.979858 -0.9791456 0.9998174 0.979858 -0.979161 0.9998174 0.979858 -0.9791804 0.9998174 0.979858 -0.979205 0.9998174 0.979858 -0.9792361 0.9998174 0.979858 -0.9792755 0.9998174 0.979858 -0.9793253 0.9998174 0.979858 -0.9793883 0.9998174 0.979858 -0.9794681 0.9998174 0.979858 -0.9795689 0.9998174 0.979858 -0.9796966 0.9998174 0.979858 -0.979858 0.9998174 0.979858 -0.9800622 0.9998174 0.979858 -0.9803206 0.9998174 0.979858 -0.9806476 0.9998174 0.979858 -0.9810611 0.9998174 0.979858 -0.9815844 0.9998174 0.979858 -0.9822464 0.9998174 0.979858 -0.9830838 0.9998174 0.979858 -0.9841433 0.9998174 0.979858 -0.9854838 0.9998174 0.979858 -0.9871796 0.9998174 0.979858 -0.989325 0.9998174 0.979858 -0.9920392 0.9998174 0.979858 -0.9954731 0.9998174 0.979858 -0.9998174 0.9998174 0.979858 -0.9998557 0.9964092 0.9838928 -0.999886 0.9949941 0.9871512 -0.9999099 0.9946818 0.9897703 -0.9999288 0.9949422 0.991868 -0.9999437 0.9954668 0.9935432 -0.9834129 0.9998557 0.9838959 -0.9834129 0.9998557 0.9838958 -0.9834129 0.9998557 0.9838958 -0.9834129 0.9998557 0.9838957 -0.9834128 0.9998557 0.9838956 -0.9834128 0.9998557 0.9838955 -0.9834127 0.9998557 0.9838954 -0.9834127 0.9998557 0.9838953 -0.9834126 0.9998557 0.9838951 -0.9834125 0.9998557 0.9838948 -0.9834124 0.9998557 0.9838946 -0.9834123 0.9998557 0.9838943 -0.9834122 0.9998557 0.9838939 -0.9834122 0.9998557 0.9838936 -0.9834123 0.9998557 0.9838932 -0.9834126 0.9998557 0.9838929 -0.9834132 0.9998557 0.9838928 -0.9834141 0.9998557 0.9838928 -0.9834153 0.9998557 0.9838928 -0.9834167 0.9998557 0.9838928 -0.9834186 0.9998557 0.9838928 -0.9834209 0.9998557 0.9838928 -0.9834239 0.9998557 0.9838928 -0.9834277 0.9998557 0.9838928 -0.9834324 0.9998557 0.9838928 -0.9834385 0.9998557 0.9838928 -0.9834461 0.9998557 0.9838928 -0.9834557 0.9998557 0.9838928 -0.9834679 0.9998557 0.9838928 -0.9834833 0.9998557 0.9838928 -0.9835029 0.9998557 0.9838928 -0.9835276 0.9998557 0.9838928 -0.9835588 0.9998557 0.9838928 -0.9835983 0.9998557 0.9838928 -0.9836483 0.9998557 0.9838928 -0.9837116 0.9998557 0.9838928 -0.9837916 0.9998557 0.9838928 -0.9838928 0.9998557 0.9838928 -0.9840209 0.9998557 0.9838928 -0.9841829 0.9998557 0.9838928 -0.984388 0.9998557 0.9838928 -0.9846473 0.9998557 0.9838928 -0.9849754 0.9998557 0.9838928 -0.9853905 0.9998557 0.9838928 -0.9859157 0.9998557 0.9838928 -0.9865801 0.9998557 0.9838928 -0.9874207 0.9998557 0.9838928 -0.9884841 0.9998557 0.9838928 -0.9898295 0.9998557 0.9838928 -0.9915316 0.9998557 0.9838928 -0.9936849 0.9998557 0.9838928 -0.9964092 0.9998557 0.9838928 -0.9998557 0.9998557 0.9838928 -0.999886 0.9971537 0.9871512 -0.9999099 0.9960342 0.9897703 -0.9999288 0.9957887 0.991868 -0.9999437 0.9959964 0.9935432 -0.9868505 0.999886 0.9871531 -0.9868505 0.999886 0.9871531 -0.9868505 0.999886 0.9871531 -0.9868505 0.999886 0.987153 -0.9868504 0.999886 0.987153 -0.9868504 0.999886 0.9871529 -0.9868504 0.999886 0.9871528 -0.9868503 0.999886 0.9871527 -0.9868503 0.999886 0.9871526 -0.9868502 0.999886 0.9871525 -0.9868502 0.999886 0.9871523 -0.9868501 0.999886 0.9871521 -0.9868501 0.999886 0.9871519 -0.98685 0.999886 0.9871517 -0.9868501 0.999886 0.9871514 -0.9868503 0.999886 0.9871513 -0.9868507 0.999886 0.9871512 -0.9868512 0.999886 0.9871512 -0.986852 0.999886 0.9871512 -0.9868529 0.999886 0.9871512 -0.9868541 0.999886 0.9871512 -0.9868555 0.999886 0.9871512 -0.9868574 0.999886 0.9871512 -0.9868597 0.999886 0.9871512 -0.9868627 0.999886 0.9871512 -0.9868665 0.999886 0.9871512 -0.9868713 0.999886 0.9871512 -0.9868773 0.999886 0.9871512 -0.986885 0.999886 0.9871512 -0.9868946 0.999886 0.9871512 -0.9869069 0.999886 0.9871512 -0.9869223 0.999886 0.9871512 -0.9869419 0.999886 0.9871512 -0.9869667 0.999886 0.9871512 -0.986998 0.999886 0.9871512 -0.9870376 0.999886 0.9871512 -0.9870878 0.999886 0.9871512 -0.9871512 0.999886 0.9871512 -0.9872315 0.999886 0.9871512 -0.987333 0.999886 0.9871512 -0.9874615 0.999886 0.9871512 -0.987624 0.999886 0.9871512 -0.9878296 0.999886 0.9871512 -0.9880897 0.999886 0.9871512 -0.9884188 0.999886 0.9871512 -0.9888351 0.999886 0.9871512 -0.9893618 0.999886 0.9871512 -0.9900282 0.999886 0.9871512 -0.9908712 0.999886 0.9871512 -0.9919377 0.999886 0.9871512 -0.993287 0.999886 0.9871512 -0.9949941 0.999886 0.9871512 -0.9971537 0.999886 0.9871512 -0.999886 0.999886 0.9871512 -0.9999099 0.9977452 0.9897703 -0.9999288 0.9968597 0.991868 -0.9999437 0.9966665 0.9935432 -0.989582 0.9999099 0.9897715 -0.989582 0.9999099 0.9897715 -0.989582 0.9999099 0.9897715 -0.989582 0.9999099 0.9897715 -0.989582 0.9999099 0.9897714 -0.9895819 0.9999099 0.9897714 -0.9895819 0.9999099 0.9897713 -0.9895819 0.9999099 0.9897713 -0.9895819 0.9999099 0.9897712 -0.9895818 0.9999099 0.9897711 -0.9895818 0.9999099 0.989771 -0.9895818 0.9999099 0.9897709 -0.9895817 0.9999099 0.9897708 -0.9895817 0.9999099 0.9897706 -0.9895817 0.9999099 0.9897705 -0.9895819 0.9999099 0.9897704 -0.9895821 0.9999099 0.9897703 -0.9895825 0.9999099 0.9897703 -0.9895829 0.9999099 0.9897703 -0.9895835 0.9999099 0.9897703 -0.9895842 0.9999099 0.9897703 -0.9895851 0.9999099 0.9897703 -0.9895863 0.9999099 0.9897703 -0.9895878 0.9999099 0.9897703 -0.9895897 0.9999099 0.9897703 -0.989592 0.9999099 0.9897703 -0.989595 0.9999099 0.9897703 -0.9895988 0.9999099 0.9897703 -0.9896036 0.9999099 0.9897703 -0.9896096 0.9999099 0.9897703 -0.9896173 0.9999099 0.9897703 -0.989627 0.9999099 0.9897703 -0.9896392 0.9999099 0.9897703 -0.9896547 0.9999099 0.9897703 -0.9896744 0.9999099 0.9897703 -0.9896992 0.9999099 0.9897703 -0.9897306 0.9999099 0.9897703 -0.9897703 0.9999099 0.9897703 -0.9898206 0.9999099 0.9897703 -0.9898842 0.9999099 0.9897703 -0.9899646 0.9999099 0.9897703 -0.9900664 0.9999099 0.9897703 -0.9901951 0.9999099 0.9897703 -0.990358 0.9999099 0.9897703 -0.9905641 0.9999099 0.9897703 -0.9908248 0.9999099 0.9897703 -0.9911547 0.9999099 0.9897703 -0.991572 0.9999099 0.9897703 -0.9920999 0.9999099 0.9897703 -0.9927678 0.9999099 0.9897703 -0.9936128 0.9999099 0.9897703 -0.9946818 0.9999099 0.9897703 -0.9960342 0.9999099 0.9897703 -0.9977452 0.9999099 0.9897703 -0.9999099 0.9999099 0.9897703 -0.9999288 0.9982146 0.991868 -0.9999437 0.9975143 0.9935432 -0.9917501 0.9999288 0.9918687 -0.9917501 0.9999288 0.9918687 -0.9917501 0.9999288 0.9918687 -0.9917501 0.9999288 0.9918687 -0.9917501 0.9999288 0.9918687 -0.9917501 0.9999288 0.9918686 -0.99175 0.9999288 0.9918686 -0.99175 0.9999288 0.9918686 -0.99175 0.9999288 0.9918685 -0.99175 0.9999288 0.9918685 -0.99175 0.9999288 0.9918684 -0.9917499 0.9999288 0.9918683 -0.9917499 0.9999288 0.9918682 -0.9917499 0.9999288 0.9918681 -0.9917499 0.9999288 0.9918681 -0.99175 0.9999288 0.991868 -0.9917502 0.9999288 0.991868 -0.9917504 0.9999288 0.991868 -0.9917507 0.9999288 0.991868 -0.991751 0.9999288 0.991868 -0.9917515 0.9999288 0.991868 -0.9917521 0.9999288 0.991868 -0.9917528 0.9999288 0.991868 -0.9917537 0.9999288 0.991868 -0.9917549 0.9999288 0.991868 -0.9917564 0.9999288 0.991868 -0.9917582 0.9999288 0.991868 -0.9917606 0.9999288 0.991868 -0.9917636 0.9999288 0.991868 -0.9917674 0.9999288 0.991868 -0.9917722 0.9999288 0.991868 -0.9917782 0.9999288 0.991868 -0.9917859 0.9999288 0.991868 -0.9917956 0.9999288 0.991868 -0.9918079 0.9999288 0.991868 -0.9918234 0.9999288 0.991868 -0.9918431 0.9999288 0.991868 -0.991868 0.9999288 0.991868 -0.9918994 0.9999288 0.991868 -0.9919392 0.9999288 0.991868 -0.9919896 0.9999288 0.991868 -0.9920533 0.9999288 0.991868 -0.9921339 0.9999288 0.991868 -0.9922358 0.9999288 0.991868 -0.9923648 0.9999288 0.991868 -0.992528 0.9999288 0.991868 -0.9927345 0.9999288 0.991868 -0.9929957 0.9999288 0.991868 -0.9933261 0.9999288 0.991868 -0.9937442 0.9999288 0.991868 -0.9942731 0.9999288 0.991868 -0.9949422 0.9999288 0.991868 -0.9957887 0.9999288 0.991868 -0.9968597 0.9999288 0.991868 -0.9982146 0.9999288 0.991868 -0.9999288 0.9999288 0.991868 -0.9999437 0.9985868 0.9935432 -0.9934695 0.9999437 0.9935437 -0.9934695 0.9999437 0.9935437 -0.9934695 0.9999437 0.9935437 -0.9934695 0.9999437 0.9935437 -0.9934695 0.9999437 0.9935437 -0.9934695 0.9999437 0.9935437 -0.9934695 0.9999437 0.9935436 -0.9934694 0.9999437 0.9935436 -0.9934694 0.9999437 0.9935436 -0.9934694 0.9999437 0.9935436 -0.9934694 0.9999437 0.9935435 -0.9934694 0.9999437 0.9935435 -0.9934694 0.9999437 0.9935434 -0.9934694 0.9999437 0.9935434 -0.9934694 0.9999437 0.9935433 -0.9934694 0.9999437 0.9935432 -0.9934695 0.9999437 0.9935432 -0.9934697 0.9999437 0.9935432 -0.9934698 0.9999437 0.9935432 -0.9934701 0.9999437 0.9935432 -0.9934704 0.9999437 0.9935432 -0.9934707 0.9999437 0.9935432 -0.9934712 0.9999437 0.9935432 -0.9934718 0.9999437 0.9935432 -0.9934725 0.9999437 0.9935432 -0.9934734 0.9999437 0.9935432 -0.9934746 0.9999437 0.9935432 -0.9934761 0.9999437 0.9935432 -0.9934779 0.9999437 0.9935432 -0.9934803 0.9999437 0.9935432 -0.9934833 0.9999437 0.9935432 -0.9934871 0.9999437 0.9935432 -0.9934919 0.9999437 0.9935432 -0.993498 0.9999437 0.9935432 -0.9935057 0.9999437 0.9935432 -0.9935154 0.9999437 0.9935432 -0.9935277 0.9999437 0.9935432 -0.9935432 0.9999437 0.9935432 -0.9935629 0.9999437 0.9935432 -0.9935878 0.9999437 0.9935432 -0.9936193 0.9999437 0.9935432 -0.9936592 0.9999437 0.9935432 -0.9937096 0.9999437 0.9935432 -0.9937734 0.9999437 0.9935432 -0.9938541 0.9999437 0.9935432 -0.9939562 0.9999437 0.9935432 -0.9940854 0.9999437 0.9935432 -0.9942488 0.9999437 0.9935432 -0.9944556 0.9999437 0.9935432 -0.9947172 0.9999437 0.9935432 -0.9950481 0.9999437 0.9935432 -0.9954668 0.9999437 0.9935432 -0.9959964 0.9999437 0.9935432 -0.9966665 0.9999437 0.9935432 -0.9975143 0.9999437 0.9935432 -0.9985868 0.9999437 0.9935432 -0.9999437 0.9999437 0.9935432 -0.6724572 0.6724572 0.9959813 -0.6724685 0.6724572 0.9959813 -0.6724827 0.6724572 0.9959813 -0.6725008 0.6724572 0.9959813 -0.6725236 0.6724572 0.9959813 -0.6725525 0.6724572 0.9959813 -0.6725891 0.6724572 0.9959813 -0.6726353 0.6724572 0.9959813 -0.6726938 0.6724572 0.9959813 -0.6727678 0.6724572 0.9959813 -0.6728615 0.6724572 0.9959813 -0.67298 0.6724572 0.9959813 -0.6731299 0.6724572 0.9959813 -0.6733195 0.6724572 0.9959813 -0.6735594 0.6724572 0.9959813 -0.6738629 0.6724572 0.9959813 -0.6742469 0.6724572 0.9959813 -0.6747327 0.6724572 0.9959813 -0.6753473 0.6724572 0.9959813 -0.6761248 0.6724572 0.9959813 -0.6771085 0.6724572 0.9959813 -0.678353 0.6724572 0.9959813 -0.6799274 0.6724572 0.9959813 -0.6819193 0.6724572 0.9959813 -0.6844392 0.6724572 0.9959813 -0.6876273 0.6724572 0.9959813 -0.6916607 0.6724572 0.9959813 -0.6967634 0.6724572 0.9959813 -0.703219 0.6724572 0.9959813 -0.7113861 0.6724572 0.9959813 -0.7217186 0.6724572 0.9959813 -0.7347906 0.6724572 0.9959813 -0.7513284 0.6724572 0.9959813 -0.7722508 0.6724572 0.9959813 -0.7987204 0.6724572 0.9959813 -0.8322078 0.6724572 0.9959813 -0.8745738 0.6724572 0.9959813 -0.9281722 0.6724572 0.9959813 -0.9959813 0.6724572 0.9959813 -0.9968475 0.7251659 0.939906 -0.997523 0.7716588 0.9127681 -0.9980513 0.8119154 0.9038323 -0.9984653 0.8462171 0.9056431 -0.9987905 0.8750477 0.9132249 -0.9990461 0.8990028 0.9233996 -0.9992474 0.9187175 0.9342401 -0.999406 0.9348153 0.9446563 -0.999531 0.9478754 0.9540963 -0.9996296 0.958416 0.9623392 -0.9997074 0.9668873 0.9693568 -0.9997689 0.9736726 0.9752247 -0.9998174 0.9790927 0.980067 -0.9998557 0.9834129 0.9840239 -0.999886 0.9868505 0.9872334 -0.9999099 0.989582 0.9898218 -0.9999288 0.9917501 0.9919002 -0.9999437 0.9934695 0.9935634 -0.6724572 0.6724685 0.9959813 -0.6724495 0.6724495 0.9959811 -0.6724637 0.6724495 0.9959811 -0.6724818 0.6724495 0.9959811 -0.6725046 0.6724495 0.9959811 -0.6725335 0.6724495 0.9959811 -0.6725701 0.6724495 0.9959811 -0.6726163 0.6724495 0.9959811 -0.6726748 0.6724495 0.9959811 -0.6727489 0.6724495 0.9959811 -0.6728425 0.6724495 0.9959811 -0.672961 0.6724495 0.9959811 -0.6731109 0.6724495 0.9959811 -0.6733005 0.6724495 0.9959811 -0.6735405 0.6724495 0.9959811 -0.673844 0.6724495 0.9959811 -0.674228 0.6724495 0.9959811 -0.6747138 0.6724495 0.9959811 -0.6753284 0.6724495 0.9959811 -0.676106 0.6724495 0.9959811 -0.6770898 0.6724495 0.9959811 -0.6783343 0.6724495 0.9959811 -0.6799088 0.6724495 0.9959811 -0.6819008 0.6724495 0.9959811 -0.6844209 0.6724495 0.9959811 -0.6876092 0.6724495 0.9959811 -0.6916428 0.6724495 0.9959811 -0.6967458 0.6724495 0.9959811 -0.7032018 0.6724495 0.9959811 -0.7113694 0.6724495 0.9959811 -0.7217025 0.6724495 0.9959811 -0.7347753 0.6724495 0.9959811 -0.751314 0.6724495 0.9959811 -0.7722376 0.6724495 0.9959811 -0.7987087 0.6724495 0.9959811 -0.8321981 0.6724495 0.9959811 -0.8745666 0.6724495 0.9959811 -0.9281681 0.6724495 0.9959811 -0.9959811 0.6724495 0.9959811 -0.9968474 0.7251605 0.9399032 -0.997523 0.7716551 0.9127648 -0.9980512 0.8119128 0.9038294 -0.9984653 0.8462154 0.9056408 -0.9987905 0.8750466 0.9132232 -0.9990461 0.899002 0.9233984 -0.9992474 0.918717 0.9342393 -0.999406 0.9348149 0.9446557 -0.999531 0.9478752 0.9540959 -0.9996296 0.9584159 0.9623389 -0.9997074 0.9668872 0.9693566 -0.9997689 0.9736726 0.9752246 -0.9998174 0.9790927 0.9800669 -0.9998557 0.9834129 0.9840239 -0.999886 0.9868505 0.9872333 -0.9999099 0.989582 0.9898218 -0.9999288 0.9917501 0.9919002 -0.9999437 0.9934695 0.9935634 -0.6724572 0.6724827 0.9959813 -0.6724495 0.6724637 0.9959811 -0.6724399 0.6724399 0.9959809 -0.6724579 0.6724399 0.9959809 -0.6724808 0.6724399 0.9959809 -0.6725097 0.6724399 0.9959809 -0.6725462 0.6724399 0.9959809 -0.6725925 0.6724399 0.9959809 -0.672651 0.6724399 0.9959809 -0.672725 0.6724399 0.9959809 -0.6728187 0.6724399 0.9959809 -0.6729372 0.6724399 0.9959809 -0.6730871 0.6724399 0.9959809 -0.6732768 0.6724399 0.9959809 -0.6735167 0.6724399 0.9959809 -0.6738202 0.6724399 0.9959809 -0.6742043 0.6724399 0.9959809 -0.6746901 0.6724399 0.9959809 -0.6753048 0.6724399 0.9959809 -0.6760824 0.6724399 0.9959809 -0.6770662 0.6724399 0.9959809 -0.6783109 0.6724399 0.9959809 -0.6798855 0.6724399 0.9959809 -0.6818777 0.6724399 0.9959809 -0.684398 0.6724399 0.9959809 -0.6875865 0.6724399 0.9959809 -0.6916203 0.6724399 0.9959809 -0.6967237 0.6724399 0.9959809 -0.7031802 0.6724399 0.9959809 -0.7113484 0.6724399 0.9959809 -0.7216823 0.6724399 0.9959809 -0.734756 0.6724399 0.9959809 -0.7512959 0.6724399 0.9959809 -0.772221 0.6724399 0.9959809 -0.7986941 0.6724399 0.9959809 -0.8321859 0.6724399 0.9959809 -0.8745575 0.6724399 0.9959809 -0.928163 0.6724399 0.9959809 -0.9959809 0.6724399 0.9959809 -0.9968473 0.7251537 0.9398997 -0.9975229 0.7716504 0.9127607 -0.9980512 0.8119096 0.9038257 -0.9984653 0.8462132 0.9056379 -0.9987904 0.8750451 0.9132211 -0.9990461 0.8990011 0.9233969 -0.9992474 0.9187164 0.9342383 -0.999406 0.9348146 0.944655 -0.999531 0.947875 0.9540954 -0.9996296 0.9584157 0.9623386 -0.9997074 0.9668871 0.9693564 -0.9997689 0.9736725 0.9752244 -0.9998174 0.9790927 0.9800668 -0.9998557 0.9834129 0.9840238 -0.999886 0.9868505 0.9872333 -0.9999099 0.989582 0.9898217 -0.9999288 0.9917501 0.9919002 -0.9999437 0.9934695 0.9935634 -0.6724572 0.6725008 0.9959813 -0.6724495 0.6724818 0.9959811 -0.6724399 0.6724579 0.9959809 -0.672428 0.672428 0.9959807 -0.6724509 0.672428 0.9959807 -0.6724798 0.672428 0.9959807 -0.6725163 0.672428 0.9959807 -0.6725626 0.672428 0.9959807 -0.6726211 0.672428 0.9959807 -0.6726952 0.672428 0.9959807 -0.6727888 0.672428 0.9959807 -0.6729073 0.672428 0.9959807 -0.6730573 0.672428 0.9959807 -0.6732469 0.672428 0.9959807 -0.6734869 0.672428 0.9959807 -0.6737905 0.672428 0.9959807 -0.6741745 0.672428 0.9959807 -0.6746604 0.672428 0.9959807 -0.6752752 0.672428 0.9959807 -0.6760529 0.672428 0.9959807 -0.6770368 0.672428 0.9959807 -0.6782815 0.672428 0.9959807 -0.6798563 0.672428 0.9959807 -0.6818486 0.672428 0.9959807 -0.6843692 0.672428 0.9959807 -0.687558 0.672428 0.9959807 -0.6915922 0.672428 0.9959807 -0.6966961 0.672428 0.9959807 -0.7031531 0.672428 0.9959807 -0.7113221 0.672428 0.9959807 -0.7216569 0.672428 0.9959807 -0.7347318 0.672428 0.9959807 -0.7512732 0.672428 0.9959807 -0.7722003 0.672428 0.9959807 -0.7986758 0.672428 0.9959807 -0.8321707 0.672428 0.9959807 -0.8745461 0.672428 0.9959807 -0.9281566 0.672428 0.9959807 -0.9959807 0.672428 0.9959807 -0.9968472 0.7251454 0.9398953 -0.9975228 0.7716446 0.9127555 -0.9980511 0.8119057 0.9038211 -0.9984653 0.8462106 0.9056342 -0.9987904 0.8750434 0.9132184 -0.9990461 0.899 0.923395 -0.9992474 0.9187157 0.934237 -0.999406 0.9348141 0.9446542 -0.999531 0.9478746 0.9540949 -0.9996296 0.9584155 0.9623382 -0.9997074 0.966887 0.9693562 -0.9997689 0.9736724 0.9752243 -0.9998174 0.9790926 0.9800667 -0.9998557 0.9834129 0.9840238 -0.999886 0.9868505 0.9872333 -0.9999099 0.989582 0.9898217 -0.9999288 0.9917501 0.9919001 -0.9999437 0.9934695 0.9935634 -0.6724572 0.6725236 0.9959813 -0.6724495 0.6725046 0.9959811 -0.6724399 0.6724808 0.9959809 -0.672428 0.6724509 0.9959807 -0.6724135 0.6724135 0.9959804 -0.6724424 0.6724135 0.9959804 -0.672479 0.6724135 0.9959804 -0.6725253 0.6724135 0.9959804 -0.6725838 0.6724135 0.9959804 -0.6726578 0.6724135 0.9959804 -0.6727515 0.6724135 0.9959804 -0.67287 0.6724135 0.9959804 -0.67302 0.6724135 0.9959804 -0.6732097 0.6724135 0.9959804 -0.6734497 0.6724135 0.9959804 -0.6737533 0.6724135 0.9959804 -0.6741374 0.6724135 0.9959804 -0.6746233 0.6724135 0.9959804 -0.6752381 0.6724135 0.9959804 -0.6760159 0.6724135 0.9959804 -0.677 0.6724135 0.9959804 -0.6782449 0.6724135 0.9959804 -0.6798198 0.6724135 0.9959804 -0.6818124 0.6724135 0.9959804 -0.6843332 0.6724135 0.9959804 -0.6875223 0.6724135 0.9959804 -0.6915571 0.6724135 0.9959804 -0.6966615 0.6724135 0.9959804 -0.7031193 0.6724135 0.9959804 -0.7112892 0.6724135 0.9959804 -0.7216252 0.6724135 0.9959804 -0.7347016 0.6724135 0.9959804 -0.7512449 0.6724135 0.9959804 -0.7721744 0.6724135 0.9959804 -0.7986529 0.6724135 0.9959804 -0.8321516 0.6724135 0.9959804 -0.8745319 0.6724135 0.9959804 -0.9281485 0.6724135 0.9959804 -0.9959804 0.6724135 0.9959804 -0.996847 0.7251351 0.9398899 -0.9975227 0.7716375 0.912749 -0.9980511 0.8119009 0.9038153 -0.9984652 0.8462073 0.9056297 -0.9987904 0.8750412 0.913215 -0.9990461 0.8989986 0.9233927 -0.9992474 0.9187148 0.9342353 -0.999406 0.9348135 0.9446531 -0.999531 0.9478743 0.9540941 -0.9996296 0.9584153 0.9623378 -0.9997074 0.9668869 0.9693559 -0.9997689 0.9736723 0.9752241 -0.9998174 0.9790925 0.9800666 -0.9998557 0.9834128 0.9840237 -0.999886 0.9868504 0.9872332 -0.9999099 0.989582 0.9898217 -0.9999288 0.9917501 0.9919001 -0.9999437 0.9934695 0.9935634 -0.6724572 0.6725525 0.9959813 -0.6724495 0.6725335 0.9959811 -0.6724399 0.6725097 0.9959809 -0.672428 0.6724798 0.9959807 -0.6724135 0.6724424 0.9959804 -0.6723959 0.6723959 0.9959801 -0.6724325 0.6723959 0.9959801 -0.6724787 0.6723959 0.9959801 -0.6725373 0.6723959 0.9959801 -0.6726113 0.6723959 0.9959801 -0.672705 0.6723959 0.9959801 -0.6728236 0.6723959 0.9959801 -0.6729735 0.6723959 0.9959801 -0.6731633 0.6723959 0.9959801 -0.6734033 0.6723959 0.9959801 -0.6737069 0.6723959 0.9959801 -0.6740911 0.6723959 0.9959801 -0.6745771 0.6723959 0.9959801 -0.675192 0.6723959 0.9959801 -0.6759699 0.6723959 0.9959801 -0.6769541 0.6723959 0.9959801 -0.6781992 0.6723959 0.9959801 -0.6797744 0.6723959 0.9959801 -0.6817672 0.6723959 0.9959801 -0.6842884 0.6723959 0.9959801 -0.687478 0.6723959 0.9959801 -0.6915133 0.6723959 0.9959801 -0.6966184 0.6723959 0.9959801 -0.7030771 0.6723959 0.9959801 -0.7112482 0.6723959 0.9959801 -0.7215857 0.6723959 0.9959801 -0.7346639 0.6723959 0.9959801 -0.7512096 0.6723959 0.9959801 -0.7721421 0.6723959 0.9959801 -0.7986244 0.6723959 0.9959801 -0.8321279 0.6723959 0.9959801 -0.8745143 0.6723959 0.9959801 -0.9281385 0.6723959 0.9959801 -0.9959801 0.6723959 0.9959801 -0.9968468 0.7251226 0.9398831 -0.9975226 0.7716288 0.912741 -0.998051 0.8118949 0.9038082 -0.9984652 0.8462034 0.905624 -0.9987904 0.8750386 0.9132109 -0.9990461 0.8989969 0.9233897 -0.9992474 0.9187137 0.9342333 -0.9994059 0.9348128 0.9446517 -0.999531 0.9478738 0.9540933 -0.9996296 0.958415 0.9623372 -0.9997074 0.9668867 0.9693555 -0.9997689 0.9736722 0.9752238 -0.9998174 0.9790925 0.9800665 -0.9998557 0.9834128 0.9840236 -0.999886 0.9868504 0.9872332 -0.9999099 0.9895819 0.9898216 -0.9999288 0.9917501 0.9919001 -0.9999437 0.9934695 0.9935633 -0.6724572 0.6725891 0.9959813 -0.6724495 0.6725701 0.9959811 -0.6724399 0.6725462 0.9959809 -0.672428 0.6725163 0.9959807 -0.6724135 0.672479 0.9959804 -0.6723959 0.6724325 0.9959801 -0.6723748 0.6723748 0.9959797 -0.6724211 0.6723748 0.9959797 -0.6724796 0.6723748 0.9959797 -0.6725537 0.6723748 0.9959797 -0.6726474 0.6723748 0.9959797 -0.672766 0.6723748 0.9959797 -0.672916 0.6723748 0.9959797 -0.6731057 0.6723748 0.9959797 -0.6733458 0.6723748 0.9959797 -0.6736495 0.6723748 0.9959797 -0.6740337 0.6723748 0.9959797 -0.6745198 0.6723748 0.9959797 -0.6751348 0.6723748 0.9959797 -0.6759129 0.6723748 0.9959797 -0.6768972 0.6723748 0.9959797 -0.6781425 0.6723748 0.9959797 -0.679718 0.6723748 0.9959797 -0.6817112 0.6723748 0.9959797 -0.6842328 0.6723748 0.9959797 -0.687423 0.6723748 0.9959797 -0.691459 0.6723748 0.9959797 -0.696565 0.6723748 0.9959797 -0.7030249 0.6723748 0.9959797 -0.7111974 0.6723748 0.9959797 -0.7215367 0.6723748 0.9959797 -0.7346173 0.6723748 0.9959797 -0.7511659 0.6723748 0.9959797 -0.7721021 0.6723748 0.9959797 -0.798589 0.6723748 0.9959797 -0.8320985 0.6723748 0.9959797 -0.8744923 0.6723748 0.9959797 -0.928126 0.6723748 0.9959797 -0.9959797 0.6723748 0.9959797 -0.9968465 0.7251076 0.9398746 -0.9975224 0.7716184 0.912731 -0.9980509 0.8118878 0.9037992 -0.9984651 0.8461986 0.905617 -0.9987903 0.8750355 0.9132057 -0.9990461 0.8989948 0.9233861 -0.9992473 0.9187123 0.9342308 -0.9994059 0.9348119 0.94465 -0.999531 0.9478733 0.9540921 -0.9996296 0.9584146 0.9623365 -0.9997074 0.9668865 0.969355 -0.9997689 0.9736721 0.9752236 -0.9998174 0.9790924 0.9800663 -0.9998557 0.9834127 0.9840235 -0.999886 0.9868504 0.9872331 -0.9999099 0.9895819 0.9898216 -0.9999288 0.99175 0.9919001 -0.9999437 0.9934695 0.9935633 -0.6724572 0.6726353 0.9959813 -0.6724495 0.6726163 0.9959811 -0.6724399 0.6725925 0.9959809 -0.672428 0.6725626 0.9959807 -0.6724135 0.6725253 0.9959804 -0.6723959 0.6724787 0.9959801 -0.6723748 0.6724211 0.9959797 -0.67235 0.67235 0.9959791 -0.6724086 0.67235 0.9959791 -0.6724827 0.67235 0.9959791 -0.6725764 0.67235 0.9959791 -0.672695 0.67235 0.9959791 -0.672845 0.67235 0.9959791 -0.6730348 0.67235 0.9959791 -0.6732749 0.67235 0.9959791 -0.6735787 0.67235 0.9959791 -0.673963 0.67235 0.9959791 -0.6744492 0.67235 0.9959791 -0.6750644 0.67235 0.9959791 -0.6758426 0.67235 0.9959791 -0.6768271 0.67235 0.9959791 -0.6780727 0.67235 0.9959791 -0.6796485 0.67235 0.9959791 -0.6816421 0.67235 0.9959791 -0.6841643 0.67235 0.9959791 -0.6873552 0.67235 0.9959791 -0.691392 0.67235 0.9959791 -0.6964992 0.67235 0.9959791 -0.7029605 0.67235 0.9959791 -0.7111348 0.67235 0.9959791 -0.7214763 0.67235 0.9959791 -0.7345598 0.67235 0.9959791 -0.751112 0.67235 0.9959791 -0.7720527 0.67235 0.9959791 -0.7985455 0.67235 0.9959791 -0.8320622 0.67235 0.9959791 -0.8744653 0.67235 0.9959791 -0.9281107 0.67235 0.9959791 -0.9959791 0.67235 0.9959791 -0.9968462 0.7250899 0.9398642 -0.9975222 0.7716061 0.9127186 -0.9980508 0.8118794 0.9037883 -0.998465 0.8461929 0.9056083 -0.9987903 0.8750317 0.9131993 -0.999046 0.8989923 0.9233816 -0.9992473 0.9187107 0.9342277 -0.9994059 0.9348109 0.944648 -0.999531 0.9478726 0.9540908 -0.9996296 0.9584142 0.9623356 -0.9997074 0.9668862 0.9693545 -0.9997689 0.9736719 0.9752232 -0.9998174 0.9790923 0.980066 -0.9998557 0.9834127 0.9840233 -0.999886 0.9868503 0.987233 -0.9999099 0.9895819 0.9898215 -0.9999288 0.99175 0.9919 -0.9999437 0.9934694 0.9935633 -0.6724572 0.6726938 0.9959813 -0.6724495 0.6726748 0.9959811 -0.6724399 0.672651 0.9959809 -0.672428 0.6726211 0.9959807 -0.6724135 0.6725838 0.9959804 -0.6723959 0.6725373 0.9959801 -0.6723748 0.6724796 0.9959797 -0.67235 0.6724086 0.9959791 -0.6723217 0.6723217 0.9959785 -0.6723958 0.6723217 0.9959785 -0.6724896 0.6723217 0.9959785 -0.6726082 0.6723217 0.9959785 -0.6727582 0.6723217 0.9959785 -0.6729481 0.6723217 0.9959785 -0.6731883 0.6723217 0.9959785 -0.6734921 0.6723217 0.9959785 -0.6738765 0.6723217 0.9959785 -0.6743629 0.6723217 0.9959785 -0.6749782 0.6723217 0.9959785 -0.6757566 0.6723217 0.9959785 -0.6767414 0.6723217 0.9959785 -0.6779873 0.6723217 0.9959785 -0.6795635 0.6723217 0.9959785 -0.6815577 0.6723217 0.9959785 -0.6840805 0.6723217 0.9959785 -0.6872723 0.6723217 0.9959785 -0.6913102 0.6723217 0.9959785 -0.6964188 0.6723217 0.9959785 -0.7028817 0.6723217 0.9959785 -0.7110582 0.6723217 0.9959785 -0.7214025 0.6723217 0.9959785 -0.7344894 0.6723217 0.9959785 -0.7510461 0.6723217 0.9959785 -0.7719924 0.6723217 0.9959785 -0.7984922 0.6723217 0.9959785 -0.8320179 0.6723217 0.9959785 -0.8744323 0.6723217 0.9959785 -0.928092 0.6723217 0.9959785 -0.9959785 0.6723217 0.9959785 -0.9968458 0.7250697 0.9398515 -0.997522 0.7715919 0.9127036 -0.9980506 0.8118697 0.9037748 -0.9984649 0.8461864 0.9055977 -0.9987902 0.8750274 0.9131915 -0.999046 0.8989895 0.923376 -0.9992473 0.9187089 0.934224 -0.9994059 0.9348097 0.9446454 -0.999531 0.9478718 0.9540891 -0.9996296 0.9584137 0.9623345 -0.9997074 0.9668859 0.9693538 -0.9997689 0.9736717 0.9752227 -0.9998174 0.9790921 0.9800658 -0.9998557 0.9834126 0.9840231 -0.999886 0.9868503 0.9872329 -0.9999099 0.9895819 0.9898215 -0.9999288 0.99175 0.9919 -0.9999437 0.9934694 0.9935633 -0.6724572 0.6727678 0.9959813 -0.6724495 0.6727489 0.9959811 -0.6724399 0.672725 0.9959809 -0.672428 0.6726952 0.9959807 -0.6724135 0.6726578 0.9959804 -0.6723959 0.6726113 0.9959801 -0.6723748 0.6725537 0.9959797 -0.67235 0.6724827 0.9959791 -0.6723217 0.6723958 0.9959785 -0.6722907 0.6722907 0.9959777 -0.6723845 0.6722907 0.9959777 -0.6725032 0.6722907 0.9959777 -0.6726533 0.6722907 0.9959777 -0.6728432 0.6722907 0.9959777 -0.6730835 0.6722907 0.9959777 -0.6733874 0.6722907 0.9959777 -0.673772 0.6722907 0.9959777 -0.6742585 0.6722907 0.9959777 -0.6748739 0.6722907 0.9959777 -0.6756526 0.6722907 0.9959777 -0.6766377 0.6722907 0.9959777 -0.6778841 0.6722907 0.9959777 -0.6794608 0.6722907 0.9959777 -0.6814556 0.6722907 0.9959777 -0.6839792 0.6722907 0.9959777 -0.687172 0.6722907 0.9959777 -0.6912113 0.6722907 0.9959777 -0.6963214 0.6722907 0.9959777 -0.7027865 0.6722907 0.9959777 -0.7109656 0.6722907 0.9959777 -0.7213133 0.6722907 0.9959777 -0.7344044 0.6722907 0.9959777 -0.7509664 0.6722907 0.9959777 -0.7719194 0.6722907 0.9959777 -0.7984278 0.6722907 0.9959777 -0.8319643 0.6722907 0.9959777 -0.8743923 0.6722907 0.9959777 -0.9280693 0.6722907 0.9959777 -0.9959777 0.6722907 0.9959777 -0.9968453 0.7250473 0.9398361 -0.9975217 0.7715762 0.9126854 -0.9980504 0.8118589 0.9037586 -0.9984648 0.8461791 0.9055849 -0.9987902 0.8750225 0.913182 -0.9990459 0.8989863 0.9233694 -0.9992473 0.9187068 0.9342194 -0.9994059 0.9348083 0.9446424 -0.9995309 0.947871 0.9540871 -0.9996296 0.9584132 0.9623332 -0.9997074 0.9668855 0.9693529 -0.9997689 0.9736715 0.9752222 -0.9998174 0.979092 0.9800654 -0.9998557 0.9834125 0.9840229 -0.999886 0.9868502 0.9872327 -0.9999099 0.9895818 0.9898214 -0.9999288 0.99175 0.9918999 -0.9999437 0.9934694 0.9935632 -0.6724572 0.6728615 0.9959813 -0.6724495 0.6728425 0.9959811 -0.6724399 0.6728187 0.9959809 -0.672428 0.6727888 0.9959807 -0.6724135 0.6727515 0.9959804 -0.6723959 0.672705 0.9959801 -0.6723748 0.6726474 0.9959797 -0.67235 0.6725764 0.9959791 -0.6723217 0.6724896 0.9959785 -0.6722907 0.6723845 0.9959777 -0.6722594 0.6722594 0.9959768 -0.6723781 0.6722594 0.9959768 -0.6725283 0.6722594 0.9959768 -0.6727182 0.6722594 0.9959768 -0.6729586 0.6722594 0.9959768 -0.6732627 0.6722594 0.9959768 -0.6736474 0.6722594 0.9959768 -0.674134 0.6722594 0.9959768 -0.6747498 0.6722594 0.9959768 -0.6755287 0.6722594 0.9959768 -0.6765142 0.6722594 0.9959768 -0.677761 0.6722594 0.9959768 -0.6793384 0.6722594 0.9959768 -0.6813339 0.6722594 0.9959768 -0.6838586 0.6722594 0.9959768 -0.6870525 0.6722594 0.9959768 -0.6910933 0.6722594 0.9959768 -0.6962055 0.6722594 0.9959768 -0.702673 0.6722594 0.9959768 -0.7108553 0.6722594 0.9959768 -0.7212069 0.6722594 0.9959768 -0.7343031 0.6722594 0.9959768 -0.7508714 0.6722594 0.9959768 -0.7718325 0.6722594 0.9959768 -0.798351 0.6722594 0.9959768 -0.8319004 0.6722594 0.9959768 -0.8743447 0.6722594 0.9959768 -0.9280423 0.6722594 0.9959768 -0.9959768 0.6722594 0.9959768 -0.9968448 0.7250244 0.9398178 -0.9975213 0.7715599 0.9126636 -0.9980502 0.8118476 0.9037393 -0.9984647 0.8461714 0.9055697 -0.9987901 0.8750173 0.9131708 -0.9990459 0.8989829 0.9233615 -0.9992472 0.9187045 0.934214 -0.9994059 0.9348069 0.9446388 -0.9995309 0.94787 0.9540847 -0.9996296 0.9584126 0.9623316 -0.9997074 0.9668852 0.9693519 -0.9997689 0.9736712 0.9752215 -0.9998174 0.9790919 0.980065 -0.9998557 0.9834124 0.9840227 -0.999886 0.9868502 0.9872326 -0.9999099 0.9895818 0.9898213 -0.9999288 0.99175 0.9918999 -0.9999437 0.9934694 0.9935632 -0.6724572 0.67298 0.9959813 -0.6724495 0.672961 0.9959811 -0.6724399 0.6729372 0.9959809 -0.672428 0.6729073 0.9959807 -0.6724135 0.67287 0.9959804 -0.6723959 0.6728236 0.9959801 -0.6723748 0.672766 0.9959797 -0.67235 0.672695 0.9959791 -0.6723217 0.6726082 0.9959785 -0.6722907 0.6725032 0.9959777 -0.6722594 0.6723781 0.9959768 -0.6722322 0.6722322 0.9959757 -0.6723825 0.6722322 0.9959757 -0.6725725 0.6722322 0.9959757 -0.672813 0.6722322 0.9959757 -0.6731172 0.6722322 0.9959757 -0.6735021 0.6722322 0.9959757 -0.673989 0.6722322 0.9959757 -0.674605 0.6722322 0.9959757 -0.6753843 0.6722322 0.9959757 -0.6763703 0.6722322 0.9959757 -0.6776176 0.6722322 0.9959757 -0.6791956 0.6722322 0.9959757 -0.6811921 0.6722322 0.9959757 -0.6837178 0.6722322 0.9959757 -0.6869133 0.6722322 0.9959757 -0.6909559 0.6722322 0.9959757 -0.6960703 0.6722322 0.9959757 -0.7025407 0.6722322 0.9959757 -0.7107266 0.6722322 0.9959757 -0.7210829 0.6722322 0.9959757 -0.7341849 0.6722322 0.9959757 -0.7507607 0.6722322 0.9959757 -0.7717312 0.6722322 0.9959757 -0.7982615 0.6722322 0.9959757 -0.8318259 0.6722322 0.9959757 -0.8742892 0.6722322 0.9959757 -0.9280109 0.6722322 0.9959757 -0.9959757 0.6722322 0.9959757 -0.9968441 0.7250039 0.9397965 -0.9975209 0.7715449 0.9126384 -0.99805 0.811837 0.9037168 -0.9984645 0.8461641 0.9055519 -0.99879 0.8750124 0.9131577 -0.9990458 0.8989796 0.9233522 -0.9992472 0.9187024 0.9342076 -0.9994059 0.9348055 0.9446345 -0.9995309 0.9478691 0.9540819 -0.9996296 0.958412 0.9623298 -0.9997074 0.9668848 0.9693507 -0.9997689 0.973671 0.9752208 -0.9998174 0.9790917 0.9800645 -0.9998557 0.9834123 0.9840223 -0.999886 0.9868501 0.9872324 -0.9999099 0.9895818 0.9898212 -0.9999288 0.9917499 0.9918998 -0.9999437 0.9934694 0.9935631 -0.6724572 0.6731299 0.9959813 -0.6724495 0.6731109 0.9959811 -0.6724399 0.6730871 0.9959809 -0.672428 0.6730573 0.9959807 -0.6724135 0.67302 0.9959804 -0.6723959 0.6729735 0.9959801 -0.6723748 0.672916 0.9959797 -0.67235 0.672845 0.9959791 -0.6723217 0.6727582 0.9959785 -0.6722907 0.6726533 0.9959777 -0.6722594 0.6725283 0.9959768 -0.6722322 0.6723825 0.9959757 -0.672218 0.672218 0.9959745 -0.6724081 0.672218 0.9959745 -0.6726487 0.672218 0.9959745 -0.6729531 0.672218 0.9959745 -0.6733381 0.672218 0.9959745 -0.6738253 0.672218 0.9959745 -0.6744416 0.672218 0.9959745 -0.6752213 0.672218 0.9959745 -0.6762077 0.672218 0.9959745 -0.6774557 0.672218 0.9959745 -0.6790346 0.672218 0.9959745 -0.681032 0.672218 0.9959745 -0.683559 0.672218 0.9959745 -0.6867561 0.672218 0.9959745 -0.6908007 0.672218 0.9959745 -0.6959177 0.672218 0.9959745 -0.7023914 0.672218 0.9959745 -0.7105815 0.672218 0.9959745 -0.720943 0.672218 0.9959745 -0.7340516 0.672218 0.9959745 -0.7506357 0.672218 0.9959745 -0.7716168 0.672218 0.9959745 -0.7981605 0.672218 0.9959745 -0.8317419 0.672218 0.9959745 -0.8742266 0.672218 0.9959745 -0.9279753 0.672218 0.9959745 -0.9959745 0.672218 0.9959745 -0.9968433 0.7249916 0.9397723 -0.9975204 0.7715352 0.9126098 -0.9980497 0.8118298 0.9036913 -0.9984643 0.8461589 0.9055319 -0.9987899 0.8750088 0.9131429 -0.9990458 0.8989771 0.9233418 -0.9992472 0.9187008 0.9342005 -0.9994058 0.9348044 0.9446297 -0.9995309 0.9478684 0.9540788 -0.9996296 0.9584115 0.9623277 -0.9997074 0.9668845 0.9693494 -0.9997689 0.9736708 0.9752199 -0.9998174 0.9790916 0.980064 -0.9998557 0.9834122 0.984022 -0.999886 0.9868501 0.9872322 -0.9999099 0.9895817 0.989821 -0.9999288 0.9917499 0.9918997 -0.9999437 0.9934694 0.9935631 -0.6724572 0.6733195 0.9959813 -0.6724495 0.6733005 0.9959811 -0.6724399 0.6732768 0.9959809 -0.672428 0.6732469 0.9959807 -0.6724135 0.6732097 0.9959804 -0.6723959 0.6731633 0.9959801 -0.6723748 0.6731057 0.9959797 -0.67235 0.6730348 0.9959791 -0.6723217 0.6729481 0.9959785 -0.6722907 0.6728432 0.9959777 -0.6722594 0.6727182 0.9959768 -0.6722322 0.6725725 0.9959757 -0.672218 0.6724081 0.9959745 -0.672232 0.672232 0.9959732 -0.6724727 0.672232 0.9959732 -0.6727772 0.672232 0.9959732 -0.6731625 0.672232 0.9959732 -0.6736499 0.672232 0.9959732 -0.6742666 0.672232 0.9959732 -0.6750467 0.672232 0.9959732 -0.6760337 0.672232 0.9959732 -0.6772823 0.672232 0.9959732 -0.678862 0.672232 0.9959732 -0.6808605 0.672232 0.9959732 -0.6833889 0.672232 0.9959732 -0.6865877 0.672232 0.9959732 -0.6906345 0.672232 0.9959732 -0.6957543 0.672232 0.9959732 -0.7022315 0.672232 0.9959732 -0.710426 0.672232 0.9959732 -0.720793 0.672232 0.9959732 -0.7339088 0.672232 0.9959732 -0.7505018 0.672232 0.9959732 -0.7714942 0.672232 0.9959732 -0.7980523 0.672232 0.9959732 -0.8316518 0.672232 0.9959732 -0.8741595 0.672232 0.9959732 -0.9279373 0.672232 0.9959732 -0.9959732 0.672232 0.9959732 -0.9968425 0.7249978 0.9397465 -0.9975199 0.7715376 0.9125792 -0.9980494 0.8118303 0.9036641 -0.9984642 0.8461587 0.9055104 -0.9987897 0.8750084 0.9131271 -0.9990457 0.8989767 0.9233306 -0.9992471 0.9187004 0.9341929 -0.9994058 0.9348042 0.9446246 -0.9995309 0.9478683 0.9540754 -0.9996295 0.9584114 0.9623255 -0.9997074 0.9668844 0.969348 -0.9997689 0.9736708 0.975219 -0.9998174 0.9790916 0.9800634 -0.9998557 0.9834122 0.9840216 -0.999886 0.98685 0.9872319 -0.9999099 0.9895817 0.9898209 -0.9999288 0.9917499 0.9918996 -0.9999437 0.9934694 0.993563 -0.6724572 0.6735594 0.9959813 -0.6724495 0.6735405 0.9959811 -0.6724399 0.6735167 0.9959809 -0.672428 0.6734869 0.9959807 -0.6724135 0.6734497 0.9959804 -0.6723959 0.6734033 0.9959801 -0.6723748 0.6733458 0.9959797 -0.67235 0.6732749 0.9959791 -0.6723217 0.6731883 0.9959785 -0.6722907 0.6730835 0.9959777 -0.6722594 0.6729586 0.9959768 -0.6722322 0.672813 0.9959757 -0.672218 0.6726487 0.9959745 -0.672232 0.6724727 0.9959732 -0.6723012 0.6723012 0.9959719 -0.6726059 0.6723012 0.9959719 -0.6729913 0.6723012 0.9959719 -0.673479 0.6723012 0.9959719 -0.674096 0.6723012 0.9959719 -0.6748765 0.6723012 0.9959719 -0.675864 0.6723012 0.9959719 -0.6771133 0.6723012 0.9959719 -0.6786939 0.6723012 0.9959719 -0.6806934 0.6723012 0.9959719 -0.6832232 0.6723012 0.9959719 -0.6864236 0.6723012 0.9959719 -0.6904726 0.6723012 0.9959719 -0.695595 0.6723012 0.9959719 -0.7020756 0.6723012 0.9959719 -0.7102744 0.6723012 0.9959719 -0.720647 0.6723012 0.9959719 -0.7337696 0.6723012 0.9959719 -0.7503714 0.6723012 0.9959719 -0.7713748 0.6723012 0.9959719 -0.7979469 0.6723012 0.9959719 -0.8315641 0.6723012 0.9959719 -0.8740941 0.6723012 0.9959719 -0.9279002 0.6723012 0.9959719 -0.9959719 0.6723012 0.9959719 -0.9968418 0.7250408 0.9397214 -0.9975194 0.7715641 0.9125495 -0.9980491 0.8118466 0.9036376 -0.998464 0.8461687 0.9054895 -0.9987896 0.8750145 0.9131117 -0.9990456 0.8989805 0.9233198 -0.9992471 0.9187027 0.9341854 -0.9994058 0.9348056 0.9446196 -0.9995309 0.9478691 0.9540721 -0.9996295 0.958412 0.9623234 -0.9997074 0.9668847 0.9693466 -0.9997688 0.973671 0.9752181 -0.9998174 0.9790917 0.9800628 -0.9998557 0.9834123 0.9840213 -0.999886 0.9868501 0.9872317 -0.9999099 0.9895817 0.9898207 -0.9999288 0.9917499 0.9918995 -0.9999437 0.9934694 0.993563 -0.6724572 0.6738629 0.9959813 -0.6724495 0.673844 0.9959811 -0.6724399 0.6738202 0.9959809 -0.672428 0.6737905 0.9959807 -0.6724135 0.6737533 0.9959804 -0.6723959 0.6737069 0.9959801 -0.6723748 0.6736495 0.9959797 -0.67235 0.6735787 0.9959791 -0.6723217 0.6734921 0.9959785 -0.6722907 0.6733874 0.9959777 -0.6722594 0.6732627 0.9959768 -0.6722322 0.6731172 0.9959757 -0.672218 0.6729531 0.9959745 -0.672232 0.6727772 0.9959732 -0.6723012 0.6726059 0.9959719 -0.6724711 0.6724711 0.9959709 -0.6728567 0.6724711 0.9959709 -0.6733446 0.6724711 0.9959709 -0.6739618 0.6724711 0.9959709 -0.6747426 0.6724711 0.9959709 -0.6757305 0.6724711 0.9959709 -0.6769804 0.6724711 0.9959709 -0.6785616 0.6724711 0.9959709 -0.680562 0.6724711 0.9959709 -0.6830927 0.6724711 0.9959709 -0.6862945 0.6724711 0.9959709 -0.6903451 0.6724711 0.9959709 -0.6954697 0.6724711 0.9959709 -0.701953 0.6724711 0.9959709 -0.7101552 0.6724711 0.9959709 -0.720532 0.6724711 0.9959709 -0.7336601 0.6724711 0.9959709 -0.7502687 0.6724711 0.9959709 -0.7712809 0.6724711 0.9959709 -0.797864 0.6724711 0.9959709 -0.831495 0.6724711 0.9959709 -0.8740427 0.6724711 0.9959709 -0.927871 0.6724711 0.9959709 -0.9959709 0.6724711 0.9959709 -0.9968411 0.7251511 0.9397016 -0.9975191 0.7716352 0.912526 -0.9980488 0.8118921 0.9036168 -0.9984638 0.8461977 0.905473 -0.9987895 0.8750329 0.9130996 -0.9990456 0.8989921 0.9233112 -0.999247 0.9187101 0.9341796 -0.9994057 0.9348102 0.9446157 -0.9995309 0.947872 0.9540695 -0.9996295 0.9584138 0.9623217 -0.9997074 0.9668859 0.9693455 -0.9997688 0.9736717 0.9752174 -0.9998174 0.9790921 0.9800624 -0.9998557 0.9834126 0.984021 -0.999886 0.9868503 0.9872315 -0.9999099 0.9895819 0.9898206 -0.9999288 0.99175 0.9918994 -0.9999437 0.9934694 0.9935629 -0.6724572 0.6742469 0.9959813 -0.6724495 0.674228 0.9959811 -0.6724399 0.6742043 0.9959809 -0.672428 0.6741745 0.9959807 -0.6724135 0.6741374 0.9959804 -0.6723959 0.6740911 0.9959801 -0.6723748 0.6740337 0.9959797 -0.67235 0.673963 0.9959791 -0.6723217 0.6738765 0.9959785 -0.6722907 0.673772 0.9959777 -0.6722594 0.6736474 0.9959768 -0.6722322 0.6735021 0.9959757 -0.672218 0.6733381 0.9959745 -0.672232 0.6731625 0.9959732 -0.6723012 0.6729913 0.9959719 -0.6724711 0.6728567 0.9959709 -0.6728136 0.6728136 0.9959706 -0.6733015 0.6728136 0.9959706 -0.6739188 0.6728136 0.9959706 -0.6746998 0.6728136 0.9959706 -0.6756878 0.6728136 0.9959706 -0.6769378 0.6728136 0.9959706 -0.6785192 0.6728136 0.9959706 -0.6805199 0.6728136 0.9959706 -0.683051 0.6728136 0.9959706 -0.6862532 0.6728136 0.9959706 -0.6903044 0.6728136 0.9959706 -0.6954296 0.6728136 0.9959706 -0.7019138 0.6728136 0.9959706 -0.710117 0.6728136 0.9959706 -0.7204952 0.6728136 0.9959706 -0.733625 0.6728136 0.9959706 -0.7502359 0.6728136 0.9959706 -0.7712508 0.6728136 0.9959706 -0.7978374 0.6728136 0.9959706 -0.8314729 0.6728136 0.9959706 -0.8740262 0.6728136 0.9959706 -0.9278617 0.6728136 0.9959706 -0.9959706 0.6728136 0.9959706 -0.9968409 0.7253775 0.9396953 -0.9975189 0.7717834 0.9125186 -0.9980488 0.8119884 0.9036101 -0.9984638 0.8462598 0.9054678 -0.9987895 0.8750727 0.9130957 -0.9990455 0.8990175 0.9233085 -0.999247 0.9187262 0.9341777 -0.9994057 0.9348204 0.9446144 -0.9995308 0.9478785 0.9540687 -0.9996295 0.9584178 0.9623212 -0.9997074 0.9668884 0.9693452 -0.9997688 0.9736733 0.9752172 -0.9998174 0.9790931 0.9800622 -0.9998557 0.9834132 0.9840209 -0.999886 0.9868507 0.9872315 -0.9999099 0.9895821 0.9898206 -0.9999288 0.9917502 0.9918994 -0.9999437 0.9934695 0.9935629 -0.6724572 0.6747327 0.9959813 -0.6724495 0.6747138 0.9959811 -0.6724399 0.6746901 0.9959809 -0.672428 0.6746604 0.9959807 -0.6724135 0.6746233 0.9959804 -0.6723959 0.6745771 0.9959801 -0.6723748 0.6745198 0.9959797 -0.67235 0.6744492 0.9959791 -0.6723217 0.6743629 0.9959785 -0.6722907 0.6742585 0.9959777 -0.6722594 0.674134 0.9959768 -0.6722322 0.673989 0.9959757 -0.672218 0.6738253 0.9959745 -0.672232 0.6736499 0.9959732 -0.6723012 0.673479 0.9959719 -0.6724711 0.6733446 0.9959709 -0.6728136 0.6733015 0.9959706 -0.6733015 0.6733015 0.9959706 -0.6739188 0.6733015 0.9959706 -0.6746998 0.6733015 0.9959706 -0.6756878 0.6733015 0.9959706 -0.6769378 0.6733015 0.9959706 -0.6785192 0.6733015 0.9959706 -0.6805199 0.6733015 0.9959706 -0.683051 0.6733015 0.9959706 -0.6862532 0.6733015 0.9959706 -0.6903044 0.6733015 0.9959706 -0.6954296 0.6733015 0.9959706 -0.7019138 0.6733015 0.9959706 -0.710117 0.6733015 0.9959706 -0.7204952 0.6733015 0.9959706 -0.733625 0.6733015 0.9959706 -0.7502359 0.6733015 0.9959706 -0.7712508 0.6733015 0.9959706 -0.7978374 0.6733015 0.9959706 -0.8314729 0.6733015 0.9959706 -0.8740262 0.6733015 0.9959706 -0.9278617 0.6733015 0.9959706 -0.9959706 0.6733015 0.9959706 -0.9968409 0.7257011 0.9396953 -0.9975189 0.7719959 0.9125186 -0.9980488 0.8121268 0.9036101 -0.9984638 0.8463492 0.9054678 -0.9987895 0.8751301 0.9130957 -0.9990455 0.8990542 0.9233085 -0.999247 0.9187495 0.9341777 -0.9994057 0.9348352 0.9446144 -0.9995308 0.9478878 0.9540687 -0.9996295 0.9584237 0.9623212 -0.9997074 0.9668922 0.9693452 -0.9997688 0.9736756 0.9752172 -0.9998174 0.9790946 0.9800622 -0.9998557 0.9834141 0.9840209 -0.999886 0.9868512 0.9872315 -0.9999099 0.9895825 0.9898206 -0.9999288 0.9917504 0.9918994 -0.9999437 0.9934697 0.9935629 -0.6724572 0.6753473 0.9959813 -0.6724495 0.6753284 0.9959811 -0.6724399 0.6753048 0.9959809 -0.672428 0.6752752 0.9959807 -0.6724135 0.6752381 0.9959804 -0.6723959 0.675192 0.9959801 -0.6723748 0.6751348 0.9959797 -0.67235 0.6750644 0.9959791 -0.6723217 0.6749782 0.9959785 -0.6722907 0.6748739 0.9959777 -0.6722594 0.6747498 0.9959768 -0.6722322 0.674605 0.9959757 -0.672218 0.6744416 0.9959745 -0.672232 0.6742666 0.9959732 -0.6723012 0.674096 0.9959719 -0.6724711 0.6739618 0.9959709 -0.6728136 0.6739188 0.9959706 -0.6733015 0.6739188 0.9959706 -0.6739188 0.6739188 0.9959706 -0.6746998 0.6739188 0.9959706 -0.6756878 0.6739188 0.9959706 -0.6769378 0.6739188 0.9959706 -0.6785192 0.6739188 0.9959706 -0.6805199 0.6739188 0.9959706 -0.683051 0.6739188 0.9959706 -0.6862532 0.6739188 0.9959706 -0.6903044 0.6739188 0.9959706 -0.6954296 0.6739188 0.9959706 -0.7019138 0.6739188 0.9959706 -0.710117 0.6739188 0.9959706 -0.7204952 0.6739188 0.9959706 -0.733625 0.6739188 0.9959706 -0.7502359 0.6739188 0.9959706 -0.7712508 0.6739188 0.9959706 -0.7978374 0.6739188 0.9959706 -0.8314729 0.6739188 0.9959706 -0.8740262 0.6739188 0.9959706 -0.9278617 0.6739188 0.9959706 -0.9959706 0.6739188 0.9959706 -0.9968409 0.7261105 0.9396953 -0.9975189 0.7722648 0.9125186 -0.9980488 0.8123018 0.9036101 -0.9984638 0.8464623 0.9054678 -0.9987895 0.8752028 0.9130957 -0.9990455 0.8991006 0.9233085 -0.999247 0.9187791 0.9341777 -0.9994057 0.9348539 0.9446144 -0.9995308 0.9478997 0.9540687 -0.9996295 0.9584312 0.9623212 -0.9997074 0.9668969 0.9693452 -0.9997688 0.9736786 0.9752172 -0.9998174 0.9790965 0.9800622 -0.9998557 0.9834153 0.9840209 -0.999886 0.986852 0.9872315 -0.9999099 0.9895829 0.9898206 -0.9999288 0.9917507 0.9918994 -0.9999437 0.9934698 0.9935629 -0.6724572 0.6761248 0.9959813 -0.6724495 0.676106 0.9959811 -0.6724399 0.6760824 0.9959809 -0.672428 0.6760529 0.9959807 -0.6724135 0.6760159 0.9959804 -0.6723959 0.6759699 0.9959801 -0.6723748 0.6759129 0.9959797 -0.67235 0.6758426 0.9959791 -0.6723217 0.6757566 0.9959785 -0.6722907 0.6756526 0.9959777 -0.6722594 0.6755287 0.9959768 -0.6722322 0.6753843 0.9959757 -0.672218 0.6752213 0.9959745 -0.672232 0.6750467 0.9959732 -0.6723012 0.6748765 0.9959719 -0.6724711 0.6747426 0.9959709 -0.6728136 0.6746998 0.9959706 -0.6733015 0.6746998 0.9959706 -0.6739188 0.6746998 0.9959706 -0.6746998 0.6746998 0.9959706 -0.6756878 0.6746998 0.9959706 -0.6769378 0.6746998 0.9959706 -0.6785192 0.6746998 0.9959706 -0.6805199 0.6746998 0.9959706 -0.683051 0.6746998 0.9959706 -0.6862532 0.6746998 0.9959706 -0.6903044 0.6746998 0.9959706 -0.6954296 0.6746998 0.9959706 -0.7019138 0.6746998 0.9959706 -0.710117 0.6746998 0.9959706 -0.7204952 0.6746998 0.9959706 -0.733625 0.6746998 0.9959706 -0.7502359 0.6746998 0.9959706 -0.7712508 0.6746998 0.9959706 -0.7978374 0.6746998 0.9959706 -0.8314729 0.6746998 0.9959706 -0.8740262 0.6746998 0.9959706 -0.9278617 0.6746998 0.9959706 -0.9959706 0.6746998 0.9959706 -0.9968409 0.7266285 0.9396953 -0.9975189 0.7726049 0.9125186 -0.9980488 0.8125232 0.9036101 -0.9984638 0.8466054 0.9054678 -0.9987895 0.8752947 0.9130957 -0.9990455 0.8991593 0.9233085 -0.999247 0.9188164 0.9341777 -0.9994057 0.9348776 0.9446144 -0.9995308 0.9479146 0.9540687 -0.9996295 0.9584406 0.9623212 -0.9997074 0.9669028 0.9693452 -0.9997688 0.9736823 0.9752172 -0.9998174 0.9790988 0.9800622 -0.9998557 0.9834167 0.9840209 -0.999886 0.9868529 0.9872315 -0.9999099 0.9895835 0.9898206 -0.9999288 0.991751 0.9918994 -0.9999437 0.9934701 0.9935629 -0.6724572 0.6771085 0.9959813 -0.6724495 0.6770898 0.9959811 -0.6724399 0.6770662 0.9959809 -0.672428 0.6770368 0.9959807 -0.6724135 0.677 0.9959804 -0.6723959 0.6769541 0.9959801 -0.6723748 0.6768972 0.9959797 -0.67235 0.6768271 0.9959791 -0.6723217 0.6767414 0.9959785 -0.6722907 0.6766377 0.9959777 -0.6722594 0.6765142 0.9959768 -0.6722322 0.6763703 0.9959757 -0.672218 0.6762077 0.9959745 -0.672232 0.6760337 0.9959732 -0.6723012 0.675864 0.9959719 -0.6724711 0.6757305 0.9959709 -0.6728136 0.6756878 0.9959706 -0.6733015 0.6756878 0.9959706 -0.6739188 0.6756878 0.9959706 -0.6746998 0.6756878 0.9959706 -0.6756878 0.6756878 0.9959706 -0.6769378 0.6756878 0.9959706 -0.6785192 0.6756878 0.9959706 -0.6805199 0.6756878 0.9959706 -0.683051 0.6756878 0.9959706 -0.6862532 0.6756878 0.9959706 -0.6903044 0.6756878 0.9959706 -0.6954296 0.6756878 0.9959706 -0.7019138 0.6756878 0.9959706 -0.710117 0.6756878 0.9959706 -0.7204952 0.6756878 0.9959706 -0.733625 0.6756878 0.9959706 -0.7502359 0.6756878 0.9959706 -0.7712508 0.6756878 0.9959706 -0.7978374 0.6756878 0.9959706 -0.8314729 0.6756878 0.9959706 -0.8740262 0.6756878 0.9959706 -0.9278617 0.6756878 0.9959706 -0.9959706 0.6756878 0.9959706 -0.9968409 0.7272837 0.9396953 -0.9975189 0.7730352 0.9125186 -0.9980488 0.8128033 0.9036101 -0.9984638 0.8467864 0.9054678 -0.9987895 0.8754109 0.9130957 -0.9990455 0.8992336 0.9233085 -0.999247 0.9188636 0.9341777 -0.9994057 0.9349075 0.9446144 -0.9995308 0.9479335 0.9540687 -0.9996295 0.9584526 0.9623212 -0.9997074 0.9669103 0.9693452 -0.9997688 0.973687 0.9752172 -0.9998174 0.9791018 0.9800622 -0.9998557 0.9834186 0.9840209 -0.999886 0.9868541 0.9872315 -0.9999099 0.9895842 0.9898206 -0.9999288 0.9917515 0.9918994 -0.9999437 0.9934704 0.9935629 -0.6724572 0.678353 0.9959813 -0.6724495 0.6783343 0.9959811 -0.6724399 0.6783109 0.9959809 -0.672428 0.6782815 0.9959807 -0.6724135 0.6782449 0.9959804 -0.6723959 0.6781992 0.9959801 -0.6723748 0.6781425 0.9959797 -0.67235 0.6780727 0.9959791 -0.6723217 0.6779873 0.9959785 -0.6722907 0.6778841 0.9959777 -0.6722594 0.677761 0.9959768 -0.6722322 0.6776176 0.9959757 -0.672218 0.6774557 0.9959745 -0.672232 0.6772823 0.9959732 -0.6723012 0.6771133 0.9959719 -0.6724711 0.6769804 0.9959709 -0.6728136 0.6769378 0.9959706 -0.6733015 0.6769378 0.9959706 -0.6739188 0.6769378 0.9959706 -0.6746998 0.6769378 0.9959706 -0.6756878 0.6769378 0.9959706 -0.6769378 0.6769378 0.9959706 -0.6785192 0.6769378 0.9959706 -0.6805199 0.6769378 0.9959706 -0.683051 0.6769378 0.9959706 -0.6862532 0.6769378 0.9959706 -0.6903044 0.6769378 0.9959706 -0.6954296 0.6769378 0.9959706 -0.7019138 0.6769378 0.9959706 -0.710117 0.6769378 0.9959706 -0.7204952 0.6769378 0.9959706 -0.733625 0.6769378 0.9959706 -0.7502359 0.6769378 0.9959706 -0.7712508 0.6769378 0.9959706 -0.7978374 0.6769378 0.9959706 -0.8314729 0.6769378 0.9959706 -0.8740262 0.6769378 0.9959706 -0.9278617 0.6769378 0.9959706 -0.9959706 0.6769378 0.9959706 -0.9968409 0.7281127 0.9396953 -0.9975189 0.7735795 0.9125186 -0.9980488 0.8131577 0.9036101 -0.9984638 0.8470154 0.9054678 -0.9987895 0.875558 0.9130957 -0.9990455 0.8993275 0.9233085 -0.999247 0.9189234 0.9341777 -0.9994057 0.9349454 0.9446144 -0.9995308 0.9479575 0.9540687 -0.9996295 0.9584677 0.9623212 -0.9997074 0.9669198 0.9693452 -0.9997688 0.973693 0.9752172 -0.9998174 0.9791055 0.9800622 -0.9998557 0.9834209 0.9840209 -0.999886 0.9868555 0.9872315 -0.9999099 0.9895851 0.9898206 -0.9999288 0.9917521 0.9918994 -0.9999437 0.9934707 0.9935629 -0.6724572 0.6799274 0.9959813 -0.6724495 0.6799088 0.9959811 -0.6724399 0.6798855 0.9959809 -0.672428 0.6798563 0.9959807 -0.6724135 0.6798198 0.9959804 -0.6723959 0.6797744 0.9959801 -0.6723748 0.679718 0.9959797 -0.67235 0.6796485 0.9959791 -0.6723217 0.6795635 0.9959785 -0.6722907 0.6794608 0.9959777 -0.6722594 0.6793384 0.9959768 -0.6722322 0.6791956 0.9959757 -0.672218 0.6790346 0.9959745 -0.672232 0.678862 0.9959732 -0.6723012 0.6786939 0.9959719 -0.6724711 0.6785616 0.9959709 -0.6728136 0.6785192 0.9959706 -0.6733015 0.6785192 0.9959706 -0.6739188 0.6785192 0.9959706 -0.6746998 0.6785192 0.9959706 -0.6756878 0.6785192 0.9959706 -0.6769378 0.6785192 0.9959706 -0.6785192 0.6785192 0.9959706 -0.6805199 0.6785192 0.9959706 -0.683051 0.6785192 0.9959706 -0.6862532 0.6785192 0.9959706 -0.6903044 0.6785192 0.9959706 -0.6954296 0.6785192 0.9959706 -0.7019138 0.6785192 0.9959706 -0.710117 0.6785192 0.9959706 -0.7204952 0.6785192 0.9959706 -0.733625 0.6785192 0.9959706 -0.7502359 0.6785192 0.9959706 -0.7712508 0.6785192 0.9959706 -0.7978374 0.6785192 0.9959706 -0.8314729 0.6785192 0.9959706 -0.8740262 0.6785192 0.9959706 -0.9278617 0.6785192 0.9959706 -0.9959706 0.6785192 0.9959706 -0.9968409 0.7291615 0.9396953 -0.9975189 0.7742682 0.9125186 -0.9980488 0.8136061 0.9036101 -0.9984638 0.8473052 0.9054678 -0.9987895 0.8757441 0.9130957 -0.9990455 0.8994464 0.9233085 -0.999247 0.918999 0.9341777 -0.9994057 0.9349933 0.9446144 -0.9995308 0.9479878 0.9540687 -0.9996295 0.9584868 0.9623212 -0.9997074 0.9669318 0.9693452 -0.9997688 0.9737006 0.9752172 -0.9998174 0.9791103 0.9800622 -0.9998557 0.9834239 0.9840209 -0.999886 0.9868574 0.9872315 -0.9999099 0.9895863 0.9898206 -0.9999288 0.9917528 0.9918994 -0.9999437 0.9934712 0.9935629 -0.6724572 0.6819193 0.9959813 -0.6724495 0.6819008 0.9959811 -0.6724399 0.6818777 0.9959809 -0.672428 0.6818486 0.9959807 -0.6724135 0.6818124 0.9959804 -0.6723959 0.6817672 0.9959801 -0.6723748 0.6817112 0.9959797 -0.67235 0.6816421 0.9959791 -0.6723217 0.6815577 0.9959785 -0.6722907 0.6814556 0.9959777 -0.6722594 0.6813339 0.9959768 -0.6722322 0.6811921 0.9959757 -0.672218 0.681032 0.9959745 -0.672232 0.6808605 0.9959732 -0.6723012 0.6806934 0.9959719 -0.6724711 0.680562 0.9959709 -0.6728136 0.6805199 0.9959706 -0.6733015 0.6805199 0.9959706 -0.6739188 0.6805199 0.9959706 -0.6746998 0.6805199 0.9959706 -0.6756878 0.6805199 0.9959706 -0.6769378 0.6805199 0.9959706 -0.6785192 0.6805199 0.9959706 -0.6805199 0.6805199 0.9959706 -0.683051 0.6805199 0.9959706 -0.6862532 0.6805199 0.9959706 -0.6903044 0.6805199 0.9959706 -0.6954296 0.6805199 0.9959706 -0.7019138 0.6805199 0.9959706 -0.710117 0.6805199 0.9959706 -0.7204952 0.6805199 0.9959706 -0.733625 0.6805199 0.9959706 -0.7502359 0.6805199 0.9959706 -0.7712508 0.6805199 0.9959706 -0.7978374 0.6805199 0.9959706 -0.8314729 0.6805199 0.9959706 -0.8740262 0.6805199 0.9959706 -0.9278617 0.6805199 0.9959706 -0.9959706 0.6805199 0.9959706 -0.9968409 0.7304884 0.9396953 -0.9975189 0.7751395 0.9125186 -0.9980488 0.8141733 0.9036101 -0.9984638 0.8476717 0.9054678 -0.9987895 0.8759795 0.9130957 -0.9990455 0.8995968 0.9233085 -0.999247 0.9190947 0.9341777 -0.9994057 0.935054 0.9446144 -0.9995308 0.9480261 0.9540687 -0.9996295 0.9585109 0.9623212 -0.9997074 0.966947 0.9693452 -0.9997688 0.9737101 0.9752172 -0.9998174 0.9791163 0.9800622 -0.9998557 0.9834277 0.9840209 -0.999886 0.9868597 0.9872315 -0.9999099 0.9895878 0.9898206 -0.9999288 0.9917537 0.9918994 -0.9999437 0.9934718 0.9935629 -0.6724572 0.6844392 0.9959813 -0.6724495 0.6844209 0.9959811 -0.6724399 0.684398 0.9959809 -0.672428 0.6843692 0.9959807 -0.6724135 0.6843332 0.9959804 -0.6723959 0.6842884 0.9959801 -0.6723748 0.6842328 0.9959797 -0.67235 0.6841643 0.9959791 -0.6723217 0.6840805 0.9959785 -0.6722907 0.6839792 0.9959777 -0.6722594 0.6838586 0.9959768 -0.6722322 0.6837178 0.9959757 -0.672218 0.683559 0.9959745 -0.672232 0.6833889 0.9959732 -0.6723012 0.6832232 0.9959719 -0.6724711 0.6830927 0.9959709 -0.6728136 0.683051 0.9959706 -0.6733015 0.683051 0.9959706 -0.6739188 0.683051 0.9959706 -0.6746998 0.683051 0.9959706 -0.6756878 0.683051 0.9959706 -0.6769378 0.683051 0.9959706 -0.6785192 0.683051 0.9959706 -0.6805199 0.683051 0.9959706 -0.683051 0.683051 0.9959706 -0.6862532 0.683051 0.9959706 -0.6903044 0.683051 0.9959706 -0.6954296 0.683051 0.9959706 -0.7019138 0.683051 0.9959706 -0.710117 0.683051 0.9959706 -0.7204952 0.683051 0.9959706 -0.733625 0.683051 0.9959706 -0.7502359 0.683051 0.9959706 -0.7712508 0.683051 0.9959706 -0.7978374 0.683051 0.9959706 -0.8314729 0.683051 0.9959706 -0.8740262 0.683051 0.9959706 -0.9278617 0.683051 0.9959706 -0.9959706 0.683051 0.9959706 -0.9968409 0.732167 0.9396953 -0.9975189 0.7762418 0.9125186 -0.9980488 0.8148909 0.9036101 -0.9984638 0.8481355 0.9054678 -0.9987895 0.8762773 0.9130957 -0.9990455 0.899787 0.9233085 -0.999247 0.9192157 0.9341777 -0.9994057 0.9351307 0.9446144 -0.9995308 0.9480746 0.9540687 -0.9996295 0.9585415 0.9623212 -0.9997074 0.9669663 0.9693452 -0.9997688 0.9737222 0.9752172 -0.9998174 0.9791238 0.9800622 -0.9998557 0.9834324 0.9840209 -0.999886 0.9868627 0.9872315 -0.9999099 0.9895897 0.9898206 -0.9999288 0.9917549 0.9918994 -0.9999437 0.9934725 0.9935629 -0.6724572 0.6876273 0.9959813 -0.6724495 0.6876092 0.9959811 -0.6724399 0.6875865 0.9959809 -0.672428 0.687558 0.9959807 -0.6724135 0.6875223 0.9959804 -0.6723959 0.687478 0.9959801 -0.6723748 0.687423 0.9959797 -0.67235 0.6873552 0.9959791 -0.6723217 0.6872723 0.9959785 -0.6722907 0.687172 0.9959777 -0.6722594 0.6870525 0.9959768 -0.6722322 0.6869133 0.9959757 -0.672218 0.6867561 0.9959745 -0.672232 0.6865877 0.9959732 -0.6723012 0.6864236 0.9959719 -0.6724711 0.6862945 0.9959709 -0.6728136 0.6862532 0.9959706 -0.6733015 0.6862532 0.9959706 -0.6739188 0.6862532 0.9959706 -0.6746998 0.6862532 0.9959706 -0.6756878 0.6862532 0.9959706 -0.6769378 0.6862532 0.9959706 -0.6785192 0.6862532 0.9959706 -0.6805199 0.6862532 0.9959706 -0.683051 0.6862532 0.9959706 -0.6862532 0.6862532 0.9959706 -0.6903044 0.6862532 0.9959706 -0.6954296 0.6862532 0.9959706 -0.7019138 0.6862532 0.9959706 -0.710117 0.6862532 0.9959706 -0.7204952 0.6862532 0.9959706 -0.733625 0.6862532 0.9959706 -0.7502359 0.6862532 0.9959706 -0.7712508 0.6862532 0.9959706 -0.7978374 0.6862532 0.9959706 -0.8314729 0.6862532 0.9959706 -0.8740262 0.6862532 0.9959706 -0.9278617 0.6862532 0.9959706 -0.9959706 0.6862532 0.9959706 -0.9968409 0.7342907 0.9396953 -0.9975189 0.7776364 0.9125186 -0.9980488 0.8157988 0.9036101 -0.9984638 0.8487222 0.9054678 -0.9987895 0.8766541 0.9130957 -0.9990455 0.9000277 0.9233085 -0.999247 0.9193688 0.9341777 -0.9994057 0.9352277 0.9446144 -0.9995308 0.9481359 0.9540687 -0.9996295 0.9585802 0.9623212 -0.9997074 0.9669906 0.9693452 -0.9997688 0.9737375 0.9752172 -0.9998174 0.9791334 0.9800622 -0.9998557 0.9834385 0.9840209 -0.999886 0.9868665 0.9872315 -0.9999099 0.989592 0.9898206 -0.9999288 0.9917564 0.9918994 -0.9999437 0.9934734 0.9935629 -0.6724572 0.6916607 0.9959813 -0.6724495 0.6916428 0.9959811 -0.6724399 0.6916203 0.9959809 -0.672428 0.6915922 0.9959807 -0.6724135 0.6915571 0.9959804 -0.6723959 0.6915133 0.9959801 -0.6723748 0.691459 0.9959797 -0.67235 0.691392 0.9959791 -0.6723217 0.6913102 0.9959785 -0.6722907 0.6912113 0.9959777 -0.6722594 0.6910933 0.9959768 -0.6722322 0.6909559 0.9959757 -0.672218 0.6908007 0.9959745 -0.672232 0.6906345 0.9959732 -0.6723012 0.6904726 0.9959719 -0.6724711 0.6903451 0.9959709 -0.6728136 0.6903044 0.9959706 -0.6733015 0.6903044 0.9959706 -0.6739188 0.6903044 0.9959706 -0.6746998 0.6903044 0.9959706 -0.6756878 0.6903044 0.9959706 -0.6769378 0.6903044 0.9959706 -0.6785192 0.6903044 0.9959706 -0.6805199 0.6903044 0.9959706 -0.683051 0.6903044 0.9959706 -0.6862532 0.6903044 0.9959706 -0.6903044 0.6903044 0.9959706 -0.6954296 0.6903044 0.9959706 -0.7019138 0.6903044 0.9959706 -0.710117 0.6903044 0.9959706 -0.7204952 0.6903044 0.9959706 -0.733625 0.6903044 0.9959706 -0.7502359 0.6903044 0.9959706 -0.7712508 0.6903044 0.9959706 -0.7978374 0.6903044 0.9959706 -0.8314729 0.6903044 0.9959706 -0.8740262 0.6903044 0.9959706 -0.9278617 0.6903044 0.9959706 -0.9959706 0.6903044 0.9959706 -0.9968409 0.7369774 0.9396953 -0.9975189 0.7794007 0.9125186 -0.9980488 0.8169474 0.9036101 -0.9984638 0.8494644 0.9054678 -0.9987895 0.8771307 0.9130957 -0.9990455 0.9003323 0.9233085 -0.999247 0.9195625 0.9341777 -0.9994057 0.9353505 0.9446144 -0.9995308 0.9482135 0.9540687 -0.9996295 0.9586291 0.9623212 -0.9997074 0.9670214 0.9693452 -0.9997688 0.9737569 0.9752172 -0.9998174 0.9791456 0.9800622 -0.9998557 0.9834461 0.9840209 -0.999886 0.9868713 0.9872315 -0.9999099 0.989595 0.9898206 -0.9999288 0.9917582 0.9918994 -0.9999437 0.9934746 0.9935629 -0.6724572 0.6967634 0.9959813 -0.6724495 0.6967458 0.9959811 -0.6724399 0.6967237 0.9959809 -0.672428 0.6966961 0.9959807 -0.6724135 0.6966615 0.9959804 -0.6723959 0.6966184 0.9959801 -0.6723748 0.696565 0.9959797 -0.67235 0.6964992 0.9959791 -0.6723217 0.6964188 0.9959785 -0.6722907 0.6963214 0.9959777 -0.6722594 0.6962055 0.9959768 -0.6722322 0.6960703 0.9959757 -0.672218 0.6959177 0.9959745 -0.672232 0.6957543 0.9959732 -0.6723012 0.695595 0.9959719 -0.6724711 0.6954697 0.9959709 -0.6728136 0.6954296 0.9959706 -0.6733015 0.6954296 0.9959706 -0.6739188 0.6954296 0.9959706 -0.6746998 0.6954296 0.9959706 -0.6756878 0.6954296 0.9959706 -0.6769378 0.6954296 0.9959706 -0.6785192 0.6954296 0.9959706 -0.6805199 0.6954296 0.9959706 -0.683051 0.6954296 0.9959706 -0.6862532 0.6954296 0.9959706 -0.6903044 0.6954296 0.9959706 -0.6954296 0.6954296 0.9959706 -0.7019138 0.6954296 0.9959706 -0.710117 0.6954296 0.9959706 -0.7204952 0.6954296 0.9959706 -0.733625 0.6954296 0.9959706 -0.7502359 0.6954296 0.9959706 -0.7712508 0.6954296 0.9959706 -0.7978374 0.6954296 0.9959706 -0.8314729 0.6954296 0.9959706 -0.8740262 0.6954296 0.9959706 -0.9278617 0.6954296 0.9959706 -0.9959706 0.6954296 0.9959706 -0.9968409 0.7403765 0.9396953 -0.9975189 0.7816327 0.9125186 -0.9980488 0.8184005 0.9036101 -0.9984638 0.8504035 0.9054678 -0.9987895 0.8777338 0.9130957 -0.9990455 0.9007175 0.9233085 -0.999247 0.9198076 0.9341777 -0.9994057 0.9355059 0.9446144 -0.9995308 0.9483117 0.9540687 -0.9996295 0.958691 0.9623212 -0.9997074 0.9670604 0.9693452 -0.9997688 0.9737814 0.9752172 -0.9998174 0.979161 0.9800622 -0.9998557 0.9834557 0.9840209 -0.999886 0.9868773 0.9872315 -0.9999099 0.9895988 0.9898206 -0.9999288 0.9917606 0.9918994 -0.9999437 0.9934761 0.9935629 -0.6724572 0.703219 0.9959813 -0.6724495 0.7032018 0.9959811 -0.6724399 0.7031802 0.9959809 -0.672428 0.7031531 0.9959807 -0.6724135 0.7031193 0.9959804 -0.6723959 0.7030771 0.9959801 -0.6723748 0.7030249 0.9959797 -0.67235 0.7029605 0.9959791 -0.6723217 0.7028817 0.9959785 -0.6722907 0.7027865 0.9959777 -0.6722594 0.702673 0.9959768 -0.6722322 0.7025407 0.9959757 -0.672218 0.7023914 0.9959745 -0.672232 0.7022315 0.9959732 -0.6723012 0.7020756 0.9959719 -0.6724711 0.701953 0.9959709 -0.6728136 0.7019138 0.9959706 -0.6733015 0.7019138 0.9959706 -0.6739188 0.7019138 0.9959706 -0.6746998 0.7019138 0.9959706 -0.6756878 0.7019138 0.9959706 -0.6769378 0.7019138 0.9959706 -0.6785192 0.7019138 0.9959706 -0.6805199 0.7019138 0.9959706 -0.683051 0.7019138 0.9959706 -0.6862532 0.7019138 0.9959706 -0.6903044 0.7019138 0.9959706 -0.6954296 0.7019138 0.9959706 -0.7019138 0.7019138 0.9959706 -0.710117 0.7019138 0.9959706 -0.7204952 0.7019138 0.9959706 -0.733625 0.7019138 0.9959706 -0.7502359 0.7019138 0.9959706 -0.7712508 0.7019138 0.9959706 -0.7978374 0.7019138 0.9959706 -0.8314729 0.7019138 0.9959706 -0.8740262 0.7019138 0.9959706 -0.9278617 0.7019138 0.9959706 -0.9959706 0.7019138 0.9959706 -0.9968409 0.7446768 0.9396953 -0.9975189 0.7844566 0.9125186 -0.9980488 0.8202389 0.9036101 -0.9984638 0.8515915 0.9054678 -0.9987895 0.8784967 0.9130957 -0.9990455 0.9012049 0.9233085 -0.999247 0.9201176 0.9341777 -0.9994057 0.9357024 0.9446144 -0.9995308 0.9484359 0.9540687 -0.9996295 0.9587693 0.9623212 -0.9997074 0.9671097 0.9693452 -0.9997688 0.9738123 0.9752172 -0.9998174 0.9791804 0.9800622 -0.9998557 0.9834679 0.9840209 -0.999886 0.986885 0.9872315 -0.9999099 0.9896036 0.9898206 -0.9999288 0.9917636 0.9918994 -0.9999437 0.9934779 0.9935629 -0.6724572 0.7113861 0.9959813 -0.6724495 0.7113694 0.9959811 -0.6724399 0.7113484 0.9959809 -0.672428 0.7113221 0.9959807 -0.6724135 0.7112892 0.9959804 -0.6723959 0.7112482 0.9959801 -0.6723748 0.7111974 0.9959797 -0.67235 0.7111348 0.9959791 -0.6723217 0.7110582 0.9959785 -0.6722907 0.7109656 0.9959777 -0.6722594 0.7108553 0.9959768 -0.6722322 0.7107266 0.9959757 -0.672218 0.7105815 0.9959745 -0.672232 0.710426 0.9959732 -0.6723012 0.7102744 0.9959719 -0.6724711 0.7101552 0.9959709 -0.6728136 0.710117 0.9959706 -0.6733015 0.710117 0.9959706 -0.6739188 0.710117 0.9959706 -0.6746998 0.710117 0.9959706 -0.6756878 0.710117 0.9959706 -0.6769378 0.710117 0.9959706 -0.6785192 0.710117 0.9959706 -0.6805199 0.710117 0.9959706 -0.683051 0.710117 0.9959706 -0.6862532 0.710117 0.9959706 -0.6903044 0.710117 0.9959706 -0.6954296 0.710117 0.9959706 -0.7019138 0.710117 0.9959706 -0.710117 0.710117 0.9959706 -0.7204952 0.710117 0.9959706 -0.733625 0.710117 0.9959706 -0.7502359 0.710117 0.9959706 -0.7712508 0.710117 0.9959706 -0.7978374 0.710117 0.9959706 -0.8314729 0.710117 0.9959706 -0.8740262 0.710117 0.9959706 -0.9278617 0.710117 0.9959706 -0.9959706 0.710117 0.9959706 -0.9968409 0.7501172 0.9396953 -0.9975189 0.7880291 0.9125186 -0.9980488 0.8225647 0.9036101 -0.9984638 0.8530945 0.9054678 -0.9987895 0.8794619 0.9130957 -0.9990455 0.9018215 0.9233085 -0.999247 0.9205098 0.9341777 -0.9994057 0.935951 0.9446144 -0.9995308 0.9485931 0.9540687 -0.9996295 0.9588684 0.9623212 -0.9997074 0.967172 0.9693452 -0.9997688 0.9738515 0.9752172 -0.9998174 0.979205 0.9800622 -0.9998557 0.9834833 0.9840209 -0.999886 0.9868946 0.9872315 -0.9999099 0.9896096 0.9898206 -0.9999288 0.9917674 0.9918994 -0.9999437 0.9934803 0.9935629 -0.6724572 0.7217186 0.9959813 -0.6724495 0.7217025 0.9959811 -0.6724399 0.7216823 0.9959809 -0.672428 0.7216569 0.9959807 -0.6724135 0.7216252 0.9959804 -0.6723959 0.7215857 0.9959801 -0.6723748 0.7215367 0.9959797 -0.67235 0.7214763 0.9959791 -0.6723217 0.7214025 0.9959785 -0.6722907 0.7213133 0.9959777 -0.6722594 0.7212069 0.9959768 -0.6722322 0.7210829 0.9959757 -0.672218 0.720943 0.9959745 -0.672232 0.720793 0.9959732 -0.6723012 0.720647 0.9959719 -0.6724711 0.720532 0.9959709 -0.6728136 0.7204952 0.9959706 -0.6733015 0.7204952 0.9959706 -0.6739188 0.7204952 0.9959706 -0.6746998 0.7204952 0.9959706 -0.6756878 0.7204952 0.9959706 -0.6769378 0.7204952 0.9959706 -0.6785192 0.7204952 0.9959706 -0.6805199 0.7204952 0.9959706 -0.683051 0.7204952 0.9959706 -0.6862532 0.7204952 0.9959706 -0.6903044 0.7204952 0.9959706 -0.6954296 0.7204952 0.9959706 -0.7019138 0.7204952 0.9959706 -0.710117 0.7204952 0.9959706 -0.7204952 0.7204952 0.9959706 -0.733625 0.7204952 0.9959706 -0.7502359 0.7204952 0.9959706 -0.7712508 0.7204952 0.9959706 -0.7978374 0.7204952 0.9959706 -0.8314729 0.7204952 0.9959706 -0.8740262 0.7204952 0.9959706 -0.9278617 0.7204952 0.9959706 -0.9959706 0.7204952 0.9959706 -0.9968409 0.757 0.9396953 -0.9975189 0.7925488 0.9125186 -0.9980488 0.8255071 0.9036101 -0.9984638 0.8549959 0.9054678 -0.9987895 0.880683 0.9130957 -0.9990455 0.9026016 0.9233085 -0.999247 0.9210061 0.9341777 -0.9994057 0.9362655 0.9446144 -0.9995308 0.9487918 0.9540687 -0.9996295 0.9589938 0.9623212 -0.9997074 0.9672509 0.9693452 -0.9997688 0.9739011 0.9752172 -0.9998174 0.9792361 0.9800622 -0.9998557 0.9835029 0.9840209 -0.999886 0.9869069 0.9872315 -0.9999099 0.9896173 0.9898206 -0.9999288 0.9917722 0.9918994 -0.9999437 0.9934833 0.9935629 -0.6724572 0.7347906 0.9959813 -0.6724495 0.7347753 0.9959811 -0.6724399 0.734756 0.9959809 -0.672428 0.7347318 0.9959807 -0.6724135 0.7347016 0.9959804 -0.6723959 0.7346639 0.9959801 -0.6723748 0.7346173 0.9959797 -0.67235 0.7345598 0.9959791 -0.6723217 0.7344894 0.9959785 -0.6722907 0.7344044 0.9959777 -0.6722594 0.7343031 0.9959768 -0.6722322 0.7341849 0.9959757 -0.672218 0.7340516 0.9959745 -0.672232 0.7339088 0.9959732 -0.6723012 0.7337696 0.9959719 -0.6724711 0.7336601 0.9959709 -0.6728136 0.733625 0.9959706 -0.6733015 0.733625 0.9959706 -0.6739188 0.733625 0.9959706 -0.6746998 0.733625 0.9959706 -0.6756878 0.733625 0.9959706 -0.6769378 0.733625 0.9959706 -0.6785192 0.733625 0.9959706 -0.6805199 0.733625 0.9959706 -0.683051 0.733625 0.9959706 -0.6862532 0.733625 0.9959706 -0.6903044 0.733625 0.9959706 -0.6954296 0.733625 0.9959706 -0.7019138 0.733625 0.9959706 -0.710117 0.733625 0.9959706 -0.7204952 0.733625 0.9959706 -0.733625 0.733625 0.9959706 -0.7502359 0.733625 0.9959706 -0.7712508 0.733625 0.9959706 -0.7978374 0.733625 0.9959706 -0.8314729 0.733625 0.9959706 -0.8740262 0.733625 0.9959706 -0.9278617 0.733625 0.9959706 -0.9959706 0.733625 0.9959706 -0.9968409 0.7657077 0.9396953 -0.9975189 0.7982669 0.9125186 -0.9980488 0.8292297 0.9036101 -0.9984638 0.8574015 0.9054678 -0.9987895 0.8822279 0.9130957 -0.9990455 0.9035886 0.9233085 -0.999247 0.9216339 0.9341777 -0.9994057 0.9366635 0.9446144 -0.9995308 0.9490434 0.9540687 -0.9996295 0.9591524 0.9623212 -0.9997074 0.9673508 0.9693452 -0.9997688 0.9739638 0.9752172 -0.9998174 0.9792755 0.9800622 -0.9998557 0.9835276 0.9840209 -0.999886 0.9869223 0.9872315 -0.9999099 0.989627 0.9898206 -0.9999288 0.9917782 0.9918994 -0.9999437 0.9934871 0.9935629 -0.6724572 0.7513284 0.9959813 -0.6724495 0.751314 0.9959811 -0.6724399 0.7512959 0.9959809 -0.672428 0.7512732 0.9959807 -0.6724135 0.7512449 0.9959804 -0.6723959 0.7512096 0.9959801 -0.6723748 0.7511659 0.9959797 -0.67235 0.751112 0.9959791 -0.6723217 0.7510461 0.9959785 -0.6722907 0.7509664 0.9959777 -0.6722594 0.7508714 0.9959768 -0.6722322 0.7507607 0.9959757 -0.672218 0.7506357 0.9959745 -0.672232 0.7505018 0.9959732 -0.6723012 0.7503714 0.9959719 -0.6724711 0.7502687 0.9959709 -0.6728136 0.7502359 0.9959706 -0.6733015 0.7502359 0.9959706 -0.6739188 0.7502359 0.9959706 -0.6746998 0.7502359 0.9959706 -0.6756878 0.7502359 0.9959706 -0.6769378 0.7502359 0.9959706 -0.6785192 0.7502359 0.9959706 -0.6805199 0.7502359 0.9959706 -0.683051 0.7502359 0.9959706 -0.6862532 0.7502359 0.9959706 -0.6903044 0.7502359 0.9959706 -0.6954296 0.7502359 0.9959706 -0.7019138 0.7502359 0.9959706 -0.710117 0.7502359 0.9959706 -0.7204952 0.7502359 0.9959706 -0.733625 0.7502359 0.9959706 -0.7502359 0.7502359 0.9959706 -0.7712508 0.7502359 0.9959706 -0.7978374 0.7502359 0.9959706 -0.8314729 0.7502359 0.9959706 -0.8740262 0.7502359 0.9959706 -0.9278617 0.7502359 0.9959706 -0.9959706 0.7502359 0.9959706 -0.9968409 0.776724 0.9396953 -0.9975189 0.8055009 0.9125186 -0.9980488 0.8339392 0.9036101 -0.9984638 0.8604449 0.9054678 -0.9987895 0.8841823 0.9130957 -0.9990455 0.9048372 0.9233085 -0.999247 0.9224281 0.9341777 -0.9994057 0.9371669 0.9446144 -0.9995308 0.9493615 0.9540687 -0.9996295 0.959353 0.9623212 -0.9997074 0.967477 0.9693452 -0.9997688 0.9740432 0.9752172 -0.9998174 0.9793253 0.9800622 -0.9998557 0.9835588 0.9840209 -0.999886 0.9869419 0.9872315 -0.9999099 0.9896392 0.9898206 -0.9999288 0.9917859 0.9918994 -0.9999437 0.9934919 0.9935629 -0.6724572 0.7722508 0.9959813 -0.6724495 0.7722376 0.9959811 -0.6724399 0.772221 0.9959809 -0.672428 0.7722003 0.9959807 -0.6724135 0.7721744 0.9959804 -0.6723959 0.7721421 0.9959801 -0.6723748 0.7721021 0.9959797 -0.67235 0.7720527 0.9959791 -0.6723217 0.7719924 0.9959785 -0.6722907 0.7719194 0.9959777 -0.6722594 0.7718325 0.9959768 -0.6722322 0.7717312 0.9959757 -0.672218 0.7716168 0.9959745 -0.672232 0.7714942 0.9959732 -0.6723012 0.7713748 0.9959719 -0.6724711 0.7712809 0.9959709 -0.6728136 0.7712508 0.9959706 -0.6733015 0.7712508 0.9959706 -0.6739188 0.7712508 0.9959706 -0.6746998 0.7712508 0.9959706 -0.6756878 0.7712508 0.9959706 -0.6769378 0.7712508 0.9959706 -0.6785192 0.7712508 0.9959706 -0.6805199 0.7712508 0.9959706 -0.683051 0.7712508 0.9959706 -0.6862532 0.7712508 0.9959706 -0.6903044 0.7712508 0.9959706 -0.6954296 0.7712508 0.9959706 -0.7019138 0.7712508 0.9959706 -0.710117 0.7712508 0.9959706 -0.7204952 0.7712508 0.9959706 -0.733625 0.7712508 0.9959706 -0.7502359 0.7712508 0.9959706 -0.7712508 0.7712508 0.9959706 -0.7978374 0.7712508 0.9959706 -0.8314729 0.7712508 0.9959706 -0.8740262 0.7712508 0.9959706 -0.9278617 0.7712508 0.9959706 -0.9959706 0.7712508 0.9959706 -0.9968409 0.7906611 0.9396953 -0.9975189 0.8146529 0.9125186 -0.9980488 0.8398974 0.9036101 -0.9984638 0.8642952 0.9054678 -0.9987895 0.886655 0.9130957 -0.9990455 0.9064168 0.9233085 -0.999247 0.9234329 0.9341777 -0.9994057 0.9378038 0.9446144 -0.9995308 0.9497641 0.9540687 -0.9996295 0.9596068 0.9623212 -0.9997074 0.9676368 0.9693452 -0.9997688 0.9741436 0.9752172 -0.9998174 0.9793883 0.9800622 -0.9998557 0.9835983 0.9840209 -0.999886 0.9869667 0.9872315 -0.9999099 0.9896547 0.9898206 -0.9999288 0.9917956 0.9918994 -0.9999437 0.993498 0.9935629 -0.6724572 0.7987204 0.9959813 -0.6724495 0.7987087 0.9959811 -0.6724399 0.7986941 0.9959809 -0.672428 0.7986758 0.9959807 -0.6724135 0.7986529 0.9959804 -0.6723959 0.7986244 0.9959801 -0.6723748 0.798589 0.9959797 -0.67235 0.7985455 0.9959791 -0.6723217 0.7984922 0.9959785 -0.6722907 0.7984278 0.9959777 -0.6722594 0.798351 0.9959768 -0.6722322 0.7982615 0.9959757 -0.672218 0.7981605 0.9959745 -0.672232 0.7980523 0.9959732 -0.6723012 0.7979469 0.9959719 -0.6724711 0.797864 0.9959709 -0.6728136 0.7978374 0.9959706 -0.6733015 0.7978374 0.9959706 -0.6739188 0.7978374 0.9959706 -0.6746998 0.7978374 0.9959706 -0.6756878 0.7978374 0.9959706 -0.6769378 0.7978374 0.9959706 -0.6785192 0.7978374 0.9959706 -0.6805199 0.7978374 0.9959706 -0.683051 0.7978374 0.9959706 -0.6862532 0.7978374 0.9959706 -0.6903044 0.7978374 0.9959706 -0.6954296 0.7978374 0.9959706 -0.7019138 0.7978374 0.9959706 -0.710117 0.7978374 0.9959706 -0.7204952 0.7978374 0.9959706 -0.733625 0.7978374 0.9959706 -0.7502359 0.7978374 0.9959706 -0.7712508 0.7978374 0.9959706 -0.7978374 0.7978374 0.9959706 -0.8314729 0.7978374 0.9959706 -0.8740262 0.7978374 0.9959706 -0.9278617 0.7978374 0.9959706 -0.9959706 0.7978374 0.9959706 -0.9968409 0.8082934 0.9396953 -0.9975189 0.8262314 0.9125186 -0.9980488 0.8474353 0.9036101 -0.9984638 0.8691663 0.9054678 -0.9987895 0.8897832 0.9130957 -0.9990455 0.9084153 0.9233085 -0.999247 0.9247041 0.9341777 -0.9994057 0.9386096 0.9446144 -0.9995308 0.9502734 0.9540687 -0.9996295 0.959928 0.9623212 -0.9997074 0.9678389 0.9693452 -0.9997688 0.9742706 0.9752172 -0.9998174 0.9794681 0.9800622 -0.9998557 0.9836483 0.9840209 -0.999886 0.986998 0.9872315 -0.9999099 0.9896744 0.9898206 -0.9999288 0.9918079 0.9918994 -0.9999437 0.9935057 0.9935629 -0.6724572 0.8322078 0.9959813 -0.6724495 0.8321981 0.9959811 -0.6724399 0.8321859 0.9959809 -0.672428 0.8321707 0.9959807 -0.6724135 0.8321516 0.9959804 -0.6723959 0.8321279 0.9959801 -0.6723748 0.8320985 0.9959797 -0.67235 0.8320622 0.9959791 -0.6723217 0.8320179 0.9959785 -0.6722907 0.8319643 0.9959777 -0.6722594 0.8319004 0.9959768 -0.6722322 0.8318259 0.9959757 -0.672218 0.8317419 0.9959745 -0.672232 0.8316518 0.9959732 -0.6723012 0.8315641 0.9959719 -0.6724711 0.831495 0.9959709 -0.6728136 0.8314729 0.9959706 -0.6733015 0.8314729 0.9959706 -0.6739188 0.8314729 0.9959706 -0.6746998 0.8314729 0.9959706 -0.6756878 0.8314729 0.9959706 -0.6769378 0.8314729 0.9959706 -0.6785192 0.8314729 0.9959706 -0.6805199 0.8314729 0.9959706 -0.683051 0.8314729 0.9959706 -0.6862532 0.8314729 0.9959706 -0.6903044 0.8314729 0.9959706 -0.6954296 0.8314729 0.9959706 -0.7019138 0.8314729 0.9959706 -0.710117 0.8314729 0.9959706 -0.7204952 0.8314729 0.9959706 -0.733625 0.8314729 0.9959706 -0.7502359 0.8314729 0.9959706 -0.7712508 0.8314729 0.9959706 -0.7978374 0.8314729 0.9959706 -0.8314729 0.8314729 0.9959706 -0.8740262 0.8314729 0.9959706 -0.9278617 0.8314729 0.9959706 -0.9959706 0.8314729 0.9959706 -0.9968409 0.8306004 0.9396953 -0.9975189 0.8408797 0.9125186 -0.9980488 0.8569716 0.9036101 -0.9984638 0.875329 0.9054678 -0.9987895 0.8937407 0.9130957 -0.9990455 0.9109436 0.9233085 -0.999247 0.9263124 0.9341777 -0.9994057 0.939629 0.9446144 -0.9995308 0.9509177 0.9540687 -0.9996295 0.9603343 0.9623212 -0.9997074 0.9680946 0.9693452 -0.9997688 0.9744313 0.9752172 -0.9998174 0.9795689 0.9800622 -0.9998557 0.9837116 0.9840209 -0.999886 0.9870376 0.9872315 -0.9999099 0.9896992 0.9898206 -0.9999288 0.9918234 0.9918994 -0.9999437 0.9935154 0.9935629 -0.6724572 0.8745738 0.9959813 -0.6724495 0.8745666 0.9959811 -0.6724399 0.8745575 0.9959809 -0.672428 0.8745461 0.9959807 -0.6724135 0.8745319 0.9959804 -0.6723959 0.8745143 0.9959801 -0.6723748 0.8744923 0.9959797 -0.67235 0.8744653 0.9959791 -0.6723217 0.8744323 0.9959785 -0.6722907 0.8743923 0.9959777 -0.6722594 0.8743447 0.9959768 -0.6722322 0.8742892 0.9959757 -0.672218 0.8742266 0.9959745 -0.672232 0.8741595 0.9959732 -0.6723012 0.8740941 0.9959719 -0.6724711 0.8740427 0.9959709 -0.6728136 0.8740262 0.9959706 -0.6733015 0.8740262 0.9959706 -0.6739188 0.8740262 0.9959706 -0.6746998 0.8740262 0.9959706 -0.6756878 0.8740262 0.9959706 -0.6769378 0.8740262 0.9959706 -0.6785192 0.8740262 0.9959706 -0.6805199 0.8740262 0.9959706 -0.683051 0.8740262 0.9959706 -0.6862532 0.8740262 0.9959706 -0.6903044 0.8740262 0.9959706 -0.6954296 0.8740262 0.9959706 -0.7019138 0.8740262 0.9959706 -0.710117 0.8740262 0.9959706 -0.7204952 0.8740262 0.9959706 -0.733625 0.8740262 0.9959706 -0.7502359 0.8740262 0.9959706 -0.7712508 0.8740262 0.9959706 -0.7978374 0.8740262 0.9959706 -0.8314729 0.8740262 0.9959706 -0.8740262 0.8740262 0.9959706 -0.9278617 0.8740262 0.9959706 -0.9959706 0.8740262 0.9959706 -0.9968409 0.8588218 0.9396953 -0.9975189 0.8594117 0.9125186 -0.9980488 0.8690364 0.9036101 -0.9984638 0.8831255 0.9054678 -0.9987895 0.8987476 0.9130957 -0.9990455 0.9141422 0.9233085 -0.999247 0.928347 0.9341777 -0.9994057 0.9409186 0.9446144 -0.9995308 0.9517328 0.9540687 -0.9996295 0.9608482 0.9623212 -0.9997074 0.9684181 0.9693452 -0.9997688 0.9746346 0.9752172 -0.9998174 0.9796966 0.9800622 -0.9998557 0.9837916 0.9840209 -0.999886 0.9870878 0.9872315 -0.9999099 0.9897306 0.9898206 -0.9999288 0.9918431 0.9918994 -0.9999437 0.9935277 0.9935629 -0.6724572 0.9281722 0.9959813 -0.6724495 0.9281681 0.9959811 -0.6724399 0.928163 0.9959809 -0.672428 0.9281566 0.9959807 -0.6724135 0.9281485 0.9959804 -0.6723959 0.9281385 0.9959801 -0.6723748 0.928126 0.9959797 -0.67235 0.9281107 0.9959791 -0.6723217 0.928092 0.9959785 -0.6722907 0.9280693 0.9959777 -0.6722594 0.9280423 0.9959768 -0.6722322 0.9280109 0.9959757 -0.672218 0.9279753 0.9959745 -0.672232 0.9279373 0.9959732 -0.6723012 0.9279002 0.9959719 -0.6724711 0.927871 0.9959709 -0.6728136 0.9278617 0.9959706 -0.6733015 0.9278617 0.9959706 -0.6739188 0.9278617 0.9959706 -0.6746998 0.9278617 0.9959706 -0.6756878 0.9278617 0.9959706 -0.6769378 0.9278617 0.9959706 -0.6785192 0.9278617 0.9959706 -0.6805199 0.9278617 0.9959706 -0.683051 0.9278617 0.9959706 -0.6862532 0.9278617 0.9959706 -0.6903044 0.9278617 0.9959706 -0.6954296 0.9278617 0.9959706 -0.7019138 0.9278617 0.9959706 -0.710117 0.9278617 0.9959706 -0.7204952 0.9278617 0.9959706 -0.733625 0.9278617 0.9959706 -0.7502359 0.9278617 0.9959706 -0.7712508 0.9278617 0.9959706 -0.7978374 0.9278617 0.9959706 -0.8314729 0.9278617 0.9959706 -0.8740262 0.9278617 0.9959706 -0.9278617 0.9278617 0.9959706 -0.9959706 0.9278617 0.9959706 -0.9968409 0.8945255 0.9396953 -0.9975189 0.8828571 0.9125186 -0.9980488 0.8842998 0.9036101 -0.9984638 0.892989 0.9054678 -0.9987895 0.9050819 0.9130957 -0.9990455 0.9181889 0.9233085 -0.999247 0.9309211 0.9341777 -0.9994057 0.9425502 0.9446144 -0.9995308 0.952764 0.9540687 -0.9996295 0.9614985 0.9623212 -0.9997074 0.9688274 0.9693452 -0.9997688 0.9748918 0.9752172 -0.9998174 0.979858 0.9800622 -0.9998557 0.9838928 0.9840209 -0.999886 0.9871512 0.9872315 -0.9999099 0.9897703 0.9898206 -0.9999288 0.991868 0.9918994 -0.9999437 0.9935432 0.9935629 -0.6724572 0.9959813 0.9959813 -0.6724495 0.9959811 0.9959811 -0.6724399 0.9959809 0.9959809 -0.672428 0.9959807 0.9959807 -0.6724135 0.9959804 0.9959804 -0.6723959 0.9959801 0.9959801 -0.6723748 0.9959797 0.9959797 -0.67235 0.9959791 0.9959791 -0.6723217 0.9959785 0.9959785 -0.6722907 0.9959777 0.9959777 -0.6722594 0.9959768 0.9959768 -0.6722322 0.9959757 0.9959757 -0.672218 0.9959745 0.9959745 -0.672232 0.9959732 0.9959732 -0.6723012 0.9959719 0.9959719 -0.6724711 0.9959709 0.9959709 -0.6728136 0.9959706 0.9959706 -0.6733015 0.9959706 0.9959706 -0.6739188 0.9959706 0.9959706 -0.6746998 0.9959706 0.9959706 -0.6756878 0.9959706 0.9959706 -0.6769378 0.9959706 0.9959706 -0.6785192 0.9959706 0.9959706 -0.6805199 0.9959706 0.9959706 -0.683051 0.9959706 0.9959706 -0.6862532 0.9959706 0.9959706 -0.6903044 0.9959706 0.9959706 -0.6954296 0.9959706 0.9959706 -0.7019138 0.9959706 0.9959706 -0.710117 0.9959706 0.9959706 -0.7204952 0.9959706 0.9959706 -0.733625 0.9959706 0.9959706 -0.7502359 0.9959706 0.9959706 -0.7712508 0.9959706 0.9959706 -0.7978374 0.9959706 0.9959706 -0.8314729 0.9959706 0.9959706 -0.8740262 0.9959706 0.9959706 -0.9278617 0.9959706 0.9959706 -0.9959706 0.9959706 0.9959706 -0.9968409 0.9396953 0.9396953 -0.9975189 0.9125186 0.9125186 -0.9980488 0.9036101 0.9036101 -0.9984638 0.9054678 0.9054678 -0.9987895 0.9130957 0.9130957 -0.9990455 0.9233085 0.9233085 -0.999247 0.9341777 0.9341777 -0.9994057 0.9446144 0.9446144 -0.9995308 0.9540687 0.9540687 -0.9996295 0.9623212 0.9623212 -0.9997074 0.9693452 0.9693452 -0.9997688 0.9752172 0.9752172 -0.9998174 0.9800622 0.9800622 -0.9998557 0.9840209 0.9840209 -0.999886 0.9872315 0.9872315 -0.9999099 0.9898206 0.9898206 -0.9999288 0.9918994 0.9918994 -0.9999437 0.9935629 0.9935629 -0.7251659 0.9968475 0.939906 -0.7251605 0.9968474 0.9399032 -0.7251537 0.9968473 0.9398997 -0.7251454 0.9968472 0.9398953 -0.7251351 0.996847 0.9398899 -0.7251226 0.9968468 0.9398831 -0.7251076 0.9968465 0.9398746 -0.7250899 0.9968462 0.9398642 -0.7250697 0.9968458 0.9398515 -0.7250473 0.9968453 0.9398361 -0.7250244 0.9968448 0.9398178 -0.7250039 0.9968441 0.9397965 -0.7249916 0.9968433 0.9397723 -0.7249978 0.9968425 0.9397465 -0.7250408 0.9968418 0.9397214 -0.7251511 0.9968411 0.9397016 -0.7253775 0.9968409 0.9396953 -0.7257011 0.9968409 0.9396953 -0.7261105 0.9968409 0.9396953 -0.7266285 0.9968409 0.9396953 -0.7272837 0.9968409 0.9396953 -0.7281127 0.9968409 0.9396953 -0.7291615 0.9968409 0.9396953 -0.7304884 0.9968409 0.9396953 -0.732167 0.9968409 0.9396953 -0.7342907 0.9968409 0.9396953 -0.7369774 0.9968409 0.9396953 -0.7403765 0.9968409 0.9396953 -0.7446768 0.9968409 0.9396953 -0.7501172 0.9968409 0.9396953 -0.757 0.9968409 0.9396953 -0.7657077 0.9968409 0.9396953 -0.776724 0.9968409 0.9396953 -0.7906611 0.9968409 0.9396953 -0.8082934 0.9968409 0.9396953 -0.8306004 0.9968409 0.9396953 -0.8588218 0.9968409 0.9396953 -0.8945255 0.9968409 0.9396953 -0.9396953 0.9968409 0.9396953 -0.9968409 0.9968409 0.9396953 -0.9975189 0.9500442 0.9125186 -0.9980488 0.9280401 0.9036101 -0.9984638 0.921255 0.9054678 -0.9987895 0.9232341 0.9130957 -0.9990455 0.9297854 0.9233085 -0.999247 0.9382977 0.9341777 -0.9994057 0.9472259 0.9446144 -0.9995308 0.9557192 0.9540687 -0.9996295 0.963362 0.9623212 -0.9997074 0.9700002 0.9693452 -0.9997688 0.9756289 0.9752172 -0.9998174 0.9803206 0.9800622 -0.9998557 0.9841829 0.9840209 -0.999886 0.987333 0.9872315 -0.9999099 0.9898842 0.9898206 -0.9999288 0.9919392 0.9918994 -0.9999437 0.9935878 0.9935629 -0.7716588 0.997523 0.9127681 -0.7716551 0.997523 0.9127648 -0.7716504 0.9975229 0.9127607 -0.7716446 0.9975228 0.9127555 -0.7716375 0.9975227 0.912749 -0.7716288 0.9975226 0.912741 -0.7716184 0.9975224 0.912731 -0.7716061 0.9975222 0.9127186 -0.7715919 0.997522 0.9127036 -0.7715762 0.9975217 0.9126854 -0.7715599 0.9975213 0.9126636 -0.7715449 0.9975209 0.9126384 -0.7715352 0.9975204 0.9126098 -0.7715376 0.9975199 0.9125792 -0.7715641 0.9975194 0.9125495 -0.7716352 0.9975191 0.912526 -0.7717834 0.9975189 0.9125186 -0.7719959 0.9975189 0.9125186 -0.7722648 0.9975189 0.9125186 -0.7726049 0.9975189 0.9125186 -0.7730352 0.9975189 0.9125186 -0.7735795 0.9975189 0.9125186 -0.7742682 0.9975189 0.9125186 -0.7751395 0.9975189 0.9125186 -0.7762418 0.9975189 0.9125186 -0.7776364 0.9975189 0.9125186 -0.7794007 0.9975189 0.9125186 -0.7816327 0.9975189 0.9125186 -0.7844566 0.9975189 0.9125186 -0.7880291 0.9975189 0.9125186 -0.7925488 0.9975189 0.9125186 -0.7982669 0.9975189 0.9125186 -0.8055009 0.9975189 0.9125186 -0.8146529 0.9975189 0.9125186 -0.8262314 0.9975189 0.9125186 -0.8408797 0.9975189 0.9125186 -0.8594117 0.9975189 0.9125186 -0.8828571 0.9975189 0.9125186 -0.9125186 0.9975189 0.9125186 -0.9500442 0.9975189 0.9125186 -0.9975189 0.9975189 0.9125186 -0.9980488 0.9589472 0.9036101 -0.9984638 0.9412278 0.9054678 -0.9987895 0.9360606 0.9130957 -0.9990455 0.9379796 0.9233085 -0.999247 0.94351 0.9341777 -0.9994057 0.9505298 0.9446144 -0.9995308 0.9578074 0.9540687 -0.9996295 0.9646787 0.9623212 -0.9997074 0.970829 0.9693452 -0.9997688 0.9761497 0.9752172 -0.9998174 0.9806476 0.9800622 -0.9998557 0.984388 0.9840209 -0.999886 0.9874615 0.9872315 -0.9999099 0.9899646 0.9898206 -0.9999288 0.9919896 0.9918994 -0.9999437 0.9936193 0.9935629 -0.8119154 0.9980513 0.9038323 -0.8119128 0.9980512 0.9038294 -0.8119096 0.9980512 0.9038257 -0.8119057 0.9980511 0.9038211 -0.8119009 0.9980511 0.9038153 -0.8118949 0.998051 0.9038082 -0.8118878 0.9980509 0.9037992 -0.8118794 0.9980508 0.9037883 -0.8118697 0.9980506 0.9037748 -0.8118589 0.9980504 0.9037586 -0.8118476 0.9980502 0.9037393 -0.811837 0.99805 0.9037168 -0.8118298 0.9980497 0.9036913 -0.8118303 0.9980494 0.9036641 -0.8118466 0.9980491 0.9036376 -0.8118921 0.9980488 0.9036168 -0.8119884 0.9980488 0.9036101 -0.8121268 0.9980488 0.9036101 -0.8123018 0.9980488 0.9036101 -0.8125232 0.9980488 0.9036101 -0.8128033 0.9980488 0.9036101 -0.8131577 0.9980488 0.9036101 -0.8136061 0.9980488 0.9036101 -0.8141733 0.9980488 0.9036101 -0.8148909 0.9980488 0.9036101 -0.8157988 0.9980488 0.9036101 -0.8169474 0.9980488 0.9036101 -0.8184005 0.9980488 0.9036101 -0.8202389 0.9980488 0.9036101 -0.8225647 0.9980488 0.9036101 -0.8255071 0.9980488 0.9036101 -0.8292297 0.9980488 0.9036101 -0.8339392 0.9980488 0.9036101 -0.8398974 0.9980488 0.9036101 -0.8474353 0.9980488 0.9036101 -0.8569716 0.9980488 0.9036101 -0.8690364 0.9980488 0.9036101 -0.8842998 0.9980488 0.9036101 -0.9036101 0.9980488 0.9036101 -0.9280401 0.9980488 0.9036101 -0.9589472 0.9980488 0.9036101 -0.9980488 0.9980488 0.9036101 -0.9984638 0.9664961 0.9054678 -0.9987895 0.9522877 0.9130957 -0.9990455 0.9483463 0.9233085 -0.999247 0.9501042 0.9341777 -0.9994057 0.9547096 0.9446144 -0.9995308 0.9604492 0.9540687 -0.9996295 0.9663445 0.9623212 -0.9997074 0.9718774 0.9693452 -0.9997688 0.9768086 0.9752172 -0.9998174 0.9810611 0.9800622 -0.9998557 0.9846473 0.9840209 -0.999886 0.987624 0.9872315 -0.9999099 0.9900664 0.9898206 -0.9999288 0.9920533 0.9918994 -0.9999437 0.9936592 0.9935629 -0.8462171 0.9984653 0.9056431 -0.8462154 0.9984653 0.9056408 -0.8462132 0.9984653 0.9056379 -0.8462106 0.9984653 0.9056342 -0.8462073 0.9984652 0.9056297 -0.8462034 0.9984652 0.905624 -0.8461986 0.9984651 0.905617 -0.8461929 0.998465 0.9056083 -0.8461864 0.9984649 0.9055977 -0.8461791 0.9984648 0.9055849 -0.8461714 0.9984647 0.9055697 -0.8461641 0.9984645 0.9055519 -0.8461589 0.9984643 0.9055319 -0.8461587 0.9984642 0.9055104 -0.8461687 0.998464 0.9054895 -0.8461977 0.9984638 0.905473 -0.8462598 0.9984638 0.9054678 -0.8463492 0.9984638 0.9054678 -0.8464623 0.9984638 0.9054678 -0.8466054 0.9984638 0.9054678 -0.8467864 0.9984638 0.9054678 -0.8470154 0.9984638 0.9054678 -0.8473052 0.9984638 0.9054678 -0.8476717 0.9984638 0.9054678 -0.8481355 0.9984638 0.9054678 -0.8487222 0.9984638 0.9054678 -0.8494644 0.9984638 0.9054678 -0.8504035 0.9984638 0.9054678 -0.8515915 0.9984638 0.9054678 -0.8530945 0.9984638 0.9054678 -0.8549959 0.9984638 0.9054678 -0.8574015 0.9984638 0.9054678 -0.8604449 0.9984638 0.9054678 -0.8642952 0.9984638 0.9054678 -0.8691663 0.9984638 0.9054678 -0.875329 0.9984638 0.9054678 -0.8831255 0.9984638 0.9054678 -0.892989 0.9984638 0.9054678 -0.9054678 0.9984638 0.9054678 -0.921255 0.9984638 0.9054678 -0.9412278 0.9984638 0.9054678 -0.9664961 0.9984638 0.9054678 -0.9984638 0.9984638 0.9054678 -0.9987895 0.9728171 0.9130957 -0.9990455 0.9614615 0.9233085 -0.999247 0.9584468 0.9341777 -0.9994057 0.9599976 0.9446144 -0.9995308 0.9637914 0.9540687 -0.9996295 0.968452 0.9623212 -0.9997074 0.9732039 0.9693452 -0.9997688 0.9776422 0.9752172 -0.9998174 0.9815844 0.9800622 -0.9998557 0.9849754 0.9840209 -0.999886 0.9878296 0.9872315 -0.9999099 0.9901951 0.9898206 -0.9999288 0.9921339 0.9918994 -0.9999437 0.9937096 0.9935629 -0.8750477 0.9987905 0.9132249 -0.8750466 0.9987905 0.9132232 -0.8750451 0.9987904 0.9132211 -0.8750434 0.9987904 0.9132184 -0.8750412 0.9987904 0.913215 -0.8750386 0.9987904 0.9132109 -0.8750355 0.9987903 0.9132057 -0.8750317 0.9987903 0.9131993 -0.8750274 0.9987902 0.9131915 -0.8750225 0.9987902 0.913182 -0.8750173 0.9987901 0.9131708 -0.8750124 0.99879 0.9131577 -0.8750088 0.9987899 0.9131429 -0.8750084 0.9987897 0.9131271 -0.8750145 0.9987896 0.9131117 -0.8750329 0.9987895 0.9130996 -0.8750727 0.9987895 0.9130957 -0.8751301 0.9987895 0.9130957 -0.8752028 0.9987895 0.9130957 -0.8752947 0.9987895 0.9130957 -0.8754109 0.9987895 0.9130957 -0.875558 0.9987895 0.9130957 -0.8757441 0.9987895 0.9130957 -0.8759795 0.9987895 0.9130957 -0.8762773 0.9987895 0.9130957 -0.8766541 0.9987895 0.9130957 -0.8771307 0.9987895 0.9130957 -0.8777338 0.9987895 0.9130957 -0.8784967 0.9987895 0.9130957 -0.8794619 0.9987895 0.9130957 -0.880683 0.9987895 0.9130957 -0.8822279 0.9987895 0.9130957 -0.8841823 0.9987895 0.9130957 -0.886655 0.9987895 0.9130957 -0.8897832 0.9987895 0.9130957 -0.8937407 0.9987895 0.9130957 -0.8987476 0.9987895 0.9130957 -0.9050819 0.9987895 0.9130957 -0.9130957 0.9987895 0.9130957 -0.9232341 0.9987895 0.9130957 -0.9360606 0.9987895 0.9130957 -0.9522877 0.9987895 0.9130957 -0.9728171 0.9987895 0.9130957 -0.9987895 0.9987895 0.9130957 -0.9990455 0.9780539 0.9233085 -0.999247 0.9690013 0.9341777 -0.9994057 0.9666876 0.9446144 -0.9995308 0.9680197 0.9540687 -0.9996295 0.9711183 0.9623212 -0.9997074 0.974882 0.9693452 -0.9997688 0.9786968 0.9752172 -0.9998174 0.9822464 0.9800622 -0.9998557 0.9853905 0.9840209 -0.999886 0.9880897 0.9872315 -0.9999099 0.990358 0.9898206 -0.9999288 0.9922358 0.9918994 -0.9999437 0.9937734 0.9935629 -0.8990028 0.9990461 0.9233996 -0.899002 0.9990461 0.9233984 -0.8990011 0.9990461 0.9233969 -0.899 0.9990461 0.923395 -0.8989986 0.9990461 0.9233927 -0.8989969 0.9990461 0.9233897 -0.8989948 0.9990461 0.9233861 -0.8989923 0.999046 0.9233816 -0.8989895 0.999046 0.923376 -0.8989863 0.9990459 0.9233694 -0.8989829 0.9990459 0.9233615 -0.8989796 0.9990458 0.9233522 -0.8989771 0.9990458 0.9233418 -0.8989767 0.9990457 0.9233306 -0.8989805 0.9990456 0.9233198 -0.8989921 0.9990456 0.9233112 -0.8990175 0.9990455 0.9233085 -0.8990542 0.9990455 0.9233085 -0.8991006 0.9990455 0.9233085 -0.8991593 0.9990455 0.9233085 -0.8992336 0.9990455 0.9233085 -0.8993275 0.9990455 0.9233085 -0.8994464 0.9990455 0.9233085 -0.8995968 0.9990455 0.9233085 -0.899787 0.9990455 0.9233085 -0.9000277 0.9990455 0.9233085 -0.9003323 0.9990455 0.9233085 -0.9007175 0.9990455 0.9233085 -0.9012049 0.9990455 0.9233085 -0.9018215 0.9990455 0.9233085 -0.9026016 0.9990455 0.9233085 -0.9035886 0.9990455 0.9233085 -0.9048372 0.9990455 0.9233085 -0.9064168 0.9990455 0.9233085 -0.9084153 0.9990455 0.9233085 -0.9109436 0.9990455 0.9233085 -0.9141422 0.9990455 0.9233085 -0.9181889 0.9990455 0.9233085 -0.9233085 0.9990455 0.9233085 -0.9297854 0.9990455 0.9233085 -0.9379796 0.9990455 0.9233085 -0.9483463 0.9990455 0.9233085 -0.9614615 0.9990455 0.9233085 -0.9780539 0.9990455 0.9233085 -0.9990455 0.9990455 0.9233085 -0.999247 0.982354 0.9341777 -0.9994057 0.9751513 0.9446144 -0.9995308 0.9733691 0.9540687 -0.9996295 0.9744915 0.9623212 -0.9997074 0.977005 0.9693452 -0.9997688 0.980031 0.9752172 -0.9998174 0.9830838 0.9800622 -0.9998557 0.9859157 0.9840209 -0.999886 0.9884188 0.9872315 -0.9999099 0.9905641 0.9898206 -0.9999288 0.9923648 0.9918994 -0.9999437 0.9938541 0.9935629 -0.9187175 0.9992474 0.9342401 -0.918717 0.9992474 0.9342393 -0.9187164 0.9992474 0.9342383 -0.9187157 0.9992474 0.934237 -0.9187148 0.9992474 0.9342353 -0.9187137 0.9992474 0.9342333 -0.9187123 0.9992473 0.9342308 -0.9187107 0.9992473 0.9342277 -0.9187089 0.9992473 0.934224 -0.9187068 0.9992473 0.9342194 -0.9187045 0.9992472 0.934214 -0.9187024 0.9992472 0.9342076 -0.9187008 0.9992472 0.9342005 -0.9187004 0.9992471 0.9341929 -0.9187027 0.9992471 0.9341854 -0.9187101 0.999247 0.9341796 -0.9187262 0.999247 0.9341777 -0.9187495 0.999247 0.9341777 -0.9187791 0.999247 0.9341777 -0.9188164 0.999247 0.9341777 -0.9188636 0.999247 0.9341777 -0.9189234 0.999247 0.9341777 -0.918999 0.999247 0.9341777 -0.9190947 0.999247 0.9341777 -0.9192157 0.999247 0.9341777 -0.9193688 0.999247 0.9341777 -0.9195625 0.999247 0.9341777 -0.9198076 0.999247 0.9341777 -0.9201176 0.999247 0.9341777 -0.9205098 0.999247 0.9341777 -0.9210061 0.999247 0.9341777 -0.9216339 0.999247 0.9341777 -0.9224281 0.999247 0.9341777 -0.9234329 0.999247 0.9341777 -0.9247041 0.999247 0.9341777 -0.9263124 0.999247 0.9341777 -0.928347 0.999247 0.9341777 -0.9309211 0.999247 0.9341777 -0.9341777 0.999247 0.9341777 -0.9382977 0.999247 0.9341777 -0.94351 0.999247 0.9341777 -0.9501042 0.999247 0.9341777 -0.9584468 0.999247 0.9341777 -0.9690013 0.999247 0.9341777 -0.982354 0.999247 0.9341777 -0.999247 0.999247 0.9341777 -0.9994057 0.9858591 0.9446144 -0.9995308 0.9801368 0.9540687 -0.9996295 0.978759 0.9623212 -0.9997074 0.9796909 0.9693452 -0.9997688 0.981719 0.9752172 -0.9998174 0.9841433 0.9800622 -0.9998557 0.9865801 0.9840209 -0.999886 0.9888351 0.9872315 -0.9999099 0.9908248 0.9898206 -0.9999288 0.992528 0.9918994 -0.9999437 0.9939562 0.9935629 -0.9348153 0.999406 0.9446563 -0.9348149 0.999406 0.9446557 -0.9348146 0.999406 0.944655 -0.9348141 0.999406 0.9446542 -0.9348135 0.999406 0.9446531 -0.9348128 0.9994059 0.9446517 -0.9348119 0.9994059 0.94465 -0.9348109 0.9994059 0.944648 -0.9348097 0.9994059 0.9446454 -0.9348083 0.9994059 0.9446424 -0.9348069 0.9994059 0.9446388 -0.9348055 0.9994059 0.9446345 -0.9348044 0.9994058 0.9446297 -0.9348042 0.9994058 0.9446246 -0.9348056 0.9994058 0.9446196 -0.9348102 0.9994057 0.9446157 -0.9348204 0.9994057 0.9446144 -0.9348352 0.9994057 0.9446144 -0.9348539 0.9994057 0.9446144 -0.9348776 0.9994057 0.9446144 -0.9349075 0.9994057 0.9446144 -0.9349454 0.9994057 0.9446144 -0.9349933 0.9994057 0.9446144 -0.935054 0.9994057 0.9446144 -0.9351307 0.9994057 0.9446144 -0.9352277 0.9994057 0.9446144 -0.9353505 0.9994057 0.9446144 -0.9355059 0.9994057 0.9446144 -0.9357024 0.9994057 0.9446144 -0.935951 0.9994057 0.9446144 -0.9362655 0.9994057 0.9446144 -0.9366635 0.9994057 0.9446144 -0.9371669 0.9994057 0.9446144 -0.9378038 0.9994057 0.9446144 -0.9386096 0.9994057 0.9446144 -0.939629 0.9994057 0.9446144 -0.9409186 0.9994057 0.9446144 -0.9425502 0.9994057 0.9446144 -0.9446144 0.9994057 0.9446144 -0.9472259 0.9994057 0.9446144 -0.9505298 0.9994057 0.9446144 -0.9547096 0.9994057 0.9446144 -0.9599976 0.9994057 0.9446144 -0.9666876 0.9994057 0.9446144 -0.9751513 0.9994057 0.9446144 -0.9858591 0.9994057 0.9446144 -0.9994057 0.9994057 0.9446144 -0.9995308 0.9886988 0.9540687 -0.9996295 0.9841579 0.9623212 -0.9997074 0.983089 0.9693452 -0.9997688 0.9838545 0.9752172 -0.9998174 0.9854838 0.9800622 -0.9998557 0.9874207 0.9840209 -0.999886 0.9893618 0.9872315 -0.9999099 0.9911547 0.9898206 -0.9999288 0.9927345 0.9918994 -0.9999437 0.9940854 0.9935629 -0.9478754 0.999531 0.9540963 -0.9478752 0.999531 0.9540959 -0.947875 0.999531 0.9540954 -0.9478746 0.999531 0.9540949 -0.9478743 0.999531 0.9540941 -0.9478738 0.999531 0.9540933 -0.9478733 0.999531 0.9540921 -0.9478726 0.999531 0.9540908 -0.9478718 0.999531 0.9540891 -0.947871 0.9995309 0.9540871 -0.94787 0.9995309 0.9540847 -0.9478691 0.9995309 0.9540819 -0.9478684 0.9995309 0.9540788 -0.9478683 0.9995309 0.9540754 -0.9478691 0.9995309 0.9540721 -0.947872 0.9995309 0.9540695 -0.9478785 0.9995308 0.9540687 -0.9478878 0.9995308 0.9540687 -0.9478997 0.9995308 0.9540687 -0.9479146 0.9995308 0.9540687 -0.9479335 0.9995308 0.9540687 -0.9479575 0.9995308 0.9540687 -0.9479878 0.9995308 0.9540687 -0.9480261 0.9995308 0.9540687 -0.9480746 0.9995308 0.9540687 -0.9481359 0.9995308 0.9540687 -0.9482135 0.9995308 0.9540687 -0.9483117 0.9995308 0.9540687 -0.9484359 0.9995308 0.9540687 -0.9485931 0.9995308 0.9540687 -0.9487918 0.9995308 0.9540687 -0.9490434 0.9995308 0.9540687 -0.9493615 0.9995308 0.9540687 -0.9497641 0.9995308 0.9540687 -0.9502734 0.9995308 0.9540687 -0.9509177 0.9995308 0.9540687 -0.9517328 0.9995308 0.9540687 -0.952764 0.9995308 0.9540687 -0.9540687 0.9995308 0.9540687 -0.9557192 0.9995308 0.9540687 -0.9578074 0.9995308 0.9540687 -0.9604492 0.9995308 0.9540687 -0.9637914 0.9995308 0.9540687 -0.9680197 0.9995308 0.9540687 -0.9733691 0.9995308 0.9540687 -0.9801368 0.9995308 0.9540687 -0.9886988 0.9995308 0.9540687 -0.9995308 0.9995308 0.9540687 -0.9996295 0.9909882 0.9623212 -0.9997074 0.9873879 0.9693452 -0.9997688 0.9865561 0.9752172 -0.9998174 0.9871796 0.9800622 -0.9998557 0.9884841 0.9840209 -0.999886 0.9900282 0.9872315 -0.9999099 0.991572 0.9898206 -0.9999288 0.9929957 0.9918994 -0.9999437 0.9942488 0.9935629 -0.958416 0.9996296 0.9623392 -0.9584159 0.9996296 0.9623389 -0.9584157 0.9996296 0.9623386 -0.9584155 0.9996296 0.9623382 -0.9584153 0.9996296 0.9623378 -0.958415 0.9996296 0.9623372 -0.9584146 0.9996296 0.9623365 -0.9584142 0.9996296 0.9623356 -0.9584137 0.9996296 0.9623345 -0.9584132 0.9996296 0.9623332 -0.9584126 0.9996296 0.9623316 -0.958412 0.9996296 0.9623298 -0.9584115 0.9996296 0.9623277 -0.9584114 0.9996295 0.9623255 -0.958412 0.9996295 0.9623234 -0.9584138 0.9996295 0.9623217 -0.9584178 0.9996295 0.9623212 -0.9584237 0.9996295 0.9623212 -0.9584312 0.9996295 0.9623212 -0.9584406 0.9996295 0.9623212 -0.9584526 0.9996295 0.9623212 -0.9584677 0.9996295 0.9623212 -0.9584868 0.9996295 0.9623212 -0.9585109 0.9996295 0.9623212 -0.9585415 0.9996295 0.9623212 -0.9585802 0.9996295 0.9623212 -0.9586291 0.9996295 0.9623212 -0.958691 0.9996295 0.9623212 -0.9587693 0.9996295 0.9623212 -0.9588684 0.9996295 0.9623212 -0.9589938 0.9996295 0.9623212 -0.9591524 0.9996295 0.9623212 -0.959353 0.9996295 0.9623212 -0.9596068 0.9996295 0.9623212 -0.959928 0.9996295 0.9623212 -0.9603343 0.9996295 0.9623212 -0.9608482 0.9996295 0.9623212 -0.9614985 0.9996295 0.9623212 -0.9623212 0.9996295 0.9623212 -0.963362 0.9996295 0.9623212 -0.9646787 0.9996295 0.9623212 -0.9663445 0.9996295 0.9623212 -0.968452 0.9996295 0.9623212 -0.9711183 0.9996295 0.9623212 -0.9744915 0.9996295 0.9623212 -0.978759 0.9996295 0.9623212 -0.9841579 0.9996295 0.9623212 -0.9909882 0.9996295 0.9623212 -0.9996295 0.9996295 0.9623212 -0.9997074 0.9928267 0.9693452 -0.9997688 0.9899741 0.9752172 -0.9998174 0.989325 0.9800622 -0.9998557 0.9898295 0.9840209 -0.999886 0.9908712 0.9872315 -0.9999099 0.9920999 0.9898206 -0.9999288 0.9933261 0.9918994 -0.9999437 0.9944556 0.9935629 -0.9668873 0.9997074 0.9693568 -0.9668872 0.9997074 0.9693566 -0.9668871 0.9997074 0.9693564 -0.966887 0.9997074 0.9693562 -0.9668869 0.9997074 0.9693559 -0.9668867 0.9997074 0.9693555 -0.9668865 0.9997074 0.969355 -0.9668862 0.9997074 0.9693545 -0.9668859 0.9997074 0.9693538 -0.9668855 0.9997074 0.9693529 -0.9668852 0.9997074 0.9693519 -0.9668848 0.9997074 0.9693507 -0.9668845 0.9997074 0.9693494 -0.9668844 0.9997074 0.969348 -0.9668847 0.9997074 0.9693466 -0.9668859 0.9997074 0.9693455 -0.9668884 0.9997074 0.9693452 -0.9668922 0.9997074 0.9693452 -0.9668969 0.9997074 0.9693452 -0.9669028 0.9997074 0.9693452 -0.9669103 0.9997074 0.9693452 -0.9669198 0.9997074 0.9693452 -0.9669318 0.9997074 0.9693452 -0.966947 0.9997074 0.9693452 -0.9669663 0.9997074 0.9693452 -0.9669906 0.9997074 0.9693452 -0.9670214 0.9997074 0.9693452 -0.9670604 0.9997074 0.9693452 -0.9671097 0.9997074 0.9693452 -0.967172 0.9997074 0.9693452 -0.9672509 0.9997074 0.9693452 -0.9673508 0.9997074 0.9693452 -0.967477 0.9997074 0.9693452 -0.9676368 0.9997074 0.9693452 -0.9678389 0.9997074 0.9693452 -0.9680946 0.9997074 0.9693452 -0.9684181 0.9997074 0.9693452 -0.9688274 0.9997074 0.9693452 -0.9693452 0.9997074 0.9693452 -0.9700002 0.9997074 0.9693452 -0.970829 0.9997074 0.9693452 -0.9718774 0.9997074 0.9693452 -0.9732039 0.9997074 0.9693452 -0.974882 0.9997074 0.9693452 -0.977005 0.9997074 0.9693452 -0.9796909 0.9997074 0.9693452 -0.983089 0.9997074 0.9693452 -0.9873879 0.9997074 0.9693452 -0.9928267 0.9997074 0.9693452 -0.9997074 0.9997074 0.9693452 -0.9997688 0.9942982 0.9752172 -0.9998174 0.9920392 0.9800622 -0.9998557 0.9915316 0.9840209 -0.999886 0.9919377 0.9872315 -0.9999099 0.9927678 0.9898206 -0.9999288 0.9937442 0.9918994 -0.9999437 0.9947172 0.9935629 -0.9736726 0.9997689 0.9752247 -0.9736726 0.9997689 0.9752246 -0.9736725 0.9997689 0.9752244 -0.9736724 0.9997689 0.9752243 -0.9736723 0.9997689 0.9752241 -0.9736722 0.9997689 0.9752238 -0.9736721 0.9997689 0.9752236 -0.9736719 0.9997689 0.9752232 -0.9736717 0.9997689 0.9752227 -0.9736715 0.9997689 0.9752222 -0.9736712 0.9997689 0.9752215 -0.973671 0.9997689 0.9752208 -0.9736708 0.9997689 0.9752199 -0.9736708 0.9997689 0.975219 -0.973671 0.9997688 0.9752181 -0.9736717 0.9997688 0.9752174 -0.9736733 0.9997688 0.9752172 -0.9736756 0.9997688 0.9752172 -0.9736786 0.9997688 0.9752172 -0.9736823 0.9997688 0.9752172 -0.973687 0.9997688 0.9752172 -0.973693 0.9997688 0.9752172 -0.9737006 0.9997688 0.9752172 -0.9737101 0.9997688 0.9752172 -0.9737222 0.9997688 0.9752172 -0.9737375 0.9997688 0.9752172 -0.9737569 0.9997688 0.9752172 -0.9737814 0.9997688 0.9752172 -0.9738123 0.9997688 0.9752172 -0.9738515 0.9997688 0.9752172 -0.9739011 0.9997688 0.9752172 -0.9739638 0.9997688 0.9752172 -0.9740432 0.9997688 0.9752172 -0.9741436 0.9997688 0.9752172 -0.9742706 0.9997688 0.9752172 -0.9744313 0.9997688 0.9752172 -0.9746346 0.9997688 0.9752172 -0.9748918 0.9997688 0.9752172 -0.9752172 0.9997688 0.9752172 -0.9756289 0.9997688 0.9752172 -0.9761497 0.9997688 0.9752172 -0.9768086 0.9997688 0.9752172 -0.9776422 0.9997688 0.9752172 -0.9786968 0.9997688 0.9752172 -0.980031 0.9997688 0.9752172 -0.981719 0.9997688 0.9752172 -0.9838545 0.9997688 0.9752172 -0.9865561 0.9997688 0.9752172 -0.9899741 0.9997688 0.9752172 -0.9942982 0.9997688 0.9752172 -0.9997688 0.9997688 0.9752172 -0.9998174 0.9954731 0.9800622 -0.9998557 0.9936849 0.9840209 -0.999886 0.993287 0.9872315 -0.9999099 0.9936128 0.9898206 -0.9999288 0.9942731 0.9918994 -0.9999437 0.9950481 0.9935629 -0.9790927 0.9998174 0.980067 -0.9790927 0.9998174 0.9800669 -0.9790927 0.9998174 0.9800668 -0.9790926 0.9998174 0.9800667 -0.9790925 0.9998174 0.9800666 -0.9790925 0.9998174 0.9800665 -0.9790924 0.9998174 0.9800663 -0.9790923 0.9998174 0.980066 -0.9790921 0.9998174 0.9800658 -0.979092 0.9998174 0.9800654 -0.9790919 0.9998174 0.980065 -0.9790917 0.9998174 0.9800645 -0.9790916 0.9998174 0.980064 -0.9790916 0.9998174 0.9800634 -0.9790917 0.9998174 0.9800628 -0.9790921 0.9998174 0.9800624 -0.9790931 0.9998174 0.9800622 -0.9790946 0.9998174 0.9800622 -0.9790965 0.9998174 0.9800622 -0.9790988 0.9998174 0.9800622 -0.9791018 0.9998174 0.9800622 -0.9791055 0.9998174 0.9800622 -0.9791103 0.9998174 0.9800622 -0.9791163 0.9998174 0.9800622 -0.9791238 0.9998174 0.9800622 -0.9791334 0.9998174 0.9800622 -0.9791456 0.9998174 0.9800622 -0.979161 0.9998174 0.9800622 -0.9791804 0.9998174 0.9800622 -0.979205 0.9998174 0.9800622 -0.9792361 0.9998174 0.9800622 -0.9792755 0.9998174 0.9800622 -0.9793253 0.9998174 0.9800622 -0.9793883 0.9998174 0.9800622 -0.9794681 0.9998174 0.9800622 -0.9795689 0.9998174 0.9800622 -0.9796966 0.9998174 0.9800622 -0.979858 0.9998174 0.9800622 -0.9800622 0.9998174 0.9800622 -0.9803206 0.9998174 0.9800622 -0.9806476 0.9998174 0.9800622 -0.9810611 0.9998174 0.9800622 -0.9815844 0.9998174 0.9800622 -0.9822464 0.9998174 0.9800622 -0.9830838 0.9998174 0.9800622 -0.9841433 0.9998174 0.9800622 -0.9854838 0.9998174 0.9800622 -0.9871796 0.9998174 0.9800622 -0.989325 0.9998174 0.9800622 -0.9920392 0.9998174 0.9800622 -0.9954731 0.9998174 0.9800622 -0.9998174 0.9998174 0.9800622 -0.9998557 0.9964092 0.9840209 -0.999886 0.9949941 0.9872315 -0.9999099 0.9946818 0.9898206 -0.9999288 0.9949422 0.9918994 -0.9999437 0.9954668 0.9935629 -0.9834129 0.9998557 0.9840239 -0.9834129 0.9998557 0.9840239 -0.9834129 0.9998557 0.9840238 -0.9834129 0.9998557 0.9840238 -0.9834128 0.9998557 0.9840237 -0.9834128 0.9998557 0.9840236 -0.9834127 0.9998557 0.9840235 -0.9834127 0.9998557 0.9840233 -0.9834126 0.9998557 0.9840231 -0.9834125 0.9998557 0.9840229 -0.9834124 0.9998557 0.9840227 -0.9834123 0.9998557 0.9840223 -0.9834122 0.9998557 0.984022 -0.9834122 0.9998557 0.9840216 -0.9834123 0.9998557 0.9840213 -0.9834126 0.9998557 0.984021 -0.9834132 0.9998557 0.9840209 -0.9834141 0.9998557 0.9840209 -0.9834153 0.9998557 0.9840209 -0.9834167 0.9998557 0.9840209 -0.9834186 0.9998557 0.9840209 -0.9834209 0.9998557 0.9840209 -0.9834239 0.9998557 0.9840209 -0.9834277 0.9998557 0.9840209 -0.9834324 0.9998557 0.9840209 -0.9834385 0.9998557 0.9840209 -0.9834461 0.9998557 0.9840209 -0.9834557 0.9998557 0.9840209 -0.9834679 0.9998557 0.9840209 -0.9834833 0.9998557 0.9840209 -0.9835029 0.9998557 0.9840209 -0.9835276 0.9998557 0.9840209 -0.9835588 0.9998557 0.9840209 -0.9835983 0.9998557 0.9840209 -0.9836483 0.9998557 0.9840209 -0.9837116 0.9998557 0.9840209 -0.9837916 0.9998557 0.9840209 -0.9838928 0.9998557 0.9840209 -0.9840209 0.9998557 0.9840209 -0.9841829 0.9998557 0.9840209 -0.984388 0.9998557 0.9840209 -0.9846473 0.9998557 0.9840209 -0.9849754 0.9998557 0.9840209 -0.9853905 0.9998557 0.9840209 -0.9859157 0.9998557 0.9840209 -0.9865801 0.9998557 0.9840209 -0.9874207 0.9998557 0.9840209 -0.9884841 0.9998557 0.9840209 -0.9898295 0.9998557 0.9840209 -0.9915316 0.9998557 0.9840209 -0.9936849 0.9998557 0.9840209 -0.9964092 0.9998557 0.9840209 -0.9998557 0.9998557 0.9840209 -0.999886 0.9971537 0.9872315 -0.9999099 0.9960342 0.9898206 -0.9999288 0.9957887 0.9918994 -0.9999437 0.9959964 0.9935629 -0.9868505 0.999886 0.9872334 -0.9868505 0.999886 0.9872333 -0.9868505 0.999886 0.9872333 -0.9868505 0.999886 0.9872333 -0.9868504 0.999886 0.9872332 -0.9868504 0.999886 0.9872332 -0.9868504 0.999886 0.9872331 -0.9868503 0.999886 0.987233 -0.9868503 0.999886 0.9872329 -0.9868502 0.999886 0.9872327 -0.9868502 0.999886 0.9872326 -0.9868501 0.999886 0.9872324 -0.9868501 0.999886 0.9872322 -0.98685 0.999886 0.9872319 -0.9868501 0.999886 0.9872317 -0.9868503 0.999886 0.9872315 -0.9868507 0.999886 0.9872315 -0.9868512 0.999886 0.9872315 -0.986852 0.999886 0.9872315 -0.9868529 0.999886 0.9872315 -0.9868541 0.999886 0.9872315 -0.9868555 0.999886 0.9872315 -0.9868574 0.999886 0.9872315 -0.9868597 0.999886 0.9872315 -0.9868627 0.999886 0.9872315 -0.9868665 0.999886 0.9872315 -0.9868713 0.999886 0.9872315 -0.9868773 0.999886 0.9872315 -0.986885 0.999886 0.9872315 -0.9868946 0.999886 0.9872315 -0.9869069 0.999886 0.9872315 -0.9869223 0.999886 0.9872315 -0.9869419 0.999886 0.9872315 -0.9869667 0.999886 0.9872315 -0.986998 0.999886 0.9872315 -0.9870376 0.999886 0.9872315 -0.9870878 0.999886 0.9872315 -0.9871512 0.999886 0.9872315 -0.9872315 0.999886 0.9872315 -0.987333 0.999886 0.9872315 -0.9874615 0.999886 0.9872315 -0.987624 0.999886 0.9872315 -0.9878296 0.999886 0.9872315 -0.9880897 0.999886 0.9872315 -0.9884188 0.999886 0.9872315 -0.9888351 0.999886 0.9872315 -0.9893618 0.999886 0.9872315 -0.9900282 0.999886 0.9872315 -0.9908712 0.999886 0.9872315 -0.9919377 0.999886 0.9872315 -0.993287 0.999886 0.9872315 -0.9949941 0.999886 0.9872315 -0.9971537 0.999886 0.9872315 -0.999886 0.999886 0.9872315 -0.9999099 0.9977452 0.9898206 -0.9999288 0.9968597 0.9918994 -0.9999437 0.9966665 0.9935629 -0.989582 0.9999099 0.9898218 -0.989582 0.9999099 0.9898218 -0.989582 0.9999099 0.9898217 -0.989582 0.9999099 0.9898217 -0.989582 0.9999099 0.9898217 -0.9895819 0.9999099 0.9898216 -0.9895819 0.9999099 0.9898216 -0.9895819 0.9999099 0.9898215 -0.9895819 0.9999099 0.9898215 -0.9895818 0.9999099 0.9898214 -0.9895818 0.9999099 0.9898213 -0.9895818 0.9999099 0.9898212 -0.9895817 0.9999099 0.989821 -0.9895817 0.9999099 0.9898209 -0.9895817 0.9999099 0.9898207 -0.9895819 0.9999099 0.9898206 -0.9895821 0.9999099 0.9898206 -0.9895825 0.9999099 0.9898206 -0.9895829 0.9999099 0.9898206 -0.9895835 0.9999099 0.9898206 -0.9895842 0.9999099 0.9898206 -0.9895851 0.9999099 0.9898206 -0.9895863 0.9999099 0.9898206 -0.9895878 0.9999099 0.9898206 -0.9895897 0.9999099 0.9898206 -0.989592 0.9999099 0.9898206 -0.989595 0.9999099 0.9898206 -0.9895988 0.9999099 0.9898206 -0.9896036 0.9999099 0.9898206 -0.9896096 0.9999099 0.9898206 -0.9896173 0.9999099 0.9898206 -0.989627 0.9999099 0.9898206 -0.9896392 0.9999099 0.9898206 -0.9896547 0.9999099 0.9898206 -0.9896744 0.9999099 0.9898206 -0.9896992 0.9999099 0.9898206 -0.9897306 0.9999099 0.9898206 -0.9897703 0.9999099 0.9898206 -0.9898206 0.9999099 0.9898206 -0.9898842 0.9999099 0.9898206 -0.9899646 0.9999099 0.9898206 -0.9900664 0.9999099 0.9898206 -0.9901951 0.9999099 0.9898206 -0.990358 0.9999099 0.9898206 -0.9905641 0.9999099 0.9898206 -0.9908248 0.9999099 0.9898206 -0.9911547 0.9999099 0.9898206 -0.991572 0.9999099 0.9898206 -0.9920999 0.9999099 0.9898206 -0.9927678 0.9999099 0.9898206 -0.9936128 0.9999099 0.9898206 -0.9946818 0.9999099 0.9898206 -0.9960342 0.9999099 0.9898206 -0.9977452 0.9999099 0.9898206 -0.9999099 0.9999099 0.9898206 -0.9999288 0.9982146 0.9918994 -0.9999437 0.9975143 0.9935629 -0.9917501 0.9999288 0.9919002 -0.9917501 0.9999288 0.9919002 -0.9917501 0.9999288 0.9919002 -0.9917501 0.9999288 0.9919001 -0.9917501 0.9999288 0.9919001 -0.9917501 0.9999288 0.9919001 -0.99175 0.9999288 0.9919001 -0.99175 0.9999288 0.9919 -0.99175 0.9999288 0.9919 -0.99175 0.9999288 0.9918999 -0.99175 0.9999288 0.9918999 -0.9917499 0.9999288 0.9918998 -0.9917499 0.9999288 0.9918997 -0.9917499 0.9999288 0.9918996 -0.9917499 0.9999288 0.9918995 -0.99175 0.9999288 0.9918994 -0.9917502 0.9999288 0.9918994 -0.9917504 0.9999288 0.9918994 -0.9917507 0.9999288 0.9918994 -0.991751 0.9999288 0.9918994 -0.9917515 0.9999288 0.9918994 -0.9917521 0.9999288 0.9918994 -0.9917528 0.9999288 0.9918994 -0.9917537 0.9999288 0.9918994 -0.9917549 0.9999288 0.9918994 -0.9917564 0.9999288 0.9918994 -0.9917582 0.9999288 0.9918994 -0.9917606 0.9999288 0.9918994 -0.9917636 0.9999288 0.9918994 -0.9917674 0.9999288 0.9918994 -0.9917722 0.9999288 0.9918994 -0.9917782 0.9999288 0.9918994 -0.9917859 0.9999288 0.9918994 -0.9917956 0.9999288 0.9918994 -0.9918079 0.9999288 0.9918994 -0.9918234 0.9999288 0.9918994 -0.9918431 0.9999288 0.9918994 -0.991868 0.9999288 0.9918994 -0.9918994 0.9999288 0.9918994 -0.9919392 0.9999288 0.9918994 -0.9919896 0.9999288 0.9918994 -0.9920533 0.9999288 0.9918994 -0.9921339 0.9999288 0.9918994 -0.9922358 0.9999288 0.9918994 -0.9923648 0.9999288 0.9918994 -0.992528 0.9999288 0.9918994 -0.9927345 0.9999288 0.9918994 -0.9929957 0.9999288 0.9918994 -0.9933261 0.9999288 0.9918994 -0.9937442 0.9999288 0.9918994 -0.9942731 0.9999288 0.9918994 -0.9949422 0.9999288 0.9918994 -0.9957887 0.9999288 0.9918994 -0.9968597 0.9999288 0.9918994 -0.9982146 0.9999288 0.9918994 -0.9999288 0.9999288 0.9918994 -0.9999437 0.9985868 0.9935629 -0.9934695 0.9999437 0.9935634 -0.9934695 0.9999437 0.9935634 -0.9934695 0.9999437 0.9935634 -0.9934695 0.9999437 0.9935634 -0.9934695 0.9999437 0.9935634 -0.9934695 0.9999437 0.9935633 -0.9934695 0.9999437 0.9935633 -0.9934694 0.9999437 0.9935633 -0.9934694 0.9999437 0.9935633 -0.9934694 0.9999437 0.9935632 -0.9934694 0.9999437 0.9935632 -0.9934694 0.9999437 0.9935631 -0.9934694 0.9999437 0.9935631 -0.9934694 0.9999437 0.993563 -0.9934694 0.9999437 0.993563 -0.9934694 0.9999437 0.9935629 -0.9934695 0.9999437 0.9935629 -0.9934697 0.9999437 0.9935629 -0.9934698 0.9999437 0.9935629 -0.9934701 0.9999437 0.9935629 -0.9934704 0.9999437 0.9935629 -0.9934707 0.9999437 0.9935629 -0.9934712 0.9999437 0.9935629 -0.9934718 0.9999437 0.9935629 -0.9934725 0.9999437 0.9935629 -0.9934734 0.9999437 0.9935629 -0.9934746 0.9999437 0.9935629 -0.9934761 0.9999437 0.9935629 -0.9934779 0.9999437 0.9935629 -0.9934803 0.9999437 0.9935629 -0.9934833 0.9999437 0.9935629 -0.9934871 0.9999437 0.9935629 -0.9934919 0.9999437 0.9935629 -0.993498 0.9999437 0.9935629 -0.9935057 0.9999437 0.9935629 -0.9935154 0.9999437 0.9935629 -0.9935277 0.9999437 0.9935629 -0.9935432 0.9999437 0.9935629 -0.9935629 0.9999437 0.9935629 -0.9935878 0.9999437 0.9935629 -0.9936193 0.9999437 0.9935629 -0.9936592 0.9999437 0.9935629 -0.9937096 0.9999437 0.9935629 -0.9937734 0.9999437 0.9935629 -0.9938541 0.9999437 0.9935629 -0.9939562 0.9999437 0.9935629 -0.9940854 0.9999437 0.9935629 -0.9942488 0.9999437 0.9935629 -0.9944556 0.9999437 0.9935629 -0.9947172 0.9999437 0.9935629 -0.9950481 0.9999437 0.9935629 -0.9954668 0.9999437 0.9935629 -0.9959964 0.9999437 0.9935629 -0.9966665 0.9999437 0.9935629 -0.9975143 0.9999437 0.9935629 -0.9985868 0.9999437 0.9935629 -0.9999437 0.9999437 0.9935629 -0.7251659 0.7251659 0.9968475 -0.7251734 0.7251659 0.9968475 -0.7251829 0.7251659 0.9968475 -0.7251949 0.7251659 0.9968475 -0.72521 0.7251659 0.9968475 -0.7252292 0.7251659 0.9968475 -0.7252535 0.7251659 0.9968475 -0.7252842 0.7251659 0.9968475 -0.725323 0.7251659 0.9968475 -0.7253722 0.7251659 0.9968475 -0.7254343 0.7251659 0.9968475 -0.725513 0.7251659 0.9968475 -0.7256124 0.7251659 0.9968475 -0.7257383 0.7251659 0.9968475 -0.7258976 0.7251659 0.9968475 -0.726099 0.7251659 0.9968475 -0.7263539 0.7251659 0.9968475 -0.7266763 0.7251659 0.9968475 -0.7270843 0.7251659 0.9968475 -0.7276003 0.7251659 0.9968475 -0.7282533 0.7251659 0.9968475 -0.7290793 0.7251659 0.9968475 -0.7301243 0.7251659 0.9968475 -0.7314464 0.7251659 0.9968475 -0.7331191 0.7251659 0.9968475 -0.7352352 0.7251659 0.9968475 -0.7379123 0.7251659 0.9968475 -0.7412993 0.7251659 0.9968475 -0.7455842 0.7251659 0.9968475 -0.7510052 0.7251659 0.9968475 -0.7578634 0.7251659 0.9968475 -0.76654 0.7251659 0.9968475 -0.7775169 0.7251659 0.9968475 -0.7914042 0.7251659 0.9968475 -0.8089735 0.7251659 0.9968475 -0.8312009 0.7251659 0.9968475 -0.8593214 0.7251659 0.9968475 -0.8948976 0.7251659 0.9968475 -0.939906 0.7251659 0.9968475 -0.9968475 0.7251659 0.9968475 -0.997523 0.7716588 0.9501853 -0.9980513 0.8119154 0.9282055 -0.9984653 0.8462171 0.9214008 -0.9987905 0.8750477 0.9233482 -0.9990461 0.8990028 0.9298688 -0.9992474 0.9187175 0.9383562 -0.999406 0.9348153 0.9472658 -0.999531 0.9478754 0.9557458 -0.9996296 0.958416 0.9633794 -0.9997074 0.9668873 0.9700116 -0.9997689 0.9736726 0.9756362 -0.9998174 0.9790927 0.9803253 -0.9998557 0.9834129 0.9841859 -0.999886 0.9868505 0.9873349 -0.9999099 0.989582 0.9898854 -0.9999288 0.9917501 0.99194 -0.9999437 0.9934695 0.9935883 -0.7251659 0.7251734 0.9968475 -0.7251605 0.7251605 0.9968474 -0.72517 0.7251605 0.9968474 -0.725182 0.7251605 0.9968474 -0.7251971 0.7251605 0.9968474 -0.7252163 0.7251605 0.9968474 -0.7252406 0.7251605 0.9968474 -0.7252713 0.7251605 0.9968474 -0.7253101 0.7251605 0.9968474 -0.7253592 0.7251605 0.9968474 -0.7254214 0.7251605 0.9968474 -0.7255 0.7251605 0.9968474 -0.7255995 0.7251605 0.9968474 -0.7257254 0.7251605 0.9968474 -0.7258847 0.7251605 0.9968474 -0.7260861 0.7251605 0.9968474 -0.726341 0.7251605 0.9968474 -0.7266635 0.7251605 0.9968474 -0.7270714 0.7251605 0.9968474 -0.7275875 0.7251605 0.9968474 -0.7282405 0.7251605 0.9968474 -0.7290666 0.7251605 0.9968474 -0.7301116 0.7251605 0.9968474 -0.7314338 0.7251605 0.9968474 -0.7331065 0.7251605 0.9968474 -0.7352227 0.7251605 0.9968474 -0.7379 0.7251605 0.9968474 -0.7412871 0.7251605 0.9968474 -0.7455722 0.7251605 0.9968474 -0.7509934 0.7251605 0.9968474 -0.757852 0.7251605 0.9968474 -0.766529 0.7251605 0.9968474 -0.7775065 0.7251605 0.9968474 -0.7913944 0.7251605 0.9968474 -0.8089645 0.7251605 0.9968474 -0.831193 0.7251605 0.9968474 -0.8593148 0.7251605 0.9968474 -0.8948926 0.7251605 0.9968474 -0.9399032 0.7251605 0.9968474 -0.9968474 0.7251605 0.9968474 -0.997523 0.7716551 0.9501835 -0.9980512 0.8119128 0.9282033 -0.9984653 0.8462154 0.9213989 -0.9987905 0.8750466 0.9233467 -0.9990461 0.899002 0.9298677 -0.9992474 0.918717 0.9383554 -0.999406 0.9348149 0.9472652 -0.999531 0.9478752 0.9557455 -0.9996296 0.9584159 0.9633792 -0.9997074 0.9668872 0.9700114 -0.9997689 0.9736726 0.9756361 -0.9998174 0.9790927 0.9803253 -0.9998557 0.9834129 0.9841859 -0.999886 0.9868505 0.9873349 -0.9999099 0.989582 0.9898853 -0.9999288 0.9917501 0.99194 -0.9999437 0.9934695 0.9935883 -0.7251659 0.7251829 0.9968475 -0.7251605 0.72517 0.9968474 -0.7251537 0.7251537 0.9968473 -0.7251657 0.7251537 0.9968473 -0.7251809 0.7251537 0.9968473 -0.7252001 0.7251537 0.9968473 -0.7252243 0.7251537 0.9968473 -0.725255 0.7251537 0.9968473 -0.7252939 0.7251537 0.9968473 -0.725343 0.7251537 0.9968473 -0.7254052 0.7251537 0.9968473 -0.7254838 0.7251537 0.9968473 -0.7255833 0.7251537 0.9968473 -0.7257092 0.7251537 0.9968473 -0.7258685 0.7251537 0.9968473 -0.7260699 0.7251537 0.9968473 -0.7263248 0.7251537 0.9968473 -0.7266473 0.7251537 0.9968473 -0.7270553 0.7251537 0.9968473 -0.7275714 0.7251537 0.9968473 -0.7282244 0.7251537 0.9968473 -0.7290505 0.7251537 0.9968473 -0.7300957 0.7251537 0.9968473 -0.7314179 0.7251537 0.9968473 -0.7330907 0.7251537 0.9968473 -0.7352071 0.7251537 0.9968473 -0.7378845 0.7251537 0.9968473 -0.7412718 0.7251537 0.9968473 -0.7455572 0.7251537 0.9968473 -0.7509787 0.7251537 0.9968473 -0.7578377 0.7251537 0.9968473 -0.7665152 0.7251537 0.9968473 -0.7774933 0.7251537 0.9968473 -0.7913821 0.7251537 0.9968473 -0.8089533 0.7251537 0.9968473 -0.831183 0.7251537 0.9968473 -0.8593065 0.7251537 0.9968473 -0.8948865 0.7251537 0.9968473 -0.9398997 0.7251537 0.9968473 -0.9968473 0.7251537 0.9968473 -0.9975229 0.7716504 0.9501811 -0.9980512 0.8119096 0.9282006 -0.9984653 0.8462132 0.9213965 -0.9987904 0.8750451 0.9233448 -0.9990461 0.8990011 0.9298664 -0.9992474 0.9187164 0.9383544 -0.999406 0.9348146 0.9472646 -0.999531 0.947875 0.955745 -0.9996296 0.9584157 0.9633789 -0.9997074 0.9668871 0.9700112 -0.9997689 0.9736725 0.975636 -0.9998174 0.9790927 0.9803252 -0.9998557 0.9834129 0.9841858 -0.999886 0.9868505 0.9873348 -0.9999099 0.989582 0.9898853 -0.9999288 0.9917501 0.99194 -0.9999437 0.9934695 0.9935883 -0.7251659 0.7251949 0.9968475 -0.7251605 0.725182 0.9968474 -0.7251537 0.7251657 0.9968473 -0.7251454 0.7251454 0.9968472 -0.7251605 0.7251454 0.9968472 -0.7251797 0.7251454 0.9968472 -0.725204 0.7251454 0.9968472 -0.7252347 0.7251454 0.9968472 -0.7252735 0.7251454 0.9968472 -0.7253227 0.7251454 0.9968472 -0.7253848 0.7251454 0.9968472 -0.7254635 0.7251454 0.9968472 -0.725563 0.7251454 0.9968472 -0.7256889 0.7251454 0.9968472 -0.7258482 0.7251454 0.9968472 -0.7260496 0.7251454 0.9968472 -0.7263046 0.7251454 0.9968472 -0.7266271 0.7251454 0.9968472 -0.7270351 0.7251454 0.9968472 -0.7275513 0.7251454 0.9968472 -0.7282043 0.7251454 0.9968472 -0.7290305 0.7251454 0.9968472 -0.7300757 0.7251454 0.9968472 -0.731398 0.7251454 0.9968472 -0.733071 0.7251454 0.9968472 -0.7351875 0.7251454 0.9968472 -0.7378651 0.7251454 0.9968472 -0.7412527 0.7251454 0.9968472 -0.7455383 0.7251454 0.9968472 -0.7509603 0.7251454 0.9968472 -0.7578198 0.7251454 0.9968472 -0.7664979 0.7251454 0.9968472 -0.7774769 0.7251454 0.9968472 -0.7913667 0.7251454 0.9968472 -0.8089391 0.7251454 0.9968472 -0.8311705 0.7251454 0.9968472 -0.8592962 0.7251454 0.9968472 -0.8948788 0.7251454 0.9968472 -0.9398953 0.7251454 0.9968472 -0.9968472 0.7251454 0.9968472 -0.9975228 0.7716446 0.9501782 -0.9980511 0.8119057 0.9281971 -0.9984653 0.8462106 0.9213934 -0.9987904 0.8750434 0.9233424 -0.9990461 0.899 0.9298646 -0.9992474 0.9187157 0.9383532 -0.999406 0.9348141 0.9472638 -0.999531 0.9478746 0.9557445 -0.9996296 0.9584155 0.9633786 -0.9997074 0.966887 0.970011 -0.9997689 0.9736724 0.9756358 -0.9998174 0.9790926 0.9803251 -0.9998557 0.9834129 0.9841858 -0.999886 0.9868505 0.9873348 -0.9999099 0.989582 0.9898853 -0.9999288 0.9917501 0.9919399 -0.9999437 0.9934695 0.9935883 -0.7251659 0.72521 0.9968475 -0.7251605 0.7251971 0.9968474 -0.7251537 0.7251809 0.9968473 -0.7251454 0.7251605 0.9968472 -0.7251351 0.7251351 0.996847 -0.7251543 0.7251351 0.996847 -0.7251785 0.7251351 0.996847 -0.7252093 0.7251351 0.996847 -0.7252481 0.7251351 0.996847 -0.7252972 0.7251351 0.996847 -0.7253594 0.7251351 0.996847 -0.7254381 0.7251351 0.996847 -0.7255376 0.7251351 0.996847 -0.7256635 0.7251351 0.996847 -0.7258228 0.7251351 0.996847 -0.7260243 0.7251351 0.996847 -0.7262792 0.7251351 0.996847 -0.7266018 0.7251351 0.996847 -0.7270098 0.7251351 0.996847 -0.7275261 0.7251351 0.996847 -0.7281792 0.7251351 0.996847 -0.7290054 0.7251351 0.996847 -0.7300507 0.7251351 0.996847 -0.7313732 0.7251351 0.996847 -0.7330463 0.7251351 0.996847 -0.735163 0.7251351 0.996847 -0.7378409 0.7251351 0.996847 -0.7412287 0.7251351 0.996847 -0.7455148 0.7251351 0.996847 -0.7509373 0.7251351 0.996847 -0.7577974 0.7251351 0.996847 -0.7664763 0.7251351 0.996847 -0.7774563 0.7251351 0.996847 -0.7913474 0.7251351 0.996847 -0.8089215 0.7251351 0.996847 -0.831155 0.7251351 0.996847 -0.8592832 0.7251351 0.996847 -0.8948691 0.7251351 0.996847 -0.9398899 0.7251351 0.996847 -0.996847 0.7251351 0.996847 -0.9975227 0.7716375 0.9501745 -0.9980511 0.8119009 0.9281928 -0.9984652 0.8462073 0.9213897 -0.9987904 0.8750412 0.9233395 -0.9990461 0.8989986 0.9298625 -0.9992474 0.9187148 0.9383517 -0.999406 0.9348135 0.9472627 -0.999531 0.9478743 0.9557438 -0.9996296 0.9584153 0.9633781 -0.9997074 0.9668869 0.9700107 -0.9997689 0.9736723 0.9756356 -0.9998174 0.9790925 0.980325 -0.9998557 0.9834128 0.9841857 -0.999886 0.9868504 0.9873347 -0.9999099 0.989582 0.9898853 -0.9999288 0.9917501 0.9919399 -0.9999437 0.9934695 0.9935883 -0.7251659 0.7252292 0.9968475 -0.7251605 0.7252163 0.9968474 -0.7251537 0.7252001 0.9968473 -0.7251454 0.7251797 0.9968472 -0.7251351 0.7251543 0.996847 -0.7251226 0.7251226 0.9968468 -0.7251469 0.7251226 0.9968468 -0.7251776 0.7251226 0.9968468 -0.7252164 0.7251226 0.9968468 -0.7252656 0.7251226 0.9968468 -0.7253278 0.7251226 0.9968468 -0.7254064 0.7251226 0.9968468 -0.725506 0.7251226 0.9968468 -0.7256319 0.7251226 0.9968468 -0.7257912 0.7251226 0.9968468 -0.7259927 0.7251226 0.9968468 -0.7262477 0.7251226 0.9968468 -0.7265703 0.7251226 0.9968468 -0.7269784 0.7251226 0.9968468 -0.7274947 0.7251226 0.9968468 -0.7281478 0.7251226 0.9968468 -0.7289742 0.7251226 0.9968468 -0.7300196 0.7251226 0.9968468 -0.7313422 0.7251226 0.9968468 -0.7330155 0.7251226 0.9968468 -0.7351325 0.7251226 0.9968468 -0.7378107 0.7251226 0.9968468 -0.7411989 0.7251226 0.9968468 -0.7454855 0.7251226 0.9968468 -0.7509086 0.7251226 0.9968468 -0.7577695 0.7251226 0.9968468 -0.7664494 0.7251226 0.9968468 -0.7774307 0.7251226 0.9968468 -0.7913234 0.7251226 0.9968468 -0.8088995 0.7251226 0.9968468 -0.8311356 0.7251226 0.9968468 -0.8592671 0.7251226 0.9968468 -0.8948571 0.7251226 0.9968468 -0.9398831 0.7251226 0.9968468 -0.9968468 0.7251226 0.9968468 -0.9975226 0.7716288 0.95017 -0.998051 0.8118949 0.9281875 -0.9984652 0.8462034 0.9213849 -0.9987904 0.8750386 0.9233358 -0.9990461 0.8989969 0.9298598 -0.9992474 0.9187137 0.9383498 -0.9994059 0.9348128 0.9472614 -0.999531 0.9478738 0.9557429 -0.9996296 0.958415 0.9633775 -0.9997074 0.9668867 0.9700103 -0.9997689 0.9736722 0.9756354 -0.9998174 0.9790925 0.9803248 -0.9998557 0.9834128 0.9841856 -0.999886 0.9868504 0.9873347 -0.9999099 0.9895819 0.9898852 -0.9999288 0.9917501 0.9919399 -0.9999437 0.9934695 0.9935882 -0.7251659 0.7252535 0.9968475 -0.7251605 0.7252406 0.9968474 -0.7251537 0.7252243 0.9968473 -0.7251454 0.725204 0.9968472 -0.7251351 0.7251785 0.996847 -0.7251226 0.7251469 0.9968468 -0.7251076 0.7251076 0.9968465 -0.7251383 0.7251076 0.9968465 -0.7251772 0.7251076 0.9968465 -0.7252263 0.7251076 0.9968465 -0.7252885 0.7251076 0.9968465 -0.7253672 0.7251076 0.9968465 -0.7254668 0.7251076 0.9968465 -0.7255927 0.7251076 0.9968465 -0.725752 0.7251076 0.9968465 -0.7259536 0.7251076 0.9968465 -0.7262086 0.7251076 0.9968465 -0.7265312 0.7251076 0.9968465 -0.7269394 0.7251076 0.9968465 -0.7274557 0.7251076 0.9968465 -0.728109 0.7251076 0.9968465 -0.7289355 0.7251076 0.9968465 -0.7299811 0.7251076 0.9968465 -0.7313039 0.7251076 0.9968465 -0.7329774 0.7251076 0.9968465 -0.7350946 0.7251076 0.9968465 -0.7377732 0.7251076 0.9968465 -0.7411619 0.7251076 0.9968465 -0.7454491 0.7251076 0.9968465 -0.750873 0.7251076 0.9968465 -0.7577349 0.7251076 0.9968465 -0.7664161 0.7251076 0.9968465 -0.7773989 0.7251076 0.9968465 -0.7912937 0.7251076 0.9968465 -0.8088723 0.7251076 0.9968465 -0.8311115 0.7251076 0.9968465 -0.8592471 0.7251076 0.9968465 -0.8948422 0.7251076 0.9968465 -0.9398746 0.7251076 0.9968465 -0.9968465 0.7251076 0.9968465 -0.9975224 0.7716184 0.9501643 -0.9980509 0.8118878 0.9281809 -0.9984651 0.8461986 0.9213791 -0.9987903 0.8750355 0.9233312 -0.9990461 0.8989948 0.9298564 -0.9992473 0.9187123 0.9383474 -0.9994059 0.9348119 0.9472598 -0.999531 0.9478733 0.9557418 -0.9996296 0.9584146 0.9633768 -0.9997074 0.9668865 0.9700099 -0.9997689 0.9736721 0.9756351 -0.9998174 0.9790924 0.9803246 -0.9998557 0.9834127 0.9841855 -0.999886 0.9868504 0.9873346 -0.9999099 0.9895819 0.9898852 -0.9999288 0.99175 0.9919399 -0.9999437 0.9934695 0.9935882 -0.7251659 0.7252842 0.9968475 -0.7251605 0.7252713 0.9968474 -0.7251537 0.725255 0.9968473 -0.7251454 0.7252347 0.9968472 -0.7251351 0.7252093 0.996847 -0.7251226 0.7251776 0.9968468 -0.7251076 0.7251383 0.9968465 -0.7250899 0.7250899 0.9968462 -0.7251288 0.7250899 0.9968462 -0.725178 0.7250899 0.9968462 -0.7252402 0.7250899 0.9968462 -0.7253189 0.7250899 0.9968462 -0.7254184 0.7250899 0.9968462 -0.7255444 0.7250899 0.9968462 -0.7257037 0.7250899 0.9968462 -0.7259053 0.7250899 0.9968462 -0.7261604 0.7250899 0.9968462 -0.7264831 0.7250899 0.9968462 -0.7268913 0.7250899 0.9968462 -0.7274078 0.7250899 0.9968462 -0.7280611 0.7250899 0.9968462 -0.7288878 0.7250899 0.9968462 -0.7299335 0.7250899 0.9968462 -0.7312566 0.7250899 0.9968462 -0.7329304 0.7250899 0.9968462 -0.735048 0.7250899 0.9968462 -0.7377271 0.7250899 0.9968462 -0.7411164 0.7250899 0.9968462 -0.7454044 0.7250899 0.9968462 -0.7508292 0.7250899 0.9968462 -0.7576923 0.7250899 0.9968462 -0.766375 0.7250899 0.9968462 -0.7773598 0.7250899 0.9968462 -0.791257 0.7250899 0.9968462 -0.8088387 0.7250899 0.9968462 -0.8310819 0.7250899 0.9968462 -0.8592224 0.7250899 0.9968462 -0.8948238 0.7250899 0.9968462 -0.9398642 0.7250899 0.9968462 -0.9968462 0.7250899 0.9968462 -0.9975222 0.7716061 0.9501574 -0.9980508 0.8118794 0.9281727 -0.998465 0.8461929 0.9213719 -0.9987903 0.8750317 0.9233256 -0.999046 0.8989923 0.9298523 -0.9992473 0.9187107 0.9383446 -0.9994059 0.9348109 0.9472579 -0.999531 0.9478726 0.9557405 -0.9996296 0.9584142 0.963376 -0.9997074 0.9668862 0.9700093 -0.9997689 0.9736719 0.9756348 -0.9998174 0.9790923 0.9803244 -0.9998557 0.9834127 0.9841853 -0.999886 0.9868503 0.9873345 -0.9999099 0.9895819 0.9898851 -0.9999288 0.99175 0.9919398 -0.9999437 0.9934694 0.9935882 -0.7251659 0.725323 0.9968475 -0.7251605 0.7253101 0.9968474 -0.7251537 0.7252939 0.9968473 -0.7251454 0.7252735 0.9968472 -0.7251351 0.7252481 0.996847 -0.7251226 0.7252164 0.9968468 -0.7251076 0.7251772 0.9968465 -0.7250899 0.7251288 0.9968462 -0.7250697 0.7250697 0.9968458 -0.7251188 0.7250697 0.9968458 -0.7251811 0.7250697 0.9968458 -0.7252598 0.7250697 0.9968458 -0.7253594 0.7250697 0.9968458 -0.7254853 0.7250697 0.9968458 -0.7256447 0.7250697 0.9968458 -0.7258464 0.7250697 0.9968458 -0.7261015 0.7250697 0.9968458 -0.7264242 0.7250697 0.9968458 -0.7268325 0.7250697 0.9968458 -0.7273491 0.7250697 0.9968458 -0.7280026 0.7250697 0.9968458 -0.7288294 0.7250697 0.9968458 -0.7298754 0.7250697 0.9968458 -0.7311988 0.7250697 0.9968458 -0.7328729 0.7250697 0.9968458 -0.734991 0.7250697 0.9968458 -0.7376706 0.7250697 0.9968458 -0.7410607 0.7250697 0.9968458 -0.7453496 0.7250697 0.9968458 -0.7507756 0.7250697 0.9968458 -0.7576402 0.7250697 0.9968458 -0.7663248 0.7250697 0.9968458 -0.7773119 0.7250697 0.9968458 -0.7912121 0.7250697 0.9968458 -0.8087977 0.7250697 0.9968458 -0.8310457 0.7250697 0.9968458 -0.8591922 0.7250697 0.9968458 -0.8948014 0.7250697 0.9968458 -0.9398515 0.7250697 0.9968458 -0.9968458 0.7250697 0.9968458 -0.997522 0.7715919 0.9501488 -0.9980506 0.8118697 0.9281627 -0.9984649 0.8461864 0.9213631 -0.9987902 0.8750274 0.9233187 -0.999046 0.8989895 0.9298472 -0.9992473 0.9187089 0.938341 -0.9994059 0.9348097 0.9472555 -0.999531 0.9478718 0.9557389 -0.9996296 0.9584137 0.9633749 -0.9997074 0.9668859 0.9700086 -0.9997689 0.9736717 0.9756343 -0.9998174 0.9790921 0.9803241 -0.9998557 0.9834126 0.9841852 -0.999886 0.9868503 0.9873344 -0.9999099 0.9895819 0.989885 -0.9999288 0.99175 0.9919398 -0.9999437 0.9934694 0.9935882 -0.7251659 0.7253722 0.9968475 -0.7251605 0.7253592 0.9968474 -0.7251537 0.725343 0.9968473 -0.7251454 0.7253227 0.9968472 -0.7251351 0.7252972 0.996847 -0.7251226 0.7252656 0.9968468 -0.7251076 0.7252263 0.9968465 -0.7250899 0.725178 0.9968462 -0.7250697 0.7251188 0.9968458 -0.7250473 0.7250473 0.9968453 -0.7251096 0.7250473 0.9968453 -0.7251883 0.7250473 0.9968453 -0.7252879 0.7250473 0.9968453 -0.7254139 0.7250473 0.9968453 -0.7255733 0.7250473 0.9968453 -0.725775 0.7250473 0.9968453 -0.7260302 0.7250473 0.9968453 -0.726353 0.7250473 0.9968453 -0.7267615 0.7250473 0.9968453 -0.7272782 0.7250473 0.9968453 -0.7279319 0.7250473 0.9968453 -0.7287589 0.7250473 0.9968453 -0.7298052 0.7250473 0.9968453 -0.7311288 0.7250473 0.9968453 -0.7328035 0.7250473 0.9968453 -0.7349221 0.7250473 0.9968453 -0.7376024 0.7250473 0.9968453 -0.7409934 0.7250473 0.9968453 -0.7452834 0.7250473 0.9968453 -0.7507108 0.7250473 0.9968453 -0.7575772 0.7250473 0.9968453 -0.7662641 0.7250473 0.9968453 -0.7772541 0.7250473 0.9968453 -0.7911579 0.7250473 0.9968453 -0.808748 0.7250473 0.9968453 -0.8310018 0.7250473 0.9968453 -0.8591558 0.7250473 0.9968453 -0.8947742 0.7250473 0.9968453 -0.9398361 0.7250473 0.9968453 -0.9968453 0.7250473 0.9968453 -0.9975217 0.7715762 0.9501385 -0.9980504 0.8118589 0.9281506 -0.9984648 0.8461791 0.9213524 -0.9987902 0.8750225 0.9233103 -0.9990459 0.8989863 0.9298411 -0.9992473 0.9187068 0.9383367 -0.9994059 0.9348083 0.9472525 -0.9995309 0.947871 0.955737 -0.9996296 0.9584132 0.9633736 -0.9997074 0.9668855 0.9700078 -0.9997689 0.9736715 0.9756338 -0.9998174 0.979092 0.9803238 -0.9998557 0.9834125 0.9841849 -0.999886 0.9868502 0.9873343 -0.9999099 0.9895818 0.989885 -0.9999288 0.99175 0.9919397 -0.9999437 0.9934694 0.9935881 -0.7251659 0.7254343 0.9968475 -0.7251605 0.7254214 0.9968474 -0.7251537 0.7254052 0.9968473 -0.7251454 0.7253848 0.9968472 -0.7251351 0.7253594 0.996847 -0.7251226 0.7253278 0.9968468 -0.7251076 0.7252885 0.9968465 -0.7250899 0.7252402 0.9968462 -0.7250697 0.7251811 0.9968458 -0.7250473 0.7251096 0.9968453 -0.7250244 0.7250244 0.9968448 -0.7251031 0.7250244 0.9968448 -0.7252028 0.7250244 0.9968448 -0.7253288 0.7250244 0.9968448 -0.7254883 0.7250244 0.9968448 -0.7256901 0.7250244 0.9968448 -0.7259453 0.7250244 0.9968448 -0.7262683 0.7250244 0.9968448 -0.7266768 0.7250244 0.9968448 -0.7271937 0.7250244 0.9968448 -0.7278476 0.7250244 0.9968448 -0.7286748 0.7250244 0.9968448 -0.7297214 0.7250244 0.9968448 -0.7310455 0.7250244 0.9968448 -0.7327207 0.7250244 0.9968448 -0.73484 0.7250244 0.9968448 -0.7375211 0.7250244 0.9968448 -0.7409131 0.7250244 0.9968448 -0.7452045 0.7250244 0.9968448 -0.7506336 0.7250244 0.9968448 -0.7575021 0.7250244 0.9968448 -0.7661917 0.7250244 0.9968448 -0.7771851 0.7250244 0.9968448 -0.7910933 0.7250244 0.9968448 -0.8086889 0.7250244 0.9968448 -0.8309496 0.7250244 0.9968448 -0.8591123 0.7250244 0.9968448 -0.8947418 0.7250244 0.9968448 -0.9398178 0.7250244 0.9968448 -0.9968448 0.7250244 0.9968448 -0.9975213 0.7715599 0.9501262 -0.9980502 0.8118476 0.9281362 -0.9984647 0.8461714 0.9213397 -0.9987901 0.8750173 0.9233004 -0.9990459 0.8989829 0.9298339 -0.9992472 0.9187045 0.9383317 -0.9994059 0.9348069 0.9472491 -0.9995309 0.94787 0.9557347 -0.9996296 0.9584126 0.9633721 -0.9997074 0.9668852 0.9700068 -0.9997689 0.9736712 0.9756331 -0.9998174 0.9790919 0.9803234 -0.9998557 0.9834124 0.9841847 -0.999886 0.9868502 0.9873341 -0.9999099 0.9895818 0.9898849 -0.9999288 0.99175 0.9919397 -0.9999437 0.9934694 0.9935881 -0.7251659 0.725513 0.9968475 -0.7251605 0.7255 0.9968474 -0.7251537 0.7254838 0.9968473 -0.7251454 0.7254635 0.9968472 -0.7251351 0.7254381 0.996847 -0.7251226 0.7254064 0.9968468 -0.7251076 0.7253672 0.9968465 -0.7250899 0.7253189 0.9968462 -0.7250697 0.7252598 0.9968458 -0.7250473 0.7251883 0.9968453 -0.7250244 0.7251031 0.9968448 -0.7250039 0.7250039 0.9968441 -0.7251035 0.7250039 0.9968441 -0.7252297 0.7250039 0.9968441 -0.7253892 0.7250039 0.9968441 -0.725591 0.7250039 0.9968441 -0.7258464 0.7250039 0.9968441 -0.7261694 0.7250039 0.9968441 -0.7265781 0.7250039 0.9968441 -0.7270952 0.7250039 0.9968441 -0.7277493 0.7250039 0.9968441 -0.7285769 0.7250039 0.9968441 -0.7296238 0.7250039 0.9968441 -0.7309484 0.7250039 0.9968441 -0.7326242 0.7250039 0.9968441 -0.7347442 0.7250039 0.9968441 -0.7374264 0.7250039 0.9968441 -0.7408196 0.7250039 0.9968441 -0.7451125 0.7250039 0.9968441 -0.7505436 0.7250039 0.9968441 -0.7574146 0.7250039 0.9968441 -0.7661073 0.7250039 0.9968441 -0.7771048 0.7250039 0.9968441 -0.791018 0.7250039 0.9968441 -0.8086199 0.7250039 0.9968441 -0.8308888 0.7250039 0.9968441 -0.8590617 0.7250039 0.9968441 -0.8947041 0.7250039 0.9968441 -0.9397965 0.7250039 0.9968441 -0.9968441 0.7250039 0.9968441 -0.9975209 0.7715449 0.9501119 -0.99805 0.811837 0.9281195 -0.9984645 0.8461641 0.921325 -0.99879 0.8750124 0.9232889 -0.9990458 0.8989796 0.9298254 -0.9992472 0.9187024 0.9383257 -0.9994059 0.9348055 0.947245 -0.9995309 0.9478691 0.955732 -0.9996296 0.958412 0.9633703 -0.9997074 0.9668848 0.9700057 -0.9997689 0.973671 0.9756324 -0.9998174 0.9790917 0.9803229 -0.9998557 0.9834123 0.9841844 -0.999886 0.9868501 0.9873339 -0.9999099 0.9895818 0.9898847 -0.9999288 0.9917499 0.9919396 -0.9999437 0.9934694 0.993588 -0.7251659 0.7256124 0.9968475 -0.7251605 0.7255995 0.9968474 -0.7251537 0.7255833 0.9968473 -0.7251454 0.725563 0.9968472 -0.7251351 0.7255376 0.996847 -0.7251226 0.725506 0.9968468 -0.7251076 0.7254668 0.9968465 -0.7250899 0.7254184 0.9968462 -0.7250697 0.7253594 0.9968458 -0.7250473 0.7252879 0.9968453 -0.7250244 0.7252028 0.9968448 -0.7250039 0.7251035 0.9968441 -0.7249916 0.7249916 0.9968433 -0.7251177 0.7249916 0.9968433 -0.7252773 0.7249916 0.9968433 -0.7254792 0.7249916 0.9968433 -0.7257347 0.7249916 0.9968433 -0.7260579 0.7249916 0.9968433 -0.7264667 0.7249916 0.9968433 -0.726984 0.7249916 0.9968433 -0.7276384 0.7249916 0.9968433 -0.7284663 0.7249916 0.9968433 -0.7295137 0.7249916 0.9968433 -0.7308388 0.7249916 0.9968433 -0.7325153 0.7249916 0.9968433 -0.7346362 0.7249916 0.9968433 -0.7373194 0.7249916 0.9968433 -0.7407141 0.7249916 0.9968433 -0.7450087 0.7249916 0.9968433 -0.750442 0.7249916 0.9968433 -0.7573158 0.7249916 0.9968433 -0.7660121 0.7249916 0.9968433 -0.7770141 0.7249916 0.9968433 -0.790933 0.7249916 0.9968433 -0.8085421 0.7249916 0.9968433 -0.8308201 0.7249916 0.9968433 -0.8590045 0.7249916 0.9968433 -0.8946616 0.7249916 0.9968433 -0.9397723 0.7249916 0.9968433 -0.9968433 0.7249916 0.9968433 -0.9975204 0.7715352 0.9500958 -0.9980497 0.8118298 0.9281006 -0.9984643 0.8461589 0.9213083 -0.9987899 0.8750088 0.9232758 -0.9990458 0.8989771 0.9298159 -0.9992472 0.9187008 0.938319 -0.9994058 0.9348044 0.9472405 -0.9995309 0.9478684 0.9557289 -0.9996296 0.9584115 0.9633684 -0.9997074 0.9668845 0.9700044 -0.9997689 0.9736708 0.9756316 -0.9998174 0.9790916 0.9803224 -0.9998557 0.9834122 0.984184 -0.999886 0.9868501 0.9873337 -0.9999099 0.9895817 0.9898846 -0.9999288 0.9917499 0.9919395 -0.9999437 0.9934694 0.993588 -0.7251659 0.7257383 0.9968475 -0.7251605 0.7257254 0.9968474 -0.7251537 0.7257092 0.9968473 -0.7251454 0.7256889 0.9968472 -0.7251351 0.7256635 0.996847 -0.7251226 0.7256319 0.9968468 -0.7251076 0.7255927 0.9968465 -0.7250899 0.7255444 0.9968462 -0.7250697 0.7254853 0.9968458 -0.7250473 0.7254139 0.9968453 -0.7250244 0.7253288 0.9968448 -0.7250039 0.7252297 0.9968441 -0.7249916 0.7251177 0.9968433 -0.7249978 0.7249978 0.9968425 -0.7251575 0.7249978 0.9968425 -0.7253595 0.7249978 0.9968425 -0.7256151 0.7249978 0.9968425 -0.7259384 0.7249978 0.9968425 -0.7263474 0.7249978 0.9968425 -0.7268649 0.7249978 0.9968425 -0.7275196 0.7249978 0.9968425 -0.7283479 0.7249978 0.9968425 -0.7293958 0.7249978 0.9968425 -0.7307215 0.7249978 0.9968425 -0.7323986 0.7249978 0.9968425 -0.7345205 0.7249978 0.9968425 -0.7372049 0.7249978 0.9968425 -0.740601 0.7249978 0.9968425 -0.7448975 0.7249978 0.9968425 -0.7503332 0.7249978 0.9968425 -0.7572101 0.7249978 0.9968425 -0.7659102 0.7249978 0.9968425 -0.7769169 0.7249978 0.9968425 -0.7908419 0.7249978 0.9968425 -0.8084588 0.7249978 0.9968425 -0.8307465 0.7249978 0.9968425 -0.8589433 0.7249978 0.9968425 -0.894616 0.7249978 0.9968425 -0.9397465 0.7249978 0.9968425 -0.9968425 0.7249978 0.9968425 -0.9975199 0.7715376 0.9500785 -0.9980494 0.8118303 0.9280803 -0.9984642 0.8461587 0.9212904 -0.9987897 0.8750084 0.9232619 -0.9990457 0.8989767 0.9298057 -0.9992471 0.9187004 0.9383119 -0.9994058 0.9348042 0.9472356 -0.9995309 0.9478683 0.9557257 -0.9996295 0.9584114 0.9633662 -0.9997074 0.9668844 0.970003 -0.9997689 0.9736708 0.9756307 -0.9998174 0.9790916 0.9803218 -0.9998557 0.9834122 0.9841837 -0.999886 0.98685 0.9873335 -0.9999099 0.9895817 0.9898845 -0.9999288 0.9917499 0.9919394 -0.9999437 0.9934694 0.9935879 -0.7251659 0.7258976 0.9968475 -0.7251605 0.7258847 0.9968474 -0.7251537 0.7258685 0.9968473 -0.7251454 0.7258482 0.9968472 -0.7251351 0.7258228 0.996847 -0.7251226 0.7257912 0.9968468 -0.7251076 0.725752 0.9968465 -0.7250899 0.7257037 0.9968462 -0.7250697 0.7256447 0.9968458 -0.7250473 0.7255733 0.9968453 -0.7250244 0.7254883 0.9968448 -0.7250039 0.7253892 0.9968441 -0.7249916 0.7252773 0.9968433 -0.7249978 0.7251575 0.9968425 -0.7250408 0.7250408 0.9968418 -0.7252429 0.7250408 0.9968418 -0.7254985 0.7250408 0.9968418 -0.725822 0.7250408 0.9968418 -0.7262312 0.7250408 0.9968418 -0.7267489 0.7250408 0.9968418 -0.7274039 0.7250408 0.9968418 -0.7282325 0.7250408 0.9968418 -0.7292808 0.7250408 0.9968418 -0.7306071 0.7250408 0.9968418 -0.732285 0.7250408 0.9968418 -0.7344077 0.7250408 0.9968418 -0.7370933 0.7250408 0.9968418 -0.7404909 0.7250408 0.9968418 -0.7447892 0.7250408 0.9968418 -0.7502272 0.7250408 0.9968418 -0.757107 0.7250408 0.9968418 -0.7658108 0.7250408 0.9968418 -0.7768223 0.7250408 0.9968418 -0.7907532 0.7250408 0.9968418 -0.8083776 0.7250408 0.9968418 -0.8306748 0.7250408 0.9968418 -0.8588837 0.7250408 0.9968418 -0.8945716 0.7250408 0.9968418 -0.9397214 0.7250408 0.9968418 -0.9968418 0.7250408 0.9968418 -0.9975194 0.7715641 0.9500617 -0.9980491 0.8118466 0.9280606 -0.998464 0.8461687 0.921273 -0.9987896 0.8750145 0.9232483 -0.9990456 0.8989805 0.9297957 -0.9992471 0.9187027 0.9383049 -0.9994058 0.9348056 0.9472309 -0.9995309 0.9478691 0.9557225 -0.9996295 0.958412 0.9633641 -0.9997074 0.9668847 0.9700016 -0.9997688 0.973671 0.9756298 -0.9998174 0.9790917 0.9803212 -0.9998557 0.9834123 0.9841833 -0.999886 0.9868501 0.9873332 -0.9999099 0.9895817 0.9898843 -0.9999288 0.9917499 0.9919393 -0.9999437 0.9934694 0.9935879 -0.7251659 0.726099 0.9968475 -0.7251605 0.7260861 0.9968474 -0.7251537 0.7260699 0.9968473 -0.7251454 0.7260496 0.9968472 -0.7251351 0.7260243 0.996847 -0.7251226 0.7259927 0.9968468 -0.7251076 0.7259536 0.9968465 -0.7250899 0.7259053 0.9968462 -0.7250697 0.7258464 0.9968458 -0.7250473 0.725775 0.9968453 -0.7250244 0.7256901 0.9968448 -0.7250039 0.725591 0.9968441 -0.7249916 0.7254792 0.9968433 -0.7249978 0.7253595 0.9968425 -0.7250408 0.7252429 0.9968418 -0.7251511 0.7251511 0.9968411 -0.7254069 0.7251511 0.9968411 -0.7257304 0.7251511 0.9968411 -0.7261398 0.7251511 0.9968411 -0.7266577 0.7251511 0.9968411 -0.7273129 0.7251511 0.9968411 -0.7281418 0.7251511 0.9968411 -0.7291904 0.7251511 0.9968411 -0.7305171 0.7251511 0.9968411 -0.7321956 0.7251511 0.9968411 -0.7343191 0.7251511 0.9968411 -0.7370055 0.7251511 0.9968411 -0.7404042 0.7251511 0.9968411 -0.744704 0.7251511 0.9968411 -0.7501439 0.7251511 0.9968411 -0.7570259 0.7251511 0.9968411 -0.7657327 0.7251511 0.9968411 -0.7767478 0.7251511 0.9968411 -0.7906834 0.7251511 0.9968411 -0.8083138 0.7251511 0.9968411 -0.8306185 0.7251511 0.9968411 -0.8588368 0.7251511 0.9968411 -0.8945366 0.7251511 0.9968411 -0.9397016 0.7251511 0.9968411 -0.9968411 0.7251511 0.9968411 -0.9975191 0.7716352 0.9500484 -0.9980488 0.8118921 0.9280451 -0.9984638 0.8461977 0.9212593 -0.9987895 0.8750329 0.9232376 -0.9990456 0.8989921 0.9297879 -0.999247 0.9187101 0.9382994 -0.9994057 0.9348102 0.9472271 -0.9995309 0.947872 0.95572 -0.9996295 0.9584138 0.9633625 -0.9997074 0.9668859 0.9700006 -0.9997688 0.9736717 0.9756291 -0.9998174 0.9790921 0.9803208 -0.9998557 0.9834126 0.984183 -0.999886 0.9868503 0.9873331 -0.9999099 0.9895819 0.9898842 -0.9999288 0.99175 0.9919392 -0.9999437 0.9934694 0.9935878 -0.7251659 0.7263539 0.9968475 -0.7251605 0.726341 0.9968474 -0.7251537 0.7263248 0.9968473 -0.7251454 0.7263046 0.9968472 -0.7251351 0.7262792 0.996847 -0.7251226 0.7262477 0.9968468 -0.7251076 0.7262086 0.9968465 -0.7250899 0.7261604 0.9968462 -0.7250697 0.7261015 0.9968458 -0.7250473 0.7260302 0.9968453 -0.7250244 0.7259453 0.9968448 -0.7250039 0.7258464 0.9968441 -0.7249916 0.7257347 0.9968433 -0.7249978 0.7256151 0.9968425 -0.7250408 0.7254985 0.9968418 -0.7251511 0.7254069 0.9968411 -0.7253775 0.7253775 0.9968409 -0.7257011 0.7253775 0.9968409 -0.7261105 0.7253775 0.9968409 -0.7266285 0.7253775 0.9968409 -0.7272837 0.7253775 0.9968409 -0.7281127 0.7253775 0.9968409 -0.7291615 0.7253775 0.9968409 -0.7304884 0.7253775 0.9968409 -0.732167 0.7253775 0.9968409 -0.7342907 0.7253775 0.9968409 -0.7369774 0.7253775 0.9968409 -0.7403765 0.7253775 0.9968409 -0.7446768 0.7253775 0.9968409 -0.7501172 0.7253775 0.9968409 -0.757 0.7253775 0.9968409 -0.7657077 0.7253775 0.9968409 -0.776724 0.7253775 0.9968409 -0.7906611 0.7253775 0.9968409 -0.8082934 0.7253775 0.9968409 -0.8306004 0.7253775 0.9968409 -0.8588218 0.7253775 0.9968409 -0.8945255 0.7253775 0.9968409 -0.9396953 0.7253775 0.9968409 -0.9968409 0.7253775 0.9968409 -0.9975189 0.7717834 0.9500442 -0.9980488 0.8119884 0.9280401 -0.9984638 0.8462598 0.921255 -0.9987895 0.8750727 0.9232341 -0.9990455 0.8990175 0.9297854 -0.999247 0.9187262 0.9382977 -0.9994057 0.9348204 0.9472259 -0.9995308 0.9478785 0.9557192 -0.9996295 0.9584178 0.963362 -0.9997074 0.9668884 0.9700002 -0.9997688 0.9736733 0.9756289 -0.9998174 0.9790931 0.9803206 -0.9998557 0.9834132 0.9841829 -0.999886 0.9868507 0.987333 -0.9999099 0.9895821 0.9898842 -0.9999288 0.9917502 0.9919392 -0.9999437 0.9934695 0.9935878 -0.7251659 0.7266763 0.9968475 -0.7251605 0.7266635 0.9968474 -0.7251537 0.7266473 0.9968473 -0.7251454 0.7266271 0.9968472 -0.7251351 0.7266018 0.996847 -0.7251226 0.7265703 0.9968468 -0.7251076 0.7265312 0.9968465 -0.7250899 0.7264831 0.9968462 -0.7250697 0.7264242 0.9968458 -0.7250473 0.726353 0.9968453 -0.7250244 0.7262683 0.9968448 -0.7250039 0.7261694 0.9968441 -0.7249916 0.7260579 0.9968433 -0.7249978 0.7259384 0.9968425 -0.7250408 0.725822 0.9968418 -0.7251511 0.7257304 0.9968411 -0.7253775 0.7257011 0.9968409 -0.7257011 0.7257011 0.9968409 -0.7261105 0.7257011 0.9968409 -0.7266285 0.7257011 0.9968409 -0.7272837 0.7257011 0.9968409 -0.7281127 0.7257011 0.9968409 -0.7291615 0.7257011 0.9968409 -0.7304884 0.7257011 0.9968409 -0.732167 0.7257011 0.9968409 -0.7342907 0.7257011 0.9968409 -0.7369774 0.7257011 0.9968409 -0.7403765 0.7257011 0.9968409 -0.7446768 0.7257011 0.9968409 -0.7501172 0.7257011 0.9968409 -0.757 0.7257011 0.9968409 -0.7657077 0.7257011 0.9968409 -0.776724 0.7257011 0.9968409 -0.7906611 0.7257011 0.9968409 -0.8082934 0.7257011 0.9968409 -0.8306004 0.7257011 0.9968409 -0.8588218 0.7257011 0.9968409 -0.8945255 0.7257011 0.9968409 -0.9396953 0.7257011 0.9968409 -0.9968409 0.7257011 0.9968409 -0.9975189 0.7719959 0.9500442 -0.9980488 0.8121268 0.9280401 -0.9984638 0.8463492 0.921255 -0.9987895 0.8751301 0.9232341 -0.9990455 0.8990542 0.9297854 -0.999247 0.9187495 0.9382977 -0.9994057 0.9348352 0.9472259 -0.9995308 0.9478878 0.9557192 -0.9996295 0.9584237 0.963362 -0.9997074 0.9668922 0.9700002 -0.9997688 0.9736756 0.9756289 -0.9998174 0.9790946 0.9803206 -0.9998557 0.9834141 0.9841829 -0.999886 0.9868512 0.987333 -0.9999099 0.9895825 0.9898842 -0.9999288 0.9917504 0.9919392 -0.9999437 0.9934697 0.9935878 -0.7251659 0.7270843 0.9968475 -0.7251605 0.7270714 0.9968474 -0.7251537 0.7270553 0.9968473 -0.7251454 0.7270351 0.9968472 -0.7251351 0.7270098 0.996847 -0.7251226 0.7269784 0.9968468 -0.7251076 0.7269394 0.9968465 -0.7250899 0.7268913 0.9968462 -0.7250697 0.7268325 0.9968458 -0.7250473 0.7267615 0.9968453 -0.7250244 0.7266768 0.9968448 -0.7250039 0.7265781 0.9968441 -0.7249916 0.7264667 0.9968433 -0.7249978 0.7263474 0.9968425 -0.7250408 0.7262312 0.9968418 -0.7251511 0.7261398 0.9968411 -0.7253775 0.7261105 0.9968409 -0.7257011 0.7261105 0.9968409 -0.7261105 0.7261105 0.9968409 -0.7266285 0.7261105 0.9968409 -0.7272837 0.7261105 0.9968409 -0.7281127 0.7261105 0.9968409 -0.7291615 0.7261105 0.9968409 -0.7304884 0.7261105 0.9968409 -0.732167 0.7261105 0.9968409 -0.7342907 0.7261105 0.9968409 -0.7369774 0.7261105 0.9968409 -0.7403765 0.7261105 0.9968409 -0.7446768 0.7261105 0.9968409 -0.7501172 0.7261105 0.9968409 -0.757 0.7261105 0.9968409 -0.7657077 0.7261105 0.9968409 -0.776724 0.7261105 0.9968409 -0.7906611 0.7261105 0.9968409 -0.8082934 0.7261105 0.9968409 -0.8306004 0.7261105 0.9968409 -0.8588218 0.7261105 0.9968409 -0.8945255 0.7261105 0.9968409 -0.9396953 0.7261105 0.9968409 -0.9968409 0.7261105 0.9968409 -0.9975189 0.7722648 0.9500442 -0.9980488 0.8123018 0.9280401 -0.9984638 0.8464623 0.921255 -0.9987895 0.8752028 0.9232341 -0.9990455 0.8991006 0.9297854 -0.999247 0.9187791 0.9382977 -0.9994057 0.9348539 0.9472259 -0.9995308 0.9478997 0.9557192 -0.9996295 0.9584312 0.963362 -0.9997074 0.9668969 0.9700002 -0.9997688 0.9736786 0.9756289 -0.9998174 0.9790965 0.9803206 -0.9998557 0.9834153 0.9841829 -0.999886 0.986852 0.987333 -0.9999099 0.9895829 0.9898842 -0.9999288 0.9917507 0.9919392 -0.9999437 0.9934698 0.9935878 -0.7251659 0.7276003 0.9968475 -0.7251605 0.7275875 0.9968474 -0.7251537 0.7275714 0.9968473 -0.7251454 0.7275513 0.9968472 -0.7251351 0.7275261 0.996847 -0.7251226 0.7274947 0.9968468 -0.7251076 0.7274557 0.9968465 -0.7250899 0.7274078 0.9968462 -0.7250697 0.7273491 0.9968458 -0.7250473 0.7272782 0.9968453 -0.7250244 0.7271937 0.9968448 -0.7250039 0.7270952 0.9968441 -0.7249916 0.726984 0.9968433 -0.7249978 0.7268649 0.9968425 -0.7250408 0.7267489 0.9968418 -0.7251511 0.7266577 0.9968411 -0.7253775 0.7266285 0.9968409 -0.7257011 0.7266285 0.9968409 -0.7261105 0.7266285 0.9968409 -0.7266285 0.7266285 0.9968409 -0.7272837 0.7266285 0.9968409 -0.7281127 0.7266285 0.9968409 -0.7291615 0.7266285 0.9968409 -0.7304884 0.7266285 0.9968409 -0.732167 0.7266285 0.9968409 -0.7342907 0.7266285 0.9968409 -0.7369774 0.7266285 0.9968409 -0.7403765 0.7266285 0.9968409 -0.7446768 0.7266285 0.9968409 -0.7501172 0.7266285 0.9968409 -0.757 0.7266285 0.9968409 -0.7657077 0.7266285 0.9968409 -0.776724 0.7266285 0.9968409 -0.7906611 0.7266285 0.9968409 -0.8082934 0.7266285 0.9968409 -0.8306004 0.7266285 0.9968409 -0.8588218 0.7266285 0.9968409 -0.8945255 0.7266285 0.9968409 -0.9396953 0.7266285 0.9968409 -0.9968409 0.7266285 0.9968409 -0.9975189 0.7726049 0.9500442 -0.9980488 0.8125232 0.9280401 -0.9984638 0.8466054 0.921255 -0.9987895 0.8752947 0.9232341 -0.9990455 0.8991593 0.9297854 -0.999247 0.9188164 0.9382977 -0.9994057 0.9348776 0.9472259 -0.9995308 0.9479146 0.9557192 -0.9996295 0.9584406 0.963362 -0.9997074 0.9669028 0.9700002 -0.9997688 0.9736823 0.9756289 -0.9998174 0.9790988 0.9803206 -0.9998557 0.9834167 0.9841829 -0.999886 0.9868529 0.987333 -0.9999099 0.9895835 0.9898842 -0.9999288 0.991751 0.9919392 -0.9999437 0.9934701 0.9935878 -0.7251659 0.7282533 0.9968475 -0.7251605 0.7282405 0.9968474 -0.7251537 0.7282244 0.9968473 -0.7251454 0.7282043 0.9968472 -0.7251351 0.7281792 0.996847 -0.7251226 0.7281478 0.9968468 -0.7251076 0.728109 0.9968465 -0.7250899 0.7280611 0.9968462 -0.7250697 0.7280026 0.9968458 -0.7250473 0.7279319 0.9968453 -0.7250244 0.7278476 0.9968448 -0.7250039 0.7277493 0.9968441 -0.7249916 0.7276384 0.9968433 -0.7249978 0.7275196 0.9968425 -0.7250408 0.7274039 0.9968418 -0.7251511 0.7273129 0.9968411 -0.7253775 0.7272837 0.9968409 -0.7257011 0.7272837 0.9968409 -0.7261105 0.7272837 0.9968409 -0.7266285 0.7272837 0.9968409 -0.7272837 0.7272837 0.9968409 -0.7281127 0.7272837 0.9968409 -0.7291615 0.7272837 0.9968409 -0.7304884 0.7272837 0.9968409 -0.732167 0.7272837 0.9968409 -0.7342907 0.7272837 0.9968409 -0.7369774 0.7272837 0.9968409 -0.7403765 0.7272837 0.9968409 -0.7446768 0.7272837 0.9968409 -0.7501172 0.7272837 0.9968409 -0.757 0.7272837 0.9968409 -0.7657077 0.7272837 0.9968409 -0.776724 0.7272837 0.9968409 -0.7906611 0.7272837 0.9968409 -0.8082934 0.7272837 0.9968409 -0.8306004 0.7272837 0.9968409 -0.8588218 0.7272837 0.9968409 -0.8945255 0.7272837 0.9968409 -0.9396953 0.7272837 0.9968409 -0.9968409 0.7272837 0.9968409 -0.9975189 0.7730352 0.9500442 -0.9980488 0.8128033 0.9280401 -0.9984638 0.8467864 0.921255 -0.9987895 0.8754109 0.9232341 -0.9990455 0.8992336 0.9297854 -0.999247 0.9188636 0.9382977 -0.9994057 0.9349075 0.9472259 -0.9995308 0.9479335 0.9557192 -0.9996295 0.9584526 0.963362 -0.9997074 0.9669103 0.9700002 -0.9997688 0.973687 0.9756289 -0.9998174 0.9791018 0.9803206 -0.9998557 0.9834186 0.9841829 -0.999886 0.9868541 0.987333 -0.9999099 0.9895842 0.9898842 -0.9999288 0.9917515 0.9919392 -0.9999437 0.9934704 0.9935878 -0.7251659 0.7290793 0.9968475 -0.7251605 0.7290666 0.9968474 -0.7251537 0.7290505 0.9968473 -0.7251454 0.7290305 0.9968472 -0.7251351 0.7290054 0.996847 -0.7251226 0.7289742 0.9968468 -0.7251076 0.7289355 0.9968465 -0.7250899 0.7288878 0.9968462 -0.7250697 0.7288294 0.9968458 -0.7250473 0.7287589 0.9968453 -0.7250244 0.7286748 0.9968448 -0.7250039 0.7285769 0.9968441 -0.7249916 0.7284663 0.9968433 -0.7249978 0.7283479 0.9968425 -0.7250408 0.7282325 0.9968418 -0.7251511 0.7281418 0.9968411 -0.7253775 0.7281127 0.9968409 -0.7257011 0.7281127 0.9968409 -0.7261105 0.7281127 0.9968409 -0.7266285 0.7281127 0.9968409 -0.7272837 0.7281127 0.9968409 -0.7281127 0.7281127 0.9968409 -0.7291615 0.7281127 0.9968409 -0.7304884 0.7281127 0.9968409 -0.732167 0.7281127 0.9968409 -0.7342907 0.7281127 0.9968409 -0.7369774 0.7281127 0.9968409 -0.7403765 0.7281127 0.9968409 -0.7446768 0.7281127 0.9968409 -0.7501172 0.7281127 0.9968409 -0.757 0.7281127 0.9968409 -0.7657077 0.7281127 0.9968409 -0.776724 0.7281127 0.9968409 -0.7906611 0.7281127 0.9968409 -0.8082934 0.7281127 0.9968409 -0.8306004 0.7281127 0.9968409 -0.8588218 0.7281127 0.9968409 -0.8945255 0.7281127 0.9968409 -0.9396953 0.7281127 0.9968409 -0.9968409 0.7281127 0.9968409 -0.9975189 0.7735795 0.9500442 -0.9980488 0.8131577 0.9280401 -0.9984638 0.8470154 0.921255 -0.9987895 0.875558 0.9232341 -0.9990455 0.8993275 0.9297854 -0.999247 0.9189234 0.9382977 -0.9994057 0.9349454 0.9472259 -0.9995308 0.9479575 0.9557192 -0.9996295 0.9584677 0.963362 -0.9997074 0.9669198 0.9700002 -0.9997688 0.973693 0.9756289 -0.9998174 0.9791055 0.9803206 -0.9998557 0.9834209 0.9841829 -0.999886 0.9868555 0.987333 -0.9999099 0.9895851 0.9898842 -0.9999288 0.9917521 0.9919392 -0.9999437 0.9934707 0.9935878 -0.7251659 0.7301243 0.9968475 -0.7251605 0.7301116 0.9968474 -0.7251537 0.7300957 0.9968473 -0.7251454 0.7300757 0.9968472 -0.7251351 0.7300507 0.996847 -0.7251226 0.7300196 0.9968468 -0.7251076 0.7299811 0.9968465 -0.7250899 0.7299335 0.9968462 -0.7250697 0.7298754 0.9968458 -0.7250473 0.7298052 0.9968453 -0.7250244 0.7297214 0.9968448 -0.7250039 0.7296238 0.9968441 -0.7249916 0.7295137 0.9968433 -0.7249978 0.7293958 0.9968425 -0.7250408 0.7292808 0.9968418 -0.7251511 0.7291904 0.9968411 -0.7253775 0.7291615 0.9968409 -0.7257011 0.7291615 0.9968409 -0.7261105 0.7291615 0.9968409 -0.7266285 0.7291615 0.9968409 -0.7272837 0.7291615 0.9968409 -0.7281127 0.7291615 0.9968409 -0.7291615 0.7291615 0.9968409 -0.7304884 0.7291615 0.9968409 -0.732167 0.7291615 0.9968409 -0.7342907 0.7291615 0.9968409 -0.7369774 0.7291615 0.9968409 -0.7403765 0.7291615 0.9968409 -0.7446768 0.7291615 0.9968409 -0.7501172 0.7291615 0.9968409 -0.757 0.7291615 0.9968409 -0.7657077 0.7291615 0.9968409 -0.776724 0.7291615 0.9968409 -0.7906611 0.7291615 0.9968409 -0.8082934 0.7291615 0.9968409 -0.8306004 0.7291615 0.9968409 -0.8588218 0.7291615 0.9968409 -0.8945255 0.7291615 0.9968409 -0.9396953 0.7291615 0.9968409 -0.9968409 0.7291615 0.9968409 -0.9975189 0.7742682 0.9500442 -0.9980488 0.8136061 0.9280401 -0.9984638 0.8473052 0.921255 -0.9987895 0.8757441 0.9232341 -0.9990455 0.8994464 0.9297854 -0.999247 0.918999 0.9382977 -0.9994057 0.9349933 0.9472259 -0.9995308 0.9479878 0.9557192 -0.9996295 0.9584868 0.963362 -0.9997074 0.9669318 0.9700002 -0.9997688 0.9737006 0.9756289 -0.9998174 0.9791103 0.9803206 -0.9998557 0.9834239 0.9841829 -0.999886 0.9868574 0.987333 -0.9999099 0.9895863 0.9898842 -0.9999288 0.9917528 0.9919392 -0.9999437 0.9934712 0.9935878 -0.7251659 0.7314464 0.9968475 -0.7251605 0.7314338 0.9968474 -0.7251537 0.7314179 0.9968473 -0.7251454 0.731398 0.9968472 -0.7251351 0.7313732 0.996847 -0.7251226 0.7313422 0.9968468 -0.7251076 0.7313039 0.9968465 -0.7250899 0.7312566 0.9968462 -0.7250697 0.7311988 0.9968458 -0.7250473 0.7311288 0.9968453 -0.7250244 0.7310455 0.9968448 -0.7250039 0.7309484 0.9968441 -0.7249916 0.7308388 0.9968433 -0.7249978 0.7307215 0.9968425 -0.7250408 0.7306071 0.9968418 -0.7251511 0.7305171 0.9968411 -0.7253775 0.7304884 0.9968409 -0.7257011 0.7304884 0.9968409 -0.7261105 0.7304884 0.9968409 -0.7266285 0.7304884 0.9968409 -0.7272837 0.7304884 0.9968409 -0.7281127 0.7304884 0.9968409 -0.7291615 0.7304884 0.9968409 -0.7304884 0.7304884 0.9968409 -0.732167 0.7304884 0.9968409 -0.7342907 0.7304884 0.9968409 -0.7369774 0.7304884 0.9968409 -0.7403765 0.7304884 0.9968409 -0.7446768 0.7304884 0.9968409 -0.7501172 0.7304884 0.9968409 -0.757 0.7304884 0.9968409 -0.7657077 0.7304884 0.9968409 -0.776724 0.7304884 0.9968409 -0.7906611 0.7304884 0.9968409 -0.8082934 0.7304884 0.9968409 -0.8306004 0.7304884 0.9968409 -0.8588218 0.7304884 0.9968409 -0.8945255 0.7304884 0.9968409 -0.9396953 0.7304884 0.9968409 -0.9968409 0.7304884 0.9968409 -0.9975189 0.7751395 0.9500442 -0.9980488 0.8141733 0.9280401 -0.9984638 0.8476717 0.921255 -0.9987895 0.8759795 0.9232341 -0.9990455 0.8995968 0.9297854 -0.999247 0.9190947 0.9382977 -0.9994057 0.935054 0.9472259 -0.9995308 0.9480261 0.9557192 -0.9996295 0.9585109 0.963362 -0.9997074 0.966947 0.9700002 -0.9997688 0.9737101 0.9756289 -0.9998174 0.9791163 0.9803206 -0.9998557 0.9834277 0.9841829 -0.999886 0.9868597 0.987333 -0.9999099 0.9895878 0.9898842 -0.9999288 0.9917537 0.9919392 -0.9999437 0.9934718 0.9935878 -0.7251659 0.7331191 0.9968475 -0.7251605 0.7331065 0.9968474 -0.7251537 0.7330907 0.9968473 -0.7251454 0.733071 0.9968472 -0.7251351 0.7330463 0.996847 -0.7251226 0.7330155 0.9968468 -0.7251076 0.7329774 0.9968465 -0.7250899 0.7329304 0.9968462 -0.7250697 0.7328729 0.9968458 -0.7250473 0.7328035 0.9968453 -0.7250244 0.7327207 0.9968448 -0.7250039 0.7326242 0.9968441 -0.7249916 0.7325153 0.9968433 -0.7249978 0.7323986 0.9968425 -0.7250408 0.732285 0.9968418 -0.7251511 0.7321956 0.9968411 -0.7253775 0.732167 0.9968409 -0.7257011 0.732167 0.9968409 -0.7261105 0.732167 0.9968409 -0.7266285 0.732167 0.9968409 -0.7272837 0.732167 0.9968409 -0.7281127 0.732167 0.9968409 -0.7291615 0.732167 0.9968409 -0.7304884 0.732167 0.9968409 -0.732167 0.732167 0.9968409 -0.7342907 0.732167 0.9968409 -0.7369774 0.732167 0.9968409 -0.7403765 0.732167 0.9968409 -0.7446768 0.732167 0.9968409 -0.7501172 0.732167 0.9968409 -0.757 0.732167 0.9968409 -0.7657077 0.732167 0.9968409 -0.776724 0.732167 0.9968409 -0.7906611 0.732167 0.9968409 -0.8082934 0.732167 0.9968409 -0.8306004 0.732167 0.9968409 -0.8588218 0.732167 0.9968409 -0.8945255 0.732167 0.9968409 -0.9396953 0.732167 0.9968409 -0.9968409 0.732167 0.9968409 -0.9975189 0.7762418 0.9500442 -0.9980488 0.8148909 0.9280401 -0.9984638 0.8481355 0.921255 -0.9987895 0.8762773 0.9232341 -0.9990455 0.899787 0.9297854 -0.999247 0.9192157 0.9382977 -0.9994057 0.9351307 0.9472259 -0.9995308 0.9480746 0.9557192 -0.9996295 0.9585415 0.963362 -0.9997074 0.9669663 0.9700002 -0.9997688 0.9737222 0.9756289 -0.9998174 0.9791238 0.9803206 -0.9998557 0.9834324 0.9841829 -0.999886 0.9868627 0.987333 -0.9999099 0.9895897 0.9898842 -0.9999288 0.9917549 0.9919392 -0.9999437 0.9934725 0.9935878 -0.7251659 0.7352352 0.9968475 -0.7251605 0.7352227 0.9968474 -0.7251537 0.7352071 0.9968473 -0.7251454 0.7351875 0.9968472 -0.7251351 0.735163 0.996847 -0.7251226 0.7351325 0.9968468 -0.7251076 0.7350946 0.9968465 -0.7250899 0.735048 0.9968462 -0.7250697 0.734991 0.9968458 -0.7250473 0.7349221 0.9968453 -0.7250244 0.73484 0.9968448 -0.7250039 0.7347442 0.9968441 -0.7249916 0.7346362 0.9968433 -0.7249978 0.7345205 0.9968425 -0.7250408 0.7344077 0.9968418 -0.7251511 0.7343191 0.9968411 -0.7253775 0.7342907 0.9968409 -0.7257011 0.7342907 0.9968409 -0.7261105 0.7342907 0.9968409 -0.7266285 0.7342907 0.9968409 -0.7272837 0.7342907 0.9968409 -0.7281127 0.7342907 0.9968409 -0.7291615 0.7342907 0.9968409 -0.7304884 0.7342907 0.9968409 -0.732167 0.7342907 0.9968409 -0.7342907 0.7342907 0.9968409 -0.7369774 0.7342907 0.9968409 -0.7403765 0.7342907 0.9968409 -0.7446768 0.7342907 0.9968409 -0.7501172 0.7342907 0.9968409 -0.757 0.7342907 0.9968409 -0.7657077 0.7342907 0.9968409 -0.776724 0.7342907 0.9968409 -0.7906611 0.7342907 0.9968409 -0.8082934 0.7342907 0.9968409 -0.8306004 0.7342907 0.9968409 -0.8588218 0.7342907 0.9968409 -0.8945255 0.7342907 0.9968409 -0.9396953 0.7342907 0.9968409 -0.9968409 0.7342907 0.9968409 -0.9975189 0.7776364 0.9500442 -0.9980488 0.8157988 0.9280401 -0.9984638 0.8487222 0.921255 -0.9987895 0.8766541 0.9232341 -0.9990455 0.9000277 0.9297854 -0.999247 0.9193688 0.9382977 -0.9994057 0.9352277 0.9472259 -0.9995308 0.9481359 0.9557192 -0.9996295 0.9585802 0.963362 -0.9997074 0.9669906 0.9700002 -0.9997688 0.9737375 0.9756289 -0.9998174 0.9791334 0.9803206 -0.9998557 0.9834385 0.9841829 -0.999886 0.9868665 0.987333 -0.9999099 0.989592 0.9898842 -0.9999288 0.9917564 0.9919392 -0.9999437 0.9934734 0.9935878 -0.7251659 0.7379123 0.9968475 -0.7251605 0.7379 0.9968474 -0.7251537 0.7378845 0.9968473 -0.7251454 0.7378651 0.9968472 -0.7251351 0.7378409 0.996847 -0.7251226 0.7378107 0.9968468 -0.7251076 0.7377732 0.9968465 -0.7250899 0.7377271 0.9968462 -0.7250697 0.7376706 0.9968458 -0.7250473 0.7376024 0.9968453 -0.7250244 0.7375211 0.9968448 -0.7250039 0.7374264 0.9968441 -0.7249916 0.7373194 0.9968433 -0.7249978 0.7372049 0.9968425 -0.7250408 0.7370933 0.9968418 -0.7251511 0.7370055 0.9968411 -0.7253775 0.7369774 0.9968409 -0.7257011 0.7369774 0.9968409 -0.7261105 0.7369774 0.9968409 -0.7266285 0.7369774 0.9968409 -0.7272837 0.7369774 0.9968409 -0.7281127 0.7369774 0.9968409 -0.7291615 0.7369774 0.9968409 -0.7304884 0.7369774 0.9968409 -0.732167 0.7369774 0.9968409 -0.7342907 0.7369774 0.9968409 -0.7369774 0.7369774 0.9968409 -0.7403765 0.7369774 0.9968409 -0.7446768 0.7369774 0.9968409 -0.7501172 0.7369774 0.9968409 -0.757 0.7369774 0.9968409 -0.7657077 0.7369774 0.9968409 -0.776724 0.7369774 0.9968409 -0.7906611 0.7369774 0.9968409 -0.8082934 0.7369774 0.9968409 -0.8306004 0.7369774 0.9968409 -0.8588218 0.7369774 0.9968409 -0.8945255 0.7369774 0.9968409 -0.9396953 0.7369774 0.9968409 -0.9968409 0.7369774 0.9968409 -0.9975189 0.7794007 0.9500442 -0.9980488 0.8169474 0.9280401 -0.9984638 0.8494644 0.921255 -0.9987895 0.8771307 0.9232341 -0.9990455 0.9003323 0.9297854 -0.999247 0.9195625 0.9382977 -0.9994057 0.9353505 0.9472259 -0.9995308 0.9482135 0.9557192 -0.9996295 0.9586291 0.963362 -0.9997074 0.9670214 0.9700002 -0.9997688 0.9737569 0.9756289 -0.9998174 0.9791456 0.9803206 -0.9998557 0.9834461 0.9841829 -0.999886 0.9868713 0.987333 -0.9999099 0.989595 0.9898842 -0.9999288 0.9917582 0.9919392 -0.9999437 0.9934746 0.9935878 -0.7251659 0.7412993 0.9968475 -0.7251605 0.7412871 0.9968474 -0.7251537 0.7412718 0.9968473 -0.7251454 0.7412527 0.9968472 -0.7251351 0.7412287 0.996847 -0.7251226 0.7411989 0.9968468 -0.7251076 0.7411619 0.9968465 -0.7250899 0.7411164 0.9968462 -0.7250697 0.7410607 0.9968458 -0.7250473 0.7409934 0.9968453 -0.7250244 0.7409131 0.9968448 -0.7250039 0.7408196 0.9968441 -0.7249916 0.7407141 0.9968433 -0.7249978 0.740601 0.9968425 -0.7250408 0.7404909 0.9968418 -0.7251511 0.7404042 0.9968411 -0.7253775 0.7403765 0.9968409 -0.7257011 0.7403765 0.9968409 -0.7261105 0.7403765 0.9968409 -0.7266285 0.7403765 0.9968409 -0.7272837 0.7403765 0.9968409 -0.7281127 0.7403765 0.9968409 -0.7291615 0.7403765 0.9968409 -0.7304884 0.7403765 0.9968409 -0.732167 0.7403765 0.9968409 -0.7342907 0.7403765 0.9968409 -0.7369774 0.7403765 0.9968409 -0.7403765 0.7403765 0.9968409 -0.7446768 0.7403765 0.9968409 -0.7501172 0.7403765 0.9968409 -0.757 0.7403765 0.9968409 -0.7657077 0.7403765 0.9968409 -0.776724 0.7403765 0.9968409 -0.7906611 0.7403765 0.9968409 -0.8082934 0.7403765 0.9968409 -0.8306004 0.7403765 0.9968409 -0.8588218 0.7403765 0.9968409 -0.8945255 0.7403765 0.9968409 -0.9396953 0.7403765 0.9968409 -0.9968409 0.7403765 0.9968409 -0.9975189 0.7816327 0.9500442 -0.9980488 0.8184005 0.9280401 -0.9984638 0.8504035 0.921255 -0.9987895 0.8777338 0.9232341 -0.9990455 0.9007175 0.9297854 -0.999247 0.9198076 0.9382977 -0.9994057 0.9355059 0.9472259 -0.9995308 0.9483117 0.9557192 -0.9996295 0.958691 0.963362 -0.9997074 0.9670604 0.9700002 -0.9997688 0.9737814 0.9756289 -0.9998174 0.979161 0.9803206 -0.9998557 0.9834557 0.9841829 -0.999886 0.9868773 0.987333 -0.9999099 0.9895988 0.9898842 -0.9999288 0.9917606 0.9919392 -0.9999437 0.9934761 0.9935878 -0.7251659 0.7455842 0.9968475 -0.7251605 0.7455722 0.9968474 -0.7251537 0.7455572 0.9968473 -0.7251454 0.7455383 0.9968472 -0.7251351 0.7455148 0.996847 -0.7251226 0.7454855 0.9968468 -0.7251076 0.7454491 0.9968465 -0.7250899 0.7454044 0.9968462 -0.7250697 0.7453496 0.9968458 -0.7250473 0.7452834 0.9968453 -0.7250244 0.7452045 0.9968448 -0.7250039 0.7451125 0.9968441 -0.7249916 0.7450087 0.9968433 -0.7249978 0.7448975 0.9968425 -0.7250408 0.7447892 0.9968418 -0.7251511 0.744704 0.9968411 -0.7253775 0.7446768 0.9968409 -0.7257011 0.7446768 0.9968409 -0.7261105 0.7446768 0.9968409 -0.7266285 0.7446768 0.9968409 -0.7272837 0.7446768 0.9968409 -0.7281127 0.7446768 0.9968409 -0.7291615 0.7446768 0.9968409 -0.7304884 0.7446768 0.9968409 -0.732167 0.7446768 0.9968409 -0.7342907 0.7446768 0.9968409 -0.7369774 0.7446768 0.9968409 -0.7403765 0.7446768 0.9968409 -0.7446768 0.7446768 0.9968409 -0.7501172 0.7446768 0.9968409 -0.757 0.7446768 0.9968409 -0.7657077 0.7446768 0.9968409 -0.776724 0.7446768 0.9968409 -0.7906611 0.7446768 0.9968409 -0.8082934 0.7446768 0.9968409 -0.8306004 0.7446768 0.9968409 -0.8588218 0.7446768 0.9968409 -0.8945255 0.7446768 0.9968409 -0.9396953 0.7446768 0.9968409 -0.9968409 0.7446768 0.9968409 -0.9975189 0.7844566 0.9500442 -0.9980488 0.8202389 0.9280401 -0.9984638 0.8515915 0.921255 -0.9987895 0.8784967 0.9232341 -0.9990455 0.9012049 0.9297854 -0.999247 0.9201176 0.9382977 -0.9994057 0.9357024 0.9472259 -0.9995308 0.9484359 0.9557192 -0.9996295 0.9587693 0.963362 -0.9997074 0.9671097 0.9700002 -0.9997688 0.9738123 0.9756289 -0.9998174 0.9791804 0.9803206 -0.9998557 0.9834679 0.9841829 -0.999886 0.986885 0.987333 -0.9999099 0.9896036 0.9898842 -0.9999288 0.9917636 0.9919392 -0.9999437 0.9934779 0.9935878 -0.7251659 0.7510052 0.9968475 -0.7251605 0.7509934 0.9968474 -0.7251537 0.7509787 0.9968473 -0.7251454 0.7509603 0.9968472 -0.7251351 0.7509373 0.996847 -0.7251226 0.7509086 0.9968468 -0.7251076 0.750873 0.9968465 -0.7250899 0.7508292 0.9968462 -0.7250697 0.7507756 0.9968458 -0.7250473 0.7507108 0.9968453 -0.7250244 0.7506336 0.9968448 -0.7250039 0.7505436 0.9968441 -0.7249916 0.750442 0.9968433 -0.7249978 0.7503332 0.9968425 -0.7250408 0.7502272 0.9968418 -0.7251511 0.7501439 0.9968411 -0.7253775 0.7501172 0.9968409 -0.7257011 0.7501172 0.9968409 -0.7261105 0.7501172 0.9968409 -0.7266285 0.7501172 0.9968409 -0.7272837 0.7501172 0.9968409 -0.7281127 0.7501172 0.9968409 -0.7291615 0.7501172 0.9968409 -0.7304884 0.7501172 0.9968409 -0.732167 0.7501172 0.9968409 -0.7342907 0.7501172 0.9968409 -0.7369774 0.7501172 0.9968409 -0.7403765 0.7501172 0.9968409 -0.7446768 0.7501172 0.9968409 -0.7501172 0.7501172 0.9968409 -0.757 0.7501172 0.9968409 -0.7657077 0.7501172 0.9968409 -0.776724 0.7501172 0.9968409 -0.7906611 0.7501172 0.9968409 -0.8082934 0.7501172 0.9968409 -0.8306004 0.7501172 0.9968409 -0.8588218 0.7501172 0.9968409 -0.8945255 0.7501172 0.9968409 -0.9396953 0.7501172 0.9968409 -0.9968409 0.7501172 0.9968409 -0.9975189 0.7880291 0.9500442 -0.9980488 0.8225647 0.9280401 -0.9984638 0.8530945 0.921255 -0.9987895 0.8794619 0.9232341 -0.9990455 0.9018215 0.9297854 -0.999247 0.9205098 0.9382977 -0.9994057 0.935951 0.9472259 -0.9995308 0.9485931 0.9557192 -0.9996295 0.9588684 0.963362 -0.9997074 0.967172 0.9700002 -0.9997688 0.9738515 0.9756289 -0.9998174 0.979205 0.9803206 -0.9998557 0.9834833 0.9841829 -0.999886 0.9868946 0.987333 -0.9999099 0.9896096 0.9898842 -0.9999288 0.9917674 0.9919392 -0.9999437 0.9934803 0.9935878 -0.7251659 0.7578634 0.9968475 -0.7251605 0.757852 0.9968474 -0.7251537 0.7578377 0.9968473 -0.7251454 0.7578198 0.9968472 -0.7251351 0.7577974 0.996847 -0.7251226 0.7577695 0.9968468 -0.7251076 0.7577349 0.9968465 -0.7250899 0.7576923 0.9968462 -0.7250697 0.7576402 0.9968458 -0.7250473 0.7575772 0.9968453 -0.7250244 0.7575021 0.9968448 -0.7250039 0.7574146 0.9968441 -0.7249916 0.7573158 0.9968433 -0.7249978 0.7572101 0.9968425 -0.7250408 0.757107 0.9968418 -0.7251511 0.7570259 0.9968411 -0.7253775 0.757 0.9968409 -0.7257011 0.757 0.9968409 -0.7261105 0.757 0.9968409 -0.7266285 0.757 0.9968409 -0.7272837 0.757 0.9968409 -0.7281127 0.757 0.9968409 -0.7291615 0.757 0.9968409 -0.7304884 0.757 0.9968409 -0.732167 0.757 0.9968409 -0.7342907 0.757 0.9968409 -0.7369774 0.757 0.9968409 -0.7403765 0.757 0.9968409 -0.7446768 0.757 0.9968409 -0.7501172 0.757 0.9968409 -0.757 0.757 0.9968409 -0.7657077 0.757 0.9968409 -0.776724 0.757 0.9968409 -0.7906611 0.757 0.9968409 -0.8082934 0.757 0.9968409 -0.8306004 0.757 0.9968409 -0.8588218 0.757 0.9968409 -0.8945255 0.757 0.9968409 -0.9396953 0.757 0.9968409 -0.9968409 0.757 0.9968409 -0.9975189 0.7925488 0.9500442 -0.9980488 0.8255071 0.9280401 -0.9984638 0.8549959 0.921255 -0.9987895 0.880683 0.9232341 -0.9990455 0.9026016 0.9297854 -0.999247 0.9210061 0.9382977 -0.9994057 0.9362655 0.9472259 -0.9995308 0.9487918 0.9557192 -0.9996295 0.9589938 0.963362 -0.9997074 0.9672509 0.9700002 -0.9997688 0.9739011 0.9756289 -0.9998174 0.9792361 0.9803206 -0.9998557 0.9835029 0.9841829 -0.999886 0.9869069 0.987333 -0.9999099 0.9896173 0.9898842 -0.9999288 0.9917722 0.9919392 -0.9999437 0.9934833 0.9935878 -0.7251659 0.76654 0.9968475 -0.7251605 0.766529 0.9968474 -0.7251537 0.7665152 0.9968473 -0.7251454 0.7664979 0.9968472 -0.7251351 0.7664763 0.996847 -0.7251226 0.7664494 0.9968468 -0.7251076 0.7664161 0.9968465 -0.7250899 0.766375 0.9968462 -0.7250697 0.7663248 0.9968458 -0.7250473 0.7662641 0.9968453 -0.7250244 0.7661917 0.9968448 -0.7250039 0.7661073 0.9968441 -0.7249916 0.7660121 0.9968433 -0.7249978 0.7659102 0.9968425 -0.7250408 0.7658108 0.9968418 -0.7251511 0.7657327 0.9968411 -0.7253775 0.7657077 0.9968409 -0.7257011 0.7657077 0.9968409 -0.7261105 0.7657077 0.9968409 -0.7266285 0.7657077 0.9968409 -0.7272837 0.7657077 0.9968409 -0.7281127 0.7657077 0.9968409 -0.7291615 0.7657077 0.9968409 -0.7304884 0.7657077 0.9968409 -0.732167 0.7657077 0.9968409 -0.7342907 0.7657077 0.9968409 -0.7369774 0.7657077 0.9968409 -0.7403765 0.7657077 0.9968409 -0.7446768 0.7657077 0.9968409 -0.7501172 0.7657077 0.9968409 -0.757 0.7657077 0.9968409 -0.7657077 0.7657077 0.9968409 -0.776724 0.7657077 0.9968409 -0.7906611 0.7657077 0.9968409 -0.8082934 0.7657077 0.9968409 -0.8306004 0.7657077 0.9968409 -0.8588218 0.7657077 0.9968409 -0.8945255 0.7657077 0.9968409 -0.9396953 0.7657077 0.9968409 -0.9968409 0.7657077 0.9968409 -0.9975189 0.7982669 0.9500442 -0.9980488 0.8292297 0.9280401 -0.9984638 0.8574015 0.921255 -0.9987895 0.8822279 0.9232341 -0.9990455 0.9035886 0.9297854 -0.999247 0.9216339 0.9382977 -0.9994057 0.9366635 0.9472259 -0.9995308 0.9490434 0.9557192 -0.9996295 0.9591524 0.963362 -0.9997074 0.9673508 0.9700002 -0.9997688 0.9739638 0.9756289 -0.9998174 0.9792755 0.9803206 -0.9998557 0.9835276 0.9841829 -0.999886 0.9869223 0.987333 -0.9999099 0.989627 0.9898842 -0.9999288 0.9917782 0.9919392 -0.9999437 0.9934871 0.9935878 -0.7251659 0.7775169 0.9968475 -0.7251605 0.7775065 0.9968474 -0.7251537 0.7774933 0.9968473 -0.7251454 0.7774769 0.9968472 -0.7251351 0.7774563 0.996847 -0.7251226 0.7774307 0.9968468 -0.7251076 0.7773989 0.9968465 -0.7250899 0.7773598 0.9968462 -0.7250697 0.7773119 0.9968458 -0.7250473 0.7772541 0.9968453 -0.7250244 0.7771851 0.9968448 -0.7250039 0.7771048 0.9968441 -0.7249916 0.7770141 0.9968433 -0.7249978 0.7769169 0.9968425 -0.7250408 0.7768223 0.9968418 -0.7251511 0.7767478 0.9968411 -0.7253775 0.776724 0.9968409 -0.7257011 0.776724 0.9968409 -0.7261105 0.776724 0.9968409 -0.7266285 0.776724 0.9968409 -0.7272837 0.776724 0.9968409 -0.7281127 0.776724 0.9968409 -0.7291615 0.776724 0.9968409 -0.7304884 0.776724 0.9968409 -0.732167 0.776724 0.9968409 -0.7342907 0.776724 0.9968409 -0.7369774 0.776724 0.9968409 -0.7403765 0.776724 0.9968409 -0.7446768 0.776724 0.9968409 -0.7501172 0.776724 0.9968409 -0.757 0.776724 0.9968409 -0.7657077 0.776724 0.9968409 -0.776724 0.776724 0.9968409 -0.7906611 0.776724 0.9968409 -0.8082934 0.776724 0.9968409 -0.8306004 0.776724 0.9968409 -0.8588218 0.776724 0.9968409 -0.8945255 0.776724 0.9968409 -0.9396953 0.776724 0.9968409 -0.9968409 0.776724 0.9968409 -0.9975189 0.8055009 0.9500442 -0.9980488 0.8339392 0.9280401 -0.9984638 0.8604449 0.921255 -0.9987895 0.8841823 0.9232341 -0.9990455 0.9048372 0.9297854 -0.999247 0.9224281 0.9382977 -0.9994057 0.9371669 0.9472259 -0.9995308 0.9493615 0.9557192 -0.9996295 0.959353 0.963362 -0.9997074 0.967477 0.9700002 -0.9997688 0.9740432 0.9756289 -0.9998174 0.9793253 0.9803206 -0.9998557 0.9835588 0.9841829 -0.999886 0.9869419 0.987333 -0.9999099 0.9896392 0.9898842 -0.9999288 0.9917859 0.9919392 -0.9999437 0.9934919 0.9935878 -0.7251659 0.7914042 0.9968475 -0.7251605 0.7913944 0.9968474 -0.7251537 0.7913821 0.9968473 -0.7251454 0.7913667 0.9968472 -0.7251351 0.7913474 0.996847 -0.7251226 0.7913234 0.9968468 -0.7251076 0.7912937 0.9968465 -0.7250899 0.791257 0.9968462 -0.7250697 0.7912121 0.9968458 -0.7250473 0.7911579 0.9968453 -0.7250244 0.7910933 0.9968448 -0.7250039 0.791018 0.9968441 -0.7249916 0.790933 0.9968433 -0.7249978 0.7908419 0.9968425 -0.7250408 0.7907532 0.9968418 -0.7251511 0.7906834 0.9968411 -0.7253775 0.7906611 0.9968409 -0.7257011 0.7906611 0.9968409 -0.7261105 0.7906611 0.9968409 -0.7266285 0.7906611 0.9968409 -0.7272837 0.7906611 0.9968409 -0.7281127 0.7906611 0.9968409 -0.7291615 0.7906611 0.9968409 -0.7304884 0.7906611 0.9968409 -0.732167 0.7906611 0.9968409 -0.7342907 0.7906611 0.9968409 -0.7369774 0.7906611 0.9968409 -0.7403765 0.7906611 0.9968409 -0.7446768 0.7906611 0.9968409 -0.7501172 0.7906611 0.9968409 -0.757 0.7906611 0.9968409 -0.7657077 0.7906611 0.9968409 -0.776724 0.7906611 0.9968409 -0.7906611 0.7906611 0.9968409 -0.8082934 0.7906611 0.9968409 -0.8306004 0.7906611 0.9968409 -0.8588218 0.7906611 0.9968409 -0.8945255 0.7906611 0.9968409 -0.9396953 0.7906611 0.9968409 -0.9968409 0.7906611 0.9968409 -0.9975189 0.8146529 0.9500442 -0.9980488 0.8398974 0.9280401 -0.9984638 0.8642952 0.921255 -0.9987895 0.886655 0.9232341 -0.9990455 0.9064168 0.9297854 -0.999247 0.9234329 0.9382977 -0.9994057 0.9378038 0.9472259 -0.9995308 0.9497641 0.9557192 -0.9996295 0.9596068 0.963362 -0.9997074 0.9676368 0.9700002 -0.9997688 0.9741436 0.9756289 -0.9998174 0.9793883 0.9803206 -0.9998557 0.9835983 0.9841829 -0.999886 0.9869667 0.987333 -0.9999099 0.9896547 0.9898842 -0.9999288 0.9917956 0.9919392 -0.9999437 0.993498 0.9935878 -0.7251659 0.8089735 0.9968475 -0.7251605 0.8089645 0.9968474 -0.7251537 0.8089533 0.9968473 -0.7251454 0.8089391 0.9968472 -0.7251351 0.8089215 0.996847 -0.7251226 0.8088995 0.9968468 -0.7251076 0.8088723 0.9968465 -0.7250899 0.8088387 0.9968462 -0.7250697 0.8087977 0.9968458 -0.7250473 0.808748 0.9968453 -0.7250244 0.8086889 0.9968448 -0.7250039 0.8086199 0.9968441 -0.7249916 0.8085421 0.9968433 -0.7249978 0.8084588 0.9968425 -0.7250408 0.8083776 0.9968418 -0.7251511 0.8083138 0.9968411 -0.7253775 0.8082934 0.9968409 -0.7257011 0.8082934 0.9968409 -0.7261105 0.8082934 0.9968409 -0.7266285 0.8082934 0.9968409 -0.7272837 0.8082934 0.9968409 -0.7281127 0.8082934 0.9968409 -0.7291615 0.8082934 0.9968409 -0.7304884 0.8082934 0.9968409 -0.732167 0.8082934 0.9968409 -0.7342907 0.8082934 0.9968409 -0.7369774 0.8082934 0.9968409 -0.7403765 0.8082934 0.9968409 -0.7446768 0.8082934 0.9968409 -0.7501172 0.8082934 0.9968409 -0.757 0.8082934 0.9968409 -0.7657077 0.8082934 0.9968409 -0.776724 0.8082934 0.9968409 -0.7906611 0.8082934 0.9968409 -0.8082934 0.8082934 0.9968409 -0.8306004 0.8082934 0.9968409 -0.8588218 0.8082934 0.9968409 -0.8945255 0.8082934 0.9968409 -0.9396953 0.8082934 0.9968409 -0.9968409 0.8082934 0.9968409 -0.9975189 0.8262314 0.9500442 -0.9980488 0.8474353 0.9280401 -0.9984638 0.8691663 0.921255 -0.9987895 0.8897832 0.9232341 -0.9990455 0.9084153 0.9297854 -0.999247 0.9247041 0.9382977 -0.9994057 0.9386096 0.9472259 -0.9995308 0.9502734 0.9557192 -0.9996295 0.959928 0.963362 -0.9997074 0.9678389 0.9700002 -0.9997688 0.9742706 0.9756289 -0.9998174 0.9794681 0.9803206 -0.9998557 0.9836483 0.9841829 -0.999886 0.986998 0.987333 -0.9999099 0.9896744 0.9898842 -0.9999288 0.9918079 0.9919392 -0.9999437 0.9935057 0.9935878 -0.7251659 0.8312009 0.9968475 -0.7251605 0.831193 0.9968474 -0.7251537 0.831183 0.9968473 -0.7251454 0.8311705 0.9968472 -0.7251351 0.831155 0.996847 -0.7251226 0.8311356 0.9968468 -0.7251076 0.8311115 0.9968465 -0.7250899 0.8310819 0.9968462 -0.7250697 0.8310457 0.9968458 -0.7250473 0.8310018 0.9968453 -0.7250244 0.8309496 0.9968448 -0.7250039 0.8308888 0.9968441 -0.7249916 0.8308201 0.9968433 -0.7249978 0.8307465 0.9968425 -0.7250408 0.8306748 0.9968418 -0.7251511 0.8306185 0.9968411 -0.7253775 0.8306004 0.9968409 -0.7257011 0.8306004 0.9968409 -0.7261105 0.8306004 0.9968409 -0.7266285 0.8306004 0.9968409 -0.7272837 0.8306004 0.9968409 -0.7281127 0.8306004 0.9968409 -0.7291615 0.8306004 0.9968409 -0.7304884 0.8306004 0.9968409 -0.732167 0.8306004 0.9968409 -0.7342907 0.8306004 0.9968409 -0.7369774 0.8306004 0.9968409 -0.7403765 0.8306004 0.9968409 -0.7446768 0.8306004 0.9968409 -0.7501172 0.8306004 0.9968409 -0.757 0.8306004 0.9968409 -0.7657077 0.8306004 0.9968409 -0.776724 0.8306004 0.9968409 -0.7906611 0.8306004 0.9968409 -0.8082934 0.8306004 0.9968409 -0.8306004 0.8306004 0.9968409 -0.8588218 0.8306004 0.9968409 -0.8945255 0.8306004 0.9968409 -0.9396953 0.8306004 0.9968409 -0.9968409 0.8306004 0.9968409 -0.9975189 0.8408797 0.9500442 -0.9980488 0.8569716 0.9280401 -0.9984638 0.875329 0.921255 -0.9987895 0.8937407 0.9232341 -0.9990455 0.9109436 0.9297854 -0.999247 0.9263124 0.9382977 -0.9994057 0.939629 0.9472259 -0.9995308 0.9509177 0.9557192 -0.9996295 0.9603343 0.963362 -0.9997074 0.9680946 0.9700002 -0.9997688 0.9744313 0.9756289 -0.9998174 0.9795689 0.9803206 -0.9998557 0.9837116 0.9841829 -0.999886 0.9870376 0.987333 -0.9999099 0.9896992 0.9898842 -0.9999288 0.9918234 0.9919392 -0.9999437 0.9935154 0.9935878 -0.7251659 0.8593214 0.9968475 -0.7251605 0.8593148 0.9968474 -0.7251537 0.8593065 0.9968473 -0.7251454 0.8592962 0.9968472 -0.7251351 0.8592832 0.996847 -0.7251226 0.8592671 0.9968468 -0.7251076 0.8592471 0.9968465 -0.7250899 0.8592224 0.9968462 -0.7250697 0.8591922 0.9968458 -0.7250473 0.8591558 0.9968453 -0.7250244 0.8591123 0.9968448 -0.7250039 0.8590617 0.9968441 -0.7249916 0.8590045 0.9968433 -0.7249978 0.8589433 0.9968425 -0.7250408 0.8588837 0.9968418 -0.7251511 0.8588368 0.9968411 -0.7253775 0.8588218 0.9968409 -0.7257011 0.8588218 0.9968409 -0.7261105 0.8588218 0.9968409 -0.7266285 0.8588218 0.9968409 -0.7272837 0.8588218 0.9968409 -0.7281127 0.8588218 0.9968409 -0.7291615 0.8588218 0.9968409 -0.7304884 0.8588218 0.9968409 -0.732167 0.8588218 0.9968409 -0.7342907 0.8588218 0.9968409 -0.7369774 0.8588218 0.9968409 -0.7403765 0.8588218 0.9968409 -0.7446768 0.8588218 0.9968409 -0.7501172 0.8588218 0.9968409 -0.757 0.8588218 0.9968409 -0.7657077 0.8588218 0.9968409 -0.776724 0.8588218 0.9968409 -0.7906611 0.8588218 0.9968409 -0.8082934 0.8588218 0.9968409 -0.8306004 0.8588218 0.9968409 -0.8588218 0.8588218 0.9968409 -0.8945255 0.8588218 0.9968409 -0.9396953 0.8588218 0.9968409 -0.9968409 0.8588218 0.9968409 -0.9975189 0.8594117 0.9500442 -0.9980488 0.8690364 0.9280401 -0.9984638 0.8831255 0.921255 -0.9987895 0.8987476 0.9232341 -0.9990455 0.9141422 0.9297854 -0.999247 0.928347 0.9382977 -0.9994057 0.9409186 0.9472259 -0.9995308 0.9517328 0.9557192 -0.9996295 0.9608482 0.963362 -0.9997074 0.9684181 0.9700002 -0.9997688 0.9746346 0.9756289 -0.9998174 0.9796966 0.9803206 -0.9998557 0.9837916 0.9841829 -0.999886 0.9870878 0.987333 -0.9999099 0.9897306 0.9898842 -0.9999288 0.9918431 0.9919392 -0.9999437 0.9935277 0.9935878 -0.7251659 0.8948976 0.9968475 -0.7251605 0.8948926 0.9968474 -0.7251537 0.8948865 0.9968473 -0.7251454 0.8948788 0.9968472 -0.7251351 0.8948691 0.996847 -0.7251226 0.8948571 0.9968468 -0.7251076 0.8948422 0.9968465 -0.7250899 0.8948238 0.9968462 -0.7250697 0.8948014 0.9968458 -0.7250473 0.8947742 0.9968453 -0.7250244 0.8947418 0.9968448 -0.7250039 0.8947041 0.9968441 -0.7249916 0.8946616 0.9968433 -0.7249978 0.894616 0.9968425 -0.7250408 0.8945716 0.9968418 -0.7251511 0.8945366 0.9968411 -0.7253775 0.8945255 0.9968409 -0.7257011 0.8945255 0.9968409 -0.7261105 0.8945255 0.9968409 -0.7266285 0.8945255 0.9968409 -0.7272837 0.8945255 0.9968409 -0.7281127 0.8945255 0.9968409 -0.7291615 0.8945255 0.9968409 -0.7304884 0.8945255 0.9968409 -0.732167 0.8945255 0.9968409 -0.7342907 0.8945255 0.9968409 -0.7369774 0.8945255 0.9968409 -0.7403765 0.8945255 0.9968409 -0.7446768 0.8945255 0.9968409 -0.7501172 0.8945255 0.9968409 -0.757 0.8945255 0.9968409 -0.7657077 0.8945255 0.9968409 -0.776724 0.8945255 0.9968409 -0.7906611 0.8945255 0.9968409 -0.8082934 0.8945255 0.9968409 -0.8306004 0.8945255 0.9968409 -0.8588218 0.8945255 0.9968409 -0.8945255 0.8945255 0.9968409 -0.9396953 0.8945255 0.9968409 -0.9968409 0.8945255 0.9968409 -0.9975189 0.8828571 0.9500442 -0.9980488 0.8842998 0.9280401 -0.9984638 0.892989 0.921255 -0.9987895 0.9050819 0.9232341 -0.9990455 0.9181889 0.9297854 -0.999247 0.9309211 0.9382977 -0.9994057 0.9425502 0.9472259 -0.9995308 0.952764 0.9557192 -0.9996295 0.9614985 0.963362 -0.9997074 0.9688274 0.9700002 -0.9997688 0.9748918 0.9756289 -0.9998174 0.979858 0.9803206 -0.9998557 0.9838928 0.9841829 -0.999886 0.9871512 0.987333 -0.9999099 0.9897703 0.9898842 -0.9999288 0.991868 0.9919392 -0.9999437 0.9935432 0.9935878 -0.7251659 0.939906 0.9968475 -0.7251605 0.9399032 0.9968474 -0.7251537 0.9398997 0.9968473 -0.7251454 0.9398953 0.9968472 -0.7251351 0.9398899 0.996847 -0.7251226 0.9398831 0.9968468 -0.7251076 0.9398746 0.9968465 -0.7250899 0.9398642 0.9968462 -0.7250697 0.9398515 0.9968458 -0.7250473 0.9398361 0.9968453 -0.7250244 0.9398178 0.9968448 -0.7250039 0.9397965 0.9968441 -0.7249916 0.9397723 0.9968433 -0.7249978 0.9397465 0.9968425 -0.7250408 0.9397214 0.9968418 -0.7251511 0.9397016 0.9968411 -0.7253775 0.9396953 0.9968409 -0.7257011 0.9396953 0.9968409 -0.7261105 0.9396953 0.9968409 -0.7266285 0.9396953 0.9968409 -0.7272837 0.9396953 0.9968409 -0.7281127 0.9396953 0.9968409 -0.7291615 0.9396953 0.9968409 -0.7304884 0.9396953 0.9968409 -0.732167 0.9396953 0.9968409 -0.7342907 0.9396953 0.9968409 -0.7369774 0.9396953 0.9968409 -0.7403765 0.9396953 0.9968409 -0.7446768 0.9396953 0.9968409 -0.7501172 0.9396953 0.9968409 -0.757 0.9396953 0.9968409 -0.7657077 0.9396953 0.9968409 -0.776724 0.9396953 0.9968409 -0.7906611 0.9396953 0.9968409 -0.8082934 0.9396953 0.9968409 -0.8306004 0.9396953 0.9968409 -0.8588218 0.9396953 0.9968409 -0.8945255 0.9396953 0.9968409 -0.9396953 0.9396953 0.9968409 -0.9968409 0.9396953 0.9968409 -0.9975189 0.9125186 0.9500442 -0.9980488 0.9036101 0.9280401 -0.9984638 0.9054678 0.921255 -0.9987895 0.9130957 0.9232341 -0.9990455 0.9233085 0.9297854 -0.999247 0.9341777 0.9382977 -0.9994057 0.9446144 0.9472259 -0.9995308 0.9540687 0.9557192 -0.9996295 0.9623212 0.963362 -0.9997074 0.9693452 0.9700002 -0.9997688 0.9752172 0.9756289 -0.9998174 0.9800622 0.9803206 -0.9998557 0.9840209 0.9841829 -0.999886 0.9872315 0.987333 -0.9999099 0.9898206 0.9898842 -0.9999288 0.9918994 0.9919392 -0.9999437 0.9935629 0.9935878 -0.7251659 0.9968475 0.9968475 -0.7251605 0.9968474 0.9968474 -0.7251537 0.9968473 0.9968473 -0.7251454 0.9968472 0.9968472 -0.7251351 0.996847 0.996847 -0.7251226 0.9968468 0.9968468 -0.7251076 0.9968465 0.9968465 -0.7250899 0.9968462 0.9968462 -0.7250697 0.9968458 0.9968458 -0.7250473 0.9968453 0.9968453 -0.7250244 0.9968448 0.9968448 -0.7250039 0.9968441 0.9968441 -0.7249916 0.9968433 0.9968433 -0.7249978 0.9968425 0.9968425 -0.7250408 0.9968418 0.9968418 -0.7251511 0.9968411 0.9968411 -0.7253775 0.9968409 0.9968409 -0.7257011 0.9968409 0.9968409 -0.7261105 0.9968409 0.9968409 -0.7266285 0.9968409 0.9968409 -0.7272837 0.9968409 0.9968409 -0.7281127 0.9968409 0.9968409 -0.7291615 0.9968409 0.9968409 -0.7304884 0.9968409 0.9968409 -0.732167 0.9968409 0.9968409 -0.7342907 0.9968409 0.9968409 -0.7369774 0.9968409 0.9968409 -0.7403765 0.9968409 0.9968409 -0.7446768 0.9968409 0.9968409 -0.7501172 0.9968409 0.9968409 -0.757 0.9968409 0.9968409 -0.7657077 0.9968409 0.9968409 -0.776724 0.9968409 0.9968409 -0.7906611 0.9968409 0.9968409 -0.8082934 0.9968409 0.9968409 -0.8306004 0.9968409 0.9968409 -0.8588218 0.9968409 0.9968409 -0.8945255 0.9968409 0.9968409 -0.9396953 0.9968409 0.9968409 -0.9968409 0.9968409 0.9968409 -0.9975189 0.9500442 0.9500442 -0.9980488 0.9280401 0.9280401 -0.9984638 0.921255 0.921255 -0.9987895 0.9232341 0.9232341 -0.9990455 0.9297854 0.9297854 -0.999247 0.9382977 0.9382977 -0.9994057 0.9472259 0.9472259 -0.9995308 0.9557192 0.9557192 -0.9996295 0.963362 0.963362 -0.9997074 0.9700002 0.9700002 -0.9997688 0.9756289 0.9756289 -0.9998174 0.9803206 0.9803206 -0.9998557 0.9841829 0.9841829 -0.999886 0.987333 0.987333 -0.9999099 0.9898842 0.9898842 -0.9999288 0.9919392 0.9919392 -0.9999437 0.9935878 0.9935878 -0.7716588 0.997523 0.9501853 -0.7716551 0.997523 0.9501835 -0.7716504 0.9975229 0.9501811 -0.7716446 0.9975228 0.9501782 -0.7716375 0.9975227 0.9501745 -0.7716288 0.9975226 0.95017 -0.7716184 0.9975224 0.9501643 -0.7716061 0.9975222 0.9501574 -0.7715919 0.997522 0.9501488 -0.7715762 0.9975217 0.9501385 -0.7715599 0.9975213 0.9501262 -0.7715449 0.9975209 0.9501119 -0.7715352 0.9975204 0.9500958 -0.7715376 0.9975199 0.9500785 -0.7715641 0.9975194 0.9500617 -0.7716352 0.9975191 0.9500484 -0.7717834 0.9975189 0.9500442 -0.7719959 0.9975189 0.9500442 -0.7722648 0.9975189 0.9500442 -0.7726049 0.9975189 0.9500442 -0.7730352 0.9975189 0.9500442 -0.7735795 0.9975189 0.9500442 -0.7742682 0.9975189 0.9500442 -0.7751395 0.9975189 0.9500442 -0.7762418 0.9975189 0.9500442 -0.7776364 0.9975189 0.9500442 -0.7794007 0.9975189 0.9500442 -0.7816327 0.9975189 0.9500442 -0.7844566 0.9975189 0.9500442 -0.7880291 0.9975189 0.9500442 -0.7925488 0.9975189 0.9500442 -0.7982669 0.9975189 0.9500442 -0.8055009 0.9975189 0.9500442 -0.8146529 0.9975189 0.9500442 -0.8262314 0.9975189 0.9500442 -0.8408797 0.9975189 0.9500442 -0.8594117 0.9975189 0.9500442 -0.8828571 0.9975189 0.9500442 -0.9125186 0.9975189 0.9500442 -0.9500442 0.9975189 0.9500442 -0.9975189 0.9975189 0.9500442 -0.9980488 0.9589472 0.9280401 -0.9984638 0.9412278 0.921255 -0.9987895 0.9360606 0.9232341 -0.9990455 0.9379796 0.9297854 -0.999247 0.94351 0.9382977 -0.9994057 0.9505298 0.9472259 -0.9995308 0.9578074 0.9557192 -0.9996295 0.9646787 0.963362 -0.9997074 0.970829 0.9700002 -0.9997688 0.9761497 0.9756289 -0.9998174 0.9806476 0.9803206 -0.9998557 0.984388 0.9841829 -0.999886 0.9874615 0.987333 -0.9999099 0.9899646 0.9898842 -0.9999288 0.9919896 0.9919392 -0.9999437 0.9936193 0.9935878 -0.8119154 0.9980513 0.9282055 -0.8119128 0.9980512 0.9282033 -0.8119096 0.9980512 0.9282006 -0.8119057 0.9980511 0.9281971 -0.8119009 0.9980511 0.9281928 -0.8118949 0.998051 0.9281875 -0.8118878 0.9980509 0.9281809 -0.8118794 0.9980508 0.9281727 -0.8118697 0.9980506 0.9281627 -0.8118589 0.9980504 0.9281506 -0.8118476 0.9980502 0.9281362 -0.811837 0.99805 0.9281195 -0.8118298 0.9980497 0.9281006 -0.8118303 0.9980494 0.9280803 -0.8118466 0.9980491 0.9280606 -0.8118921 0.9980488 0.9280451 -0.8119884 0.9980488 0.9280401 -0.8121268 0.9980488 0.9280401 -0.8123018 0.9980488 0.9280401 -0.8125232 0.9980488 0.9280401 -0.8128033 0.9980488 0.9280401 -0.8131577 0.9980488 0.9280401 -0.8136061 0.9980488 0.9280401 -0.8141733 0.9980488 0.9280401 -0.8148909 0.9980488 0.9280401 -0.8157988 0.9980488 0.9280401 -0.8169474 0.9980488 0.9280401 -0.8184005 0.9980488 0.9280401 -0.8202389 0.9980488 0.9280401 -0.8225647 0.9980488 0.9280401 -0.8255071 0.9980488 0.9280401 -0.8292297 0.9980488 0.9280401 -0.8339392 0.9980488 0.9280401 -0.8398974 0.9980488 0.9280401 -0.8474353 0.9980488 0.9280401 -0.8569716 0.9980488 0.9280401 -0.8690364 0.9980488 0.9280401 -0.8842998 0.9980488 0.9280401 -0.9036101 0.9980488 0.9280401 -0.9280401 0.9980488 0.9280401 -0.9589472 0.9980488 0.9280401 -0.9980488 0.9980488 0.9280401 -0.9984638 0.9664961 0.921255 -0.9987895 0.9522877 0.9232341 -0.9990455 0.9483463 0.9297854 -0.999247 0.9501042 0.9382977 -0.9994057 0.9547096 0.9472259 -0.9995308 0.9604492 0.9557192 -0.9996295 0.9663445 0.963362 -0.9997074 0.9718774 0.9700002 -0.9997688 0.9768086 0.9756289 -0.9998174 0.9810611 0.9803206 -0.9998557 0.9846473 0.9841829 -0.999886 0.987624 0.987333 -0.9999099 0.9900664 0.9898842 -0.9999288 0.9920533 0.9919392 -0.9999437 0.9936592 0.9935878 -0.8462171 0.9984653 0.9214008 -0.8462154 0.9984653 0.9213989 -0.8462132 0.9984653 0.9213965 -0.8462106 0.9984653 0.9213934 -0.8462073 0.9984652 0.9213897 -0.8462034 0.9984652 0.9213849 -0.8461986 0.9984651 0.9213791 -0.8461929 0.998465 0.9213719 -0.8461864 0.9984649 0.9213631 -0.8461791 0.9984648 0.9213524 -0.8461714 0.9984647 0.9213397 -0.8461641 0.9984645 0.921325 -0.8461589 0.9984643 0.9213083 -0.8461587 0.9984642 0.9212904 -0.8461687 0.998464 0.921273 -0.8461977 0.9984638 0.9212593 -0.8462598 0.9984638 0.921255 -0.8463492 0.9984638 0.921255 -0.8464623 0.9984638 0.921255 -0.8466054 0.9984638 0.921255 -0.8467864 0.9984638 0.921255 -0.8470154 0.9984638 0.921255 -0.8473052 0.9984638 0.921255 -0.8476717 0.9984638 0.921255 -0.8481355 0.9984638 0.921255 -0.8487222 0.9984638 0.921255 -0.8494644 0.9984638 0.921255 -0.8504035 0.9984638 0.921255 -0.8515915 0.9984638 0.921255 -0.8530945 0.9984638 0.921255 -0.8549959 0.9984638 0.921255 -0.8574015 0.9984638 0.921255 -0.8604449 0.9984638 0.921255 -0.8642952 0.9984638 0.921255 -0.8691663 0.9984638 0.921255 -0.875329 0.9984638 0.921255 -0.8831255 0.9984638 0.921255 -0.892989 0.9984638 0.921255 -0.9054678 0.9984638 0.921255 -0.921255 0.9984638 0.921255 -0.9412278 0.9984638 0.921255 -0.9664961 0.9984638 0.921255 -0.9984638 0.9984638 0.921255 -0.9987895 0.9728171 0.9232341 -0.9990455 0.9614615 0.9297854 -0.999247 0.9584468 0.9382977 -0.9994057 0.9599976 0.9472259 -0.9995308 0.9637914 0.9557192 -0.9996295 0.968452 0.963362 -0.9997074 0.9732039 0.9700002 -0.9997688 0.9776422 0.9756289 -0.9998174 0.9815844 0.9803206 -0.9998557 0.9849754 0.9841829 -0.999886 0.9878296 0.987333 -0.9999099 0.9901951 0.9898842 -0.9999288 0.9921339 0.9919392 -0.9999437 0.9937096 0.9935878 -0.8750477 0.9987905 0.9233482 -0.8750466 0.9987905 0.9233467 -0.8750451 0.9987904 0.9233448 -0.8750434 0.9987904 0.9233424 -0.8750412 0.9987904 0.9233395 -0.8750386 0.9987904 0.9233358 -0.8750355 0.9987903 0.9233312 -0.8750317 0.9987903 0.9233256 -0.8750274 0.9987902 0.9233187 -0.8750225 0.9987902 0.9233103 -0.8750173 0.9987901 0.9233004 -0.8750124 0.99879 0.9232889 -0.8750088 0.9987899 0.9232758 -0.8750084 0.9987897 0.9232619 -0.8750145 0.9987896 0.9232483 -0.8750329 0.9987895 0.9232376 -0.8750727 0.9987895 0.9232341 -0.8751301 0.9987895 0.9232341 -0.8752028 0.9987895 0.9232341 -0.8752947 0.9987895 0.9232341 -0.8754109 0.9987895 0.9232341 -0.875558 0.9987895 0.9232341 -0.8757441 0.9987895 0.9232341 -0.8759795 0.9987895 0.9232341 -0.8762773 0.9987895 0.9232341 -0.8766541 0.9987895 0.9232341 -0.8771307 0.9987895 0.9232341 -0.8777338 0.9987895 0.9232341 -0.8784967 0.9987895 0.9232341 -0.8794619 0.9987895 0.9232341 -0.880683 0.9987895 0.9232341 -0.8822279 0.9987895 0.9232341 -0.8841823 0.9987895 0.9232341 -0.886655 0.9987895 0.9232341 -0.8897832 0.9987895 0.9232341 -0.8937407 0.9987895 0.9232341 -0.8987476 0.9987895 0.9232341 -0.9050819 0.9987895 0.9232341 -0.9130957 0.9987895 0.9232341 -0.9232341 0.9987895 0.9232341 -0.9360606 0.9987895 0.9232341 -0.9522877 0.9987895 0.9232341 -0.9728171 0.9987895 0.9232341 -0.9987895 0.9987895 0.9232341 -0.9990455 0.9780539 0.9297854 -0.999247 0.9690013 0.9382977 -0.9994057 0.9666876 0.9472259 -0.9995308 0.9680197 0.9557192 -0.9996295 0.9711183 0.963362 -0.9997074 0.974882 0.9700002 -0.9997688 0.9786968 0.9756289 -0.9998174 0.9822464 0.9803206 -0.9998557 0.9853905 0.9841829 -0.999886 0.9880897 0.987333 -0.9999099 0.990358 0.9898842 -0.9999288 0.9922358 0.9919392 -0.9999437 0.9937734 0.9935878 -0.8990028 0.9990461 0.9298688 -0.899002 0.9990461 0.9298677 -0.8990011 0.9990461 0.9298664 -0.899 0.9990461 0.9298646 -0.8989986 0.9990461 0.9298625 -0.8989969 0.9990461 0.9298598 -0.8989948 0.9990461 0.9298564 -0.8989923 0.999046 0.9298523 -0.8989895 0.999046 0.9298472 -0.8989863 0.9990459 0.9298411 -0.8989829 0.9990459 0.9298339 -0.8989796 0.9990458 0.9298254 -0.8989771 0.9990458 0.9298159 -0.8989767 0.9990457 0.9298057 -0.8989805 0.9990456 0.9297957 -0.8989921 0.9990456 0.9297879 -0.8990175 0.9990455 0.9297854 -0.8990542 0.9990455 0.9297854 -0.8991006 0.9990455 0.9297854 -0.8991593 0.9990455 0.9297854 -0.8992336 0.9990455 0.9297854 -0.8993275 0.9990455 0.9297854 -0.8994464 0.9990455 0.9297854 -0.8995968 0.9990455 0.9297854 -0.899787 0.9990455 0.9297854 -0.9000277 0.9990455 0.9297854 -0.9003323 0.9990455 0.9297854 -0.9007175 0.9990455 0.9297854 -0.9012049 0.9990455 0.9297854 -0.9018215 0.9990455 0.9297854 -0.9026016 0.9990455 0.9297854 -0.9035886 0.9990455 0.9297854 -0.9048372 0.9990455 0.9297854 -0.9064168 0.9990455 0.9297854 -0.9084153 0.9990455 0.9297854 -0.9109436 0.9990455 0.9297854 -0.9141422 0.9990455 0.9297854 -0.9181889 0.9990455 0.9297854 -0.9233085 0.9990455 0.9297854 -0.9297854 0.9990455 0.9297854 -0.9379796 0.9990455 0.9297854 -0.9483463 0.9990455 0.9297854 -0.9614615 0.9990455 0.9297854 -0.9780539 0.9990455 0.9297854 -0.9990455 0.9990455 0.9297854 -0.999247 0.982354 0.9382977 -0.9994057 0.9751513 0.9472259 -0.9995308 0.9733691 0.9557192 -0.9996295 0.9744915 0.963362 -0.9997074 0.977005 0.9700002 -0.9997688 0.980031 0.9756289 -0.9998174 0.9830838 0.9803206 -0.9998557 0.9859157 0.9841829 -0.999886 0.9884188 0.987333 -0.9999099 0.9905641 0.9898842 -0.9999288 0.9923648 0.9919392 -0.9999437 0.9938541 0.9935878 -0.9187175 0.9992474 0.9383562 -0.918717 0.9992474 0.9383554 -0.9187164 0.9992474 0.9383544 -0.9187157 0.9992474 0.9383532 -0.9187148 0.9992474 0.9383517 -0.9187137 0.9992474 0.9383498 -0.9187123 0.9992473 0.9383474 -0.9187107 0.9992473 0.9383446 -0.9187089 0.9992473 0.938341 -0.9187068 0.9992473 0.9383367 -0.9187045 0.9992472 0.9383317 -0.9187024 0.9992472 0.9383257 -0.9187008 0.9992472 0.938319 -0.9187004 0.9992471 0.9383119 -0.9187027 0.9992471 0.9383049 -0.9187101 0.999247 0.9382994 -0.9187262 0.999247 0.9382977 -0.9187495 0.999247 0.9382977 -0.9187791 0.999247 0.9382977 -0.9188164 0.999247 0.9382977 -0.9188636 0.999247 0.9382977 -0.9189234 0.999247 0.9382977 -0.918999 0.999247 0.9382977 -0.9190947 0.999247 0.9382977 -0.9192157 0.999247 0.9382977 -0.9193688 0.999247 0.9382977 -0.9195625 0.999247 0.9382977 -0.9198076 0.999247 0.9382977 -0.9201176 0.999247 0.9382977 -0.9205098 0.999247 0.9382977 -0.9210061 0.999247 0.9382977 -0.9216339 0.999247 0.9382977 -0.9224281 0.999247 0.9382977 -0.9234329 0.999247 0.9382977 -0.9247041 0.999247 0.9382977 -0.9263124 0.999247 0.9382977 -0.928347 0.999247 0.9382977 -0.9309211 0.999247 0.9382977 -0.9341777 0.999247 0.9382977 -0.9382977 0.999247 0.9382977 -0.94351 0.999247 0.9382977 -0.9501042 0.999247 0.9382977 -0.9584468 0.999247 0.9382977 -0.9690013 0.999247 0.9382977 -0.982354 0.999247 0.9382977 -0.999247 0.999247 0.9382977 -0.9994057 0.9858591 0.9472259 -0.9995308 0.9801368 0.9557192 -0.9996295 0.978759 0.963362 -0.9997074 0.9796909 0.9700002 -0.9997688 0.981719 0.9756289 -0.9998174 0.9841433 0.9803206 -0.9998557 0.9865801 0.9841829 -0.999886 0.9888351 0.987333 -0.9999099 0.9908248 0.9898842 -0.9999288 0.992528 0.9919392 -0.9999437 0.9939562 0.9935878 -0.9348153 0.999406 0.9472658 -0.9348149 0.999406 0.9472652 -0.9348146 0.999406 0.9472646 -0.9348141 0.999406 0.9472638 -0.9348135 0.999406 0.9472627 -0.9348128 0.9994059 0.9472614 -0.9348119 0.9994059 0.9472598 -0.9348109 0.9994059 0.9472579 -0.9348097 0.9994059 0.9472555 -0.9348083 0.9994059 0.9472525 -0.9348069 0.9994059 0.9472491 -0.9348055 0.9994059 0.947245 -0.9348044 0.9994058 0.9472405 -0.9348042 0.9994058 0.9472356 -0.9348056 0.9994058 0.9472309 -0.9348102 0.9994057 0.9472271 -0.9348204 0.9994057 0.9472259 -0.9348352 0.9994057 0.9472259 -0.9348539 0.9994057 0.9472259 -0.9348776 0.9994057 0.9472259 -0.9349075 0.9994057 0.9472259 -0.9349454 0.9994057 0.9472259 -0.9349933 0.9994057 0.9472259 -0.935054 0.9994057 0.9472259 -0.9351307 0.9994057 0.9472259 -0.9352277 0.9994057 0.9472259 -0.9353505 0.9994057 0.9472259 -0.9355059 0.9994057 0.9472259 -0.9357024 0.9994057 0.9472259 -0.935951 0.9994057 0.9472259 -0.9362655 0.9994057 0.9472259 -0.9366635 0.9994057 0.9472259 -0.9371669 0.9994057 0.9472259 -0.9378038 0.9994057 0.9472259 -0.9386096 0.9994057 0.9472259 -0.939629 0.9994057 0.9472259 -0.9409186 0.9994057 0.9472259 -0.9425502 0.9994057 0.9472259 -0.9446144 0.9994057 0.9472259 -0.9472259 0.9994057 0.9472259 -0.9505298 0.9994057 0.9472259 -0.9547096 0.9994057 0.9472259 -0.9599976 0.9994057 0.9472259 -0.9666876 0.9994057 0.9472259 -0.9751513 0.9994057 0.9472259 -0.9858591 0.9994057 0.9472259 -0.9994057 0.9994057 0.9472259 -0.9995308 0.9886988 0.9557192 -0.9996295 0.9841579 0.963362 -0.9997074 0.983089 0.9700002 -0.9997688 0.9838545 0.9756289 -0.9998174 0.9854838 0.9803206 -0.9998557 0.9874207 0.9841829 -0.999886 0.9893618 0.987333 -0.9999099 0.9911547 0.9898842 -0.9999288 0.9927345 0.9919392 -0.9999437 0.9940854 0.9935878 -0.9478754 0.999531 0.9557458 -0.9478752 0.999531 0.9557455 -0.947875 0.999531 0.955745 -0.9478746 0.999531 0.9557445 -0.9478743 0.999531 0.9557438 -0.9478738 0.999531 0.9557429 -0.9478733 0.999531 0.9557418 -0.9478726 0.999531 0.9557405 -0.9478718 0.999531 0.9557389 -0.947871 0.9995309 0.955737 -0.94787 0.9995309 0.9557347 -0.9478691 0.9995309 0.955732 -0.9478684 0.9995309 0.9557289 -0.9478683 0.9995309 0.9557257 -0.9478691 0.9995309 0.9557225 -0.947872 0.9995309 0.95572 -0.9478785 0.9995308 0.9557192 -0.9478878 0.9995308 0.9557192 -0.9478997 0.9995308 0.9557192 -0.9479146 0.9995308 0.9557192 -0.9479335 0.9995308 0.9557192 -0.9479575 0.9995308 0.9557192 -0.9479878 0.9995308 0.9557192 -0.9480261 0.9995308 0.9557192 -0.9480746 0.9995308 0.9557192 -0.9481359 0.9995308 0.9557192 -0.9482135 0.9995308 0.9557192 -0.9483117 0.9995308 0.9557192 -0.9484359 0.9995308 0.9557192 -0.9485931 0.9995308 0.9557192 -0.9487918 0.9995308 0.9557192 -0.9490434 0.9995308 0.9557192 -0.9493615 0.9995308 0.9557192 -0.9497641 0.9995308 0.9557192 -0.9502734 0.9995308 0.9557192 -0.9509177 0.9995308 0.9557192 -0.9517328 0.9995308 0.9557192 -0.952764 0.9995308 0.9557192 -0.9540687 0.9995308 0.9557192 -0.9557192 0.9995308 0.9557192 -0.9578074 0.9995308 0.9557192 -0.9604492 0.9995308 0.9557192 -0.9637914 0.9995308 0.9557192 -0.9680197 0.9995308 0.9557192 -0.9733691 0.9995308 0.9557192 -0.9801368 0.9995308 0.9557192 -0.9886988 0.9995308 0.9557192 -0.9995308 0.9995308 0.9557192 -0.9996295 0.9909882 0.963362 -0.9997074 0.9873879 0.9700002 -0.9997688 0.9865561 0.9756289 -0.9998174 0.9871796 0.9803206 -0.9998557 0.9884841 0.9841829 -0.999886 0.9900282 0.987333 -0.9999099 0.991572 0.9898842 -0.9999288 0.9929957 0.9919392 -0.9999437 0.9942488 0.9935878 -0.958416 0.9996296 0.9633794 -0.9584159 0.9996296 0.9633792 -0.9584157 0.9996296 0.9633789 -0.9584155 0.9996296 0.9633786 -0.9584153 0.9996296 0.9633781 -0.958415 0.9996296 0.9633775 -0.9584146 0.9996296 0.9633768 -0.9584142 0.9996296 0.963376 -0.9584137 0.9996296 0.9633749 -0.9584132 0.9996296 0.9633736 -0.9584126 0.9996296 0.9633721 -0.958412 0.9996296 0.9633703 -0.9584115 0.9996296 0.9633684 -0.9584114 0.9996295 0.9633662 -0.958412 0.9996295 0.9633641 -0.9584138 0.9996295 0.9633625 -0.9584178 0.9996295 0.963362 -0.9584237 0.9996295 0.963362 -0.9584312 0.9996295 0.963362 -0.9584406 0.9996295 0.963362 -0.9584526 0.9996295 0.963362 -0.9584677 0.9996295 0.963362 -0.9584868 0.9996295 0.963362 -0.9585109 0.9996295 0.963362 -0.9585415 0.9996295 0.963362 -0.9585802 0.9996295 0.963362 -0.9586291 0.9996295 0.963362 -0.958691 0.9996295 0.963362 -0.9587693 0.9996295 0.963362 -0.9588684 0.9996295 0.963362 -0.9589938 0.9996295 0.963362 -0.9591524 0.9996295 0.963362 -0.959353 0.9996295 0.963362 -0.9596068 0.9996295 0.963362 -0.959928 0.9996295 0.963362 -0.9603343 0.9996295 0.963362 -0.9608482 0.9996295 0.963362 -0.9614985 0.9996295 0.963362 -0.9623212 0.9996295 0.963362 -0.963362 0.9996295 0.963362 -0.9646787 0.9996295 0.963362 -0.9663445 0.9996295 0.963362 -0.968452 0.9996295 0.963362 -0.9711183 0.9996295 0.963362 -0.9744915 0.9996295 0.963362 -0.978759 0.9996295 0.963362 -0.9841579 0.9996295 0.963362 -0.9909882 0.9996295 0.963362 -0.9996295 0.9996295 0.963362 -0.9997074 0.9928267 0.9700002 -0.9997688 0.9899741 0.9756289 -0.9998174 0.989325 0.9803206 -0.9998557 0.9898295 0.9841829 -0.999886 0.9908712 0.987333 -0.9999099 0.9920999 0.9898842 -0.9999288 0.9933261 0.9919392 -0.9999437 0.9944556 0.9935878 -0.9668873 0.9997074 0.9700116 -0.9668872 0.9997074 0.9700114 -0.9668871 0.9997074 0.9700112 -0.966887 0.9997074 0.970011 -0.9668869 0.9997074 0.9700107 -0.9668867 0.9997074 0.9700103 -0.9668865 0.9997074 0.9700099 -0.9668862 0.9997074 0.9700093 -0.9668859 0.9997074 0.9700086 -0.9668855 0.9997074 0.9700078 -0.9668852 0.9997074 0.9700068 -0.9668848 0.9997074 0.9700057 -0.9668845 0.9997074 0.9700044 -0.9668844 0.9997074 0.970003 -0.9668847 0.9997074 0.9700016 -0.9668859 0.9997074 0.9700006 -0.9668884 0.9997074 0.9700002 -0.9668922 0.9997074 0.9700002 -0.9668969 0.9997074 0.9700002 -0.9669028 0.9997074 0.9700002 -0.9669103 0.9997074 0.9700002 -0.9669198 0.9997074 0.9700002 -0.9669318 0.9997074 0.9700002 -0.966947 0.9997074 0.9700002 -0.9669663 0.9997074 0.9700002 -0.9669906 0.9997074 0.9700002 -0.9670214 0.9997074 0.9700002 -0.9670604 0.9997074 0.9700002 -0.9671097 0.9997074 0.9700002 -0.967172 0.9997074 0.9700002 -0.9672509 0.9997074 0.9700002 -0.9673508 0.9997074 0.9700002 -0.967477 0.9997074 0.9700002 -0.9676368 0.9997074 0.9700002 -0.9678389 0.9997074 0.9700002 -0.9680946 0.9997074 0.9700002 -0.9684181 0.9997074 0.9700002 -0.9688274 0.9997074 0.9700002 -0.9693452 0.9997074 0.9700002 -0.9700002 0.9997074 0.9700002 -0.970829 0.9997074 0.9700002 -0.9718774 0.9997074 0.9700002 -0.9732039 0.9997074 0.9700002 -0.974882 0.9997074 0.9700002 -0.977005 0.9997074 0.9700002 -0.9796909 0.9997074 0.9700002 -0.983089 0.9997074 0.9700002 -0.9873879 0.9997074 0.9700002 -0.9928267 0.9997074 0.9700002 -0.9997074 0.9997074 0.9700002 -0.9997688 0.9942982 0.9756289 -0.9998174 0.9920392 0.9803206 -0.9998557 0.9915316 0.9841829 -0.999886 0.9919377 0.987333 -0.9999099 0.9927678 0.9898842 -0.9999288 0.9937442 0.9919392 -0.9999437 0.9947172 0.9935878 -0.9736726 0.9997689 0.9756362 -0.9736726 0.9997689 0.9756361 -0.9736725 0.9997689 0.975636 -0.9736724 0.9997689 0.9756358 -0.9736723 0.9997689 0.9756356 -0.9736722 0.9997689 0.9756354 -0.9736721 0.9997689 0.9756351 -0.9736719 0.9997689 0.9756348 -0.9736717 0.9997689 0.9756343 -0.9736715 0.9997689 0.9756338 -0.9736712 0.9997689 0.9756331 -0.973671 0.9997689 0.9756324 -0.9736708 0.9997689 0.9756316 -0.9736708 0.9997689 0.9756307 -0.973671 0.9997688 0.9756298 -0.9736717 0.9997688 0.9756291 -0.9736733 0.9997688 0.9756289 -0.9736756 0.9997688 0.9756289 -0.9736786 0.9997688 0.9756289 -0.9736823 0.9997688 0.9756289 -0.973687 0.9997688 0.9756289 -0.973693 0.9997688 0.9756289 -0.9737006 0.9997688 0.9756289 -0.9737101 0.9997688 0.9756289 -0.9737222 0.9997688 0.9756289 -0.9737375 0.9997688 0.9756289 -0.9737569 0.9997688 0.9756289 -0.9737814 0.9997688 0.9756289 -0.9738123 0.9997688 0.9756289 -0.9738515 0.9997688 0.9756289 -0.9739011 0.9997688 0.9756289 -0.9739638 0.9997688 0.9756289 -0.9740432 0.9997688 0.9756289 -0.9741436 0.9997688 0.9756289 -0.9742706 0.9997688 0.9756289 -0.9744313 0.9997688 0.9756289 -0.9746346 0.9997688 0.9756289 -0.9748918 0.9997688 0.9756289 -0.9752172 0.9997688 0.9756289 -0.9756289 0.9997688 0.9756289 -0.9761497 0.9997688 0.9756289 -0.9768086 0.9997688 0.9756289 -0.9776422 0.9997688 0.9756289 -0.9786968 0.9997688 0.9756289 -0.980031 0.9997688 0.9756289 -0.981719 0.9997688 0.9756289 -0.9838545 0.9997688 0.9756289 -0.9865561 0.9997688 0.9756289 -0.9899741 0.9997688 0.9756289 -0.9942982 0.9997688 0.9756289 -0.9997688 0.9997688 0.9756289 -0.9998174 0.9954731 0.9803206 -0.9998557 0.9936849 0.9841829 -0.999886 0.993287 0.987333 -0.9999099 0.9936128 0.9898842 -0.9999288 0.9942731 0.9919392 -0.9999437 0.9950481 0.9935878 -0.9790927 0.9998174 0.9803253 -0.9790927 0.9998174 0.9803253 -0.9790927 0.9998174 0.9803252 -0.9790926 0.9998174 0.9803251 -0.9790925 0.9998174 0.980325 -0.9790925 0.9998174 0.9803248 -0.9790924 0.9998174 0.9803246 -0.9790923 0.9998174 0.9803244 -0.9790921 0.9998174 0.9803241 -0.979092 0.9998174 0.9803238 -0.9790919 0.9998174 0.9803234 -0.9790917 0.9998174 0.9803229 -0.9790916 0.9998174 0.9803224 -0.9790916 0.9998174 0.9803218 -0.9790917 0.9998174 0.9803212 -0.9790921 0.9998174 0.9803208 -0.9790931 0.9998174 0.9803206 -0.9790946 0.9998174 0.9803206 -0.9790965 0.9998174 0.9803206 -0.9790988 0.9998174 0.9803206 -0.9791018 0.9998174 0.9803206 -0.9791055 0.9998174 0.9803206 -0.9791103 0.9998174 0.9803206 -0.9791163 0.9998174 0.9803206 -0.9791238 0.9998174 0.9803206 -0.9791334 0.9998174 0.9803206 -0.9791456 0.9998174 0.9803206 -0.979161 0.9998174 0.9803206 -0.9791804 0.9998174 0.9803206 -0.979205 0.9998174 0.9803206 -0.9792361 0.9998174 0.9803206 -0.9792755 0.9998174 0.9803206 -0.9793253 0.9998174 0.9803206 -0.9793883 0.9998174 0.9803206 -0.9794681 0.9998174 0.9803206 -0.9795689 0.9998174 0.9803206 -0.9796966 0.9998174 0.9803206 -0.979858 0.9998174 0.9803206 -0.9800622 0.9998174 0.9803206 -0.9803206 0.9998174 0.9803206 -0.9806476 0.9998174 0.9803206 -0.9810611 0.9998174 0.9803206 -0.9815844 0.9998174 0.9803206 -0.9822464 0.9998174 0.9803206 -0.9830838 0.9998174 0.9803206 -0.9841433 0.9998174 0.9803206 -0.9854838 0.9998174 0.9803206 -0.9871796 0.9998174 0.9803206 -0.989325 0.9998174 0.9803206 -0.9920392 0.9998174 0.9803206 -0.9954731 0.9998174 0.9803206 -0.9998174 0.9998174 0.9803206 -0.9998557 0.9964092 0.9841829 -0.999886 0.9949941 0.987333 -0.9999099 0.9946818 0.9898842 -0.9999288 0.9949422 0.9919392 -0.9999437 0.9954668 0.9935878 -0.9834129 0.9998557 0.9841859 -0.9834129 0.9998557 0.9841859 -0.9834129 0.9998557 0.9841858 -0.9834129 0.9998557 0.9841858 -0.9834128 0.9998557 0.9841857 -0.9834128 0.9998557 0.9841856 -0.9834127 0.9998557 0.9841855 -0.9834127 0.9998557 0.9841853 -0.9834126 0.9998557 0.9841852 -0.9834125 0.9998557 0.9841849 -0.9834124 0.9998557 0.9841847 -0.9834123 0.9998557 0.9841844 -0.9834122 0.9998557 0.984184 -0.9834122 0.9998557 0.9841837 -0.9834123 0.9998557 0.9841833 -0.9834126 0.9998557 0.984183 -0.9834132 0.9998557 0.9841829 -0.9834141 0.9998557 0.9841829 -0.9834153 0.9998557 0.9841829 -0.9834167 0.9998557 0.9841829 -0.9834186 0.9998557 0.9841829 -0.9834209 0.9998557 0.9841829 -0.9834239 0.9998557 0.9841829 -0.9834277 0.9998557 0.9841829 -0.9834324 0.9998557 0.9841829 -0.9834385 0.9998557 0.9841829 -0.9834461 0.9998557 0.9841829 -0.9834557 0.9998557 0.9841829 -0.9834679 0.9998557 0.9841829 -0.9834833 0.9998557 0.9841829 -0.9835029 0.9998557 0.9841829 -0.9835276 0.9998557 0.9841829 -0.9835588 0.9998557 0.9841829 -0.9835983 0.9998557 0.9841829 -0.9836483 0.9998557 0.9841829 -0.9837116 0.9998557 0.9841829 -0.9837916 0.9998557 0.9841829 -0.9838928 0.9998557 0.9841829 -0.9840209 0.9998557 0.9841829 -0.9841829 0.9998557 0.9841829 -0.984388 0.9998557 0.9841829 -0.9846473 0.9998557 0.9841829 -0.9849754 0.9998557 0.9841829 -0.9853905 0.9998557 0.9841829 -0.9859157 0.9998557 0.9841829 -0.9865801 0.9998557 0.9841829 -0.9874207 0.9998557 0.9841829 -0.9884841 0.9998557 0.9841829 -0.9898295 0.9998557 0.9841829 -0.9915316 0.9998557 0.9841829 -0.9936849 0.9998557 0.9841829 -0.9964092 0.9998557 0.9841829 -0.9998557 0.9998557 0.9841829 -0.999886 0.9971537 0.987333 -0.9999099 0.9960342 0.9898842 -0.9999288 0.9957887 0.9919392 -0.9999437 0.9959964 0.9935878 -0.9868505 0.999886 0.9873349 -0.9868505 0.999886 0.9873349 -0.9868505 0.999886 0.9873348 -0.9868505 0.999886 0.9873348 -0.9868504 0.999886 0.9873347 -0.9868504 0.999886 0.9873347 -0.9868504 0.999886 0.9873346 -0.9868503 0.999886 0.9873345 -0.9868503 0.999886 0.9873344 -0.9868502 0.999886 0.9873343 -0.9868502 0.999886 0.9873341 -0.9868501 0.999886 0.9873339 -0.9868501 0.999886 0.9873337 -0.98685 0.999886 0.9873335 -0.9868501 0.999886 0.9873332 -0.9868503 0.999886 0.9873331 -0.9868507 0.999886 0.987333 -0.9868512 0.999886 0.987333 -0.986852 0.999886 0.987333 -0.9868529 0.999886 0.987333 -0.9868541 0.999886 0.987333 -0.9868555 0.999886 0.987333 -0.9868574 0.999886 0.987333 -0.9868597 0.999886 0.987333 -0.9868627 0.999886 0.987333 -0.9868665 0.999886 0.987333 -0.9868713 0.999886 0.987333 -0.9868773 0.999886 0.987333 -0.986885 0.999886 0.987333 -0.9868946 0.999886 0.987333 -0.9869069 0.999886 0.987333 -0.9869223 0.999886 0.987333 -0.9869419 0.999886 0.987333 -0.9869667 0.999886 0.987333 -0.986998 0.999886 0.987333 -0.9870376 0.999886 0.987333 -0.9870878 0.999886 0.987333 -0.9871512 0.999886 0.987333 -0.9872315 0.999886 0.987333 -0.987333 0.999886 0.987333 -0.9874615 0.999886 0.987333 -0.987624 0.999886 0.987333 -0.9878296 0.999886 0.987333 -0.9880897 0.999886 0.987333 -0.9884188 0.999886 0.987333 -0.9888351 0.999886 0.987333 -0.9893618 0.999886 0.987333 -0.9900282 0.999886 0.987333 -0.9908712 0.999886 0.987333 -0.9919377 0.999886 0.987333 -0.993287 0.999886 0.987333 -0.9949941 0.999886 0.987333 -0.9971537 0.999886 0.987333 -0.999886 0.999886 0.987333 -0.9999099 0.9977452 0.9898842 -0.9999288 0.9968597 0.9919392 -0.9999437 0.9966665 0.9935878 -0.989582 0.9999099 0.9898854 -0.989582 0.9999099 0.9898853 -0.989582 0.9999099 0.9898853 -0.989582 0.9999099 0.9898853 -0.989582 0.9999099 0.9898853 -0.9895819 0.9999099 0.9898852 -0.9895819 0.9999099 0.9898852 -0.9895819 0.9999099 0.9898851 -0.9895819 0.9999099 0.989885 -0.9895818 0.9999099 0.989885 -0.9895818 0.9999099 0.9898849 -0.9895818 0.9999099 0.9898847 -0.9895817 0.9999099 0.9898846 -0.9895817 0.9999099 0.9898845 -0.9895817 0.9999099 0.9898843 -0.9895819 0.9999099 0.9898842 -0.9895821 0.9999099 0.9898842 -0.9895825 0.9999099 0.9898842 -0.9895829 0.9999099 0.9898842 -0.9895835 0.9999099 0.9898842 -0.9895842 0.9999099 0.9898842 -0.9895851 0.9999099 0.9898842 -0.9895863 0.9999099 0.9898842 -0.9895878 0.9999099 0.9898842 -0.9895897 0.9999099 0.9898842 -0.989592 0.9999099 0.9898842 -0.989595 0.9999099 0.9898842 -0.9895988 0.9999099 0.9898842 -0.9896036 0.9999099 0.9898842 -0.9896096 0.9999099 0.9898842 -0.9896173 0.9999099 0.9898842 -0.989627 0.9999099 0.9898842 -0.9896392 0.9999099 0.9898842 -0.9896547 0.9999099 0.9898842 -0.9896744 0.9999099 0.9898842 -0.9896992 0.9999099 0.9898842 -0.9897306 0.9999099 0.9898842 -0.9897703 0.9999099 0.9898842 -0.9898206 0.9999099 0.9898842 -0.9898842 0.9999099 0.9898842 -0.9899646 0.9999099 0.9898842 -0.9900664 0.9999099 0.9898842 -0.9901951 0.9999099 0.9898842 -0.990358 0.9999099 0.9898842 -0.9905641 0.9999099 0.9898842 -0.9908248 0.9999099 0.9898842 -0.9911547 0.9999099 0.9898842 -0.991572 0.9999099 0.9898842 -0.9920999 0.9999099 0.9898842 -0.9927678 0.9999099 0.9898842 -0.9936128 0.9999099 0.9898842 -0.9946818 0.9999099 0.9898842 -0.9960342 0.9999099 0.9898842 -0.9977452 0.9999099 0.9898842 -0.9999099 0.9999099 0.9898842 -0.9999288 0.9982146 0.9919392 -0.9999437 0.9975143 0.9935878 -0.9917501 0.9999288 0.99194 -0.9917501 0.9999288 0.99194 -0.9917501 0.9999288 0.99194 -0.9917501 0.9999288 0.9919399 -0.9917501 0.9999288 0.9919399 -0.9917501 0.9999288 0.9919399 -0.99175 0.9999288 0.9919399 -0.99175 0.9999288 0.9919398 -0.99175 0.9999288 0.9919398 -0.99175 0.9999288 0.9919397 -0.99175 0.9999288 0.9919397 -0.9917499 0.9999288 0.9919396 -0.9917499 0.9999288 0.9919395 -0.9917499 0.9999288 0.9919394 -0.9917499 0.9999288 0.9919393 -0.99175 0.9999288 0.9919392 -0.9917502 0.9999288 0.9919392 -0.9917504 0.9999288 0.9919392 -0.9917507 0.9999288 0.9919392 -0.991751 0.9999288 0.9919392 -0.9917515 0.9999288 0.9919392 -0.9917521 0.9999288 0.9919392 -0.9917528 0.9999288 0.9919392 -0.9917537 0.9999288 0.9919392 -0.9917549 0.9999288 0.9919392 -0.9917564 0.9999288 0.9919392 -0.9917582 0.9999288 0.9919392 -0.9917606 0.9999288 0.9919392 -0.9917636 0.9999288 0.9919392 -0.9917674 0.9999288 0.9919392 -0.9917722 0.9999288 0.9919392 -0.9917782 0.9999288 0.9919392 -0.9917859 0.9999288 0.9919392 -0.9917956 0.9999288 0.9919392 -0.9918079 0.9999288 0.9919392 -0.9918234 0.9999288 0.9919392 -0.9918431 0.9999288 0.9919392 -0.991868 0.9999288 0.9919392 -0.9918994 0.9999288 0.9919392 -0.9919392 0.9999288 0.9919392 -0.9919896 0.9999288 0.9919392 -0.9920533 0.9999288 0.9919392 -0.9921339 0.9999288 0.9919392 -0.9922358 0.9999288 0.9919392 -0.9923648 0.9999288 0.9919392 -0.992528 0.9999288 0.9919392 -0.9927345 0.9999288 0.9919392 -0.9929957 0.9999288 0.9919392 -0.9933261 0.9999288 0.9919392 -0.9937442 0.9999288 0.9919392 -0.9942731 0.9999288 0.9919392 -0.9949422 0.9999288 0.9919392 -0.9957887 0.9999288 0.9919392 -0.9968597 0.9999288 0.9919392 -0.9982146 0.9999288 0.9919392 -0.9999288 0.9999288 0.9919392 -0.9999437 0.9985868 0.9935878 -0.9934695 0.9999437 0.9935883 -0.9934695 0.9999437 0.9935883 -0.9934695 0.9999437 0.9935883 -0.9934695 0.9999437 0.9935883 -0.9934695 0.9999437 0.9935883 -0.9934695 0.9999437 0.9935882 -0.9934695 0.9999437 0.9935882 -0.9934694 0.9999437 0.9935882 -0.9934694 0.9999437 0.9935882 -0.9934694 0.9999437 0.9935881 -0.9934694 0.9999437 0.9935881 -0.9934694 0.9999437 0.993588 -0.9934694 0.9999437 0.993588 -0.9934694 0.9999437 0.9935879 -0.9934694 0.9999437 0.9935879 -0.9934694 0.9999437 0.9935878 -0.9934695 0.9999437 0.9935878 -0.9934697 0.9999437 0.9935878 -0.9934698 0.9999437 0.9935878 -0.9934701 0.9999437 0.9935878 -0.9934704 0.9999437 0.9935878 -0.9934707 0.9999437 0.9935878 -0.9934712 0.9999437 0.9935878 -0.9934718 0.9999437 0.9935878 -0.9934725 0.9999437 0.9935878 -0.9934734 0.9999437 0.9935878 -0.9934746 0.9999437 0.9935878 -0.9934761 0.9999437 0.9935878 -0.9934779 0.9999437 0.9935878 -0.9934803 0.9999437 0.9935878 -0.9934833 0.9999437 0.9935878 -0.9934871 0.9999437 0.9935878 -0.9934919 0.9999437 0.9935878 -0.993498 0.9999437 0.9935878 -0.9935057 0.9999437 0.9935878 -0.9935154 0.9999437 0.9935878 -0.9935277 0.9999437 0.9935878 -0.9935432 0.9999437 0.9935878 -0.9935629 0.9999437 0.9935878 -0.9935878 0.9999437 0.9935878 -0.9936193 0.9999437 0.9935878 -0.9936592 0.9999437 0.9935878 -0.9937096 0.9999437 0.9935878 -0.9937734 0.9999437 0.9935878 -0.9938541 0.9999437 0.9935878 -0.9939562 0.9999437 0.9935878 -0.9940854 0.9999437 0.9935878 -0.9942488 0.9999437 0.9935878 -0.9944556 0.9999437 0.9935878 -0.9947172 0.9999437 0.9935878 -0.9950481 0.9999437 0.9935878 -0.9954668 0.9999437 0.9935878 -0.9959964 0.9999437 0.9935878 -0.9966665 0.9999437 0.9935878 -0.9975143 0.9999437 0.9935878 -0.9985868 0.9999437 0.9935878 -0.9999437 0.9999437 0.9935878 -0.7716588 0.7716588 0.997523 -0.7716637 0.7716588 0.997523 -0.77167 0.7716588 0.997523 -0.7716778 0.7716588 0.997523 -0.7716878 0.7716588 0.997523 -0.7717004 0.7716588 0.997523 -0.7717164 0.7716588 0.997523 -0.7717365 0.7716588 0.997523 -0.771762 0.7716588 0.997523 -0.7717943 0.7716588 0.997523 -0.7718352 0.7716588 0.997523 -0.7718869 0.7716588 0.997523 -0.7719522 0.7716588 0.997523 -0.7720349 0.7716588 0.997523 -0.7721396 0.7716588 0.997523 -0.772272 0.7716588 0.997523 -0.7724394 0.7716588 0.997523 -0.7726513 0.7716588 0.997523 -0.7729194 0.7716588 0.997523 -0.7732585 0.7716588 0.997523 -0.7736876 0.7716588 0.997523 -0.7742304 0.7716588 0.997523 -0.7749171 0.7716588 0.997523 -0.7757859 0.7716588 0.997523 -0.776885 0.7716588 0.997523 -0.7782755 0.7716588 0.997523 -0.7800347 0.7716588 0.997523 -0.7822603 0.7716588 0.997523 -0.785076 0.7716588 0.997523 -0.7886382 0.7716588 0.997523 -0.7931449 0.7716588 0.997523 -0.7988464 0.7716588 0.997523 -0.8060595 0.7716588 0.997523 -0.8151851 0.7716588 0.997523 -0.8267302 0.7716588 0.997523 -0.8413362 0.7716588 0.997523 -0.8598146 0.7716588 0.997523 -0.8831923 0.7716588 0.997523 -0.9127681 0.7716588 0.997523 -0.9501853 0.7716588 0.997523 -0.997523 0.7716588 0.997523 -0.9980513 0.8119154 0.9590407 -0.9984653 0.8462171 0.9413364 -0.9987905 0.8750477 0.9361554 -0.9990461 0.8990028 0.9380532 -0.9992474 0.9187175 0.9435635 -0.999406 0.9348153 0.9505671 -0.999531 0.9478754 0.9578327 -0.9996296 0.958416 0.9646955 -0.9997074 0.9668873 0.97084 -0.9997689 0.9736726 0.9761569 -0.9998174 0.9790927 0.9806522 -0.9998557 0.9834129 0.9843909 -0.999886 0.9868505 0.9874633 -0.9999099 0.989582 0.9899658 -0.9999288 0.9917501 0.9919903 -0.9999437 0.9934695 0.9936198 -0.7716588 0.7716637 0.997523 -0.7716551 0.7716551 0.997523 -0.7716613 0.7716551 0.997523 -0.7716692 0.7716551 0.997523 -0.7716791 0.7716551 0.997523 -0.7716917 0.7716551 0.997523 -0.7717077 0.7716551 0.997523 -0.7717278 0.7716551 0.997523 -0.7717534 0.7716551 0.997523 -0.7717857 0.7716551 0.997523 -0.7718265 0.7716551 0.997523 -0.7718782 0.7716551 0.997523 -0.7719436 0.7716551 0.997523 -0.7720263 0.7716551 0.997523 -0.7721309 0.7716551 0.997523 -0.7722633 0.7716551 0.997523 -0.7724308 0.7716551 0.997523 -0.7726427 0.7716551 0.997523 -0.7729107 0.7716551 0.997523 -0.7732499 0.7716551 0.997523 -0.773679 0.7716551 0.997523 -0.7742218 0.7716551 0.997523 -0.7749085 0.7716551 0.997523 -0.7757773 0.7716551 0.997523 -0.7768765 0.7716551 0.997523 -0.7782671 0.7716551 0.997523 -0.7800263 0.7716551 0.997523 -0.782252 0.7716551 0.997523 -0.7850678 0.7716551 0.997523 -0.7886302 0.7716551 0.997523 -0.793137 0.7716551 0.997523 -0.7988387 0.7716551 0.997523 -0.8060522 0.7716551 0.997523 -0.8151781 0.7716551 0.997523 -0.8267236 0.7716551 0.997523 -0.8413301 0.7716551 0.997523 -0.8598093 0.7716551 0.997523 -0.8831879 0.7716551 0.997523 -0.9127648 0.7716551 0.997523 -0.9501835 0.7716551 0.997523 -0.997523 0.7716551 0.997523 -0.9980512 0.8119128 0.9590395 -0.9984653 0.8462154 0.9413349 -0.9987905 0.8750466 0.9361542 -0.9990461 0.899002 0.9380522 -0.9992474 0.918717 0.9435628 -0.999406 0.9348149 0.9505666 -0.999531 0.9478752 0.9578324 -0.9996296 0.9584159 0.9646953 -0.9997074 0.9668872 0.9708399 -0.9997689 0.9736726 0.9761568 -0.9998174 0.9790927 0.9806521 -0.9998557 0.9834129 0.9843909 -0.999886 0.9868505 0.9874633 -0.9999099 0.989582 0.9899658 -0.9999288 0.9917501 0.9919903 -0.9999437 0.9934695 0.9936198 -0.7716588 0.77167 0.997523 -0.7716551 0.7716613 0.997523 -0.7716504 0.7716504 0.9975229 -0.7716583 0.7716504 0.9975229 -0.7716682 0.7716504 0.9975229 -0.7716808 0.7716504 0.9975229 -0.7716968 0.7716504 0.9975229 -0.7717169 0.7716504 0.9975229 -0.7717425 0.7716504 0.9975229 -0.7717748 0.7716504 0.9975229 -0.7718156 0.7716504 0.9975229 -0.7718673 0.7716504 0.9975229 -0.7719327 0.7716504 0.9975229 -0.7720154 0.7716504 0.9975229 -0.77212 0.7716504 0.9975229 -0.7722524 0.7716504 0.9975229 -0.7724199 0.7716504 0.9975229 -0.7726318 0.7716504 0.9975229 -0.7728999 0.7716504 0.9975229 -0.7732391 0.7716504 0.9975229 -0.7736681 0.7716504 0.9975229 -0.774211 0.7716504 0.9975229 -0.7748978 0.7716504 0.9975229 -0.7757666 0.7716504 0.9975229 -0.7768658 0.7716504 0.9975229 -0.7782565 0.7716504 0.9975229 -0.7800158 0.7716504 0.9975229 -0.7822416 0.7716504 0.9975229 -0.7850576 0.7716504 0.9975229 -0.7886201 0.7716504 0.9975229 -0.7931271 0.7716504 0.9975229 -0.7988291 0.7716504 0.9975229 -0.8060429 0.7716504 0.9975229 -0.8151693 0.7716504 0.9975229 -0.8267153 0.7716504 0.9975229 -0.8413226 0.7716504 0.9975229 -0.8598026 0.7716504 0.9975229 -0.8831823 0.7716504 0.9975229 -0.9127607 0.7716504 0.9975229 -0.9501811 0.7716504 0.9975229 -0.9975229 0.7716504 0.9975229 -0.9980512 0.8119096 0.9590379 -0.9984653 0.8462132 0.9413331 -0.9987904 0.8750451 0.9361526 -0.9990461 0.8990011 0.938051 -0.9992474 0.9187164 0.9435619 -0.999406 0.9348146 0.950566 -0.999531 0.947875 0.957832 -0.9996296 0.9584157 0.964695 -0.9997074 0.9668871 0.9708397 -0.9997689 0.9736725 0.9761567 -0.9998174 0.9790927 0.980652 -0.9998557 0.9834129 0.9843908 -0.999886 0.9868505 0.9874633 -0.9999099 0.989582 0.9899658 -0.9999288 0.9917501 0.9919903 -0.9999437 0.9934695 0.9936198 -0.7716588 0.7716778 0.997523 -0.7716551 0.7716692 0.997523 -0.7716504 0.7716583 0.9975229 -0.7716446 0.7716446 0.9975228 -0.7716545 0.7716446 0.9975228 -0.7716672 0.7716446 0.9975228 -0.7716831 0.7716446 0.9975228 -0.7717033 0.7716446 0.9975228 -0.7717288 0.7716446 0.9975228 -0.7717611 0.7716446 0.9975228 -0.7718019 0.7716446 0.9975228 -0.7718536 0.7716446 0.9975228 -0.771919 0.7716446 0.9975228 -0.7720017 0.7716446 0.9975228 -0.7721064 0.7716446 0.9975228 -0.7722388 0.7716446 0.9975228 -0.7724063 0.7716446 0.9975228 -0.7726182 0.7716446 0.9975228 -0.7728863 0.7716446 0.9975228 -0.7732255 0.7716446 0.9975228 -0.7736546 0.7716446 0.9975228 -0.7741975 0.7716446 0.9975228 -0.7748843 0.7716446 0.9975228 -0.7757532 0.7716446 0.9975228 -0.7768525 0.7716446 0.9975228 -0.7782432 0.7716446 0.9975228 -0.7800027 0.7716446 0.9975228 -0.7822286 0.7716446 0.9975228 -0.7850447 0.7716446 0.9975228 -0.7886074 0.7716446 0.9975228 -0.7931147 0.7716446 0.9975228 -0.7988171 0.7716446 0.9975228 -0.8060313 0.7716446 0.9975228 -0.8151582 0.7716446 0.9975228 -0.826705 0.7716446 0.9975228 -0.8413131 0.7716446 0.9975228 -0.8597943 0.7716446 0.9975228 -0.8831754 0.7716446 0.9975228 -0.9127555 0.7716446 0.9975228 -0.9501782 0.7716446 0.9975228 -0.9975228 0.7716446 0.9975228 -0.9980511 0.8119057 0.959036 -0.9984653 0.8462106 0.9413309 -0.9987904 0.8750434 0.9361506 -0.9990461 0.899 0.9380495 -0.9992474 0.9187157 0.9435608 -0.999406 0.9348141 0.9505652 -0.999531 0.9478746 0.9578314 -0.9996296 0.9584155 0.9646947 -0.9997074 0.966887 0.9708394 -0.9997689 0.9736724 0.9761565 -0.9998174 0.9790926 0.9806519 -0.9998557 0.9834129 0.9843907 -0.999886 0.9868505 0.9874632 -0.9999099 0.989582 0.9899657 -0.9999288 0.9917501 0.9919903 -0.9999437 0.9934695 0.9936198 -0.7716588 0.7716878 0.997523 -0.7716551 0.7716791 0.997523 -0.7716504 0.7716682 0.9975229 -0.7716446 0.7716545 0.9975228 -0.7716375 0.7716375 0.9975227 -0.7716501 0.7716375 0.9975227 -0.771666 0.7716375 0.9975227 -0.7716862 0.7716375 0.9975227 -0.7717117 0.7716375 0.9975227 -0.771744 0.7716375 0.9975227 -0.7717849 0.7716375 0.9975227 -0.7718366 0.7716375 0.9975227 -0.7719019 0.7716375 0.9975227 -0.7719847 0.7716375 0.9975227 -0.7720893 0.7716375 0.9975227 -0.7722218 0.7716375 0.9975227 -0.7723893 0.7716375 0.9975227 -0.7726012 0.7716375 0.9975227 -0.7728693 0.7716375 0.9975227 -0.7732085 0.7716375 0.9975227 -0.7736377 0.7716375 0.9975227 -0.7741806 0.7716375 0.9975227 -0.7748674 0.7716375 0.9975227 -0.7757364 0.7716375 0.9975227 -0.7768358 0.7716375 0.9975227 -0.7782266 0.7716375 0.9975227 -0.7799862 0.7716375 0.9975227 -0.7822123 0.7716375 0.9975227 -0.7850286 0.7716375 0.9975227 -0.7885916 0.7716375 0.9975227 -0.7930993 0.7716375 0.9975227 -0.7988021 0.7716375 0.9975227 -0.8060168 0.7716375 0.9975227 -0.8151444 0.7716375 0.9975227 -0.826692 0.7716375 0.9975227 -0.8413012 0.7716375 0.9975227 -0.8597838 0.7716375 0.9975227 -0.8831667 0.7716375 0.9975227 -0.912749 0.7716375 0.9975227 -0.9501745 0.7716375 0.9975227 -0.9975227 0.7716375 0.9975227 -0.9980511 0.8119009 0.9590336 -0.9984652 0.8462073 0.9413281 -0.9987904 0.8750412 0.9361482 -0.9990461 0.8989986 0.9380476 -0.9992474 0.9187148 0.9435594 -0.999406 0.9348135 0.9505643 -0.999531 0.9478743 0.9578308 -0.9996296 0.9584153 0.9646943 -0.9997074 0.9668869 0.9708392 -0.9997689 0.9736723 0.9761563 -0.9998174 0.9790925 0.9806518 -0.9998557 0.9834128 0.9843907 -0.999886 0.9868504 0.9874632 -0.9999099 0.989582 0.9899657 -0.9999288 0.9917501 0.9919903 -0.9999437 0.9934695 0.9936198 -0.7716588 0.7717004 0.997523 -0.7716551 0.7716917 0.997523 -0.7716504 0.7716808 0.9975229 -0.7716446 0.7716672 0.9975228 -0.7716375 0.7716501 0.9975227 -0.7716288 0.7716288 0.9975226 -0.7716448 0.7716288 0.9975226 -0.7716649 0.7716288 0.9975226 -0.7716905 0.7716288 0.9975226 -0.7717228 0.7716288 0.9975226 -0.7717636 0.7716288 0.9975226 -0.7718153 0.7716288 0.9975226 -0.7718807 0.7716288 0.9975226 -0.7719634 0.7716288 0.9975226 -0.7720681 0.7716288 0.9975226 -0.7722005 0.7716288 0.9975226 -0.7723681 0.7716288 0.9975226 -0.77258 0.7716288 0.9975226 -0.7728482 0.7716288 0.9975226 -0.7731874 0.7716288 0.9975226 -0.7736166 0.7716288 0.9975226 -0.7741595 0.7716288 0.9975226 -0.7748465 0.7716288 0.9975226 -0.7757155 0.7716288 0.9975226 -0.776815 0.7716288 0.9975226 -0.778206 0.7716288 0.9975226 -0.7799657 0.7716288 0.9975226 -0.782192 0.7716288 0.9975226 -0.7850086 0.7716288 0.9975226 -0.7885719 0.7716288 0.9975226 -0.79308 0.7716288 0.9975226 -0.7987833 0.7716288 0.9975226 -0.8059988 0.7716288 0.9975226 -0.8151272 0.7716288 0.9975226 -0.8266759 0.7716288 0.9975226 -0.8412865 0.7716288 0.9975226 -0.8597708 0.7716288 0.9975226 -0.8831558 0.7716288 0.9975226 -0.912741 0.7716288 0.9975226 -0.95017 0.7716288 0.9975226 -0.9975226 0.7716288 0.9975226 -0.998051 0.8118949 0.9590305 -0.9984652 0.8462034 0.9413245 -0.9987904 0.8750386 0.9361451 -0.9990461 0.8989969 0.9380452 -0.9992474 0.9187137 0.9435577 -0.9994059 0.9348128 0.9505631 -0.999531 0.9478738 0.95783 -0.9996296 0.958415 0.9646937 -0.9997074 0.9668867 0.9708388 -0.9997689 0.9736722 0.9761561 -0.9998174 0.9790925 0.9806517 -0.9998557 0.9834128 0.9843906 -0.999886 0.9868504 0.9874631 -0.9999099 0.9895819 0.9899657 -0.9999288 0.9917501 0.9919902 -0.9999437 0.9934695 0.9936197 -0.7716588 0.7717164 0.997523 -0.7716551 0.7717077 0.997523 -0.7716504 0.7716968 0.9975229 -0.7716446 0.7716831 0.9975228 -0.7716375 0.771666 0.9975227 -0.7716288 0.7716448 0.9975226 -0.7716184 0.7716184 0.9975224 -0.7716386 0.7716184 0.9975224 -0.7716641 0.7716184 0.9975224 -0.7716964 0.7716184 0.9975224 -0.7717373 0.7716184 0.9975224 -0.771789 0.7716184 0.9975224 -0.7718544 0.7716184 0.9975224 -0.7719371 0.7716184 0.9975224 -0.7720418 0.7716184 0.9975224 -0.7721742 0.7716184 0.9975224 -0.7723418 0.7716184 0.9975224 -0.7725538 0.7716184 0.9975224 -0.7728219 0.7716184 0.9975224 -0.7731612 0.7716184 0.9975224 -0.7735904 0.7716184 0.9975224 -0.7741335 0.7716184 0.9975224 -0.7748205 0.7716184 0.9975224 -0.7756896 0.7716184 0.9975224 -0.7767892 0.7716184 0.9975224 -0.7781803 0.7716184 0.9975224 -0.7799403 0.7716184 0.9975224 -0.7821669 0.7716184 0.9975224 -0.7849838 0.7716184 0.9975224 -0.7885475 0.7716184 0.9975224 -0.7930561 0.7716184 0.9975224 -0.7987601 0.7716184 0.9975224 -0.8059764 0.7716184 0.9975224 -0.8151059 0.7716184 0.9975224 -0.8266559 0.7716184 0.9975224 -0.8412682 0.7716184 0.9975224 -0.8597546 0.7716184 0.9975224 -0.8831424 0.7716184 0.9975224 -0.912731 0.7716184 0.9975224 -0.9501643 0.7716184 0.9975224 -0.9975224 0.7716184 0.9975224 -0.9980509 0.8118878 0.9590268 -0.9984651 0.8461986 0.9413202 -0.9987903 0.8750355 0.9361413 -0.9990461 0.8989948 0.9380422 -0.9992473 0.9187123 0.9435555 -0.9994059 0.9348119 0.9505616 -0.999531 0.9478733 0.9578289 -0.9996296 0.9584146 0.964693 -0.9997074 0.9668865 0.9708384 -0.9997689 0.9736721 0.9761558 -0.9998174 0.9790924 0.9806515 -0.9998557 0.9834127 0.9843905 -0.999886 0.9868504 0.9874631 -0.9999099 0.9895819 0.9899656 -0.9999288 0.99175 0.9919902 -0.9999437 0.9934695 0.9936197 -0.7716588 0.7717365 0.997523 -0.7716551 0.7717278 0.997523 -0.7716504 0.7717169 0.9975229 -0.7716446 0.7717033 0.9975228 -0.7716375 0.7716862 0.9975227 -0.7716288 0.7716649 0.9975226 -0.7716184 0.7716386 0.9975224 -0.7716061 0.7716061 0.9975222 -0.7716316 0.7716061 0.9975222 -0.7716639 0.7716061 0.9975222 -0.7717048 0.7716061 0.9975222 -0.7717565 0.7716061 0.9975222 -0.7718219 0.7716061 0.9975222 -0.7719047 0.7716061 0.9975222 -0.7720094 0.7716061 0.9975222 -0.7721418 0.7716061 0.9975222 -0.7723094 0.7716061 0.9975222 -0.7725214 0.7716061 0.9975222 -0.7727896 0.7716061 0.9975222 -0.7731289 0.7716061 0.9975222 -0.7735582 0.7716061 0.9975222 -0.7741013 0.7716061 0.9975222 -0.7747884 0.7716061 0.9975222 -0.7756577 0.7716061 0.9975222 -0.7767575 0.7716061 0.9975222 -0.7781488 0.7716061 0.9975222 -0.779909 0.7716061 0.9975222 -0.7821359 0.7716061 0.9975222 -0.7849532 0.7716061 0.9975222 -0.7885175 0.7716061 0.9975222 -0.7930267 0.7716061 0.9975222 -0.7987315 0.7716061 0.9975222 -0.8059488 0.7716061 0.9975222 -0.8150796 0.7716061 0.9975222 -0.8266313 0.7716061 0.9975222 -0.8412457 0.7716061 0.9975222 -0.8597348 0.7716061 0.9975222 -0.8831259 0.7716061 0.9975222 -0.9127186 0.7716061 0.9975222 -0.9501574 0.7716061 0.9975222 -0.9975222 0.7716061 0.9975222 -0.9980508 0.8118794 0.9590222 -0.998465 0.8461929 0.9413148 -0.9987903 0.8750317 0.9361366 -0.999046 0.8989923 0.9380386 -0.9992473 0.9187107 0.9435529 -0.9994059 0.9348109 0.9505597 -0.999531 0.9478726 0.9578277 -0.9996296 0.9584142 0.9646922 -0.9997074 0.9668862 0.9708378 -0.9997689 0.9736719 0.9761554 -0.9998174 0.9790923 0.9806512 -0.9998557 0.9834127 0.9843903 -0.999886 0.9868503 0.987463 -0.9999099 0.9895819 0.9899656 -0.9999288 0.99175 0.9919902 -0.9999437 0.9934694 0.9936197 -0.7716588 0.771762 0.997523 -0.7716551 0.7717534 0.997523 -0.7716504 0.7717425 0.9975229 -0.7716446 0.7717288 0.9975228 -0.7716375 0.7717117 0.9975227 -0.7716288 0.7716905 0.9975226 -0.7716184 0.7716641 0.9975224 -0.7716061 0.7716316 0.9975222 -0.7715919 0.7715919 0.997522 -0.7716242 0.7715919 0.997522 -0.7716651 0.7715919 0.997522 -0.7717168 0.7715919 0.997522 -0.7717822 0.7715919 0.997522 -0.771865 0.7715919 0.997522 -0.7719697 0.7715919 0.997522 -0.7721022 0.7715919 0.997522 -0.7722698 0.7715919 0.997522 -0.7724818 0.7715919 0.997522 -0.7727501 0.7715919 0.997522 -0.7730895 0.7715919 0.997522 -0.7735188 0.7715919 0.997522 -0.774062 0.7715919 0.997522 -0.7747493 0.7715919 0.997522 -0.7756187 0.7715919 0.997522 -0.7767186 0.7715919 0.997522 -0.7781102 0.7715919 0.997522 -0.7798707 0.7715919 0.997522 -0.782098 0.7715919 0.997522 -0.7849158 0.7715919 0.997522 -0.7884807 0.7715919 0.997522 -0.7929907 0.7715919 0.997522 -0.7986965 0.7715919 0.997522 -0.8059151 0.7715919 0.997522 -0.8150475 0.7715919 0.997522 -0.8266012 0.7715919 0.997522 -0.8412181 0.7715919 0.997522 -0.8597104 0.7715919 0.997522 -0.8831056 0.7715919 0.997522 -0.9127036 0.7715919 0.997522 -0.9501488 0.7715919 0.997522 -0.997522 0.7715919 0.997522 -0.9980506 0.8118697 0.9590165 -0.9984649 0.8461864 0.9413083 -0.9987902 0.8750274 0.9361309 -0.999046 0.8989895 0.9380342 -0.9992473 0.9187089 0.9435497 -0.9994059 0.9348097 0.9505575 -0.999531 0.9478718 0.9578262 -0.9996296 0.9584137 0.9646912 -0.9997074 0.9668859 0.9708371 -0.9997689 0.9736717 0.976155 -0.9998174 0.9790921 0.980651 -0.9998557 0.9834126 0.9843901 -0.999886 0.9868503 0.9874628 -0.9999099 0.9895819 0.9899655 -0.9999288 0.99175 0.9919901 -0.9999437 0.9934694 0.9936197 -0.7716588 0.7717943 0.997523 -0.7716551 0.7717857 0.997523 -0.7716504 0.7717748 0.9975229 -0.7716446 0.7717611 0.9975228 -0.7716375 0.771744 0.9975227 -0.7716288 0.7717228 0.9975226 -0.7716184 0.7716964 0.9975224 -0.7716061 0.7716639 0.9975222 -0.7715919 0.7716242 0.997522 -0.7715762 0.7715762 0.9975217 -0.7716171 0.7715762 0.9975217 -0.7716688 0.7715762 0.9975217 -0.7717342 0.7715762 0.9975217 -0.771817 0.7715762 0.9975217 -0.7719217 0.7715762 0.9975217 -0.7720543 0.7715762 0.9975217 -0.7722219 0.7715762 0.9975217 -0.772434 0.7715762 0.9975217 -0.7727023 0.7715762 0.9975217 -0.7730418 0.7715762 0.9975217 -0.7734712 0.7715762 0.9975217 -0.7740145 0.7715762 0.9975217 -0.7747019 0.7715762 0.9975217 -0.7755715 0.7715762 0.9975217 -0.7766717 0.7715762 0.9975217 -0.7780636 0.7715762 0.9975217 -0.7798244 0.7715762 0.9975217 -0.7820522 0.7715762 0.9975217 -0.7848706 0.7715762 0.9975217 -0.7884362 0.7715762 0.9975217 -0.7929472 0.7715762 0.9975217 -0.7986542 0.7715762 0.9975217 -0.8058743 0.7715762 0.9975217 -0.8150086 0.7715762 0.9975217 -0.8265648 0.7715762 0.9975217 -0.8411848 0.7715762 0.9975217 -0.859681 0.7715762 0.9975217 -0.8830811 0.7715762 0.9975217 -0.9126854 0.7715762 0.9975217 -0.9501385 0.7715762 0.9975217 -0.9975217 0.7715762 0.9975217 -0.9980504 0.8118589 0.9590097 -0.9984648 0.8461791 0.9413004 -0.9987902 0.8750225 0.936124 -0.9990459 0.8989863 0.9380288 -0.9992473 0.9187068 0.9435457 -0.9994059 0.9348083 0.9505547 -0.9995309 0.947871 0.9578243 -0.9996296 0.9584132 0.96469 -0.9997074 0.9668855 0.9708363 -0.9997689 0.9736715 0.9761545 -0.9998174 0.979092 0.9806506 -0.9998557 0.9834125 0.9843899 -0.999886 0.9868502 0.9874627 -0.9999099 0.9895818 0.9899654 -0.9999288 0.99175 0.9919901 -0.9999437 0.9934694 0.9936196 -0.7716588 0.7718352 0.997523 -0.7716551 0.7718265 0.997523 -0.7716504 0.7718156 0.9975229 -0.7716446 0.7718019 0.9975228 -0.7716375 0.7717849 0.9975227 -0.7716288 0.7717636 0.9975226 -0.7716184 0.7717373 0.9975224 -0.7716061 0.7717048 0.9975222 -0.7715919 0.7716651 0.997522 -0.7715762 0.7716171 0.9975217 -0.7715599 0.7715599 0.9975213 -0.7716116 0.7715599 0.9975213 -0.7716771 0.7715599 0.9975213 -0.7717599 0.7715599 0.9975213 -0.7718646 0.7715599 0.9975213 -0.7719972 0.7715599 0.9975213 -0.7721649 0.7715599 0.9975213 -0.772377 0.7715599 0.9975213 -0.7726454 0.7715599 0.9975213 -0.7729849 0.7715599 0.9975213 -0.7734145 0.7715599 0.9975213 -0.7739579 0.7715599 0.9975213 -0.7746455 0.7715599 0.9975213 -0.7755153 0.7715599 0.9975213 -0.7766158 0.7715599 0.9975213 -0.778008 0.7715599 0.9975213 -0.7797693 0.7715599 0.9975213 -0.7819976 0.7715599 0.9975213 -0.7848167 0.7715599 0.9975213 -0.7883833 0.7715599 0.9975213 -0.7928954 0.7715599 0.9975213 -0.7986038 0.7715599 0.9975213 -0.8058257 0.7715599 0.9975213 -0.8149624 0.7715599 0.9975213 -0.8265214 0.7715599 0.9975213 -0.8411451 0.7715599 0.9975213 -0.859646 0.7715599 0.9975213 -0.883052 0.7715599 0.9975213 -0.9126636 0.7715599 0.9975213 -0.9501262 0.7715599 0.9975213 -0.9975213 0.7715599 0.9975213 -0.9980502 0.8118476 0.9590016 -0.9984647 0.8461714 0.9412909 -0.9987901 0.8750173 0.9361157 -0.9990459 0.8989829 0.9380224 -0.9992472 0.9187045 0.9435411 -0.9994059 0.9348069 0.9505515 -0.9995309 0.94787 0.9578221 -0.9996296 0.9584126 0.9646885 -0.9997074 0.9668852 0.9708354 -0.9997689 0.9736712 0.9761539 -0.9998174 0.9790919 0.9806502 -0.9998557 0.9834124 0.9843897 -0.999886 0.9868502 0.9874625 -0.9999099 0.9895818 0.9899653 -0.9999288 0.99175 0.99199 -0.9999437 0.9934694 0.9936196 -0.7716588 0.7718869 0.997523 -0.7716551 0.7718782 0.997523 -0.7716504 0.7718673 0.9975229 -0.7716446 0.7718536 0.9975228 -0.7716375 0.7718366 0.9975227 -0.7716288 0.7718153 0.9975226 -0.7716184 0.771789 0.9975224 -0.7716061 0.7717565 0.9975222 -0.7715919 0.7717168 0.997522 -0.7715762 0.7716688 0.9975217 -0.7715599 0.7716116 0.9975213 -0.7715449 0.7715449 0.9975209 -0.7716104 0.7715449 0.9975209 -0.7716932 0.7715449 0.9975209 -0.771798 0.7715449 0.9975209 -0.7719306 0.7715449 0.9975209 -0.7720984 0.7715449 0.9975209 -0.7723106 0.7715449 0.9975209 -0.772579 0.7715449 0.9975209 -0.7729187 0.7715449 0.9975209 -0.7733484 0.7715449 0.9975209 -0.773892 0.7715449 0.9975209 -0.7745797 0.7715449 0.9975209 -0.7754498 0.7715449 0.9975209 -0.7765506 0.7715449 0.9975209 -0.7779432 0.7715449 0.9975209 -0.779705 0.7715449 0.9975209 -0.781934 0.7715449 0.9975209 -0.7847539 0.7715449 0.9975209 -0.7883215 0.7715449 0.9975209 -0.792835 0.7715449 0.9975209 -0.7985451 0.7715449 0.9975209 -0.8057691 0.7715449 0.9975209 -0.8149084 0.7715449 0.9975209 -0.8264708 0.7715449 0.9975209 -0.8410988 0.7715449 0.9975209 -0.8596051 0.7715449 0.9975209 -0.883018 0.7715449 0.9975209 -0.9126384 0.7715449 0.9975209 -0.9501119 0.7715449 0.9975209 -0.9975209 0.7715449 0.9975209 -0.99805 0.811837 0.9589921 -0.9984645 0.8461641 0.9412799 -0.99879 0.8750124 0.9361061 -0.9990458 0.8989796 0.9380149 -0.9992472 0.9187024 0.9435357 -0.9994059 0.9348055 0.9505477 -0.9995309 0.9478691 0.9578195 -0.9996296 0.958412 0.9646868 -0.9997074 0.9668848 0.9708343 -0.9997689 0.973671 0.9761531 -0.9998174 0.9790917 0.9806498 -0.9998557 0.9834123 0.9843894 -0.999886 0.9868501 0.9874624 -0.9999099 0.9895818 0.9899652 -0.9999288 0.9917499 0.9919899 -0.9999437 0.9934694 0.9936196 -0.7716588 0.7719522 0.997523 -0.7716551 0.7719436 0.997523 -0.7716504 0.7719327 0.9975229 -0.7716446 0.771919 0.9975228 -0.7716375 0.7719019 0.9975227 -0.7716288 0.7718807 0.9975226 -0.7716184 0.7718544 0.9975224 -0.7716061 0.7718219 0.9975222 -0.7715919 0.7717822 0.997522 -0.7715762 0.7717342 0.9975217 -0.7715599 0.7716771 0.9975213 -0.7715449 0.7716104 0.9975209 -0.7715352 0.7715352 0.9975204 -0.7716181 0.7715352 0.9975204 -0.7717229 0.7715352 0.9975204 -0.7718555 0.7715352 0.9975204 -0.7720233 0.7715352 0.9975204 -0.7722356 0.7715352 0.9975204 -0.7725042 0.7715352 0.9975204 -0.7728439 0.7715352 0.9975204 -0.7732737 0.7715352 0.9975204 -0.7738175 0.7715352 0.9975204 -0.7745055 0.7715352 0.9975204 -0.7753759 0.7715352 0.9975204 -0.776477 0.7715352 0.9975204 -0.7778701 0.7715352 0.9975204 -0.7796325 0.7715352 0.9975204 -0.7818622 0.7715352 0.9975204 -0.7846831 0.7715352 0.9975204 -0.7882518 0.7715352 0.9975204 -0.7927668 0.7715352 0.9975204 -0.7984788 0.7715352 0.9975204 -0.8057052 0.7715352 0.9975204 -0.8148475 0.7715352 0.9975204 -0.8264138 0.7715352 0.9975204 -0.8410466 0.7715352 0.9975204 -0.859559 0.7715352 0.9975204 -0.8829797 0.7715352 0.9975204 -0.9126098 0.7715352 0.9975204 -0.9500958 0.7715352 0.9975204 -0.9975204 0.7715352 0.9975204 -0.9980497 0.8118298 0.9589814 -0.9984643 0.8461589 0.9412675 -0.9987899 0.8750088 0.9360952 -0.9990458 0.8989771 0.9380065 -0.9992472 0.9187008 0.9435295 -0.9994058 0.9348044 0.9505434 -0.9995309 0.9478684 0.9578166 -0.9996296 0.9584115 0.9646849 -0.9997074 0.9668845 0.970833 -0.9997689 0.9736708 0.9761523 -0.9998174 0.9790916 0.9806492 -0.9998557 0.9834122 0.984389 -0.999886 0.9868501 0.9874621 -0.9999099 0.9895817 0.989965 -0.9999288 0.9917499 0.9919898 -0.9999437 0.9934694 0.9936195 -0.7716588 0.7720349 0.997523 -0.7716551 0.7720263 0.997523 -0.7716504 0.7720154 0.9975229 -0.7716446 0.7720017 0.9975228 -0.7716375 0.7719847 0.9975227 -0.7716288 0.7719634 0.9975226 -0.7716184 0.7719371 0.9975224 -0.7716061 0.7719047 0.9975222 -0.7715919 0.771865 0.997522 -0.7715762 0.771817 0.9975217 -0.7715599 0.7717599 0.9975213 -0.7715449 0.7716932 0.9975209 -0.7715352 0.7716181 0.9975204 -0.7715376 0.7715376 0.9975199 -0.7716425 0.7715376 0.9975199 -0.7717751 0.7715376 0.9975199 -0.771943 0.7715376 0.9975199 -0.7721553 0.7715376 0.9975199 -0.772424 0.7715376 0.9975199 -0.7727638 0.7715376 0.9975199 -0.7731938 0.7715376 0.9975199 -0.7737378 0.7715376 0.9975199 -0.774426 0.7715376 0.9975199 -0.7752967 0.7715376 0.9975199 -0.7763982 0.7715376 0.9975199 -0.7777918 0.7715376 0.9975199 -0.7795549 0.7715376 0.9975199 -0.7817854 0.7715376 0.9975199 -0.7846072 0.7715376 0.9975199 -0.7881772 0.7715376 0.9975199 -0.7926938 0.7715376 0.9975199 -0.7984078 0.7715376 0.9975199 -0.8056368 0.7715376 0.9975199 -0.8147824 0.7715376 0.9975199 -0.8263527 0.7715376 0.9975199 -0.8409907 0.7715376 0.9975199 -0.8595097 0.7715376 0.9975199 -0.8829386 0.7715376 0.9975199 -0.9125792 0.7715376 0.9975199 -0.9500785 0.7715376 0.9975199 -0.9975199 0.7715376 0.9975199 -0.9980494 0.8118303 0.9589699 -0.9984642 0.8461587 0.9412542 -0.9987897 0.8750084 0.9360836 -0.9990457 0.8989767 0.9379975 -0.9992471 0.9187004 0.943523 -0.9994058 0.9348042 0.9505389 -0.9995309 0.9478683 0.9578135 -0.9996295 0.9584114 0.9646828 -0.9997074 0.9668844 0.9708317 -0.9997689 0.9736708 0.9761514 -0.9998174 0.9790916 0.9806487 -0.9998557 0.9834122 0.9843887 -0.999886 0.98685 0.9874619 -0.9999099 0.9895817 0.9899649 -0.9999288 0.9917499 0.9919898 -0.9999437 0.9934694 0.9936194 -0.7716588 0.7721396 0.997523 -0.7716551 0.7721309 0.997523 -0.7716504 0.77212 0.9975229 -0.7716446 0.7721064 0.9975228 -0.7716375 0.7720893 0.9975227 -0.7716288 0.7720681 0.9975226 -0.7716184 0.7720418 0.9975224 -0.7716061 0.7720094 0.9975222 -0.7715919 0.7719697 0.997522 -0.7715762 0.7719217 0.9975217 -0.7715599 0.7718646 0.9975213 -0.7715449 0.771798 0.9975209 -0.7715352 0.7717229 0.9975204 -0.7715376 0.7716425 0.9975199 -0.7715641 0.7715641 0.9975194 -0.7716968 0.7715641 0.9975194 -0.7718647 0.7715641 0.9975194 -0.7720771 0.7715641 0.9975194 -0.7723459 0.7715641 0.9975194 -0.7726859 0.7715641 0.9975194 -0.773116 0.7715641 0.9975194 -0.7736602 0.7715641 0.9975194 -0.7743486 0.7715641 0.9975194 -0.7752196 0.7715641 0.9975194 -0.7763215 0.7715641 0.9975194 -0.7777156 0.7715641 0.9975194 -0.7794792 0.7715641 0.9975194 -0.7817105 0.7715641 0.9975194 -0.7845333 0.7715641 0.9975194 -0.7881046 0.7715641 0.9975194 -0.7926227 0.7715641 0.9975194 -0.7983387 0.7715641 0.9975194 -0.8055701 0.7715641 0.9975194 -0.8147189 0.7715641 0.9975194 -0.8262932 0.7715641 0.9975194 -0.8409363 0.7715641 0.9975194 -0.8594616 0.7715641 0.9975194 -0.8828986 0.7715641 0.9975194 -0.9125495 0.7715641 0.9975194 -0.9500617 0.7715641 0.9975194 -0.9975194 0.7715641 0.9975194 -0.9980491 0.8118466 0.9589588 -0.998464 0.8461687 0.9412413 -0.9987896 0.8750145 0.9360723 -0.9990456 0.8989805 0.9379887 -0.9992471 0.9187027 0.9435166 -0.9994058 0.9348056 0.9505344 -0.9995309 0.9478691 0.9578105 -0.9996295 0.958412 0.9646808 -0.9997074 0.9668847 0.9708303 -0.9997688 0.973671 0.9761506 -0.9998174 0.9790917 0.9806481 -0.9998557 0.9834123 0.9843883 -0.999886 0.9868501 0.9874617 -0.9999099 0.9895817 0.9899648 -0.9999288 0.9917499 0.9919897 -0.9999437 0.9934694 0.9936194 -0.7716588 0.772272 0.997523 -0.7716551 0.7722633 0.997523 -0.7716504 0.7722524 0.9975229 -0.7716446 0.7722388 0.9975228 -0.7716375 0.7722218 0.9975227 -0.7716288 0.7722005 0.9975226 -0.7716184 0.7721742 0.9975224 -0.7716061 0.7721418 0.9975222 -0.7715919 0.7721022 0.997522 -0.7715762 0.7720543 0.9975217 -0.7715599 0.7719972 0.9975213 -0.7715449 0.7719306 0.9975209 -0.7715352 0.7718555 0.9975204 -0.7715376 0.7717751 0.9975199 -0.7715641 0.7716968 0.9975194 -0.7716352 0.7716352 0.9975191 -0.7718031 0.7716352 0.9975191 -0.7720156 0.7716352 0.9975191 -0.7722844 0.7716352 0.9975191 -0.7726245 0.7716352 0.9975191 -0.7730548 0.7716352 0.9975191 -0.7735991 0.7716352 0.9975191 -0.7742877 0.7716352 0.9975191 -0.7751589 0.7716352 0.9975191 -0.7762611 0.7716352 0.9975191 -0.7776556 0.7716352 0.9975191 -0.7794197 0.7716352 0.9975191 -0.7816516 0.7716352 0.9975191 -0.7844752 0.7716352 0.9975191 -0.7880474 0.7716352 0.9975191 -0.7925667 0.7716352 0.9975191 -0.7982843 0.7716352 0.9975191 -0.8055177 0.7716352 0.9975191 -0.8146689 0.7716352 0.9975191 -0.8262464 0.7716352 0.9975191 -0.8408934 0.7716352 0.9975191 -0.8594238 0.7716352 0.9975191 -0.8828672 0.7716352 0.9975191 -0.912526 0.7716352 0.9975191 -0.9500484 0.7716352 0.9975191 -0.9975191 0.7716352 0.9975191 -0.9980488 0.8118921 0.95895 -0.9984638 0.8461977 0.9412311 -0.9987895 0.8750329 0.9360634 -0.9990456 0.8989921 0.9379818 -0.999247 0.9187101 0.9435116 -0.9994057 0.9348102 0.9505309 -0.9995309 0.947872 0.9578081 -0.9996295 0.9584138 0.9646792 -0.9997074 0.9668859 0.9708293 -0.9997688 0.9736717 0.9761499 -0.9998174 0.9790921 0.9806477 -0.9998557 0.9834126 0.984388 -0.999886 0.9868503 0.9874615 -0.9999099 0.9895819 0.9899646 -0.9999288 0.99175 0.9919896 -0.9999437 0.9934694 0.9936193 -0.7716588 0.7724394 0.997523 -0.7716551 0.7724308 0.997523 -0.7716504 0.7724199 0.9975229 -0.7716446 0.7724063 0.9975228 -0.7716375 0.7723893 0.9975227 -0.7716288 0.7723681 0.9975226 -0.7716184 0.7723418 0.9975224 -0.7716061 0.7723094 0.9975222 -0.7715919 0.7722698 0.997522 -0.7715762 0.7722219 0.9975217 -0.7715599 0.7721649 0.9975213 -0.7715449 0.7720984 0.9975209 -0.7715352 0.7720233 0.9975204 -0.7715376 0.771943 0.9975199 -0.7715641 0.7718647 0.9975194 -0.7716352 0.7718031 0.9975191 -0.7717834 0.7717834 0.9975189 -0.7719959 0.7717834 0.9975189 -0.7722648 0.7717834 0.9975189 -0.7726049 0.7717834 0.9975189 -0.7730352 0.7717834 0.9975189 -0.7735795 0.7717834 0.9975189 -0.7742682 0.7717834 0.9975189 -0.7751395 0.7717834 0.9975189 -0.7762418 0.7717834 0.9975189 -0.7776364 0.7717834 0.9975189 -0.7794007 0.7717834 0.9975189 -0.7816327 0.7717834 0.9975189 -0.7844566 0.7717834 0.9975189 -0.7880291 0.7717834 0.9975189 -0.7925488 0.7717834 0.9975189 -0.7982669 0.7717834 0.9975189 -0.8055009 0.7717834 0.9975189 -0.8146529 0.7717834 0.9975189 -0.8262314 0.7717834 0.9975189 -0.8408797 0.7717834 0.9975189 -0.8594117 0.7717834 0.9975189 -0.8828571 0.7717834 0.9975189 -0.9125186 0.7717834 0.9975189 -0.9500442 0.7717834 0.9975189 -0.9975189 0.7717834 0.9975189 -0.9980488 0.8119884 0.9589472 -0.9984638 0.8462598 0.9412278 -0.9987895 0.8750727 0.9360606 -0.9990455 0.8990175 0.9379796 -0.999247 0.9187262 0.94351 -0.9994057 0.9348204 0.9505298 -0.9995308 0.9478785 0.9578074 -0.9996295 0.9584178 0.9646787 -0.9997074 0.9668884 0.970829 -0.9997688 0.9736733 0.9761497 -0.9998174 0.9790931 0.9806476 -0.9998557 0.9834132 0.984388 -0.999886 0.9868507 0.9874615 -0.9999099 0.9895821 0.9899646 -0.9999288 0.9917502 0.9919896 -0.9999437 0.9934695 0.9936193 -0.7716588 0.7726513 0.997523 -0.7716551 0.7726427 0.997523 -0.7716504 0.7726318 0.9975229 -0.7716446 0.7726182 0.9975228 -0.7716375 0.7726012 0.9975227 -0.7716288 0.77258 0.9975226 -0.7716184 0.7725538 0.9975224 -0.7716061 0.7725214 0.9975222 -0.7715919 0.7724818 0.997522 -0.7715762 0.772434 0.9975217 -0.7715599 0.772377 0.9975213 -0.7715449 0.7723106 0.9975209 -0.7715352 0.7722356 0.9975204 -0.7715376 0.7721553 0.9975199 -0.7715641 0.7720771 0.9975194 -0.7716352 0.7720156 0.9975191 -0.7717834 0.7719959 0.9975189 -0.7719959 0.7719959 0.9975189 -0.7722648 0.7719959 0.9975189 -0.7726049 0.7719959 0.9975189 -0.7730352 0.7719959 0.9975189 -0.7735795 0.7719959 0.9975189 -0.7742682 0.7719959 0.9975189 -0.7751395 0.7719959 0.9975189 -0.7762418 0.7719959 0.9975189 -0.7776364 0.7719959 0.9975189 -0.7794007 0.7719959 0.9975189 -0.7816327 0.7719959 0.9975189 -0.7844566 0.7719959 0.9975189 -0.7880291 0.7719959 0.9975189 -0.7925488 0.7719959 0.9975189 -0.7982669 0.7719959 0.9975189 -0.8055009 0.7719959 0.9975189 -0.8146529 0.7719959 0.9975189 -0.8262314 0.7719959 0.9975189 -0.8408797 0.7719959 0.9975189 -0.8594117 0.7719959 0.9975189 -0.8828571 0.7719959 0.9975189 -0.9125186 0.7719959 0.9975189 -0.9500442 0.7719959 0.9975189 -0.9975189 0.7719959 0.9975189 -0.9980488 0.8121268 0.9589472 -0.9984638 0.8463492 0.9412278 -0.9987895 0.8751301 0.9360606 -0.9990455 0.8990542 0.9379796 -0.999247 0.9187495 0.94351 -0.9994057 0.9348352 0.9505298 -0.9995308 0.9478878 0.9578074 -0.9996295 0.9584237 0.9646787 -0.9997074 0.9668922 0.970829 -0.9997688 0.9736756 0.9761497 -0.9998174 0.9790946 0.9806476 -0.9998557 0.9834141 0.984388 -0.999886 0.9868512 0.9874615 -0.9999099 0.9895825 0.9899646 -0.9999288 0.9917504 0.9919896 -0.9999437 0.9934697 0.9936193 -0.7716588 0.7729194 0.997523 -0.7716551 0.7729107 0.997523 -0.7716504 0.7728999 0.9975229 -0.7716446 0.7728863 0.9975228 -0.7716375 0.7728693 0.9975227 -0.7716288 0.7728482 0.9975226 -0.7716184 0.7728219 0.9975224 -0.7716061 0.7727896 0.9975222 -0.7715919 0.7727501 0.997522 -0.7715762 0.7727023 0.9975217 -0.7715599 0.7726454 0.9975213 -0.7715449 0.772579 0.9975209 -0.7715352 0.7725042 0.9975204 -0.7715376 0.772424 0.9975199 -0.7715641 0.7723459 0.9975194 -0.7716352 0.7722844 0.9975191 -0.7717834 0.7722648 0.9975189 -0.7719959 0.7722648 0.9975189 -0.7722648 0.7722648 0.9975189 -0.7726049 0.7722648 0.9975189 -0.7730352 0.7722648 0.9975189 -0.7735795 0.7722648 0.9975189 -0.7742682 0.7722648 0.9975189 -0.7751395 0.7722648 0.9975189 -0.7762418 0.7722648 0.9975189 -0.7776364 0.7722648 0.9975189 -0.7794007 0.7722648 0.9975189 -0.7816327 0.7722648 0.9975189 -0.7844566 0.7722648 0.9975189 -0.7880291 0.7722648 0.9975189 -0.7925488 0.7722648 0.9975189 -0.7982669 0.7722648 0.9975189 -0.8055009 0.7722648 0.9975189 -0.8146529 0.7722648 0.9975189 -0.8262314 0.7722648 0.9975189 -0.8408797 0.7722648 0.9975189 -0.8594117 0.7722648 0.9975189 -0.8828571 0.7722648 0.9975189 -0.9125186 0.7722648 0.9975189 -0.9500442 0.7722648 0.9975189 -0.9975189 0.7722648 0.9975189 -0.9980488 0.8123018 0.9589472 -0.9984638 0.8464623 0.9412278 -0.9987895 0.8752028 0.9360606 -0.9990455 0.8991006 0.9379796 -0.999247 0.9187791 0.94351 -0.9994057 0.9348539 0.9505298 -0.9995308 0.9478997 0.9578074 -0.9996295 0.9584312 0.9646787 -0.9997074 0.9668969 0.970829 -0.9997688 0.9736786 0.9761497 -0.9998174 0.9790965 0.9806476 -0.9998557 0.9834153 0.984388 -0.999886 0.986852 0.9874615 -0.9999099 0.9895829 0.9899646 -0.9999288 0.9917507 0.9919896 -0.9999437 0.9934698 0.9936193 -0.7716588 0.7732585 0.997523 -0.7716551 0.7732499 0.997523 -0.7716504 0.7732391 0.9975229 -0.7716446 0.7732255 0.9975228 -0.7716375 0.7732085 0.9975227 -0.7716288 0.7731874 0.9975226 -0.7716184 0.7731612 0.9975224 -0.7716061 0.7731289 0.9975222 -0.7715919 0.7730895 0.997522 -0.7715762 0.7730418 0.9975217 -0.7715599 0.7729849 0.9975213 -0.7715449 0.7729187 0.9975209 -0.7715352 0.7728439 0.9975204 -0.7715376 0.7727638 0.9975199 -0.7715641 0.7726859 0.9975194 -0.7716352 0.7726245 0.9975191 -0.7717834 0.7726049 0.9975189 -0.7719959 0.7726049 0.9975189 -0.7722648 0.7726049 0.9975189 -0.7726049 0.7726049 0.9975189 -0.7730352 0.7726049 0.9975189 -0.7735795 0.7726049 0.9975189 -0.7742682 0.7726049 0.9975189 -0.7751395 0.7726049 0.9975189 -0.7762418 0.7726049 0.9975189 -0.7776364 0.7726049 0.9975189 -0.7794007 0.7726049 0.9975189 -0.7816327 0.7726049 0.9975189 -0.7844566 0.7726049 0.9975189 -0.7880291 0.7726049 0.9975189 -0.7925488 0.7726049 0.9975189 -0.7982669 0.7726049 0.9975189 -0.8055009 0.7726049 0.9975189 -0.8146529 0.7726049 0.9975189 -0.8262314 0.7726049 0.9975189 -0.8408797 0.7726049 0.9975189 -0.8594117 0.7726049 0.9975189 -0.8828571 0.7726049 0.9975189 -0.9125186 0.7726049 0.9975189 -0.9500442 0.7726049 0.9975189 -0.9975189 0.7726049 0.9975189 -0.9980488 0.8125232 0.9589472 -0.9984638 0.8466054 0.9412278 -0.9987895 0.8752947 0.9360606 -0.9990455 0.8991593 0.9379796 -0.999247 0.9188164 0.94351 -0.9994057 0.9348776 0.9505298 -0.9995308 0.9479146 0.9578074 -0.9996295 0.9584406 0.9646787 -0.9997074 0.9669028 0.970829 -0.9997688 0.9736823 0.9761497 -0.9998174 0.9790988 0.9806476 -0.9998557 0.9834167 0.984388 -0.999886 0.9868529 0.9874615 -0.9999099 0.9895835 0.9899646 -0.9999288 0.991751 0.9919896 -0.9999437 0.9934701 0.9936193 -0.7716588 0.7736876 0.997523 -0.7716551 0.773679 0.997523 -0.7716504 0.7736681 0.9975229 -0.7716446 0.7736546 0.9975228 -0.7716375 0.7736377 0.9975227 -0.7716288 0.7736166 0.9975226 -0.7716184 0.7735904 0.9975224 -0.7716061 0.7735582 0.9975222 -0.7715919 0.7735188 0.997522 -0.7715762 0.7734712 0.9975217 -0.7715599 0.7734145 0.9975213 -0.7715449 0.7733484 0.9975209 -0.7715352 0.7732737 0.9975204 -0.7715376 0.7731938 0.9975199 -0.7715641 0.773116 0.9975194 -0.7716352 0.7730548 0.9975191 -0.7717834 0.7730352 0.9975189 -0.7719959 0.7730352 0.9975189 -0.7722648 0.7730352 0.9975189 -0.7726049 0.7730352 0.9975189 -0.7730352 0.7730352 0.9975189 -0.7735795 0.7730352 0.9975189 -0.7742682 0.7730352 0.9975189 -0.7751395 0.7730352 0.9975189 -0.7762418 0.7730352 0.9975189 -0.7776364 0.7730352 0.9975189 -0.7794007 0.7730352 0.9975189 -0.7816327 0.7730352 0.9975189 -0.7844566 0.7730352 0.9975189 -0.7880291 0.7730352 0.9975189 -0.7925488 0.7730352 0.9975189 -0.7982669 0.7730352 0.9975189 -0.8055009 0.7730352 0.9975189 -0.8146529 0.7730352 0.9975189 -0.8262314 0.7730352 0.9975189 -0.8408797 0.7730352 0.9975189 -0.8594117 0.7730352 0.9975189 -0.8828571 0.7730352 0.9975189 -0.9125186 0.7730352 0.9975189 -0.9500442 0.7730352 0.9975189 -0.9975189 0.7730352 0.9975189 -0.9980488 0.8128033 0.9589472 -0.9984638 0.8467864 0.9412278 -0.9987895 0.8754109 0.9360606 -0.9990455 0.8992336 0.9379796 -0.999247 0.9188636 0.94351 -0.9994057 0.9349075 0.9505298 -0.9995308 0.9479335 0.9578074 -0.9996295 0.9584526 0.9646787 -0.9997074 0.9669103 0.970829 -0.9997688 0.973687 0.9761497 -0.9998174 0.9791018 0.9806476 -0.9998557 0.9834186 0.984388 -0.999886 0.9868541 0.9874615 -0.9999099 0.9895842 0.9899646 -0.9999288 0.9917515 0.9919896 -0.9999437 0.9934704 0.9936193 -0.7716588 0.7742304 0.997523 -0.7716551 0.7742218 0.997523 -0.7716504 0.774211 0.9975229 -0.7716446 0.7741975 0.9975228 -0.7716375 0.7741806 0.9975227 -0.7716288 0.7741595 0.9975226 -0.7716184 0.7741335 0.9975224 -0.7716061 0.7741013 0.9975222 -0.7715919 0.774062 0.997522 -0.7715762 0.7740145 0.9975217 -0.7715599 0.7739579 0.9975213 -0.7715449 0.773892 0.9975209 -0.7715352 0.7738175 0.9975204 -0.7715376 0.7737378 0.9975199 -0.7715641 0.7736602 0.9975194 -0.7716352 0.7735991 0.9975191 -0.7717834 0.7735795 0.9975189 -0.7719959 0.7735795 0.9975189 -0.7722648 0.7735795 0.9975189 -0.7726049 0.7735795 0.9975189 -0.7730352 0.7735795 0.9975189 -0.7735795 0.7735795 0.9975189 -0.7742682 0.7735795 0.9975189 -0.7751395 0.7735795 0.9975189 -0.7762418 0.7735795 0.9975189 -0.7776364 0.7735795 0.9975189 -0.7794007 0.7735795 0.9975189 -0.7816327 0.7735795 0.9975189 -0.7844566 0.7735795 0.9975189 -0.7880291 0.7735795 0.9975189 -0.7925488 0.7735795 0.9975189 -0.7982669 0.7735795 0.9975189 -0.8055009 0.7735795 0.9975189 -0.8146529 0.7735795 0.9975189 -0.8262314 0.7735795 0.9975189 -0.8408797 0.7735795 0.9975189 -0.8594117 0.7735795 0.9975189 -0.8828571 0.7735795 0.9975189 -0.9125186 0.7735795 0.9975189 -0.9500442 0.7735795 0.9975189 -0.9975189 0.7735795 0.9975189 -0.9980488 0.8131577 0.9589472 -0.9984638 0.8470154 0.9412278 -0.9987895 0.875558 0.9360606 -0.9990455 0.8993275 0.9379796 -0.999247 0.9189234 0.94351 -0.9994057 0.9349454 0.9505298 -0.9995308 0.9479575 0.9578074 -0.9996295 0.9584677 0.9646787 -0.9997074 0.9669198 0.970829 -0.9997688 0.973693 0.9761497 -0.9998174 0.9791055 0.9806476 -0.9998557 0.9834209 0.984388 -0.999886 0.9868555 0.9874615 -0.9999099 0.9895851 0.9899646 -0.9999288 0.9917521 0.9919896 -0.9999437 0.9934707 0.9936193 -0.7716588 0.7749171 0.997523 -0.7716551 0.7749085 0.997523 -0.7716504 0.7748978 0.9975229 -0.7716446 0.7748843 0.9975228 -0.7716375 0.7748674 0.9975227 -0.7716288 0.7748465 0.9975226 -0.7716184 0.7748205 0.9975224 -0.7716061 0.7747884 0.9975222 -0.7715919 0.7747493 0.997522 -0.7715762 0.7747019 0.9975217 -0.7715599 0.7746455 0.9975213 -0.7715449 0.7745797 0.9975209 -0.7715352 0.7745055 0.9975204 -0.7715376 0.774426 0.9975199 -0.7715641 0.7743486 0.9975194 -0.7716352 0.7742877 0.9975191 -0.7717834 0.7742682 0.9975189 -0.7719959 0.7742682 0.9975189 -0.7722648 0.7742682 0.9975189 -0.7726049 0.7742682 0.9975189 -0.7730352 0.7742682 0.9975189 -0.7735795 0.7742682 0.9975189 -0.7742682 0.7742682 0.9975189 -0.7751395 0.7742682 0.9975189 -0.7762418 0.7742682 0.9975189 -0.7776364 0.7742682 0.9975189 -0.7794007 0.7742682 0.9975189 -0.7816327 0.7742682 0.9975189 -0.7844566 0.7742682 0.9975189 -0.7880291 0.7742682 0.9975189 -0.7925488 0.7742682 0.9975189 -0.7982669 0.7742682 0.9975189 -0.8055009 0.7742682 0.9975189 -0.8146529 0.7742682 0.9975189 -0.8262314 0.7742682 0.9975189 -0.8408797 0.7742682 0.9975189 -0.8594117 0.7742682 0.9975189 -0.8828571 0.7742682 0.9975189 -0.9125186 0.7742682 0.9975189 -0.9500442 0.7742682 0.9975189 -0.9975189 0.7742682 0.9975189 -0.9980488 0.8136061 0.9589472 -0.9984638 0.8473052 0.9412278 -0.9987895 0.8757441 0.9360606 -0.9990455 0.8994464 0.9379796 -0.999247 0.918999 0.94351 -0.9994057 0.9349933 0.9505298 -0.9995308 0.9479878 0.9578074 -0.9996295 0.9584868 0.9646787 -0.9997074 0.9669318 0.970829 -0.9997688 0.9737006 0.9761497 -0.9998174 0.9791103 0.9806476 -0.9998557 0.9834239 0.984388 -0.999886 0.9868574 0.9874615 -0.9999099 0.9895863 0.9899646 -0.9999288 0.9917528 0.9919896 -0.9999437 0.9934712 0.9936193 -0.7716588 0.7757859 0.997523 -0.7716551 0.7757773 0.997523 -0.7716504 0.7757666 0.9975229 -0.7716446 0.7757532 0.9975228 -0.7716375 0.7757364 0.9975227 -0.7716288 0.7757155 0.9975226 -0.7716184 0.7756896 0.9975224 -0.7716061 0.7756577 0.9975222 -0.7715919 0.7756187 0.997522 -0.7715762 0.7755715 0.9975217 -0.7715599 0.7755153 0.9975213 -0.7715449 0.7754498 0.9975209 -0.7715352 0.7753759 0.9975204 -0.7715376 0.7752967 0.9975199 -0.7715641 0.7752196 0.9975194 -0.7716352 0.7751589 0.9975191 -0.7717834 0.7751395 0.9975189 -0.7719959 0.7751395 0.9975189 -0.7722648 0.7751395 0.9975189 -0.7726049 0.7751395 0.9975189 -0.7730352 0.7751395 0.9975189 -0.7735795 0.7751395 0.9975189 -0.7742682 0.7751395 0.9975189 -0.7751395 0.7751395 0.9975189 -0.7762418 0.7751395 0.9975189 -0.7776364 0.7751395 0.9975189 -0.7794007 0.7751395 0.9975189 -0.7816327 0.7751395 0.9975189 -0.7844566 0.7751395 0.9975189 -0.7880291 0.7751395 0.9975189 -0.7925488 0.7751395 0.9975189 -0.7982669 0.7751395 0.9975189 -0.8055009 0.7751395 0.9975189 -0.8146529 0.7751395 0.9975189 -0.8262314 0.7751395 0.9975189 -0.8408797 0.7751395 0.9975189 -0.8594117 0.7751395 0.9975189 -0.8828571 0.7751395 0.9975189 -0.9125186 0.7751395 0.9975189 -0.9500442 0.7751395 0.9975189 -0.9975189 0.7751395 0.9975189 -0.9980488 0.8141733 0.9589472 -0.9984638 0.8476717 0.9412278 -0.9987895 0.8759795 0.9360606 -0.9990455 0.8995968 0.9379796 -0.999247 0.9190947 0.94351 -0.9994057 0.935054 0.9505298 -0.9995308 0.9480261 0.9578074 -0.9996295 0.9585109 0.9646787 -0.9997074 0.966947 0.970829 -0.9997688 0.9737101 0.9761497 -0.9998174 0.9791163 0.9806476 -0.9998557 0.9834277 0.984388 -0.999886 0.9868597 0.9874615 -0.9999099 0.9895878 0.9899646 -0.9999288 0.9917537 0.9919896 -0.9999437 0.9934718 0.9936193 -0.7716588 0.776885 0.997523 -0.7716551 0.7768765 0.997523 -0.7716504 0.7768658 0.9975229 -0.7716446 0.7768525 0.9975228 -0.7716375 0.7768358 0.9975227 -0.7716288 0.776815 0.9975226 -0.7716184 0.7767892 0.9975224 -0.7716061 0.7767575 0.9975222 -0.7715919 0.7767186 0.997522 -0.7715762 0.7766717 0.9975217 -0.7715599 0.7766158 0.9975213 -0.7715449 0.7765506 0.9975209 -0.7715352 0.776477 0.9975204 -0.7715376 0.7763982 0.9975199 -0.7715641 0.7763215 0.9975194 -0.7716352 0.7762611 0.9975191 -0.7717834 0.7762418 0.9975189 -0.7719959 0.7762418 0.9975189 -0.7722648 0.7762418 0.9975189 -0.7726049 0.7762418 0.9975189 -0.7730352 0.7762418 0.9975189 -0.7735795 0.7762418 0.9975189 -0.7742682 0.7762418 0.9975189 -0.7751395 0.7762418 0.9975189 -0.7762418 0.7762418 0.9975189 -0.7776364 0.7762418 0.9975189 -0.7794007 0.7762418 0.9975189 -0.7816327 0.7762418 0.9975189 -0.7844566 0.7762418 0.9975189 -0.7880291 0.7762418 0.9975189 -0.7925488 0.7762418 0.9975189 -0.7982669 0.7762418 0.9975189 -0.8055009 0.7762418 0.9975189 -0.8146529 0.7762418 0.9975189 -0.8262314 0.7762418 0.9975189 -0.8408797 0.7762418 0.9975189 -0.8594117 0.7762418 0.9975189 -0.8828571 0.7762418 0.9975189 -0.9125186 0.7762418 0.9975189 -0.9500442 0.7762418 0.9975189 -0.9975189 0.7762418 0.9975189 -0.9980488 0.8148909 0.9589472 -0.9984638 0.8481355 0.9412278 -0.9987895 0.8762773 0.9360606 -0.9990455 0.899787 0.9379796 -0.999247 0.9192157 0.94351 -0.9994057 0.9351307 0.9505298 -0.9995308 0.9480746 0.9578074 -0.9996295 0.9585415 0.9646787 -0.9997074 0.9669663 0.970829 -0.9997688 0.9737222 0.9761497 -0.9998174 0.9791238 0.9806476 -0.9998557 0.9834324 0.984388 -0.999886 0.9868627 0.9874615 -0.9999099 0.9895897 0.9899646 -0.9999288 0.9917549 0.9919896 -0.9999437 0.9934725 0.9936193 -0.7716588 0.7782755 0.997523 -0.7716551 0.7782671 0.997523 -0.7716504 0.7782565 0.9975229 -0.7716446 0.7782432 0.9975228 -0.7716375 0.7782266 0.9975227 -0.7716288 0.778206 0.9975226 -0.7716184 0.7781803 0.9975224 -0.7716061 0.7781488 0.9975222 -0.7715919 0.7781102 0.997522 -0.7715762 0.7780636 0.9975217 -0.7715599 0.778008 0.9975213 -0.7715449 0.7779432 0.9975209 -0.7715352 0.7778701 0.9975204 -0.7715376 0.7777918 0.9975199 -0.7715641 0.7777156 0.9975194 -0.7716352 0.7776556 0.9975191 -0.7717834 0.7776364 0.9975189 -0.7719959 0.7776364 0.9975189 -0.7722648 0.7776364 0.9975189 -0.7726049 0.7776364 0.9975189 -0.7730352 0.7776364 0.9975189 -0.7735795 0.7776364 0.9975189 -0.7742682 0.7776364 0.9975189 -0.7751395 0.7776364 0.9975189 -0.7762418 0.7776364 0.9975189 -0.7776364 0.7776364 0.9975189 -0.7794007 0.7776364 0.9975189 -0.7816327 0.7776364 0.9975189 -0.7844566 0.7776364 0.9975189 -0.7880291 0.7776364 0.9975189 -0.7925488 0.7776364 0.9975189 -0.7982669 0.7776364 0.9975189 -0.8055009 0.7776364 0.9975189 -0.8146529 0.7776364 0.9975189 -0.8262314 0.7776364 0.9975189 -0.8408797 0.7776364 0.9975189 -0.8594117 0.7776364 0.9975189 -0.8828571 0.7776364 0.9975189 -0.9125186 0.7776364 0.9975189 -0.9500442 0.7776364 0.9975189 -0.9975189 0.7776364 0.9975189 -0.9980488 0.8157988 0.9589472 -0.9984638 0.8487222 0.9412278 -0.9987895 0.8766541 0.9360606 -0.9990455 0.9000277 0.9379796 -0.999247 0.9193688 0.94351 -0.9994057 0.9352277 0.9505298 -0.9995308 0.9481359 0.9578074 -0.9996295 0.9585802 0.9646787 -0.9997074 0.9669906 0.970829 -0.9997688 0.9737375 0.9761497 -0.9998174 0.9791334 0.9806476 -0.9998557 0.9834385 0.984388 -0.999886 0.9868665 0.9874615 -0.9999099 0.989592 0.9899646 -0.9999288 0.9917564 0.9919896 -0.9999437 0.9934734 0.9936193 -0.7716588 0.7800347 0.997523 -0.7716551 0.7800263 0.997523 -0.7716504 0.7800158 0.9975229 -0.7716446 0.7800027 0.9975228 -0.7716375 0.7799862 0.9975227 -0.7716288 0.7799657 0.9975226 -0.7716184 0.7799403 0.9975224 -0.7716061 0.779909 0.9975222 -0.7715919 0.7798707 0.997522 -0.7715762 0.7798244 0.9975217 -0.7715599 0.7797693 0.9975213 -0.7715449 0.779705 0.9975209 -0.7715352 0.7796325 0.9975204 -0.7715376 0.7795549 0.9975199 -0.7715641 0.7794792 0.9975194 -0.7716352 0.7794197 0.9975191 -0.7717834 0.7794007 0.9975189 -0.7719959 0.7794007 0.9975189 -0.7722648 0.7794007 0.9975189 -0.7726049 0.7794007 0.9975189 -0.7730352 0.7794007 0.9975189 -0.7735795 0.7794007 0.9975189 -0.7742682 0.7794007 0.9975189 -0.7751395 0.7794007 0.9975189 -0.7762418 0.7794007 0.9975189 -0.7776364 0.7794007 0.9975189 -0.7794007 0.7794007 0.9975189 -0.7816327 0.7794007 0.9975189 -0.7844566 0.7794007 0.9975189 -0.7880291 0.7794007 0.9975189 -0.7925488 0.7794007 0.9975189 -0.7982669 0.7794007 0.9975189 -0.8055009 0.7794007 0.9975189 -0.8146529 0.7794007 0.9975189 -0.8262314 0.7794007 0.9975189 -0.8408797 0.7794007 0.9975189 -0.8594117 0.7794007 0.9975189 -0.8828571 0.7794007 0.9975189 -0.9125186 0.7794007 0.9975189 -0.9500442 0.7794007 0.9975189 -0.9975189 0.7794007 0.9975189 -0.9980488 0.8169474 0.9589472 -0.9984638 0.8494644 0.9412278 -0.9987895 0.8771307 0.9360606 -0.9990455 0.9003323 0.9379796 -0.999247 0.9195625 0.94351 -0.9994057 0.9353505 0.9505298 -0.9995308 0.9482135 0.9578074 -0.9996295 0.9586291 0.9646787 -0.9997074 0.9670214 0.970829 -0.9997688 0.9737569 0.9761497 -0.9998174 0.9791456 0.9806476 -0.9998557 0.9834461 0.984388 -0.999886 0.9868713 0.9874615 -0.9999099 0.989595 0.9899646 -0.9999288 0.9917582 0.9919896 -0.9999437 0.9934746 0.9936193 -0.7716588 0.7822603 0.997523 -0.7716551 0.782252 0.997523 -0.7716504 0.7822416 0.9975229 -0.7716446 0.7822286 0.9975228 -0.7716375 0.7822123 0.9975227 -0.7716288 0.782192 0.9975226 -0.7716184 0.7821669 0.9975224 -0.7716061 0.7821359 0.9975222 -0.7715919 0.782098 0.997522 -0.7715762 0.7820522 0.9975217 -0.7715599 0.7819976 0.9975213 -0.7715449 0.781934 0.9975209 -0.7715352 0.7818622 0.9975204 -0.7715376 0.7817854 0.9975199 -0.7715641 0.7817105 0.9975194 -0.7716352 0.7816516 0.9975191 -0.7717834 0.7816327 0.9975189 -0.7719959 0.7816327 0.9975189 -0.7722648 0.7816327 0.9975189 -0.7726049 0.7816327 0.9975189 -0.7730352 0.7816327 0.9975189 -0.7735795 0.7816327 0.9975189 -0.7742682 0.7816327 0.9975189 -0.7751395 0.7816327 0.9975189 -0.7762418 0.7816327 0.9975189 -0.7776364 0.7816327 0.9975189 -0.7794007 0.7816327 0.9975189 -0.7816327 0.7816327 0.9975189 -0.7844566 0.7816327 0.9975189 -0.7880291 0.7816327 0.9975189 -0.7925488 0.7816327 0.9975189 -0.7982669 0.7816327 0.9975189 -0.8055009 0.7816327 0.9975189 -0.8146529 0.7816327 0.9975189 -0.8262314 0.7816327 0.9975189 -0.8408797 0.7816327 0.9975189 -0.8594117 0.7816327 0.9975189 -0.8828571 0.7816327 0.9975189 -0.9125186 0.7816327 0.9975189 -0.9500442 0.7816327 0.9975189 -0.9975189 0.7816327 0.9975189 -0.9980488 0.8184005 0.9589472 -0.9984638 0.8504035 0.9412278 -0.9987895 0.8777338 0.9360606 -0.9990455 0.9007175 0.9379796 -0.999247 0.9198076 0.94351 -0.9994057 0.9355059 0.9505298 -0.9995308 0.9483117 0.9578074 -0.9996295 0.958691 0.9646787 -0.9997074 0.9670604 0.970829 -0.9997688 0.9737814 0.9761497 -0.9998174 0.979161 0.9806476 -0.9998557 0.9834557 0.984388 -0.999886 0.9868773 0.9874615 -0.9999099 0.9895988 0.9899646 -0.9999288 0.9917606 0.9919896 -0.9999437 0.9934761 0.9936193 -0.7716588 0.785076 0.997523 -0.7716551 0.7850678 0.997523 -0.7716504 0.7850576 0.9975229 -0.7716446 0.7850447 0.9975228 -0.7716375 0.7850286 0.9975227 -0.7716288 0.7850086 0.9975226 -0.7716184 0.7849838 0.9975224 -0.7716061 0.7849532 0.9975222 -0.7715919 0.7849158 0.997522 -0.7715762 0.7848706 0.9975217 -0.7715599 0.7848167 0.9975213 -0.7715449 0.7847539 0.9975209 -0.7715352 0.7846831 0.9975204 -0.7715376 0.7846072 0.9975199 -0.7715641 0.7845333 0.9975194 -0.7716352 0.7844752 0.9975191 -0.7717834 0.7844566 0.9975189 -0.7719959 0.7844566 0.9975189 -0.7722648 0.7844566 0.9975189 -0.7726049 0.7844566 0.9975189 -0.7730352 0.7844566 0.9975189 -0.7735795 0.7844566 0.9975189 -0.7742682 0.7844566 0.9975189 -0.7751395 0.7844566 0.9975189 -0.7762418 0.7844566 0.9975189 -0.7776364 0.7844566 0.9975189 -0.7794007 0.7844566 0.9975189 -0.7816327 0.7844566 0.9975189 -0.7844566 0.7844566 0.9975189 -0.7880291 0.7844566 0.9975189 -0.7925488 0.7844566 0.9975189 -0.7982669 0.7844566 0.9975189 -0.8055009 0.7844566 0.9975189 -0.8146529 0.7844566 0.9975189 -0.8262314 0.7844566 0.9975189 -0.8408797 0.7844566 0.9975189 -0.8594117 0.7844566 0.9975189 -0.8828571 0.7844566 0.9975189 -0.9125186 0.7844566 0.9975189 -0.9500442 0.7844566 0.9975189 -0.9975189 0.7844566 0.9975189 -0.9980488 0.8202389 0.9589472 -0.9984638 0.8515915 0.9412278 -0.9987895 0.8784967 0.9360606 -0.9990455 0.9012049 0.9379796 -0.999247 0.9201176 0.94351 -0.9994057 0.9357024 0.9505298 -0.9995308 0.9484359 0.9578074 -0.9996295 0.9587693 0.9646787 -0.9997074 0.9671097 0.970829 -0.9997688 0.9738123 0.9761497 -0.9998174 0.9791804 0.9806476 -0.9998557 0.9834679 0.984388 -0.999886 0.986885 0.9874615 -0.9999099 0.9896036 0.9899646 -0.9999288 0.9917636 0.9919896 -0.9999437 0.9934779 0.9936193 -0.7716588 0.7886382 0.997523 -0.7716551 0.7886302 0.997523 -0.7716504 0.7886201 0.9975229 -0.7716446 0.7886074 0.9975228 -0.7716375 0.7885916 0.9975227 -0.7716288 0.7885719 0.9975226 -0.7716184 0.7885475 0.9975224 -0.7716061 0.7885175 0.9975222 -0.7715919 0.7884807 0.997522 -0.7715762 0.7884362 0.9975217 -0.7715599 0.7883833 0.9975213 -0.7715449 0.7883215 0.9975209 -0.7715352 0.7882518 0.9975204 -0.7715376 0.7881772 0.9975199 -0.7715641 0.7881046 0.9975194 -0.7716352 0.7880474 0.9975191 -0.7717834 0.7880291 0.9975189 -0.7719959 0.7880291 0.9975189 -0.7722648 0.7880291 0.9975189 -0.7726049 0.7880291 0.9975189 -0.7730352 0.7880291 0.9975189 -0.7735795 0.7880291 0.9975189 -0.7742682 0.7880291 0.9975189 -0.7751395 0.7880291 0.9975189 -0.7762418 0.7880291 0.9975189 -0.7776364 0.7880291 0.9975189 -0.7794007 0.7880291 0.9975189 -0.7816327 0.7880291 0.9975189 -0.7844566 0.7880291 0.9975189 -0.7880291 0.7880291 0.9975189 -0.7925488 0.7880291 0.9975189 -0.7982669 0.7880291 0.9975189 -0.8055009 0.7880291 0.9975189 -0.8146529 0.7880291 0.9975189 -0.8262314 0.7880291 0.9975189 -0.8408797 0.7880291 0.9975189 -0.8594117 0.7880291 0.9975189 -0.8828571 0.7880291 0.9975189 -0.9125186 0.7880291 0.9975189 -0.9500442 0.7880291 0.9975189 -0.9975189 0.7880291 0.9975189 -0.9980488 0.8225647 0.9589472 -0.9984638 0.8530945 0.9412278 -0.9987895 0.8794619 0.9360606 -0.9990455 0.9018215 0.9379796 -0.999247 0.9205098 0.94351 -0.9994057 0.935951 0.9505298 -0.9995308 0.9485931 0.9578074 -0.9996295 0.9588684 0.9646787 -0.9997074 0.967172 0.970829 -0.9997688 0.9738515 0.9761497 -0.9998174 0.979205 0.9806476 -0.9998557 0.9834833 0.984388 -0.999886 0.9868946 0.9874615 -0.9999099 0.9896096 0.9899646 -0.9999288 0.9917674 0.9919896 -0.9999437 0.9934803 0.9936193 -0.7716588 0.7931449 0.997523 -0.7716551 0.793137 0.997523 -0.7716504 0.7931271 0.9975229 -0.7716446 0.7931147 0.9975228 -0.7716375 0.7930993 0.9975227 -0.7716288 0.79308 0.9975226 -0.7716184 0.7930561 0.9975224 -0.7716061 0.7930267 0.9975222 -0.7715919 0.7929907 0.997522 -0.7715762 0.7929472 0.9975217 -0.7715599 0.7928954 0.9975213 -0.7715449 0.792835 0.9975209 -0.7715352 0.7927668 0.9975204 -0.7715376 0.7926938 0.9975199 -0.7715641 0.7926227 0.9975194 -0.7716352 0.7925667 0.9975191 -0.7717834 0.7925488 0.9975189 -0.7719959 0.7925488 0.9975189 -0.7722648 0.7925488 0.9975189 -0.7726049 0.7925488 0.9975189 -0.7730352 0.7925488 0.9975189 -0.7735795 0.7925488 0.9975189 -0.7742682 0.7925488 0.9975189 -0.7751395 0.7925488 0.9975189 -0.7762418 0.7925488 0.9975189 -0.7776364 0.7925488 0.9975189 -0.7794007 0.7925488 0.9975189 -0.7816327 0.7925488 0.9975189 -0.7844566 0.7925488 0.9975189 -0.7880291 0.7925488 0.9975189 -0.7925488 0.7925488 0.9975189 -0.7982669 0.7925488 0.9975189 -0.8055009 0.7925488 0.9975189 -0.8146529 0.7925488 0.9975189 -0.8262314 0.7925488 0.9975189 -0.8408797 0.7925488 0.9975189 -0.8594117 0.7925488 0.9975189 -0.8828571 0.7925488 0.9975189 -0.9125186 0.7925488 0.9975189 -0.9500442 0.7925488 0.9975189 -0.9975189 0.7925488 0.9975189 -0.9980488 0.8255071 0.9589472 -0.9984638 0.8549959 0.9412278 -0.9987895 0.880683 0.9360606 -0.9990455 0.9026016 0.9379796 -0.999247 0.9210061 0.94351 -0.9994057 0.9362655 0.9505298 -0.9995308 0.9487918 0.9578074 -0.9996295 0.9589938 0.9646787 -0.9997074 0.9672509 0.970829 -0.9997688 0.9739011 0.9761497 -0.9998174 0.9792361 0.9806476 -0.9998557 0.9835029 0.984388 -0.999886 0.9869069 0.9874615 -0.9999099 0.9896173 0.9899646 -0.9999288 0.9917722 0.9919896 -0.9999437 0.9934833 0.9936193 -0.7716588 0.7988464 0.997523 -0.7716551 0.7988387 0.997523 -0.7716504 0.7988291 0.9975229 -0.7716446 0.7988171 0.9975228 -0.7716375 0.7988021 0.9975227 -0.7716288 0.7987833 0.9975226 -0.7716184 0.7987601 0.9975224 -0.7716061 0.7987315 0.9975222 -0.7715919 0.7986965 0.997522 -0.7715762 0.7986542 0.9975217 -0.7715599 0.7986038 0.9975213 -0.7715449 0.7985451 0.9975209 -0.7715352 0.7984788 0.9975204 -0.7715376 0.7984078 0.9975199 -0.7715641 0.7983387 0.9975194 -0.7716352 0.7982843 0.9975191 -0.7717834 0.7982669 0.9975189 -0.7719959 0.7982669 0.9975189 -0.7722648 0.7982669 0.9975189 -0.7726049 0.7982669 0.9975189 -0.7730352 0.7982669 0.9975189 -0.7735795 0.7982669 0.9975189 -0.7742682 0.7982669 0.9975189 -0.7751395 0.7982669 0.9975189 -0.7762418 0.7982669 0.9975189 -0.7776364 0.7982669 0.9975189 -0.7794007 0.7982669 0.9975189 -0.7816327 0.7982669 0.9975189 -0.7844566 0.7982669 0.9975189 -0.7880291 0.7982669 0.9975189 -0.7925488 0.7982669 0.9975189 -0.7982669 0.7982669 0.9975189 -0.8055009 0.7982669 0.9975189 -0.8146529 0.7982669 0.9975189 -0.8262314 0.7982669 0.9975189 -0.8408797 0.7982669 0.9975189 -0.8594117 0.7982669 0.9975189 -0.8828571 0.7982669 0.9975189 -0.9125186 0.7982669 0.9975189 -0.9500442 0.7982669 0.9975189 -0.9975189 0.7982669 0.9975189 -0.9980488 0.8292297 0.9589472 -0.9984638 0.8574015 0.9412278 -0.9987895 0.8822279 0.9360606 -0.9990455 0.9035886 0.9379796 -0.999247 0.9216339 0.94351 -0.9994057 0.9366635 0.9505298 -0.9995308 0.9490434 0.9578074 -0.9996295 0.9591524 0.9646787 -0.9997074 0.9673508 0.970829 -0.9997688 0.9739638 0.9761497 -0.9998174 0.9792755 0.9806476 -0.9998557 0.9835276 0.984388 -0.999886 0.9869223 0.9874615 -0.9999099 0.989627 0.9899646 -0.9999288 0.9917782 0.9919896 -0.9999437 0.9934871 0.9936193 -0.7716588 0.8060595 0.997523 -0.7716551 0.8060522 0.997523 -0.7716504 0.8060429 0.9975229 -0.7716446 0.8060313 0.9975228 -0.7716375 0.8060168 0.9975227 -0.7716288 0.8059988 0.9975226 -0.7716184 0.8059764 0.9975224 -0.7716061 0.8059488 0.9975222 -0.7715919 0.8059151 0.997522 -0.7715762 0.8058743 0.9975217 -0.7715599 0.8058257 0.9975213 -0.7715449 0.8057691 0.9975209 -0.7715352 0.8057052 0.9975204 -0.7715376 0.8056368 0.9975199 -0.7715641 0.8055701 0.9975194 -0.7716352 0.8055177 0.9975191 -0.7717834 0.8055009 0.9975189 -0.7719959 0.8055009 0.9975189 -0.7722648 0.8055009 0.9975189 -0.7726049 0.8055009 0.9975189 -0.7730352 0.8055009 0.9975189 -0.7735795 0.8055009 0.9975189 -0.7742682 0.8055009 0.9975189 -0.7751395 0.8055009 0.9975189 -0.7762418 0.8055009 0.9975189 -0.7776364 0.8055009 0.9975189 -0.7794007 0.8055009 0.9975189 -0.7816327 0.8055009 0.9975189 -0.7844566 0.8055009 0.9975189 -0.7880291 0.8055009 0.9975189 -0.7925488 0.8055009 0.9975189 -0.7982669 0.8055009 0.9975189 -0.8055009 0.8055009 0.9975189 -0.8146529 0.8055009 0.9975189 -0.8262314 0.8055009 0.9975189 -0.8408797 0.8055009 0.9975189 -0.8594117 0.8055009 0.9975189 -0.8828571 0.8055009 0.9975189 -0.9125186 0.8055009 0.9975189 -0.9500442 0.8055009 0.9975189 -0.9975189 0.8055009 0.9975189 -0.9980488 0.8339392 0.9589472 -0.9984638 0.8604449 0.9412278 -0.9987895 0.8841823 0.9360606 -0.9990455 0.9048372 0.9379796 -0.999247 0.9224281 0.94351 -0.9994057 0.9371669 0.9505298 -0.9995308 0.9493615 0.9578074 -0.9996295 0.959353 0.9646787 -0.9997074 0.967477 0.970829 -0.9997688 0.9740432 0.9761497 -0.9998174 0.9793253 0.9806476 -0.9998557 0.9835588 0.984388 -0.999886 0.9869419 0.9874615 -0.9999099 0.9896392 0.9899646 -0.9999288 0.9917859 0.9919896 -0.9999437 0.9934919 0.9936193 -0.7716588 0.8151851 0.997523 -0.7716551 0.8151781 0.997523 -0.7716504 0.8151693 0.9975229 -0.7716446 0.8151582 0.9975228 -0.7716375 0.8151444 0.9975227 -0.7716288 0.8151272 0.9975226 -0.7716184 0.8151059 0.9975224 -0.7716061 0.8150796 0.9975222 -0.7715919 0.8150475 0.997522 -0.7715762 0.8150086 0.9975217 -0.7715599 0.8149624 0.9975213 -0.7715449 0.8149084 0.9975209 -0.7715352 0.8148475 0.9975204 -0.7715376 0.8147824 0.9975199 -0.7715641 0.8147189 0.9975194 -0.7716352 0.8146689 0.9975191 -0.7717834 0.8146529 0.9975189 -0.7719959 0.8146529 0.9975189 -0.7722648 0.8146529 0.9975189 -0.7726049 0.8146529 0.9975189 -0.7730352 0.8146529 0.9975189 -0.7735795 0.8146529 0.9975189 -0.7742682 0.8146529 0.9975189 -0.7751395 0.8146529 0.9975189 -0.7762418 0.8146529 0.9975189 -0.7776364 0.8146529 0.9975189 -0.7794007 0.8146529 0.9975189 -0.7816327 0.8146529 0.9975189 -0.7844566 0.8146529 0.9975189 -0.7880291 0.8146529 0.9975189 -0.7925488 0.8146529 0.9975189 -0.7982669 0.8146529 0.9975189 -0.8055009 0.8146529 0.9975189 -0.8146529 0.8146529 0.9975189 -0.8262314 0.8146529 0.9975189 -0.8408797 0.8146529 0.9975189 -0.8594117 0.8146529 0.9975189 -0.8828571 0.8146529 0.9975189 -0.9125186 0.8146529 0.9975189 -0.9500442 0.8146529 0.9975189 -0.9975189 0.8146529 0.9975189 -0.9980488 0.8398974 0.9589472 -0.9984638 0.8642952 0.9412278 -0.9987895 0.886655 0.9360606 -0.9990455 0.9064168 0.9379796 -0.999247 0.9234329 0.94351 -0.9994057 0.9378038 0.9505298 -0.9995308 0.9497641 0.9578074 -0.9996295 0.9596068 0.9646787 -0.9997074 0.9676368 0.970829 -0.9997688 0.9741436 0.9761497 -0.9998174 0.9793883 0.9806476 -0.9998557 0.9835983 0.984388 -0.999886 0.9869667 0.9874615 -0.9999099 0.9896547 0.9899646 -0.9999288 0.9917956 0.9919896 -0.9999437 0.993498 0.9936193 -0.7716588 0.8267302 0.997523 -0.7716551 0.8267236 0.997523 -0.7716504 0.8267153 0.9975229 -0.7716446 0.826705 0.9975228 -0.7716375 0.826692 0.9975227 -0.7716288 0.8266759 0.9975226 -0.7716184 0.8266559 0.9975224 -0.7716061 0.8266313 0.9975222 -0.7715919 0.8266012 0.997522 -0.7715762 0.8265648 0.9975217 -0.7715599 0.8265214 0.9975213 -0.7715449 0.8264708 0.9975209 -0.7715352 0.8264138 0.9975204 -0.7715376 0.8263527 0.9975199 -0.7715641 0.8262932 0.9975194 -0.7716352 0.8262464 0.9975191 -0.7717834 0.8262314 0.9975189 -0.7719959 0.8262314 0.9975189 -0.7722648 0.8262314 0.9975189 -0.7726049 0.8262314 0.9975189 -0.7730352 0.8262314 0.9975189 -0.7735795 0.8262314 0.9975189 -0.7742682 0.8262314 0.9975189 -0.7751395 0.8262314 0.9975189 -0.7762418 0.8262314 0.9975189 -0.7776364 0.8262314 0.9975189 -0.7794007 0.8262314 0.9975189 -0.7816327 0.8262314 0.9975189 -0.7844566 0.8262314 0.9975189 -0.7880291 0.8262314 0.9975189 -0.7925488 0.8262314 0.9975189 -0.7982669 0.8262314 0.9975189 -0.8055009 0.8262314 0.9975189 -0.8146529 0.8262314 0.9975189 -0.8262314 0.8262314 0.9975189 -0.8408797 0.8262314 0.9975189 -0.8594117 0.8262314 0.9975189 -0.8828571 0.8262314 0.9975189 -0.9125186 0.8262314 0.9975189 -0.9500442 0.8262314 0.9975189 -0.9975189 0.8262314 0.9975189 -0.9980488 0.8474353 0.9589472 -0.9984638 0.8691663 0.9412278 -0.9987895 0.8897832 0.9360606 -0.9990455 0.9084153 0.9379796 -0.999247 0.9247041 0.94351 -0.9994057 0.9386096 0.9505298 -0.9995308 0.9502734 0.9578074 -0.9996295 0.959928 0.9646787 -0.9997074 0.9678389 0.970829 -0.9997688 0.9742706 0.9761497 -0.9998174 0.9794681 0.9806476 -0.9998557 0.9836483 0.984388 -0.999886 0.986998 0.9874615 -0.9999099 0.9896744 0.9899646 -0.9999288 0.9918079 0.9919896 -0.9999437 0.9935057 0.9936193 -0.7716588 0.8413362 0.997523 -0.7716551 0.8413301 0.997523 -0.7716504 0.8413226 0.9975229 -0.7716446 0.8413131 0.9975228 -0.7716375 0.8413012 0.9975227 -0.7716288 0.8412865 0.9975226 -0.7716184 0.8412682 0.9975224 -0.7716061 0.8412457 0.9975222 -0.7715919 0.8412181 0.997522 -0.7715762 0.8411848 0.9975217 -0.7715599 0.8411451 0.9975213 -0.7715449 0.8410988 0.9975209 -0.7715352 0.8410466 0.9975204 -0.7715376 0.8409907 0.9975199 -0.7715641 0.8409363 0.9975194 -0.7716352 0.8408934 0.9975191 -0.7717834 0.8408797 0.9975189 -0.7719959 0.8408797 0.9975189 -0.7722648 0.8408797 0.9975189 -0.7726049 0.8408797 0.9975189 -0.7730352 0.8408797 0.9975189 -0.7735795 0.8408797 0.9975189 -0.7742682 0.8408797 0.9975189 -0.7751395 0.8408797 0.9975189 -0.7762418 0.8408797 0.9975189 -0.7776364 0.8408797 0.9975189 -0.7794007 0.8408797 0.9975189 -0.7816327 0.8408797 0.9975189 -0.7844566 0.8408797 0.9975189 -0.7880291 0.8408797 0.9975189 -0.7925488 0.8408797 0.9975189 -0.7982669 0.8408797 0.9975189 -0.8055009 0.8408797 0.9975189 -0.8146529 0.8408797 0.9975189 -0.8262314 0.8408797 0.9975189 -0.8408797 0.8408797 0.9975189 -0.8594117 0.8408797 0.9975189 -0.8828571 0.8408797 0.9975189 -0.9125186 0.8408797 0.9975189 -0.9500442 0.8408797 0.9975189 -0.9975189 0.8408797 0.9975189 -0.9980488 0.8569716 0.9589472 -0.9984638 0.875329 0.9412278 -0.9987895 0.8937407 0.9360606 -0.9990455 0.9109436 0.9379796 -0.999247 0.9263124 0.94351 -0.9994057 0.939629 0.9505298 -0.9995308 0.9509177 0.9578074 -0.9996295 0.9603343 0.9646787 -0.9997074 0.9680946 0.970829 -0.9997688 0.9744313 0.9761497 -0.9998174 0.9795689 0.9806476 -0.9998557 0.9837116 0.984388 -0.999886 0.9870376 0.9874615 -0.9999099 0.9896992 0.9899646 -0.9999288 0.9918234 0.9919896 -0.9999437 0.9935154 0.9936193 -0.7716588 0.8598146 0.997523 -0.7716551 0.8598093 0.997523 -0.7716504 0.8598026 0.9975229 -0.7716446 0.8597943 0.9975228 -0.7716375 0.8597838 0.9975227 -0.7716288 0.8597708 0.9975226 -0.7716184 0.8597546 0.9975224 -0.7716061 0.8597348 0.9975222 -0.7715919 0.8597104 0.997522 -0.7715762 0.859681 0.9975217 -0.7715599 0.859646 0.9975213 -0.7715449 0.8596051 0.9975209 -0.7715352 0.859559 0.9975204 -0.7715376 0.8595097 0.9975199 -0.7715641 0.8594616 0.9975194 -0.7716352 0.8594238 0.9975191 -0.7717834 0.8594117 0.9975189 -0.7719959 0.8594117 0.9975189 -0.7722648 0.8594117 0.9975189 -0.7726049 0.8594117 0.9975189 -0.7730352 0.8594117 0.9975189 -0.7735795 0.8594117 0.9975189 -0.7742682 0.8594117 0.9975189 -0.7751395 0.8594117 0.9975189 -0.7762418 0.8594117 0.9975189 -0.7776364 0.8594117 0.9975189 -0.7794007 0.8594117 0.9975189 -0.7816327 0.8594117 0.9975189 -0.7844566 0.8594117 0.9975189 -0.7880291 0.8594117 0.9975189 -0.7925488 0.8594117 0.9975189 -0.7982669 0.8594117 0.9975189 -0.8055009 0.8594117 0.9975189 -0.8146529 0.8594117 0.9975189 -0.8262314 0.8594117 0.9975189 -0.8408797 0.8594117 0.9975189 -0.8594117 0.8594117 0.9975189 -0.8828571 0.8594117 0.9975189 -0.9125186 0.8594117 0.9975189 -0.9500442 0.8594117 0.9975189 -0.9975189 0.8594117 0.9975189 -0.9980488 0.8690364 0.9589472 -0.9984638 0.8831255 0.9412278 -0.9987895 0.8987476 0.9360606 -0.9990455 0.9141422 0.9379796 -0.999247 0.928347 0.94351 -0.9994057 0.9409186 0.9505298 -0.9995308 0.9517328 0.9578074 -0.9996295 0.9608482 0.9646787 -0.9997074 0.9684181 0.970829 -0.9997688 0.9746346 0.9761497 -0.9998174 0.9796966 0.9806476 -0.9998557 0.9837916 0.984388 -0.999886 0.9870878 0.9874615 -0.9999099 0.9897306 0.9899646 -0.9999288 0.9918431 0.9919896 -0.9999437 0.9935277 0.9936193 -0.7716588 0.8831923 0.997523 -0.7716551 0.8831879 0.997523 -0.7716504 0.8831823 0.9975229 -0.7716446 0.8831754 0.9975228 -0.7716375 0.8831667 0.9975227 -0.7716288 0.8831558 0.9975226 -0.7716184 0.8831424 0.9975224 -0.7716061 0.8831259 0.9975222 -0.7715919 0.8831056 0.997522 -0.7715762 0.8830811 0.9975217 -0.7715599 0.883052 0.9975213 -0.7715449 0.883018 0.9975209 -0.7715352 0.8829797 0.9975204 -0.7715376 0.8829386 0.9975199 -0.7715641 0.8828986 0.9975194 -0.7716352 0.8828672 0.9975191 -0.7717834 0.8828571 0.9975189 -0.7719959 0.8828571 0.9975189 -0.7722648 0.8828571 0.9975189 -0.7726049 0.8828571 0.9975189 -0.7730352 0.8828571 0.9975189 -0.7735795 0.8828571 0.9975189 -0.7742682 0.8828571 0.9975189 -0.7751395 0.8828571 0.9975189 -0.7762418 0.8828571 0.9975189 -0.7776364 0.8828571 0.9975189 -0.7794007 0.8828571 0.9975189 -0.7816327 0.8828571 0.9975189 -0.7844566 0.8828571 0.9975189 -0.7880291 0.8828571 0.9975189 -0.7925488 0.8828571 0.9975189 -0.7982669 0.8828571 0.9975189 -0.8055009 0.8828571 0.9975189 -0.8146529 0.8828571 0.9975189 -0.8262314 0.8828571 0.9975189 -0.8408797 0.8828571 0.9975189 -0.8594117 0.8828571 0.9975189 -0.8828571 0.8828571 0.9975189 -0.9125186 0.8828571 0.9975189 -0.9500442 0.8828571 0.9975189 -0.9975189 0.8828571 0.9975189 -0.9980488 0.8842998 0.9589472 -0.9984638 0.892989 0.9412278 -0.9987895 0.9050819 0.9360606 -0.9990455 0.9181889 0.9379796 -0.999247 0.9309211 0.94351 -0.9994057 0.9425502 0.9505298 -0.9995308 0.952764 0.9578074 -0.9996295 0.9614985 0.9646787 -0.9997074 0.9688274 0.970829 -0.9997688 0.9748918 0.9761497 -0.9998174 0.979858 0.9806476 -0.9998557 0.9838928 0.984388 -0.999886 0.9871512 0.9874615 -0.9999099 0.9897703 0.9899646 -0.9999288 0.991868 0.9919896 -0.9999437 0.9935432 0.9936193 -0.7716588 0.9127681 0.997523 -0.7716551 0.9127648 0.997523 -0.7716504 0.9127607 0.9975229 -0.7716446 0.9127555 0.9975228 -0.7716375 0.912749 0.9975227 -0.7716288 0.912741 0.9975226 -0.7716184 0.912731 0.9975224 -0.7716061 0.9127186 0.9975222 -0.7715919 0.9127036 0.997522 -0.7715762 0.9126854 0.9975217 -0.7715599 0.9126636 0.9975213 -0.7715449 0.9126384 0.9975209 -0.7715352 0.9126098 0.9975204 -0.7715376 0.9125792 0.9975199 -0.7715641 0.9125495 0.9975194 -0.7716352 0.912526 0.9975191 -0.7717834 0.9125186 0.9975189 -0.7719959 0.9125186 0.9975189 -0.7722648 0.9125186 0.9975189 -0.7726049 0.9125186 0.9975189 -0.7730352 0.9125186 0.9975189 -0.7735795 0.9125186 0.9975189 -0.7742682 0.9125186 0.9975189 -0.7751395 0.9125186 0.9975189 -0.7762418 0.9125186 0.9975189 -0.7776364 0.9125186 0.9975189 -0.7794007 0.9125186 0.9975189 -0.7816327 0.9125186 0.9975189 -0.7844566 0.9125186 0.9975189 -0.7880291 0.9125186 0.9975189 -0.7925488 0.9125186 0.9975189 -0.7982669 0.9125186 0.9975189 -0.8055009 0.9125186 0.9975189 -0.8146529 0.9125186 0.9975189 -0.8262314 0.9125186 0.9975189 -0.8408797 0.9125186 0.9975189 -0.8594117 0.9125186 0.9975189 -0.8828571 0.9125186 0.9975189 -0.9125186 0.9125186 0.9975189 -0.9500442 0.9125186 0.9975189 -0.9975189 0.9125186 0.9975189 -0.9980488 0.9036101 0.9589472 -0.9984638 0.9054678 0.9412278 -0.9987895 0.9130957 0.9360606 -0.9990455 0.9233085 0.9379796 -0.999247 0.9341777 0.94351 -0.9994057 0.9446144 0.9505298 -0.9995308 0.9540687 0.9578074 -0.9996295 0.9623212 0.9646787 -0.9997074 0.9693452 0.970829 -0.9997688 0.9752172 0.9761497 -0.9998174 0.9800622 0.9806476 -0.9998557 0.9840209 0.984388 -0.999886 0.9872315 0.9874615 -0.9999099 0.9898206 0.9899646 -0.9999288 0.9918994 0.9919896 -0.9999437 0.9935629 0.9936193 -0.7716588 0.9501853 0.997523 -0.7716551 0.9501835 0.997523 -0.7716504 0.9501811 0.9975229 -0.7716446 0.9501782 0.9975228 -0.7716375 0.9501745 0.9975227 -0.7716288 0.95017 0.9975226 -0.7716184 0.9501643 0.9975224 -0.7716061 0.9501574 0.9975222 -0.7715919 0.9501488 0.997522 -0.7715762 0.9501385 0.9975217 -0.7715599 0.9501262 0.9975213 -0.7715449 0.9501119 0.9975209 -0.7715352 0.9500958 0.9975204 -0.7715376 0.9500785 0.9975199 -0.7715641 0.9500617 0.9975194 -0.7716352 0.9500484 0.9975191 -0.7717834 0.9500442 0.9975189 -0.7719959 0.9500442 0.9975189 -0.7722648 0.9500442 0.9975189 -0.7726049 0.9500442 0.9975189 -0.7730352 0.9500442 0.9975189 -0.7735795 0.9500442 0.9975189 -0.7742682 0.9500442 0.9975189 -0.7751395 0.9500442 0.9975189 -0.7762418 0.9500442 0.9975189 -0.7776364 0.9500442 0.9975189 -0.7794007 0.9500442 0.9975189 -0.7816327 0.9500442 0.9975189 -0.7844566 0.9500442 0.9975189 -0.7880291 0.9500442 0.9975189 -0.7925488 0.9500442 0.9975189 -0.7982669 0.9500442 0.9975189 -0.8055009 0.9500442 0.9975189 -0.8146529 0.9500442 0.9975189 -0.8262314 0.9500442 0.9975189 -0.8408797 0.9500442 0.9975189 -0.8594117 0.9500442 0.9975189 -0.8828571 0.9500442 0.9975189 -0.9125186 0.9500442 0.9975189 -0.9500442 0.9500442 0.9975189 -0.9975189 0.9500442 0.9975189 -0.9980488 0.9280401 0.9589472 -0.9984638 0.921255 0.9412278 -0.9987895 0.9232341 0.9360606 -0.9990455 0.9297854 0.9379796 -0.999247 0.9382977 0.94351 -0.9994057 0.9472259 0.9505298 -0.9995308 0.9557192 0.9578074 -0.9996295 0.963362 0.9646787 -0.9997074 0.9700002 0.970829 -0.9997688 0.9756289 0.9761497 -0.9998174 0.9803206 0.9806476 -0.9998557 0.9841829 0.984388 -0.999886 0.987333 0.9874615 -0.9999099 0.9898842 0.9899646 -0.9999288 0.9919392 0.9919896 -0.9999437 0.9935878 0.9936193 -0.7716588 0.997523 0.997523 -0.7716551 0.997523 0.997523 -0.7716504 0.9975229 0.9975229 -0.7716446 0.9975228 0.9975228 -0.7716375 0.9975227 0.9975227 -0.7716288 0.9975226 0.9975226 -0.7716184 0.9975224 0.9975224 -0.7716061 0.9975222 0.9975222 -0.7715919 0.997522 0.997522 -0.7715762 0.9975217 0.9975217 -0.7715599 0.9975213 0.9975213 -0.7715449 0.9975209 0.9975209 -0.7715352 0.9975204 0.9975204 -0.7715376 0.9975199 0.9975199 -0.7715641 0.9975194 0.9975194 -0.7716352 0.9975191 0.9975191 -0.7717834 0.9975189 0.9975189 -0.7719959 0.9975189 0.9975189 -0.7722648 0.9975189 0.9975189 -0.7726049 0.9975189 0.9975189 -0.7730352 0.9975189 0.9975189 -0.7735795 0.9975189 0.9975189 -0.7742682 0.9975189 0.9975189 -0.7751395 0.9975189 0.9975189 -0.7762418 0.9975189 0.9975189 -0.7776364 0.9975189 0.9975189 -0.7794007 0.9975189 0.9975189 -0.7816327 0.9975189 0.9975189 -0.7844566 0.9975189 0.9975189 -0.7880291 0.9975189 0.9975189 -0.7925488 0.9975189 0.9975189 -0.7982669 0.9975189 0.9975189 -0.8055009 0.9975189 0.9975189 -0.8146529 0.9975189 0.9975189 -0.8262314 0.9975189 0.9975189 -0.8408797 0.9975189 0.9975189 -0.8594117 0.9975189 0.9975189 -0.8828571 0.9975189 0.9975189 -0.9125186 0.9975189 0.9975189 -0.9500442 0.9975189 0.9975189 -0.9975189 0.9975189 0.9975189 -0.9980488 0.9589472 0.9589472 -0.9984638 0.9412278 0.9412278 -0.9987895 0.9360606 0.9360606 -0.9990455 0.9379796 0.9379796 -0.999247 0.94351 0.94351 -0.9994057 0.9505298 0.9505298 -0.9995308 0.9578074 0.9578074 -0.9996295 0.9646787 0.9646787 -0.9997074 0.970829 0.970829 -0.9997688 0.9761497 0.9761497 -0.9998174 0.9806476 0.9806476 -0.9998557 0.984388 0.984388 -0.999886 0.9874615 0.9874615 -0.9999099 0.9899646 0.9899646 -0.9999288 0.9919896 0.9919896 -0.9999437 0.9936193 0.9936193 -0.8119154 0.9980513 0.9590407 -0.8119128 0.9980512 0.9590395 -0.8119096 0.9980512 0.9590379 -0.8119057 0.9980511 0.959036 -0.8119009 0.9980511 0.9590336 -0.8118949 0.998051 0.9590305 -0.8118878 0.9980509 0.9590268 -0.8118794 0.9980508 0.9590222 -0.8118697 0.9980506 0.9590165 -0.8118589 0.9980504 0.9590097 -0.8118476 0.9980502 0.9590016 -0.811837 0.99805 0.9589921 -0.8118298 0.9980497 0.9589814 -0.8118303 0.9980494 0.9589699 -0.8118466 0.9980491 0.9589588 -0.8118921 0.9980488 0.95895 -0.8119884 0.9980488 0.9589472 -0.8121268 0.9980488 0.9589472 -0.8123018 0.9980488 0.9589472 -0.8125232 0.9980488 0.9589472 -0.8128033 0.9980488 0.9589472 -0.8131577 0.9980488 0.9589472 -0.8136061 0.9980488 0.9589472 -0.8141733 0.9980488 0.9589472 -0.8148909 0.9980488 0.9589472 -0.8157988 0.9980488 0.9589472 -0.8169474 0.9980488 0.9589472 -0.8184005 0.9980488 0.9589472 -0.8202389 0.9980488 0.9589472 -0.8225647 0.9980488 0.9589472 -0.8255071 0.9980488 0.9589472 -0.8292297 0.9980488 0.9589472 -0.8339392 0.9980488 0.9589472 -0.8398974 0.9980488 0.9589472 -0.8474353 0.9980488 0.9589472 -0.8569716 0.9980488 0.9589472 -0.8690364 0.9980488 0.9589472 -0.8842998 0.9980488 0.9589472 -0.9036101 0.9980488 0.9589472 -0.9280401 0.9980488 0.9589472 -0.9589472 0.9980488 0.9589472 -0.9980488 0.9980488 0.9589472 -0.9984638 0.9664961 0.9412278 -0.9987895 0.9522877 0.9360606 -0.9990455 0.9483463 0.9379796 -0.999247 0.9501042 0.94351 -0.9994057 0.9547096 0.9505298 -0.9995308 0.9604492 0.9578074 -0.9996295 0.9663445 0.9646787 -0.9997074 0.9718774 0.970829 -0.9997688 0.9768086 0.9761497 -0.9998174 0.9810611 0.9806476 -0.9998557 0.9846473 0.984388 -0.999886 0.987624 0.9874615 -0.9999099 0.9900664 0.9899646 -0.9999288 0.9920533 0.9919896 -0.9999437 0.9936592 0.9936193 -0.8462171 0.9984653 0.9413364 -0.8462154 0.9984653 0.9413349 -0.8462132 0.9984653 0.9413331 -0.8462106 0.9984653 0.9413309 -0.8462073 0.9984652 0.9413281 -0.8462034 0.9984652 0.9413245 -0.8461986 0.9984651 0.9413202 -0.8461929 0.998465 0.9413148 -0.8461864 0.9984649 0.9413083 -0.8461791 0.9984648 0.9413004 -0.8461714 0.9984647 0.9412909 -0.8461641 0.9984645 0.9412799 -0.8461589 0.9984643 0.9412675 -0.8461587 0.9984642 0.9412542 -0.8461687 0.998464 0.9412413 -0.8461977 0.9984638 0.9412311 -0.8462598 0.9984638 0.9412278 -0.8463492 0.9984638 0.9412278 -0.8464623 0.9984638 0.9412278 -0.8466054 0.9984638 0.9412278 -0.8467864 0.9984638 0.9412278 -0.8470154 0.9984638 0.9412278 -0.8473052 0.9984638 0.9412278 -0.8476717 0.9984638 0.9412278 -0.8481355 0.9984638 0.9412278 -0.8487222 0.9984638 0.9412278 -0.8494644 0.9984638 0.9412278 -0.8504035 0.9984638 0.9412278 -0.8515915 0.9984638 0.9412278 -0.8530945 0.9984638 0.9412278 -0.8549959 0.9984638 0.9412278 -0.8574015 0.9984638 0.9412278 -0.8604449 0.9984638 0.9412278 -0.8642952 0.9984638 0.9412278 -0.8691663 0.9984638 0.9412278 -0.875329 0.9984638 0.9412278 -0.8831255 0.9984638 0.9412278 -0.892989 0.9984638 0.9412278 -0.9054678 0.9984638 0.9412278 -0.921255 0.9984638 0.9412278 -0.9412278 0.9984638 0.9412278 -0.9664961 0.9984638 0.9412278 -0.9984638 0.9984638 0.9412278 -0.9987895 0.9728171 0.9360606 -0.9990455 0.9614615 0.9379796 -0.999247 0.9584468 0.94351 -0.9994057 0.9599976 0.9505298 -0.9995308 0.9637914 0.9578074 -0.9996295 0.968452 0.9646787 -0.9997074 0.9732039 0.970829 -0.9997688 0.9776422 0.9761497 -0.9998174 0.9815844 0.9806476 -0.9998557 0.9849754 0.984388 -0.999886 0.9878296 0.9874615 -0.9999099 0.9901951 0.9899646 -0.9999288 0.9921339 0.9919896 -0.9999437 0.9937096 0.9936193 -0.8750477 0.9987905 0.9361554 -0.8750466 0.9987905 0.9361542 -0.8750451 0.9987904 0.9361526 -0.8750434 0.9987904 0.9361506 -0.8750412 0.9987904 0.9361482 -0.8750386 0.9987904 0.9361451 -0.8750355 0.9987903 0.9361413 -0.8750317 0.9987903 0.9361366 -0.8750274 0.9987902 0.9361309 -0.8750225 0.9987902 0.936124 -0.8750173 0.9987901 0.9361157 -0.8750124 0.99879 0.9361061 -0.8750088 0.9987899 0.9360952 -0.8750084 0.9987897 0.9360836 -0.8750145 0.9987896 0.9360723 -0.8750329 0.9987895 0.9360634 -0.8750727 0.9987895 0.9360606 -0.8751301 0.9987895 0.9360606 -0.8752028 0.9987895 0.9360606 -0.8752947 0.9987895 0.9360606 -0.8754109 0.9987895 0.9360606 -0.875558 0.9987895 0.9360606 -0.8757441 0.9987895 0.9360606 -0.8759795 0.9987895 0.9360606 -0.8762773 0.9987895 0.9360606 -0.8766541 0.9987895 0.9360606 -0.8771307 0.9987895 0.9360606 -0.8777338 0.9987895 0.9360606 -0.8784967 0.9987895 0.9360606 -0.8794619 0.9987895 0.9360606 -0.880683 0.9987895 0.9360606 -0.8822279 0.9987895 0.9360606 -0.8841823 0.9987895 0.9360606 -0.886655 0.9987895 0.9360606 -0.8897832 0.9987895 0.9360606 -0.8937407 0.9987895 0.9360606 -0.8987476 0.9987895 0.9360606 -0.9050819 0.9987895 0.9360606 -0.9130957 0.9987895 0.9360606 -0.9232341 0.9987895 0.9360606 -0.9360606 0.9987895 0.9360606 -0.9522877 0.9987895 0.9360606 -0.9728171 0.9987895 0.9360606 -0.9987895 0.9987895 0.9360606 -0.9990455 0.9780539 0.9379796 -0.999247 0.9690013 0.94351 -0.9994057 0.9666876 0.9505298 -0.9995308 0.9680197 0.9578074 -0.9996295 0.9711183 0.9646787 -0.9997074 0.974882 0.970829 -0.9997688 0.9786968 0.9761497 -0.9998174 0.9822464 0.9806476 -0.9998557 0.9853905 0.984388 -0.999886 0.9880897 0.9874615 -0.9999099 0.990358 0.9899646 -0.9999288 0.9922358 0.9919896 -0.9999437 0.9937734 0.9936193 -0.8990028 0.9990461 0.9380532 -0.899002 0.9990461 0.9380522 -0.8990011 0.9990461 0.938051 -0.899 0.9990461 0.9380495 -0.8989986 0.9990461 0.9380476 -0.8989969 0.9990461 0.9380452 -0.8989948 0.9990461 0.9380422 -0.8989923 0.999046 0.9380386 -0.8989895 0.999046 0.9380342 -0.8989863 0.9990459 0.9380288 -0.8989829 0.9990459 0.9380224 -0.8989796 0.9990458 0.9380149 -0.8989771 0.9990458 0.9380065 -0.8989767 0.9990457 0.9379975 -0.8989805 0.9990456 0.9379887 -0.8989921 0.9990456 0.9379818 -0.8990175 0.9990455 0.9379796 -0.8990542 0.9990455 0.9379796 -0.8991006 0.9990455 0.9379796 -0.8991593 0.9990455 0.9379796 -0.8992336 0.9990455 0.9379796 -0.8993275 0.9990455 0.9379796 -0.8994464 0.9990455 0.9379796 -0.8995968 0.9990455 0.9379796 -0.899787 0.9990455 0.9379796 -0.9000277 0.9990455 0.9379796 -0.9003323 0.9990455 0.9379796 -0.9007175 0.9990455 0.9379796 -0.9012049 0.9990455 0.9379796 -0.9018215 0.9990455 0.9379796 -0.9026016 0.9990455 0.9379796 -0.9035886 0.9990455 0.9379796 -0.9048372 0.9990455 0.9379796 -0.9064168 0.9990455 0.9379796 -0.9084153 0.9990455 0.9379796 -0.9109436 0.9990455 0.9379796 -0.9141422 0.9990455 0.9379796 -0.9181889 0.9990455 0.9379796 -0.9233085 0.9990455 0.9379796 -0.9297854 0.9990455 0.9379796 -0.9379796 0.9990455 0.9379796 -0.9483463 0.9990455 0.9379796 -0.9614615 0.9990455 0.9379796 -0.9780539 0.9990455 0.9379796 -0.9990455 0.9990455 0.9379796 -0.999247 0.982354 0.94351 -0.9994057 0.9751513 0.9505298 -0.9995308 0.9733691 0.9578074 -0.9996295 0.9744915 0.9646787 -0.9997074 0.977005 0.970829 -0.9997688 0.980031 0.9761497 -0.9998174 0.9830838 0.9806476 -0.9998557 0.9859157 0.984388 -0.999886 0.9884188 0.9874615 -0.9999099 0.9905641 0.9899646 -0.9999288 0.9923648 0.9919896 -0.9999437 0.9938541 0.9936193 -0.9187175 0.9992474 0.9435635 -0.918717 0.9992474 0.9435628 -0.9187164 0.9992474 0.9435619 -0.9187157 0.9992474 0.9435608 -0.9187148 0.9992474 0.9435594 -0.9187137 0.9992474 0.9435577 -0.9187123 0.9992473 0.9435555 -0.9187107 0.9992473 0.9435529 -0.9187089 0.9992473 0.9435497 -0.9187068 0.9992473 0.9435457 -0.9187045 0.9992472 0.9435411 -0.9187024 0.9992472 0.9435357 -0.9187008 0.9992472 0.9435295 -0.9187004 0.9992471 0.943523 -0.9187027 0.9992471 0.9435166 -0.9187101 0.999247 0.9435116 -0.9187262 0.999247 0.94351 -0.9187495 0.999247 0.94351 -0.9187791 0.999247 0.94351 -0.9188164 0.999247 0.94351 -0.9188636 0.999247 0.94351 -0.9189234 0.999247 0.94351 -0.918999 0.999247 0.94351 -0.9190947 0.999247 0.94351 -0.9192157 0.999247 0.94351 -0.9193688 0.999247 0.94351 -0.9195625 0.999247 0.94351 -0.9198076 0.999247 0.94351 -0.9201176 0.999247 0.94351 -0.9205098 0.999247 0.94351 -0.9210061 0.999247 0.94351 -0.9216339 0.999247 0.94351 -0.9224281 0.999247 0.94351 -0.9234329 0.999247 0.94351 -0.9247041 0.999247 0.94351 -0.9263124 0.999247 0.94351 -0.928347 0.999247 0.94351 -0.9309211 0.999247 0.94351 -0.9341777 0.999247 0.94351 -0.9382977 0.999247 0.94351 -0.94351 0.999247 0.94351 -0.9501042 0.999247 0.94351 -0.9584468 0.999247 0.94351 -0.9690013 0.999247 0.94351 -0.982354 0.999247 0.94351 -0.999247 0.999247 0.94351 -0.9994057 0.9858591 0.9505298 -0.9995308 0.9801368 0.9578074 -0.9996295 0.978759 0.9646787 -0.9997074 0.9796909 0.970829 -0.9997688 0.981719 0.9761497 -0.9998174 0.9841433 0.9806476 -0.9998557 0.9865801 0.984388 -0.999886 0.9888351 0.9874615 -0.9999099 0.9908248 0.9899646 -0.9999288 0.992528 0.9919896 -0.9999437 0.9939562 0.9936193 -0.9348153 0.999406 0.9505671 -0.9348149 0.999406 0.9505666 -0.9348146 0.999406 0.950566 -0.9348141 0.999406 0.9505652 -0.9348135 0.999406 0.9505643 -0.9348128 0.9994059 0.9505631 -0.9348119 0.9994059 0.9505616 -0.9348109 0.9994059 0.9505597 -0.9348097 0.9994059 0.9505575 -0.9348083 0.9994059 0.9505547 -0.9348069 0.9994059 0.9505515 -0.9348055 0.9994059 0.9505477 -0.9348044 0.9994058 0.9505434 -0.9348042 0.9994058 0.9505389 -0.9348056 0.9994058 0.9505344 -0.9348102 0.9994057 0.9505309 -0.9348204 0.9994057 0.9505298 -0.9348352 0.9994057 0.9505298 -0.9348539 0.9994057 0.9505298 -0.9348776 0.9994057 0.9505298 -0.9349075 0.9994057 0.9505298 -0.9349454 0.9994057 0.9505298 -0.9349933 0.9994057 0.9505298 -0.935054 0.9994057 0.9505298 -0.9351307 0.9994057 0.9505298 -0.9352277 0.9994057 0.9505298 -0.9353505 0.9994057 0.9505298 -0.9355059 0.9994057 0.9505298 -0.9357024 0.9994057 0.9505298 -0.935951 0.9994057 0.9505298 -0.9362655 0.9994057 0.9505298 -0.9366635 0.9994057 0.9505298 -0.9371669 0.9994057 0.9505298 -0.9378038 0.9994057 0.9505298 -0.9386096 0.9994057 0.9505298 -0.939629 0.9994057 0.9505298 -0.9409186 0.9994057 0.9505298 -0.9425502 0.9994057 0.9505298 -0.9446144 0.9994057 0.9505298 -0.9472259 0.9994057 0.9505298 -0.9505298 0.9994057 0.9505298 -0.9547096 0.9994057 0.9505298 -0.9599976 0.9994057 0.9505298 -0.9666876 0.9994057 0.9505298 -0.9751513 0.9994057 0.9505298 -0.9858591 0.9994057 0.9505298 -0.9994057 0.9994057 0.9505298 -0.9995308 0.9886988 0.9578074 -0.9996295 0.9841579 0.9646787 -0.9997074 0.983089 0.970829 -0.9997688 0.9838545 0.9761497 -0.9998174 0.9854838 0.9806476 -0.9998557 0.9874207 0.984388 -0.999886 0.9893618 0.9874615 -0.9999099 0.9911547 0.9899646 -0.9999288 0.9927345 0.9919896 -0.9999437 0.9940854 0.9936193 -0.9478754 0.999531 0.9578327 -0.9478752 0.999531 0.9578324 -0.947875 0.999531 0.957832 -0.9478746 0.999531 0.9578314 -0.9478743 0.999531 0.9578308 -0.9478738 0.999531 0.95783 -0.9478733 0.999531 0.9578289 -0.9478726 0.999531 0.9578277 -0.9478718 0.999531 0.9578262 -0.947871 0.9995309 0.9578243 -0.94787 0.9995309 0.9578221 -0.9478691 0.9995309 0.9578195 -0.9478684 0.9995309 0.9578166 -0.9478683 0.9995309 0.9578135 -0.9478691 0.9995309 0.9578105 -0.947872 0.9995309 0.9578081 -0.9478785 0.9995308 0.9578074 -0.9478878 0.9995308 0.9578074 -0.9478997 0.9995308 0.9578074 -0.9479146 0.9995308 0.9578074 -0.9479335 0.9995308 0.9578074 -0.9479575 0.9995308 0.9578074 -0.9479878 0.9995308 0.9578074 -0.9480261 0.9995308 0.9578074 -0.9480746 0.9995308 0.9578074 -0.9481359 0.9995308 0.9578074 -0.9482135 0.9995308 0.9578074 -0.9483117 0.9995308 0.9578074 -0.9484359 0.9995308 0.9578074 -0.9485931 0.9995308 0.9578074 -0.9487918 0.9995308 0.9578074 -0.9490434 0.9995308 0.9578074 -0.9493615 0.9995308 0.9578074 -0.9497641 0.9995308 0.9578074 -0.9502734 0.9995308 0.9578074 -0.9509177 0.9995308 0.9578074 -0.9517328 0.9995308 0.9578074 -0.952764 0.9995308 0.9578074 -0.9540687 0.9995308 0.9578074 -0.9557192 0.9995308 0.9578074 -0.9578074 0.9995308 0.9578074 -0.9604492 0.9995308 0.9578074 -0.9637914 0.9995308 0.9578074 -0.9680197 0.9995308 0.9578074 -0.9733691 0.9995308 0.9578074 -0.9801368 0.9995308 0.9578074 -0.9886988 0.9995308 0.9578074 -0.9995308 0.9995308 0.9578074 -0.9996295 0.9909882 0.9646787 -0.9997074 0.9873879 0.970829 -0.9997688 0.9865561 0.9761497 -0.9998174 0.9871796 0.9806476 -0.9998557 0.9884841 0.984388 -0.999886 0.9900282 0.9874615 -0.9999099 0.991572 0.9899646 -0.9999288 0.9929957 0.9919896 -0.9999437 0.9942488 0.9936193 -0.958416 0.9996296 0.9646955 -0.9584159 0.9996296 0.9646953 -0.9584157 0.9996296 0.964695 -0.9584155 0.9996296 0.9646947 -0.9584153 0.9996296 0.9646943 -0.958415 0.9996296 0.9646937 -0.9584146 0.9996296 0.964693 -0.9584142 0.9996296 0.9646922 -0.9584137 0.9996296 0.9646912 -0.9584132 0.9996296 0.96469 -0.9584126 0.9996296 0.9646885 -0.958412 0.9996296 0.9646868 -0.9584115 0.9996296 0.9646849 -0.9584114 0.9996295 0.9646828 -0.958412 0.9996295 0.9646808 -0.9584138 0.9996295 0.9646792 -0.9584178 0.9996295 0.9646787 -0.9584237 0.9996295 0.9646787 -0.9584312 0.9996295 0.9646787 -0.9584406 0.9996295 0.9646787 -0.9584526 0.9996295 0.9646787 -0.9584677 0.9996295 0.9646787 -0.9584868 0.9996295 0.9646787 -0.9585109 0.9996295 0.9646787 -0.9585415 0.9996295 0.9646787 -0.9585802 0.9996295 0.9646787 -0.9586291 0.9996295 0.9646787 -0.958691 0.9996295 0.9646787 -0.9587693 0.9996295 0.9646787 -0.9588684 0.9996295 0.9646787 -0.9589938 0.9996295 0.9646787 -0.9591524 0.9996295 0.9646787 -0.959353 0.9996295 0.9646787 -0.9596068 0.9996295 0.9646787 -0.959928 0.9996295 0.9646787 -0.9603343 0.9996295 0.9646787 -0.9608482 0.9996295 0.9646787 -0.9614985 0.9996295 0.9646787 -0.9623212 0.9996295 0.9646787 -0.963362 0.9996295 0.9646787 -0.9646787 0.9996295 0.9646787 -0.9663445 0.9996295 0.9646787 -0.968452 0.9996295 0.9646787 -0.9711183 0.9996295 0.9646787 -0.9744915 0.9996295 0.9646787 -0.978759 0.9996295 0.9646787 -0.9841579 0.9996295 0.9646787 -0.9909882 0.9996295 0.9646787 -0.9996295 0.9996295 0.9646787 -0.9997074 0.9928267 0.970829 -0.9997688 0.9899741 0.9761497 -0.9998174 0.989325 0.9806476 -0.9998557 0.9898295 0.984388 -0.999886 0.9908712 0.9874615 -0.9999099 0.9920999 0.9899646 -0.9999288 0.9933261 0.9919896 -0.9999437 0.9944556 0.9936193 -0.9668873 0.9997074 0.97084 -0.9668872 0.9997074 0.9708399 -0.9668871 0.9997074 0.9708397 -0.966887 0.9997074 0.9708394 -0.9668869 0.9997074 0.9708392 -0.9668867 0.9997074 0.9708388 -0.9668865 0.9997074 0.9708384 -0.9668862 0.9997074 0.9708378 -0.9668859 0.9997074 0.9708371 -0.9668855 0.9997074 0.9708363 -0.9668852 0.9997074 0.9708354 -0.9668848 0.9997074 0.9708343 -0.9668845 0.9997074 0.970833 -0.9668844 0.9997074 0.9708317 -0.9668847 0.9997074 0.9708303 -0.9668859 0.9997074 0.9708293 -0.9668884 0.9997074 0.970829 -0.9668922 0.9997074 0.970829 -0.9668969 0.9997074 0.970829 -0.9669028 0.9997074 0.970829 -0.9669103 0.9997074 0.970829 -0.9669198 0.9997074 0.970829 -0.9669318 0.9997074 0.970829 -0.966947 0.9997074 0.970829 -0.9669663 0.9997074 0.970829 -0.9669906 0.9997074 0.970829 -0.9670214 0.9997074 0.970829 -0.9670604 0.9997074 0.970829 -0.9671097 0.9997074 0.970829 -0.967172 0.9997074 0.970829 -0.9672509 0.9997074 0.970829 -0.9673508 0.9997074 0.970829 -0.967477 0.9997074 0.970829 -0.9676368 0.9997074 0.970829 -0.9678389 0.9997074 0.970829 -0.9680946 0.9997074 0.970829 -0.9684181 0.9997074 0.970829 -0.9688274 0.9997074 0.970829 -0.9693452 0.9997074 0.970829 -0.9700002 0.9997074 0.970829 -0.970829 0.9997074 0.970829 -0.9718774 0.9997074 0.970829 -0.9732039 0.9997074 0.970829 -0.974882 0.9997074 0.970829 -0.977005 0.9997074 0.970829 -0.9796909 0.9997074 0.970829 -0.983089 0.9997074 0.970829 -0.9873879 0.9997074 0.970829 -0.9928267 0.9997074 0.970829 -0.9997074 0.9997074 0.970829 -0.9997688 0.9942982 0.9761497 -0.9998174 0.9920392 0.9806476 -0.9998557 0.9915316 0.984388 -0.999886 0.9919377 0.9874615 -0.9999099 0.9927678 0.9899646 -0.9999288 0.9937442 0.9919896 -0.9999437 0.9947172 0.9936193 -0.9736726 0.9997689 0.9761569 -0.9736726 0.9997689 0.9761568 -0.9736725 0.9997689 0.9761567 -0.9736724 0.9997689 0.9761565 -0.9736723 0.9997689 0.9761563 -0.9736722 0.9997689 0.9761561 -0.9736721 0.9997689 0.9761558 -0.9736719 0.9997689 0.9761554 -0.9736717 0.9997689 0.976155 -0.9736715 0.9997689 0.9761545 -0.9736712 0.9997689 0.9761539 -0.973671 0.9997689 0.9761531 -0.9736708 0.9997689 0.9761523 -0.9736708 0.9997689 0.9761514 -0.973671 0.9997688 0.9761506 -0.9736717 0.9997688 0.9761499 -0.9736733 0.9997688 0.9761497 -0.9736756 0.9997688 0.9761497 -0.9736786 0.9997688 0.9761497 -0.9736823 0.9997688 0.9761497 -0.973687 0.9997688 0.9761497 -0.973693 0.9997688 0.9761497 -0.9737006 0.9997688 0.9761497 -0.9737101 0.9997688 0.9761497 -0.9737222 0.9997688 0.9761497 -0.9737375 0.9997688 0.9761497 -0.9737569 0.9997688 0.9761497 -0.9737814 0.9997688 0.9761497 -0.9738123 0.9997688 0.9761497 -0.9738515 0.9997688 0.9761497 -0.9739011 0.9997688 0.9761497 -0.9739638 0.9997688 0.9761497 -0.9740432 0.9997688 0.9761497 -0.9741436 0.9997688 0.9761497 -0.9742706 0.9997688 0.9761497 -0.9744313 0.9997688 0.9761497 -0.9746346 0.9997688 0.9761497 -0.9748918 0.9997688 0.9761497 -0.9752172 0.9997688 0.9761497 -0.9756289 0.9997688 0.9761497 -0.9761497 0.9997688 0.9761497 -0.9768086 0.9997688 0.9761497 -0.9776422 0.9997688 0.9761497 -0.9786968 0.9997688 0.9761497 -0.980031 0.9997688 0.9761497 -0.981719 0.9997688 0.9761497 -0.9838545 0.9997688 0.9761497 -0.9865561 0.9997688 0.9761497 -0.9899741 0.9997688 0.9761497 -0.9942982 0.9997688 0.9761497 -0.9997688 0.9997688 0.9761497 -0.9998174 0.9954731 0.9806476 -0.9998557 0.9936849 0.984388 -0.999886 0.993287 0.9874615 -0.9999099 0.9936128 0.9899646 -0.9999288 0.9942731 0.9919896 -0.9999437 0.9950481 0.9936193 -0.9790927 0.9998174 0.9806522 -0.9790927 0.9998174 0.9806521 -0.9790927 0.9998174 0.980652 -0.9790926 0.9998174 0.9806519 -0.9790925 0.9998174 0.9806518 -0.9790925 0.9998174 0.9806517 -0.9790924 0.9998174 0.9806515 -0.9790923 0.9998174 0.9806512 -0.9790921 0.9998174 0.980651 -0.979092 0.9998174 0.9806506 -0.9790919 0.9998174 0.9806502 -0.9790917 0.9998174 0.9806498 -0.9790916 0.9998174 0.9806492 -0.9790916 0.9998174 0.9806487 -0.9790917 0.9998174 0.9806481 -0.9790921 0.9998174 0.9806477 -0.9790931 0.9998174 0.9806476 -0.9790946 0.9998174 0.9806476 -0.9790965 0.9998174 0.9806476 -0.9790988 0.9998174 0.9806476 -0.9791018 0.9998174 0.9806476 -0.9791055 0.9998174 0.9806476 -0.9791103 0.9998174 0.9806476 -0.9791163 0.9998174 0.9806476 -0.9791238 0.9998174 0.9806476 -0.9791334 0.9998174 0.9806476 -0.9791456 0.9998174 0.9806476 -0.979161 0.9998174 0.9806476 -0.9791804 0.9998174 0.9806476 -0.979205 0.9998174 0.9806476 -0.9792361 0.9998174 0.9806476 -0.9792755 0.9998174 0.9806476 -0.9793253 0.9998174 0.9806476 -0.9793883 0.9998174 0.9806476 -0.9794681 0.9998174 0.9806476 -0.9795689 0.9998174 0.9806476 -0.9796966 0.9998174 0.9806476 -0.979858 0.9998174 0.9806476 -0.9800622 0.9998174 0.9806476 -0.9803206 0.9998174 0.9806476 -0.9806476 0.9998174 0.9806476 -0.9810611 0.9998174 0.9806476 -0.9815844 0.9998174 0.9806476 -0.9822464 0.9998174 0.9806476 -0.9830838 0.9998174 0.9806476 -0.9841433 0.9998174 0.9806476 -0.9854838 0.9998174 0.9806476 -0.9871796 0.9998174 0.9806476 -0.989325 0.9998174 0.9806476 -0.9920392 0.9998174 0.9806476 -0.9954731 0.9998174 0.9806476 -0.9998174 0.9998174 0.9806476 -0.9998557 0.9964092 0.984388 -0.999886 0.9949941 0.9874615 -0.9999099 0.9946818 0.9899646 -0.9999288 0.9949422 0.9919896 -0.9999437 0.9954668 0.9936193 -0.9834129 0.9998557 0.9843909 -0.9834129 0.9998557 0.9843909 -0.9834129 0.9998557 0.9843908 -0.9834129 0.9998557 0.9843907 -0.9834128 0.9998557 0.9843907 -0.9834128 0.9998557 0.9843906 -0.9834127 0.9998557 0.9843905 -0.9834127 0.9998557 0.9843903 -0.9834126 0.9998557 0.9843901 -0.9834125 0.9998557 0.9843899 -0.9834124 0.9998557 0.9843897 -0.9834123 0.9998557 0.9843894 -0.9834122 0.9998557 0.984389 -0.9834122 0.9998557 0.9843887 -0.9834123 0.9998557 0.9843883 -0.9834126 0.9998557 0.984388 -0.9834132 0.9998557 0.984388 -0.9834141 0.9998557 0.984388 -0.9834153 0.9998557 0.984388 -0.9834167 0.9998557 0.984388 -0.9834186 0.9998557 0.984388 -0.9834209 0.9998557 0.984388 -0.9834239 0.9998557 0.984388 -0.9834277 0.9998557 0.984388 -0.9834324 0.9998557 0.984388 -0.9834385 0.9998557 0.984388 -0.9834461 0.9998557 0.984388 -0.9834557 0.9998557 0.984388 -0.9834679 0.9998557 0.984388 -0.9834833 0.9998557 0.984388 -0.9835029 0.9998557 0.984388 -0.9835276 0.9998557 0.984388 -0.9835588 0.9998557 0.984388 -0.9835983 0.9998557 0.984388 -0.9836483 0.9998557 0.984388 -0.9837116 0.9998557 0.984388 -0.9837916 0.9998557 0.984388 -0.9838928 0.9998557 0.984388 -0.9840209 0.9998557 0.984388 -0.9841829 0.9998557 0.984388 -0.984388 0.9998557 0.984388 -0.9846473 0.9998557 0.984388 -0.9849754 0.9998557 0.984388 -0.9853905 0.9998557 0.984388 -0.9859157 0.9998557 0.984388 -0.9865801 0.9998557 0.984388 -0.9874207 0.9998557 0.984388 -0.9884841 0.9998557 0.984388 -0.9898295 0.9998557 0.984388 -0.9915316 0.9998557 0.984388 -0.9936849 0.9998557 0.984388 -0.9964092 0.9998557 0.984388 -0.9998557 0.9998557 0.984388 -0.999886 0.9971537 0.9874615 -0.9999099 0.9960342 0.9899646 -0.9999288 0.9957887 0.9919896 -0.9999437 0.9959964 0.9936193 -0.9868505 0.999886 0.9874633 -0.9868505 0.999886 0.9874633 -0.9868505 0.999886 0.9874633 -0.9868505 0.999886 0.9874632 -0.9868504 0.999886 0.9874632 -0.9868504 0.999886 0.9874631 -0.9868504 0.999886 0.9874631 -0.9868503 0.999886 0.987463 -0.9868503 0.999886 0.9874628 -0.9868502 0.999886 0.9874627 -0.9868502 0.999886 0.9874625 -0.9868501 0.999886 0.9874624 -0.9868501 0.999886 0.9874621 -0.98685 0.999886 0.9874619 -0.9868501 0.999886 0.9874617 -0.9868503 0.999886 0.9874615 -0.9868507 0.999886 0.9874615 -0.9868512 0.999886 0.9874615 -0.986852 0.999886 0.9874615 -0.9868529 0.999886 0.9874615 -0.9868541 0.999886 0.9874615 -0.9868555 0.999886 0.9874615 -0.9868574 0.999886 0.9874615 -0.9868597 0.999886 0.9874615 -0.9868627 0.999886 0.9874615 -0.9868665 0.999886 0.9874615 -0.9868713 0.999886 0.9874615 -0.9868773 0.999886 0.9874615 -0.986885 0.999886 0.9874615 -0.9868946 0.999886 0.9874615 -0.9869069 0.999886 0.9874615 -0.9869223 0.999886 0.9874615 -0.9869419 0.999886 0.9874615 -0.9869667 0.999886 0.9874615 -0.986998 0.999886 0.9874615 -0.9870376 0.999886 0.9874615 -0.9870878 0.999886 0.9874615 -0.9871512 0.999886 0.9874615 -0.9872315 0.999886 0.9874615 -0.987333 0.999886 0.9874615 -0.9874615 0.999886 0.9874615 -0.987624 0.999886 0.9874615 -0.9878296 0.999886 0.9874615 -0.9880897 0.999886 0.9874615 -0.9884188 0.999886 0.9874615 -0.9888351 0.999886 0.9874615 -0.9893618 0.999886 0.9874615 -0.9900282 0.999886 0.9874615 -0.9908712 0.999886 0.9874615 -0.9919377 0.999886 0.9874615 -0.993287 0.999886 0.9874615 -0.9949941 0.999886 0.9874615 -0.9971537 0.999886 0.9874615 -0.999886 0.999886 0.9874615 -0.9999099 0.9977452 0.9899646 -0.9999288 0.9968597 0.9919896 -0.9999437 0.9966665 0.9936193 -0.989582 0.9999099 0.9899658 -0.989582 0.9999099 0.9899658 -0.989582 0.9999099 0.9899658 -0.989582 0.9999099 0.9899657 -0.989582 0.9999099 0.9899657 -0.9895819 0.9999099 0.9899657 -0.9895819 0.9999099 0.9899656 -0.9895819 0.9999099 0.9899656 -0.9895819 0.9999099 0.9899655 -0.9895818 0.9999099 0.9899654 -0.9895818 0.9999099 0.9899653 -0.9895818 0.9999099 0.9899652 -0.9895817 0.9999099 0.989965 -0.9895817 0.9999099 0.9899649 -0.9895817 0.9999099 0.9899648 -0.9895819 0.9999099 0.9899646 -0.9895821 0.9999099 0.9899646 -0.9895825 0.9999099 0.9899646 -0.9895829 0.9999099 0.9899646 -0.9895835 0.9999099 0.9899646 -0.9895842 0.9999099 0.9899646 -0.9895851 0.9999099 0.9899646 -0.9895863 0.9999099 0.9899646 -0.9895878 0.9999099 0.9899646 -0.9895897 0.9999099 0.9899646 -0.989592 0.9999099 0.9899646 -0.989595 0.9999099 0.9899646 -0.9895988 0.9999099 0.9899646 -0.9896036 0.9999099 0.9899646 -0.9896096 0.9999099 0.9899646 -0.9896173 0.9999099 0.9899646 -0.989627 0.9999099 0.9899646 -0.9896392 0.9999099 0.9899646 -0.9896547 0.9999099 0.9899646 -0.9896744 0.9999099 0.9899646 -0.9896992 0.9999099 0.9899646 -0.9897306 0.9999099 0.9899646 -0.9897703 0.9999099 0.9899646 -0.9898206 0.9999099 0.9899646 -0.9898842 0.9999099 0.9899646 -0.9899646 0.9999099 0.9899646 -0.9900664 0.9999099 0.9899646 -0.9901951 0.9999099 0.9899646 -0.990358 0.9999099 0.9899646 -0.9905641 0.9999099 0.9899646 -0.9908248 0.9999099 0.9899646 -0.9911547 0.9999099 0.9899646 -0.991572 0.9999099 0.9899646 -0.9920999 0.9999099 0.9899646 -0.9927678 0.9999099 0.9899646 -0.9936128 0.9999099 0.9899646 -0.9946818 0.9999099 0.9899646 -0.9960342 0.9999099 0.9899646 -0.9977452 0.9999099 0.9899646 -0.9999099 0.9999099 0.9899646 -0.9999288 0.9982146 0.9919896 -0.9999437 0.9975143 0.9936193 -0.9917501 0.9999288 0.9919903 -0.9917501 0.9999288 0.9919903 -0.9917501 0.9999288 0.9919903 -0.9917501 0.9999288 0.9919903 -0.9917501 0.9999288 0.9919903 -0.9917501 0.9999288 0.9919902 -0.99175 0.9999288 0.9919902 -0.99175 0.9999288 0.9919902 -0.99175 0.9999288 0.9919901 -0.99175 0.9999288 0.9919901 -0.99175 0.9999288 0.99199 -0.9917499 0.9999288 0.9919899 -0.9917499 0.9999288 0.9919898 -0.9917499 0.9999288 0.9919898 -0.9917499 0.9999288 0.9919897 -0.99175 0.9999288 0.9919896 -0.9917502 0.9999288 0.9919896 -0.9917504 0.9999288 0.9919896 -0.9917507 0.9999288 0.9919896 -0.991751 0.9999288 0.9919896 -0.9917515 0.9999288 0.9919896 -0.9917521 0.9999288 0.9919896 -0.9917528 0.9999288 0.9919896 -0.9917537 0.9999288 0.9919896 -0.9917549 0.9999288 0.9919896 -0.9917564 0.9999288 0.9919896 -0.9917582 0.9999288 0.9919896 -0.9917606 0.9999288 0.9919896 -0.9917636 0.9999288 0.9919896 -0.9917674 0.9999288 0.9919896 -0.9917722 0.9999288 0.9919896 -0.9917782 0.9999288 0.9919896 -0.9917859 0.9999288 0.9919896 -0.9917956 0.9999288 0.9919896 -0.9918079 0.9999288 0.9919896 -0.9918234 0.9999288 0.9919896 -0.9918431 0.9999288 0.9919896 -0.991868 0.9999288 0.9919896 -0.9918994 0.9999288 0.9919896 -0.9919392 0.9999288 0.9919896 -0.9919896 0.9999288 0.9919896 -0.9920533 0.9999288 0.9919896 -0.9921339 0.9999288 0.9919896 -0.9922358 0.9999288 0.9919896 -0.9923648 0.9999288 0.9919896 -0.992528 0.9999288 0.9919896 -0.9927345 0.9999288 0.9919896 -0.9929957 0.9999288 0.9919896 -0.9933261 0.9999288 0.9919896 -0.9937442 0.9999288 0.9919896 -0.9942731 0.9999288 0.9919896 -0.9949422 0.9999288 0.9919896 -0.9957887 0.9999288 0.9919896 -0.9968597 0.9999288 0.9919896 -0.9982146 0.9999288 0.9919896 -0.9999288 0.9999288 0.9919896 -0.9999437 0.9985868 0.9936193 -0.9934695 0.9999437 0.9936198 -0.9934695 0.9999437 0.9936198 -0.9934695 0.9999437 0.9936198 -0.9934695 0.9999437 0.9936198 -0.9934695 0.9999437 0.9936198 -0.9934695 0.9999437 0.9936197 -0.9934695 0.9999437 0.9936197 -0.9934694 0.9999437 0.9936197 -0.9934694 0.9999437 0.9936197 -0.9934694 0.9999437 0.9936196 -0.9934694 0.9999437 0.9936196 -0.9934694 0.9999437 0.9936196 -0.9934694 0.9999437 0.9936195 -0.9934694 0.9999437 0.9936194 -0.9934694 0.9999437 0.9936194 -0.9934694 0.9999437 0.9936193 -0.9934695 0.9999437 0.9936193 -0.9934697 0.9999437 0.9936193 -0.9934698 0.9999437 0.9936193 -0.9934701 0.9999437 0.9936193 -0.9934704 0.9999437 0.9936193 -0.9934707 0.9999437 0.9936193 -0.9934712 0.9999437 0.9936193 -0.9934718 0.9999437 0.9936193 -0.9934725 0.9999437 0.9936193 -0.9934734 0.9999437 0.9936193 -0.9934746 0.9999437 0.9936193 -0.9934761 0.9999437 0.9936193 -0.9934779 0.9999437 0.9936193 -0.9934803 0.9999437 0.9936193 -0.9934833 0.9999437 0.9936193 -0.9934871 0.9999437 0.9936193 -0.9934919 0.9999437 0.9936193 -0.993498 0.9999437 0.9936193 -0.9935057 0.9999437 0.9936193 -0.9935154 0.9999437 0.9936193 -0.9935277 0.9999437 0.9936193 -0.9935432 0.9999437 0.9936193 -0.9935629 0.9999437 0.9936193 -0.9935878 0.9999437 0.9936193 -0.9936193 0.9999437 0.9936193 -0.9936592 0.9999437 0.9936193 -0.9937096 0.9999437 0.9936193 -0.9937734 0.9999437 0.9936193 -0.9938541 0.9999437 0.9936193 -0.9939562 0.9999437 0.9936193 -0.9940854 0.9999437 0.9936193 -0.9942488 0.9999437 0.9936193 -0.9944556 0.9999437 0.9936193 -0.9947172 0.9999437 0.9936193 -0.9950481 0.9999437 0.9936193 -0.9954668 0.9999437 0.9936193 -0.9959964 0.9999437 0.9936193 -0.9966665 0.9999437 0.9936193 -0.9975143 0.9999437 0.9936193 -0.9985868 0.9999437 0.9936193 -0.9999437 0.9999437 0.9936193 -0.8119154 0.8119154 0.9980513 -0.8119186 0.8119154 0.9980513 -0.8119226 0.8119154 0.9980513 -0.8119278 0.8119154 0.9980513 -0.8119343 0.8119154 0.9980513 -0.8119425 0.8119154 0.9980513 -0.8119529 0.8119154 0.9980513 -0.811966 0.8119154 0.9980513 -0.8119826 0.8119154 0.9980513 -0.8120036 0.8119154 0.9980513 -0.8120303 0.8119154 0.9980513 -0.8120639 0.8119154 0.9980513 -0.8121065 0.8119154 0.9980513 -0.8121604 0.8119154 0.9980513 -0.8122285 0.8119154 0.9980513 -0.8123148 0.8119154 0.9980513 -0.8124239 0.8119154 0.9980513 -0.8125619 0.8119154 0.9980513 -0.8127365 0.8119154 0.9980513 -0.8129574 0.8119154 0.9980513 -0.8132369 0.8119154 0.9980513 -0.8135904 0.8119154 0.9980513 -0.8140378 0.8119154 0.9980513 -0.8146037 0.8119154 0.9980513 -0.8153196 0.8119154 0.9980513 -0.8162254 0.8119154 0.9980513 -0.8173713 0.8119154 0.9980513 -0.8188211 0.8119154 0.9980513 -0.8206552 0.8119154 0.9980513 -0.8229756 0.8119154 0.9980513 -0.8259111 0.8119154 0.9980513 -0.829625 0.8119154 0.9980513 -0.8343236 0.8119154 0.9980513 -0.8402679 0.8119154 0.9980513 -0.8477882 0.8119154 0.9980513 -0.8573024 0.8119154 0.9980513 -0.8693391 0.8119154 0.9980513 -0.884567 0.8119154 0.9980513 -0.9038323 0.8119154 0.9980513 -0.9282055 0.8119154 0.9980513 -0.9590407 0.8119154 0.9980513 -0.9980513 0.8119154 0.9980513 -0.9984653 0.8462171 0.9665574 -0.9987905 0.8750477 0.9523583 -0.9990461 0.8990028 0.9484075 -0.9992474 0.9187175 0.9501515 -0.999406 0.9348153 0.9547438 -0.999531 0.9478754 0.9604729 -0.9996296 0.958416 0.9663606 -0.9997074 0.9668873 0.9718881 -0.9997689 0.9736726 0.9768156 -0.9998174 0.9790927 0.9810656 -0.9998557 0.9834129 0.9846502 -0.999886 0.9868505 0.9876258 -0.9999099 0.989582 0.9900676 -0.9999288 0.9917501 0.992054 -0.9999437 0.9934695 0.9936597 -0.8119154 0.8119186 0.9980513 -0.8119128 0.8119128 0.9980512 -0.8119169 0.8119128 0.9980512 -0.811922 0.8119128 0.9980512 -0.8119285 0.8119128 0.9980512 -0.8119367 0.8119128 0.9980512 -0.8119471 0.8119128 0.9980512 -0.8119602 0.8119128 0.9980512 -0.8119769 0.8119128 0.9980512 -0.8119979 0.8119128 0.9980512 -0.8120245 0.8119128 0.9980512 -0.8120582 0.8119128 0.9980512 -0.8121007 0.8119128 0.9980512 -0.8121546 0.8119128 0.9980512 -0.8122228 0.8119128 0.9980512 -0.812309 0.8119128 0.9980512 -0.8124181 0.8119128 0.9980512 -0.8125561 0.8119128 0.9980512 -0.8127308 0.8119128 0.9980512 -0.8129517 0.8119128 0.9980512 -0.8132312 0.8119128 0.9980512 -0.8135847 0.8119128 0.9980512 -0.8140321 0.8119128 0.9980512 -0.814598 0.8119128 0.9980512 -0.815314 0.8119128 0.9980512 -0.8162198 0.8119128 0.9980512 -0.8173657 0.8119128 0.9980512 -0.8188155 0.8119128 0.9980512 -0.8206497 0.8119128 0.9980512 -0.8229701 0.8119128 0.9980512 -0.8259058 0.8119128 0.9980512 -0.8296198 0.8119128 0.9980512 -0.8343185 0.8119128 0.9980512 -0.840263 0.8119128 0.9980512 -0.8477836 0.8119128 0.9980512 -0.857298 0.8119128 0.9980512 -0.8693351 0.8119128 0.9980512 -0.8845635 0.8119128 0.9980512 -0.9038294 0.8119128 0.9980512 -0.9282033 0.8119128 0.9980512 -0.9590395 0.8119128 0.9980512 -0.9980512 0.8119128 0.9980512 -0.9984653 0.8462154 0.9665566 -0.9987905 0.8750466 0.9523573 -0.9990461 0.899002 0.9484067 -0.9992474 0.918717 0.9501508 -0.999406 0.9348149 0.9547433 -0.999531 0.9478752 0.9604726 -0.9996296 0.9584159 0.9663604 -0.9997074 0.9668872 0.9718879 -0.9997689 0.9736726 0.9768155 -0.9998174 0.9790927 0.9810656 -0.9998557 0.9834129 0.9846502 -0.999886 0.9868505 0.9876258 -0.9999099 0.989582 0.9900675 -0.9999288 0.9917501 0.992054 -0.9999437 0.9934695 0.9936596 -0.8119154 0.8119226 0.9980513 -0.8119128 0.8119169 0.9980512 -0.8119096 0.8119096 0.9980512 -0.8119148 0.8119096 0.9980512 -0.8119213 0.8119096 0.9980512 -0.8119295 0.8119096 0.9980512 -0.8119399 0.8119096 0.9980512 -0.811953 0.8119096 0.9980512 -0.8119696 0.8119096 0.9980512 -0.8119906 0.8119096 0.9980512 -0.8120173 0.8119096 0.9980512 -0.8120509 0.8119096 0.9980512 -0.8120935 0.8119096 0.9980512 -0.8121474 0.8119096 0.9980512 -0.8122156 0.8119096 0.9980512 -0.8123018 0.8119096 0.9980512 -0.8124109 0.8119096 0.9980512 -0.8125489 0.8119096 0.9980512 -0.8127235 0.8119096 0.9980512 -0.8129445 0.8119096 0.9980512 -0.813224 0.8119096 0.9980512 -0.8135776 0.8119096 0.9980512 -0.8140249 0.8119096 0.9980512 -0.8145909 0.8119096 0.9980512 -0.8153069 0.8119096 0.9980512 -0.8162127 0.8119096 0.9980512 -0.8173587 0.8119096 0.9980512 -0.8188085 0.8119096 0.9980512 -0.8206428 0.8119096 0.9980512 -0.8229633 0.8119096 0.9980512 -0.8258991 0.8119096 0.9980512 -0.8296133 0.8119096 0.9980512 -0.8343122 0.8119096 0.9980512 -0.8402569 0.8119096 0.9980512 -0.8477777 0.8119096 0.9980512 -0.8572925 0.8119096 0.9980512 -0.86933 0.8119096 0.9980512 -0.8845591 0.8119096 0.9980512 -0.9038257 0.8119096 0.9980512 -0.9282006 0.8119096 0.9980512 -0.9590379 0.8119096 0.9980512 -0.9980512 0.8119096 0.9980512 -0.9984653 0.8462132 0.9665556 -0.9987904 0.8750451 0.9523562 -0.9990461 0.8990011 0.9484057 -0.9992474 0.9187164 0.9501501 -0.999406 0.9348146 0.9547427 -0.999531 0.947875 0.9604722 -0.9996296 0.9584157 0.9663601 -0.9997074 0.9668871 0.9718878 -0.9997689 0.9736725 0.9768154 -0.9998174 0.9790927 0.9810655 -0.9998557 0.9834129 0.9846501 -0.999886 0.9868505 0.9876258 -0.9999099 0.989582 0.9900675 -0.9999288 0.9917501 0.992054 -0.9999437 0.9934695 0.9936596 -0.8119154 0.8119278 0.9980513 -0.8119128 0.811922 0.9980512 -0.8119096 0.8119148 0.9980512 -0.8119057 0.8119057 0.9980511 -0.8119122 0.8119057 0.9980511 -0.8119204 0.8119057 0.9980511 -0.8119308 0.8119057 0.9980511 -0.8119439 0.8119057 0.9980511 -0.8119606 0.8119057 0.9980511 -0.8119816 0.8119057 0.9980511 -0.8120082 0.8119057 0.9980511 -0.8120419 0.8119057 0.9980511 -0.8120844 0.8119057 0.9980511 -0.8121383 0.8119057 0.9980511 -0.8122065 0.8119057 0.9980511 -0.8122927 0.8119057 0.9980511 -0.8124018 0.8119057 0.9980511 -0.8125399 0.8119057 0.9980511 -0.8127145 0.8119057 0.9980511 -0.8129354 0.8119057 0.9980511 -0.813215 0.8119057 0.9980511 -0.8135686 0.8119057 0.9980511 -0.8140159 0.8119057 0.9980511 -0.8145819 0.8119057 0.9980511 -0.815298 0.8119057 0.9980511 -0.8162038 0.8119057 0.9980511 -0.8173499 0.8119057 0.9980511 -0.8187998 0.8119057 0.9980511 -0.8206341 0.8119057 0.9980511 -0.8229548 0.8119057 0.9980511 -0.8258907 0.8119057 0.9980511 -0.8296051 0.8119057 0.9980511 -0.8343042 0.8119057 0.9980511 -0.8402492 0.8119057 0.9980511 -0.8477704 0.8119057 0.9980511 -0.8572857 0.8119057 0.9980511 -0.8693238 0.8119057 0.9980511 -0.8845535 0.8119057 0.9980511 -0.9038211 0.8119057 0.9980511 -0.9281971 0.8119057 0.9980511 -0.959036 0.8119057 0.9980511 -0.9980511 0.8119057 0.9980511 -0.9984653 0.8462106 0.9665543 -0.9987904 0.8750434 0.9523547 -0.9990461 0.899 0.9484044 -0.9992474 0.9187157 0.9501491 -0.999406 0.9348141 0.954742 -0.999531 0.9478746 0.9604717 -0.9996296 0.9584155 0.9663598 -0.9997074 0.966887 0.9718875 -0.9997689 0.9736724 0.9768152 -0.9998174 0.9790926 0.9810654 -0.9998557 0.9834129 0.9846501 -0.999886 0.9868505 0.9876257 -0.9999099 0.989582 0.9900675 -0.9999288 0.9917501 0.992054 -0.9999437 0.9934695 0.9936596 -0.8119154 0.8119343 0.9980513 -0.8119128 0.8119285 0.9980512 -0.8119096 0.8119213 0.9980512 -0.8119057 0.8119122 0.9980511 -0.8119009 0.8119009 0.9980511 -0.8119091 0.8119009 0.9980511 -0.8119195 0.8119009 0.9980511 -0.8119326 0.8119009 0.9980511 -0.8119492 0.8119009 0.9980511 -0.8119703 0.8119009 0.9980511 -0.8119969 0.8119009 0.9980511 -0.8120305 0.8119009 0.9980511 -0.8120731 0.8119009 0.9980511 -0.812127 0.8119009 0.9980511 -0.8121952 0.8119009 0.9980511 -0.8122814 0.8119009 0.9980511 -0.8123905 0.8119009 0.9980511 -0.8125286 0.8119009 0.9980511 -0.8127032 0.8119009 0.9980511 -0.8129242 0.8119009 0.9980511 -0.8132037 0.8119009 0.9980511 -0.8135573 0.8119009 0.9980511 -0.8140047 0.8119009 0.9980511 -0.8145707 0.8119009 0.9980511 -0.8152868 0.8119009 0.9980511 -0.8161928 0.8119009 0.9980511 -0.8173389 0.8119009 0.9980511 -0.8187889 0.8119009 0.9980511 -0.8206233 0.8119009 0.9980511 -0.8229441 0.8119009 0.9980511 -0.8258802 0.8119009 0.9980511 -0.8295948 0.8119009 0.9980511 -0.8342942 0.8119009 0.9980511 -0.8402396 0.8119009 0.9980511 -0.8477612 0.8119009 0.9980511 -0.8572771 0.8119009 0.9980511 -0.8693159 0.8119009 0.9980511 -0.8845466 0.8119009 0.9980511 -0.9038153 0.8119009 0.9980511 -0.9281928 0.8119009 0.9980511 -0.9590336 0.8119009 0.9980511 -0.9980511 0.8119009 0.9980511 -0.9984652 0.8462073 0.9665527 -0.9987904 0.8750412 0.9523529 -0.9990461 0.8989986 0.9484028 -0.9992474 0.9187148 0.9501479 -0.999406 0.9348135 0.9547411 -0.999531 0.9478743 0.9604711 -0.9996296 0.9584153 0.9663593 -0.9997074 0.9668869 0.9718873 -0.9997689 0.9736723 0.976815 -0.9998174 0.9790925 0.9810653 -0.9998557 0.9834128 0.98465 -0.999886 0.9868504 0.9876257 -0.9999099 0.989582 0.9900675 -0.9999288 0.9917501 0.992054 -0.9999437 0.9934695 0.9936596 -0.8119154 0.8119425 0.9980513 -0.8119128 0.8119367 0.9980512 -0.8119096 0.8119295 0.9980512 -0.8119057 0.8119204 0.9980511 -0.8119009 0.8119091 0.9980511 -0.8118949 0.8118949 0.998051 -0.8119053 0.8118949 0.998051 -0.8119185 0.8118949 0.998051 -0.8119351 0.8118949 0.998051 -0.8119561 0.8118949 0.998051 -0.8119828 0.8118949 0.998051 -0.8120164 0.8118949 0.998051 -0.812059 0.8118949 0.998051 -0.8121129 0.8118949 0.998051 -0.8121811 0.8118949 0.998051 -0.8122673 0.8118949 0.998051 -0.8123765 0.8118949 0.998051 -0.8125145 0.8118949 0.998051 -0.8126892 0.8118949 0.998051 -0.8129101 0.8118949 0.998051 -0.8131897 0.8118949 0.998051 -0.8135433 0.8118949 0.998051 -0.8139908 0.8118949 0.998051 -0.8145568 0.8118949 0.998051 -0.815273 0.8118949 0.998051 -0.816179 0.8118949 0.998051 -0.8173252 0.8118949 0.998051 -0.8187753 0.8118949 0.998051 -0.8206099 0.8118949 0.998051 -0.8229308 0.8118949 0.998051 -0.8258672 0.8118949 0.998051 -0.829582 0.8118949 0.998051 -0.8342818 0.8118949 0.998051 -0.8402276 0.8118949 0.998051 -0.8477498 0.8118949 0.998051 -0.8572664 0.8118949 0.998051 -0.8693061 0.8118949 0.998051 -0.8845379 0.8118949 0.998051 -0.9038082 0.8118949 0.998051 -0.9281875 0.8118949 0.998051 -0.9590305 0.8118949 0.998051 -0.998051 0.8118949 0.998051 -0.9984652 0.8462034 0.9665507 -0.9987904 0.8750386 0.9523506 -0.9990461 0.8989969 0.9484008 -0.9992474 0.9187137 0.9501463 -0.9994059 0.9348128 0.95474 -0.999531 0.9478738 0.9604703 -0.9996296 0.958415 0.9663588 -0.9997074 0.9668867 0.9718869 -0.9997689 0.9736722 0.9768148 -0.9998174 0.9790925 0.9810652 -0.9998557 0.9834128 0.9846499 -0.999886 0.9868504 0.9876256 -0.9999099 0.9895819 0.9900674 -0.9999288 0.9917501 0.9920539 -0.9999437 0.9934695 0.9936596 -0.8119154 0.8119529 0.9980513 -0.8119128 0.8119471 0.9980512 -0.8119096 0.8119399 0.9980512 -0.8119057 0.8119308 0.9980511 -0.8119009 0.8119195 0.9980511 -0.8118949 0.8119053 0.998051 -0.8118878 0.8118878 0.9980509 -0.811901 0.8118878 0.9980509 -0.8119176 0.8118878 0.9980509 -0.8119387 0.8118878 0.9980509 -0.8119653 0.8118878 0.9980509 -0.8119989 0.8118878 0.9980509 -0.8120415 0.8118878 0.9980509 -0.8120954 0.8118878 0.9980509 -0.8121636 0.8118878 0.9980509 -0.8122499 0.8118878 0.9980509 -0.812359 0.8118878 0.9980509 -0.8124971 0.8118878 0.9980509 -0.8126718 0.8118878 0.9980509 -0.8128927 0.8118878 0.9980509 -0.8131723 0.8118878 0.9980509 -0.813526 0.8118878 0.9980509 -0.8139735 0.8118878 0.9980509 -0.8145396 0.8118878 0.9980509 -0.8152558 0.8118878 0.9980509 -0.8161619 0.8118878 0.9980509 -0.8173082 0.8118878 0.9980509 -0.8187584 0.8118878 0.9980509 -0.8205932 0.8118878 0.9980509 -0.8229144 0.8118878 0.9980509 -0.825851 0.8118878 0.9980509 -0.8295662 0.8118878 0.9980509 -0.8342664 0.8118878 0.9980509 -0.8402127 0.8118878 0.9980509 -0.8477357 0.8118878 0.9980509 -0.8572531 0.8118878 0.9980509 -0.869294 0.8118878 0.9980509 -0.8845272 0.8118878 0.9980509 -0.9037992 0.8118878 0.9980509 -0.9281809 0.8118878 0.9980509 -0.9590268 0.8118878 0.9980509 -0.9980509 0.8118878 0.9980509 -0.9984651 0.8461986 0.9665483 -0.9987903 0.8750355 0.9523478 -0.9990461 0.8989948 0.9483984 -0.9992473 0.9187123 0.9501444 -0.9994059 0.9348119 0.9547387 -0.999531 0.9478733 0.9604694 -0.9996296 0.9584146 0.9663582 -0.9997074 0.9668865 0.9718865 -0.9997689 0.9736721 0.9768145 -0.9998174 0.9790924 0.981065 -0.9998557 0.9834127 0.9846498 -0.999886 0.9868504 0.9876255 -0.9999099 0.9895819 0.9900674 -0.9999288 0.99175 0.9920539 -0.9999437 0.9934695 0.9936596 -0.8119154 0.811966 0.9980513 -0.8119128 0.8119602 0.9980512 -0.8119096 0.811953 0.9980512 -0.8119057 0.8119439 0.9980511 -0.8119009 0.8119326 0.9980511 -0.8118949 0.8119185 0.998051 -0.8118878 0.811901 0.9980509 -0.8118794 0.8118794 0.9980508 -0.8118961 0.8118794 0.9980508 -0.8119171 0.8118794 0.9980508 -0.8119437 0.8118794 0.9980508 -0.8119774 0.8118794 0.9980508 -0.81202 0.8118794 0.9980508 -0.8120739 0.8118794 0.9980508 -0.8121421 0.8118794 0.9980508 -0.8122284 0.8118794 0.9980508 -0.8123375 0.8118794 0.9980508 -0.8124756 0.8118794 0.9980508 -0.8126503 0.8118794 0.9980508 -0.8128713 0.8118794 0.9980508 -0.8131509 0.8118794 0.9980508 -0.8135046 0.8118794 0.9980508 -0.8139522 0.8118794 0.9980508 -0.8145183 0.8118794 0.9980508 -0.8152346 0.8118794 0.9980508 -0.8161408 0.8118794 0.9980508 -0.8172873 0.8118794 0.9980508 -0.8187377 0.8118794 0.9980508 -0.8205726 0.8118794 0.9980508 -0.8228941 0.8118794 0.9980508 -0.825831 0.8118794 0.9980508 -0.8295466 0.8118794 0.9980508 -0.8342474 0.8118794 0.9980508 -0.8401944 0.8118794 0.9980508 -0.8477182 0.8118794 0.9980508 -0.8572368 0.8118794 0.9980508 -0.869279 0.8118794 0.9980508 -0.884514 0.8118794 0.9980508 -0.9037883 0.8118794 0.9980508 -0.9281727 0.8118794 0.9980508 -0.9590222 0.8118794 0.9980508 -0.9980508 0.8118794 0.9980508 -0.998465 0.8461929 0.9665453 -0.9987903 0.8750317 0.9523443 -0.999046 0.8989923 0.9483954 -0.9992473 0.9187107 0.9501421 -0.9994059 0.9348109 0.954737 -0.999531 0.9478726 0.9604682 -0.9996296 0.9584142 0.9663574 -0.9997074 0.9668862 0.971886 -0.9997689 0.9736719 0.9768142 -0.9998174 0.9790923 0.9810648 -0.9998557 0.9834127 0.9846496 -0.999886 0.9868503 0.9876255 -0.9999099 0.9895819 0.9900673 -0.9999288 0.99175 0.9920539 -0.9999437 0.9934694 0.9936596 -0.8119154 0.8119826 0.9980513 -0.8119128 0.8119769 0.9980512 -0.8119096 0.8119696 0.9980512 -0.8119057 0.8119606 0.9980511 -0.8119009 0.8119492 0.9980511 -0.8118949 0.8119351 0.998051 -0.8118878 0.8119176 0.9980509 -0.8118794 0.8118961 0.9980508 -0.8118697 0.8118697 0.9980506 -0.8118907 0.8118697 0.9980506 -0.8119174 0.8118697 0.9980506 -0.811951 0.8118697 0.9980506 -0.8119937 0.8118697 0.9980506 -0.8120476 0.8118697 0.9980506 -0.8121158 0.8118697 0.9980506 -0.8122021 0.8118697 0.9980506 -0.8123112 0.8118697 0.9980506 -0.8124493 0.8118697 0.9980506 -0.812624 0.8118697 0.9980506 -0.8128451 0.8118697 0.9980506 -0.8131247 0.8118697 0.9980506 -0.8134785 0.8118697 0.9980506 -0.8139261 0.8118697 0.9980506 -0.8144923 0.8118697 0.9980506 -0.8152087 0.8118697 0.9980506 -0.816115 0.8118697 0.9980506 -0.8172617 0.8118697 0.9980506 -0.8187123 0.8118697 0.9980506 -0.8205475 0.8118697 0.9980506 -0.8228693 0.8118697 0.9980506 -0.8258066 0.8118697 0.9980506 -0.8295228 0.8118697 0.9980506 -0.8342242 0.8118697 0.9980506 -0.8401721 0.8118697 0.9980506 -0.8476969 0.8118697 0.9980506 -0.8572168 0.8118697 0.9980506 -0.8692608 0.8118697 0.9980506 -0.8844979 0.8118697 0.9980506 -0.9037748 0.8118697 0.9980506 -0.9281627 0.8118697 0.9980506 -0.9590165 0.8118697 0.9980506 -0.9980506 0.8118697 0.9980506 -0.9984649 0.8461864 0.9665416 -0.9987902 0.8750274 0.95234 -0.999046 0.8989895 0.9483917 -0.9992473 0.9187089 0.9501392 -0.9994059 0.9348097 0.9547349 -0.999531 0.9478718 0.9604668 -0.9996296 0.9584137 0.9663564 -0.9997074 0.9668859 0.9718853 -0.9997689 0.9736717 0.9768138 -0.9998174 0.9790921 0.9810645 -0.9998557 0.9834126 0.9846494 -0.999886 0.9868503 0.9876253 -0.9999099 0.9895819 0.9900672 -0.9999288 0.99175 0.9920538 -0.9999437 0.9934694 0.9936595 -0.8119154 0.8120036 0.9980513 -0.8119128 0.8119979 0.9980512 -0.8119096 0.8119906 0.9980512 -0.8119057 0.8119816 0.9980511 -0.8119009 0.8119703 0.9980511 -0.8118949 0.8119561 0.998051 -0.8118878 0.8119387 0.9980509 -0.8118794 0.8119171 0.9980508 -0.8118697 0.8118907 0.9980506 -0.8118589 0.8118589 0.9980504 -0.8118855 0.8118589 0.9980504 -0.8119192 0.8118589 0.9980504 -0.8119618 0.8118589 0.9980504 -0.8120157 0.8118589 0.9980504 -0.8120839 0.8118589 0.9980504 -0.8121702 0.8118589 0.9980504 -0.8122794 0.8118589 0.9980504 -0.8124175 0.8118589 0.9980504 -0.8125923 0.8118589 0.9980504 -0.8128134 0.8118589 0.9980504 -0.8130931 0.8118589 0.9980504 -0.8134469 0.8118589 0.9980504 -0.8138946 0.8118589 0.9980504 -0.8144609 0.8118589 0.9980504 -0.8151774 0.8118589 0.9980504 -0.8160839 0.8118589 0.9980504 -0.8172307 0.8118589 0.9980504 -0.8186816 0.8118589 0.9980504 -0.8205171 0.8118589 0.9980504 -0.8228393 0.8118589 0.9980504 -0.8257771 0.8118589 0.9980504 -0.8294939 0.8118589 0.9980504 -0.8341961 0.8118589 0.9980504 -0.840145 0.8118589 0.9980504 -0.8476711 0.8118589 0.9980504 -0.8571927 0.8118589 0.9980504 -0.8692387 0.8118589 0.9980504 -0.8844784 0.8118589 0.9980504 -0.9037586 0.8118589 0.9980504 -0.9281506 0.8118589 0.9980504 -0.9590097 0.8118589 0.9980504 -0.9980504 0.8118589 0.9980504 -0.9984648 0.8461791 0.9665371 -0.9987902 0.8750225 0.9523349 -0.9990459 0.8989863 0.9483872 -0.9992473 0.9187068 0.9501358 -0.9994059 0.9348083 0.9547324 -0.9995309 0.947871 0.960465 -0.9996296 0.9584132 0.9663553 -0.9997074 0.9668855 0.9718845 -0.9997689 0.9736715 0.9768133 -0.9998174 0.979092 0.9810642 -0.9998557 0.9834125 0.9846492 -0.999886 0.9868502 0.9876252 -0.9999099 0.9895818 0.9900672 -0.9999288 0.99175 0.9920538 -0.9999437 0.9934694 0.9936595 -0.8119154 0.8120303 0.9980513 -0.8119128 0.8120245 0.9980512 -0.8119096 0.8120173 0.9980512 -0.8119057 0.8120082 0.9980511 -0.8119009 0.8119969 0.9980511 -0.8118949 0.8119828 0.998051 -0.8118878 0.8119653 0.9980509 -0.8118794 0.8119437 0.9980508 -0.8118697 0.8119174 0.9980506 -0.8118589 0.8118855 0.9980504 -0.8118476 0.8118476 0.9980502 -0.8118813 0.8118476 0.9980502 -0.8119239 0.8118476 0.9980502 -0.8119778 0.8118476 0.9980502 -0.812046 0.8118476 0.9980502 -0.8121323 0.8118476 0.9980502 -0.8122416 0.8118476 0.9980502 -0.8123797 0.8118476 0.9980502 -0.8125545 0.8118476 0.9980502 -0.8127756 0.8118476 0.9980502 -0.8130554 0.8118476 0.9980502 -0.8134093 0.8118476 0.9980502 -0.813857 0.8118476 0.9980502 -0.8144235 0.8118476 0.9980502 -0.8151401 0.8118476 0.9980502 -0.8160468 0.8118476 0.9980502 -0.8171938 0.8118476 0.9980502 -0.818645 0.8118476 0.9980502 -0.8204809 0.8118476 0.9980502 -0.8228035 0.8118476 0.9980502 -0.825742 0.8118476 0.9980502 -0.8294595 0.8118476 0.9980502 -0.8341627 0.8118476 0.9980502 -0.8401128 0.8118476 0.9980502 -0.8476404 0.8118476 0.9980502 -0.8571639 0.8118476 0.9980502 -0.8692123 0.8118476 0.9980502 -0.8844551 0.8118476 0.9980502 -0.9037393 0.8118476 0.9980502 -0.9281362 0.8118476 0.9980502 -0.9590016 0.8118476 0.9980502 -0.9980502 0.8118476 0.9980502 -0.9984647 0.8461714 0.9665318 -0.9987901 0.8750173 0.9523287 -0.9990459 0.8989829 0.9483819 -0.9992472 0.9187045 0.9501317 -0.9994059 0.9348069 0.9547294 -0.9995309 0.94787 0.960463 -0.9996296 0.9584126 0.9663539 -0.9997074 0.9668852 0.9718836 -0.9997689 0.9736712 0.9768127 -0.9998174 0.9790919 0.9810638 -0.9998557 0.9834124 0.984649 -0.999886 0.9868502 0.987625 -0.9999099 0.9895818 0.9900671 -0.9999288 0.99175 0.9920537 -0.9999437 0.9934694 0.9936595 -0.8119154 0.8120639 0.9980513 -0.8119128 0.8120582 0.9980512 -0.8119096 0.8120509 0.9980512 -0.8119057 0.8120419 0.9980511 -0.8119009 0.8120305 0.9980511 -0.8118949 0.8120164 0.998051 -0.8118878 0.8119989 0.9980509 -0.8118794 0.8119774 0.9980508 -0.8118697 0.811951 0.9980506 -0.8118589 0.8119192 0.9980504 -0.8118476 0.8118813 0.9980502 -0.811837 0.811837 0.99805 -0.8118797 0.811837 0.99805 -0.8119336 0.811837 0.99805 -0.8120018 0.811837 0.99805 -0.8120882 0.811837 0.99805 -0.8121974 0.811837 0.99805 -0.8123356 0.811837 0.99805 -0.8125104 0.811837 0.99805 -0.8127316 0.811837 0.99805 -0.8130114 0.811837 0.99805 -0.8133654 0.811837 0.99805 -0.8138133 0.811837 0.99805 -0.8143799 0.811837 0.99805 -0.8150967 0.811837 0.99805 -0.8160036 0.811837 0.99805 -0.8171509 0.811837 0.99805 -0.8186024 0.811837 0.99805 -0.8204387 0.811837 0.99805 -0.8227619 0.811837 0.99805 -0.825701 0.811837 0.99805 -0.8294195 0.811837 0.99805 -0.8341237 0.811837 0.99805 -0.8400752 0.811837 0.99805 -0.8476047 0.811837 0.99805 -0.8571304 0.811837 0.99805 -0.8691816 0.811837 0.99805 -0.8844281 0.811837 0.99805 -0.9037168 0.811837 0.99805 -0.9281195 0.811837 0.99805 -0.9589921 0.811837 0.99805 -0.99805 0.811837 0.99805 -0.9984645 0.8461641 0.9665255 -0.99879 0.8750124 0.9523216 -0.9990458 0.8989796 0.9483756 -0.9992472 0.9187024 0.9501269 -0.9994059 0.9348055 0.954726 -0.9995309 0.9478691 0.9604606 -0.9996296 0.958412 0.9663522 -0.9997074 0.9668848 0.9718825 -0.9997689 0.973671 0.9768119 -0.9998174 0.9790917 0.9810633 -0.9998557 0.9834123 0.9846487 -0.999886 0.9868501 0.9876249 -0.9999099 0.9895818 0.9900669 -0.9999288 0.9917499 0.9920536 -0.9999437 0.9934694 0.9936594 -0.8119154 0.8121065 0.9980513 -0.8119128 0.8121007 0.9980512 -0.8119096 0.8120935 0.9980512 -0.8119057 0.8120844 0.9980511 -0.8119009 0.8120731 0.9980511 -0.8118949 0.812059 0.998051 -0.8118878 0.8120415 0.9980509 -0.8118794 0.81202 0.9980508 -0.8118697 0.8119937 0.9980506 -0.8118589 0.8119618 0.9980504 -0.8118476 0.8119239 0.9980502 -0.811837 0.8118797 0.99805 -0.8118298 0.8118298 0.9980497 -0.8118837 0.8118298 0.9980497 -0.811952 0.8118298 0.9980497 -0.8120384 0.8118298 0.9980497 -0.8121476 0.8118298 0.9980497 -0.8122858 0.8118298 0.9980497 -0.8124607 0.8118298 0.9980497 -0.8126819 0.8118298 0.9980497 -0.8129618 0.8118298 0.9980497 -0.8133159 0.8118298 0.9980497 -0.8137639 0.8118298 0.9980497 -0.8143306 0.8118298 0.9980497 -0.8150477 0.8118298 0.9980497 -0.8159548 0.8118298 0.9980497 -0.8171024 0.8118298 0.9980497 -0.8185543 0.8118298 0.9980497 -0.8203911 0.8118298 0.9980497 -0.8227149 0.8118298 0.9980497 -0.8256548 0.8118298 0.9980497 -0.8293742 0.8118298 0.9980497 -0.8340798 0.8118298 0.9980497 -0.8400329 0.8118298 0.9980497 -0.8475643 0.8118298 0.9980497 -0.8570925 0.8118298 0.9980497 -0.869147 0.8118298 0.9980497 -0.8843975 0.8118298 0.9980497 -0.9036913 0.8118298 0.9980497 -0.9281006 0.8118298 0.9980497 -0.9589814 0.8118298 0.9980497 -0.9980497 0.8118298 0.9980497 -0.9984643 0.8461589 0.9665185 -0.9987899 0.8750088 0.9523135 -0.9990458 0.8989771 0.9483686 -0.9992472 0.9187008 0.9501215 -0.9994058 0.9348044 0.9547221 -0.9995309 0.9478684 0.9604579 -0.9996296 0.9584115 0.9663504 -0.9997074 0.9668845 0.9718813 -0.9997689 0.9736708 0.9768112 -0.9998174 0.9790916 0.9810628 -0.9998557 0.9834122 0.9846484 -0.999886 0.9868501 0.9876247 -0.9999099 0.9895817 0.9900668 -0.9999288 0.9917499 0.9920535 -0.9999437 0.9934694 0.9936594 -0.8119154 0.8121604 0.9980513 -0.8119128 0.8121546 0.9980512 -0.8119096 0.8121474 0.9980512 -0.8119057 0.8121383 0.9980511 -0.8119009 0.812127 0.9980511 -0.8118949 0.8121129 0.998051 -0.8118878 0.8120954 0.9980509 -0.8118794 0.8120739 0.9980508 -0.8118697 0.8120476 0.9980506 -0.8118589 0.8120157 0.9980504 -0.8118476 0.8119778 0.9980502 -0.811837 0.8119336 0.99805 -0.8118298 0.8118837 0.9980497 -0.8118303 0.8118303 0.9980494 -0.8118986 0.8118303 0.9980494 -0.811985 0.8118303 0.9980494 -0.8120943 0.8118303 0.9980494 -0.8122325 0.8118303 0.9980494 -0.8124075 0.8118303 0.9980494 -0.8126288 0.8118303 0.9980494 -0.8129087 0.8118303 0.9980494 -0.8132629 0.8118303 0.9980494 -0.813711 0.8118303 0.9980494 -0.8142779 0.8118303 0.9980494 -0.8149952 0.8118303 0.9980494 -0.8159025 0.8118303 0.9980494 -0.8170505 0.8118303 0.9980494 -0.8185028 0.8118303 0.9980494 -0.8203401 0.8118303 0.9980494 -0.8226646 0.8118303 0.9980494 -0.8256054 0.8118303 0.9980494 -0.8293258 0.8118303 0.9980494 -0.8340327 0.8118303 0.9980494 -0.8399875 0.8118303 0.9980494 -0.8475211 0.8118303 0.9980494 -0.857052 0.8118303 0.9980494 -0.86911 0.8118303 0.9980494 -0.8843648 0.8118303 0.9980494 -0.9036641 0.8118303 0.9980494 -0.9280803 0.8118303 0.9980494 -0.9589699 0.8118303 0.9980494 -0.9980494 0.8118303 0.9980494 -0.9984642 0.8461587 0.966511 -0.9987897 0.8750084 0.9523049 -0.9990457 0.8989767 0.9483611 -0.9992471 0.9187004 0.9501157 -0.9994058 0.9348042 0.9547179 -0.9995309 0.9478683 0.9604549 -0.9996295 0.9584114 0.9663484 -0.9997074 0.9668844 0.97188 -0.9997689 0.9736708 0.9768103 -0.9998174 0.9790916 0.9810622 -0.9998557 0.9834122 0.984648 -0.999886 0.98685 0.9876244 -0.9999099 0.9895817 0.9900667 -0.9999288 0.9917499 0.9920535 -0.9999437 0.9934694 0.9936593 -0.8119154 0.8122285 0.9980513 -0.8119128 0.8122228 0.9980512 -0.8119096 0.8122156 0.9980512 -0.8119057 0.8122065 0.9980511 -0.8119009 0.8121952 0.9980511 -0.8118949 0.8121811 0.998051 -0.8118878 0.8121636 0.9980509 -0.8118794 0.8121421 0.9980508 -0.8118697 0.8121158 0.9980506 -0.8118589 0.8120839 0.9980504 -0.8118476 0.812046 0.9980502 -0.811837 0.8120018 0.99805 -0.8118298 0.811952 0.9980497 -0.8118303 0.8118986 0.9980494 -0.8118466 0.8118466 0.9980491 -0.811933 0.8118466 0.9980491 -0.8120423 0.8118466 0.9980491 -0.8121806 0.8118466 0.9980491 -0.8123556 0.8118466 0.9980491 -0.812577 0.8118466 0.9980491 -0.812857 0.8118466 0.9980491 -0.8132113 0.8118466 0.9980491 -0.8136595 0.8118466 0.9980491 -0.8142266 0.8118466 0.9980491 -0.814944 0.8118466 0.9980491 -0.8158516 0.8118466 0.9980491 -0.8169999 0.8118466 0.9980491 -0.8184526 0.8118466 0.9980491 -0.8202905 0.8118466 0.9980491 -0.8226156 0.8118466 0.9980491 -0.8255572 0.8118466 0.9980491 -0.8292787 0.8118466 0.9980491 -0.8339868 0.8118466 0.9980491 -0.8399433 0.8118466 0.9980491 -0.847479 0.8118466 0.9980491 -0.8570126 0.8118466 0.9980491 -0.8690738 0.8118466 0.9980491 -0.8843329 0.8118466 0.9980491 -0.9036376 0.8118466 0.9980491 -0.9280606 0.8118466 0.9980491 -0.9589588 0.8118466 0.9980491 -0.9980491 0.8118466 0.9980491 -0.998464 0.8461687 0.9665037 -0.9987896 0.8750145 0.9522964 -0.9990456 0.8989805 0.9483538 -0.9992471 0.9187027 0.9501101 -0.9994058 0.9348056 0.9547138 -0.9995309 0.9478691 0.9604521 -0.9996295 0.958412 0.9663465 -0.9997074 0.9668847 0.9718787 -0.9997688 0.973671 0.9768095 -0.9998174 0.9790917 0.9810617 -0.9998557 0.9834123 0.9846477 -0.999886 0.9868501 0.9876242 -0.9999099 0.9895817 0.9900665 -0.9999288 0.9917499 0.9920534 -0.9999437 0.9934694 0.9936592 -0.8119154 0.8123148 0.9980513 -0.8119128 0.812309 0.9980512 -0.8119096 0.8123018 0.9980512 -0.8119057 0.8122927 0.9980511 -0.8119009 0.8122814 0.9980511 -0.8118949 0.8122673 0.998051 -0.8118878 0.8122499 0.9980509 -0.8118794 0.8122284 0.9980508 -0.8118697 0.8122021 0.9980506 -0.8118589 0.8121702 0.9980504 -0.8118476 0.8121323 0.9980502 -0.811837 0.8120882 0.99805 -0.8118298 0.8120384 0.9980497 -0.8118303 0.811985 0.9980494 -0.8118466 0.811933 0.9980491 -0.8118921 0.8118921 0.9980488 -0.8120015 0.8118921 0.9980488 -0.8121398 0.8118921 0.9980488 -0.8123148 0.8118921 0.9980488 -0.8125362 0.8118921 0.9980488 -0.8128163 0.8118921 0.9980488 -0.8131707 0.8118921 0.9980488 -0.813619 0.8118921 0.9980488 -0.8141862 0.8118921 0.9980488 -0.8149038 0.8118921 0.9980488 -0.8158116 0.8118921 0.9980488 -0.8169601 0.8118921 0.9980488 -0.8184132 0.8118921 0.9980488 -0.8202514 0.8118921 0.9980488 -0.822577 0.8118921 0.9980488 -0.8255193 0.8118921 0.9980488 -0.8292416 0.8118921 0.9980488 -0.8339508 0.8118921 0.9980488 -0.8399085 0.8118921 0.9980488 -0.8474458 0.8118921 0.9980488 -0.8569815 0.8118921 0.9980488 -0.8690454 0.8118921 0.9980488 -0.8843078 0.8118921 0.9980488 -0.9036168 0.8118921 0.9980488 -0.9280451 0.8118921 0.9980488 -0.95895 0.8118921 0.9980488 -0.9980488 0.8118921 0.9980488 -0.9984638 0.8461977 0.966498 -0.9987895 0.8750329 0.9522898 -0.9990456 0.8989921 0.9483481 -0.999247 0.9187101 0.9501056 -0.9994057 0.9348102 0.9547106 -0.9995309 0.947872 0.9604499 -0.9996295 0.9584138 0.966345 -0.9997074 0.9668859 0.9718777 -0.9997688 0.9736717 0.9768088 -0.9998174 0.9790921 0.9810613 -0.9998557 0.9834126 0.9846474 -0.999886 0.9868503 0.987624 -0.9999099 0.9895819 0.9900664 -0.9999288 0.99175 0.9920533 -0.9999437 0.9934694 0.9936592 -0.8119154 0.8124239 0.9980513 -0.8119128 0.8124181 0.9980512 -0.8119096 0.8124109 0.9980512 -0.8119057 0.8124018 0.9980511 -0.8119009 0.8123905 0.9980511 -0.8118949 0.8123765 0.998051 -0.8118878 0.812359 0.9980509 -0.8118794 0.8123375 0.9980508 -0.8118697 0.8123112 0.9980506 -0.8118589 0.8122794 0.9980504 -0.8118476 0.8122416 0.9980502 -0.811837 0.8121974 0.99805 -0.8118298 0.8121476 0.9980497 -0.8118303 0.8120943 0.9980494 -0.8118466 0.8120423 0.9980491 -0.8118921 0.8120015 0.9980488 -0.8119884 0.8119884 0.9980488 -0.8121268 0.8119884 0.9980488 -0.8123018 0.8119884 0.9980488 -0.8125232 0.8119884 0.9980488 -0.8128033 0.8119884 0.9980488 -0.8131577 0.8119884 0.9980488 -0.8136061 0.8119884 0.9980488 -0.8141733 0.8119884 0.9980488 -0.8148909 0.8119884 0.9980488 -0.8157988 0.8119884 0.9980488 -0.8169474 0.8119884 0.9980488 -0.8184005 0.8119884 0.9980488 -0.8202389 0.8119884 0.9980488 -0.8225647 0.8119884 0.9980488 -0.8255071 0.8119884 0.9980488 -0.8292297 0.8119884 0.9980488 -0.8339392 0.8119884 0.9980488 -0.8398974 0.8119884 0.9980488 -0.8474353 0.8119884 0.9980488 -0.8569716 0.8119884 0.9980488 -0.8690364 0.8119884 0.9980488 -0.8842998 0.8119884 0.9980488 -0.9036101 0.8119884 0.9980488 -0.9280401 0.8119884 0.9980488 -0.9589472 0.8119884 0.9980488 -0.9980488 0.8119884 0.9980488 -0.9984638 0.8462598 0.9664961 -0.9987895 0.8750727 0.9522877 -0.9990455 0.8990175 0.9483463 -0.999247 0.9187262 0.9501042 -0.9994057 0.9348204 0.9547096 -0.9995308 0.9478785 0.9604492 -0.9996295 0.9584178 0.9663445 -0.9997074 0.9668884 0.9718774 -0.9997688 0.9736733 0.9768086 -0.9998174 0.9790931 0.9810611 -0.9998557 0.9834132 0.9846473 -0.999886 0.9868507 0.987624 -0.9999099 0.9895821 0.9900664 -0.9999288 0.9917502 0.9920533 -0.9999437 0.9934695 0.9936592 -0.8119154 0.8125619 0.9980513 -0.8119128 0.8125561 0.9980512 -0.8119096 0.8125489 0.9980512 -0.8119057 0.8125399 0.9980511 -0.8119009 0.8125286 0.9980511 -0.8118949 0.8125145 0.998051 -0.8118878 0.8124971 0.9980509 -0.8118794 0.8124756 0.9980508 -0.8118697 0.8124493 0.9980506 -0.8118589 0.8124175 0.9980504 -0.8118476 0.8123797 0.9980502 -0.811837 0.8123356 0.99805 -0.8118298 0.8122858 0.9980497 -0.8118303 0.8122325 0.9980494 -0.8118466 0.8121806 0.9980491 -0.8118921 0.8121398 0.9980488 -0.8119884 0.8121268 0.9980488 -0.8121268 0.8121268 0.9980488 -0.8123018 0.8121268 0.9980488 -0.8125232 0.8121268 0.9980488 -0.8128033 0.8121268 0.9980488 -0.8131577 0.8121268 0.9980488 -0.8136061 0.8121268 0.9980488 -0.8141733 0.8121268 0.9980488 -0.8148909 0.8121268 0.9980488 -0.8157988 0.8121268 0.9980488 -0.8169474 0.8121268 0.9980488 -0.8184005 0.8121268 0.9980488 -0.8202389 0.8121268 0.9980488 -0.8225647 0.8121268 0.9980488 -0.8255071 0.8121268 0.9980488 -0.8292297 0.8121268 0.9980488 -0.8339392 0.8121268 0.9980488 -0.8398974 0.8121268 0.9980488 -0.8474353 0.8121268 0.9980488 -0.8569716 0.8121268 0.9980488 -0.8690364 0.8121268 0.9980488 -0.8842998 0.8121268 0.9980488 -0.9036101 0.8121268 0.9980488 -0.9280401 0.8121268 0.9980488 -0.9589472 0.8121268 0.9980488 -0.9980488 0.8121268 0.9980488 -0.9984638 0.8463492 0.9664961 -0.9987895 0.8751301 0.9522877 -0.9990455 0.8990542 0.9483463 -0.999247 0.9187495 0.9501042 -0.9994057 0.9348352 0.9547096 -0.9995308 0.9478878 0.9604492 -0.9996295 0.9584237 0.9663445 -0.9997074 0.9668922 0.9718774 -0.9997688 0.9736756 0.9768086 -0.9998174 0.9790946 0.9810611 -0.9998557 0.9834141 0.9846473 -0.999886 0.9868512 0.987624 -0.9999099 0.9895825 0.9900664 -0.9999288 0.9917504 0.9920533 -0.9999437 0.9934697 0.9936592 -0.8119154 0.8127365 0.9980513 -0.8119128 0.8127308 0.9980512 -0.8119096 0.8127235 0.9980512 -0.8119057 0.8127145 0.9980511 -0.8119009 0.8127032 0.9980511 -0.8118949 0.8126892 0.998051 -0.8118878 0.8126718 0.9980509 -0.8118794 0.8126503 0.9980508 -0.8118697 0.812624 0.9980506 -0.8118589 0.8125923 0.9980504 -0.8118476 0.8125545 0.9980502 -0.811837 0.8125104 0.99805 -0.8118298 0.8124607 0.9980497 -0.8118303 0.8124075 0.9980494 -0.8118466 0.8123556 0.9980491 -0.8118921 0.8123148 0.9980488 -0.8119884 0.8123018 0.9980488 -0.8121268 0.8123018 0.9980488 -0.8123018 0.8123018 0.9980488 -0.8125232 0.8123018 0.9980488 -0.8128033 0.8123018 0.9980488 -0.8131577 0.8123018 0.9980488 -0.8136061 0.8123018 0.9980488 -0.8141733 0.8123018 0.9980488 -0.8148909 0.8123018 0.9980488 -0.8157988 0.8123018 0.9980488 -0.8169474 0.8123018 0.9980488 -0.8184005 0.8123018 0.9980488 -0.8202389 0.8123018 0.9980488 -0.8225647 0.8123018 0.9980488 -0.8255071 0.8123018 0.9980488 -0.8292297 0.8123018 0.9980488 -0.8339392 0.8123018 0.9980488 -0.8398974 0.8123018 0.9980488 -0.8474353 0.8123018 0.9980488 -0.8569716 0.8123018 0.9980488 -0.8690364 0.8123018 0.9980488 -0.8842998 0.8123018 0.9980488 -0.9036101 0.8123018 0.9980488 -0.9280401 0.8123018 0.9980488 -0.9589472 0.8123018 0.9980488 -0.9980488 0.8123018 0.9980488 -0.9984638 0.8464623 0.9664961 -0.9987895 0.8752028 0.9522877 -0.9990455 0.8991006 0.9483463 -0.999247 0.9187791 0.9501042 -0.9994057 0.9348539 0.9547096 -0.9995308 0.9478997 0.9604492 -0.9996295 0.9584312 0.9663445 -0.9997074 0.9668969 0.9718774 -0.9997688 0.9736786 0.9768086 -0.9998174 0.9790965 0.9810611 -0.9998557 0.9834153 0.9846473 -0.999886 0.986852 0.987624 -0.9999099 0.9895829 0.9900664 -0.9999288 0.9917507 0.9920533 -0.9999437 0.9934698 0.9936592 -0.8119154 0.8129574 0.9980513 -0.8119128 0.8129517 0.9980512 -0.8119096 0.8129445 0.9980512 -0.8119057 0.8129354 0.9980511 -0.8119009 0.8129242 0.9980511 -0.8118949 0.8129101 0.998051 -0.8118878 0.8128927 0.9980509 -0.8118794 0.8128713 0.9980508 -0.8118697 0.8128451 0.9980506 -0.8118589 0.8128134 0.9980504 -0.8118476 0.8127756 0.9980502 -0.811837 0.8127316 0.99805 -0.8118298 0.8126819 0.9980497 -0.8118303 0.8126288 0.9980494 -0.8118466 0.812577 0.9980491 -0.8118921 0.8125362 0.9980488 -0.8119884 0.8125232 0.9980488 -0.8121268 0.8125232 0.9980488 -0.8123018 0.8125232 0.9980488 -0.8125232 0.8125232 0.9980488 -0.8128033 0.8125232 0.9980488 -0.8131577 0.8125232 0.9980488 -0.8136061 0.8125232 0.9980488 -0.8141733 0.8125232 0.9980488 -0.8148909 0.8125232 0.9980488 -0.8157988 0.8125232 0.9980488 -0.8169474 0.8125232 0.9980488 -0.8184005 0.8125232 0.9980488 -0.8202389 0.8125232 0.9980488 -0.8225647 0.8125232 0.9980488 -0.8255071 0.8125232 0.9980488 -0.8292297 0.8125232 0.9980488 -0.8339392 0.8125232 0.9980488 -0.8398974 0.8125232 0.9980488 -0.8474353 0.8125232 0.9980488 -0.8569716 0.8125232 0.9980488 -0.8690364 0.8125232 0.9980488 -0.8842998 0.8125232 0.9980488 -0.9036101 0.8125232 0.9980488 -0.9280401 0.8125232 0.9980488 -0.9589472 0.8125232 0.9980488 -0.9980488 0.8125232 0.9980488 -0.9984638 0.8466054 0.9664961 -0.9987895 0.8752947 0.9522877 -0.9990455 0.8991593 0.9483463 -0.999247 0.9188164 0.9501042 -0.9994057 0.9348776 0.9547096 -0.9995308 0.9479146 0.9604492 -0.9996295 0.9584406 0.9663445 -0.9997074 0.9669028 0.9718774 -0.9997688 0.9736823 0.9768086 -0.9998174 0.9790988 0.9810611 -0.9998557 0.9834167 0.9846473 -0.999886 0.9868529 0.987624 -0.9999099 0.9895835 0.9900664 -0.9999288 0.991751 0.9920533 -0.9999437 0.9934701 0.9936592 -0.8119154 0.8132369 0.9980513 -0.8119128 0.8132312 0.9980512 -0.8119096 0.813224 0.9980512 -0.8119057 0.813215 0.9980511 -0.8119009 0.8132037 0.9980511 -0.8118949 0.8131897 0.998051 -0.8118878 0.8131723 0.9980509 -0.8118794 0.8131509 0.9980508 -0.8118697 0.8131247 0.9980506 -0.8118589 0.8130931 0.9980504 -0.8118476 0.8130554 0.9980502 -0.811837 0.8130114 0.99805 -0.8118298 0.8129618 0.9980497 -0.8118303 0.8129087 0.9980494 -0.8118466 0.812857 0.9980491 -0.8118921 0.8128163 0.9980488 -0.8119884 0.8128033 0.9980488 -0.8121268 0.8128033 0.9980488 -0.8123018 0.8128033 0.9980488 -0.8125232 0.8128033 0.9980488 -0.8128033 0.8128033 0.9980488 -0.8131577 0.8128033 0.9980488 -0.8136061 0.8128033 0.9980488 -0.8141733 0.8128033 0.9980488 -0.8148909 0.8128033 0.9980488 -0.8157988 0.8128033 0.9980488 -0.8169474 0.8128033 0.9980488 -0.8184005 0.8128033 0.9980488 -0.8202389 0.8128033 0.9980488 -0.8225647 0.8128033 0.9980488 -0.8255071 0.8128033 0.9980488 -0.8292297 0.8128033 0.9980488 -0.8339392 0.8128033 0.9980488 -0.8398974 0.8128033 0.9980488 -0.8474353 0.8128033 0.9980488 -0.8569716 0.8128033 0.9980488 -0.8690364 0.8128033 0.9980488 -0.8842998 0.8128033 0.9980488 -0.9036101 0.8128033 0.9980488 -0.9280401 0.8128033 0.9980488 -0.9589472 0.8128033 0.9980488 -0.9980488 0.8128033 0.9980488 -0.9984638 0.8467864 0.9664961 -0.9987895 0.8754109 0.9522877 -0.9990455 0.8992336 0.9483463 -0.999247 0.9188636 0.9501042 -0.9994057 0.9349075 0.9547096 -0.9995308 0.9479335 0.9604492 -0.9996295 0.9584526 0.9663445 -0.9997074 0.9669103 0.9718774 -0.9997688 0.973687 0.9768086 -0.9998174 0.9791018 0.9810611 -0.9998557 0.9834186 0.9846473 -0.999886 0.9868541 0.987624 -0.9999099 0.9895842 0.9900664 -0.9999288 0.9917515 0.9920533 -0.9999437 0.9934704 0.9936592 -0.8119154 0.8135904 0.9980513 -0.8119128 0.8135847 0.9980512 -0.8119096 0.8135776 0.9980512 -0.8119057 0.8135686 0.9980511 -0.8119009 0.8135573 0.9980511 -0.8118949 0.8135433 0.998051 -0.8118878 0.813526 0.9980509 -0.8118794 0.8135046 0.9980508 -0.8118697 0.8134785 0.9980506 -0.8118589 0.8134469 0.9980504 -0.8118476 0.8134093 0.9980502 -0.811837 0.8133654 0.99805 -0.8118298 0.8133159 0.9980497 -0.8118303 0.8132629 0.9980494 -0.8118466 0.8132113 0.9980491 -0.8118921 0.8131707 0.9980488 -0.8119884 0.8131577 0.9980488 -0.8121268 0.8131577 0.9980488 -0.8123018 0.8131577 0.9980488 -0.8125232 0.8131577 0.9980488 -0.8128033 0.8131577 0.9980488 -0.8131577 0.8131577 0.9980488 -0.8136061 0.8131577 0.9980488 -0.8141733 0.8131577 0.9980488 -0.8148909 0.8131577 0.9980488 -0.8157988 0.8131577 0.9980488 -0.8169474 0.8131577 0.9980488 -0.8184005 0.8131577 0.9980488 -0.8202389 0.8131577 0.9980488 -0.8225647 0.8131577 0.9980488 -0.8255071 0.8131577 0.9980488 -0.8292297 0.8131577 0.9980488 -0.8339392 0.8131577 0.9980488 -0.8398974 0.8131577 0.9980488 -0.8474353 0.8131577 0.9980488 -0.8569716 0.8131577 0.9980488 -0.8690364 0.8131577 0.9980488 -0.8842998 0.8131577 0.9980488 -0.9036101 0.8131577 0.9980488 -0.9280401 0.8131577 0.9980488 -0.9589472 0.8131577 0.9980488 -0.9980488 0.8131577 0.9980488 -0.9984638 0.8470154 0.9664961 -0.9987895 0.875558 0.9522877 -0.9990455 0.8993275 0.9483463 -0.999247 0.9189234 0.9501042 -0.9994057 0.9349454 0.9547096 -0.9995308 0.9479575 0.9604492 -0.9996295 0.9584677 0.9663445 -0.9997074 0.9669198 0.9718774 -0.9997688 0.973693 0.9768086 -0.9998174 0.9791055 0.9810611 -0.9998557 0.9834209 0.9846473 -0.999886 0.9868555 0.987624 -0.9999099 0.9895851 0.9900664 -0.9999288 0.9917521 0.9920533 -0.9999437 0.9934707 0.9936592 -0.8119154 0.8140378 0.9980513 -0.8119128 0.8140321 0.9980512 -0.8119096 0.8140249 0.9980512 -0.8119057 0.8140159 0.9980511 -0.8119009 0.8140047 0.9980511 -0.8118949 0.8139908 0.998051 -0.8118878 0.8139735 0.9980509 -0.8118794 0.8139522 0.9980508 -0.8118697 0.8139261 0.9980506 -0.8118589 0.8138946 0.9980504 -0.8118476 0.813857 0.9980502 -0.811837 0.8138133 0.99805 -0.8118298 0.8137639 0.9980497 -0.8118303 0.813711 0.9980494 -0.8118466 0.8136595 0.9980491 -0.8118921 0.813619 0.9980488 -0.8119884 0.8136061 0.9980488 -0.8121268 0.8136061 0.9980488 -0.8123018 0.8136061 0.9980488 -0.8125232 0.8136061 0.9980488 -0.8128033 0.8136061 0.9980488 -0.8131577 0.8136061 0.9980488 -0.8136061 0.8136061 0.9980488 -0.8141733 0.8136061 0.9980488 -0.8148909 0.8136061 0.9980488 -0.8157988 0.8136061 0.9980488 -0.8169474 0.8136061 0.9980488 -0.8184005 0.8136061 0.9980488 -0.8202389 0.8136061 0.9980488 -0.8225647 0.8136061 0.9980488 -0.8255071 0.8136061 0.9980488 -0.8292297 0.8136061 0.9980488 -0.8339392 0.8136061 0.9980488 -0.8398974 0.8136061 0.9980488 -0.8474353 0.8136061 0.9980488 -0.8569716 0.8136061 0.9980488 -0.8690364 0.8136061 0.9980488 -0.8842998 0.8136061 0.9980488 -0.9036101 0.8136061 0.9980488 -0.9280401 0.8136061 0.9980488 -0.9589472 0.8136061 0.9980488 -0.9980488 0.8136061 0.9980488 -0.9984638 0.8473052 0.9664961 -0.9987895 0.8757441 0.9522877 -0.9990455 0.8994464 0.9483463 -0.999247 0.918999 0.9501042 -0.9994057 0.9349933 0.9547096 -0.9995308 0.9479878 0.9604492 -0.9996295 0.9584868 0.9663445 -0.9997074 0.9669318 0.9718774 -0.9997688 0.9737006 0.9768086 -0.9998174 0.9791103 0.9810611 -0.9998557 0.9834239 0.9846473 -0.999886 0.9868574 0.987624 -0.9999099 0.9895863 0.9900664 -0.9999288 0.9917528 0.9920533 -0.9999437 0.9934712 0.9936592 -0.8119154 0.8146037 0.9980513 -0.8119128 0.814598 0.9980512 -0.8119096 0.8145909 0.9980512 -0.8119057 0.8145819 0.9980511 -0.8119009 0.8145707 0.9980511 -0.8118949 0.8145568 0.998051 -0.8118878 0.8145396 0.9980509 -0.8118794 0.8145183 0.9980508 -0.8118697 0.8144923 0.9980506 -0.8118589 0.8144609 0.9980504 -0.8118476 0.8144235 0.9980502 -0.811837 0.8143799 0.99805 -0.8118298 0.8143306 0.9980497 -0.8118303 0.8142779 0.9980494 -0.8118466 0.8142266 0.9980491 -0.8118921 0.8141862 0.9980488 -0.8119884 0.8141733 0.9980488 -0.8121268 0.8141733 0.9980488 -0.8123018 0.8141733 0.9980488 -0.8125232 0.8141733 0.9980488 -0.8128033 0.8141733 0.9980488 -0.8131577 0.8141733 0.9980488 -0.8136061 0.8141733 0.9980488 -0.8141733 0.8141733 0.9980488 -0.8148909 0.8141733 0.9980488 -0.8157988 0.8141733 0.9980488 -0.8169474 0.8141733 0.9980488 -0.8184005 0.8141733 0.9980488 -0.8202389 0.8141733 0.9980488 -0.8225647 0.8141733 0.9980488 -0.8255071 0.8141733 0.9980488 -0.8292297 0.8141733 0.9980488 -0.8339392 0.8141733 0.9980488 -0.8398974 0.8141733 0.9980488 -0.8474353 0.8141733 0.9980488 -0.8569716 0.8141733 0.9980488 -0.8690364 0.8141733 0.9980488 -0.8842998 0.8141733 0.9980488 -0.9036101 0.8141733 0.9980488 -0.9280401 0.8141733 0.9980488 -0.9589472 0.8141733 0.9980488 -0.9980488 0.8141733 0.9980488 -0.9984638 0.8476717 0.9664961 -0.9987895 0.8759795 0.9522877 -0.9990455 0.8995968 0.9483463 -0.999247 0.9190947 0.9501042 -0.9994057 0.935054 0.9547096 -0.9995308 0.9480261 0.9604492 -0.9996295 0.9585109 0.9663445 -0.9997074 0.966947 0.9718774 -0.9997688 0.9737101 0.9768086 -0.9998174 0.9791163 0.9810611 -0.9998557 0.9834277 0.9846473 -0.999886 0.9868597 0.987624 -0.9999099 0.9895878 0.9900664 -0.9999288 0.9917537 0.9920533 -0.9999437 0.9934718 0.9936592 -0.8119154 0.8153196 0.9980513 -0.8119128 0.815314 0.9980512 -0.8119096 0.8153069 0.9980512 -0.8119057 0.815298 0.9980511 -0.8119009 0.8152868 0.9980511 -0.8118949 0.815273 0.998051 -0.8118878 0.8152558 0.9980509 -0.8118794 0.8152346 0.9980508 -0.8118697 0.8152087 0.9980506 -0.8118589 0.8151774 0.9980504 -0.8118476 0.8151401 0.9980502 -0.811837 0.8150967 0.99805 -0.8118298 0.8150477 0.9980497 -0.8118303 0.8149952 0.9980494 -0.8118466 0.814944 0.9980491 -0.8118921 0.8149038 0.9980488 -0.8119884 0.8148909 0.9980488 -0.8121268 0.8148909 0.9980488 -0.8123018 0.8148909 0.9980488 -0.8125232 0.8148909 0.9980488 -0.8128033 0.8148909 0.9980488 -0.8131577 0.8148909 0.9980488 -0.8136061 0.8148909 0.9980488 -0.8141733 0.8148909 0.9980488 -0.8148909 0.8148909 0.9980488 -0.8157988 0.8148909 0.9980488 -0.8169474 0.8148909 0.9980488 -0.8184005 0.8148909 0.9980488 -0.8202389 0.8148909 0.9980488 -0.8225647 0.8148909 0.9980488 -0.8255071 0.8148909 0.9980488 -0.8292297 0.8148909 0.9980488 -0.8339392 0.8148909 0.9980488 -0.8398974 0.8148909 0.9980488 -0.8474353 0.8148909 0.9980488 -0.8569716 0.8148909 0.9980488 -0.8690364 0.8148909 0.9980488 -0.8842998 0.8148909 0.9980488 -0.9036101 0.8148909 0.9980488 -0.9280401 0.8148909 0.9980488 -0.9589472 0.8148909 0.9980488 -0.9980488 0.8148909 0.9980488 -0.9984638 0.8481355 0.9664961 -0.9987895 0.8762773 0.9522877 -0.9990455 0.899787 0.9483463 -0.999247 0.9192157 0.9501042 -0.9994057 0.9351307 0.9547096 -0.9995308 0.9480746 0.9604492 -0.9996295 0.9585415 0.9663445 -0.9997074 0.9669663 0.9718774 -0.9997688 0.9737222 0.9768086 -0.9998174 0.9791238 0.9810611 -0.9998557 0.9834324 0.9846473 -0.999886 0.9868627 0.987624 -0.9999099 0.9895897 0.9900664 -0.9999288 0.9917549 0.9920533 -0.9999437 0.9934725 0.9936592 -0.8119154 0.8162254 0.9980513 -0.8119128 0.8162198 0.9980512 -0.8119096 0.8162127 0.9980512 -0.8119057 0.8162038 0.9980511 -0.8119009 0.8161928 0.9980511 -0.8118949 0.816179 0.998051 -0.8118878 0.8161619 0.9980509 -0.8118794 0.8161408 0.9980508 -0.8118697 0.816115 0.9980506 -0.8118589 0.8160839 0.9980504 -0.8118476 0.8160468 0.9980502 -0.811837 0.8160036 0.99805 -0.8118298 0.8159548 0.9980497 -0.8118303 0.8159025 0.9980494 -0.8118466 0.8158516 0.9980491 -0.8118921 0.8158116 0.9980488 -0.8119884 0.8157988 0.9980488 -0.8121268 0.8157988 0.9980488 -0.8123018 0.8157988 0.9980488 -0.8125232 0.8157988 0.9980488 -0.8128033 0.8157988 0.9980488 -0.8131577 0.8157988 0.9980488 -0.8136061 0.8157988 0.9980488 -0.8141733 0.8157988 0.9980488 -0.8148909 0.8157988 0.9980488 -0.8157988 0.8157988 0.9980488 -0.8169474 0.8157988 0.9980488 -0.8184005 0.8157988 0.9980488 -0.8202389 0.8157988 0.9980488 -0.8225647 0.8157988 0.9980488 -0.8255071 0.8157988 0.9980488 -0.8292297 0.8157988 0.9980488 -0.8339392 0.8157988 0.9980488 -0.8398974 0.8157988 0.9980488 -0.8474353 0.8157988 0.9980488 -0.8569716 0.8157988 0.9980488 -0.8690364 0.8157988 0.9980488 -0.8842998 0.8157988 0.9980488 -0.9036101 0.8157988 0.9980488 -0.9280401 0.8157988 0.9980488 -0.9589472 0.8157988 0.9980488 -0.9980488 0.8157988 0.9980488 -0.9984638 0.8487222 0.9664961 -0.9987895 0.8766541 0.9522877 -0.9990455 0.9000277 0.9483463 -0.999247 0.9193688 0.9501042 -0.9994057 0.9352277 0.9547096 -0.9995308 0.9481359 0.9604492 -0.9996295 0.9585802 0.9663445 -0.9997074 0.9669906 0.9718774 -0.9997688 0.9737375 0.9768086 -0.9998174 0.9791334 0.9810611 -0.9998557 0.9834385 0.9846473 -0.999886 0.9868665 0.987624 -0.9999099 0.989592 0.9900664 -0.9999288 0.9917564 0.9920533 -0.9999437 0.9934734 0.9936592 -0.8119154 0.8173713 0.9980513 -0.8119128 0.8173657 0.9980512 -0.8119096 0.8173587 0.9980512 -0.8119057 0.8173499 0.9980511 -0.8119009 0.8173389 0.9980511 -0.8118949 0.8173252 0.998051 -0.8118878 0.8173082 0.9980509 -0.8118794 0.8172873 0.9980508 -0.8118697 0.8172617 0.9980506 -0.8118589 0.8172307 0.9980504 -0.8118476 0.8171938 0.9980502 -0.811837 0.8171509 0.99805 -0.8118298 0.8171024 0.9980497 -0.8118303 0.8170505 0.9980494 -0.8118466 0.8169999 0.9980491 -0.8118921 0.8169601 0.9980488 -0.8119884 0.8169474 0.9980488 -0.8121268 0.8169474 0.9980488 -0.8123018 0.8169474 0.9980488 -0.8125232 0.8169474 0.9980488 -0.8128033 0.8169474 0.9980488 -0.8131577 0.8169474 0.9980488 -0.8136061 0.8169474 0.9980488 -0.8141733 0.8169474 0.9980488 -0.8148909 0.8169474 0.9980488 -0.8157988 0.8169474 0.9980488 -0.8169474 0.8169474 0.9980488 -0.8184005 0.8169474 0.9980488 -0.8202389 0.8169474 0.9980488 -0.8225647 0.8169474 0.9980488 -0.8255071 0.8169474 0.9980488 -0.8292297 0.8169474 0.9980488 -0.8339392 0.8169474 0.9980488 -0.8398974 0.8169474 0.9980488 -0.8474353 0.8169474 0.9980488 -0.8569716 0.8169474 0.9980488 -0.8690364 0.8169474 0.9980488 -0.8842998 0.8169474 0.9980488 -0.9036101 0.8169474 0.9980488 -0.9280401 0.8169474 0.9980488 -0.9589472 0.8169474 0.9980488 -0.9980488 0.8169474 0.9980488 -0.9984638 0.8494644 0.9664961 -0.9987895 0.8771307 0.9522877 -0.9990455 0.9003323 0.9483463 -0.999247 0.9195625 0.9501042 -0.9994057 0.9353505 0.9547096 -0.9995308 0.9482135 0.9604492 -0.9996295 0.9586291 0.9663445 -0.9997074 0.9670214 0.9718774 -0.9997688 0.9737569 0.9768086 -0.9998174 0.9791456 0.9810611 -0.9998557 0.9834461 0.9846473 -0.999886 0.9868713 0.987624 -0.9999099 0.989595 0.9900664 -0.9999288 0.9917582 0.9920533 -0.9999437 0.9934746 0.9936592 -0.8119154 0.8188211 0.9980513 -0.8119128 0.8188155 0.9980512 -0.8119096 0.8188085 0.9980512 -0.8119057 0.8187998 0.9980511 -0.8119009 0.8187889 0.9980511 -0.8118949 0.8187753 0.998051 -0.8118878 0.8187584 0.9980509 -0.8118794 0.8187377 0.9980508 -0.8118697 0.8187123 0.9980506 -0.8118589 0.8186816 0.9980504 -0.8118476 0.818645 0.9980502 -0.811837 0.8186024 0.99805 -0.8118298 0.8185543 0.9980497 -0.8118303 0.8185028 0.9980494 -0.8118466 0.8184526 0.9980491 -0.8118921 0.8184132 0.9980488 -0.8119884 0.8184005 0.9980488 -0.8121268 0.8184005 0.9980488 -0.8123018 0.8184005 0.9980488 -0.8125232 0.8184005 0.9980488 -0.8128033 0.8184005 0.9980488 -0.8131577 0.8184005 0.9980488 -0.8136061 0.8184005 0.9980488 -0.8141733 0.8184005 0.9980488 -0.8148909 0.8184005 0.9980488 -0.8157988 0.8184005 0.9980488 -0.8169474 0.8184005 0.9980488 -0.8184005 0.8184005 0.9980488 -0.8202389 0.8184005 0.9980488 -0.8225647 0.8184005 0.9980488 -0.8255071 0.8184005 0.9980488 -0.8292297 0.8184005 0.9980488 -0.8339392 0.8184005 0.9980488 -0.8398974 0.8184005 0.9980488 -0.8474353 0.8184005 0.9980488 -0.8569716 0.8184005 0.9980488 -0.8690364 0.8184005 0.9980488 -0.8842998 0.8184005 0.9980488 -0.9036101 0.8184005 0.9980488 -0.9280401 0.8184005 0.9980488 -0.9589472 0.8184005 0.9980488 -0.9980488 0.8184005 0.9980488 -0.9984638 0.8504035 0.9664961 -0.9987895 0.8777338 0.9522877 -0.9990455 0.9007175 0.9483463 -0.999247 0.9198076 0.9501042 -0.9994057 0.9355059 0.9547096 -0.9995308 0.9483117 0.9604492 -0.9996295 0.958691 0.9663445 -0.9997074 0.9670604 0.9718774 -0.9997688 0.9737814 0.9768086 -0.9998174 0.979161 0.9810611 -0.9998557 0.9834557 0.9846473 -0.999886 0.9868773 0.987624 -0.9999099 0.9895988 0.9900664 -0.9999288 0.9917606 0.9920533 -0.9999437 0.9934761 0.9936592 -0.8119154 0.8206552 0.9980513 -0.8119128 0.8206497 0.9980512 -0.8119096 0.8206428 0.9980512 -0.8119057 0.8206341 0.9980511 -0.8119009 0.8206233 0.9980511 -0.8118949 0.8206099 0.998051 -0.8118878 0.8205932 0.9980509 -0.8118794 0.8205726 0.9980508 -0.8118697 0.8205475 0.9980506 -0.8118589 0.8205171 0.9980504 -0.8118476 0.8204809 0.9980502 -0.811837 0.8204387 0.99805 -0.8118298 0.8203911 0.9980497 -0.8118303 0.8203401 0.9980494 -0.8118466 0.8202905 0.9980491 -0.8118921 0.8202514 0.9980488 -0.8119884 0.8202389 0.9980488 -0.8121268 0.8202389 0.9980488 -0.8123018 0.8202389 0.9980488 -0.8125232 0.8202389 0.9980488 -0.8128033 0.8202389 0.9980488 -0.8131577 0.8202389 0.9980488 -0.8136061 0.8202389 0.9980488 -0.8141733 0.8202389 0.9980488 -0.8148909 0.8202389 0.9980488 -0.8157988 0.8202389 0.9980488 -0.8169474 0.8202389 0.9980488 -0.8184005 0.8202389 0.9980488 -0.8202389 0.8202389 0.9980488 -0.8225647 0.8202389 0.9980488 -0.8255071 0.8202389 0.9980488 -0.8292297 0.8202389 0.9980488 -0.8339392 0.8202389 0.9980488 -0.8398974 0.8202389 0.9980488 -0.8474353 0.8202389 0.9980488 -0.8569716 0.8202389 0.9980488 -0.8690364 0.8202389 0.9980488 -0.8842998 0.8202389 0.9980488 -0.9036101 0.8202389 0.9980488 -0.9280401 0.8202389 0.9980488 -0.9589472 0.8202389 0.9980488 -0.9980488 0.8202389 0.9980488 -0.9984638 0.8515915 0.9664961 -0.9987895 0.8784967 0.9522877 -0.9990455 0.9012049 0.9483463 -0.999247 0.9201176 0.9501042 -0.9994057 0.9357024 0.9547096 -0.9995308 0.9484359 0.9604492 -0.9996295 0.9587693 0.9663445 -0.9997074 0.9671097 0.9718774 -0.9997688 0.9738123 0.9768086 -0.9998174 0.9791804 0.9810611 -0.9998557 0.9834679 0.9846473 -0.999886 0.986885 0.987624 -0.9999099 0.9896036 0.9900664 -0.9999288 0.9917636 0.9920533 -0.9999437 0.9934779 0.9936592 -0.8119154 0.8229756 0.9980513 -0.8119128 0.8229701 0.9980512 -0.8119096 0.8229633 0.9980512 -0.8119057 0.8229548 0.9980511 -0.8119009 0.8229441 0.9980511 -0.8118949 0.8229308 0.998051 -0.8118878 0.8229144 0.9980509 -0.8118794 0.8228941 0.9980508 -0.8118697 0.8228693 0.9980506 -0.8118589 0.8228393 0.9980504 -0.8118476 0.8228035 0.9980502 -0.811837 0.8227619 0.99805 -0.8118298 0.8227149 0.9980497 -0.8118303 0.8226646 0.9980494 -0.8118466 0.8226156 0.9980491 -0.8118921 0.822577 0.9980488 -0.8119884 0.8225647 0.9980488 -0.8121268 0.8225647 0.9980488 -0.8123018 0.8225647 0.9980488 -0.8125232 0.8225647 0.9980488 -0.8128033 0.8225647 0.9980488 -0.8131577 0.8225647 0.9980488 -0.8136061 0.8225647 0.9980488 -0.8141733 0.8225647 0.9980488 -0.8148909 0.8225647 0.9980488 -0.8157988 0.8225647 0.9980488 -0.8169474 0.8225647 0.9980488 -0.8184005 0.8225647 0.9980488 -0.8202389 0.8225647 0.9980488 -0.8225647 0.8225647 0.9980488 -0.8255071 0.8225647 0.9980488 -0.8292297 0.8225647 0.9980488 -0.8339392 0.8225647 0.9980488 -0.8398974 0.8225647 0.9980488 -0.8474353 0.8225647 0.9980488 -0.8569716 0.8225647 0.9980488 -0.8690364 0.8225647 0.9980488 -0.8842998 0.8225647 0.9980488 -0.9036101 0.8225647 0.9980488 -0.9280401 0.8225647 0.9980488 -0.9589472 0.8225647 0.9980488 -0.9980488 0.8225647 0.9980488 -0.9984638 0.8530945 0.9664961 -0.9987895 0.8794619 0.9522877 -0.9990455 0.9018215 0.9483463 -0.999247 0.9205098 0.9501042 -0.9994057 0.935951 0.9547096 -0.9995308 0.9485931 0.9604492 -0.9996295 0.9588684 0.9663445 -0.9997074 0.967172 0.9718774 -0.9997688 0.9738515 0.9768086 -0.9998174 0.979205 0.9810611 -0.9998557 0.9834833 0.9846473 -0.999886 0.9868946 0.987624 -0.9999099 0.9896096 0.9900664 -0.9999288 0.9917674 0.9920533 -0.9999437 0.9934803 0.9936592 -0.8119154 0.8259111 0.9980513 -0.8119128 0.8259058 0.9980512 -0.8119096 0.8258991 0.9980512 -0.8119057 0.8258907 0.9980511 -0.8119009 0.8258802 0.9980511 -0.8118949 0.8258672 0.998051 -0.8118878 0.825851 0.9980509 -0.8118794 0.825831 0.9980508 -0.8118697 0.8258066 0.9980506 -0.8118589 0.8257771 0.9980504 -0.8118476 0.825742 0.9980502 -0.811837 0.825701 0.99805 -0.8118298 0.8256548 0.9980497 -0.8118303 0.8256054 0.9980494 -0.8118466 0.8255572 0.9980491 -0.8118921 0.8255193 0.9980488 -0.8119884 0.8255071 0.9980488 -0.8121268 0.8255071 0.9980488 -0.8123018 0.8255071 0.9980488 -0.8125232 0.8255071 0.9980488 -0.8128033 0.8255071 0.9980488 -0.8131577 0.8255071 0.9980488 -0.8136061 0.8255071 0.9980488 -0.8141733 0.8255071 0.9980488 -0.8148909 0.8255071 0.9980488 -0.8157988 0.8255071 0.9980488 -0.8169474 0.8255071 0.9980488 -0.8184005 0.8255071 0.9980488 -0.8202389 0.8255071 0.9980488 -0.8225647 0.8255071 0.9980488 -0.8255071 0.8255071 0.9980488 -0.8292297 0.8255071 0.9980488 -0.8339392 0.8255071 0.9980488 -0.8398974 0.8255071 0.9980488 -0.8474353 0.8255071 0.9980488 -0.8569716 0.8255071 0.9980488 -0.8690364 0.8255071 0.9980488 -0.8842998 0.8255071 0.9980488 -0.9036101 0.8255071 0.9980488 -0.9280401 0.8255071 0.9980488 -0.9589472 0.8255071 0.9980488 -0.9980488 0.8255071 0.9980488 -0.9984638 0.8549959 0.9664961 -0.9987895 0.880683 0.9522877 -0.9990455 0.9026016 0.9483463 -0.999247 0.9210061 0.9501042 -0.9994057 0.9362655 0.9547096 -0.9995308 0.9487918 0.9604492 -0.9996295 0.9589938 0.9663445 -0.9997074 0.9672509 0.9718774 -0.9997688 0.9739011 0.9768086 -0.9998174 0.9792361 0.9810611 -0.9998557 0.9835029 0.9846473 -0.999886 0.9869069 0.987624 -0.9999099 0.9896173 0.9900664 -0.9999288 0.9917722 0.9920533 -0.9999437 0.9934833 0.9936592 -0.8119154 0.829625 0.9980513 -0.8119128 0.8296198 0.9980512 -0.8119096 0.8296133 0.9980512 -0.8119057 0.8296051 0.9980511 -0.8119009 0.8295948 0.9980511 -0.8118949 0.829582 0.998051 -0.8118878 0.8295662 0.9980509 -0.8118794 0.8295466 0.9980508 -0.8118697 0.8295228 0.9980506 -0.8118589 0.8294939 0.9980504 -0.8118476 0.8294595 0.9980502 -0.811837 0.8294195 0.99805 -0.8118298 0.8293742 0.9980497 -0.8118303 0.8293258 0.9980494 -0.8118466 0.8292787 0.9980491 -0.8118921 0.8292416 0.9980488 -0.8119884 0.8292297 0.9980488 -0.8121268 0.8292297 0.9980488 -0.8123018 0.8292297 0.9980488 -0.8125232 0.8292297 0.9980488 -0.8128033 0.8292297 0.9980488 -0.8131577 0.8292297 0.9980488 -0.8136061 0.8292297 0.9980488 -0.8141733 0.8292297 0.9980488 -0.8148909 0.8292297 0.9980488 -0.8157988 0.8292297 0.9980488 -0.8169474 0.8292297 0.9980488 -0.8184005 0.8292297 0.9980488 -0.8202389 0.8292297 0.9980488 -0.8225647 0.8292297 0.9980488 -0.8255071 0.8292297 0.9980488 -0.8292297 0.8292297 0.9980488 -0.8339392 0.8292297 0.9980488 -0.8398974 0.8292297 0.9980488 -0.8474353 0.8292297 0.9980488 -0.8569716 0.8292297 0.9980488 -0.8690364 0.8292297 0.9980488 -0.8842998 0.8292297 0.9980488 -0.9036101 0.8292297 0.9980488 -0.9280401 0.8292297 0.9980488 -0.9589472 0.8292297 0.9980488 -0.9980488 0.8292297 0.9980488 -0.9984638 0.8574015 0.9664961 -0.9987895 0.8822279 0.9522877 -0.9990455 0.9035886 0.9483463 -0.999247 0.9216339 0.9501042 -0.9994057 0.9366635 0.9547096 -0.9995308 0.9490434 0.9604492 -0.9996295 0.9591524 0.9663445 -0.9997074 0.9673508 0.9718774 -0.9997688 0.9739638 0.9768086 -0.9998174 0.9792755 0.9810611 -0.9998557 0.9835276 0.9846473 -0.999886 0.9869223 0.987624 -0.9999099 0.989627 0.9900664 -0.9999288 0.9917782 0.9920533 -0.9999437 0.9934871 0.9936592 -0.8119154 0.8343236 0.9980513 -0.8119128 0.8343185 0.9980512 -0.8119096 0.8343122 0.9980512 -0.8119057 0.8343042 0.9980511 -0.8119009 0.8342942 0.9980511 -0.8118949 0.8342818 0.998051 -0.8118878 0.8342664 0.9980509 -0.8118794 0.8342474 0.9980508 -0.8118697 0.8342242 0.9980506 -0.8118589 0.8341961 0.9980504 -0.8118476 0.8341627 0.9980502 -0.811837 0.8341237 0.99805 -0.8118298 0.8340798 0.9980497 -0.8118303 0.8340327 0.9980494 -0.8118466 0.8339868 0.9980491 -0.8118921 0.8339508 0.9980488 -0.8119884 0.8339392 0.9980488 -0.8121268 0.8339392 0.9980488 -0.8123018 0.8339392 0.9980488 -0.8125232 0.8339392 0.9980488 -0.8128033 0.8339392 0.9980488 -0.8131577 0.8339392 0.9980488 -0.8136061 0.8339392 0.9980488 -0.8141733 0.8339392 0.9980488 -0.8148909 0.8339392 0.9980488 -0.8157988 0.8339392 0.9980488 -0.8169474 0.8339392 0.9980488 -0.8184005 0.8339392 0.9980488 -0.8202389 0.8339392 0.9980488 -0.8225647 0.8339392 0.9980488 -0.8255071 0.8339392 0.9980488 -0.8292297 0.8339392 0.9980488 -0.8339392 0.8339392 0.9980488 -0.8398974 0.8339392 0.9980488 -0.8474353 0.8339392 0.9980488 -0.8569716 0.8339392 0.9980488 -0.8690364 0.8339392 0.9980488 -0.8842998 0.8339392 0.9980488 -0.9036101 0.8339392 0.9980488 -0.9280401 0.8339392 0.9980488 -0.9589472 0.8339392 0.9980488 -0.9980488 0.8339392 0.9980488 -0.9984638 0.8604449 0.9664961 -0.9987895 0.8841823 0.9522877 -0.9990455 0.9048372 0.9483463 -0.999247 0.9224281 0.9501042 -0.9994057 0.9371669 0.9547096 -0.9995308 0.9493615 0.9604492 -0.9996295 0.959353 0.9663445 -0.9997074 0.967477 0.9718774 -0.9997688 0.9740432 0.9768086 -0.9998174 0.9793253 0.9810611 -0.9998557 0.9835588 0.9846473 -0.999886 0.9869419 0.987624 -0.9999099 0.9896392 0.9900664 -0.9999288 0.9917859 0.9920533 -0.9999437 0.9934919 0.9936592 -0.8119154 0.8402679 0.9980513 -0.8119128 0.840263 0.9980512 -0.8119096 0.8402569 0.9980512 -0.8119057 0.8402492 0.9980511 -0.8119009 0.8402396 0.9980511 -0.8118949 0.8402276 0.998051 -0.8118878 0.8402127 0.9980509 -0.8118794 0.8401944 0.9980508 -0.8118697 0.8401721 0.9980506 -0.8118589 0.840145 0.9980504 -0.8118476 0.8401128 0.9980502 -0.811837 0.8400752 0.99805 -0.8118298 0.8400329 0.9980497 -0.8118303 0.8399875 0.9980494 -0.8118466 0.8399433 0.9980491 -0.8118921 0.8399085 0.9980488 -0.8119884 0.8398974 0.9980488 -0.8121268 0.8398974 0.9980488 -0.8123018 0.8398974 0.9980488 -0.8125232 0.8398974 0.9980488 -0.8128033 0.8398974 0.9980488 -0.8131577 0.8398974 0.9980488 -0.8136061 0.8398974 0.9980488 -0.8141733 0.8398974 0.9980488 -0.8148909 0.8398974 0.9980488 -0.8157988 0.8398974 0.9980488 -0.8169474 0.8398974 0.9980488 -0.8184005 0.8398974 0.9980488 -0.8202389 0.8398974 0.9980488 -0.8225647 0.8398974 0.9980488 -0.8255071 0.8398974 0.9980488 -0.8292297 0.8398974 0.9980488 -0.8339392 0.8398974 0.9980488 -0.8398974 0.8398974 0.9980488 -0.8474353 0.8398974 0.9980488 -0.8569716 0.8398974 0.9980488 -0.8690364 0.8398974 0.9980488 -0.8842998 0.8398974 0.9980488 -0.9036101 0.8398974 0.9980488 -0.9280401 0.8398974 0.9980488 -0.9589472 0.8398974 0.9980488 -0.9980488 0.8398974 0.9980488 -0.9984638 0.8642952 0.9664961 -0.9987895 0.886655 0.9522877 -0.9990455 0.9064168 0.9483463 -0.999247 0.9234329 0.9501042 -0.9994057 0.9378038 0.9547096 -0.9995308 0.9497641 0.9604492 -0.9996295 0.9596068 0.9663445 -0.9997074 0.9676368 0.9718774 -0.9997688 0.9741436 0.9768086 -0.9998174 0.9793883 0.9810611 -0.9998557 0.9835983 0.9846473 -0.999886 0.9869667 0.987624 -0.9999099 0.9896547 0.9900664 -0.9999288 0.9917956 0.9920533 -0.9999437 0.993498 0.9936592 -0.8119154 0.8477882 0.9980513 -0.8119128 0.8477836 0.9980512 -0.8119096 0.8477777 0.9980512 -0.8119057 0.8477704 0.9980511 -0.8119009 0.8477612 0.9980511 -0.8118949 0.8477498 0.998051 -0.8118878 0.8477357 0.9980509 -0.8118794 0.8477182 0.9980508 -0.8118697 0.8476969 0.9980506 -0.8118589 0.8476711 0.9980504 -0.8118476 0.8476404 0.9980502 -0.811837 0.8476047 0.99805 -0.8118298 0.8475643 0.9980497 -0.8118303 0.8475211 0.9980494 -0.8118466 0.847479 0.9980491 -0.8118921 0.8474458 0.9980488 -0.8119884 0.8474353 0.9980488 -0.8121268 0.8474353 0.9980488 -0.8123018 0.8474353 0.9980488 -0.8125232 0.8474353 0.9980488 -0.8128033 0.8474353 0.9980488 -0.8131577 0.8474353 0.9980488 -0.8136061 0.8474353 0.9980488 -0.8141733 0.8474353 0.9980488 -0.8148909 0.8474353 0.9980488 -0.8157988 0.8474353 0.9980488 -0.8169474 0.8474353 0.9980488 -0.8184005 0.8474353 0.9980488 -0.8202389 0.8474353 0.9980488 -0.8225647 0.8474353 0.9980488 -0.8255071 0.8474353 0.9980488 -0.8292297 0.8474353 0.9980488 -0.8339392 0.8474353 0.9980488 -0.8398974 0.8474353 0.9980488 -0.8474353 0.8474353 0.9980488 -0.8569716 0.8474353 0.9980488 -0.8690364 0.8474353 0.9980488 -0.8842998 0.8474353 0.9980488 -0.9036101 0.8474353 0.9980488 -0.9280401 0.8474353 0.9980488 -0.9589472 0.8474353 0.9980488 -0.9980488 0.8474353 0.9980488 -0.9984638 0.8691663 0.9664961 -0.9987895 0.8897832 0.9522877 -0.9990455 0.9084153 0.9483463 -0.999247 0.9247041 0.9501042 -0.9994057 0.9386096 0.9547096 -0.9995308 0.9502734 0.9604492 -0.9996295 0.959928 0.9663445 -0.9997074 0.9678389 0.9718774 -0.9997688 0.9742706 0.9768086 -0.9998174 0.9794681 0.9810611 -0.9998557 0.9836483 0.9846473 -0.999886 0.986998 0.987624 -0.9999099 0.9896744 0.9900664 -0.9999288 0.9918079 0.9920533 -0.9999437 0.9935057 0.9936592 -0.8119154 0.8573024 0.9980513 -0.8119128 0.857298 0.9980512 -0.8119096 0.8572925 0.9980512 -0.8119057 0.8572857 0.9980511 -0.8119009 0.8572771 0.9980511 -0.8118949 0.8572664 0.998051 -0.8118878 0.8572531 0.9980509 -0.8118794 0.8572368 0.9980508 -0.8118697 0.8572168 0.9980506 -0.8118589 0.8571927 0.9980504 -0.8118476 0.8571639 0.9980502 -0.811837 0.8571304 0.99805 -0.8118298 0.8570925 0.9980497 -0.8118303 0.857052 0.9980494 -0.8118466 0.8570126 0.9980491 -0.8118921 0.8569815 0.9980488 -0.8119884 0.8569716 0.9980488 -0.8121268 0.8569716 0.9980488 -0.8123018 0.8569716 0.9980488 -0.8125232 0.8569716 0.9980488 -0.8128033 0.8569716 0.9980488 -0.8131577 0.8569716 0.9980488 -0.8136061 0.8569716 0.9980488 -0.8141733 0.8569716 0.9980488 -0.8148909 0.8569716 0.9980488 -0.8157988 0.8569716 0.9980488 -0.8169474 0.8569716 0.9980488 -0.8184005 0.8569716 0.9980488 -0.8202389 0.8569716 0.9980488 -0.8225647 0.8569716 0.9980488 -0.8255071 0.8569716 0.9980488 -0.8292297 0.8569716 0.9980488 -0.8339392 0.8569716 0.9980488 -0.8398974 0.8569716 0.9980488 -0.8474353 0.8569716 0.9980488 -0.8569716 0.8569716 0.9980488 -0.8690364 0.8569716 0.9980488 -0.8842998 0.8569716 0.9980488 -0.9036101 0.8569716 0.9980488 -0.9280401 0.8569716 0.9980488 -0.9589472 0.8569716 0.9980488 -0.9980488 0.8569716 0.9980488 -0.9984638 0.875329 0.9664961 -0.9987895 0.8937407 0.9522877 -0.9990455 0.9109436 0.9483463 -0.999247 0.9263124 0.9501042 -0.9994057 0.939629 0.9547096 -0.9995308 0.9509177 0.9604492 -0.9996295 0.9603343 0.9663445 -0.9997074 0.9680946 0.9718774 -0.9997688 0.9744313 0.9768086 -0.9998174 0.9795689 0.9810611 -0.9998557 0.9837116 0.9846473 -0.999886 0.9870376 0.987624 -0.9999099 0.9896992 0.9900664 -0.9999288 0.9918234 0.9920533 -0.9999437 0.9935154 0.9936592 -0.8119154 0.8693391 0.9980513 -0.8119128 0.8693351 0.9980512 -0.8119096 0.86933 0.9980512 -0.8119057 0.8693238 0.9980511 -0.8119009 0.8693159 0.9980511 -0.8118949 0.8693061 0.998051 -0.8118878 0.869294 0.9980509 -0.8118794 0.869279 0.9980508 -0.8118697 0.8692608 0.9980506 -0.8118589 0.8692387 0.9980504 -0.8118476 0.8692123 0.9980502 -0.811837 0.8691816 0.99805 -0.8118298 0.869147 0.9980497 -0.8118303 0.86911 0.9980494 -0.8118466 0.8690738 0.9980491 -0.8118921 0.8690454 0.9980488 -0.8119884 0.8690364 0.9980488 -0.8121268 0.8690364 0.9980488 -0.8123018 0.8690364 0.9980488 -0.8125232 0.8690364 0.9980488 -0.8128033 0.8690364 0.9980488 -0.8131577 0.8690364 0.9980488 -0.8136061 0.8690364 0.9980488 -0.8141733 0.8690364 0.9980488 -0.8148909 0.8690364 0.9980488 -0.8157988 0.8690364 0.9980488 -0.8169474 0.8690364 0.9980488 -0.8184005 0.8690364 0.9980488 -0.8202389 0.8690364 0.9980488 -0.8225647 0.8690364 0.9980488 -0.8255071 0.8690364 0.9980488 -0.8292297 0.8690364 0.9980488 -0.8339392 0.8690364 0.9980488 -0.8398974 0.8690364 0.9980488 -0.8474353 0.8690364 0.9980488 -0.8569716 0.8690364 0.9980488 -0.8690364 0.8690364 0.9980488 -0.8842998 0.8690364 0.9980488 -0.9036101 0.8690364 0.9980488 -0.9280401 0.8690364 0.9980488 -0.9589472 0.8690364 0.9980488 -0.9980488 0.8690364 0.9980488 -0.9984638 0.8831255 0.9664961 -0.9987895 0.8987476 0.9522877 -0.9990455 0.9141422 0.9483463 -0.999247 0.928347 0.9501042 -0.9994057 0.9409186 0.9547096 -0.9995308 0.9517328 0.9604492 -0.9996295 0.9608482 0.9663445 -0.9997074 0.9684181 0.9718774 -0.9997688 0.9746346 0.9768086 -0.9998174 0.9796966 0.9810611 -0.9998557 0.9837916 0.9846473 -0.999886 0.9870878 0.987624 -0.9999099 0.9897306 0.9900664 -0.9999288 0.9918431 0.9920533 -0.9999437 0.9935277 0.9936592 -0.8119154 0.884567 0.9980513 -0.8119128 0.8845635 0.9980512 -0.8119096 0.8845591 0.9980512 -0.8119057 0.8845535 0.9980511 -0.8119009 0.8845466 0.9980511 -0.8118949 0.8845379 0.998051 -0.8118878 0.8845272 0.9980509 -0.8118794 0.884514 0.9980508 -0.8118697 0.8844979 0.9980506 -0.8118589 0.8844784 0.9980504 -0.8118476 0.8844551 0.9980502 -0.811837 0.8844281 0.99805 -0.8118298 0.8843975 0.9980497 -0.8118303 0.8843648 0.9980494 -0.8118466 0.8843329 0.9980491 -0.8118921 0.8843078 0.9980488 -0.8119884 0.8842998 0.9980488 -0.8121268 0.8842998 0.9980488 -0.8123018 0.8842998 0.9980488 -0.8125232 0.8842998 0.9980488 -0.8128033 0.8842998 0.9980488 -0.8131577 0.8842998 0.9980488 -0.8136061 0.8842998 0.9980488 -0.8141733 0.8842998 0.9980488 -0.8148909 0.8842998 0.9980488 -0.8157988 0.8842998 0.9980488 -0.8169474 0.8842998 0.9980488 -0.8184005 0.8842998 0.9980488 -0.8202389 0.8842998 0.9980488 -0.8225647 0.8842998 0.9980488 -0.8255071 0.8842998 0.9980488 -0.8292297 0.8842998 0.9980488 -0.8339392 0.8842998 0.9980488 -0.8398974 0.8842998 0.9980488 -0.8474353 0.8842998 0.9980488 -0.8569716 0.8842998 0.9980488 -0.8690364 0.8842998 0.9980488 -0.8842998 0.8842998 0.9980488 -0.9036101 0.8842998 0.9980488 -0.9280401 0.8842998 0.9980488 -0.9589472 0.8842998 0.9980488 -0.9980488 0.8842998 0.9980488 -0.9984638 0.892989 0.9664961 -0.9987895 0.9050819 0.9522877 -0.9990455 0.9181889 0.9483463 -0.999247 0.9309211 0.9501042 -0.9994057 0.9425502 0.9547096 -0.9995308 0.952764 0.9604492 -0.9996295 0.9614985 0.9663445 -0.9997074 0.9688274 0.9718774 -0.9997688 0.9748918 0.9768086 -0.9998174 0.979858 0.9810611 -0.9998557 0.9838928 0.9846473 -0.999886 0.9871512 0.987624 -0.9999099 0.9897703 0.9900664 -0.9999288 0.991868 0.9920533 -0.9999437 0.9935432 0.9936592 -0.8119154 0.9038323 0.9980513 -0.8119128 0.9038294 0.9980512 -0.8119096 0.9038257 0.9980512 -0.8119057 0.9038211 0.9980511 -0.8119009 0.9038153 0.9980511 -0.8118949 0.9038082 0.998051 -0.8118878 0.9037992 0.9980509 -0.8118794 0.9037883 0.9980508 -0.8118697 0.9037748 0.9980506 -0.8118589 0.9037586 0.9980504 -0.8118476 0.9037393 0.9980502 -0.811837 0.9037168 0.99805 -0.8118298 0.9036913 0.9980497 -0.8118303 0.9036641 0.9980494 -0.8118466 0.9036376 0.9980491 -0.8118921 0.9036168 0.9980488 -0.8119884 0.9036101 0.9980488 -0.8121268 0.9036101 0.9980488 -0.8123018 0.9036101 0.9980488 -0.8125232 0.9036101 0.9980488 -0.8128033 0.9036101 0.9980488 -0.8131577 0.9036101 0.9980488 -0.8136061 0.9036101 0.9980488 -0.8141733 0.9036101 0.9980488 -0.8148909 0.9036101 0.9980488 -0.8157988 0.9036101 0.9980488 -0.8169474 0.9036101 0.9980488 -0.8184005 0.9036101 0.9980488 -0.8202389 0.9036101 0.9980488 -0.8225647 0.9036101 0.9980488 -0.8255071 0.9036101 0.9980488 -0.8292297 0.9036101 0.9980488 -0.8339392 0.9036101 0.9980488 -0.8398974 0.9036101 0.9980488 -0.8474353 0.9036101 0.9980488 -0.8569716 0.9036101 0.9980488 -0.8690364 0.9036101 0.9980488 -0.8842998 0.9036101 0.9980488 -0.9036101 0.9036101 0.9980488 -0.9280401 0.9036101 0.9980488 -0.9589472 0.9036101 0.9980488 -0.9980488 0.9036101 0.9980488 -0.9984638 0.9054678 0.9664961 -0.9987895 0.9130957 0.9522877 -0.9990455 0.9233085 0.9483463 -0.999247 0.9341777 0.9501042 -0.9994057 0.9446144 0.9547096 -0.9995308 0.9540687 0.9604492 -0.9996295 0.9623212 0.9663445 -0.9997074 0.9693452 0.9718774 -0.9997688 0.9752172 0.9768086 -0.9998174 0.9800622 0.9810611 -0.9998557 0.9840209 0.9846473 -0.999886 0.9872315 0.987624 -0.9999099 0.9898206 0.9900664 -0.9999288 0.9918994 0.9920533 -0.9999437 0.9935629 0.9936592 -0.8119154 0.9282055 0.9980513 -0.8119128 0.9282033 0.9980512 -0.8119096 0.9282006 0.9980512 -0.8119057 0.9281971 0.9980511 -0.8119009 0.9281928 0.9980511 -0.8118949 0.9281875 0.998051 -0.8118878 0.9281809 0.9980509 -0.8118794 0.9281727 0.9980508 -0.8118697 0.9281627 0.9980506 -0.8118589 0.9281506 0.9980504 -0.8118476 0.9281362 0.9980502 -0.811837 0.9281195 0.99805 -0.8118298 0.9281006 0.9980497 -0.8118303 0.9280803 0.9980494 -0.8118466 0.9280606 0.9980491 -0.8118921 0.9280451 0.9980488 -0.8119884 0.9280401 0.9980488 -0.8121268 0.9280401 0.9980488 -0.8123018 0.9280401 0.9980488 -0.8125232 0.9280401 0.9980488 -0.8128033 0.9280401 0.9980488 -0.8131577 0.9280401 0.9980488 -0.8136061 0.9280401 0.9980488 -0.8141733 0.9280401 0.9980488 -0.8148909 0.9280401 0.9980488 -0.8157988 0.9280401 0.9980488 -0.8169474 0.9280401 0.9980488 -0.8184005 0.9280401 0.9980488 -0.8202389 0.9280401 0.9980488 -0.8225647 0.9280401 0.9980488 -0.8255071 0.9280401 0.9980488 -0.8292297 0.9280401 0.9980488 -0.8339392 0.9280401 0.9980488 -0.8398974 0.9280401 0.9980488 -0.8474353 0.9280401 0.9980488 -0.8569716 0.9280401 0.9980488 -0.8690364 0.9280401 0.9980488 -0.8842998 0.9280401 0.9980488 -0.9036101 0.9280401 0.9980488 -0.9280401 0.9280401 0.9980488 -0.9589472 0.9280401 0.9980488 -0.9980488 0.9280401 0.9980488 -0.9984638 0.921255 0.9664961 -0.9987895 0.9232341 0.9522877 -0.9990455 0.9297854 0.9483463 -0.999247 0.9382977 0.9501042 -0.9994057 0.9472259 0.9547096 -0.9995308 0.9557192 0.9604492 -0.9996295 0.963362 0.9663445 -0.9997074 0.9700002 0.9718774 -0.9997688 0.9756289 0.9768086 -0.9998174 0.9803206 0.9810611 -0.9998557 0.9841829 0.9846473 -0.999886 0.987333 0.987624 -0.9999099 0.9898842 0.9900664 -0.9999288 0.9919392 0.9920533 -0.9999437 0.9935878 0.9936592 -0.8119154 0.9590407 0.9980513 -0.8119128 0.9590395 0.9980512 -0.8119096 0.9590379 0.9980512 -0.8119057 0.959036 0.9980511 -0.8119009 0.9590336 0.9980511 -0.8118949 0.9590305 0.998051 -0.8118878 0.9590268 0.9980509 -0.8118794 0.9590222 0.9980508 -0.8118697 0.9590165 0.9980506 -0.8118589 0.9590097 0.9980504 -0.8118476 0.9590016 0.9980502 -0.811837 0.9589921 0.99805 -0.8118298 0.9589814 0.9980497 -0.8118303 0.9589699 0.9980494 -0.8118466 0.9589588 0.9980491 -0.8118921 0.95895 0.9980488 -0.8119884 0.9589472 0.9980488 -0.8121268 0.9589472 0.9980488 -0.8123018 0.9589472 0.9980488 -0.8125232 0.9589472 0.9980488 -0.8128033 0.9589472 0.9980488 -0.8131577 0.9589472 0.9980488 -0.8136061 0.9589472 0.9980488 -0.8141733 0.9589472 0.9980488 -0.8148909 0.9589472 0.9980488 -0.8157988 0.9589472 0.9980488 -0.8169474 0.9589472 0.9980488 -0.8184005 0.9589472 0.9980488 -0.8202389 0.9589472 0.9980488 -0.8225647 0.9589472 0.9980488 -0.8255071 0.9589472 0.9980488 -0.8292297 0.9589472 0.9980488 -0.8339392 0.9589472 0.9980488 -0.8398974 0.9589472 0.9980488 -0.8474353 0.9589472 0.9980488 -0.8569716 0.9589472 0.9980488 -0.8690364 0.9589472 0.9980488 -0.8842998 0.9589472 0.9980488 -0.9036101 0.9589472 0.9980488 -0.9280401 0.9589472 0.9980488 -0.9589472 0.9589472 0.9980488 -0.9980488 0.9589472 0.9980488 -0.9984638 0.9412278 0.9664961 -0.9987895 0.9360606 0.9522877 -0.9990455 0.9379796 0.9483463 -0.999247 0.94351 0.9501042 -0.9994057 0.9505298 0.9547096 -0.9995308 0.9578074 0.9604492 -0.9996295 0.9646787 0.9663445 -0.9997074 0.970829 0.9718774 -0.9997688 0.9761497 0.9768086 -0.9998174 0.9806476 0.9810611 -0.9998557 0.984388 0.9846473 -0.999886 0.9874615 0.987624 -0.9999099 0.9899646 0.9900664 -0.9999288 0.9919896 0.9920533 -0.9999437 0.9936193 0.9936592 -0.8119154 0.9980513 0.9980513 -0.8119128 0.9980512 0.9980512 -0.8119096 0.9980512 0.9980512 -0.8119057 0.9980511 0.9980511 -0.8119009 0.9980511 0.9980511 -0.8118949 0.998051 0.998051 -0.8118878 0.9980509 0.9980509 -0.8118794 0.9980508 0.9980508 -0.8118697 0.9980506 0.9980506 -0.8118589 0.9980504 0.9980504 -0.8118476 0.9980502 0.9980502 -0.811837 0.99805 0.99805 -0.8118298 0.9980497 0.9980497 -0.8118303 0.9980494 0.9980494 -0.8118466 0.9980491 0.9980491 -0.8118921 0.9980488 0.9980488 -0.8119884 0.9980488 0.9980488 -0.8121268 0.9980488 0.9980488 -0.8123018 0.9980488 0.9980488 -0.8125232 0.9980488 0.9980488 -0.8128033 0.9980488 0.9980488 -0.8131577 0.9980488 0.9980488 -0.8136061 0.9980488 0.9980488 -0.8141733 0.9980488 0.9980488 -0.8148909 0.9980488 0.9980488 -0.8157988 0.9980488 0.9980488 -0.8169474 0.9980488 0.9980488 -0.8184005 0.9980488 0.9980488 -0.8202389 0.9980488 0.9980488 -0.8225647 0.9980488 0.9980488 -0.8255071 0.9980488 0.9980488 -0.8292297 0.9980488 0.9980488 -0.8339392 0.9980488 0.9980488 -0.8398974 0.9980488 0.9980488 -0.8474353 0.9980488 0.9980488 -0.8569716 0.9980488 0.9980488 -0.8690364 0.9980488 0.9980488 -0.8842998 0.9980488 0.9980488 -0.9036101 0.9980488 0.9980488 -0.9280401 0.9980488 0.9980488 -0.9589472 0.9980488 0.9980488 -0.9980488 0.9980488 0.9980488 -0.9984638 0.9664961 0.9664961 -0.9987895 0.9522877 0.9522877 -0.9990455 0.9483463 0.9483463 -0.999247 0.9501042 0.9501042 -0.9994057 0.9547096 0.9547096 -0.9995308 0.9604492 0.9604492 -0.9996295 0.9663445 0.9663445 -0.9997074 0.9718774 0.9718774 -0.9997688 0.9768086 0.9768086 -0.9998174 0.9810611 0.9810611 -0.9998557 0.9846473 0.9846473 -0.999886 0.987624 0.987624 -0.9999099 0.9900664 0.9900664 -0.9999288 0.9920533 0.9920533 -0.9999437 0.9936592 0.9936592 -0.8462171 0.9984653 0.9665574 -0.8462154 0.9984653 0.9665566 -0.8462132 0.9984653 0.9665556 -0.8462106 0.9984653 0.9665543 -0.8462073 0.9984652 0.9665527 -0.8462034 0.9984652 0.9665507 -0.8461986 0.9984651 0.9665483 -0.8461929 0.998465 0.9665453 -0.8461864 0.9984649 0.9665416 -0.8461791 0.9984648 0.9665371 -0.8461714 0.9984647 0.9665318 -0.8461641 0.9984645 0.9665255 -0.8461589 0.9984643 0.9665185 -0.8461587 0.9984642 0.966511 -0.8461687 0.998464 0.9665037 -0.8461977 0.9984638 0.966498 -0.8462598 0.9984638 0.9664961 -0.8463492 0.9984638 0.9664961 -0.8464623 0.9984638 0.9664961 -0.8466054 0.9984638 0.9664961 -0.8467864 0.9984638 0.9664961 -0.8470154 0.9984638 0.9664961 -0.8473052 0.9984638 0.9664961 -0.8476717 0.9984638 0.9664961 -0.8481355 0.9984638 0.9664961 -0.8487222 0.9984638 0.9664961 -0.8494644 0.9984638 0.9664961 -0.8504035 0.9984638 0.9664961 -0.8515915 0.9984638 0.9664961 -0.8530945 0.9984638 0.9664961 -0.8549959 0.9984638 0.9664961 -0.8574015 0.9984638 0.9664961 -0.8604449 0.9984638 0.9664961 -0.8642952 0.9984638 0.9664961 -0.8691663 0.9984638 0.9664961 -0.875329 0.9984638 0.9664961 -0.8831255 0.9984638 0.9664961 -0.892989 0.9984638 0.9664961 -0.9054678 0.9984638 0.9664961 -0.921255 0.9984638 0.9664961 -0.9412278 0.9984638 0.9664961 -0.9664961 0.9984638 0.9664961 -0.9984638 0.9984638 0.9664961 -0.9987895 0.9728171 0.9522877 -0.9990455 0.9614615 0.9483463 -0.999247 0.9584468 0.9501042 -0.9994057 0.9599976 0.9547096 -0.9995308 0.9637914 0.9604492 -0.9996295 0.968452 0.9663445 -0.9997074 0.9732039 0.9718774 -0.9997688 0.9776422 0.9768086 -0.9998174 0.9815844 0.9810611 -0.9998557 0.9849754 0.9846473 -0.999886 0.9878296 0.987624 -0.9999099 0.9901951 0.9900664 -0.9999288 0.9921339 0.9920533 -0.9999437 0.9937096 0.9936592 -0.8750477 0.9987905 0.9523583 -0.8750466 0.9987905 0.9523573 -0.8750451 0.9987904 0.9523562 -0.8750434 0.9987904 0.9523547 -0.8750412 0.9987904 0.9523529 -0.8750386 0.9987904 0.9523506 -0.8750355 0.9987903 0.9523478 -0.8750317 0.9987903 0.9523443 -0.8750274 0.9987902 0.95234 -0.8750225 0.9987902 0.9523349 -0.8750173 0.9987901 0.9523287 -0.8750124 0.99879 0.9523216 -0.8750088 0.9987899 0.9523135 -0.8750084 0.9987897 0.9523049 -0.8750145 0.9987896 0.9522964 -0.8750329 0.9987895 0.9522898 -0.8750727 0.9987895 0.9522877 -0.8751301 0.9987895 0.9522877 -0.8752028 0.9987895 0.9522877 -0.8752947 0.9987895 0.9522877 -0.8754109 0.9987895 0.9522877 -0.875558 0.9987895 0.9522877 -0.8757441 0.9987895 0.9522877 -0.8759795 0.9987895 0.9522877 -0.8762773 0.9987895 0.9522877 -0.8766541 0.9987895 0.9522877 -0.8771307 0.9987895 0.9522877 -0.8777338 0.9987895 0.9522877 -0.8784967 0.9987895 0.9522877 -0.8794619 0.9987895 0.9522877 -0.880683 0.9987895 0.9522877 -0.8822279 0.9987895 0.9522877 -0.8841823 0.9987895 0.9522877 -0.886655 0.9987895 0.9522877 -0.8897832 0.9987895 0.9522877 -0.8937407 0.9987895 0.9522877 -0.8987476 0.9987895 0.9522877 -0.9050819 0.9987895 0.9522877 -0.9130957 0.9987895 0.9522877 -0.9232341 0.9987895 0.9522877 -0.9360606 0.9987895 0.9522877 -0.9522877 0.9987895 0.9522877 -0.9728171 0.9987895 0.9522877 -0.9987895 0.9987895 0.9522877 -0.9990455 0.9780539 0.9483463 -0.999247 0.9690013 0.9501042 -0.9994057 0.9666876 0.9547096 -0.9995308 0.9680197 0.9604492 -0.9996295 0.9711183 0.9663445 -0.9997074 0.974882 0.9718774 -0.9997688 0.9786968 0.9768086 -0.9998174 0.9822464 0.9810611 -0.9998557 0.9853905 0.9846473 -0.999886 0.9880897 0.987624 -0.9999099 0.990358 0.9900664 -0.9999288 0.9922358 0.9920533 -0.9999437 0.9937734 0.9936592 -0.8990028 0.9990461 0.9484075 -0.899002 0.9990461 0.9484067 -0.8990011 0.9990461 0.9484057 -0.899 0.9990461 0.9484044 -0.8989986 0.9990461 0.9484028 -0.8989969 0.9990461 0.9484008 -0.8989948 0.9990461 0.9483984 -0.8989923 0.999046 0.9483954 -0.8989895 0.999046 0.9483917 -0.8989863 0.9990459 0.9483872 -0.8989829 0.9990459 0.9483819 -0.8989796 0.9990458 0.9483756 -0.8989771 0.9990458 0.9483686 -0.8989767 0.9990457 0.9483611 -0.8989805 0.9990456 0.9483538 -0.8989921 0.9990456 0.9483481 -0.8990175 0.9990455 0.9483463 -0.8990542 0.9990455 0.9483463 -0.8991006 0.9990455 0.9483463 -0.8991593 0.9990455 0.9483463 -0.8992336 0.9990455 0.9483463 -0.8993275 0.9990455 0.9483463 -0.8994464 0.9990455 0.9483463 -0.8995968 0.9990455 0.9483463 -0.899787 0.9990455 0.9483463 -0.9000277 0.9990455 0.9483463 -0.9003323 0.9990455 0.9483463 -0.9007175 0.9990455 0.9483463 -0.9012049 0.9990455 0.9483463 -0.9018215 0.9990455 0.9483463 -0.9026016 0.9990455 0.9483463 -0.9035886 0.9990455 0.9483463 -0.9048372 0.9990455 0.9483463 -0.9064168 0.9990455 0.9483463 -0.9084153 0.9990455 0.9483463 -0.9109436 0.9990455 0.9483463 -0.9141422 0.9990455 0.9483463 -0.9181889 0.9990455 0.9483463 -0.9233085 0.9990455 0.9483463 -0.9297854 0.9990455 0.9483463 -0.9379796 0.9990455 0.9483463 -0.9483463 0.9990455 0.9483463 -0.9614615 0.9990455 0.9483463 -0.9780539 0.9990455 0.9483463 -0.9990455 0.9990455 0.9483463 -0.999247 0.982354 0.9501042 -0.9994057 0.9751513 0.9547096 -0.9995308 0.9733691 0.9604492 -0.9996295 0.9744915 0.9663445 -0.9997074 0.977005 0.9718774 -0.9997688 0.980031 0.9768086 -0.9998174 0.9830838 0.9810611 -0.9998557 0.9859157 0.9846473 -0.999886 0.9884188 0.987624 -0.9999099 0.9905641 0.9900664 -0.9999288 0.9923648 0.9920533 -0.9999437 0.9938541 0.9936592 -0.9187175 0.9992474 0.9501515 -0.918717 0.9992474 0.9501508 -0.9187164 0.9992474 0.9501501 -0.9187157 0.9992474 0.9501491 -0.9187148 0.9992474 0.9501479 -0.9187137 0.9992474 0.9501463 -0.9187123 0.9992473 0.9501444 -0.9187107 0.9992473 0.9501421 -0.9187089 0.9992473 0.9501392 -0.9187068 0.9992473 0.9501358 -0.9187045 0.9992472 0.9501317 -0.9187024 0.9992472 0.9501269 -0.9187008 0.9992472 0.9501215 -0.9187004 0.9992471 0.9501157 -0.9187027 0.9992471 0.9501101 -0.9187101 0.999247 0.9501056 -0.9187262 0.999247 0.9501042 -0.9187495 0.999247 0.9501042 -0.9187791 0.999247 0.9501042 -0.9188164 0.999247 0.9501042 -0.9188636 0.999247 0.9501042 -0.9189234 0.999247 0.9501042 -0.918999 0.999247 0.9501042 -0.9190947 0.999247 0.9501042 -0.9192157 0.999247 0.9501042 -0.9193688 0.999247 0.9501042 -0.9195625 0.999247 0.9501042 -0.9198076 0.999247 0.9501042 -0.9201176 0.999247 0.9501042 -0.9205098 0.999247 0.9501042 -0.9210061 0.999247 0.9501042 -0.9216339 0.999247 0.9501042 -0.9224281 0.999247 0.9501042 -0.9234329 0.999247 0.9501042 -0.9247041 0.999247 0.9501042 -0.9263124 0.999247 0.9501042 -0.928347 0.999247 0.9501042 -0.9309211 0.999247 0.9501042 -0.9341777 0.999247 0.9501042 -0.9382977 0.999247 0.9501042 -0.94351 0.999247 0.9501042 -0.9501042 0.999247 0.9501042 -0.9584468 0.999247 0.9501042 -0.9690013 0.999247 0.9501042 -0.982354 0.999247 0.9501042 -0.999247 0.999247 0.9501042 -0.9994057 0.9858591 0.9547096 -0.9995308 0.9801368 0.9604492 -0.9996295 0.978759 0.9663445 -0.9997074 0.9796909 0.9718774 -0.9997688 0.981719 0.9768086 -0.9998174 0.9841433 0.9810611 -0.9998557 0.9865801 0.9846473 -0.999886 0.9888351 0.987624 -0.9999099 0.9908248 0.9900664 -0.9999288 0.992528 0.9920533 -0.9999437 0.9939562 0.9936592 -0.9348153 0.999406 0.9547438 -0.9348149 0.999406 0.9547433 -0.9348146 0.999406 0.9547427 -0.9348141 0.999406 0.954742 -0.9348135 0.999406 0.9547411 -0.9348128 0.9994059 0.95474 -0.9348119 0.9994059 0.9547387 -0.9348109 0.9994059 0.954737 -0.9348097 0.9994059 0.9547349 -0.9348083 0.9994059 0.9547324 -0.9348069 0.9994059 0.9547294 -0.9348055 0.9994059 0.954726 -0.9348044 0.9994058 0.9547221 -0.9348042 0.9994058 0.9547179 -0.9348056 0.9994058 0.9547138 -0.9348102 0.9994057 0.9547106 -0.9348204 0.9994057 0.9547096 -0.9348352 0.9994057 0.9547096 -0.9348539 0.9994057 0.9547096 -0.9348776 0.9994057 0.9547096 -0.9349075 0.9994057 0.9547096 -0.9349454 0.9994057 0.9547096 -0.9349933 0.9994057 0.9547096 -0.935054 0.9994057 0.9547096 -0.9351307 0.9994057 0.9547096 -0.9352277 0.9994057 0.9547096 -0.9353505 0.9994057 0.9547096 -0.9355059 0.9994057 0.9547096 -0.9357024 0.9994057 0.9547096 -0.935951 0.9994057 0.9547096 -0.9362655 0.9994057 0.9547096 -0.9366635 0.9994057 0.9547096 -0.9371669 0.9994057 0.9547096 -0.9378038 0.9994057 0.9547096 -0.9386096 0.9994057 0.9547096 -0.939629 0.9994057 0.9547096 -0.9409186 0.9994057 0.9547096 -0.9425502 0.9994057 0.9547096 -0.9446144 0.9994057 0.9547096 -0.9472259 0.9994057 0.9547096 -0.9505298 0.9994057 0.9547096 -0.9547096 0.9994057 0.9547096 -0.9599976 0.9994057 0.9547096 -0.9666876 0.9994057 0.9547096 -0.9751513 0.9994057 0.9547096 -0.9858591 0.9994057 0.9547096 -0.9994057 0.9994057 0.9547096 -0.9995308 0.9886988 0.9604492 -0.9996295 0.9841579 0.9663445 -0.9997074 0.983089 0.9718774 -0.9997688 0.9838545 0.9768086 -0.9998174 0.9854838 0.9810611 -0.9998557 0.9874207 0.9846473 -0.999886 0.9893618 0.987624 -0.9999099 0.9911547 0.9900664 -0.9999288 0.9927345 0.9920533 -0.9999437 0.9940854 0.9936592 -0.9478754 0.999531 0.9604729 -0.9478752 0.999531 0.9604726 -0.947875 0.999531 0.9604722 -0.9478746 0.999531 0.9604717 -0.9478743 0.999531 0.9604711 -0.9478738 0.999531 0.9604703 -0.9478733 0.999531 0.9604694 -0.9478726 0.999531 0.9604682 -0.9478718 0.999531 0.9604668 -0.947871 0.9995309 0.960465 -0.94787 0.9995309 0.960463 -0.9478691 0.9995309 0.9604606 -0.9478684 0.9995309 0.9604579 -0.9478683 0.9995309 0.9604549 -0.9478691 0.9995309 0.9604521 -0.947872 0.9995309 0.9604499 -0.9478785 0.9995308 0.9604492 -0.9478878 0.9995308 0.9604492 -0.9478997 0.9995308 0.9604492 -0.9479146 0.9995308 0.9604492 -0.9479335 0.9995308 0.9604492 -0.9479575 0.9995308 0.9604492 -0.9479878 0.9995308 0.9604492 -0.9480261 0.9995308 0.9604492 -0.9480746 0.9995308 0.9604492 -0.9481359 0.9995308 0.9604492 -0.9482135 0.9995308 0.9604492 -0.9483117 0.9995308 0.9604492 -0.9484359 0.9995308 0.9604492 -0.9485931 0.9995308 0.9604492 -0.9487918 0.9995308 0.9604492 -0.9490434 0.9995308 0.9604492 -0.9493615 0.9995308 0.9604492 -0.9497641 0.9995308 0.9604492 -0.9502734 0.9995308 0.9604492 -0.9509177 0.9995308 0.9604492 -0.9517328 0.9995308 0.9604492 -0.952764 0.9995308 0.9604492 -0.9540687 0.9995308 0.9604492 -0.9557192 0.9995308 0.9604492 -0.9578074 0.9995308 0.9604492 -0.9604492 0.9995308 0.9604492 -0.9637914 0.9995308 0.9604492 -0.9680197 0.9995308 0.9604492 -0.9733691 0.9995308 0.9604492 -0.9801368 0.9995308 0.9604492 -0.9886988 0.9995308 0.9604492 -0.9995308 0.9995308 0.9604492 -0.9996295 0.9909882 0.9663445 -0.9997074 0.9873879 0.9718774 -0.9997688 0.9865561 0.9768086 -0.9998174 0.9871796 0.9810611 -0.9998557 0.9884841 0.9846473 -0.999886 0.9900282 0.987624 -0.9999099 0.991572 0.9900664 -0.9999288 0.9929957 0.9920533 -0.9999437 0.9942488 0.9936592 -0.958416 0.9996296 0.9663606 -0.9584159 0.9996296 0.9663604 -0.9584157 0.9996296 0.9663601 -0.9584155 0.9996296 0.9663598 -0.9584153 0.9996296 0.9663593 -0.958415 0.9996296 0.9663588 -0.9584146 0.9996296 0.9663582 -0.9584142 0.9996296 0.9663574 -0.9584137 0.9996296 0.9663564 -0.9584132 0.9996296 0.9663553 -0.9584126 0.9996296 0.9663539 -0.958412 0.9996296 0.9663522 -0.9584115 0.9996296 0.9663504 -0.9584114 0.9996295 0.9663484 -0.958412 0.9996295 0.9663465 -0.9584138 0.9996295 0.966345 -0.9584178 0.9996295 0.9663445 -0.9584237 0.9996295 0.9663445 -0.9584312 0.9996295 0.9663445 -0.9584406 0.9996295 0.9663445 -0.9584526 0.9996295 0.9663445 -0.9584677 0.9996295 0.9663445 -0.9584868 0.9996295 0.9663445 -0.9585109 0.9996295 0.9663445 -0.9585415 0.9996295 0.9663445 -0.9585802 0.9996295 0.9663445 -0.9586291 0.9996295 0.9663445 -0.958691 0.9996295 0.9663445 -0.9587693 0.9996295 0.9663445 -0.9588684 0.9996295 0.9663445 -0.9589938 0.9996295 0.9663445 -0.9591524 0.9996295 0.9663445 -0.959353 0.9996295 0.9663445 -0.9596068 0.9996295 0.9663445 -0.959928 0.9996295 0.9663445 -0.9603343 0.9996295 0.9663445 -0.9608482 0.9996295 0.9663445 -0.9614985 0.9996295 0.9663445 -0.9623212 0.9996295 0.9663445 -0.963362 0.9996295 0.9663445 -0.9646787 0.9996295 0.9663445 -0.9663445 0.9996295 0.9663445 -0.968452 0.9996295 0.9663445 -0.9711183 0.9996295 0.9663445 -0.9744915 0.9996295 0.9663445 -0.978759 0.9996295 0.9663445 -0.9841579 0.9996295 0.9663445 -0.9909882 0.9996295 0.9663445 -0.9996295 0.9996295 0.9663445 -0.9997074 0.9928267 0.9718774 -0.9997688 0.9899741 0.9768086 -0.9998174 0.989325 0.9810611 -0.9998557 0.9898295 0.9846473 -0.999886 0.9908712 0.987624 -0.9999099 0.9920999 0.9900664 -0.9999288 0.9933261 0.9920533 -0.9999437 0.9944556 0.9936592 -0.9668873 0.9997074 0.9718881 -0.9668872 0.9997074 0.9718879 -0.9668871 0.9997074 0.9718878 -0.966887 0.9997074 0.9718875 -0.9668869 0.9997074 0.9718873 -0.9668867 0.9997074 0.9718869 -0.9668865 0.9997074 0.9718865 -0.9668862 0.9997074 0.971886 -0.9668859 0.9997074 0.9718853 -0.9668855 0.9997074 0.9718845 -0.9668852 0.9997074 0.9718836 -0.9668848 0.9997074 0.9718825 -0.9668845 0.9997074 0.9718813 -0.9668844 0.9997074 0.97188 -0.9668847 0.9997074 0.9718787 -0.9668859 0.9997074 0.9718777 -0.9668884 0.9997074 0.9718774 -0.9668922 0.9997074 0.9718774 -0.9668969 0.9997074 0.9718774 -0.9669028 0.9997074 0.9718774 -0.9669103 0.9997074 0.9718774 -0.9669198 0.9997074 0.9718774 -0.9669318 0.9997074 0.9718774 -0.966947 0.9997074 0.9718774 -0.9669663 0.9997074 0.9718774 -0.9669906 0.9997074 0.9718774 -0.9670214 0.9997074 0.9718774 -0.9670604 0.9997074 0.9718774 -0.9671097 0.9997074 0.9718774 -0.967172 0.9997074 0.9718774 -0.9672509 0.9997074 0.9718774 -0.9673508 0.9997074 0.9718774 -0.967477 0.9997074 0.9718774 -0.9676368 0.9997074 0.9718774 -0.9678389 0.9997074 0.9718774 -0.9680946 0.9997074 0.9718774 -0.9684181 0.9997074 0.9718774 -0.9688274 0.9997074 0.9718774 -0.9693452 0.9997074 0.9718774 -0.9700002 0.9997074 0.9718774 -0.970829 0.9997074 0.9718774 -0.9718774 0.9997074 0.9718774 -0.9732039 0.9997074 0.9718774 -0.974882 0.9997074 0.9718774 -0.977005 0.9997074 0.9718774 -0.9796909 0.9997074 0.9718774 -0.983089 0.9997074 0.9718774 -0.9873879 0.9997074 0.9718774 -0.9928267 0.9997074 0.9718774 -0.9997074 0.9997074 0.9718774 -0.9997688 0.9942982 0.9768086 -0.9998174 0.9920392 0.9810611 -0.9998557 0.9915316 0.9846473 -0.999886 0.9919377 0.987624 -0.9999099 0.9927678 0.9900664 -0.9999288 0.9937442 0.9920533 -0.9999437 0.9947172 0.9936592 -0.9736726 0.9997689 0.9768156 -0.9736726 0.9997689 0.9768155 -0.9736725 0.9997689 0.9768154 -0.9736724 0.9997689 0.9768152 -0.9736723 0.9997689 0.976815 -0.9736722 0.9997689 0.9768148 -0.9736721 0.9997689 0.9768145 -0.9736719 0.9997689 0.9768142 -0.9736717 0.9997689 0.9768138 -0.9736715 0.9997689 0.9768133 -0.9736712 0.9997689 0.9768127 -0.973671 0.9997689 0.9768119 -0.9736708 0.9997689 0.9768112 -0.9736708 0.9997689 0.9768103 -0.973671 0.9997688 0.9768095 -0.9736717 0.9997688 0.9768088 -0.9736733 0.9997688 0.9768086 -0.9736756 0.9997688 0.9768086 -0.9736786 0.9997688 0.9768086 -0.9736823 0.9997688 0.9768086 -0.973687 0.9997688 0.9768086 -0.973693 0.9997688 0.9768086 -0.9737006 0.9997688 0.9768086 -0.9737101 0.9997688 0.9768086 -0.9737222 0.9997688 0.9768086 -0.9737375 0.9997688 0.9768086 -0.9737569 0.9997688 0.9768086 -0.9737814 0.9997688 0.9768086 -0.9738123 0.9997688 0.9768086 -0.9738515 0.9997688 0.9768086 -0.9739011 0.9997688 0.9768086 -0.9739638 0.9997688 0.9768086 -0.9740432 0.9997688 0.9768086 -0.9741436 0.9997688 0.9768086 -0.9742706 0.9997688 0.9768086 -0.9744313 0.9997688 0.9768086 -0.9746346 0.9997688 0.9768086 -0.9748918 0.9997688 0.9768086 -0.9752172 0.9997688 0.9768086 -0.9756289 0.9997688 0.9768086 -0.9761497 0.9997688 0.9768086 -0.9768086 0.9997688 0.9768086 -0.9776422 0.9997688 0.9768086 -0.9786968 0.9997688 0.9768086 -0.980031 0.9997688 0.9768086 -0.981719 0.9997688 0.9768086 -0.9838545 0.9997688 0.9768086 -0.9865561 0.9997688 0.9768086 -0.9899741 0.9997688 0.9768086 -0.9942982 0.9997688 0.9768086 -0.9997688 0.9997688 0.9768086 -0.9998174 0.9954731 0.9810611 -0.9998557 0.9936849 0.9846473 -0.999886 0.993287 0.987624 -0.9999099 0.9936128 0.9900664 -0.9999288 0.9942731 0.9920533 -0.9999437 0.9950481 0.9936592 -0.9790927 0.9998174 0.9810656 -0.9790927 0.9998174 0.9810656 -0.9790927 0.9998174 0.9810655 -0.9790926 0.9998174 0.9810654 -0.9790925 0.9998174 0.9810653 -0.9790925 0.9998174 0.9810652 -0.9790924 0.9998174 0.981065 -0.9790923 0.9998174 0.9810648 -0.9790921 0.9998174 0.9810645 -0.979092 0.9998174 0.9810642 -0.9790919 0.9998174 0.9810638 -0.9790917 0.9998174 0.9810633 -0.9790916 0.9998174 0.9810628 -0.9790916 0.9998174 0.9810622 -0.9790917 0.9998174 0.9810617 -0.9790921 0.9998174 0.9810613 -0.9790931 0.9998174 0.9810611 -0.9790946 0.9998174 0.9810611 -0.9790965 0.9998174 0.9810611 -0.9790988 0.9998174 0.9810611 -0.9791018 0.9998174 0.9810611 -0.9791055 0.9998174 0.9810611 -0.9791103 0.9998174 0.9810611 -0.9791163 0.9998174 0.9810611 -0.9791238 0.9998174 0.9810611 -0.9791334 0.9998174 0.9810611 -0.9791456 0.9998174 0.9810611 -0.979161 0.9998174 0.9810611 -0.9791804 0.9998174 0.9810611 -0.979205 0.9998174 0.9810611 -0.9792361 0.9998174 0.9810611 -0.9792755 0.9998174 0.9810611 -0.9793253 0.9998174 0.9810611 -0.9793883 0.9998174 0.9810611 -0.9794681 0.9998174 0.9810611 -0.9795689 0.9998174 0.9810611 -0.9796966 0.9998174 0.9810611 -0.979858 0.9998174 0.9810611 -0.9800622 0.9998174 0.9810611 -0.9803206 0.9998174 0.9810611 -0.9806476 0.9998174 0.9810611 -0.9810611 0.9998174 0.9810611 -0.9815844 0.9998174 0.9810611 -0.9822464 0.9998174 0.9810611 -0.9830838 0.9998174 0.9810611 -0.9841433 0.9998174 0.9810611 -0.9854838 0.9998174 0.9810611 -0.9871796 0.9998174 0.9810611 -0.989325 0.9998174 0.9810611 -0.9920392 0.9998174 0.9810611 -0.9954731 0.9998174 0.9810611 -0.9998174 0.9998174 0.9810611 -0.9998557 0.9964092 0.9846473 -0.999886 0.9949941 0.987624 -0.9999099 0.9946818 0.9900664 -0.9999288 0.9949422 0.9920533 -0.9999437 0.9954668 0.9936592 -0.9834129 0.9998557 0.9846502 -0.9834129 0.9998557 0.9846502 -0.9834129 0.9998557 0.9846501 -0.9834129 0.9998557 0.9846501 -0.9834128 0.9998557 0.98465 -0.9834128 0.9998557 0.9846499 -0.9834127 0.9998557 0.9846498 -0.9834127 0.9998557 0.9846496 -0.9834126 0.9998557 0.9846494 -0.9834125 0.9998557 0.9846492 -0.9834124 0.9998557 0.984649 -0.9834123 0.9998557 0.9846487 -0.9834122 0.9998557 0.9846484 -0.9834122 0.9998557 0.984648 -0.9834123 0.9998557 0.9846477 -0.9834126 0.9998557 0.9846474 -0.9834132 0.9998557 0.9846473 -0.9834141 0.9998557 0.9846473 -0.9834153 0.9998557 0.9846473 -0.9834167 0.9998557 0.9846473 -0.9834186 0.9998557 0.9846473 -0.9834209 0.9998557 0.9846473 -0.9834239 0.9998557 0.9846473 -0.9834277 0.9998557 0.9846473 -0.9834324 0.9998557 0.9846473 -0.9834385 0.9998557 0.9846473 -0.9834461 0.9998557 0.9846473 -0.9834557 0.9998557 0.9846473 -0.9834679 0.9998557 0.9846473 -0.9834833 0.9998557 0.9846473 -0.9835029 0.9998557 0.9846473 -0.9835276 0.9998557 0.9846473 -0.9835588 0.9998557 0.9846473 -0.9835983 0.9998557 0.9846473 -0.9836483 0.9998557 0.9846473 -0.9837116 0.9998557 0.9846473 -0.9837916 0.9998557 0.9846473 -0.9838928 0.9998557 0.9846473 -0.9840209 0.9998557 0.9846473 -0.9841829 0.9998557 0.9846473 -0.984388 0.9998557 0.9846473 -0.9846473 0.9998557 0.9846473 -0.9849754 0.9998557 0.9846473 -0.9853905 0.9998557 0.9846473 -0.9859157 0.9998557 0.9846473 -0.9865801 0.9998557 0.9846473 -0.9874207 0.9998557 0.9846473 -0.9884841 0.9998557 0.9846473 -0.9898295 0.9998557 0.9846473 -0.9915316 0.9998557 0.9846473 -0.9936849 0.9998557 0.9846473 -0.9964092 0.9998557 0.9846473 -0.9998557 0.9998557 0.9846473 -0.999886 0.9971537 0.987624 -0.9999099 0.9960342 0.9900664 -0.9999288 0.9957887 0.9920533 -0.9999437 0.9959964 0.9936592 -0.9868505 0.999886 0.9876258 -0.9868505 0.999886 0.9876258 -0.9868505 0.999886 0.9876258 -0.9868505 0.999886 0.9876257 -0.9868504 0.999886 0.9876257 -0.9868504 0.999886 0.9876256 -0.9868504 0.999886 0.9876255 -0.9868503 0.999886 0.9876255 -0.9868503 0.999886 0.9876253 -0.9868502 0.999886 0.9876252 -0.9868502 0.999886 0.987625 -0.9868501 0.999886 0.9876249 -0.9868501 0.999886 0.9876247 -0.98685 0.999886 0.9876244 -0.9868501 0.999886 0.9876242 -0.9868503 0.999886 0.987624 -0.9868507 0.999886 0.987624 -0.9868512 0.999886 0.987624 -0.986852 0.999886 0.987624 -0.9868529 0.999886 0.987624 -0.9868541 0.999886 0.987624 -0.9868555 0.999886 0.987624 -0.9868574 0.999886 0.987624 -0.9868597 0.999886 0.987624 -0.9868627 0.999886 0.987624 -0.9868665 0.999886 0.987624 -0.9868713 0.999886 0.987624 -0.9868773 0.999886 0.987624 -0.986885 0.999886 0.987624 -0.9868946 0.999886 0.987624 -0.9869069 0.999886 0.987624 -0.9869223 0.999886 0.987624 -0.9869419 0.999886 0.987624 -0.9869667 0.999886 0.987624 -0.986998 0.999886 0.987624 -0.9870376 0.999886 0.987624 -0.9870878 0.999886 0.987624 -0.9871512 0.999886 0.987624 -0.9872315 0.999886 0.987624 -0.987333 0.999886 0.987624 -0.9874615 0.999886 0.987624 -0.987624 0.999886 0.987624 -0.9878296 0.999886 0.987624 -0.9880897 0.999886 0.987624 -0.9884188 0.999886 0.987624 -0.9888351 0.999886 0.987624 -0.9893618 0.999886 0.987624 -0.9900282 0.999886 0.987624 -0.9908712 0.999886 0.987624 -0.9919377 0.999886 0.987624 -0.993287 0.999886 0.987624 -0.9949941 0.999886 0.987624 -0.9971537 0.999886 0.987624 -0.999886 0.999886 0.987624 -0.9999099 0.9977452 0.9900664 -0.9999288 0.9968597 0.9920533 -0.9999437 0.9966665 0.9936592 -0.989582 0.9999099 0.9900676 -0.989582 0.9999099 0.9900675 -0.989582 0.9999099 0.9900675 -0.989582 0.9999099 0.9900675 -0.989582 0.9999099 0.9900675 -0.9895819 0.9999099 0.9900674 -0.9895819 0.9999099 0.9900674 -0.9895819 0.9999099 0.9900673 -0.9895819 0.9999099 0.9900672 -0.9895818 0.9999099 0.9900672 -0.9895818 0.9999099 0.9900671 -0.9895818 0.9999099 0.9900669 -0.9895817 0.9999099 0.9900668 -0.9895817 0.9999099 0.9900667 -0.9895817 0.9999099 0.9900665 -0.9895819 0.9999099 0.9900664 -0.9895821 0.9999099 0.9900664 -0.9895825 0.9999099 0.9900664 -0.9895829 0.9999099 0.9900664 -0.9895835 0.9999099 0.9900664 -0.9895842 0.9999099 0.9900664 -0.9895851 0.9999099 0.9900664 -0.9895863 0.9999099 0.9900664 -0.9895878 0.9999099 0.9900664 -0.9895897 0.9999099 0.9900664 -0.989592 0.9999099 0.9900664 -0.989595 0.9999099 0.9900664 -0.9895988 0.9999099 0.9900664 -0.9896036 0.9999099 0.9900664 -0.9896096 0.9999099 0.9900664 -0.9896173 0.9999099 0.9900664 -0.989627 0.9999099 0.9900664 -0.9896392 0.9999099 0.9900664 -0.9896547 0.9999099 0.9900664 -0.9896744 0.9999099 0.9900664 -0.9896992 0.9999099 0.9900664 -0.9897306 0.9999099 0.9900664 -0.9897703 0.9999099 0.9900664 -0.9898206 0.9999099 0.9900664 -0.9898842 0.9999099 0.9900664 -0.9899646 0.9999099 0.9900664 -0.9900664 0.9999099 0.9900664 -0.9901951 0.9999099 0.9900664 -0.990358 0.9999099 0.9900664 -0.9905641 0.9999099 0.9900664 -0.9908248 0.9999099 0.9900664 -0.9911547 0.9999099 0.9900664 -0.991572 0.9999099 0.9900664 -0.9920999 0.9999099 0.9900664 -0.9927678 0.9999099 0.9900664 -0.9936128 0.9999099 0.9900664 -0.9946818 0.9999099 0.9900664 -0.9960342 0.9999099 0.9900664 -0.9977452 0.9999099 0.9900664 -0.9999099 0.9999099 0.9900664 -0.9999288 0.9982146 0.9920533 -0.9999437 0.9975143 0.9936592 -0.9917501 0.9999288 0.992054 -0.9917501 0.9999288 0.992054 -0.9917501 0.9999288 0.992054 -0.9917501 0.9999288 0.992054 -0.9917501 0.9999288 0.992054 -0.9917501 0.9999288 0.9920539 -0.99175 0.9999288 0.9920539 -0.99175 0.9999288 0.9920539 -0.99175 0.9999288 0.9920538 -0.99175 0.9999288 0.9920538 -0.99175 0.9999288 0.9920537 -0.9917499 0.9999288 0.9920536 -0.9917499 0.9999288 0.9920535 -0.9917499 0.9999288 0.9920535 -0.9917499 0.9999288 0.9920534 -0.99175 0.9999288 0.9920533 -0.9917502 0.9999288 0.9920533 -0.9917504 0.9999288 0.9920533 -0.9917507 0.9999288 0.9920533 -0.991751 0.9999288 0.9920533 -0.9917515 0.9999288 0.9920533 -0.9917521 0.9999288 0.9920533 -0.9917528 0.9999288 0.9920533 -0.9917537 0.9999288 0.9920533 -0.9917549 0.9999288 0.9920533 -0.9917564 0.9999288 0.9920533 -0.9917582 0.9999288 0.9920533 -0.9917606 0.9999288 0.9920533 -0.9917636 0.9999288 0.9920533 -0.9917674 0.9999288 0.9920533 -0.9917722 0.9999288 0.9920533 -0.9917782 0.9999288 0.9920533 -0.9917859 0.9999288 0.9920533 -0.9917956 0.9999288 0.9920533 -0.9918079 0.9999288 0.9920533 -0.9918234 0.9999288 0.9920533 -0.9918431 0.9999288 0.9920533 -0.991868 0.9999288 0.9920533 -0.9918994 0.9999288 0.9920533 -0.9919392 0.9999288 0.9920533 -0.9919896 0.9999288 0.9920533 -0.9920533 0.9999288 0.9920533 -0.9921339 0.9999288 0.9920533 -0.9922358 0.9999288 0.9920533 -0.9923648 0.9999288 0.9920533 -0.992528 0.9999288 0.9920533 -0.9927345 0.9999288 0.9920533 -0.9929957 0.9999288 0.9920533 -0.9933261 0.9999288 0.9920533 -0.9937442 0.9999288 0.9920533 -0.9942731 0.9999288 0.9920533 -0.9949422 0.9999288 0.9920533 -0.9957887 0.9999288 0.9920533 -0.9968597 0.9999288 0.9920533 -0.9982146 0.9999288 0.9920533 -0.9999288 0.9999288 0.9920533 -0.9999437 0.9985868 0.9936592 -0.9934695 0.9999437 0.9936597 -0.9934695 0.9999437 0.9936596 -0.9934695 0.9999437 0.9936596 -0.9934695 0.9999437 0.9936596 -0.9934695 0.9999437 0.9936596 -0.9934695 0.9999437 0.9936596 -0.9934695 0.9999437 0.9936596 -0.9934694 0.9999437 0.9936596 -0.9934694 0.9999437 0.9936595 -0.9934694 0.9999437 0.9936595 -0.9934694 0.9999437 0.9936595 -0.9934694 0.9999437 0.9936594 -0.9934694 0.9999437 0.9936594 -0.9934694 0.9999437 0.9936593 -0.9934694 0.9999437 0.9936592 -0.9934694 0.9999437 0.9936592 -0.9934695 0.9999437 0.9936592 -0.9934697 0.9999437 0.9936592 -0.9934698 0.9999437 0.9936592 -0.9934701 0.9999437 0.9936592 -0.9934704 0.9999437 0.9936592 -0.9934707 0.9999437 0.9936592 -0.9934712 0.9999437 0.9936592 -0.9934718 0.9999437 0.9936592 -0.9934725 0.9999437 0.9936592 -0.9934734 0.9999437 0.9936592 -0.9934746 0.9999437 0.9936592 -0.9934761 0.9999437 0.9936592 -0.9934779 0.9999437 0.9936592 -0.9934803 0.9999437 0.9936592 -0.9934833 0.9999437 0.9936592 -0.9934871 0.9999437 0.9936592 -0.9934919 0.9999437 0.9936592 -0.993498 0.9999437 0.9936592 -0.9935057 0.9999437 0.9936592 -0.9935154 0.9999437 0.9936592 -0.9935277 0.9999437 0.9936592 -0.9935432 0.9999437 0.9936592 -0.9935629 0.9999437 0.9936592 -0.9935878 0.9999437 0.9936592 -0.9936193 0.9999437 0.9936592 -0.9936592 0.9999437 0.9936592 -0.9937096 0.9999437 0.9936592 -0.9937734 0.9999437 0.9936592 -0.9938541 0.9999437 0.9936592 -0.9939562 0.9999437 0.9936592 -0.9940854 0.9999437 0.9936592 -0.9942488 0.9999437 0.9936592 -0.9944556 0.9999437 0.9936592 -0.9947172 0.9999437 0.9936592 -0.9950481 0.9999437 0.9936592 -0.9954668 0.9999437 0.9936592 -0.9959964 0.9999437 0.9936592 -0.9966665 0.9999437 0.9936592 -0.9975143 0.9999437 0.9936592 -0.9985868 0.9999437 0.9936592 -0.9999437 0.9999437 0.9936592 -0.8462171 0.8462171 0.9984653 -0.8462191 0.8462171 0.9984653 -0.8462218 0.8462171 0.9984653 -0.8462251 0.8462171 0.9984653 -0.8462293 0.8462171 0.9984653 -0.8462346 0.8462171 0.9984653 -0.8462413 0.8462171 0.9984653 -0.8462498 0.8462171 0.9984653 -0.8462605 0.8462171 0.9984653 -0.8462741 0.8462171 0.9984653 -0.8462913 0.8462171 0.9984653 -0.8463131 0.8462171 0.9984653 -0.8463406 0.8462171 0.9984653 -0.8463755 0.8462171 0.9984653 -0.8464195 0.8462171 0.9984653 -0.8464753 0.8462171 0.9984653 -0.8465458 0.8462171 0.9984653 -0.846635 0.8462171 0.9984653 -0.8467479 0.8462171 0.9984653 -0.8468908 0.8462171 0.9984653 -0.8470714 0.8462171 0.9984653 -0.8473 0.8462171 0.9984653 -0.8475892 0.8462171 0.9984653 -0.8479551 0.8462171 0.9984653 -0.848418 0.8462171 0.9984653 -0.8490036 0.8462171 0.9984653 -0.8497444 0.8462171 0.9984653 -0.8506817 0.8462171 0.9984653 -0.8518675 0.8462171 0.9984653 -0.8533677 0.8462171 0.9984653 -0.8552656 0.8462171 0.9984653 -0.8576667 0.8462171 0.9984653 -0.8607044 0.8462171 0.9984653 -0.8645475 0.8462171 0.9984653 -0.8694095 0.8462171 0.9984653 -0.8755606 0.8462171 0.9984653 -0.8833426 0.8462171 0.9984653 -0.8931877 0.8462171 0.9984653 -0.9056431 0.8462171 0.9984653 -0.9214008 0.8462171 0.9984653 -0.9413364 0.8462171 0.9984653 -0.9665574 0.8462171 0.9984653 -0.9984653 0.8462171 0.9984653 -0.9987905 0.8750477 0.972857 -0.9990461 0.8990028 0.961507 -0.9992474 0.9187175 0.9584861 -0.999406 0.9348153 0.9600277 -0.999531 0.9478754 0.9638131 -0.9996296 0.958416 0.9684671 -0.9997074 0.9668873 0.973214 -0.9997689 0.9736726 0.9776489 -0.9998174 0.9790927 0.9815888 -0.9998557 0.9834129 0.9849783 -0.999886 0.9868505 0.9878314 -0.9999099 0.989582 0.9901963 -0.9999288 0.9917501 0.9921346 -0.9999437 0.9934695 0.9937101 -0.8462171 0.8462191 0.9984653 -0.8462154 0.8462154 0.9984653 -0.846218 0.8462154 0.9984653 -0.8462213 0.8462154 0.9984653 -0.8462255 0.8462154 0.9984653 -0.8462308 0.8462154 0.9984653 -0.8462375 0.8462154 0.9984653 -0.846246 0.8462154 0.9984653 -0.8462568 0.8462154 0.9984653 -0.8462703 0.8462154 0.9984653 -0.8462876 0.8462154 0.9984653 -0.8463093 0.8462154 0.9984653 -0.8463368 0.8462154 0.9984653 -0.8463717 0.8462154 0.9984653 -0.8464157 0.8462154 0.9984653 -0.8464715 0.8462154 0.9984653 -0.846542 0.8462154 0.9984653 -0.8466313 0.8462154 0.9984653 -0.8467442 0.8462154 0.9984653 -0.846887 0.8462154 0.9984653 -0.8470677 0.8462154 0.9984653 -0.8472963 0.8462154 0.9984653 -0.8475855 0.8462154 0.9984653 -0.8479514 0.8462154 0.9984653 -0.8484142 0.8462154 0.9984653 -0.8489999 0.8462154 0.9984653 -0.8497407 0.8462154 0.9984653 -0.850678 0.8462154 0.9984653 -0.8518639 0.8462154 0.9984653 -0.8533641 0.8462154 0.9984653 -0.855262 0.8462154 0.9984653 -0.8576632 0.8462154 0.9984653 -0.860701 0.8462154 0.9984653 -0.8645442 0.8462154 0.9984653 -0.8694063 0.8462154 0.9984653 -0.8755576 0.8462154 0.9984653 -0.8833397 0.8462154 0.9984653 -0.8931851 0.8462154 0.9984653 -0.9056408 0.8462154 0.9984653 -0.9213989 0.8462154 0.9984653 -0.9413349 0.8462154 0.9984653 -0.9665566 0.8462154 0.9984653 -0.9984653 0.8462154 0.9984653 -0.9987905 0.8750466 0.9728564 -0.9990461 0.899002 0.9615064 -0.9992474 0.918717 0.9584856 -0.999406 0.9348149 0.9600273 -0.999531 0.9478752 0.9638128 -0.9996296 0.9584159 0.9684669 -0.9997074 0.9668872 0.9732139 -0.9997689 0.9736726 0.9776488 -0.9998174 0.9790927 0.9815887 -0.9998557 0.9834129 0.9849782 -0.999886 0.9868505 0.9878314 -0.9999099 0.989582 0.9901963 -0.9999288 0.9917501 0.9921346 -0.9999437 0.9934695 0.9937101 -0.8462171 0.8462218 0.9984653 -0.8462154 0.846218 0.9984653 -0.8462132 0.8462132 0.9984653 -0.8462165 0.8462132 0.9984653 -0.8462207 0.8462132 0.9984653 -0.846226 0.8462132 0.9984653 -0.8462328 0.8462132 0.9984653 -0.8462413 0.8462132 0.9984653 -0.846252 0.8462132 0.9984653 -0.8462656 0.8462132 0.9984653 -0.8462828 0.8462132 0.9984653 -0.8463046 0.8462132 0.9984653 -0.8463321 0.8462132 0.9984653 -0.8463669 0.8462132 0.9984653 -0.846411 0.8462132 0.9984653 -0.8464668 0.8462132 0.9984653 -0.8465373 0.8462132 0.9984653 -0.8466265 0.8462132 0.9984653 -0.8467394 0.8462132 0.9984653 -0.8468823 0.8462132 0.9984653 -0.8470629 0.8462132 0.9984653 -0.8472916 0.8462132 0.9984653 -0.8475808 0.8462132 0.9984653 -0.8479467 0.8462132 0.9984653 -0.8484096 0.8462132 0.9984653 -0.8489952 0.8462132 0.9984653 -0.8497361 0.8462132 0.9984653 -0.8506734 0.8462132 0.9984653 -0.8518593 0.8462132 0.9984653 -0.8533595 0.8462132 0.9984653 -0.8552576 0.8462132 0.9984653 -0.8576588 0.8462132 0.9984653 -0.8606967 0.8462132 0.9984653 -0.86454 0.8462132 0.9984653 -0.8694023 0.8462132 0.9984653 -0.8755537 0.8462132 0.9984653 -0.8833361 0.8462132 0.9984653 -0.8931818 0.8462132 0.9984653 -0.9056379 0.8462132 0.9984653 -0.9213965 0.8462132 0.9984653 -0.9413331 0.8462132 0.9984653 -0.9665556 0.8462132 0.9984653 -0.9984653 0.8462132 0.9984653 -0.9987904 0.8750451 0.9728558 -0.9990461 0.8990011 0.9615057 -0.9992474 0.9187164 0.9584849 -0.999406 0.9348146 0.9600268 -0.999531 0.947875 0.9638125 -0.9996296 0.9584157 0.9684666 -0.9997074 0.9668871 0.9732137 -0.9997689 0.9736725 0.9776487 -0.9998174 0.9790927 0.9815886 -0.9998557 0.9834129 0.9849782 -0.999886 0.9868505 0.9878313 -0.9999099 0.989582 0.9901963 -0.9999288 0.9917501 0.9921346 -0.9999437 0.9934695 0.9937101 -0.8462171 0.8462251 0.9984653 -0.8462154 0.8462213 0.9984653 -0.8462132 0.8462165 0.9984653 -0.8462106 0.8462106 0.9984653 -0.8462148 0.8462106 0.9984653 -0.8462201 0.8462106 0.9984653 -0.8462268 0.8462106 0.9984653 -0.8462353 0.8462106 0.9984653 -0.846246 0.8462106 0.9984653 -0.8462596 0.8462106 0.9984653 -0.8462768 0.8462106 0.9984653 -0.8462986 0.8462106 0.9984653 -0.8463261 0.8462106 0.9984653 -0.846361 0.8462106 0.9984653 -0.8464051 0.8462106 0.9984653 -0.8464608 0.8462106 0.9984653 -0.8465313 0.8462106 0.9984653 -0.8466206 0.8462106 0.9984653 -0.8467335 0.8462106 0.9984653 -0.8468763 0.8462106 0.9984653 -0.847057 0.8462106 0.9984653 -0.8472856 0.8462106 0.9984653 -0.8475749 0.8462106 0.9984653 -0.8479408 0.8462106 0.9984653 -0.8484037 0.8462106 0.9984653 -0.8489893 0.8462106 0.9984653 -0.8497303 0.8462106 0.9984653 -0.8506676 0.8462106 0.9984653 -0.8518535 0.8462106 0.9984653 -0.8533539 0.8462106 0.9984653 -0.855252 0.8462106 0.9984653 -0.8576533 0.8462106 0.9984653 -0.8606913 0.8462106 0.9984653 -0.8645348 0.8462106 0.9984653 -0.8693972 0.8462106 0.9984653 -0.8755489 0.8462106 0.9984653 -0.8833316 0.8462106 0.9984653 -0.8931777 0.8462106 0.9984653 -0.9056342 0.8462106 0.9984653 -0.9213934 0.8462106 0.9984653 -0.9413309 0.8462106 0.9984653 -0.9665543 0.8462106 0.9984653 -0.9984653 0.8462106 0.9984653 -0.9987904 0.8750434 0.972855 -0.9990461 0.899 0.9615047 -0.9992474 0.9187157 0.9584841 -0.999406 0.9348141 0.9600262 -0.999531 0.9478746 0.963812 -0.9996296 0.9584155 0.9684663 -0.9997074 0.966887 0.9732135 -0.9997689 0.9736724 0.9776486 -0.9998174 0.9790926 0.9815885 -0.9998557 0.9834129 0.9849781 -0.999886 0.9868505 0.9878313 -0.9999099 0.989582 0.9901962 -0.9999288 0.9917501 0.9921346 -0.9999437 0.9934695 0.9937101 -0.8462171 0.8462293 0.9984653 -0.8462154 0.8462255 0.9984653 -0.8462132 0.8462207 0.9984653 -0.8462106 0.8462148 0.9984653 -0.8462073 0.8462073 0.9984652 -0.8462126 0.8462073 0.9984652 -0.8462194 0.8462073 0.9984652 -0.8462279 0.8462073 0.9984652 -0.8462386 0.8462073 0.9984652 -0.8462522 0.8462073 0.9984652 -0.8462694 0.8462073 0.9984652 -0.8462912 0.8462073 0.9984652 -0.8463187 0.8462073 0.9984652 -0.8463535 0.8462073 0.9984652 -0.8463976 0.8462073 0.9984652 -0.8464534 0.8462073 0.9984652 -0.8465239 0.8462073 0.9984652 -0.8466132 0.8462073 0.9984652 -0.8467261 0.8462073 0.9984652 -0.8468689 0.8462073 0.9984652 -0.8470496 0.8462073 0.9984652 -0.8472782 0.8462073 0.9984652 -0.8475675 0.8462073 0.9984652 -0.8479334 0.8462073 0.9984652 -0.8483964 0.8462073 0.9984652 -0.848982 0.8462073 0.9984652 -0.849723 0.8462073 0.9984652 -0.8506604 0.8462073 0.9984652 -0.8518464 0.8462073 0.9984652 -0.8533468 0.8462073 0.9984652 -0.8552449 0.8462073 0.9984652 -0.8576464 0.8462073 0.9984652 -0.8606845 0.8462073 0.9984652 -0.8645282 0.8462073 0.9984652 -0.8693909 0.8462073 0.9984652 -0.8755429 0.8462073 0.9984652 -0.8833259 0.8462073 0.9984652 -0.8931725 0.8462073 0.9984652 -0.9056297 0.8462073 0.9984652 -0.9213897 0.8462073 0.9984652 -0.9413281 0.8462073 0.9984652 -0.9665527 0.8462073 0.9984652 -0.9984652 0.8462073 0.9984652 -0.9987904 0.8750412 0.9728539 -0.9990461 0.8989986 0.9615035 -0.9992474 0.9187148 0.9584831 -0.999406 0.9348135 0.9600254 -0.999531 0.9478743 0.9638114 -0.9996296 0.9584153 0.9684659 -0.9997074 0.9668869 0.9732132 -0.9997689 0.9736723 0.9776484 -0.9998174 0.9790925 0.9815884 -0.9998557 0.9834128 0.984978 -0.999886 0.9868504 0.9878313 -0.9999099 0.989582 0.9901962 -0.9999288 0.9917501 0.9921345 -0.9999437 0.9934695 0.99371 -0.8462171 0.8462346 0.9984653 -0.8462154 0.8462308 0.9984653 -0.8462132 0.846226 0.9984653 -0.8462106 0.8462201 0.9984653 -0.8462073 0.8462126 0.9984652 -0.8462034 0.8462034 0.9984652 -0.8462101 0.8462034 0.9984652 -0.8462186 0.8462034 0.9984652 -0.8462293 0.8462034 0.9984652 -0.8462429 0.8462034 0.9984652 -0.8462601 0.8462034 0.9984652 -0.8462819 0.8462034 0.9984652 -0.8463094 0.8462034 0.9984652 -0.8463443 0.8462034 0.9984652 -0.8463884 0.8462034 0.9984652 -0.8464441 0.8462034 0.9984652 -0.8465147 0.8462034 0.9984652 -0.8466039 0.8462034 0.9984652 -0.8467168 0.8462034 0.9984652 -0.8468597 0.8462034 0.9984652 -0.8470404 0.8462034 0.9984652 -0.847269 0.8462034 0.9984652 -0.8475583 0.8462034 0.9984652 -0.8479242 0.8462034 0.9984652 -0.8483872 0.8462034 0.9984652 -0.8489729 0.8462034 0.9984652 -0.8497139 0.8462034 0.9984652 -0.8506514 0.8462034 0.9984652 -0.8518374 0.8462034 0.9984652 -0.8533379 0.8462034 0.9984652 -0.8552362 0.8462034 0.9984652 -0.8576378 0.8462034 0.9984652 -0.8606762 0.8462034 0.9984652 -0.86452 0.8462034 0.9984652 -0.8693831 0.8462034 0.9984652 -0.8755354 0.8462034 0.9984652 -0.8833189 0.8462034 0.9984652 -0.8931661 0.8462034 0.9984652 -0.905624 0.8462034 0.9984652 -0.9213849 0.8462034 0.9984652 -0.9413245 0.8462034 0.9984652 -0.9665507 0.8462034 0.9984652 -0.9984652 0.8462034 0.9984652 -0.9987904 0.8750386 0.9728526 -0.9990461 0.8989969 0.9615021 -0.9992474 0.9187137 0.9584818 -0.9994059 0.9348128 0.9600245 -0.999531 0.9478738 0.9638107 -0.9996296 0.958415 0.9684654 -0.9997074 0.9668867 0.9732129 -0.9997689 0.9736722 0.9776482 -0.9998174 0.9790925 0.9815883 -0.9998557 0.9834128 0.9849779 -0.999886 0.9868504 0.9878312 -0.9999099 0.9895819 0.9901962 -0.9999288 0.9917501 0.9921345 -0.9999437 0.9934695 0.99371 -0.8462171 0.8462413 0.9984653 -0.8462154 0.8462375 0.9984653 -0.8462132 0.8462328 0.9984653 -0.8462106 0.8462268 0.9984653 -0.8462073 0.8462194 0.9984652 -0.8462034 0.8462101 0.9984652 -0.8461986 0.8461986 0.9984651 -0.8462071 0.8461986 0.9984651 -0.8462179 0.8461986 0.9984651 -0.8462315 0.8461986 0.9984651 -0.8462487 0.8461986 0.9984651 -0.8462704 0.8461986 0.9984651 -0.846298 0.8461986 0.9984651 -0.8463328 0.8461986 0.9984651 -0.8463769 0.8461986 0.9984651 -0.8464327 0.8461986 0.9984651 -0.8465032 0.8461986 0.9984651 -0.8465925 0.8461986 0.9984651 -0.8467054 0.8461986 0.9984651 -0.8468482 0.8461986 0.9984651 -0.847029 0.8461986 0.9984651 -0.8472576 0.8461986 0.9984651 -0.8475469 0.8461986 0.9984651 -0.8479129 0.8461986 0.9984651 -0.8483759 0.8461986 0.9984651 -0.8489617 0.8461986 0.9984651 -0.8497027 0.8461986 0.9984651 -0.8506403 0.8461986 0.9984651 -0.8518264 0.8461986 0.9984651 -0.853327 0.8461986 0.9984651 -0.8552254 0.8461986 0.9984651 -0.8576272 0.8461986 0.9984651 -0.8606658 0.8461986 0.9984651 -0.8645099 0.8461986 0.9984651 -0.8693733 0.8461986 0.9984651 -0.8755261 0.8461986 0.9984651 -0.8833102 0.8461986 0.9984651 -0.8931581 0.8461986 0.9984651 -0.905617 0.8461986 0.9984651 -0.9213791 0.8461986 0.9984651 -0.9413202 0.8461986 0.9984651 -0.9665483 0.8461986 0.9984651 -0.9984651 0.8461986 0.9984651 -0.9987903 0.8750355 0.972851 -0.9990461 0.8989948 0.9615002 -0.9992473 0.9187123 0.9584803 -0.9994059 0.9348119 0.9600233 -0.999531 0.9478733 0.9638099 -0.9996296 0.9584146 0.9684648 -0.9997074 0.9668865 0.9732125 -0.9997689 0.9736721 0.9776479 -0.9998174 0.9790924 0.9815881 -0.9998557 0.9834127 0.9849778 -0.999886 0.9868504 0.9878311 -0.9999099 0.9895819 0.9901961 -0.9999288 0.99175 0.9921345 -0.9999437 0.9934695 0.99371 -0.8462171 0.8462498 0.9984653 -0.8462154 0.846246 0.9984653 -0.8462132 0.8462413 0.9984653 -0.8462106 0.8462353 0.9984653 -0.8462073 0.8462279 0.9984652 -0.8462034 0.8462186 0.9984652 -0.8461986 0.8462071 0.9984651 -0.8461929 0.8461929 0.998465 -0.8462037 0.8461929 0.998465 -0.8462173 0.8461929 0.998465 -0.8462345 0.8461929 0.998465 -0.8462563 0.8461929 0.998465 -0.8462838 0.8461929 0.998465 -0.8463187 0.8461929 0.998465 -0.8463627 0.8461929 0.998465 -0.8464185 0.8461929 0.998465 -0.8464891 0.8461929 0.998465 -0.8465783 0.8461929 0.998465 -0.8466913 0.8461929 0.998465 -0.8468341 0.8461929 0.998465 -0.8470149 0.8461929 0.998465 -0.8472436 0.8461929 0.998465 -0.8475329 0.8461929 0.998465 -0.8478989 0.8461929 0.998465 -0.8483619 0.8461929 0.998465 -0.8489478 0.8461929 0.998465 -0.8496889 0.8461929 0.998465 -0.8506265 0.8461929 0.998465 -0.8518127 0.8461929 0.998465 -0.8533135 0.8461929 0.998465 -0.8552121 0.8461929 0.998465 -0.8576141 0.8461929 0.998465 -0.8606529 0.8461929 0.998465 -0.8644975 0.8461929 0.998465 -0.8693613 0.8461929 0.998465 -0.8755147 0.8461929 0.998465 -0.8832995 0.8461929 0.998465 -0.8931483 0.8461929 0.998465 -0.9056083 0.8461929 0.998465 -0.9213719 0.8461929 0.998465 -0.9413148 0.8461929 0.998465 -0.9665453 0.8461929 0.998465 -0.998465 0.8461929 0.998465 -0.9987903 0.8750317 0.9728491 -0.999046 0.8989923 0.961498 -0.9992473 0.9187107 0.9584783 -0.9994059 0.9348109 0.9600218 -0.999531 0.9478726 0.9638088 -0.9996296 0.9584142 0.9684641 -0.9997074 0.9668862 0.973212 -0.9997689 0.9736719 0.9776476 -0.9998174 0.9790923 0.9815879 -0.9998557 0.9834127 0.9849777 -0.999886 0.9868503 0.987831 -0.9999099 0.9895819 0.9901961 -0.9999288 0.99175 0.9921345 -0.9999437 0.9934694 0.99371 -0.8462171 0.8462605 0.9984653 -0.8462154 0.8462568 0.9984653 -0.8462132 0.846252 0.9984653 -0.8462106 0.846246 0.9984653 -0.8462073 0.8462386 0.9984652 -0.8462034 0.8462293 0.9984652 -0.8461986 0.8462179 0.9984651 -0.8461929 0.8462037 0.998465 -0.8461864 0.8461864 0.9984649 -0.8462 0.8461864 0.9984649 -0.8462172 0.8461864 0.9984649 -0.846239 0.8461864 0.9984649 -0.8462665 0.8461864 0.9984649 -0.8463014 0.8461864 0.9984649 -0.8463455 0.8461864 0.9984649 -0.8464012 0.8461864 0.9984649 -0.8464718 0.8461864 0.9984649 -0.8465611 0.8461864 0.9984649 -0.846674 0.8461864 0.9984649 -0.8468169 0.8461864 0.9984649 -0.8469977 0.8461864 0.9984649 -0.8472264 0.8461864 0.9984649 -0.8475157 0.8461864 0.9984649 -0.8478818 0.8461864 0.9984649 -0.8483449 0.8461864 0.9984649 -0.8489308 0.8461864 0.9984649 -0.849672 0.8461864 0.9984649 -0.8506097 0.8461864 0.9984649 -0.8517961 0.8461864 0.9984649 -0.853297 0.8461864 0.9984649 -0.8551958 0.8461864 0.9984649 -0.8575981 0.8461864 0.9984649 -0.8606373 0.8461864 0.9984649 -0.8644822 0.8461864 0.9984649 -0.8693466 0.8461864 0.9984649 -0.8755007 0.8461864 0.9984649 -0.8832864 0.8461864 0.9984649 -0.8931363 0.8461864 0.9984649 -0.9055977 0.8461864 0.9984649 -0.9213631 0.8461864 0.9984649 -0.9413083 0.8461864 0.9984649 -0.9665416 0.8461864 0.9984649 -0.9984649 0.8461864 0.9984649 -0.9987902 0.8750274 0.9728467 -0.999046 0.8989895 0.9614952 -0.9992473 0.9187089 0.9584759 -0.9994059 0.9348097 0.9600199 -0.999531 0.9478718 0.9638075 -0.9996296 0.9584137 0.9684632 -0.9997074 0.9668859 0.9732114 -0.9997689 0.9736717 0.9776472 -0.9998174 0.9790921 0.9815876 -0.9998557 0.9834126 0.9849775 -0.999886 0.9868503 0.9878309 -0.9999099 0.9895819 0.990196 -0.9999288 0.99175 0.9921344 -0.9999437 0.9934694 0.99371 -0.8462171 0.8462741 0.9984653 -0.8462154 0.8462703 0.9984653 -0.8462132 0.8462656 0.9984653 -0.8462106 0.8462596 0.9984653 -0.8462073 0.8462522 0.9984652 -0.8462034 0.8462429 0.9984652 -0.8461986 0.8462315 0.9984651 -0.8461929 0.8462173 0.998465 -0.8461864 0.8462 0.9984649 -0.8461791 0.8461791 0.9984648 -0.8461963 0.8461791 0.9984648 -0.8462181 0.8461791 0.9984648 -0.8462456 0.8461791 0.9984648 -0.8462805 0.8461791 0.9984648 -0.8463246 0.8461791 0.9984648 -0.8463803 0.8461791 0.9984648 -0.8464509 0.8461791 0.9984648 -0.8465402 0.8461791 0.9984648 -0.8466532 0.8461791 0.9984648 -0.8467961 0.8461791 0.9984648 -0.8469769 0.8461791 0.9984648 -0.8472056 0.8461791 0.9984648 -0.847495 0.8461791 0.9984648 -0.8478611 0.8461791 0.9984648 -0.8483242 0.8461791 0.9984648 -0.8489102 0.8461791 0.9984648 -0.8496515 0.8461791 0.9984648 -0.8505894 0.8461791 0.9984648 -0.8517759 0.8461791 0.9984648 -0.853277 0.8461791 0.9984648 -0.8551761 0.8461791 0.9984648 -0.8575787 0.8461791 0.9984648 -0.8606183 0.8461791 0.9984648 -0.8644638 0.8461791 0.9984648 -0.8693288 0.8461791 0.9984648 -0.8754838 0.8461791 0.9984648 -0.8832705 0.8461791 0.9984648 -0.8931218 0.8461791 0.9984648 -0.9055849 0.8461791 0.9984648 -0.9213524 0.8461791 0.9984648 -0.9413004 0.8461791 0.9984648 -0.9665371 0.8461791 0.9984648 -0.9984648 0.8461791 0.9984648 -0.9987902 0.8750225 0.9728437 -0.9990459 0.8989863 0.9614919 -0.9992473 0.9187068 0.9584731 -0.9994059 0.9348083 0.9600177 -0.9995309 0.947871 0.9638059 -0.9996296 0.9584132 0.9684621 -0.9997074 0.9668855 0.9732106 -0.9997689 0.9736715 0.9776467 -0.9998174 0.979092 0.9815873 -0.9998557 0.9834125 0.9849773 -0.999886 0.9868502 0.9878308 -0.9999099 0.9895818 0.9901959 -0.9999288 0.99175 0.9921344 -0.9999437 0.9934694 0.9937099 -0.8462171 0.8462913 0.9984653 -0.8462154 0.8462876 0.9984653 -0.8462132 0.8462828 0.9984653 -0.8462106 0.8462768 0.9984653 -0.8462073 0.8462694 0.9984652 -0.8462034 0.8462601 0.9984652 -0.8461986 0.8462487 0.9984651 -0.8461929 0.8462345 0.998465 -0.8461864 0.8462172 0.9984649 -0.8461791 0.8461963 0.9984648 -0.8461714 0.8461714 0.9984647 -0.8461932 0.8461714 0.9984647 -0.8462207 0.8461714 0.9984647 -0.8462556 0.8461714 0.9984647 -0.8462997 0.8461714 0.9984647 -0.8463555 0.8461714 0.9984647 -0.846426 0.8461714 0.9984647 -0.8465153 0.8461714 0.9984647 -0.8466283 0.8461714 0.9984647 -0.8467713 0.8461714 0.9984647 -0.8469521 0.8461714 0.9984647 -0.8471809 0.8461714 0.9984647 -0.8474703 0.8461714 0.9984647 -0.8478364 0.8461714 0.9984647 -0.8482997 0.8461714 0.9984647 -0.8488857 0.8461714 0.9984647 -0.8496272 0.8461714 0.9984647 -0.8505652 0.8461714 0.9984647 -0.8517519 0.8461714 0.9984647 -0.8532533 0.8461714 0.9984647 -0.8551527 0.8461714 0.9984647 -0.8575557 0.8461714 0.9984647 -0.8605957 0.8461714 0.9984647 -0.8644419 0.8461714 0.9984647 -0.8693077 0.8461714 0.9984647 -0.8754636 0.8461714 0.9984647 -0.8832516 0.8461714 0.9984647 -0.8931045 0.8461714 0.9984647 -0.9055697 0.8461714 0.9984647 -0.9213397 0.8461714 0.9984647 -0.9412909 0.8461714 0.9984647 -0.9665318 0.8461714 0.9984647 -0.9984647 0.8461714 0.9984647 -0.9987901 0.8750173 0.9728403 -0.9990459 0.8989829 0.961488 -0.9992472 0.9187045 0.9584696 -0.9994059 0.9348069 0.9600151 -0.9995309 0.94787 0.963804 -0.9996296 0.9584126 0.9684608 -0.9997074 0.9668852 0.9732098 -0.9997689 0.9736712 0.9776461 -0.9998174 0.9790919 0.9815869 -0.9998557 0.9834124 0.9849771 -0.999886 0.9868502 0.9878306 -0.9999099 0.9895818 0.9901958 -0.9999288 0.99175 0.9921343 -0.9999437 0.9934694 0.9937099 -0.8462171 0.8463131 0.9984653 -0.8462154 0.8463093 0.9984653 -0.8462132 0.8463046 0.9984653 -0.8462106 0.8462986 0.9984653 -0.8462073 0.8462912 0.9984652 -0.8462034 0.8462819 0.9984652 -0.8461986 0.8462704 0.9984651 -0.8461929 0.8462563 0.998465 -0.8461864 0.846239 0.9984649 -0.8461791 0.8462181 0.9984648 -0.8461714 0.8461932 0.9984647 -0.8461641 0.8461641 0.9984645 -0.8461917 0.8461641 0.9984645 -0.8462265 0.8461641 0.9984645 -0.8462707 0.8461641 0.9984645 -0.8463265 0.8461641 0.9984645 -0.8463971 0.8461641 0.9984645 -0.8464864 0.8461641 0.9984645 -0.8465994 0.8461641 0.9984645 -0.8467423 0.8461641 0.9984645 -0.8469232 0.8461641 0.9984645 -0.847152 0.8461641 0.9984645 -0.8474415 0.8461641 0.9984645 -0.8478077 0.8461641 0.9984645 -0.848271 0.8461641 0.9984645 -0.8488572 0.8461641 0.9984645 -0.8495988 0.8461641 0.9984645 -0.850537 0.8461641 0.9984645 -0.8517239 0.8461641 0.9984645 -0.8532256 0.8461641 0.9984645 -0.8551253 0.8461641 0.9984645 -0.8575288 0.8461641 0.9984645 -0.8605694 0.8461641 0.9984645 -0.8644163 0.8461641 0.9984645 -0.869283 0.8461641 0.9984645 -0.8754401 0.8461641 0.9984645 -0.8832296 0.8461641 0.9984645 -0.8930844 0.8461641 0.9984645 -0.9055519 0.8461641 0.9984645 -0.921325 0.8461641 0.9984645 -0.9412799 0.8461641 0.9984645 -0.9665255 0.8461641 0.9984645 -0.9984645 0.8461641 0.9984645 -0.99879 0.8750124 0.9728362 -0.9990458 0.8989796 0.9614833 -0.9992472 0.9187024 0.9584657 -0.9994059 0.9348055 0.9600121 -0.9995309 0.9478691 0.9638018 -0.9996296 0.958412 0.9684592 -0.9997074 0.9668848 0.9732087 -0.9997689 0.973671 0.9776454 -0.9998174 0.9790917 0.9815865 -0.9998557 0.9834123 0.9849768 -0.999886 0.9868501 0.9878304 -0.9999099 0.9895818 0.9901957 -0.9999288 0.9917499 0.9921342 -0.9999437 0.9934694 0.9937098 -0.8462171 0.8463406 0.9984653 -0.8462154 0.8463368 0.9984653 -0.8462132 0.8463321 0.9984653 -0.8462106 0.8463261 0.9984653 -0.8462073 0.8463187 0.9984652 -0.8462034 0.8463094 0.9984652 -0.8461986 0.846298 0.9984651 -0.8461929 0.8462838 0.998465 -0.8461864 0.8462665 0.9984649 -0.8461791 0.8462456 0.9984648 -0.8461714 0.8462207 0.9984647 -0.8461641 0.8461917 0.9984645 -0.8461589 0.8461589 0.9984643 -0.8461938 0.8461589 0.9984643 -0.8462379 0.8461589 0.9984643 -0.8462937 0.8461589 0.9984643 -0.8463643 0.8461589 0.9984643 -0.8464537 0.8461589 0.9984643 -0.8465667 0.8461589 0.9984643 -0.8467097 0.8461589 0.9984643 -0.8468906 0.8461589 0.9984643 -0.8471195 0.8461589 0.9984643 -0.847409 0.8461589 0.9984643 -0.8477753 0.8461589 0.9984643 -0.8482387 0.8461589 0.9984643 -0.848825 0.8461589 0.9984643 -0.8495668 0.8461589 0.9984643 -0.8505052 0.8461589 0.9984643 -0.8516924 0.8461589 0.9984643 -0.8531943 0.8461589 0.9984643 -0.8550945 0.8461589 0.9984643 -0.8574984 0.8461589 0.9984643 -0.8605398 0.8461589 0.9984643 -0.8643874 0.8461589 0.9984643 -0.8692552 0.8461589 0.9984643 -0.8754136 0.8461589 0.9984643 -0.8832048 0.8461589 0.9984643 -0.8930617 0.8461589 0.9984643 -0.9055319 0.8461589 0.9984643 -0.9213083 0.8461589 0.9984643 -0.9412675 0.8461589 0.9984643 -0.9665185 0.8461589 0.9984643 -0.9984643 0.8461589 0.9984643 -0.9987899 0.8750088 0.9728317 -0.9990458 0.8989771 0.9614781 -0.9992472 0.9187008 0.9584612 -0.9994058 0.9348044 0.9600086 -0.9995309 0.9478684 0.9637993 -0.9996296 0.9584115 0.9684575 -0.9997074 0.9668845 0.9732076 -0.9997689 0.9736708 0.9776447 -0.9998174 0.9790916 0.981586 -0.9998557 0.9834122 0.9849765 -0.999886 0.9868501 0.9878302 -0.9999099 0.9895817 0.9901956 -0.9999288 0.9917499 0.9921341 -0.9999437 0.9934694 0.9937098 -0.8462171 0.8463755 0.9984653 -0.8462154 0.8463717 0.9984653 -0.8462132 0.8463669 0.9984653 -0.8462106 0.846361 0.9984653 -0.8462073 0.8463535 0.9984652 -0.8462034 0.8463443 0.9984652 -0.8461986 0.8463328 0.9984651 -0.8461929 0.8463187 0.998465 -0.8461864 0.8463014 0.9984649 -0.8461791 0.8462805 0.9984648 -0.8461714 0.8462556 0.9984647 -0.8461641 0.8462265 0.9984645 -0.8461589 0.8461938 0.9984643 -0.8461587 0.8461587 0.9984642 -0.8462029 0.8461587 0.9984642 -0.8462587 0.8461587 0.9984642 -0.8463293 0.8461587 0.9984642 -0.8464187 0.8461587 0.9984642 -0.8465317 0.8461587 0.9984642 -0.8466748 0.8461587 0.9984642 -0.8468557 0.8461587 0.9984642 -0.8470846 0.8461587 0.9984642 -0.8473742 0.8461587 0.9984642 -0.8477406 0.8461587 0.9984642 -0.8482042 0.8461587 0.9984642 -0.8487906 0.8461587 0.9984642 -0.8495325 0.8461587 0.9984642 -0.8504711 0.8461587 0.9984642 -0.8516586 0.8461587 0.9984642 -0.8531609 0.8461587 0.9984642 -0.8550615 0.8461587 0.9984642 -0.857466 0.8461587 0.9984642 -0.860508 0.8461587 0.9984642 -0.8643565 0.8461587 0.9984642 -0.8692255 0.8461587 0.9984642 -0.8753853 0.8461587 0.9984642 -0.8831782 0.8461587 0.9984642 -0.8930373 0.8461587 0.9984642 -0.9055104 0.8461587 0.9984642 -0.9212904 0.8461587 0.9984642 -0.9412542 0.8461587 0.9984642 -0.966511 0.8461587 0.9984642 -0.9984642 0.8461587 0.9984642 -0.9987897 0.8750084 0.9728268 -0.9990457 0.8989767 0.9614726 -0.9992471 0.9187004 0.9584564 -0.9994058 0.9348042 0.9600049 -0.9995309 0.9478683 0.9637967 -0.9996295 0.9584114 0.9684557 -0.9997074 0.9668844 0.9732063 -0.9997689 0.9736708 0.9776438 -0.9998174 0.9790916 0.9815855 -0.9998557 0.9834122 0.9849761 -0.999886 0.98685 0.98783 -0.9999099 0.9895817 0.9901954 -0.9999288 0.9917499 0.992134 -0.9999437 0.9934694 0.9937097 -0.8462171 0.8464195 0.9984653 -0.8462154 0.8464157 0.9984653 -0.8462132 0.846411 0.9984653 -0.8462106 0.8464051 0.9984653 -0.8462073 0.8463976 0.9984652 -0.8462034 0.8463884 0.9984652 -0.8461986 0.8463769 0.9984651 -0.8461929 0.8463627 0.998465 -0.8461864 0.8463455 0.9984649 -0.8461791 0.8463246 0.9984648 -0.8461714 0.8462997 0.9984647 -0.8461641 0.8462707 0.9984645 -0.8461589 0.8462379 0.9984643 -0.8461587 0.8462029 0.9984642 -0.8461687 0.8461687 0.998464 -0.8462246 0.8461687 0.998464 -0.8462952 0.8461687 0.998464 -0.8463846 0.8461687 0.998464 -0.8464977 0.8461687 0.998464 -0.8466407 0.8461687 0.998464 -0.8468217 0.8461687 0.998464 -0.8470507 0.8461687 0.998464 -0.8473404 0.8461687 0.998464 -0.8477068 0.8461687 0.998464 -0.8481705 0.8461687 0.998464 -0.848757 0.8461687 0.998464 -0.8494991 0.8461687 0.998464 -0.8504379 0.8461687 0.998464 -0.8516256 0.8461687 0.998464 -0.8531283 0.8461687 0.998464 -0.8550293 0.8461687 0.998464 -0.8574344 0.8461687 0.998464 -0.860477 0.8461687 0.998464 -0.8643265 0.8461687 0.998464 -0.8691965 0.8461687 0.998464 -0.8753576 0.8461687 0.998464 -0.8831523 0.8461687 0.998464 -0.8930136 0.8461687 0.998464 -0.9054895 0.8461687 0.998464 -0.921273 0.8461687 0.998464 -0.9412413 0.8461687 0.998464 -0.9665037 0.8461687 0.998464 -0.998464 0.8461687 0.998464 -0.9987896 0.8750145 0.9728221 -0.9990456 0.8989805 0.9614671 -0.9992471 0.9187027 0.9584517 -0.9994058 0.9348056 0.9600013 -0.9995309 0.9478691 0.9637941 -0.9996295 0.958412 0.9684539 -0.9997074 0.9668847 0.9732051 -0.9997688 0.973671 0.977643 -0.9998174 0.9790917 0.9815849 -0.9998557 0.9834123 0.9849758 -0.999886 0.9868501 0.9878298 -0.9999099 0.9895817 0.9901953 -0.9999288 0.9917499 0.992134 -0.9999437 0.9934694 0.9937097 -0.8462171 0.8464753 0.9984653 -0.8462154 0.8464715 0.9984653 -0.8462132 0.8464668 0.9984653 -0.8462106 0.8464608 0.9984653 -0.8462073 0.8464534 0.9984652 -0.8462034 0.8464441 0.9984652 -0.8461986 0.8464327 0.9984651 -0.8461929 0.8464185 0.998465 -0.8461864 0.8464012 0.9984649 -0.8461791 0.8463803 0.9984648 -0.8461714 0.8463555 0.9984647 -0.8461641 0.8463265 0.9984645 -0.8461589 0.8462937 0.9984643 -0.8461587 0.8462587 0.9984642 -0.8461687 0.8462246 0.998464 -0.8461977 0.8461977 0.9984638 -0.8462684 0.8461977 0.9984638 -0.8463578 0.8461977 0.9984638 -0.8464709 0.8461977 0.9984638 -0.846614 0.8461977 0.9984638 -0.846795 0.8461977 0.9984638 -0.847024 0.8461977 0.9984638 -0.8473137 0.8461977 0.9984638 -0.8476802 0.8461977 0.9984638 -0.848144 0.8461977 0.9984638 -0.8487306 0.8461977 0.9984638 -0.8494728 0.8461977 0.9984638 -0.8504118 0.8461977 0.9984638 -0.8515998 0.8461977 0.9984638 -0.8531027 0.8461977 0.9984638 -0.855004 0.8461977 0.9984638 -0.8574095 0.8461977 0.9984638 -0.8604527 0.8461977 0.9984638 -0.8643028 0.8461977 0.9984638 -0.8691736 0.8461977 0.9984638 -0.8753359 0.8461977 0.9984638 -0.883132 0.8461977 0.9984638 -0.892995 0.8461977 0.9984638 -0.905473 0.8461977 0.9984638 -0.9212593 0.8461977 0.9984638 -0.9412311 0.8461977 0.9984638 -0.966498 0.8461977 0.9984638 -0.9984638 0.8461977 0.9984638 -0.9987895 0.8750329 0.9728183 -0.9990456 0.8989921 0.9614628 -0.999247 0.9187101 0.958448 -0.9994057 0.9348102 0.9599985 -0.9995309 0.947872 0.963792 -0.9996295 0.9584138 0.9684525 -0.9997074 0.9668859 0.9732042 -0.9997688 0.9736717 0.9776424 -0.9998174 0.9790921 0.9815845 -0.9998557 0.9834126 0.9849755 -0.999886 0.9868503 0.9878296 -0.9999099 0.9895819 0.9901952 -0.9999288 0.99175 0.9921339 -0.9999437 0.9934694 0.9937096 -0.8462171 0.8465458 0.9984653 -0.8462154 0.846542 0.9984653 -0.8462132 0.8465373 0.9984653 -0.8462106 0.8465313 0.9984653 -0.8462073 0.8465239 0.9984652 -0.8462034 0.8465147 0.9984652 -0.8461986 0.8465032 0.9984651 -0.8461929 0.8464891 0.998465 -0.8461864 0.8464718 0.9984649 -0.8461791 0.8464509 0.9984648 -0.8461714 0.846426 0.9984647 -0.8461641 0.8463971 0.9984645 -0.8461589 0.8463643 0.9984643 -0.8461587 0.8463293 0.9984642 -0.8461687 0.8462952 0.998464 -0.8461977 0.8462684 0.9984638 -0.8462598 0.8462598 0.9984638 -0.8463492 0.8462598 0.9984638 -0.8464623 0.8462598 0.9984638 -0.8466054 0.8462598 0.9984638 -0.8467864 0.8462598 0.9984638 -0.8470154 0.8462598 0.9984638 -0.8473052 0.8462598 0.9984638 -0.8476717 0.8462598 0.9984638 -0.8481355 0.8462598 0.9984638 -0.8487222 0.8462598 0.9984638 -0.8494644 0.8462598 0.9984638 -0.8504035 0.8462598 0.9984638 -0.8515915 0.8462598 0.9984638 -0.8530945 0.8462598 0.9984638 -0.8549959 0.8462598 0.9984638 -0.8574015 0.8462598 0.9984638 -0.8604449 0.8462598 0.9984638 -0.8642952 0.8462598 0.9984638 -0.8691663 0.8462598 0.9984638 -0.875329 0.8462598 0.9984638 -0.8831255 0.8462598 0.9984638 -0.892989 0.8462598 0.9984638 -0.9054678 0.8462598 0.9984638 -0.921255 0.8462598 0.9984638 -0.9412278 0.8462598 0.9984638 -0.9664961 0.8462598 0.9984638 -0.9984638 0.8462598 0.9984638 -0.9987895 0.8750727 0.9728171 -0.9990455 0.8990175 0.9614615 -0.999247 0.9187262 0.9584468 -0.9994057 0.9348204 0.9599976 -0.9995308 0.9478785 0.9637914 -0.9996295 0.9584178 0.968452 -0.9997074 0.9668884 0.9732039 -0.9997688 0.9736733 0.9776422 -0.9998174 0.9790931 0.9815844 -0.9998557 0.9834132 0.9849754 -0.999886 0.9868507 0.9878296 -0.9999099 0.9895821 0.9901951 -0.9999288 0.9917502 0.9921339 -0.9999437 0.9934695 0.9937096 -0.8462171 0.846635 0.9984653 -0.8462154 0.8466313 0.9984653 -0.8462132 0.8466265 0.9984653 -0.8462106 0.8466206 0.9984653 -0.8462073 0.8466132 0.9984652 -0.8462034 0.8466039 0.9984652 -0.8461986 0.8465925 0.9984651 -0.8461929 0.8465783 0.998465 -0.8461864 0.8465611 0.9984649 -0.8461791 0.8465402 0.9984648 -0.8461714 0.8465153 0.9984647 -0.8461641 0.8464864 0.9984645 -0.8461589 0.8464537 0.9984643 -0.8461587 0.8464187 0.9984642 -0.8461687 0.8463846 0.998464 -0.8461977 0.8463578 0.9984638 -0.8462598 0.8463492 0.9984638 -0.8463492 0.8463492 0.9984638 -0.8464623 0.8463492 0.9984638 -0.8466054 0.8463492 0.9984638 -0.8467864 0.8463492 0.9984638 -0.8470154 0.8463492 0.9984638 -0.8473052 0.8463492 0.9984638 -0.8476717 0.8463492 0.9984638 -0.8481355 0.8463492 0.9984638 -0.8487222 0.8463492 0.9984638 -0.8494644 0.8463492 0.9984638 -0.8504035 0.8463492 0.9984638 -0.8515915 0.8463492 0.9984638 -0.8530945 0.8463492 0.9984638 -0.8549959 0.8463492 0.9984638 -0.8574015 0.8463492 0.9984638 -0.8604449 0.8463492 0.9984638 -0.8642952 0.8463492 0.9984638 -0.8691663 0.8463492 0.9984638 -0.875329 0.8463492 0.9984638 -0.8831255 0.8463492 0.9984638 -0.892989 0.8463492 0.9984638 -0.9054678 0.8463492 0.9984638 -0.921255 0.8463492 0.9984638 -0.9412278 0.8463492 0.9984638 -0.9664961 0.8463492 0.9984638 -0.9984638 0.8463492 0.9984638 -0.9987895 0.8751301 0.9728171 -0.9990455 0.8990542 0.9614615 -0.999247 0.9187495 0.9584468 -0.9994057 0.9348352 0.9599976 -0.9995308 0.9478878 0.9637914 -0.9996295 0.9584237 0.968452 -0.9997074 0.9668922 0.9732039 -0.9997688 0.9736756 0.9776422 -0.9998174 0.9790946 0.9815844 -0.9998557 0.9834141 0.9849754 -0.999886 0.9868512 0.9878296 -0.9999099 0.9895825 0.9901951 -0.9999288 0.9917504 0.9921339 -0.9999437 0.9934697 0.9937096 -0.8462171 0.8467479 0.9984653 -0.8462154 0.8467442 0.9984653 -0.8462132 0.8467394 0.9984653 -0.8462106 0.8467335 0.9984653 -0.8462073 0.8467261 0.9984652 -0.8462034 0.8467168 0.9984652 -0.8461986 0.8467054 0.9984651 -0.8461929 0.8466913 0.998465 -0.8461864 0.846674 0.9984649 -0.8461791 0.8466532 0.9984648 -0.8461714 0.8466283 0.9984647 -0.8461641 0.8465994 0.9984645 -0.8461589 0.8465667 0.9984643 -0.8461587 0.8465317 0.9984642 -0.8461687 0.8464977 0.998464 -0.8461977 0.8464709 0.9984638 -0.8462598 0.8464623 0.9984638 -0.8463492 0.8464623 0.9984638 -0.8464623 0.8464623 0.9984638 -0.8466054 0.8464623 0.9984638 -0.8467864 0.8464623 0.9984638 -0.8470154 0.8464623 0.9984638 -0.8473052 0.8464623 0.9984638 -0.8476717 0.8464623 0.9984638 -0.8481355 0.8464623 0.9984638 -0.8487222 0.8464623 0.9984638 -0.8494644 0.8464623 0.9984638 -0.8504035 0.8464623 0.9984638 -0.8515915 0.8464623 0.9984638 -0.8530945 0.8464623 0.9984638 -0.8549959 0.8464623 0.9984638 -0.8574015 0.8464623 0.9984638 -0.8604449 0.8464623 0.9984638 -0.8642952 0.8464623 0.9984638 -0.8691663 0.8464623 0.9984638 -0.875329 0.8464623 0.9984638 -0.8831255 0.8464623 0.9984638 -0.892989 0.8464623 0.9984638 -0.9054678 0.8464623 0.9984638 -0.921255 0.8464623 0.9984638 -0.9412278 0.8464623 0.9984638 -0.9664961 0.8464623 0.9984638 -0.9984638 0.8464623 0.9984638 -0.9987895 0.8752028 0.9728171 -0.9990455 0.8991006 0.9614615 -0.999247 0.9187791 0.9584468 -0.9994057 0.9348539 0.9599976 -0.9995308 0.9478997 0.9637914 -0.9996295 0.9584312 0.968452 -0.9997074 0.9668969 0.9732039 -0.9997688 0.9736786 0.9776422 -0.9998174 0.9790965 0.9815844 -0.9998557 0.9834153 0.9849754 -0.999886 0.986852 0.9878296 -0.9999099 0.9895829 0.9901951 -0.9999288 0.9917507 0.9921339 -0.9999437 0.9934698 0.9937096 -0.8462171 0.8468908 0.9984653 -0.8462154 0.846887 0.9984653 -0.8462132 0.8468823 0.9984653 -0.8462106 0.8468763 0.9984653 -0.8462073 0.8468689 0.9984652 -0.8462034 0.8468597 0.9984652 -0.8461986 0.8468482 0.9984651 -0.8461929 0.8468341 0.998465 -0.8461864 0.8468169 0.9984649 -0.8461791 0.8467961 0.9984648 -0.8461714 0.8467713 0.9984647 -0.8461641 0.8467423 0.9984645 -0.8461589 0.8467097 0.9984643 -0.8461587 0.8466748 0.9984642 -0.8461687 0.8466407 0.998464 -0.8461977 0.846614 0.9984638 -0.8462598 0.8466054 0.9984638 -0.8463492 0.8466054 0.9984638 -0.8464623 0.8466054 0.9984638 -0.8466054 0.8466054 0.9984638 -0.8467864 0.8466054 0.9984638 -0.8470154 0.8466054 0.9984638 -0.8473052 0.8466054 0.9984638 -0.8476717 0.8466054 0.9984638 -0.8481355 0.8466054 0.9984638 -0.8487222 0.8466054 0.9984638 -0.8494644 0.8466054 0.9984638 -0.8504035 0.8466054 0.9984638 -0.8515915 0.8466054 0.9984638 -0.8530945 0.8466054 0.9984638 -0.8549959 0.8466054 0.9984638 -0.8574015 0.8466054 0.9984638 -0.8604449 0.8466054 0.9984638 -0.8642952 0.8466054 0.9984638 -0.8691663 0.8466054 0.9984638 -0.875329 0.8466054 0.9984638 -0.8831255 0.8466054 0.9984638 -0.892989 0.8466054 0.9984638 -0.9054678 0.8466054 0.9984638 -0.921255 0.8466054 0.9984638 -0.9412278 0.8466054 0.9984638 -0.9664961 0.8466054 0.9984638 -0.9984638 0.8466054 0.9984638 -0.9987895 0.8752947 0.9728171 -0.9990455 0.8991593 0.9614615 -0.999247 0.9188164 0.9584468 -0.9994057 0.9348776 0.9599976 -0.9995308 0.9479146 0.9637914 -0.9996295 0.9584406 0.968452 -0.9997074 0.9669028 0.9732039 -0.9997688 0.9736823 0.9776422 -0.9998174 0.9790988 0.9815844 -0.9998557 0.9834167 0.9849754 -0.999886 0.9868529 0.9878296 -0.9999099 0.9895835 0.9901951 -0.9999288 0.991751 0.9921339 -0.9999437 0.9934701 0.9937096 -0.8462171 0.8470714 0.9984653 -0.8462154 0.8470677 0.9984653 -0.8462132 0.8470629 0.9984653 -0.8462106 0.847057 0.9984653 -0.8462073 0.8470496 0.9984652 -0.8462034 0.8470404 0.9984652 -0.8461986 0.847029 0.9984651 -0.8461929 0.8470149 0.998465 -0.8461864 0.8469977 0.9984649 -0.8461791 0.8469769 0.9984648 -0.8461714 0.8469521 0.9984647 -0.8461641 0.8469232 0.9984645 -0.8461589 0.8468906 0.9984643 -0.8461587 0.8468557 0.9984642 -0.8461687 0.8468217 0.998464 -0.8461977 0.846795 0.9984638 -0.8462598 0.8467864 0.9984638 -0.8463492 0.8467864 0.9984638 -0.8464623 0.8467864 0.9984638 -0.8466054 0.8467864 0.9984638 -0.8467864 0.8467864 0.9984638 -0.8470154 0.8467864 0.9984638 -0.8473052 0.8467864 0.9984638 -0.8476717 0.8467864 0.9984638 -0.8481355 0.8467864 0.9984638 -0.8487222 0.8467864 0.9984638 -0.8494644 0.8467864 0.9984638 -0.8504035 0.8467864 0.9984638 -0.8515915 0.8467864 0.9984638 -0.8530945 0.8467864 0.9984638 -0.8549959 0.8467864 0.9984638 -0.8574015 0.8467864 0.9984638 -0.8604449 0.8467864 0.9984638 -0.8642952 0.8467864 0.9984638 -0.8691663 0.8467864 0.9984638 -0.875329 0.8467864 0.9984638 -0.8831255 0.8467864 0.9984638 -0.892989 0.8467864 0.9984638 -0.9054678 0.8467864 0.9984638 -0.921255 0.8467864 0.9984638 -0.9412278 0.8467864 0.9984638 -0.9664961 0.8467864 0.9984638 -0.9984638 0.8467864 0.9984638 -0.9987895 0.8754109 0.9728171 -0.9990455 0.8992336 0.9614615 -0.999247 0.9188636 0.9584468 -0.9994057 0.9349075 0.9599976 -0.9995308 0.9479335 0.9637914 -0.9996295 0.9584526 0.968452 -0.9997074 0.9669103 0.9732039 -0.9997688 0.973687 0.9776422 -0.9998174 0.9791018 0.9815844 -0.9998557 0.9834186 0.9849754 -0.999886 0.9868541 0.9878296 -0.9999099 0.9895842 0.9901951 -0.9999288 0.9917515 0.9921339 -0.9999437 0.9934704 0.9937096 -0.8462171 0.8473 0.9984653 -0.8462154 0.8472963 0.9984653 -0.8462132 0.8472916 0.9984653 -0.8462106 0.8472856 0.9984653 -0.8462073 0.8472782 0.9984652 -0.8462034 0.847269 0.9984652 -0.8461986 0.8472576 0.9984651 -0.8461929 0.8472436 0.998465 -0.8461864 0.8472264 0.9984649 -0.8461791 0.8472056 0.9984648 -0.8461714 0.8471809 0.9984647 -0.8461641 0.847152 0.9984645 -0.8461589 0.8471195 0.9984643 -0.8461587 0.8470846 0.9984642 -0.8461687 0.8470507 0.998464 -0.8461977 0.847024 0.9984638 -0.8462598 0.8470154 0.9984638 -0.8463492 0.8470154 0.9984638 -0.8464623 0.8470154 0.9984638 -0.8466054 0.8470154 0.9984638 -0.8467864 0.8470154 0.9984638 -0.8470154 0.8470154 0.9984638 -0.8473052 0.8470154 0.9984638 -0.8476717 0.8470154 0.9984638 -0.8481355 0.8470154 0.9984638 -0.8487222 0.8470154 0.9984638 -0.8494644 0.8470154 0.9984638 -0.8504035 0.8470154 0.9984638 -0.8515915 0.8470154 0.9984638 -0.8530945 0.8470154 0.9984638 -0.8549959 0.8470154 0.9984638 -0.8574015 0.8470154 0.9984638 -0.8604449 0.8470154 0.9984638 -0.8642952 0.8470154 0.9984638 -0.8691663 0.8470154 0.9984638 -0.875329 0.8470154 0.9984638 -0.8831255 0.8470154 0.9984638 -0.892989 0.8470154 0.9984638 -0.9054678 0.8470154 0.9984638 -0.921255 0.8470154 0.9984638 -0.9412278 0.8470154 0.9984638 -0.9664961 0.8470154 0.9984638 -0.9984638 0.8470154 0.9984638 -0.9987895 0.875558 0.9728171 -0.9990455 0.8993275 0.9614615 -0.999247 0.9189234 0.9584468 -0.9994057 0.9349454 0.9599976 -0.9995308 0.9479575 0.9637914 -0.9996295 0.9584677 0.968452 -0.9997074 0.9669198 0.9732039 -0.9997688 0.973693 0.9776422 -0.9998174 0.9791055 0.9815844 -0.9998557 0.9834209 0.9849754 -0.999886 0.9868555 0.9878296 -0.9999099 0.9895851 0.9901951 -0.9999288 0.9917521 0.9921339 -0.9999437 0.9934707 0.9937096 -0.8462171 0.8475892 0.9984653 -0.8462154 0.8475855 0.9984653 -0.8462132 0.8475808 0.9984653 -0.8462106 0.8475749 0.9984653 -0.8462073 0.8475675 0.9984652 -0.8462034 0.8475583 0.9984652 -0.8461986 0.8475469 0.9984651 -0.8461929 0.8475329 0.998465 -0.8461864 0.8475157 0.9984649 -0.8461791 0.847495 0.9984648 -0.8461714 0.8474703 0.9984647 -0.8461641 0.8474415 0.9984645 -0.8461589 0.847409 0.9984643 -0.8461587 0.8473742 0.9984642 -0.8461687 0.8473404 0.998464 -0.8461977 0.8473137 0.9984638 -0.8462598 0.8473052 0.9984638 -0.8463492 0.8473052 0.9984638 -0.8464623 0.8473052 0.9984638 -0.8466054 0.8473052 0.9984638 -0.8467864 0.8473052 0.9984638 -0.8470154 0.8473052 0.9984638 -0.8473052 0.8473052 0.9984638 -0.8476717 0.8473052 0.9984638 -0.8481355 0.8473052 0.9984638 -0.8487222 0.8473052 0.9984638 -0.8494644 0.8473052 0.9984638 -0.8504035 0.8473052 0.9984638 -0.8515915 0.8473052 0.9984638 -0.8530945 0.8473052 0.9984638 -0.8549959 0.8473052 0.9984638 -0.8574015 0.8473052 0.9984638 -0.8604449 0.8473052 0.9984638 -0.8642952 0.8473052 0.9984638 -0.8691663 0.8473052 0.9984638 -0.875329 0.8473052 0.9984638 -0.8831255 0.8473052 0.9984638 -0.892989 0.8473052 0.9984638 -0.9054678 0.8473052 0.9984638 -0.921255 0.8473052 0.9984638 -0.9412278 0.8473052 0.9984638 -0.9664961 0.8473052 0.9984638 -0.9984638 0.8473052 0.9984638 -0.9987895 0.8757441 0.9728171 -0.9990455 0.8994464 0.9614615 -0.999247 0.918999 0.9584468 -0.9994057 0.9349933 0.9599976 -0.9995308 0.9479878 0.9637914 -0.9996295 0.9584868 0.968452 -0.9997074 0.9669318 0.9732039 -0.9997688 0.9737006 0.9776422 -0.9998174 0.9791103 0.9815844 -0.9998557 0.9834239 0.9849754 -0.999886 0.9868574 0.9878296 -0.9999099 0.9895863 0.9901951 -0.9999288 0.9917528 0.9921339 -0.9999437 0.9934712 0.9937096 -0.8462171 0.8479551 0.9984653 -0.8462154 0.8479514 0.9984653 -0.8462132 0.8479467 0.9984653 -0.8462106 0.8479408 0.9984653 -0.8462073 0.8479334 0.9984652 -0.8462034 0.8479242 0.9984652 -0.8461986 0.8479129 0.9984651 -0.8461929 0.8478989 0.998465 -0.8461864 0.8478818 0.9984649 -0.8461791 0.8478611 0.9984648 -0.8461714 0.8478364 0.9984647 -0.8461641 0.8478077 0.9984645 -0.8461589 0.8477753 0.9984643 -0.8461587 0.8477406 0.9984642 -0.8461687 0.8477068 0.998464 -0.8461977 0.8476802 0.9984638 -0.8462598 0.8476717 0.9984638 -0.8463492 0.8476717 0.9984638 -0.8464623 0.8476717 0.9984638 -0.8466054 0.8476717 0.9984638 -0.8467864 0.8476717 0.9984638 -0.8470154 0.8476717 0.9984638 -0.8473052 0.8476717 0.9984638 -0.8476717 0.8476717 0.9984638 -0.8481355 0.8476717 0.9984638 -0.8487222 0.8476717 0.9984638 -0.8494644 0.8476717 0.9984638 -0.8504035 0.8476717 0.9984638 -0.8515915 0.8476717 0.9984638 -0.8530945 0.8476717 0.9984638 -0.8549959 0.8476717 0.9984638 -0.8574015 0.8476717 0.9984638 -0.8604449 0.8476717 0.9984638 -0.8642952 0.8476717 0.9984638 -0.8691663 0.8476717 0.9984638 -0.875329 0.8476717 0.9984638 -0.8831255 0.8476717 0.9984638 -0.892989 0.8476717 0.9984638 -0.9054678 0.8476717 0.9984638 -0.921255 0.8476717 0.9984638 -0.9412278 0.8476717 0.9984638 -0.9664961 0.8476717 0.9984638 -0.9984638 0.8476717 0.9984638 -0.9987895 0.8759795 0.9728171 -0.9990455 0.8995968 0.9614615 -0.999247 0.9190947 0.9584468 -0.9994057 0.935054 0.9599976 -0.9995308 0.9480261 0.9637914 -0.9996295 0.9585109 0.968452 -0.9997074 0.966947 0.9732039 -0.9997688 0.9737101 0.9776422 -0.9998174 0.9791163 0.9815844 -0.9998557 0.9834277 0.9849754 -0.999886 0.9868597 0.9878296 -0.9999099 0.9895878 0.9901951 -0.9999288 0.9917537 0.9921339 -0.9999437 0.9934718 0.9937096 -0.8462171 0.848418 0.9984653 -0.8462154 0.8484142 0.9984653 -0.8462132 0.8484096 0.9984653 -0.8462106 0.8484037 0.9984653 -0.8462073 0.8483964 0.9984652 -0.8462034 0.8483872 0.9984652 -0.8461986 0.8483759 0.9984651 -0.8461929 0.8483619 0.998465 -0.8461864 0.8483449 0.9984649 -0.8461791 0.8483242 0.9984648 -0.8461714 0.8482997 0.9984647 -0.8461641 0.848271 0.9984645 -0.8461589 0.8482387 0.9984643 -0.8461587 0.8482042 0.9984642 -0.8461687 0.8481705 0.998464 -0.8461977 0.848144 0.9984638 -0.8462598 0.8481355 0.9984638 -0.8463492 0.8481355 0.9984638 -0.8464623 0.8481355 0.9984638 -0.8466054 0.8481355 0.9984638 -0.8467864 0.8481355 0.9984638 -0.8470154 0.8481355 0.9984638 -0.8473052 0.8481355 0.9984638 -0.8476717 0.8481355 0.9984638 -0.8481355 0.8481355 0.9984638 -0.8487222 0.8481355 0.9984638 -0.8494644 0.8481355 0.9984638 -0.8504035 0.8481355 0.9984638 -0.8515915 0.8481355 0.9984638 -0.8530945 0.8481355 0.9984638 -0.8549959 0.8481355 0.9984638 -0.8574015 0.8481355 0.9984638 -0.8604449 0.8481355 0.9984638 -0.8642952 0.8481355 0.9984638 -0.8691663 0.8481355 0.9984638 -0.875329 0.8481355 0.9984638 -0.8831255 0.8481355 0.9984638 -0.892989 0.8481355 0.9984638 -0.9054678 0.8481355 0.9984638 -0.921255 0.8481355 0.9984638 -0.9412278 0.8481355 0.9984638 -0.9664961 0.8481355 0.9984638 -0.9984638 0.8481355 0.9984638 -0.9987895 0.8762773 0.9728171 -0.9990455 0.899787 0.9614615 -0.999247 0.9192157 0.9584468 -0.9994057 0.9351307 0.9599976 -0.9995308 0.9480746 0.9637914 -0.9996295 0.9585415 0.968452 -0.9997074 0.9669663 0.9732039 -0.9997688 0.9737222 0.9776422 -0.9998174 0.9791238 0.9815844 -0.9998557 0.9834324 0.9849754 -0.999886 0.9868627 0.9878296 -0.9999099 0.9895897 0.9901951 -0.9999288 0.9917549 0.9921339 -0.9999437 0.9934725 0.9937096 -0.8462171 0.8490036 0.9984653 -0.8462154 0.8489999 0.9984653 -0.8462132 0.8489952 0.9984653 -0.8462106 0.8489893 0.9984653 -0.8462073 0.848982 0.9984652 -0.8462034 0.8489729 0.9984652 -0.8461986 0.8489617 0.9984651 -0.8461929 0.8489478 0.998465 -0.8461864 0.8489308 0.9984649 -0.8461791 0.8489102 0.9984648 -0.8461714 0.8488857 0.9984647 -0.8461641 0.8488572 0.9984645 -0.8461589 0.848825 0.9984643 -0.8461587 0.8487906 0.9984642 -0.8461687 0.848757 0.998464 -0.8461977 0.8487306 0.9984638 -0.8462598 0.8487222 0.9984638 -0.8463492 0.8487222 0.9984638 -0.8464623 0.8487222 0.9984638 -0.8466054 0.8487222 0.9984638 -0.8467864 0.8487222 0.9984638 -0.8470154 0.8487222 0.9984638 -0.8473052 0.8487222 0.9984638 -0.8476717 0.8487222 0.9984638 -0.8481355 0.8487222 0.9984638 -0.8487222 0.8487222 0.9984638 -0.8494644 0.8487222 0.9984638 -0.8504035 0.8487222 0.9984638 -0.8515915 0.8487222 0.9984638 -0.8530945 0.8487222 0.9984638 -0.8549959 0.8487222 0.9984638 -0.8574015 0.8487222 0.9984638 -0.8604449 0.8487222 0.9984638 -0.8642952 0.8487222 0.9984638 -0.8691663 0.8487222 0.9984638 -0.875329 0.8487222 0.9984638 -0.8831255 0.8487222 0.9984638 -0.892989 0.8487222 0.9984638 -0.9054678 0.8487222 0.9984638 -0.921255 0.8487222 0.9984638 -0.9412278 0.8487222 0.9984638 -0.9664961 0.8487222 0.9984638 -0.9984638 0.8487222 0.9984638 -0.9987895 0.8766541 0.9728171 -0.9990455 0.9000277 0.9614615 -0.999247 0.9193688 0.9584468 -0.9994057 0.9352277 0.9599976 -0.9995308 0.9481359 0.9637914 -0.9996295 0.9585802 0.968452 -0.9997074 0.9669906 0.9732039 -0.9997688 0.9737375 0.9776422 -0.9998174 0.9791334 0.9815844 -0.9998557 0.9834385 0.9849754 -0.999886 0.9868665 0.9878296 -0.9999099 0.989592 0.9901951 -0.9999288 0.9917564 0.9921339 -0.9999437 0.9934734 0.9937096 -0.8462171 0.8497444 0.9984653 -0.8462154 0.8497407 0.9984653 -0.8462132 0.8497361 0.9984653 -0.8462106 0.8497303 0.9984653 -0.8462073 0.849723 0.9984652 -0.8462034 0.8497139 0.9984652 -0.8461986 0.8497027 0.9984651 -0.8461929 0.8496889 0.998465 -0.8461864 0.849672 0.9984649 -0.8461791 0.8496515 0.9984648 -0.8461714 0.8496272 0.9984647 -0.8461641 0.8495988 0.9984645 -0.8461589 0.8495668 0.9984643 -0.8461587 0.8495325 0.9984642 -0.8461687 0.8494991 0.998464 -0.8461977 0.8494728 0.9984638 -0.8462598 0.8494644 0.9984638 -0.8463492 0.8494644 0.9984638 -0.8464623 0.8494644 0.9984638 -0.8466054 0.8494644 0.9984638 -0.8467864 0.8494644 0.9984638 -0.8470154 0.8494644 0.9984638 -0.8473052 0.8494644 0.9984638 -0.8476717 0.8494644 0.9984638 -0.8481355 0.8494644 0.9984638 -0.8487222 0.8494644 0.9984638 -0.8494644 0.8494644 0.9984638 -0.8504035 0.8494644 0.9984638 -0.8515915 0.8494644 0.9984638 -0.8530945 0.8494644 0.9984638 -0.8549959 0.8494644 0.9984638 -0.8574015 0.8494644 0.9984638 -0.8604449 0.8494644 0.9984638 -0.8642952 0.8494644 0.9984638 -0.8691663 0.8494644 0.9984638 -0.875329 0.8494644 0.9984638 -0.8831255 0.8494644 0.9984638 -0.892989 0.8494644 0.9984638 -0.9054678 0.8494644 0.9984638 -0.921255 0.8494644 0.9984638 -0.9412278 0.8494644 0.9984638 -0.9664961 0.8494644 0.9984638 -0.9984638 0.8494644 0.9984638 -0.9987895 0.8771307 0.9728171 -0.9990455 0.9003323 0.9614615 -0.999247 0.9195625 0.9584468 -0.9994057 0.9353505 0.9599976 -0.9995308 0.9482135 0.9637914 -0.9996295 0.9586291 0.968452 -0.9997074 0.9670214 0.9732039 -0.9997688 0.9737569 0.9776422 -0.9998174 0.9791456 0.9815844 -0.9998557 0.9834461 0.9849754 -0.999886 0.9868713 0.9878296 -0.9999099 0.989595 0.9901951 -0.9999288 0.9917582 0.9921339 -0.9999437 0.9934746 0.9937096 -0.8462171 0.8506817 0.9984653 -0.8462154 0.850678 0.9984653 -0.8462132 0.8506734 0.9984653 -0.8462106 0.8506676 0.9984653 -0.8462073 0.8506604 0.9984652 -0.8462034 0.8506514 0.9984652 -0.8461986 0.8506403 0.9984651 -0.8461929 0.8506265 0.998465 -0.8461864 0.8506097 0.9984649 -0.8461791 0.8505894 0.9984648 -0.8461714 0.8505652 0.9984647 -0.8461641 0.850537 0.9984645 -0.8461589 0.8505052 0.9984643 -0.8461587 0.8504711 0.9984642 -0.8461687 0.8504379 0.998464 -0.8461977 0.8504118 0.9984638 -0.8462598 0.8504035 0.9984638 -0.8463492 0.8504035 0.9984638 -0.8464623 0.8504035 0.9984638 -0.8466054 0.8504035 0.9984638 -0.8467864 0.8504035 0.9984638 -0.8470154 0.8504035 0.9984638 -0.8473052 0.8504035 0.9984638 -0.8476717 0.8504035 0.9984638 -0.8481355 0.8504035 0.9984638 -0.8487222 0.8504035 0.9984638 -0.8494644 0.8504035 0.9984638 -0.8504035 0.8504035 0.9984638 -0.8515915 0.8504035 0.9984638 -0.8530945 0.8504035 0.9984638 -0.8549959 0.8504035 0.9984638 -0.8574015 0.8504035 0.9984638 -0.8604449 0.8504035 0.9984638 -0.8642952 0.8504035 0.9984638 -0.8691663 0.8504035 0.9984638 -0.875329 0.8504035 0.9984638 -0.8831255 0.8504035 0.9984638 -0.892989 0.8504035 0.9984638 -0.9054678 0.8504035 0.9984638 -0.921255 0.8504035 0.9984638 -0.9412278 0.8504035 0.9984638 -0.9664961 0.8504035 0.9984638 -0.9984638 0.8504035 0.9984638 -0.9987895 0.8777338 0.9728171 -0.9990455 0.9007175 0.9614615 -0.999247 0.9198076 0.9584468 -0.9994057 0.9355059 0.9599976 -0.9995308 0.9483117 0.9637914 -0.9996295 0.958691 0.968452 -0.9997074 0.9670604 0.9732039 -0.9997688 0.9737814 0.9776422 -0.9998174 0.979161 0.9815844 -0.9998557 0.9834557 0.9849754 -0.999886 0.9868773 0.9878296 -0.9999099 0.9895988 0.9901951 -0.9999288 0.9917606 0.9921339 -0.9999437 0.9934761 0.9937096 -0.8462171 0.8518675 0.9984653 -0.8462154 0.8518639 0.9984653 -0.8462132 0.8518593 0.9984653 -0.8462106 0.8518535 0.9984653 -0.8462073 0.8518464 0.9984652 -0.8462034 0.8518374 0.9984652 -0.8461986 0.8518264 0.9984651 -0.8461929 0.8518127 0.998465 -0.8461864 0.8517961 0.9984649 -0.8461791 0.8517759 0.9984648 -0.8461714 0.8517519 0.9984647 -0.8461641 0.8517239 0.9984645 -0.8461589 0.8516924 0.9984643 -0.8461587 0.8516586 0.9984642 -0.8461687 0.8516256 0.998464 -0.8461977 0.8515998 0.9984638 -0.8462598 0.8515915 0.9984638 -0.8463492 0.8515915 0.9984638 -0.8464623 0.8515915 0.9984638 -0.8466054 0.8515915 0.9984638 -0.8467864 0.8515915 0.9984638 -0.8470154 0.8515915 0.9984638 -0.8473052 0.8515915 0.9984638 -0.8476717 0.8515915 0.9984638 -0.8481355 0.8515915 0.9984638 -0.8487222 0.8515915 0.9984638 -0.8494644 0.8515915 0.9984638 -0.8504035 0.8515915 0.9984638 -0.8515915 0.8515915 0.9984638 -0.8530945 0.8515915 0.9984638 -0.8549959 0.8515915 0.9984638 -0.8574015 0.8515915 0.9984638 -0.8604449 0.8515915 0.9984638 -0.8642952 0.8515915 0.9984638 -0.8691663 0.8515915 0.9984638 -0.875329 0.8515915 0.9984638 -0.8831255 0.8515915 0.9984638 -0.892989 0.8515915 0.9984638 -0.9054678 0.8515915 0.9984638 -0.921255 0.8515915 0.9984638 -0.9412278 0.8515915 0.9984638 -0.9664961 0.8515915 0.9984638 -0.9984638 0.8515915 0.9984638 -0.9987895 0.8784967 0.9728171 -0.9990455 0.9012049 0.9614615 -0.999247 0.9201176 0.9584468 -0.9994057 0.9357024 0.9599976 -0.9995308 0.9484359 0.9637914 -0.9996295 0.9587693 0.968452 -0.9997074 0.9671097 0.9732039 -0.9997688 0.9738123 0.9776422 -0.9998174 0.9791804 0.9815844 -0.9998557 0.9834679 0.9849754 -0.999886 0.986885 0.9878296 -0.9999099 0.9896036 0.9901951 -0.9999288 0.9917636 0.9921339 -0.9999437 0.9934779 0.9937096 -0.8462171 0.8533677 0.9984653 -0.8462154 0.8533641 0.9984653 -0.8462132 0.8533595 0.9984653 -0.8462106 0.8533539 0.9984653 -0.8462073 0.8533468 0.9984652 -0.8462034 0.8533379 0.9984652 -0.8461986 0.853327 0.9984651 -0.8461929 0.8533135 0.998465 -0.8461864 0.853297 0.9984649 -0.8461791 0.853277 0.9984648 -0.8461714 0.8532533 0.9984647 -0.8461641 0.8532256 0.9984645 -0.8461589 0.8531943 0.9984643 -0.8461587 0.8531609 0.9984642 -0.8461687 0.8531283 0.998464 -0.8461977 0.8531027 0.9984638 -0.8462598 0.8530945 0.9984638 -0.8463492 0.8530945 0.9984638 -0.8464623 0.8530945 0.9984638 -0.8466054 0.8530945 0.9984638 -0.8467864 0.8530945 0.9984638 -0.8470154 0.8530945 0.9984638 -0.8473052 0.8530945 0.9984638 -0.8476717 0.8530945 0.9984638 -0.8481355 0.8530945 0.9984638 -0.8487222 0.8530945 0.9984638 -0.8494644 0.8530945 0.9984638 -0.8504035 0.8530945 0.9984638 -0.8515915 0.8530945 0.9984638 -0.8530945 0.8530945 0.9984638 -0.8549959 0.8530945 0.9984638 -0.8574015 0.8530945 0.9984638 -0.8604449 0.8530945 0.9984638 -0.8642952 0.8530945 0.9984638 -0.8691663 0.8530945 0.9984638 -0.875329 0.8530945 0.9984638 -0.8831255 0.8530945 0.9984638 -0.892989 0.8530945 0.9984638 -0.9054678 0.8530945 0.9984638 -0.921255 0.8530945 0.9984638 -0.9412278 0.8530945 0.9984638 -0.9664961 0.8530945 0.9984638 -0.9984638 0.8530945 0.9984638 -0.9987895 0.8794619 0.9728171 -0.9990455 0.9018215 0.9614615 -0.999247 0.9205098 0.9584468 -0.9994057 0.935951 0.9599976 -0.9995308 0.9485931 0.9637914 -0.9996295 0.9588684 0.968452 -0.9997074 0.967172 0.9732039 -0.9997688 0.9738515 0.9776422 -0.9998174 0.979205 0.9815844 -0.9998557 0.9834833 0.9849754 -0.999886 0.9868946 0.9878296 -0.9999099 0.9896096 0.9901951 -0.9999288 0.9917674 0.9921339 -0.9999437 0.9934803 0.9937096 -0.8462171 0.8552656 0.9984653 -0.8462154 0.855262 0.9984653 -0.8462132 0.8552576 0.9984653 -0.8462106 0.855252 0.9984653 -0.8462073 0.8552449 0.9984652 -0.8462034 0.8552362 0.9984652 -0.8461986 0.8552254 0.9984651 -0.8461929 0.8552121 0.998465 -0.8461864 0.8551958 0.9984649 -0.8461791 0.8551761 0.9984648 -0.8461714 0.8551527 0.9984647 -0.8461641 0.8551253 0.9984645 -0.8461589 0.8550945 0.9984643 -0.8461587 0.8550615 0.9984642 -0.8461687 0.8550293 0.998464 -0.8461977 0.855004 0.9984638 -0.8462598 0.8549959 0.9984638 -0.8463492 0.8549959 0.9984638 -0.8464623 0.8549959 0.9984638 -0.8466054 0.8549959 0.9984638 -0.8467864 0.8549959 0.9984638 -0.8470154 0.8549959 0.9984638 -0.8473052 0.8549959 0.9984638 -0.8476717 0.8549959 0.9984638 -0.8481355 0.8549959 0.9984638 -0.8487222 0.8549959 0.9984638 -0.8494644 0.8549959 0.9984638 -0.8504035 0.8549959 0.9984638 -0.8515915 0.8549959 0.9984638 -0.8530945 0.8549959 0.9984638 -0.8549959 0.8549959 0.9984638 -0.8574015 0.8549959 0.9984638 -0.8604449 0.8549959 0.9984638 -0.8642952 0.8549959 0.9984638 -0.8691663 0.8549959 0.9984638 -0.875329 0.8549959 0.9984638 -0.8831255 0.8549959 0.9984638 -0.892989 0.8549959 0.9984638 -0.9054678 0.8549959 0.9984638 -0.921255 0.8549959 0.9984638 -0.9412278 0.8549959 0.9984638 -0.9664961 0.8549959 0.9984638 -0.9984638 0.8549959 0.9984638 -0.9987895 0.880683 0.9728171 -0.9990455 0.9026016 0.9614615 -0.999247 0.9210061 0.9584468 -0.9994057 0.9362655 0.9599976 -0.9995308 0.9487918 0.9637914 -0.9996295 0.9589938 0.968452 -0.9997074 0.9672509 0.9732039 -0.9997688 0.9739011 0.9776422 -0.9998174 0.9792361 0.9815844 -0.9998557 0.9835029 0.9849754 -0.999886 0.9869069 0.9878296 -0.9999099 0.9896173 0.9901951 -0.9999288 0.9917722 0.9921339 -0.9999437 0.9934833 0.9937096 -0.8462171 0.8576667 0.9984653 -0.8462154 0.8576632 0.9984653 -0.8462132 0.8576588 0.9984653 -0.8462106 0.8576533 0.9984653 -0.8462073 0.8576464 0.9984652 -0.8462034 0.8576378 0.9984652 -0.8461986 0.8576272 0.9984651 -0.8461929 0.8576141 0.998465 -0.8461864 0.8575981 0.9984649 -0.8461791 0.8575787 0.9984648 -0.8461714 0.8575557 0.9984647 -0.8461641 0.8575288 0.9984645 -0.8461589 0.8574984 0.9984643 -0.8461587 0.857466 0.9984642 -0.8461687 0.8574344 0.998464 -0.8461977 0.8574095 0.9984638 -0.8462598 0.8574015 0.9984638 -0.8463492 0.8574015 0.9984638 -0.8464623 0.8574015 0.9984638 -0.8466054 0.8574015 0.9984638 -0.8467864 0.8574015 0.9984638 -0.8470154 0.8574015 0.9984638 -0.8473052 0.8574015 0.9984638 -0.8476717 0.8574015 0.9984638 -0.8481355 0.8574015 0.9984638 -0.8487222 0.8574015 0.9984638 -0.8494644 0.8574015 0.9984638 -0.8504035 0.8574015 0.9984638 -0.8515915 0.8574015 0.9984638 -0.8530945 0.8574015 0.9984638 -0.8549959 0.8574015 0.9984638 -0.8574015 0.8574015 0.9984638 -0.8604449 0.8574015 0.9984638 -0.8642952 0.8574015 0.9984638 -0.8691663 0.8574015 0.9984638 -0.875329 0.8574015 0.9984638 -0.8831255 0.8574015 0.9984638 -0.892989 0.8574015 0.9984638 -0.9054678 0.8574015 0.9984638 -0.921255 0.8574015 0.9984638 -0.9412278 0.8574015 0.9984638 -0.9664961 0.8574015 0.9984638 -0.9984638 0.8574015 0.9984638 -0.9987895 0.8822279 0.9728171 -0.9990455 0.9035886 0.9614615 -0.999247 0.9216339 0.9584468 -0.9994057 0.9366635 0.9599976 -0.9995308 0.9490434 0.9637914 -0.9996295 0.9591524 0.968452 -0.9997074 0.9673508 0.9732039 -0.9997688 0.9739638 0.9776422 -0.9998174 0.9792755 0.9815844 -0.9998557 0.9835276 0.9849754 -0.999886 0.9869223 0.9878296 -0.9999099 0.989627 0.9901951 -0.9999288 0.9917782 0.9921339 -0.9999437 0.9934871 0.9937096 -0.8462171 0.8607044 0.9984653 -0.8462154 0.860701 0.9984653 -0.8462132 0.8606967 0.9984653 -0.8462106 0.8606913 0.9984653 -0.8462073 0.8606845 0.9984652 -0.8462034 0.8606762 0.9984652 -0.8461986 0.8606658 0.9984651 -0.8461929 0.8606529 0.998465 -0.8461864 0.8606373 0.9984649 -0.8461791 0.8606183 0.9984648 -0.8461714 0.8605957 0.9984647 -0.8461641 0.8605694 0.9984645 -0.8461589 0.8605398 0.9984643 -0.8461587 0.860508 0.9984642 -0.8461687 0.860477 0.998464 -0.8461977 0.8604527 0.9984638 -0.8462598 0.8604449 0.9984638 -0.8463492 0.8604449 0.9984638 -0.8464623 0.8604449 0.9984638 -0.8466054 0.8604449 0.9984638 -0.8467864 0.8604449 0.9984638 -0.8470154 0.8604449 0.9984638 -0.8473052 0.8604449 0.9984638 -0.8476717 0.8604449 0.9984638 -0.8481355 0.8604449 0.9984638 -0.8487222 0.8604449 0.9984638 -0.8494644 0.8604449 0.9984638 -0.8504035 0.8604449 0.9984638 -0.8515915 0.8604449 0.9984638 -0.8530945 0.8604449 0.9984638 -0.8549959 0.8604449 0.9984638 -0.8574015 0.8604449 0.9984638 -0.8604449 0.8604449 0.9984638 -0.8642952 0.8604449 0.9984638 -0.8691663 0.8604449 0.9984638 -0.875329 0.8604449 0.9984638 -0.8831255 0.8604449 0.9984638 -0.892989 0.8604449 0.9984638 -0.9054678 0.8604449 0.9984638 -0.921255 0.8604449 0.9984638 -0.9412278 0.8604449 0.9984638 -0.9664961 0.8604449 0.9984638 -0.9984638 0.8604449 0.9984638 -0.9987895 0.8841823 0.9728171 -0.9990455 0.9048372 0.9614615 -0.999247 0.9224281 0.9584468 -0.9994057 0.9371669 0.9599976 -0.9995308 0.9493615 0.9637914 -0.9996295 0.959353 0.968452 -0.9997074 0.967477 0.9732039 -0.9997688 0.9740432 0.9776422 -0.9998174 0.9793253 0.9815844 -0.9998557 0.9835588 0.9849754 -0.999886 0.9869419 0.9878296 -0.9999099 0.9896392 0.9901951 -0.9999288 0.9917859 0.9921339 -0.9999437 0.9934919 0.9937096 -0.8462171 0.8645475 0.9984653 -0.8462154 0.8645442 0.9984653 -0.8462132 0.86454 0.9984653 -0.8462106 0.8645348 0.9984653 -0.8462073 0.8645282 0.9984652 -0.8462034 0.86452 0.9984652 -0.8461986 0.8645099 0.9984651 -0.8461929 0.8644975 0.998465 -0.8461864 0.8644822 0.9984649 -0.8461791 0.8644638 0.9984648 -0.8461714 0.8644419 0.9984647 -0.8461641 0.8644163 0.9984645 -0.8461589 0.8643874 0.9984643 -0.8461587 0.8643565 0.9984642 -0.8461687 0.8643265 0.998464 -0.8461977 0.8643028 0.9984638 -0.8462598 0.8642952 0.9984638 -0.8463492 0.8642952 0.9984638 -0.8464623 0.8642952 0.9984638 -0.8466054 0.8642952 0.9984638 -0.8467864 0.8642952 0.9984638 -0.8470154 0.8642952 0.9984638 -0.8473052 0.8642952 0.9984638 -0.8476717 0.8642952 0.9984638 -0.8481355 0.8642952 0.9984638 -0.8487222 0.8642952 0.9984638 -0.8494644 0.8642952 0.9984638 -0.8504035 0.8642952 0.9984638 -0.8515915 0.8642952 0.9984638 -0.8530945 0.8642952 0.9984638 -0.8549959 0.8642952 0.9984638 -0.8574015 0.8642952 0.9984638 -0.8604449 0.8642952 0.9984638 -0.8642952 0.8642952 0.9984638 -0.8691663 0.8642952 0.9984638 -0.875329 0.8642952 0.9984638 -0.8831255 0.8642952 0.9984638 -0.892989 0.8642952 0.9984638 -0.9054678 0.8642952 0.9984638 -0.921255 0.8642952 0.9984638 -0.9412278 0.8642952 0.9984638 -0.9664961 0.8642952 0.9984638 -0.9984638 0.8642952 0.9984638 -0.9987895 0.886655 0.9728171 -0.9990455 0.9064168 0.9614615 -0.999247 0.9234329 0.9584468 -0.9994057 0.9378038 0.9599976 -0.9995308 0.9497641 0.9637914 -0.9996295 0.9596068 0.968452 -0.9997074 0.9676368 0.9732039 -0.9997688 0.9741436 0.9776422 -0.9998174 0.9793883 0.9815844 -0.9998557 0.9835983 0.9849754 -0.999886 0.9869667 0.9878296 -0.9999099 0.9896547 0.9901951 -0.9999288 0.9917956 0.9921339 -0.9999437 0.993498 0.9937096 -0.8462171 0.8694095 0.9984653 -0.8462154 0.8694063 0.9984653 -0.8462132 0.8694023 0.9984653 -0.8462106 0.8693972 0.9984653 -0.8462073 0.8693909 0.9984652 -0.8462034 0.8693831 0.9984652 -0.8461986 0.8693733 0.9984651 -0.8461929 0.8693613 0.998465 -0.8461864 0.8693466 0.9984649 -0.8461791 0.8693288 0.9984648 -0.8461714 0.8693077 0.9984647 -0.8461641 0.869283 0.9984645 -0.8461589 0.8692552 0.9984643 -0.8461587 0.8692255 0.9984642 -0.8461687 0.8691965 0.998464 -0.8461977 0.8691736 0.9984638 -0.8462598 0.8691663 0.9984638 -0.8463492 0.8691663 0.9984638 -0.8464623 0.8691663 0.9984638 -0.8466054 0.8691663 0.9984638 -0.8467864 0.8691663 0.9984638 -0.8470154 0.8691663 0.9984638 -0.8473052 0.8691663 0.9984638 -0.8476717 0.8691663 0.9984638 -0.8481355 0.8691663 0.9984638 -0.8487222 0.8691663 0.9984638 -0.8494644 0.8691663 0.9984638 -0.8504035 0.8691663 0.9984638 -0.8515915 0.8691663 0.9984638 -0.8530945 0.8691663 0.9984638 -0.8549959 0.8691663 0.9984638 -0.8574015 0.8691663 0.9984638 -0.8604449 0.8691663 0.9984638 -0.8642952 0.8691663 0.9984638 -0.8691663 0.8691663 0.9984638 -0.875329 0.8691663 0.9984638 -0.8831255 0.8691663 0.9984638 -0.892989 0.8691663 0.9984638 -0.9054678 0.8691663 0.9984638 -0.921255 0.8691663 0.9984638 -0.9412278 0.8691663 0.9984638 -0.9664961 0.8691663 0.9984638 -0.9984638 0.8691663 0.9984638 -0.9987895 0.8897832 0.9728171 -0.9990455 0.9084153 0.9614615 -0.999247 0.9247041 0.9584468 -0.9994057 0.9386096 0.9599976 -0.9995308 0.9502734 0.9637914 -0.9996295 0.959928 0.968452 -0.9997074 0.9678389 0.9732039 -0.9997688 0.9742706 0.9776422 -0.9998174 0.9794681 0.9815844 -0.9998557 0.9836483 0.9849754 -0.999886 0.986998 0.9878296 -0.9999099 0.9896744 0.9901951 -0.9999288 0.9918079 0.9921339 -0.9999437 0.9935057 0.9937096 -0.8462171 0.8755606 0.9984653 -0.8462154 0.8755576 0.9984653 -0.8462132 0.8755537 0.9984653 -0.8462106 0.8755489 0.9984653 -0.8462073 0.8755429 0.9984652 -0.8462034 0.8755354 0.9984652 -0.8461986 0.8755261 0.9984651 -0.8461929 0.8755147 0.998465 -0.8461864 0.8755007 0.9984649 -0.8461791 0.8754838 0.9984648 -0.8461714 0.8754636 0.9984647 -0.8461641 0.8754401 0.9984645 -0.8461589 0.8754136 0.9984643 -0.8461587 0.8753853 0.9984642 -0.8461687 0.8753576 0.998464 -0.8461977 0.8753359 0.9984638 -0.8462598 0.875329 0.9984638 -0.8463492 0.875329 0.9984638 -0.8464623 0.875329 0.9984638 -0.8466054 0.875329 0.9984638 -0.8467864 0.875329 0.9984638 -0.8470154 0.875329 0.9984638 -0.8473052 0.875329 0.9984638 -0.8476717 0.875329 0.9984638 -0.8481355 0.875329 0.9984638 -0.8487222 0.875329 0.9984638 -0.8494644 0.875329 0.9984638 -0.8504035 0.875329 0.9984638 -0.8515915 0.875329 0.9984638 -0.8530945 0.875329 0.9984638 -0.8549959 0.875329 0.9984638 -0.8574015 0.875329 0.9984638 -0.8604449 0.875329 0.9984638 -0.8642952 0.875329 0.9984638 -0.8691663 0.875329 0.9984638 -0.875329 0.875329 0.9984638 -0.8831255 0.875329 0.9984638 -0.892989 0.875329 0.9984638 -0.9054678 0.875329 0.9984638 -0.921255 0.875329 0.9984638 -0.9412278 0.875329 0.9984638 -0.9664961 0.875329 0.9984638 -0.9984638 0.875329 0.9984638 -0.9987895 0.8937407 0.9728171 -0.9990455 0.9109436 0.9614615 -0.999247 0.9263124 0.9584468 -0.9994057 0.939629 0.9599976 -0.9995308 0.9509177 0.9637914 -0.9996295 0.9603343 0.968452 -0.9997074 0.9680946 0.9732039 -0.9997688 0.9744313 0.9776422 -0.9998174 0.9795689 0.9815844 -0.9998557 0.9837116 0.9849754 -0.999886 0.9870376 0.9878296 -0.9999099 0.9896992 0.9901951 -0.9999288 0.9918234 0.9921339 -0.9999437 0.9935154 0.9937096 -0.8462171 0.8833426 0.9984653 -0.8462154 0.8833397 0.9984653 -0.8462132 0.8833361 0.9984653 -0.8462106 0.8833316 0.9984653 -0.8462073 0.8833259 0.9984652 -0.8462034 0.8833189 0.9984652 -0.8461986 0.8833102 0.9984651 -0.8461929 0.8832995 0.998465 -0.8461864 0.8832864 0.9984649 -0.8461791 0.8832705 0.9984648 -0.8461714 0.8832516 0.9984647 -0.8461641 0.8832296 0.9984645 -0.8461589 0.8832048 0.9984643 -0.8461587 0.8831782 0.9984642 -0.8461687 0.8831523 0.998464 -0.8461977 0.883132 0.9984638 -0.8462598 0.8831255 0.9984638 -0.8463492 0.8831255 0.9984638 -0.8464623 0.8831255 0.9984638 -0.8466054 0.8831255 0.9984638 -0.8467864 0.8831255 0.9984638 -0.8470154 0.8831255 0.9984638 -0.8473052 0.8831255 0.9984638 -0.8476717 0.8831255 0.9984638 -0.8481355 0.8831255 0.9984638 -0.8487222 0.8831255 0.9984638 -0.8494644 0.8831255 0.9984638 -0.8504035 0.8831255 0.9984638 -0.8515915 0.8831255 0.9984638 -0.8530945 0.8831255 0.9984638 -0.8549959 0.8831255 0.9984638 -0.8574015 0.8831255 0.9984638 -0.8604449 0.8831255 0.9984638 -0.8642952 0.8831255 0.9984638 -0.8691663 0.8831255 0.9984638 -0.875329 0.8831255 0.9984638 -0.8831255 0.8831255 0.9984638 -0.892989 0.8831255 0.9984638 -0.9054678 0.8831255 0.9984638 -0.921255 0.8831255 0.9984638 -0.9412278 0.8831255 0.9984638 -0.9664961 0.8831255 0.9984638 -0.9984638 0.8831255 0.9984638 -0.9987895 0.8987476 0.9728171 -0.9990455 0.9141422 0.9614615 -0.999247 0.928347 0.9584468 -0.9994057 0.9409186 0.9599976 -0.9995308 0.9517328 0.9637914 -0.9996295 0.9608482 0.968452 -0.9997074 0.9684181 0.9732039 -0.9997688 0.9746346 0.9776422 -0.9998174 0.9796966 0.9815844 -0.9998557 0.9837916 0.9849754 -0.999886 0.9870878 0.9878296 -0.9999099 0.9897306 0.9901951 -0.9999288 0.9918431 0.9921339 -0.9999437 0.9935277 0.9937096 -0.8462171 0.8931877 0.9984653 -0.8462154 0.8931851 0.9984653 -0.8462132 0.8931818 0.9984653 -0.8462106 0.8931777 0.9984653 -0.8462073 0.8931725 0.9984652 -0.8462034 0.8931661 0.9984652 -0.8461986 0.8931581 0.9984651 -0.8461929 0.8931483 0.998465 -0.8461864 0.8931363 0.9984649 -0.8461791 0.8931218 0.9984648 -0.8461714 0.8931045 0.9984647 -0.8461641 0.8930844 0.9984645 -0.8461589 0.8930617 0.9984643 -0.8461587 0.8930373 0.9984642 -0.8461687 0.8930136 0.998464 -0.8461977 0.892995 0.9984638 -0.8462598 0.892989 0.9984638 -0.8463492 0.892989 0.9984638 -0.8464623 0.892989 0.9984638 -0.8466054 0.892989 0.9984638 -0.8467864 0.892989 0.9984638 -0.8470154 0.892989 0.9984638 -0.8473052 0.892989 0.9984638 -0.8476717 0.892989 0.9984638 -0.8481355 0.892989 0.9984638 -0.8487222 0.892989 0.9984638 -0.8494644 0.892989 0.9984638 -0.8504035 0.892989 0.9984638 -0.8515915 0.892989 0.9984638 -0.8530945 0.892989 0.9984638 -0.8549959 0.892989 0.9984638 -0.8574015 0.892989 0.9984638 -0.8604449 0.892989 0.9984638 -0.8642952 0.892989 0.9984638 -0.8691663 0.892989 0.9984638 -0.875329 0.892989 0.9984638 -0.8831255 0.892989 0.9984638 -0.892989 0.892989 0.9984638 -0.9054678 0.892989 0.9984638 -0.921255 0.892989 0.9984638 -0.9412278 0.892989 0.9984638 -0.9664961 0.892989 0.9984638 -0.9984638 0.892989 0.9984638 -0.9987895 0.9050819 0.9728171 -0.9990455 0.9181889 0.9614615 -0.999247 0.9309211 0.9584468 -0.9994057 0.9425502 0.9599976 -0.9995308 0.952764 0.9637914 -0.9996295 0.9614985 0.968452 -0.9997074 0.9688274 0.9732039 -0.9997688 0.9748918 0.9776422 -0.9998174 0.979858 0.9815844 -0.9998557 0.9838928 0.9849754 -0.999886 0.9871512 0.9878296 -0.9999099 0.9897703 0.9901951 -0.9999288 0.991868 0.9921339 -0.9999437 0.9935432 0.9937096 -0.8462171 0.9056431 0.9984653 -0.8462154 0.9056408 0.9984653 -0.8462132 0.9056379 0.9984653 -0.8462106 0.9056342 0.9984653 -0.8462073 0.9056297 0.9984652 -0.8462034 0.905624 0.9984652 -0.8461986 0.905617 0.9984651 -0.8461929 0.9056083 0.998465 -0.8461864 0.9055977 0.9984649 -0.8461791 0.9055849 0.9984648 -0.8461714 0.9055697 0.9984647 -0.8461641 0.9055519 0.9984645 -0.8461589 0.9055319 0.9984643 -0.8461587 0.9055104 0.9984642 -0.8461687 0.9054895 0.998464 -0.8461977 0.905473 0.9984638 -0.8462598 0.9054678 0.9984638 -0.8463492 0.9054678 0.9984638 -0.8464623 0.9054678 0.9984638 -0.8466054 0.9054678 0.9984638 -0.8467864 0.9054678 0.9984638 -0.8470154 0.9054678 0.9984638 -0.8473052 0.9054678 0.9984638 -0.8476717 0.9054678 0.9984638 -0.8481355 0.9054678 0.9984638 -0.8487222 0.9054678 0.9984638 -0.8494644 0.9054678 0.9984638 -0.8504035 0.9054678 0.9984638 -0.8515915 0.9054678 0.9984638 -0.8530945 0.9054678 0.9984638 -0.8549959 0.9054678 0.9984638 -0.8574015 0.9054678 0.9984638 -0.8604449 0.9054678 0.9984638 -0.8642952 0.9054678 0.9984638 -0.8691663 0.9054678 0.9984638 -0.875329 0.9054678 0.9984638 -0.8831255 0.9054678 0.9984638 -0.892989 0.9054678 0.9984638 -0.9054678 0.9054678 0.9984638 -0.921255 0.9054678 0.9984638 -0.9412278 0.9054678 0.9984638 -0.9664961 0.9054678 0.9984638 -0.9984638 0.9054678 0.9984638 -0.9987895 0.9130957 0.9728171 -0.9990455 0.9233085 0.9614615 -0.999247 0.9341777 0.9584468 -0.9994057 0.9446144 0.9599976 -0.9995308 0.9540687 0.9637914 -0.9996295 0.9623212 0.968452 -0.9997074 0.9693452 0.9732039 -0.9997688 0.9752172 0.9776422 -0.9998174 0.9800622 0.9815844 -0.9998557 0.9840209 0.9849754 -0.999886 0.9872315 0.9878296 -0.9999099 0.9898206 0.9901951 -0.9999288 0.9918994 0.9921339 -0.9999437 0.9935629 0.9937096 -0.8462171 0.9214008 0.9984653 -0.8462154 0.9213989 0.9984653 -0.8462132 0.9213965 0.9984653 -0.8462106 0.9213934 0.9984653 -0.8462073 0.9213897 0.9984652 -0.8462034 0.9213849 0.9984652 -0.8461986 0.9213791 0.9984651 -0.8461929 0.9213719 0.998465 -0.8461864 0.9213631 0.9984649 -0.8461791 0.9213524 0.9984648 -0.8461714 0.9213397 0.9984647 -0.8461641 0.921325 0.9984645 -0.8461589 0.9213083 0.9984643 -0.8461587 0.9212904 0.9984642 -0.8461687 0.921273 0.998464 -0.8461977 0.9212593 0.9984638 -0.8462598 0.921255 0.9984638 -0.8463492 0.921255 0.9984638 -0.8464623 0.921255 0.9984638 -0.8466054 0.921255 0.9984638 -0.8467864 0.921255 0.9984638 -0.8470154 0.921255 0.9984638 -0.8473052 0.921255 0.9984638 -0.8476717 0.921255 0.9984638 -0.8481355 0.921255 0.9984638 -0.8487222 0.921255 0.9984638 -0.8494644 0.921255 0.9984638 -0.8504035 0.921255 0.9984638 -0.8515915 0.921255 0.9984638 -0.8530945 0.921255 0.9984638 -0.8549959 0.921255 0.9984638 -0.8574015 0.921255 0.9984638 -0.8604449 0.921255 0.9984638 -0.8642952 0.921255 0.9984638 -0.8691663 0.921255 0.9984638 -0.875329 0.921255 0.9984638 -0.8831255 0.921255 0.9984638 -0.892989 0.921255 0.9984638 -0.9054678 0.921255 0.9984638 -0.921255 0.921255 0.9984638 -0.9412278 0.921255 0.9984638 -0.9664961 0.921255 0.9984638 -0.9984638 0.921255 0.9984638 -0.9987895 0.9232341 0.9728171 -0.9990455 0.9297854 0.9614615 -0.999247 0.9382977 0.9584468 -0.9994057 0.9472259 0.9599976 -0.9995308 0.9557192 0.9637914 -0.9996295 0.963362 0.968452 -0.9997074 0.9700002 0.9732039 -0.9997688 0.9756289 0.9776422 -0.9998174 0.9803206 0.9815844 -0.9998557 0.9841829 0.9849754 -0.999886 0.987333 0.9878296 -0.9999099 0.9898842 0.9901951 -0.9999288 0.9919392 0.9921339 -0.9999437 0.9935878 0.9937096 -0.8462171 0.9413364 0.9984653 -0.8462154 0.9413349 0.9984653 -0.8462132 0.9413331 0.9984653 -0.8462106 0.9413309 0.9984653 -0.8462073 0.9413281 0.9984652 -0.8462034 0.9413245 0.9984652 -0.8461986 0.9413202 0.9984651 -0.8461929 0.9413148 0.998465 -0.8461864 0.9413083 0.9984649 -0.8461791 0.9413004 0.9984648 -0.8461714 0.9412909 0.9984647 -0.8461641 0.9412799 0.9984645 -0.8461589 0.9412675 0.9984643 -0.8461587 0.9412542 0.9984642 -0.8461687 0.9412413 0.998464 -0.8461977 0.9412311 0.9984638 -0.8462598 0.9412278 0.9984638 -0.8463492 0.9412278 0.9984638 -0.8464623 0.9412278 0.9984638 -0.8466054 0.9412278 0.9984638 -0.8467864 0.9412278 0.9984638 -0.8470154 0.9412278 0.9984638 -0.8473052 0.9412278 0.9984638 -0.8476717 0.9412278 0.9984638 -0.8481355 0.9412278 0.9984638 -0.8487222 0.9412278 0.9984638 -0.8494644 0.9412278 0.9984638 -0.8504035 0.9412278 0.9984638 -0.8515915 0.9412278 0.9984638 -0.8530945 0.9412278 0.9984638 -0.8549959 0.9412278 0.9984638 -0.8574015 0.9412278 0.9984638 -0.8604449 0.9412278 0.9984638 -0.8642952 0.9412278 0.9984638 -0.8691663 0.9412278 0.9984638 -0.875329 0.9412278 0.9984638 -0.8831255 0.9412278 0.9984638 -0.892989 0.9412278 0.9984638 -0.9054678 0.9412278 0.9984638 -0.921255 0.9412278 0.9984638 -0.9412278 0.9412278 0.9984638 -0.9664961 0.9412278 0.9984638 -0.9984638 0.9412278 0.9984638 -0.9987895 0.9360606 0.9728171 -0.9990455 0.9379796 0.9614615 -0.999247 0.94351 0.9584468 -0.9994057 0.9505298 0.9599976 -0.9995308 0.9578074 0.9637914 -0.9996295 0.9646787 0.968452 -0.9997074 0.970829 0.9732039 -0.9997688 0.9761497 0.9776422 -0.9998174 0.9806476 0.9815844 -0.9998557 0.984388 0.9849754 -0.999886 0.9874615 0.9878296 -0.9999099 0.9899646 0.9901951 -0.9999288 0.9919896 0.9921339 -0.9999437 0.9936193 0.9937096 -0.8462171 0.9665574 0.9984653 -0.8462154 0.9665566 0.9984653 -0.8462132 0.9665556 0.9984653 -0.8462106 0.9665543 0.9984653 -0.8462073 0.9665527 0.9984652 -0.8462034 0.9665507 0.9984652 -0.8461986 0.9665483 0.9984651 -0.8461929 0.9665453 0.998465 -0.8461864 0.9665416 0.9984649 -0.8461791 0.9665371 0.9984648 -0.8461714 0.9665318 0.9984647 -0.8461641 0.9665255 0.9984645 -0.8461589 0.9665185 0.9984643 -0.8461587 0.966511 0.9984642 -0.8461687 0.9665037 0.998464 -0.8461977 0.966498 0.9984638 -0.8462598 0.9664961 0.9984638 -0.8463492 0.9664961 0.9984638 -0.8464623 0.9664961 0.9984638 -0.8466054 0.9664961 0.9984638 -0.8467864 0.9664961 0.9984638 -0.8470154 0.9664961 0.9984638 -0.8473052 0.9664961 0.9984638 -0.8476717 0.9664961 0.9984638 -0.8481355 0.9664961 0.9984638 -0.8487222 0.9664961 0.9984638 -0.8494644 0.9664961 0.9984638 -0.8504035 0.9664961 0.9984638 -0.8515915 0.9664961 0.9984638 -0.8530945 0.9664961 0.9984638 -0.8549959 0.9664961 0.9984638 -0.8574015 0.9664961 0.9984638 -0.8604449 0.9664961 0.9984638 -0.8642952 0.9664961 0.9984638 -0.8691663 0.9664961 0.9984638 -0.875329 0.9664961 0.9984638 -0.8831255 0.9664961 0.9984638 -0.892989 0.9664961 0.9984638 -0.9054678 0.9664961 0.9984638 -0.921255 0.9664961 0.9984638 -0.9412278 0.9664961 0.9984638 -0.9664961 0.9664961 0.9984638 -0.9984638 0.9664961 0.9984638 -0.9987895 0.9522877 0.9728171 -0.9990455 0.9483463 0.9614615 -0.999247 0.9501042 0.9584468 -0.9994057 0.9547096 0.9599976 -0.9995308 0.9604492 0.9637914 -0.9996295 0.9663445 0.968452 -0.9997074 0.9718774 0.9732039 -0.9997688 0.9768086 0.9776422 -0.9998174 0.9810611 0.9815844 -0.9998557 0.9846473 0.9849754 -0.999886 0.987624 0.9878296 -0.9999099 0.9900664 0.9901951 -0.9999288 0.9920533 0.9921339 -0.9999437 0.9936592 0.9937096 -0.8462171 0.9984653 0.9984653 -0.8462154 0.9984653 0.9984653 -0.8462132 0.9984653 0.9984653 -0.8462106 0.9984653 0.9984653 -0.8462073 0.9984652 0.9984652 -0.8462034 0.9984652 0.9984652 -0.8461986 0.9984651 0.9984651 -0.8461929 0.998465 0.998465 -0.8461864 0.9984649 0.9984649 -0.8461791 0.9984648 0.9984648 -0.8461714 0.9984647 0.9984647 -0.8461641 0.9984645 0.9984645 -0.8461589 0.9984643 0.9984643 -0.8461587 0.9984642 0.9984642 -0.8461687 0.998464 0.998464 -0.8461977 0.9984638 0.9984638 -0.8462598 0.9984638 0.9984638 -0.8463492 0.9984638 0.9984638 -0.8464623 0.9984638 0.9984638 -0.8466054 0.9984638 0.9984638 -0.8467864 0.9984638 0.9984638 -0.8470154 0.9984638 0.9984638 -0.8473052 0.9984638 0.9984638 -0.8476717 0.9984638 0.9984638 -0.8481355 0.9984638 0.9984638 -0.8487222 0.9984638 0.9984638 -0.8494644 0.9984638 0.9984638 -0.8504035 0.9984638 0.9984638 -0.8515915 0.9984638 0.9984638 -0.8530945 0.9984638 0.9984638 -0.8549959 0.9984638 0.9984638 -0.8574015 0.9984638 0.9984638 -0.8604449 0.9984638 0.9984638 -0.8642952 0.9984638 0.9984638 -0.8691663 0.9984638 0.9984638 -0.875329 0.9984638 0.9984638 -0.8831255 0.9984638 0.9984638 -0.892989 0.9984638 0.9984638 -0.9054678 0.9984638 0.9984638 -0.921255 0.9984638 0.9984638 -0.9412278 0.9984638 0.9984638 -0.9664961 0.9984638 0.9984638 -0.9984638 0.9984638 0.9984638 -0.9987895 0.9728171 0.9728171 -0.9990455 0.9614615 0.9614615 -0.999247 0.9584468 0.9584468 -0.9994057 0.9599976 0.9599976 -0.9995308 0.9637914 0.9637914 -0.9996295 0.968452 0.968452 -0.9997074 0.9732039 0.9732039 -0.9997688 0.9776422 0.9776422 -0.9998174 0.9815844 0.9815844 -0.9998557 0.9849754 0.9849754 -0.999886 0.9878296 0.9878296 -0.9999099 0.9901951 0.9901951 -0.9999288 0.9921339 0.9921339 -0.9999437 0.9937096 0.9937096 -0.8750477 0.9987905 0.972857 -0.8750466 0.9987905 0.9728564 -0.8750451 0.9987904 0.9728558 -0.8750434 0.9987904 0.972855 -0.8750412 0.9987904 0.9728539 -0.8750386 0.9987904 0.9728526 -0.8750355 0.9987903 0.972851 -0.8750317 0.9987903 0.9728491 -0.8750274 0.9987902 0.9728467 -0.8750225 0.9987902 0.9728437 -0.8750173 0.9987901 0.9728403 -0.8750124 0.99879 0.9728362 -0.8750088 0.9987899 0.9728317 -0.8750084 0.9987897 0.9728268 -0.8750145 0.9987896 0.9728221 -0.8750329 0.9987895 0.9728183 -0.8750727 0.9987895 0.9728171 -0.8751301 0.9987895 0.9728171 -0.8752028 0.9987895 0.9728171 -0.8752947 0.9987895 0.9728171 -0.8754109 0.9987895 0.9728171 -0.875558 0.9987895 0.9728171 -0.8757441 0.9987895 0.9728171 -0.8759795 0.9987895 0.9728171 -0.8762773 0.9987895 0.9728171 -0.8766541 0.9987895 0.9728171 -0.8771307 0.9987895 0.9728171 -0.8777338 0.9987895 0.9728171 -0.8784967 0.9987895 0.9728171 -0.8794619 0.9987895 0.9728171 -0.880683 0.9987895 0.9728171 -0.8822279 0.9987895 0.9728171 -0.8841823 0.9987895 0.9728171 -0.886655 0.9987895 0.9728171 -0.8897832 0.9987895 0.9728171 -0.8937407 0.9987895 0.9728171 -0.8987476 0.9987895 0.9728171 -0.9050819 0.9987895 0.9728171 -0.9130957 0.9987895 0.9728171 -0.9232341 0.9987895 0.9728171 -0.9360606 0.9987895 0.9728171 -0.9522877 0.9987895 0.9728171 -0.9728171 0.9987895 0.9728171 -0.9987895 0.9987895 0.9728171 -0.9990455 0.9780539 0.9614615 -0.999247 0.9690013 0.9584468 -0.9994057 0.9666876 0.9599976 -0.9995308 0.9680197 0.9637914 -0.9996295 0.9711183 0.968452 -0.9997074 0.974882 0.9732039 -0.9997688 0.9786968 0.9776422 -0.9998174 0.9822464 0.9815844 -0.9998557 0.9853905 0.9849754 -0.999886 0.9880897 0.9878296 -0.9999099 0.990358 0.9901951 -0.9999288 0.9922358 0.9921339 -0.9999437 0.9937734 0.9937096 -0.8990028 0.9990461 0.961507 -0.899002 0.9990461 0.9615064 -0.8990011 0.9990461 0.9615057 -0.899 0.9990461 0.9615047 -0.8989986 0.9990461 0.9615035 -0.8989969 0.9990461 0.9615021 -0.8989948 0.9990461 0.9615002 -0.8989923 0.999046 0.961498 -0.8989895 0.999046 0.9614952 -0.8989863 0.9990459 0.9614919 -0.8989829 0.9990459 0.961488 -0.8989796 0.9990458 0.9614833 -0.8989771 0.9990458 0.9614781 -0.8989767 0.9990457 0.9614726 -0.8989805 0.9990456 0.9614671 -0.8989921 0.9990456 0.9614628 -0.8990175 0.9990455 0.9614615 -0.8990542 0.9990455 0.9614615 -0.8991006 0.9990455 0.9614615 -0.8991593 0.9990455 0.9614615 -0.8992336 0.9990455 0.9614615 -0.8993275 0.9990455 0.9614615 -0.8994464 0.9990455 0.9614615 -0.8995968 0.9990455 0.9614615 -0.899787 0.9990455 0.9614615 -0.9000277 0.9990455 0.9614615 -0.9003323 0.9990455 0.9614615 -0.9007175 0.9990455 0.9614615 -0.9012049 0.9990455 0.9614615 -0.9018215 0.9990455 0.9614615 -0.9026016 0.9990455 0.9614615 -0.9035886 0.9990455 0.9614615 -0.9048372 0.9990455 0.9614615 -0.9064168 0.9990455 0.9614615 -0.9084153 0.9990455 0.9614615 -0.9109436 0.9990455 0.9614615 -0.9141422 0.9990455 0.9614615 -0.9181889 0.9990455 0.9614615 -0.9233085 0.9990455 0.9614615 -0.9297854 0.9990455 0.9614615 -0.9379796 0.9990455 0.9614615 -0.9483463 0.9990455 0.9614615 -0.9614615 0.9990455 0.9614615 -0.9780539 0.9990455 0.9614615 -0.9990455 0.9990455 0.9614615 -0.999247 0.982354 0.9584468 -0.9994057 0.9751513 0.9599976 -0.9995308 0.9733691 0.9637914 -0.9996295 0.9744915 0.968452 -0.9997074 0.977005 0.9732039 -0.9997688 0.980031 0.9776422 -0.9998174 0.9830838 0.9815844 -0.9998557 0.9859157 0.9849754 -0.999886 0.9884188 0.9878296 -0.9999099 0.9905641 0.9901951 -0.9999288 0.9923648 0.9921339 -0.9999437 0.9938541 0.9937096 -0.9187175 0.9992474 0.9584861 -0.918717 0.9992474 0.9584856 -0.9187164 0.9992474 0.9584849 -0.9187157 0.9992474 0.9584841 -0.9187148 0.9992474 0.9584831 -0.9187137 0.9992474 0.9584818 -0.9187123 0.9992473 0.9584803 -0.9187107 0.9992473 0.9584783 -0.9187089 0.9992473 0.9584759 -0.9187068 0.9992473 0.9584731 -0.9187045 0.9992472 0.9584696 -0.9187024 0.9992472 0.9584657 -0.9187008 0.9992472 0.9584612 -0.9187004 0.9992471 0.9584564 -0.9187027 0.9992471 0.9584517 -0.9187101 0.999247 0.958448 -0.9187262 0.999247 0.9584468 -0.9187495 0.999247 0.9584468 -0.9187791 0.999247 0.9584468 -0.9188164 0.999247 0.9584468 -0.9188636 0.999247 0.9584468 -0.9189234 0.999247 0.9584468 -0.918999 0.999247 0.9584468 -0.9190947 0.999247 0.9584468 -0.9192157 0.999247 0.9584468 -0.9193688 0.999247 0.9584468 -0.9195625 0.999247 0.9584468 -0.9198076 0.999247 0.9584468 -0.9201176 0.999247 0.9584468 -0.9205098 0.999247 0.9584468 -0.9210061 0.999247 0.9584468 -0.9216339 0.999247 0.9584468 -0.9224281 0.999247 0.9584468 -0.9234329 0.999247 0.9584468 -0.9247041 0.999247 0.9584468 -0.9263124 0.999247 0.9584468 -0.928347 0.999247 0.9584468 -0.9309211 0.999247 0.9584468 -0.9341777 0.999247 0.9584468 -0.9382977 0.999247 0.9584468 -0.94351 0.999247 0.9584468 -0.9501042 0.999247 0.9584468 -0.9584468 0.999247 0.9584468 -0.9690013 0.999247 0.9584468 -0.982354 0.999247 0.9584468 -0.999247 0.999247 0.9584468 -0.9994057 0.9858591 0.9599976 -0.9995308 0.9801368 0.9637914 -0.9996295 0.978759 0.968452 -0.9997074 0.9796909 0.9732039 -0.9997688 0.981719 0.9776422 -0.9998174 0.9841433 0.9815844 -0.9998557 0.9865801 0.9849754 -0.999886 0.9888351 0.9878296 -0.9999099 0.9908248 0.9901951 -0.9999288 0.992528 0.9921339 -0.9999437 0.9939562 0.9937096 -0.9348153 0.999406 0.9600277 -0.9348149 0.999406 0.9600273 -0.9348146 0.999406 0.9600268 -0.9348141 0.999406 0.9600262 -0.9348135 0.999406 0.9600254 -0.9348128 0.9994059 0.9600245 -0.9348119 0.9994059 0.9600233 -0.9348109 0.9994059 0.9600218 -0.9348097 0.9994059 0.9600199 -0.9348083 0.9994059 0.9600177 -0.9348069 0.9994059 0.9600151 -0.9348055 0.9994059 0.9600121 -0.9348044 0.9994058 0.9600086 -0.9348042 0.9994058 0.9600049 -0.9348056 0.9994058 0.9600013 -0.9348102 0.9994057 0.9599985 -0.9348204 0.9994057 0.9599976 -0.9348352 0.9994057 0.9599976 -0.9348539 0.9994057 0.9599976 -0.9348776 0.9994057 0.9599976 -0.9349075 0.9994057 0.9599976 -0.9349454 0.9994057 0.9599976 -0.9349933 0.9994057 0.9599976 -0.935054 0.9994057 0.9599976 -0.9351307 0.9994057 0.9599976 -0.9352277 0.9994057 0.9599976 -0.9353505 0.9994057 0.9599976 -0.9355059 0.9994057 0.9599976 -0.9357024 0.9994057 0.9599976 -0.935951 0.9994057 0.9599976 -0.9362655 0.9994057 0.9599976 -0.9366635 0.9994057 0.9599976 -0.9371669 0.9994057 0.9599976 -0.9378038 0.9994057 0.9599976 -0.9386096 0.9994057 0.9599976 -0.939629 0.9994057 0.9599976 -0.9409186 0.9994057 0.9599976 -0.9425502 0.9994057 0.9599976 -0.9446144 0.9994057 0.9599976 -0.9472259 0.9994057 0.9599976 -0.9505298 0.9994057 0.9599976 -0.9547096 0.9994057 0.9599976 -0.9599976 0.9994057 0.9599976 -0.9666876 0.9994057 0.9599976 -0.9751513 0.9994057 0.9599976 -0.9858591 0.9994057 0.9599976 -0.9994057 0.9994057 0.9599976 -0.9995308 0.9886988 0.9637914 -0.9996295 0.9841579 0.968452 -0.9997074 0.983089 0.9732039 -0.9997688 0.9838545 0.9776422 -0.9998174 0.9854838 0.9815844 -0.9998557 0.9874207 0.9849754 -0.999886 0.9893618 0.9878296 -0.9999099 0.9911547 0.9901951 -0.9999288 0.9927345 0.9921339 -0.9999437 0.9940854 0.9937096 -0.9478754 0.999531 0.9638131 -0.9478752 0.999531 0.9638128 -0.947875 0.999531 0.9638125 -0.9478746 0.999531 0.963812 -0.9478743 0.999531 0.9638114 -0.9478738 0.999531 0.9638107 -0.9478733 0.999531 0.9638099 -0.9478726 0.999531 0.9638088 -0.9478718 0.999531 0.9638075 -0.947871 0.9995309 0.9638059 -0.94787 0.9995309 0.963804 -0.9478691 0.9995309 0.9638018 -0.9478684 0.9995309 0.9637993 -0.9478683 0.9995309 0.9637967 -0.9478691 0.9995309 0.9637941 -0.947872 0.9995309 0.963792 -0.9478785 0.9995308 0.9637914 -0.9478878 0.9995308 0.9637914 -0.9478997 0.9995308 0.9637914 -0.9479146 0.9995308 0.9637914 -0.9479335 0.9995308 0.9637914 -0.9479575 0.9995308 0.9637914 -0.9479878 0.9995308 0.9637914 -0.9480261 0.9995308 0.9637914 -0.9480746 0.9995308 0.9637914 -0.9481359 0.9995308 0.9637914 -0.9482135 0.9995308 0.9637914 -0.9483117 0.9995308 0.9637914 -0.9484359 0.9995308 0.9637914 -0.9485931 0.9995308 0.9637914 -0.9487918 0.9995308 0.9637914 -0.9490434 0.9995308 0.9637914 -0.9493615 0.9995308 0.9637914 -0.9497641 0.9995308 0.9637914 -0.9502734 0.9995308 0.9637914 -0.9509177 0.9995308 0.9637914 -0.9517328 0.9995308 0.9637914 -0.952764 0.9995308 0.9637914 -0.9540687 0.9995308 0.9637914 -0.9557192 0.9995308 0.9637914 -0.9578074 0.9995308 0.9637914 -0.9604492 0.9995308 0.9637914 -0.9637914 0.9995308 0.9637914 -0.9680197 0.9995308 0.9637914 -0.9733691 0.9995308 0.9637914 -0.9801368 0.9995308 0.9637914 -0.9886988 0.9995308 0.9637914 -0.9995308 0.9995308 0.9637914 -0.9996295 0.9909882 0.968452 -0.9997074 0.9873879 0.9732039 -0.9997688 0.9865561 0.9776422 -0.9998174 0.9871796 0.9815844 -0.9998557 0.9884841 0.9849754 -0.999886 0.9900282 0.9878296 -0.9999099 0.991572 0.9901951 -0.9999288 0.9929957 0.9921339 -0.9999437 0.9942488 0.9937096 -0.958416 0.9996296 0.9684671 -0.9584159 0.9996296 0.9684669 -0.9584157 0.9996296 0.9684666 -0.9584155 0.9996296 0.9684663 -0.9584153 0.9996296 0.9684659 -0.958415 0.9996296 0.9684654 -0.9584146 0.9996296 0.9684648 -0.9584142 0.9996296 0.9684641 -0.9584137 0.9996296 0.9684632 -0.9584132 0.9996296 0.9684621 -0.9584126 0.9996296 0.9684608 -0.958412 0.9996296 0.9684592 -0.9584115 0.9996296 0.9684575 -0.9584114 0.9996295 0.9684557 -0.958412 0.9996295 0.9684539 -0.9584138 0.9996295 0.9684525 -0.9584178 0.9996295 0.968452 -0.9584237 0.9996295 0.968452 -0.9584312 0.9996295 0.968452 -0.9584406 0.9996295 0.968452 -0.9584526 0.9996295 0.968452 -0.9584677 0.9996295 0.968452 -0.9584868 0.9996295 0.968452 -0.9585109 0.9996295 0.968452 -0.9585415 0.9996295 0.968452 -0.9585802 0.9996295 0.968452 -0.9586291 0.9996295 0.968452 -0.958691 0.9996295 0.968452 -0.9587693 0.9996295 0.968452 -0.9588684 0.9996295 0.968452 -0.9589938 0.9996295 0.968452 -0.9591524 0.9996295 0.968452 -0.959353 0.9996295 0.968452 -0.9596068 0.9996295 0.968452 -0.959928 0.9996295 0.968452 -0.9603343 0.9996295 0.968452 -0.9608482 0.9996295 0.968452 -0.9614985 0.9996295 0.968452 -0.9623212 0.9996295 0.968452 -0.963362 0.9996295 0.968452 -0.9646787 0.9996295 0.968452 -0.9663445 0.9996295 0.968452 -0.968452 0.9996295 0.968452 -0.9711183 0.9996295 0.968452 -0.9744915 0.9996295 0.968452 -0.978759 0.9996295 0.968452 -0.9841579 0.9996295 0.968452 -0.9909882 0.9996295 0.968452 -0.9996295 0.9996295 0.968452 -0.9997074 0.9928267 0.9732039 -0.9997688 0.9899741 0.9776422 -0.9998174 0.989325 0.9815844 -0.9998557 0.9898295 0.9849754 -0.999886 0.9908712 0.9878296 -0.9999099 0.9920999 0.9901951 -0.9999288 0.9933261 0.9921339 -0.9999437 0.9944556 0.9937096 -0.9668873 0.9997074 0.973214 -0.9668872 0.9997074 0.9732139 -0.9668871 0.9997074 0.9732137 -0.966887 0.9997074 0.9732135 -0.9668869 0.9997074 0.9732132 -0.9668867 0.9997074 0.9732129 -0.9668865 0.9997074 0.9732125 -0.9668862 0.9997074 0.973212 -0.9668859 0.9997074 0.9732114 -0.9668855 0.9997074 0.9732106 -0.9668852 0.9997074 0.9732098 -0.9668848 0.9997074 0.9732087 -0.9668845 0.9997074 0.9732076 -0.9668844 0.9997074 0.9732063 -0.9668847 0.9997074 0.9732051 -0.9668859 0.9997074 0.9732042 -0.9668884 0.9997074 0.9732039 -0.9668922 0.9997074 0.9732039 -0.9668969 0.9997074 0.9732039 -0.9669028 0.9997074 0.9732039 -0.9669103 0.9997074 0.9732039 -0.9669198 0.9997074 0.9732039 -0.9669318 0.9997074 0.9732039 -0.966947 0.9997074 0.9732039 -0.9669663 0.9997074 0.9732039 -0.9669906 0.9997074 0.9732039 -0.9670214 0.9997074 0.9732039 -0.9670604 0.9997074 0.9732039 -0.9671097 0.9997074 0.9732039 -0.967172 0.9997074 0.9732039 -0.9672509 0.9997074 0.9732039 -0.9673508 0.9997074 0.9732039 -0.967477 0.9997074 0.9732039 -0.9676368 0.9997074 0.9732039 -0.9678389 0.9997074 0.9732039 -0.9680946 0.9997074 0.9732039 -0.9684181 0.9997074 0.9732039 -0.9688274 0.9997074 0.9732039 -0.9693452 0.9997074 0.9732039 -0.9700002 0.9997074 0.9732039 -0.970829 0.9997074 0.9732039 -0.9718774 0.9997074 0.9732039 -0.9732039 0.9997074 0.9732039 -0.974882 0.9997074 0.9732039 -0.977005 0.9997074 0.9732039 -0.9796909 0.9997074 0.9732039 -0.983089 0.9997074 0.9732039 -0.9873879 0.9997074 0.9732039 -0.9928267 0.9997074 0.9732039 -0.9997074 0.9997074 0.9732039 -0.9997688 0.9942982 0.9776422 -0.9998174 0.9920392 0.9815844 -0.9998557 0.9915316 0.9849754 -0.999886 0.9919377 0.9878296 -0.9999099 0.9927678 0.9901951 -0.9999288 0.9937442 0.9921339 -0.9999437 0.9947172 0.9937096 -0.9736726 0.9997689 0.9776489 -0.9736726 0.9997689 0.9776488 -0.9736725 0.9997689 0.9776487 -0.9736724 0.9997689 0.9776486 -0.9736723 0.9997689 0.9776484 -0.9736722 0.9997689 0.9776482 -0.9736721 0.9997689 0.9776479 -0.9736719 0.9997689 0.9776476 -0.9736717 0.9997689 0.9776472 -0.9736715 0.9997689 0.9776467 -0.9736712 0.9997689 0.9776461 -0.973671 0.9997689 0.9776454 -0.9736708 0.9997689 0.9776447 -0.9736708 0.9997689 0.9776438 -0.973671 0.9997688 0.977643 -0.9736717 0.9997688 0.9776424 -0.9736733 0.9997688 0.9776422 -0.9736756 0.9997688 0.9776422 -0.9736786 0.9997688 0.9776422 -0.9736823 0.9997688 0.9776422 -0.973687 0.9997688 0.9776422 -0.973693 0.9997688 0.9776422 -0.9737006 0.9997688 0.9776422 -0.9737101 0.9997688 0.9776422 -0.9737222 0.9997688 0.9776422 -0.9737375 0.9997688 0.9776422 -0.9737569 0.9997688 0.9776422 -0.9737814 0.9997688 0.9776422 -0.9738123 0.9997688 0.9776422 -0.9738515 0.9997688 0.9776422 -0.9739011 0.9997688 0.9776422 -0.9739638 0.9997688 0.9776422 -0.9740432 0.9997688 0.9776422 -0.9741436 0.9997688 0.9776422 -0.9742706 0.9997688 0.9776422 -0.9744313 0.9997688 0.9776422 -0.9746346 0.9997688 0.9776422 -0.9748918 0.9997688 0.9776422 -0.9752172 0.9997688 0.9776422 -0.9756289 0.9997688 0.9776422 -0.9761497 0.9997688 0.9776422 -0.9768086 0.9997688 0.9776422 -0.9776422 0.9997688 0.9776422 -0.9786968 0.9997688 0.9776422 -0.980031 0.9997688 0.9776422 -0.981719 0.9997688 0.9776422 -0.9838545 0.9997688 0.9776422 -0.9865561 0.9997688 0.9776422 -0.9899741 0.9997688 0.9776422 -0.9942982 0.9997688 0.9776422 -0.9997688 0.9997688 0.9776422 -0.9998174 0.9954731 0.9815844 -0.9998557 0.9936849 0.9849754 -0.999886 0.993287 0.9878296 -0.9999099 0.9936128 0.9901951 -0.9999288 0.9942731 0.9921339 -0.9999437 0.9950481 0.9937096 -0.9790927 0.9998174 0.9815888 -0.9790927 0.9998174 0.9815887 -0.9790927 0.9998174 0.9815886 -0.9790926 0.9998174 0.9815885 -0.9790925 0.9998174 0.9815884 -0.9790925 0.9998174 0.9815883 -0.9790924 0.9998174 0.9815881 -0.9790923 0.9998174 0.9815879 -0.9790921 0.9998174 0.9815876 -0.979092 0.9998174 0.9815873 -0.9790919 0.9998174 0.9815869 -0.9790917 0.9998174 0.9815865 -0.9790916 0.9998174 0.981586 -0.9790916 0.9998174 0.9815855 -0.9790917 0.9998174 0.9815849 -0.9790921 0.9998174 0.9815845 -0.9790931 0.9998174 0.9815844 -0.9790946 0.9998174 0.9815844 -0.9790965 0.9998174 0.9815844 -0.9790988 0.9998174 0.9815844 -0.9791018 0.9998174 0.9815844 -0.9791055 0.9998174 0.9815844 -0.9791103 0.9998174 0.9815844 -0.9791163 0.9998174 0.9815844 -0.9791238 0.9998174 0.9815844 -0.9791334 0.9998174 0.9815844 -0.9791456 0.9998174 0.9815844 -0.979161 0.9998174 0.9815844 -0.9791804 0.9998174 0.9815844 -0.979205 0.9998174 0.9815844 -0.9792361 0.9998174 0.9815844 -0.9792755 0.9998174 0.9815844 -0.9793253 0.9998174 0.9815844 -0.9793883 0.9998174 0.9815844 -0.9794681 0.9998174 0.9815844 -0.9795689 0.9998174 0.9815844 -0.9796966 0.9998174 0.9815844 -0.979858 0.9998174 0.9815844 -0.9800622 0.9998174 0.9815844 -0.9803206 0.9998174 0.9815844 -0.9806476 0.9998174 0.9815844 -0.9810611 0.9998174 0.9815844 -0.9815844 0.9998174 0.9815844 -0.9822464 0.9998174 0.9815844 -0.9830838 0.9998174 0.9815844 -0.9841433 0.9998174 0.9815844 -0.9854838 0.9998174 0.9815844 -0.9871796 0.9998174 0.9815844 -0.989325 0.9998174 0.9815844 -0.9920392 0.9998174 0.9815844 -0.9954731 0.9998174 0.9815844 -0.9998174 0.9998174 0.9815844 -0.9998557 0.9964092 0.9849754 -0.999886 0.9949941 0.9878296 -0.9999099 0.9946818 0.9901951 -0.9999288 0.9949422 0.9921339 -0.9999437 0.9954668 0.9937096 -0.9834129 0.9998557 0.9849783 -0.9834129 0.9998557 0.9849782 -0.9834129 0.9998557 0.9849782 -0.9834129 0.9998557 0.9849781 -0.9834128 0.9998557 0.984978 -0.9834128 0.9998557 0.9849779 -0.9834127 0.9998557 0.9849778 -0.9834127 0.9998557 0.9849777 -0.9834126 0.9998557 0.9849775 -0.9834125 0.9998557 0.9849773 -0.9834124 0.9998557 0.9849771 -0.9834123 0.9998557 0.9849768 -0.9834122 0.9998557 0.9849765 -0.9834122 0.9998557 0.9849761 -0.9834123 0.9998557 0.9849758 -0.9834126 0.9998557 0.9849755 -0.9834132 0.9998557 0.9849754 -0.9834141 0.9998557 0.9849754 -0.9834153 0.9998557 0.9849754 -0.9834167 0.9998557 0.9849754 -0.9834186 0.9998557 0.9849754 -0.9834209 0.9998557 0.9849754 -0.9834239 0.9998557 0.9849754 -0.9834277 0.9998557 0.9849754 -0.9834324 0.9998557 0.9849754 -0.9834385 0.9998557 0.9849754 -0.9834461 0.9998557 0.9849754 -0.9834557 0.9998557 0.9849754 -0.9834679 0.9998557 0.9849754 -0.9834833 0.9998557 0.9849754 -0.9835029 0.9998557 0.9849754 -0.9835276 0.9998557 0.9849754 -0.9835588 0.9998557 0.9849754 -0.9835983 0.9998557 0.9849754 -0.9836483 0.9998557 0.9849754 -0.9837116 0.9998557 0.9849754 -0.9837916 0.9998557 0.9849754 -0.9838928 0.9998557 0.9849754 -0.9840209 0.9998557 0.9849754 -0.9841829 0.9998557 0.9849754 -0.984388 0.9998557 0.9849754 -0.9846473 0.9998557 0.9849754 -0.9849754 0.9998557 0.9849754 -0.9853905 0.9998557 0.9849754 -0.9859157 0.9998557 0.9849754 -0.9865801 0.9998557 0.9849754 -0.9874207 0.9998557 0.9849754 -0.9884841 0.9998557 0.9849754 -0.9898295 0.9998557 0.9849754 -0.9915316 0.9998557 0.9849754 -0.9936849 0.9998557 0.9849754 -0.9964092 0.9998557 0.9849754 -0.9998557 0.9998557 0.9849754 -0.999886 0.9971537 0.9878296 -0.9999099 0.9960342 0.9901951 -0.9999288 0.9957887 0.9921339 -0.9999437 0.9959964 0.9937096 -0.9868505 0.999886 0.9878314 -0.9868505 0.999886 0.9878314 -0.9868505 0.999886 0.9878313 -0.9868505 0.999886 0.9878313 -0.9868504 0.999886 0.9878313 -0.9868504 0.999886 0.9878312 -0.9868504 0.999886 0.9878311 -0.9868503 0.999886 0.987831 -0.9868503 0.999886 0.9878309 -0.9868502 0.999886 0.9878308 -0.9868502 0.999886 0.9878306 -0.9868501 0.999886 0.9878304 -0.9868501 0.999886 0.9878302 -0.98685 0.999886 0.98783 -0.9868501 0.999886 0.9878298 -0.9868503 0.999886 0.9878296 -0.9868507 0.999886 0.9878296 -0.9868512 0.999886 0.9878296 -0.986852 0.999886 0.9878296 -0.9868529 0.999886 0.9878296 -0.9868541 0.999886 0.9878296 -0.9868555 0.999886 0.9878296 -0.9868574 0.999886 0.9878296 -0.9868597 0.999886 0.9878296 -0.9868627 0.999886 0.9878296 -0.9868665 0.999886 0.9878296 -0.9868713 0.999886 0.9878296 -0.9868773 0.999886 0.9878296 -0.986885 0.999886 0.9878296 -0.9868946 0.999886 0.9878296 -0.9869069 0.999886 0.9878296 -0.9869223 0.999886 0.9878296 -0.9869419 0.999886 0.9878296 -0.9869667 0.999886 0.9878296 -0.986998 0.999886 0.9878296 -0.9870376 0.999886 0.9878296 -0.9870878 0.999886 0.9878296 -0.9871512 0.999886 0.9878296 -0.9872315 0.999886 0.9878296 -0.987333 0.999886 0.9878296 -0.9874615 0.999886 0.9878296 -0.987624 0.999886 0.9878296 -0.9878296 0.999886 0.9878296 -0.9880897 0.999886 0.9878296 -0.9884188 0.999886 0.9878296 -0.9888351 0.999886 0.9878296 -0.9893618 0.999886 0.9878296 -0.9900282 0.999886 0.9878296 -0.9908712 0.999886 0.9878296 -0.9919377 0.999886 0.9878296 -0.993287 0.999886 0.9878296 -0.9949941 0.999886 0.9878296 -0.9971537 0.999886 0.9878296 -0.999886 0.999886 0.9878296 -0.9999099 0.9977452 0.9901951 -0.9999288 0.9968597 0.9921339 -0.9999437 0.9966665 0.9937096 -0.989582 0.9999099 0.9901963 -0.989582 0.9999099 0.9901963 -0.989582 0.9999099 0.9901963 -0.989582 0.9999099 0.9901962 -0.989582 0.9999099 0.9901962 -0.9895819 0.9999099 0.9901962 -0.9895819 0.9999099 0.9901961 -0.9895819 0.9999099 0.9901961 -0.9895819 0.9999099 0.990196 -0.9895818 0.9999099 0.9901959 -0.9895818 0.9999099 0.9901958 -0.9895818 0.9999099 0.9901957 -0.9895817 0.9999099 0.9901956 -0.9895817 0.9999099 0.9901954 -0.9895817 0.9999099 0.9901953 -0.9895819 0.9999099 0.9901952 -0.9895821 0.9999099 0.9901951 -0.9895825 0.9999099 0.9901951 -0.9895829 0.9999099 0.9901951 -0.9895835 0.9999099 0.9901951 -0.9895842 0.9999099 0.9901951 -0.9895851 0.9999099 0.9901951 -0.9895863 0.9999099 0.9901951 -0.9895878 0.9999099 0.9901951 -0.9895897 0.9999099 0.9901951 -0.989592 0.9999099 0.9901951 -0.989595 0.9999099 0.9901951 -0.9895988 0.9999099 0.9901951 -0.9896036 0.9999099 0.9901951 -0.9896096 0.9999099 0.9901951 -0.9896173 0.9999099 0.9901951 -0.989627 0.9999099 0.9901951 -0.9896392 0.9999099 0.9901951 -0.9896547 0.9999099 0.9901951 -0.9896744 0.9999099 0.9901951 -0.9896992 0.9999099 0.9901951 -0.9897306 0.9999099 0.9901951 -0.9897703 0.9999099 0.9901951 -0.9898206 0.9999099 0.9901951 -0.9898842 0.9999099 0.9901951 -0.9899646 0.9999099 0.9901951 -0.9900664 0.9999099 0.9901951 -0.9901951 0.9999099 0.9901951 -0.990358 0.9999099 0.9901951 -0.9905641 0.9999099 0.9901951 -0.9908248 0.9999099 0.9901951 -0.9911547 0.9999099 0.9901951 -0.991572 0.9999099 0.9901951 -0.9920999 0.9999099 0.9901951 -0.9927678 0.9999099 0.9901951 -0.9936128 0.9999099 0.9901951 -0.9946818 0.9999099 0.9901951 -0.9960342 0.9999099 0.9901951 -0.9977452 0.9999099 0.9901951 -0.9999099 0.9999099 0.9901951 -0.9999288 0.9982146 0.9921339 -0.9999437 0.9975143 0.9937096 -0.9917501 0.9999288 0.9921346 -0.9917501 0.9999288 0.9921346 -0.9917501 0.9999288 0.9921346 -0.9917501 0.9999288 0.9921346 -0.9917501 0.9999288 0.9921345 -0.9917501 0.9999288 0.9921345 -0.99175 0.9999288 0.9921345 -0.99175 0.9999288 0.9921345 -0.99175 0.9999288 0.9921344 -0.99175 0.9999288 0.9921344 -0.99175 0.9999288 0.9921343 -0.9917499 0.9999288 0.9921342 -0.9917499 0.9999288 0.9921341 -0.9917499 0.9999288 0.992134 -0.9917499 0.9999288 0.992134 -0.99175 0.9999288 0.9921339 -0.9917502 0.9999288 0.9921339 -0.9917504 0.9999288 0.9921339 -0.9917507 0.9999288 0.9921339 -0.991751 0.9999288 0.9921339 -0.9917515 0.9999288 0.9921339 -0.9917521 0.9999288 0.9921339 -0.9917528 0.9999288 0.9921339 -0.9917537 0.9999288 0.9921339 -0.9917549 0.9999288 0.9921339 -0.9917564 0.9999288 0.9921339 -0.9917582 0.9999288 0.9921339 -0.9917606 0.9999288 0.9921339 -0.9917636 0.9999288 0.9921339 -0.9917674 0.9999288 0.9921339 -0.9917722 0.9999288 0.9921339 -0.9917782 0.9999288 0.9921339 -0.9917859 0.9999288 0.9921339 -0.9917956 0.9999288 0.9921339 -0.9918079 0.9999288 0.9921339 -0.9918234 0.9999288 0.9921339 -0.9918431 0.9999288 0.9921339 -0.991868 0.9999288 0.9921339 -0.9918994 0.9999288 0.9921339 -0.9919392 0.9999288 0.9921339 -0.9919896 0.9999288 0.9921339 -0.9920533 0.9999288 0.9921339 -0.9921339 0.9999288 0.9921339 -0.9922358 0.9999288 0.9921339 -0.9923648 0.9999288 0.9921339 -0.992528 0.9999288 0.9921339 -0.9927345 0.9999288 0.9921339 -0.9929957 0.9999288 0.9921339 -0.9933261 0.9999288 0.9921339 -0.9937442 0.9999288 0.9921339 -0.9942731 0.9999288 0.9921339 -0.9949422 0.9999288 0.9921339 -0.9957887 0.9999288 0.9921339 -0.9968597 0.9999288 0.9921339 -0.9982146 0.9999288 0.9921339 -0.9999288 0.9999288 0.9921339 -0.9999437 0.9985868 0.9937096 -0.9934695 0.9999437 0.9937101 -0.9934695 0.9999437 0.9937101 -0.9934695 0.9999437 0.9937101 -0.9934695 0.9999437 0.9937101 -0.9934695 0.9999437 0.99371 -0.9934695 0.9999437 0.99371 -0.9934695 0.9999437 0.99371 -0.9934694 0.9999437 0.99371 -0.9934694 0.9999437 0.99371 -0.9934694 0.9999437 0.9937099 -0.9934694 0.9999437 0.9937099 -0.9934694 0.9999437 0.9937098 -0.9934694 0.9999437 0.9937098 -0.9934694 0.9999437 0.9937097 -0.9934694 0.9999437 0.9937097 -0.9934694 0.9999437 0.9937096 -0.9934695 0.9999437 0.9937096 -0.9934697 0.9999437 0.9937096 -0.9934698 0.9999437 0.9937096 -0.9934701 0.9999437 0.9937096 -0.9934704 0.9999437 0.9937096 -0.9934707 0.9999437 0.9937096 -0.9934712 0.9999437 0.9937096 -0.9934718 0.9999437 0.9937096 -0.9934725 0.9999437 0.9937096 -0.9934734 0.9999437 0.9937096 -0.9934746 0.9999437 0.9937096 -0.9934761 0.9999437 0.9937096 -0.9934779 0.9999437 0.9937096 -0.9934803 0.9999437 0.9937096 -0.9934833 0.9999437 0.9937096 -0.9934871 0.9999437 0.9937096 -0.9934919 0.9999437 0.9937096 -0.993498 0.9999437 0.9937096 -0.9935057 0.9999437 0.9937096 -0.9935154 0.9999437 0.9937096 -0.9935277 0.9999437 0.9937096 -0.9935432 0.9999437 0.9937096 -0.9935629 0.9999437 0.9937096 -0.9935878 0.9999437 0.9937096 -0.9936193 0.9999437 0.9937096 -0.9936592 0.9999437 0.9937096 -0.9937096 0.9999437 0.9937096 -0.9937734 0.9999437 0.9937096 -0.9938541 0.9999437 0.9937096 -0.9939562 0.9999437 0.9937096 -0.9940854 0.9999437 0.9937096 -0.9942488 0.9999437 0.9937096 -0.9944556 0.9999437 0.9937096 -0.9947172 0.9999437 0.9937096 -0.9950481 0.9999437 0.9937096 -0.9954668 0.9999437 0.9937096 -0.9959964 0.9999437 0.9937096 -0.9966665 0.9999437 0.9937096 -0.9975143 0.9999437 0.9937096 -0.9985868 0.9999437 0.9937096 -0.9999437 0.9999437 0.9937096 -0.8750477 0.8750477 0.9987905 -0.875049 0.8750477 0.9987905 -0.8750507 0.8750477 0.9987905 -0.8750528 0.8750477 0.9987905 -0.8750555 0.8750477 0.9987905 -0.8750589 0.8750477 0.9987905 -0.8750632 0.8750477 0.9987905 -0.8750687 0.8750477 0.9987905 -0.8750756 0.8750477 0.9987905 -0.8750843 0.8750477 0.9987905 -0.8750954 0.8750477 0.9987905 -0.8751094 0.8750477 0.9987905 -0.8751271 0.8750477 0.9987905 -0.8751494 0.8750477 0.9987905 -0.8751778 0.8750477 0.9987905 -0.8752136 0.8750477 0.9987905 -0.8752589 0.8750477 0.9987905 -0.8753162 0.8750477 0.9987905 -0.8753887 0.8750477 0.9987905 -0.8754805 0.8750477 0.9987905 -0.8755966 0.8750477 0.9987905 -0.8757434 0.8750477 0.9987905 -0.8759292 0.8750477 0.9987905 -0.8761643 0.8750477 0.9987905 -0.8764616 0.8750477 0.9987905 -0.8768378 0.8750477 0.9987905 -0.8773138 0.8750477 0.9987905 -0.8779159 0.8750477 0.9987905 -0.8786777 0.8750477 0.9987905 -0.8796415 0.8750477 0.9987905 -0.8808607 0.8750477 0.9987905 -0.8824033 0.8750477 0.9987905 -0.8843548 0.8750477 0.9987905 -0.8868238 0.8750477 0.9987905 -0.8899473 0.8750477 0.9987905 -0.8938989 0.8750477 0.9987905 -0.8988983 0.8750477 0.9987905 -0.9052232 0.8750477 0.9987905 -0.9132249 0.8750477 0.9987905 -0.9233482 0.8750477 0.9987905 -0.9361554 0.8750477 0.9987905 -0.9523583 0.8750477 0.9987905 -0.972857 0.8750477 0.9987905 -0.9987905 0.8750477 0.9987905 -0.9990461 0.8990028 0.9780796 -0.9992474 0.9187175 0.9690305 -0.999406 0.9348153 0.9667127 -0.999531 0.9478754 0.9680389 -0.9996296 0.958416 0.971132 -0.9997074 0.9668873 0.9748915 -0.9997689 0.9736726 0.9787032 -0.9998174 0.9790927 0.9822506 -0.9998557 0.9834129 0.9853933 -0.999886 0.9868505 0.9880915 -0.9999099 0.989582 0.9903592 -0.9999288 0.9917501 0.9922366 -0.9999437 0.9934695 0.9937739 -0.8750477 0.875049 0.9987905 -0.8750466 0.8750466 0.9987905 -0.8750482 0.8750466 0.9987905 -0.8750504 0.8750466 0.9987905 -0.8750531 0.8750466 0.9987905 -0.8750565 0.8750466 0.9987905 -0.8750608 0.8750466 0.9987905 -0.8750662 0.8750466 0.9987905 -0.8750731 0.8750466 0.9987905 -0.8750819 0.8750466 0.9987905 -0.8750929 0.8750466 0.9987905 -0.8751069 0.8750466 0.9987905 -0.8751246 0.8750466 0.9987905 -0.875147 0.8750466 0.9987905 -0.8751753 0.8750466 0.9987905 -0.8752111 0.8750466 0.9987905 -0.8752564 0.8750466 0.9987905 -0.8753137 0.8750466 0.9987905 -0.8753863 0.8750466 0.9987905 -0.875478 0.8750466 0.9987905 -0.8755941 0.8750466 0.9987905 -0.875741 0.8750466 0.9987905 -0.8759268 0.8750466 0.9987905 -0.8761618 0.8750466 0.9987905 -0.8764592 0.8750466 0.9987905 -0.8768354 0.8750466 0.9987905 -0.8773114 0.8750466 0.9987905 -0.8779135 0.8750466 0.9987905 -0.8786753 0.8750466 0.9987905 -0.8796391 0.8750466 0.9987905 -0.8808584 0.8750466 0.9987905 -0.882401 0.8750466 0.9987905 -0.8843525 0.8750466 0.9987905 -0.8868215 0.8750466 0.9987905 -0.8899451 0.8750466 0.9987905 -0.8938969 0.8750466 0.9987905 -0.8988963 0.8750466 0.9987905 -0.9052213 0.8750466 0.9987905 -0.9132232 0.8750466 0.9987905 -0.9233467 0.8750466 0.9987905 -0.9361542 0.8750466 0.9987905 -0.9523573 0.8750466 0.9987905 -0.9728564 0.8750466 0.9987905 -0.9987905 0.8750466 0.9987905 -0.9990461 0.899002 0.9780793 -0.9992474 0.918717 0.9690301 -0.999406 0.9348149 0.9667124 -0.999531 0.9478752 0.9680386 -0.9996296 0.9584159 0.9711319 -0.9997074 0.9668872 0.9748914 -0.9997689 0.9736726 0.9787031 -0.9998174 0.9790927 0.9822505 -0.9998557 0.9834129 0.9853933 -0.999886 0.9868505 0.9880914 -0.9999099 0.989582 0.9903591 -0.9999288 0.9917501 0.9922365 -0.9999437 0.9934695 0.9937739 -0.8750477 0.8750507 0.9987905 -0.8750466 0.8750482 0.9987905 -0.8750451 0.8750451 0.9987904 -0.8750473 0.8750451 0.9987904 -0.87505 0.8750451 0.9987904 -0.8750534 0.8750451 0.9987904 -0.8750577 0.8750451 0.9987904 -0.8750631 0.8750451 0.9987904 -0.8750701 0.8750451 0.9987904 -0.8750788 0.8750451 0.9987904 -0.8750898 0.8750451 0.9987904 -0.8751038 0.8750451 0.9987904 -0.8751215 0.8750451 0.9987904 -0.8751439 0.8750451 0.9987904 -0.8751722 0.8750451 0.9987904 -0.875208 0.8750451 0.9987904 -0.8752533 0.8750451 0.9987904 -0.8753107 0.8750451 0.9987904 -0.8753832 0.8750451 0.9987904 -0.8754749 0.8750451 0.9987904 -0.875591 0.8750451 0.9987904 -0.8757379 0.8750451 0.9987904 -0.8759237 0.8750451 0.9987904 -0.8761587 0.8750451 0.9987904 -0.8764561 0.8750451 0.9987904 -0.8768324 0.8750451 0.9987904 -0.8773083 0.8750451 0.9987904 -0.8779105 0.8750451 0.9987904 -0.8786723 0.8750451 0.9987904 -0.8796361 0.8750451 0.9987904 -0.8808555 0.8750451 0.9987904 -0.8823981 0.8750451 0.9987904 -0.8843497 0.8750451 0.9987904 -0.8868187 0.8750451 0.9987904 -0.8899424 0.8750451 0.9987904 -0.8938942 0.8750451 0.9987904 -0.8988938 0.8750451 0.9987904 -0.905219 0.8750451 0.9987904 -0.9132211 0.8750451 0.9987904 -0.9233448 0.8750451 0.9987904 -0.9361526 0.8750451 0.9987904 -0.9523562 0.8750451 0.9987904 -0.9728558 0.8750451 0.9987904 -0.9987904 0.8750451 0.9987904 -0.9990461 0.8990011 0.9780789 -0.9992474 0.9187164 0.9690296 -0.999406 0.9348146 0.9667119 -0.999531 0.947875 0.9680383 -0.9996296 0.9584157 0.9711316 -0.9997074 0.9668871 0.9748912 -0.9997689 0.9736725 0.978703 -0.9998174 0.9790927 0.9822504 -0.9998557 0.9834129 0.9853932 -0.999886 0.9868505 0.9880914 -0.9999099 0.989582 0.9903591 -0.9999288 0.9917501 0.9922365 -0.9999437 0.9934695 0.9937739 -0.8750477 0.8750528 0.9987905 -0.8750466 0.8750504 0.9987905 -0.8750451 0.8750473 0.9987904 -0.8750434 0.8750434 0.9987904 -0.8750461 0.8750434 0.9987904 -0.8750495 0.8750434 0.9987904 -0.8750538 0.8750434 0.9987904 -0.8750593 0.8750434 0.9987904 -0.8750662 0.8750434 0.9987904 -0.8750749 0.8750434 0.9987904 -0.875086 0.8750434 0.9987904 -0.8750999 0.8750434 0.9987904 -0.8751176 0.8750434 0.9987904 -0.87514 0.8750434 0.9987904 -0.8751683 0.8750434 0.9987904 -0.8752041 0.8750434 0.9987904 -0.8752495 0.8750434 0.9987904 -0.8753068 0.8750434 0.9987904 -0.8753793 0.8750434 0.9987904 -0.8754711 0.8750434 0.9987904 -0.8755872 0.8750434 0.9987904 -0.875734 0.8750434 0.9987904 -0.8759198 0.8750434 0.9987904 -0.8761549 0.8750434 0.9987904 -0.8764523 0.8750434 0.9987904 -0.8768285 0.8750434 0.9987904 -0.8773045 0.8750434 0.9987904 -0.8779067 0.8750434 0.9987904 -0.8786686 0.8750434 0.9987904 -0.8796324 0.8750434 0.9987904 -0.8808518 0.8750434 0.9987904 -0.8823944 0.8750434 0.9987904 -0.8843461 0.8750434 0.9987904 -0.8868152 0.8750434 0.9987904 -0.889939 0.8750434 0.9987904 -0.8938909 0.8750434 0.9987904 -0.8988907 0.8750434 0.9987904 -0.905216 0.8750434 0.9987904 -0.9132184 0.8750434 0.9987904 -0.9233424 0.8750434 0.9987904 -0.9361506 0.8750434 0.9987904 -0.9523547 0.8750434 0.9987904 -0.972855 0.8750434 0.9987904 -0.9987904 0.8750434 0.9987904 -0.9990461 0.899 0.9780783 -0.9992474 0.9187157 0.969029 -0.999406 0.9348141 0.9667114 -0.999531 0.9478746 0.9680379 -0.9996296 0.9584155 0.9711314 -0.9997074 0.966887 0.974891 -0.9997689 0.9736724 0.9787029 -0.9998174 0.9790926 0.9822504 -0.9998557 0.9834129 0.9853932 -0.999886 0.9868505 0.9880914 -0.9999099 0.989582 0.9903591 -0.9999288 0.9917501 0.9922365 -0.9999437 0.9934695 0.9937738 -0.8750477 0.8750555 0.9987905 -0.8750466 0.8750531 0.9987905 -0.8750451 0.87505 0.9987904 -0.8750434 0.8750461 0.9987904 -0.8750412 0.8750412 0.9987904 -0.8750447 0.8750412 0.9987904 -0.875049 0.8750412 0.9987904 -0.8750544 0.8750412 0.9987904 -0.8750613 0.8750412 0.9987904 -0.8750701 0.8750412 0.9987904 -0.8750811 0.8750412 0.9987904 -0.8750951 0.8750412 0.9987904 -0.8751128 0.8750412 0.9987904 -0.8751352 0.8750412 0.9987904 -0.8751635 0.8750412 0.9987904 -0.8751993 0.8750412 0.9987904 -0.8752446 0.8750412 0.9987904 -0.875302 0.8750412 0.9987904 -0.8753745 0.8750412 0.9987904 -0.8754663 0.8750412 0.9987904 -0.8755823 0.8750412 0.9987904 -0.8757292 0.8750412 0.9987904 -0.875915 0.8750412 0.9987904 -0.8761501 0.8750412 0.9987904 -0.8764475 0.8750412 0.9987904 -0.8768238 0.8750412 0.9987904 -0.8772998 0.8750412 0.9987904 -0.877902 0.8750412 0.9987904 -0.8786638 0.8750412 0.9987904 -0.8796277 0.8750412 0.9987904 -0.8808471 0.8750412 0.9987904 -0.8823899 0.8750412 0.9987904 -0.8843416 0.8750412 0.9987904 -0.8868108 0.8750412 0.9987904 -0.8899347 0.8750412 0.9987904 -0.8938868 0.8750412 0.9987904 -0.8988868 0.8750412 0.9987904 -0.9052124 0.8750412 0.9987904 -0.913215 0.8750412 0.9987904 -0.9233395 0.8750412 0.9987904 -0.9361482 0.8750412 0.9987904 -0.9523529 0.8750412 0.9987904 -0.9728539 0.8750412 0.9987904 -0.9987904 0.8750412 0.9987904 -0.9990461 0.8989986 0.9780777 -0.9992474 0.9187148 0.9690283 -0.999406 0.9348135 0.9667108 -0.999531 0.9478743 0.9680374 -0.9996296 0.9584153 0.971131 -0.9997074 0.9668869 0.9748908 -0.9997689 0.9736723 0.9787027 -0.9998174 0.9790925 0.9822502 -0.9998557 0.9834128 0.9853931 -0.999886 0.9868504 0.9880913 -0.9999099 0.989582 0.9903591 -0.9999288 0.9917501 0.9922365 -0.9999437 0.9934695 0.9937738 -0.8750477 0.8750589 0.9987905 -0.8750466 0.8750565 0.9987905 -0.8750451 0.8750534 0.9987904 -0.8750434 0.8750495 0.9987904 -0.8750412 0.8750447 0.9987904 -0.8750386 0.8750386 0.9987904 -0.8750429 0.8750386 0.9987904 -0.8750484 0.8750386 0.9987904 -0.8750553 0.8750386 0.9987904 -0.875064 0.8750386 0.9987904 -0.8750751 0.8750386 0.9987904 -0.8750891 0.8750386 0.9987904 -0.8751068 0.8750386 0.9987904 -0.8751292 0.8750386 0.9987904 -0.8751575 0.8750386 0.9987904 -0.8751933 0.8750386 0.9987904 -0.8752386 0.8750386 0.9987904 -0.8752959 0.8750386 0.9987904 -0.8753685 0.8750386 0.9987904 -0.8754602 0.8750386 0.9987904 -0.8755763 0.8750386 0.9987904 -0.8757232 0.8750386 0.9987904 -0.875909 0.8750386 0.9987904 -0.8761441 0.8750386 0.9987904 -0.8764415 0.8750386 0.9987904 -0.8768178 0.8750386 0.9987904 -0.8772938 0.8750386 0.9987904 -0.8778961 0.8750386 0.9987904 -0.878658 0.8750386 0.9987904 -0.8796219 0.8750386 0.9987904 -0.8808414 0.8750386 0.9987904 -0.8823842 0.8750386 0.9987904 -0.884336 0.8750386 0.9987904 -0.8868054 0.8750386 0.9987904 -0.8899294 0.8750386 0.9987904 -0.8938817 0.8750386 0.9987904 -0.8988819 0.8750386 0.9987904 -0.9052078 0.8750386 0.9987904 -0.9132109 0.8750386 0.9987904 -0.9233358 0.8750386 0.9987904 -0.9361451 0.8750386 0.9987904 -0.9523506 0.8750386 0.9987904 -0.9728526 0.8750386 0.9987904 -0.9987904 0.8750386 0.9987904 -0.9990461 0.8989969 0.9780768 -0.9992474 0.9187137 0.9690273 -0.9994059 0.9348128 0.96671 -0.999531 0.9478738 0.9680368 -0.9996296 0.958415 0.9711305 -0.9997074 0.9668867 0.9748904 -0.9997689 0.9736722 0.9787025 -0.9998174 0.9790925 0.9822501 -0.9998557 0.9834128 0.985393 -0.999886 0.9868504 0.9880913 -0.9999099 0.9895819 0.990359 -0.9999288 0.9917501 0.9922365 -0.9999437 0.9934695 0.9937738 -0.8750477 0.8750632 0.9987905 -0.8750466 0.8750608 0.9987905 -0.8750451 0.8750577 0.9987904 -0.8750434 0.8750538 0.9987904 -0.8750412 0.875049 0.9987904 -0.8750386 0.8750429 0.9987904 -0.8750355 0.8750355 0.9987903 -0.8750409 0.8750355 0.9987903 -0.8750478 0.8750355 0.9987903 -0.8750566 0.8750355 0.9987903 -0.8750676 0.8750355 0.9987903 -0.8750816 0.8750355 0.9987903 -0.8750993 0.8750355 0.9987903 -0.8751217 0.8750355 0.9987903 -0.87515 0.8750355 0.9987903 -0.8751858 0.8750355 0.9987903 -0.8752311 0.8750355 0.9987903 -0.8752885 0.8750355 0.9987903 -0.875361 0.8750355 0.9987903 -0.8754528 0.8750355 0.9987903 -0.8755689 0.8750355 0.9987903 -0.8757158 0.8750355 0.9987903 -0.8759016 0.8750355 0.9987903 -0.8761367 0.8750355 0.9987903 -0.8764342 0.8750355 0.9987903 -0.8768104 0.8750355 0.9987903 -0.8772865 0.8750355 0.9987903 -0.8778888 0.8750355 0.9987903 -0.8786507 0.8750355 0.9987903 -0.8796147 0.8750355 0.9987903 -0.8808343 0.8750355 0.9987903 -0.8823772 0.8750355 0.9987903 -0.8843291 0.8750355 0.9987903 -0.8867986 0.8750355 0.9987903 -0.8899228 0.8750355 0.9987903 -0.8938754 0.8750355 0.9987903 -0.8988759 0.8750355 0.9987903 -0.9052021 0.8750355 0.9987903 -0.9132057 0.8750355 0.9987903 -0.9233312 0.8750355 0.9987903 -0.9361413 0.8750355 0.9987903 -0.9523478 0.8750355 0.9987903 -0.972851 0.8750355 0.9987903 -0.9987903 0.8750355 0.9987903 -0.9990461 0.8989948 0.9780758 -0.9992473 0.9187123 0.9690261 -0.9994059 0.9348119 0.9667089 -0.999531 0.9478733 0.968036 -0.9996296 0.9584146 0.97113 -0.9997074 0.9668865 0.9748901 -0.9997689 0.9736721 0.9787022 -0.9998174 0.9790924 0.9822499 -0.9998557 0.9834127 0.9853929 -0.999886 0.9868504 0.9880912 -0.9999099 0.9895819 0.990359 -0.9999288 0.99175 0.9922364 -0.9999437 0.9934695 0.9937738 -0.8750477 0.8750687 0.9987905 -0.8750466 0.8750662 0.9987905 -0.8750451 0.8750631 0.9987904 -0.8750434 0.8750593 0.9987904 -0.8750412 0.8750544 0.9987904 -0.8750386 0.8750484 0.9987904 -0.8750355 0.8750409 0.9987903 -0.8750317 0.8750317 0.9987903 -0.8750386 0.8750317 0.9987903 -0.8750474 0.8750317 0.9987903 -0.8750584 0.8750317 0.9987903 -0.8750724 0.8750317 0.9987903 -0.8750901 0.8750317 0.9987903 -0.8751125 0.8750317 0.9987903 -0.8751408 0.8750317 0.9987903 -0.8751766 0.8750317 0.9987903 -0.8752219 0.8750317 0.9987903 -0.8752793 0.8750317 0.9987903 -0.8753518 0.8750317 0.9987903 -0.8754436 0.8750317 0.9987903 -0.8755597 0.8750317 0.9987903 -0.8757066 0.8750317 0.9987903 -0.8758925 0.8750317 0.9987903 -0.8761276 0.8750317 0.9987903 -0.876425 0.8750317 0.9987903 -0.8768014 0.8750317 0.9987903 -0.8772775 0.8750317 0.9987903 -0.8778798 0.8750317 0.9987903 -0.8786418 0.8750317 0.9987903 -0.8796058 0.8750317 0.9987903 -0.8808255 0.8750317 0.9987903 -0.8823685 0.8750317 0.9987903 -0.8843206 0.8750317 0.9987903 -0.8867903 0.8750317 0.9987903 -0.8899147 0.8750317 0.9987903 -0.8938676 0.8750317 0.9987903 -0.8988684 0.8750317 0.9987903 -0.9051951 0.8750317 0.9987903 -0.9131993 0.8750317 0.9987903 -0.9233256 0.8750317 0.9987903 -0.9361366 0.8750317 0.9987903 -0.9523443 0.8750317 0.9987903 -0.9728491 0.8750317 0.9987903 -0.9987903 0.8750317 0.9987903 -0.999046 0.8989923 0.9780745 -0.9992473 0.9187107 0.9690247 -0.9994059 0.9348109 0.9667077 -0.999531 0.9478726 0.9680351 -0.9996296 0.9584142 0.9711293 -0.9997074 0.9668862 0.9748896 -0.9997689 0.9736719 0.9787019 -0.9998174 0.9790923 0.9822497 -0.9998557 0.9834127 0.9853927 -0.999886 0.9868503 0.9880911 -0.9999099 0.9895819 0.9903589 -0.9999288 0.99175 0.9922364 -0.9999437 0.9934694 0.9937738 -0.8750477 0.8750756 0.9987905 -0.8750466 0.8750731 0.9987905 -0.8750451 0.8750701 0.9987904 -0.8750434 0.8750662 0.9987904 -0.8750412 0.8750613 0.9987904 -0.8750386 0.8750553 0.9987904 -0.8750355 0.8750478 0.9987903 -0.8750317 0.8750386 0.9987903 -0.8750274 0.8750274 0.9987902 -0.8750361 0.8750274 0.9987902 -0.8750472 0.8750274 0.9987902 -0.8750611 0.8750274 0.9987902 -0.8750788 0.8750274 0.9987902 -0.8751012 0.8750274 0.9987902 -0.8751295 0.8750274 0.9987902 -0.8751654 0.8750274 0.9987902 -0.8752107 0.8750274 0.9987902 -0.875268 0.8750274 0.9987902 -0.8753406 0.8750274 0.9987902 -0.8754324 0.8750274 0.9987902 -0.8755485 0.8750274 0.9987902 -0.8756954 0.8750274 0.9987902 -0.8758813 0.8750274 0.9987902 -0.8761164 0.8750274 0.9987902 -0.8764139 0.8750274 0.9987902 -0.8767903 0.8750274 0.9987902 -0.8772664 0.8750274 0.9987902 -0.8778688 0.8750274 0.9987902 -0.8786309 0.8750274 0.9987902 -0.879595 0.8750274 0.9987902 -0.8808147 0.8750274 0.9987902 -0.8823579 0.8750274 0.9987902 -0.8843102 0.8750274 0.9987902 -0.8867801 0.8750274 0.9987902 -0.8899048 0.8750274 0.9987902 -0.893858 0.8750274 0.9987902 -0.8988593 0.8750274 0.9987902 -0.9051866 0.8750274 0.9987902 -0.9131915 0.8750274 0.9987902 -0.9233187 0.8750274 0.9987902 -0.9361309 0.8750274 0.9987902 -0.95234 0.8750274 0.9987902 -0.9728467 0.8750274 0.9987902 -0.9987902 0.8750274 0.9987902 -0.999046 0.8989895 0.978073 -0.9992473 0.9187089 0.9690229 -0.9994059 0.9348097 0.9667062 -0.999531 0.9478718 0.9680339 -0.9996296 0.9584137 0.9711285 -0.9997074 0.9668859 0.974889 -0.9997689 0.9736717 0.9787015 -0.9998174 0.9790921 0.9822495 -0.9998557 0.9834126 0.9853926 -0.999886 0.9868503 0.988091 -0.9999099 0.9895819 0.9903589 -0.9999288 0.99175 0.9922364 -0.9999437 0.9934694 0.9937737 -0.8750477 0.8750843 0.9987905 -0.8750466 0.8750819 0.9987905 -0.8750451 0.8750788 0.9987904 -0.8750434 0.8750749 0.9987904 -0.8750412 0.8750701 0.9987904 -0.8750386 0.875064 0.9987904 -0.8750355 0.8750566 0.9987903 -0.8750317 0.8750474 0.9987903 -0.8750274 0.8750361 0.9987902 -0.8750225 0.8750225 0.9987902 -0.8750335 0.8750225 0.9987902 -0.8750475 0.8750225 0.9987902 -0.8750652 0.8750225 0.9987902 -0.8750876 0.8750225 0.9987902 -0.8751159 0.8750225 0.9987902 -0.8751518 0.8750225 0.9987902 -0.8751971 0.8750225 0.9987902 -0.8752545 0.8750225 0.9987902 -0.875327 0.8750225 0.9987902 -0.8754188 0.8750225 0.9987902 -0.875535 0.8750225 0.9987902 -0.8756819 0.8750225 0.9987902 -0.8758678 0.8750225 0.9987902 -0.8761029 0.8750225 0.9987902 -0.8764004 0.8750225 0.9987902 -0.8767768 0.8750225 0.9987902 -0.877253 0.8750225 0.9987902 -0.8778555 0.8750225 0.9987902 -0.8786176 0.8750225 0.9987902 -0.8795819 0.8750225 0.9987902 -0.8808018 0.8750225 0.9987902 -0.8823451 0.8750225 0.9987902 -0.8842976 0.8750225 0.9987902 -0.8867677 0.8750225 0.9987902 -0.8898928 0.8750225 0.9987902 -0.8938464 0.8750225 0.9987902 -0.8988483 0.8750225 0.9987902 -0.9051763 0.8750225 0.9987902 -0.913182 0.8750225 0.9987902 -0.9233103 0.8750225 0.9987902 -0.936124 0.8750225 0.9987902 -0.9523349 0.8750225 0.9987902 -0.9728437 0.8750225 0.9987902 -0.9987902 0.8750225 0.9987902 -0.9990459 0.8989863 0.9780711 -0.9992473 0.9187068 0.9690208 -0.9994059 0.9348083 0.9667044 -0.9995309 0.947871 0.9680325 -0.9996296 0.9584132 0.9711275 -0.9997074 0.9668855 0.9748883 -0.9997689 0.9736715 0.9787011 -0.9998174 0.979092 0.9822492 -0.9998557 0.9834125 0.9853924 -0.999886 0.9868502 0.9880909 -0.9999099 0.9895818 0.9903588 -0.9999288 0.99175 0.9922363 -0.9999437 0.9934694 0.9937737 -0.8750477 0.8750954 0.9987905 -0.8750466 0.8750929 0.9987905 -0.8750451 0.8750898 0.9987904 -0.8750434 0.875086 0.9987904 -0.8750412 0.8750811 0.9987904 -0.8750386 0.8750751 0.9987904 -0.8750355 0.8750676 0.9987903 -0.8750317 0.8750584 0.9987903 -0.8750274 0.8750472 0.9987902 -0.8750225 0.8750335 0.9987902 -0.8750173 0.8750173 0.9987901 -0.8750313 0.8750173 0.9987901 -0.875049 0.8750173 0.9987901 -0.8750714 0.8750173 0.9987901 -0.8750997 0.8750173 0.9987901 -0.8751356 0.8750173 0.9987901 -0.8751809 0.8750173 0.9987901 -0.8752383 0.8750173 0.9987901 -0.8753108 0.8750173 0.9987901 -0.8754027 0.8750173 0.9987901 -0.8755188 0.8750173 0.9987901 -0.8756658 0.8750173 0.9987901 -0.8758517 0.8750173 0.9987901 -0.8760869 0.8750173 0.9987901 -0.8763844 0.8750173 0.9987901 -0.8767609 0.8750173 0.9987901 -0.8772371 0.8750173 0.9987901 -0.8778396 0.8750173 0.9987901 -0.8786019 0.8750173 0.9987901 -0.8795663 0.8750173 0.9987901 -0.8807863 0.8750173 0.9987901 -0.8823298 0.8750173 0.9987901 -0.8842826 0.8750173 0.9987901 -0.8867531 0.8750173 0.9987901 -0.8898785 0.8750173 0.9987901 -0.8938327 0.8750173 0.9987901 -0.8988352 0.8750173 0.9987901 -0.905164 0.8750173 0.9987901 -0.9131708 0.8750173 0.9987901 -0.9233004 0.8750173 0.9987901 -0.9361157 0.8750173 0.9987901 -0.9523287 0.8750173 0.9987901 -0.9728403 0.8750173 0.9987901 -0.9987901 0.8750173 0.9987901 -0.9990459 0.8989829 0.9780689 -0.9992472 0.9187045 0.9690183 -0.9994059 0.9348069 0.9667022 -0.9995309 0.94787 0.9680309 -0.9996296 0.9584126 0.9711263 -0.9997074 0.9668852 0.9748875 -0.9997689 0.9736712 0.9787005 -0.9998174 0.9790919 0.9822488 -0.9998557 0.9834124 0.9853921 -0.999886 0.9868502 0.9880907 -0.9999099 0.9895818 0.9903587 -0.9999288 0.99175 0.9922362 -0.9999437 0.9934694 0.9937737 -0.8750477 0.8751094 0.9987905 -0.8750466 0.8751069 0.9987905 -0.8750451 0.8751038 0.9987904 -0.8750434 0.8750999 0.9987904 -0.8750412 0.8750951 0.9987904 -0.8750386 0.8750891 0.9987904 -0.8750355 0.8750816 0.9987903 -0.8750317 0.8750724 0.9987903 -0.8750274 0.8750611 0.9987902 -0.8750225 0.8750475 0.9987902 -0.8750173 0.8750313 0.9987901 -0.8750124 0.8750124 0.99879 -0.8750301 0.8750124 0.99879 -0.8750525 0.8750124 0.99879 -0.8750809 0.8750124 0.99879 -0.8751167 0.8750124 0.99879 -0.875162 0.8750124 0.99879 -0.8752194 0.8750124 0.99879 -0.875292 0.8750124 0.99879 -0.8753838 0.8750124 0.99879 -0.8755 0.8750124 0.99879 -0.875647 0.8750124 0.99879 -0.8758329 0.8750124 0.99879 -0.8760681 0.8750124 0.99879 -0.8763657 0.8750124 0.99879 -0.8767422 0.8750124 0.99879 -0.8772186 0.8750124 0.99879 -0.8778212 0.8750124 0.99879 -0.8785835 0.8750124 0.99879 -0.8795481 0.8750124 0.99879 -0.8807683 0.8750124 0.99879 -0.882312 0.8750124 0.99879 -0.8842651 0.8750124 0.99879 -0.8867359 0.8750124 0.99879 -0.8898619 0.8750124 0.99879 -0.8938167 0.8750124 0.99879 -0.8988199 0.8750124 0.99879 -0.9051497 0.8750124 0.99879 -0.9131577 0.8750124 0.99879 -0.9232889 0.8750124 0.99879 -0.9361061 0.8750124 0.99879 -0.9523216 0.8750124 0.99879 -0.9728362 0.8750124 0.99879 -0.99879 0.8750124 0.99879 -0.9990458 0.8989796 0.9780663 -0.9992472 0.9187024 0.9690153 -0.9994059 0.9348055 0.9666996 -0.9995309 0.9478691 0.9680289 -0.9996296 0.958412 0.9711249 -0.9997074 0.9668848 0.9748865 -0.9997689 0.973671 0.9786999 -0.9998174 0.9790917 0.9822484 -0.9998557 0.9834123 0.9853919 -0.999886 0.9868501 0.9880905 -0.9999099 0.9895818 0.9903586 -0.9999288 0.9917499 0.9922362 -0.9999437 0.9934694 0.9937736 -0.8750477 0.8751271 0.9987905 -0.8750466 0.8751246 0.9987905 -0.8750451 0.8751215 0.9987904 -0.8750434 0.8751176 0.9987904 -0.8750412 0.8751128 0.9987904 -0.8750386 0.8751068 0.9987904 -0.8750355 0.8750993 0.9987903 -0.8750317 0.8750901 0.9987903 -0.8750274 0.8750788 0.9987902 -0.8750225 0.8750652 0.9987902 -0.8750173 0.875049 0.9987901 -0.8750124 0.8750301 0.99879 -0.8750088 0.8750088 0.9987899 -0.8750312 0.8750088 0.9987899 -0.8750596 0.8750088 0.9987899 -0.8750954 0.8750088 0.9987899 -0.8751408 0.8750088 0.9987899 -0.8751981 0.8750088 0.9987899 -0.8752707 0.8750088 0.9987899 -0.8753626 0.8750088 0.9987899 -0.8754788 0.8750088 0.9987899 -0.8756258 0.8750088 0.9987899 -0.8758117 0.8750088 0.9987899 -0.876047 0.8750088 0.9987899 -0.8763446 0.8750088 0.9987899 -0.8767212 0.8750088 0.9987899 -0.8771976 0.8750088 0.9987899 -0.8778003 0.8750088 0.9987899 -0.8785628 0.8750088 0.9987899 -0.8795275 0.8750088 0.9987899 -0.880748 0.8750088 0.9987899 -0.882292 0.8750088 0.9987899 -0.8842454 0.8750088 0.9987899 -0.8867166 0.8750088 0.9987899 -0.8898431 0.8750088 0.9987899 -0.8937986 0.8750088 0.9987899 -0.8988027 0.8750088 0.9987899 -0.9051336 0.8750088 0.9987899 -0.9131429 0.8750088 0.9987899 -0.9232758 0.8750088 0.9987899 -0.9360952 0.8750088 0.9987899 -0.9523135 0.8750088 0.9987899 -0.9728317 0.8750088 0.9987899 -0.9987899 0.8750088 0.9987899 -0.9990458 0.8989771 0.9780633 -0.9992472 0.9187008 0.969012 -0.9994058 0.9348044 0.9666968 -0.9995309 0.9478684 0.9680267 -0.9996296 0.9584115 0.9711233 -0.9997074 0.9668845 0.9748855 -0.9997689 0.9736708 0.9786991 -0.9998174 0.9790916 0.9822479 -0.9998557 0.9834122 0.9853915 -0.999886 0.9868501 0.9880903 -0.9999099 0.9895817 0.9903584 -0.9999288 0.9917499 0.9922361 -0.9999437 0.9934694 0.9937736 -0.8750477 0.8751494 0.9987905 -0.8750466 0.875147 0.9987905 -0.8750451 0.8751439 0.9987904 -0.8750434 0.87514 0.9987904 -0.8750412 0.8751352 0.9987904 -0.8750386 0.8751292 0.9987904 -0.8750355 0.8751217 0.9987903 -0.8750317 0.8751125 0.9987903 -0.8750274 0.8751012 0.9987902 -0.8750225 0.8750876 0.9987902 -0.8750173 0.8750714 0.9987901 -0.8750124 0.8750525 0.99879 -0.8750088 0.8750312 0.9987899 -0.8750084 0.8750084 0.9987897 -0.8750368 0.8750084 0.9987897 -0.8750726 0.8750084 0.9987897 -0.875118 0.8750084 0.9987897 -0.8751754 0.8750084 0.9987897 -0.875248 0.8750084 0.9987897 -0.8753398 0.8750084 0.9987897 -0.875456 0.8750084 0.9987897 -0.8756031 0.8750084 0.9987897 -0.8757891 0.8750084 0.9987897 -0.8760244 0.8750084 0.9987897 -0.8763221 0.8750084 0.9987897 -0.8766987 0.8750084 0.9987897 -0.8771752 0.8750084 0.9987897 -0.877778 0.8750084 0.9987897 -0.8785407 0.8750084 0.9987897 -0.8795055 0.8750084 0.9987897 -0.8807262 0.8750084 0.9987897 -0.8822705 0.8750084 0.9987897 -0.8842242 0.8750084 0.9987897 -0.886696 0.8750084 0.9987897 -0.889823 0.8750084 0.9987897 -0.8937792 0.8750084 0.9987897 -0.8987842 0.8750084 0.9987897 -0.9051163 0.8750084 0.9987897 -0.9131271 0.8750084 0.9987897 -0.9232619 0.8750084 0.9987897 -0.9360836 0.8750084 0.9987897 -0.9523049 0.8750084 0.9987897 -0.9728268 0.8750084 0.9987897 -0.9987897 0.8750084 0.9987897 -0.9990457 0.8989767 0.9780602 -0.9992471 0.9187004 0.9690084 -0.9994058 0.9348042 0.9666937 -0.9995309 0.9478683 0.9680244 -0.9996295 0.9584114 0.9711216 -0.9997074 0.9668844 0.9748843 -0.9997689 0.9736708 0.9786984 -0.9998174 0.9790916 0.9822474 -0.9998557 0.9834122 0.9853912 -0.999886 0.98685 0.9880901 -0.9999099 0.9895817 0.9903583 -0.9999288 0.9917499 0.992236 -0.9999437 0.9934694 0.9937735 -0.8750477 0.8751778 0.9987905 -0.8750466 0.8751753 0.9987905 -0.8750451 0.8751722 0.9987904 -0.8750434 0.8751683 0.9987904 -0.8750412 0.8751635 0.9987904 -0.8750386 0.8751575 0.9987904 -0.8750355 0.87515 0.9987903 -0.8750317 0.8751408 0.9987903 -0.8750274 0.8751295 0.9987902 -0.8750225 0.8751159 0.9987902 -0.8750173 0.8750997 0.9987901 -0.8750124 0.8750809 0.99879 -0.8750088 0.8750596 0.9987899 -0.8750084 0.8750368 0.9987897 -0.8750145 0.8750145 0.9987896 -0.8750504 0.8750145 0.9987896 -0.8750958 0.8750145 0.9987896 -0.8751532 0.8750145 0.9987896 -0.8752258 0.8750145 0.9987896 -0.8753177 0.8750145 0.9987896 -0.8754339 0.8750145 0.9987896 -0.8755809 0.8750145 0.9987896 -0.875767 0.8750145 0.9987896 -0.8760023 0.8750145 0.9987896 -0.8763001 0.8750145 0.9987896 -0.8766768 0.8750145 0.9987896 -0.8771534 0.8750145 0.9987896 -0.8777563 0.8750145 0.9987896 -0.8785191 0.8750145 0.9987896 -0.8794841 0.8750145 0.9987896 -0.880705 0.8750145 0.9987896 -0.8822496 0.8750145 0.9987896 -0.8842037 0.8750145 0.9987896 -0.8866758 0.8750145 0.9987896 -0.8898035 0.8750145 0.9987896 -0.8937603 0.8750145 0.9987896 -0.8987663 0.8750145 0.9987896 -0.9050994 0.8750145 0.9987896 -0.9131117 0.8750145 0.9987896 -0.9232483 0.8750145 0.9987896 -0.9360723 0.8750145 0.9987896 -0.9522964 0.8750145 0.9987896 -0.9728221 0.8750145 0.9987896 -0.9987896 0.8750145 0.9987896 -0.9990456 0.8989805 0.9780571 -0.9992471 0.9187027 0.9690049 -0.9994058 0.9348056 0.9666907 -0.9995309 0.9478691 0.9680221 -0.9996295 0.958412 0.97112 -0.9997074 0.9668847 0.9748832 -0.9997688 0.973671 0.9786976 -0.9998174 0.9790917 0.9822469 -0.9998557 0.9834123 0.9853909 -0.999886 0.9868501 0.9880899 -0.9999099 0.9895817 0.9903582 -0.9999288 0.9917499 0.9922359 -0.9999437 0.9934694 0.9937735 -0.8750477 0.8752136 0.9987905 -0.8750466 0.8752111 0.9987905 -0.8750451 0.875208 0.9987904 -0.8750434 0.8752041 0.9987904 -0.8750412 0.8751993 0.9987904 -0.8750386 0.8751933 0.9987904 -0.8750355 0.8751858 0.9987903 -0.8750317 0.8751766 0.9987903 -0.8750274 0.8751654 0.9987902 -0.8750225 0.8751518 0.9987902 -0.8750173 0.8751356 0.9987901 -0.8750124 0.8751167 0.99879 -0.8750088 0.8750954 0.9987899 -0.8750084 0.8750726 0.9987897 -0.8750145 0.8750504 0.9987896 -0.8750329 0.8750329 0.9987895 -0.8750783 0.8750329 0.9987895 -0.8751357 0.8750329 0.9987895 -0.8752084 0.8750329 0.9987895 -0.8753002 0.8750329 0.9987895 -0.8754165 0.8750329 0.9987895 -0.8755636 0.8750329 0.9987895 -0.8757496 0.8750329 0.9987895 -0.875985 0.8750329 0.9987895 -0.8762828 0.8750329 0.9987895 -0.8766596 0.8750329 0.9987895 -0.8771362 0.8750329 0.9987895 -0.8777392 0.8750329 0.9987895 -0.8785021 0.8750329 0.9987895 -0.8794673 0.8750329 0.9987895 -0.8806883 0.8750329 0.9987895 -0.8822331 0.8750329 0.9987895 -0.8841875 0.8750329 0.9987895 -0.88666 0.8750329 0.9987895 -0.8897881 0.8750329 0.9987895 -0.8937455 0.8750329 0.9987895 -0.8987521 0.8750329 0.9987895 -0.9050862 0.8750329 0.9987895 -0.9130996 0.8750329 0.9987895 -0.9232376 0.8750329 0.9987895 -0.9360634 0.8750329 0.9987895 -0.9522898 0.8750329 0.9987895 -0.9728183 0.8750329 0.9987895 -0.9987895 0.8750329 0.9987895 -0.9990456 0.8989921 0.9780547 -0.999247 0.9187101 0.9690022 -0.9994057 0.9348102 0.9666884 -0.9995309 0.947872 0.9680203 -0.9996295 0.9584138 0.9711187 -0.9997074 0.9668859 0.9748823 -0.9997688 0.9736717 0.978697 -0.9998174 0.9790921 0.9822465 -0.9998557 0.9834126 0.9853906 -0.999886 0.9868503 0.9880897 -0.9999099 0.9895819 0.9903581 -0.9999288 0.99175 0.9922358 -0.9999437 0.9934694 0.9937734 -0.8750477 0.8752589 0.9987905 -0.8750466 0.8752564 0.9987905 -0.8750451 0.8752533 0.9987904 -0.8750434 0.8752495 0.9987904 -0.8750412 0.8752446 0.9987904 -0.8750386 0.8752386 0.9987904 -0.8750355 0.8752311 0.9987903 -0.8750317 0.8752219 0.9987903 -0.8750274 0.8752107 0.9987902 -0.8750225 0.8751971 0.9987902 -0.8750173 0.8751809 0.9987901 -0.8750124 0.875162 0.99879 -0.8750088 0.8751408 0.9987899 -0.8750084 0.875118 0.9987897 -0.8750145 0.8750958 0.9987896 -0.8750329 0.8750783 0.9987895 -0.8750727 0.8750727 0.9987895 -0.8751301 0.8750727 0.9987895 -0.8752028 0.8750727 0.9987895 -0.8752947 0.8750727 0.9987895 -0.8754109 0.8750727 0.9987895 -0.875558 0.8750727 0.9987895 -0.8757441 0.8750727 0.9987895 -0.8759795 0.8750727 0.9987895 -0.8762773 0.8750727 0.9987895 -0.8766541 0.8750727 0.9987895 -0.8771307 0.8750727 0.9987895 -0.8777338 0.8750727 0.9987895 -0.8784967 0.8750727 0.9987895 -0.8794619 0.8750727 0.9987895 -0.880683 0.8750727 0.9987895 -0.8822279 0.8750727 0.9987895 -0.8841823 0.8750727 0.9987895 -0.886655 0.8750727 0.9987895 -0.8897832 0.8750727 0.9987895 -0.8937407 0.8750727 0.9987895 -0.8987476 0.8750727 0.9987895 -0.9050819 0.8750727 0.9987895 -0.9130957 0.8750727 0.9987895 -0.9232341 0.8750727 0.9987895 -0.9360606 0.8750727 0.9987895 -0.9522877 0.8750727 0.9987895 -0.9728171 0.8750727 0.9987895 -0.9987895 0.8750727 0.9987895 -0.9990455 0.8990175 0.9780539 -0.999247 0.9187262 0.9690013 -0.9994057 0.9348204 0.9666876 -0.9995308 0.9478785 0.9680197 -0.9996295 0.9584178 0.9711183 -0.9997074 0.9668884 0.974882 -0.9997688 0.9736733 0.9786968 -0.9998174 0.9790931 0.9822464 -0.9998557 0.9834132 0.9853905 -0.999886 0.9868507 0.9880897 -0.9999099 0.9895821 0.990358 -0.9999288 0.9917502 0.9922358 -0.9999437 0.9934695 0.9937734 -0.8750477 0.8753162 0.9987905 -0.8750466 0.8753137 0.9987905 -0.8750451 0.8753107 0.9987904 -0.8750434 0.8753068 0.9987904 -0.8750412 0.875302 0.9987904 -0.8750386 0.8752959 0.9987904 -0.8750355 0.8752885 0.9987903 -0.8750317 0.8752793 0.9987903 -0.8750274 0.875268 0.9987902 -0.8750225 0.8752545 0.9987902 -0.8750173 0.8752383 0.9987901 -0.8750124 0.8752194 0.99879 -0.8750088 0.8751981 0.9987899 -0.8750084 0.8751754 0.9987897 -0.8750145 0.8751532 0.9987896 -0.8750329 0.8751357 0.9987895 -0.8750727 0.8751301 0.9987895 -0.8751301 0.8751301 0.9987895 -0.8752028 0.8751301 0.9987895 -0.8752947 0.8751301 0.9987895 -0.8754109 0.8751301 0.9987895 -0.875558 0.8751301 0.9987895 -0.8757441 0.8751301 0.9987895 -0.8759795 0.8751301 0.9987895 -0.8762773 0.8751301 0.9987895 -0.8766541 0.8751301 0.9987895 -0.8771307 0.8751301 0.9987895 -0.8777338 0.8751301 0.9987895 -0.8784967 0.8751301 0.9987895 -0.8794619 0.8751301 0.9987895 -0.880683 0.8751301 0.9987895 -0.8822279 0.8751301 0.9987895 -0.8841823 0.8751301 0.9987895 -0.886655 0.8751301 0.9987895 -0.8897832 0.8751301 0.9987895 -0.8937407 0.8751301 0.9987895 -0.8987476 0.8751301 0.9987895 -0.9050819 0.8751301 0.9987895 -0.9130957 0.8751301 0.9987895 -0.9232341 0.8751301 0.9987895 -0.9360606 0.8751301 0.9987895 -0.9522877 0.8751301 0.9987895 -0.9728171 0.8751301 0.9987895 -0.9987895 0.8751301 0.9987895 -0.9990455 0.8990542 0.9780539 -0.999247 0.9187495 0.9690013 -0.9994057 0.9348352 0.9666876 -0.9995308 0.9478878 0.9680197 -0.9996295 0.9584237 0.9711183 -0.9997074 0.9668922 0.974882 -0.9997688 0.9736756 0.9786968 -0.9998174 0.9790946 0.9822464 -0.9998557 0.9834141 0.9853905 -0.999886 0.9868512 0.9880897 -0.9999099 0.9895825 0.990358 -0.9999288 0.9917504 0.9922358 -0.9999437 0.9934697 0.9937734 -0.8750477 0.8753887 0.9987905 -0.8750466 0.8753863 0.9987905 -0.8750451 0.8753832 0.9987904 -0.8750434 0.8753793 0.9987904 -0.8750412 0.8753745 0.9987904 -0.8750386 0.8753685 0.9987904 -0.8750355 0.875361 0.9987903 -0.8750317 0.8753518 0.9987903 -0.8750274 0.8753406 0.9987902 -0.8750225 0.875327 0.9987902 -0.8750173 0.8753108 0.9987901 -0.8750124 0.875292 0.99879 -0.8750088 0.8752707 0.9987899 -0.8750084 0.875248 0.9987897 -0.8750145 0.8752258 0.9987896 -0.8750329 0.8752084 0.9987895 -0.8750727 0.8752028 0.9987895 -0.8751301 0.8752028 0.9987895 -0.8752028 0.8752028 0.9987895 -0.8752947 0.8752028 0.9987895 -0.8754109 0.8752028 0.9987895 -0.875558 0.8752028 0.9987895 -0.8757441 0.8752028 0.9987895 -0.8759795 0.8752028 0.9987895 -0.8762773 0.8752028 0.9987895 -0.8766541 0.8752028 0.9987895 -0.8771307 0.8752028 0.9987895 -0.8777338 0.8752028 0.9987895 -0.8784967 0.8752028 0.9987895 -0.8794619 0.8752028 0.9987895 -0.880683 0.8752028 0.9987895 -0.8822279 0.8752028 0.9987895 -0.8841823 0.8752028 0.9987895 -0.886655 0.8752028 0.9987895 -0.8897832 0.8752028 0.9987895 -0.8937407 0.8752028 0.9987895 -0.8987476 0.8752028 0.9987895 -0.9050819 0.8752028 0.9987895 -0.9130957 0.8752028 0.9987895 -0.9232341 0.8752028 0.9987895 -0.9360606 0.8752028 0.9987895 -0.9522877 0.8752028 0.9987895 -0.9728171 0.8752028 0.9987895 -0.9987895 0.8752028 0.9987895 -0.9990455 0.8991006 0.9780539 -0.999247 0.9187791 0.9690013 -0.9994057 0.9348539 0.9666876 -0.9995308 0.9478997 0.9680197 -0.9996295 0.9584312 0.9711183 -0.9997074 0.9668969 0.974882 -0.9997688 0.9736786 0.9786968 -0.9998174 0.9790965 0.9822464 -0.9998557 0.9834153 0.9853905 -0.999886 0.986852 0.9880897 -0.9999099 0.9895829 0.990358 -0.9999288 0.9917507 0.9922358 -0.9999437 0.9934698 0.9937734 -0.8750477 0.8754805 0.9987905 -0.8750466 0.875478 0.9987905 -0.8750451 0.8754749 0.9987904 -0.8750434 0.8754711 0.9987904 -0.8750412 0.8754663 0.9987904 -0.8750386 0.8754602 0.9987904 -0.8750355 0.8754528 0.9987903 -0.8750317 0.8754436 0.9987903 -0.8750274 0.8754324 0.9987902 -0.8750225 0.8754188 0.9987902 -0.8750173 0.8754027 0.9987901 -0.8750124 0.8753838 0.99879 -0.8750088 0.8753626 0.9987899 -0.8750084 0.8753398 0.9987897 -0.8750145 0.8753177 0.9987896 -0.8750329 0.8753002 0.9987895 -0.8750727 0.8752947 0.9987895 -0.8751301 0.8752947 0.9987895 -0.8752028 0.8752947 0.9987895 -0.8752947 0.8752947 0.9987895 -0.8754109 0.8752947 0.9987895 -0.875558 0.8752947 0.9987895 -0.8757441 0.8752947 0.9987895 -0.8759795 0.8752947 0.9987895 -0.8762773 0.8752947 0.9987895 -0.8766541 0.8752947 0.9987895 -0.8771307 0.8752947 0.9987895 -0.8777338 0.8752947 0.9987895 -0.8784967 0.8752947 0.9987895 -0.8794619 0.8752947 0.9987895 -0.880683 0.8752947 0.9987895 -0.8822279 0.8752947 0.9987895 -0.8841823 0.8752947 0.9987895 -0.886655 0.8752947 0.9987895 -0.8897832 0.8752947 0.9987895 -0.8937407 0.8752947 0.9987895 -0.8987476 0.8752947 0.9987895 -0.9050819 0.8752947 0.9987895 -0.9130957 0.8752947 0.9987895 -0.9232341 0.8752947 0.9987895 -0.9360606 0.8752947 0.9987895 -0.9522877 0.8752947 0.9987895 -0.9728171 0.8752947 0.9987895 -0.9987895 0.8752947 0.9987895 -0.9990455 0.8991593 0.9780539 -0.999247 0.9188164 0.9690013 -0.9994057 0.9348776 0.9666876 -0.9995308 0.9479146 0.9680197 -0.9996295 0.9584406 0.9711183 -0.9997074 0.9669028 0.974882 -0.9997688 0.9736823 0.9786968 -0.9998174 0.9790988 0.9822464 -0.9998557 0.9834167 0.9853905 -0.999886 0.9868529 0.9880897 -0.9999099 0.9895835 0.990358 -0.9999288 0.991751 0.9922358 -0.9999437 0.9934701 0.9937734 -0.8750477 0.8755966 0.9987905 -0.8750466 0.8755941 0.9987905 -0.8750451 0.875591 0.9987904 -0.8750434 0.8755872 0.9987904 -0.8750412 0.8755823 0.9987904 -0.8750386 0.8755763 0.9987904 -0.8750355 0.8755689 0.9987903 -0.8750317 0.8755597 0.9987903 -0.8750274 0.8755485 0.9987902 -0.8750225 0.875535 0.9987902 -0.8750173 0.8755188 0.9987901 -0.8750124 0.8755 0.99879 -0.8750088 0.8754788 0.9987899 -0.8750084 0.875456 0.9987897 -0.8750145 0.8754339 0.9987896 -0.8750329 0.8754165 0.9987895 -0.8750727 0.8754109 0.9987895 -0.8751301 0.8754109 0.9987895 -0.8752028 0.8754109 0.9987895 -0.8752947 0.8754109 0.9987895 -0.8754109 0.8754109 0.9987895 -0.875558 0.8754109 0.9987895 -0.8757441 0.8754109 0.9987895 -0.8759795 0.8754109 0.9987895 -0.8762773 0.8754109 0.9987895 -0.8766541 0.8754109 0.9987895 -0.8771307 0.8754109 0.9987895 -0.8777338 0.8754109 0.9987895 -0.8784967 0.8754109 0.9987895 -0.8794619 0.8754109 0.9987895 -0.880683 0.8754109 0.9987895 -0.8822279 0.8754109 0.9987895 -0.8841823 0.8754109 0.9987895 -0.886655 0.8754109 0.9987895 -0.8897832 0.8754109 0.9987895 -0.8937407 0.8754109 0.9987895 -0.8987476 0.8754109 0.9987895 -0.9050819 0.8754109 0.9987895 -0.9130957 0.8754109 0.9987895 -0.9232341 0.8754109 0.9987895 -0.9360606 0.8754109 0.9987895 -0.9522877 0.8754109 0.9987895 -0.9728171 0.8754109 0.9987895 -0.9987895 0.8754109 0.9987895 -0.9990455 0.8992336 0.9780539 -0.999247 0.9188636 0.9690013 -0.9994057 0.9349075 0.9666876 -0.9995308 0.9479335 0.9680197 -0.9996295 0.9584526 0.9711183 -0.9997074 0.9669103 0.974882 -0.9997688 0.973687 0.9786968 -0.9998174 0.9791018 0.9822464 -0.9998557 0.9834186 0.9853905 -0.999886 0.9868541 0.9880897 -0.9999099 0.9895842 0.990358 -0.9999288 0.9917515 0.9922358 -0.9999437 0.9934704 0.9937734 -0.8750477 0.8757434 0.9987905 -0.8750466 0.875741 0.9987905 -0.8750451 0.8757379 0.9987904 -0.8750434 0.875734 0.9987904 -0.8750412 0.8757292 0.9987904 -0.8750386 0.8757232 0.9987904 -0.8750355 0.8757158 0.9987903 -0.8750317 0.8757066 0.9987903 -0.8750274 0.8756954 0.9987902 -0.8750225 0.8756819 0.9987902 -0.8750173 0.8756658 0.9987901 -0.8750124 0.875647 0.99879 -0.8750088 0.8756258 0.9987899 -0.8750084 0.8756031 0.9987897 -0.8750145 0.8755809 0.9987896 -0.8750329 0.8755636 0.9987895 -0.8750727 0.875558 0.9987895 -0.8751301 0.875558 0.9987895 -0.8752028 0.875558 0.9987895 -0.8752947 0.875558 0.9987895 -0.8754109 0.875558 0.9987895 -0.875558 0.875558 0.9987895 -0.8757441 0.875558 0.9987895 -0.8759795 0.875558 0.9987895 -0.8762773 0.875558 0.9987895 -0.8766541 0.875558 0.9987895 -0.8771307 0.875558 0.9987895 -0.8777338 0.875558 0.9987895 -0.8784967 0.875558 0.9987895 -0.8794619 0.875558 0.9987895 -0.880683 0.875558 0.9987895 -0.8822279 0.875558 0.9987895 -0.8841823 0.875558 0.9987895 -0.886655 0.875558 0.9987895 -0.8897832 0.875558 0.9987895 -0.8937407 0.875558 0.9987895 -0.8987476 0.875558 0.9987895 -0.9050819 0.875558 0.9987895 -0.9130957 0.875558 0.9987895 -0.9232341 0.875558 0.9987895 -0.9360606 0.875558 0.9987895 -0.9522877 0.875558 0.9987895 -0.9728171 0.875558 0.9987895 -0.9987895 0.875558 0.9987895 -0.9990455 0.8993275 0.9780539 -0.999247 0.9189234 0.9690013 -0.9994057 0.9349454 0.9666876 -0.9995308 0.9479575 0.9680197 -0.9996295 0.9584677 0.9711183 -0.9997074 0.9669198 0.974882 -0.9997688 0.973693 0.9786968 -0.9998174 0.9791055 0.9822464 -0.9998557 0.9834209 0.9853905 -0.999886 0.9868555 0.9880897 -0.9999099 0.9895851 0.990358 -0.9999288 0.9917521 0.9922358 -0.9999437 0.9934707 0.9937734 -0.8750477 0.8759292 0.9987905 -0.8750466 0.8759268 0.9987905 -0.8750451 0.8759237 0.9987904 -0.8750434 0.8759198 0.9987904 -0.8750412 0.875915 0.9987904 -0.8750386 0.875909 0.9987904 -0.8750355 0.8759016 0.9987903 -0.8750317 0.8758925 0.9987903 -0.8750274 0.8758813 0.9987902 -0.8750225 0.8758678 0.9987902 -0.8750173 0.8758517 0.9987901 -0.8750124 0.8758329 0.99879 -0.8750088 0.8758117 0.9987899 -0.8750084 0.8757891 0.9987897 -0.8750145 0.875767 0.9987896 -0.8750329 0.8757496 0.9987895 -0.8750727 0.8757441 0.9987895 -0.8751301 0.8757441 0.9987895 -0.8752028 0.8757441 0.9987895 -0.8752947 0.8757441 0.9987895 -0.8754109 0.8757441 0.9987895 -0.875558 0.8757441 0.9987895 -0.8757441 0.8757441 0.9987895 -0.8759795 0.8757441 0.9987895 -0.8762773 0.8757441 0.9987895 -0.8766541 0.8757441 0.9987895 -0.8771307 0.8757441 0.9987895 -0.8777338 0.8757441 0.9987895 -0.8784967 0.8757441 0.9987895 -0.8794619 0.8757441 0.9987895 -0.880683 0.8757441 0.9987895 -0.8822279 0.8757441 0.9987895 -0.8841823 0.8757441 0.9987895 -0.886655 0.8757441 0.9987895 -0.8897832 0.8757441 0.9987895 -0.8937407 0.8757441 0.9987895 -0.8987476 0.8757441 0.9987895 -0.9050819 0.8757441 0.9987895 -0.9130957 0.8757441 0.9987895 -0.9232341 0.8757441 0.9987895 -0.9360606 0.8757441 0.9987895 -0.9522877 0.8757441 0.9987895 -0.9728171 0.8757441 0.9987895 -0.9987895 0.8757441 0.9987895 -0.9990455 0.8994464 0.9780539 -0.999247 0.918999 0.9690013 -0.9994057 0.9349933 0.9666876 -0.9995308 0.9479878 0.9680197 -0.9996295 0.9584868 0.9711183 -0.9997074 0.9669318 0.974882 -0.9997688 0.9737006 0.9786968 -0.9998174 0.9791103 0.9822464 -0.9998557 0.9834239 0.9853905 -0.999886 0.9868574 0.9880897 -0.9999099 0.9895863 0.990358 -0.9999288 0.9917528 0.9922358 -0.9999437 0.9934712 0.9937734 -0.8750477 0.8761643 0.9987905 -0.8750466 0.8761618 0.9987905 -0.8750451 0.8761587 0.9987904 -0.8750434 0.8761549 0.9987904 -0.8750412 0.8761501 0.9987904 -0.8750386 0.8761441 0.9987904 -0.8750355 0.8761367 0.9987903 -0.8750317 0.8761276 0.9987903 -0.8750274 0.8761164 0.9987902 -0.8750225 0.8761029 0.9987902 -0.8750173 0.8760869 0.9987901 -0.8750124 0.8760681 0.99879 -0.8750088 0.876047 0.9987899 -0.8750084 0.8760244 0.9987897 -0.8750145 0.8760023 0.9987896 -0.8750329 0.875985 0.9987895 -0.8750727 0.8759795 0.9987895 -0.8751301 0.8759795 0.9987895 -0.8752028 0.8759795 0.9987895 -0.8752947 0.8759795 0.9987895 -0.8754109 0.8759795 0.9987895 -0.875558 0.8759795 0.9987895 -0.8757441 0.8759795 0.9987895 -0.8759795 0.8759795 0.9987895 -0.8762773 0.8759795 0.9987895 -0.8766541 0.8759795 0.9987895 -0.8771307 0.8759795 0.9987895 -0.8777338 0.8759795 0.9987895 -0.8784967 0.8759795 0.9987895 -0.8794619 0.8759795 0.9987895 -0.880683 0.8759795 0.9987895 -0.8822279 0.8759795 0.9987895 -0.8841823 0.8759795 0.9987895 -0.886655 0.8759795 0.9987895 -0.8897832 0.8759795 0.9987895 -0.8937407 0.8759795 0.9987895 -0.8987476 0.8759795 0.9987895 -0.9050819 0.8759795 0.9987895 -0.9130957 0.8759795 0.9987895 -0.9232341 0.8759795 0.9987895 -0.9360606 0.8759795 0.9987895 -0.9522877 0.8759795 0.9987895 -0.9728171 0.8759795 0.9987895 -0.9987895 0.8759795 0.9987895 -0.9990455 0.8995968 0.9780539 -0.999247 0.9190947 0.9690013 -0.9994057 0.935054 0.9666876 -0.9995308 0.9480261 0.9680197 -0.9996295 0.9585109 0.9711183 -0.9997074 0.966947 0.974882 -0.9997688 0.9737101 0.9786968 -0.9998174 0.9791163 0.9822464 -0.9998557 0.9834277 0.9853905 -0.999886 0.9868597 0.9880897 -0.9999099 0.9895878 0.990358 -0.9999288 0.9917537 0.9922358 -0.9999437 0.9934718 0.9937734 -0.8750477 0.8764616 0.9987905 -0.8750466 0.8764592 0.9987905 -0.8750451 0.8764561 0.9987904 -0.8750434 0.8764523 0.9987904 -0.8750412 0.8764475 0.9987904 -0.8750386 0.8764415 0.9987904 -0.8750355 0.8764342 0.9987903 -0.8750317 0.876425 0.9987903 -0.8750274 0.8764139 0.9987902 -0.8750225 0.8764004 0.9987902 -0.8750173 0.8763844 0.9987901 -0.8750124 0.8763657 0.99879 -0.8750088 0.8763446 0.9987899 -0.8750084 0.8763221 0.9987897 -0.8750145 0.8763001 0.9987896 -0.8750329 0.8762828 0.9987895 -0.8750727 0.8762773 0.9987895 -0.8751301 0.8762773 0.9987895 -0.8752028 0.8762773 0.9987895 -0.8752947 0.8762773 0.9987895 -0.8754109 0.8762773 0.9987895 -0.875558 0.8762773 0.9987895 -0.8757441 0.8762773 0.9987895 -0.8759795 0.8762773 0.9987895 -0.8762773 0.8762773 0.9987895 -0.8766541 0.8762773 0.9987895 -0.8771307 0.8762773 0.9987895 -0.8777338 0.8762773 0.9987895 -0.8784967 0.8762773 0.9987895 -0.8794619 0.8762773 0.9987895 -0.880683 0.8762773 0.9987895 -0.8822279 0.8762773 0.9987895 -0.8841823 0.8762773 0.9987895 -0.886655 0.8762773 0.9987895 -0.8897832 0.8762773 0.9987895 -0.8937407 0.8762773 0.9987895 -0.8987476 0.8762773 0.9987895 -0.9050819 0.8762773 0.9987895 -0.9130957 0.8762773 0.9987895 -0.9232341 0.8762773 0.9987895 -0.9360606 0.8762773 0.9987895 -0.9522877 0.8762773 0.9987895 -0.9728171 0.8762773 0.9987895 -0.9987895 0.8762773 0.9987895 -0.9990455 0.899787 0.9780539 -0.999247 0.9192157 0.9690013 -0.9994057 0.9351307 0.9666876 -0.9995308 0.9480746 0.9680197 -0.9996295 0.9585415 0.9711183 -0.9997074 0.9669663 0.974882 -0.9997688 0.9737222 0.9786968 -0.9998174 0.9791238 0.9822464 -0.9998557 0.9834324 0.9853905 -0.999886 0.9868627 0.9880897 -0.9999099 0.9895897 0.990358 -0.9999288 0.9917549 0.9922358 -0.9999437 0.9934725 0.9937734 -0.8750477 0.8768378 0.9987905 -0.8750466 0.8768354 0.9987905 -0.8750451 0.8768324 0.9987904 -0.8750434 0.8768285 0.9987904 -0.8750412 0.8768238 0.9987904 -0.8750386 0.8768178 0.9987904 -0.8750355 0.8768104 0.9987903 -0.8750317 0.8768014 0.9987903 -0.8750274 0.8767903 0.9987902 -0.8750225 0.8767768 0.9987902 -0.8750173 0.8767609 0.9987901 -0.8750124 0.8767422 0.99879 -0.8750088 0.8767212 0.9987899 -0.8750084 0.8766987 0.9987897 -0.8750145 0.8766768 0.9987896 -0.8750329 0.8766596 0.9987895 -0.8750727 0.8766541 0.9987895 -0.8751301 0.8766541 0.9987895 -0.8752028 0.8766541 0.9987895 -0.8752947 0.8766541 0.9987895 -0.8754109 0.8766541 0.9987895 -0.875558 0.8766541 0.9987895 -0.8757441 0.8766541 0.9987895 -0.8759795 0.8766541 0.9987895 -0.8762773 0.8766541 0.9987895 -0.8766541 0.8766541 0.9987895 -0.8771307 0.8766541 0.9987895 -0.8777338 0.8766541 0.9987895 -0.8784967 0.8766541 0.9987895 -0.8794619 0.8766541 0.9987895 -0.880683 0.8766541 0.9987895 -0.8822279 0.8766541 0.9987895 -0.8841823 0.8766541 0.9987895 -0.886655 0.8766541 0.9987895 -0.8897832 0.8766541 0.9987895 -0.8937407 0.8766541 0.9987895 -0.8987476 0.8766541 0.9987895 -0.9050819 0.8766541 0.9987895 -0.9130957 0.8766541 0.9987895 -0.9232341 0.8766541 0.9987895 -0.9360606 0.8766541 0.9987895 -0.9522877 0.8766541 0.9987895 -0.9728171 0.8766541 0.9987895 -0.9987895 0.8766541 0.9987895 -0.9990455 0.9000277 0.9780539 -0.999247 0.9193688 0.9690013 -0.9994057 0.9352277 0.9666876 -0.9995308 0.9481359 0.9680197 -0.9996295 0.9585802 0.9711183 -0.9997074 0.9669906 0.974882 -0.9997688 0.9737375 0.9786968 -0.9998174 0.9791334 0.9822464 -0.9998557 0.9834385 0.9853905 -0.999886 0.9868665 0.9880897 -0.9999099 0.989592 0.990358 -0.9999288 0.9917564 0.9922358 -0.9999437 0.9934734 0.9937734 -0.8750477 0.8773138 0.9987905 -0.8750466 0.8773114 0.9987905 -0.8750451 0.8773083 0.9987904 -0.8750434 0.8773045 0.9987904 -0.8750412 0.8772998 0.9987904 -0.8750386 0.8772938 0.9987904 -0.8750355 0.8772865 0.9987903 -0.8750317 0.8772775 0.9987903 -0.8750274 0.8772664 0.9987902 -0.8750225 0.877253 0.9987902 -0.8750173 0.8772371 0.9987901 -0.8750124 0.8772186 0.99879 -0.8750088 0.8771976 0.9987899 -0.8750084 0.8771752 0.9987897 -0.8750145 0.8771534 0.9987896 -0.8750329 0.8771362 0.9987895 -0.8750727 0.8771307 0.9987895 -0.8751301 0.8771307 0.9987895 -0.8752028 0.8771307 0.9987895 -0.8752947 0.8771307 0.9987895 -0.8754109 0.8771307 0.9987895 -0.875558 0.8771307 0.9987895 -0.8757441 0.8771307 0.9987895 -0.8759795 0.8771307 0.9987895 -0.8762773 0.8771307 0.9987895 -0.8766541 0.8771307 0.9987895 -0.8771307 0.8771307 0.9987895 -0.8777338 0.8771307 0.9987895 -0.8784967 0.8771307 0.9987895 -0.8794619 0.8771307 0.9987895 -0.880683 0.8771307 0.9987895 -0.8822279 0.8771307 0.9987895 -0.8841823 0.8771307 0.9987895 -0.886655 0.8771307 0.9987895 -0.8897832 0.8771307 0.9987895 -0.8937407 0.8771307 0.9987895 -0.8987476 0.8771307 0.9987895 -0.9050819 0.8771307 0.9987895 -0.9130957 0.8771307 0.9987895 -0.9232341 0.8771307 0.9987895 -0.9360606 0.8771307 0.9987895 -0.9522877 0.8771307 0.9987895 -0.9728171 0.8771307 0.9987895 -0.9987895 0.8771307 0.9987895 -0.9990455 0.9003323 0.9780539 -0.999247 0.9195625 0.9690013 -0.9994057 0.9353505 0.9666876 -0.9995308 0.9482135 0.9680197 -0.9996295 0.9586291 0.9711183 -0.9997074 0.9670214 0.974882 -0.9997688 0.9737569 0.9786968 -0.9998174 0.9791456 0.9822464 -0.9998557 0.9834461 0.9853905 -0.999886 0.9868713 0.9880897 -0.9999099 0.989595 0.990358 -0.9999288 0.9917582 0.9922358 -0.9999437 0.9934746 0.9937734 -0.8750477 0.8779159 0.9987905 -0.8750466 0.8779135 0.9987905 -0.8750451 0.8779105 0.9987904 -0.8750434 0.8779067 0.9987904 -0.8750412 0.877902 0.9987904 -0.8750386 0.8778961 0.9987904 -0.8750355 0.8778888 0.9987903 -0.8750317 0.8778798 0.9987903 -0.8750274 0.8778688 0.9987902 -0.8750225 0.8778555 0.9987902 -0.8750173 0.8778396 0.9987901 -0.8750124 0.8778212 0.99879 -0.8750088 0.8778003 0.9987899 -0.8750084 0.877778 0.9987897 -0.8750145 0.8777563 0.9987896 -0.8750329 0.8777392 0.9987895 -0.8750727 0.8777338 0.9987895 -0.8751301 0.8777338 0.9987895 -0.8752028 0.8777338 0.9987895 -0.8752947 0.8777338 0.9987895 -0.8754109 0.8777338 0.9987895 -0.875558 0.8777338 0.9987895 -0.8757441 0.8777338 0.9987895 -0.8759795 0.8777338 0.9987895 -0.8762773 0.8777338 0.9987895 -0.8766541 0.8777338 0.9987895 -0.8771307 0.8777338 0.9987895 -0.8777338 0.8777338 0.9987895 -0.8784967 0.8777338 0.9987895 -0.8794619 0.8777338 0.9987895 -0.880683 0.8777338 0.9987895 -0.8822279 0.8777338 0.9987895 -0.8841823 0.8777338 0.9987895 -0.886655 0.8777338 0.9987895 -0.8897832 0.8777338 0.9987895 -0.8937407 0.8777338 0.9987895 -0.8987476 0.8777338 0.9987895 -0.9050819 0.8777338 0.9987895 -0.9130957 0.8777338 0.9987895 -0.9232341 0.8777338 0.9987895 -0.9360606 0.8777338 0.9987895 -0.9522877 0.8777338 0.9987895 -0.9728171 0.8777338 0.9987895 -0.9987895 0.8777338 0.9987895 -0.9990455 0.9007175 0.9780539 -0.999247 0.9198076 0.9690013 -0.9994057 0.9355059 0.9666876 -0.9995308 0.9483117 0.9680197 -0.9996295 0.958691 0.9711183 -0.9997074 0.9670604 0.974882 -0.9997688 0.9737814 0.9786968 -0.9998174 0.979161 0.9822464 -0.9998557 0.9834557 0.9853905 -0.999886 0.9868773 0.9880897 -0.9999099 0.9895988 0.990358 -0.9999288 0.9917606 0.9922358 -0.9999437 0.9934761 0.9937734 -0.8750477 0.8786777 0.9987905 -0.8750466 0.8786753 0.9987905 -0.8750451 0.8786723 0.9987904 -0.8750434 0.8786686 0.9987904 -0.8750412 0.8786638 0.9987904 -0.8750386 0.878658 0.9987904 -0.8750355 0.8786507 0.9987903 -0.8750317 0.8786418 0.9987903 -0.8750274 0.8786309 0.9987902 -0.8750225 0.8786176 0.9987902 -0.8750173 0.8786019 0.9987901 -0.8750124 0.8785835 0.99879 -0.8750088 0.8785628 0.9987899 -0.8750084 0.8785407 0.9987897 -0.8750145 0.8785191 0.9987896 -0.8750329 0.8785021 0.9987895 -0.8750727 0.8784967 0.9987895 -0.8751301 0.8784967 0.9987895 -0.8752028 0.8784967 0.9987895 -0.8752947 0.8784967 0.9987895 -0.8754109 0.8784967 0.9987895 -0.875558 0.8784967 0.9987895 -0.8757441 0.8784967 0.9987895 -0.8759795 0.8784967 0.9987895 -0.8762773 0.8784967 0.9987895 -0.8766541 0.8784967 0.9987895 -0.8771307 0.8784967 0.9987895 -0.8777338 0.8784967 0.9987895 -0.8784967 0.8784967 0.9987895 -0.8794619 0.8784967 0.9987895 -0.880683 0.8784967 0.9987895 -0.8822279 0.8784967 0.9987895 -0.8841823 0.8784967 0.9987895 -0.886655 0.8784967 0.9987895 -0.8897832 0.8784967 0.9987895 -0.8937407 0.8784967 0.9987895 -0.8987476 0.8784967 0.9987895 -0.9050819 0.8784967 0.9987895 -0.9130957 0.8784967 0.9987895 -0.9232341 0.8784967 0.9987895 -0.9360606 0.8784967 0.9987895 -0.9522877 0.8784967 0.9987895 -0.9728171 0.8784967 0.9987895 -0.9987895 0.8784967 0.9987895 -0.9990455 0.9012049 0.9780539 -0.999247 0.9201176 0.9690013 -0.9994057 0.9357024 0.9666876 -0.9995308 0.9484359 0.9680197 -0.9996295 0.9587693 0.9711183 -0.9997074 0.9671097 0.974882 -0.9997688 0.9738123 0.9786968 -0.9998174 0.9791804 0.9822464 -0.9998557 0.9834679 0.9853905 -0.999886 0.986885 0.9880897 -0.9999099 0.9896036 0.990358 -0.9999288 0.9917636 0.9922358 -0.9999437 0.9934779 0.9937734 -0.8750477 0.8796415 0.9987905 -0.8750466 0.8796391 0.9987905 -0.8750451 0.8796361 0.9987904 -0.8750434 0.8796324 0.9987904 -0.8750412 0.8796277 0.9987904 -0.8750386 0.8796219 0.9987904 -0.8750355 0.8796147 0.9987903 -0.8750317 0.8796058 0.9987903 -0.8750274 0.879595 0.9987902 -0.8750225 0.8795819 0.9987902 -0.8750173 0.8795663 0.9987901 -0.8750124 0.8795481 0.99879 -0.8750088 0.8795275 0.9987899 -0.8750084 0.8795055 0.9987897 -0.8750145 0.8794841 0.9987896 -0.8750329 0.8794673 0.9987895 -0.8750727 0.8794619 0.9987895 -0.8751301 0.8794619 0.9987895 -0.8752028 0.8794619 0.9987895 -0.8752947 0.8794619 0.9987895 -0.8754109 0.8794619 0.9987895 -0.875558 0.8794619 0.9987895 -0.8757441 0.8794619 0.9987895 -0.8759795 0.8794619 0.9987895 -0.8762773 0.8794619 0.9987895 -0.8766541 0.8794619 0.9987895 -0.8771307 0.8794619 0.9987895 -0.8777338 0.8794619 0.9987895 -0.8784967 0.8794619 0.9987895 -0.8794619 0.8794619 0.9987895 -0.880683 0.8794619 0.9987895 -0.8822279 0.8794619 0.9987895 -0.8841823 0.8794619 0.9987895 -0.886655 0.8794619 0.9987895 -0.8897832 0.8794619 0.9987895 -0.8937407 0.8794619 0.9987895 -0.8987476 0.8794619 0.9987895 -0.9050819 0.8794619 0.9987895 -0.9130957 0.8794619 0.9987895 -0.9232341 0.8794619 0.9987895 -0.9360606 0.8794619 0.9987895 -0.9522877 0.8794619 0.9987895 -0.9728171 0.8794619 0.9987895 -0.9987895 0.8794619 0.9987895 -0.9990455 0.9018215 0.9780539 -0.999247 0.9205098 0.9690013 -0.9994057 0.935951 0.9666876 -0.9995308 0.9485931 0.9680197 -0.9996295 0.9588684 0.9711183 -0.9997074 0.967172 0.974882 -0.9997688 0.9738515 0.9786968 -0.9998174 0.979205 0.9822464 -0.9998557 0.9834833 0.9853905 -0.999886 0.9868946 0.9880897 -0.9999099 0.9896096 0.990358 -0.9999288 0.9917674 0.9922358 -0.9999437 0.9934803 0.9937734 -0.8750477 0.8808607 0.9987905 -0.8750466 0.8808584 0.9987905 -0.8750451 0.8808555 0.9987904 -0.8750434 0.8808518 0.9987904 -0.8750412 0.8808471 0.9987904 -0.8750386 0.8808414 0.9987904 -0.8750355 0.8808343 0.9987903 -0.8750317 0.8808255 0.9987903 -0.8750274 0.8808147 0.9987902 -0.8750225 0.8808018 0.9987902 -0.8750173 0.8807863 0.9987901 -0.8750124 0.8807683 0.99879 -0.8750088 0.880748 0.9987899 -0.8750084 0.8807262 0.9987897 -0.8750145 0.880705 0.9987896 -0.8750329 0.8806883 0.9987895 -0.8750727 0.880683 0.9987895 -0.8751301 0.880683 0.9987895 -0.8752028 0.880683 0.9987895 -0.8752947 0.880683 0.9987895 -0.8754109 0.880683 0.9987895 -0.875558 0.880683 0.9987895 -0.8757441 0.880683 0.9987895 -0.8759795 0.880683 0.9987895 -0.8762773 0.880683 0.9987895 -0.8766541 0.880683 0.9987895 -0.8771307 0.880683 0.9987895 -0.8777338 0.880683 0.9987895 -0.8784967 0.880683 0.9987895 -0.8794619 0.880683 0.9987895 -0.880683 0.880683 0.9987895 -0.8822279 0.880683 0.9987895 -0.8841823 0.880683 0.9987895 -0.886655 0.880683 0.9987895 -0.8897832 0.880683 0.9987895 -0.8937407 0.880683 0.9987895 -0.8987476 0.880683 0.9987895 -0.9050819 0.880683 0.9987895 -0.9130957 0.880683 0.9987895 -0.9232341 0.880683 0.9987895 -0.9360606 0.880683 0.9987895 -0.9522877 0.880683 0.9987895 -0.9728171 0.880683 0.9987895 -0.9987895 0.880683 0.9987895 -0.9990455 0.9026016 0.9780539 -0.999247 0.9210061 0.9690013 -0.9994057 0.9362655 0.9666876 -0.9995308 0.9487918 0.9680197 -0.9996295 0.9589938 0.9711183 -0.9997074 0.9672509 0.974882 -0.9997688 0.9739011 0.9786968 -0.9998174 0.9792361 0.9822464 -0.9998557 0.9835029 0.9853905 -0.999886 0.9869069 0.9880897 -0.9999099 0.9896173 0.990358 -0.9999288 0.9917722 0.9922358 -0.9999437 0.9934833 0.9937734 -0.8750477 0.8824033 0.9987905 -0.8750466 0.882401 0.9987905 -0.8750451 0.8823981 0.9987904 -0.8750434 0.8823944 0.9987904 -0.8750412 0.8823899 0.9987904 -0.8750386 0.8823842 0.9987904 -0.8750355 0.8823772 0.9987903 -0.8750317 0.8823685 0.9987903 -0.8750274 0.8823579 0.9987902 -0.8750225 0.8823451 0.9987902 -0.8750173 0.8823298 0.9987901 -0.8750124 0.882312 0.99879 -0.8750088 0.882292 0.9987899 -0.8750084 0.8822705 0.9987897 -0.8750145 0.8822496 0.9987896 -0.8750329 0.8822331 0.9987895 -0.8750727 0.8822279 0.9987895 -0.8751301 0.8822279 0.9987895 -0.8752028 0.8822279 0.9987895 -0.8752947 0.8822279 0.9987895 -0.8754109 0.8822279 0.9987895 -0.875558 0.8822279 0.9987895 -0.8757441 0.8822279 0.9987895 -0.8759795 0.8822279 0.9987895 -0.8762773 0.8822279 0.9987895 -0.8766541 0.8822279 0.9987895 -0.8771307 0.8822279 0.9987895 -0.8777338 0.8822279 0.9987895 -0.8784967 0.8822279 0.9987895 -0.8794619 0.8822279 0.9987895 -0.880683 0.8822279 0.9987895 -0.8822279 0.8822279 0.9987895 -0.8841823 0.8822279 0.9987895 -0.886655 0.8822279 0.9987895 -0.8897832 0.8822279 0.9987895 -0.8937407 0.8822279 0.9987895 -0.8987476 0.8822279 0.9987895 -0.9050819 0.8822279 0.9987895 -0.9130957 0.8822279 0.9987895 -0.9232341 0.8822279 0.9987895 -0.9360606 0.8822279 0.9987895 -0.9522877 0.8822279 0.9987895 -0.9728171 0.8822279 0.9987895 -0.9987895 0.8822279 0.9987895 -0.9990455 0.9035886 0.9780539 -0.999247 0.9216339 0.9690013 -0.9994057 0.9366635 0.9666876 -0.9995308 0.9490434 0.9680197 -0.9996295 0.9591524 0.9711183 -0.9997074 0.9673508 0.974882 -0.9997688 0.9739638 0.9786968 -0.9998174 0.9792755 0.9822464 -0.9998557 0.9835276 0.9853905 -0.999886 0.9869223 0.9880897 -0.9999099 0.989627 0.990358 -0.9999288 0.9917782 0.9922358 -0.9999437 0.9934871 0.9937734 -0.8750477 0.8843548 0.9987905 -0.8750466 0.8843525 0.9987905 -0.8750451 0.8843497 0.9987904 -0.8750434 0.8843461 0.9987904 -0.8750412 0.8843416 0.9987904 -0.8750386 0.884336 0.9987904 -0.8750355 0.8843291 0.9987903 -0.8750317 0.8843206 0.9987903 -0.8750274 0.8843102 0.9987902 -0.8750225 0.8842976 0.9987902 -0.8750173 0.8842826 0.9987901 -0.8750124 0.8842651 0.99879 -0.8750088 0.8842454 0.9987899 -0.8750084 0.8842242 0.9987897 -0.8750145 0.8842037 0.9987896 -0.8750329 0.8841875 0.9987895 -0.8750727 0.8841823 0.9987895 -0.8751301 0.8841823 0.9987895 -0.8752028 0.8841823 0.9987895 -0.8752947 0.8841823 0.9987895 -0.8754109 0.8841823 0.9987895 -0.875558 0.8841823 0.9987895 -0.8757441 0.8841823 0.9987895 -0.8759795 0.8841823 0.9987895 -0.8762773 0.8841823 0.9987895 -0.8766541 0.8841823 0.9987895 -0.8771307 0.8841823 0.9987895 -0.8777338 0.8841823 0.9987895 -0.8784967 0.8841823 0.9987895 -0.8794619 0.8841823 0.9987895 -0.880683 0.8841823 0.9987895 -0.8822279 0.8841823 0.9987895 -0.8841823 0.8841823 0.9987895 -0.886655 0.8841823 0.9987895 -0.8897832 0.8841823 0.9987895 -0.8937407 0.8841823 0.9987895 -0.8987476 0.8841823 0.9987895 -0.9050819 0.8841823 0.9987895 -0.9130957 0.8841823 0.9987895 -0.9232341 0.8841823 0.9987895 -0.9360606 0.8841823 0.9987895 -0.9522877 0.8841823 0.9987895 -0.9728171 0.8841823 0.9987895 -0.9987895 0.8841823 0.9987895 -0.9990455 0.9048372 0.9780539 -0.999247 0.9224281 0.9690013 -0.9994057 0.9371669 0.9666876 -0.9995308 0.9493615 0.9680197 -0.9996295 0.959353 0.9711183 -0.9997074 0.967477 0.974882 -0.9997688 0.9740432 0.9786968 -0.9998174 0.9793253 0.9822464 -0.9998557 0.9835588 0.9853905 -0.999886 0.9869419 0.9880897 -0.9999099 0.9896392 0.990358 -0.9999288 0.9917859 0.9922358 -0.9999437 0.9934919 0.9937734 -0.8750477 0.8868238 0.9987905 -0.8750466 0.8868215 0.9987905 -0.8750451 0.8868187 0.9987904 -0.8750434 0.8868152 0.9987904 -0.8750412 0.8868108 0.9987904 -0.8750386 0.8868054 0.9987904 -0.8750355 0.8867986 0.9987903 -0.8750317 0.8867903 0.9987903 -0.8750274 0.8867801 0.9987902 -0.8750225 0.8867677 0.9987902 -0.8750173 0.8867531 0.9987901 -0.8750124 0.8867359 0.99879 -0.8750088 0.8867166 0.9987899 -0.8750084 0.886696 0.9987897 -0.8750145 0.8866758 0.9987896 -0.8750329 0.88666 0.9987895 -0.8750727 0.886655 0.9987895 -0.8751301 0.886655 0.9987895 -0.8752028 0.886655 0.9987895 -0.8752947 0.886655 0.9987895 -0.8754109 0.886655 0.9987895 -0.875558 0.886655 0.9987895 -0.8757441 0.886655 0.9987895 -0.8759795 0.886655 0.9987895 -0.8762773 0.886655 0.9987895 -0.8766541 0.886655 0.9987895 -0.8771307 0.886655 0.9987895 -0.8777338 0.886655 0.9987895 -0.8784967 0.886655 0.9987895 -0.8794619 0.886655 0.9987895 -0.880683 0.886655 0.9987895 -0.8822279 0.886655 0.9987895 -0.8841823 0.886655 0.9987895 -0.886655 0.886655 0.9987895 -0.8897832 0.886655 0.9987895 -0.8937407 0.886655 0.9987895 -0.8987476 0.886655 0.9987895 -0.9050819 0.886655 0.9987895 -0.9130957 0.886655 0.9987895 -0.9232341 0.886655 0.9987895 -0.9360606 0.886655 0.9987895 -0.9522877 0.886655 0.9987895 -0.9728171 0.886655 0.9987895 -0.9987895 0.886655 0.9987895 -0.9990455 0.9064168 0.9780539 -0.999247 0.9234329 0.9690013 -0.9994057 0.9378038 0.9666876 -0.9995308 0.9497641 0.9680197 -0.9996295 0.9596068 0.9711183 -0.9997074 0.9676368 0.974882 -0.9997688 0.9741436 0.9786968 -0.9998174 0.9793883 0.9822464 -0.9998557 0.9835983 0.9853905 -0.999886 0.9869667 0.9880897 -0.9999099 0.9896547 0.990358 -0.9999288 0.9917956 0.9922358 -0.9999437 0.993498 0.9937734 -0.8750477 0.8899473 0.9987905 -0.8750466 0.8899451 0.9987905 -0.8750451 0.8899424 0.9987904 -0.8750434 0.889939 0.9987904 -0.8750412 0.8899347 0.9987904 -0.8750386 0.8899294 0.9987904 -0.8750355 0.8899228 0.9987903 -0.8750317 0.8899147 0.9987903 -0.8750274 0.8899048 0.9987902 -0.8750225 0.8898928 0.9987902 -0.8750173 0.8898785 0.9987901 -0.8750124 0.8898619 0.99879 -0.8750088 0.8898431 0.9987899 -0.8750084 0.889823 0.9987897 -0.8750145 0.8898035 0.9987896 -0.8750329 0.8897881 0.9987895 -0.8750727 0.8897832 0.9987895 -0.8751301 0.8897832 0.9987895 -0.8752028 0.8897832 0.9987895 -0.8752947 0.8897832 0.9987895 -0.8754109 0.8897832 0.9987895 -0.875558 0.8897832 0.9987895 -0.8757441 0.8897832 0.9987895 -0.8759795 0.8897832 0.9987895 -0.8762773 0.8897832 0.9987895 -0.8766541 0.8897832 0.9987895 -0.8771307 0.8897832 0.9987895 -0.8777338 0.8897832 0.9987895 -0.8784967 0.8897832 0.9987895 -0.8794619 0.8897832 0.9987895 -0.880683 0.8897832 0.9987895 -0.8822279 0.8897832 0.9987895 -0.8841823 0.8897832 0.9987895 -0.886655 0.8897832 0.9987895 -0.8897832 0.8897832 0.9987895 -0.8937407 0.8897832 0.9987895 -0.8987476 0.8897832 0.9987895 -0.9050819 0.8897832 0.9987895 -0.9130957 0.8897832 0.9987895 -0.9232341 0.8897832 0.9987895 -0.9360606 0.8897832 0.9987895 -0.9522877 0.8897832 0.9987895 -0.9728171 0.8897832 0.9987895 -0.9987895 0.8897832 0.9987895 -0.9990455 0.9084153 0.9780539 -0.999247 0.9247041 0.9690013 -0.9994057 0.9386096 0.9666876 -0.9995308 0.9502734 0.9680197 -0.9996295 0.959928 0.9711183 -0.9997074 0.9678389 0.974882 -0.9997688 0.9742706 0.9786968 -0.9998174 0.9794681 0.9822464 -0.9998557 0.9836483 0.9853905 -0.999886 0.986998 0.9880897 -0.9999099 0.9896744 0.990358 -0.9999288 0.9918079 0.9922358 -0.9999437 0.9935057 0.9937734 -0.8750477 0.8938989 0.9987905 -0.8750466 0.8938969 0.9987905 -0.8750451 0.8938942 0.9987904 -0.8750434 0.8938909 0.9987904 -0.8750412 0.8938868 0.9987904 -0.8750386 0.8938817 0.9987904 -0.8750355 0.8938754 0.9987903 -0.8750317 0.8938676 0.9987903 -0.8750274 0.893858 0.9987902 -0.8750225 0.8938464 0.9987902 -0.8750173 0.8938327 0.9987901 -0.8750124 0.8938167 0.99879 -0.8750088 0.8937986 0.9987899 -0.8750084 0.8937792 0.9987897 -0.8750145 0.8937603 0.9987896 -0.8750329 0.8937455 0.9987895 -0.8750727 0.8937407 0.9987895 -0.8751301 0.8937407 0.9987895 -0.8752028 0.8937407 0.9987895 -0.8752947 0.8937407 0.9987895 -0.8754109 0.8937407 0.9987895 -0.875558 0.8937407 0.9987895 -0.8757441 0.8937407 0.9987895 -0.8759795 0.8937407 0.9987895 -0.8762773 0.8937407 0.9987895 -0.8766541 0.8937407 0.9987895 -0.8771307 0.8937407 0.9987895 -0.8777338 0.8937407 0.9987895 -0.8784967 0.8937407 0.9987895 -0.8794619 0.8937407 0.9987895 -0.880683 0.8937407 0.9987895 -0.8822279 0.8937407 0.9987895 -0.8841823 0.8937407 0.9987895 -0.886655 0.8937407 0.9987895 -0.8897832 0.8937407 0.9987895 -0.8937407 0.8937407 0.9987895 -0.8987476 0.8937407 0.9987895 -0.9050819 0.8937407 0.9987895 -0.9130957 0.8937407 0.9987895 -0.9232341 0.8937407 0.9987895 -0.9360606 0.8937407 0.9987895 -0.9522877 0.8937407 0.9987895 -0.9728171 0.8937407 0.9987895 -0.9987895 0.8937407 0.9987895 -0.9990455 0.9109436 0.9780539 -0.999247 0.9263124 0.9690013 -0.9994057 0.939629 0.9666876 -0.9995308 0.9509177 0.9680197 -0.9996295 0.9603343 0.9711183 -0.9997074 0.9680946 0.974882 -0.9997688 0.9744313 0.9786968 -0.9998174 0.9795689 0.9822464 -0.9998557 0.9837116 0.9853905 -0.999886 0.9870376 0.9880897 -0.9999099 0.9896992 0.990358 -0.9999288 0.9918234 0.9922358 -0.9999437 0.9935154 0.9937734 -0.8750477 0.8988983 0.9987905 -0.8750466 0.8988963 0.9987905 -0.8750451 0.8988938 0.9987904 -0.8750434 0.8988907 0.9987904 -0.8750412 0.8988868 0.9987904 -0.8750386 0.8988819 0.9987904 -0.8750355 0.8988759 0.9987903 -0.8750317 0.8988684 0.9987903 -0.8750274 0.8988593 0.9987902 -0.8750225 0.8988483 0.9987902 -0.8750173 0.8988352 0.9987901 -0.8750124 0.8988199 0.99879 -0.8750088 0.8988027 0.9987899 -0.8750084 0.8987842 0.9987897 -0.8750145 0.8987663 0.9987896 -0.8750329 0.8987521 0.9987895 -0.8750727 0.8987476 0.9987895 -0.8751301 0.8987476 0.9987895 -0.8752028 0.8987476 0.9987895 -0.8752947 0.8987476 0.9987895 -0.8754109 0.8987476 0.9987895 -0.875558 0.8987476 0.9987895 -0.8757441 0.8987476 0.9987895 -0.8759795 0.8987476 0.9987895 -0.8762773 0.8987476 0.9987895 -0.8766541 0.8987476 0.9987895 -0.8771307 0.8987476 0.9987895 -0.8777338 0.8987476 0.9987895 -0.8784967 0.8987476 0.9987895 -0.8794619 0.8987476 0.9987895 -0.880683 0.8987476 0.9987895 -0.8822279 0.8987476 0.9987895 -0.8841823 0.8987476 0.9987895 -0.886655 0.8987476 0.9987895 -0.8897832 0.8987476 0.9987895 -0.8937407 0.8987476 0.9987895 -0.8987476 0.8987476 0.9987895 -0.9050819 0.8987476 0.9987895 -0.9130957 0.8987476 0.9987895 -0.9232341 0.8987476 0.9987895 -0.9360606 0.8987476 0.9987895 -0.9522877 0.8987476 0.9987895 -0.9728171 0.8987476 0.9987895 -0.9987895 0.8987476 0.9987895 -0.9990455 0.9141422 0.9780539 -0.999247 0.928347 0.9690013 -0.9994057 0.9409186 0.9666876 -0.9995308 0.9517328 0.9680197 -0.9996295 0.9608482 0.9711183 -0.9997074 0.9684181 0.974882 -0.9997688 0.9746346 0.9786968 -0.9998174 0.9796966 0.9822464 -0.9998557 0.9837916 0.9853905 -0.999886 0.9870878 0.9880897 -0.9999099 0.9897306 0.990358 -0.9999288 0.9918431 0.9922358 -0.9999437 0.9935277 0.9937734 -0.8750477 0.9052232 0.9987905 -0.8750466 0.9052213 0.9987905 -0.8750451 0.905219 0.9987904 -0.8750434 0.905216 0.9987904 -0.8750412 0.9052124 0.9987904 -0.8750386 0.9052078 0.9987904 -0.8750355 0.9052021 0.9987903 -0.8750317 0.9051951 0.9987903 -0.8750274 0.9051866 0.9987902 -0.8750225 0.9051763 0.9987902 -0.8750173 0.905164 0.9987901 -0.8750124 0.9051497 0.99879 -0.8750088 0.9051336 0.9987899 -0.8750084 0.9051163 0.9987897 -0.8750145 0.9050994 0.9987896 -0.8750329 0.9050862 0.9987895 -0.8750727 0.9050819 0.9987895 -0.8751301 0.9050819 0.9987895 -0.8752028 0.9050819 0.9987895 -0.8752947 0.9050819 0.9987895 -0.8754109 0.9050819 0.9987895 -0.875558 0.9050819 0.9987895 -0.8757441 0.9050819 0.9987895 -0.8759795 0.9050819 0.9987895 -0.8762773 0.9050819 0.9987895 -0.8766541 0.9050819 0.9987895 -0.8771307 0.9050819 0.9987895 -0.8777338 0.9050819 0.9987895 -0.8784967 0.9050819 0.9987895 -0.8794619 0.9050819 0.9987895 -0.880683 0.9050819 0.9987895 -0.8822279 0.9050819 0.9987895 -0.8841823 0.9050819 0.9987895 -0.886655 0.9050819 0.9987895 -0.8897832 0.9050819 0.9987895 -0.8937407 0.9050819 0.9987895 -0.8987476 0.9050819 0.9987895 -0.9050819 0.9050819 0.9987895 -0.9130957 0.9050819 0.9987895 -0.9232341 0.9050819 0.9987895 -0.9360606 0.9050819 0.9987895 -0.9522877 0.9050819 0.9987895 -0.9728171 0.9050819 0.9987895 -0.9987895 0.9050819 0.9987895 -0.9990455 0.9181889 0.9780539 -0.999247 0.9309211 0.9690013 -0.9994057 0.9425502 0.9666876 -0.9995308 0.952764 0.9680197 -0.9996295 0.9614985 0.9711183 -0.9997074 0.9688274 0.974882 -0.9997688 0.9748918 0.9786968 -0.9998174 0.979858 0.9822464 -0.9998557 0.9838928 0.9853905 -0.999886 0.9871512 0.9880897 -0.9999099 0.9897703 0.990358 -0.9999288 0.991868 0.9922358 -0.9999437 0.9935432 0.9937734 -0.8750477 0.9132249 0.9987905 -0.8750466 0.9132232 0.9987905 -0.8750451 0.9132211 0.9987904 -0.8750434 0.9132184 0.9987904 -0.8750412 0.913215 0.9987904 -0.8750386 0.9132109 0.9987904 -0.8750355 0.9132057 0.9987903 -0.8750317 0.9131993 0.9987903 -0.8750274 0.9131915 0.9987902 -0.8750225 0.913182 0.9987902 -0.8750173 0.9131708 0.9987901 -0.8750124 0.9131577 0.99879 -0.8750088 0.9131429 0.9987899 -0.8750084 0.9131271 0.9987897 -0.8750145 0.9131117 0.9987896 -0.8750329 0.9130996 0.9987895 -0.8750727 0.9130957 0.9987895 -0.8751301 0.9130957 0.9987895 -0.8752028 0.9130957 0.9987895 -0.8752947 0.9130957 0.9987895 -0.8754109 0.9130957 0.9987895 -0.875558 0.9130957 0.9987895 -0.8757441 0.9130957 0.9987895 -0.8759795 0.9130957 0.9987895 -0.8762773 0.9130957 0.9987895 -0.8766541 0.9130957 0.9987895 -0.8771307 0.9130957 0.9987895 -0.8777338 0.9130957 0.9987895 -0.8784967 0.9130957 0.9987895 -0.8794619 0.9130957 0.9987895 -0.880683 0.9130957 0.9987895 -0.8822279 0.9130957 0.9987895 -0.8841823 0.9130957 0.9987895 -0.886655 0.9130957 0.9987895 -0.8897832 0.9130957 0.9987895 -0.8937407 0.9130957 0.9987895 -0.8987476 0.9130957 0.9987895 -0.9050819 0.9130957 0.9987895 -0.9130957 0.9130957 0.9987895 -0.9232341 0.9130957 0.9987895 -0.9360606 0.9130957 0.9987895 -0.9522877 0.9130957 0.9987895 -0.9728171 0.9130957 0.9987895 -0.9987895 0.9130957 0.9987895 -0.9990455 0.9233085 0.9780539 -0.999247 0.9341777 0.9690013 -0.9994057 0.9446144 0.9666876 -0.9995308 0.9540687 0.9680197 -0.9996295 0.9623212 0.9711183 -0.9997074 0.9693452 0.974882 -0.9997688 0.9752172 0.9786968 -0.9998174 0.9800622 0.9822464 -0.9998557 0.9840209 0.9853905 -0.999886 0.9872315 0.9880897 -0.9999099 0.9898206 0.990358 -0.9999288 0.9918994 0.9922358 -0.9999437 0.9935629 0.9937734 -0.8750477 0.9233482 0.9987905 -0.8750466 0.9233467 0.9987905 -0.8750451 0.9233448 0.9987904 -0.8750434 0.9233424 0.9987904 -0.8750412 0.9233395 0.9987904 -0.8750386 0.9233358 0.9987904 -0.8750355 0.9233312 0.9987903 -0.8750317 0.9233256 0.9987903 -0.8750274 0.9233187 0.9987902 -0.8750225 0.9233103 0.9987902 -0.8750173 0.9233004 0.9987901 -0.8750124 0.9232889 0.99879 -0.8750088 0.9232758 0.9987899 -0.8750084 0.9232619 0.9987897 -0.8750145 0.9232483 0.9987896 -0.8750329 0.9232376 0.9987895 -0.8750727 0.9232341 0.9987895 -0.8751301 0.9232341 0.9987895 -0.8752028 0.9232341 0.9987895 -0.8752947 0.9232341 0.9987895 -0.8754109 0.9232341 0.9987895 -0.875558 0.9232341 0.9987895 -0.8757441 0.9232341 0.9987895 -0.8759795 0.9232341 0.9987895 -0.8762773 0.9232341 0.9987895 -0.8766541 0.9232341 0.9987895 -0.8771307 0.9232341 0.9987895 -0.8777338 0.9232341 0.9987895 -0.8784967 0.9232341 0.9987895 -0.8794619 0.9232341 0.9987895 -0.880683 0.9232341 0.9987895 -0.8822279 0.9232341 0.9987895 -0.8841823 0.9232341 0.9987895 -0.886655 0.9232341 0.9987895 -0.8897832 0.9232341 0.9987895 -0.8937407 0.9232341 0.9987895 -0.8987476 0.9232341 0.9987895 -0.9050819 0.9232341 0.9987895 -0.9130957 0.9232341 0.9987895 -0.9232341 0.9232341 0.9987895 -0.9360606 0.9232341 0.9987895 -0.9522877 0.9232341 0.9987895 -0.9728171 0.9232341 0.9987895 -0.9987895 0.9232341 0.9987895 -0.9990455 0.9297854 0.9780539 -0.999247 0.9382977 0.9690013 -0.9994057 0.9472259 0.9666876 -0.9995308 0.9557192 0.9680197 -0.9996295 0.963362 0.9711183 -0.9997074 0.9700002 0.974882 -0.9997688 0.9756289 0.9786968 -0.9998174 0.9803206 0.9822464 -0.9998557 0.9841829 0.9853905 -0.999886 0.987333 0.9880897 -0.9999099 0.9898842 0.990358 -0.9999288 0.9919392 0.9922358 -0.9999437 0.9935878 0.9937734 -0.8750477 0.9361554 0.9987905 -0.8750466 0.9361542 0.9987905 -0.8750451 0.9361526 0.9987904 -0.8750434 0.9361506 0.9987904 -0.8750412 0.9361482 0.9987904 -0.8750386 0.9361451 0.9987904 -0.8750355 0.9361413 0.9987903 -0.8750317 0.9361366 0.9987903 -0.8750274 0.9361309 0.9987902 -0.8750225 0.936124 0.9987902 -0.8750173 0.9361157 0.9987901 -0.8750124 0.9361061 0.99879 -0.8750088 0.9360952 0.9987899 -0.8750084 0.9360836 0.9987897 -0.8750145 0.9360723 0.9987896 -0.8750329 0.9360634 0.9987895 -0.8750727 0.9360606 0.9987895 -0.8751301 0.9360606 0.9987895 -0.8752028 0.9360606 0.9987895 -0.8752947 0.9360606 0.9987895 -0.8754109 0.9360606 0.9987895 -0.875558 0.9360606 0.9987895 -0.8757441 0.9360606 0.9987895 -0.8759795 0.9360606 0.9987895 -0.8762773 0.9360606 0.9987895 -0.8766541 0.9360606 0.9987895 -0.8771307 0.9360606 0.9987895 -0.8777338 0.9360606 0.9987895 -0.8784967 0.9360606 0.9987895 -0.8794619 0.9360606 0.9987895 -0.880683 0.9360606 0.9987895 -0.8822279 0.9360606 0.9987895 -0.8841823 0.9360606 0.9987895 -0.886655 0.9360606 0.9987895 -0.8897832 0.9360606 0.9987895 -0.8937407 0.9360606 0.9987895 -0.8987476 0.9360606 0.9987895 -0.9050819 0.9360606 0.9987895 -0.9130957 0.9360606 0.9987895 -0.9232341 0.9360606 0.9987895 -0.9360606 0.9360606 0.9987895 -0.9522877 0.9360606 0.9987895 -0.9728171 0.9360606 0.9987895 -0.9987895 0.9360606 0.9987895 -0.9990455 0.9379796 0.9780539 -0.999247 0.94351 0.9690013 -0.9994057 0.9505298 0.9666876 -0.9995308 0.9578074 0.9680197 -0.9996295 0.9646787 0.9711183 -0.9997074 0.970829 0.974882 -0.9997688 0.9761497 0.9786968 -0.9998174 0.9806476 0.9822464 -0.9998557 0.984388 0.9853905 -0.999886 0.9874615 0.9880897 -0.9999099 0.9899646 0.990358 -0.9999288 0.9919896 0.9922358 -0.9999437 0.9936193 0.9937734 -0.8750477 0.9523583 0.9987905 -0.8750466 0.9523573 0.9987905 -0.8750451 0.9523562 0.9987904 -0.8750434 0.9523547 0.9987904 -0.8750412 0.9523529 0.9987904 -0.8750386 0.9523506 0.9987904 -0.8750355 0.9523478 0.9987903 -0.8750317 0.9523443 0.9987903 -0.8750274 0.95234 0.9987902 -0.8750225 0.9523349 0.9987902 -0.8750173 0.9523287 0.9987901 -0.8750124 0.9523216 0.99879 -0.8750088 0.9523135 0.9987899 -0.8750084 0.9523049 0.9987897 -0.8750145 0.9522964 0.9987896 -0.8750329 0.9522898 0.9987895 -0.8750727 0.9522877 0.9987895 -0.8751301 0.9522877 0.9987895 -0.8752028 0.9522877 0.9987895 -0.8752947 0.9522877 0.9987895 -0.8754109 0.9522877 0.9987895 -0.875558 0.9522877 0.9987895 -0.8757441 0.9522877 0.9987895 -0.8759795 0.9522877 0.9987895 -0.8762773 0.9522877 0.9987895 -0.8766541 0.9522877 0.9987895 -0.8771307 0.9522877 0.9987895 -0.8777338 0.9522877 0.9987895 -0.8784967 0.9522877 0.9987895 -0.8794619 0.9522877 0.9987895 -0.880683 0.9522877 0.9987895 -0.8822279 0.9522877 0.9987895 -0.8841823 0.9522877 0.9987895 -0.886655 0.9522877 0.9987895 -0.8897832 0.9522877 0.9987895 -0.8937407 0.9522877 0.9987895 -0.8987476 0.9522877 0.9987895 -0.9050819 0.9522877 0.9987895 -0.9130957 0.9522877 0.9987895 -0.9232341 0.9522877 0.9987895 -0.9360606 0.9522877 0.9987895 -0.9522877 0.9522877 0.9987895 -0.9728171 0.9522877 0.9987895 -0.9987895 0.9522877 0.9987895 -0.9990455 0.9483463 0.9780539 -0.999247 0.9501042 0.9690013 -0.9994057 0.9547096 0.9666876 -0.9995308 0.9604492 0.9680197 -0.9996295 0.9663445 0.9711183 -0.9997074 0.9718774 0.974882 -0.9997688 0.9768086 0.9786968 -0.9998174 0.9810611 0.9822464 -0.9998557 0.9846473 0.9853905 -0.999886 0.987624 0.9880897 -0.9999099 0.9900664 0.990358 -0.9999288 0.9920533 0.9922358 -0.9999437 0.9936592 0.9937734 -0.8750477 0.972857 0.9987905 -0.8750466 0.9728564 0.9987905 -0.8750451 0.9728558 0.9987904 -0.8750434 0.972855 0.9987904 -0.8750412 0.9728539 0.9987904 -0.8750386 0.9728526 0.9987904 -0.8750355 0.972851 0.9987903 -0.8750317 0.9728491 0.9987903 -0.8750274 0.9728467 0.9987902 -0.8750225 0.9728437 0.9987902 -0.8750173 0.9728403 0.9987901 -0.8750124 0.9728362 0.99879 -0.8750088 0.9728317 0.9987899 -0.8750084 0.9728268 0.9987897 -0.8750145 0.9728221 0.9987896 -0.8750329 0.9728183 0.9987895 -0.8750727 0.9728171 0.9987895 -0.8751301 0.9728171 0.9987895 -0.8752028 0.9728171 0.9987895 -0.8752947 0.9728171 0.9987895 -0.8754109 0.9728171 0.9987895 -0.875558 0.9728171 0.9987895 -0.8757441 0.9728171 0.9987895 -0.8759795 0.9728171 0.9987895 -0.8762773 0.9728171 0.9987895 -0.8766541 0.9728171 0.9987895 -0.8771307 0.9728171 0.9987895 -0.8777338 0.9728171 0.9987895 -0.8784967 0.9728171 0.9987895 -0.8794619 0.9728171 0.9987895 -0.880683 0.9728171 0.9987895 -0.8822279 0.9728171 0.9987895 -0.8841823 0.9728171 0.9987895 -0.886655 0.9728171 0.9987895 -0.8897832 0.9728171 0.9987895 -0.8937407 0.9728171 0.9987895 -0.8987476 0.9728171 0.9987895 -0.9050819 0.9728171 0.9987895 -0.9130957 0.9728171 0.9987895 -0.9232341 0.9728171 0.9987895 -0.9360606 0.9728171 0.9987895 -0.9522877 0.9728171 0.9987895 -0.9728171 0.9728171 0.9987895 -0.9987895 0.9728171 0.9987895 -0.9990455 0.9614615 0.9780539 -0.999247 0.9584468 0.9690013 -0.9994057 0.9599976 0.9666876 -0.9995308 0.9637914 0.9680197 -0.9996295 0.968452 0.9711183 -0.9997074 0.9732039 0.974882 -0.9997688 0.9776422 0.9786968 -0.9998174 0.9815844 0.9822464 -0.9998557 0.9849754 0.9853905 -0.999886 0.9878296 0.9880897 -0.9999099 0.9901951 0.990358 -0.9999288 0.9921339 0.9922358 -0.9999437 0.9937096 0.9937734 -0.8750477 0.9987905 0.9987905 -0.8750466 0.9987905 0.9987905 -0.8750451 0.9987904 0.9987904 -0.8750434 0.9987904 0.9987904 -0.8750412 0.9987904 0.9987904 -0.8750386 0.9987904 0.9987904 -0.8750355 0.9987903 0.9987903 -0.8750317 0.9987903 0.9987903 -0.8750274 0.9987902 0.9987902 -0.8750225 0.9987902 0.9987902 -0.8750173 0.9987901 0.9987901 -0.8750124 0.99879 0.99879 -0.8750088 0.9987899 0.9987899 -0.8750084 0.9987897 0.9987897 -0.8750145 0.9987896 0.9987896 -0.8750329 0.9987895 0.9987895 -0.8750727 0.9987895 0.9987895 -0.8751301 0.9987895 0.9987895 -0.8752028 0.9987895 0.9987895 -0.8752947 0.9987895 0.9987895 -0.8754109 0.9987895 0.9987895 -0.875558 0.9987895 0.9987895 -0.8757441 0.9987895 0.9987895 -0.8759795 0.9987895 0.9987895 -0.8762773 0.9987895 0.9987895 -0.8766541 0.9987895 0.9987895 -0.8771307 0.9987895 0.9987895 -0.8777338 0.9987895 0.9987895 -0.8784967 0.9987895 0.9987895 -0.8794619 0.9987895 0.9987895 -0.880683 0.9987895 0.9987895 -0.8822279 0.9987895 0.9987895 -0.8841823 0.9987895 0.9987895 -0.886655 0.9987895 0.9987895 -0.8897832 0.9987895 0.9987895 -0.8937407 0.9987895 0.9987895 -0.8987476 0.9987895 0.9987895 -0.9050819 0.9987895 0.9987895 -0.9130957 0.9987895 0.9987895 -0.9232341 0.9987895 0.9987895 -0.9360606 0.9987895 0.9987895 -0.9522877 0.9987895 0.9987895 -0.9728171 0.9987895 0.9987895 -0.9987895 0.9987895 0.9987895 -0.9990455 0.9780539 0.9780539 -0.999247 0.9690013 0.9690013 -0.9994057 0.9666876 0.9666876 -0.9995308 0.9680197 0.9680197 -0.9996295 0.9711183 0.9711183 -0.9997074 0.974882 0.974882 -0.9997688 0.9786968 0.9786968 -0.9998174 0.9822464 0.9822464 -0.9998557 0.9853905 0.9853905 -0.999886 0.9880897 0.9880897 -0.9999099 0.990358 0.990358 -0.9999288 0.9922358 0.9922358 -0.9999437 0.9937734 0.9937734 -0.8990028 0.9990461 0.9780796 -0.899002 0.9990461 0.9780793 -0.8990011 0.9990461 0.9780789 -0.899 0.9990461 0.9780783 -0.8989986 0.9990461 0.9780777 -0.8989969 0.9990461 0.9780768 -0.8989948 0.9990461 0.9780758 -0.8989923 0.999046 0.9780745 -0.8989895 0.999046 0.978073 -0.8989863 0.9990459 0.9780711 -0.8989829 0.9990459 0.9780689 -0.8989796 0.9990458 0.9780663 -0.8989771 0.9990458 0.9780633 -0.8989767 0.9990457 0.9780602 -0.8989805 0.9990456 0.9780571 -0.8989921 0.9990456 0.9780547 -0.8990175 0.9990455 0.9780539 -0.8990542 0.9990455 0.9780539 -0.8991006 0.9990455 0.9780539 -0.8991593 0.9990455 0.9780539 -0.8992336 0.9990455 0.9780539 -0.8993275 0.9990455 0.9780539 -0.8994464 0.9990455 0.9780539 -0.8995968 0.9990455 0.9780539 -0.899787 0.9990455 0.9780539 -0.9000277 0.9990455 0.9780539 -0.9003323 0.9990455 0.9780539 -0.9007175 0.9990455 0.9780539 -0.9012049 0.9990455 0.9780539 -0.9018215 0.9990455 0.9780539 -0.9026016 0.9990455 0.9780539 -0.9035886 0.9990455 0.9780539 -0.9048372 0.9990455 0.9780539 -0.9064168 0.9990455 0.9780539 -0.9084153 0.9990455 0.9780539 -0.9109436 0.9990455 0.9780539 -0.9141422 0.9990455 0.9780539 -0.9181889 0.9990455 0.9780539 -0.9233085 0.9990455 0.9780539 -0.9297854 0.9990455 0.9780539 -0.9379796 0.9990455 0.9780539 -0.9483463 0.9990455 0.9780539 -0.9614615 0.9990455 0.9780539 -0.9780539 0.9990455 0.9780539 -0.9990455 0.9990455 0.9780539 -0.999247 0.982354 0.9690013 -0.9994057 0.9751513 0.9666876 -0.9995308 0.9733691 0.9680197 -0.9996295 0.9744915 0.9711183 -0.9997074 0.977005 0.974882 -0.9997688 0.980031 0.9786968 -0.9998174 0.9830838 0.9822464 -0.9998557 0.9859157 0.9853905 -0.999886 0.9884188 0.9880897 -0.9999099 0.9905641 0.990358 -0.9999288 0.9923648 0.9922358 -0.9999437 0.9938541 0.9937734 -0.9187175 0.9992474 0.9690305 -0.918717 0.9992474 0.9690301 -0.9187164 0.9992474 0.9690296 -0.9187157 0.9992474 0.969029 -0.9187148 0.9992474 0.9690283 -0.9187137 0.9992474 0.9690273 -0.9187123 0.9992473 0.9690261 -0.9187107 0.9992473 0.9690247 -0.9187089 0.9992473 0.9690229 -0.9187068 0.9992473 0.9690208 -0.9187045 0.9992472 0.9690183 -0.9187024 0.9992472 0.9690153 -0.9187008 0.9992472 0.969012 -0.9187004 0.9992471 0.9690084 -0.9187027 0.9992471 0.9690049 -0.9187101 0.999247 0.9690022 -0.9187262 0.999247 0.9690013 -0.9187495 0.999247 0.9690013 -0.9187791 0.999247 0.9690013 -0.9188164 0.999247 0.9690013 -0.9188636 0.999247 0.9690013 -0.9189234 0.999247 0.9690013 -0.918999 0.999247 0.9690013 -0.9190947 0.999247 0.9690013 -0.9192157 0.999247 0.9690013 -0.9193688 0.999247 0.9690013 -0.9195625 0.999247 0.9690013 -0.9198076 0.999247 0.9690013 -0.9201176 0.999247 0.9690013 -0.9205098 0.999247 0.9690013 -0.9210061 0.999247 0.9690013 -0.9216339 0.999247 0.9690013 -0.9224281 0.999247 0.9690013 -0.9234329 0.999247 0.9690013 -0.9247041 0.999247 0.9690013 -0.9263124 0.999247 0.9690013 -0.928347 0.999247 0.9690013 -0.9309211 0.999247 0.9690013 -0.9341777 0.999247 0.9690013 -0.9382977 0.999247 0.9690013 -0.94351 0.999247 0.9690013 -0.9501042 0.999247 0.9690013 -0.9584468 0.999247 0.9690013 -0.9690013 0.999247 0.9690013 -0.982354 0.999247 0.9690013 -0.999247 0.999247 0.9690013 -0.9994057 0.9858591 0.9666876 -0.9995308 0.9801368 0.9680197 -0.9996295 0.978759 0.9711183 -0.9997074 0.9796909 0.974882 -0.9997688 0.981719 0.9786968 -0.9998174 0.9841433 0.9822464 -0.9998557 0.9865801 0.9853905 -0.999886 0.9888351 0.9880897 -0.9999099 0.9908248 0.990358 -0.9999288 0.992528 0.9922358 -0.9999437 0.9939562 0.9937734 -0.9348153 0.999406 0.9667127 -0.9348149 0.999406 0.9667124 -0.9348146 0.999406 0.9667119 -0.9348141 0.999406 0.9667114 -0.9348135 0.999406 0.9667108 -0.9348128 0.9994059 0.96671 -0.9348119 0.9994059 0.9667089 -0.9348109 0.9994059 0.9667077 -0.9348097 0.9994059 0.9667062 -0.9348083 0.9994059 0.9667044 -0.9348069 0.9994059 0.9667022 -0.9348055 0.9994059 0.9666996 -0.9348044 0.9994058 0.9666968 -0.9348042 0.9994058 0.9666937 -0.9348056 0.9994058 0.9666907 -0.9348102 0.9994057 0.9666884 -0.9348204 0.9994057 0.9666876 -0.9348352 0.9994057 0.9666876 -0.9348539 0.9994057 0.9666876 -0.9348776 0.9994057 0.9666876 -0.9349075 0.9994057 0.9666876 -0.9349454 0.9994057 0.9666876 -0.9349933 0.9994057 0.9666876 -0.935054 0.9994057 0.9666876 -0.9351307 0.9994057 0.9666876 -0.9352277 0.9994057 0.9666876 -0.9353505 0.9994057 0.9666876 -0.9355059 0.9994057 0.9666876 -0.9357024 0.9994057 0.9666876 -0.935951 0.9994057 0.9666876 -0.9362655 0.9994057 0.9666876 -0.9366635 0.9994057 0.9666876 -0.9371669 0.9994057 0.9666876 -0.9378038 0.9994057 0.9666876 -0.9386096 0.9994057 0.9666876 -0.939629 0.9994057 0.9666876 -0.9409186 0.9994057 0.9666876 -0.9425502 0.9994057 0.9666876 -0.9446144 0.9994057 0.9666876 -0.9472259 0.9994057 0.9666876 -0.9505298 0.9994057 0.9666876 -0.9547096 0.9994057 0.9666876 -0.9599976 0.9994057 0.9666876 -0.9666876 0.9994057 0.9666876 -0.9751513 0.9994057 0.9666876 -0.9858591 0.9994057 0.9666876 -0.9994057 0.9994057 0.9666876 -0.9995308 0.9886988 0.9680197 -0.9996295 0.9841579 0.9711183 -0.9997074 0.983089 0.974882 -0.9997688 0.9838545 0.9786968 -0.9998174 0.9854838 0.9822464 -0.9998557 0.9874207 0.9853905 -0.999886 0.9893618 0.9880897 -0.9999099 0.9911547 0.990358 -0.9999288 0.9927345 0.9922358 -0.9999437 0.9940854 0.9937734 -0.9478754 0.999531 0.9680389 -0.9478752 0.999531 0.9680386 -0.947875 0.999531 0.9680383 -0.9478746 0.999531 0.9680379 -0.9478743 0.999531 0.9680374 -0.9478738 0.999531 0.9680368 -0.9478733 0.999531 0.968036 -0.9478726 0.999531 0.9680351 -0.9478718 0.999531 0.9680339 -0.947871 0.9995309 0.9680325 -0.94787 0.9995309 0.9680309 -0.9478691 0.9995309 0.9680289 -0.9478684 0.9995309 0.9680267 -0.9478683 0.9995309 0.9680244 -0.9478691 0.9995309 0.9680221 -0.947872 0.9995309 0.9680203 -0.9478785 0.9995308 0.9680197 -0.9478878 0.9995308 0.9680197 -0.9478997 0.9995308 0.9680197 -0.9479146 0.9995308 0.9680197 -0.9479335 0.9995308 0.9680197 -0.9479575 0.9995308 0.9680197 -0.9479878 0.9995308 0.9680197 -0.9480261 0.9995308 0.9680197 -0.9480746 0.9995308 0.9680197 -0.9481359 0.9995308 0.9680197 -0.9482135 0.9995308 0.9680197 -0.9483117 0.9995308 0.9680197 -0.9484359 0.9995308 0.9680197 -0.9485931 0.9995308 0.9680197 -0.9487918 0.9995308 0.9680197 -0.9490434 0.9995308 0.9680197 -0.9493615 0.9995308 0.9680197 -0.9497641 0.9995308 0.9680197 -0.9502734 0.9995308 0.9680197 -0.9509177 0.9995308 0.9680197 -0.9517328 0.9995308 0.9680197 -0.952764 0.9995308 0.9680197 -0.9540687 0.9995308 0.9680197 -0.9557192 0.9995308 0.9680197 -0.9578074 0.9995308 0.9680197 -0.9604492 0.9995308 0.9680197 -0.9637914 0.9995308 0.9680197 -0.9680197 0.9995308 0.9680197 -0.9733691 0.9995308 0.9680197 -0.9801368 0.9995308 0.9680197 -0.9886988 0.9995308 0.9680197 -0.9995308 0.9995308 0.9680197 -0.9996295 0.9909882 0.9711183 -0.9997074 0.9873879 0.974882 -0.9997688 0.9865561 0.9786968 -0.9998174 0.9871796 0.9822464 -0.9998557 0.9884841 0.9853905 -0.999886 0.9900282 0.9880897 -0.9999099 0.991572 0.990358 -0.9999288 0.9929957 0.9922358 -0.9999437 0.9942488 0.9937734 -0.958416 0.9996296 0.971132 -0.9584159 0.9996296 0.9711319 -0.9584157 0.9996296 0.9711316 -0.9584155 0.9996296 0.9711314 -0.9584153 0.9996296 0.971131 -0.958415 0.9996296 0.9711305 -0.9584146 0.9996296 0.97113 -0.9584142 0.9996296 0.9711293 -0.9584137 0.9996296 0.9711285 -0.9584132 0.9996296 0.9711275 -0.9584126 0.9996296 0.9711263 -0.958412 0.9996296 0.9711249 -0.9584115 0.9996296 0.9711233 -0.9584114 0.9996295 0.9711216 -0.958412 0.9996295 0.97112 -0.9584138 0.9996295 0.9711187 -0.9584178 0.9996295 0.9711183 -0.9584237 0.9996295 0.9711183 -0.9584312 0.9996295 0.9711183 -0.9584406 0.9996295 0.9711183 -0.9584526 0.9996295 0.9711183 -0.9584677 0.9996295 0.9711183 -0.9584868 0.9996295 0.9711183 -0.9585109 0.9996295 0.9711183 -0.9585415 0.9996295 0.9711183 -0.9585802 0.9996295 0.9711183 -0.9586291 0.9996295 0.9711183 -0.958691 0.9996295 0.9711183 -0.9587693 0.9996295 0.9711183 -0.9588684 0.9996295 0.9711183 -0.9589938 0.9996295 0.9711183 -0.9591524 0.9996295 0.9711183 -0.959353 0.9996295 0.9711183 -0.9596068 0.9996295 0.9711183 -0.959928 0.9996295 0.9711183 -0.9603343 0.9996295 0.9711183 -0.9608482 0.9996295 0.9711183 -0.9614985 0.9996295 0.9711183 -0.9623212 0.9996295 0.9711183 -0.963362 0.9996295 0.9711183 -0.9646787 0.9996295 0.9711183 -0.9663445 0.9996295 0.9711183 -0.968452 0.9996295 0.9711183 -0.9711183 0.9996295 0.9711183 -0.9744915 0.9996295 0.9711183 -0.978759 0.9996295 0.9711183 -0.9841579 0.9996295 0.9711183 -0.9909882 0.9996295 0.9711183 -0.9996295 0.9996295 0.9711183 -0.9997074 0.9928267 0.974882 -0.9997688 0.9899741 0.9786968 -0.9998174 0.989325 0.9822464 -0.9998557 0.9898295 0.9853905 -0.999886 0.9908712 0.9880897 -0.9999099 0.9920999 0.990358 -0.9999288 0.9933261 0.9922358 -0.9999437 0.9944556 0.9937734 -0.9668873 0.9997074 0.9748915 -0.9668872 0.9997074 0.9748914 -0.9668871 0.9997074 0.9748912 -0.966887 0.9997074 0.974891 -0.9668869 0.9997074 0.9748908 -0.9668867 0.9997074 0.9748904 -0.9668865 0.9997074 0.9748901 -0.9668862 0.9997074 0.9748896 -0.9668859 0.9997074 0.974889 -0.9668855 0.9997074 0.9748883 -0.9668852 0.9997074 0.9748875 -0.9668848 0.9997074 0.9748865 -0.9668845 0.9997074 0.9748855 -0.9668844 0.9997074 0.9748843 -0.9668847 0.9997074 0.9748832 -0.9668859 0.9997074 0.9748823 -0.9668884 0.9997074 0.974882 -0.9668922 0.9997074 0.974882 -0.9668969 0.9997074 0.974882 -0.9669028 0.9997074 0.974882 -0.9669103 0.9997074 0.974882 -0.9669198 0.9997074 0.974882 -0.9669318 0.9997074 0.974882 -0.966947 0.9997074 0.974882 -0.9669663 0.9997074 0.974882 -0.9669906 0.9997074 0.974882 -0.9670214 0.9997074 0.974882 -0.9670604 0.9997074 0.974882 -0.9671097 0.9997074 0.974882 -0.967172 0.9997074 0.974882 -0.9672509 0.9997074 0.974882 -0.9673508 0.9997074 0.974882 -0.967477 0.9997074 0.974882 -0.9676368 0.9997074 0.974882 -0.9678389 0.9997074 0.974882 -0.9680946 0.9997074 0.974882 -0.9684181 0.9997074 0.974882 -0.9688274 0.9997074 0.974882 -0.9693452 0.9997074 0.974882 -0.9700002 0.9997074 0.974882 -0.970829 0.9997074 0.974882 -0.9718774 0.9997074 0.974882 -0.9732039 0.9997074 0.974882 -0.974882 0.9997074 0.974882 -0.977005 0.9997074 0.974882 -0.9796909 0.9997074 0.974882 -0.983089 0.9997074 0.974882 -0.9873879 0.9997074 0.974882 -0.9928267 0.9997074 0.974882 -0.9997074 0.9997074 0.974882 -0.9997688 0.9942982 0.9786968 -0.9998174 0.9920392 0.9822464 -0.9998557 0.9915316 0.9853905 -0.999886 0.9919377 0.9880897 -0.9999099 0.9927678 0.990358 -0.9999288 0.9937442 0.9922358 -0.9999437 0.9947172 0.9937734 -0.9736726 0.9997689 0.9787032 -0.9736726 0.9997689 0.9787031 -0.9736725 0.9997689 0.978703 -0.9736724 0.9997689 0.9787029 -0.9736723 0.9997689 0.9787027 -0.9736722 0.9997689 0.9787025 -0.9736721 0.9997689 0.9787022 -0.9736719 0.9997689 0.9787019 -0.9736717 0.9997689 0.9787015 -0.9736715 0.9997689 0.9787011 -0.9736712 0.9997689 0.9787005 -0.973671 0.9997689 0.9786999 -0.9736708 0.9997689 0.9786991 -0.9736708 0.9997689 0.9786984 -0.973671 0.9997688 0.9786976 -0.9736717 0.9997688 0.978697 -0.9736733 0.9997688 0.9786968 -0.9736756 0.9997688 0.9786968 -0.9736786 0.9997688 0.9786968 -0.9736823 0.9997688 0.9786968 -0.973687 0.9997688 0.9786968 -0.973693 0.9997688 0.9786968 -0.9737006 0.9997688 0.9786968 -0.9737101 0.9997688 0.9786968 -0.9737222 0.9997688 0.9786968 -0.9737375 0.9997688 0.9786968 -0.9737569 0.9997688 0.9786968 -0.9737814 0.9997688 0.9786968 -0.9738123 0.9997688 0.9786968 -0.9738515 0.9997688 0.9786968 -0.9739011 0.9997688 0.9786968 -0.9739638 0.9997688 0.9786968 -0.9740432 0.9997688 0.9786968 -0.9741436 0.9997688 0.9786968 -0.9742706 0.9997688 0.9786968 -0.9744313 0.9997688 0.9786968 -0.9746346 0.9997688 0.9786968 -0.9748918 0.9997688 0.9786968 -0.9752172 0.9997688 0.9786968 -0.9756289 0.9997688 0.9786968 -0.9761497 0.9997688 0.9786968 -0.9768086 0.9997688 0.9786968 -0.9776422 0.9997688 0.9786968 -0.9786968 0.9997688 0.9786968 -0.980031 0.9997688 0.9786968 -0.981719 0.9997688 0.9786968 -0.9838545 0.9997688 0.9786968 -0.9865561 0.9997688 0.9786968 -0.9899741 0.9997688 0.9786968 -0.9942982 0.9997688 0.9786968 -0.9997688 0.9997688 0.9786968 -0.9998174 0.9954731 0.9822464 -0.9998557 0.9936849 0.9853905 -0.999886 0.993287 0.9880897 -0.9999099 0.9936128 0.990358 -0.9999288 0.9942731 0.9922358 -0.9999437 0.9950481 0.9937734 -0.9790927 0.9998174 0.9822506 -0.9790927 0.9998174 0.9822505 -0.9790927 0.9998174 0.9822504 -0.9790926 0.9998174 0.9822504 -0.9790925 0.9998174 0.9822502 -0.9790925 0.9998174 0.9822501 -0.9790924 0.9998174 0.9822499 -0.9790923 0.9998174 0.9822497 -0.9790921 0.9998174 0.9822495 -0.979092 0.9998174 0.9822492 -0.9790919 0.9998174 0.9822488 -0.9790917 0.9998174 0.9822484 -0.9790916 0.9998174 0.9822479 -0.9790916 0.9998174 0.9822474 -0.9790917 0.9998174 0.9822469 -0.9790921 0.9998174 0.9822465 -0.9790931 0.9998174 0.9822464 -0.9790946 0.9998174 0.9822464 -0.9790965 0.9998174 0.9822464 -0.9790988 0.9998174 0.9822464 -0.9791018 0.9998174 0.9822464 -0.9791055 0.9998174 0.9822464 -0.9791103 0.9998174 0.9822464 -0.9791163 0.9998174 0.9822464 -0.9791238 0.9998174 0.9822464 -0.9791334 0.9998174 0.9822464 -0.9791456 0.9998174 0.9822464 -0.979161 0.9998174 0.9822464 -0.9791804 0.9998174 0.9822464 -0.979205 0.9998174 0.9822464 -0.9792361 0.9998174 0.9822464 -0.9792755 0.9998174 0.9822464 -0.9793253 0.9998174 0.9822464 -0.9793883 0.9998174 0.9822464 -0.9794681 0.9998174 0.9822464 -0.9795689 0.9998174 0.9822464 -0.9796966 0.9998174 0.9822464 -0.979858 0.9998174 0.9822464 -0.9800622 0.9998174 0.9822464 -0.9803206 0.9998174 0.9822464 -0.9806476 0.9998174 0.9822464 -0.9810611 0.9998174 0.9822464 -0.9815844 0.9998174 0.9822464 -0.9822464 0.9998174 0.9822464 -0.9830838 0.9998174 0.9822464 -0.9841433 0.9998174 0.9822464 -0.9854838 0.9998174 0.9822464 -0.9871796 0.9998174 0.9822464 -0.989325 0.9998174 0.9822464 -0.9920392 0.9998174 0.9822464 -0.9954731 0.9998174 0.9822464 -0.9998174 0.9998174 0.9822464 -0.9998557 0.9964092 0.9853905 -0.999886 0.9949941 0.9880897 -0.9999099 0.9946818 0.990358 -0.9999288 0.9949422 0.9922358 -0.9999437 0.9954668 0.9937734 -0.9834129 0.9998557 0.9853933 -0.9834129 0.9998557 0.9853933 -0.9834129 0.9998557 0.9853932 -0.9834129 0.9998557 0.9853932 -0.9834128 0.9998557 0.9853931 -0.9834128 0.9998557 0.985393 -0.9834127 0.9998557 0.9853929 -0.9834127 0.9998557 0.9853927 -0.9834126 0.9998557 0.9853926 -0.9834125 0.9998557 0.9853924 -0.9834124 0.9998557 0.9853921 -0.9834123 0.9998557 0.9853919 -0.9834122 0.9998557 0.9853915 -0.9834122 0.9998557 0.9853912 -0.9834123 0.9998557 0.9853909 -0.9834126 0.9998557 0.9853906 -0.9834132 0.9998557 0.9853905 -0.9834141 0.9998557 0.9853905 -0.9834153 0.9998557 0.9853905 -0.9834167 0.9998557 0.9853905 -0.9834186 0.9998557 0.9853905 -0.9834209 0.9998557 0.9853905 -0.9834239 0.9998557 0.9853905 -0.9834277 0.9998557 0.9853905 -0.9834324 0.9998557 0.9853905 -0.9834385 0.9998557 0.9853905 -0.9834461 0.9998557 0.9853905 -0.9834557 0.9998557 0.9853905 -0.9834679 0.9998557 0.9853905 -0.9834833 0.9998557 0.9853905 -0.9835029 0.9998557 0.9853905 -0.9835276 0.9998557 0.9853905 -0.9835588 0.9998557 0.9853905 -0.9835983 0.9998557 0.9853905 -0.9836483 0.9998557 0.9853905 -0.9837116 0.9998557 0.9853905 -0.9837916 0.9998557 0.9853905 -0.9838928 0.9998557 0.9853905 -0.9840209 0.9998557 0.9853905 -0.9841829 0.9998557 0.9853905 -0.984388 0.9998557 0.9853905 -0.9846473 0.9998557 0.9853905 -0.9849754 0.9998557 0.9853905 -0.9853905 0.9998557 0.9853905 -0.9859157 0.9998557 0.9853905 -0.9865801 0.9998557 0.9853905 -0.9874207 0.9998557 0.9853905 -0.9884841 0.9998557 0.9853905 -0.9898295 0.9998557 0.9853905 -0.9915316 0.9998557 0.9853905 -0.9936849 0.9998557 0.9853905 -0.9964092 0.9998557 0.9853905 -0.9998557 0.9998557 0.9853905 -0.999886 0.9971537 0.9880897 -0.9999099 0.9960342 0.990358 -0.9999288 0.9957887 0.9922358 -0.9999437 0.9959964 0.9937734 -0.9868505 0.999886 0.9880915 -0.9868505 0.999886 0.9880914 -0.9868505 0.999886 0.9880914 -0.9868505 0.999886 0.9880914 -0.9868504 0.999886 0.9880913 -0.9868504 0.999886 0.9880913 -0.9868504 0.999886 0.9880912 -0.9868503 0.999886 0.9880911 -0.9868503 0.999886 0.988091 -0.9868502 0.999886 0.9880909 -0.9868502 0.999886 0.9880907 -0.9868501 0.999886 0.9880905 -0.9868501 0.999886 0.9880903 -0.98685 0.999886 0.9880901 -0.9868501 0.999886 0.9880899 -0.9868503 0.999886 0.9880897 -0.9868507 0.999886 0.9880897 -0.9868512 0.999886 0.9880897 -0.986852 0.999886 0.9880897 -0.9868529 0.999886 0.9880897 -0.9868541 0.999886 0.9880897 -0.9868555 0.999886 0.9880897 -0.9868574 0.999886 0.9880897 -0.9868597 0.999886 0.9880897 -0.9868627 0.999886 0.9880897 -0.9868665 0.999886 0.9880897 -0.9868713 0.999886 0.9880897 -0.9868773 0.999886 0.9880897 -0.986885 0.999886 0.9880897 -0.9868946 0.999886 0.9880897 -0.9869069 0.999886 0.9880897 -0.9869223 0.999886 0.9880897 -0.9869419 0.999886 0.9880897 -0.9869667 0.999886 0.9880897 -0.986998 0.999886 0.9880897 -0.9870376 0.999886 0.9880897 -0.9870878 0.999886 0.9880897 -0.9871512 0.999886 0.9880897 -0.9872315 0.999886 0.9880897 -0.987333 0.999886 0.9880897 -0.9874615 0.999886 0.9880897 -0.987624 0.999886 0.9880897 -0.9878296 0.999886 0.9880897 -0.9880897 0.999886 0.9880897 -0.9884188 0.999886 0.9880897 -0.9888351 0.999886 0.9880897 -0.9893618 0.999886 0.9880897 -0.9900282 0.999886 0.9880897 -0.9908712 0.999886 0.9880897 -0.9919377 0.999886 0.9880897 -0.993287 0.999886 0.9880897 -0.9949941 0.999886 0.9880897 -0.9971537 0.999886 0.9880897 -0.999886 0.999886 0.9880897 -0.9999099 0.9977452 0.990358 -0.9999288 0.9968597 0.9922358 -0.9999437 0.9966665 0.9937734 -0.989582 0.9999099 0.9903592 -0.989582 0.9999099 0.9903591 -0.989582 0.9999099 0.9903591 -0.989582 0.9999099 0.9903591 -0.989582 0.9999099 0.9903591 -0.9895819 0.9999099 0.990359 -0.9895819 0.9999099 0.990359 -0.9895819 0.9999099 0.9903589 -0.9895819 0.9999099 0.9903589 -0.9895818 0.9999099 0.9903588 -0.9895818 0.9999099 0.9903587 -0.9895818 0.9999099 0.9903586 -0.9895817 0.9999099 0.9903584 -0.9895817 0.9999099 0.9903583 -0.9895817 0.9999099 0.9903582 -0.9895819 0.9999099 0.9903581 -0.9895821 0.9999099 0.990358 -0.9895825 0.9999099 0.990358 -0.9895829 0.9999099 0.990358 -0.9895835 0.9999099 0.990358 -0.9895842 0.9999099 0.990358 -0.9895851 0.9999099 0.990358 -0.9895863 0.9999099 0.990358 -0.9895878 0.9999099 0.990358 -0.9895897 0.9999099 0.990358 -0.989592 0.9999099 0.990358 -0.989595 0.9999099 0.990358 -0.9895988 0.9999099 0.990358 -0.9896036 0.9999099 0.990358 -0.9896096 0.9999099 0.990358 -0.9896173 0.9999099 0.990358 -0.989627 0.9999099 0.990358 -0.9896392 0.9999099 0.990358 -0.9896547 0.9999099 0.990358 -0.9896744 0.9999099 0.990358 -0.9896992 0.9999099 0.990358 -0.9897306 0.9999099 0.990358 -0.9897703 0.9999099 0.990358 -0.9898206 0.9999099 0.990358 -0.9898842 0.9999099 0.990358 -0.9899646 0.9999099 0.990358 -0.9900664 0.9999099 0.990358 -0.9901951 0.9999099 0.990358 -0.990358 0.9999099 0.990358 -0.9905641 0.9999099 0.990358 -0.9908248 0.9999099 0.990358 -0.9911547 0.9999099 0.990358 -0.991572 0.9999099 0.990358 -0.9920999 0.9999099 0.990358 -0.9927678 0.9999099 0.990358 -0.9936128 0.9999099 0.990358 -0.9946818 0.9999099 0.990358 -0.9960342 0.9999099 0.990358 -0.9977452 0.9999099 0.990358 -0.9999099 0.9999099 0.990358 -0.9999288 0.9982146 0.9922358 -0.9999437 0.9975143 0.9937734 -0.9917501 0.9999288 0.9922366 -0.9917501 0.9999288 0.9922365 -0.9917501 0.9999288 0.9922365 -0.9917501 0.9999288 0.9922365 -0.9917501 0.9999288 0.9922365 -0.9917501 0.9999288 0.9922365 -0.99175 0.9999288 0.9922364 -0.99175 0.9999288 0.9922364 -0.99175 0.9999288 0.9922364 -0.99175 0.9999288 0.9922363 -0.99175 0.9999288 0.9922362 -0.9917499 0.9999288 0.9922362 -0.9917499 0.9999288 0.9922361 -0.9917499 0.9999288 0.992236 -0.9917499 0.9999288 0.9922359 -0.99175 0.9999288 0.9922358 -0.9917502 0.9999288 0.9922358 -0.9917504 0.9999288 0.9922358 -0.9917507 0.9999288 0.9922358 -0.991751 0.9999288 0.9922358 -0.9917515 0.9999288 0.9922358 -0.9917521 0.9999288 0.9922358 -0.9917528 0.9999288 0.9922358 -0.9917537 0.9999288 0.9922358 -0.9917549 0.9999288 0.9922358 -0.9917564 0.9999288 0.9922358 -0.9917582 0.9999288 0.9922358 -0.9917606 0.9999288 0.9922358 -0.9917636 0.9999288 0.9922358 -0.9917674 0.9999288 0.9922358 -0.9917722 0.9999288 0.9922358 -0.9917782 0.9999288 0.9922358 -0.9917859 0.9999288 0.9922358 -0.9917956 0.9999288 0.9922358 -0.9918079 0.9999288 0.9922358 -0.9918234 0.9999288 0.9922358 -0.9918431 0.9999288 0.9922358 -0.991868 0.9999288 0.9922358 -0.9918994 0.9999288 0.9922358 -0.9919392 0.9999288 0.9922358 -0.9919896 0.9999288 0.9922358 -0.9920533 0.9999288 0.9922358 -0.9921339 0.9999288 0.9922358 -0.9922358 0.9999288 0.9922358 -0.9923648 0.9999288 0.9922358 -0.992528 0.9999288 0.9922358 -0.9927345 0.9999288 0.9922358 -0.9929957 0.9999288 0.9922358 -0.9933261 0.9999288 0.9922358 -0.9937442 0.9999288 0.9922358 -0.9942731 0.9999288 0.9922358 -0.9949422 0.9999288 0.9922358 -0.9957887 0.9999288 0.9922358 -0.9968597 0.9999288 0.9922358 -0.9982146 0.9999288 0.9922358 -0.9999288 0.9999288 0.9922358 -0.9999437 0.9985868 0.9937734 -0.9934695 0.9999437 0.9937739 -0.9934695 0.9999437 0.9937739 -0.9934695 0.9999437 0.9937739 -0.9934695 0.9999437 0.9937738 -0.9934695 0.9999437 0.9937738 -0.9934695 0.9999437 0.9937738 -0.9934695 0.9999437 0.9937738 -0.9934694 0.9999437 0.9937738 -0.9934694 0.9999437 0.9937737 -0.9934694 0.9999437 0.9937737 -0.9934694 0.9999437 0.9937737 -0.9934694 0.9999437 0.9937736 -0.9934694 0.9999437 0.9937736 -0.9934694 0.9999437 0.9937735 -0.9934694 0.9999437 0.9937735 -0.9934694 0.9999437 0.9937734 -0.9934695 0.9999437 0.9937734 -0.9934697 0.9999437 0.9937734 -0.9934698 0.9999437 0.9937734 -0.9934701 0.9999437 0.9937734 -0.9934704 0.9999437 0.9937734 -0.9934707 0.9999437 0.9937734 -0.9934712 0.9999437 0.9937734 -0.9934718 0.9999437 0.9937734 -0.9934725 0.9999437 0.9937734 -0.9934734 0.9999437 0.9937734 -0.9934746 0.9999437 0.9937734 -0.9934761 0.9999437 0.9937734 -0.9934779 0.9999437 0.9937734 -0.9934803 0.9999437 0.9937734 -0.9934833 0.9999437 0.9937734 -0.9934871 0.9999437 0.9937734 -0.9934919 0.9999437 0.9937734 -0.993498 0.9999437 0.9937734 -0.9935057 0.9999437 0.9937734 -0.9935154 0.9999437 0.9937734 -0.9935277 0.9999437 0.9937734 -0.9935432 0.9999437 0.9937734 -0.9935629 0.9999437 0.9937734 -0.9935878 0.9999437 0.9937734 -0.9936193 0.9999437 0.9937734 -0.9936592 0.9999437 0.9937734 -0.9937096 0.9999437 0.9937734 -0.9937734 0.9999437 0.9937734 -0.9938541 0.9999437 0.9937734 -0.9939562 0.9999437 0.9937734 -0.9940854 0.9999437 0.9937734 -0.9942488 0.9999437 0.9937734 -0.9944556 0.9999437 0.9937734 -0.9947172 0.9999437 0.9937734 -0.9950481 0.9999437 0.9937734 -0.9954668 0.9999437 0.9937734 -0.9959964 0.9999437 0.9937734 -0.9966665 0.9999437 0.9937734 -0.9975143 0.9999437 0.9937734 -0.9985868 0.9999437 0.9937734 -0.9999437 0.9999437 0.9937734 -0.8990028 0.8990028 0.9990461 -0.8990036 0.8990028 0.9990461 -0.8990047 0.8990028 0.9990461 -0.8990061 0.8990028 0.9990461 -0.8990078 0.8990028 0.9990461 -0.89901 0.8990028 0.9990461 -0.8990127 0.8990028 0.9990461 -0.8990162 0.8990028 0.9990461 -0.8990206 0.8990028 0.9990461 -0.8990262 0.8990028 0.9990461 -0.8990333 0.8990028 0.9990461 -0.8990422 0.8990028 0.9990461 -0.8990535 0.8990028 0.9990461 -0.8990678 0.8990028 0.9990461 -0.8990859 0.8990028 0.9990461 -0.8991088 0.8990028 0.9990461 -0.8991377 0.8990028 0.9990461 -0.8991744 0.8990028 0.9990461 -0.8992207 0.8990028 0.9990461 -0.8992794 0.8990028 0.9990461 -0.8993535 0.8990028 0.9990461 -0.8994474 0.8990028 0.9990461 -0.8995661 0.8990028 0.9990461 -0.8997163 0.8990028 0.9990461 -0.8999063 0.8990028 0.9990461 -0.9001468 0.8990028 0.9990461 -0.9004509 0.8990028 0.9990461 -0.9008357 0.8990028 0.9990461 -0.9013225 0.8990028 0.9990461 -0.9019384 0.8990028 0.9990461 -0.9027176 0.8990028 0.9990461 -0.9037033 0.8990028 0.9990461 -0.9049504 0.8990028 0.9990461 -0.9065282 0.8990028 0.9990461 -0.9085243 0.8990028 0.9990461 -0.9110495 0.8990028 0.9990461 -0.9142443 0.8990028 0.9990461 -0.9182862 0.8990028 0.9990461 -0.9233996 0.8990028 0.9990461 -0.9298688 0.8990028 0.9990461 -0.9380532 0.8990028 0.9990461 -0.9484075 0.8990028 0.9990461 -0.961507 0.8990028 0.9990461 -0.9780796 0.8990028 0.9990461 -0.9990461 0.8990028 0.9990461 -0.9992474 0.9187175 0.9823705 -0.999406 0.9348153 0.97517 -0.999531 0.9478754 0.9733851 -0.9996296 0.958416 0.9745036 -0.9997074 0.9668873 0.9770137 -0.9997689 0.9736726 0.980037 -0.9998174 0.9790927 0.9830878 -0.9998557 0.9834129 0.9859184 -0.999886 0.9868505 0.9884205 -0.9999099 0.989582 0.9905652 -0.9999288 0.9917501 0.9923655 -0.9999437 0.9934695 0.9938546 -0.8990028 0.8990036 0.9990461 -0.899002 0.899002 0.9990461 -0.8990031 0.899002 0.9990461 -0.8990045 0.899002 0.9990461 -0.8990062 0.899002 0.9990461 -0.8990084 0.899002 0.9990461 -0.8990111 0.899002 0.9990461 -0.8990146 0.899002 0.9990461 -0.899019 0.899002 0.9990461 -0.8990246 0.899002 0.9990461 -0.8990317 0.899002 0.9990461 -0.8990406 0.899002 0.9990461 -0.8990519 0.899002 0.9990461 -0.8990662 0.899002 0.9990461 -0.8990843 0.899002 0.9990461 -0.8991072 0.899002 0.9990461 -0.8991362 0.899002 0.9990461 -0.8991728 0.899002 0.9990461 -0.8992191 0.899002 0.9990461 -0.8992778 0.899002 0.9990461 -0.899352 0.899002 0.9990461 -0.8994458 0.899002 0.9990461 -0.8995645 0.899002 0.9990461 -0.8997147 0.899002 0.9990461 -0.8999048 0.899002 0.9990461 -0.9001452 0.899002 0.9990461 -0.9004493 0.899002 0.9990461 -0.9008341 0.899002 0.9990461 -0.901321 0.899002 0.9990461 -0.9019369 0.899002 0.9990461 -0.902716 0.899002 0.9990461 -0.9037018 0.899002 0.9990461 -0.9049489 0.899002 0.9990461 -0.9065267 0.899002 0.9990461 -0.9085228 0.899002 0.9990461 -0.9110481 0.899002 0.9990461 -0.914243 0.899002 0.9990461 -0.9182849 0.899002 0.9990461 -0.9233984 0.899002 0.9990461 -0.9298677 0.899002 0.9990461 -0.9380522 0.899002 0.9990461 -0.9484067 0.899002 0.9990461 -0.9615064 0.899002 0.9990461 -0.9780793 0.899002 0.9990461 -0.9990461 0.899002 0.9990461 -0.9992474 0.918717 0.9823703 -0.999406 0.9348149 0.9751697 -0.999531 0.9478752 0.9733849 -0.9996296 0.9584159 0.9745034 -0.9997074 0.9668872 0.9770136 -0.9997689 0.9736726 0.9800369 -0.9998174 0.9790927 0.9830878 -0.9998557 0.9834129 0.9859183 -0.999886 0.9868505 0.9884205 -0.9999099 0.989582 0.9905652 -0.9999288 0.9917501 0.9923655 -0.9999437 0.9934695 0.9938546 -0.8990028 0.8990047 0.9990461 -0.899002 0.8990031 0.9990461 -0.8990011 0.8990011 0.9990461 -0.8990025 0.8990011 0.9990461 -0.8990042 0.8990011 0.9990461 -0.8990064 0.8990011 0.9990461 -0.8990091 0.8990011 0.9990461 -0.8990126 0.8990011 0.9990461 -0.899017 0.8990011 0.9990461 -0.8990226 0.8990011 0.9990461 -0.8990297 0.8990011 0.9990461 -0.8990386 0.8990011 0.9990461 -0.8990499 0.8990011 0.9990461 -0.8990642 0.8990011 0.9990461 -0.8990823 0.8990011 0.9990461 -0.8991052 0.8990011 0.9990461 -0.8991342 0.8990011 0.9990461 -0.8991708 0.8990011 0.9990461 -0.8992171 0.8990011 0.9990461 -0.8992758 0.8990011 0.9990461 -0.89935 0.8990011 0.9990461 -0.8994438 0.8990011 0.9990461 -0.8995625 0.8990011 0.9990461 -0.8997128 0.8990011 0.9990461 -0.8999028 0.8990011 0.9990461 -0.9001432 0.8990011 0.9990461 -0.9004474 0.8990011 0.9990461 -0.9008322 0.8990011 0.9990461 -0.901319 0.8990011 0.9990461 -0.9019349 0.8990011 0.9990461 -0.9027141 0.8990011 0.9990461 -0.9036999 0.8990011 0.9990461 -0.9049471 0.8990011 0.9990461 -0.9065249 0.8990011 0.9990461 -0.908521 0.8990011 0.9990461 -0.9110464 0.8990011 0.9990461 -0.9142413 0.8990011 0.9990461 -0.9182833 0.8990011 0.9990461 -0.9233969 0.8990011 0.9990461 -0.9298664 0.8990011 0.9990461 -0.938051 0.8990011 0.9990461 -0.9484057 0.8990011 0.9990461 -0.9615057 0.8990011 0.9990461 -0.9780789 0.8990011 0.9990461 -0.9990461 0.8990011 0.9990461 -0.9992474 0.9187164 0.98237 -0.999406 0.9348146 0.9751694 -0.999531 0.947875 0.9733846 -0.9996296 0.9584157 0.9745032 -0.9997074 0.9668871 0.9770135 -0.9997689 0.9736725 0.9800368 -0.9998174 0.9790927 0.9830877 -0.9998557 0.9834129 0.9859183 -0.999886 0.9868505 0.9884204 -0.9999099 0.989582 0.9905652 -0.9999288 0.9917501 0.9923655 -0.9999437 0.9934695 0.9938546 -0.8990028 0.8990061 0.9990461 -0.899002 0.8990045 0.9990461 -0.8990011 0.8990025 0.9990461 -0.899 0.899 0.9990461 -0.8990017 0.899 0.9990461 -0.8990039 0.899 0.9990461 -0.8990066 0.899 0.9990461 -0.8990101 0.899 0.9990461 -0.8990145 0.899 0.9990461 -0.8990201 0.899 0.9990461 -0.8990272 0.899 0.9990461 -0.8990361 0.899 0.9990461 -0.8990474 0.899 0.9990461 -0.8990617 0.899 0.9990461 -0.8990798 0.899 0.9990461 -0.8991027 0.899 0.9990461 -0.8991317 0.899 0.9990461 -0.8991683 0.899 0.9990461 -0.8992146 0.899 0.9990461 -0.8992733 0.899 0.9990461 -0.8993475 0.899 0.9990461 -0.8994413 0.899 0.9990461 -0.8995601 0.899 0.9990461 -0.8997103 0.899 0.9990461 -0.8999003 0.899 0.9990461 -0.9001407 0.899 0.9990461 -0.9004449 0.899 0.9990461 -0.9008297 0.899 0.9990461 -0.9013166 0.899 0.9990461 -0.9019325 0.899 0.9990461 -0.9027117 0.899 0.9990461 -0.9036975 0.899 0.9990461 -0.9049447 0.899 0.9990461 -0.9065226 0.899 0.9990461 -0.9085187 0.899 0.9990461 -0.9110442 0.899 0.9990461 -0.9142392 0.899 0.9990461 -0.9182813 0.899 0.9990461 -0.923395 0.899 0.9990461 -0.9298646 0.899 0.9990461 -0.9380495 0.899 0.9990461 -0.9484044 0.899 0.9990461 -0.9615047 0.899 0.9990461 -0.9780783 0.899 0.9990461 -0.9990461 0.899 0.9990461 -0.9992474 0.9187157 0.9823697 -0.999406 0.9348141 0.975169 -0.999531 0.9478746 0.9733843 -0.9996296 0.9584155 0.974503 -0.9997074 0.966887 0.9770133 -0.9997689 0.9736724 0.9800367 -0.9998174 0.9790926 0.9830876 -0.9998557 0.9834129 0.9859182 -0.999886 0.9868505 0.9884204 -0.9999099 0.989582 0.9905652 -0.9999288 0.9917501 0.9923655 -0.9999437 0.9934695 0.9938545 -0.8990028 0.8990078 0.9990461 -0.899002 0.8990062 0.9990461 -0.8990011 0.8990042 0.9990461 -0.899 0.8990017 0.9990461 -0.8989986 0.8989986 0.9990461 -0.8990008 0.8989986 0.9990461 -0.8990035 0.8989986 0.9990461 -0.899007 0.8989986 0.9990461 -0.8990114 0.8989986 0.9990461 -0.899017 0.8989986 0.9990461 -0.8990241 0.8989986 0.9990461 -0.899033 0.8989986 0.9990461 -0.8990443 0.8989986 0.9990461 -0.8990586 0.8989986 0.9990461 -0.8990767 0.8989986 0.9990461 -0.8990996 0.8989986 0.9990461 -0.8991285 0.8989986 0.9990461 -0.8991652 0.8989986 0.9990461 -0.8992115 0.8989986 0.9990461 -0.8992702 0.8989986 0.9990461 -0.8993443 0.8989986 0.9990461 -0.8994382 0.8989986 0.9990461 -0.8995569 0.8989986 0.9990461 -0.8997072 0.8989986 0.9990461 -0.8998972 0.8989986 0.9990461 -0.9001376 0.8989986 0.9990461 -0.9004418 0.8989986 0.9990461 -0.9008267 0.8989986 0.9990461 -0.9013135 0.8989986 0.9990461 -0.9019295 0.8989986 0.9990461 -0.9027087 0.8989986 0.9990461 -0.9036945 0.8989986 0.9990461 -0.9049418 0.8989986 0.9990461 -0.9065197 0.8989986 0.9990461 -0.9085159 0.8989986 0.9990461 -0.9110414 0.8989986 0.9990461 -0.9142365 0.8989986 0.9990461 -0.9182787 0.8989986 0.9990461 -0.9233927 0.8989986 0.9990461 -0.9298625 0.8989986 0.9990461 -0.9380476 0.8989986 0.9990461 -0.9484028 0.8989986 0.9990461 -0.9615035 0.8989986 0.9990461 -0.9780777 0.8989986 0.9990461 -0.9990461 0.8989986 0.9990461 -0.9992474 0.9187148 0.9823693 -0.999406 0.9348135 0.9751686 -0.999531 0.9478743 0.9733838 -0.9996296 0.9584153 0.9745027 -0.9997074 0.9668869 0.977013 -0.9997689 0.9736723 0.9800366 -0.9998174 0.9790925 0.9830875 -0.9998557 0.9834128 0.9859182 -0.999886 0.9868504 0.9884204 -0.9999099 0.989582 0.9905651 -0.9999288 0.9917501 0.9923655 -0.9999437 0.9934695 0.9938545 -0.8990028 0.89901 0.9990461 -0.899002 0.8990084 0.9990461 -0.8990011 0.8990064 0.9990461 -0.899 0.8990039 0.9990461 -0.8989986 0.8990008 0.9990461 -0.8989969 0.8989969 0.9990461 -0.8989996 0.8989969 0.9990461 -0.8990031 0.8989969 0.9990461 -0.8990075 0.8989969 0.9990461 -0.8990131 0.8989969 0.9990461 -0.8990202 0.8989969 0.9990461 -0.8990291 0.8989969 0.9990461 -0.8990404 0.8989969 0.9990461 -0.8990547 0.8989969 0.9990461 -0.8990728 0.8989969 0.9990461 -0.8990957 0.8989969 0.9990461 -0.8991246 0.8989969 0.9990461 -0.8991613 0.8989969 0.9990461 -0.8992076 0.8989969 0.9990461 -0.8992663 0.8989969 0.9990461 -0.8993405 0.8989969 0.9990461 -0.8994343 0.8989969 0.9990461 -0.8995531 0.8989969 0.9990461 -0.8997033 0.8989969 0.9990461 -0.8998934 0.8989969 0.9990461 -0.9001338 0.8989969 0.9990461 -0.900438 0.8989969 0.9990461 -0.9008228 0.8989969 0.9990461 -0.9013097 0.8989969 0.9990461 -0.9019257 0.8989969 0.9990461 -0.9027049 0.8989969 0.9990461 -0.9036908 0.8989969 0.9990461 -0.9049381 0.8989969 0.9990461 -0.9065161 0.8989969 0.9990461 -0.9085124 0.8989969 0.9990461 -0.911038 0.8989969 0.9990461 -0.9142332 0.8989969 0.9990461 -0.9182756 0.8989969 0.9990461 -0.9233897 0.8989969 0.9990461 -0.9298598 0.8989969 0.9990461 -0.9380452 0.8989969 0.9990461 -0.9484008 0.8989969 0.9990461 -0.9615021 0.8989969 0.9990461 -0.9780768 0.8989969 0.9990461 -0.9990461 0.8989969 0.9990461 -0.9992474 0.9187137 0.9823687 -0.9994059 0.9348128 0.975168 -0.999531 0.9478738 0.9733833 -0.9996296 0.958415 0.9745023 -0.9997074 0.9668867 0.9770128 -0.9997689 0.9736722 0.9800364 -0.9998174 0.9790925 0.9830874 -0.9998557 0.9834128 0.9859181 -0.999886 0.9868504 0.9884203 -0.9999099 0.9895819 0.9905651 -0.9999288 0.9917501 0.9923655 -0.9999437 0.9934695 0.9938545 -0.8990028 0.8990127 0.9990461 -0.899002 0.8990111 0.9990461 -0.8990011 0.8990091 0.9990461 -0.899 0.8990066 0.9990461 -0.8989986 0.8990035 0.9990461 -0.8989969 0.8989996 0.9990461 -0.8989948 0.8989948 0.9990461 -0.8989983 0.8989948 0.9990461 -0.8990027 0.8989948 0.9990461 -0.8990083 0.8989948 0.9990461 -0.8990153 0.8989948 0.9990461 -0.8990243 0.8989948 0.9990461 -0.8990356 0.8989948 0.9990461 -0.8990499 0.8989948 0.9990461 -0.899068 0.8989948 0.9990461 -0.8990909 0.8989948 0.9990461 -0.8991198 0.8989948 0.9990461 -0.8991565 0.8989948 0.9990461 -0.8992028 0.8989948 0.9990461 -0.8992615 0.8989948 0.9990461 -0.8993357 0.8989948 0.9990461 -0.8994295 0.8989948 0.9990461 -0.8995483 0.8989948 0.9990461 -0.8996985 0.8989948 0.9990461 -0.8998886 0.8989948 0.9990461 -0.900129 0.8989948 0.9990461 -0.9004332 0.8989948 0.9990461 -0.9008181 0.8989948 0.9990461 -0.901305 0.8989948 0.9990461 -0.901921 0.8989948 0.9990461 -0.9027003 0.8989948 0.9990461 -0.9036862 0.8989948 0.9990461 -0.9049336 0.8989948 0.9990461 -0.9065116 0.8989948 0.9990461 -0.908508 0.8989948 0.9990461 -0.9110337 0.8989948 0.9990461 -0.9142291 0.8989948 0.9990461 -0.9182717 0.8989948 0.9990461 -0.9233861 0.8989948 0.9990461 -0.9298564 0.8989948 0.9990461 -0.9380422 0.8989948 0.9990461 -0.9483984 0.8989948 0.9990461 -0.9615002 0.8989948 0.9990461 -0.9780758 0.8989948 0.9990461 -0.9990461 0.8989948 0.9990461 -0.9992473 0.9187123 0.9823681 -0.9994059 0.9348119 0.9751672 -0.999531 0.9478733 0.9733827 -0.9996296 0.9584146 0.9745018 -0.9997074 0.9668865 0.9770124 -0.9997689 0.9736721 0.9800361 -0.9998174 0.9790924 0.9830872 -0.9998557 0.9834127 0.985918 -0.999886 0.9868504 0.9884202 -0.9999099 0.9895819 0.9905651 -0.9999288 0.99175 0.9923654 -0.9999437 0.9934695 0.9938545 -0.8990028 0.8990162 0.9990461 -0.899002 0.8990146 0.9990461 -0.8990011 0.8990126 0.9990461 -0.899 0.8990101 0.9990461 -0.8989986 0.899007 0.9990461 -0.8989969 0.8990031 0.9990461 -0.8989948 0.8989983 0.9990461 -0.8989923 0.8989923 0.999046 -0.8989967 0.8989923 0.999046 -0.8990023 0.8989923 0.999046 -0.8990094 0.8989923 0.999046 -0.8990183 0.8989923 0.999046 -0.8990296 0.8989923 0.999046 -0.8990439 0.8989923 0.999046 -0.899062 0.8989923 0.999046 -0.8990849 0.8989923 0.999046 -0.8991139 0.8989923 0.999046 -0.8991505 0.8989923 0.999046 -0.8991969 0.8989923 0.999046 -0.8992555 0.8989923 0.999046 -0.8993297 0.8989923 0.999046 -0.8994236 0.8989923 0.999046 -0.8995424 0.8989923 0.999046 -0.8996926 0.8989923 0.999046 -0.8998827 0.8989923 0.999046 -0.9001231 0.8989923 0.999046 -0.9004274 0.8989923 0.999046 -0.9008122 0.8989923 0.999046 -0.9012992 0.8989923 0.999046 -0.9019152 0.8989923 0.999046 -0.9026946 0.8989923 0.999046 -0.9036806 0.8989923 0.999046 -0.904928 0.8989923 0.999046 -0.9065061 0.8989923 0.999046 -0.9085026 0.8989923 0.999046 -0.9110285 0.8989923 0.999046 -0.9142241 0.8989923 0.999046 -0.9182669 0.8989923 0.999046 -0.9233816 0.8989923 0.999046 -0.9298523 0.8989923 0.999046 -0.9380386 0.8989923 0.999046 -0.9483954 0.8989923 0.999046 -0.961498 0.8989923 0.999046 -0.9780745 0.8989923 0.999046 -0.999046 0.8989923 0.999046 -0.9992473 0.9187107 0.9823673 -0.9994059 0.9348109 0.9751663 -0.999531 0.9478726 0.9733819 -0.9996296 0.9584142 0.9745012 -0.9997074 0.9668862 0.977012 -0.9997689 0.9736719 0.9800358 -0.9998174 0.9790923 0.983087 -0.9998557 0.9834127 0.9859178 -0.999886 0.9868503 0.9884202 -0.9999099 0.9895819 0.990565 -0.9999288 0.99175 0.9923654 -0.9999437 0.9934694 0.9938545 -0.8990028 0.8990206 0.9990461 -0.899002 0.899019 0.9990461 -0.8990011 0.899017 0.9990461 -0.899 0.8990145 0.9990461 -0.8989986 0.8990114 0.9990461 -0.8989969 0.8990075 0.9990461 -0.8989948 0.8990027 0.9990461 -0.8989923 0.8989967 0.999046 -0.8989895 0.8989895 0.999046 -0.8989951 0.8989895 0.999046 -0.8990021 0.8989895 0.999046 -0.8990111 0.8989895 0.999046 -0.8990224 0.8989895 0.999046 -0.8990367 0.8989895 0.999046 -0.8990548 0.8989895 0.999046 -0.8990777 0.8989895 0.999046 -0.8991066 0.8989895 0.999046 -0.8991433 0.8989895 0.999046 -0.8991896 0.8989895 0.999046 -0.8992483 0.8989895 0.999046 -0.8993225 0.8989895 0.999046 -0.8994164 0.8989895 0.999046 -0.8995351 0.8989895 0.999046 -0.8996854 0.8989895 0.999046 -0.8998755 0.8989895 0.999046 -0.9001159 0.8989895 0.999046 -0.9004202 0.8989895 0.999046 -0.9008051 0.8989895 0.999046 -0.9012921 0.8989895 0.999046 -0.9019081 0.8989895 0.999046 -0.9026876 0.8989895 0.999046 -0.9036736 0.8989895 0.999046 -0.9049211 0.8989895 0.999046 -0.9064994 0.8989895 0.999046 -0.908496 0.8989895 0.999046 -0.9110221 0.8989895 0.999046 -0.9142179 0.8989895 0.999046 -0.918261 0.8989895 0.999046 -0.923376 0.8989895 0.999046 -0.9298472 0.8989895 0.999046 -0.9380342 0.8989895 0.999046 -0.9483917 0.8989895 0.999046 -0.9614952 0.8989895 0.999046 -0.978073 0.8989895 0.999046 -0.999046 0.8989895 0.999046 -0.9992473 0.9187089 0.9823663 -0.9994059 0.9348097 0.9751652 -0.999531 0.9478718 0.9733809 -0.9996296 0.9584137 0.9745005 -0.9997074 0.9668859 0.9770115 -0.9997689 0.9736717 0.9800355 -0.9998174 0.9790921 0.9830868 -0.9998557 0.9834126 0.9859177 -0.999886 0.9868503 0.9884201 -0.9999099 0.9895819 0.9905649 -0.9999288 0.99175 0.9923653 -0.9999437 0.9934694 0.9938545 -0.8990028 0.8990262 0.9990461 -0.899002 0.8990246 0.9990461 -0.8990011 0.8990226 0.9990461 -0.899 0.8990201 0.9990461 -0.8989986 0.899017 0.9990461 -0.8989969 0.8990131 0.9990461 -0.8989948 0.8990083 0.9990461 -0.8989923 0.8990023 0.999046 -0.8989895 0.8989951 0.999046 -0.8989863 0.8989863 0.9990459 -0.8989933 0.8989863 0.9990459 -0.8990023 0.8989863 0.9990459 -0.8990136 0.8989863 0.9990459 -0.8990279 0.8989863 0.9990459 -0.899046 0.8989863 0.9990459 -0.8990689 0.8989863 0.9990459 -0.8990978 0.8989863 0.9990459 -0.8991345 0.8989863 0.9990459 -0.8991809 0.8989863 0.9990459 -0.8992395 0.8989863 0.9990459 -0.8993137 0.8989863 0.9990459 -0.8994076 0.8989863 0.9990459 -0.8995264 0.8989863 0.9990459 -0.8996766 0.8989863 0.9990459 -0.8998667 0.8989863 0.9990459 -0.9001073 0.8989863 0.9990459 -0.9004115 0.8989863 0.9990459 -0.9007965 0.8989863 0.9990459 -0.9012835 0.8989863 0.9990459 -0.9018996 0.8989863 0.9990459 -0.9026791 0.8989863 0.9990459 -0.9036652 0.8989863 0.9990459 -0.9049128 0.8989863 0.9990459 -0.9064912 0.8989863 0.9990459 -0.9084881 0.8989863 0.9990459 -0.9110144 0.8989863 0.9990459 -0.9142104 0.8989863 0.9990459 -0.9182539 0.8989863 0.9990459 -0.9233694 0.8989863 0.9990459 -0.9298411 0.8989863 0.9990459 -0.9380288 0.8989863 0.9990459 -0.9483872 0.8989863 0.9990459 -0.9614919 0.8989863 0.9990459 -0.9780711 0.8989863 0.9990459 -0.9990459 0.8989863 0.9990459 -0.9992473 0.9187068 0.9823651 -0.9994059 0.9348083 0.9751638 -0.9995309 0.947871 0.9733798 -0.9996296 0.9584132 0.9744996 -0.9997074 0.9668855 0.9770108 -0.9997689 0.9736715 0.980035 -0.9998174 0.979092 0.9830865 -0.9998557 0.9834125 0.9859175 -0.999886 0.9868502 0.9884199 -0.9999099 0.9895818 0.9905648 -0.9999288 0.99175 0.9923653 -0.9999437 0.9934694 0.9938544 -0.8990028 0.8990333 0.9990461 -0.899002 0.8990317 0.9990461 -0.8990011 0.8990297 0.9990461 -0.899 0.8990272 0.9990461 -0.8989986 0.8990241 0.9990461 -0.8989969 0.8990202 0.9990461 -0.8989948 0.8990153 0.9990461 -0.8989923 0.8990094 0.999046 -0.8989895 0.8990021 0.999046 -0.8989863 0.8989933 0.9990459 -0.8989829 0.8989829 0.9990459 -0.8989918 0.8989829 0.9990459 -0.8990031 0.8989829 0.9990459 -0.8990174 0.8989829 0.9990459 -0.8990355 0.8989829 0.9990459 -0.8990584 0.8989829 0.9990459 -0.8990874 0.8989829 0.9990459 -0.899124 0.8989829 0.9990459 -0.8991704 0.8989829 0.9990459 -0.8992291 0.8989829 0.9990459 -0.8993033 0.8989829 0.9990459 -0.8993972 0.8989829 0.9990459 -0.899516 0.8989829 0.9990459 -0.8996662 0.8989829 0.9990459 -0.8998564 0.8989829 0.9990459 -0.9000969 0.8989829 0.9990459 -0.9004012 0.8989829 0.9990459 -0.9007862 0.8989829 0.9990459 -0.9012733 0.8989829 0.9990459 -0.9018894 0.8989829 0.9990459 -0.902669 0.8989829 0.9990459 -0.9036553 0.8989829 0.9990459 -0.904903 0.8989829 0.9990459 -0.9064815 0.8989829 0.9990459 -0.9084786 0.8989829 0.9990459 -0.9110051 0.8989829 0.9990459 -0.9142016 0.8989829 0.9990459 -0.9182454 0.8989829 0.9990459 -0.9233615 0.8989829 0.9990459 -0.9298339 0.8989829 0.9990459 -0.9380224 0.8989829 0.9990459 -0.9483819 0.8989829 0.9990459 -0.961488 0.8989829 0.9990459 -0.9780689 0.8989829 0.9990459 -0.9990459 0.8989829 0.9990459 -0.9992472 0.9187045 0.9823636 -0.9994059 0.9348069 0.9751622 -0.9995309 0.94787 0.9733784 -0.9996296 0.9584126 0.9744985 -0.9997074 0.9668852 0.9770101 -0.9997689 0.9736712 0.9800345 -0.9998174 0.9790919 0.9830862 -0.9998557 0.9834124 0.9859173 -0.999886 0.9868502 0.9884198 -0.9999099 0.9895818 0.9905648 -0.9999288 0.99175 0.9923652 -0.9999437 0.9934694 0.9938544 -0.8990028 0.8990422 0.9990461 -0.899002 0.8990406 0.9990461 -0.8990011 0.8990386 0.9990461 -0.899 0.8990361 0.9990461 -0.8989986 0.899033 0.9990461 -0.8989969 0.8990291 0.9990461 -0.8989948 0.8990243 0.9990461 -0.8989923 0.8990183 0.999046 -0.8989895 0.8990111 0.999046 -0.8989863 0.8990023 0.9990459 -0.8989829 0.8989918 0.9990459 -0.8989796 0.8989796 0.9990458 -0.8989909 0.8989796 0.9990458 -0.8990052 0.8989796 0.9990458 -0.8990233 0.8989796 0.9990458 -0.8990462 0.8989796 0.9990458 -0.8990752 0.8989796 0.9990458 -0.8991118 0.8989796 0.9990458 -0.8991582 0.8989796 0.9990458 -0.8992169 0.8989796 0.9990458 -0.8992911 0.8989796 0.9990458 -0.899385 0.8989796 0.9990458 -0.8995038 0.8989796 0.9990458 -0.8996541 0.8989796 0.9990458 -0.8998443 0.8989796 0.9990458 -0.9000848 0.8989796 0.9990458 -0.9003892 0.8989796 0.9990458 -0.9007742 0.8989796 0.9990458 -0.9012613 0.8989796 0.9990458 -0.9018776 0.8989796 0.9990458 -0.9026573 0.8989796 0.9990458 -0.9036436 0.8989796 0.9990458 -0.9048915 0.8989796 0.9990458 -0.9064702 0.8989796 0.9990458 -0.9084676 0.8989796 0.9990458 -0.9109944 0.8989796 0.9990458 -0.9141912 0.8989796 0.9990458 -0.9182356 0.8989796 0.9990458 -0.9233522 0.8989796 0.9990458 -0.9298254 0.8989796 0.9990458 -0.9380149 0.8989796 0.9990458 -0.9483756 0.8989796 0.9990458 -0.9614833 0.8989796 0.9990458 -0.9780663 0.8989796 0.9990458 -0.9990458 0.8989796 0.9990458 -0.9992472 0.9187024 0.982362 -0.9994059 0.9348055 0.9751603 -0.9995309 0.9478691 0.9733768 -0.9996296 0.958412 0.9744973 -0.9997074 0.9668848 0.9770092 -0.9997689 0.973671 0.9800339 -0.9998174 0.9790917 0.9830858 -0.9998557 0.9834123 0.985917 -0.999886 0.9868501 0.9884196 -0.9999099 0.9895818 0.9905646 -0.9999288 0.9917499 0.9923652 -0.9999437 0.9934694 0.9938543 -0.8990028 0.8990535 0.9990461 -0.899002 0.8990519 0.9990461 -0.8990011 0.8990499 0.9990461 -0.899 0.8990474 0.9990461 -0.8989986 0.8990443 0.9990461 -0.8989969 0.8990404 0.9990461 -0.8989948 0.8990356 0.9990461 -0.8989923 0.8990296 0.999046 -0.8989895 0.8990224 0.999046 -0.8989863 0.8990136 0.9990459 -0.8989829 0.8990031 0.9990459 -0.8989796 0.8989909 0.9990458 -0.8989771 0.8989771 0.9990458 -0.8989915 0.8989771 0.9990458 -0.8990096 0.8989771 0.9990458 -0.8990325 0.8989771 0.9990458 -0.8990614 0.8989771 0.9990458 -0.8990981 0.8989771 0.9990458 -0.8991445 0.8989771 0.9990458 -0.8992032 0.8989771 0.9990458 -0.8992774 0.8989771 0.9990458 -0.8993713 0.8989771 0.9990458 -0.8994901 0.8989771 0.9990458 -0.8996405 0.8989771 0.9990458 -0.8998306 0.8989771 0.9990458 -0.9000712 0.8989771 0.9990458 -0.9003756 0.8989771 0.9990458 -0.9007607 0.8989771 0.9990458 -0.9012479 0.8989771 0.9990458 -0.9018642 0.8989771 0.9990458 -0.902644 0.8989771 0.9990458 -0.9036305 0.8989771 0.9990458 -0.9048786 0.8989771 0.9990458 -0.9064575 0.8989771 0.9990458 -0.9084551 0.8989771 0.9990458 -0.9109823 0.8989771 0.9990458 -0.9141795 0.8989771 0.9990458 -0.9182244 0.8989771 0.9990458 -0.9233418 0.8989771 0.9990458 -0.9298159 0.8989771 0.9990458 -0.9380065 0.8989771 0.9990458 -0.9483686 0.8989771 0.9990458 -0.9614781 0.8989771 0.9990458 -0.9780633 0.8989771 0.9990458 -0.9990458 0.8989771 0.9990458 -0.9992472 0.9187008 0.9823601 -0.9994058 0.9348044 0.9751582 -0.9995309 0.9478684 0.9733749 -0.9996296 0.9584115 0.9744959 -0.9997074 0.9668845 0.9770082 -0.9997689 0.9736708 0.9800332 -0.9998174 0.9790916 0.9830853 -0.9998557 0.9834122 0.9859167 -0.999886 0.9868501 0.9884194 -0.9999099 0.9895817 0.9905645 -0.9999288 0.9917499 0.9923651 -0.9999437 0.9934694 0.9938543 -0.8990028 0.8990678 0.9990461 -0.899002 0.8990662 0.9990461 -0.8990011 0.8990642 0.9990461 -0.899 0.8990617 0.9990461 -0.8989986 0.8990586 0.9990461 -0.8989969 0.8990547 0.9990461 -0.8989948 0.8990499 0.9990461 -0.8989923 0.8990439 0.999046 -0.8989895 0.8990367 0.999046 -0.8989863 0.8990279 0.9990459 -0.8989829 0.8990174 0.9990459 -0.8989796 0.8990052 0.9990458 -0.8989771 0.8989915 0.9990458 -0.8989767 0.8989767 0.9990457 -0.8989948 0.8989767 0.9990457 -0.8990177 0.8989767 0.9990457 -0.8990467 0.8989767 0.9990457 -0.8990834 0.8989767 0.9990457 -0.8991298 0.8989767 0.9990457 -0.8991885 0.8989767 0.9990457 -0.8992627 0.8989767 0.9990457 -0.8993566 0.8989767 0.9990457 -0.8994755 0.8989767 0.9990457 -0.8996258 0.8989767 0.9990457 -0.899816 0.8989767 0.9990457 -0.9000567 0.8989767 0.9990457 -0.9003611 0.8989767 0.9990457 -0.9007462 0.8989767 0.9990457 -0.9012335 0.8989767 0.9990457 -0.9018499 0.8989767 0.9990457 -0.9026298 0.8989767 0.9990457 -0.9036165 0.8989767 0.9990457 -0.9048647 0.8989767 0.9990457 -0.9064439 0.8989767 0.9990457 -0.9084417 0.8989767 0.9990457 -0.9109693 0.8989767 0.9990457 -0.914167 0.8989767 0.9990457 -0.9182125 0.8989767 0.9990457 -0.9233306 0.8989767 0.9990457 -0.9298057 0.8989767 0.9990457 -0.9379975 0.8989767 0.9990457 -0.9483611 0.8989767 0.9990457 -0.9614726 0.8989767 0.9990457 -0.9780602 0.8989767 0.9990457 -0.9990457 0.8989767 0.9990457 -0.9992471 0.9187004 0.9823581 -0.9994058 0.9348042 0.9751559 -0.9995309 0.9478683 0.973373 -0.9996295 0.9584114 0.9744944 -0.9997074 0.9668844 0.9770071 -0.9997689 0.9736708 0.9800325 -0.9998174 0.9790916 0.9830848 -0.9998557 0.9834122 0.9859164 -0.999886 0.98685 0.9884192 -0.9999099 0.9895817 0.9905644 -0.9999288 0.9917499 0.992365 -0.9999437 0.9934694 0.9938542 -0.8990028 0.8990859 0.9990461 -0.899002 0.8990843 0.9990461 -0.8990011 0.8990823 0.9990461 -0.899 0.8990798 0.9990461 -0.8989986 0.8990767 0.9990461 -0.8989969 0.8990728 0.9990461 -0.8989948 0.899068 0.9990461 -0.8989923 0.899062 0.999046 -0.8989895 0.8990548 0.999046 -0.8989863 0.899046 0.9990459 -0.8989829 0.8990355 0.9990459 -0.8989796 0.8990233 0.9990458 -0.8989771 0.8990096 0.9990458 -0.8989767 0.8989948 0.9990457 -0.8989805 0.8989805 0.9990456 -0.8990034 0.8989805 0.9990456 -0.8990324 0.8989805 0.9990456 -0.8990691 0.8989805 0.9990456 -0.8991155 0.8989805 0.9990456 -0.8991742 0.8989805 0.9990456 -0.8992484 0.8989805 0.9990456 -0.8993424 0.8989805 0.9990456 -0.8994612 0.8989805 0.9990456 -0.8996116 0.8989805 0.9990456 -0.8998018 0.8989805 0.9990456 -0.9000425 0.8989805 0.9990456 -0.9003469 0.8989805 0.9990456 -0.9007321 0.8989805 0.9990456 -0.9012195 0.8989805 0.9990456 -0.901836 0.8989805 0.9990456 -0.902616 0.8989805 0.9990456 -0.9036028 0.8989805 0.9990456 -0.9048512 0.8989805 0.9990456 -0.9064306 0.8989805 0.9990456 -0.9084287 0.8989805 0.9990456 -0.9109567 0.8989805 0.9990456 -0.9141548 0.8989805 0.9990456 -0.9182009 0.8989805 0.9990456 -0.9233198 0.8989805 0.9990456 -0.9297957 0.8989805 0.9990456 -0.9379887 0.8989805 0.9990456 -0.9483538 0.8989805 0.9990456 -0.9614671 0.8989805 0.9990456 -0.9780571 0.8989805 0.9990456 -0.9990456 0.8989805 0.9990456 -0.9992471 0.9187027 0.9823561 -0.9994058 0.9348056 0.9751537 -0.9995309 0.9478691 0.9733711 -0.9996295 0.958412 0.974493 -0.9997074 0.9668847 0.9770061 -0.9997688 0.973671 0.9800318 -0.9998174 0.9790917 0.9830843 -0.9998557 0.9834123 0.985916 -0.999886 0.9868501 0.988419 -0.9999099 0.9895817 0.9905642 -0.9999288 0.9917499 0.9923649 -0.9999437 0.9934694 0.9938542 -0.8990028 0.8991088 0.9990461 -0.899002 0.8991072 0.9990461 -0.8990011 0.8991052 0.9990461 -0.899 0.8991027 0.9990461 -0.8989986 0.8990996 0.9990461 -0.8989969 0.8990957 0.9990461 -0.8989948 0.8990909 0.9990461 -0.8989923 0.8990849 0.999046 -0.8989895 0.8990777 0.999046 -0.8989863 0.8990689 0.9990459 -0.8989829 0.8990584 0.9990459 -0.8989796 0.8990462 0.9990458 -0.8989771 0.8990325 0.9990458 -0.8989767 0.8990177 0.9990457 -0.8989805 0.8990034 0.9990456 -0.8989921 0.8989921 0.9990456 -0.8990211 0.8989921 0.9990456 -0.8990578 0.8989921 0.9990456 -0.8991042 0.8989921 0.9990456 -0.8991629 0.8989921 0.9990456 -0.8992372 0.8989921 0.9990456 -0.8993311 0.8989921 0.9990456 -0.89945 0.8989921 0.9990456 -0.8996004 0.8989921 0.9990456 -0.8997906 0.8989921 0.9990456 -0.9000313 0.8989921 0.9990456 -0.9003358 0.8989921 0.9990456 -0.9007211 0.8989921 0.9990456 -0.9012084 0.8989921 0.9990456 -0.901825 0.8989921 0.9990456 -0.9026051 0.8989921 0.9990456 -0.903592 0.8989921 0.9990456 -0.9048406 0.8989921 0.9990456 -0.9064202 0.8989921 0.9990456 -0.9084185 0.8989921 0.9990456 -0.9109467 0.8989921 0.9990456 -0.9141453 0.8989921 0.9990456 -0.9181918 0.8989921 0.9990456 -0.9233112 0.8989921 0.9990456 -0.9297879 0.8989921 0.9990456 -0.9379818 0.8989921 0.9990456 -0.9483481 0.8989921 0.9990456 -0.9614628 0.8989921 0.9990456 -0.9780547 0.8989921 0.9990456 -0.9990456 0.8989921 0.9990456 -0.999247 0.9187101 0.9823545 -0.9994057 0.9348102 0.9751519 -0.9995309 0.947872 0.9733696 -0.9996295 0.9584138 0.9744918 -0.9997074 0.9668859 0.9770053 -0.9997688 0.9736717 0.9800312 -0.9998174 0.9790921 0.9830839 -0.9998557 0.9834126 0.9859158 -0.999886 0.9868503 0.9884188 -0.9999099 0.9895819 0.9905641 -0.9999288 0.99175 0.9923648 -0.9999437 0.9934694 0.9938541 -0.8990028 0.8991377 0.9990461 -0.899002 0.8991362 0.9990461 -0.8990011 0.8991342 0.9990461 -0.899 0.8991317 0.9990461 -0.8989986 0.8991285 0.9990461 -0.8989969 0.8991246 0.9990461 -0.8989948 0.8991198 0.9990461 -0.8989923 0.8991139 0.999046 -0.8989895 0.8991066 0.999046 -0.8989863 0.8990978 0.9990459 -0.8989829 0.8990874 0.9990459 -0.8989796 0.8990752 0.9990458 -0.8989771 0.8990614 0.9990458 -0.8989767 0.8990467 0.9990457 -0.8989805 0.8990324 0.9990456 -0.8989921 0.8990211 0.9990456 -0.8990175 0.8990175 0.9990455 -0.8990542 0.8990175 0.9990455 -0.8991006 0.8990175 0.9990455 -0.8991593 0.8990175 0.9990455 -0.8992336 0.8990175 0.9990455 -0.8993275 0.8990175 0.9990455 -0.8994464 0.8990175 0.9990455 -0.8995968 0.8990175 0.9990455 -0.899787 0.8990175 0.9990455 -0.9000277 0.8990175 0.9990455 -0.9003323 0.8990175 0.9990455 -0.9007175 0.8990175 0.9990455 -0.9012049 0.8990175 0.9990455 -0.9018215 0.8990175 0.9990455 -0.9026016 0.8990175 0.9990455 -0.9035886 0.8990175 0.9990455 -0.9048372 0.8990175 0.9990455 -0.9064168 0.8990175 0.9990455 -0.9084153 0.8990175 0.9990455 -0.9109436 0.8990175 0.9990455 -0.9141422 0.8990175 0.9990455 -0.9181889 0.8990175 0.9990455 -0.9233085 0.8990175 0.9990455 -0.9297854 0.8990175 0.9990455 -0.9379796 0.8990175 0.9990455 -0.9483463 0.8990175 0.9990455 -0.9614615 0.8990175 0.9990455 -0.9780539 0.8990175 0.9990455 -0.9990455 0.8990175 0.9990455 -0.999247 0.9187262 0.982354 -0.9994057 0.9348204 0.9751513 -0.9995308 0.9478785 0.9733691 -0.9996295 0.9584178 0.9744915 -0.9997074 0.9668884 0.977005 -0.9997688 0.9736733 0.980031 -0.9998174 0.9790931 0.9830838 -0.9998557 0.9834132 0.9859157 -0.999886 0.9868507 0.9884188 -0.9999099 0.9895821 0.9905641 -0.9999288 0.9917502 0.9923648 -0.9999437 0.9934695 0.9938541 -0.8990028 0.8991744 0.9990461 -0.899002 0.8991728 0.9990461 -0.8990011 0.8991708 0.9990461 -0.899 0.8991683 0.9990461 -0.8989986 0.8991652 0.9990461 -0.8989969 0.8991613 0.9990461 -0.8989948 0.8991565 0.9990461 -0.8989923 0.8991505 0.999046 -0.8989895 0.8991433 0.999046 -0.8989863 0.8991345 0.9990459 -0.8989829 0.899124 0.9990459 -0.8989796 0.8991118 0.9990458 -0.8989771 0.8990981 0.9990458 -0.8989767 0.8990834 0.9990457 -0.8989805 0.8990691 0.9990456 -0.8989921 0.8990578 0.9990456 -0.8990175 0.8990542 0.9990455 -0.8990542 0.8990542 0.9990455 -0.8991006 0.8990542 0.9990455 -0.8991593 0.8990542 0.9990455 -0.8992336 0.8990542 0.9990455 -0.8993275 0.8990542 0.9990455 -0.8994464 0.8990542 0.9990455 -0.8995968 0.8990542 0.9990455 -0.899787 0.8990542 0.9990455 -0.9000277 0.8990542 0.9990455 -0.9003323 0.8990542 0.9990455 -0.9007175 0.8990542 0.9990455 -0.9012049 0.8990542 0.9990455 -0.9018215 0.8990542 0.9990455 -0.9026016 0.8990542 0.9990455 -0.9035886 0.8990542 0.9990455 -0.9048372 0.8990542 0.9990455 -0.9064168 0.8990542 0.9990455 -0.9084153 0.8990542 0.9990455 -0.9109436 0.8990542 0.9990455 -0.9141422 0.8990542 0.9990455 -0.9181889 0.8990542 0.9990455 -0.9233085 0.8990542 0.9990455 -0.9297854 0.8990542 0.9990455 -0.9379796 0.8990542 0.9990455 -0.9483463 0.8990542 0.9990455 -0.9614615 0.8990542 0.9990455 -0.9780539 0.8990542 0.9990455 -0.9990455 0.8990542 0.9990455 -0.999247 0.9187495 0.982354 -0.9994057 0.9348352 0.9751513 -0.9995308 0.9478878 0.9733691 -0.9996295 0.9584237 0.9744915 -0.9997074 0.9668922 0.977005 -0.9997688 0.9736756 0.980031 -0.9998174 0.9790946 0.9830838 -0.9998557 0.9834141 0.9859157 -0.999886 0.9868512 0.9884188 -0.9999099 0.9895825 0.9905641 -0.9999288 0.9917504 0.9923648 -0.9999437 0.9934697 0.9938541 -0.8990028 0.8992207 0.9990461 -0.899002 0.8992191 0.9990461 -0.8990011 0.8992171 0.9990461 -0.899 0.8992146 0.9990461 -0.8989986 0.8992115 0.9990461 -0.8989969 0.8992076 0.9990461 -0.8989948 0.8992028 0.9990461 -0.8989923 0.8991969 0.999046 -0.8989895 0.8991896 0.999046 -0.8989863 0.8991809 0.9990459 -0.8989829 0.8991704 0.9990459 -0.8989796 0.8991582 0.9990458 -0.8989771 0.8991445 0.9990458 -0.8989767 0.8991298 0.9990457 -0.8989805 0.8991155 0.9990456 -0.8989921 0.8991042 0.9990456 -0.8990175 0.8991006 0.9990455 -0.8990542 0.8991006 0.9990455 -0.8991006 0.8991006 0.9990455 -0.8991593 0.8991006 0.9990455 -0.8992336 0.8991006 0.9990455 -0.8993275 0.8991006 0.9990455 -0.8994464 0.8991006 0.9990455 -0.8995968 0.8991006 0.9990455 -0.899787 0.8991006 0.9990455 -0.9000277 0.8991006 0.9990455 -0.9003323 0.8991006 0.9990455 -0.9007175 0.8991006 0.9990455 -0.9012049 0.8991006 0.9990455 -0.9018215 0.8991006 0.9990455 -0.9026016 0.8991006 0.9990455 -0.9035886 0.8991006 0.9990455 -0.9048372 0.8991006 0.9990455 -0.9064168 0.8991006 0.9990455 -0.9084153 0.8991006 0.9990455 -0.9109436 0.8991006 0.9990455 -0.9141422 0.8991006 0.9990455 -0.9181889 0.8991006 0.9990455 -0.9233085 0.8991006 0.9990455 -0.9297854 0.8991006 0.9990455 -0.9379796 0.8991006 0.9990455 -0.9483463 0.8991006 0.9990455 -0.9614615 0.8991006 0.9990455 -0.9780539 0.8991006 0.9990455 -0.9990455 0.8991006 0.9990455 -0.999247 0.9187791 0.982354 -0.9994057 0.9348539 0.9751513 -0.9995308 0.9478997 0.9733691 -0.9996295 0.9584312 0.9744915 -0.9997074 0.9668969 0.977005 -0.9997688 0.9736786 0.980031 -0.9998174 0.9790965 0.9830838 -0.9998557 0.9834153 0.9859157 -0.999886 0.986852 0.9884188 -0.9999099 0.9895829 0.9905641 -0.9999288 0.9917507 0.9923648 -0.9999437 0.9934698 0.9938541 -0.8990028 0.8992794 0.9990461 -0.899002 0.8992778 0.9990461 -0.8990011 0.8992758 0.9990461 -0.899 0.8992733 0.9990461 -0.8989986 0.8992702 0.9990461 -0.8989969 0.8992663 0.9990461 -0.8989948 0.8992615 0.9990461 -0.8989923 0.8992555 0.999046 -0.8989895 0.8992483 0.999046 -0.8989863 0.8992395 0.9990459 -0.8989829 0.8992291 0.9990459 -0.8989796 0.8992169 0.9990458 -0.8989771 0.8992032 0.9990458 -0.8989767 0.8991885 0.9990457 -0.8989805 0.8991742 0.9990456 -0.8989921 0.8991629 0.9990456 -0.8990175 0.8991593 0.9990455 -0.8990542 0.8991593 0.9990455 -0.8991006 0.8991593 0.9990455 -0.8991593 0.8991593 0.9990455 -0.8992336 0.8991593 0.9990455 -0.8993275 0.8991593 0.9990455 -0.8994464 0.8991593 0.9990455 -0.8995968 0.8991593 0.9990455 -0.899787 0.8991593 0.9990455 -0.9000277 0.8991593 0.9990455 -0.9003323 0.8991593 0.9990455 -0.9007175 0.8991593 0.9990455 -0.9012049 0.8991593 0.9990455 -0.9018215 0.8991593 0.9990455 -0.9026016 0.8991593 0.9990455 -0.9035886 0.8991593 0.9990455 -0.9048372 0.8991593 0.9990455 -0.9064168 0.8991593 0.9990455 -0.9084153 0.8991593 0.9990455 -0.9109436 0.8991593 0.9990455 -0.9141422 0.8991593 0.9990455 -0.9181889 0.8991593 0.9990455 -0.9233085 0.8991593 0.9990455 -0.9297854 0.8991593 0.9990455 -0.9379796 0.8991593 0.9990455 -0.9483463 0.8991593 0.9990455 -0.9614615 0.8991593 0.9990455 -0.9780539 0.8991593 0.9990455 -0.9990455 0.8991593 0.9990455 -0.999247 0.9188164 0.982354 -0.9994057 0.9348776 0.9751513 -0.9995308 0.9479146 0.9733691 -0.9996295 0.9584406 0.9744915 -0.9997074 0.9669028 0.977005 -0.9997688 0.9736823 0.980031 -0.9998174 0.9790988 0.9830838 -0.9998557 0.9834167 0.9859157 -0.999886 0.9868529 0.9884188 -0.9999099 0.9895835 0.9905641 -0.9999288 0.991751 0.9923648 -0.9999437 0.9934701 0.9938541 -0.8990028 0.8993535 0.9990461 -0.899002 0.899352 0.9990461 -0.8990011 0.89935 0.9990461 -0.899 0.8993475 0.9990461 -0.8989986 0.8993443 0.9990461 -0.8989969 0.8993405 0.9990461 -0.8989948 0.8993357 0.9990461 -0.8989923 0.8993297 0.999046 -0.8989895 0.8993225 0.999046 -0.8989863 0.8993137 0.9990459 -0.8989829 0.8993033 0.9990459 -0.8989796 0.8992911 0.9990458 -0.8989771 0.8992774 0.9990458 -0.8989767 0.8992627 0.9990457 -0.8989805 0.8992484 0.9990456 -0.8989921 0.8992372 0.9990456 -0.8990175 0.8992336 0.9990455 -0.8990542 0.8992336 0.9990455 -0.8991006 0.8992336 0.9990455 -0.8991593 0.8992336 0.9990455 -0.8992336 0.8992336 0.9990455 -0.8993275 0.8992336 0.9990455 -0.8994464 0.8992336 0.9990455 -0.8995968 0.8992336 0.9990455 -0.899787 0.8992336 0.9990455 -0.9000277 0.8992336 0.9990455 -0.9003323 0.8992336 0.9990455 -0.9007175 0.8992336 0.9990455 -0.9012049 0.8992336 0.9990455 -0.9018215 0.8992336 0.9990455 -0.9026016 0.8992336 0.9990455 -0.9035886 0.8992336 0.9990455 -0.9048372 0.8992336 0.9990455 -0.9064168 0.8992336 0.9990455 -0.9084153 0.8992336 0.9990455 -0.9109436 0.8992336 0.9990455 -0.9141422 0.8992336 0.9990455 -0.9181889 0.8992336 0.9990455 -0.9233085 0.8992336 0.9990455 -0.9297854 0.8992336 0.9990455 -0.9379796 0.8992336 0.9990455 -0.9483463 0.8992336 0.9990455 -0.9614615 0.8992336 0.9990455 -0.9780539 0.8992336 0.9990455 -0.9990455 0.8992336 0.9990455 -0.999247 0.9188636 0.982354 -0.9994057 0.9349075 0.9751513 -0.9995308 0.9479335 0.9733691 -0.9996295 0.9584526 0.9744915 -0.9997074 0.9669103 0.977005 -0.9997688 0.973687 0.980031 -0.9998174 0.9791018 0.9830838 -0.9998557 0.9834186 0.9859157 -0.999886 0.9868541 0.9884188 -0.9999099 0.9895842 0.9905641 -0.9999288 0.9917515 0.9923648 -0.9999437 0.9934704 0.9938541 -0.8990028 0.8994474 0.9990461 -0.899002 0.8994458 0.9990461 -0.8990011 0.8994438 0.9990461 -0.899 0.8994413 0.9990461 -0.8989986 0.8994382 0.9990461 -0.8989969 0.8994343 0.9990461 -0.8989948 0.8994295 0.9990461 -0.8989923 0.8994236 0.999046 -0.8989895 0.8994164 0.999046 -0.8989863 0.8994076 0.9990459 -0.8989829 0.8993972 0.9990459 -0.8989796 0.899385 0.9990458 -0.8989771 0.8993713 0.9990458 -0.8989767 0.8993566 0.9990457 -0.8989805 0.8993424 0.9990456 -0.8989921 0.8993311 0.9990456 -0.8990175 0.8993275 0.9990455 -0.8990542 0.8993275 0.9990455 -0.8991006 0.8993275 0.9990455 -0.8991593 0.8993275 0.9990455 -0.8992336 0.8993275 0.9990455 -0.8993275 0.8993275 0.9990455 -0.8994464 0.8993275 0.9990455 -0.8995968 0.8993275 0.9990455 -0.899787 0.8993275 0.9990455 -0.9000277 0.8993275 0.9990455 -0.9003323 0.8993275 0.9990455 -0.9007175 0.8993275 0.9990455 -0.9012049 0.8993275 0.9990455 -0.9018215 0.8993275 0.9990455 -0.9026016 0.8993275 0.9990455 -0.9035886 0.8993275 0.9990455 -0.9048372 0.8993275 0.9990455 -0.9064168 0.8993275 0.9990455 -0.9084153 0.8993275 0.9990455 -0.9109436 0.8993275 0.9990455 -0.9141422 0.8993275 0.9990455 -0.9181889 0.8993275 0.9990455 -0.9233085 0.8993275 0.9990455 -0.9297854 0.8993275 0.9990455 -0.9379796 0.8993275 0.9990455 -0.9483463 0.8993275 0.9990455 -0.9614615 0.8993275 0.9990455 -0.9780539 0.8993275 0.9990455 -0.9990455 0.8993275 0.9990455 -0.999247 0.9189234 0.982354 -0.9994057 0.9349454 0.9751513 -0.9995308 0.9479575 0.9733691 -0.9996295 0.9584677 0.9744915 -0.9997074 0.9669198 0.977005 -0.9997688 0.973693 0.980031 -0.9998174 0.9791055 0.9830838 -0.9998557 0.9834209 0.9859157 -0.999886 0.9868555 0.9884188 -0.9999099 0.9895851 0.9905641 -0.9999288 0.9917521 0.9923648 -0.9999437 0.9934707 0.9938541 -0.8990028 0.8995661 0.9990461 -0.899002 0.8995645 0.9990461 -0.8990011 0.8995625 0.9990461 -0.899 0.8995601 0.9990461 -0.8989986 0.8995569 0.9990461 -0.8989969 0.8995531 0.9990461 -0.8989948 0.8995483 0.9990461 -0.8989923 0.8995424 0.999046 -0.8989895 0.8995351 0.999046 -0.8989863 0.8995264 0.9990459 -0.8989829 0.899516 0.9990459 -0.8989796 0.8995038 0.9990458 -0.8989771 0.8994901 0.9990458 -0.8989767 0.8994755 0.9990457 -0.8989805 0.8994612 0.9990456 -0.8989921 0.89945 0.9990456 -0.8990175 0.8994464 0.9990455 -0.8990542 0.8994464 0.9990455 -0.8991006 0.8994464 0.9990455 -0.8991593 0.8994464 0.9990455 -0.8992336 0.8994464 0.9990455 -0.8993275 0.8994464 0.9990455 -0.8994464 0.8994464 0.9990455 -0.8995968 0.8994464 0.9990455 -0.899787 0.8994464 0.9990455 -0.9000277 0.8994464 0.9990455 -0.9003323 0.8994464 0.9990455 -0.9007175 0.8994464 0.9990455 -0.9012049 0.8994464 0.9990455 -0.9018215 0.8994464 0.9990455 -0.9026016 0.8994464 0.9990455 -0.9035886 0.8994464 0.9990455 -0.9048372 0.8994464 0.9990455 -0.9064168 0.8994464 0.9990455 -0.9084153 0.8994464 0.9990455 -0.9109436 0.8994464 0.9990455 -0.9141422 0.8994464 0.9990455 -0.9181889 0.8994464 0.9990455 -0.9233085 0.8994464 0.9990455 -0.9297854 0.8994464 0.9990455 -0.9379796 0.8994464 0.9990455 -0.9483463 0.8994464 0.9990455 -0.9614615 0.8994464 0.9990455 -0.9780539 0.8994464 0.9990455 -0.9990455 0.8994464 0.9990455 -0.999247 0.918999 0.982354 -0.9994057 0.9349933 0.9751513 -0.9995308 0.9479878 0.9733691 -0.9996295 0.9584868 0.9744915 -0.9997074 0.9669318 0.977005 -0.9997688 0.9737006 0.980031 -0.9998174 0.9791103 0.9830838 -0.9998557 0.9834239 0.9859157 -0.999886 0.9868574 0.9884188 -0.9999099 0.9895863 0.9905641 -0.9999288 0.9917528 0.9923648 -0.9999437 0.9934712 0.9938541 -0.8990028 0.8997163 0.9990461 -0.899002 0.8997147 0.9990461 -0.8990011 0.8997128 0.9990461 -0.899 0.8997103 0.9990461 -0.8989986 0.8997072 0.9990461 -0.8989969 0.8997033 0.9990461 -0.8989948 0.8996985 0.9990461 -0.8989923 0.8996926 0.999046 -0.8989895 0.8996854 0.999046 -0.8989863 0.8996766 0.9990459 -0.8989829 0.8996662 0.9990459 -0.8989796 0.8996541 0.9990458 -0.8989771 0.8996405 0.9990458 -0.8989767 0.8996258 0.9990457 -0.8989805 0.8996116 0.9990456 -0.8989921 0.8996004 0.9990456 -0.8990175 0.8995968 0.9990455 -0.8990542 0.8995968 0.9990455 -0.8991006 0.8995968 0.9990455 -0.8991593 0.8995968 0.9990455 -0.8992336 0.8995968 0.9990455 -0.8993275 0.8995968 0.9990455 -0.8994464 0.8995968 0.9990455 -0.8995968 0.8995968 0.9990455 -0.899787 0.8995968 0.9990455 -0.9000277 0.8995968 0.9990455 -0.9003323 0.8995968 0.9990455 -0.9007175 0.8995968 0.9990455 -0.9012049 0.8995968 0.9990455 -0.9018215 0.8995968 0.9990455 -0.9026016 0.8995968 0.9990455 -0.9035886 0.8995968 0.9990455 -0.9048372 0.8995968 0.9990455 -0.9064168 0.8995968 0.9990455 -0.9084153 0.8995968 0.9990455 -0.9109436 0.8995968 0.9990455 -0.9141422 0.8995968 0.9990455 -0.9181889 0.8995968 0.9990455 -0.9233085 0.8995968 0.9990455 -0.9297854 0.8995968 0.9990455 -0.9379796 0.8995968 0.9990455 -0.9483463 0.8995968 0.9990455 -0.9614615 0.8995968 0.9990455 -0.9780539 0.8995968 0.9990455 -0.9990455 0.8995968 0.9990455 -0.999247 0.9190947 0.982354 -0.9994057 0.935054 0.9751513 -0.9995308 0.9480261 0.9733691 -0.9996295 0.9585109 0.9744915 -0.9997074 0.966947 0.977005 -0.9997688 0.9737101 0.980031 -0.9998174 0.9791163 0.9830838 -0.9998557 0.9834277 0.9859157 -0.999886 0.9868597 0.9884188 -0.9999099 0.9895878 0.9905641 -0.9999288 0.9917537 0.9923648 -0.9999437 0.9934718 0.9938541 -0.8990028 0.8999063 0.9990461 -0.899002 0.8999048 0.9990461 -0.8990011 0.8999028 0.9990461 -0.899 0.8999003 0.9990461 -0.8989986 0.8998972 0.9990461 -0.8989969 0.8998934 0.9990461 -0.8989948 0.8998886 0.9990461 -0.8989923 0.8998827 0.999046 -0.8989895 0.8998755 0.999046 -0.8989863 0.8998667 0.9990459 -0.8989829 0.8998564 0.9990459 -0.8989796 0.8998443 0.9990458 -0.8989771 0.8998306 0.9990458 -0.8989767 0.899816 0.9990457 -0.8989805 0.8998018 0.9990456 -0.8989921 0.8997906 0.9990456 -0.8990175 0.899787 0.9990455 -0.8990542 0.899787 0.9990455 -0.8991006 0.899787 0.9990455 -0.8991593 0.899787 0.9990455 -0.8992336 0.899787 0.9990455 -0.8993275 0.899787 0.9990455 -0.8994464 0.899787 0.9990455 -0.8995968 0.899787 0.9990455 -0.899787 0.899787 0.9990455 -0.9000277 0.899787 0.9990455 -0.9003323 0.899787 0.9990455 -0.9007175 0.899787 0.9990455 -0.9012049 0.899787 0.9990455 -0.9018215 0.899787 0.9990455 -0.9026016 0.899787 0.9990455 -0.9035886 0.899787 0.9990455 -0.9048372 0.899787 0.9990455 -0.9064168 0.899787 0.9990455 -0.9084153 0.899787 0.9990455 -0.9109436 0.899787 0.9990455 -0.9141422 0.899787 0.9990455 -0.9181889 0.899787 0.9990455 -0.9233085 0.899787 0.9990455 -0.9297854 0.899787 0.9990455 -0.9379796 0.899787 0.9990455 -0.9483463 0.899787 0.9990455 -0.9614615 0.899787 0.9990455 -0.9780539 0.899787 0.9990455 -0.9990455 0.899787 0.9990455 -0.999247 0.9192157 0.982354 -0.9994057 0.9351307 0.9751513 -0.9995308 0.9480746 0.9733691 -0.9996295 0.9585415 0.9744915 -0.9997074 0.9669663 0.977005 -0.9997688 0.9737222 0.980031 -0.9998174 0.9791238 0.9830838 -0.9998557 0.9834324 0.9859157 -0.999886 0.9868627 0.9884188 -0.9999099 0.9895897 0.9905641 -0.9999288 0.9917549 0.9923648 -0.9999437 0.9934725 0.9938541 -0.8990028 0.9001468 0.9990461 -0.899002 0.9001452 0.9990461 -0.8990011 0.9001432 0.9990461 -0.899 0.9001407 0.9990461 -0.8989986 0.9001376 0.9990461 -0.8989969 0.9001338 0.9990461 -0.8989948 0.900129 0.9990461 -0.8989923 0.9001231 0.999046 -0.8989895 0.9001159 0.999046 -0.8989863 0.9001073 0.9990459 -0.8989829 0.9000969 0.9990459 -0.8989796 0.9000848 0.9990458 -0.8989771 0.9000712 0.9990458 -0.8989767 0.9000567 0.9990457 -0.8989805 0.9000425 0.9990456 -0.8989921 0.9000313 0.9990456 -0.8990175 0.9000277 0.9990455 -0.8990542 0.9000277 0.9990455 -0.8991006 0.9000277 0.9990455 -0.8991593 0.9000277 0.9990455 -0.8992336 0.9000277 0.9990455 -0.8993275 0.9000277 0.9990455 -0.8994464 0.9000277 0.9990455 -0.8995968 0.9000277 0.9990455 -0.899787 0.9000277 0.9990455 -0.9000277 0.9000277 0.9990455 -0.9003323 0.9000277 0.9990455 -0.9007175 0.9000277 0.9990455 -0.9012049 0.9000277 0.9990455 -0.9018215 0.9000277 0.9990455 -0.9026016 0.9000277 0.9990455 -0.9035886 0.9000277 0.9990455 -0.9048372 0.9000277 0.9990455 -0.9064168 0.9000277 0.9990455 -0.9084153 0.9000277 0.9990455 -0.9109436 0.9000277 0.9990455 -0.9141422 0.9000277 0.9990455 -0.9181889 0.9000277 0.9990455 -0.9233085 0.9000277 0.9990455 -0.9297854 0.9000277 0.9990455 -0.9379796 0.9000277 0.9990455 -0.9483463 0.9000277 0.9990455 -0.9614615 0.9000277 0.9990455 -0.9780539 0.9000277 0.9990455 -0.9990455 0.9000277 0.9990455 -0.999247 0.9193688 0.982354 -0.9994057 0.9352277 0.9751513 -0.9995308 0.9481359 0.9733691 -0.9996295 0.9585802 0.9744915 -0.9997074 0.9669906 0.977005 -0.9997688 0.9737375 0.980031 -0.9998174 0.9791334 0.9830838 -0.9998557 0.9834385 0.9859157 -0.999886 0.9868665 0.9884188 -0.9999099 0.989592 0.9905641 -0.9999288 0.9917564 0.9923648 -0.9999437 0.9934734 0.9938541 -0.8990028 0.9004509 0.9990461 -0.899002 0.9004493 0.9990461 -0.8990011 0.9004474 0.9990461 -0.899 0.9004449 0.9990461 -0.8989986 0.9004418 0.9990461 -0.8989969 0.900438 0.9990461 -0.8989948 0.9004332 0.9990461 -0.8989923 0.9004274 0.999046 -0.8989895 0.9004202 0.999046 -0.8989863 0.9004115 0.9990459 -0.8989829 0.9004012 0.9990459 -0.8989796 0.9003892 0.9990458 -0.8989771 0.9003756 0.9990458 -0.8989767 0.9003611 0.9990457 -0.8989805 0.9003469 0.9990456 -0.8989921 0.9003358 0.9990456 -0.8990175 0.9003323 0.9990455 -0.8990542 0.9003323 0.9990455 -0.8991006 0.9003323 0.9990455 -0.8991593 0.9003323 0.9990455 -0.8992336 0.9003323 0.9990455 -0.8993275 0.9003323 0.9990455 -0.8994464 0.9003323 0.9990455 -0.8995968 0.9003323 0.9990455 -0.899787 0.9003323 0.9990455 -0.9000277 0.9003323 0.9990455 -0.9003323 0.9003323 0.9990455 -0.9007175 0.9003323 0.9990455 -0.9012049 0.9003323 0.9990455 -0.9018215 0.9003323 0.9990455 -0.9026016 0.9003323 0.9990455 -0.9035886 0.9003323 0.9990455 -0.9048372 0.9003323 0.9990455 -0.9064168 0.9003323 0.9990455 -0.9084153 0.9003323 0.9990455 -0.9109436 0.9003323 0.9990455 -0.9141422 0.9003323 0.9990455 -0.9181889 0.9003323 0.9990455 -0.9233085 0.9003323 0.9990455 -0.9297854 0.9003323 0.9990455 -0.9379796 0.9003323 0.9990455 -0.9483463 0.9003323 0.9990455 -0.9614615 0.9003323 0.9990455 -0.9780539 0.9003323 0.9990455 -0.9990455 0.9003323 0.9990455 -0.999247 0.9195625 0.982354 -0.9994057 0.9353505 0.9751513 -0.9995308 0.9482135 0.9733691 -0.9996295 0.9586291 0.9744915 -0.9997074 0.9670214 0.977005 -0.9997688 0.9737569 0.980031 -0.9998174 0.9791456 0.9830838 -0.9998557 0.9834461 0.9859157 -0.999886 0.9868713 0.9884188 -0.9999099 0.989595 0.9905641 -0.9999288 0.9917582 0.9923648 -0.9999437 0.9934746 0.9938541 -0.8990028 0.9008357 0.9990461 -0.899002 0.9008341 0.9990461 -0.8990011 0.9008322 0.9990461 -0.899 0.9008297 0.9990461 -0.8989986 0.9008267 0.9990461 -0.8989969 0.9008228 0.9990461 -0.8989948 0.9008181 0.9990461 -0.8989923 0.9008122 0.999046 -0.8989895 0.9008051 0.999046 -0.8989863 0.9007965 0.9990459 -0.8989829 0.9007862 0.9990459 -0.8989796 0.9007742 0.9990458 -0.8989771 0.9007607 0.9990458 -0.8989767 0.9007462 0.9990457 -0.8989805 0.9007321 0.9990456 -0.8989921 0.9007211 0.9990456 -0.8990175 0.9007175 0.9990455 -0.8990542 0.9007175 0.9990455 -0.8991006 0.9007175 0.9990455 -0.8991593 0.9007175 0.9990455 -0.8992336 0.9007175 0.9990455 -0.8993275 0.9007175 0.9990455 -0.8994464 0.9007175 0.9990455 -0.8995968 0.9007175 0.9990455 -0.899787 0.9007175 0.9990455 -0.9000277 0.9007175 0.9990455 -0.9003323 0.9007175 0.9990455 -0.9007175 0.9007175 0.9990455 -0.9012049 0.9007175 0.9990455 -0.9018215 0.9007175 0.9990455 -0.9026016 0.9007175 0.9990455 -0.9035886 0.9007175 0.9990455 -0.9048372 0.9007175 0.9990455 -0.9064168 0.9007175 0.9990455 -0.9084153 0.9007175 0.9990455 -0.9109436 0.9007175 0.9990455 -0.9141422 0.9007175 0.9990455 -0.9181889 0.9007175 0.9990455 -0.9233085 0.9007175 0.9990455 -0.9297854 0.9007175 0.9990455 -0.9379796 0.9007175 0.9990455 -0.9483463 0.9007175 0.9990455 -0.9614615 0.9007175 0.9990455 -0.9780539 0.9007175 0.9990455 -0.9990455 0.9007175 0.9990455 -0.999247 0.9198076 0.982354 -0.9994057 0.9355059 0.9751513 -0.9995308 0.9483117 0.9733691 -0.9996295 0.958691 0.9744915 -0.9997074 0.9670604 0.977005 -0.9997688 0.9737814 0.980031 -0.9998174 0.979161 0.9830838 -0.9998557 0.9834557 0.9859157 -0.999886 0.9868773 0.9884188 -0.9999099 0.9895988 0.9905641 -0.9999288 0.9917606 0.9923648 -0.9999437 0.9934761 0.9938541 -0.8990028 0.9013225 0.9990461 -0.899002 0.901321 0.9990461 -0.8990011 0.901319 0.9990461 -0.899 0.9013166 0.9990461 -0.8989986 0.9013135 0.9990461 -0.8989969 0.9013097 0.9990461 -0.8989948 0.901305 0.9990461 -0.8989923 0.9012992 0.999046 -0.8989895 0.9012921 0.999046 -0.8989863 0.9012835 0.9990459 -0.8989829 0.9012733 0.9990459 -0.8989796 0.9012613 0.9990458 -0.8989771 0.9012479 0.9990458 -0.8989767 0.9012335 0.9990457 -0.8989805 0.9012195 0.9990456 -0.8989921 0.9012084 0.9990456 -0.8990175 0.9012049 0.9990455 -0.8990542 0.9012049 0.9990455 -0.8991006 0.9012049 0.9990455 -0.8991593 0.9012049 0.9990455 -0.8992336 0.9012049 0.9990455 -0.8993275 0.9012049 0.9990455 -0.8994464 0.9012049 0.9990455 -0.8995968 0.9012049 0.9990455 -0.899787 0.9012049 0.9990455 -0.9000277 0.9012049 0.9990455 -0.9003323 0.9012049 0.9990455 -0.9007175 0.9012049 0.9990455 -0.9012049 0.9012049 0.9990455 -0.9018215 0.9012049 0.9990455 -0.9026016 0.9012049 0.9990455 -0.9035886 0.9012049 0.9990455 -0.9048372 0.9012049 0.9990455 -0.9064168 0.9012049 0.9990455 -0.9084153 0.9012049 0.9990455 -0.9109436 0.9012049 0.9990455 -0.9141422 0.9012049 0.9990455 -0.9181889 0.9012049 0.9990455 -0.9233085 0.9012049 0.9990455 -0.9297854 0.9012049 0.9990455 -0.9379796 0.9012049 0.9990455 -0.9483463 0.9012049 0.9990455 -0.9614615 0.9012049 0.9990455 -0.9780539 0.9012049 0.9990455 -0.9990455 0.9012049 0.9990455 -0.999247 0.9201176 0.982354 -0.9994057 0.9357024 0.9751513 -0.9995308 0.9484359 0.9733691 -0.9996295 0.9587693 0.9744915 -0.9997074 0.9671097 0.977005 -0.9997688 0.9738123 0.980031 -0.9998174 0.9791804 0.9830838 -0.9998557 0.9834679 0.9859157 -0.999886 0.986885 0.9884188 -0.9999099 0.9896036 0.9905641 -0.9999288 0.9917636 0.9923648 -0.9999437 0.9934779 0.9938541 -0.8990028 0.9019384 0.9990461 -0.899002 0.9019369 0.9990461 -0.8990011 0.9019349 0.9990461 -0.899 0.9019325 0.9990461 -0.8989986 0.9019295 0.9990461 -0.8989969 0.9019257 0.9990461 -0.8989948 0.901921 0.9990461 -0.8989923 0.9019152 0.999046 -0.8989895 0.9019081 0.999046 -0.8989863 0.9018996 0.9990459 -0.8989829 0.9018894 0.9990459 -0.8989796 0.9018776 0.9990458 -0.8989771 0.9018642 0.9990458 -0.8989767 0.9018499 0.9990457 -0.8989805 0.901836 0.9990456 -0.8989921 0.901825 0.9990456 -0.8990175 0.9018215 0.9990455 -0.8990542 0.9018215 0.9990455 -0.8991006 0.9018215 0.9990455 -0.8991593 0.9018215 0.9990455 -0.8992336 0.9018215 0.9990455 -0.8993275 0.9018215 0.9990455 -0.8994464 0.9018215 0.9990455 -0.8995968 0.9018215 0.9990455 -0.899787 0.9018215 0.9990455 -0.9000277 0.9018215 0.9990455 -0.9003323 0.9018215 0.9990455 -0.9007175 0.9018215 0.9990455 -0.9012049 0.9018215 0.9990455 -0.9018215 0.9018215 0.9990455 -0.9026016 0.9018215 0.9990455 -0.9035886 0.9018215 0.9990455 -0.9048372 0.9018215 0.9990455 -0.9064168 0.9018215 0.9990455 -0.9084153 0.9018215 0.9990455 -0.9109436 0.9018215 0.9990455 -0.9141422 0.9018215 0.9990455 -0.9181889 0.9018215 0.9990455 -0.9233085 0.9018215 0.9990455 -0.9297854 0.9018215 0.9990455 -0.9379796 0.9018215 0.9990455 -0.9483463 0.9018215 0.9990455 -0.9614615 0.9018215 0.9990455 -0.9780539 0.9018215 0.9990455 -0.9990455 0.9018215 0.9990455 -0.999247 0.9205098 0.982354 -0.9994057 0.935951 0.9751513 -0.9995308 0.9485931 0.9733691 -0.9996295 0.9588684 0.9744915 -0.9997074 0.967172 0.977005 -0.9997688 0.9738515 0.980031 -0.9998174 0.979205 0.9830838 -0.9998557 0.9834833 0.9859157 -0.999886 0.9868946 0.9884188 -0.9999099 0.9896096 0.9905641 -0.9999288 0.9917674 0.9923648 -0.9999437 0.9934803 0.9938541 -0.8990028 0.9027176 0.9990461 -0.899002 0.902716 0.9990461 -0.8990011 0.9027141 0.9990461 -0.899 0.9027117 0.9990461 -0.8989986 0.9027087 0.9990461 -0.8989969 0.9027049 0.9990461 -0.8989948 0.9027003 0.9990461 -0.8989923 0.9026946 0.999046 -0.8989895 0.9026876 0.999046 -0.8989863 0.9026791 0.9990459 -0.8989829 0.902669 0.9990459 -0.8989796 0.9026573 0.9990458 -0.8989771 0.902644 0.9990458 -0.8989767 0.9026298 0.9990457 -0.8989805 0.902616 0.9990456 -0.8989921 0.9026051 0.9990456 -0.8990175 0.9026016 0.9990455 -0.8990542 0.9026016 0.9990455 -0.8991006 0.9026016 0.9990455 -0.8991593 0.9026016 0.9990455 -0.8992336 0.9026016 0.9990455 -0.8993275 0.9026016 0.9990455 -0.8994464 0.9026016 0.9990455 -0.8995968 0.9026016 0.9990455 -0.899787 0.9026016 0.9990455 -0.9000277 0.9026016 0.9990455 -0.9003323 0.9026016 0.9990455 -0.9007175 0.9026016 0.9990455 -0.9012049 0.9026016 0.9990455 -0.9018215 0.9026016 0.9990455 -0.9026016 0.9026016 0.9990455 -0.9035886 0.9026016 0.9990455 -0.9048372 0.9026016 0.9990455 -0.9064168 0.9026016 0.9990455 -0.9084153 0.9026016 0.9990455 -0.9109436 0.9026016 0.9990455 -0.9141422 0.9026016 0.9990455 -0.9181889 0.9026016 0.9990455 -0.9233085 0.9026016 0.9990455 -0.9297854 0.9026016 0.9990455 -0.9379796 0.9026016 0.9990455 -0.9483463 0.9026016 0.9990455 -0.9614615 0.9026016 0.9990455 -0.9780539 0.9026016 0.9990455 -0.9990455 0.9026016 0.9990455 -0.999247 0.9210061 0.982354 -0.9994057 0.9362655 0.9751513 -0.9995308 0.9487918 0.9733691 -0.9996295 0.9589938 0.9744915 -0.9997074 0.9672509 0.977005 -0.9997688 0.9739011 0.980031 -0.9998174 0.9792361 0.9830838 -0.9998557 0.9835029 0.9859157 -0.999886 0.9869069 0.9884188 -0.9999099 0.9896173 0.9905641 -0.9999288 0.9917722 0.9923648 -0.9999437 0.9934833 0.9938541 -0.8990028 0.9037033 0.9990461 -0.899002 0.9037018 0.9990461 -0.8990011 0.9036999 0.9990461 -0.899 0.9036975 0.9990461 -0.8989986 0.9036945 0.9990461 -0.8989969 0.9036908 0.9990461 -0.8989948 0.9036862 0.9990461 -0.8989923 0.9036806 0.999046 -0.8989895 0.9036736 0.999046 -0.8989863 0.9036652 0.9990459 -0.8989829 0.9036553 0.9990459 -0.8989796 0.9036436 0.9990458 -0.8989771 0.9036305 0.9990458 -0.8989767 0.9036165 0.9990457 -0.8989805 0.9036028 0.9990456 -0.8989921 0.903592 0.9990456 -0.8990175 0.9035886 0.9990455 -0.8990542 0.9035886 0.9990455 -0.8991006 0.9035886 0.9990455 -0.8991593 0.9035886 0.9990455 -0.8992336 0.9035886 0.9990455 -0.8993275 0.9035886 0.9990455 -0.8994464 0.9035886 0.9990455 -0.8995968 0.9035886 0.9990455 -0.899787 0.9035886 0.9990455 -0.9000277 0.9035886 0.9990455 -0.9003323 0.9035886 0.9990455 -0.9007175 0.9035886 0.9990455 -0.9012049 0.9035886 0.9990455 -0.9018215 0.9035886 0.9990455 -0.9026016 0.9035886 0.9990455 -0.9035886 0.9035886 0.9990455 -0.9048372 0.9035886 0.9990455 -0.9064168 0.9035886 0.9990455 -0.9084153 0.9035886 0.9990455 -0.9109436 0.9035886 0.9990455 -0.9141422 0.9035886 0.9990455 -0.9181889 0.9035886 0.9990455 -0.9233085 0.9035886 0.9990455 -0.9297854 0.9035886 0.9990455 -0.9379796 0.9035886 0.9990455 -0.9483463 0.9035886 0.9990455 -0.9614615 0.9035886 0.9990455 -0.9780539 0.9035886 0.9990455 -0.9990455 0.9035886 0.9990455 -0.999247 0.9216339 0.982354 -0.9994057 0.9366635 0.9751513 -0.9995308 0.9490434 0.9733691 -0.9996295 0.9591524 0.9744915 -0.9997074 0.9673508 0.977005 -0.9997688 0.9739638 0.980031 -0.9998174 0.9792755 0.9830838 -0.9998557 0.9835276 0.9859157 -0.999886 0.9869223 0.9884188 -0.9999099 0.989627 0.9905641 -0.9999288 0.9917782 0.9923648 -0.9999437 0.9934871 0.9938541 -0.8990028 0.9049504 0.9990461 -0.899002 0.9049489 0.9990461 -0.8990011 0.9049471 0.9990461 -0.899 0.9049447 0.9990461 -0.8989986 0.9049418 0.9990461 -0.8989969 0.9049381 0.9990461 -0.8989948 0.9049336 0.9990461 -0.8989923 0.904928 0.999046 -0.8989895 0.9049211 0.999046 -0.8989863 0.9049128 0.9990459 -0.8989829 0.904903 0.9990459 -0.8989796 0.9048915 0.9990458 -0.8989771 0.9048786 0.9990458 -0.8989767 0.9048647 0.9990457 -0.8989805 0.9048512 0.9990456 -0.8989921 0.9048406 0.9990456 -0.8990175 0.9048372 0.9990455 -0.8990542 0.9048372 0.9990455 -0.8991006 0.9048372 0.9990455 -0.8991593 0.9048372 0.9990455 -0.8992336 0.9048372 0.9990455 -0.8993275 0.9048372 0.9990455 -0.8994464 0.9048372 0.9990455 -0.8995968 0.9048372 0.9990455 -0.899787 0.9048372 0.9990455 -0.9000277 0.9048372 0.9990455 -0.9003323 0.9048372 0.9990455 -0.9007175 0.9048372 0.9990455 -0.9012049 0.9048372 0.9990455 -0.9018215 0.9048372 0.9990455 -0.9026016 0.9048372 0.9990455 -0.9035886 0.9048372 0.9990455 -0.9048372 0.9048372 0.9990455 -0.9064168 0.9048372 0.9990455 -0.9084153 0.9048372 0.9990455 -0.9109436 0.9048372 0.9990455 -0.9141422 0.9048372 0.9990455 -0.9181889 0.9048372 0.9990455 -0.9233085 0.9048372 0.9990455 -0.9297854 0.9048372 0.9990455 -0.9379796 0.9048372 0.9990455 -0.9483463 0.9048372 0.9990455 -0.9614615 0.9048372 0.9990455 -0.9780539 0.9048372 0.9990455 -0.9990455 0.9048372 0.9990455 -0.999247 0.9224281 0.982354 -0.9994057 0.9371669 0.9751513 -0.9995308 0.9493615 0.9733691 -0.9996295 0.959353 0.9744915 -0.9997074 0.967477 0.977005 -0.9997688 0.9740432 0.980031 -0.9998174 0.9793253 0.9830838 -0.9998557 0.9835588 0.9859157 -0.999886 0.9869419 0.9884188 -0.9999099 0.9896392 0.9905641 -0.9999288 0.9917859 0.9923648 -0.9999437 0.9934919 0.9938541 -0.8990028 0.9065282 0.9990461 -0.899002 0.9065267 0.9990461 -0.8990011 0.9065249 0.9990461 -0.899 0.9065226 0.9990461 -0.8989986 0.9065197 0.9990461 -0.8989969 0.9065161 0.9990461 -0.8989948 0.9065116 0.9990461 -0.8989923 0.9065061 0.999046 -0.8989895 0.9064994 0.999046 -0.8989863 0.9064912 0.9990459 -0.8989829 0.9064815 0.9990459 -0.8989796 0.9064702 0.9990458 -0.8989771 0.9064575 0.9990458 -0.8989767 0.9064439 0.9990457 -0.8989805 0.9064306 0.9990456 -0.8989921 0.9064202 0.9990456 -0.8990175 0.9064168 0.9990455 -0.8990542 0.9064168 0.9990455 -0.8991006 0.9064168 0.9990455 -0.8991593 0.9064168 0.9990455 -0.8992336 0.9064168 0.9990455 -0.8993275 0.9064168 0.9990455 -0.8994464 0.9064168 0.9990455 -0.8995968 0.9064168 0.9990455 -0.899787 0.9064168 0.9990455 -0.9000277 0.9064168 0.9990455 -0.9003323 0.9064168 0.9990455 -0.9007175 0.9064168 0.9990455 -0.9012049 0.9064168 0.9990455 -0.9018215 0.9064168 0.9990455 -0.9026016 0.9064168 0.9990455 -0.9035886 0.9064168 0.9990455 -0.9048372 0.9064168 0.9990455 -0.9064168 0.9064168 0.9990455 -0.9084153 0.9064168 0.9990455 -0.9109436 0.9064168 0.9990455 -0.9141422 0.9064168 0.9990455 -0.9181889 0.9064168 0.9990455 -0.9233085 0.9064168 0.9990455 -0.9297854 0.9064168 0.9990455 -0.9379796 0.9064168 0.9990455 -0.9483463 0.9064168 0.9990455 -0.9614615 0.9064168 0.9990455 -0.9780539 0.9064168 0.9990455 -0.9990455 0.9064168 0.9990455 -0.999247 0.9234329 0.982354 -0.9994057 0.9378038 0.9751513 -0.9995308 0.9497641 0.9733691 -0.9996295 0.9596068 0.9744915 -0.9997074 0.9676368 0.977005 -0.9997688 0.9741436 0.980031 -0.9998174 0.9793883 0.9830838 -0.9998557 0.9835983 0.9859157 -0.999886 0.9869667 0.9884188 -0.9999099 0.9896547 0.9905641 -0.9999288 0.9917956 0.9923648 -0.9999437 0.993498 0.9938541 -0.8990028 0.9085243 0.9990461 -0.899002 0.9085228 0.9990461 -0.8990011 0.908521 0.9990461 -0.899 0.9085187 0.9990461 -0.8989986 0.9085159 0.9990461 -0.8989969 0.9085124 0.9990461 -0.8989948 0.908508 0.9990461 -0.8989923 0.9085026 0.999046 -0.8989895 0.908496 0.999046 -0.8989863 0.9084881 0.9990459 -0.8989829 0.9084786 0.9990459 -0.8989796 0.9084676 0.9990458 -0.8989771 0.9084551 0.9990458 -0.8989767 0.9084417 0.9990457 -0.8989805 0.9084287 0.9990456 -0.8989921 0.9084185 0.9990456 -0.8990175 0.9084153 0.9990455 -0.8990542 0.9084153 0.9990455 -0.8991006 0.9084153 0.9990455 -0.8991593 0.9084153 0.9990455 -0.8992336 0.9084153 0.9990455 -0.8993275 0.9084153 0.9990455 -0.8994464 0.9084153 0.9990455 -0.8995968 0.9084153 0.9990455 -0.899787 0.9084153 0.9990455 -0.9000277 0.9084153 0.9990455 -0.9003323 0.9084153 0.9990455 -0.9007175 0.9084153 0.9990455 -0.9012049 0.9084153 0.9990455 -0.9018215 0.9084153 0.9990455 -0.9026016 0.9084153 0.9990455 -0.9035886 0.9084153 0.9990455 -0.9048372 0.9084153 0.9990455 -0.9064168 0.9084153 0.9990455 -0.9084153 0.9084153 0.9990455 -0.9109436 0.9084153 0.9990455 -0.9141422 0.9084153 0.9990455 -0.9181889 0.9084153 0.9990455 -0.9233085 0.9084153 0.9990455 -0.9297854 0.9084153 0.9990455 -0.9379796 0.9084153 0.9990455 -0.9483463 0.9084153 0.9990455 -0.9614615 0.9084153 0.9990455 -0.9780539 0.9084153 0.9990455 -0.9990455 0.9084153 0.9990455 -0.999247 0.9247041 0.982354 -0.9994057 0.9386096 0.9751513 -0.9995308 0.9502734 0.9733691 -0.9996295 0.959928 0.9744915 -0.9997074 0.9678389 0.977005 -0.9997688 0.9742706 0.980031 -0.9998174 0.9794681 0.9830838 -0.9998557 0.9836483 0.9859157 -0.999886 0.986998 0.9884188 -0.9999099 0.9896744 0.9905641 -0.9999288 0.9918079 0.9923648 -0.9999437 0.9935057 0.9938541 -0.8990028 0.9110495 0.9990461 -0.899002 0.9110481 0.9990461 -0.8990011 0.9110464 0.9990461 -0.899 0.9110442 0.9990461 -0.8989986 0.9110414 0.9990461 -0.8989969 0.911038 0.9990461 -0.8989948 0.9110337 0.9990461 -0.8989923 0.9110285 0.999046 -0.8989895 0.9110221 0.999046 -0.8989863 0.9110144 0.9990459 -0.8989829 0.9110051 0.9990459 -0.8989796 0.9109944 0.9990458 -0.8989771 0.9109823 0.9990458 -0.8989767 0.9109693 0.9990457 -0.8989805 0.9109567 0.9990456 -0.8989921 0.9109467 0.9990456 -0.8990175 0.9109436 0.9990455 -0.8990542 0.9109436 0.9990455 -0.8991006 0.9109436 0.9990455 -0.8991593 0.9109436 0.9990455 -0.8992336 0.9109436 0.9990455 -0.8993275 0.9109436 0.9990455 -0.8994464 0.9109436 0.9990455 -0.8995968 0.9109436 0.9990455 -0.899787 0.9109436 0.9990455 -0.9000277 0.9109436 0.9990455 -0.9003323 0.9109436 0.9990455 -0.9007175 0.9109436 0.9990455 -0.9012049 0.9109436 0.9990455 -0.9018215 0.9109436 0.9990455 -0.9026016 0.9109436 0.9990455 -0.9035886 0.9109436 0.9990455 -0.9048372 0.9109436 0.9990455 -0.9064168 0.9109436 0.9990455 -0.9084153 0.9109436 0.9990455 -0.9109436 0.9109436 0.9990455 -0.9141422 0.9109436 0.9990455 -0.9181889 0.9109436 0.9990455 -0.9233085 0.9109436 0.9990455 -0.9297854 0.9109436 0.9990455 -0.9379796 0.9109436 0.9990455 -0.9483463 0.9109436 0.9990455 -0.9614615 0.9109436 0.9990455 -0.9780539 0.9109436 0.9990455 -0.9990455 0.9109436 0.9990455 -0.999247 0.9263124 0.982354 -0.9994057 0.939629 0.9751513 -0.9995308 0.9509177 0.9733691 -0.9996295 0.9603343 0.9744915 -0.9997074 0.9680946 0.977005 -0.9997688 0.9744313 0.980031 -0.9998174 0.9795689 0.9830838 -0.9998557 0.9837116 0.9859157 -0.999886 0.9870376 0.9884188 -0.9999099 0.9896992 0.9905641 -0.9999288 0.9918234 0.9923648 -0.9999437 0.9935154 0.9938541 -0.8990028 0.9142443 0.9990461 -0.899002 0.914243 0.9990461 -0.8990011 0.9142413 0.9990461 -0.899 0.9142392 0.9990461 -0.8989986 0.9142365 0.9990461 -0.8989969 0.9142332 0.9990461 -0.8989948 0.9142291 0.9990461 -0.8989923 0.9142241 0.999046 -0.8989895 0.9142179 0.999046 -0.8989863 0.9142104 0.9990459 -0.8989829 0.9142016 0.9990459 -0.8989796 0.9141912 0.9990458 -0.8989771 0.9141795 0.9990458 -0.8989767 0.914167 0.9990457 -0.8989805 0.9141548 0.9990456 -0.8989921 0.9141453 0.9990456 -0.8990175 0.9141422 0.9990455 -0.8990542 0.9141422 0.9990455 -0.8991006 0.9141422 0.9990455 -0.8991593 0.9141422 0.9990455 -0.8992336 0.9141422 0.9990455 -0.8993275 0.9141422 0.9990455 -0.8994464 0.9141422 0.9990455 -0.8995968 0.9141422 0.9990455 -0.899787 0.9141422 0.9990455 -0.9000277 0.9141422 0.9990455 -0.9003323 0.9141422 0.9990455 -0.9007175 0.9141422 0.9990455 -0.9012049 0.9141422 0.9990455 -0.9018215 0.9141422 0.9990455 -0.9026016 0.9141422 0.9990455 -0.9035886 0.9141422 0.9990455 -0.9048372 0.9141422 0.9990455 -0.9064168 0.9141422 0.9990455 -0.9084153 0.9141422 0.9990455 -0.9109436 0.9141422 0.9990455 -0.9141422 0.9141422 0.9990455 -0.9181889 0.9141422 0.9990455 -0.9233085 0.9141422 0.9990455 -0.9297854 0.9141422 0.9990455 -0.9379796 0.9141422 0.9990455 -0.9483463 0.9141422 0.9990455 -0.9614615 0.9141422 0.9990455 -0.9780539 0.9141422 0.9990455 -0.9990455 0.9141422 0.9990455 -0.999247 0.928347 0.982354 -0.9994057 0.9409186 0.9751513 -0.9995308 0.9517328 0.9733691 -0.9996295 0.9608482 0.9744915 -0.9997074 0.9684181 0.977005 -0.9997688 0.9746346 0.980031 -0.9998174 0.9796966 0.9830838 -0.9998557 0.9837916 0.9859157 -0.999886 0.9870878 0.9884188 -0.9999099 0.9897306 0.9905641 -0.9999288 0.9918431 0.9923648 -0.9999437 0.9935277 0.9938541 -0.8990028 0.9182862 0.9990461 -0.899002 0.9182849 0.9990461 -0.8990011 0.9182833 0.9990461 -0.899 0.9182813 0.9990461 -0.8989986 0.9182787 0.9990461 -0.8989969 0.9182756 0.9990461 -0.8989948 0.9182717 0.9990461 -0.8989923 0.9182669 0.999046 -0.8989895 0.918261 0.999046 -0.8989863 0.9182539 0.9990459 -0.8989829 0.9182454 0.9990459 -0.8989796 0.9182356 0.9990458 -0.8989771 0.9182244 0.9990458 -0.8989767 0.9182125 0.9990457 -0.8989805 0.9182009 0.9990456 -0.8989921 0.9181918 0.9990456 -0.8990175 0.9181889 0.9990455 -0.8990542 0.9181889 0.9990455 -0.8991006 0.9181889 0.9990455 -0.8991593 0.9181889 0.9990455 -0.8992336 0.9181889 0.9990455 -0.8993275 0.9181889 0.9990455 -0.8994464 0.9181889 0.9990455 -0.8995968 0.9181889 0.9990455 -0.899787 0.9181889 0.9990455 -0.9000277 0.9181889 0.9990455 -0.9003323 0.9181889 0.9990455 -0.9007175 0.9181889 0.9990455 -0.9012049 0.9181889 0.9990455 -0.9018215 0.9181889 0.9990455 -0.9026016 0.9181889 0.9990455 -0.9035886 0.9181889 0.9990455 -0.9048372 0.9181889 0.9990455 -0.9064168 0.9181889 0.9990455 -0.9084153 0.9181889 0.9990455 -0.9109436 0.9181889 0.9990455 -0.9141422 0.9181889 0.9990455 -0.9181889 0.9181889 0.9990455 -0.9233085 0.9181889 0.9990455 -0.9297854 0.9181889 0.9990455 -0.9379796 0.9181889 0.9990455 -0.9483463 0.9181889 0.9990455 -0.9614615 0.9181889 0.9990455 -0.9780539 0.9181889 0.9990455 -0.9990455 0.9181889 0.9990455 -0.999247 0.9309211 0.982354 -0.9994057 0.9425502 0.9751513 -0.9995308 0.952764 0.9733691 -0.9996295 0.9614985 0.9744915 -0.9997074 0.9688274 0.977005 -0.9997688 0.9748918 0.980031 -0.9998174 0.979858 0.9830838 -0.9998557 0.9838928 0.9859157 -0.999886 0.9871512 0.9884188 -0.9999099 0.9897703 0.9905641 -0.9999288 0.991868 0.9923648 -0.9999437 0.9935432 0.9938541 -0.8990028 0.9233996 0.9990461 -0.899002 0.9233984 0.9990461 -0.8990011 0.9233969 0.9990461 -0.899 0.923395 0.9990461 -0.8989986 0.9233927 0.9990461 -0.8989969 0.9233897 0.9990461 -0.8989948 0.9233861 0.9990461 -0.8989923 0.9233816 0.999046 -0.8989895 0.923376 0.999046 -0.8989863 0.9233694 0.9990459 -0.8989829 0.9233615 0.9990459 -0.8989796 0.9233522 0.9990458 -0.8989771 0.9233418 0.9990458 -0.8989767 0.9233306 0.9990457 -0.8989805 0.9233198 0.9990456 -0.8989921 0.9233112 0.9990456 -0.8990175 0.9233085 0.9990455 -0.8990542 0.9233085 0.9990455 -0.8991006 0.9233085 0.9990455 -0.8991593 0.9233085 0.9990455 -0.8992336 0.9233085 0.9990455 -0.8993275 0.9233085 0.9990455 -0.8994464 0.9233085 0.9990455 -0.8995968 0.9233085 0.9990455 -0.899787 0.9233085 0.9990455 -0.9000277 0.9233085 0.9990455 -0.9003323 0.9233085 0.9990455 -0.9007175 0.9233085 0.9990455 -0.9012049 0.9233085 0.9990455 -0.9018215 0.9233085 0.9990455 -0.9026016 0.9233085 0.9990455 -0.9035886 0.9233085 0.9990455 -0.9048372 0.9233085 0.9990455 -0.9064168 0.9233085 0.9990455 -0.9084153 0.9233085 0.9990455 -0.9109436 0.9233085 0.9990455 -0.9141422 0.9233085 0.9990455 -0.9181889 0.9233085 0.9990455 -0.9233085 0.9233085 0.9990455 -0.9297854 0.9233085 0.9990455 -0.9379796 0.9233085 0.9990455 -0.9483463 0.9233085 0.9990455 -0.9614615 0.9233085 0.9990455 -0.9780539 0.9233085 0.9990455 -0.9990455 0.9233085 0.9990455 -0.999247 0.9341777 0.982354 -0.9994057 0.9446144 0.9751513 -0.9995308 0.9540687 0.9733691 -0.9996295 0.9623212 0.9744915 -0.9997074 0.9693452 0.977005 -0.9997688 0.9752172 0.980031 -0.9998174 0.9800622 0.9830838 -0.9998557 0.9840209 0.9859157 -0.999886 0.9872315 0.9884188 -0.9999099 0.9898206 0.9905641 -0.9999288 0.9918994 0.9923648 -0.9999437 0.9935629 0.9938541 -0.8990028 0.9298688 0.9990461 -0.899002 0.9298677 0.9990461 -0.8990011 0.9298664 0.9990461 -0.899 0.9298646 0.9990461 -0.8989986 0.9298625 0.9990461 -0.8989969 0.9298598 0.9990461 -0.8989948 0.9298564 0.9990461 -0.8989923 0.9298523 0.999046 -0.8989895 0.9298472 0.999046 -0.8989863 0.9298411 0.9990459 -0.8989829 0.9298339 0.9990459 -0.8989796 0.9298254 0.9990458 -0.8989771 0.9298159 0.9990458 -0.8989767 0.9298057 0.9990457 -0.8989805 0.9297957 0.9990456 -0.8989921 0.9297879 0.9990456 -0.8990175 0.9297854 0.9990455 -0.8990542 0.9297854 0.9990455 -0.8991006 0.9297854 0.9990455 -0.8991593 0.9297854 0.9990455 -0.8992336 0.9297854 0.9990455 -0.8993275 0.9297854 0.9990455 -0.8994464 0.9297854 0.9990455 -0.8995968 0.9297854 0.9990455 -0.899787 0.9297854 0.9990455 -0.9000277 0.9297854 0.9990455 -0.9003323 0.9297854 0.9990455 -0.9007175 0.9297854 0.9990455 -0.9012049 0.9297854 0.9990455 -0.9018215 0.9297854 0.9990455 -0.9026016 0.9297854 0.9990455 -0.9035886 0.9297854 0.9990455 -0.9048372 0.9297854 0.9990455 -0.9064168 0.9297854 0.9990455 -0.9084153 0.9297854 0.9990455 -0.9109436 0.9297854 0.9990455 -0.9141422 0.9297854 0.9990455 -0.9181889 0.9297854 0.9990455 -0.9233085 0.9297854 0.9990455 -0.9297854 0.9297854 0.9990455 -0.9379796 0.9297854 0.9990455 -0.9483463 0.9297854 0.9990455 -0.9614615 0.9297854 0.9990455 -0.9780539 0.9297854 0.9990455 -0.9990455 0.9297854 0.9990455 -0.999247 0.9382977 0.982354 -0.9994057 0.9472259 0.9751513 -0.9995308 0.9557192 0.9733691 -0.9996295 0.963362 0.9744915 -0.9997074 0.9700002 0.977005 -0.9997688 0.9756289 0.980031 -0.9998174 0.9803206 0.9830838 -0.9998557 0.9841829 0.9859157 -0.999886 0.987333 0.9884188 -0.9999099 0.9898842 0.9905641 -0.9999288 0.9919392 0.9923648 -0.9999437 0.9935878 0.9938541 -0.8990028 0.9380532 0.9990461 -0.899002 0.9380522 0.9990461 -0.8990011 0.938051 0.9990461 -0.899 0.9380495 0.9990461 -0.8989986 0.9380476 0.9990461 -0.8989969 0.9380452 0.9990461 -0.8989948 0.9380422 0.9990461 -0.8989923 0.9380386 0.999046 -0.8989895 0.9380342 0.999046 -0.8989863 0.9380288 0.9990459 -0.8989829 0.9380224 0.9990459 -0.8989796 0.9380149 0.9990458 -0.8989771 0.9380065 0.9990458 -0.8989767 0.9379975 0.9990457 -0.8989805 0.9379887 0.9990456 -0.8989921 0.9379818 0.9990456 -0.8990175 0.9379796 0.9990455 -0.8990542 0.9379796 0.9990455 -0.8991006 0.9379796 0.9990455 -0.8991593 0.9379796 0.9990455 -0.8992336 0.9379796 0.9990455 -0.8993275 0.9379796 0.9990455 -0.8994464 0.9379796 0.9990455 -0.8995968 0.9379796 0.9990455 -0.899787 0.9379796 0.9990455 -0.9000277 0.9379796 0.9990455 -0.9003323 0.9379796 0.9990455 -0.9007175 0.9379796 0.9990455 -0.9012049 0.9379796 0.9990455 -0.9018215 0.9379796 0.9990455 -0.9026016 0.9379796 0.9990455 -0.9035886 0.9379796 0.9990455 -0.9048372 0.9379796 0.9990455 -0.9064168 0.9379796 0.9990455 -0.9084153 0.9379796 0.9990455 -0.9109436 0.9379796 0.9990455 -0.9141422 0.9379796 0.9990455 -0.9181889 0.9379796 0.9990455 -0.9233085 0.9379796 0.9990455 -0.9297854 0.9379796 0.9990455 -0.9379796 0.9379796 0.9990455 -0.9483463 0.9379796 0.9990455 -0.9614615 0.9379796 0.9990455 -0.9780539 0.9379796 0.9990455 -0.9990455 0.9379796 0.9990455 -0.999247 0.94351 0.982354 -0.9994057 0.9505298 0.9751513 -0.9995308 0.9578074 0.9733691 -0.9996295 0.9646787 0.9744915 -0.9997074 0.970829 0.977005 -0.9997688 0.9761497 0.980031 -0.9998174 0.9806476 0.9830838 -0.9998557 0.984388 0.9859157 -0.999886 0.9874615 0.9884188 -0.9999099 0.9899646 0.9905641 -0.9999288 0.9919896 0.9923648 -0.9999437 0.9936193 0.9938541 -0.8990028 0.9484075 0.9990461 -0.899002 0.9484067 0.9990461 -0.8990011 0.9484057 0.9990461 -0.899 0.9484044 0.9990461 -0.8989986 0.9484028 0.9990461 -0.8989969 0.9484008 0.9990461 -0.8989948 0.9483984 0.9990461 -0.8989923 0.9483954 0.999046 -0.8989895 0.9483917 0.999046 -0.8989863 0.9483872 0.9990459 -0.8989829 0.9483819 0.9990459 -0.8989796 0.9483756 0.9990458 -0.8989771 0.9483686 0.9990458 -0.8989767 0.9483611 0.9990457 -0.8989805 0.9483538 0.9990456 -0.8989921 0.9483481 0.9990456 -0.8990175 0.9483463 0.9990455 -0.8990542 0.9483463 0.9990455 -0.8991006 0.9483463 0.9990455 -0.8991593 0.9483463 0.9990455 -0.8992336 0.9483463 0.9990455 -0.8993275 0.9483463 0.9990455 -0.8994464 0.9483463 0.9990455 -0.8995968 0.9483463 0.9990455 -0.899787 0.9483463 0.9990455 -0.9000277 0.9483463 0.9990455 -0.9003323 0.9483463 0.9990455 -0.9007175 0.9483463 0.9990455 -0.9012049 0.9483463 0.9990455 -0.9018215 0.9483463 0.9990455 -0.9026016 0.9483463 0.9990455 -0.9035886 0.9483463 0.9990455 -0.9048372 0.9483463 0.9990455 -0.9064168 0.9483463 0.9990455 -0.9084153 0.9483463 0.9990455 -0.9109436 0.9483463 0.9990455 -0.9141422 0.9483463 0.9990455 -0.9181889 0.9483463 0.9990455 -0.9233085 0.9483463 0.9990455 -0.9297854 0.9483463 0.9990455 -0.9379796 0.9483463 0.9990455 -0.9483463 0.9483463 0.9990455 -0.9614615 0.9483463 0.9990455 -0.9780539 0.9483463 0.9990455 -0.9990455 0.9483463 0.9990455 -0.999247 0.9501042 0.982354 -0.9994057 0.9547096 0.9751513 -0.9995308 0.9604492 0.9733691 -0.9996295 0.9663445 0.9744915 -0.9997074 0.9718774 0.977005 -0.9997688 0.9768086 0.980031 -0.9998174 0.9810611 0.9830838 -0.9998557 0.9846473 0.9859157 -0.999886 0.987624 0.9884188 -0.9999099 0.9900664 0.9905641 -0.9999288 0.9920533 0.9923648 -0.9999437 0.9936592 0.9938541 -0.8990028 0.961507 0.9990461 -0.899002 0.9615064 0.9990461 -0.8990011 0.9615057 0.9990461 -0.899 0.9615047 0.9990461 -0.8989986 0.9615035 0.9990461 -0.8989969 0.9615021 0.9990461 -0.8989948 0.9615002 0.9990461 -0.8989923 0.961498 0.999046 -0.8989895 0.9614952 0.999046 -0.8989863 0.9614919 0.9990459 -0.8989829 0.961488 0.9990459 -0.8989796 0.9614833 0.9990458 -0.8989771 0.9614781 0.9990458 -0.8989767 0.9614726 0.9990457 -0.8989805 0.9614671 0.9990456 -0.8989921 0.9614628 0.9990456 -0.8990175 0.9614615 0.9990455 -0.8990542 0.9614615 0.9990455 -0.8991006 0.9614615 0.9990455 -0.8991593 0.9614615 0.9990455 -0.8992336 0.9614615 0.9990455 -0.8993275 0.9614615 0.9990455 -0.8994464 0.9614615 0.9990455 -0.8995968 0.9614615 0.9990455 -0.899787 0.9614615 0.9990455 -0.9000277 0.9614615 0.9990455 -0.9003323 0.9614615 0.9990455 -0.9007175 0.9614615 0.9990455 -0.9012049 0.9614615 0.9990455 -0.9018215 0.9614615 0.9990455 -0.9026016 0.9614615 0.9990455 -0.9035886 0.9614615 0.9990455 -0.9048372 0.9614615 0.9990455 -0.9064168 0.9614615 0.9990455 -0.9084153 0.9614615 0.9990455 -0.9109436 0.9614615 0.9990455 -0.9141422 0.9614615 0.9990455 -0.9181889 0.9614615 0.9990455 -0.9233085 0.9614615 0.9990455 -0.9297854 0.9614615 0.9990455 -0.9379796 0.9614615 0.9990455 -0.9483463 0.9614615 0.9990455 -0.9614615 0.9614615 0.9990455 -0.9780539 0.9614615 0.9990455 -0.9990455 0.9614615 0.9990455 -0.999247 0.9584468 0.982354 -0.9994057 0.9599976 0.9751513 -0.9995308 0.9637914 0.9733691 -0.9996295 0.968452 0.9744915 -0.9997074 0.9732039 0.977005 -0.9997688 0.9776422 0.980031 -0.9998174 0.9815844 0.9830838 -0.9998557 0.9849754 0.9859157 -0.999886 0.9878296 0.9884188 -0.9999099 0.9901951 0.9905641 -0.9999288 0.9921339 0.9923648 -0.9999437 0.9937096 0.9938541 -0.8990028 0.9780796 0.9990461 -0.899002 0.9780793 0.9990461 -0.8990011 0.9780789 0.9990461 -0.899 0.9780783 0.9990461 -0.8989986 0.9780777 0.9990461 -0.8989969 0.9780768 0.9990461 -0.8989948 0.9780758 0.9990461 -0.8989923 0.9780745 0.999046 -0.8989895 0.978073 0.999046 -0.8989863 0.9780711 0.9990459 -0.8989829 0.9780689 0.9990459 -0.8989796 0.9780663 0.9990458 -0.8989771 0.9780633 0.9990458 -0.8989767 0.9780602 0.9990457 -0.8989805 0.9780571 0.9990456 -0.8989921 0.9780547 0.9990456 -0.8990175 0.9780539 0.9990455 -0.8990542 0.9780539 0.9990455 -0.8991006 0.9780539 0.9990455 -0.8991593 0.9780539 0.9990455 -0.8992336 0.9780539 0.9990455 -0.8993275 0.9780539 0.9990455 -0.8994464 0.9780539 0.9990455 -0.8995968 0.9780539 0.9990455 -0.899787 0.9780539 0.9990455 -0.9000277 0.9780539 0.9990455 -0.9003323 0.9780539 0.9990455 -0.9007175 0.9780539 0.9990455 -0.9012049 0.9780539 0.9990455 -0.9018215 0.9780539 0.9990455 -0.9026016 0.9780539 0.9990455 -0.9035886 0.9780539 0.9990455 -0.9048372 0.9780539 0.9990455 -0.9064168 0.9780539 0.9990455 -0.9084153 0.9780539 0.9990455 -0.9109436 0.9780539 0.9990455 -0.9141422 0.9780539 0.9990455 -0.9181889 0.9780539 0.9990455 -0.9233085 0.9780539 0.9990455 -0.9297854 0.9780539 0.9990455 -0.9379796 0.9780539 0.9990455 -0.9483463 0.9780539 0.9990455 -0.9614615 0.9780539 0.9990455 -0.9780539 0.9780539 0.9990455 -0.9990455 0.9780539 0.9990455 -0.999247 0.9690013 0.982354 -0.9994057 0.9666876 0.9751513 -0.9995308 0.9680197 0.9733691 -0.9996295 0.9711183 0.9744915 -0.9997074 0.974882 0.977005 -0.9997688 0.9786968 0.980031 -0.9998174 0.9822464 0.9830838 -0.9998557 0.9853905 0.9859157 -0.999886 0.9880897 0.9884188 -0.9999099 0.990358 0.9905641 -0.9999288 0.9922358 0.9923648 -0.9999437 0.9937734 0.9938541 -0.8990028 0.9990461 0.9990461 -0.899002 0.9990461 0.9990461 -0.8990011 0.9990461 0.9990461 -0.899 0.9990461 0.9990461 -0.8989986 0.9990461 0.9990461 -0.8989969 0.9990461 0.9990461 -0.8989948 0.9990461 0.9990461 -0.8989923 0.999046 0.999046 -0.8989895 0.999046 0.999046 -0.8989863 0.9990459 0.9990459 -0.8989829 0.9990459 0.9990459 -0.8989796 0.9990458 0.9990458 -0.8989771 0.9990458 0.9990458 -0.8989767 0.9990457 0.9990457 -0.8989805 0.9990456 0.9990456 -0.8989921 0.9990456 0.9990456 -0.8990175 0.9990455 0.9990455 -0.8990542 0.9990455 0.9990455 -0.8991006 0.9990455 0.9990455 -0.8991593 0.9990455 0.9990455 -0.8992336 0.9990455 0.9990455 -0.8993275 0.9990455 0.9990455 -0.8994464 0.9990455 0.9990455 -0.8995968 0.9990455 0.9990455 -0.899787 0.9990455 0.9990455 -0.9000277 0.9990455 0.9990455 -0.9003323 0.9990455 0.9990455 -0.9007175 0.9990455 0.9990455 -0.9012049 0.9990455 0.9990455 -0.9018215 0.9990455 0.9990455 -0.9026016 0.9990455 0.9990455 -0.9035886 0.9990455 0.9990455 -0.9048372 0.9990455 0.9990455 -0.9064168 0.9990455 0.9990455 -0.9084153 0.9990455 0.9990455 -0.9109436 0.9990455 0.9990455 -0.9141422 0.9990455 0.9990455 -0.9181889 0.9990455 0.9990455 -0.9233085 0.9990455 0.9990455 -0.9297854 0.9990455 0.9990455 -0.9379796 0.9990455 0.9990455 -0.9483463 0.9990455 0.9990455 -0.9614615 0.9990455 0.9990455 -0.9780539 0.9990455 0.9990455 -0.9990455 0.9990455 0.9990455 -0.999247 0.982354 0.982354 -0.9994057 0.9751513 0.9751513 -0.9995308 0.9733691 0.9733691 -0.9996295 0.9744915 0.9744915 -0.9997074 0.977005 0.977005 -0.9997688 0.980031 0.980031 -0.9998174 0.9830838 0.9830838 -0.9998557 0.9859157 0.9859157 -0.999886 0.9884188 0.9884188 -0.9999099 0.9905641 0.9905641 -0.9999288 0.9923648 0.9923648 -0.9999437 0.9938541 0.9938541 -0.9187175 0.9992474 0.9823705 -0.918717 0.9992474 0.9823703 -0.9187164 0.9992474 0.98237 -0.9187157 0.9992474 0.9823697 -0.9187148 0.9992474 0.9823693 -0.9187137 0.9992474 0.9823687 -0.9187123 0.9992473 0.9823681 -0.9187107 0.9992473 0.9823673 -0.9187089 0.9992473 0.9823663 -0.9187068 0.9992473 0.9823651 -0.9187045 0.9992472 0.9823636 -0.9187024 0.9992472 0.982362 -0.9187008 0.9992472 0.9823601 -0.9187004 0.9992471 0.9823581 -0.9187027 0.9992471 0.9823561 -0.9187101 0.999247 0.9823545 -0.9187262 0.999247 0.982354 -0.9187495 0.999247 0.982354 -0.9187791 0.999247 0.982354 -0.9188164 0.999247 0.982354 -0.9188636 0.999247 0.982354 -0.9189234 0.999247 0.982354 -0.918999 0.999247 0.982354 -0.9190947 0.999247 0.982354 -0.9192157 0.999247 0.982354 -0.9193688 0.999247 0.982354 -0.9195625 0.999247 0.982354 -0.9198076 0.999247 0.982354 -0.9201176 0.999247 0.982354 -0.9205098 0.999247 0.982354 -0.9210061 0.999247 0.982354 -0.9216339 0.999247 0.982354 -0.9224281 0.999247 0.982354 -0.9234329 0.999247 0.982354 -0.9247041 0.999247 0.982354 -0.9263124 0.999247 0.982354 -0.928347 0.999247 0.982354 -0.9309211 0.999247 0.982354 -0.9341777 0.999247 0.982354 -0.9382977 0.999247 0.982354 -0.94351 0.999247 0.982354 -0.9501042 0.999247 0.982354 -0.9584468 0.999247 0.982354 -0.9690013 0.999247 0.982354 -0.982354 0.999247 0.982354 -0.999247 0.999247 0.982354 -0.9994057 0.9858591 0.9751513 -0.9995308 0.9801368 0.9733691 -0.9996295 0.978759 0.9744915 -0.9997074 0.9796909 0.977005 -0.9997688 0.981719 0.980031 -0.9998174 0.9841433 0.9830838 -0.9998557 0.9865801 0.9859157 -0.999886 0.9888351 0.9884188 -0.9999099 0.9908248 0.9905641 -0.9999288 0.992528 0.9923648 -0.9999437 0.9939562 0.9938541 -0.9348153 0.999406 0.97517 -0.9348149 0.999406 0.9751697 -0.9348146 0.999406 0.9751694 -0.9348141 0.999406 0.975169 -0.9348135 0.999406 0.9751686 -0.9348128 0.9994059 0.975168 -0.9348119 0.9994059 0.9751672 -0.9348109 0.9994059 0.9751663 -0.9348097 0.9994059 0.9751652 -0.9348083 0.9994059 0.9751638 -0.9348069 0.9994059 0.9751622 -0.9348055 0.9994059 0.9751603 -0.9348044 0.9994058 0.9751582 -0.9348042 0.9994058 0.9751559 -0.9348056 0.9994058 0.9751537 -0.9348102 0.9994057 0.9751519 -0.9348204 0.9994057 0.9751513 -0.9348352 0.9994057 0.9751513 -0.9348539 0.9994057 0.9751513 -0.9348776 0.9994057 0.9751513 -0.9349075 0.9994057 0.9751513 -0.9349454 0.9994057 0.9751513 -0.9349933 0.9994057 0.9751513 -0.935054 0.9994057 0.9751513 -0.9351307 0.9994057 0.9751513 -0.9352277 0.9994057 0.9751513 -0.9353505 0.9994057 0.9751513 -0.9355059 0.9994057 0.9751513 -0.9357024 0.9994057 0.9751513 -0.935951 0.9994057 0.9751513 -0.9362655 0.9994057 0.9751513 -0.9366635 0.9994057 0.9751513 -0.9371669 0.9994057 0.9751513 -0.9378038 0.9994057 0.9751513 -0.9386096 0.9994057 0.9751513 -0.939629 0.9994057 0.9751513 -0.9409186 0.9994057 0.9751513 -0.9425502 0.9994057 0.9751513 -0.9446144 0.9994057 0.9751513 -0.9472259 0.9994057 0.9751513 -0.9505298 0.9994057 0.9751513 -0.9547096 0.9994057 0.9751513 -0.9599976 0.9994057 0.9751513 -0.9666876 0.9994057 0.9751513 -0.9751513 0.9994057 0.9751513 -0.9858591 0.9994057 0.9751513 -0.9994057 0.9994057 0.9751513 -0.9995308 0.9886988 0.9733691 -0.9996295 0.9841579 0.9744915 -0.9997074 0.983089 0.977005 -0.9997688 0.9838545 0.980031 -0.9998174 0.9854838 0.9830838 -0.9998557 0.9874207 0.9859157 -0.999886 0.9893618 0.9884188 -0.9999099 0.9911547 0.9905641 -0.9999288 0.9927345 0.9923648 -0.9999437 0.9940854 0.9938541 -0.9478754 0.999531 0.9733851 -0.9478752 0.999531 0.9733849 -0.947875 0.999531 0.9733846 -0.9478746 0.999531 0.9733843 -0.9478743 0.999531 0.9733838 -0.9478738 0.999531 0.9733833 -0.9478733 0.999531 0.9733827 -0.9478726 0.999531 0.9733819 -0.9478718 0.999531 0.9733809 -0.947871 0.9995309 0.9733798 -0.94787 0.9995309 0.9733784 -0.9478691 0.9995309 0.9733768 -0.9478684 0.9995309 0.9733749 -0.9478683 0.9995309 0.973373 -0.9478691 0.9995309 0.9733711 -0.947872 0.9995309 0.9733696 -0.9478785 0.9995308 0.9733691 -0.9478878 0.9995308 0.9733691 -0.9478997 0.9995308 0.9733691 -0.9479146 0.9995308 0.9733691 -0.9479335 0.9995308 0.9733691 -0.9479575 0.9995308 0.9733691 -0.9479878 0.9995308 0.9733691 -0.9480261 0.9995308 0.9733691 -0.9480746 0.9995308 0.9733691 -0.9481359 0.9995308 0.9733691 -0.9482135 0.9995308 0.9733691 -0.9483117 0.9995308 0.9733691 -0.9484359 0.9995308 0.9733691 -0.9485931 0.9995308 0.9733691 -0.9487918 0.9995308 0.9733691 -0.9490434 0.9995308 0.9733691 -0.9493615 0.9995308 0.9733691 -0.9497641 0.9995308 0.9733691 -0.9502734 0.9995308 0.9733691 -0.9509177 0.9995308 0.9733691 -0.9517328 0.9995308 0.9733691 -0.952764 0.9995308 0.9733691 -0.9540687 0.9995308 0.9733691 -0.9557192 0.9995308 0.9733691 -0.9578074 0.9995308 0.9733691 -0.9604492 0.9995308 0.9733691 -0.9637914 0.9995308 0.9733691 -0.9680197 0.9995308 0.9733691 -0.9733691 0.9995308 0.9733691 -0.9801368 0.9995308 0.9733691 -0.9886988 0.9995308 0.9733691 -0.9995308 0.9995308 0.9733691 -0.9996295 0.9909882 0.9744915 -0.9997074 0.9873879 0.977005 -0.9997688 0.9865561 0.980031 -0.9998174 0.9871796 0.9830838 -0.9998557 0.9884841 0.9859157 -0.999886 0.9900282 0.9884188 -0.9999099 0.991572 0.9905641 -0.9999288 0.9929957 0.9923648 -0.9999437 0.9942488 0.9938541 -0.958416 0.9996296 0.9745036 -0.9584159 0.9996296 0.9745034 -0.9584157 0.9996296 0.9745032 -0.9584155 0.9996296 0.974503 -0.9584153 0.9996296 0.9745027 -0.958415 0.9996296 0.9745023 -0.9584146 0.9996296 0.9745018 -0.9584142 0.9996296 0.9745012 -0.9584137 0.9996296 0.9745005 -0.9584132 0.9996296 0.9744996 -0.9584126 0.9996296 0.9744985 -0.958412 0.9996296 0.9744973 -0.9584115 0.9996296 0.9744959 -0.9584114 0.9996295 0.9744944 -0.958412 0.9996295 0.974493 -0.9584138 0.9996295 0.9744918 -0.9584178 0.9996295 0.9744915 -0.9584237 0.9996295 0.9744915 -0.9584312 0.9996295 0.9744915 -0.9584406 0.9996295 0.9744915 -0.9584526 0.9996295 0.9744915 -0.9584677 0.9996295 0.9744915 -0.9584868 0.9996295 0.9744915 -0.9585109 0.9996295 0.9744915 -0.9585415 0.9996295 0.9744915 -0.9585802 0.9996295 0.9744915 -0.9586291 0.9996295 0.9744915 -0.958691 0.9996295 0.9744915 -0.9587693 0.9996295 0.9744915 -0.9588684 0.9996295 0.9744915 -0.9589938 0.9996295 0.9744915 -0.9591524 0.9996295 0.9744915 -0.959353 0.9996295 0.9744915 -0.9596068 0.9996295 0.9744915 -0.959928 0.9996295 0.9744915 -0.9603343 0.9996295 0.9744915 -0.9608482 0.9996295 0.9744915 -0.9614985 0.9996295 0.9744915 -0.9623212 0.9996295 0.9744915 -0.963362 0.9996295 0.9744915 -0.9646787 0.9996295 0.9744915 -0.9663445 0.9996295 0.9744915 -0.968452 0.9996295 0.9744915 -0.9711183 0.9996295 0.9744915 -0.9744915 0.9996295 0.9744915 -0.978759 0.9996295 0.9744915 -0.9841579 0.9996295 0.9744915 -0.9909882 0.9996295 0.9744915 -0.9996295 0.9996295 0.9744915 -0.9997074 0.9928267 0.977005 -0.9997688 0.9899741 0.980031 -0.9998174 0.989325 0.9830838 -0.9998557 0.9898295 0.9859157 -0.999886 0.9908712 0.9884188 -0.9999099 0.9920999 0.9905641 -0.9999288 0.9933261 0.9923648 -0.9999437 0.9944556 0.9938541 -0.9668873 0.9997074 0.9770137 -0.9668872 0.9997074 0.9770136 -0.9668871 0.9997074 0.9770135 -0.966887 0.9997074 0.9770133 -0.9668869 0.9997074 0.977013 -0.9668867 0.9997074 0.9770128 -0.9668865 0.9997074 0.9770124 -0.9668862 0.9997074 0.977012 -0.9668859 0.9997074 0.9770115 -0.9668855 0.9997074 0.9770108 -0.9668852 0.9997074 0.9770101 -0.9668848 0.9997074 0.9770092 -0.9668845 0.9997074 0.9770082 -0.9668844 0.9997074 0.9770071 -0.9668847 0.9997074 0.9770061 -0.9668859 0.9997074 0.9770053 -0.9668884 0.9997074 0.977005 -0.9668922 0.9997074 0.977005 -0.9668969 0.9997074 0.977005 -0.9669028 0.9997074 0.977005 -0.9669103 0.9997074 0.977005 -0.9669198 0.9997074 0.977005 -0.9669318 0.9997074 0.977005 -0.966947 0.9997074 0.977005 -0.9669663 0.9997074 0.977005 -0.9669906 0.9997074 0.977005 -0.9670214 0.9997074 0.977005 -0.9670604 0.9997074 0.977005 -0.9671097 0.9997074 0.977005 -0.967172 0.9997074 0.977005 -0.9672509 0.9997074 0.977005 -0.9673508 0.9997074 0.977005 -0.967477 0.9997074 0.977005 -0.9676368 0.9997074 0.977005 -0.9678389 0.9997074 0.977005 -0.9680946 0.9997074 0.977005 -0.9684181 0.9997074 0.977005 -0.9688274 0.9997074 0.977005 -0.9693452 0.9997074 0.977005 -0.9700002 0.9997074 0.977005 -0.970829 0.9997074 0.977005 -0.9718774 0.9997074 0.977005 -0.9732039 0.9997074 0.977005 -0.974882 0.9997074 0.977005 -0.977005 0.9997074 0.977005 -0.9796909 0.9997074 0.977005 -0.983089 0.9997074 0.977005 -0.9873879 0.9997074 0.977005 -0.9928267 0.9997074 0.977005 -0.9997074 0.9997074 0.977005 -0.9997688 0.9942982 0.980031 -0.9998174 0.9920392 0.9830838 -0.9998557 0.9915316 0.9859157 -0.999886 0.9919377 0.9884188 -0.9999099 0.9927678 0.9905641 -0.9999288 0.9937442 0.9923648 -0.9999437 0.9947172 0.9938541 -0.9736726 0.9997689 0.980037 -0.9736726 0.9997689 0.9800369 -0.9736725 0.9997689 0.9800368 -0.9736724 0.9997689 0.9800367 -0.9736723 0.9997689 0.9800366 -0.9736722 0.9997689 0.9800364 -0.9736721 0.9997689 0.9800361 -0.9736719 0.9997689 0.9800358 -0.9736717 0.9997689 0.9800355 -0.9736715 0.9997689 0.980035 -0.9736712 0.9997689 0.9800345 -0.973671 0.9997689 0.9800339 -0.9736708 0.9997689 0.9800332 -0.9736708 0.9997689 0.9800325 -0.973671 0.9997688 0.9800318 -0.9736717 0.9997688 0.9800312 -0.9736733 0.9997688 0.980031 -0.9736756 0.9997688 0.980031 -0.9736786 0.9997688 0.980031 -0.9736823 0.9997688 0.980031 -0.973687 0.9997688 0.980031 -0.973693 0.9997688 0.980031 -0.9737006 0.9997688 0.980031 -0.9737101 0.9997688 0.980031 -0.9737222 0.9997688 0.980031 -0.9737375 0.9997688 0.980031 -0.9737569 0.9997688 0.980031 -0.9737814 0.9997688 0.980031 -0.9738123 0.9997688 0.980031 -0.9738515 0.9997688 0.980031 -0.9739011 0.9997688 0.980031 -0.9739638 0.9997688 0.980031 -0.9740432 0.9997688 0.980031 -0.9741436 0.9997688 0.980031 -0.9742706 0.9997688 0.980031 -0.9744313 0.9997688 0.980031 -0.9746346 0.9997688 0.980031 -0.9748918 0.9997688 0.980031 -0.9752172 0.9997688 0.980031 -0.9756289 0.9997688 0.980031 -0.9761497 0.9997688 0.980031 -0.9768086 0.9997688 0.980031 -0.9776422 0.9997688 0.980031 -0.9786968 0.9997688 0.980031 -0.980031 0.9997688 0.980031 -0.981719 0.9997688 0.980031 -0.9838545 0.9997688 0.980031 -0.9865561 0.9997688 0.980031 -0.9899741 0.9997688 0.980031 -0.9942982 0.9997688 0.980031 -0.9997688 0.9997688 0.980031 -0.9998174 0.9954731 0.9830838 -0.9998557 0.9936849 0.9859157 -0.999886 0.993287 0.9884188 -0.9999099 0.9936128 0.9905641 -0.9999288 0.9942731 0.9923648 -0.9999437 0.9950481 0.9938541 -0.9790927 0.9998174 0.9830878 -0.9790927 0.9998174 0.9830878 -0.9790927 0.9998174 0.9830877 -0.9790926 0.9998174 0.9830876 -0.9790925 0.9998174 0.9830875 -0.9790925 0.9998174 0.9830874 -0.9790924 0.9998174 0.9830872 -0.9790923 0.9998174 0.983087 -0.9790921 0.9998174 0.9830868 -0.979092 0.9998174 0.9830865 -0.9790919 0.9998174 0.9830862 -0.9790917 0.9998174 0.9830858 -0.9790916 0.9998174 0.9830853 -0.9790916 0.9998174 0.9830848 -0.9790917 0.9998174 0.9830843 -0.9790921 0.9998174 0.9830839 -0.9790931 0.9998174 0.9830838 -0.9790946 0.9998174 0.9830838 -0.9790965 0.9998174 0.9830838 -0.9790988 0.9998174 0.9830838 -0.9791018 0.9998174 0.9830838 -0.9791055 0.9998174 0.9830838 -0.9791103 0.9998174 0.9830838 -0.9791163 0.9998174 0.9830838 -0.9791238 0.9998174 0.9830838 -0.9791334 0.9998174 0.9830838 -0.9791456 0.9998174 0.9830838 -0.979161 0.9998174 0.9830838 -0.9791804 0.9998174 0.9830838 -0.979205 0.9998174 0.9830838 -0.9792361 0.9998174 0.9830838 -0.9792755 0.9998174 0.9830838 -0.9793253 0.9998174 0.9830838 -0.9793883 0.9998174 0.9830838 -0.9794681 0.9998174 0.9830838 -0.9795689 0.9998174 0.9830838 -0.9796966 0.9998174 0.9830838 -0.979858 0.9998174 0.9830838 -0.9800622 0.9998174 0.9830838 -0.9803206 0.9998174 0.9830838 -0.9806476 0.9998174 0.9830838 -0.9810611 0.9998174 0.9830838 -0.9815844 0.9998174 0.9830838 -0.9822464 0.9998174 0.9830838 -0.9830838 0.9998174 0.9830838 -0.9841433 0.9998174 0.9830838 -0.9854838 0.9998174 0.9830838 -0.9871796 0.9998174 0.9830838 -0.989325 0.9998174 0.9830838 -0.9920392 0.9998174 0.9830838 -0.9954731 0.9998174 0.9830838 -0.9998174 0.9998174 0.9830838 -0.9998557 0.9964092 0.9859157 -0.999886 0.9949941 0.9884188 -0.9999099 0.9946818 0.9905641 -0.9999288 0.9949422 0.9923648 -0.9999437 0.9954668 0.9938541 -0.9834129 0.9998557 0.9859184 -0.9834129 0.9998557 0.9859183 -0.9834129 0.9998557 0.9859183 -0.9834129 0.9998557 0.9859182 -0.9834128 0.9998557 0.9859182 -0.9834128 0.9998557 0.9859181 -0.9834127 0.9998557 0.985918 -0.9834127 0.9998557 0.9859178 -0.9834126 0.9998557 0.9859177 -0.9834125 0.9998557 0.9859175 -0.9834124 0.9998557 0.9859173 -0.9834123 0.9998557 0.985917 -0.9834122 0.9998557 0.9859167 -0.9834122 0.9998557 0.9859164 -0.9834123 0.9998557 0.985916 -0.9834126 0.9998557 0.9859158 -0.9834132 0.9998557 0.9859157 -0.9834141 0.9998557 0.9859157 -0.9834153 0.9998557 0.9859157 -0.9834167 0.9998557 0.9859157 -0.9834186 0.9998557 0.9859157 -0.9834209 0.9998557 0.9859157 -0.9834239 0.9998557 0.9859157 -0.9834277 0.9998557 0.9859157 -0.9834324 0.9998557 0.9859157 -0.9834385 0.9998557 0.9859157 -0.9834461 0.9998557 0.9859157 -0.9834557 0.9998557 0.9859157 -0.9834679 0.9998557 0.9859157 -0.9834833 0.9998557 0.9859157 -0.9835029 0.9998557 0.9859157 -0.9835276 0.9998557 0.9859157 -0.9835588 0.9998557 0.9859157 -0.9835983 0.9998557 0.9859157 -0.9836483 0.9998557 0.9859157 -0.9837116 0.9998557 0.9859157 -0.9837916 0.9998557 0.9859157 -0.9838928 0.9998557 0.9859157 -0.9840209 0.9998557 0.9859157 -0.9841829 0.9998557 0.9859157 -0.984388 0.9998557 0.9859157 -0.9846473 0.9998557 0.9859157 -0.9849754 0.9998557 0.9859157 -0.9853905 0.9998557 0.9859157 -0.9859157 0.9998557 0.9859157 -0.9865801 0.9998557 0.9859157 -0.9874207 0.9998557 0.9859157 -0.9884841 0.9998557 0.9859157 -0.9898295 0.9998557 0.9859157 -0.9915316 0.9998557 0.9859157 -0.9936849 0.9998557 0.9859157 -0.9964092 0.9998557 0.9859157 -0.9998557 0.9998557 0.9859157 -0.999886 0.9971537 0.9884188 -0.9999099 0.9960342 0.9905641 -0.9999288 0.9957887 0.9923648 -0.9999437 0.9959964 0.9938541 -0.9868505 0.999886 0.9884205 -0.9868505 0.999886 0.9884205 -0.9868505 0.999886 0.9884204 -0.9868505 0.999886 0.9884204 -0.9868504 0.999886 0.9884204 -0.9868504 0.999886 0.9884203 -0.9868504 0.999886 0.9884202 -0.9868503 0.999886 0.9884202 -0.9868503 0.999886 0.9884201 -0.9868502 0.999886 0.9884199 -0.9868502 0.999886 0.9884198 -0.9868501 0.999886 0.9884196 -0.9868501 0.999886 0.9884194 -0.98685 0.999886 0.9884192 -0.9868501 0.999886 0.988419 -0.9868503 0.999886 0.9884188 -0.9868507 0.999886 0.9884188 -0.9868512 0.999886 0.9884188 -0.986852 0.999886 0.9884188 -0.9868529 0.999886 0.9884188 -0.9868541 0.999886 0.9884188 -0.9868555 0.999886 0.9884188 -0.9868574 0.999886 0.9884188 -0.9868597 0.999886 0.9884188 -0.9868627 0.999886 0.9884188 -0.9868665 0.999886 0.9884188 -0.9868713 0.999886 0.9884188 -0.9868773 0.999886 0.9884188 -0.986885 0.999886 0.9884188 -0.9868946 0.999886 0.9884188 -0.9869069 0.999886 0.9884188 -0.9869223 0.999886 0.9884188 -0.9869419 0.999886 0.9884188 -0.9869667 0.999886 0.9884188 -0.986998 0.999886 0.9884188 -0.9870376 0.999886 0.9884188 -0.9870878 0.999886 0.9884188 -0.9871512 0.999886 0.9884188 -0.9872315 0.999886 0.9884188 -0.987333 0.999886 0.9884188 -0.9874615 0.999886 0.9884188 -0.987624 0.999886 0.9884188 -0.9878296 0.999886 0.9884188 -0.9880897 0.999886 0.9884188 -0.9884188 0.999886 0.9884188 -0.9888351 0.999886 0.9884188 -0.9893618 0.999886 0.9884188 -0.9900282 0.999886 0.9884188 -0.9908712 0.999886 0.9884188 -0.9919377 0.999886 0.9884188 -0.993287 0.999886 0.9884188 -0.9949941 0.999886 0.9884188 -0.9971537 0.999886 0.9884188 -0.999886 0.999886 0.9884188 -0.9999099 0.9977452 0.9905641 -0.9999288 0.9968597 0.9923648 -0.9999437 0.9966665 0.9938541 -0.989582 0.9999099 0.9905652 -0.989582 0.9999099 0.9905652 -0.989582 0.9999099 0.9905652 -0.989582 0.9999099 0.9905652 -0.989582 0.9999099 0.9905651 -0.9895819 0.9999099 0.9905651 -0.9895819 0.9999099 0.9905651 -0.9895819 0.9999099 0.990565 -0.9895819 0.9999099 0.9905649 -0.9895818 0.9999099 0.9905648 -0.9895818 0.9999099 0.9905648 -0.9895818 0.9999099 0.9905646 -0.9895817 0.9999099 0.9905645 -0.9895817 0.9999099 0.9905644 -0.9895817 0.9999099 0.9905642 -0.9895819 0.9999099 0.9905641 -0.9895821 0.9999099 0.9905641 -0.9895825 0.9999099 0.9905641 -0.9895829 0.9999099 0.9905641 -0.9895835 0.9999099 0.9905641 -0.9895842 0.9999099 0.9905641 -0.9895851 0.9999099 0.9905641 -0.9895863 0.9999099 0.9905641 -0.9895878 0.9999099 0.9905641 -0.9895897 0.9999099 0.9905641 -0.989592 0.9999099 0.9905641 -0.989595 0.9999099 0.9905641 -0.9895988 0.9999099 0.9905641 -0.9896036 0.9999099 0.9905641 -0.9896096 0.9999099 0.9905641 -0.9896173 0.9999099 0.9905641 -0.989627 0.9999099 0.9905641 -0.9896392 0.9999099 0.9905641 -0.9896547 0.9999099 0.9905641 -0.9896744 0.9999099 0.9905641 -0.9896992 0.9999099 0.9905641 -0.9897306 0.9999099 0.9905641 -0.9897703 0.9999099 0.9905641 -0.9898206 0.9999099 0.9905641 -0.9898842 0.9999099 0.9905641 -0.9899646 0.9999099 0.9905641 -0.9900664 0.9999099 0.9905641 -0.9901951 0.9999099 0.9905641 -0.990358 0.9999099 0.9905641 -0.9905641 0.9999099 0.9905641 -0.9908248 0.9999099 0.9905641 -0.9911547 0.9999099 0.9905641 -0.991572 0.9999099 0.9905641 -0.9920999 0.9999099 0.9905641 -0.9927678 0.9999099 0.9905641 -0.9936128 0.9999099 0.9905641 -0.9946818 0.9999099 0.9905641 -0.9960342 0.9999099 0.9905641 -0.9977452 0.9999099 0.9905641 -0.9999099 0.9999099 0.9905641 -0.9999288 0.9982146 0.9923648 -0.9999437 0.9975143 0.9938541 -0.9917501 0.9999288 0.9923655 -0.9917501 0.9999288 0.9923655 -0.9917501 0.9999288 0.9923655 -0.9917501 0.9999288 0.9923655 -0.9917501 0.9999288 0.9923655 -0.9917501 0.9999288 0.9923655 -0.99175 0.9999288 0.9923654 -0.99175 0.9999288 0.9923654 -0.99175 0.9999288 0.9923653 -0.99175 0.9999288 0.9923653 -0.99175 0.9999288 0.9923652 -0.9917499 0.9999288 0.9923652 -0.9917499 0.9999288 0.9923651 -0.9917499 0.9999288 0.992365 -0.9917499 0.9999288 0.9923649 -0.99175 0.9999288 0.9923648 -0.9917502 0.9999288 0.9923648 -0.9917504 0.9999288 0.9923648 -0.9917507 0.9999288 0.9923648 -0.991751 0.9999288 0.9923648 -0.9917515 0.9999288 0.9923648 -0.9917521 0.9999288 0.9923648 -0.9917528 0.9999288 0.9923648 -0.9917537 0.9999288 0.9923648 -0.9917549 0.9999288 0.9923648 -0.9917564 0.9999288 0.9923648 -0.9917582 0.9999288 0.9923648 -0.9917606 0.9999288 0.9923648 -0.9917636 0.9999288 0.9923648 -0.9917674 0.9999288 0.9923648 -0.9917722 0.9999288 0.9923648 -0.9917782 0.9999288 0.9923648 -0.9917859 0.9999288 0.9923648 -0.9917956 0.9999288 0.9923648 -0.9918079 0.9999288 0.9923648 -0.9918234 0.9999288 0.9923648 -0.9918431 0.9999288 0.9923648 -0.991868 0.9999288 0.9923648 -0.9918994 0.9999288 0.9923648 -0.9919392 0.9999288 0.9923648 -0.9919896 0.9999288 0.9923648 -0.9920533 0.9999288 0.9923648 -0.9921339 0.9999288 0.9923648 -0.9922358 0.9999288 0.9923648 -0.9923648 0.9999288 0.9923648 -0.992528 0.9999288 0.9923648 -0.9927345 0.9999288 0.9923648 -0.9929957 0.9999288 0.9923648 -0.9933261 0.9999288 0.9923648 -0.9937442 0.9999288 0.9923648 -0.9942731 0.9999288 0.9923648 -0.9949422 0.9999288 0.9923648 -0.9957887 0.9999288 0.9923648 -0.9968597 0.9999288 0.9923648 -0.9982146 0.9999288 0.9923648 -0.9999288 0.9999288 0.9923648 -0.9999437 0.9985868 0.9938541 -0.9934695 0.9999437 0.9938546 -0.9934695 0.9999437 0.9938546 -0.9934695 0.9999437 0.9938546 -0.9934695 0.9999437 0.9938545 -0.9934695 0.9999437 0.9938545 -0.9934695 0.9999437 0.9938545 -0.9934695 0.9999437 0.9938545 -0.9934694 0.9999437 0.9938545 -0.9934694 0.9999437 0.9938545 -0.9934694 0.9999437 0.9938544 -0.9934694 0.9999437 0.9938544 -0.9934694 0.9999437 0.9938543 -0.9934694 0.9999437 0.9938543 -0.9934694 0.9999437 0.9938542 -0.9934694 0.9999437 0.9938542 -0.9934694 0.9999437 0.9938541 -0.9934695 0.9999437 0.9938541 -0.9934697 0.9999437 0.9938541 -0.9934698 0.9999437 0.9938541 -0.9934701 0.9999437 0.9938541 -0.9934704 0.9999437 0.9938541 -0.9934707 0.9999437 0.9938541 -0.9934712 0.9999437 0.9938541 -0.9934718 0.9999437 0.9938541 -0.9934725 0.9999437 0.9938541 -0.9934734 0.9999437 0.9938541 -0.9934746 0.9999437 0.9938541 -0.9934761 0.9999437 0.9938541 -0.9934779 0.9999437 0.9938541 -0.9934803 0.9999437 0.9938541 -0.9934833 0.9999437 0.9938541 -0.9934871 0.9999437 0.9938541 -0.9934919 0.9999437 0.9938541 -0.993498 0.9999437 0.9938541 -0.9935057 0.9999437 0.9938541 -0.9935154 0.9999437 0.9938541 -0.9935277 0.9999437 0.9938541 -0.9935432 0.9999437 0.9938541 -0.9935629 0.9999437 0.9938541 -0.9935878 0.9999437 0.9938541 -0.9936193 0.9999437 0.9938541 -0.9936592 0.9999437 0.9938541 -0.9937096 0.9999437 0.9938541 -0.9937734 0.9999437 0.9938541 -0.9938541 0.9999437 0.9938541 -0.9939562 0.9999437 0.9938541 -0.9940854 0.9999437 0.9938541 -0.9942488 0.9999437 0.9938541 -0.9944556 0.9999437 0.9938541 -0.9947172 0.9999437 0.9938541 -0.9950481 0.9999437 0.9938541 -0.9954668 0.9999437 0.9938541 -0.9959964 0.9999437 0.9938541 -0.9966665 0.9999437 0.9938541 -0.9975143 0.9999437 0.9938541 -0.9985868 0.9999437 0.9938541 -0.9999437 0.9999437 0.9938541 -0.9187175 0.9187175 0.9992474 -0.918718 0.9187175 0.9992474 -0.9187187 0.9187175 0.9992474 -0.9187196 0.9187175 0.9992474 -0.9187207 0.9187175 0.9992474 -0.9187221 0.9187175 0.9992474 -0.9187238 0.9187175 0.9992474 -0.918726 0.9187175 0.9992474 -0.9187289 0.9187175 0.9992474 -0.9187324 0.9187175 0.9992474 -0.9187369 0.9187175 0.9992474 -0.9187426 0.9187175 0.9992474 -0.9187498 0.9187175 0.9992474 -0.9187589 0.9187175 0.9992474 -0.9187704 0.9187175 0.9992474 -0.9187849 0.9187175 0.9992474 -0.9188034 0.9187175 0.9992474 -0.9188267 0.9187175 0.9992474 -0.9188562 0.9187175 0.9992474 -0.9188935 0.9187175 0.9992474 -0.9189407 0.9187175 0.9992474 -0.9190004 0.9187175 0.9992474 -0.9190759 0.9187175 0.9992474 -0.9191715 0.9187175 0.9992474 -0.9192924 0.9187175 0.9992474 -0.9194454 0.9187175 0.9992474 -0.9196389 0.9187175 0.9992474 -0.9198837 0.9187175 0.9992474 -0.9201934 0.9187175 0.9992474 -0.9205853 0.9187175 0.9992474 -0.9210811 0.9187175 0.9992474 -0.9217082 0.9187175 0.9992474 -0.9225017 0.9187175 0.9992474 -0.9235056 0.9187175 0.9992474 -0.9247756 0.9187175 0.9992474 -0.9263823 0.9187175 0.9992474 -0.928415 0.9187175 0.9992474 -0.9309867 0.9187175 0.9992474 -0.9342401 0.9187175 0.9992474 -0.9383562 0.9187175 0.9992474 -0.9435635 0.9187175 0.9992474 -0.9501515 0.9187175 0.9992474 -0.9584861 0.9187175 0.9992474 -0.9690305 0.9187175 0.9992474 -0.9823705 0.9187175 0.9992474 -0.9992474 0.9187175 0.9992474 -0.999406 0.9348153 0.9858696 -0.999531 0.9478754 0.9801487 -0.9996296 0.958416 0.978769 -0.9997074 0.9668873 0.9796986 -0.9997689 0.9736726 0.9817245 -0.9998174 0.9790927 0.9841471 -0.9998557 0.9834129 0.9865826 -0.999886 0.9868505 0.9888368 -0.9999099 0.989582 0.9908259 -0.9999288 0.9917501 0.9925287 -0.9999437 0.9934695 0.9939567 -0.9187175 0.918718 0.9992474 -0.918717 0.918717 0.9992474 -0.9187177 0.918717 0.9992474 -0.9187186 0.918717 0.9992474 -0.9187197 0.918717 0.9992474 -0.9187211 0.918717 0.9992474 -0.9187228 0.918717 0.9992474 -0.918725 0.918717 0.9992474 -0.9187278 0.918717 0.9992474 -0.9187314 0.918717 0.9992474 -0.9187359 0.918717 0.9992474 -0.9187416 0.918717 0.9992474 -0.9187488 0.918717 0.9992474 -0.9187579 0.918717 0.9992474 -0.9187694 0.918717 0.9992474 -0.9187839 0.918717 0.9992474 -0.9188024 0.918717 0.9992474 -0.9188257 0.918717 0.9992474 -0.9188551 0.918717 0.9992474 -0.9188925 0.918717 0.9992474 -0.9189397 0.918717 0.9992474 -0.9189994 0.918717 0.9992474 -0.9190749 0.918717 0.9992474 -0.9191705 0.918717 0.9992474 -0.9192914 0.918717 0.9992474 -0.9194443 0.918717 0.9992474 -0.9196379 0.918717 0.9992474 -0.9198827 0.918717 0.9992474 -0.9201924 0.918717 0.9992474 -0.9205843 0.918717 0.9992474 -0.9210801 0.918717 0.9992474 -0.9217073 0.918717 0.9992474 -0.9225007 0.918717 0.9992474 -0.9235046 0.918717 0.9992474 -0.9247746 0.918717 0.9992474 -0.9263814 0.918717 0.9992474 -0.9284141 0.918717 0.9992474 -0.9309858 0.918717 0.9992474 -0.9342393 0.918717 0.9992474 -0.9383554 0.918717 0.9992474 -0.9435628 0.918717 0.9992474 -0.9501508 0.918717 0.9992474 -0.9584856 0.918717 0.9992474 -0.9690301 0.918717 0.9992474 -0.9823703 0.918717 0.9992474 -0.9992474 0.918717 0.9992474 -0.999406 0.9348149 0.9858695 -0.999531 0.9478752 0.9801485 -0.9996296 0.9584159 0.9787689 -0.9997074 0.9668872 0.9796985 -0.9997689 0.9736726 0.9817244 -0.9998174 0.9790927 0.9841471 -0.9998557 0.9834129 0.9865826 -0.999886 0.9868505 0.9888367 -0.9999099 0.989582 0.9908259 -0.9999288 0.9917501 0.9925287 -0.9999437 0.9934695 0.9939567 -0.9187175 0.9187187 0.9992474 -0.918717 0.9187177 0.9992474 -0.9187164 0.9187164 0.9992474 -0.9187173 0.9187164 0.9992474 -0.9187184 0.9187164 0.9992474 -0.9187198 0.9187164 0.9992474 -0.9187215 0.9187164 0.9992474 -0.9187237 0.9187164 0.9992474 -0.9187266 0.9187164 0.9992474 -0.9187301 0.9187164 0.9992474 -0.9187346 0.9187164 0.9992474 -0.9187403 0.9187164 0.9992474 -0.9187475 0.9187164 0.9992474 -0.9187566 0.9187164 0.9992474 -0.9187681 0.9187164 0.9992474 -0.9187826 0.9187164 0.9992474 -0.9188011 0.9187164 0.9992474 -0.9188244 0.9187164 0.9992474 -0.9188539 0.9187164 0.9992474 -0.9188912 0.9187164 0.9992474 -0.9189384 0.9187164 0.9992474 -0.9189981 0.9187164 0.9992474 -0.9190736 0.9187164 0.9992474 -0.9191692 0.9187164 0.9992474 -0.9192901 0.9187164 0.9992474 -0.9194431 0.9187164 0.9992474 -0.9196366 0.9187164 0.9992474 -0.9198814 0.9187164 0.9992474 -0.9201912 0.9187164 0.9992474 -0.9205831 0.9187164 0.9992474 -0.9210788 0.9187164 0.9992474 -0.921706 0.9187164 0.9992474 -0.9224995 0.9187164 0.9992474 -0.9235034 0.9187164 0.9992474 -0.9247734 0.9187164 0.9992474 -0.9263802 0.9187164 0.9992474 -0.928413 0.9187164 0.9992474 -0.9309847 0.9187164 0.9992474 -0.9342383 0.9187164 0.9992474 -0.9383544 0.9187164 0.9992474 -0.9435619 0.9187164 0.9992474 -0.9501501 0.9187164 0.9992474 -0.9584849 0.9187164 0.9992474 -0.9690296 0.9187164 0.9992474 -0.98237 0.9187164 0.9992474 -0.9992474 0.9187164 0.9992474 -0.999406 0.9348146 0.9858693 -0.999531 0.947875 0.9801483 -0.9996296 0.9584157 0.9787687 -0.9997074 0.9668871 0.9796984 -0.9997689 0.9736725 0.9817243 -0.9998174 0.9790927 0.984147 -0.9998557 0.9834129 0.9865826 -0.999886 0.9868505 0.9888367 -0.9999099 0.989582 0.9908259 -0.9999288 0.9917501 0.9925287 -0.9999437 0.9934695 0.9939567 -0.9187175 0.9187196 0.9992474 -0.918717 0.9187186 0.9992474 -0.9187164 0.9187173 0.9992474 -0.9187157 0.9187157 0.9992474 -0.9187168 0.9187157 0.9992474 -0.9187182 0.9187157 0.9992474 -0.9187199 0.9187157 0.9992474 -0.9187221 0.9187157 0.9992474 -0.9187249 0.9187157 0.9992474 -0.9187285 0.9187157 0.9992474 -0.918733 0.9187157 0.9992474 -0.9187387 0.9187157 0.9992474 -0.9187459 0.9187157 0.9992474 -0.918755 0.9187157 0.9992474 -0.9187665 0.9187157 0.9992474 -0.918781 0.9187157 0.9992474 -0.9187995 0.9187157 0.9992474 -0.9188228 0.9187157 0.9992474 -0.9188523 0.9187157 0.9992474 -0.9188896 0.9187157 0.9992474 -0.9189368 0.9187157 0.9992474 -0.9189965 0.9187157 0.9992474 -0.919072 0.9187157 0.9992474 -0.9191676 0.9187157 0.9992474 -0.9192885 0.9187157 0.9992474 -0.9194415 0.9187157 0.9992474 -0.919635 0.9187157 0.9992474 -0.9198799 0.9187157 0.9992474 -0.9201896 0.9187157 0.9992474 -0.9205815 0.9187157 0.9992474 -0.9210773 0.9187157 0.9992474 -0.9217045 0.9187157 0.9992474 -0.922498 0.9187157 0.9992474 -0.9235019 0.9187157 0.9992474 -0.924772 0.9187157 0.9992474 -0.9263788 0.9187157 0.9992474 -0.9284116 0.9187157 0.9992474 -0.9309833 0.9187157 0.9992474 -0.934237 0.9187157 0.9992474 -0.9383532 0.9187157 0.9992474 -0.9435608 0.9187157 0.9992474 -0.9501491 0.9187157 0.9992474 -0.9584841 0.9187157 0.9992474 -0.969029 0.9187157 0.9992474 -0.9823697 0.9187157 0.9992474 -0.9992474 0.9187157 0.9992474 -0.999406 0.9348141 0.9858691 -0.999531 0.9478746 0.9801481 -0.9996296 0.9584155 0.9787685 -0.9997074 0.966887 0.9796982 -0.9997689 0.9736724 0.9817242 -0.9998174 0.9790926 0.9841469 -0.9998557 0.9834129 0.9865825 -0.999886 0.9868505 0.9888367 -0.9999099 0.989582 0.9908259 -0.9999288 0.9917501 0.9925287 -0.9999437 0.9934695 0.9939566 -0.9187175 0.9187207 0.9992474 -0.918717 0.9187197 0.9992474 -0.9187164 0.9187184 0.9992474 -0.9187157 0.9187168 0.9992474 -0.9187148 0.9187148 0.9992474 -0.9187162 0.9187148 0.9992474 -0.9187179 0.9187148 0.9992474 -0.9187201 0.9187148 0.9992474 -0.9187229 0.9187148 0.9992474 -0.9187265 0.9187148 0.9992474 -0.918731 0.9187148 0.9992474 -0.9187367 0.9187148 0.9992474 -0.9187439 0.9187148 0.9992474 -0.918753 0.9187148 0.9992474 -0.9187645 0.9187148 0.9992474 -0.918779 0.9187148 0.9992474 -0.9187975 0.9187148 0.9992474 -0.9188208 0.9187148 0.9992474 -0.9188503 0.9187148 0.9992474 -0.9188876 0.9187148 0.9992474 -0.9189348 0.9187148 0.9992474 -0.9189945 0.9187148 0.9992474 -0.91907 0.9187148 0.9992474 -0.9191656 0.9187148 0.9992474 -0.9192865 0.9187148 0.9992474 -0.9194395 0.9187148 0.9992474 -0.919633 0.9187148 0.9992474 -0.9198779 0.9187148 0.9992474 -0.9201876 0.9187148 0.9992474 -0.9205795 0.9187148 0.9992474 -0.9210753 0.9187148 0.9992474 -0.9217025 0.9187148 0.9992474 -0.9224961 0.9187148 0.9992474 -0.9235 0.9187148 0.9992474 -0.9247701 0.9187148 0.9992474 -0.9263769 0.9187148 0.9992474 -0.9284098 0.9187148 0.9992474 -0.9309816 0.9187148 0.9992474 -0.9342353 0.9187148 0.9992474 -0.9383517 0.9187148 0.9992474 -0.9435594 0.9187148 0.9992474 -0.9501479 0.9187148 0.9992474 -0.9584831 0.9187148 0.9992474 -0.9690283 0.9187148 0.9992474 -0.9823693 0.9187148 0.9992474 -0.9992474 0.9187148 0.9992474 -0.999406 0.9348135 0.9858688 -0.999531 0.9478743 0.9801478 -0.9996296 0.9584153 0.9787683 -0.9997074 0.9668869 0.979698 -0.9997689 0.9736723 0.981724 -0.9998174 0.9790925 0.9841468 -0.9998557 0.9834128 0.9865825 -0.999886 0.9868504 0.9888366 -0.9999099 0.989582 0.9908258 -0.9999288 0.9917501 0.9925287 -0.9999437 0.9934695 0.9939566 -0.9187175 0.9187221 0.9992474 -0.918717 0.9187211 0.9992474 -0.9187164 0.9187198 0.9992474 -0.9187157 0.9187182 0.9992474 -0.9187148 0.9187162 0.9992474 -0.9187137 0.9187137 0.9992474 -0.9187154 0.9187137 0.9992474 -0.9187176 0.9187137 0.9992474 -0.9187204 0.9187137 0.9992474 -0.918724 0.9187137 0.9992474 -0.9187285 0.9187137 0.9992474 -0.9187342 0.9187137 0.9992474 -0.9187414 0.9187137 0.9992474 -0.9187505 0.9187137 0.9992474 -0.918762 0.9187137 0.9992474 -0.9187765 0.9187137 0.9992474 -0.918795 0.9187137 0.9992474 -0.9188183 0.9187137 0.9992474 -0.9188478 0.9187137 0.9992474 -0.9188851 0.9187137 0.9992474 -0.9189323 0.9187137 0.9992474 -0.918992 0.9187137 0.9992474 -0.9190675 0.9187137 0.9992474 -0.9191631 0.9187137 0.9992474 -0.919284 0.9187137 0.9992474 -0.919437 0.9187137 0.9992474 -0.9196306 0.9187137 0.9992474 -0.9198754 0.9187137 0.9992474 -0.9201852 0.9187137 0.9992474 -0.9205771 0.9187137 0.9992474 -0.9210729 0.9187137 0.9992474 -0.9217001 0.9187137 0.9992474 -0.9224937 0.9187137 0.9992474 -0.9234977 0.9187137 0.9992474 -0.9247678 0.9187137 0.9992474 -0.9263747 0.9187137 0.9992474 -0.9284076 0.9187137 0.9992474 -0.9309795 0.9187137 0.9992474 -0.9342333 0.9187137 0.9992474 -0.9383498 0.9187137 0.9992474 -0.9435577 0.9187137 0.9992474 -0.9501463 0.9187137 0.9992474 -0.9584818 0.9187137 0.9992474 -0.9690273 0.9187137 0.9992474 -0.9823687 0.9187137 0.9992474 -0.9992474 0.9187137 0.9992474 -0.9994059 0.9348128 0.9858684 -0.999531 0.9478738 0.9801474 -0.9996296 0.958415 0.9787679 -0.9997074 0.9668867 0.9796978 -0.9997689 0.9736722 0.9817239 -0.9998174 0.9790925 0.9841467 -0.9998557 0.9834128 0.9865824 -0.999886 0.9868504 0.9888366 -0.9999099 0.9895819 0.9908258 -0.9999288 0.9917501 0.9925286 -0.9999437 0.9934695 0.9939566 -0.9187175 0.9187238 0.9992474 -0.918717 0.9187228 0.9992474 -0.9187164 0.9187215 0.9992474 -0.9187157 0.9187199 0.9992474 -0.9187148 0.9187179 0.9992474 -0.9187137 0.9187154 0.9992474 -0.9187123 0.9187123 0.9992473 -0.9187145 0.9187123 0.9992473 -0.9187173 0.9187123 0.9992473 -0.9187209 0.9187123 0.9992473 -0.9187254 0.9187123 0.9992473 -0.9187311 0.9187123 0.9992473 -0.9187383 0.9187123 0.9992473 -0.9187474 0.9187123 0.9992473 -0.9187589 0.9187123 0.9992473 -0.9187734 0.9187123 0.9992473 -0.9187919 0.9187123 0.9992473 -0.9188152 0.9187123 0.9992473 -0.9188447 0.9187123 0.9992473 -0.918882 0.9187123 0.9992473 -0.9189292 0.9187123 0.9992473 -0.9189889 0.9187123 0.9992473 -0.9190645 0.9187123 0.9992473 -0.91916 0.9187123 0.9992473 -0.919281 0.9187123 0.9992473 -0.919434 0.9187123 0.9992473 -0.9196275 0.9187123 0.9992473 -0.9198724 0.9187123 0.9992473 -0.9201821 0.9187123 0.9992473 -0.9205741 0.9187123 0.9992473 -0.9210699 0.9187123 0.9992473 -0.9216972 0.9187123 0.9992473 -0.9224907 0.9187123 0.9992473 -0.9234947 0.9187123 0.9992473 -0.9247649 0.9187123 0.9992473 -0.9263719 0.9187123 0.9992473 -0.9284049 0.9187123 0.9992473 -0.9309769 0.9187123 0.9992473 -0.9342308 0.9187123 0.9992473 -0.9383474 0.9187123 0.9992473 -0.9435555 0.9187123 0.9992473 -0.9501444 0.9187123 0.9992473 -0.9584803 0.9187123 0.9992473 -0.9690261 0.9187123 0.9992473 -0.9823681 0.9187123 0.9992473 -0.9992473 0.9187123 0.9992473 -0.9994059 0.9348119 0.985868 -0.999531 0.9478733 0.9801469 -0.9996296 0.9584146 0.9787675 -0.9997074 0.9668865 0.9796975 -0.9997689 0.9736721 0.9817236 -0.9998174 0.9790924 0.9841465 -0.9998557 0.9834127 0.9865823 -0.999886 0.9868504 0.9888365 -0.9999099 0.9895819 0.9908257 -0.9999288 0.99175 0.9925286 -0.9999437 0.9934695 0.9939566 -0.9187175 0.918726 0.9992474 -0.918717 0.918725 0.9992474 -0.9187164 0.9187237 0.9992474 -0.9187157 0.9187221 0.9992474 -0.9187148 0.9187201 0.9992474 -0.9187137 0.9187176 0.9992474 -0.9187123 0.9187145 0.9992473 -0.9187107 0.9187107 0.9992473 -0.9187135 0.9187107 0.9992473 -0.9187171 0.9187107 0.9992473 -0.9187216 0.9187107 0.9992473 -0.9187273 0.9187107 0.9992473 -0.9187344 0.9187107 0.9992473 -0.9187435 0.9187107 0.9992473 -0.9187551 0.9187107 0.9992473 -0.9187696 0.9187107 0.9992473 -0.9187881 0.9187107 0.9992473 -0.9188114 0.9187107 0.9992473 -0.9188409 0.9187107 0.9992473 -0.9188782 0.9187107 0.9992473 -0.9189254 0.9187107 0.9992473 -0.9189851 0.9187107 0.9992473 -0.9190607 0.9187107 0.9992473 -0.9191562 0.9187107 0.9992473 -0.9192772 0.9187107 0.9992473 -0.9194302 0.9187107 0.9992473 -0.9196237 0.9187107 0.9992473 -0.9198686 0.9187107 0.9992473 -0.9201784 0.9187107 0.9992473 -0.9205703 0.9187107 0.9992473 -0.9210662 0.9187107 0.9992473 -0.9216935 0.9187107 0.9992473 -0.9224871 0.9187107 0.9992473 -0.9234912 0.9187107 0.9992473 -0.9247614 0.9187107 0.9992473 -0.9263684 0.9187107 0.9992473 -0.9284015 0.9187107 0.9992473 -0.9309736 0.9187107 0.9992473 -0.9342277 0.9187107 0.9992473 -0.9383446 0.9187107 0.9992473 -0.9435529 0.9187107 0.9992473 -0.9501421 0.9187107 0.9992473 -0.9584783 0.9187107 0.9992473 -0.9690247 0.9187107 0.9992473 -0.9823673 0.9187107 0.9992473 -0.9992473 0.9187107 0.9992473 -0.9994059 0.9348109 0.9858675 -0.999531 0.9478726 0.9801463 -0.9996296 0.9584142 0.978767 -0.9997074 0.9668862 0.9796971 -0.9997689 0.9736719 0.9817234 -0.9998174 0.9790923 0.9841464 -0.9998557 0.9834127 0.9865821 -0.999886 0.9868503 0.9888364 -0.9999099 0.9895819 0.9908257 -0.9999288 0.99175 0.9925286 -0.9999437 0.9934694 0.9939566 -0.9187175 0.9187289 0.9992474 -0.918717 0.9187278 0.9992474 -0.9187164 0.9187266 0.9992474 -0.9187157 0.9187249 0.9992474 -0.9187148 0.9187229 0.9992474 -0.9187137 0.9187204 0.9992474 -0.9187123 0.9187173 0.9992473 -0.9187107 0.9187135 0.9992473 -0.9187089 0.9187089 0.9992473 -0.9187124 0.9187089 0.9992473 -0.9187169 0.9187089 0.9992473 -0.9187226 0.9187089 0.9992473 -0.9187298 0.9187089 0.9992473 -0.9187389 0.9187089 0.9992473 -0.9187504 0.9187089 0.9992473 -0.918765 0.9187089 0.9992473 -0.9187834 0.9187089 0.9992473 -0.9188067 0.9187089 0.9992473 -0.9188362 0.9187089 0.9992473 -0.9188735 0.9187089 0.9992473 -0.9189207 0.9187089 0.9992473 -0.9189805 0.9187089 0.9992473 -0.919056 0.9187089 0.9992473 -0.9191516 0.9187089 0.9992473 -0.9192725 0.9187089 0.9992473 -0.9194255 0.9187089 0.9992473 -0.9196191 0.9187089 0.9992473 -0.919864 0.9187089 0.9992473 -0.9201738 0.9187089 0.9992473 -0.9205658 0.9187089 0.9992473 -0.9210616 0.9187089 0.9992473 -0.921689 0.9187089 0.9992473 -0.9224827 0.9187089 0.9992473 -0.9234868 0.9187089 0.9992473 -0.9247571 0.9187089 0.9992473 -0.9263642 0.9187089 0.9992473 -0.9283974 0.9187089 0.9992473 -0.9309697 0.9187089 0.9992473 -0.934224 0.9187089 0.9992473 -0.938341 0.9187089 0.9992473 -0.9435497 0.9187089 0.9992473 -0.9501392 0.9187089 0.9992473 -0.9584759 0.9187089 0.9992473 -0.9690229 0.9187089 0.9992473 -0.9823663 0.9187089 0.9992473 -0.9992473 0.9187089 0.9992473 -0.9994059 0.9348097 0.9858669 -0.999531 0.9478718 0.9801456 -0.9996296 0.9584137 0.9787664 -0.9997074 0.9668859 0.9796966 -0.9997689 0.9736717 0.981723 -0.9998174 0.9790921 0.9841461 -0.9998557 0.9834126 0.986582 -0.999886 0.9868503 0.9888363 -0.9999099 0.9895819 0.9908256 -0.9999288 0.99175 0.9925285 -0.9999437 0.9934694 0.9939566 -0.9187175 0.9187324 0.9992474 -0.918717 0.9187314 0.9992474 -0.9187164 0.9187301 0.9992474 -0.9187157 0.9187285 0.9992474 -0.9187148 0.9187265 0.9992474 -0.9187137 0.918724 0.9992474 -0.9187123 0.9187209 0.9992473 -0.9187107 0.9187171 0.9992473 -0.9187089 0.9187124 0.9992473 -0.9187068 0.9187068 0.9992473 -0.9187113 0.9187068 0.9992473 -0.918717 0.9187068 0.9992473 -0.9187241 0.9187068 0.9992473 -0.9187332 0.9187068 0.9992473 -0.9187448 0.9187068 0.9992473 -0.9187593 0.9187068 0.9992473 -0.9187778 0.9187068 0.9992473 -0.9188011 0.9187068 0.9992473 -0.9188306 0.9187068 0.9992473 -0.9188679 0.9187068 0.9992473 -0.9189151 0.9187068 0.9992473 -0.9189748 0.9187068 0.9992473 -0.9190504 0.9187068 0.9992473 -0.919146 0.9187068 0.9992473 -0.9192669 0.9187068 0.9992473 -0.9194199 0.9187068 0.9992473 -0.9196135 0.9187068 0.9992473 -0.9198584 0.9187068 0.9992473 -0.9201683 0.9187068 0.9992473 -0.9205603 0.9187068 0.9992473 -0.9210562 0.9187068 0.9992473 -0.9216836 0.9187068 0.9992473 -0.9224773 0.9187068 0.9992473 -0.9234815 0.9187068 0.9992473 -0.9247519 0.9187068 0.9992473 -0.9263591 0.9187068 0.9992473 -0.9283924 0.9187068 0.9992473 -0.9309649 0.9187068 0.9992473 -0.9342194 0.9187068 0.9992473 -0.9383367 0.9187068 0.9992473 -0.9435457 0.9187068 0.9992473 -0.9501358 0.9187068 0.9992473 -0.9584731 0.9187068 0.9992473 -0.9690208 0.9187068 0.9992473 -0.9823651 0.9187068 0.9992473 -0.9992473 0.9187068 0.9992473 -0.9994059 0.9348083 0.9858661 -0.9995309 0.947871 0.9801447 -0.9996296 0.9584132 0.9787657 -0.9997074 0.9668855 0.9796961 -0.9997689 0.9736715 0.9817226 -0.9998174 0.979092 0.9841459 -0.9998557 0.9834125 0.9865818 -0.999886 0.9868502 0.9888362 -0.9999099 0.9895818 0.9908255 -0.9999288 0.99175 0.9925285 -0.9999437 0.9934694 0.9939565 -0.9187175 0.9187369 0.9992474 -0.918717 0.9187359 0.9992474 -0.9187164 0.9187346 0.9992474 -0.9187157 0.918733 0.9992474 -0.9187148 0.918731 0.9992474 -0.9187137 0.9187285 0.9992474 -0.9187123 0.9187254 0.9992473 -0.9187107 0.9187216 0.9992473 -0.9187089 0.9187169 0.9992473 -0.9187068 0.9187113 0.9992473 -0.9187045 0.9187045 0.9992472 -0.9187102 0.9187045 0.9992472 -0.9187174 0.9187045 0.9992472 -0.9187265 0.9187045 0.9992472 -0.918738 0.9187045 0.9992472 -0.9187526 0.9187045 0.9992472 -0.918771 0.9187045 0.9992472 -0.9187944 0.9187045 0.9992472 -0.9188239 0.9187045 0.9992472 -0.9188612 0.9187045 0.9992472 -0.9189084 0.9187045 0.9992472 -0.9189681 0.9187045 0.9992472 -0.9190437 0.9187045 0.9992472 -0.9191393 0.9187045 0.9992472 -0.9192603 0.9187045 0.9992472 -0.9194133 0.9187045 0.9992472 -0.9196069 0.9187045 0.9992472 -0.9198518 0.9187045 0.9992472 -0.9201617 0.9187045 0.9992472 -0.9205537 0.9187045 0.9992472 -0.9210496 0.9187045 0.9992472 -0.9216771 0.9187045 0.9992472 -0.9224709 0.9187045 0.9992472 -0.9234751 0.9187045 0.9992472 -0.9247456 0.9187045 0.9992472 -0.926353 0.9187045 0.9992472 -0.9283865 0.9187045 0.9992472 -0.9309592 0.9187045 0.9992472 -0.934214 0.9187045 0.9992472 -0.9383317 0.9187045 0.9992472 -0.9435411 0.9187045 0.9992472 -0.9501317 0.9187045 0.9992472 -0.9584696 0.9187045 0.9992472 -0.9690183 0.9187045 0.9992472 -0.9823636 0.9187045 0.9992472 -0.9992472 0.9187045 0.9992472 -0.9994059 0.9348069 0.9858652 -0.9995309 0.94787 0.9801437 -0.9996296 0.9584126 0.9787648 -0.9997074 0.9668852 0.9796954 -0.9997689 0.9736712 0.9817222 -0.9998174 0.9790919 0.9841455 -0.9998557 0.9834124 0.9865816 -0.999886 0.9868502 0.9888361 -0.9999099 0.9895818 0.9908255 -0.9999288 0.99175 0.9925284 -0.9999437 0.9934694 0.9939565 -0.9187175 0.9187426 0.9992474 -0.918717 0.9187416 0.9992474 -0.9187164 0.9187403 0.9992474 -0.9187157 0.9187387 0.9992474 -0.9187148 0.9187367 0.9992474 -0.9187137 0.9187342 0.9992474 -0.9187123 0.9187311 0.9992473 -0.9187107 0.9187273 0.9992473 -0.9187089 0.9187226 0.9992473 -0.9187068 0.918717 0.9992473 -0.9187045 0.9187102 0.9992472 -0.9187024 0.9187024 0.9992472 -0.9187096 0.9187024 0.9992472 -0.9187187 0.9187024 0.9992472 -0.9187302 0.9187024 0.9992472 -0.9187448 0.9187024 0.9992472 -0.9187632 0.9187024 0.9992472 -0.9187865 0.9187024 0.9992472 -0.918816 0.9187024 0.9992472 -0.9188534 0.9187024 0.9992472 -0.9189006 0.9187024 0.9992472 -0.9189603 0.9187024 0.9992472 -0.9190359 0.9187024 0.9992472 -0.9191315 0.9187024 0.9992472 -0.9192525 0.9187024 0.9992472 -0.9194055 0.9187024 0.9992472 -0.9195991 0.9187024 0.9992472 -0.9198441 0.9187024 0.9992472 -0.920154 0.9187024 0.9992472 -0.920546 0.9187024 0.9992472 -0.921042 0.9187024 0.9992472 -0.9216695 0.9187024 0.9992472 -0.9224634 0.9187024 0.9992472 -0.9234678 0.9187024 0.9992472 -0.9247384 0.9187024 0.9992472 -0.9263459 0.9187024 0.9992472 -0.9283796 0.9187024 0.9992472 -0.9309526 0.9187024 0.9992472 -0.9342076 0.9187024 0.9992472 -0.9383257 0.9187024 0.9992472 -0.9435357 0.9187024 0.9992472 -0.9501269 0.9187024 0.9992472 -0.9584657 0.9187024 0.9992472 -0.9690153 0.9187024 0.9992472 -0.982362 0.9187024 0.9992472 -0.9992472 0.9187024 0.9992472 -0.9994059 0.9348055 0.9858641 -0.9995309 0.9478691 0.9801425 -0.9996296 0.958412 0.9787638 -0.9997074 0.9668848 0.9796946 -0.9997689 0.973671 0.9817216 -0.9998174 0.9790917 0.9841451 -0.9998557 0.9834123 0.9865813 -0.999886 0.9868501 0.9888359 -0.9999099 0.9895818 0.9908253 -0.9999288 0.9917499 0.9925283 -0.9999437 0.9934694 0.9939564 -0.9187175 0.9187498 0.9992474 -0.918717 0.9187488 0.9992474 -0.9187164 0.9187475 0.9992474 -0.9187157 0.9187459 0.9992474 -0.9187148 0.9187439 0.9992474 -0.9187137 0.9187414 0.9992474 -0.9187123 0.9187383 0.9992473 -0.9187107 0.9187344 0.9992473 -0.9187089 0.9187298 0.9992473 -0.9187068 0.9187241 0.9992473 -0.9187045 0.9187174 0.9992472 -0.9187024 0.9187096 0.9992472 -0.9187008 0.9187008 0.9992472 -0.9187099 0.9187008 0.9992472 -0.9187214 0.9187008 0.9992472 -0.918736 0.9187008 0.9992472 -0.9187544 0.9187008 0.9992472 -0.9187777 0.9187008 0.9992472 -0.9188072 0.9187008 0.9992472 -0.9188446 0.9187008 0.9992472 -0.9188918 0.9187008 0.9992472 -0.9189515 0.9187008 0.9992472 -0.9190271 0.9187008 0.9992472 -0.9191227 0.9187008 0.9992472 -0.9192437 0.9187008 0.9992472 -0.9193968 0.9187008 0.9992472 -0.9195904 0.9187008 0.9992472 -0.9198354 0.9187008 0.9992472 -0.9201453 0.9187008 0.9992472 -0.9205374 0.9187008 0.9992472 -0.9210335 0.9187008 0.9992472 -0.921661 0.9187008 0.9992472 -0.922455 0.9187008 0.9992472 -0.9234595 0.9187008 0.9992472 -0.9247302 0.9187008 0.9992472 -0.9263379 0.9187008 0.9992472 -0.9283719 0.9187008 0.9992472 -0.9309451 0.9187008 0.9992472 -0.9342005 0.9187008 0.9992472 -0.938319 0.9187008 0.9992472 -0.9435295 0.9187008 0.9992472 -0.9501215 0.9187008 0.9992472 -0.9584612 0.9187008 0.9992472 -0.969012 0.9187008 0.9992472 -0.9823601 0.9187008 0.9992472 -0.9992472 0.9187008 0.9992472 -0.9994058 0.9348044 0.9858629 -0.9995309 0.9478684 0.9801411 -0.9996296 0.9584115 0.9787626 -0.9997074 0.9668845 0.9796937 -0.9997689 0.9736708 0.981721 -0.9998174 0.9790916 0.9841447 -0.9998557 0.9834122 0.986581 -0.999886 0.9868501 0.9888357 -0.9999099 0.9895817 0.9908252 -0.9999288 0.9917499 0.9925283 -0.9999437 0.9934694 0.9939564 -0.9187175 0.9187589 0.9992474 -0.918717 0.9187579 0.9992474 -0.9187164 0.9187566 0.9992474 -0.9187157 0.918755 0.9992474 -0.9187148 0.918753 0.9992474 -0.9187137 0.9187505 0.9992474 -0.9187123 0.9187474 0.9992473 -0.9187107 0.9187435 0.9992473 -0.9187089 0.9187389 0.9992473 -0.9187068 0.9187332 0.9992473 -0.9187045 0.9187265 0.9992472 -0.9187024 0.9187187 0.9992472 -0.9187008 0.9187099 0.9992472 -0.9187004 0.9187004 0.9992471 -0.9187119 0.9187004 0.9992471 -0.9187265 0.9187004 0.9992471 -0.918745 0.9187004 0.9992471 -0.9187683 0.9187004 0.9992471 -0.9187978 0.9187004 0.9992471 -0.9188351 0.9187004 0.9992471 -0.9188823 0.9187004 0.9992471 -0.9189421 0.9187004 0.9992471 -0.9190177 0.9187004 0.9992471 -0.9191133 0.9187004 0.9992471 -0.9192343 0.9187004 0.9992471 -0.9193874 0.9187004 0.9992471 -0.9195811 0.9187004 0.9992471 -0.9198261 0.9187004 0.9992471 -0.920136 0.9187004 0.9992471 -0.9205282 0.9187004 0.9992471 -0.9210243 0.9187004 0.9992471 -0.9216519 0.9187004 0.9992471 -0.922446 0.9187004 0.9992471 -0.9234506 0.9187004 0.9992471 -0.9247215 0.9187004 0.9992471 -0.9263294 0.9187004 0.9992471 -0.9283635 0.9187004 0.9992471 -0.930937 0.9187004 0.9992471 -0.9341929 0.9187004 0.9992471 -0.9383119 0.9187004 0.9992471 -0.943523 0.9187004 0.9992471 -0.9501157 0.9187004 0.9992471 -0.9584564 0.9187004 0.9992471 -0.9690084 0.9187004 0.9992471 -0.9823581 0.9187004 0.9992471 -0.9992471 0.9187004 0.9992471 -0.9994058 0.9348042 0.9858616 -0.9995309 0.9478683 0.9801397 -0.9996295 0.9584114 0.9787614 -0.9997074 0.9668844 0.9796928 -0.9997689 0.9736708 0.9817203 -0.9998174 0.9790916 0.9841443 -0.9998557 0.9834122 0.9865807 -0.999886 0.98685 0.9888355 -0.9999099 0.9895817 0.9908251 -0.9999288 0.9917499 0.9925282 -0.9999437 0.9934694 0.9939563 -0.9187175 0.9187704 0.9992474 -0.918717 0.9187694 0.9992474 -0.9187164 0.9187681 0.9992474 -0.9187157 0.9187665 0.9992474 -0.9187148 0.9187645 0.9992474 -0.9187137 0.918762 0.9992474 -0.9187123 0.9187589 0.9992473 -0.9187107 0.9187551 0.9992473 -0.9187089 0.9187504 0.9992473 -0.9187068 0.9187448 0.9992473 -0.9187045 0.918738 0.9992472 -0.9187024 0.9187302 0.9992472 -0.9187008 0.9187214 0.9992472 -0.9187004 0.9187119 0.9992471 -0.9187027 0.9187027 0.9992471 -0.9187173 0.9187027 0.9992471 -0.9187358 0.9187027 0.9992471 -0.9187591 0.9187027 0.9992471 -0.9187886 0.9187027 0.9992471 -0.9188259 0.9187027 0.9992471 -0.9188732 0.9187027 0.9992471 -0.9189329 0.9187027 0.9992471 -0.9190085 0.9187027 0.9992471 -0.9191042 0.9187027 0.9992471 -0.9192252 0.9187027 0.9992471 -0.9193783 0.9187027 0.9992471 -0.919572 0.9187027 0.9992471 -0.919817 0.9187027 0.9992471 -0.920127 0.9187027 0.9992471 -0.9205192 0.9187027 0.9992471 -0.9210153 0.9187027 0.9992471 -0.9216431 0.9187027 0.9992471 -0.9224372 0.9187027 0.9992471 -0.9234419 0.9187027 0.9992471 -0.924713 0.9187027 0.9992471 -0.926321 0.9187027 0.9992471 -0.9283554 0.9187027 0.9992471 -0.9309292 0.9187027 0.9992471 -0.9341854 0.9187027 0.9992471 -0.9383049 0.9187027 0.9992471 -0.9435166 0.9187027 0.9992471 -0.9501101 0.9187027 0.9992471 -0.9584517 0.9187027 0.9992471 -0.9690049 0.9187027 0.9992471 -0.9823561 0.9187027 0.9992471 -0.9992471 0.9187027 0.9992471 -0.9994058 0.9348056 0.9858604 -0.9995309 0.9478691 0.9801383 -0.9996295 0.958412 0.9787602 -0.9997074 0.9668847 0.9796919 -0.9997688 0.973671 0.9817197 -0.9998174 0.9790917 0.9841438 -0.9998557 0.9834123 0.9865804 -0.999886 0.9868501 0.9888353 -0.9999099 0.9895817 0.990825 -0.9999288 0.9917499 0.9925281 -0.9999437 0.9934694 0.9939563 -0.9187175 0.9187849 0.9992474 -0.918717 0.9187839 0.9992474 -0.9187164 0.9187826 0.9992474 -0.9187157 0.918781 0.9992474 -0.9187148 0.918779 0.9992474 -0.9187137 0.9187765 0.9992474 -0.9187123 0.9187734 0.9992473 -0.9187107 0.9187696 0.9992473 -0.9187089 0.918765 0.9992473 -0.9187068 0.9187593 0.9992473 -0.9187045 0.9187526 0.9992472 -0.9187024 0.9187448 0.9992472 -0.9187008 0.918736 0.9992472 -0.9187004 0.9187265 0.9992471 -0.9187027 0.9187173 0.9992471 -0.9187101 0.9187101 0.999247 -0.9187285 0.9187101 0.999247 -0.9187518 0.9187101 0.999247 -0.9187814 0.9187101 0.999247 -0.9188187 0.9187101 0.999247 -0.9188659 0.9187101 0.999247 -0.9189257 0.9187101 0.999247 -0.9190013 0.9187101 0.999247 -0.919097 0.9187101 0.999247 -0.919218 0.9187101 0.999247 -0.9193711 0.9187101 0.999247 -0.9195648 0.9187101 0.999247 -0.9198099 0.9187101 0.999247 -0.9201199 0.9187101 0.999247 -0.9205121 0.9187101 0.999247 -0.9210083 0.9187101 0.999247 -0.9216361 0.9187101 0.999247 -0.9224303 0.9187101 0.999247 -0.9234351 0.9187101 0.999247 -0.9247063 0.9187101 0.999247 -0.9263145 0.9187101 0.999247 -0.9283491 0.9187101 0.999247 -0.9309231 0.9187101 0.999247 -0.9341796 0.9187101 0.999247 -0.9382994 0.9187101 0.999247 -0.9435116 0.9187101 0.999247 -0.9501056 0.9187101 0.999247 -0.958448 0.9187101 0.999247 -0.9690022 0.9187101 0.999247 -0.9823545 0.9187101 0.999247 -0.999247 0.9187101 0.999247 -0.9994057 0.9348102 0.9858594 -0.9995309 0.947872 0.9801372 -0.9996295 0.9584138 0.9787593 -0.9997074 0.9668859 0.9796912 -0.9997688 0.9736717 0.9817191 -0.9998174 0.9790921 0.9841435 -0.9998557 0.9834126 0.9865802 -0.999886 0.9868503 0.9888352 -0.9999099 0.9895819 0.9908249 -0.9999288 0.99175 0.992528 -0.9999437 0.9934694 0.9939562 -0.9187175 0.9188034 0.9992474 -0.918717 0.9188024 0.9992474 -0.9187164 0.9188011 0.9992474 -0.9187157 0.9187995 0.9992474 -0.9187148 0.9187975 0.9992474 -0.9187137 0.918795 0.9992474 -0.9187123 0.9187919 0.9992473 -0.9187107 0.9187881 0.9992473 -0.9187089 0.9187834 0.9992473 -0.9187068 0.9187778 0.9992473 -0.9187045 0.918771 0.9992472 -0.9187024 0.9187632 0.9992472 -0.9187008 0.9187544 0.9992472 -0.9187004 0.918745 0.9992471 -0.9187027 0.9187358 0.9992471 -0.9187101 0.9187285 0.999247 -0.9187262 0.9187262 0.999247 -0.9187495 0.9187262 0.999247 -0.9187791 0.9187262 0.999247 -0.9188164 0.9187262 0.999247 -0.9188636 0.9187262 0.999247 -0.9189234 0.9187262 0.999247 -0.918999 0.9187262 0.999247 -0.9190947 0.9187262 0.999247 -0.9192157 0.9187262 0.999247 -0.9193688 0.9187262 0.999247 -0.9195625 0.9187262 0.999247 -0.9198076 0.9187262 0.999247 -0.9201176 0.9187262 0.999247 -0.9205098 0.9187262 0.999247 -0.9210061 0.9187262 0.999247 -0.9216339 0.9187262 0.999247 -0.9224281 0.9187262 0.999247 -0.9234329 0.9187262 0.999247 -0.9247041 0.9187262 0.999247 -0.9263124 0.9187262 0.999247 -0.928347 0.9187262 0.999247 -0.9309211 0.9187262 0.999247 -0.9341777 0.9187262 0.999247 -0.9382977 0.9187262 0.999247 -0.94351 0.9187262 0.999247 -0.9501042 0.9187262 0.999247 -0.9584468 0.9187262 0.999247 -0.9690013 0.9187262 0.999247 -0.982354 0.9187262 0.999247 -0.999247 0.9187262 0.999247 -0.9994057 0.9348204 0.9858591 -0.9995308 0.9478785 0.9801368 -0.9996295 0.9584178 0.978759 -0.9997074 0.9668884 0.9796909 -0.9997688 0.9736733 0.981719 -0.9998174 0.9790931 0.9841433 -0.9998557 0.9834132 0.9865801 -0.999886 0.9868507 0.9888351 -0.9999099 0.9895821 0.9908248 -0.9999288 0.9917502 0.992528 -0.9999437 0.9934695 0.9939562 -0.9187175 0.9188267 0.9992474 -0.918717 0.9188257 0.9992474 -0.9187164 0.9188244 0.9992474 -0.9187157 0.9188228 0.9992474 -0.9187148 0.9188208 0.9992474 -0.9187137 0.9188183 0.9992474 -0.9187123 0.9188152 0.9992473 -0.9187107 0.9188114 0.9992473 -0.9187089 0.9188067 0.9992473 -0.9187068 0.9188011 0.9992473 -0.9187045 0.9187944 0.9992472 -0.9187024 0.9187865 0.9992472 -0.9187008 0.9187777 0.9992472 -0.9187004 0.9187683 0.9992471 -0.9187027 0.9187591 0.9992471 -0.9187101 0.9187518 0.999247 -0.9187262 0.9187495 0.999247 -0.9187495 0.9187495 0.999247 -0.9187791 0.9187495 0.999247 -0.9188164 0.9187495 0.999247 -0.9188636 0.9187495 0.999247 -0.9189234 0.9187495 0.999247 -0.918999 0.9187495 0.999247 -0.9190947 0.9187495 0.999247 -0.9192157 0.9187495 0.999247 -0.9193688 0.9187495 0.999247 -0.9195625 0.9187495 0.999247 -0.9198076 0.9187495 0.999247 -0.9201176 0.9187495 0.999247 -0.9205098 0.9187495 0.999247 -0.9210061 0.9187495 0.999247 -0.9216339 0.9187495 0.999247 -0.9224281 0.9187495 0.999247 -0.9234329 0.9187495 0.999247 -0.9247041 0.9187495 0.999247 -0.9263124 0.9187495 0.999247 -0.928347 0.9187495 0.999247 -0.9309211 0.9187495 0.999247 -0.9341777 0.9187495 0.999247 -0.9382977 0.9187495 0.999247 -0.94351 0.9187495 0.999247 -0.9501042 0.9187495 0.999247 -0.9584468 0.9187495 0.999247 -0.9690013 0.9187495 0.999247 -0.982354 0.9187495 0.999247 -0.999247 0.9187495 0.999247 -0.9994057 0.9348352 0.9858591 -0.9995308 0.9478878 0.9801368 -0.9996295 0.9584237 0.978759 -0.9997074 0.9668922 0.9796909 -0.9997688 0.9736756 0.981719 -0.9998174 0.9790946 0.9841433 -0.9998557 0.9834141 0.9865801 -0.999886 0.9868512 0.9888351 -0.9999099 0.9895825 0.9908248 -0.9999288 0.9917504 0.992528 -0.9999437 0.9934697 0.9939562 -0.9187175 0.9188562 0.9992474 -0.918717 0.9188551 0.9992474 -0.9187164 0.9188539 0.9992474 -0.9187157 0.9188523 0.9992474 -0.9187148 0.9188503 0.9992474 -0.9187137 0.9188478 0.9992474 -0.9187123 0.9188447 0.9992473 -0.9187107 0.9188409 0.9992473 -0.9187089 0.9188362 0.9992473 -0.9187068 0.9188306 0.9992473 -0.9187045 0.9188239 0.9992472 -0.9187024 0.918816 0.9992472 -0.9187008 0.9188072 0.9992472 -0.9187004 0.9187978 0.9992471 -0.9187027 0.9187886 0.9992471 -0.9187101 0.9187814 0.999247 -0.9187262 0.9187791 0.999247 -0.9187495 0.9187791 0.999247 -0.9187791 0.9187791 0.999247 -0.9188164 0.9187791 0.999247 -0.9188636 0.9187791 0.999247 -0.9189234 0.9187791 0.999247 -0.918999 0.9187791 0.999247 -0.9190947 0.9187791 0.999247 -0.9192157 0.9187791 0.999247 -0.9193688 0.9187791 0.999247 -0.9195625 0.9187791 0.999247 -0.9198076 0.9187791 0.999247 -0.9201176 0.9187791 0.999247 -0.9205098 0.9187791 0.999247 -0.9210061 0.9187791 0.999247 -0.9216339 0.9187791 0.999247 -0.9224281 0.9187791 0.999247 -0.9234329 0.9187791 0.999247 -0.9247041 0.9187791 0.999247 -0.9263124 0.9187791 0.999247 -0.928347 0.9187791 0.999247 -0.9309211 0.9187791 0.999247 -0.9341777 0.9187791 0.999247 -0.9382977 0.9187791 0.999247 -0.94351 0.9187791 0.999247 -0.9501042 0.9187791 0.999247 -0.9584468 0.9187791 0.999247 -0.9690013 0.9187791 0.999247 -0.982354 0.9187791 0.999247 -0.999247 0.9187791 0.999247 -0.9994057 0.9348539 0.9858591 -0.9995308 0.9478997 0.9801368 -0.9996295 0.9584312 0.978759 -0.9997074 0.9668969 0.9796909 -0.9997688 0.9736786 0.981719 -0.9998174 0.9790965 0.9841433 -0.9998557 0.9834153 0.9865801 -0.999886 0.986852 0.9888351 -0.9999099 0.9895829 0.9908248 -0.9999288 0.9917507 0.992528 -0.9999437 0.9934698 0.9939562 -0.9187175 0.9188935 0.9992474 -0.918717 0.9188925 0.9992474 -0.9187164 0.9188912 0.9992474 -0.9187157 0.9188896 0.9992474 -0.9187148 0.9188876 0.9992474 -0.9187137 0.9188851 0.9992474 -0.9187123 0.918882 0.9992473 -0.9187107 0.9188782 0.9992473 -0.9187089 0.9188735 0.9992473 -0.9187068 0.9188679 0.9992473 -0.9187045 0.9188612 0.9992472 -0.9187024 0.9188534 0.9992472 -0.9187008 0.9188446 0.9992472 -0.9187004 0.9188351 0.9992471 -0.9187027 0.9188259 0.9992471 -0.9187101 0.9188187 0.999247 -0.9187262 0.9188164 0.999247 -0.9187495 0.9188164 0.999247 -0.9187791 0.9188164 0.999247 -0.9188164 0.9188164 0.999247 -0.9188636 0.9188164 0.999247 -0.9189234 0.9188164 0.999247 -0.918999 0.9188164 0.999247 -0.9190947 0.9188164 0.999247 -0.9192157 0.9188164 0.999247 -0.9193688 0.9188164 0.999247 -0.9195625 0.9188164 0.999247 -0.9198076 0.9188164 0.999247 -0.9201176 0.9188164 0.999247 -0.9205098 0.9188164 0.999247 -0.9210061 0.9188164 0.999247 -0.9216339 0.9188164 0.999247 -0.9224281 0.9188164 0.999247 -0.9234329 0.9188164 0.999247 -0.9247041 0.9188164 0.999247 -0.9263124 0.9188164 0.999247 -0.928347 0.9188164 0.999247 -0.9309211 0.9188164 0.999247 -0.9341777 0.9188164 0.999247 -0.9382977 0.9188164 0.999247 -0.94351 0.9188164 0.999247 -0.9501042 0.9188164 0.999247 -0.9584468 0.9188164 0.999247 -0.9690013 0.9188164 0.999247 -0.982354 0.9188164 0.999247 -0.999247 0.9188164 0.999247 -0.9994057 0.9348776 0.9858591 -0.9995308 0.9479146 0.9801368 -0.9996295 0.9584406 0.978759 -0.9997074 0.9669028 0.9796909 -0.9997688 0.9736823 0.981719 -0.9998174 0.9790988 0.9841433 -0.9998557 0.9834167 0.9865801 -0.999886 0.9868529 0.9888351 -0.9999099 0.9895835 0.9908248 -0.9999288 0.991751 0.992528 -0.9999437 0.9934701 0.9939562 -0.9187175 0.9189407 0.9992474 -0.918717 0.9189397 0.9992474 -0.9187164 0.9189384 0.9992474 -0.9187157 0.9189368 0.9992474 -0.9187148 0.9189348 0.9992474 -0.9187137 0.9189323 0.9992474 -0.9187123 0.9189292 0.9992473 -0.9187107 0.9189254 0.9992473 -0.9187089 0.9189207 0.9992473 -0.9187068 0.9189151 0.9992473 -0.9187045 0.9189084 0.9992472 -0.9187024 0.9189006 0.9992472 -0.9187008 0.9188918 0.9992472 -0.9187004 0.9188823 0.9992471 -0.9187027 0.9188732 0.9992471 -0.9187101 0.9188659 0.999247 -0.9187262 0.9188636 0.999247 -0.9187495 0.9188636 0.999247 -0.9187791 0.9188636 0.999247 -0.9188164 0.9188636 0.999247 -0.9188636 0.9188636 0.999247 -0.9189234 0.9188636 0.999247 -0.918999 0.9188636 0.999247 -0.9190947 0.9188636 0.999247 -0.9192157 0.9188636 0.999247 -0.9193688 0.9188636 0.999247 -0.9195625 0.9188636 0.999247 -0.9198076 0.9188636 0.999247 -0.9201176 0.9188636 0.999247 -0.9205098 0.9188636 0.999247 -0.9210061 0.9188636 0.999247 -0.9216339 0.9188636 0.999247 -0.9224281 0.9188636 0.999247 -0.9234329 0.9188636 0.999247 -0.9247041 0.9188636 0.999247 -0.9263124 0.9188636 0.999247 -0.928347 0.9188636 0.999247 -0.9309211 0.9188636 0.999247 -0.9341777 0.9188636 0.999247 -0.9382977 0.9188636 0.999247 -0.94351 0.9188636 0.999247 -0.9501042 0.9188636 0.999247 -0.9584468 0.9188636 0.999247 -0.9690013 0.9188636 0.999247 -0.982354 0.9188636 0.999247 -0.999247 0.9188636 0.999247 -0.9994057 0.9349075 0.9858591 -0.9995308 0.9479335 0.9801368 -0.9996295 0.9584526 0.978759 -0.9997074 0.9669103 0.9796909 -0.9997688 0.973687 0.981719 -0.9998174 0.9791018 0.9841433 -0.9998557 0.9834186 0.9865801 -0.999886 0.9868541 0.9888351 -0.9999099 0.9895842 0.9908248 -0.9999288 0.9917515 0.992528 -0.9999437 0.9934704 0.9939562 -0.9187175 0.9190004 0.9992474 -0.918717 0.9189994 0.9992474 -0.9187164 0.9189981 0.9992474 -0.9187157 0.9189965 0.9992474 -0.9187148 0.9189945 0.9992474 -0.9187137 0.918992 0.9992474 -0.9187123 0.9189889 0.9992473 -0.9187107 0.9189851 0.9992473 -0.9187089 0.9189805 0.9992473 -0.9187068 0.9189748 0.9992473 -0.9187045 0.9189681 0.9992472 -0.9187024 0.9189603 0.9992472 -0.9187008 0.9189515 0.9992472 -0.9187004 0.9189421 0.9992471 -0.9187027 0.9189329 0.9992471 -0.9187101 0.9189257 0.999247 -0.9187262 0.9189234 0.999247 -0.9187495 0.9189234 0.999247 -0.9187791 0.9189234 0.999247 -0.9188164 0.9189234 0.999247 -0.9188636 0.9189234 0.999247 -0.9189234 0.9189234 0.999247 -0.918999 0.9189234 0.999247 -0.9190947 0.9189234 0.999247 -0.9192157 0.9189234 0.999247 -0.9193688 0.9189234 0.999247 -0.9195625 0.9189234 0.999247 -0.9198076 0.9189234 0.999247 -0.9201176 0.9189234 0.999247 -0.9205098 0.9189234 0.999247 -0.9210061 0.9189234 0.999247 -0.9216339 0.9189234 0.999247 -0.9224281 0.9189234 0.999247 -0.9234329 0.9189234 0.999247 -0.9247041 0.9189234 0.999247 -0.9263124 0.9189234 0.999247 -0.928347 0.9189234 0.999247 -0.9309211 0.9189234 0.999247 -0.9341777 0.9189234 0.999247 -0.9382977 0.9189234 0.999247 -0.94351 0.9189234 0.999247 -0.9501042 0.9189234 0.999247 -0.9584468 0.9189234 0.999247 -0.9690013 0.9189234 0.999247 -0.982354 0.9189234 0.999247 -0.999247 0.9189234 0.999247 -0.9994057 0.9349454 0.9858591 -0.9995308 0.9479575 0.9801368 -0.9996295 0.9584677 0.978759 -0.9997074 0.9669198 0.9796909 -0.9997688 0.973693 0.981719 -0.9998174 0.9791055 0.9841433 -0.9998557 0.9834209 0.9865801 -0.999886 0.9868555 0.9888351 -0.9999099 0.9895851 0.9908248 -0.9999288 0.9917521 0.992528 -0.9999437 0.9934707 0.9939562 -0.9187175 0.9190759 0.9992474 -0.918717 0.9190749 0.9992474 -0.9187164 0.9190736 0.9992474 -0.9187157 0.919072 0.9992474 -0.9187148 0.91907 0.9992474 -0.9187137 0.9190675 0.9992474 -0.9187123 0.9190645 0.9992473 -0.9187107 0.9190607 0.9992473 -0.9187089 0.919056 0.9992473 -0.9187068 0.9190504 0.9992473 -0.9187045 0.9190437 0.9992472 -0.9187024 0.9190359 0.9992472 -0.9187008 0.9190271 0.9992472 -0.9187004 0.9190177 0.9992471 -0.9187027 0.9190085 0.9992471 -0.9187101 0.9190013 0.999247 -0.9187262 0.918999 0.999247 -0.9187495 0.918999 0.999247 -0.9187791 0.918999 0.999247 -0.9188164 0.918999 0.999247 -0.9188636 0.918999 0.999247 -0.9189234 0.918999 0.999247 -0.918999 0.918999 0.999247 -0.9190947 0.918999 0.999247 -0.9192157 0.918999 0.999247 -0.9193688 0.918999 0.999247 -0.9195625 0.918999 0.999247 -0.9198076 0.918999 0.999247 -0.9201176 0.918999 0.999247 -0.9205098 0.918999 0.999247 -0.9210061 0.918999 0.999247 -0.9216339 0.918999 0.999247 -0.9224281 0.918999 0.999247 -0.9234329 0.918999 0.999247 -0.9247041 0.918999 0.999247 -0.9263124 0.918999 0.999247 -0.928347 0.918999 0.999247 -0.9309211 0.918999 0.999247 -0.9341777 0.918999 0.999247 -0.9382977 0.918999 0.999247 -0.94351 0.918999 0.999247 -0.9501042 0.918999 0.999247 -0.9584468 0.918999 0.999247 -0.9690013 0.918999 0.999247 -0.982354 0.918999 0.999247 -0.999247 0.918999 0.999247 -0.9994057 0.9349933 0.9858591 -0.9995308 0.9479878 0.9801368 -0.9996295 0.9584868 0.978759 -0.9997074 0.9669318 0.9796909 -0.9997688 0.9737006 0.981719 -0.9998174 0.9791103 0.9841433 -0.9998557 0.9834239 0.9865801 -0.999886 0.9868574 0.9888351 -0.9999099 0.9895863 0.9908248 -0.9999288 0.9917528 0.992528 -0.9999437 0.9934712 0.9939562 -0.9187175 0.9191715 0.9992474 -0.918717 0.9191705 0.9992474 -0.9187164 0.9191692 0.9992474 -0.9187157 0.9191676 0.9992474 -0.9187148 0.9191656 0.9992474 -0.9187137 0.9191631 0.9992474 -0.9187123 0.91916 0.9992473 -0.9187107 0.9191562 0.9992473 -0.9187089 0.9191516 0.9992473 -0.9187068 0.919146 0.9992473 -0.9187045 0.9191393 0.9992472 -0.9187024 0.9191315 0.9992472 -0.9187008 0.9191227 0.9992472 -0.9187004 0.9191133 0.9992471 -0.9187027 0.9191042 0.9992471 -0.9187101 0.919097 0.999247 -0.9187262 0.9190947 0.999247 -0.9187495 0.9190947 0.999247 -0.9187791 0.9190947 0.999247 -0.9188164 0.9190947 0.999247 -0.9188636 0.9190947 0.999247 -0.9189234 0.9190947 0.999247 -0.918999 0.9190947 0.999247 -0.9190947 0.9190947 0.999247 -0.9192157 0.9190947 0.999247 -0.9193688 0.9190947 0.999247 -0.9195625 0.9190947 0.999247 -0.9198076 0.9190947 0.999247 -0.9201176 0.9190947 0.999247 -0.9205098 0.9190947 0.999247 -0.9210061 0.9190947 0.999247 -0.9216339 0.9190947 0.999247 -0.9224281 0.9190947 0.999247 -0.9234329 0.9190947 0.999247 -0.9247041 0.9190947 0.999247 -0.9263124 0.9190947 0.999247 -0.928347 0.9190947 0.999247 -0.9309211 0.9190947 0.999247 -0.9341777 0.9190947 0.999247 -0.9382977 0.9190947 0.999247 -0.94351 0.9190947 0.999247 -0.9501042 0.9190947 0.999247 -0.9584468 0.9190947 0.999247 -0.9690013 0.9190947 0.999247 -0.982354 0.9190947 0.999247 -0.999247 0.9190947 0.999247 -0.9994057 0.935054 0.9858591 -0.9995308 0.9480261 0.9801368 -0.9996295 0.9585109 0.978759 -0.9997074 0.966947 0.9796909 -0.9997688 0.9737101 0.981719 -0.9998174 0.9791163 0.9841433 -0.9998557 0.9834277 0.9865801 -0.999886 0.9868597 0.9888351 -0.9999099 0.9895878 0.9908248 -0.9999288 0.9917537 0.992528 -0.9999437 0.9934718 0.9939562 -0.9187175 0.9192924 0.9992474 -0.918717 0.9192914 0.9992474 -0.9187164 0.9192901 0.9992474 -0.9187157 0.9192885 0.9992474 -0.9187148 0.9192865 0.9992474 -0.9187137 0.919284 0.9992474 -0.9187123 0.919281 0.9992473 -0.9187107 0.9192772 0.9992473 -0.9187089 0.9192725 0.9992473 -0.9187068 0.9192669 0.9992473 -0.9187045 0.9192603 0.9992472 -0.9187024 0.9192525 0.9992472 -0.9187008 0.9192437 0.9992472 -0.9187004 0.9192343 0.9992471 -0.9187027 0.9192252 0.9992471 -0.9187101 0.919218 0.999247 -0.9187262 0.9192157 0.999247 -0.9187495 0.9192157 0.999247 -0.9187791 0.9192157 0.999247 -0.9188164 0.9192157 0.999247 -0.9188636 0.9192157 0.999247 -0.9189234 0.9192157 0.999247 -0.918999 0.9192157 0.999247 -0.9190947 0.9192157 0.999247 -0.9192157 0.9192157 0.999247 -0.9193688 0.9192157 0.999247 -0.9195625 0.9192157 0.999247 -0.9198076 0.9192157 0.999247 -0.9201176 0.9192157 0.999247 -0.9205098 0.9192157 0.999247 -0.9210061 0.9192157 0.999247 -0.9216339 0.9192157 0.999247 -0.9224281 0.9192157 0.999247 -0.9234329 0.9192157 0.999247 -0.9247041 0.9192157 0.999247 -0.9263124 0.9192157 0.999247 -0.928347 0.9192157 0.999247 -0.9309211 0.9192157 0.999247 -0.9341777 0.9192157 0.999247 -0.9382977 0.9192157 0.999247 -0.94351 0.9192157 0.999247 -0.9501042 0.9192157 0.999247 -0.9584468 0.9192157 0.999247 -0.9690013 0.9192157 0.999247 -0.982354 0.9192157 0.999247 -0.999247 0.9192157 0.999247 -0.9994057 0.9351307 0.9858591 -0.9995308 0.9480746 0.9801368 -0.9996295 0.9585415 0.978759 -0.9997074 0.9669663 0.9796909 -0.9997688 0.9737222 0.981719 -0.9998174 0.9791238 0.9841433 -0.9998557 0.9834324 0.9865801 -0.999886 0.9868627 0.9888351 -0.9999099 0.9895897 0.9908248 -0.9999288 0.9917549 0.992528 -0.9999437 0.9934725 0.9939562 -0.9187175 0.9194454 0.9992474 -0.918717 0.9194443 0.9992474 -0.9187164 0.9194431 0.9992474 -0.9187157 0.9194415 0.9992474 -0.9187148 0.9194395 0.9992474 -0.9187137 0.919437 0.9992474 -0.9187123 0.919434 0.9992473 -0.9187107 0.9194302 0.9992473 -0.9187089 0.9194255 0.9992473 -0.9187068 0.9194199 0.9992473 -0.9187045 0.9194133 0.9992472 -0.9187024 0.9194055 0.9992472 -0.9187008 0.9193968 0.9992472 -0.9187004 0.9193874 0.9992471 -0.9187027 0.9193783 0.9992471 -0.9187101 0.9193711 0.999247 -0.9187262 0.9193688 0.999247 -0.9187495 0.9193688 0.999247 -0.9187791 0.9193688 0.999247 -0.9188164 0.9193688 0.999247 -0.9188636 0.9193688 0.999247 -0.9189234 0.9193688 0.999247 -0.918999 0.9193688 0.999247 -0.9190947 0.9193688 0.999247 -0.9192157 0.9193688 0.999247 -0.9193688 0.9193688 0.999247 -0.9195625 0.9193688 0.999247 -0.9198076 0.9193688 0.999247 -0.9201176 0.9193688 0.999247 -0.9205098 0.9193688 0.999247 -0.9210061 0.9193688 0.999247 -0.9216339 0.9193688 0.999247 -0.9224281 0.9193688 0.999247 -0.9234329 0.9193688 0.999247 -0.9247041 0.9193688 0.999247 -0.9263124 0.9193688 0.999247 -0.928347 0.9193688 0.999247 -0.9309211 0.9193688 0.999247 -0.9341777 0.9193688 0.999247 -0.9382977 0.9193688 0.999247 -0.94351 0.9193688 0.999247 -0.9501042 0.9193688 0.999247 -0.9584468 0.9193688 0.999247 -0.9690013 0.9193688 0.999247 -0.982354 0.9193688 0.999247 -0.999247 0.9193688 0.999247 -0.9994057 0.9352277 0.9858591 -0.9995308 0.9481359 0.9801368 -0.9996295 0.9585802 0.978759 -0.9997074 0.9669906 0.9796909 -0.9997688 0.9737375 0.981719 -0.9998174 0.9791334 0.9841433 -0.9998557 0.9834385 0.9865801 -0.999886 0.9868665 0.9888351 -0.9999099 0.989592 0.9908248 -0.9999288 0.9917564 0.992528 -0.9999437 0.9934734 0.9939562 -0.9187175 0.9196389 0.9992474 -0.918717 0.9196379 0.9992474 -0.9187164 0.9196366 0.9992474 -0.9187157 0.919635 0.9992474 -0.9187148 0.919633 0.9992474 -0.9187137 0.9196306 0.9992474 -0.9187123 0.9196275 0.9992473 -0.9187107 0.9196237 0.9992473 -0.9187089 0.9196191 0.9992473 -0.9187068 0.9196135 0.9992473 -0.9187045 0.9196069 0.9992472 -0.9187024 0.9195991 0.9992472 -0.9187008 0.9195904 0.9992472 -0.9187004 0.9195811 0.9992471 -0.9187027 0.919572 0.9992471 -0.9187101 0.9195648 0.999247 -0.9187262 0.9195625 0.999247 -0.9187495 0.9195625 0.999247 -0.9187791 0.9195625 0.999247 -0.9188164 0.9195625 0.999247 -0.9188636 0.9195625 0.999247 -0.9189234 0.9195625 0.999247 -0.918999 0.9195625 0.999247 -0.9190947 0.9195625 0.999247 -0.9192157 0.9195625 0.999247 -0.9193688 0.9195625 0.999247 -0.9195625 0.9195625 0.999247 -0.9198076 0.9195625 0.999247 -0.9201176 0.9195625 0.999247 -0.9205098 0.9195625 0.999247 -0.9210061 0.9195625 0.999247 -0.9216339 0.9195625 0.999247 -0.9224281 0.9195625 0.999247 -0.9234329 0.9195625 0.999247 -0.9247041 0.9195625 0.999247 -0.9263124 0.9195625 0.999247 -0.928347 0.9195625 0.999247 -0.9309211 0.9195625 0.999247 -0.9341777 0.9195625 0.999247 -0.9382977 0.9195625 0.999247 -0.94351 0.9195625 0.999247 -0.9501042 0.9195625 0.999247 -0.9584468 0.9195625 0.999247 -0.9690013 0.9195625 0.999247 -0.982354 0.9195625 0.999247 -0.999247 0.9195625 0.999247 -0.9994057 0.9353505 0.9858591 -0.9995308 0.9482135 0.9801368 -0.9996295 0.9586291 0.978759 -0.9997074 0.9670214 0.9796909 -0.9997688 0.9737569 0.981719 -0.9998174 0.9791456 0.9841433 -0.9998557 0.9834461 0.9865801 -0.999886 0.9868713 0.9888351 -0.9999099 0.989595 0.9908248 -0.9999288 0.9917582 0.992528 -0.9999437 0.9934746 0.9939562 -0.9187175 0.9198837 0.9992474 -0.918717 0.9198827 0.9992474 -0.9187164 0.9198814 0.9992474 -0.9187157 0.9198799 0.9992474 -0.9187148 0.9198779 0.9992474 -0.9187137 0.9198754 0.9992474 -0.9187123 0.9198724 0.9992473 -0.9187107 0.9198686 0.9992473 -0.9187089 0.919864 0.9992473 -0.9187068 0.9198584 0.9992473 -0.9187045 0.9198518 0.9992472 -0.9187024 0.9198441 0.9992472 -0.9187008 0.9198354 0.9992472 -0.9187004 0.9198261 0.9992471 -0.9187027 0.919817 0.9992471 -0.9187101 0.9198099 0.999247 -0.9187262 0.9198076 0.999247 -0.9187495 0.9198076 0.999247 -0.9187791 0.9198076 0.999247 -0.9188164 0.9198076 0.999247 -0.9188636 0.9198076 0.999247 -0.9189234 0.9198076 0.999247 -0.918999 0.9198076 0.999247 -0.9190947 0.9198076 0.999247 -0.9192157 0.9198076 0.999247 -0.9193688 0.9198076 0.999247 -0.9195625 0.9198076 0.999247 -0.9198076 0.9198076 0.999247 -0.9201176 0.9198076 0.999247 -0.9205098 0.9198076 0.999247 -0.9210061 0.9198076 0.999247 -0.9216339 0.9198076 0.999247 -0.9224281 0.9198076 0.999247 -0.9234329 0.9198076 0.999247 -0.9247041 0.9198076 0.999247 -0.9263124 0.9198076 0.999247 -0.928347 0.9198076 0.999247 -0.9309211 0.9198076 0.999247 -0.9341777 0.9198076 0.999247 -0.9382977 0.9198076 0.999247 -0.94351 0.9198076 0.999247 -0.9501042 0.9198076 0.999247 -0.9584468 0.9198076 0.999247 -0.9690013 0.9198076 0.999247 -0.982354 0.9198076 0.999247 -0.999247 0.9198076 0.999247 -0.9994057 0.9355059 0.9858591 -0.9995308 0.9483117 0.9801368 -0.9996295 0.958691 0.978759 -0.9997074 0.9670604 0.9796909 -0.9997688 0.9737814 0.981719 -0.9998174 0.979161 0.9841433 -0.9998557 0.9834557 0.9865801 -0.999886 0.9868773 0.9888351 -0.9999099 0.9895988 0.9908248 -0.9999288 0.9917606 0.992528 -0.9999437 0.9934761 0.9939562 -0.9187175 0.9201934 0.9992474 -0.918717 0.9201924 0.9992474 -0.9187164 0.9201912 0.9992474 -0.9187157 0.9201896 0.9992474 -0.9187148 0.9201876 0.9992474 -0.9187137 0.9201852 0.9992474 -0.9187123 0.9201821 0.9992473 -0.9187107 0.9201784 0.9992473 -0.9187089 0.9201738 0.9992473 -0.9187068 0.9201683 0.9992473 -0.9187045 0.9201617 0.9992472 -0.9187024 0.920154 0.9992472 -0.9187008 0.9201453 0.9992472 -0.9187004 0.920136 0.9992471 -0.9187027 0.920127 0.9992471 -0.9187101 0.9201199 0.999247 -0.9187262 0.9201176 0.999247 -0.9187495 0.9201176 0.999247 -0.9187791 0.9201176 0.999247 -0.9188164 0.9201176 0.999247 -0.9188636 0.9201176 0.999247 -0.9189234 0.9201176 0.999247 -0.918999 0.9201176 0.999247 -0.9190947 0.9201176 0.999247 -0.9192157 0.9201176 0.999247 -0.9193688 0.9201176 0.999247 -0.9195625 0.9201176 0.999247 -0.9198076 0.9201176 0.999247 -0.9201176 0.9201176 0.999247 -0.9205098 0.9201176 0.999247 -0.9210061 0.9201176 0.999247 -0.9216339 0.9201176 0.999247 -0.9224281 0.9201176 0.999247 -0.9234329 0.9201176 0.999247 -0.9247041 0.9201176 0.999247 -0.9263124 0.9201176 0.999247 -0.928347 0.9201176 0.999247 -0.9309211 0.9201176 0.999247 -0.9341777 0.9201176 0.999247 -0.9382977 0.9201176 0.999247 -0.94351 0.9201176 0.999247 -0.9501042 0.9201176 0.999247 -0.9584468 0.9201176 0.999247 -0.9690013 0.9201176 0.999247 -0.982354 0.9201176 0.999247 -0.999247 0.9201176 0.999247 -0.9994057 0.9357024 0.9858591 -0.9995308 0.9484359 0.9801368 -0.9996295 0.9587693 0.978759 -0.9997074 0.9671097 0.9796909 -0.9997688 0.9738123 0.981719 -0.9998174 0.9791804 0.9841433 -0.9998557 0.9834679 0.9865801 -0.999886 0.986885 0.9888351 -0.9999099 0.9896036 0.9908248 -0.9999288 0.9917636 0.992528 -0.9999437 0.9934779 0.9939562 -0.9187175 0.9205853 0.9992474 -0.918717 0.9205843 0.9992474 -0.9187164 0.9205831 0.9992474 -0.9187157 0.9205815 0.9992474 -0.9187148 0.9205795 0.9992474 -0.9187137 0.9205771 0.9992474 -0.9187123 0.9205741 0.9992473 -0.9187107 0.9205703 0.9992473 -0.9187089 0.9205658 0.9992473 -0.9187068 0.9205603 0.9992473 -0.9187045 0.9205537 0.9992472 -0.9187024 0.920546 0.9992472 -0.9187008 0.9205374 0.9992472 -0.9187004 0.9205282 0.9992471 -0.9187027 0.9205192 0.9992471 -0.9187101 0.9205121 0.999247 -0.9187262 0.9205098 0.999247 -0.9187495 0.9205098 0.999247 -0.9187791 0.9205098 0.999247 -0.9188164 0.9205098 0.999247 -0.9188636 0.9205098 0.999247 -0.9189234 0.9205098 0.999247 -0.918999 0.9205098 0.999247 -0.9190947 0.9205098 0.999247 -0.9192157 0.9205098 0.999247 -0.9193688 0.9205098 0.999247 -0.9195625 0.9205098 0.999247 -0.9198076 0.9205098 0.999247 -0.9201176 0.9205098 0.999247 -0.9205098 0.9205098 0.999247 -0.9210061 0.9205098 0.999247 -0.9216339 0.9205098 0.999247 -0.9224281 0.9205098 0.999247 -0.9234329 0.9205098 0.999247 -0.9247041 0.9205098 0.999247 -0.9263124 0.9205098 0.999247 -0.928347 0.9205098 0.999247 -0.9309211 0.9205098 0.999247 -0.9341777 0.9205098 0.999247 -0.9382977 0.9205098 0.999247 -0.94351 0.9205098 0.999247 -0.9501042 0.9205098 0.999247 -0.9584468 0.9205098 0.999247 -0.9690013 0.9205098 0.999247 -0.982354 0.9205098 0.999247 -0.999247 0.9205098 0.999247 -0.9994057 0.935951 0.9858591 -0.9995308 0.9485931 0.9801368 -0.9996295 0.9588684 0.978759 -0.9997074 0.967172 0.9796909 -0.9997688 0.9738515 0.981719 -0.9998174 0.979205 0.9841433 -0.9998557 0.9834833 0.9865801 -0.999886 0.9868946 0.9888351 -0.9999099 0.9896096 0.9908248 -0.9999288 0.9917674 0.992528 -0.9999437 0.9934803 0.9939562 -0.9187175 0.9210811 0.9992474 -0.918717 0.9210801 0.9992474 -0.9187164 0.9210788 0.9992474 -0.9187157 0.9210773 0.9992474 -0.9187148 0.9210753 0.9992474 -0.9187137 0.9210729 0.9992474 -0.9187123 0.9210699 0.9992473 -0.9187107 0.9210662 0.9992473 -0.9187089 0.9210616 0.9992473 -0.9187068 0.9210562 0.9992473 -0.9187045 0.9210496 0.9992472 -0.9187024 0.921042 0.9992472 -0.9187008 0.9210335 0.9992472 -0.9187004 0.9210243 0.9992471 -0.9187027 0.9210153 0.9992471 -0.9187101 0.9210083 0.999247 -0.9187262 0.9210061 0.999247 -0.9187495 0.9210061 0.999247 -0.9187791 0.9210061 0.999247 -0.9188164 0.9210061 0.999247 -0.9188636 0.9210061 0.999247 -0.9189234 0.9210061 0.999247 -0.918999 0.9210061 0.999247 -0.9190947 0.9210061 0.999247 -0.9192157 0.9210061 0.999247 -0.9193688 0.9210061 0.999247 -0.9195625 0.9210061 0.999247 -0.9198076 0.9210061 0.999247 -0.9201176 0.9210061 0.999247 -0.9205098 0.9210061 0.999247 -0.9210061 0.9210061 0.999247 -0.9216339 0.9210061 0.999247 -0.9224281 0.9210061 0.999247 -0.9234329 0.9210061 0.999247 -0.9247041 0.9210061 0.999247 -0.9263124 0.9210061 0.999247 -0.928347 0.9210061 0.999247 -0.9309211 0.9210061 0.999247 -0.9341777 0.9210061 0.999247 -0.9382977 0.9210061 0.999247 -0.94351 0.9210061 0.999247 -0.9501042 0.9210061 0.999247 -0.9584468 0.9210061 0.999247 -0.9690013 0.9210061 0.999247 -0.982354 0.9210061 0.999247 -0.999247 0.9210061 0.999247 -0.9994057 0.9362655 0.9858591 -0.9995308 0.9487918 0.9801368 -0.9996295 0.9589938 0.978759 -0.9997074 0.9672509 0.9796909 -0.9997688 0.9739011 0.981719 -0.9998174 0.9792361 0.9841433 -0.9998557 0.9835029 0.9865801 -0.999886 0.9869069 0.9888351 -0.9999099 0.9896173 0.9908248 -0.9999288 0.9917722 0.992528 -0.9999437 0.9934833 0.9939562 -0.9187175 0.9217082 0.9992474 -0.918717 0.9217073 0.9992474 -0.9187164 0.921706 0.9992474 -0.9187157 0.9217045 0.9992474 -0.9187148 0.9217025 0.9992474 -0.9187137 0.9217001 0.9992474 -0.9187123 0.9216972 0.9992473 -0.9187107 0.9216935 0.9992473 -0.9187089 0.921689 0.9992473 -0.9187068 0.9216836 0.9992473 -0.9187045 0.9216771 0.9992472 -0.9187024 0.9216695 0.9992472 -0.9187008 0.921661 0.9992472 -0.9187004 0.9216519 0.9992471 -0.9187027 0.9216431 0.9992471 -0.9187101 0.9216361 0.999247 -0.9187262 0.9216339 0.999247 -0.9187495 0.9216339 0.999247 -0.9187791 0.9216339 0.999247 -0.9188164 0.9216339 0.999247 -0.9188636 0.9216339 0.999247 -0.9189234 0.9216339 0.999247 -0.918999 0.9216339 0.999247 -0.9190947 0.9216339 0.999247 -0.9192157 0.9216339 0.999247 -0.9193688 0.9216339 0.999247 -0.9195625 0.9216339 0.999247 -0.9198076 0.9216339 0.999247 -0.9201176 0.9216339 0.999247 -0.9205098 0.9216339 0.999247 -0.9210061 0.9216339 0.999247 -0.9216339 0.9216339 0.999247 -0.9224281 0.9216339 0.999247 -0.9234329 0.9216339 0.999247 -0.9247041 0.9216339 0.999247 -0.9263124 0.9216339 0.999247 -0.928347 0.9216339 0.999247 -0.9309211 0.9216339 0.999247 -0.9341777 0.9216339 0.999247 -0.9382977 0.9216339 0.999247 -0.94351 0.9216339 0.999247 -0.9501042 0.9216339 0.999247 -0.9584468 0.9216339 0.999247 -0.9690013 0.9216339 0.999247 -0.982354 0.9216339 0.999247 -0.999247 0.9216339 0.999247 -0.9994057 0.9366635 0.9858591 -0.9995308 0.9490434 0.9801368 -0.9996295 0.9591524 0.978759 -0.9997074 0.9673508 0.9796909 -0.9997688 0.9739638 0.981719 -0.9998174 0.9792755 0.9841433 -0.9998557 0.9835276 0.9865801 -0.999886 0.9869223 0.9888351 -0.9999099 0.989627 0.9908248 -0.9999288 0.9917782 0.992528 -0.9999437 0.9934871 0.9939562 -0.9187175 0.9225017 0.9992474 -0.918717 0.9225007 0.9992474 -0.9187164 0.9224995 0.9992474 -0.9187157 0.922498 0.9992474 -0.9187148 0.9224961 0.9992474 -0.9187137 0.9224937 0.9992474 -0.9187123 0.9224907 0.9992473 -0.9187107 0.9224871 0.9992473 -0.9187089 0.9224827 0.9992473 -0.9187068 0.9224773 0.9992473 -0.9187045 0.9224709 0.9992472 -0.9187024 0.9224634 0.9992472 -0.9187008 0.922455 0.9992472 -0.9187004 0.922446 0.9992471 -0.9187027 0.9224372 0.9992471 -0.9187101 0.9224303 0.999247 -0.9187262 0.9224281 0.999247 -0.9187495 0.9224281 0.999247 -0.9187791 0.9224281 0.999247 -0.9188164 0.9224281 0.999247 -0.9188636 0.9224281 0.999247 -0.9189234 0.9224281 0.999247 -0.918999 0.9224281 0.999247 -0.9190947 0.9224281 0.999247 -0.9192157 0.9224281 0.999247 -0.9193688 0.9224281 0.999247 -0.9195625 0.9224281 0.999247 -0.9198076 0.9224281 0.999247 -0.9201176 0.9224281 0.999247 -0.9205098 0.9224281 0.999247 -0.9210061 0.9224281 0.999247 -0.9216339 0.9224281 0.999247 -0.9224281 0.9224281 0.999247 -0.9234329 0.9224281 0.999247 -0.9247041 0.9224281 0.999247 -0.9263124 0.9224281 0.999247 -0.928347 0.9224281 0.999247 -0.9309211 0.9224281 0.999247 -0.9341777 0.9224281 0.999247 -0.9382977 0.9224281 0.999247 -0.94351 0.9224281 0.999247 -0.9501042 0.9224281 0.999247 -0.9584468 0.9224281 0.999247 -0.9690013 0.9224281 0.999247 -0.982354 0.9224281 0.999247 -0.999247 0.9224281 0.999247 -0.9994057 0.9371669 0.9858591 -0.9995308 0.9493615 0.9801368 -0.9996295 0.959353 0.978759 -0.9997074 0.967477 0.9796909 -0.9997688 0.9740432 0.981719 -0.9998174 0.9793253 0.9841433 -0.9998557 0.9835588 0.9865801 -0.999886 0.9869419 0.9888351 -0.9999099 0.9896392 0.9908248 -0.9999288 0.9917859 0.992528 -0.9999437 0.9934919 0.9939562 -0.9187175 0.9235056 0.9992474 -0.918717 0.9235046 0.9992474 -0.9187164 0.9235034 0.9992474 -0.9187157 0.9235019 0.9992474 -0.9187148 0.9235 0.9992474 -0.9187137 0.9234977 0.9992474 -0.9187123 0.9234947 0.9992473 -0.9187107 0.9234912 0.9992473 -0.9187089 0.9234868 0.9992473 -0.9187068 0.9234815 0.9992473 -0.9187045 0.9234751 0.9992472 -0.9187024 0.9234678 0.9992472 -0.9187008 0.9234595 0.9992472 -0.9187004 0.9234506 0.9992471 -0.9187027 0.9234419 0.9992471 -0.9187101 0.9234351 0.999247 -0.9187262 0.9234329 0.999247 -0.9187495 0.9234329 0.999247 -0.9187791 0.9234329 0.999247 -0.9188164 0.9234329 0.999247 -0.9188636 0.9234329 0.999247 -0.9189234 0.9234329 0.999247 -0.918999 0.9234329 0.999247 -0.9190947 0.9234329 0.999247 -0.9192157 0.9234329 0.999247 -0.9193688 0.9234329 0.999247 -0.9195625 0.9234329 0.999247 -0.9198076 0.9234329 0.999247 -0.9201176 0.9234329 0.999247 -0.9205098 0.9234329 0.999247 -0.9210061 0.9234329 0.999247 -0.9216339 0.9234329 0.999247 -0.9224281 0.9234329 0.999247 -0.9234329 0.9234329 0.999247 -0.9247041 0.9234329 0.999247 -0.9263124 0.9234329 0.999247 -0.928347 0.9234329 0.999247 -0.9309211 0.9234329 0.999247 -0.9341777 0.9234329 0.999247 -0.9382977 0.9234329 0.999247 -0.94351 0.9234329 0.999247 -0.9501042 0.9234329 0.999247 -0.9584468 0.9234329 0.999247 -0.9690013 0.9234329 0.999247 -0.982354 0.9234329 0.999247 -0.999247 0.9234329 0.999247 -0.9994057 0.9378038 0.9858591 -0.9995308 0.9497641 0.9801368 -0.9996295 0.9596068 0.978759 -0.9997074 0.9676368 0.9796909 -0.9997688 0.9741436 0.981719 -0.9998174 0.9793883 0.9841433 -0.9998557 0.9835983 0.9865801 -0.999886 0.9869667 0.9888351 -0.9999099 0.9896547 0.9908248 -0.9999288 0.9917956 0.992528 -0.9999437 0.993498 0.9939562 -0.9187175 0.9247756 0.9992474 -0.918717 0.9247746 0.9992474 -0.9187164 0.9247734 0.9992474 -0.9187157 0.924772 0.9992474 -0.9187148 0.9247701 0.9992474 -0.9187137 0.9247678 0.9992474 -0.9187123 0.9247649 0.9992473 -0.9187107 0.9247614 0.9992473 -0.9187089 0.9247571 0.9992473 -0.9187068 0.9247519 0.9992473 -0.9187045 0.9247456 0.9992472 -0.9187024 0.9247384 0.9992472 -0.9187008 0.9247302 0.9992472 -0.9187004 0.9247215 0.9992471 -0.9187027 0.924713 0.9992471 -0.9187101 0.9247063 0.999247 -0.9187262 0.9247041 0.999247 -0.9187495 0.9247041 0.999247 -0.9187791 0.9247041 0.999247 -0.9188164 0.9247041 0.999247 -0.9188636 0.9247041 0.999247 -0.9189234 0.9247041 0.999247 -0.918999 0.9247041 0.999247 -0.9190947 0.9247041 0.999247 -0.9192157 0.9247041 0.999247 -0.9193688 0.9247041 0.999247 -0.9195625 0.9247041 0.999247 -0.9198076 0.9247041 0.999247 -0.9201176 0.9247041 0.999247 -0.9205098 0.9247041 0.999247 -0.9210061 0.9247041 0.999247 -0.9216339 0.9247041 0.999247 -0.9224281 0.9247041 0.999247 -0.9234329 0.9247041 0.999247 -0.9247041 0.9247041 0.999247 -0.9263124 0.9247041 0.999247 -0.928347 0.9247041 0.999247 -0.9309211 0.9247041 0.999247 -0.9341777 0.9247041 0.999247 -0.9382977 0.9247041 0.999247 -0.94351 0.9247041 0.999247 -0.9501042 0.9247041 0.999247 -0.9584468 0.9247041 0.999247 -0.9690013 0.9247041 0.999247 -0.982354 0.9247041 0.999247 -0.999247 0.9247041 0.999247 -0.9994057 0.9386096 0.9858591 -0.9995308 0.9502734 0.9801368 -0.9996295 0.959928 0.978759 -0.9997074 0.9678389 0.9796909 -0.9997688 0.9742706 0.981719 -0.9998174 0.9794681 0.9841433 -0.9998557 0.9836483 0.9865801 -0.999886 0.986998 0.9888351 -0.9999099 0.9896744 0.9908248 -0.9999288 0.9918079 0.992528 -0.9999437 0.9935057 0.9939562 -0.9187175 0.9263823 0.9992474 -0.918717 0.9263814 0.9992474 -0.9187164 0.9263802 0.9992474 -0.9187157 0.9263788 0.9992474 -0.9187148 0.9263769 0.9992474 -0.9187137 0.9263747 0.9992474 -0.9187123 0.9263719 0.9992473 -0.9187107 0.9263684 0.9992473 -0.9187089 0.9263642 0.9992473 -0.9187068 0.9263591 0.9992473 -0.9187045 0.926353 0.9992472 -0.9187024 0.9263459 0.9992472 -0.9187008 0.9263379 0.9992472 -0.9187004 0.9263294 0.9992471 -0.9187027 0.926321 0.9992471 -0.9187101 0.9263145 0.999247 -0.9187262 0.9263124 0.999247 -0.9187495 0.9263124 0.999247 -0.9187791 0.9263124 0.999247 -0.9188164 0.9263124 0.999247 -0.9188636 0.9263124 0.999247 -0.9189234 0.9263124 0.999247 -0.918999 0.9263124 0.999247 -0.9190947 0.9263124 0.999247 -0.9192157 0.9263124 0.999247 -0.9193688 0.9263124 0.999247 -0.9195625 0.9263124 0.999247 -0.9198076 0.9263124 0.999247 -0.9201176 0.9263124 0.999247 -0.9205098 0.9263124 0.999247 -0.9210061 0.9263124 0.999247 -0.9216339 0.9263124 0.999247 -0.9224281 0.9263124 0.999247 -0.9234329 0.9263124 0.999247 -0.9247041 0.9263124 0.999247 -0.9263124 0.9263124 0.999247 -0.928347 0.9263124 0.999247 -0.9309211 0.9263124 0.999247 -0.9341777 0.9263124 0.999247 -0.9382977 0.9263124 0.999247 -0.94351 0.9263124 0.999247 -0.9501042 0.9263124 0.999247 -0.9584468 0.9263124 0.999247 -0.9690013 0.9263124 0.999247 -0.982354 0.9263124 0.999247 -0.999247 0.9263124 0.999247 -0.9994057 0.939629 0.9858591 -0.9995308 0.9509177 0.9801368 -0.9996295 0.9603343 0.978759 -0.9997074 0.9680946 0.9796909 -0.9997688 0.9744313 0.981719 -0.9998174 0.9795689 0.9841433 -0.9998557 0.9837116 0.9865801 -0.999886 0.9870376 0.9888351 -0.9999099 0.9896992 0.9908248 -0.9999288 0.9918234 0.992528 -0.9999437 0.9935154 0.9939562 -0.9187175 0.928415 0.9992474 -0.918717 0.9284141 0.9992474 -0.9187164 0.928413 0.9992474 -0.9187157 0.9284116 0.9992474 -0.9187148 0.9284098 0.9992474 -0.9187137 0.9284076 0.9992474 -0.9187123 0.9284049 0.9992473 -0.9187107 0.9284015 0.9992473 -0.9187089 0.9283974 0.9992473 -0.9187068 0.9283924 0.9992473 -0.9187045 0.9283865 0.9992472 -0.9187024 0.9283796 0.9992472 -0.9187008 0.9283719 0.9992472 -0.9187004 0.9283635 0.9992471 -0.9187027 0.9283554 0.9992471 -0.9187101 0.9283491 0.999247 -0.9187262 0.928347 0.999247 -0.9187495 0.928347 0.999247 -0.9187791 0.928347 0.999247 -0.9188164 0.928347 0.999247 -0.9188636 0.928347 0.999247 -0.9189234 0.928347 0.999247 -0.918999 0.928347 0.999247 -0.9190947 0.928347 0.999247 -0.9192157 0.928347 0.999247 -0.9193688 0.928347 0.999247 -0.9195625 0.928347 0.999247 -0.9198076 0.928347 0.999247 -0.9201176 0.928347 0.999247 -0.9205098 0.928347 0.999247 -0.9210061 0.928347 0.999247 -0.9216339 0.928347 0.999247 -0.9224281 0.928347 0.999247 -0.9234329 0.928347 0.999247 -0.9247041 0.928347 0.999247 -0.9263124 0.928347 0.999247 -0.928347 0.928347 0.999247 -0.9309211 0.928347 0.999247 -0.9341777 0.928347 0.999247 -0.9382977 0.928347 0.999247 -0.94351 0.928347 0.999247 -0.9501042 0.928347 0.999247 -0.9584468 0.928347 0.999247 -0.9690013 0.928347 0.999247 -0.982354 0.928347 0.999247 -0.999247 0.928347 0.999247 -0.9994057 0.9409186 0.9858591 -0.9995308 0.9517328 0.9801368 -0.9996295 0.9608482 0.978759 -0.9997074 0.9684181 0.9796909 -0.9997688 0.9746346 0.981719 -0.9998174 0.9796966 0.9841433 -0.9998557 0.9837916 0.9865801 -0.999886 0.9870878 0.9888351 -0.9999099 0.9897306 0.9908248 -0.9999288 0.9918431 0.992528 -0.9999437 0.9935277 0.9939562 -0.9187175 0.9309867 0.9992474 -0.918717 0.9309858 0.9992474 -0.9187164 0.9309847 0.9992474 -0.9187157 0.9309833 0.9992474 -0.9187148 0.9309816 0.9992474 -0.9187137 0.9309795 0.9992474 -0.9187123 0.9309769 0.9992473 -0.9187107 0.9309736 0.9992473 -0.9187089 0.9309697 0.9992473 -0.9187068 0.9309649 0.9992473 -0.9187045 0.9309592 0.9992472 -0.9187024 0.9309526 0.9992472 -0.9187008 0.9309451 0.9992472 -0.9187004 0.930937 0.9992471 -0.9187027 0.9309292 0.9992471 -0.9187101 0.9309231 0.999247 -0.9187262 0.9309211 0.999247 -0.9187495 0.9309211 0.999247 -0.9187791 0.9309211 0.999247 -0.9188164 0.9309211 0.999247 -0.9188636 0.9309211 0.999247 -0.9189234 0.9309211 0.999247 -0.918999 0.9309211 0.999247 -0.9190947 0.9309211 0.999247 -0.9192157 0.9309211 0.999247 -0.9193688 0.9309211 0.999247 -0.9195625 0.9309211 0.999247 -0.9198076 0.9309211 0.999247 -0.9201176 0.9309211 0.999247 -0.9205098 0.9309211 0.999247 -0.9210061 0.9309211 0.999247 -0.9216339 0.9309211 0.999247 -0.9224281 0.9309211 0.999247 -0.9234329 0.9309211 0.999247 -0.9247041 0.9309211 0.999247 -0.9263124 0.9309211 0.999247 -0.928347 0.9309211 0.999247 -0.9309211 0.9309211 0.999247 -0.9341777 0.9309211 0.999247 -0.9382977 0.9309211 0.999247 -0.94351 0.9309211 0.999247 -0.9501042 0.9309211 0.999247 -0.9584468 0.9309211 0.999247 -0.9690013 0.9309211 0.999247 -0.982354 0.9309211 0.999247 -0.999247 0.9309211 0.999247 -0.9994057 0.9425502 0.9858591 -0.9995308 0.952764 0.9801368 -0.9996295 0.9614985 0.978759 -0.9997074 0.9688274 0.9796909 -0.9997688 0.9748918 0.981719 -0.9998174 0.979858 0.9841433 -0.9998557 0.9838928 0.9865801 -0.999886 0.9871512 0.9888351 -0.9999099 0.9897703 0.9908248 -0.9999288 0.991868 0.992528 -0.9999437 0.9935432 0.9939562 -0.9187175 0.9342401 0.9992474 -0.918717 0.9342393 0.9992474 -0.9187164 0.9342383 0.9992474 -0.9187157 0.934237 0.9992474 -0.9187148 0.9342353 0.9992474 -0.9187137 0.9342333 0.9992474 -0.9187123 0.9342308 0.9992473 -0.9187107 0.9342277 0.9992473 -0.9187089 0.934224 0.9992473 -0.9187068 0.9342194 0.9992473 -0.9187045 0.934214 0.9992472 -0.9187024 0.9342076 0.9992472 -0.9187008 0.9342005 0.9992472 -0.9187004 0.9341929 0.9992471 -0.9187027 0.9341854 0.9992471 -0.9187101 0.9341796 0.999247 -0.9187262 0.9341777 0.999247 -0.9187495 0.9341777 0.999247 -0.9187791 0.9341777 0.999247 -0.9188164 0.9341777 0.999247 -0.9188636 0.9341777 0.999247 -0.9189234 0.9341777 0.999247 -0.918999 0.9341777 0.999247 -0.9190947 0.9341777 0.999247 -0.9192157 0.9341777 0.999247 -0.9193688 0.9341777 0.999247 -0.9195625 0.9341777 0.999247 -0.9198076 0.9341777 0.999247 -0.9201176 0.9341777 0.999247 -0.9205098 0.9341777 0.999247 -0.9210061 0.9341777 0.999247 -0.9216339 0.9341777 0.999247 -0.9224281 0.9341777 0.999247 -0.9234329 0.9341777 0.999247 -0.9247041 0.9341777 0.999247 -0.9263124 0.9341777 0.999247 -0.928347 0.9341777 0.999247 -0.9309211 0.9341777 0.999247 -0.9341777 0.9341777 0.999247 -0.9382977 0.9341777 0.999247 -0.94351 0.9341777 0.999247 -0.9501042 0.9341777 0.999247 -0.9584468 0.9341777 0.999247 -0.9690013 0.9341777 0.999247 -0.982354 0.9341777 0.999247 -0.999247 0.9341777 0.999247 -0.9994057 0.9446144 0.9858591 -0.9995308 0.9540687 0.9801368 -0.9996295 0.9623212 0.978759 -0.9997074 0.9693452 0.9796909 -0.9997688 0.9752172 0.981719 -0.9998174 0.9800622 0.9841433 -0.9998557 0.9840209 0.9865801 -0.999886 0.9872315 0.9888351 -0.9999099 0.9898206 0.9908248 -0.9999288 0.9918994 0.992528 -0.9999437 0.9935629 0.9939562 -0.9187175 0.9383562 0.9992474 -0.918717 0.9383554 0.9992474 -0.9187164 0.9383544 0.9992474 -0.9187157 0.9383532 0.9992474 -0.9187148 0.9383517 0.9992474 -0.9187137 0.9383498 0.9992474 -0.9187123 0.9383474 0.9992473 -0.9187107 0.9383446 0.9992473 -0.9187089 0.938341 0.9992473 -0.9187068 0.9383367 0.9992473 -0.9187045 0.9383317 0.9992472 -0.9187024 0.9383257 0.9992472 -0.9187008 0.938319 0.9992472 -0.9187004 0.9383119 0.9992471 -0.9187027 0.9383049 0.9992471 -0.9187101 0.9382994 0.999247 -0.9187262 0.9382977 0.999247 -0.9187495 0.9382977 0.999247 -0.9187791 0.9382977 0.999247 -0.9188164 0.9382977 0.999247 -0.9188636 0.9382977 0.999247 -0.9189234 0.9382977 0.999247 -0.918999 0.9382977 0.999247 -0.9190947 0.9382977 0.999247 -0.9192157 0.9382977 0.999247 -0.9193688 0.9382977 0.999247 -0.9195625 0.9382977 0.999247 -0.9198076 0.9382977 0.999247 -0.9201176 0.9382977 0.999247 -0.9205098 0.9382977 0.999247 -0.9210061 0.9382977 0.999247 -0.9216339 0.9382977 0.999247 -0.9224281 0.9382977 0.999247 -0.9234329 0.9382977 0.999247 -0.9247041 0.9382977 0.999247 -0.9263124 0.9382977 0.999247 -0.928347 0.9382977 0.999247 -0.9309211 0.9382977 0.999247 -0.9341777 0.9382977 0.999247 -0.9382977 0.9382977 0.999247 -0.94351 0.9382977 0.999247 -0.9501042 0.9382977 0.999247 -0.9584468 0.9382977 0.999247 -0.9690013 0.9382977 0.999247 -0.982354 0.9382977 0.999247 -0.999247 0.9382977 0.999247 -0.9994057 0.9472259 0.9858591 -0.9995308 0.9557192 0.9801368 -0.9996295 0.963362 0.978759 -0.9997074 0.9700002 0.9796909 -0.9997688 0.9756289 0.981719 -0.9998174 0.9803206 0.9841433 -0.9998557 0.9841829 0.9865801 -0.999886 0.987333 0.9888351 -0.9999099 0.9898842 0.9908248 -0.9999288 0.9919392 0.992528 -0.9999437 0.9935878 0.9939562 -0.9187175 0.9435635 0.9992474 -0.918717 0.9435628 0.9992474 -0.9187164 0.9435619 0.9992474 -0.9187157 0.9435608 0.9992474 -0.9187148 0.9435594 0.9992474 -0.9187137 0.9435577 0.9992474 -0.9187123 0.9435555 0.9992473 -0.9187107 0.9435529 0.9992473 -0.9187089 0.9435497 0.9992473 -0.9187068 0.9435457 0.9992473 -0.9187045 0.9435411 0.9992472 -0.9187024 0.9435357 0.9992472 -0.9187008 0.9435295 0.9992472 -0.9187004 0.943523 0.9992471 -0.9187027 0.9435166 0.9992471 -0.9187101 0.9435116 0.999247 -0.9187262 0.94351 0.999247 -0.9187495 0.94351 0.999247 -0.9187791 0.94351 0.999247 -0.9188164 0.94351 0.999247 -0.9188636 0.94351 0.999247 -0.9189234 0.94351 0.999247 -0.918999 0.94351 0.999247 -0.9190947 0.94351 0.999247 -0.9192157 0.94351 0.999247 -0.9193688 0.94351 0.999247 -0.9195625 0.94351 0.999247 -0.9198076 0.94351 0.999247 -0.9201176 0.94351 0.999247 -0.9205098 0.94351 0.999247 -0.9210061 0.94351 0.999247 -0.9216339 0.94351 0.999247 -0.9224281 0.94351 0.999247 -0.9234329 0.94351 0.999247 -0.9247041 0.94351 0.999247 -0.9263124 0.94351 0.999247 -0.928347 0.94351 0.999247 -0.9309211 0.94351 0.999247 -0.9341777 0.94351 0.999247 -0.9382977 0.94351 0.999247 -0.94351 0.94351 0.999247 -0.9501042 0.94351 0.999247 -0.9584468 0.94351 0.999247 -0.9690013 0.94351 0.999247 -0.982354 0.94351 0.999247 -0.999247 0.94351 0.999247 -0.9994057 0.9505298 0.9858591 -0.9995308 0.9578074 0.9801368 -0.9996295 0.9646787 0.978759 -0.9997074 0.970829 0.9796909 -0.9997688 0.9761497 0.981719 -0.9998174 0.9806476 0.9841433 -0.9998557 0.984388 0.9865801 -0.999886 0.9874615 0.9888351 -0.9999099 0.9899646 0.9908248 -0.9999288 0.9919896 0.992528 -0.9999437 0.9936193 0.9939562 -0.9187175 0.9501515 0.9992474 -0.918717 0.9501508 0.9992474 -0.9187164 0.9501501 0.9992474 -0.9187157 0.9501491 0.9992474 -0.9187148 0.9501479 0.9992474 -0.9187137 0.9501463 0.9992474 -0.9187123 0.9501444 0.9992473 -0.9187107 0.9501421 0.9992473 -0.9187089 0.9501392 0.9992473 -0.9187068 0.9501358 0.9992473 -0.9187045 0.9501317 0.9992472 -0.9187024 0.9501269 0.9992472 -0.9187008 0.9501215 0.9992472 -0.9187004 0.9501157 0.9992471 -0.9187027 0.9501101 0.9992471 -0.9187101 0.9501056 0.999247 -0.9187262 0.9501042 0.999247 -0.9187495 0.9501042 0.999247 -0.9187791 0.9501042 0.999247 -0.9188164 0.9501042 0.999247 -0.9188636 0.9501042 0.999247 -0.9189234 0.9501042 0.999247 -0.918999 0.9501042 0.999247 -0.9190947 0.9501042 0.999247 -0.9192157 0.9501042 0.999247 -0.9193688 0.9501042 0.999247 -0.9195625 0.9501042 0.999247 -0.9198076 0.9501042 0.999247 -0.9201176 0.9501042 0.999247 -0.9205098 0.9501042 0.999247 -0.9210061 0.9501042 0.999247 -0.9216339 0.9501042 0.999247 -0.9224281 0.9501042 0.999247 -0.9234329 0.9501042 0.999247 -0.9247041 0.9501042 0.999247 -0.9263124 0.9501042 0.999247 -0.928347 0.9501042 0.999247 -0.9309211 0.9501042 0.999247 -0.9341777 0.9501042 0.999247 -0.9382977 0.9501042 0.999247 -0.94351 0.9501042 0.999247 -0.9501042 0.9501042 0.999247 -0.9584468 0.9501042 0.999247 -0.9690013 0.9501042 0.999247 -0.982354 0.9501042 0.999247 -0.999247 0.9501042 0.999247 -0.9994057 0.9547096 0.9858591 -0.9995308 0.9604492 0.9801368 -0.9996295 0.9663445 0.978759 -0.9997074 0.9718774 0.9796909 -0.9997688 0.9768086 0.981719 -0.9998174 0.9810611 0.9841433 -0.9998557 0.9846473 0.9865801 -0.999886 0.987624 0.9888351 -0.9999099 0.9900664 0.9908248 -0.9999288 0.9920533 0.992528 -0.9999437 0.9936592 0.9939562 -0.9187175 0.9584861 0.9992474 -0.918717 0.9584856 0.9992474 -0.9187164 0.9584849 0.9992474 -0.9187157 0.9584841 0.9992474 -0.9187148 0.9584831 0.9992474 -0.9187137 0.9584818 0.9992474 -0.9187123 0.9584803 0.9992473 -0.9187107 0.9584783 0.9992473 -0.9187089 0.9584759 0.9992473 -0.9187068 0.9584731 0.9992473 -0.9187045 0.9584696 0.9992472 -0.9187024 0.9584657 0.9992472 -0.9187008 0.9584612 0.9992472 -0.9187004 0.9584564 0.9992471 -0.9187027 0.9584517 0.9992471 -0.9187101 0.958448 0.999247 -0.9187262 0.9584468 0.999247 -0.9187495 0.9584468 0.999247 -0.9187791 0.9584468 0.999247 -0.9188164 0.9584468 0.999247 -0.9188636 0.9584468 0.999247 -0.9189234 0.9584468 0.999247 -0.918999 0.9584468 0.999247 -0.9190947 0.9584468 0.999247 -0.9192157 0.9584468 0.999247 -0.9193688 0.9584468 0.999247 -0.9195625 0.9584468 0.999247 -0.9198076 0.9584468 0.999247 -0.9201176 0.9584468 0.999247 -0.9205098 0.9584468 0.999247 -0.9210061 0.9584468 0.999247 -0.9216339 0.9584468 0.999247 -0.9224281 0.9584468 0.999247 -0.9234329 0.9584468 0.999247 -0.9247041 0.9584468 0.999247 -0.9263124 0.9584468 0.999247 -0.928347 0.9584468 0.999247 -0.9309211 0.9584468 0.999247 -0.9341777 0.9584468 0.999247 -0.9382977 0.9584468 0.999247 -0.94351 0.9584468 0.999247 -0.9501042 0.9584468 0.999247 -0.9584468 0.9584468 0.999247 -0.9690013 0.9584468 0.999247 -0.982354 0.9584468 0.999247 -0.999247 0.9584468 0.999247 -0.9994057 0.9599976 0.9858591 -0.9995308 0.9637914 0.9801368 -0.9996295 0.968452 0.978759 -0.9997074 0.9732039 0.9796909 -0.9997688 0.9776422 0.981719 -0.9998174 0.9815844 0.9841433 -0.9998557 0.9849754 0.9865801 -0.999886 0.9878296 0.9888351 -0.9999099 0.9901951 0.9908248 -0.9999288 0.9921339 0.992528 -0.9999437 0.9937096 0.9939562 -0.9187175 0.9690305 0.9992474 -0.918717 0.9690301 0.9992474 -0.9187164 0.9690296 0.9992474 -0.9187157 0.969029 0.9992474 -0.9187148 0.9690283 0.9992474 -0.9187137 0.9690273 0.9992474 -0.9187123 0.9690261 0.9992473 -0.9187107 0.9690247 0.9992473 -0.9187089 0.9690229 0.9992473 -0.9187068 0.9690208 0.9992473 -0.9187045 0.9690183 0.9992472 -0.9187024 0.9690153 0.9992472 -0.9187008 0.969012 0.9992472 -0.9187004 0.9690084 0.9992471 -0.9187027 0.9690049 0.9992471 -0.9187101 0.9690022 0.999247 -0.9187262 0.9690013 0.999247 -0.9187495 0.9690013 0.999247 -0.9187791 0.9690013 0.999247 -0.9188164 0.9690013 0.999247 -0.9188636 0.9690013 0.999247 -0.9189234 0.9690013 0.999247 -0.918999 0.9690013 0.999247 -0.9190947 0.9690013 0.999247 -0.9192157 0.9690013 0.999247 -0.9193688 0.9690013 0.999247 -0.9195625 0.9690013 0.999247 -0.9198076 0.9690013 0.999247 -0.9201176 0.9690013 0.999247 -0.9205098 0.9690013 0.999247 -0.9210061 0.9690013 0.999247 -0.9216339 0.9690013 0.999247 -0.9224281 0.9690013 0.999247 -0.9234329 0.9690013 0.999247 -0.9247041 0.9690013 0.999247 -0.9263124 0.9690013 0.999247 -0.928347 0.9690013 0.999247 -0.9309211 0.9690013 0.999247 -0.9341777 0.9690013 0.999247 -0.9382977 0.9690013 0.999247 -0.94351 0.9690013 0.999247 -0.9501042 0.9690013 0.999247 -0.9584468 0.9690013 0.999247 -0.9690013 0.9690013 0.999247 -0.982354 0.9690013 0.999247 -0.999247 0.9690013 0.999247 -0.9994057 0.9666876 0.9858591 -0.9995308 0.9680197 0.9801368 -0.9996295 0.9711183 0.978759 -0.9997074 0.974882 0.9796909 -0.9997688 0.9786968 0.981719 -0.9998174 0.9822464 0.9841433 -0.9998557 0.9853905 0.9865801 -0.999886 0.9880897 0.9888351 -0.9999099 0.990358 0.9908248 -0.9999288 0.9922358 0.992528 -0.9999437 0.9937734 0.9939562 -0.9187175 0.9823705 0.9992474 -0.918717 0.9823703 0.9992474 -0.9187164 0.98237 0.9992474 -0.9187157 0.9823697 0.9992474 -0.9187148 0.9823693 0.9992474 -0.9187137 0.9823687 0.9992474 -0.9187123 0.9823681 0.9992473 -0.9187107 0.9823673 0.9992473 -0.9187089 0.9823663 0.9992473 -0.9187068 0.9823651 0.9992473 -0.9187045 0.9823636 0.9992472 -0.9187024 0.982362 0.9992472 -0.9187008 0.9823601 0.9992472 -0.9187004 0.9823581 0.9992471 -0.9187027 0.9823561 0.9992471 -0.9187101 0.9823545 0.999247 -0.9187262 0.982354 0.999247 -0.9187495 0.982354 0.999247 -0.9187791 0.982354 0.999247 -0.9188164 0.982354 0.999247 -0.9188636 0.982354 0.999247 -0.9189234 0.982354 0.999247 -0.918999 0.982354 0.999247 -0.9190947 0.982354 0.999247 -0.9192157 0.982354 0.999247 -0.9193688 0.982354 0.999247 -0.9195625 0.982354 0.999247 -0.9198076 0.982354 0.999247 -0.9201176 0.982354 0.999247 -0.9205098 0.982354 0.999247 -0.9210061 0.982354 0.999247 -0.9216339 0.982354 0.999247 -0.9224281 0.982354 0.999247 -0.9234329 0.982354 0.999247 -0.9247041 0.982354 0.999247 -0.9263124 0.982354 0.999247 -0.928347 0.982354 0.999247 -0.9309211 0.982354 0.999247 -0.9341777 0.982354 0.999247 -0.9382977 0.982354 0.999247 -0.94351 0.982354 0.999247 -0.9501042 0.982354 0.999247 -0.9584468 0.982354 0.999247 -0.9690013 0.982354 0.999247 -0.982354 0.982354 0.999247 -0.999247 0.982354 0.999247 -0.9994057 0.9751513 0.9858591 -0.9995308 0.9733691 0.9801368 -0.9996295 0.9744915 0.978759 -0.9997074 0.977005 0.9796909 -0.9997688 0.980031 0.981719 -0.9998174 0.9830838 0.9841433 -0.9998557 0.9859157 0.9865801 -0.999886 0.9884188 0.9888351 -0.9999099 0.9905641 0.9908248 -0.9999288 0.9923648 0.992528 -0.9999437 0.9938541 0.9939562 -0.9187175 0.9992474 0.9992474 -0.918717 0.9992474 0.9992474 -0.9187164 0.9992474 0.9992474 -0.9187157 0.9992474 0.9992474 -0.9187148 0.9992474 0.9992474 -0.9187137 0.9992474 0.9992474 -0.9187123 0.9992473 0.9992473 -0.9187107 0.9992473 0.9992473 -0.9187089 0.9992473 0.9992473 -0.9187068 0.9992473 0.9992473 -0.9187045 0.9992472 0.9992472 -0.9187024 0.9992472 0.9992472 -0.9187008 0.9992472 0.9992472 -0.9187004 0.9992471 0.9992471 -0.9187027 0.9992471 0.9992471 -0.9187101 0.999247 0.999247 -0.9187262 0.999247 0.999247 -0.9187495 0.999247 0.999247 -0.9187791 0.999247 0.999247 -0.9188164 0.999247 0.999247 -0.9188636 0.999247 0.999247 -0.9189234 0.999247 0.999247 -0.918999 0.999247 0.999247 -0.9190947 0.999247 0.999247 -0.9192157 0.999247 0.999247 -0.9193688 0.999247 0.999247 -0.9195625 0.999247 0.999247 -0.9198076 0.999247 0.999247 -0.9201176 0.999247 0.999247 -0.9205098 0.999247 0.999247 -0.9210061 0.999247 0.999247 -0.9216339 0.999247 0.999247 -0.9224281 0.999247 0.999247 -0.9234329 0.999247 0.999247 -0.9247041 0.999247 0.999247 -0.9263124 0.999247 0.999247 -0.928347 0.999247 0.999247 -0.9309211 0.999247 0.999247 -0.9341777 0.999247 0.999247 -0.9382977 0.999247 0.999247 -0.94351 0.999247 0.999247 -0.9501042 0.999247 0.999247 -0.9584468 0.999247 0.999247 -0.9690013 0.999247 0.999247 -0.982354 0.999247 0.999247 -0.999247 0.999247 0.999247 -0.9994057 0.9858591 0.9858591 -0.9995308 0.9801368 0.9801368 -0.9996295 0.978759 0.978759 -0.9997074 0.9796909 0.9796909 -0.9997688 0.981719 0.981719 -0.9998174 0.9841433 0.9841433 -0.9998557 0.9865801 0.9865801 -0.999886 0.9888351 0.9888351 -0.9999099 0.9908248 0.9908248 -0.9999288 0.992528 0.992528 -0.9999437 0.9939562 0.9939562 -0.9348153 0.999406 0.9858696 -0.9348149 0.999406 0.9858695 -0.9348146 0.999406 0.9858693 -0.9348141 0.999406 0.9858691 -0.9348135 0.999406 0.9858688 -0.9348128 0.9994059 0.9858684 -0.9348119 0.9994059 0.985868 -0.9348109 0.9994059 0.9858675 -0.9348097 0.9994059 0.9858669 -0.9348083 0.9994059 0.9858661 -0.9348069 0.9994059 0.9858652 -0.9348055 0.9994059 0.9858641 -0.9348044 0.9994058 0.9858629 -0.9348042 0.9994058 0.9858616 -0.9348056 0.9994058 0.9858604 -0.9348102 0.9994057 0.9858594 -0.9348204 0.9994057 0.9858591 -0.9348352 0.9994057 0.9858591 -0.9348539 0.9994057 0.9858591 -0.9348776 0.9994057 0.9858591 -0.9349075 0.9994057 0.9858591 -0.9349454 0.9994057 0.9858591 -0.9349933 0.9994057 0.9858591 -0.935054 0.9994057 0.9858591 -0.9351307 0.9994057 0.9858591 -0.9352277 0.9994057 0.9858591 -0.9353505 0.9994057 0.9858591 -0.9355059 0.9994057 0.9858591 -0.9357024 0.9994057 0.9858591 -0.935951 0.9994057 0.9858591 -0.9362655 0.9994057 0.9858591 -0.9366635 0.9994057 0.9858591 -0.9371669 0.9994057 0.9858591 -0.9378038 0.9994057 0.9858591 -0.9386096 0.9994057 0.9858591 -0.939629 0.9994057 0.9858591 -0.9409186 0.9994057 0.9858591 -0.9425502 0.9994057 0.9858591 -0.9446144 0.9994057 0.9858591 -0.9472259 0.9994057 0.9858591 -0.9505298 0.9994057 0.9858591 -0.9547096 0.9994057 0.9858591 -0.9599976 0.9994057 0.9858591 -0.9666876 0.9994057 0.9858591 -0.9751513 0.9994057 0.9858591 -0.9858591 0.9994057 0.9858591 -0.9994057 0.9994057 0.9858591 -0.9995308 0.9886988 0.9801368 -0.9996295 0.9841579 0.978759 -0.9997074 0.983089 0.9796909 -0.9997688 0.9838545 0.981719 -0.9998174 0.9854838 0.9841433 -0.9998557 0.9874207 0.9865801 -0.999886 0.9893618 0.9888351 -0.9999099 0.9911547 0.9908248 -0.9999288 0.9927345 0.992528 -0.9999437 0.9940854 0.9939562 -0.9478754 0.999531 0.9801487 -0.9478752 0.999531 0.9801485 -0.947875 0.999531 0.9801483 -0.9478746 0.999531 0.9801481 -0.9478743 0.999531 0.9801478 -0.9478738 0.999531 0.9801474 -0.9478733 0.999531 0.9801469 -0.9478726 0.999531 0.9801463 -0.9478718 0.999531 0.9801456 -0.947871 0.9995309 0.9801447 -0.94787 0.9995309 0.9801437 -0.9478691 0.9995309 0.9801425 -0.9478684 0.9995309 0.9801411 -0.9478683 0.9995309 0.9801397 -0.9478691 0.9995309 0.9801383 -0.947872 0.9995309 0.9801372 -0.9478785 0.9995308 0.9801368 -0.9478878 0.9995308 0.9801368 -0.9478997 0.9995308 0.9801368 -0.9479146 0.9995308 0.9801368 -0.9479335 0.9995308 0.9801368 -0.9479575 0.9995308 0.9801368 -0.9479878 0.9995308 0.9801368 -0.9480261 0.9995308 0.9801368 -0.9480746 0.9995308 0.9801368 -0.9481359 0.9995308 0.9801368 -0.9482135 0.9995308 0.9801368 -0.9483117 0.9995308 0.9801368 -0.9484359 0.9995308 0.9801368 -0.9485931 0.9995308 0.9801368 -0.9487918 0.9995308 0.9801368 -0.9490434 0.9995308 0.9801368 -0.9493615 0.9995308 0.9801368 -0.9497641 0.9995308 0.9801368 -0.9502734 0.9995308 0.9801368 -0.9509177 0.9995308 0.9801368 -0.9517328 0.9995308 0.9801368 -0.952764 0.9995308 0.9801368 -0.9540687 0.9995308 0.9801368 -0.9557192 0.9995308 0.9801368 -0.9578074 0.9995308 0.9801368 -0.9604492 0.9995308 0.9801368 -0.9637914 0.9995308 0.9801368 -0.9680197 0.9995308 0.9801368 -0.9733691 0.9995308 0.9801368 -0.9801368 0.9995308 0.9801368 -0.9886988 0.9995308 0.9801368 -0.9995308 0.9995308 0.9801368 -0.9996295 0.9909882 0.978759 -0.9997074 0.9873879 0.9796909 -0.9997688 0.9865561 0.981719 -0.9998174 0.9871796 0.9841433 -0.9998557 0.9884841 0.9865801 -0.999886 0.9900282 0.9888351 -0.9999099 0.991572 0.9908248 -0.9999288 0.9929957 0.992528 -0.9999437 0.9942488 0.9939562 -0.958416 0.9996296 0.978769 -0.9584159 0.9996296 0.9787689 -0.9584157 0.9996296 0.9787687 -0.9584155 0.9996296 0.9787685 -0.9584153 0.9996296 0.9787683 -0.958415 0.9996296 0.9787679 -0.9584146 0.9996296 0.9787675 -0.9584142 0.9996296 0.978767 -0.9584137 0.9996296 0.9787664 -0.9584132 0.9996296 0.9787657 -0.9584126 0.9996296 0.9787648 -0.958412 0.9996296 0.9787638 -0.9584115 0.9996296 0.9787626 -0.9584114 0.9996295 0.9787614 -0.958412 0.9996295 0.9787602 -0.9584138 0.9996295 0.9787593 -0.9584178 0.9996295 0.978759 -0.9584237 0.9996295 0.978759 -0.9584312 0.9996295 0.978759 -0.9584406 0.9996295 0.978759 -0.9584526 0.9996295 0.978759 -0.9584677 0.9996295 0.978759 -0.9584868 0.9996295 0.978759 -0.9585109 0.9996295 0.978759 -0.9585415 0.9996295 0.978759 -0.9585802 0.9996295 0.978759 -0.9586291 0.9996295 0.978759 -0.958691 0.9996295 0.978759 -0.9587693 0.9996295 0.978759 -0.9588684 0.9996295 0.978759 -0.9589938 0.9996295 0.978759 -0.9591524 0.9996295 0.978759 -0.959353 0.9996295 0.978759 -0.9596068 0.9996295 0.978759 -0.959928 0.9996295 0.978759 -0.9603343 0.9996295 0.978759 -0.9608482 0.9996295 0.978759 -0.9614985 0.9996295 0.978759 -0.9623212 0.9996295 0.978759 -0.963362 0.9996295 0.978759 -0.9646787 0.9996295 0.978759 -0.9663445 0.9996295 0.978759 -0.968452 0.9996295 0.978759 -0.9711183 0.9996295 0.978759 -0.9744915 0.9996295 0.978759 -0.978759 0.9996295 0.978759 -0.9841579 0.9996295 0.978759 -0.9909882 0.9996295 0.978759 -0.9996295 0.9996295 0.978759 -0.9997074 0.9928267 0.9796909 -0.9997688 0.9899741 0.981719 -0.9998174 0.989325 0.9841433 -0.9998557 0.9898295 0.9865801 -0.999886 0.9908712 0.9888351 -0.9999099 0.9920999 0.9908248 -0.9999288 0.9933261 0.992528 -0.9999437 0.9944556 0.9939562 -0.9668873 0.9997074 0.9796986 -0.9668872 0.9997074 0.9796985 -0.9668871 0.9997074 0.9796984 -0.966887 0.9997074 0.9796982 -0.9668869 0.9997074 0.979698 -0.9668867 0.9997074 0.9796978 -0.9668865 0.9997074 0.9796975 -0.9668862 0.9997074 0.9796971 -0.9668859 0.9997074 0.9796966 -0.9668855 0.9997074 0.9796961 -0.9668852 0.9997074 0.9796954 -0.9668848 0.9997074 0.9796946 -0.9668845 0.9997074 0.9796937 -0.9668844 0.9997074 0.9796928 -0.9668847 0.9997074 0.9796919 -0.9668859 0.9997074 0.9796912 -0.9668884 0.9997074 0.9796909 -0.9668922 0.9997074 0.9796909 -0.9668969 0.9997074 0.9796909 -0.9669028 0.9997074 0.9796909 -0.9669103 0.9997074 0.9796909 -0.9669198 0.9997074 0.9796909 -0.9669318 0.9997074 0.9796909 -0.966947 0.9997074 0.9796909 -0.9669663 0.9997074 0.9796909 -0.9669906 0.9997074 0.9796909 -0.9670214 0.9997074 0.9796909 -0.9670604 0.9997074 0.9796909 -0.9671097 0.9997074 0.9796909 -0.967172 0.9997074 0.9796909 -0.9672509 0.9997074 0.9796909 -0.9673508 0.9997074 0.9796909 -0.967477 0.9997074 0.9796909 -0.9676368 0.9997074 0.9796909 -0.9678389 0.9997074 0.9796909 -0.9680946 0.9997074 0.9796909 -0.9684181 0.9997074 0.9796909 -0.9688274 0.9997074 0.9796909 -0.9693452 0.9997074 0.9796909 -0.9700002 0.9997074 0.9796909 -0.970829 0.9997074 0.9796909 -0.9718774 0.9997074 0.9796909 -0.9732039 0.9997074 0.9796909 -0.974882 0.9997074 0.9796909 -0.977005 0.9997074 0.9796909 -0.9796909 0.9997074 0.9796909 -0.983089 0.9997074 0.9796909 -0.9873879 0.9997074 0.9796909 -0.9928267 0.9997074 0.9796909 -0.9997074 0.9997074 0.9796909 -0.9997688 0.9942982 0.981719 -0.9998174 0.9920392 0.9841433 -0.9998557 0.9915316 0.9865801 -0.999886 0.9919377 0.9888351 -0.9999099 0.9927678 0.9908248 -0.9999288 0.9937442 0.992528 -0.9999437 0.9947172 0.9939562 -0.9736726 0.9997689 0.9817245 -0.9736726 0.9997689 0.9817244 -0.9736725 0.9997689 0.9817243 -0.9736724 0.9997689 0.9817242 -0.9736723 0.9997689 0.981724 -0.9736722 0.9997689 0.9817239 -0.9736721 0.9997689 0.9817236 -0.9736719 0.9997689 0.9817234 -0.9736717 0.9997689 0.981723 -0.9736715 0.9997689 0.9817226 -0.9736712 0.9997689 0.9817222 -0.973671 0.9997689 0.9817216 -0.9736708 0.9997689 0.981721 -0.9736708 0.9997689 0.9817203 -0.973671 0.9997688 0.9817197 -0.9736717 0.9997688 0.9817191 -0.9736733 0.9997688 0.981719 -0.9736756 0.9997688 0.981719 -0.9736786 0.9997688 0.981719 -0.9736823 0.9997688 0.981719 -0.973687 0.9997688 0.981719 -0.973693 0.9997688 0.981719 -0.9737006 0.9997688 0.981719 -0.9737101 0.9997688 0.981719 -0.9737222 0.9997688 0.981719 -0.9737375 0.9997688 0.981719 -0.9737569 0.9997688 0.981719 -0.9737814 0.9997688 0.981719 -0.9738123 0.9997688 0.981719 -0.9738515 0.9997688 0.981719 -0.9739011 0.9997688 0.981719 -0.9739638 0.9997688 0.981719 -0.9740432 0.9997688 0.981719 -0.9741436 0.9997688 0.981719 -0.9742706 0.9997688 0.981719 -0.9744313 0.9997688 0.981719 -0.9746346 0.9997688 0.981719 -0.9748918 0.9997688 0.981719 -0.9752172 0.9997688 0.981719 -0.9756289 0.9997688 0.981719 -0.9761497 0.9997688 0.981719 -0.9768086 0.9997688 0.981719 -0.9776422 0.9997688 0.981719 -0.9786968 0.9997688 0.981719 -0.980031 0.9997688 0.981719 -0.981719 0.9997688 0.981719 -0.9838545 0.9997688 0.981719 -0.9865561 0.9997688 0.981719 -0.9899741 0.9997688 0.981719 -0.9942982 0.9997688 0.981719 -0.9997688 0.9997688 0.981719 -0.9998174 0.9954731 0.9841433 -0.9998557 0.9936849 0.9865801 -0.999886 0.993287 0.9888351 -0.9999099 0.9936128 0.9908248 -0.9999288 0.9942731 0.992528 -0.9999437 0.9950481 0.9939562 -0.9790927 0.9998174 0.9841471 -0.9790927 0.9998174 0.9841471 -0.9790927 0.9998174 0.984147 -0.9790926 0.9998174 0.9841469 -0.9790925 0.9998174 0.9841468 -0.9790925 0.9998174 0.9841467 -0.9790924 0.9998174 0.9841465 -0.9790923 0.9998174 0.9841464 -0.9790921 0.9998174 0.9841461 -0.979092 0.9998174 0.9841459 -0.9790919 0.9998174 0.9841455 -0.9790917 0.9998174 0.9841451 -0.9790916 0.9998174 0.9841447 -0.9790916 0.9998174 0.9841443 -0.9790917 0.9998174 0.9841438 -0.9790921 0.9998174 0.9841435 -0.9790931 0.9998174 0.9841433 -0.9790946 0.9998174 0.9841433 -0.9790965 0.9998174 0.9841433 -0.9790988 0.9998174 0.9841433 -0.9791018 0.9998174 0.9841433 -0.9791055 0.9998174 0.9841433 -0.9791103 0.9998174 0.9841433 -0.9791163 0.9998174 0.9841433 -0.9791238 0.9998174 0.9841433 -0.9791334 0.9998174 0.9841433 -0.9791456 0.9998174 0.9841433 -0.979161 0.9998174 0.9841433 -0.9791804 0.9998174 0.9841433 -0.979205 0.9998174 0.9841433 -0.9792361 0.9998174 0.9841433 -0.9792755 0.9998174 0.9841433 -0.9793253 0.9998174 0.9841433 -0.9793883 0.9998174 0.9841433 -0.9794681 0.9998174 0.9841433 -0.9795689 0.9998174 0.9841433 -0.9796966 0.9998174 0.9841433 -0.979858 0.9998174 0.9841433 -0.9800622 0.9998174 0.9841433 -0.9803206 0.9998174 0.9841433 -0.9806476 0.9998174 0.9841433 -0.9810611 0.9998174 0.9841433 -0.9815844 0.9998174 0.9841433 -0.9822464 0.9998174 0.9841433 -0.9830838 0.9998174 0.9841433 -0.9841433 0.9998174 0.9841433 -0.9854838 0.9998174 0.9841433 -0.9871796 0.9998174 0.9841433 -0.989325 0.9998174 0.9841433 -0.9920392 0.9998174 0.9841433 -0.9954731 0.9998174 0.9841433 -0.9998174 0.9998174 0.9841433 -0.9998557 0.9964092 0.9865801 -0.999886 0.9949941 0.9888351 -0.9999099 0.9946818 0.9908248 -0.9999288 0.9949422 0.992528 -0.9999437 0.9954668 0.9939562 -0.9834129 0.9998557 0.9865826 -0.9834129 0.9998557 0.9865826 -0.9834129 0.9998557 0.9865826 -0.9834129 0.9998557 0.9865825 -0.9834128 0.9998557 0.9865825 -0.9834128 0.9998557 0.9865824 -0.9834127 0.9998557 0.9865823 -0.9834127 0.9998557 0.9865821 -0.9834126 0.9998557 0.986582 -0.9834125 0.9998557 0.9865818 -0.9834124 0.9998557 0.9865816 -0.9834123 0.9998557 0.9865813 -0.9834122 0.9998557 0.986581 -0.9834122 0.9998557 0.9865807 -0.9834123 0.9998557 0.9865804 -0.9834126 0.9998557 0.9865802 -0.9834132 0.9998557 0.9865801 -0.9834141 0.9998557 0.9865801 -0.9834153 0.9998557 0.9865801 -0.9834167 0.9998557 0.9865801 -0.9834186 0.9998557 0.9865801 -0.9834209 0.9998557 0.9865801 -0.9834239 0.9998557 0.9865801 -0.9834277 0.9998557 0.9865801 -0.9834324 0.9998557 0.9865801 -0.9834385 0.9998557 0.9865801 -0.9834461 0.9998557 0.9865801 -0.9834557 0.9998557 0.9865801 -0.9834679 0.9998557 0.9865801 -0.9834833 0.9998557 0.9865801 -0.9835029 0.9998557 0.9865801 -0.9835276 0.9998557 0.9865801 -0.9835588 0.9998557 0.9865801 -0.9835983 0.9998557 0.9865801 -0.9836483 0.9998557 0.9865801 -0.9837116 0.9998557 0.9865801 -0.9837916 0.9998557 0.9865801 -0.9838928 0.9998557 0.9865801 -0.9840209 0.9998557 0.9865801 -0.9841829 0.9998557 0.9865801 -0.984388 0.9998557 0.9865801 -0.9846473 0.9998557 0.9865801 -0.9849754 0.9998557 0.9865801 -0.9853905 0.9998557 0.9865801 -0.9859157 0.9998557 0.9865801 -0.9865801 0.9998557 0.9865801 -0.9874207 0.9998557 0.9865801 -0.9884841 0.9998557 0.9865801 -0.9898295 0.9998557 0.9865801 -0.9915316 0.9998557 0.9865801 -0.9936849 0.9998557 0.9865801 -0.9964092 0.9998557 0.9865801 -0.9998557 0.9998557 0.9865801 -0.999886 0.9971537 0.9888351 -0.9999099 0.9960342 0.9908248 -0.9999288 0.9957887 0.992528 -0.9999437 0.9959964 0.9939562 -0.9868505 0.999886 0.9888368 -0.9868505 0.999886 0.9888367 -0.9868505 0.999886 0.9888367 -0.9868505 0.999886 0.9888367 -0.9868504 0.999886 0.9888366 -0.9868504 0.999886 0.9888366 -0.9868504 0.999886 0.9888365 -0.9868503 0.999886 0.9888364 -0.9868503 0.999886 0.9888363 -0.9868502 0.999886 0.9888362 -0.9868502 0.999886 0.9888361 -0.9868501 0.999886 0.9888359 -0.9868501 0.999886 0.9888357 -0.98685 0.999886 0.9888355 -0.9868501 0.999886 0.9888353 -0.9868503 0.999886 0.9888352 -0.9868507 0.999886 0.9888351 -0.9868512 0.999886 0.9888351 -0.986852 0.999886 0.9888351 -0.9868529 0.999886 0.9888351 -0.9868541 0.999886 0.9888351 -0.9868555 0.999886 0.9888351 -0.9868574 0.999886 0.9888351 -0.9868597 0.999886 0.9888351 -0.9868627 0.999886 0.9888351 -0.9868665 0.999886 0.9888351 -0.9868713 0.999886 0.9888351 -0.9868773 0.999886 0.9888351 -0.986885 0.999886 0.9888351 -0.9868946 0.999886 0.9888351 -0.9869069 0.999886 0.9888351 -0.9869223 0.999886 0.9888351 -0.9869419 0.999886 0.9888351 -0.9869667 0.999886 0.9888351 -0.986998 0.999886 0.9888351 -0.9870376 0.999886 0.9888351 -0.9870878 0.999886 0.9888351 -0.9871512 0.999886 0.9888351 -0.9872315 0.999886 0.9888351 -0.987333 0.999886 0.9888351 -0.9874615 0.999886 0.9888351 -0.987624 0.999886 0.9888351 -0.9878296 0.999886 0.9888351 -0.9880897 0.999886 0.9888351 -0.9884188 0.999886 0.9888351 -0.9888351 0.999886 0.9888351 -0.9893618 0.999886 0.9888351 -0.9900282 0.999886 0.9888351 -0.9908712 0.999886 0.9888351 -0.9919377 0.999886 0.9888351 -0.993287 0.999886 0.9888351 -0.9949941 0.999886 0.9888351 -0.9971537 0.999886 0.9888351 -0.999886 0.999886 0.9888351 -0.9999099 0.9977452 0.9908248 -0.9999288 0.9968597 0.992528 -0.9999437 0.9966665 0.9939562 -0.989582 0.9999099 0.9908259 -0.989582 0.9999099 0.9908259 -0.989582 0.9999099 0.9908259 -0.989582 0.9999099 0.9908259 -0.989582 0.9999099 0.9908258 -0.9895819 0.9999099 0.9908258 -0.9895819 0.9999099 0.9908257 -0.9895819 0.9999099 0.9908257 -0.9895819 0.9999099 0.9908256 -0.9895818 0.9999099 0.9908255 -0.9895818 0.9999099 0.9908255 -0.9895818 0.9999099 0.9908253 -0.9895817 0.9999099 0.9908252 -0.9895817 0.9999099 0.9908251 -0.9895817 0.9999099 0.990825 -0.9895819 0.9999099 0.9908249 -0.9895821 0.9999099 0.9908248 -0.9895825 0.9999099 0.9908248 -0.9895829 0.9999099 0.9908248 -0.9895835 0.9999099 0.9908248 -0.9895842 0.9999099 0.9908248 -0.9895851 0.9999099 0.9908248 -0.9895863 0.9999099 0.9908248 -0.9895878 0.9999099 0.9908248 -0.9895897 0.9999099 0.9908248 -0.989592 0.9999099 0.9908248 -0.989595 0.9999099 0.9908248 -0.9895988 0.9999099 0.9908248 -0.9896036 0.9999099 0.9908248 -0.9896096 0.9999099 0.9908248 -0.9896173 0.9999099 0.9908248 -0.989627 0.9999099 0.9908248 -0.9896392 0.9999099 0.9908248 -0.9896547 0.9999099 0.9908248 -0.9896744 0.9999099 0.9908248 -0.9896992 0.9999099 0.9908248 -0.9897306 0.9999099 0.9908248 -0.9897703 0.9999099 0.9908248 -0.9898206 0.9999099 0.9908248 -0.9898842 0.9999099 0.9908248 -0.9899646 0.9999099 0.9908248 -0.9900664 0.9999099 0.9908248 -0.9901951 0.9999099 0.9908248 -0.990358 0.9999099 0.9908248 -0.9905641 0.9999099 0.9908248 -0.9908248 0.9999099 0.9908248 -0.9911547 0.9999099 0.9908248 -0.991572 0.9999099 0.9908248 -0.9920999 0.9999099 0.9908248 -0.9927678 0.9999099 0.9908248 -0.9936128 0.9999099 0.9908248 -0.9946818 0.9999099 0.9908248 -0.9960342 0.9999099 0.9908248 -0.9977452 0.9999099 0.9908248 -0.9999099 0.9999099 0.9908248 -0.9999288 0.9982146 0.992528 -0.9999437 0.9975143 0.9939562 -0.9917501 0.9999288 0.9925287 -0.9917501 0.9999288 0.9925287 -0.9917501 0.9999288 0.9925287 -0.9917501 0.9999288 0.9925287 -0.9917501 0.9999288 0.9925287 -0.9917501 0.9999288 0.9925286 -0.99175 0.9999288 0.9925286 -0.99175 0.9999288 0.9925286 -0.99175 0.9999288 0.9925285 -0.99175 0.9999288 0.9925285 -0.99175 0.9999288 0.9925284 -0.9917499 0.9999288 0.9925283 -0.9917499 0.9999288 0.9925283 -0.9917499 0.9999288 0.9925282 -0.9917499 0.9999288 0.9925281 -0.99175 0.9999288 0.992528 -0.9917502 0.9999288 0.992528 -0.9917504 0.9999288 0.992528 -0.9917507 0.9999288 0.992528 -0.991751 0.9999288 0.992528 -0.9917515 0.9999288 0.992528 -0.9917521 0.9999288 0.992528 -0.9917528 0.9999288 0.992528 -0.9917537 0.9999288 0.992528 -0.9917549 0.9999288 0.992528 -0.9917564 0.9999288 0.992528 -0.9917582 0.9999288 0.992528 -0.9917606 0.9999288 0.992528 -0.9917636 0.9999288 0.992528 -0.9917674 0.9999288 0.992528 -0.9917722 0.9999288 0.992528 -0.9917782 0.9999288 0.992528 -0.9917859 0.9999288 0.992528 -0.9917956 0.9999288 0.992528 -0.9918079 0.9999288 0.992528 -0.9918234 0.9999288 0.992528 -0.9918431 0.9999288 0.992528 -0.991868 0.9999288 0.992528 -0.9918994 0.9999288 0.992528 -0.9919392 0.9999288 0.992528 -0.9919896 0.9999288 0.992528 -0.9920533 0.9999288 0.992528 -0.9921339 0.9999288 0.992528 -0.9922358 0.9999288 0.992528 -0.9923648 0.9999288 0.992528 -0.992528 0.9999288 0.992528 -0.9927345 0.9999288 0.992528 -0.9929957 0.9999288 0.992528 -0.9933261 0.9999288 0.992528 -0.9937442 0.9999288 0.992528 -0.9942731 0.9999288 0.992528 -0.9949422 0.9999288 0.992528 -0.9957887 0.9999288 0.992528 -0.9968597 0.9999288 0.992528 -0.9982146 0.9999288 0.992528 -0.9999288 0.9999288 0.992528 -0.9999437 0.9985868 0.9939562 -0.9934695 0.9999437 0.9939567 -0.9934695 0.9999437 0.9939567 -0.9934695 0.9999437 0.9939567 -0.9934695 0.9999437 0.9939566 -0.9934695 0.9999437 0.9939566 -0.9934695 0.9999437 0.9939566 -0.9934695 0.9999437 0.9939566 -0.9934694 0.9999437 0.9939566 -0.9934694 0.9999437 0.9939566 -0.9934694 0.9999437 0.9939565 -0.9934694 0.9999437 0.9939565 -0.9934694 0.9999437 0.9939564 -0.9934694 0.9999437 0.9939564 -0.9934694 0.9999437 0.9939563 -0.9934694 0.9999437 0.9939563 -0.9934694 0.9999437 0.9939562 -0.9934695 0.9999437 0.9939562 -0.9934697 0.9999437 0.9939562 -0.9934698 0.9999437 0.9939562 -0.9934701 0.9999437 0.9939562 -0.9934704 0.9999437 0.9939562 -0.9934707 0.9999437 0.9939562 -0.9934712 0.9999437 0.9939562 -0.9934718 0.9999437 0.9939562 -0.9934725 0.9999437 0.9939562 -0.9934734 0.9999437 0.9939562 -0.9934746 0.9999437 0.9939562 -0.9934761 0.9999437 0.9939562 -0.9934779 0.9999437 0.9939562 -0.9934803 0.9999437 0.9939562 -0.9934833 0.9999437 0.9939562 -0.9934871 0.9999437 0.9939562 -0.9934919 0.9999437 0.9939562 -0.993498 0.9999437 0.9939562 -0.9935057 0.9999437 0.9939562 -0.9935154 0.9999437 0.9939562 -0.9935277 0.9999437 0.9939562 -0.9935432 0.9999437 0.9939562 -0.9935629 0.9999437 0.9939562 -0.9935878 0.9999437 0.9939562 -0.9936193 0.9999437 0.9939562 -0.9936592 0.9999437 0.9939562 -0.9937096 0.9999437 0.9939562 -0.9937734 0.9999437 0.9939562 -0.9938541 0.9999437 0.9939562 -0.9939562 0.9999437 0.9939562 -0.9940854 0.9999437 0.9939562 -0.9942488 0.9999437 0.9939562 -0.9944556 0.9999437 0.9939562 -0.9947172 0.9999437 0.9939562 -0.9950481 0.9999437 0.9939562 -0.9954668 0.9999437 0.9939562 -0.9959964 0.9999437 0.9939562 -0.9966665 0.9999437 0.9939562 -0.9975143 0.9999437 0.9939562 -0.9985868 0.9999437 0.9939562 -0.9999437 0.9999437 0.9939562 -0.9348153 0.9348153 0.999406 -0.9348156 0.9348153 0.999406 -0.934816 0.9348153 0.999406 -0.9348166 0.9348153 0.999406 -0.9348173 0.9348153 0.999406 -0.9348182 0.9348153 0.999406 -0.9348193 0.9348153 0.999406 -0.9348207 0.9348153 0.999406 -0.9348225 0.9348153 0.999406 -0.9348247 0.9348153 0.999406 -0.9348276 0.9348153 0.999406 -0.9348312 0.9348153 0.999406 -0.9348357 0.9348153 0.999406 -0.9348415 0.9348153 0.999406 -0.9348488 0.9348153 0.999406 -0.934858 0.9348153 0.999406 -0.9348697 0.9348153 0.999406 -0.9348845 0.9348153 0.999406 -0.9349032 0.9348153 0.999406 -0.9349268 0.9348153 0.999406 -0.9349567 0.9348153 0.999406 -0.9349946 0.9348153 0.999406 -0.9350425 0.9348153 0.999406 -0.9351031 0.9348153 0.999406 -0.9351797 0.9348153 0.999406 -0.9352767 0.9348153 0.999406 -0.9353994 0.9348153 0.999406 -0.9355546 0.9348153 0.999406 -0.935751 0.9348153 0.999406 -0.9359994 0.9348153 0.999406 -0.9363137 0.9348153 0.999406 -0.9367113 0.9348153 0.999406 -0.9372144 0.9348153 0.999406 -0.9378508 0.9348153 0.999406 -0.938656 0.9348153 0.999406 -0.9396746 0.9348153 0.999406 -0.9409633 0.9348153 0.999406 -0.9425936 0.9348153 0.999406 -0.9446563 0.9348153 0.999406 -0.9472658 0.9348153 0.999406 -0.9505671 0.9348153 0.999406 -0.9547438 0.9348153 0.999406 -0.9600277 0.9348153 0.999406 -0.9667127 0.9348153 0.999406 -0.97517 0.9348153 0.999406 -0.9858696 0.9348153 0.999406 -0.999406 0.9348153 0.999406 -0.999531 0.9478754 0.9887055 -0.9996296 0.958416 0.9841654 -0.9997074 0.9668873 0.9830954 -0.9997689 0.9736726 0.9838593 -0.9998174 0.9790927 0.9854872 -0.9998557 0.9834129 0.9874231 -0.999886 0.9868505 0.9893634 -0.9999099 0.989582 0.9911557 -0.9999288 0.9917501 0.9927351 -0.9999437 0.9934695 0.9940858 -0.9348153 0.9348156 0.999406 -0.9348149 0.9348149 0.999406 -0.9348154 0.9348149 0.999406 -0.9348159 0.9348149 0.999406 -0.9348166 0.9348149 0.999406 -0.9348175 0.9348149 0.999406 -0.9348186 0.9348149 0.999406 -0.93482 0.9348149 0.999406 -0.9348218 0.9348149 0.999406 -0.9348241 0.9348149 0.999406 -0.9348269 0.9348149 0.999406 -0.9348305 0.9348149 0.999406 -0.9348351 0.9348149 0.999406 -0.9348408 0.9348149 0.999406 -0.9348481 0.9348149 0.999406 -0.9348574 0.9348149 0.999406 -0.934869 0.9348149 0.999406 -0.9348838 0.9348149 0.999406 -0.9349025 0.9348149 0.999406 -0.9349262 0.9348149 0.999406 -0.9349561 0.9348149 0.999406 -0.9349939 0.9348149 0.999406 -0.9350418 0.9348149 0.999406 -0.9351024 0.9348149 0.999406 -0.9351791 0.9348149 0.999406 -0.9352761 0.9348149 0.999406 -0.9353987 0.9348149 0.999406 -0.935554 0.9348149 0.999406 -0.9357503 0.9348149 0.999406 -0.9359988 0.9348149 0.999406 -0.9363131 0.9348149 0.999406 -0.9367107 0.9348149 0.999406 -0.9372137 0.9348149 0.999406 -0.9378502 0.9348149 0.999406 -0.9386553 0.9348149 0.999406 -0.939674 0.9348149 0.999406 -0.9409627 0.9348149 0.999406 -0.9425931 0.9348149 0.999406 -0.9446557 0.9348149 0.999406 -0.9472652 0.9348149 0.999406 -0.9505666 0.9348149 0.999406 -0.9547433 0.9348149 0.999406 -0.9600273 0.9348149 0.999406 -0.9667124 0.9348149 0.999406 -0.9751697 0.9348149 0.999406 -0.9858695 0.9348149 0.999406 -0.999406 0.9348149 0.999406 -0.999531 0.9478752 0.9887054 -0.9996296 0.9584159 0.9841653 -0.9997074 0.9668872 0.9830953 -0.9997689 0.9736726 0.9838592 -0.9998174 0.9790927 0.9854872 -0.9998557 0.9834129 0.987423 -0.999886 0.9868505 0.9893634 -0.9999099 0.989582 0.9911557 -0.9999288 0.9917501 0.9927351 -0.9999437 0.9934695 0.9940858 -0.9348153 0.934816 0.999406 -0.9348149 0.9348154 0.999406 -0.9348146 0.9348146 0.999406 -0.9348151 0.9348146 0.999406 -0.9348158 0.9348146 0.999406 -0.9348167 0.9348146 0.999406 -0.9348178 0.9348146 0.999406 -0.9348192 0.9348146 0.999406 -0.934821 0.9348146 0.999406 -0.9348232 0.9348146 0.999406 -0.9348261 0.9348146 0.999406 -0.9348297 0.9348146 0.999406 -0.9348342 0.9348146 0.999406 -0.93484 0.9348146 0.999406 -0.9348473 0.9348146 0.999406 -0.9348565 0.9348146 0.999406 -0.9348682 0.9348146 0.999406 -0.934883 0.9348146 0.999406 -0.9349017 0.9348146 0.999406 -0.9349253 0.9348146 0.999406 -0.9349553 0.9348146 0.999406 -0.9349931 0.9348146 0.999406 -0.935041 0.9348146 0.999406 -0.9351016 0.9348146 0.999406 -0.9351783 0.9348146 0.999406 -0.9352752 0.9348146 0.999406 -0.9353979 0.9348146 0.999406 -0.9355532 0.9348146 0.999406 -0.9357495 0.9348146 0.999406 -0.935998 0.9348146 0.999406 -0.9363123 0.9348146 0.999406 -0.9367099 0.9348146 0.999406 -0.937213 0.9348146 0.999406 -0.9378494 0.9348146 0.999406 -0.9386546 0.9348146 0.999406 -0.9396732 0.9348146 0.999406 -0.9409619 0.9348146 0.999406 -0.9425924 0.9348146 0.999406 -0.944655 0.9348146 0.999406 -0.9472646 0.9348146 0.999406 -0.950566 0.9348146 0.999406 -0.9547427 0.9348146 0.999406 -0.9600268 0.9348146 0.999406 -0.9667119 0.9348146 0.999406 -0.9751694 0.9348146 0.999406 -0.9858693 0.9348146 0.999406 -0.999406 0.9348146 0.999406 -0.999531 0.947875 0.9887053 -0.9996296 0.9584157 0.9841652 -0.9997074 0.9668871 0.9830952 -0.9997689 0.9736725 0.9838591 -0.9998174 0.9790927 0.9854871 -0.9998557 0.9834129 0.987423 -0.999886 0.9868505 0.9893633 -0.9999099 0.989582 0.9911557 -0.9999288 0.9917501 0.9927351 -0.9999437 0.9934695 0.9940858 -0.9348153 0.9348166 0.999406 -0.9348149 0.9348159 0.999406 -0.9348146 0.9348151 0.999406 -0.9348141 0.9348141 0.999406 -0.9348148 0.9348141 0.999406 -0.9348157 0.9348141 0.999406 -0.9348168 0.9348141 0.999406 -0.9348182 0.9348141 0.999406 -0.93482 0.9348141 0.999406 -0.9348222 0.9348141 0.999406 -0.9348251 0.9348141 0.999406 -0.9348287 0.9348141 0.999406 -0.9348332 0.9348141 0.999406 -0.934839 0.9348141 0.999406 -0.9348463 0.9348141 0.999406 -0.9348555 0.9348141 0.999406 -0.9348672 0.9348141 0.999406 -0.934882 0.9348141 0.999406 -0.9349007 0.9348141 0.999406 -0.9349243 0.9348141 0.999406 -0.9349542 0.9348141 0.999406 -0.9349921 0.9348141 0.999406 -0.93504 0.9348141 0.999406 -0.9351006 0.9348141 0.999406 -0.9351772 0.9348141 0.999406 -0.9352742 0.9348141 0.999406 -0.9353969 0.9348141 0.999406 -0.9355521 0.9348141 0.999406 -0.9357485 0.9348141 0.999406 -0.935997 0.9348141 0.999406 -0.9363113 0.9348141 0.999406 -0.9367089 0.9348141 0.999406 -0.937212 0.9348141 0.999406 -0.9378484 0.9348141 0.999406 -0.9386536 0.9348141 0.999406 -0.9396723 0.9348141 0.999406 -0.940961 0.9348141 0.999406 -0.9425915 0.9348141 0.999406 -0.9446542 0.9348141 0.999406 -0.9472638 0.9348141 0.999406 -0.9505652 0.9348141 0.999406 -0.954742 0.9348141 0.999406 -0.9600262 0.9348141 0.999406 -0.9667114 0.9348141 0.999406 -0.975169 0.9348141 0.999406 -0.9858691 0.9348141 0.999406 -0.999406 0.9348141 0.999406 -0.999531 0.9478746 0.9887052 -0.9996296 0.9584155 0.984165 -0.9997074 0.966887 0.983095 -0.9997689 0.9736724 0.983859 -0.9998174 0.9790926 0.985487 -0.9998557 0.9834129 0.9874229 -0.999886 0.9868505 0.9893633 -0.9999099 0.989582 0.9911557 -0.9999288 0.9917501 0.9927351 -0.9999437 0.9934695 0.9940858 -0.9348153 0.9348173 0.999406 -0.9348149 0.9348166 0.999406 -0.9348146 0.9348158 0.999406 -0.9348141 0.9348148 0.999406 -0.9348135 0.9348135 0.999406 -0.9348144 0.9348135 0.999406 -0.9348155 0.9348135 0.999406 -0.9348169 0.9348135 0.999406 -0.9348187 0.9348135 0.999406 -0.9348209 0.9348135 0.999406 -0.9348238 0.9348135 0.999406 -0.9348274 0.9348135 0.999406 -0.9348319 0.9348135 0.999406 -0.9348377 0.9348135 0.999406 -0.934845 0.9348135 0.999406 -0.9348542 0.9348135 0.999406 -0.9348659 0.9348135 0.999406 -0.9348807 0.9348135 0.999406 -0.9348994 0.9348135 0.999406 -0.934923 0.9348135 0.999406 -0.934953 0.9348135 0.999406 -0.9349908 0.9348135 0.999406 -0.9350387 0.9348135 0.999406 -0.9350993 0.9348135 0.999406 -0.935176 0.9348135 0.999406 -0.935273 0.9348135 0.999406 -0.9353956 0.9348135 0.999406 -0.9355509 0.9348135 0.999406 -0.9357472 0.9348135 0.999406 -0.9359957 0.9348135 0.999406 -0.93631 0.9348135 0.999406 -0.9367077 0.9348135 0.999406 -0.9372107 0.9348135 0.999406 -0.9378472 0.9348135 0.999406 -0.9386524 0.9348135 0.999406 -0.9396711 0.9348135 0.999406 -0.9409599 0.9348135 0.999406 -0.9425903 0.9348135 0.999406 -0.9446531 0.9348135 0.999406 -0.9472627 0.9348135 0.999406 -0.9505643 0.9348135 0.999406 -0.9547411 0.9348135 0.999406 -0.9600254 0.9348135 0.999406 -0.9667108 0.9348135 0.999406 -0.9751686 0.9348135 0.999406 -0.9858688 0.9348135 0.999406 -0.999406 0.9348135 0.999406 -0.999531 0.9478743 0.988705 -0.9996296 0.9584153 0.9841648 -0.9997074 0.9668869 0.9830949 -0.9997689 0.9736723 0.9838589 -0.9998174 0.9790925 0.9854869 -0.9998557 0.9834128 0.9874229 -0.999886 0.9868504 0.9893633 -0.9999099 0.989582 0.9911556 -0.9999288 0.9917501 0.9927351 -0.9999437 0.9934695 0.9940858 -0.9348153 0.9348182 0.999406 -0.9348149 0.9348175 0.999406 -0.9348146 0.9348167 0.999406 -0.9348141 0.9348157 0.999406 -0.9348135 0.9348144 0.999406 -0.9348128 0.9348128 0.9994059 -0.9348139 0.9348128 0.9994059 -0.9348153 0.9348128 0.9994059 -0.9348171 0.9348128 0.9994059 -0.9348193 0.9348128 0.9994059 -0.9348222 0.9348128 0.9994059 -0.9348258 0.9348128 0.9994059 -0.9348303 0.9348128 0.9994059 -0.9348361 0.9348128 0.9994059 -0.9348434 0.9348128 0.9994059 -0.9348526 0.9348128 0.9994059 -0.9348643 0.9348128 0.9994059 -0.9348791 0.9348128 0.9994059 -0.9348978 0.9348128 0.9994059 -0.9349215 0.9348128 0.9994059 -0.9349514 0.9348128 0.9994059 -0.9349892 0.9348128 0.9994059 -0.9350371 0.9348128 0.9994059 -0.9350977 0.9348128 0.9994059 -0.9351744 0.9348128 0.9994059 -0.9352714 0.9348128 0.9994059 -0.9353941 0.9348128 0.9994059 -0.9355493 0.9348128 0.9994059 -0.9357457 0.9348128 0.9994059 -0.9359941 0.9348128 0.9994059 -0.9363085 0.9348128 0.9994059 -0.9367061 0.9348128 0.9994059 -0.9372092 0.9348128 0.9994059 -0.9378457 0.9348128 0.9994059 -0.9386509 0.9348128 0.9994059 -0.9396696 0.9348128 0.9994059 -0.9409584 0.9348128 0.9994059 -0.9425889 0.9348128 0.9994059 -0.9446517 0.9348128 0.9994059 -0.9472614 0.9348128 0.9994059 -0.9505631 0.9348128 0.9994059 -0.95474 0.9348128 0.9994059 -0.9600245 0.9348128 0.9994059 -0.96671 0.9348128 0.9994059 -0.975168 0.9348128 0.9994059 -0.9858684 0.9348128 0.9994059 -0.9994059 0.9348128 0.9994059 -0.999531 0.9478738 0.9887048 -0.9996296 0.958415 0.9841646 -0.9997074 0.9668867 0.9830947 -0.9997689 0.9736722 0.9838588 -0.9998174 0.9790925 0.9854868 -0.9998557 0.9834128 0.9874228 -0.999886 0.9868504 0.9893632 -0.9999099 0.9895819 0.9911556 -0.9999288 0.9917501 0.9927351 -0.9999437 0.9934695 0.9940858 -0.9348153 0.9348193 0.999406 -0.9348149 0.9348186 0.999406 -0.9348146 0.9348178 0.999406 -0.9348141 0.9348168 0.999406 -0.9348135 0.9348155 0.999406 -0.9348128 0.9348139 0.9994059 -0.9348119 0.9348119 0.9994059 -0.9348133 0.9348119 0.9994059 -0.9348151 0.9348119 0.9994059 -0.9348174 0.9348119 0.9994059 -0.9348202 0.9348119 0.9994059 -0.9348238 0.9348119 0.9994059 -0.9348284 0.9348119 0.9994059 -0.9348341 0.9348119 0.9994059 -0.9348414 0.9348119 0.9994059 -0.9348507 0.9348119 0.9994059 -0.9348623 0.9348119 0.9994059 -0.9348771 0.9348119 0.9994059 -0.9348958 0.9348119 0.9994059 -0.9349195 0.9348119 0.9994059 -0.9349494 0.9348119 0.9994059 -0.9349873 0.9348119 0.9994059 -0.9350352 0.9348119 0.9994059 -0.9350958 0.9348119 0.9994059 -0.9351724 0.9348119 0.9994059 -0.9352694 0.9348119 0.9994059 -0.9353921 0.9348119 0.9994059 -0.9355473 0.9348119 0.9994059 -0.9357437 0.9348119 0.9994059 -0.9359922 0.9348119 0.9994059 -0.9363065 0.9348119 0.9994059 -0.9367042 0.9348119 0.9994059 -0.9372073 0.9348119 0.9994059 -0.9378438 0.9348119 0.9994059 -0.938649 0.9348119 0.9994059 -0.9396678 0.9348119 0.9994059 -0.9409566 0.9348119 0.9994059 -0.9425872 0.9348119 0.9994059 -0.94465 0.9348119 0.9994059 -0.9472598 0.9348119 0.9994059 -0.9505616 0.9348119 0.9994059 -0.9547387 0.9348119 0.9994059 -0.9600233 0.9348119 0.9994059 -0.9667089 0.9348119 0.9994059 -0.9751672 0.9348119 0.9994059 -0.985868 0.9348119 0.9994059 -0.9994059 0.9348119 0.9994059 -0.999531 0.9478733 0.9887045 -0.9996296 0.9584146 0.9841643 -0.9997074 0.9668865 0.9830944 -0.9997689 0.9736721 0.9838586 -0.9998174 0.9790924 0.9854867 -0.9998557 0.9834127 0.9874227 -0.999886 0.9868504 0.9893632 -0.9999099 0.9895819 0.9911556 -0.9999288 0.99175 0.992735 -0.9999437 0.9934695 0.9940858 -0.9348153 0.9348207 0.999406 -0.9348149 0.93482 0.999406 -0.9348146 0.9348192 0.999406 -0.9348141 0.9348182 0.999406 -0.9348135 0.9348169 0.999406 -0.9348128 0.9348153 0.9994059 -0.9348119 0.9348133 0.9994059 -0.9348109 0.9348109 0.9994059 -0.9348127 0.9348109 0.9994059 -0.9348149 0.9348109 0.9994059 -0.9348178 0.9348109 0.9994059 -0.9348214 0.9348109 0.9994059 -0.9348259 0.9348109 0.9994059 -0.9348317 0.9348109 0.9994059 -0.934839 0.9348109 0.9994059 -0.9348482 0.9348109 0.9994059 -0.9348599 0.9348109 0.9994059 -0.9348747 0.9348109 0.9994059 -0.9348934 0.9348109 0.9994059 -0.934917 0.9348109 0.9994059 -0.934947 0.9348109 0.9994059 -0.9349848 0.9348109 0.9994059 -0.9350327 0.9348109 0.9994059 -0.9350933 0.9348109 0.9994059 -0.93517 0.9348109 0.9994059 -0.935267 0.9348109 0.9994059 -0.9353897 0.9348109 0.9994059 -0.9355449 0.9348109 0.9994059 -0.9357413 0.9348109 0.9994059 -0.9359898 0.9348109 0.9994059 -0.9363041 0.9348109 0.9994059 -0.9367018 0.9348109 0.9994059 -0.9372049 0.9348109 0.9994059 -0.9378415 0.9348109 0.9994059 -0.9386467 0.9348109 0.9994059 -0.9396655 0.9348109 0.9994059 -0.9409544 0.9348109 0.9994059 -0.942585 0.9348109 0.9994059 -0.944648 0.9348109 0.9994059 -0.9472579 0.9348109 0.9994059 -0.9505597 0.9348109 0.9994059 -0.954737 0.9348109 0.9994059 -0.9600218 0.9348109 0.9994059 -0.9667077 0.9348109 0.9994059 -0.9751663 0.9348109 0.9994059 -0.9858675 0.9348109 0.9994059 -0.9994059 0.9348109 0.9994059 -0.999531 0.9478726 0.9887042 -0.9996296 0.9584142 0.9841639 -0.9997074 0.9668862 0.9830941 -0.9997689 0.9736719 0.9838583 -0.9998174 0.9790923 0.9854865 -0.9998557 0.9834127 0.9874226 -0.999886 0.9868503 0.9893631 -0.9999099 0.9895819 0.9911555 -0.9999288 0.99175 0.992735 -0.9999437 0.9934694 0.9940858 -0.9348153 0.9348225 0.999406 -0.9348149 0.9348218 0.999406 -0.9348146 0.934821 0.999406 -0.9348141 0.93482 0.999406 -0.9348135 0.9348187 0.999406 -0.9348128 0.9348171 0.9994059 -0.9348119 0.9348151 0.9994059 -0.9348109 0.9348127 0.9994059 -0.9348097 0.9348097 0.9994059 -0.9348119 0.9348097 0.9994059 -0.9348148 0.9348097 0.9994059 -0.9348184 0.9348097 0.9994059 -0.934823 0.9348097 0.9994059 -0.9348287 0.9348097 0.9994059 -0.934836 0.9348097 0.9994059 -0.9348453 0.9348097 0.9994059 -0.9348569 0.9348097 0.9994059 -0.9348717 0.9348097 0.9994059 -0.9348904 0.9348097 0.9994059 -0.9349141 0.9348097 0.9994059 -0.934944 0.9348097 0.9994059 -0.9349819 0.9348097 0.9994059 -0.9350298 0.9348097 0.9994059 -0.9350904 0.9348097 0.9994059 -0.935167 0.9348097 0.9994059 -0.935264 0.9348097 0.9994059 -0.9353867 0.9348097 0.9994059 -0.935542 0.9348097 0.9994059 -0.9357384 0.9348097 0.9994059 -0.9359869 0.9348097 0.9994059 -0.9363012 0.9348097 0.9994059 -0.9366989 0.9348097 0.9994059 -0.9372021 0.9348097 0.9994059 -0.9378386 0.9348097 0.9994059 -0.9386439 0.9348097 0.9994059 -0.9396628 0.9348097 0.9994059 -0.9409517 0.9348097 0.9994059 -0.9425824 0.9348097 0.9994059 -0.9446454 0.9348097 0.9994059 -0.9472555 0.9348097 0.9994059 -0.9505575 0.9348097 0.9994059 -0.9547349 0.9348097 0.9994059 -0.9600199 0.9348097 0.9994059 -0.9667062 0.9348097 0.9994059 -0.9751652 0.9348097 0.9994059 -0.9858669 0.9348097 0.9994059 -0.9994059 0.9348097 0.9994059 -0.999531 0.9478718 0.9887038 -0.9996296 0.9584137 0.9841634 -0.9997074 0.9668859 0.9830937 -0.9997689 0.9736717 0.983858 -0.9998174 0.9790921 0.9854863 -0.9998557 0.9834126 0.9874224 -0.999886 0.9868503 0.989363 -0.9999099 0.9895819 0.9911554 -0.9999288 0.99175 0.992735 -0.9999437 0.9934694 0.9940857 -0.9348153 0.9348247 0.999406 -0.9348149 0.9348241 0.999406 -0.9348146 0.9348232 0.999406 -0.9348141 0.9348222 0.999406 -0.9348135 0.9348209 0.999406 -0.9348128 0.9348193 0.9994059 -0.9348119 0.9348174 0.9994059 -0.9348109 0.9348149 0.9994059 -0.9348097 0.9348119 0.9994059 -0.9348083 0.9348083 0.9994059 -0.9348112 0.9348083 0.9994059 -0.9348148 0.9348083 0.9994059 -0.9348194 0.9348083 0.9994059 -0.9348251 0.9348083 0.9994059 -0.9348324 0.9348083 0.9994059 -0.9348417 0.9348083 0.9994059 -0.9348533 0.9348083 0.9994059 -0.9348681 0.9348083 0.9994059 -0.9348868 0.9348083 0.9994059 -0.9349105 0.9348083 0.9994059 -0.9349404 0.9348083 0.9994059 -0.9349783 0.9348083 0.9994059 -0.9350262 0.9348083 0.9994059 -0.9350868 0.9348083 0.9994059 -0.9351634 0.9348083 0.9994059 -0.9352604 0.9348083 0.9994059 -0.9353832 0.9348083 0.9994059 -0.9355384 0.9348083 0.9994059 -0.9357348 0.9348083 0.9994059 -0.9359833 0.9348083 0.9994059 -0.9362977 0.9348083 0.9994059 -0.9366954 0.9348083 0.9994059 -0.9371986 0.9348083 0.9994059 -0.9378352 0.9348083 0.9994059 -0.9386406 0.9348083 0.9994059 -0.9396594 0.9348083 0.9994059 -0.9409485 0.9348083 0.9994059 -0.9425792 0.9348083 0.9994059 -0.9446424 0.9348083 0.9994059 -0.9472525 0.9348083 0.9994059 -0.9505547 0.9348083 0.9994059 -0.9547324 0.9348083 0.9994059 -0.9600177 0.9348083 0.9994059 -0.9667044 0.9348083 0.9994059 -0.9751638 0.9348083 0.9994059 -0.9858661 0.9348083 0.9994059 -0.9994059 0.9348083 0.9994059 -0.9995309 0.947871 0.9887033 -0.9996296 0.9584132 0.9841629 -0.9997074 0.9668855 0.9830932 -0.9997689 0.9736715 0.9838577 -0.9998174 0.979092 0.9854861 -0.9998557 0.9834125 0.9874223 -0.999886 0.9868502 0.9893629 -0.9999099 0.9895818 0.9911554 -0.9999288 0.99175 0.9927349 -0.9999437 0.9934694 0.9940857 -0.9348153 0.9348276 0.999406 -0.9348149 0.9348269 0.999406 -0.9348146 0.9348261 0.999406 -0.9348141 0.9348251 0.999406 -0.9348135 0.9348238 0.999406 -0.9348128 0.9348222 0.9994059 -0.9348119 0.9348202 0.9994059 -0.9348109 0.9348178 0.9994059 -0.9348097 0.9348148 0.9994059 -0.9348083 0.9348112 0.9994059 -0.9348069 0.9348069 0.9994059 -0.9348105 0.9348069 0.9994059 -0.9348151 0.9348069 0.9994059 -0.9348208 0.9348069 0.9994059 -0.9348281 0.9348069 0.9994059 -0.9348374 0.9348069 0.9994059 -0.9348491 0.9348069 0.9994059 -0.9348638 0.9348069 0.9994059 -0.9348825 0.9348069 0.9994059 -0.9349062 0.9348069 0.9994059 -0.9349361 0.9348069 0.9994059 -0.934974 0.9348069 0.9994059 -0.9350219 0.9348069 0.9994059 -0.9350825 0.9348069 0.9994059 -0.9351592 0.9348069 0.9994059 -0.9352562 0.9348069 0.9994059 -0.9353789 0.9348069 0.9994059 -0.9355342 0.9348069 0.9994059 -0.9357306 0.9348069 0.9994059 -0.9359791 0.9348069 0.9994059 -0.9362935 0.9348069 0.9994059 -0.9366913 0.9348069 0.9994059 -0.9371945 0.9348069 0.9994059 -0.9378311 0.9348069 0.9994059 -0.9386365 0.9348069 0.9994059 -0.9396555 0.9348069 0.9994059 -0.9409446 0.9348069 0.9994059 -0.9425755 0.9348069 0.9994059 -0.9446388 0.9348069 0.9994059 -0.9472491 0.9348069 0.9994059 -0.9505515 0.9348069 0.9994059 -0.9547294 0.9348069 0.9994059 -0.9600151 0.9348069 0.9994059 -0.9667022 0.9348069 0.9994059 -0.9751622 0.9348069 0.9994059 -0.9858652 0.9348069 0.9994059 -0.9994059 0.9348069 0.9994059 -0.9995309 0.94787 0.9887027 -0.9996296 0.9584126 0.9841622 -0.9997074 0.9668852 0.9830927 -0.9997689 0.9736712 0.9838573 -0.9998174 0.9790919 0.9854858 -0.9998557 0.9834124 0.9874221 -0.999886 0.9868502 0.9893627 -0.9999099 0.9895818 0.9911553 -0.9999288 0.99175 0.9927349 -0.9999437 0.9934694 0.9940857 -0.9348153 0.9348312 0.999406 -0.9348149 0.9348305 0.999406 -0.9348146 0.9348297 0.999406 -0.9348141 0.9348287 0.999406 -0.9348135 0.9348274 0.999406 -0.9348128 0.9348258 0.9994059 -0.9348119 0.9348238 0.9994059 -0.9348109 0.9348214 0.9994059 -0.9348097 0.9348184 0.9994059 -0.9348083 0.9348148 0.9994059 -0.9348069 0.9348105 0.9994059 -0.9348055 0.9348055 0.9994059 -0.9348101 0.9348055 0.9994059 -0.9348158 0.9348055 0.9994059 -0.9348231 0.9348055 0.9994059 -0.9348324 0.9348055 0.9994059 -0.9348441 0.9348055 0.9994059 -0.9348588 0.9348055 0.9994059 -0.9348775 0.9348055 0.9994059 -0.9349012 0.9348055 0.9994059 -0.9349311 0.9348055 0.9994059 -0.934969 0.9348055 0.9994059 -0.9350169 0.9348055 0.9994059 -0.9350775 0.9348055 0.9994059 -0.9351542 0.9348055 0.9994059 -0.9352512 0.9348055 0.9994059 -0.935374 0.9348055 0.9994059 -0.9355292 0.9348055 0.9994059 -0.9357257 0.9348055 0.9994059 -0.9359742 0.9348055 0.9994059 -0.9362886 0.9348055 0.9994059 -0.9366864 0.9348055 0.9994059 -0.9371897 0.9348055 0.9994059 -0.9378263 0.9348055 0.9994059 -0.9386318 0.9348055 0.9994059 -0.9396508 0.9348055 0.9994059 -0.9409401 0.9348055 0.9994059 -0.9425711 0.9348055 0.9994059 -0.9446345 0.9348055 0.9994059 -0.947245 0.9348055 0.9994059 -0.9505477 0.9348055 0.9994059 -0.954726 0.9348055 0.9994059 -0.9600121 0.9348055 0.9994059 -0.9666996 0.9348055 0.9994059 -0.9751603 0.9348055 0.9994059 -0.9858641 0.9348055 0.9994059 -0.9994059 0.9348055 0.9994059 -0.9995309 0.9478691 0.988702 -0.9996296 0.958412 0.9841615 -0.9997074 0.9668848 0.983092 -0.9997689 0.973671 0.9838568 -0.9998174 0.9790917 0.9854854 -0.9998557 0.9834123 0.9874218 -0.999886 0.9868501 0.9893626 -0.9999099 0.9895818 0.9911552 -0.9999288 0.9917499 0.9927348 -0.9999437 0.9934694 0.9940856 -0.9348153 0.9348357 0.999406 -0.9348149 0.9348351 0.999406 -0.9348146 0.9348342 0.999406 -0.9348141 0.9348332 0.999406 -0.9348135 0.9348319 0.999406 -0.9348128 0.9348303 0.9994059 -0.9348119 0.9348284 0.9994059 -0.9348109 0.9348259 0.9994059 -0.9348097 0.934823 0.9994059 -0.9348083 0.9348194 0.9994059 -0.9348069 0.9348151 0.9994059 -0.9348055 0.9348101 0.9994059 -0.9348044 0.9348044 0.9994058 -0.9348102 0.9348044 0.9994058 -0.9348175 0.9348044 0.9994058 -0.9348267 0.9348044 0.9994058 -0.9348384 0.9348044 0.9994058 -0.9348532 0.9348044 0.9994058 -0.9348719 0.9348044 0.9994058 -0.9348956 0.9348044 0.9994058 -0.9349255 0.9348044 0.9994058 -0.9349634 0.9348044 0.9994058 -0.9350113 0.9348044 0.9994058 -0.9350719 0.9348044 0.9994058 -0.9351486 0.9348044 0.9994058 -0.9352456 0.9348044 0.9994058 -0.9353684 0.9348044 0.9994058 -0.9355237 0.9348044 0.9994058 -0.9357201 0.9348044 0.9994058 -0.9359687 0.9348044 0.9994058 -0.9362831 0.9348044 0.9994058 -0.9366809 0.9348044 0.9994058 -0.9371842 0.9348044 0.9994058 -0.937821 0.9348044 0.9994058 -0.9386265 0.9348044 0.9994058 -0.9396456 0.9348044 0.9994058 -0.9409349 0.9348044 0.9994058 -0.9425661 0.9348044 0.9994058 -0.9446297 0.9348044 0.9994058 -0.9472405 0.9348044 0.9994058 -0.9505434 0.9348044 0.9994058 -0.9547221 0.9348044 0.9994058 -0.9600086 0.9348044 0.9994058 -0.9666968 0.9348044 0.9994058 -0.9751582 0.9348044 0.9994058 -0.9858629 0.9348044 0.9994058 -0.9994058 0.9348044 0.9994058 -0.9995309 0.9478684 0.9887012 -0.9996296 0.9584115 0.9841606 -0.9997074 0.9668845 0.9830913 -0.9997689 0.9736708 0.9838562 -0.9998174 0.9790916 0.985485 -0.9998557 0.9834122 0.9874216 -0.999886 0.9868501 0.9893624 -0.9999099 0.9895817 0.991155 -0.9999288 0.9917499 0.9927347 -0.9999437 0.9934694 0.9940856 -0.9348153 0.9348415 0.999406 -0.9348149 0.9348408 0.999406 -0.9348146 0.93484 0.999406 -0.9348141 0.934839 0.999406 -0.9348135 0.9348377 0.999406 -0.9348128 0.9348361 0.9994059 -0.9348119 0.9348341 0.9994059 -0.9348109 0.9348317 0.9994059 -0.9348097 0.9348287 0.9994059 -0.9348083 0.9348251 0.9994059 -0.9348069 0.9348208 0.9994059 -0.9348055 0.9348158 0.9994059 -0.9348044 0.9348102 0.9994058 -0.9348042 0.9348042 0.9994058 -0.9348115 0.9348042 0.9994058 -0.9348207 0.9348042 0.9994058 -0.9348324 0.9348042 0.9994058 -0.9348472 0.9348042 0.9994058 -0.9348659 0.9348042 0.9994058 -0.9348895 0.9348042 0.9994058 -0.9349195 0.9348042 0.9994058 -0.9349574 0.9348042 0.9994058 -0.9350053 0.9348042 0.9994058 -0.9350659 0.9348042 0.9994058 -0.9351426 0.9348042 0.9994058 -0.9352396 0.9348042 0.9994058 -0.9353624 0.9348042 0.9994058 -0.9355177 0.9348042 0.9994058 -0.9357142 0.9348042 0.9994058 -0.9359628 0.9348042 0.9994058 -0.9362772 0.9348042 0.9994058 -0.9366751 0.9348042 0.9994058 -0.9371784 0.9348042 0.9994058 -0.9378152 0.9348042 0.9994058 -0.9386208 0.9348042 0.9994058 -0.93964 0.9348042 0.9994058 -0.9409295 0.9348042 0.9994058 -0.9425608 0.9348042 0.9994058 -0.9446246 0.9348042 0.9994058 -0.9472356 0.9348042 0.9994058 -0.9505389 0.9348042 0.9994058 -0.9547179 0.9348042 0.9994058 -0.9600049 0.9348042 0.9994058 -0.9666937 0.9348042 0.9994058 -0.9751559 0.9348042 0.9994058 -0.9858616 0.9348042 0.9994058 -0.9994058 0.9348042 0.9994058 -0.9995309 0.9478683 0.9887004 -0.9996295 0.9584114 0.9841597 -0.9997074 0.9668844 0.9830905 -0.9997689 0.9736708 0.9838556 -0.9998174 0.9790916 0.9854846 -0.9998557 0.9834122 0.9874213 -0.999886 0.98685 0.9893622 -0.9999099 0.9895817 0.9911549 -0.9999288 0.9917499 0.9927346 -0.9999437 0.9934694 0.9940855 -0.9348153 0.9348488 0.999406 -0.9348149 0.9348481 0.999406 -0.9348146 0.9348473 0.999406 -0.9348141 0.9348463 0.999406 -0.9348135 0.934845 0.999406 -0.9348128 0.9348434 0.9994059 -0.9348119 0.9348414 0.9994059 -0.9348109 0.934839 0.9994059 -0.9348097 0.934836 0.9994059 -0.9348083 0.9348324 0.9994059 -0.9348069 0.9348281 0.9994059 -0.9348055 0.9348231 0.9994059 -0.9348044 0.9348175 0.9994058 -0.9348042 0.9348115 0.9994058 -0.9348056 0.9348056 0.9994058 -0.9348148 0.9348056 0.9994058 -0.9348265 0.9348056 0.9994058 -0.9348413 0.9348056 0.9994058 -0.93486 0.9348056 0.9994058 -0.9348837 0.9348056 0.9994058 -0.9349136 0.9348056 0.9994058 -0.9349515 0.9348056 0.9994058 -0.9349994 0.9348056 0.9994058 -0.9350601 0.9348056 0.9994058 -0.9351368 0.9348056 0.9994058 -0.9352338 0.9348056 0.9994058 -0.9353566 0.9348056 0.9994058 -0.9355119 0.9348056 0.9994058 -0.9357084 0.9348056 0.9994058 -0.935957 0.9348056 0.9994058 -0.9362715 0.9348056 0.9994058 -0.9366694 0.9348056 0.9994058 -0.9371728 0.9348056 0.9994058 -0.9378096 0.9348056 0.9994058 -0.9386153 0.9348056 0.9994058 -0.9396346 0.9348056 0.9994058 -0.9409242 0.9348056 0.9994058 -0.9425556 0.9348056 0.9994058 -0.9446196 0.9348056 0.9994058 -0.9472309 0.9348056 0.9994058 -0.9505344 0.9348056 0.9994058 -0.9547138 0.9348056 0.9994058 -0.9600013 0.9348056 0.9994058 -0.9666907 0.9348056 0.9994058 -0.9751537 0.9348056 0.9994058 -0.9858604 0.9348056 0.9994058 -0.9994058 0.9348056 0.9994058 -0.9995309 0.9478691 0.9886996 -0.9996295 0.958412 0.9841588 -0.9997074 0.9668847 0.9830898 -0.9997688 0.973671 0.9838551 -0.9998174 0.9790917 0.9854842 -0.9998557 0.9834123 0.987421 -0.999886 0.9868501 0.989362 -0.9999099 0.9895817 0.9911548 -0.9999288 0.9917499 0.9927346 -0.9999437 0.9934694 0.9940855 -0.9348153 0.934858 0.999406 -0.9348149 0.9348574 0.999406 -0.9348146 0.9348565 0.999406 -0.9348141 0.9348555 0.999406 -0.9348135 0.9348542 0.999406 -0.9348128 0.9348526 0.9994059 -0.9348119 0.9348507 0.9994059 -0.9348109 0.9348482 0.9994059 -0.9348097 0.9348453 0.9994059 -0.9348083 0.9348417 0.9994059 -0.9348069 0.9348374 0.9994059 -0.9348055 0.9348324 0.9994059 -0.9348044 0.9348267 0.9994058 -0.9348042 0.9348207 0.9994058 -0.9348056 0.9348148 0.9994058 -0.9348102 0.9348102 0.9994057 -0.9348219 0.9348102 0.9994057 -0.9348367 0.9348102 0.9994057 -0.9348554 0.9348102 0.9994057 -0.9348791 0.9348102 0.9994057 -0.934909 0.9348102 0.9994057 -0.9349469 0.9348102 0.9994057 -0.9349948 0.9348102 0.9994057 -0.9350555 0.9348102 0.9994057 -0.9351322 0.9348102 0.9994057 -0.9352292 0.9348102 0.9994057 -0.935352 0.9348102 0.9994057 -0.9355073 0.9348102 0.9994057 -0.9357038 0.9348102 0.9994057 -0.9359524 0.9348102 0.9994057 -0.936267 0.9348102 0.9994057 -0.9366649 0.9348102 0.9994057 -0.9371683 0.9348102 0.9994057 -0.9378052 0.9348102 0.9994057 -0.938611 0.9348102 0.9994057 -0.9396303 0.9348102 0.9994057 -0.94092 0.9348102 0.9994057 -0.9425516 0.9348102 0.9994057 -0.9446157 0.9348102 0.9994057 -0.9472271 0.9348102 0.9994057 -0.9505309 0.9348102 0.9994057 -0.9547106 0.9348102 0.9994057 -0.9599985 0.9348102 0.9994057 -0.9666884 0.9348102 0.9994057 -0.9751519 0.9348102 0.9994057 -0.9858594 0.9348102 0.9994057 -0.9994057 0.9348102 0.9994057 -0.9995309 0.947872 0.988699 -0.9996295 0.9584138 0.9841581 -0.9997074 0.9668859 0.9830892 -0.9997688 0.9736717 0.9838546 -0.9998174 0.9790921 0.9854839 -0.9998557 0.9834126 0.9874208 -0.999886 0.9868503 0.9893619 -0.9999099 0.9895819 0.9911547 -0.9999288 0.99175 0.9927345 -0.9999437 0.9934694 0.9940854 -0.9348153 0.9348697 0.999406 -0.9348149 0.934869 0.999406 -0.9348146 0.9348682 0.999406 -0.9348141 0.9348672 0.999406 -0.9348135 0.9348659 0.999406 -0.9348128 0.9348643 0.9994059 -0.9348119 0.9348623 0.9994059 -0.9348109 0.9348599 0.9994059 -0.9348097 0.9348569 0.9994059 -0.9348083 0.9348533 0.9994059 -0.9348069 0.9348491 0.9994059 -0.9348055 0.9348441 0.9994059 -0.9348044 0.9348384 0.9994058 -0.9348042 0.9348324 0.9994058 -0.9348056 0.9348265 0.9994058 -0.9348102 0.9348219 0.9994057 -0.9348204 0.9348204 0.9994057 -0.9348352 0.9348204 0.9994057 -0.9348539 0.9348204 0.9994057 -0.9348776 0.9348204 0.9994057 -0.9349075 0.9348204 0.9994057 -0.9349454 0.9348204 0.9994057 -0.9349933 0.9348204 0.9994057 -0.935054 0.9348204 0.9994057 -0.9351307 0.9348204 0.9994057 -0.9352277 0.9348204 0.9994057 -0.9353505 0.9348204 0.9994057 -0.9355059 0.9348204 0.9994057 -0.9357024 0.9348204 0.9994057 -0.935951 0.9348204 0.9994057 -0.9362655 0.9348204 0.9994057 -0.9366635 0.9348204 0.9994057 -0.9371669 0.9348204 0.9994057 -0.9378038 0.9348204 0.9994057 -0.9386096 0.9348204 0.9994057 -0.939629 0.9348204 0.9994057 -0.9409186 0.9348204 0.9994057 -0.9425502 0.9348204 0.9994057 -0.9446144 0.9348204 0.9994057 -0.9472259 0.9348204 0.9994057 -0.9505298 0.9348204 0.9994057 -0.9547096 0.9348204 0.9994057 -0.9599976 0.9348204 0.9994057 -0.9666876 0.9348204 0.9994057 -0.9751513 0.9348204 0.9994057 -0.9858591 0.9348204 0.9994057 -0.9994057 0.9348204 0.9994057 -0.9995308 0.9478785 0.9886988 -0.9996295 0.9584178 0.9841579 -0.9997074 0.9668884 0.983089 -0.9997688 0.9736733 0.9838545 -0.9998174 0.9790931 0.9854838 -0.9998557 0.9834132 0.9874207 -0.999886 0.9868507 0.9893618 -0.9999099 0.9895821 0.9911547 -0.9999288 0.9917502 0.9927345 -0.9999437 0.9934695 0.9940854 -0.9348153 0.9348845 0.999406 -0.9348149 0.9348838 0.999406 -0.9348146 0.934883 0.999406 -0.9348141 0.934882 0.999406 -0.9348135 0.9348807 0.999406 -0.9348128 0.9348791 0.9994059 -0.9348119 0.9348771 0.9994059 -0.9348109 0.9348747 0.9994059 -0.9348097 0.9348717 0.9994059 -0.9348083 0.9348681 0.9994059 -0.9348069 0.9348638 0.9994059 -0.9348055 0.9348588 0.9994059 -0.9348044 0.9348532 0.9994058 -0.9348042 0.9348472 0.9994058 -0.9348056 0.9348413 0.9994058 -0.9348102 0.9348367 0.9994057 -0.9348204 0.9348352 0.9994057 -0.9348352 0.9348352 0.9994057 -0.9348539 0.9348352 0.9994057 -0.9348776 0.9348352 0.9994057 -0.9349075 0.9348352 0.9994057 -0.9349454 0.9348352 0.9994057 -0.9349933 0.9348352 0.9994057 -0.935054 0.9348352 0.9994057 -0.9351307 0.9348352 0.9994057 -0.9352277 0.9348352 0.9994057 -0.9353505 0.9348352 0.9994057 -0.9355059 0.9348352 0.9994057 -0.9357024 0.9348352 0.9994057 -0.935951 0.9348352 0.9994057 -0.9362655 0.9348352 0.9994057 -0.9366635 0.9348352 0.9994057 -0.9371669 0.9348352 0.9994057 -0.9378038 0.9348352 0.9994057 -0.9386096 0.9348352 0.9994057 -0.939629 0.9348352 0.9994057 -0.9409186 0.9348352 0.9994057 -0.9425502 0.9348352 0.9994057 -0.9446144 0.9348352 0.9994057 -0.9472259 0.9348352 0.9994057 -0.9505298 0.9348352 0.9994057 -0.9547096 0.9348352 0.9994057 -0.9599976 0.9348352 0.9994057 -0.9666876 0.9348352 0.9994057 -0.9751513 0.9348352 0.9994057 -0.9858591 0.9348352 0.9994057 -0.9994057 0.9348352 0.9994057 -0.9995308 0.9478878 0.9886988 -0.9996295 0.9584237 0.9841579 -0.9997074 0.9668922 0.983089 -0.9997688 0.9736756 0.9838545 -0.9998174 0.9790946 0.9854838 -0.9998557 0.9834141 0.9874207 -0.999886 0.9868512 0.9893618 -0.9999099 0.9895825 0.9911547 -0.9999288 0.9917504 0.9927345 -0.9999437 0.9934697 0.9940854 -0.9348153 0.9349032 0.999406 -0.9348149 0.9349025 0.999406 -0.9348146 0.9349017 0.999406 -0.9348141 0.9349007 0.999406 -0.9348135 0.9348994 0.999406 -0.9348128 0.9348978 0.9994059 -0.9348119 0.9348958 0.9994059 -0.9348109 0.9348934 0.9994059 -0.9348097 0.9348904 0.9994059 -0.9348083 0.9348868 0.9994059 -0.9348069 0.9348825 0.9994059 -0.9348055 0.9348775 0.9994059 -0.9348044 0.9348719 0.9994058 -0.9348042 0.9348659 0.9994058 -0.9348056 0.93486 0.9994058 -0.9348102 0.9348554 0.9994057 -0.9348204 0.9348539 0.9994057 -0.9348352 0.9348539 0.9994057 -0.9348539 0.9348539 0.9994057 -0.9348776 0.9348539 0.9994057 -0.9349075 0.9348539 0.9994057 -0.9349454 0.9348539 0.9994057 -0.9349933 0.9348539 0.9994057 -0.935054 0.9348539 0.9994057 -0.9351307 0.9348539 0.9994057 -0.9352277 0.9348539 0.9994057 -0.9353505 0.9348539 0.9994057 -0.9355059 0.9348539 0.9994057 -0.9357024 0.9348539 0.9994057 -0.935951 0.9348539 0.9994057 -0.9362655 0.9348539 0.9994057 -0.9366635 0.9348539 0.9994057 -0.9371669 0.9348539 0.9994057 -0.9378038 0.9348539 0.9994057 -0.9386096 0.9348539 0.9994057 -0.939629 0.9348539 0.9994057 -0.9409186 0.9348539 0.9994057 -0.9425502 0.9348539 0.9994057 -0.9446144 0.9348539 0.9994057 -0.9472259 0.9348539 0.9994057 -0.9505298 0.9348539 0.9994057 -0.9547096 0.9348539 0.9994057 -0.9599976 0.9348539 0.9994057 -0.9666876 0.9348539 0.9994057 -0.9751513 0.9348539 0.9994057 -0.9858591 0.9348539 0.9994057 -0.9994057 0.9348539 0.9994057 -0.9995308 0.9478997 0.9886988 -0.9996295 0.9584312 0.9841579 -0.9997074 0.9668969 0.983089 -0.9997688 0.9736786 0.9838545 -0.9998174 0.9790965 0.9854838 -0.9998557 0.9834153 0.9874207 -0.999886 0.986852 0.9893618 -0.9999099 0.9895829 0.9911547 -0.9999288 0.9917507 0.9927345 -0.9999437 0.9934698 0.9940854 -0.9348153 0.9349268 0.999406 -0.9348149 0.9349262 0.999406 -0.9348146 0.9349253 0.999406 -0.9348141 0.9349243 0.999406 -0.9348135 0.934923 0.999406 -0.9348128 0.9349215 0.9994059 -0.9348119 0.9349195 0.9994059 -0.9348109 0.934917 0.9994059 -0.9348097 0.9349141 0.9994059 -0.9348083 0.9349105 0.9994059 -0.9348069 0.9349062 0.9994059 -0.9348055 0.9349012 0.9994059 -0.9348044 0.9348956 0.9994058 -0.9348042 0.9348895 0.9994058 -0.9348056 0.9348837 0.9994058 -0.9348102 0.9348791 0.9994057 -0.9348204 0.9348776 0.9994057 -0.9348352 0.9348776 0.9994057 -0.9348539 0.9348776 0.9994057 -0.9348776 0.9348776 0.9994057 -0.9349075 0.9348776 0.9994057 -0.9349454 0.9348776 0.9994057 -0.9349933 0.9348776 0.9994057 -0.935054 0.9348776 0.9994057 -0.9351307 0.9348776 0.9994057 -0.9352277 0.9348776 0.9994057 -0.9353505 0.9348776 0.9994057 -0.9355059 0.9348776 0.9994057 -0.9357024 0.9348776 0.9994057 -0.935951 0.9348776 0.9994057 -0.9362655 0.9348776 0.9994057 -0.9366635 0.9348776 0.9994057 -0.9371669 0.9348776 0.9994057 -0.9378038 0.9348776 0.9994057 -0.9386096 0.9348776 0.9994057 -0.939629 0.9348776 0.9994057 -0.9409186 0.9348776 0.9994057 -0.9425502 0.9348776 0.9994057 -0.9446144 0.9348776 0.9994057 -0.9472259 0.9348776 0.9994057 -0.9505298 0.9348776 0.9994057 -0.9547096 0.9348776 0.9994057 -0.9599976 0.9348776 0.9994057 -0.9666876 0.9348776 0.9994057 -0.9751513 0.9348776 0.9994057 -0.9858591 0.9348776 0.9994057 -0.9994057 0.9348776 0.9994057 -0.9995308 0.9479146 0.9886988 -0.9996295 0.9584406 0.9841579 -0.9997074 0.9669028 0.983089 -0.9997688 0.9736823 0.9838545 -0.9998174 0.9790988 0.9854838 -0.9998557 0.9834167 0.9874207 -0.999886 0.9868529 0.9893618 -0.9999099 0.9895835 0.9911547 -0.9999288 0.991751 0.9927345 -0.9999437 0.9934701 0.9940854 -0.9348153 0.9349567 0.999406 -0.9348149 0.9349561 0.999406 -0.9348146 0.9349553 0.999406 -0.9348141 0.9349542 0.999406 -0.9348135 0.934953 0.999406 -0.9348128 0.9349514 0.9994059 -0.9348119 0.9349494 0.9994059 -0.9348109 0.934947 0.9994059 -0.9348097 0.934944 0.9994059 -0.9348083 0.9349404 0.9994059 -0.9348069 0.9349361 0.9994059 -0.9348055 0.9349311 0.9994059 -0.9348044 0.9349255 0.9994058 -0.9348042 0.9349195 0.9994058 -0.9348056 0.9349136 0.9994058 -0.9348102 0.934909 0.9994057 -0.9348204 0.9349075 0.9994057 -0.9348352 0.9349075 0.9994057 -0.9348539 0.9349075 0.9994057 -0.9348776 0.9349075 0.9994057 -0.9349075 0.9349075 0.9994057 -0.9349454 0.9349075 0.9994057 -0.9349933 0.9349075 0.9994057 -0.935054 0.9349075 0.9994057 -0.9351307 0.9349075 0.9994057 -0.9352277 0.9349075 0.9994057 -0.9353505 0.9349075 0.9994057 -0.9355059 0.9349075 0.9994057 -0.9357024 0.9349075 0.9994057 -0.935951 0.9349075 0.9994057 -0.9362655 0.9349075 0.9994057 -0.9366635 0.9349075 0.9994057 -0.9371669 0.9349075 0.9994057 -0.9378038 0.9349075 0.9994057 -0.9386096 0.9349075 0.9994057 -0.939629 0.9349075 0.9994057 -0.9409186 0.9349075 0.9994057 -0.9425502 0.9349075 0.9994057 -0.9446144 0.9349075 0.9994057 -0.9472259 0.9349075 0.9994057 -0.9505298 0.9349075 0.9994057 -0.9547096 0.9349075 0.9994057 -0.9599976 0.9349075 0.9994057 -0.9666876 0.9349075 0.9994057 -0.9751513 0.9349075 0.9994057 -0.9858591 0.9349075 0.9994057 -0.9994057 0.9349075 0.9994057 -0.9995308 0.9479335 0.9886988 -0.9996295 0.9584526 0.9841579 -0.9997074 0.9669103 0.983089 -0.9997688 0.973687 0.9838545 -0.9998174 0.9791018 0.9854838 -0.9998557 0.9834186 0.9874207 -0.999886 0.9868541 0.9893618 -0.9999099 0.9895842 0.9911547 -0.9999288 0.9917515 0.9927345 -0.9999437 0.9934704 0.9940854 -0.9348153 0.9349946 0.999406 -0.9348149 0.9349939 0.999406 -0.9348146 0.9349931 0.999406 -0.9348141 0.9349921 0.999406 -0.9348135 0.9349908 0.999406 -0.9348128 0.9349892 0.9994059 -0.9348119 0.9349873 0.9994059 -0.9348109 0.9349848 0.9994059 -0.9348097 0.9349819 0.9994059 -0.9348083 0.9349783 0.9994059 -0.9348069 0.934974 0.9994059 -0.9348055 0.934969 0.9994059 -0.9348044 0.9349634 0.9994058 -0.9348042 0.9349574 0.9994058 -0.9348056 0.9349515 0.9994058 -0.9348102 0.9349469 0.9994057 -0.9348204 0.9349454 0.9994057 -0.9348352 0.9349454 0.9994057 -0.9348539 0.9349454 0.9994057 -0.9348776 0.9349454 0.9994057 -0.9349075 0.9349454 0.9994057 -0.9349454 0.9349454 0.9994057 -0.9349933 0.9349454 0.9994057 -0.935054 0.9349454 0.9994057 -0.9351307 0.9349454 0.9994057 -0.9352277 0.9349454 0.9994057 -0.9353505 0.9349454 0.9994057 -0.9355059 0.9349454 0.9994057 -0.9357024 0.9349454 0.9994057 -0.935951 0.9349454 0.9994057 -0.9362655 0.9349454 0.9994057 -0.9366635 0.9349454 0.9994057 -0.9371669 0.9349454 0.9994057 -0.9378038 0.9349454 0.9994057 -0.9386096 0.9349454 0.9994057 -0.939629 0.9349454 0.9994057 -0.9409186 0.9349454 0.9994057 -0.9425502 0.9349454 0.9994057 -0.9446144 0.9349454 0.9994057 -0.9472259 0.9349454 0.9994057 -0.9505298 0.9349454 0.9994057 -0.9547096 0.9349454 0.9994057 -0.9599976 0.9349454 0.9994057 -0.9666876 0.9349454 0.9994057 -0.9751513 0.9349454 0.9994057 -0.9858591 0.9349454 0.9994057 -0.9994057 0.9349454 0.9994057 -0.9995308 0.9479575 0.9886988 -0.9996295 0.9584677 0.9841579 -0.9997074 0.9669198 0.983089 -0.9997688 0.973693 0.9838545 -0.9998174 0.9791055 0.9854838 -0.9998557 0.9834209 0.9874207 -0.999886 0.9868555 0.9893618 -0.9999099 0.9895851 0.9911547 -0.9999288 0.9917521 0.9927345 -0.9999437 0.9934707 0.9940854 -0.9348153 0.9350425 0.999406 -0.9348149 0.9350418 0.999406 -0.9348146 0.935041 0.999406 -0.9348141 0.93504 0.999406 -0.9348135 0.9350387 0.999406 -0.9348128 0.9350371 0.9994059 -0.9348119 0.9350352 0.9994059 -0.9348109 0.9350327 0.9994059 -0.9348097 0.9350298 0.9994059 -0.9348083 0.9350262 0.9994059 -0.9348069 0.9350219 0.9994059 -0.9348055 0.9350169 0.9994059 -0.9348044 0.9350113 0.9994058 -0.9348042 0.9350053 0.9994058 -0.9348056 0.9349994 0.9994058 -0.9348102 0.9349948 0.9994057 -0.9348204 0.9349933 0.9994057 -0.9348352 0.9349933 0.9994057 -0.9348539 0.9349933 0.9994057 -0.9348776 0.9349933 0.9994057 -0.9349075 0.9349933 0.9994057 -0.9349454 0.9349933 0.9994057 -0.9349933 0.9349933 0.9994057 -0.935054 0.9349933 0.9994057 -0.9351307 0.9349933 0.9994057 -0.9352277 0.9349933 0.9994057 -0.9353505 0.9349933 0.9994057 -0.9355059 0.9349933 0.9994057 -0.9357024 0.9349933 0.9994057 -0.935951 0.9349933 0.9994057 -0.9362655 0.9349933 0.9994057 -0.9366635 0.9349933 0.9994057 -0.9371669 0.9349933 0.9994057 -0.9378038 0.9349933 0.9994057 -0.9386096 0.9349933 0.9994057 -0.939629 0.9349933 0.9994057 -0.9409186 0.9349933 0.9994057 -0.9425502 0.9349933 0.9994057 -0.9446144 0.9349933 0.9994057 -0.9472259 0.9349933 0.9994057 -0.9505298 0.9349933 0.9994057 -0.9547096 0.9349933 0.9994057 -0.9599976 0.9349933 0.9994057 -0.9666876 0.9349933 0.9994057 -0.9751513 0.9349933 0.9994057 -0.9858591 0.9349933 0.9994057 -0.9994057 0.9349933 0.9994057 -0.9995308 0.9479878 0.9886988 -0.9996295 0.9584868 0.9841579 -0.9997074 0.9669318 0.983089 -0.9997688 0.9737006 0.9838545 -0.9998174 0.9791103 0.9854838 -0.9998557 0.9834239 0.9874207 -0.999886 0.9868574 0.9893618 -0.9999099 0.9895863 0.9911547 -0.9999288 0.9917528 0.9927345 -0.9999437 0.9934712 0.9940854 -0.9348153 0.9351031 0.999406 -0.9348149 0.9351024 0.999406 -0.9348146 0.9351016 0.999406 -0.9348141 0.9351006 0.999406 -0.9348135 0.9350993 0.999406 -0.9348128 0.9350977 0.9994059 -0.9348119 0.9350958 0.9994059 -0.9348109 0.9350933 0.9994059 -0.9348097 0.9350904 0.9994059 -0.9348083 0.9350868 0.9994059 -0.9348069 0.9350825 0.9994059 -0.9348055 0.9350775 0.9994059 -0.9348044 0.9350719 0.9994058 -0.9348042 0.9350659 0.9994058 -0.9348056 0.9350601 0.9994058 -0.9348102 0.9350555 0.9994057 -0.9348204 0.935054 0.9994057 -0.9348352 0.935054 0.9994057 -0.9348539 0.935054 0.9994057 -0.9348776 0.935054 0.9994057 -0.9349075 0.935054 0.9994057 -0.9349454 0.935054 0.9994057 -0.9349933 0.935054 0.9994057 -0.935054 0.935054 0.9994057 -0.9351307 0.935054 0.9994057 -0.9352277 0.935054 0.9994057 -0.9353505 0.935054 0.9994057 -0.9355059 0.935054 0.9994057 -0.9357024 0.935054 0.9994057 -0.935951 0.935054 0.9994057 -0.9362655 0.935054 0.9994057 -0.9366635 0.935054 0.9994057 -0.9371669 0.935054 0.9994057 -0.9378038 0.935054 0.9994057 -0.9386096 0.935054 0.9994057 -0.939629 0.935054 0.9994057 -0.9409186 0.935054 0.9994057 -0.9425502 0.935054 0.9994057 -0.9446144 0.935054 0.9994057 -0.9472259 0.935054 0.9994057 -0.9505298 0.935054 0.9994057 -0.9547096 0.935054 0.9994057 -0.9599976 0.935054 0.9994057 -0.9666876 0.935054 0.9994057 -0.9751513 0.935054 0.9994057 -0.9858591 0.935054 0.9994057 -0.9994057 0.935054 0.9994057 -0.9995308 0.9480261 0.9886988 -0.9996295 0.9585109 0.9841579 -0.9997074 0.966947 0.983089 -0.9997688 0.9737101 0.9838545 -0.9998174 0.9791163 0.9854838 -0.9998557 0.9834277 0.9874207 -0.999886 0.9868597 0.9893618 -0.9999099 0.9895878 0.9911547 -0.9999288 0.9917537 0.9927345 -0.9999437 0.9934718 0.9940854 -0.9348153 0.9351797 0.999406 -0.9348149 0.9351791 0.999406 -0.9348146 0.9351783 0.999406 -0.9348141 0.9351772 0.999406 -0.9348135 0.935176 0.999406 -0.9348128 0.9351744 0.9994059 -0.9348119 0.9351724 0.9994059 -0.9348109 0.93517 0.9994059 -0.9348097 0.935167 0.9994059 -0.9348083 0.9351634 0.9994059 -0.9348069 0.9351592 0.9994059 -0.9348055 0.9351542 0.9994059 -0.9348044 0.9351486 0.9994058 -0.9348042 0.9351426 0.9994058 -0.9348056 0.9351368 0.9994058 -0.9348102 0.9351322 0.9994057 -0.9348204 0.9351307 0.9994057 -0.9348352 0.9351307 0.9994057 -0.9348539 0.9351307 0.9994057 -0.9348776 0.9351307 0.9994057 -0.9349075 0.9351307 0.9994057 -0.9349454 0.9351307 0.9994057 -0.9349933 0.9351307 0.9994057 -0.935054 0.9351307 0.9994057 -0.9351307 0.9351307 0.9994057 -0.9352277 0.9351307 0.9994057 -0.9353505 0.9351307 0.9994057 -0.9355059 0.9351307 0.9994057 -0.9357024 0.9351307 0.9994057 -0.935951 0.9351307 0.9994057 -0.9362655 0.9351307 0.9994057 -0.9366635 0.9351307 0.9994057 -0.9371669 0.9351307 0.9994057 -0.9378038 0.9351307 0.9994057 -0.9386096 0.9351307 0.9994057 -0.939629 0.9351307 0.9994057 -0.9409186 0.9351307 0.9994057 -0.9425502 0.9351307 0.9994057 -0.9446144 0.9351307 0.9994057 -0.9472259 0.9351307 0.9994057 -0.9505298 0.9351307 0.9994057 -0.9547096 0.9351307 0.9994057 -0.9599976 0.9351307 0.9994057 -0.9666876 0.9351307 0.9994057 -0.9751513 0.9351307 0.9994057 -0.9858591 0.9351307 0.9994057 -0.9994057 0.9351307 0.9994057 -0.9995308 0.9480746 0.9886988 -0.9996295 0.9585415 0.9841579 -0.9997074 0.9669663 0.983089 -0.9997688 0.9737222 0.9838545 -0.9998174 0.9791238 0.9854838 -0.9998557 0.9834324 0.9874207 -0.999886 0.9868627 0.9893618 -0.9999099 0.9895897 0.9911547 -0.9999288 0.9917549 0.9927345 -0.9999437 0.9934725 0.9940854 -0.9348153 0.9352767 0.999406 -0.9348149 0.9352761 0.999406 -0.9348146 0.9352752 0.999406 -0.9348141 0.9352742 0.999406 -0.9348135 0.935273 0.999406 -0.9348128 0.9352714 0.9994059 -0.9348119 0.9352694 0.9994059 -0.9348109 0.935267 0.9994059 -0.9348097 0.935264 0.9994059 -0.9348083 0.9352604 0.9994059 -0.9348069 0.9352562 0.9994059 -0.9348055 0.9352512 0.9994059 -0.9348044 0.9352456 0.9994058 -0.9348042 0.9352396 0.9994058 -0.9348056 0.9352338 0.9994058 -0.9348102 0.9352292 0.9994057 -0.9348204 0.9352277 0.9994057 -0.9348352 0.9352277 0.9994057 -0.9348539 0.9352277 0.9994057 -0.9348776 0.9352277 0.9994057 -0.9349075 0.9352277 0.9994057 -0.9349454 0.9352277 0.9994057 -0.9349933 0.9352277 0.9994057 -0.935054 0.9352277 0.9994057 -0.9351307 0.9352277 0.9994057 -0.9352277 0.9352277 0.9994057 -0.9353505 0.9352277 0.9994057 -0.9355059 0.9352277 0.9994057 -0.9357024 0.9352277 0.9994057 -0.935951 0.9352277 0.9994057 -0.9362655 0.9352277 0.9994057 -0.9366635 0.9352277 0.9994057 -0.9371669 0.9352277 0.9994057 -0.9378038 0.9352277 0.9994057 -0.9386096 0.9352277 0.9994057 -0.939629 0.9352277 0.9994057 -0.9409186 0.9352277 0.9994057 -0.9425502 0.9352277 0.9994057 -0.9446144 0.9352277 0.9994057 -0.9472259 0.9352277 0.9994057 -0.9505298 0.9352277 0.9994057 -0.9547096 0.9352277 0.9994057 -0.9599976 0.9352277 0.9994057 -0.9666876 0.9352277 0.9994057 -0.9751513 0.9352277 0.9994057 -0.9858591 0.9352277 0.9994057 -0.9994057 0.9352277 0.9994057 -0.9995308 0.9481359 0.9886988 -0.9996295 0.9585802 0.9841579 -0.9997074 0.9669906 0.983089 -0.9997688 0.9737375 0.9838545 -0.9998174 0.9791334 0.9854838 -0.9998557 0.9834385 0.9874207 -0.999886 0.9868665 0.9893618 -0.9999099 0.989592 0.9911547 -0.9999288 0.9917564 0.9927345 -0.9999437 0.9934734 0.9940854 -0.9348153 0.9353994 0.999406 -0.9348149 0.9353987 0.999406 -0.9348146 0.9353979 0.999406 -0.9348141 0.9353969 0.999406 -0.9348135 0.9353956 0.999406 -0.9348128 0.9353941 0.9994059 -0.9348119 0.9353921 0.9994059 -0.9348109 0.9353897 0.9994059 -0.9348097 0.9353867 0.9994059 -0.9348083 0.9353832 0.9994059 -0.9348069 0.9353789 0.9994059 -0.9348055 0.935374 0.9994059 -0.9348044 0.9353684 0.9994058 -0.9348042 0.9353624 0.9994058 -0.9348056 0.9353566 0.9994058 -0.9348102 0.935352 0.9994057 -0.9348204 0.9353505 0.9994057 -0.9348352 0.9353505 0.9994057 -0.9348539 0.9353505 0.9994057 -0.9348776 0.9353505 0.9994057 -0.9349075 0.9353505 0.9994057 -0.9349454 0.9353505 0.9994057 -0.9349933 0.9353505 0.9994057 -0.935054 0.9353505 0.9994057 -0.9351307 0.9353505 0.9994057 -0.9352277 0.9353505 0.9994057 -0.9353505 0.9353505 0.9994057 -0.9355059 0.9353505 0.9994057 -0.9357024 0.9353505 0.9994057 -0.935951 0.9353505 0.9994057 -0.9362655 0.9353505 0.9994057 -0.9366635 0.9353505 0.9994057 -0.9371669 0.9353505 0.9994057 -0.9378038 0.9353505 0.9994057 -0.9386096 0.9353505 0.9994057 -0.939629 0.9353505 0.9994057 -0.9409186 0.9353505 0.9994057 -0.9425502 0.9353505 0.9994057 -0.9446144 0.9353505 0.9994057 -0.9472259 0.9353505 0.9994057 -0.9505298 0.9353505 0.9994057 -0.9547096 0.9353505 0.9994057 -0.9599976 0.9353505 0.9994057 -0.9666876 0.9353505 0.9994057 -0.9751513 0.9353505 0.9994057 -0.9858591 0.9353505 0.9994057 -0.9994057 0.9353505 0.9994057 -0.9995308 0.9482135 0.9886988 -0.9996295 0.9586291 0.9841579 -0.9997074 0.9670214 0.983089 -0.9997688 0.9737569 0.9838545 -0.9998174 0.9791456 0.9854838 -0.9998557 0.9834461 0.9874207 -0.999886 0.9868713 0.9893618 -0.9999099 0.989595 0.9911547 -0.9999288 0.9917582 0.9927345 -0.9999437 0.9934746 0.9940854 -0.9348153 0.9355546 0.999406 -0.9348149 0.935554 0.999406 -0.9348146 0.9355532 0.999406 -0.9348141 0.9355521 0.999406 -0.9348135 0.9355509 0.999406 -0.9348128 0.9355493 0.9994059 -0.9348119 0.9355473 0.9994059 -0.9348109 0.9355449 0.9994059 -0.9348097 0.935542 0.9994059 -0.9348083 0.9355384 0.9994059 -0.9348069 0.9355342 0.9994059 -0.9348055 0.9355292 0.9994059 -0.9348044 0.9355237 0.9994058 -0.9348042 0.9355177 0.9994058 -0.9348056 0.9355119 0.9994058 -0.9348102 0.9355073 0.9994057 -0.9348204 0.9355059 0.9994057 -0.9348352 0.9355059 0.9994057 -0.9348539 0.9355059 0.9994057 -0.9348776 0.9355059 0.9994057 -0.9349075 0.9355059 0.9994057 -0.9349454 0.9355059 0.9994057 -0.9349933 0.9355059 0.9994057 -0.935054 0.9355059 0.9994057 -0.9351307 0.9355059 0.9994057 -0.9352277 0.9355059 0.9994057 -0.9353505 0.9355059 0.9994057 -0.9355059 0.9355059 0.9994057 -0.9357024 0.9355059 0.9994057 -0.935951 0.9355059 0.9994057 -0.9362655 0.9355059 0.9994057 -0.9366635 0.9355059 0.9994057 -0.9371669 0.9355059 0.9994057 -0.9378038 0.9355059 0.9994057 -0.9386096 0.9355059 0.9994057 -0.939629 0.9355059 0.9994057 -0.9409186 0.9355059 0.9994057 -0.9425502 0.9355059 0.9994057 -0.9446144 0.9355059 0.9994057 -0.9472259 0.9355059 0.9994057 -0.9505298 0.9355059 0.9994057 -0.9547096 0.9355059 0.9994057 -0.9599976 0.9355059 0.9994057 -0.9666876 0.9355059 0.9994057 -0.9751513 0.9355059 0.9994057 -0.9858591 0.9355059 0.9994057 -0.9994057 0.9355059 0.9994057 -0.9995308 0.9483117 0.9886988 -0.9996295 0.958691 0.9841579 -0.9997074 0.9670604 0.983089 -0.9997688 0.9737814 0.9838545 -0.9998174 0.979161 0.9854838 -0.9998557 0.9834557 0.9874207 -0.999886 0.9868773 0.9893618 -0.9999099 0.9895988 0.9911547 -0.9999288 0.9917606 0.9927345 -0.9999437 0.9934761 0.9940854 -0.9348153 0.935751 0.999406 -0.9348149 0.9357503 0.999406 -0.9348146 0.9357495 0.999406 -0.9348141 0.9357485 0.999406 -0.9348135 0.9357472 0.999406 -0.9348128 0.9357457 0.9994059 -0.9348119 0.9357437 0.9994059 -0.9348109 0.9357413 0.9994059 -0.9348097 0.9357384 0.9994059 -0.9348083 0.9357348 0.9994059 -0.9348069 0.9357306 0.9994059 -0.9348055 0.9357257 0.9994059 -0.9348044 0.9357201 0.9994058 -0.9348042 0.9357142 0.9994058 -0.9348056 0.9357084 0.9994058 -0.9348102 0.9357038 0.9994057 -0.9348204 0.9357024 0.9994057 -0.9348352 0.9357024 0.9994057 -0.9348539 0.9357024 0.9994057 -0.9348776 0.9357024 0.9994057 -0.9349075 0.9357024 0.9994057 -0.9349454 0.9357024 0.9994057 -0.9349933 0.9357024 0.9994057 -0.935054 0.9357024 0.9994057 -0.9351307 0.9357024 0.9994057 -0.9352277 0.9357024 0.9994057 -0.9353505 0.9357024 0.9994057 -0.9355059 0.9357024 0.9994057 -0.9357024 0.9357024 0.9994057 -0.935951 0.9357024 0.9994057 -0.9362655 0.9357024 0.9994057 -0.9366635 0.9357024 0.9994057 -0.9371669 0.9357024 0.9994057 -0.9378038 0.9357024 0.9994057 -0.9386096 0.9357024 0.9994057 -0.939629 0.9357024 0.9994057 -0.9409186 0.9357024 0.9994057 -0.9425502 0.9357024 0.9994057 -0.9446144 0.9357024 0.9994057 -0.9472259 0.9357024 0.9994057 -0.9505298 0.9357024 0.9994057 -0.9547096 0.9357024 0.9994057 -0.9599976 0.9357024 0.9994057 -0.9666876 0.9357024 0.9994057 -0.9751513 0.9357024 0.9994057 -0.9858591 0.9357024 0.9994057 -0.9994057 0.9357024 0.9994057 -0.9995308 0.9484359 0.9886988 -0.9996295 0.9587693 0.9841579 -0.9997074 0.9671097 0.983089 -0.9997688 0.9738123 0.9838545 -0.9998174 0.9791804 0.9854838 -0.9998557 0.9834679 0.9874207 -0.999886 0.986885 0.9893618 -0.9999099 0.9896036 0.9911547 -0.9999288 0.9917636 0.9927345 -0.9999437 0.9934779 0.9940854 -0.9348153 0.9359994 0.999406 -0.9348149 0.9359988 0.999406 -0.9348146 0.935998 0.999406 -0.9348141 0.935997 0.999406 -0.9348135 0.9359957 0.999406 -0.9348128 0.9359941 0.9994059 -0.9348119 0.9359922 0.9994059 -0.9348109 0.9359898 0.9994059 -0.9348097 0.9359869 0.9994059 -0.9348083 0.9359833 0.9994059 -0.9348069 0.9359791 0.9994059 -0.9348055 0.9359742 0.9994059 -0.9348044 0.9359687 0.9994058 -0.9348042 0.9359628 0.9994058 -0.9348056 0.935957 0.9994058 -0.9348102 0.9359524 0.9994057 -0.9348204 0.935951 0.9994057 -0.9348352 0.935951 0.9994057 -0.9348539 0.935951 0.9994057 -0.9348776 0.935951 0.9994057 -0.9349075 0.935951 0.9994057 -0.9349454 0.935951 0.9994057 -0.9349933 0.935951 0.9994057 -0.935054 0.935951 0.9994057 -0.9351307 0.935951 0.9994057 -0.9352277 0.935951 0.9994057 -0.9353505 0.935951 0.9994057 -0.9355059 0.935951 0.9994057 -0.9357024 0.935951 0.9994057 -0.935951 0.935951 0.9994057 -0.9362655 0.935951 0.9994057 -0.9366635 0.935951 0.9994057 -0.9371669 0.935951 0.9994057 -0.9378038 0.935951 0.9994057 -0.9386096 0.935951 0.9994057 -0.939629 0.935951 0.9994057 -0.9409186 0.935951 0.9994057 -0.9425502 0.935951 0.9994057 -0.9446144 0.935951 0.9994057 -0.9472259 0.935951 0.9994057 -0.9505298 0.935951 0.9994057 -0.9547096 0.935951 0.9994057 -0.9599976 0.935951 0.9994057 -0.9666876 0.935951 0.9994057 -0.9751513 0.935951 0.9994057 -0.9858591 0.935951 0.9994057 -0.9994057 0.935951 0.9994057 -0.9995308 0.9485931 0.9886988 -0.9996295 0.9588684 0.9841579 -0.9997074 0.967172 0.983089 -0.9997688 0.9738515 0.9838545 -0.9998174 0.979205 0.9854838 -0.9998557 0.9834833 0.9874207 -0.999886 0.9868946 0.9893618 -0.9999099 0.9896096 0.9911547 -0.9999288 0.9917674 0.9927345 -0.9999437 0.9934803 0.9940854 -0.9348153 0.9363137 0.999406 -0.9348149 0.9363131 0.999406 -0.9348146 0.9363123 0.999406 -0.9348141 0.9363113 0.999406 -0.9348135 0.93631 0.999406 -0.9348128 0.9363085 0.9994059 -0.9348119 0.9363065 0.9994059 -0.9348109 0.9363041 0.9994059 -0.9348097 0.9363012 0.9994059 -0.9348083 0.9362977 0.9994059 -0.9348069 0.9362935 0.9994059 -0.9348055 0.9362886 0.9994059 -0.9348044 0.9362831 0.9994058 -0.9348042 0.9362772 0.9994058 -0.9348056 0.9362715 0.9994058 -0.9348102 0.936267 0.9994057 -0.9348204 0.9362655 0.9994057 -0.9348352 0.9362655 0.9994057 -0.9348539 0.9362655 0.9994057 -0.9348776 0.9362655 0.9994057 -0.9349075 0.9362655 0.9994057 -0.9349454 0.9362655 0.9994057 -0.9349933 0.9362655 0.9994057 -0.935054 0.9362655 0.9994057 -0.9351307 0.9362655 0.9994057 -0.9352277 0.9362655 0.9994057 -0.9353505 0.9362655 0.9994057 -0.9355059 0.9362655 0.9994057 -0.9357024 0.9362655 0.9994057 -0.935951 0.9362655 0.9994057 -0.9362655 0.9362655 0.9994057 -0.9366635 0.9362655 0.9994057 -0.9371669 0.9362655 0.9994057 -0.9378038 0.9362655 0.9994057 -0.9386096 0.9362655 0.9994057 -0.939629 0.9362655 0.9994057 -0.9409186 0.9362655 0.9994057 -0.9425502 0.9362655 0.9994057 -0.9446144 0.9362655 0.9994057 -0.9472259 0.9362655 0.9994057 -0.9505298 0.9362655 0.9994057 -0.9547096 0.9362655 0.9994057 -0.9599976 0.9362655 0.9994057 -0.9666876 0.9362655 0.9994057 -0.9751513 0.9362655 0.9994057 -0.9858591 0.9362655 0.9994057 -0.9994057 0.9362655 0.9994057 -0.9995308 0.9487918 0.9886988 -0.9996295 0.9589938 0.9841579 -0.9997074 0.9672509 0.983089 -0.9997688 0.9739011 0.9838545 -0.9998174 0.9792361 0.9854838 -0.9998557 0.9835029 0.9874207 -0.999886 0.9869069 0.9893618 -0.9999099 0.9896173 0.9911547 -0.9999288 0.9917722 0.9927345 -0.9999437 0.9934833 0.9940854 -0.9348153 0.9367113 0.999406 -0.9348149 0.9367107 0.999406 -0.9348146 0.9367099 0.999406 -0.9348141 0.9367089 0.999406 -0.9348135 0.9367077 0.999406 -0.9348128 0.9367061 0.9994059 -0.9348119 0.9367042 0.9994059 -0.9348109 0.9367018 0.9994059 -0.9348097 0.9366989 0.9994059 -0.9348083 0.9366954 0.9994059 -0.9348069 0.9366913 0.9994059 -0.9348055 0.9366864 0.9994059 -0.9348044 0.9366809 0.9994058 -0.9348042 0.9366751 0.9994058 -0.9348056 0.9366694 0.9994058 -0.9348102 0.9366649 0.9994057 -0.9348204 0.9366635 0.9994057 -0.9348352 0.9366635 0.9994057 -0.9348539 0.9366635 0.9994057 -0.9348776 0.9366635 0.9994057 -0.9349075 0.9366635 0.9994057 -0.9349454 0.9366635 0.9994057 -0.9349933 0.9366635 0.9994057 -0.935054 0.9366635 0.9994057 -0.9351307 0.9366635 0.9994057 -0.9352277 0.9366635 0.9994057 -0.9353505 0.9366635 0.9994057 -0.9355059 0.9366635 0.9994057 -0.9357024 0.9366635 0.9994057 -0.935951 0.9366635 0.9994057 -0.9362655 0.9366635 0.9994057 -0.9366635 0.9366635 0.9994057 -0.9371669 0.9366635 0.9994057 -0.9378038 0.9366635 0.9994057 -0.9386096 0.9366635 0.9994057 -0.939629 0.9366635 0.9994057 -0.9409186 0.9366635 0.9994057 -0.9425502 0.9366635 0.9994057 -0.9446144 0.9366635 0.9994057 -0.9472259 0.9366635 0.9994057 -0.9505298 0.9366635 0.9994057 -0.9547096 0.9366635 0.9994057 -0.9599976 0.9366635 0.9994057 -0.9666876 0.9366635 0.9994057 -0.9751513 0.9366635 0.9994057 -0.9858591 0.9366635 0.9994057 -0.9994057 0.9366635 0.9994057 -0.9995308 0.9490434 0.9886988 -0.9996295 0.9591524 0.9841579 -0.9997074 0.9673508 0.983089 -0.9997688 0.9739638 0.9838545 -0.9998174 0.9792755 0.9854838 -0.9998557 0.9835276 0.9874207 -0.999886 0.9869223 0.9893618 -0.9999099 0.989627 0.9911547 -0.9999288 0.9917782 0.9927345 -0.9999437 0.9934871 0.9940854 -0.9348153 0.9372144 0.999406 -0.9348149 0.9372137 0.999406 -0.9348146 0.937213 0.999406 -0.9348141 0.937212 0.999406 -0.9348135 0.9372107 0.999406 -0.9348128 0.9372092 0.9994059 -0.9348119 0.9372073 0.9994059 -0.9348109 0.9372049 0.9994059 -0.9348097 0.9372021 0.9994059 -0.9348083 0.9371986 0.9994059 -0.9348069 0.9371945 0.9994059 -0.9348055 0.9371897 0.9994059 -0.9348044 0.9371842 0.9994058 -0.9348042 0.9371784 0.9994058 -0.9348056 0.9371728 0.9994058 -0.9348102 0.9371683 0.9994057 -0.9348204 0.9371669 0.9994057 -0.9348352 0.9371669 0.9994057 -0.9348539 0.9371669 0.9994057 -0.9348776 0.9371669 0.9994057 -0.9349075 0.9371669 0.9994057 -0.9349454 0.9371669 0.9994057 -0.9349933 0.9371669 0.9994057 -0.935054 0.9371669 0.9994057 -0.9351307 0.9371669 0.9994057 -0.9352277 0.9371669 0.9994057 -0.9353505 0.9371669 0.9994057 -0.9355059 0.9371669 0.9994057 -0.9357024 0.9371669 0.9994057 -0.935951 0.9371669 0.9994057 -0.9362655 0.9371669 0.9994057 -0.9366635 0.9371669 0.9994057 -0.9371669 0.9371669 0.9994057 -0.9378038 0.9371669 0.9994057 -0.9386096 0.9371669 0.9994057 -0.939629 0.9371669 0.9994057 -0.9409186 0.9371669 0.9994057 -0.9425502 0.9371669 0.9994057 -0.9446144 0.9371669 0.9994057 -0.9472259 0.9371669 0.9994057 -0.9505298 0.9371669 0.9994057 -0.9547096 0.9371669 0.9994057 -0.9599976 0.9371669 0.9994057 -0.9666876 0.9371669 0.9994057 -0.9751513 0.9371669 0.9994057 -0.9858591 0.9371669 0.9994057 -0.9994057 0.9371669 0.9994057 -0.9995308 0.9493615 0.9886988 -0.9996295 0.959353 0.9841579 -0.9997074 0.967477 0.983089 -0.9997688 0.9740432 0.9838545 -0.9998174 0.9793253 0.9854838 -0.9998557 0.9835588 0.9874207 -0.999886 0.9869419 0.9893618 -0.9999099 0.9896392 0.9911547 -0.9999288 0.9917859 0.9927345 -0.9999437 0.9934919 0.9940854 -0.9348153 0.9378508 0.999406 -0.9348149 0.9378502 0.999406 -0.9348146 0.9378494 0.999406 -0.9348141 0.9378484 0.999406 -0.9348135 0.9378472 0.999406 -0.9348128 0.9378457 0.9994059 -0.9348119 0.9378438 0.9994059 -0.9348109 0.9378415 0.9994059 -0.9348097 0.9378386 0.9994059 -0.9348083 0.9378352 0.9994059 -0.9348069 0.9378311 0.9994059 -0.9348055 0.9378263 0.9994059 -0.9348044 0.937821 0.9994058 -0.9348042 0.9378152 0.9994058 -0.9348056 0.9378096 0.9994058 -0.9348102 0.9378052 0.9994057 -0.9348204 0.9378038 0.9994057 -0.9348352 0.9378038 0.9994057 -0.9348539 0.9378038 0.9994057 -0.9348776 0.9378038 0.9994057 -0.9349075 0.9378038 0.9994057 -0.9349454 0.9378038 0.9994057 -0.9349933 0.9378038 0.9994057 -0.935054 0.9378038 0.9994057 -0.9351307 0.9378038 0.9994057 -0.9352277 0.9378038 0.9994057 -0.9353505 0.9378038 0.9994057 -0.9355059 0.9378038 0.9994057 -0.9357024 0.9378038 0.9994057 -0.935951 0.9378038 0.9994057 -0.9362655 0.9378038 0.9994057 -0.9366635 0.9378038 0.9994057 -0.9371669 0.9378038 0.9994057 -0.9378038 0.9378038 0.9994057 -0.9386096 0.9378038 0.9994057 -0.939629 0.9378038 0.9994057 -0.9409186 0.9378038 0.9994057 -0.9425502 0.9378038 0.9994057 -0.9446144 0.9378038 0.9994057 -0.9472259 0.9378038 0.9994057 -0.9505298 0.9378038 0.9994057 -0.9547096 0.9378038 0.9994057 -0.9599976 0.9378038 0.9994057 -0.9666876 0.9378038 0.9994057 -0.9751513 0.9378038 0.9994057 -0.9858591 0.9378038 0.9994057 -0.9994057 0.9378038 0.9994057 -0.9995308 0.9497641 0.9886988 -0.9996295 0.9596068 0.9841579 -0.9997074 0.9676368 0.983089 -0.9997688 0.9741436 0.9838545 -0.9998174 0.9793883 0.9854838 -0.9998557 0.9835983 0.9874207 -0.999886 0.9869667 0.9893618 -0.9999099 0.9896547 0.9911547 -0.9999288 0.9917956 0.9927345 -0.9999437 0.993498 0.9940854 -0.9348153 0.938656 0.999406 -0.9348149 0.9386553 0.999406 -0.9348146 0.9386546 0.999406 -0.9348141 0.9386536 0.999406 -0.9348135 0.9386524 0.999406 -0.9348128 0.9386509 0.9994059 -0.9348119 0.938649 0.9994059 -0.9348109 0.9386467 0.9994059 -0.9348097 0.9386439 0.9994059 -0.9348083 0.9386406 0.9994059 -0.9348069 0.9386365 0.9994059 -0.9348055 0.9386318 0.9994059 -0.9348044 0.9386265 0.9994058 -0.9348042 0.9386208 0.9994058 -0.9348056 0.9386153 0.9994058 -0.9348102 0.938611 0.9994057 -0.9348204 0.9386096 0.9994057 -0.9348352 0.9386096 0.9994057 -0.9348539 0.9386096 0.9994057 -0.9348776 0.9386096 0.9994057 -0.9349075 0.9386096 0.9994057 -0.9349454 0.9386096 0.9994057 -0.9349933 0.9386096 0.9994057 -0.935054 0.9386096 0.9994057 -0.9351307 0.9386096 0.9994057 -0.9352277 0.9386096 0.9994057 -0.9353505 0.9386096 0.9994057 -0.9355059 0.9386096 0.9994057 -0.9357024 0.9386096 0.9994057 -0.935951 0.9386096 0.9994057 -0.9362655 0.9386096 0.9994057 -0.9366635 0.9386096 0.9994057 -0.9371669 0.9386096 0.9994057 -0.9378038 0.9386096 0.9994057 -0.9386096 0.9386096 0.9994057 -0.939629 0.9386096 0.9994057 -0.9409186 0.9386096 0.9994057 -0.9425502 0.9386096 0.9994057 -0.9446144 0.9386096 0.9994057 -0.9472259 0.9386096 0.9994057 -0.9505298 0.9386096 0.9994057 -0.9547096 0.9386096 0.9994057 -0.9599976 0.9386096 0.9994057 -0.9666876 0.9386096 0.9994057 -0.9751513 0.9386096 0.9994057 -0.9858591 0.9386096 0.9994057 -0.9994057 0.9386096 0.9994057 -0.9995308 0.9502734 0.9886988 -0.9996295 0.959928 0.9841579 -0.9997074 0.9678389 0.983089 -0.9997688 0.9742706 0.9838545 -0.9998174 0.9794681 0.9854838 -0.9998557 0.9836483 0.9874207 -0.999886 0.986998 0.9893618 -0.9999099 0.9896744 0.9911547 -0.9999288 0.9918079 0.9927345 -0.9999437 0.9935057 0.9940854 -0.9348153 0.9396746 0.999406 -0.9348149 0.939674 0.999406 -0.9348146 0.9396732 0.999406 -0.9348141 0.9396723 0.999406 -0.9348135 0.9396711 0.999406 -0.9348128 0.9396696 0.9994059 -0.9348119 0.9396678 0.9994059 -0.9348109 0.9396655 0.9994059 -0.9348097 0.9396628 0.9994059 -0.9348083 0.9396594 0.9994059 -0.9348069 0.9396555 0.9994059 -0.9348055 0.9396508 0.9994059 -0.9348044 0.9396456 0.9994058 -0.9348042 0.93964 0.9994058 -0.9348056 0.9396346 0.9994058 -0.9348102 0.9396303 0.9994057 -0.9348204 0.939629 0.9994057 -0.9348352 0.939629 0.9994057 -0.9348539 0.939629 0.9994057 -0.9348776 0.939629 0.9994057 -0.9349075 0.939629 0.9994057 -0.9349454 0.939629 0.9994057 -0.9349933 0.939629 0.9994057 -0.935054 0.939629 0.9994057 -0.9351307 0.939629 0.9994057 -0.9352277 0.939629 0.9994057 -0.9353505 0.939629 0.9994057 -0.9355059 0.939629 0.9994057 -0.9357024 0.939629 0.9994057 -0.935951 0.939629 0.9994057 -0.9362655 0.939629 0.9994057 -0.9366635 0.939629 0.9994057 -0.9371669 0.939629 0.9994057 -0.9378038 0.939629 0.9994057 -0.9386096 0.939629 0.9994057 -0.939629 0.939629 0.9994057 -0.9409186 0.939629 0.9994057 -0.9425502 0.939629 0.9994057 -0.9446144 0.939629 0.9994057 -0.9472259 0.939629 0.9994057 -0.9505298 0.939629 0.9994057 -0.9547096 0.939629 0.9994057 -0.9599976 0.939629 0.9994057 -0.9666876 0.939629 0.9994057 -0.9751513 0.939629 0.9994057 -0.9858591 0.939629 0.9994057 -0.9994057 0.939629 0.9994057 -0.9995308 0.9509177 0.9886988 -0.9996295 0.9603343 0.9841579 -0.9997074 0.9680946 0.983089 -0.9997688 0.9744313 0.9838545 -0.9998174 0.9795689 0.9854838 -0.9998557 0.9837116 0.9874207 -0.999886 0.9870376 0.9893618 -0.9999099 0.9896992 0.9911547 -0.9999288 0.9918234 0.9927345 -0.9999437 0.9935154 0.9940854 -0.9348153 0.9409633 0.999406 -0.9348149 0.9409627 0.999406 -0.9348146 0.9409619 0.999406 -0.9348141 0.940961 0.999406 -0.9348135 0.9409599 0.999406 -0.9348128 0.9409584 0.9994059 -0.9348119 0.9409566 0.9994059 -0.9348109 0.9409544 0.9994059 -0.9348097 0.9409517 0.9994059 -0.9348083 0.9409485 0.9994059 -0.9348069 0.9409446 0.9994059 -0.9348055 0.9409401 0.9994059 -0.9348044 0.9409349 0.9994058 -0.9348042 0.9409295 0.9994058 -0.9348056 0.9409242 0.9994058 -0.9348102 0.94092 0.9994057 -0.9348204 0.9409186 0.9994057 -0.9348352 0.9409186 0.9994057 -0.9348539 0.9409186 0.9994057 -0.9348776 0.9409186 0.9994057 -0.9349075 0.9409186 0.9994057 -0.9349454 0.9409186 0.9994057 -0.9349933 0.9409186 0.9994057 -0.935054 0.9409186 0.9994057 -0.9351307 0.9409186 0.9994057 -0.9352277 0.9409186 0.9994057 -0.9353505 0.9409186 0.9994057 -0.9355059 0.9409186 0.9994057 -0.9357024 0.9409186 0.9994057 -0.935951 0.9409186 0.9994057 -0.9362655 0.9409186 0.9994057 -0.9366635 0.9409186 0.9994057 -0.9371669 0.9409186 0.9994057 -0.9378038 0.9409186 0.9994057 -0.9386096 0.9409186 0.9994057 -0.939629 0.9409186 0.9994057 -0.9409186 0.9409186 0.9994057 -0.9425502 0.9409186 0.9994057 -0.9446144 0.9409186 0.9994057 -0.9472259 0.9409186 0.9994057 -0.9505298 0.9409186 0.9994057 -0.9547096 0.9409186 0.9994057 -0.9599976 0.9409186 0.9994057 -0.9666876 0.9409186 0.9994057 -0.9751513 0.9409186 0.9994057 -0.9858591 0.9409186 0.9994057 -0.9994057 0.9409186 0.9994057 -0.9995308 0.9517328 0.9886988 -0.9996295 0.9608482 0.9841579 -0.9997074 0.9684181 0.983089 -0.9997688 0.9746346 0.9838545 -0.9998174 0.9796966 0.9854838 -0.9998557 0.9837916 0.9874207 -0.999886 0.9870878 0.9893618 -0.9999099 0.9897306 0.9911547 -0.9999288 0.9918431 0.9927345 -0.9999437 0.9935277 0.9940854 -0.9348153 0.9425936 0.999406 -0.9348149 0.9425931 0.999406 -0.9348146 0.9425924 0.999406 -0.9348141 0.9425915 0.999406 -0.9348135 0.9425903 0.999406 -0.9348128 0.9425889 0.9994059 -0.9348119 0.9425872 0.9994059 -0.9348109 0.942585 0.9994059 -0.9348097 0.9425824 0.9994059 -0.9348083 0.9425792 0.9994059 -0.9348069 0.9425755 0.9994059 -0.9348055 0.9425711 0.9994059 -0.9348044 0.9425661 0.9994058 -0.9348042 0.9425608 0.9994058 -0.9348056 0.9425556 0.9994058 -0.9348102 0.9425516 0.9994057 -0.9348204 0.9425502 0.9994057 -0.9348352 0.9425502 0.9994057 -0.9348539 0.9425502 0.9994057 -0.9348776 0.9425502 0.9994057 -0.9349075 0.9425502 0.9994057 -0.9349454 0.9425502 0.9994057 -0.9349933 0.9425502 0.9994057 -0.935054 0.9425502 0.9994057 -0.9351307 0.9425502 0.9994057 -0.9352277 0.9425502 0.9994057 -0.9353505 0.9425502 0.9994057 -0.9355059 0.9425502 0.9994057 -0.9357024 0.9425502 0.9994057 -0.935951 0.9425502 0.9994057 -0.9362655 0.9425502 0.9994057 -0.9366635 0.9425502 0.9994057 -0.9371669 0.9425502 0.9994057 -0.9378038 0.9425502 0.9994057 -0.9386096 0.9425502 0.9994057 -0.939629 0.9425502 0.9994057 -0.9409186 0.9425502 0.9994057 -0.9425502 0.9425502 0.9994057 -0.9446144 0.9425502 0.9994057 -0.9472259 0.9425502 0.9994057 -0.9505298 0.9425502 0.9994057 -0.9547096 0.9425502 0.9994057 -0.9599976 0.9425502 0.9994057 -0.9666876 0.9425502 0.9994057 -0.9751513 0.9425502 0.9994057 -0.9858591 0.9425502 0.9994057 -0.9994057 0.9425502 0.9994057 -0.9995308 0.952764 0.9886988 -0.9996295 0.9614985 0.9841579 -0.9997074 0.9688274 0.983089 -0.9997688 0.9748918 0.9838545 -0.9998174 0.979858 0.9854838 -0.9998557 0.9838928 0.9874207 -0.999886 0.9871512 0.9893618 -0.9999099 0.9897703 0.9911547 -0.9999288 0.991868 0.9927345 -0.9999437 0.9935432 0.9940854 -0.9348153 0.9446563 0.999406 -0.9348149 0.9446557 0.999406 -0.9348146 0.944655 0.999406 -0.9348141 0.9446542 0.999406 -0.9348135 0.9446531 0.999406 -0.9348128 0.9446517 0.9994059 -0.9348119 0.94465 0.9994059 -0.9348109 0.944648 0.9994059 -0.9348097 0.9446454 0.9994059 -0.9348083 0.9446424 0.9994059 -0.9348069 0.9446388 0.9994059 -0.9348055 0.9446345 0.9994059 -0.9348044 0.9446297 0.9994058 -0.9348042 0.9446246 0.9994058 -0.9348056 0.9446196 0.9994058 -0.9348102 0.9446157 0.9994057 -0.9348204 0.9446144 0.9994057 -0.9348352 0.9446144 0.9994057 -0.9348539 0.9446144 0.9994057 -0.9348776 0.9446144 0.9994057 -0.9349075 0.9446144 0.9994057 -0.9349454 0.9446144 0.9994057 -0.9349933 0.9446144 0.9994057 -0.935054 0.9446144 0.9994057 -0.9351307 0.9446144 0.9994057 -0.9352277 0.9446144 0.9994057 -0.9353505 0.9446144 0.9994057 -0.9355059 0.9446144 0.9994057 -0.9357024 0.9446144 0.9994057 -0.935951 0.9446144 0.9994057 -0.9362655 0.9446144 0.9994057 -0.9366635 0.9446144 0.9994057 -0.9371669 0.9446144 0.9994057 -0.9378038 0.9446144 0.9994057 -0.9386096 0.9446144 0.9994057 -0.939629 0.9446144 0.9994057 -0.9409186 0.9446144 0.9994057 -0.9425502 0.9446144 0.9994057 -0.9446144 0.9446144 0.9994057 -0.9472259 0.9446144 0.9994057 -0.9505298 0.9446144 0.9994057 -0.9547096 0.9446144 0.9994057 -0.9599976 0.9446144 0.9994057 -0.9666876 0.9446144 0.9994057 -0.9751513 0.9446144 0.9994057 -0.9858591 0.9446144 0.9994057 -0.9994057 0.9446144 0.9994057 -0.9995308 0.9540687 0.9886988 -0.9996295 0.9623212 0.9841579 -0.9997074 0.9693452 0.983089 -0.9997688 0.9752172 0.9838545 -0.9998174 0.9800622 0.9854838 -0.9998557 0.9840209 0.9874207 -0.999886 0.9872315 0.9893618 -0.9999099 0.9898206 0.9911547 -0.9999288 0.9918994 0.9927345 -0.9999437 0.9935629 0.9940854 -0.9348153 0.9472658 0.999406 -0.9348149 0.9472652 0.999406 -0.9348146 0.9472646 0.999406 -0.9348141 0.9472638 0.999406 -0.9348135 0.9472627 0.999406 -0.9348128 0.9472614 0.9994059 -0.9348119 0.9472598 0.9994059 -0.9348109 0.9472579 0.9994059 -0.9348097 0.9472555 0.9994059 -0.9348083 0.9472525 0.9994059 -0.9348069 0.9472491 0.9994059 -0.9348055 0.947245 0.9994059 -0.9348044 0.9472405 0.9994058 -0.9348042 0.9472356 0.9994058 -0.9348056 0.9472309 0.9994058 -0.9348102 0.9472271 0.9994057 -0.9348204 0.9472259 0.9994057 -0.9348352 0.9472259 0.9994057 -0.9348539 0.9472259 0.9994057 -0.9348776 0.9472259 0.9994057 -0.9349075 0.9472259 0.9994057 -0.9349454 0.9472259 0.9994057 -0.9349933 0.9472259 0.9994057 -0.935054 0.9472259 0.9994057 -0.9351307 0.9472259 0.9994057 -0.9352277 0.9472259 0.9994057 -0.9353505 0.9472259 0.9994057 -0.9355059 0.9472259 0.9994057 -0.9357024 0.9472259 0.9994057 -0.935951 0.9472259 0.9994057 -0.9362655 0.9472259 0.9994057 -0.9366635 0.9472259 0.9994057 -0.9371669 0.9472259 0.9994057 -0.9378038 0.9472259 0.9994057 -0.9386096 0.9472259 0.9994057 -0.939629 0.9472259 0.9994057 -0.9409186 0.9472259 0.9994057 -0.9425502 0.9472259 0.9994057 -0.9446144 0.9472259 0.9994057 -0.9472259 0.9472259 0.9994057 -0.9505298 0.9472259 0.9994057 -0.9547096 0.9472259 0.9994057 -0.9599976 0.9472259 0.9994057 -0.9666876 0.9472259 0.9994057 -0.9751513 0.9472259 0.9994057 -0.9858591 0.9472259 0.9994057 -0.9994057 0.9472259 0.9994057 -0.9995308 0.9557192 0.9886988 -0.9996295 0.963362 0.9841579 -0.9997074 0.9700002 0.983089 -0.9997688 0.9756289 0.9838545 -0.9998174 0.9803206 0.9854838 -0.9998557 0.9841829 0.9874207 -0.999886 0.987333 0.9893618 -0.9999099 0.9898842 0.9911547 -0.9999288 0.9919392 0.9927345 -0.9999437 0.9935878 0.9940854 -0.9348153 0.9505671 0.999406 -0.9348149 0.9505666 0.999406 -0.9348146 0.950566 0.999406 -0.9348141 0.9505652 0.999406 -0.9348135 0.9505643 0.999406 -0.9348128 0.9505631 0.9994059 -0.9348119 0.9505616 0.9994059 -0.9348109 0.9505597 0.9994059 -0.9348097 0.9505575 0.9994059 -0.9348083 0.9505547 0.9994059 -0.9348069 0.9505515 0.9994059 -0.9348055 0.9505477 0.9994059 -0.9348044 0.9505434 0.9994058 -0.9348042 0.9505389 0.9994058 -0.9348056 0.9505344 0.9994058 -0.9348102 0.9505309 0.9994057 -0.9348204 0.9505298 0.9994057 -0.9348352 0.9505298 0.9994057 -0.9348539 0.9505298 0.9994057 -0.9348776 0.9505298 0.9994057 -0.9349075 0.9505298 0.9994057 -0.9349454 0.9505298 0.9994057 -0.9349933 0.9505298 0.9994057 -0.935054 0.9505298 0.9994057 -0.9351307 0.9505298 0.9994057 -0.9352277 0.9505298 0.9994057 -0.9353505 0.9505298 0.9994057 -0.9355059 0.9505298 0.9994057 -0.9357024 0.9505298 0.9994057 -0.935951 0.9505298 0.9994057 -0.9362655 0.9505298 0.9994057 -0.9366635 0.9505298 0.9994057 -0.9371669 0.9505298 0.9994057 -0.9378038 0.9505298 0.9994057 -0.9386096 0.9505298 0.9994057 -0.939629 0.9505298 0.9994057 -0.9409186 0.9505298 0.9994057 -0.9425502 0.9505298 0.9994057 -0.9446144 0.9505298 0.9994057 -0.9472259 0.9505298 0.9994057 -0.9505298 0.9505298 0.9994057 -0.9547096 0.9505298 0.9994057 -0.9599976 0.9505298 0.9994057 -0.9666876 0.9505298 0.9994057 -0.9751513 0.9505298 0.9994057 -0.9858591 0.9505298 0.9994057 -0.9994057 0.9505298 0.9994057 -0.9995308 0.9578074 0.9886988 -0.9996295 0.9646787 0.9841579 -0.9997074 0.970829 0.983089 -0.9997688 0.9761497 0.9838545 -0.9998174 0.9806476 0.9854838 -0.9998557 0.984388 0.9874207 -0.999886 0.9874615 0.9893618 -0.9999099 0.9899646 0.9911547 -0.9999288 0.9919896 0.9927345 -0.9999437 0.9936193 0.9940854 -0.9348153 0.9547438 0.999406 -0.9348149 0.9547433 0.999406 -0.9348146 0.9547427 0.999406 -0.9348141 0.954742 0.999406 -0.9348135 0.9547411 0.999406 -0.9348128 0.95474 0.9994059 -0.9348119 0.9547387 0.9994059 -0.9348109 0.954737 0.9994059 -0.9348097 0.9547349 0.9994059 -0.9348083 0.9547324 0.9994059 -0.9348069 0.9547294 0.9994059 -0.9348055 0.954726 0.9994059 -0.9348044 0.9547221 0.9994058 -0.9348042 0.9547179 0.9994058 -0.9348056 0.9547138 0.9994058 -0.9348102 0.9547106 0.9994057 -0.9348204 0.9547096 0.9994057 -0.9348352 0.9547096 0.9994057 -0.9348539 0.9547096 0.9994057 -0.9348776 0.9547096 0.9994057 -0.9349075 0.9547096 0.9994057 -0.9349454 0.9547096 0.9994057 -0.9349933 0.9547096 0.9994057 -0.935054 0.9547096 0.9994057 -0.9351307 0.9547096 0.9994057 -0.9352277 0.9547096 0.9994057 -0.9353505 0.9547096 0.9994057 -0.9355059 0.9547096 0.9994057 -0.9357024 0.9547096 0.9994057 -0.935951 0.9547096 0.9994057 -0.9362655 0.9547096 0.9994057 -0.9366635 0.9547096 0.9994057 -0.9371669 0.9547096 0.9994057 -0.9378038 0.9547096 0.9994057 -0.9386096 0.9547096 0.9994057 -0.939629 0.9547096 0.9994057 -0.9409186 0.9547096 0.9994057 -0.9425502 0.9547096 0.9994057 -0.9446144 0.9547096 0.9994057 -0.9472259 0.9547096 0.9994057 -0.9505298 0.9547096 0.9994057 -0.9547096 0.9547096 0.9994057 -0.9599976 0.9547096 0.9994057 -0.9666876 0.9547096 0.9994057 -0.9751513 0.9547096 0.9994057 -0.9858591 0.9547096 0.9994057 -0.9994057 0.9547096 0.9994057 -0.9995308 0.9604492 0.9886988 -0.9996295 0.9663445 0.9841579 -0.9997074 0.9718774 0.983089 -0.9997688 0.9768086 0.9838545 -0.9998174 0.9810611 0.9854838 -0.9998557 0.9846473 0.9874207 -0.999886 0.987624 0.9893618 -0.9999099 0.9900664 0.9911547 -0.9999288 0.9920533 0.9927345 -0.9999437 0.9936592 0.9940854 -0.9348153 0.9600277 0.999406 -0.9348149 0.9600273 0.999406 -0.9348146 0.9600268 0.999406 -0.9348141 0.9600262 0.999406 -0.9348135 0.9600254 0.999406 -0.9348128 0.9600245 0.9994059 -0.9348119 0.9600233 0.9994059 -0.9348109 0.9600218 0.9994059 -0.9348097 0.9600199 0.9994059 -0.9348083 0.9600177 0.9994059 -0.9348069 0.9600151 0.9994059 -0.9348055 0.9600121 0.9994059 -0.9348044 0.9600086 0.9994058 -0.9348042 0.9600049 0.9994058 -0.9348056 0.9600013 0.9994058 -0.9348102 0.9599985 0.9994057 -0.9348204 0.9599976 0.9994057 -0.9348352 0.9599976 0.9994057 -0.9348539 0.9599976 0.9994057 -0.9348776 0.9599976 0.9994057 -0.9349075 0.9599976 0.9994057 -0.9349454 0.9599976 0.9994057 -0.9349933 0.9599976 0.9994057 -0.935054 0.9599976 0.9994057 -0.9351307 0.9599976 0.9994057 -0.9352277 0.9599976 0.9994057 -0.9353505 0.9599976 0.9994057 -0.9355059 0.9599976 0.9994057 -0.9357024 0.9599976 0.9994057 -0.935951 0.9599976 0.9994057 -0.9362655 0.9599976 0.9994057 -0.9366635 0.9599976 0.9994057 -0.9371669 0.9599976 0.9994057 -0.9378038 0.9599976 0.9994057 -0.9386096 0.9599976 0.9994057 -0.939629 0.9599976 0.9994057 -0.9409186 0.9599976 0.9994057 -0.9425502 0.9599976 0.9994057 -0.9446144 0.9599976 0.9994057 -0.9472259 0.9599976 0.9994057 -0.9505298 0.9599976 0.9994057 -0.9547096 0.9599976 0.9994057 -0.9599976 0.9599976 0.9994057 -0.9666876 0.9599976 0.9994057 -0.9751513 0.9599976 0.9994057 -0.9858591 0.9599976 0.9994057 -0.9994057 0.9599976 0.9994057 -0.9995308 0.9637914 0.9886988 -0.9996295 0.968452 0.9841579 -0.9997074 0.9732039 0.983089 -0.9997688 0.9776422 0.9838545 -0.9998174 0.9815844 0.9854838 -0.9998557 0.9849754 0.9874207 -0.999886 0.9878296 0.9893618 -0.9999099 0.9901951 0.9911547 -0.9999288 0.9921339 0.9927345 -0.9999437 0.9937096 0.9940854 -0.9348153 0.9667127 0.999406 -0.9348149 0.9667124 0.999406 -0.9348146 0.9667119 0.999406 -0.9348141 0.9667114 0.999406 -0.9348135 0.9667108 0.999406 -0.9348128 0.96671 0.9994059 -0.9348119 0.9667089 0.9994059 -0.9348109 0.9667077 0.9994059 -0.9348097 0.9667062 0.9994059 -0.9348083 0.9667044 0.9994059 -0.9348069 0.9667022 0.9994059 -0.9348055 0.9666996 0.9994059 -0.9348044 0.9666968 0.9994058 -0.9348042 0.9666937 0.9994058 -0.9348056 0.9666907 0.9994058 -0.9348102 0.9666884 0.9994057 -0.9348204 0.9666876 0.9994057 -0.9348352 0.9666876 0.9994057 -0.9348539 0.9666876 0.9994057 -0.9348776 0.9666876 0.9994057 -0.9349075 0.9666876 0.9994057 -0.9349454 0.9666876 0.9994057 -0.9349933 0.9666876 0.9994057 -0.935054 0.9666876 0.9994057 -0.9351307 0.9666876 0.9994057 -0.9352277 0.9666876 0.9994057 -0.9353505 0.9666876 0.9994057 -0.9355059 0.9666876 0.9994057 -0.9357024 0.9666876 0.9994057 -0.935951 0.9666876 0.9994057 -0.9362655 0.9666876 0.9994057 -0.9366635 0.9666876 0.9994057 -0.9371669 0.9666876 0.9994057 -0.9378038 0.9666876 0.9994057 -0.9386096 0.9666876 0.9994057 -0.939629 0.9666876 0.9994057 -0.9409186 0.9666876 0.9994057 -0.9425502 0.9666876 0.9994057 -0.9446144 0.9666876 0.9994057 -0.9472259 0.9666876 0.9994057 -0.9505298 0.9666876 0.9994057 -0.9547096 0.9666876 0.9994057 -0.9599976 0.9666876 0.9994057 -0.9666876 0.9666876 0.9994057 -0.9751513 0.9666876 0.9994057 -0.9858591 0.9666876 0.9994057 -0.9994057 0.9666876 0.9994057 -0.9995308 0.9680197 0.9886988 -0.9996295 0.9711183 0.9841579 -0.9997074 0.974882 0.983089 -0.9997688 0.9786968 0.9838545 -0.9998174 0.9822464 0.9854838 -0.9998557 0.9853905 0.9874207 -0.999886 0.9880897 0.9893618 -0.9999099 0.990358 0.9911547 -0.9999288 0.9922358 0.9927345 -0.9999437 0.9937734 0.9940854 -0.9348153 0.97517 0.999406 -0.9348149 0.9751697 0.999406 -0.9348146 0.9751694 0.999406 -0.9348141 0.975169 0.999406 -0.9348135 0.9751686 0.999406 -0.9348128 0.975168 0.9994059 -0.9348119 0.9751672 0.9994059 -0.9348109 0.9751663 0.9994059 -0.9348097 0.9751652 0.9994059 -0.9348083 0.9751638 0.9994059 -0.9348069 0.9751622 0.9994059 -0.9348055 0.9751603 0.9994059 -0.9348044 0.9751582 0.9994058 -0.9348042 0.9751559 0.9994058 -0.9348056 0.9751537 0.9994058 -0.9348102 0.9751519 0.9994057 -0.9348204 0.9751513 0.9994057 -0.9348352 0.9751513 0.9994057 -0.9348539 0.9751513 0.9994057 -0.9348776 0.9751513 0.9994057 -0.9349075 0.9751513 0.9994057 -0.9349454 0.9751513 0.9994057 -0.9349933 0.9751513 0.9994057 -0.935054 0.9751513 0.9994057 -0.9351307 0.9751513 0.9994057 -0.9352277 0.9751513 0.9994057 -0.9353505 0.9751513 0.9994057 -0.9355059 0.9751513 0.9994057 -0.9357024 0.9751513 0.9994057 -0.935951 0.9751513 0.9994057 -0.9362655 0.9751513 0.9994057 -0.9366635 0.9751513 0.9994057 -0.9371669 0.9751513 0.9994057 -0.9378038 0.9751513 0.9994057 -0.9386096 0.9751513 0.9994057 -0.939629 0.9751513 0.9994057 -0.9409186 0.9751513 0.9994057 -0.9425502 0.9751513 0.9994057 -0.9446144 0.9751513 0.9994057 -0.9472259 0.9751513 0.9994057 -0.9505298 0.9751513 0.9994057 -0.9547096 0.9751513 0.9994057 -0.9599976 0.9751513 0.9994057 -0.9666876 0.9751513 0.9994057 -0.9751513 0.9751513 0.9994057 -0.9858591 0.9751513 0.9994057 -0.9994057 0.9751513 0.9994057 -0.9995308 0.9733691 0.9886988 -0.9996295 0.9744915 0.9841579 -0.9997074 0.977005 0.983089 -0.9997688 0.980031 0.9838545 -0.9998174 0.9830838 0.9854838 -0.9998557 0.9859157 0.9874207 -0.999886 0.9884188 0.9893618 -0.9999099 0.9905641 0.9911547 -0.9999288 0.9923648 0.9927345 -0.9999437 0.9938541 0.9940854 -0.9348153 0.9858696 0.999406 -0.9348149 0.9858695 0.999406 -0.9348146 0.9858693 0.999406 -0.9348141 0.9858691 0.999406 -0.9348135 0.9858688 0.999406 -0.9348128 0.9858684 0.9994059 -0.9348119 0.985868 0.9994059 -0.9348109 0.9858675 0.9994059 -0.9348097 0.9858669 0.9994059 -0.9348083 0.9858661 0.9994059 -0.9348069 0.9858652 0.9994059 -0.9348055 0.9858641 0.9994059 -0.9348044 0.9858629 0.9994058 -0.9348042 0.9858616 0.9994058 -0.9348056 0.9858604 0.9994058 -0.9348102 0.9858594 0.9994057 -0.9348204 0.9858591 0.9994057 -0.9348352 0.9858591 0.9994057 -0.9348539 0.9858591 0.9994057 -0.9348776 0.9858591 0.9994057 -0.9349075 0.9858591 0.9994057 -0.9349454 0.9858591 0.9994057 -0.9349933 0.9858591 0.9994057 -0.935054 0.9858591 0.9994057 -0.9351307 0.9858591 0.9994057 -0.9352277 0.9858591 0.9994057 -0.9353505 0.9858591 0.9994057 -0.9355059 0.9858591 0.9994057 -0.9357024 0.9858591 0.9994057 -0.935951 0.9858591 0.9994057 -0.9362655 0.9858591 0.9994057 -0.9366635 0.9858591 0.9994057 -0.9371669 0.9858591 0.9994057 -0.9378038 0.9858591 0.9994057 -0.9386096 0.9858591 0.9994057 -0.939629 0.9858591 0.9994057 -0.9409186 0.9858591 0.9994057 -0.9425502 0.9858591 0.9994057 -0.9446144 0.9858591 0.9994057 -0.9472259 0.9858591 0.9994057 -0.9505298 0.9858591 0.9994057 -0.9547096 0.9858591 0.9994057 -0.9599976 0.9858591 0.9994057 -0.9666876 0.9858591 0.9994057 -0.9751513 0.9858591 0.9994057 -0.9858591 0.9858591 0.9994057 -0.9994057 0.9858591 0.9994057 -0.9995308 0.9801368 0.9886988 -0.9996295 0.978759 0.9841579 -0.9997074 0.9796909 0.983089 -0.9997688 0.981719 0.9838545 -0.9998174 0.9841433 0.9854838 -0.9998557 0.9865801 0.9874207 -0.999886 0.9888351 0.9893618 -0.9999099 0.9908248 0.9911547 -0.9999288 0.992528 0.9927345 -0.9999437 0.9939562 0.9940854 -0.9348153 0.999406 0.999406 -0.9348149 0.999406 0.999406 -0.9348146 0.999406 0.999406 -0.9348141 0.999406 0.999406 -0.9348135 0.999406 0.999406 -0.9348128 0.9994059 0.9994059 -0.9348119 0.9994059 0.9994059 -0.9348109 0.9994059 0.9994059 -0.9348097 0.9994059 0.9994059 -0.9348083 0.9994059 0.9994059 -0.9348069 0.9994059 0.9994059 -0.9348055 0.9994059 0.9994059 -0.9348044 0.9994058 0.9994058 -0.9348042 0.9994058 0.9994058 -0.9348056 0.9994058 0.9994058 -0.9348102 0.9994057 0.9994057 -0.9348204 0.9994057 0.9994057 -0.9348352 0.9994057 0.9994057 -0.9348539 0.9994057 0.9994057 -0.9348776 0.9994057 0.9994057 -0.9349075 0.9994057 0.9994057 -0.9349454 0.9994057 0.9994057 -0.9349933 0.9994057 0.9994057 -0.935054 0.9994057 0.9994057 -0.9351307 0.9994057 0.9994057 -0.9352277 0.9994057 0.9994057 -0.9353505 0.9994057 0.9994057 -0.9355059 0.9994057 0.9994057 -0.9357024 0.9994057 0.9994057 -0.935951 0.9994057 0.9994057 -0.9362655 0.9994057 0.9994057 -0.9366635 0.9994057 0.9994057 -0.9371669 0.9994057 0.9994057 -0.9378038 0.9994057 0.9994057 -0.9386096 0.9994057 0.9994057 -0.939629 0.9994057 0.9994057 -0.9409186 0.9994057 0.9994057 -0.9425502 0.9994057 0.9994057 -0.9446144 0.9994057 0.9994057 -0.9472259 0.9994057 0.9994057 -0.9505298 0.9994057 0.9994057 -0.9547096 0.9994057 0.9994057 -0.9599976 0.9994057 0.9994057 -0.9666876 0.9994057 0.9994057 -0.9751513 0.9994057 0.9994057 -0.9858591 0.9994057 0.9994057 -0.9994057 0.9994057 0.9994057 -0.9995308 0.9886988 0.9886988 -0.9996295 0.9841579 0.9841579 -0.9997074 0.983089 0.983089 -0.9997688 0.9838545 0.9838545 -0.9998174 0.9854838 0.9854838 -0.9998557 0.9874207 0.9874207 -0.999886 0.9893618 0.9893618 -0.9999099 0.9911547 0.9911547 -0.9999288 0.9927345 0.9927345 -0.9999437 0.9940854 0.9940854 -0.9478754 0.999531 0.9887055 -0.9478752 0.999531 0.9887054 -0.947875 0.999531 0.9887053 -0.9478746 0.999531 0.9887052 -0.9478743 0.999531 0.988705 -0.9478738 0.999531 0.9887048 -0.9478733 0.999531 0.9887045 -0.9478726 0.999531 0.9887042 -0.9478718 0.999531 0.9887038 -0.947871 0.9995309 0.9887033 -0.94787 0.9995309 0.9887027 -0.9478691 0.9995309 0.988702 -0.9478684 0.9995309 0.9887012 -0.9478683 0.9995309 0.9887004 -0.9478691 0.9995309 0.9886996 -0.947872 0.9995309 0.988699 -0.9478785 0.9995308 0.9886988 -0.9478878 0.9995308 0.9886988 -0.9478997 0.9995308 0.9886988 -0.9479146 0.9995308 0.9886988 -0.9479335 0.9995308 0.9886988 -0.9479575 0.9995308 0.9886988 -0.9479878 0.9995308 0.9886988 -0.9480261 0.9995308 0.9886988 -0.9480746 0.9995308 0.9886988 -0.9481359 0.9995308 0.9886988 -0.9482135 0.9995308 0.9886988 -0.9483117 0.9995308 0.9886988 -0.9484359 0.9995308 0.9886988 -0.9485931 0.9995308 0.9886988 -0.9487918 0.9995308 0.9886988 -0.9490434 0.9995308 0.9886988 -0.9493615 0.9995308 0.9886988 -0.9497641 0.9995308 0.9886988 -0.9502734 0.9995308 0.9886988 -0.9509177 0.9995308 0.9886988 -0.9517328 0.9995308 0.9886988 -0.952764 0.9995308 0.9886988 -0.9540687 0.9995308 0.9886988 -0.9557192 0.9995308 0.9886988 -0.9578074 0.9995308 0.9886988 -0.9604492 0.9995308 0.9886988 -0.9637914 0.9995308 0.9886988 -0.9680197 0.9995308 0.9886988 -0.9733691 0.9995308 0.9886988 -0.9801368 0.9995308 0.9886988 -0.9886988 0.9995308 0.9886988 -0.9995308 0.9995308 0.9886988 -0.9996295 0.9909882 0.9841579 -0.9997074 0.9873879 0.983089 -0.9997688 0.9865561 0.9838545 -0.9998174 0.9871796 0.9854838 -0.9998557 0.9884841 0.9874207 -0.999886 0.9900282 0.9893618 -0.9999099 0.991572 0.9911547 -0.9999288 0.9929957 0.9927345 -0.9999437 0.9942488 0.9940854 -0.958416 0.9996296 0.9841654 -0.9584159 0.9996296 0.9841653 -0.9584157 0.9996296 0.9841652 -0.9584155 0.9996296 0.984165 -0.9584153 0.9996296 0.9841648 -0.958415 0.9996296 0.9841646 -0.9584146 0.9996296 0.9841643 -0.9584142 0.9996296 0.9841639 -0.9584137 0.9996296 0.9841634 -0.9584132 0.9996296 0.9841629 -0.9584126 0.9996296 0.9841622 -0.958412 0.9996296 0.9841615 -0.9584115 0.9996296 0.9841606 -0.9584114 0.9996295 0.9841597 -0.958412 0.9996295 0.9841588 -0.9584138 0.9996295 0.9841581 -0.9584178 0.9996295 0.9841579 -0.9584237 0.9996295 0.9841579 -0.9584312 0.9996295 0.9841579 -0.9584406 0.9996295 0.9841579 -0.9584526 0.9996295 0.9841579 -0.9584677 0.9996295 0.9841579 -0.9584868 0.9996295 0.9841579 -0.9585109 0.9996295 0.9841579 -0.9585415 0.9996295 0.9841579 -0.9585802 0.9996295 0.9841579 -0.9586291 0.9996295 0.9841579 -0.958691 0.9996295 0.9841579 -0.9587693 0.9996295 0.9841579 -0.9588684 0.9996295 0.9841579 -0.9589938 0.9996295 0.9841579 -0.9591524 0.9996295 0.9841579 -0.959353 0.9996295 0.9841579 -0.9596068 0.9996295 0.9841579 -0.959928 0.9996295 0.9841579 -0.9603343 0.9996295 0.9841579 -0.9608482 0.9996295 0.9841579 -0.9614985 0.9996295 0.9841579 -0.9623212 0.9996295 0.9841579 -0.963362 0.9996295 0.9841579 -0.9646787 0.9996295 0.9841579 -0.9663445 0.9996295 0.9841579 -0.968452 0.9996295 0.9841579 -0.9711183 0.9996295 0.9841579 -0.9744915 0.9996295 0.9841579 -0.978759 0.9996295 0.9841579 -0.9841579 0.9996295 0.9841579 -0.9909882 0.9996295 0.9841579 -0.9996295 0.9996295 0.9841579 -0.9997074 0.9928267 0.983089 -0.9997688 0.9899741 0.9838545 -0.9998174 0.989325 0.9854838 -0.9998557 0.9898295 0.9874207 -0.999886 0.9908712 0.9893618 -0.9999099 0.9920999 0.9911547 -0.9999288 0.9933261 0.9927345 -0.9999437 0.9944556 0.9940854 -0.9668873 0.9997074 0.9830954 -0.9668872 0.9997074 0.9830953 -0.9668871 0.9997074 0.9830952 -0.966887 0.9997074 0.983095 -0.9668869 0.9997074 0.9830949 -0.9668867 0.9997074 0.9830947 -0.9668865 0.9997074 0.9830944 -0.9668862 0.9997074 0.9830941 -0.9668859 0.9997074 0.9830937 -0.9668855 0.9997074 0.9830932 -0.9668852 0.9997074 0.9830927 -0.9668848 0.9997074 0.983092 -0.9668845 0.9997074 0.9830913 -0.9668844 0.9997074 0.9830905 -0.9668847 0.9997074 0.9830898 -0.9668859 0.9997074 0.9830892 -0.9668884 0.9997074 0.983089 -0.9668922 0.9997074 0.983089 -0.9668969 0.9997074 0.983089 -0.9669028 0.9997074 0.983089 -0.9669103 0.9997074 0.983089 -0.9669198 0.9997074 0.983089 -0.9669318 0.9997074 0.983089 -0.966947 0.9997074 0.983089 -0.9669663 0.9997074 0.983089 -0.9669906 0.9997074 0.983089 -0.9670214 0.9997074 0.983089 -0.9670604 0.9997074 0.983089 -0.9671097 0.9997074 0.983089 -0.967172 0.9997074 0.983089 -0.9672509 0.9997074 0.983089 -0.9673508 0.9997074 0.983089 -0.967477 0.9997074 0.983089 -0.9676368 0.9997074 0.983089 -0.9678389 0.9997074 0.983089 -0.9680946 0.9997074 0.983089 -0.9684181 0.9997074 0.983089 -0.9688274 0.9997074 0.983089 -0.9693452 0.9997074 0.983089 -0.9700002 0.9997074 0.983089 -0.970829 0.9997074 0.983089 -0.9718774 0.9997074 0.983089 -0.9732039 0.9997074 0.983089 -0.974882 0.9997074 0.983089 -0.977005 0.9997074 0.983089 -0.9796909 0.9997074 0.983089 -0.983089 0.9997074 0.983089 -0.9873879 0.9997074 0.983089 -0.9928267 0.9997074 0.983089 -0.9997074 0.9997074 0.983089 -0.9997688 0.9942982 0.9838545 -0.9998174 0.9920392 0.9854838 -0.9998557 0.9915316 0.9874207 -0.999886 0.9919377 0.9893618 -0.9999099 0.9927678 0.9911547 -0.9999288 0.9937442 0.9927345 -0.9999437 0.9947172 0.9940854 -0.9736726 0.9997689 0.9838593 -0.9736726 0.9997689 0.9838592 -0.9736725 0.9997689 0.9838591 -0.9736724 0.9997689 0.983859 -0.9736723 0.9997689 0.9838589 -0.9736722 0.9997689 0.9838588 -0.9736721 0.9997689 0.9838586 -0.9736719 0.9997689 0.9838583 -0.9736717 0.9997689 0.983858 -0.9736715 0.9997689 0.9838577 -0.9736712 0.9997689 0.9838573 -0.973671 0.9997689 0.9838568 -0.9736708 0.9997689 0.9838562 -0.9736708 0.9997689 0.9838556 -0.973671 0.9997688 0.9838551 -0.9736717 0.9997688 0.9838546 -0.9736733 0.9997688 0.9838545 -0.9736756 0.9997688 0.9838545 -0.9736786 0.9997688 0.9838545 -0.9736823 0.9997688 0.9838545 -0.973687 0.9997688 0.9838545 -0.973693 0.9997688 0.9838545 -0.9737006 0.9997688 0.9838545 -0.9737101 0.9997688 0.9838545 -0.9737222 0.9997688 0.9838545 -0.9737375 0.9997688 0.9838545 -0.9737569 0.9997688 0.9838545 -0.9737814 0.9997688 0.9838545 -0.9738123 0.9997688 0.9838545 -0.9738515 0.9997688 0.9838545 -0.9739011 0.9997688 0.9838545 -0.9739638 0.9997688 0.9838545 -0.9740432 0.9997688 0.9838545 -0.9741436 0.9997688 0.9838545 -0.9742706 0.9997688 0.9838545 -0.9744313 0.9997688 0.9838545 -0.9746346 0.9997688 0.9838545 -0.9748918 0.9997688 0.9838545 -0.9752172 0.9997688 0.9838545 -0.9756289 0.9997688 0.9838545 -0.9761497 0.9997688 0.9838545 -0.9768086 0.9997688 0.9838545 -0.9776422 0.9997688 0.9838545 -0.9786968 0.9997688 0.9838545 -0.980031 0.9997688 0.9838545 -0.981719 0.9997688 0.9838545 -0.9838545 0.9997688 0.9838545 -0.9865561 0.9997688 0.9838545 -0.9899741 0.9997688 0.9838545 -0.9942982 0.9997688 0.9838545 -0.9997688 0.9997688 0.9838545 -0.9998174 0.9954731 0.9854838 -0.9998557 0.9936849 0.9874207 -0.999886 0.993287 0.9893618 -0.9999099 0.9936128 0.9911547 -0.9999288 0.9942731 0.9927345 -0.9999437 0.9950481 0.9940854 -0.9790927 0.9998174 0.9854872 -0.9790927 0.9998174 0.9854872 -0.9790927 0.9998174 0.9854871 -0.9790926 0.9998174 0.985487 -0.9790925 0.9998174 0.9854869 -0.9790925 0.9998174 0.9854868 -0.9790924 0.9998174 0.9854867 -0.9790923 0.9998174 0.9854865 -0.9790921 0.9998174 0.9854863 -0.979092 0.9998174 0.9854861 -0.9790919 0.9998174 0.9854858 -0.9790917 0.9998174 0.9854854 -0.9790916 0.9998174 0.985485 -0.9790916 0.9998174 0.9854846 -0.9790917 0.9998174 0.9854842 -0.9790921 0.9998174 0.9854839 -0.9790931 0.9998174 0.9854838 -0.9790946 0.9998174 0.9854838 -0.9790965 0.9998174 0.9854838 -0.9790988 0.9998174 0.9854838 -0.9791018 0.9998174 0.9854838 -0.9791055 0.9998174 0.9854838 -0.9791103 0.9998174 0.9854838 -0.9791163 0.9998174 0.9854838 -0.9791238 0.9998174 0.9854838 -0.9791334 0.9998174 0.9854838 -0.9791456 0.9998174 0.9854838 -0.979161 0.9998174 0.9854838 -0.9791804 0.9998174 0.9854838 -0.979205 0.9998174 0.9854838 -0.9792361 0.9998174 0.9854838 -0.9792755 0.9998174 0.9854838 -0.9793253 0.9998174 0.9854838 -0.9793883 0.9998174 0.9854838 -0.9794681 0.9998174 0.9854838 -0.9795689 0.9998174 0.9854838 -0.9796966 0.9998174 0.9854838 -0.979858 0.9998174 0.9854838 -0.9800622 0.9998174 0.9854838 -0.9803206 0.9998174 0.9854838 -0.9806476 0.9998174 0.9854838 -0.9810611 0.9998174 0.9854838 -0.9815844 0.9998174 0.9854838 -0.9822464 0.9998174 0.9854838 -0.9830838 0.9998174 0.9854838 -0.9841433 0.9998174 0.9854838 -0.9854838 0.9998174 0.9854838 -0.9871796 0.9998174 0.9854838 -0.989325 0.9998174 0.9854838 -0.9920392 0.9998174 0.9854838 -0.9954731 0.9998174 0.9854838 -0.9998174 0.9998174 0.9854838 -0.9998557 0.9964092 0.9874207 -0.999886 0.9949941 0.9893618 -0.9999099 0.9946818 0.9911547 -0.9999288 0.9949422 0.9927345 -0.9999437 0.9954668 0.9940854 -0.9834129 0.9998557 0.9874231 -0.9834129 0.9998557 0.987423 -0.9834129 0.9998557 0.987423 -0.9834129 0.9998557 0.9874229 -0.9834128 0.9998557 0.9874229 -0.9834128 0.9998557 0.9874228 -0.9834127 0.9998557 0.9874227 -0.9834127 0.9998557 0.9874226 -0.9834126 0.9998557 0.9874224 -0.9834125 0.9998557 0.9874223 -0.9834124 0.9998557 0.9874221 -0.9834123 0.9998557 0.9874218 -0.9834122 0.9998557 0.9874216 -0.9834122 0.9998557 0.9874213 -0.9834123 0.9998557 0.987421 -0.9834126 0.9998557 0.9874208 -0.9834132 0.9998557 0.9874207 -0.9834141 0.9998557 0.9874207 -0.9834153 0.9998557 0.9874207 -0.9834167 0.9998557 0.9874207 -0.9834186 0.9998557 0.9874207 -0.9834209 0.9998557 0.9874207 -0.9834239 0.9998557 0.9874207 -0.9834277 0.9998557 0.9874207 -0.9834324 0.9998557 0.9874207 -0.9834385 0.9998557 0.9874207 -0.9834461 0.9998557 0.9874207 -0.9834557 0.9998557 0.9874207 -0.9834679 0.9998557 0.9874207 -0.9834833 0.9998557 0.9874207 -0.9835029 0.9998557 0.9874207 -0.9835276 0.9998557 0.9874207 -0.9835588 0.9998557 0.9874207 -0.9835983 0.9998557 0.9874207 -0.9836483 0.9998557 0.9874207 -0.9837116 0.9998557 0.9874207 -0.9837916 0.9998557 0.9874207 -0.9838928 0.9998557 0.9874207 -0.9840209 0.9998557 0.9874207 -0.9841829 0.9998557 0.9874207 -0.984388 0.9998557 0.9874207 -0.9846473 0.9998557 0.9874207 -0.9849754 0.9998557 0.9874207 -0.9853905 0.9998557 0.9874207 -0.9859157 0.9998557 0.9874207 -0.9865801 0.9998557 0.9874207 -0.9874207 0.9998557 0.9874207 -0.9884841 0.9998557 0.9874207 -0.9898295 0.9998557 0.9874207 -0.9915316 0.9998557 0.9874207 -0.9936849 0.9998557 0.9874207 -0.9964092 0.9998557 0.9874207 -0.9998557 0.9998557 0.9874207 -0.999886 0.9971537 0.9893618 -0.9999099 0.9960342 0.9911547 -0.9999288 0.9957887 0.9927345 -0.9999437 0.9959964 0.9940854 -0.9868505 0.999886 0.9893634 -0.9868505 0.999886 0.9893634 -0.9868505 0.999886 0.9893633 -0.9868505 0.999886 0.9893633 -0.9868504 0.999886 0.9893633 -0.9868504 0.999886 0.9893632 -0.9868504 0.999886 0.9893632 -0.9868503 0.999886 0.9893631 -0.9868503 0.999886 0.989363 -0.9868502 0.999886 0.9893629 -0.9868502 0.999886 0.9893627 -0.9868501 0.999886 0.9893626 -0.9868501 0.999886 0.9893624 -0.98685 0.999886 0.9893622 -0.9868501 0.999886 0.989362 -0.9868503 0.999886 0.9893619 -0.9868507 0.999886 0.9893618 -0.9868512 0.999886 0.9893618 -0.986852 0.999886 0.9893618 -0.9868529 0.999886 0.9893618 -0.9868541 0.999886 0.9893618 -0.9868555 0.999886 0.9893618 -0.9868574 0.999886 0.9893618 -0.9868597 0.999886 0.9893618 -0.9868627 0.999886 0.9893618 -0.9868665 0.999886 0.9893618 -0.9868713 0.999886 0.9893618 -0.9868773 0.999886 0.9893618 -0.986885 0.999886 0.9893618 -0.9868946 0.999886 0.9893618 -0.9869069 0.999886 0.9893618 -0.9869223 0.999886 0.9893618 -0.9869419 0.999886 0.9893618 -0.9869667 0.999886 0.9893618 -0.986998 0.999886 0.9893618 -0.9870376 0.999886 0.9893618 -0.9870878 0.999886 0.9893618 -0.9871512 0.999886 0.9893618 -0.9872315 0.999886 0.9893618 -0.987333 0.999886 0.9893618 -0.9874615 0.999886 0.9893618 -0.987624 0.999886 0.9893618 -0.9878296 0.999886 0.9893618 -0.9880897 0.999886 0.9893618 -0.9884188 0.999886 0.9893618 -0.9888351 0.999886 0.9893618 -0.9893618 0.999886 0.9893618 -0.9900282 0.999886 0.9893618 -0.9908712 0.999886 0.9893618 -0.9919377 0.999886 0.9893618 -0.993287 0.999886 0.9893618 -0.9949941 0.999886 0.9893618 -0.9971537 0.999886 0.9893618 -0.999886 0.999886 0.9893618 -0.9999099 0.9977452 0.9911547 -0.9999288 0.9968597 0.9927345 -0.9999437 0.9966665 0.9940854 -0.989582 0.9999099 0.9911557 -0.989582 0.9999099 0.9911557 -0.989582 0.9999099 0.9911557 -0.989582 0.9999099 0.9911557 -0.989582 0.9999099 0.9911556 -0.9895819 0.9999099 0.9911556 -0.9895819 0.9999099 0.9911556 -0.9895819 0.9999099 0.9911555 -0.9895819 0.9999099 0.9911554 -0.9895818 0.9999099 0.9911554 -0.9895818 0.9999099 0.9911553 -0.9895818 0.9999099 0.9911552 -0.9895817 0.9999099 0.991155 -0.9895817 0.9999099 0.9911549 -0.9895817 0.9999099 0.9911548 -0.9895819 0.9999099 0.9911547 -0.9895821 0.9999099 0.9911547 -0.9895825 0.9999099 0.9911547 -0.9895829 0.9999099 0.9911547 -0.9895835 0.9999099 0.9911547 -0.9895842 0.9999099 0.9911547 -0.9895851 0.9999099 0.9911547 -0.9895863 0.9999099 0.9911547 -0.9895878 0.9999099 0.9911547 -0.9895897 0.9999099 0.9911547 -0.989592 0.9999099 0.9911547 -0.989595 0.9999099 0.9911547 -0.9895988 0.9999099 0.9911547 -0.9896036 0.9999099 0.9911547 -0.9896096 0.9999099 0.9911547 -0.9896173 0.9999099 0.9911547 -0.989627 0.9999099 0.9911547 -0.9896392 0.9999099 0.9911547 -0.9896547 0.9999099 0.9911547 -0.9896744 0.9999099 0.9911547 -0.9896992 0.9999099 0.9911547 -0.9897306 0.9999099 0.9911547 -0.9897703 0.9999099 0.9911547 -0.9898206 0.9999099 0.9911547 -0.9898842 0.9999099 0.9911547 -0.9899646 0.9999099 0.9911547 -0.9900664 0.9999099 0.9911547 -0.9901951 0.9999099 0.9911547 -0.990358 0.9999099 0.9911547 -0.9905641 0.9999099 0.9911547 -0.9908248 0.9999099 0.9911547 -0.9911547 0.9999099 0.9911547 -0.991572 0.9999099 0.9911547 -0.9920999 0.9999099 0.9911547 -0.9927678 0.9999099 0.9911547 -0.9936128 0.9999099 0.9911547 -0.9946818 0.9999099 0.9911547 -0.9960342 0.9999099 0.9911547 -0.9977452 0.9999099 0.9911547 -0.9999099 0.9999099 0.9911547 -0.9999288 0.9982146 0.9927345 -0.9999437 0.9975143 0.9940854 -0.9917501 0.9999288 0.9927351 -0.9917501 0.9999288 0.9927351 -0.9917501 0.9999288 0.9927351 -0.9917501 0.9999288 0.9927351 -0.9917501 0.9999288 0.9927351 -0.9917501 0.9999288 0.9927351 -0.99175 0.9999288 0.992735 -0.99175 0.9999288 0.992735 -0.99175 0.9999288 0.992735 -0.99175 0.9999288 0.9927349 -0.99175 0.9999288 0.9927349 -0.9917499 0.9999288 0.9927348 -0.9917499 0.9999288 0.9927347 -0.9917499 0.9999288 0.9927346 -0.9917499 0.9999288 0.9927346 -0.99175 0.9999288 0.9927345 -0.9917502 0.9999288 0.9927345 -0.9917504 0.9999288 0.9927345 -0.9917507 0.9999288 0.9927345 -0.991751 0.9999288 0.9927345 -0.9917515 0.9999288 0.9927345 -0.9917521 0.9999288 0.9927345 -0.9917528 0.9999288 0.9927345 -0.9917537 0.9999288 0.9927345 -0.9917549 0.9999288 0.9927345 -0.9917564 0.9999288 0.9927345 -0.9917582 0.9999288 0.9927345 -0.9917606 0.9999288 0.9927345 -0.9917636 0.9999288 0.9927345 -0.9917674 0.9999288 0.9927345 -0.9917722 0.9999288 0.9927345 -0.9917782 0.9999288 0.9927345 -0.9917859 0.9999288 0.9927345 -0.9917956 0.9999288 0.9927345 -0.9918079 0.9999288 0.9927345 -0.9918234 0.9999288 0.9927345 -0.9918431 0.9999288 0.9927345 -0.991868 0.9999288 0.9927345 -0.9918994 0.9999288 0.9927345 -0.9919392 0.9999288 0.9927345 -0.9919896 0.9999288 0.9927345 -0.9920533 0.9999288 0.9927345 -0.9921339 0.9999288 0.9927345 -0.9922358 0.9999288 0.9927345 -0.9923648 0.9999288 0.9927345 -0.992528 0.9999288 0.9927345 -0.9927345 0.9999288 0.9927345 -0.9929957 0.9999288 0.9927345 -0.9933261 0.9999288 0.9927345 -0.9937442 0.9999288 0.9927345 -0.9942731 0.9999288 0.9927345 -0.9949422 0.9999288 0.9927345 -0.9957887 0.9999288 0.9927345 -0.9968597 0.9999288 0.9927345 -0.9982146 0.9999288 0.9927345 -0.9999288 0.9999288 0.9927345 -0.9999437 0.9985868 0.9940854 -0.9934695 0.9999437 0.9940858 -0.9934695 0.9999437 0.9940858 -0.9934695 0.9999437 0.9940858 -0.9934695 0.9999437 0.9940858 -0.9934695 0.9999437 0.9940858 -0.9934695 0.9999437 0.9940858 -0.9934695 0.9999437 0.9940858 -0.9934694 0.9999437 0.9940858 -0.9934694 0.9999437 0.9940857 -0.9934694 0.9999437 0.9940857 -0.9934694 0.9999437 0.9940857 -0.9934694 0.9999437 0.9940856 -0.9934694 0.9999437 0.9940856 -0.9934694 0.9999437 0.9940855 -0.9934694 0.9999437 0.9940855 -0.9934694 0.9999437 0.9940854 -0.9934695 0.9999437 0.9940854 -0.9934697 0.9999437 0.9940854 -0.9934698 0.9999437 0.9940854 -0.9934701 0.9999437 0.9940854 -0.9934704 0.9999437 0.9940854 -0.9934707 0.9999437 0.9940854 -0.9934712 0.9999437 0.9940854 -0.9934718 0.9999437 0.9940854 -0.9934725 0.9999437 0.9940854 -0.9934734 0.9999437 0.9940854 -0.9934746 0.9999437 0.9940854 -0.9934761 0.9999437 0.9940854 -0.9934779 0.9999437 0.9940854 -0.9934803 0.9999437 0.9940854 -0.9934833 0.9999437 0.9940854 -0.9934871 0.9999437 0.9940854 -0.9934919 0.9999437 0.9940854 -0.993498 0.9999437 0.9940854 -0.9935057 0.9999437 0.9940854 -0.9935154 0.9999437 0.9940854 -0.9935277 0.9999437 0.9940854 -0.9935432 0.9999437 0.9940854 -0.9935629 0.9999437 0.9940854 -0.9935878 0.9999437 0.9940854 -0.9936193 0.9999437 0.9940854 -0.9936592 0.9999437 0.9940854 -0.9937096 0.9999437 0.9940854 -0.9937734 0.9999437 0.9940854 -0.9938541 0.9999437 0.9940854 -0.9939562 0.9999437 0.9940854 -0.9940854 0.9999437 0.9940854 -0.9942488 0.9999437 0.9940854 -0.9944556 0.9999437 0.9940854 -0.9947172 0.9999437 0.9940854 -0.9950481 0.9999437 0.9940854 -0.9954668 0.9999437 0.9940854 -0.9959964 0.9999437 0.9940854 -0.9966665 0.9999437 0.9940854 -0.9975143 0.9999437 0.9940854 -0.9985868 0.9999437 0.9940854 -0.9999437 0.9999437 0.9940854 -0.9478754 0.9478754 0.999531 -0.9478756 0.9478754 0.999531 -0.9478759 0.9478754 0.999531 -0.9478762 0.9478754 0.999531 -0.9478767 0.9478754 0.999531 -0.9478772 0.9478754 0.999531 -0.9478779 0.9478754 0.999531 -0.9478788 0.9478754 0.999531 -0.9478799 0.9478754 0.999531 -0.9478814 0.9478754 0.999531 -0.9478832 0.9478754 0.999531 -0.9478854 0.9478754 0.999531 -0.9478883 0.9478754 0.999531 -0.947892 0.9478754 0.999531 -0.9478966 0.9478754 0.999531 -0.9479024 0.9478754 0.999531 -0.9479098 0.9478754 0.999531 -0.9479192 0.9478754 0.999531 -0.947931 0.9478754 0.999531 -0.9479459 0.9478754 0.999531 -0.9479648 0.9478754 0.999531 -0.9479888 0.9478754 0.999531 -0.948019 0.9478754 0.999531 -0.9480573 0.9478754 0.999531 -0.9481058 0.9478754 0.999531 -0.9481671 0.9478754 0.999531 -0.9482447 0.9478754 0.999531 -0.9483428 0.9478754 0.999531 -0.9484669 0.9478754 0.999531 -0.9486239 0.9478754 0.999531 -0.9488226 0.9478754 0.999531 -0.949074 0.9478754 0.999531 -0.949392 0.9478754 0.999531 -0.9497943 0.9478754 0.999531 -0.9503032 0.9478754 0.999531 -0.9509472 0.9478754 0.999531 -0.9517618 0.9478754 0.999531 -0.9527924 0.9478754 0.999531 -0.9540963 0.9478754 0.999531 -0.9557458 0.9478754 0.999531 -0.9578327 0.9478754 0.999531 -0.9604729 0.9478754 0.999531 -0.9638131 0.9478754 0.999531 -0.9680389 0.9478754 0.999531 -0.9733851 0.9478754 0.999531 -0.9801487 0.9478754 0.999531 -0.9887055 0.9478754 0.999531 -0.999531 0.9478754 0.999531 -0.9996296 0.958416 0.9909925 -0.9997074 0.9668873 0.9873927 -0.9997689 0.9736726 0.9865601 -0.9998174 0.9790927 0.9871826 -0.9998557 0.9834129 0.9884863 -0.999886 0.9868505 0.9900297 -0.9999099 0.989582 0.991573 -0.9999288 0.9917501 0.9929963 -0.9999437 0.9934695 0.9942493 -0.9478754 0.9478756 0.999531 -0.9478752 0.9478752 0.999531 -0.9478755 0.9478752 0.999531 -0.9478758 0.9478752 0.999531 -0.9478763 0.9478752 0.999531 -0.9478768 0.9478752 0.999531 -0.9478775 0.9478752 0.999531 -0.9478784 0.9478752 0.999531 -0.9478795 0.9478752 0.999531 -0.947881 0.9478752 0.999531 -0.9478828 0.9478752 0.999531 -0.947885 0.9478752 0.999531 -0.9478879 0.9478752 0.999531 -0.9478916 0.9478752 0.999531 -0.9478962 0.9478752 0.999531 -0.947902 0.9478752 0.999531 -0.9479094 0.9478752 0.999531 -0.9479187 0.9478752 0.999531 -0.9479306 0.9478752 0.999531 -0.9479455 0.9478752 0.999531 -0.9479644 0.9478752 0.999531 -0.9479884 0.9478752 0.999531 -0.9480186 0.9478752 0.999531 -0.9480569 0.9478752 0.999531 -0.9481054 0.9478752 0.999531 -0.9481667 0.9478752 0.999531 -0.9482442 0.9478752 0.999531 -0.9483424 0.9478752 0.999531 -0.9484665 0.9478752 0.999531 -0.9486235 0.9478752 0.999531 -0.9488222 0.9478752 0.999531 -0.9490736 0.9478752 0.999531 -0.9493916 0.9478752 0.999531 -0.9497939 0.9478752 0.999531 -0.9503028 0.9478752 0.999531 -0.9509468 0.9478752 0.999531 -0.9517614 0.9478752 0.999531 -0.952792 0.9478752 0.999531 -0.9540959 0.9478752 0.999531 -0.9557455 0.9478752 0.999531 -0.9578324 0.9478752 0.999531 -0.9604726 0.9478752 0.999531 -0.9638128 0.9478752 0.999531 -0.9680386 0.9478752 0.999531 -0.9733849 0.9478752 0.999531 -0.9801485 0.9478752 0.999531 -0.9887054 0.9478752 0.999531 -0.999531 0.9478752 0.999531 -0.9996296 0.9584159 0.9909924 -0.9997074 0.9668872 0.9873926 -0.9997689 0.9736726 0.9865601 -0.9998174 0.9790927 0.9871826 -0.9998557 0.9834129 0.9884863 -0.999886 0.9868505 0.9900296 -0.9999099 0.989582 0.9915729 -0.9999288 0.9917501 0.9929963 -0.9999437 0.9934695 0.9942492 -0.9478754 0.9478759 0.999531 -0.9478752 0.9478755 0.999531 -0.947875 0.947875 0.999531 -0.9478753 0.947875 0.999531 -0.9478757 0.947875 0.999531 -0.9478763 0.947875 0.999531 -0.947877 0.947875 0.999531 -0.9478779 0.947875 0.999531 -0.947879 0.947875 0.999531 -0.9478804 0.947875 0.999531 -0.9478822 0.947875 0.999531 -0.9478845 0.947875 0.999531 -0.9478874 0.947875 0.999531 -0.947891 0.947875 0.999531 -0.9478957 0.947875 0.999531 -0.9479015 0.947875 0.999531 -0.9479089 0.947875 0.999531 -0.9479182 0.947875 0.999531 -0.94793 0.947875 0.999531 -0.947945 0.947875 0.999531 -0.9479639 0.947875 0.999531 -0.9479878 0.947875 0.999531 -0.9480181 0.947875 0.999531 -0.9480564 0.947875 0.999531 -0.9481049 0.947875 0.999531 -0.9481662 0.947875 0.999531 -0.9482437 0.947875 0.999531 -0.9483418 0.947875 0.999531 -0.948466 0.947875 0.999531 -0.948623 0.947875 0.999531 -0.9488217 0.947875 0.999531 -0.9490731 0.947875 0.999531 -0.9493911 0.947875 0.999531 -0.9497934 0.947875 0.999531 -0.9503023 0.947875 0.999531 -0.9509463 0.947875 0.999531 -0.9517609 0.947875 0.999531 -0.9527916 0.947875 0.999531 -0.9540954 0.947875 0.999531 -0.955745 0.947875 0.999531 -0.957832 0.947875 0.999531 -0.9604722 0.947875 0.999531 -0.9638125 0.947875 0.999531 -0.9680383 0.947875 0.999531 -0.9733846 0.947875 0.999531 -0.9801483 0.947875 0.999531 -0.9887053 0.947875 0.999531 -0.999531 0.947875 0.999531 -0.9996296 0.9584157 0.9909923 -0.9997074 0.9668871 0.9873925 -0.9997689 0.9736725 0.98656 -0.9998174 0.9790927 0.9871825 -0.9998557 0.9834129 0.9884862 -0.999886 0.9868505 0.9900296 -0.9999099 0.989582 0.9915729 -0.9999288 0.9917501 0.9929963 -0.9999437 0.9934695 0.9942492 -0.9478754 0.9478762 0.999531 -0.9478752 0.9478758 0.999531 -0.947875 0.9478753 0.999531 -0.9478746 0.9478746 0.999531 -0.9478751 0.9478746 0.999531 -0.9478756 0.9478746 0.999531 -0.9478763 0.9478746 0.999531 -0.9478772 0.9478746 0.999531 -0.9478784 0.9478746 0.999531 -0.9478798 0.9478746 0.999531 -0.9478816 0.9478746 0.999531 -0.9478839 0.9478746 0.999531 -0.9478867 0.9478746 0.999531 -0.9478904 0.9478746 0.999531 -0.947895 0.9478746 0.999531 -0.9479008 0.9478746 0.999531 -0.9479082 0.9478746 0.999531 -0.9479176 0.9478746 0.999531 -0.9479294 0.9478746 0.999531 -0.9479443 0.9478746 0.999531 -0.9479633 0.9478746 0.999531 -0.9479872 0.9478746 0.999531 -0.9480175 0.9478746 0.999531 -0.9480558 0.9478746 0.999531 -0.9481042 0.9478746 0.999531 -0.9481655 0.9478746 0.999531 -0.9482431 0.9478746 0.999531 -0.9483412 0.9478746 0.999531 -0.9484653 0.9478746 0.999531 -0.9486224 0.9478746 0.999531 -0.9488211 0.9478746 0.999531 -0.9490724 0.9478746 0.999531 -0.9493904 0.9478746 0.999531 -0.9497927 0.9478746 0.999531 -0.9503017 0.9478746 0.999531 -0.9509457 0.9478746 0.999531 -0.9517603 0.9478746 0.999531 -0.952791 0.9478746 0.999531 -0.9540949 0.9478746 0.999531 -0.9557445 0.9478746 0.999531 -0.9578314 0.9478746 0.999531 -0.9604717 0.9478746 0.999531 -0.963812 0.9478746 0.999531 -0.9680379 0.9478746 0.999531 -0.9733843 0.9478746 0.999531 -0.9801481 0.9478746 0.999531 -0.9887052 0.9478746 0.999531 -0.999531 0.9478746 0.999531 -0.9996296 0.9584155 0.9909923 -0.9997074 0.966887 0.9873924 -0.9997689 0.9736724 0.9865599 -0.9998174 0.9790926 0.9871825 -0.9998557 0.9834129 0.9884862 -0.999886 0.9868505 0.9900296 -0.9999099 0.989582 0.9915729 -0.9999288 0.9917501 0.9929963 -0.9999437 0.9934695 0.9942492 -0.9478754 0.9478767 0.999531 -0.9478752 0.9478763 0.999531 -0.947875 0.9478757 0.999531 -0.9478746 0.9478751 0.999531 -0.9478743 0.9478743 0.999531 -0.9478748 0.9478743 0.999531 -0.9478755 0.9478743 0.999531 -0.9478764 0.9478743 0.999531 -0.9478775 0.9478743 0.999531 -0.947879 0.9478743 0.999531 -0.9478808 0.9478743 0.999531 -0.947883 0.9478743 0.999531 -0.9478859 0.9478743 0.999531 -0.9478896 0.9478743 0.999531 -0.9478942 0.9478743 0.999531 -0.9479 0.9478743 0.999531 -0.9479074 0.9478743 0.999531 -0.9479168 0.9478743 0.999531 -0.9479286 0.9478743 0.999531 -0.9479435 0.9478743 0.999531 -0.9479624 0.9478743 0.999531 -0.9479864 0.9478743 0.999531 -0.9480166 0.9478743 0.999531 -0.9480549 0.9478743 0.999531 -0.9481034 0.9478743 0.999531 -0.9481647 0.9478743 0.999531 -0.9482423 0.9478743 0.999531 -0.9483404 0.9478743 0.999531 -0.9484645 0.9478743 0.999531 -0.9486216 0.9478743 0.999531 -0.9488203 0.9478743 0.999531 -0.9490716 0.9478743 0.999531 -0.9493896 0.9478743 0.999531 -0.949792 0.9478743 0.999531 -0.950301 0.9478743 0.999531 -0.9509449 0.9478743 0.999531 -0.9517596 0.9478743 0.999531 -0.9527902 0.9478743 0.999531 -0.9540941 0.9478743 0.999531 -0.9557438 0.9478743 0.999531 -0.9578308 0.9478743 0.999531 -0.9604711 0.9478743 0.999531 -0.9638114 0.9478743 0.999531 -0.9680374 0.9478743 0.999531 -0.9733838 0.9478743 0.999531 -0.9801478 0.9478743 0.999531 -0.988705 0.9478743 0.999531 -0.999531 0.9478743 0.999531 -0.9996296 0.9584153 0.9909921 -0.9997074 0.9668869 0.9873923 -0.9997689 0.9736723 0.9865598 -0.9998174 0.9790925 0.9871824 -0.9998557 0.9834128 0.9884861 -0.999886 0.9868504 0.9900295 -0.9999099 0.989582 0.9915729 -0.9999288 0.9917501 0.9929963 -0.9999437 0.9934695 0.9942492 -0.9478754 0.9478772 0.999531 -0.9478752 0.9478768 0.999531 -0.947875 0.9478763 0.999531 -0.9478746 0.9478756 0.999531 -0.9478743 0.9478748 0.999531 -0.9478738 0.9478738 0.999531 -0.9478745 0.9478738 0.999531 -0.9478754 0.9478738 0.999531 -0.9478765 0.9478738 0.999531 -0.947878 0.9478738 0.999531 -0.9478798 0.9478738 0.999531 -0.947882 0.9478738 0.999531 -0.9478849 0.9478738 0.999531 -0.9478886 0.9478738 0.999531 -0.9478932 0.9478738 0.999531 -0.947899 0.9478738 0.999531 -0.9479064 0.9478738 0.999531 -0.9479157 0.9478738 0.999531 -0.9479276 0.9478738 0.999531 -0.9479425 0.9478738 0.999531 -0.9479614 0.9478738 0.999531 -0.9479854 0.9478738 0.999531 -0.9480156 0.9478738 0.999531 -0.9480539 0.9478738 0.999531 -0.9481024 0.9478738 0.999531 -0.9481637 0.9478738 0.999531 -0.9482413 0.9478738 0.999531 -0.9483394 0.9478738 0.999531 -0.9484635 0.9478738 0.999531 -0.9486206 0.9478738 0.999531 -0.9488193 0.9478738 0.999531 -0.9490706 0.9478738 0.999531 -0.9493887 0.9478738 0.999531 -0.949791 0.9478738 0.999531 -0.9503 0.9478738 0.999531 -0.9509439 0.9478738 0.999531 -0.9517586 0.9478738 0.999531 -0.9527893 0.9478738 0.999531 -0.9540933 0.9478738 0.999531 -0.9557429 0.9478738 0.999531 -0.95783 0.9478738 0.999531 -0.9604703 0.9478738 0.999531 -0.9638107 0.9478738 0.999531 -0.9680368 0.9478738 0.999531 -0.9733833 0.9478738 0.999531 -0.9801474 0.9478738 0.999531 -0.9887048 0.9478738 0.999531 -0.999531 0.9478738 0.999531 -0.9996296 0.958415 0.990992 -0.9997074 0.9668867 0.9873922 -0.9997689 0.9736722 0.9865597 -0.9998174 0.9790925 0.9871823 -0.9998557 0.9834128 0.988486 -0.999886 0.9868504 0.9900295 -0.9999099 0.9895819 0.9915728 -0.9999288 0.9917501 0.9929962 -0.9999437 0.9934695 0.9942492 -0.9478754 0.9478779 0.999531 -0.9478752 0.9478775 0.999531 -0.947875 0.947877 0.999531 -0.9478746 0.9478763 0.999531 -0.9478743 0.9478755 0.999531 -0.9478738 0.9478745 0.999531 -0.9478733 0.9478733 0.999531 -0.9478742 0.9478733 0.999531 -0.9478753 0.9478733 0.999531 -0.9478767 0.9478733 0.999531 -0.9478785 0.9478733 0.999531 -0.9478808 0.9478733 0.999531 -0.9478837 0.9478733 0.999531 -0.9478873 0.9478733 0.999531 -0.9478919 0.9478733 0.999531 -0.9478978 0.9478733 0.999531 -0.9479051 0.9478733 0.999531 -0.9479145 0.9478733 0.999531 -0.9479263 0.9478733 0.999531 -0.9479413 0.9478733 0.999531 -0.9479602 0.9478733 0.999531 -0.9479841 0.9478733 0.999531 -0.9480144 0.9478733 0.999531 -0.9480527 0.9478733 0.999531 -0.9481011 0.9478733 0.999531 -0.9481624 0.9478733 0.999531 -0.94824 0.9478733 0.999531 -0.9483381 0.9478733 0.999531 -0.9484623 0.9478733 0.999531 -0.9486193 0.9478733 0.999531 -0.948818 0.9478733 0.999531 -0.9490694 0.9478733 0.999531 -0.9493874 0.9478733 0.999531 -0.9497898 0.9478733 0.999531 -0.9502988 0.9478733 0.999531 -0.9509428 0.9478733 0.999531 -0.9517575 0.9478733 0.999531 -0.9527882 0.9478733 0.999531 -0.9540921 0.9478733 0.999531 -0.9557418 0.9478733 0.999531 -0.9578289 0.9478733 0.999531 -0.9604694 0.9478733 0.999531 -0.9638099 0.9478733 0.999531 -0.968036 0.9478733 0.999531 -0.9733827 0.9478733 0.999531 -0.9801469 0.9478733 0.999531 -0.9887045 0.9478733 0.999531 -0.999531 0.9478733 0.999531 -0.9996296 0.9584146 0.9909918 -0.9997074 0.9668865 0.987392 -0.9997689 0.9736721 0.9865595 -0.9998174 0.9790924 0.9871822 -0.9998557 0.9834127 0.988486 -0.999886 0.9868504 0.9900294 -0.9999099 0.9895819 0.9915728 -0.9999288 0.99175 0.9929962 -0.9999437 0.9934695 0.9942492 -0.9478754 0.9478788 0.999531 -0.9478752 0.9478784 0.999531 -0.947875 0.9478779 0.999531 -0.9478746 0.9478772 0.999531 -0.9478743 0.9478764 0.999531 -0.9478738 0.9478754 0.999531 -0.9478733 0.9478742 0.999531 -0.9478726 0.9478726 0.999531 -0.9478737 0.9478726 0.999531 -0.9478751 0.9478726 0.999531 -0.947877 0.9478726 0.999531 -0.9478792 0.9478726 0.999531 -0.9478821 0.9478726 0.999531 -0.9478858 0.9478726 0.999531 -0.9478904 0.9478726 0.999531 -0.9478962 0.9478726 0.999531 -0.9479036 0.9478726 0.999531 -0.9479129 0.9478726 0.999531 -0.9479248 0.9478726 0.999531 -0.9479397 0.9478726 0.999531 -0.9479586 0.9478726 0.999531 -0.9479826 0.9478726 0.999531 -0.9480128 0.9478726 0.999531 -0.9480511 0.9478726 0.999531 -0.9480996 0.9478726 0.999531 -0.9481609 0.9478726 0.999531 -0.9482385 0.9478726 0.999531 -0.9483366 0.9478726 0.999531 -0.9484607 0.9478726 0.999531 -0.9486178 0.9478726 0.999531 -0.9488165 0.9478726 0.999531 -0.9490679 0.9478726 0.999531 -0.9493859 0.9478726 0.999531 -0.9497883 0.9478726 0.999531 -0.9502973 0.9478726 0.999531 -0.9509413 0.9478726 0.999531 -0.951756 0.9478726 0.999531 -0.9527868 0.9478726 0.999531 -0.9540908 0.9478726 0.999531 -0.9557405 0.9478726 0.999531 -0.9578277 0.9478726 0.999531 -0.9604682 0.9478726 0.999531 -0.9638088 0.9478726 0.999531 -0.9680351 0.9478726 0.999531 -0.9733819 0.9478726 0.999531 -0.9801463 0.9478726 0.999531 -0.9887042 0.9478726 0.999531 -0.999531 0.9478726 0.999531 -0.9996296 0.9584142 0.9909916 -0.9997074 0.9668862 0.9873917 -0.9997689 0.9736719 0.9865593 -0.9998174 0.9790923 0.987182 -0.9998557 0.9834127 0.9884859 -0.999886 0.9868503 0.9900294 -0.9999099 0.9895819 0.9915728 -0.9999288 0.99175 0.9929962 -0.9999437 0.9934694 0.9942492 -0.9478754 0.9478799 0.999531 -0.9478752 0.9478795 0.999531 -0.947875 0.947879 0.999531 -0.9478746 0.9478784 0.999531 -0.9478743 0.9478775 0.999531 -0.9478738 0.9478765 0.999531 -0.9478733 0.9478753 0.999531 -0.9478726 0.9478737 0.999531 -0.9478718 0.9478718 0.999531 -0.9478733 0.9478718 0.999531 -0.9478751 0.9478718 0.999531 -0.9478773 0.9478718 0.999531 -0.9478802 0.9478718 0.999531 -0.9478839 0.9478718 0.999531 -0.9478885 0.9478718 0.999531 -0.9478943 0.9478718 0.999531 -0.9479017 0.9478718 0.999531 -0.947911 0.9478718 0.999531 -0.9479229 0.9478718 0.999531 -0.9479378 0.9478718 0.999531 -0.9479567 0.9478718 0.999531 -0.9479807 0.9478718 0.999531 -0.9480109 0.9478718 0.999531 -0.9480493 0.9478718 0.999531 -0.9480977 0.9478718 0.999531 -0.948159 0.9478718 0.999531 -0.9482366 0.9478718 0.999531 -0.9483347 0.9478718 0.999531 -0.9484589 0.9478718 0.999531 -0.9486159 0.9478718 0.999531 -0.9488147 0.9478718 0.999531 -0.949066 0.9478718 0.999531 -0.9493841 0.9478718 0.999531 -0.9497865 0.9478718 0.999531 -0.9502955 0.9478718 0.999531 -0.9509395 0.9478718 0.999531 -0.9517543 0.9478718 0.999531 -0.9527851 0.9478718 0.999531 -0.9540891 0.9478718 0.999531 -0.9557389 0.9478718 0.999531 -0.9578262 0.9478718 0.999531 -0.9604668 0.9478718 0.999531 -0.9638075 0.9478718 0.999531 -0.9680339 0.9478718 0.999531 -0.9733809 0.9478718 0.999531 -0.9801456 0.9478718 0.999531 -0.9887038 0.9478718 0.999531 -0.999531 0.9478718 0.999531 -0.9996296 0.9584137 0.9909914 -0.9997074 0.9668859 0.9873914 -0.9997689 0.9736717 0.9865591 -0.9998174 0.9790921 0.9871818 -0.9998557 0.9834126 0.9884857 -0.999886 0.9868503 0.9900293 -0.9999099 0.9895819 0.9915727 -0.9999288 0.99175 0.9929962 -0.9999437 0.9934694 0.9942491 -0.9478754 0.9478814 0.999531 -0.9478752 0.947881 0.999531 -0.947875 0.9478804 0.999531 -0.9478746 0.9478798 0.999531 -0.9478743 0.947879 0.999531 -0.9478738 0.947878 0.999531 -0.9478733 0.9478767 0.999531 -0.9478726 0.9478751 0.999531 -0.9478718 0.9478733 0.999531 -0.947871 0.947871 0.9995309 -0.9478728 0.947871 0.9995309 -0.947875 0.947871 0.9995309 -0.9478779 0.947871 0.9995309 -0.9478816 0.947871 0.9995309 -0.9478862 0.947871 0.9995309 -0.947892 0.947871 0.9995309 -0.9478994 0.947871 0.9995309 -0.9479088 0.947871 0.9995309 -0.9479206 0.947871 0.9995309 -0.9479355 0.947871 0.9995309 -0.9479544 0.947871 0.9995309 -0.9479784 0.947871 0.9995309 -0.9480087 0.947871 0.9995309 -0.948047 0.947871 0.9995309 -0.9480954 0.947871 0.9995309 -0.9481567 0.947871 0.9995309 -0.9482343 0.947871 0.9995309 -0.9483325 0.947871 0.9995309 -0.9484566 0.947871 0.9995309 -0.9486137 0.947871 0.9995309 -0.9488124 0.947871 0.9995309 -0.9490638 0.947871 0.9995309 -0.9493819 0.947871 0.9995309 -0.9497843 0.947871 0.9995309 -0.9502933 0.947871 0.9995309 -0.9509374 0.947871 0.9995309 -0.9517522 0.947871 0.9995309 -0.952783 0.947871 0.9995309 -0.9540871 0.947871 0.9995309 -0.955737 0.947871 0.9995309 -0.9578243 0.947871 0.9995309 -0.960465 0.947871 0.9995309 -0.9638059 0.947871 0.9995309 -0.9680325 0.947871 0.9995309 -0.9733798 0.947871 0.9995309 -0.9801447 0.947871 0.9995309 -0.9887033 0.947871 0.9995309 -0.9995309 0.947871 0.9995309 -0.9996296 0.9584132 0.9909911 -0.9997074 0.9668855 0.9873911 -0.9997689 0.9736715 0.9865588 -0.9998174 0.979092 0.9871816 -0.9998557 0.9834125 0.9884856 -0.999886 0.9868502 0.9900292 -0.9999099 0.9895818 0.9915726 -0.9999288 0.99175 0.9929961 -0.9999437 0.9934694 0.9942491 -0.9478754 0.9478832 0.999531 -0.9478752 0.9478828 0.999531 -0.947875 0.9478822 0.999531 -0.9478746 0.9478816 0.999531 -0.9478743 0.9478808 0.999531 -0.9478738 0.9478798 0.999531 -0.9478733 0.9478785 0.999531 -0.9478726 0.947877 0.999531 -0.9478718 0.9478751 0.999531 -0.947871 0.9478728 0.9995309 -0.94787 0.94787 0.9995309 -0.9478723 0.94787 0.9995309 -0.9478752 0.94787 0.9995309 -0.9478789 0.94787 0.9995309 -0.9478835 0.94787 0.9995309 -0.9478893 0.94787 0.9995309 -0.9478967 0.94787 0.9995309 -0.947906 0.94787 0.9995309 -0.9479179 0.94787 0.9995309 -0.9479328 0.94787 0.9995309 -0.9479517 0.94787 0.9995309 -0.9479757 0.94787 0.9995309 -0.9480059 0.94787 0.9995309 -0.9480443 0.94787 0.9995309 -0.9480927 0.94787 0.9995309 -0.948154 0.94787 0.9995309 -0.9482316 0.94787 0.9995309 -0.9483298 0.94787 0.9995309 -0.9484539 0.94787 0.9995309 -0.948611 0.94787 0.9995309 -0.9488097 0.94787 0.9995309 -0.9490611 0.94787 0.9995309 -0.9493792 0.94787 0.9995309 -0.9497816 0.94787 0.9995309 -0.9502907 0.94787 0.9995309 -0.9509348 0.94787 0.9995309 -0.9517496 0.94787 0.9995309 -0.9527805 0.94787 0.9995309 -0.9540847 0.94787 0.9995309 -0.9557347 0.94787 0.9995309 -0.9578221 0.94787 0.9995309 -0.960463 0.94787 0.9995309 -0.963804 0.94787 0.9995309 -0.9680309 0.94787 0.9995309 -0.9733784 0.94787 0.9995309 -0.9801437 0.94787 0.9995309 -0.9887027 0.94787 0.9995309 -0.9995309 0.94787 0.9995309 -0.9996296 0.9584126 0.9909907 -0.9997074 0.9668852 0.9873907 -0.9997689 0.9736712 0.9865585 -0.9998174 0.9790919 0.9871813 -0.9998557 0.9834124 0.9884854 -0.999886 0.9868502 0.990029 -0.9999099 0.9895818 0.9915725 -0.9999288 0.99175 0.992996 -0.9999437 0.9934694 0.9942491 -0.9478754 0.9478854 0.999531 -0.9478752 0.947885 0.999531 -0.947875 0.9478845 0.999531 -0.9478746 0.9478839 0.999531 -0.9478743 0.947883 0.999531 -0.9478738 0.947882 0.999531 -0.9478733 0.9478808 0.999531 -0.9478726 0.9478792 0.999531 -0.9478718 0.9478773 0.999531 -0.947871 0.947875 0.9995309 -0.94787 0.9478723 0.9995309 -0.9478691 0.9478691 0.9995309 -0.947872 0.9478691 0.9995309 -0.9478757 0.9478691 0.9995309 -0.9478803 0.9478691 0.9995309 -0.9478861 0.9478691 0.9995309 -0.9478935 0.9478691 0.9995309 -0.9479029 0.9478691 0.9995309 -0.9479147 0.9478691 0.9995309 -0.9479296 0.9478691 0.9995309 -0.9479486 0.9478691 0.9995309 -0.9479725 0.9478691 0.9995309 -0.9480028 0.9478691 0.9995309 -0.9480411 0.9478691 0.9995309 -0.9480896 0.9478691 0.9995309 -0.9481509 0.9478691 0.9995309 -0.9482285 0.9478691 0.9995309 -0.9483266 0.9478691 0.9995309 -0.9484508 0.9478691 0.9995309 -0.9486079 0.9478691 0.9995309 -0.9488066 0.9478691 0.9995309 -0.949058 0.9478691 0.9995309 -0.9493761 0.9478691 0.9995309 -0.9497786 0.9478691 0.9995309 -0.9502877 0.9478691 0.9995309 -0.9509318 0.9478691 0.9995309 -0.9517467 0.9478691 0.9995309 -0.9527776 0.9478691 0.9995309 -0.9540819 0.9478691 0.9995309 -0.955732 0.9478691 0.9995309 -0.9578195 0.9478691 0.9995309 -0.9604606 0.9478691 0.9995309 -0.9638018 0.9478691 0.9995309 -0.9680289 0.9478691 0.9995309 -0.9733768 0.9478691 0.9995309 -0.9801425 0.9478691 0.9995309 -0.988702 0.9478691 0.9995309 -0.9995309 0.9478691 0.9995309 -0.9996296 0.958412 0.9909903 -0.9997074 0.9668848 0.9873902 -0.9997689 0.973671 0.986558 -0.9998174 0.9790917 0.987181 -0.9998557 0.9834123 0.9884852 -0.999886 0.9868501 0.9900289 -0.9999099 0.9895818 0.9915724 -0.9999288 0.9917499 0.992996 -0.9999437 0.9934694 0.994249 -0.9478754 0.9478883 0.999531 -0.9478752 0.9478879 0.999531 -0.947875 0.9478874 0.999531 -0.9478746 0.9478867 0.999531 -0.9478743 0.9478859 0.999531 -0.9478738 0.9478849 0.999531 -0.9478733 0.9478837 0.999531 -0.9478726 0.9478821 0.999531 -0.9478718 0.9478802 0.999531 -0.947871 0.9478779 0.9995309 -0.94787 0.9478752 0.9995309 -0.9478691 0.947872 0.9995309 -0.9478684 0.9478684 0.9995309 -0.9478721 0.9478684 0.9995309 -0.9478767 0.9478684 0.9995309 -0.9478825 0.9478684 0.9995309 -0.9478899 0.9478684 0.9995309 -0.9478993 0.9478684 0.9995309 -0.9479111 0.9478684 0.9995309 -0.9479261 0.9478684 0.9995309 -0.947945 0.9478684 0.9995309 -0.9479689 0.9478684 0.9995309 -0.9479992 0.9478684 0.9995309 -0.9480375 0.9478684 0.9995309 -0.948086 0.9478684 0.9995309 -0.9481473 0.9478684 0.9995309 -0.9482249 0.9478684 0.9995309 -0.9483231 0.9478684 0.9995309 -0.9484472 0.9478684 0.9995309 -0.9486043 0.9478684 0.9995309 -0.9488031 0.9478684 0.9995309 -0.9490545 0.9478684 0.9995309 -0.9493727 0.9478684 0.9995309 -0.9497751 0.9478684 0.9995309 -0.9502843 0.9478684 0.9995309 -0.9509284 0.9478684 0.9995309 -0.9517434 0.9478684 0.9995309 -0.9527744 0.9478684 0.9995309 -0.9540788 0.9478684 0.9995309 -0.9557289 0.9478684 0.9995309 -0.9578166 0.9478684 0.9995309 -0.9604579 0.9478684 0.9995309 -0.9637993 0.9478684 0.9995309 -0.9680267 0.9478684 0.9995309 -0.9733749 0.9478684 0.9995309 -0.9801411 0.9478684 0.9995309 -0.9887012 0.9478684 0.9995309 -0.9995309 0.9478684 0.9995309 -0.9996296 0.9584115 0.9909898 -0.9997074 0.9668845 0.9873897 -0.9997689 0.9736708 0.9865576 -0.9998174 0.9790916 0.9871807 -0.9998557 0.9834122 0.9884849 -0.999886 0.9868501 0.9900287 -0.9999099 0.9895817 0.9915723 -0.9999288 0.9917499 0.9929959 -0.9999437 0.9934694 0.994249 -0.9478754 0.947892 0.999531 -0.9478752 0.9478916 0.999531 -0.947875 0.947891 0.999531 -0.9478746 0.9478904 0.999531 -0.9478743 0.9478896 0.999531 -0.9478738 0.9478886 0.999531 -0.9478733 0.9478873 0.999531 -0.9478726 0.9478858 0.999531 -0.9478718 0.9478839 0.999531 -0.947871 0.9478816 0.9995309 -0.94787 0.9478789 0.9995309 -0.9478691 0.9478757 0.9995309 -0.9478684 0.9478721 0.9995309 -0.9478683 0.9478683 0.9995309 -0.9478729 0.9478683 0.9995309 -0.9478787 0.9478683 0.9995309 -0.9478861 0.9478683 0.9995309 -0.9478954 0.9478683 0.9995309 -0.9479073 0.9478683 0.9995309 -0.9479222 0.9478683 0.9995309 -0.9479411 0.9478683 0.9995309 -0.9479651 0.9478683 0.9995309 -0.9479954 0.9478683 0.9995309 -0.9480337 0.9478683 0.9995309 -0.9480822 0.9478683 0.9995309 -0.9481435 0.9478683 0.9995309 -0.9482211 0.9478683 0.9995309 -0.9483193 0.9478683 0.9995309 -0.9484434 0.9478683 0.9995309 -0.9486006 0.9478683 0.9995309 -0.9487993 0.9478683 0.9995309 -0.9490508 0.9478683 0.9995309 -0.9493689 0.9478683 0.9995309 -0.9497714 0.9478683 0.9995309 -0.9502806 0.9478683 0.9995309 -0.9509248 0.9478683 0.9995309 -0.9517398 0.9478683 0.9995309 -0.9527709 0.9478683 0.9995309 -0.9540754 0.9478683 0.9995309 -0.9557257 0.9478683 0.9995309 -0.9578135 0.9478683 0.9995309 -0.9604549 0.9478683 0.9995309 -0.9637967 0.9478683 0.9995309 -0.9680244 0.9478683 0.9995309 -0.973373 0.9478683 0.9995309 -0.9801397 0.9478683 0.9995309 -0.9887004 0.9478683 0.9995309 -0.9995309 0.9478683 0.9995309 -0.9996295 0.9584114 0.9909893 -0.9997074 0.9668844 0.9873891 -0.9997689 0.9736708 0.9865571 -0.9998174 0.9790916 0.9871803 -0.9998557 0.9834122 0.9884846 -0.999886 0.98685 0.9900285 -0.9999099 0.9895817 0.9915722 -0.9999288 0.9917499 0.9929958 -0.9999437 0.9934694 0.9942489 -0.9478754 0.9478966 0.999531 -0.9478752 0.9478962 0.999531 -0.947875 0.9478957 0.999531 -0.9478746 0.947895 0.999531 -0.9478743 0.9478942 0.999531 -0.9478738 0.9478932 0.999531 -0.9478733 0.9478919 0.999531 -0.9478726 0.9478904 0.999531 -0.9478718 0.9478885 0.999531 -0.947871 0.9478862 0.9995309 -0.94787 0.9478835 0.9995309 -0.9478691 0.9478803 0.9995309 -0.9478684 0.9478767 0.9995309 -0.9478683 0.9478729 0.9995309 -0.9478691 0.9478691 0.9995309 -0.947875 0.9478691 0.9995309 -0.9478824 0.9478691 0.9995309 -0.9478917 0.9478691 0.9995309 -0.9479035 0.9478691 0.9995309 -0.9479185 0.9478691 0.9995309 -0.9479374 0.9478691 0.9995309 -0.9479614 0.9478691 0.9995309 -0.9479916 0.9478691 0.9995309 -0.94803 0.9478691 0.9995309 -0.9480785 0.9478691 0.9995309 -0.9481398 0.9478691 0.9995309 -0.9482174 0.9478691 0.9995309 -0.9483155 0.9478691 0.9995309 -0.9484397 0.9478691 0.9995309 -0.9485969 0.9478691 0.9995309 -0.9487957 0.9478691 0.9995309 -0.9490471 0.9478691 0.9995309 -0.9493653 0.9478691 0.9995309 -0.9497678 0.9478691 0.9995309 -0.9502771 0.9478691 0.9995309 -0.9509213 0.9478691 0.9995309 -0.9517364 0.9478691 0.9995309 -0.9527675 0.9478691 0.9995309 -0.9540721 0.9478691 0.9995309 -0.9557225 0.9478691 0.9995309 -0.9578105 0.9478691 0.9995309 -0.9604521 0.9478691 0.9995309 -0.9637941 0.9478691 0.9995309 -0.9680221 0.9478691 0.9995309 -0.9733711 0.9478691 0.9995309 -0.9801383 0.9478691 0.9995309 -0.9886996 0.9478691 0.9995309 -0.9995309 0.9478691 0.9995309 -0.9996295 0.958412 0.9909888 -0.9997074 0.9668847 0.9873885 -0.9997688 0.973671 0.9865566 -0.9998174 0.9790917 0.98718 -0.9998557 0.9834123 0.9884844 -0.999886 0.9868501 0.9900284 -0.9999099 0.9895817 0.9915721 -0.9999288 0.9917499 0.9929957 -0.9999437 0.9934694 0.9942489 -0.9478754 0.9479024 0.999531 -0.9478752 0.947902 0.999531 -0.947875 0.9479015 0.999531 -0.9478746 0.9479008 0.999531 -0.9478743 0.9479 0.999531 -0.9478738 0.947899 0.999531 -0.9478733 0.9478978 0.999531 -0.9478726 0.9478962 0.999531 -0.9478718 0.9478943 0.999531 -0.947871 0.947892 0.9995309 -0.94787 0.9478893 0.9995309 -0.9478691 0.9478861 0.9995309 -0.9478684 0.9478825 0.9995309 -0.9478683 0.9478787 0.9995309 -0.9478691 0.947875 0.9995309 -0.947872 0.947872 0.9995309 -0.9478794 0.947872 0.9995309 -0.9478888 0.947872 0.9995309 -0.9479006 0.947872 0.9995309 -0.9479156 0.947872 0.9995309 -0.9479345 0.947872 0.9995309 -0.9479584 0.947872 0.9995309 -0.9479887 0.947872 0.9995309 -0.948027 0.947872 0.9995309 -0.9480755 0.947872 0.9995309 -0.9481369 0.947872 0.9995309 -0.9482145 0.947872 0.9995309 -0.9483126 0.947872 0.9995309 -0.9484368 0.947872 0.9995309 -0.948594 0.947872 0.9995309 -0.9487928 0.947872 0.9995309 -0.9490443 0.947872 0.9995309 -0.9493625 0.947872 0.9995309 -0.949765 0.947872 0.9995309 -0.9502743 0.947872 0.9995309 -0.9509185 0.947872 0.9995309 -0.9517337 0.947872 0.9995309 -0.9527649 0.947872 0.9995309 -0.9540695 0.947872 0.9995309 -0.95572 0.947872 0.9995309 -0.9578081 0.947872 0.9995309 -0.9604499 0.947872 0.9995309 -0.963792 0.947872 0.9995309 -0.9680203 0.947872 0.9995309 -0.9733696 0.947872 0.9995309 -0.9801372 0.947872 0.9995309 -0.988699 0.947872 0.9995309 -0.9995309 0.947872 0.9995309 -0.9996295 0.9584138 0.9909884 -0.9997074 0.9668859 0.9873881 -0.9997688 0.9736717 0.9865562 -0.9998174 0.9790921 0.9871797 -0.9998557 0.9834126 0.9884842 -0.999886 0.9868503 0.9900282 -0.9999099 0.9895819 0.991572 -0.9999288 0.99175 0.9929957 -0.9999437 0.9934694 0.9942488 -0.9478754 0.9479098 0.999531 -0.9478752 0.9479094 0.999531 -0.947875 0.9479089 0.999531 -0.9478746 0.9479082 0.999531 -0.9478743 0.9479074 0.999531 -0.9478738 0.9479064 0.999531 -0.9478733 0.9479051 0.999531 -0.9478726 0.9479036 0.999531 -0.9478718 0.9479017 0.999531 -0.947871 0.9478994 0.9995309 -0.94787 0.9478967 0.9995309 -0.9478691 0.9478935 0.9995309 -0.9478684 0.9478899 0.9995309 -0.9478683 0.9478861 0.9995309 -0.9478691 0.9478824 0.9995309 -0.947872 0.9478794 0.9995309 -0.9478785 0.9478785 0.9995308 -0.9478878 0.9478785 0.9995308 -0.9478997 0.9478785 0.9995308 -0.9479146 0.9478785 0.9995308 -0.9479335 0.9478785 0.9995308 -0.9479575 0.9478785 0.9995308 -0.9479878 0.9478785 0.9995308 -0.9480261 0.9478785 0.9995308 -0.9480746 0.9478785 0.9995308 -0.9481359 0.9478785 0.9995308 -0.9482135 0.9478785 0.9995308 -0.9483117 0.9478785 0.9995308 -0.9484359 0.9478785 0.9995308 -0.9485931 0.9478785 0.9995308 -0.9487918 0.9478785 0.9995308 -0.9490434 0.9478785 0.9995308 -0.9493615 0.9478785 0.9995308 -0.9497641 0.9478785 0.9995308 -0.9502734 0.9478785 0.9995308 -0.9509177 0.9478785 0.9995308 -0.9517328 0.9478785 0.9995308 -0.952764 0.9478785 0.9995308 -0.9540687 0.9478785 0.9995308 -0.9557192 0.9478785 0.9995308 -0.9578074 0.9478785 0.9995308 -0.9604492 0.9478785 0.9995308 -0.9637914 0.9478785 0.9995308 -0.9680197 0.9478785 0.9995308 -0.9733691 0.9478785 0.9995308 -0.9801368 0.9478785 0.9995308 -0.9886988 0.9478785 0.9995308 -0.9995308 0.9478785 0.9995308 -0.9996295 0.9584178 0.9909882 -0.9997074 0.9668884 0.9873879 -0.9997688 0.9736733 0.9865561 -0.9998174 0.9790931 0.9871796 -0.9998557 0.9834132 0.9884841 -0.999886 0.9868507 0.9900282 -0.9999099 0.9895821 0.991572 -0.9999288 0.9917502 0.9929957 -0.9999437 0.9934695 0.9942488 -0.9478754 0.9479192 0.999531 -0.9478752 0.9479187 0.999531 -0.947875 0.9479182 0.999531 -0.9478746 0.9479176 0.999531 -0.9478743 0.9479168 0.999531 -0.9478738 0.9479157 0.999531 -0.9478733 0.9479145 0.999531 -0.9478726 0.9479129 0.999531 -0.9478718 0.947911 0.999531 -0.947871 0.9479088 0.9995309 -0.94787 0.947906 0.9995309 -0.9478691 0.9479029 0.9995309 -0.9478684 0.9478993 0.9995309 -0.9478683 0.9478954 0.9995309 -0.9478691 0.9478917 0.9995309 -0.947872 0.9478888 0.9995309 -0.9478785 0.9478878 0.9995308 -0.9478878 0.9478878 0.9995308 -0.9478997 0.9478878 0.9995308 -0.9479146 0.9478878 0.9995308 -0.9479335 0.9478878 0.9995308 -0.9479575 0.9478878 0.9995308 -0.9479878 0.9478878 0.9995308 -0.9480261 0.9478878 0.9995308 -0.9480746 0.9478878 0.9995308 -0.9481359 0.9478878 0.9995308 -0.9482135 0.9478878 0.9995308 -0.9483117 0.9478878 0.9995308 -0.9484359 0.9478878 0.9995308 -0.9485931 0.9478878 0.9995308 -0.9487918 0.9478878 0.9995308 -0.9490434 0.9478878 0.9995308 -0.9493615 0.9478878 0.9995308 -0.9497641 0.9478878 0.9995308 -0.9502734 0.9478878 0.9995308 -0.9509177 0.9478878 0.9995308 -0.9517328 0.9478878 0.9995308 -0.952764 0.9478878 0.9995308 -0.9540687 0.9478878 0.9995308 -0.9557192 0.9478878 0.9995308 -0.9578074 0.9478878 0.9995308 -0.9604492 0.9478878 0.9995308 -0.9637914 0.9478878 0.9995308 -0.9680197 0.9478878 0.9995308 -0.9733691 0.9478878 0.9995308 -0.9801368 0.9478878 0.9995308 -0.9886988 0.9478878 0.9995308 -0.9995308 0.9478878 0.9995308 -0.9996295 0.9584237 0.9909882 -0.9997074 0.9668922 0.9873879 -0.9997688 0.9736756 0.9865561 -0.9998174 0.9790946 0.9871796 -0.9998557 0.9834141 0.9884841 -0.999886 0.9868512 0.9900282 -0.9999099 0.9895825 0.991572 -0.9999288 0.9917504 0.9929957 -0.9999437 0.9934697 0.9942488 -0.9478754 0.947931 0.999531 -0.9478752 0.9479306 0.999531 -0.947875 0.94793 0.999531 -0.9478746 0.9479294 0.999531 -0.9478743 0.9479286 0.999531 -0.9478738 0.9479276 0.999531 -0.9478733 0.9479263 0.999531 -0.9478726 0.9479248 0.999531 -0.9478718 0.9479229 0.999531 -0.947871 0.9479206 0.9995309 -0.94787 0.9479179 0.9995309 -0.9478691 0.9479147 0.9995309 -0.9478684 0.9479111 0.9995309 -0.9478683 0.9479073 0.9995309 -0.9478691 0.9479035 0.9995309 -0.947872 0.9479006 0.9995309 -0.9478785 0.9478997 0.9995308 -0.9478878 0.9478997 0.9995308 -0.9478997 0.9478997 0.9995308 -0.9479146 0.9478997 0.9995308 -0.9479335 0.9478997 0.9995308 -0.9479575 0.9478997 0.9995308 -0.9479878 0.9478997 0.9995308 -0.9480261 0.9478997 0.9995308 -0.9480746 0.9478997 0.9995308 -0.9481359 0.9478997 0.9995308 -0.9482135 0.9478997 0.9995308 -0.9483117 0.9478997 0.9995308 -0.9484359 0.9478997 0.9995308 -0.9485931 0.9478997 0.9995308 -0.9487918 0.9478997 0.9995308 -0.9490434 0.9478997 0.9995308 -0.9493615 0.9478997 0.9995308 -0.9497641 0.9478997 0.9995308 -0.9502734 0.9478997 0.9995308 -0.9509177 0.9478997 0.9995308 -0.9517328 0.9478997 0.9995308 -0.952764 0.9478997 0.9995308 -0.9540687 0.9478997 0.9995308 -0.9557192 0.9478997 0.9995308 -0.9578074 0.9478997 0.9995308 -0.9604492 0.9478997 0.9995308 -0.9637914 0.9478997 0.9995308 -0.9680197 0.9478997 0.9995308 -0.9733691 0.9478997 0.9995308 -0.9801368 0.9478997 0.9995308 -0.9886988 0.9478997 0.9995308 -0.9995308 0.9478997 0.9995308 -0.9996295 0.9584312 0.9909882 -0.9997074 0.9668969 0.9873879 -0.9997688 0.9736786 0.9865561 -0.9998174 0.9790965 0.9871796 -0.9998557 0.9834153 0.9884841 -0.999886 0.986852 0.9900282 -0.9999099 0.9895829 0.991572 -0.9999288 0.9917507 0.9929957 -0.9999437 0.9934698 0.9942488 -0.9478754 0.9479459 0.999531 -0.9478752 0.9479455 0.999531 -0.947875 0.947945 0.999531 -0.9478746 0.9479443 0.999531 -0.9478743 0.9479435 0.999531 -0.9478738 0.9479425 0.999531 -0.9478733 0.9479413 0.999531 -0.9478726 0.9479397 0.999531 -0.9478718 0.9479378 0.999531 -0.947871 0.9479355 0.9995309 -0.94787 0.9479328 0.9995309 -0.9478691 0.9479296 0.9995309 -0.9478684 0.9479261 0.9995309 -0.9478683 0.9479222 0.9995309 -0.9478691 0.9479185 0.9995309 -0.947872 0.9479156 0.9995309 -0.9478785 0.9479146 0.9995308 -0.9478878 0.9479146 0.9995308 -0.9478997 0.9479146 0.9995308 -0.9479146 0.9479146 0.9995308 -0.9479335 0.9479146 0.9995308 -0.9479575 0.9479146 0.9995308 -0.9479878 0.9479146 0.9995308 -0.9480261 0.9479146 0.9995308 -0.9480746 0.9479146 0.9995308 -0.9481359 0.9479146 0.9995308 -0.9482135 0.9479146 0.9995308 -0.9483117 0.9479146 0.9995308 -0.9484359 0.9479146 0.9995308 -0.9485931 0.9479146 0.9995308 -0.9487918 0.9479146 0.9995308 -0.9490434 0.9479146 0.9995308 -0.9493615 0.9479146 0.9995308 -0.9497641 0.9479146 0.9995308 -0.9502734 0.9479146 0.9995308 -0.9509177 0.9479146 0.9995308 -0.9517328 0.9479146 0.9995308 -0.952764 0.9479146 0.9995308 -0.9540687 0.9479146 0.9995308 -0.9557192 0.9479146 0.9995308 -0.9578074 0.9479146 0.9995308 -0.9604492 0.9479146 0.9995308 -0.9637914 0.9479146 0.9995308 -0.9680197 0.9479146 0.9995308 -0.9733691 0.9479146 0.9995308 -0.9801368 0.9479146 0.9995308 -0.9886988 0.9479146 0.9995308 -0.9995308 0.9479146 0.9995308 -0.9996295 0.9584406 0.9909882 -0.9997074 0.9669028 0.9873879 -0.9997688 0.9736823 0.9865561 -0.9998174 0.9790988 0.9871796 -0.9998557 0.9834167 0.9884841 -0.999886 0.9868529 0.9900282 -0.9999099 0.9895835 0.991572 -0.9999288 0.991751 0.9929957 -0.9999437 0.9934701 0.9942488 -0.9478754 0.9479648 0.999531 -0.9478752 0.9479644 0.999531 -0.947875 0.9479639 0.999531 -0.9478746 0.9479633 0.999531 -0.9478743 0.9479624 0.999531 -0.9478738 0.9479614 0.999531 -0.9478733 0.9479602 0.999531 -0.9478726 0.9479586 0.999531 -0.9478718 0.9479567 0.999531 -0.947871 0.9479544 0.9995309 -0.94787 0.9479517 0.9995309 -0.9478691 0.9479486 0.9995309 -0.9478684 0.947945 0.9995309 -0.9478683 0.9479411 0.9995309 -0.9478691 0.9479374 0.9995309 -0.947872 0.9479345 0.9995309 -0.9478785 0.9479335 0.9995308 -0.9478878 0.9479335 0.9995308 -0.9478997 0.9479335 0.9995308 -0.9479146 0.9479335 0.9995308 -0.9479335 0.9479335 0.9995308 -0.9479575 0.9479335 0.9995308 -0.9479878 0.9479335 0.9995308 -0.9480261 0.9479335 0.9995308 -0.9480746 0.9479335 0.9995308 -0.9481359 0.9479335 0.9995308 -0.9482135 0.9479335 0.9995308 -0.9483117 0.9479335 0.9995308 -0.9484359 0.9479335 0.9995308 -0.9485931 0.9479335 0.9995308 -0.9487918 0.9479335 0.9995308 -0.9490434 0.9479335 0.9995308 -0.9493615 0.9479335 0.9995308 -0.9497641 0.9479335 0.9995308 -0.9502734 0.9479335 0.9995308 -0.9509177 0.9479335 0.9995308 -0.9517328 0.9479335 0.9995308 -0.952764 0.9479335 0.9995308 -0.9540687 0.9479335 0.9995308 -0.9557192 0.9479335 0.9995308 -0.9578074 0.9479335 0.9995308 -0.9604492 0.9479335 0.9995308 -0.9637914 0.9479335 0.9995308 -0.9680197 0.9479335 0.9995308 -0.9733691 0.9479335 0.9995308 -0.9801368 0.9479335 0.9995308 -0.9886988 0.9479335 0.9995308 -0.9995308 0.9479335 0.9995308 -0.9996295 0.9584526 0.9909882 -0.9997074 0.9669103 0.9873879 -0.9997688 0.973687 0.9865561 -0.9998174 0.9791018 0.9871796 -0.9998557 0.9834186 0.9884841 -0.999886 0.9868541 0.9900282 -0.9999099 0.9895842 0.991572 -0.9999288 0.9917515 0.9929957 -0.9999437 0.9934704 0.9942488 -0.9478754 0.9479888 0.999531 -0.9478752 0.9479884 0.999531 -0.947875 0.9479878 0.999531 -0.9478746 0.9479872 0.999531 -0.9478743 0.9479864 0.999531 -0.9478738 0.9479854 0.999531 -0.9478733 0.9479841 0.999531 -0.9478726 0.9479826 0.999531 -0.9478718 0.9479807 0.999531 -0.947871 0.9479784 0.9995309 -0.94787 0.9479757 0.9995309 -0.9478691 0.9479725 0.9995309 -0.9478684 0.9479689 0.9995309 -0.9478683 0.9479651 0.9995309 -0.9478691 0.9479614 0.9995309 -0.947872 0.9479584 0.9995309 -0.9478785 0.9479575 0.9995308 -0.9478878 0.9479575 0.9995308 -0.9478997 0.9479575 0.9995308 -0.9479146 0.9479575 0.9995308 -0.9479335 0.9479575 0.9995308 -0.9479575 0.9479575 0.9995308 -0.9479878 0.9479575 0.9995308 -0.9480261 0.9479575 0.9995308 -0.9480746 0.9479575 0.9995308 -0.9481359 0.9479575 0.9995308 -0.9482135 0.9479575 0.9995308 -0.9483117 0.9479575 0.9995308 -0.9484359 0.9479575 0.9995308 -0.9485931 0.9479575 0.9995308 -0.9487918 0.9479575 0.9995308 -0.9490434 0.9479575 0.9995308 -0.9493615 0.9479575 0.9995308 -0.9497641 0.9479575 0.9995308 -0.9502734 0.9479575 0.9995308 -0.9509177 0.9479575 0.9995308 -0.9517328 0.9479575 0.9995308 -0.952764 0.9479575 0.9995308 -0.9540687 0.9479575 0.9995308 -0.9557192 0.9479575 0.9995308 -0.9578074 0.9479575 0.9995308 -0.9604492 0.9479575 0.9995308 -0.9637914 0.9479575 0.9995308 -0.9680197 0.9479575 0.9995308 -0.9733691 0.9479575 0.9995308 -0.9801368 0.9479575 0.9995308 -0.9886988 0.9479575 0.9995308 -0.9995308 0.9479575 0.9995308 -0.9996295 0.9584677 0.9909882 -0.9997074 0.9669198 0.9873879 -0.9997688 0.973693 0.9865561 -0.9998174 0.9791055 0.9871796 -0.9998557 0.9834209 0.9884841 -0.999886 0.9868555 0.9900282 -0.9999099 0.9895851 0.991572 -0.9999288 0.9917521 0.9929957 -0.9999437 0.9934707 0.9942488 -0.9478754 0.948019 0.999531 -0.9478752 0.9480186 0.999531 -0.947875 0.9480181 0.999531 -0.9478746 0.9480175 0.999531 -0.9478743 0.9480166 0.999531 -0.9478738 0.9480156 0.999531 -0.9478733 0.9480144 0.999531 -0.9478726 0.9480128 0.999531 -0.9478718 0.9480109 0.999531 -0.947871 0.9480087 0.9995309 -0.94787 0.9480059 0.9995309 -0.9478691 0.9480028 0.9995309 -0.9478684 0.9479992 0.9995309 -0.9478683 0.9479954 0.9995309 -0.9478691 0.9479916 0.9995309 -0.947872 0.9479887 0.9995309 -0.9478785 0.9479878 0.9995308 -0.9478878 0.9479878 0.9995308 -0.9478997 0.9479878 0.9995308 -0.9479146 0.9479878 0.9995308 -0.9479335 0.9479878 0.9995308 -0.9479575 0.9479878 0.9995308 -0.9479878 0.9479878 0.9995308 -0.9480261 0.9479878 0.9995308 -0.9480746 0.9479878 0.9995308 -0.9481359 0.9479878 0.9995308 -0.9482135 0.9479878 0.9995308 -0.9483117 0.9479878 0.9995308 -0.9484359 0.9479878 0.9995308 -0.9485931 0.9479878 0.9995308 -0.9487918 0.9479878 0.9995308 -0.9490434 0.9479878 0.9995308 -0.9493615 0.9479878 0.9995308 -0.9497641 0.9479878 0.9995308 -0.9502734 0.9479878 0.9995308 -0.9509177 0.9479878 0.9995308 -0.9517328 0.9479878 0.9995308 -0.952764 0.9479878 0.9995308 -0.9540687 0.9479878 0.9995308 -0.9557192 0.9479878 0.9995308 -0.9578074 0.9479878 0.9995308 -0.9604492 0.9479878 0.9995308 -0.9637914 0.9479878 0.9995308 -0.9680197 0.9479878 0.9995308 -0.9733691 0.9479878 0.9995308 -0.9801368 0.9479878 0.9995308 -0.9886988 0.9479878 0.9995308 -0.9995308 0.9479878 0.9995308 -0.9996295 0.9584868 0.9909882 -0.9997074 0.9669318 0.9873879 -0.9997688 0.9737006 0.9865561 -0.9998174 0.9791103 0.9871796 -0.9998557 0.9834239 0.9884841 -0.999886 0.9868574 0.9900282 -0.9999099 0.9895863 0.991572 -0.9999288 0.9917528 0.9929957 -0.9999437 0.9934712 0.9942488 -0.9478754 0.9480573 0.999531 -0.9478752 0.9480569 0.999531 -0.947875 0.9480564 0.999531 -0.9478746 0.9480558 0.999531 -0.9478743 0.9480549 0.999531 -0.9478738 0.9480539 0.999531 -0.9478733 0.9480527 0.999531 -0.9478726 0.9480511 0.999531 -0.9478718 0.9480493 0.999531 -0.947871 0.948047 0.9995309 -0.94787 0.9480443 0.9995309 -0.9478691 0.9480411 0.9995309 -0.9478684 0.9480375 0.9995309 -0.9478683 0.9480337 0.9995309 -0.9478691 0.94803 0.9995309 -0.947872 0.948027 0.9995309 -0.9478785 0.9480261 0.9995308 -0.9478878 0.9480261 0.9995308 -0.9478997 0.9480261 0.9995308 -0.9479146 0.9480261 0.9995308 -0.9479335 0.9480261 0.9995308 -0.9479575 0.9480261 0.9995308 -0.9479878 0.9480261 0.9995308 -0.9480261 0.9480261 0.9995308 -0.9480746 0.9480261 0.9995308 -0.9481359 0.9480261 0.9995308 -0.9482135 0.9480261 0.9995308 -0.9483117 0.9480261 0.9995308 -0.9484359 0.9480261 0.9995308 -0.9485931 0.9480261 0.9995308 -0.9487918 0.9480261 0.9995308 -0.9490434 0.9480261 0.9995308 -0.9493615 0.9480261 0.9995308 -0.9497641 0.9480261 0.9995308 -0.9502734 0.9480261 0.9995308 -0.9509177 0.9480261 0.9995308 -0.9517328 0.9480261 0.9995308 -0.952764 0.9480261 0.9995308 -0.9540687 0.9480261 0.9995308 -0.9557192 0.9480261 0.9995308 -0.9578074 0.9480261 0.9995308 -0.9604492 0.9480261 0.9995308 -0.9637914 0.9480261 0.9995308 -0.9680197 0.9480261 0.9995308 -0.9733691 0.9480261 0.9995308 -0.9801368 0.9480261 0.9995308 -0.9886988 0.9480261 0.9995308 -0.9995308 0.9480261 0.9995308 -0.9996295 0.9585109 0.9909882 -0.9997074 0.966947 0.9873879 -0.9997688 0.9737101 0.9865561 -0.9998174 0.9791163 0.9871796 -0.9998557 0.9834277 0.9884841 -0.999886 0.9868597 0.9900282 -0.9999099 0.9895878 0.991572 -0.9999288 0.9917537 0.9929957 -0.9999437 0.9934718 0.9942488 -0.9478754 0.9481058 0.999531 -0.9478752 0.9481054 0.999531 -0.947875 0.9481049 0.999531 -0.9478746 0.9481042 0.999531 -0.9478743 0.9481034 0.999531 -0.9478738 0.9481024 0.999531 -0.9478733 0.9481011 0.999531 -0.9478726 0.9480996 0.999531 -0.9478718 0.9480977 0.999531 -0.947871 0.9480954 0.9995309 -0.94787 0.9480927 0.9995309 -0.9478691 0.9480896 0.9995309 -0.9478684 0.948086 0.9995309 -0.9478683 0.9480822 0.9995309 -0.9478691 0.9480785 0.9995309 -0.947872 0.9480755 0.9995309 -0.9478785 0.9480746 0.9995308 -0.9478878 0.9480746 0.9995308 -0.9478997 0.9480746 0.9995308 -0.9479146 0.9480746 0.9995308 -0.9479335 0.9480746 0.9995308 -0.9479575 0.9480746 0.9995308 -0.9479878 0.9480746 0.9995308 -0.9480261 0.9480746 0.9995308 -0.9480746 0.9480746 0.9995308 -0.9481359 0.9480746 0.9995308 -0.9482135 0.9480746 0.9995308 -0.9483117 0.9480746 0.9995308 -0.9484359 0.9480746 0.9995308 -0.9485931 0.9480746 0.9995308 -0.9487918 0.9480746 0.9995308 -0.9490434 0.9480746 0.9995308 -0.9493615 0.9480746 0.9995308 -0.9497641 0.9480746 0.9995308 -0.9502734 0.9480746 0.9995308 -0.9509177 0.9480746 0.9995308 -0.9517328 0.9480746 0.9995308 -0.952764 0.9480746 0.9995308 -0.9540687 0.9480746 0.9995308 -0.9557192 0.9480746 0.9995308 -0.9578074 0.9480746 0.9995308 -0.9604492 0.9480746 0.9995308 -0.9637914 0.9480746 0.9995308 -0.9680197 0.9480746 0.9995308 -0.9733691 0.9480746 0.9995308 -0.9801368 0.9480746 0.9995308 -0.9886988 0.9480746 0.9995308 -0.9995308 0.9480746 0.9995308 -0.9996295 0.9585415 0.9909882 -0.9997074 0.9669663 0.9873879 -0.9997688 0.9737222 0.9865561 -0.9998174 0.9791238 0.9871796 -0.9998557 0.9834324 0.9884841 -0.999886 0.9868627 0.9900282 -0.9999099 0.9895897 0.991572 -0.9999288 0.9917549 0.9929957 -0.9999437 0.9934725 0.9942488 -0.9478754 0.9481671 0.999531 -0.9478752 0.9481667 0.999531 -0.947875 0.9481662 0.999531 -0.9478746 0.9481655 0.999531 -0.9478743 0.9481647 0.999531 -0.9478738 0.9481637 0.999531 -0.9478733 0.9481624 0.999531 -0.9478726 0.9481609 0.999531 -0.9478718 0.948159 0.999531 -0.947871 0.9481567 0.9995309 -0.94787 0.948154 0.9995309 -0.9478691 0.9481509 0.9995309 -0.9478684 0.9481473 0.9995309 -0.9478683 0.9481435 0.9995309 -0.9478691 0.9481398 0.9995309 -0.947872 0.9481369 0.9995309 -0.9478785 0.9481359 0.9995308 -0.9478878 0.9481359 0.9995308 -0.9478997 0.9481359 0.9995308 -0.9479146 0.9481359 0.9995308 -0.9479335 0.9481359 0.9995308 -0.9479575 0.9481359 0.9995308 -0.9479878 0.9481359 0.9995308 -0.9480261 0.9481359 0.9995308 -0.9480746 0.9481359 0.9995308 -0.9481359 0.9481359 0.9995308 -0.9482135 0.9481359 0.9995308 -0.9483117 0.9481359 0.9995308 -0.9484359 0.9481359 0.9995308 -0.9485931 0.9481359 0.9995308 -0.9487918 0.9481359 0.9995308 -0.9490434 0.9481359 0.9995308 -0.9493615 0.9481359 0.9995308 -0.9497641 0.9481359 0.9995308 -0.9502734 0.9481359 0.9995308 -0.9509177 0.9481359 0.9995308 -0.9517328 0.9481359 0.9995308 -0.952764 0.9481359 0.9995308 -0.9540687 0.9481359 0.9995308 -0.9557192 0.9481359 0.9995308 -0.9578074 0.9481359 0.9995308 -0.9604492 0.9481359 0.9995308 -0.9637914 0.9481359 0.9995308 -0.9680197 0.9481359 0.9995308 -0.9733691 0.9481359 0.9995308 -0.9801368 0.9481359 0.9995308 -0.9886988 0.9481359 0.9995308 -0.9995308 0.9481359 0.9995308 -0.9996295 0.9585802 0.9909882 -0.9997074 0.9669906 0.9873879 -0.9997688 0.9737375 0.9865561 -0.9998174 0.9791334 0.9871796 -0.9998557 0.9834385 0.9884841 -0.999886 0.9868665 0.9900282 -0.9999099 0.989592 0.991572 -0.9999288 0.9917564 0.9929957 -0.9999437 0.9934734 0.9942488 -0.9478754 0.9482447 0.999531 -0.9478752 0.9482442 0.999531 -0.947875 0.9482437 0.999531 -0.9478746 0.9482431 0.999531 -0.9478743 0.9482423 0.999531 -0.9478738 0.9482413 0.999531 -0.9478733 0.94824 0.999531 -0.9478726 0.9482385 0.999531 -0.9478718 0.9482366 0.999531 -0.947871 0.9482343 0.9995309 -0.94787 0.9482316 0.9995309 -0.9478691 0.9482285 0.9995309 -0.9478684 0.9482249 0.9995309 -0.9478683 0.9482211 0.9995309 -0.9478691 0.9482174 0.9995309 -0.947872 0.9482145 0.9995309 -0.9478785 0.9482135 0.9995308 -0.9478878 0.9482135 0.9995308 -0.9478997 0.9482135 0.9995308 -0.9479146 0.9482135 0.9995308 -0.9479335 0.9482135 0.9995308 -0.9479575 0.9482135 0.9995308 -0.9479878 0.9482135 0.9995308 -0.9480261 0.9482135 0.9995308 -0.9480746 0.9482135 0.9995308 -0.9481359 0.9482135 0.9995308 -0.9482135 0.9482135 0.9995308 -0.9483117 0.9482135 0.9995308 -0.9484359 0.9482135 0.9995308 -0.9485931 0.9482135 0.9995308 -0.9487918 0.9482135 0.9995308 -0.9490434 0.9482135 0.9995308 -0.9493615 0.9482135 0.9995308 -0.9497641 0.9482135 0.9995308 -0.9502734 0.9482135 0.9995308 -0.9509177 0.9482135 0.9995308 -0.9517328 0.9482135 0.9995308 -0.952764 0.9482135 0.9995308 -0.9540687 0.9482135 0.9995308 -0.9557192 0.9482135 0.9995308 -0.9578074 0.9482135 0.9995308 -0.9604492 0.9482135 0.9995308 -0.9637914 0.9482135 0.9995308 -0.9680197 0.9482135 0.9995308 -0.9733691 0.9482135 0.9995308 -0.9801368 0.9482135 0.9995308 -0.9886988 0.9482135 0.9995308 -0.9995308 0.9482135 0.9995308 -0.9996295 0.9586291 0.9909882 -0.9997074 0.9670214 0.9873879 -0.9997688 0.9737569 0.9865561 -0.9998174 0.9791456 0.9871796 -0.9998557 0.9834461 0.9884841 -0.999886 0.9868713 0.9900282 -0.9999099 0.989595 0.991572 -0.9999288 0.9917582 0.9929957 -0.9999437 0.9934746 0.9942488 -0.9478754 0.9483428 0.999531 -0.9478752 0.9483424 0.999531 -0.947875 0.9483418 0.999531 -0.9478746 0.9483412 0.999531 -0.9478743 0.9483404 0.999531 -0.9478738 0.9483394 0.999531 -0.9478733 0.9483381 0.999531 -0.9478726 0.9483366 0.999531 -0.9478718 0.9483347 0.999531 -0.947871 0.9483325 0.9995309 -0.94787 0.9483298 0.9995309 -0.9478691 0.9483266 0.9995309 -0.9478684 0.9483231 0.9995309 -0.9478683 0.9483193 0.9995309 -0.9478691 0.9483155 0.9995309 -0.947872 0.9483126 0.9995309 -0.9478785 0.9483117 0.9995308 -0.9478878 0.9483117 0.9995308 -0.9478997 0.9483117 0.9995308 -0.9479146 0.9483117 0.9995308 -0.9479335 0.9483117 0.9995308 -0.9479575 0.9483117 0.9995308 -0.9479878 0.9483117 0.9995308 -0.9480261 0.9483117 0.9995308 -0.9480746 0.9483117 0.9995308 -0.9481359 0.9483117 0.9995308 -0.9482135 0.9483117 0.9995308 -0.9483117 0.9483117 0.9995308 -0.9484359 0.9483117 0.9995308 -0.9485931 0.9483117 0.9995308 -0.9487918 0.9483117 0.9995308 -0.9490434 0.9483117 0.9995308 -0.9493615 0.9483117 0.9995308 -0.9497641 0.9483117 0.9995308 -0.9502734 0.9483117 0.9995308 -0.9509177 0.9483117 0.9995308 -0.9517328 0.9483117 0.9995308 -0.952764 0.9483117 0.9995308 -0.9540687 0.9483117 0.9995308 -0.9557192 0.9483117 0.9995308 -0.9578074 0.9483117 0.9995308 -0.9604492 0.9483117 0.9995308 -0.9637914 0.9483117 0.9995308 -0.9680197 0.9483117 0.9995308 -0.9733691 0.9483117 0.9995308 -0.9801368 0.9483117 0.9995308 -0.9886988 0.9483117 0.9995308 -0.9995308 0.9483117 0.9995308 -0.9996295 0.958691 0.9909882 -0.9997074 0.9670604 0.9873879 -0.9997688 0.9737814 0.9865561 -0.9998174 0.979161 0.9871796 -0.9998557 0.9834557 0.9884841 -0.999886 0.9868773 0.9900282 -0.9999099 0.9895988 0.991572 -0.9999288 0.9917606 0.9929957 -0.9999437 0.9934761 0.9942488 -0.9478754 0.9484669 0.999531 -0.9478752 0.9484665 0.999531 -0.947875 0.948466 0.999531 -0.9478746 0.9484653 0.999531 -0.9478743 0.9484645 0.999531 -0.9478738 0.9484635 0.999531 -0.9478733 0.9484623 0.999531 -0.9478726 0.9484607 0.999531 -0.9478718 0.9484589 0.999531 -0.947871 0.9484566 0.9995309 -0.94787 0.9484539 0.9995309 -0.9478691 0.9484508 0.9995309 -0.9478684 0.9484472 0.9995309 -0.9478683 0.9484434 0.9995309 -0.9478691 0.9484397 0.9995309 -0.947872 0.9484368 0.9995309 -0.9478785 0.9484359 0.9995308 -0.9478878 0.9484359 0.9995308 -0.9478997 0.9484359 0.9995308 -0.9479146 0.9484359 0.9995308 -0.9479335 0.9484359 0.9995308 -0.9479575 0.9484359 0.9995308 -0.9479878 0.9484359 0.9995308 -0.9480261 0.9484359 0.9995308 -0.9480746 0.9484359 0.9995308 -0.9481359 0.9484359 0.9995308 -0.9482135 0.9484359 0.9995308 -0.9483117 0.9484359 0.9995308 -0.9484359 0.9484359 0.9995308 -0.9485931 0.9484359 0.9995308 -0.9487918 0.9484359 0.9995308 -0.9490434 0.9484359 0.9995308 -0.9493615 0.9484359 0.9995308 -0.9497641 0.9484359 0.9995308 -0.9502734 0.9484359 0.9995308 -0.9509177 0.9484359 0.9995308 -0.9517328 0.9484359 0.9995308 -0.952764 0.9484359 0.9995308 -0.9540687 0.9484359 0.9995308 -0.9557192 0.9484359 0.9995308 -0.9578074 0.9484359 0.9995308 -0.9604492 0.9484359 0.9995308 -0.9637914 0.9484359 0.9995308 -0.9680197 0.9484359 0.9995308 -0.9733691 0.9484359 0.9995308 -0.9801368 0.9484359 0.9995308 -0.9886988 0.9484359 0.9995308 -0.9995308 0.9484359 0.9995308 -0.9996295 0.9587693 0.9909882 -0.9997074 0.9671097 0.9873879 -0.9997688 0.9738123 0.9865561 -0.9998174 0.9791804 0.9871796 -0.9998557 0.9834679 0.9884841 -0.999886 0.986885 0.9900282 -0.9999099 0.9896036 0.991572 -0.9999288 0.9917636 0.9929957 -0.9999437 0.9934779 0.9942488 -0.9478754 0.9486239 0.999531 -0.9478752 0.9486235 0.999531 -0.947875 0.948623 0.999531 -0.9478746 0.9486224 0.999531 -0.9478743 0.9486216 0.999531 -0.9478738 0.9486206 0.999531 -0.9478733 0.9486193 0.999531 -0.9478726 0.9486178 0.999531 -0.9478718 0.9486159 0.999531 -0.947871 0.9486137 0.9995309 -0.94787 0.948611 0.9995309 -0.9478691 0.9486079 0.9995309 -0.9478684 0.9486043 0.9995309 -0.9478683 0.9486006 0.9995309 -0.9478691 0.9485969 0.9995309 -0.947872 0.948594 0.9995309 -0.9478785 0.9485931 0.9995308 -0.9478878 0.9485931 0.9995308 -0.9478997 0.9485931 0.9995308 -0.9479146 0.9485931 0.9995308 -0.9479335 0.9485931 0.9995308 -0.9479575 0.9485931 0.9995308 -0.9479878 0.9485931 0.9995308 -0.9480261 0.9485931 0.9995308 -0.9480746 0.9485931 0.9995308 -0.9481359 0.9485931 0.9995308 -0.9482135 0.9485931 0.9995308 -0.9483117 0.9485931 0.9995308 -0.9484359 0.9485931 0.9995308 -0.9485931 0.9485931 0.9995308 -0.9487918 0.9485931 0.9995308 -0.9490434 0.9485931 0.9995308 -0.9493615 0.9485931 0.9995308 -0.9497641 0.9485931 0.9995308 -0.9502734 0.9485931 0.9995308 -0.9509177 0.9485931 0.9995308 -0.9517328 0.9485931 0.9995308 -0.952764 0.9485931 0.9995308 -0.9540687 0.9485931 0.9995308 -0.9557192 0.9485931 0.9995308 -0.9578074 0.9485931 0.9995308 -0.9604492 0.9485931 0.9995308 -0.9637914 0.9485931 0.9995308 -0.9680197 0.9485931 0.9995308 -0.9733691 0.9485931 0.9995308 -0.9801368 0.9485931 0.9995308 -0.9886988 0.9485931 0.9995308 -0.9995308 0.9485931 0.9995308 -0.9996295 0.9588684 0.9909882 -0.9997074 0.967172 0.9873879 -0.9997688 0.9738515 0.9865561 -0.9998174 0.979205 0.9871796 -0.9998557 0.9834833 0.9884841 -0.999886 0.9868946 0.9900282 -0.9999099 0.9896096 0.991572 -0.9999288 0.9917674 0.9929957 -0.9999437 0.9934803 0.9942488 -0.9478754 0.9488226 0.999531 -0.9478752 0.9488222 0.999531 -0.947875 0.9488217 0.999531 -0.9478746 0.9488211 0.999531 -0.9478743 0.9488203 0.999531 -0.9478738 0.9488193 0.999531 -0.9478733 0.948818 0.999531 -0.9478726 0.9488165 0.999531 -0.9478718 0.9488147 0.999531 -0.947871 0.9488124 0.9995309 -0.94787 0.9488097 0.9995309 -0.9478691 0.9488066 0.9995309 -0.9478684 0.9488031 0.9995309 -0.9478683 0.9487993 0.9995309 -0.9478691 0.9487957 0.9995309 -0.947872 0.9487928 0.9995309 -0.9478785 0.9487918 0.9995308 -0.9478878 0.9487918 0.9995308 -0.9478997 0.9487918 0.9995308 -0.9479146 0.9487918 0.9995308 -0.9479335 0.9487918 0.9995308 -0.9479575 0.9487918 0.9995308 -0.9479878 0.9487918 0.9995308 -0.9480261 0.9487918 0.9995308 -0.9480746 0.9487918 0.9995308 -0.9481359 0.9487918 0.9995308 -0.9482135 0.9487918 0.9995308 -0.9483117 0.9487918 0.9995308 -0.9484359 0.9487918 0.9995308 -0.9485931 0.9487918 0.9995308 -0.9487918 0.9487918 0.9995308 -0.9490434 0.9487918 0.9995308 -0.9493615 0.9487918 0.9995308 -0.9497641 0.9487918 0.9995308 -0.9502734 0.9487918 0.9995308 -0.9509177 0.9487918 0.9995308 -0.9517328 0.9487918 0.9995308 -0.952764 0.9487918 0.9995308 -0.9540687 0.9487918 0.9995308 -0.9557192 0.9487918 0.9995308 -0.9578074 0.9487918 0.9995308 -0.9604492 0.9487918 0.9995308 -0.9637914 0.9487918 0.9995308 -0.9680197 0.9487918 0.9995308 -0.9733691 0.9487918 0.9995308 -0.9801368 0.9487918 0.9995308 -0.9886988 0.9487918 0.9995308 -0.9995308 0.9487918 0.9995308 -0.9996295 0.9589938 0.9909882 -0.9997074 0.9672509 0.9873879 -0.9997688 0.9739011 0.9865561 -0.9998174 0.9792361 0.9871796 -0.9998557 0.9835029 0.9884841 -0.999886 0.9869069 0.9900282 -0.9999099 0.9896173 0.991572 -0.9999288 0.9917722 0.9929957 -0.9999437 0.9934833 0.9942488 -0.9478754 0.949074 0.999531 -0.9478752 0.9490736 0.999531 -0.947875 0.9490731 0.999531 -0.9478746 0.9490724 0.999531 -0.9478743 0.9490716 0.999531 -0.9478738 0.9490706 0.999531 -0.9478733 0.9490694 0.999531 -0.9478726 0.9490679 0.999531 -0.9478718 0.949066 0.999531 -0.947871 0.9490638 0.9995309 -0.94787 0.9490611 0.9995309 -0.9478691 0.949058 0.9995309 -0.9478684 0.9490545 0.9995309 -0.9478683 0.9490508 0.9995309 -0.9478691 0.9490471 0.9995309 -0.947872 0.9490443 0.9995309 -0.9478785 0.9490434 0.9995308 -0.9478878 0.9490434 0.9995308 -0.9478997 0.9490434 0.9995308 -0.9479146 0.9490434 0.9995308 -0.9479335 0.9490434 0.9995308 -0.9479575 0.9490434 0.9995308 -0.9479878 0.9490434 0.9995308 -0.9480261 0.9490434 0.9995308 -0.9480746 0.9490434 0.9995308 -0.9481359 0.9490434 0.9995308 -0.9482135 0.9490434 0.9995308 -0.9483117 0.9490434 0.9995308 -0.9484359 0.9490434 0.9995308 -0.9485931 0.9490434 0.9995308 -0.9487918 0.9490434 0.9995308 -0.9490434 0.9490434 0.9995308 -0.9493615 0.9490434 0.9995308 -0.9497641 0.9490434 0.9995308 -0.9502734 0.9490434 0.9995308 -0.9509177 0.9490434 0.9995308 -0.9517328 0.9490434 0.9995308 -0.952764 0.9490434 0.9995308 -0.9540687 0.9490434 0.9995308 -0.9557192 0.9490434 0.9995308 -0.9578074 0.9490434 0.9995308 -0.9604492 0.9490434 0.9995308 -0.9637914 0.9490434 0.9995308 -0.9680197 0.9490434 0.9995308 -0.9733691 0.9490434 0.9995308 -0.9801368 0.9490434 0.9995308 -0.9886988 0.9490434 0.9995308 -0.9995308 0.9490434 0.9995308 -0.9996295 0.9591524 0.9909882 -0.9997074 0.9673508 0.9873879 -0.9997688 0.9739638 0.9865561 -0.9998174 0.9792755 0.9871796 -0.9998557 0.9835276 0.9884841 -0.999886 0.9869223 0.9900282 -0.9999099 0.989627 0.991572 -0.9999288 0.9917782 0.9929957 -0.9999437 0.9934871 0.9942488 -0.9478754 0.949392 0.999531 -0.9478752 0.9493916 0.999531 -0.947875 0.9493911 0.999531 -0.9478746 0.9493904 0.999531 -0.9478743 0.9493896 0.999531 -0.9478738 0.9493887 0.999531 -0.9478733 0.9493874 0.999531 -0.9478726 0.9493859 0.999531 -0.9478718 0.9493841 0.999531 -0.947871 0.9493819 0.9995309 -0.94787 0.9493792 0.9995309 -0.9478691 0.9493761 0.9995309 -0.9478684 0.9493727 0.9995309 -0.9478683 0.9493689 0.9995309 -0.9478691 0.9493653 0.9995309 -0.947872 0.9493625 0.9995309 -0.9478785 0.9493615 0.9995308 -0.9478878 0.9493615 0.9995308 -0.9478997 0.9493615 0.9995308 -0.9479146 0.9493615 0.9995308 -0.9479335 0.9493615 0.9995308 -0.9479575 0.9493615 0.9995308 -0.9479878 0.9493615 0.9995308 -0.9480261 0.9493615 0.9995308 -0.9480746 0.9493615 0.9995308 -0.9481359 0.9493615 0.9995308 -0.9482135 0.9493615 0.9995308 -0.9483117 0.9493615 0.9995308 -0.9484359 0.9493615 0.9995308 -0.9485931 0.9493615 0.9995308 -0.9487918 0.9493615 0.9995308 -0.9490434 0.9493615 0.9995308 -0.9493615 0.9493615 0.9995308 -0.9497641 0.9493615 0.9995308 -0.9502734 0.9493615 0.9995308 -0.9509177 0.9493615 0.9995308 -0.9517328 0.9493615 0.9995308 -0.952764 0.9493615 0.9995308 -0.9540687 0.9493615 0.9995308 -0.9557192 0.9493615 0.9995308 -0.9578074 0.9493615 0.9995308 -0.9604492 0.9493615 0.9995308 -0.9637914 0.9493615 0.9995308 -0.9680197 0.9493615 0.9995308 -0.9733691 0.9493615 0.9995308 -0.9801368 0.9493615 0.9995308 -0.9886988 0.9493615 0.9995308 -0.9995308 0.9493615 0.9995308 -0.9996295 0.959353 0.9909882 -0.9997074 0.967477 0.9873879 -0.9997688 0.9740432 0.9865561 -0.9998174 0.9793253 0.9871796 -0.9998557 0.9835588 0.9884841 -0.999886 0.9869419 0.9900282 -0.9999099 0.9896392 0.991572 -0.9999288 0.9917859 0.9929957 -0.9999437 0.9934919 0.9942488 -0.9478754 0.9497943 0.999531 -0.9478752 0.9497939 0.999531 -0.947875 0.9497934 0.999531 -0.9478746 0.9497927 0.999531 -0.9478743 0.949792 0.999531 -0.9478738 0.949791 0.999531 -0.9478733 0.9497898 0.999531 -0.9478726 0.9497883 0.999531 -0.9478718 0.9497865 0.999531 -0.947871 0.9497843 0.9995309 -0.94787 0.9497816 0.9995309 -0.9478691 0.9497786 0.9995309 -0.9478684 0.9497751 0.9995309 -0.9478683 0.9497714 0.9995309 -0.9478691 0.9497678 0.9995309 -0.947872 0.949765 0.9995309 -0.9478785 0.9497641 0.9995308 -0.9478878 0.9497641 0.9995308 -0.9478997 0.9497641 0.9995308 -0.9479146 0.9497641 0.9995308 -0.9479335 0.9497641 0.9995308 -0.9479575 0.9497641 0.9995308 -0.9479878 0.9497641 0.9995308 -0.9480261 0.9497641 0.9995308 -0.9480746 0.9497641 0.9995308 -0.9481359 0.9497641 0.9995308 -0.9482135 0.9497641 0.9995308 -0.9483117 0.9497641 0.9995308 -0.9484359 0.9497641 0.9995308 -0.9485931 0.9497641 0.9995308 -0.9487918 0.9497641 0.9995308 -0.9490434 0.9497641 0.9995308 -0.9493615 0.9497641 0.9995308 -0.9497641 0.9497641 0.9995308 -0.9502734 0.9497641 0.9995308 -0.9509177 0.9497641 0.9995308 -0.9517328 0.9497641 0.9995308 -0.952764 0.9497641 0.9995308 -0.9540687 0.9497641 0.9995308 -0.9557192 0.9497641 0.9995308 -0.9578074 0.9497641 0.9995308 -0.9604492 0.9497641 0.9995308 -0.9637914 0.9497641 0.9995308 -0.9680197 0.9497641 0.9995308 -0.9733691 0.9497641 0.9995308 -0.9801368 0.9497641 0.9995308 -0.9886988 0.9497641 0.9995308 -0.9995308 0.9497641 0.9995308 -0.9996295 0.9596068 0.9909882 -0.9997074 0.9676368 0.9873879 -0.9997688 0.9741436 0.9865561 -0.9998174 0.9793883 0.9871796 -0.9998557 0.9835983 0.9884841 -0.999886 0.9869667 0.9900282 -0.9999099 0.9896547 0.991572 -0.9999288 0.9917956 0.9929957 -0.9999437 0.993498 0.9942488 -0.9478754 0.9503032 0.999531 -0.9478752 0.9503028 0.999531 -0.947875 0.9503023 0.999531 -0.9478746 0.9503017 0.999531 -0.9478743 0.950301 0.999531 -0.9478738 0.9503 0.999531 -0.9478733 0.9502988 0.999531 -0.9478726 0.9502973 0.999531 -0.9478718 0.9502955 0.999531 -0.947871 0.9502933 0.9995309 -0.94787 0.9502907 0.9995309 -0.9478691 0.9502877 0.9995309 -0.9478684 0.9502843 0.9995309 -0.9478683 0.9502806 0.9995309 -0.9478691 0.9502771 0.9995309 -0.947872 0.9502743 0.9995309 -0.9478785 0.9502734 0.9995308 -0.9478878 0.9502734 0.9995308 -0.9478997 0.9502734 0.9995308 -0.9479146 0.9502734 0.9995308 -0.9479335 0.9502734 0.9995308 -0.9479575 0.9502734 0.9995308 -0.9479878 0.9502734 0.9995308 -0.9480261 0.9502734 0.9995308 -0.9480746 0.9502734 0.9995308 -0.9481359 0.9502734 0.9995308 -0.9482135 0.9502734 0.9995308 -0.9483117 0.9502734 0.9995308 -0.9484359 0.9502734 0.9995308 -0.9485931 0.9502734 0.9995308 -0.9487918 0.9502734 0.9995308 -0.9490434 0.9502734 0.9995308 -0.9493615 0.9502734 0.9995308 -0.9497641 0.9502734 0.9995308 -0.9502734 0.9502734 0.9995308 -0.9509177 0.9502734 0.9995308 -0.9517328 0.9502734 0.9995308 -0.952764 0.9502734 0.9995308 -0.9540687 0.9502734 0.9995308 -0.9557192 0.9502734 0.9995308 -0.9578074 0.9502734 0.9995308 -0.9604492 0.9502734 0.9995308 -0.9637914 0.9502734 0.9995308 -0.9680197 0.9502734 0.9995308 -0.9733691 0.9502734 0.9995308 -0.9801368 0.9502734 0.9995308 -0.9886988 0.9502734 0.9995308 -0.9995308 0.9502734 0.9995308 -0.9996295 0.959928 0.9909882 -0.9997074 0.9678389 0.9873879 -0.9997688 0.9742706 0.9865561 -0.9998174 0.9794681 0.9871796 -0.9998557 0.9836483 0.9884841 -0.999886 0.986998 0.9900282 -0.9999099 0.9896744 0.991572 -0.9999288 0.9918079 0.9929957 -0.9999437 0.9935057 0.9942488 -0.9478754 0.9509472 0.999531 -0.9478752 0.9509468 0.999531 -0.947875 0.9509463 0.999531 -0.9478746 0.9509457 0.999531 -0.9478743 0.9509449 0.999531 -0.9478738 0.9509439 0.999531 -0.9478733 0.9509428 0.999531 -0.9478726 0.9509413 0.999531 -0.9478718 0.9509395 0.999531 -0.947871 0.9509374 0.9995309 -0.94787 0.9509348 0.9995309 -0.9478691 0.9509318 0.9995309 -0.9478684 0.9509284 0.9995309 -0.9478683 0.9509248 0.9995309 -0.9478691 0.9509213 0.9995309 -0.947872 0.9509185 0.9995309 -0.9478785 0.9509177 0.9995308 -0.9478878 0.9509177 0.9995308 -0.9478997 0.9509177 0.9995308 -0.9479146 0.9509177 0.9995308 -0.9479335 0.9509177 0.9995308 -0.9479575 0.9509177 0.9995308 -0.9479878 0.9509177 0.9995308 -0.9480261 0.9509177 0.9995308 -0.9480746 0.9509177 0.9995308 -0.9481359 0.9509177 0.9995308 -0.9482135 0.9509177 0.9995308 -0.9483117 0.9509177 0.9995308 -0.9484359 0.9509177 0.9995308 -0.9485931 0.9509177 0.9995308 -0.9487918 0.9509177 0.9995308 -0.9490434 0.9509177 0.9995308 -0.9493615 0.9509177 0.9995308 -0.9497641 0.9509177 0.9995308 -0.9502734 0.9509177 0.9995308 -0.9509177 0.9509177 0.9995308 -0.9517328 0.9509177 0.9995308 -0.952764 0.9509177 0.9995308 -0.9540687 0.9509177 0.9995308 -0.9557192 0.9509177 0.9995308 -0.9578074 0.9509177 0.9995308 -0.9604492 0.9509177 0.9995308 -0.9637914 0.9509177 0.9995308 -0.9680197 0.9509177 0.9995308 -0.9733691 0.9509177 0.9995308 -0.9801368 0.9509177 0.9995308 -0.9886988 0.9509177 0.9995308 -0.9995308 0.9509177 0.9995308 -0.9996295 0.9603343 0.9909882 -0.9997074 0.9680946 0.9873879 -0.9997688 0.9744313 0.9865561 -0.9998174 0.9795689 0.9871796 -0.9998557 0.9837116 0.9884841 -0.999886 0.9870376 0.9900282 -0.9999099 0.9896992 0.991572 -0.9999288 0.9918234 0.9929957 -0.9999437 0.9935154 0.9942488 -0.9478754 0.9517618 0.999531 -0.9478752 0.9517614 0.999531 -0.947875 0.9517609 0.999531 -0.9478746 0.9517603 0.999531 -0.9478743 0.9517596 0.999531 -0.9478738 0.9517586 0.999531 -0.9478733 0.9517575 0.999531 -0.9478726 0.951756 0.999531 -0.9478718 0.9517543 0.999531 -0.947871 0.9517522 0.9995309 -0.94787 0.9517496 0.9995309 -0.9478691 0.9517467 0.9995309 -0.9478684 0.9517434 0.9995309 -0.9478683 0.9517398 0.9995309 -0.9478691 0.9517364 0.9995309 -0.947872 0.9517337 0.9995309 -0.9478785 0.9517328 0.9995308 -0.9478878 0.9517328 0.9995308 -0.9478997 0.9517328 0.9995308 -0.9479146 0.9517328 0.9995308 -0.9479335 0.9517328 0.9995308 -0.9479575 0.9517328 0.9995308 -0.9479878 0.9517328 0.9995308 -0.9480261 0.9517328 0.9995308 -0.9480746 0.9517328 0.9995308 -0.9481359 0.9517328 0.9995308 -0.9482135 0.9517328 0.9995308 -0.9483117 0.9517328 0.9995308 -0.9484359 0.9517328 0.9995308 -0.9485931 0.9517328 0.9995308 -0.9487918 0.9517328 0.9995308 -0.9490434 0.9517328 0.9995308 -0.9493615 0.9517328 0.9995308 -0.9497641 0.9517328 0.9995308 -0.9502734 0.9517328 0.9995308 -0.9509177 0.9517328 0.9995308 -0.9517328 0.9517328 0.9995308 -0.952764 0.9517328 0.9995308 -0.9540687 0.9517328 0.9995308 -0.9557192 0.9517328 0.9995308 -0.9578074 0.9517328 0.9995308 -0.9604492 0.9517328 0.9995308 -0.9637914 0.9517328 0.9995308 -0.9680197 0.9517328 0.9995308 -0.9733691 0.9517328 0.9995308 -0.9801368 0.9517328 0.9995308 -0.9886988 0.9517328 0.9995308 -0.9995308 0.9517328 0.9995308 -0.9996295 0.9608482 0.9909882 -0.9997074 0.9684181 0.9873879 -0.9997688 0.9746346 0.9865561 -0.9998174 0.9796966 0.9871796 -0.9998557 0.9837916 0.9884841 -0.999886 0.9870878 0.9900282 -0.9999099 0.9897306 0.991572 -0.9999288 0.9918431 0.9929957 -0.9999437 0.9935277 0.9942488 -0.9478754 0.9527924 0.999531 -0.9478752 0.952792 0.999531 -0.947875 0.9527916 0.999531 -0.9478746 0.952791 0.999531 -0.9478743 0.9527902 0.999531 -0.9478738 0.9527893 0.999531 -0.9478733 0.9527882 0.999531 -0.9478726 0.9527868 0.999531 -0.9478718 0.9527851 0.999531 -0.947871 0.952783 0.9995309 -0.94787 0.9527805 0.9995309 -0.9478691 0.9527776 0.9995309 -0.9478684 0.9527744 0.9995309 -0.9478683 0.9527709 0.9995309 -0.9478691 0.9527675 0.9995309 -0.947872 0.9527649 0.9995309 -0.9478785 0.952764 0.9995308 -0.9478878 0.952764 0.9995308 -0.9478997 0.952764 0.9995308 -0.9479146 0.952764 0.9995308 -0.9479335 0.952764 0.9995308 -0.9479575 0.952764 0.9995308 -0.9479878 0.952764 0.9995308 -0.9480261 0.952764 0.9995308 -0.9480746 0.952764 0.9995308 -0.9481359 0.952764 0.9995308 -0.9482135 0.952764 0.9995308 -0.9483117 0.952764 0.9995308 -0.9484359 0.952764 0.9995308 -0.9485931 0.952764 0.9995308 -0.9487918 0.952764 0.9995308 -0.9490434 0.952764 0.9995308 -0.9493615 0.952764 0.9995308 -0.9497641 0.952764 0.9995308 -0.9502734 0.952764 0.9995308 -0.9509177 0.952764 0.9995308 -0.9517328 0.952764 0.9995308 -0.952764 0.952764 0.9995308 -0.9540687 0.952764 0.9995308 -0.9557192 0.952764 0.9995308 -0.9578074 0.952764 0.9995308 -0.9604492 0.952764 0.9995308 -0.9637914 0.952764 0.9995308 -0.9680197 0.952764 0.9995308 -0.9733691 0.952764 0.9995308 -0.9801368 0.952764 0.9995308 -0.9886988 0.952764 0.9995308 -0.9995308 0.952764 0.9995308 -0.9996295 0.9614985 0.9909882 -0.9997074 0.9688274 0.9873879 -0.9997688 0.9748918 0.9865561 -0.9998174 0.979858 0.9871796 -0.9998557 0.9838928 0.9884841 -0.999886 0.9871512 0.9900282 -0.9999099 0.9897703 0.991572 -0.9999288 0.991868 0.9929957 -0.9999437 0.9935432 0.9942488 -0.9478754 0.9540963 0.999531 -0.9478752 0.9540959 0.999531 -0.947875 0.9540954 0.999531 -0.9478746 0.9540949 0.999531 -0.9478743 0.9540941 0.999531 -0.9478738 0.9540933 0.999531 -0.9478733 0.9540921 0.999531 -0.9478726 0.9540908 0.999531 -0.9478718 0.9540891 0.999531 -0.947871 0.9540871 0.9995309 -0.94787 0.9540847 0.9995309 -0.9478691 0.9540819 0.9995309 -0.9478684 0.9540788 0.9995309 -0.9478683 0.9540754 0.9995309 -0.9478691 0.9540721 0.9995309 -0.947872 0.9540695 0.9995309 -0.9478785 0.9540687 0.9995308 -0.9478878 0.9540687 0.9995308 -0.9478997 0.9540687 0.9995308 -0.9479146 0.9540687 0.9995308 -0.9479335 0.9540687 0.9995308 -0.9479575 0.9540687 0.9995308 -0.9479878 0.9540687 0.9995308 -0.9480261 0.9540687 0.9995308 -0.9480746 0.9540687 0.9995308 -0.9481359 0.9540687 0.9995308 -0.9482135 0.9540687 0.9995308 -0.9483117 0.9540687 0.9995308 -0.9484359 0.9540687 0.9995308 -0.9485931 0.9540687 0.9995308 -0.9487918 0.9540687 0.9995308 -0.9490434 0.9540687 0.9995308 -0.9493615 0.9540687 0.9995308 -0.9497641 0.9540687 0.9995308 -0.9502734 0.9540687 0.9995308 -0.9509177 0.9540687 0.9995308 -0.9517328 0.9540687 0.9995308 -0.952764 0.9540687 0.9995308 -0.9540687 0.9540687 0.9995308 -0.9557192 0.9540687 0.9995308 -0.9578074 0.9540687 0.9995308 -0.9604492 0.9540687 0.9995308 -0.9637914 0.9540687 0.9995308 -0.9680197 0.9540687 0.9995308 -0.9733691 0.9540687 0.9995308 -0.9801368 0.9540687 0.9995308 -0.9886988 0.9540687 0.9995308 -0.9995308 0.9540687 0.9995308 -0.9996295 0.9623212 0.9909882 -0.9997074 0.9693452 0.9873879 -0.9997688 0.9752172 0.9865561 -0.9998174 0.9800622 0.9871796 -0.9998557 0.9840209 0.9884841 -0.999886 0.9872315 0.9900282 -0.9999099 0.9898206 0.991572 -0.9999288 0.9918994 0.9929957 -0.9999437 0.9935629 0.9942488 -0.9478754 0.9557458 0.999531 -0.9478752 0.9557455 0.999531 -0.947875 0.955745 0.999531 -0.9478746 0.9557445 0.999531 -0.9478743 0.9557438 0.999531 -0.9478738 0.9557429 0.999531 -0.9478733 0.9557418 0.999531 -0.9478726 0.9557405 0.999531 -0.9478718 0.9557389 0.999531 -0.947871 0.955737 0.9995309 -0.94787 0.9557347 0.9995309 -0.9478691 0.955732 0.9995309 -0.9478684 0.9557289 0.9995309 -0.9478683 0.9557257 0.9995309 -0.9478691 0.9557225 0.9995309 -0.947872 0.95572 0.9995309 -0.9478785 0.9557192 0.9995308 -0.9478878 0.9557192 0.9995308 -0.9478997 0.9557192 0.9995308 -0.9479146 0.9557192 0.9995308 -0.9479335 0.9557192 0.9995308 -0.9479575 0.9557192 0.9995308 -0.9479878 0.9557192 0.9995308 -0.9480261 0.9557192 0.9995308 -0.9480746 0.9557192 0.9995308 -0.9481359 0.9557192 0.9995308 -0.9482135 0.9557192 0.9995308 -0.9483117 0.9557192 0.9995308 -0.9484359 0.9557192 0.9995308 -0.9485931 0.9557192 0.9995308 -0.9487918 0.9557192 0.9995308 -0.9490434 0.9557192 0.9995308 -0.9493615 0.9557192 0.9995308 -0.9497641 0.9557192 0.9995308 -0.9502734 0.9557192 0.9995308 -0.9509177 0.9557192 0.9995308 -0.9517328 0.9557192 0.9995308 -0.952764 0.9557192 0.9995308 -0.9540687 0.9557192 0.9995308 -0.9557192 0.9557192 0.9995308 -0.9578074 0.9557192 0.9995308 -0.9604492 0.9557192 0.9995308 -0.9637914 0.9557192 0.9995308 -0.9680197 0.9557192 0.9995308 -0.9733691 0.9557192 0.9995308 -0.9801368 0.9557192 0.9995308 -0.9886988 0.9557192 0.9995308 -0.9995308 0.9557192 0.9995308 -0.9996295 0.963362 0.9909882 -0.9997074 0.9700002 0.9873879 -0.9997688 0.9756289 0.9865561 -0.9998174 0.9803206 0.9871796 -0.9998557 0.9841829 0.9884841 -0.999886 0.987333 0.9900282 -0.9999099 0.9898842 0.991572 -0.9999288 0.9919392 0.9929957 -0.9999437 0.9935878 0.9942488 -0.9478754 0.9578327 0.999531 -0.9478752 0.9578324 0.999531 -0.947875 0.957832 0.999531 -0.9478746 0.9578314 0.999531 -0.9478743 0.9578308 0.999531 -0.9478738 0.95783 0.999531 -0.9478733 0.9578289 0.999531 -0.9478726 0.9578277 0.999531 -0.9478718 0.9578262 0.999531 -0.947871 0.9578243 0.9995309 -0.94787 0.9578221 0.9995309 -0.9478691 0.9578195 0.9995309 -0.9478684 0.9578166 0.9995309 -0.9478683 0.9578135 0.9995309 -0.9478691 0.9578105 0.9995309 -0.947872 0.9578081 0.9995309 -0.9478785 0.9578074 0.9995308 -0.9478878 0.9578074 0.9995308 -0.9478997 0.9578074 0.9995308 -0.9479146 0.9578074 0.9995308 -0.9479335 0.9578074 0.9995308 -0.9479575 0.9578074 0.9995308 -0.9479878 0.9578074 0.9995308 -0.9480261 0.9578074 0.9995308 -0.9480746 0.9578074 0.9995308 -0.9481359 0.9578074 0.9995308 -0.9482135 0.9578074 0.9995308 -0.9483117 0.9578074 0.9995308 -0.9484359 0.9578074 0.9995308 -0.9485931 0.9578074 0.9995308 -0.9487918 0.9578074 0.9995308 -0.9490434 0.9578074 0.9995308 -0.9493615 0.9578074 0.9995308 -0.9497641 0.9578074 0.9995308 -0.9502734 0.9578074 0.9995308 -0.9509177 0.9578074 0.9995308 -0.9517328 0.9578074 0.9995308 -0.952764 0.9578074 0.9995308 -0.9540687 0.9578074 0.9995308 -0.9557192 0.9578074 0.9995308 -0.9578074 0.9578074 0.9995308 -0.9604492 0.9578074 0.9995308 -0.9637914 0.9578074 0.9995308 -0.9680197 0.9578074 0.9995308 -0.9733691 0.9578074 0.9995308 -0.9801368 0.9578074 0.9995308 -0.9886988 0.9578074 0.9995308 -0.9995308 0.9578074 0.9995308 -0.9996295 0.9646787 0.9909882 -0.9997074 0.970829 0.9873879 -0.9997688 0.9761497 0.9865561 -0.9998174 0.9806476 0.9871796 -0.9998557 0.984388 0.9884841 -0.999886 0.9874615 0.9900282 -0.9999099 0.9899646 0.991572 -0.9999288 0.9919896 0.9929957 -0.9999437 0.9936193 0.9942488 -0.9478754 0.9604729 0.999531 -0.9478752 0.9604726 0.999531 -0.947875 0.9604722 0.999531 -0.9478746 0.9604717 0.999531 -0.9478743 0.9604711 0.999531 -0.9478738 0.9604703 0.999531 -0.9478733 0.9604694 0.999531 -0.9478726 0.9604682 0.999531 -0.9478718 0.9604668 0.999531 -0.947871 0.960465 0.9995309 -0.94787 0.960463 0.9995309 -0.9478691 0.9604606 0.9995309 -0.9478684 0.9604579 0.9995309 -0.9478683 0.9604549 0.9995309 -0.9478691 0.9604521 0.9995309 -0.947872 0.9604499 0.9995309 -0.9478785 0.9604492 0.9995308 -0.9478878 0.9604492 0.9995308 -0.9478997 0.9604492 0.9995308 -0.9479146 0.9604492 0.9995308 -0.9479335 0.9604492 0.9995308 -0.9479575 0.9604492 0.9995308 -0.9479878 0.9604492 0.9995308 -0.9480261 0.9604492 0.9995308 -0.9480746 0.9604492 0.9995308 -0.9481359 0.9604492 0.9995308 -0.9482135 0.9604492 0.9995308 -0.9483117 0.9604492 0.9995308 -0.9484359 0.9604492 0.9995308 -0.9485931 0.9604492 0.9995308 -0.9487918 0.9604492 0.9995308 -0.9490434 0.9604492 0.9995308 -0.9493615 0.9604492 0.9995308 -0.9497641 0.9604492 0.9995308 -0.9502734 0.9604492 0.9995308 -0.9509177 0.9604492 0.9995308 -0.9517328 0.9604492 0.9995308 -0.952764 0.9604492 0.9995308 -0.9540687 0.9604492 0.9995308 -0.9557192 0.9604492 0.9995308 -0.9578074 0.9604492 0.9995308 -0.9604492 0.9604492 0.9995308 -0.9637914 0.9604492 0.9995308 -0.9680197 0.9604492 0.9995308 -0.9733691 0.9604492 0.9995308 -0.9801368 0.9604492 0.9995308 -0.9886988 0.9604492 0.9995308 -0.9995308 0.9604492 0.9995308 -0.9996295 0.9663445 0.9909882 -0.9997074 0.9718774 0.9873879 -0.9997688 0.9768086 0.9865561 -0.9998174 0.9810611 0.9871796 -0.9998557 0.9846473 0.9884841 -0.999886 0.987624 0.9900282 -0.9999099 0.9900664 0.991572 -0.9999288 0.9920533 0.9929957 -0.9999437 0.9936592 0.9942488 -0.9478754 0.9638131 0.999531 -0.9478752 0.9638128 0.999531 -0.947875 0.9638125 0.999531 -0.9478746 0.963812 0.999531 -0.9478743 0.9638114 0.999531 -0.9478738 0.9638107 0.999531 -0.9478733 0.9638099 0.999531 -0.9478726 0.9638088 0.999531 -0.9478718 0.9638075 0.999531 -0.947871 0.9638059 0.9995309 -0.94787 0.963804 0.9995309 -0.9478691 0.9638018 0.9995309 -0.9478684 0.9637993 0.9995309 -0.9478683 0.9637967 0.9995309 -0.9478691 0.9637941 0.9995309 -0.947872 0.963792 0.9995309 -0.9478785 0.9637914 0.9995308 -0.9478878 0.9637914 0.9995308 -0.9478997 0.9637914 0.9995308 -0.9479146 0.9637914 0.9995308 -0.9479335 0.9637914 0.9995308 -0.9479575 0.9637914 0.9995308 -0.9479878 0.9637914 0.9995308 -0.9480261 0.9637914 0.9995308 -0.9480746 0.9637914 0.9995308 -0.9481359 0.9637914 0.9995308 -0.9482135 0.9637914 0.9995308 -0.9483117 0.9637914 0.9995308 -0.9484359 0.9637914 0.9995308 -0.9485931 0.9637914 0.9995308 -0.9487918 0.9637914 0.9995308 -0.9490434 0.9637914 0.9995308 -0.9493615 0.9637914 0.9995308 -0.9497641 0.9637914 0.9995308 -0.9502734 0.9637914 0.9995308 -0.9509177 0.9637914 0.9995308 -0.9517328 0.9637914 0.9995308 -0.952764 0.9637914 0.9995308 -0.9540687 0.9637914 0.9995308 -0.9557192 0.9637914 0.9995308 -0.9578074 0.9637914 0.9995308 -0.9604492 0.9637914 0.9995308 -0.9637914 0.9637914 0.9995308 -0.9680197 0.9637914 0.9995308 -0.9733691 0.9637914 0.9995308 -0.9801368 0.9637914 0.9995308 -0.9886988 0.9637914 0.9995308 -0.9995308 0.9637914 0.9995308 -0.9996295 0.968452 0.9909882 -0.9997074 0.9732039 0.9873879 -0.9997688 0.9776422 0.9865561 -0.9998174 0.9815844 0.9871796 -0.9998557 0.9849754 0.9884841 -0.999886 0.9878296 0.9900282 -0.9999099 0.9901951 0.991572 -0.9999288 0.9921339 0.9929957 -0.9999437 0.9937096 0.9942488 -0.9478754 0.9680389 0.999531 -0.9478752 0.9680386 0.999531 -0.947875 0.9680383 0.999531 -0.9478746 0.9680379 0.999531 -0.9478743 0.9680374 0.999531 -0.9478738 0.9680368 0.999531 -0.9478733 0.968036 0.999531 -0.9478726 0.9680351 0.999531 -0.9478718 0.9680339 0.999531 -0.947871 0.9680325 0.9995309 -0.94787 0.9680309 0.9995309 -0.9478691 0.9680289 0.9995309 -0.9478684 0.9680267 0.9995309 -0.9478683 0.9680244 0.9995309 -0.9478691 0.9680221 0.9995309 -0.947872 0.9680203 0.9995309 -0.9478785 0.9680197 0.9995308 -0.9478878 0.9680197 0.9995308 -0.9478997 0.9680197 0.9995308 -0.9479146 0.9680197 0.9995308 -0.9479335 0.9680197 0.9995308 -0.9479575 0.9680197 0.9995308 -0.9479878 0.9680197 0.9995308 -0.9480261 0.9680197 0.9995308 -0.9480746 0.9680197 0.9995308 -0.9481359 0.9680197 0.9995308 -0.9482135 0.9680197 0.9995308 -0.9483117 0.9680197 0.9995308 -0.9484359 0.9680197 0.9995308 -0.9485931 0.9680197 0.9995308 -0.9487918 0.9680197 0.9995308 -0.9490434 0.9680197 0.9995308 -0.9493615 0.9680197 0.9995308 -0.9497641 0.9680197 0.9995308 -0.9502734 0.9680197 0.9995308 -0.9509177 0.9680197 0.9995308 -0.9517328 0.9680197 0.9995308 -0.952764 0.9680197 0.9995308 -0.9540687 0.9680197 0.9995308 -0.9557192 0.9680197 0.9995308 -0.9578074 0.9680197 0.9995308 -0.9604492 0.9680197 0.9995308 -0.9637914 0.9680197 0.9995308 -0.9680197 0.9680197 0.9995308 -0.9733691 0.9680197 0.9995308 -0.9801368 0.9680197 0.9995308 -0.9886988 0.9680197 0.9995308 -0.9995308 0.9680197 0.9995308 -0.9996295 0.9711183 0.9909882 -0.9997074 0.974882 0.9873879 -0.9997688 0.9786968 0.9865561 -0.9998174 0.9822464 0.9871796 -0.9998557 0.9853905 0.9884841 -0.999886 0.9880897 0.9900282 -0.9999099 0.990358 0.991572 -0.9999288 0.9922358 0.9929957 -0.9999437 0.9937734 0.9942488 -0.9478754 0.9733851 0.999531 -0.9478752 0.9733849 0.999531 -0.947875 0.9733846 0.999531 -0.9478746 0.9733843 0.999531 -0.9478743 0.9733838 0.999531 -0.9478738 0.9733833 0.999531 -0.9478733 0.9733827 0.999531 -0.9478726 0.9733819 0.999531 -0.9478718 0.9733809 0.999531 -0.947871 0.9733798 0.9995309 -0.94787 0.9733784 0.9995309 -0.9478691 0.9733768 0.9995309 -0.9478684 0.9733749 0.9995309 -0.9478683 0.973373 0.9995309 -0.9478691 0.9733711 0.9995309 -0.947872 0.9733696 0.9995309 -0.9478785 0.9733691 0.9995308 -0.9478878 0.9733691 0.9995308 -0.9478997 0.9733691 0.9995308 -0.9479146 0.9733691 0.9995308 -0.9479335 0.9733691 0.9995308 -0.9479575 0.9733691 0.9995308 -0.9479878 0.9733691 0.9995308 -0.9480261 0.9733691 0.9995308 -0.9480746 0.9733691 0.9995308 -0.9481359 0.9733691 0.9995308 -0.9482135 0.9733691 0.9995308 -0.9483117 0.9733691 0.9995308 -0.9484359 0.9733691 0.9995308 -0.9485931 0.9733691 0.9995308 -0.9487918 0.9733691 0.9995308 -0.9490434 0.9733691 0.9995308 -0.9493615 0.9733691 0.9995308 -0.9497641 0.9733691 0.9995308 -0.9502734 0.9733691 0.9995308 -0.9509177 0.9733691 0.9995308 -0.9517328 0.9733691 0.9995308 -0.952764 0.9733691 0.9995308 -0.9540687 0.9733691 0.9995308 -0.9557192 0.9733691 0.9995308 -0.9578074 0.9733691 0.9995308 -0.9604492 0.9733691 0.9995308 -0.9637914 0.9733691 0.9995308 -0.9680197 0.9733691 0.9995308 -0.9733691 0.9733691 0.9995308 -0.9801368 0.9733691 0.9995308 -0.9886988 0.9733691 0.9995308 -0.9995308 0.9733691 0.9995308 -0.9996295 0.9744915 0.9909882 -0.9997074 0.977005 0.9873879 -0.9997688 0.980031 0.9865561 -0.9998174 0.9830838 0.9871796 -0.9998557 0.9859157 0.9884841 -0.999886 0.9884188 0.9900282 -0.9999099 0.9905641 0.991572 -0.9999288 0.9923648 0.9929957 -0.9999437 0.9938541 0.9942488 -0.9478754 0.9801487 0.999531 -0.9478752 0.9801485 0.999531 -0.947875 0.9801483 0.999531 -0.9478746 0.9801481 0.999531 -0.9478743 0.9801478 0.999531 -0.9478738 0.9801474 0.999531 -0.9478733 0.9801469 0.999531 -0.9478726 0.9801463 0.999531 -0.9478718 0.9801456 0.999531 -0.947871 0.9801447 0.9995309 -0.94787 0.9801437 0.9995309 -0.9478691 0.9801425 0.9995309 -0.9478684 0.9801411 0.9995309 -0.9478683 0.9801397 0.9995309 -0.9478691 0.9801383 0.9995309 -0.947872 0.9801372 0.9995309 -0.9478785 0.9801368 0.9995308 -0.9478878 0.9801368 0.9995308 -0.9478997 0.9801368 0.9995308 -0.9479146 0.9801368 0.9995308 -0.9479335 0.9801368 0.9995308 -0.9479575 0.9801368 0.9995308 -0.9479878 0.9801368 0.9995308 -0.9480261 0.9801368 0.9995308 -0.9480746 0.9801368 0.9995308 -0.9481359 0.9801368 0.9995308 -0.9482135 0.9801368 0.9995308 -0.9483117 0.9801368 0.9995308 -0.9484359 0.9801368 0.9995308 -0.9485931 0.9801368 0.9995308 -0.9487918 0.9801368 0.9995308 -0.9490434 0.9801368 0.9995308 -0.9493615 0.9801368 0.9995308 -0.9497641 0.9801368 0.9995308 -0.9502734 0.9801368 0.9995308 -0.9509177 0.9801368 0.9995308 -0.9517328 0.9801368 0.9995308 -0.952764 0.9801368 0.9995308 -0.9540687 0.9801368 0.9995308 -0.9557192 0.9801368 0.9995308 -0.9578074 0.9801368 0.9995308 -0.9604492 0.9801368 0.9995308 -0.9637914 0.9801368 0.9995308 -0.9680197 0.9801368 0.9995308 -0.9733691 0.9801368 0.9995308 -0.9801368 0.9801368 0.9995308 -0.9886988 0.9801368 0.9995308 -0.9995308 0.9801368 0.9995308 -0.9996295 0.978759 0.9909882 -0.9997074 0.9796909 0.9873879 -0.9997688 0.981719 0.9865561 -0.9998174 0.9841433 0.9871796 -0.9998557 0.9865801 0.9884841 -0.999886 0.9888351 0.9900282 -0.9999099 0.9908248 0.991572 -0.9999288 0.992528 0.9929957 -0.9999437 0.9939562 0.9942488 -0.9478754 0.9887055 0.999531 -0.9478752 0.9887054 0.999531 -0.947875 0.9887053 0.999531 -0.9478746 0.9887052 0.999531 -0.9478743 0.988705 0.999531 -0.9478738 0.9887048 0.999531 -0.9478733 0.9887045 0.999531 -0.9478726 0.9887042 0.999531 -0.9478718 0.9887038 0.999531 -0.947871 0.9887033 0.9995309 -0.94787 0.9887027 0.9995309 -0.9478691 0.988702 0.9995309 -0.9478684 0.9887012 0.9995309 -0.9478683 0.9887004 0.9995309 -0.9478691 0.9886996 0.9995309 -0.947872 0.988699 0.9995309 -0.9478785 0.9886988 0.9995308 -0.9478878 0.9886988 0.9995308 -0.9478997 0.9886988 0.9995308 -0.9479146 0.9886988 0.9995308 -0.9479335 0.9886988 0.9995308 -0.9479575 0.9886988 0.9995308 -0.9479878 0.9886988 0.9995308 -0.9480261 0.9886988 0.9995308 -0.9480746 0.9886988 0.9995308 -0.9481359 0.9886988 0.9995308 -0.9482135 0.9886988 0.9995308 -0.9483117 0.9886988 0.9995308 -0.9484359 0.9886988 0.9995308 -0.9485931 0.9886988 0.9995308 -0.9487918 0.9886988 0.9995308 -0.9490434 0.9886988 0.9995308 -0.9493615 0.9886988 0.9995308 -0.9497641 0.9886988 0.9995308 -0.9502734 0.9886988 0.9995308 -0.9509177 0.9886988 0.9995308 -0.9517328 0.9886988 0.9995308 -0.952764 0.9886988 0.9995308 -0.9540687 0.9886988 0.9995308 -0.9557192 0.9886988 0.9995308 -0.9578074 0.9886988 0.9995308 -0.9604492 0.9886988 0.9995308 -0.9637914 0.9886988 0.9995308 -0.9680197 0.9886988 0.9995308 -0.9733691 0.9886988 0.9995308 -0.9801368 0.9886988 0.9995308 -0.9886988 0.9886988 0.9995308 -0.9995308 0.9886988 0.9995308 -0.9996295 0.9841579 0.9909882 -0.9997074 0.983089 0.9873879 -0.9997688 0.9838545 0.9865561 -0.9998174 0.9854838 0.9871796 -0.9998557 0.9874207 0.9884841 -0.999886 0.9893618 0.9900282 -0.9999099 0.9911547 0.991572 -0.9999288 0.9927345 0.9929957 -0.9999437 0.9940854 0.9942488 -0.9478754 0.999531 0.999531 -0.9478752 0.999531 0.999531 -0.947875 0.999531 0.999531 -0.9478746 0.999531 0.999531 -0.9478743 0.999531 0.999531 -0.9478738 0.999531 0.999531 -0.9478733 0.999531 0.999531 -0.9478726 0.999531 0.999531 -0.9478718 0.999531 0.999531 -0.947871 0.9995309 0.9995309 -0.94787 0.9995309 0.9995309 -0.9478691 0.9995309 0.9995309 -0.9478684 0.9995309 0.9995309 -0.9478683 0.9995309 0.9995309 -0.9478691 0.9995309 0.9995309 -0.947872 0.9995309 0.9995309 -0.9478785 0.9995308 0.9995308 -0.9478878 0.9995308 0.9995308 -0.9478997 0.9995308 0.9995308 -0.9479146 0.9995308 0.9995308 -0.9479335 0.9995308 0.9995308 -0.9479575 0.9995308 0.9995308 -0.9479878 0.9995308 0.9995308 -0.9480261 0.9995308 0.9995308 -0.9480746 0.9995308 0.9995308 -0.9481359 0.9995308 0.9995308 -0.9482135 0.9995308 0.9995308 -0.9483117 0.9995308 0.9995308 -0.9484359 0.9995308 0.9995308 -0.9485931 0.9995308 0.9995308 -0.9487918 0.9995308 0.9995308 -0.9490434 0.9995308 0.9995308 -0.9493615 0.9995308 0.9995308 -0.9497641 0.9995308 0.9995308 -0.9502734 0.9995308 0.9995308 -0.9509177 0.9995308 0.9995308 -0.9517328 0.9995308 0.9995308 -0.952764 0.9995308 0.9995308 -0.9540687 0.9995308 0.9995308 -0.9557192 0.9995308 0.9995308 -0.9578074 0.9995308 0.9995308 -0.9604492 0.9995308 0.9995308 -0.9637914 0.9995308 0.9995308 -0.9680197 0.9995308 0.9995308 -0.9733691 0.9995308 0.9995308 -0.9801368 0.9995308 0.9995308 -0.9886988 0.9995308 0.9995308 -0.9995308 0.9995308 0.9995308 -0.9996295 0.9909882 0.9909882 -0.9997074 0.9873879 0.9873879 -0.9997688 0.9865561 0.9865561 -0.9998174 0.9871796 0.9871796 -0.9998557 0.9884841 0.9884841 -0.999886 0.9900282 0.9900282 -0.9999099 0.991572 0.991572 -0.9999288 0.9929957 0.9929957 -0.9999437 0.9942488 0.9942488 -0.958416 0.9996296 0.9909925 -0.9584159 0.9996296 0.9909924 -0.9584157 0.9996296 0.9909923 -0.9584155 0.9996296 0.9909923 -0.9584153 0.9996296 0.9909921 -0.958415 0.9996296 0.990992 -0.9584146 0.9996296 0.9909918 -0.9584142 0.9996296 0.9909916 -0.9584137 0.9996296 0.9909914 -0.9584132 0.9996296 0.9909911 -0.9584126 0.9996296 0.9909907 -0.958412 0.9996296 0.9909903 -0.9584115 0.9996296 0.9909898 -0.9584114 0.9996295 0.9909893 -0.958412 0.9996295 0.9909888 -0.9584138 0.9996295 0.9909884 -0.9584178 0.9996295 0.9909882 -0.9584237 0.9996295 0.9909882 -0.9584312 0.9996295 0.9909882 -0.9584406 0.9996295 0.9909882 -0.9584526 0.9996295 0.9909882 -0.9584677 0.9996295 0.9909882 -0.9584868 0.9996295 0.9909882 -0.9585109 0.9996295 0.9909882 -0.9585415 0.9996295 0.9909882 -0.9585802 0.9996295 0.9909882 -0.9586291 0.9996295 0.9909882 -0.958691 0.9996295 0.9909882 -0.9587693 0.9996295 0.9909882 -0.9588684 0.9996295 0.9909882 -0.9589938 0.9996295 0.9909882 -0.9591524 0.9996295 0.9909882 -0.959353 0.9996295 0.9909882 -0.9596068 0.9996295 0.9909882 -0.959928 0.9996295 0.9909882 -0.9603343 0.9996295 0.9909882 -0.9608482 0.9996295 0.9909882 -0.9614985 0.9996295 0.9909882 -0.9623212 0.9996295 0.9909882 -0.963362 0.9996295 0.9909882 -0.9646787 0.9996295 0.9909882 -0.9663445 0.9996295 0.9909882 -0.968452 0.9996295 0.9909882 -0.9711183 0.9996295 0.9909882 -0.9744915 0.9996295 0.9909882 -0.978759 0.9996295 0.9909882 -0.9841579 0.9996295 0.9909882 -0.9909882 0.9996295 0.9909882 -0.9996295 0.9996295 0.9909882 -0.9997074 0.9928267 0.9873879 -0.9997688 0.9899741 0.9865561 -0.9998174 0.989325 0.9871796 -0.9998557 0.9898295 0.9884841 -0.999886 0.9908712 0.9900282 -0.9999099 0.9920999 0.991572 -0.9999288 0.9933261 0.9929957 -0.9999437 0.9944556 0.9942488 -0.9668873 0.9997074 0.9873927 -0.9668872 0.9997074 0.9873926 -0.9668871 0.9997074 0.9873925 -0.966887 0.9997074 0.9873924 -0.9668869 0.9997074 0.9873923 -0.9668867 0.9997074 0.9873922 -0.9668865 0.9997074 0.987392 -0.9668862 0.9997074 0.9873917 -0.9668859 0.9997074 0.9873914 -0.9668855 0.9997074 0.9873911 -0.9668852 0.9997074 0.9873907 -0.9668848 0.9997074 0.9873902 -0.9668845 0.9997074 0.9873897 -0.9668844 0.9997074 0.9873891 -0.9668847 0.9997074 0.9873885 -0.9668859 0.9997074 0.9873881 -0.9668884 0.9997074 0.9873879 -0.9668922 0.9997074 0.9873879 -0.9668969 0.9997074 0.9873879 -0.9669028 0.9997074 0.9873879 -0.9669103 0.9997074 0.9873879 -0.9669198 0.9997074 0.9873879 -0.9669318 0.9997074 0.9873879 -0.966947 0.9997074 0.9873879 -0.9669663 0.9997074 0.9873879 -0.9669906 0.9997074 0.9873879 -0.9670214 0.9997074 0.9873879 -0.9670604 0.9997074 0.9873879 -0.9671097 0.9997074 0.9873879 -0.967172 0.9997074 0.9873879 -0.9672509 0.9997074 0.9873879 -0.9673508 0.9997074 0.9873879 -0.967477 0.9997074 0.9873879 -0.9676368 0.9997074 0.9873879 -0.9678389 0.9997074 0.9873879 -0.9680946 0.9997074 0.9873879 -0.9684181 0.9997074 0.9873879 -0.9688274 0.9997074 0.9873879 -0.9693452 0.9997074 0.9873879 -0.9700002 0.9997074 0.9873879 -0.970829 0.9997074 0.9873879 -0.9718774 0.9997074 0.9873879 -0.9732039 0.9997074 0.9873879 -0.974882 0.9997074 0.9873879 -0.977005 0.9997074 0.9873879 -0.9796909 0.9997074 0.9873879 -0.983089 0.9997074 0.9873879 -0.9873879 0.9997074 0.9873879 -0.9928267 0.9997074 0.9873879 -0.9997074 0.9997074 0.9873879 -0.9997688 0.9942982 0.9865561 -0.9998174 0.9920392 0.9871796 -0.9998557 0.9915316 0.9884841 -0.999886 0.9919377 0.9900282 -0.9999099 0.9927678 0.991572 -0.9999288 0.9937442 0.9929957 -0.9999437 0.9947172 0.9942488 -0.9736726 0.9997689 0.9865601 -0.9736726 0.9997689 0.9865601 -0.9736725 0.9997689 0.98656 -0.9736724 0.9997689 0.9865599 -0.9736723 0.9997689 0.9865598 -0.9736722 0.9997689 0.9865597 -0.9736721 0.9997689 0.9865595 -0.9736719 0.9997689 0.9865593 -0.9736717 0.9997689 0.9865591 -0.9736715 0.9997689 0.9865588 -0.9736712 0.9997689 0.9865585 -0.973671 0.9997689 0.986558 -0.9736708 0.9997689 0.9865576 -0.9736708 0.9997689 0.9865571 -0.973671 0.9997688 0.9865566 -0.9736717 0.9997688 0.9865562 -0.9736733 0.9997688 0.9865561 -0.9736756 0.9997688 0.9865561 -0.9736786 0.9997688 0.9865561 -0.9736823 0.9997688 0.9865561 -0.973687 0.9997688 0.9865561 -0.973693 0.9997688 0.9865561 -0.9737006 0.9997688 0.9865561 -0.9737101 0.9997688 0.9865561 -0.9737222 0.9997688 0.9865561 -0.9737375 0.9997688 0.9865561 -0.9737569 0.9997688 0.9865561 -0.9737814 0.9997688 0.9865561 -0.9738123 0.9997688 0.9865561 -0.9738515 0.9997688 0.9865561 -0.9739011 0.9997688 0.9865561 -0.9739638 0.9997688 0.9865561 -0.9740432 0.9997688 0.9865561 -0.9741436 0.9997688 0.9865561 -0.9742706 0.9997688 0.9865561 -0.9744313 0.9997688 0.9865561 -0.9746346 0.9997688 0.9865561 -0.9748918 0.9997688 0.9865561 -0.9752172 0.9997688 0.9865561 -0.9756289 0.9997688 0.9865561 -0.9761497 0.9997688 0.9865561 -0.9768086 0.9997688 0.9865561 -0.9776422 0.9997688 0.9865561 -0.9786968 0.9997688 0.9865561 -0.980031 0.9997688 0.9865561 -0.981719 0.9997688 0.9865561 -0.9838545 0.9997688 0.9865561 -0.9865561 0.9997688 0.9865561 -0.9899741 0.9997688 0.9865561 -0.9942982 0.9997688 0.9865561 -0.9997688 0.9997688 0.9865561 -0.9998174 0.9954731 0.9871796 -0.9998557 0.9936849 0.9884841 -0.999886 0.993287 0.9900282 -0.9999099 0.9936128 0.991572 -0.9999288 0.9942731 0.9929957 -0.9999437 0.9950481 0.9942488 -0.9790927 0.9998174 0.9871826 -0.9790927 0.9998174 0.9871826 -0.9790927 0.9998174 0.9871825 -0.9790926 0.9998174 0.9871825 -0.9790925 0.9998174 0.9871824 -0.9790925 0.9998174 0.9871823 -0.9790924 0.9998174 0.9871822 -0.9790923 0.9998174 0.987182 -0.9790921 0.9998174 0.9871818 -0.979092 0.9998174 0.9871816 -0.9790919 0.9998174 0.9871813 -0.9790917 0.9998174 0.987181 -0.9790916 0.9998174 0.9871807 -0.9790916 0.9998174 0.9871803 -0.9790917 0.9998174 0.98718 -0.9790921 0.9998174 0.9871797 -0.9790931 0.9998174 0.9871796 -0.9790946 0.9998174 0.9871796 -0.9790965 0.9998174 0.9871796 -0.9790988 0.9998174 0.9871796 -0.9791018 0.9998174 0.9871796 -0.9791055 0.9998174 0.9871796 -0.9791103 0.9998174 0.9871796 -0.9791163 0.9998174 0.9871796 -0.9791238 0.9998174 0.9871796 -0.9791334 0.9998174 0.9871796 -0.9791456 0.9998174 0.9871796 -0.979161 0.9998174 0.9871796 -0.9791804 0.9998174 0.9871796 -0.979205 0.9998174 0.9871796 -0.9792361 0.9998174 0.9871796 -0.9792755 0.9998174 0.9871796 -0.9793253 0.9998174 0.9871796 -0.9793883 0.9998174 0.9871796 -0.9794681 0.9998174 0.9871796 -0.9795689 0.9998174 0.9871796 -0.9796966 0.9998174 0.9871796 -0.979858 0.9998174 0.9871796 -0.9800622 0.9998174 0.9871796 -0.9803206 0.9998174 0.9871796 -0.9806476 0.9998174 0.9871796 -0.9810611 0.9998174 0.9871796 -0.9815844 0.9998174 0.9871796 -0.9822464 0.9998174 0.9871796 -0.9830838 0.9998174 0.9871796 -0.9841433 0.9998174 0.9871796 -0.9854838 0.9998174 0.9871796 -0.9871796 0.9998174 0.9871796 -0.989325 0.9998174 0.9871796 -0.9920392 0.9998174 0.9871796 -0.9954731 0.9998174 0.9871796 -0.9998174 0.9998174 0.9871796 -0.9998557 0.9964092 0.9884841 -0.999886 0.9949941 0.9900282 -0.9999099 0.9946818 0.991572 -0.9999288 0.9949422 0.9929957 -0.9999437 0.9954668 0.9942488 -0.9834129 0.9998557 0.9884863 -0.9834129 0.9998557 0.9884863 -0.9834129 0.9998557 0.9884862 -0.9834129 0.9998557 0.9884862 -0.9834128 0.9998557 0.9884861 -0.9834128 0.9998557 0.988486 -0.9834127 0.9998557 0.988486 -0.9834127 0.9998557 0.9884859 -0.9834126 0.9998557 0.9884857 -0.9834125 0.9998557 0.9884856 -0.9834124 0.9998557 0.9884854 -0.9834123 0.9998557 0.9884852 -0.9834122 0.9998557 0.9884849 -0.9834122 0.9998557 0.9884846 -0.9834123 0.9998557 0.9884844 -0.9834126 0.9998557 0.9884842 -0.9834132 0.9998557 0.9884841 -0.9834141 0.9998557 0.9884841 -0.9834153 0.9998557 0.9884841 -0.9834167 0.9998557 0.9884841 -0.9834186 0.9998557 0.9884841 -0.9834209 0.9998557 0.9884841 -0.9834239 0.9998557 0.9884841 -0.9834277 0.9998557 0.9884841 -0.9834324 0.9998557 0.9884841 -0.9834385 0.9998557 0.9884841 -0.9834461 0.9998557 0.9884841 -0.9834557 0.9998557 0.9884841 -0.9834679 0.9998557 0.9884841 -0.9834833 0.9998557 0.9884841 -0.9835029 0.9998557 0.9884841 -0.9835276 0.9998557 0.9884841 -0.9835588 0.9998557 0.9884841 -0.9835983 0.9998557 0.9884841 -0.9836483 0.9998557 0.9884841 -0.9837116 0.9998557 0.9884841 -0.9837916 0.9998557 0.9884841 -0.9838928 0.9998557 0.9884841 -0.9840209 0.9998557 0.9884841 -0.9841829 0.9998557 0.9884841 -0.984388 0.9998557 0.9884841 -0.9846473 0.9998557 0.9884841 -0.9849754 0.9998557 0.9884841 -0.9853905 0.9998557 0.9884841 -0.9859157 0.9998557 0.9884841 -0.9865801 0.9998557 0.9884841 -0.9874207 0.9998557 0.9884841 -0.9884841 0.9998557 0.9884841 -0.9898295 0.9998557 0.9884841 -0.9915316 0.9998557 0.9884841 -0.9936849 0.9998557 0.9884841 -0.9964092 0.9998557 0.9884841 -0.9998557 0.9998557 0.9884841 -0.999886 0.9971537 0.9900282 -0.9999099 0.9960342 0.991572 -0.9999288 0.9957887 0.9929957 -0.9999437 0.9959964 0.9942488 -0.9868505 0.999886 0.9900297 -0.9868505 0.999886 0.9900296 -0.9868505 0.999886 0.9900296 -0.9868505 0.999886 0.9900296 -0.9868504 0.999886 0.9900295 -0.9868504 0.999886 0.9900295 -0.9868504 0.999886 0.9900294 -0.9868503 0.999886 0.9900294 -0.9868503 0.999886 0.9900293 -0.9868502 0.999886 0.9900292 -0.9868502 0.999886 0.990029 -0.9868501 0.999886 0.9900289 -0.9868501 0.999886 0.9900287 -0.98685 0.999886 0.9900285 -0.9868501 0.999886 0.9900284 -0.9868503 0.999886 0.9900282 -0.9868507 0.999886 0.9900282 -0.9868512 0.999886 0.9900282 -0.986852 0.999886 0.9900282 -0.9868529 0.999886 0.9900282 -0.9868541 0.999886 0.9900282 -0.9868555 0.999886 0.9900282 -0.9868574 0.999886 0.9900282 -0.9868597 0.999886 0.9900282 -0.9868627 0.999886 0.9900282 -0.9868665 0.999886 0.9900282 -0.9868713 0.999886 0.9900282 -0.9868773 0.999886 0.9900282 -0.986885 0.999886 0.9900282 -0.9868946 0.999886 0.9900282 -0.9869069 0.999886 0.9900282 -0.9869223 0.999886 0.9900282 -0.9869419 0.999886 0.9900282 -0.9869667 0.999886 0.9900282 -0.986998 0.999886 0.9900282 -0.9870376 0.999886 0.9900282 -0.9870878 0.999886 0.9900282 -0.9871512 0.999886 0.9900282 -0.9872315 0.999886 0.9900282 -0.987333 0.999886 0.9900282 -0.9874615 0.999886 0.9900282 -0.987624 0.999886 0.9900282 -0.9878296 0.999886 0.9900282 -0.9880897 0.999886 0.9900282 -0.9884188 0.999886 0.9900282 -0.9888351 0.999886 0.9900282 -0.9893618 0.999886 0.9900282 -0.9900282 0.999886 0.9900282 -0.9908712 0.999886 0.9900282 -0.9919377 0.999886 0.9900282 -0.993287 0.999886 0.9900282 -0.9949941 0.999886 0.9900282 -0.9971537 0.999886 0.9900282 -0.999886 0.999886 0.9900282 -0.9999099 0.9977452 0.991572 -0.9999288 0.9968597 0.9929957 -0.9999437 0.9966665 0.9942488 -0.989582 0.9999099 0.991573 -0.989582 0.9999099 0.9915729 -0.989582 0.9999099 0.9915729 -0.989582 0.9999099 0.9915729 -0.989582 0.9999099 0.9915729 -0.9895819 0.9999099 0.9915728 -0.9895819 0.9999099 0.9915728 -0.9895819 0.9999099 0.9915728 -0.9895819 0.9999099 0.9915727 -0.9895818 0.9999099 0.9915726 -0.9895818 0.9999099 0.9915725 -0.9895818 0.9999099 0.9915724 -0.9895817 0.9999099 0.9915723 -0.9895817 0.9999099 0.9915722 -0.9895817 0.9999099 0.9915721 -0.9895819 0.9999099 0.991572 -0.9895821 0.9999099 0.991572 -0.9895825 0.9999099 0.991572 -0.9895829 0.9999099 0.991572 -0.9895835 0.9999099 0.991572 -0.9895842 0.9999099 0.991572 -0.9895851 0.9999099 0.991572 -0.9895863 0.9999099 0.991572 -0.9895878 0.9999099 0.991572 -0.9895897 0.9999099 0.991572 -0.989592 0.9999099 0.991572 -0.989595 0.9999099 0.991572 -0.9895988 0.9999099 0.991572 -0.9896036 0.9999099 0.991572 -0.9896096 0.9999099 0.991572 -0.9896173 0.9999099 0.991572 -0.989627 0.9999099 0.991572 -0.9896392 0.9999099 0.991572 -0.9896547 0.9999099 0.991572 -0.9896744 0.9999099 0.991572 -0.9896992 0.9999099 0.991572 -0.9897306 0.9999099 0.991572 -0.9897703 0.9999099 0.991572 -0.9898206 0.9999099 0.991572 -0.9898842 0.9999099 0.991572 -0.9899646 0.9999099 0.991572 -0.9900664 0.9999099 0.991572 -0.9901951 0.9999099 0.991572 -0.990358 0.9999099 0.991572 -0.9905641 0.9999099 0.991572 -0.9908248 0.9999099 0.991572 -0.9911547 0.9999099 0.991572 -0.991572 0.9999099 0.991572 -0.9920999 0.9999099 0.991572 -0.9927678 0.9999099 0.991572 -0.9936128 0.9999099 0.991572 -0.9946818 0.9999099 0.991572 -0.9960342 0.9999099 0.991572 -0.9977452 0.9999099 0.991572 -0.9999099 0.9999099 0.991572 -0.9999288 0.9982146 0.9929957 -0.9999437 0.9975143 0.9942488 -0.9917501 0.9999288 0.9929963 -0.9917501 0.9999288 0.9929963 -0.9917501 0.9999288 0.9929963 -0.9917501 0.9999288 0.9929963 -0.9917501 0.9999288 0.9929963 -0.9917501 0.9999288 0.9929962 -0.99175 0.9999288 0.9929962 -0.99175 0.9999288 0.9929962 -0.99175 0.9999288 0.9929962 -0.99175 0.9999288 0.9929961 -0.99175 0.9999288 0.992996 -0.9917499 0.9999288 0.992996 -0.9917499 0.9999288 0.9929959 -0.9917499 0.9999288 0.9929958 -0.9917499 0.9999288 0.9929957 -0.99175 0.9999288 0.9929957 -0.9917502 0.9999288 0.9929957 -0.9917504 0.9999288 0.9929957 -0.9917507 0.9999288 0.9929957 -0.991751 0.9999288 0.9929957 -0.9917515 0.9999288 0.9929957 -0.9917521 0.9999288 0.9929957 -0.9917528 0.9999288 0.9929957 -0.9917537 0.9999288 0.9929957 -0.9917549 0.9999288 0.9929957 -0.9917564 0.9999288 0.9929957 -0.9917582 0.9999288 0.9929957 -0.9917606 0.9999288 0.9929957 -0.9917636 0.9999288 0.9929957 -0.9917674 0.9999288 0.9929957 -0.9917722 0.9999288 0.9929957 -0.9917782 0.9999288 0.9929957 -0.9917859 0.9999288 0.9929957 -0.9917956 0.9999288 0.9929957 -0.9918079 0.9999288 0.9929957 -0.9918234 0.9999288 0.9929957 -0.9918431 0.9999288 0.9929957 -0.991868 0.9999288 0.9929957 -0.9918994 0.9999288 0.9929957 -0.9919392 0.9999288 0.9929957 -0.9919896 0.9999288 0.9929957 -0.9920533 0.9999288 0.9929957 -0.9921339 0.9999288 0.9929957 -0.9922358 0.9999288 0.9929957 -0.9923648 0.9999288 0.9929957 -0.992528 0.9999288 0.9929957 -0.9927345 0.9999288 0.9929957 -0.9929957 0.9999288 0.9929957 -0.9933261 0.9999288 0.9929957 -0.9937442 0.9999288 0.9929957 -0.9942731 0.9999288 0.9929957 -0.9949422 0.9999288 0.9929957 -0.9957887 0.9999288 0.9929957 -0.9968597 0.9999288 0.9929957 -0.9982146 0.9999288 0.9929957 -0.9999288 0.9999288 0.9929957 -0.9999437 0.9985868 0.9942488 -0.9934695 0.9999437 0.9942493 -0.9934695 0.9999437 0.9942492 -0.9934695 0.9999437 0.9942492 -0.9934695 0.9999437 0.9942492 -0.9934695 0.9999437 0.9942492 -0.9934695 0.9999437 0.9942492 -0.9934695 0.9999437 0.9942492 -0.9934694 0.9999437 0.9942492 -0.9934694 0.9999437 0.9942491 -0.9934694 0.9999437 0.9942491 -0.9934694 0.9999437 0.9942491 -0.9934694 0.9999437 0.994249 -0.9934694 0.9999437 0.994249 -0.9934694 0.9999437 0.9942489 -0.9934694 0.9999437 0.9942489 -0.9934694 0.9999437 0.9942488 -0.9934695 0.9999437 0.9942488 -0.9934697 0.9999437 0.9942488 -0.9934698 0.9999437 0.9942488 -0.9934701 0.9999437 0.9942488 -0.9934704 0.9999437 0.9942488 -0.9934707 0.9999437 0.9942488 -0.9934712 0.9999437 0.9942488 -0.9934718 0.9999437 0.9942488 -0.9934725 0.9999437 0.9942488 -0.9934734 0.9999437 0.9942488 -0.9934746 0.9999437 0.9942488 -0.9934761 0.9999437 0.9942488 -0.9934779 0.9999437 0.9942488 -0.9934803 0.9999437 0.9942488 -0.9934833 0.9999437 0.9942488 -0.9934871 0.9999437 0.9942488 -0.9934919 0.9999437 0.9942488 -0.993498 0.9999437 0.9942488 -0.9935057 0.9999437 0.9942488 -0.9935154 0.9999437 0.9942488 -0.9935277 0.9999437 0.9942488 -0.9935432 0.9999437 0.9942488 -0.9935629 0.9999437 0.9942488 -0.9935878 0.9999437 0.9942488 -0.9936193 0.9999437 0.9942488 -0.9936592 0.9999437 0.9942488 -0.9937096 0.9999437 0.9942488 -0.9937734 0.9999437 0.9942488 -0.9938541 0.9999437 0.9942488 -0.9939562 0.9999437 0.9942488 -0.9940854 0.9999437 0.9942488 -0.9942488 0.9999437 0.9942488 -0.9944556 0.9999437 0.9942488 -0.9947172 0.9999437 0.9942488 -0.9950481 0.9999437 0.9942488 -0.9954668 0.9999437 0.9942488 -0.9959964 0.9999437 0.9942488 -0.9966665 0.9999437 0.9942488 -0.9975143 0.9999437 0.9942488 -0.9985868 0.9999437 0.9942488 -0.9999437 0.9999437 0.9942488 -0.958416 0.958416 0.9996296 -0.9584161 0.958416 0.9996296 -0.9584163 0.958416 0.9996296 -0.9584165 0.958416 0.9996296 -0.9584168 0.958416 0.9996296 -0.9584171 0.958416 0.9996296 -0.9584176 0.958416 0.9996296 -0.9584181 0.958416 0.9996296 -0.9584189 0.958416 0.9996296 -0.9584198 0.958416 0.9996296 -0.9584209 0.958416 0.9996296 -0.9584223 0.958416 0.9996296 -0.9584241 0.958416 0.9996296 -0.9584264 0.958416 0.9996296 -0.9584293 0.958416 0.9996296 -0.958433 0.958416 0.9996296 -0.9584377 0.958416 0.9996296 -0.9584436 0.958416 0.9996296 -0.958451 0.958416 0.9996296 -0.9584605 0.958416 0.9996296 -0.9584724 0.958416 0.9996296 -0.9584875 0.958416 0.9996296 -0.9585066 0.958416 0.9996296 -0.9585307 0.958416 0.9996296 -0.9585613 0.958416 0.9996296 -0.9585999 0.958416 0.9996296 -0.9586489 0.958416 0.9996296 -0.9587107 0.958416 0.9996296 -0.958789 0.958416 0.9996296 -0.958888 0.958416 0.9996296 -0.9590133 0.958416 0.9996296 -0.9591719 0.958416 0.9996296 -0.9593724 0.958416 0.9996296 -0.9596261 0.958416 0.9996296 -0.9599471 0.958416 0.9996296 -0.9603532 0.958416 0.9996296 -0.9608669 0.958416 0.9996296 -0.9615169 0.958416 0.9996296 -0.9623392 0.958416 0.9996296 -0.9633794 0.958416 0.9996296 -0.9646955 0.958416 0.9996296 -0.9663606 0.958416 0.9996296 -0.9684671 0.958416 0.9996296 -0.971132 0.958416 0.9996296 -0.9745036 0.958416 0.9996296 -0.978769 0.958416 0.9996296 -0.9841654 0.958416 0.9996296 -0.9909925 0.958416 0.9996296 -0.9996296 0.958416 0.9996296 -0.9997074 0.9668873 0.9928293 -0.9997689 0.9736726 0.9899771 -0.9998174 0.9790927 0.9893275 -0.9998557 0.9834129 0.9898314 -0.999886 0.9868505 0.9908726 -0.9999099 0.989582 0.9921008 -0.9999288 0.9917501 0.9933267 -0.9999437 0.9934695 0.994456 -0.958416 0.9584161 0.9996296 -0.9584159 0.9584159 0.9996296 -0.958416 0.9584159 0.9996296 -0.9584162 0.9584159 0.9996296 -0.9584165 0.9584159 0.9996296 -0.9584169 0.9584159 0.9996296 -0.9584173 0.9584159 0.9996296 -0.9584179 0.9584159 0.9996296 -0.9584186 0.9584159 0.9996296 -0.9584195 0.9584159 0.9996296 -0.9584206 0.9584159 0.9996296 -0.9584221 0.9584159 0.9996296 -0.9584239 0.9584159 0.9996296 -0.9584262 0.9584159 0.9996296 -0.9584291 0.9584159 0.9996296 -0.9584328 0.9584159 0.9996296 -0.9584374 0.9584159 0.9996296 -0.9584433 0.9584159 0.9996296 -0.9584508 0.9584159 0.9996296 -0.9584602 0.9584159 0.9996296 -0.9584721 0.9584159 0.9996296 -0.9584872 0.9584159 0.9996296 -0.9585063 0.9584159 0.9996296 -0.9585305 0.9584159 0.9996296 -0.958561 0.9584159 0.9996296 -0.9585997 0.9584159 0.9996296 -0.9586486 0.9584159 0.9996296 -0.9587105 0.9584159 0.9996296 -0.9587888 0.9584159 0.9996296 -0.9588878 0.9584159 0.9996296 -0.9590131 0.9584159 0.9996296 -0.9591716 0.9584159 0.9996296 -0.9593721 0.9584159 0.9996296 -0.9596259 0.9584159 0.9996296 -0.9599468 0.9584159 0.9996296 -0.9603529 0.9584159 0.9996296 -0.9608667 0.9584159 0.9996296 -0.9615166 0.9584159 0.9996296 -0.9623389 0.9584159 0.9996296 -0.9633792 0.9584159 0.9996296 -0.9646953 0.9584159 0.9996296 -0.9663604 0.9584159 0.9996296 -0.9684669 0.9584159 0.9996296 -0.9711319 0.9584159 0.9996296 -0.9745034 0.9584159 0.9996296 -0.9787689 0.9584159 0.9996296 -0.9841653 0.9584159 0.9996296 -0.9909924 0.9584159 0.9996296 -0.9996296 0.9584159 0.9996296 -0.9997074 0.9668872 0.9928293 -0.9997689 0.9736726 0.989977 -0.9998174 0.9790927 0.9893275 -0.9998557 0.9834129 0.9898314 -0.999886 0.9868505 0.9908725 -0.9999099 0.989582 0.9921008 -0.9999288 0.9917501 0.9933267 -0.9999437 0.9934695 0.994456 -0.958416 0.9584163 0.9996296 -0.9584159 0.958416 0.9996296 -0.9584157 0.9584157 0.9996296 -0.9584159 0.9584157 0.9996296 -0.9584162 0.9584157 0.9996296 -0.9584165 0.9584157 0.9996296 -0.958417 0.9584157 0.9996296 -0.9584176 0.9584157 0.9996296 -0.9584183 0.9584157 0.9996296 -0.9584192 0.9584157 0.9996296 -0.9584203 0.9584157 0.9996296 -0.9584217 0.9584157 0.9996296 -0.9584235 0.9584157 0.9996296 -0.9584258 0.9584157 0.9996296 -0.9584288 0.9584157 0.9996296 -0.9584324 0.9584157 0.9996296 -0.9584371 0.9584157 0.9996296 -0.958443 0.9584157 0.9996296 -0.9584504 0.9584157 0.9996296 -0.9584599 0.9584157 0.9996296 -0.9584718 0.9584157 0.9996296 -0.9584869 0.9584157 0.9996296 -0.958506 0.9584157 0.9996296 -0.9585301 0.9584157 0.9996296 -0.9585607 0.9584157 0.9996296 -0.9585994 0.9584157 0.9996296 -0.9586483 0.9584157 0.9996296 -0.9587101 0.9584157 0.9996296 -0.9587884 0.9584157 0.9996296 -0.9588875 0.9584157 0.9996296 -0.9590128 0.9584157 0.9996296 -0.9591713 0.9584157 0.9996296 -0.9593718 0.9584157 0.9996296 -0.9596255 0.9584157 0.9996296 -0.9599465 0.9584157 0.9996296 -0.9603526 0.9584157 0.9996296 -0.9608664 0.9584157 0.9996296 -0.9615163 0.9584157 0.9996296 -0.9623386 0.9584157 0.9996296 -0.9633789 0.9584157 0.9996296 -0.964695 0.9584157 0.9996296 -0.9663601 0.9584157 0.9996296 -0.9684666 0.9584157 0.9996296 -0.9711316 0.9584157 0.9996296 -0.9745032 0.9584157 0.9996296 -0.9787687 0.9584157 0.9996296 -0.9841652 0.9584157 0.9996296 -0.9909923 0.9584157 0.9996296 -0.9996296 0.9584157 0.9996296 -0.9997074 0.9668871 0.9928293 -0.9997689 0.9736725 0.989977 -0.9998174 0.9790927 0.9893274 -0.9998557 0.9834129 0.9898313 -0.999886 0.9868505 0.9908725 -0.9999099 0.989582 0.9921008 -0.9999288 0.9917501 0.9933267 -0.9999437 0.9934695 0.994456 -0.958416 0.9584165 0.9996296 -0.9584159 0.9584162 0.9996296 -0.9584157 0.9584159 0.9996296 -0.9584155 0.9584155 0.9996296 -0.9584158 0.9584155 0.9996296 -0.9584161 0.9584155 0.9996296 -0.9584166 0.9584155 0.9996296 -0.9584171 0.9584155 0.9996296 -0.9584178 0.9584155 0.9996296 -0.9584187 0.9584155 0.9996296 -0.9584199 0.9584155 0.9996296 -0.9584213 0.9584155 0.9996296 -0.9584231 0.9584155 0.9996296 -0.9584254 0.9584155 0.9996296 -0.9584283 0.9584155 0.9996296 -0.958432 0.9584155 0.9996296 -0.9584367 0.9584155 0.9996296 -0.9584426 0.9584155 0.9996296 -0.95845 0.9584155 0.9996296 -0.9584595 0.9584155 0.9996296 -0.9584714 0.9584155 0.9996296 -0.9584865 0.9584155 0.9996296 -0.9585056 0.9584155 0.9996296 -0.9585297 0.9584155 0.9996296 -0.9585603 0.9584155 0.9996296 -0.9585989 0.9584155 0.9996296 -0.9586479 0.9584155 0.9996296 -0.9587097 0.9584155 0.9996296 -0.958788 0.9584155 0.9996296 -0.9588871 0.9584155 0.9996296 -0.9590124 0.9584155 0.9996296 -0.9591709 0.9584155 0.9996296 -0.9593714 0.9584155 0.9996296 -0.9596251 0.9584155 0.9996296 -0.9599461 0.9584155 0.9996296 -0.9603522 0.9584155 0.9996296 -0.960866 0.9584155 0.9996296 -0.9615159 0.9584155 0.9996296 -0.9623382 0.9584155 0.9996296 -0.9633786 0.9584155 0.9996296 -0.9646947 0.9584155 0.9996296 -0.9663598 0.9584155 0.9996296 -0.9684663 0.9584155 0.9996296 -0.9711314 0.9584155 0.9996296 -0.974503 0.9584155 0.9996296 -0.9787685 0.9584155 0.9996296 -0.984165 0.9584155 0.9996296 -0.9909923 0.9584155 0.9996296 -0.9996296 0.9584155 0.9996296 -0.9997074 0.966887 0.9928292 -0.9997689 0.9736724 0.9899769 -0.9998174 0.9790926 0.9893274 -0.9998557 0.9834129 0.9898313 -0.999886 0.9868505 0.9908725 -0.9999099 0.989582 0.9921008 -0.9999288 0.9917501 0.9933267 -0.9999437 0.9934695 0.994456 -0.958416 0.9584168 0.9996296 -0.9584159 0.9584165 0.9996296 -0.9584157 0.9584162 0.9996296 -0.9584155 0.9584158 0.9996296 -0.9584153 0.9584153 0.9996296 -0.9584156 0.9584153 0.9996296 -0.9584161 0.9584153 0.9996296 -0.9584166 0.9584153 0.9996296 -0.9584173 0.9584153 0.9996296 -0.9584182 0.9584153 0.9996296 -0.9584194 0.9584153 0.9996296 -0.9584208 0.9584153 0.9996296 -0.9584226 0.9584153 0.9996296 -0.9584249 0.9584153 0.9996296 -0.9584278 0.9584153 0.9996296 -0.9584315 0.9584153 0.9996296 -0.9584362 0.9584153 0.9996296 -0.9584421 0.9584153 0.9996296 -0.9584495 0.9584153 0.9996296 -0.9584589 0.9584153 0.9996296 -0.9584709 0.9584153 0.9996296 -0.958486 0.9584153 0.9996296 -0.9585051 0.9584153 0.9996296 -0.9585292 0.9584153 0.9996296 -0.9585598 0.9584153 0.9996296 -0.9585984 0.9584153 0.9996296 -0.9586473 0.9584153 0.9996296 -0.9587092 0.9584153 0.9996296 -0.9587875 0.9584153 0.9996296 -0.9588865 0.9584153 0.9996296 -0.9590118 0.9584153 0.9996296 -0.9591704 0.9584153 0.9996296 -0.9593709 0.9584153 0.9996296 -0.9596246 0.9584153 0.9996296 -0.9599456 0.9584153 0.9996296 -0.9603517 0.9584153 0.9996296 -0.9608655 0.9584153 0.9996296 -0.9615155 0.9584153 0.9996296 -0.9623378 0.9584153 0.9996296 -0.9633781 0.9584153 0.9996296 -0.9646943 0.9584153 0.9996296 -0.9663593 0.9584153 0.9996296 -0.9684659 0.9584153 0.9996296 -0.971131 0.9584153 0.9996296 -0.9745027 0.9584153 0.9996296 -0.9787683 0.9584153 0.9996296 -0.9841648 0.9584153 0.9996296 -0.9909921 0.9584153 0.9996296 -0.9996296 0.9584153 0.9996296 -0.9997074 0.9668869 0.9928291 -0.9997689 0.9736723 0.9899768 -0.9998174 0.9790925 0.9893273 -0.9998557 0.9834128 0.9898313 -0.999886 0.9868504 0.9908724 -0.9999099 0.989582 0.9921008 -0.9999288 0.9917501 0.9933267 -0.9999437 0.9934695 0.994456 -0.958416 0.9584171 0.9996296 -0.9584159 0.9584169 0.9996296 -0.9584157 0.9584165 0.9996296 -0.9584155 0.9584161 0.9996296 -0.9584153 0.9584156 0.9996296 -0.958415 0.958415 0.9996296 -0.9584154 0.958415 0.9996296 -0.958416 0.958415 0.9996296 -0.9584167 0.958415 0.9996296 -0.9584176 0.958415 0.9996296 -0.9584187 0.958415 0.9996296 -0.9584202 0.958415 0.9996296 -0.958422 0.958415 0.9996296 -0.9584243 0.958415 0.9996296 -0.9584272 0.958415 0.9996296 -0.9584309 0.958415 0.9996296 -0.9584355 0.958415 0.9996296 -0.9584414 0.958415 0.9996296 -0.9584489 0.958415 0.9996296 -0.9584583 0.958415 0.9996296 -0.9584702 0.958415 0.9996296 -0.9584853 0.958415 0.9996296 -0.9585044 0.958415 0.9996296 -0.9585286 0.958415 0.9996296 -0.9585591 0.958415 0.9996296 -0.9585978 0.958415 0.9996296 -0.9586467 0.958415 0.9996296 -0.9587086 0.958415 0.9996296 -0.9587869 0.958415 0.9996296 -0.9588859 0.958415 0.9996296 -0.9590112 0.958415 0.9996296 -0.9591697 0.958415 0.9996296 -0.9593703 0.958415 0.9996296 -0.959624 0.958415 0.9996296 -0.959945 0.958415 0.9996296 -0.9603511 0.958415 0.9996296 -0.9608649 0.958415 0.9996296 -0.9615149 0.958415 0.9996296 -0.9623372 0.958415 0.9996296 -0.9633775 0.958415 0.9996296 -0.9646937 0.958415 0.9996296 -0.9663588 0.958415 0.9996296 -0.9684654 0.958415 0.9996296 -0.9711305 0.958415 0.9996296 -0.9745023 0.958415 0.9996296 -0.9787679 0.958415 0.9996296 -0.9841646 0.958415 0.9996296 -0.990992 0.958415 0.9996296 -0.9996296 0.958415 0.9996296 -0.9997074 0.9668867 0.9928291 -0.9997689 0.9736722 0.9899767 -0.9998174 0.9790925 0.9893272 -0.9998557 0.9834128 0.9898312 -0.999886 0.9868504 0.9908724 -0.9999099 0.9895819 0.9921007 -0.9999288 0.9917501 0.9933267 -0.9999437 0.9934695 0.994456 -0.958416 0.9584176 0.9996296 -0.9584159 0.9584173 0.9996296 -0.9584157 0.958417 0.9996296 -0.9584155 0.9584166 0.9996296 -0.9584153 0.9584161 0.9996296 -0.958415 0.9584154 0.9996296 -0.9584146 0.9584146 0.9996296 -0.9584152 0.9584146 0.9996296 -0.9584159 0.9584146 0.9996296 -0.9584168 0.9584146 0.9996296 -0.9584179 0.9584146 0.9996296 -0.9584194 0.9584146 0.9996296 -0.9584212 0.9584146 0.9996296 -0.9584235 0.9584146 0.9996296 -0.9584264 0.9584146 0.9996296 -0.9584301 0.9584146 0.9996296 -0.9584347 0.9584146 0.9996296 -0.9584406 0.9584146 0.9996296 -0.9584481 0.9584146 0.9996296 -0.9584575 0.9584146 0.9996296 -0.9584694 0.9584146 0.9996296 -0.9584845 0.9584146 0.9996296 -0.9585036 0.9584146 0.9996296 -0.9585278 0.9584146 0.9996296 -0.9585583 0.9584146 0.9996296 -0.958597 0.9584146 0.9996296 -0.9586459 0.9584146 0.9996296 -0.9587078 0.9584146 0.9996296 -0.9587861 0.9584146 0.9996296 -0.9588851 0.9584146 0.9996296 -0.9590104 0.9584146 0.9996296 -0.959169 0.9584146 0.9996296 -0.9593695 0.9584146 0.9996296 -0.9596232 0.9584146 0.9996296 -0.9599442 0.9584146 0.9996296 -0.9603504 0.9584146 0.9996296 -0.9608641 0.9584146 0.9996296 -0.9615141 0.9584146 0.9996296 -0.9623365 0.9584146 0.9996296 -0.9633768 0.9584146 0.9996296 -0.964693 0.9584146 0.9996296 -0.9663582 0.9584146 0.9996296 -0.9684648 0.9584146 0.9996296 -0.97113 0.9584146 0.9996296 -0.9745018 0.9584146 0.9996296 -0.9787675 0.9584146 0.9996296 -0.9841643 0.9584146 0.9996296 -0.9909918 0.9584146 0.9996296 -0.9996296 0.9584146 0.9996296 -0.9997074 0.9668865 0.9928289 -0.9997689 0.9736721 0.9899766 -0.9998174 0.9790924 0.9893271 -0.9998557 0.9834127 0.9898311 -0.999886 0.9868504 0.9908724 -0.9999099 0.9895819 0.9921007 -0.9999288 0.99175 0.9933266 -0.9999437 0.9934695 0.9944559 -0.958416 0.9584181 0.9996296 -0.9584159 0.9584179 0.9996296 -0.9584157 0.9584176 0.9996296 -0.9584155 0.9584171 0.9996296 -0.9584153 0.9584166 0.9996296 -0.958415 0.958416 0.9996296 -0.9584146 0.9584152 0.9996296 -0.9584142 0.9584142 0.9996296 -0.9584149 0.9584142 0.9996296 -0.9584158 0.9584142 0.9996296 -0.9584169 0.9584142 0.9996296 -0.9584184 0.9584142 0.9996296 -0.9584202 0.9584142 0.9996296 -0.9584225 0.9584142 0.9996296 -0.9584254 0.9584142 0.9996296 -0.9584291 0.9584142 0.9996296 -0.9584337 0.9584142 0.9996296 -0.9584396 0.9584142 0.9996296 -0.9584471 0.9584142 0.9996296 -0.9584565 0.9584142 0.9996296 -0.9584685 0.9584142 0.9996296 -0.9584835 0.9584142 0.9996296 -0.9585026 0.9584142 0.9996296 -0.9585268 0.9584142 0.9996296 -0.9585574 0.9584142 0.9996296 -0.958596 0.9584142 0.9996296 -0.9586449 0.9584142 0.9996296 -0.9587068 0.9584142 0.9996296 -0.9587851 0.9584142 0.9996296 -0.9588842 0.9584142 0.9996296 -0.9590095 0.9584142 0.9996296 -0.959168 0.9584142 0.9996296 -0.9593686 0.9584142 0.9996296 -0.9596223 0.9584142 0.9996296 -0.9599433 0.9584142 0.9996296 -0.9603494 0.9584142 0.9996296 -0.9608632 0.9584142 0.9996296 -0.9615132 0.9584142 0.9996296 -0.9623356 0.9584142 0.9996296 -0.963376 0.9584142 0.9996296 -0.9646922 0.9584142 0.9996296 -0.9663574 0.9584142 0.9996296 -0.9684641 0.9584142 0.9996296 -0.9711293 0.9584142 0.9996296 -0.9745012 0.9584142 0.9996296 -0.978767 0.9584142 0.9996296 -0.9841639 0.9584142 0.9996296 -0.9909916 0.9584142 0.9996296 -0.9996296 0.9584142 0.9996296 -0.9997074 0.9668862 0.9928288 -0.9997689 0.9736719 0.9899765 -0.9998174 0.9790923 0.989327 -0.9998557 0.9834127 0.989831 -0.999886 0.9868503 0.9908723 -0.9999099 0.9895819 0.9921006 -0.9999288 0.99175 0.9933266 -0.9999437 0.9934694 0.9944559 -0.958416 0.9584189 0.9996296 -0.9584159 0.9584186 0.9996296 -0.9584157 0.9584183 0.9996296 -0.9584155 0.9584178 0.9996296 -0.9584153 0.9584173 0.9996296 -0.958415 0.9584167 0.9996296 -0.9584146 0.9584159 0.9996296 -0.9584142 0.9584149 0.9996296 -0.9584137 0.9584137 0.9996296 -0.9584146 0.9584137 0.9996296 -0.9584157 0.9584137 0.9996296 -0.9584172 0.9584137 0.9996296 -0.958419 0.9584137 0.9996296 -0.9584213 0.9584137 0.9996296 -0.9584242 0.9584137 0.9996296 -0.9584279 0.9584137 0.9996296 -0.9584325 0.9584137 0.9996296 -0.9584384 0.9584137 0.9996296 -0.9584459 0.9584137 0.9996296 -0.9584553 0.9584137 0.9996296 -0.9584673 0.9584137 0.9996296 -0.9584823 0.9584137 0.9996296 -0.9585014 0.9584137 0.9996296 -0.9585256 0.9584137 0.9996296 -0.9585562 0.9584137 0.9996296 -0.9585948 0.9584137 0.9996296 -0.9586437 0.9584137 0.9996296 -0.9587056 0.9584137 0.9996296 -0.9587839 0.9584137 0.9996296 -0.958883 0.9584137 0.9996296 -0.9590083 0.9584137 0.9996296 -0.9591668 0.9584137 0.9996296 -0.9593674 0.9584137 0.9996296 -0.9596211 0.9584137 0.9996296 -0.9599421 0.9584137 0.9996296 -0.9603483 0.9584137 0.9996296 -0.9608621 0.9584137 0.9996296 -0.9615121 0.9584137 0.9996296 -0.9623345 0.9584137 0.9996296 -0.9633749 0.9584137 0.9996296 -0.9646912 0.9584137 0.9996296 -0.9663564 0.9584137 0.9996296 -0.9684632 0.9584137 0.9996296 -0.9711285 0.9584137 0.9996296 -0.9745005 0.9584137 0.9996296 -0.9787664 0.9584137 0.9996296 -0.9841634 0.9584137 0.9996296 -0.9909914 0.9584137 0.9996296 -0.9996296 0.9584137 0.9996296 -0.9997074 0.9668859 0.9928287 -0.9997689 0.9736717 0.9899763 -0.9998174 0.9790921 0.9893269 -0.9998557 0.9834126 0.9898309 -0.999886 0.9868503 0.9908722 -0.9999099 0.9895819 0.9921006 -0.9999288 0.99175 0.9933266 -0.9999437 0.9934694 0.9944559 -0.958416 0.9584198 0.9996296 -0.9584159 0.9584195 0.9996296 -0.9584157 0.9584192 0.9996296 -0.9584155 0.9584187 0.9996296 -0.9584153 0.9584182 0.9996296 -0.958415 0.9584176 0.9996296 -0.9584146 0.9584168 0.9996296 -0.9584142 0.9584158 0.9996296 -0.9584137 0.9584146 0.9996296 -0.9584132 0.9584132 0.9996296 -0.9584143 0.9584132 0.9996296 -0.9584157 0.9584132 0.9996296 -0.9584175 0.9584132 0.9996296 -0.9584198 0.9584132 0.9996296 -0.9584228 0.9584132 0.9996296 -0.9584264 0.9584132 0.9996296 -0.9584311 0.9584132 0.9996296 -0.958437 0.9584132 0.9996296 -0.9584444 0.9584132 0.9996296 -0.9584539 0.9584132 0.9996296 -0.9584658 0.9584132 0.9996296 -0.9584809 0.9584132 0.9996296 -0.9585 0.9584132 0.9996296 -0.9585242 0.9584132 0.9996296 -0.9585547 0.9584132 0.9996296 -0.9585934 0.9584132 0.9996296 -0.9586423 0.9584132 0.9996296 -0.9587042 0.9584132 0.9996296 -0.9587825 0.9584132 0.9996296 -0.9588815 0.9584132 0.9996296 -0.9590068 0.9584132 0.9996296 -0.9591654 0.9584132 0.9996296 -0.959366 0.9584132 0.9996296 -0.9596197 0.9584132 0.9996296 -0.9599407 0.9584132 0.9996296 -0.9603469 0.9584132 0.9996296 -0.9608607 0.9584132 0.9996296 -0.9615108 0.9584132 0.9996296 -0.9623332 0.9584132 0.9996296 -0.9633736 0.9584132 0.9996296 -0.96469 0.9584132 0.9996296 -0.9663553 0.9584132 0.9996296 -0.9684621 0.9584132 0.9996296 -0.9711275 0.9584132 0.9996296 -0.9744996 0.9584132 0.9996296 -0.9787657 0.9584132 0.9996296 -0.9841629 0.9584132 0.9996296 -0.9909911 0.9584132 0.9996296 -0.9996296 0.9584132 0.9996296 -0.9997074 0.9668855 0.9928285 -0.9997689 0.9736715 0.9899761 -0.9998174 0.979092 0.9893267 -0.9998557 0.9834125 0.9898308 -0.999886 0.9868502 0.9908721 -0.9999099 0.9895818 0.9921005 -0.9999288 0.99175 0.9933265 -0.9999437 0.9934694 0.9944559 -0.958416 0.9584209 0.9996296 -0.9584159 0.9584206 0.9996296 -0.9584157 0.9584203 0.9996296 -0.9584155 0.9584199 0.9996296 -0.9584153 0.9584194 0.9996296 -0.958415 0.9584187 0.9996296 -0.9584146 0.9584179 0.9996296 -0.9584142 0.9584169 0.9996296 -0.9584137 0.9584157 0.9996296 -0.9584132 0.9584143 0.9996296 -0.9584126 0.9584126 0.9996296 -0.958414 0.9584126 0.9996296 -0.9584158 0.9584126 0.9996296 -0.9584181 0.9584126 0.9996296 -0.958421 0.9584126 0.9996296 -0.9584247 0.9584126 0.9996296 -0.9584294 0.9584126 0.9996296 -0.9584353 0.9584126 0.9996296 -0.9584427 0.9584126 0.9996296 -0.9584521 0.9584126 0.9996296 -0.9584641 0.9584126 0.9996296 -0.9584792 0.9584126 0.9996296 -0.9584983 0.9584126 0.9996296 -0.9585224 0.9584126 0.9996296 -0.958553 0.9584126 0.9996296 -0.9585917 0.9584126 0.9996296 -0.9586406 0.9584126 0.9996296 -0.9587025 0.9584126 0.9996296 -0.9587808 0.9584126 0.9996296 -0.9588798 0.9584126 0.9996296 -0.9590051 0.9584126 0.9996296 -0.9591637 0.9584126 0.9996296 -0.9593643 0.9584126 0.9996296 -0.959618 0.9584126 0.9996296 -0.9599391 0.9584126 0.9996296 -0.9603452 0.9584126 0.9996296 -0.9608591 0.9584126 0.9996296 -0.9615092 0.9584126 0.9996296 -0.9623316 0.9584126 0.9996296 -0.9633721 0.9584126 0.9996296 -0.9646885 0.9584126 0.9996296 -0.9663539 0.9584126 0.9996296 -0.9684608 0.9584126 0.9996296 -0.9711263 0.9584126 0.9996296 -0.9744985 0.9584126 0.9996296 -0.9787648 0.9584126 0.9996296 -0.9841622 0.9584126 0.9996296 -0.9909907 0.9584126 0.9996296 -0.9996296 0.9584126 0.9996296 -0.9997074 0.9668852 0.9928282 -0.9997689 0.9736712 0.9899758 -0.9998174 0.9790919 0.9893265 -0.9998557 0.9834124 0.9898306 -0.999886 0.9868502 0.990872 -0.9999099 0.9895818 0.9921004 -0.9999288 0.99175 0.9933265 -0.9999437 0.9934694 0.9944558 -0.958416 0.9584223 0.9996296 -0.9584159 0.9584221 0.9996296 -0.9584157 0.9584217 0.9996296 -0.9584155 0.9584213 0.9996296 -0.9584153 0.9584208 0.9996296 -0.958415 0.9584202 0.9996296 -0.9584146 0.9584194 0.9996296 -0.9584142 0.9584184 0.9996296 -0.9584137 0.9584172 0.9996296 -0.9584132 0.9584157 0.9996296 -0.9584126 0.958414 0.9996296 -0.958412 0.958412 0.9996296 -0.9584138 0.958412 0.9996296 -0.9584161 0.958412 0.9996296 -0.958419 0.958412 0.9996296 -0.9584227 0.958412 0.9996296 -0.9584274 0.958412 0.9996296 -0.9584333 0.958412 0.9996296 -0.9584407 0.958412 0.9996296 -0.9584501 0.958412 0.9996296 -0.9584621 0.958412 0.9996296 -0.9584772 0.958412 0.9996296 -0.9584963 0.958412 0.9996296 -0.9585204 0.958412 0.9996296 -0.958551 0.958412 0.9996296 -0.9585897 0.958412 0.9996296 -0.9586386 0.958412 0.9996296 -0.9587005 0.958412 0.9996296 -0.9587788 0.958412 0.9996296 -0.9588778 0.958412 0.9996296 -0.9590032 0.958412 0.9996296 -0.9591617 0.958412 0.9996296 -0.9593623 0.958412 0.9996296 -0.9596161 0.958412 0.9996296 -0.9599371 0.958412 0.9996296 -0.9603433 0.958412 0.9996296 -0.9608572 0.958412 0.9996296 -0.9615073 0.958412 0.9996296 -0.9623298 0.958412 0.9996296 -0.9633703 0.958412 0.9996296 -0.9646868 0.958412 0.9996296 -0.9663522 0.958412 0.9996296 -0.9684592 0.958412 0.9996296 -0.9711249 0.958412 0.9996296 -0.9744973 0.958412 0.9996296 -0.9787638 0.958412 0.9996296 -0.9841615 0.958412 0.9996296 -0.9909903 0.958412 0.9996296 -0.9996296 0.958412 0.9996296 -0.9997074 0.9668848 0.992828 -0.9997689 0.973671 0.9899755 -0.9998174 0.9790917 0.9893262 -0.9998557 0.9834123 0.9898304 -0.999886 0.9868501 0.9908718 -0.9999099 0.9895818 0.9921003 -0.9999288 0.9917499 0.9933264 -0.9999437 0.9934694 0.9944558 -0.958416 0.9584241 0.9996296 -0.9584159 0.9584239 0.9996296 -0.9584157 0.9584235 0.9996296 -0.9584155 0.9584231 0.9996296 -0.9584153 0.9584226 0.9996296 -0.958415 0.958422 0.9996296 -0.9584146 0.9584212 0.9996296 -0.9584142 0.9584202 0.9996296 -0.9584137 0.958419 0.9996296 -0.9584132 0.9584175 0.9996296 -0.9584126 0.9584158 0.9996296 -0.958412 0.9584138 0.9996296 -0.9584115 0.9584115 0.9996296 -0.9584138 0.9584115 0.9996296 -0.9584168 0.9584115 0.9996296 -0.9584204 0.9584115 0.9996296 -0.9584251 0.9584115 0.9996296 -0.958431 0.9584115 0.9996296 -0.9584384 0.9584115 0.9996296 -0.9584479 0.9584115 0.9996296 -0.9584598 0.9584115 0.9996296 -0.9584749 0.9584115 0.9996296 -0.958494 0.9584115 0.9996296 -0.9585182 0.9584115 0.9996296 -0.9585487 0.9584115 0.9996296 -0.9585874 0.9584115 0.9996296 -0.9586363 0.9584115 0.9996296 -0.9586982 0.9584115 0.9996296 -0.9587765 0.9584115 0.9996296 -0.9588756 0.9584115 0.9996296 -0.9590009 0.9584115 0.9996296 -0.9591595 0.9584115 0.9996296 -0.9593601 0.9584115 0.9996296 -0.9596139 0.9584115 0.9996296 -0.959935 0.9584115 0.9996296 -0.9603412 0.9584115 0.9996296 -0.9608551 0.9584115 0.9996296 -0.9615052 0.9584115 0.9996296 -0.9623277 0.9584115 0.9996296 -0.9633684 0.9584115 0.9996296 -0.9646849 0.9584115 0.9996296 -0.9663504 0.9584115 0.9996296 -0.9684575 0.9584115 0.9996296 -0.9711233 0.9584115 0.9996296 -0.9744959 0.9584115 0.9996296 -0.9787626 0.9584115 0.9996296 -0.9841606 0.9584115 0.9996296 -0.9909898 0.9584115 0.9996296 -0.9996296 0.9584115 0.9996296 -0.9997074 0.9668845 0.9928276 -0.9997689 0.9736708 0.9899752 -0.9998174 0.9790916 0.9893259 -0.9998557 0.9834122 0.9898302 -0.999886 0.9868501 0.9908717 -0.9999099 0.9895817 0.9921002 -0.9999288 0.9917499 0.9933263 -0.9999437 0.9934694 0.9944557 -0.958416 0.9584264 0.9996296 -0.9584159 0.9584262 0.9996296 -0.9584157 0.9584258 0.9996296 -0.9584155 0.9584254 0.9996296 -0.9584153 0.9584249 0.9996296 -0.958415 0.9584243 0.9996296 -0.9584146 0.9584235 0.9996296 -0.9584142 0.9584225 0.9996296 -0.9584137 0.9584213 0.9996296 -0.9584132 0.9584198 0.9996296 -0.9584126 0.9584181 0.9996296 -0.958412 0.9584161 0.9996296 -0.9584115 0.9584138 0.9996296 -0.9584114 0.9584114 0.9996295 -0.9584143 0.9584114 0.9996295 -0.958418 0.9584114 0.9996295 -0.9584227 0.9584114 0.9996295 -0.9584286 0.9584114 0.9996295 -0.958436 0.9584114 0.9996295 -0.9584454 0.9584114 0.9996295 -0.9584574 0.9584114 0.9996295 -0.9584725 0.9584114 0.9996295 -0.9584916 0.9584114 0.9996295 -0.9585157 0.9584114 0.9996295 -0.9585463 0.9584114 0.9996295 -0.958585 0.9584114 0.9996295 -0.9586339 0.9584114 0.9996295 -0.9586958 0.9584114 0.9996295 -0.9587741 0.9584114 0.9996295 -0.9588732 0.9584114 0.9996295 -0.9589985 0.9584114 0.9996295 -0.9591571 0.9584114 0.9996295 -0.9593577 0.9584114 0.9996295 -0.9596115 0.9584114 0.9996295 -0.9599326 0.9584114 0.9996295 -0.9603388 0.9584114 0.9996295 -0.9608528 0.9584114 0.9996295 -0.961503 0.9584114 0.9996295 -0.9623255 0.9584114 0.9996295 -0.9633662 0.9584114 0.9996295 -0.9646828 0.9584114 0.9996295 -0.9663484 0.9584114 0.9996295 -0.9684557 0.9584114 0.9996295 -0.9711216 0.9584114 0.9996295 -0.9744944 0.9584114 0.9996295 -0.9787614 0.9584114 0.9996295 -0.9841597 0.9584114 0.9996295 -0.9909893 0.9584114 0.9996295 -0.9996295 0.9584114 0.9996295 -0.9997074 0.9668844 0.9928273 -0.9997689 0.9736708 0.9899748 -0.9998174 0.9790916 0.9893256 -0.9998557 0.9834122 0.98983 -0.999886 0.98685 0.9908715 -0.9999099 0.9895817 0.9921001 -0.9999288 0.9917499 0.9933263 -0.9999437 0.9934694 0.9944557 -0.958416 0.9584293 0.9996296 -0.9584159 0.9584291 0.9996296 -0.9584157 0.9584288 0.9996296 -0.9584155 0.9584283 0.9996296 -0.9584153 0.9584278 0.9996296 -0.958415 0.9584272 0.9996296 -0.9584146 0.9584264 0.9996296 -0.9584142 0.9584254 0.9996296 -0.9584137 0.9584242 0.9996296 -0.9584132 0.9584228 0.9996296 -0.9584126 0.958421 0.9996296 -0.958412 0.958419 0.9996296 -0.9584115 0.9584168 0.9996296 -0.9584114 0.9584143 0.9996295 -0.958412 0.958412 0.9996295 -0.9584156 0.958412 0.9996295 -0.9584203 0.958412 0.9996295 -0.9584262 0.958412 0.9996295 -0.9584336 0.958412 0.9996295 -0.9584431 0.958412 0.9996295 -0.958455 0.958412 0.9996295 -0.9584701 0.958412 0.9996295 -0.9584892 0.958412 0.9996295 -0.9585134 0.958412 0.9996295 -0.9585439 0.958412 0.9996295 -0.9585826 0.958412 0.9996295 -0.9586316 0.958412 0.9996295 -0.9586935 0.958412 0.9996295 -0.9587718 0.958412 0.9996295 -0.9588709 0.958412 0.9996295 -0.9589962 0.958412 0.9996295 -0.9591548 0.958412 0.9996295 -0.9593554 0.958412 0.9996295 -0.9596092 0.958412 0.9996295 -0.9599303 0.958412 0.9996295 -0.9603366 0.958412 0.9996295 -0.9608506 0.958412 0.9996295 -0.9615008 0.958412 0.9996295 -0.9623234 0.958412 0.9996295 -0.9633641 0.958412 0.9996295 -0.9646808 0.958412 0.9996295 -0.9663465 0.958412 0.9996295 -0.9684539 0.958412 0.9996295 -0.97112 0.958412 0.9996295 -0.974493 0.958412 0.9996295 -0.9787602 0.958412 0.9996295 -0.9841588 0.958412 0.9996295 -0.9909888 0.958412 0.9996295 -0.9996295 0.958412 0.9996295 -0.9997074 0.9668847 0.992827 -0.9997688 0.973671 0.9899744 -0.9998174 0.9790917 0.9893253 -0.9998557 0.9834123 0.9898297 -0.999886 0.9868501 0.9908714 -0.9999099 0.9895817 0.9921 -0.9999288 0.9917499 0.9933262 -0.9999437 0.9934694 0.9944556 -0.958416 0.958433 0.9996296 -0.9584159 0.9584328 0.9996296 -0.9584157 0.9584324 0.9996296 -0.9584155 0.958432 0.9996296 -0.9584153 0.9584315 0.9996296 -0.958415 0.9584309 0.9996296 -0.9584146 0.9584301 0.9996296 -0.9584142 0.9584291 0.9996296 -0.9584137 0.9584279 0.9996296 -0.9584132 0.9584264 0.9996296 -0.9584126 0.9584247 0.9996296 -0.958412 0.9584227 0.9996296 -0.9584115 0.9584204 0.9996296 -0.9584114 0.958418 0.9996295 -0.958412 0.9584156 0.9996295 -0.9584138 0.9584138 0.9996295 -0.9584184 0.9584138 0.9996295 -0.9584243 0.9584138 0.9996295 -0.9584318 0.9584138 0.9996295 -0.9584412 0.9584138 0.9996295 -0.9584532 0.9584138 0.9996295 -0.9584683 0.9584138 0.9996295 -0.9584874 0.9584138 0.9996295 -0.9585115 0.9584138 0.9996295 -0.9585421 0.9584138 0.9996295 -0.9585808 0.9584138 0.9996295 -0.9586297 0.9584138 0.9996295 -0.9586916 0.9584138 0.9996295 -0.9587699 0.9584138 0.9996295 -0.958869 0.9584138 0.9996295 -0.9589944 0.9584138 0.9996295 -0.959153 0.9584138 0.9996295 -0.9593536 0.9584138 0.9996295 -0.9596074 0.9584138 0.9996295 -0.9599286 0.9584138 0.9996295 -0.9603348 0.9584138 0.9996295 -0.9608488 0.9584138 0.9996295 -0.9614991 0.9584138 0.9996295 -0.9623217 0.9584138 0.9996295 -0.9633625 0.9584138 0.9996295 -0.9646792 0.9584138 0.9996295 -0.966345 0.9584138 0.9996295 -0.9684525 0.9584138 0.9996295 -0.9711187 0.9584138 0.9996295 -0.9744918 0.9584138 0.9996295 -0.9787593 0.9584138 0.9996295 -0.9841581 0.9584138 0.9996295 -0.9909884 0.9584138 0.9996295 -0.9996295 0.9584138 0.9996295 -0.9997074 0.9668859 0.9928267 -0.9997688 0.9736717 0.9899742 -0.9998174 0.9790921 0.9893251 -0.9998557 0.9834126 0.9898295 -0.999886 0.9868503 0.9908712 -0.9999099 0.9895819 0.9920999 -0.9999288 0.99175 0.9933261 -0.9999437 0.9934694 0.9944556 -0.958416 0.9584377 0.9996296 -0.9584159 0.9584374 0.9996296 -0.9584157 0.9584371 0.9996296 -0.9584155 0.9584367 0.9996296 -0.9584153 0.9584362 0.9996296 -0.958415 0.9584355 0.9996296 -0.9584146 0.9584347 0.9996296 -0.9584142 0.9584337 0.9996296 -0.9584137 0.9584325 0.9996296 -0.9584132 0.9584311 0.9996296 -0.9584126 0.9584294 0.9996296 -0.958412 0.9584274 0.9996296 -0.9584115 0.9584251 0.9996296 -0.9584114 0.9584227 0.9996295 -0.958412 0.9584203 0.9996295 -0.9584138 0.9584184 0.9996295 -0.9584178 0.9584178 0.9996295 -0.9584237 0.9584178 0.9996295 -0.9584312 0.9584178 0.9996295 -0.9584406 0.9584178 0.9996295 -0.9584526 0.9584178 0.9996295 -0.9584677 0.9584178 0.9996295 -0.9584868 0.9584178 0.9996295 -0.9585109 0.9584178 0.9996295 -0.9585415 0.9584178 0.9996295 -0.9585802 0.9584178 0.9996295 -0.9586291 0.9584178 0.9996295 -0.958691 0.9584178 0.9996295 -0.9587693 0.9584178 0.9996295 -0.9588684 0.9584178 0.9996295 -0.9589938 0.9584178 0.9996295 -0.9591524 0.9584178 0.9996295 -0.959353 0.9584178 0.9996295 -0.9596068 0.9584178 0.9996295 -0.959928 0.9584178 0.9996295 -0.9603343 0.9584178 0.9996295 -0.9608482 0.9584178 0.9996295 -0.9614985 0.9584178 0.9996295 -0.9623212 0.9584178 0.9996295 -0.963362 0.9584178 0.9996295 -0.9646787 0.9584178 0.9996295 -0.9663445 0.9584178 0.9996295 -0.968452 0.9584178 0.9996295 -0.9711183 0.9584178 0.9996295 -0.9744915 0.9584178 0.9996295 -0.978759 0.9584178 0.9996295 -0.9841579 0.9584178 0.9996295 -0.9909882 0.9584178 0.9996295 -0.9996295 0.9584178 0.9996295 -0.9997074 0.9668884 0.9928267 -0.9997688 0.9736733 0.9899741 -0.9998174 0.9790931 0.989325 -0.9998557 0.9834132 0.9898295 -0.999886 0.9868507 0.9908712 -0.9999099 0.9895821 0.9920999 -0.9999288 0.9917502 0.9933261 -0.9999437 0.9934695 0.9944556 -0.958416 0.9584436 0.9996296 -0.9584159 0.9584433 0.9996296 -0.9584157 0.958443 0.9996296 -0.9584155 0.9584426 0.9996296 -0.9584153 0.9584421 0.9996296 -0.958415 0.9584414 0.9996296 -0.9584146 0.9584406 0.9996296 -0.9584142 0.9584396 0.9996296 -0.9584137 0.9584384 0.9996296 -0.9584132 0.958437 0.9996296 -0.9584126 0.9584353 0.9996296 -0.958412 0.9584333 0.9996296 -0.9584115 0.958431 0.9996296 -0.9584114 0.9584286 0.9996295 -0.958412 0.9584262 0.9996295 -0.9584138 0.9584243 0.9996295 -0.9584178 0.9584237 0.9996295 -0.9584237 0.9584237 0.9996295 -0.9584312 0.9584237 0.9996295 -0.9584406 0.9584237 0.9996295 -0.9584526 0.9584237 0.9996295 -0.9584677 0.9584237 0.9996295 -0.9584868 0.9584237 0.9996295 -0.9585109 0.9584237 0.9996295 -0.9585415 0.9584237 0.9996295 -0.9585802 0.9584237 0.9996295 -0.9586291 0.9584237 0.9996295 -0.958691 0.9584237 0.9996295 -0.9587693 0.9584237 0.9996295 -0.9588684 0.9584237 0.9996295 -0.9589938 0.9584237 0.9996295 -0.9591524 0.9584237 0.9996295 -0.959353 0.9584237 0.9996295 -0.9596068 0.9584237 0.9996295 -0.959928 0.9584237 0.9996295 -0.9603343 0.9584237 0.9996295 -0.9608482 0.9584237 0.9996295 -0.9614985 0.9584237 0.9996295 -0.9623212 0.9584237 0.9996295 -0.963362 0.9584237 0.9996295 -0.9646787 0.9584237 0.9996295 -0.9663445 0.9584237 0.9996295 -0.968452 0.9584237 0.9996295 -0.9711183 0.9584237 0.9996295 -0.9744915 0.9584237 0.9996295 -0.978759 0.9584237 0.9996295 -0.9841579 0.9584237 0.9996295 -0.9909882 0.9584237 0.9996295 -0.9996295 0.9584237 0.9996295 -0.9997074 0.9668922 0.9928267 -0.9997688 0.9736756 0.9899741 -0.9998174 0.9790946 0.989325 -0.9998557 0.9834141 0.9898295 -0.999886 0.9868512 0.9908712 -0.9999099 0.9895825 0.9920999 -0.9999288 0.9917504 0.9933261 -0.9999437 0.9934697 0.9944556 -0.958416 0.958451 0.9996296 -0.9584159 0.9584508 0.9996296 -0.9584157 0.9584504 0.9996296 -0.9584155 0.95845 0.9996296 -0.9584153 0.9584495 0.9996296 -0.958415 0.9584489 0.9996296 -0.9584146 0.9584481 0.9996296 -0.9584142 0.9584471 0.9996296 -0.9584137 0.9584459 0.9996296 -0.9584132 0.9584444 0.9996296 -0.9584126 0.9584427 0.9996296 -0.958412 0.9584407 0.9996296 -0.9584115 0.9584384 0.9996296 -0.9584114 0.958436 0.9996295 -0.958412 0.9584336 0.9996295 -0.9584138 0.9584318 0.9996295 -0.9584178 0.9584312 0.9996295 -0.9584237 0.9584312 0.9996295 -0.9584312 0.9584312 0.9996295 -0.9584406 0.9584312 0.9996295 -0.9584526 0.9584312 0.9996295 -0.9584677 0.9584312 0.9996295 -0.9584868 0.9584312 0.9996295 -0.9585109 0.9584312 0.9996295 -0.9585415 0.9584312 0.9996295 -0.9585802 0.9584312 0.9996295 -0.9586291 0.9584312 0.9996295 -0.958691 0.9584312 0.9996295 -0.9587693 0.9584312 0.9996295 -0.9588684 0.9584312 0.9996295 -0.9589938 0.9584312 0.9996295 -0.9591524 0.9584312 0.9996295 -0.959353 0.9584312 0.9996295 -0.9596068 0.9584312 0.9996295 -0.959928 0.9584312 0.9996295 -0.9603343 0.9584312 0.9996295 -0.9608482 0.9584312 0.9996295 -0.9614985 0.9584312 0.9996295 -0.9623212 0.9584312 0.9996295 -0.963362 0.9584312 0.9996295 -0.9646787 0.9584312 0.9996295 -0.9663445 0.9584312 0.9996295 -0.968452 0.9584312 0.9996295 -0.9711183 0.9584312 0.9996295 -0.9744915 0.9584312 0.9996295 -0.978759 0.9584312 0.9996295 -0.9841579 0.9584312 0.9996295 -0.9909882 0.9584312 0.9996295 -0.9996295 0.9584312 0.9996295 -0.9997074 0.9668969 0.9928267 -0.9997688 0.9736786 0.9899741 -0.9998174 0.9790965 0.989325 -0.9998557 0.9834153 0.9898295 -0.999886 0.986852 0.9908712 -0.9999099 0.9895829 0.9920999 -0.9999288 0.9917507 0.9933261 -0.9999437 0.9934698 0.9944556 -0.958416 0.9584605 0.9996296 -0.9584159 0.9584602 0.9996296 -0.9584157 0.9584599 0.9996296 -0.9584155 0.9584595 0.9996296 -0.9584153 0.9584589 0.9996296 -0.958415 0.9584583 0.9996296 -0.9584146 0.9584575 0.9996296 -0.9584142 0.9584565 0.9996296 -0.9584137 0.9584553 0.9996296 -0.9584132 0.9584539 0.9996296 -0.9584126 0.9584521 0.9996296 -0.958412 0.9584501 0.9996296 -0.9584115 0.9584479 0.9996296 -0.9584114 0.9584454 0.9996295 -0.958412 0.9584431 0.9996295 -0.9584138 0.9584412 0.9996295 -0.9584178 0.9584406 0.9996295 -0.9584237 0.9584406 0.9996295 -0.9584312 0.9584406 0.9996295 -0.9584406 0.9584406 0.9996295 -0.9584526 0.9584406 0.9996295 -0.9584677 0.9584406 0.9996295 -0.9584868 0.9584406 0.9996295 -0.9585109 0.9584406 0.9996295 -0.9585415 0.9584406 0.9996295 -0.9585802 0.9584406 0.9996295 -0.9586291 0.9584406 0.9996295 -0.958691 0.9584406 0.9996295 -0.9587693 0.9584406 0.9996295 -0.9588684 0.9584406 0.9996295 -0.9589938 0.9584406 0.9996295 -0.9591524 0.9584406 0.9996295 -0.959353 0.9584406 0.9996295 -0.9596068 0.9584406 0.9996295 -0.959928 0.9584406 0.9996295 -0.9603343 0.9584406 0.9996295 -0.9608482 0.9584406 0.9996295 -0.9614985 0.9584406 0.9996295 -0.9623212 0.9584406 0.9996295 -0.963362 0.9584406 0.9996295 -0.9646787 0.9584406 0.9996295 -0.9663445 0.9584406 0.9996295 -0.968452 0.9584406 0.9996295 -0.9711183 0.9584406 0.9996295 -0.9744915 0.9584406 0.9996295 -0.978759 0.9584406 0.9996295 -0.9841579 0.9584406 0.9996295 -0.9909882 0.9584406 0.9996295 -0.9996295 0.9584406 0.9996295 -0.9997074 0.9669028 0.9928267 -0.9997688 0.9736823 0.9899741 -0.9998174 0.9790988 0.989325 -0.9998557 0.9834167 0.9898295 -0.999886 0.9868529 0.9908712 -0.9999099 0.9895835 0.9920999 -0.9999288 0.991751 0.9933261 -0.9999437 0.9934701 0.9944556 -0.958416 0.9584724 0.9996296 -0.9584159 0.9584721 0.9996296 -0.9584157 0.9584718 0.9996296 -0.9584155 0.9584714 0.9996296 -0.9584153 0.9584709 0.9996296 -0.958415 0.9584702 0.9996296 -0.9584146 0.9584694 0.9996296 -0.9584142 0.9584685 0.9996296 -0.9584137 0.9584673 0.9996296 -0.9584132 0.9584658 0.9996296 -0.9584126 0.9584641 0.9996296 -0.958412 0.9584621 0.9996296 -0.9584115 0.9584598 0.9996296 -0.9584114 0.9584574 0.9996295 -0.958412 0.958455 0.9996295 -0.9584138 0.9584532 0.9996295 -0.9584178 0.9584526 0.9996295 -0.9584237 0.9584526 0.9996295 -0.9584312 0.9584526 0.9996295 -0.9584406 0.9584526 0.9996295 -0.9584526 0.9584526 0.9996295 -0.9584677 0.9584526 0.9996295 -0.9584868 0.9584526 0.9996295 -0.9585109 0.9584526 0.9996295 -0.9585415 0.9584526 0.9996295 -0.9585802 0.9584526 0.9996295 -0.9586291 0.9584526 0.9996295 -0.958691 0.9584526 0.9996295 -0.9587693 0.9584526 0.9996295 -0.9588684 0.9584526 0.9996295 -0.9589938 0.9584526 0.9996295 -0.9591524 0.9584526 0.9996295 -0.959353 0.9584526 0.9996295 -0.9596068 0.9584526 0.9996295 -0.959928 0.9584526 0.9996295 -0.9603343 0.9584526 0.9996295 -0.9608482 0.9584526 0.9996295 -0.9614985 0.9584526 0.9996295 -0.9623212 0.9584526 0.9996295 -0.963362 0.9584526 0.9996295 -0.9646787 0.9584526 0.9996295 -0.9663445 0.9584526 0.9996295 -0.968452 0.9584526 0.9996295 -0.9711183 0.9584526 0.9996295 -0.9744915 0.9584526 0.9996295 -0.978759 0.9584526 0.9996295 -0.9841579 0.9584526 0.9996295 -0.9909882 0.9584526 0.9996295 -0.9996295 0.9584526 0.9996295 -0.9997074 0.9669103 0.9928267 -0.9997688 0.973687 0.9899741 -0.9998174 0.9791018 0.989325 -0.9998557 0.9834186 0.9898295 -0.999886 0.9868541 0.9908712 -0.9999099 0.9895842 0.9920999 -0.9999288 0.9917515 0.9933261 -0.9999437 0.9934704 0.9944556 -0.958416 0.9584875 0.9996296 -0.9584159 0.9584872 0.9996296 -0.9584157 0.9584869 0.9996296 -0.9584155 0.9584865 0.9996296 -0.9584153 0.958486 0.9996296 -0.958415 0.9584853 0.9996296 -0.9584146 0.9584845 0.9996296 -0.9584142 0.9584835 0.9996296 -0.9584137 0.9584823 0.9996296 -0.9584132 0.9584809 0.9996296 -0.9584126 0.9584792 0.9996296 -0.958412 0.9584772 0.9996296 -0.9584115 0.9584749 0.9996296 -0.9584114 0.9584725 0.9996295 -0.958412 0.9584701 0.9996295 -0.9584138 0.9584683 0.9996295 -0.9584178 0.9584677 0.9996295 -0.9584237 0.9584677 0.9996295 -0.9584312 0.9584677 0.9996295 -0.9584406 0.9584677 0.9996295 -0.9584526 0.9584677 0.9996295 -0.9584677 0.9584677 0.9996295 -0.9584868 0.9584677 0.9996295 -0.9585109 0.9584677 0.9996295 -0.9585415 0.9584677 0.9996295 -0.9585802 0.9584677 0.9996295 -0.9586291 0.9584677 0.9996295 -0.958691 0.9584677 0.9996295 -0.9587693 0.9584677 0.9996295 -0.9588684 0.9584677 0.9996295 -0.9589938 0.9584677 0.9996295 -0.9591524 0.9584677 0.9996295 -0.959353 0.9584677 0.9996295 -0.9596068 0.9584677 0.9996295 -0.959928 0.9584677 0.9996295 -0.9603343 0.9584677 0.9996295 -0.9608482 0.9584677 0.9996295 -0.9614985 0.9584677 0.9996295 -0.9623212 0.9584677 0.9996295 -0.963362 0.9584677 0.9996295 -0.9646787 0.9584677 0.9996295 -0.9663445 0.9584677 0.9996295 -0.968452 0.9584677 0.9996295 -0.9711183 0.9584677 0.9996295 -0.9744915 0.9584677 0.9996295 -0.978759 0.9584677 0.9996295 -0.9841579 0.9584677 0.9996295 -0.9909882 0.9584677 0.9996295 -0.9996295 0.9584677 0.9996295 -0.9997074 0.9669198 0.9928267 -0.9997688 0.973693 0.9899741 -0.9998174 0.9791055 0.989325 -0.9998557 0.9834209 0.9898295 -0.999886 0.9868555 0.9908712 -0.9999099 0.9895851 0.9920999 -0.9999288 0.9917521 0.9933261 -0.9999437 0.9934707 0.9944556 -0.958416 0.9585066 0.9996296 -0.9584159 0.9585063 0.9996296 -0.9584157 0.958506 0.9996296 -0.9584155 0.9585056 0.9996296 -0.9584153 0.9585051 0.9996296 -0.958415 0.9585044 0.9996296 -0.9584146 0.9585036 0.9996296 -0.9584142 0.9585026 0.9996296 -0.9584137 0.9585014 0.9996296 -0.9584132 0.9585 0.9996296 -0.9584126 0.9584983 0.9996296 -0.958412 0.9584963 0.9996296 -0.9584115 0.958494 0.9996296 -0.9584114 0.9584916 0.9996295 -0.958412 0.9584892 0.9996295 -0.9584138 0.9584874 0.9996295 -0.9584178 0.9584868 0.9996295 -0.9584237 0.9584868 0.9996295 -0.9584312 0.9584868 0.9996295 -0.9584406 0.9584868 0.9996295 -0.9584526 0.9584868 0.9996295 -0.9584677 0.9584868 0.9996295 -0.9584868 0.9584868 0.9996295 -0.9585109 0.9584868 0.9996295 -0.9585415 0.9584868 0.9996295 -0.9585802 0.9584868 0.9996295 -0.9586291 0.9584868 0.9996295 -0.958691 0.9584868 0.9996295 -0.9587693 0.9584868 0.9996295 -0.9588684 0.9584868 0.9996295 -0.9589938 0.9584868 0.9996295 -0.9591524 0.9584868 0.9996295 -0.959353 0.9584868 0.9996295 -0.9596068 0.9584868 0.9996295 -0.959928 0.9584868 0.9996295 -0.9603343 0.9584868 0.9996295 -0.9608482 0.9584868 0.9996295 -0.9614985 0.9584868 0.9996295 -0.9623212 0.9584868 0.9996295 -0.963362 0.9584868 0.9996295 -0.9646787 0.9584868 0.9996295 -0.9663445 0.9584868 0.9996295 -0.968452 0.9584868 0.9996295 -0.9711183 0.9584868 0.9996295 -0.9744915 0.9584868 0.9996295 -0.978759 0.9584868 0.9996295 -0.9841579 0.9584868 0.9996295 -0.9909882 0.9584868 0.9996295 -0.9996295 0.9584868 0.9996295 -0.9997074 0.9669318 0.9928267 -0.9997688 0.9737006 0.9899741 -0.9998174 0.9791103 0.989325 -0.9998557 0.9834239 0.9898295 -0.999886 0.9868574 0.9908712 -0.9999099 0.9895863 0.9920999 -0.9999288 0.9917528 0.9933261 -0.9999437 0.9934712 0.9944556 -0.958416 0.9585307 0.9996296 -0.9584159 0.9585305 0.9996296 -0.9584157 0.9585301 0.9996296 -0.9584155 0.9585297 0.9996296 -0.9584153 0.9585292 0.9996296 -0.958415 0.9585286 0.9996296 -0.9584146 0.9585278 0.9996296 -0.9584142 0.9585268 0.9996296 -0.9584137 0.9585256 0.9996296 -0.9584132 0.9585242 0.9996296 -0.9584126 0.9585224 0.9996296 -0.958412 0.9585204 0.9996296 -0.9584115 0.9585182 0.9996296 -0.9584114 0.9585157 0.9996295 -0.958412 0.9585134 0.9996295 -0.9584138 0.9585115 0.9996295 -0.9584178 0.9585109 0.9996295 -0.9584237 0.9585109 0.9996295 -0.9584312 0.9585109 0.9996295 -0.9584406 0.9585109 0.9996295 -0.9584526 0.9585109 0.9996295 -0.9584677 0.9585109 0.9996295 -0.9584868 0.9585109 0.9996295 -0.9585109 0.9585109 0.9996295 -0.9585415 0.9585109 0.9996295 -0.9585802 0.9585109 0.9996295 -0.9586291 0.9585109 0.9996295 -0.958691 0.9585109 0.9996295 -0.9587693 0.9585109 0.9996295 -0.9588684 0.9585109 0.9996295 -0.9589938 0.9585109 0.9996295 -0.9591524 0.9585109 0.9996295 -0.959353 0.9585109 0.9996295 -0.9596068 0.9585109 0.9996295 -0.959928 0.9585109 0.9996295 -0.9603343 0.9585109 0.9996295 -0.9608482 0.9585109 0.9996295 -0.9614985 0.9585109 0.9996295 -0.9623212 0.9585109 0.9996295 -0.963362 0.9585109 0.9996295 -0.9646787 0.9585109 0.9996295 -0.9663445 0.9585109 0.9996295 -0.968452 0.9585109 0.9996295 -0.9711183 0.9585109 0.9996295 -0.9744915 0.9585109 0.9996295 -0.978759 0.9585109 0.9996295 -0.9841579 0.9585109 0.9996295 -0.9909882 0.9585109 0.9996295 -0.9996295 0.9585109 0.9996295 -0.9997074 0.966947 0.9928267 -0.9997688 0.9737101 0.9899741 -0.9998174 0.9791163 0.989325 -0.9998557 0.9834277 0.9898295 -0.999886 0.9868597 0.9908712 -0.9999099 0.9895878 0.9920999 -0.9999288 0.9917537 0.9933261 -0.9999437 0.9934718 0.9944556 -0.958416 0.9585613 0.9996296 -0.9584159 0.958561 0.9996296 -0.9584157 0.9585607 0.9996296 -0.9584155 0.9585603 0.9996296 -0.9584153 0.9585598 0.9996296 -0.958415 0.9585591 0.9996296 -0.9584146 0.9585583 0.9996296 -0.9584142 0.9585574 0.9996296 -0.9584137 0.9585562 0.9996296 -0.9584132 0.9585547 0.9996296 -0.9584126 0.958553 0.9996296 -0.958412 0.958551 0.9996296 -0.9584115 0.9585487 0.9996296 -0.9584114 0.9585463 0.9996295 -0.958412 0.9585439 0.9996295 -0.9584138 0.9585421 0.9996295 -0.9584178 0.9585415 0.9996295 -0.9584237 0.9585415 0.9996295 -0.9584312 0.9585415 0.9996295 -0.9584406 0.9585415 0.9996295 -0.9584526 0.9585415 0.9996295 -0.9584677 0.9585415 0.9996295 -0.9584868 0.9585415 0.9996295 -0.9585109 0.9585415 0.9996295 -0.9585415 0.9585415 0.9996295 -0.9585802 0.9585415 0.9996295 -0.9586291 0.9585415 0.9996295 -0.958691 0.9585415 0.9996295 -0.9587693 0.9585415 0.9996295 -0.9588684 0.9585415 0.9996295 -0.9589938 0.9585415 0.9996295 -0.9591524 0.9585415 0.9996295 -0.959353 0.9585415 0.9996295 -0.9596068 0.9585415 0.9996295 -0.959928 0.9585415 0.9996295 -0.9603343 0.9585415 0.9996295 -0.9608482 0.9585415 0.9996295 -0.9614985 0.9585415 0.9996295 -0.9623212 0.9585415 0.9996295 -0.963362 0.9585415 0.9996295 -0.9646787 0.9585415 0.9996295 -0.9663445 0.9585415 0.9996295 -0.968452 0.9585415 0.9996295 -0.9711183 0.9585415 0.9996295 -0.9744915 0.9585415 0.9996295 -0.978759 0.9585415 0.9996295 -0.9841579 0.9585415 0.9996295 -0.9909882 0.9585415 0.9996295 -0.9996295 0.9585415 0.9996295 -0.9997074 0.9669663 0.9928267 -0.9997688 0.9737222 0.9899741 -0.9998174 0.9791238 0.989325 -0.9998557 0.9834324 0.9898295 -0.999886 0.9868627 0.9908712 -0.9999099 0.9895897 0.9920999 -0.9999288 0.9917549 0.9933261 -0.9999437 0.9934725 0.9944556 -0.958416 0.9585999 0.9996296 -0.9584159 0.9585997 0.9996296 -0.9584157 0.9585994 0.9996296 -0.9584155 0.9585989 0.9996296 -0.9584153 0.9585984 0.9996296 -0.958415 0.9585978 0.9996296 -0.9584146 0.958597 0.9996296 -0.9584142 0.958596 0.9996296 -0.9584137 0.9585948 0.9996296 -0.9584132 0.9585934 0.9996296 -0.9584126 0.9585917 0.9996296 -0.958412 0.9585897 0.9996296 -0.9584115 0.9585874 0.9996296 -0.9584114 0.958585 0.9996295 -0.958412 0.9585826 0.9996295 -0.9584138 0.9585808 0.9996295 -0.9584178 0.9585802 0.9996295 -0.9584237 0.9585802 0.9996295 -0.9584312 0.9585802 0.9996295 -0.9584406 0.9585802 0.9996295 -0.9584526 0.9585802 0.9996295 -0.9584677 0.9585802 0.9996295 -0.9584868 0.9585802 0.9996295 -0.9585109 0.9585802 0.9996295 -0.9585415 0.9585802 0.9996295 -0.9585802 0.9585802 0.9996295 -0.9586291 0.9585802 0.9996295 -0.958691 0.9585802 0.9996295 -0.9587693 0.9585802 0.9996295 -0.9588684 0.9585802 0.9996295 -0.9589938 0.9585802 0.9996295 -0.9591524 0.9585802 0.9996295 -0.959353 0.9585802 0.9996295 -0.9596068 0.9585802 0.9996295 -0.959928 0.9585802 0.9996295 -0.9603343 0.9585802 0.9996295 -0.9608482 0.9585802 0.9996295 -0.9614985 0.9585802 0.9996295 -0.9623212 0.9585802 0.9996295 -0.963362 0.9585802 0.9996295 -0.9646787 0.9585802 0.9996295 -0.9663445 0.9585802 0.9996295 -0.968452 0.9585802 0.9996295 -0.9711183 0.9585802 0.9996295 -0.9744915 0.9585802 0.9996295 -0.978759 0.9585802 0.9996295 -0.9841579 0.9585802 0.9996295 -0.9909882 0.9585802 0.9996295 -0.9996295 0.9585802 0.9996295 -0.9997074 0.9669906 0.9928267 -0.9997688 0.9737375 0.9899741 -0.9998174 0.9791334 0.989325 -0.9998557 0.9834385 0.9898295 -0.999886 0.9868665 0.9908712 -0.9999099 0.989592 0.9920999 -0.9999288 0.9917564 0.9933261 -0.9999437 0.9934734 0.9944556 -0.958416 0.9586489 0.9996296 -0.9584159 0.9586486 0.9996296 -0.9584157 0.9586483 0.9996296 -0.9584155 0.9586479 0.9996296 -0.9584153 0.9586473 0.9996296 -0.958415 0.9586467 0.9996296 -0.9584146 0.9586459 0.9996296 -0.9584142 0.9586449 0.9996296 -0.9584137 0.9586437 0.9996296 -0.9584132 0.9586423 0.9996296 -0.9584126 0.9586406 0.9996296 -0.958412 0.9586386 0.9996296 -0.9584115 0.9586363 0.9996296 -0.9584114 0.9586339 0.9996295 -0.958412 0.9586316 0.9996295 -0.9584138 0.9586297 0.9996295 -0.9584178 0.9586291 0.9996295 -0.9584237 0.9586291 0.9996295 -0.9584312 0.9586291 0.9996295 -0.9584406 0.9586291 0.9996295 -0.9584526 0.9586291 0.9996295 -0.9584677 0.9586291 0.9996295 -0.9584868 0.9586291 0.9996295 -0.9585109 0.9586291 0.9996295 -0.9585415 0.9586291 0.9996295 -0.9585802 0.9586291 0.9996295 -0.9586291 0.9586291 0.9996295 -0.958691 0.9586291 0.9996295 -0.9587693 0.9586291 0.9996295 -0.9588684 0.9586291 0.9996295 -0.9589938 0.9586291 0.9996295 -0.9591524 0.9586291 0.9996295 -0.959353 0.9586291 0.9996295 -0.9596068 0.9586291 0.9996295 -0.959928 0.9586291 0.9996295 -0.9603343 0.9586291 0.9996295 -0.9608482 0.9586291 0.9996295 -0.9614985 0.9586291 0.9996295 -0.9623212 0.9586291 0.9996295 -0.963362 0.9586291 0.9996295 -0.9646787 0.9586291 0.9996295 -0.9663445 0.9586291 0.9996295 -0.968452 0.9586291 0.9996295 -0.9711183 0.9586291 0.9996295 -0.9744915 0.9586291 0.9996295 -0.978759 0.9586291 0.9996295 -0.9841579 0.9586291 0.9996295 -0.9909882 0.9586291 0.9996295 -0.9996295 0.9586291 0.9996295 -0.9997074 0.9670214 0.9928267 -0.9997688 0.9737569 0.9899741 -0.9998174 0.9791456 0.989325 -0.9998557 0.9834461 0.9898295 -0.999886 0.9868713 0.9908712 -0.9999099 0.989595 0.9920999 -0.9999288 0.9917582 0.9933261 -0.9999437 0.9934746 0.9944556 -0.958416 0.9587107 0.9996296 -0.9584159 0.9587105 0.9996296 -0.9584157 0.9587101 0.9996296 -0.9584155 0.9587097 0.9996296 -0.9584153 0.9587092 0.9996296 -0.958415 0.9587086 0.9996296 -0.9584146 0.9587078 0.9996296 -0.9584142 0.9587068 0.9996296 -0.9584137 0.9587056 0.9996296 -0.9584132 0.9587042 0.9996296 -0.9584126 0.9587025 0.9996296 -0.958412 0.9587005 0.9996296 -0.9584115 0.9586982 0.9996296 -0.9584114 0.9586958 0.9996295 -0.958412 0.9586935 0.9996295 -0.9584138 0.9586916 0.9996295 -0.9584178 0.958691 0.9996295 -0.9584237 0.958691 0.9996295 -0.9584312 0.958691 0.9996295 -0.9584406 0.958691 0.9996295 -0.9584526 0.958691 0.9996295 -0.9584677 0.958691 0.9996295 -0.9584868 0.958691 0.9996295 -0.9585109 0.958691 0.9996295 -0.9585415 0.958691 0.9996295 -0.9585802 0.958691 0.9996295 -0.9586291 0.958691 0.9996295 -0.958691 0.958691 0.9996295 -0.9587693 0.958691 0.9996295 -0.9588684 0.958691 0.9996295 -0.9589938 0.958691 0.9996295 -0.9591524 0.958691 0.9996295 -0.959353 0.958691 0.9996295 -0.9596068 0.958691 0.9996295 -0.959928 0.958691 0.9996295 -0.9603343 0.958691 0.9996295 -0.9608482 0.958691 0.9996295 -0.9614985 0.958691 0.9996295 -0.9623212 0.958691 0.9996295 -0.963362 0.958691 0.9996295 -0.9646787 0.958691 0.9996295 -0.9663445 0.958691 0.9996295 -0.968452 0.958691 0.9996295 -0.9711183 0.958691 0.9996295 -0.9744915 0.958691 0.9996295 -0.978759 0.958691 0.9996295 -0.9841579 0.958691 0.9996295 -0.9909882 0.958691 0.9996295 -0.9996295 0.958691 0.9996295 -0.9997074 0.9670604 0.9928267 -0.9997688 0.9737814 0.9899741 -0.9998174 0.979161 0.989325 -0.9998557 0.9834557 0.9898295 -0.999886 0.9868773 0.9908712 -0.9999099 0.9895988 0.9920999 -0.9999288 0.9917606 0.9933261 -0.9999437 0.9934761 0.9944556 -0.958416 0.958789 0.9996296 -0.9584159 0.9587888 0.9996296 -0.9584157 0.9587884 0.9996296 -0.9584155 0.958788 0.9996296 -0.9584153 0.9587875 0.9996296 -0.958415 0.9587869 0.9996296 -0.9584146 0.9587861 0.9996296 -0.9584142 0.9587851 0.9996296 -0.9584137 0.9587839 0.9996296 -0.9584132 0.9587825 0.9996296 -0.9584126 0.9587808 0.9996296 -0.958412 0.9587788 0.9996296 -0.9584115 0.9587765 0.9996296 -0.9584114 0.9587741 0.9996295 -0.958412 0.9587718 0.9996295 -0.9584138 0.9587699 0.9996295 -0.9584178 0.9587693 0.9996295 -0.9584237 0.9587693 0.9996295 -0.9584312 0.9587693 0.9996295 -0.9584406 0.9587693 0.9996295 -0.9584526 0.9587693 0.9996295 -0.9584677 0.9587693 0.9996295 -0.9584868 0.9587693 0.9996295 -0.9585109 0.9587693 0.9996295 -0.9585415 0.9587693 0.9996295 -0.9585802 0.9587693 0.9996295 -0.9586291 0.9587693 0.9996295 -0.958691 0.9587693 0.9996295 -0.9587693 0.9587693 0.9996295 -0.9588684 0.9587693 0.9996295 -0.9589938 0.9587693 0.9996295 -0.9591524 0.9587693 0.9996295 -0.959353 0.9587693 0.9996295 -0.9596068 0.9587693 0.9996295 -0.959928 0.9587693 0.9996295 -0.9603343 0.9587693 0.9996295 -0.9608482 0.9587693 0.9996295 -0.9614985 0.9587693 0.9996295 -0.9623212 0.9587693 0.9996295 -0.963362 0.9587693 0.9996295 -0.9646787 0.9587693 0.9996295 -0.9663445 0.9587693 0.9996295 -0.968452 0.9587693 0.9996295 -0.9711183 0.9587693 0.9996295 -0.9744915 0.9587693 0.9996295 -0.978759 0.9587693 0.9996295 -0.9841579 0.9587693 0.9996295 -0.9909882 0.9587693 0.9996295 -0.9996295 0.9587693 0.9996295 -0.9997074 0.9671097 0.9928267 -0.9997688 0.9738123 0.9899741 -0.9998174 0.9791804 0.989325 -0.9998557 0.9834679 0.9898295 -0.999886 0.986885 0.9908712 -0.9999099 0.9896036 0.9920999 -0.9999288 0.9917636 0.9933261 -0.9999437 0.9934779 0.9944556 -0.958416 0.958888 0.9996296 -0.9584159 0.9588878 0.9996296 -0.9584157 0.9588875 0.9996296 -0.9584155 0.9588871 0.9996296 -0.9584153 0.9588865 0.9996296 -0.958415 0.9588859 0.9996296 -0.9584146 0.9588851 0.9996296 -0.9584142 0.9588842 0.9996296 -0.9584137 0.958883 0.9996296 -0.9584132 0.9588815 0.9996296 -0.9584126 0.9588798 0.9996296 -0.958412 0.9588778 0.9996296 -0.9584115 0.9588756 0.9996296 -0.9584114 0.9588732 0.9996295 -0.958412 0.9588709 0.9996295 -0.9584138 0.958869 0.9996295 -0.9584178 0.9588684 0.9996295 -0.9584237 0.9588684 0.9996295 -0.9584312 0.9588684 0.9996295 -0.9584406 0.9588684 0.9996295 -0.9584526 0.9588684 0.9996295 -0.9584677 0.9588684 0.9996295 -0.9584868 0.9588684 0.9996295 -0.9585109 0.9588684 0.9996295 -0.9585415 0.9588684 0.9996295 -0.9585802 0.9588684 0.9996295 -0.9586291 0.9588684 0.9996295 -0.958691 0.9588684 0.9996295 -0.9587693 0.9588684 0.9996295 -0.9588684 0.9588684 0.9996295 -0.9589938 0.9588684 0.9996295 -0.9591524 0.9588684 0.9996295 -0.959353 0.9588684 0.9996295 -0.9596068 0.9588684 0.9996295 -0.959928 0.9588684 0.9996295 -0.9603343 0.9588684 0.9996295 -0.9608482 0.9588684 0.9996295 -0.9614985 0.9588684 0.9996295 -0.9623212 0.9588684 0.9996295 -0.963362 0.9588684 0.9996295 -0.9646787 0.9588684 0.9996295 -0.9663445 0.9588684 0.9996295 -0.968452 0.9588684 0.9996295 -0.9711183 0.9588684 0.9996295 -0.9744915 0.9588684 0.9996295 -0.978759 0.9588684 0.9996295 -0.9841579 0.9588684 0.9996295 -0.9909882 0.9588684 0.9996295 -0.9996295 0.9588684 0.9996295 -0.9997074 0.967172 0.9928267 -0.9997688 0.9738515 0.9899741 -0.9998174 0.979205 0.989325 -0.9998557 0.9834833 0.9898295 -0.999886 0.9868946 0.9908712 -0.9999099 0.9896096 0.9920999 -0.9999288 0.9917674 0.9933261 -0.9999437 0.9934803 0.9944556 -0.958416 0.9590133 0.9996296 -0.9584159 0.9590131 0.9996296 -0.9584157 0.9590128 0.9996296 -0.9584155 0.9590124 0.9996296 -0.9584153 0.9590118 0.9996296 -0.958415 0.9590112 0.9996296 -0.9584146 0.9590104 0.9996296 -0.9584142 0.9590095 0.9996296 -0.9584137 0.9590083 0.9996296 -0.9584132 0.9590068 0.9996296 -0.9584126 0.9590051 0.9996296 -0.958412 0.9590032 0.9996296 -0.9584115 0.9590009 0.9996296 -0.9584114 0.9589985 0.9996295 -0.958412 0.9589962 0.9996295 -0.9584138 0.9589944 0.9996295 -0.9584178 0.9589938 0.9996295 -0.9584237 0.9589938 0.9996295 -0.9584312 0.9589938 0.9996295 -0.9584406 0.9589938 0.9996295 -0.9584526 0.9589938 0.9996295 -0.9584677 0.9589938 0.9996295 -0.9584868 0.9589938 0.9996295 -0.9585109 0.9589938 0.9996295 -0.9585415 0.9589938 0.9996295 -0.9585802 0.9589938 0.9996295 -0.9586291 0.9589938 0.9996295 -0.958691 0.9589938 0.9996295 -0.9587693 0.9589938 0.9996295 -0.9588684 0.9589938 0.9996295 -0.9589938 0.9589938 0.9996295 -0.9591524 0.9589938 0.9996295 -0.959353 0.9589938 0.9996295 -0.9596068 0.9589938 0.9996295 -0.959928 0.9589938 0.9996295 -0.9603343 0.9589938 0.9996295 -0.9608482 0.9589938 0.9996295 -0.9614985 0.9589938 0.9996295 -0.9623212 0.9589938 0.9996295 -0.963362 0.9589938 0.9996295 -0.9646787 0.9589938 0.9996295 -0.9663445 0.9589938 0.9996295 -0.968452 0.9589938 0.9996295 -0.9711183 0.9589938 0.9996295 -0.9744915 0.9589938 0.9996295 -0.978759 0.9589938 0.9996295 -0.9841579 0.9589938 0.9996295 -0.9909882 0.9589938 0.9996295 -0.9996295 0.9589938 0.9996295 -0.9997074 0.9672509 0.9928267 -0.9997688 0.9739011 0.9899741 -0.9998174 0.9792361 0.989325 -0.9998557 0.9835029 0.9898295 -0.999886 0.9869069 0.9908712 -0.9999099 0.9896173 0.9920999 -0.9999288 0.9917722 0.9933261 -0.9999437 0.9934833 0.9944556 -0.958416 0.9591719 0.9996296 -0.9584159 0.9591716 0.9996296 -0.9584157 0.9591713 0.9996296 -0.9584155 0.9591709 0.9996296 -0.9584153 0.9591704 0.9996296 -0.958415 0.9591697 0.9996296 -0.9584146 0.959169 0.9996296 -0.9584142 0.959168 0.9996296 -0.9584137 0.9591668 0.9996296 -0.9584132 0.9591654 0.9996296 -0.9584126 0.9591637 0.9996296 -0.958412 0.9591617 0.9996296 -0.9584115 0.9591595 0.9996296 -0.9584114 0.9591571 0.9996295 -0.958412 0.9591548 0.9996295 -0.9584138 0.959153 0.9996295 -0.9584178 0.9591524 0.9996295 -0.9584237 0.9591524 0.9996295 -0.9584312 0.9591524 0.9996295 -0.9584406 0.9591524 0.9996295 -0.9584526 0.9591524 0.9996295 -0.9584677 0.9591524 0.9996295 -0.9584868 0.9591524 0.9996295 -0.9585109 0.9591524 0.9996295 -0.9585415 0.9591524 0.9996295 -0.9585802 0.9591524 0.9996295 -0.9586291 0.9591524 0.9996295 -0.958691 0.9591524 0.9996295 -0.9587693 0.9591524 0.9996295 -0.9588684 0.9591524 0.9996295 -0.9589938 0.9591524 0.9996295 -0.9591524 0.9591524 0.9996295 -0.959353 0.9591524 0.9996295 -0.9596068 0.9591524 0.9996295 -0.959928 0.9591524 0.9996295 -0.9603343 0.9591524 0.9996295 -0.9608482 0.9591524 0.9996295 -0.9614985 0.9591524 0.9996295 -0.9623212 0.9591524 0.9996295 -0.963362 0.9591524 0.9996295 -0.9646787 0.9591524 0.9996295 -0.9663445 0.9591524 0.9996295 -0.968452 0.9591524 0.9996295 -0.9711183 0.9591524 0.9996295 -0.9744915 0.9591524 0.9996295 -0.978759 0.9591524 0.9996295 -0.9841579 0.9591524 0.9996295 -0.9909882 0.9591524 0.9996295 -0.9996295 0.9591524 0.9996295 -0.9997074 0.9673508 0.9928267 -0.9997688 0.9739638 0.9899741 -0.9998174 0.9792755 0.989325 -0.9998557 0.9835276 0.9898295 -0.999886 0.9869223 0.9908712 -0.9999099 0.989627 0.9920999 -0.9999288 0.9917782 0.9933261 -0.9999437 0.9934871 0.9944556 -0.958416 0.9593724 0.9996296 -0.9584159 0.9593721 0.9996296 -0.9584157 0.9593718 0.9996296 -0.9584155 0.9593714 0.9996296 -0.9584153 0.9593709 0.9996296 -0.958415 0.9593703 0.9996296 -0.9584146 0.9593695 0.9996296 -0.9584142 0.9593686 0.9996296 -0.9584137 0.9593674 0.9996296 -0.9584132 0.959366 0.9996296 -0.9584126 0.9593643 0.9996296 -0.958412 0.9593623 0.9996296 -0.9584115 0.9593601 0.9996296 -0.9584114 0.9593577 0.9996295 -0.958412 0.9593554 0.9996295 -0.9584138 0.9593536 0.9996295 -0.9584178 0.959353 0.9996295 -0.9584237 0.959353 0.9996295 -0.9584312 0.959353 0.9996295 -0.9584406 0.959353 0.9996295 -0.9584526 0.959353 0.9996295 -0.9584677 0.959353 0.9996295 -0.9584868 0.959353 0.9996295 -0.9585109 0.959353 0.9996295 -0.9585415 0.959353 0.9996295 -0.9585802 0.959353 0.9996295 -0.9586291 0.959353 0.9996295 -0.958691 0.959353 0.9996295 -0.9587693 0.959353 0.9996295 -0.9588684 0.959353 0.9996295 -0.9589938 0.959353 0.9996295 -0.9591524 0.959353 0.9996295 -0.959353 0.959353 0.9996295 -0.9596068 0.959353 0.9996295 -0.959928 0.959353 0.9996295 -0.9603343 0.959353 0.9996295 -0.9608482 0.959353 0.9996295 -0.9614985 0.959353 0.9996295 -0.9623212 0.959353 0.9996295 -0.963362 0.959353 0.9996295 -0.9646787 0.959353 0.9996295 -0.9663445 0.959353 0.9996295 -0.968452 0.959353 0.9996295 -0.9711183 0.959353 0.9996295 -0.9744915 0.959353 0.9996295 -0.978759 0.959353 0.9996295 -0.9841579 0.959353 0.9996295 -0.9909882 0.959353 0.9996295 -0.9996295 0.959353 0.9996295 -0.9997074 0.967477 0.9928267 -0.9997688 0.9740432 0.9899741 -0.9998174 0.9793253 0.989325 -0.9998557 0.9835588 0.9898295 -0.999886 0.9869419 0.9908712 -0.9999099 0.9896392 0.9920999 -0.9999288 0.9917859 0.9933261 -0.9999437 0.9934919 0.9944556 -0.958416 0.9596261 0.9996296 -0.9584159 0.9596259 0.9996296 -0.9584157 0.9596255 0.9996296 -0.9584155 0.9596251 0.9996296 -0.9584153 0.9596246 0.9996296 -0.958415 0.959624 0.9996296 -0.9584146 0.9596232 0.9996296 -0.9584142 0.9596223 0.9996296 -0.9584137 0.9596211 0.9996296 -0.9584132 0.9596197 0.9996296 -0.9584126 0.959618 0.9996296 -0.958412 0.9596161 0.9996296 -0.9584115 0.9596139 0.9996296 -0.9584114 0.9596115 0.9996295 -0.958412 0.9596092 0.9996295 -0.9584138 0.9596074 0.9996295 -0.9584178 0.9596068 0.9996295 -0.9584237 0.9596068 0.9996295 -0.9584312 0.9596068 0.9996295 -0.9584406 0.9596068 0.9996295 -0.9584526 0.9596068 0.9996295 -0.9584677 0.9596068 0.9996295 -0.9584868 0.9596068 0.9996295 -0.9585109 0.9596068 0.9996295 -0.9585415 0.9596068 0.9996295 -0.9585802 0.9596068 0.9996295 -0.9586291 0.9596068 0.9996295 -0.958691 0.9596068 0.9996295 -0.9587693 0.9596068 0.9996295 -0.9588684 0.9596068 0.9996295 -0.9589938 0.9596068 0.9996295 -0.9591524 0.9596068 0.9996295 -0.959353 0.9596068 0.9996295 -0.9596068 0.9596068 0.9996295 -0.959928 0.9596068 0.9996295 -0.9603343 0.9596068 0.9996295 -0.9608482 0.9596068 0.9996295 -0.9614985 0.9596068 0.9996295 -0.9623212 0.9596068 0.9996295 -0.963362 0.9596068 0.9996295 -0.9646787 0.9596068 0.9996295 -0.9663445 0.9596068 0.9996295 -0.968452 0.9596068 0.9996295 -0.9711183 0.9596068 0.9996295 -0.9744915 0.9596068 0.9996295 -0.978759 0.9596068 0.9996295 -0.9841579 0.9596068 0.9996295 -0.9909882 0.9596068 0.9996295 -0.9996295 0.9596068 0.9996295 -0.9997074 0.9676368 0.9928267 -0.9997688 0.9741436 0.9899741 -0.9998174 0.9793883 0.989325 -0.9998557 0.9835983 0.9898295 -0.999886 0.9869667 0.9908712 -0.9999099 0.9896547 0.9920999 -0.9999288 0.9917956 0.9933261 -0.9999437 0.993498 0.9944556 -0.958416 0.9599471 0.9996296 -0.9584159 0.9599468 0.9996296 -0.9584157 0.9599465 0.9996296 -0.9584155 0.9599461 0.9996296 -0.9584153 0.9599456 0.9996296 -0.958415 0.959945 0.9996296 -0.9584146 0.9599442 0.9996296 -0.9584142 0.9599433 0.9996296 -0.9584137 0.9599421 0.9996296 -0.9584132 0.9599407 0.9996296 -0.9584126 0.9599391 0.9996296 -0.958412 0.9599371 0.9996296 -0.9584115 0.959935 0.9996296 -0.9584114 0.9599326 0.9996295 -0.958412 0.9599303 0.9996295 -0.9584138 0.9599286 0.9996295 -0.9584178 0.959928 0.9996295 -0.9584237 0.959928 0.9996295 -0.9584312 0.959928 0.9996295 -0.9584406 0.959928 0.9996295 -0.9584526 0.959928 0.9996295 -0.9584677 0.959928 0.9996295 -0.9584868 0.959928 0.9996295 -0.9585109 0.959928 0.9996295 -0.9585415 0.959928 0.9996295 -0.9585802 0.959928 0.9996295 -0.9586291 0.959928 0.9996295 -0.958691 0.959928 0.9996295 -0.9587693 0.959928 0.9996295 -0.9588684 0.959928 0.9996295 -0.9589938 0.959928 0.9996295 -0.9591524 0.959928 0.9996295 -0.959353 0.959928 0.9996295 -0.9596068 0.959928 0.9996295 -0.959928 0.959928 0.9996295 -0.9603343 0.959928 0.9996295 -0.9608482 0.959928 0.9996295 -0.9614985 0.959928 0.9996295 -0.9623212 0.959928 0.9996295 -0.963362 0.959928 0.9996295 -0.9646787 0.959928 0.9996295 -0.9663445 0.959928 0.9996295 -0.968452 0.959928 0.9996295 -0.9711183 0.959928 0.9996295 -0.9744915 0.959928 0.9996295 -0.978759 0.959928 0.9996295 -0.9841579 0.959928 0.9996295 -0.9909882 0.959928 0.9996295 -0.9996295 0.959928 0.9996295 -0.9997074 0.9678389 0.9928267 -0.9997688 0.9742706 0.9899741 -0.9998174 0.9794681 0.989325 -0.9998557 0.9836483 0.9898295 -0.999886 0.986998 0.9908712 -0.9999099 0.9896744 0.9920999 -0.9999288 0.9918079 0.9933261 -0.9999437 0.9935057 0.9944556 -0.958416 0.9603532 0.9996296 -0.9584159 0.9603529 0.9996296 -0.9584157 0.9603526 0.9996296 -0.9584155 0.9603522 0.9996296 -0.9584153 0.9603517 0.9996296 -0.958415 0.9603511 0.9996296 -0.9584146 0.9603504 0.9996296 -0.9584142 0.9603494 0.9996296 -0.9584137 0.9603483 0.9996296 -0.9584132 0.9603469 0.9996296 -0.9584126 0.9603452 0.9996296 -0.958412 0.9603433 0.9996296 -0.9584115 0.9603412 0.9996296 -0.9584114 0.9603388 0.9996295 -0.958412 0.9603366 0.9996295 -0.9584138 0.9603348 0.9996295 -0.9584178 0.9603343 0.9996295 -0.9584237 0.9603343 0.9996295 -0.9584312 0.9603343 0.9996295 -0.9584406 0.9603343 0.9996295 -0.9584526 0.9603343 0.9996295 -0.9584677 0.9603343 0.9996295 -0.9584868 0.9603343 0.9996295 -0.9585109 0.9603343 0.9996295 -0.9585415 0.9603343 0.9996295 -0.9585802 0.9603343 0.9996295 -0.9586291 0.9603343 0.9996295 -0.958691 0.9603343 0.9996295 -0.9587693 0.9603343 0.9996295 -0.9588684 0.9603343 0.9996295 -0.9589938 0.9603343 0.9996295 -0.9591524 0.9603343 0.9996295 -0.959353 0.9603343 0.9996295 -0.9596068 0.9603343 0.9996295 -0.959928 0.9603343 0.9996295 -0.9603343 0.9603343 0.9996295 -0.9608482 0.9603343 0.9996295 -0.9614985 0.9603343 0.9996295 -0.9623212 0.9603343 0.9996295 -0.963362 0.9603343 0.9996295 -0.9646787 0.9603343 0.9996295 -0.9663445 0.9603343 0.9996295 -0.968452 0.9603343 0.9996295 -0.9711183 0.9603343 0.9996295 -0.9744915 0.9603343 0.9996295 -0.978759 0.9603343 0.9996295 -0.9841579 0.9603343 0.9996295 -0.9909882 0.9603343 0.9996295 -0.9996295 0.9603343 0.9996295 -0.9997074 0.9680946 0.9928267 -0.9997688 0.9744313 0.9899741 -0.9998174 0.9795689 0.989325 -0.9998557 0.9837116 0.9898295 -0.999886 0.9870376 0.9908712 -0.9999099 0.9896992 0.9920999 -0.9999288 0.9918234 0.9933261 -0.9999437 0.9935154 0.9944556 -0.958416 0.9608669 0.9996296 -0.9584159 0.9608667 0.9996296 -0.9584157 0.9608664 0.9996296 -0.9584155 0.960866 0.9996296 -0.9584153 0.9608655 0.9996296 -0.958415 0.9608649 0.9996296 -0.9584146 0.9608641 0.9996296 -0.9584142 0.9608632 0.9996296 -0.9584137 0.9608621 0.9996296 -0.9584132 0.9608607 0.9996296 -0.9584126 0.9608591 0.9996296 -0.958412 0.9608572 0.9996296 -0.9584115 0.9608551 0.9996296 -0.9584114 0.9608528 0.9996295 -0.958412 0.9608506 0.9996295 -0.9584138 0.9608488 0.9996295 -0.9584178 0.9608482 0.9996295 -0.9584237 0.9608482 0.9996295 -0.9584312 0.9608482 0.9996295 -0.9584406 0.9608482 0.9996295 -0.9584526 0.9608482 0.9996295 -0.9584677 0.9608482 0.9996295 -0.9584868 0.9608482 0.9996295 -0.9585109 0.9608482 0.9996295 -0.9585415 0.9608482 0.9996295 -0.9585802 0.9608482 0.9996295 -0.9586291 0.9608482 0.9996295 -0.958691 0.9608482 0.9996295 -0.9587693 0.9608482 0.9996295 -0.9588684 0.9608482 0.9996295 -0.9589938 0.9608482 0.9996295 -0.9591524 0.9608482 0.9996295 -0.959353 0.9608482 0.9996295 -0.9596068 0.9608482 0.9996295 -0.959928 0.9608482 0.9996295 -0.9603343 0.9608482 0.9996295 -0.9608482 0.9608482 0.9996295 -0.9614985 0.9608482 0.9996295 -0.9623212 0.9608482 0.9996295 -0.963362 0.9608482 0.9996295 -0.9646787 0.9608482 0.9996295 -0.9663445 0.9608482 0.9996295 -0.968452 0.9608482 0.9996295 -0.9711183 0.9608482 0.9996295 -0.9744915 0.9608482 0.9996295 -0.978759 0.9608482 0.9996295 -0.9841579 0.9608482 0.9996295 -0.9909882 0.9608482 0.9996295 -0.9996295 0.9608482 0.9996295 -0.9997074 0.9684181 0.9928267 -0.9997688 0.9746346 0.9899741 -0.9998174 0.9796966 0.989325 -0.9998557 0.9837916 0.9898295 -0.999886 0.9870878 0.9908712 -0.9999099 0.9897306 0.9920999 -0.9999288 0.9918431 0.9933261 -0.9999437 0.9935277 0.9944556 -0.958416 0.9615169 0.9996296 -0.9584159 0.9615166 0.9996296 -0.9584157 0.9615163 0.9996296 -0.9584155 0.9615159 0.9996296 -0.9584153 0.9615155 0.9996296 -0.958415 0.9615149 0.9996296 -0.9584146 0.9615141 0.9996296 -0.9584142 0.9615132 0.9996296 -0.9584137 0.9615121 0.9996296 -0.9584132 0.9615108 0.9996296 -0.9584126 0.9615092 0.9996296 -0.958412 0.9615073 0.9996296 -0.9584115 0.9615052 0.9996296 -0.9584114 0.961503 0.9996295 -0.958412 0.9615008 0.9996295 -0.9584138 0.9614991 0.9996295 -0.9584178 0.9614985 0.9996295 -0.9584237 0.9614985 0.9996295 -0.9584312 0.9614985 0.9996295 -0.9584406 0.9614985 0.9996295 -0.9584526 0.9614985 0.9996295 -0.9584677 0.9614985 0.9996295 -0.9584868 0.9614985 0.9996295 -0.9585109 0.9614985 0.9996295 -0.9585415 0.9614985 0.9996295 -0.9585802 0.9614985 0.9996295 -0.9586291 0.9614985 0.9996295 -0.958691 0.9614985 0.9996295 -0.9587693 0.9614985 0.9996295 -0.9588684 0.9614985 0.9996295 -0.9589938 0.9614985 0.9996295 -0.9591524 0.9614985 0.9996295 -0.959353 0.9614985 0.9996295 -0.9596068 0.9614985 0.9996295 -0.959928 0.9614985 0.9996295 -0.9603343 0.9614985 0.9996295 -0.9608482 0.9614985 0.9996295 -0.9614985 0.9614985 0.9996295 -0.9623212 0.9614985 0.9996295 -0.963362 0.9614985 0.9996295 -0.9646787 0.9614985 0.9996295 -0.9663445 0.9614985 0.9996295 -0.968452 0.9614985 0.9996295 -0.9711183 0.9614985 0.9996295 -0.9744915 0.9614985 0.9996295 -0.978759 0.9614985 0.9996295 -0.9841579 0.9614985 0.9996295 -0.9909882 0.9614985 0.9996295 -0.9996295 0.9614985 0.9996295 -0.9997074 0.9688274 0.9928267 -0.9997688 0.9748918 0.9899741 -0.9998174 0.979858 0.989325 -0.9998557 0.9838928 0.9898295 -0.999886 0.9871512 0.9908712 -0.9999099 0.9897703 0.9920999 -0.9999288 0.991868 0.9933261 -0.9999437 0.9935432 0.9944556 -0.958416 0.9623392 0.9996296 -0.9584159 0.9623389 0.9996296 -0.9584157 0.9623386 0.9996296 -0.9584155 0.9623382 0.9996296 -0.9584153 0.9623378 0.9996296 -0.958415 0.9623372 0.9996296 -0.9584146 0.9623365 0.9996296 -0.9584142 0.9623356 0.9996296 -0.9584137 0.9623345 0.9996296 -0.9584132 0.9623332 0.9996296 -0.9584126 0.9623316 0.9996296 -0.958412 0.9623298 0.9996296 -0.9584115 0.9623277 0.9996296 -0.9584114 0.9623255 0.9996295 -0.958412 0.9623234 0.9996295 -0.9584138 0.9623217 0.9996295 -0.9584178 0.9623212 0.9996295 -0.9584237 0.9623212 0.9996295 -0.9584312 0.9623212 0.9996295 -0.9584406 0.9623212 0.9996295 -0.9584526 0.9623212 0.9996295 -0.9584677 0.9623212 0.9996295 -0.9584868 0.9623212 0.9996295 -0.9585109 0.9623212 0.9996295 -0.9585415 0.9623212 0.9996295 -0.9585802 0.9623212 0.9996295 -0.9586291 0.9623212 0.9996295 -0.958691 0.9623212 0.9996295 -0.9587693 0.9623212 0.9996295 -0.9588684 0.9623212 0.9996295 -0.9589938 0.9623212 0.9996295 -0.9591524 0.9623212 0.9996295 -0.959353 0.9623212 0.9996295 -0.9596068 0.9623212 0.9996295 -0.959928 0.9623212 0.9996295 -0.9603343 0.9623212 0.9996295 -0.9608482 0.9623212 0.9996295 -0.9614985 0.9623212 0.9996295 -0.9623212 0.9623212 0.9996295 -0.963362 0.9623212 0.9996295 -0.9646787 0.9623212 0.9996295 -0.9663445 0.9623212 0.9996295 -0.968452 0.9623212 0.9996295 -0.9711183 0.9623212 0.9996295 -0.9744915 0.9623212 0.9996295 -0.978759 0.9623212 0.9996295 -0.9841579 0.9623212 0.9996295 -0.9909882 0.9623212 0.9996295 -0.9996295 0.9623212 0.9996295 -0.9997074 0.9693452 0.9928267 -0.9997688 0.9752172 0.9899741 -0.9998174 0.9800622 0.989325 -0.9998557 0.9840209 0.9898295 -0.999886 0.9872315 0.9908712 -0.9999099 0.9898206 0.9920999 -0.9999288 0.9918994 0.9933261 -0.9999437 0.9935629 0.9944556 -0.958416 0.9633794 0.9996296 -0.9584159 0.9633792 0.9996296 -0.9584157 0.9633789 0.9996296 -0.9584155 0.9633786 0.9996296 -0.9584153 0.9633781 0.9996296 -0.958415 0.9633775 0.9996296 -0.9584146 0.9633768 0.9996296 -0.9584142 0.963376 0.9996296 -0.9584137 0.9633749 0.9996296 -0.9584132 0.9633736 0.9996296 -0.9584126 0.9633721 0.9996296 -0.958412 0.9633703 0.9996296 -0.9584115 0.9633684 0.9996296 -0.9584114 0.9633662 0.9996295 -0.958412 0.9633641 0.9996295 -0.9584138 0.9633625 0.9996295 -0.9584178 0.963362 0.9996295 -0.9584237 0.963362 0.9996295 -0.9584312 0.963362 0.9996295 -0.9584406 0.963362 0.9996295 -0.9584526 0.963362 0.9996295 -0.9584677 0.963362 0.9996295 -0.9584868 0.963362 0.9996295 -0.9585109 0.963362 0.9996295 -0.9585415 0.963362 0.9996295 -0.9585802 0.963362 0.9996295 -0.9586291 0.963362 0.9996295 -0.958691 0.963362 0.9996295 -0.9587693 0.963362 0.9996295 -0.9588684 0.963362 0.9996295 -0.9589938 0.963362 0.9996295 -0.9591524 0.963362 0.9996295 -0.959353 0.963362 0.9996295 -0.9596068 0.963362 0.9996295 -0.959928 0.963362 0.9996295 -0.9603343 0.963362 0.9996295 -0.9608482 0.963362 0.9996295 -0.9614985 0.963362 0.9996295 -0.9623212 0.963362 0.9996295 -0.963362 0.963362 0.9996295 -0.9646787 0.963362 0.9996295 -0.9663445 0.963362 0.9996295 -0.968452 0.963362 0.9996295 -0.9711183 0.963362 0.9996295 -0.9744915 0.963362 0.9996295 -0.978759 0.963362 0.9996295 -0.9841579 0.963362 0.9996295 -0.9909882 0.963362 0.9996295 -0.9996295 0.963362 0.9996295 -0.9997074 0.9700002 0.9928267 -0.9997688 0.9756289 0.9899741 -0.9998174 0.9803206 0.989325 -0.9998557 0.9841829 0.9898295 -0.999886 0.987333 0.9908712 -0.9999099 0.9898842 0.9920999 -0.9999288 0.9919392 0.9933261 -0.9999437 0.9935878 0.9944556 -0.958416 0.9646955 0.9996296 -0.9584159 0.9646953 0.9996296 -0.9584157 0.964695 0.9996296 -0.9584155 0.9646947 0.9996296 -0.9584153 0.9646943 0.9996296 -0.958415 0.9646937 0.9996296 -0.9584146 0.964693 0.9996296 -0.9584142 0.9646922 0.9996296 -0.9584137 0.9646912 0.9996296 -0.9584132 0.96469 0.9996296 -0.9584126 0.9646885 0.9996296 -0.958412 0.9646868 0.9996296 -0.9584115 0.9646849 0.9996296 -0.9584114 0.9646828 0.9996295 -0.958412 0.9646808 0.9996295 -0.9584138 0.9646792 0.9996295 -0.9584178 0.9646787 0.9996295 -0.9584237 0.9646787 0.9996295 -0.9584312 0.9646787 0.9996295 -0.9584406 0.9646787 0.9996295 -0.9584526 0.9646787 0.9996295 -0.9584677 0.9646787 0.9996295 -0.9584868 0.9646787 0.9996295 -0.9585109 0.9646787 0.9996295 -0.9585415 0.9646787 0.9996295 -0.9585802 0.9646787 0.9996295 -0.9586291 0.9646787 0.9996295 -0.958691 0.9646787 0.9996295 -0.9587693 0.9646787 0.9996295 -0.9588684 0.9646787 0.9996295 -0.9589938 0.9646787 0.9996295 -0.9591524 0.9646787 0.9996295 -0.959353 0.9646787 0.9996295 -0.9596068 0.9646787 0.9996295 -0.959928 0.9646787 0.9996295 -0.9603343 0.9646787 0.9996295 -0.9608482 0.9646787 0.9996295 -0.9614985 0.9646787 0.9996295 -0.9623212 0.9646787 0.9996295 -0.963362 0.9646787 0.9996295 -0.9646787 0.9646787 0.9996295 -0.9663445 0.9646787 0.9996295 -0.968452 0.9646787 0.9996295 -0.9711183 0.9646787 0.9996295 -0.9744915 0.9646787 0.9996295 -0.978759 0.9646787 0.9996295 -0.9841579 0.9646787 0.9996295 -0.9909882 0.9646787 0.9996295 -0.9996295 0.9646787 0.9996295 -0.9997074 0.970829 0.9928267 -0.9997688 0.9761497 0.9899741 -0.9998174 0.9806476 0.989325 -0.9998557 0.984388 0.9898295 -0.999886 0.9874615 0.9908712 -0.9999099 0.9899646 0.9920999 -0.9999288 0.9919896 0.9933261 -0.9999437 0.9936193 0.9944556 -0.958416 0.9663606 0.9996296 -0.9584159 0.9663604 0.9996296 -0.9584157 0.9663601 0.9996296 -0.9584155 0.9663598 0.9996296 -0.9584153 0.9663593 0.9996296 -0.958415 0.9663588 0.9996296 -0.9584146 0.9663582 0.9996296 -0.9584142 0.9663574 0.9996296 -0.9584137 0.9663564 0.9996296 -0.9584132 0.9663553 0.9996296 -0.9584126 0.9663539 0.9996296 -0.958412 0.9663522 0.9996296 -0.9584115 0.9663504 0.9996296 -0.9584114 0.9663484 0.9996295 -0.958412 0.9663465 0.9996295 -0.9584138 0.966345 0.9996295 -0.9584178 0.9663445 0.9996295 -0.9584237 0.9663445 0.9996295 -0.9584312 0.9663445 0.9996295 -0.9584406 0.9663445 0.9996295 -0.9584526 0.9663445 0.9996295 -0.9584677 0.9663445 0.9996295 -0.9584868 0.9663445 0.9996295 -0.9585109 0.9663445 0.9996295 -0.9585415 0.9663445 0.9996295 -0.9585802 0.9663445 0.9996295 -0.9586291 0.9663445 0.9996295 -0.958691 0.9663445 0.9996295 -0.9587693 0.9663445 0.9996295 -0.9588684 0.9663445 0.9996295 -0.9589938 0.9663445 0.9996295 -0.9591524 0.9663445 0.9996295 -0.959353 0.9663445 0.9996295 -0.9596068 0.9663445 0.9996295 -0.959928 0.9663445 0.9996295 -0.9603343 0.9663445 0.9996295 -0.9608482 0.9663445 0.9996295 -0.9614985 0.9663445 0.9996295 -0.9623212 0.9663445 0.9996295 -0.963362 0.9663445 0.9996295 -0.9646787 0.9663445 0.9996295 -0.9663445 0.9663445 0.9996295 -0.968452 0.9663445 0.9996295 -0.9711183 0.9663445 0.9996295 -0.9744915 0.9663445 0.9996295 -0.978759 0.9663445 0.9996295 -0.9841579 0.9663445 0.9996295 -0.9909882 0.9663445 0.9996295 -0.9996295 0.9663445 0.9996295 -0.9997074 0.9718774 0.9928267 -0.9997688 0.9768086 0.9899741 -0.9998174 0.9810611 0.989325 -0.9998557 0.9846473 0.9898295 -0.999886 0.987624 0.9908712 -0.9999099 0.9900664 0.9920999 -0.9999288 0.9920533 0.9933261 -0.9999437 0.9936592 0.9944556 -0.958416 0.9684671 0.9996296 -0.9584159 0.9684669 0.9996296 -0.9584157 0.9684666 0.9996296 -0.9584155 0.9684663 0.9996296 -0.9584153 0.9684659 0.9996296 -0.958415 0.9684654 0.9996296 -0.9584146 0.9684648 0.9996296 -0.9584142 0.9684641 0.9996296 -0.9584137 0.9684632 0.9996296 -0.9584132 0.9684621 0.9996296 -0.9584126 0.9684608 0.9996296 -0.958412 0.9684592 0.9996296 -0.9584115 0.9684575 0.9996296 -0.9584114 0.9684557 0.9996295 -0.958412 0.9684539 0.9996295 -0.9584138 0.9684525 0.9996295 -0.9584178 0.968452 0.9996295 -0.9584237 0.968452 0.9996295 -0.9584312 0.968452 0.9996295 -0.9584406 0.968452 0.9996295 -0.9584526 0.968452 0.9996295 -0.9584677 0.968452 0.9996295 -0.9584868 0.968452 0.9996295 -0.9585109 0.968452 0.9996295 -0.9585415 0.968452 0.9996295 -0.9585802 0.968452 0.9996295 -0.9586291 0.968452 0.9996295 -0.958691 0.968452 0.9996295 -0.9587693 0.968452 0.9996295 -0.9588684 0.968452 0.9996295 -0.9589938 0.968452 0.9996295 -0.9591524 0.968452 0.9996295 -0.959353 0.968452 0.9996295 -0.9596068 0.968452 0.9996295 -0.959928 0.968452 0.9996295 -0.9603343 0.968452 0.9996295 -0.9608482 0.968452 0.9996295 -0.9614985 0.968452 0.9996295 -0.9623212 0.968452 0.9996295 -0.963362 0.968452 0.9996295 -0.9646787 0.968452 0.9996295 -0.9663445 0.968452 0.9996295 -0.968452 0.968452 0.9996295 -0.9711183 0.968452 0.9996295 -0.9744915 0.968452 0.9996295 -0.978759 0.968452 0.9996295 -0.9841579 0.968452 0.9996295 -0.9909882 0.968452 0.9996295 -0.9996295 0.968452 0.9996295 -0.9997074 0.9732039 0.9928267 -0.9997688 0.9776422 0.9899741 -0.9998174 0.9815844 0.989325 -0.9998557 0.9849754 0.9898295 -0.999886 0.9878296 0.9908712 -0.9999099 0.9901951 0.9920999 -0.9999288 0.9921339 0.9933261 -0.9999437 0.9937096 0.9944556 -0.958416 0.971132 0.9996296 -0.9584159 0.9711319 0.9996296 -0.9584157 0.9711316 0.9996296 -0.9584155 0.9711314 0.9996296 -0.9584153 0.971131 0.9996296 -0.958415 0.9711305 0.9996296 -0.9584146 0.97113 0.9996296 -0.9584142 0.9711293 0.9996296 -0.9584137 0.9711285 0.9996296 -0.9584132 0.9711275 0.9996296 -0.9584126 0.9711263 0.9996296 -0.958412 0.9711249 0.9996296 -0.9584115 0.9711233 0.9996296 -0.9584114 0.9711216 0.9996295 -0.958412 0.97112 0.9996295 -0.9584138 0.9711187 0.9996295 -0.9584178 0.9711183 0.9996295 -0.9584237 0.9711183 0.9996295 -0.9584312 0.9711183 0.9996295 -0.9584406 0.9711183 0.9996295 -0.9584526 0.9711183 0.9996295 -0.9584677 0.9711183 0.9996295 -0.9584868 0.9711183 0.9996295 -0.9585109 0.9711183 0.9996295 -0.9585415 0.9711183 0.9996295 -0.9585802 0.9711183 0.9996295 -0.9586291 0.9711183 0.9996295 -0.958691 0.9711183 0.9996295 -0.9587693 0.9711183 0.9996295 -0.9588684 0.9711183 0.9996295 -0.9589938 0.9711183 0.9996295 -0.9591524 0.9711183 0.9996295 -0.959353 0.9711183 0.9996295 -0.9596068 0.9711183 0.9996295 -0.959928 0.9711183 0.9996295 -0.9603343 0.9711183 0.9996295 -0.9608482 0.9711183 0.9996295 -0.9614985 0.9711183 0.9996295 -0.9623212 0.9711183 0.9996295 -0.963362 0.9711183 0.9996295 -0.9646787 0.9711183 0.9996295 -0.9663445 0.9711183 0.9996295 -0.968452 0.9711183 0.9996295 -0.9711183 0.9711183 0.9996295 -0.9744915 0.9711183 0.9996295 -0.978759 0.9711183 0.9996295 -0.9841579 0.9711183 0.9996295 -0.9909882 0.9711183 0.9996295 -0.9996295 0.9711183 0.9996295 -0.9997074 0.974882 0.9928267 -0.9997688 0.9786968 0.9899741 -0.9998174 0.9822464 0.989325 -0.9998557 0.9853905 0.9898295 -0.999886 0.9880897 0.9908712 -0.9999099 0.990358 0.9920999 -0.9999288 0.9922358 0.9933261 -0.9999437 0.9937734 0.9944556 -0.958416 0.9745036 0.9996296 -0.9584159 0.9745034 0.9996296 -0.9584157 0.9745032 0.9996296 -0.9584155 0.974503 0.9996296 -0.9584153 0.9745027 0.9996296 -0.958415 0.9745023 0.9996296 -0.9584146 0.9745018 0.9996296 -0.9584142 0.9745012 0.9996296 -0.9584137 0.9745005 0.9996296 -0.9584132 0.9744996 0.9996296 -0.9584126 0.9744985 0.9996296 -0.958412 0.9744973 0.9996296 -0.9584115 0.9744959 0.9996296 -0.9584114 0.9744944 0.9996295 -0.958412 0.974493 0.9996295 -0.9584138 0.9744918 0.9996295 -0.9584178 0.9744915 0.9996295 -0.9584237 0.9744915 0.9996295 -0.9584312 0.9744915 0.9996295 -0.9584406 0.9744915 0.9996295 -0.9584526 0.9744915 0.9996295 -0.9584677 0.9744915 0.9996295 -0.9584868 0.9744915 0.9996295 -0.9585109 0.9744915 0.9996295 -0.9585415 0.9744915 0.9996295 -0.9585802 0.9744915 0.9996295 -0.9586291 0.9744915 0.9996295 -0.958691 0.9744915 0.9996295 -0.9587693 0.9744915 0.9996295 -0.9588684 0.9744915 0.9996295 -0.9589938 0.9744915 0.9996295 -0.9591524 0.9744915 0.9996295 -0.959353 0.9744915 0.9996295 -0.9596068 0.9744915 0.9996295 -0.959928 0.9744915 0.9996295 -0.9603343 0.9744915 0.9996295 -0.9608482 0.9744915 0.9996295 -0.9614985 0.9744915 0.9996295 -0.9623212 0.9744915 0.9996295 -0.963362 0.9744915 0.9996295 -0.9646787 0.9744915 0.9996295 -0.9663445 0.9744915 0.9996295 -0.968452 0.9744915 0.9996295 -0.9711183 0.9744915 0.9996295 -0.9744915 0.9744915 0.9996295 -0.978759 0.9744915 0.9996295 -0.9841579 0.9744915 0.9996295 -0.9909882 0.9744915 0.9996295 -0.9996295 0.9744915 0.9996295 -0.9997074 0.977005 0.9928267 -0.9997688 0.980031 0.9899741 -0.9998174 0.9830838 0.989325 -0.9998557 0.9859157 0.9898295 -0.999886 0.9884188 0.9908712 -0.9999099 0.9905641 0.9920999 -0.9999288 0.9923648 0.9933261 -0.9999437 0.9938541 0.9944556 -0.958416 0.978769 0.9996296 -0.9584159 0.9787689 0.9996296 -0.9584157 0.9787687 0.9996296 -0.9584155 0.9787685 0.9996296 -0.9584153 0.9787683 0.9996296 -0.958415 0.9787679 0.9996296 -0.9584146 0.9787675 0.9996296 -0.9584142 0.978767 0.9996296 -0.9584137 0.9787664 0.9996296 -0.9584132 0.9787657 0.9996296 -0.9584126 0.9787648 0.9996296 -0.958412 0.9787638 0.9996296 -0.9584115 0.9787626 0.9996296 -0.9584114 0.9787614 0.9996295 -0.958412 0.9787602 0.9996295 -0.9584138 0.9787593 0.9996295 -0.9584178 0.978759 0.9996295 -0.9584237 0.978759 0.9996295 -0.9584312 0.978759 0.9996295 -0.9584406 0.978759 0.9996295 -0.9584526 0.978759 0.9996295 -0.9584677 0.978759 0.9996295 -0.9584868 0.978759 0.9996295 -0.9585109 0.978759 0.9996295 -0.9585415 0.978759 0.9996295 -0.9585802 0.978759 0.9996295 -0.9586291 0.978759 0.9996295 -0.958691 0.978759 0.9996295 -0.9587693 0.978759 0.9996295 -0.9588684 0.978759 0.9996295 -0.9589938 0.978759 0.9996295 -0.9591524 0.978759 0.9996295 -0.959353 0.978759 0.9996295 -0.9596068 0.978759 0.9996295 -0.959928 0.978759 0.9996295 -0.9603343 0.978759 0.9996295 -0.9608482 0.978759 0.9996295 -0.9614985 0.978759 0.9996295 -0.9623212 0.978759 0.9996295 -0.963362 0.978759 0.9996295 -0.9646787 0.978759 0.9996295 -0.9663445 0.978759 0.9996295 -0.968452 0.978759 0.9996295 -0.9711183 0.978759 0.9996295 -0.9744915 0.978759 0.9996295 -0.978759 0.978759 0.9996295 -0.9841579 0.978759 0.9996295 -0.9909882 0.978759 0.9996295 -0.9996295 0.978759 0.9996295 -0.9997074 0.9796909 0.9928267 -0.9997688 0.981719 0.9899741 -0.9998174 0.9841433 0.989325 -0.9998557 0.9865801 0.9898295 -0.999886 0.9888351 0.9908712 -0.9999099 0.9908248 0.9920999 -0.9999288 0.992528 0.9933261 -0.9999437 0.9939562 0.9944556 -0.958416 0.9841654 0.9996296 -0.9584159 0.9841653 0.9996296 -0.9584157 0.9841652 0.9996296 -0.9584155 0.984165 0.9996296 -0.9584153 0.9841648 0.9996296 -0.958415 0.9841646 0.9996296 -0.9584146 0.9841643 0.9996296 -0.9584142 0.9841639 0.9996296 -0.9584137 0.9841634 0.9996296 -0.9584132 0.9841629 0.9996296 -0.9584126 0.9841622 0.9996296 -0.958412 0.9841615 0.9996296 -0.9584115 0.9841606 0.9996296 -0.9584114 0.9841597 0.9996295 -0.958412 0.9841588 0.9996295 -0.9584138 0.9841581 0.9996295 -0.9584178 0.9841579 0.9996295 -0.9584237 0.9841579 0.9996295 -0.9584312 0.9841579 0.9996295 -0.9584406 0.9841579 0.9996295 -0.9584526 0.9841579 0.9996295 -0.9584677 0.9841579 0.9996295 -0.9584868 0.9841579 0.9996295 -0.9585109 0.9841579 0.9996295 -0.9585415 0.9841579 0.9996295 -0.9585802 0.9841579 0.9996295 -0.9586291 0.9841579 0.9996295 -0.958691 0.9841579 0.9996295 -0.9587693 0.9841579 0.9996295 -0.9588684 0.9841579 0.9996295 -0.9589938 0.9841579 0.9996295 -0.9591524 0.9841579 0.9996295 -0.959353 0.9841579 0.9996295 -0.9596068 0.9841579 0.9996295 -0.959928 0.9841579 0.9996295 -0.9603343 0.9841579 0.9996295 -0.9608482 0.9841579 0.9996295 -0.9614985 0.9841579 0.9996295 -0.9623212 0.9841579 0.9996295 -0.963362 0.9841579 0.9996295 -0.9646787 0.9841579 0.9996295 -0.9663445 0.9841579 0.9996295 -0.968452 0.9841579 0.9996295 -0.9711183 0.9841579 0.9996295 -0.9744915 0.9841579 0.9996295 -0.978759 0.9841579 0.9996295 -0.9841579 0.9841579 0.9996295 -0.9909882 0.9841579 0.9996295 -0.9996295 0.9841579 0.9996295 -0.9997074 0.983089 0.9928267 -0.9997688 0.9838545 0.9899741 -0.9998174 0.9854838 0.989325 -0.9998557 0.9874207 0.9898295 -0.999886 0.9893618 0.9908712 -0.9999099 0.9911547 0.9920999 -0.9999288 0.9927345 0.9933261 -0.9999437 0.9940854 0.9944556 -0.958416 0.9909925 0.9996296 -0.9584159 0.9909924 0.9996296 -0.9584157 0.9909923 0.9996296 -0.9584155 0.9909923 0.9996296 -0.9584153 0.9909921 0.9996296 -0.958415 0.990992 0.9996296 -0.9584146 0.9909918 0.9996296 -0.9584142 0.9909916 0.9996296 -0.9584137 0.9909914 0.9996296 -0.9584132 0.9909911 0.9996296 -0.9584126 0.9909907 0.9996296 -0.958412 0.9909903 0.9996296 -0.9584115 0.9909898 0.9996296 -0.9584114 0.9909893 0.9996295 -0.958412 0.9909888 0.9996295 -0.9584138 0.9909884 0.9996295 -0.9584178 0.9909882 0.9996295 -0.9584237 0.9909882 0.9996295 -0.9584312 0.9909882 0.9996295 -0.9584406 0.9909882 0.9996295 -0.9584526 0.9909882 0.9996295 -0.9584677 0.9909882 0.9996295 -0.9584868 0.9909882 0.9996295 -0.9585109 0.9909882 0.9996295 -0.9585415 0.9909882 0.9996295 -0.9585802 0.9909882 0.9996295 -0.9586291 0.9909882 0.9996295 -0.958691 0.9909882 0.9996295 -0.9587693 0.9909882 0.9996295 -0.9588684 0.9909882 0.9996295 -0.9589938 0.9909882 0.9996295 -0.9591524 0.9909882 0.9996295 -0.959353 0.9909882 0.9996295 -0.9596068 0.9909882 0.9996295 -0.959928 0.9909882 0.9996295 -0.9603343 0.9909882 0.9996295 -0.9608482 0.9909882 0.9996295 -0.9614985 0.9909882 0.9996295 -0.9623212 0.9909882 0.9996295 -0.963362 0.9909882 0.9996295 -0.9646787 0.9909882 0.9996295 -0.9663445 0.9909882 0.9996295 -0.968452 0.9909882 0.9996295 -0.9711183 0.9909882 0.9996295 -0.9744915 0.9909882 0.9996295 -0.978759 0.9909882 0.9996295 -0.9841579 0.9909882 0.9996295 -0.9909882 0.9909882 0.9996295 -0.9996295 0.9909882 0.9996295 -0.9997074 0.9873879 0.9928267 -0.9997688 0.9865561 0.9899741 -0.9998174 0.9871796 0.989325 -0.9998557 0.9884841 0.9898295 -0.999886 0.9900282 0.9908712 -0.9999099 0.991572 0.9920999 -0.9999288 0.9929957 0.9933261 -0.9999437 0.9942488 0.9944556 -0.958416 0.9996296 0.9996296 -0.9584159 0.9996296 0.9996296 -0.9584157 0.9996296 0.9996296 -0.9584155 0.9996296 0.9996296 -0.9584153 0.9996296 0.9996296 -0.958415 0.9996296 0.9996296 -0.9584146 0.9996296 0.9996296 -0.9584142 0.9996296 0.9996296 -0.9584137 0.9996296 0.9996296 -0.9584132 0.9996296 0.9996296 -0.9584126 0.9996296 0.9996296 -0.958412 0.9996296 0.9996296 -0.9584115 0.9996296 0.9996296 -0.9584114 0.9996295 0.9996295 -0.958412 0.9996295 0.9996295 -0.9584138 0.9996295 0.9996295 -0.9584178 0.9996295 0.9996295 -0.9584237 0.9996295 0.9996295 -0.9584312 0.9996295 0.9996295 -0.9584406 0.9996295 0.9996295 -0.9584526 0.9996295 0.9996295 -0.9584677 0.9996295 0.9996295 -0.9584868 0.9996295 0.9996295 -0.9585109 0.9996295 0.9996295 -0.9585415 0.9996295 0.9996295 -0.9585802 0.9996295 0.9996295 -0.9586291 0.9996295 0.9996295 -0.958691 0.9996295 0.9996295 -0.9587693 0.9996295 0.9996295 -0.9588684 0.9996295 0.9996295 -0.9589938 0.9996295 0.9996295 -0.9591524 0.9996295 0.9996295 -0.959353 0.9996295 0.9996295 -0.9596068 0.9996295 0.9996295 -0.959928 0.9996295 0.9996295 -0.9603343 0.9996295 0.9996295 -0.9608482 0.9996295 0.9996295 -0.9614985 0.9996295 0.9996295 -0.9623212 0.9996295 0.9996295 -0.963362 0.9996295 0.9996295 -0.9646787 0.9996295 0.9996295 -0.9663445 0.9996295 0.9996295 -0.968452 0.9996295 0.9996295 -0.9711183 0.9996295 0.9996295 -0.9744915 0.9996295 0.9996295 -0.978759 0.9996295 0.9996295 -0.9841579 0.9996295 0.9996295 -0.9909882 0.9996295 0.9996295 -0.9996295 0.9996295 0.9996295 -0.9997074 0.9928267 0.9928267 -0.9997688 0.9899741 0.9899741 -0.9998174 0.989325 0.989325 -0.9998557 0.9898295 0.9898295 -0.999886 0.9908712 0.9908712 -0.9999099 0.9920999 0.9920999 -0.9999288 0.9933261 0.9933261 -0.9999437 0.9944556 0.9944556 -0.9668873 0.9997074 0.9928293 -0.9668872 0.9997074 0.9928293 -0.9668871 0.9997074 0.9928293 -0.966887 0.9997074 0.9928292 -0.9668869 0.9997074 0.9928291 -0.9668867 0.9997074 0.9928291 -0.9668865 0.9997074 0.9928289 -0.9668862 0.9997074 0.9928288 -0.9668859 0.9997074 0.9928287 -0.9668855 0.9997074 0.9928285 -0.9668852 0.9997074 0.9928282 -0.9668848 0.9997074 0.992828 -0.9668845 0.9997074 0.9928276 -0.9668844 0.9997074 0.9928273 -0.9668847 0.9997074 0.992827 -0.9668859 0.9997074 0.9928267 -0.9668884 0.9997074 0.9928267 -0.9668922 0.9997074 0.9928267 -0.9668969 0.9997074 0.9928267 -0.9669028 0.9997074 0.9928267 -0.9669103 0.9997074 0.9928267 -0.9669198 0.9997074 0.9928267 -0.9669318 0.9997074 0.9928267 -0.966947 0.9997074 0.9928267 -0.9669663 0.9997074 0.9928267 -0.9669906 0.9997074 0.9928267 -0.9670214 0.9997074 0.9928267 -0.9670604 0.9997074 0.9928267 -0.9671097 0.9997074 0.9928267 -0.967172 0.9997074 0.9928267 -0.9672509 0.9997074 0.9928267 -0.9673508 0.9997074 0.9928267 -0.967477 0.9997074 0.9928267 -0.9676368 0.9997074 0.9928267 -0.9678389 0.9997074 0.9928267 -0.9680946 0.9997074 0.9928267 -0.9684181 0.9997074 0.9928267 -0.9688274 0.9997074 0.9928267 -0.9693452 0.9997074 0.9928267 -0.9700002 0.9997074 0.9928267 -0.970829 0.9997074 0.9928267 -0.9718774 0.9997074 0.9928267 -0.9732039 0.9997074 0.9928267 -0.974882 0.9997074 0.9928267 -0.977005 0.9997074 0.9928267 -0.9796909 0.9997074 0.9928267 -0.983089 0.9997074 0.9928267 -0.9873879 0.9997074 0.9928267 -0.9928267 0.9997074 0.9928267 -0.9997074 0.9997074 0.9928267 -0.9997688 0.9942982 0.9899741 -0.9998174 0.9920392 0.989325 -0.9998557 0.9915316 0.9898295 -0.999886 0.9919377 0.9908712 -0.9999099 0.9927678 0.9920999 -0.9999288 0.9937442 0.9933261 -0.9999437 0.9947172 0.9944556 -0.9736726 0.9997689 0.9899771 -0.9736726 0.9997689 0.989977 -0.9736725 0.9997689 0.989977 -0.9736724 0.9997689 0.9899769 -0.9736723 0.9997689 0.9899768 -0.9736722 0.9997689 0.9899767 -0.9736721 0.9997689 0.9899766 -0.9736719 0.9997689 0.9899765 -0.9736717 0.9997689 0.9899763 -0.9736715 0.9997689 0.9899761 -0.9736712 0.9997689 0.9899758 -0.973671 0.9997689 0.9899755 -0.9736708 0.9997689 0.9899752 -0.9736708 0.9997689 0.9899748 -0.973671 0.9997688 0.9899744 -0.9736717 0.9997688 0.9899742 -0.9736733 0.9997688 0.9899741 -0.9736756 0.9997688 0.9899741 -0.9736786 0.9997688 0.9899741 -0.9736823 0.9997688 0.9899741 -0.973687 0.9997688 0.9899741 -0.973693 0.9997688 0.9899741 -0.9737006 0.9997688 0.9899741 -0.9737101 0.9997688 0.9899741 -0.9737222 0.9997688 0.9899741 -0.9737375 0.9997688 0.9899741 -0.9737569 0.9997688 0.9899741 -0.9737814 0.9997688 0.9899741 -0.9738123 0.9997688 0.9899741 -0.9738515 0.9997688 0.9899741 -0.9739011 0.9997688 0.9899741 -0.9739638 0.9997688 0.9899741 -0.9740432 0.9997688 0.9899741 -0.9741436 0.9997688 0.9899741 -0.9742706 0.9997688 0.9899741 -0.9744313 0.9997688 0.9899741 -0.9746346 0.9997688 0.9899741 -0.9748918 0.9997688 0.9899741 -0.9752172 0.9997688 0.9899741 -0.9756289 0.9997688 0.9899741 -0.9761497 0.9997688 0.9899741 -0.9768086 0.9997688 0.9899741 -0.9776422 0.9997688 0.9899741 -0.9786968 0.9997688 0.9899741 -0.980031 0.9997688 0.9899741 -0.981719 0.9997688 0.9899741 -0.9838545 0.9997688 0.9899741 -0.9865561 0.9997688 0.9899741 -0.9899741 0.9997688 0.9899741 -0.9942982 0.9997688 0.9899741 -0.9997688 0.9997688 0.9899741 -0.9998174 0.9954731 0.989325 -0.9998557 0.9936849 0.9898295 -0.999886 0.993287 0.9908712 -0.9999099 0.9936128 0.9920999 -0.9999288 0.9942731 0.9933261 -0.9999437 0.9950481 0.9944556 -0.9790927 0.9998174 0.9893275 -0.9790927 0.9998174 0.9893275 -0.9790927 0.9998174 0.9893274 -0.9790926 0.9998174 0.9893274 -0.9790925 0.9998174 0.9893273 -0.9790925 0.9998174 0.9893272 -0.9790924 0.9998174 0.9893271 -0.9790923 0.9998174 0.989327 -0.9790921 0.9998174 0.9893269 -0.979092 0.9998174 0.9893267 -0.9790919 0.9998174 0.9893265 -0.9790917 0.9998174 0.9893262 -0.9790916 0.9998174 0.9893259 -0.9790916 0.9998174 0.9893256 -0.9790917 0.9998174 0.9893253 -0.9790921 0.9998174 0.9893251 -0.9790931 0.9998174 0.989325 -0.9790946 0.9998174 0.989325 -0.9790965 0.9998174 0.989325 -0.9790988 0.9998174 0.989325 -0.9791018 0.9998174 0.989325 -0.9791055 0.9998174 0.989325 -0.9791103 0.9998174 0.989325 -0.9791163 0.9998174 0.989325 -0.9791238 0.9998174 0.989325 -0.9791334 0.9998174 0.989325 -0.9791456 0.9998174 0.989325 -0.979161 0.9998174 0.989325 -0.9791804 0.9998174 0.989325 -0.979205 0.9998174 0.989325 -0.9792361 0.9998174 0.989325 -0.9792755 0.9998174 0.989325 -0.9793253 0.9998174 0.989325 -0.9793883 0.9998174 0.989325 -0.9794681 0.9998174 0.989325 -0.9795689 0.9998174 0.989325 -0.9796966 0.9998174 0.989325 -0.979858 0.9998174 0.989325 -0.9800622 0.9998174 0.989325 -0.9803206 0.9998174 0.989325 -0.9806476 0.9998174 0.989325 -0.9810611 0.9998174 0.989325 -0.9815844 0.9998174 0.989325 -0.9822464 0.9998174 0.989325 -0.9830838 0.9998174 0.989325 -0.9841433 0.9998174 0.989325 -0.9854838 0.9998174 0.989325 -0.9871796 0.9998174 0.989325 -0.989325 0.9998174 0.989325 -0.9920392 0.9998174 0.989325 -0.9954731 0.9998174 0.989325 -0.9998174 0.9998174 0.989325 -0.9998557 0.9964092 0.9898295 -0.999886 0.9949941 0.9908712 -0.9999099 0.9946818 0.9920999 -0.9999288 0.9949422 0.9933261 -0.9999437 0.9954668 0.9944556 -0.9834129 0.9998557 0.9898314 -0.9834129 0.9998557 0.9898314 -0.9834129 0.9998557 0.9898313 -0.9834129 0.9998557 0.9898313 -0.9834128 0.9998557 0.9898313 -0.9834128 0.9998557 0.9898312 -0.9834127 0.9998557 0.9898311 -0.9834127 0.9998557 0.989831 -0.9834126 0.9998557 0.9898309 -0.9834125 0.9998557 0.9898308 -0.9834124 0.9998557 0.9898306 -0.9834123 0.9998557 0.9898304 -0.9834122 0.9998557 0.9898302 -0.9834122 0.9998557 0.98983 -0.9834123 0.9998557 0.9898297 -0.9834126 0.9998557 0.9898295 -0.9834132 0.9998557 0.9898295 -0.9834141 0.9998557 0.9898295 -0.9834153 0.9998557 0.9898295 -0.9834167 0.9998557 0.9898295 -0.9834186 0.9998557 0.9898295 -0.9834209 0.9998557 0.9898295 -0.9834239 0.9998557 0.9898295 -0.9834277 0.9998557 0.9898295 -0.9834324 0.9998557 0.9898295 -0.9834385 0.9998557 0.9898295 -0.9834461 0.9998557 0.9898295 -0.9834557 0.9998557 0.9898295 -0.9834679 0.9998557 0.9898295 -0.9834833 0.9998557 0.9898295 -0.9835029 0.9998557 0.9898295 -0.9835276 0.9998557 0.9898295 -0.9835588 0.9998557 0.9898295 -0.9835983 0.9998557 0.9898295 -0.9836483 0.9998557 0.9898295 -0.9837116 0.9998557 0.9898295 -0.9837916 0.9998557 0.9898295 -0.9838928 0.9998557 0.9898295 -0.9840209 0.9998557 0.9898295 -0.9841829 0.9998557 0.9898295 -0.984388 0.9998557 0.9898295 -0.9846473 0.9998557 0.9898295 -0.9849754 0.9998557 0.9898295 -0.9853905 0.9998557 0.9898295 -0.9859157 0.9998557 0.9898295 -0.9865801 0.9998557 0.9898295 -0.9874207 0.9998557 0.9898295 -0.9884841 0.9998557 0.9898295 -0.9898295 0.9998557 0.9898295 -0.9915316 0.9998557 0.9898295 -0.9936849 0.9998557 0.9898295 -0.9964092 0.9998557 0.9898295 -0.9998557 0.9998557 0.9898295 -0.999886 0.9971537 0.9908712 -0.9999099 0.9960342 0.9920999 -0.9999288 0.9957887 0.9933261 -0.9999437 0.9959964 0.9944556 -0.9868505 0.999886 0.9908726 -0.9868505 0.999886 0.9908725 -0.9868505 0.999886 0.9908725 -0.9868505 0.999886 0.9908725 -0.9868504 0.999886 0.9908724 -0.9868504 0.999886 0.9908724 -0.9868504 0.999886 0.9908724 -0.9868503 0.999886 0.9908723 -0.9868503 0.999886 0.9908722 -0.9868502 0.999886 0.9908721 -0.9868502 0.999886 0.990872 -0.9868501 0.999886 0.9908718 -0.9868501 0.999886 0.9908717 -0.98685 0.999886 0.9908715 -0.9868501 0.999886 0.9908714 -0.9868503 0.999886 0.9908712 -0.9868507 0.999886 0.9908712 -0.9868512 0.999886 0.9908712 -0.986852 0.999886 0.9908712 -0.9868529 0.999886 0.9908712 -0.9868541 0.999886 0.9908712 -0.9868555 0.999886 0.9908712 -0.9868574 0.999886 0.9908712 -0.9868597 0.999886 0.9908712 -0.9868627 0.999886 0.9908712 -0.9868665 0.999886 0.9908712 -0.9868713 0.999886 0.9908712 -0.9868773 0.999886 0.9908712 -0.986885 0.999886 0.9908712 -0.9868946 0.999886 0.9908712 -0.9869069 0.999886 0.9908712 -0.9869223 0.999886 0.9908712 -0.9869419 0.999886 0.9908712 -0.9869667 0.999886 0.9908712 -0.986998 0.999886 0.9908712 -0.9870376 0.999886 0.9908712 -0.9870878 0.999886 0.9908712 -0.9871512 0.999886 0.9908712 -0.9872315 0.999886 0.9908712 -0.987333 0.999886 0.9908712 -0.9874615 0.999886 0.9908712 -0.987624 0.999886 0.9908712 -0.9878296 0.999886 0.9908712 -0.9880897 0.999886 0.9908712 -0.9884188 0.999886 0.9908712 -0.9888351 0.999886 0.9908712 -0.9893618 0.999886 0.9908712 -0.9900282 0.999886 0.9908712 -0.9908712 0.999886 0.9908712 -0.9919377 0.999886 0.9908712 -0.993287 0.999886 0.9908712 -0.9949941 0.999886 0.9908712 -0.9971537 0.999886 0.9908712 -0.999886 0.999886 0.9908712 -0.9999099 0.9977452 0.9920999 -0.9999288 0.9968597 0.9933261 -0.9999437 0.9966665 0.9944556 -0.989582 0.9999099 0.9921008 -0.989582 0.9999099 0.9921008 -0.989582 0.9999099 0.9921008 -0.989582 0.9999099 0.9921008 -0.989582 0.9999099 0.9921008 -0.9895819 0.9999099 0.9921007 -0.9895819 0.9999099 0.9921007 -0.9895819 0.9999099 0.9921006 -0.9895819 0.9999099 0.9921006 -0.9895818 0.9999099 0.9921005 -0.9895818 0.9999099 0.9921004 -0.9895818 0.9999099 0.9921003 -0.9895817 0.9999099 0.9921002 -0.9895817 0.9999099 0.9921001 -0.9895817 0.9999099 0.9921 -0.9895819 0.9999099 0.9920999 -0.9895821 0.9999099 0.9920999 -0.9895825 0.9999099 0.9920999 -0.9895829 0.9999099 0.9920999 -0.9895835 0.9999099 0.9920999 -0.9895842 0.9999099 0.9920999 -0.9895851 0.9999099 0.9920999 -0.9895863 0.9999099 0.9920999 -0.9895878 0.9999099 0.9920999 -0.9895897 0.9999099 0.9920999 -0.989592 0.9999099 0.9920999 -0.989595 0.9999099 0.9920999 -0.9895988 0.9999099 0.9920999 -0.9896036 0.9999099 0.9920999 -0.9896096 0.9999099 0.9920999 -0.9896173 0.9999099 0.9920999 -0.989627 0.9999099 0.9920999 -0.9896392 0.9999099 0.9920999 -0.9896547 0.9999099 0.9920999 -0.9896744 0.9999099 0.9920999 -0.9896992 0.9999099 0.9920999 -0.9897306 0.9999099 0.9920999 -0.9897703 0.9999099 0.9920999 -0.9898206 0.9999099 0.9920999 -0.9898842 0.9999099 0.9920999 -0.9899646 0.9999099 0.9920999 -0.9900664 0.9999099 0.9920999 -0.9901951 0.9999099 0.9920999 -0.990358 0.9999099 0.9920999 -0.9905641 0.9999099 0.9920999 -0.9908248 0.9999099 0.9920999 -0.9911547 0.9999099 0.9920999 -0.991572 0.9999099 0.9920999 -0.9920999 0.9999099 0.9920999 -0.9927678 0.9999099 0.9920999 -0.9936128 0.9999099 0.9920999 -0.9946818 0.9999099 0.9920999 -0.9960342 0.9999099 0.9920999 -0.9977452 0.9999099 0.9920999 -0.9999099 0.9999099 0.9920999 -0.9999288 0.9982146 0.9933261 -0.9999437 0.9975143 0.9944556 -0.9917501 0.9999288 0.9933267 -0.9917501 0.9999288 0.9933267 -0.9917501 0.9999288 0.9933267 -0.9917501 0.9999288 0.9933267 -0.9917501 0.9999288 0.9933267 -0.9917501 0.9999288 0.9933267 -0.99175 0.9999288 0.9933266 -0.99175 0.9999288 0.9933266 -0.99175 0.9999288 0.9933266 -0.99175 0.9999288 0.9933265 -0.99175 0.9999288 0.9933265 -0.9917499 0.9999288 0.9933264 -0.9917499 0.9999288 0.9933263 -0.9917499 0.9999288 0.9933263 -0.9917499 0.9999288 0.9933262 -0.99175 0.9999288 0.9933261 -0.9917502 0.9999288 0.9933261 -0.9917504 0.9999288 0.9933261 -0.9917507 0.9999288 0.9933261 -0.991751 0.9999288 0.9933261 -0.9917515 0.9999288 0.9933261 -0.9917521 0.9999288 0.9933261 -0.9917528 0.9999288 0.9933261 -0.9917537 0.9999288 0.9933261 -0.9917549 0.9999288 0.9933261 -0.9917564 0.9999288 0.9933261 -0.9917582 0.9999288 0.9933261 -0.9917606 0.9999288 0.9933261 -0.9917636 0.9999288 0.9933261 -0.9917674 0.9999288 0.9933261 -0.9917722 0.9999288 0.9933261 -0.9917782 0.9999288 0.9933261 -0.9917859 0.9999288 0.9933261 -0.9917956 0.9999288 0.9933261 -0.9918079 0.9999288 0.9933261 -0.9918234 0.9999288 0.9933261 -0.9918431 0.9999288 0.9933261 -0.991868 0.9999288 0.9933261 -0.9918994 0.9999288 0.9933261 -0.9919392 0.9999288 0.9933261 -0.9919896 0.9999288 0.9933261 -0.9920533 0.9999288 0.9933261 -0.9921339 0.9999288 0.9933261 -0.9922358 0.9999288 0.9933261 -0.9923648 0.9999288 0.9933261 -0.992528 0.9999288 0.9933261 -0.9927345 0.9999288 0.9933261 -0.9929957 0.9999288 0.9933261 -0.9933261 0.9999288 0.9933261 -0.9937442 0.9999288 0.9933261 -0.9942731 0.9999288 0.9933261 -0.9949422 0.9999288 0.9933261 -0.9957887 0.9999288 0.9933261 -0.9968597 0.9999288 0.9933261 -0.9982146 0.9999288 0.9933261 -0.9999288 0.9999288 0.9933261 -0.9999437 0.9985868 0.9944556 -0.9934695 0.9999437 0.994456 -0.9934695 0.9999437 0.994456 -0.9934695 0.9999437 0.994456 -0.9934695 0.9999437 0.994456 -0.9934695 0.9999437 0.994456 -0.9934695 0.9999437 0.994456 -0.9934695 0.9999437 0.9944559 -0.9934694 0.9999437 0.9944559 -0.9934694 0.9999437 0.9944559 -0.9934694 0.9999437 0.9944559 -0.9934694 0.9999437 0.9944558 -0.9934694 0.9999437 0.9944558 -0.9934694 0.9999437 0.9944557 -0.9934694 0.9999437 0.9944557 -0.9934694 0.9999437 0.9944556 -0.9934694 0.9999437 0.9944556 -0.9934695 0.9999437 0.9944556 -0.9934697 0.9999437 0.9944556 -0.9934698 0.9999437 0.9944556 -0.9934701 0.9999437 0.9944556 -0.9934704 0.9999437 0.9944556 -0.9934707 0.9999437 0.9944556 -0.9934712 0.9999437 0.9944556 -0.9934718 0.9999437 0.9944556 -0.9934725 0.9999437 0.9944556 -0.9934734 0.9999437 0.9944556 -0.9934746 0.9999437 0.9944556 -0.9934761 0.9999437 0.9944556 -0.9934779 0.9999437 0.9944556 -0.9934803 0.9999437 0.9944556 -0.9934833 0.9999437 0.9944556 -0.9934871 0.9999437 0.9944556 -0.9934919 0.9999437 0.9944556 -0.993498 0.9999437 0.9944556 -0.9935057 0.9999437 0.9944556 -0.9935154 0.9999437 0.9944556 -0.9935277 0.9999437 0.9944556 -0.9935432 0.9999437 0.9944556 -0.9935629 0.9999437 0.9944556 -0.9935878 0.9999437 0.9944556 -0.9936193 0.9999437 0.9944556 -0.9936592 0.9999437 0.9944556 -0.9937096 0.9999437 0.9944556 -0.9937734 0.9999437 0.9944556 -0.9938541 0.9999437 0.9944556 -0.9939562 0.9999437 0.9944556 -0.9940854 0.9999437 0.9944556 -0.9942488 0.9999437 0.9944556 -0.9944556 0.9999437 0.9944556 -0.9947172 0.9999437 0.9944556 -0.9950481 0.9999437 0.9944556 -0.9954668 0.9999437 0.9944556 -0.9959964 0.9999437 0.9944556 -0.9966665 0.9999437 0.9944556 -0.9975143 0.9999437 0.9944556 -0.9985868 0.9999437 0.9944556 -0.9999437 0.9999437 0.9944556 -0.9668873 0.9668873 0.9997074 -0.9668874 0.9668873 0.9997074 -0.9668875 0.9668873 0.9997074 -0.9668877 0.9668873 0.9997074 -0.9668878 0.9668873 0.9997074 -0.9668881 0.9668873 0.9997074 -0.9668883 0.9668873 0.9997074 -0.9668887 0.9668873 0.9997074 -0.9668891 0.9668873 0.9997074 -0.9668897 0.9668873 0.9997074 -0.9668904 0.9668873 0.9997074 -0.9668913 0.9668873 0.9997074 -0.9668925 0.9668873 0.9997074 -0.9668939 0.9668873 0.9997074 -0.9668957 0.9668873 0.9997074 -0.9668981 0.9668873 0.9997074 -0.966901 0.9668873 0.9997074 -0.9669047 0.9668873 0.9997074 -0.9669094 0.9668873 0.9997074 -0.9669153 0.9668873 0.9997074 -0.9669228 0.9668873 0.9997074 -0.9669323 0.9668873 0.9997074 -0.9669443 0.9668873 0.9997074 -0.9669595 0.9668873 0.9997074 -0.9669788 0.9668873 0.9997074 -0.9670031 0.9668873 0.9997074 -0.9670339 0.9668873 0.9997074 -0.9670729 0.9668873 0.9997074 -0.9671221 0.9668873 0.9997074 -0.9671845 0.9668873 0.9997074 -0.9672633 0.9668873 0.9997074 -0.9673631 0.9668873 0.9997074 -0.9674893 0.9668873 0.9997074 -0.967649 0.9668873 0.9997074 -0.9678511 0.9668873 0.9997074 -0.9681067 0.9668873 0.9997074 -0.9684301 0.9668873 0.9997074 -0.9688392 0.9668873 0.9997074 -0.9693568 0.9668873 0.9997074 -0.9700116 0.9668873 0.9997074 -0.97084 0.9668873 0.9997074 -0.9718881 0.9668873 0.9997074 -0.973214 0.9668873 0.9997074 -0.9748915 0.9668873 0.9997074 -0.9770137 0.9668873 0.9997074 -0.9796986 0.9668873 0.9997074 -0.9830954 0.9668873 0.9997074 -0.9873927 0.9668873 0.9997074 -0.9928293 0.9668873 0.9997074 -0.9997074 0.9668873 0.9997074 -0.9997689 0.9736726 0.9942999 -0.9998174 0.9790927 0.9920411 -0.9998557 0.9834129 0.9915331 -0.999886 0.9868505 0.9919389 -0.9999099 0.989582 0.9927686 -0.9999288 0.9917501 0.9937448 -0.9999437 0.9934695 0.9947176 -0.9668873 0.9668874 0.9997074 -0.9668872 0.9668872 0.9997074 -0.9668874 0.9668872 0.9997074 -0.9668875 0.9668872 0.9997074 -0.9668877 0.9668872 0.9997074 -0.9668879 0.9668872 0.9997074 -0.9668882 0.9668872 0.9997074 -0.9668885 0.9668872 0.9997074 -0.966889 0.9668872 0.9997074 -0.9668895 0.9668872 0.9997074 -0.9668902 0.9668872 0.9997074 -0.9668911 0.9668872 0.9997074 -0.9668923 0.9668872 0.9997074 -0.9668937 0.9668872 0.9997074 -0.9668956 0.9668872 0.9997074 -0.9668979 0.9668872 0.9997074 -0.9669008 0.9668872 0.9997074 -0.9669045 0.9668872 0.9997074 -0.9669092 0.9668872 0.9997074 -0.9669152 0.9668872 0.9997074 -0.9669227 0.9668872 0.9997074 -0.9669322 0.9668872 0.9997074 -0.9669442 0.9668872 0.9997074 -0.9669594 0.9668872 0.9997074 -0.9669786 0.9668872 0.9997074 -0.967003 0.9668872 0.9997074 -0.9670337 0.9668872 0.9997074 -0.9670727 0.9668872 0.9997074 -0.967122 0.9668872 0.9997074 -0.9671843 0.9668872 0.9997074 -0.9672632 0.9668872 0.9997074 -0.9673629 0.9668872 0.9997074 -0.9674892 0.9668872 0.9997074 -0.9676489 0.9668872 0.9997074 -0.9678509 0.9668872 0.9997074 -0.9681065 0.9668872 0.9997074 -0.9684299 0.9668872 0.9997074 -0.968839 0.9668872 0.9997074 -0.9693566 0.9668872 0.9997074 -0.9700114 0.9668872 0.9997074 -0.9708399 0.9668872 0.9997074 -0.9718879 0.9668872 0.9997074 -0.9732139 0.9668872 0.9997074 -0.9748914 0.9668872 0.9997074 -0.9770136 0.9668872 0.9997074 -0.9796985 0.9668872 0.9997074 -0.9830953 0.9668872 0.9997074 -0.9873926 0.9668872 0.9997074 -0.9928293 0.9668872 0.9997074 -0.9997074 0.9668872 0.9997074 -0.9997689 0.9736726 0.9942999 -0.9998174 0.9790927 0.9920411 -0.9998557 0.9834129 0.9915331 -0.999886 0.9868505 0.9919389 -0.9999099 0.989582 0.9927686 -0.9999288 0.9917501 0.9937448 -0.9999437 0.9934695 0.9947176 -0.9668873 0.9668875 0.9997074 -0.9668872 0.9668874 0.9997074 -0.9668871 0.9668871 0.9997074 -0.9668873 0.9668871 0.9997074 -0.9668875 0.9668871 0.9997074 -0.9668877 0.9668871 0.9997074 -0.966888 0.9668871 0.9997074 -0.9668883 0.9668871 0.9997074 -0.9668888 0.9668871 0.9997074 -0.9668893 0.9668871 0.9997074 -0.96689 0.9668871 0.9997074 -0.9668909 0.9668871 0.9997074 -0.9668921 0.9668871 0.9997074 -0.9668935 0.9668871 0.9997074 -0.9668954 0.9668871 0.9997074 -0.9668977 0.9668871 0.9997074 -0.9669006 0.9668871 0.9997074 -0.9669043 0.9668871 0.9997074 -0.966909 0.9668871 0.9997074 -0.9669149 0.9668871 0.9997074 -0.9669225 0.9668871 0.9997074 -0.966932 0.9668871 0.9997074 -0.966944 0.9668871 0.9997074 -0.9669592 0.9668871 0.9997074 -0.9669784 0.9668871 0.9997074 -0.9670027 0.9668871 0.9997074 -0.9670335 0.9668871 0.9997074 -0.9670725 0.9668871 0.9997074 -0.9671218 0.9668871 0.9997074 -0.9671841 0.9668871 0.9997074 -0.967263 0.9668871 0.9997074 -0.9673627 0.9668871 0.9997074 -0.967489 0.9668871 0.9997074 -0.9676487 0.9668871 0.9997074 -0.9678507 0.9668871 0.9997074 -0.9681063 0.9668871 0.9997074 -0.9684297 0.9668871 0.9997074 -0.9688388 0.9668871 0.9997074 -0.9693564 0.9668871 0.9997074 -0.9700112 0.9668871 0.9997074 -0.9708397 0.9668871 0.9997074 -0.9718878 0.9668871 0.9997074 -0.9732137 0.9668871 0.9997074 -0.9748912 0.9668871 0.9997074 -0.9770135 0.9668871 0.9997074 -0.9796984 0.9668871 0.9997074 -0.9830952 0.9668871 0.9997074 -0.9873925 0.9668871 0.9997074 -0.9928293 0.9668871 0.9997074 -0.9997074 0.9668871 0.9997074 -0.9997689 0.9736725 0.9942999 -0.9998174 0.9790927 0.9920411 -0.9998557 0.9834129 0.9915331 -0.999886 0.9868505 0.9919389 -0.9999099 0.989582 0.9927686 -0.9999288 0.9917501 0.9937447 -0.9999437 0.9934695 0.9947175 -0.9668873 0.9668877 0.9997074 -0.9668872 0.9668875 0.9997074 -0.9668871 0.9668873 0.9997074 -0.966887 0.966887 0.9997074 -0.9668872 0.966887 0.9997074 -0.9668874 0.966887 0.9997074 -0.9668877 0.966887 0.9997074 -0.966888 0.966887 0.9997074 -0.9668885 0.966887 0.9997074 -0.9668891 0.966887 0.9997074 -0.9668898 0.966887 0.9997074 -0.9668907 0.966887 0.9997074 -0.9668918 0.966887 0.9997074 -0.9668933 0.966887 0.9997074 -0.9668951 0.966887 0.9997074 -0.9668974 0.966887 0.9997074 -0.9669003 0.966887 0.9997074 -0.9669041 0.966887 0.9997074 -0.9669087 0.966887 0.9997074 -0.9669147 0.966887 0.9997074 -0.9669222 0.966887 0.9997074 -0.9669317 0.966887 0.9997074 -0.9669437 0.966887 0.9997074 -0.9669589 0.966887 0.9997074 -0.9669781 0.966887 0.9997074 -0.9670025 0.966887 0.9997074 -0.9670333 0.966887 0.9997074 -0.9670722 0.966887 0.9997074 -0.9671215 0.966887 0.9997074 -0.9671838 0.966887 0.9997074 -0.9672627 0.966887 0.9997074 -0.9673625 0.966887 0.9997074 -0.9674887 0.966887 0.9997074 -0.9676484 0.966887 0.9997074 -0.9678505 0.966887 0.9997074 -0.9681061 0.966887 0.9997074 -0.9684295 0.966887 0.9997074 -0.9688386 0.966887 0.9997074 -0.9693562 0.966887 0.9997074 -0.970011 0.966887 0.9997074 -0.9708394 0.966887 0.9997074 -0.9718875 0.966887 0.9997074 -0.9732135 0.966887 0.9997074 -0.974891 0.966887 0.9997074 -0.9770133 0.966887 0.9997074 -0.9796982 0.966887 0.9997074 -0.983095 0.966887 0.9997074 -0.9873924 0.966887 0.9997074 -0.9928292 0.966887 0.9997074 -0.9997074 0.966887 0.9997074 -0.9997689 0.9736724 0.9942998 -0.9998174 0.9790926 0.992041 -0.9998557 0.9834129 0.9915331 -0.999886 0.9868505 0.9919389 -0.9999099 0.989582 0.9927686 -0.9999288 0.9917501 0.9937447 -0.9999437 0.9934695 0.9947175 -0.9668873 0.9668878 0.9997074 -0.9668872 0.9668877 0.9997074 -0.9668871 0.9668875 0.9997074 -0.966887 0.9668872 0.9997074 -0.9668869 0.9668869 0.9997074 -0.9668871 0.9668869 0.9997074 -0.9668874 0.9668869 0.9997074 -0.9668877 0.9668869 0.9997074 -0.9668882 0.9668869 0.9997074 -0.9668887 0.9668869 0.9997074 -0.9668894 0.9668869 0.9997074 -0.9668904 0.9668869 0.9997074 -0.9668915 0.9668869 0.9997074 -0.9668929 0.9668869 0.9997074 -0.9668948 0.9668869 0.9997074 -0.9668971 0.9668869 0.9997074 -0.9669 0.9668869 0.9997074 -0.9669037 0.9668869 0.9997074 -0.9669084 0.9668869 0.9997074 -0.9669144 0.9668869 0.9997074 -0.9669219 0.9668869 0.9997074 -0.9669314 0.9668869 0.9997074 -0.9669434 0.9668869 0.9997074 -0.9669586 0.9668869 0.9997074 -0.9669778 0.9668869 0.9997074 -0.9670022 0.9668869 0.9997074 -0.9670329 0.9668869 0.9997074 -0.9670719 0.9668869 0.9997074 -0.9671212 0.9668869 0.9997074 -0.9671835 0.9668869 0.9997074 -0.9672624 0.9668869 0.9997074 -0.9673622 0.9668869 0.9997074 -0.9674884 0.9668869 0.9997074 -0.9676481 0.9668869 0.9997074 -0.9678502 0.9668869 0.9997074 -0.9681058 0.9668869 0.9997074 -0.9684292 0.9668869 0.9997074 -0.9688383 0.9668869 0.9997074 -0.9693559 0.9668869 0.9997074 -0.9700107 0.9668869 0.9997074 -0.9708392 0.9668869 0.9997074 -0.9718873 0.9668869 0.9997074 -0.9732132 0.9668869 0.9997074 -0.9748908 0.9668869 0.9997074 -0.977013 0.9668869 0.9997074 -0.979698 0.9668869 0.9997074 -0.9830949 0.9668869 0.9997074 -0.9873923 0.9668869 0.9997074 -0.9928291 0.9668869 0.9997074 -0.9997074 0.9668869 0.9997074 -0.9997689 0.9736723 0.9942998 -0.9998174 0.9790925 0.992041 -0.9998557 0.9834128 0.991533 -0.999886 0.9868504 0.9919388 -0.9999099 0.989582 0.9927686 -0.9999288 0.9917501 0.9937447 -0.9999437 0.9934695 0.9947175 -0.9668873 0.9668881 0.9997074 -0.9668872 0.9668879 0.9997074 -0.9668871 0.9668877 0.9997074 -0.966887 0.9668874 0.9997074 -0.9668869 0.9668871 0.9997074 -0.9668867 0.9668867 0.9997074 -0.966887 0.9668867 0.9997074 -0.9668873 0.9668867 0.9997074 -0.9668878 0.9668867 0.9997074 -0.9668883 0.9668867 0.9997074 -0.966889 0.9668867 0.9997074 -0.9668899 0.9668867 0.9997074 -0.9668911 0.9668867 0.9997074 -0.9668925 0.9668867 0.9997074 -0.9668944 0.9668867 0.9997074 -0.9668967 0.9668867 0.9997074 -0.9668996 0.9668867 0.9997074 -0.9669033 0.9668867 0.9997074 -0.966908 0.9668867 0.9997074 -0.966914 0.9668867 0.9997074 -0.9669215 0.9668867 0.9997074 -0.966931 0.9668867 0.9997074 -0.966943 0.9668867 0.9997074 -0.9669582 0.9668867 0.9997074 -0.9669774 0.9668867 0.9997074 -0.9670018 0.9668867 0.9997074 -0.9670325 0.9668867 0.9997074 -0.9670715 0.9668867 0.9997074 -0.9671208 0.9668867 0.9997074 -0.9671831 0.9668867 0.9997074 -0.967262 0.9668867 0.9997074 -0.9673618 0.9668867 0.9997074 -0.967488 0.9668867 0.9997074 -0.9676477 0.9668867 0.9997074 -0.9678498 0.9668867 0.9997074 -0.9681054 0.9668867 0.9997074 -0.9684288 0.9668867 0.9997074 -0.9688379 0.9668867 0.9997074 -0.9693555 0.9668867 0.9997074 -0.9700103 0.9668867 0.9997074 -0.9708388 0.9668867 0.9997074 -0.9718869 0.9668867 0.9997074 -0.9732129 0.9668867 0.9997074 -0.9748904 0.9668867 0.9997074 -0.9770128 0.9668867 0.9997074 -0.9796978 0.9668867 0.9997074 -0.9830947 0.9668867 0.9997074 -0.9873922 0.9668867 0.9997074 -0.9928291 0.9668867 0.9997074 -0.9997074 0.9668867 0.9997074 -0.9997689 0.9736722 0.9942997 -0.9998174 0.9790925 0.9920409 -0.9998557 0.9834128 0.991533 -0.999886 0.9868504 0.9919388 -0.9999099 0.9895819 0.9927686 -0.9999288 0.9917501 0.9937447 -0.9999437 0.9934695 0.9947175 -0.9668873 0.9668883 0.9997074 -0.9668872 0.9668882 0.9997074 -0.9668871 0.966888 0.9997074 -0.966887 0.9668877 0.9997074 -0.9668869 0.9668874 0.9997074 -0.9668867 0.966887 0.9997074 -0.9668865 0.9668865 0.9997074 -0.9668868 0.9668865 0.9997074 -0.9668873 0.9668865 0.9997074 -0.9668878 0.9668865 0.9997074 -0.9668885 0.9668865 0.9997074 -0.9668894 0.9668865 0.9997074 -0.9668906 0.9668865 0.9997074 -0.966892 0.9668865 0.9997074 -0.9668939 0.9668865 0.9997074 -0.9668962 0.9668865 0.9997074 -0.9668991 0.9668865 0.9997074 -0.9669028 0.9668865 0.9997074 -0.9669075 0.9668865 0.9997074 -0.9669135 0.9668865 0.9997074 -0.966921 0.9668865 0.9997074 -0.9669305 0.9668865 0.9997074 -0.9669425 0.9668865 0.9997074 -0.9669577 0.9668865 0.9997074 -0.9669769 0.9668865 0.9997074 -0.9670013 0.9668865 0.9997074 -0.967032 0.9668865 0.9997074 -0.967071 0.9668865 0.9997074 -0.9671203 0.9668865 0.9997074 -0.9671826 0.9668865 0.9997074 -0.9672615 0.9668865 0.9997074 -0.9673613 0.9668865 0.9997074 -0.9674875 0.9668865 0.9997074 -0.9676472 0.9668865 0.9997074 -0.9678493 0.9668865 0.9997074 -0.9681049 0.9668865 0.9997074 -0.9684283 0.9668865 0.9997074 -0.9688374 0.9668865 0.9997074 -0.969355 0.9668865 0.9997074 -0.9700099 0.9668865 0.9997074 -0.9708384 0.9668865 0.9997074 -0.9718865 0.9668865 0.9997074 -0.9732125 0.9668865 0.9997074 -0.9748901 0.9668865 0.9997074 -0.9770124 0.9668865 0.9997074 -0.9796975 0.9668865 0.9997074 -0.9830944 0.9668865 0.9997074 -0.987392 0.9668865 0.9997074 -0.9928289 0.9668865 0.9997074 -0.9997074 0.9668865 0.9997074 -0.9997689 0.9736721 0.9942997 -0.9998174 0.9790924 0.9920408 -0.9998557 0.9834127 0.9915329 -0.999886 0.9868504 0.9919388 -0.9999099 0.9895819 0.9927685 -0.9999288 0.99175 0.9937447 -0.9999437 0.9934695 0.9947175 -0.9668873 0.9668887 0.9997074 -0.9668872 0.9668885 0.9997074 -0.9668871 0.9668883 0.9997074 -0.966887 0.966888 0.9997074 -0.9668869 0.9668877 0.9997074 -0.9668867 0.9668873 0.9997074 -0.9668865 0.9668868 0.9997074 -0.9668862 0.9668862 0.9997074 -0.9668866 0.9668862 0.9997074 -0.9668872 0.9668862 0.9997074 -0.9668879 0.9668862 0.9997074 -0.9668888 0.9668862 0.9997074 -0.96689 0.9668862 0.9997074 -0.9668914 0.9668862 0.9997074 -0.9668932 0.9668862 0.9997074 -0.9668956 0.9668862 0.9997074 -0.9668985 0.9668862 0.9997074 -0.9669022 0.9668862 0.9997074 -0.9669069 0.9668862 0.9997074 -0.9669128 0.9668862 0.9997074 -0.9669203 0.9668862 0.9997074 -0.9669298 0.9668862 0.9997074 -0.9669419 0.9668862 0.9997074 -0.9669571 0.9668862 0.9997074 -0.9669763 0.9668862 0.9997074 -0.9670006 0.9668862 0.9997074 -0.9670314 0.9668862 0.9997074 -0.9670704 0.9668862 0.9997074 -0.9671197 0.9668862 0.9997074 -0.967182 0.9668862 0.9997074 -0.9672609 0.9668862 0.9997074 -0.9673607 0.9668862 0.9997074 -0.9674869 0.9668862 0.9997074 -0.9676466 0.9668862 0.9997074 -0.9678487 0.9668862 0.9997074 -0.9681043 0.9668862 0.9997074 -0.9684277 0.9668862 0.9997074 -0.9688368 0.9668862 0.9997074 -0.9693545 0.9668862 0.9997074 -0.9700093 0.9668862 0.9997074 -0.9708378 0.9668862 0.9997074 -0.971886 0.9668862 0.9997074 -0.973212 0.9668862 0.9997074 -0.9748896 0.9668862 0.9997074 -0.977012 0.9668862 0.9997074 -0.9796971 0.9668862 0.9997074 -0.9830941 0.9668862 0.9997074 -0.9873917 0.9668862 0.9997074 -0.9928288 0.9668862 0.9997074 -0.9997074 0.9668862 0.9997074 -0.9997689 0.9736719 0.9942996 -0.9998174 0.9790923 0.9920407 -0.9998557 0.9834127 0.9915328 -0.999886 0.9868503 0.9919387 -0.9999099 0.9895819 0.9927685 -0.9999288 0.99175 0.9937446 -0.9999437 0.9934694 0.9947175 -0.9668873 0.9668891 0.9997074 -0.9668872 0.966889 0.9997074 -0.9668871 0.9668888 0.9997074 -0.966887 0.9668885 0.9997074 -0.9668869 0.9668882 0.9997074 -0.9668867 0.9668878 0.9997074 -0.9668865 0.9668873 0.9997074 -0.9668862 0.9668866 0.9997074 -0.9668859 0.9668859 0.9997074 -0.9668864 0.9668859 0.9997074 -0.9668872 0.9668859 0.9997074 -0.9668881 0.9668859 0.9997074 -0.9668892 0.9668859 0.9997074 -0.9668907 0.9668859 0.9997074 -0.9668925 0.9668859 0.9997074 -0.9668948 0.9668859 0.9997074 -0.9668977 0.9668859 0.9997074 -0.9669014 0.9668859 0.9997074 -0.9669061 0.9668859 0.9997074 -0.9669121 0.9668859 0.9997074 -0.9669196 0.9668859 0.9997074 -0.9669291 0.9668859 0.9997074 -0.9669411 0.9668859 0.9997074 -0.9669563 0.9668859 0.9997074 -0.9669755 0.9668859 0.9997074 -0.9669999 0.9668859 0.9997074 -0.9670307 0.9668859 0.9997074 -0.9670696 0.9668859 0.9997074 -0.9671189 0.9668859 0.9997074 -0.9671812 0.9668859 0.9997074 -0.9672601 0.9668859 0.9997074 -0.9673599 0.9668859 0.9997074 -0.9674862 0.9668859 0.9997074 -0.9676459 0.9668859 0.9997074 -0.9678479 0.9668859 0.9997074 -0.9681036 0.9668859 0.9997074 -0.968427 0.9668859 0.9997074 -0.9688361 0.9668859 0.9997074 -0.9693538 0.9668859 0.9997074 -0.9700086 0.9668859 0.9997074 -0.9708371 0.9668859 0.9997074 -0.9718853 0.9668859 0.9997074 -0.9732114 0.9668859 0.9997074 -0.974889 0.9668859 0.9997074 -0.9770115 0.9668859 0.9997074 -0.9796966 0.9668859 0.9997074 -0.9830937 0.9668859 0.9997074 -0.9873914 0.9668859 0.9997074 -0.9928287 0.9668859 0.9997074 -0.9997074 0.9668859 0.9997074 -0.9997689 0.9736717 0.9942995 -0.9998174 0.9790921 0.9920406 -0.9998557 0.9834126 0.9915327 -0.999886 0.9868503 0.9919386 -0.9999099 0.9895819 0.9927684 -0.9999288 0.99175 0.9937446 -0.9999437 0.9934694 0.9947175 -0.9668873 0.9668897 0.9997074 -0.9668872 0.9668895 0.9997074 -0.9668871 0.9668893 0.9997074 -0.966887 0.9668891 0.9997074 -0.9668869 0.9668887 0.9997074 -0.9668867 0.9668883 0.9997074 -0.9668865 0.9668878 0.9997074 -0.9668862 0.9668872 0.9997074 -0.9668859 0.9668864 0.9997074 -0.9668855 0.9668855 0.9997074 -0.9668862 0.9668855 0.9997074 -0.9668872 0.9668855 0.9997074 -0.9668883 0.9668855 0.9997074 -0.9668897 0.9668855 0.9997074 -0.9668916 0.9668855 0.9997074 -0.9668939 0.9668855 0.9997074 -0.9668968 0.9668855 0.9997074 -0.9669005 0.9668855 0.9997074 -0.9669052 0.9668855 0.9997074 -0.9669112 0.9668855 0.9997074 -0.9669187 0.9668855 0.9997074 -0.9669282 0.9668855 0.9997074 -0.9669402 0.9668855 0.9997074 -0.9669554 0.9668855 0.9997074 -0.9669746 0.9668855 0.9997074 -0.966999 0.9668855 0.9997074 -0.9670298 0.9668855 0.9997074 -0.9670687 0.9668855 0.9997074 -0.967118 0.9668855 0.9997074 -0.9671803 0.9668855 0.9997074 -0.9672592 0.9668855 0.9997074 -0.967359 0.9668855 0.9997074 -0.9674853 0.9668855 0.9997074 -0.967645 0.9668855 0.9997074 -0.967847 0.9668855 0.9997074 -0.9681027 0.9668855 0.9997074 -0.9684261 0.9668855 0.9997074 -0.9688353 0.9668855 0.9997074 -0.9693529 0.9668855 0.9997074 -0.9700078 0.9668855 0.9997074 -0.9708363 0.9668855 0.9997074 -0.9718845 0.9668855 0.9997074 -0.9732106 0.9668855 0.9997074 -0.9748883 0.9668855 0.9997074 -0.9770108 0.9668855 0.9997074 -0.9796961 0.9668855 0.9997074 -0.9830932 0.9668855 0.9997074 -0.9873911 0.9668855 0.9997074 -0.9928285 0.9668855 0.9997074 -0.9997074 0.9668855 0.9997074 -0.9997689 0.9736715 0.9942993 -0.9998174 0.979092 0.9920405 -0.9998557 0.9834125 0.9915326 -0.999886 0.9868502 0.9919385 -0.9999099 0.9895818 0.9927684 -0.9999288 0.99175 0.9937446 -0.9999437 0.9934694 0.9947174 -0.9668873 0.9668904 0.9997074 -0.9668872 0.9668902 0.9997074 -0.9668871 0.96689 0.9997074 -0.966887 0.9668898 0.9997074 -0.9668869 0.9668894 0.9997074 -0.9668867 0.966889 0.9997074 -0.9668865 0.9668885 0.9997074 -0.9668862 0.9668879 0.9997074 -0.9668859 0.9668872 0.9997074 -0.9668855 0.9668862 0.9997074 -0.9668852 0.9668852 0.9997074 -0.9668861 0.9668852 0.9997074 -0.9668872 0.9668852 0.9997074 -0.9668887 0.9668852 0.9997074 -0.9668905 0.9668852 0.9997074 -0.9668928 0.9668852 0.9997074 -0.9668957 0.9668852 0.9997074 -0.9668994 0.9668852 0.9997074 -0.9669041 0.9668852 0.9997074 -0.9669101 0.9668852 0.9997074 -0.9669176 0.9668852 0.9997074 -0.9669271 0.9668852 0.9997074 -0.9669391 0.9668852 0.9997074 -0.9669543 0.9668852 0.9997074 -0.9669735 0.9668852 0.9997074 -0.9669979 0.9668852 0.9997074 -0.9670287 0.9668852 0.9997074 -0.9670676 0.9668852 0.9997074 -0.9671169 0.9668852 0.9997074 -0.9671793 0.9668852 0.9997074 -0.9672581 0.9668852 0.9997074 -0.9673579 0.9668852 0.9997074 -0.9674842 0.9668852 0.9997074 -0.9676439 0.9668852 0.9997074 -0.967846 0.9668852 0.9997074 -0.9681016 0.9668852 0.9997074 -0.9684251 0.9668852 0.9997074 -0.9688342 0.9668852 0.9997074 -0.9693519 0.9668852 0.9997074 -0.9700068 0.9668852 0.9997074 -0.9708354 0.9668852 0.9997074 -0.9718836 0.9668852 0.9997074 -0.9732098 0.9668852 0.9997074 -0.9748875 0.9668852 0.9997074 -0.9770101 0.9668852 0.9997074 -0.9796954 0.9668852 0.9997074 -0.9830927 0.9668852 0.9997074 -0.9873907 0.9668852 0.9997074 -0.9928282 0.9668852 0.9997074 -0.9997074 0.9668852 0.9997074 -0.9997689 0.9736712 0.9942992 -0.9998174 0.9790919 0.9920403 -0.9998557 0.9834124 0.9915325 -0.999886 0.9868502 0.9919384 -0.9999099 0.9895818 0.9927683 -0.9999288 0.99175 0.9937445 -0.9999437 0.9934694 0.9947174 -0.9668873 0.9668913 0.9997074 -0.9668872 0.9668911 0.9997074 -0.9668871 0.9668909 0.9997074 -0.966887 0.9668907 0.9997074 -0.9668869 0.9668904 0.9997074 -0.9668867 0.9668899 0.9997074 -0.9668865 0.9668894 0.9997074 -0.9668862 0.9668888 0.9997074 -0.9668859 0.9668881 0.9997074 -0.9668855 0.9668872 0.9997074 -0.9668852 0.9668861 0.9997074 -0.9668848 0.9668848 0.9997074 -0.9668859 0.9668848 0.9997074 -0.9668874 0.9668848 0.9997074 -0.9668892 0.9668848 0.9997074 -0.9668915 0.9668848 0.9997074 -0.9668945 0.9668848 0.9997074 -0.9668982 0.9668848 0.9997074 -0.9669029 0.9668848 0.9997074 -0.9669088 0.9668848 0.9997074 -0.9669163 0.9668848 0.9997074 -0.9669258 0.9668848 0.9997074 -0.9669378 0.9668848 0.9997074 -0.966953 0.9668848 0.9997074 -0.9669723 0.9668848 0.9997074 -0.9669966 0.9668848 0.9997074 -0.9670274 0.9668848 0.9997074 -0.9670664 0.9668848 0.9997074 -0.9671156 0.9668848 0.9997074 -0.967178 0.9668848 0.9997074 -0.9672569 0.9668848 0.9997074 -0.9673567 0.9668848 0.9997074 -0.9674829 0.9668848 0.9997074 -0.9676427 0.9668848 0.9997074 -0.9678448 0.9668848 0.9997074 -0.9681004 0.9668848 0.9997074 -0.9684239 0.9668848 0.9997074 -0.968833 0.9668848 0.9997074 -0.9693507 0.9668848 0.9997074 -0.9700057 0.9668848 0.9997074 -0.9708343 0.9668848 0.9997074 -0.9718825 0.9668848 0.9997074 -0.9732087 0.9668848 0.9997074 -0.9748865 0.9668848 0.9997074 -0.9770092 0.9668848 0.9997074 -0.9796946 0.9668848 0.9997074 -0.983092 0.9668848 0.9997074 -0.9873902 0.9668848 0.9997074 -0.992828 0.9668848 0.9997074 -0.9997074 0.9668848 0.9997074 -0.9997689 0.973671 0.994299 -0.9998174 0.9790917 0.9920401 -0.9998557 0.9834123 0.9915323 -0.999886 0.9868501 0.9919383 -0.9999099 0.9895818 0.9927682 -0.9999288 0.9917499 0.9937445 -0.9999437 0.9934694 0.9947174 -0.9668873 0.9668925 0.9997074 -0.9668872 0.9668923 0.9997074 -0.9668871 0.9668921 0.9997074 -0.966887 0.9668918 0.9997074 -0.9668869 0.9668915 0.9997074 -0.9668867 0.9668911 0.9997074 -0.9668865 0.9668906 0.9997074 -0.9668862 0.96689 0.9997074 -0.9668859 0.9668892 0.9997074 -0.9668855 0.9668883 0.9997074 -0.9668852 0.9668872 0.9997074 -0.9668848 0.9668859 0.9997074 -0.9668845 0.9668845 0.9997074 -0.9668859 0.9668845 0.9997074 -0.9668878 0.9668845 0.9997074 -0.9668901 0.9668845 0.9997074 -0.966893 0.9668845 0.9997074 -0.9668967 0.9668845 0.9997074 -0.9669014 0.9668845 0.9997074 -0.9669074 0.9668845 0.9997074 -0.9669149 0.9668845 0.9997074 -0.9669244 0.9668845 0.9997074 -0.9669364 0.9668845 0.9997074 -0.9669516 0.9668845 0.9997074 -0.9669708 0.9668845 0.9997074 -0.9669952 0.9668845 0.9997074 -0.967026 0.9668845 0.9997074 -0.9670649 0.9668845 0.9997074 -0.9671142 0.9668845 0.9997074 -0.9671766 0.9668845 0.9997074 -0.9672555 0.9668845 0.9997074 -0.9673553 0.9668845 0.9997074 -0.9674815 0.9668845 0.9997074 -0.9676413 0.9668845 0.9997074 -0.9678434 0.9668845 0.9997074 -0.968099 0.9668845 0.9997074 -0.9684225 0.9668845 0.9997074 -0.9688317 0.9668845 0.9997074 -0.9693494 0.9668845 0.9997074 -0.9700044 0.9668845 0.9997074 -0.970833 0.9668845 0.9997074 -0.9718813 0.9668845 0.9997074 -0.9732076 0.9668845 0.9997074 -0.9748855 0.9668845 0.9997074 -0.9770082 0.9668845 0.9997074 -0.9796937 0.9668845 0.9997074 -0.9830913 0.9668845 0.9997074 -0.9873897 0.9668845 0.9997074 -0.9928276 0.9668845 0.9997074 -0.9997074 0.9668845 0.9997074 -0.9997689 0.9736708 0.9942988 -0.9998174 0.9790916 0.9920399 -0.9998557 0.9834122 0.9915321 -0.999886 0.9868501 0.9919382 -0.9999099 0.9895817 0.9927681 -0.9999288 0.9917499 0.9937444 -0.9999437 0.9934694 0.9947173 -0.9668873 0.9668939 0.9997074 -0.9668872 0.9668937 0.9997074 -0.9668871 0.9668935 0.9997074 -0.966887 0.9668933 0.9997074 -0.9668869 0.9668929 0.9997074 -0.9668867 0.9668925 0.9997074 -0.9668865 0.966892 0.9997074 -0.9668862 0.9668914 0.9997074 -0.9668859 0.9668907 0.9997074 -0.9668855 0.9668897 0.9997074 -0.9668852 0.9668887 0.9997074 -0.9668848 0.9668874 0.9997074 -0.9668845 0.9668859 0.9997074 -0.9668844 0.9668844 0.9997074 -0.9668862 0.9668844 0.9997074 -0.9668886 0.9668844 0.9997074 -0.9668915 0.9668844 0.9997074 -0.9668952 0.9668844 0.9997074 -0.9668999 0.9668844 0.9997074 -0.9669058 0.9668844 0.9997074 -0.9669133 0.9668844 0.9997074 -0.9669228 0.9668844 0.9997074 -0.9669349 0.9668844 0.9997074 -0.9669501 0.9668844 0.9997074 -0.9669693 0.9668844 0.9997074 -0.9669937 0.9668844 0.9997074 -0.9670245 0.9668844 0.9997074 -0.9670634 0.9668844 0.9997074 -0.9671127 0.9668844 0.9997074 -0.9671751 0.9668844 0.9997074 -0.9672539 0.9668844 0.9997074 -0.9673538 0.9668844 0.9997074 -0.96748 0.9668844 0.9997074 -0.9676398 0.9668844 0.9997074 -0.9678419 0.9668844 0.9997074 -0.9680976 0.9668844 0.9997074 -0.968421 0.9668844 0.9997074 -0.9688303 0.9668844 0.9997074 -0.969348 0.9668844 0.9997074 -0.970003 0.9668844 0.9997074 -0.9708317 0.9668844 0.9997074 -0.97188 0.9668844 0.9997074 -0.9732063 0.9668844 0.9997074 -0.9748843 0.9668844 0.9997074 -0.9770071 0.9668844 0.9997074 -0.9796928 0.9668844 0.9997074 -0.9830905 0.9668844 0.9997074 -0.9873891 0.9668844 0.9997074 -0.9928273 0.9668844 0.9997074 -0.9997074 0.9668844 0.9997074 -0.9997689 0.9736708 0.9942986 -0.9998174 0.9790916 0.9920397 -0.9998557 0.9834122 0.9915319 -0.999886 0.98685 0.991938 -0.9999099 0.9895817 0.992768 -0.9999288 0.9917499 0.9937443 -0.9999437 0.9934694 0.9947173 -0.9668873 0.9668957 0.9997074 -0.9668872 0.9668956 0.9997074 -0.9668871 0.9668954 0.9997074 -0.966887 0.9668951 0.9997074 -0.9668869 0.9668948 0.9997074 -0.9668867 0.9668944 0.9997074 -0.9668865 0.9668939 0.9997074 -0.9668862 0.9668932 0.9997074 -0.9668859 0.9668925 0.9997074 -0.9668855 0.9668916 0.9997074 -0.9668852 0.9668905 0.9997074 -0.9668848 0.9668892 0.9997074 -0.9668845 0.9668878 0.9997074 -0.9668844 0.9668862 0.9997074 -0.9668847 0.9668847 0.9997074 -0.9668871 0.9668847 0.9997074 -0.96689 0.9668847 0.9997074 -0.9668937 0.9668847 0.9997074 -0.9668984 0.9668847 0.9997074 -0.9669043 0.9668847 0.9997074 -0.9669118 0.9668847 0.9997074 -0.9669214 0.9668847 0.9997074 -0.9669334 0.9668847 0.9997074 -0.9669486 0.9668847 0.9997074 -0.9669678 0.9668847 0.9997074 -0.9669922 0.9668847 0.9997074 -0.967023 0.9668847 0.9997074 -0.9670619 0.9668847 0.9997074 -0.9671112 0.9668847 0.9997074 -0.9671736 0.9668847 0.9997074 -0.9672525 0.9668847 0.9997074 -0.9673523 0.9668847 0.9997074 -0.9674786 0.9668847 0.9997074 -0.9676383 0.9668847 0.9997074 -0.9678404 0.9668847 0.9997074 -0.9680961 0.9668847 0.9997074 -0.9684196 0.9668847 0.9997074 -0.9688289 0.9668847 0.9997074 -0.9693466 0.9668847 0.9997074 -0.9700016 0.9668847 0.9997074 -0.9708303 0.9668847 0.9997074 -0.9718787 0.9668847 0.9997074 -0.9732051 0.9668847 0.9997074 -0.9748832 0.9668847 0.9997074 -0.9770061 0.9668847 0.9997074 -0.9796919 0.9668847 0.9997074 -0.9830898 0.9668847 0.9997074 -0.9873885 0.9668847 0.9997074 -0.992827 0.9668847 0.9997074 -0.9997074 0.9668847 0.9997074 -0.9997688 0.973671 0.9942984 -0.9998174 0.9790917 0.9920395 -0.9998557 0.9834123 0.9915318 -0.999886 0.9868501 0.9919379 -0.9999099 0.9895817 0.9927679 -0.9999288 0.9917499 0.9937442 -0.9999437 0.9934694 0.9947172 -0.9668873 0.9668981 0.9997074 -0.9668872 0.9668979 0.9997074 -0.9668871 0.9668977 0.9997074 -0.966887 0.9668974 0.9997074 -0.9668869 0.9668971 0.9997074 -0.9668867 0.9668967 0.9997074 -0.9668865 0.9668962 0.9997074 -0.9668862 0.9668956 0.9997074 -0.9668859 0.9668948 0.9997074 -0.9668855 0.9668939 0.9997074 -0.9668852 0.9668928 0.9997074 -0.9668848 0.9668915 0.9997074 -0.9668845 0.9668901 0.9997074 -0.9668844 0.9668886 0.9997074 -0.9668847 0.9668871 0.9997074 -0.9668859 0.9668859 0.9997074 -0.9668888 0.9668859 0.9997074 -0.9668925 0.9668859 0.9997074 -0.9668972 0.9668859 0.9997074 -0.9669032 0.9668859 0.9997074 -0.9669107 0.9668859 0.9997074 -0.9669202 0.9668859 0.9997074 -0.9669322 0.9668859 0.9997074 -0.9669474 0.9668859 0.9997074 -0.9669667 0.9668859 0.9997074 -0.966991 0.9668859 0.9997074 -0.9670218 0.9668859 0.9997074 -0.9670608 0.9668859 0.9997074 -0.96711 0.9668859 0.9997074 -0.9671724 0.9668859 0.9997074 -0.9672513 0.9668859 0.9997074 -0.9673511 0.9668859 0.9997074 -0.9674774 0.9668859 0.9997074 -0.9676372 0.9668859 0.9997074 -0.9678393 0.9668859 0.9997074 -0.968095 0.9668859 0.9997074 -0.9684185 0.9668859 0.9997074 -0.9688277 0.9668859 0.9997074 -0.9693455 0.9668859 0.9997074 -0.9700006 0.9668859 0.9997074 -0.9708293 0.9668859 0.9997074 -0.9718777 0.9668859 0.9997074 -0.9732042 0.9668859 0.9997074 -0.9748823 0.9668859 0.9997074 -0.9770053 0.9668859 0.9997074 -0.9796912 0.9668859 0.9997074 -0.9830892 0.9668859 0.9997074 -0.9873881 0.9668859 0.9997074 -0.9928267 0.9668859 0.9997074 -0.9997074 0.9668859 0.9997074 -0.9997688 0.9736717 0.9942983 -0.9998174 0.9790921 0.9920393 -0.9998557 0.9834126 0.9915316 -0.999886 0.9868503 0.9919378 -0.9999099 0.9895819 0.9927678 -0.9999288 0.99175 0.9937442 -0.9999437 0.9934694 0.9947172 -0.9668873 0.966901 0.9997074 -0.9668872 0.9669008 0.9997074 -0.9668871 0.9669006 0.9997074 -0.966887 0.9669003 0.9997074 -0.9668869 0.9669 0.9997074 -0.9668867 0.9668996 0.9997074 -0.9668865 0.9668991 0.9997074 -0.9668862 0.9668985 0.9997074 -0.9668859 0.9668977 0.9997074 -0.9668855 0.9668968 0.9997074 -0.9668852 0.9668957 0.9997074 -0.9668848 0.9668945 0.9997074 -0.9668845 0.966893 0.9997074 -0.9668844 0.9668915 0.9997074 -0.9668847 0.96689 0.9997074 -0.9668859 0.9668888 0.9997074 -0.9668884 0.9668884 0.9997074 -0.9668922 0.9668884 0.9997074 -0.9668969 0.9668884 0.9997074 -0.9669028 0.9668884 0.9997074 -0.9669103 0.9668884 0.9997074 -0.9669198 0.9668884 0.9997074 -0.9669318 0.9668884 0.9997074 -0.966947 0.9668884 0.9997074 -0.9669663 0.9668884 0.9997074 -0.9669906 0.9668884 0.9997074 -0.9670214 0.9668884 0.9997074 -0.9670604 0.9668884 0.9997074 -0.9671097 0.9668884 0.9997074 -0.967172 0.9668884 0.9997074 -0.9672509 0.9668884 0.9997074 -0.9673508 0.9668884 0.9997074 -0.967477 0.9668884 0.9997074 -0.9676368 0.9668884 0.9997074 -0.9678389 0.9668884 0.9997074 -0.9680946 0.9668884 0.9997074 -0.9684181 0.9668884 0.9997074 -0.9688274 0.9668884 0.9997074 -0.9693452 0.9668884 0.9997074 -0.9700002 0.9668884 0.9997074 -0.970829 0.9668884 0.9997074 -0.9718774 0.9668884 0.9997074 -0.9732039 0.9668884 0.9997074 -0.974882 0.9668884 0.9997074 -0.977005 0.9668884 0.9997074 -0.9796909 0.9668884 0.9997074 -0.983089 0.9668884 0.9997074 -0.9873879 0.9668884 0.9997074 -0.9928267 0.9668884 0.9997074 -0.9997074 0.9668884 0.9997074 -0.9997688 0.9736733 0.9942982 -0.9998174 0.9790931 0.9920392 -0.9998557 0.9834132 0.9915316 -0.999886 0.9868507 0.9919377 -0.9999099 0.9895821 0.9927678 -0.9999288 0.9917502 0.9937442 -0.9999437 0.9934695 0.9947172 -0.9668873 0.9669047 0.9997074 -0.9668872 0.9669045 0.9997074 -0.9668871 0.9669043 0.9997074 -0.966887 0.9669041 0.9997074 -0.9668869 0.9669037 0.9997074 -0.9668867 0.9669033 0.9997074 -0.9668865 0.9669028 0.9997074 -0.9668862 0.9669022 0.9997074 -0.9668859 0.9669014 0.9997074 -0.9668855 0.9669005 0.9997074 -0.9668852 0.9668994 0.9997074 -0.9668848 0.9668982 0.9997074 -0.9668845 0.9668967 0.9997074 -0.9668844 0.9668952 0.9997074 -0.9668847 0.9668937 0.9997074 -0.9668859 0.9668925 0.9997074 -0.9668884 0.9668922 0.9997074 -0.9668922 0.9668922 0.9997074 -0.9668969 0.9668922 0.9997074 -0.9669028 0.9668922 0.9997074 -0.9669103 0.9668922 0.9997074 -0.9669198 0.9668922 0.9997074 -0.9669318 0.9668922 0.9997074 -0.966947 0.9668922 0.9997074 -0.9669663 0.9668922 0.9997074 -0.9669906 0.9668922 0.9997074 -0.9670214 0.9668922 0.9997074 -0.9670604 0.9668922 0.9997074 -0.9671097 0.9668922 0.9997074 -0.967172 0.9668922 0.9997074 -0.9672509 0.9668922 0.9997074 -0.9673508 0.9668922 0.9997074 -0.967477 0.9668922 0.9997074 -0.9676368 0.9668922 0.9997074 -0.9678389 0.9668922 0.9997074 -0.9680946 0.9668922 0.9997074 -0.9684181 0.9668922 0.9997074 -0.9688274 0.9668922 0.9997074 -0.9693452 0.9668922 0.9997074 -0.9700002 0.9668922 0.9997074 -0.970829 0.9668922 0.9997074 -0.9718774 0.9668922 0.9997074 -0.9732039 0.9668922 0.9997074 -0.974882 0.9668922 0.9997074 -0.977005 0.9668922 0.9997074 -0.9796909 0.9668922 0.9997074 -0.983089 0.9668922 0.9997074 -0.9873879 0.9668922 0.9997074 -0.9928267 0.9668922 0.9997074 -0.9997074 0.9668922 0.9997074 -0.9997688 0.9736756 0.9942982 -0.9998174 0.9790946 0.9920392 -0.9998557 0.9834141 0.9915316 -0.999886 0.9868512 0.9919377 -0.9999099 0.9895825 0.9927678 -0.9999288 0.9917504 0.9937442 -0.9999437 0.9934697 0.9947172 -0.9668873 0.9669094 0.9997074 -0.9668872 0.9669092 0.9997074 -0.9668871 0.966909 0.9997074 -0.966887 0.9669087 0.9997074 -0.9668869 0.9669084 0.9997074 -0.9668867 0.966908 0.9997074 -0.9668865 0.9669075 0.9997074 -0.9668862 0.9669069 0.9997074 -0.9668859 0.9669061 0.9997074 -0.9668855 0.9669052 0.9997074 -0.9668852 0.9669041 0.9997074 -0.9668848 0.9669029 0.9997074 -0.9668845 0.9669014 0.9997074 -0.9668844 0.9668999 0.9997074 -0.9668847 0.9668984 0.9997074 -0.9668859 0.9668972 0.9997074 -0.9668884 0.9668969 0.9997074 -0.9668922 0.9668969 0.9997074 -0.9668969 0.9668969 0.9997074 -0.9669028 0.9668969 0.9997074 -0.9669103 0.9668969 0.9997074 -0.9669198 0.9668969 0.9997074 -0.9669318 0.9668969 0.9997074 -0.966947 0.9668969 0.9997074 -0.9669663 0.9668969 0.9997074 -0.9669906 0.9668969 0.9997074 -0.9670214 0.9668969 0.9997074 -0.9670604 0.9668969 0.9997074 -0.9671097 0.9668969 0.9997074 -0.967172 0.9668969 0.9997074 -0.9672509 0.9668969 0.9997074 -0.9673508 0.9668969 0.9997074 -0.967477 0.9668969 0.9997074 -0.9676368 0.9668969 0.9997074 -0.9678389 0.9668969 0.9997074 -0.9680946 0.9668969 0.9997074 -0.9684181 0.9668969 0.9997074 -0.9688274 0.9668969 0.9997074 -0.9693452 0.9668969 0.9997074 -0.9700002 0.9668969 0.9997074 -0.970829 0.9668969 0.9997074 -0.9718774 0.9668969 0.9997074 -0.9732039 0.9668969 0.9997074 -0.974882 0.9668969 0.9997074 -0.977005 0.9668969 0.9997074 -0.9796909 0.9668969 0.9997074 -0.983089 0.9668969 0.9997074 -0.9873879 0.9668969 0.9997074 -0.9928267 0.9668969 0.9997074 -0.9997074 0.9668969 0.9997074 -0.9997688 0.9736786 0.9942982 -0.9998174 0.9790965 0.9920392 -0.9998557 0.9834153 0.9915316 -0.999886 0.986852 0.9919377 -0.9999099 0.9895829 0.9927678 -0.9999288 0.9917507 0.9937442 -0.9999437 0.9934698 0.9947172 -0.9668873 0.9669153 0.9997074 -0.9668872 0.9669152 0.9997074 -0.9668871 0.9669149 0.9997074 -0.966887 0.9669147 0.9997074 -0.9668869 0.9669144 0.9997074 -0.9668867 0.966914 0.9997074 -0.9668865 0.9669135 0.9997074 -0.9668862 0.9669128 0.9997074 -0.9668859 0.9669121 0.9997074 -0.9668855 0.9669112 0.9997074 -0.9668852 0.9669101 0.9997074 -0.9668848 0.9669088 0.9997074 -0.9668845 0.9669074 0.9997074 -0.9668844 0.9669058 0.9997074 -0.9668847 0.9669043 0.9997074 -0.9668859 0.9669032 0.9997074 -0.9668884 0.9669028 0.9997074 -0.9668922 0.9669028 0.9997074 -0.9668969 0.9669028 0.9997074 -0.9669028 0.9669028 0.9997074 -0.9669103 0.9669028 0.9997074 -0.9669198 0.9669028 0.9997074 -0.9669318 0.9669028 0.9997074 -0.966947 0.9669028 0.9997074 -0.9669663 0.9669028 0.9997074 -0.9669906 0.9669028 0.9997074 -0.9670214 0.9669028 0.9997074 -0.9670604 0.9669028 0.9997074 -0.9671097 0.9669028 0.9997074 -0.967172 0.9669028 0.9997074 -0.9672509 0.9669028 0.9997074 -0.9673508 0.9669028 0.9997074 -0.967477 0.9669028 0.9997074 -0.9676368 0.9669028 0.9997074 -0.9678389 0.9669028 0.9997074 -0.9680946 0.9669028 0.9997074 -0.9684181 0.9669028 0.9997074 -0.9688274 0.9669028 0.9997074 -0.9693452 0.9669028 0.9997074 -0.9700002 0.9669028 0.9997074 -0.970829 0.9669028 0.9997074 -0.9718774 0.9669028 0.9997074 -0.9732039 0.9669028 0.9997074 -0.974882 0.9669028 0.9997074 -0.977005 0.9669028 0.9997074 -0.9796909 0.9669028 0.9997074 -0.983089 0.9669028 0.9997074 -0.9873879 0.9669028 0.9997074 -0.9928267 0.9669028 0.9997074 -0.9997074 0.9669028 0.9997074 -0.9997688 0.9736823 0.9942982 -0.9998174 0.9790988 0.9920392 -0.9998557 0.9834167 0.9915316 -0.999886 0.9868529 0.9919377 -0.9999099 0.9895835 0.9927678 -0.9999288 0.991751 0.9937442 -0.9999437 0.9934701 0.9947172 -0.9668873 0.9669228 0.9997074 -0.9668872 0.9669227 0.9997074 -0.9668871 0.9669225 0.9997074 -0.966887 0.9669222 0.9997074 -0.9668869 0.9669219 0.9997074 -0.9668867 0.9669215 0.9997074 -0.9668865 0.966921 0.9997074 -0.9668862 0.9669203 0.9997074 -0.9668859 0.9669196 0.9997074 -0.9668855 0.9669187 0.9997074 -0.9668852 0.9669176 0.9997074 -0.9668848 0.9669163 0.9997074 -0.9668845 0.9669149 0.9997074 -0.9668844 0.9669133 0.9997074 -0.9668847 0.9669118 0.9997074 -0.9668859 0.9669107 0.9997074 -0.9668884 0.9669103 0.9997074 -0.9668922 0.9669103 0.9997074 -0.9668969 0.9669103 0.9997074 -0.9669028 0.9669103 0.9997074 -0.9669103 0.9669103 0.9997074 -0.9669198 0.9669103 0.9997074 -0.9669318 0.9669103 0.9997074 -0.966947 0.9669103 0.9997074 -0.9669663 0.9669103 0.9997074 -0.9669906 0.9669103 0.9997074 -0.9670214 0.9669103 0.9997074 -0.9670604 0.9669103 0.9997074 -0.9671097 0.9669103 0.9997074 -0.967172 0.9669103 0.9997074 -0.9672509 0.9669103 0.9997074 -0.9673508 0.9669103 0.9997074 -0.967477 0.9669103 0.9997074 -0.9676368 0.9669103 0.9997074 -0.9678389 0.9669103 0.9997074 -0.9680946 0.9669103 0.9997074 -0.9684181 0.9669103 0.9997074 -0.9688274 0.9669103 0.9997074 -0.9693452 0.9669103 0.9997074 -0.9700002 0.9669103 0.9997074 -0.970829 0.9669103 0.9997074 -0.9718774 0.9669103 0.9997074 -0.9732039 0.9669103 0.9997074 -0.974882 0.9669103 0.9997074 -0.977005 0.9669103 0.9997074 -0.9796909 0.9669103 0.9997074 -0.983089 0.9669103 0.9997074 -0.9873879 0.9669103 0.9997074 -0.9928267 0.9669103 0.9997074 -0.9997074 0.9669103 0.9997074 -0.9997688 0.973687 0.9942982 -0.9998174 0.9791018 0.9920392 -0.9998557 0.9834186 0.9915316 -0.999886 0.9868541 0.9919377 -0.9999099 0.9895842 0.9927678 -0.9999288 0.9917515 0.9937442 -0.9999437 0.9934704 0.9947172 -0.9668873 0.9669323 0.9997074 -0.9668872 0.9669322 0.9997074 -0.9668871 0.966932 0.9997074 -0.966887 0.9669317 0.9997074 -0.9668869 0.9669314 0.9997074 -0.9668867 0.966931 0.9997074 -0.9668865 0.9669305 0.9997074 -0.9668862 0.9669298 0.9997074 -0.9668859 0.9669291 0.9997074 -0.9668855 0.9669282 0.9997074 -0.9668852 0.9669271 0.9997074 -0.9668848 0.9669258 0.9997074 -0.9668845 0.9669244 0.9997074 -0.9668844 0.9669228 0.9997074 -0.9668847 0.9669214 0.9997074 -0.9668859 0.9669202 0.9997074 -0.9668884 0.9669198 0.9997074 -0.9668922 0.9669198 0.9997074 -0.9668969 0.9669198 0.9997074 -0.9669028 0.9669198 0.9997074 -0.9669103 0.9669198 0.9997074 -0.9669198 0.9669198 0.9997074 -0.9669318 0.9669198 0.9997074 -0.966947 0.9669198 0.9997074 -0.9669663 0.9669198 0.9997074 -0.9669906 0.9669198 0.9997074 -0.9670214 0.9669198 0.9997074 -0.9670604 0.9669198 0.9997074 -0.9671097 0.9669198 0.9997074 -0.967172 0.9669198 0.9997074 -0.9672509 0.9669198 0.9997074 -0.9673508 0.9669198 0.9997074 -0.967477 0.9669198 0.9997074 -0.9676368 0.9669198 0.9997074 -0.9678389 0.9669198 0.9997074 -0.9680946 0.9669198 0.9997074 -0.9684181 0.9669198 0.9997074 -0.9688274 0.9669198 0.9997074 -0.9693452 0.9669198 0.9997074 -0.9700002 0.9669198 0.9997074 -0.970829 0.9669198 0.9997074 -0.9718774 0.9669198 0.9997074 -0.9732039 0.9669198 0.9997074 -0.974882 0.9669198 0.9997074 -0.977005 0.9669198 0.9997074 -0.9796909 0.9669198 0.9997074 -0.983089 0.9669198 0.9997074 -0.9873879 0.9669198 0.9997074 -0.9928267 0.9669198 0.9997074 -0.9997074 0.9669198 0.9997074 -0.9997688 0.973693 0.9942982 -0.9998174 0.9791055 0.9920392 -0.9998557 0.9834209 0.9915316 -0.999886 0.9868555 0.9919377 -0.9999099 0.9895851 0.9927678 -0.9999288 0.9917521 0.9937442 -0.9999437 0.9934707 0.9947172 -0.9668873 0.9669443 0.9997074 -0.9668872 0.9669442 0.9997074 -0.9668871 0.966944 0.9997074 -0.966887 0.9669437 0.9997074 -0.9668869 0.9669434 0.9997074 -0.9668867 0.966943 0.9997074 -0.9668865 0.9669425 0.9997074 -0.9668862 0.9669419 0.9997074 -0.9668859 0.9669411 0.9997074 -0.9668855 0.9669402 0.9997074 -0.9668852 0.9669391 0.9997074 -0.9668848 0.9669378 0.9997074 -0.9668845 0.9669364 0.9997074 -0.9668844 0.9669349 0.9997074 -0.9668847 0.9669334 0.9997074 -0.9668859 0.9669322 0.9997074 -0.9668884 0.9669318 0.9997074 -0.9668922 0.9669318 0.9997074 -0.9668969 0.9669318 0.9997074 -0.9669028 0.9669318 0.9997074 -0.9669103 0.9669318 0.9997074 -0.9669198 0.9669318 0.9997074 -0.9669318 0.9669318 0.9997074 -0.966947 0.9669318 0.9997074 -0.9669663 0.9669318 0.9997074 -0.9669906 0.9669318 0.9997074 -0.9670214 0.9669318 0.9997074 -0.9670604 0.9669318 0.9997074 -0.9671097 0.9669318 0.9997074 -0.967172 0.9669318 0.9997074 -0.9672509 0.9669318 0.9997074 -0.9673508 0.9669318 0.9997074 -0.967477 0.9669318 0.9997074 -0.9676368 0.9669318 0.9997074 -0.9678389 0.9669318 0.9997074 -0.9680946 0.9669318 0.9997074 -0.9684181 0.9669318 0.9997074 -0.9688274 0.9669318 0.9997074 -0.9693452 0.9669318 0.9997074 -0.9700002 0.9669318 0.9997074 -0.970829 0.9669318 0.9997074 -0.9718774 0.9669318 0.9997074 -0.9732039 0.9669318 0.9997074 -0.974882 0.9669318 0.9997074 -0.977005 0.9669318 0.9997074 -0.9796909 0.9669318 0.9997074 -0.983089 0.9669318 0.9997074 -0.9873879 0.9669318 0.9997074 -0.9928267 0.9669318 0.9997074 -0.9997074 0.9669318 0.9997074 -0.9997688 0.9737006 0.9942982 -0.9998174 0.9791103 0.9920392 -0.9998557 0.9834239 0.9915316 -0.999886 0.9868574 0.9919377 -0.9999099 0.9895863 0.9927678 -0.9999288 0.9917528 0.9937442 -0.9999437 0.9934712 0.9947172 -0.9668873 0.9669595 0.9997074 -0.9668872 0.9669594 0.9997074 -0.9668871 0.9669592 0.9997074 -0.966887 0.9669589 0.9997074 -0.9668869 0.9669586 0.9997074 -0.9668867 0.9669582 0.9997074 -0.9668865 0.9669577 0.9997074 -0.9668862 0.9669571 0.9997074 -0.9668859 0.9669563 0.9997074 -0.9668855 0.9669554 0.9997074 -0.9668852 0.9669543 0.9997074 -0.9668848 0.966953 0.9997074 -0.9668845 0.9669516 0.9997074 -0.9668844 0.9669501 0.9997074 -0.9668847 0.9669486 0.9997074 -0.9668859 0.9669474 0.9997074 -0.9668884 0.966947 0.9997074 -0.9668922 0.966947 0.9997074 -0.9668969 0.966947 0.9997074 -0.9669028 0.966947 0.9997074 -0.9669103 0.966947 0.9997074 -0.9669198 0.966947 0.9997074 -0.9669318 0.966947 0.9997074 -0.966947 0.966947 0.9997074 -0.9669663 0.966947 0.9997074 -0.9669906 0.966947 0.9997074 -0.9670214 0.966947 0.9997074 -0.9670604 0.966947 0.9997074 -0.9671097 0.966947 0.9997074 -0.967172 0.966947 0.9997074 -0.9672509 0.966947 0.9997074 -0.9673508 0.966947 0.9997074 -0.967477 0.966947 0.9997074 -0.9676368 0.966947 0.9997074 -0.9678389 0.966947 0.9997074 -0.9680946 0.966947 0.9997074 -0.9684181 0.966947 0.9997074 -0.9688274 0.966947 0.9997074 -0.9693452 0.966947 0.9997074 -0.9700002 0.966947 0.9997074 -0.970829 0.966947 0.9997074 -0.9718774 0.966947 0.9997074 -0.9732039 0.966947 0.9997074 -0.974882 0.966947 0.9997074 -0.977005 0.966947 0.9997074 -0.9796909 0.966947 0.9997074 -0.983089 0.966947 0.9997074 -0.9873879 0.966947 0.9997074 -0.9928267 0.966947 0.9997074 -0.9997074 0.966947 0.9997074 -0.9997688 0.9737101 0.9942982 -0.9998174 0.9791163 0.9920392 -0.9998557 0.9834277 0.9915316 -0.999886 0.9868597 0.9919377 -0.9999099 0.9895878 0.9927678 -0.9999288 0.9917537 0.9937442 -0.9999437 0.9934718 0.9947172 -0.9668873 0.9669788 0.9997074 -0.9668872 0.9669786 0.9997074 -0.9668871 0.9669784 0.9997074 -0.966887 0.9669781 0.9997074 -0.9668869 0.9669778 0.9997074 -0.9668867 0.9669774 0.9997074 -0.9668865 0.9669769 0.9997074 -0.9668862 0.9669763 0.9997074 -0.9668859 0.9669755 0.9997074 -0.9668855 0.9669746 0.9997074 -0.9668852 0.9669735 0.9997074 -0.9668848 0.9669723 0.9997074 -0.9668845 0.9669708 0.9997074 -0.9668844 0.9669693 0.9997074 -0.9668847 0.9669678 0.9997074 -0.9668859 0.9669667 0.9997074 -0.9668884 0.9669663 0.9997074 -0.9668922 0.9669663 0.9997074 -0.9668969 0.9669663 0.9997074 -0.9669028 0.9669663 0.9997074 -0.9669103 0.9669663 0.9997074 -0.9669198 0.9669663 0.9997074 -0.9669318 0.9669663 0.9997074 -0.966947 0.9669663 0.9997074 -0.9669663 0.9669663 0.9997074 -0.9669906 0.9669663 0.9997074 -0.9670214 0.9669663 0.9997074 -0.9670604 0.9669663 0.9997074 -0.9671097 0.9669663 0.9997074 -0.967172 0.9669663 0.9997074 -0.9672509 0.9669663 0.9997074 -0.9673508 0.9669663 0.9997074 -0.967477 0.9669663 0.9997074 -0.9676368 0.9669663 0.9997074 -0.9678389 0.9669663 0.9997074 -0.9680946 0.9669663 0.9997074 -0.9684181 0.9669663 0.9997074 -0.9688274 0.9669663 0.9997074 -0.9693452 0.9669663 0.9997074 -0.9700002 0.9669663 0.9997074 -0.970829 0.9669663 0.9997074 -0.9718774 0.9669663 0.9997074 -0.9732039 0.9669663 0.9997074 -0.974882 0.9669663 0.9997074 -0.977005 0.9669663 0.9997074 -0.9796909 0.9669663 0.9997074 -0.983089 0.9669663 0.9997074 -0.9873879 0.9669663 0.9997074 -0.9928267 0.9669663 0.9997074 -0.9997074 0.9669663 0.9997074 -0.9997688 0.9737222 0.9942982 -0.9998174 0.9791238 0.9920392 -0.9998557 0.9834324 0.9915316 -0.999886 0.9868627 0.9919377 -0.9999099 0.9895897 0.9927678 -0.9999288 0.9917549 0.9937442 -0.9999437 0.9934725 0.9947172 -0.9668873 0.9670031 0.9997074 -0.9668872 0.967003 0.9997074 -0.9668871 0.9670027 0.9997074 -0.966887 0.9670025 0.9997074 -0.9668869 0.9670022 0.9997074 -0.9668867 0.9670018 0.9997074 -0.9668865 0.9670013 0.9997074 -0.9668862 0.9670006 0.9997074 -0.9668859 0.9669999 0.9997074 -0.9668855 0.966999 0.9997074 -0.9668852 0.9669979 0.9997074 -0.9668848 0.9669966 0.9997074 -0.9668845 0.9669952 0.9997074 -0.9668844 0.9669937 0.9997074 -0.9668847 0.9669922 0.9997074 -0.9668859 0.966991 0.9997074 -0.9668884 0.9669906 0.9997074 -0.9668922 0.9669906 0.9997074 -0.9668969 0.9669906 0.9997074 -0.9669028 0.9669906 0.9997074 -0.9669103 0.9669906 0.9997074 -0.9669198 0.9669906 0.9997074 -0.9669318 0.9669906 0.9997074 -0.966947 0.9669906 0.9997074 -0.9669663 0.9669906 0.9997074 -0.9669906 0.9669906 0.9997074 -0.9670214 0.9669906 0.9997074 -0.9670604 0.9669906 0.9997074 -0.9671097 0.9669906 0.9997074 -0.967172 0.9669906 0.9997074 -0.9672509 0.9669906 0.9997074 -0.9673508 0.9669906 0.9997074 -0.967477 0.9669906 0.9997074 -0.9676368 0.9669906 0.9997074 -0.9678389 0.9669906 0.9997074 -0.9680946 0.9669906 0.9997074 -0.9684181 0.9669906 0.9997074 -0.9688274 0.9669906 0.9997074 -0.9693452 0.9669906 0.9997074 -0.9700002 0.9669906 0.9997074 -0.970829 0.9669906 0.9997074 -0.9718774 0.9669906 0.9997074 -0.9732039 0.9669906 0.9997074 -0.974882 0.9669906 0.9997074 -0.977005 0.9669906 0.9997074 -0.9796909 0.9669906 0.9997074 -0.983089 0.9669906 0.9997074 -0.9873879 0.9669906 0.9997074 -0.9928267 0.9669906 0.9997074 -0.9997074 0.9669906 0.9997074 -0.9997688 0.9737375 0.9942982 -0.9998174 0.9791334 0.9920392 -0.9998557 0.9834385 0.9915316 -0.999886 0.9868665 0.9919377 -0.9999099 0.989592 0.9927678 -0.9999288 0.9917564 0.9937442 -0.9999437 0.9934734 0.9947172 -0.9668873 0.9670339 0.9997074 -0.9668872 0.9670337 0.9997074 -0.9668871 0.9670335 0.9997074 -0.966887 0.9670333 0.9997074 -0.9668869 0.9670329 0.9997074 -0.9668867 0.9670325 0.9997074 -0.9668865 0.967032 0.9997074 -0.9668862 0.9670314 0.9997074 -0.9668859 0.9670307 0.9997074 -0.9668855 0.9670298 0.9997074 -0.9668852 0.9670287 0.9997074 -0.9668848 0.9670274 0.9997074 -0.9668845 0.967026 0.9997074 -0.9668844 0.9670245 0.9997074 -0.9668847 0.967023 0.9997074 -0.9668859 0.9670218 0.9997074 -0.9668884 0.9670214 0.9997074 -0.9668922 0.9670214 0.9997074 -0.9668969 0.9670214 0.9997074 -0.9669028 0.9670214 0.9997074 -0.9669103 0.9670214 0.9997074 -0.9669198 0.9670214 0.9997074 -0.9669318 0.9670214 0.9997074 -0.966947 0.9670214 0.9997074 -0.9669663 0.9670214 0.9997074 -0.9669906 0.9670214 0.9997074 -0.9670214 0.9670214 0.9997074 -0.9670604 0.9670214 0.9997074 -0.9671097 0.9670214 0.9997074 -0.967172 0.9670214 0.9997074 -0.9672509 0.9670214 0.9997074 -0.9673508 0.9670214 0.9997074 -0.967477 0.9670214 0.9997074 -0.9676368 0.9670214 0.9997074 -0.9678389 0.9670214 0.9997074 -0.9680946 0.9670214 0.9997074 -0.9684181 0.9670214 0.9997074 -0.9688274 0.9670214 0.9997074 -0.9693452 0.9670214 0.9997074 -0.9700002 0.9670214 0.9997074 -0.970829 0.9670214 0.9997074 -0.9718774 0.9670214 0.9997074 -0.9732039 0.9670214 0.9997074 -0.974882 0.9670214 0.9997074 -0.977005 0.9670214 0.9997074 -0.9796909 0.9670214 0.9997074 -0.983089 0.9670214 0.9997074 -0.9873879 0.9670214 0.9997074 -0.9928267 0.9670214 0.9997074 -0.9997074 0.9670214 0.9997074 -0.9997688 0.9737569 0.9942982 -0.9998174 0.9791456 0.9920392 -0.9998557 0.9834461 0.9915316 -0.999886 0.9868713 0.9919377 -0.9999099 0.989595 0.9927678 -0.9999288 0.9917582 0.9937442 -0.9999437 0.9934746 0.9947172 -0.9668873 0.9670729 0.9997074 -0.9668872 0.9670727 0.9997074 -0.9668871 0.9670725 0.9997074 -0.966887 0.9670722 0.9997074 -0.9668869 0.9670719 0.9997074 -0.9668867 0.9670715 0.9997074 -0.9668865 0.967071 0.9997074 -0.9668862 0.9670704 0.9997074 -0.9668859 0.9670696 0.9997074 -0.9668855 0.9670687 0.9997074 -0.9668852 0.9670676 0.9997074 -0.9668848 0.9670664 0.9997074 -0.9668845 0.9670649 0.9997074 -0.9668844 0.9670634 0.9997074 -0.9668847 0.9670619 0.9997074 -0.9668859 0.9670608 0.9997074 -0.9668884 0.9670604 0.9997074 -0.9668922 0.9670604 0.9997074 -0.9668969 0.9670604 0.9997074 -0.9669028 0.9670604 0.9997074 -0.9669103 0.9670604 0.9997074 -0.9669198 0.9670604 0.9997074 -0.9669318 0.9670604 0.9997074 -0.966947 0.9670604 0.9997074 -0.9669663 0.9670604 0.9997074 -0.9669906 0.9670604 0.9997074 -0.9670214 0.9670604 0.9997074 -0.9670604 0.9670604 0.9997074 -0.9671097 0.9670604 0.9997074 -0.967172 0.9670604 0.9997074 -0.9672509 0.9670604 0.9997074 -0.9673508 0.9670604 0.9997074 -0.967477 0.9670604 0.9997074 -0.9676368 0.9670604 0.9997074 -0.9678389 0.9670604 0.9997074 -0.9680946 0.9670604 0.9997074 -0.9684181 0.9670604 0.9997074 -0.9688274 0.9670604 0.9997074 -0.9693452 0.9670604 0.9997074 -0.9700002 0.9670604 0.9997074 -0.970829 0.9670604 0.9997074 -0.9718774 0.9670604 0.9997074 -0.9732039 0.9670604 0.9997074 -0.974882 0.9670604 0.9997074 -0.977005 0.9670604 0.9997074 -0.9796909 0.9670604 0.9997074 -0.983089 0.9670604 0.9997074 -0.9873879 0.9670604 0.9997074 -0.9928267 0.9670604 0.9997074 -0.9997074 0.9670604 0.9997074 -0.9997688 0.9737814 0.9942982 -0.9998174 0.979161 0.9920392 -0.9998557 0.9834557 0.9915316 -0.999886 0.9868773 0.9919377 -0.9999099 0.9895988 0.9927678 -0.9999288 0.9917606 0.9937442 -0.9999437 0.9934761 0.9947172 -0.9668873 0.9671221 0.9997074 -0.9668872 0.967122 0.9997074 -0.9668871 0.9671218 0.9997074 -0.966887 0.9671215 0.9997074 -0.9668869 0.9671212 0.9997074 -0.9668867 0.9671208 0.9997074 -0.9668865 0.9671203 0.9997074 -0.9668862 0.9671197 0.9997074 -0.9668859 0.9671189 0.9997074 -0.9668855 0.967118 0.9997074 -0.9668852 0.9671169 0.9997074 -0.9668848 0.9671156 0.9997074 -0.9668845 0.9671142 0.9997074 -0.9668844 0.9671127 0.9997074 -0.9668847 0.9671112 0.9997074 -0.9668859 0.96711 0.9997074 -0.9668884 0.9671097 0.9997074 -0.9668922 0.9671097 0.9997074 -0.9668969 0.9671097 0.9997074 -0.9669028 0.9671097 0.9997074 -0.9669103 0.9671097 0.9997074 -0.9669198 0.9671097 0.9997074 -0.9669318 0.9671097 0.9997074 -0.966947 0.9671097 0.9997074 -0.9669663 0.9671097 0.9997074 -0.9669906 0.9671097 0.9997074 -0.9670214 0.9671097 0.9997074 -0.9670604 0.9671097 0.9997074 -0.9671097 0.9671097 0.9997074 -0.967172 0.9671097 0.9997074 -0.9672509 0.9671097 0.9997074 -0.9673508 0.9671097 0.9997074 -0.967477 0.9671097 0.9997074 -0.9676368 0.9671097 0.9997074 -0.9678389 0.9671097 0.9997074 -0.9680946 0.9671097 0.9997074 -0.9684181 0.9671097 0.9997074 -0.9688274 0.9671097 0.9997074 -0.9693452 0.9671097 0.9997074 -0.9700002 0.9671097 0.9997074 -0.970829 0.9671097 0.9997074 -0.9718774 0.9671097 0.9997074 -0.9732039 0.9671097 0.9997074 -0.974882 0.9671097 0.9997074 -0.977005 0.9671097 0.9997074 -0.9796909 0.9671097 0.9997074 -0.983089 0.9671097 0.9997074 -0.9873879 0.9671097 0.9997074 -0.9928267 0.9671097 0.9997074 -0.9997074 0.9671097 0.9997074 -0.9997688 0.9738123 0.9942982 -0.9998174 0.9791804 0.9920392 -0.9998557 0.9834679 0.9915316 -0.999886 0.986885 0.9919377 -0.9999099 0.9896036 0.9927678 -0.9999288 0.9917636 0.9937442 -0.9999437 0.9934779 0.9947172 -0.9668873 0.9671845 0.9997074 -0.9668872 0.9671843 0.9997074 -0.9668871 0.9671841 0.9997074 -0.966887 0.9671838 0.9997074 -0.9668869 0.9671835 0.9997074 -0.9668867 0.9671831 0.9997074 -0.9668865 0.9671826 0.9997074 -0.9668862 0.967182 0.9997074 -0.9668859 0.9671812 0.9997074 -0.9668855 0.9671803 0.9997074 -0.9668852 0.9671793 0.9997074 -0.9668848 0.967178 0.9997074 -0.9668845 0.9671766 0.9997074 -0.9668844 0.9671751 0.9997074 -0.9668847 0.9671736 0.9997074 -0.9668859 0.9671724 0.9997074 -0.9668884 0.967172 0.9997074 -0.9668922 0.967172 0.9997074 -0.9668969 0.967172 0.9997074 -0.9669028 0.967172 0.9997074 -0.9669103 0.967172 0.9997074 -0.9669198 0.967172 0.9997074 -0.9669318 0.967172 0.9997074 -0.966947 0.967172 0.9997074 -0.9669663 0.967172 0.9997074 -0.9669906 0.967172 0.9997074 -0.9670214 0.967172 0.9997074 -0.9670604 0.967172 0.9997074 -0.9671097 0.967172 0.9997074 -0.967172 0.967172 0.9997074 -0.9672509 0.967172 0.9997074 -0.9673508 0.967172 0.9997074 -0.967477 0.967172 0.9997074 -0.9676368 0.967172 0.9997074 -0.9678389 0.967172 0.9997074 -0.9680946 0.967172 0.9997074 -0.9684181 0.967172 0.9997074 -0.9688274 0.967172 0.9997074 -0.9693452 0.967172 0.9997074 -0.9700002 0.967172 0.9997074 -0.970829 0.967172 0.9997074 -0.9718774 0.967172 0.9997074 -0.9732039 0.967172 0.9997074 -0.974882 0.967172 0.9997074 -0.977005 0.967172 0.9997074 -0.9796909 0.967172 0.9997074 -0.983089 0.967172 0.9997074 -0.9873879 0.967172 0.9997074 -0.9928267 0.967172 0.9997074 -0.9997074 0.967172 0.9997074 -0.9997688 0.9738515 0.9942982 -0.9998174 0.979205 0.9920392 -0.9998557 0.9834833 0.9915316 -0.999886 0.9868946 0.9919377 -0.9999099 0.9896096 0.9927678 -0.9999288 0.9917674 0.9937442 -0.9999437 0.9934803 0.9947172 -0.9668873 0.9672633 0.9997074 -0.9668872 0.9672632 0.9997074 -0.9668871 0.967263 0.9997074 -0.966887 0.9672627 0.9997074 -0.9668869 0.9672624 0.9997074 -0.9668867 0.967262 0.9997074 -0.9668865 0.9672615 0.9997074 -0.9668862 0.9672609 0.9997074 -0.9668859 0.9672601 0.9997074 -0.9668855 0.9672592 0.9997074 -0.9668852 0.9672581 0.9997074 -0.9668848 0.9672569 0.9997074 -0.9668845 0.9672555 0.9997074 -0.9668844 0.9672539 0.9997074 -0.9668847 0.9672525 0.9997074 -0.9668859 0.9672513 0.9997074 -0.9668884 0.9672509 0.9997074 -0.9668922 0.9672509 0.9997074 -0.9668969 0.9672509 0.9997074 -0.9669028 0.9672509 0.9997074 -0.9669103 0.9672509 0.9997074 -0.9669198 0.9672509 0.9997074 -0.9669318 0.9672509 0.9997074 -0.966947 0.9672509 0.9997074 -0.9669663 0.9672509 0.9997074 -0.9669906 0.9672509 0.9997074 -0.9670214 0.9672509 0.9997074 -0.9670604 0.9672509 0.9997074 -0.9671097 0.9672509 0.9997074 -0.967172 0.9672509 0.9997074 -0.9672509 0.9672509 0.9997074 -0.9673508 0.9672509 0.9997074 -0.967477 0.9672509 0.9997074 -0.9676368 0.9672509 0.9997074 -0.9678389 0.9672509 0.9997074 -0.9680946 0.9672509 0.9997074 -0.9684181 0.9672509 0.9997074 -0.9688274 0.9672509 0.9997074 -0.9693452 0.9672509 0.9997074 -0.9700002 0.9672509 0.9997074 -0.970829 0.9672509 0.9997074 -0.9718774 0.9672509 0.9997074 -0.9732039 0.9672509 0.9997074 -0.974882 0.9672509 0.9997074 -0.977005 0.9672509 0.9997074 -0.9796909 0.9672509 0.9997074 -0.983089 0.9672509 0.9997074 -0.9873879 0.9672509 0.9997074 -0.9928267 0.9672509 0.9997074 -0.9997074 0.9672509 0.9997074 -0.9997688 0.9739011 0.9942982 -0.9998174 0.9792361 0.9920392 -0.9998557 0.9835029 0.9915316 -0.999886 0.9869069 0.9919377 -0.9999099 0.9896173 0.9927678 -0.9999288 0.9917722 0.9937442 -0.9999437 0.9934833 0.9947172 -0.9668873 0.9673631 0.9997074 -0.9668872 0.9673629 0.9997074 -0.9668871 0.9673627 0.9997074 -0.966887 0.9673625 0.9997074 -0.9668869 0.9673622 0.9997074 -0.9668867 0.9673618 0.9997074 -0.9668865 0.9673613 0.9997074 -0.9668862 0.9673607 0.9997074 -0.9668859 0.9673599 0.9997074 -0.9668855 0.967359 0.9997074 -0.9668852 0.9673579 0.9997074 -0.9668848 0.9673567 0.9997074 -0.9668845 0.9673553 0.9997074 -0.9668844 0.9673538 0.9997074 -0.9668847 0.9673523 0.9997074 -0.9668859 0.9673511 0.9997074 -0.9668884 0.9673508 0.9997074 -0.9668922 0.9673508 0.9997074 -0.9668969 0.9673508 0.9997074 -0.9669028 0.9673508 0.9997074 -0.9669103 0.9673508 0.9997074 -0.9669198 0.9673508 0.9997074 -0.9669318 0.9673508 0.9997074 -0.966947 0.9673508 0.9997074 -0.9669663 0.9673508 0.9997074 -0.9669906 0.9673508 0.9997074 -0.9670214 0.9673508 0.9997074 -0.9670604 0.9673508 0.9997074 -0.9671097 0.9673508 0.9997074 -0.967172 0.9673508 0.9997074 -0.9672509 0.9673508 0.9997074 -0.9673508 0.9673508 0.9997074 -0.967477 0.9673508 0.9997074 -0.9676368 0.9673508 0.9997074 -0.9678389 0.9673508 0.9997074 -0.9680946 0.9673508 0.9997074 -0.9684181 0.9673508 0.9997074 -0.9688274 0.9673508 0.9997074 -0.9693452 0.9673508 0.9997074 -0.9700002 0.9673508 0.9997074 -0.970829 0.9673508 0.9997074 -0.9718774 0.9673508 0.9997074 -0.9732039 0.9673508 0.9997074 -0.974882 0.9673508 0.9997074 -0.977005 0.9673508 0.9997074 -0.9796909 0.9673508 0.9997074 -0.983089 0.9673508 0.9997074 -0.9873879 0.9673508 0.9997074 -0.9928267 0.9673508 0.9997074 -0.9997074 0.9673508 0.9997074 -0.9997688 0.9739638 0.9942982 -0.9998174 0.9792755 0.9920392 -0.9998557 0.9835276 0.9915316 -0.999886 0.9869223 0.9919377 -0.9999099 0.989627 0.9927678 -0.9999288 0.9917782 0.9937442 -0.9999437 0.9934871 0.9947172 -0.9668873 0.9674893 0.9997074 -0.9668872 0.9674892 0.9997074 -0.9668871 0.967489 0.9997074 -0.966887 0.9674887 0.9997074 -0.9668869 0.9674884 0.9997074 -0.9668867 0.967488 0.9997074 -0.9668865 0.9674875 0.9997074 -0.9668862 0.9674869 0.9997074 -0.9668859 0.9674862 0.9997074 -0.9668855 0.9674853 0.9997074 -0.9668852 0.9674842 0.9997074 -0.9668848 0.9674829 0.9997074 -0.9668845 0.9674815 0.9997074 -0.9668844 0.96748 0.9997074 -0.9668847 0.9674786 0.9997074 -0.9668859 0.9674774 0.9997074 -0.9668884 0.967477 0.9997074 -0.9668922 0.967477 0.9997074 -0.9668969 0.967477 0.9997074 -0.9669028 0.967477 0.9997074 -0.9669103 0.967477 0.9997074 -0.9669198 0.967477 0.9997074 -0.9669318 0.967477 0.9997074 -0.966947 0.967477 0.9997074 -0.9669663 0.967477 0.9997074 -0.9669906 0.967477 0.9997074 -0.9670214 0.967477 0.9997074 -0.9670604 0.967477 0.9997074 -0.9671097 0.967477 0.9997074 -0.967172 0.967477 0.9997074 -0.9672509 0.967477 0.9997074 -0.9673508 0.967477 0.9997074 -0.967477 0.967477 0.9997074 -0.9676368 0.967477 0.9997074 -0.9678389 0.967477 0.9997074 -0.9680946 0.967477 0.9997074 -0.9684181 0.967477 0.9997074 -0.9688274 0.967477 0.9997074 -0.9693452 0.967477 0.9997074 -0.9700002 0.967477 0.9997074 -0.970829 0.967477 0.9997074 -0.9718774 0.967477 0.9997074 -0.9732039 0.967477 0.9997074 -0.974882 0.967477 0.9997074 -0.977005 0.967477 0.9997074 -0.9796909 0.967477 0.9997074 -0.983089 0.967477 0.9997074 -0.9873879 0.967477 0.9997074 -0.9928267 0.967477 0.9997074 -0.9997074 0.967477 0.9997074 -0.9997688 0.9740432 0.9942982 -0.9998174 0.9793253 0.9920392 -0.9998557 0.9835588 0.9915316 -0.999886 0.9869419 0.9919377 -0.9999099 0.9896392 0.9927678 -0.9999288 0.9917859 0.9937442 -0.9999437 0.9934919 0.9947172 -0.9668873 0.967649 0.9997074 -0.9668872 0.9676489 0.9997074 -0.9668871 0.9676487 0.9997074 -0.966887 0.9676484 0.9997074 -0.9668869 0.9676481 0.9997074 -0.9668867 0.9676477 0.9997074 -0.9668865 0.9676472 0.9997074 -0.9668862 0.9676466 0.9997074 -0.9668859 0.9676459 0.9997074 -0.9668855 0.967645 0.9997074 -0.9668852 0.9676439 0.9997074 -0.9668848 0.9676427 0.9997074 -0.9668845 0.9676413 0.9997074 -0.9668844 0.9676398 0.9997074 -0.9668847 0.9676383 0.9997074 -0.9668859 0.9676372 0.9997074 -0.9668884 0.9676368 0.9997074 -0.9668922 0.9676368 0.9997074 -0.9668969 0.9676368 0.9997074 -0.9669028 0.9676368 0.9997074 -0.9669103 0.9676368 0.9997074 -0.9669198 0.9676368 0.9997074 -0.9669318 0.9676368 0.9997074 -0.966947 0.9676368 0.9997074 -0.9669663 0.9676368 0.9997074 -0.9669906 0.9676368 0.9997074 -0.9670214 0.9676368 0.9997074 -0.9670604 0.9676368 0.9997074 -0.9671097 0.9676368 0.9997074 -0.967172 0.9676368 0.9997074 -0.9672509 0.9676368 0.9997074 -0.9673508 0.9676368 0.9997074 -0.967477 0.9676368 0.9997074 -0.9676368 0.9676368 0.9997074 -0.9678389 0.9676368 0.9997074 -0.9680946 0.9676368 0.9997074 -0.9684181 0.9676368 0.9997074 -0.9688274 0.9676368 0.9997074 -0.9693452 0.9676368 0.9997074 -0.9700002 0.9676368 0.9997074 -0.970829 0.9676368 0.9997074 -0.9718774 0.9676368 0.9997074 -0.9732039 0.9676368 0.9997074 -0.974882 0.9676368 0.9997074 -0.977005 0.9676368 0.9997074 -0.9796909 0.9676368 0.9997074 -0.983089 0.9676368 0.9997074 -0.9873879 0.9676368 0.9997074 -0.9928267 0.9676368 0.9997074 -0.9997074 0.9676368 0.9997074 -0.9997688 0.9741436 0.9942982 -0.9998174 0.9793883 0.9920392 -0.9998557 0.9835983 0.9915316 -0.999886 0.9869667 0.9919377 -0.9999099 0.9896547 0.9927678 -0.9999288 0.9917956 0.9937442 -0.9999437 0.993498 0.9947172 -0.9668873 0.9678511 0.9997074 -0.9668872 0.9678509 0.9997074 -0.9668871 0.9678507 0.9997074 -0.966887 0.9678505 0.9997074 -0.9668869 0.9678502 0.9997074 -0.9668867 0.9678498 0.9997074 -0.9668865 0.9678493 0.9997074 -0.9668862 0.9678487 0.9997074 -0.9668859 0.9678479 0.9997074 -0.9668855 0.967847 0.9997074 -0.9668852 0.967846 0.9997074 -0.9668848 0.9678448 0.9997074 -0.9668845 0.9678434 0.9997074 -0.9668844 0.9678419 0.9997074 -0.9668847 0.9678404 0.9997074 -0.9668859 0.9678393 0.9997074 -0.9668884 0.9678389 0.9997074 -0.9668922 0.9678389 0.9997074 -0.9668969 0.9678389 0.9997074 -0.9669028 0.9678389 0.9997074 -0.9669103 0.9678389 0.9997074 -0.9669198 0.9678389 0.9997074 -0.9669318 0.9678389 0.9997074 -0.966947 0.9678389 0.9997074 -0.9669663 0.9678389 0.9997074 -0.9669906 0.9678389 0.9997074 -0.9670214 0.9678389 0.9997074 -0.9670604 0.9678389 0.9997074 -0.9671097 0.9678389 0.9997074 -0.967172 0.9678389 0.9997074 -0.9672509 0.9678389 0.9997074 -0.9673508 0.9678389 0.9997074 -0.967477 0.9678389 0.9997074 -0.9676368 0.9678389 0.9997074 -0.9678389 0.9678389 0.9997074 -0.9680946 0.9678389 0.9997074 -0.9684181 0.9678389 0.9997074 -0.9688274 0.9678389 0.9997074 -0.9693452 0.9678389 0.9997074 -0.9700002 0.9678389 0.9997074 -0.970829 0.9678389 0.9997074 -0.9718774 0.9678389 0.9997074 -0.9732039 0.9678389 0.9997074 -0.974882 0.9678389 0.9997074 -0.977005 0.9678389 0.9997074 -0.9796909 0.9678389 0.9997074 -0.983089 0.9678389 0.9997074 -0.9873879 0.9678389 0.9997074 -0.9928267 0.9678389 0.9997074 -0.9997074 0.9678389 0.9997074 -0.9997688 0.9742706 0.9942982 -0.9998174 0.9794681 0.9920392 -0.9998557 0.9836483 0.9915316 -0.999886 0.986998 0.9919377 -0.9999099 0.9896744 0.9927678 -0.9999288 0.9918079 0.9937442 -0.9999437 0.9935057 0.9947172 -0.9668873 0.9681067 0.9997074 -0.9668872 0.9681065 0.9997074 -0.9668871 0.9681063 0.9997074 -0.966887 0.9681061 0.9997074 -0.9668869 0.9681058 0.9997074 -0.9668867 0.9681054 0.9997074 -0.9668865 0.9681049 0.9997074 -0.9668862 0.9681043 0.9997074 -0.9668859 0.9681036 0.9997074 -0.9668855 0.9681027 0.9997074 -0.9668852 0.9681016 0.9997074 -0.9668848 0.9681004 0.9997074 -0.9668845 0.968099 0.9997074 -0.9668844 0.9680976 0.9997074 -0.9668847 0.9680961 0.9997074 -0.9668859 0.968095 0.9997074 -0.9668884 0.9680946 0.9997074 -0.9668922 0.9680946 0.9997074 -0.9668969 0.9680946 0.9997074 -0.9669028 0.9680946 0.9997074 -0.9669103 0.9680946 0.9997074 -0.9669198 0.9680946 0.9997074 -0.9669318 0.9680946 0.9997074 -0.966947 0.9680946 0.9997074 -0.9669663 0.9680946 0.9997074 -0.9669906 0.9680946 0.9997074 -0.9670214 0.9680946 0.9997074 -0.9670604 0.9680946 0.9997074 -0.9671097 0.9680946 0.9997074 -0.967172 0.9680946 0.9997074 -0.9672509 0.9680946 0.9997074 -0.9673508 0.9680946 0.9997074 -0.967477 0.9680946 0.9997074 -0.9676368 0.9680946 0.9997074 -0.9678389 0.9680946 0.9997074 -0.9680946 0.9680946 0.9997074 -0.9684181 0.9680946 0.9997074 -0.9688274 0.9680946 0.9997074 -0.9693452 0.9680946 0.9997074 -0.9700002 0.9680946 0.9997074 -0.970829 0.9680946 0.9997074 -0.9718774 0.9680946 0.9997074 -0.9732039 0.9680946 0.9997074 -0.974882 0.9680946 0.9997074 -0.977005 0.9680946 0.9997074 -0.9796909 0.9680946 0.9997074 -0.983089 0.9680946 0.9997074 -0.9873879 0.9680946 0.9997074 -0.9928267 0.9680946 0.9997074 -0.9997074 0.9680946 0.9997074 -0.9997688 0.9744313 0.9942982 -0.9998174 0.9795689 0.9920392 -0.9998557 0.9837116 0.9915316 -0.999886 0.9870376 0.9919377 -0.9999099 0.9896992 0.9927678 -0.9999288 0.9918234 0.9937442 -0.9999437 0.9935154 0.9947172 -0.9668873 0.9684301 0.9997074 -0.9668872 0.9684299 0.9997074 -0.9668871 0.9684297 0.9997074 -0.966887 0.9684295 0.9997074 -0.9668869 0.9684292 0.9997074 -0.9668867 0.9684288 0.9997074 -0.9668865 0.9684283 0.9997074 -0.9668862 0.9684277 0.9997074 -0.9668859 0.968427 0.9997074 -0.9668855 0.9684261 0.9997074 -0.9668852 0.9684251 0.9997074 -0.9668848 0.9684239 0.9997074 -0.9668845 0.9684225 0.9997074 -0.9668844 0.968421 0.9997074 -0.9668847 0.9684196 0.9997074 -0.9668859 0.9684185 0.9997074 -0.9668884 0.9684181 0.9997074 -0.9668922 0.9684181 0.9997074 -0.9668969 0.9684181 0.9997074 -0.9669028 0.9684181 0.9997074 -0.9669103 0.9684181 0.9997074 -0.9669198 0.9684181 0.9997074 -0.9669318 0.9684181 0.9997074 -0.966947 0.9684181 0.9997074 -0.9669663 0.9684181 0.9997074 -0.9669906 0.9684181 0.9997074 -0.9670214 0.9684181 0.9997074 -0.9670604 0.9684181 0.9997074 -0.9671097 0.9684181 0.9997074 -0.967172 0.9684181 0.9997074 -0.9672509 0.9684181 0.9997074 -0.9673508 0.9684181 0.9997074 -0.967477 0.9684181 0.9997074 -0.9676368 0.9684181 0.9997074 -0.9678389 0.9684181 0.9997074 -0.9680946 0.9684181 0.9997074 -0.9684181 0.9684181 0.9997074 -0.9688274 0.9684181 0.9997074 -0.9693452 0.9684181 0.9997074 -0.9700002 0.9684181 0.9997074 -0.970829 0.9684181 0.9997074 -0.9718774 0.9684181 0.9997074 -0.9732039 0.9684181 0.9997074 -0.974882 0.9684181 0.9997074 -0.977005 0.9684181 0.9997074 -0.9796909 0.9684181 0.9997074 -0.983089 0.9684181 0.9997074 -0.9873879 0.9684181 0.9997074 -0.9928267 0.9684181 0.9997074 -0.9997074 0.9684181 0.9997074 -0.9997688 0.9746346 0.9942982 -0.9998174 0.9796966 0.9920392 -0.9998557 0.9837916 0.9915316 -0.999886 0.9870878 0.9919377 -0.9999099 0.9897306 0.9927678 -0.9999288 0.9918431 0.9937442 -0.9999437 0.9935277 0.9947172 -0.9668873 0.9688392 0.9997074 -0.9668872 0.968839 0.9997074 -0.9668871 0.9688388 0.9997074 -0.966887 0.9688386 0.9997074 -0.9668869 0.9688383 0.9997074 -0.9668867 0.9688379 0.9997074 -0.9668865 0.9688374 0.9997074 -0.9668862 0.9688368 0.9997074 -0.9668859 0.9688361 0.9997074 -0.9668855 0.9688353 0.9997074 -0.9668852 0.9688342 0.9997074 -0.9668848 0.968833 0.9997074 -0.9668845 0.9688317 0.9997074 -0.9668844 0.9688303 0.9997074 -0.9668847 0.9688289 0.9997074 -0.9668859 0.9688277 0.9997074 -0.9668884 0.9688274 0.9997074 -0.9668922 0.9688274 0.9997074 -0.9668969 0.9688274 0.9997074 -0.9669028 0.9688274 0.9997074 -0.9669103 0.9688274 0.9997074 -0.9669198 0.9688274 0.9997074 -0.9669318 0.9688274 0.9997074 -0.966947 0.9688274 0.9997074 -0.9669663 0.9688274 0.9997074 -0.9669906 0.9688274 0.9997074 -0.9670214 0.9688274 0.9997074 -0.9670604 0.9688274 0.9997074 -0.9671097 0.9688274 0.9997074 -0.967172 0.9688274 0.9997074 -0.9672509 0.9688274 0.9997074 -0.9673508 0.9688274 0.9997074 -0.967477 0.9688274 0.9997074 -0.9676368 0.9688274 0.9997074 -0.9678389 0.9688274 0.9997074 -0.9680946 0.9688274 0.9997074 -0.9684181 0.9688274 0.9997074 -0.9688274 0.9688274 0.9997074 -0.9693452 0.9688274 0.9997074 -0.9700002 0.9688274 0.9997074 -0.970829 0.9688274 0.9997074 -0.9718774 0.9688274 0.9997074 -0.9732039 0.9688274 0.9997074 -0.974882 0.9688274 0.9997074 -0.977005 0.9688274 0.9997074 -0.9796909 0.9688274 0.9997074 -0.983089 0.9688274 0.9997074 -0.9873879 0.9688274 0.9997074 -0.9928267 0.9688274 0.9997074 -0.9997074 0.9688274 0.9997074 -0.9997688 0.9748918 0.9942982 -0.9998174 0.979858 0.9920392 -0.9998557 0.9838928 0.9915316 -0.999886 0.9871512 0.9919377 -0.9999099 0.9897703 0.9927678 -0.9999288 0.991868 0.9937442 -0.9999437 0.9935432 0.9947172 -0.9668873 0.9693568 0.9997074 -0.9668872 0.9693566 0.9997074 -0.9668871 0.9693564 0.9997074 -0.966887 0.9693562 0.9997074 -0.9668869 0.9693559 0.9997074 -0.9668867 0.9693555 0.9997074 -0.9668865 0.969355 0.9997074 -0.9668862 0.9693545 0.9997074 -0.9668859 0.9693538 0.9997074 -0.9668855 0.9693529 0.9997074 -0.9668852 0.9693519 0.9997074 -0.9668848 0.9693507 0.9997074 -0.9668845 0.9693494 0.9997074 -0.9668844 0.969348 0.9997074 -0.9668847 0.9693466 0.9997074 -0.9668859 0.9693455 0.9997074 -0.9668884 0.9693452 0.9997074 -0.9668922 0.9693452 0.9997074 -0.9668969 0.9693452 0.9997074 -0.9669028 0.9693452 0.9997074 -0.9669103 0.9693452 0.9997074 -0.9669198 0.9693452 0.9997074 -0.9669318 0.9693452 0.9997074 -0.966947 0.9693452 0.9997074 -0.9669663 0.9693452 0.9997074 -0.9669906 0.9693452 0.9997074 -0.9670214 0.9693452 0.9997074 -0.9670604 0.9693452 0.9997074 -0.9671097 0.9693452 0.9997074 -0.967172 0.9693452 0.9997074 -0.9672509 0.9693452 0.9997074 -0.9673508 0.9693452 0.9997074 -0.967477 0.9693452 0.9997074 -0.9676368 0.9693452 0.9997074 -0.9678389 0.9693452 0.9997074 -0.9680946 0.9693452 0.9997074 -0.9684181 0.9693452 0.9997074 -0.9688274 0.9693452 0.9997074 -0.9693452 0.9693452 0.9997074 -0.9700002 0.9693452 0.9997074 -0.970829 0.9693452 0.9997074 -0.9718774 0.9693452 0.9997074 -0.9732039 0.9693452 0.9997074 -0.974882 0.9693452 0.9997074 -0.977005 0.9693452 0.9997074 -0.9796909 0.9693452 0.9997074 -0.983089 0.9693452 0.9997074 -0.9873879 0.9693452 0.9997074 -0.9928267 0.9693452 0.9997074 -0.9997074 0.9693452 0.9997074 -0.9997688 0.9752172 0.9942982 -0.9998174 0.9800622 0.9920392 -0.9998557 0.9840209 0.9915316 -0.999886 0.9872315 0.9919377 -0.9999099 0.9898206 0.9927678 -0.9999288 0.9918994 0.9937442 -0.9999437 0.9935629 0.9947172 -0.9668873 0.9700116 0.9997074 -0.9668872 0.9700114 0.9997074 -0.9668871 0.9700112 0.9997074 -0.966887 0.970011 0.9997074 -0.9668869 0.9700107 0.9997074 -0.9668867 0.9700103 0.9997074 -0.9668865 0.9700099 0.9997074 -0.9668862 0.9700093 0.9997074 -0.9668859 0.9700086 0.9997074 -0.9668855 0.9700078 0.9997074 -0.9668852 0.9700068 0.9997074 -0.9668848 0.9700057 0.9997074 -0.9668845 0.9700044 0.9997074 -0.9668844 0.970003 0.9997074 -0.9668847 0.9700016 0.9997074 -0.9668859 0.9700006 0.9997074 -0.9668884 0.9700002 0.9997074 -0.9668922 0.9700002 0.9997074 -0.9668969 0.9700002 0.9997074 -0.9669028 0.9700002 0.9997074 -0.9669103 0.9700002 0.9997074 -0.9669198 0.9700002 0.9997074 -0.9669318 0.9700002 0.9997074 -0.966947 0.9700002 0.9997074 -0.9669663 0.9700002 0.9997074 -0.9669906 0.9700002 0.9997074 -0.9670214 0.9700002 0.9997074 -0.9670604 0.9700002 0.9997074 -0.9671097 0.9700002 0.9997074 -0.967172 0.9700002 0.9997074 -0.9672509 0.9700002 0.9997074 -0.9673508 0.9700002 0.9997074 -0.967477 0.9700002 0.9997074 -0.9676368 0.9700002 0.9997074 -0.9678389 0.9700002 0.9997074 -0.9680946 0.9700002 0.9997074 -0.9684181 0.9700002 0.9997074 -0.9688274 0.9700002 0.9997074 -0.9693452 0.9700002 0.9997074 -0.9700002 0.9700002 0.9997074 -0.970829 0.9700002 0.9997074 -0.9718774 0.9700002 0.9997074 -0.9732039 0.9700002 0.9997074 -0.974882 0.9700002 0.9997074 -0.977005 0.9700002 0.9997074 -0.9796909 0.9700002 0.9997074 -0.983089 0.9700002 0.9997074 -0.9873879 0.9700002 0.9997074 -0.9928267 0.9700002 0.9997074 -0.9997074 0.9700002 0.9997074 -0.9997688 0.9756289 0.9942982 -0.9998174 0.9803206 0.9920392 -0.9998557 0.9841829 0.9915316 -0.999886 0.987333 0.9919377 -0.9999099 0.9898842 0.9927678 -0.9999288 0.9919392 0.9937442 -0.9999437 0.9935878 0.9947172 -0.9668873 0.97084 0.9997074 -0.9668872 0.9708399 0.9997074 -0.9668871 0.9708397 0.9997074 -0.966887 0.9708394 0.9997074 -0.9668869 0.9708392 0.9997074 -0.9668867 0.9708388 0.9997074 -0.9668865 0.9708384 0.9997074 -0.9668862 0.9708378 0.9997074 -0.9668859 0.9708371 0.9997074 -0.9668855 0.9708363 0.9997074 -0.9668852 0.9708354 0.9997074 -0.9668848 0.9708343 0.9997074 -0.9668845 0.970833 0.9997074 -0.9668844 0.9708317 0.9997074 -0.9668847 0.9708303 0.9997074 -0.9668859 0.9708293 0.9997074 -0.9668884 0.970829 0.9997074 -0.9668922 0.970829 0.9997074 -0.9668969 0.970829 0.9997074 -0.9669028 0.970829 0.9997074 -0.9669103 0.970829 0.9997074 -0.9669198 0.970829 0.9997074 -0.9669318 0.970829 0.9997074 -0.966947 0.970829 0.9997074 -0.9669663 0.970829 0.9997074 -0.9669906 0.970829 0.9997074 -0.9670214 0.970829 0.9997074 -0.9670604 0.970829 0.9997074 -0.9671097 0.970829 0.9997074 -0.967172 0.970829 0.9997074 -0.9672509 0.970829 0.9997074 -0.9673508 0.970829 0.9997074 -0.967477 0.970829 0.9997074 -0.9676368 0.970829 0.9997074 -0.9678389 0.970829 0.9997074 -0.9680946 0.970829 0.9997074 -0.9684181 0.970829 0.9997074 -0.9688274 0.970829 0.9997074 -0.9693452 0.970829 0.9997074 -0.9700002 0.970829 0.9997074 -0.970829 0.970829 0.9997074 -0.9718774 0.970829 0.9997074 -0.9732039 0.970829 0.9997074 -0.974882 0.970829 0.9997074 -0.977005 0.970829 0.9997074 -0.9796909 0.970829 0.9997074 -0.983089 0.970829 0.9997074 -0.9873879 0.970829 0.9997074 -0.9928267 0.970829 0.9997074 -0.9997074 0.970829 0.9997074 -0.9997688 0.9761497 0.9942982 -0.9998174 0.9806476 0.9920392 -0.9998557 0.984388 0.9915316 -0.999886 0.9874615 0.9919377 -0.9999099 0.9899646 0.9927678 -0.9999288 0.9919896 0.9937442 -0.9999437 0.9936193 0.9947172 -0.9668873 0.9718881 0.9997074 -0.9668872 0.9718879 0.9997074 -0.9668871 0.9718878 0.9997074 -0.966887 0.9718875 0.9997074 -0.9668869 0.9718873 0.9997074 -0.9668867 0.9718869 0.9997074 -0.9668865 0.9718865 0.9997074 -0.9668862 0.971886 0.9997074 -0.9668859 0.9718853 0.9997074 -0.9668855 0.9718845 0.9997074 -0.9668852 0.9718836 0.9997074 -0.9668848 0.9718825 0.9997074 -0.9668845 0.9718813 0.9997074 -0.9668844 0.97188 0.9997074 -0.9668847 0.9718787 0.9997074 -0.9668859 0.9718777 0.9997074 -0.9668884 0.9718774 0.9997074 -0.9668922 0.9718774 0.9997074 -0.9668969 0.9718774 0.9997074 -0.9669028 0.9718774 0.9997074 -0.9669103 0.9718774 0.9997074 -0.9669198 0.9718774 0.9997074 -0.9669318 0.9718774 0.9997074 -0.966947 0.9718774 0.9997074 -0.9669663 0.9718774 0.9997074 -0.9669906 0.9718774 0.9997074 -0.9670214 0.9718774 0.9997074 -0.9670604 0.9718774 0.9997074 -0.9671097 0.9718774 0.9997074 -0.967172 0.9718774 0.9997074 -0.9672509 0.9718774 0.9997074 -0.9673508 0.9718774 0.9997074 -0.967477 0.9718774 0.9997074 -0.9676368 0.9718774 0.9997074 -0.9678389 0.9718774 0.9997074 -0.9680946 0.9718774 0.9997074 -0.9684181 0.9718774 0.9997074 -0.9688274 0.9718774 0.9997074 -0.9693452 0.9718774 0.9997074 -0.9700002 0.9718774 0.9997074 -0.970829 0.9718774 0.9997074 -0.9718774 0.9718774 0.9997074 -0.9732039 0.9718774 0.9997074 -0.974882 0.9718774 0.9997074 -0.977005 0.9718774 0.9997074 -0.9796909 0.9718774 0.9997074 -0.983089 0.9718774 0.9997074 -0.9873879 0.9718774 0.9997074 -0.9928267 0.9718774 0.9997074 -0.9997074 0.9718774 0.9997074 -0.9997688 0.9768086 0.9942982 -0.9998174 0.9810611 0.9920392 -0.9998557 0.9846473 0.9915316 -0.999886 0.987624 0.9919377 -0.9999099 0.9900664 0.9927678 -0.9999288 0.9920533 0.9937442 -0.9999437 0.9936592 0.9947172 -0.9668873 0.973214 0.9997074 -0.9668872 0.9732139 0.9997074 -0.9668871 0.9732137 0.9997074 -0.966887 0.9732135 0.9997074 -0.9668869 0.9732132 0.9997074 -0.9668867 0.9732129 0.9997074 -0.9668865 0.9732125 0.9997074 -0.9668862 0.973212 0.9997074 -0.9668859 0.9732114 0.9997074 -0.9668855 0.9732106 0.9997074 -0.9668852 0.9732098 0.9997074 -0.9668848 0.9732087 0.9997074 -0.9668845 0.9732076 0.9997074 -0.9668844 0.9732063 0.9997074 -0.9668847 0.9732051 0.9997074 -0.9668859 0.9732042 0.9997074 -0.9668884 0.9732039 0.9997074 -0.9668922 0.9732039 0.9997074 -0.9668969 0.9732039 0.9997074 -0.9669028 0.9732039 0.9997074 -0.9669103 0.9732039 0.9997074 -0.9669198 0.9732039 0.9997074 -0.9669318 0.9732039 0.9997074 -0.966947 0.9732039 0.9997074 -0.9669663 0.9732039 0.9997074 -0.9669906 0.9732039 0.9997074 -0.9670214 0.9732039 0.9997074 -0.9670604 0.9732039 0.9997074 -0.9671097 0.9732039 0.9997074 -0.967172 0.9732039 0.9997074 -0.9672509 0.9732039 0.9997074 -0.9673508 0.9732039 0.9997074 -0.967477 0.9732039 0.9997074 -0.9676368 0.9732039 0.9997074 -0.9678389 0.9732039 0.9997074 -0.9680946 0.9732039 0.9997074 -0.9684181 0.9732039 0.9997074 -0.9688274 0.9732039 0.9997074 -0.9693452 0.9732039 0.9997074 -0.9700002 0.9732039 0.9997074 -0.970829 0.9732039 0.9997074 -0.9718774 0.9732039 0.9997074 -0.9732039 0.9732039 0.9997074 -0.974882 0.9732039 0.9997074 -0.977005 0.9732039 0.9997074 -0.9796909 0.9732039 0.9997074 -0.983089 0.9732039 0.9997074 -0.9873879 0.9732039 0.9997074 -0.9928267 0.9732039 0.9997074 -0.9997074 0.9732039 0.9997074 -0.9997688 0.9776422 0.9942982 -0.9998174 0.9815844 0.9920392 -0.9998557 0.9849754 0.9915316 -0.999886 0.9878296 0.9919377 -0.9999099 0.9901951 0.9927678 -0.9999288 0.9921339 0.9937442 -0.9999437 0.9937096 0.9947172 -0.9668873 0.9748915 0.9997074 -0.9668872 0.9748914 0.9997074 -0.9668871 0.9748912 0.9997074 -0.966887 0.974891 0.9997074 -0.9668869 0.9748908 0.9997074 -0.9668867 0.9748904 0.9997074 -0.9668865 0.9748901 0.9997074 -0.9668862 0.9748896 0.9997074 -0.9668859 0.974889 0.9997074 -0.9668855 0.9748883 0.9997074 -0.9668852 0.9748875 0.9997074 -0.9668848 0.9748865 0.9997074 -0.9668845 0.9748855 0.9997074 -0.9668844 0.9748843 0.9997074 -0.9668847 0.9748832 0.9997074 -0.9668859 0.9748823 0.9997074 -0.9668884 0.974882 0.9997074 -0.9668922 0.974882 0.9997074 -0.9668969 0.974882 0.9997074 -0.9669028 0.974882 0.9997074 -0.9669103 0.974882 0.9997074 -0.9669198 0.974882 0.9997074 -0.9669318 0.974882 0.9997074 -0.966947 0.974882 0.9997074 -0.9669663 0.974882 0.9997074 -0.9669906 0.974882 0.9997074 -0.9670214 0.974882 0.9997074 -0.9670604 0.974882 0.9997074 -0.9671097 0.974882 0.9997074 -0.967172 0.974882 0.9997074 -0.9672509 0.974882 0.9997074 -0.9673508 0.974882 0.9997074 -0.967477 0.974882 0.9997074 -0.9676368 0.974882 0.9997074 -0.9678389 0.974882 0.9997074 -0.9680946 0.974882 0.9997074 -0.9684181 0.974882 0.9997074 -0.9688274 0.974882 0.9997074 -0.9693452 0.974882 0.9997074 -0.9700002 0.974882 0.9997074 -0.970829 0.974882 0.9997074 -0.9718774 0.974882 0.9997074 -0.9732039 0.974882 0.9997074 -0.974882 0.974882 0.9997074 -0.977005 0.974882 0.9997074 -0.9796909 0.974882 0.9997074 -0.983089 0.974882 0.9997074 -0.9873879 0.974882 0.9997074 -0.9928267 0.974882 0.9997074 -0.9997074 0.974882 0.9997074 -0.9997688 0.9786968 0.9942982 -0.9998174 0.9822464 0.9920392 -0.9998557 0.9853905 0.9915316 -0.999886 0.9880897 0.9919377 -0.9999099 0.990358 0.9927678 -0.9999288 0.9922358 0.9937442 -0.9999437 0.9937734 0.9947172 -0.9668873 0.9770137 0.9997074 -0.9668872 0.9770136 0.9997074 -0.9668871 0.9770135 0.9997074 -0.966887 0.9770133 0.9997074 -0.9668869 0.977013 0.9997074 -0.9668867 0.9770128 0.9997074 -0.9668865 0.9770124 0.9997074 -0.9668862 0.977012 0.9997074 -0.9668859 0.9770115 0.9997074 -0.9668855 0.9770108 0.9997074 -0.9668852 0.9770101 0.9997074 -0.9668848 0.9770092 0.9997074 -0.9668845 0.9770082 0.9997074 -0.9668844 0.9770071 0.9997074 -0.9668847 0.9770061 0.9997074 -0.9668859 0.9770053 0.9997074 -0.9668884 0.977005 0.9997074 -0.9668922 0.977005 0.9997074 -0.9668969 0.977005 0.9997074 -0.9669028 0.977005 0.9997074 -0.9669103 0.977005 0.9997074 -0.9669198 0.977005 0.9997074 -0.9669318 0.977005 0.9997074 -0.966947 0.977005 0.9997074 -0.9669663 0.977005 0.9997074 -0.9669906 0.977005 0.9997074 -0.9670214 0.977005 0.9997074 -0.9670604 0.977005 0.9997074 -0.9671097 0.977005 0.9997074 -0.967172 0.977005 0.9997074 -0.9672509 0.977005 0.9997074 -0.9673508 0.977005 0.9997074 -0.967477 0.977005 0.9997074 -0.9676368 0.977005 0.9997074 -0.9678389 0.977005 0.9997074 -0.9680946 0.977005 0.9997074 -0.9684181 0.977005 0.9997074 -0.9688274 0.977005 0.9997074 -0.9693452 0.977005 0.9997074 -0.9700002 0.977005 0.9997074 -0.970829 0.977005 0.9997074 -0.9718774 0.977005 0.9997074 -0.9732039 0.977005 0.9997074 -0.974882 0.977005 0.9997074 -0.977005 0.977005 0.9997074 -0.9796909 0.977005 0.9997074 -0.983089 0.977005 0.9997074 -0.9873879 0.977005 0.9997074 -0.9928267 0.977005 0.9997074 -0.9997074 0.977005 0.9997074 -0.9997688 0.980031 0.9942982 -0.9998174 0.9830838 0.9920392 -0.9998557 0.9859157 0.9915316 -0.999886 0.9884188 0.9919377 -0.9999099 0.9905641 0.9927678 -0.9999288 0.9923648 0.9937442 -0.9999437 0.9938541 0.9947172 -0.9668873 0.9796986 0.9997074 -0.9668872 0.9796985 0.9997074 -0.9668871 0.9796984 0.9997074 -0.966887 0.9796982 0.9997074 -0.9668869 0.979698 0.9997074 -0.9668867 0.9796978 0.9997074 -0.9668865 0.9796975 0.9997074 -0.9668862 0.9796971 0.9997074 -0.9668859 0.9796966 0.9997074 -0.9668855 0.9796961 0.9997074 -0.9668852 0.9796954 0.9997074 -0.9668848 0.9796946 0.9997074 -0.9668845 0.9796937 0.9997074 -0.9668844 0.9796928 0.9997074 -0.9668847 0.9796919 0.9997074 -0.9668859 0.9796912 0.9997074 -0.9668884 0.9796909 0.9997074 -0.9668922 0.9796909 0.9997074 -0.9668969 0.9796909 0.9997074 -0.9669028 0.9796909 0.9997074 -0.9669103 0.9796909 0.9997074 -0.9669198 0.9796909 0.9997074 -0.9669318 0.9796909 0.9997074 -0.966947 0.9796909 0.9997074 -0.9669663 0.9796909 0.9997074 -0.9669906 0.9796909 0.9997074 -0.9670214 0.9796909 0.9997074 -0.9670604 0.9796909 0.9997074 -0.9671097 0.9796909 0.9997074 -0.967172 0.9796909 0.9997074 -0.9672509 0.9796909 0.9997074 -0.9673508 0.9796909 0.9997074 -0.967477 0.9796909 0.9997074 -0.9676368 0.9796909 0.9997074 -0.9678389 0.9796909 0.9997074 -0.9680946 0.9796909 0.9997074 -0.9684181 0.9796909 0.9997074 -0.9688274 0.9796909 0.9997074 -0.9693452 0.9796909 0.9997074 -0.9700002 0.9796909 0.9997074 -0.970829 0.9796909 0.9997074 -0.9718774 0.9796909 0.9997074 -0.9732039 0.9796909 0.9997074 -0.974882 0.9796909 0.9997074 -0.977005 0.9796909 0.9997074 -0.9796909 0.9796909 0.9997074 -0.983089 0.9796909 0.9997074 -0.9873879 0.9796909 0.9997074 -0.9928267 0.9796909 0.9997074 -0.9997074 0.9796909 0.9997074 -0.9997688 0.981719 0.9942982 -0.9998174 0.9841433 0.9920392 -0.9998557 0.9865801 0.9915316 -0.999886 0.9888351 0.9919377 -0.9999099 0.9908248 0.9927678 -0.9999288 0.992528 0.9937442 -0.9999437 0.9939562 0.9947172 -0.9668873 0.9830954 0.9997074 -0.9668872 0.9830953 0.9997074 -0.9668871 0.9830952 0.9997074 -0.966887 0.983095 0.9997074 -0.9668869 0.9830949 0.9997074 -0.9668867 0.9830947 0.9997074 -0.9668865 0.9830944 0.9997074 -0.9668862 0.9830941 0.9997074 -0.9668859 0.9830937 0.9997074 -0.9668855 0.9830932 0.9997074 -0.9668852 0.9830927 0.9997074 -0.9668848 0.983092 0.9997074 -0.9668845 0.9830913 0.9997074 -0.9668844 0.9830905 0.9997074 -0.9668847 0.9830898 0.9997074 -0.9668859 0.9830892 0.9997074 -0.9668884 0.983089 0.9997074 -0.9668922 0.983089 0.9997074 -0.9668969 0.983089 0.9997074 -0.9669028 0.983089 0.9997074 -0.9669103 0.983089 0.9997074 -0.9669198 0.983089 0.9997074 -0.9669318 0.983089 0.9997074 -0.966947 0.983089 0.9997074 -0.9669663 0.983089 0.9997074 -0.9669906 0.983089 0.9997074 -0.9670214 0.983089 0.9997074 -0.9670604 0.983089 0.9997074 -0.9671097 0.983089 0.9997074 -0.967172 0.983089 0.9997074 -0.9672509 0.983089 0.9997074 -0.9673508 0.983089 0.9997074 -0.967477 0.983089 0.9997074 -0.9676368 0.983089 0.9997074 -0.9678389 0.983089 0.9997074 -0.9680946 0.983089 0.9997074 -0.9684181 0.983089 0.9997074 -0.9688274 0.983089 0.9997074 -0.9693452 0.983089 0.9997074 -0.9700002 0.983089 0.9997074 -0.970829 0.983089 0.9997074 -0.9718774 0.983089 0.9997074 -0.9732039 0.983089 0.9997074 -0.974882 0.983089 0.9997074 -0.977005 0.983089 0.9997074 -0.9796909 0.983089 0.9997074 -0.983089 0.983089 0.9997074 -0.9873879 0.983089 0.9997074 -0.9928267 0.983089 0.9997074 -0.9997074 0.983089 0.9997074 -0.9997688 0.9838545 0.9942982 -0.9998174 0.9854838 0.9920392 -0.9998557 0.9874207 0.9915316 -0.999886 0.9893618 0.9919377 -0.9999099 0.9911547 0.9927678 -0.9999288 0.9927345 0.9937442 -0.9999437 0.9940854 0.9947172 -0.9668873 0.9873927 0.9997074 -0.9668872 0.9873926 0.9997074 -0.9668871 0.9873925 0.9997074 -0.966887 0.9873924 0.9997074 -0.9668869 0.9873923 0.9997074 -0.9668867 0.9873922 0.9997074 -0.9668865 0.987392 0.9997074 -0.9668862 0.9873917 0.9997074 -0.9668859 0.9873914 0.9997074 -0.9668855 0.9873911 0.9997074 -0.9668852 0.9873907 0.9997074 -0.9668848 0.9873902 0.9997074 -0.9668845 0.9873897 0.9997074 -0.9668844 0.9873891 0.9997074 -0.9668847 0.9873885 0.9997074 -0.9668859 0.9873881 0.9997074 -0.9668884 0.9873879 0.9997074 -0.9668922 0.9873879 0.9997074 -0.9668969 0.9873879 0.9997074 -0.9669028 0.9873879 0.9997074 -0.9669103 0.9873879 0.9997074 -0.9669198 0.9873879 0.9997074 -0.9669318 0.9873879 0.9997074 -0.966947 0.9873879 0.9997074 -0.9669663 0.9873879 0.9997074 -0.9669906 0.9873879 0.9997074 -0.9670214 0.9873879 0.9997074 -0.9670604 0.9873879 0.9997074 -0.9671097 0.9873879 0.9997074 -0.967172 0.9873879 0.9997074 -0.9672509 0.9873879 0.9997074 -0.9673508 0.9873879 0.9997074 -0.967477 0.9873879 0.9997074 -0.9676368 0.9873879 0.9997074 -0.9678389 0.9873879 0.9997074 -0.9680946 0.9873879 0.9997074 -0.9684181 0.9873879 0.9997074 -0.9688274 0.9873879 0.9997074 -0.9693452 0.9873879 0.9997074 -0.9700002 0.9873879 0.9997074 -0.970829 0.9873879 0.9997074 -0.9718774 0.9873879 0.9997074 -0.9732039 0.9873879 0.9997074 -0.974882 0.9873879 0.9997074 -0.977005 0.9873879 0.9997074 -0.9796909 0.9873879 0.9997074 -0.983089 0.9873879 0.9997074 -0.9873879 0.9873879 0.9997074 -0.9928267 0.9873879 0.9997074 -0.9997074 0.9873879 0.9997074 -0.9997688 0.9865561 0.9942982 -0.9998174 0.9871796 0.9920392 -0.9998557 0.9884841 0.9915316 -0.999886 0.9900282 0.9919377 -0.9999099 0.991572 0.9927678 -0.9999288 0.9929957 0.9937442 -0.9999437 0.9942488 0.9947172 -0.9668873 0.9928293 0.9997074 -0.9668872 0.9928293 0.9997074 -0.9668871 0.9928293 0.9997074 -0.966887 0.9928292 0.9997074 -0.9668869 0.9928291 0.9997074 -0.9668867 0.9928291 0.9997074 -0.9668865 0.9928289 0.9997074 -0.9668862 0.9928288 0.9997074 -0.9668859 0.9928287 0.9997074 -0.9668855 0.9928285 0.9997074 -0.9668852 0.9928282 0.9997074 -0.9668848 0.992828 0.9997074 -0.9668845 0.9928276 0.9997074 -0.9668844 0.9928273 0.9997074 -0.9668847 0.992827 0.9997074 -0.9668859 0.9928267 0.9997074 -0.9668884 0.9928267 0.9997074 -0.9668922 0.9928267 0.9997074 -0.9668969 0.9928267 0.9997074 -0.9669028 0.9928267 0.9997074 -0.9669103 0.9928267 0.9997074 -0.9669198 0.9928267 0.9997074 -0.9669318 0.9928267 0.9997074 -0.966947 0.9928267 0.9997074 -0.9669663 0.9928267 0.9997074 -0.9669906 0.9928267 0.9997074 -0.9670214 0.9928267 0.9997074 -0.9670604 0.9928267 0.9997074 -0.9671097 0.9928267 0.9997074 -0.967172 0.9928267 0.9997074 -0.9672509 0.9928267 0.9997074 -0.9673508 0.9928267 0.9997074 -0.967477 0.9928267 0.9997074 -0.9676368 0.9928267 0.9997074 -0.9678389 0.9928267 0.9997074 -0.9680946 0.9928267 0.9997074 -0.9684181 0.9928267 0.9997074 -0.9688274 0.9928267 0.9997074 -0.9693452 0.9928267 0.9997074 -0.9700002 0.9928267 0.9997074 -0.970829 0.9928267 0.9997074 -0.9718774 0.9928267 0.9997074 -0.9732039 0.9928267 0.9997074 -0.974882 0.9928267 0.9997074 -0.977005 0.9928267 0.9997074 -0.9796909 0.9928267 0.9997074 -0.983089 0.9928267 0.9997074 -0.9873879 0.9928267 0.9997074 -0.9928267 0.9928267 0.9997074 -0.9997074 0.9928267 0.9997074 -0.9997688 0.9899741 0.9942982 -0.9998174 0.989325 0.9920392 -0.9998557 0.9898295 0.9915316 -0.999886 0.9908712 0.9919377 -0.9999099 0.9920999 0.9927678 -0.9999288 0.9933261 0.9937442 -0.9999437 0.9944556 0.9947172 -0.9668873 0.9997074 0.9997074 -0.9668872 0.9997074 0.9997074 -0.9668871 0.9997074 0.9997074 -0.966887 0.9997074 0.9997074 -0.9668869 0.9997074 0.9997074 -0.9668867 0.9997074 0.9997074 -0.9668865 0.9997074 0.9997074 -0.9668862 0.9997074 0.9997074 -0.9668859 0.9997074 0.9997074 -0.9668855 0.9997074 0.9997074 -0.9668852 0.9997074 0.9997074 -0.9668848 0.9997074 0.9997074 -0.9668845 0.9997074 0.9997074 -0.9668844 0.9997074 0.9997074 -0.9668847 0.9997074 0.9997074 -0.9668859 0.9997074 0.9997074 -0.9668884 0.9997074 0.9997074 -0.9668922 0.9997074 0.9997074 -0.9668969 0.9997074 0.9997074 -0.9669028 0.9997074 0.9997074 -0.9669103 0.9997074 0.9997074 -0.9669198 0.9997074 0.9997074 -0.9669318 0.9997074 0.9997074 -0.966947 0.9997074 0.9997074 -0.9669663 0.9997074 0.9997074 -0.9669906 0.9997074 0.9997074 -0.9670214 0.9997074 0.9997074 -0.9670604 0.9997074 0.9997074 -0.9671097 0.9997074 0.9997074 -0.967172 0.9997074 0.9997074 -0.9672509 0.9997074 0.9997074 -0.9673508 0.9997074 0.9997074 -0.967477 0.9997074 0.9997074 -0.9676368 0.9997074 0.9997074 -0.9678389 0.9997074 0.9997074 -0.9680946 0.9997074 0.9997074 -0.9684181 0.9997074 0.9997074 -0.9688274 0.9997074 0.9997074 -0.9693452 0.9997074 0.9997074 -0.9700002 0.9997074 0.9997074 -0.970829 0.9997074 0.9997074 -0.9718774 0.9997074 0.9997074 -0.9732039 0.9997074 0.9997074 -0.974882 0.9997074 0.9997074 -0.977005 0.9997074 0.9997074 -0.9796909 0.9997074 0.9997074 -0.983089 0.9997074 0.9997074 -0.9873879 0.9997074 0.9997074 -0.9928267 0.9997074 0.9997074 -0.9997074 0.9997074 0.9997074 -0.9997688 0.9942982 0.9942982 -0.9998174 0.9920392 0.9920392 -0.9998557 0.9915316 0.9915316 -0.999886 0.9919377 0.9919377 -0.9999099 0.9927678 0.9927678 -0.9999288 0.9937442 0.9937442 -0.9999437 0.9947172 0.9947172 -0.9736726 0.9997689 0.9942999 -0.9736726 0.9997689 0.9942999 -0.9736725 0.9997689 0.9942999 -0.9736724 0.9997689 0.9942998 -0.9736723 0.9997689 0.9942998 -0.9736722 0.9997689 0.9942997 -0.9736721 0.9997689 0.9942997 -0.9736719 0.9997689 0.9942996 -0.9736717 0.9997689 0.9942995 -0.9736715 0.9997689 0.9942993 -0.9736712 0.9997689 0.9942992 -0.973671 0.9997689 0.994299 -0.9736708 0.9997689 0.9942988 -0.9736708 0.9997689 0.9942986 -0.973671 0.9997688 0.9942984 -0.9736717 0.9997688 0.9942983 -0.9736733 0.9997688 0.9942982 -0.9736756 0.9997688 0.9942982 -0.9736786 0.9997688 0.9942982 -0.9736823 0.9997688 0.9942982 -0.973687 0.9997688 0.9942982 -0.973693 0.9997688 0.9942982 -0.9737006 0.9997688 0.9942982 -0.9737101 0.9997688 0.9942982 -0.9737222 0.9997688 0.9942982 -0.9737375 0.9997688 0.9942982 -0.9737569 0.9997688 0.9942982 -0.9737814 0.9997688 0.9942982 -0.9738123 0.9997688 0.9942982 -0.9738515 0.9997688 0.9942982 -0.9739011 0.9997688 0.9942982 -0.9739638 0.9997688 0.9942982 -0.9740432 0.9997688 0.9942982 -0.9741436 0.9997688 0.9942982 -0.9742706 0.9997688 0.9942982 -0.9744313 0.9997688 0.9942982 -0.9746346 0.9997688 0.9942982 -0.9748918 0.9997688 0.9942982 -0.9752172 0.9997688 0.9942982 -0.9756289 0.9997688 0.9942982 -0.9761497 0.9997688 0.9942982 -0.9768086 0.9997688 0.9942982 -0.9776422 0.9997688 0.9942982 -0.9786968 0.9997688 0.9942982 -0.980031 0.9997688 0.9942982 -0.981719 0.9997688 0.9942982 -0.9838545 0.9997688 0.9942982 -0.9865561 0.9997688 0.9942982 -0.9899741 0.9997688 0.9942982 -0.9942982 0.9997688 0.9942982 -0.9997688 0.9997688 0.9942982 -0.9998174 0.9954731 0.9920392 -0.9998557 0.9936849 0.9915316 -0.999886 0.993287 0.9919377 -0.9999099 0.9936128 0.9927678 -0.9999288 0.9942731 0.9937442 -0.9999437 0.9950481 0.9947172 -0.9790927 0.9998174 0.9920411 -0.9790927 0.9998174 0.9920411 -0.9790927 0.9998174 0.9920411 -0.9790926 0.9998174 0.992041 -0.9790925 0.9998174 0.992041 -0.9790925 0.9998174 0.9920409 -0.9790924 0.9998174 0.9920408 -0.9790923 0.9998174 0.9920407 -0.9790921 0.9998174 0.9920406 -0.979092 0.9998174 0.9920405 -0.9790919 0.9998174 0.9920403 -0.9790917 0.9998174 0.9920401 -0.9790916 0.9998174 0.9920399 -0.9790916 0.9998174 0.9920397 -0.9790917 0.9998174 0.9920395 -0.9790921 0.9998174 0.9920393 -0.9790931 0.9998174 0.9920392 -0.9790946 0.9998174 0.9920392 -0.9790965 0.9998174 0.9920392 -0.9790988 0.9998174 0.9920392 -0.9791018 0.9998174 0.9920392 -0.9791055 0.9998174 0.9920392 -0.9791103 0.9998174 0.9920392 -0.9791163 0.9998174 0.9920392 -0.9791238 0.9998174 0.9920392 -0.9791334 0.9998174 0.9920392 -0.9791456 0.9998174 0.9920392 -0.979161 0.9998174 0.9920392 -0.9791804 0.9998174 0.9920392 -0.979205 0.9998174 0.9920392 -0.9792361 0.9998174 0.9920392 -0.9792755 0.9998174 0.9920392 -0.9793253 0.9998174 0.9920392 -0.9793883 0.9998174 0.9920392 -0.9794681 0.9998174 0.9920392 -0.9795689 0.9998174 0.9920392 -0.9796966 0.9998174 0.9920392 -0.979858 0.9998174 0.9920392 -0.9800622 0.9998174 0.9920392 -0.9803206 0.9998174 0.9920392 -0.9806476 0.9998174 0.9920392 -0.9810611 0.9998174 0.9920392 -0.9815844 0.9998174 0.9920392 -0.9822464 0.9998174 0.9920392 -0.9830838 0.9998174 0.9920392 -0.9841433 0.9998174 0.9920392 -0.9854838 0.9998174 0.9920392 -0.9871796 0.9998174 0.9920392 -0.989325 0.9998174 0.9920392 -0.9920392 0.9998174 0.9920392 -0.9954731 0.9998174 0.9920392 -0.9998174 0.9998174 0.9920392 -0.9998557 0.9964092 0.9915316 -0.999886 0.9949941 0.9919377 -0.9999099 0.9946818 0.9927678 -0.9999288 0.9949422 0.9937442 -0.9999437 0.9954668 0.9947172 -0.9834129 0.9998557 0.9915331 -0.9834129 0.9998557 0.9915331 -0.9834129 0.9998557 0.9915331 -0.9834129 0.9998557 0.9915331 -0.9834128 0.9998557 0.991533 -0.9834128 0.9998557 0.991533 -0.9834127 0.9998557 0.9915329 -0.9834127 0.9998557 0.9915328 -0.9834126 0.9998557 0.9915327 -0.9834125 0.9998557 0.9915326 -0.9834124 0.9998557 0.9915325 -0.9834123 0.9998557 0.9915323 -0.9834122 0.9998557 0.9915321 -0.9834122 0.9998557 0.9915319 -0.9834123 0.9998557 0.9915318 -0.9834126 0.9998557 0.9915316 -0.9834132 0.9998557 0.9915316 -0.9834141 0.9998557 0.9915316 -0.9834153 0.9998557 0.9915316 -0.9834167 0.9998557 0.9915316 -0.9834186 0.9998557 0.9915316 -0.9834209 0.9998557 0.9915316 -0.9834239 0.9998557 0.9915316 -0.9834277 0.9998557 0.9915316 -0.9834324 0.9998557 0.9915316 -0.9834385 0.9998557 0.9915316 -0.9834461 0.9998557 0.9915316 -0.9834557 0.9998557 0.9915316 -0.9834679 0.9998557 0.9915316 -0.9834833 0.9998557 0.9915316 -0.9835029 0.9998557 0.9915316 -0.9835276 0.9998557 0.9915316 -0.9835588 0.9998557 0.9915316 -0.9835983 0.9998557 0.9915316 -0.9836483 0.9998557 0.9915316 -0.9837116 0.9998557 0.9915316 -0.9837916 0.9998557 0.9915316 -0.9838928 0.9998557 0.9915316 -0.9840209 0.9998557 0.9915316 -0.9841829 0.9998557 0.9915316 -0.984388 0.9998557 0.9915316 -0.9846473 0.9998557 0.9915316 -0.9849754 0.9998557 0.9915316 -0.9853905 0.9998557 0.9915316 -0.9859157 0.9998557 0.9915316 -0.9865801 0.9998557 0.9915316 -0.9874207 0.9998557 0.9915316 -0.9884841 0.9998557 0.9915316 -0.9898295 0.9998557 0.9915316 -0.9915316 0.9998557 0.9915316 -0.9936849 0.9998557 0.9915316 -0.9964092 0.9998557 0.9915316 -0.9998557 0.9998557 0.9915316 -0.999886 0.9971537 0.9919377 -0.9999099 0.9960342 0.9927678 -0.9999288 0.9957887 0.9937442 -0.9999437 0.9959964 0.9947172 -0.9868505 0.999886 0.9919389 -0.9868505 0.999886 0.9919389 -0.9868505 0.999886 0.9919389 -0.9868505 0.999886 0.9919389 -0.9868504 0.999886 0.9919388 -0.9868504 0.999886 0.9919388 -0.9868504 0.999886 0.9919388 -0.9868503 0.999886 0.9919387 -0.9868503 0.999886 0.9919386 -0.9868502 0.999886 0.9919385 -0.9868502 0.999886 0.9919384 -0.9868501 0.999886 0.9919383 -0.9868501 0.999886 0.9919382 -0.98685 0.999886 0.991938 -0.9868501 0.999886 0.9919379 -0.9868503 0.999886 0.9919378 -0.9868507 0.999886 0.9919377 -0.9868512 0.999886 0.9919377 -0.986852 0.999886 0.9919377 -0.9868529 0.999886 0.9919377 -0.9868541 0.999886 0.9919377 -0.9868555 0.999886 0.9919377 -0.9868574 0.999886 0.9919377 -0.9868597 0.999886 0.9919377 -0.9868627 0.999886 0.9919377 -0.9868665 0.999886 0.9919377 -0.9868713 0.999886 0.9919377 -0.9868773 0.999886 0.9919377 -0.986885 0.999886 0.9919377 -0.9868946 0.999886 0.9919377 -0.9869069 0.999886 0.9919377 -0.9869223 0.999886 0.9919377 -0.9869419 0.999886 0.9919377 -0.9869667 0.999886 0.9919377 -0.986998 0.999886 0.9919377 -0.9870376 0.999886 0.9919377 -0.9870878 0.999886 0.9919377 -0.9871512 0.999886 0.9919377 -0.9872315 0.999886 0.9919377 -0.987333 0.999886 0.9919377 -0.9874615 0.999886 0.9919377 -0.987624 0.999886 0.9919377 -0.9878296 0.999886 0.9919377 -0.9880897 0.999886 0.9919377 -0.9884188 0.999886 0.9919377 -0.9888351 0.999886 0.9919377 -0.9893618 0.999886 0.9919377 -0.9900282 0.999886 0.9919377 -0.9908712 0.999886 0.9919377 -0.9919377 0.999886 0.9919377 -0.993287 0.999886 0.9919377 -0.9949941 0.999886 0.9919377 -0.9971537 0.999886 0.9919377 -0.999886 0.999886 0.9919377 -0.9999099 0.9977452 0.9927678 -0.9999288 0.9968597 0.9937442 -0.9999437 0.9966665 0.9947172 -0.989582 0.9999099 0.9927686 -0.989582 0.9999099 0.9927686 -0.989582 0.9999099 0.9927686 -0.989582 0.9999099 0.9927686 -0.989582 0.9999099 0.9927686 -0.9895819 0.9999099 0.9927686 -0.9895819 0.9999099 0.9927685 -0.9895819 0.9999099 0.9927685 -0.9895819 0.9999099 0.9927684 -0.9895818 0.9999099 0.9927684 -0.9895818 0.9999099 0.9927683 -0.9895818 0.9999099 0.9927682 -0.9895817 0.9999099 0.9927681 -0.9895817 0.9999099 0.992768 -0.9895817 0.9999099 0.9927679 -0.9895819 0.9999099 0.9927678 -0.9895821 0.9999099 0.9927678 -0.9895825 0.9999099 0.9927678 -0.9895829 0.9999099 0.9927678 -0.9895835 0.9999099 0.9927678 -0.9895842 0.9999099 0.9927678 -0.9895851 0.9999099 0.9927678 -0.9895863 0.9999099 0.9927678 -0.9895878 0.9999099 0.9927678 -0.9895897 0.9999099 0.9927678 -0.989592 0.9999099 0.9927678 -0.989595 0.9999099 0.9927678 -0.9895988 0.9999099 0.9927678 -0.9896036 0.9999099 0.9927678 -0.9896096 0.9999099 0.9927678 -0.9896173 0.9999099 0.9927678 -0.989627 0.9999099 0.9927678 -0.9896392 0.9999099 0.9927678 -0.9896547 0.9999099 0.9927678 -0.9896744 0.9999099 0.9927678 -0.9896992 0.9999099 0.9927678 -0.9897306 0.9999099 0.9927678 -0.9897703 0.9999099 0.9927678 -0.9898206 0.9999099 0.9927678 -0.9898842 0.9999099 0.9927678 -0.9899646 0.9999099 0.9927678 -0.9900664 0.9999099 0.9927678 -0.9901951 0.9999099 0.9927678 -0.990358 0.9999099 0.9927678 -0.9905641 0.9999099 0.9927678 -0.9908248 0.9999099 0.9927678 -0.9911547 0.9999099 0.9927678 -0.991572 0.9999099 0.9927678 -0.9920999 0.9999099 0.9927678 -0.9927678 0.9999099 0.9927678 -0.9936128 0.9999099 0.9927678 -0.9946818 0.9999099 0.9927678 -0.9960342 0.9999099 0.9927678 -0.9977452 0.9999099 0.9927678 -0.9999099 0.9999099 0.9927678 -0.9999288 0.9982146 0.9937442 -0.9999437 0.9975143 0.9947172 -0.9917501 0.9999288 0.9937448 -0.9917501 0.9999288 0.9937448 -0.9917501 0.9999288 0.9937447 -0.9917501 0.9999288 0.9937447 -0.9917501 0.9999288 0.9937447 -0.9917501 0.9999288 0.9937447 -0.99175 0.9999288 0.9937447 -0.99175 0.9999288 0.9937446 -0.99175 0.9999288 0.9937446 -0.99175 0.9999288 0.9937446 -0.99175 0.9999288 0.9937445 -0.9917499 0.9999288 0.9937445 -0.9917499 0.9999288 0.9937444 -0.9917499 0.9999288 0.9937443 -0.9917499 0.9999288 0.9937442 -0.99175 0.9999288 0.9937442 -0.9917502 0.9999288 0.9937442 -0.9917504 0.9999288 0.9937442 -0.9917507 0.9999288 0.9937442 -0.991751 0.9999288 0.9937442 -0.9917515 0.9999288 0.9937442 -0.9917521 0.9999288 0.9937442 -0.9917528 0.9999288 0.9937442 -0.9917537 0.9999288 0.9937442 -0.9917549 0.9999288 0.9937442 -0.9917564 0.9999288 0.9937442 -0.9917582 0.9999288 0.9937442 -0.9917606 0.9999288 0.9937442 -0.9917636 0.9999288 0.9937442 -0.9917674 0.9999288 0.9937442 -0.9917722 0.9999288 0.9937442 -0.9917782 0.9999288 0.9937442 -0.9917859 0.9999288 0.9937442 -0.9917956 0.9999288 0.9937442 -0.9918079 0.9999288 0.9937442 -0.9918234 0.9999288 0.9937442 -0.9918431 0.9999288 0.9937442 -0.991868 0.9999288 0.9937442 -0.9918994 0.9999288 0.9937442 -0.9919392 0.9999288 0.9937442 -0.9919896 0.9999288 0.9937442 -0.9920533 0.9999288 0.9937442 -0.9921339 0.9999288 0.9937442 -0.9922358 0.9999288 0.9937442 -0.9923648 0.9999288 0.9937442 -0.992528 0.9999288 0.9937442 -0.9927345 0.9999288 0.9937442 -0.9929957 0.9999288 0.9937442 -0.9933261 0.9999288 0.9937442 -0.9937442 0.9999288 0.9937442 -0.9942731 0.9999288 0.9937442 -0.9949422 0.9999288 0.9937442 -0.9957887 0.9999288 0.9937442 -0.9968597 0.9999288 0.9937442 -0.9982146 0.9999288 0.9937442 -0.9999288 0.9999288 0.9937442 -0.9999437 0.9985868 0.9947172 -0.9934695 0.9999437 0.9947176 -0.9934695 0.9999437 0.9947176 -0.9934695 0.9999437 0.9947175 -0.9934695 0.9999437 0.9947175 -0.9934695 0.9999437 0.9947175 -0.9934695 0.9999437 0.9947175 -0.9934695 0.9999437 0.9947175 -0.9934694 0.9999437 0.9947175 -0.9934694 0.9999437 0.9947175 -0.9934694 0.9999437 0.9947174 -0.9934694 0.9999437 0.9947174 -0.9934694 0.9999437 0.9947174 -0.9934694 0.9999437 0.9947173 -0.9934694 0.9999437 0.9947173 -0.9934694 0.9999437 0.9947172 -0.9934694 0.9999437 0.9947172 -0.9934695 0.9999437 0.9947172 -0.9934697 0.9999437 0.9947172 -0.9934698 0.9999437 0.9947172 -0.9934701 0.9999437 0.9947172 -0.9934704 0.9999437 0.9947172 -0.9934707 0.9999437 0.9947172 -0.9934712 0.9999437 0.9947172 -0.9934718 0.9999437 0.9947172 -0.9934725 0.9999437 0.9947172 -0.9934734 0.9999437 0.9947172 -0.9934746 0.9999437 0.9947172 -0.9934761 0.9999437 0.9947172 -0.9934779 0.9999437 0.9947172 -0.9934803 0.9999437 0.9947172 -0.9934833 0.9999437 0.9947172 -0.9934871 0.9999437 0.9947172 -0.9934919 0.9999437 0.9947172 -0.993498 0.9999437 0.9947172 -0.9935057 0.9999437 0.9947172 -0.9935154 0.9999437 0.9947172 -0.9935277 0.9999437 0.9947172 -0.9935432 0.9999437 0.9947172 -0.9935629 0.9999437 0.9947172 -0.9935878 0.9999437 0.9947172 -0.9936193 0.9999437 0.9947172 -0.9936592 0.9999437 0.9947172 -0.9937096 0.9999437 0.9947172 -0.9937734 0.9999437 0.9947172 -0.9938541 0.9999437 0.9947172 -0.9939562 0.9999437 0.9947172 -0.9940854 0.9999437 0.9947172 -0.9942488 0.9999437 0.9947172 -0.9944556 0.9999437 0.9947172 -0.9947172 0.9999437 0.9947172 -0.9950481 0.9999437 0.9947172 -0.9954668 0.9999437 0.9947172 -0.9959964 0.9999437 0.9947172 -0.9966665 0.9999437 0.9947172 -0.9975143 0.9999437 0.9947172 -0.9985868 0.9999437 0.9947172 -0.9999437 0.9999437 0.9947172 -0.9736726 0.9736726 0.9997689 -0.9736727 0.9736726 0.9997689 -0.9736727 0.9736726 0.9997689 -0.9736728 0.9736726 0.9997689 -0.9736729 0.9736726 0.9997689 -0.9736731 0.9736726 0.9997689 -0.9736733 0.9736726 0.9997689 -0.9736735 0.9736726 0.9997689 -0.9736738 0.9736726 0.9997689 -0.9736741 0.9736726 0.9997689 -0.9736746 0.9736726 0.9997689 -0.9736751 0.9736726 0.9997689 -0.9736758 0.9736726 0.9997689 -0.9736768 0.9736726 0.9997689 -0.9736779 0.9736726 0.9997689 -0.9736794 0.9736726 0.9997689 -0.9736812 0.9736726 0.9997689 -0.9736835 0.9736726 0.9997689 -0.9736865 0.9736726 0.9997689 -0.9736902 0.9736726 0.9997689 -0.9736949 0.9736726 0.9997689 -0.9737009 0.9736726 0.9997689 -0.9737085 0.9736726 0.9997689 -0.973718 0.9736726 0.9997689 -0.9737301 0.9736726 0.9997689 -0.9737454 0.9736726 0.9997689 -0.9737647 0.9736726 0.9997689 -0.9737892 0.9736726 0.9997689 -0.9738202 0.9736726 0.9997689 -0.9738594 0.9736726 0.9997689 -0.9739089 0.9736726 0.9997689 -0.9739717 0.9736726 0.9997689 -0.974051 0.9736726 0.9997689 -0.9741514 0.9736726 0.9997689 -0.9742783 0.9736726 0.9997689 -0.974439 0.9736726 0.9997689 -0.9746422 0.9736726 0.9997689 -0.9748994 0.9736726 0.9997689 -0.9752247 0.9736726 0.9997689 -0.9756362 0.9736726 0.9997689 -0.9761569 0.9736726 0.9997689 -0.9768156 0.9736726 0.9997689 -0.9776489 0.9736726 0.9997689 -0.9787032 0.9736726 0.9997689 -0.980037 0.9736726 0.9997689 -0.9817245 0.9736726 0.9997689 -0.9838593 0.9736726 0.9997689 -0.9865601 0.9736726 0.9997689 -0.9899771 0.9736726 0.9997689 -0.9942999 0.9736726 0.9997689 -0.9997689 0.9736726 0.9997689 -0.9998174 0.9790927 0.9954742 -0.9998557 0.9834129 0.9936861 -0.999886 0.9868505 0.993288 -0.9999099 0.989582 0.9936135 -0.9999288 0.9917501 0.9942736 -0.9999437 0.9934695 0.9950485 -0.9736726 0.9736727 0.9997689 -0.9736726 0.9736726 0.9997689 -0.9736726 0.9736726 0.9997689 -0.9736727 0.9736726 0.9997689 -0.9736728 0.9736726 0.9997689 -0.973673 0.9736726 0.9997689 -0.9736731 0.9736726 0.9997689 -0.9736734 0.9736726 0.9997689 -0.9736737 0.9736726 0.9997689 -0.973674 0.9736726 0.9997689 -0.9736745 0.9736726 0.9997689 -0.973675 0.9736726 0.9997689 -0.9736757 0.9736726 0.9997689 -0.9736767 0.9736726 0.9997689 -0.9736778 0.9736726 0.9997689 -0.9736793 0.9736726 0.9997689 -0.9736811 0.9736726 0.9997689 -0.9736834 0.9736726 0.9997689 -0.9736864 0.9736726 0.9997689 -0.9736901 0.9736726 0.9997689 -0.9736948 0.9736726 0.9997689 -0.9737008 0.9736726 0.9997689 -0.9737084 0.9736726 0.9997689 -0.9737179 0.9736726 0.9997689 -0.97373 0.9736726 0.9997689 -0.9737453 0.9736726 0.9997689 -0.9737646 0.9736726 0.9997689 -0.9737891 0.9736726 0.9997689 -0.9738201 0.9736726 0.9997689 -0.9738593 0.9736726 0.9997689 -0.9739088 0.9736726 0.9997689 -0.9739715 0.9736726 0.9997689 -0.9740509 0.9736726 0.9997689 -0.9741513 0.9736726 0.9997689 -0.9742782 0.9736726 0.9997689 -0.9744389 0.9736726 0.9997689 -0.9746421 0.9736726 0.9997689 -0.9748993 0.9736726 0.9997689 -0.9752246 0.9736726 0.9997689 -0.9756361 0.9736726 0.9997689 -0.9761568 0.9736726 0.9997689 -0.9768155 0.9736726 0.9997689 -0.9776488 0.9736726 0.9997689 -0.9787031 0.9736726 0.9997689 -0.9800369 0.9736726 0.9997689 -0.9817244 0.9736726 0.9997689 -0.9838592 0.9736726 0.9997689 -0.9865601 0.9736726 0.9997689 -0.989977 0.9736726 0.9997689 -0.9942999 0.9736726 0.9997689 -0.9997689 0.9736726 0.9997689 -0.9998174 0.9790927 0.9954741 -0.9998557 0.9834129 0.9936861 -0.999886 0.9868505 0.993288 -0.9999099 0.989582 0.9936135 -0.9999288 0.9917501 0.9942736 -0.9999437 0.9934695 0.9950485 -0.9736726 0.9736727 0.9997689 -0.9736726 0.9736726 0.9997689 -0.9736725 0.9736725 0.9997689 -0.9736726 0.9736725 0.9997689 -0.9736727 0.9736725 0.9997689 -0.9736728 0.9736725 0.9997689 -0.973673 0.9736725 0.9997689 -0.9736732 0.9736725 0.9997689 -0.9736735 0.9736725 0.9997689 -0.9736739 0.9736725 0.9997689 -0.9736743 0.9736725 0.9997689 -0.9736749 0.9736725 0.9997689 -0.9736756 0.9736725 0.9997689 -0.9736765 0.9736725 0.9997689 -0.9736777 0.9736725 0.9997689 -0.9736791 0.9736725 0.9997689 -0.973681 0.9736725 0.9997689 -0.9736833 0.9736725 0.9997689 -0.9736863 0.9736725 0.9997689 -0.97369 0.9736725 0.9997689 -0.9736947 0.9736725 0.9997689 -0.9737007 0.9736725 0.9997689 -0.9737082 0.9736725 0.9997689 -0.9737178 0.9736725 0.9997689 -0.9737299 0.9736725 0.9997689 -0.9737452 0.9736725 0.9997689 -0.9737645 0.9736725 0.9997689 -0.973789 0.9736725 0.9997689 -0.97382 0.9736725 0.9997689 -0.9738591 0.9736725 0.9997689 -0.9739087 0.9736725 0.9997689 -0.9739714 0.9736725 0.9997689 -0.9740508 0.9736725 0.9997689 -0.9741511 0.9736725 0.9997689 -0.9742781 0.9736725 0.9997689 -0.9744388 0.9736725 0.9997689 -0.974642 0.9736725 0.9997689 -0.9748991 0.9736725 0.9997689 -0.9752244 0.9736725 0.9997689 -0.975636 0.9736725 0.9997689 -0.9761567 0.9736725 0.9997689 -0.9768154 0.9736725 0.9997689 -0.9776487 0.9736725 0.9997689 -0.978703 0.9736725 0.9997689 -0.9800368 0.9736725 0.9997689 -0.9817243 0.9736725 0.9997689 -0.9838591 0.9736725 0.9997689 -0.98656 0.9736725 0.9997689 -0.989977 0.9736725 0.9997689 -0.9942999 0.9736725 0.9997689 -0.9997689 0.9736725 0.9997689 -0.9998174 0.9790927 0.9954741 -0.9998557 0.9834129 0.993686 -0.999886 0.9868505 0.993288 -0.9999099 0.989582 0.9936135 -0.9999288 0.9917501 0.9942736 -0.9999437 0.9934695 0.9950484 -0.9736726 0.9736728 0.9997689 -0.9736726 0.9736727 0.9997689 -0.9736725 0.9736726 0.9997689 -0.9736724 0.9736724 0.9997689 -0.9736725 0.9736724 0.9997689 -0.9736727 0.9736724 0.9997689 -0.9736729 0.9736724 0.9997689 -0.9736731 0.9736724 0.9997689 -0.9736734 0.9736724 0.9997689 -0.9736737 0.9736724 0.9997689 -0.9736742 0.9736724 0.9997689 -0.9736747 0.9736724 0.9997689 -0.9736754 0.9736724 0.9997689 -0.9736764 0.9736724 0.9997689 -0.9736775 0.9736724 0.9997689 -0.973679 0.9736724 0.9997689 -0.9736808 0.9736724 0.9997689 -0.9736831 0.9736724 0.9997689 -0.9736861 0.9736724 0.9997689 -0.9736898 0.9736724 0.9997689 -0.9736945 0.9736724 0.9997689 -0.9737005 0.9736724 0.9997689 -0.9737081 0.9736724 0.9997689 -0.9737176 0.9736724 0.9997689 -0.9737297 0.9736724 0.9997689 -0.973745 0.9736724 0.9997689 -0.9737643 0.9736724 0.9997689 -0.9737888 0.9736724 0.9997689 -0.9738198 0.9736724 0.9997689 -0.973859 0.9736724 0.9997689 -0.9739085 0.9736724 0.9997689 -0.9739713 0.9736724 0.9997689 -0.9740506 0.9736724 0.9997689 -0.974151 0.9736724 0.9997689 -0.974278 0.9736724 0.9997689 -0.9744386 0.9736724 0.9997689 -0.9746418 0.9736724 0.9997689 -0.974899 0.9736724 0.9997689 -0.9752243 0.9736724 0.9997689 -0.9756358 0.9736724 0.9997689 -0.9761565 0.9736724 0.9997689 -0.9768152 0.9736724 0.9997689 -0.9776486 0.9736724 0.9997689 -0.9787029 0.9736724 0.9997689 -0.9800367 0.9736724 0.9997689 -0.9817242 0.9736724 0.9997689 -0.983859 0.9736724 0.9997689 -0.9865599 0.9736724 0.9997689 -0.9899769 0.9736724 0.9997689 -0.9942998 0.9736724 0.9997689 -0.9997689 0.9736724 0.9997689 -0.9998174 0.9790926 0.9954741 -0.9998557 0.9834129 0.993686 -0.999886 0.9868505 0.993288 -0.9999099 0.989582 0.9936135 -0.9999288 0.9917501 0.9942736 -0.9999437 0.9934695 0.9950484 -0.9736726 0.9736729 0.9997689 -0.9736726 0.9736728 0.9997689 -0.9736725 0.9736727 0.9997689 -0.9736724 0.9736725 0.9997689 -0.9736723 0.9736723 0.9997689 -0.9736725 0.9736723 0.9997689 -0.9736726 0.9736723 0.9997689 -0.9736729 0.9736723 0.9997689 -0.9736732 0.9736723 0.9997689 -0.9736735 0.9736723 0.9997689 -0.973674 0.9736723 0.9997689 -0.9736745 0.9736723 0.9997689 -0.9736752 0.9736723 0.9997689 -0.9736762 0.9736723 0.9997689 -0.9736773 0.9736723 0.9997689 -0.9736788 0.9736723 0.9997689 -0.9736806 0.9736723 0.9997689 -0.9736829 0.9736723 0.9997689 -0.9736859 0.9736723 0.9997689 -0.9736896 0.9736723 0.9997689 -0.9736943 0.9736723 0.9997689 -0.9737003 0.9736723 0.9997689 -0.9737079 0.9736723 0.9997689 -0.9737174 0.9736723 0.9997689 -0.9737295 0.9736723 0.9997689 -0.9737448 0.9736723 0.9997689 -0.9737641 0.9736723 0.9997689 -0.9737886 0.9736723 0.9997689 -0.9738196 0.9736723 0.9997689 -0.9738588 0.9736723 0.9997689 -0.9739083 0.9736723 0.9997689 -0.9739711 0.9736723 0.9997689 -0.9740504 0.9736723 0.9997689 -0.9741508 0.9736723 0.9997689 -0.9742778 0.9736723 0.9997689 -0.9744384 0.9736723 0.9997689 -0.9746416 0.9736723 0.9997689 -0.9748988 0.9736723 0.9997689 -0.9752241 0.9736723 0.9997689 -0.9756356 0.9736723 0.9997689 -0.9761563 0.9736723 0.9997689 -0.976815 0.9736723 0.9997689 -0.9776484 0.9736723 0.9997689 -0.9787027 0.9736723 0.9997689 -0.9800366 0.9736723 0.9997689 -0.981724 0.9736723 0.9997689 -0.9838589 0.9736723 0.9997689 -0.9865598 0.9736723 0.9997689 -0.9899768 0.9736723 0.9997689 -0.9942998 0.9736723 0.9997689 -0.9997689 0.9736723 0.9997689 -0.9998174 0.9790925 0.9954741 -0.9998557 0.9834128 0.993686 -0.999886 0.9868504 0.993288 -0.9999099 0.989582 0.9936135 -0.9999288 0.9917501 0.9942736 -0.9999437 0.9934695 0.9950484 -0.9736726 0.9736731 0.9997689 -0.9736726 0.973673 0.9997689 -0.9736725 0.9736728 0.9997689 -0.9736724 0.9736727 0.9997689 -0.9736723 0.9736725 0.9997689 -0.9736722 0.9736722 0.9997689 -0.9736724 0.9736722 0.9997689 -0.9736726 0.9736722 0.9997689 -0.9736729 0.9736722 0.9997689 -0.9736733 0.9736722 0.9997689 -0.9736737 0.9736722 0.9997689 -0.9736743 0.9736722 0.9997689 -0.973675 0.9736722 0.9997689 -0.9736759 0.9736722 0.9997689 -0.973677 0.9736722 0.9997689 -0.9736785 0.9736722 0.9997689 -0.9736803 0.9736722 0.9997689 -0.9736827 0.9736722 0.9997689 -0.9736856 0.9736722 0.9997689 -0.9736894 0.9736722 0.9997689 -0.9736941 0.9736722 0.9997689 -0.9737 0.9736722 0.9997689 -0.9737076 0.9736722 0.9997689 -0.9737172 0.9736722 0.9997689 -0.9737292 0.9736722 0.9997689 -0.9737445 0.9736722 0.9997689 -0.9737639 0.9736722 0.9997689 -0.9737884 0.9736722 0.9997689 -0.9738193 0.9736722 0.9997689 -0.9738585 0.9736722 0.9997689 -0.9739081 0.9736722 0.9997689 -0.9739708 0.9736722 0.9997689 -0.9740501 0.9736722 0.9997689 -0.9741505 0.9736722 0.9997689 -0.9742775 0.9736722 0.9997689 -0.9744382 0.9736722 0.9997689 -0.9746414 0.9736722 0.9997689 -0.9748985 0.9736722 0.9997689 -0.9752238 0.9736722 0.9997689 -0.9756354 0.9736722 0.9997689 -0.9761561 0.9736722 0.9997689 -0.9768148 0.9736722 0.9997689 -0.9776482 0.9736722 0.9997689 -0.9787025 0.9736722 0.9997689 -0.9800364 0.9736722 0.9997689 -0.9817239 0.9736722 0.9997689 -0.9838588 0.9736722 0.9997689 -0.9865597 0.9736722 0.9997689 -0.9899767 0.9736722 0.9997689 -0.9942997 0.9736722 0.9997689 -0.9997689 0.9736722 0.9997689 -0.9998174 0.9790925 0.995474 -0.9998557 0.9834128 0.993686 -0.999886 0.9868504 0.9932879 -0.9999099 0.9895819 0.9936134 -0.9999288 0.9917501 0.9942736 -0.9999437 0.9934695 0.9950484 -0.9736726 0.9736733 0.9997689 -0.9736726 0.9736731 0.9997689 -0.9736725 0.973673 0.9997689 -0.9736724 0.9736729 0.9997689 -0.9736723 0.9736726 0.9997689 -0.9736722 0.9736724 0.9997689 -0.9736721 0.9736721 0.9997689 -0.9736723 0.9736721 0.9997689 -0.9736726 0.9736721 0.9997689 -0.9736729 0.9736721 0.9997689 -0.9736734 0.9736721 0.9997689 -0.973674 0.9736721 0.9997689 -0.9736747 0.9736721 0.9997689 -0.9736756 0.9736721 0.9997689 -0.9736767 0.9736721 0.9997689 -0.9736782 0.9736721 0.9997689 -0.97368 0.9736721 0.9997689 -0.9736824 0.9736721 0.9997689 -0.9736853 0.9736721 0.9997689 -0.973689 0.9736721 0.9997689 -0.9736938 0.9736721 0.9997689 -0.9736997 0.9736721 0.9997689 -0.9737073 0.9736721 0.9997689 -0.9737168 0.9736721 0.9997689 -0.9737289 0.9736721 0.9997689 -0.9737442 0.9736721 0.9997689 -0.9737636 0.9736721 0.9997689 -0.9737881 0.9736721 0.9997689 -0.973819 0.9736721 0.9997689 -0.9738582 0.9736721 0.9997689 -0.9739078 0.9736721 0.9997689 -0.9739705 0.9736721 0.9997689 -0.9740498 0.9736721 0.9997689 -0.9741502 0.9736721 0.9997689 -0.9742772 0.9736721 0.9997689 -0.9744378 0.9736721 0.9997689 -0.9746411 0.9736721 0.9997689 -0.9748982 0.9736721 0.9997689 -0.9752236 0.9736721 0.9997689 -0.9756351 0.9736721 0.9997689 -0.9761558 0.9736721 0.9997689 -0.9768145 0.9736721 0.9997689 -0.9776479 0.9736721 0.9997689 -0.9787022 0.9736721 0.9997689 -0.9800361 0.9736721 0.9997689 -0.9817236 0.9736721 0.9997689 -0.9838586 0.9736721 0.9997689 -0.9865595 0.9736721 0.9997689 -0.9899766 0.9736721 0.9997689 -0.9942997 0.9736721 0.9997689 -0.9997689 0.9736721 0.9997689 -0.9998174 0.9790924 0.995474 -0.9998557 0.9834127 0.9936859 -0.999886 0.9868504 0.9932879 -0.9999099 0.9895819 0.9936134 -0.9999288 0.99175 0.9942735 -0.9999437 0.9934695 0.9950484 -0.9736726 0.9736735 0.9997689 -0.9736726 0.9736734 0.9997689 -0.9736725 0.9736732 0.9997689 -0.9736724 0.9736731 0.9997689 -0.9736723 0.9736729 0.9997689 -0.9736722 0.9736726 0.9997689 -0.9736721 0.9736723 0.9997689 -0.9736719 0.9736719 0.9997689 -0.9736722 0.9736719 0.9997689 -0.9736725 0.9736719 0.9997689 -0.973673 0.9736719 0.9997689 -0.9736736 0.9736719 0.9997689 -0.9736743 0.9736719 0.9997689 -0.9736752 0.9736719 0.9997689 -0.9736763 0.9736719 0.9997689 -0.9736778 0.9736719 0.9997689 -0.9736796 0.9736719 0.9997689 -0.973682 0.9736719 0.9997689 -0.9736849 0.9736719 0.9997689 -0.9736886 0.9736719 0.9997689 -0.9736934 0.9736719 0.9997689 -0.9736993 0.9736719 0.9997689 -0.9737069 0.9736719 0.9997689 -0.9737164 0.9736719 0.9997689 -0.9737285 0.9736719 0.9997689 -0.9737438 0.9736719 0.9997689 -0.9737632 0.9736719 0.9997689 -0.9737877 0.9736719 0.9997689 -0.9738186 0.9736719 0.9997689 -0.9738578 0.9736719 0.9997689 -0.9739074 0.9736719 0.9997689 -0.9739701 0.9736719 0.9997689 -0.9740494 0.9736719 0.9997689 -0.9741498 0.9736719 0.9997689 -0.9742768 0.9736719 0.9997689 -0.9744375 0.9736719 0.9997689 -0.9746407 0.9736719 0.9997689 -0.9748979 0.9736719 0.9997689 -0.9752232 0.9736719 0.9997689 -0.9756348 0.9736719 0.9997689 -0.9761554 0.9736719 0.9997689 -0.9768142 0.9736719 0.9997689 -0.9776476 0.9736719 0.9997689 -0.9787019 0.9736719 0.9997689 -0.9800358 0.9736719 0.9997689 -0.9817234 0.9736719 0.9997689 -0.9838583 0.9736719 0.9997689 -0.9865593 0.9736719 0.9997689 -0.9899765 0.9736719 0.9997689 -0.9942996 0.9736719 0.9997689 -0.9997689 0.9736719 0.9997689 -0.9998174 0.9790923 0.9954739 -0.9998557 0.9834127 0.9936858 -0.999886 0.9868503 0.9932878 -0.9999099 0.9895819 0.9936134 -0.9999288 0.99175 0.9942735 -0.9999437 0.9934694 0.9950484 -0.9736726 0.9736738 0.9997689 -0.9736726 0.9736737 0.9997689 -0.9736725 0.9736735 0.9997689 -0.9736724 0.9736734 0.9997689 -0.9736723 0.9736732 0.9997689 -0.9736722 0.9736729 0.9997689 -0.9736721 0.9736726 0.9997689 -0.9736719 0.9736722 0.9997689 -0.9736717 0.9736717 0.9997689 -0.9736721 0.9736717 0.9997689 -0.9736725 0.9736717 0.9997689 -0.9736731 0.9736717 0.9997689 -0.9736738 0.9736717 0.9997689 -0.9736747 0.9736717 0.9997689 -0.9736759 0.9736717 0.9997689 -0.9736773 0.9736717 0.9997689 -0.9736792 0.9736717 0.9997689 -0.9736815 0.9736717 0.9997689 -0.9736844 0.9736717 0.9997689 -0.9736882 0.9736717 0.9997689 -0.9736929 0.9736717 0.9997689 -0.9736989 0.9736717 0.9997689 -0.9737064 0.9736717 0.9997689 -0.973716 0.9736717 0.9997689 -0.9737281 0.9736717 0.9997689 -0.9737434 0.9736717 0.9997689 -0.9737627 0.9736717 0.9997689 -0.9737872 0.9736717 0.9997689 -0.9738182 0.9736717 0.9997689 -0.9738573 0.9736717 0.9997689 -0.9739069 0.9736717 0.9997689 -0.9739696 0.9736717 0.9997689 -0.974049 0.9736717 0.9997689 -0.9741494 0.9736717 0.9997689 -0.9742763 0.9736717 0.9997689 -0.974437 0.9736717 0.9997689 -0.9746403 0.9736717 0.9997689 -0.9748974 0.9736717 0.9997689 -0.9752227 0.9736717 0.9997689 -0.9756343 0.9736717 0.9997689 -0.976155 0.9736717 0.9997689 -0.9768138 0.9736717 0.9997689 -0.9776472 0.9736717 0.9997689 -0.9787015 0.9736717 0.9997689 -0.9800355 0.9736717 0.9997689 -0.981723 0.9736717 0.9997689 -0.983858 0.9736717 0.9997689 -0.9865591 0.9736717 0.9997689 -0.9899763 0.9736717 0.9997689 -0.9942995 0.9736717 0.9997689 -0.9997689 0.9736717 0.9997689 -0.9998174 0.9790921 0.9954739 -0.9998557 0.9834126 0.9936858 -0.999886 0.9868503 0.9932878 -0.9999099 0.9895819 0.9936133 -0.9999288 0.99175 0.9942735 -0.9999437 0.9934694 0.9950484 -0.9736726 0.9736741 0.9997689 -0.9736726 0.973674 0.9997689 -0.9736725 0.9736739 0.9997689 -0.9736724 0.9736737 0.9997689 -0.9736723 0.9736735 0.9997689 -0.9736722 0.9736733 0.9997689 -0.9736721 0.9736729 0.9997689 -0.9736719 0.9736725 0.9997689 -0.9736717 0.9736721 0.9997689 -0.9736715 0.9736715 0.9997689 -0.9736719 0.9736715 0.9997689 -0.9736725 0.9736715 0.9997689 -0.9736732 0.9736715 0.9997689 -0.9736741 0.9736715 0.9997689 -0.9736753 0.9736715 0.9997689 -0.9736767 0.9736715 0.9997689 -0.9736786 0.9736715 0.9997689 -0.9736809 0.9736715 0.9997689 -0.9736839 0.9736715 0.9997689 -0.9736876 0.9736715 0.9997689 -0.9736923 0.9736715 0.9997689 -0.9736983 0.9736715 0.9997689 -0.9737058 0.9736715 0.9997689 -0.9737154 0.9736715 0.9997689 -0.9737275 0.9736715 0.9997689 -0.9737428 0.9736715 0.9997689 -0.9737621 0.9736715 0.9997689 -0.9737866 0.9736715 0.9997689 -0.9738176 0.9736715 0.9997689 -0.9738568 0.9736715 0.9997689 -0.9739063 0.9736715 0.9997689 -0.9739691 0.9736715 0.9997689 -0.9740484 0.9736715 0.9997689 -0.9741488 0.9736715 0.9997689 -0.9742758 0.9736715 0.9997689 -0.9744364 0.9736715 0.9997689 -0.9746397 0.9736715 0.9997689 -0.9748969 0.9736715 0.9997689 -0.9752222 0.9736715 0.9997689 -0.9756338 0.9736715 0.9997689 -0.9761545 0.9736715 0.9997689 -0.9768133 0.9736715 0.9997689 -0.9776467 0.9736715 0.9997689 -0.9787011 0.9736715 0.9997689 -0.980035 0.9736715 0.9997689 -0.9817226 0.9736715 0.9997689 -0.9838577 0.9736715 0.9997689 -0.9865588 0.9736715 0.9997689 -0.9899761 0.9736715 0.9997689 -0.9942993 0.9736715 0.9997689 -0.9997689 0.9736715 0.9997689 -0.9998174 0.979092 0.9954738 -0.9998557 0.9834125 0.9936857 -0.999886 0.9868502 0.9932877 -0.9999099 0.9895818 0.9936133 -0.9999288 0.99175 0.9942734 -0.9999437 0.9934694 0.9950483 -0.9736726 0.9736746 0.9997689 -0.9736726 0.9736745 0.9997689 -0.9736725 0.9736743 0.9997689 -0.9736724 0.9736742 0.9997689 -0.9736723 0.973674 0.9997689 -0.9736722 0.9736737 0.9997689 -0.9736721 0.9736734 0.9997689 -0.9736719 0.973673 0.9997689 -0.9736717 0.9736725 0.9997689 -0.9736715 0.9736719 0.9997689 -0.9736712 0.9736712 0.9997689 -0.9736718 0.9736712 0.9997689 -0.9736725 0.9736712 0.9997689 -0.9736734 0.9736712 0.9997689 -0.9736746 0.9736712 0.9997689 -0.9736761 0.9736712 0.9997689 -0.9736779 0.9736712 0.9997689 -0.9736802 0.9736712 0.9997689 -0.9736832 0.9736712 0.9997689 -0.9736869 0.9736712 0.9997689 -0.9736916 0.9736712 0.9997689 -0.9736976 0.9736712 0.9997689 -0.9737052 0.9736712 0.9997689 -0.9737147 0.9736712 0.9997689 -0.9737268 0.9736712 0.9997689 -0.9737421 0.9736712 0.9997689 -0.9737614 0.9736712 0.9997689 -0.9737859 0.9736712 0.9997689 -0.9738169 0.9736712 0.9997689 -0.9738561 0.9736712 0.9997689 -0.9739057 0.9736712 0.9997689 -0.9739684 0.9736712 0.9997689 -0.9740477 0.9736712 0.9997689 -0.9741481 0.9736712 0.9997689 -0.9742751 0.9736712 0.9997689 -0.9744358 0.9736712 0.9997689 -0.974639 0.9736712 0.9997689 -0.9748962 0.9736712 0.9997689 -0.9752215 0.9736712 0.9997689 -0.9756331 0.9736712 0.9997689 -0.9761539 0.9736712 0.9997689 -0.9768127 0.9736712 0.9997689 -0.9776461 0.9736712 0.9997689 -0.9787005 0.9736712 0.9997689 -0.9800345 0.9736712 0.9997689 -0.9817222 0.9736712 0.9997689 -0.9838573 0.9736712 0.9997689 -0.9865585 0.9736712 0.9997689 -0.9899758 0.9736712 0.9997689 -0.9942992 0.9736712 0.9997689 -0.9997689 0.9736712 0.9997689 -0.9998174 0.9790919 0.9954737 -0.9998557 0.9834124 0.9936856 -0.999886 0.9868502 0.9932876 -0.9999099 0.9895818 0.9936132 -0.9999288 0.99175 0.9942734 -0.9999437 0.9934694 0.9950483 -0.9736726 0.9736751 0.9997689 -0.9736726 0.973675 0.9997689 -0.9736725 0.9736749 0.9997689 -0.9736724 0.9736747 0.9997689 -0.9736723 0.9736745 0.9997689 -0.9736722 0.9736743 0.9997689 -0.9736721 0.973674 0.9997689 -0.9736719 0.9736736 0.9997689 -0.9736717 0.9736731 0.9997689 -0.9736715 0.9736725 0.9997689 -0.9736712 0.9736718 0.9997689 -0.973671 0.973671 0.9997689 -0.9736717 0.973671 0.9997689 -0.9736726 0.973671 0.9997689 -0.9736738 0.973671 0.9997689 -0.9736753 0.973671 0.9997689 -0.9736771 0.973671 0.9997689 -0.9736794 0.973671 0.9997689 -0.9736824 0.973671 0.9997689 -0.9736861 0.973671 0.9997689 -0.9736908 0.973671 0.9997689 -0.9736968 0.973671 0.9997689 -0.9737044 0.973671 0.9997689 -0.9737139 0.973671 0.9997689 -0.973726 0.973671 0.9997689 -0.9737413 0.973671 0.9997689 -0.9737606 0.973671 0.9997689 -0.9737851 0.973671 0.9997689 -0.9738161 0.973671 0.9997689 -0.9738553 0.973671 0.9997689 -0.9739049 0.973671 0.9997689 -0.9739676 0.973671 0.9997689 -0.9740469 0.973671 0.9997689 -0.9741473 0.973671 0.9997689 -0.9742743 0.973671 0.9997689 -0.974435 0.973671 0.9997689 -0.9746383 0.973671 0.9997689 -0.9748954 0.973671 0.9997689 -0.9752208 0.973671 0.9997689 -0.9756324 0.973671 0.9997689 -0.9761531 0.973671 0.9997689 -0.9768119 0.973671 0.9997689 -0.9776454 0.973671 0.9997689 -0.9786999 0.973671 0.9997689 -0.9800339 0.973671 0.9997689 -0.9817216 0.973671 0.9997689 -0.9838568 0.973671 0.9997689 -0.986558 0.973671 0.9997689 -0.9899755 0.973671 0.9997689 -0.994299 0.973671 0.9997689 -0.9997689 0.973671 0.9997689 -0.9998174 0.9790917 0.9954736 -0.9998557 0.9834123 0.9936855 -0.999886 0.9868501 0.9932875 -0.9999099 0.9895818 0.9936131 -0.9999288 0.9917499 0.9942733 -0.9999437 0.9934694 0.9950483 -0.9736726 0.9736758 0.9997689 -0.9736726 0.9736757 0.9997689 -0.9736725 0.9736756 0.9997689 -0.9736724 0.9736754 0.9997689 -0.9736723 0.9736752 0.9997689 -0.9736722 0.973675 0.9997689 -0.9736721 0.9736747 0.9997689 -0.9736719 0.9736743 0.9997689 -0.9736717 0.9736738 0.9997689 -0.9736715 0.9736732 0.9997689 -0.9736712 0.9736725 0.9997689 -0.973671 0.9736717 0.9997689 -0.9736708 0.9736708 0.9997689 -0.9736717 0.9736708 0.9997689 -0.9736729 0.9736708 0.9997689 -0.9736743 0.9736708 0.9997689 -0.9736762 0.9736708 0.9997689 -0.9736785 0.9736708 0.9997689 -0.9736815 0.9736708 0.9997689 -0.9736852 0.9736708 0.9997689 -0.9736899 0.9736708 0.9997689 -0.9736959 0.9736708 0.9997689 -0.9737034 0.9736708 0.9997689 -0.973713 0.9736708 0.9997689 -0.9737251 0.9736708 0.9997689 -0.9737404 0.9736708 0.9997689 -0.9737597 0.9736708 0.9997689 -0.9737842 0.9736708 0.9997689 -0.9738152 0.9736708 0.9997689 -0.9738544 0.9736708 0.9997689 -0.973904 0.9736708 0.9997689 -0.9739667 0.9736708 0.9997689 -0.974046 0.9736708 0.9997689 -0.9741464 0.9736708 0.9997689 -0.9742734 0.9736708 0.9997689 -0.9744341 0.9736708 0.9997689 -0.9746374 0.9736708 0.9997689 -0.9748946 0.9736708 0.9997689 -0.9752199 0.9736708 0.9997689 -0.9756316 0.9736708 0.9997689 -0.9761523 0.9736708 0.9997689 -0.9768112 0.9736708 0.9997689 -0.9776447 0.9736708 0.9997689 -0.9786991 0.9736708 0.9997689 -0.9800332 0.9736708 0.9997689 -0.981721 0.9736708 0.9997689 -0.9838562 0.9736708 0.9997689 -0.9865576 0.9736708 0.9997689 -0.9899752 0.9736708 0.9997689 -0.9942988 0.9736708 0.9997689 -0.9997689 0.9736708 0.9997689 -0.9998174 0.9790916 0.9954735 -0.9998557 0.9834122 0.9936853 -0.999886 0.9868501 0.9932874 -0.9999099 0.9895817 0.993613 -0.9999288 0.9917499 0.9942733 -0.9999437 0.9934694 0.9950482 -0.9736726 0.9736768 0.9997689 -0.9736726 0.9736767 0.9997689 -0.9736725 0.9736765 0.9997689 -0.9736724 0.9736764 0.9997689 -0.9736723 0.9736762 0.9997689 -0.9736722 0.9736759 0.9997689 -0.9736721 0.9736756 0.9997689 -0.9736719 0.9736752 0.9997689 -0.9736717 0.9736747 0.9997689 -0.9736715 0.9736741 0.9997689 -0.9736712 0.9736734 0.9997689 -0.973671 0.9736726 0.9997689 -0.9736708 0.9736717 0.9997689 -0.9736708 0.9736708 0.9997689 -0.9736719 0.9736708 0.9997689 -0.9736734 0.9736708 0.9997689 -0.9736752 0.9736708 0.9997689 -0.9736776 0.9736708 0.9997689 -0.9736805 0.9736708 0.9997689 -0.9736842 0.9736708 0.9997689 -0.973689 0.9736708 0.9997689 -0.9736949 0.9736708 0.9997689 -0.9737025 0.9736708 0.9997689 -0.973712 0.9736708 0.9997689 -0.9737241 0.9736708 0.9997689 -0.9737394 0.9736708 0.9997689 -0.9737588 0.9736708 0.9997689 -0.9737833 0.9736708 0.9997689 -0.9738142 0.9736708 0.9997689 -0.9738534 0.9736708 0.9997689 -0.973903 0.9736708 0.9997689 -0.9739657 0.9736708 0.9997689 -0.9740451 0.9736708 0.9997689 -0.9741455 0.9736708 0.9997689 -0.9742725 0.9736708 0.9997689 -0.9744332 0.9736708 0.9997689 -0.9746365 0.9736708 0.9997689 -0.9748937 0.9736708 0.9997689 -0.975219 0.9736708 0.9997689 -0.9756307 0.9736708 0.9997689 -0.9761514 0.9736708 0.9997689 -0.9768103 0.9736708 0.9997689 -0.9776438 0.9736708 0.9997689 -0.9786984 0.9736708 0.9997689 -0.9800325 0.9736708 0.9997689 -0.9817203 0.9736708 0.9997689 -0.9838556 0.9736708 0.9997689 -0.9865571 0.9736708 0.9997689 -0.9899748 0.9736708 0.9997689 -0.9942986 0.9736708 0.9997689 -0.9997689 0.9736708 0.9997689 -0.9998174 0.9790916 0.9954733 -0.9998557 0.9834122 0.9936852 -0.999886 0.98685 0.9932873 -0.9999099 0.9895817 0.993613 -0.9999288 0.9917499 0.9942732 -0.9999437 0.9934694 0.9950482 -0.9736726 0.9736779 0.9997689 -0.9736726 0.9736778 0.9997689 -0.9736725 0.9736777 0.9997689 -0.9736724 0.9736775 0.9997689 -0.9736723 0.9736773 0.9997689 -0.9736722 0.973677 0.9997689 -0.9736721 0.9736767 0.9997689 -0.9736719 0.9736763 0.9997689 -0.9736717 0.9736759 0.9997689 -0.9736715 0.9736753 0.9997689 -0.9736712 0.9736746 0.9997689 -0.973671 0.9736738 0.9997689 -0.9736708 0.9736729 0.9997689 -0.9736708 0.9736719 0.9997689 -0.973671 0.973671 0.9997688 -0.9736724 0.973671 0.9997688 -0.9736743 0.973671 0.9997688 -0.9736766 0.973671 0.9997688 -0.9736796 0.973671 0.9997688 -0.9736833 0.973671 0.9997688 -0.973688 0.973671 0.9997688 -0.973694 0.973671 0.9997688 -0.9737015 0.973671 0.9997688 -0.9737111 0.973671 0.9997688 -0.9737232 0.973671 0.9997688 -0.9737385 0.973671 0.9997688 -0.9737578 0.973671 0.9997688 -0.9737823 0.973671 0.9997688 -0.9738133 0.973671 0.9997688 -0.9738525 0.973671 0.9997688 -0.9739021 0.973671 0.9997688 -0.9739648 0.973671 0.9997688 -0.9740442 0.973671 0.9997688 -0.9741446 0.973671 0.9997688 -0.9742716 0.973671 0.9997688 -0.9744323 0.973671 0.9997688 -0.9746356 0.973671 0.9997688 -0.9748928 0.973671 0.9997688 -0.9752181 0.973671 0.9997688 -0.9756298 0.973671 0.9997688 -0.9761506 0.973671 0.9997688 -0.9768095 0.973671 0.9997688 -0.977643 0.973671 0.9997688 -0.9786976 0.973671 0.9997688 -0.9800318 0.973671 0.9997688 -0.9817197 0.973671 0.9997688 -0.9838551 0.973671 0.9997688 -0.9865566 0.973671 0.9997688 -0.9899744 0.973671 0.9997688 -0.9942984 0.973671 0.9997688 -0.9997688 0.973671 0.9997688 -0.9998174 0.9790917 0.9954732 -0.9998557 0.9834123 0.993685 -0.999886 0.9868501 0.9932872 -0.9999099 0.9895817 0.9936129 -0.9999288 0.9917499 0.9942731 -0.9999437 0.9934694 0.9950481 -0.9736726 0.9736794 0.9997689 -0.9736726 0.9736793 0.9997689 -0.9736725 0.9736791 0.9997689 -0.9736724 0.973679 0.9997689 -0.9736723 0.9736788 0.9997689 -0.9736722 0.9736785 0.9997689 -0.9736721 0.9736782 0.9997689 -0.9736719 0.9736778 0.9997689 -0.9736717 0.9736773 0.9997689 -0.9736715 0.9736767 0.9997689 -0.9736712 0.9736761 0.9997689 -0.973671 0.9736753 0.9997689 -0.9736708 0.9736743 0.9997689 -0.9736708 0.9736734 0.9997689 -0.973671 0.9736724 0.9997688 -0.9736717 0.9736717 0.9997688 -0.9736735 0.9736717 0.9997688 -0.9736759 0.9736717 0.9997688 -0.9736788 0.9736717 0.9997688 -0.9736826 0.9736717 0.9997688 -0.9736873 0.9736717 0.9997688 -0.9736932 0.9736717 0.9997688 -0.9737008 0.9736717 0.9997688 -0.9737104 0.9736717 0.9997688 -0.9737225 0.9736717 0.9997688 -0.9737378 0.9736717 0.9997688 -0.9737571 0.9736717 0.9997688 -0.9737816 0.9736717 0.9997688 -0.9738126 0.9736717 0.9997688 -0.9738518 0.9736717 0.9997688 -0.9739013 0.9736717 0.9997688 -0.9739641 0.9736717 0.9997688 -0.9740434 0.9736717 0.9997688 -0.9741438 0.9736717 0.9997688 -0.9742709 0.9736717 0.9997688 -0.9744315 0.9736717 0.9997688 -0.9746348 0.9736717 0.9997688 -0.9748921 0.9736717 0.9997688 -0.9752174 0.9736717 0.9997688 -0.9756291 0.9736717 0.9997688 -0.9761499 0.9736717 0.9997688 -0.9768088 0.9736717 0.9997688 -0.9776424 0.9736717 0.9997688 -0.978697 0.9736717 0.9997688 -0.9800312 0.9736717 0.9997688 -0.9817191 0.9736717 0.9997688 -0.9838546 0.9736717 0.9997688 -0.9865562 0.9736717 0.9997688 -0.9899742 0.9736717 0.9997688 -0.9942983 0.9736717 0.9997688 -0.9997688 0.9736717 0.9997688 -0.9998174 0.9790921 0.9954731 -0.9998557 0.9834126 0.9936849 -0.999886 0.9868503 0.9932871 -0.9999099 0.9895819 0.9936128 -0.9999288 0.99175 0.9942731 -0.9999437 0.9934694 0.9950481 -0.9736726 0.9736812 0.9997689 -0.9736726 0.9736811 0.9997689 -0.9736725 0.973681 0.9997689 -0.9736724 0.9736808 0.9997689 -0.9736723 0.9736806 0.9997689 -0.9736722 0.9736803 0.9997689 -0.9736721 0.97368 0.9997689 -0.9736719 0.9736796 0.9997689 -0.9736717 0.9736792 0.9997689 -0.9736715 0.9736786 0.9997689 -0.9736712 0.9736779 0.9997689 -0.973671 0.9736771 0.9997689 -0.9736708 0.9736762 0.9997689 -0.9736708 0.9736752 0.9997689 -0.973671 0.9736743 0.9997688 -0.9736717 0.9736735 0.9997688 -0.9736733 0.9736733 0.9997688 -0.9736756 0.9736733 0.9997688 -0.9736786 0.9736733 0.9997688 -0.9736823 0.9736733 0.9997688 -0.973687 0.9736733 0.9997688 -0.973693 0.9736733 0.9997688 -0.9737006 0.9736733 0.9997688 -0.9737101 0.9736733 0.9997688 -0.9737222 0.9736733 0.9997688 -0.9737375 0.9736733 0.9997688 -0.9737569 0.9736733 0.9997688 -0.9737814 0.9736733 0.9997688 -0.9738123 0.9736733 0.9997688 -0.9738515 0.9736733 0.9997688 -0.9739011 0.9736733 0.9997688 -0.9739638 0.9736733 0.9997688 -0.9740432 0.9736733 0.9997688 -0.9741436 0.9736733 0.9997688 -0.9742706 0.9736733 0.9997688 -0.9744313 0.9736733 0.9997688 -0.9746346 0.9736733 0.9997688 -0.9748918 0.9736733 0.9997688 -0.9752172 0.9736733 0.9997688 -0.9756289 0.9736733 0.9997688 -0.9761497 0.9736733 0.9997688 -0.9768086 0.9736733 0.9997688 -0.9776422 0.9736733 0.9997688 -0.9786968 0.9736733 0.9997688 -0.980031 0.9736733 0.9997688 -0.981719 0.9736733 0.9997688 -0.9838545 0.9736733 0.9997688 -0.9865561 0.9736733 0.9997688 -0.9899741 0.9736733 0.9997688 -0.9942982 0.9736733 0.9997688 -0.9997688 0.9736733 0.9997688 -0.9998174 0.9790931 0.9954731 -0.9998557 0.9834132 0.9936849 -0.999886 0.9868507 0.993287 -0.9999099 0.9895821 0.9936128 -0.9999288 0.9917502 0.9942731 -0.9999437 0.9934695 0.9950481 -0.9736726 0.9736835 0.9997689 -0.9736726 0.9736834 0.9997689 -0.9736725 0.9736833 0.9997689 -0.9736724 0.9736831 0.9997689 -0.9736723 0.9736829 0.9997689 -0.9736722 0.9736827 0.9997689 -0.9736721 0.9736824 0.9997689 -0.9736719 0.973682 0.9997689 -0.9736717 0.9736815 0.9997689 -0.9736715 0.9736809 0.9997689 -0.9736712 0.9736802 0.9997689 -0.973671 0.9736794 0.9997689 -0.9736708 0.9736785 0.9997689 -0.9736708 0.9736776 0.9997689 -0.973671 0.9736766 0.9997688 -0.9736717 0.9736759 0.9997688 -0.9736733 0.9736756 0.9997688 -0.9736756 0.9736756 0.9997688 -0.9736786 0.9736756 0.9997688 -0.9736823 0.9736756 0.9997688 -0.973687 0.9736756 0.9997688 -0.973693 0.9736756 0.9997688 -0.9737006 0.9736756 0.9997688 -0.9737101 0.9736756 0.9997688 -0.9737222 0.9736756 0.9997688 -0.9737375 0.9736756 0.9997688 -0.9737569 0.9736756 0.9997688 -0.9737814 0.9736756 0.9997688 -0.9738123 0.9736756 0.9997688 -0.9738515 0.9736756 0.9997688 -0.9739011 0.9736756 0.9997688 -0.9739638 0.9736756 0.9997688 -0.9740432 0.9736756 0.9997688 -0.9741436 0.9736756 0.9997688 -0.9742706 0.9736756 0.9997688 -0.9744313 0.9736756 0.9997688 -0.9746346 0.9736756 0.9997688 -0.9748918 0.9736756 0.9997688 -0.9752172 0.9736756 0.9997688 -0.9756289 0.9736756 0.9997688 -0.9761497 0.9736756 0.9997688 -0.9768086 0.9736756 0.9997688 -0.9776422 0.9736756 0.9997688 -0.9786968 0.9736756 0.9997688 -0.980031 0.9736756 0.9997688 -0.981719 0.9736756 0.9997688 -0.9838545 0.9736756 0.9997688 -0.9865561 0.9736756 0.9997688 -0.9899741 0.9736756 0.9997688 -0.9942982 0.9736756 0.9997688 -0.9997688 0.9736756 0.9997688 -0.9998174 0.9790946 0.9954731 -0.9998557 0.9834141 0.9936849 -0.999886 0.9868512 0.993287 -0.9999099 0.9895825 0.9936128 -0.9999288 0.9917504 0.9942731 -0.9999437 0.9934697 0.9950481 -0.9736726 0.9736865 0.9997689 -0.9736726 0.9736864 0.9997689 -0.9736725 0.9736863 0.9997689 -0.9736724 0.9736861 0.9997689 -0.9736723 0.9736859 0.9997689 -0.9736722 0.9736856 0.9997689 -0.9736721 0.9736853 0.9997689 -0.9736719 0.9736849 0.9997689 -0.9736717 0.9736844 0.9997689 -0.9736715 0.9736839 0.9997689 -0.9736712 0.9736832 0.9997689 -0.973671 0.9736824 0.9997689 -0.9736708 0.9736815 0.9997689 -0.9736708 0.9736805 0.9997689 -0.973671 0.9736796 0.9997688 -0.9736717 0.9736788 0.9997688 -0.9736733 0.9736786 0.9997688 -0.9736756 0.9736786 0.9997688 -0.9736786 0.9736786 0.9997688 -0.9736823 0.9736786 0.9997688 -0.973687 0.9736786 0.9997688 -0.973693 0.9736786 0.9997688 -0.9737006 0.9736786 0.9997688 -0.9737101 0.9736786 0.9997688 -0.9737222 0.9736786 0.9997688 -0.9737375 0.9736786 0.9997688 -0.9737569 0.9736786 0.9997688 -0.9737814 0.9736786 0.9997688 -0.9738123 0.9736786 0.9997688 -0.9738515 0.9736786 0.9997688 -0.9739011 0.9736786 0.9997688 -0.9739638 0.9736786 0.9997688 -0.9740432 0.9736786 0.9997688 -0.9741436 0.9736786 0.9997688 -0.9742706 0.9736786 0.9997688 -0.9744313 0.9736786 0.9997688 -0.9746346 0.9736786 0.9997688 -0.9748918 0.9736786 0.9997688 -0.9752172 0.9736786 0.9997688 -0.9756289 0.9736786 0.9997688 -0.9761497 0.9736786 0.9997688 -0.9768086 0.9736786 0.9997688 -0.9776422 0.9736786 0.9997688 -0.9786968 0.9736786 0.9997688 -0.980031 0.9736786 0.9997688 -0.981719 0.9736786 0.9997688 -0.9838545 0.9736786 0.9997688 -0.9865561 0.9736786 0.9997688 -0.9899741 0.9736786 0.9997688 -0.9942982 0.9736786 0.9997688 -0.9997688 0.9736786 0.9997688 -0.9998174 0.9790965 0.9954731 -0.9998557 0.9834153 0.9936849 -0.999886 0.986852 0.993287 -0.9999099 0.9895829 0.9936128 -0.9999288 0.9917507 0.9942731 -0.9999437 0.9934698 0.9950481 -0.9736726 0.9736902 0.9997689 -0.9736726 0.9736901 0.9997689 -0.9736725 0.97369 0.9997689 -0.9736724 0.9736898 0.9997689 -0.9736723 0.9736896 0.9997689 -0.9736722 0.9736894 0.9997689 -0.9736721 0.973689 0.9997689 -0.9736719 0.9736886 0.9997689 -0.9736717 0.9736882 0.9997689 -0.9736715 0.9736876 0.9997689 -0.9736712 0.9736869 0.9997689 -0.973671 0.9736861 0.9997689 -0.9736708 0.9736852 0.9997689 -0.9736708 0.9736842 0.9997689 -0.973671 0.9736833 0.9997688 -0.9736717 0.9736826 0.9997688 -0.9736733 0.9736823 0.9997688 -0.9736756 0.9736823 0.9997688 -0.9736786 0.9736823 0.9997688 -0.9736823 0.9736823 0.9997688 -0.973687 0.9736823 0.9997688 -0.973693 0.9736823 0.9997688 -0.9737006 0.9736823 0.9997688 -0.9737101 0.9736823 0.9997688 -0.9737222 0.9736823 0.9997688 -0.9737375 0.9736823 0.9997688 -0.9737569 0.9736823 0.9997688 -0.9737814 0.9736823 0.9997688 -0.9738123 0.9736823 0.9997688 -0.9738515 0.9736823 0.9997688 -0.9739011 0.9736823 0.9997688 -0.9739638 0.9736823 0.9997688 -0.9740432 0.9736823 0.9997688 -0.9741436 0.9736823 0.9997688 -0.9742706 0.9736823 0.9997688 -0.9744313 0.9736823 0.9997688 -0.9746346 0.9736823 0.9997688 -0.9748918 0.9736823 0.9997688 -0.9752172 0.9736823 0.9997688 -0.9756289 0.9736823 0.9997688 -0.9761497 0.9736823 0.9997688 -0.9768086 0.9736823 0.9997688 -0.9776422 0.9736823 0.9997688 -0.9786968 0.9736823 0.9997688 -0.980031 0.9736823 0.9997688 -0.981719 0.9736823 0.9997688 -0.9838545 0.9736823 0.9997688 -0.9865561 0.9736823 0.9997688 -0.9899741 0.9736823 0.9997688 -0.9942982 0.9736823 0.9997688 -0.9997688 0.9736823 0.9997688 -0.9998174 0.9790988 0.9954731 -0.9998557 0.9834167 0.9936849 -0.999886 0.9868529 0.993287 -0.9999099 0.9895835 0.9936128 -0.9999288 0.991751 0.9942731 -0.9999437 0.9934701 0.9950481 -0.9736726 0.9736949 0.9997689 -0.9736726 0.9736948 0.9997689 -0.9736725 0.9736947 0.9997689 -0.9736724 0.9736945 0.9997689 -0.9736723 0.9736943 0.9997689 -0.9736722 0.9736941 0.9997689 -0.9736721 0.9736938 0.9997689 -0.9736719 0.9736934 0.9997689 -0.9736717 0.9736929 0.9997689 -0.9736715 0.9736923 0.9997689 -0.9736712 0.9736916 0.9997689 -0.973671 0.9736908 0.9997689 -0.9736708 0.9736899 0.9997689 -0.9736708 0.973689 0.9997689 -0.973671 0.973688 0.9997688 -0.9736717 0.9736873 0.9997688 -0.9736733 0.973687 0.9997688 -0.9736756 0.973687 0.9997688 -0.9736786 0.973687 0.9997688 -0.9736823 0.973687 0.9997688 -0.973687 0.973687 0.9997688 -0.973693 0.973687 0.9997688 -0.9737006 0.973687 0.9997688 -0.9737101 0.973687 0.9997688 -0.9737222 0.973687 0.9997688 -0.9737375 0.973687 0.9997688 -0.9737569 0.973687 0.9997688 -0.9737814 0.973687 0.9997688 -0.9738123 0.973687 0.9997688 -0.9738515 0.973687 0.9997688 -0.9739011 0.973687 0.9997688 -0.9739638 0.973687 0.9997688 -0.9740432 0.973687 0.9997688 -0.9741436 0.973687 0.9997688 -0.9742706 0.973687 0.9997688 -0.9744313 0.973687 0.9997688 -0.9746346 0.973687 0.9997688 -0.9748918 0.973687 0.9997688 -0.9752172 0.973687 0.9997688 -0.9756289 0.973687 0.9997688 -0.9761497 0.973687 0.9997688 -0.9768086 0.973687 0.9997688 -0.9776422 0.973687 0.9997688 -0.9786968 0.973687 0.9997688 -0.980031 0.973687 0.9997688 -0.981719 0.973687 0.9997688 -0.9838545 0.973687 0.9997688 -0.9865561 0.973687 0.9997688 -0.9899741 0.973687 0.9997688 -0.9942982 0.973687 0.9997688 -0.9997688 0.973687 0.9997688 -0.9998174 0.9791018 0.9954731 -0.9998557 0.9834186 0.9936849 -0.999886 0.9868541 0.993287 -0.9999099 0.9895842 0.9936128 -0.9999288 0.9917515 0.9942731 -0.9999437 0.9934704 0.9950481 -0.9736726 0.9737009 0.9997689 -0.9736726 0.9737008 0.9997689 -0.9736725 0.9737007 0.9997689 -0.9736724 0.9737005 0.9997689 -0.9736723 0.9737003 0.9997689 -0.9736722 0.9737 0.9997689 -0.9736721 0.9736997 0.9997689 -0.9736719 0.9736993 0.9997689 -0.9736717 0.9736989 0.9997689 -0.9736715 0.9736983 0.9997689 -0.9736712 0.9736976 0.9997689 -0.973671 0.9736968 0.9997689 -0.9736708 0.9736959 0.9997689 -0.9736708 0.9736949 0.9997689 -0.973671 0.973694 0.9997688 -0.9736717 0.9736932 0.9997688 -0.9736733 0.973693 0.9997688 -0.9736756 0.973693 0.9997688 -0.9736786 0.973693 0.9997688 -0.9736823 0.973693 0.9997688 -0.973687 0.973693 0.9997688 -0.973693 0.973693 0.9997688 -0.9737006 0.973693 0.9997688 -0.9737101 0.973693 0.9997688 -0.9737222 0.973693 0.9997688 -0.9737375 0.973693 0.9997688 -0.9737569 0.973693 0.9997688 -0.9737814 0.973693 0.9997688 -0.9738123 0.973693 0.9997688 -0.9738515 0.973693 0.9997688 -0.9739011 0.973693 0.9997688 -0.9739638 0.973693 0.9997688 -0.9740432 0.973693 0.9997688 -0.9741436 0.973693 0.9997688 -0.9742706 0.973693 0.9997688 -0.9744313 0.973693 0.9997688 -0.9746346 0.973693 0.9997688 -0.9748918 0.973693 0.9997688 -0.9752172 0.973693 0.9997688 -0.9756289 0.973693 0.9997688 -0.9761497 0.973693 0.9997688 -0.9768086 0.973693 0.9997688 -0.9776422 0.973693 0.9997688 -0.9786968 0.973693 0.9997688 -0.980031 0.973693 0.9997688 -0.981719 0.973693 0.9997688 -0.9838545 0.973693 0.9997688 -0.9865561 0.973693 0.9997688 -0.9899741 0.973693 0.9997688 -0.9942982 0.973693 0.9997688 -0.9997688 0.973693 0.9997688 -0.9998174 0.9791055 0.9954731 -0.9998557 0.9834209 0.9936849 -0.999886 0.9868555 0.993287 -0.9999099 0.9895851 0.9936128 -0.9999288 0.9917521 0.9942731 -0.9999437 0.9934707 0.9950481 -0.9736726 0.9737085 0.9997689 -0.9736726 0.9737084 0.9997689 -0.9736725 0.9737082 0.9997689 -0.9736724 0.9737081 0.9997689 -0.9736723 0.9737079 0.9997689 -0.9736722 0.9737076 0.9997689 -0.9736721 0.9737073 0.9997689 -0.9736719 0.9737069 0.9997689 -0.9736717 0.9737064 0.9997689 -0.9736715 0.9737058 0.9997689 -0.9736712 0.9737052 0.9997689 -0.973671 0.9737044 0.9997689 -0.9736708 0.9737034 0.9997689 -0.9736708 0.9737025 0.9997689 -0.973671 0.9737015 0.9997688 -0.9736717 0.9737008 0.9997688 -0.9736733 0.9737006 0.9997688 -0.9736756 0.9737006 0.9997688 -0.9736786 0.9737006 0.9997688 -0.9736823 0.9737006 0.9997688 -0.973687 0.9737006 0.9997688 -0.973693 0.9737006 0.9997688 -0.9737006 0.9737006 0.9997688 -0.9737101 0.9737006 0.9997688 -0.9737222 0.9737006 0.9997688 -0.9737375 0.9737006 0.9997688 -0.9737569 0.9737006 0.9997688 -0.9737814 0.9737006 0.9997688 -0.9738123 0.9737006 0.9997688 -0.9738515 0.9737006 0.9997688 -0.9739011 0.9737006 0.9997688 -0.9739638 0.9737006 0.9997688 -0.9740432 0.9737006 0.9997688 -0.9741436 0.9737006 0.9997688 -0.9742706 0.9737006 0.9997688 -0.9744313 0.9737006 0.9997688 -0.9746346 0.9737006 0.9997688 -0.9748918 0.9737006 0.9997688 -0.9752172 0.9737006 0.9997688 -0.9756289 0.9737006 0.9997688 -0.9761497 0.9737006 0.9997688 -0.9768086 0.9737006 0.9997688 -0.9776422 0.9737006 0.9997688 -0.9786968 0.9737006 0.9997688 -0.980031 0.9737006 0.9997688 -0.981719 0.9737006 0.9997688 -0.9838545 0.9737006 0.9997688 -0.9865561 0.9737006 0.9997688 -0.9899741 0.9737006 0.9997688 -0.9942982 0.9737006 0.9997688 -0.9997688 0.9737006 0.9997688 -0.9998174 0.9791103 0.9954731 -0.9998557 0.9834239 0.9936849 -0.999886 0.9868574 0.993287 -0.9999099 0.9895863 0.9936128 -0.9999288 0.9917528 0.9942731 -0.9999437 0.9934712 0.9950481 -0.9736726 0.973718 0.9997689 -0.9736726 0.9737179 0.9997689 -0.9736725 0.9737178 0.9997689 -0.9736724 0.9737176 0.9997689 -0.9736723 0.9737174 0.9997689 -0.9736722 0.9737172 0.9997689 -0.9736721 0.9737168 0.9997689 -0.9736719 0.9737164 0.9997689 -0.9736717 0.973716 0.9997689 -0.9736715 0.9737154 0.9997689 -0.9736712 0.9737147 0.9997689 -0.973671 0.9737139 0.9997689 -0.9736708 0.973713 0.9997689 -0.9736708 0.973712 0.9997689 -0.973671 0.9737111 0.9997688 -0.9736717 0.9737104 0.9997688 -0.9736733 0.9737101 0.9997688 -0.9736756 0.9737101 0.9997688 -0.9736786 0.9737101 0.9997688 -0.9736823 0.9737101 0.9997688 -0.973687 0.9737101 0.9997688 -0.973693 0.9737101 0.9997688 -0.9737006 0.9737101 0.9997688 -0.9737101 0.9737101 0.9997688 -0.9737222 0.9737101 0.9997688 -0.9737375 0.9737101 0.9997688 -0.9737569 0.9737101 0.9997688 -0.9737814 0.9737101 0.9997688 -0.9738123 0.9737101 0.9997688 -0.9738515 0.9737101 0.9997688 -0.9739011 0.9737101 0.9997688 -0.9739638 0.9737101 0.9997688 -0.9740432 0.9737101 0.9997688 -0.9741436 0.9737101 0.9997688 -0.9742706 0.9737101 0.9997688 -0.9744313 0.9737101 0.9997688 -0.9746346 0.9737101 0.9997688 -0.9748918 0.9737101 0.9997688 -0.9752172 0.9737101 0.9997688 -0.9756289 0.9737101 0.9997688 -0.9761497 0.9737101 0.9997688 -0.9768086 0.9737101 0.9997688 -0.9776422 0.9737101 0.9997688 -0.9786968 0.9737101 0.9997688 -0.980031 0.9737101 0.9997688 -0.981719 0.9737101 0.9997688 -0.9838545 0.9737101 0.9997688 -0.9865561 0.9737101 0.9997688 -0.9899741 0.9737101 0.9997688 -0.9942982 0.9737101 0.9997688 -0.9997688 0.9737101 0.9997688 -0.9998174 0.9791163 0.9954731 -0.9998557 0.9834277 0.9936849 -0.999886 0.9868597 0.993287 -0.9999099 0.9895878 0.9936128 -0.9999288 0.9917537 0.9942731 -0.9999437 0.9934718 0.9950481 -0.9736726 0.9737301 0.9997689 -0.9736726 0.97373 0.9997689 -0.9736725 0.9737299 0.9997689 -0.9736724 0.9737297 0.9997689 -0.9736723 0.9737295 0.9997689 -0.9736722 0.9737292 0.9997689 -0.9736721 0.9737289 0.9997689 -0.9736719 0.9737285 0.9997689 -0.9736717 0.9737281 0.9997689 -0.9736715 0.9737275 0.9997689 -0.9736712 0.9737268 0.9997689 -0.973671 0.973726 0.9997689 -0.9736708 0.9737251 0.9997689 -0.9736708 0.9737241 0.9997689 -0.973671 0.9737232 0.9997688 -0.9736717 0.9737225 0.9997688 -0.9736733 0.9737222 0.9997688 -0.9736756 0.9737222 0.9997688 -0.9736786 0.9737222 0.9997688 -0.9736823 0.9737222 0.9997688 -0.973687 0.9737222 0.9997688 -0.973693 0.9737222 0.9997688 -0.9737006 0.9737222 0.9997688 -0.9737101 0.9737222 0.9997688 -0.9737222 0.9737222 0.9997688 -0.9737375 0.9737222 0.9997688 -0.9737569 0.9737222 0.9997688 -0.9737814 0.9737222 0.9997688 -0.9738123 0.9737222 0.9997688 -0.9738515 0.9737222 0.9997688 -0.9739011 0.9737222 0.9997688 -0.9739638 0.9737222 0.9997688 -0.9740432 0.9737222 0.9997688 -0.9741436 0.9737222 0.9997688 -0.9742706 0.9737222 0.9997688 -0.9744313 0.9737222 0.9997688 -0.9746346 0.9737222 0.9997688 -0.9748918 0.9737222 0.9997688 -0.9752172 0.9737222 0.9997688 -0.9756289 0.9737222 0.9997688 -0.9761497 0.9737222 0.9997688 -0.9768086 0.9737222 0.9997688 -0.9776422 0.9737222 0.9997688 -0.9786968 0.9737222 0.9997688 -0.980031 0.9737222 0.9997688 -0.981719 0.9737222 0.9997688 -0.9838545 0.9737222 0.9997688 -0.9865561 0.9737222 0.9997688 -0.9899741 0.9737222 0.9997688 -0.9942982 0.9737222 0.9997688 -0.9997688 0.9737222 0.9997688 -0.9998174 0.9791238 0.9954731 -0.9998557 0.9834324 0.9936849 -0.999886 0.9868627 0.993287 -0.9999099 0.9895897 0.9936128 -0.9999288 0.9917549 0.9942731 -0.9999437 0.9934725 0.9950481 -0.9736726 0.9737454 0.9997689 -0.9736726 0.9737453 0.9997689 -0.9736725 0.9737452 0.9997689 -0.9736724 0.973745 0.9997689 -0.9736723 0.9737448 0.9997689 -0.9736722 0.9737445 0.9997689 -0.9736721 0.9737442 0.9997689 -0.9736719 0.9737438 0.9997689 -0.9736717 0.9737434 0.9997689 -0.9736715 0.9737428 0.9997689 -0.9736712 0.9737421 0.9997689 -0.973671 0.9737413 0.9997689 -0.9736708 0.9737404 0.9997689 -0.9736708 0.9737394 0.9997689 -0.973671 0.9737385 0.9997688 -0.9736717 0.9737378 0.9997688 -0.9736733 0.9737375 0.9997688 -0.9736756 0.9737375 0.9997688 -0.9736786 0.9737375 0.9997688 -0.9736823 0.9737375 0.9997688 -0.973687 0.9737375 0.9997688 -0.973693 0.9737375 0.9997688 -0.9737006 0.9737375 0.9997688 -0.9737101 0.9737375 0.9997688 -0.9737222 0.9737375 0.9997688 -0.9737375 0.9737375 0.9997688 -0.9737569 0.9737375 0.9997688 -0.9737814 0.9737375 0.9997688 -0.9738123 0.9737375 0.9997688 -0.9738515 0.9737375 0.9997688 -0.9739011 0.9737375 0.9997688 -0.9739638 0.9737375 0.9997688 -0.9740432 0.9737375 0.9997688 -0.9741436 0.9737375 0.9997688 -0.9742706 0.9737375 0.9997688 -0.9744313 0.9737375 0.9997688 -0.9746346 0.9737375 0.9997688 -0.9748918 0.9737375 0.9997688 -0.9752172 0.9737375 0.9997688 -0.9756289 0.9737375 0.9997688 -0.9761497 0.9737375 0.9997688 -0.9768086 0.9737375 0.9997688 -0.9776422 0.9737375 0.9997688 -0.9786968 0.9737375 0.9997688 -0.980031 0.9737375 0.9997688 -0.981719 0.9737375 0.9997688 -0.9838545 0.9737375 0.9997688 -0.9865561 0.9737375 0.9997688 -0.9899741 0.9737375 0.9997688 -0.9942982 0.9737375 0.9997688 -0.9997688 0.9737375 0.9997688 -0.9998174 0.9791334 0.9954731 -0.9998557 0.9834385 0.9936849 -0.999886 0.9868665 0.993287 -0.9999099 0.989592 0.9936128 -0.9999288 0.9917564 0.9942731 -0.9999437 0.9934734 0.9950481 -0.9736726 0.9737647 0.9997689 -0.9736726 0.9737646 0.9997689 -0.9736725 0.9737645 0.9997689 -0.9736724 0.9737643 0.9997689 -0.9736723 0.9737641 0.9997689 -0.9736722 0.9737639 0.9997689 -0.9736721 0.9737636 0.9997689 -0.9736719 0.9737632 0.9997689 -0.9736717 0.9737627 0.9997689 -0.9736715 0.9737621 0.9997689 -0.9736712 0.9737614 0.9997689 -0.973671 0.9737606 0.9997689 -0.9736708 0.9737597 0.9997689 -0.9736708 0.9737588 0.9997689 -0.973671 0.9737578 0.9997688 -0.9736717 0.9737571 0.9997688 -0.9736733 0.9737569 0.9997688 -0.9736756 0.9737569 0.9997688 -0.9736786 0.9737569 0.9997688 -0.9736823 0.9737569 0.9997688 -0.973687 0.9737569 0.9997688 -0.973693 0.9737569 0.9997688 -0.9737006 0.9737569 0.9997688 -0.9737101 0.9737569 0.9997688 -0.9737222 0.9737569 0.9997688 -0.9737375 0.9737569 0.9997688 -0.9737569 0.9737569 0.9997688 -0.9737814 0.9737569 0.9997688 -0.9738123 0.9737569 0.9997688 -0.9738515 0.9737569 0.9997688 -0.9739011 0.9737569 0.9997688 -0.9739638 0.9737569 0.9997688 -0.9740432 0.9737569 0.9997688 -0.9741436 0.9737569 0.9997688 -0.9742706 0.9737569 0.9997688 -0.9744313 0.9737569 0.9997688 -0.9746346 0.9737569 0.9997688 -0.9748918 0.9737569 0.9997688 -0.9752172 0.9737569 0.9997688 -0.9756289 0.9737569 0.9997688 -0.9761497 0.9737569 0.9997688 -0.9768086 0.9737569 0.9997688 -0.9776422 0.9737569 0.9997688 -0.9786968 0.9737569 0.9997688 -0.980031 0.9737569 0.9997688 -0.981719 0.9737569 0.9997688 -0.9838545 0.9737569 0.9997688 -0.9865561 0.9737569 0.9997688 -0.9899741 0.9737569 0.9997688 -0.9942982 0.9737569 0.9997688 -0.9997688 0.9737569 0.9997688 -0.9998174 0.9791456 0.9954731 -0.9998557 0.9834461 0.9936849 -0.999886 0.9868713 0.993287 -0.9999099 0.989595 0.9936128 -0.9999288 0.9917582 0.9942731 -0.9999437 0.9934746 0.9950481 -0.9736726 0.9737892 0.9997689 -0.9736726 0.9737891 0.9997689 -0.9736725 0.973789 0.9997689 -0.9736724 0.9737888 0.9997689 -0.9736723 0.9737886 0.9997689 -0.9736722 0.9737884 0.9997689 -0.9736721 0.9737881 0.9997689 -0.9736719 0.9737877 0.9997689 -0.9736717 0.9737872 0.9997689 -0.9736715 0.9737866 0.9997689 -0.9736712 0.9737859 0.9997689 -0.973671 0.9737851 0.9997689 -0.9736708 0.9737842 0.9997689 -0.9736708 0.9737833 0.9997689 -0.973671 0.9737823 0.9997688 -0.9736717 0.9737816 0.9997688 -0.9736733 0.9737814 0.9997688 -0.9736756 0.9737814 0.9997688 -0.9736786 0.9737814 0.9997688 -0.9736823 0.9737814 0.9997688 -0.973687 0.9737814 0.9997688 -0.973693 0.9737814 0.9997688 -0.9737006 0.9737814 0.9997688 -0.9737101 0.9737814 0.9997688 -0.9737222 0.9737814 0.9997688 -0.9737375 0.9737814 0.9997688 -0.9737569 0.9737814 0.9997688 -0.9737814 0.9737814 0.9997688 -0.9738123 0.9737814 0.9997688 -0.9738515 0.9737814 0.9997688 -0.9739011 0.9737814 0.9997688 -0.9739638 0.9737814 0.9997688 -0.9740432 0.9737814 0.9997688 -0.9741436 0.9737814 0.9997688 -0.9742706 0.9737814 0.9997688 -0.9744313 0.9737814 0.9997688 -0.9746346 0.9737814 0.9997688 -0.9748918 0.9737814 0.9997688 -0.9752172 0.9737814 0.9997688 -0.9756289 0.9737814 0.9997688 -0.9761497 0.9737814 0.9997688 -0.9768086 0.9737814 0.9997688 -0.9776422 0.9737814 0.9997688 -0.9786968 0.9737814 0.9997688 -0.980031 0.9737814 0.9997688 -0.981719 0.9737814 0.9997688 -0.9838545 0.9737814 0.9997688 -0.9865561 0.9737814 0.9997688 -0.9899741 0.9737814 0.9997688 -0.9942982 0.9737814 0.9997688 -0.9997688 0.9737814 0.9997688 -0.9998174 0.979161 0.9954731 -0.9998557 0.9834557 0.9936849 -0.999886 0.9868773 0.993287 -0.9999099 0.9895988 0.9936128 -0.9999288 0.9917606 0.9942731 -0.9999437 0.9934761 0.9950481 -0.9736726 0.9738202 0.9997689 -0.9736726 0.9738201 0.9997689 -0.9736725 0.97382 0.9997689 -0.9736724 0.9738198 0.9997689 -0.9736723 0.9738196 0.9997689 -0.9736722 0.9738193 0.9997689 -0.9736721 0.973819 0.9997689 -0.9736719 0.9738186 0.9997689 -0.9736717 0.9738182 0.9997689 -0.9736715 0.9738176 0.9997689 -0.9736712 0.9738169 0.9997689 -0.973671 0.9738161 0.9997689 -0.9736708 0.9738152 0.9997689 -0.9736708 0.9738142 0.9997689 -0.973671 0.9738133 0.9997688 -0.9736717 0.9738126 0.9997688 -0.9736733 0.9738123 0.9997688 -0.9736756 0.9738123 0.9997688 -0.9736786 0.9738123 0.9997688 -0.9736823 0.9738123 0.9997688 -0.973687 0.9738123 0.9997688 -0.973693 0.9738123 0.9997688 -0.9737006 0.9738123 0.9997688 -0.9737101 0.9738123 0.9997688 -0.9737222 0.9738123 0.9997688 -0.9737375 0.9738123 0.9997688 -0.9737569 0.9738123 0.9997688 -0.9737814 0.9738123 0.9997688 -0.9738123 0.9738123 0.9997688 -0.9738515 0.9738123 0.9997688 -0.9739011 0.9738123 0.9997688 -0.9739638 0.9738123 0.9997688 -0.9740432 0.9738123 0.9997688 -0.9741436 0.9738123 0.9997688 -0.9742706 0.9738123 0.9997688 -0.9744313 0.9738123 0.9997688 -0.9746346 0.9738123 0.9997688 -0.9748918 0.9738123 0.9997688 -0.9752172 0.9738123 0.9997688 -0.9756289 0.9738123 0.9997688 -0.9761497 0.9738123 0.9997688 -0.9768086 0.9738123 0.9997688 -0.9776422 0.9738123 0.9997688 -0.9786968 0.9738123 0.9997688 -0.980031 0.9738123 0.9997688 -0.981719 0.9738123 0.9997688 -0.9838545 0.9738123 0.9997688 -0.9865561 0.9738123 0.9997688 -0.9899741 0.9738123 0.9997688 -0.9942982 0.9738123 0.9997688 -0.9997688 0.9738123 0.9997688 -0.9998174 0.9791804 0.9954731 -0.9998557 0.9834679 0.9936849 -0.999886 0.986885 0.993287 -0.9999099 0.9896036 0.9936128 -0.9999288 0.9917636 0.9942731 -0.9999437 0.9934779 0.9950481 -0.9736726 0.9738594 0.9997689 -0.9736726 0.9738593 0.9997689 -0.9736725 0.9738591 0.9997689 -0.9736724 0.973859 0.9997689 -0.9736723 0.9738588 0.9997689 -0.9736722 0.9738585 0.9997689 -0.9736721 0.9738582 0.9997689 -0.9736719 0.9738578 0.9997689 -0.9736717 0.9738573 0.9997689 -0.9736715 0.9738568 0.9997689 -0.9736712 0.9738561 0.9997689 -0.973671 0.9738553 0.9997689 -0.9736708 0.9738544 0.9997689 -0.9736708 0.9738534 0.9997689 -0.973671 0.9738525 0.9997688 -0.9736717 0.9738518 0.9997688 -0.9736733 0.9738515 0.9997688 -0.9736756 0.9738515 0.9997688 -0.9736786 0.9738515 0.9997688 -0.9736823 0.9738515 0.9997688 -0.973687 0.9738515 0.9997688 -0.973693 0.9738515 0.9997688 -0.9737006 0.9738515 0.9997688 -0.9737101 0.9738515 0.9997688 -0.9737222 0.9738515 0.9997688 -0.9737375 0.9738515 0.9997688 -0.9737569 0.9738515 0.9997688 -0.9737814 0.9738515 0.9997688 -0.9738123 0.9738515 0.9997688 -0.9738515 0.9738515 0.9997688 -0.9739011 0.9738515 0.9997688 -0.9739638 0.9738515 0.9997688 -0.9740432 0.9738515 0.9997688 -0.9741436 0.9738515 0.9997688 -0.9742706 0.9738515 0.9997688 -0.9744313 0.9738515 0.9997688 -0.9746346 0.9738515 0.9997688 -0.9748918 0.9738515 0.9997688 -0.9752172 0.9738515 0.9997688 -0.9756289 0.9738515 0.9997688 -0.9761497 0.9738515 0.9997688 -0.9768086 0.9738515 0.9997688 -0.9776422 0.9738515 0.9997688 -0.9786968 0.9738515 0.9997688 -0.980031 0.9738515 0.9997688 -0.981719 0.9738515 0.9997688 -0.9838545 0.9738515 0.9997688 -0.9865561 0.9738515 0.9997688 -0.9899741 0.9738515 0.9997688 -0.9942982 0.9738515 0.9997688 -0.9997688 0.9738515 0.9997688 -0.9998174 0.979205 0.9954731 -0.9998557 0.9834833 0.9936849 -0.999886 0.9868946 0.993287 -0.9999099 0.9896096 0.9936128 -0.9999288 0.9917674 0.9942731 -0.9999437 0.9934803 0.9950481 -0.9736726 0.9739089 0.9997689 -0.9736726 0.9739088 0.9997689 -0.9736725 0.9739087 0.9997689 -0.9736724 0.9739085 0.9997689 -0.9736723 0.9739083 0.9997689 -0.9736722 0.9739081 0.9997689 -0.9736721 0.9739078 0.9997689 -0.9736719 0.9739074 0.9997689 -0.9736717 0.9739069 0.9997689 -0.9736715 0.9739063 0.9997689 -0.9736712 0.9739057 0.9997689 -0.973671 0.9739049 0.9997689 -0.9736708 0.973904 0.9997689 -0.9736708 0.973903 0.9997689 -0.973671 0.9739021 0.9997688 -0.9736717 0.9739013 0.9997688 -0.9736733 0.9739011 0.9997688 -0.9736756 0.9739011 0.9997688 -0.9736786 0.9739011 0.9997688 -0.9736823 0.9739011 0.9997688 -0.973687 0.9739011 0.9997688 -0.973693 0.9739011 0.9997688 -0.9737006 0.9739011 0.9997688 -0.9737101 0.9739011 0.9997688 -0.9737222 0.9739011 0.9997688 -0.9737375 0.9739011 0.9997688 -0.9737569 0.9739011 0.9997688 -0.9737814 0.9739011 0.9997688 -0.9738123 0.9739011 0.9997688 -0.9738515 0.9739011 0.9997688 -0.9739011 0.9739011 0.9997688 -0.9739638 0.9739011 0.9997688 -0.9740432 0.9739011 0.9997688 -0.9741436 0.9739011 0.9997688 -0.9742706 0.9739011 0.9997688 -0.9744313 0.9739011 0.9997688 -0.9746346 0.9739011 0.9997688 -0.9748918 0.9739011 0.9997688 -0.9752172 0.9739011 0.9997688 -0.9756289 0.9739011 0.9997688 -0.9761497 0.9739011 0.9997688 -0.9768086 0.9739011 0.9997688 -0.9776422 0.9739011 0.9997688 -0.9786968 0.9739011 0.9997688 -0.980031 0.9739011 0.9997688 -0.981719 0.9739011 0.9997688 -0.9838545 0.9739011 0.9997688 -0.9865561 0.9739011 0.9997688 -0.9899741 0.9739011 0.9997688 -0.9942982 0.9739011 0.9997688 -0.9997688 0.9739011 0.9997688 -0.9998174 0.9792361 0.9954731 -0.9998557 0.9835029 0.9936849 -0.999886 0.9869069 0.993287 -0.9999099 0.9896173 0.9936128 -0.9999288 0.9917722 0.9942731 -0.9999437 0.9934833 0.9950481 -0.9736726 0.9739717 0.9997689 -0.9736726 0.9739715 0.9997689 -0.9736725 0.9739714 0.9997689 -0.9736724 0.9739713 0.9997689 -0.9736723 0.9739711 0.9997689 -0.9736722 0.9739708 0.9997689 -0.9736721 0.9739705 0.9997689 -0.9736719 0.9739701 0.9997689 -0.9736717 0.9739696 0.9997689 -0.9736715 0.9739691 0.9997689 -0.9736712 0.9739684 0.9997689 -0.973671 0.9739676 0.9997689 -0.9736708 0.9739667 0.9997689 -0.9736708 0.9739657 0.9997689 -0.973671 0.9739648 0.9997688 -0.9736717 0.9739641 0.9997688 -0.9736733 0.9739638 0.9997688 -0.9736756 0.9739638 0.9997688 -0.9736786 0.9739638 0.9997688 -0.9736823 0.9739638 0.9997688 -0.973687 0.9739638 0.9997688 -0.973693 0.9739638 0.9997688 -0.9737006 0.9739638 0.9997688 -0.9737101 0.9739638 0.9997688 -0.9737222 0.9739638 0.9997688 -0.9737375 0.9739638 0.9997688 -0.9737569 0.9739638 0.9997688 -0.9737814 0.9739638 0.9997688 -0.9738123 0.9739638 0.9997688 -0.9738515 0.9739638 0.9997688 -0.9739011 0.9739638 0.9997688 -0.9739638 0.9739638 0.9997688 -0.9740432 0.9739638 0.9997688 -0.9741436 0.9739638 0.9997688 -0.9742706 0.9739638 0.9997688 -0.9744313 0.9739638 0.9997688 -0.9746346 0.9739638 0.9997688 -0.9748918 0.9739638 0.9997688 -0.9752172 0.9739638 0.9997688 -0.9756289 0.9739638 0.9997688 -0.9761497 0.9739638 0.9997688 -0.9768086 0.9739638 0.9997688 -0.9776422 0.9739638 0.9997688 -0.9786968 0.9739638 0.9997688 -0.980031 0.9739638 0.9997688 -0.981719 0.9739638 0.9997688 -0.9838545 0.9739638 0.9997688 -0.9865561 0.9739638 0.9997688 -0.9899741 0.9739638 0.9997688 -0.9942982 0.9739638 0.9997688 -0.9997688 0.9739638 0.9997688 -0.9998174 0.9792755 0.9954731 -0.9998557 0.9835276 0.9936849 -0.999886 0.9869223 0.993287 -0.9999099 0.989627 0.9936128 -0.9999288 0.9917782 0.9942731 -0.9999437 0.9934871 0.9950481 -0.9736726 0.974051 0.9997689 -0.9736726 0.9740509 0.9997689 -0.9736725 0.9740508 0.9997689 -0.9736724 0.9740506 0.9997689 -0.9736723 0.9740504 0.9997689 -0.9736722 0.9740501 0.9997689 -0.9736721 0.9740498 0.9997689 -0.9736719 0.9740494 0.9997689 -0.9736717 0.974049 0.9997689 -0.9736715 0.9740484 0.9997689 -0.9736712 0.9740477 0.9997689 -0.973671 0.9740469 0.9997689 -0.9736708 0.974046 0.9997689 -0.9736708 0.9740451 0.9997689 -0.973671 0.9740442 0.9997688 -0.9736717 0.9740434 0.9997688 -0.9736733 0.9740432 0.9997688 -0.9736756 0.9740432 0.9997688 -0.9736786 0.9740432 0.9997688 -0.9736823 0.9740432 0.9997688 -0.973687 0.9740432 0.9997688 -0.973693 0.9740432 0.9997688 -0.9737006 0.9740432 0.9997688 -0.9737101 0.9740432 0.9997688 -0.9737222 0.9740432 0.9997688 -0.9737375 0.9740432 0.9997688 -0.9737569 0.9740432 0.9997688 -0.9737814 0.9740432 0.9997688 -0.9738123 0.9740432 0.9997688 -0.9738515 0.9740432 0.9997688 -0.9739011 0.9740432 0.9997688 -0.9739638 0.9740432 0.9997688 -0.9740432 0.9740432 0.9997688 -0.9741436 0.9740432 0.9997688 -0.9742706 0.9740432 0.9997688 -0.9744313 0.9740432 0.9997688 -0.9746346 0.9740432 0.9997688 -0.9748918 0.9740432 0.9997688 -0.9752172 0.9740432 0.9997688 -0.9756289 0.9740432 0.9997688 -0.9761497 0.9740432 0.9997688 -0.9768086 0.9740432 0.9997688 -0.9776422 0.9740432 0.9997688 -0.9786968 0.9740432 0.9997688 -0.980031 0.9740432 0.9997688 -0.981719 0.9740432 0.9997688 -0.9838545 0.9740432 0.9997688 -0.9865561 0.9740432 0.9997688 -0.9899741 0.9740432 0.9997688 -0.9942982 0.9740432 0.9997688 -0.9997688 0.9740432 0.9997688 -0.9998174 0.9793253 0.9954731 -0.9998557 0.9835588 0.9936849 -0.999886 0.9869419 0.993287 -0.9999099 0.9896392 0.9936128 -0.9999288 0.9917859 0.9942731 -0.9999437 0.9934919 0.9950481 -0.9736726 0.9741514 0.9997689 -0.9736726 0.9741513 0.9997689 -0.9736725 0.9741511 0.9997689 -0.9736724 0.974151 0.9997689 -0.9736723 0.9741508 0.9997689 -0.9736722 0.9741505 0.9997689 -0.9736721 0.9741502 0.9997689 -0.9736719 0.9741498 0.9997689 -0.9736717 0.9741494 0.9997689 -0.9736715 0.9741488 0.9997689 -0.9736712 0.9741481 0.9997689 -0.973671 0.9741473 0.9997689 -0.9736708 0.9741464 0.9997689 -0.9736708 0.9741455 0.9997689 -0.973671 0.9741446 0.9997688 -0.9736717 0.9741438 0.9997688 -0.9736733 0.9741436 0.9997688 -0.9736756 0.9741436 0.9997688 -0.9736786 0.9741436 0.9997688 -0.9736823 0.9741436 0.9997688 -0.973687 0.9741436 0.9997688 -0.973693 0.9741436 0.9997688 -0.9737006 0.9741436 0.9997688 -0.9737101 0.9741436 0.9997688 -0.9737222 0.9741436 0.9997688 -0.9737375 0.9741436 0.9997688 -0.9737569 0.9741436 0.9997688 -0.9737814 0.9741436 0.9997688 -0.9738123 0.9741436 0.9997688 -0.9738515 0.9741436 0.9997688 -0.9739011 0.9741436 0.9997688 -0.9739638 0.9741436 0.9997688 -0.9740432 0.9741436 0.9997688 -0.9741436 0.9741436 0.9997688 -0.9742706 0.9741436 0.9997688 -0.9744313 0.9741436 0.9997688 -0.9746346 0.9741436 0.9997688 -0.9748918 0.9741436 0.9997688 -0.9752172 0.9741436 0.9997688 -0.9756289 0.9741436 0.9997688 -0.9761497 0.9741436 0.9997688 -0.9768086 0.9741436 0.9997688 -0.9776422 0.9741436 0.9997688 -0.9786968 0.9741436 0.9997688 -0.980031 0.9741436 0.9997688 -0.981719 0.9741436 0.9997688 -0.9838545 0.9741436 0.9997688 -0.9865561 0.9741436 0.9997688 -0.9899741 0.9741436 0.9997688 -0.9942982 0.9741436 0.9997688 -0.9997688 0.9741436 0.9997688 -0.9998174 0.9793883 0.9954731 -0.9998557 0.9835983 0.9936849 -0.999886 0.9869667 0.993287 -0.9999099 0.9896547 0.9936128 -0.9999288 0.9917956 0.9942731 -0.9999437 0.993498 0.9950481 -0.9736726 0.9742783 0.9997689 -0.9736726 0.9742782 0.9997689 -0.9736725 0.9742781 0.9997689 -0.9736724 0.974278 0.9997689 -0.9736723 0.9742778 0.9997689 -0.9736722 0.9742775 0.9997689 -0.9736721 0.9742772 0.9997689 -0.9736719 0.9742768 0.9997689 -0.9736717 0.9742763 0.9997689 -0.9736715 0.9742758 0.9997689 -0.9736712 0.9742751 0.9997689 -0.973671 0.9742743 0.9997689 -0.9736708 0.9742734 0.9997689 -0.9736708 0.9742725 0.9997689 -0.973671 0.9742716 0.9997688 -0.9736717 0.9742709 0.9997688 -0.9736733 0.9742706 0.9997688 -0.9736756 0.9742706 0.9997688 -0.9736786 0.9742706 0.9997688 -0.9736823 0.9742706 0.9997688 -0.973687 0.9742706 0.9997688 -0.973693 0.9742706 0.9997688 -0.9737006 0.9742706 0.9997688 -0.9737101 0.9742706 0.9997688 -0.9737222 0.9742706 0.9997688 -0.9737375 0.9742706 0.9997688 -0.9737569 0.9742706 0.9997688 -0.9737814 0.9742706 0.9997688 -0.9738123 0.9742706 0.9997688 -0.9738515 0.9742706 0.9997688 -0.9739011 0.9742706 0.9997688 -0.9739638 0.9742706 0.9997688 -0.9740432 0.9742706 0.9997688 -0.9741436 0.9742706 0.9997688 -0.9742706 0.9742706 0.9997688 -0.9744313 0.9742706 0.9997688 -0.9746346 0.9742706 0.9997688 -0.9748918 0.9742706 0.9997688 -0.9752172 0.9742706 0.9997688 -0.9756289 0.9742706 0.9997688 -0.9761497 0.9742706 0.9997688 -0.9768086 0.9742706 0.9997688 -0.9776422 0.9742706 0.9997688 -0.9786968 0.9742706 0.9997688 -0.980031 0.9742706 0.9997688 -0.981719 0.9742706 0.9997688 -0.9838545 0.9742706 0.9997688 -0.9865561 0.9742706 0.9997688 -0.9899741 0.9742706 0.9997688 -0.9942982 0.9742706 0.9997688 -0.9997688 0.9742706 0.9997688 -0.9998174 0.9794681 0.9954731 -0.9998557 0.9836483 0.9936849 -0.999886 0.986998 0.993287 -0.9999099 0.9896744 0.9936128 -0.9999288 0.9918079 0.9942731 -0.9999437 0.9935057 0.9950481 -0.9736726 0.974439 0.9997689 -0.9736726 0.9744389 0.9997689 -0.9736725 0.9744388 0.9997689 -0.9736724 0.9744386 0.9997689 -0.9736723 0.9744384 0.9997689 -0.9736722 0.9744382 0.9997689 -0.9736721 0.9744378 0.9997689 -0.9736719 0.9744375 0.9997689 -0.9736717 0.974437 0.9997689 -0.9736715 0.9744364 0.9997689 -0.9736712 0.9744358 0.9997689 -0.973671 0.974435 0.9997689 -0.9736708 0.9744341 0.9997689 -0.9736708 0.9744332 0.9997689 -0.973671 0.9744323 0.9997688 -0.9736717 0.9744315 0.9997688 -0.9736733 0.9744313 0.9997688 -0.9736756 0.9744313 0.9997688 -0.9736786 0.9744313 0.9997688 -0.9736823 0.9744313 0.9997688 -0.973687 0.9744313 0.9997688 -0.973693 0.9744313 0.9997688 -0.9737006 0.9744313 0.9997688 -0.9737101 0.9744313 0.9997688 -0.9737222 0.9744313 0.9997688 -0.9737375 0.9744313 0.9997688 -0.9737569 0.9744313 0.9997688 -0.9737814 0.9744313 0.9997688 -0.9738123 0.9744313 0.9997688 -0.9738515 0.9744313 0.9997688 -0.9739011 0.9744313 0.9997688 -0.9739638 0.9744313 0.9997688 -0.9740432 0.9744313 0.9997688 -0.9741436 0.9744313 0.9997688 -0.9742706 0.9744313 0.9997688 -0.9744313 0.9744313 0.9997688 -0.9746346 0.9744313 0.9997688 -0.9748918 0.9744313 0.9997688 -0.9752172 0.9744313 0.9997688 -0.9756289 0.9744313 0.9997688 -0.9761497 0.9744313 0.9997688 -0.9768086 0.9744313 0.9997688 -0.9776422 0.9744313 0.9997688 -0.9786968 0.9744313 0.9997688 -0.980031 0.9744313 0.9997688 -0.981719 0.9744313 0.9997688 -0.9838545 0.9744313 0.9997688 -0.9865561 0.9744313 0.9997688 -0.9899741 0.9744313 0.9997688 -0.9942982 0.9744313 0.9997688 -0.9997688 0.9744313 0.9997688 -0.9998174 0.9795689 0.9954731 -0.9998557 0.9837116 0.9936849 -0.999886 0.9870376 0.993287 -0.9999099 0.9896992 0.9936128 -0.9999288 0.9918234 0.9942731 -0.9999437 0.9935154 0.9950481 -0.9736726 0.9746422 0.9997689 -0.9736726 0.9746421 0.9997689 -0.9736725 0.974642 0.9997689 -0.9736724 0.9746418 0.9997689 -0.9736723 0.9746416 0.9997689 -0.9736722 0.9746414 0.9997689 -0.9736721 0.9746411 0.9997689 -0.9736719 0.9746407 0.9997689 -0.9736717 0.9746403 0.9997689 -0.9736715 0.9746397 0.9997689 -0.9736712 0.974639 0.9997689 -0.973671 0.9746383 0.9997689 -0.9736708 0.9746374 0.9997689 -0.9736708 0.9746365 0.9997689 -0.973671 0.9746356 0.9997688 -0.9736717 0.9746348 0.9997688 -0.9736733 0.9746346 0.9997688 -0.9736756 0.9746346 0.9997688 -0.9736786 0.9746346 0.9997688 -0.9736823 0.9746346 0.9997688 -0.973687 0.9746346 0.9997688 -0.973693 0.9746346 0.9997688 -0.9737006 0.9746346 0.9997688 -0.9737101 0.9746346 0.9997688 -0.9737222 0.9746346 0.9997688 -0.9737375 0.9746346 0.9997688 -0.9737569 0.9746346 0.9997688 -0.9737814 0.9746346 0.9997688 -0.9738123 0.9746346 0.9997688 -0.9738515 0.9746346 0.9997688 -0.9739011 0.9746346 0.9997688 -0.9739638 0.9746346 0.9997688 -0.9740432 0.9746346 0.9997688 -0.9741436 0.9746346 0.9997688 -0.9742706 0.9746346 0.9997688 -0.9744313 0.9746346 0.9997688 -0.9746346 0.9746346 0.9997688 -0.9748918 0.9746346 0.9997688 -0.9752172 0.9746346 0.9997688 -0.9756289 0.9746346 0.9997688 -0.9761497 0.9746346 0.9997688 -0.9768086 0.9746346 0.9997688 -0.9776422 0.9746346 0.9997688 -0.9786968 0.9746346 0.9997688 -0.980031 0.9746346 0.9997688 -0.981719 0.9746346 0.9997688 -0.9838545 0.9746346 0.9997688 -0.9865561 0.9746346 0.9997688 -0.9899741 0.9746346 0.9997688 -0.9942982 0.9746346 0.9997688 -0.9997688 0.9746346 0.9997688 -0.9998174 0.9796966 0.9954731 -0.9998557 0.9837916 0.9936849 -0.999886 0.9870878 0.993287 -0.9999099 0.9897306 0.9936128 -0.9999288 0.9918431 0.9942731 -0.9999437 0.9935277 0.9950481 -0.9736726 0.9748994 0.9997689 -0.9736726 0.9748993 0.9997689 -0.9736725 0.9748991 0.9997689 -0.9736724 0.974899 0.9997689 -0.9736723 0.9748988 0.9997689 -0.9736722 0.9748985 0.9997689 -0.9736721 0.9748982 0.9997689 -0.9736719 0.9748979 0.9997689 -0.9736717 0.9748974 0.9997689 -0.9736715 0.9748969 0.9997689 -0.9736712 0.9748962 0.9997689 -0.973671 0.9748954 0.9997689 -0.9736708 0.9748946 0.9997689 -0.9736708 0.9748937 0.9997689 -0.973671 0.9748928 0.9997688 -0.9736717 0.9748921 0.9997688 -0.9736733 0.9748918 0.9997688 -0.9736756 0.9748918 0.9997688 -0.9736786 0.9748918 0.9997688 -0.9736823 0.9748918 0.9997688 -0.973687 0.9748918 0.9997688 -0.973693 0.9748918 0.9997688 -0.9737006 0.9748918 0.9997688 -0.9737101 0.9748918 0.9997688 -0.9737222 0.9748918 0.9997688 -0.9737375 0.9748918 0.9997688 -0.9737569 0.9748918 0.9997688 -0.9737814 0.9748918 0.9997688 -0.9738123 0.9748918 0.9997688 -0.9738515 0.9748918 0.9997688 -0.9739011 0.9748918 0.9997688 -0.9739638 0.9748918 0.9997688 -0.9740432 0.9748918 0.9997688 -0.9741436 0.9748918 0.9997688 -0.9742706 0.9748918 0.9997688 -0.9744313 0.9748918 0.9997688 -0.9746346 0.9748918 0.9997688 -0.9748918 0.9748918 0.9997688 -0.9752172 0.9748918 0.9997688 -0.9756289 0.9748918 0.9997688 -0.9761497 0.9748918 0.9997688 -0.9768086 0.9748918 0.9997688 -0.9776422 0.9748918 0.9997688 -0.9786968 0.9748918 0.9997688 -0.980031 0.9748918 0.9997688 -0.981719 0.9748918 0.9997688 -0.9838545 0.9748918 0.9997688 -0.9865561 0.9748918 0.9997688 -0.9899741 0.9748918 0.9997688 -0.9942982 0.9748918 0.9997688 -0.9997688 0.9748918 0.9997688 -0.9998174 0.979858 0.9954731 -0.9998557 0.9838928 0.9936849 -0.999886 0.9871512 0.993287 -0.9999099 0.9897703 0.9936128 -0.9999288 0.991868 0.9942731 -0.9999437 0.9935432 0.9950481 -0.9736726 0.9752247 0.9997689 -0.9736726 0.9752246 0.9997689 -0.9736725 0.9752244 0.9997689 -0.9736724 0.9752243 0.9997689 -0.9736723 0.9752241 0.9997689 -0.9736722 0.9752238 0.9997689 -0.9736721 0.9752236 0.9997689 -0.9736719 0.9752232 0.9997689 -0.9736717 0.9752227 0.9997689 -0.9736715 0.9752222 0.9997689 -0.9736712 0.9752215 0.9997689 -0.973671 0.9752208 0.9997689 -0.9736708 0.9752199 0.9997689 -0.9736708 0.975219 0.9997689 -0.973671 0.9752181 0.9997688 -0.9736717 0.9752174 0.9997688 -0.9736733 0.9752172 0.9997688 -0.9736756 0.9752172 0.9997688 -0.9736786 0.9752172 0.9997688 -0.9736823 0.9752172 0.9997688 -0.973687 0.9752172 0.9997688 -0.973693 0.9752172 0.9997688 -0.9737006 0.9752172 0.9997688 -0.9737101 0.9752172 0.9997688 -0.9737222 0.9752172 0.9997688 -0.9737375 0.9752172 0.9997688 -0.9737569 0.9752172 0.9997688 -0.9737814 0.9752172 0.9997688 -0.9738123 0.9752172 0.9997688 -0.9738515 0.9752172 0.9997688 -0.9739011 0.9752172 0.9997688 -0.9739638 0.9752172 0.9997688 -0.9740432 0.9752172 0.9997688 -0.9741436 0.9752172 0.9997688 -0.9742706 0.9752172 0.9997688 -0.9744313 0.9752172 0.9997688 -0.9746346 0.9752172 0.9997688 -0.9748918 0.9752172 0.9997688 -0.9752172 0.9752172 0.9997688 -0.9756289 0.9752172 0.9997688 -0.9761497 0.9752172 0.9997688 -0.9768086 0.9752172 0.9997688 -0.9776422 0.9752172 0.9997688 -0.9786968 0.9752172 0.9997688 -0.980031 0.9752172 0.9997688 -0.981719 0.9752172 0.9997688 -0.9838545 0.9752172 0.9997688 -0.9865561 0.9752172 0.9997688 -0.9899741 0.9752172 0.9997688 -0.9942982 0.9752172 0.9997688 -0.9997688 0.9752172 0.9997688 -0.9998174 0.9800622 0.9954731 -0.9998557 0.9840209 0.9936849 -0.999886 0.9872315 0.993287 -0.9999099 0.9898206 0.9936128 -0.9999288 0.9918994 0.9942731 -0.9999437 0.9935629 0.9950481 -0.9736726 0.9756362 0.9997689 -0.9736726 0.9756361 0.9997689 -0.9736725 0.975636 0.9997689 -0.9736724 0.9756358 0.9997689 -0.9736723 0.9756356 0.9997689 -0.9736722 0.9756354 0.9997689 -0.9736721 0.9756351 0.9997689 -0.9736719 0.9756348 0.9997689 -0.9736717 0.9756343 0.9997689 -0.9736715 0.9756338 0.9997689 -0.9736712 0.9756331 0.9997689 -0.973671 0.9756324 0.9997689 -0.9736708 0.9756316 0.9997689 -0.9736708 0.9756307 0.9997689 -0.973671 0.9756298 0.9997688 -0.9736717 0.9756291 0.9997688 -0.9736733 0.9756289 0.9997688 -0.9736756 0.9756289 0.9997688 -0.9736786 0.9756289 0.9997688 -0.9736823 0.9756289 0.9997688 -0.973687 0.9756289 0.9997688 -0.973693 0.9756289 0.9997688 -0.9737006 0.9756289 0.9997688 -0.9737101 0.9756289 0.9997688 -0.9737222 0.9756289 0.9997688 -0.9737375 0.9756289 0.9997688 -0.9737569 0.9756289 0.9997688 -0.9737814 0.9756289 0.9997688 -0.9738123 0.9756289 0.9997688 -0.9738515 0.9756289 0.9997688 -0.9739011 0.9756289 0.9997688 -0.9739638 0.9756289 0.9997688 -0.9740432 0.9756289 0.9997688 -0.9741436 0.9756289 0.9997688 -0.9742706 0.9756289 0.9997688 -0.9744313 0.9756289 0.9997688 -0.9746346 0.9756289 0.9997688 -0.9748918 0.9756289 0.9997688 -0.9752172 0.9756289 0.9997688 -0.9756289 0.9756289 0.9997688 -0.9761497 0.9756289 0.9997688 -0.9768086 0.9756289 0.9997688 -0.9776422 0.9756289 0.9997688 -0.9786968 0.9756289 0.9997688 -0.980031 0.9756289 0.9997688 -0.981719 0.9756289 0.9997688 -0.9838545 0.9756289 0.9997688 -0.9865561 0.9756289 0.9997688 -0.9899741 0.9756289 0.9997688 -0.9942982 0.9756289 0.9997688 -0.9997688 0.9756289 0.9997688 -0.9998174 0.9803206 0.9954731 -0.9998557 0.9841829 0.9936849 -0.999886 0.987333 0.993287 -0.9999099 0.9898842 0.9936128 -0.9999288 0.9919392 0.9942731 -0.9999437 0.9935878 0.9950481 -0.9736726 0.9761569 0.9997689 -0.9736726 0.9761568 0.9997689 -0.9736725 0.9761567 0.9997689 -0.9736724 0.9761565 0.9997689 -0.9736723 0.9761563 0.9997689 -0.9736722 0.9761561 0.9997689 -0.9736721 0.9761558 0.9997689 -0.9736719 0.9761554 0.9997689 -0.9736717 0.976155 0.9997689 -0.9736715 0.9761545 0.9997689 -0.9736712 0.9761539 0.9997689 -0.973671 0.9761531 0.9997689 -0.9736708 0.9761523 0.9997689 -0.9736708 0.9761514 0.9997689 -0.973671 0.9761506 0.9997688 -0.9736717 0.9761499 0.9997688 -0.9736733 0.9761497 0.9997688 -0.9736756 0.9761497 0.9997688 -0.9736786 0.9761497 0.9997688 -0.9736823 0.9761497 0.9997688 -0.973687 0.9761497 0.9997688 -0.973693 0.9761497 0.9997688 -0.9737006 0.9761497 0.9997688 -0.9737101 0.9761497 0.9997688 -0.9737222 0.9761497 0.9997688 -0.9737375 0.9761497 0.9997688 -0.9737569 0.9761497 0.9997688 -0.9737814 0.9761497 0.9997688 -0.9738123 0.9761497 0.9997688 -0.9738515 0.9761497 0.9997688 -0.9739011 0.9761497 0.9997688 -0.9739638 0.9761497 0.9997688 -0.9740432 0.9761497 0.9997688 -0.9741436 0.9761497 0.9997688 -0.9742706 0.9761497 0.9997688 -0.9744313 0.9761497 0.9997688 -0.9746346 0.9761497 0.9997688 -0.9748918 0.9761497 0.9997688 -0.9752172 0.9761497 0.9997688 -0.9756289 0.9761497 0.9997688 -0.9761497 0.9761497 0.9997688 -0.9768086 0.9761497 0.9997688 -0.9776422 0.9761497 0.9997688 -0.9786968 0.9761497 0.9997688 -0.980031 0.9761497 0.9997688 -0.981719 0.9761497 0.9997688 -0.9838545 0.9761497 0.9997688 -0.9865561 0.9761497 0.9997688 -0.9899741 0.9761497 0.9997688 -0.9942982 0.9761497 0.9997688 -0.9997688 0.9761497 0.9997688 -0.9998174 0.9806476 0.9954731 -0.9998557 0.984388 0.9936849 -0.999886 0.9874615 0.993287 -0.9999099 0.9899646 0.9936128 -0.9999288 0.9919896 0.9942731 -0.9999437 0.9936193 0.9950481 -0.9736726 0.9768156 0.9997689 -0.9736726 0.9768155 0.9997689 -0.9736725 0.9768154 0.9997689 -0.9736724 0.9768152 0.9997689 -0.9736723 0.976815 0.9997689 -0.9736722 0.9768148 0.9997689 -0.9736721 0.9768145 0.9997689 -0.9736719 0.9768142 0.9997689 -0.9736717 0.9768138 0.9997689 -0.9736715 0.9768133 0.9997689 -0.9736712 0.9768127 0.9997689 -0.973671 0.9768119 0.9997689 -0.9736708 0.9768112 0.9997689 -0.9736708 0.9768103 0.9997689 -0.973671 0.9768095 0.9997688 -0.9736717 0.9768088 0.9997688 -0.9736733 0.9768086 0.9997688 -0.9736756 0.9768086 0.9997688 -0.9736786 0.9768086 0.9997688 -0.9736823 0.9768086 0.9997688 -0.973687 0.9768086 0.9997688 -0.973693 0.9768086 0.9997688 -0.9737006 0.9768086 0.9997688 -0.9737101 0.9768086 0.9997688 -0.9737222 0.9768086 0.9997688 -0.9737375 0.9768086 0.9997688 -0.9737569 0.9768086 0.9997688 -0.9737814 0.9768086 0.9997688 -0.9738123 0.9768086 0.9997688 -0.9738515 0.9768086 0.9997688 -0.9739011 0.9768086 0.9997688 -0.9739638 0.9768086 0.9997688 -0.9740432 0.9768086 0.9997688 -0.9741436 0.9768086 0.9997688 -0.9742706 0.9768086 0.9997688 -0.9744313 0.9768086 0.9997688 -0.9746346 0.9768086 0.9997688 -0.9748918 0.9768086 0.9997688 -0.9752172 0.9768086 0.9997688 -0.9756289 0.9768086 0.9997688 -0.9761497 0.9768086 0.9997688 -0.9768086 0.9768086 0.9997688 -0.9776422 0.9768086 0.9997688 -0.9786968 0.9768086 0.9997688 -0.980031 0.9768086 0.9997688 -0.981719 0.9768086 0.9997688 -0.9838545 0.9768086 0.9997688 -0.9865561 0.9768086 0.9997688 -0.9899741 0.9768086 0.9997688 -0.9942982 0.9768086 0.9997688 -0.9997688 0.9768086 0.9997688 -0.9998174 0.9810611 0.9954731 -0.9998557 0.9846473 0.9936849 -0.999886 0.987624 0.993287 -0.9999099 0.9900664 0.9936128 -0.9999288 0.9920533 0.9942731 -0.9999437 0.9936592 0.9950481 -0.9736726 0.9776489 0.9997689 -0.9736726 0.9776488 0.9997689 -0.9736725 0.9776487 0.9997689 -0.9736724 0.9776486 0.9997689 -0.9736723 0.9776484 0.9997689 -0.9736722 0.9776482 0.9997689 -0.9736721 0.9776479 0.9997689 -0.9736719 0.9776476 0.9997689 -0.9736717 0.9776472 0.9997689 -0.9736715 0.9776467 0.9997689 -0.9736712 0.9776461 0.9997689 -0.973671 0.9776454 0.9997689 -0.9736708 0.9776447 0.9997689 -0.9736708 0.9776438 0.9997689 -0.973671 0.977643 0.9997688 -0.9736717 0.9776424 0.9997688 -0.9736733 0.9776422 0.9997688 -0.9736756 0.9776422 0.9997688 -0.9736786 0.9776422 0.9997688 -0.9736823 0.9776422 0.9997688 -0.973687 0.9776422 0.9997688 -0.973693 0.9776422 0.9997688 -0.9737006 0.9776422 0.9997688 -0.9737101 0.9776422 0.9997688 -0.9737222 0.9776422 0.9997688 -0.9737375 0.9776422 0.9997688 -0.9737569 0.9776422 0.9997688 -0.9737814 0.9776422 0.9997688 -0.9738123 0.9776422 0.9997688 -0.9738515 0.9776422 0.9997688 -0.9739011 0.9776422 0.9997688 -0.9739638 0.9776422 0.9997688 -0.9740432 0.9776422 0.9997688 -0.9741436 0.9776422 0.9997688 -0.9742706 0.9776422 0.9997688 -0.9744313 0.9776422 0.9997688 -0.9746346 0.9776422 0.9997688 -0.9748918 0.9776422 0.9997688 -0.9752172 0.9776422 0.9997688 -0.9756289 0.9776422 0.9997688 -0.9761497 0.9776422 0.9997688 -0.9768086 0.9776422 0.9997688 -0.9776422 0.9776422 0.9997688 -0.9786968 0.9776422 0.9997688 -0.980031 0.9776422 0.9997688 -0.981719 0.9776422 0.9997688 -0.9838545 0.9776422 0.9997688 -0.9865561 0.9776422 0.9997688 -0.9899741 0.9776422 0.9997688 -0.9942982 0.9776422 0.9997688 -0.9997688 0.9776422 0.9997688 -0.9998174 0.9815844 0.9954731 -0.9998557 0.9849754 0.9936849 -0.999886 0.9878296 0.993287 -0.9999099 0.9901951 0.9936128 -0.9999288 0.9921339 0.9942731 -0.9999437 0.9937096 0.9950481 -0.9736726 0.9787032 0.9997689 -0.9736726 0.9787031 0.9997689 -0.9736725 0.978703 0.9997689 -0.9736724 0.9787029 0.9997689 -0.9736723 0.9787027 0.9997689 -0.9736722 0.9787025 0.9997689 -0.9736721 0.9787022 0.9997689 -0.9736719 0.9787019 0.9997689 -0.9736717 0.9787015 0.9997689 -0.9736715 0.9787011 0.9997689 -0.9736712 0.9787005 0.9997689 -0.973671 0.9786999 0.9997689 -0.9736708 0.9786991 0.9997689 -0.9736708 0.9786984 0.9997689 -0.973671 0.9786976 0.9997688 -0.9736717 0.978697 0.9997688 -0.9736733 0.9786968 0.9997688 -0.9736756 0.9786968 0.9997688 -0.9736786 0.9786968 0.9997688 -0.9736823 0.9786968 0.9997688 -0.973687 0.9786968 0.9997688 -0.973693 0.9786968 0.9997688 -0.9737006 0.9786968 0.9997688 -0.9737101 0.9786968 0.9997688 -0.9737222 0.9786968 0.9997688 -0.9737375 0.9786968 0.9997688 -0.9737569 0.9786968 0.9997688 -0.9737814 0.9786968 0.9997688 -0.9738123 0.9786968 0.9997688 -0.9738515 0.9786968 0.9997688 -0.9739011 0.9786968 0.9997688 -0.9739638 0.9786968 0.9997688 -0.9740432 0.9786968 0.9997688 -0.9741436 0.9786968 0.9997688 -0.9742706 0.9786968 0.9997688 -0.9744313 0.9786968 0.9997688 -0.9746346 0.9786968 0.9997688 -0.9748918 0.9786968 0.9997688 -0.9752172 0.9786968 0.9997688 -0.9756289 0.9786968 0.9997688 -0.9761497 0.9786968 0.9997688 -0.9768086 0.9786968 0.9997688 -0.9776422 0.9786968 0.9997688 -0.9786968 0.9786968 0.9997688 -0.980031 0.9786968 0.9997688 -0.981719 0.9786968 0.9997688 -0.9838545 0.9786968 0.9997688 -0.9865561 0.9786968 0.9997688 -0.9899741 0.9786968 0.9997688 -0.9942982 0.9786968 0.9997688 -0.9997688 0.9786968 0.9997688 -0.9998174 0.9822464 0.9954731 -0.9998557 0.9853905 0.9936849 -0.999886 0.9880897 0.993287 -0.9999099 0.990358 0.9936128 -0.9999288 0.9922358 0.9942731 -0.9999437 0.9937734 0.9950481 -0.9736726 0.980037 0.9997689 -0.9736726 0.9800369 0.9997689 -0.9736725 0.9800368 0.9997689 -0.9736724 0.9800367 0.9997689 -0.9736723 0.9800366 0.9997689 -0.9736722 0.9800364 0.9997689 -0.9736721 0.9800361 0.9997689 -0.9736719 0.9800358 0.9997689 -0.9736717 0.9800355 0.9997689 -0.9736715 0.980035 0.9997689 -0.9736712 0.9800345 0.9997689 -0.973671 0.9800339 0.9997689 -0.9736708 0.9800332 0.9997689 -0.9736708 0.9800325 0.9997689 -0.973671 0.9800318 0.9997688 -0.9736717 0.9800312 0.9997688 -0.9736733 0.980031 0.9997688 -0.9736756 0.980031 0.9997688 -0.9736786 0.980031 0.9997688 -0.9736823 0.980031 0.9997688 -0.973687 0.980031 0.9997688 -0.973693 0.980031 0.9997688 -0.9737006 0.980031 0.9997688 -0.9737101 0.980031 0.9997688 -0.9737222 0.980031 0.9997688 -0.9737375 0.980031 0.9997688 -0.9737569 0.980031 0.9997688 -0.9737814 0.980031 0.9997688 -0.9738123 0.980031 0.9997688 -0.9738515 0.980031 0.9997688 -0.9739011 0.980031 0.9997688 -0.9739638 0.980031 0.9997688 -0.9740432 0.980031 0.9997688 -0.9741436 0.980031 0.9997688 -0.9742706 0.980031 0.9997688 -0.9744313 0.980031 0.9997688 -0.9746346 0.980031 0.9997688 -0.9748918 0.980031 0.9997688 -0.9752172 0.980031 0.9997688 -0.9756289 0.980031 0.9997688 -0.9761497 0.980031 0.9997688 -0.9768086 0.980031 0.9997688 -0.9776422 0.980031 0.9997688 -0.9786968 0.980031 0.9997688 -0.980031 0.980031 0.9997688 -0.981719 0.980031 0.9997688 -0.9838545 0.980031 0.9997688 -0.9865561 0.980031 0.9997688 -0.9899741 0.980031 0.9997688 -0.9942982 0.980031 0.9997688 -0.9997688 0.980031 0.9997688 -0.9998174 0.9830838 0.9954731 -0.9998557 0.9859157 0.9936849 -0.999886 0.9884188 0.993287 -0.9999099 0.9905641 0.9936128 -0.9999288 0.9923648 0.9942731 -0.9999437 0.9938541 0.9950481 -0.9736726 0.9817245 0.9997689 -0.9736726 0.9817244 0.9997689 -0.9736725 0.9817243 0.9997689 -0.9736724 0.9817242 0.9997689 -0.9736723 0.981724 0.9997689 -0.9736722 0.9817239 0.9997689 -0.9736721 0.9817236 0.9997689 -0.9736719 0.9817234 0.9997689 -0.9736717 0.981723 0.9997689 -0.9736715 0.9817226 0.9997689 -0.9736712 0.9817222 0.9997689 -0.973671 0.9817216 0.9997689 -0.9736708 0.981721 0.9997689 -0.9736708 0.9817203 0.9997689 -0.973671 0.9817197 0.9997688 -0.9736717 0.9817191 0.9997688 -0.9736733 0.981719 0.9997688 -0.9736756 0.981719 0.9997688 -0.9736786 0.981719 0.9997688 -0.9736823 0.981719 0.9997688 -0.973687 0.981719 0.9997688 -0.973693 0.981719 0.9997688 -0.9737006 0.981719 0.9997688 -0.9737101 0.981719 0.9997688 -0.9737222 0.981719 0.9997688 -0.9737375 0.981719 0.9997688 -0.9737569 0.981719 0.9997688 -0.9737814 0.981719 0.9997688 -0.9738123 0.981719 0.9997688 -0.9738515 0.981719 0.9997688 -0.9739011 0.981719 0.9997688 -0.9739638 0.981719 0.9997688 -0.9740432 0.981719 0.9997688 -0.9741436 0.981719 0.9997688 -0.9742706 0.981719 0.9997688 -0.9744313 0.981719 0.9997688 -0.9746346 0.981719 0.9997688 -0.9748918 0.981719 0.9997688 -0.9752172 0.981719 0.9997688 -0.9756289 0.981719 0.9997688 -0.9761497 0.981719 0.9997688 -0.9768086 0.981719 0.9997688 -0.9776422 0.981719 0.9997688 -0.9786968 0.981719 0.9997688 -0.980031 0.981719 0.9997688 -0.981719 0.981719 0.9997688 -0.9838545 0.981719 0.9997688 -0.9865561 0.981719 0.9997688 -0.9899741 0.981719 0.9997688 -0.9942982 0.981719 0.9997688 -0.9997688 0.981719 0.9997688 -0.9998174 0.9841433 0.9954731 -0.9998557 0.9865801 0.9936849 -0.999886 0.9888351 0.993287 -0.9999099 0.9908248 0.9936128 -0.9999288 0.992528 0.9942731 -0.9999437 0.9939562 0.9950481 -0.9736726 0.9838593 0.9997689 -0.9736726 0.9838592 0.9997689 -0.9736725 0.9838591 0.9997689 -0.9736724 0.983859 0.9997689 -0.9736723 0.9838589 0.9997689 -0.9736722 0.9838588 0.9997689 -0.9736721 0.9838586 0.9997689 -0.9736719 0.9838583 0.9997689 -0.9736717 0.983858 0.9997689 -0.9736715 0.9838577 0.9997689 -0.9736712 0.9838573 0.9997689 -0.973671 0.9838568 0.9997689 -0.9736708 0.9838562 0.9997689 -0.9736708 0.9838556 0.9997689 -0.973671 0.9838551 0.9997688 -0.9736717 0.9838546 0.9997688 -0.9736733 0.9838545 0.9997688 -0.9736756 0.9838545 0.9997688 -0.9736786 0.9838545 0.9997688 -0.9736823 0.9838545 0.9997688 -0.973687 0.9838545 0.9997688 -0.973693 0.9838545 0.9997688 -0.9737006 0.9838545 0.9997688 -0.9737101 0.9838545 0.9997688 -0.9737222 0.9838545 0.9997688 -0.9737375 0.9838545 0.9997688 -0.9737569 0.9838545 0.9997688 -0.9737814 0.9838545 0.9997688 -0.9738123 0.9838545 0.9997688 -0.9738515 0.9838545 0.9997688 -0.9739011 0.9838545 0.9997688 -0.9739638 0.9838545 0.9997688 -0.9740432 0.9838545 0.9997688 -0.9741436 0.9838545 0.9997688 -0.9742706 0.9838545 0.9997688 -0.9744313 0.9838545 0.9997688 -0.9746346 0.9838545 0.9997688 -0.9748918 0.9838545 0.9997688 -0.9752172 0.9838545 0.9997688 -0.9756289 0.9838545 0.9997688 -0.9761497 0.9838545 0.9997688 -0.9768086 0.9838545 0.9997688 -0.9776422 0.9838545 0.9997688 -0.9786968 0.9838545 0.9997688 -0.980031 0.9838545 0.9997688 -0.981719 0.9838545 0.9997688 -0.9838545 0.9838545 0.9997688 -0.9865561 0.9838545 0.9997688 -0.9899741 0.9838545 0.9997688 -0.9942982 0.9838545 0.9997688 -0.9997688 0.9838545 0.9997688 -0.9998174 0.9854838 0.9954731 -0.9998557 0.9874207 0.9936849 -0.999886 0.9893618 0.993287 -0.9999099 0.9911547 0.9936128 -0.9999288 0.9927345 0.9942731 -0.9999437 0.9940854 0.9950481 -0.9736726 0.9865601 0.9997689 -0.9736726 0.9865601 0.9997689 -0.9736725 0.98656 0.9997689 -0.9736724 0.9865599 0.9997689 -0.9736723 0.9865598 0.9997689 -0.9736722 0.9865597 0.9997689 -0.9736721 0.9865595 0.9997689 -0.9736719 0.9865593 0.9997689 -0.9736717 0.9865591 0.9997689 -0.9736715 0.9865588 0.9997689 -0.9736712 0.9865585 0.9997689 -0.973671 0.986558 0.9997689 -0.9736708 0.9865576 0.9997689 -0.9736708 0.9865571 0.9997689 -0.973671 0.9865566 0.9997688 -0.9736717 0.9865562 0.9997688 -0.9736733 0.9865561 0.9997688 -0.9736756 0.9865561 0.9997688 -0.9736786 0.9865561 0.9997688 -0.9736823 0.9865561 0.9997688 -0.973687 0.9865561 0.9997688 -0.973693 0.9865561 0.9997688 -0.9737006 0.9865561 0.9997688 -0.9737101 0.9865561 0.9997688 -0.9737222 0.9865561 0.9997688 -0.9737375 0.9865561 0.9997688 -0.9737569 0.9865561 0.9997688 -0.9737814 0.9865561 0.9997688 -0.9738123 0.9865561 0.9997688 -0.9738515 0.9865561 0.9997688 -0.9739011 0.9865561 0.9997688 -0.9739638 0.9865561 0.9997688 -0.9740432 0.9865561 0.9997688 -0.9741436 0.9865561 0.9997688 -0.9742706 0.9865561 0.9997688 -0.9744313 0.9865561 0.9997688 -0.9746346 0.9865561 0.9997688 -0.9748918 0.9865561 0.9997688 -0.9752172 0.9865561 0.9997688 -0.9756289 0.9865561 0.9997688 -0.9761497 0.9865561 0.9997688 -0.9768086 0.9865561 0.9997688 -0.9776422 0.9865561 0.9997688 -0.9786968 0.9865561 0.9997688 -0.980031 0.9865561 0.9997688 -0.981719 0.9865561 0.9997688 -0.9838545 0.9865561 0.9997688 -0.9865561 0.9865561 0.9997688 -0.9899741 0.9865561 0.9997688 -0.9942982 0.9865561 0.9997688 -0.9997688 0.9865561 0.9997688 -0.9998174 0.9871796 0.9954731 -0.9998557 0.9884841 0.9936849 -0.999886 0.9900282 0.993287 -0.9999099 0.991572 0.9936128 -0.9999288 0.9929957 0.9942731 -0.9999437 0.9942488 0.9950481 -0.9736726 0.9899771 0.9997689 -0.9736726 0.989977 0.9997689 -0.9736725 0.989977 0.9997689 -0.9736724 0.9899769 0.9997689 -0.9736723 0.9899768 0.9997689 -0.9736722 0.9899767 0.9997689 -0.9736721 0.9899766 0.9997689 -0.9736719 0.9899765 0.9997689 -0.9736717 0.9899763 0.9997689 -0.9736715 0.9899761 0.9997689 -0.9736712 0.9899758 0.9997689 -0.973671 0.9899755 0.9997689 -0.9736708 0.9899752 0.9997689 -0.9736708 0.9899748 0.9997689 -0.973671 0.9899744 0.9997688 -0.9736717 0.9899742 0.9997688 -0.9736733 0.9899741 0.9997688 -0.9736756 0.9899741 0.9997688 -0.9736786 0.9899741 0.9997688 -0.9736823 0.9899741 0.9997688 -0.973687 0.9899741 0.9997688 -0.973693 0.9899741 0.9997688 -0.9737006 0.9899741 0.9997688 -0.9737101 0.9899741 0.9997688 -0.9737222 0.9899741 0.9997688 -0.9737375 0.9899741 0.9997688 -0.9737569 0.9899741 0.9997688 -0.9737814 0.9899741 0.9997688 -0.9738123 0.9899741 0.9997688 -0.9738515 0.9899741 0.9997688 -0.9739011 0.9899741 0.9997688 -0.9739638 0.9899741 0.9997688 -0.9740432 0.9899741 0.9997688 -0.9741436 0.9899741 0.9997688 -0.9742706 0.9899741 0.9997688 -0.9744313 0.9899741 0.9997688 -0.9746346 0.9899741 0.9997688 -0.9748918 0.9899741 0.9997688 -0.9752172 0.9899741 0.9997688 -0.9756289 0.9899741 0.9997688 -0.9761497 0.9899741 0.9997688 -0.9768086 0.9899741 0.9997688 -0.9776422 0.9899741 0.9997688 -0.9786968 0.9899741 0.9997688 -0.980031 0.9899741 0.9997688 -0.981719 0.9899741 0.9997688 -0.9838545 0.9899741 0.9997688 -0.9865561 0.9899741 0.9997688 -0.9899741 0.9899741 0.9997688 -0.9942982 0.9899741 0.9997688 -0.9997688 0.9899741 0.9997688 -0.9998174 0.989325 0.9954731 -0.9998557 0.9898295 0.9936849 -0.999886 0.9908712 0.993287 -0.9999099 0.9920999 0.9936128 -0.9999288 0.9933261 0.9942731 -0.9999437 0.9944556 0.9950481 -0.9736726 0.9942999 0.9997689 -0.9736726 0.9942999 0.9997689 -0.9736725 0.9942999 0.9997689 -0.9736724 0.9942998 0.9997689 -0.9736723 0.9942998 0.9997689 -0.9736722 0.9942997 0.9997689 -0.9736721 0.9942997 0.9997689 -0.9736719 0.9942996 0.9997689 -0.9736717 0.9942995 0.9997689 -0.9736715 0.9942993 0.9997689 -0.9736712 0.9942992 0.9997689 -0.973671 0.994299 0.9997689 -0.9736708 0.9942988 0.9997689 -0.9736708 0.9942986 0.9997689 -0.973671 0.9942984 0.9997688 -0.9736717 0.9942983 0.9997688 -0.9736733 0.9942982 0.9997688 -0.9736756 0.9942982 0.9997688 -0.9736786 0.9942982 0.9997688 -0.9736823 0.9942982 0.9997688 -0.973687 0.9942982 0.9997688 -0.973693 0.9942982 0.9997688 -0.9737006 0.9942982 0.9997688 -0.9737101 0.9942982 0.9997688 -0.9737222 0.9942982 0.9997688 -0.9737375 0.9942982 0.9997688 -0.9737569 0.9942982 0.9997688 -0.9737814 0.9942982 0.9997688 -0.9738123 0.9942982 0.9997688 -0.9738515 0.9942982 0.9997688 -0.9739011 0.9942982 0.9997688 -0.9739638 0.9942982 0.9997688 -0.9740432 0.9942982 0.9997688 -0.9741436 0.9942982 0.9997688 -0.9742706 0.9942982 0.9997688 -0.9744313 0.9942982 0.9997688 -0.9746346 0.9942982 0.9997688 -0.9748918 0.9942982 0.9997688 -0.9752172 0.9942982 0.9997688 -0.9756289 0.9942982 0.9997688 -0.9761497 0.9942982 0.9997688 -0.9768086 0.9942982 0.9997688 -0.9776422 0.9942982 0.9997688 -0.9786968 0.9942982 0.9997688 -0.980031 0.9942982 0.9997688 -0.981719 0.9942982 0.9997688 -0.9838545 0.9942982 0.9997688 -0.9865561 0.9942982 0.9997688 -0.9899741 0.9942982 0.9997688 -0.9942982 0.9942982 0.9997688 -0.9997688 0.9942982 0.9997688 -0.9998174 0.9920392 0.9954731 -0.9998557 0.9915316 0.9936849 -0.999886 0.9919377 0.993287 -0.9999099 0.9927678 0.9936128 -0.9999288 0.9937442 0.9942731 -0.9999437 0.9947172 0.9950481 -0.9736726 0.9997689 0.9997689 -0.9736726 0.9997689 0.9997689 -0.9736725 0.9997689 0.9997689 -0.9736724 0.9997689 0.9997689 -0.9736723 0.9997689 0.9997689 -0.9736722 0.9997689 0.9997689 -0.9736721 0.9997689 0.9997689 -0.9736719 0.9997689 0.9997689 -0.9736717 0.9997689 0.9997689 -0.9736715 0.9997689 0.9997689 -0.9736712 0.9997689 0.9997689 -0.973671 0.9997689 0.9997689 -0.9736708 0.9997689 0.9997689 -0.9736708 0.9997689 0.9997689 -0.973671 0.9997688 0.9997688 -0.9736717 0.9997688 0.9997688 -0.9736733 0.9997688 0.9997688 -0.9736756 0.9997688 0.9997688 -0.9736786 0.9997688 0.9997688 -0.9736823 0.9997688 0.9997688 -0.973687 0.9997688 0.9997688 -0.973693 0.9997688 0.9997688 -0.9737006 0.9997688 0.9997688 -0.9737101 0.9997688 0.9997688 -0.9737222 0.9997688 0.9997688 -0.9737375 0.9997688 0.9997688 -0.9737569 0.9997688 0.9997688 -0.9737814 0.9997688 0.9997688 -0.9738123 0.9997688 0.9997688 -0.9738515 0.9997688 0.9997688 -0.9739011 0.9997688 0.9997688 -0.9739638 0.9997688 0.9997688 -0.9740432 0.9997688 0.9997688 -0.9741436 0.9997688 0.9997688 -0.9742706 0.9997688 0.9997688 -0.9744313 0.9997688 0.9997688 -0.9746346 0.9997688 0.9997688 -0.9748918 0.9997688 0.9997688 -0.9752172 0.9997688 0.9997688 -0.9756289 0.9997688 0.9997688 -0.9761497 0.9997688 0.9997688 -0.9768086 0.9997688 0.9997688 -0.9776422 0.9997688 0.9997688 -0.9786968 0.9997688 0.9997688 -0.980031 0.9997688 0.9997688 -0.981719 0.9997688 0.9997688 -0.9838545 0.9997688 0.9997688 -0.9865561 0.9997688 0.9997688 -0.9899741 0.9997688 0.9997688 -0.9942982 0.9997688 0.9997688 -0.9997688 0.9997688 0.9997688 -0.9998174 0.9954731 0.9954731 -0.9998557 0.9936849 0.9936849 -0.999886 0.993287 0.993287 -0.9999099 0.9936128 0.9936128 -0.9999288 0.9942731 0.9942731 -0.9999437 0.9950481 0.9950481 -0.9790927 0.9998174 0.9954742 -0.9790927 0.9998174 0.9954741 -0.9790927 0.9998174 0.9954741 -0.9790926 0.9998174 0.9954741 -0.9790925 0.9998174 0.9954741 -0.9790925 0.9998174 0.995474 -0.9790924 0.9998174 0.995474 -0.9790923 0.9998174 0.9954739 -0.9790921 0.9998174 0.9954739 -0.979092 0.9998174 0.9954738 -0.9790919 0.9998174 0.9954737 -0.9790917 0.9998174 0.9954736 -0.9790916 0.9998174 0.9954735 -0.9790916 0.9998174 0.9954733 -0.9790917 0.9998174 0.9954732 -0.9790921 0.9998174 0.9954731 -0.9790931 0.9998174 0.9954731 -0.9790946 0.9998174 0.9954731 -0.9790965 0.9998174 0.9954731 -0.9790988 0.9998174 0.9954731 -0.9791018 0.9998174 0.9954731 -0.9791055 0.9998174 0.9954731 -0.9791103 0.9998174 0.9954731 -0.9791163 0.9998174 0.9954731 -0.9791238 0.9998174 0.9954731 -0.9791334 0.9998174 0.9954731 -0.9791456 0.9998174 0.9954731 -0.979161 0.9998174 0.9954731 -0.9791804 0.9998174 0.9954731 -0.979205 0.9998174 0.9954731 -0.9792361 0.9998174 0.9954731 -0.9792755 0.9998174 0.9954731 -0.9793253 0.9998174 0.9954731 -0.9793883 0.9998174 0.9954731 -0.9794681 0.9998174 0.9954731 -0.9795689 0.9998174 0.9954731 -0.9796966 0.9998174 0.9954731 -0.979858 0.9998174 0.9954731 -0.9800622 0.9998174 0.9954731 -0.9803206 0.9998174 0.9954731 -0.9806476 0.9998174 0.9954731 -0.9810611 0.9998174 0.9954731 -0.9815844 0.9998174 0.9954731 -0.9822464 0.9998174 0.9954731 -0.9830838 0.9998174 0.9954731 -0.9841433 0.9998174 0.9954731 -0.9854838 0.9998174 0.9954731 -0.9871796 0.9998174 0.9954731 -0.989325 0.9998174 0.9954731 -0.9920392 0.9998174 0.9954731 -0.9954731 0.9998174 0.9954731 -0.9998174 0.9998174 0.9954731 -0.9998557 0.9964092 0.9936849 -0.999886 0.9949941 0.993287 -0.9999099 0.9946818 0.9936128 -0.9999288 0.9949422 0.9942731 -0.9999437 0.9954668 0.9950481 -0.9834129 0.9998557 0.9936861 -0.9834129 0.9998557 0.9936861 -0.9834129 0.9998557 0.993686 -0.9834129 0.9998557 0.993686 -0.9834128 0.9998557 0.993686 -0.9834128 0.9998557 0.993686 -0.9834127 0.9998557 0.9936859 -0.9834127 0.9998557 0.9936858 -0.9834126 0.9998557 0.9936858 -0.9834125 0.9998557 0.9936857 -0.9834124 0.9998557 0.9936856 -0.9834123 0.9998557 0.9936855 -0.9834122 0.9998557 0.9936853 -0.9834122 0.9998557 0.9936852 -0.9834123 0.9998557 0.993685 -0.9834126 0.9998557 0.9936849 -0.9834132 0.9998557 0.9936849 -0.9834141 0.9998557 0.9936849 -0.9834153 0.9998557 0.9936849 -0.9834167 0.9998557 0.9936849 -0.9834186 0.9998557 0.9936849 -0.9834209 0.9998557 0.9936849 -0.9834239 0.9998557 0.9936849 -0.9834277 0.9998557 0.9936849 -0.9834324 0.9998557 0.9936849 -0.9834385 0.9998557 0.9936849 -0.9834461 0.9998557 0.9936849 -0.9834557 0.9998557 0.9936849 -0.9834679 0.9998557 0.9936849 -0.9834833 0.9998557 0.9936849 -0.9835029 0.9998557 0.9936849 -0.9835276 0.9998557 0.9936849 -0.9835588 0.9998557 0.9936849 -0.9835983 0.9998557 0.9936849 -0.9836483 0.9998557 0.9936849 -0.9837116 0.9998557 0.9936849 -0.9837916 0.9998557 0.9936849 -0.9838928 0.9998557 0.9936849 -0.9840209 0.9998557 0.9936849 -0.9841829 0.9998557 0.9936849 -0.984388 0.9998557 0.9936849 -0.9846473 0.9998557 0.9936849 -0.9849754 0.9998557 0.9936849 -0.9853905 0.9998557 0.9936849 -0.9859157 0.9998557 0.9936849 -0.9865801 0.9998557 0.9936849 -0.9874207 0.9998557 0.9936849 -0.9884841 0.9998557 0.9936849 -0.9898295 0.9998557 0.9936849 -0.9915316 0.9998557 0.9936849 -0.9936849 0.9998557 0.9936849 -0.9964092 0.9998557 0.9936849 -0.9998557 0.9998557 0.9936849 -0.999886 0.9971537 0.993287 -0.9999099 0.9960342 0.9936128 -0.9999288 0.9957887 0.9942731 -0.9999437 0.9959964 0.9950481 -0.9868505 0.999886 0.993288 -0.9868505 0.999886 0.993288 -0.9868505 0.999886 0.993288 -0.9868505 0.999886 0.993288 -0.9868504 0.999886 0.993288 -0.9868504 0.999886 0.9932879 -0.9868504 0.999886 0.9932879 -0.9868503 0.999886 0.9932878 -0.9868503 0.999886 0.9932878 -0.9868502 0.999886 0.9932877 -0.9868502 0.999886 0.9932876 -0.9868501 0.999886 0.9932875 -0.9868501 0.999886 0.9932874 -0.98685 0.999886 0.9932873 -0.9868501 0.999886 0.9932872 -0.9868503 0.999886 0.9932871 -0.9868507 0.999886 0.993287 -0.9868512 0.999886 0.993287 -0.986852 0.999886 0.993287 -0.9868529 0.999886 0.993287 -0.9868541 0.999886 0.993287 -0.9868555 0.999886 0.993287 -0.9868574 0.999886 0.993287 -0.9868597 0.999886 0.993287 -0.9868627 0.999886 0.993287 -0.9868665 0.999886 0.993287 -0.9868713 0.999886 0.993287 -0.9868773 0.999886 0.993287 -0.986885 0.999886 0.993287 -0.9868946 0.999886 0.993287 -0.9869069 0.999886 0.993287 -0.9869223 0.999886 0.993287 -0.9869419 0.999886 0.993287 -0.9869667 0.999886 0.993287 -0.986998 0.999886 0.993287 -0.9870376 0.999886 0.993287 -0.9870878 0.999886 0.993287 -0.9871512 0.999886 0.993287 -0.9872315 0.999886 0.993287 -0.987333 0.999886 0.993287 -0.9874615 0.999886 0.993287 -0.987624 0.999886 0.993287 -0.9878296 0.999886 0.993287 -0.9880897 0.999886 0.993287 -0.9884188 0.999886 0.993287 -0.9888351 0.999886 0.993287 -0.9893618 0.999886 0.993287 -0.9900282 0.999886 0.993287 -0.9908712 0.999886 0.993287 -0.9919377 0.999886 0.993287 -0.993287 0.999886 0.993287 -0.9949941 0.999886 0.993287 -0.9971537 0.999886 0.993287 -0.999886 0.999886 0.993287 -0.9999099 0.9977452 0.9936128 -0.9999288 0.9968597 0.9942731 -0.9999437 0.9966665 0.9950481 -0.989582 0.9999099 0.9936135 -0.989582 0.9999099 0.9936135 -0.989582 0.9999099 0.9936135 -0.989582 0.9999099 0.9936135 -0.989582 0.9999099 0.9936135 -0.9895819 0.9999099 0.9936134 -0.9895819 0.9999099 0.9936134 -0.9895819 0.9999099 0.9936134 -0.9895819 0.9999099 0.9936133 -0.9895818 0.9999099 0.9936133 -0.9895818 0.9999099 0.9936132 -0.9895818 0.9999099 0.9936131 -0.9895817 0.9999099 0.993613 -0.9895817 0.9999099 0.993613 -0.9895817 0.9999099 0.9936129 -0.9895819 0.9999099 0.9936128 -0.9895821 0.9999099 0.9936128 -0.9895825 0.9999099 0.9936128 -0.9895829 0.9999099 0.9936128 -0.9895835 0.9999099 0.9936128 -0.9895842 0.9999099 0.9936128 -0.9895851 0.9999099 0.9936128 -0.9895863 0.9999099 0.9936128 -0.9895878 0.9999099 0.9936128 -0.9895897 0.9999099 0.9936128 -0.989592 0.9999099 0.9936128 -0.989595 0.9999099 0.9936128 -0.9895988 0.9999099 0.9936128 -0.9896036 0.9999099 0.9936128 -0.9896096 0.9999099 0.9936128 -0.9896173 0.9999099 0.9936128 -0.989627 0.9999099 0.9936128 -0.9896392 0.9999099 0.9936128 -0.9896547 0.9999099 0.9936128 -0.9896744 0.9999099 0.9936128 -0.9896992 0.9999099 0.9936128 -0.9897306 0.9999099 0.9936128 -0.9897703 0.9999099 0.9936128 -0.9898206 0.9999099 0.9936128 -0.9898842 0.9999099 0.9936128 -0.9899646 0.9999099 0.9936128 -0.9900664 0.9999099 0.9936128 -0.9901951 0.9999099 0.9936128 -0.990358 0.9999099 0.9936128 -0.9905641 0.9999099 0.9936128 -0.9908248 0.9999099 0.9936128 -0.9911547 0.9999099 0.9936128 -0.991572 0.9999099 0.9936128 -0.9920999 0.9999099 0.9936128 -0.9927678 0.9999099 0.9936128 -0.9936128 0.9999099 0.9936128 -0.9946818 0.9999099 0.9936128 -0.9960342 0.9999099 0.9936128 -0.9977452 0.9999099 0.9936128 -0.9999099 0.9999099 0.9936128 -0.9999288 0.9982146 0.9942731 -0.9999437 0.9975143 0.9950481 -0.9917501 0.9999288 0.9942736 -0.9917501 0.9999288 0.9942736 -0.9917501 0.9999288 0.9942736 -0.9917501 0.9999288 0.9942736 -0.9917501 0.9999288 0.9942736 -0.9917501 0.9999288 0.9942736 -0.99175 0.9999288 0.9942735 -0.99175 0.9999288 0.9942735 -0.99175 0.9999288 0.9942735 -0.99175 0.9999288 0.9942734 -0.99175 0.9999288 0.9942734 -0.9917499 0.9999288 0.9942733 -0.9917499 0.9999288 0.9942733 -0.9917499 0.9999288 0.9942732 -0.9917499 0.9999288 0.9942731 -0.99175 0.9999288 0.9942731 -0.9917502 0.9999288 0.9942731 -0.9917504 0.9999288 0.9942731 -0.9917507 0.9999288 0.9942731 -0.991751 0.9999288 0.9942731 -0.9917515 0.9999288 0.9942731 -0.9917521 0.9999288 0.9942731 -0.9917528 0.9999288 0.9942731 -0.9917537 0.9999288 0.9942731 -0.9917549 0.9999288 0.9942731 -0.9917564 0.9999288 0.9942731 -0.9917582 0.9999288 0.9942731 -0.9917606 0.9999288 0.9942731 -0.9917636 0.9999288 0.9942731 -0.9917674 0.9999288 0.9942731 -0.9917722 0.9999288 0.9942731 -0.9917782 0.9999288 0.9942731 -0.9917859 0.9999288 0.9942731 -0.9917956 0.9999288 0.9942731 -0.9918079 0.9999288 0.9942731 -0.9918234 0.9999288 0.9942731 -0.9918431 0.9999288 0.9942731 -0.991868 0.9999288 0.9942731 -0.9918994 0.9999288 0.9942731 -0.9919392 0.9999288 0.9942731 -0.9919896 0.9999288 0.9942731 -0.9920533 0.9999288 0.9942731 -0.9921339 0.9999288 0.9942731 -0.9922358 0.9999288 0.9942731 -0.9923648 0.9999288 0.9942731 -0.992528 0.9999288 0.9942731 -0.9927345 0.9999288 0.9942731 -0.9929957 0.9999288 0.9942731 -0.9933261 0.9999288 0.9942731 -0.9937442 0.9999288 0.9942731 -0.9942731 0.9999288 0.9942731 -0.9949422 0.9999288 0.9942731 -0.9957887 0.9999288 0.9942731 -0.9968597 0.9999288 0.9942731 -0.9982146 0.9999288 0.9942731 -0.9999288 0.9999288 0.9942731 -0.9999437 0.9985868 0.9950481 -0.9934695 0.9999437 0.9950485 -0.9934695 0.9999437 0.9950485 -0.9934695 0.9999437 0.9950484 -0.9934695 0.9999437 0.9950484 -0.9934695 0.9999437 0.9950484 -0.9934695 0.9999437 0.9950484 -0.9934695 0.9999437 0.9950484 -0.9934694 0.9999437 0.9950484 -0.9934694 0.9999437 0.9950484 -0.9934694 0.9999437 0.9950483 -0.9934694 0.9999437 0.9950483 -0.9934694 0.9999437 0.9950483 -0.9934694 0.9999437 0.9950482 -0.9934694 0.9999437 0.9950482 -0.9934694 0.9999437 0.9950481 -0.9934694 0.9999437 0.9950481 -0.9934695 0.9999437 0.9950481 -0.9934697 0.9999437 0.9950481 -0.9934698 0.9999437 0.9950481 -0.9934701 0.9999437 0.9950481 -0.9934704 0.9999437 0.9950481 -0.9934707 0.9999437 0.9950481 -0.9934712 0.9999437 0.9950481 -0.9934718 0.9999437 0.9950481 -0.9934725 0.9999437 0.9950481 -0.9934734 0.9999437 0.9950481 -0.9934746 0.9999437 0.9950481 -0.9934761 0.9999437 0.9950481 -0.9934779 0.9999437 0.9950481 -0.9934803 0.9999437 0.9950481 -0.9934833 0.9999437 0.9950481 -0.9934871 0.9999437 0.9950481 -0.9934919 0.9999437 0.9950481 -0.993498 0.9999437 0.9950481 -0.9935057 0.9999437 0.9950481 -0.9935154 0.9999437 0.9950481 -0.9935277 0.9999437 0.9950481 -0.9935432 0.9999437 0.9950481 -0.9935629 0.9999437 0.9950481 -0.9935878 0.9999437 0.9950481 -0.9936193 0.9999437 0.9950481 -0.9936592 0.9999437 0.9950481 -0.9937096 0.9999437 0.9950481 -0.9937734 0.9999437 0.9950481 -0.9938541 0.9999437 0.9950481 -0.9939562 0.9999437 0.9950481 -0.9940854 0.9999437 0.9950481 -0.9942488 0.9999437 0.9950481 -0.9944556 0.9999437 0.9950481 -0.9947172 0.9999437 0.9950481 -0.9950481 0.9999437 0.9950481 -0.9954668 0.9999437 0.9950481 -0.9959964 0.9999437 0.9950481 -0.9966665 0.9999437 0.9950481 -0.9975143 0.9999437 0.9950481 -0.9985868 0.9999437 0.9950481 -0.9999437 0.9999437 0.9950481 -0.9790927 0.9790927 0.9998174 -0.9790928 0.9790927 0.9998174 -0.9790928 0.9790927 0.9998174 -0.9790929 0.9790927 0.9998174 -0.9790929 0.9790927 0.9998174 -0.979093 0.9790927 0.9998174 -0.9790931 0.9790927 0.9998174 -0.9790933 0.9790927 0.9998174 -0.9790934 0.9790927 0.9998174 -0.9790937 0.9790927 0.9998174 -0.9790939 0.9790927 0.9998174 -0.9790943 0.9790927 0.9998174 -0.9790948 0.9790927 0.9998174 -0.9790953 0.9790927 0.9998174 -0.979096 0.9790927 0.9998174 -0.979097 0.9790927 0.9998174 -0.9790981 0.9790927 0.9998174 -0.9790996 0.9790927 0.9998174 -0.9791014 0.9790927 0.9998174 -0.9791038 0.9790927 0.9998174 -0.9791067 0.9790927 0.9998174 -0.9791105 0.9790927 0.9998174 -0.9791152 0.9790927 0.9998174 -0.9791212 0.9790927 0.9998174 -0.9791288 0.9790927 0.9998174 -0.9791384 0.9790927 0.9998174 -0.9791506 0.9790927 0.9998174 -0.9791659 0.9790927 0.9998174 -0.9791854 0.9790927 0.9998174 -0.97921 0.9790927 0.9998174 -0.9792411 0.9790927 0.9998174 -0.9792804 0.9790927 0.9998174 -0.9793302 0.9790927 0.9998174 -0.9793932 0.9790927 0.9998174 -0.979473 0.9790927 0.9998174 -0.9795738 0.9790927 0.9998174 -0.9797014 0.9790927 0.9998174 -0.9798628 0.9790927 0.9998174 -0.980067 0.9790927 0.9998174 -0.9803253 0.9790927 0.9998174 -0.9806522 0.9790927 0.9998174 -0.9810656 0.9790927 0.9998174 -0.9815888 0.9790927 0.9998174 -0.9822506 0.9790927 0.9998174 -0.9830878 0.9790927 0.9998174 -0.9841471 0.9790927 0.9998174 -0.9854872 0.9790927 0.9998174 -0.9871826 0.9790927 0.9998174 -0.9893275 0.9790927 0.9998174 -0.9920411 0.9790927 0.9998174 -0.9954742 0.9790927 0.9998174 -0.9998174 0.9790927 0.9998174 -0.9998557 0.9834129 0.9964098 -0.999886 0.9868505 0.9949948 -0.9999099 0.989582 0.9946824 -0.9999288 0.9917501 0.9949427 -0.9999437 0.9934695 0.9954671 -0.9790927 0.9790928 0.9998174 -0.9790927 0.9790927 0.9998174 -0.9790927 0.9790927 0.9998174 -0.9790928 0.9790927 0.9998174 -0.9790929 0.9790927 0.9998174 -0.9790929 0.9790927 0.9998174 -0.9790931 0.9790927 0.9998174 -0.9790932 0.9790927 0.9998174 -0.9790934 0.9790927 0.9998174 -0.9790936 0.9790927 0.9998174 -0.9790939 0.9790927 0.9998174 -0.9790942 0.9790927 0.9998174 -0.9790947 0.9790927 0.9998174 -0.9790953 0.9790927 0.9998174 -0.979096 0.9790927 0.9998174 -0.9790969 0.9790927 0.9998174 -0.979098 0.9790927 0.9998174 -0.9790995 0.9790927 0.9998174 -0.9791014 0.9790927 0.9998174 -0.9791037 0.9790927 0.9998174 -0.9791067 0.9790927 0.9998174 -0.9791104 0.9790927 0.9998174 -0.9791152 0.9790927 0.9998174 -0.9791212 0.9790927 0.9998174 -0.9791287 0.9790927 0.9998174 -0.9791383 0.9790927 0.9998174 -0.9791505 0.9790927 0.9998174 -0.9791659 0.9790927 0.9998174 -0.9791853 0.9790927 0.9998174 -0.9792099 0.9790927 0.9998174 -0.979241 0.9790927 0.9998174 -0.9792804 0.9790927 0.9998174 -0.9793302 0.9790927 0.9998174 -0.9793932 0.9790927 0.9998174 -0.9794729 0.9790927 0.9998174 -0.9795737 0.9790927 0.9998174 -0.9797013 0.9790927 0.9998174 -0.9798627 0.9790927 0.9998174 -0.9800669 0.9790927 0.9998174 -0.9803253 0.9790927 0.9998174 -0.9806521 0.9790927 0.9998174 -0.9810656 0.9790927 0.9998174 -0.9815887 0.9790927 0.9998174 -0.9822505 0.9790927 0.9998174 -0.9830878 0.9790927 0.9998174 -0.9841471 0.9790927 0.9998174 -0.9854872 0.9790927 0.9998174 -0.9871826 0.9790927 0.9998174 -0.9893275 0.9790927 0.9998174 -0.9920411 0.9790927 0.9998174 -0.9954741 0.9790927 0.9998174 -0.9998174 0.9790927 0.9998174 -0.9998557 0.9834129 0.9964098 -0.999886 0.9868505 0.9949948 -0.9999099 0.989582 0.9946824 -0.9999288 0.9917501 0.9949427 -0.9999437 0.9934695 0.9954671 -0.9790927 0.9790928 0.9998174 -0.9790927 0.9790927 0.9998174 -0.9790927 0.9790927 0.9998174 -0.9790927 0.9790927 0.9998174 -0.9790928 0.9790927 0.9998174 -0.9790929 0.9790927 0.9998174 -0.979093 0.9790927 0.9998174 -0.9790931 0.9790927 0.9998174 -0.9790933 0.9790927 0.9998174 -0.9790935 0.9790927 0.9998174 -0.9790938 0.9790927 0.9998174 -0.9790942 0.9790927 0.9998174 -0.9790946 0.9790927 0.9998174 -0.9790952 0.9790927 0.9998174 -0.9790959 0.9790927 0.9998174 -0.9790968 0.9790927 0.9998174 -0.979098 0.9790927 0.9998174 -0.9790994 0.9790927 0.9998174 -0.9791013 0.9790927 0.9998174 -0.9791036 0.9790927 0.9998174 -0.9791066 0.9790927 0.9998174 -0.9791103 0.9790927 0.9998174 -0.9791151 0.9790927 0.9998174 -0.9791211 0.9790927 0.9998174 -0.9791287 0.9790927 0.9998174 -0.9791383 0.9790927 0.9998174 -0.9791504 0.9790927 0.9998174 -0.9791658 0.9790927 0.9998174 -0.9791852 0.9790927 0.9998174 -0.9792098 0.9790927 0.9998174 -0.9792409 0.9790927 0.9998174 -0.9792803 0.9790927 0.9998174 -0.9793301 0.9790927 0.9998174 -0.9793931 0.9790927 0.9998174 -0.9794728 0.9790927 0.9998174 -0.9795737 0.9790927 0.9998174 -0.9797012 0.9790927 0.9998174 -0.9798626 0.9790927 0.9998174 -0.9800668 0.9790927 0.9998174 -0.9803252 0.9790927 0.9998174 -0.980652 0.9790927 0.9998174 -0.9810655 0.9790927 0.9998174 -0.9815886 0.9790927 0.9998174 -0.9822504 0.9790927 0.9998174 -0.9830877 0.9790927 0.9998174 -0.984147 0.9790927 0.9998174 -0.9854871 0.9790927 0.9998174 -0.9871825 0.9790927 0.9998174 -0.9893274 0.9790927 0.9998174 -0.9920411 0.9790927 0.9998174 -0.9954741 0.9790927 0.9998174 -0.9998174 0.9790927 0.9998174 -0.9998557 0.9834129 0.9964098 -0.999886 0.9868505 0.9949948 -0.9999099 0.989582 0.9946824 -0.9999288 0.9917501 0.9949427 -0.9999437 0.9934695 0.9954671 -0.9790927 0.9790929 0.9998174 -0.9790927 0.9790928 0.9998174 -0.9790927 0.9790927 0.9998174 -0.9790926 0.9790926 0.9998174 -0.9790927 0.9790926 0.9998174 -0.9790928 0.9790926 0.9998174 -0.9790929 0.9790926 0.9998174 -0.979093 0.9790926 0.9998174 -0.9790932 0.9790926 0.9998174 -0.9790934 0.9790926 0.9998174 -0.9790937 0.9790926 0.9998174 -0.979094 0.9790926 0.9998174 -0.9790945 0.9790926 0.9998174 -0.9790951 0.9790926 0.9998174 -0.9790958 0.9790926 0.9998174 -0.9790967 0.9790926 0.9998174 -0.9790979 0.9790926 0.9998174 -0.9790993 0.9790926 0.9998174 -0.9791012 0.9790926 0.9998174 -0.9791035 0.9790926 0.9998174 -0.9791065 0.9790926 0.9998174 -0.9791102 0.9790926 0.9998174 -0.979115 0.9790926 0.9998174 -0.979121 0.9790926 0.9998174 -0.9791286 0.9790926 0.9998174 -0.9791382 0.9790926 0.9998174 -0.9791503 0.9790926 0.9998174 -0.9791657 0.9790926 0.9998174 -0.9791851 0.9790926 0.9998174 -0.9792097 0.9790926 0.9998174 -0.9792408 0.9790926 0.9998174 -0.9792802 0.9790926 0.9998174 -0.97933 0.9790926 0.9998174 -0.979393 0.9790926 0.9998174 -0.9794727 0.9790926 0.9998174 -0.9795736 0.9790926 0.9998174 -0.9797011 0.9790926 0.9998174 -0.9798625 0.9790926 0.9998174 -0.9800667 0.9790926 0.9998174 -0.9803251 0.9790926 0.9998174 -0.9806519 0.9790926 0.9998174 -0.9810654 0.9790926 0.9998174 -0.9815885 0.9790926 0.9998174 -0.9822504 0.9790926 0.9998174 -0.9830876 0.9790926 0.9998174 -0.9841469 0.9790926 0.9998174 -0.985487 0.9790926 0.9998174 -0.9871825 0.9790926 0.9998174 -0.9893274 0.9790926 0.9998174 -0.992041 0.9790926 0.9998174 -0.9954741 0.9790926 0.9998174 -0.9998174 0.9790926 0.9998174 -0.9998557 0.9834129 0.9964098 -0.999886 0.9868505 0.9949948 -0.9999099 0.989582 0.9946824 -0.9999288 0.9917501 0.9949426 -0.9999437 0.9934695 0.9954671 -0.9790927 0.9790929 0.9998174 -0.9790927 0.9790929 0.9998174 -0.9790927 0.9790928 0.9998174 -0.9790926 0.9790927 0.9998174 -0.9790925 0.9790925 0.9998174 -0.9790926 0.9790925 0.9998174 -0.9790927 0.9790925 0.9998174 -0.9790929 0.9790925 0.9998174 -0.9790931 0.9790925 0.9998174 -0.9790933 0.9790925 0.9998174 -0.9790936 0.9790925 0.9998174 -0.9790939 0.9790925 0.9998174 -0.9790944 0.9790925 0.9998174 -0.9790949 0.9790925 0.9998174 -0.9790957 0.9790925 0.9998174 -0.9790966 0.9790925 0.9998174 -0.9790977 0.9790925 0.9998174 -0.9790992 0.9790925 0.9998174 -0.979101 0.9790925 0.9998174 -0.9791034 0.9790925 0.9998174 -0.9791064 0.9790925 0.9998174 -0.9791101 0.9790925 0.9998174 -0.9791148 0.9790925 0.9998174 -0.9791208 0.9790925 0.9998174 -0.9791284 0.9790925 0.9998174 -0.979138 0.9790925 0.9998174 -0.9791502 0.9790925 0.9998174 -0.9791655 0.9790925 0.9998174 -0.979185 0.9790925 0.9998174 -0.9792096 0.9790925 0.9998174 -0.9792407 0.9790925 0.9998174 -0.9792801 0.9790925 0.9998174 -0.9793299 0.9790925 0.9998174 -0.9793929 0.9790925 0.9998174 -0.9794726 0.9790925 0.9998174 -0.9795734 0.9790925 0.9998174 -0.979701 0.9790925 0.9998174 -0.9798624 0.9790925 0.9998174 -0.9800666 0.9790925 0.9998174 -0.980325 0.9790925 0.9998174 -0.9806518 0.9790925 0.9998174 -0.9810653 0.9790925 0.9998174 -0.9815884 0.9790925 0.9998174 -0.9822502 0.9790925 0.9998174 -0.9830875 0.9790925 0.9998174 -0.9841468 0.9790925 0.9998174 -0.9854869 0.9790925 0.9998174 -0.9871824 0.9790925 0.9998174 -0.9893273 0.9790925 0.9998174 -0.992041 0.9790925 0.9998174 -0.9954741 0.9790925 0.9998174 -0.9998174 0.9790925 0.9998174 -0.9998557 0.9834128 0.9964098 -0.999886 0.9868504 0.9949948 -0.9999099 0.989582 0.9946824 -0.9999288 0.9917501 0.9949426 -0.9999437 0.9934695 0.9954671 -0.9790927 0.979093 0.9998174 -0.9790927 0.9790929 0.9998174 -0.9790927 0.9790929 0.9998174 -0.9790926 0.9790928 0.9998174 -0.9790925 0.9790926 0.9998174 -0.9790925 0.9790925 0.9998174 -0.9790926 0.9790925 0.9998174 -0.9790927 0.9790925 0.9998174 -0.9790929 0.9790925 0.9998174 -0.9790931 0.9790925 0.9998174 -0.9790934 0.9790925 0.9998174 -0.9790938 0.9790925 0.9998174 -0.9790942 0.9790925 0.9998174 -0.9790948 0.9790925 0.9998174 -0.9790955 0.9790925 0.9998174 -0.9790964 0.9790925 0.9998174 -0.9790976 0.9790925 0.9998174 -0.979099 0.9790925 0.9998174 -0.9791009 0.9790925 0.9998174 -0.9791032 0.9790925 0.9998174 -0.9791062 0.9790925 0.9998174 -0.9791099 0.9790925 0.9998174 -0.9791147 0.9790925 0.9998174 -0.9791207 0.9790925 0.9998174 -0.9791283 0.9790925 0.9998174 -0.9791379 0.9790925 0.9998174 -0.97915 0.9790925 0.9998174 -0.9791654 0.9790925 0.9998174 -0.9791848 0.9790925 0.9998174 -0.9792094 0.9790925 0.9998174 -0.9792405 0.9790925 0.9998174 -0.9792799 0.9790925 0.9998174 -0.9793297 0.9790925 0.9998174 -0.9793927 0.9790925 0.9998174 -0.9794724 0.9790925 0.9998174 -0.9795733 0.9790925 0.9998174 -0.9797009 0.9790925 0.9998174 -0.9798623 0.9790925 0.9998174 -0.9800665 0.9790925 0.9998174 -0.9803248 0.9790925 0.9998174 -0.9806517 0.9790925 0.9998174 -0.9810652 0.9790925 0.9998174 -0.9815883 0.9790925 0.9998174 -0.9822501 0.9790925 0.9998174 -0.9830874 0.9790925 0.9998174 -0.9841467 0.9790925 0.9998174 -0.9854868 0.9790925 0.9998174 -0.9871823 0.9790925 0.9998174 -0.9893272 0.9790925 0.9998174 -0.9920409 0.9790925 0.9998174 -0.995474 0.9790925 0.9998174 -0.9998174 0.9790925 0.9998174 -0.9998557 0.9834128 0.9964098 -0.999886 0.9868504 0.9949948 -0.9999099 0.9895819 0.9946823 -0.9999288 0.9917501 0.9949426 -0.9999437 0.9934695 0.9954671 -0.9790927 0.9790931 0.9998174 -0.9790927 0.9790931 0.9998174 -0.9790927 0.979093 0.9998174 -0.9790926 0.9790929 0.9998174 -0.9790925 0.9790927 0.9998174 -0.9790925 0.9790926 0.9998174 -0.9790924 0.9790924 0.9998174 -0.9790925 0.9790924 0.9998174 -0.9790927 0.9790924 0.9998174 -0.9790929 0.9790924 0.9998174 -0.9790932 0.9790924 0.9998174 -0.9790936 0.9790924 0.9998174 -0.979094 0.9790924 0.9998174 -0.9790946 0.9790924 0.9998174 -0.9790953 0.9790924 0.9998174 -0.9790962 0.9790924 0.9998174 -0.9790974 0.9790924 0.9998174 -0.9790988 0.9790924 0.9998174 -0.9791007 0.9790924 0.9998174 -0.979103 0.9790924 0.9998174 -0.979106 0.9790924 0.9998174 -0.9791097 0.9790924 0.9998174 -0.9791145 0.9790924 0.9998174 -0.9791205 0.9790924 0.9998174 -0.9791281 0.9790924 0.9998174 -0.9791377 0.9790924 0.9998174 -0.9791498 0.9790924 0.9998174 -0.9791652 0.9790924 0.9998174 -0.9791846 0.9790924 0.9998174 -0.9792092 0.9790924 0.9998174 -0.9792403 0.9790924 0.9998174 -0.9792797 0.9790924 0.9998174 -0.9793295 0.9790924 0.9998174 -0.9793925 0.9790924 0.9998174 -0.9794722 0.9790924 0.9998174 -0.9795731 0.9790924 0.9998174 -0.9797007 0.9790924 0.9998174 -0.9798621 0.9790924 0.9998174 -0.9800663 0.9790924 0.9998174 -0.9803246 0.9790924 0.9998174 -0.9806515 0.9790924 0.9998174 -0.981065 0.9790924 0.9998174 -0.9815881 0.9790924 0.9998174 -0.9822499 0.9790924 0.9998174 -0.9830872 0.9790924 0.9998174 -0.9841465 0.9790924 0.9998174 -0.9854867 0.9790924 0.9998174 -0.9871822 0.9790924 0.9998174 -0.9893271 0.9790924 0.9998174 -0.9920408 0.9790924 0.9998174 -0.995474 0.9790924 0.9998174 -0.9998174 0.9790924 0.9998174 -0.9998557 0.9834127 0.9964097 -0.999886 0.9868504 0.9949947 -0.9999099 0.9895819 0.9946823 -0.9999288 0.99175 0.9949426 -0.9999437 0.9934695 0.995467 -0.9790927 0.9790933 0.9998174 -0.9790927 0.9790932 0.9998174 -0.9790927 0.9790931 0.9998174 -0.9790926 0.979093 0.9998174 -0.9790925 0.9790929 0.9998174 -0.9790925 0.9790927 0.9998174 -0.9790924 0.9790925 0.9998174 -0.9790923 0.9790923 0.9998174 -0.9790924 0.9790923 0.9998174 -0.9790927 0.9790923 0.9998174 -0.979093 0.9790923 0.9998174 -0.9790933 0.9790923 0.9998174 -0.9790938 0.9790923 0.9998174 -0.9790943 0.9790923 0.9998174 -0.9790951 0.9790923 0.9998174 -0.979096 0.9790923 0.9998174 -0.9790971 0.9790923 0.9998174 -0.9790986 0.9790923 0.9998174 -0.9791004 0.9790923 0.9998174 -0.9791028 0.9790923 0.9998174 -0.9791057 0.9790923 0.9998174 -0.9791095 0.9790923 0.9998174 -0.9791142 0.9790923 0.9998174 -0.9791202 0.9790923 0.9998174 -0.9791278 0.9790923 0.9998174 -0.9791374 0.9790923 0.9998174 -0.9791496 0.9790923 0.9998174 -0.9791649 0.9790923 0.9998174 -0.9791844 0.9790923 0.9998174 -0.979209 0.9790923 0.9998174 -0.9792401 0.9790923 0.9998174 -0.9792795 0.9790923 0.9998174 -0.9793293 0.9790923 0.9998174 -0.9793923 0.9790923 0.9998174 -0.979472 0.9790923 0.9998174 -0.9795728 0.9790923 0.9998174 -0.9797004 0.9790923 0.9998174 -0.9798618 0.9790923 0.9998174 -0.980066 0.9790923 0.9998174 -0.9803244 0.9790923 0.9998174 -0.9806512 0.9790923 0.9998174 -0.9810648 0.9790923 0.9998174 -0.9815879 0.9790923 0.9998174 -0.9822497 0.9790923 0.9998174 -0.983087 0.9790923 0.9998174 -0.9841464 0.9790923 0.9998174 -0.9854865 0.9790923 0.9998174 -0.987182 0.9790923 0.9998174 -0.989327 0.9790923 0.9998174 -0.9920407 0.9790923 0.9998174 -0.9954739 0.9790923 0.9998174 -0.9998174 0.9790923 0.9998174 -0.9998557 0.9834127 0.9964097 -0.999886 0.9868503 0.9949947 -0.9999099 0.9895819 0.9946823 -0.9999288 0.99175 0.9949426 -0.9999437 0.9934694 0.995467 -0.9790927 0.9790934 0.9998174 -0.9790927 0.9790934 0.9998174 -0.9790927 0.9790933 0.9998174 -0.9790926 0.9790932 0.9998174 -0.9790925 0.9790931 0.9998174 -0.9790925 0.9790929 0.9998174 -0.9790924 0.9790927 0.9998174 -0.9790923 0.9790924 0.9998174 -0.9790921 0.9790921 0.9998174 -0.9790924 0.9790921 0.9998174 -0.9790927 0.9790921 0.9998174 -0.979093 0.9790921 0.9998174 -0.9790935 0.9790921 0.9998174 -0.979094 0.9790921 0.9998174 -0.9790948 0.9790921 0.9998174 -0.9790957 0.9790921 0.9998174 -0.9790968 0.9790921 0.9998174 -0.9790983 0.9790921 0.9998174 -0.9791001 0.9790921 0.9998174 -0.9791025 0.9790921 0.9998174 -0.9791054 0.9790921 0.9998174 -0.9791092 0.9790921 0.9998174 -0.9791139 0.9790921 0.9998174 -0.9791199 0.9790921 0.9998174 -0.9791275 0.9790921 0.9998174 -0.9791371 0.9790921 0.9998174 -0.9791493 0.9790921 0.9998174 -0.9791646 0.9790921 0.9998174 -0.9791841 0.9790921 0.9998174 -0.9792087 0.9790921 0.9998174 -0.9792398 0.9790921 0.9998174 -0.9792792 0.9790921 0.9998174 -0.979329 0.9790921 0.9998174 -0.979392 0.9790921 0.9998174 -0.9794717 0.9790921 0.9998174 -0.9795725 0.9790921 0.9998174 -0.9797001 0.9790921 0.9998174 -0.9798615 0.9790921 0.9998174 -0.9800658 0.9790921 0.9998174 -0.9803241 0.9790921 0.9998174 -0.980651 0.9790921 0.9998174 -0.9810645 0.9790921 0.9998174 -0.9815876 0.9790921 0.9998174 -0.9822495 0.9790921 0.9998174 -0.9830868 0.9790921 0.9998174 -0.9841461 0.9790921 0.9998174 -0.9854863 0.9790921 0.9998174 -0.9871818 0.9790921 0.9998174 -0.9893269 0.9790921 0.9998174 -0.9920406 0.9790921 0.9998174 -0.9954739 0.9790921 0.9998174 -0.9998174 0.9790921 0.9998174 -0.9998557 0.9834126 0.9964097 -0.999886 0.9868503 0.9949946 -0.9999099 0.9895819 0.9946823 -0.9999288 0.99175 0.9949426 -0.9999437 0.9934694 0.995467 -0.9790927 0.9790937 0.9998174 -0.9790927 0.9790936 0.9998174 -0.9790927 0.9790935 0.9998174 -0.9790926 0.9790934 0.9998174 -0.9790925 0.9790933 0.9998174 -0.9790925 0.9790931 0.9998174 -0.9790924 0.9790929 0.9998174 -0.9790923 0.9790927 0.9998174 -0.9790921 0.9790924 0.9998174 -0.979092 0.979092 0.9998174 -0.9790923 0.979092 0.9998174 -0.9790926 0.979092 0.9998174 -0.9790931 0.979092 0.9998174 -0.9790937 0.979092 0.9998174 -0.9790944 0.979092 0.9998174 -0.9790953 0.979092 0.9998174 -0.9790965 0.979092 0.9998174 -0.9790979 0.979092 0.9998174 -0.9790998 0.979092 0.9998174 -0.9791021 0.979092 0.9998174 -0.9791051 0.979092 0.9998174 -0.9791088 0.979092 0.9998174 -0.9791136 0.979092 0.9998174 -0.9791196 0.979092 0.9998174 -0.9791272 0.979092 0.9998174 -0.9791368 0.979092 0.9998174 -0.9791489 0.979092 0.9998174 -0.9791643 0.979092 0.9998174 -0.9791837 0.979092 0.9998174 -0.9792083 0.979092 0.9998174 -0.9792394 0.979092 0.9998174 -0.9792788 0.979092 0.9998174 -0.9793286 0.979092 0.9998174 -0.9793916 0.979092 0.9998174 -0.9794713 0.979092 0.9998174 -0.9795722 0.979092 0.9998174 -0.9796998 0.979092 0.9998174 -0.9798612 0.979092 0.9998174 -0.9800654 0.979092 0.9998174 -0.9803238 0.979092 0.9998174 -0.9806506 0.979092 0.9998174 -0.9810642 0.979092 0.9998174 -0.9815873 0.979092 0.9998174 -0.9822492 0.979092 0.9998174 -0.9830865 0.979092 0.9998174 -0.9841459 0.979092 0.9998174 -0.9854861 0.979092 0.9998174 -0.9871816 0.979092 0.9998174 -0.9893267 0.979092 0.9998174 -0.9920405 0.979092 0.9998174 -0.9954738 0.979092 0.9998174 -0.9998174 0.979092 0.9998174 -0.9998557 0.9834125 0.9964096 -0.999886 0.9868502 0.9949946 -0.9999099 0.9895818 0.9946822 -0.9999288 0.99175 0.9949425 -0.9999437 0.9934694 0.995467 -0.9790927 0.9790939 0.9998174 -0.9790927 0.9790939 0.9998174 -0.9790927 0.9790938 0.9998174 -0.9790926 0.9790937 0.9998174 -0.9790925 0.9790936 0.9998174 -0.9790925 0.9790934 0.9998174 -0.9790924 0.9790932 0.9998174 -0.9790923 0.979093 0.9998174 -0.9790921 0.9790927 0.9998174 -0.979092 0.9790923 0.9998174 -0.9790919 0.9790919 0.9998174 -0.9790922 0.9790919 0.9998174 -0.9790927 0.9790919 0.9998174 -0.9790932 0.9790919 0.9998174 -0.979094 0.9790919 0.9998174 -0.9790949 0.9790919 0.9998174 -0.979096 0.9790919 0.9998174 -0.9790975 0.9790919 0.9998174 -0.9790993 0.9790919 0.9998174 -0.9791017 0.9790919 0.9998174 -0.9791046 0.9790919 0.9998174 -0.9791084 0.9790919 0.9998174 -0.9791131 0.9790919 0.9998174 -0.9791191 0.9790919 0.9998174 -0.9791267 0.9790919 0.9998174 -0.9791363 0.9790919 0.9998174 -0.9791485 0.9790919 0.9998174 -0.9791638 0.9790919 0.9998174 -0.9791833 0.9790919 0.9998174 -0.9792079 0.9790919 0.9998174 -0.979239 0.9790919 0.9998174 -0.9792784 0.9790919 0.9998174 -0.9793282 0.9790919 0.9998174 -0.9793912 0.9790919 0.9998174 -0.9794709 0.9790919 0.9998174 -0.9795718 0.9790919 0.9998174 -0.9796994 0.9790919 0.9998174 -0.9798608 0.9790919 0.9998174 -0.980065 0.9790919 0.9998174 -0.9803234 0.9790919 0.9998174 -0.9806502 0.9790919 0.9998174 -0.9810638 0.9790919 0.9998174 -0.9815869 0.9790919 0.9998174 -0.9822488 0.9790919 0.9998174 -0.9830862 0.9790919 0.9998174 -0.9841455 0.9790919 0.9998174 -0.9854858 0.9790919 0.9998174 -0.9871813 0.9790919 0.9998174 -0.9893265 0.9790919 0.9998174 -0.9920403 0.9790919 0.9998174 -0.9954737 0.9790919 0.9998174 -0.9998174 0.9790919 0.9998174 -0.9998557 0.9834124 0.9964095 -0.999886 0.9868502 0.9949945 -0.9999099 0.9895818 0.9946822 -0.9999288 0.99175 0.9949425 -0.9999437 0.9934694 0.995467 -0.9790927 0.9790943 0.9998174 -0.9790927 0.9790942 0.9998174 -0.9790927 0.9790942 0.9998174 -0.9790926 0.979094 0.9998174 -0.9790925 0.9790939 0.9998174 -0.9790925 0.9790938 0.9998174 -0.9790924 0.9790936 0.9998174 -0.9790923 0.9790933 0.9998174 -0.9790921 0.979093 0.9998174 -0.979092 0.9790926 0.9998174 -0.9790919 0.9790922 0.9998174 -0.9790917 0.9790917 0.9998174 -0.9790922 0.9790917 0.9998174 -0.9790927 0.9790917 0.9998174 -0.9790935 0.9790917 0.9998174 -0.9790944 0.9790917 0.9998174 -0.9790955 0.9790917 0.9998174 -0.979097 0.9790917 0.9998174 -0.9790988 0.9790917 0.9998174 -0.9791012 0.9790917 0.9998174 -0.9791041 0.9790917 0.9998174 -0.9791079 0.9790917 0.9998174 -0.9791126 0.9790917 0.9998174 -0.9791186 0.9790917 0.9998174 -0.9791262 0.9790917 0.9998174 -0.9791358 0.9790917 0.9998174 -0.979148 0.9790917 0.9998174 -0.9791633 0.9790917 0.9998174 -0.9791828 0.9790917 0.9998174 -0.9792074 0.9790917 0.9998174 -0.9792385 0.9790917 0.9998174 -0.9792779 0.9790917 0.9998174 -0.9793277 0.9790917 0.9998174 -0.9793907 0.9790917 0.9998174 -0.9794704 0.9790917 0.9998174 -0.9795713 0.9790917 0.9998174 -0.9796989 0.9790917 0.9998174 -0.9798603 0.9790917 0.9998174 -0.9800645 0.9790917 0.9998174 -0.9803229 0.9790917 0.9998174 -0.9806498 0.9790917 0.9998174 -0.9810633 0.9790917 0.9998174 -0.9815865 0.9790917 0.9998174 -0.9822484 0.9790917 0.9998174 -0.9830858 0.9790917 0.9998174 -0.9841451 0.9790917 0.9998174 -0.9854854 0.9790917 0.9998174 -0.987181 0.9790917 0.9998174 -0.9893262 0.9790917 0.9998174 -0.9920401 0.9790917 0.9998174 -0.9954736 0.9790917 0.9998174 -0.9998174 0.9790917 0.9998174 -0.9998557 0.9834123 0.9964095 -0.999886 0.9868501 0.9949945 -0.9999099 0.9895818 0.9946821 -0.9999288 0.9917499 0.9949424 -0.9999437 0.9934694 0.9954669 -0.9790927 0.9790948 0.9998174 -0.9790927 0.9790947 0.9998174 -0.9790927 0.9790946 0.9998174 -0.9790926 0.9790945 0.9998174 -0.9790925 0.9790944 0.9998174 -0.9790925 0.9790942 0.9998174 -0.9790924 0.979094 0.9998174 -0.9790923 0.9790938 0.9998174 -0.9790921 0.9790935 0.9998174 -0.979092 0.9790931 0.9998174 -0.9790919 0.9790927 0.9998174 -0.9790917 0.9790922 0.9998174 -0.9790916 0.9790916 0.9998174 -0.9790922 0.9790916 0.9998174 -0.9790929 0.9790916 0.9998174 -0.9790938 0.9790916 0.9998174 -0.979095 0.9790916 0.9998174 -0.9790964 0.9790916 0.9998174 -0.9790983 0.9790916 0.9998174 -0.9791006 0.9790916 0.9998174 -0.9791036 0.9790916 0.9998174 -0.9791073 0.9790916 0.9998174 -0.9791121 0.9790916 0.9998174 -0.9791181 0.9790916 0.9998174 -0.9791257 0.9790916 0.9998174 -0.9791353 0.9790916 0.9998174 -0.9791474 0.9790916 0.9998174 -0.9791628 0.9790916 0.9998174 -0.9791822 0.9790916 0.9998174 -0.9792068 0.9790916 0.9998174 -0.9792379 0.9790916 0.9998174 -0.9792773 0.9790916 0.9998174 -0.9793271 0.9790916 0.9998174 -0.9793901 0.9790916 0.9998174 -0.9794699 0.9790916 0.9998174 -0.9795707 0.9790916 0.9998174 -0.9796983 0.9790916 0.9998174 -0.9798597 0.9790916 0.9998174 -0.980064 0.9790916 0.9998174 -0.9803224 0.9790916 0.9998174 -0.9806492 0.9790916 0.9998174 -0.9810628 0.9790916 0.9998174 -0.981586 0.9790916 0.9998174 -0.9822479 0.9790916 0.9998174 -0.9830853 0.9790916 0.9998174 -0.9841447 0.9790916 0.9998174 -0.985485 0.9790916 0.9998174 -0.9871807 0.9790916 0.9998174 -0.9893259 0.9790916 0.9998174 -0.9920399 0.9790916 0.9998174 -0.9954735 0.9790916 0.9998174 -0.9998174 0.9790916 0.9998174 -0.9998557 0.9834122 0.9964094 -0.999886 0.9868501 0.9949944 -0.9999099 0.9895817 0.994682 -0.9999288 0.9917499 0.9949424 -0.9999437 0.9934694 0.9954669 -0.9790927 0.9790953 0.9998174 -0.9790927 0.9790953 0.9998174 -0.9790927 0.9790952 0.9998174 -0.9790926 0.9790951 0.9998174 -0.9790925 0.9790949 0.9998174 -0.9790925 0.9790948 0.9998174 -0.9790924 0.9790946 0.9998174 -0.9790923 0.9790943 0.9998174 -0.9790921 0.979094 0.9998174 -0.979092 0.9790937 0.9998174 -0.9790919 0.9790932 0.9998174 -0.9790917 0.9790927 0.9998174 -0.9790916 0.9790922 0.9998174 -0.9790916 0.9790916 0.9998174 -0.9790923 0.9790916 0.9998174 -0.9790932 0.9790916 0.9998174 -0.9790943 0.9790916 0.9998174 -0.9790958 0.9790916 0.9998174 -0.9790977 0.9790916 0.9998174 -0.9791 0.9790916 0.9998174 -0.979103 0.9790916 0.9998174 -0.9791067 0.9790916 0.9998174 -0.9791115 0.9790916 0.9998174 -0.9791175 0.9790916 0.9998174 -0.979125 0.9790916 0.9998174 -0.9791347 0.9790916 0.9998174 -0.9791468 0.9790916 0.9998174 -0.9791622 0.9790916 0.9998174 -0.9791816 0.9790916 0.9998174 -0.9792062 0.9790916 0.9998174 -0.9792373 0.9790916 0.9998174 -0.9792767 0.9790916 0.9998174 -0.9793265 0.9790916 0.9998174 -0.9793895 0.9790916 0.9998174 -0.9794693 0.9790916 0.9998174 -0.9795701 0.9790916 0.9998174 -0.9796977 0.9790916 0.9998174 -0.9798592 0.9790916 0.9998174 -0.9800634 0.9790916 0.9998174 -0.9803218 0.9790916 0.9998174 -0.9806487 0.9790916 0.9998174 -0.9810622 0.9790916 0.9998174 -0.9815855 0.9790916 0.9998174 -0.9822474 0.9790916 0.9998174 -0.9830848 0.9790916 0.9998174 -0.9841443 0.9790916 0.9998174 -0.9854846 0.9790916 0.9998174 -0.9871803 0.9790916 0.9998174 -0.9893256 0.9790916 0.9998174 -0.9920397 0.9790916 0.9998174 -0.9954733 0.9790916 0.9998174 -0.9998174 0.9790916 0.9998174 -0.9998557 0.9834122 0.9964093 -0.999886 0.98685 0.9949943 -0.9999099 0.9895817 0.9946819 -0.9999288 0.9917499 0.9949423 -0.9999437 0.9934694 0.9954668 -0.9790927 0.979096 0.9998174 -0.9790927 0.979096 0.9998174 -0.9790927 0.9790959 0.9998174 -0.9790926 0.9790958 0.9998174 -0.9790925 0.9790957 0.9998174 -0.9790925 0.9790955 0.9998174 -0.9790924 0.9790953 0.9998174 -0.9790923 0.9790951 0.9998174 -0.9790921 0.9790948 0.9998174 -0.979092 0.9790944 0.9998174 -0.9790919 0.979094 0.9998174 -0.9790917 0.9790935 0.9998174 -0.9790916 0.9790929 0.9998174 -0.9790916 0.9790923 0.9998174 -0.9790917 0.9790917 0.9998174 -0.9790926 0.9790917 0.9998174 -0.9790938 0.9790917 0.9998174 -0.9790952 0.9790917 0.9998174 -0.9790971 0.9790917 0.9998174 -0.9790994 0.9790917 0.9998174 -0.9791024 0.9790917 0.9998174 -0.9791061 0.9790917 0.9998174 -0.9791109 0.9790917 0.9998174 -0.9791169 0.9790917 0.9998174 -0.9791245 0.9790917 0.9998174 -0.9791341 0.9790917 0.9998174 -0.9791462 0.9790917 0.9998174 -0.9791616 0.9790917 0.9998174 -0.979181 0.9790917 0.9998174 -0.9792056 0.9790917 0.9998174 -0.9792367 0.9790917 0.9998174 -0.9792761 0.9790917 0.9998174 -0.9793259 0.9790917 0.9998174 -0.9793889 0.9790917 0.9998174 -0.9794687 0.9790917 0.9998174 -0.9795695 0.9790917 0.9998174 -0.9796971 0.9790917 0.9998174 -0.9798586 0.9790917 0.9998174 -0.9800628 0.9790917 0.9998174 -0.9803212 0.9790917 0.9998174 -0.9806481 0.9790917 0.9998174 -0.9810617 0.9790917 0.9998174 -0.9815849 0.9790917 0.9998174 -0.9822469 0.9790917 0.9998174 -0.9830843 0.9790917 0.9998174 -0.9841438 0.9790917 0.9998174 -0.9854842 0.9790917 0.9998174 -0.98718 0.9790917 0.9998174 -0.9893253 0.9790917 0.9998174 -0.9920395 0.9790917 0.9998174 -0.9954732 0.9790917 0.9998174 -0.9998174 0.9790917 0.9998174 -0.9998557 0.9834123 0.9964092 -0.999886 0.9868501 0.9949942 -0.9999099 0.9895817 0.9946819 -0.9999288 0.9917499 0.9949423 -0.9999437 0.9934694 0.9954668 -0.9790927 0.979097 0.9998174 -0.9790927 0.9790969 0.9998174 -0.9790927 0.9790968 0.9998174 -0.9790926 0.9790967 0.9998174 -0.9790925 0.9790966 0.9998174 -0.9790925 0.9790964 0.9998174 -0.9790924 0.9790962 0.9998174 -0.9790923 0.979096 0.9998174 -0.9790921 0.9790957 0.9998174 -0.979092 0.9790953 0.9998174 -0.9790919 0.9790949 0.9998174 -0.9790917 0.9790944 0.9998174 -0.9790916 0.9790938 0.9998174 -0.9790916 0.9790932 0.9998174 -0.9790917 0.9790926 0.9998174 -0.9790921 0.9790921 0.9998174 -0.9790933 0.9790921 0.9998174 -0.9790948 0.9790921 0.9998174 -0.9790966 0.9790921 0.9998174 -0.9790989 0.9790921 0.9998174 -0.9791019 0.9790921 0.9998174 -0.9791057 0.9790921 0.9998174 -0.9791104 0.9790921 0.9998174 -0.9791164 0.9790921 0.9998174 -0.979124 0.9790921 0.9998174 -0.9791336 0.9790921 0.9998174 -0.9791457 0.9790921 0.9998174 -0.9791611 0.9790921 0.9998174 -0.9791806 0.9790921 0.9998174 -0.9792052 0.9790921 0.9998174 -0.9792363 0.9790921 0.9998174 -0.9792757 0.9790921 0.9998174 -0.9793255 0.9790921 0.9998174 -0.9793885 0.9790921 0.9998174 -0.9794682 0.9790921 0.9998174 -0.9795691 0.9790921 0.9998174 -0.9796967 0.9790921 0.9998174 -0.9798581 0.9790921 0.9998174 -0.9800624 0.9790921 0.9998174 -0.9803208 0.9790921 0.9998174 -0.9806477 0.9790921 0.9998174 -0.9810613 0.9790921 0.9998174 -0.9815845 0.9790921 0.9998174 -0.9822465 0.9790921 0.9998174 -0.9830839 0.9790921 0.9998174 -0.9841435 0.9790921 0.9998174 -0.9854839 0.9790921 0.9998174 -0.9871797 0.9790921 0.9998174 -0.9893251 0.9790921 0.9998174 -0.9920393 0.9790921 0.9998174 -0.9954731 0.9790921 0.9998174 -0.9998174 0.9790921 0.9998174 -0.9998557 0.9834126 0.9964092 -0.999886 0.9868503 0.9949941 -0.9999099 0.9895819 0.9946818 -0.9999288 0.99175 0.9949422 -0.9999437 0.9934694 0.9954668 -0.9790927 0.9790981 0.9998174 -0.9790927 0.979098 0.9998174 -0.9790927 0.979098 0.9998174 -0.9790926 0.9790979 0.9998174 -0.9790925 0.9790977 0.9998174 -0.9790925 0.9790976 0.9998174 -0.9790924 0.9790974 0.9998174 -0.9790923 0.9790971 0.9998174 -0.9790921 0.9790968 0.9998174 -0.979092 0.9790965 0.9998174 -0.9790919 0.979096 0.9998174 -0.9790917 0.9790955 0.9998174 -0.9790916 0.979095 0.9998174 -0.9790916 0.9790943 0.9998174 -0.9790917 0.9790938 0.9998174 -0.9790921 0.9790933 0.9998174 -0.9790931 0.9790931 0.9998174 -0.9790946 0.9790931 0.9998174 -0.9790965 0.9790931 0.9998174 -0.9790988 0.9790931 0.9998174 -0.9791018 0.9790931 0.9998174 -0.9791055 0.9790931 0.9998174 -0.9791103 0.9790931 0.9998174 -0.9791163 0.9790931 0.9998174 -0.9791238 0.9790931 0.9998174 -0.9791334 0.9790931 0.9998174 -0.9791456 0.9790931 0.9998174 -0.979161 0.9790931 0.9998174 -0.9791804 0.9790931 0.9998174 -0.979205 0.9790931 0.9998174 -0.9792361 0.9790931 0.9998174 -0.9792755 0.9790931 0.9998174 -0.9793253 0.9790931 0.9998174 -0.9793883 0.9790931 0.9998174 -0.9794681 0.9790931 0.9998174 -0.9795689 0.9790931 0.9998174 -0.9796966 0.9790931 0.9998174 -0.979858 0.9790931 0.9998174 -0.9800622 0.9790931 0.9998174 -0.9803206 0.9790931 0.9998174 -0.9806476 0.9790931 0.9998174 -0.9810611 0.9790931 0.9998174 -0.9815844 0.9790931 0.9998174 -0.9822464 0.9790931 0.9998174 -0.9830838 0.9790931 0.9998174 -0.9841433 0.9790931 0.9998174 -0.9854838 0.9790931 0.9998174 -0.9871796 0.9790931 0.9998174 -0.989325 0.9790931 0.9998174 -0.9920392 0.9790931 0.9998174 -0.9954731 0.9790931 0.9998174 -0.9998174 0.9790931 0.9998174 -0.9998557 0.9834132 0.9964092 -0.999886 0.9868507 0.9949941 -0.9999099 0.9895821 0.9946818 -0.9999288 0.9917502 0.9949422 -0.9999437 0.9934695 0.9954668 -0.9790927 0.9790996 0.9998174 -0.9790927 0.9790995 0.9998174 -0.9790927 0.9790994 0.9998174 -0.9790926 0.9790993 0.9998174 -0.9790925 0.9790992 0.9998174 -0.9790925 0.979099 0.9998174 -0.9790924 0.9790988 0.9998174 -0.9790923 0.9790986 0.9998174 -0.9790921 0.9790983 0.9998174 -0.979092 0.9790979 0.9998174 -0.9790919 0.9790975 0.9998174 -0.9790917 0.979097 0.9998174 -0.9790916 0.9790964 0.9998174 -0.9790916 0.9790958 0.9998174 -0.9790917 0.9790952 0.9998174 -0.9790921 0.9790948 0.9998174 -0.9790931 0.9790946 0.9998174 -0.9790946 0.9790946 0.9998174 -0.9790965 0.9790946 0.9998174 -0.9790988 0.9790946 0.9998174 -0.9791018 0.9790946 0.9998174 -0.9791055 0.9790946 0.9998174 -0.9791103 0.9790946 0.9998174 -0.9791163 0.9790946 0.9998174 -0.9791238 0.9790946 0.9998174 -0.9791334 0.9790946 0.9998174 -0.9791456 0.9790946 0.9998174 -0.979161 0.9790946 0.9998174 -0.9791804 0.9790946 0.9998174 -0.979205 0.9790946 0.9998174 -0.9792361 0.9790946 0.9998174 -0.9792755 0.9790946 0.9998174 -0.9793253 0.9790946 0.9998174 -0.9793883 0.9790946 0.9998174 -0.9794681 0.9790946 0.9998174 -0.9795689 0.9790946 0.9998174 -0.9796966 0.9790946 0.9998174 -0.979858 0.9790946 0.9998174 -0.9800622 0.9790946 0.9998174 -0.9803206 0.9790946 0.9998174 -0.9806476 0.9790946 0.9998174 -0.9810611 0.9790946 0.9998174 -0.9815844 0.9790946 0.9998174 -0.9822464 0.9790946 0.9998174 -0.9830838 0.9790946 0.9998174 -0.9841433 0.9790946 0.9998174 -0.9854838 0.9790946 0.9998174 -0.9871796 0.9790946 0.9998174 -0.989325 0.9790946 0.9998174 -0.9920392 0.9790946 0.9998174 -0.9954731 0.9790946 0.9998174 -0.9998174 0.9790946 0.9998174 -0.9998557 0.9834141 0.9964092 -0.999886 0.9868512 0.9949941 -0.9999099 0.9895825 0.9946818 -0.9999288 0.9917504 0.9949422 -0.9999437 0.9934697 0.9954668 -0.9790927 0.9791014 0.9998174 -0.9790927 0.9791014 0.9998174 -0.9790927 0.9791013 0.9998174 -0.9790926 0.9791012 0.9998174 -0.9790925 0.979101 0.9998174 -0.9790925 0.9791009 0.9998174 -0.9790924 0.9791007 0.9998174 -0.9790923 0.9791004 0.9998174 -0.9790921 0.9791001 0.9998174 -0.979092 0.9790998 0.9998174 -0.9790919 0.9790993 0.9998174 -0.9790917 0.9790988 0.9998174 -0.9790916 0.9790983 0.9998174 -0.9790916 0.9790977 0.9998174 -0.9790917 0.9790971 0.9998174 -0.9790921 0.9790966 0.9998174 -0.9790931 0.9790965 0.9998174 -0.9790946 0.9790965 0.9998174 -0.9790965 0.9790965 0.9998174 -0.9790988 0.9790965 0.9998174 -0.9791018 0.9790965 0.9998174 -0.9791055 0.9790965 0.9998174 -0.9791103 0.9790965 0.9998174 -0.9791163 0.9790965 0.9998174 -0.9791238 0.9790965 0.9998174 -0.9791334 0.9790965 0.9998174 -0.9791456 0.9790965 0.9998174 -0.979161 0.9790965 0.9998174 -0.9791804 0.9790965 0.9998174 -0.979205 0.9790965 0.9998174 -0.9792361 0.9790965 0.9998174 -0.9792755 0.9790965 0.9998174 -0.9793253 0.9790965 0.9998174 -0.9793883 0.9790965 0.9998174 -0.9794681 0.9790965 0.9998174 -0.9795689 0.9790965 0.9998174 -0.9796966 0.9790965 0.9998174 -0.979858 0.9790965 0.9998174 -0.9800622 0.9790965 0.9998174 -0.9803206 0.9790965 0.9998174 -0.9806476 0.9790965 0.9998174 -0.9810611 0.9790965 0.9998174 -0.9815844 0.9790965 0.9998174 -0.9822464 0.9790965 0.9998174 -0.9830838 0.9790965 0.9998174 -0.9841433 0.9790965 0.9998174 -0.9854838 0.9790965 0.9998174 -0.9871796 0.9790965 0.9998174 -0.989325 0.9790965 0.9998174 -0.9920392 0.9790965 0.9998174 -0.9954731 0.9790965 0.9998174 -0.9998174 0.9790965 0.9998174 -0.9998557 0.9834153 0.9964092 -0.999886 0.986852 0.9949941 -0.9999099 0.9895829 0.9946818 -0.9999288 0.9917507 0.9949422 -0.9999437 0.9934698 0.9954668 -0.9790927 0.9791038 0.9998174 -0.9790927 0.9791037 0.9998174 -0.9790927 0.9791036 0.9998174 -0.9790926 0.9791035 0.9998174 -0.9790925 0.9791034 0.9998174 -0.9790925 0.9791032 0.9998174 -0.9790924 0.979103 0.9998174 -0.9790923 0.9791028 0.9998174 -0.9790921 0.9791025 0.9998174 -0.979092 0.9791021 0.9998174 -0.9790919 0.9791017 0.9998174 -0.9790917 0.9791012 0.9998174 -0.9790916 0.9791006 0.9998174 -0.9790916 0.9791 0.9998174 -0.9790917 0.9790994 0.9998174 -0.9790921 0.9790989 0.9998174 -0.9790931 0.9790988 0.9998174 -0.9790946 0.9790988 0.9998174 -0.9790965 0.9790988 0.9998174 -0.9790988 0.9790988 0.9998174 -0.9791018 0.9790988 0.9998174 -0.9791055 0.9790988 0.9998174 -0.9791103 0.9790988 0.9998174 -0.9791163 0.9790988 0.9998174 -0.9791238 0.9790988 0.9998174 -0.9791334 0.9790988 0.9998174 -0.9791456 0.9790988 0.9998174 -0.979161 0.9790988 0.9998174 -0.9791804 0.9790988 0.9998174 -0.979205 0.9790988 0.9998174 -0.9792361 0.9790988 0.9998174 -0.9792755 0.9790988 0.9998174 -0.9793253 0.9790988 0.9998174 -0.9793883 0.9790988 0.9998174 -0.9794681 0.9790988 0.9998174 -0.9795689 0.9790988 0.9998174 -0.9796966 0.9790988 0.9998174 -0.979858 0.9790988 0.9998174 -0.9800622 0.9790988 0.9998174 -0.9803206 0.9790988 0.9998174 -0.9806476 0.9790988 0.9998174 -0.9810611 0.9790988 0.9998174 -0.9815844 0.9790988 0.9998174 -0.9822464 0.9790988 0.9998174 -0.9830838 0.9790988 0.9998174 -0.9841433 0.9790988 0.9998174 -0.9854838 0.9790988 0.9998174 -0.9871796 0.9790988 0.9998174 -0.989325 0.9790988 0.9998174 -0.9920392 0.9790988 0.9998174 -0.9954731 0.9790988 0.9998174 -0.9998174 0.9790988 0.9998174 -0.9998557 0.9834167 0.9964092 -0.999886 0.9868529 0.9949941 -0.9999099 0.9895835 0.9946818 -0.9999288 0.991751 0.9949422 -0.9999437 0.9934701 0.9954668 -0.9790927 0.9791067 0.9998174 -0.9790927 0.9791067 0.9998174 -0.9790927 0.9791066 0.9998174 -0.9790926 0.9791065 0.9998174 -0.9790925 0.9791064 0.9998174 -0.9790925 0.9791062 0.9998174 -0.9790924 0.979106 0.9998174 -0.9790923 0.9791057 0.9998174 -0.9790921 0.9791054 0.9998174 -0.979092 0.9791051 0.9998174 -0.9790919 0.9791046 0.9998174 -0.9790917 0.9791041 0.9998174 -0.9790916 0.9791036 0.9998174 -0.9790916 0.979103 0.9998174 -0.9790917 0.9791024 0.9998174 -0.9790921 0.9791019 0.9998174 -0.9790931 0.9791018 0.9998174 -0.9790946 0.9791018 0.9998174 -0.9790965 0.9791018 0.9998174 -0.9790988 0.9791018 0.9998174 -0.9791018 0.9791018 0.9998174 -0.9791055 0.9791018 0.9998174 -0.9791103 0.9791018 0.9998174 -0.9791163 0.9791018 0.9998174 -0.9791238 0.9791018 0.9998174 -0.9791334 0.9791018 0.9998174 -0.9791456 0.9791018 0.9998174 -0.979161 0.9791018 0.9998174 -0.9791804 0.9791018 0.9998174 -0.979205 0.9791018 0.9998174 -0.9792361 0.9791018 0.9998174 -0.9792755 0.9791018 0.9998174 -0.9793253 0.9791018 0.9998174 -0.9793883 0.9791018 0.9998174 -0.9794681 0.9791018 0.9998174 -0.9795689 0.9791018 0.9998174 -0.9796966 0.9791018 0.9998174 -0.979858 0.9791018 0.9998174 -0.9800622 0.9791018 0.9998174 -0.9803206 0.9791018 0.9998174 -0.9806476 0.9791018 0.9998174 -0.9810611 0.9791018 0.9998174 -0.9815844 0.9791018 0.9998174 -0.9822464 0.9791018 0.9998174 -0.9830838 0.9791018 0.9998174 -0.9841433 0.9791018 0.9998174 -0.9854838 0.9791018 0.9998174 -0.9871796 0.9791018 0.9998174 -0.989325 0.9791018 0.9998174 -0.9920392 0.9791018 0.9998174 -0.9954731 0.9791018 0.9998174 -0.9998174 0.9791018 0.9998174 -0.9998557 0.9834186 0.9964092 -0.999886 0.9868541 0.9949941 -0.9999099 0.9895842 0.9946818 -0.9999288 0.9917515 0.9949422 -0.9999437 0.9934704 0.9954668 -0.9790927 0.9791105 0.9998174 -0.9790927 0.9791104 0.9998174 -0.9790927 0.9791103 0.9998174 -0.9790926 0.9791102 0.9998174 -0.9790925 0.9791101 0.9998174 -0.9790925 0.9791099 0.9998174 -0.9790924 0.9791097 0.9998174 -0.9790923 0.9791095 0.9998174 -0.9790921 0.9791092 0.9998174 -0.979092 0.9791088 0.9998174 -0.9790919 0.9791084 0.9998174 -0.9790917 0.9791079 0.9998174 -0.9790916 0.9791073 0.9998174 -0.9790916 0.9791067 0.9998174 -0.9790917 0.9791061 0.9998174 -0.9790921 0.9791057 0.9998174 -0.9790931 0.9791055 0.9998174 -0.9790946 0.9791055 0.9998174 -0.9790965 0.9791055 0.9998174 -0.9790988 0.9791055 0.9998174 -0.9791018 0.9791055 0.9998174 -0.9791055 0.9791055 0.9998174 -0.9791103 0.9791055 0.9998174 -0.9791163 0.9791055 0.9998174 -0.9791238 0.9791055 0.9998174 -0.9791334 0.9791055 0.9998174 -0.9791456 0.9791055 0.9998174 -0.979161 0.9791055 0.9998174 -0.9791804 0.9791055 0.9998174 -0.979205 0.9791055 0.9998174 -0.9792361 0.9791055 0.9998174 -0.9792755 0.9791055 0.9998174 -0.9793253 0.9791055 0.9998174 -0.9793883 0.9791055 0.9998174 -0.9794681 0.9791055 0.9998174 -0.9795689 0.9791055 0.9998174 -0.9796966 0.9791055 0.9998174 -0.979858 0.9791055 0.9998174 -0.9800622 0.9791055 0.9998174 -0.9803206 0.9791055 0.9998174 -0.9806476 0.9791055 0.9998174 -0.9810611 0.9791055 0.9998174 -0.9815844 0.9791055 0.9998174 -0.9822464 0.9791055 0.9998174 -0.9830838 0.9791055 0.9998174 -0.9841433 0.9791055 0.9998174 -0.9854838 0.9791055 0.9998174 -0.9871796 0.9791055 0.9998174 -0.989325 0.9791055 0.9998174 -0.9920392 0.9791055 0.9998174 -0.9954731 0.9791055 0.9998174 -0.9998174 0.9791055 0.9998174 -0.9998557 0.9834209 0.9964092 -0.999886 0.9868555 0.9949941 -0.9999099 0.9895851 0.9946818 -0.9999288 0.9917521 0.9949422 -0.9999437 0.9934707 0.9954668 -0.9790927 0.9791152 0.9998174 -0.9790927 0.9791152 0.9998174 -0.9790927 0.9791151 0.9998174 -0.9790926 0.979115 0.9998174 -0.9790925 0.9791148 0.9998174 -0.9790925 0.9791147 0.9998174 -0.9790924 0.9791145 0.9998174 -0.9790923 0.9791142 0.9998174 -0.9790921 0.9791139 0.9998174 -0.979092 0.9791136 0.9998174 -0.9790919 0.9791131 0.9998174 -0.9790917 0.9791126 0.9998174 -0.9790916 0.9791121 0.9998174 -0.9790916 0.9791115 0.9998174 -0.9790917 0.9791109 0.9998174 -0.9790921 0.9791104 0.9998174 -0.9790931 0.9791103 0.9998174 -0.9790946 0.9791103 0.9998174 -0.9790965 0.9791103 0.9998174 -0.9790988 0.9791103 0.9998174 -0.9791018 0.9791103 0.9998174 -0.9791055 0.9791103 0.9998174 -0.9791103 0.9791103 0.9998174 -0.9791163 0.9791103 0.9998174 -0.9791238 0.9791103 0.9998174 -0.9791334 0.9791103 0.9998174 -0.9791456 0.9791103 0.9998174 -0.979161 0.9791103 0.9998174 -0.9791804 0.9791103 0.9998174 -0.979205 0.9791103 0.9998174 -0.9792361 0.9791103 0.9998174 -0.9792755 0.9791103 0.9998174 -0.9793253 0.9791103 0.9998174 -0.9793883 0.9791103 0.9998174 -0.9794681 0.9791103 0.9998174 -0.9795689 0.9791103 0.9998174 -0.9796966 0.9791103 0.9998174 -0.979858 0.9791103 0.9998174 -0.9800622 0.9791103 0.9998174 -0.9803206 0.9791103 0.9998174 -0.9806476 0.9791103 0.9998174 -0.9810611 0.9791103 0.9998174 -0.9815844 0.9791103 0.9998174 -0.9822464 0.9791103 0.9998174 -0.9830838 0.9791103 0.9998174 -0.9841433 0.9791103 0.9998174 -0.9854838 0.9791103 0.9998174 -0.9871796 0.9791103 0.9998174 -0.989325 0.9791103 0.9998174 -0.9920392 0.9791103 0.9998174 -0.9954731 0.9791103 0.9998174 -0.9998174 0.9791103 0.9998174 -0.9998557 0.9834239 0.9964092 -0.999886 0.9868574 0.9949941 -0.9999099 0.9895863 0.9946818 -0.9999288 0.9917528 0.9949422 -0.9999437 0.9934712 0.9954668 -0.9790927 0.9791212 0.9998174 -0.9790927 0.9791212 0.9998174 -0.9790927 0.9791211 0.9998174 -0.9790926 0.979121 0.9998174 -0.9790925 0.9791208 0.9998174 -0.9790925 0.9791207 0.9998174 -0.9790924 0.9791205 0.9998174 -0.9790923 0.9791202 0.9998174 -0.9790921 0.9791199 0.9998174 -0.979092 0.9791196 0.9998174 -0.9790919 0.9791191 0.9998174 -0.9790917 0.9791186 0.9998174 -0.9790916 0.9791181 0.9998174 -0.9790916 0.9791175 0.9998174 -0.9790917 0.9791169 0.9998174 -0.9790921 0.9791164 0.9998174 -0.9790931 0.9791163 0.9998174 -0.9790946 0.9791163 0.9998174 -0.9790965 0.9791163 0.9998174 -0.9790988 0.9791163 0.9998174 -0.9791018 0.9791163 0.9998174 -0.9791055 0.9791163 0.9998174 -0.9791103 0.9791163 0.9998174 -0.9791163 0.9791163 0.9998174 -0.9791238 0.9791163 0.9998174 -0.9791334 0.9791163 0.9998174 -0.9791456 0.9791163 0.9998174 -0.979161 0.9791163 0.9998174 -0.9791804 0.9791163 0.9998174 -0.979205 0.9791163 0.9998174 -0.9792361 0.9791163 0.9998174 -0.9792755 0.9791163 0.9998174 -0.9793253 0.9791163 0.9998174 -0.9793883 0.9791163 0.9998174 -0.9794681 0.9791163 0.9998174 -0.9795689 0.9791163 0.9998174 -0.9796966 0.9791163 0.9998174 -0.979858 0.9791163 0.9998174 -0.9800622 0.9791163 0.9998174 -0.9803206 0.9791163 0.9998174 -0.9806476 0.9791163 0.9998174 -0.9810611 0.9791163 0.9998174 -0.9815844 0.9791163 0.9998174 -0.9822464 0.9791163 0.9998174 -0.9830838 0.9791163 0.9998174 -0.9841433 0.9791163 0.9998174 -0.9854838 0.9791163 0.9998174 -0.9871796 0.9791163 0.9998174 -0.989325 0.9791163 0.9998174 -0.9920392 0.9791163 0.9998174 -0.9954731 0.9791163 0.9998174 -0.9998174 0.9791163 0.9998174 -0.9998557 0.9834277 0.9964092 -0.999886 0.9868597 0.9949941 -0.9999099 0.9895878 0.9946818 -0.9999288 0.9917537 0.9949422 -0.9999437 0.9934718 0.9954668 -0.9790927 0.9791288 0.9998174 -0.9790927 0.9791287 0.9998174 -0.9790927 0.9791287 0.9998174 -0.9790926 0.9791286 0.9998174 -0.9790925 0.9791284 0.9998174 -0.9790925 0.9791283 0.9998174 -0.9790924 0.9791281 0.9998174 -0.9790923 0.9791278 0.9998174 -0.9790921 0.9791275 0.9998174 -0.979092 0.9791272 0.9998174 -0.9790919 0.9791267 0.9998174 -0.9790917 0.9791262 0.9998174 -0.9790916 0.9791257 0.9998174 -0.9790916 0.979125 0.9998174 -0.9790917 0.9791245 0.9998174 -0.9790921 0.979124 0.9998174 -0.9790931 0.9791238 0.9998174 -0.9790946 0.9791238 0.9998174 -0.9790965 0.9791238 0.9998174 -0.9790988 0.9791238 0.9998174 -0.9791018 0.9791238 0.9998174 -0.9791055 0.9791238 0.9998174 -0.9791103 0.9791238 0.9998174 -0.9791163 0.9791238 0.9998174 -0.9791238 0.9791238 0.9998174 -0.9791334 0.9791238 0.9998174 -0.9791456 0.9791238 0.9998174 -0.979161 0.9791238 0.9998174 -0.9791804 0.9791238 0.9998174 -0.979205 0.9791238 0.9998174 -0.9792361 0.9791238 0.9998174 -0.9792755 0.9791238 0.9998174 -0.9793253 0.9791238 0.9998174 -0.9793883 0.9791238 0.9998174 -0.9794681 0.9791238 0.9998174 -0.9795689 0.9791238 0.9998174 -0.9796966 0.9791238 0.9998174 -0.979858 0.9791238 0.9998174 -0.9800622 0.9791238 0.9998174 -0.9803206 0.9791238 0.9998174 -0.9806476 0.9791238 0.9998174 -0.9810611 0.9791238 0.9998174 -0.9815844 0.9791238 0.9998174 -0.9822464 0.9791238 0.9998174 -0.9830838 0.9791238 0.9998174 -0.9841433 0.9791238 0.9998174 -0.9854838 0.9791238 0.9998174 -0.9871796 0.9791238 0.9998174 -0.989325 0.9791238 0.9998174 -0.9920392 0.9791238 0.9998174 -0.9954731 0.9791238 0.9998174 -0.9998174 0.9791238 0.9998174 -0.9998557 0.9834324 0.9964092 -0.999886 0.9868627 0.9949941 -0.9999099 0.9895897 0.9946818 -0.9999288 0.9917549 0.9949422 -0.9999437 0.9934725 0.9954668 -0.9790927 0.9791384 0.9998174 -0.9790927 0.9791383 0.9998174 -0.9790927 0.9791383 0.9998174 -0.9790926 0.9791382 0.9998174 -0.9790925 0.979138 0.9998174 -0.9790925 0.9791379 0.9998174 -0.9790924 0.9791377 0.9998174 -0.9790923 0.9791374 0.9998174 -0.9790921 0.9791371 0.9998174 -0.979092 0.9791368 0.9998174 -0.9790919 0.9791363 0.9998174 -0.9790917 0.9791358 0.9998174 -0.9790916 0.9791353 0.9998174 -0.9790916 0.9791347 0.9998174 -0.9790917 0.9791341 0.9998174 -0.9790921 0.9791336 0.9998174 -0.9790931 0.9791334 0.9998174 -0.9790946 0.9791334 0.9998174 -0.9790965 0.9791334 0.9998174 -0.9790988 0.9791334 0.9998174 -0.9791018 0.9791334 0.9998174 -0.9791055 0.9791334 0.9998174 -0.9791103 0.9791334 0.9998174 -0.9791163 0.9791334 0.9998174 -0.9791238 0.9791334 0.9998174 -0.9791334 0.9791334 0.9998174 -0.9791456 0.9791334 0.9998174 -0.979161 0.9791334 0.9998174 -0.9791804 0.9791334 0.9998174 -0.979205 0.9791334 0.9998174 -0.9792361 0.9791334 0.9998174 -0.9792755 0.9791334 0.9998174 -0.9793253 0.9791334 0.9998174 -0.9793883 0.9791334 0.9998174 -0.9794681 0.9791334 0.9998174 -0.9795689 0.9791334 0.9998174 -0.9796966 0.9791334 0.9998174 -0.979858 0.9791334 0.9998174 -0.9800622 0.9791334 0.9998174 -0.9803206 0.9791334 0.9998174 -0.9806476 0.9791334 0.9998174 -0.9810611 0.9791334 0.9998174 -0.9815844 0.9791334 0.9998174 -0.9822464 0.9791334 0.9998174 -0.9830838 0.9791334 0.9998174 -0.9841433 0.9791334 0.9998174 -0.9854838 0.9791334 0.9998174 -0.9871796 0.9791334 0.9998174 -0.989325 0.9791334 0.9998174 -0.9920392 0.9791334 0.9998174 -0.9954731 0.9791334 0.9998174 -0.9998174 0.9791334 0.9998174 -0.9998557 0.9834385 0.9964092 -0.999886 0.9868665 0.9949941 -0.9999099 0.989592 0.9946818 -0.9999288 0.9917564 0.9949422 -0.9999437 0.9934734 0.9954668 -0.9790927 0.9791506 0.9998174 -0.9790927 0.9791505 0.9998174 -0.9790927 0.9791504 0.9998174 -0.9790926 0.9791503 0.9998174 -0.9790925 0.9791502 0.9998174 -0.9790925 0.97915 0.9998174 -0.9790924 0.9791498 0.9998174 -0.9790923 0.9791496 0.9998174 -0.9790921 0.9791493 0.9998174 -0.979092 0.9791489 0.9998174 -0.9790919 0.9791485 0.9998174 -0.9790917 0.979148 0.9998174 -0.9790916 0.9791474 0.9998174 -0.9790916 0.9791468 0.9998174 -0.9790917 0.9791462 0.9998174 -0.9790921 0.9791457 0.9998174 -0.9790931 0.9791456 0.9998174 -0.9790946 0.9791456 0.9998174 -0.9790965 0.9791456 0.9998174 -0.9790988 0.9791456 0.9998174 -0.9791018 0.9791456 0.9998174 -0.9791055 0.9791456 0.9998174 -0.9791103 0.9791456 0.9998174 -0.9791163 0.9791456 0.9998174 -0.9791238 0.9791456 0.9998174 -0.9791334 0.9791456 0.9998174 -0.9791456 0.9791456 0.9998174 -0.979161 0.9791456 0.9998174 -0.9791804 0.9791456 0.9998174 -0.979205 0.9791456 0.9998174 -0.9792361 0.9791456 0.9998174 -0.9792755 0.9791456 0.9998174 -0.9793253 0.9791456 0.9998174 -0.9793883 0.9791456 0.9998174 -0.9794681 0.9791456 0.9998174 -0.9795689 0.9791456 0.9998174 -0.9796966 0.9791456 0.9998174 -0.979858 0.9791456 0.9998174 -0.9800622 0.9791456 0.9998174 -0.9803206 0.9791456 0.9998174 -0.9806476 0.9791456 0.9998174 -0.9810611 0.9791456 0.9998174 -0.9815844 0.9791456 0.9998174 -0.9822464 0.9791456 0.9998174 -0.9830838 0.9791456 0.9998174 -0.9841433 0.9791456 0.9998174 -0.9854838 0.9791456 0.9998174 -0.9871796 0.9791456 0.9998174 -0.989325 0.9791456 0.9998174 -0.9920392 0.9791456 0.9998174 -0.9954731 0.9791456 0.9998174 -0.9998174 0.9791456 0.9998174 -0.9998557 0.9834461 0.9964092 -0.999886 0.9868713 0.9949941 -0.9999099 0.989595 0.9946818 -0.9999288 0.9917582 0.9949422 -0.9999437 0.9934746 0.9954668 -0.9790927 0.9791659 0.9998174 -0.9790927 0.9791659 0.9998174 -0.9790927 0.9791658 0.9998174 -0.9790926 0.9791657 0.9998174 -0.9790925 0.9791655 0.9998174 -0.9790925 0.9791654 0.9998174 -0.9790924 0.9791652 0.9998174 -0.9790923 0.9791649 0.9998174 -0.9790921 0.9791646 0.9998174 -0.979092 0.9791643 0.9998174 -0.9790919 0.9791638 0.9998174 -0.9790917 0.9791633 0.9998174 -0.9790916 0.9791628 0.9998174 -0.9790916 0.9791622 0.9998174 -0.9790917 0.9791616 0.9998174 -0.9790921 0.9791611 0.9998174 -0.9790931 0.979161 0.9998174 -0.9790946 0.979161 0.9998174 -0.9790965 0.979161 0.9998174 -0.9790988 0.979161 0.9998174 -0.9791018 0.979161 0.9998174 -0.9791055 0.979161 0.9998174 -0.9791103 0.979161 0.9998174 -0.9791163 0.979161 0.9998174 -0.9791238 0.979161 0.9998174 -0.9791334 0.979161 0.9998174 -0.9791456 0.979161 0.9998174 -0.979161 0.979161 0.9998174 -0.9791804 0.979161 0.9998174 -0.979205 0.979161 0.9998174 -0.9792361 0.979161 0.9998174 -0.9792755 0.979161 0.9998174 -0.9793253 0.979161 0.9998174 -0.9793883 0.979161 0.9998174 -0.9794681 0.979161 0.9998174 -0.9795689 0.979161 0.9998174 -0.9796966 0.979161 0.9998174 -0.979858 0.979161 0.9998174 -0.9800622 0.979161 0.9998174 -0.9803206 0.979161 0.9998174 -0.9806476 0.979161 0.9998174 -0.9810611 0.979161 0.9998174 -0.9815844 0.979161 0.9998174 -0.9822464 0.979161 0.9998174 -0.9830838 0.979161 0.9998174 -0.9841433 0.979161 0.9998174 -0.9854838 0.979161 0.9998174 -0.9871796 0.979161 0.9998174 -0.989325 0.979161 0.9998174 -0.9920392 0.979161 0.9998174 -0.9954731 0.979161 0.9998174 -0.9998174 0.979161 0.9998174 -0.9998557 0.9834557 0.9964092 -0.999886 0.9868773 0.9949941 -0.9999099 0.9895988 0.9946818 -0.9999288 0.9917606 0.9949422 -0.9999437 0.9934761 0.9954668 -0.9790927 0.9791854 0.9998174 -0.9790927 0.9791853 0.9998174 -0.9790927 0.9791852 0.9998174 -0.9790926 0.9791851 0.9998174 -0.9790925 0.979185 0.9998174 -0.9790925 0.9791848 0.9998174 -0.9790924 0.9791846 0.9998174 -0.9790923 0.9791844 0.9998174 -0.9790921 0.9791841 0.9998174 -0.979092 0.9791837 0.9998174 -0.9790919 0.9791833 0.9998174 -0.9790917 0.9791828 0.9998174 -0.9790916 0.9791822 0.9998174 -0.9790916 0.9791816 0.9998174 -0.9790917 0.979181 0.9998174 -0.9790921 0.9791806 0.9998174 -0.9790931 0.9791804 0.9998174 -0.9790946 0.9791804 0.9998174 -0.9790965 0.9791804 0.9998174 -0.9790988 0.9791804 0.9998174 -0.9791018 0.9791804 0.9998174 -0.9791055 0.9791804 0.9998174 -0.9791103 0.9791804 0.9998174 -0.9791163 0.9791804 0.9998174 -0.9791238 0.9791804 0.9998174 -0.9791334 0.9791804 0.9998174 -0.9791456 0.9791804 0.9998174 -0.979161 0.9791804 0.9998174 -0.9791804 0.9791804 0.9998174 -0.979205 0.9791804 0.9998174 -0.9792361 0.9791804 0.9998174 -0.9792755 0.9791804 0.9998174 -0.9793253 0.9791804 0.9998174 -0.9793883 0.9791804 0.9998174 -0.9794681 0.9791804 0.9998174 -0.9795689 0.9791804 0.9998174 -0.9796966 0.9791804 0.9998174 -0.979858 0.9791804 0.9998174 -0.9800622 0.9791804 0.9998174 -0.9803206 0.9791804 0.9998174 -0.9806476 0.9791804 0.9998174 -0.9810611 0.9791804 0.9998174 -0.9815844 0.9791804 0.9998174 -0.9822464 0.9791804 0.9998174 -0.9830838 0.9791804 0.9998174 -0.9841433 0.9791804 0.9998174 -0.9854838 0.9791804 0.9998174 -0.9871796 0.9791804 0.9998174 -0.989325 0.9791804 0.9998174 -0.9920392 0.9791804 0.9998174 -0.9954731 0.9791804 0.9998174 -0.9998174 0.9791804 0.9998174 -0.9998557 0.9834679 0.9964092 -0.999886 0.986885 0.9949941 -0.9999099 0.9896036 0.9946818 -0.9999288 0.9917636 0.9949422 -0.9999437 0.9934779 0.9954668 -0.9790927 0.97921 0.9998174 -0.9790927 0.9792099 0.9998174 -0.9790927 0.9792098 0.9998174 -0.9790926 0.9792097 0.9998174 -0.9790925 0.9792096 0.9998174 -0.9790925 0.9792094 0.9998174 -0.9790924 0.9792092 0.9998174 -0.9790923 0.979209 0.9998174 -0.9790921 0.9792087 0.9998174 -0.979092 0.9792083 0.9998174 -0.9790919 0.9792079 0.9998174 -0.9790917 0.9792074 0.9998174 -0.9790916 0.9792068 0.9998174 -0.9790916 0.9792062 0.9998174 -0.9790917 0.9792056 0.9998174 -0.9790921 0.9792052 0.9998174 -0.9790931 0.979205 0.9998174 -0.9790946 0.979205 0.9998174 -0.9790965 0.979205 0.9998174 -0.9790988 0.979205 0.9998174 -0.9791018 0.979205 0.9998174 -0.9791055 0.979205 0.9998174 -0.9791103 0.979205 0.9998174 -0.9791163 0.979205 0.9998174 -0.9791238 0.979205 0.9998174 -0.9791334 0.979205 0.9998174 -0.9791456 0.979205 0.9998174 -0.979161 0.979205 0.9998174 -0.9791804 0.979205 0.9998174 -0.979205 0.979205 0.9998174 -0.9792361 0.979205 0.9998174 -0.9792755 0.979205 0.9998174 -0.9793253 0.979205 0.9998174 -0.9793883 0.979205 0.9998174 -0.9794681 0.979205 0.9998174 -0.9795689 0.979205 0.9998174 -0.9796966 0.979205 0.9998174 -0.979858 0.979205 0.9998174 -0.9800622 0.979205 0.9998174 -0.9803206 0.979205 0.9998174 -0.9806476 0.979205 0.9998174 -0.9810611 0.979205 0.9998174 -0.9815844 0.979205 0.9998174 -0.9822464 0.979205 0.9998174 -0.9830838 0.979205 0.9998174 -0.9841433 0.979205 0.9998174 -0.9854838 0.979205 0.9998174 -0.9871796 0.979205 0.9998174 -0.989325 0.979205 0.9998174 -0.9920392 0.979205 0.9998174 -0.9954731 0.979205 0.9998174 -0.9998174 0.979205 0.9998174 -0.9998557 0.9834833 0.9964092 -0.999886 0.9868946 0.9949941 -0.9999099 0.9896096 0.9946818 -0.9999288 0.9917674 0.9949422 -0.9999437 0.9934803 0.9954668 -0.9790927 0.9792411 0.9998174 -0.9790927 0.979241 0.9998174 -0.9790927 0.9792409 0.9998174 -0.9790926 0.9792408 0.9998174 -0.9790925 0.9792407 0.9998174 -0.9790925 0.9792405 0.9998174 -0.9790924 0.9792403 0.9998174 -0.9790923 0.9792401 0.9998174 -0.9790921 0.9792398 0.9998174 -0.979092 0.9792394 0.9998174 -0.9790919 0.979239 0.9998174 -0.9790917 0.9792385 0.9998174 -0.9790916 0.9792379 0.9998174 -0.9790916 0.9792373 0.9998174 -0.9790917 0.9792367 0.9998174 -0.9790921 0.9792363 0.9998174 -0.9790931 0.9792361 0.9998174 -0.9790946 0.9792361 0.9998174 -0.9790965 0.9792361 0.9998174 -0.9790988 0.9792361 0.9998174 -0.9791018 0.9792361 0.9998174 -0.9791055 0.9792361 0.9998174 -0.9791103 0.9792361 0.9998174 -0.9791163 0.9792361 0.9998174 -0.9791238 0.9792361 0.9998174 -0.9791334 0.9792361 0.9998174 -0.9791456 0.9792361 0.9998174 -0.979161 0.9792361 0.9998174 -0.9791804 0.9792361 0.9998174 -0.979205 0.9792361 0.9998174 -0.9792361 0.9792361 0.9998174 -0.9792755 0.9792361 0.9998174 -0.9793253 0.9792361 0.9998174 -0.9793883 0.9792361 0.9998174 -0.9794681 0.9792361 0.9998174 -0.9795689 0.9792361 0.9998174 -0.9796966 0.9792361 0.9998174 -0.979858 0.9792361 0.9998174 -0.9800622 0.9792361 0.9998174 -0.9803206 0.9792361 0.9998174 -0.9806476 0.9792361 0.9998174 -0.9810611 0.9792361 0.9998174 -0.9815844 0.9792361 0.9998174 -0.9822464 0.9792361 0.9998174 -0.9830838 0.9792361 0.9998174 -0.9841433 0.9792361 0.9998174 -0.9854838 0.9792361 0.9998174 -0.9871796 0.9792361 0.9998174 -0.989325 0.9792361 0.9998174 -0.9920392 0.9792361 0.9998174 -0.9954731 0.9792361 0.9998174 -0.9998174 0.9792361 0.9998174 -0.9998557 0.9835029 0.9964092 -0.999886 0.9869069 0.9949941 -0.9999099 0.9896173 0.9946818 -0.9999288 0.9917722 0.9949422 -0.9999437 0.9934833 0.9954668 -0.9790927 0.9792804 0.9998174 -0.9790927 0.9792804 0.9998174 -0.9790927 0.9792803 0.9998174 -0.9790926 0.9792802 0.9998174 -0.9790925 0.9792801 0.9998174 -0.9790925 0.9792799 0.9998174 -0.9790924 0.9792797 0.9998174 -0.9790923 0.9792795 0.9998174 -0.9790921 0.9792792 0.9998174 -0.979092 0.9792788 0.9998174 -0.9790919 0.9792784 0.9998174 -0.9790917 0.9792779 0.9998174 -0.9790916 0.9792773 0.9998174 -0.9790916 0.9792767 0.9998174 -0.9790917 0.9792761 0.9998174 -0.9790921 0.9792757 0.9998174 -0.9790931 0.9792755 0.9998174 -0.9790946 0.9792755 0.9998174 -0.9790965 0.9792755 0.9998174 -0.9790988 0.9792755 0.9998174 -0.9791018 0.9792755 0.9998174 -0.9791055 0.9792755 0.9998174 -0.9791103 0.9792755 0.9998174 -0.9791163 0.9792755 0.9998174 -0.9791238 0.9792755 0.9998174 -0.9791334 0.9792755 0.9998174 -0.9791456 0.9792755 0.9998174 -0.979161 0.9792755 0.9998174 -0.9791804 0.9792755 0.9998174 -0.979205 0.9792755 0.9998174 -0.9792361 0.9792755 0.9998174 -0.9792755 0.9792755 0.9998174 -0.9793253 0.9792755 0.9998174 -0.9793883 0.9792755 0.9998174 -0.9794681 0.9792755 0.9998174 -0.9795689 0.9792755 0.9998174 -0.9796966 0.9792755 0.9998174 -0.979858 0.9792755 0.9998174 -0.9800622 0.9792755 0.9998174 -0.9803206 0.9792755 0.9998174 -0.9806476 0.9792755 0.9998174 -0.9810611 0.9792755 0.9998174 -0.9815844 0.9792755 0.9998174 -0.9822464 0.9792755 0.9998174 -0.9830838 0.9792755 0.9998174 -0.9841433 0.9792755 0.9998174 -0.9854838 0.9792755 0.9998174 -0.9871796 0.9792755 0.9998174 -0.989325 0.9792755 0.9998174 -0.9920392 0.9792755 0.9998174 -0.9954731 0.9792755 0.9998174 -0.9998174 0.9792755 0.9998174 -0.9998557 0.9835276 0.9964092 -0.999886 0.9869223 0.9949941 -0.9999099 0.989627 0.9946818 -0.9999288 0.9917782 0.9949422 -0.9999437 0.9934871 0.9954668 -0.9790927 0.9793302 0.9998174 -0.9790927 0.9793302 0.9998174 -0.9790927 0.9793301 0.9998174 -0.9790926 0.97933 0.9998174 -0.9790925 0.9793299 0.9998174 -0.9790925 0.9793297 0.9998174 -0.9790924 0.9793295 0.9998174 -0.9790923 0.9793293 0.9998174 -0.9790921 0.979329 0.9998174 -0.979092 0.9793286 0.9998174 -0.9790919 0.9793282 0.9998174 -0.9790917 0.9793277 0.9998174 -0.9790916 0.9793271 0.9998174 -0.9790916 0.9793265 0.9998174 -0.9790917 0.9793259 0.9998174 -0.9790921 0.9793255 0.9998174 -0.9790931 0.9793253 0.9998174 -0.9790946 0.9793253 0.9998174 -0.9790965 0.9793253 0.9998174 -0.9790988 0.9793253 0.9998174 -0.9791018 0.9793253 0.9998174 -0.9791055 0.9793253 0.9998174 -0.9791103 0.9793253 0.9998174 -0.9791163 0.9793253 0.9998174 -0.9791238 0.9793253 0.9998174 -0.9791334 0.9793253 0.9998174 -0.9791456 0.9793253 0.9998174 -0.979161 0.9793253 0.9998174 -0.9791804 0.9793253 0.9998174 -0.979205 0.9793253 0.9998174 -0.9792361 0.9793253 0.9998174 -0.9792755 0.9793253 0.9998174 -0.9793253 0.9793253 0.9998174 -0.9793883 0.9793253 0.9998174 -0.9794681 0.9793253 0.9998174 -0.9795689 0.9793253 0.9998174 -0.9796966 0.9793253 0.9998174 -0.979858 0.9793253 0.9998174 -0.9800622 0.9793253 0.9998174 -0.9803206 0.9793253 0.9998174 -0.9806476 0.9793253 0.9998174 -0.9810611 0.9793253 0.9998174 -0.9815844 0.9793253 0.9998174 -0.9822464 0.9793253 0.9998174 -0.9830838 0.9793253 0.9998174 -0.9841433 0.9793253 0.9998174 -0.9854838 0.9793253 0.9998174 -0.9871796 0.9793253 0.9998174 -0.989325 0.9793253 0.9998174 -0.9920392 0.9793253 0.9998174 -0.9954731 0.9793253 0.9998174 -0.9998174 0.9793253 0.9998174 -0.9998557 0.9835588 0.9964092 -0.999886 0.9869419 0.9949941 -0.9999099 0.9896392 0.9946818 -0.9999288 0.9917859 0.9949422 -0.9999437 0.9934919 0.9954668 -0.9790927 0.9793932 0.9998174 -0.9790927 0.9793932 0.9998174 -0.9790927 0.9793931 0.9998174 -0.9790926 0.979393 0.9998174 -0.9790925 0.9793929 0.9998174 -0.9790925 0.9793927 0.9998174 -0.9790924 0.9793925 0.9998174 -0.9790923 0.9793923 0.9998174 -0.9790921 0.979392 0.9998174 -0.979092 0.9793916 0.9998174 -0.9790919 0.9793912 0.9998174 -0.9790917 0.9793907 0.9998174 -0.9790916 0.9793901 0.9998174 -0.9790916 0.9793895 0.9998174 -0.9790917 0.9793889 0.9998174 -0.9790921 0.9793885 0.9998174 -0.9790931 0.9793883 0.9998174 -0.9790946 0.9793883 0.9998174 -0.9790965 0.9793883 0.9998174 -0.9790988 0.9793883 0.9998174 -0.9791018 0.9793883 0.9998174 -0.9791055 0.9793883 0.9998174 -0.9791103 0.9793883 0.9998174 -0.9791163 0.9793883 0.9998174 -0.9791238 0.9793883 0.9998174 -0.9791334 0.9793883 0.9998174 -0.9791456 0.9793883 0.9998174 -0.979161 0.9793883 0.9998174 -0.9791804 0.9793883 0.9998174 -0.979205 0.9793883 0.9998174 -0.9792361 0.9793883 0.9998174 -0.9792755 0.9793883 0.9998174 -0.9793253 0.9793883 0.9998174 -0.9793883 0.9793883 0.9998174 -0.9794681 0.9793883 0.9998174 -0.9795689 0.9793883 0.9998174 -0.9796966 0.9793883 0.9998174 -0.979858 0.9793883 0.9998174 -0.9800622 0.9793883 0.9998174 -0.9803206 0.9793883 0.9998174 -0.9806476 0.9793883 0.9998174 -0.9810611 0.9793883 0.9998174 -0.9815844 0.9793883 0.9998174 -0.9822464 0.9793883 0.9998174 -0.9830838 0.9793883 0.9998174 -0.9841433 0.9793883 0.9998174 -0.9854838 0.9793883 0.9998174 -0.9871796 0.9793883 0.9998174 -0.989325 0.9793883 0.9998174 -0.9920392 0.9793883 0.9998174 -0.9954731 0.9793883 0.9998174 -0.9998174 0.9793883 0.9998174 -0.9998557 0.9835983 0.9964092 -0.999886 0.9869667 0.9949941 -0.9999099 0.9896547 0.9946818 -0.9999288 0.9917956 0.9949422 -0.9999437 0.993498 0.9954668 -0.9790927 0.979473 0.9998174 -0.9790927 0.9794729 0.9998174 -0.9790927 0.9794728 0.9998174 -0.9790926 0.9794727 0.9998174 -0.9790925 0.9794726 0.9998174 -0.9790925 0.9794724 0.9998174 -0.9790924 0.9794722 0.9998174 -0.9790923 0.979472 0.9998174 -0.9790921 0.9794717 0.9998174 -0.979092 0.9794713 0.9998174 -0.9790919 0.9794709 0.9998174 -0.9790917 0.9794704 0.9998174 -0.9790916 0.9794699 0.9998174 -0.9790916 0.9794693 0.9998174 -0.9790917 0.9794687 0.9998174 -0.9790921 0.9794682 0.9998174 -0.9790931 0.9794681 0.9998174 -0.9790946 0.9794681 0.9998174 -0.9790965 0.9794681 0.9998174 -0.9790988 0.9794681 0.9998174 -0.9791018 0.9794681 0.9998174 -0.9791055 0.9794681 0.9998174 -0.9791103 0.9794681 0.9998174 -0.9791163 0.9794681 0.9998174 -0.9791238 0.9794681 0.9998174 -0.9791334 0.9794681 0.9998174 -0.9791456 0.9794681 0.9998174 -0.979161 0.9794681 0.9998174 -0.9791804 0.9794681 0.9998174 -0.979205 0.9794681 0.9998174 -0.9792361 0.9794681 0.9998174 -0.9792755 0.9794681 0.9998174 -0.9793253 0.9794681 0.9998174 -0.9793883 0.9794681 0.9998174 -0.9794681 0.9794681 0.9998174 -0.9795689 0.9794681 0.9998174 -0.9796966 0.9794681 0.9998174 -0.979858 0.9794681 0.9998174 -0.9800622 0.9794681 0.9998174 -0.9803206 0.9794681 0.9998174 -0.9806476 0.9794681 0.9998174 -0.9810611 0.9794681 0.9998174 -0.9815844 0.9794681 0.9998174 -0.9822464 0.9794681 0.9998174 -0.9830838 0.9794681 0.9998174 -0.9841433 0.9794681 0.9998174 -0.9854838 0.9794681 0.9998174 -0.9871796 0.9794681 0.9998174 -0.989325 0.9794681 0.9998174 -0.9920392 0.9794681 0.9998174 -0.9954731 0.9794681 0.9998174 -0.9998174 0.9794681 0.9998174 -0.9998557 0.9836483 0.9964092 -0.999886 0.986998 0.9949941 -0.9999099 0.9896744 0.9946818 -0.9999288 0.9918079 0.9949422 -0.9999437 0.9935057 0.9954668 -0.9790927 0.9795738 0.9998174 -0.9790927 0.9795737 0.9998174 -0.9790927 0.9795737 0.9998174 -0.9790926 0.9795736 0.9998174 -0.9790925 0.9795734 0.9998174 -0.9790925 0.9795733 0.9998174 -0.9790924 0.9795731 0.9998174 -0.9790923 0.9795728 0.9998174 -0.9790921 0.9795725 0.9998174 -0.979092 0.9795722 0.9998174 -0.9790919 0.9795718 0.9998174 -0.9790917 0.9795713 0.9998174 -0.9790916 0.9795707 0.9998174 -0.9790916 0.9795701 0.9998174 -0.9790917 0.9795695 0.9998174 -0.9790921 0.9795691 0.9998174 -0.9790931 0.9795689 0.9998174 -0.9790946 0.9795689 0.9998174 -0.9790965 0.9795689 0.9998174 -0.9790988 0.9795689 0.9998174 -0.9791018 0.9795689 0.9998174 -0.9791055 0.9795689 0.9998174 -0.9791103 0.9795689 0.9998174 -0.9791163 0.9795689 0.9998174 -0.9791238 0.9795689 0.9998174 -0.9791334 0.9795689 0.9998174 -0.9791456 0.9795689 0.9998174 -0.979161 0.9795689 0.9998174 -0.9791804 0.9795689 0.9998174 -0.979205 0.9795689 0.9998174 -0.9792361 0.9795689 0.9998174 -0.9792755 0.9795689 0.9998174 -0.9793253 0.9795689 0.9998174 -0.9793883 0.9795689 0.9998174 -0.9794681 0.9795689 0.9998174 -0.9795689 0.9795689 0.9998174 -0.9796966 0.9795689 0.9998174 -0.979858 0.9795689 0.9998174 -0.9800622 0.9795689 0.9998174 -0.9803206 0.9795689 0.9998174 -0.9806476 0.9795689 0.9998174 -0.9810611 0.9795689 0.9998174 -0.9815844 0.9795689 0.9998174 -0.9822464 0.9795689 0.9998174 -0.9830838 0.9795689 0.9998174 -0.9841433 0.9795689 0.9998174 -0.9854838 0.9795689 0.9998174 -0.9871796 0.9795689 0.9998174 -0.989325 0.9795689 0.9998174 -0.9920392 0.9795689 0.9998174 -0.9954731 0.9795689 0.9998174 -0.9998174 0.9795689 0.9998174 -0.9998557 0.9837116 0.9964092 -0.999886 0.9870376 0.9949941 -0.9999099 0.9896992 0.9946818 -0.9999288 0.9918234 0.9949422 -0.9999437 0.9935154 0.9954668 -0.9790927 0.9797014 0.9998174 -0.9790927 0.9797013 0.9998174 -0.9790927 0.9797012 0.9998174 -0.9790926 0.9797011 0.9998174 -0.9790925 0.979701 0.9998174 -0.9790925 0.9797009 0.9998174 -0.9790924 0.9797007 0.9998174 -0.9790923 0.9797004 0.9998174 -0.9790921 0.9797001 0.9998174 -0.979092 0.9796998 0.9998174 -0.9790919 0.9796994 0.9998174 -0.9790917 0.9796989 0.9998174 -0.9790916 0.9796983 0.9998174 -0.9790916 0.9796977 0.9998174 -0.9790917 0.9796971 0.9998174 -0.9790921 0.9796967 0.9998174 -0.9790931 0.9796966 0.9998174 -0.9790946 0.9796966 0.9998174 -0.9790965 0.9796966 0.9998174 -0.9790988 0.9796966 0.9998174 -0.9791018 0.9796966 0.9998174 -0.9791055 0.9796966 0.9998174 -0.9791103 0.9796966 0.9998174 -0.9791163 0.9796966 0.9998174 -0.9791238 0.9796966 0.9998174 -0.9791334 0.9796966 0.9998174 -0.9791456 0.9796966 0.9998174 -0.979161 0.9796966 0.9998174 -0.9791804 0.9796966 0.9998174 -0.979205 0.9796966 0.9998174 -0.9792361 0.9796966 0.9998174 -0.9792755 0.9796966 0.9998174 -0.9793253 0.9796966 0.9998174 -0.9793883 0.9796966 0.9998174 -0.9794681 0.9796966 0.9998174 -0.9795689 0.9796966 0.9998174 -0.9796966 0.9796966 0.9998174 -0.979858 0.9796966 0.9998174 -0.9800622 0.9796966 0.9998174 -0.9803206 0.9796966 0.9998174 -0.9806476 0.9796966 0.9998174 -0.9810611 0.9796966 0.9998174 -0.9815844 0.9796966 0.9998174 -0.9822464 0.9796966 0.9998174 -0.9830838 0.9796966 0.9998174 -0.9841433 0.9796966 0.9998174 -0.9854838 0.9796966 0.9998174 -0.9871796 0.9796966 0.9998174 -0.989325 0.9796966 0.9998174 -0.9920392 0.9796966 0.9998174 -0.9954731 0.9796966 0.9998174 -0.9998174 0.9796966 0.9998174 -0.9998557 0.9837916 0.9964092 -0.999886 0.9870878 0.9949941 -0.9999099 0.9897306 0.9946818 -0.9999288 0.9918431 0.9949422 -0.9999437 0.9935277 0.9954668 -0.9790927 0.9798628 0.9998174 -0.9790927 0.9798627 0.9998174 -0.9790927 0.9798626 0.9998174 -0.9790926 0.9798625 0.9998174 -0.9790925 0.9798624 0.9998174 -0.9790925 0.9798623 0.9998174 -0.9790924 0.9798621 0.9998174 -0.9790923 0.9798618 0.9998174 -0.9790921 0.9798615 0.9998174 -0.979092 0.9798612 0.9998174 -0.9790919 0.9798608 0.9998174 -0.9790917 0.9798603 0.9998174 -0.9790916 0.9798597 0.9998174 -0.9790916 0.9798592 0.9998174 -0.9790917 0.9798586 0.9998174 -0.9790921 0.9798581 0.9998174 -0.9790931 0.979858 0.9998174 -0.9790946 0.979858 0.9998174 -0.9790965 0.979858 0.9998174 -0.9790988 0.979858 0.9998174 -0.9791018 0.979858 0.9998174 -0.9791055 0.979858 0.9998174 -0.9791103 0.979858 0.9998174 -0.9791163 0.979858 0.9998174 -0.9791238 0.979858 0.9998174 -0.9791334 0.979858 0.9998174 -0.9791456 0.979858 0.9998174 -0.979161 0.979858 0.9998174 -0.9791804 0.979858 0.9998174 -0.979205 0.979858 0.9998174 -0.9792361 0.979858 0.9998174 -0.9792755 0.979858 0.9998174 -0.9793253 0.979858 0.9998174 -0.9793883 0.979858 0.9998174 -0.9794681 0.979858 0.9998174 -0.9795689 0.979858 0.9998174 -0.9796966 0.979858 0.9998174 -0.979858 0.979858 0.9998174 -0.9800622 0.979858 0.9998174 -0.9803206 0.979858 0.9998174 -0.9806476 0.979858 0.9998174 -0.9810611 0.979858 0.9998174 -0.9815844 0.979858 0.9998174 -0.9822464 0.979858 0.9998174 -0.9830838 0.979858 0.9998174 -0.9841433 0.979858 0.9998174 -0.9854838 0.979858 0.9998174 -0.9871796 0.979858 0.9998174 -0.989325 0.979858 0.9998174 -0.9920392 0.979858 0.9998174 -0.9954731 0.979858 0.9998174 -0.9998174 0.979858 0.9998174 -0.9998557 0.9838928 0.9964092 -0.999886 0.9871512 0.9949941 -0.9999099 0.9897703 0.9946818 -0.9999288 0.991868 0.9949422 -0.9999437 0.9935432 0.9954668 -0.9790927 0.980067 0.9998174 -0.9790927 0.9800669 0.9998174 -0.9790927 0.9800668 0.9998174 -0.9790926 0.9800667 0.9998174 -0.9790925 0.9800666 0.9998174 -0.9790925 0.9800665 0.9998174 -0.9790924 0.9800663 0.9998174 -0.9790923 0.980066 0.9998174 -0.9790921 0.9800658 0.9998174 -0.979092 0.9800654 0.9998174 -0.9790919 0.980065 0.9998174 -0.9790917 0.9800645 0.9998174 -0.9790916 0.980064 0.9998174 -0.9790916 0.9800634 0.9998174 -0.9790917 0.9800628 0.9998174 -0.9790921 0.9800624 0.9998174 -0.9790931 0.9800622 0.9998174 -0.9790946 0.9800622 0.9998174 -0.9790965 0.9800622 0.9998174 -0.9790988 0.9800622 0.9998174 -0.9791018 0.9800622 0.9998174 -0.9791055 0.9800622 0.9998174 -0.9791103 0.9800622 0.9998174 -0.9791163 0.9800622 0.9998174 -0.9791238 0.9800622 0.9998174 -0.9791334 0.9800622 0.9998174 -0.9791456 0.9800622 0.9998174 -0.979161 0.9800622 0.9998174 -0.9791804 0.9800622 0.9998174 -0.979205 0.9800622 0.9998174 -0.9792361 0.9800622 0.9998174 -0.9792755 0.9800622 0.9998174 -0.9793253 0.9800622 0.9998174 -0.9793883 0.9800622 0.9998174 -0.9794681 0.9800622 0.9998174 -0.9795689 0.9800622 0.9998174 -0.9796966 0.9800622 0.9998174 -0.979858 0.9800622 0.9998174 -0.9800622 0.9800622 0.9998174 -0.9803206 0.9800622 0.9998174 -0.9806476 0.9800622 0.9998174 -0.9810611 0.9800622 0.9998174 -0.9815844 0.9800622 0.9998174 -0.9822464 0.9800622 0.9998174 -0.9830838 0.9800622 0.9998174 -0.9841433 0.9800622 0.9998174 -0.9854838 0.9800622 0.9998174 -0.9871796 0.9800622 0.9998174 -0.989325 0.9800622 0.9998174 -0.9920392 0.9800622 0.9998174 -0.9954731 0.9800622 0.9998174 -0.9998174 0.9800622 0.9998174 -0.9998557 0.9840209 0.9964092 -0.999886 0.9872315 0.9949941 -0.9999099 0.9898206 0.9946818 -0.9999288 0.9918994 0.9949422 -0.9999437 0.9935629 0.9954668 -0.9790927 0.9803253 0.9998174 -0.9790927 0.9803253 0.9998174 -0.9790927 0.9803252 0.9998174 -0.9790926 0.9803251 0.9998174 -0.9790925 0.980325 0.9998174 -0.9790925 0.9803248 0.9998174 -0.9790924 0.9803246 0.9998174 -0.9790923 0.9803244 0.9998174 -0.9790921 0.9803241 0.9998174 -0.979092 0.9803238 0.9998174 -0.9790919 0.9803234 0.9998174 -0.9790917 0.9803229 0.9998174 -0.9790916 0.9803224 0.9998174 -0.9790916 0.9803218 0.9998174 -0.9790917 0.9803212 0.9998174 -0.9790921 0.9803208 0.9998174 -0.9790931 0.9803206 0.9998174 -0.9790946 0.9803206 0.9998174 -0.9790965 0.9803206 0.9998174 -0.9790988 0.9803206 0.9998174 -0.9791018 0.9803206 0.9998174 -0.9791055 0.9803206 0.9998174 -0.9791103 0.9803206 0.9998174 -0.9791163 0.9803206 0.9998174 -0.9791238 0.9803206 0.9998174 -0.9791334 0.9803206 0.9998174 -0.9791456 0.9803206 0.9998174 -0.979161 0.9803206 0.9998174 -0.9791804 0.9803206 0.9998174 -0.979205 0.9803206 0.9998174 -0.9792361 0.9803206 0.9998174 -0.9792755 0.9803206 0.9998174 -0.9793253 0.9803206 0.9998174 -0.9793883 0.9803206 0.9998174 -0.9794681 0.9803206 0.9998174 -0.9795689 0.9803206 0.9998174 -0.9796966 0.9803206 0.9998174 -0.979858 0.9803206 0.9998174 -0.9800622 0.9803206 0.9998174 -0.9803206 0.9803206 0.9998174 -0.9806476 0.9803206 0.9998174 -0.9810611 0.9803206 0.9998174 -0.9815844 0.9803206 0.9998174 -0.9822464 0.9803206 0.9998174 -0.9830838 0.9803206 0.9998174 -0.9841433 0.9803206 0.9998174 -0.9854838 0.9803206 0.9998174 -0.9871796 0.9803206 0.9998174 -0.989325 0.9803206 0.9998174 -0.9920392 0.9803206 0.9998174 -0.9954731 0.9803206 0.9998174 -0.9998174 0.9803206 0.9998174 -0.9998557 0.9841829 0.9964092 -0.999886 0.987333 0.9949941 -0.9999099 0.9898842 0.9946818 -0.9999288 0.9919392 0.9949422 -0.9999437 0.9935878 0.9954668 -0.9790927 0.9806522 0.9998174 -0.9790927 0.9806521 0.9998174 -0.9790927 0.980652 0.9998174 -0.9790926 0.9806519 0.9998174 -0.9790925 0.9806518 0.9998174 -0.9790925 0.9806517 0.9998174 -0.9790924 0.9806515 0.9998174 -0.9790923 0.9806512 0.9998174 -0.9790921 0.980651 0.9998174 -0.979092 0.9806506 0.9998174 -0.9790919 0.9806502 0.9998174 -0.9790917 0.9806498 0.9998174 -0.9790916 0.9806492 0.9998174 -0.9790916 0.9806487 0.9998174 -0.9790917 0.9806481 0.9998174 -0.9790921 0.9806477 0.9998174 -0.9790931 0.9806476 0.9998174 -0.9790946 0.9806476 0.9998174 -0.9790965 0.9806476 0.9998174 -0.9790988 0.9806476 0.9998174 -0.9791018 0.9806476 0.9998174 -0.9791055 0.9806476 0.9998174 -0.9791103 0.9806476 0.9998174 -0.9791163 0.9806476 0.9998174 -0.9791238 0.9806476 0.9998174 -0.9791334 0.9806476 0.9998174 -0.9791456 0.9806476 0.9998174 -0.979161 0.9806476 0.9998174 -0.9791804 0.9806476 0.9998174 -0.979205 0.9806476 0.9998174 -0.9792361 0.9806476 0.9998174 -0.9792755 0.9806476 0.9998174 -0.9793253 0.9806476 0.9998174 -0.9793883 0.9806476 0.9998174 -0.9794681 0.9806476 0.9998174 -0.9795689 0.9806476 0.9998174 -0.9796966 0.9806476 0.9998174 -0.979858 0.9806476 0.9998174 -0.9800622 0.9806476 0.9998174 -0.9803206 0.9806476 0.9998174 -0.9806476 0.9806476 0.9998174 -0.9810611 0.9806476 0.9998174 -0.9815844 0.9806476 0.9998174 -0.9822464 0.9806476 0.9998174 -0.9830838 0.9806476 0.9998174 -0.9841433 0.9806476 0.9998174 -0.9854838 0.9806476 0.9998174 -0.9871796 0.9806476 0.9998174 -0.989325 0.9806476 0.9998174 -0.9920392 0.9806476 0.9998174 -0.9954731 0.9806476 0.9998174 -0.9998174 0.9806476 0.9998174 -0.9998557 0.984388 0.9964092 -0.999886 0.9874615 0.9949941 -0.9999099 0.9899646 0.9946818 -0.9999288 0.9919896 0.9949422 -0.9999437 0.9936193 0.9954668 -0.9790927 0.9810656 0.9998174 -0.9790927 0.9810656 0.9998174 -0.9790927 0.9810655 0.9998174 -0.9790926 0.9810654 0.9998174 -0.9790925 0.9810653 0.9998174 -0.9790925 0.9810652 0.9998174 -0.9790924 0.981065 0.9998174 -0.9790923 0.9810648 0.9998174 -0.9790921 0.9810645 0.9998174 -0.979092 0.9810642 0.9998174 -0.9790919 0.9810638 0.9998174 -0.9790917 0.9810633 0.9998174 -0.9790916 0.9810628 0.9998174 -0.9790916 0.9810622 0.9998174 -0.9790917 0.9810617 0.9998174 -0.9790921 0.9810613 0.9998174 -0.9790931 0.9810611 0.9998174 -0.9790946 0.9810611 0.9998174 -0.9790965 0.9810611 0.9998174 -0.9790988 0.9810611 0.9998174 -0.9791018 0.9810611 0.9998174 -0.9791055 0.9810611 0.9998174 -0.9791103 0.9810611 0.9998174 -0.9791163 0.9810611 0.9998174 -0.9791238 0.9810611 0.9998174 -0.9791334 0.9810611 0.9998174 -0.9791456 0.9810611 0.9998174 -0.979161 0.9810611 0.9998174 -0.9791804 0.9810611 0.9998174 -0.979205 0.9810611 0.9998174 -0.9792361 0.9810611 0.9998174 -0.9792755 0.9810611 0.9998174 -0.9793253 0.9810611 0.9998174 -0.9793883 0.9810611 0.9998174 -0.9794681 0.9810611 0.9998174 -0.9795689 0.9810611 0.9998174 -0.9796966 0.9810611 0.9998174 -0.979858 0.9810611 0.9998174 -0.9800622 0.9810611 0.9998174 -0.9803206 0.9810611 0.9998174 -0.9806476 0.9810611 0.9998174 -0.9810611 0.9810611 0.9998174 -0.9815844 0.9810611 0.9998174 -0.9822464 0.9810611 0.9998174 -0.9830838 0.9810611 0.9998174 -0.9841433 0.9810611 0.9998174 -0.9854838 0.9810611 0.9998174 -0.9871796 0.9810611 0.9998174 -0.989325 0.9810611 0.9998174 -0.9920392 0.9810611 0.9998174 -0.9954731 0.9810611 0.9998174 -0.9998174 0.9810611 0.9998174 -0.9998557 0.9846473 0.9964092 -0.999886 0.987624 0.9949941 -0.9999099 0.9900664 0.9946818 -0.9999288 0.9920533 0.9949422 -0.9999437 0.9936592 0.9954668 -0.9790927 0.9815888 0.9998174 -0.9790927 0.9815887 0.9998174 -0.9790927 0.9815886 0.9998174 -0.9790926 0.9815885 0.9998174 -0.9790925 0.9815884 0.9998174 -0.9790925 0.9815883 0.9998174 -0.9790924 0.9815881 0.9998174 -0.9790923 0.9815879 0.9998174 -0.9790921 0.9815876 0.9998174 -0.979092 0.9815873 0.9998174 -0.9790919 0.9815869 0.9998174 -0.9790917 0.9815865 0.9998174 -0.9790916 0.981586 0.9998174 -0.9790916 0.9815855 0.9998174 -0.9790917 0.9815849 0.9998174 -0.9790921 0.9815845 0.9998174 -0.9790931 0.9815844 0.9998174 -0.9790946 0.9815844 0.9998174 -0.9790965 0.9815844 0.9998174 -0.9790988 0.9815844 0.9998174 -0.9791018 0.9815844 0.9998174 -0.9791055 0.9815844 0.9998174 -0.9791103 0.9815844 0.9998174 -0.9791163 0.9815844 0.9998174 -0.9791238 0.9815844 0.9998174 -0.9791334 0.9815844 0.9998174 -0.9791456 0.9815844 0.9998174 -0.979161 0.9815844 0.9998174 -0.9791804 0.9815844 0.9998174 -0.979205 0.9815844 0.9998174 -0.9792361 0.9815844 0.9998174 -0.9792755 0.9815844 0.9998174 -0.9793253 0.9815844 0.9998174 -0.9793883 0.9815844 0.9998174 -0.9794681 0.9815844 0.9998174 -0.9795689 0.9815844 0.9998174 -0.9796966 0.9815844 0.9998174 -0.979858 0.9815844 0.9998174 -0.9800622 0.9815844 0.9998174 -0.9803206 0.9815844 0.9998174 -0.9806476 0.9815844 0.9998174 -0.9810611 0.9815844 0.9998174 -0.9815844 0.9815844 0.9998174 -0.9822464 0.9815844 0.9998174 -0.9830838 0.9815844 0.9998174 -0.9841433 0.9815844 0.9998174 -0.9854838 0.9815844 0.9998174 -0.9871796 0.9815844 0.9998174 -0.989325 0.9815844 0.9998174 -0.9920392 0.9815844 0.9998174 -0.9954731 0.9815844 0.9998174 -0.9998174 0.9815844 0.9998174 -0.9998557 0.9849754 0.9964092 -0.999886 0.9878296 0.9949941 -0.9999099 0.9901951 0.9946818 -0.9999288 0.9921339 0.9949422 -0.9999437 0.9937096 0.9954668 -0.9790927 0.9822506 0.9998174 -0.9790927 0.9822505 0.9998174 -0.9790927 0.9822504 0.9998174 -0.9790926 0.9822504 0.9998174 -0.9790925 0.9822502 0.9998174 -0.9790925 0.9822501 0.9998174 -0.9790924 0.9822499 0.9998174 -0.9790923 0.9822497 0.9998174 -0.9790921 0.9822495 0.9998174 -0.979092 0.9822492 0.9998174 -0.9790919 0.9822488 0.9998174 -0.9790917 0.9822484 0.9998174 -0.9790916 0.9822479 0.9998174 -0.9790916 0.9822474 0.9998174 -0.9790917 0.9822469 0.9998174 -0.9790921 0.9822465 0.9998174 -0.9790931 0.9822464 0.9998174 -0.9790946 0.9822464 0.9998174 -0.9790965 0.9822464 0.9998174 -0.9790988 0.9822464 0.9998174 -0.9791018 0.9822464 0.9998174 -0.9791055 0.9822464 0.9998174 -0.9791103 0.9822464 0.9998174 -0.9791163 0.9822464 0.9998174 -0.9791238 0.9822464 0.9998174 -0.9791334 0.9822464 0.9998174 -0.9791456 0.9822464 0.9998174 -0.979161 0.9822464 0.9998174 -0.9791804 0.9822464 0.9998174 -0.979205 0.9822464 0.9998174 -0.9792361 0.9822464 0.9998174 -0.9792755 0.9822464 0.9998174 -0.9793253 0.9822464 0.9998174 -0.9793883 0.9822464 0.9998174 -0.9794681 0.9822464 0.9998174 -0.9795689 0.9822464 0.9998174 -0.9796966 0.9822464 0.9998174 -0.979858 0.9822464 0.9998174 -0.9800622 0.9822464 0.9998174 -0.9803206 0.9822464 0.9998174 -0.9806476 0.9822464 0.9998174 -0.9810611 0.9822464 0.9998174 -0.9815844 0.9822464 0.9998174 -0.9822464 0.9822464 0.9998174 -0.9830838 0.9822464 0.9998174 -0.9841433 0.9822464 0.9998174 -0.9854838 0.9822464 0.9998174 -0.9871796 0.9822464 0.9998174 -0.989325 0.9822464 0.9998174 -0.9920392 0.9822464 0.9998174 -0.9954731 0.9822464 0.9998174 -0.9998174 0.9822464 0.9998174 -0.9998557 0.9853905 0.9964092 -0.999886 0.9880897 0.9949941 -0.9999099 0.990358 0.9946818 -0.9999288 0.9922358 0.9949422 -0.9999437 0.9937734 0.9954668 -0.9790927 0.9830878 0.9998174 -0.9790927 0.9830878 0.9998174 -0.9790927 0.9830877 0.9998174 -0.9790926 0.9830876 0.9998174 -0.9790925 0.9830875 0.9998174 -0.9790925 0.9830874 0.9998174 -0.9790924 0.9830872 0.9998174 -0.9790923 0.983087 0.9998174 -0.9790921 0.9830868 0.9998174 -0.979092 0.9830865 0.9998174 -0.9790919 0.9830862 0.9998174 -0.9790917 0.9830858 0.9998174 -0.9790916 0.9830853 0.9998174 -0.9790916 0.9830848 0.9998174 -0.9790917 0.9830843 0.9998174 -0.9790921 0.9830839 0.9998174 -0.9790931 0.9830838 0.9998174 -0.9790946 0.9830838 0.9998174 -0.9790965 0.9830838 0.9998174 -0.9790988 0.9830838 0.9998174 -0.9791018 0.9830838 0.9998174 -0.9791055 0.9830838 0.9998174 -0.9791103 0.9830838 0.9998174 -0.9791163 0.9830838 0.9998174 -0.9791238 0.9830838 0.9998174 -0.9791334 0.9830838 0.9998174 -0.9791456 0.9830838 0.9998174 -0.979161 0.9830838 0.9998174 -0.9791804 0.9830838 0.9998174 -0.979205 0.9830838 0.9998174 -0.9792361 0.9830838 0.9998174 -0.9792755 0.9830838 0.9998174 -0.9793253 0.9830838 0.9998174 -0.9793883 0.9830838 0.9998174 -0.9794681 0.9830838 0.9998174 -0.9795689 0.9830838 0.9998174 -0.9796966 0.9830838 0.9998174 -0.979858 0.9830838 0.9998174 -0.9800622 0.9830838 0.9998174 -0.9803206 0.9830838 0.9998174 -0.9806476 0.9830838 0.9998174 -0.9810611 0.9830838 0.9998174 -0.9815844 0.9830838 0.9998174 -0.9822464 0.9830838 0.9998174 -0.9830838 0.9830838 0.9998174 -0.9841433 0.9830838 0.9998174 -0.9854838 0.9830838 0.9998174 -0.9871796 0.9830838 0.9998174 -0.989325 0.9830838 0.9998174 -0.9920392 0.9830838 0.9998174 -0.9954731 0.9830838 0.9998174 -0.9998174 0.9830838 0.9998174 -0.9998557 0.9859157 0.9964092 -0.999886 0.9884188 0.9949941 -0.9999099 0.9905641 0.9946818 -0.9999288 0.9923648 0.9949422 -0.9999437 0.9938541 0.9954668 -0.9790927 0.9841471 0.9998174 -0.9790927 0.9841471 0.9998174 -0.9790927 0.984147 0.9998174 -0.9790926 0.9841469 0.9998174 -0.9790925 0.9841468 0.9998174 -0.9790925 0.9841467 0.9998174 -0.9790924 0.9841465 0.9998174 -0.9790923 0.9841464 0.9998174 -0.9790921 0.9841461 0.9998174 -0.979092 0.9841459 0.9998174 -0.9790919 0.9841455 0.9998174 -0.9790917 0.9841451 0.9998174 -0.9790916 0.9841447 0.9998174 -0.9790916 0.9841443 0.9998174 -0.9790917 0.9841438 0.9998174 -0.9790921 0.9841435 0.9998174 -0.9790931 0.9841433 0.9998174 -0.9790946 0.9841433 0.9998174 -0.9790965 0.9841433 0.9998174 -0.9790988 0.9841433 0.9998174 -0.9791018 0.9841433 0.9998174 -0.9791055 0.9841433 0.9998174 -0.9791103 0.9841433 0.9998174 -0.9791163 0.9841433 0.9998174 -0.9791238 0.9841433 0.9998174 -0.9791334 0.9841433 0.9998174 -0.9791456 0.9841433 0.9998174 -0.979161 0.9841433 0.9998174 -0.9791804 0.9841433 0.9998174 -0.979205 0.9841433 0.9998174 -0.9792361 0.9841433 0.9998174 -0.9792755 0.9841433 0.9998174 -0.9793253 0.9841433 0.9998174 -0.9793883 0.9841433 0.9998174 -0.9794681 0.9841433 0.9998174 -0.9795689 0.9841433 0.9998174 -0.9796966 0.9841433 0.9998174 -0.979858 0.9841433 0.9998174 -0.9800622 0.9841433 0.9998174 -0.9803206 0.9841433 0.9998174 -0.9806476 0.9841433 0.9998174 -0.9810611 0.9841433 0.9998174 -0.9815844 0.9841433 0.9998174 -0.9822464 0.9841433 0.9998174 -0.9830838 0.9841433 0.9998174 -0.9841433 0.9841433 0.9998174 -0.9854838 0.9841433 0.9998174 -0.9871796 0.9841433 0.9998174 -0.989325 0.9841433 0.9998174 -0.9920392 0.9841433 0.9998174 -0.9954731 0.9841433 0.9998174 -0.9998174 0.9841433 0.9998174 -0.9998557 0.9865801 0.9964092 -0.999886 0.9888351 0.9949941 -0.9999099 0.9908248 0.9946818 -0.9999288 0.992528 0.9949422 -0.9999437 0.9939562 0.9954668 -0.9790927 0.9854872 0.9998174 -0.9790927 0.9854872 0.9998174 -0.9790927 0.9854871 0.9998174 -0.9790926 0.985487 0.9998174 -0.9790925 0.9854869 0.9998174 -0.9790925 0.9854868 0.9998174 -0.9790924 0.9854867 0.9998174 -0.9790923 0.9854865 0.9998174 -0.9790921 0.9854863 0.9998174 -0.979092 0.9854861 0.9998174 -0.9790919 0.9854858 0.9998174 -0.9790917 0.9854854 0.9998174 -0.9790916 0.985485 0.9998174 -0.9790916 0.9854846 0.9998174 -0.9790917 0.9854842 0.9998174 -0.9790921 0.9854839 0.9998174 -0.9790931 0.9854838 0.9998174 -0.9790946 0.9854838 0.9998174 -0.9790965 0.9854838 0.9998174 -0.9790988 0.9854838 0.9998174 -0.9791018 0.9854838 0.9998174 -0.9791055 0.9854838 0.9998174 -0.9791103 0.9854838 0.9998174 -0.9791163 0.9854838 0.9998174 -0.9791238 0.9854838 0.9998174 -0.9791334 0.9854838 0.9998174 -0.9791456 0.9854838 0.9998174 -0.979161 0.9854838 0.9998174 -0.9791804 0.9854838 0.9998174 -0.979205 0.9854838 0.9998174 -0.9792361 0.9854838 0.9998174 -0.9792755 0.9854838 0.9998174 -0.9793253 0.9854838 0.9998174 -0.9793883 0.9854838 0.9998174 -0.9794681 0.9854838 0.9998174 -0.9795689 0.9854838 0.9998174 -0.9796966 0.9854838 0.9998174 -0.979858 0.9854838 0.9998174 -0.9800622 0.9854838 0.9998174 -0.9803206 0.9854838 0.9998174 -0.9806476 0.9854838 0.9998174 -0.9810611 0.9854838 0.9998174 -0.9815844 0.9854838 0.9998174 -0.9822464 0.9854838 0.9998174 -0.9830838 0.9854838 0.9998174 -0.9841433 0.9854838 0.9998174 -0.9854838 0.9854838 0.9998174 -0.9871796 0.9854838 0.9998174 -0.989325 0.9854838 0.9998174 -0.9920392 0.9854838 0.9998174 -0.9954731 0.9854838 0.9998174 -0.9998174 0.9854838 0.9998174 -0.9998557 0.9874207 0.9964092 -0.999886 0.9893618 0.9949941 -0.9999099 0.9911547 0.9946818 -0.9999288 0.9927345 0.9949422 -0.9999437 0.9940854 0.9954668 -0.9790927 0.9871826 0.9998174 -0.9790927 0.9871826 0.9998174 -0.9790927 0.9871825 0.9998174 -0.9790926 0.9871825 0.9998174 -0.9790925 0.9871824 0.9998174 -0.9790925 0.9871823 0.9998174 -0.9790924 0.9871822 0.9998174 -0.9790923 0.987182 0.9998174 -0.9790921 0.9871818 0.9998174 -0.979092 0.9871816 0.9998174 -0.9790919 0.9871813 0.9998174 -0.9790917 0.987181 0.9998174 -0.9790916 0.9871807 0.9998174 -0.9790916 0.9871803 0.9998174 -0.9790917 0.98718 0.9998174 -0.9790921 0.9871797 0.9998174 -0.9790931 0.9871796 0.9998174 -0.9790946 0.9871796 0.9998174 -0.9790965 0.9871796 0.9998174 -0.9790988 0.9871796 0.9998174 -0.9791018 0.9871796 0.9998174 -0.9791055 0.9871796 0.9998174 -0.9791103 0.9871796 0.9998174 -0.9791163 0.9871796 0.9998174 -0.9791238 0.9871796 0.9998174 -0.9791334 0.9871796 0.9998174 -0.9791456 0.9871796 0.9998174 -0.979161 0.9871796 0.9998174 -0.9791804 0.9871796 0.9998174 -0.979205 0.9871796 0.9998174 -0.9792361 0.9871796 0.9998174 -0.9792755 0.9871796 0.9998174 -0.9793253 0.9871796 0.9998174 -0.9793883 0.9871796 0.9998174 -0.9794681 0.9871796 0.9998174 -0.9795689 0.9871796 0.9998174 -0.9796966 0.9871796 0.9998174 -0.979858 0.9871796 0.9998174 -0.9800622 0.9871796 0.9998174 -0.9803206 0.9871796 0.9998174 -0.9806476 0.9871796 0.9998174 -0.9810611 0.9871796 0.9998174 -0.9815844 0.9871796 0.9998174 -0.9822464 0.9871796 0.9998174 -0.9830838 0.9871796 0.9998174 -0.9841433 0.9871796 0.9998174 -0.9854838 0.9871796 0.9998174 -0.9871796 0.9871796 0.9998174 -0.989325 0.9871796 0.9998174 -0.9920392 0.9871796 0.9998174 -0.9954731 0.9871796 0.9998174 -0.9998174 0.9871796 0.9998174 -0.9998557 0.9884841 0.9964092 -0.999886 0.9900282 0.9949941 -0.9999099 0.991572 0.9946818 -0.9999288 0.9929957 0.9949422 -0.9999437 0.9942488 0.9954668 -0.9790927 0.9893275 0.9998174 -0.9790927 0.9893275 0.9998174 -0.9790927 0.9893274 0.9998174 -0.9790926 0.9893274 0.9998174 -0.9790925 0.9893273 0.9998174 -0.9790925 0.9893272 0.9998174 -0.9790924 0.9893271 0.9998174 -0.9790923 0.989327 0.9998174 -0.9790921 0.9893269 0.9998174 -0.979092 0.9893267 0.9998174 -0.9790919 0.9893265 0.9998174 -0.9790917 0.9893262 0.9998174 -0.9790916 0.9893259 0.9998174 -0.9790916 0.9893256 0.9998174 -0.9790917 0.9893253 0.9998174 -0.9790921 0.9893251 0.9998174 -0.9790931 0.989325 0.9998174 -0.9790946 0.989325 0.9998174 -0.9790965 0.989325 0.9998174 -0.9790988 0.989325 0.9998174 -0.9791018 0.989325 0.9998174 -0.9791055 0.989325 0.9998174 -0.9791103 0.989325 0.9998174 -0.9791163 0.989325 0.9998174 -0.9791238 0.989325 0.9998174 -0.9791334 0.989325 0.9998174 -0.9791456 0.989325 0.9998174 -0.979161 0.989325 0.9998174 -0.9791804 0.989325 0.9998174 -0.979205 0.989325 0.9998174 -0.9792361 0.989325 0.9998174 -0.9792755 0.989325 0.9998174 -0.9793253 0.989325 0.9998174 -0.9793883 0.989325 0.9998174 -0.9794681 0.989325 0.9998174 -0.9795689 0.989325 0.9998174 -0.9796966 0.989325 0.9998174 -0.979858 0.989325 0.9998174 -0.9800622 0.989325 0.9998174 -0.9803206 0.989325 0.9998174 -0.9806476 0.989325 0.9998174 -0.9810611 0.989325 0.9998174 -0.9815844 0.989325 0.9998174 -0.9822464 0.989325 0.9998174 -0.9830838 0.989325 0.9998174 -0.9841433 0.989325 0.9998174 -0.9854838 0.989325 0.9998174 -0.9871796 0.989325 0.9998174 -0.989325 0.989325 0.9998174 -0.9920392 0.989325 0.9998174 -0.9954731 0.989325 0.9998174 -0.9998174 0.989325 0.9998174 -0.9998557 0.9898295 0.9964092 -0.999886 0.9908712 0.9949941 -0.9999099 0.9920999 0.9946818 -0.9999288 0.9933261 0.9949422 -0.9999437 0.9944556 0.9954668 -0.9790927 0.9920411 0.9998174 -0.9790927 0.9920411 0.9998174 -0.9790927 0.9920411 0.9998174 -0.9790926 0.992041 0.9998174 -0.9790925 0.992041 0.9998174 -0.9790925 0.9920409 0.9998174 -0.9790924 0.9920408 0.9998174 -0.9790923 0.9920407 0.9998174 -0.9790921 0.9920406 0.9998174 -0.979092 0.9920405 0.9998174 -0.9790919 0.9920403 0.9998174 -0.9790917 0.9920401 0.9998174 -0.9790916 0.9920399 0.9998174 -0.9790916 0.9920397 0.9998174 -0.9790917 0.9920395 0.9998174 -0.9790921 0.9920393 0.9998174 -0.9790931 0.9920392 0.9998174 -0.9790946 0.9920392 0.9998174 -0.9790965 0.9920392 0.9998174 -0.9790988 0.9920392 0.9998174 -0.9791018 0.9920392 0.9998174 -0.9791055 0.9920392 0.9998174 -0.9791103 0.9920392 0.9998174 -0.9791163 0.9920392 0.9998174 -0.9791238 0.9920392 0.9998174 -0.9791334 0.9920392 0.9998174 -0.9791456 0.9920392 0.9998174 -0.979161 0.9920392 0.9998174 -0.9791804 0.9920392 0.9998174 -0.979205 0.9920392 0.9998174 -0.9792361 0.9920392 0.9998174 -0.9792755 0.9920392 0.9998174 -0.9793253 0.9920392 0.9998174 -0.9793883 0.9920392 0.9998174 -0.9794681 0.9920392 0.9998174 -0.9795689 0.9920392 0.9998174 -0.9796966 0.9920392 0.9998174 -0.979858 0.9920392 0.9998174 -0.9800622 0.9920392 0.9998174 -0.9803206 0.9920392 0.9998174 -0.9806476 0.9920392 0.9998174 -0.9810611 0.9920392 0.9998174 -0.9815844 0.9920392 0.9998174 -0.9822464 0.9920392 0.9998174 -0.9830838 0.9920392 0.9998174 -0.9841433 0.9920392 0.9998174 -0.9854838 0.9920392 0.9998174 -0.9871796 0.9920392 0.9998174 -0.989325 0.9920392 0.9998174 -0.9920392 0.9920392 0.9998174 -0.9954731 0.9920392 0.9998174 -0.9998174 0.9920392 0.9998174 -0.9998557 0.9915316 0.9964092 -0.999886 0.9919377 0.9949941 -0.9999099 0.9927678 0.9946818 -0.9999288 0.9937442 0.9949422 -0.9999437 0.9947172 0.9954668 -0.9790927 0.9954742 0.9998174 -0.9790927 0.9954741 0.9998174 -0.9790927 0.9954741 0.9998174 -0.9790926 0.9954741 0.9998174 -0.9790925 0.9954741 0.9998174 -0.9790925 0.995474 0.9998174 -0.9790924 0.995474 0.9998174 -0.9790923 0.9954739 0.9998174 -0.9790921 0.9954739 0.9998174 -0.979092 0.9954738 0.9998174 -0.9790919 0.9954737 0.9998174 -0.9790917 0.9954736 0.9998174 -0.9790916 0.9954735 0.9998174 -0.9790916 0.9954733 0.9998174 -0.9790917 0.9954732 0.9998174 -0.9790921 0.9954731 0.9998174 -0.9790931 0.9954731 0.9998174 -0.9790946 0.9954731 0.9998174 -0.9790965 0.9954731 0.9998174 -0.9790988 0.9954731 0.9998174 -0.9791018 0.9954731 0.9998174 -0.9791055 0.9954731 0.9998174 -0.9791103 0.9954731 0.9998174 -0.9791163 0.9954731 0.9998174 -0.9791238 0.9954731 0.9998174 -0.9791334 0.9954731 0.9998174 -0.9791456 0.9954731 0.9998174 -0.979161 0.9954731 0.9998174 -0.9791804 0.9954731 0.9998174 -0.979205 0.9954731 0.9998174 -0.9792361 0.9954731 0.9998174 -0.9792755 0.9954731 0.9998174 -0.9793253 0.9954731 0.9998174 -0.9793883 0.9954731 0.9998174 -0.9794681 0.9954731 0.9998174 -0.9795689 0.9954731 0.9998174 -0.9796966 0.9954731 0.9998174 -0.979858 0.9954731 0.9998174 -0.9800622 0.9954731 0.9998174 -0.9803206 0.9954731 0.9998174 -0.9806476 0.9954731 0.9998174 -0.9810611 0.9954731 0.9998174 -0.9815844 0.9954731 0.9998174 -0.9822464 0.9954731 0.9998174 -0.9830838 0.9954731 0.9998174 -0.9841433 0.9954731 0.9998174 -0.9854838 0.9954731 0.9998174 -0.9871796 0.9954731 0.9998174 -0.989325 0.9954731 0.9998174 -0.9920392 0.9954731 0.9998174 -0.9954731 0.9954731 0.9998174 -0.9998174 0.9954731 0.9998174 -0.9998557 0.9936849 0.9964092 -0.999886 0.993287 0.9949941 -0.9999099 0.9936128 0.9946818 -0.9999288 0.9942731 0.9949422 -0.9999437 0.9950481 0.9954668 -0.9790927 0.9998174 0.9998174 -0.9790927 0.9998174 0.9998174 -0.9790927 0.9998174 0.9998174 -0.9790926 0.9998174 0.9998174 -0.9790925 0.9998174 0.9998174 -0.9790925 0.9998174 0.9998174 -0.9790924 0.9998174 0.9998174 -0.9790923 0.9998174 0.9998174 -0.9790921 0.9998174 0.9998174 -0.979092 0.9998174 0.9998174 -0.9790919 0.9998174 0.9998174 -0.9790917 0.9998174 0.9998174 -0.9790916 0.9998174 0.9998174 -0.9790916 0.9998174 0.9998174 -0.9790917 0.9998174 0.9998174 -0.9790921 0.9998174 0.9998174 -0.9790931 0.9998174 0.9998174 -0.9790946 0.9998174 0.9998174 -0.9790965 0.9998174 0.9998174 -0.9790988 0.9998174 0.9998174 -0.9791018 0.9998174 0.9998174 -0.9791055 0.9998174 0.9998174 -0.9791103 0.9998174 0.9998174 -0.9791163 0.9998174 0.9998174 -0.9791238 0.9998174 0.9998174 -0.9791334 0.9998174 0.9998174 -0.9791456 0.9998174 0.9998174 -0.979161 0.9998174 0.9998174 -0.9791804 0.9998174 0.9998174 -0.979205 0.9998174 0.9998174 -0.9792361 0.9998174 0.9998174 -0.9792755 0.9998174 0.9998174 -0.9793253 0.9998174 0.9998174 -0.9793883 0.9998174 0.9998174 -0.9794681 0.9998174 0.9998174 -0.9795689 0.9998174 0.9998174 -0.9796966 0.9998174 0.9998174 -0.979858 0.9998174 0.9998174 -0.9800622 0.9998174 0.9998174 -0.9803206 0.9998174 0.9998174 -0.9806476 0.9998174 0.9998174 -0.9810611 0.9998174 0.9998174 -0.9815844 0.9998174 0.9998174 -0.9822464 0.9998174 0.9998174 -0.9830838 0.9998174 0.9998174 -0.9841433 0.9998174 0.9998174 -0.9854838 0.9998174 0.9998174 -0.9871796 0.9998174 0.9998174 -0.989325 0.9998174 0.9998174 -0.9920392 0.9998174 0.9998174 -0.9954731 0.9998174 0.9998174 -0.9998174 0.9998174 0.9998174 -0.9998557 0.9964092 0.9964092 -0.999886 0.9949941 0.9949941 -0.9999099 0.9946818 0.9946818 -0.9999288 0.9949422 0.9949422 -0.9999437 0.9954668 0.9954668 -0.9834129 0.9998557 0.9964098 -0.9834129 0.9998557 0.9964098 -0.9834129 0.9998557 0.9964098 -0.9834129 0.9998557 0.9964098 -0.9834128 0.9998557 0.9964098 -0.9834128 0.9998557 0.9964098 -0.9834127 0.9998557 0.9964097 -0.9834127 0.9998557 0.9964097 -0.9834126 0.9998557 0.9964097 -0.9834125 0.9998557 0.9964096 -0.9834124 0.9998557 0.9964095 -0.9834123 0.9998557 0.9964095 -0.9834122 0.9998557 0.9964094 -0.9834122 0.9998557 0.9964093 -0.9834123 0.9998557 0.9964092 -0.9834126 0.9998557 0.9964092 -0.9834132 0.9998557 0.9964092 -0.9834141 0.9998557 0.9964092 -0.9834153 0.9998557 0.9964092 -0.9834167 0.9998557 0.9964092 -0.9834186 0.9998557 0.9964092 -0.9834209 0.9998557 0.9964092 -0.9834239 0.9998557 0.9964092 -0.9834277 0.9998557 0.9964092 -0.9834324 0.9998557 0.9964092 -0.9834385 0.9998557 0.9964092 -0.9834461 0.9998557 0.9964092 -0.9834557 0.9998557 0.9964092 -0.9834679 0.9998557 0.9964092 -0.9834833 0.9998557 0.9964092 -0.9835029 0.9998557 0.9964092 -0.9835276 0.9998557 0.9964092 -0.9835588 0.9998557 0.9964092 -0.9835983 0.9998557 0.9964092 -0.9836483 0.9998557 0.9964092 -0.9837116 0.9998557 0.9964092 -0.9837916 0.9998557 0.9964092 -0.9838928 0.9998557 0.9964092 -0.9840209 0.9998557 0.9964092 -0.9841829 0.9998557 0.9964092 -0.984388 0.9998557 0.9964092 -0.9846473 0.9998557 0.9964092 -0.9849754 0.9998557 0.9964092 -0.9853905 0.9998557 0.9964092 -0.9859157 0.9998557 0.9964092 -0.9865801 0.9998557 0.9964092 -0.9874207 0.9998557 0.9964092 -0.9884841 0.9998557 0.9964092 -0.9898295 0.9998557 0.9964092 -0.9915316 0.9998557 0.9964092 -0.9936849 0.9998557 0.9964092 -0.9964092 0.9998557 0.9964092 -0.9998557 0.9998557 0.9964092 -0.999886 0.9971537 0.9949941 -0.9999099 0.9960342 0.9946818 -0.9999288 0.9957887 0.9949422 -0.9999437 0.9959964 0.9954668 -0.9868505 0.999886 0.9949948 -0.9868505 0.999886 0.9949948 -0.9868505 0.999886 0.9949948 -0.9868505 0.999886 0.9949948 -0.9868504 0.999886 0.9949948 -0.9868504 0.999886 0.9949948 -0.9868504 0.999886 0.9949947 -0.9868503 0.999886 0.9949947 -0.9868503 0.999886 0.9949946 -0.9868502 0.999886 0.9949946 -0.9868502 0.999886 0.9949945 -0.9868501 0.999886 0.9949945 -0.9868501 0.999886 0.9949944 -0.98685 0.999886 0.9949943 -0.9868501 0.999886 0.9949942 -0.9868503 0.999886 0.9949941 -0.9868507 0.999886 0.9949941 -0.9868512 0.999886 0.9949941 -0.986852 0.999886 0.9949941 -0.9868529 0.999886 0.9949941 -0.9868541 0.999886 0.9949941 -0.9868555 0.999886 0.9949941 -0.9868574 0.999886 0.9949941 -0.9868597 0.999886 0.9949941 -0.9868627 0.999886 0.9949941 -0.9868665 0.999886 0.9949941 -0.9868713 0.999886 0.9949941 -0.9868773 0.999886 0.9949941 -0.986885 0.999886 0.9949941 -0.9868946 0.999886 0.9949941 -0.9869069 0.999886 0.9949941 -0.9869223 0.999886 0.9949941 -0.9869419 0.999886 0.9949941 -0.9869667 0.999886 0.9949941 -0.986998 0.999886 0.9949941 -0.9870376 0.999886 0.9949941 -0.9870878 0.999886 0.9949941 -0.9871512 0.999886 0.9949941 -0.9872315 0.999886 0.9949941 -0.987333 0.999886 0.9949941 -0.9874615 0.999886 0.9949941 -0.987624 0.999886 0.9949941 -0.9878296 0.999886 0.9949941 -0.9880897 0.999886 0.9949941 -0.9884188 0.999886 0.9949941 -0.9888351 0.999886 0.9949941 -0.9893618 0.999886 0.9949941 -0.9900282 0.999886 0.9949941 -0.9908712 0.999886 0.9949941 -0.9919377 0.999886 0.9949941 -0.993287 0.999886 0.9949941 -0.9949941 0.999886 0.9949941 -0.9971537 0.999886 0.9949941 -0.999886 0.999886 0.9949941 -0.9999099 0.9977452 0.9946818 -0.9999288 0.9968597 0.9949422 -0.9999437 0.9966665 0.9954668 -0.989582 0.9999099 0.9946824 -0.989582 0.9999099 0.9946824 -0.989582 0.9999099 0.9946824 -0.989582 0.9999099 0.9946824 -0.989582 0.9999099 0.9946824 -0.9895819 0.9999099 0.9946823 -0.9895819 0.9999099 0.9946823 -0.9895819 0.9999099 0.9946823 -0.9895819 0.9999099 0.9946823 -0.9895818 0.9999099 0.9946822 -0.9895818 0.9999099 0.9946822 -0.9895818 0.9999099 0.9946821 -0.9895817 0.9999099 0.994682 -0.9895817 0.9999099 0.9946819 -0.9895817 0.9999099 0.9946819 -0.9895819 0.9999099 0.9946818 -0.9895821 0.9999099 0.9946818 -0.9895825 0.9999099 0.9946818 -0.9895829 0.9999099 0.9946818 -0.9895835 0.9999099 0.9946818 -0.9895842 0.9999099 0.9946818 -0.9895851 0.9999099 0.9946818 -0.9895863 0.9999099 0.9946818 -0.9895878 0.9999099 0.9946818 -0.9895897 0.9999099 0.9946818 -0.989592 0.9999099 0.9946818 -0.989595 0.9999099 0.9946818 -0.9895988 0.9999099 0.9946818 -0.9896036 0.9999099 0.9946818 -0.9896096 0.9999099 0.9946818 -0.9896173 0.9999099 0.9946818 -0.989627 0.9999099 0.9946818 -0.9896392 0.9999099 0.9946818 -0.9896547 0.9999099 0.9946818 -0.9896744 0.9999099 0.9946818 -0.9896992 0.9999099 0.9946818 -0.9897306 0.9999099 0.9946818 -0.9897703 0.9999099 0.9946818 -0.9898206 0.9999099 0.9946818 -0.9898842 0.9999099 0.9946818 -0.9899646 0.9999099 0.9946818 -0.9900664 0.9999099 0.9946818 -0.9901951 0.9999099 0.9946818 -0.990358 0.9999099 0.9946818 -0.9905641 0.9999099 0.9946818 -0.9908248 0.9999099 0.9946818 -0.9911547 0.9999099 0.9946818 -0.991572 0.9999099 0.9946818 -0.9920999 0.9999099 0.9946818 -0.9927678 0.9999099 0.9946818 -0.9936128 0.9999099 0.9946818 -0.9946818 0.9999099 0.9946818 -0.9960342 0.9999099 0.9946818 -0.9977452 0.9999099 0.9946818 -0.9999099 0.9999099 0.9946818 -0.9999288 0.9982146 0.9949422 -0.9999437 0.9975143 0.9954668 -0.9917501 0.9999288 0.9949427 -0.9917501 0.9999288 0.9949427 -0.9917501 0.9999288 0.9949427 -0.9917501 0.9999288 0.9949426 -0.9917501 0.9999288 0.9949426 -0.9917501 0.9999288 0.9949426 -0.99175 0.9999288 0.9949426 -0.99175 0.9999288 0.9949426 -0.99175 0.9999288 0.9949426 -0.99175 0.9999288 0.9949425 -0.99175 0.9999288 0.9949425 -0.9917499 0.9999288 0.9949424 -0.9917499 0.9999288 0.9949424 -0.9917499 0.9999288 0.9949423 -0.9917499 0.9999288 0.9949423 -0.99175 0.9999288 0.9949422 -0.9917502 0.9999288 0.9949422 -0.9917504 0.9999288 0.9949422 -0.9917507 0.9999288 0.9949422 -0.991751 0.9999288 0.9949422 -0.9917515 0.9999288 0.9949422 -0.9917521 0.9999288 0.9949422 -0.9917528 0.9999288 0.9949422 -0.9917537 0.9999288 0.9949422 -0.9917549 0.9999288 0.9949422 -0.9917564 0.9999288 0.9949422 -0.9917582 0.9999288 0.9949422 -0.9917606 0.9999288 0.9949422 -0.9917636 0.9999288 0.9949422 -0.9917674 0.9999288 0.9949422 -0.9917722 0.9999288 0.9949422 -0.9917782 0.9999288 0.9949422 -0.9917859 0.9999288 0.9949422 -0.9917956 0.9999288 0.9949422 -0.9918079 0.9999288 0.9949422 -0.9918234 0.9999288 0.9949422 -0.9918431 0.9999288 0.9949422 -0.991868 0.9999288 0.9949422 -0.9918994 0.9999288 0.9949422 -0.9919392 0.9999288 0.9949422 -0.9919896 0.9999288 0.9949422 -0.9920533 0.9999288 0.9949422 -0.9921339 0.9999288 0.9949422 -0.9922358 0.9999288 0.9949422 -0.9923648 0.9999288 0.9949422 -0.992528 0.9999288 0.9949422 -0.9927345 0.9999288 0.9949422 -0.9929957 0.9999288 0.9949422 -0.9933261 0.9999288 0.9949422 -0.9937442 0.9999288 0.9949422 -0.9942731 0.9999288 0.9949422 -0.9949422 0.9999288 0.9949422 -0.9957887 0.9999288 0.9949422 -0.9968597 0.9999288 0.9949422 -0.9982146 0.9999288 0.9949422 -0.9999288 0.9999288 0.9949422 -0.9999437 0.9985868 0.9954668 -0.9934695 0.9999437 0.9954671 -0.9934695 0.9999437 0.9954671 -0.9934695 0.9999437 0.9954671 -0.9934695 0.9999437 0.9954671 -0.9934695 0.9999437 0.9954671 -0.9934695 0.9999437 0.9954671 -0.9934695 0.9999437 0.995467 -0.9934694 0.9999437 0.995467 -0.9934694 0.9999437 0.995467 -0.9934694 0.9999437 0.995467 -0.9934694 0.9999437 0.995467 -0.9934694 0.9999437 0.9954669 -0.9934694 0.9999437 0.9954669 -0.9934694 0.9999437 0.9954668 -0.9934694 0.9999437 0.9954668 -0.9934694 0.9999437 0.9954668 -0.9934695 0.9999437 0.9954668 -0.9934697 0.9999437 0.9954668 -0.9934698 0.9999437 0.9954668 -0.9934701 0.9999437 0.9954668 -0.9934704 0.9999437 0.9954668 -0.9934707 0.9999437 0.9954668 -0.9934712 0.9999437 0.9954668 -0.9934718 0.9999437 0.9954668 -0.9934725 0.9999437 0.9954668 -0.9934734 0.9999437 0.9954668 -0.9934746 0.9999437 0.9954668 -0.9934761 0.9999437 0.9954668 -0.9934779 0.9999437 0.9954668 -0.9934803 0.9999437 0.9954668 -0.9934833 0.9999437 0.9954668 -0.9934871 0.9999437 0.9954668 -0.9934919 0.9999437 0.9954668 -0.993498 0.9999437 0.9954668 -0.9935057 0.9999437 0.9954668 -0.9935154 0.9999437 0.9954668 -0.9935277 0.9999437 0.9954668 -0.9935432 0.9999437 0.9954668 -0.9935629 0.9999437 0.9954668 -0.9935878 0.9999437 0.9954668 -0.9936193 0.9999437 0.9954668 -0.9936592 0.9999437 0.9954668 -0.9937096 0.9999437 0.9954668 -0.9937734 0.9999437 0.9954668 -0.9938541 0.9999437 0.9954668 -0.9939562 0.9999437 0.9954668 -0.9940854 0.9999437 0.9954668 -0.9942488 0.9999437 0.9954668 -0.9944556 0.9999437 0.9954668 -0.9947172 0.9999437 0.9954668 -0.9950481 0.9999437 0.9954668 -0.9954668 0.9999437 0.9954668 -0.9959964 0.9999437 0.9954668 -0.9966665 0.9999437 0.9954668 -0.9975143 0.9999437 0.9954668 -0.9985868 0.9999437 0.9954668 -0.9999437 0.9999437 0.9954668 -0.9834129 0.9834129 0.9998557 -0.983413 0.9834129 0.9998557 -0.983413 0.9834129 0.9998557 -0.983413 0.9834129 0.9998557 -0.9834131 0.9834129 0.9998557 -0.9834131 0.9834129 0.9998557 -0.9834132 0.9834129 0.9998557 -0.9834133 0.9834129 0.9998557 -0.9834134 0.9834129 0.9998557 -0.9834135 0.9834129 0.9998557 -0.9834137 0.9834129 0.9998557 -0.9834139 0.9834129 0.9998557 -0.9834142 0.9834129 0.9998557 -0.9834146 0.9834129 0.9998557 -0.983415 0.9834129 0.9998557 -0.9834156 0.9834129 0.9998557 -0.9834163 0.9834129 0.9998557 -0.9834172 0.9834129 0.9998557 -0.9834184 0.9834129 0.9998557 -0.9834199 0.9834129 0.9998557 -0.9834217 0.9834129 0.9998557 -0.9834241 0.9834129 0.9998557 -0.983427 0.9834129 0.9998557 -0.9834308 0.9834129 0.9998557 -0.9834356 0.9834129 0.9998557 -0.9834416 0.9834129 0.9998557 -0.9834492 0.9834129 0.9998557 -0.9834588 0.9834129 0.9998557 -0.983471 0.9834129 0.9998557 -0.9834865 0.9834129 0.9998557 -0.983506 0.9834129 0.9998557 -0.9835307 0.9834129 0.9998557 -0.9835619 0.9834129 0.9998557 -0.9836014 0.9834129 0.9998557 -0.9836514 0.9834129 0.9998557 -0.9837146 0.9834129 0.9998557 -0.9837946 0.9834129 0.9998557 -0.9838959 0.9834129 0.9998557 -0.9840239 0.9834129 0.9998557 -0.9841859 0.9834129 0.9998557 -0.9843909 0.9834129 0.9998557 -0.9846502 0.9834129 0.9998557 -0.9849783 0.9834129 0.9998557 -0.9853933 0.9834129 0.9998557 -0.9859184 0.9834129 0.9998557 -0.9865826 0.9834129 0.9998557 -0.9874231 0.9834129 0.9998557 -0.9884863 0.9834129 0.9998557 -0.9898314 0.9834129 0.9998557 -0.9915331 0.9834129 0.9998557 -0.9936861 0.9834129 0.9998557 -0.9964098 0.9834129 0.9998557 -0.9998557 0.9834129 0.9998557 -0.999886 0.9868505 0.9971542 -0.9999099 0.989582 0.9960347 -0.9999288 0.9917501 0.9957891 -0.9999437 0.9934695 0.9959967 -0.9834129 0.983413 0.9998557 -0.9834129 0.9834129 0.9998557 -0.9834129 0.9834129 0.9998557 -0.983413 0.9834129 0.9998557 -0.983413 0.9834129 0.9998557 -0.9834131 0.9834129 0.9998557 -0.9834131 0.9834129 0.9998557 -0.9834132 0.9834129 0.9998557 -0.9834133 0.9834129 0.9998557 -0.9834135 0.9834129 0.9998557 -0.9834137 0.9834129 0.9998557 -0.9834139 0.9834129 0.9998557 -0.9834142 0.9834129 0.9998557 -0.9834145 0.9834129 0.9998557 -0.983415 0.9834129 0.9998557 -0.9834155 0.9834129 0.9998557 -0.9834163 0.9834129 0.9998557 -0.9834172 0.9834129 0.9998557 -0.9834184 0.9834129 0.9998557 -0.9834198 0.9834129 0.9998557 -0.9834217 0.9834129 0.9998557 -0.983424 0.9834129 0.9998557 -0.983427 0.9834129 0.9998557 -0.9834308 0.9834129 0.9998557 -0.9834355 0.9834129 0.9998557 -0.9834415 0.9834129 0.9998557 -0.9834492 0.9834129 0.9998557 -0.9834588 0.9834129 0.9998557 -0.983471 0.9834129 0.9998557 -0.9834864 0.9834129 0.9998557 -0.9835059 0.9834129 0.9998557 -0.9835306 0.9834129 0.9998557 -0.9835618 0.9834129 0.9998557 -0.9836014 0.9834129 0.9998557 -0.9836513 0.9834129 0.9998557 -0.9837146 0.9834129 0.9998557 -0.9837946 0.9834129 0.9998557 -0.9838958 0.9834129 0.9998557 -0.9840239 0.9834129 0.9998557 -0.9841859 0.9834129 0.9998557 -0.9843909 0.9834129 0.9998557 -0.9846502 0.9834129 0.9998557 -0.9849782 0.9834129 0.9998557 -0.9853933 0.9834129 0.9998557 -0.9859183 0.9834129 0.9998557 -0.9865826 0.9834129 0.9998557 -0.987423 0.9834129 0.9998557 -0.9884863 0.9834129 0.9998557 -0.9898314 0.9834129 0.9998557 -0.9915331 0.9834129 0.9998557 -0.9936861 0.9834129 0.9998557 -0.9964098 0.9834129 0.9998557 -0.9998557 0.9834129 0.9998557 -0.999886 0.9868505 0.9971542 -0.9999099 0.989582 0.9960347 -0.9999288 0.9917501 0.9957891 -0.9999437 0.9934695 0.9959967 -0.9834129 0.983413 0.9998557 -0.9834129 0.9834129 0.9998557 -0.9834129 0.9834129 0.9998557 -0.9834129 0.9834129 0.9998557 -0.983413 0.9834129 0.9998557 -0.983413 0.9834129 0.9998557 -0.9834131 0.9834129 0.9998557 -0.9834132 0.9834129 0.9998557 -0.9834133 0.9834129 0.9998557 -0.9834134 0.9834129 0.9998557 -0.9834136 0.9834129 0.9998557 -0.9834138 0.9834129 0.9998557 -0.9834141 0.9834129 0.9998557 -0.9834145 0.9834129 0.9998557 -0.9834149 0.9834129 0.9998557 -0.9834155 0.9834129 0.9998557 -0.9834162 0.9834129 0.9998557 -0.9834171 0.9834129 0.9998557 -0.9834183 0.9834129 0.9998557 -0.9834198 0.9834129 0.9998557 -0.9834216 0.9834129 0.9998557 -0.983424 0.9834129 0.9998557 -0.9834269 0.9834129 0.9998557 -0.9834307 0.9834129 0.9998557 -0.9834355 0.9834129 0.9998557 -0.9834415 0.9834129 0.9998557 -0.9834491 0.9834129 0.9998557 -0.9834587 0.9834129 0.9998557 -0.9834709 0.9834129 0.9998557 -0.9834864 0.9834129 0.9998557 -0.9835059 0.9834129 0.9998557 -0.9835306 0.9834129 0.9998557 -0.9835618 0.9834129 0.9998557 -0.9836013 0.9834129 0.9998557 -0.9836513 0.9834129 0.9998557 -0.9837145 0.9834129 0.9998557 -0.9837945 0.9834129 0.9998557 -0.9838958 0.9834129 0.9998557 -0.9840238 0.9834129 0.9998557 -0.9841858 0.9834129 0.9998557 -0.9843908 0.9834129 0.9998557 -0.9846501 0.9834129 0.9998557 -0.9849782 0.9834129 0.9998557 -0.9853932 0.9834129 0.9998557 -0.9859183 0.9834129 0.9998557 -0.9865826 0.9834129 0.9998557 -0.987423 0.9834129 0.9998557 -0.9884862 0.9834129 0.9998557 -0.9898313 0.9834129 0.9998557 -0.9915331 0.9834129 0.9998557 -0.993686 0.9834129 0.9998557 -0.9964098 0.9834129 0.9998557 -0.9998557 0.9834129 0.9998557 -0.999886 0.9868505 0.9971541 -0.9999099 0.989582 0.9960347 -0.9999288 0.9917501 0.9957891 -0.9999437 0.9934695 0.9959967 -0.9834129 0.983413 0.9998557 -0.9834129 0.983413 0.9998557 -0.9834129 0.9834129 0.9998557 -0.9834129 0.9834129 0.9998557 -0.9834129 0.9834129 0.9998557 -0.983413 0.9834129 0.9998557 -0.983413 0.9834129 0.9998557 -0.9834131 0.9834129 0.9998557 -0.9834132 0.9834129 0.9998557 -0.9834134 0.9834129 0.9998557 -0.9834135 0.9834129 0.9998557 -0.9834138 0.9834129 0.9998557 -0.983414 0.9834129 0.9998557 -0.9834144 0.9834129 0.9998557 -0.9834149 0.9834129 0.9998557 -0.9834154 0.9834129 0.9998557 -0.9834162 0.9834129 0.9998557 -0.9834171 0.9834129 0.9998557 -0.9834182 0.9834129 0.9998557 -0.9834197 0.9834129 0.9998557 -0.9834216 0.9834129 0.9998557 -0.9834239 0.9834129 0.9998557 -0.9834269 0.9834129 0.9998557 -0.9834306 0.9834129 0.9998557 -0.9834354 0.9834129 0.9998557 -0.9834414 0.9834129 0.9998557 -0.983449 0.9834129 0.9998557 -0.9834587 0.9834129 0.9998557 -0.9834709 0.9834129 0.9998557 -0.9834863 0.9834129 0.9998557 -0.9835058 0.9834129 0.9998557 -0.9835305 0.9834129 0.9998557 -0.9835617 0.9834129 0.9998557 -0.9836012 0.9834129 0.9998557 -0.9836512 0.9834129 0.9998557 -0.9837145 0.9834129 0.9998557 -0.9837945 0.9834129 0.9998557 -0.9838957 0.9834129 0.9998557 -0.9840238 0.9834129 0.9998557 -0.9841858 0.9834129 0.9998557 -0.9843907 0.9834129 0.9998557 -0.9846501 0.9834129 0.9998557 -0.9849781 0.9834129 0.9998557 -0.9853932 0.9834129 0.9998557 -0.9859182 0.9834129 0.9998557 -0.9865825 0.9834129 0.9998557 -0.9874229 0.9834129 0.9998557 -0.9884862 0.9834129 0.9998557 -0.9898313 0.9834129 0.9998557 -0.9915331 0.9834129 0.9998557 -0.993686 0.9834129 0.9998557 -0.9964098 0.9834129 0.9998557 -0.9998557 0.9834129 0.9998557 -0.999886 0.9868505 0.9971541 -0.9999099 0.989582 0.9960347 -0.9999288 0.9917501 0.9957891 -0.9999437 0.9934695 0.9959967 -0.9834129 0.9834131 0.9998557 -0.9834129 0.983413 0.9998557 -0.9834129 0.983413 0.9998557 -0.9834129 0.9834129 0.9998557 -0.9834128 0.9834128 0.9998557 -0.9834129 0.9834128 0.9998557 -0.9834129 0.9834128 0.9998557 -0.983413 0.9834128 0.9998557 -0.9834131 0.9834128 0.9998557 -0.9834133 0.9834128 0.9998557 -0.9834135 0.9834128 0.9998557 -0.9834137 0.9834128 0.9998557 -0.983414 0.9834128 0.9998557 -0.9834143 0.9834128 0.9998557 -0.9834148 0.9834128 0.9998557 -0.9834153 0.9834128 0.9998557 -0.9834161 0.9834128 0.9998557 -0.983417 0.9834128 0.9998557 -0.9834182 0.9834128 0.9998557 -0.9834196 0.9834128 0.9998557 -0.9834215 0.9834128 0.9998557 -0.9834238 0.9834128 0.9998557 -0.9834268 0.9834128 0.9998557 -0.9834306 0.9834128 0.9998557 -0.9834353 0.9834128 0.9998557 -0.9834413 0.9834128 0.9998557 -0.983449 0.9834128 0.9998557 -0.9834586 0.9834128 0.9998557 -0.9834708 0.9834128 0.9998557 -0.9834862 0.9834128 0.9998557 -0.9835057 0.9834128 0.9998557 -0.9835304 0.9834128 0.9998557 -0.9835616 0.9834128 0.9998557 -0.9836012 0.9834128 0.9998557 -0.9836511 0.9834128 0.9998557 -0.9837144 0.9834128 0.9998557 -0.9837944 0.9834128 0.9998557 -0.9838956 0.9834128 0.9998557 -0.9840237 0.9834128 0.9998557 -0.9841857 0.9834128 0.9998557 -0.9843907 0.9834128 0.9998557 -0.98465 0.9834128 0.9998557 -0.984978 0.9834128 0.9998557 -0.9853931 0.9834128 0.9998557 -0.9859182 0.9834128 0.9998557 -0.9865825 0.9834128 0.9998557 -0.9874229 0.9834128 0.9998557 -0.9884861 0.9834128 0.9998557 -0.9898313 0.9834128 0.9998557 -0.991533 0.9834128 0.9998557 -0.993686 0.9834128 0.9998557 -0.9964098 0.9834128 0.9998557 -0.9998557 0.9834128 0.9998557 -0.999886 0.9868504 0.9971541 -0.9999099 0.989582 0.9960347 -0.9999288 0.9917501 0.9957891 -0.9999437 0.9934695 0.9959967 -0.9834129 0.9834131 0.9998557 -0.9834129 0.9834131 0.9998557 -0.9834129 0.983413 0.9998557 -0.9834129 0.983413 0.9998557 -0.9834128 0.9834129 0.9998557 -0.9834128 0.9834128 0.9998557 -0.9834128 0.9834128 0.9998557 -0.9834129 0.9834128 0.9998557 -0.983413 0.9834128 0.9998557 -0.9834132 0.9834128 0.9998557 -0.9834134 0.9834128 0.9998557 -0.9834136 0.9834128 0.9998557 -0.9834139 0.9834128 0.9998557 -0.9834142 0.9834128 0.9998557 -0.9834147 0.9834128 0.9998557 -0.9834152 0.9834128 0.9998557 -0.983416 0.9834128 0.9998557 -0.9834169 0.9834128 0.9998557 -0.9834181 0.9834128 0.9998557 -0.9834195 0.9834128 0.9998557 -0.9834214 0.9834128 0.9998557 -0.9834237 0.9834128 0.9998557 -0.9834267 0.9834128 0.9998557 -0.9834305 0.9834128 0.9998557 -0.9834352 0.9834128 0.9998557 -0.9834412 0.9834128 0.9998557 -0.9834489 0.9834128 0.9998557 -0.9834585 0.9834128 0.9998557 -0.9834707 0.9834128 0.9998557 -0.9834861 0.9834128 0.9998557 -0.9835056 0.9834128 0.9998557 -0.9835303 0.9834128 0.9998557 -0.9835615 0.9834128 0.9998557 -0.9836011 0.9834128 0.9998557 -0.983651 0.9834128 0.9998557 -0.9837143 0.9834128 0.9998557 -0.9837943 0.9834128 0.9998557 -0.9838955 0.9834128 0.9998557 -0.9840236 0.9834128 0.9998557 -0.9841856 0.9834128 0.9998557 -0.9843906 0.9834128 0.9998557 -0.9846499 0.9834128 0.9998557 -0.9849779 0.9834128 0.9998557 -0.985393 0.9834128 0.9998557 -0.9859181 0.9834128 0.9998557 -0.9865824 0.9834128 0.9998557 -0.9874228 0.9834128 0.9998557 -0.988486 0.9834128 0.9998557 -0.9898312 0.9834128 0.9998557 -0.991533 0.9834128 0.9998557 -0.993686 0.9834128 0.9998557 -0.9964098 0.9834128 0.9998557 -0.9998557 0.9834128 0.9998557 -0.999886 0.9868504 0.9971541 -0.9999099 0.9895819 0.9960346 -0.9999288 0.9917501 0.9957891 -0.9999437 0.9934695 0.9959967 -0.9834129 0.9834132 0.9998557 -0.9834129 0.9834131 0.9998557 -0.9834129 0.9834131 0.9998557 -0.9834129 0.983413 0.9998557 -0.9834128 0.9834129 0.9998557 -0.9834128 0.9834128 0.9998557 -0.9834127 0.9834127 0.9998557 -0.9834128 0.9834127 0.9998557 -0.9834129 0.9834127 0.9998557 -0.9834131 0.9834127 0.9998557 -0.9834132 0.9834127 0.9998557 -0.9834135 0.9834127 0.9998557 -0.9834137 0.9834127 0.9998557 -0.9834141 0.9834127 0.9998557 -0.9834146 0.9834127 0.9998557 -0.9834151 0.9834127 0.9998557 -0.9834158 0.9834127 0.9998557 -0.9834168 0.9834127 0.9998557 -0.9834179 0.9834127 0.9998557 -0.9834194 0.9834127 0.9998557 -0.9834213 0.9834127 0.9998557 -0.9834236 0.9834127 0.9998557 -0.9834266 0.9834127 0.9998557 -0.9834303 0.9834127 0.9998557 -0.9834351 0.9834127 0.9998557 -0.9834411 0.9834127 0.9998557 -0.9834487 0.9834127 0.9998557 -0.9834584 0.9834127 0.9998557 -0.9834706 0.9834127 0.9998557 -0.983486 0.9834127 0.9998557 -0.9835055 0.9834127 0.9998557 -0.9835302 0.9834127 0.9998557 -0.9835614 0.9834127 0.9998557 -0.9836009 0.9834127 0.9998557 -0.9836509 0.9834127 0.9998557 -0.9837142 0.9834127 0.9998557 -0.9837942 0.9834127 0.9998557 -0.9838954 0.9834127 0.9998557 -0.9840235 0.9834127 0.9998557 -0.9841855 0.9834127 0.9998557 -0.9843905 0.9834127 0.9998557 -0.9846498 0.9834127 0.9998557 -0.9849778 0.9834127 0.9998557 -0.9853929 0.9834127 0.9998557 -0.985918 0.9834127 0.9998557 -0.9865823 0.9834127 0.9998557 -0.9874227 0.9834127 0.9998557 -0.988486 0.9834127 0.9998557 -0.9898311 0.9834127 0.9998557 -0.9915329 0.9834127 0.9998557 -0.9936859 0.9834127 0.9998557 -0.9964097 0.9834127 0.9998557 -0.9998557 0.9834127 0.9998557 -0.999886 0.9868504 0.9971541 -0.9999099 0.9895819 0.9960346 -0.9999288 0.99175 0.9957891 -0.9999437 0.9934695 0.9959967 -0.9834129 0.9834133 0.9998557 -0.9834129 0.9834132 0.9998557 -0.9834129 0.9834132 0.9998557 -0.9834129 0.9834131 0.9998557 -0.9834128 0.983413 0.9998557 -0.9834128 0.9834129 0.9998557 -0.9834127 0.9834128 0.9998557 -0.9834127 0.9834127 0.9998557 -0.9834128 0.9834127 0.9998557 -0.9834129 0.9834127 0.9998557 -0.9834131 0.9834127 0.9998557 -0.9834133 0.9834127 0.9998557 -0.9834136 0.9834127 0.9998557 -0.9834139 0.9834127 0.9998557 -0.9834144 0.9834127 0.9998557 -0.983415 0.9834127 0.9998557 -0.9834157 0.9834127 0.9998557 -0.9834166 0.9834127 0.9998557 -0.9834178 0.9834127 0.9998557 -0.9834192 0.9834127 0.9998557 -0.9834211 0.9834127 0.9998557 -0.9834234 0.9834127 0.9998557 -0.9834264 0.9834127 0.9998557 -0.9834302 0.9834127 0.9998557 -0.9834349 0.9834127 0.9998557 -0.983441 0.9834127 0.9998557 -0.9834486 0.9834127 0.9998557 -0.9834582 0.9834127 0.9998557 -0.9834704 0.9834127 0.9998557 -0.9834858 0.9834127 0.9998557 -0.9835053 0.9834127 0.9998557 -0.98353 0.9834127 0.9998557 -0.9835613 0.9834127 0.9998557 -0.9836008 0.9834127 0.9998557 -0.9836508 0.9834127 0.9998557 -0.983714 0.9834127 0.9998557 -0.983794 0.9834127 0.9998557 -0.9838953 0.9834127 0.9998557 -0.9840233 0.9834127 0.9998557 -0.9841853 0.9834127 0.9998557 -0.9843903 0.9834127 0.9998557 -0.9846496 0.9834127 0.9998557 -0.9849777 0.9834127 0.9998557 -0.9853927 0.9834127 0.9998557 -0.9859178 0.9834127 0.9998557 -0.9865821 0.9834127 0.9998557 -0.9874226 0.9834127 0.9998557 -0.9884859 0.9834127 0.9998557 -0.989831 0.9834127 0.9998557 -0.9915328 0.9834127 0.9998557 -0.9936858 0.9834127 0.9998557 -0.9964097 0.9834127 0.9998557 -0.9998557 0.9834127 0.9998557 -0.999886 0.9868503 0.9971541 -0.9999099 0.9895819 0.9960346 -0.9999288 0.99175 0.9957891 -0.9999437 0.9934694 0.9959967 -0.9834129 0.9834134 0.9998557 -0.9834129 0.9834133 0.9998557 -0.9834129 0.9834133 0.9998557 -0.9834129 0.9834132 0.9998557 -0.9834128 0.9834131 0.9998557 -0.9834128 0.983413 0.9998557 -0.9834127 0.9834129 0.9998557 -0.9834127 0.9834128 0.9998557 -0.9834126 0.9834126 0.9998557 -0.9834127 0.9834126 0.9998557 -0.9834129 0.9834126 0.9998557 -0.9834131 0.9834126 0.9998557 -0.9834134 0.9834126 0.9998557 -0.9834138 0.9834126 0.9998557 -0.9834142 0.9834126 0.9998557 -0.9834148 0.9834126 0.9998557 -0.9834155 0.9834126 0.9998557 -0.9834164 0.9834126 0.9998557 -0.9834176 0.9834126 0.9998557 -0.9834191 0.9834126 0.9998557 -0.9834209 0.9834126 0.9998557 -0.9834233 0.9834126 0.9998557 -0.9834262 0.9834126 0.9998557 -0.98343 0.9834126 0.9998557 -0.9834348 0.9834126 0.9998557 -0.9834408 0.9834126 0.9998557 -0.9834484 0.9834126 0.9998557 -0.983458 0.9834126 0.9998557 -0.9834702 0.9834126 0.9998557 -0.9834856 0.9834126 0.9998557 -0.9835052 0.9834126 0.9998557 -0.9835298 0.9834126 0.9998557 -0.9835611 0.9834126 0.9998557 -0.9836006 0.9834126 0.9998557 -0.9836506 0.9834126 0.9998557 -0.9837138 0.9834126 0.9998557 -0.9837938 0.9834126 0.9998557 -0.9838951 0.9834126 0.9998557 -0.9840231 0.9834126 0.9998557 -0.9841852 0.9834126 0.9998557 -0.9843901 0.9834126 0.9998557 -0.9846494 0.9834126 0.9998557 -0.9849775 0.9834126 0.9998557 -0.9853926 0.9834126 0.9998557 -0.9859177 0.9834126 0.9998557 -0.986582 0.9834126 0.9998557 -0.9874224 0.9834126 0.9998557 -0.9884857 0.9834126 0.9998557 -0.9898309 0.9834126 0.9998557 -0.9915327 0.9834126 0.9998557 -0.9936858 0.9834126 0.9998557 -0.9964097 0.9834126 0.9998557 -0.9998557 0.9834126 0.9998557 -0.999886 0.9868503 0.9971541 -0.9999099 0.9895819 0.9960346 -0.9999288 0.99175 0.995789 -0.9999437 0.9934694 0.9959967 -0.9834129 0.9834135 0.9998557 -0.9834129 0.9834135 0.9998557 -0.9834129 0.9834134 0.9998557 -0.9834129 0.9834134 0.9998557 -0.9834128 0.9834133 0.9998557 -0.9834128 0.9834132 0.9998557 -0.9834127 0.9834131 0.9998557 -0.9834127 0.9834129 0.9998557 -0.9834126 0.9834127 0.9998557 -0.9834125 0.9834125 0.9998557 -0.9834127 0.9834125 0.9998557 -0.9834129 0.9834125 0.9998557 -0.9834132 0.9834125 0.9998557 -0.9834135 0.9834125 0.9998557 -0.983414 0.9834125 0.9998557 -0.9834146 0.9834125 0.9998557 -0.9834153 0.9834125 0.9998557 -0.9834162 0.9834125 0.9998557 -0.9834174 0.9834125 0.9998557 -0.9834188 0.9834125 0.9998557 -0.9834207 0.9834125 0.9998557 -0.983423 0.9834125 0.9998557 -0.983426 0.9834125 0.9998557 -0.9834298 0.9834125 0.9998557 -0.9834345 0.9834125 0.9998557 -0.9834405 0.9834125 0.9998557 -0.9834482 0.9834125 0.9998557 -0.9834578 0.9834125 0.9998557 -0.98347 0.9834125 0.9998557 -0.9834854 0.9834125 0.9998557 -0.9835049 0.9834125 0.9998557 -0.9835296 0.9834125 0.9998557 -0.9835609 0.9834125 0.9998557 -0.9836004 0.9834125 0.9998557 -0.9836504 0.9834125 0.9998557 -0.9837136 0.9834125 0.9998557 -0.9837936 0.9834125 0.9998557 -0.9838948 0.9834125 0.9998557 -0.9840229 0.9834125 0.9998557 -0.9841849 0.9834125 0.9998557 -0.9843899 0.9834125 0.9998557 -0.9846492 0.9834125 0.9998557 -0.9849773 0.9834125 0.9998557 -0.9853924 0.9834125 0.9998557 -0.9859175 0.9834125 0.9998557 -0.9865818 0.9834125 0.9998557 -0.9874223 0.9834125 0.9998557 -0.9884856 0.9834125 0.9998557 -0.9898308 0.9834125 0.9998557 -0.9915326 0.9834125 0.9998557 -0.9936857 0.9834125 0.9998557 -0.9964096 0.9834125 0.9998557 -0.9998557 0.9834125 0.9998557 -0.999886 0.9868502 0.997154 -0.9999099 0.9895818 0.9960345 -0.9999288 0.99175 0.995789 -0.9999437 0.9934694 0.9959966 -0.9834129 0.9834137 0.9998557 -0.9834129 0.9834137 0.9998557 -0.9834129 0.9834136 0.9998557 -0.9834129 0.9834135 0.9998557 -0.9834128 0.9834135 0.9998557 -0.9834128 0.9834134 0.9998557 -0.9834127 0.9834132 0.9998557 -0.9834127 0.9834131 0.9998557 -0.9834126 0.9834129 0.9998557 -0.9834125 0.9834127 0.9998557 -0.9834124 0.9834124 0.9998557 -0.9834126 0.9834124 0.9998557 -0.9834129 0.9834124 0.9998557 -0.9834133 0.9834124 0.9998557 -0.9834137 0.9834124 0.9998557 -0.9834143 0.9834124 0.9998557 -0.983415 0.9834124 0.9998557 -0.9834159 0.9834124 0.9998557 -0.9834171 0.9834124 0.9998557 -0.9834186 0.9834124 0.9998557 -0.9834204 0.9834124 0.9998557 -0.9834228 0.9834124 0.9998557 -0.9834257 0.9834124 0.9998557 -0.9834295 0.9834124 0.9998557 -0.9834343 0.9834124 0.9998557 -0.9834403 0.9834124 0.9998557 -0.9834479 0.9834124 0.9998557 -0.9834575 0.9834124 0.9998557 -0.9834697 0.9834124 0.9998557 -0.9834851 0.9834124 0.9998557 -0.9835047 0.9834124 0.9998557 -0.9835294 0.9834124 0.9998557 -0.9835606 0.9834124 0.9998557 -0.9836001 0.9834124 0.9998557 -0.9836501 0.9834124 0.9998557 -0.9837133 0.9834124 0.9998557 -0.9837934 0.9834124 0.9998557 -0.9838946 0.9834124 0.9998557 -0.9840227 0.9834124 0.9998557 -0.9841847 0.9834124 0.9998557 -0.9843897 0.9834124 0.9998557 -0.984649 0.9834124 0.9998557 -0.9849771 0.9834124 0.9998557 -0.9853921 0.9834124 0.9998557 -0.9859173 0.9834124 0.9998557 -0.9865816 0.9834124 0.9998557 -0.9874221 0.9834124 0.9998557 -0.9884854 0.9834124 0.9998557 -0.9898306 0.9834124 0.9998557 -0.9915325 0.9834124 0.9998557 -0.9936856 0.9834124 0.9998557 -0.9964095 0.9834124 0.9998557 -0.9998557 0.9834124 0.9998557 -0.999886 0.9868502 0.997154 -0.9999099 0.9895818 0.9960345 -0.9999288 0.99175 0.995789 -0.9999437 0.9934694 0.9959966 -0.9834129 0.9834139 0.9998557 -0.9834129 0.9834139 0.9998557 -0.9834129 0.9834138 0.9998557 -0.9834129 0.9834138 0.9998557 -0.9834128 0.9834137 0.9998557 -0.9834128 0.9834136 0.9998557 -0.9834127 0.9834135 0.9998557 -0.9834127 0.9834133 0.9998557 -0.9834126 0.9834131 0.9998557 -0.9834125 0.9834129 0.9998557 -0.9834124 0.9834126 0.9998557 -0.9834123 0.9834123 0.9998557 -0.9834126 0.9834123 0.9998557 -0.9834129 0.9834123 0.9998557 -0.9834134 0.9834123 0.9998557 -0.983414 0.9834123 0.9998557 -0.9834147 0.9834123 0.9998557 -0.9834156 0.9834123 0.9998557 -0.9834168 0.9834123 0.9998557 -0.9834182 0.9834123 0.9998557 -0.9834201 0.9834123 0.9998557 -0.9834224 0.9834123 0.9998557 -0.9834254 0.9834123 0.9998557 -0.9834292 0.9834123 0.9998557 -0.9834339 0.9834123 0.9998557 -0.98344 0.9834123 0.9998557 -0.9834476 0.9834123 0.9998557 -0.9834572 0.9834123 0.9998557 -0.9834694 0.9834123 0.9998557 -0.9834848 0.9834123 0.9998557 -0.9835043 0.9834123 0.9998557 -0.983529 0.9834123 0.9998557 -0.9835603 0.9834123 0.9998557 -0.9835998 0.9834123 0.9998557 -0.9836498 0.9834123 0.9998557 -0.983713 0.9834123 0.9998557 -0.983793 0.9834123 0.9998557 -0.9838943 0.9834123 0.9998557 -0.9840223 0.9834123 0.9998557 -0.9841844 0.9834123 0.9998557 -0.9843894 0.9834123 0.9998557 -0.9846487 0.9834123 0.9998557 -0.9849768 0.9834123 0.9998557 -0.9853919 0.9834123 0.9998557 -0.985917 0.9834123 0.9998557 -0.9865813 0.9834123 0.9998557 -0.9874218 0.9834123 0.9998557 -0.9884852 0.9834123 0.9998557 -0.9898304 0.9834123 0.9998557 -0.9915323 0.9834123 0.9998557 -0.9936855 0.9834123 0.9998557 -0.9964095 0.9834123 0.9998557 -0.9998557 0.9834123 0.9998557 -0.999886 0.9868501 0.9971539 -0.9999099 0.9895818 0.9960344 -0.9999288 0.9917499 0.9957889 -0.9999437 0.9934694 0.9959966 -0.9834129 0.9834142 0.9998557 -0.9834129 0.9834142 0.9998557 -0.9834129 0.9834141 0.9998557 -0.9834129 0.983414 0.9998557 -0.9834128 0.983414 0.9998557 -0.9834128 0.9834139 0.9998557 -0.9834127 0.9834137 0.9998557 -0.9834127 0.9834136 0.9998557 -0.9834126 0.9834134 0.9998557 -0.9834125 0.9834132 0.9998557 -0.9834124 0.9834129 0.9998557 -0.9834123 0.9834126 0.9998557 -0.9834122 0.9834122 0.9998557 -0.9834126 0.9834122 0.9998557 -0.983413 0.9834122 0.9998557 -0.9834136 0.9834122 0.9998557 -0.9834143 0.9834122 0.9998557 -0.9834152 0.9834122 0.9998557 -0.9834164 0.9834122 0.9998557 -0.9834179 0.9834122 0.9998557 -0.9834197 0.9834122 0.9998557 -0.9834221 0.9834122 0.9998557 -0.9834251 0.9834122 0.9998557 -0.9834288 0.9834122 0.9998557 -0.9834336 0.9834122 0.9998557 -0.9834396 0.9834122 0.9998557 -0.9834472 0.9834122 0.9998557 -0.9834569 0.9834122 0.9998557 -0.9834691 0.9834122 0.9998557 -0.9834845 0.9834122 0.9998557 -0.983504 0.9834122 0.9998557 -0.9835287 0.9834122 0.9998557 -0.9835599 0.9834122 0.9998557 -0.9835994 0.9834122 0.9998557 -0.9836494 0.9834122 0.9998557 -0.9837127 0.9834122 0.9998557 -0.9837927 0.9834122 0.9998557 -0.9838939 0.9834122 0.9998557 -0.984022 0.9834122 0.9998557 -0.984184 0.9834122 0.9998557 -0.984389 0.9834122 0.9998557 -0.9846484 0.9834122 0.9998557 -0.9849765 0.9834122 0.9998557 -0.9853915 0.9834122 0.9998557 -0.9859167 0.9834122 0.9998557 -0.986581 0.9834122 0.9998557 -0.9874216 0.9834122 0.9998557 -0.9884849 0.9834122 0.9998557 -0.9898302 0.9834122 0.9998557 -0.9915321 0.9834122 0.9998557 -0.9936853 0.9834122 0.9998557 -0.9964094 0.9834122 0.9998557 -0.9998557 0.9834122 0.9998557 -0.999886 0.9868501 0.9971539 -0.9999099 0.9895817 0.9960344 -0.9999288 0.9917499 0.9957889 -0.9999437 0.9934694 0.9959965 -0.9834129 0.9834146 0.9998557 -0.9834129 0.9834145 0.9998557 -0.9834129 0.9834145 0.9998557 -0.9834129 0.9834144 0.9998557 -0.9834128 0.9834143 0.9998557 -0.9834128 0.9834142 0.9998557 -0.9834127 0.9834141 0.9998557 -0.9834127 0.9834139 0.9998557 -0.9834126 0.9834138 0.9998557 -0.9834125 0.9834135 0.9998557 -0.9834124 0.9834133 0.9998557 -0.9834123 0.9834129 0.9998557 -0.9834122 0.9834126 0.9998557 -0.9834122 0.9834122 0.9998557 -0.9834127 0.9834122 0.9998557 -0.9834132 0.9834122 0.9998557 -0.9834139 0.9834122 0.9998557 -0.9834149 0.9834122 0.9998557 -0.983416 0.9834122 0.9998557 -0.9834175 0.9834122 0.9998557 -0.9834194 0.9834122 0.9998557 -0.9834217 0.9834122 0.9998557 -0.9834247 0.9834122 0.9998557 -0.9834284 0.9834122 0.9998557 -0.9834332 0.9834122 0.9998557 -0.9834392 0.9834122 0.9998557 -0.9834468 0.9834122 0.9998557 -0.9834565 0.9834122 0.9998557 -0.9834687 0.9834122 0.9998557 -0.9834841 0.9834122 0.9998557 -0.9835036 0.9834122 0.9998557 -0.9835283 0.9834122 0.9998557 -0.9835595 0.9834122 0.9998557 -0.9835991 0.9834122 0.9998557 -0.9836491 0.9834122 0.9998557 -0.9837123 0.9834122 0.9998557 -0.9837923 0.9834122 0.9998557 -0.9838936 0.9834122 0.9998557 -0.9840216 0.9834122 0.9998557 -0.9841837 0.9834122 0.9998557 -0.9843887 0.9834122 0.9998557 -0.984648 0.9834122 0.9998557 -0.9849761 0.9834122 0.9998557 -0.9853912 0.9834122 0.9998557 -0.9859164 0.9834122 0.9998557 -0.9865807 0.9834122 0.9998557 -0.9874213 0.9834122 0.9998557 -0.9884846 0.9834122 0.9998557 -0.98983 0.9834122 0.9998557 -0.9915319 0.9834122 0.9998557 -0.9936852 0.9834122 0.9998557 -0.9964093 0.9834122 0.9998557 -0.9998557 0.9834122 0.9998557 -0.999886 0.98685 0.9971538 -0.9999099 0.9895817 0.9960343 -0.9999288 0.9917499 0.9957888 -0.9999437 0.9934694 0.9959965 -0.9834129 0.983415 0.9998557 -0.9834129 0.983415 0.9998557 -0.9834129 0.9834149 0.9998557 -0.9834129 0.9834149 0.9998557 -0.9834128 0.9834148 0.9998557 -0.9834128 0.9834147 0.9998557 -0.9834127 0.9834146 0.9998557 -0.9834127 0.9834144 0.9998557 -0.9834126 0.9834142 0.9998557 -0.9834125 0.983414 0.9998557 -0.9834124 0.9834137 0.9998557 -0.9834123 0.9834134 0.9998557 -0.9834122 0.983413 0.9998557 -0.9834122 0.9834127 0.9998557 -0.9834123 0.9834123 0.9998557 -0.9834129 0.9834123 0.9998557 -0.9834136 0.9834123 0.9998557 -0.9834145 0.9834123 0.9998557 -0.9834157 0.9834123 0.9998557 -0.9834171 0.9834123 0.9998557 -0.983419 0.9834123 0.9998557 -0.9834213 0.9834123 0.9998557 -0.9834243 0.9834123 0.9998557 -0.9834281 0.9834123 0.9998557 -0.9834328 0.9834123 0.9998557 -0.9834389 0.9834123 0.9998557 -0.9834465 0.9834123 0.9998557 -0.9834561 0.9834123 0.9998557 -0.9834683 0.9834123 0.9998557 -0.9834837 0.9834123 0.9998557 -0.9835032 0.9834123 0.9998557 -0.9835279 0.9834123 0.9998557 -0.9835592 0.9834123 0.9998557 -0.9835987 0.9834123 0.9998557 -0.9836487 0.9834123 0.9998557 -0.9837119 0.9834123 0.9998557 -0.983792 0.9834123 0.9998557 -0.9838932 0.9834123 0.9998557 -0.9840213 0.9834123 0.9998557 -0.9841833 0.9834123 0.9998557 -0.9843883 0.9834123 0.9998557 -0.9846477 0.9834123 0.9998557 -0.9849758 0.9834123 0.9998557 -0.9853909 0.9834123 0.9998557 -0.985916 0.9834123 0.9998557 -0.9865804 0.9834123 0.9998557 -0.987421 0.9834123 0.9998557 -0.9884844 0.9834123 0.9998557 -0.9898297 0.9834123 0.9998557 -0.9915318 0.9834123 0.9998557 -0.993685 0.9834123 0.9998557 -0.9964092 0.9834123 0.9998557 -0.9998557 0.9834123 0.9998557 -0.999886 0.9868501 0.9971538 -0.9999099 0.9895817 0.9960343 -0.9999288 0.9917499 0.9957888 -0.9999437 0.9934694 0.9959965 -0.9834129 0.9834156 0.9998557 -0.9834129 0.9834155 0.9998557 -0.9834129 0.9834155 0.9998557 -0.9834129 0.9834154 0.9998557 -0.9834128 0.9834153 0.9998557 -0.9834128 0.9834152 0.9998557 -0.9834127 0.9834151 0.9998557 -0.9834127 0.983415 0.9998557 -0.9834126 0.9834148 0.9998557 -0.9834125 0.9834146 0.9998557 -0.9834124 0.9834143 0.9998557 -0.9834123 0.983414 0.9998557 -0.9834122 0.9834136 0.9998557 -0.9834122 0.9834132 0.9998557 -0.9834123 0.9834129 0.9998557 -0.9834126 0.9834126 0.9998557 -0.9834133 0.9834126 0.9998557 -0.9834142 0.9834126 0.9998557 -0.9834154 0.9834126 0.9998557 -0.9834168 0.9834126 0.9998557 -0.9834187 0.9834126 0.9998557 -0.983421 0.9834126 0.9998557 -0.983424 0.9834126 0.9998557 -0.9834278 0.9834126 0.9998557 -0.9834325 0.9834126 0.9998557 -0.9834386 0.9834126 0.9998557 -0.9834462 0.9834126 0.9998557 -0.9834558 0.9834126 0.9998557 -0.983468 0.9834126 0.9998557 -0.9834834 0.9834126 0.9998557 -0.983503 0.9834126 0.9998557 -0.9835276 0.9834126 0.9998557 -0.9835589 0.9834126 0.9998557 -0.9835984 0.9834126 0.9998557 -0.9836484 0.9834126 0.9998557 -0.9837117 0.9834126 0.9998557 -0.9837917 0.9834126 0.9998557 -0.9838929 0.9834126 0.9998557 -0.984021 0.9834126 0.9998557 -0.984183 0.9834126 0.9998557 -0.984388 0.9834126 0.9998557 -0.9846474 0.9834126 0.9998557 -0.9849755 0.9834126 0.9998557 -0.9853906 0.9834126 0.9998557 -0.9859158 0.9834126 0.9998557 -0.9865802 0.9834126 0.9998557 -0.9874208 0.9834126 0.9998557 -0.9884842 0.9834126 0.9998557 -0.9898295 0.9834126 0.9998557 -0.9915316 0.9834126 0.9998557 -0.9936849 0.9834126 0.9998557 -0.9964092 0.9834126 0.9998557 -0.9998557 0.9834126 0.9998557 -0.999886 0.9868503 0.9971538 -0.9999099 0.9895819 0.9960342 -0.9999288 0.99175 0.9957887 -0.9999437 0.9934694 0.9959964 -0.9834129 0.9834163 0.9998557 -0.9834129 0.9834163 0.9998557 -0.9834129 0.9834162 0.9998557 -0.9834129 0.9834162 0.9998557 -0.9834128 0.9834161 0.9998557 -0.9834128 0.983416 0.9998557 -0.9834127 0.9834158 0.9998557 -0.9834127 0.9834157 0.9998557 -0.9834126 0.9834155 0.9998557 -0.9834125 0.9834153 0.9998557 -0.9834124 0.983415 0.9998557 -0.9834123 0.9834147 0.9998557 -0.9834122 0.9834143 0.9998557 -0.9834122 0.9834139 0.9998557 -0.9834123 0.9834136 0.9998557 -0.9834126 0.9834133 0.9998557 -0.9834132 0.9834132 0.9998557 -0.9834141 0.9834132 0.9998557 -0.9834153 0.9834132 0.9998557 -0.9834167 0.9834132 0.9998557 -0.9834186 0.9834132 0.9998557 -0.9834209 0.9834132 0.9998557 -0.9834239 0.9834132 0.9998557 -0.9834277 0.9834132 0.9998557 -0.9834324 0.9834132 0.9998557 -0.9834385 0.9834132 0.9998557 -0.9834461 0.9834132 0.9998557 -0.9834557 0.9834132 0.9998557 -0.9834679 0.9834132 0.9998557 -0.9834833 0.9834132 0.9998557 -0.9835029 0.9834132 0.9998557 -0.9835276 0.9834132 0.9998557 -0.9835588 0.9834132 0.9998557 -0.9835983 0.9834132 0.9998557 -0.9836483 0.9834132 0.9998557 -0.9837116 0.9834132 0.9998557 -0.9837916 0.9834132 0.9998557 -0.9838928 0.9834132 0.9998557 -0.9840209 0.9834132 0.9998557 -0.9841829 0.9834132 0.9998557 -0.984388 0.9834132 0.9998557 -0.9846473 0.9834132 0.9998557 -0.9849754 0.9834132 0.9998557 -0.9853905 0.9834132 0.9998557 -0.9859157 0.9834132 0.9998557 -0.9865801 0.9834132 0.9998557 -0.9874207 0.9834132 0.9998557 -0.9884841 0.9834132 0.9998557 -0.9898295 0.9834132 0.9998557 -0.9915316 0.9834132 0.9998557 -0.9936849 0.9834132 0.9998557 -0.9964092 0.9834132 0.9998557 -0.9998557 0.9834132 0.9998557 -0.999886 0.9868507 0.9971537 -0.9999099 0.9895821 0.9960342 -0.9999288 0.9917502 0.9957887 -0.9999437 0.9934695 0.9959964 -0.9834129 0.9834172 0.9998557 -0.9834129 0.9834172 0.9998557 -0.9834129 0.9834171 0.9998557 -0.9834129 0.9834171 0.9998557 -0.9834128 0.983417 0.9998557 -0.9834128 0.9834169 0.9998557 -0.9834127 0.9834168 0.9998557 -0.9834127 0.9834166 0.9998557 -0.9834126 0.9834164 0.9998557 -0.9834125 0.9834162 0.9998557 -0.9834124 0.9834159 0.9998557 -0.9834123 0.9834156 0.9998557 -0.9834122 0.9834152 0.9998557 -0.9834122 0.9834149 0.9998557 -0.9834123 0.9834145 0.9998557 -0.9834126 0.9834142 0.9998557 -0.9834132 0.9834141 0.9998557 -0.9834141 0.9834141 0.9998557 -0.9834153 0.9834141 0.9998557 -0.9834167 0.9834141 0.9998557 -0.9834186 0.9834141 0.9998557 -0.9834209 0.9834141 0.9998557 -0.9834239 0.9834141 0.9998557 -0.9834277 0.9834141 0.9998557 -0.9834324 0.9834141 0.9998557 -0.9834385 0.9834141 0.9998557 -0.9834461 0.9834141 0.9998557 -0.9834557 0.9834141 0.9998557 -0.9834679 0.9834141 0.9998557 -0.9834833 0.9834141 0.9998557 -0.9835029 0.9834141 0.9998557 -0.9835276 0.9834141 0.9998557 -0.9835588 0.9834141 0.9998557 -0.9835983 0.9834141 0.9998557 -0.9836483 0.9834141 0.9998557 -0.9837116 0.9834141 0.9998557 -0.9837916 0.9834141 0.9998557 -0.9838928 0.9834141 0.9998557 -0.9840209 0.9834141 0.9998557 -0.9841829 0.9834141 0.9998557 -0.984388 0.9834141 0.9998557 -0.9846473 0.9834141 0.9998557 -0.9849754 0.9834141 0.9998557 -0.9853905 0.9834141 0.9998557 -0.9859157 0.9834141 0.9998557 -0.9865801 0.9834141 0.9998557 -0.9874207 0.9834141 0.9998557 -0.9884841 0.9834141 0.9998557 -0.9898295 0.9834141 0.9998557 -0.9915316 0.9834141 0.9998557 -0.9936849 0.9834141 0.9998557 -0.9964092 0.9834141 0.9998557 -0.9998557 0.9834141 0.9998557 -0.999886 0.9868512 0.9971537 -0.9999099 0.9895825 0.9960342 -0.9999288 0.9917504 0.9957887 -0.9999437 0.9934697 0.9959964 -0.9834129 0.9834184 0.9998557 -0.9834129 0.9834184 0.9998557 -0.9834129 0.9834183 0.9998557 -0.9834129 0.9834182 0.9998557 -0.9834128 0.9834182 0.9998557 -0.9834128 0.9834181 0.9998557 -0.9834127 0.9834179 0.9998557 -0.9834127 0.9834178 0.9998557 -0.9834126 0.9834176 0.9998557 -0.9834125 0.9834174 0.9998557 -0.9834124 0.9834171 0.9998557 -0.9834123 0.9834168 0.9998557 -0.9834122 0.9834164 0.9998557 -0.9834122 0.983416 0.9998557 -0.9834123 0.9834157 0.9998557 -0.9834126 0.9834154 0.9998557 -0.9834132 0.9834153 0.9998557 -0.9834141 0.9834153 0.9998557 -0.9834153 0.9834153 0.9998557 -0.9834167 0.9834153 0.9998557 -0.9834186 0.9834153 0.9998557 -0.9834209 0.9834153 0.9998557 -0.9834239 0.9834153 0.9998557 -0.9834277 0.9834153 0.9998557 -0.9834324 0.9834153 0.9998557 -0.9834385 0.9834153 0.9998557 -0.9834461 0.9834153 0.9998557 -0.9834557 0.9834153 0.9998557 -0.9834679 0.9834153 0.9998557 -0.9834833 0.9834153 0.9998557 -0.9835029 0.9834153 0.9998557 -0.9835276 0.9834153 0.9998557 -0.9835588 0.9834153 0.9998557 -0.9835983 0.9834153 0.9998557 -0.9836483 0.9834153 0.9998557 -0.9837116 0.9834153 0.9998557 -0.9837916 0.9834153 0.9998557 -0.9838928 0.9834153 0.9998557 -0.9840209 0.9834153 0.9998557 -0.9841829 0.9834153 0.9998557 -0.984388 0.9834153 0.9998557 -0.9846473 0.9834153 0.9998557 -0.9849754 0.9834153 0.9998557 -0.9853905 0.9834153 0.9998557 -0.9859157 0.9834153 0.9998557 -0.9865801 0.9834153 0.9998557 -0.9874207 0.9834153 0.9998557 -0.9884841 0.9834153 0.9998557 -0.9898295 0.9834153 0.9998557 -0.9915316 0.9834153 0.9998557 -0.9936849 0.9834153 0.9998557 -0.9964092 0.9834153 0.9998557 -0.9998557 0.9834153 0.9998557 -0.999886 0.986852 0.9971537 -0.9999099 0.9895829 0.9960342 -0.9999288 0.9917507 0.9957887 -0.9999437 0.9934698 0.9959964 -0.9834129 0.9834199 0.9998557 -0.9834129 0.9834198 0.9998557 -0.9834129 0.9834198 0.9998557 -0.9834129 0.9834197 0.9998557 -0.9834128 0.9834196 0.9998557 -0.9834128 0.9834195 0.9998557 -0.9834127 0.9834194 0.9998557 -0.9834127 0.9834192 0.9998557 -0.9834126 0.9834191 0.9998557 -0.9834125 0.9834188 0.9998557 -0.9834124 0.9834186 0.9998557 -0.9834123 0.9834182 0.9998557 -0.9834122 0.9834179 0.9998557 -0.9834122 0.9834175 0.9998557 -0.9834123 0.9834171 0.9998557 -0.9834126 0.9834168 0.9998557 -0.9834132 0.9834167 0.9998557 -0.9834141 0.9834167 0.9998557 -0.9834153 0.9834167 0.9998557 -0.9834167 0.9834167 0.9998557 -0.9834186 0.9834167 0.9998557 -0.9834209 0.9834167 0.9998557 -0.9834239 0.9834167 0.9998557 -0.9834277 0.9834167 0.9998557 -0.9834324 0.9834167 0.9998557 -0.9834385 0.9834167 0.9998557 -0.9834461 0.9834167 0.9998557 -0.9834557 0.9834167 0.9998557 -0.9834679 0.9834167 0.9998557 -0.9834833 0.9834167 0.9998557 -0.9835029 0.9834167 0.9998557 -0.9835276 0.9834167 0.9998557 -0.9835588 0.9834167 0.9998557 -0.9835983 0.9834167 0.9998557 -0.9836483 0.9834167 0.9998557 -0.9837116 0.9834167 0.9998557 -0.9837916 0.9834167 0.9998557 -0.9838928 0.9834167 0.9998557 -0.9840209 0.9834167 0.9998557 -0.9841829 0.9834167 0.9998557 -0.984388 0.9834167 0.9998557 -0.9846473 0.9834167 0.9998557 -0.9849754 0.9834167 0.9998557 -0.9853905 0.9834167 0.9998557 -0.9859157 0.9834167 0.9998557 -0.9865801 0.9834167 0.9998557 -0.9874207 0.9834167 0.9998557 -0.9884841 0.9834167 0.9998557 -0.9898295 0.9834167 0.9998557 -0.9915316 0.9834167 0.9998557 -0.9936849 0.9834167 0.9998557 -0.9964092 0.9834167 0.9998557 -0.9998557 0.9834167 0.9998557 -0.999886 0.9868529 0.9971537 -0.9999099 0.9895835 0.9960342 -0.9999288 0.991751 0.9957887 -0.9999437 0.9934701 0.9959964 -0.9834129 0.9834217 0.9998557 -0.9834129 0.9834217 0.9998557 -0.9834129 0.9834216 0.9998557 -0.9834129 0.9834216 0.9998557 -0.9834128 0.9834215 0.9998557 -0.9834128 0.9834214 0.9998557 -0.9834127 0.9834213 0.9998557 -0.9834127 0.9834211 0.9998557 -0.9834126 0.9834209 0.9998557 -0.9834125 0.9834207 0.9998557 -0.9834124 0.9834204 0.9998557 -0.9834123 0.9834201 0.9998557 -0.9834122 0.9834197 0.9998557 -0.9834122 0.9834194 0.9998557 -0.9834123 0.983419 0.9998557 -0.9834126 0.9834187 0.9998557 -0.9834132 0.9834186 0.9998557 -0.9834141 0.9834186 0.9998557 -0.9834153 0.9834186 0.9998557 -0.9834167 0.9834186 0.9998557 -0.9834186 0.9834186 0.9998557 -0.9834209 0.9834186 0.9998557 -0.9834239 0.9834186 0.9998557 -0.9834277 0.9834186 0.9998557 -0.9834324 0.9834186 0.9998557 -0.9834385 0.9834186 0.9998557 -0.9834461 0.9834186 0.9998557 -0.9834557 0.9834186 0.9998557 -0.9834679 0.9834186 0.9998557 -0.9834833 0.9834186 0.9998557 -0.9835029 0.9834186 0.9998557 -0.9835276 0.9834186 0.9998557 -0.9835588 0.9834186 0.9998557 -0.9835983 0.9834186 0.9998557 -0.9836483 0.9834186 0.9998557 -0.9837116 0.9834186 0.9998557 -0.9837916 0.9834186 0.9998557 -0.9838928 0.9834186 0.9998557 -0.9840209 0.9834186 0.9998557 -0.9841829 0.9834186 0.9998557 -0.984388 0.9834186 0.9998557 -0.9846473 0.9834186 0.9998557 -0.9849754 0.9834186 0.9998557 -0.9853905 0.9834186 0.9998557 -0.9859157 0.9834186 0.9998557 -0.9865801 0.9834186 0.9998557 -0.9874207 0.9834186 0.9998557 -0.9884841 0.9834186 0.9998557 -0.9898295 0.9834186 0.9998557 -0.9915316 0.9834186 0.9998557 -0.9936849 0.9834186 0.9998557 -0.9964092 0.9834186 0.9998557 -0.9998557 0.9834186 0.9998557 -0.999886 0.9868541 0.9971537 -0.9999099 0.9895842 0.9960342 -0.9999288 0.9917515 0.9957887 -0.9999437 0.9934704 0.9959964 -0.9834129 0.9834241 0.9998557 -0.9834129 0.983424 0.9998557 -0.9834129 0.983424 0.9998557 -0.9834129 0.9834239 0.9998557 -0.9834128 0.9834238 0.9998557 -0.9834128 0.9834237 0.9998557 -0.9834127 0.9834236 0.9998557 -0.9834127 0.9834234 0.9998557 -0.9834126 0.9834233 0.9998557 -0.9834125 0.983423 0.9998557 -0.9834124 0.9834228 0.9998557 -0.9834123 0.9834224 0.9998557 -0.9834122 0.9834221 0.9998557 -0.9834122 0.9834217 0.9998557 -0.9834123 0.9834213 0.9998557 -0.9834126 0.983421 0.9998557 -0.9834132 0.9834209 0.9998557 -0.9834141 0.9834209 0.9998557 -0.9834153 0.9834209 0.9998557 -0.9834167 0.9834209 0.9998557 -0.9834186 0.9834209 0.9998557 -0.9834209 0.9834209 0.9998557 -0.9834239 0.9834209 0.9998557 -0.9834277 0.9834209 0.9998557 -0.9834324 0.9834209 0.9998557 -0.9834385 0.9834209 0.9998557 -0.9834461 0.9834209 0.9998557 -0.9834557 0.9834209 0.9998557 -0.9834679 0.9834209 0.9998557 -0.9834833 0.9834209 0.9998557 -0.9835029 0.9834209 0.9998557 -0.9835276 0.9834209 0.9998557 -0.9835588 0.9834209 0.9998557 -0.9835983 0.9834209 0.9998557 -0.9836483 0.9834209 0.9998557 -0.9837116 0.9834209 0.9998557 -0.9837916 0.9834209 0.9998557 -0.9838928 0.9834209 0.9998557 -0.9840209 0.9834209 0.9998557 -0.9841829 0.9834209 0.9998557 -0.984388 0.9834209 0.9998557 -0.9846473 0.9834209 0.9998557 -0.9849754 0.9834209 0.9998557 -0.9853905 0.9834209 0.9998557 -0.9859157 0.9834209 0.9998557 -0.9865801 0.9834209 0.9998557 -0.9874207 0.9834209 0.9998557 -0.9884841 0.9834209 0.9998557 -0.9898295 0.9834209 0.9998557 -0.9915316 0.9834209 0.9998557 -0.9936849 0.9834209 0.9998557 -0.9964092 0.9834209 0.9998557 -0.9998557 0.9834209 0.9998557 -0.999886 0.9868555 0.9971537 -0.9999099 0.9895851 0.9960342 -0.9999288 0.9917521 0.9957887 -0.9999437 0.9934707 0.9959964 -0.9834129 0.983427 0.9998557 -0.9834129 0.983427 0.9998557 -0.9834129 0.9834269 0.9998557 -0.9834129 0.9834269 0.9998557 -0.9834128 0.9834268 0.9998557 -0.9834128 0.9834267 0.9998557 -0.9834127 0.9834266 0.9998557 -0.9834127 0.9834264 0.9998557 -0.9834126 0.9834262 0.9998557 -0.9834125 0.983426 0.9998557 -0.9834124 0.9834257 0.9998557 -0.9834123 0.9834254 0.9998557 -0.9834122 0.9834251 0.9998557 -0.9834122 0.9834247 0.9998557 -0.9834123 0.9834243 0.9998557 -0.9834126 0.983424 0.9998557 -0.9834132 0.9834239 0.9998557 -0.9834141 0.9834239 0.9998557 -0.9834153 0.9834239 0.9998557 -0.9834167 0.9834239 0.9998557 -0.9834186 0.9834239 0.9998557 -0.9834209 0.9834239 0.9998557 -0.9834239 0.9834239 0.9998557 -0.9834277 0.9834239 0.9998557 -0.9834324 0.9834239 0.9998557 -0.9834385 0.9834239 0.9998557 -0.9834461 0.9834239 0.9998557 -0.9834557 0.9834239 0.9998557 -0.9834679 0.9834239 0.9998557 -0.9834833 0.9834239 0.9998557 -0.9835029 0.9834239 0.9998557 -0.9835276 0.9834239 0.9998557 -0.9835588 0.9834239 0.9998557 -0.9835983 0.9834239 0.9998557 -0.9836483 0.9834239 0.9998557 -0.9837116 0.9834239 0.9998557 -0.9837916 0.9834239 0.9998557 -0.9838928 0.9834239 0.9998557 -0.9840209 0.9834239 0.9998557 -0.9841829 0.9834239 0.9998557 -0.984388 0.9834239 0.9998557 -0.9846473 0.9834239 0.9998557 -0.9849754 0.9834239 0.9998557 -0.9853905 0.9834239 0.9998557 -0.9859157 0.9834239 0.9998557 -0.9865801 0.9834239 0.9998557 -0.9874207 0.9834239 0.9998557 -0.9884841 0.9834239 0.9998557 -0.9898295 0.9834239 0.9998557 -0.9915316 0.9834239 0.9998557 -0.9936849 0.9834239 0.9998557 -0.9964092 0.9834239 0.9998557 -0.9998557 0.9834239 0.9998557 -0.999886 0.9868574 0.9971537 -0.9999099 0.9895863 0.9960342 -0.9999288 0.9917528 0.9957887 -0.9999437 0.9934712 0.9959964 -0.9834129 0.9834308 0.9998557 -0.9834129 0.9834308 0.9998557 -0.9834129 0.9834307 0.9998557 -0.9834129 0.9834306 0.9998557 -0.9834128 0.9834306 0.9998557 -0.9834128 0.9834305 0.9998557 -0.9834127 0.9834303 0.9998557 -0.9834127 0.9834302 0.9998557 -0.9834126 0.98343 0.9998557 -0.9834125 0.9834298 0.9998557 -0.9834124 0.9834295 0.9998557 -0.9834123 0.9834292 0.9998557 -0.9834122 0.9834288 0.9998557 -0.9834122 0.9834284 0.9998557 -0.9834123 0.9834281 0.9998557 -0.9834126 0.9834278 0.9998557 -0.9834132 0.9834277 0.9998557 -0.9834141 0.9834277 0.9998557 -0.9834153 0.9834277 0.9998557 -0.9834167 0.9834277 0.9998557 -0.9834186 0.9834277 0.9998557 -0.9834209 0.9834277 0.9998557 -0.9834239 0.9834277 0.9998557 -0.9834277 0.9834277 0.9998557 -0.9834324 0.9834277 0.9998557 -0.9834385 0.9834277 0.9998557 -0.9834461 0.9834277 0.9998557 -0.9834557 0.9834277 0.9998557 -0.9834679 0.9834277 0.9998557 -0.9834833 0.9834277 0.9998557 -0.9835029 0.9834277 0.9998557 -0.9835276 0.9834277 0.9998557 -0.9835588 0.9834277 0.9998557 -0.9835983 0.9834277 0.9998557 -0.9836483 0.9834277 0.9998557 -0.9837116 0.9834277 0.9998557 -0.9837916 0.9834277 0.9998557 -0.9838928 0.9834277 0.9998557 -0.9840209 0.9834277 0.9998557 -0.9841829 0.9834277 0.9998557 -0.984388 0.9834277 0.9998557 -0.9846473 0.9834277 0.9998557 -0.9849754 0.9834277 0.9998557 -0.9853905 0.9834277 0.9998557 -0.9859157 0.9834277 0.9998557 -0.9865801 0.9834277 0.9998557 -0.9874207 0.9834277 0.9998557 -0.9884841 0.9834277 0.9998557 -0.9898295 0.9834277 0.9998557 -0.9915316 0.9834277 0.9998557 -0.9936849 0.9834277 0.9998557 -0.9964092 0.9834277 0.9998557 -0.9998557 0.9834277 0.9998557 -0.999886 0.9868597 0.9971537 -0.9999099 0.9895878 0.9960342 -0.9999288 0.9917537 0.9957887 -0.9999437 0.9934718 0.9959964 -0.9834129 0.9834356 0.9998557 -0.9834129 0.9834355 0.9998557 -0.9834129 0.9834355 0.9998557 -0.9834129 0.9834354 0.9998557 -0.9834128 0.9834353 0.9998557 -0.9834128 0.9834352 0.9998557 -0.9834127 0.9834351 0.9998557 -0.9834127 0.9834349 0.9998557 -0.9834126 0.9834348 0.9998557 -0.9834125 0.9834345 0.9998557 -0.9834124 0.9834343 0.9998557 -0.9834123 0.9834339 0.9998557 -0.9834122 0.9834336 0.9998557 -0.9834122 0.9834332 0.9998557 -0.9834123 0.9834328 0.9998557 -0.9834126 0.9834325 0.9998557 -0.9834132 0.9834324 0.9998557 -0.9834141 0.9834324 0.9998557 -0.9834153 0.9834324 0.9998557 -0.9834167 0.9834324 0.9998557 -0.9834186 0.9834324 0.9998557 -0.9834209 0.9834324 0.9998557 -0.9834239 0.9834324 0.9998557 -0.9834277 0.9834324 0.9998557 -0.9834324 0.9834324 0.9998557 -0.9834385 0.9834324 0.9998557 -0.9834461 0.9834324 0.9998557 -0.9834557 0.9834324 0.9998557 -0.9834679 0.9834324 0.9998557 -0.9834833 0.9834324 0.9998557 -0.9835029 0.9834324 0.9998557 -0.9835276 0.9834324 0.9998557 -0.9835588 0.9834324 0.9998557 -0.9835983 0.9834324 0.9998557 -0.9836483 0.9834324 0.9998557 -0.9837116 0.9834324 0.9998557 -0.9837916 0.9834324 0.9998557 -0.9838928 0.9834324 0.9998557 -0.9840209 0.9834324 0.9998557 -0.9841829 0.9834324 0.9998557 -0.984388 0.9834324 0.9998557 -0.9846473 0.9834324 0.9998557 -0.9849754 0.9834324 0.9998557 -0.9853905 0.9834324 0.9998557 -0.9859157 0.9834324 0.9998557 -0.9865801 0.9834324 0.9998557 -0.9874207 0.9834324 0.9998557 -0.9884841 0.9834324 0.9998557 -0.9898295 0.9834324 0.9998557 -0.9915316 0.9834324 0.9998557 -0.9936849 0.9834324 0.9998557 -0.9964092 0.9834324 0.9998557 -0.9998557 0.9834324 0.9998557 -0.999886 0.9868627 0.9971537 -0.9999099 0.9895897 0.9960342 -0.9999288 0.9917549 0.9957887 -0.9999437 0.9934725 0.9959964 -0.9834129 0.9834416 0.9998557 -0.9834129 0.9834415 0.9998557 -0.9834129 0.9834415 0.9998557 -0.9834129 0.9834414 0.9998557 -0.9834128 0.9834413 0.9998557 -0.9834128 0.9834412 0.9998557 -0.9834127 0.9834411 0.9998557 -0.9834127 0.983441 0.9998557 -0.9834126 0.9834408 0.9998557 -0.9834125 0.9834405 0.9998557 -0.9834124 0.9834403 0.9998557 -0.9834123 0.98344 0.9998557 -0.9834122 0.9834396 0.9998557 -0.9834122 0.9834392 0.9998557 -0.9834123 0.9834389 0.9998557 -0.9834126 0.9834386 0.9998557 -0.9834132 0.9834385 0.9998557 -0.9834141 0.9834385 0.9998557 -0.9834153 0.9834385 0.9998557 -0.9834167 0.9834385 0.9998557 -0.9834186 0.9834385 0.9998557 -0.9834209 0.9834385 0.9998557 -0.9834239 0.9834385 0.9998557 -0.9834277 0.9834385 0.9998557 -0.9834324 0.9834385 0.9998557 -0.9834385 0.9834385 0.9998557 -0.9834461 0.9834385 0.9998557 -0.9834557 0.9834385 0.9998557 -0.9834679 0.9834385 0.9998557 -0.9834833 0.9834385 0.9998557 -0.9835029 0.9834385 0.9998557 -0.9835276 0.9834385 0.9998557 -0.9835588 0.9834385 0.9998557 -0.9835983 0.9834385 0.9998557 -0.9836483 0.9834385 0.9998557 -0.9837116 0.9834385 0.9998557 -0.9837916 0.9834385 0.9998557 -0.9838928 0.9834385 0.9998557 -0.9840209 0.9834385 0.9998557 -0.9841829 0.9834385 0.9998557 -0.984388 0.9834385 0.9998557 -0.9846473 0.9834385 0.9998557 -0.9849754 0.9834385 0.9998557 -0.9853905 0.9834385 0.9998557 -0.9859157 0.9834385 0.9998557 -0.9865801 0.9834385 0.9998557 -0.9874207 0.9834385 0.9998557 -0.9884841 0.9834385 0.9998557 -0.9898295 0.9834385 0.9998557 -0.9915316 0.9834385 0.9998557 -0.9936849 0.9834385 0.9998557 -0.9964092 0.9834385 0.9998557 -0.9998557 0.9834385 0.9998557 -0.999886 0.9868665 0.9971537 -0.9999099 0.989592 0.9960342 -0.9999288 0.9917564 0.9957887 -0.9999437 0.9934734 0.9959964 -0.9834129 0.9834492 0.9998557 -0.9834129 0.9834492 0.9998557 -0.9834129 0.9834491 0.9998557 -0.9834129 0.983449 0.9998557 -0.9834128 0.983449 0.9998557 -0.9834128 0.9834489 0.9998557 -0.9834127 0.9834487 0.9998557 -0.9834127 0.9834486 0.9998557 -0.9834126 0.9834484 0.9998557 -0.9834125 0.9834482 0.9998557 -0.9834124 0.9834479 0.9998557 -0.9834123 0.9834476 0.9998557 -0.9834122 0.9834472 0.9998557 -0.9834122 0.9834468 0.9998557 -0.9834123 0.9834465 0.9998557 -0.9834126 0.9834462 0.9998557 -0.9834132 0.9834461 0.9998557 -0.9834141 0.9834461 0.9998557 -0.9834153 0.9834461 0.9998557 -0.9834167 0.9834461 0.9998557 -0.9834186 0.9834461 0.9998557 -0.9834209 0.9834461 0.9998557 -0.9834239 0.9834461 0.9998557 -0.9834277 0.9834461 0.9998557 -0.9834324 0.9834461 0.9998557 -0.9834385 0.9834461 0.9998557 -0.9834461 0.9834461 0.9998557 -0.9834557 0.9834461 0.9998557 -0.9834679 0.9834461 0.9998557 -0.9834833 0.9834461 0.9998557 -0.9835029 0.9834461 0.9998557 -0.9835276 0.9834461 0.9998557 -0.9835588 0.9834461 0.9998557 -0.9835983 0.9834461 0.9998557 -0.9836483 0.9834461 0.9998557 -0.9837116 0.9834461 0.9998557 -0.9837916 0.9834461 0.9998557 -0.9838928 0.9834461 0.9998557 -0.9840209 0.9834461 0.9998557 -0.9841829 0.9834461 0.9998557 -0.984388 0.9834461 0.9998557 -0.9846473 0.9834461 0.9998557 -0.9849754 0.9834461 0.9998557 -0.9853905 0.9834461 0.9998557 -0.9859157 0.9834461 0.9998557 -0.9865801 0.9834461 0.9998557 -0.9874207 0.9834461 0.9998557 -0.9884841 0.9834461 0.9998557 -0.9898295 0.9834461 0.9998557 -0.9915316 0.9834461 0.9998557 -0.9936849 0.9834461 0.9998557 -0.9964092 0.9834461 0.9998557 -0.9998557 0.9834461 0.9998557 -0.999886 0.9868713 0.9971537 -0.9999099 0.989595 0.9960342 -0.9999288 0.9917582 0.9957887 -0.9999437 0.9934746 0.9959964 -0.9834129 0.9834588 0.9998557 -0.9834129 0.9834588 0.9998557 -0.9834129 0.9834587 0.9998557 -0.9834129 0.9834587 0.9998557 -0.9834128 0.9834586 0.9998557 -0.9834128 0.9834585 0.9998557 -0.9834127 0.9834584 0.9998557 -0.9834127 0.9834582 0.9998557 -0.9834126 0.983458 0.9998557 -0.9834125 0.9834578 0.9998557 -0.9834124 0.9834575 0.9998557 -0.9834123 0.9834572 0.9998557 -0.9834122 0.9834569 0.9998557 -0.9834122 0.9834565 0.9998557 -0.9834123 0.9834561 0.9998557 -0.9834126 0.9834558 0.9998557 -0.9834132 0.9834557 0.9998557 -0.9834141 0.9834557 0.9998557 -0.9834153 0.9834557 0.9998557 -0.9834167 0.9834557 0.9998557 -0.9834186 0.9834557 0.9998557 -0.9834209 0.9834557 0.9998557 -0.9834239 0.9834557 0.9998557 -0.9834277 0.9834557 0.9998557 -0.9834324 0.9834557 0.9998557 -0.9834385 0.9834557 0.9998557 -0.9834461 0.9834557 0.9998557 -0.9834557 0.9834557 0.9998557 -0.9834679 0.9834557 0.9998557 -0.9834833 0.9834557 0.9998557 -0.9835029 0.9834557 0.9998557 -0.9835276 0.9834557 0.9998557 -0.9835588 0.9834557 0.9998557 -0.9835983 0.9834557 0.9998557 -0.9836483 0.9834557 0.9998557 -0.9837116 0.9834557 0.9998557 -0.9837916 0.9834557 0.9998557 -0.9838928 0.9834557 0.9998557 -0.9840209 0.9834557 0.9998557 -0.9841829 0.9834557 0.9998557 -0.984388 0.9834557 0.9998557 -0.9846473 0.9834557 0.9998557 -0.9849754 0.9834557 0.9998557 -0.9853905 0.9834557 0.9998557 -0.9859157 0.9834557 0.9998557 -0.9865801 0.9834557 0.9998557 -0.9874207 0.9834557 0.9998557 -0.9884841 0.9834557 0.9998557 -0.9898295 0.9834557 0.9998557 -0.9915316 0.9834557 0.9998557 -0.9936849 0.9834557 0.9998557 -0.9964092 0.9834557 0.9998557 -0.9998557 0.9834557 0.9998557 -0.999886 0.9868773 0.9971537 -0.9999099 0.9895988 0.9960342 -0.9999288 0.9917606 0.9957887 -0.9999437 0.9934761 0.9959964 -0.9834129 0.983471 0.9998557 -0.9834129 0.983471 0.9998557 -0.9834129 0.9834709 0.9998557 -0.9834129 0.9834709 0.9998557 -0.9834128 0.9834708 0.9998557 -0.9834128 0.9834707 0.9998557 -0.9834127 0.9834706 0.9998557 -0.9834127 0.9834704 0.9998557 -0.9834126 0.9834702 0.9998557 -0.9834125 0.98347 0.9998557 -0.9834124 0.9834697 0.9998557 -0.9834123 0.9834694 0.9998557 -0.9834122 0.9834691 0.9998557 -0.9834122 0.9834687 0.9998557 -0.9834123 0.9834683 0.9998557 -0.9834126 0.983468 0.9998557 -0.9834132 0.9834679 0.9998557 -0.9834141 0.9834679 0.9998557 -0.9834153 0.9834679 0.9998557 -0.9834167 0.9834679 0.9998557 -0.9834186 0.9834679 0.9998557 -0.9834209 0.9834679 0.9998557 -0.9834239 0.9834679 0.9998557 -0.9834277 0.9834679 0.9998557 -0.9834324 0.9834679 0.9998557 -0.9834385 0.9834679 0.9998557 -0.9834461 0.9834679 0.9998557 -0.9834557 0.9834679 0.9998557 -0.9834679 0.9834679 0.9998557 -0.9834833 0.9834679 0.9998557 -0.9835029 0.9834679 0.9998557 -0.9835276 0.9834679 0.9998557 -0.9835588 0.9834679 0.9998557 -0.9835983 0.9834679 0.9998557 -0.9836483 0.9834679 0.9998557 -0.9837116 0.9834679 0.9998557 -0.9837916 0.9834679 0.9998557 -0.9838928 0.9834679 0.9998557 -0.9840209 0.9834679 0.9998557 -0.9841829 0.9834679 0.9998557 -0.984388 0.9834679 0.9998557 -0.9846473 0.9834679 0.9998557 -0.9849754 0.9834679 0.9998557 -0.9853905 0.9834679 0.9998557 -0.9859157 0.9834679 0.9998557 -0.9865801 0.9834679 0.9998557 -0.9874207 0.9834679 0.9998557 -0.9884841 0.9834679 0.9998557 -0.9898295 0.9834679 0.9998557 -0.9915316 0.9834679 0.9998557 -0.9936849 0.9834679 0.9998557 -0.9964092 0.9834679 0.9998557 -0.9998557 0.9834679 0.9998557 -0.999886 0.986885 0.9971537 -0.9999099 0.9896036 0.9960342 -0.9999288 0.9917636 0.9957887 -0.9999437 0.9934779 0.9959964 -0.9834129 0.9834865 0.9998557 -0.9834129 0.9834864 0.9998557 -0.9834129 0.9834864 0.9998557 -0.9834129 0.9834863 0.9998557 -0.9834128 0.9834862 0.9998557 -0.9834128 0.9834861 0.9998557 -0.9834127 0.983486 0.9998557 -0.9834127 0.9834858 0.9998557 -0.9834126 0.9834856 0.9998557 -0.9834125 0.9834854 0.9998557 -0.9834124 0.9834851 0.9998557 -0.9834123 0.9834848 0.9998557 -0.9834122 0.9834845 0.9998557 -0.9834122 0.9834841 0.9998557 -0.9834123 0.9834837 0.9998557 -0.9834126 0.9834834 0.9998557 -0.9834132 0.9834833 0.9998557 -0.9834141 0.9834833 0.9998557 -0.9834153 0.9834833 0.9998557 -0.9834167 0.9834833 0.9998557 -0.9834186 0.9834833 0.9998557 -0.9834209 0.9834833 0.9998557 -0.9834239 0.9834833 0.9998557 -0.9834277 0.9834833 0.9998557 -0.9834324 0.9834833 0.9998557 -0.9834385 0.9834833 0.9998557 -0.9834461 0.9834833 0.9998557 -0.9834557 0.9834833 0.9998557 -0.9834679 0.9834833 0.9998557 -0.9834833 0.9834833 0.9998557 -0.9835029 0.9834833 0.9998557 -0.9835276 0.9834833 0.9998557 -0.9835588 0.9834833 0.9998557 -0.9835983 0.9834833 0.9998557 -0.9836483 0.9834833 0.9998557 -0.9837116 0.9834833 0.9998557 -0.9837916 0.9834833 0.9998557 -0.9838928 0.9834833 0.9998557 -0.9840209 0.9834833 0.9998557 -0.9841829 0.9834833 0.9998557 -0.984388 0.9834833 0.9998557 -0.9846473 0.9834833 0.9998557 -0.9849754 0.9834833 0.9998557 -0.9853905 0.9834833 0.9998557 -0.9859157 0.9834833 0.9998557 -0.9865801 0.9834833 0.9998557 -0.9874207 0.9834833 0.9998557 -0.9884841 0.9834833 0.9998557 -0.9898295 0.9834833 0.9998557 -0.9915316 0.9834833 0.9998557 -0.9936849 0.9834833 0.9998557 -0.9964092 0.9834833 0.9998557 -0.9998557 0.9834833 0.9998557 -0.999886 0.9868946 0.9971537 -0.9999099 0.9896096 0.9960342 -0.9999288 0.9917674 0.9957887 -0.9999437 0.9934803 0.9959964 -0.9834129 0.983506 0.9998557 -0.9834129 0.9835059 0.9998557 -0.9834129 0.9835059 0.9998557 -0.9834129 0.9835058 0.9998557 -0.9834128 0.9835057 0.9998557 -0.9834128 0.9835056 0.9998557 -0.9834127 0.9835055 0.9998557 -0.9834127 0.9835053 0.9998557 -0.9834126 0.9835052 0.9998557 -0.9834125 0.9835049 0.9998557 -0.9834124 0.9835047 0.9998557 -0.9834123 0.9835043 0.9998557 -0.9834122 0.983504 0.9998557 -0.9834122 0.9835036 0.9998557 -0.9834123 0.9835032 0.9998557 -0.9834126 0.983503 0.9998557 -0.9834132 0.9835029 0.9998557 -0.9834141 0.9835029 0.9998557 -0.9834153 0.9835029 0.9998557 -0.9834167 0.9835029 0.9998557 -0.9834186 0.9835029 0.9998557 -0.9834209 0.9835029 0.9998557 -0.9834239 0.9835029 0.9998557 -0.9834277 0.9835029 0.9998557 -0.9834324 0.9835029 0.9998557 -0.9834385 0.9835029 0.9998557 -0.9834461 0.9835029 0.9998557 -0.9834557 0.9835029 0.9998557 -0.9834679 0.9835029 0.9998557 -0.9834833 0.9835029 0.9998557 -0.9835029 0.9835029 0.9998557 -0.9835276 0.9835029 0.9998557 -0.9835588 0.9835029 0.9998557 -0.9835983 0.9835029 0.9998557 -0.9836483 0.9835029 0.9998557 -0.9837116 0.9835029 0.9998557 -0.9837916 0.9835029 0.9998557 -0.9838928 0.9835029 0.9998557 -0.9840209 0.9835029 0.9998557 -0.9841829 0.9835029 0.9998557 -0.984388 0.9835029 0.9998557 -0.9846473 0.9835029 0.9998557 -0.9849754 0.9835029 0.9998557 -0.9853905 0.9835029 0.9998557 -0.9859157 0.9835029 0.9998557 -0.9865801 0.9835029 0.9998557 -0.9874207 0.9835029 0.9998557 -0.9884841 0.9835029 0.9998557 -0.9898295 0.9835029 0.9998557 -0.9915316 0.9835029 0.9998557 -0.9936849 0.9835029 0.9998557 -0.9964092 0.9835029 0.9998557 -0.9998557 0.9835029 0.9998557 -0.999886 0.9869069 0.9971537 -0.9999099 0.9896173 0.9960342 -0.9999288 0.9917722 0.9957887 -0.9999437 0.9934833 0.9959964 -0.9834129 0.9835307 0.9998557 -0.9834129 0.9835306 0.9998557 -0.9834129 0.9835306 0.9998557 -0.9834129 0.9835305 0.9998557 -0.9834128 0.9835304 0.9998557 -0.9834128 0.9835303 0.9998557 -0.9834127 0.9835302 0.9998557 -0.9834127 0.98353 0.9998557 -0.9834126 0.9835298 0.9998557 -0.9834125 0.9835296 0.9998557 -0.9834124 0.9835294 0.9998557 -0.9834123 0.983529 0.9998557 -0.9834122 0.9835287 0.9998557 -0.9834122 0.9835283 0.9998557 -0.9834123 0.9835279 0.9998557 -0.9834126 0.9835276 0.9998557 -0.9834132 0.9835276 0.9998557 -0.9834141 0.9835276 0.9998557 -0.9834153 0.9835276 0.9998557 -0.9834167 0.9835276 0.9998557 -0.9834186 0.9835276 0.9998557 -0.9834209 0.9835276 0.9998557 -0.9834239 0.9835276 0.9998557 -0.9834277 0.9835276 0.9998557 -0.9834324 0.9835276 0.9998557 -0.9834385 0.9835276 0.9998557 -0.9834461 0.9835276 0.9998557 -0.9834557 0.9835276 0.9998557 -0.9834679 0.9835276 0.9998557 -0.9834833 0.9835276 0.9998557 -0.9835029 0.9835276 0.9998557 -0.9835276 0.9835276 0.9998557 -0.9835588 0.9835276 0.9998557 -0.9835983 0.9835276 0.9998557 -0.9836483 0.9835276 0.9998557 -0.9837116 0.9835276 0.9998557 -0.9837916 0.9835276 0.9998557 -0.9838928 0.9835276 0.9998557 -0.9840209 0.9835276 0.9998557 -0.9841829 0.9835276 0.9998557 -0.984388 0.9835276 0.9998557 -0.9846473 0.9835276 0.9998557 -0.9849754 0.9835276 0.9998557 -0.9853905 0.9835276 0.9998557 -0.9859157 0.9835276 0.9998557 -0.9865801 0.9835276 0.9998557 -0.9874207 0.9835276 0.9998557 -0.9884841 0.9835276 0.9998557 -0.9898295 0.9835276 0.9998557 -0.9915316 0.9835276 0.9998557 -0.9936849 0.9835276 0.9998557 -0.9964092 0.9835276 0.9998557 -0.9998557 0.9835276 0.9998557 -0.999886 0.9869223 0.9971537 -0.9999099 0.989627 0.9960342 -0.9999288 0.9917782 0.9957887 -0.9999437 0.9934871 0.9959964 -0.9834129 0.9835619 0.9998557 -0.9834129 0.9835618 0.9998557 -0.9834129 0.9835618 0.9998557 -0.9834129 0.9835617 0.9998557 -0.9834128 0.9835616 0.9998557 -0.9834128 0.9835615 0.9998557 -0.9834127 0.9835614 0.9998557 -0.9834127 0.9835613 0.9998557 -0.9834126 0.9835611 0.9998557 -0.9834125 0.9835609 0.9998557 -0.9834124 0.9835606 0.9998557 -0.9834123 0.9835603 0.9998557 -0.9834122 0.9835599 0.9998557 -0.9834122 0.9835595 0.9998557 -0.9834123 0.9835592 0.9998557 -0.9834126 0.9835589 0.9998557 -0.9834132 0.9835588 0.9998557 -0.9834141 0.9835588 0.9998557 -0.9834153 0.9835588 0.9998557 -0.9834167 0.9835588 0.9998557 -0.9834186 0.9835588 0.9998557 -0.9834209 0.9835588 0.9998557 -0.9834239 0.9835588 0.9998557 -0.9834277 0.9835588 0.9998557 -0.9834324 0.9835588 0.9998557 -0.9834385 0.9835588 0.9998557 -0.9834461 0.9835588 0.9998557 -0.9834557 0.9835588 0.9998557 -0.9834679 0.9835588 0.9998557 -0.9834833 0.9835588 0.9998557 -0.9835029 0.9835588 0.9998557 -0.9835276 0.9835588 0.9998557 -0.9835588 0.9835588 0.9998557 -0.9835983 0.9835588 0.9998557 -0.9836483 0.9835588 0.9998557 -0.9837116 0.9835588 0.9998557 -0.9837916 0.9835588 0.9998557 -0.9838928 0.9835588 0.9998557 -0.9840209 0.9835588 0.9998557 -0.9841829 0.9835588 0.9998557 -0.984388 0.9835588 0.9998557 -0.9846473 0.9835588 0.9998557 -0.9849754 0.9835588 0.9998557 -0.9853905 0.9835588 0.9998557 -0.9859157 0.9835588 0.9998557 -0.9865801 0.9835588 0.9998557 -0.9874207 0.9835588 0.9998557 -0.9884841 0.9835588 0.9998557 -0.9898295 0.9835588 0.9998557 -0.9915316 0.9835588 0.9998557 -0.9936849 0.9835588 0.9998557 -0.9964092 0.9835588 0.9998557 -0.9998557 0.9835588 0.9998557 -0.999886 0.9869419 0.9971537 -0.9999099 0.9896392 0.9960342 -0.9999288 0.9917859 0.9957887 -0.9999437 0.9934919 0.9959964 -0.9834129 0.9836014 0.9998557 -0.9834129 0.9836014 0.9998557 -0.9834129 0.9836013 0.9998557 -0.9834129 0.9836012 0.9998557 -0.9834128 0.9836012 0.9998557 -0.9834128 0.9836011 0.9998557 -0.9834127 0.9836009 0.9998557 -0.9834127 0.9836008 0.9998557 -0.9834126 0.9836006 0.9998557 -0.9834125 0.9836004 0.9998557 -0.9834124 0.9836001 0.9998557 -0.9834123 0.9835998 0.9998557 -0.9834122 0.9835994 0.9998557 -0.9834122 0.9835991 0.9998557 -0.9834123 0.9835987 0.9998557 -0.9834126 0.9835984 0.9998557 -0.9834132 0.9835983 0.9998557 -0.9834141 0.9835983 0.9998557 -0.9834153 0.9835983 0.9998557 -0.9834167 0.9835983 0.9998557 -0.9834186 0.9835983 0.9998557 -0.9834209 0.9835983 0.9998557 -0.9834239 0.9835983 0.9998557 -0.9834277 0.9835983 0.9998557 -0.9834324 0.9835983 0.9998557 -0.9834385 0.9835983 0.9998557 -0.9834461 0.9835983 0.9998557 -0.9834557 0.9835983 0.9998557 -0.9834679 0.9835983 0.9998557 -0.9834833 0.9835983 0.9998557 -0.9835029 0.9835983 0.9998557 -0.9835276 0.9835983 0.9998557 -0.9835588 0.9835983 0.9998557 -0.9835983 0.9835983 0.9998557 -0.9836483 0.9835983 0.9998557 -0.9837116 0.9835983 0.9998557 -0.9837916 0.9835983 0.9998557 -0.9838928 0.9835983 0.9998557 -0.9840209 0.9835983 0.9998557 -0.9841829 0.9835983 0.9998557 -0.984388 0.9835983 0.9998557 -0.9846473 0.9835983 0.9998557 -0.9849754 0.9835983 0.9998557 -0.9853905 0.9835983 0.9998557 -0.9859157 0.9835983 0.9998557 -0.9865801 0.9835983 0.9998557 -0.9874207 0.9835983 0.9998557 -0.9884841 0.9835983 0.9998557 -0.9898295 0.9835983 0.9998557 -0.9915316 0.9835983 0.9998557 -0.9936849 0.9835983 0.9998557 -0.9964092 0.9835983 0.9998557 -0.9998557 0.9835983 0.9998557 -0.999886 0.9869667 0.9971537 -0.9999099 0.9896547 0.9960342 -0.9999288 0.9917956 0.9957887 -0.9999437 0.993498 0.9959964 -0.9834129 0.9836514 0.9998557 -0.9834129 0.9836513 0.9998557 -0.9834129 0.9836513 0.9998557 -0.9834129 0.9836512 0.9998557 -0.9834128 0.9836511 0.9998557 -0.9834128 0.983651 0.9998557 -0.9834127 0.9836509 0.9998557 -0.9834127 0.9836508 0.9998557 -0.9834126 0.9836506 0.9998557 -0.9834125 0.9836504 0.9998557 -0.9834124 0.9836501 0.9998557 -0.9834123 0.9836498 0.9998557 -0.9834122 0.9836494 0.9998557 -0.9834122 0.9836491 0.9998557 -0.9834123 0.9836487 0.9998557 -0.9834126 0.9836484 0.9998557 -0.9834132 0.9836483 0.9998557 -0.9834141 0.9836483 0.9998557 -0.9834153 0.9836483 0.9998557 -0.9834167 0.9836483 0.9998557 -0.9834186 0.9836483 0.9998557 -0.9834209 0.9836483 0.9998557 -0.9834239 0.9836483 0.9998557 -0.9834277 0.9836483 0.9998557 -0.9834324 0.9836483 0.9998557 -0.9834385 0.9836483 0.9998557 -0.9834461 0.9836483 0.9998557 -0.9834557 0.9836483 0.9998557 -0.9834679 0.9836483 0.9998557 -0.9834833 0.9836483 0.9998557 -0.9835029 0.9836483 0.9998557 -0.9835276 0.9836483 0.9998557 -0.9835588 0.9836483 0.9998557 -0.9835983 0.9836483 0.9998557 -0.9836483 0.9836483 0.9998557 -0.9837116 0.9836483 0.9998557 -0.9837916 0.9836483 0.9998557 -0.9838928 0.9836483 0.9998557 -0.9840209 0.9836483 0.9998557 -0.9841829 0.9836483 0.9998557 -0.984388 0.9836483 0.9998557 -0.9846473 0.9836483 0.9998557 -0.9849754 0.9836483 0.9998557 -0.9853905 0.9836483 0.9998557 -0.9859157 0.9836483 0.9998557 -0.9865801 0.9836483 0.9998557 -0.9874207 0.9836483 0.9998557 -0.9884841 0.9836483 0.9998557 -0.9898295 0.9836483 0.9998557 -0.9915316 0.9836483 0.9998557 -0.9936849 0.9836483 0.9998557 -0.9964092 0.9836483 0.9998557 -0.9998557 0.9836483 0.9998557 -0.999886 0.986998 0.9971537 -0.9999099 0.9896744 0.9960342 -0.9999288 0.9918079 0.9957887 -0.9999437 0.9935057 0.9959964 -0.9834129 0.9837146 0.9998557 -0.9834129 0.9837146 0.9998557 -0.9834129 0.9837145 0.9998557 -0.9834129 0.9837145 0.9998557 -0.9834128 0.9837144 0.9998557 -0.9834128 0.9837143 0.9998557 -0.9834127 0.9837142 0.9998557 -0.9834127 0.983714 0.9998557 -0.9834126 0.9837138 0.9998557 -0.9834125 0.9837136 0.9998557 -0.9834124 0.9837133 0.9998557 -0.9834123 0.983713 0.9998557 -0.9834122 0.9837127 0.9998557 -0.9834122 0.9837123 0.9998557 -0.9834123 0.9837119 0.9998557 -0.9834126 0.9837117 0.9998557 -0.9834132 0.9837116 0.9998557 -0.9834141 0.9837116 0.9998557 -0.9834153 0.9837116 0.9998557 -0.9834167 0.9837116 0.9998557 -0.9834186 0.9837116 0.9998557 -0.9834209 0.9837116 0.9998557 -0.9834239 0.9837116 0.9998557 -0.9834277 0.9837116 0.9998557 -0.9834324 0.9837116 0.9998557 -0.9834385 0.9837116 0.9998557 -0.9834461 0.9837116 0.9998557 -0.9834557 0.9837116 0.9998557 -0.9834679 0.9837116 0.9998557 -0.9834833 0.9837116 0.9998557 -0.9835029 0.9837116 0.9998557 -0.9835276 0.9837116 0.9998557 -0.9835588 0.9837116 0.9998557 -0.9835983 0.9837116 0.9998557 -0.9836483 0.9837116 0.9998557 -0.9837116 0.9837116 0.9998557 -0.9837916 0.9837116 0.9998557 -0.9838928 0.9837116 0.9998557 -0.9840209 0.9837116 0.9998557 -0.9841829 0.9837116 0.9998557 -0.984388 0.9837116 0.9998557 -0.9846473 0.9837116 0.9998557 -0.9849754 0.9837116 0.9998557 -0.9853905 0.9837116 0.9998557 -0.9859157 0.9837116 0.9998557 -0.9865801 0.9837116 0.9998557 -0.9874207 0.9837116 0.9998557 -0.9884841 0.9837116 0.9998557 -0.9898295 0.9837116 0.9998557 -0.9915316 0.9837116 0.9998557 -0.9936849 0.9837116 0.9998557 -0.9964092 0.9837116 0.9998557 -0.9998557 0.9837116 0.9998557 -0.999886 0.9870376 0.9971537 -0.9999099 0.9896992 0.9960342 -0.9999288 0.9918234 0.9957887 -0.9999437 0.9935154 0.9959964 -0.9834129 0.9837946 0.9998557 -0.9834129 0.9837946 0.9998557 -0.9834129 0.9837945 0.9998557 -0.9834129 0.9837945 0.9998557 -0.9834128 0.9837944 0.9998557 -0.9834128 0.9837943 0.9998557 -0.9834127 0.9837942 0.9998557 -0.9834127 0.983794 0.9998557 -0.9834126 0.9837938 0.9998557 -0.9834125 0.9837936 0.9998557 -0.9834124 0.9837934 0.9998557 -0.9834123 0.983793 0.9998557 -0.9834122 0.9837927 0.9998557 -0.9834122 0.9837923 0.9998557 -0.9834123 0.983792 0.9998557 -0.9834126 0.9837917 0.9998557 -0.9834132 0.9837916 0.9998557 -0.9834141 0.9837916 0.9998557 -0.9834153 0.9837916 0.9998557 -0.9834167 0.9837916 0.9998557 -0.9834186 0.9837916 0.9998557 -0.9834209 0.9837916 0.9998557 -0.9834239 0.9837916 0.9998557 -0.9834277 0.9837916 0.9998557 -0.9834324 0.9837916 0.9998557 -0.9834385 0.9837916 0.9998557 -0.9834461 0.9837916 0.9998557 -0.9834557 0.9837916 0.9998557 -0.9834679 0.9837916 0.9998557 -0.9834833 0.9837916 0.9998557 -0.9835029 0.9837916 0.9998557 -0.9835276 0.9837916 0.9998557 -0.9835588 0.9837916 0.9998557 -0.9835983 0.9837916 0.9998557 -0.9836483 0.9837916 0.9998557 -0.9837116 0.9837916 0.9998557 -0.9837916 0.9837916 0.9998557 -0.9838928 0.9837916 0.9998557 -0.9840209 0.9837916 0.9998557 -0.9841829 0.9837916 0.9998557 -0.984388 0.9837916 0.9998557 -0.9846473 0.9837916 0.9998557 -0.9849754 0.9837916 0.9998557 -0.9853905 0.9837916 0.9998557 -0.9859157 0.9837916 0.9998557 -0.9865801 0.9837916 0.9998557 -0.9874207 0.9837916 0.9998557 -0.9884841 0.9837916 0.9998557 -0.9898295 0.9837916 0.9998557 -0.9915316 0.9837916 0.9998557 -0.9936849 0.9837916 0.9998557 -0.9964092 0.9837916 0.9998557 -0.9998557 0.9837916 0.9998557 -0.999886 0.9870878 0.9971537 -0.9999099 0.9897306 0.9960342 -0.9999288 0.9918431 0.9957887 -0.9999437 0.9935277 0.9959964 -0.9834129 0.9838959 0.9998557 -0.9834129 0.9838958 0.9998557 -0.9834129 0.9838958 0.9998557 -0.9834129 0.9838957 0.9998557 -0.9834128 0.9838956 0.9998557 -0.9834128 0.9838955 0.9998557 -0.9834127 0.9838954 0.9998557 -0.9834127 0.9838953 0.9998557 -0.9834126 0.9838951 0.9998557 -0.9834125 0.9838948 0.9998557 -0.9834124 0.9838946 0.9998557 -0.9834123 0.9838943 0.9998557 -0.9834122 0.9838939 0.9998557 -0.9834122 0.9838936 0.9998557 -0.9834123 0.9838932 0.9998557 -0.9834126 0.9838929 0.9998557 -0.9834132 0.9838928 0.9998557 -0.9834141 0.9838928 0.9998557 -0.9834153 0.9838928 0.9998557 -0.9834167 0.9838928 0.9998557 -0.9834186 0.9838928 0.9998557 -0.9834209 0.9838928 0.9998557 -0.9834239 0.9838928 0.9998557 -0.9834277 0.9838928 0.9998557 -0.9834324 0.9838928 0.9998557 -0.9834385 0.9838928 0.9998557 -0.9834461 0.9838928 0.9998557 -0.9834557 0.9838928 0.9998557 -0.9834679 0.9838928 0.9998557 -0.9834833 0.9838928 0.9998557 -0.9835029 0.9838928 0.9998557 -0.9835276 0.9838928 0.9998557 -0.9835588 0.9838928 0.9998557 -0.9835983 0.9838928 0.9998557 -0.9836483 0.9838928 0.9998557 -0.9837116 0.9838928 0.9998557 -0.9837916 0.9838928 0.9998557 -0.9838928 0.9838928 0.9998557 -0.9840209 0.9838928 0.9998557 -0.9841829 0.9838928 0.9998557 -0.984388 0.9838928 0.9998557 -0.9846473 0.9838928 0.9998557 -0.9849754 0.9838928 0.9998557 -0.9853905 0.9838928 0.9998557 -0.9859157 0.9838928 0.9998557 -0.9865801 0.9838928 0.9998557 -0.9874207 0.9838928 0.9998557 -0.9884841 0.9838928 0.9998557 -0.9898295 0.9838928 0.9998557 -0.9915316 0.9838928 0.9998557 -0.9936849 0.9838928 0.9998557 -0.9964092 0.9838928 0.9998557 -0.9998557 0.9838928 0.9998557 -0.999886 0.9871512 0.9971537 -0.9999099 0.9897703 0.9960342 -0.9999288 0.991868 0.9957887 -0.9999437 0.9935432 0.9959964 -0.9834129 0.9840239 0.9998557 -0.9834129 0.9840239 0.9998557 -0.9834129 0.9840238 0.9998557 -0.9834129 0.9840238 0.9998557 -0.9834128 0.9840237 0.9998557 -0.9834128 0.9840236 0.9998557 -0.9834127 0.9840235 0.9998557 -0.9834127 0.9840233 0.9998557 -0.9834126 0.9840231 0.9998557 -0.9834125 0.9840229 0.9998557 -0.9834124 0.9840227 0.9998557 -0.9834123 0.9840223 0.9998557 -0.9834122 0.984022 0.9998557 -0.9834122 0.9840216 0.9998557 -0.9834123 0.9840213 0.9998557 -0.9834126 0.984021 0.9998557 -0.9834132 0.9840209 0.9998557 -0.9834141 0.9840209 0.9998557 -0.9834153 0.9840209 0.9998557 -0.9834167 0.9840209 0.9998557 -0.9834186 0.9840209 0.9998557 -0.9834209 0.9840209 0.9998557 -0.9834239 0.9840209 0.9998557 -0.9834277 0.9840209 0.9998557 -0.9834324 0.9840209 0.9998557 -0.9834385 0.9840209 0.9998557 -0.9834461 0.9840209 0.9998557 -0.9834557 0.9840209 0.9998557 -0.9834679 0.9840209 0.9998557 -0.9834833 0.9840209 0.9998557 -0.9835029 0.9840209 0.9998557 -0.9835276 0.9840209 0.9998557 -0.9835588 0.9840209 0.9998557 -0.9835983 0.9840209 0.9998557 -0.9836483 0.9840209 0.9998557 -0.9837116 0.9840209 0.9998557 -0.9837916 0.9840209 0.9998557 -0.9838928 0.9840209 0.9998557 -0.9840209 0.9840209 0.9998557 -0.9841829 0.9840209 0.9998557 -0.984388 0.9840209 0.9998557 -0.9846473 0.9840209 0.9998557 -0.9849754 0.9840209 0.9998557 -0.9853905 0.9840209 0.9998557 -0.9859157 0.9840209 0.9998557 -0.9865801 0.9840209 0.9998557 -0.9874207 0.9840209 0.9998557 -0.9884841 0.9840209 0.9998557 -0.9898295 0.9840209 0.9998557 -0.9915316 0.9840209 0.9998557 -0.9936849 0.9840209 0.9998557 -0.9964092 0.9840209 0.9998557 -0.9998557 0.9840209 0.9998557 -0.999886 0.9872315 0.9971537 -0.9999099 0.9898206 0.9960342 -0.9999288 0.9918994 0.9957887 -0.9999437 0.9935629 0.9959964 -0.9834129 0.9841859 0.9998557 -0.9834129 0.9841859 0.9998557 -0.9834129 0.9841858 0.9998557 -0.9834129 0.9841858 0.9998557 -0.9834128 0.9841857 0.9998557 -0.9834128 0.9841856 0.9998557 -0.9834127 0.9841855 0.9998557 -0.9834127 0.9841853 0.9998557 -0.9834126 0.9841852 0.9998557 -0.9834125 0.9841849 0.9998557 -0.9834124 0.9841847 0.9998557 -0.9834123 0.9841844 0.9998557 -0.9834122 0.984184 0.9998557 -0.9834122 0.9841837 0.9998557 -0.9834123 0.9841833 0.9998557 -0.9834126 0.984183 0.9998557 -0.9834132 0.9841829 0.9998557 -0.9834141 0.9841829 0.9998557 -0.9834153 0.9841829 0.9998557 -0.9834167 0.9841829 0.9998557 -0.9834186 0.9841829 0.9998557 -0.9834209 0.9841829 0.9998557 -0.9834239 0.9841829 0.9998557 -0.9834277 0.9841829 0.9998557 -0.9834324 0.9841829 0.9998557 -0.9834385 0.9841829 0.9998557 -0.9834461 0.9841829 0.9998557 -0.9834557 0.9841829 0.9998557 -0.9834679 0.9841829 0.9998557 -0.9834833 0.9841829 0.9998557 -0.9835029 0.9841829 0.9998557 -0.9835276 0.9841829 0.9998557 -0.9835588 0.9841829 0.9998557 -0.9835983 0.9841829 0.9998557 -0.9836483 0.9841829 0.9998557 -0.9837116 0.9841829 0.9998557 -0.9837916 0.9841829 0.9998557 -0.9838928 0.9841829 0.9998557 -0.9840209 0.9841829 0.9998557 -0.9841829 0.9841829 0.9998557 -0.984388 0.9841829 0.9998557 -0.9846473 0.9841829 0.9998557 -0.9849754 0.9841829 0.9998557 -0.9853905 0.9841829 0.9998557 -0.9859157 0.9841829 0.9998557 -0.9865801 0.9841829 0.9998557 -0.9874207 0.9841829 0.9998557 -0.9884841 0.9841829 0.9998557 -0.9898295 0.9841829 0.9998557 -0.9915316 0.9841829 0.9998557 -0.9936849 0.9841829 0.9998557 -0.9964092 0.9841829 0.9998557 -0.9998557 0.9841829 0.9998557 -0.999886 0.987333 0.9971537 -0.9999099 0.9898842 0.9960342 -0.9999288 0.9919392 0.9957887 -0.9999437 0.9935878 0.9959964 -0.9834129 0.9843909 0.9998557 -0.9834129 0.9843909 0.9998557 -0.9834129 0.9843908 0.9998557 -0.9834129 0.9843907 0.9998557 -0.9834128 0.9843907 0.9998557 -0.9834128 0.9843906 0.9998557 -0.9834127 0.9843905 0.9998557 -0.9834127 0.9843903 0.9998557 -0.9834126 0.9843901 0.9998557 -0.9834125 0.9843899 0.9998557 -0.9834124 0.9843897 0.9998557 -0.9834123 0.9843894 0.9998557 -0.9834122 0.984389 0.9998557 -0.9834122 0.9843887 0.9998557 -0.9834123 0.9843883 0.9998557 -0.9834126 0.984388 0.9998557 -0.9834132 0.984388 0.9998557 -0.9834141 0.984388 0.9998557 -0.9834153 0.984388 0.9998557 -0.9834167 0.984388 0.9998557 -0.9834186 0.984388 0.9998557 -0.9834209 0.984388 0.9998557 -0.9834239 0.984388 0.9998557 -0.9834277 0.984388 0.9998557 -0.9834324 0.984388 0.9998557 -0.9834385 0.984388 0.9998557 -0.9834461 0.984388 0.9998557 -0.9834557 0.984388 0.9998557 -0.9834679 0.984388 0.9998557 -0.9834833 0.984388 0.9998557 -0.9835029 0.984388 0.9998557 -0.9835276 0.984388 0.9998557 -0.9835588 0.984388 0.9998557 -0.9835983 0.984388 0.9998557 -0.9836483 0.984388 0.9998557 -0.9837116 0.984388 0.9998557 -0.9837916 0.984388 0.9998557 -0.9838928 0.984388 0.9998557 -0.9840209 0.984388 0.9998557 -0.9841829 0.984388 0.9998557 -0.984388 0.984388 0.9998557 -0.9846473 0.984388 0.9998557 -0.9849754 0.984388 0.9998557 -0.9853905 0.984388 0.9998557 -0.9859157 0.984388 0.9998557 -0.9865801 0.984388 0.9998557 -0.9874207 0.984388 0.9998557 -0.9884841 0.984388 0.9998557 -0.9898295 0.984388 0.9998557 -0.9915316 0.984388 0.9998557 -0.9936849 0.984388 0.9998557 -0.9964092 0.984388 0.9998557 -0.9998557 0.984388 0.9998557 -0.999886 0.9874615 0.9971537 -0.9999099 0.9899646 0.9960342 -0.9999288 0.9919896 0.9957887 -0.9999437 0.9936193 0.9959964 -0.9834129 0.9846502 0.9998557 -0.9834129 0.9846502 0.9998557 -0.9834129 0.9846501 0.9998557 -0.9834129 0.9846501 0.9998557 -0.9834128 0.98465 0.9998557 -0.9834128 0.9846499 0.9998557 -0.9834127 0.9846498 0.9998557 -0.9834127 0.9846496 0.9998557 -0.9834126 0.9846494 0.9998557 -0.9834125 0.9846492 0.9998557 -0.9834124 0.984649 0.9998557 -0.9834123 0.9846487 0.9998557 -0.9834122 0.9846484 0.9998557 -0.9834122 0.984648 0.9998557 -0.9834123 0.9846477 0.9998557 -0.9834126 0.9846474 0.9998557 -0.9834132 0.9846473 0.9998557 -0.9834141 0.9846473 0.9998557 -0.9834153 0.9846473 0.9998557 -0.9834167 0.9846473 0.9998557 -0.9834186 0.9846473 0.9998557 -0.9834209 0.9846473 0.9998557 -0.9834239 0.9846473 0.9998557 -0.9834277 0.9846473 0.9998557 -0.9834324 0.9846473 0.9998557 -0.9834385 0.9846473 0.9998557 -0.9834461 0.9846473 0.9998557 -0.9834557 0.9846473 0.9998557 -0.9834679 0.9846473 0.9998557 -0.9834833 0.9846473 0.9998557 -0.9835029 0.9846473 0.9998557 -0.9835276 0.9846473 0.9998557 -0.9835588 0.9846473 0.9998557 -0.9835983 0.9846473 0.9998557 -0.9836483 0.9846473 0.9998557 -0.9837116 0.9846473 0.9998557 -0.9837916 0.9846473 0.9998557 -0.9838928 0.9846473 0.9998557 -0.9840209 0.9846473 0.9998557 -0.9841829 0.9846473 0.9998557 -0.984388 0.9846473 0.9998557 -0.9846473 0.9846473 0.9998557 -0.9849754 0.9846473 0.9998557 -0.9853905 0.9846473 0.9998557 -0.9859157 0.9846473 0.9998557 -0.9865801 0.9846473 0.9998557 -0.9874207 0.9846473 0.9998557 -0.9884841 0.9846473 0.9998557 -0.9898295 0.9846473 0.9998557 -0.9915316 0.9846473 0.9998557 -0.9936849 0.9846473 0.9998557 -0.9964092 0.9846473 0.9998557 -0.9998557 0.9846473 0.9998557 -0.999886 0.987624 0.9971537 -0.9999099 0.9900664 0.9960342 -0.9999288 0.9920533 0.9957887 -0.9999437 0.9936592 0.9959964 -0.9834129 0.9849783 0.9998557 -0.9834129 0.9849782 0.9998557 -0.9834129 0.9849782 0.9998557 -0.9834129 0.9849781 0.9998557 -0.9834128 0.984978 0.9998557 -0.9834128 0.9849779 0.9998557 -0.9834127 0.9849778 0.9998557 -0.9834127 0.9849777 0.9998557 -0.9834126 0.9849775 0.9998557 -0.9834125 0.9849773 0.9998557 -0.9834124 0.9849771 0.9998557 -0.9834123 0.9849768 0.9998557 -0.9834122 0.9849765 0.9998557 -0.9834122 0.9849761 0.9998557 -0.9834123 0.9849758 0.9998557 -0.9834126 0.9849755 0.9998557 -0.9834132 0.9849754 0.9998557 -0.9834141 0.9849754 0.9998557 -0.9834153 0.9849754 0.9998557 -0.9834167 0.9849754 0.9998557 -0.9834186 0.9849754 0.9998557 -0.9834209 0.9849754 0.9998557 -0.9834239 0.9849754 0.9998557 -0.9834277 0.9849754 0.9998557 -0.9834324 0.9849754 0.9998557 -0.9834385 0.9849754 0.9998557 -0.9834461 0.9849754 0.9998557 -0.9834557 0.9849754 0.9998557 -0.9834679 0.9849754 0.9998557 -0.9834833 0.9849754 0.9998557 -0.9835029 0.9849754 0.9998557 -0.9835276 0.9849754 0.9998557 -0.9835588 0.9849754 0.9998557 -0.9835983 0.9849754 0.9998557 -0.9836483 0.9849754 0.9998557 -0.9837116 0.9849754 0.9998557 -0.9837916 0.9849754 0.9998557 -0.9838928 0.9849754 0.9998557 -0.9840209 0.9849754 0.9998557 -0.9841829 0.9849754 0.9998557 -0.984388 0.9849754 0.9998557 -0.9846473 0.9849754 0.9998557 -0.9849754 0.9849754 0.9998557 -0.9853905 0.9849754 0.9998557 -0.9859157 0.9849754 0.9998557 -0.9865801 0.9849754 0.9998557 -0.9874207 0.9849754 0.9998557 -0.9884841 0.9849754 0.9998557 -0.9898295 0.9849754 0.9998557 -0.9915316 0.9849754 0.9998557 -0.9936849 0.9849754 0.9998557 -0.9964092 0.9849754 0.9998557 -0.9998557 0.9849754 0.9998557 -0.999886 0.9878296 0.9971537 -0.9999099 0.9901951 0.9960342 -0.9999288 0.9921339 0.9957887 -0.9999437 0.9937096 0.9959964 -0.9834129 0.9853933 0.9998557 -0.9834129 0.9853933 0.9998557 -0.9834129 0.9853932 0.9998557 -0.9834129 0.9853932 0.9998557 -0.9834128 0.9853931 0.9998557 -0.9834128 0.985393 0.9998557 -0.9834127 0.9853929 0.9998557 -0.9834127 0.9853927 0.9998557 -0.9834126 0.9853926 0.9998557 -0.9834125 0.9853924 0.9998557 -0.9834124 0.9853921 0.9998557 -0.9834123 0.9853919 0.9998557 -0.9834122 0.9853915 0.9998557 -0.9834122 0.9853912 0.9998557 -0.9834123 0.9853909 0.9998557 -0.9834126 0.9853906 0.9998557 -0.9834132 0.9853905 0.9998557 -0.9834141 0.9853905 0.9998557 -0.9834153 0.9853905 0.9998557 -0.9834167 0.9853905 0.9998557 -0.9834186 0.9853905 0.9998557 -0.9834209 0.9853905 0.9998557 -0.9834239 0.9853905 0.9998557 -0.9834277 0.9853905 0.9998557 -0.9834324 0.9853905 0.9998557 -0.9834385 0.9853905 0.9998557 -0.9834461 0.9853905 0.9998557 -0.9834557 0.9853905 0.9998557 -0.9834679 0.9853905 0.9998557 -0.9834833 0.9853905 0.9998557 -0.9835029 0.9853905 0.9998557 -0.9835276 0.9853905 0.9998557 -0.9835588 0.9853905 0.9998557 -0.9835983 0.9853905 0.9998557 -0.9836483 0.9853905 0.9998557 -0.9837116 0.9853905 0.9998557 -0.9837916 0.9853905 0.9998557 -0.9838928 0.9853905 0.9998557 -0.9840209 0.9853905 0.9998557 -0.9841829 0.9853905 0.9998557 -0.984388 0.9853905 0.9998557 -0.9846473 0.9853905 0.9998557 -0.9849754 0.9853905 0.9998557 -0.9853905 0.9853905 0.9998557 -0.9859157 0.9853905 0.9998557 -0.9865801 0.9853905 0.9998557 -0.9874207 0.9853905 0.9998557 -0.9884841 0.9853905 0.9998557 -0.9898295 0.9853905 0.9998557 -0.9915316 0.9853905 0.9998557 -0.9936849 0.9853905 0.9998557 -0.9964092 0.9853905 0.9998557 -0.9998557 0.9853905 0.9998557 -0.999886 0.9880897 0.9971537 -0.9999099 0.990358 0.9960342 -0.9999288 0.9922358 0.9957887 -0.9999437 0.9937734 0.9959964 -0.9834129 0.9859184 0.9998557 -0.9834129 0.9859183 0.9998557 -0.9834129 0.9859183 0.9998557 -0.9834129 0.9859182 0.9998557 -0.9834128 0.9859182 0.9998557 -0.9834128 0.9859181 0.9998557 -0.9834127 0.985918 0.9998557 -0.9834127 0.9859178 0.9998557 -0.9834126 0.9859177 0.9998557 -0.9834125 0.9859175 0.9998557 -0.9834124 0.9859173 0.9998557 -0.9834123 0.985917 0.9998557 -0.9834122 0.9859167 0.9998557 -0.9834122 0.9859164 0.9998557 -0.9834123 0.985916 0.9998557 -0.9834126 0.9859158 0.9998557 -0.9834132 0.9859157 0.9998557 -0.9834141 0.9859157 0.9998557 -0.9834153 0.9859157 0.9998557 -0.9834167 0.9859157 0.9998557 -0.9834186 0.9859157 0.9998557 -0.9834209 0.9859157 0.9998557 -0.9834239 0.9859157 0.9998557 -0.9834277 0.9859157 0.9998557 -0.9834324 0.9859157 0.9998557 -0.9834385 0.9859157 0.9998557 -0.9834461 0.9859157 0.9998557 -0.9834557 0.9859157 0.9998557 -0.9834679 0.9859157 0.9998557 -0.9834833 0.9859157 0.9998557 -0.9835029 0.9859157 0.9998557 -0.9835276 0.9859157 0.9998557 -0.9835588 0.9859157 0.9998557 -0.9835983 0.9859157 0.9998557 -0.9836483 0.9859157 0.9998557 -0.9837116 0.9859157 0.9998557 -0.9837916 0.9859157 0.9998557 -0.9838928 0.9859157 0.9998557 -0.9840209 0.9859157 0.9998557 -0.9841829 0.9859157 0.9998557 -0.984388 0.9859157 0.9998557 -0.9846473 0.9859157 0.9998557 -0.9849754 0.9859157 0.9998557 -0.9853905 0.9859157 0.9998557 -0.9859157 0.9859157 0.9998557 -0.9865801 0.9859157 0.9998557 -0.9874207 0.9859157 0.9998557 -0.9884841 0.9859157 0.9998557 -0.9898295 0.9859157 0.9998557 -0.9915316 0.9859157 0.9998557 -0.9936849 0.9859157 0.9998557 -0.9964092 0.9859157 0.9998557 -0.9998557 0.9859157 0.9998557 -0.999886 0.9884188 0.9971537 -0.9999099 0.9905641 0.9960342 -0.9999288 0.9923648 0.9957887 -0.9999437 0.9938541 0.9959964 -0.9834129 0.9865826 0.9998557 -0.9834129 0.9865826 0.9998557 -0.9834129 0.9865826 0.9998557 -0.9834129 0.9865825 0.9998557 -0.9834128 0.9865825 0.9998557 -0.9834128 0.9865824 0.9998557 -0.9834127 0.9865823 0.9998557 -0.9834127 0.9865821 0.9998557 -0.9834126 0.986582 0.9998557 -0.9834125 0.9865818 0.9998557 -0.9834124 0.9865816 0.9998557 -0.9834123 0.9865813 0.9998557 -0.9834122 0.986581 0.9998557 -0.9834122 0.9865807 0.9998557 -0.9834123 0.9865804 0.9998557 -0.9834126 0.9865802 0.9998557 -0.9834132 0.9865801 0.9998557 -0.9834141 0.9865801 0.9998557 -0.9834153 0.9865801 0.9998557 -0.9834167 0.9865801 0.9998557 -0.9834186 0.9865801 0.9998557 -0.9834209 0.9865801 0.9998557 -0.9834239 0.9865801 0.9998557 -0.9834277 0.9865801 0.9998557 -0.9834324 0.9865801 0.9998557 -0.9834385 0.9865801 0.9998557 -0.9834461 0.9865801 0.9998557 -0.9834557 0.9865801 0.9998557 -0.9834679 0.9865801 0.9998557 -0.9834833 0.9865801 0.9998557 -0.9835029 0.9865801 0.9998557 -0.9835276 0.9865801 0.9998557 -0.9835588 0.9865801 0.9998557 -0.9835983 0.9865801 0.9998557 -0.9836483 0.9865801 0.9998557 -0.9837116 0.9865801 0.9998557 -0.9837916 0.9865801 0.9998557 -0.9838928 0.9865801 0.9998557 -0.9840209 0.9865801 0.9998557 -0.9841829 0.9865801 0.9998557 -0.984388 0.9865801 0.9998557 -0.9846473 0.9865801 0.9998557 -0.9849754 0.9865801 0.9998557 -0.9853905 0.9865801 0.9998557 -0.9859157 0.9865801 0.9998557 -0.9865801 0.9865801 0.9998557 -0.9874207 0.9865801 0.9998557 -0.9884841 0.9865801 0.9998557 -0.9898295 0.9865801 0.9998557 -0.9915316 0.9865801 0.9998557 -0.9936849 0.9865801 0.9998557 -0.9964092 0.9865801 0.9998557 -0.9998557 0.9865801 0.9998557 -0.999886 0.9888351 0.9971537 -0.9999099 0.9908248 0.9960342 -0.9999288 0.992528 0.9957887 -0.9999437 0.9939562 0.9959964 -0.9834129 0.9874231 0.9998557 -0.9834129 0.987423 0.9998557 -0.9834129 0.987423 0.9998557 -0.9834129 0.9874229 0.9998557 -0.9834128 0.9874229 0.9998557 -0.9834128 0.9874228 0.9998557 -0.9834127 0.9874227 0.9998557 -0.9834127 0.9874226 0.9998557 -0.9834126 0.9874224 0.9998557 -0.9834125 0.9874223 0.9998557 -0.9834124 0.9874221 0.9998557 -0.9834123 0.9874218 0.9998557 -0.9834122 0.9874216 0.9998557 -0.9834122 0.9874213 0.9998557 -0.9834123 0.987421 0.9998557 -0.9834126 0.9874208 0.9998557 -0.9834132 0.9874207 0.9998557 -0.9834141 0.9874207 0.9998557 -0.9834153 0.9874207 0.9998557 -0.9834167 0.9874207 0.9998557 -0.9834186 0.9874207 0.9998557 -0.9834209 0.9874207 0.9998557 -0.9834239 0.9874207 0.9998557 -0.9834277 0.9874207 0.9998557 -0.9834324 0.9874207 0.9998557 -0.9834385 0.9874207 0.9998557 -0.9834461 0.9874207 0.9998557 -0.9834557 0.9874207 0.9998557 -0.9834679 0.9874207 0.9998557 -0.9834833 0.9874207 0.9998557 -0.9835029 0.9874207 0.9998557 -0.9835276 0.9874207 0.9998557 -0.9835588 0.9874207 0.9998557 -0.9835983 0.9874207 0.9998557 -0.9836483 0.9874207 0.9998557 -0.9837116 0.9874207 0.9998557 -0.9837916 0.9874207 0.9998557 -0.9838928 0.9874207 0.9998557 -0.9840209 0.9874207 0.9998557 -0.9841829 0.9874207 0.9998557 -0.984388 0.9874207 0.9998557 -0.9846473 0.9874207 0.9998557 -0.9849754 0.9874207 0.9998557 -0.9853905 0.9874207 0.9998557 -0.9859157 0.9874207 0.9998557 -0.9865801 0.9874207 0.9998557 -0.9874207 0.9874207 0.9998557 -0.9884841 0.9874207 0.9998557 -0.9898295 0.9874207 0.9998557 -0.9915316 0.9874207 0.9998557 -0.9936849 0.9874207 0.9998557 -0.9964092 0.9874207 0.9998557 -0.9998557 0.9874207 0.9998557 -0.999886 0.9893618 0.9971537 -0.9999099 0.9911547 0.9960342 -0.9999288 0.9927345 0.9957887 -0.9999437 0.9940854 0.9959964 -0.9834129 0.9884863 0.9998557 -0.9834129 0.9884863 0.9998557 -0.9834129 0.9884862 0.9998557 -0.9834129 0.9884862 0.9998557 -0.9834128 0.9884861 0.9998557 -0.9834128 0.988486 0.9998557 -0.9834127 0.988486 0.9998557 -0.9834127 0.9884859 0.9998557 -0.9834126 0.9884857 0.9998557 -0.9834125 0.9884856 0.9998557 -0.9834124 0.9884854 0.9998557 -0.9834123 0.9884852 0.9998557 -0.9834122 0.9884849 0.9998557 -0.9834122 0.9884846 0.9998557 -0.9834123 0.9884844 0.9998557 -0.9834126 0.9884842 0.9998557 -0.9834132 0.9884841 0.9998557 -0.9834141 0.9884841 0.9998557 -0.9834153 0.9884841 0.9998557 -0.9834167 0.9884841 0.9998557 -0.9834186 0.9884841 0.9998557 -0.9834209 0.9884841 0.9998557 -0.9834239 0.9884841 0.9998557 -0.9834277 0.9884841 0.9998557 -0.9834324 0.9884841 0.9998557 -0.9834385 0.9884841 0.9998557 -0.9834461 0.9884841 0.9998557 -0.9834557 0.9884841 0.9998557 -0.9834679 0.9884841 0.9998557 -0.9834833 0.9884841 0.9998557 -0.9835029 0.9884841 0.9998557 -0.9835276 0.9884841 0.9998557 -0.9835588 0.9884841 0.9998557 -0.9835983 0.9884841 0.9998557 -0.9836483 0.9884841 0.9998557 -0.9837116 0.9884841 0.9998557 -0.9837916 0.9884841 0.9998557 -0.9838928 0.9884841 0.9998557 -0.9840209 0.9884841 0.9998557 -0.9841829 0.9884841 0.9998557 -0.984388 0.9884841 0.9998557 -0.9846473 0.9884841 0.9998557 -0.9849754 0.9884841 0.9998557 -0.9853905 0.9884841 0.9998557 -0.9859157 0.9884841 0.9998557 -0.9865801 0.9884841 0.9998557 -0.9874207 0.9884841 0.9998557 -0.9884841 0.9884841 0.9998557 -0.9898295 0.9884841 0.9998557 -0.9915316 0.9884841 0.9998557 -0.9936849 0.9884841 0.9998557 -0.9964092 0.9884841 0.9998557 -0.9998557 0.9884841 0.9998557 -0.999886 0.9900282 0.9971537 -0.9999099 0.991572 0.9960342 -0.9999288 0.9929957 0.9957887 -0.9999437 0.9942488 0.9959964 -0.9834129 0.9898314 0.9998557 -0.9834129 0.9898314 0.9998557 -0.9834129 0.9898313 0.9998557 -0.9834129 0.9898313 0.9998557 -0.9834128 0.9898313 0.9998557 -0.9834128 0.9898312 0.9998557 -0.9834127 0.9898311 0.9998557 -0.9834127 0.989831 0.9998557 -0.9834126 0.9898309 0.9998557 -0.9834125 0.9898308 0.9998557 -0.9834124 0.9898306 0.9998557 -0.9834123 0.9898304 0.9998557 -0.9834122 0.9898302 0.9998557 -0.9834122 0.98983 0.9998557 -0.9834123 0.9898297 0.9998557 -0.9834126 0.9898295 0.9998557 -0.9834132 0.9898295 0.9998557 -0.9834141 0.9898295 0.9998557 -0.9834153 0.9898295 0.9998557 -0.9834167 0.9898295 0.9998557 -0.9834186 0.9898295 0.9998557 -0.9834209 0.9898295 0.9998557 -0.9834239 0.9898295 0.9998557 -0.9834277 0.9898295 0.9998557 -0.9834324 0.9898295 0.9998557 -0.9834385 0.9898295 0.9998557 -0.9834461 0.9898295 0.9998557 -0.9834557 0.9898295 0.9998557 -0.9834679 0.9898295 0.9998557 -0.9834833 0.9898295 0.9998557 -0.9835029 0.9898295 0.9998557 -0.9835276 0.9898295 0.9998557 -0.9835588 0.9898295 0.9998557 -0.9835983 0.9898295 0.9998557 -0.9836483 0.9898295 0.9998557 -0.9837116 0.9898295 0.9998557 -0.9837916 0.9898295 0.9998557 -0.9838928 0.9898295 0.9998557 -0.9840209 0.9898295 0.9998557 -0.9841829 0.9898295 0.9998557 -0.984388 0.9898295 0.9998557 -0.9846473 0.9898295 0.9998557 -0.9849754 0.9898295 0.9998557 -0.9853905 0.9898295 0.9998557 -0.9859157 0.9898295 0.9998557 -0.9865801 0.9898295 0.9998557 -0.9874207 0.9898295 0.9998557 -0.9884841 0.9898295 0.9998557 -0.9898295 0.9898295 0.9998557 -0.9915316 0.9898295 0.9998557 -0.9936849 0.9898295 0.9998557 -0.9964092 0.9898295 0.9998557 -0.9998557 0.9898295 0.9998557 -0.999886 0.9908712 0.9971537 -0.9999099 0.9920999 0.9960342 -0.9999288 0.9933261 0.9957887 -0.9999437 0.9944556 0.9959964 -0.9834129 0.9915331 0.9998557 -0.9834129 0.9915331 0.9998557 -0.9834129 0.9915331 0.9998557 -0.9834129 0.9915331 0.9998557 -0.9834128 0.991533 0.9998557 -0.9834128 0.991533 0.9998557 -0.9834127 0.9915329 0.9998557 -0.9834127 0.9915328 0.9998557 -0.9834126 0.9915327 0.9998557 -0.9834125 0.9915326 0.9998557 -0.9834124 0.9915325 0.9998557 -0.9834123 0.9915323 0.9998557 -0.9834122 0.9915321 0.9998557 -0.9834122 0.9915319 0.9998557 -0.9834123 0.9915318 0.9998557 -0.9834126 0.9915316 0.9998557 -0.9834132 0.9915316 0.9998557 -0.9834141 0.9915316 0.9998557 -0.9834153 0.9915316 0.9998557 -0.9834167 0.9915316 0.9998557 -0.9834186 0.9915316 0.9998557 -0.9834209 0.9915316 0.9998557 -0.9834239 0.9915316 0.9998557 -0.9834277 0.9915316 0.9998557 -0.9834324 0.9915316 0.9998557 -0.9834385 0.9915316 0.9998557 -0.9834461 0.9915316 0.9998557 -0.9834557 0.9915316 0.9998557 -0.9834679 0.9915316 0.9998557 -0.9834833 0.9915316 0.9998557 -0.9835029 0.9915316 0.9998557 -0.9835276 0.9915316 0.9998557 -0.9835588 0.9915316 0.9998557 -0.9835983 0.9915316 0.9998557 -0.9836483 0.9915316 0.9998557 -0.9837116 0.9915316 0.9998557 -0.9837916 0.9915316 0.9998557 -0.9838928 0.9915316 0.9998557 -0.9840209 0.9915316 0.9998557 -0.9841829 0.9915316 0.9998557 -0.984388 0.9915316 0.9998557 -0.9846473 0.9915316 0.9998557 -0.9849754 0.9915316 0.9998557 -0.9853905 0.9915316 0.9998557 -0.9859157 0.9915316 0.9998557 -0.9865801 0.9915316 0.9998557 -0.9874207 0.9915316 0.9998557 -0.9884841 0.9915316 0.9998557 -0.9898295 0.9915316 0.9998557 -0.9915316 0.9915316 0.9998557 -0.9936849 0.9915316 0.9998557 -0.9964092 0.9915316 0.9998557 -0.9998557 0.9915316 0.9998557 -0.999886 0.9919377 0.9971537 -0.9999099 0.9927678 0.9960342 -0.9999288 0.9937442 0.9957887 -0.9999437 0.9947172 0.9959964 -0.9834129 0.9936861 0.9998557 -0.9834129 0.9936861 0.9998557 -0.9834129 0.993686 0.9998557 -0.9834129 0.993686 0.9998557 -0.9834128 0.993686 0.9998557 -0.9834128 0.993686 0.9998557 -0.9834127 0.9936859 0.9998557 -0.9834127 0.9936858 0.9998557 -0.9834126 0.9936858 0.9998557 -0.9834125 0.9936857 0.9998557 -0.9834124 0.9936856 0.9998557 -0.9834123 0.9936855 0.9998557 -0.9834122 0.9936853 0.9998557 -0.9834122 0.9936852 0.9998557 -0.9834123 0.993685 0.9998557 -0.9834126 0.9936849 0.9998557 -0.9834132 0.9936849 0.9998557 -0.9834141 0.9936849 0.9998557 -0.9834153 0.9936849 0.9998557 -0.9834167 0.9936849 0.9998557 -0.9834186 0.9936849 0.9998557 -0.9834209 0.9936849 0.9998557 -0.9834239 0.9936849 0.9998557 -0.9834277 0.9936849 0.9998557 -0.9834324 0.9936849 0.9998557 -0.9834385 0.9936849 0.9998557 -0.9834461 0.9936849 0.9998557 -0.9834557 0.9936849 0.9998557 -0.9834679 0.9936849 0.9998557 -0.9834833 0.9936849 0.9998557 -0.9835029 0.9936849 0.9998557 -0.9835276 0.9936849 0.9998557 -0.9835588 0.9936849 0.9998557 -0.9835983 0.9936849 0.9998557 -0.9836483 0.9936849 0.9998557 -0.9837116 0.9936849 0.9998557 -0.9837916 0.9936849 0.9998557 -0.9838928 0.9936849 0.9998557 -0.9840209 0.9936849 0.9998557 -0.9841829 0.9936849 0.9998557 -0.984388 0.9936849 0.9998557 -0.9846473 0.9936849 0.9998557 -0.9849754 0.9936849 0.9998557 -0.9853905 0.9936849 0.9998557 -0.9859157 0.9936849 0.9998557 -0.9865801 0.9936849 0.9998557 -0.9874207 0.9936849 0.9998557 -0.9884841 0.9936849 0.9998557 -0.9898295 0.9936849 0.9998557 -0.9915316 0.9936849 0.9998557 -0.9936849 0.9936849 0.9998557 -0.9964092 0.9936849 0.9998557 -0.9998557 0.9936849 0.9998557 -0.999886 0.993287 0.9971537 -0.9999099 0.9936128 0.9960342 -0.9999288 0.9942731 0.9957887 -0.9999437 0.9950481 0.9959964 -0.9834129 0.9964098 0.9998557 -0.9834129 0.9964098 0.9998557 -0.9834129 0.9964098 0.9998557 -0.9834129 0.9964098 0.9998557 -0.9834128 0.9964098 0.9998557 -0.9834128 0.9964098 0.9998557 -0.9834127 0.9964097 0.9998557 -0.9834127 0.9964097 0.9998557 -0.9834126 0.9964097 0.9998557 -0.9834125 0.9964096 0.9998557 -0.9834124 0.9964095 0.9998557 -0.9834123 0.9964095 0.9998557 -0.9834122 0.9964094 0.9998557 -0.9834122 0.9964093 0.9998557 -0.9834123 0.9964092 0.9998557 -0.9834126 0.9964092 0.9998557 -0.9834132 0.9964092 0.9998557 -0.9834141 0.9964092 0.9998557 -0.9834153 0.9964092 0.9998557 -0.9834167 0.9964092 0.9998557 -0.9834186 0.9964092 0.9998557 -0.9834209 0.9964092 0.9998557 -0.9834239 0.9964092 0.9998557 -0.9834277 0.9964092 0.9998557 -0.9834324 0.9964092 0.9998557 -0.9834385 0.9964092 0.9998557 -0.9834461 0.9964092 0.9998557 -0.9834557 0.9964092 0.9998557 -0.9834679 0.9964092 0.9998557 -0.9834833 0.9964092 0.9998557 -0.9835029 0.9964092 0.9998557 -0.9835276 0.9964092 0.9998557 -0.9835588 0.9964092 0.9998557 -0.9835983 0.9964092 0.9998557 -0.9836483 0.9964092 0.9998557 -0.9837116 0.9964092 0.9998557 -0.9837916 0.9964092 0.9998557 -0.9838928 0.9964092 0.9998557 -0.9840209 0.9964092 0.9998557 -0.9841829 0.9964092 0.9998557 -0.984388 0.9964092 0.9998557 -0.9846473 0.9964092 0.9998557 -0.9849754 0.9964092 0.9998557 -0.9853905 0.9964092 0.9998557 -0.9859157 0.9964092 0.9998557 -0.9865801 0.9964092 0.9998557 -0.9874207 0.9964092 0.9998557 -0.9884841 0.9964092 0.9998557 -0.9898295 0.9964092 0.9998557 -0.9915316 0.9964092 0.9998557 -0.9936849 0.9964092 0.9998557 -0.9964092 0.9964092 0.9998557 -0.9998557 0.9964092 0.9998557 -0.999886 0.9949941 0.9971537 -0.9999099 0.9946818 0.9960342 -0.9999288 0.9949422 0.9957887 -0.9999437 0.9954668 0.9959964 -0.9834129 0.9998557 0.9998557 -0.9834129 0.9998557 0.9998557 -0.9834129 0.9998557 0.9998557 -0.9834129 0.9998557 0.9998557 -0.9834128 0.9998557 0.9998557 -0.9834128 0.9998557 0.9998557 -0.9834127 0.9998557 0.9998557 -0.9834127 0.9998557 0.9998557 -0.9834126 0.9998557 0.9998557 -0.9834125 0.9998557 0.9998557 -0.9834124 0.9998557 0.9998557 -0.9834123 0.9998557 0.9998557 -0.9834122 0.9998557 0.9998557 -0.9834122 0.9998557 0.9998557 -0.9834123 0.9998557 0.9998557 -0.9834126 0.9998557 0.9998557 -0.9834132 0.9998557 0.9998557 -0.9834141 0.9998557 0.9998557 -0.9834153 0.9998557 0.9998557 -0.9834167 0.9998557 0.9998557 -0.9834186 0.9998557 0.9998557 -0.9834209 0.9998557 0.9998557 -0.9834239 0.9998557 0.9998557 -0.9834277 0.9998557 0.9998557 -0.9834324 0.9998557 0.9998557 -0.9834385 0.9998557 0.9998557 -0.9834461 0.9998557 0.9998557 -0.9834557 0.9998557 0.9998557 -0.9834679 0.9998557 0.9998557 -0.9834833 0.9998557 0.9998557 -0.9835029 0.9998557 0.9998557 -0.9835276 0.9998557 0.9998557 -0.9835588 0.9998557 0.9998557 -0.9835983 0.9998557 0.9998557 -0.9836483 0.9998557 0.9998557 -0.9837116 0.9998557 0.9998557 -0.9837916 0.9998557 0.9998557 -0.9838928 0.9998557 0.9998557 -0.9840209 0.9998557 0.9998557 -0.9841829 0.9998557 0.9998557 -0.984388 0.9998557 0.9998557 -0.9846473 0.9998557 0.9998557 -0.9849754 0.9998557 0.9998557 -0.9853905 0.9998557 0.9998557 -0.9859157 0.9998557 0.9998557 -0.9865801 0.9998557 0.9998557 -0.9874207 0.9998557 0.9998557 -0.9884841 0.9998557 0.9998557 -0.9898295 0.9998557 0.9998557 -0.9915316 0.9998557 0.9998557 -0.9936849 0.9998557 0.9998557 -0.9964092 0.9998557 0.9998557 -0.9998557 0.9998557 0.9998557 -0.999886 0.9971537 0.9971537 -0.9999099 0.9960342 0.9960342 -0.9999288 0.9957887 0.9957887 -0.9999437 0.9959964 0.9959964 -0.9868505 0.999886 0.9971542 -0.9868505 0.999886 0.9971542 -0.9868505 0.999886 0.9971541 -0.9868505 0.999886 0.9971541 -0.9868504 0.999886 0.9971541 -0.9868504 0.999886 0.9971541 -0.9868504 0.999886 0.9971541 -0.9868503 0.999886 0.9971541 -0.9868503 0.999886 0.9971541 -0.9868502 0.999886 0.997154 -0.9868502 0.999886 0.997154 -0.9868501 0.999886 0.9971539 -0.9868501 0.999886 0.9971539 -0.98685 0.999886 0.9971538 -0.9868501 0.999886 0.9971538 -0.9868503 0.999886 0.9971538 -0.9868507 0.999886 0.9971537 -0.9868512 0.999886 0.9971537 -0.986852 0.999886 0.9971537 -0.9868529 0.999886 0.9971537 -0.9868541 0.999886 0.9971537 -0.9868555 0.999886 0.9971537 -0.9868574 0.999886 0.9971537 -0.9868597 0.999886 0.9971537 -0.9868627 0.999886 0.9971537 -0.9868665 0.999886 0.9971537 -0.9868713 0.999886 0.9971537 -0.9868773 0.999886 0.9971537 -0.986885 0.999886 0.9971537 -0.9868946 0.999886 0.9971537 -0.9869069 0.999886 0.9971537 -0.9869223 0.999886 0.9971537 -0.9869419 0.999886 0.9971537 -0.9869667 0.999886 0.9971537 -0.986998 0.999886 0.9971537 -0.9870376 0.999886 0.9971537 -0.9870878 0.999886 0.9971537 -0.9871512 0.999886 0.9971537 -0.9872315 0.999886 0.9971537 -0.987333 0.999886 0.9971537 -0.9874615 0.999886 0.9971537 -0.987624 0.999886 0.9971537 -0.9878296 0.999886 0.9971537 -0.9880897 0.999886 0.9971537 -0.9884188 0.999886 0.9971537 -0.9888351 0.999886 0.9971537 -0.9893618 0.999886 0.9971537 -0.9900282 0.999886 0.9971537 -0.9908712 0.999886 0.9971537 -0.9919377 0.999886 0.9971537 -0.993287 0.999886 0.9971537 -0.9949941 0.999886 0.9971537 -0.9971537 0.999886 0.9971537 -0.999886 0.999886 0.9971537 -0.9999099 0.9977452 0.9960342 -0.9999288 0.9968597 0.9957887 -0.9999437 0.9966665 0.9959964 -0.989582 0.9999099 0.9960347 -0.989582 0.9999099 0.9960347 -0.989582 0.9999099 0.9960347 -0.989582 0.9999099 0.9960347 -0.989582 0.9999099 0.9960347 -0.9895819 0.9999099 0.9960346 -0.9895819 0.9999099 0.9960346 -0.9895819 0.9999099 0.9960346 -0.9895819 0.9999099 0.9960346 -0.9895818 0.9999099 0.9960345 -0.9895818 0.9999099 0.9960345 -0.9895818 0.9999099 0.9960344 -0.9895817 0.9999099 0.9960344 -0.9895817 0.9999099 0.9960343 -0.9895817 0.9999099 0.9960343 -0.9895819 0.9999099 0.9960342 -0.9895821 0.9999099 0.9960342 -0.9895825 0.9999099 0.9960342 -0.9895829 0.9999099 0.9960342 -0.9895835 0.9999099 0.9960342 -0.9895842 0.9999099 0.9960342 -0.9895851 0.9999099 0.9960342 -0.9895863 0.9999099 0.9960342 -0.9895878 0.9999099 0.9960342 -0.9895897 0.9999099 0.9960342 -0.989592 0.9999099 0.9960342 -0.989595 0.9999099 0.9960342 -0.9895988 0.9999099 0.9960342 -0.9896036 0.9999099 0.9960342 -0.9896096 0.9999099 0.9960342 -0.9896173 0.9999099 0.9960342 -0.989627 0.9999099 0.9960342 -0.9896392 0.9999099 0.9960342 -0.9896547 0.9999099 0.9960342 -0.9896744 0.9999099 0.9960342 -0.9896992 0.9999099 0.9960342 -0.9897306 0.9999099 0.9960342 -0.9897703 0.9999099 0.9960342 -0.9898206 0.9999099 0.9960342 -0.9898842 0.9999099 0.9960342 -0.9899646 0.9999099 0.9960342 -0.9900664 0.9999099 0.9960342 -0.9901951 0.9999099 0.9960342 -0.990358 0.9999099 0.9960342 -0.9905641 0.9999099 0.9960342 -0.9908248 0.9999099 0.9960342 -0.9911547 0.9999099 0.9960342 -0.991572 0.9999099 0.9960342 -0.9920999 0.9999099 0.9960342 -0.9927678 0.9999099 0.9960342 -0.9936128 0.9999099 0.9960342 -0.9946818 0.9999099 0.9960342 -0.9960342 0.9999099 0.9960342 -0.9977452 0.9999099 0.9960342 -0.9999099 0.9999099 0.9960342 -0.9999288 0.9982146 0.9957887 -0.9999437 0.9975143 0.9959964 -0.9917501 0.9999288 0.9957891 -0.9917501 0.9999288 0.9957891 -0.9917501 0.9999288 0.9957891 -0.9917501 0.9999288 0.9957891 -0.9917501 0.9999288 0.9957891 -0.9917501 0.9999288 0.9957891 -0.99175 0.9999288 0.9957891 -0.99175 0.9999288 0.9957891 -0.99175 0.9999288 0.995789 -0.99175 0.9999288 0.995789 -0.99175 0.9999288 0.995789 -0.9917499 0.9999288 0.9957889 -0.9917499 0.9999288 0.9957889 -0.9917499 0.9999288 0.9957888 -0.9917499 0.9999288 0.9957888 -0.99175 0.9999288 0.9957887 -0.9917502 0.9999288 0.9957887 -0.9917504 0.9999288 0.9957887 -0.9917507 0.9999288 0.9957887 -0.991751 0.9999288 0.9957887 -0.9917515 0.9999288 0.9957887 -0.9917521 0.9999288 0.9957887 -0.9917528 0.9999288 0.9957887 -0.9917537 0.9999288 0.9957887 -0.9917549 0.9999288 0.9957887 -0.9917564 0.9999288 0.9957887 -0.9917582 0.9999288 0.9957887 -0.9917606 0.9999288 0.9957887 -0.9917636 0.9999288 0.9957887 -0.9917674 0.9999288 0.9957887 -0.9917722 0.9999288 0.9957887 -0.9917782 0.9999288 0.9957887 -0.9917859 0.9999288 0.9957887 -0.9917956 0.9999288 0.9957887 -0.9918079 0.9999288 0.9957887 -0.9918234 0.9999288 0.9957887 -0.9918431 0.9999288 0.9957887 -0.991868 0.9999288 0.9957887 -0.9918994 0.9999288 0.9957887 -0.9919392 0.9999288 0.9957887 -0.9919896 0.9999288 0.9957887 -0.9920533 0.9999288 0.9957887 -0.9921339 0.9999288 0.9957887 -0.9922358 0.9999288 0.9957887 -0.9923648 0.9999288 0.9957887 -0.992528 0.9999288 0.9957887 -0.9927345 0.9999288 0.9957887 -0.9929957 0.9999288 0.9957887 -0.9933261 0.9999288 0.9957887 -0.9937442 0.9999288 0.9957887 -0.9942731 0.9999288 0.9957887 -0.9949422 0.9999288 0.9957887 -0.9957887 0.9999288 0.9957887 -0.9968597 0.9999288 0.9957887 -0.9982146 0.9999288 0.9957887 -0.9999288 0.9999288 0.9957887 -0.9999437 0.9985868 0.9959964 -0.9934695 0.9999437 0.9959967 -0.9934695 0.9999437 0.9959967 -0.9934695 0.9999437 0.9959967 -0.9934695 0.9999437 0.9959967 -0.9934695 0.9999437 0.9959967 -0.9934695 0.9999437 0.9959967 -0.9934695 0.9999437 0.9959967 -0.9934694 0.9999437 0.9959967 -0.9934694 0.9999437 0.9959967 -0.9934694 0.9999437 0.9959966 -0.9934694 0.9999437 0.9959966 -0.9934694 0.9999437 0.9959966 -0.9934694 0.9999437 0.9959965 -0.9934694 0.9999437 0.9959965 -0.9934694 0.9999437 0.9959965 -0.9934694 0.9999437 0.9959964 -0.9934695 0.9999437 0.9959964 -0.9934697 0.9999437 0.9959964 -0.9934698 0.9999437 0.9959964 -0.9934701 0.9999437 0.9959964 -0.9934704 0.9999437 0.9959964 -0.9934707 0.9999437 0.9959964 -0.9934712 0.9999437 0.9959964 -0.9934718 0.9999437 0.9959964 -0.9934725 0.9999437 0.9959964 -0.9934734 0.9999437 0.9959964 -0.9934746 0.9999437 0.9959964 -0.9934761 0.9999437 0.9959964 -0.9934779 0.9999437 0.9959964 -0.9934803 0.9999437 0.9959964 -0.9934833 0.9999437 0.9959964 -0.9934871 0.9999437 0.9959964 -0.9934919 0.9999437 0.9959964 -0.993498 0.9999437 0.9959964 -0.9935057 0.9999437 0.9959964 -0.9935154 0.9999437 0.9959964 -0.9935277 0.9999437 0.9959964 -0.9935432 0.9999437 0.9959964 -0.9935629 0.9999437 0.9959964 -0.9935878 0.9999437 0.9959964 -0.9936193 0.9999437 0.9959964 -0.9936592 0.9999437 0.9959964 -0.9937096 0.9999437 0.9959964 -0.9937734 0.9999437 0.9959964 -0.9938541 0.9999437 0.9959964 -0.9939562 0.9999437 0.9959964 -0.9940854 0.9999437 0.9959964 -0.9942488 0.9999437 0.9959964 -0.9944556 0.9999437 0.9959964 -0.9947172 0.9999437 0.9959964 -0.9950481 0.9999437 0.9959964 -0.9954668 0.9999437 0.9959964 -0.9959964 0.9999437 0.9959964 -0.9966665 0.9999437 0.9959964 -0.9975143 0.9999437 0.9959964 -0.9985868 0.9999437 0.9959964 -0.9999437 0.9999437 0.9959964 -0.9868505 0.9868505 0.999886 -0.9868505 0.9868505 0.999886 -0.9868505 0.9868505 0.999886 -0.9868506 0.9868505 0.999886 -0.9868506 0.9868505 0.999886 -0.9868506 0.9868505 0.999886 -0.9868507 0.9868505 0.999886 -0.9868507 0.9868505 0.999886 -0.9868508 0.9868505 0.999886 -0.9868509 0.9868505 0.999886 -0.986851 0.9868505 0.999886 -0.9868511 0.9868505 0.999886 -0.9868513 0.9868505 0.999886 -0.9868515 0.9868505 0.999886 -0.9868518 0.9868505 0.999886 -0.9868522 0.9868505 0.999886 -0.9868526 0.9868505 0.999886 -0.9868532 0.9868505 0.999886 -0.9868539 0.9868505 0.999886 -0.9868548 0.9868505 0.999886 -0.986856 0.9868505 0.999886 -0.9868575 0.9868505 0.999886 -0.9868593 0.9868505 0.999886 -0.9868617 0.9868505 0.999886 -0.9868647 0.9868505 0.999886 -0.9868685 0.9868505 0.999886 -0.9868732 0.9868505 0.999886 -0.9868793 0.9868505 0.999886 -0.9868869 0.9868505 0.999886 -0.9868966 0.9868505 0.999886 -0.9869088 0.9868505 0.999886 -0.9869243 0.9868505 0.999886 -0.9869438 0.9868505 0.999886 -0.9869686 0.9868505 0.999886 -0.9869999 0.9868505 0.999886 -0.9870396 0.9868505 0.999886 -0.9870897 0.9868505 0.999886 -0.9871531 0.9868505 0.999886 -0.9872334 0.9868505 0.999886 -0.9873349 0.9868505 0.999886 -0.9874633 0.9868505 0.999886 -0.9876258 0.9868505 0.999886 -0.9878314 0.9868505 0.999886 -0.9880915 0.9868505 0.999886 -0.9884205 0.9868505 0.999886 -0.9888368 0.9868505 0.999886 -0.9893634 0.9868505 0.999886 -0.9900297 0.9868505 0.999886 -0.9908726 0.9868505 0.999886 -0.9919389 0.9868505 0.999886 -0.993288 0.9868505 0.999886 -0.9949948 0.9868505 0.999886 -0.9971542 0.9868505 0.999886 -0.999886 0.9868505 0.999886 -0.9999099 0.989582 0.9977455 -0.9999288 0.9917501 0.99686 -0.9999437 0.9934695 0.9966668 -0.9868505 0.9868505 0.999886 -0.9868505 0.9868505 0.999886 -0.9868505 0.9868505 0.999886 -0.9868505 0.9868505 0.999886 -0.9868506 0.9868505 0.999886 -0.9868506 0.9868505 0.999886 -0.9868506 0.9868505 0.999886 -0.9868507 0.9868505 0.999886 -0.9868508 0.9868505 0.999886 -0.9868508 0.9868505 0.999886 -0.986851 0.9868505 0.999886 -0.9868511 0.9868505 0.999886 -0.9868513 0.9868505 0.999886 -0.9868515 0.9868505 0.999886 -0.9868518 0.9868505 0.999886 -0.9868521 0.9868505 0.999886 -0.9868526 0.9868505 0.999886 -0.9868532 0.9868505 0.999886 -0.9868539 0.9868505 0.999886 -0.9868548 0.9868505 0.999886 -0.986856 0.9868505 0.999886 -0.9868575 0.9868505 0.999886 -0.9868593 0.9868505 0.999886 -0.9868617 0.9868505 0.999886 -0.9868647 0.9868505 0.999886 -0.9868684 0.9868505 0.999886 -0.9868732 0.9868505 0.999886 -0.9868792 0.9868505 0.999886 -0.9868869 0.9868505 0.999886 -0.9868965 0.9868505 0.999886 -0.9869088 0.9868505 0.999886 -0.9869242 0.9868505 0.999886 -0.9869438 0.9868505 0.999886 -0.9869686 0.9868505 0.999886 -0.9869999 0.9868505 0.999886 -0.9870395 0.9868505 0.999886 -0.9870897 0.9868505 0.999886 -0.9871531 0.9868505 0.999886 -0.9872333 0.9868505 0.999886 -0.9873349 0.9868505 0.999886 -0.9874633 0.9868505 0.999886 -0.9876258 0.9868505 0.999886 -0.9878314 0.9868505 0.999886 -0.9880914 0.9868505 0.999886 -0.9884205 0.9868505 0.999886 -0.9888367 0.9868505 0.999886 -0.9893634 0.9868505 0.999886 -0.9900296 0.9868505 0.999886 -0.9908725 0.9868505 0.999886 -0.9919389 0.9868505 0.999886 -0.993288 0.9868505 0.999886 -0.9949948 0.9868505 0.999886 -0.9971542 0.9868505 0.999886 -0.999886 0.9868505 0.999886 -0.9999099 0.989582 0.9977455 -0.9999288 0.9917501 0.99686 -0.9999437 0.9934695 0.9966668 -0.9868505 0.9868505 0.999886 -0.9868505 0.9868505 0.999886 -0.9868505 0.9868505 0.999886 -0.9868505 0.9868505 0.999886 -0.9868505 0.9868505 0.999886 -0.9868506 0.9868505 0.999886 -0.9868506 0.9868505 0.999886 -0.9868507 0.9868505 0.999886 -0.9868507 0.9868505 0.999886 -0.9868508 0.9868505 0.999886 -0.9868509 0.9868505 0.999886 -0.9868511 0.9868505 0.999886 -0.9868512 0.9868505 0.999886 -0.9868515 0.9868505 0.999886 -0.9868518 0.9868505 0.999886 -0.9868521 0.9868505 0.999886 -0.9868526 0.9868505 0.999886 -0.9868531 0.9868505 0.999886 -0.9868539 0.9868505 0.999886 -0.9868548 0.9868505 0.999886 -0.986856 0.9868505 0.999886 -0.9868574 0.9868505 0.999886 -0.9868593 0.9868505 0.999886 -0.9868616 0.9868505 0.999886 -0.9868646 0.9868505 0.999886 -0.9868684 0.9868505 0.999886 -0.9868732 0.9868505 0.999886 -0.9868792 0.9868505 0.999886 -0.9868869 0.9868505 0.999886 -0.9868965 0.9868505 0.999886 -0.9869087 0.9868505 0.999886 -0.9869242 0.9868505 0.999886 -0.9869438 0.9868505 0.999886 -0.9869685 0.9868505 0.999886 -0.9869999 0.9868505 0.999886 -0.9870395 0.9868505 0.999886 -0.9870896 0.9868505 0.999886 -0.9871531 0.9868505 0.999886 -0.9872333 0.9868505 0.999886 -0.9873348 0.9868505 0.999886 -0.9874633 0.9868505 0.999886 -0.9876258 0.9868505 0.999886 -0.9878313 0.9868505 0.999886 -0.9880914 0.9868505 0.999886 -0.9884204 0.9868505 0.999886 -0.9888367 0.9868505 0.999886 -0.9893633 0.9868505 0.999886 -0.9900296 0.9868505 0.999886 -0.9908725 0.9868505 0.999886 -0.9919389 0.9868505 0.999886 -0.993288 0.9868505 0.999886 -0.9949948 0.9868505 0.999886 -0.9971541 0.9868505 0.999886 -0.999886 0.9868505 0.999886 -0.9999099 0.989582 0.9977455 -0.9999288 0.9917501 0.99686 -0.9999437 0.9934695 0.9966668 -0.9868505 0.9868506 0.999886 -0.9868505 0.9868505 0.999886 -0.9868505 0.9868505 0.999886 -0.9868505 0.9868505 0.999886 -0.9868505 0.9868505 0.999886 -0.9868505 0.9868505 0.999886 -0.9868506 0.9868505 0.999886 -0.9868506 0.9868505 0.999886 -0.9868507 0.9868505 0.999886 -0.9868508 0.9868505 0.999886 -0.9868509 0.9868505 0.999886 -0.986851 0.9868505 0.999886 -0.9868512 0.9868505 0.999886 -0.9868514 0.9868505 0.999886 -0.9868517 0.9868505 0.999886 -0.9868521 0.9868505 0.999886 -0.9868525 0.9868505 0.999886 -0.9868531 0.9868505 0.999886 -0.9868538 0.9868505 0.999886 -0.9868547 0.9868505 0.999886 -0.9868559 0.9868505 0.999886 -0.9868574 0.9868505 0.999886 -0.9868592 0.9868505 0.999886 -0.9868616 0.9868505 0.999886 -0.9868646 0.9868505 0.999886 -0.9868684 0.9868505 0.999886 -0.9868731 0.9868505 0.999886 -0.9868792 0.9868505 0.999886 -0.9868868 0.9868505 0.999886 -0.9868965 0.9868505 0.999886 -0.9869087 0.9868505 0.999886 -0.9869242 0.9868505 0.999886 -0.9869437 0.9868505 0.999886 -0.9869685 0.9868505 0.999886 -0.9869998 0.9868505 0.999886 -0.9870395 0.9868505 0.999886 -0.9870896 0.9868505 0.999886 -0.987153 0.9868505 0.999886 -0.9872333 0.9868505 0.999886 -0.9873348 0.9868505 0.999886 -0.9874632 0.9868505 0.999886 -0.9876257 0.9868505 0.999886 -0.9878313 0.9868505 0.999886 -0.9880914 0.9868505 0.999886 -0.9884204 0.9868505 0.999886 -0.9888367 0.9868505 0.999886 -0.9893633 0.9868505 0.999886 -0.9900296 0.9868505 0.999886 -0.9908725 0.9868505 0.999886 -0.9919389 0.9868505 0.999886 -0.993288 0.9868505 0.999886 -0.9949948 0.9868505 0.999886 -0.9971541 0.9868505 0.999886 -0.999886 0.9868505 0.999886 -0.9999099 0.989582 0.9977455 -0.9999288 0.9917501 0.99686 -0.9999437 0.9934695 0.9966668 -0.9868505 0.9868506 0.999886 -0.9868505 0.9868506 0.999886 -0.9868505 0.9868505 0.999886 -0.9868505 0.9868505 0.999886 -0.9868504 0.9868504 0.999886 -0.9868505 0.9868504 0.999886 -0.9868505 0.9868504 0.999886 -0.9868506 0.9868504 0.999886 -0.9868506 0.9868504 0.999886 -0.9868507 0.9868504 0.999886 -0.9868508 0.9868504 0.999886 -0.986851 0.9868504 0.999886 -0.9868512 0.9868504 0.999886 -0.9868514 0.9868504 0.999886 -0.9868517 0.9868504 0.999886 -0.986852 0.9868504 0.999886 -0.9868525 0.9868504 0.999886 -0.986853 0.9868504 0.999886 -0.9868538 0.9868504 0.999886 -0.9868547 0.9868504 0.999886 -0.9868559 0.9868504 0.999886 -0.9868573 0.9868504 0.999886 -0.9868592 0.9868504 0.999886 -0.9868616 0.9868504 0.999886 -0.9868645 0.9868504 0.999886 -0.9868683 0.9868504 0.999886 -0.9868731 0.9868504 0.999886 -0.9868791 0.9868504 0.999886 -0.9868868 0.9868504 0.999886 -0.9868964 0.9868504 0.999886 -0.9869087 0.9868504 0.999886 -0.9869241 0.9868504 0.999886 -0.9869437 0.9868504 0.999886 -0.9869685 0.9868504 0.999886 -0.9869998 0.9868504 0.999886 -0.9870394 0.9868504 0.999886 -0.9870895 0.9868504 0.999886 -0.987153 0.9868504 0.999886 -0.9872332 0.9868504 0.999886 -0.9873347 0.9868504 0.999886 -0.9874632 0.9868504 0.999886 -0.9876257 0.9868504 0.999886 -0.9878313 0.9868504 0.999886 -0.9880913 0.9868504 0.999886 -0.9884204 0.9868504 0.999886 -0.9888366 0.9868504 0.999886 -0.9893633 0.9868504 0.999886 -0.9900295 0.9868504 0.999886 -0.9908724 0.9868504 0.999886 -0.9919388 0.9868504 0.999886 -0.993288 0.9868504 0.999886 -0.9949948 0.9868504 0.999886 -0.9971541 0.9868504 0.999886 -0.999886 0.9868504 0.999886 -0.9999099 0.989582 0.9977455 -0.9999288 0.9917501 0.99686 -0.9999437 0.9934695 0.9966668 -0.9868505 0.9868506 0.999886 -0.9868505 0.9868506 0.999886 -0.9868505 0.9868506 0.999886 -0.9868505 0.9868505 0.999886 -0.9868504 0.9868505 0.999886 -0.9868504 0.9868504 0.999886 -0.9868504 0.9868504 0.999886 -0.9868505 0.9868504 0.999886 -0.9868506 0.9868504 0.999886 -0.9868507 0.9868504 0.999886 -0.9868508 0.9868504 0.999886 -0.9868509 0.9868504 0.999886 -0.9868511 0.9868504 0.999886 -0.9868513 0.9868504 0.999886 -0.9868516 0.9868504 0.999886 -0.986852 0.9868504 0.999886 -0.9868524 0.9868504 0.999886 -0.986853 0.9868504 0.999886 -0.9868537 0.9868504 0.999886 -0.9868546 0.9868504 0.999886 -0.9868558 0.9868504 0.999886 -0.9868573 0.9868504 0.999886 -0.9868591 0.9868504 0.999886 -0.9868615 0.9868504 0.999886 -0.9868645 0.9868504 0.999886 -0.9868682 0.9868504 0.999886 -0.986873 0.9868504 0.999886 -0.9868791 0.9868504 0.999886 -0.9868867 0.9868504 0.999886 -0.9868964 0.9868504 0.999886 -0.9869086 0.9868504 0.999886 -0.9869241 0.9868504 0.999886 -0.9869436 0.9868504 0.999886 -0.9869684 0.9868504 0.999886 -0.9869997 0.9868504 0.999886 -0.9870393 0.9868504 0.999886 -0.9870895 0.9868504 0.999886 -0.9871529 0.9868504 0.999886 -0.9872332 0.9868504 0.999886 -0.9873347 0.9868504 0.999886 -0.9874631 0.9868504 0.999886 -0.9876256 0.9868504 0.999886 -0.9878312 0.9868504 0.999886 -0.9880913 0.9868504 0.999886 -0.9884203 0.9868504 0.999886 -0.9888366 0.9868504 0.999886 -0.9893632 0.9868504 0.999886 -0.9900295 0.9868504 0.999886 -0.9908724 0.9868504 0.999886 -0.9919388 0.9868504 0.999886 -0.9932879 0.9868504 0.999886 -0.9949948 0.9868504 0.999886 -0.9971541 0.9868504 0.999886 -0.999886 0.9868504 0.999886 -0.9999099 0.9895819 0.9977455 -0.9999288 0.9917501 0.99686 -0.9999437 0.9934695 0.9966668 -0.9868505 0.9868507 0.999886 -0.9868505 0.9868506 0.999886 -0.9868505 0.9868506 0.999886 -0.9868505 0.9868506 0.999886 -0.9868504 0.9868505 0.999886 -0.9868504 0.9868504 0.999886 -0.9868504 0.9868504 0.999886 -0.9868504 0.9868504 0.999886 -0.9868505 0.9868504 0.999886 -0.9868506 0.9868504 0.999886 -0.9868507 0.9868504 0.999886 -0.9868508 0.9868504 0.999886 -0.986851 0.9868504 0.999886 -0.9868512 0.9868504 0.999886 -0.9868515 0.9868504 0.999886 -0.9868519 0.9868504 0.999886 -0.9868523 0.9868504 0.999886 -0.9868529 0.9868504 0.999886 -0.9868536 0.9868504 0.999886 -0.9868546 0.9868504 0.999886 -0.9868557 0.9868504 0.999886 -0.9868572 0.9868504 0.999886 -0.9868591 0.9868504 0.999886 -0.9868614 0.9868504 0.999886 -0.9868644 0.9868504 0.999886 -0.9868682 0.9868504 0.999886 -0.9868729 0.9868504 0.999886 -0.986879 0.9868504 0.999886 -0.9868866 0.9868504 0.999886 -0.9868963 0.9868504 0.999886 -0.9869085 0.9868504 0.999886 -0.986924 0.9868504 0.999886 -0.9869436 0.9868504 0.999886 -0.9869683 0.9868504 0.999886 -0.9869996 0.9868504 0.999886 -0.9870393 0.9868504 0.999886 -0.9870894 0.9868504 0.999886 -0.9871528 0.9868504 0.999886 -0.9872331 0.9868504 0.999886 -0.9873346 0.9868504 0.999886 -0.9874631 0.9868504 0.999886 -0.9876255 0.9868504 0.999886 -0.9878311 0.9868504 0.999886 -0.9880912 0.9868504 0.999886 -0.9884202 0.9868504 0.999886 -0.9888365 0.9868504 0.999886 -0.9893632 0.9868504 0.999886 -0.9900294 0.9868504 0.999886 -0.9908724 0.9868504 0.999886 -0.9919388 0.9868504 0.999886 -0.9932879 0.9868504 0.999886 -0.9949947 0.9868504 0.999886 -0.9971541 0.9868504 0.999886 -0.999886 0.9868504 0.999886 -0.9999099 0.9895819 0.9977455 -0.9999288 0.99175 0.99686 -0.9999437 0.9934695 0.9966667 -0.9868505 0.9868507 0.999886 -0.9868505 0.9868507 0.999886 -0.9868505 0.9868507 0.999886 -0.9868505 0.9868506 0.999886 -0.9868504 0.9868506 0.999886 -0.9868504 0.9868505 0.999886 -0.9868504 0.9868504 0.999886 -0.9868503 0.9868503 0.999886 -0.9868504 0.9868503 0.999886 -0.9868505 0.9868503 0.999886 -0.9868506 0.9868503 0.999886 -0.9868507 0.9868503 0.999886 -0.9868509 0.9868503 0.999886 -0.9868511 0.9868503 0.999886 -0.9868514 0.9868503 0.999886 -0.9868518 0.9868503 0.999886 -0.9868522 0.9868503 0.999886 -0.9868528 0.9868503 0.999886 -0.9868535 0.9868503 0.999886 -0.9868545 0.9868503 0.999886 -0.9868556 0.9868503 0.999886 -0.9868571 0.9868503 0.999886 -0.986859 0.9868503 0.999886 -0.9868613 0.9868503 0.999886 -0.9868643 0.9868503 0.999886 -0.9868681 0.9868503 0.999886 -0.9868728 0.9868503 0.999886 -0.9868789 0.9868503 0.999886 -0.9868865 0.9868503 0.999886 -0.9868962 0.9868503 0.999886 -0.9869084 0.9868503 0.999886 -0.9869239 0.9868503 0.999886 -0.9869435 0.9868503 0.999886 -0.9869682 0.9868503 0.999886 -0.9869995 0.9868503 0.999886 -0.9870392 0.9868503 0.999886 -0.9870893 0.9868503 0.999886 -0.9871527 0.9868503 0.999886 -0.987233 0.9868503 0.999886 -0.9873345 0.9868503 0.999886 -0.987463 0.9868503 0.999886 -0.9876255 0.9868503 0.999886 -0.987831 0.9868503 0.999886 -0.9880911 0.9868503 0.999886 -0.9884202 0.9868503 0.999886 -0.9888364 0.9868503 0.999886 -0.9893631 0.9868503 0.999886 -0.9900294 0.9868503 0.999886 -0.9908723 0.9868503 0.999886 -0.9919387 0.9868503 0.999886 -0.9932878 0.9868503 0.999886 -0.9949947 0.9868503 0.999886 -0.9971541 0.9868503 0.999886 -0.999886 0.9868503 0.999886 -0.9999099 0.9895819 0.9977454 -0.9999288 0.99175 0.9968599 -0.9999437 0.9934694 0.9966667 -0.9868505 0.9868508 0.999886 -0.9868505 0.9868508 0.999886 -0.9868505 0.9868507 0.999886 -0.9868505 0.9868507 0.999886 -0.9868504 0.9868506 0.999886 -0.9868504 0.9868506 0.999886 -0.9868504 0.9868505 0.999886 -0.9868503 0.9868504 0.999886 -0.9868503 0.9868503 0.999886 -0.9868504 0.9868503 0.999886 -0.9868505 0.9868503 0.999886 -0.9868506 0.9868503 0.999886 -0.9868508 0.9868503 0.999886 -0.986851 0.9868503 0.999886 -0.9868513 0.9868503 0.999886 -0.9868517 0.9868503 0.999886 -0.9868521 0.9868503 0.999886 -0.9868527 0.9868503 0.999886 -0.9868534 0.9868503 0.999886 -0.9868543 0.9868503 0.999886 -0.9868555 0.9868503 0.999886 -0.986857 0.9868503 0.999886 -0.9868588 0.9868503 0.999886 -0.9868612 0.9868503 0.999886 -0.9868642 0.9868503 0.999886 -0.986868 0.9868503 0.999886 -0.9868727 0.9868503 0.999886 -0.9868788 0.9868503 0.999886 -0.9868864 0.9868503 0.999886 -0.9868961 0.9868503 0.999886 -0.9869083 0.9868503 0.999886 -0.9869238 0.9868503 0.999886 -0.9869433 0.9868503 0.999886 -0.9869681 0.9868503 0.999886 -0.9869994 0.9868503 0.999886 -0.9870391 0.9868503 0.999886 -0.9870892 0.9868503 0.999886 -0.9871526 0.9868503 0.999886 -0.9872329 0.9868503 0.999886 -0.9873344 0.9868503 0.999886 -0.9874628 0.9868503 0.999886 -0.9876253 0.9868503 0.999886 -0.9878309 0.9868503 0.999886 -0.988091 0.9868503 0.999886 -0.9884201 0.9868503 0.999886 -0.9888363 0.9868503 0.999886 -0.989363 0.9868503 0.999886 -0.9900293 0.9868503 0.999886 -0.9908722 0.9868503 0.999886 -0.9919386 0.9868503 0.999886 -0.9932878 0.9868503 0.999886 -0.9949946 0.9868503 0.999886 -0.9971541 0.9868503 0.999886 -0.999886 0.9868503 0.999886 -0.9999099 0.9895819 0.9977454 -0.9999288 0.99175 0.9968599 -0.9999437 0.9934694 0.9966667 -0.9868505 0.9868509 0.999886 -0.9868505 0.9868508 0.999886 -0.9868505 0.9868508 0.999886 -0.9868505 0.9868508 0.999886 -0.9868504 0.9868507 0.999886 -0.9868504 0.9868507 0.999886 -0.9868504 0.9868506 0.999886 -0.9868503 0.9868505 0.999886 -0.9868503 0.9868504 0.999886 -0.9868502 0.9868502 0.999886 -0.9868503 0.9868502 0.999886 -0.9868505 0.9868502 0.999886 -0.9868507 0.9868502 0.999886 -0.9868509 0.9868502 0.999886 -0.9868512 0.9868502 0.999886 -0.9868515 0.9868502 0.999886 -0.986852 0.9868502 0.999886 -0.9868525 0.9868502 0.999886 -0.9868533 0.9868502 0.999886 -0.9868542 0.9868502 0.999886 -0.9868554 0.9868502 0.999886 -0.9868568 0.9868502 0.999886 -0.9868587 0.9868502 0.999886 -0.9868611 0.9868502 0.999886 -0.986864 0.9868502 0.999886 -0.9868678 0.9868502 0.999886 -0.9868726 0.9868502 0.999886 -0.9868786 0.9868502 0.999886 -0.9868863 0.9868502 0.999886 -0.9868959 0.9868502 0.999886 -0.9869082 0.9868502 0.999886 -0.9869236 0.9868502 0.999886 -0.9869432 0.9868502 0.999886 -0.986968 0.9868502 0.999886 -0.9869993 0.9868502 0.999886 -0.9870389 0.9868502 0.999886 -0.9870891 0.9868502 0.999886 -0.9871525 0.9868502 0.999886 -0.9872327 0.9868502 0.999886 -0.9873343 0.9868502 0.999886 -0.9874627 0.9868502 0.999886 -0.9876252 0.9868502 0.999886 -0.9878308 0.9868502 0.999886 -0.9880909 0.9868502 0.999886 -0.9884199 0.9868502 0.999886 -0.9888362 0.9868502 0.999886 -0.9893629 0.9868502 0.999886 -0.9900292 0.9868502 0.999886 -0.9908721 0.9868502 0.999886 -0.9919385 0.9868502 0.999886 -0.9932877 0.9868502 0.999886 -0.9949946 0.9868502 0.999886 -0.997154 0.9868502 0.999886 -0.999886 0.9868502 0.999886 -0.9999099 0.9895818 0.9977454 -0.9999288 0.99175 0.9968599 -0.9999437 0.9934694 0.9966667 -0.9868505 0.986851 0.999886 -0.9868505 0.986851 0.999886 -0.9868505 0.9868509 0.999886 -0.9868505 0.9868509 0.999886 -0.9868504 0.9868508 0.999886 -0.9868504 0.9868508 0.999886 -0.9868504 0.9868507 0.999886 -0.9868503 0.9868506 0.999886 -0.9868503 0.9868505 0.999886 -0.9868502 0.9868503 0.999886 -0.9868502 0.9868502 0.999886 -0.9868503 0.9868502 0.999886 -0.9868505 0.9868502 0.999886 -0.9868507 0.9868502 0.999886 -0.986851 0.9868502 0.999886 -0.9868513 0.9868502 0.999886 -0.9868518 0.9868502 0.999886 -0.9868524 0.9868502 0.999886 -0.9868531 0.9868502 0.999886 -0.986854 0.9868502 0.999886 -0.9868552 0.9868502 0.999886 -0.9868567 0.9868502 0.999886 -0.9868585 0.9868502 0.999886 -0.9868609 0.9868502 0.999886 -0.9868639 0.9868502 0.999886 -0.9868676 0.9868502 0.999886 -0.9868724 0.9868502 0.999886 -0.9868785 0.9868502 0.999886 -0.9868861 0.9868502 0.999886 -0.9868958 0.9868502 0.999886 -0.986908 0.9868502 0.999886 -0.9869235 0.9868502 0.999886 -0.986943 0.9868502 0.999886 -0.9869678 0.9868502 0.999886 -0.9869991 0.9868502 0.999886 -0.9870387 0.9868502 0.999886 -0.9870889 0.9868502 0.999886 -0.9871523 0.9868502 0.999886 -0.9872326 0.9868502 0.999886 -0.9873341 0.9868502 0.999886 -0.9874625 0.9868502 0.999886 -0.987625 0.9868502 0.999886 -0.9878306 0.9868502 0.999886 -0.9880907 0.9868502 0.999886 -0.9884198 0.9868502 0.999886 -0.9888361 0.9868502 0.999886 -0.9893627 0.9868502 0.999886 -0.990029 0.9868502 0.999886 -0.990872 0.9868502 0.999886 -0.9919384 0.9868502 0.999886 -0.9932876 0.9868502 0.999886 -0.9949945 0.9868502 0.999886 -0.997154 0.9868502 0.999886 -0.999886 0.9868502 0.999886 -0.9999099 0.9895818 0.9977454 -0.9999288 0.99175 0.9968599 -0.9999437 0.9934694 0.9966667 -0.9868505 0.9868511 0.999886 -0.9868505 0.9868511 0.999886 -0.9868505 0.9868511 0.999886 -0.9868505 0.986851 0.999886 -0.9868504 0.986851 0.999886 -0.9868504 0.9868509 0.999886 -0.9868504 0.9868508 0.999886 -0.9868503 0.9868507 0.999886 -0.9868503 0.9868506 0.999886 -0.9868502 0.9868505 0.999886 -0.9868502 0.9868503 0.999886 -0.9868501 0.9868501 0.999886 -0.9868503 0.9868501 0.999886 -0.9868505 0.9868501 0.999886 -0.9868508 0.9868501 0.999886 -0.9868511 0.9868501 0.999886 -0.9868516 0.9868501 0.999886 -0.9868522 0.9868501 0.999886 -0.9868529 0.9868501 0.999886 -0.9868538 0.9868501 0.999886 -0.986855 0.9868501 0.999886 -0.9868565 0.9868501 0.999886 -0.9868583 0.9868501 0.999886 -0.9868607 0.9868501 0.999886 -0.9868637 0.9868501 0.999886 -0.9868674 0.9868501 0.999886 -0.9868722 0.9868501 0.999886 -0.9868783 0.9868501 0.999886 -0.9868859 0.9868501 0.999886 -0.9868956 0.9868501 0.999886 -0.9869078 0.9868501 0.999886 -0.9869233 0.9868501 0.999886 -0.9869428 0.9868501 0.999886 -0.9869676 0.9868501 0.999886 -0.9869989 0.9868501 0.999886 -0.9870386 0.9868501 0.999886 -0.9870887 0.9868501 0.999886 -0.9871521 0.9868501 0.999886 -0.9872324 0.9868501 0.999886 -0.9873339 0.9868501 0.999886 -0.9874624 0.9868501 0.999886 -0.9876249 0.9868501 0.999886 -0.9878304 0.9868501 0.999886 -0.9880905 0.9868501 0.999886 -0.9884196 0.9868501 0.999886 -0.9888359 0.9868501 0.999886 -0.9893626 0.9868501 0.999886 -0.9900289 0.9868501 0.999886 -0.9908718 0.9868501 0.999886 -0.9919383 0.9868501 0.999886 -0.9932875 0.9868501 0.999886 -0.9949945 0.9868501 0.999886 -0.9971539 0.9868501 0.999886 -0.999886 0.9868501 0.999886 -0.9999099 0.9895818 0.9977454 -0.9999288 0.9917499 0.9968599 -0.9999437 0.9934694 0.9966666 -0.9868505 0.9868513 0.999886 -0.9868505 0.9868513 0.999886 -0.9868505 0.9868512 0.999886 -0.9868505 0.9868512 0.999886 -0.9868504 0.9868512 0.999886 -0.9868504 0.9868511 0.999886 -0.9868504 0.986851 0.999886 -0.9868503 0.9868509 0.999886 -0.9868503 0.9868508 0.999886 -0.9868502 0.9868507 0.999886 -0.9868502 0.9868505 0.999886 -0.9868501 0.9868503 0.999886 -0.9868501 0.9868501 0.999886 -0.9868503 0.9868501 0.999886 -0.9868506 0.9868501 0.999886 -0.9868509 0.9868501 0.999886 -0.9868514 0.9868501 0.999886 -0.986852 0.9868501 0.999886 -0.9868527 0.9868501 0.999886 -0.9868536 0.9868501 0.999886 -0.9868548 0.9868501 0.999886 -0.9868562 0.9868501 0.999886 -0.9868581 0.9868501 0.999886 -0.9868605 0.9868501 0.999886 -0.9868634 0.9868501 0.999886 -0.9868672 0.9868501 0.999886 -0.986872 0.9868501 0.999886 -0.986878 0.9868501 0.999886 -0.9868857 0.9868501 0.999886 -0.9868953 0.9868501 0.999886 -0.9869076 0.9868501 0.999886 -0.986923 0.9868501 0.999886 -0.9869426 0.9868501 0.999886 -0.9869674 0.9868501 0.999886 -0.9869987 0.9868501 0.999886 -0.9870383 0.9868501 0.999886 -0.9870885 0.9868501 0.999886 -0.9871519 0.9868501 0.999886 -0.9872322 0.9868501 0.999886 -0.9873337 0.9868501 0.999886 -0.9874621 0.9868501 0.999886 -0.9876247 0.9868501 0.999886 -0.9878302 0.9868501 0.999886 -0.9880903 0.9868501 0.999886 -0.9884194 0.9868501 0.999886 -0.9888357 0.9868501 0.999886 -0.9893624 0.9868501 0.999886 -0.9900287 0.9868501 0.999886 -0.9908717 0.9868501 0.999886 -0.9919382 0.9868501 0.999886 -0.9932874 0.9868501 0.999886 -0.9949944 0.9868501 0.999886 -0.9971539 0.9868501 0.999886 -0.999886 0.9868501 0.999886 -0.9999099 0.9895817 0.9977453 -0.9999288 0.9917499 0.9968598 -0.9999437 0.9934694 0.9966666 -0.9868505 0.9868515 0.999886 -0.9868505 0.9868515 0.999886 -0.9868505 0.9868515 0.999886 -0.9868505 0.9868514 0.999886 -0.9868504 0.9868514 0.999886 -0.9868504 0.9868513 0.999886 -0.9868504 0.9868512 0.999886 -0.9868503 0.9868511 0.999886 -0.9868503 0.986851 0.999886 -0.9868502 0.9868509 0.999886 -0.9868502 0.9868507 0.999886 -0.9868501 0.9868505 0.999886 -0.9868501 0.9868503 0.999886 -0.98685 0.98685 0.999886 -0.9868503 0.98685 0.999886 -0.9868507 0.98685 0.999886 -0.9868511 0.98685 0.999886 -0.9868517 0.98685 0.999886 -0.9868524 0.98685 0.999886 -0.9868534 0.98685 0.999886 -0.9868545 0.98685 0.999886 -0.986856 0.98685 0.999886 -0.9868579 0.98685 0.999886 -0.9868602 0.98685 0.999886 -0.9868632 0.98685 0.999886 -0.986867 0.98685 0.999886 -0.9868717 0.98685 0.999886 -0.9868778 0.98685 0.999886 -0.9868854 0.98685 0.999886 -0.9868951 0.98685 0.999886 -0.9869073 0.98685 0.999886 -0.9869228 0.98685 0.999886 -0.9869424 0.98685 0.999886 -0.9869671 0.98685 0.999886 -0.9869985 0.98685 0.999886 -0.9870381 0.98685 0.999886 -0.9870882 0.98685 0.999886 -0.9871517 0.98685 0.999886 -0.9872319 0.98685 0.999886 -0.9873335 0.98685 0.999886 -0.9874619 0.98685 0.999886 -0.9876244 0.98685 0.999886 -0.98783 0.98685 0.999886 -0.9880901 0.98685 0.999886 -0.9884192 0.98685 0.999886 -0.9888355 0.98685 0.999886 -0.9893622 0.98685 0.999886 -0.9900285 0.98685 0.999886 -0.9908715 0.98685 0.999886 -0.991938 0.98685 0.999886 -0.9932873 0.98685 0.999886 -0.9949943 0.98685 0.999886 -0.9971538 0.98685 0.999886 -0.999886 0.98685 0.999886 -0.9999099 0.9895817 0.9977453 -0.9999288 0.9917499 0.9968598 -0.9999437 0.9934694 0.9966666 -0.9868505 0.9868518 0.999886 -0.9868505 0.9868518 0.999886 -0.9868505 0.9868518 0.999886 -0.9868505 0.9868517 0.999886 -0.9868504 0.9868517 0.999886 -0.9868504 0.9868516 0.999886 -0.9868504 0.9868515 0.999886 -0.9868503 0.9868514 0.999886 -0.9868503 0.9868513 0.999886 -0.9868502 0.9868512 0.999886 -0.9868502 0.986851 0.999886 -0.9868501 0.9868508 0.999886 -0.9868501 0.9868506 0.999886 -0.98685 0.9868503 0.999886 -0.9868501 0.9868501 0.999886 -0.9868505 0.9868501 0.999886 -0.9868509 0.9868501 0.999886 -0.9868515 0.9868501 0.999886 -0.9868522 0.9868501 0.999886 -0.9868531 0.9868501 0.999886 -0.9868543 0.9868501 0.999886 -0.9868558 0.9868501 0.999886 -0.9868576 0.9868501 0.999886 -0.98686 0.9868501 0.999886 -0.986863 0.9868501 0.999886 -0.9868667 0.9868501 0.999886 -0.9868715 0.9868501 0.999886 -0.9868776 0.9868501 0.999886 -0.9868852 0.9868501 0.999886 -0.9868949 0.9868501 0.999886 -0.9869071 0.9868501 0.999886 -0.9869226 0.9868501 0.999886 -0.9869421 0.9868501 0.999886 -0.9869669 0.9868501 0.999886 -0.9869982 0.9868501 0.999886 -0.9870379 0.9868501 0.999886 -0.987088 0.9868501 0.999886 -0.9871514 0.9868501 0.999886 -0.9872317 0.9868501 0.999886 -0.9873332 0.9868501 0.999886 -0.9874617 0.9868501 0.999886 -0.9876242 0.9868501 0.999886 -0.9878298 0.9868501 0.999886 -0.9880899 0.9868501 0.999886 -0.988419 0.9868501 0.999886 -0.9888353 0.9868501 0.999886 -0.989362 0.9868501 0.999886 -0.9900284 0.9868501 0.999886 -0.9908714 0.9868501 0.999886 -0.9919379 0.9868501 0.999886 -0.9932872 0.9868501 0.999886 -0.9949942 0.9868501 0.999886 -0.9971538 0.9868501 0.999886 -0.999886 0.9868501 0.999886 -0.9999099 0.9895817 0.9977453 -0.9999288 0.9917499 0.9968597 -0.9999437 0.9934694 0.9966666 -0.9868505 0.9868522 0.999886 -0.9868505 0.9868521 0.999886 -0.9868505 0.9868521 0.999886 -0.9868505 0.9868521 0.999886 -0.9868504 0.986852 0.999886 -0.9868504 0.986852 0.999886 -0.9868504 0.9868519 0.999886 -0.9868503 0.9868518 0.999886 -0.9868503 0.9868517 0.999886 -0.9868502 0.9868515 0.999886 -0.9868502 0.9868513 0.999886 -0.9868501 0.9868511 0.999886 -0.9868501 0.9868509 0.999886 -0.98685 0.9868507 0.999886 -0.9868501 0.9868505 0.999886 -0.9868503 0.9868503 0.999886 -0.9868507 0.9868503 0.999886 -0.9868513 0.9868503 0.999886 -0.986852 0.9868503 0.999886 -0.9868529 0.9868503 0.999886 -0.9868541 0.9868503 0.999886 -0.9868556 0.9868503 0.999886 -0.9868574 0.9868503 0.999886 -0.9868598 0.9868503 0.999886 -0.9868628 0.9868503 0.999886 -0.9868666 0.9868503 0.999886 -0.9868713 0.9868503 0.999886 -0.9868774 0.9868503 0.999886 -0.986885 0.9868503 0.999886 -0.9868947 0.9868503 0.999886 -0.9869069 0.9868503 0.999886 -0.9869224 0.9868503 0.999886 -0.986942 0.9868503 0.999886 -0.9869667 0.9868503 0.999886 -0.986998 0.9868503 0.999886 -0.9870377 0.9868503 0.999886 -0.9870878 0.9868503 0.999886 -0.9871513 0.9868503 0.999886 -0.9872315 0.9868503 0.999886 -0.9873331 0.9868503 0.999886 -0.9874615 0.9868503 0.999886 -0.987624 0.9868503 0.999886 -0.9878296 0.9868503 0.999886 -0.9880897 0.9868503 0.999886 -0.9884188 0.9868503 0.999886 -0.9888352 0.9868503 0.999886 -0.9893619 0.9868503 0.999886 -0.9900282 0.9868503 0.999886 -0.9908712 0.9868503 0.999886 -0.9919378 0.9868503 0.999886 -0.9932871 0.9868503 0.999886 -0.9949941 0.9868503 0.999886 -0.9971538 0.9868503 0.999886 -0.999886 0.9868503 0.999886 -0.9999099 0.9895819 0.9977452 -0.9999288 0.99175 0.9968597 -0.9999437 0.9934694 0.9966665 -0.9868505 0.9868526 0.999886 -0.9868505 0.9868526 0.999886 -0.9868505 0.9868526 0.999886 -0.9868505 0.9868525 0.999886 -0.9868504 0.9868525 0.999886 -0.9868504 0.9868524 0.999886 -0.9868504 0.9868523 0.999886 -0.9868503 0.9868522 0.999886 -0.9868503 0.9868521 0.999886 -0.9868502 0.986852 0.999886 -0.9868502 0.9868518 0.999886 -0.9868501 0.9868516 0.999886 -0.9868501 0.9868514 0.999886 -0.98685 0.9868511 0.999886 -0.9868501 0.9868509 0.999886 -0.9868503 0.9868507 0.999886 -0.9868507 0.9868507 0.999886 -0.9868512 0.9868507 0.999886 -0.986852 0.9868507 0.999886 -0.9868529 0.9868507 0.999886 -0.9868541 0.9868507 0.999886 -0.9868555 0.9868507 0.999886 -0.9868574 0.9868507 0.999886 -0.9868597 0.9868507 0.999886 -0.9868627 0.9868507 0.999886 -0.9868665 0.9868507 0.999886 -0.9868713 0.9868507 0.999886 -0.9868773 0.9868507 0.999886 -0.986885 0.9868507 0.999886 -0.9868946 0.9868507 0.999886 -0.9869069 0.9868507 0.999886 -0.9869223 0.9868507 0.999886 -0.9869419 0.9868507 0.999886 -0.9869667 0.9868507 0.999886 -0.986998 0.9868507 0.999886 -0.9870376 0.9868507 0.999886 -0.9870878 0.9868507 0.999886 -0.9871512 0.9868507 0.999886 -0.9872315 0.9868507 0.999886 -0.987333 0.9868507 0.999886 -0.9874615 0.9868507 0.999886 -0.987624 0.9868507 0.999886 -0.9878296 0.9868507 0.999886 -0.9880897 0.9868507 0.999886 -0.9884188 0.9868507 0.999886 -0.9888351 0.9868507 0.999886 -0.9893618 0.9868507 0.999886 -0.9900282 0.9868507 0.999886 -0.9908712 0.9868507 0.999886 -0.9919377 0.9868507 0.999886 -0.993287 0.9868507 0.999886 -0.9949941 0.9868507 0.999886 -0.9971537 0.9868507 0.999886 -0.999886 0.9868507 0.999886 -0.9999099 0.9895821 0.9977452 -0.9999288 0.9917502 0.9968597 -0.9999437 0.9934695 0.9966665 -0.9868505 0.9868532 0.999886 -0.9868505 0.9868532 0.999886 -0.9868505 0.9868531 0.999886 -0.9868505 0.9868531 0.999886 -0.9868504 0.986853 0.999886 -0.9868504 0.986853 0.999886 -0.9868504 0.9868529 0.999886 -0.9868503 0.9868528 0.999886 -0.9868503 0.9868527 0.999886 -0.9868502 0.9868525 0.999886 -0.9868502 0.9868524 0.999886 -0.9868501 0.9868522 0.999886 -0.9868501 0.986852 0.999886 -0.98685 0.9868517 0.999886 -0.9868501 0.9868515 0.999886 -0.9868503 0.9868513 0.999886 -0.9868507 0.9868512 0.999886 -0.9868512 0.9868512 0.999886 -0.986852 0.9868512 0.999886 -0.9868529 0.9868512 0.999886 -0.9868541 0.9868512 0.999886 -0.9868555 0.9868512 0.999886 -0.9868574 0.9868512 0.999886 -0.9868597 0.9868512 0.999886 -0.9868627 0.9868512 0.999886 -0.9868665 0.9868512 0.999886 -0.9868713 0.9868512 0.999886 -0.9868773 0.9868512 0.999886 -0.986885 0.9868512 0.999886 -0.9868946 0.9868512 0.999886 -0.9869069 0.9868512 0.999886 -0.9869223 0.9868512 0.999886 -0.9869419 0.9868512 0.999886 -0.9869667 0.9868512 0.999886 -0.986998 0.9868512 0.999886 -0.9870376 0.9868512 0.999886 -0.9870878 0.9868512 0.999886 -0.9871512 0.9868512 0.999886 -0.9872315 0.9868512 0.999886 -0.987333 0.9868512 0.999886 -0.9874615 0.9868512 0.999886 -0.987624 0.9868512 0.999886 -0.9878296 0.9868512 0.999886 -0.9880897 0.9868512 0.999886 -0.9884188 0.9868512 0.999886 -0.9888351 0.9868512 0.999886 -0.9893618 0.9868512 0.999886 -0.9900282 0.9868512 0.999886 -0.9908712 0.9868512 0.999886 -0.9919377 0.9868512 0.999886 -0.993287 0.9868512 0.999886 -0.9949941 0.9868512 0.999886 -0.9971537 0.9868512 0.999886 -0.999886 0.9868512 0.999886 -0.9999099 0.9895825 0.9977452 -0.9999288 0.9917504 0.9968597 -0.9999437 0.9934697 0.9966665 -0.9868505 0.9868539 0.999886 -0.9868505 0.9868539 0.999886 -0.9868505 0.9868539 0.999886 -0.9868505 0.9868538 0.999886 -0.9868504 0.9868538 0.999886 -0.9868504 0.9868537 0.999886 -0.9868504 0.9868536 0.999886 -0.9868503 0.9868535 0.999886 -0.9868503 0.9868534 0.999886 -0.9868502 0.9868533 0.999886 -0.9868502 0.9868531 0.999886 -0.9868501 0.9868529 0.999886 -0.9868501 0.9868527 0.999886 -0.98685 0.9868524 0.999886 -0.9868501 0.9868522 0.999886 -0.9868503 0.986852 0.999886 -0.9868507 0.986852 0.999886 -0.9868512 0.986852 0.999886 -0.986852 0.986852 0.999886 -0.9868529 0.986852 0.999886 -0.9868541 0.986852 0.999886 -0.9868555 0.986852 0.999886 -0.9868574 0.986852 0.999886 -0.9868597 0.986852 0.999886 -0.9868627 0.986852 0.999886 -0.9868665 0.986852 0.999886 -0.9868713 0.986852 0.999886 -0.9868773 0.986852 0.999886 -0.986885 0.986852 0.999886 -0.9868946 0.986852 0.999886 -0.9869069 0.986852 0.999886 -0.9869223 0.986852 0.999886 -0.9869419 0.986852 0.999886 -0.9869667 0.986852 0.999886 -0.986998 0.986852 0.999886 -0.9870376 0.986852 0.999886 -0.9870878 0.986852 0.999886 -0.9871512 0.986852 0.999886 -0.9872315 0.986852 0.999886 -0.987333 0.986852 0.999886 -0.9874615 0.986852 0.999886 -0.987624 0.986852 0.999886 -0.9878296 0.986852 0.999886 -0.9880897 0.986852 0.999886 -0.9884188 0.986852 0.999886 -0.9888351 0.986852 0.999886 -0.9893618 0.986852 0.999886 -0.9900282 0.986852 0.999886 -0.9908712 0.986852 0.999886 -0.9919377 0.986852 0.999886 -0.993287 0.986852 0.999886 -0.9949941 0.986852 0.999886 -0.9971537 0.986852 0.999886 -0.999886 0.986852 0.999886 -0.9999099 0.9895829 0.9977452 -0.9999288 0.9917507 0.9968597 -0.9999437 0.9934698 0.9966665 -0.9868505 0.9868548 0.999886 -0.9868505 0.9868548 0.999886 -0.9868505 0.9868548 0.999886 -0.9868505 0.9868547 0.999886 -0.9868504 0.9868547 0.999886 -0.9868504 0.9868546 0.999886 -0.9868504 0.9868546 0.999886 -0.9868503 0.9868545 0.999886 -0.9868503 0.9868543 0.999886 -0.9868502 0.9868542 0.999886 -0.9868502 0.986854 0.999886 -0.9868501 0.9868538 0.999886 -0.9868501 0.9868536 0.999886 -0.98685 0.9868534 0.999886 -0.9868501 0.9868531 0.999886 -0.9868503 0.9868529 0.999886 -0.9868507 0.9868529 0.999886 -0.9868512 0.9868529 0.999886 -0.986852 0.9868529 0.999886 -0.9868529 0.9868529 0.999886 -0.9868541 0.9868529 0.999886 -0.9868555 0.9868529 0.999886 -0.9868574 0.9868529 0.999886 -0.9868597 0.9868529 0.999886 -0.9868627 0.9868529 0.999886 -0.9868665 0.9868529 0.999886 -0.9868713 0.9868529 0.999886 -0.9868773 0.9868529 0.999886 -0.986885 0.9868529 0.999886 -0.9868946 0.9868529 0.999886 -0.9869069 0.9868529 0.999886 -0.9869223 0.9868529 0.999886 -0.9869419 0.9868529 0.999886 -0.9869667 0.9868529 0.999886 -0.986998 0.9868529 0.999886 -0.9870376 0.9868529 0.999886 -0.9870878 0.9868529 0.999886 -0.9871512 0.9868529 0.999886 -0.9872315 0.9868529 0.999886 -0.987333 0.9868529 0.999886 -0.9874615 0.9868529 0.999886 -0.987624 0.9868529 0.999886 -0.9878296 0.9868529 0.999886 -0.9880897 0.9868529 0.999886 -0.9884188 0.9868529 0.999886 -0.9888351 0.9868529 0.999886 -0.9893618 0.9868529 0.999886 -0.9900282 0.9868529 0.999886 -0.9908712 0.9868529 0.999886 -0.9919377 0.9868529 0.999886 -0.993287 0.9868529 0.999886 -0.9949941 0.9868529 0.999886 -0.9971537 0.9868529 0.999886 -0.999886 0.9868529 0.999886 -0.9999099 0.9895835 0.9977452 -0.9999288 0.991751 0.9968597 -0.9999437 0.9934701 0.9966665 -0.9868505 0.986856 0.999886 -0.9868505 0.986856 0.999886 -0.9868505 0.986856 0.999886 -0.9868505 0.9868559 0.999886 -0.9868504 0.9868559 0.999886 -0.9868504 0.9868558 0.999886 -0.9868504 0.9868557 0.999886 -0.9868503 0.9868556 0.999886 -0.9868503 0.9868555 0.999886 -0.9868502 0.9868554 0.999886 -0.9868502 0.9868552 0.999886 -0.9868501 0.986855 0.999886 -0.9868501 0.9868548 0.999886 -0.98685 0.9868545 0.999886 -0.9868501 0.9868543 0.999886 -0.9868503 0.9868541 0.999886 -0.9868507 0.9868541 0.999886 -0.9868512 0.9868541 0.999886 -0.986852 0.9868541 0.999886 -0.9868529 0.9868541 0.999886 -0.9868541 0.9868541 0.999886 -0.9868555 0.9868541 0.999886 -0.9868574 0.9868541 0.999886 -0.9868597 0.9868541 0.999886 -0.9868627 0.9868541 0.999886 -0.9868665 0.9868541 0.999886 -0.9868713 0.9868541 0.999886 -0.9868773 0.9868541 0.999886 -0.986885 0.9868541 0.999886 -0.9868946 0.9868541 0.999886 -0.9869069 0.9868541 0.999886 -0.9869223 0.9868541 0.999886 -0.9869419 0.9868541 0.999886 -0.9869667 0.9868541 0.999886 -0.986998 0.9868541 0.999886 -0.9870376 0.9868541 0.999886 -0.9870878 0.9868541 0.999886 -0.9871512 0.9868541 0.999886 -0.9872315 0.9868541 0.999886 -0.987333 0.9868541 0.999886 -0.9874615 0.9868541 0.999886 -0.987624 0.9868541 0.999886 -0.9878296 0.9868541 0.999886 -0.9880897 0.9868541 0.999886 -0.9884188 0.9868541 0.999886 -0.9888351 0.9868541 0.999886 -0.9893618 0.9868541 0.999886 -0.9900282 0.9868541 0.999886 -0.9908712 0.9868541 0.999886 -0.9919377 0.9868541 0.999886 -0.993287 0.9868541 0.999886 -0.9949941 0.9868541 0.999886 -0.9971537 0.9868541 0.999886 -0.999886 0.9868541 0.999886 -0.9999099 0.9895842 0.9977452 -0.9999288 0.9917515 0.9968597 -0.9999437 0.9934704 0.9966665 -0.9868505 0.9868575 0.999886 -0.9868505 0.9868575 0.999886 -0.9868505 0.9868574 0.999886 -0.9868505 0.9868574 0.999886 -0.9868504 0.9868573 0.999886 -0.9868504 0.9868573 0.999886 -0.9868504 0.9868572 0.999886 -0.9868503 0.9868571 0.999886 -0.9868503 0.986857 0.999886 -0.9868502 0.9868568 0.999886 -0.9868502 0.9868567 0.999886 -0.9868501 0.9868565 0.999886 -0.9868501 0.9868562 0.999886 -0.98685 0.986856 0.999886 -0.9868501 0.9868558 0.999886 -0.9868503 0.9868556 0.999886 -0.9868507 0.9868555 0.999886 -0.9868512 0.9868555 0.999886 -0.986852 0.9868555 0.999886 -0.9868529 0.9868555 0.999886 -0.9868541 0.9868555 0.999886 -0.9868555 0.9868555 0.999886 -0.9868574 0.9868555 0.999886 -0.9868597 0.9868555 0.999886 -0.9868627 0.9868555 0.999886 -0.9868665 0.9868555 0.999886 -0.9868713 0.9868555 0.999886 -0.9868773 0.9868555 0.999886 -0.986885 0.9868555 0.999886 -0.9868946 0.9868555 0.999886 -0.9869069 0.9868555 0.999886 -0.9869223 0.9868555 0.999886 -0.9869419 0.9868555 0.999886 -0.9869667 0.9868555 0.999886 -0.986998 0.9868555 0.999886 -0.9870376 0.9868555 0.999886 -0.9870878 0.9868555 0.999886 -0.9871512 0.9868555 0.999886 -0.9872315 0.9868555 0.999886 -0.987333 0.9868555 0.999886 -0.9874615 0.9868555 0.999886 -0.987624 0.9868555 0.999886 -0.9878296 0.9868555 0.999886 -0.9880897 0.9868555 0.999886 -0.9884188 0.9868555 0.999886 -0.9888351 0.9868555 0.999886 -0.9893618 0.9868555 0.999886 -0.9900282 0.9868555 0.999886 -0.9908712 0.9868555 0.999886 -0.9919377 0.9868555 0.999886 -0.993287 0.9868555 0.999886 -0.9949941 0.9868555 0.999886 -0.9971537 0.9868555 0.999886 -0.999886 0.9868555 0.999886 -0.9999099 0.9895851 0.9977452 -0.9999288 0.9917521 0.9968597 -0.9999437 0.9934707 0.9966665 -0.9868505 0.9868593 0.999886 -0.9868505 0.9868593 0.999886 -0.9868505 0.9868593 0.999886 -0.9868505 0.9868592 0.999886 -0.9868504 0.9868592 0.999886 -0.9868504 0.9868591 0.999886 -0.9868504 0.9868591 0.999886 -0.9868503 0.986859 0.999886 -0.9868503 0.9868588 0.999886 -0.9868502 0.9868587 0.999886 -0.9868502 0.9868585 0.999886 -0.9868501 0.9868583 0.999886 -0.9868501 0.9868581 0.999886 -0.98685 0.9868579 0.999886 -0.9868501 0.9868576 0.999886 -0.9868503 0.9868574 0.999886 -0.9868507 0.9868574 0.999886 -0.9868512 0.9868574 0.999886 -0.986852 0.9868574 0.999886 -0.9868529 0.9868574 0.999886 -0.9868541 0.9868574 0.999886 -0.9868555 0.9868574 0.999886 -0.9868574 0.9868574 0.999886 -0.9868597 0.9868574 0.999886 -0.9868627 0.9868574 0.999886 -0.9868665 0.9868574 0.999886 -0.9868713 0.9868574 0.999886 -0.9868773 0.9868574 0.999886 -0.986885 0.9868574 0.999886 -0.9868946 0.9868574 0.999886 -0.9869069 0.9868574 0.999886 -0.9869223 0.9868574 0.999886 -0.9869419 0.9868574 0.999886 -0.9869667 0.9868574 0.999886 -0.986998 0.9868574 0.999886 -0.9870376 0.9868574 0.999886 -0.9870878 0.9868574 0.999886 -0.9871512 0.9868574 0.999886 -0.9872315 0.9868574 0.999886 -0.987333 0.9868574 0.999886 -0.9874615 0.9868574 0.999886 -0.987624 0.9868574 0.999886 -0.9878296 0.9868574 0.999886 -0.9880897 0.9868574 0.999886 -0.9884188 0.9868574 0.999886 -0.9888351 0.9868574 0.999886 -0.9893618 0.9868574 0.999886 -0.9900282 0.9868574 0.999886 -0.9908712 0.9868574 0.999886 -0.9919377 0.9868574 0.999886 -0.993287 0.9868574 0.999886 -0.9949941 0.9868574 0.999886 -0.9971537 0.9868574 0.999886 -0.999886 0.9868574 0.999886 -0.9999099 0.9895863 0.9977452 -0.9999288 0.9917528 0.9968597 -0.9999437 0.9934712 0.9966665 -0.9868505 0.9868617 0.999886 -0.9868505 0.9868617 0.999886 -0.9868505 0.9868616 0.999886 -0.9868505 0.9868616 0.999886 -0.9868504 0.9868616 0.999886 -0.9868504 0.9868615 0.999886 -0.9868504 0.9868614 0.999886 -0.9868503 0.9868613 0.999886 -0.9868503 0.9868612 0.999886 -0.9868502 0.9868611 0.999886 -0.9868502 0.9868609 0.999886 -0.9868501 0.9868607 0.999886 -0.9868501 0.9868605 0.999886 -0.98685 0.9868602 0.999886 -0.9868501 0.98686 0.999886 -0.9868503 0.9868598 0.999886 -0.9868507 0.9868597 0.999886 -0.9868512 0.9868597 0.999886 -0.986852 0.9868597 0.999886 -0.9868529 0.9868597 0.999886 -0.9868541 0.9868597 0.999886 -0.9868555 0.9868597 0.999886 -0.9868574 0.9868597 0.999886 -0.9868597 0.9868597 0.999886 -0.9868627 0.9868597 0.999886 -0.9868665 0.9868597 0.999886 -0.9868713 0.9868597 0.999886 -0.9868773 0.9868597 0.999886 -0.986885 0.9868597 0.999886 -0.9868946 0.9868597 0.999886 -0.9869069 0.9868597 0.999886 -0.9869223 0.9868597 0.999886 -0.9869419 0.9868597 0.999886 -0.9869667 0.9868597 0.999886 -0.986998 0.9868597 0.999886 -0.9870376 0.9868597 0.999886 -0.9870878 0.9868597 0.999886 -0.9871512 0.9868597 0.999886 -0.9872315 0.9868597 0.999886 -0.987333 0.9868597 0.999886 -0.9874615 0.9868597 0.999886 -0.987624 0.9868597 0.999886 -0.9878296 0.9868597 0.999886 -0.9880897 0.9868597 0.999886 -0.9884188 0.9868597 0.999886 -0.9888351 0.9868597 0.999886 -0.9893618 0.9868597 0.999886 -0.9900282 0.9868597 0.999886 -0.9908712 0.9868597 0.999886 -0.9919377 0.9868597 0.999886 -0.993287 0.9868597 0.999886 -0.9949941 0.9868597 0.999886 -0.9971537 0.9868597 0.999886 -0.999886 0.9868597 0.999886 -0.9999099 0.9895878 0.9977452 -0.9999288 0.9917537 0.9968597 -0.9999437 0.9934718 0.9966665 -0.9868505 0.9868647 0.999886 -0.9868505 0.9868647 0.999886 -0.9868505 0.9868646 0.999886 -0.9868505 0.9868646 0.999886 -0.9868504 0.9868645 0.999886 -0.9868504 0.9868645 0.999886 -0.9868504 0.9868644 0.999886 -0.9868503 0.9868643 0.999886 -0.9868503 0.9868642 0.999886 -0.9868502 0.986864 0.999886 -0.9868502 0.9868639 0.999886 -0.9868501 0.9868637 0.999886 -0.9868501 0.9868634 0.999886 -0.98685 0.9868632 0.999886 -0.9868501 0.986863 0.999886 -0.9868503 0.9868628 0.999886 -0.9868507 0.9868627 0.999886 -0.9868512 0.9868627 0.999886 -0.986852 0.9868627 0.999886 -0.9868529 0.9868627 0.999886 -0.9868541 0.9868627 0.999886 -0.9868555 0.9868627 0.999886 -0.9868574 0.9868627 0.999886 -0.9868597 0.9868627 0.999886 -0.9868627 0.9868627 0.999886 -0.9868665 0.9868627 0.999886 -0.9868713 0.9868627 0.999886 -0.9868773 0.9868627 0.999886 -0.986885 0.9868627 0.999886 -0.9868946 0.9868627 0.999886 -0.9869069 0.9868627 0.999886 -0.9869223 0.9868627 0.999886 -0.9869419 0.9868627 0.999886 -0.9869667 0.9868627 0.999886 -0.986998 0.9868627 0.999886 -0.9870376 0.9868627 0.999886 -0.9870878 0.9868627 0.999886 -0.9871512 0.9868627 0.999886 -0.9872315 0.9868627 0.999886 -0.987333 0.9868627 0.999886 -0.9874615 0.9868627 0.999886 -0.987624 0.9868627 0.999886 -0.9878296 0.9868627 0.999886 -0.9880897 0.9868627 0.999886 -0.9884188 0.9868627 0.999886 -0.9888351 0.9868627 0.999886 -0.9893618 0.9868627 0.999886 -0.9900282 0.9868627 0.999886 -0.9908712 0.9868627 0.999886 -0.9919377 0.9868627 0.999886 -0.993287 0.9868627 0.999886 -0.9949941 0.9868627 0.999886 -0.9971537 0.9868627 0.999886 -0.999886 0.9868627 0.999886 -0.9999099 0.9895897 0.9977452 -0.9999288 0.9917549 0.9968597 -0.9999437 0.9934725 0.9966665 -0.9868505 0.9868685 0.999886 -0.9868505 0.9868684 0.999886 -0.9868505 0.9868684 0.999886 -0.9868505 0.9868684 0.999886 -0.9868504 0.9868683 0.999886 -0.9868504 0.9868682 0.999886 -0.9868504 0.9868682 0.999886 -0.9868503 0.9868681 0.999886 -0.9868503 0.986868 0.999886 -0.9868502 0.9868678 0.999886 -0.9868502 0.9868676 0.999886 -0.9868501 0.9868674 0.999886 -0.9868501 0.9868672 0.999886 -0.98685 0.986867 0.999886 -0.9868501 0.9868667 0.999886 -0.9868503 0.9868666 0.999886 -0.9868507 0.9868665 0.999886 -0.9868512 0.9868665 0.999886 -0.986852 0.9868665 0.999886 -0.9868529 0.9868665 0.999886 -0.9868541 0.9868665 0.999886 -0.9868555 0.9868665 0.999886 -0.9868574 0.9868665 0.999886 -0.9868597 0.9868665 0.999886 -0.9868627 0.9868665 0.999886 -0.9868665 0.9868665 0.999886 -0.9868713 0.9868665 0.999886 -0.9868773 0.9868665 0.999886 -0.986885 0.9868665 0.999886 -0.9868946 0.9868665 0.999886 -0.9869069 0.9868665 0.999886 -0.9869223 0.9868665 0.999886 -0.9869419 0.9868665 0.999886 -0.9869667 0.9868665 0.999886 -0.986998 0.9868665 0.999886 -0.9870376 0.9868665 0.999886 -0.9870878 0.9868665 0.999886 -0.9871512 0.9868665 0.999886 -0.9872315 0.9868665 0.999886 -0.987333 0.9868665 0.999886 -0.9874615 0.9868665 0.999886 -0.987624 0.9868665 0.999886 -0.9878296 0.9868665 0.999886 -0.9880897 0.9868665 0.999886 -0.9884188 0.9868665 0.999886 -0.9888351 0.9868665 0.999886 -0.9893618 0.9868665 0.999886 -0.9900282 0.9868665 0.999886 -0.9908712 0.9868665 0.999886 -0.9919377 0.9868665 0.999886 -0.993287 0.9868665 0.999886 -0.9949941 0.9868665 0.999886 -0.9971537 0.9868665 0.999886 -0.999886 0.9868665 0.999886 -0.9999099 0.989592 0.9977452 -0.9999288 0.9917564 0.9968597 -0.9999437 0.9934734 0.9966665 -0.9868505 0.9868732 0.999886 -0.9868505 0.9868732 0.999886 -0.9868505 0.9868732 0.999886 -0.9868505 0.9868731 0.999886 -0.9868504 0.9868731 0.999886 -0.9868504 0.986873 0.999886 -0.9868504 0.9868729 0.999886 -0.9868503 0.9868728 0.999886 -0.9868503 0.9868727 0.999886 -0.9868502 0.9868726 0.999886 -0.9868502 0.9868724 0.999886 -0.9868501 0.9868722 0.999886 -0.9868501 0.986872 0.999886 -0.98685 0.9868717 0.999886 -0.9868501 0.9868715 0.999886 -0.9868503 0.9868713 0.999886 -0.9868507 0.9868713 0.999886 -0.9868512 0.9868713 0.999886 -0.986852 0.9868713 0.999886 -0.9868529 0.9868713 0.999886 -0.9868541 0.9868713 0.999886 -0.9868555 0.9868713 0.999886 -0.9868574 0.9868713 0.999886 -0.9868597 0.9868713 0.999886 -0.9868627 0.9868713 0.999886 -0.9868665 0.9868713 0.999886 -0.9868713 0.9868713 0.999886 -0.9868773 0.9868713 0.999886 -0.986885 0.9868713 0.999886 -0.9868946 0.9868713 0.999886 -0.9869069 0.9868713 0.999886 -0.9869223 0.9868713 0.999886 -0.9869419 0.9868713 0.999886 -0.9869667 0.9868713 0.999886 -0.986998 0.9868713 0.999886 -0.9870376 0.9868713 0.999886 -0.9870878 0.9868713 0.999886 -0.9871512 0.9868713 0.999886 -0.9872315 0.9868713 0.999886 -0.987333 0.9868713 0.999886 -0.9874615 0.9868713 0.999886 -0.987624 0.9868713 0.999886 -0.9878296 0.9868713 0.999886 -0.9880897 0.9868713 0.999886 -0.9884188 0.9868713 0.999886 -0.9888351 0.9868713 0.999886 -0.9893618 0.9868713 0.999886 -0.9900282 0.9868713 0.999886 -0.9908712 0.9868713 0.999886 -0.9919377 0.9868713 0.999886 -0.993287 0.9868713 0.999886 -0.9949941 0.9868713 0.999886 -0.9971537 0.9868713 0.999886 -0.999886 0.9868713 0.999886 -0.9999099 0.989595 0.9977452 -0.9999288 0.9917582 0.9968597 -0.9999437 0.9934746 0.9966665 -0.9868505 0.9868793 0.999886 -0.9868505 0.9868792 0.999886 -0.9868505 0.9868792 0.999886 -0.9868505 0.9868792 0.999886 -0.9868504 0.9868791 0.999886 -0.9868504 0.9868791 0.999886 -0.9868504 0.986879 0.999886 -0.9868503 0.9868789 0.999886 -0.9868503 0.9868788 0.999886 -0.9868502 0.9868786 0.999886 -0.9868502 0.9868785 0.999886 -0.9868501 0.9868783 0.999886 -0.9868501 0.986878 0.999886 -0.98685 0.9868778 0.999886 -0.9868501 0.9868776 0.999886 -0.9868503 0.9868774 0.999886 -0.9868507 0.9868773 0.999886 -0.9868512 0.9868773 0.999886 -0.986852 0.9868773 0.999886 -0.9868529 0.9868773 0.999886 -0.9868541 0.9868773 0.999886 -0.9868555 0.9868773 0.999886 -0.9868574 0.9868773 0.999886 -0.9868597 0.9868773 0.999886 -0.9868627 0.9868773 0.999886 -0.9868665 0.9868773 0.999886 -0.9868713 0.9868773 0.999886 -0.9868773 0.9868773 0.999886 -0.986885 0.9868773 0.999886 -0.9868946 0.9868773 0.999886 -0.9869069 0.9868773 0.999886 -0.9869223 0.9868773 0.999886 -0.9869419 0.9868773 0.999886 -0.9869667 0.9868773 0.999886 -0.986998 0.9868773 0.999886 -0.9870376 0.9868773 0.999886 -0.9870878 0.9868773 0.999886 -0.9871512 0.9868773 0.999886 -0.9872315 0.9868773 0.999886 -0.987333 0.9868773 0.999886 -0.9874615 0.9868773 0.999886 -0.987624 0.9868773 0.999886 -0.9878296 0.9868773 0.999886 -0.9880897 0.9868773 0.999886 -0.9884188 0.9868773 0.999886 -0.9888351 0.9868773 0.999886 -0.9893618 0.9868773 0.999886 -0.9900282 0.9868773 0.999886 -0.9908712 0.9868773 0.999886 -0.9919377 0.9868773 0.999886 -0.993287 0.9868773 0.999886 -0.9949941 0.9868773 0.999886 -0.9971537 0.9868773 0.999886 -0.999886 0.9868773 0.999886 -0.9999099 0.9895988 0.9977452 -0.9999288 0.9917606 0.9968597 -0.9999437 0.9934761 0.9966665 -0.9868505 0.9868869 0.999886 -0.9868505 0.9868869 0.999886 -0.9868505 0.9868869 0.999886 -0.9868505 0.9868868 0.999886 -0.9868504 0.9868868 0.999886 -0.9868504 0.9868867 0.999886 -0.9868504 0.9868866 0.999886 -0.9868503 0.9868865 0.999886 -0.9868503 0.9868864 0.999886 -0.9868502 0.9868863 0.999886 -0.9868502 0.9868861 0.999886 -0.9868501 0.9868859 0.999886 -0.9868501 0.9868857 0.999886 -0.98685 0.9868854 0.999886 -0.9868501 0.9868852 0.999886 -0.9868503 0.986885 0.999886 -0.9868507 0.986885 0.999886 -0.9868512 0.986885 0.999886 -0.986852 0.986885 0.999886 -0.9868529 0.986885 0.999886 -0.9868541 0.986885 0.999886 -0.9868555 0.986885 0.999886 -0.9868574 0.986885 0.999886 -0.9868597 0.986885 0.999886 -0.9868627 0.986885 0.999886 -0.9868665 0.986885 0.999886 -0.9868713 0.986885 0.999886 -0.9868773 0.986885 0.999886 -0.986885 0.986885 0.999886 -0.9868946 0.986885 0.999886 -0.9869069 0.986885 0.999886 -0.9869223 0.986885 0.999886 -0.9869419 0.986885 0.999886 -0.9869667 0.986885 0.999886 -0.986998 0.986885 0.999886 -0.9870376 0.986885 0.999886 -0.9870878 0.986885 0.999886 -0.9871512 0.986885 0.999886 -0.9872315 0.986885 0.999886 -0.987333 0.986885 0.999886 -0.9874615 0.986885 0.999886 -0.987624 0.986885 0.999886 -0.9878296 0.986885 0.999886 -0.9880897 0.986885 0.999886 -0.9884188 0.986885 0.999886 -0.9888351 0.986885 0.999886 -0.9893618 0.986885 0.999886 -0.9900282 0.986885 0.999886 -0.9908712 0.986885 0.999886 -0.9919377 0.986885 0.999886 -0.993287 0.986885 0.999886 -0.9949941 0.986885 0.999886 -0.9971537 0.986885 0.999886 -0.999886 0.986885 0.999886 -0.9999099 0.9896036 0.9977452 -0.9999288 0.9917636 0.9968597 -0.9999437 0.9934779 0.9966665 -0.9868505 0.9868966 0.999886 -0.9868505 0.9868965 0.999886 -0.9868505 0.9868965 0.999886 -0.9868505 0.9868965 0.999886 -0.9868504 0.9868964 0.999886 -0.9868504 0.9868964 0.999886 -0.9868504 0.9868963 0.999886 -0.9868503 0.9868962 0.999886 -0.9868503 0.9868961 0.999886 -0.9868502 0.9868959 0.999886 -0.9868502 0.9868958 0.999886 -0.9868501 0.9868956 0.999886 -0.9868501 0.9868953 0.999886 -0.98685 0.9868951 0.999886 -0.9868501 0.9868949 0.999886 -0.9868503 0.9868947 0.999886 -0.9868507 0.9868946 0.999886 -0.9868512 0.9868946 0.999886 -0.986852 0.9868946 0.999886 -0.9868529 0.9868946 0.999886 -0.9868541 0.9868946 0.999886 -0.9868555 0.9868946 0.999886 -0.9868574 0.9868946 0.999886 -0.9868597 0.9868946 0.999886 -0.9868627 0.9868946 0.999886 -0.9868665 0.9868946 0.999886 -0.9868713 0.9868946 0.999886 -0.9868773 0.9868946 0.999886 -0.986885 0.9868946 0.999886 -0.9868946 0.9868946 0.999886 -0.9869069 0.9868946 0.999886 -0.9869223 0.9868946 0.999886 -0.9869419 0.9868946 0.999886 -0.9869667 0.9868946 0.999886 -0.986998 0.9868946 0.999886 -0.9870376 0.9868946 0.999886 -0.9870878 0.9868946 0.999886 -0.9871512 0.9868946 0.999886 -0.9872315 0.9868946 0.999886 -0.987333 0.9868946 0.999886 -0.9874615 0.9868946 0.999886 -0.987624 0.9868946 0.999886 -0.9878296 0.9868946 0.999886 -0.9880897 0.9868946 0.999886 -0.9884188 0.9868946 0.999886 -0.9888351 0.9868946 0.999886 -0.9893618 0.9868946 0.999886 -0.9900282 0.9868946 0.999886 -0.9908712 0.9868946 0.999886 -0.9919377 0.9868946 0.999886 -0.993287 0.9868946 0.999886 -0.9949941 0.9868946 0.999886 -0.9971537 0.9868946 0.999886 -0.999886 0.9868946 0.999886 -0.9999099 0.9896096 0.9977452 -0.9999288 0.9917674 0.9968597 -0.9999437 0.9934803 0.9966665 -0.9868505 0.9869088 0.999886 -0.9868505 0.9869088 0.999886 -0.9868505 0.9869087 0.999886 -0.9868505 0.9869087 0.999886 -0.9868504 0.9869087 0.999886 -0.9868504 0.9869086 0.999886 -0.9868504 0.9869085 0.999886 -0.9868503 0.9869084 0.999886 -0.9868503 0.9869083 0.999886 -0.9868502 0.9869082 0.999886 -0.9868502 0.986908 0.999886 -0.9868501 0.9869078 0.999886 -0.9868501 0.9869076 0.999886 -0.98685 0.9869073 0.999886 -0.9868501 0.9869071 0.999886 -0.9868503 0.9869069 0.999886 -0.9868507 0.9869069 0.999886 -0.9868512 0.9869069 0.999886 -0.986852 0.9869069 0.999886 -0.9868529 0.9869069 0.999886 -0.9868541 0.9869069 0.999886 -0.9868555 0.9869069 0.999886 -0.9868574 0.9869069 0.999886 -0.9868597 0.9869069 0.999886 -0.9868627 0.9869069 0.999886 -0.9868665 0.9869069 0.999886 -0.9868713 0.9869069 0.999886 -0.9868773 0.9869069 0.999886 -0.986885 0.9869069 0.999886 -0.9868946 0.9869069 0.999886 -0.9869069 0.9869069 0.999886 -0.9869223 0.9869069 0.999886 -0.9869419 0.9869069 0.999886 -0.9869667 0.9869069 0.999886 -0.986998 0.9869069 0.999886 -0.9870376 0.9869069 0.999886 -0.9870878 0.9869069 0.999886 -0.9871512 0.9869069 0.999886 -0.9872315 0.9869069 0.999886 -0.987333 0.9869069 0.999886 -0.9874615 0.9869069 0.999886 -0.987624 0.9869069 0.999886 -0.9878296 0.9869069 0.999886 -0.9880897 0.9869069 0.999886 -0.9884188 0.9869069 0.999886 -0.9888351 0.9869069 0.999886 -0.9893618 0.9869069 0.999886 -0.9900282 0.9869069 0.999886 -0.9908712 0.9869069 0.999886 -0.9919377 0.9869069 0.999886 -0.993287 0.9869069 0.999886 -0.9949941 0.9869069 0.999886 -0.9971537 0.9869069 0.999886 -0.999886 0.9869069 0.999886 -0.9999099 0.9896173 0.9977452 -0.9999288 0.9917722 0.9968597 -0.9999437 0.9934833 0.9966665 -0.9868505 0.9869243 0.999886 -0.9868505 0.9869242 0.999886 -0.9868505 0.9869242 0.999886 -0.9868505 0.9869242 0.999886 -0.9868504 0.9869241 0.999886 -0.9868504 0.9869241 0.999886 -0.9868504 0.986924 0.999886 -0.9868503 0.9869239 0.999886 -0.9868503 0.9869238 0.999886 -0.9868502 0.9869236 0.999886 -0.9868502 0.9869235 0.999886 -0.9868501 0.9869233 0.999886 -0.9868501 0.986923 0.999886 -0.98685 0.9869228 0.999886 -0.9868501 0.9869226 0.999886 -0.9868503 0.9869224 0.999886 -0.9868507 0.9869223 0.999886 -0.9868512 0.9869223 0.999886 -0.986852 0.9869223 0.999886 -0.9868529 0.9869223 0.999886 -0.9868541 0.9869223 0.999886 -0.9868555 0.9869223 0.999886 -0.9868574 0.9869223 0.999886 -0.9868597 0.9869223 0.999886 -0.9868627 0.9869223 0.999886 -0.9868665 0.9869223 0.999886 -0.9868713 0.9869223 0.999886 -0.9868773 0.9869223 0.999886 -0.986885 0.9869223 0.999886 -0.9868946 0.9869223 0.999886 -0.9869069 0.9869223 0.999886 -0.9869223 0.9869223 0.999886 -0.9869419 0.9869223 0.999886 -0.9869667 0.9869223 0.999886 -0.986998 0.9869223 0.999886 -0.9870376 0.9869223 0.999886 -0.9870878 0.9869223 0.999886 -0.9871512 0.9869223 0.999886 -0.9872315 0.9869223 0.999886 -0.987333 0.9869223 0.999886 -0.9874615 0.9869223 0.999886 -0.987624 0.9869223 0.999886 -0.9878296 0.9869223 0.999886 -0.9880897 0.9869223 0.999886 -0.9884188 0.9869223 0.999886 -0.9888351 0.9869223 0.999886 -0.9893618 0.9869223 0.999886 -0.9900282 0.9869223 0.999886 -0.9908712 0.9869223 0.999886 -0.9919377 0.9869223 0.999886 -0.993287 0.9869223 0.999886 -0.9949941 0.9869223 0.999886 -0.9971537 0.9869223 0.999886 -0.999886 0.9869223 0.999886 -0.9999099 0.989627 0.9977452 -0.9999288 0.9917782 0.9968597 -0.9999437 0.9934871 0.9966665 -0.9868505 0.9869438 0.999886 -0.9868505 0.9869438 0.999886 -0.9868505 0.9869438 0.999886 -0.9868505 0.9869437 0.999886 -0.9868504 0.9869437 0.999886 -0.9868504 0.9869436 0.999886 -0.9868504 0.9869436 0.999886 -0.9868503 0.9869435 0.999886 -0.9868503 0.9869433 0.999886 -0.9868502 0.9869432 0.999886 -0.9868502 0.986943 0.999886 -0.9868501 0.9869428 0.999886 -0.9868501 0.9869426 0.999886 -0.98685 0.9869424 0.999886 -0.9868501 0.9869421 0.999886 -0.9868503 0.986942 0.999886 -0.9868507 0.9869419 0.999886 -0.9868512 0.9869419 0.999886 -0.986852 0.9869419 0.999886 -0.9868529 0.9869419 0.999886 -0.9868541 0.9869419 0.999886 -0.9868555 0.9869419 0.999886 -0.9868574 0.9869419 0.999886 -0.9868597 0.9869419 0.999886 -0.9868627 0.9869419 0.999886 -0.9868665 0.9869419 0.999886 -0.9868713 0.9869419 0.999886 -0.9868773 0.9869419 0.999886 -0.986885 0.9869419 0.999886 -0.9868946 0.9869419 0.999886 -0.9869069 0.9869419 0.999886 -0.9869223 0.9869419 0.999886 -0.9869419 0.9869419 0.999886 -0.9869667 0.9869419 0.999886 -0.986998 0.9869419 0.999886 -0.9870376 0.9869419 0.999886 -0.9870878 0.9869419 0.999886 -0.9871512 0.9869419 0.999886 -0.9872315 0.9869419 0.999886 -0.987333 0.9869419 0.999886 -0.9874615 0.9869419 0.999886 -0.987624 0.9869419 0.999886 -0.9878296 0.9869419 0.999886 -0.9880897 0.9869419 0.999886 -0.9884188 0.9869419 0.999886 -0.9888351 0.9869419 0.999886 -0.9893618 0.9869419 0.999886 -0.9900282 0.9869419 0.999886 -0.9908712 0.9869419 0.999886 -0.9919377 0.9869419 0.999886 -0.993287 0.9869419 0.999886 -0.9949941 0.9869419 0.999886 -0.9971537 0.9869419 0.999886 -0.999886 0.9869419 0.999886 -0.9999099 0.9896392 0.9977452 -0.9999288 0.9917859 0.9968597 -0.9999437 0.9934919 0.9966665 -0.9868505 0.9869686 0.999886 -0.9868505 0.9869686 0.999886 -0.9868505 0.9869685 0.999886 -0.9868505 0.9869685 0.999886 -0.9868504 0.9869685 0.999886 -0.9868504 0.9869684 0.999886 -0.9868504 0.9869683 0.999886 -0.9868503 0.9869682 0.999886 -0.9868503 0.9869681 0.999886 -0.9868502 0.986968 0.999886 -0.9868502 0.9869678 0.999886 -0.9868501 0.9869676 0.999886 -0.9868501 0.9869674 0.999886 -0.98685 0.9869671 0.999886 -0.9868501 0.9869669 0.999886 -0.9868503 0.9869667 0.999886 -0.9868507 0.9869667 0.999886 -0.9868512 0.9869667 0.999886 -0.986852 0.9869667 0.999886 -0.9868529 0.9869667 0.999886 -0.9868541 0.9869667 0.999886 -0.9868555 0.9869667 0.999886 -0.9868574 0.9869667 0.999886 -0.9868597 0.9869667 0.999886 -0.9868627 0.9869667 0.999886 -0.9868665 0.9869667 0.999886 -0.9868713 0.9869667 0.999886 -0.9868773 0.9869667 0.999886 -0.986885 0.9869667 0.999886 -0.9868946 0.9869667 0.999886 -0.9869069 0.9869667 0.999886 -0.9869223 0.9869667 0.999886 -0.9869419 0.9869667 0.999886 -0.9869667 0.9869667 0.999886 -0.986998 0.9869667 0.999886 -0.9870376 0.9869667 0.999886 -0.9870878 0.9869667 0.999886 -0.9871512 0.9869667 0.999886 -0.9872315 0.9869667 0.999886 -0.987333 0.9869667 0.999886 -0.9874615 0.9869667 0.999886 -0.987624 0.9869667 0.999886 -0.9878296 0.9869667 0.999886 -0.9880897 0.9869667 0.999886 -0.9884188 0.9869667 0.999886 -0.9888351 0.9869667 0.999886 -0.9893618 0.9869667 0.999886 -0.9900282 0.9869667 0.999886 -0.9908712 0.9869667 0.999886 -0.9919377 0.9869667 0.999886 -0.993287 0.9869667 0.999886 -0.9949941 0.9869667 0.999886 -0.9971537 0.9869667 0.999886 -0.999886 0.9869667 0.999886 -0.9999099 0.9896547 0.9977452 -0.9999288 0.9917956 0.9968597 -0.9999437 0.993498 0.9966665 -0.9868505 0.9869999 0.999886 -0.9868505 0.9869999 0.999886 -0.9868505 0.9869999 0.999886 -0.9868505 0.9869998 0.999886 -0.9868504 0.9869998 0.999886 -0.9868504 0.9869997 0.999886 -0.9868504 0.9869996 0.999886 -0.9868503 0.9869995 0.999886 -0.9868503 0.9869994 0.999886 -0.9868502 0.9869993 0.999886 -0.9868502 0.9869991 0.999886 -0.9868501 0.9869989 0.999886 -0.9868501 0.9869987 0.999886 -0.98685 0.9869985 0.999886 -0.9868501 0.9869982 0.999886 -0.9868503 0.986998 0.999886 -0.9868507 0.986998 0.999886 -0.9868512 0.986998 0.999886 -0.986852 0.986998 0.999886 -0.9868529 0.986998 0.999886 -0.9868541 0.986998 0.999886 -0.9868555 0.986998 0.999886 -0.9868574 0.986998 0.999886 -0.9868597 0.986998 0.999886 -0.9868627 0.986998 0.999886 -0.9868665 0.986998 0.999886 -0.9868713 0.986998 0.999886 -0.9868773 0.986998 0.999886 -0.986885 0.986998 0.999886 -0.9868946 0.986998 0.999886 -0.9869069 0.986998 0.999886 -0.9869223 0.986998 0.999886 -0.9869419 0.986998 0.999886 -0.9869667 0.986998 0.999886 -0.986998 0.986998 0.999886 -0.9870376 0.986998 0.999886 -0.9870878 0.986998 0.999886 -0.9871512 0.986998 0.999886 -0.9872315 0.986998 0.999886 -0.987333 0.986998 0.999886 -0.9874615 0.986998 0.999886 -0.987624 0.986998 0.999886 -0.9878296 0.986998 0.999886 -0.9880897 0.986998 0.999886 -0.9884188 0.986998 0.999886 -0.9888351 0.986998 0.999886 -0.9893618 0.986998 0.999886 -0.9900282 0.986998 0.999886 -0.9908712 0.986998 0.999886 -0.9919377 0.986998 0.999886 -0.993287 0.986998 0.999886 -0.9949941 0.986998 0.999886 -0.9971537 0.986998 0.999886 -0.999886 0.986998 0.999886 -0.9999099 0.9896744 0.9977452 -0.9999288 0.9918079 0.9968597 -0.9999437 0.9935057 0.9966665 -0.9868505 0.9870396 0.999886 -0.9868505 0.9870395 0.999886 -0.9868505 0.9870395 0.999886 -0.9868505 0.9870395 0.999886 -0.9868504 0.9870394 0.999886 -0.9868504 0.9870393 0.999886 -0.9868504 0.9870393 0.999886 -0.9868503 0.9870392 0.999886 -0.9868503 0.9870391 0.999886 -0.9868502 0.9870389 0.999886 -0.9868502 0.9870387 0.999886 -0.9868501 0.9870386 0.999886 -0.9868501 0.9870383 0.999886 -0.98685 0.9870381 0.999886 -0.9868501 0.9870379 0.999886 -0.9868503 0.9870377 0.999886 -0.9868507 0.9870376 0.999886 -0.9868512 0.9870376 0.999886 -0.986852 0.9870376 0.999886 -0.9868529 0.9870376 0.999886 -0.9868541 0.9870376 0.999886 -0.9868555 0.9870376 0.999886 -0.9868574 0.9870376 0.999886 -0.9868597 0.9870376 0.999886 -0.9868627 0.9870376 0.999886 -0.9868665 0.9870376 0.999886 -0.9868713 0.9870376 0.999886 -0.9868773 0.9870376 0.999886 -0.986885 0.9870376 0.999886 -0.9868946 0.9870376 0.999886 -0.9869069 0.9870376 0.999886 -0.9869223 0.9870376 0.999886 -0.9869419 0.9870376 0.999886 -0.9869667 0.9870376 0.999886 -0.986998 0.9870376 0.999886 -0.9870376 0.9870376 0.999886 -0.9870878 0.9870376 0.999886 -0.9871512 0.9870376 0.999886 -0.9872315 0.9870376 0.999886 -0.987333 0.9870376 0.999886 -0.9874615 0.9870376 0.999886 -0.987624 0.9870376 0.999886 -0.9878296 0.9870376 0.999886 -0.9880897 0.9870376 0.999886 -0.9884188 0.9870376 0.999886 -0.9888351 0.9870376 0.999886 -0.9893618 0.9870376 0.999886 -0.9900282 0.9870376 0.999886 -0.9908712 0.9870376 0.999886 -0.9919377 0.9870376 0.999886 -0.993287 0.9870376 0.999886 -0.9949941 0.9870376 0.999886 -0.9971537 0.9870376 0.999886 -0.999886 0.9870376 0.999886 -0.9999099 0.9896992 0.9977452 -0.9999288 0.9918234 0.9968597 -0.9999437 0.9935154 0.9966665 -0.9868505 0.9870897 0.999886 -0.9868505 0.9870897 0.999886 -0.9868505 0.9870896 0.999886 -0.9868505 0.9870896 0.999886 -0.9868504 0.9870895 0.999886 -0.9868504 0.9870895 0.999886 -0.9868504 0.9870894 0.999886 -0.9868503 0.9870893 0.999886 -0.9868503 0.9870892 0.999886 -0.9868502 0.9870891 0.999886 -0.9868502 0.9870889 0.999886 -0.9868501 0.9870887 0.999886 -0.9868501 0.9870885 0.999886 -0.98685 0.9870882 0.999886 -0.9868501 0.987088 0.999886 -0.9868503 0.9870878 0.999886 -0.9868507 0.9870878 0.999886 -0.9868512 0.9870878 0.999886 -0.986852 0.9870878 0.999886 -0.9868529 0.9870878 0.999886 -0.9868541 0.9870878 0.999886 -0.9868555 0.9870878 0.999886 -0.9868574 0.9870878 0.999886 -0.9868597 0.9870878 0.999886 -0.9868627 0.9870878 0.999886 -0.9868665 0.9870878 0.999886 -0.9868713 0.9870878 0.999886 -0.9868773 0.9870878 0.999886 -0.986885 0.9870878 0.999886 -0.9868946 0.9870878 0.999886 -0.9869069 0.9870878 0.999886 -0.9869223 0.9870878 0.999886 -0.9869419 0.9870878 0.999886 -0.9869667 0.9870878 0.999886 -0.986998 0.9870878 0.999886 -0.9870376 0.9870878 0.999886 -0.9870878 0.9870878 0.999886 -0.9871512 0.9870878 0.999886 -0.9872315 0.9870878 0.999886 -0.987333 0.9870878 0.999886 -0.9874615 0.9870878 0.999886 -0.987624 0.9870878 0.999886 -0.9878296 0.9870878 0.999886 -0.9880897 0.9870878 0.999886 -0.9884188 0.9870878 0.999886 -0.9888351 0.9870878 0.999886 -0.9893618 0.9870878 0.999886 -0.9900282 0.9870878 0.999886 -0.9908712 0.9870878 0.999886 -0.9919377 0.9870878 0.999886 -0.993287 0.9870878 0.999886 -0.9949941 0.9870878 0.999886 -0.9971537 0.9870878 0.999886 -0.999886 0.9870878 0.999886 -0.9999099 0.9897306 0.9977452 -0.9999288 0.9918431 0.9968597 -0.9999437 0.9935277 0.9966665 -0.9868505 0.9871531 0.999886 -0.9868505 0.9871531 0.999886 -0.9868505 0.9871531 0.999886 -0.9868505 0.987153 0.999886 -0.9868504 0.987153 0.999886 -0.9868504 0.9871529 0.999886 -0.9868504 0.9871528 0.999886 -0.9868503 0.9871527 0.999886 -0.9868503 0.9871526 0.999886 -0.9868502 0.9871525 0.999886 -0.9868502 0.9871523 0.999886 -0.9868501 0.9871521 0.999886 -0.9868501 0.9871519 0.999886 -0.98685 0.9871517 0.999886 -0.9868501 0.9871514 0.999886 -0.9868503 0.9871513 0.999886 -0.9868507 0.9871512 0.999886 -0.9868512 0.9871512 0.999886 -0.986852 0.9871512 0.999886 -0.9868529 0.9871512 0.999886 -0.9868541 0.9871512 0.999886 -0.9868555 0.9871512 0.999886 -0.9868574 0.9871512 0.999886 -0.9868597 0.9871512 0.999886 -0.9868627 0.9871512 0.999886 -0.9868665 0.9871512 0.999886 -0.9868713 0.9871512 0.999886 -0.9868773 0.9871512 0.999886 -0.986885 0.9871512 0.999886 -0.9868946 0.9871512 0.999886 -0.9869069 0.9871512 0.999886 -0.9869223 0.9871512 0.999886 -0.9869419 0.9871512 0.999886 -0.9869667 0.9871512 0.999886 -0.986998 0.9871512 0.999886 -0.9870376 0.9871512 0.999886 -0.9870878 0.9871512 0.999886 -0.9871512 0.9871512 0.999886 -0.9872315 0.9871512 0.999886 -0.987333 0.9871512 0.999886 -0.9874615 0.9871512 0.999886 -0.987624 0.9871512 0.999886 -0.9878296 0.9871512 0.999886 -0.9880897 0.9871512 0.999886 -0.9884188 0.9871512 0.999886 -0.9888351 0.9871512 0.999886 -0.9893618 0.9871512 0.999886 -0.9900282 0.9871512 0.999886 -0.9908712 0.9871512 0.999886 -0.9919377 0.9871512 0.999886 -0.993287 0.9871512 0.999886 -0.9949941 0.9871512 0.999886 -0.9971537 0.9871512 0.999886 -0.999886 0.9871512 0.999886 -0.9999099 0.9897703 0.9977452 -0.9999288 0.991868 0.9968597 -0.9999437 0.9935432 0.9966665 -0.9868505 0.9872334 0.999886 -0.9868505 0.9872333 0.999886 -0.9868505 0.9872333 0.999886 -0.9868505 0.9872333 0.999886 -0.9868504 0.9872332 0.999886 -0.9868504 0.9872332 0.999886 -0.9868504 0.9872331 0.999886 -0.9868503 0.987233 0.999886 -0.9868503 0.9872329 0.999886 -0.9868502 0.9872327 0.999886 -0.9868502 0.9872326 0.999886 -0.9868501 0.9872324 0.999886 -0.9868501 0.9872322 0.999886 -0.98685 0.9872319 0.999886 -0.9868501 0.9872317 0.999886 -0.9868503 0.9872315 0.999886 -0.9868507 0.9872315 0.999886 -0.9868512 0.9872315 0.999886 -0.986852 0.9872315 0.999886 -0.9868529 0.9872315 0.999886 -0.9868541 0.9872315 0.999886 -0.9868555 0.9872315 0.999886 -0.9868574 0.9872315 0.999886 -0.9868597 0.9872315 0.999886 -0.9868627 0.9872315 0.999886 -0.9868665 0.9872315 0.999886 -0.9868713 0.9872315 0.999886 -0.9868773 0.9872315 0.999886 -0.986885 0.9872315 0.999886 -0.9868946 0.9872315 0.999886 -0.9869069 0.9872315 0.999886 -0.9869223 0.9872315 0.999886 -0.9869419 0.9872315 0.999886 -0.9869667 0.9872315 0.999886 -0.986998 0.9872315 0.999886 -0.9870376 0.9872315 0.999886 -0.9870878 0.9872315 0.999886 -0.9871512 0.9872315 0.999886 -0.9872315 0.9872315 0.999886 -0.987333 0.9872315 0.999886 -0.9874615 0.9872315 0.999886 -0.987624 0.9872315 0.999886 -0.9878296 0.9872315 0.999886 -0.9880897 0.9872315 0.999886 -0.9884188 0.9872315 0.999886 -0.9888351 0.9872315 0.999886 -0.9893618 0.9872315 0.999886 -0.9900282 0.9872315 0.999886 -0.9908712 0.9872315 0.999886 -0.9919377 0.9872315 0.999886 -0.993287 0.9872315 0.999886 -0.9949941 0.9872315 0.999886 -0.9971537 0.9872315 0.999886 -0.999886 0.9872315 0.999886 -0.9999099 0.9898206 0.9977452 -0.9999288 0.9918994 0.9968597 -0.9999437 0.9935629 0.9966665 -0.9868505 0.9873349 0.999886 -0.9868505 0.9873349 0.999886 -0.9868505 0.9873348 0.999886 -0.9868505 0.9873348 0.999886 -0.9868504 0.9873347 0.999886 -0.9868504 0.9873347 0.999886 -0.9868504 0.9873346 0.999886 -0.9868503 0.9873345 0.999886 -0.9868503 0.9873344 0.999886 -0.9868502 0.9873343 0.999886 -0.9868502 0.9873341 0.999886 -0.9868501 0.9873339 0.999886 -0.9868501 0.9873337 0.999886 -0.98685 0.9873335 0.999886 -0.9868501 0.9873332 0.999886 -0.9868503 0.9873331 0.999886 -0.9868507 0.987333 0.999886 -0.9868512 0.987333 0.999886 -0.986852 0.987333 0.999886 -0.9868529 0.987333 0.999886 -0.9868541 0.987333 0.999886 -0.9868555 0.987333 0.999886 -0.9868574 0.987333 0.999886 -0.9868597 0.987333 0.999886 -0.9868627 0.987333 0.999886 -0.9868665 0.987333 0.999886 -0.9868713 0.987333 0.999886 -0.9868773 0.987333 0.999886 -0.986885 0.987333 0.999886 -0.9868946 0.987333 0.999886 -0.9869069 0.987333 0.999886 -0.9869223 0.987333 0.999886 -0.9869419 0.987333 0.999886 -0.9869667 0.987333 0.999886 -0.986998 0.987333 0.999886 -0.9870376 0.987333 0.999886 -0.9870878 0.987333 0.999886 -0.9871512 0.987333 0.999886 -0.9872315 0.987333 0.999886 -0.987333 0.987333 0.999886 -0.9874615 0.987333 0.999886 -0.987624 0.987333 0.999886 -0.9878296 0.987333 0.999886 -0.9880897 0.987333 0.999886 -0.9884188 0.987333 0.999886 -0.9888351 0.987333 0.999886 -0.9893618 0.987333 0.999886 -0.9900282 0.987333 0.999886 -0.9908712 0.987333 0.999886 -0.9919377 0.987333 0.999886 -0.993287 0.987333 0.999886 -0.9949941 0.987333 0.999886 -0.9971537 0.987333 0.999886 -0.999886 0.987333 0.999886 -0.9999099 0.9898842 0.9977452 -0.9999288 0.9919392 0.9968597 -0.9999437 0.9935878 0.9966665 -0.9868505 0.9874633 0.999886 -0.9868505 0.9874633 0.999886 -0.9868505 0.9874633 0.999886 -0.9868505 0.9874632 0.999886 -0.9868504 0.9874632 0.999886 -0.9868504 0.9874631 0.999886 -0.9868504 0.9874631 0.999886 -0.9868503 0.987463 0.999886 -0.9868503 0.9874628 0.999886 -0.9868502 0.9874627 0.999886 -0.9868502 0.9874625 0.999886 -0.9868501 0.9874624 0.999886 -0.9868501 0.9874621 0.999886 -0.98685 0.9874619 0.999886 -0.9868501 0.9874617 0.999886 -0.9868503 0.9874615 0.999886 -0.9868507 0.9874615 0.999886 -0.9868512 0.9874615 0.999886 -0.986852 0.9874615 0.999886 -0.9868529 0.9874615 0.999886 -0.9868541 0.9874615 0.999886 -0.9868555 0.9874615 0.999886 -0.9868574 0.9874615 0.999886 -0.9868597 0.9874615 0.999886 -0.9868627 0.9874615 0.999886 -0.9868665 0.9874615 0.999886 -0.9868713 0.9874615 0.999886 -0.9868773 0.9874615 0.999886 -0.986885 0.9874615 0.999886 -0.9868946 0.9874615 0.999886 -0.9869069 0.9874615 0.999886 -0.9869223 0.9874615 0.999886 -0.9869419 0.9874615 0.999886 -0.9869667 0.9874615 0.999886 -0.986998 0.9874615 0.999886 -0.9870376 0.9874615 0.999886 -0.9870878 0.9874615 0.999886 -0.9871512 0.9874615 0.999886 -0.9872315 0.9874615 0.999886 -0.987333 0.9874615 0.999886 -0.9874615 0.9874615 0.999886 -0.987624 0.9874615 0.999886 -0.9878296 0.9874615 0.999886 -0.9880897 0.9874615 0.999886 -0.9884188 0.9874615 0.999886 -0.9888351 0.9874615 0.999886 -0.9893618 0.9874615 0.999886 -0.9900282 0.9874615 0.999886 -0.9908712 0.9874615 0.999886 -0.9919377 0.9874615 0.999886 -0.993287 0.9874615 0.999886 -0.9949941 0.9874615 0.999886 -0.9971537 0.9874615 0.999886 -0.999886 0.9874615 0.999886 -0.9999099 0.9899646 0.9977452 -0.9999288 0.9919896 0.9968597 -0.9999437 0.9936193 0.9966665 -0.9868505 0.9876258 0.999886 -0.9868505 0.9876258 0.999886 -0.9868505 0.9876258 0.999886 -0.9868505 0.9876257 0.999886 -0.9868504 0.9876257 0.999886 -0.9868504 0.9876256 0.999886 -0.9868504 0.9876255 0.999886 -0.9868503 0.9876255 0.999886 -0.9868503 0.9876253 0.999886 -0.9868502 0.9876252 0.999886 -0.9868502 0.987625 0.999886 -0.9868501 0.9876249 0.999886 -0.9868501 0.9876247 0.999886 -0.98685 0.9876244 0.999886 -0.9868501 0.9876242 0.999886 -0.9868503 0.987624 0.999886 -0.9868507 0.987624 0.999886 -0.9868512 0.987624 0.999886 -0.986852 0.987624 0.999886 -0.9868529 0.987624 0.999886 -0.9868541 0.987624 0.999886 -0.9868555 0.987624 0.999886 -0.9868574 0.987624 0.999886 -0.9868597 0.987624 0.999886 -0.9868627 0.987624 0.999886 -0.9868665 0.987624 0.999886 -0.9868713 0.987624 0.999886 -0.9868773 0.987624 0.999886 -0.986885 0.987624 0.999886 -0.9868946 0.987624 0.999886 -0.9869069 0.987624 0.999886 -0.9869223 0.987624 0.999886 -0.9869419 0.987624 0.999886 -0.9869667 0.987624 0.999886 -0.986998 0.987624 0.999886 -0.9870376 0.987624 0.999886 -0.9870878 0.987624 0.999886 -0.9871512 0.987624 0.999886 -0.9872315 0.987624 0.999886 -0.987333 0.987624 0.999886 -0.9874615 0.987624 0.999886 -0.987624 0.987624 0.999886 -0.9878296 0.987624 0.999886 -0.9880897 0.987624 0.999886 -0.9884188 0.987624 0.999886 -0.9888351 0.987624 0.999886 -0.9893618 0.987624 0.999886 -0.9900282 0.987624 0.999886 -0.9908712 0.987624 0.999886 -0.9919377 0.987624 0.999886 -0.993287 0.987624 0.999886 -0.9949941 0.987624 0.999886 -0.9971537 0.987624 0.999886 -0.999886 0.987624 0.999886 -0.9999099 0.9900664 0.9977452 -0.9999288 0.9920533 0.9968597 -0.9999437 0.9936592 0.9966665 -0.9868505 0.9878314 0.999886 -0.9868505 0.9878314 0.999886 -0.9868505 0.9878313 0.999886 -0.9868505 0.9878313 0.999886 -0.9868504 0.9878313 0.999886 -0.9868504 0.9878312 0.999886 -0.9868504 0.9878311 0.999886 -0.9868503 0.987831 0.999886 -0.9868503 0.9878309 0.999886 -0.9868502 0.9878308 0.999886 -0.9868502 0.9878306 0.999886 -0.9868501 0.9878304 0.999886 -0.9868501 0.9878302 0.999886 -0.98685 0.98783 0.999886 -0.9868501 0.9878298 0.999886 -0.9868503 0.9878296 0.999886 -0.9868507 0.9878296 0.999886 -0.9868512 0.9878296 0.999886 -0.986852 0.9878296 0.999886 -0.9868529 0.9878296 0.999886 -0.9868541 0.9878296 0.999886 -0.9868555 0.9878296 0.999886 -0.9868574 0.9878296 0.999886 -0.9868597 0.9878296 0.999886 -0.9868627 0.9878296 0.999886 -0.9868665 0.9878296 0.999886 -0.9868713 0.9878296 0.999886 -0.9868773 0.9878296 0.999886 -0.986885 0.9878296 0.999886 -0.9868946 0.9878296 0.999886 -0.9869069 0.9878296 0.999886 -0.9869223 0.9878296 0.999886 -0.9869419 0.9878296 0.999886 -0.9869667 0.9878296 0.999886 -0.986998 0.9878296 0.999886 -0.9870376 0.9878296 0.999886 -0.9870878 0.9878296 0.999886 -0.9871512 0.9878296 0.999886 -0.9872315 0.9878296 0.999886 -0.987333 0.9878296 0.999886 -0.9874615 0.9878296 0.999886 -0.987624 0.9878296 0.999886 -0.9878296 0.9878296 0.999886 -0.9880897 0.9878296 0.999886 -0.9884188 0.9878296 0.999886 -0.9888351 0.9878296 0.999886 -0.9893618 0.9878296 0.999886 -0.9900282 0.9878296 0.999886 -0.9908712 0.9878296 0.999886 -0.9919377 0.9878296 0.999886 -0.993287 0.9878296 0.999886 -0.9949941 0.9878296 0.999886 -0.9971537 0.9878296 0.999886 -0.999886 0.9878296 0.999886 -0.9999099 0.9901951 0.9977452 -0.9999288 0.9921339 0.9968597 -0.9999437 0.9937096 0.9966665 -0.9868505 0.9880915 0.999886 -0.9868505 0.9880914 0.999886 -0.9868505 0.9880914 0.999886 -0.9868505 0.9880914 0.999886 -0.9868504 0.9880913 0.999886 -0.9868504 0.9880913 0.999886 -0.9868504 0.9880912 0.999886 -0.9868503 0.9880911 0.999886 -0.9868503 0.988091 0.999886 -0.9868502 0.9880909 0.999886 -0.9868502 0.9880907 0.999886 -0.9868501 0.9880905 0.999886 -0.9868501 0.9880903 0.999886 -0.98685 0.9880901 0.999886 -0.9868501 0.9880899 0.999886 -0.9868503 0.9880897 0.999886 -0.9868507 0.9880897 0.999886 -0.9868512 0.9880897 0.999886 -0.986852 0.9880897 0.999886 -0.9868529 0.9880897 0.999886 -0.9868541 0.9880897 0.999886 -0.9868555 0.9880897 0.999886 -0.9868574 0.9880897 0.999886 -0.9868597 0.9880897 0.999886 -0.9868627 0.9880897 0.999886 -0.9868665 0.9880897 0.999886 -0.9868713 0.9880897 0.999886 -0.9868773 0.9880897 0.999886 -0.986885 0.9880897 0.999886 -0.9868946 0.9880897 0.999886 -0.9869069 0.9880897 0.999886 -0.9869223 0.9880897 0.999886 -0.9869419 0.9880897 0.999886 -0.9869667 0.9880897 0.999886 -0.986998 0.9880897 0.999886 -0.9870376 0.9880897 0.999886 -0.9870878 0.9880897 0.999886 -0.9871512 0.9880897 0.999886 -0.9872315 0.9880897 0.999886 -0.987333 0.9880897 0.999886 -0.9874615 0.9880897 0.999886 -0.987624 0.9880897 0.999886 -0.9878296 0.9880897 0.999886 -0.9880897 0.9880897 0.999886 -0.9884188 0.9880897 0.999886 -0.9888351 0.9880897 0.999886 -0.9893618 0.9880897 0.999886 -0.9900282 0.9880897 0.999886 -0.9908712 0.9880897 0.999886 -0.9919377 0.9880897 0.999886 -0.993287 0.9880897 0.999886 -0.9949941 0.9880897 0.999886 -0.9971537 0.9880897 0.999886 -0.999886 0.9880897 0.999886 -0.9999099 0.990358 0.9977452 -0.9999288 0.9922358 0.9968597 -0.9999437 0.9937734 0.9966665 -0.9868505 0.9884205 0.999886 -0.9868505 0.9884205 0.999886 -0.9868505 0.9884204 0.999886 -0.9868505 0.9884204 0.999886 -0.9868504 0.9884204 0.999886 -0.9868504 0.9884203 0.999886 -0.9868504 0.9884202 0.999886 -0.9868503 0.9884202 0.999886 -0.9868503 0.9884201 0.999886 -0.9868502 0.9884199 0.999886 -0.9868502 0.9884198 0.999886 -0.9868501 0.9884196 0.999886 -0.9868501 0.9884194 0.999886 -0.98685 0.9884192 0.999886 -0.9868501 0.988419 0.999886 -0.9868503 0.9884188 0.999886 -0.9868507 0.9884188 0.999886 -0.9868512 0.9884188 0.999886 -0.986852 0.9884188 0.999886 -0.9868529 0.9884188 0.999886 -0.9868541 0.9884188 0.999886 -0.9868555 0.9884188 0.999886 -0.9868574 0.9884188 0.999886 -0.9868597 0.9884188 0.999886 -0.9868627 0.9884188 0.999886 -0.9868665 0.9884188 0.999886 -0.9868713 0.9884188 0.999886 -0.9868773 0.9884188 0.999886 -0.986885 0.9884188 0.999886 -0.9868946 0.9884188 0.999886 -0.9869069 0.9884188 0.999886 -0.9869223 0.9884188 0.999886 -0.9869419 0.9884188 0.999886 -0.9869667 0.9884188 0.999886 -0.986998 0.9884188 0.999886 -0.9870376 0.9884188 0.999886 -0.9870878 0.9884188 0.999886 -0.9871512 0.9884188 0.999886 -0.9872315 0.9884188 0.999886 -0.987333 0.9884188 0.999886 -0.9874615 0.9884188 0.999886 -0.987624 0.9884188 0.999886 -0.9878296 0.9884188 0.999886 -0.9880897 0.9884188 0.999886 -0.9884188 0.9884188 0.999886 -0.9888351 0.9884188 0.999886 -0.9893618 0.9884188 0.999886 -0.9900282 0.9884188 0.999886 -0.9908712 0.9884188 0.999886 -0.9919377 0.9884188 0.999886 -0.993287 0.9884188 0.999886 -0.9949941 0.9884188 0.999886 -0.9971537 0.9884188 0.999886 -0.999886 0.9884188 0.999886 -0.9999099 0.9905641 0.9977452 -0.9999288 0.9923648 0.9968597 -0.9999437 0.9938541 0.9966665 -0.9868505 0.9888368 0.999886 -0.9868505 0.9888367 0.999886 -0.9868505 0.9888367 0.999886 -0.9868505 0.9888367 0.999886 -0.9868504 0.9888366 0.999886 -0.9868504 0.9888366 0.999886 -0.9868504 0.9888365 0.999886 -0.9868503 0.9888364 0.999886 -0.9868503 0.9888363 0.999886 -0.9868502 0.9888362 0.999886 -0.9868502 0.9888361 0.999886 -0.9868501 0.9888359 0.999886 -0.9868501 0.9888357 0.999886 -0.98685 0.9888355 0.999886 -0.9868501 0.9888353 0.999886 -0.9868503 0.9888352 0.999886 -0.9868507 0.9888351 0.999886 -0.9868512 0.9888351 0.999886 -0.986852 0.9888351 0.999886 -0.9868529 0.9888351 0.999886 -0.9868541 0.9888351 0.999886 -0.9868555 0.9888351 0.999886 -0.9868574 0.9888351 0.999886 -0.9868597 0.9888351 0.999886 -0.9868627 0.9888351 0.999886 -0.9868665 0.9888351 0.999886 -0.9868713 0.9888351 0.999886 -0.9868773 0.9888351 0.999886 -0.986885 0.9888351 0.999886 -0.9868946 0.9888351 0.999886 -0.9869069 0.9888351 0.999886 -0.9869223 0.9888351 0.999886 -0.9869419 0.9888351 0.999886 -0.9869667 0.9888351 0.999886 -0.986998 0.9888351 0.999886 -0.9870376 0.9888351 0.999886 -0.9870878 0.9888351 0.999886 -0.9871512 0.9888351 0.999886 -0.9872315 0.9888351 0.999886 -0.987333 0.9888351 0.999886 -0.9874615 0.9888351 0.999886 -0.987624 0.9888351 0.999886 -0.9878296 0.9888351 0.999886 -0.9880897 0.9888351 0.999886 -0.9884188 0.9888351 0.999886 -0.9888351 0.9888351 0.999886 -0.9893618 0.9888351 0.999886 -0.9900282 0.9888351 0.999886 -0.9908712 0.9888351 0.999886 -0.9919377 0.9888351 0.999886 -0.993287 0.9888351 0.999886 -0.9949941 0.9888351 0.999886 -0.9971537 0.9888351 0.999886 -0.999886 0.9888351 0.999886 -0.9999099 0.9908248 0.9977452 -0.9999288 0.992528 0.9968597 -0.9999437 0.9939562 0.9966665 -0.9868505 0.9893634 0.999886 -0.9868505 0.9893634 0.999886 -0.9868505 0.9893633 0.999886 -0.9868505 0.9893633 0.999886 -0.9868504 0.9893633 0.999886 -0.9868504 0.9893632 0.999886 -0.9868504 0.9893632 0.999886 -0.9868503 0.9893631 0.999886 -0.9868503 0.989363 0.999886 -0.9868502 0.9893629 0.999886 -0.9868502 0.9893627 0.999886 -0.9868501 0.9893626 0.999886 -0.9868501 0.9893624 0.999886 -0.98685 0.9893622 0.999886 -0.9868501 0.989362 0.999886 -0.9868503 0.9893619 0.999886 -0.9868507 0.9893618 0.999886 -0.9868512 0.9893618 0.999886 -0.986852 0.9893618 0.999886 -0.9868529 0.9893618 0.999886 -0.9868541 0.9893618 0.999886 -0.9868555 0.9893618 0.999886 -0.9868574 0.9893618 0.999886 -0.9868597 0.9893618 0.999886 -0.9868627 0.9893618 0.999886 -0.9868665 0.9893618 0.999886 -0.9868713 0.9893618 0.999886 -0.9868773 0.9893618 0.999886 -0.986885 0.9893618 0.999886 -0.9868946 0.9893618 0.999886 -0.9869069 0.9893618 0.999886 -0.9869223 0.9893618 0.999886 -0.9869419 0.9893618 0.999886 -0.9869667 0.9893618 0.999886 -0.986998 0.9893618 0.999886 -0.9870376 0.9893618 0.999886 -0.9870878 0.9893618 0.999886 -0.9871512 0.9893618 0.999886 -0.9872315 0.9893618 0.999886 -0.987333 0.9893618 0.999886 -0.9874615 0.9893618 0.999886 -0.987624 0.9893618 0.999886 -0.9878296 0.9893618 0.999886 -0.9880897 0.9893618 0.999886 -0.9884188 0.9893618 0.999886 -0.9888351 0.9893618 0.999886 -0.9893618 0.9893618 0.999886 -0.9900282 0.9893618 0.999886 -0.9908712 0.9893618 0.999886 -0.9919377 0.9893618 0.999886 -0.993287 0.9893618 0.999886 -0.9949941 0.9893618 0.999886 -0.9971537 0.9893618 0.999886 -0.999886 0.9893618 0.999886 -0.9999099 0.9911547 0.9977452 -0.9999288 0.9927345 0.9968597 -0.9999437 0.9940854 0.9966665 -0.9868505 0.9900297 0.999886 -0.9868505 0.9900296 0.999886 -0.9868505 0.9900296 0.999886 -0.9868505 0.9900296 0.999886 -0.9868504 0.9900295 0.999886 -0.9868504 0.9900295 0.999886 -0.9868504 0.9900294 0.999886 -0.9868503 0.9900294 0.999886 -0.9868503 0.9900293 0.999886 -0.9868502 0.9900292 0.999886 -0.9868502 0.990029 0.999886 -0.9868501 0.9900289 0.999886 -0.9868501 0.9900287 0.999886 -0.98685 0.9900285 0.999886 -0.9868501 0.9900284 0.999886 -0.9868503 0.9900282 0.999886 -0.9868507 0.9900282 0.999886 -0.9868512 0.9900282 0.999886 -0.986852 0.9900282 0.999886 -0.9868529 0.9900282 0.999886 -0.9868541 0.9900282 0.999886 -0.9868555 0.9900282 0.999886 -0.9868574 0.9900282 0.999886 -0.9868597 0.9900282 0.999886 -0.9868627 0.9900282 0.999886 -0.9868665 0.9900282 0.999886 -0.9868713 0.9900282 0.999886 -0.9868773 0.9900282 0.999886 -0.986885 0.9900282 0.999886 -0.9868946 0.9900282 0.999886 -0.9869069 0.9900282 0.999886 -0.9869223 0.9900282 0.999886 -0.9869419 0.9900282 0.999886 -0.9869667 0.9900282 0.999886 -0.986998 0.9900282 0.999886 -0.9870376 0.9900282 0.999886 -0.9870878 0.9900282 0.999886 -0.9871512 0.9900282 0.999886 -0.9872315 0.9900282 0.999886 -0.987333 0.9900282 0.999886 -0.9874615 0.9900282 0.999886 -0.987624 0.9900282 0.999886 -0.9878296 0.9900282 0.999886 -0.9880897 0.9900282 0.999886 -0.9884188 0.9900282 0.999886 -0.9888351 0.9900282 0.999886 -0.9893618 0.9900282 0.999886 -0.9900282 0.9900282 0.999886 -0.9908712 0.9900282 0.999886 -0.9919377 0.9900282 0.999886 -0.993287 0.9900282 0.999886 -0.9949941 0.9900282 0.999886 -0.9971537 0.9900282 0.999886 -0.999886 0.9900282 0.999886 -0.9999099 0.991572 0.9977452 -0.9999288 0.9929957 0.9968597 -0.9999437 0.9942488 0.9966665 -0.9868505 0.9908726 0.999886 -0.9868505 0.9908725 0.999886 -0.9868505 0.9908725 0.999886 -0.9868505 0.9908725 0.999886 -0.9868504 0.9908724 0.999886 -0.9868504 0.9908724 0.999886 -0.9868504 0.9908724 0.999886 -0.9868503 0.9908723 0.999886 -0.9868503 0.9908722 0.999886 -0.9868502 0.9908721 0.999886 -0.9868502 0.990872 0.999886 -0.9868501 0.9908718 0.999886 -0.9868501 0.9908717 0.999886 -0.98685 0.9908715 0.999886 -0.9868501 0.9908714 0.999886 -0.9868503 0.9908712 0.999886 -0.9868507 0.9908712 0.999886 -0.9868512 0.9908712 0.999886 -0.986852 0.9908712 0.999886 -0.9868529 0.9908712 0.999886 -0.9868541 0.9908712 0.999886 -0.9868555 0.9908712 0.999886 -0.9868574 0.9908712 0.999886 -0.9868597 0.9908712 0.999886 -0.9868627 0.9908712 0.999886 -0.9868665 0.9908712 0.999886 -0.9868713 0.9908712 0.999886 -0.9868773 0.9908712 0.999886 -0.986885 0.9908712 0.999886 -0.9868946 0.9908712 0.999886 -0.9869069 0.9908712 0.999886 -0.9869223 0.9908712 0.999886 -0.9869419 0.9908712 0.999886 -0.9869667 0.9908712 0.999886 -0.986998 0.9908712 0.999886 -0.9870376 0.9908712 0.999886 -0.9870878 0.9908712 0.999886 -0.9871512 0.9908712 0.999886 -0.9872315 0.9908712 0.999886 -0.987333 0.9908712 0.999886 -0.9874615 0.9908712 0.999886 -0.987624 0.9908712 0.999886 -0.9878296 0.9908712 0.999886 -0.9880897 0.9908712 0.999886 -0.9884188 0.9908712 0.999886 -0.9888351 0.9908712 0.999886 -0.9893618 0.9908712 0.999886 -0.9900282 0.9908712 0.999886 -0.9908712 0.9908712 0.999886 -0.9919377 0.9908712 0.999886 -0.993287 0.9908712 0.999886 -0.9949941 0.9908712 0.999886 -0.9971537 0.9908712 0.999886 -0.999886 0.9908712 0.999886 -0.9999099 0.9920999 0.9977452 -0.9999288 0.9933261 0.9968597 -0.9999437 0.9944556 0.9966665 -0.9868505 0.9919389 0.999886 -0.9868505 0.9919389 0.999886 -0.9868505 0.9919389 0.999886 -0.9868505 0.9919389 0.999886 -0.9868504 0.9919388 0.999886 -0.9868504 0.9919388 0.999886 -0.9868504 0.9919388 0.999886 -0.9868503 0.9919387 0.999886 -0.9868503 0.9919386 0.999886 -0.9868502 0.9919385 0.999886 -0.9868502 0.9919384 0.999886 -0.9868501 0.9919383 0.999886 -0.9868501 0.9919382 0.999886 -0.98685 0.991938 0.999886 -0.9868501 0.9919379 0.999886 -0.9868503 0.9919378 0.999886 -0.9868507 0.9919377 0.999886 -0.9868512 0.9919377 0.999886 -0.986852 0.9919377 0.999886 -0.9868529 0.9919377 0.999886 -0.9868541 0.9919377 0.999886 -0.9868555 0.9919377 0.999886 -0.9868574 0.9919377 0.999886 -0.9868597 0.9919377 0.999886 -0.9868627 0.9919377 0.999886 -0.9868665 0.9919377 0.999886 -0.9868713 0.9919377 0.999886 -0.9868773 0.9919377 0.999886 -0.986885 0.9919377 0.999886 -0.9868946 0.9919377 0.999886 -0.9869069 0.9919377 0.999886 -0.9869223 0.9919377 0.999886 -0.9869419 0.9919377 0.999886 -0.9869667 0.9919377 0.999886 -0.986998 0.9919377 0.999886 -0.9870376 0.9919377 0.999886 -0.9870878 0.9919377 0.999886 -0.9871512 0.9919377 0.999886 -0.9872315 0.9919377 0.999886 -0.987333 0.9919377 0.999886 -0.9874615 0.9919377 0.999886 -0.987624 0.9919377 0.999886 -0.9878296 0.9919377 0.999886 -0.9880897 0.9919377 0.999886 -0.9884188 0.9919377 0.999886 -0.9888351 0.9919377 0.999886 -0.9893618 0.9919377 0.999886 -0.9900282 0.9919377 0.999886 -0.9908712 0.9919377 0.999886 -0.9919377 0.9919377 0.999886 -0.993287 0.9919377 0.999886 -0.9949941 0.9919377 0.999886 -0.9971537 0.9919377 0.999886 -0.999886 0.9919377 0.999886 -0.9999099 0.9927678 0.9977452 -0.9999288 0.9937442 0.9968597 -0.9999437 0.9947172 0.9966665 -0.9868505 0.993288 0.999886 -0.9868505 0.993288 0.999886 -0.9868505 0.993288 0.999886 -0.9868505 0.993288 0.999886 -0.9868504 0.993288 0.999886 -0.9868504 0.9932879 0.999886 -0.9868504 0.9932879 0.999886 -0.9868503 0.9932878 0.999886 -0.9868503 0.9932878 0.999886 -0.9868502 0.9932877 0.999886 -0.9868502 0.9932876 0.999886 -0.9868501 0.9932875 0.999886 -0.9868501 0.9932874 0.999886 -0.98685 0.9932873 0.999886 -0.9868501 0.9932872 0.999886 -0.9868503 0.9932871 0.999886 -0.9868507 0.993287 0.999886 -0.9868512 0.993287 0.999886 -0.986852 0.993287 0.999886 -0.9868529 0.993287 0.999886 -0.9868541 0.993287 0.999886 -0.9868555 0.993287 0.999886 -0.9868574 0.993287 0.999886 -0.9868597 0.993287 0.999886 -0.9868627 0.993287 0.999886 -0.9868665 0.993287 0.999886 -0.9868713 0.993287 0.999886 -0.9868773 0.993287 0.999886 -0.986885 0.993287 0.999886 -0.9868946 0.993287 0.999886 -0.9869069 0.993287 0.999886 -0.9869223 0.993287 0.999886 -0.9869419 0.993287 0.999886 -0.9869667 0.993287 0.999886 -0.986998 0.993287 0.999886 -0.9870376 0.993287 0.999886 -0.9870878 0.993287 0.999886 -0.9871512 0.993287 0.999886 -0.9872315 0.993287 0.999886 -0.987333 0.993287 0.999886 -0.9874615 0.993287 0.999886 -0.987624 0.993287 0.999886 -0.9878296 0.993287 0.999886 -0.9880897 0.993287 0.999886 -0.9884188 0.993287 0.999886 -0.9888351 0.993287 0.999886 -0.9893618 0.993287 0.999886 -0.9900282 0.993287 0.999886 -0.9908712 0.993287 0.999886 -0.9919377 0.993287 0.999886 -0.993287 0.993287 0.999886 -0.9949941 0.993287 0.999886 -0.9971537 0.993287 0.999886 -0.999886 0.993287 0.999886 -0.9999099 0.9936128 0.9977452 -0.9999288 0.9942731 0.9968597 -0.9999437 0.9950481 0.9966665 -0.9868505 0.9949948 0.999886 -0.9868505 0.9949948 0.999886 -0.9868505 0.9949948 0.999886 -0.9868505 0.9949948 0.999886 -0.9868504 0.9949948 0.999886 -0.9868504 0.9949948 0.999886 -0.9868504 0.9949947 0.999886 -0.9868503 0.9949947 0.999886 -0.9868503 0.9949946 0.999886 -0.9868502 0.9949946 0.999886 -0.9868502 0.9949945 0.999886 -0.9868501 0.9949945 0.999886 -0.9868501 0.9949944 0.999886 -0.98685 0.9949943 0.999886 -0.9868501 0.9949942 0.999886 -0.9868503 0.9949941 0.999886 -0.9868507 0.9949941 0.999886 -0.9868512 0.9949941 0.999886 -0.986852 0.9949941 0.999886 -0.9868529 0.9949941 0.999886 -0.9868541 0.9949941 0.999886 -0.9868555 0.9949941 0.999886 -0.9868574 0.9949941 0.999886 -0.9868597 0.9949941 0.999886 -0.9868627 0.9949941 0.999886 -0.9868665 0.9949941 0.999886 -0.9868713 0.9949941 0.999886 -0.9868773 0.9949941 0.999886 -0.986885 0.9949941 0.999886 -0.9868946 0.9949941 0.999886 -0.9869069 0.9949941 0.999886 -0.9869223 0.9949941 0.999886 -0.9869419 0.9949941 0.999886 -0.9869667 0.9949941 0.999886 -0.986998 0.9949941 0.999886 -0.9870376 0.9949941 0.999886 -0.9870878 0.9949941 0.999886 -0.9871512 0.9949941 0.999886 -0.9872315 0.9949941 0.999886 -0.987333 0.9949941 0.999886 -0.9874615 0.9949941 0.999886 -0.987624 0.9949941 0.999886 -0.9878296 0.9949941 0.999886 -0.9880897 0.9949941 0.999886 -0.9884188 0.9949941 0.999886 -0.9888351 0.9949941 0.999886 -0.9893618 0.9949941 0.999886 -0.9900282 0.9949941 0.999886 -0.9908712 0.9949941 0.999886 -0.9919377 0.9949941 0.999886 -0.993287 0.9949941 0.999886 -0.9949941 0.9949941 0.999886 -0.9971537 0.9949941 0.999886 -0.999886 0.9949941 0.999886 -0.9999099 0.9946818 0.9977452 -0.9999288 0.9949422 0.9968597 -0.9999437 0.9954668 0.9966665 -0.9868505 0.9971542 0.999886 -0.9868505 0.9971542 0.999886 -0.9868505 0.9971541 0.999886 -0.9868505 0.9971541 0.999886 -0.9868504 0.9971541 0.999886 -0.9868504 0.9971541 0.999886 -0.9868504 0.9971541 0.999886 -0.9868503 0.9971541 0.999886 -0.9868503 0.9971541 0.999886 -0.9868502 0.997154 0.999886 -0.9868502 0.997154 0.999886 -0.9868501 0.9971539 0.999886 -0.9868501 0.9971539 0.999886 -0.98685 0.9971538 0.999886 -0.9868501 0.9971538 0.999886 -0.9868503 0.9971538 0.999886 -0.9868507 0.9971537 0.999886 -0.9868512 0.9971537 0.999886 -0.986852 0.9971537 0.999886 -0.9868529 0.9971537 0.999886 -0.9868541 0.9971537 0.999886 -0.9868555 0.9971537 0.999886 -0.9868574 0.9971537 0.999886 -0.9868597 0.9971537 0.999886 -0.9868627 0.9971537 0.999886 -0.9868665 0.9971537 0.999886 -0.9868713 0.9971537 0.999886 -0.9868773 0.9971537 0.999886 -0.986885 0.9971537 0.999886 -0.9868946 0.9971537 0.999886 -0.9869069 0.9971537 0.999886 -0.9869223 0.9971537 0.999886 -0.9869419 0.9971537 0.999886 -0.9869667 0.9971537 0.999886 -0.986998 0.9971537 0.999886 -0.9870376 0.9971537 0.999886 -0.9870878 0.9971537 0.999886 -0.9871512 0.9971537 0.999886 -0.9872315 0.9971537 0.999886 -0.987333 0.9971537 0.999886 -0.9874615 0.9971537 0.999886 -0.987624 0.9971537 0.999886 -0.9878296 0.9971537 0.999886 -0.9880897 0.9971537 0.999886 -0.9884188 0.9971537 0.999886 -0.9888351 0.9971537 0.999886 -0.9893618 0.9971537 0.999886 -0.9900282 0.9971537 0.999886 -0.9908712 0.9971537 0.999886 -0.9919377 0.9971537 0.999886 -0.993287 0.9971537 0.999886 -0.9949941 0.9971537 0.999886 -0.9971537 0.9971537 0.999886 -0.999886 0.9971537 0.999886 -0.9999099 0.9960342 0.9977452 -0.9999288 0.9957887 0.9968597 -0.9999437 0.9959964 0.9966665 -0.9868505 0.999886 0.999886 -0.9868505 0.999886 0.999886 -0.9868505 0.999886 0.999886 -0.9868505 0.999886 0.999886 -0.9868504 0.999886 0.999886 -0.9868504 0.999886 0.999886 -0.9868504 0.999886 0.999886 -0.9868503 0.999886 0.999886 -0.9868503 0.999886 0.999886 -0.9868502 0.999886 0.999886 -0.9868502 0.999886 0.999886 -0.9868501 0.999886 0.999886 -0.9868501 0.999886 0.999886 -0.98685 0.999886 0.999886 -0.9868501 0.999886 0.999886 -0.9868503 0.999886 0.999886 -0.9868507 0.999886 0.999886 -0.9868512 0.999886 0.999886 -0.986852 0.999886 0.999886 -0.9868529 0.999886 0.999886 -0.9868541 0.999886 0.999886 -0.9868555 0.999886 0.999886 -0.9868574 0.999886 0.999886 -0.9868597 0.999886 0.999886 -0.9868627 0.999886 0.999886 -0.9868665 0.999886 0.999886 -0.9868713 0.999886 0.999886 -0.9868773 0.999886 0.999886 -0.986885 0.999886 0.999886 -0.9868946 0.999886 0.999886 -0.9869069 0.999886 0.999886 -0.9869223 0.999886 0.999886 -0.9869419 0.999886 0.999886 -0.9869667 0.999886 0.999886 -0.986998 0.999886 0.999886 -0.9870376 0.999886 0.999886 -0.9870878 0.999886 0.999886 -0.9871512 0.999886 0.999886 -0.9872315 0.999886 0.999886 -0.987333 0.999886 0.999886 -0.9874615 0.999886 0.999886 -0.987624 0.999886 0.999886 -0.9878296 0.999886 0.999886 -0.9880897 0.999886 0.999886 -0.9884188 0.999886 0.999886 -0.9888351 0.999886 0.999886 -0.9893618 0.999886 0.999886 -0.9900282 0.999886 0.999886 -0.9908712 0.999886 0.999886 -0.9919377 0.999886 0.999886 -0.993287 0.999886 0.999886 -0.9949941 0.999886 0.999886 -0.9971537 0.999886 0.999886 -0.999886 0.999886 0.999886 -0.9999099 0.9977452 0.9977452 -0.9999288 0.9968597 0.9968597 -0.9999437 0.9966665 0.9966665 -0.989582 0.9999099 0.9977455 -0.989582 0.9999099 0.9977455 -0.989582 0.9999099 0.9977455 -0.989582 0.9999099 0.9977455 -0.989582 0.9999099 0.9977455 -0.9895819 0.9999099 0.9977455 -0.9895819 0.9999099 0.9977455 -0.9895819 0.9999099 0.9977454 -0.9895819 0.9999099 0.9977454 -0.9895818 0.9999099 0.9977454 -0.9895818 0.9999099 0.9977454 -0.9895818 0.9999099 0.9977454 -0.9895817 0.9999099 0.9977453 -0.9895817 0.9999099 0.9977453 -0.9895817 0.9999099 0.9977453 -0.9895819 0.9999099 0.9977452 -0.9895821 0.9999099 0.9977452 -0.9895825 0.9999099 0.9977452 -0.9895829 0.9999099 0.9977452 -0.9895835 0.9999099 0.9977452 -0.9895842 0.9999099 0.9977452 -0.9895851 0.9999099 0.9977452 -0.9895863 0.9999099 0.9977452 -0.9895878 0.9999099 0.9977452 -0.9895897 0.9999099 0.9977452 -0.989592 0.9999099 0.9977452 -0.989595 0.9999099 0.9977452 -0.9895988 0.9999099 0.9977452 -0.9896036 0.9999099 0.9977452 -0.9896096 0.9999099 0.9977452 -0.9896173 0.9999099 0.9977452 -0.989627 0.9999099 0.9977452 -0.9896392 0.9999099 0.9977452 -0.9896547 0.9999099 0.9977452 -0.9896744 0.9999099 0.9977452 -0.9896992 0.9999099 0.9977452 -0.9897306 0.9999099 0.9977452 -0.9897703 0.9999099 0.9977452 -0.9898206 0.9999099 0.9977452 -0.9898842 0.9999099 0.9977452 -0.9899646 0.9999099 0.9977452 -0.9900664 0.9999099 0.9977452 -0.9901951 0.9999099 0.9977452 -0.990358 0.9999099 0.9977452 -0.9905641 0.9999099 0.9977452 -0.9908248 0.9999099 0.9977452 -0.9911547 0.9999099 0.9977452 -0.991572 0.9999099 0.9977452 -0.9920999 0.9999099 0.9977452 -0.9927678 0.9999099 0.9977452 -0.9936128 0.9999099 0.9977452 -0.9946818 0.9999099 0.9977452 -0.9960342 0.9999099 0.9977452 -0.9977452 0.9999099 0.9977452 -0.9999099 0.9999099 0.9977452 -0.9999288 0.9982146 0.9968597 -0.9999437 0.9975143 0.9966665 -0.9917501 0.9999288 0.99686 -0.9917501 0.9999288 0.99686 -0.9917501 0.9999288 0.99686 -0.9917501 0.9999288 0.99686 -0.9917501 0.9999288 0.99686 -0.9917501 0.9999288 0.99686 -0.99175 0.9999288 0.99686 -0.99175 0.9999288 0.9968599 -0.99175 0.9999288 0.9968599 -0.99175 0.9999288 0.9968599 -0.99175 0.9999288 0.9968599 -0.9917499 0.9999288 0.9968599 -0.9917499 0.9999288 0.9968598 -0.9917499 0.9999288 0.9968598 -0.9917499 0.9999288 0.9968597 -0.99175 0.9999288 0.9968597 -0.9917502 0.9999288 0.9968597 -0.9917504 0.9999288 0.9968597 -0.9917507 0.9999288 0.9968597 -0.991751 0.9999288 0.9968597 -0.9917515 0.9999288 0.9968597 -0.9917521 0.9999288 0.9968597 -0.9917528 0.9999288 0.9968597 -0.9917537 0.9999288 0.9968597 -0.9917549 0.9999288 0.9968597 -0.9917564 0.9999288 0.9968597 -0.9917582 0.9999288 0.9968597 -0.9917606 0.9999288 0.9968597 -0.9917636 0.9999288 0.9968597 -0.9917674 0.9999288 0.9968597 -0.9917722 0.9999288 0.9968597 -0.9917782 0.9999288 0.9968597 -0.9917859 0.9999288 0.9968597 -0.9917956 0.9999288 0.9968597 -0.9918079 0.9999288 0.9968597 -0.9918234 0.9999288 0.9968597 -0.9918431 0.9999288 0.9968597 -0.991868 0.9999288 0.9968597 -0.9918994 0.9999288 0.9968597 -0.9919392 0.9999288 0.9968597 -0.9919896 0.9999288 0.9968597 -0.9920533 0.9999288 0.9968597 -0.9921339 0.9999288 0.9968597 -0.9922358 0.9999288 0.9968597 -0.9923648 0.9999288 0.9968597 -0.992528 0.9999288 0.9968597 -0.9927345 0.9999288 0.9968597 -0.9929957 0.9999288 0.9968597 -0.9933261 0.9999288 0.9968597 -0.9937442 0.9999288 0.9968597 -0.9942731 0.9999288 0.9968597 -0.9949422 0.9999288 0.9968597 -0.9957887 0.9999288 0.9968597 -0.9968597 0.9999288 0.9968597 -0.9982146 0.9999288 0.9968597 -0.9999288 0.9999288 0.9968597 -0.9999437 0.9985868 0.9966665 -0.9934695 0.9999437 0.9966668 -0.9934695 0.9999437 0.9966668 -0.9934695 0.9999437 0.9966668 -0.9934695 0.9999437 0.9966668 -0.9934695 0.9999437 0.9966668 -0.9934695 0.9999437 0.9966668 -0.9934695 0.9999437 0.9966667 -0.9934694 0.9999437 0.9966667 -0.9934694 0.9999437 0.9966667 -0.9934694 0.9999437 0.9966667 -0.9934694 0.9999437 0.9966667 -0.9934694 0.9999437 0.9966666 -0.9934694 0.9999437 0.9966666 -0.9934694 0.9999437 0.9966666 -0.9934694 0.9999437 0.9966666 -0.9934694 0.9999437 0.9966665 -0.9934695 0.9999437 0.9966665 -0.9934697 0.9999437 0.9966665 -0.9934698 0.9999437 0.9966665 -0.9934701 0.9999437 0.9966665 -0.9934704 0.9999437 0.9966665 -0.9934707 0.9999437 0.9966665 -0.9934712 0.9999437 0.9966665 -0.9934718 0.9999437 0.9966665 -0.9934725 0.9999437 0.9966665 -0.9934734 0.9999437 0.9966665 -0.9934746 0.9999437 0.9966665 -0.9934761 0.9999437 0.9966665 -0.9934779 0.9999437 0.9966665 -0.9934803 0.9999437 0.9966665 -0.9934833 0.9999437 0.9966665 -0.9934871 0.9999437 0.9966665 -0.9934919 0.9999437 0.9966665 -0.993498 0.9999437 0.9966665 -0.9935057 0.9999437 0.9966665 -0.9935154 0.9999437 0.9966665 -0.9935277 0.9999437 0.9966665 -0.9935432 0.9999437 0.9966665 -0.9935629 0.9999437 0.9966665 -0.9935878 0.9999437 0.9966665 -0.9936193 0.9999437 0.9966665 -0.9936592 0.9999437 0.9966665 -0.9937096 0.9999437 0.9966665 -0.9937734 0.9999437 0.9966665 -0.9938541 0.9999437 0.9966665 -0.9939562 0.9999437 0.9966665 -0.9940854 0.9999437 0.9966665 -0.9942488 0.9999437 0.9966665 -0.9944556 0.9999437 0.9966665 -0.9947172 0.9999437 0.9966665 -0.9950481 0.9999437 0.9966665 -0.9954668 0.9999437 0.9966665 -0.9959964 0.9999437 0.9966665 -0.9966665 0.9999437 0.9966665 -0.9975143 0.9999437 0.9966665 -0.9985868 0.9999437 0.9966665 -0.9999437 0.9999437 0.9966665 -0.989582 0.989582 0.9999099 -0.989582 0.989582 0.9999099 -0.989582 0.989582 0.9999099 -0.989582 0.989582 0.9999099 -0.9895821 0.989582 0.9999099 -0.9895821 0.989582 0.9999099 -0.9895821 0.989582 0.9999099 -0.9895821 0.989582 0.9999099 -0.9895822 0.989582 0.9999099 -0.9895822 0.989582 0.9999099 -0.9895823 0.989582 0.9999099 -0.9895824 0.989582 0.9999099 -0.9895825 0.989582 0.9999099 -0.9895826 0.989582 0.9999099 -0.9895828 0.989582 0.9999099 -0.989583 0.989582 0.9999099 -0.9895833 0.989582 0.9999099 -0.9895837 0.989582 0.9999099 -0.9895841 0.989582 0.9999099 -0.9895847 0.989582 0.9999099 -0.9895855 0.989582 0.9999099 -0.9895864 0.989582 0.9999099 -0.9895875 0.989582 0.9999099 -0.989589 0.989582 0.9999099 -0.9895909 0.989582 0.9999099 -0.9895933 0.989582 0.9999099 -0.9895962 0.989582 0.9999099 -0.9896 0.989582 0.9999099 -0.9896048 0.989582 0.9999099 -0.9896109 0.989582 0.9999099 -0.9896185 0.989582 0.9999099 -0.9896282 0.989582 0.9999099 -0.9896405 0.989582 0.9999099 -0.989656 0.989582 0.9999099 -0.9896756 0.989582 0.9999099 -0.9897004 0.989582 0.9999099 -0.9897318 0.989582 0.9999099 -0.9897715 0.989582 0.9999099 -0.9898218 0.989582 0.9999099 -0.9898854 0.989582 0.9999099 -0.9899658 0.989582 0.9999099 -0.9900676 0.989582 0.9999099 -0.9901963 0.989582 0.9999099 -0.9903592 0.989582 0.9999099 -0.9905652 0.989582 0.9999099 -0.9908259 0.989582 0.9999099 -0.9911557 0.989582 0.9999099 -0.991573 0.989582 0.9999099 -0.9921008 0.989582 0.9999099 -0.9927686 0.989582 0.9999099 -0.9936135 0.989582 0.9999099 -0.9946824 0.989582 0.9999099 -0.9960347 0.989582 0.9999099 -0.9977455 0.989582 0.9999099 -0.9999099 0.989582 0.9999099 -0.9999288 0.9917501 0.9982148 -0.9999437 0.9934695 0.9975145 -0.989582 0.989582 0.9999099 -0.989582 0.989582 0.9999099 -0.989582 0.989582 0.9999099 -0.989582 0.989582 0.9999099 -0.989582 0.989582 0.9999099 -0.9895821 0.989582 0.9999099 -0.9895821 0.989582 0.9999099 -0.9895821 0.989582 0.9999099 -0.9895822 0.989582 0.9999099 -0.9895822 0.989582 0.9999099 -0.9895823 0.989582 0.9999099 -0.9895824 0.989582 0.9999099 -0.9895825 0.989582 0.9999099 -0.9895826 0.989582 0.9999099 -0.9895828 0.989582 0.9999099 -0.989583 0.989582 0.9999099 -0.9895833 0.989582 0.9999099 -0.9895837 0.989582 0.9999099 -0.9895841 0.989582 0.9999099 -0.9895847 0.989582 0.9999099 -0.9895854 0.989582 0.9999099 -0.9895864 0.989582 0.9999099 -0.9895875 0.989582 0.9999099 -0.989589 0.989582 0.9999099 -0.9895909 0.989582 0.9999099 -0.9895932 0.989582 0.9999099 -0.9895962 0.989582 0.9999099 -0.9896 0.989582 0.9999099 -0.9896048 0.989582 0.9999099 -0.9896108 0.989582 0.9999099 -0.9896185 0.989582 0.9999099 -0.9896282 0.989582 0.9999099 -0.9896404 0.989582 0.9999099 -0.9896559 0.989582 0.9999099 -0.9896756 0.989582 0.9999099 -0.9897004 0.989582 0.9999099 -0.9897318 0.989582 0.9999099 -0.9897715 0.989582 0.9999099 -0.9898218 0.989582 0.9999099 -0.9898853 0.989582 0.9999099 -0.9899658 0.989582 0.9999099 -0.9900675 0.989582 0.9999099 -0.9901963 0.989582 0.9999099 -0.9903591 0.989582 0.9999099 -0.9905652 0.989582 0.9999099 -0.9908259 0.989582 0.9999099 -0.9911557 0.989582 0.9999099 -0.9915729 0.989582 0.9999099 -0.9921008 0.989582 0.9999099 -0.9927686 0.989582 0.9999099 -0.9936135 0.989582 0.9999099 -0.9946824 0.989582 0.9999099 -0.9960347 0.989582 0.9999099 -0.9977455 0.989582 0.9999099 -0.9999099 0.989582 0.9999099 -0.9999288 0.9917501 0.9982148 -0.9999437 0.9934695 0.9975145 -0.989582 0.989582 0.9999099 -0.989582 0.989582 0.9999099 -0.989582 0.989582 0.9999099 -0.989582 0.989582 0.9999099 -0.989582 0.989582 0.9999099 -0.989582 0.989582 0.9999099 -0.9895821 0.989582 0.9999099 -0.9895821 0.989582 0.9999099 -0.9895821 0.989582 0.9999099 -0.9895822 0.989582 0.9999099 -0.9895823 0.989582 0.9999099 -0.9895824 0.989582 0.9999099 -0.9895825 0.989582 0.9999099 -0.9895826 0.989582 0.9999099 -0.9895828 0.989582 0.9999099 -0.989583 0.989582 0.9999099 -0.9895833 0.989582 0.9999099 -0.9895837 0.989582 0.9999099 -0.9895841 0.989582 0.9999099 -0.9895847 0.989582 0.9999099 -0.9895854 0.989582 0.9999099 -0.9895863 0.989582 0.9999099 -0.9895875 0.989582 0.9999099 -0.989589 0.989582 0.9999099 -0.9895909 0.989582 0.9999099 -0.9895932 0.989582 0.9999099 -0.9895962 0.989582 0.9999099 -0.9896 0.989582 0.9999099 -0.9896048 0.989582 0.9999099 -0.9896108 0.989582 0.9999099 -0.9896185 0.989582 0.9999099 -0.9896282 0.989582 0.9999099 -0.9896404 0.989582 0.9999099 -0.9896559 0.989582 0.9999099 -0.9896755 0.989582 0.9999099 -0.9897004 0.989582 0.9999099 -0.9897318 0.989582 0.9999099 -0.9897715 0.989582 0.9999099 -0.9898217 0.989582 0.9999099 -0.9898853 0.989582 0.9999099 -0.9899658 0.989582 0.9999099 -0.9900675 0.989582 0.9999099 -0.9901963 0.989582 0.9999099 -0.9903591 0.989582 0.9999099 -0.9905652 0.989582 0.9999099 -0.9908259 0.989582 0.9999099 -0.9911557 0.989582 0.9999099 -0.9915729 0.989582 0.9999099 -0.9921008 0.989582 0.9999099 -0.9927686 0.989582 0.9999099 -0.9936135 0.989582 0.9999099 -0.9946824 0.989582 0.9999099 -0.9960347 0.989582 0.9999099 -0.9977455 0.989582 0.9999099 -0.9999099 0.989582 0.9999099 -0.9999288 0.9917501 0.9982148 -0.9999437 0.9934695 0.9975145 -0.989582 0.989582 0.9999099 -0.989582 0.989582 0.9999099 -0.989582 0.989582 0.9999099 -0.989582 0.989582 0.9999099 -0.989582 0.989582 0.9999099 -0.989582 0.989582 0.9999099 -0.989582 0.989582 0.9999099 -0.9895821 0.989582 0.9999099 -0.9895821 0.989582 0.9999099 -0.9895822 0.989582 0.9999099 -0.9895822 0.989582 0.9999099 -0.9895823 0.989582 0.9999099 -0.9895824 0.989582 0.9999099 -0.9895826 0.989582 0.9999099 -0.9895828 0.989582 0.9999099 -0.989583 0.989582 0.9999099 -0.9895833 0.989582 0.9999099 -0.9895836 0.989582 0.9999099 -0.9895841 0.989582 0.9999099 -0.9895847 0.989582 0.9999099 -0.9895854 0.989582 0.9999099 -0.9895863 0.989582 0.9999099 -0.9895875 0.989582 0.9999099 -0.989589 0.989582 0.9999099 -0.9895908 0.989582 0.9999099 -0.9895932 0.989582 0.9999099 -0.9895962 0.989582 0.9999099 -0.9896 0.989582 0.9999099 -0.9896047 0.989582 0.9999099 -0.9896108 0.989582 0.9999099 -0.9896185 0.989582 0.9999099 -0.9896281 0.989582 0.9999099 -0.9896404 0.989582 0.9999099 -0.9896559 0.989582 0.9999099 -0.9896755 0.989582 0.9999099 -0.9897003 0.989582 0.9999099 -0.9897317 0.989582 0.9999099 -0.9897715 0.989582 0.9999099 -0.9898217 0.989582 0.9999099 -0.9898853 0.989582 0.9999099 -0.9899657 0.989582 0.9999099 -0.9900675 0.989582 0.9999099 -0.9901962 0.989582 0.9999099 -0.9903591 0.989582 0.9999099 -0.9905652 0.989582 0.9999099 -0.9908259 0.989582 0.9999099 -0.9911557 0.989582 0.9999099 -0.9915729 0.989582 0.9999099 -0.9921008 0.989582 0.9999099 -0.9927686 0.989582 0.9999099 -0.9936135 0.989582 0.9999099 -0.9946824 0.989582 0.9999099 -0.9960347 0.989582 0.9999099 -0.9977455 0.989582 0.9999099 -0.9999099 0.989582 0.9999099 -0.9999288 0.9917501 0.9982148 -0.9999437 0.9934695 0.9975145 -0.989582 0.9895821 0.9999099 -0.989582 0.989582 0.9999099 -0.989582 0.989582 0.9999099 -0.989582 0.989582 0.9999099 -0.989582 0.989582 0.9999099 -0.989582 0.989582 0.9999099 -0.989582 0.989582 0.9999099 -0.989582 0.989582 0.9999099 -0.9895821 0.989582 0.9999099 -0.9895821 0.989582 0.9999099 -0.9895822 0.989582 0.9999099 -0.9895823 0.989582 0.9999099 -0.9895824 0.989582 0.9999099 -0.9895826 0.989582 0.9999099 -0.9895827 0.989582 0.9999099 -0.989583 0.989582 0.9999099 -0.9895832 0.989582 0.9999099 -0.9895836 0.989582 0.9999099 -0.9895841 0.989582 0.9999099 -0.9895846 0.989582 0.9999099 -0.9895854 0.989582 0.9999099 -0.9895863 0.989582 0.9999099 -0.9895874 0.989582 0.9999099 -0.9895889 0.989582 0.9999099 -0.9895908 0.989582 0.9999099 -0.9895932 0.989582 0.9999099 -0.9895961 0.989582 0.9999099 -0.9895999 0.989582 0.9999099 -0.9896047 0.989582 0.9999099 -0.9896108 0.989582 0.9999099 -0.9896184 0.989582 0.9999099 -0.9896281 0.989582 0.9999099 -0.9896404 0.989582 0.9999099 -0.9896559 0.989582 0.9999099 -0.9896755 0.989582 0.9999099 -0.9897003 0.989582 0.9999099 -0.9897317 0.989582 0.9999099 -0.9897714 0.989582 0.9999099 -0.9898217 0.989582 0.9999099 -0.9898853 0.989582 0.9999099 -0.9899657 0.989582 0.9999099 -0.9900675 0.989582 0.9999099 -0.9901962 0.989582 0.9999099 -0.9903591 0.989582 0.9999099 -0.9905651 0.989582 0.9999099 -0.9908258 0.989582 0.9999099 -0.9911556 0.989582 0.9999099 -0.9915729 0.989582 0.9999099 -0.9921008 0.989582 0.9999099 -0.9927686 0.989582 0.9999099 -0.9936135 0.989582 0.9999099 -0.9946824 0.989582 0.9999099 -0.9960347 0.989582 0.9999099 -0.9977455 0.989582 0.9999099 -0.9999099 0.989582 0.9999099 -0.9999288 0.9917501 0.9982148 -0.9999437 0.9934695 0.9975145 -0.989582 0.9895821 0.9999099 -0.989582 0.9895821 0.9999099 -0.989582 0.989582 0.9999099 -0.989582 0.989582 0.9999099 -0.989582 0.989582 0.9999099 -0.9895819 0.9895819 0.9999099 -0.989582 0.9895819 0.9999099 -0.989582 0.9895819 0.9999099 -0.989582 0.9895819 0.9999099 -0.9895821 0.9895819 0.9999099 -0.9895822 0.9895819 0.9999099 -0.9895823 0.9895819 0.9999099 -0.9895824 0.9895819 0.9999099 -0.9895825 0.9895819 0.9999099 -0.9895827 0.9895819 0.9999099 -0.9895829 0.9895819 0.9999099 -0.9895832 0.9895819 0.9999099 -0.9895836 0.9895819 0.9999099 -0.989584 0.9895819 0.9999099 -0.9895846 0.9895819 0.9999099 -0.9895853 0.9895819 0.9999099 -0.9895862 0.9895819 0.9999099 -0.9895874 0.9895819 0.9999099 -0.9895889 0.9895819 0.9999099 -0.9895908 0.9895819 0.9999099 -0.9895931 0.9895819 0.9999099 -0.9895961 0.9895819 0.9999099 -0.9895999 0.9895819 0.9999099 -0.9896047 0.9895819 0.9999099 -0.9896107 0.9895819 0.9999099 -0.9896184 0.9895819 0.9999099 -0.9896281 0.9895819 0.9999099 -0.9896403 0.9895819 0.9999099 -0.9896558 0.9895819 0.9999099 -0.9896755 0.9895819 0.9999099 -0.9897003 0.9895819 0.9999099 -0.9897317 0.9895819 0.9999099 -0.9897714 0.9895819 0.9999099 -0.9898216 0.9895819 0.9999099 -0.9898852 0.9895819 0.9999099 -0.9899657 0.9895819 0.9999099 -0.9900674 0.9895819 0.9999099 -0.9901962 0.9895819 0.9999099 -0.990359 0.9895819 0.9999099 -0.9905651 0.9895819 0.9999099 -0.9908258 0.9895819 0.9999099 -0.9911556 0.9895819 0.9999099 -0.9915728 0.9895819 0.9999099 -0.9921007 0.9895819 0.9999099 -0.9927686 0.9895819 0.9999099 -0.9936134 0.9895819 0.9999099 -0.9946823 0.9895819 0.9999099 -0.9960346 0.9895819 0.9999099 -0.9977455 0.9895819 0.9999099 -0.9999099 0.9895819 0.9999099 -0.9999288 0.9917501 0.9982148 -0.9999437 0.9934695 0.9975145 -0.989582 0.9895821 0.9999099 -0.989582 0.9895821 0.9999099 -0.989582 0.9895821 0.9999099 -0.989582 0.989582 0.9999099 -0.989582 0.989582 0.9999099 -0.9895819 0.989582 0.9999099 -0.9895819 0.9895819 0.9999099 -0.989582 0.9895819 0.9999099 -0.989582 0.9895819 0.9999099 -0.9895821 0.9895819 0.9999099 -0.9895821 0.9895819 0.9999099 -0.9895822 0.9895819 0.9999099 -0.9895823 0.9895819 0.9999099 -0.9895825 0.9895819 0.9999099 -0.9895826 0.9895819 0.9999099 -0.9895829 0.9895819 0.9999099 -0.9895832 0.9895819 0.9999099 -0.9895835 0.9895819 0.9999099 -0.989584 0.9895819 0.9999099 -0.9895845 0.9895819 0.9999099 -0.9895853 0.9895819 0.9999099 -0.9895862 0.9895819 0.9999099 -0.9895874 0.9895819 0.9999099 -0.9895888 0.9895819 0.9999099 -0.9895907 0.9895819 0.9999099 -0.9895931 0.9895819 0.9999099 -0.9895961 0.9895819 0.9999099 -0.9895998 0.9895819 0.9999099 -0.9896046 0.9895819 0.9999099 -0.9896107 0.9895819 0.9999099 -0.9896183 0.9895819 0.9999099 -0.989628 0.9895819 0.9999099 -0.9896403 0.9895819 0.9999099 -0.9896558 0.9895819 0.9999099 -0.9896754 0.9895819 0.9999099 -0.9897002 0.9895819 0.9999099 -0.9897316 0.9895819 0.9999099 -0.9897713 0.9895819 0.9999099 -0.9898216 0.9895819 0.9999099 -0.9898852 0.9895819 0.9999099 -0.9899656 0.9895819 0.9999099 -0.9900674 0.9895819 0.9999099 -0.9901961 0.9895819 0.9999099 -0.990359 0.9895819 0.9999099 -0.9905651 0.9895819 0.9999099 -0.9908257 0.9895819 0.9999099 -0.9911556 0.9895819 0.9999099 -0.9915728 0.9895819 0.9999099 -0.9921007 0.9895819 0.9999099 -0.9927685 0.9895819 0.9999099 -0.9936134 0.9895819 0.9999099 -0.9946823 0.9895819 0.9999099 -0.9960346 0.9895819 0.9999099 -0.9977455 0.9895819 0.9999099 -0.9999099 0.9895819 0.9999099 -0.9999288 0.99175 0.9982148 -0.9999437 0.9934695 0.9975145 -0.989582 0.9895821 0.9999099 -0.989582 0.9895821 0.9999099 -0.989582 0.9895821 0.9999099 -0.989582 0.9895821 0.9999099 -0.989582 0.989582 0.9999099 -0.9895819 0.989582 0.9999099 -0.9895819 0.989582 0.9999099 -0.9895819 0.9895819 0.9999099 -0.9895819 0.9895819 0.9999099 -0.989582 0.9895819 0.9999099 -0.9895821 0.9895819 0.9999099 -0.9895822 0.9895819 0.9999099 -0.9895823 0.9895819 0.9999099 -0.9895824 0.9895819 0.9999099 -0.9895826 0.9895819 0.9999099 -0.9895828 0.9895819 0.9999099 -0.9895831 0.9895819 0.9999099 -0.9895834 0.9895819 0.9999099 -0.9895839 0.9895819 0.9999099 -0.9895845 0.9895819 0.9999099 -0.9895852 0.9895819 0.9999099 -0.9895861 0.9895819 0.9999099 -0.9895873 0.9895819 0.9999099 -0.9895888 0.9895819 0.9999099 -0.9895906 0.9895819 0.9999099 -0.989593 0.9895819 0.9999099 -0.989596 0.9895819 0.9999099 -0.9895998 0.9895819 0.9999099 -0.9896046 0.9895819 0.9999099 -0.9896106 0.9895819 0.9999099 -0.9896183 0.9895819 0.9999099 -0.989628 0.9895819 0.9999099 -0.9896402 0.9895819 0.9999099 -0.9896557 0.9895819 0.9999099 -0.9896753 0.9895819 0.9999099 -0.9897002 0.9895819 0.9999099 -0.9897316 0.9895819 0.9999099 -0.9897713 0.9895819 0.9999099 -0.9898215 0.9895819 0.9999099 -0.9898851 0.9895819 0.9999099 -0.9899656 0.9895819 0.9999099 -0.9900673 0.9895819 0.9999099 -0.9901961 0.9895819 0.9999099 -0.9903589 0.9895819 0.9999099 -0.990565 0.9895819 0.9999099 -0.9908257 0.9895819 0.9999099 -0.9911555 0.9895819 0.9999099 -0.9915728 0.9895819 0.9999099 -0.9921006 0.9895819 0.9999099 -0.9927685 0.9895819 0.9999099 -0.9936134 0.9895819 0.9999099 -0.9946823 0.9895819 0.9999099 -0.9960346 0.9895819 0.9999099 -0.9977454 0.9895819 0.9999099 -0.9999099 0.9895819 0.9999099 -0.9999288 0.99175 0.9982148 -0.9999437 0.9934694 0.9975144 -0.989582 0.9895822 0.9999099 -0.989582 0.9895822 0.9999099 -0.989582 0.9895821 0.9999099 -0.989582 0.9895821 0.9999099 -0.989582 0.9895821 0.9999099 -0.9895819 0.989582 0.9999099 -0.9895819 0.989582 0.9999099 -0.9895819 0.9895819 0.9999099 -0.9895819 0.9895819 0.9999099 -0.9895819 0.9895819 0.9999099 -0.989582 0.9895819 0.9999099 -0.9895821 0.9895819 0.9999099 -0.9895822 0.9895819 0.9999099 -0.9895823 0.9895819 0.9999099 -0.9895825 0.9895819 0.9999099 -0.9895827 0.9895819 0.9999099 -0.989583 0.9895819 0.9999099 -0.9895834 0.9895819 0.9999099 -0.9895838 0.9895819 0.9999099 -0.9895844 0.9895819 0.9999099 -0.9895851 0.9895819 0.9999099 -0.9895861 0.9895819 0.9999099 -0.9895872 0.9895819 0.9999099 -0.9895887 0.9895819 0.9999099 -0.9895906 0.9895819 0.9999099 -0.9895929 0.9895819 0.9999099 -0.9895959 0.9895819 0.9999099 -0.9895997 0.9895819 0.9999099 -0.9896045 0.9895819 0.9999099 -0.9896105 0.9895819 0.9999099 -0.9896182 0.9895819 0.9999099 -0.9896279 0.9895819 0.9999099 -0.9896401 0.9895819 0.9999099 -0.9896557 0.9895819 0.9999099 -0.9896753 0.9895819 0.9999099 -0.9897001 0.9895819 0.9999099 -0.9897315 0.9895819 0.9999099 -0.9897712 0.9895819 0.9999099 -0.9898215 0.9895819 0.9999099 -0.989885 0.9895819 0.9999099 -0.9899655 0.9895819 0.9999099 -0.9900672 0.9895819 0.9999099 -0.990196 0.9895819 0.9999099 -0.9903589 0.9895819 0.9999099 -0.9905649 0.9895819 0.9999099 -0.9908256 0.9895819 0.9999099 -0.9911554 0.9895819 0.9999099 -0.9915727 0.9895819 0.9999099 -0.9921006 0.9895819 0.9999099 -0.9927684 0.9895819 0.9999099 -0.9936133 0.9895819 0.9999099 -0.9946823 0.9895819 0.9999099 -0.9960346 0.9895819 0.9999099 -0.9977454 0.9895819 0.9999099 -0.9999099 0.9895819 0.9999099 -0.9999288 0.99175 0.9982148 -0.9999437 0.9934694 0.9975144 -0.989582 0.9895822 0.9999099 -0.989582 0.9895822 0.9999099 -0.989582 0.9895822 0.9999099 -0.989582 0.9895822 0.9999099 -0.989582 0.9895821 0.9999099 -0.9895819 0.9895821 0.9999099 -0.9895819 0.9895821 0.9999099 -0.9895819 0.989582 0.9999099 -0.9895819 0.9895819 0.9999099 -0.9895818 0.9895818 0.9999099 -0.9895819 0.9895818 0.9999099 -0.989582 0.9895818 0.9999099 -0.9895821 0.9895818 0.9999099 -0.9895822 0.9895818 0.9999099 -0.9895824 0.9895818 0.9999099 -0.9895826 0.9895818 0.9999099 -0.9895829 0.9895818 0.9999099 -0.9895833 0.9895818 0.9999099 -0.9895837 0.9895818 0.9999099 -0.9895843 0.9895818 0.9999099 -0.989585 0.9895818 0.9999099 -0.989586 0.9895818 0.9999099 -0.9895871 0.9895818 0.9999099 -0.9895886 0.9895818 0.9999099 -0.9895905 0.9895818 0.9999099 -0.9895928 0.9895818 0.9999099 -0.9895958 0.9895818 0.9999099 -0.9895996 0.9895818 0.9999099 -0.9896044 0.9895818 0.9999099 -0.9896105 0.9895818 0.9999099 -0.9896181 0.9895818 0.9999099 -0.9896278 0.9895818 0.9999099 -0.9896401 0.9895818 0.9999099 -0.9896556 0.9895818 0.9999099 -0.9896752 0.9895818 0.9999099 -0.9897 0.9895818 0.9999099 -0.9897314 0.9895818 0.9999099 -0.9897711 0.9895818 0.9999099 -0.9898214 0.9895818 0.9999099 -0.989885 0.9895818 0.9999099 -0.9899654 0.9895818 0.9999099 -0.9900672 0.9895818 0.9999099 -0.9901959 0.9895818 0.9999099 -0.9903588 0.9895818 0.9999099 -0.9905648 0.9895818 0.9999099 -0.9908255 0.9895818 0.9999099 -0.9911554 0.9895818 0.9999099 -0.9915726 0.9895818 0.9999099 -0.9921005 0.9895818 0.9999099 -0.9927684 0.9895818 0.9999099 -0.9936133 0.9895818 0.9999099 -0.9946822 0.9895818 0.9999099 -0.9960345 0.9895818 0.9999099 -0.9977454 0.9895818 0.9999099 -0.9999099 0.9895818 0.9999099 -0.9999288 0.99175 0.9982147 -0.9999437 0.9934694 0.9975144 -0.989582 0.9895823 0.9999099 -0.989582 0.9895823 0.9999099 -0.989582 0.9895823 0.9999099 -0.989582 0.9895822 0.9999099 -0.989582 0.9895822 0.9999099 -0.9895819 0.9895822 0.9999099 -0.9895819 0.9895821 0.9999099 -0.9895819 0.9895821 0.9999099 -0.9895819 0.989582 0.9999099 -0.9895818 0.9895819 0.9999099 -0.9895818 0.9895818 0.9999099 -0.9895819 0.9895818 0.9999099 -0.989582 0.9895818 0.9999099 -0.9895821 0.9895818 0.9999099 -0.9895823 0.9895818 0.9999099 -0.9895825 0.9895818 0.9999099 -0.9895828 0.9895818 0.9999099 -0.9895832 0.9895818 0.9999099 -0.9895836 0.9895818 0.9999099 -0.9895842 0.9895818 0.9999099 -0.9895849 0.9895818 0.9999099 -0.9895859 0.9895818 0.9999099 -0.989587 0.9895818 0.9999099 -0.9895885 0.9895818 0.9999099 -0.9895904 0.9895818 0.9999099 -0.9895927 0.9895818 0.9999099 -0.9895957 0.9895818 0.9999099 -0.9895995 0.9895818 0.9999099 -0.9896043 0.9895818 0.9999099 -0.9896103 0.9895818 0.9999099 -0.989618 0.9895818 0.9999099 -0.9896277 0.9895818 0.9999099 -0.9896399 0.9895818 0.9999099 -0.9896555 0.9895818 0.9999099 -0.9896751 0.9895818 0.9999099 -0.9896999 0.9895818 0.9999099 -0.9897313 0.9895818 0.9999099 -0.989771 0.9895818 0.9999099 -0.9898213 0.9895818 0.9999099 -0.9898849 0.9895818 0.9999099 -0.9899653 0.9895818 0.9999099 -0.9900671 0.9895818 0.9999099 -0.9901958 0.9895818 0.9999099 -0.9903587 0.9895818 0.9999099 -0.9905648 0.9895818 0.9999099 -0.9908255 0.9895818 0.9999099 -0.9911553 0.9895818 0.9999099 -0.9915725 0.9895818 0.9999099 -0.9921004 0.9895818 0.9999099 -0.9927683 0.9895818 0.9999099 -0.9936132 0.9895818 0.9999099 -0.9946822 0.9895818 0.9999099 -0.9960345 0.9895818 0.9999099 -0.9977454 0.9895818 0.9999099 -0.9999099 0.9895818 0.9999099 -0.9999288 0.99175 0.9982147 -0.9999437 0.9934694 0.9975144 -0.989582 0.9895824 0.9999099 -0.989582 0.9895824 0.9999099 -0.989582 0.9895824 0.9999099 -0.989582 0.9895823 0.9999099 -0.989582 0.9895823 0.9999099 -0.9895819 0.9895823 0.9999099 -0.9895819 0.9895822 0.9999099 -0.9895819 0.9895822 0.9999099 -0.9895819 0.9895821 0.9999099 -0.9895818 0.989582 0.9999099 -0.9895818 0.9895819 0.9999099 -0.9895818 0.9895818 0.9999099 -0.9895819 0.9895818 0.9999099 -0.989582 0.9895818 0.9999099 -0.9895822 0.9895818 0.9999099 -0.9895824 0.9895818 0.9999099 -0.9895827 0.9895818 0.9999099 -0.9895831 0.9895818 0.9999099 -0.9895835 0.9895818 0.9999099 -0.9895841 0.9895818 0.9999099 -0.9895848 0.9895818 0.9999099 -0.9895857 0.9895818 0.9999099 -0.9895869 0.9895818 0.9999099 -0.9895884 0.9895818 0.9999099 -0.9895902 0.9895818 0.9999099 -0.9895926 0.9895818 0.9999099 -0.9895956 0.9895818 0.9999099 -0.9895994 0.9895818 0.9999099 -0.9896042 0.9895818 0.9999099 -0.9896102 0.9895818 0.9999099 -0.9896179 0.9895818 0.9999099 -0.9896276 0.9895818 0.9999099 -0.9896398 0.9895818 0.9999099 -0.9896553 0.9895818 0.9999099 -0.9896749 0.9895818 0.9999099 -0.9896998 0.9895818 0.9999099 -0.9897312 0.9895818 0.9999099 -0.9897709 0.9895818 0.9999099 -0.9898212 0.9895818 0.9999099 -0.9898847 0.9895818 0.9999099 -0.9899652 0.9895818 0.9999099 -0.9900669 0.9895818 0.9999099 -0.9901957 0.9895818 0.9999099 -0.9903586 0.9895818 0.9999099 -0.9905646 0.9895818 0.9999099 -0.9908253 0.9895818 0.9999099 -0.9911552 0.9895818 0.9999099 -0.9915724 0.9895818 0.9999099 -0.9921003 0.9895818 0.9999099 -0.9927682 0.9895818 0.9999099 -0.9936131 0.9895818 0.9999099 -0.9946821 0.9895818 0.9999099 -0.9960344 0.9895818 0.9999099 -0.9977454 0.9895818 0.9999099 -0.9999099 0.9895818 0.9999099 -0.9999288 0.9917499 0.9982147 -0.9999437 0.9934694 0.9975144 -0.989582 0.9895825 0.9999099 -0.989582 0.9895825 0.9999099 -0.989582 0.9895825 0.9999099 -0.989582 0.9895824 0.9999099 -0.989582 0.9895824 0.9999099 -0.9895819 0.9895824 0.9999099 -0.9895819 0.9895823 0.9999099 -0.9895819 0.9895823 0.9999099 -0.9895819 0.9895822 0.9999099 -0.9895818 0.9895821 0.9999099 -0.9895818 0.989582 0.9999099 -0.9895818 0.9895819 0.9999099 -0.9895817 0.9895817 0.9999099 -0.9895819 0.9895817 0.9999099 -0.989582 0.9895817 0.9999099 -0.9895823 0.9895817 0.9999099 -0.9895826 0.9895817 0.9999099 -0.9895829 0.9895817 0.9999099 -0.9895834 0.9895817 0.9999099 -0.9895839 0.9895817 0.9999099 -0.9895847 0.9895817 0.9999099 -0.9895856 0.9895817 0.9999099 -0.9895868 0.9895817 0.9999099 -0.9895882 0.9895817 0.9999099 -0.9895901 0.9895817 0.9999099 -0.9895925 0.9895817 0.9999099 -0.9895955 0.9895817 0.9999099 -0.9895992 0.9895817 0.9999099 -0.989604 0.9895817 0.9999099 -0.9896101 0.9895817 0.9999099 -0.9896177 0.9895817 0.9999099 -0.9896274 0.9895817 0.9999099 -0.9896397 0.9895817 0.9999099 -0.9896552 0.9895817 0.9999099 -0.9896748 0.9895817 0.9999099 -0.9896996 0.9895817 0.9999099 -0.989731 0.9895817 0.9999099 -0.9897708 0.9895817 0.9999099 -0.989821 0.9895817 0.9999099 -0.9898846 0.9895817 0.9999099 -0.989965 0.9895817 0.9999099 -0.9900668 0.9895817 0.9999099 -0.9901956 0.9895817 0.9999099 -0.9903584 0.9895817 0.9999099 -0.9905645 0.9895817 0.9999099 -0.9908252 0.9895817 0.9999099 -0.991155 0.9895817 0.9999099 -0.9915723 0.9895817 0.9999099 -0.9921002 0.9895817 0.9999099 -0.9927681 0.9895817 0.9999099 -0.993613 0.9895817 0.9999099 -0.994682 0.9895817 0.9999099 -0.9960344 0.9895817 0.9999099 -0.9977453 0.9895817 0.9999099 -0.9999099 0.9895817 0.9999099 -0.9999288 0.9917499 0.9982147 -0.9999437 0.9934694 0.9975144 -0.989582 0.9895826 0.9999099 -0.989582 0.9895826 0.9999099 -0.989582 0.9895826 0.9999099 -0.989582 0.9895826 0.9999099 -0.989582 0.9895826 0.9999099 -0.9895819 0.9895825 0.9999099 -0.9895819 0.9895825 0.9999099 -0.9895819 0.9895824 0.9999099 -0.9895819 0.9895823 0.9999099 -0.9895818 0.9895822 0.9999099 -0.9895818 0.9895821 0.9999099 -0.9895818 0.989582 0.9999099 -0.9895817 0.9895819 0.9999099 -0.9895817 0.9895817 0.9999099 -0.9895819 0.9895817 0.9999099 -0.9895821 0.9895817 0.9999099 -0.9895824 0.9895817 0.9999099 -0.9895828 0.9895817 0.9999099 -0.9895832 0.9895817 0.9999099 -0.9895838 0.9895817 0.9999099 -0.9895845 0.9895817 0.9999099 -0.9895854 0.9895817 0.9999099 -0.9895866 0.9895817 0.9999099 -0.9895881 0.9895817 0.9999099 -0.98959 0.9895817 0.9999099 -0.9895923 0.9895817 0.9999099 -0.9895953 0.9895817 0.9999099 -0.9895991 0.9895817 0.9999099 -0.9896039 0.9895817 0.9999099 -0.9896099 0.9895817 0.9999099 -0.9896176 0.9895817 0.9999099 -0.9896273 0.9895817 0.9999099 -0.9896395 0.9895817 0.9999099 -0.989655 0.9895817 0.9999099 -0.9896747 0.9895817 0.9999099 -0.9896995 0.9895817 0.9999099 -0.9897309 0.9895817 0.9999099 -0.9897706 0.9895817 0.9999099 -0.9898209 0.9895817 0.9999099 -0.9898845 0.9895817 0.9999099 -0.9899649 0.9895817 0.9999099 -0.9900667 0.9895817 0.9999099 -0.9901954 0.9895817 0.9999099 -0.9903583 0.9895817 0.9999099 -0.9905644 0.9895817 0.9999099 -0.9908251 0.9895817 0.9999099 -0.9911549 0.9895817 0.9999099 -0.9915722 0.9895817 0.9999099 -0.9921001 0.9895817 0.9999099 -0.992768 0.9895817 0.9999099 -0.993613 0.9895817 0.9999099 -0.9946819 0.9895817 0.9999099 -0.9960343 0.9895817 0.9999099 -0.9977453 0.9895817 0.9999099 -0.9999099 0.9895817 0.9999099 -0.9999288 0.9917499 0.9982147 -0.9999437 0.9934694 0.9975143 -0.989582 0.9895828 0.9999099 -0.989582 0.9895828 0.9999099 -0.989582 0.9895828 0.9999099 -0.989582 0.9895828 0.9999099 -0.989582 0.9895827 0.9999099 -0.9895819 0.9895827 0.9999099 -0.9895819 0.9895826 0.9999099 -0.9895819 0.9895826 0.9999099 -0.9895819 0.9895825 0.9999099 -0.9895818 0.9895824 0.9999099 -0.9895818 0.9895823 0.9999099 -0.9895818 0.9895822 0.9999099 -0.9895817 0.989582 0.9999099 -0.9895817 0.9895819 0.9999099 -0.9895817 0.9895817 0.9999099 -0.989582 0.9895817 0.9999099 -0.9895823 0.9895817 0.9999099 -0.9895826 0.9895817 0.9999099 -0.9895831 0.9895817 0.9999099 -0.9895836 0.9895817 0.9999099 -0.9895844 0.9895817 0.9999099 -0.9895853 0.9895817 0.9999099 -0.9895865 0.9895817 0.9999099 -0.9895879 0.9895817 0.9999099 -0.9895898 0.9895817 0.9999099 -0.9895922 0.9895817 0.9999099 -0.9895952 0.9895817 0.9999099 -0.9895989 0.9895817 0.9999099 -0.9896037 0.9895817 0.9999099 -0.9896098 0.9895817 0.9999099 -0.9896174 0.9895817 0.9999099 -0.9896271 0.9895817 0.9999099 -0.9896394 0.9895817 0.9999099 -0.9896549 0.9895817 0.9999099 -0.9896745 0.9895817 0.9999099 -0.9896993 0.9895817 0.9999099 -0.9897307 0.9895817 0.9999099 -0.9897705 0.9895817 0.9999099 -0.9898207 0.9895817 0.9999099 -0.9898843 0.9895817 0.9999099 -0.9899648 0.9895817 0.9999099 -0.9900665 0.9895817 0.9999099 -0.9901953 0.9895817 0.9999099 -0.9903582 0.9895817 0.9999099 -0.9905642 0.9895817 0.9999099 -0.990825 0.9895817 0.9999099 -0.9911548 0.9895817 0.9999099 -0.9915721 0.9895817 0.9999099 -0.9921 0.9895817 0.9999099 -0.9927679 0.9895817 0.9999099 -0.9936129 0.9895817 0.9999099 -0.9946819 0.9895817 0.9999099 -0.9960343 0.9895817 0.9999099 -0.9977453 0.9895817 0.9999099 -0.9999099 0.9895817 0.9999099 -0.9999288 0.9917499 0.9982147 -0.9999437 0.9934694 0.9975143 -0.989582 0.989583 0.9999099 -0.989582 0.989583 0.9999099 -0.989582 0.989583 0.9999099 -0.989582 0.989583 0.9999099 -0.989582 0.989583 0.9999099 -0.9895819 0.9895829 0.9999099 -0.9895819 0.9895829 0.9999099 -0.9895819 0.9895828 0.9999099 -0.9895819 0.9895827 0.9999099 -0.9895818 0.9895826 0.9999099 -0.9895818 0.9895825 0.9999099 -0.9895818 0.9895824 0.9999099 -0.9895817 0.9895823 0.9999099 -0.9895817 0.9895821 0.9999099 -0.9895817 0.989582 0.9999099 -0.9895819 0.9895819 0.9999099 -0.9895821 0.9895819 0.9999099 -0.9895825 0.9895819 0.9999099 -0.989583 0.9895819 0.9999099 -0.9895835 0.9895819 0.9999099 -0.9895843 0.9895819 0.9999099 -0.9895852 0.9895819 0.9999099 -0.9895864 0.9895819 0.9999099 -0.9895878 0.9895819 0.9999099 -0.9895897 0.9895819 0.9999099 -0.9895921 0.9895819 0.9999099 -0.989595 0.9895819 0.9999099 -0.9895988 0.9895819 0.9999099 -0.9896036 0.9895819 0.9999099 -0.9896097 0.9895819 0.9999099 -0.9896173 0.9895819 0.9999099 -0.989627 0.9895819 0.9999099 -0.9896393 0.9895819 0.9999099 -0.9896548 0.9895819 0.9999099 -0.9896744 0.9895819 0.9999099 -0.9896992 0.9895819 0.9999099 -0.9897306 0.9895819 0.9999099 -0.9897704 0.9895819 0.9999099 -0.9898206 0.9895819 0.9999099 -0.9898842 0.9895819 0.9999099 -0.9899646 0.9895819 0.9999099 -0.9900664 0.9895819 0.9999099 -0.9901952 0.9895819 0.9999099 -0.9903581 0.9895819 0.9999099 -0.9905641 0.9895819 0.9999099 -0.9908249 0.9895819 0.9999099 -0.9911547 0.9895819 0.9999099 -0.991572 0.9895819 0.9999099 -0.9920999 0.9895819 0.9999099 -0.9927678 0.9895819 0.9999099 -0.9936128 0.9895819 0.9999099 -0.9946818 0.9895819 0.9999099 -0.9960342 0.9895819 0.9999099 -0.9977452 0.9895819 0.9999099 -0.9999099 0.9895819 0.9999099 -0.9999288 0.99175 0.9982146 -0.9999437 0.9934694 0.9975143 -0.989582 0.9895833 0.9999099 -0.989582 0.9895833 0.9999099 -0.989582 0.9895833 0.9999099 -0.989582 0.9895833 0.9999099 -0.989582 0.9895832 0.9999099 -0.9895819 0.9895832 0.9999099 -0.9895819 0.9895832 0.9999099 -0.9895819 0.9895831 0.9999099 -0.9895819 0.989583 0.9999099 -0.9895818 0.9895829 0.9999099 -0.9895818 0.9895828 0.9999099 -0.9895818 0.9895827 0.9999099 -0.9895817 0.9895826 0.9999099 -0.9895817 0.9895824 0.9999099 -0.9895817 0.9895823 0.9999099 -0.9895819 0.9895821 0.9999099 -0.9895821 0.9895821 0.9999099 -0.9895825 0.9895821 0.9999099 -0.9895829 0.9895821 0.9999099 -0.9895835 0.9895821 0.9999099 -0.9895842 0.9895821 0.9999099 -0.9895851 0.9895821 0.9999099 -0.9895863 0.9895821 0.9999099 -0.9895878 0.9895821 0.9999099 -0.9895897 0.9895821 0.9999099 -0.989592 0.9895821 0.9999099 -0.989595 0.9895821 0.9999099 -0.9895988 0.9895821 0.9999099 -0.9896036 0.9895821 0.9999099 -0.9896096 0.9895821 0.9999099 -0.9896173 0.9895821 0.9999099 -0.989627 0.9895821 0.9999099 -0.9896392 0.9895821 0.9999099 -0.9896547 0.9895821 0.9999099 -0.9896744 0.9895821 0.9999099 -0.9896992 0.9895821 0.9999099 -0.9897306 0.9895821 0.9999099 -0.9897703 0.9895821 0.9999099 -0.9898206 0.9895821 0.9999099 -0.9898842 0.9895821 0.9999099 -0.9899646 0.9895821 0.9999099 -0.9900664 0.9895821 0.9999099 -0.9901951 0.9895821 0.9999099 -0.990358 0.9895821 0.9999099 -0.9905641 0.9895821 0.9999099 -0.9908248 0.9895821 0.9999099 -0.9911547 0.9895821 0.9999099 -0.991572 0.9895821 0.9999099 -0.9920999 0.9895821 0.9999099 -0.9927678 0.9895821 0.9999099 -0.9936128 0.9895821 0.9999099 -0.9946818 0.9895821 0.9999099 -0.9960342 0.9895821 0.9999099 -0.9977452 0.9895821 0.9999099 -0.9999099 0.9895821 0.9999099 -0.9999288 0.9917502 0.9982146 -0.9999437 0.9934695 0.9975143 -0.989582 0.9895837 0.9999099 -0.989582 0.9895837 0.9999099 -0.989582 0.9895837 0.9999099 -0.989582 0.9895836 0.9999099 -0.989582 0.9895836 0.9999099 -0.9895819 0.9895836 0.9999099 -0.9895819 0.9895835 0.9999099 -0.9895819 0.9895834 0.9999099 -0.9895819 0.9895834 0.9999099 -0.9895818 0.9895833 0.9999099 -0.9895818 0.9895832 0.9999099 -0.9895818 0.9895831 0.9999099 -0.9895817 0.9895829 0.9999099 -0.9895817 0.9895828 0.9999099 -0.9895817 0.9895826 0.9999099 -0.9895819 0.9895825 0.9999099 -0.9895821 0.9895825 0.9999099 -0.9895825 0.9895825 0.9999099 -0.9895829 0.9895825 0.9999099 -0.9895835 0.9895825 0.9999099 -0.9895842 0.9895825 0.9999099 -0.9895851 0.9895825 0.9999099 -0.9895863 0.9895825 0.9999099 -0.9895878 0.9895825 0.9999099 -0.9895897 0.9895825 0.9999099 -0.989592 0.9895825 0.9999099 -0.989595 0.9895825 0.9999099 -0.9895988 0.9895825 0.9999099 -0.9896036 0.9895825 0.9999099 -0.9896096 0.9895825 0.9999099 -0.9896173 0.9895825 0.9999099 -0.989627 0.9895825 0.9999099 -0.9896392 0.9895825 0.9999099 -0.9896547 0.9895825 0.9999099 -0.9896744 0.9895825 0.9999099 -0.9896992 0.9895825 0.9999099 -0.9897306 0.9895825 0.9999099 -0.9897703 0.9895825 0.9999099 -0.9898206 0.9895825 0.9999099 -0.9898842 0.9895825 0.9999099 -0.9899646 0.9895825 0.9999099 -0.9900664 0.9895825 0.9999099 -0.9901951 0.9895825 0.9999099 -0.990358 0.9895825 0.9999099 -0.9905641 0.9895825 0.9999099 -0.9908248 0.9895825 0.9999099 -0.9911547 0.9895825 0.9999099 -0.991572 0.9895825 0.9999099 -0.9920999 0.9895825 0.9999099 -0.9927678 0.9895825 0.9999099 -0.9936128 0.9895825 0.9999099 -0.9946818 0.9895825 0.9999099 -0.9960342 0.9895825 0.9999099 -0.9977452 0.9895825 0.9999099 -0.9999099 0.9895825 0.9999099 -0.9999288 0.9917504 0.9982146 -0.9999437 0.9934697 0.9975143 -0.989582 0.9895841 0.9999099 -0.989582 0.9895841 0.9999099 -0.989582 0.9895841 0.9999099 -0.989582 0.9895841 0.9999099 -0.989582 0.9895841 0.9999099 -0.9895819 0.989584 0.9999099 -0.9895819 0.989584 0.9999099 -0.9895819 0.9895839 0.9999099 -0.9895819 0.9895838 0.9999099 -0.9895818 0.9895837 0.9999099 -0.9895818 0.9895836 0.9999099 -0.9895818 0.9895835 0.9999099 -0.9895817 0.9895834 0.9999099 -0.9895817 0.9895832 0.9999099 -0.9895817 0.9895831 0.9999099 -0.9895819 0.989583 0.9999099 -0.9895821 0.9895829 0.9999099 -0.9895825 0.9895829 0.9999099 -0.9895829 0.9895829 0.9999099 -0.9895835 0.9895829 0.9999099 -0.9895842 0.9895829 0.9999099 -0.9895851 0.9895829 0.9999099 -0.9895863 0.9895829 0.9999099 -0.9895878 0.9895829 0.9999099 -0.9895897 0.9895829 0.9999099 -0.989592 0.9895829 0.9999099 -0.989595 0.9895829 0.9999099 -0.9895988 0.9895829 0.9999099 -0.9896036 0.9895829 0.9999099 -0.9896096 0.9895829 0.9999099 -0.9896173 0.9895829 0.9999099 -0.989627 0.9895829 0.9999099 -0.9896392 0.9895829 0.9999099 -0.9896547 0.9895829 0.9999099 -0.9896744 0.9895829 0.9999099 -0.9896992 0.9895829 0.9999099 -0.9897306 0.9895829 0.9999099 -0.9897703 0.9895829 0.9999099 -0.9898206 0.9895829 0.9999099 -0.9898842 0.9895829 0.9999099 -0.9899646 0.9895829 0.9999099 -0.9900664 0.9895829 0.9999099 -0.9901951 0.9895829 0.9999099 -0.990358 0.9895829 0.9999099 -0.9905641 0.9895829 0.9999099 -0.9908248 0.9895829 0.9999099 -0.9911547 0.9895829 0.9999099 -0.991572 0.9895829 0.9999099 -0.9920999 0.9895829 0.9999099 -0.9927678 0.9895829 0.9999099 -0.9936128 0.9895829 0.9999099 -0.9946818 0.9895829 0.9999099 -0.9960342 0.9895829 0.9999099 -0.9977452 0.9895829 0.9999099 -0.9999099 0.9895829 0.9999099 -0.9999288 0.9917507 0.9982146 -0.9999437 0.9934698 0.9975143 -0.989582 0.9895847 0.9999099 -0.989582 0.9895847 0.9999099 -0.989582 0.9895847 0.9999099 -0.989582 0.9895847 0.9999099 -0.989582 0.9895846 0.9999099 -0.9895819 0.9895846 0.9999099 -0.9895819 0.9895845 0.9999099 -0.9895819 0.9895845 0.9999099 -0.9895819 0.9895844 0.9999099 -0.9895818 0.9895843 0.9999099 -0.9895818 0.9895842 0.9999099 -0.9895818 0.9895841 0.9999099 -0.9895817 0.9895839 0.9999099 -0.9895817 0.9895838 0.9999099 -0.9895817 0.9895836 0.9999099 -0.9895819 0.9895835 0.9999099 -0.9895821 0.9895835 0.9999099 -0.9895825 0.9895835 0.9999099 -0.9895829 0.9895835 0.9999099 -0.9895835 0.9895835 0.9999099 -0.9895842 0.9895835 0.9999099 -0.9895851 0.9895835 0.9999099 -0.9895863 0.9895835 0.9999099 -0.9895878 0.9895835 0.9999099 -0.9895897 0.9895835 0.9999099 -0.989592 0.9895835 0.9999099 -0.989595 0.9895835 0.9999099 -0.9895988 0.9895835 0.9999099 -0.9896036 0.9895835 0.9999099 -0.9896096 0.9895835 0.9999099 -0.9896173 0.9895835 0.9999099 -0.989627 0.9895835 0.9999099 -0.9896392 0.9895835 0.9999099 -0.9896547 0.9895835 0.9999099 -0.9896744 0.9895835 0.9999099 -0.9896992 0.9895835 0.9999099 -0.9897306 0.9895835 0.9999099 -0.9897703 0.9895835 0.9999099 -0.9898206 0.9895835 0.9999099 -0.9898842 0.9895835 0.9999099 -0.9899646 0.9895835 0.9999099 -0.9900664 0.9895835 0.9999099 -0.9901951 0.9895835 0.9999099 -0.990358 0.9895835 0.9999099 -0.9905641 0.9895835 0.9999099 -0.9908248 0.9895835 0.9999099 -0.9911547 0.9895835 0.9999099 -0.991572 0.9895835 0.9999099 -0.9920999 0.9895835 0.9999099 -0.9927678 0.9895835 0.9999099 -0.9936128 0.9895835 0.9999099 -0.9946818 0.9895835 0.9999099 -0.9960342 0.9895835 0.9999099 -0.9977452 0.9895835 0.9999099 -0.9999099 0.9895835 0.9999099 -0.9999288 0.991751 0.9982146 -0.9999437 0.9934701 0.9975143 -0.989582 0.9895855 0.9999099 -0.989582 0.9895854 0.9999099 -0.989582 0.9895854 0.9999099 -0.989582 0.9895854 0.9999099 -0.989582 0.9895854 0.9999099 -0.9895819 0.9895853 0.9999099 -0.9895819 0.9895853 0.9999099 -0.9895819 0.9895852 0.9999099 -0.9895819 0.9895851 0.9999099 -0.9895818 0.989585 0.9999099 -0.9895818 0.9895849 0.9999099 -0.9895818 0.9895848 0.9999099 -0.9895817 0.9895847 0.9999099 -0.9895817 0.9895845 0.9999099 -0.9895817 0.9895844 0.9999099 -0.9895819 0.9895843 0.9999099 -0.9895821 0.9895842 0.9999099 -0.9895825 0.9895842 0.9999099 -0.9895829 0.9895842 0.9999099 -0.9895835 0.9895842 0.9999099 -0.9895842 0.9895842 0.9999099 -0.9895851 0.9895842 0.9999099 -0.9895863 0.9895842 0.9999099 -0.9895878 0.9895842 0.9999099 -0.9895897 0.9895842 0.9999099 -0.989592 0.9895842 0.9999099 -0.989595 0.9895842 0.9999099 -0.9895988 0.9895842 0.9999099 -0.9896036 0.9895842 0.9999099 -0.9896096 0.9895842 0.9999099 -0.9896173 0.9895842 0.9999099 -0.989627 0.9895842 0.9999099 -0.9896392 0.9895842 0.9999099 -0.9896547 0.9895842 0.9999099 -0.9896744 0.9895842 0.9999099 -0.9896992 0.9895842 0.9999099 -0.9897306 0.9895842 0.9999099 -0.9897703 0.9895842 0.9999099 -0.9898206 0.9895842 0.9999099 -0.9898842 0.9895842 0.9999099 -0.9899646 0.9895842 0.9999099 -0.9900664 0.9895842 0.9999099 -0.9901951 0.9895842 0.9999099 -0.990358 0.9895842 0.9999099 -0.9905641 0.9895842 0.9999099 -0.9908248 0.9895842 0.9999099 -0.9911547 0.9895842 0.9999099 -0.991572 0.9895842 0.9999099 -0.9920999 0.9895842 0.9999099 -0.9927678 0.9895842 0.9999099 -0.9936128 0.9895842 0.9999099 -0.9946818 0.9895842 0.9999099 -0.9960342 0.9895842 0.9999099 -0.9977452 0.9895842 0.9999099 -0.9999099 0.9895842 0.9999099 -0.9999288 0.9917515 0.9982146 -0.9999437 0.9934704 0.9975143 -0.989582 0.9895864 0.9999099 -0.989582 0.9895864 0.9999099 -0.989582 0.9895863 0.9999099 -0.989582 0.9895863 0.9999099 -0.989582 0.9895863 0.9999099 -0.9895819 0.9895862 0.9999099 -0.9895819 0.9895862 0.9999099 -0.9895819 0.9895861 0.9999099 -0.9895819 0.9895861 0.9999099 -0.9895818 0.989586 0.9999099 -0.9895818 0.9895859 0.9999099 -0.9895818 0.9895857 0.9999099 -0.9895817 0.9895856 0.9999099 -0.9895817 0.9895854 0.9999099 -0.9895817 0.9895853 0.9999099 -0.9895819 0.9895852 0.9999099 -0.9895821 0.9895851 0.9999099 -0.9895825 0.9895851 0.9999099 -0.9895829 0.9895851 0.9999099 -0.9895835 0.9895851 0.9999099 -0.9895842 0.9895851 0.9999099 -0.9895851 0.9895851 0.9999099 -0.9895863 0.9895851 0.9999099 -0.9895878 0.9895851 0.9999099 -0.9895897 0.9895851 0.9999099 -0.989592 0.9895851 0.9999099 -0.989595 0.9895851 0.9999099 -0.9895988 0.9895851 0.9999099 -0.9896036 0.9895851 0.9999099 -0.9896096 0.9895851 0.9999099 -0.9896173 0.9895851 0.9999099 -0.989627 0.9895851 0.9999099 -0.9896392 0.9895851 0.9999099 -0.9896547 0.9895851 0.9999099 -0.9896744 0.9895851 0.9999099 -0.9896992 0.9895851 0.9999099 -0.9897306 0.9895851 0.9999099 -0.9897703 0.9895851 0.9999099 -0.9898206 0.9895851 0.9999099 -0.9898842 0.9895851 0.9999099 -0.9899646 0.9895851 0.9999099 -0.9900664 0.9895851 0.9999099 -0.9901951 0.9895851 0.9999099 -0.990358 0.9895851 0.9999099 -0.9905641 0.9895851 0.9999099 -0.9908248 0.9895851 0.9999099 -0.9911547 0.9895851 0.9999099 -0.991572 0.9895851 0.9999099 -0.9920999 0.9895851 0.9999099 -0.9927678 0.9895851 0.9999099 -0.9936128 0.9895851 0.9999099 -0.9946818 0.9895851 0.9999099 -0.9960342 0.9895851 0.9999099 -0.9977452 0.9895851 0.9999099 -0.9999099 0.9895851 0.9999099 -0.9999288 0.9917521 0.9982146 -0.9999437 0.9934707 0.9975143 -0.989582 0.9895875 0.9999099 -0.989582 0.9895875 0.9999099 -0.989582 0.9895875 0.9999099 -0.989582 0.9895875 0.9999099 -0.989582 0.9895874 0.9999099 -0.9895819 0.9895874 0.9999099 -0.9895819 0.9895874 0.9999099 -0.9895819 0.9895873 0.9999099 -0.9895819 0.9895872 0.9999099 -0.9895818 0.9895871 0.9999099 -0.9895818 0.989587 0.9999099 -0.9895818 0.9895869 0.9999099 -0.9895817 0.9895868 0.9999099 -0.9895817 0.9895866 0.9999099 -0.9895817 0.9895865 0.9999099 -0.9895819 0.9895864 0.9999099 -0.9895821 0.9895863 0.9999099 -0.9895825 0.9895863 0.9999099 -0.9895829 0.9895863 0.9999099 -0.9895835 0.9895863 0.9999099 -0.9895842 0.9895863 0.9999099 -0.9895851 0.9895863 0.9999099 -0.9895863 0.9895863 0.9999099 -0.9895878 0.9895863 0.9999099 -0.9895897 0.9895863 0.9999099 -0.989592 0.9895863 0.9999099 -0.989595 0.9895863 0.9999099 -0.9895988 0.9895863 0.9999099 -0.9896036 0.9895863 0.9999099 -0.9896096 0.9895863 0.9999099 -0.9896173 0.9895863 0.9999099 -0.989627 0.9895863 0.9999099 -0.9896392 0.9895863 0.9999099 -0.9896547 0.9895863 0.9999099 -0.9896744 0.9895863 0.9999099 -0.9896992 0.9895863 0.9999099 -0.9897306 0.9895863 0.9999099 -0.9897703 0.9895863 0.9999099 -0.9898206 0.9895863 0.9999099 -0.9898842 0.9895863 0.9999099 -0.9899646 0.9895863 0.9999099 -0.9900664 0.9895863 0.9999099 -0.9901951 0.9895863 0.9999099 -0.990358 0.9895863 0.9999099 -0.9905641 0.9895863 0.9999099 -0.9908248 0.9895863 0.9999099 -0.9911547 0.9895863 0.9999099 -0.991572 0.9895863 0.9999099 -0.9920999 0.9895863 0.9999099 -0.9927678 0.9895863 0.9999099 -0.9936128 0.9895863 0.9999099 -0.9946818 0.9895863 0.9999099 -0.9960342 0.9895863 0.9999099 -0.9977452 0.9895863 0.9999099 -0.9999099 0.9895863 0.9999099 -0.9999288 0.9917528 0.9982146 -0.9999437 0.9934712 0.9975143 -0.989582 0.989589 0.9999099 -0.989582 0.989589 0.9999099 -0.989582 0.989589 0.9999099 -0.989582 0.989589 0.9999099 -0.989582 0.9895889 0.9999099 -0.9895819 0.9895889 0.9999099 -0.9895819 0.9895888 0.9999099 -0.9895819 0.9895888 0.9999099 -0.9895819 0.9895887 0.9999099 -0.9895818 0.9895886 0.9999099 -0.9895818 0.9895885 0.9999099 -0.9895818 0.9895884 0.9999099 -0.9895817 0.9895882 0.9999099 -0.9895817 0.9895881 0.9999099 -0.9895817 0.9895879 0.9999099 -0.9895819 0.9895878 0.9999099 -0.9895821 0.9895878 0.9999099 -0.9895825 0.9895878 0.9999099 -0.9895829 0.9895878 0.9999099 -0.9895835 0.9895878 0.9999099 -0.9895842 0.9895878 0.9999099 -0.9895851 0.9895878 0.9999099 -0.9895863 0.9895878 0.9999099 -0.9895878 0.9895878 0.9999099 -0.9895897 0.9895878 0.9999099 -0.989592 0.9895878 0.9999099 -0.989595 0.9895878 0.9999099 -0.9895988 0.9895878 0.9999099 -0.9896036 0.9895878 0.9999099 -0.9896096 0.9895878 0.9999099 -0.9896173 0.9895878 0.9999099 -0.989627 0.9895878 0.9999099 -0.9896392 0.9895878 0.9999099 -0.9896547 0.9895878 0.9999099 -0.9896744 0.9895878 0.9999099 -0.9896992 0.9895878 0.9999099 -0.9897306 0.9895878 0.9999099 -0.9897703 0.9895878 0.9999099 -0.9898206 0.9895878 0.9999099 -0.9898842 0.9895878 0.9999099 -0.9899646 0.9895878 0.9999099 -0.9900664 0.9895878 0.9999099 -0.9901951 0.9895878 0.9999099 -0.990358 0.9895878 0.9999099 -0.9905641 0.9895878 0.9999099 -0.9908248 0.9895878 0.9999099 -0.9911547 0.9895878 0.9999099 -0.991572 0.9895878 0.9999099 -0.9920999 0.9895878 0.9999099 -0.9927678 0.9895878 0.9999099 -0.9936128 0.9895878 0.9999099 -0.9946818 0.9895878 0.9999099 -0.9960342 0.9895878 0.9999099 -0.9977452 0.9895878 0.9999099 -0.9999099 0.9895878 0.9999099 -0.9999288 0.9917537 0.9982146 -0.9999437 0.9934718 0.9975143 -0.989582 0.9895909 0.9999099 -0.989582 0.9895909 0.9999099 -0.989582 0.9895909 0.9999099 -0.989582 0.9895908 0.9999099 -0.989582 0.9895908 0.9999099 -0.9895819 0.9895908 0.9999099 -0.9895819 0.9895907 0.9999099 -0.9895819 0.9895906 0.9999099 -0.9895819 0.9895906 0.9999099 -0.9895818 0.9895905 0.9999099 -0.9895818 0.9895904 0.9999099 -0.9895818 0.9895902 0.9999099 -0.9895817 0.9895901 0.9999099 -0.9895817 0.98959 0.9999099 -0.9895817 0.9895898 0.9999099 -0.9895819 0.9895897 0.9999099 -0.9895821 0.9895897 0.9999099 -0.9895825 0.9895897 0.9999099 -0.9895829 0.9895897 0.9999099 -0.9895835 0.9895897 0.9999099 -0.9895842 0.9895897 0.9999099 -0.9895851 0.9895897 0.9999099 -0.9895863 0.9895897 0.9999099 -0.9895878 0.9895897 0.9999099 -0.9895897 0.9895897 0.9999099 -0.989592 0.9895897 0.9999099 -0.989595 0.9895897 0.9999099 -0.9895988 0.9895897 0.9999099 -0.9896036 0.9895897 0.9999099 -0.9896096 0.9895897 0.9999099 -0.9896173 0.9895897 0.9999099 -0.989627 0.9895897 0.9999099 -0.9896392 0.9895897 0.9999099 -0.9896547 0.9895897 0.9999099 -0.9896744 0.9895897 0.9999099 -0.9896992 0.9895897 0.9999099 -0.9897306 0.9895897 0.9999099 -0.9897703 0.9895897 0.9999099 -0.9898206 0.9895897 0.9999099 -0.9898842 0.9895897 0.9999099 -0.9899646 0.9895897 0.9999099 -0.9900664 0.9895897 0.9999099 -0.9901951 0.9895897 0.9999099 -0.990358 0.9895897 0.9999099 -0.9905641 0.9895897 0.9999099 -0.9908248 0.9895897 0.9999099 -0.9911547 0.9895897 0.9999099 -0.991572 0.9895897 0.9999099 -0.9920999 0.9895897 0.9999099 -0.9927678 0.9895897 0.9999099 -0.9936128 0.9895897 0.9999099 -0.9946818 0.9895897 0.9999099 -0.9960342 0.9895897 0.9999099 -0.9977452 0.9895897 0.9999099 -0.9999099 0.9895897 0.9999099 -0.9999288 0.9917549 0.9982146 -0.9999437 0.9934725 0.9975143 -0.989582 0.9895933 0.9999099 -0.989582 0.9895932 0.9999099 -0.989582 0.9895932 0.9999099 -0.989582 0.9895932 0.9999099 -0.989582 0.9895932 0.9999099 -0.9895819 0.9895931 0.9999099 -0.9895819 0.9895931 0.9999099 -0.9895819 0.989593 0.9999099 -0.9895819 0.9895929 0.9999099 -0.9895818 0.9895928 0.9999099 -0.9895818 0.9895927 0.9999099 -0.9895818 0.9895926 0.9999099 -0.9895817 0.9895925 0.9999099 -0.9895817 0.9895923 0.9999099 -0.9895817 0.9895922 0.9999099 -0.9895819 0.9895921 0.9999099 -0.9895821 0.989592 0.9999099 -0.9895825 0.989592 0.9999099 -0.9895829 0.989592 0.9999099 -0.9895835 0.989592 0.9999099 -0.9895842 0.989592 0.9999099 -0.9895851 0.989592 0.9999099 -0.9895863 0.989592 0.9999099 -0.9895878 0.989592 0.9999099 -0.9895897 0.989592 0.9999099 -0.989592 0.989592 0.9999099 -0.989595 0.989592 0.9999099 -0.9895988 0.989592 0.9999099 -0.9896036 0.989592 0.9999099 -0.9896096 0.989592 0.9999099 -0.9896173 0.989592 0.9999099 -0.989627 0.989592 0.9999099 -0.9896392 0.989592 0.9999099 -0.9896547 0.989592 0.9999099 -0.9896744 0.989592 0.9999099 -0.9896992 0.989592 0.9999099 -0.9897306 0.989592 0.9999099 -0.9897703 0.989592 0.9999099 -0.9898206 0.989592 0.9999099 -0.9898842 0.989592 0.9999099 -0.9899646 0.989592 0.9999099 -0.9900664 0.989592 0.9999099 -0.9901951 0.989592 0.9999099 -0.990358 0.989592 0.9999099 -0.9905641 0.989592 0.9999099 -0.9908248 0.989592 0.9999099 -0.9911547 0.989592 0.9999099 -0.991572 0.989592 0.9999099 -0.9920999 0.989592 0.9999099 -0.9927678 0.989592 0.9999099 -0.9936128 0.989592 0.9999099 -0.9946818 0.989592 0.9999099 -0.9960342 0.989592 0.9999099 -0.9977452 0.989592 0.9999099 -0.9999099 0.989592 0.9999099 -0.9999288 0.9917564 0.9982146 -0.9999437 0.9934734 0.9975143 -0.989582 0.9895962 0.9999099 -0.989582 0.9895962 0.9999099 -0.989582 0.9895962 0.9999099 -0.989582 0.9895962 0.9999099 -0.989582 0.9895961 0.9999099 -0.9895819 0.9895961 0.9999099 -0.9895819 0.9895961 0.9999099 -0.9895819 0.989596 0.9999099 -0.9895819 0.9895959 0.9999099 -0.9895818 0.9895958 0.9999099 -0.9895818 0.9895957 0.9999099 -0.9895818 0.9895956 0.9999099 -0.9895817 0.9895955 0.9999099 -0.9895817 0.9895953 0.9999099 -0.9895817 0.9895952 0.9999099 -0.9895819 0.989595 0.9999099 -0.9895821 0.989595 0.9999099 -0.9895825 0.989595 0.9999099 -0.9895829 0.989595 0.9999099 -0.9895835 0.989595 0.9999099 -0.9895842 0.989595 0.9999099 -0.9895851 0.989595 0.9999099 -0.9895863 0.989595 0.9999099 -0.9895878 0.989595 0.9999099 -0.9895897 0.989595 0.9999099 -0.989592 0.989595 0.9999099 -0.989595 0.989595 0.9999099 -0.9895988 0.989595 0.9999099 -0.9896036 0.989595 0.9999099 -0.9896096 0.989595 0.9999099 -0.9896173 0.989595 0.9999099 -0.989627 0.989595 0.9999099 -0.9896392 0.989595 0.9999099 -0.9896547 0.989595 0.9999099 -0.9896744 0.989595 0.9999099 -0.9896992 0.989595 0.9999099 -0.9897306 0.989595 0.9999099 -0.9897703 0.989595 0.9999099 -0.9898206 0.989595 0.9999099 -0.9898842 0.989595 0.9999099 -0.9899646 0.989595 0.9999099 -0.9900664 0.989595 0.9999099 -0.9901951 0.989595 0.9999099 -0.990358 0.989595 0.9999099 -0.9905641 0.989595 0.9999099 -0.9908248 0.989595 0.9999099 -0.9911547 0.989595 0.9999099 -0.991572 0.989595 0.9999099 -0.9920999 0.989595 0.9999099 -0.9927678 0.989595 0.9999099 -0.9936128 0.989595 0.9999099 -0.9946818 0.989595 0.9999099 -0.9960342 0.989595 0.9999099 -0.9977452 0.989595 0.9999099 -0.9999099 0.989595 0.9999099 -0.9999288 0.9917582 0.9982146 -0.9999437 0.9934746 0.9975143 -0.989582 0.9896 0.9999099 -0.989582 0.9896 0.9999099 -0.989582 0.9896 0.9999099 -0.989582 0.9896 0.9999099 -0.989582 0.9895999 0.9999099 -0.9895819 0.9895999 0.9999099 -0.9895819 0.9895998 0.9999099 -0.9895819 0.9895998 0.9999099 -0.9895819 0.9895997 0.9999099 -0.9895818 0.9895996 0.9999099 -0.9895818 0.9895995 0.9999099 -0.9895818 0.9895994 0.9999099 -0.9895817 0.9895992 0.9999099 -0.9895817 0.9895991 0.9999099 -0.9895817 0.9895989 0.9999099 -0.9895819 0.9895988 0.9999099 -0.9895821 0.9895988 0.9999099 -0.9895825 0.9895988 0.9999099 -0.9895829 0.9895988 0.9999099 -0.9895835 0.9895988 0.9999099 -0.9895842 0.9895988 0.9999099 -0.9895851 0.9895988 0.9999099 -0.9895863 0.9895988 0.9999099 -0.9895878 0.9895988 0.9999099 -0.9895897 0.9895988 0.9999099 -0.989592 0.9895988 0.9999099 -0.989595 0.9895988 0.9999099 -0.9895988 0.9895988 0.9999099 -0.9896036 0.9895988 0.9999099 -0.9896096 0.9895988 0.9999099 -0.9896173 0.9895988 0.9999099 -0.989627 0.9895988 0.9999099 -0.9896392 0.9895988 0.9999099 -0.9896547 0.9895988 0.9999099 -0.9896744 0.9895988 0.9999099 -0.9896992 0.9895988 0.9999099 -0.9897306 0.9895988 0.9999099 -0.9897703 0.9895988 0.9999099 -0.9898206 0.9895988 0.9999099 -0.9898842 0.9895988 0.9999099 -0.9899646 0.9895988 0.9999099 -0.9900664 0.9895988 0.9999099 -0.9901951 0.9895988 0.9999099 -0.990358 0.9895988 0.9999099 -0.9905641 0.9895988 0.9999099 -0.9908248 0.9895988 0.9999099 -0.9911547 0.9895988 0.9999099 -0.991572 0.9895988 0.9999099 -0.9920999 0.9895988 0.9999099 -0.9927678 0.9895988 0.9999099 -0.9936128 0.9895988 0.9999099 -0.9946818 0.9895988 0.9999099 -0.9960342 0.9895988 0.9999099 -0.9977452 0.9895988 0.9999099 -0.9999099 0.9895988 0.9999099 -0.9999288 0.9917606 0.9982146 -0.9999437 0.9934761 0.9975143 -0.989582 0.9896048 0.9999099 -0.989582 0.9896048 0.9999099 -0.989582 0.9896048 0.9999099 -0.989582 0.9896047 0.9999099 -0.989582 0.9896047 0.9999099 -0.9895819 0.9896047 0.9999099 -0.9895819 0.9896046 0.9999099 -0.9895819 0.9896046 0.9999099 -0.9895819 0.9896045 0.9999099 -0.9895818 0.9896044 0.9999099 -0.9895818 0.9896043 0.9999099 -0.9895818 0.9896042 0.9999099 -0.9895817 0.989604 0.9999099 -0.9895817 0.9896039 0.9999099 -0.9895817 0.9896037 0.9999099 -0.9895819 0.9896036 0.9999099 -0.9895821 0.9896036 0.9999099 -0.9895825 0.9896036 0.9999099 -0.9895829 0.9896036 0.9999099 -0.9895835 0.9896036 0.9999099 -0.9895842 0.9896036 0.9999099 -0.9895851 0.9896036 0.9999099 -0.9895863 0.9896036 0.9999099 -0.9895878 0.9896036 0.9999099 -0.9895897 0.9896036 0.9999099 -0.989592 0.9896036 0.9999099 -0.989595 0.9896036 0.9999099 -0.9895988 0.9896036 0.9999099 -0.9896036 0.9896036 0.9999099 -0.9896096 0.9896036 0.9999099 -0.9896173 0.9896036 0.9999099 -0.989627 0.9896036 0.9999099 -0.9896392 0.9896036 0.9999099 -0.9896547 0.9896036 0.9999099 -0.9896744 0.9896036 0.9999099 -0.9896992 0.9896036 0.9999099 -0.9897306 0.9896036 0.9999099 -0.9897703 0.9896036 0.9999099 -0.9898206 0.9896036 0.9999099 -0.9898842 0.9896036 0.9999099 -0.9899646 0.9896036 0.9999099 -0.9900664 0.9896036 0.9999099 -0.9901951 0.9896036 0.9999099 -0.990358 0.9896036 0.9999099 -0.9905641 0.9896036 0.9999099 -0.9908248 0.9896036 0.9999099 -0.9911547 0.9896036 0.9999099 -0.991572 0.9896036 0.9999099 -0.9920999 0.9896036 0.9999099 -0.9927678 0.9896036 0.9999099 -0.9936128 0.9896036 0.9999099 -0.9946818 0.9896036 0.9999099 -0.9960342 0.9896036 0.9999099 -0.9977452 0.9896036 0.9999099 -0.9999099 0.9896036 0.9999099 -0.9999288 0.9917636 0.9982146 -0.9999437 0.9934779 0.9975143 -0.989582 0.9896109 0.9999099 -0.989582 0.9896108 0.9999099 -0.989582 0.9896108 0.9999099 -0.989582 0.9896108 0.9999099 -0.989582 0.9896108 0.9999099 -0.9895819 0.9896107 0.9999099 -0.9895819 0.9896107 0.9999099 -0.9895819 0.9896106 0.9999099 -0.9895819 0.9896105 0.9999099 -0.9895818 0.9896105 0.9999099 -0.9895818 0.9896103 0.9999099 -0.9895818 0.9896102 0.9999099 -0.9895817 0.9896101 0.9999099 -0.9895817 0.9896099 0.9999099 -0.9895817 0.9896098 0.9999099 -0.9895819 0.9896097 0.9999099 -0.9895821 0.9896096 0.9999099 -0.9895825 0.9896096 0.9999099 -0.9895829 0.9896096 0.9999099 -0.9895835 0.9896096 0.9999099 -0.9895842 0.9896096 0.9999099 -0.9895851 0.9896096 0.9999099 -0.9895863 0.9896096 0.9999099 -0.9895878 0.9896096 0.9999099 -0.9895897 0.9896096 0.9999099 -0.989592 0.9896096 0.9999099 -0.989595 0.9896096 0.9999099 -0.9895988 0.9896096 0.9999099 -0.9896036 0.9896096 0.9999099 -0.9896096 0.9896096 0.9999099 -0.9896173 0.9896096 0.9999099 -0.989627 0.9896096 0.9999099 -0.9896392 0.9896096 0.9999099 -0.9896547 0.9896096 0.9999099 -0.9896744 0.9896096 0.9999099 -0.9896992 0.9896096 0.9999099 -0.9897306 0.9896096 0.9999099 -0.9897703 0.9896096 0.9999099 -0.9898206 0.9896096 0.9999099 -0.9898842 0.9896096 0.9999099 -0.9899646 0.9896096 0.9999099 -0.9900664 0.9896096 0.9999099 -0.9901951 0.9896096 0.9999099 -0.990358 0.9896096 0.9999099 -0.9905641 0.9896096 0.9999099 -0.9908248 0.9896096 0.9999099 -0.9911547 0.9896096 0.9999099 -0.991572 0.9896096 0.9999099 -0.9920999 0.9896096 0.9999099 -0.9927678 0.9896096 0.9999099 -0.9936128 0.9896096 0.9999099 -0.9946818 0.9896096 0.9999099 -0.9960342 0.9896096 0.9999099 -0.9977452 0.9896096 0.9999099 -0.9999099 0.9896096 0.9999099 -0.9999288 0.9917674 0.9982146 -0.9999437 0.9934803 0.9975143 -0.989582 0.9896185 0.9999099 -0.989582 0.9896185 0.9999099 -0.989582 0.9896185 0.9999099 -0.989582 0.9896185 0.9999099 -0.989582 0.9896184 0.9999099 -0.9895819 0.9896184 0.9999099 -0.9895819 0.9896183 0.9999099 -0.9895819 0.9896183 0.9999099 -0.9895819 0.9896182 0.9999099 -0.9895818 0.9896181 0.9999099 -0.9895818 0.989618 0.9999099 -0.9895818 0.9896179 0.9999099 -0.9895817 0.9896177 0.9999099 -0.9895817 0.9896176 0.9999099 -0.9895817 0.9896174 0.9999099 -0.9895819 0.9896173 0.9999099 -0.9895821 0.9896173 0.9999099 -0.9895825 0.9896173 0.9999099 -0.9895829 0.9896173 0.9999099 -0.9895835 0.9896173 0.9999099 -0.9895842 0.9896173 0.9999099 -0.9895851 0.9896173 0.9999099 -0.9895863 0.9896173 0.9999099 -0.9895878 0.9896173 0.9999099 -0.9895897 0.9896173 0.9999099 -0.989592 0.9896173 0.9999099 -0.989595 0.9896173 0.9999099 -0.9895988 0.9896173 0.9999099 -0.9896036 0.9896173 0.9999099 -0.9896096 0.9896173 0.9999099 -0.9896173 0.9896173 0.9999099 -0.989627 0.9896173 0.9999099 -0.9896392 0.9896173 0.9999099 -0.9896547 0.9896173 0.9999099 -0.9896744 0.9896173 0.9999099 -0.9896992 0.9896173 0.9999099 -0.9897306 0.9896173 0.9999099 -0.9897703 0.9896173 0.9999099 -0.9898206 0.9896173 0.9999099 -0.9898842 0.9896173 0.9999099 -0.9899646 0.9896173 0.9999099 -0.9900664 0.9896173 0.9999099 -0.9901951 0.9896173 0.9999099 -0.990358 0.9896173 0.9999099 -0.9905641 0.9896173 0.9999099 -0.9908248 0.9896173 0.9999099 -0.9911547 0.9896173 0.9999099 -0.991572 0.9896173 0.9999099 -0.9920999 0.9896173 0.9999099 -0.9927678 0.9896173 0.9999099 -0.9936128 0.9896173 0.9999099 -0.9946818 0.9896173 0.9999099 -0.9960342 0.9896173 0.9999099 -0.9977452 0.9896173 0.9999099 -0.9999099 0.9896173 0.9999099 -0.9999288 0.9917722 0.9982146 -0.9999437 0.9934833 0.9975143 -0.989582 0.9896282 0.9999099 -0.989582 0.9896282 0.9999099 -0.989582 0.9896282 0.9999099 -0.989582 0.9896281 0.9999099 -0.989582 0.9896281 0.9999099 -0.9895819 0.9896281 0.9999099 -0.9895819 0.989628 0.9999099 -0.9895819 0.989628 0.9999099 -0.9895819 0.9896279 0.9999099 -0.9895818 0.9896278 0.9999099 -0.9895818 0.9896277 0.9999099 -0.9895818 0.9896276 0.9999099 -0.9895817 0.9896274 0.9999099 -0.9895817 0.9896273 0.9999099 -0.9895817 0.9896271 0.9999099 -0.9895819 0.989627 0.9999099 -0.9895821 0.989627 0.9999099 -0.9895825 0.989627 0.9999099 -0.9895829 0.989627 0.9999099 -0.9895835 0.989627 0.9999099 -0.9895842 0.989627 0.9999099 -0.9895851 0.989627 0.9999099 -0.9895863 0.989627 0.9999099 -0.9895878 0.989627 0.9999099 -0.9895897 0.989627 0.9999099 -0.989592 0.989627 0.9999099 -0.989595 0.989627 0.9999099 -0.9895988 0.989627 0.9999099 -0.9896036 0.989627 0.9999099 -0.9896096 0.989627 0.9999099 -0.9896173 0.989627 0.9999099 -0.989627 0.989627 0.9999099 -0.9896392 0.989627 0.9999099 -0.9896547 0.989627 0.9999099 -0.9896744 0.989627 0.9999099 -0.9896992 0.989627 0.9999099 -0.9897306 0.989627 0.9999099 -0.9897703 0.989627 0.9999099 -0.9898206 0.989627 0.9999099 -0.9898842 0.989627 0.9999099 -0.9899646 0.989627 0.9999099 -0.9900664 0.989627 0.9999099 -0.9901951 0.989627 0.9999099 -0.990358 0.989627 0.9999099 -0.9905641 0.989627 0.9999099 -0.9908248 0.989627 0.9999099 -0.9911547 0.989627 0.9999099 -0.991572 0.989627 0.9999099 -0.9920999 0.989627 0.9999099 -0.9927678 0.989627 0.9999099 -0.9936128 0.989627 0.9999099 -0.9946818 0.989627 0.9999099 -0.9960342 0.989627 0.9999099 -0.9977452 0.989627 0.9999099 -0.9999099 0.989627 0.9999099 -0.9999288 0.9917782 0.9982146 -0.9999437 0.9934871 0.9975143 -0.989582 0.9896405 0.9999099 -0.989582 0.9896404 0.9999099 -0.989582 0.9896404 0.9999099 -0.989582 0.9896404 0.9999099 -0.989582 0.9896404 0.9999099 -0.9895819 0.9896403 0.9999099 -0.9895819 0.9896403 0.9999099 -0.9895819 0.9896402 0.9999099 -0.9895819 0.9896401 0.9999099 -0.9895818 0.9896401 0.9999099 -0.9895818 0.9896399 0.9999099 -0.9895818 0.9896398 0.9999099 -0.9895817 0.9896397 0.9999099 -0.9895817 0.9896395 0.9999099 -0.9895817 0.9896394 0.9999099 -0.9895819 0.9896393 0.9999099 -0.9895821 0.9896392 0.9999099 -0.9895825 0.9896392 0.9999099 -0.9895829 0.9896392 0.9999099 -0.9895835 0.9896392 0.9999099 -0.9895842 0.9896392 0.9999099 -0.9895851 0.9896392 0.9999099 -0.9895863 0.9896392 0.9999099 -0.9895878 0.9896392 0.9999099 -0.9895897 0.9896392 0.9999099 -0.989592 0.9896392 0.9999099 -0.989595 0.9896392 0.9999099 -0.9895988 0.9896392 0.9999099 -0.9896036 0.9896392 0.9999099 -0.9896096 0.9896392 0.9999099 -0.9896173 0.9896392 0.9999099 -0.989627 0.9896392 0.9999099 -0.9896392 0.9896392 0.9999099 -0.9896547 0.9896392 0.9999099 -0.9896744 0.9896392 0.9999099 -0.9896992 0.9896392 0.9999099 -0.9897306 0.9896392 0.9999099 -0.9897703 0.9896392 0.9999099 -0.9898206 0.9896392 0.9999099 -0.9898842 0.9896392 0.9999099 -0.9899646 0.9896392 0.9999099 -0.9900664 0.9896392 0.9999099 -0.9901951 0.9896392 0.9999099 -0.990358 0.9896392 0.9999099 -0.9905641 0.9896392 0.9999099 -0.9908248 0.9896392 0.9999099 -0.9911547 0.9896392 0.9999099 -0.991572 0.9896392 0.9999099 -0.9920999 0.9896392 0.9999099 -0.9927678 0.9896392 0.9999099 -0.9936128 0.9896392 0.9999099 -0.9946818 0.9896392 0.9999099 -0.9960342 0.9896392 0.9999099 -0.9977452 0.9896392 0.9999099 -0.9999099 0.9896392 0.9999099 -0.9999288 0.9917859 0.9982146 -0.9999437 0.9934919 0.9975143 -0.989582 0.989656 0.9999099 -0.989582 0.9896559 0.9999099 -0.989582 0.9896559 0.9999099 -0.989582 0.9896559 0.9999099 -0.989582 0.9896559 0.9999099 -0.9895819 0.9896558 0.9999099 -0.9895819 0.9896558 0.9999099 -0.9895819 0.9896557 0.9999099 -0.9895819 0.9896557 0.9999099 -0.9895818 0.9896556 0.9999099 -0.9895818 0.9896555 0.9999099 -0.9895818 0.9896553 0.9999099 -0.9895817 0.9896552 0.9999099 -0.9895817 0.989655 0.9999099 -0.9895817 0.9896549 0.9999099 -0.9895819 0.9896548 0.9999099 -0.9895821 0.9896547 0.9999099 -0.9895825 0.9896547 0.9999099 -0.9895829 0.9896547 0.9999099 -0.9895835 0.9896547 0.9999099 -0.9895842 0.9896547 0.9999099 -0.9895851 0.9896547 0.9999099 -0.9895863 0.9896547 0.9999099 -0.9895878 0.9896547 0.9999099 -0.9895897 0.9896547 0.9999099 -0.989592 0.9896547 0.9999099 -0.989595 0.9896547 0.9999099 -0.9895988 0.9896547 0.9999099 -0.9896036 0.9896547 0.9999099 -0.9896096 0.9896547 0.9999099 -0.9896173 0.9896547 0.9999099 -0.989627 0.9896547 0.9999099 -0.9896392 0.9896547 0.9999099 -0.9896547 0.9896547 0.9999099 -0.9896744 0.9896547 0.9999099 -0.9896992 0.9896547 0.9999099 -0.9897306 0.9896547 0.9999099 -0.9897703 0.9896547 0.9999099 -0.9898206 0.9896547 0.9999099 -0.9898842 0.9896547 0.9999099 -0.9899646 0.9896547 0.9999099 -0.9900664 0.9896547 0.9999099 -0.9901951 0.9896547 0.9999099 -0.990358 0.9896547 0.9999099 -0.9905641 0.9896547 0.9999099 -0.9908248 0.9896547 0.9999099 -0.9911547 0.9896547 0.9999099 -0.991572 0.9896547 0.9999099 -0.9920999 0.9896547 0.9999099 -0.9927678 0.9896547 0.9999099 -0.9936128 0.9896547 0.9999099 -0.9946818 0.9896547 0.9999099 -0.9960342 0.9896547 0.9999099 -0.9977452 0.9896547 0.9999099 -0.9999099 0.9896547 0.9999099 -0.9999288 0.9917956 0.9982146 -0.9999437 0.993498 0.9975143 -0.989582 0.9896756 0.9999099 -0.989582 0.9896756 0.9999099 -0.989582 0.9896755 0.9999099 -0.989582 0.9896755 0.9999099 -0.989582 0.9896755 0.9999099 -0.9895819 0.9896755 0.9999099 -0.9895819 0.9896754 0.9999099 -0.9895819 0.9896753 0.9999099 -0.9895819 0.9896753 0.9999099 -0.9895818 0.9896752 0.9999099 -0.9895818 0.9896751 0.9999099 -0.9895818 0.9896749 0.9999099 -0.9895817 0.9896748 0.9999099 -0.9895817 0.9896747 0.9999099 -0.9895817 0.9896745 0.9999099 -0.9895819 0.9896744 0.9999099 -0.9895821 0.9896744 0.9999099 -0.9895825 0.9896744 0.9999099 -0.9895829 0.9896744 0.9999099 -0.9895835 0.9896744 0.9999099 -0.9895842 0.9896744 0.9999099 -0.9895851 0.9896744 0.9999099 -0.9895863 0.9896744 0.9999099 -0.9895878 0.9896744 0.9999099 -0.9895897 0.9896744 0.9999099 -0.989592 0.9896744 0.9999099 -0.989595 0.9896744 0.9999099 -0.9895988 0.9896744 0.9999099 -0.9896036 0.9896744 0.9999099 -0.9896096 0.9896744 0.9999099 -0.9896173 0.9896744 0.9999099 -0.989627 0.9896744 0.9999099 -0.9896392 0.9896744 0.9999099 -0.9896547 0.9896744 0.9999099 -0.9896744 0.9896744 0.9999099 -0.9896992 0.9896744 0.9999099 -0.9897306 0.9896744 0.9999099 -0.9897703 0.9896744 0.9999099 -0.9898206 0.9896744 0.9999099 -0.9898842 0.9896744 0.9999099 -0.9899646 0.9896744 0.9999099 -0.9900664 0.9896744 0.9999099 -0.9901951 0.9896744 0.9999099 -0.990358 0.9896744 0.9999099 -0.9905641 0.9896744 0.9999099 -0.9908248 0.9896744 0.9999099 -0.9911547 0.9896744 0.9999099 -0.991572 0.9896744 0.9999099 -0.9920999 0.9896744 0.9999099 -0.9927678 0.9896744 0.9999099 -0.9936128 0.9896744 0.9999099 -0.9946818 0.9896744 0.9999099 -0.9960342 0.9896744 0.9999099 -0.9977452 0.9896744 0.9999099 -0.9999099 0.9896744 0.9999099 -0.9999288 0.9918079 0.9982146 -0.9999437 0.9935057 0.9975143 -0.989582 0.9897004 0.9999099 -0.989582 0.9897004 0.9999099 -0.989582 0.9897004 0.9999099 -0.989582 0.9897003 0.9999099 -0.989582 0.9897003 0.9999099 -0.9895819 0.9897003 0.9999099 -0.9895819 0.9897002 0.9999099 -0.9895819 0.9897002 0.9999099 -0.9895819 0.9897001 0.9999099 -0.9895818 0.9897 0.9999099 -0.9895818 0.9896999 0.9999099 -0.9895818 0.9896998 0.9999099 -0.9895817 0.9896996 0.9999099 -0.9895817 0.9896995 0.9999099 -0.9895817 0.9896993 0.9999099 -0.9895819 0.9896992 0.9999099 -0.9895821 0.9896992 0.9999099 -0.9895825 0.9896992 0.9999099 -0.9895829 0.9896992 0.9999099 -0.9895835 0.9896992 0.9999099 -0.9895842 0.9896992 0.9999099 -0.9895851 0.9896992 0.9999099 -0.9895863 0.9896992 0.9999099 -0.9895878 0.9896992 0.9999099 -0.9895897 0.9896992 0.9999099 -0.989592 0.9896992 0.9999099 -0.989595 0.9896992 0.9999099 -0.9895988 0.9896992 0.9999099 -0.9896036 0.9896992 0.9999099 -0.9896096 0.9896992 0.9999099 -0.9896173 0.9896992 0.9999099 -0.989627 0.9896992 0.9999099 -0.9896392 0.9896992 0.9999099 -0.9896547 0.9896992 0.9999099 -0.9896744 0.9896992 0.9999099 -0.9896992 0.9896992 0.9999099 -0.9897306 0.9896992 0.9999099 -0.9897703 0.9896992 0.9999099 -0.9898206 0.9896992 0.9999099 -0.9898842 0.9896992 0.9999099 -0.9899646 0.9896992 0.9999099 -0.9900664 0.9896992 0.9999099 -0.9901951 0.9896992 0.9999099 -0.990358 0.9896992 0.9999099 -0.9905641 0.9896992 0.9999099 -0.9908248 0.9896992 0.9999099 -0.9911547 0.9896992 0.9999099 -0.991572 0.9896992 0.9999099 -0.9920999 0.9896992 0.9999099 -0.9927678 0.9896992 0.9999099 -0.9936128 0.9896992 0.9999099 -0.9946818 0.9896992 0.9999099 -0.9960342 0.9896992 0.9999099 -0.9977452 0.9896992 0.9999099 -0.9999099 0.9896992 0.9999099 -0.9999288 0.9918234 0.9982146 -0.9999437 0.9935154 0.9975143 -0.989582 0.9897318 0.9999099 -0.989582 0.9897318 0.9999099 -0.989582 0.9897318 0.9999099 -0.989582 0.9897317 0.9999099 -0.989582 0.9897317 0.9999099 -0.9895819 0.9897317 0.9999099 -0.9895819 0.9897316 0.9999099 -0.9895819 0.9897316 0.9999099 -0.9895819 0.9897315 0.9999099 -0.9895818 0.9897314 0.9999099 -0.9895818 0.9897313 0.9999099 -0.9895818 0.9897312 0.9999099 -0.9895817 0.989731 0.9999099 -0.9895817 0.9897309 0.9999099 -0.9895817 0.9897307 0.9999099 -0.9895819 0.9897306 0.9999099 -0.9895821 0.9897306 0.9999099 -0.9895825 0.9897306 0.9999099 -0.9895829 0.9897306 0.9999099 -0.9895835 0.9897306 0.9999099 -0.9895842 0.9897306 0.9999099 -0.9895851 0.9897306 0.9999099 -0.9895863 0.9897306 0.9999099 -0.9895878 0.9897306 0.9999099 -0.9895897 0.9897306 0.9999099 -0.989592 0.9897306 0.9999099 -0.989595 0.9897306 0.9999099 -0.9895988 0.9897306 0.9999099 -0.9896036 0.9897306 0.9999099 -0.9896096 0.9897306 0.9999099 -0.9896173 0.9897306 0.9999099 -0.989627 0.9897306 0.9999099 -0.9896392 0.9897306 0.9999099 -0.9896547 0.9897306 0.9999099 -0.9896744 0.9897306 0.9999099 -0.9896992 0.9897306 0.9999099 -0.9897306 0.9897306 0.9999099 -0.9897703 0.9897306 0.9999099 -0.9898206 0.9897306 0.9999099 -0.9898842 0.9897306 0.9999099 -0.9899646 0.9897306 0.9999099 -0.9900664 0.9897306 0.9999099 -0.9901951 0.9897306 0.9999099 -0.990358 0.9897306 0.9999099 -0.9905641 0.9897306 0.9999099 -0.9908248 0.9897306 0.9999099 -0.9911547 0.9897306 0.9999099 -0.991572 0.9897306 0.9999099 -0.9920999 0.9897306 0.9999099 -0.9927678 0.9897306 0.9999099 -0.9936128 0.9897306 0.9999099 -0.9946818 0.9897306 0.9999099 -0.9960342 0.9897306 0.9999099 -0.9977452 0.9897306 0.9999099 -0.9999099 0.9897306 0.9999099 -0.9999288 0.9918431 0.9982146 -0.9999437 0.9935277 0.9975143 -0.989582 0.9897715 0.9999099 -0.989582 0.9897715 0.9999099 -0.989582 0.9897715 0.9999099 -0.989582 0.9897715 0.9999099 -0.989582 0.9897714 0.9999099 -0.9895819 0.9897714 0.9999099 -0.9895819 0.9897713 0.9999099 -0.9895819 0.9897713 0.9999099 -0.9895819 0.9897712 0.9999099 -0.9895818 0.9897711 0.9999099 -0.9895818 0.989771 0.9999099 -0.9895818 0.9897709 0.9999099 -0.9895817 0.9897708 0.9999099 -0.9895817 0.9897706 0.9999099 -0.9895817 0.9897705 0.9999099 -0.9895819 0.9897704 0.9999099 -0.9895821 0.9897703 0.9999099 -0.9895825 0.9897703 0.9999099 -0.9895829 0.9897703 0.9999099 -0.9895835 0.9897703 0.9999099 -0.9895842 0.9897703 0.9999099 -0.9895851 0.9897703 0.9999099 -0.9895863 0.9897703 0.9999099 -0.9895878 0.9897703 0.9999099 -0.9895897 0.9897703 0.9999099 -0.989592 0.9897703 0.9999099 -0.989595 0.9897703 0.9999099 -0.9895988 0.9897703 0.9999099 -0.9896036 0.9897703 0.9999099 -0.9896096 0.9897703 0.9999099 -0.9896173 0.9897703 0.9999099 -0.989627 0.9897703 0.9999099 -0.9896392 0.9897703 0.9999099 -0.9896547 0.9897703 0.9999099 -0.9896744 0.9897703 0.9999099 -0.9896992 0.9897703 0.9999099 -0.9897306 0.9897703 0.9999099 -0.9897703 0.9897703 0.9999099 -0.9898206 0.9897703 0.9999099 -0.9898842 0.9897703 0.9999099 -0.9899646 0.9897703 0.9999099 -0.9900664 0.9897703 0.9999099 -0.9901951 0.9897703 0.9999099 -0.990358 0.9897703 0.9999099 -0.9905641 0.9897703 0.9999099 -0.9908248 0.9897703 0.9999099 -0.9911547 0.9897703 0.9999099 -0.991572 0.9897703 0.9999099 -0.9920999 0.9897703 0.9999099 -0.9927678 0.9897703 0.9999099 -0.9936128 0.9897703 0.9999099 -0.9946818 0.9897703 0.9999099 -0.9960342 0.9897703 0.9999099 -0.9977452 0.9897703 0.9999099 -0.9999099 0.9897703 0.9999099 -0.9999288 0.991868 0.9982146 -0.9999437 0.9935432 0.9975143 -0.989582 0.9898218 0.9999099 -0.989582 0.9898218 0.9999099 -0.989582 0.9898217 0.9999099 -0.989582 0.9898217 0.9999099 -0.989582 0.9898217 0.9999099 -0.9895819 0.9898216 0.9999099 -0.9895819 0.9898216 0.9999099 -0.9895819 0.9898215 0.9999099 -0.9895819 0.9898215 0.9999099 -0.9895818 0.9898214 0.9999099 -0.9895818 0.9898213 0.9999099 -0.9895818 0.9898212 0.9999099 -0.9895817 0.989821 0.9999099 -0.9895817 0.9898209 0.9999099 -0.9895817 0.9898207 0.9999099 -0.9895819 0.9898206 0.9999099 -0.9895821 0.9898206 0.9999099 -0.9895825 0.9898206 0.9999099 -0.9895829 0.9898206 0.9999099 -0.9895835 0.9898206 0.9999099 -0.9895842 0.9898206 0.9999099 -0.9895851 0.9898206 0.9999099 -0.9895863 0.9898206 0.9999099 -0.9895878 0.9898206 0.9999099 -0.9895897 0.9898206 0.9999099 -0.989592 0.9898206 0.9999099 -0.989595 0.9898206 0.9999099 -0.9895988 0.9898206 0.9999099 -0.9896036 0.9898206 0.9999099 -0.9896096 0.9898206 0.9999099 -0.9896173 0.9898206 0.9999099 -0.989627 0.9898206 0.9999099 -0.9896392 0.9898206 0.9999099 -0.9896547 0.9898206 0.9999099 -0.9896744 0.9898206 0.9999099 -0.9896992 0.9898206 0.9999099 -0.9897306 0.9898206 0.9999099 -0.9897703 0.9898206 0.9999099 -0.9898206 0.9898206 0.9999099 -0.9898842 0.9898206 0.9999099 -0.9899646 0.9898206 0.9999099 -0.9900664 0.9898206 0.9999099 -0.9901951 0.9898206 0.9999099 -0.990358 0.9898206 0.9999099 -0.9905641 0.9898206 0.9999099 -0.9908248 0.9898206 0.9999099 -0.9911547 0.9898206 0.9999099 -0.991572 0.9898206 0.9999099 -0.9920999 0.9898206 0.9999099 -0.9927678 0.9898206 0.9999099 -0.9936128 0.9898206 0.9999099 -0.9946818 0.9898206 0.9999099 -0.9960342 0.9898206 0.9999099 -0.9977452 0.9898206 0.9999099 -0.9999099 0.9898206 0.9999099 -0.9999288 0.9918994 0.9982146 -0.9999437 0.9935629 0.9975143 -0.989582 0.9898854 0.9999099 -0.989582 0.9898853 0.9999099 -0.989582 0.9898853 0.9999099 -0.989582 0.9898853 0.9999099 -0.989582 0.9898853 0.9999099 -0.9895819 0.9898852 0.9999099 -0.9895819 0.9898852 0.9999099 -0.9895819 0.9898851 0.9999099 -0.9895819 0.989885 0.9999099 -0.9895818 0.989885 0.9999099 -0.9895818 0.9898849 0.9999099 -0.9895818 0.9898847 0.9999099 -0.9895817 0.9898846 0.9999099 -0.9895817 0.9898845 0.9999099 -0.9895817 0.9898843 0.9999099 -0.9895819 0.9898842 0.9999099 -0.9895821 0.9898842 0.9999099 -0.9895825 0.9898842 0.9999099 -0.9895829 0.9898842 0.9999099 -0.9895835 0.9898842 0.9999099 -0.9895842 0.9898842 0.9999099 -0.9895851 0.9898842 0.9999099 -0.9895863 0.9898842 0.9999099 -0.9895878 0.9898842 0.9999099 -0.9895897 0.9898842 0.9999099 -0.989592 0.9898842 0.9999099 -0.989595 0.9898842 0.9999099 -0.9895988 0.9898842 0.9999099 -0.9896036 0.9898842 0.9999099 -0.9896096 0.9898842 0.9999099 -0.9896173 0.9898842 0.9999099 -0.989627 0.9898842 0.9999099 -0.9896392 0.9898842 0.9999099 -0.9896547 0.9898842 0.9999099 -0.9896744 0.9898842 0.9999099 -0.9896992 0.9898842 0.9999099 -0.9897306 0.9898842 0.9999099 -0.9897703 0.9898842 0.9999099 -0.9898206 0.9898842 0.9999099 -0.9898842 0.9898842 0.9999099 -0.9899646 0.9898842 0.9999099 -0.9900664 0.9898842 0.9999099 -0.9901951 0.9898842 0.9999099 -0.990358 0.9898842 0.9999099 -0.9905641 0.9898842 0.9999099 -0.9908248 0.9898842 0.9999099 -0.9911547 0.9898842 0.9999099 -0.991572 0.9898842 0.9999099 -0.9920999 0.9898842 0.9999099 -0.9927678 0.9898842 0.9999099 -0.9936128 0.9898842 0.9999099 -0.9946818 0.9898842 0.9999099 -0.9960342 0.9898842 0.9999099 -0.9977452 0.9898842 0.9999099 -0.9999099 0.9898842 0.9999099 -0.9999288 0.9919392 0.9982146 -0.9999437 0.9935878 0.9975143 -0.989582 0.9899658 0.9999099 -0.989582 0.9899658 0.9999099 -0.989582 0.9899658 0.9999099 -0.989582 0.9899657 0.9999099 -0.989582 0.9899657 0.9999099 -0.9895819 0.9899657 0.9999099 -0.9895819 0.9899656 0.9999099 -0.9895819 0.9899656 0.9999099 -0.9895819 0.9899655 0.9999099 -0.9895818 0.9899654 0.9999099 -0.9895818 0.9899653 0.9999099 -0.9895818 0.9899652 0.9999099 -0.9895817 0.989965 0.9999099 -0.9895817 0.9899649 0.9999099 -0.9895817 0.9899648 0.9999099 -0.9895819 0.9899646 0.9999099 -0.9895821 0.9899646 0.9999099 -0.9895825 0.9899646 0.9999099 -0.9895829 0.9899646 0.9999099 -0.9895835 0.9899646 0.9999099 -0.9895842 0.9899646 0.9999099 -0.9895851 0.9899646 0.9999099 -0.9895863 0.9899646 0.9999099 -0.9895878 0.9899646 0.9999099 -0.9895897 0.9899646 0.9999099 -0.989592 0.9899646 0.9999099 -0.989595 0.9899646 0.9999099 -0.9895988 0.9899646 0.9999099 -0.9896036 0.9899646 0.9999099 -0.9896096 0.9899646 0.9999099 -0.9896173 0.9899646 0.9999099 -0.989627 0.9899646 0.9999099 -0.9896392 0.9899646 0.9999099 -0.9896547 0.9899646 0.9999099 -0.9896744 0.9899646 0.9999099 -0.9896992 0.9899646 0.9999099 -0.9897306 0.9899646 0.9999099 -0.9897703 0.9899646 0.9999099 -0.9898206 0.9899646 0.9999099 -0.9898842 0.9899646 0.9999099 -0.9899646 0.9899646 0.9999099 -0.9900664 0.9899646 0.9999099 -0.9901951 0.9899646 0.9999099 -0.990358 0.9899646 0.9999099 -0.9905641 0.9899646 0.9999099 -0.9908248 0.9899646 0.9999099 -0.9911547 0.9899646 0.9999099 -0.991572 0.9899646 0.9999099 -0.9920999 0.9899646 0.9999099 -0.9927678 0.9899646 0.9999099 -0.9936128 0.9899646 0.9999099 -0.9946818 0.9899646 0.9999099 -0.9960342 0.9899646 0.9999099 -0.9977452 0.9899646 0.9999099 -0.9999099 0.9899646 0.9999099 -0.9999288 0.9919896 0.9982146 -0.9999437 0.9936193 0.9975143 -0.989582 0.9900676 0.9999099 -0.989582 0.9900675 0.9999099 -0.989582 0.9900675 0.9999099 -0.989582 0.9900675 0.9999099 -0.989582 0.9900675 0.9999099 -0.9895819 0.9900674 0.9999099 -0.9895819 0.9900674 0.9999099 -0.9895819 0.9900673 0.9999099 -0.9895819 0.9900672 0.9999099 -0.9895818 0.9900672 0.9999099 -0.9895818 0.9900671 0.9999099 -0.9895818 0.9900669 0.9999099 -0.9895817 0.9900668 0.9999099 -0.9895817 0.9900667 0.9999099 -0.9895817 0.9900665 0.9999099 -0.9895819 0.9900664 0.9999099 -0.9895821 0.9900664 0.9999099 -0.9895825 0.9900664 0.9999099 -0.9895829 0.9900664 0.9999099 -0.9895835 0.9900664 0.9999099 -0.9895842 0.9900664 0.9999099 -0.9895851 0.9900664 0.9999099 -0.9895863 0.9900664 0.9999099 -0.9895878 0.9900664 0.9999099 -0.9895897 0.9900664 0.9999099 -0.989592 0.9900664 0.9999099 -0.989595 0.9900664 0.9999099 -0.9895988 0.9900664 0.9999099 -0.9896036 0.9900664 0.9999099 -0.9896096 0.9900664 0.9999099 -0.9896173 0.9900664 0.9999099 -0.989627 0.9900664 0.9999099 -0.9896392 0.9900664 0.9999099 -0.9896547 0.9900664 0.9999099 -0.9896744 0.9900664 0.9999099 -0.9896992 0.9900664 0.9999099 -0.9897306 0.9900664 0.9999099 -0.9897703 0.9900664 0.9999099 -0.9898206 0.9900664 0.9999099 -0.9898842 0.9900664 0.9999099 -0.9899646 0.9900664 0.9999099 -0.9900664 0.9900664 0.9999099 -0.9901951 0.9900664 0.9999099 -0.990358 0.9900664 0.9999099 -0.9905641 0.9900664 0.9999099 -0.9908248 0.9900664 0.9999099 -0.9911547 0.9900664 0.9999099 -0.991572 0.9900664 0.9999099 -0.9920999 0.9900664 0.9999099 -0.9927678 0.9900664 0.9999099 -0.9936128 0.9900664 0.9999099 -0.9946818 0.9900664 0.9999099 -0.9960342 0.9900664 0.9999099 -0.9977452 0.9900664 0.9999099 -0.9999099 0.9900664 0.9999099 -0.9999288 0.9920533 0.9982146 -0.9999437 0.9936592 0.9975143 -0.989582 0.9901963 0.9999099 -0.989582 0.9901963 0.9999099 -0.989582 0.9901963 0.9999099 -0.989582 0.9901962 0.9999099 -0.989582 0.9901962 0.9999099 -0.9895819 0.9901962 0.9999099 -0.9895819 0.9901961 0.9999099 -0.9895819 0.9901961 0.9999099 -0.9895819 0.990196 0.9999099 -0.9895818 0.9901959 0.9999099 -0.9895818 0.9901958 0.9999099 -0.9895818 0.9901957 0.9999099 -0.9895817 0.9901956 0.9999099 -0.9895817 0.9901954 0.9999099 -0.9895817 0.9901953 0.9999099 -0.9895819 0.9901952 0.9999099 -0.9895821 0.9901951 0.9999099 -0.9895825 0.9901951 0.9999099 -0.9895829 0.9901951 0.9999099 -0.9895835 0.9901951 0.9999099 -0.9895842 0.9901951 0.9999099 -0.9895851 0.9901951 0.9999099 -0.9895863 0.9901951 0.9999099 -0.9895878 0.9901951 0.9999099 -0.9895897 0.9901951 0.9999099 -0.989592 0.9901951 0.9999099 -0.989595 0.9901951 0.9999099 -0.9895988 0.9901951 0.9999099 -0.9896036 0.9901951 0.9999099 -0.9896096 0.9901951 0.9999099 -0.9896173 0.9901951 0.9999099 -0.989627 0.9901951 0.9999099 -0.9896392 0.9901951 0.9999099 -0.9896547 0.9901951 0.9999099 -0.9896744 0.9901951 0.9999099 -0.9896992 0.9901951 0.9999099 -0.9897306 0.9901951 0.9999099 -0.9897703 0.9901951 0.9999099 -0.9898206 0.9901951 0.9999099 -0.9898842 0.9901951 0.9999099 -0.9899646 0.9901951 0.9999099 -0.9900664 0.9901951 0.9999099 -0.9901951 0.9901951 0.9999099 -0.990358 0.9901951 0.9999099 -0.9905641 0.9901951 0.9999099 -0.9908248 0.9901951 0.9999099 -0.9911547 0.9901951 0.9999099 -0.991572 0.9901951 0.9999099 -0.9920999 0.9901951 0.9999099 -0.9927678 0.9901951 0.9999099 -0.9936128 0.9901951 0.9999099 -0.9946818 0.9901951 0.9999099 -0.9960342 0.9901951 0.9999099 -0.9977452 0.9901951 0.9999099 -0.9999099 0.9901951 0.9999099 -0.9999288 0.9921339 0.9982146 -0.9999437 0.9937096 0.9975143 -0.989582 0.9903592 0.9999099 -0.989582 0.9903591 0.9999099 -0.989582 0.9903591 0.9999099 -0.989582 0.9903591 0.9999099 -0.989582 0.9903591 0.9999099 -0.9895819 0.990359 0.9999099 -0.9895819 0.990359 0.9999099 -0.9895819 0.9903589 0.9999099 -0.9895819 0.9903589 0.9999099 -0.9895818 0.9903588 0.9999099 -0.9895818 0.9903587 0.9999099 -0.9895818 0.9903586 0.9999099 -0.9895817 0.9903584 0.9999099 -0.9895817 0.9903583 0.9999099 -0.9895817 0.9903582 0.9999099 -0.9895819 0.9903581 0.9999099 -0.9895821 0.990358 0.9999099 -0.9895825 0.990358 0.9999099 -0.9895829 0.990358 0.9999099 -0.9895835 0.990358 0.9999099 -0.9895842 0.990358 0.9999099 -0.9895851 0.990358 0.9999099 -0.9895863 0.990358 0.9999099 -0.9895878 0.990358 0.9999099 -0.9895897 0.990358 0.9999099 -0.989592 0.990358 0.9999099 -0.989595 0.990358 0.9999099 -0.9895988 0.990358 0.9999099 -0.9896036 0.990358 0.9999099 -0.9896096 0.990358 0.9999099 -0.9896173 0.990358 0.9999099 -0.989627 0.990358 0.9999099 -0.9896392 0.990358 0.9999099 -0.9896547 0.990358 0.9999099 -0.9896744 0.990358 0.9999099 -0.9896992 0.990358 0.9999099 -0.9897306 0.990358 0.9999099 -0.9897703 0.990358 0.9999099 -0.9898206 0.990358 0.9999099 -0.9898842 0.990358 0.9999099 -0.9899646 0.990358 0.9999099 -0.9900664 0.990358 0.9999099 -0.9901951 0.990358 0.9999099 -0.990358 0.990358 0.9999099 -0.9905641 0.990358 0.9999099 -0.9908248 0.990358 0.9999099 -0.9911547 0.990358 0.9999099 -0.991572 0.990358 0.9999099 -0.9920999 0.990358 0.9999099 -0.9927678 0.990358 0.9999099 -0.9936128 0.990358 0.9999099 -0.9946818 0.990358 0.9999099 -0.9960342 0.990358 0.9999099 -0.9977452 0.990358 0.9999099 -0.9999099 0.990358 0.9999099 -0.9999288 0.9922358 0.9982146 -0.9999437 0.9937734 0.9975143 -0.989582 0.9905652 0.9999099 -0.989582 0.9905652 0.9999099 -0.989582 0.9905652 0.9999099 -0.989582 0.9905652 0.9999099 -0.989582 0.9905651 0.9999099 -0.9895819 0.9905651 0.9999099 -0.9895819 0.9905651 0.9999099 -0.9895819 0.990565 0.9999099 -0.9895819 0.9905649 0.9999099 -0.9895818 0.9905648 0.9999099 -0.9895818 0.9905648 0.9999099 -0.9895818 0.9905646 0.9999099 -0.9895817 0.9905645 0.9999099 -0.9895817 0.9905644 0.9999099 -0.9895817 0.9905642 0.9999099 -0.9895819 0.9905641 0.9999099 -0.9895821 0.9905641 0.9999099 -0.9895825 0.9905641 0.9999099 -0.9895829 0.9905641 0.9999099 -0.9895835 0.9905641 0.9999099 -0.9895842 0.9905641 0.9999099 -0.9895851 0.9905641 0.9999099 -0.9895863 0.9905641 0.9999099 -0.9895878 0.9905641 0.9999099 -0.9895897 0.9905641 0.9999099 -0.989592 0.9905641 0.9999099 -0.989595 0.9905641 0.9999099 -0.9895988 0.9905641 0.9999099 -0.9896036 0.9905641 0.9999099 -0.9896096 0.9905641 0.9999099 -0.9896173 0.9905641 0.9999099 -0.989627 0.9905641 0.9999099 -0.9896392 0.9905641 0.9999099 -0.9896547 0.9905641 0.9999099 -0.9896744 0.9905641 0.9999099 -0.9896992 0.9905641 0.9999099 -0.9897306 0.9905641 0.9999099 -0.9897703 0.9905641 0.9999099 -0.9898206 0.9905641 0.9999099 -0.9898842 0.9905641 0.9999099 -0.9899646 0.9905641 0.9999099 -0.9900664 0.9905641 0.9999099 -0.9901951 0.9905641 0.9999099 -0.990358 0.9905641 0.9999099 -0.9905641 0.9905641 0.9999099 -0.9908248 0.9905641 0.9999099 -0.9911547 0.9905641 0.9999099 -0.991572 0.9905641 0.9999099 -0.9920999 0.9905641 0.9999099 -0.9927678 0.9905641 0.9999099 -0.9936128 0.9905641 0.9999099 -0.9946818 0.9905641 0.9999099 -0.9960342 0.9905641 0.9999099 -0.9977452 0.9905641 0.9999099 -0.9999099 0.9905641 0.9999099 -0.9999288 0.9923648 0.9982146 -0.9999437 0.9938541 0.9975143 -0.989582 0.9908259 0.9999099 -0.989582 0.9908259 0.9999099 -0.989582 0.9908259 0.9999099 -0.989582 0.9908259 0.9999099 -0.989582 0.9908258 0.9999099 -0.9895819 0.9908258 0.9999099 -0.9895819 0.9908257 0.9999099 -0.9895819 0.9908257 0.9999099 -0.9895819 0.9908256 0.9999099 -0.9895818 0.9908255 0.9999099 -0.9895818 0.9908255 0.9999099 -0.9895818 0.9908253 0.9999099 -0.9895817 0.9908252 0.9999099 -0.9895817 0.9908251 0.9999099 -0.9895817 0.990825 0.9999099 -0.9895819 0.9908249 0.9999099 -0.9895821 0.9908248 0.9999099 -0.9895825 0.9908248 0.9999099 -0.9895829 0.9908248 0.9999099 -0.9895835 0.9908248 0.9999099 -0.9895842 0.9908248 0.9999099 -0.9895851 0.9908248 0.9999099 -0.9895863 0.9908248 0.9999099 -0.9895878 0.9908248 0.9999099 -0.9895897 0.9908248 0.9999099 -0.989592 0.9908248 0.9999099 -0.989595 0.9908248 0.9999099 -0.9895988 0.9908248 0.9999099 -0.9896036 0.9908248 0.9999099 -0.9896096 0.9908248 0.9999099 -0.9896173 0.9908248 0.9999099 -0.989627 0.9908248 0.9999099 -0.9896392 0.9908248 0.9999099 -0.9896547 0.9908248 0.9999099 -0.9896744 0.9908248 0.9999099 -0.9896992 0.9908248 0.9999099 -0.9897306 0.9908248 0.9999099 -0.9897703 0.9908248 0.9999099 -0.9898206 0.9908248 0.9999099 -0.9898842 0.9908248 0.9999099 -0.9899646 0.9908248 0.9999099 -0.9900664 0.9908248 0.9999099 -0.9901951 0.9908248 0.9999099 -0.990358 0.9908248 0.9999099 -0.9905641 0.9908248 0.9999099 -0.9908248 0.9908248 0.9999099 -0.9911547 0.9908248 0.9999099 -0.991572 0.9908248 0.9999099 -0.9920999 0.9908248 0.9999099 -0.9927678 0.9908248 0.9999099 -0.9936128 0.9908248 0.9999099 -0.9946818 0.9908248 0.9999099 -0.9960342 0.9908248 0.9999099 -0.9977452 0.9908248 0.9999099 -0.9999099 0.9908248 0.9999099 -0.9999288 0.992528 0.9982146 -0.9999437 0.9939562 0.9975143 -0.989582 0.9911557 0.9999099 -0.989582 0.9911557 0.9999099 -0.989582 0.9911557 0.9999099 -0.989582 0.9911557 0.9999099 -0.989582 0.9911556 0.9999099 -0.9895819 0.9911556 0.9999099 -0.9895819 0.9911556 0.9999099 -0.9895819 0.9911555 0.9999099 -0.9895819 0.9911554 0.9999099 -0.9895818 0.9911554 0.9999099 -0.9895818 0.9911553 0.9999099 -0.9895818 0.9911552 0.9999099 -0.9895817 0.991155 0.9999099 -0.9895817 0.9911549 0.9999099 -0.9895817 0.9911548 0.9999099 -0.9895819 0.9911547 0.9999099 -0.9895821 0.9911547 0.9999099 -0.9895825 0.9911547 0.9999099 -0.9895829 0.9911547 0.9999099 -0.9895835 0.9911547 0.9999099 -0.9895842 0.9911547 0.9999099 -0.9895851 0.9911547 0.9999099 -0.9895863 0.9911547 0.9999099 -0.9895878 0.9911547 0.9999099 -0.9895897 0.9911547 0.9999099 -0.989592 0.9911547 0.9999099 -0.989595 0.9911547 0.9999099 -0.9895988 0.9911547 0.9999099 -0.9896036 0.9911547 0.9999099 -0.9896096 0.9911547 0.9999099 -0.9896173 0.9911547 0.9999099 -0.989627 0.9911547 0.9999099 -0.9896392 0.9911547 0.9999099 -0.9896547 0.9911547 0.9999099 -0.9896744 0.9911547 0.9999099 -0.9896992 0.9911547 0.9999099 -0.9897306 0.9911547 0.9999099 -0.9897703 0.9911547 0.9999099 -0.9898206 0.9911547 0.9999099 -0.9898842 0.9911547 0.9999099 -0.9899646 0.9911547 0.9999099 -0.9900664 0.9911547 0.9999099 -0.9901951 0.9911547 0.9999099 -0.990358 0.9911547 0.9999099 -0.9905641 0.9911547 0.9999099 -0.9908248 0.9911547 0.9999099 -0.9911547 0.9911547 0.9999099 -0.991572 0.9911547 0.9999099 -0.9920999 0.9911547 0.9999099 -0.9927678 0.9911547 0.9999099 -0.9936128 0.9911547 0.9999099 -0.9946818 0.9911547 0.9999099 -0.9960342 0.9911547 0.9999099 -0.9977452 0.9911547 0.9999099 -0.9999099 0.9911547 0.9999099 -0.9999288 0.9927345 0.9982146 -0.9999437 0.9940854 0.9975143 -0.989582 0.991573 0.9999099 -0.989582 0.9915729 0.9999099 -0.989582 0.9915729 0.9999099 -0.989582 0.9915729 0.9999099 -0.989582 0.9915729 0.9999099 -0.9895819 0.9915728 0.9999099 -0.9895819 0.9915728 0.9999099 -0.9895819 0.9915728 0.9999099 -0.9895819 0.9915727 0.9999099 -0.9895818 0.9915726 0.9999099 -0.9895818 0.9915725 0.9999099 -0.9895818 0.9915724 0.9999099 -0.9895817 0.9915723 0.9999099 -0.9895817 0.9915722 0.9999099 -0.9895817 0.9915721 0.9999099 -0.9895819 0.991572 0.9999099 -0.9895821 0.991572 0.9999099 -0.9895825 0.991572 0.9999099 -0.9895829 0.991572 0.9999099 -0.9895835 0.991572 0.9999099 -0.9895842 0.991572 0.9999099 -0.9895851 0.991572 0.9999099 -0.9895863 0.991572 0.9999099 -0.9895878 0.991572 0.9999099 -0.9895897 0.991572 0.9999099 -0.989592 0.991572 0.9999099 -0.989595 0.991572 0.9999099 -0.9895988 0.991572 0.9999099 -0.9896036 0.991572 0.9999099 -0.9896096 0.991572 0.9999099 -0.9896173 0.991572 0.9999099 -0.989627 0.991572 0.9999099 -0.9896392 0.991572 0.9999099 -0.9896547 0.991572 0.9999099 -0.9896744 0.991572 0.9999099 -0.9896992 0.991572 0.9999099 -0.9897306 0.991572 0.9999099 -0.9897703 0.991572 0.9999099 -0.9898206 0.991572 0.9999099 -0.9898842 0.991572 0.9999099 -0.9899646 0.991572 0.9999099 -0.9900664 0.991572 0.9999099 -0.9901951 0.991572 0.9999099 -0.990358 0.991572 0.9999099 -0.9905641 0.991572 0.9999099 -0.9908248 0.991572 0.9999099 -0.9911547 0.991572 0.9999099 -0.991572 0.991572 0.9999099 -0.9920999 0.991572 0.9999099 -0.9927678 0.991572 0.9999099 -0.9936128 0.991572 0.9999099 -0.9946818 0.991572 0.9999099 -0.9960342 0.991572 0.9999099 -0.9977452 0.991572 0.9999099 -0.9999099 0.991572 0.9999099 -0.9999288 0.9929957 0.9982146 -0.9999437 0.9942488 0.9975143 -0.989582 0.9921008 0.9999099 -0.989582 0.9921008 0.9999099 -0.989582 0.9921008 0.9999099 -0.989582 0.9921008 0.9999099 -0.989582 0.9921008 0.9999099 -0.9895819 0.9921007 0.9999099 -0.9895819 0.9921007 0.9999099 -0.9895819 0.9921006 0.9999099 -0.9895819 0.9921006 0.9999099 -0.9895818 0.9921005 0.9999099 -0.9895818 0.9921004 0.9999099 -0.9895818 0.9921003 0.9999099 -0.9895817 0.9921002 0.9999099 -0.9895817 0.9921001 0.9999099 -0.9895817 0.9921 0.9999099 -0.9895819 0.9920999 0.9999099 -0.9895821 0.9920999 0.9999099 -0.9895825 0.9920999 0.9999099 -0.9895829 0.9920999 0.9999099 -0.9895835 0.9920999 0.9999099 -0.9895842 0.9920999 0.9999099 -0.9895851 0.9920999 0.9999099 -0.9895863 0.9920999 0.9999099 -0.9895878 0.9920999 0.9999099 -0.9895897 0.9920999 0.9999099 -0.989592 0.9920999 0.9999099 -0.989595 0.9920999 0.9999099 -0.9895988 0.9920999 0.9999099 -0.9896036 0.9920999 0.9999099 -0.9896096 0.9920999 0.9999099 -0.9896173 0.9920999 0.9999099 -0.989627 0.9920999 0.9999099 -0.9896392 0.9920999 0.9999099 -0.9896547 0.9920999 0.9999099 -0.9896744 0.9920999 0.9999099 -0.9896992 0.9920999 0.9999099 -0.9897306 0.9920999 0.9999099 -0.9897703 0.9920999 0.9999099 -0.9898206 0.9920999 0.9999099 -0.9898842 0.9920999 0.9999099 -0.9899646 0.9920999 0.9999099 -0.9900664 0.9920999 0.9999099 -0.9901951 0.9920999 0.9999099 -0.990358 0.9920999 0.9999099 -0.9905641 0.9920999 0.9999099 -0.9908248 0.9920999 0.9999099 -0.9911547 0.9920999 0.9999099 -0.991572 0.9920999 0.9999099 -0.9920999 0.9920999 0.9999099 -0.9927678 0.9920999 0.9999099 -0.9936128 0.9920999 0.9999099 -0.9946818 0.9920999 0.9999099 -0.9960342 0.9920999 0.9999099 -0.9977452 0.9920999 0.9999099 -0.9999099 0.9920999 0.9999099 -0.9999288 0.9933261 0.9982146 -0.9999437 0.9944556 0.9975143 -0.989582 0.9927686 0.9999099 -0.989582 0.9927686 0.9999099 -0.989582 0.9927686 0.9999099 -0.989582 0.9927686 0.9999099 -0.989582 0.9927686 0.9999099 -0.9895819 0.9927686 0.9999099 -0.9895819 0.9927685 0.9999099 -0.9895819 0.9927685 0.9999099 -0.9895819 0.9927684 0.9999099 -0.9895818 0.9927684 0.9999099 -0.9895818 0.9927683 0.9999099 -0.9895818 0.9927682 0.9999099 -0.9895817 0.9927681 0.9999099 -0.9895817 0.992768 0.9999099 -0.9895817 0.9927679 0.9999099 -0.9895819 0.9927678 0.9999099 -0.9895821 0.9927678 0.9999099 -0.9895825 0.9927678 0.9999099 -0.9895829 0.9927678 0.9999099 -0.9895835 0.9927678 0.9999099 -0.9895842 0.9927678 0.9999099 -0.9895851 0.9927678 0.9999099 -0.9895863 0.9927678 0.9999099 -0.9895878 0.9927678 0.9999099 -0.9895897 0.9927678 0.9999099 -0.989592 0.9927678 0.9999099 -0.989595 0.9927678 0.9999099 -0.9895988 0.9927678 0.9999099 -0.9896036 0.9927678 0.9999099 -0.9896096 0.9927678 0.9999099 -0.9896173 0.9927678 0.9999099 -0.989627 0.9927678 0.9999099 -0.9896392 0.9927678 0.9999099 -0.9896547 0.9927678 0.9999099 -0.9896744 0.9927678 0.9999099 -0.9896992 0.9927678 0.9999099 -0.9897306 0.9927678 0.9999099 -0.9897703 0.9927678 0.9999099 -0.9898206 0.9927678 0.9999099 -0.9898842 0.9927678 0.9999099 -0.9899646 0.9927678 0.9999099 -0.9900664 0.9927678 0.9999099 -0.9901951 0.9927678 0.9999099 -0.990358 0.9927678 0.9999099 -0.9905641 0.9927678 0.9999099 -0.9908248 0.9927678 0.9999099 -0.9911547 0.9927678 0.9999099 -0.991572 0.9927678 0.9999099 -0.9920999 0.9927678 0.9999099 -0.9927678 0.9927678 0.9999099 -0.9936128 0.9927678 0.9999099 -0.9946818 0.9927678 0.9999099 -0.9960342 0.9927678 0.9999099 -0.9977452 0.9927678 0.9999099 -0.9999099 0.9927678 0.9999099 -0.9999288 0.9937442 0.9982146 -0.9999437 0.9947172 0.9975143 -0.989582 0.9936135 0.9999099 -0.989582 0.9936135 0.9999099 -0.989582 0.9936135 0.9999099 -0.989582 0.9936135 0.9999099 -0.989582 0.9936135 0.9999099 -0.9895819 0.9936134 0.9999099 -0.9895819 0.9936134 0.9999099 -0.9895819 0.9936134 0.9999099 -0.9895819 0.9936133 0.9999099 -0.9895818 0.9936133 0.9999099 -0.9895818 0.9936132 0.9999099 -0.9895818 0.9936131 0.9999099 -0.9895817 0.993613 0.9999099 -0.9895817 0.993613 0.9999099 -0.9895817 0.9936129 0.9999099 -0.9895819 0.9936128 0.9999099 -0.9895821 0.9936128 0.9999099 -0.9895825 0.9936128 0.9999099 -0.9895829 0.9936128 0.9999099 -0.9895835 0.9936128 0.9999099 -0.9895842 0.9936128 0.9999099 -0.9895851 0.9936128 0.9999099 -0.9895863 0.9936128 0.9999099 -0.9895878 0.9936128 0.9999099 -0.9895897 0.9936128 0.9999099 -0.989592 0.9936128 0.9999099 -0.989595 0.9936128 0.9999099 -0.9895988 0.9936128 0.9999099 -0.9896036 0.9936128 0.9999099 -0.9896096 0.9936128 0.9999099 -0.9896173 0.9936128 0.9999099 -0.989627 0.9936128 0.9999099 -0.9896392 0.9936128 0.9999099 -0.9896547 0.9936128 0.9999099 -0.9896744 0.9936128 0.9999099 -0.9896992 0.9936128 0.9999099 -0.9897306 0.9936128 0.9999099 -0.9897703 0.9936128 0.9999099 -0.9898206 0.9936128 0.9999099 -0.9898842 0.9936128 0.9999099 -0.9899646 0.9936128 0.9999099 -0.9900664 0.9936128 0.9999099 -0.9901951 0.9936128 0.9999099 -0.990358 0.9936128 0.9999099 -0.9905641 0.9936128 0.9999099 -0.9908248 0.9936128 0.9999099 -0.9911547 0.9936128 0.9999099 -0.991572 0.9936128 0.9999099 -0.9920999 0.9936128 0.9999099 -0.9927678 0.9936128 0.9999099 -0.9936128 0.9936128 0.9999099 -0.9946818 0.9936128 0.9999099 -0.9960342 0.9936128 0.9999099 -0.9977452 0.9936128 0.9999099 -0.9999099 0.9936128 0.9999099 -0.9999288 0.9942731 0.9982146 -0.9999437 0.9950481 0.9975143 -0.989582 0.9946824 0.9999099 -0.989582 0.9946824 0.9999099 -0.989582 0.9946824 0.9999099 -0.989582 0.9946824 0.9999099 -0.989582 0.9946824 0.9999099 -0.9895819 0.9946823 0.9999099 -0.9895819 0.9946823 0.9999099 -0.9895819 0.9946823 0.9999099 -0.9895819 0.9946823 0.9999099 -0.9895818 0.9946822 0.9999099 -0.9895818 0.9946822 0.9999099 -0.9895818 0.9946821 0.9999099 -0.9895817 0.994682 0.9999099 -0.9895817 0.9946819 0.9999099 -0.9895817 0.9946819 0.9999099 -0.9895819 0.9946818 0.9999099 -0.9895821 0.9946818 0.9999099 -0.9895825 0.9946818 0.9999099 -0.9895829 0.9946818 0.9999099 -0.9895835 0.9946818 0.9999099 -0.9895842 0.9946818 0.9999099 -0.9895851 0.9946818 0.9999099 -0.9895863 0.9946818 0.9999099 -0.9895878 0.9946818 0.9999099 -0.9895897 0.9946818 0.9999099 -0.989592 0.9946818 0.9999099 -0.989595 0.9946818 0.9999099 -0.9895988 0.9946818 0.9999099 -0.9896036 0.9946818 0.9999099 -0.9896096 0.9946818 0.9999099 -0.9896173 0.9946818 0.9999099 -0.989627 0.9946818 0.9999099 -0.9896392 0.9946818 0.9999099 -0.9896547 0.9946818 0.9999099 -0.9896744 0.9946818 0.9999099 -0.9896992 0.9946818 0.9999099 -0.9897306 0.9946818 0.9999099 -0.9897703 0.9946818 0.9999099 -0.9898206 0.9946818 0.9999099 -0.9898842 0.9946818 0.9999099 -0.9899646 0.9946818 0.9999099 -0.9900664 0.9946818 0.9999099 -0.9901951 0.9946818 0.9999099 -0.990358 0.9946818 0.9999099 -0.9905641 0.9946818 0.9999099 -0.9908248 0.9946818 0.9999099 -0.9911547 0.9946818 0.9999099 -0.991572 0.9946818 0.9999099 -0.9920999 0.9946818 0.9999099 -0.9927678 0.9946818 0.9999099 -0.9936128 0.9946818 0.9999099 -0.9946818 0.9946818 0.9999099 -0.9960342 0.9946818 0.9999099 -0.9977452 0.9946818 0.9999099 -0.9999099 0.9946818 0.9999099 -0.9999288 0.9949422 0.9982146 -0.9999437 0.9954668 0.9975143 -0.989582 0.9960347 0.9999099 -0.989582 0.9960347 0.9999099 -0.989582 0.9960347 0.9999099 -0.989582 0.9960347 0.9999099 -0.989582 0.9960347 0.9999099 -0.9895819 0.9960346 0.9999099 -0.9895819 0.9960346 0.9999099 -0.9895819 0.9960346 0.9999099 -0.9895819 0.9960346 0.9999099 -0.9895818 0.9960345 0.9999099 -0.9895818 0.9960345 0.9999099 -0.9895818 0.9960344 0.9999099 -0.9895817 0.9960344 0.9999099 -0.9895817 0.9960343 0.9999099 -0.9895817 0.9960343 0.9999099 -0.9895819 0.9960342 0.9999099 -0.9895821 0.9960342 0.9999099 -0.9895825 0.9960342 0.9999099 -0.9895829 0.9960342 0.9999099 -0.9895835 0.9960342 0.9999099 -0.9895842 0.9960342 0.9999099 -0.9895851 0.9960342 0.9999099 -0.9895863 0.9960342 0.9999099 -0.9895878 0.9960342 0.9999099 -0.9895897 0.9960342 0.9999099 -0.989592 0.9960342 0.9999099 -0.989595 0.9960342 0.9999099 -0.9895988 0.9960342 0.9999099 -0.9896036 0.9960342 0.9999099 -0.9896096 0.9960342 0.9999099 -0.9896173 0.9960342 0.9999099 -0.989627 0.9960342 0.9999099 -0.9896392 0.9960342 0.9999099 -0.9896547 0.9960342 0.9999099 -0.9896744 0.9960342 0.9999099 -0.9896992 0.9960342 0.9999099 -0.9897306 0.9960342 0.9999099 -0.9897703 0.9960342 0.9999099 -0.9898206 0.9960342 0.9999099 -0.9898842 0.9960342 0.9999099 -0.9899646 0.9960342 0.9999099 -0.9900664 0.9960342 0.9999099 -0.9901951 0.9960342 0.9999099 -0.990358 0.9960342 0.9999099 -0.9905641 0.9960342 0.9999099 -0.9908248 0.9960342 0.9999099 -0.9911547 0.9960342 0.9999099 -0.991572 0.9960342 0.9999099 -0.9920999 0.9960342 0.9999099 -0.9927678 0.9960342 0.9999099 -0.9936128 0.9960342 0.9999099 -0.9946818 0.9960342 0.9999099 -0.9960342 0.9960342 0.9999099 -0.9977452 0.9960342 0.9999099 -0.9999099 0.9960342 0.9999099 -0.9999288 0.9957887 0.9982146 -0.9999437 0.9959964 0.9975143 -0.989582 0.9977455 0.9999099 -0.989582 0.9977455 0.9999099 -0.989582 0.9977455 0.9999099 -0.989582 0.9977455 0.9999099 -0.989582 0.9977455 0.9999099 -0.9895819 0.9977455 0.9999099 -0.9895819 0.9977455 0.9999099 -0.9895819 0.9977454 0.9999099 -0.9895819 0.9977454 0.9999099 -0.9895818 0.9977454 0.9999099 -0.9895818 0.9977454 0.9999099 -0.9895818 0.9977454 0.9999099 -0.9895817 0.9977453 0.9999099 -0.9895817 0.9977453 0.9999099 -0.9895817 0.9977453 0.9999099 -0.9895819 0.9977452 0.9999099 -0.9895821 0.9977452 0.9999099 -0.9895825 0.9977452 0.9999099 -0.9895829 0.9977452 0.9999099 -0.9895835 0.9977452 0.9999099 -0.9895842 0.9977452 0.9999099 -0.9895851 0.9977452 0.9999099 -0.9895863 0.9977452 0.9999099 -0.9895878 0.9977452 0.9999099 -0.9895897 0.9977452 0.9999099 -0.989592 0.9977452 0.9999099 -0.989595 0.9977452 0.9999099 -0.9895988 0.9977452 0.9999099 -0.9896036 0.9977452 0.9999099 -0.9896096 0.9977452 0.9999099 -0.9896173 0.9977452 0.9999099 -0.989627 0.9977452 0.9999099 -0.9896392 0.9977452 0.9999099 -0.9896547 0.9977452 0.9999099 -0.9896744 0.9977452 0.9999099 -0.9896992 0.9977452 0.9999099 -0.9897306 0.9977452 0.9999099 -0.9897703 0.9977452 0.9999099 -0.9898206 0.9977452 0.9999099 -0.9898842 0.9977452 0.9999099 -0.9899646 0.9977452 0.9999099 -0.9900664 0.9977452 0.9999099 -0.9901951 0.9977452 0.9999099 -0.990358 0.9977452 0.9999099 -0.9905641 0.9977452 0.9999099 -0.9908248 0.9977452 0.9999099 -0.9911547 0.9977452 0.9999099 -0.991572 0.9977452 0.9999099 -0.9920999 0.9977452 0.9999099 -0.9927678 0.9977452 0.9999099 -0.9936128 0.9977452 0.9999099 -0.9946818 0.9977452 0.9999099 -0.9960342 0.9977452 0.9999099 -0.9977452 0.9977452 0.9999099 -0.9999099 0.9977452 0.9999099 -0.9999288 0.9968597 0.9982146 -0.9999437 0.9966665 0.9975143 -0.989582 0.9999099 0.9999099 -0.989582 0.9999099 0.9999099 -0.989582 0.9999099 0.9999099 -0.989582 0.9999099 0.9999099 -0.989582 0.9999099 0.9999099 -0.9895819 0.9999099 0.9999099 -0.9895819 0.9999099 0.9999099 -0.9895819 0.9999099 0.9999099 -0.9895819 0.9999099 0.9999099 -0.9895818 0.9999099 0.9999099 -0.9895818 0.9999099 0.9999099 -0.9895818 0.9999099 0.9999099 -0.9895817 0.9999099 0.9999099 -0.9895817 0.9999099 0.9999099 -0.9895817 0.9999099 0.9999099 -0.9895819 0.9999099 0.9999099 -0.9895821 0.9999099 0.9999099 -0.9895825 0.9999099 0.9999099 -0.9895829 0.9999099 0.9999099 -0.9895835 0.9999099 0.9999099 -0.9895842 0.9999099 0.9999099 -0.9895851 0.9999099 0.9999099 -0.9895863 0.9999099 0.9999099 -0.9895878 0.9999099 0.9999099 -0.9895897 0.9999099 0.9999099 -0.989592 0.9999099 0.9999099 -0.989595 0.9999099 0.9999099 -0.9895988 0.9999099 0.9999099 -0.9896036 0.9999099 0.9999099 -0.9896096 0.9999099 0.9999099 -0.9896173 0.9999099 0.9999099 -0.989627 0.9999099 0.9999099 -0.9896392 0.9999099 0.9999099 -0.9896547 0.9999099 0.9999099 -0.9896744 0.9999099 0.9999099 -0.9896992 0.9999099 0.9999099 -0.9897306 0.9999099 0.9999099 -0.9897703 0.9999099 0.9999099 -0.9898206 0.9999099 0.9999099 -0.9898842 0.9999099 0.9999099 -0.9899646 0.9999099 0.9999099 -0.9900664 0.9999099 0.9999099 -0.9901951 0.9999099 0.9999099 -0.990358 0.9999099 0.9999099 -0.9905641 0.9999099 0.9999099 -0.9908248 0.9999099 0.9999099 -0.9911547 0.9999099 0.9999099 -0.991572 0.9999099 0.9999099 -0.9920999 0.9999099 0.9999099 -0.9927678 0.9999099 0.9999099 -0.9936128 0.9999099 0.9999099 -0.9946818 0.9999099 0.9999099 -0.9960342 0.9999099 0.9999099 -0.9977452 0.9999099 0.9999099 -0.9999099 0.9999099 0.9999099 -0.9999288 0.9982146 0.9982146 -0.9999437 0.9975143 0.9975143 -0.9917501 0.9999288 0.9982148 -0.9917501 0.9999288 0.9982148 -0.9917501 0.9999288 0.9982148 -0.9917501 0.9999288 0.9982148 -0.9917501 0.9999288 0.9982148 -0.9917501 0.9999288 0.9982148 -0.99175 0.9999288 0.9982148 -0.99175 0.9999288 0.9982148 -0.99175 0.9999288 0.9982148 -0.99175 0.9999288 0.9982147 -0.99175 0.9999288 0.9982147 -0.9917499 0.9999288 0.9982147 -0.9917499 0.9999288 0.9982147 -0.9917499 0.9999288 0.9982147 -0.9917499 0.9999288 0.9982147 -0.99175 0.9999288 0.9982146 -0.9917502 0.9999288 0.9982146 -0.9917504 0.9999288 0.9982146 -0.9917507 0.9999288 0.9982146 -0.991751 0.9999288 0.9982146 -0.9917515 0.9999288 0.9982146 -0.9917521 0.9999288 0.9982146 -0.9917528 0.9999288 0.9982146 -0.9917537 0.9999288 0.9982146 -0.9917549 0.9999288 0.9982146 -0.9917564 0.9999288 0.9982146 -0.9917582 0.9999288 0.9982146 -0.9917606 0.9999288 0.9982146 -0.9917636 0.9999288 0.9982146 -0.9917674 0.9999288 0.9982146 -0.9917722 0.9999288 0.9982146 -0.9917782 0.9999288 0.9982146 -0.9917859 0.9999288 0.9982146 -0.9917956 0.9999288 0.9982146 -0.9918079 0.9999288 0.9982146 -0.9918234 0.9999288 0.9982146 -0.9918431 0.9999288 0.9982146 -0.991868 0.9999288 0.9982146 -0.9918994 0.9999288 0.9982146 -0.9919392 0.9999288 0.9982146 -0.9919896 0.9999288 0.9982146 -0.9920533 0.9999288 0.9982146 -0.9921339 0.9999288 0.9982146 -0.9922358 0.9999288 0.9982146 -0.9923648 0.9999288 0.9982146 -0.992528 0.9999288 0.9982146 -0.9927345 0.9999288 0.9982146 -0.9929957 0.9999288 0.9982146 -0.9933261 0.9999288 0.9982146 -0.9937442 0.9999288 0.9982146 -0.9942731 0.9999288 0.9982146 -0.9949422 0.9999288 0.9982146 -0.9957887 0.9999288 0.9982146 -0.9968597 0.9999288 0.9982146 -0.9982146 0.9999288 0.9982146 -0.9999288 0.9999288 0.9982146 -0.9999437 0.9985868 0.9975143 -0.9934695 0.9999437 0.9975145 -0.9934695 0.9999437 0.9975145 -0.9934695 0.9999437 0.9975145 -0.9934695 0.9999437 0.9975145 -0.9934695 0.9999437 0.9975145 -0.9934695 0.9999437 0.9975145 -0.9934695 0.9999437 0.9975145 -0.9934694 0.9999437 0.9975144 -0.9934694 0.9999437 0.9975144 -0.9934694 0.9999437 0.9975144 -0.9934694 0.9999437 0.9975144 -0.9934694 0.9999437 0.9975144 -0.9934694 0.9999437 0.9975144 -0.9934694 0.9999437 0.9975143 -0.9934694 0.9999437 0.9975143 -0.9934694 0.9999437 0.9975143 -0.9934695 0.9999437 0.9975143 -0.9934697 0.9999437 0.9975143 -0.9934698 0.9999437 0.9975143 -0.9934701 0.9999437 0.9975143 -0.9934704 0.9999437 0.9975143 -0.9934707 0.9999437 0.9975143 -0.9934712 0.9999437 0.9975143 -0.9934718 0.9999437 0.9975143 -0.9934725 0.9999437 0.9975143 -0.9934734 0.9999437 0.9975143 -0.9934746 0.9999437 0.9975143 -0.9934761 0.9999437 0.9975143 -0.9934779 0.9999437 0.9975143 -0.9934803 0.9999437 0.9975143 -0.9934833 0.9999437 0.9975143 -0.9934871 0.9999437 0.9975143 -0.9934919 0.9999437 0.9975143 -0.993498 0.9999437 0.9975143 -0.9935057 0.9999437 0.9975143 -0.9935154 0.9999437 0.9975143 -0.9935277 0.9999437 0.9975143 -0.9935432 0.9999437 0.9975143 -0.9935629 0.9999437 0.9975143 -0.9935878 0.9999437 0.9975143 -0.9936193 0.9999437 0.9975143 -0.9936592 0.9999437 0.9975143 -0.9937096 0.9999437 0.9975143 -0.9937734 0.9999437 0.9975143 -0.9938541 0.9999437 0.9975143 -0.9939562 0.9999437 0.9975143 -0.9940854 0.9999437 0.9975143 -0.9942488 0.9999437 0.9975143 -0.9944556 0.9999437 0.9975143 -0.9947172 0.9999437 0.9975143 -0.9950481 0.9999437 0.9975143 -0.9954668 0.9999437 0.9975143 -0.9959964 0.9999437 0.9975143 -0.9966665 0.9999437 0.9975143 -0.9975143 0.9999437 0.9975143 -0.9985868 0.9999437 0.9975143 -0.9999437 0.9999437 0.9975143 -0.9917501 0.9917501 0.9999288 -0.9917501 0.9917501 0.9999288 -0.9917501 0.9917501 0.9999288 -0.9917501 0.9917501 0.9999288 -0.9917501 0.9917501 0.9999288 -0.9917501 0.9917501 0.9999288 -0.9917502 0.9917501 0.9999288 -0.9917502 0.9917501 0.9999288 -0.9917502 0.9917501 0.9999288 -0.9917502 0.9917501 0.9999288 -0.9917503 0.9917501 0.9999288 -0.9917503 0.9917501 0.9999288 -0.9917504 0.9917501 0.9999288 -0.9917505 0.9917501 0.9999288 -0.9917506 0.9917501 0.9999288 -0.9917507 0.9917501 0.9999288 -0.9917509 0.9917501 0.9999288 -0.9917511 0.9917501 0.9999288 -0.9917514 0.9917501 0.9999288 -0.9917518 0.9917501 0.9999288 -0.9917523 0.9917501 0.9999288 -0.9917528 0.9917501 0.9999288 -0.9917536 0.9917501 0.9999288 -0.9917545 0.9917501 0.9999288 -0.9917557 0.9917501 0.9999288 -0.9917571 0.9917501 0.9999288 -0.991759 0.9917501 0.9999288 -0.9917614 0.9917501 0.9999288 -0.9917644 0.9917501 0.9999288 -0.9917682 0.9917501 0.9999288 -0.9917729 0.9917501 0.9999288 -0.991779 0.9917501 0.9999288 -0.9917867 0.9917501 0.9999288 -0.9917964 0.9917501 0.9999288 -0.9918087 0.9917501 0.9999288 -0.9918242 0.9917501 0.9999288 -0.9918439 0.9917501 0.9999288 -0.9918687 0.9917501 0.9999288 -0.9919002 0.9917501 0.9999288 -0.99194 0.9917501 0.9999288 -0.9919903 0.9917501 0.9999288 -0.992054 0.9917501 0.9999288 -0.9921346 0.9917501 0.9999288 -0.9922366 0.9917501 0.9999288 -0.9923655 0.9917501 0.9999288 -0.9925287 0.9917501 0.9999288 -0.9927351 0.9917501 0.9999288 -0.9929963 0.9917501 0.9999288 -0.9933267 0.9917501 0.9999288 -0.9937448 0.9917501 0.9999288 -0.9942736 0.9917501 0.9999288 -0.9949427 0.9917501 0.9999288 -0.9957891 0.9917501 0.9999288 -0.99686 0.9917501 0.9999288 -0.9982148 0.9917501 0.9999288 -0.9999288 0.9917501 0.9999288 -0.9999437 0.9934695 0.9985869 -0.9917501 0.9917501 0.9999288 -0.9917501 0.9917501 0.9999288 -0.9917501 0.9917501 0.9999288 -0.9917501 0.9917501 0.9999288 -0.9917501 0.9917501 0.9999288 -0.9917501 0.9917501 0.9999288 -0.9917501 0.9917501 0.9999288 -0.9917502 0.9917501 0.9999288 -0.9917502 0.9917501 0.9999288 -0.9917502 0.9917501 0.9999288 -0.9917503 0.9917501 0.9999288 -0.9917503 0.9917501 0.9999288 -0.9917504 0.9917501 0.9999288 -0.9917505 0.9917501 0.9999288 -0.9917506 0.9917501 0.9999288 -0.9917507 0.9917501 0.9999288 -0.9917509 0.9917501 0.9999288 -0.9917511 0.9917501 0.9999288 -0.9917514 0.9917501 0.9999288 -0.9917518 0.9917501 0.9999288 -0.9917522 0.9917501 0.9999288 -0.9917528 0.9917501 0.9999288 -0.9917535 0.9917501 0.9999288 -0.9917545 0.9917501 0.9999288 -0.9917556 0.9917501 0.9999288 -0.9917571 0.9917501 0.9999288 -0.991759 0.9917501 0.9999288 -0.9917614 0.9917501 0.9999288 -0.9917644 0.9917501 0.9999288 -0.9917681 0.9917501 0.9999288 -0.9917729 0.9917501 0.9999288 -0.991779 0.9917501 0.9999288 -0.9917867 0.9917501 0.9999288 -0.9917964 0.9917501 0.9999288 -0.9918087 0.9917501 0.9999288 -0.9918242 0.9917501 0.9999288 -0.9918438 0.9917501 0.9999288 -0.9918687 0.9917501 0.9999288 -0.9919002 0.9917501 0.9999288 -0.99194 0.9917501 0.9999288 -0.9919903 0.9917501 0.9999288 -0.992054 0.9917501 0.9999288 -0.9921346 0.9917501 0.9999288 -0.9922365 0.9917501 0.9999288 -0.9923655 0.9917501 0.9999288 -0.9925287 0.9917501 0.9999288 -0.9927351 0.9917501 0.9999288 -0.9929963 0.9917501 0.9999288 -0.9933267 0.9917501 0.9999288 -0.9937448 0.9917501 0.9999288 -0.9942736 0.9917501 0.9999288 -0.9949427 0.9917501 0.9999288 -0.9957891 0.9917501 0.9999288 -0.99686 0.9917501 0.9999288 -0.9982148 0.9917501 0.9999288 -0.9999288 0.9917501 0.9999288 -0.9999437 0.9934695 0.9985869 -0.9917501 0.9917501 0.9999288 -0.9917501 0.9917501 0.9999288 -0.9917501 0.9917501 0.9999288 -0.9917501 0.9917501 0.9999288 -0.9917501 0.9917501 0.9999288 -0.9917501 0.9917501 0.9999288 -0.9917501 0.9917501 0.9999288 -0.9917502 0.9917501 0.9999288 -0.9917502 0.9917501 0.9999288 -0.9917502 0.9917501 0.9999288 -0.9917503 0.9917501 0.9999288 -0.9917503 0.9917501 0.9999288 -0.9917504 0.9917501 0.9999288 -0.9917505 0.9917501 0.9999288 -0.9917506 0.9917501 0.9999288 -0.9917507 0.9917501 0.9999288 -0.9917509 0.9917501 0.9999288 -0.9917511 0.9917501 0.9999288 -0.9917514 0.9917501 0.9999288 -0.9917518 0.9917501 0.9999288 -0.9917522 0.9917501 0.9999288 -0.9917528 0.9917501 0.9999288 -0.9917535 0.9917501 0.9999288 -0.9917545 0.9917501 0.9999288 -0.9917556 0.9917501 0.9999288 -0.9917571 0.9917501 0.9999288 -0.991759 0.9917501 0.9999288 -0.9917613 0.9917501 0.9999288 -0.9917643 0.9917501 0.9999288 -0.9917681 0.9917501 0.9999288 -0.9917729 0.9917501 0.9999288 -0.991779 0.9917501 0.9999288 -0.9917867 0.9917501 0.9999288 -0.9917964 0.9917501 0.9999288 -0.9918086 0.9917501 0.9999288 -0.9918242 0.9917501 0.9999288 -0.9918438 0.9917501 0.9999288 -0.9918687 0.9917501 0.9999288 -0.9919002 0.9917501 0.9999288 -0.99194 0.9917501 0.9999288 -0.9919903 0.9917501 0.9999288 -0.992054 0.9917501 0.9999288 -0.9921346 0.9917501 0.9999288 -0.9922365 0.9917501 0.9999288 -0.9923655 0.9917501 0.9999288 -0.9925287 0.9917501 0.9999288 -0.9927351 0.9917501 0.9999288 -0.9929963 0.9917501 0.9999288 -0.9933267 0.9917501 0.9999288 -0.9937447 0.9917501 0.9999288 -0.9942736 0.9917501 0.9999288 -0.9949427 0.9917501 0.9999288 -0.9957891 0.9917501 0.9999288 -0.99686 0.9917501 0.9999288 -0.9982148 0.9917501 0.9999288 -0.9999288 0.9917501 0.9999288 -0.9999437 0.9934695 0.9985869 -0.9917501 0.9917501 0.9999288 -0.9917501 0.9917501 0.9999288 -0.9917501 0.9917501 0.9999288 -0.9917501 0.9917501 0.9999288 -0.9917501 0.9917501 0.9999288 -0.9917501 0.9917501 0.9999288 -0.9917501 0.9917501 0.9999288 -0.9917501 0.9917501 0.9999288 -0.9917502 0.9917501 0.9999288 -0.9917502 0.9917501 0.9999288 -0.9917502 0.9917501 0.9999288 -0.9917503 0.9917501 0.9999288 -0.9917504 0.9917501 0.9999288 -0.9917505 0.9917501 0.9999288 -0.9917506 0.9917501 0.9999288 -0.9917507 0.9917501 0.9999288 -0.9917509 0.9917501 0.9999288 -0.9917511 0.9917501 0.9999288 -0.9917514 0.9917501 0.9999288 -0.9917518 0.9917501 0.9999288 -0.9917522 0.9917501 0.9999288 -0.9917528 0.9917501 0.9999288 -0.9917535 0.9917501 0.9999288 -0.9917544 0.9917501 0.9999288 -0.9917556 0.9917501 0.9999288 -0.9917571 0.9917501 0.9999288 -0.991759 0.9917501 0.9999288 -0.9917613 0.9917501 0.9999288 -0.9917643 0.9917501 0.9999288 -0.9917681 0.9917501 0.9999288 -0.9917729 0.9917501 0.9999288 -0.991779 0.9917501 0.9999288 -0.9917866 0.9917501 0.9999288 -0.9917963 0.9917501 0.9999288 -0.9918086 0.9917501 0.9999288 -0.9918242 0.9917501 0.9999288 -0.9918438 0.9917501 0.9999288 -0.9918687 0.9917501 0.9999288 -0.9919001 0.9917501 0.9999288 -0.9919399 0.9917501 0.9999288 -0.9919903 0.9917501 0.9999288 -0.992054 0.9917501 0.9999288 -0.9921346 0.9917501 0.9999288 -0.9922365 0.9917501 0.9999288 -0.9923655 0.9917501 0.9999288 -0.9925287 0.9917501 0.9999288 -0.9927351 0.9917501 0.9999288 -0.9929963 0.9917501 0.9999288 -0.9933267 0.9917501 0.9999288 -0.9937447 0.9917501 0.9999288 -0.9942736 0.9917501 0.9999288 -0.9949426 0.9917501 0.9999288 -0.9957891 0.9917501 0.9999288 -0.99686 0.9917501 0.9999288 -0.9982148 0.9917501 0.9999288 -0.9999288 0.9917501 0.9999288 -0.9999437 0.9934695 0.9985869 -0.9917501 0.9917501 0.9999288 -0.9917501 0.9917501 0.9999288 -0.9917501 0.9917501 0.9999288 -0.9917501 0.9917501 0.9999288 -0.9917501 0.9917501 0.9999288 -0.9917501 0.9917501 0.9999288 -0.9917501 0.9917501 0.9999288 -0.9917501 0.9917501 0.9999288 -0.9917501 0.9917501 0.9999288 -0.9917502 0.9917501 0.9999288 -0.9917502 0.9917501 0.9999288 -0.9917503 0.9917501 0.9999288 -0.9917503 0.9917501 0.9999288 -0.9917504 0.9917501 0.9999288 -0.9917505 0.9917501 0.9999288 -0.9917507 0.9917501 0.9999288 -0.9917509 0.9917501 0.9999288 -0.9917511 0.9917501 0.9999288 -0.9917514 0.9917501 0.9999288 -0.9917517 0.9917501 0.9999288 -0.9917522 0.9917501 0.9999288 -0.9917528 0.9917501 0.9999288 -0.9917535 0.9917501 0.9999288 -0.9917544 0.9917501 0.9999288 -0.9917556 0.9917501 0.9999288 -0.9917571 0.9917501 0.9999288 -0.9917589 0.9917501 0.9999288 -0.9917613 0.9917501 0.9999288 -0.9917643 0.9917501 0.9999288 -0.9917681 0.9917501 0.9999288 -0.9917729 0.9917501 0.9999288 -0.991779 0.9917501 0.9999288 -0.9917866 0.9917501 0.9999288 -0.9917963 0.9917501 0.9999288 -0.9918086 0.9917501 0.9999288 -0.9918241 0.9917501 0.9999288 -0.9918438 0.9917501 0.9999288 -0.9918687 0.9917501 0.9999288 -0.9919001 0.9917501 0.9999288 -0.9919399 0.9917501 0.9999288 -0.9919903 0.9917501 0.9999288 -0.992054 0.9917501 0.9999288 -0.9921345 0.9917501 0.9999288 -0.9922365 0.9917501 0.9999288 -0.9923655 0.9917501 0.9999288 -0.9925287 0.9917501 0.9999288 -0.9927351 0.9917501 0.9999288 -0.9929963 0.9917501 0.9999288 -0.9933267 0.9917501 0.9999288 -0.9937447 0.9917501 0.9999288 -0.9942736 0.9917501 0.9999288 -0.9949426 0.9917501 0.9999288 -0.9957891 0.9917501 0.9999288 -0.99686 0.9917501 0.9999288 -0.9982148 0.9917501 0.9999288 -0.9999288 0.9917501 0.9999288 -0.9999437 0.9934695 0.9985869 -0.9917501 0.9917501 0.9999288 -0.9917501 0.9917501 0.9999288 -0.9917501 0.9917501 0.9999288 -0.9917501 0.9917501 0.9999288 -0.9917501 0.9917501 0.9999288 -0.9917501 0.9917501 0.9999288 -0.9917501 0.9917501 0.9999288 -0.9917501 0.9917501 0.9999288 -0.9917501 0.9917501 0.9999288 -0.9917502 0.9917501 0.9999288 -0.9917502 0.9917501 0.9999288 -0.9917503 0.9917501 0.9999288 -0.9917503 0.9917501 0.9999288 -0.9917504 0.9917501 0.9999288 -0.9917505 0.9917501 0.9999288 -0.9917507 0.9917501 0.9999288 -0.9917508 0.9917501 0.9999288 -0.9917511 0.9917501 0.9999288 -0.9917514 0.9917501 0.9999288 -0.9917517 0.9917501 0.9999288 -0.9917522 0.9917501 0.9999288 -0.9917527 0.9917501 0.9999288 -0.9917535 0.9917501 0.9999288 -0.9917544 0.9917501 0.9999288 -0.9917556 0.9917501 0.9999288 -0.991757 0.9917501 0.9999288 -0.9917589 0.9917501 0.9999288 -0.9917613 0.9917501 0.9999288 -0.9917643 0.9917501 0.9999288 -0.9917681 0.9917501 0.9999288 -0.9917729 0.9917501 0.9999288 -0.9917789 0.9917501 0.9999288 -0.9917866 0.9917501 0.9999288 -0.9917963 0.9917501 0.9999288 -0.9918086 0.9917501 0.9999288 -0.9918241 0.9917501 0.9999288 -0.9918438 0.9917501 0.9999288 -0.9918686 0.9917501 0.9999288 -0.9919001 0.9917501 0.9999288 -0.9919399 0.9917501 0.9999288 -0.9919902 0.9917501 0.9999288 -0.9920539 0.9917501 0.9999288 -0.9921345 0.9917501 0.9999288 -0.9922365 0.9917501 0.9999288 -0.9923655 0.9917501 0.9999288 -0.9925286 0.9917501 0.9999288 -0.9927351 0.9917501 0.9999288 -0.9929962 0.9917501 0.9999288 -0.9933267 0.9917501 0.9999288 -0.9937447 0.9917501 0.9999288 -0.9942736 0.9917501 0.9999288 -0.9949426 0.9917501 0.9999288 -0.9957891 0.9917501 0.9999288 -0.99686 0.9917501 0.9999288 -0.9982148 0.9917501 0.9999288 -0.9999288 0.9917501 0.9999288 -0.9999437 0.9934695 0.9985869 -0.9917501 0.9917502 0.9999288 -0.9917501 0.9917501 0.9999288 -0.9917501 0.9917501 0.9999288 -0.9917501 0.9917501 0.9999288 -0.9917501 0.9917501 0.9999288 -0.9917501 0.9917501 0.9999288 -0.99175 0.99175 0.9999288 -0.9917501 0.99175 0.9999288 -0.9917501 0.99175 0.9999288 -0.9917501 0.99175 0.9999288 -0.9917502 0.99175 0.9999288 -0.9917502 0.99175 0.9999288 -0.9917503 0.99175 0.9999288 -0.9917504 0.99175 0.9999288 -0.9917505 0.99175 0.9999288 -0.9917506 0.99175 0.9999288 -0.9917508 0.99175 0.9999288 -0.991751 0.99175 0.9999288 -0.9917513 0.99175 0.9999288 -0.9917517 0.99175 0.9999288 -0.9917521 0.99175 0.9999288 -0.9917527 0.99175 0.9999288 -0.9917534 0.99175 0.9999288 -0.9917544 0.99175 0.9999288 -0.9917555 0.99175 0.9999288 -0.991757 0.99175 0.9999288 -0.9917589 0.99175 0.9999288 -0.9917613 0.99175 0.9999288 -0.9917642 0.99175 0.9999288 -0.991768 0.99175 0.9999288 -0.9917728 0.99175 0.9999288 -0.9917789 0.99175 0.9999288 -0.9917866 0.99175 0.9999288 -0.9917963 0.99175 0.9999288 -0.9918086 0.99175 0.9999288 -0.9918241 0.99175 0.9999288 -0.9918437 0.99175 0.9999288 -0.9918686 0.99175 0.9999288 -0.9919001 0.99175 0.9999288 -0.9919399 0.99175 0.9999288 -0.9919902 0.99175 0.9999288 -0.9920539 0.99175 0.9999288 -0.9921345 0.99175 0.9999288 -0.9922364 0.99175 0.9999288 -0.9923654 0.99175 0.9999288 -0.9925286 0.99175 0.9999288 -0.992735 0.99175 0.9999288 -0.9929962 0.99175 0.9999288 -0.9933266 0.99175 0.9999288 -0.9937447 0.99175 0.9999288 -0.9942735 0.99175 0.9999288 -0.9949426 0.99175 0.9999288 -0.9957891 0.99175 0.9999288 -0.99686 0.99175 0.9999288 -0.9982148 0.99175 0.9999288 -0.9999288 0.99175 0.9999288 -0.9999437 0.9934695 0.9985869 -0.9917501 0.9917502 0.9999288 -0.9917501 0.9917502 0.9999288 -0.9917501 0.9917502 0.9999288 -0.9917501 0.9917501 0.9999288 -0.9917501 0.9917501 0.9999288 -0.9917501 0.9917501 0.9999288 -0.99175 0.9917501 0.9999288 -0.99175 0.99175 0.9999288 -0.9917501 0.99175 0.9999288 -0.9917501 0.99175 0.9999288 -0.9917501 0.99175 0.9999288 -0.9917502 0.99175 0.9999288 -0.9917503 0.99175 0.9999288 -0.9917503 0.99175 0.9999288 -0.9917505 0.99175 0.9999288 -0.9917506 0.99175 0.9999288 -0.9917508 0.99175 0.9999288 -0.991751 0.99175 0.9999288 -0.9917513 0.99175 0.9999288 -0.9917516 0.99175 0.9999288 -0.9917521 0.99175 0.9999288 -0.9917527 0.99175 0.9999288 -0.9917534 0.99175 0.9999288 -0.9917543 0.99175 0.9999288 -0.9917555 0.99175 0.9999288 -0.991757 0.99175 0.9999288 -0.9917588 0.99175 0.9999288 -0.9917612 0.99175 0.9999288 -0.9917642 0.99175 0.9999288 -0.991768 0.99175 0.9999288 -0.9917728 0.99175 0.9999288 -0.9917789 0.99175 0.9999288 -0.9917865 0.99175 0.9999288 -0.9917962 0.99175 0.9999288 -0.9918085 0.99175 0.9999288 -0.9918241 0.99175 0.9999288 -0.9918437 0.99175 0.9999288 -0.9918686 0.99175 0.9999288 -0.9919 0.99175 0.9999288 -0.9919398 0.99175 0.9999288 -0.9919902 0.99175 0.9999288 -0.9920539 0.99175 0.9999288 -0.9921345 0.99175 0.9999288 -0.9922364 0.99175 0.9999288 -0.9923654 0.99175 0.9999288 -0.9925286 0.99175 0.9999288 -0.992735 0.99175 0.9999288 -0.9929962 0.99175 0.9999288 -0.9933266 0.99175 0.9999288 -0.9937446 0.99175 0.9999288 -0.9942735 0.99175 0.9999288 -0.9949426 0.99175 0.9999288 -0.9957891 0.99175 0.9999288 -0.9968599 0.99175 0.9999288 -0.9982148 0.99175 0.9999288 -0.9999288 0.99175 0.9999288 -0.9999437 0.9934694 0.9985869 -0.9917501 0.9917502 0.9999288 -0.9917501 0.9917502 0.9999288 -0.9917501 0.9917502 0.9999288 -0.9917501 0.9917502 0.9999288 -0.9917501 0.9917501 0.9999288 -0.9917501 0.9917501 0.9999288 -0.99175 0.9917501 0.9999288 -0.99175 0.9917501 0.9999288 -0.99175 0.99175 0.9999288 -0.99175 0.99175 0.9999288 -0.9917501 0.99175 0.9999288 -0.9917501 0.99175 0.9999288 -0.9917502 0.99175 0.9999288 -0.9917503 0.99175 0.9999288 -0.9917504 0.99175 0.9999288 -0.9917505 0.99175 0.9999288 -0.9917507 0.99175 0.9999288 -0.991751 0.99175 0.9999288 -0.9917512 0.99175 0.9999288 -0.9917516 0.99175 0.9999288 -0.9917521 0.99175 0.9999288 -0.9917526 0.99175 0.9999288 -0.9917534 0.99175 0.9999288 -0.9917543 0.99175 0.9999288 -0.9917555 0.99175 0.9999288 -0.9917569 0.99175 0.9999288 -0.9917588 0.99175 0.9999288 -0.9917612 0.99175 0.9999288 -0.9917642 0.99175 0.9999288 -0.991768 0.99175 0.9999288 -0.9917727 0.99175 0.9999288 -0.9917788 0.99175 0.9999288 -0.9917865 0.99175 0.9999288 -0.9917962 0.99175 0.9999288 -0.9918085 0.99175 0.9999288 -0.991824 0.99175 0.9999288 -0.9918437 0.99175 0.9999288 -0.9918685 0.99175 0.9999288 -0.9919 0.99175 0.9999288 -0.9919398 0.99175 0.9999288 -0.9919901 0.99175 0.9999288 -0.9920538 0.99175 0.9999288 -0.9921344 0.99175 0.9999288 -0.9922364 0.99175 0.9999288 -0.9923653 0.99175 0.9999288 -0.9925285 0.99175 0.9999288 -0.992735 0.99175 0.9999288 -0.9929962 0.99175 0.9999288 -0.9933266 0.99175 0.9999288 -0.9937446 0.99175 0.9999288 -0.9942735 0.99175 0.9999288 -0.9949426 0.99175 0.9999288 -0.995789 0.99175 0.9999288 -0.9968599 0.99175 0.9999288 -0.9982148 0.99175 0.9999288 -0.9999288 0.99175 0.9999288 -0.9999437 0.9934694 0.9985869 -0.9917501 0.9917502 0.9999288 -0.9917501 0.9917502 0.9999288 -0.9917501 0.9917502 0.9999288 -0.9917501 0.9917502 0.9999288 -0.9917501 0.9917502 0.9999288 -0.9917501 0.9917502 0.9999288 -0.99175 0.9917501 0.9999288 -0.99175 0.9917501 0.9999288 -0.99175 0.99175 0.9999288 -0.99175 0.99175 0.9999288 -0.99175 0.99175 0.9999288 -0.9917501 0.99175 0.9999288 -0.9917502 0.99175 0.9999288 -0.9917502 0.99175 0.9999288 -0.9917503 0.99175 0.9999288 -0.9917505 0.99175 0.9999288 -0.9917507 0.99175 0.9999288 -0.9917509 0.99175 0.9999288 -0.9917512 0.99175 0.9999288 -0.9917515 0.99175 0.9999288 -0.991752 0.99175 0.9999288 -0.9917526 0.99175 0.9999288 -0.9917533 0.99175 0.9999288 -0.9917542 0.99175 0.9999288 -0.9917554 0.99175 0.9999288 -0.9917569 0.99175 0.9999288 -0.9917587 0.99175 0.9999288 -0.9917611 0.99175 0.9999288 -0.9917641 0.99175 0.9999288 -0.9917679 0.99175 0.9999288 -0.9917727 0.99175 0.9999288 -0.9917788 0.99175 0.9999288 -0.9917864 0.99175 0.9999288 -0.9917961 0.99175 0.9999288 -0.9918084 0.99175 0.9999288 -0.9918239 0.99175 0.9999288 -0.9918436 0.99175 0.9999288 -0.9918685 0.99175 0.9999288 -0.9918999 0.99175 0.9999288 -0.9919397 0.99175 0.9999288 -0.9919901 0.99175 0.9999288 -0.9920538 0.99175 0.9999288 -0.9921344 0.99175 0.9999288 -0.9922363 0.99175 0.9999288 -0.9923653 0.99175 0.9999288 -0.9925285 0.99175 0.9999288 -0.9927349 0.99175 0.9999288 -0.9929961 0.99175 0.9999288 -0.9933265 0.99175 0.9999288 -0.9937446 0.99175 0.9999288 -0.9942734 0.99175 0.9999288 -0.9949425 0.99175 0.9999288 -0.995789 0.99175 0.9999288 -0.9968599 0.99175 0.9999288 -0.9982147 0.99175 0.9999288 -0.9999288 0.99175 0.9999288 -0.9999437 0.9934694 0.9985869 -0.9917501 0.9917503 0.9999288 -0.9917501 0.9917503 0.9999288 -0.9917501 0.9917503 0.9999288 -0.9917501 0.9917502 0.9999288 -0.9917501 0.9917502 0.9999288 -0.9917501 0.9917502 0.9999288 -0.99175 0.9917502 0.9999288 -0.99175 0.9917501 0.9999288 -0.99175 0.9917501 0.9999288 -0.99175 0.99175 0.9999288 -0.99175 0.99175 0.9999288 -0.99175 0.99175 0.9999288 -0.9917501 0.99175 0.9999288 -0.9917502 0.99175 0.9999288 -0.9917503 0.99175 0.9999288 -0.9917504 0.99175 0.9999288 -0.9917506 0.99175 0.9999288 -0.9917508 0.99175 0.9999288 -0.9917511 0.99175 0.9999288 -0.9917515 0.99175 0.9999288 -0.9917519 0.99175 0.9999288 -0.9917525 0.99175 0.9999288 -0.9917532 0.99175 0.9999288 -0.9917542 0.99175 0.9999288 -0.9917553 0.99175 0.9999288 -0.9917568 0.99175 0.9999288 -0.9917587 0.99175 0.9999288 -0.991761 0.99175 0.9999288 -0.991764 0.99175 0.9999288 -0.9917678 0.99175 0.9999288 -0.9917726 0.99175 0.9999288 -0.9917787 0.99175 0.9999288 -0.9917864 0.99175 0.9999288 -0.9917961 0.99175 0.9999288 -0.9918083 0.99175 0.9999288 -0.9918239 0.99175 0.9999288 -0.9918435 0.99175 0.9999288 -0.9918684 0.99175 0.9999288 -0.9918999 0.99175 0.9999288 -0.9919397 0.99175 0.9999288 -0.99199 0.99175 0.9999288 -0.9920537 0.99175 0.9999288 -0.9921343 0.99175 0.9999288 -0.9922362 0.99175 0.9999288 -0.9923652 0.99175 0.9999288 -0.9925284 0.99175 0.9999288 -0.9927349 0.99175 0.9999288 -0.992996 0.99175 0.9999288 -0.9933265 0.99175 0.9999288 -0.9937445 0.99175 0.9999288 -0.9942734 0.99175 0.9999288 -0.9949425 0.99175 0.9999288 -0.995789 0.99175 0.9999288 -0.9968599 0.99175 0.9999288 -0.9982147 0.99175 0.9999288 -0.9999288 0.99175 0.9999288 -0.9999437 0.9934694 0.9985869 -0.9917501 0.9917503 0.9999288 -0.9917501 0.9917503 0.9999288 -0.9917501 0.9917503 0.9999288 -0.9917501 0.9917503 0.9999288 -0.9917501 0.9917503 0.9999288 -0.9917501 0.9917503 0.9999288 -0.99175 0.9917502 0.9999288 -0.99175 0.9917502 0.9999288 -0.99175 0.9917501 0.9999288 -0.99175 0.9917501 0.9999288 -0.99175 0.99175 0.9999288 -0.9917499 0.9917499 0.9999288 -0.99175 0.9917499 0.9999288 -0.9917501 0.9917499 0.9999288 -0.9917502 0.9917499 0.9999288 -0.9917503 0.9917499 0.9999288 -0.9917505 0.9917499 0.9999288 -0.9917507 0.9917499 0.9999288 -0.991751 0.9917499 0.9999288 -0.9917514 0.9917499 0.9999288 -0.9917519 0.9917499 0.9999288 -0.9917524 0.9917499 0.9999288 -0.9917532 0.9917499 0.9999288 -0.9917541 0.9917499 0.9999288 -0.9917553 0.9917499 0.9999288 -0.9917567 0.9917499 0.9999288 -0.9917586 0.9917499 0.9999288 -0.991761 0.9917499 0.9999288 -0.991764 0.9917499 0.9999288 -0.9917678 0.9917499 0.9999288 -0.9917725 0.9917499 0.9999288 -0.9917786 0.9917499 0.9999288 -0.9917863 0.9917499 0.9999288 -0.991796 0.9917499 0.9999288 -0.9918083 0.9917499 0.9999288 -0.9918238 0.9917499 0.9999288 -0.9918435 0.9917499 0.9999288 -0.9918683 0.9917499 0.9999288 -0.9918998 0.9917499 0.9999288 -0.9919396 0.9917499 0.9999288 -0.9919899 0.9917499 0.9999288 -0.9920536 0.9917499 0.9999288 -0.9921342 0.9917499 0.9999288 -0.9922362 0.9917499 0.9999288 -0.9923652 0.9917499 0.9999288 -0.9925283 0.9917499 0.9999288 -0.9927348 0.9917499 0.9999288 -0.992996 0.9917499 0.9999288 -0.9933264 0.9917499 0.9999288 -0.9937445 0.9917499 0.9999288 -0.9942733 0.9917499 0.9999288 -0.9949424 0.9917499 0.9999288 -0.9957889 0.9917499 0.9999288 -0.9968599 0.9917499 0.9999288 -0.9982147 0.9917499 0.9999288 -0.9999288 0.9917499 0.9999288 -0.9999437 0.9934694 0.9985869 -0.9917501 0.9917504 0.9999288 -0.9917501 0.9917504 0.9999288 -0.9917501 0.9917504 0.9999288 -0.9917501 0.9917504 0.9999288 -0.9917501 0.9917503 0.9999288 -0.9917501 0.9917503 0.9999288 -0.99175 0.9917503 0.9999288 -0.99175 0.9917503 0.9999288 -0.99175 0.9917502 0.9999288 -0.99175 0.9917502 0.9999288 -0.99175 0.9917501 0.9999288 -0.9917499 0.99175 0.9999288 -0.9917499 0.9917499 0.9999288 -0.99175 0.9917499 0.9999288 -0.9917501 0.9917499 0.9999288 -0.9917503 0.9917499 0.9999288 -0.9917504 0.9917499 0.9999288 -0.9917507 0.9917499 0.9999288 -0.9917509 0.9917499 0.9999288 -0.9917513 0.9917499 0.9999288 -0.9917518 0.9917499 0.9999288 -0.9917523 0.9917499 0.9999288 -0.9917531 0.9917499 0.9999288 -0.991754 0.9917499 0.9999288 -0.9917552 0.9917499 0.9999288 -0.9917566 0.9917499 0.9999288 -0.9917585 0.9917499 0.9999288 -0.9917609 0.9917499 0.9999288 -0.9917639 0.9917499 0.9999288 -0.9917677 0.9917499 0.9999288 -0.9917725 0.9917499 0.9999288 -0.9917785 0.9917499 0.9999288 -0.9917862 0.9917499 0.9999288 -0.9917959 0.9917499 0.9999288 -0.9918082 0.9917499 0.9999288 -0.9918237 0.9917499 0.9999288 -0.9918434 0.9917499 0.9999288 -0.9918682 0.9917499 0.9999288 -0.9918997 0.9917499 0.9999288 -0.9919395 0.9917499 0.9999288 -0.9919898 0.9917499 0.9999288 -0.9920535 0.9917499 0.9999288 -0.9921341 0.9917499 0.9999288 -0.9922361 0.9917499 0.9999288 -0.9923651 0.9917499 0.9999288 -0.9925283 0.9917499 0.9999288 -0.9927347 0.9917499 0.9999288 -0.9929959 0.9917499 0.9999288 -0.9933263 0.9917499 0.9999288 -0.9937444 0.9917499 0.9999288 -0.9942733 0.9917499 0.9999288 -0.9949424 0.9917499 0.9999288 -0.9957889 0.9917499 0.9999288 -0.9968598 0.9917499 0.9999288 -0.9982147 0.9917499 0.9999288 -0.9999288 0.9917499 0.9999288 -0.9999437 0.9934694 0.9985869 -0.9917501 0.9917505 0.9999288 -0.9917501 0.9917505 0.9999288 -0.9917501 0.9917505 0.9999288 -0.9917501 0.9917505 0.9999288 -0.9917501 0.9917504 0.9999288 -0.9917501 0.9917504 0.9999288 -0.99175 0.9917504 0.9999288 -0.99175 0.9917503 0.9999288 -0.99175 0.9917503 0.9999288 -0.99175 0.9917502 0.9999288 -0.99175 0.9917502 0.9999288 -0.9917499 0.9917501 0.9999288 -0.9917499 0.99175 0.9999288 -0.9917499 0.9917499 0.9999288 -0.99175 0.9917499 0.9999288 -0.9917502 0.9917499 0.9999288 -0.9917503 0.9917499 0.9999288 -0.9917506 0.9917499 0.9999288 -0.9917509 0.9917499 0.9999288 -0.9917512 0.9917499 0.9999288 -0.9917517 0.9917499 0.9999288 -0.9917522 0.9917499 0.9999288 -0.991753 0.9917499 0.9999288 -0.9917539 0.9917499 0.9999288 -0.9917551 0.9917499 0.9999288 -0.9917565 0.9917499 0.9999288 -0.9917584 0.9917499 0.9999288 -0.9917608 0.9917499 0.9999288 -0.9917638 0.9917499 0.9999288 -0.9917676 0.9917499 0.9999288 -0.9917724 0.9917499 0.9999288 -0.9917784 0.9917499 0.9999288 -0.9917861 0.9917499 0.9999288 -0.9917958 0.9917499 0.9999288 -0.9918081 0.9917499 0.9999288 -0.9918236 0.9917499 0.9999288 -0.9918433 0.9917499 0.9999288 -0.9918681 0.9917499 0.9999288 -0.9918996 0.9917499 0.9999288 -0.9919394 0.9917499 0.9999288 -0.9919898 0.9917499 0.9999288 -0.9920535 0.9917499 0.9999288 -0.992134 0.9917499 0.9999288 -0.992236 0.9917499 0.9999288 -0.992365 0.9917499 0.9999288 -0.9925282 0.9917499 0.9999288 -0.9927346 0.9917499 0.9999288 -0.9929958 0.9917499 0.9999288 -0.9933263 0.9917499 0.9999288 -0.9937443 0.9917499 0.9999288 -0.9942732 0.9917499 0.9999288 -0.9949423 0.9917499 0.9999288 -0.9957888 0.9917499 0.9999288 -0.9968598 0.9917499 0.9999288 -0.9982147 0.9917499 0.9999288 -0.9999288 0.9917499 0.9999288 -0.9999437 0.9934694 0.9985869 -0.9917501 0.9917506 0.9999288 -0.9917501 0.9917506 0.9999288 -0.9917501 0.9917506 0.9999288 -0.9917501 0.9917506 0.9999288 -0.9917501 0.9917505 0.9999288 -0.9917501 0.9917505 0.9999288 -0.99175 0.9917505 0.9999288 -0.99175 0.9917505 0.9999288 -0.99175 0.9917504 0.9999288 -0.99175 0.9917503 0.9999288 -0.99175 0.9917503 0.9999288 -0.9917499 0.9917502 0.9999288 -0.9917499 0.9917501 0.9999288 -0.9917499 0.99175 0.9999288 -0.9917499 0.9917499 0.9999288 -0.9917501 0.9917499 0.9999288 -0.9917502 0.9917499 0.9999288 -0.9917505 0.9917499 0.9999288 -0.9917508 0.9917499 0.9999288 -0.9917511 0.9917499 0.9999288 -0.9917516 0.9917499 0.9999288 -0.9917522 0.9917499 0.9999288 -0.9917529 0.9917499 0.9999288 -0.9917538 0.9917499 0.9999288 -0.991755 0.9917499 0.9999288 -0.9917565 0.9917499 0.9999288 -0.9917583 0.9917499 0.9999288 -0.9917607 0.9917499 0.9999288 -0.9917637 0.9917499 0.9999288 -0.9917675 0.9917499 0.9999288 -0.9917723 0.9917499 0.9999288 -0.9917783 0.9917499 0.9999288 -0.991786 0.9917499 0.9999288 -0.9917957 0.9917499 0.9999288 -0.991808 0.9917499 0.9999288 -0.9918235 0.9917499 0.9999288 -0.9918432 0.9917499 0.9999288 -0.9918681 0.9917499 0.9999288 -0.9918995 0.9917499 0.9999288 -0.9919393 0.9917499 0.9999288 -0.9919897 0.9917499 0.9999288 -0.9920534 0.9917499 0.9999288 -0.992134 0.9917499 0.9999288 -0.9922359 0.9917499 0.9999288 -0.9923649 0.9917499 0.9999288 -0.9925281 0.9917499 0.9999288 -0.9927346 0.9917499 0.9999288 -0.9929957 0.9917499 0.9999288 -0.9933262 0.9917499 0.9999288 -0.9937442 0.9917499 0.9999288 -0.9942731 0.9917499 0.9999288 -0.9949423 0.9917499 0.9999288 -0.9957888 0.9917499 0.9999288 -0.9968597 0.9917499 0.9999288 -0.9982147 0.9917499 0.9999288 -0.9999288 0.9917499 0.9999288 -0.9999437 0.9934694 0.9985868 -0.9917501 0.9917507 0.9999288 -0.9917501 0.9917507 0.9999288 -0.9917501 0.9917507 0.9999288 -0.9917501 0.9917507 0.9999288 -0.9917501 0.9917507 0.9999288 -0.9917501 0.9917507 0.9999288 -0.99175 0.9917506 0.9999288 -0.99175 0.9917506 0.9999288 -0.99175 0.9917505 0.9999288 -0.99175 0.9917505 0.9999288 -0.99175 0.9917504 0.9999288 -0.9917499 0.9917503 0.9999288 -0.9917499 0.9917503 0.9999288 -0.9917499 0.9917502 0.9999288 -0.9917499 0.9917501 0.9999288 -0.99175 0.99175 0.9999288 -0.9917502 0.99175 0.9999288 -0.9917504 0.99175 0.9999288 -0.9917507 0.99175 0.9999288 -0.991751 0.99175 0.9999288 -0.9917515 0.99175 0.9999288 -0.9917521 0.99175 0.9999288 -0.9917528 0.99175 0.9999288 -0.9917537 0.99175 0.9999288 -0.9917549 0.99175 0.9999288 -0.9917564 0.99175 0.9999288 -0.9917583 0.99175 0.9999288 -0.9917606 0.99175 0.9999288 -0.9917636 0.99175 0.9999288 -0.9917674 0.99175 0.9999288 -0.9917722 0.99175 0.9999288 -0.9917783 0.99175 0.9999288 -0.9917859 0.99175 0.9999288 -0.9917956 0.99175 0.9999288 -0.9918079 0.99175 0.9999288 -0.9918235 0.99175 0.9999288 -0.9918431 0.99175 0.9999288 -0.991868 0.99175 0.9999288 -0.9918994 0.99175 0.9999288 -0.9919392 0.99175 0.9999288 -0.9919896 0.99175 0.9999288 -0.9920533 0.99175 0.9999288 -0.9921339 0.99175 0.9999288 -0.9922358 0.99175 0.9999288 -0.9923648 0.99175 0.9999288 -0.992528 0.99175 0.9999288 -0.9927345 0.99175 0.9999288 -0.9929957 0.99175 0.9999288 -0.9933261 0.99175 0.9999288 -0.9937442 0.99175 0.9999288 -0.9942731 0.99175 0.9999288 -0.9949422 0.99175 0.9999288 -0.9957887 0.99175 0.9999288 -0.9968597 0.99175 0.9999288 -0.9982146 0.99175 0.9999288 -0.9999288 0.99175 0.9999288 -0.9999437 0.9934694 0.9985868 -0.9917501 0.9917509 0.9999288 -0.9917501 0.9917509 0.9999288 -0.9917501 0.9917509 0.9999288 -0.9917501 0.9917509 0.9999288 -0.9917501 0.9917509 0.9999288 -0.9917501 0.9917508 0.9999288 -0.99175 0.9917508 0.9999288 -0.99175 0.9917508 0.9999288 -0.99175 0.9917507 0.9999288 -0.99175 0.9917507 0.9999288 -0.99175 0.9917506 0.9999288 -0.9917499 0.9917505 0.9999288 -0.9917499 0.9917504 0.9999288 -0.9917499 0.9917503 0.9999288 -0.9917499 0.9917502 0.9999288 -0.99175 0.9917502 0.9999288 -0.9917502 0.9917502 0.9999288 -0.9917504 0.9917502 0.9999288 -0.9917507 0.9917502 0.9999288 -0.991751 0.9917502 0.9999288 -0.9917515 0.9917502 0.9999288 -0.9917521 0.9917502 0.9999288 -0.9917528 0.9917502 0.9999288 -0.9917537 0.9917502 0.9999288 -0.9917549 0.9917502 0.9999288 -0.9917564 0.9917502 0.9999288 -0.9917582 0.9917502 0.9999288 -0.9917606 0.9917502 0.9999288 -0.9917636 0.9917502 0.9999288 -0.9917674 0.9917502 0.9999288 -0.9917722 0.9917502 0.9999288 -0.9917782 0.9917502 0.9999288 -0.9917859 0.9917502 0.9999288 -0.9917956 0.9917502 0.9999288 -0.9918079 0.9917502 0.9999288 -0.9918234 0.9917502 0.9999288 -0.9918431 0.9917502 0.9999288 -0.991868 0.9917502 0.9999288 -0.9918994 0.9917502 0.9999288 -0.9919392 0.9917502 0.9999288 -0.9919896 0.9917502 0.9999288 -0.9920533 0.9917502 0.9999288 -0.9921339 0.9917502 0.9999288 -0.9922358 0.9917502 0.9999288 -0.9923648 0.9917502 0.9999288 -0.992528 0.9917502 0.9999288 -0.9927345 0.9917502 0.9999288 -0.9929957 0.9917502 0.9999288 -0.9933261 0.9917502 0.9999288 -0.9937442 0.9917502 0.9999288 -0.9942731 0.9917502 0.9999288 -0.9949422 0.9917502 0.9999288 -0.9957887 0.9917502 0.9999288 -0.9968597 0.9917502 0.9999288 -0.9982146 0.9917502 0.9999288 -0.9999288 0.9917502 0.9999288 -0.9999437 0.9934695 0.9985868 -0.9917501 0.9917511 0.9999288 -0.9917501 0.9917511 0.9999288 -0.9917501 0.9917511 0.9999288 -0.9917501 0.9917511 0.9999288 -0.9917501 0.9917511 0.9999288 -0.9917501 0.9917511 0.9999288 -0.99175 0.991751 0.9999288 -0.99175 0.991751 0.9999288 -0.99175 0.991751 0.9999288 -0.99175 0.9917509 0.9999288 -0.99175 0.9917508 0.9999288 -0.9917499 0.9917507 0.9999288 -0.9917499 0.9917507 0.9999288 -0.9917499 0.9917506 0.9999288 -0.9917499 0.9917505 0.9999288 -0.99175 0.9917504 0.9999288 -0.9917502 0.9917504 0.9999288 -0.9917504 0.9917504 0.9999288 -0.9917507 0.9917504 0.9999288 -0.991751 0.9917504 0.9999288 -0.9917515 0.9917504 0.9999288 -0.9917521 0.9917504 0.9999288 -0.9917528 0.9917504 0.9999288 -0.9917537 0.9917504 0.9999288 -0.9917549 0.9917504 0.9999288 -0.9917564 0.9917504 0.9999288 -0.9917582 0.9917504 0.9999288 -0.9917606 0.9917504 0.9999288 -0.9917636 0.9917504 0.9999288 -0.9917674 0.9917504 0.9999288 -0.9917722 0.9917504 0.9999288 -0.9917782 0.9917504 0.9999288 -0.9917859 0.9917504 0.9999288 -0.9917956 0.9917504 0.9999288 -0.9918079 0.9917504 0.9999288 -0.9918234 0.9917504 0.9999288 -0.9918431 0.9917504 0.9999288 -0.991868 0.9917504 0.9999288 -0.9918994 0.9917504 0.9999288 -0.9919392 0.9917504 0.9999288 -0.9919896 0.9917504 0.9999288 -0.9920533 0.9917504 0.9999288 -0.9921339 0.9917504 0.9999288 -0.9922358 0.9917504 0.9999288 -0.9923648 0.9917504 0.9999288 -0.992528 0.9917504 0.9999288 -0.9927345 0.9917504 0.9999288 -0.9929957 0.9917504 0.9999288 -0.9933261 0.9917504 0.9999288 -0.9937442 0.9917504 0.9999288 -0.9942731 0.9917504 0.9999288 -0.9949422 0.9917504 0.9999288 -0.9957887 0.9917504 0.9999288 -0.9968597 0.9917504 0.9999288 -0.9982146 0.9917504 0.9999288 -0.9999288 0.9917504 0.9999288 -0.9999437 0.9934697 0.9985868 -0.9917501 0.9917514 0.9999288 -0.9917501 0.9917514 0.9999288 -0.9917501 0.9917514 0.9999288 -0.9917501 0.9917514 0.9999288 -0.9917501 0.9917514 0.9999288 -0.9917501 0.9917514 0.9999288 -0.99175 0.9917513 0.9999288 -0.99175 0.9917513 0.9999288 -0.99175 0.9917512 0.9999288 -0.99175 0.9917512 0.9999288 -0.99175 0.9917511 0.9999288 -0.9917499 0.991751 0.9999288 -0.9917499 0.9917509 0.9999288 -0.9917499 0.9917509 0.9999288 -0.9917499 0.9917508 0.9999288 -0.99175 0.9917507 0.9999288 -0.9917502 0.9917507 0.9999288 -0.9917504 0.9917507 0.9999288 -0.9917507 0.9917507 0.9999288 -0.991751 0.9917507 0.9999288 -0.9917515 0.9917507 0.9999288 -0.9917521 0.9917507 0.9999288 -0.9917528 0.9917507 0.9999288 -0.9917537 0.9917507 0.9999288 -0.9917549 0.9917507 0.9999288 -0.9917564 0.9917507 0.9999288 -0.9917582 0.9917507 0.9999288 -0.9917606 0.9917507 0.9999288 -0.9917636 0.9917507 0.9999288 -0.9917674 0.9917507 0.9999288 -0.9917722 0.9917507 0.9999288 -0.9917782 0.9917507 0.9999288 -0.9917859 0.9917507 0.9999288 -0.9917956 0.9917507 0.9999288 -0.9918079 0.9917507 0.9999288 -0.9918234 0.9917507 0.9999288 -0.9918431 0.9917507 0.9999288 -0.991868 0.9917507 0.9999288 -0.9918994 0.9917507 0.9999288 -0.9919392 0.9917507 0.9999288 -0.9919896 0.9917507 0.9999288 -0.9920533 0.9917507 0.9999288 -0.9921339 0.9917507 0.9999288 -0.9922358 0.9917507 0.9999288 -0.9923648 0.9917507 0.9999288 -0.992528 0.9917507 0.9999288 -0.9927345 0.9917507 0.9999288 -0.9929957 0.9917507 0.9999288 -0.9933261 0.9917507 0.9999288 -0.9937442 0.9917507 0.9999288 -0.9942731 0.9917507 0.9999288 -0.9949422 0.9917507 0.9999288 -0.9957887 0.9917507 0.9999288 -0.9968597 0.9917507 0.9999288 -0.9982146 0.9917507 0.9999288 -0.9999288 0.9917507 0.9999288 -0.9999437 0.9934698 0.9985868 -0.9917501 0.9917518 0.9999288 -0.9917501 0.9917518 0.9999288 -0.9917501 0.9917518 0.9999288 -0.9917501 0.9917518 0.9999288 -0.9917501 0.9917517 0.9999288 -0.9917501 0.9917517 0.9999288 -0.99175 0.9917517 0.9999288 -0.99175 0.9917516 0.9999288 -0.99175 0.9917516 0.9999288 -0.99175 0.9917515 0.9999288 -0.99175 0.9917515 0.9999288 -0.9917499 0.9917514 0.9999288 -0.9917499 0.9917513 0.9999288 -0.9917499 0.9917512 0.9999288 -0.9917499 0.9917511 0.9999288 -0.99175 0.991751 0.9999288 -0.9917502 0.991751 0.9999288 -0.9917504 0.991751 0.9999288 -0.9917507 0.991751 0.9999288 -0.991751 0.991751 0.9999288 -0.9917515 0.991751 0.9999288 -0.9917521 0.991751 0.9999288 -0.9917528 0.991751 0.9999288 -0.9917537 0.991751 0.9999288 -0.9917549 0.991751 0.9999288 -0.9917564 0.991751 0.9999288 -0.9917582 0.991751 0.9999288 -0.9917606 0.991751 0.9999288 -0.9917636 0.991751 0.9999288 -0.9917674 0.991751 0.9999288 -0.9917722 0.991751 0.9999288 -0.9917782 0.991751 0.9999288 -0.9917859 0.991751 0.9999288 -0.9917956 0.991751 0.9999288 -0.9918079 0.991751 0.9999288 -0.9918234 0.991751 0.9999288 -0.9918431 0.991751 0.9999288 -0.991868 0.991751 0.9999288 -0.9918994 0.991751 0.9999288 -0.9919392 0.991751 0.9999288 -0.9919896 0.991751 0.9999288 -0.9920533 0.991751 0.9999288 -0.9921339 0.991751 0.9999288 -0.9922358 0.991751 0.9999288 -0.9923648 0.991751 0.9999288 -0.992528 0.991751 0.9999288 -0.9927345 0.991751 0.9999288 -0.9929957 0.991751 0.9999288 -0.9933261 0.991751 0.9999288 -0.9937442 0.991751 0.9999288 -0.9942731 0.991751 0.9999288 -0.9949422 0.991751 0.9999288 -0.9957887 0.991751 0.9999288 -0.9968597 0.991751 0.9999288 -0.9982146 0.991751 0.9999288 -0.9999288 0.991751 0.9999288 -0.9999437 0.9934701 0.9985868 -0.9917501 0.9917523 0.9999288 -0.9917501 0.9917522 0.9999288 -0.9917501 0.9917522 0.9999288 -0.9917501 0.9917522 0.9999288 -0.9917501 0.9917522 0.9999288 -0.9917501 0.9917522 0.9999288 -0.99175 0.9917521 0.9999288 -0.99175 0.9917521 0.9999288 -0.99175 0.9917521 0.9999288 -0.99175 0.991752 0.9999288 -0.99175 0.9917519 0.9999288 -0.9917499 0.9917519 0.9999288 -0.9917499 0.9917518 0.9999288 -0.9917499 0.9917517 0.9999288 -0.9917499 0.9917516 0.9999288 -0.99175 0.9917515 0.9999288 -0.9917502 0.9917515 0.9999288 -0.9917504 0.9917515 0.9999288 -0.9917507 0.9917515 0.9999288 -0.991751 0.9917515 0.9999288 -0.9917515 0.9917515 0.9999288 -0.9917521 0.9917515 0.9999288 -0.9917528 0.9917515 0.9999288 -0.9917537 0.9917515 0.9999288 -0.9917549 0.9917515 0.9999288 -0.9917564 0.9917515 0.9999288 -0.9917582 0.9917515 0.9999288 -0.9917606 0.9917515 0.9999288 -0.9917636 0.9917515 0.9999288 -0.9917674 0.9917515 0.9999288 -0.9917722 0.9917515 0.9999288 -0.9917782 0.9917515 0.9999288 -0.9917859 0.9917515 0.9999288 -0.9917956 0.9917515 0.9999288 -0.9918079 0.9917515 0.9999288 -0.9918234 0.9917515 0.9999288 -0.9918431 0.9917515 0.9999288 -0.991868 0.9917515 0.9999288 -0.9918994 0.9917515 0.9999288 -0.9919392 0.9917515 0.9999288 -0.9919896 0.9917515 0.9999288 -0.9920533 0.9917515 0.9999288 -0.9921339 0.9917515 0.9999288 -0.9922358 0.9917515 0.9999288 -0.9923648 0.9917515 0.9999288 -0.992528 0.9917515 0.9999288 -0.9927345 0.9917515 0.9999288 -0.9929957 0.9917515 0.9999288 -0.9933261 0.9917515 0.9999288 -0.9937442 0.9917515 0.9999288 -0.9942731 0.9917515 0.9999288 -0.9949422 0.9917515 0.9999288 -0.9957887 0.9917515 0.9999288 -0.9968597 0.9917515 0.9999288 -0.9982146 0.9917515 0.9999288 -0.9999288 0.9917515 0.9999288 -0.9999437 0.9934704 0.9985868 -0.9917501 0.9917528 0.9999288 -0.9917501 0.9917528 0.9999288 -0.9917501 0.9917528 0.9999288 -0.9917501 0.9917528 0.9999288 -0.9917501 0.9917528 0.9999288 -0.9917501 0.9917527 0.9999288 -0.99175 0.9917527 0.9999288 -0.99175 0.9917527 0.9999288 -0.99175 0.9917526 0.9999288 -0.99175 0.9917526 0.9999288 -0.99175 0.9917525 0.9999288 -0.9917499 0.9917524 0.9999288 -0.9917499 0.9917523 0.9999288 -0.9917499 0.9917522 0.9999288 -0.9917499 0.9917522 0.9999288 -0.99175 0.9917521 0.9999288 -0.9917502 0.9917521 0.9999288 -0.9917504 0.9917521 0.9999288 -0.9917507 0.9917521 0.9999288 -0.991751 0.9917521 0.9999288 -0.9917515 0.9917521 0.9999288 -0.9917521 0.9917521 0.9999288 -0.9917528 0.9917521 0.9999288 -0.9917537 0.9917521 0.9999288 -0.9917549 0.9917521 0.9999288 -0.9917564 0.9917521 0.9999288 -0.9917582 0.9917521 0.9999288 -0.9917606 0.9917521 0.9999288 -0.9917636 0.9917521 0.9999288 -0.9917674 0.9917521 0.9999288 -0.9917722 0.9917521 0.9999288 -0.9917782 0.9917521 0.9999288 -0.9917859 0.9917521 0.9999288 -0.9917956 0.9917521 0.9999288 -0.9918079 0.9917521 0.9999288 -0.9918234 0.9917521 0.9999288 -0.9918431 0.9917521 0.9999288 -0.991868 0.9917521 0.9999288 -0.9918994 0.9917521 0.9999288 -0.9919392 0.9917521 0.9999288 -0.9919896 0.9917521 0.9999288 -0.9920533 0.9917521 0.9999288 -0.9921339 0.9917521 0.9999288 -0.9922358 0.9917521 0.9999288 -0.9923648 0.9917521 0.9999288 -0.992528 0.9917521 0.9999288 -0.9927345 0.9917521 0.9999288 -0.9929957 0.9917521 0.9999288 -0.9933261 0.9917521 0.9999288 -0.9937442 0.9917521 0.9999288 -0.9942731 0.9917521 0.9999288 -0.9949422 0.9917521 0.9999288 -0.9957887 0.9917521 0.9999288 -0.9968597 0.9917521 0.9999288 -0.9982146 0.9917521 0.9999288 -0.9999288 0.9917521 0.9999288 -0.9999437 0.9934707 0.9985868 -0.9917501 0.9917536 0.9999288 -0.9917501 0.9917535 0.9999288 -0.9917501 0.9917535 0.9999288 -0.9917501 0.9917535 0.9999288 -0.9917501 0.9917535 0.9999288 -0.9917501 0.9917535 0.9999288 -0.99175 0.9917534 0.9999288 -0.99175 0.9917534 0.9999288 -0.99175 0.9917534 0.9999288 -0.99175 0.9917533 0.9999288 -0.99175 0.9917532 0.9999288 -0.9917499 0.9917532 0.9999288 -0.9917499 0.9917531 0.9999288 -0.9917499 0.991753 0.9999288 -0.9917499 0.9917529 0.9999288 -0.99175 0.9917528 0.9999288 -0.9917502 0.9917528 0.9999288 -0.9917504 0.9917528 0.9999288 -0.9917507 0.9917528 0.9999288 -0.991751 0.9917528 0.9999288 -0.9917515 0.9917528 0.9999288 -0.9917521 0.9917528 0.9999288 -0.9917528 0.9917528 0.9999288 -0.9917537 0.9917528 0.9999288 -0.9917549 0.9917528 0.9999288 -0.9917564 0.9917528 0.9999288 -0.9917582 0.9917528 0.9999288 -0.9917606 0.9917528 0.9999288 -0.9917636 0.9917528 0.9999288 -0.9917674 0.9917528 0.9999288 -0.9917722 0.9917528 0.9999288 -0.9917782 0.9917528 0.9999288 -0.9917859 0.9917528 0.9999288 -0.9917956 0.9917528 0.9999288 -0.9918079 0.9917528 0.9999288 -0.9918234 0.9917528 0.9999288 -0.9918431 0.9917528 0.9999288 -0.991868 0.9917528 0.9999288 -0.9918994 0.9917528 0.9999288 -0.9919392 0.9917528 0.9999288 -0.9919896 0.9917528 0.9999288 -0.9920533 0.9917528 0.9999288 -0.9921339 0.9917528 0.9999288 -0.9922358 0.9917528 0.9999288 -0.9923648 0.9917528 0.9999288 -0.992528 0.9917528 0.9999288 -0.9927345 0.9917528 0.9999288 -0.9929957 0.9917528 0.9999288 -0.9933261 0.9917528 0.9999288 -0.9937442 0.9917528 0.9999288 -0.9942731 0.9917528 0.9999288 -0.9949422 0.9917528 0.9999288 -0.9957887 0.9917528 0.9999288 -0.9968597 0.9917528 0.9999288 -0.9982146 0.9917528 0.9999288 -0.9999288 0.9917528 0.9999288 -0.9999437 0.9934712 0.9985868 -0.9917501 0.9917545 0.9999288 -0.9917501 0.9917545 0.9999288 -0.9917501 0.9917545 0.9999288 -0.9917501 0.9917544 0.9999288 -0.9917501 0.9917544 0.9999288 -0.9917501 0.9917544 0.9999288 -0.99175 0.9917544 0.9999288 -0.99175 0.9917543 0.9999288 -0.99175 0.9917543 0.9999288 -0.99175 0.9917542 0.9999288 -0.99175 0.9917542 0.9999288 -0.9917499 0.9917541 0.9999288 -0.9917499 0.991754 0.9999288 -0.9917499 0.9917539 0.9999288 -0.9917499 0.9917538 0.9999288 -0.99175 0.9917537 0.9999288 -0.9917502 0.9917537 0.9999288 -0.9917504 0.9917537 0.9999288 -0.9917507 0.9917537 0.9999288 -0.991751 0.9917537 0.9999288 -0.9917515 0.9917537 0.9999288 -0.9917521 0.9917537 0.9999288 -0.9917528 0.9917537 0.9999288 -0.9917537 0.9917537 0.9999288 -0.9917549 0.9917537 0.9999288 -0.9917564 0.9917537 0.9999288 -0.9917582 0.9917537 0.9999288 -0.9917606 0.9917537 0.9999288 -0.9917636 0.9917537 0.9999288 -0.9917674 0.9917537 0.9999288 -0.9917722 0.9917537 0.9999288 -0.9917782 0.9917537 0.9999288 -0.9917859 0.9917537 0.9999288 -0.9917956 0.9917537 0.9999288 -0.9918079 0.9917537 0.9999288 -0.9918234 0.9917537 0.9999288 -0.9918431 0.9917537 0.9999288 -0.991868 0.9917537 0.9999288 -0.9918994 0.9917537 0.9999288 -0.9919392 0.9917537 0.9999288 -0.9919896 0.9917537 0.9999288 -0.9920533 0.9917537 0.9999288 -0.9921339 0.9917537 0.9999288 -0.9922358 0.9917537 0.9999288 -0.9923648 0.9917537 0.9999288 -0.992528 0.9917537 0.9999288 -0.9927345 0.9917537 0.9999288 -0.9929957 0.9917537 0.9999288 -0.9933261 0.9917537 0.9999288 -0.9937442 0.9917537 0.9999288 -0.9942731 0.9917537 0.9999288 -0.9949422 0.9917537 0.9999288 -0.9957887 0.9917537 0.9999288 -0.9968597 0.9917537 0.9999288 -0.9982146 0.9917537 0.9999288 -0.9999288 0.9917537 0.9999288 -0.9999437 0.9934718 0.9985868 -0.9917501 0.9917557 0.9999288 -0.9917501 0.9917556 0.9999288 -0.9917501 0.9917556 0.9999288 -0.9917501 0.9917556 0.9999288 -0.9917501 0.9917556 0.9999288 -0.9917501 0.9917556 0.9999288 -0.99175 0.9917555 0.9999288 -0.99175 0.9917555 0.9999288 -0.99175 0.9917555 0.9999288 -0.99175 0.9917554 0.9999288 -0.99175 0.9917553 0.9999288 -0.9917499 0.9917553 0.9999288 -0.9917499 0.9917552 0.9999288 -0.9917499 0.9917551 0.9999288 -0.9917499 0.991755 0.9999288 -0.99175 0.9917549 0.9999288 -0.9917502 0.9917549 0.9999288 -0.9917504 0.9917549 0.9999288 -0.9917507 0.9917549 0.9999288 -0.991751 0.9917549 0.9999288 -0.9917515 0.9917549 0.9999288 -0.9917521 0.9917549 0.9999288 -0.9917528 0.9917549 0.9999288 -0.9917537 0.9917549 0.9999288 -0.9917549 0.9917549 0.9999288 -0.9917564 0.9917549 0.9999288 -0.9917582 0.9917549 0.9999288 -0.9917606 0.9917549 0.9999288 -0.9917636 0.9917549 0.9999288 -0.9917674 0.9917549 0.9999288 -0.9917722 0.9917549 0.9999288 -0.9917782 0.9917549 0.9999288 -0.9917859 0.9917549 0.9999288 -0.9917956 0.9917549 0.9999288 -0.9918079 0.9917549 0.9999288 -0.9918234 0.9917549 0.9999288 -0.9918431 0.9917549 0.9999288 -0.991868 0.9917549 0.9999288 -0.9918994 0.9917549 0.9999288 -0.9919392 0.9917549 0.9999288 -0.9919896 0.9917549 0.9999288 -0.9920533 0.9917549 0.9999288 -0.9921339 0.9917549 0.9999288 -0.9922358 0.9917549 0.9999288 -0.9923648 0.9917549 0.9999288 -0.992528 0.9917549 0.9999288 -0.9927345 0.9917549 0.9999288 -0.9929957 0.9917549 0.9999288 -0.9933261 0.9917549 0.9999288 -0.9937442 0.9917549 0.9999288 -0.9942731 0.9917549 0.9999288 -0.9949422 0.9917549 0.9999288 -0.9957887 0.9917549 0.9999288 -0.9968597 0.9917549 0.9999288 -0.9982146 0.9917549 0.9999288 -0.9999288 0.9917549 0.9999288 -0.9999437 0.9934725 0.9985868 -0.9917501 0.9917571 0.9999288 -0.9917501 0.9917571 0.9999288 -0.9917501 0.9917571 0.9999288 -0.9917501 0.9917571 0.9999288 -0.9917501 0.9917571 0.9999288 -0.9917501 0.991757 0.9999288 -0.99175 0.991757 0.9999288 -0.99175 0.991757 0.9999288 -0.99175 0.9917569 0.9999288 -0.99175 0.9917569 0.9999288 -0.99175 0.9917568 0.9999288 -0.9917499 0.9917567 0.9999288 -0.9917499 0.9917566 0.9999288 -0.9917499 0.9917565 0.9999288 -0.9917499 0.9917565 0.9999288 -0.99175 0.9917564 0.9999288 -0.9917502 0.9917564 0.9999288 -0.9917504 0.9917564 0.9999288 -0.9917507 0.9917564 0.9999288 -0.991751 0.9917564 0.9999288 -0.9917515 0.9917564 0.9999288 -0.9917521 0.9917564 0.9999288 -0.9917528 0.9917564 0.9999288 -0.9917537 0.9917564 0.9999288 -0.9917549 0.9917564 0.9999288 -0.9917564 0.9917564 0.9999288 -0.9917582 0.9917564 0.9999288 -0.9917606 0.9917564 0.9999288 -0.9917636 0.9917564 0.9999288 -0.9917674 0.9917564 0.9999288 -0.9917722 0.9917564 0.9999288 -0.9917782 0.9917564 0.9999288 -0.9917859 0.9917564 0.9999288 -0.9917956 0.9917564 0.9999288 -0.9918079 0.9917564 0.9999288 -0.9918234 0.9917564 0.9999288 -0.9918431 0.9917564 0.9999288 -0.991868 0.9917564 0.9999288 -0.9918994 0.9917564 0.9999288 -0.9919392 0.9917564 0.9999288 -0.9919896 0.9917564 0.9999288 -0.9920533 0.9917564 0.9999288 -0.9921339 0.9917564 0.9999288 -0.9922358 0.9917564 0.9999288 -0.9923648 0.9917564 0.9999288 -0.992528 0.9917564 0.9999288 -0.9927345 0.9917564 0.9999288 -0.9929957 0.9917564 0.9999288 -0.9933261 0.9917564 0.9999288 -0.9937442 0.9917564 0.9999288 -0.9942731 0.9917564 0.9999288 -0.9949422 0.9917564 0.9999288 -0.9957887 0.9917564 0.9999288 -0.9968597 0.9917564 0.9999288 -0.9982146 0.9917564 0.9999288 -0.9999288 0.9917564 0.9999288 -0.9999437 0.9934734 0.9985868 -0.9917501 0.991759 0.9999288 -0.9917501 0.991759 0.9999288 -0.9917501 0.991759 0.9999288 -0.9917501 0.991759 0.9999288 -0.9917501 0.9917589 0.9999288 -0.9917501 0.9917589 0.9999288 -0.99175 0.9917589 0.9999288 -0.99175 0.9917588 0.9999288 -0.99175 0.9917588 0.9999288 -0.99175 0.9917587 0.9999288 -0.99175 0.9917587 0.9999288 -0.9917499 0.9917586 0.9999288 -0.9917499 0.9917585 0.9999288 -0.9917499 0.9917584 0.9999288 -0.9917499 0.9917583 0.9999288 -0.99175 0.9917583 0.9999288 -0.9917502 0.9917582 0.9999288 -0.9917504 0.9917582 0.9999288 -0.9917507 0.9917582 0.9999288 -0.991751 0.9917582 0.9999288 -0.9917515 0.9917582 0.9999288 -0.9917521 0.9917582 0.9999288 -0.9917528 0.9917582 0.9999288 -0.9917537 0.9917582 0.9999288 -0.9917549 0.9917582 0.9999288 -0.9917564 0.9917582 0.9999288 -0.9917582 0.9917582 0.9999288 -0.9917606 0.9917582 0.9999288 -0.9917636 0.9917582 0.9999288 -0.9917674 0.9917582 0.9999288 -0.9917722 0.9917582 0.9999288 -0.9917782 0.9917582 0.9999288 -0.9917859 0.9917582 0.9999288 -0.9917956 0.9917582 0.9999288 -0.9918079 0.9917582 0.9999288 -0.9918234 0.9917582 0.9999288 -0.9918431 0.9917582 0.9999288 -0.991868 0.9917582 0.9999288 -0.9918994 0.9917582 0.9999288 -0.9919392 0.9917582 0.9999288 -0.9919896 0.9917582 0.9999288 -0.9920533 0.9917582 0.9999288 -0.9921339 0.9917582 0.9999288 -0.9922358 0.9917582 0.9999288 -0.9923648 0.9917582 0.9999288 -0.992528 0.9917582 0.9999288 -0.9927345 0.9917582 0.9999288 -0.9929957 0.9917582 0.9999288 -0.9933261 0.9917582 0.9999288 -0.9937442 0.9917582 0.9999288 -0.9942731 0.9917582 0.9999288 -0.9949422 0.9917582 0.9999288 -0.9957887 0.9917582 0.9999288 -0.9968597 0.9917582 0.9999288 -0.9982146 0.9917582 0.9999288 -0.9999288 0.9917582 0.9999288 -0.9999437 0.9934746 0.9985868 -0.9917501 0.9917614 0.9999288 -0.9917501 0.9917614 0.9999288 -0.9917501 0.9917613 0.9999288 -0.9917501 0.9917613 0.9999288 -0.9917501 0.9917613 0.9999288 -0.9917501 0.9917613 0.9999288 -0.99175 0.9917613 0.9999288 -0.99175 0.9917612 0.9999288 -0.99175 0.9917612 0.9999288 -0.99175 0.9917611 0.9999288 -0.99175 0.991761 0.9999288 -0.9917499 0.991761 0.9999288 -0.9917499 0.9917609 0.9999288 -0.9917499 0.9917608 0.9999288 -0.9917499 0.9917607 0.9999288 -0.99175 0.9917606 0.9999288 -0.9917502 0.9917606 0.9999288 -0.9917504 0.9917606 0.9999288 -0.9917507 0.9917606 0.9999288 -0.991751 0.9917606 0.9999288 -0.9917515 0.9917606 0.9999288 -0.9917521 0.9917606 0.9999288 -0.9917528 0.9917606 0.9999288 -0.9917537 0.9917606 0.9999288 -0.9917549 0.9917606 0.9999288 -0.9917564 0.9917606 0.9999288 -0.9917582 0.9917606 0.9999288 -0.9917606 0.9917606 0.9999288 -0.9917636 0.9917606 0.9999288 -0.9917674 0.9917606 0.9999288 -0.9917722 0.9917606 0.9999288 -0.9917782 0.9917606 0.9999288 -0.9917859 0.9917606 0.9999288 -0.9917956 0.9917606 0.9999288 -0.9918079 0.9917606 0.9999288 -0.9918234 0.9917606 0.9999288 -0.9918431 0.9917606 0.9999288 -0.991868 0.9917606 0.9999288 -0.9918994 0.9917606 0.9999288 -0.9919392 0.9917606 0.9999288 -0.9919896 0.9917606 0.9999288 -0.9920533 0.9917606 0.9999288 -0.9921339 0.9917606 0.9999288 -0.9922358 0.9917606 0.9999288 -0.9923648 0.9917606 0.9999288 -0.992528 0.9917606 0.9999288 -0.9927345 0.9917606 0.9999288 -0.9929957 0.9917606 0.9999288 -0.9933261 0.9917606 0.9999288 -0.9937442 0.9917606 0.9999288 -0.9942731 0.9917606 0.9999288 -0.9949422 0.9917606 0.9999288 -0.9957887 0.9917606 0.9999288 -0.9968597 0.9917606 0.9999288 -0.9982146 0.9917606 0.9999288 -0.9999288 0.9917606 0.9999288 -0.9999437 0.9934761 0.9985868 -0.9917501 0.9917644 0.9999288 -0.9917501 0.9917644 0.9999288 -0.9917501 0.9917643 0.9999288 -0.9917501 0.9917643 0.9999288 -0.9917501 0.9917643 0.9999288 -0.9917501 0.9917643 0.9999288 -0.99175 0.9917642 0.9999288 -0.99175 0.9917642 0.9999288 -0.99175 0.9917642 0.9999288 -0.99175 0.9917641 0.9999288 -0.99175 0.991764 0.9999288 -0.9917499 0.991764 0.9999288 -0.9917499 0.9917639 0.9999288 -0.9917499 0.9917638 0.9999288 -0.9917499 0.9917637 0.9999288 -0.99175 0.9917636 0.9999288 -0.9917502 0.9917636 0.9999288 -0.9917504 0.9917636 0.9999288 -0.9917507 0.9917636 0.9999288 -0.991751 0.9917636 0.9999288 -0.9917515 0.9917636 0.9999288 -0.9917521 0.9917636 0.9999288 -0.9917528 0.9917636 0.9999288 -0.9917537 0.9917636 0.9999288 -0.9917549 0.9917636 0.9999288 -0.9917564 0.9917636 0.9999288 -0.9917582 0.9917636 0.9999288 -0.9917606 0.9917636 0.9999288 -0.9917636 0.9917636 0.9999288 -0.9917674 0.9917636 0.9999288 -0.9917722 0.9917636 0.9999288 -0.9917782 0.9917636 0.9999288 -0.9917859 0.9917636 0.9999288 -0.9917956 0.9917636 0.9999288 -0.9918079 0.9917636 0.9999288 -0.9918234 0.9917636 0.9999288 -0.9918431 0.9917636 0.9999288 -0.991868 0.9917636 0.9999288 -0.9918994 0.9917636 0.9999288 -0.9919392 0.9917636 0.9999288 -0.9919896 0.9917636 0.9999288 -0.9920533 0.9917636 0.9999288 -0.9921339 0.9917636 0.9999288 -0.9922358 0.9917636 0.9999288 -0.9923648 0.9917636 0.9999288 -0.992528 0.9917636 0.9999288 -0.9927345 0.9917636 0.9999288 -0.9929957 0.9917636 0.9999288 -0.9933261 0.9917636 0.9999288 -0.9937442 0.9917636 0.9999288 -0.9942731 0.9917636 0.9999288 -0.9949422 0.9917636 0.9999288 -0.9957887 0.9917636 0.9999288 -0.9968597 0.9917636 0.9999288 -0.9982146 0.9917636 0.9999288 -0.9999288 0.9917636 0.9999288 -0.9999437 0.9934779 0.9985868 -0.9917501 0.9917682 0.9999288 -0.9917501 0.9917681 0.9999288 -0.9917501 0.9917681 0.9999288 -0.9917501 0.9917681 0.9999288 -0.9917501 0.9917681 0.9999288 -0.9917501 0.9917681 0.9999288 -0.99175 0.991768 0.9999288 -0.99175 0.991768 0.9999288 -0.99175 0.991768 0.9999288 -0.99175 0.9917679 0.9999288 -0.99175 0.9917678 0.9999288 -0.9917499 0.9917678 0.9999288 -0.9917499 0.9917677 0.9999288 -0.9917499 0.9917676 0.9999288 -0.9917499 0.9917675 0.9999288 -0.99175 0.9917674 0.9999288 -0.9917502 0.9917674 0.9999288 -0.9917504 0.9917674 0.9999288 -0.9917507 0.9917674 0.9999288 -0.991751 0.9917674 0.9999288 -0.9917515 0.9917674 0.9999288 -0.9917521 0.9917674 0.9999288 -0.9917528 0.9917674 0.9999288 -0.9917537 0.9917674 0.9999288 -0.9917549 0.9917674 0.9999288 -0.9917564 0.9917674 0.9999288 -0.9917582 0.9917674 0.9999288 -0.9917606 0.9917674 0.9999288 -0.9917636 0.9917674 0.9999288 -0.9917674 0.9917674 0.9999288 -0.9917722 0.9917674 0.9999288 -0.9917782 0.9917674 0.9999288 -0.9917859 0.9917674 0.9999288 -0.9917956 0.9917674 0.9999288 -0.9918079 0.9917674 0.9999288 -0.9918234 0.9917674 0.9999288 -0.9918431 0.9917674 0.9999288 -0.991868 0.9917674 0.9999288 -0.9918994 0.9917674 0.9999288 -0.9919392 0.9917674 0.9999288 -0.9919896 0.9917674 0.9999288 -0.9920533 0.9917674 0.9999288 -0.9921339 0.9917674 0.9999288 -0.9922358 0.9917674 0.9999288 -0.9923648 0.9917674 0.9999288 -0.992528 0.9917674 0.9999288 -0.9927345 0.9917674 0.9999288 -0.9929957 0.9917674 0.9999288 -0.9933261 0.9917674 0.9999288 -0.9937442 0.9917674 0.9999288 -0.9942731 0.9917674 0.9999288 -0.9949422 0.9917674 0.9999288 -0.9957887 0.9917674 0.9999288 -0.9968597 0.9917674 0.9999288 -0.9982146 0.9917674 0.9999288 -0.9999288 0.9917674 0.9999288 -0.9999437 0.9934803 0.9985868 -0.9917501 0.9917729 0.9999288 -0.9917501 0.9917729 0.9999288 -0.9917501 0.9917729 0.9999288 -0.9917501 0.9917729 0.9999288 -0.9917501 0.9917729 0.9999288 -0.9917501 0.9917729 0.9999288 -0.99175 0.9917728 0.9999288 -0.99175 0.9917728 0.9999288 -0.99175 0.9917727 0.9999288 -0.99175 0.9917727 0.9999288 -0.99175 0.9917726 0.9999288 -0.9917499 0.9917725 0.9999288 -0.9917499 0.9917725 0.9999288 -0.9917499 0.9917724 0.9999288 -0.9917499 0.9917723 0.9999288 -0.99175 0.9917722 0.9999288 -0.9917502 0.9917722 0.9999288 -0.9917504 0.9917722 0.9999288 -0.9917507 0.9917722 0.9999288 -0.991751 0.9917722 0.9999288 -0.9917515 0.9917722 0.9999288 -0.9917521 0.9917722 0.9999288 -0.9917528 0.9917722 0.9999288 -0.9917537 0.9917722 0.9999288 -0.9917549 0.9917722 0.9999288 -0.9917564 0.9917722 0.9999288 -0.9917582 0.9917722 0.9999288 -0.9917606 0.9917722 0.9999288 -0.9917636 0.9917722 0.9999288 -0.9917674 0.9917722 0.9999288 -0.9917722 0.9917722 0.9999288 -0.9917782 0.9917722 0.9999288 -0.9917859 0.9917722 0.9999288 -0.9917956 0.9917722 0.9999288 -0.9918079 0.9917722 0.9999288 -0.9918234 0.9917722 0.9999288 -0.9918431 0.9917722 0.9999288 -0.991868 0.9917722 0.9999288 -0.9918994 0.9917722 0.9999288 -0.9919392 0.9917722 0.9999288 -0.9919896 0.9917722 0.9999288 -0.9920533 0.9917722 0.9999288 -0.9921339 0.9917722 0.9999288 -0.9922358 0.9917722 0.9999288 -0.9923648 0.9917722 0.9999288 -0.992528 0.9917722 0.9999288 -0.9927345 0.9917722 0.9999288 -0.9929957 0.9917722 0.9999288 -0.9933261 0.9917722 0.9999288 -0.9937442 0.9917722 0.9999288 -0.9942731 0.9917722 0.9999288 -0.9949422 0.9917722 0.9999288 -0.9957887 0.9917722 0.9999288 -0.9968597 0.9917722 0.9999288 -0.9982146 0.9917722 0.9999288 -0.9999288 0.9917722 0.9999288 -0.9999437 0.9934833 0.9985868 -0.9917501 0.991779 0.9999288 -0.9917501 0.991779 0.9999288 -0.9917501 0.991779 0.9999288 -0.9917501 0.991779 0.9999288 -0.9917501 0.991779 0.9999288 -0.9917501 0.9917789 0.9999288 -0.99175 0.9917789 0.9999288 -0.99175 0.9917789 0.9999288 -0.99175 0.9917788 0.9999288 -0.99175 0.9917788 0.9999288 -0.99175 0.9917787 0.9999288 -0.9917499 0.9917786 0.9999288 -0.9917499 0.9917785 0.9999288 -0.9917499 0.9917784 0.9999288 -0.9917499 0.9917783 0.9999288 -0.99175 0.9917783 0.9999288 -0.9917502 0.9917782 0.9999288 -0.9917504 0.9917782 0.9999288 -0.9917507 0.9917782 0.9999288 -0.991751 0.9917782 0.9999288 -0.9917515 0.9917782 0.9999288 -0.9917521 0.9917782 0.9999288 -0.9917528 0.9917782 0.9999288 -0.9917537 0.9917782 0.9999288 -0.9917549 0.9917782 0.9999288 -0.9917564 0.9917782 0.9999288 -0.9917582 0.9917782 0.9999288 -0.9917606 0.9917782 0.9999288 -0.9917636 0.9917782 0.9999288 -0.9917674 0.9917782 0.9999288 -0.9917722 0.9917782 0.9999288 -0.9917782 0.9917782 0.9999288 -0.9917859 0.9917782 0.9999288 -0.9917956 0.9917782 0.9999288 -0.9918079 0.9917782 0.9999288 -0.9918234 0.9917782 0.9999288 -0.9918431 0.9917782 0.9999288 -0.991868 0.9917782 0.9999288 -0.9918994 0.9917782 0.9999288 -0.9919392 0.9917782 0.9999288 -0.9919896 0.9917782 0.9999288 -0.9920533 0.9917782 0.9999288 -0.9921339 0.9917782 0.9999288 -0.9922358 0.9917782 0.9999288 -0.9923648 0.9917782 0.9999288 -0.992528 0.9917782 0.9999288 -0.9927345 0.9917782 0.9999288 -0.9929957 0.9917782 0.9999288 -0.9933261 0.9917782 0.9999288 -0.9937442 0.9917782 0.9999288 -0.9942731 0.9917782 0.9999288 -0.9949422 0.9917782 0.9999288 -0.9957887 0.9917782 0.9999288 -0.9968597 0.9917782 0.9999288 -0.9982146 0.9917782 0.9999288 -0.9999288 0.9917782 0.9999288 -0.9999437 0.9934871 0.9985868 -0.9917501 0.9917867 0.9999288 -0.9917501 0.9917867 0.9999288 -0.9917501 0.9917867 0.9999288 -0.9917501 0.9917866 0.9999288 -0.9917501 0.9917866 0.9999288 -0.9917501 0.9917866 0.9999288 -0.99175 0.9917866 0.9999288 -0.99175 0.9917865 0.9999288 -0.99175 0.9917865 0.9999288 -0.99175 0.9917864 0.9999288 -0.99175 0.9917864 0.9999288 -0.9917499 0.9917863 0.9999288 -0.9917499 0.9917862 0.9999288 -0.9917499 0.9917861 0.9999288 -0.9917499 0.991786 0.9999288 -0.99175 0.9917859 0.9999288 -0.9917502 0.9917859 0.9999288 -0.9917504 0.9917859 0.9999288 -0.9917507 0.9917859 0.9999288 -0.991751 0.9917859 0.9999288 -0.9917515 0.9917859 0.9999288 -0.9917521 0.9917859 0.9999288 -0.9917528 0.9917859 0.9999288 -0.9917537 0.9917859 0.9999288 -0.9917549 0.9917859 0.9999288 -0.9917564 0.9917859 0.9999288 -0.9917582 0.9917859 0.9999288 -0.9917606 0.9917859 0.9999288 -0.9917636 0.9917859 0.9999288 -0.9917674 0.9917859 0.9999288 -0.9917722 0.9917859 0.9999288 -0.9917782 0.9917859 0.9999288 -0.9917859 0.9917859 0.9999288 -0.9917956 0.9917859 0.9999288 -0.9918079 0.9917859 0.9999288 -0.9918234 0.9917859 0.9999288 -0.9918431 0.9917859 0.9999288 -0.991868 0.9917859 0.9999288 -0.9918994 0.9917859 0.9999288 -0.9919392 0.9917859 0.9999288 -0.9919896 0.9917859 0.9999288 -0.9920533 0.9917859 0.9999288 -0.9921339 0.9917859 0.9999288 -0.9922358 0.9917859 0.9999288 -0.9923648 0.9917859 0.9999288 -0.992528 0.9917859 0.9999288 -0.9927345 0.9917859 0.9999288 -0.9929957 0.9917859 0.9999288 -0.9933261 0.9917859 0.9999288 -0.9937442 0.9917859 0.9999288 -0.9942731 0.9917859 0.9999288 -0.9949422 0.9917859 0.9999288 -0.9957887 0.9917859 0.9999288 -0.9968597 0.9917859 0.9999288 -0.9982146 0.9917859 0.9999288 -0.9999288 0.9917859 0.9999288 -0.9999437 0.9934919 0.9985868 -0.9917501 0.9917964 0.9999288 -0.9917501 0.9917964 0.9999288 -0.9917501 0.9917964 0.9999288 -0.9917501 0.9917963 0.9999288 -0.9917501 0.9917963 0.9999288 -0.9917501 0.9917963 0.9999288 -0.99175 0.9917963 0.9999288 -0.99175 0.9917962 0.9999288 -0.99175 0.9917962 0.9999288 -0.99175 0.9917961 0.9999288 -0.99175 0.9917961 0.9999288 -0.9917499 0.991796 0.9999288 -0.9917499 0.9917959 0.9999288 -0.9917499 0.9917958 0.9999288 -0.9917499 0.9917957 0.9999288 -0.99175 0.9917956 0.9999288 -0.9917502 0.9917956 0.9999288 -0.9917504 0.9917956 0.9999288 -0.9917507 0.9917956 0.9999288 -0.991751 0.9917956 0.9999288 -0.9917515 0.9917956 0.9999288 -0.9917521 0.9917956 0.9999288 -0.9917528 0.9917956 0.9999288 -0.9917537 0.9917956 0.9999288 -0.9917549 0.9917956 0.9999288 -0.9917564 0.9917956 0.9999288 -0.9917582 0.9917956 0.9999288 -0.9917606 0.9917956 0.9999288 -0.9917636 0.9917956 0.9999288 -0.9917674 0.9917956 0.9999288 -0.9917722 0.9917956 0.9999288 -0.9917782 0.9917956 0.9999288 -0.9917859 0.9917956 0.9999288 -0.9917956 0.9917956 0.9999288 -0.9918079 0.9917956 0.9999288 -0.9918234 0.9917956 0.9999288 -0.9918431 0.9917956 0.9999288 -0.991868 0.9917956 0.9999288 -0.9918994 0.9917956 0.9999288 -0.9919392 0.9917956 0.9999288 -0.9919896 0.9917956 0.9999288 -0.9920533 0.9917956 0.9999288 -0.9921339 0.9917956 0.9999288 -0.9922358 0.9917956 0.9999288 -0.9923648 0.9917956 0.9999288 -0.992528 0.9917956 0.9999288 -0.9927345 0.9917956 0.9999288 -0.9929957 0.9917956 0.9999288 -0.9933261 0.9917956 0.9999288 -0.9937442 0.9917956 0.9999288 -0.9942731 0.9917956 0.9999288 -0.9949422 0.9917956 0.9999288 -0.9957887 0.9917956 0.9999288 -0.9968597 0.9917956 0.9999288 -0.9982146 0.9917956 0.9999288 -0.9999288 0.9917956 0.9999288 -0.9999437 0.993498 0.9985868 -0.9917501 0.9918087 0.9999288 -0.9917501 0.9918087 0.9999288 -0.9917501 0.9918086 0.9999288 -0.9917501 0.9918086 0.9999288 -0.9917501 0.9918086 0.9999288 -0.9917501 0.9918086 0.9999288 -0.99175 0.9918086 0.9999288 -0.99175 0.9918085 0.9999288 -0.99175 0.9918085 0.9999288 -0.99175 0.9918084 0.9999288 -0.99175 0.9918083 0.9999288 -0.9917499 0.9918083 0.9999288 -0.9917499 0.9918082 0.9999288 -0.9917499 0.9918081 0.9999288 -0.9917499 0.991808 0.9999288 -0.99175 0.9918079 0.9999288 -0.9917502 0.9918079 0.9999288 -0.9917504 0.9918079 0.9999288 -0.9917507 0.9918079 0.9999288 -0.991751 0.9918079 0.9999288 -0.9917515 0.9918079 0.9999288 -0.9917521 0.9918079 0.9999288 -0.9917528 0.9918079 0.9999288 -0.9917537 0.9918079 0.9999288 -0.9917549 0.9918079 0.9999288 -0.9917564 0.9918079 0.9999288 -0.9917582 0.9918079 0.9999288 -0.9917606 0.9918079 0.9999288 -0.9917636 0.9918079 0.9999288 -0.9917674 0.9918079 0.9999288 -0.9917722 0.9918079 0.9999288 -0.9917782 0.9918079 0.9999288 -0.9917859 0.9918079 0.9999288 -0.9917956 0.9918079 0.9999288 -0.9918079 0.9918079 0.9999288 -0.9918234 0.9918079 0.9999288 -0.9918431 0.9918079 0.9999288 -0.991868 0.9918079 0.9999288 -0.9918994 0.9918079 0.9999288 -0.9919392 0.9918079 0.9999288 -0.9919896 0.9918079 0.9999288 -0.9920533 0.9918079 0.9999288 -0.9921339 0.9918079 0.9999288 -0.9922358 0.9918079 0.9999288 -0.9923648 0.9918079 0.9999288 -0.992528 0.9918079 0.9999288 -0.9927345 0.9918079 0.9999288 -0.9929957 0.9918079 0.9999288 -0.9933261 0.9918079 0.9999288 -0.9937442 0.9918079 0.9999288 -0.9942731 0.9918079 0.9999288 -0.9949422 0.9918079 0.9999288 -0.9957887 0.9918079 0.9999288 -0.9968597 0.9918079 0.9999288 -0.9982146 0.9918079 0.9999288 -0.9999288 0.9918079 0.9999288 -0.9999437 0.9935057 0.9985868 -0.9917501 0.9918242 0.9999288 -0.9917501 0.9918242 0.9999288 -0.9917501 0.9918242 0.9999288 -0.9917501 0.9918242 0.9999288 -0.9917501 0.9918241 0.9999288 -0.9917501 0.9918241 0.9999288 -0.99175 0.9918241 0.9999288 -0.99175 0.9918241 0.9999288 -0.99175 0.991824 0.9999288 -0.99175 0.9918239 0.9999288 -0.99175 0.9918239 0.9999288 -0.9917499 0.9918238 0.9999288 -0.9917499 0.9918237 0.9999288 -0.9917499 0.9918236 0.9999288 -0.9917499 0.9918235 0.9999288 -0.99175 0.9918235 0.9999288 -0.9917502 0.9918234 0.9999288 -0.9917504 0.9918234 0.9999288 -0.9917507 0.9918234 0.9999288 -0.991751 0.9918234 0.9999288 -0.9917515 0.9918234 0.9999288 -0.9917521 0.9918234 0.9999288 -0.9917528 0.9918234 0.9999288 -0.9917537 0.9918234 0.9999288 -0.9917549 0.9918234 0.9999288 -0.9917564 0.9918234 0.9999288 -0.9917582 0.9918234 0.9999288 -0.9917606 0.9918234 0.9999288 -0.9917636 0.9918234 0.9999288 -0.9917674 0.9918234 0.9999288 -0.9917722 0.9918234 0.9999288 -0.9917782 0.9918234 0.9999288 -0.9917859 0.9918234 0.9999288 -0.9917956 0.9918234 0.9999288 -0.9918079 0.9918234 0.9999288 -0.9918234 0.9918234 0.9999288 -0.9918431 0.9918234 0.9999288 -0.991868 0.9918234 0.9999288 -0.9918994 0.9918234 0.9999288 -0.9919392 0.9918234 0.9999288 -0.9919896 0.9918234 0.9999288 -0.9920533 0.9918234 0.9999288 -0.9921339 0.9918234 0.9999288 -0.9922358 0.9918234 0.9999288 -0.9923648 0.9918234 0.9999288 -0.992528 0.9918234 0.9999288 -0.9927345 0.9918234 0.9999288 -0.9929957 0.9918234 0.9999288 -0.9933261 0.9918234 0.9999288 -0.9937442 0.9918234 0.9999288 -0.9942731 0.9918234 0.9999288 -0.9949422 0.9918234 0.9999288 -0.9957887 0.9918234 0.9999288 -0.9968597 0.9918234 0.9999288 -0.9982146 0.9918234 0.9999288 -0.9999288 0.9918234 0.9999288 -0.9999437 0.9935154 0.9985868 -0.9917501 0.9918439 0.9999288 -0.9917501 0.9918438 0.9999288 -0.9917501 0.9918438 0.9999288 -0.9917501 0.9918438 0.9999288 -0.9917501 0.9918438 0.9999288 -0.9917501 0.9918438 0.9999288 -0.99175 0.9918437 0.9999288 -0.99175 0.9918437 0.9999288 -0.99175 0.9918437 0.9999288 -0.99175 0.9918436 0.9999288 -0.99175 0.9918435 0.9999288 -0.9917499 0.9918435 0.9999288 -0.9917499 0.9918434 0.9999288 -0.9917499 0.9918433 0.9999288 -0.9917499 0.9918432 0.9999288 -0.99175 0.9918431 0.9999288 -0.9917502 0.9918431 0.9999288 -0.9917504 0.9918431 0.9999288 -0.9917507 0.9918431 0.9999288 -0.991751 0.9918431 0.9999288 -0.9917515 0.9918431 0.9999288 -0.9917521 0.9918431 0.9999288 -0.9917528 0.9918431 0.9999288 -0.9917537 0.9918431 0.9999288 -0.9917549 0.9918431 0.9999288 -0.9917564 0.9918431 0.9999288 -0.9917582 0.9918431 0.9999288 -0.9917606 0.9918431 0.9999288 -0.9917636 0.9918431 0.9999288 -0.9917674 0.9918431 0.9999288 -0.9917722 0.9918431 0.9999288 -0.9917782 0.9918431 0.9999288 -0.9917859 0.9918431 0.9999288 -0.9917956 0.9918431 0.9999288 -0.9918079 0.9918431 0.9999288 -0.9918234 0.9918431 0.9999288 -0.9918431 0.9918431 0.9999288 -0.991868 0.9918431 0.9999288 -0.9918994 0.9918431 0.9999288 -0.9919392 0.9918431 0.9999288 -0.9919896 0.9918431 0.9999288 -0.9920533 0.9918431 0.9999288 -0.9921339 0.9918431 0.9999288 -0.9922358 0.9918431 0.9999288 -0.9923648 0.9918431 0.9999288 -0.992528 0.9918431 0.9999288 -0.9927345 0.9918431 0.9999288 -0.9929957 0.9918431 0.9999288 -0.9933261 0.9918431 0.9999288 -0.9937442 0.9918431 0.9999288 -0.9942731 0.9918431 0.9999288 -0.9949422 0.9918431 0.9999288 -0.9957887 0.9918431 0.9999288 -0.9968597 0.9918431 0.9999288 -0.9982146 0.9918431 0.9999288 -0.9999288 0.9918431 0.9999288 -0.9999437 0.9935277 0.9985868 -0.9917501 0.9918687 0.9999288 -0.9917501 0.9918687 0.9999288 -0.9917501 0.9918687 0.9999288 -0.9917501 0.9918687 0.9999288 -0.9917501 0.9918687 0.9999288 -0.9917501 0.9918686 0.9999288 -0.99175 0.9918686 0.9999288 -0.99175 0.9918686 0.9999288 -0.99175 0.9918685 0.9999288 -0.99175 0.9918685 0.9999288 -0.99175 0.9918684 0.9999288 -0.9917499 0.9918683 0.9999288 -0.9917499 0.9918682 0.9999288 -0.9917499 0.9918681 0.9999288 -0.9917499 0.9918681 0.9999288 -0.99175 0.991868 0.9999288 -0.9917502 0.991868 0.9999288 -0.9917504 0.991868 0.9999288 -0.9917507 0.991868 0.9999288 -0.991751 0.991868 0.9999288 -0.9917515 0.991868 0.9999288 -0.9917521 0.991868 0.9999288 -0.9917528 0.991868 0.9999288 -0.9917537 0.991868 0.9999288 -0.9917549 0.991868 0.9999288 -0.9917564 0.991868 0.9999288 -0.9917582 0.991868 0.9999288 -0.9917606 0.991868 0.9999288 -0.9917636 0.991868 0.9999288 -0.9917674 0.991868 0.9999288 -0.9917722 0.991868 0.9999288 -0.9917782 0.991868 0.9999288 -0.9917859 0.991868 0.9999288 -0.9917956 0.991868 0.9999288 -0.9918079 0.991868 0.9999288 -0.9918234 0.991868 0.9999288 -0.9918431 0.991868 0.9999288 -0.991868 0.991868 0.9999288 -0.9918994 0.991868 0.9999288 -0.9919392 0.991868 0.9999288 -0.9919896 0.991868 0.9999288 -0.9920533 0.991868 0.9999288 -0.9921339 0.991868 0.9999288 -0.9922358 0.991868 0.9999288 -0.9923648 0.991868 0.9999288 -0.992528 0.991868 0.9999288 -0.9927345 0.991868 0.9999288 -0.9929957 0.991868 0.9999288 -0.9933261 0.991868 0.9999288 -0.9937442 0.991868 0.9999288 -0.9942731 0.991868 0.9999288 -0.9949422 0.991868 0.9999288 -0.9957887 0.991868 0.9999288 -0.9968597 0.991868 0.9999288 -0.9982146 0.991868 0.9999288 -0.9999288 0.991868 0.9999288 -0.9999437 0.9935432 0.9985868 -0.9917501 0.9919002 0.9999288 -0.9917501 0.9919002 0.9999288 -0.9917501 0.9919002 0.9999288 -0.9917501 0.9919001 0.9999288 -0.9917501 0.9919001 0.9999288 -0.9917501 0.9919001 0.9999288 -0.99175 0.9919001 0.9999288 -0.99175 0.9919 0.9999288 -0.99175 0.9919 0.9999288 -0.99175 0.9918999 0.9999288 -0.99175 0.9918999 0.9999288 -0.9917499 0.9918998 0.9999288 -0.9917499 0.9918997 0.9999288 -0.9917499 0.9918996 0.9999288 -0.9917499 0.9918995 0.9999288 -0.99175 0.9918994 0.9999288 -0.9917502 0.9918994 0.9999288 -0.9917504 0.9918994 0.9999288 -0.9917507 0.9918994 0.9999288 -0.991751 0.9918994 0.9999288 -0.9917515 0.9918994 0.9999288 -0.9917521 0.9918994 0.9999288 -0.9917528 0.9918994 0.9999288 -0.9917537 0.9918994 0.9999288 -0.9917549 0.9918994 0.9999288 -0.9917564 0.9918994 0.9999288 -0.9917582 0.9918994 0.9999288 -0.9917606 0.9918994 0.9999288 -0.9917636 0.9918994 0.9999288 -0.9917674 0.9918994 0.9999288 -0.9917722 0.9918994 0.9999288 -0.9917782 0.9918994 0.9999288 -0.9917859 0.9918994 0.9999288 -0.9917956 0.9918994 0.9999288 -0.9918079 0.9918994 0.9999288 -0.9918234 0.9918994 0.9999288 -0.9918431 0.9918994 0.9999288 -0.991868 0.9918994 0.9999288 -0.9918994 0.9918994 0.9999288 -0.9919392 0.9918994 0.9999288 -0.9919896 0.9918994 0.9999288 -0.9920533 0.9918994 0.9999288 -0.9921339 0.9918994 0.9999288 -0.9922358 0.9918994 0.9999288 -0.9923648 0.9918994 0.9999288 -0.992528 0.9918994 0.9999288 -0.9927345 0.9918994 0.9999288 -0.9929957 0.9918994 0.9999288 -0.9933261 0.9918994 0.9999288 -0.9937442 0.9918994 0.9999288 -0.9942731 0.9918994 0.9999288 -0.9949422 0.9918994 0.9999288 -0.9957887 0.9918994 0.9999288 -0.9968597 0.9918994 0.9999288 -0.9982146 0.9918994 0.9999288 -0.9999288 0.9918994 0.9999288 -0.9999437 0.9935629 0.9985868 -0.9917501 0.99194 0.9999288 -0.9917501 0.99194 0.9999288 -0.9917501 0.99194 0.9999288 -0.9917501 0.9919399 0.9999288 -0.9917501 0.9919399 0.9999288 -0.9917501 0.9919399 0.9999288 -0.99175 0.9919399 0.9999288 -0.99175 0.9919398 0.9999288 -0.99175 0.9919398 0.9999288 -0.99175 0.9919397 0.9999288 -0.99175 0.9919397 0.9999288 -0.9917499 0.9919396 0.9999288 -0.9917499 0.9919395 0.9999288 -0.9917499 0.9919394 0.9999288 -0.9917499 0.9919393 0.9999288 -0.99175 0.9919392 0.9999288 -0.9917502 0.9919392 0.9999288 -0.9917504 0.9919392 0.9999288 -0.9917507 0.9919392 0.9999288 -0.991751 0.9919392 0.9999288 -0.9917515 0.9919392 0.9999288 -0.9917521 0.9919392 0.9999288 -0.9917528 0.9919392 0.9999288 -0.9917537 0.9919392 0.9999288 -0.9917549 0.9919392 0.9999288 -0.9917564 0.9919392 0.9999288 -0.9917582 0.9919392 0.9999288 -0.9917606 0.9919392 0.9999288 -0.9917636 0.9919392 0.9999288 -0.9917674 0.9919392 0.9999288 -0.9917722 0.9919392 0.9999288 -0.9917782 0.9919392 0.9999288 -0.9917859 0.9919392 0.9999288 -0.9917956 0.9919392 0.9999288 -0.9918079 0.9919392 0.9999288 -0.9918234 0.9919392 0.9999288 -0.9918431 0.9919392 0.9999288 -0.991868 0.9919392 0.9999288 -0.9918994 0.9919392 0.9999288 -0.9919392 0.9919392 0.9999288 -0.9919896 0.9919392 0.9999288 -0.9920533 0.9919392 0.9999288 -0.9921339 0.9919392 0.9999288 -0.9922358 0.9919392 0.9999288 -0.9923648 0.9919392 0.9999288 -0.992528 0.9919392 0.9999288 -0.9927345 0.9919392 0.9999288 -0.9929957 0.9919392 0.9999288 -0.9933261 0.9919392 0.9999288 -0.9937442 0.9919392 0.9999288 -0.9942731 0.9919392 0.9999288 -0.9949422 0.9919392 0.9999288 -0.9957887 0.9919392 0.9999288 -0.9968597 0.9919392 0.9999288 -0.9982146 0.9919392 0.9999288 -0.9999288 0.9919392 0.9999288 -0.9999437 0.9935878 0.9985868 -0.9917501 0.9919903 0.9999288 -0.9917501 0.9919903 0.9999288 -0.9917501 0.9919903 0.9999288 -0.9917501 0.9919903 0.9999288 -0.9917501 0.9919903 0.9999288 -0.9917501 0.9919902 0.9999288 -0.99175 0.9919902 0.9999288 -0.99175 0.9919902 0.9999288 -0.99175 0.9919901 0.9999288 -0.99175 0.9919901 0.9999288 -0.99175 0.99199 0.9999288 -0.9917499 0.9919899 0.9999288 -0.9917499 0.9919898 0.9999288 -0.9917499 0.9919898 0.9999288 -0.9917499 0.9919897 0.9999288 -0.99175 0.9919896 0.9999288 -0.9917502 0.9919896 0.9999288 -0.9917504 0.9919896 0.9999288 -0.9917507 0.9919896 0.9999288 -0.991751 0.9919896 0.9999288 -0.9917515 0.9919896 0.9999288 -0.9917521 0.9919896 0.9999288 -0.9917528 0.9919896 0.9999288 -0.9917537 0.9919896 0.9999288 -0.9917549 0.9919896 0.9999288 -0.9917564 0.9919896 0.9999288 -0.9917582 0.9919896 0.9999288 -0.9917606 0.9919896 0.9999288 -0.9917636 0.9919896 0.9999288 -0.9917674 0.9919896 0.9999288 -0.9917722 0.9919896 0.9999288 -0.9917782 0.9919896 0.9999288 -0.9917859 0.9919896 0.9999288 -0.9917956 0.9919896 0.9999288 -0.9918079 0.9919896 0.9999288 -0.9918234 0.9919896 0.9999288 -0.9918431 0.9919896 0.9999288 -0.991868 0.9919896 0.9999288 -0.9918994 0.9919896 0.9999288 -0.9919392 0.9919896 0.9999288 -0.9919896 0.9919896 0.9999288 -0.9920533 0.9919896 0.9999288 -0.9921339 0.9919896 0.9999288 -0.9922358 0.9919896 0.9999288 -0.9923648 0.9919896 0.9999288 -0.992528 0.9919896 0.9999288 -0.9927345 0.9919896 0.9999288 -0.9929957 0.9919896 0.9999288 -0.9933261 0.9919896 0.9999288 -0.9937442 0.9919896 0.9999288 -0.9942731 0.9919896 0.9999288 -0.9949422 0.9919896 0.9999288 -0.9957887 0.9919896 0.9999288 -0.9968597 0.9919896 0.9999288 -0.9982146 0.9919896 0.9999288 -0.9999288 0.9919896 0.9999288 -0.9999437 0.9936193 0.9985868 -0.9917501 0.992054 0.9999288 -0.9917501 0.992054 0.9999288 -0.9917501 0.992054 0.9999288 -0.9917501 0.992054 0.9999288 -0.9917501 0.992054 0.9999288 -0.9917501 0.9920539 0.9999288 -0.99175 0.9920539 0.9999288 -0.99175 0.9920539 0.9999288 -0.99175 0.9920538 0.9999288 -0.99175 0.9920538 0.9999288 -0.99175 0.9920537 0.9999288 -0.9917499 0.9920536 0.9999288 -0.9917499 0.9920535 0.9999288 -0.9917499 0.9920535 0.9999288 -0.9917499 0.9920534 0.9999288 -0.99175 0.9920533 0.9999288 -0.9917502 0.9920533 0.9999288 -0.9917504 0.9920533 0.9999288 -0.9917507 0.9920533 0.9999288 -0.991751 0.9920533 0.9999288 -0.9917515 0.9920533 0.9999288 -0.9917521 0.9920533 0.9999288 -0.9917528 0.9920533 0.9999288 -0.9917537 0.9920533 0.9999288 -0.9917549 0.9920533 0.9999288 -0.9917564 0.9920533 0.9999288 -0.9917582 0.9920533 0.9999288 -0.9917606 0.9920533 0.9999288 -0.9917636 0.9920533 0.9999288 -0.9917674 0.9920533 0.9999288 -0.9917722 0.9920533 0.9999288 -0.9917782 0.9920533 0.9999288 -0.9917859 0.9920533 0.9999288 -0.9917956 0.9920533 0.9999288 -0.9918079 0.9920533 0.9999288 -0.9918234 0.9920533 0.9999288 -0.9918431 0.9920533 0.9999288 -0.991868 0.9920533 0.9999288 -0.9918994 0.9920533 0.9999288 -0.9919392 0.9920533 0.9999288 -0.9919896 0.9920533 0.9999288 -0.9920533 0.9920533 0.9999288 -0.9921339 0.9920533 0.9999288 -0.9922358 0.9920533 0.9999288 -0.9923648 0.9920533 0.9999288 -0.992528 0.9920533 0.9999288 -0.9927345 0.9920533 0.9999288 -0.9929957 0.9920533 0.9999288 -0.9933261 0.9920533 0.9999288 -0.9937442 0.9920533 0.9999288 -0.9942731 0.9920533 0.9999288 -0.9949422 0.9920533 0.9999288 -0.9957887 0.9920533 0.9999288 -0.9968597 0.9920533 0.9999288 -0.9982146 0.9920533 0.9999288 -0.9999288 0.9920533 0.9999288 -0.9999437 0.9936592 0.9985868 -0.9917501 0.9921346 0.9999288 -0.9917501 0.9921346 0.9999288 -0.9917501 0.9921346 0.9999288 -0.9917501 0.9921346 0.9999288 -0.9917501 0.9921345 0.9999288 -0.9917501 0.9921345 0.9999288 -0.99175 0.9921345 0.9999288 -0.99175 0.9921345 0.9999288 -0.99175 0.9921344 0.9999288 -0.99175 0.9921344 0.9999288 -0.99175 0.9921343 0.9999288 -0.9917499 0.9921342 0.9999288 -0.9917499 0.9921341 0.9999288 -0.9917499 0.992134 0.9999288 -0.9917499 0.992134 0.9999288 -0.99175 0.9921339 0.9999288 -0.9917502 0.9921339 0.9999288 -0.9917504 0.9921339 0.9999288 -0.9917507 0.9921339 0.9999288 -0.991751 0.9921339 0.9999288 -0.9917515 0.9921339 0.9999288 -0.9917521 0.9921339 0.9999288 -0.9917528 0.9921339 0.9999288 -0.9917537 0.9921339 0.9999288 -0.9917549 0.9921339 0.9999288 -0.9917564 0.9921339 0.9999288 -0.9917582 0.9921339 0.9999288 -0.9917606 0.9921339 0.9999288 -0.9917636 0.9921339 0.9999288 -0.9917674 0.9921339 0.9999288 -0.9917722 0.9921339 0.9999288 -0.9917782 0.9921339 0.9999288 -0.9917859 0.9921339 0.9999288 -0.9917956 0.9921339 0.9999288 -0.9918079 0.9921339 0.9999288 -0.9918234 0.9921339 0.9999288 -0.9918431 0.9921339 0.9999288 -0.991868 0.9921339 0.9999288 -0.9918994 0.9921339 0.9999288 -0.9919392 0.9921339 0.9999288 -0.9919896 0.9921339 0.9999288 -0.9920533 0.9921339 0.9999288 -0.9921339 0.9921339 0.9999288 -0.9922358 0.9921339 0.9999288 -0.9923648 0.9921339 0.9999288 -0.992528 0.9921339 0.9999288 -0.9927345 0.9921339 0.9999288 -0.9929957 0.9921339 0.9999288 -0.9933261 0.9921339 0.9999288 -0.9937442 0.9921339 0.9999288 -0.9942731 0.9921339 0.9999288 -0.9949422 0.9921339 0.9999288 -0.9957887 0.9921339 0.9999288 -0.9968597 0.9921339 0.9999288 -0.9982146 0.9921339 0.9999288 -0.9999288 0.9921339 0.9999288 -0.9999437 0.9937096 0.9985868 -0.9917501 0.9922366 0.9999288 -0.9917501 0.9922365 0.9999288 -0.9917501 0.9922365 0.9999288 -0.9917501 0.9922365 0.9999288 -0.9917501 0.9922365 0.9999288 -0.9917501 0.9922365 0.9999288 -0.99175 0.9922364 0.9999288 -0.99175 0.9922364 0.9999288 -0.99175 0.9922364 0.9999288 -0.99175 0.9922363 0.9999288 -0.99175 0.9922362 0.9999288 -0.9917499 0.9922362 0.9999288 -0.9917499 0.9922361 0.9999288 -0.9917499 0.992236 0.9999288 -0.9917499 0.9922359 0.9999288 -0.99175 0.9922358 0.9999288 -0.9917502 0.9922358 0.9999288 -0.9917504 0.9922358 0.9999288 -0.9917507 0.9922358 0.9999288 -0.991751 0.9922358 0.9999288 -0.9917515 0.9922358 0.9999288 -0.9917521 0.9922358 0.9999288 -0.9917528 0.9922358 0.9999288 -0.9917537 0.9922358 0.9999288 -0.9917549 0.9922358 0.9999288 -0.9917564 0.9922358 0.9999288 -0.9917582 0.9922358 0.9999288 -0.9917606 0.9922358 0.9999288 -0.9917636 0.9922358 0.9999288 -0.9917674 0.9922358 0.9999288 -0.9917722 0.9922358 0.9999288 -0.9917782 0.9922358 0.9999288 -0.9917859 0.9922358 0.9999288 -0.9917956 0.9922358 0.9999288 -0.9918079 0.9922358 0.9999288 -0.9918234 0.9922358 0.9999288 -0.9918431 0.9922358 0.9999288 -0.991868 0.9922358 0.9999288 -0.9918994 0.9922358 0.9999288 -0.9919392 0.9922358 0.9999288 -0.9919896 0.9922358 0.9999288 -0.9920533 0.9922358 0.9999288 -0.9921339 0.9922358 0.9999288 -0.9922358 0.9922358 0.9999288 -0.9923648 0.9922358 0.9999288 -0.992528 0.9922358 0.9999288 -0.9927345 0.9922358 0.9999288 -0.9929957 0.9922358 0.9999288 -0.9933261 0.9922358 0.9999288 -0.9937442 0.9922358 0.9999288 -0.9942731 0.9922358 0.9999288 -0.9949422 0.9922358 0.9999288 -0.9957887 0.9922358 0.9999288 -0.9968597 0.9922358 0.9999288 -0.9982146 0.9922358 0.9999288 -0.9999288 0.9922358 0.9999288 -0.9999437 0.9937734 0.9985868 -0.9917501 0.9923655 0.9999288 -0.9917501 0.9923655 0.9999288 -0.9917501 0.9923655 0.9999288 -0.9917501 0.9923655 0.9999288 -0.9917501 0.9923655 0.9999288 -0.9917501 0.9923655 0.9999288 -0.99175 0.9923654 0.9999288 -0.99175 0.9923654 0.9999288 -0.99175 0.9923653 0.9999288 -0.99175 0.9923653 0.9999288 -0.99175 0.9923652 0.9999288 -0.9917499 0.9923652 0.9999288 -0.9917499 0.9923651 0.9999288 -0.9917499 0.992365 0.9999288 -0.9917499 0.9923649 0.9999288 -0.99175 0.9923648 0.9999288 -0.9917502 0.9923648 0.9999288 -0.9917504 0.9923648 0.9999288 -0.9917507 0.9923648 0.9999288 -0.991751 0.9923648 0.9999288 -0.9917515 0.9923648 0.9999288 -0.9917521 0.9923648 0.9999288 -0.9917528 0.9923648 0.9999288 -0.9917537 0.9923648 0.9999288 -0.9917549 0.9923648 0.9999288 -0.9917564 0.9923648 0.9999288 -0.9917582 0.9923648 0.9999288 -0.9917606 0.9923648 0.9999288 -0.9917636 0.9923648 0.9999288 -0.9917674 0.9923648 0.9999288 -0.9917722 0.9923648 0.9999288 -0.9917782 0.9923648 0.9999288 -0.9917859 0.9923648 0.9999288 -0.9917956 0.9923648 0.9999288 -0.9918079 0.9923648 0.9999288 -0.9918234 0.9923648 0.9999288 -0.9918431 0.9923648 0.9999288 -0.991868 0.9923648 0.9999288 -0.9918994 0.9923648 0.9999288 -0.9919392 0.9923648 0.9999288 -0.9919896 0.9923648 0.9999288 -0.9920533 0.9923648 0.9999288 -0.9921339 0.9923648 0.9999288 -0.9922358 0.9923648 0.9999288 -0.9923648 0.9923648 0.9999288 -0.992528 0.9923648 0.9999288 -0.9927345 0.9923648 0.9999288 -0.9929957 0.9923648 0.9999288 -0.9933261 0.9923648 0.9999288 -0.9937442 0.9923648 0.9999288 -0.9942731 0.9923648 0.9999288 -0.9949422 0.9923648 0.9999288 -0.9957887 0.9923648 0.9999288 -0.9968597 0.9923648 0.9999288 -0.9982146 0.9923648 0.9999288 -0.9999288 0.9923648 0.9999288 -0.9999437 0.9938541 0.9985868 -0.9917501 0.9925287 0.9999288 -0.9917501 0.9925287 0.9999288 -0.9917501 0.9925287 0.9999288 -0.9917501 0.9925287 0.9999288 -0.9917501 0.9925287 0.9999288 -0.9917501 0.9925286 0.9999288 -0.99175 0.9925286 0.9999288 -0.99175 0.9925286 0.9999288 -0.99175 0.9925285 0.9999288 -0.99175 0.9925285 0.9999288 -0.99175 0.9925284 0.9999288 -0.9917499 0.9925283 0.9999288 -0.9917499 0.9925283 0.9999288 -0.9917499 0.9925282 0.9999288 -0.9917499 0.9925281 0.9999288 -0.99175 0.992528 0.9999288 -0.9917502 0.992528 0.9999288 -0.9917504 0.992528 0.9999288 -0.9917507 0.992528 0.9999288 -0.991751 0.992528 0.9999288 -0.9917515 0.992528 0.9999288 -0.9917521 0.992528 0.9999288 -0.9917528 0.992528 0.9999288 -0.9917537 0.992528 0.9999288 -0.9917549 0.992528 0.9999288 -0.9917564 0.992528 0.9999288 -0.9917582 0.992528 0.9999288 -0.9917606 0.992528 0.9999288 -0.9917636 0.992528 0.9999288 -0.9917674 0.992528 0.9999288 -0.9917722 0.992528 0.9999288 -0.9917782 0.992528 0.9999288 -0.9917859 0.992528 0.9999288 -0.9917956 0.992528 0.9999288 -0.9918079 0.992528 0.9999288 -0.9918234 0.992528 0.9999288 -0.9918431 0.992528 0.9999288 -0.991868 0.992528 0.9999288 -0.9918994 0.992528 0.9999288 -0.9919392 0.992528 0.9999288 -0.9919896 0.992528 0.9999288 -0.9920533 0.992528 0.9999288 -0.9921339 0.992528 0.9999288 -0.9922358 0.992528 0.9999288 -0.9923648 0.992528 0.9999288 -0.992528 0.992528 0.9999288 -0.9927345 0.992528 0.9999288 -0.9929957 0.992528 0.9999288 -0.9933261 0.992528 0.9999288 -0.9937442 0.992528 0.9999288 -0.9942731 0.992528 0.9999288 -0.9949422 0.992528 0.9999288 -0.9957887 0.992528 0.9999288 -0.9968597 0.992528 0.9999288 -0.9982146 0.992528 0.9999288 -0.9999288 0.992528 0.9999288 -0.9999437 0.9939562 0.9985868 -0.9917501 0.9927351 0.9999288 -0.9917501 0.9927351 0.9999288 -0.9917501 0.9927351 0.9999288 -0.9917501 0.9927351 0.9999288 -0.9917501 0.9927351 0.9999288 -0.9917501 0.9927351 0.9999288 -0.99175 0.992735 0.9999288 -0.99175 0.992735 0.9999288 -0.99175 0.992735 0.9999288 -0.99175 0.9927349 0.9999288 -0.99175 0.9927349 0.9999288 -0.9917499 0.9927348 0.9999288 -0.9917499 0.9927347 0.9999288 -0.9917499 0.9927346 0.9999288 -0.9917499 0.9927346 0.9999288 -0.99175 0.9927345 0.9999288 -0.9917502 0.9927345 0.9999288 -0.9917504 0.9927345 0.9999288 -0.9917507 0.9927345 0.9999288 -0.991751 0.9927345 0.9999288 -0.9917515 0.9927345 0.9999288 -0.9917521 0.9927345 0.9999288 -0.9917528 0.9927345 0.9999288 -0.9917537 0.9927345 0.9999288 -0.9917549 0.9927345 0.9999288 -0.9917564 0.9927345 0.9999288 -0.9917582 0.9927345 0.9999288 -0.9917606 0.9927345 0.9999288 -0.9917636 0.9927345 0.9999288 -0.9917674 0.9927345 0.9999288 -0.9917722 0.9927345 0.9999288 -0.9917782 0.9927345 0.9999288 -0.9917859 0.9927345 0.9999288 -0.9917956 0.9927345 0.9999288 -0.9918079 0.9927345 0.9999288 -0.9918234 0.9927345 0.9999288 -0.9918431 0.9927345 0.9999288 -0.991868 0.9927345 0.9999288 -0.9918994 0.9927345 0.9999288 -0.9919392 0.9927345 0.9999288 -0.9919896 0.9927345 0.9999288 -0.9920533 0.9927345 0.9999288 -0.9921339 0.9927345 0.9999288 -0.9922358 0.9927345 0.9999288 -0.9923648 0.9927345 0.9999288 -0.992528 0.9927345 0.9999288 -0.9927345 0.9927345 0.9999288 -0.9929957 0.9927345 0.9999288 -0.9933261 0.9927345 0.9999288 -0.9937442 0.9927345 0.9999288 -0.9942731 0.9927345 0.9999288 -0.9949422 0.9927345 0.9999288 -0.9957887 0.9927345 0.9999288 -0.9968597 0.9927345 0.9999288 -0.9982146 0.9927345 0.9999288 -0.9999288 0.9927345 0.9999288 -0.9999437 0.9940854 0.9985868 -0.9917501 0.9929963 0.9999288 -0.9917501 0.9929963 0.9999288 -0.9917501 0.9929963 0.9999288 -0.9917501 0.9929963 0.9999288 -0.9917501 0.9929963 0.9999288 -0.9917501 0.9929962 0.9999288 -0.99175 0.9929962 0.9999288 -0.99175 0.9929962 0.9999288 -0.99175 0.9929962 0.9999288 -0.99175 0.9929961 0.9999288 -0.99175 0.992996 0.9999288 -0.9917499 0.992996 0.9999288 -0.9917499 0.9929959 0.9999288 -0.9917499 0.9929958 0.9999288 -0.9917499 0.9929957 0.9999288 -0.99175 0.9929957 0.9999288 -0.9917502 0.9929957 0.9999288 -0.9917504 0.9929957 0.9999288 -0.9917507 0.9929957 0.9999288 -0.991751 0.9929957 0.9999288 -0.9917515 0.9929957 0.9999288 -0.9917521 0.9929957 0.9999288 -0.9917528 0.9929957 0.9999288 -0.9917537 0.9929957 0.9999288 -0.9917549 0.9929957 0.9999288 -0.9917564 0.9929957 0.9999288 -0.9917582 0.9929957 0.9999288 -0.9917606 0.9929957 0.9999288 -0.9917636 0.9929957 0.9999288 -0.9917674 0.9929957 0.9999288 -0.9917722 0.9929957 0.9999288 -0.9917782 0.9929957 0.9999288 -0.9917859 0.9929957 0.9999288 -0.9917956 0.9929957 0.9999288 -0.9918079 0.9929957 0.9999288 -0.9918234 0.9929957 0.9999288 -0.9918431 0.9929957 0.9999288 -0.991868 0.9929957 0.9999288 -0.9918994 0.9929957 0.9999288 -0.9919392 0.9929957 0.9999288 -0.9919896 0.9929957 0.9999288 -0.9920533 0.9929957 0.9999288 -0.9921339 0.9929957 0.9999288 -0.9922358 0.9929957 0.9999288 -0.9923648 0.9929957 0.9999288 -0.992528 0.9929957 0.9999288 -0.9927345 0.9929957 0.9999288 -0.9929957 0.9929957 0.9999288 -0.9933261 0.9929957 0.9999288 -0.9937442 0.9929957 0.9999288 -0.9942731 0.9929957 0.9999288 -0.9949422 0.9929957 0.9999288 -0.9957887 0.9929957 0.9999288 -0.9968597 0.9929957 0.9999288 -0.9982146 0.9929957 0.9999288 -0.9999288 0.9929957 0.9999288 -0.9999437 0.9942488 0.9985868 -0.9917501 0.9933267 0.9999288 -0.9917501 0.9933267 0.9999288 -0.9917501 0.9933267 0.9999288 -0.9917501 0.9933267 0.9999288 -0.9917501 0.9933267 0.9999288 -0.9917501 0.9933267 0.9999288 -0.99175 0.9933266 0.9999288 -0.99175 0.9933266 0.9999288 -0.99175 0.9933266 0.9999288 -0.99175 0.9933265 0.9999288 -0.99175 0.9933265 0.9999288 -0.9917499 0.9933264 0.9999288 -0.9917499 0.9933263 0.9999288 -0.9917499 0.9933263 0.9999288 -0.9917499 0.9933262 0.9999288 -0.99175 0.9933261 0.9999288 -0.9917502 0.9933261 0.9999288 -0.9917504 0.9933261 0.9999288 -0.9917507 0.9933261 0.9999288 -0.991751 0.9933261 0.9999288 -0.9917515 0.9933261 0.9999288 -0.9917521 0.9933261 0.9999288 -0.9917528 0.9933261 0.9999288 -0.9917537 0.9933261 0.9999288 -0.9917549 0.9933261 0.9999288 -0.9917564 0.9933261 0.9999288 -0.9917582 0.9933261 0.9999288 -0.9917606 0.9933261 0.9999288 -0.9917636 0.9933261 0.9999288 -0.9917674 0.9933261 0.9999288 -0.9917722 0.9933261 0.9999288 -0.9917782 0.9933261 0.9999288 -0.9917859 0.9933261 0.9999288 -0.9917956 0.9933261 0.9999288 -0.9918079 0.9933261 0.9999288 -0.9918234 0.9933261 0.9999288 -0.9918431 0.9933261 0.9999288 -0.991868 0.9933261 0.9999288 -0.9918994 0.9933261 0.9999288 -0.9919392 0.9933261 0.9999288 -0.9919896 0.9933261 0.9999288 -0.9920533 0.9933261 0.9999288 -0.9921339 0.9933261 0.9999288 -0.9922358 0.9933261 0.9999288 -0.9923648 0.9933261 0.9999288 -0.992528 0.9933261 0.9999288 -0.9927345 0.9933261 0.9999288 -0.9929957 0.9933261 0.9999288 -0.9933261 0.9933261 0.9999288 -0.9937442 0.9933261 0.9999288 -0.9942731 0.9933261 0.9999288 -0.9949422 0.9933261 0.9999288 -0.9957887 0.9933261 0.9999288 -0.9968597 0.9933261 0.9999288 -0.9982146 0.9933261 0.9999288 -0.9999288 0.9933261 0.9999288 -0.9999437 0.9944556 0.9985868 -0.9917501 0.9937448 0.9999288 -0.9917501 0.9937448 0.9999288 -0.9917501 0.9937447 0.9999288 -0.9917501 0.9937447 0.9999288 -0.9917501 0.9937447 0.9999288 -0.9917501 0.9937447 0.9999288 -0.99175 0.9937447 0.9999288 -0.99175 0.9937446 0.9999288 -0.99175 0.9937446 0.9999288 -0.99175 0.9937446 0.9999288 -0.99175 0.9937445 0.9999288 -0.9917499 0.9937445 0.9999288 -0.9917499 0.9937444 0.9999288 -0.9917499 0.9937443 0.9999288 -0.9917499 0.9937442 0.9999288 -0.99175 0.9937442 0.9999288 -0.9917502 0.9937442 0.9999288 -0.9917504 0.9937442 0.9999288 -0.9917507 0.9937442 0.9999288 -0.991751 0.9937442 0.9999288 -0.9917515 0.9937442 0.9999288 -0.9917521 0.9937442 0.9999288 -0.9917528 0.9937442 0.9999288 -0.9917537 0.9937442 0.9999288 -0.9917549 0.9937442 0.9999288 -0.9917564 0.9937442 0.9999288 -0.9917582 0.9937442 0.9999288 -0.9917606 0.9937442 0.9999288 -0.9917636 0.9937442 0.9999288 -0.9917674 0.9937442 0.9999288 -0.9917722 0.9937442 0.9999288 -0.9917782 0.9937442 0.9999288 -0.9917859 0.9937442 0.9999288 -0.9917956 0.9937442 0.9999288 -0.9918079 0.9937442 0.9999288 -0.9918234 0.9937442 0.9999288 -0.9918431 0.9937442 0.9999288 -0.991868 0.9937442 0.9999288 -0.9918994 0.9937442 0.9999288 -0.9919392 0.9937442 0.9999288 -0.9919896 0.9937442 0.9999288 -0.9920533 0.9937442 0.9999288 -0.9921339 0.9937442 0.9999288 -0.9922358 0.9937442 0.9999288 -0.9923648 0.9937442 0.9999288 -0.992528 0.9937442 0.9999288 -0.9927345 0.9937442 0.9999288 -0.9929957 0.9937442 0.9999288 -0.9933261 0.9937442 0.9999288 -0.9937442 0.9937442 0.9999288 -0.9942731 0.9937442 0.9999288 -0.9949422 0.9937442 0.9999288 -0.9957887 0.9937442 0.9999288 -0.9968597 0.9937442 0.9999288 -0.9982146 0.9937442 0.9999288 -0.9999288 0.9937442 0.9999288 -0.9999437 0.9947172 0.9985868 -0.9917501 0.9942736 0.9999288 -0.9917501 0.9942736 0.9999288 -0.9917501 0.9942736 0.9999288 -0.9917501 0.9942736 0.9999288 -0.9917501 0.9942736 0.9999288 -0.9917501 0.9942736 0.9999288 -0.99175 0.9942735 0.9999288 -0.99175 0.9942735 0.9999288 -0.99175 0.9942735 0.9999288 -0.99175 0.9942734 0.9999288 -0.99175 0.9942734 0.9999288 -0.9917499 0.9942733 0.9999288 -0.9917499 0.9942733 0.9999288 -0.9917499 0.9942732 0.9999288 -0.9917499 0.9942731 0.9999288 -0.99175 0.9942731 0.9999288 -0.9917502 0.9942731 0.9999288 -0.9917504 0.9942731 0.9999288 -0.9917507 0.9942731 0.9999288 -0.991751 0.9942731 0.9999288 -0.9917515 0.9942731 0.9999288 -0.9917521 0.9942731 0.9999288 -0.9917528 0.9942731 0.9999288 -0.9917537 0.9942731 0.9999288 -0.9917549 0.9942731 0.9999288 -0.9917564 0.9942731 0.9999288 -0.9917582 0.9942731 0.9999288 -0.9917606 0.9942731 0.9999288 -0.9917636 0.9942731 0.9999288 -0.9917674 0.9942731 0.9999288 -0.9917722 0.9942731 0.9999288 -0.9917782 0.9942731 0.9999288 -0.9917859 0.9942731 0.9999288 -0.9917956 0.9942731 0.9999288 -0.9918079 0.9942731 0.9999288 -0.9918234 0.9942731 0.9999288 -0.9918431 0.9942731 0.9999288 -0.991868 0.9942731 0.9999288 -0.9918994 0.9942731 0.9999288 -0.9919392 0.9942731 0.9999288 -0.9919896 0.9942731 0.9999288 -0.9920533 0.9942731 0.9999288 -0.9921339 0.9942731 0.9999288 -0.9922358 0.9942731 0.9999288 -0.9923648 0.9942731 0.9999288 -0.992528 0.9942731 0.9999288 -0.9927345 0.9942731 0.9999288 -0.9929957 0.9942731 0.9999288 -0.9933261 0.9942731 0.9999288 -0.9937442 0.9942731 0.9999288 -0.9942731 0.9942731 0.9999288 -0.9949422 0.9942731 0.9999288 -0.9957887 0.9942731 0.9999288 -0.9968597 0.9942731 0.9999288 -0.9982146 0.9942731 0.9999288 -0.9999288 0.9942731 0.9999288 -0.9999437 0.9950481 0.9985868 -0.9917501 0.9949427 0.9999288 -0.9917501 0.9949427 0.9999288 -0.9917501 0.9949427 0.9999288 -0.9917501 0.9949426 0.9999288 -0.9917501 0.9949426 0.9999288 -0.9917501 0.9949426 0.9999288 -0.99175 0.9949426 0.9999288 -0.99175 0.9949426 0.9999288 -0.99175 0.9949426 0.9999288 -0.99175 0.9949425 0.9999288 -0.99175 0.9949425 0.9999288 -0.9917499 0.9949424 0.9999288 -0.9917499 0.9949424 0.9999288 -0.9917499 0.9949423 0.9999288 -0.9917499 0.9949423 0.9999288 -0.99175 0.9949422 0.9999288 -0.9917502 0.9949422 0.9999288 -0.9917504 0.9949422 0.9999288 -0.9917507 0.9949422 0.9999288 -0.991751 0.9949422 0.9999288 -0.9917515 0.9949422 0.9999288 -0.9917521 0.9949422 0.9999288 -0.9917528 0.9949422 0.9999288 -0.9917537 0.9949422 0.9999288 -0.9917549 0.9949422 0.9999288 -0.9917564 0.9949422 0.9999288 -0.9917582 0.9949422 0.9999288 -0.9917606 0.9949422 0.9999288 -0.9917636 0.9949422 0.9999288 -0.9917674 0.9949422 0.9999288 -0.9917722 0.9949422 0.9999288 -0.9917782 0.9949422 0.9999288 -0.9917859 0.9949422 0.9999288 -0.9917956 0.9949422 0.9999288 -0.9918079 0.9949422 0.9999288 -0.9918234 0.9949422 0.9999288 -0.9918431 0.9949422 0.9999288 -0.991868 0.9949422 0.9999288 -0.9918994 0.9949422 0.9999288 -0.9919392 0.9949422 0.9999288 -0.9919896 0.9949422 0.9999288 -0.9920533 0.9949422 0.9999288 -0.9921339 0.9949422 0.9999288 -0.9922358 0.9949422 0.9999288 -0.9923648 0.9949422 0.9999288 -0.992528 0.9949422 0.9999288 -0.9927345 0.9949422 0.9999288 -0.9929957 0.9949422 0.9999288 -0.9933261 0.9949422 0.9999288 -0.9937442 0.9949422 0.9999288 -0.9942731 0.9949422 0.9999288 -0.9949422 0.9949422 0.9999288 -0.9957887 0.9949422 0.9999288 -0.9968597 0.9949422 0.9999288 -0.9982146 0.9949422 0.9999288 -0.9999288 0.9949422 0.9999288 -0.9999437 0.9954668 0.9985868 -0.9917501 0.9957891 0.9999288 -0.9917501 0.9957891 0.9999288 -0.9917501 0.9957891 0.9999288 -0.9917501 0.9957891 0.9999288 -0.9917501 0.9957891 0.9999288 -0.9917501 0.9957891 0.9999288 -0.99175 0.9957891 0.9999288 -0.99175 0.9957891 0.9999288 -0.99175 0.995789 0.9999288 -0.99175 0.995789 0.9999288 -0.99175 0.995789 0.9999288 -0.9917499 0.9957889 0.9999288 -0.9917499 0.9957889 0.9999288 -0.9917499 0.9957888 0.9999288 -0.9917499 0.9957888 0.9999288 -0.99175 0.9957887 0.9999288 -0.9917502 0.9957887 0.9999288 -0.9917504 0.9957887 0.9999288 -0.9917507 0.9957887 0.9999288 -0.991751 0.9957887 0.9999288 -0.9917515 0.9957887 0.9999288 -0.9917521 0.9957887 0.9999288 -0.9917528 0.9957887 0.9999288 -0.9917537 0.9957887 0.9999288 -0.9917549 0.9957887 0.9999288 -0.9917564 0.9957887 0.9999288 -0.9917582 0.9957887 0.9999288 -0.9917606 0.9957887 0.9999288 -0.9917636 0.9957887 0.9999288 -0.9917674 0.9957887 0.9999288 -0.9917722 0.9957887 0.9999288 -0.9917782 0.9957887 0.9999288 -0.9917859 0.9957887 0.9999288 -0.9917956 0.9957887 0.9999288 -0.9918079 0.9957887 0.9999288 -0.9918234 0.9957887 0.9999288 -0.9918431 0.9957887 0.9999288 -0.991868 0.9957887 0.9999288 -0.9918994 0.9957887 0.9999288 -0.9919392 0.9957887 0.9999288 -0.9919896 0.9957887 0.9999288 -0.9920533 0.9957887 0.9999288 -0.9921339 0.9957887 0.9999288 -0.9922358 0.9957887 0.9999288 -0.9923648 0.9957887 0.9999288 -0.992528 0.9957887 0.9999288 -0.9927345 0.9957887 0.9999288 -0.9929957 0.9957887 0.9999288 -0.9933261 0.9957887 0.9999288 -0.9937442 0.9957887 0.9999288 -0.9942731 0.9957887 0.9999288 -0.9949422 0.9957887 0.9999288 -0.9957887 0.9957887 0.9999288 -0.9968597 0.9957887 0.9999288 -0.9982146 0.9957887 0.9999288 -0.9999288 0.9957887 0.9999288 -0.9999437 0.9959964 0.9985868 -0.9917501 0.99686 0.9999288 -0.9917501 0.99686 0.9999288 -0.9917501 0.99686 0.9999288 -0.9917501 0.99686 0.9999288 -0.9917501 0.99686 0.9999288 -0.9917501 0.99686 0.9999288 -0.99175 0.99686 0.9999288 -0.99175 0.9968599 0.9999288 -0.99175 0.9968599 0.9999288 -0.99175 0.9968599 0.9999288 -0.99175 0.9968599 0.9999288 -0.9917499 0.9968599 0.9999288 -0.9917499 0.9968598 0.9999288 -0.9917499 0.9968598 0.9999288 -0.9917499 0.9968597 0.9999288 -0.99175 0.9968597 0.9999288 -0.9917502 0.9968597 0.9999288 -0.9917504 0.9968597 0.9999288 -0.9917507 0.9968597 0.9999288 -0.991751 0.9968597 0.9999288 -0.9917515 0.9968597 0.9999288 -0.9917521 0.9968597 0.9999288 -0.9917528 0.9968597 0.9999288 -0.9917537 0.9968597 0.9999288 -0.9917549 0.9968597 0.9999288 -0.9917564 0.9968597 0.9999288 -0.9917582 0.9968597 0.9999288 -0.9917606 0.9968597 0.9999288 -0.9917636 0.9968597 0.9999288 -0.9917674 0.9968597 0.9999288 -0.9917722 0.9968597 0.9999288 -0.9917782 0.9968597 0.9999288 -0.9917859 0.9968597 0.9999288 -0.9917956 0.9968597 0.9999288 -0.9918079 0.9968597 0.9999288 -0.9918234 0.9968597 0.9999288 -0.9918431 0.9968597 0.9999288 -0.991868 0.9968597 0.9999288 -0.9918994 0.9968597 0.9999288 -0.9919392 0.9968597 0.9999288 -0.9919896 0.9968597 0.9999288 -0.9920533 0.9968597 0.9999288 -0.9921339 0.9968597 0.9999288 -0.9922358 0.9968597 0.9999288 -0.9923648 0.9968597 0.9999288 -0.992528 0.9968597 0.9999288 -0.9927345 0.9968597 0.9999288 -0.9929957 0.9968597 0.9999288 -0.9933261 0.9968597 0.9999288 -0.9937442 0.9968597 0.9999288 -0.9942731 0.9968597 0.9999288 -0.9949422 0.9968597 0.9999288 -0.9957887 0.9968597 0.9999288 -0.9968597 0.9968597 0.9999288 -0.9982146 0.9968597 0.9999288 -0.9999288 0.9968597 0.9999288 -0.9999437 0.9966665 0.9985868 -0.9917501 0.9982148 0.9999288 -0.9917501 0.9982148 0.9999288 -0.9917501 0.9982148 0.9999288 -0.9917501 0.9982148 0.9999288 -0.9917501 0.9982148 0.9999288 -0.9917501 0.9982148 0.9999288 -0.99175 0.9982148 0.9999288 -0.99175 0.9982148 0.9999288 -0.99175 0.9982148 0.9999288 -0.99175 0.9982147 0.9999288 -0.99175 0.9982147 0.9999288 -0.9917499 0.9982147 0.9999288 -0.9917499 0.9982147 0.9999288 -0.9917499 0.9982147 0.9999288 -0.9917499 0.9982147 0.9999288 -0.99175 0.9982146 0.9999288 -0.9917502 0.9982146 0.9999288 -0.9917504 0.9982146 0.9999288 -0.9917507 0.9982146 0.9999288 -0.991751 0.9982146 0.9999288 -0.9917515 0.9982146 0.9999288 -0.9917521 0.9982146 0.9999288 -0.9917528 0.9982146 0.9999288 -0.9917537 0.9982146 0.9999288 -0.9917549 0.9982146 0.9999288 -0.9917564 0.9982146 0.9999288 -0.9917582 0.9982146 0.9999288 -0.9917606 0.9982146 0.9999288 -0.9917636 0.9982146 0.9999288 -0.9917674 0.9982146 0.9999288 -0.9917722 0.9982146 0.9999288 -0.9917782 0.9982146 0.9999288 -0.9917859 0.9982146 0.9999288 -0.9917956 0.9982146 0.9999288 -0.9918079 0.9982146 0.9999288 -0.9918234 0.9982146 0.9999288 -0.9918431 0.9982146 0.9999288 -0.991868 0.9982146 0.9999288 -0.9918994 0.9982146 0.9999288 -0.9919392 0.9982146 0.9999288 -0.9919896 0.9982146 0.9999288 -0.9920533 0.9982146 0.9999288 -0.9921339 0.9982146 0.9999288 -0.9922358 0.9982146 0.9999288 -0.9923648 0.9982146 0.9999288 -0.992528 0.9982146 0.9999288 -0.9927345 0.9982146 0.9999288 -0.9929957 0.9982146 0.9999288 -0.9933261 0.9982146 0.9999288 -0.9937442 0.9982146 0.9999288 -0.9942731 0.9982146 0.9999288 -0.9949422 0.9982146 0.9999288 -0.9957887 0.9982146 0.9999288 -0.9968597 0.9982146 0.9999288 -0.9982146 0.9982146 0.9999288 -0.9999288 0.9982146 0.9999288 -0.9999437 0.9975143 0.9985868 -0.9917501 0.9999288 0.9999288 -0.9917501 0.9999288 0.9999288 -0.9917501 0.9999288 0.9999288 -0.9917501 0.9999288 0.9999288 -0.9917501 0.9999288 0.9999288 -0.9917501 0.9999288 0.9999288 -0.99175 0.9999288 0.9999288 -0.99175 0.9999288 0.9999288 -0.99175 0.9999288 0.9999288 -0.99175 0.9999288 0.9999288 -0.99175 0.9999288 0.9999288 -0.9917499 0.9999288 0.9999288 -0.9917499 0.9999288 0.9999288 -0.9917499 0.9999288 0.9999288 -0.9917499 0.9999288 0.9999288 -0.99175 0.9999288 0.9999288 -0.9917502 0.9999288 0.9999288 -0.9917504 0.9999288 0.9999288 -0.9917507 0.9999288 0.9999288 -0.991751 0.9999288 0.9999288 -0.9917515 0.9999288 0.9999288 -0.9917521 0.9999288 0.9999288 -0.9917528 0.9999288 0.9999288 -0.9917537 0.9999288 0.9999288 -0.9917549 0.9999288 0.9999288 -0.9917564 0.9999288 0.9999288 -0.9917582 0.9999288 0.9999288 -0.9917606 0.9999288 0.9999288 -0.9917636 0.9999288 0.9999288 -0.9917674 0.9999288 0.9999288 -0.9917722 0.9999288 0.9999288 -0.9917782 0.9999288 0.9999288 -0.9917859 0.9999288 0.9999288 -0.9917956 0.9999288 0.9999288 -0.9918079 0.9999288 0.9999288 -0.9918234 0.9999288 0.9999288 -0.9918431 0.9999288 0.9999288 -0.991868 0.9999288 0.9999288 -0.9918994 0.9999288 0.9999288 -0.9919392 0.9999288 0.9999288 -0.9919896 0.9999288 0.9999288 -0.9920533 0.9999288 0.9999288 -0.9921339 0.9999288 0.9999288 -0.9922358 0.9999288 0.9999288 -0.9923648 0.9999288 0.9999288 -0.992528 0.9999288 0.9999288 -0.9927345 0.9999288 0.9999288 -0.9929957 0.9999288 0.9999288 -0.9933261 0.9999288 0.9999288 -0.9937442 0.9999288 0.9999288 -0.9942731 0.9999288 0.9999288 -0.9949422 0.9999288 0.9999288 -0.9957887 0.9999288 0.9999288 -0.9968597 0.9999288 0.9999288 -0.9982146 0.9999288 0.9999288 -0.9999288 0.9999288 0.9999288 -0.9999437 0.9985868 0.9985868 -0.9934695 0.9999437 0.9985869 -0.9934695 0.9999437 0.9985869 -0.9934695 0.9999437 0.9985869 -0.9934695 0.9999437 0.9985869 -0.9934695 0.9999437 0.9985869 -0.9934695 0.9999437 0.9985869 -0.9934695 0.9999437 0.9985869 -0.9934694 0.9999437 0.9985869 -0.9934694 0.9999437 0.9985869 -0.9934694 0.9999437 0.9985869 -0.9934694 0.9999437 0.9985869 -0.9934694 0.9999437 0.9985869 -0.9934694 0.9999437 0.9985869 -0.9934694 0.9999437 0.9985869 -0.9934694 0.9999437 0.9985868 -0.9934694 0.9999437 0.9985868 -0.9934695 0.9999437 0.9985868 -0.9934697 0.9999437 0.9985868 -0.9934698 0.9999437 0.9985868 -0.9934701 0.9999437 0.9985868 -0.9934704 0.9999437 0.9985868 -0.9934707 0.9999437 0.9985868 -0.9934712 0.9999437 0.9985868 -0.9934718 0.9999437 0.9985868 -0.9934725 0.9999437 0.9985868 -0.9934734 0.9999437 0.9985868 -0.9934746 0.9999437 0.9985868 -0.9934761 0.9999437 0.9985868 -0.9934779 0.9999437 0.9985868 -0.9934803 0.9999437 0.9985868 -0.9934833 0.9999437 0.9985868 -0.9934871 0.9999437 0.9985868 -0.9934919 0.9999437 0.9985868 -0.993498 0.9999437 0.9985868 -0.9935057 0.9999437 0.9985868 -0.9935154 0.9999437 0.9985868 -0.9935277 0.9999437 0.9985868 -0.9935432 0.9999437 0.9985868 -0.9935629 0.9999437 0.9985868 -0.9935878 0.9999437 0.9985868 -0.9936193 0.9999437 0.9985868 -0.9936592 0.9999437 0.9985868 -0.9937096 0.9999437 0.9985868 -0.9937734 0.9999437 0.9985868 -0.9938541 0.9999437 0.9985868 -0.9939562 0.9999437 0.9985868 -0.9940854 0.9999437 0.9985868 -0.9942488 0.9999437 0.9985868 -0.9944556 0.9999437 0.9985868 -0.9947172 0.9999437 0.9985868 -0.9950481 0.9999437 0.9985868 -0.9954668 0.9999437 0.9985868 -0.9959964 0.9999437 0.9985868 -0.9966665 0.9999437 0.9985868 -0.9975143 0.9999437 0.9985868 -0.9985868 0.9999437 0.9985868 -0.9999437 0.9999437 0.9985868 -0.9934695 0.9934695 0.9999437 -0.9934695 0.9934695 0.9999437 -0.9934695 0.9934695 0.9999437 -0.9934695 0.9934695 0.9999437 -0.9934695 0.9934695 0.9999437 -0.9934695 0.9934695 0.9999437 -0.9934695 0.9934695 0.9999437 -0.9934695 0.9934695 0.9999437 -0.9934696 0.9934695 0.9999437 -0.9934696 0.9934695 0.9999437 -0.9934696 0.9934695 0.9999437 -0.9934696 0.9934695 0.9999437 -0.9934697 0.9934695 0.9999437 -0.9934697 0.9934695 0.9999437 -0.9934698 0.9934695 0.9999437 -0.9934699 0.9934695 0.9999437 -0.99347 0.9934695 0.9999437 -0.9934701 0.9934695 0.9999437 -0.9934703 0.9934695 0.9999437 -0.9934706 0.9934695 0.9999437 -0.9934708 0.9934695 0.9999437 -0.9934712 0.9934695 0.9999437 -0.9934717 0.9934695 0.9999437 -0.9934722 0.9934695 0.9999437 -0.993473 0.9934695 0.9999437 -0.9934739 0.9934695 0.9999437 -0.9934751 0.9934695 0.9999437 -0.9934765 0.9934695 0.9999437 -0.9934784 0.9934695 0.9999437 -0.9934808 0.9934695 0.9999437 -0.9934838 0.9934695 0.9999437 -0.9934876 0.9934695 0.9999437 -0.9934924 0.9934695 0.9999437 -0.9934985 0.9934695 0.9999437 -0.9935061 0.9934695 0.9999437 -0.9935159 0.9934695 0.9999437 -0.9935282 0.9934695 0.9999437 -0.9935437 0.9934695 0.9999437 -0.9935634 0.9934695 0.9999437 -0.9935883 0.9934695 0.9999437 -0.9936198 0.9934695 0.9999437 -0.9936597 0.9934695 0.9999437 -0.9937101 0.9934695 0.9999437 -0.9937739 0.9934695 0.9999437 -0.9938546 0.9934695 0.9999437 -0.9939567 0.9934695 0.9999437 -0.9940858 0.9934695 0.9999437 -0.9942493 0.9934695 0.9999437 -0.994456 0.9934695 0.9999437 -0.9947176 0.9934695 0.9999437 -0.9950485 0.9934695 0.9999437 -0.9954671 0.9934695 0.9999437 -0.9959967 0.9934695 0.9999437 -0.9966668 0.9934695 0.9999437 -0.9975145 0.9934695 0.9999437 -0.9985869 0.9934695 0.9999437 -0.9999437 0.9934695 0.9999437 -0.9934695 0.9934695 0.9999437 -0.9934695 0.9934695 0.9999437 -0.9934695 0.9934695 0.9999437 -0.9934695 0.9934695 0.9999437 -0.9934695 0.9934695 0.9999437 -0.9934695 0.9934695 0.9999437 -0.9934695 0.9934695 0.9999437 -0.9934695 0.9934695 0.9999437 -0.9934695 0.9934695 0.9999437 -0.9934696 0.9934695 0.9999437 -0.9934696 0.9934695 0.9999437 -0.9934696 0.9934695 0.9999437 -0.9934697 0.9934695 0.9999437 -0.9934697 0.9934695 0.9999437 -0.9934698 0.9934695 0.9999437 -0.9934699 0.9934695 0.9999437 -0.99347 0.9934695 0.9999437 -0.9934701 0.9934695 0.9999437 -0.9934703 0.9934695 0.9999437 -0.9934705 0.9934695 0.9999437 -0.9934708 0.9934695 0.9999437 -0.9934712 0.9934695 0.9999437 -0.9934716 0.9934695 0.9999437 -0.9934722 0.9934695 0.9999437 -0.993473 0.9934695 0.9999437 -0.9934739 0.9934695 0.9999437 -0.9934751 0.9934695 0.9999437 -0.9934765 0.9934695 0.9999437 -0.9934784 0.9934695 0.9999437 -0.9934808 0.9934695 0.9999437 -0.9934838 0.9934695 0.9999437 -0.9934876 0.9934695 0.9999437 -0.9934924 0.9934695 0.9999437 -0.9934984 0.9934695 0.9999437 -0.9935061 0.9934695 0.9999437 -0.9935159 0.9934695 0.9999437 -0.9935281 0.9934695 0.9999437 -0.9935437 0.9934695 0.9999437 -0.9935634 0.9934695 0.9999437 -0.9935883 0.9934695 0.9999437 -0.9936198 0.9934695 0.9999437 -0.9936596 0.9934695 0.9999437 -0.9937101 0.9934695 0.9999437 -0.9937739 0.9934695 0.9999437 -0.9938546 0.9934695 0.9999437 -0.9939567 0.9934695 0.9999437 -0.9940858 0.9934695 0.9999437 -0.9942492 0.9934695 0.9999437 -0.994456 0.9934695 0.9999437 -0.9947176 0.9934695 0.9999437 -0.9950485 0.9934695 0.9999437 -0.9954671 0.9934695 0.9999437 -0.9959967 0.9934695 0.9999437 -0.9966668 0.9934695 0.9999437 -0.9975145 0.9934695 0.9999437 -0.9985869 0.9934695 0.9999437 -0.9999437 0.9934695 0.9999437 -0.9934695 0.9934695 0.9999437 -0.9934695 0.9934695 0.9999437 -0.9934695 0.9934695 0.9999437 -0.9934695 0.9934695 0.9999437 -0.9934695 0.9934695 0.9999437 -0.9934695 0.9934695 0.9999437 -0.9934695 0.9934695 0.9999437 -0.9934695 0.9934695 0.9999437 -0.9934695 0.9934695 0.9999437 -0.9934696 0.9934695 0.9999437 -0.9934696 0.9934695 0.9999437 -0.9934696 0.9934695 0.9999437 -0.9934697 0.9934695 0.9999437 -0.9934697 0.9934695 0.9999437 -0.9934698 0.9934695 0.9999437 -0.9934699 0.9934695 0.9999437 -0.99347 0.9934695 0.9999437 -0.9934701 0.9934695 0.9999437 -0.9934703 0.9934695 0.9999437 -0.9934705 0.9934695 0.9999437 -0.9934708 0.9934695 0.9999437 -0.9934712 0.9934695 0.9999437 -0.9934716 0.9934695 0.9999437 -0.9934722 0.9934695 0.9999437 -0.993473 0.9934695 0.9999437 -0.9934739 0.9934695 0.9999437 -0.993475 0.9934695 0.9999437 -0.9934765 0.9934695 0.9999437 -0.9934784 0.9934695 0.9999437 -0.9934808 0.9934695 0.9999437 -0.9934838 0.9934695 0.9999437 -0.9934876 0.9934695 0.9999437 -0.9934924 0.9934695 0.9999437 -0.9934984 0.9934695 0.9999437 -0.9935061 0.9934695 0.9999437 -0.9935158 0.9934695 0.9999437 -0.9935281 0.9934695 0.9999437 -0.9935437 0.9934695 0.9999437 -0.9935634 0.9934695 0.9999437 -0.9935883 0.9934695 0.9999437 -0.9936198 0.9934695 0.9999437 -0.9936596 0.9934695 0.9999437 -0.9937101 0.9934695 0.9999437 -0.9937739 0.9934695 0.9999437 -0.9938546 0.9934695 0.9999437 -0.9939567 0.9934695 0.9999437 -0.9940858 0.9934695 0.9999437 -0.9942492 0.9934695 0.9999437 -0.994456 0.9934695 0.9999437 -0.9947175 0.9934695 0.9999437 -0.9950484 0.9934695 0.9999437 -0.9954671 0.9934695 0.9999437 -0.9959967 0.9934695 0.9999437 -0.9966668 0.9934695 0.9999437 -0.9975145 0.9934695 0.9999437 -0.9985869 0.9934695 0.9999437 -0.9999437 0.9934695 0.9999437 -0.9934695 0.9934695 0.9999437 -0.9934695 0.9934695 0.9999437 -0.9934695 0.9934695 0.9999437 -0.9934695 0.9934695 0.9999437 -0.9934695 0.9934695 0.9999437 -0.9934695 0.9934695 0.9999437 -0.9934695 0.9934695 0.9999437 -0.9934695 0.9934695 0.9999437 -0.9934695 0.9934695 0.9999437 -0.9934696 0.9934695 0.9999437 -0.9934696 0.9934695 0.9999437 -0.9934696 0.9934695 0.9999437 -0.9934697 0.9934695 0.9999437 -0.9934697 0.9934695 0.9999437 -0.9934698 0.9934695 0.9999437 -0.9934699 0.9934695 0.9999437 -0.99347 0.9934695 0.9999437 -0.9934701 0.9934695 0.9999437 -0.9934703 0.9934695 0.9999437 -0.9934705 0.9934695 0.9999437 -0.9934708 0.9934695 0.9999437 -0.9934712 0.9934695 0.9999437 -0.9934716 0.9934695 0.9999437 -0.9934722 0.9934695 0.9999437 -0.9934729 0.9934695 0.9999437 -0.9934739 0.9934695 0.9999437 -0.993475 0.9934695 0.9999437 -0.9934765 0.9934695 0.9999437 -0.9934784 0.9934695 0.9999437 -0.9934808 0.9934695 0.9999437 -0.9934838 0.9934695 0.9999437 -0.9934876 0.9934695 0.9999437 -0.9934924 0.9934695 0.9999437 -0.9934984 0.9934695 0.9999437 -0.9935061 0.9934695 0.9999437 -0.9935158 0.9934695 0.9999437 -0.9935281 0.9934695 0.9999437 -0.9935437 0.9934695 0.9999437 -0.9935634 0.9934695 0.9999437 -0.9935883 0.9934695 0.9999437 -0.9936198 0.9934695 0.9999437 -0.9936596 0.9934695 0.9999437 -0.9937101 0.9934695 0.9999437 -0.9937738 0.9934695 0.9999437 -0.9938545 0.9934695 0.9999437 -0.9939566 0.9934695 0.9999437 -0.9940858 0.9934695 0.9999437 -0.9942492 0.9934695 0.9999437 -0.994456 0.9934695 0.9999437 -0.9947175 0.9934695 0.9999437 -0.9950484 0.9934695 0.9999437 -0.9954671 0.9934695 0.9999437 -0.9959967 0.9934695 0.9999437 -0.9966668 0.9934695 0.9999437 -0.9975145 0.9934695 0.9999437 -0.9985869 0.9934695 0.9999437 -0.9999437 0.9934695 0.9999437 -0.9934695 0.9934695 0.9999437 -0.9934695 0.9934695 0.9999437 -0.9934695 0.9934695 0.9999437 -0.9934695 0.9934695 0.9999437 -0.9934695 0.9934695 0.9999437 -0.9934695 0.9934695 0.9999437 -0.9934695 0.9934695 0.9999437 -0.9934695 0.9934695 0.9999437 -0.9934695 0.9934695 0.9999437 -0.9934695 0.9934695 0.9999437 -0.9934696 0.9934695 0.9999437 -0.9934696 0.9934695 0.9999437 -0.9934696 0.9934695 0.9999437 -0.9934697 0.9934695 0.9999437 -0.9934698 0.9934695 0.9999437 -0.9934699 0.9934695 0.9999437 -0.99347 0.9934695 0.9999437 -0.9934701 0.9934695 0.9999437 -0.9934703 0.9934695 0.9999437 -0.9934705 0.9934695 0.9999437 -0.9934708 0.9934695 0.9999437 -0.9934712 0.9934695 0.9999437 -0.9934716 0.9934695 0.9999437 -0.9934722 0.9934695 0.9999437 -0.9934729 0.9934695 0.9999437 -0.9934739 0.9934695 0.9999437 -0.993475 0.9934695 0.9999437 -0.9934765 0.9934695 0.9999437 -0.9934784 0.9934695 0.9999437 -0.9934807 0.9934695 0.9999437 -0.9934837 0.9934695 0.9999437 -0.9934875 0.9934695 0.9999437 -0.9934923 0.9934695 0.9999437 -0.9934984 0.9934695 0.9999437 -0.9935061 0.9934695 0.9999437 -0.9935158 0.9934695 0.9999437 -0.9935281 0.9934695 0.9999437 -0.9935437 0.9934695 0.9999437 -0.9935634 0.9934695 0.9999437 -0.9935883 0.9934695 0.9999437 -0.9936198 0.9934695 0.9999437 -0.9936596 0.9934695 0.9999437 -0.99371 0.9934695 0.9999437 -0.9937738 0.9934695 0.9999437 -0.9938545 0.9934695 0.9999437 -0.9939566 0.9934695 0.9999437 -0.9940858 0.9934695 0.9999437 -0.9942492 0.9934695 0.9999437 -0.994456 0.9934695 0.9999437 -0.9947175 0.9934695 0.9999437 -0.9950484 0.9934695 0.9999437 -0.9954671 0.9934695 0.9999437 -0.9959967 0.9934695 0.9999437 -0.9966668 0.9934695 0.9999437 -0.9975145 0.9934695 0.9999437 -0.9985869 0.9934695 0.9999437 -0.9999437 0.9934695 0.9999437 -0.9934695 0.9934695 0.9999437 -0.9934695 0.9934695 0.9999437 -0.9934695 0.9934695 0.9999437 -0.9934695 0.9934695 0.9999437 -0.9934695 0.9934695 0.9999437 -0.9934695 0.9934695 0.9999437 -0.9934695 0.9934695 0.9999437 -0.9934695 0.9934695 0.9999437 -0.9934695 0.9934695 0.9999437 -0.9934695 0.9934695 0.9999437 -0.9934696 0.9934695 0.9999437 -0.9934696 0.9934695 0.9999437 -0.9934696 0.9934695 0.9999437 -0.9934697 0.9934695 0.9999437 -0.9934698 0.9934695 0.9999437 -0.9934698 0.9934695 0.9999437 -0.99347 0.9934695 0.9999437 -0.9934701 0.9934695 0.9999437 -0.9934703 0.9934695 0.9999437 -0.9934705 0.9934695 0.9999437 -0.9934708 0.9934695 0.9999437 -0.9934711 0.9934695 0.9999437 -0.9934716 0.9934695 0.9999437 -0.9934722 0.9934695 0.9999437 -0.9934729 0.9934695 0.9999437 -0.9934738 0.9934695 0.9999437 -0.993475 0.9934695 0.9999437 -0.9934765 0.9934695 0.9999437 -0.9934784 0.9934695 0.9999437 -0.9934807 0.9934695 0.9999437 -0.9934837 0.9934695 0.9999437 -0.9934875 0.9934695 0.9999437 -0.9934923 0.9934695 0.9999437 -0.9934984 0.9934695 0.9999437 -0.9935061 0.9934695 0.9999437 -0.9935158 0.9934695 0.9999437 -0.9935281 0.9934695 0.9999437 -0.9935437 0.9934695 0.9999437 -0.9935633 0.9934695 0.9999437 -0.9935882 0.9934695 0.9999437 -0.9936197 0.9934695 0.9999437 -0.9936596 0.9934695 0.9999437 -0.99371 0.9934695 0.9999437 -0.9937738 0.9934695 0.9999437 -0.9938545 0.9934695 0.9999437 -0.9939566 0.9934695 0.9999437 -0.9940858 0.9934695 0.9999437 -0.9942492 0.9934695 0.9999437 -0.994456 0.9934695 0.9999437 -0.9947175 0.9934695 0.9999437 -0.9950484 0.9934695 0.9999437 -0.9954671 0.9934695 0.9999437 -0.9959967 0.9934695 0.9999437 -0.9966668 0.9934695 0.9999437 -0.9975145 0.9934695 0.9999437 -0.9985869 0.9934695 0.9999437 -0.9999437 0.9934695 0.9999437 -0.9934695 0.9934695 0.9999437 -0.9934695 0.9934695 0.9999437 -0.9934695 0.9934695 0.9999437 -0.9934695 0.9934695 0.9999437 -0.9934695 0.9934695 0.9999437 -0.9934695 0.9934695 0.9999437 -0.9934695 0.9934695 0.9999437 -0.9934695 0.9934695 0.9999437 -0.9934695 0.9934695 0.9999437 -0.9934695 0.9934695 0.9999437 -0.9934695 0.9934695 0.9999437 -0.9934696 0.9934695 0.9999437 -0.9934696 0.9934695 0.9999437 -0.9934697 0.9934695 0.9999437 -0.9934697 0.9934695 0.9999437 -0.9934698 0.9934695 0.9999437 -0.9934699 0.9934695 0.9999437 -0.9934701 0.9934695 0.9999437 -0.9934703 0.9934695 0.9999437 -0.9934705 0.9934695 0.9999437 -0.9934708 0.9934695 0.9999437 -0.9934711 0.9934695 0.9999437 -0.9934716 0.9934695 0.9999437 -0.9934722 0.9934695 0.9999437 -0.9934729 0.9934695 0.9999437 -0.9934738 0.9934695 0.9999437 -0.993475 0.9934695 0.9999437 -0.9934765 0.9934695 0.9999437 -0.9934783 0.9934695 0.9999437 -0.9934807 0.9934695 0.9999437 -0.9934837 0.9934695 0.9999437 -0.9934875 0.9934695 0.9999437 -0.9934923 0.9934695 0.9999437 -0.9934984 0.9934695 0.9999437 -0.9935061 0.9934695 0.9999437 -0.9935158 0.9934695 0.9999437 -0.9935281 0.9934695 0.9999437 -0.9935436 0.9934695 0.9999437 -0.9935633 0.9934695 0.9999437 -0.9935882 0.9934695 0.9999437 -0.9936197 0.9934695 0.9999437 -0.9936596 0.9934695 0.9999437 -0.99371 0.9934695 0.9999437 -0.9937738 0.9934695 0.9999437 -0.9938545 0.9934695 0.9999437 -0.9939566 0.9934695 0.9999437 -0.9940858 0.9934695 0.9999437 -0.9942492 0.9934695 0.9999437 -0.9944559 0.9934695 0.9999437 -0.9947175 0.9934695 0.9999437 -0.9950484 0.9934695 0.9999437 -0.995467 0.9934695 0.9999437 -0.9959967 0.9934695 0.9999437 -0.9966667 0.9934695 0.9999437 -0.9975145 0.9934695 0.9999437 -0.9985869 0.9934695 0.9999437 -0.9999437 0.9934695 0.9999437 -0.9934695 0.9934695 0.9999437 -0.9934695 0.9934695 0.9999437 -0.9934695 0.9934695 0.9999437 -0.9934695 0.9934695 0.9999437 -0.9934695 0.9934695 0.9999437 -0.9934695 0.9934695 0.9999437 -0.9934695 0.9934695 0.9999437 -0.9934694 0.9934694 0.9999437 -0.9934695 0.9934694 0.9999437 -0.9934695 0.9934694 0.9999437 -0.9934695 0.9934694 0.9999437 -0.9934695 0.9934694 0.9999437 -0.9934696 0.9934694 0.9999437 -0.9934696 0.9934694 0.9999437 -0.9934697 0.9934694 0.9999437 -0.9934698 0.9934694 0.9999437 -0.9934699 0.9934694 0.9999437 -0.9934701 0.9934694 0.9999437 -0.9934702 0.9934694 0.9999437 -0.9934705 0.9934694 0.9999437 -0.9934707 0.9934694 0.9999437 -0.9934711 0.9934694 0.9999437 -0.9934716 0.9934694 0.9999437 -0.9934721 0.9934694 0.9999437 -0.9934729 0.9934694 0.9999437 -0.9934738 0.9934694 0.9999437 -0.993475 0.9934694 0.9999437 -0.9934764 0.9934694 0.9999437 -0.9934783 0.9934694 0.9999437 -0.9934807 0.9934694 0.9999437 -0.9934837 0.9934694 0.9999437 -0.9934875 0.9934694 0.9999437 -0.9934923 0.9934694 0.9999437 -0.9934984 0.9934694 0.9999437 -0.993506 0.9934694 0.9999437 -0.9935158 0.9934694 0.9999437 -0.9935281 0.9934694 0.9999437 -0.9935436 0.9934694 0.9999437 -0.9935633 0.9934694 0.9999437 -0.9935882 0.9934694 0.9999437 -0.9936197 0.9934694 0.9999437 -0.9936596 0.9934694 0.9999437 -0.99371 0.9934694 0.9999437 -0.9937738 0.9934694 0.9999437 -0.9938545 0.9934694 0.9999437 -0.9939566 0.9934694 0.9999437 -0.9940858 0.9934694 0.9999437 -0.9942492 0.9934694 0.9999437 -0.9944559 0.9934694 0.9999437 -0.9947175 0.9934694 0.9999437 -0.9950484 0.9934694 0.9999437 -0.995467 0.9934694 0.9999437 -0.9959967 0.9934694 0.9999437 -0.9966667 0.9934694 0.9999437 -0.9975144 0.9934694 0.9999437 -0.9985869 0.9934694 0.9999437 -0.9999437 0.9934694 0.9999437 -0.9934695 0.9934696 0.9999437 -0.9934695 0.9934695 0.9999437 -0.9934695 0.9934695 0.9999437 -0.9934695 0.9934695 0.9999437 -0.9934695 0.9934695 0.9999437 -0.9934695 0.9934695 0.9999437 -0.9934695 0.9934695 0.9999437 -0.9934694 0.9934695 0.9999437 -0.9934694 0.9934694 0.9999437 -0.9934695 0.9934694 0.9999437 -0.9934695 0.9934694 0.9999437 -0.9934695 0.9934694 0.9999437 -0.9934696 0.9934694 0.9999437 -0.9934696 0.9934694 0.9999437 -0.9934697 0.9934694 0.9999437 -0.9934698 0.9934694 0.9999437 -0.9934699 0.9934694 0.9999437 -0.99347 0.9934694 0.9999437 -0.9934702 0.9934694 0.9999437 -0.9934704 0.9934694 0.9999437 -0.9934707 0.9934694 0.9999437 -0.9934711 0.9934694 0.9999437 -0.9934715 0.9934694 0.9999437 -0.9934721 0.9934694 0.9999437 -0.9934728 0.9934694 0.9999437 -0.9934738 0.9934694 0.9999437 -0.9934749 0.9934694 0.9999437 -0.9934764 0.9934694 0.9999437 -0.9934783 0.9934694 0.9999437 -0.9934807 0.9934694 0.9999437 -0.9934837 0.9934694 0.9999437 -0.9934875 0.9934694 0.9999437 -0.9934923 0.9934694 0.9999437 -0.9934983 0.9934694 0.9999437 -0.993506 0.9934694 0.9999437 -0.9935157 0.9934694 0.9999437 -0.993528 0.9934694 0.9999437 -0.9935436 0.9934694 0.9999437 -0.9935633 0.9934694 0.9999437 -0.9935882 0.9934694 0.9999437 -0.9936197 0.9934694 0.9999437 -0.9936595 0.9934694 0.9999437 -0.99371 0.9934694 0.9999437 -0.9937737 0.9934694 0.9999437 -0.9938545 0.9934694 0.9999437 -0.9939566 0.9934694 0.9999437 -0.9940857 0.9934694 0.9999437 -0.9942491 0.9934694 0.9999437 -0.9944559 0.9934694 0.9999437 -0.9947175 0.9934694 0.9999437 -0.9950484 0.9934694 0.9999437 -0.995467 0.9934694 0.9999437 -0.9959967 0.9934694 0.9999437 -0.9966667 0.9934694 0.9999437 -0.9975144 0.9934694 0.9999437 -0.9985869 0.9934694 0.9999437 -0.9999437 0.9934694 0.9999437 -0.9934695 0.9934696 0.9999437 -0.9934695 0.9934696 0.9999437 -0.9934695 0.9934696 0.9999437 -0.9934695 0.9934696 0.9999437 -0.9934695 0.9934695 0.9999437 -0.9934695 0.9934695 0.9999437 -0.9934695 0.9934695 0.9999437 -0.9934694 0.9934695 0.9999437 -0.9934694 0.9934695 0.9999437 -0.9934694 0.9934694 0.9999437 -0.9934694 0.9934694 0.9999437 -0.9934695 0.9934694 0.9999437 -0.9934695 0.9934694 0.9999437 -0.9934696 0.9934694 0.9999437 -0.9934696 0.9934694 0.9999437 -0.9934697 0.9934694 0.9999437 -0.9934698 0.9934694 0.9999437 -0.99347 0.9934694 0.9999437 -0.9934702 0.9934694 0.9999437 -0.9934704 0.9934694 0.9999437 -0.9934707 0.9934694 0.9999437 -0.993471 0.9934694 0.9999437 -0.9934715 0.9934694 0.9999437 -0.9934721 0.9934694 0.9999437 -0.9934728 0.9934694 0.9999437 -0.9934737 0.9934694 0.9999437 -0.9934749 0.9934694 0.9999437 -0.9934764 0.9934694 0.9999437 -0.9934783 0.9934694 0.9999437 -0.9934806 0.9934694 0.9999437 -0.9934836 0.9934694 0.9999437 -0.9934874 0.9934694 0.9999437 -0.9934922 0.9934694 0.9999437 -0.9934983 0.9934694 0.9999437 -0.993506 0.9934694 0.9999437 -0.9935157 0.9934694 0.9999437 -0.993528 0.9934694 0.9999437 -0.9935436 0.9934694 0.9999437 -0.9935632 0.9934694 0.9999437 -0.9935881 0.9934694 0.9999437 -0.9936196 0.9934694 0.9999437 -0.9936595 0.9934694 0.9999437 -0.9937099 0.9934694 0.9999437 -0.9937737 0.9934694 0.9999437 -0.9938544 0.9934694 0.9999437 -0.9939565 0.9934694 0.9999437 -0.9940857 0.9934694 0.9999437 -0.9942491 0.9934694 0.9999437 -0.9944559 0.9934694 0.9999437 -0.9947174 0.9934694 0.9999437 -0.9950483 0.9934694 0.9999437 -0.995467 0.9934694 0.9999437 -0.9959966 0.9934694 0.9999437 -0.9966667 0.9934694 0.9999437 -0.9975144 0.9934694 0.9999437 -0.9985869 0.9934694 0.9999437 -0.9999437 0.9934694 0.9999437 -0.9934695 0.9934696 0.9999437 -0.9934695 0.9934696 0.9999437 -0.9934695 0.9934696 0.9999437 -0.9934695 0.9934696 0.9999437 -0.9934695 0.9934696 0.9999437 -0.9934695 0.9934696 0.9999437 -0.9934695 0.9934695 0.9999437 -0.9934694 0.9934695 0.9999437 -0.9934694 0.9934695 0.9999437 -0.9934694 0.9934694 0.9999437 -0.9934694 0.9934694 0.9999437 -0.9934694 0.9934694 0.9999437 -0.9934695 0.9934694 0.9999437 -0.9934695 0.9934694 0.9999437 -0.9934696 0.9934694 0.9999437 -0.9934697 0.9934694 0.9999437 -0.9934698 0.9934694 0.9999437 -0.9934699 0.9934694 0.9999437 -0.9934701 0.9934694 0.9999437 -0.9934703 0.9934694 0.9999437 -0.9934706 0.9934694 0.9999437 -0.993471 0.9934694 0.9999437 -0.9934715 0.9934694 0.9999437 -0.993472 0.9934694 0.9999437 -0.9934728 0.9934694 0.9999437 -0.9934737 0.9934694 0.9999437 -0.9934749 0.9934694 0.9999437 -0.9934763 0.9934694 0.9999437 -0.9934782 0.9934694 0.9999437 -0.9934806 0.9934694 0.9999437 -0.9934836 0.9934694 0.9999437 -0.9934874 0.9934694 0.9999437 -0.9934922 0.9934694 0.9999437 -0.9934983 0.9934694 0.9999437 -0.9935059 0.9934694 0.9999437 -0.9935157 0.9934694 0.9999437 -0.993528 0.9934694 0.9999437 -0.9935435 0.9934694 0.9999437 -0.9935632 0.9934694 0.9999437 -0.9935881 0.9934694 0.9999437 -0.9936196 0.9934694 0.9999437 -0.9936595 0.9934694 0.9999437 -0.9937099 0.9934694 0.9999437 -0.9937737 0.9934694 0.9999437 -0.9938544 0.9934694 0.9999437 -0.9939565 0.9934694 0.9999437 -0.9940857 0.9934694 0.9999437 -0.9942491 0.9934694 0.9999437 -0.9944558 0.9934694 0.9999437 -0.9947174 0.9934694 0.9999437 -0.9950483 0.9934694 0.9999437 -0.995467 0.9934694 0.9999437 -0.9959966 0.9934694 0.9999437 -0.9966667 0.9934694 0.9999437 -0.9975144 0.9934694 0.9999437 -0.9985869 0.9934694 0.9999437 -0.9999437 0.9934694 0.9999437 -0.9934695 0.9934696 0.9999437 -0.9934695 0.9934696 0.9999437 -0.9934695 0.9934696 0.9999437 -0.9934695 0.9934696 0.9999437 -0.9934695 0.9934696 0.9999437 -0.9934695 0.9934696 0.9999437 -0.9934695 0.9934696 0.9999437 -0.9934694 0.9934695 0.9999437 -0.9934694 0.9934695 0.9999437 -0.9934694 0.9934695 0.9999437 -0.9934694 0.9934694 0.9999437 -0.9934694 0.9934694 0.9999437 -0.9934694 0.9934694 0.9999437 -0.9934695 0.9934694 0.9999437 -0.9934696 0.9934694 0.9999437 -0.9934696 0.9934694 0.9999437 -0.9934698 0.9934694 0.9999437 -0.9934699 0.9934694 0.9999437 -0.9934701 0.9934694 0.9999437 -0.9934703 0.9934694 0.9999437 -0.9934706 0.9934694 0.9999437 -0.9934709 0.9934694 0.9999437 -0.9934714 0.9934694 0.9999437 -0.993472 0.9934694 0.9999437 -0.9934727 0.9934694 0.9999437 -0.9934736 0.9934694 0.9999437 -0.9934748 0.9934694 0.9999437 -0.9934763 0.9934694 0.9999437 -0.9934782 0.9934694 0.9999437 -0.9934805 0.9934694 0.9999437 -0.9934835 0.9934694 0.9999437 -0.9934873 0.9934694 0.9999437 -0.9934921 0.9934694 0.9999437 -0.9934982 0.9934694 0.9999437 -0.9935059 0.9934694 0.9999437 -0.9935156 0.9934694 0.9999437 -0.9935279 0.9934694 0.9999437 -0.9935435 0.9934694 0.9999437 -0.9935631 0.9934694 0.9999437 -0.993588 0.9934694 0.9999437 -0.9936196 0.9934694 0.9999437 -0.9936594 0.9934694 0.9999437 -0.9937098 0.9934694 0.9999437 -0.9937736 0.9934694 0.9999437 -0.9938543 0.9934694 0.9999437 -0.9939564 0.9934694 0.9999437 -0.9940856 0.9934694 0.9999437 -0.994249 0.9934694 0.9999437 -0.9944558 0.9934694 0.9999437 -0.9947174 0.9934694 0.9999437 -0.9950483 0.9934694 0.9999437 -0.9954669 0.9934694 0.9999437 -0.9959966 0.9934694 0.9999437 -0.9966666 0.9934694 0.9999437 -0.9975144 0.9934694 0.9999437 -0.9985869 0.9934694 0.9999437 -0.9999437 0.9934694 0.9999437 -0.9934695 0.9934697 0.9999437 -0.9934695 0.9934697 0.9999437 -0.9934695 0.9934697 0.9999437 -0.9934695 0.9934697 0.9999437 -0.9934695 0.9934696 0.9999437 -0.9934695 0.9934696 0.9999437 -0.9934695 0.9934696 0.9999437 -0.9934694 0.9934696 0.9999437 -0.9934694 0.9934696 0.9999437 -0.9934694 0.9934695 0.9999437 -0.9934694 0.9934695 0.9999437 -0.9934694 0.9934694 0.9999437 -0.9934694 0.9934694 0.9999437 -0.9934694 0.9934694 0.9999437 -0.9934695 0.9934694 0.9999437 -0.9934696 0.9934694 0.9999437 -0.9934697 0.9934694 0.9999437 -0.9934698 0.9934694 0.9999437 -0.99347 0.9934694 0.9999437 -0.9934702 0.9934694 0.9999437 -0.9934705 0.9934694 0.9999437 -0.9934709 0.9934694 0.9999437 -0.9934713 0.9934694 0.9999437 -0.9934719 0.9934694 0.9999437 -0.9934727 0.9934694 0.9999437 -0.9934736 0.9934694 0.9999437 -0.9934748 0.9934694 0.9999437 -0.9934762 0.9934694 0.9999437 -0.9934781 0.9934694 0.9999437 -0.9934805 0.9934694 0.9999437 -0.9934835 0.9934694 0.9999437 -0.9934873 0.9934694 0.9999437 -0.9934921 0.9934694 0.9999437 -0.9934981 0.9934694 0.9999437 -0.9935058 0.9934694 0.9999437 -0.9935156 0.9934694 0.9999437 -0.9935279 0.9934694 0.9999437 -0.9935434 0.9934694 0.9999437 -0.9935631 0.9934694 0.9999437 -0.993588 0.9934694 0.9999437 -0.9936195 0.9934694 0.9999437 -0.9936594 0.9934694 0.9999437 -0.9937098 0.9934694 0.9999437 -0.9937736 0.9934694 0.9999437 -0.9938543 0.9934694 0.9999437 -0.9939564 0.9934694 0.9999437 -0.9940856 0.9934694 0.9999437 -0.994249 0.9934694 0.9999437 -0.9944557 0.9934694 0.9999437 -0.9947173 0.9934694 0.9999437 -0.9950482 0.9934694 0.9999437 -0.9954669 0.9934694 0.9999437 -0.9959965 0.9934694 0.9999437 -0.9966666 0.9934694 0.9999437 -0.9975144 0.9934694 0.9999437 -0.9985869 0.9934694 0.9999437 -0.9999437 0.9934694 0.9999437 -0.9934695 0.9934697 0.9999437 -0.9934695 0.9934697 0.9999437 -0.9934695 0.9934697 0.9999437 -0.9934695 0.9934697 0.9999437 -0.9934695 0.9934697 0.9999437 -0.9934695 0.9934697 0.9999437 -0.9934695 0.9934697 0.9999437 -0.9934694 0.9934696 0.9999437 -0.9934694 0.9934696 0.9999437 -0.9934694 0.9934696 0.9999437 -0.9934694 0.9934695 0.9999437 -0.9934694 0.9934695 0.9999437 -0.9934694 0.9934694 0.9999437 -0.9934694 0.9934694 0.9999437 -0.9934694 0.9934694 0.9999437 -0.9934695 0.9934694 0.9999437 -0.9934696 0.9934694 0.9999437 -0.9934698 0.9934694 0.9999437 -0.99347 0.9934694 0.9999437 -0.9934702 0.9934694 0.9999437 -0.9934705 0.9934694 0.9999437 -0.9934708 0.9934694 0.9999437 -0.9934713 0.9934694 0.9999437 -0.9934719 0.9934694 0.9999437 -0.9934726 0.9934694 0.9999437 -0.9934735 0.9934694 0.9999437 -0.9934747 0.9934694 0.9999437 -0.9934762 0.9934694 0.9999437 -0.9934781 0.9934694 0.9999437 -0.9934804 0.9934694 0.9999437 -0.9934834 0.9934694 0.9999437 -0.9934872 0.9934694 0.9999437 -0.993492 0.9934694 0.9999437 -0.9934981 0.9934694 0.9999437 -0.9935058 0.9934694 0.9999437 -0.9935155 0.9934694 0.9999437 -0.9935278 0.9934694 0.9999437 -0.9935434 0.9934694 0.9999437 -0.993563 0.9934694 0.9999437 -0.9935879 0.9934694 0.9999437 -0.9936194 0.9934694 0.9999437 -0.9936593 0.9934694 0.9999437 -0.9937097 0.9934694 0.9999437 -0.9937735 0.9934694 0.9999437 -0.9938542 0.9934694 0.9999437 -0.9939563 0.9934694 0.9999437 -0.9940855 0.9934694 0.9999437 -0.9942489 0.9934694 0.9999437 -0.9944557 0.9934694 0.9999437 -0.9947173 0.9934694 0.9999437 -0.9950482 0.9934694 0.9999437 -0.9954668 0.9934694 0.9999437 -0.9959965 0.9934694 0.9999437 -0.9966666 0.9934694 0.9999437 -0.9975143 0.9934694 0.9999437 -0.9985869 0.9934694 0.9999437 -0.9999437 0.9934694 0.9999437 -0.9934695 0.9934698 0.9999437 -0.9934695 0.9934698 0.9999437 -0.9934695 0.9934698 0.9999437 -0.9934695 0.9934698 0.9999437 -0.9934695 0.9934698 0.9999437 -0.9934695 0.9934698 0.9999437 -0.9934695 0.9934697 0.9999437 -0.9934694 0.9934697 0.9999437 -0.9934694 0.9934697 0.9999437 -0.9934694 0.9934696 0.9999437 -0.9934694 0.9934696 0.9999437 -0.9934694 0.9934696 0.9999437 -0.9934694 0.9934695 0.9999437 -0.9934694 0.9934694 0.9999437 -0.9934694 0.9934694 0.9999437 -0.9934695 0.9934694 0.9999437 -0.9934696 0.9934694 0.9999437 -0.9934697 0.9934694 0.9999437 -0.9934699 0.9934694 0.9999437 -0.9934701 0.9934694 0.9999437 -0.9934704 0.9934694 0.9999437 -0.9934708 0.9934694 0.9999437 -0.9934712 0.9934694 0.9999437 -0.9934718 0.9934694 0.9999437 -0.9934725 0.9934694 0.9999437 -0.9934735 0.9934694 0.9999437 -0.9934746 0.9934694 0.9999437 -0.9934761 0.9934694 0.9999437 -0.993478 0.9934694 0.9999437 -0.9934804 0.9934694 0.9999437 -0.9934834 0.9934694 0.9999437 -0.9934872 0.9934694 0.9999437 -0.993492 0.9934694 0.9999437 -0.993498 0.9934694 0.9999437 -0.9935057 0.9934694 0.9999437 -0.9935154 0.9934694 0.9999437 -0.9935277 0.9934694 0.9999437 -0.9935433 0.9934694 0.9999437 -0.993563 0.9934694 0.9999437 -0.9935879 0.9934694 0.9999437 -0.9936194 0.9934694 0.9999437 -0.9936592 0.9934694 0.9999437 -0.9937097 0.9934694 0.9999437 -0.9937735 0.9934694 0.9999437 -0.9938542 0.9934694 0.9999437 -0.9939563 0.9934694 0.9999437 -0.9940855 0.9934694 0.9999437 -0.9942489 0.9934694 0.9999437 -0.9944556 0.9934694 0.9999437 -0.9947172 0.9934694 0.9999437 -0.9950481 0.9934694 0.9999437 -0.9954668 0.9934694 0.9999437 -0.9959965 0.9934694 0.9999437 -0.9966666 0.9934694 0.9999437 -0.9975143 0.9934694 0.9999437 -0.9985868 0.9934694 0.9999437 -0.9999437 0.9934694 0.9999437 -0.9934695 0.9934699 0.9999437 -0.9934695 0.9934699 0.9999437 -0.9934695 0.9934699 0.9999437 -0.9934695 0.9934699 0.9999437 -0.9934695 0.9934699 0.9999437 -0.9934695 0.9934698 0.9999437 -0.9934695 0.9934698 0.9999437 -0.9934694 0.9934698 0.9999437 -0.9934694 0.9934698 0.9999437 -0.9934694 0.9934697 0.9999437 -0.9934694 0.9934697 0.9999437 -0.9934694 0.9934696 0.9999437 -0.9934694 0.9934696 0.9999437 -0.9934694 0.9934695 0.9999437 -0.9934694 0.9934695 0.9999437 -0.9934694 0.9934694 0.9999437 -0.9934695 0.9934694 0.9999437 -0.9934697 0.9934694 0.9999437 -0.9934699 0.9934694 0.9999437 -0.9934701 0.9934694 0.9999437 -0.9934704 0.9934694 0.9999437 -0.9934707 0.9934694 0.9999437 -0.9934712 0.9934694 0.9999437 -0.9934718 0.9934694 0.9999437 -0.9934725 0.9934694 0.9999437 -0.9934734 0.9934694 0.9999437 -0.9934746 0.9934694 0.9999437 -0.9934761 0.9934694 0.9999437 -0.9934779 0.9934694 0.9999437 -0.9934803 0.9934694 0.9999437 -0.9934833 0.9934694 0.9999437 -0.9934871 0.9934694 0.9999437 -0.9934919 0.9934694 0.9999437 -0.993498 0.9934694 0.9999437 -0.9935057 0.9934694 0.9999437 -0.9935154 0.9934694 0.9999437 -0.9935277 0.9934694 0.9999437 -0.9935432 0.9934694 0.9999437 -0.9935629 0.9934694 0.9999437 -0.9935878 0.9934694 0.9999437 -0.9936193 0.9934694 0.9999437 -0.9936592 0.9934694 0.9999437 -0.9937096 0.9934694 0.9999437 -0.9937734 0.9934694 0.9999437 -0.9938541 0.9934694 0.9999437 -0.9939562 0.9934694 0.9999437 -0.9940854 0.9934694 0.9999437 -0.9942488 0.9934694 0.9999437 -0.9944556 0.9934694 0.9999437 -0.9947172 0.9934694 0.9999437 -0.9950481 0.9934694 0.9999437 -0.9954668 0.9934694 0.9999437 -0.9959964 0.9934694 0.9999437 -0.9966665 0.9934694 0.9999437 -0.9975143 0.9934694 0.9999437 -0.9985868 0.9934694 0.9999437 -0.9999437 0.9934694 0.9999437 -0.9934695 0.99347 0.9999437 -0.9934695 0.99347 0.9999437 -0.9934695 0.99347 0.9999437 -0.9934695 0.99347 0.9999437 -0.9934695 0.99347 0.9999437 -0.9934695 0.99347 0.9999437 -0.9934695 0.9934699 0.9999437 -0.9934694 0.9934699 0.9999437 -0.9934694 0.9934699 0.9999437 -0.9934694 0.9934698 0.9999437 -0.9934694 0.9934698 0.9999437 -0.9934694 0.9934698 0.9999437 -0.9934694 0.9934697 0.9999437 -0.9934694 0.9934696 0.9999437 -0.9934694 0.9934696 0.9999437 -0.9934694 0.9934695 0.9999437 -0.9934695 0.9934695 0.9999437 -0.9934697 0.9934695 0.9999437 -0.9934698 0.9934695 0.9999437 -0.9934701 0.9934695 0.9999437 -0.9934704 0.9934695 0.9999437 -0.9934707 0.9934695 0.9999437 -0.9934712 0.9934695 0.9999437 -0.9934718 0.9934695 0.9999437 -0.9934725 0.9934695 0.9999437 -0.9934734 0.9934695 0.9999437 -0.9934746 0.9934695 0.9999437 -0.9934761 0.9934695 0.9999437 -0.9934779 0.9934695 0.9999437 -0.9934803 0.9934695 0.9999437 -0.9934833 0.9934695 0.9999437 -0.9934871 0.9934695 0.9999437 -0.9934919 0.9934695 0.9999437 -0.993498 0.9934695 0.9999437 -0.9935057 0.9934695 0.9999437 -0.9935154 0.9934695 0.9999437 -0.9935277 0.9934695 0.9999437 -0.9935432 0.9934695 0.9999437 -0.9935629 0.9934695 0.9999437 -0.9935878 0.9934695 0.9999437 -0.9936193 0.9934695 0.9999437 -0.9936592 0.9934695 0.9999437 -0.9937096 0.9934695 0.9999437 -0.9937734 0.9934695 0.9999437 -0.9938541 0.9934695 0.9999437 -0.9939562 0.9934695 0.9999437 -0.9940854 0.9934695 0.9999437 -0.9942488 0.9934695 0.9999437 -0.9944556 0.9934695 0.9999437 -0.9947172 0.9934695 0.9999437 -0.9950481 0.9934695 0.9999437 -0.9954668 0.9934695 0.9999437 -0.9959964 0.9934695 0.9999437 -0.9966665 0.9934695 0.9999437 -0.9975143 0.9934695 0.9999437 -0.9985868 0.9934695 0.9999437 -0.9999437 0.9934695 0.9999437 -0.9934695 0.9934701 0.9999437 -0.9934695 0.9934701 0.9999437 -0.9934695 0.9934701 0.9999437 -0.9934695 0.9934701 0.9999437 -0.9934695 0.9934701 0.9999437 -0.9934695 0.9934701 0.9999437 -0.9934695 0.9934701 0.9999437 -0.9934694 0.9934701 0.9999437 -0.9934694 0.99347 0.9999437 -0.9934694 0.99347 0.9999437 -0.9934694 0.9934699 0.9999437 -0.9934694 0.9934699 0.9999437 -0.9934694 0.9934698 0.9999437 -0.9934694 0.9934698 0.9999437 -0.9934694 0.9934697 0.9999437 -0.9934694 0.9934697 0.9999437 -0.9934695 0.9934697 0.9999437 -0.9934697 0.9934697 0.9999437 -0.9934698 0.9934697 0.9999437 -0.9934701 0.9934697 0.9999437 -0.9934704 0.9934697 0.9999437 -0.9934707 0.9934697 0.9999437 -0.9934712 0.9934697 0.9999437 -0.9934718 0.9934697 0.9999437 -0.9934725 0.9934697 0.9999437 -0.9934734 0.9934697 0.9999437 -0.9934746 0.9934697 0.9999437 -0.9934761 0.9934697 0.9999437 -0.9934779 0.9934697 0.9999437 -0.9934803 0.9934697 0.9999437 -0.9934833 0.9934697 0.9999437 -0.9934871 0.9934697 0.9999437 -0.9934919 0.9934697 0.9999437 -0.993498 0.9934697 0.9999437 -0.9935057 0.9934697 0.9999437 -0.9935154 0.9934697 0.9999437 -0.9935277 0.9934697 0.9999437 -0.9935432 0.9934697 0.9999437 -0.9935629 0.9934697 0.9999437 -0.9935878 0.9934697 0.9999437 -0.9936193 0.9934697 0.9999437 -0.9936592 0.9934697 0.9999437 -0.9937096 0.9934697 0.9999437 -0.9937734 0.9934697 0.9999437 -0.9938541 0.9934697 0.9999437 -0.9939562 0.9934697 0.9999437 -0.9940854 0.9934697 0.9999437 -0.9942488 0.9934697 0.9999437 -0.9944556 0.9934697 0.9999437 -0.9947172 0.9934697 0.9999437 -0.9950481 0.9934697 0.9999437 -0.9954668 0.9934697 0.9999437 -0.9959964 0.9934697 0.9999437 -0.9966665 0.9934697 0.9999437 -0.9975143 0.9934697 0.9999437 -0.9985868 0.9934697 0.9999437 -0.9999437 0.9934697 0.9999437 -0.9934695 0.9934703 0.9999437 -0.9934695 0.9934703 0.9999437 -0.9934695 0.9934703 0.9999437 -0.9934695 0.9934703 0.9999437 -0.9934695 0.9934703 0.9999437 -0.9934695 0.9934703 0.9999437 -0.9934695 0.9934703 0.9999437 -0.9934694 0.9934702 0.9999437 -0.9934694 0.9934702 0.9999437 -0.9934694 0.9934702 0.9999437 -0.9934694 0.9934701 0.9999437 -0.9934694 0.9934701 0.9999437 -0.9934694 0.99347 0.9999437 -0.9934694 0.99347 0.9999437 -0.9934694 0.9934699 0.9999437 -0.9934694 0.9934699 0.9999437 -0.9934695 0.9934698 0.9999437 -0.9934697 0.9934698 0.9999437 -0.9934698 0.9934698 0.9999437 -0.9934701 0.9934698 0.9999437 -0.9934704 0.9934698 0.9999437 -0.9934707 0.9934698 0.9999437 -0.9934712 0.9934698 0.9999437 -0.9934718 0.9934698 0.9999437 -0.9934725 0.9934698 0.9999437 -0.9934734 0.9934698 0.9999437 -0.9934746 0.9934698 0.9999437 -0.9934761 0.9934698 0.9999437 -0.9934779 0.9934698 0.9999437 -0.9934803 0.9934698 0.9999437 -0.9934833 0.9934698 0.9999437 -0.9934871 0.9934698 0.9999437 -0.9934919 0.9934698 0.9999437 -0.993498 0.9934698 0.9999437 -0.9935057 0.9934698 0.9999437 -0.9935154 0.9934698 0.9999437 -0.9935277 0.9934698 0.9999437 -0.9935432 0.9934698 0.9999437 -0.9935629 0.9934698 0.9999437 -0.9935878 0.9934698 0.9999437 -0.9936193 0.9934698 0.9999437 -0.9936592 0.9934698 0.9999437 -0.9937096 0.9934698 0.9999437 -0.9937734 0.9934698 0.9999437 -0.9938541 0.9934698 0.9999437 -0.9939562 0.9934698 0.9999437 -0.9940854 0.9934698 0.9999437 -0.9942488 0.9934698 0.9999437 -0.9944556 0.9934698 0.9999437 -0.9947172 0.9934698 0.9999437 -0.9950481 0.9934698 0.9999437 -0.9954668 0.9934698 0.9999437 -0.9959964 0.9934698 0.9999437 -0.9966665 0.9934698 0.9999437 -0.9975143 0.9934698 0.9999437 -0.9985868 0.9934698 0.9999437 -0.9999437 0.9934698 0.9999437 -0.9934695 0.9934706 0.9999437 -0.9934695 0.9934705 0.9999437 -0.9934695 0.9934705 0.9999437 -0.9934695 0.9934705 0.9999437 -0.9934695 0.9934705 0.9999437 -0.9934695 0.9934705 0.9999437 -0.9934695 0.9934705 0.9999437 -0.9934694 0.9934705 0.9999437 -0.9934694 0.9934704 0.9999437 -0.9934694 0.9934704 0.9999437 -0.9934694 0.9934703 0.9999437 -0.9934694 0.9934703 0.9999437 -0.9934694 0.9934702 0.9999437 -0.9934694 0.9934702 0.9999437 -0.9934694 0.9934701 0.9999437 -0.9934694 0.9934701 0.9999437 -0.9934695 0.9934701 0.9999437 -0.9934697 0.9934701 0.9999437 -0.9934698 0.9934701 0.9999437 -0.9934701 0.9934701 0.9999437 -0.9934704 0.9934701 0.9999437 -0.9934707 0.9934701 0.9999437 -0.9934712 0.9934701 0.9999437 -0.9934718 0.9934701 0.9999437 -0.9934725 0.9934701 0.9999437 -0.9934734 0.9934701 0.9999437 -0.9934746 0.9934701 0.9999437 -0.9934761 0.9934701 0.9999437 -0.9934779 0.9934701 0.9999437 -0.9934803 0.9934701 0.9999437 -0.9934833 0.9934701 0.9999437 -0.9934871 0.9934701 0.9999437 -0.9934919 0.9934701 0.9999437 -0.993498 0.9934701 0.9999437 -0.9935057 0.9934701 0.9999437 -0.9935154 0.9934701 0.9999437 -0.9935277 0.9934701 0.9999437 -0.9935432 0.9934701 0.9999437 -0.9935629 0.9934701 0.9999437 -0.9935878 0.9934701 0.9999437 -0.9936193 0.9934701 0.9999437 -0.9936592 0.9934701 0.9999437 -0.9937096 0.9934701 0.9999437 -0.9937734 0.9934701 0.9999437 -0.9938541 0.9934701 0.9999437 -0.9939562 0.9934701 0.9999437 -0.9940854 0.9934701 0.9999437 -0.9942488 0.9934701 0.9999437 -0.9944556 0.9934701 0.9999437 -0.9947172 0.9934701 0.9999437 -0.9950481 0.9934701 0.9999437 -0.9954668 0.9934701 0.9999437 -0.9959964 0.9934701 0.9999437 -0.9966665 0.9934701 0.9999437 -0.9975143 0.9934701 0.9999437 -0.9985868 0.9934701 0.9999437 -0.9999437 0.9934701 0.9999437 -0.9934695 0.9934708 0.9999437 -0.9934695 0.9934708 0.9999437 -0.9934695 0.9934708 0.9999437 -0.9934695 0.9934708 0.9999437 -0.9934695 0.9934708 0.9999437 -0.9934695 0.9934708 0.9999437 -0.9934695 0.9934708 0.9999437 -0.9934694 0.9934707 0.9999437 -0.9934694 0.9934707 0.9999437 -0.9934694 0.9934707 0.9999437 -0.9934694 0.9934706 0.9999437 -0.9934694 0.9934706 0.9999437 -0.9934694 0.9934705 0.9999437 -0.9934694 0.9934705 0.9999437 -0.9934694 0.9934704 0.9999437 -0.9934694 0.9934704 0.9999437 -0.9934695 0.9934704 0.9999437 -0.9934697 0.9934704 0.9999437 -0.9934698 0.9934704 0.9999437 -0.9934701 0.9934704 0.9999437 -0.9934704 0.9934704 0.9999437 -0.9934707 0.9934704 0.9999437 -0.9934712 0.9934704 0.9999437 -0.9934718 0.9934704 0.9999437 -0.9934725 0.9934704 0.9999437 -0.9934734 0.9934704 0.9999437 -0.9934746 0.9934704 0.9999437 -0.9934761 0.9934704 0.9999437 -0.9934779 0.9934704 0.9999437 -0.9934803 0.9934704 0.9999437 -0.9934833 0.9934704 0.9999437 -0.9934871 0.9934704 0.9999437 -0.9934919 0.9934704 0.9999437 -0.993498 0.9934704 0.9999437 -0.9935057 0.9934704 0.9999437 -0.9935154 0.9934704 0.9999437 -0.9935277 0.9934704 0.9999437 -0.9935432 0.9934704 0.9999437 -0.9935629 0.9934704 0.9999437 -0.9935878 0.9934704 0.9999437 -0.9936193 0.9934704 0.9999437 -0.9936592 0.9934704 0.9999437 -0.9937096 0.9934704 0.9999437 -0.9937734 0.9934704 0.9999437 -0.9938541 0.9934704 0.9999437 -0.9939562 0.9934704 0.9999437 -0.9940854 0.9934704 0.9999437 -0.9942488 0.9934704 0.9999437 -0.9944556 0.9934704 0.9999437 -0.9947172 0.9934704 0.9999437 -0.9950481 0.9934704 0.9999437 -0.9954668 0.9934704 0.9999437 -0.9959964 0.9934704 0.9999437 -0.9966665 0.9934704 0.9999437 -0.9975143 0.9934704 0.9999437 -0.9985868 0.9934704 0.9999437 -0.9999437 0.9934704 0.9999437 -0.9934695 0.9934712 0.9999437 -0.9934695 0.9934712 0.9999437 -0.9934695 0.9934712 0.9999437 -0.9934695 0.9934712 0.9999437 -0.9934695 0.9934712 0.9999437 -0.9934695 0.9934711 0.9999437 -0.9934695 0.9934711 0.9999437 -0.9934694 0.9934711 0.9999437 -0.9934694 0.9934711 0.9999437 -0.9934694 0.993471 0.9999437 -0.9934694 0.993471 0.9999437 -0.9934694 0.9934709 0.9999437 -0.9934694 0.9934709 0.9999437 -0.9934694 0.9934708 0.9999437 -0.9934694 0.9934708 0.9999437 -0.9934694 0.9934707 0.9999437 -0.9934695 0.9934707 0.9999437 -0.9934697 0.9934707 0.9999437 -0.9934698 0.9934707 0.9999437 -0.9934701 0.9934707 0.9999437 -0.9934704 0.9934707 0.9999437 -0.9934707 0.9934707 0.9999437 -0.9934712 0.9934707 0.9999437 -0.9934718 0.9934707 0.9999437 -0.9934725 0.9934707 0.9999437 -0.9934734 0.9934707 0.9999437 -0.9934746 0.9934707 0.9999437 -0.9934761 0.9934707 0.9999437 -0.9934779 0.9934707 0.9999437 -0.9934803 0.9934707 0.9999437 -0.9934833 0.9934707 0.9999437 -0.9934871 0.9934707 0.9999437 -0.9934919 0.9934707 0.9999437 -0.993498 0.9934707 0.9999437 -0.9935057 0.9934707 0.9999437 -0.9935154 0.9934707 0.9999437 -0.9935277 0.9934707 0.9999437 -0.9935432 0.9934707 0.9999437 -0.9935629 0.9934707 0.9999437 -0.9935878 0.9934707 0.9999437 -0.9936193 0.9934707 0.9999437 -0.9936592 0.9934707 0.9999437 -0.9937096 0.9934707 0.9999437 -0.9937734 0.9934707 0.9999437 -0.9938541 0.9934707 0.9999437 -0.9939562 0.9934707 0.9999437 -0.9940854 0.9934707 0.9999437 -0.9942488 0.9934707 0.9999437 -0.9944556 0.9934707 0.9999437 -0.9947172 0.9934707 0.9999437 -0.9950481 0.9934707 0.9999437 -0.9954668 0.9934707 0.9999437 -0.9959964 0.9934707 0.9999437 -0.9966665 0.9934707 0.9999437 -0.9975143 0.9934707 0.9999437 -0.9985868 0.9934707 0.9999437 -0.9999437 0.9934707 0.9999437 -0.9934695 0.9934717 0.9999437 -0.9934695 0.9934716 0.9999437 -0.9934695 0.9934716 0.9999437 -0.9934695 0.9934716 0.9999437 -0.9934695 0.9934716 0.9999437 -0.9934695 0.9934716 0.9999437 -0.9934695 0.9934716 0.9999437 -0.9934694 0.9934716 0.9999437 -0.9934694 0.9934715 0.9999437 -0.9934694 0.9934715 0.9999437 -0.9934694 0.9934715 0.9999437 -0.9934694 0.9934714 0.9999437 -0.9934694 0.9934713 0.9999437 -0.9934694 0.9934713 0.9999437 -0.9934694 0.9934712 0.9999437 -0.9934694 0.9934712 0.9999437 -0.9934695 0.9934712 0.9999437 -0.9934697 0.9934712 0.9999437 -0.9934698 0.9934712 0.9999437 -0.9934701 0.9934712 0.9999437 -0.9934704 0.9934712 0.9999437 -0.9934707 0.9934712 0.9999437 -0.9934712 0.9934712 0.9999437 -0.9934718 0.9934712 0.9999437 -0.9934725 0.9934712 0.9999437 -0.9934734 0.9934712 0.9999437 -0.9934746 0.9934712 0.9999437 -0.9934761 0.9934712 0.9999437 -0.9934779 0.9934712 0.9999437 -0.9934803 0.9934712 0.9999437 -0.9934833 0.9934712 0.9999437 -0.9934871 0.9934712 0.9999437 -0.9934919 0.9934712 0.9999437 -0.993498 0.9934712 0.9999437 -0.9935057 0.9934712 0.9999437 -0.9935154 0.9934712 0.9999437 -0.9935277 0.9934712 0.9999437 -0.9935432 0.9934712 0.9999437 -0.9935629 0.9934712 0.9999437 -0.9935878 0.9934712 0.9999437 -0.9936193 0.9934712 0.9999437 -0.9936592 0.9934712 0.9999437 -0.9937096 0.9934712 0.9999437 -0.9937734 0.9934712 0.9999437 -0.9938541 0.9934712 0.9999437 -0.9939562 0.9934712 0.9999437 -0.9940854 0.9934712 0.9999437 -0.9942488 0.9934712 0.9999437 -0.9944556 0.9934712 0.9999437 -0.9947172 0.9934712 0.9999437 -0.9950481 0.9934712 0.9999437 -0.9954668 0.9934712 0.9999437 -0.9959964 0.9934712 0.9999437 -0.9966665 0.9934712 0.9999437 -0.9975143 0.9934712 0.9999437 -0.9985868 0.9934712 0.9999437 -0.9999437 0.9934712 0.9999437 -0.9934695 0.9934722 0.9999437 -0.9934695 0.9934722 0.9999437 -0.9934695 0.9934722 0.9999437 -0.9934695 0.9934722 0.9999437 -0.9934695 0.9934722 0.9999437 -0.9934695 0.9934722 0.9999437 -0.9934695 0.9934722 0.9999437 -0.9934694 0.9934721 0.9999437 -0.9934694 0.9934721 0.9999437 -0.9934694 0.9934721 0.9999437 -0.9934694 0.993472 0.9999437 -0.9934694 0.993472 0.9999437 -0.9934694 0.9934719 0.9999437 -0.9934694 0.9934719 0.9999437 -0.9934694 0.9934718 0.9999437 -0.9934694 0.9934718 0.9999437 -0.9934695 0.9934718 0.9999437 -0.9934697 0.9934718 0.9999437 -0.9934698 0.9934718 0.9999437 -0.9934701 0.9934718 0.9999437 -0.9934704 0.9934718 0.9999437 -0.9934707 0.9934718 0.9999437 -0.9934712 0.9934718 0.9999437 -0.9934718 0.9934718 0.9999437 -0.9934725 0.9934718 0.9999437 -0.9934734 0.9934718 0.9999437 -0.9934746 0.9934718 0.9999437 -0.9934761 0.9934718 0.9999437 -0.9934779 0.9934718 0.9999437 -0.9934803 0.9934718 0.9999437 -0.9934833 0.9934718 0.9999437 -0.9934871 0.9934718 0.9999437 -0.9934919 0.9934718 0.9999437 -0.993498 0.9934718 0.9999437 -0.9935057 0.9934718 0.9999437 -0.9935154 0.9934718 0.9999437 -0.9935277 0.9934718 0.9999437 -0.9935432 0.9934718 0.9999437 -0.9935629 0.9934718 0.9999437 -0.9935878 0.9934718 0.9999437 -0.9936193 0.9934718 0.9999437 -0.9936592 0.9934718 0.9999437 -0.9937096 0.9934718 0.9999437 -0.9937734 0.9934718 0.9999437 -0.9938541 0.9934718 0.9999437 -0.9939562 0.9934718 0.9999437 -0.9940854 0.9934718 0.9999437 -0.9942488 0.9934718 0.9999437 -0.9944556 0.9934718 0.9999437 -0.9947172 0.9934718 0.9999437 -0.9950481 0.9934718 0.9999437 -0.9954668 0.9934718 0.9999437 -0.9959964 0.9934718 0.9999437 -0.9966665 0.9934718 0.9999437 -0.9975143 0.9934718 0.9999437 -0.9985868 0.9934718 0.9999437 -0.9999437 0.9934718 0.9999437 -0.9934695 0.993473 0.9999437 -0.9934695 0.993473 0.9999437 -0.9934695 0.993473 0.9999437 -0.9934695 0.9934729 0.9999437 -0.9934695 0.9934729 0.9999437 -0.9934695 0.9934729 0.9999437 -0.9934695 0.9934729 0.9999437 -0.9934694 0.9934729 0.9999437 -0.9934694 0.9934728 0.9999437 -0.9934694 0.9934728 0.9999437 -0.9934694 0.9934728 0.9999437 -0.9934694 0.9934727 0.9999437 -0.9934694 0.9934727 0.9999437 -0.9934694 0.9934726 0.9999437 -0.9934694 0.9934725 0.9999437 -0.9934694 0.9934725 0.9999437 -0.9934695 0.9934725 0.9999437 -0.9934697 0.9934725 0.9999437 -0.9934698 0.9934725 0.9999437 -0.9934701 0.9934725 0.9999437 -0.9934704 0.9934725 0.9999437 -0.9934707 0.9934725 0.9999437 -0.9934712 0.9934725 0.9999437 -0.9934718 0.9934725 0.9999437 -0.9934725 0.9934725 0.9999437 -0.9934734 0.9934725 0.9999437 -0.9934746 0.9934725 0.9999437 -0.9934761 0.9934725 0.9999437 -0.9934779 0.9934725 0.9999437 -0.9934803 0.9934725 0.9999437 -0.9934833 0.9934725 0.9999437 -0.9934871 0.9934725 0.9999437 -0.9934919 0.9934725 0.9999437 -0.993498 0.9934725 0.9999437 -0.9935057 0.9934725 0.9999437 -0.9935154 0.9934725 0.9999437 -0.9935277 0.9934725 0.9999437 -0.9935432 0.9934725 0.9999437 -0.9935629 0.9934725 0.9999437 -0.9935878 0.9934725 0.9999437 -0.9936193 0.9934725 0.9999437 -0.9936592 0.9934725 0.9999437 -0.9937096 0.9934725 0.9999437 -0.9937734 0.9934725 0.9999437 -0.9938541 0.9934725 0.9999437 -0.9939562 0.9934725 0.9999437 -0.9940854 0.9934725 0.9999437 -0.9942488 0.9934725 0.9999437 -0.9944556 0.9934725 0.9999437 -0.9947172 0.9934725 0.9999437 -0.9950481 0.9934725 0.9999437 -0.9954668 0.9934725 0.9999437 -0.9959964 0.9934725 0.9999437 -0.9966665 0.9934725 0.9999437 -0.9975143 0.9934725 0.9999437 -0.9985868 0.9934725 0.9999437 -0.9999437 0.9934725 0.9999437 -0.9934695 0.9934739 0.9999437 -0.9934695 0.9934739 0.9999437 -0.9934695 0.9934739 0.9999437 -0.9934695 0.9934739 0.9999437 -0.9934695 0.9934739 0.9999437 -0.9934695 0.9934738 0.9999437 -0.9934695 0.9934738 0.9999437 -0.9934694 0.9934738 0.9999437 -0.9934694 0.9934738 0.9999437 -0.9934694 0.9934737 0.9999437 -0.9934694 0.9934737 0.9999437 -0.9934694 0.9934736 0.9999437 -0.9934694 0.9934736 0.9999437 -0.9934694 0.9934735 0.9999437 -0.9934694 0.9934735 0.9999437 -0.9934694 0.9934734 0.9999437 -0.9934695 0.9934734 0.9999437 -0.9934697 0.9934734 0.9999437 -0.9934698 0.9934734 0.9999437 -0.9934701 0.9934734 0.9999437 -0.9934704 0.9934734 0.9999437 -0.9934707 0.9934734 0.9999437 -0.9934712 0.9934734 0.9999437 -0.9934718 0.9934734 0.9999437 -0.9934725 0.9934734 0.9999437 -0.9934734 0.9934734 0.9999437 -0.9934746 0.9934734 0.9999437 -0.9934761 0.9934734 0.9999437 -0.9934779 0.9934734 0.9999437 -0.9934803 0.9934734 0.9999437 -0.9934833 0.9934734 0.9999437 -0.9934871 0.9934734 0.9999437 -0.9934919 0.9934734 0.9999437 -0.993498 0.9934734 0.9999437 -0.9935057 0.9934734 0.9999437 -0.9935154 0.9934734 0.9999437 -0.9935277 0.9934734 0.9999437 -0.9935432 0.9934734 0.9999437 -0.9935629 0.9934734 0.9999437 -0.9935878 0.9934734 0.9999437 -0.9936193 0.9934734 0.9999437 -0.9936592 0.9934734 0.9999437 -0.9937096 0.9934734 0.9999437 -0.9937734 0.9934734 0.9999437 -0.9938541 0.9934734 0.9999437 -0.9939562 0.9934734 0.9999437 -0.9940854 0.9934734 0.9999437 -0.9942488 0.9934734 0.9999437 -0.9944556 0.9934734 0.9999437 -0.9947172 0.9934734 0.9999437 -0.9950481 0.9934734 0.9999437 -0.9954668 0.9934734 0.9999437 -0.9959964 0.9934734 0.9999437 -0.9966665 0.9934734 0.9999437 -0.9975143 0.9934734 0.9999437 -0.9985868 0.9934734 0.9999437 -0.9999437 0.9934734 0.9999437 -0.9934695 0.9934751 0.9999437 -0.9934695 0.9934751 0.9999437 -0.9934695 0.993475 0.9999437 -0.9934695 0.993475 0.9999437 -0.9934695 0.993475 0.9999437 -0.9934695 0.993475 0.9999437 -0.9934695 0.993475 0.9999437 -0.9934694 0.993475 0.9999437 -0.9934694 0.9934749 0.9999437 -0.9934694 0.9934749 0.9999437 -0.9934694 0.9934749 0.9999437 -0.9934694 0.9934748 0.9999437 -0.9934694 0.9934748 0.9999437 -0.9934694 0.9934747 0.9999437 -0.9934694 0.9934746 0.9999437 -0.9934694 0.9934746 0.9999437 -0.9934695 0.9934746 0.9999437 -0.9934697 0.9934746 0.9999437 -0.9934698 0.9934746 0.9999437 -0.9934701 0.9934746 0.9999437 -0.9934704 0.9934746 0.9999437 -0.9934707 0.9934746 0.9999437 -0.9934712 0.9934746 0.9999437 -0.9934718 0.9934746 0.9999437 -0.9934725 0.9934746 0.9999437 -0.9934734 0.9934746 0.9999437 -0.9934746 0.9934746 0.9999437 -0.9934761 0.9934746 0.9999437 -0.9934779 0.9934746 0.9999437 -0.9934803 0.9934746 0.9999437 -0.9934833 0.9934746 0.9999437 -0.9934871 0.9934746 0.9999437 -0.9934919 0.9934746 0.9999437 -0.993498 0.9934746 0.9999437 -0.9935057 0.9934746 0.9999437 -0.9935154 0.9934746 0.9999437 -0.9935277 0.9934746 0.9999437 -0.9935432 0.9934746 0.9999437 -0.9935629 0.9934746 0.9999437 -0.9935878 0.9934746 0.9999437 -0.9936193 0.9934746 0.9999437 -0.9936592 0.9934746 0.9999437 -0.9937096 0.9934746 0.9999437 -0.9937734 0.9934746 0.9999437 -0.9938541 0.9934746 0.9999437 -0.9939562 0.9934746 0.9999437 -0.9940854 0.9934746 0.9999437 -0.9942488 0.9934746 0.9999437 -0.9944556 0.9934746 0.9999437 -0.9947172 0.9934746 0.9999437 -0.9950481 0.9934746 0.9999437 -0.9954668 0.9934746 0.9999437 -0.9959964 0.9934746 0.9999437 -0.9966665 0.9934746 0.9999437 -0.9975143 0.9934746 0.9999437 -0.9985868 0.9934746 0.9999437 -0.9999437 0.9934746 0.9999437 -0.9934695 0.9934765 0.9999437 -0.9934695 0.9934765 0.9999437 -0.9934695 0.9934765 0.9999437 -0.9934695 0.9934765 0.9999437 -0.9934695 0.9934765 0.9999437 -0.9934695 0.9934765 0.9999437 -0.9934695 0.9934765 0.9999437 -0.9934694 0.9934764 0.9999437 -0.9934694 0.9934764 0.9999437 -0.9934694 0.9934764 0.9999437 -0.9934694 0.9934763 0.9999437 -0.9934694 0.9934763 0.9999437 -0.9934694 0.9934762 0.9999437 -0.9934694 0.9934762 0.9999437 -0.9934694 0.9934761 0.9999437 -0.9934694 0.9934761 0.9999437 -0.9934695 0.9934761 0.9999437 -0.9934697 0.9934761 0.9999437 -0.9934698 0.9934761 0.9999437 -0.9934701 0.9934761 0.9999437 -0.9934704 0.9934761 0.9999437 -0.9934707 0.9934761 0.9999437 -0.9934712 0.9934761 0.9999437 -0.9934718 0.9934761 0.9999437 -0.9934725 0.9934761 0.9999437 -0.9934734 0.9934761 0.9999437 -0.9934746 0.9934761 0.9999437 -0.9934761 0.9934761 0.9999437 -0.9934779 0.9934761 0.9999437 -0.9934803 0.9934761 0.9999437 -0.9934833 0.9934761 0.9999437 -0.9934871 0.9934761 0.9999437 -0.9934919 0.9934761 0.9999437 -0.993498 0.9934761 0.9999437 -0.9935057 0.9934761 0.9999437 -0.9935154 0.9934761 0.9999437 -0.9935277 0.9934761 0.9999437 -0.9935432 0.9934761 0.9999437 -0.9935629 0.9934761 0.9999437 -0.9935878 0.9934761 0.9999437 -0.9936193 0.9934761 0.9999437 -0.9936592 0.9934761 0.9999437 -0.9937096 0.9934761 0.9999437 -0.9937734 0.9934761 0.9999437 -0.9938541 0.9934761 0.9999437 -0.9939562 0.9934761 0.9999437 -0.9940854 0.9934761 0.9999437 -0.9942488 0.9934761 0.9999437 -0.9944556 0.9934761 0.9999437 -0.9947172 0.9934761 0.9999437 -0.9950481 0.9934761 0.9999437 -0.9954668 0.9934761 0.9999437 -0.9959964 0.9934761 0.9999437 -0.9966665 0.9934761 0.9999437 -0.9975143 0.9934761 0.9999437 -0.9985868 0.9934761 0.9999437 -0.9999437 0.9934761 0.9999437 -0.9934695 0.9934784 0.9999437 -0.9934695 0.9934784 0.9999437 -0.9934695 0.9934784 0.9999437 -0.9934695 0.9934784 0.9999437 -0.9934695 0.9934784 0.9999437 -0.9934695 0.9934784 0.9999437 -0.9934695 0.9934783 0.9999437 -0.9934694 0.9934783 0.9999437 -0.9934694 0.9934783 0.9999437 -0.9934694 0.9934783 0.9999437 -0.9934694 0.9934782 0.9999437 -0.9934694 0.9934782 0.9999437 -0.9934694 0.9934781 0.9999437 -0.9934694 0.9934781 0.9999437 -0.9934694 0.993478 0.9999437 -0.9934694 0.9934779 0.9999437 -0.9934695 0.9934779 0.9999437 -0.9934697 0.9934779 0.9999437 -0.9934698 0.9934779 0.9999437 -0.9934701 0.9934779 0.9999437 -0.9934704 0.9934779 0.9999437 -0.9934707 0.9934779 0.9999437 -0.9934712 0.9934779 0.9999437 -0.9934718 0.9934779 0.9999437 -0.9934725 0.9934779 0.9999437 -0.9934734 0.9934779 0.9999437 -0.9934746 0.9934779 0.9999437 -0.9934761 0.9934779 0.9999437 -0.9934779 0.9934779 0.9999437 -0.9934803 0.9934779 0.9999437 -0.9934833 0.9934779 0.9999437 -0.9934871 0.9934779 0.9999437 -0.9934919 0.9934779 0.9999437 -0.993498 0.9934779 0.9999437 -0.9935057 0.9934779 0.9999437 -0.9935154 0.9934779 0.9999437 -0.9935277 0.9934779 0.9999437 -0.9935432 0.9934779 0.9999437 -0.9935629 0.9934779 0.9999437 -0.9935878 0.9934779 0.9999437 -0.9936193 0.9934779 0.9999437 -0.9936592 0.9934779 0.9999437 -0.9937096 0.9934779 0.9999437 -0.9937734 0.9934779 0.9999437 -0.9938541 0.9934779 0.9999437 -0.9939562 0.9934779 0.9999437 -0.9940854 0.9934779 0.9999437 -0.9942488 0.9934779 0.9999437 -0.9944556 0.9934779 0.9999437 -0.9947172 0.9934779 0.9999437 -0.9950481 0.9934779 0.9999437 -0.9954668 0.9934779 0.9999437 -0.9959964 0.9934779 0.9999437 -0.9966665 0.9934779 0.9999437 -0.9975143 0.9934779 0.9999437 -0.9985868 0.9934779 0.9999437 -0.9999437 0.9934779 0.9999437 -0.9934695 0.9934808 0.9999437 -0.9934695 0.9934808 0.9999437 -0.9934695 0.9934808 0.9999437 -0.9934695 0.9934808 0.9999437 -0.9934695 0.9934807 0.9999437 -0.9934695 0.9934807 0.9999437 -0.9934695 0.9934807 0.9999437 -0.9934694 0.9934807 0.9999437 -0.9934694 0.9934807 0.9999437 -0.9934694 0.9934806 0.9999437 -0.9934694 0.9934806 0.9999437 -0.9934694 0.9934805 0.9999437 -0.9934694 0.9934805 0.9999437 -0.9934694 0.9934804 0.9999437 -0.9934694 0.9934804 0.9999437 -0.9934694 0.9934803 0.9999437 -0.9934695 0.9934803 0.9999437 -0.9934697 0.9934803 0.9999437 -0.9934698 0.9934803 0.9999437 -0.9934701 0.9934803 0.9999437 -0.9934704 0.9934803 0.9999437 -0.9934707 0.9934803 0.9999437 -0.9934712 0.9934803 0.9999437 -0.9934718 0.9934803 0.9999437 -0.9934725 0.9934803 0.9999437 -0.9934734 0.9934803 0.9999437 -0.9934746 0.9934803 0.9999437 -0.9934761 0.9934803 0.9999437 -0.9934779 0.9934803 0.9999437 -0.9934803 0.9934803 0.9999437 -0.9934833 0.9934803 0.9999437 -0.9934871 0.9934803 0.9999437 -0.9934919 0.9934803 0.9999437 -0.993498 0.9934803 0.9999437 -0.9935057 0.9934803 0.9999437 -0.9935154 0.9934803 0.9999437 -0.9935277 0.9934803 0.9999437 -0.9935432 0.9934803 0.9999437 -0.9935629 0.9934803 0.9999437 -0.9935878 0.9934803 0.9999437 -0.9936193 0.9934803 0.9999437 -0.9936592 0.9934803 0.9999437 -0.9937096 0.9934803 0.9999437 -0.9937734 0.9934803 0.9999437 -0.9938541 0.9934803 0.9999437 -0.9939562 0.9934803 0.9999437 -0.9940854 0.9934803 0.9999437 -0.9942488 0.9934803 0.9999437 -0.9944556 0.9934803 0.9999437 -0.9947172 0.9934803 0.9999437 -0.9950481 0.9934803 0.9999437 -0.9954668 0.9934803 0.9999437 -0.9959964 0.9934803 0.9999437 -0.9966665 0.9934803 0.9999437 -0.9975143 0.9934803 0.9999437 -0.9985868 0.9934803 0.9999437 -0.9999437 0.9934803 0.9999437 -0.9934695 0.9934838 0.9999437 -0.9934695 0.9934838 0.9999437 -0.9934695 0.9934838 0.9999437 -0.9934695 0.9934838 0.9999437 -0.9934695 0.9934837 0.9999437 -0.9934695 0.9934837 0.9999437 -0.9934695 0.9934837 0.9999437 -0.9934694 0.9934837 0.9999437 -0.9934694 0.9934837 0.9999437 -0.9934694 0.9934836 0.9999437 -0.9934694 0.9934836 0.9999437 -0.9934694 0.9934835 0.9999437 -0.9934694 0.9934835 0.9999437 -0.9934694 0.9934834 0.9999437 -0.9934694 0.9934834 0.9999437 -0.9934694 0.9934833 0.9999437 -0.9934695 0.9934833 0.9999437 -0.9934697 0.9934833 0.9999437 -0.9934698 0.9934833 0.9999437 -0.9934701 0.9934833 0.9999437 -0.9934704 0.9934833 0.9999437 -0.9934707 0.9934833 0.9999437 -0.9934712 0.9934833 0.9999437 -0.9934718 0.9934833 0.9999437 -0.9934725 0.9934833 0.9999437 -0.9934734 0.9934833 0.9999437 -0.9934746 0.9934833 0.9999437 -0.9934761 0.9934833 0.9999437 -0.9934779 0.9934833 0.9999437 -0.9934803 0.9934833 0.9999437 -0.9934833 0.9934833 0.9999437 -0.9934871 0.9934833 0.9999437 -0.9934919 0.9934833 0.9999437 -0.993498 0.9934833 0.9999437 -0.9935057 0.9934833 0.9999437 -0.9935154 0.9934833 0.9999437 -0.9935277 0.9934833 0.9999437 -0.9935432 0.9934833 0.9999437 -0.9935629 0.9934833 0.9999437 -0.9935878 0.9934833 0.9999437 -0.9936193 0.9934833 0.9999437 -0.9936592 0.9934833 0.9999437 -0.9937096 0.9934833 0.9999437 -0.9937734 0.9934833 0.9999437 -0.9938541 0.9934833 0.9999437 -0.9939562 0.9934833 0.9999437 -0.9940854 0.9934833 0.9999437 -0.9942488 0.9934833 0.9999437 -0.9944556 0.9934833 0.9999437 -0.9947172 0.9934833 0.9999437 -0.9950481 0.9934833 0.9999437 -0.9954668 0.9934833 0.9999437 -0.9959964 0.9934833 0.9999437 -0.9966665 0.9934833 0.9999437 -0.9975143 0.9934833 0.9999437 -0.9985868 0.9934833 0.9999437 -0.9999437 0.9934833 0.9999437 -0.9934695 0.9934876 0.9999437 -0.9934695 0.9934876 0.9999437 -0.9934695 0.9934876 0.9999437 -0.9934695 0.9934876 0.9999437 -0.9934695 0.9934875 0.9999437 -0.9934695 0.9934875 0.9999437 -0.9934695 0.9934875 0.9999437 -0.9934694 0.9934875 0.9999437 -0.9934694 0.9934875 0.9999437 -0.9934694 0.9934874 0.9999437 -0.9934694 0.9934874 0.9999437 -0.9934694 0.9934873 0.9999437 -0.9934694 0.9934873 0.9999437 -0.9934694 0.9934872 0.9999437 -0.9934694 0.9934872 0.9999437 -0.9934694 0.9934871 0.9999437 -0.9934695 0.9934871 0.9999437 -0.9934697 0.9934871 0.9999437 -0.9934698 0.9934871 0.9999437 -0.9934701 0.9934871 0.9999437 -0.9934704 0.9934871 0.9999437 -0.9934707 0.9934871 0.9999437 -0.9934712 0.9934871 0.9999437 -0.9934718 0.9934871 0.9999437 -0.9934725 0.9934871 0.9999437 -0.9934734 0.9934871 0.9999437 -0.9934746 0.9934871 0.9999437 -0.9934761 0.9934871 0.9999437 -0.9934779 0.9934871 0.9999437 -0.9934803 0.9934871 0.9999437 -0.9934833 0.9934871 0.9999437 -0.9934871 0.9934871 0.9999437 -0.9934919 0.9934871 0.9999437 -0.993498 0.9934871 0.9999437 -0.9935057 0.9934871 0.9999437 -0.9935154 0.9934871 0.9999437 -0.9935277 0.9934871 0.9999437 -0.9935432 0.9934871 0.9999437 -0.9935629 0.9934871 0.9999437 -0.9935878 0.9934871 0.9999437 -0.9936193 0.9934871 0.9999437 -0.9936592 0.9934871 0.9999437 -0.9937096 0.9934871 0.9999437 -0.9937734 0.9934871 0.9999437 -0.9938541 0.9934871 0.9999437 -0.9939562 0.9934871 0.9999437 -0.9940854 0.9934871 0.9999437 -0.9942488 0.9934871 0.9999437 -0.9944556 0.9934871 0.9999437 -0.9947172 0.9934871 0.9999437 -0.9950481 0.9934871 0.9999437 -0.9954668 0.9934871 0.9999437 -0.9959964 0.9934871 0.9999437 -0.9966665 0.9934871 0.9999437 -0.9975143 0.9934871 0.9999437 -0.9985868 0.9934871 0.9999437 -0.9999437 0.9934871 0.9999437 -0.9934695 0.9934924 0.9999437 -0.9934695 0.9934924 0.9999437 -0.9934695 0.9934924 0.9999437 -0.9934695 0.9934924 0.9999437 -0.9934695 0.9934923 0.9999437 -0.9934695 0.9934923 0.9999437 -0.9934695 0.9934923 0.9999437 -0.9934694 0.9934923 0.9999437 -0.9934694 0.9934923 0.9999437 -0.9934694 0.9934922 0.9999437 -0.9934694 0.9934922 0.9999437 -0.9934694 0.9934921 0.9999437 -0.9934694 0.9934921 0.9999437 -0.9934694 0.993492 0.9999437 -0.9934694 0.993492 0.9999437 -0.9934694 0.9934919 0.9999437 -0.9934695 0.9934919 0.9999437 -0.9934697 0.9934919 0.9999437 -0.9934698 0.9934919 0.9999437 -0.9934701 0.9934919 0.9999437 -0.9934704 0.9934919 0.9999437 -0.9934707 0.9934919 0.9999437 -0.9934712 0.9934919 0.9999437 -0.9934718 0.9934919 0.9999437 -0.9934725 0.9934919 0.9999437 -0.9934734 0.9934919 0.9999437 -0.9934746 0.9934919 0.9999437 -0.9934761 0.9934919 0.9999437 -0.9934779 0.9934919 0.9999437 -0.9934803 0.9934919 0.9999437 -0.9934833 0.9934919 0.9999437 -0.9934871 0.9934919 0.9999437 -0.9934919 0.9934919 0.9999437 -0.993498 0.9934919 0.9999437 -0.9935057 0.9934919 0.9999437 -0.9935154 0.9934919 0.9999437 -0.9935277 0.9934919 0.9999437 -0.9935432 0.9934919 0.9999437 -0.9935629 0.9934919 0.9999437 -0.9935878 0.9934919 0.9999437 -0.9936193 0.9934919 0.9999437 -0.9936592 0.9934919 0.9999437 -0.9937096 0.9934919 0.9999437 -0.9937734 0.9934919 0.9999437 -0.9938541 0.9934919 0.9999437 -0.9939562 0.9934919 0.9999437 -0.9940854 0.9934919 0.9999437 -0.9942488 0.9934919 0.9999437 -0.9944556 0.9934919 0.9999437 -0.9947172 0.9934919 0.9999437 -0.9950481 0.9934919 0.9999437 -0.9954668 0.9934919 0.9999437 -0.9959964 0.9934919 0.9999437 -0.9966665 0.9934919 0.9999437 -0.9975143 0.9934919 0.9999437 -0.9985868 0.9934919 0.9999437 -0.9999437 0.9934919 0.9999437 -0.9934695 0.9934985 0.9999437 -0.9934695 0.9934984 0.9999437 -0.9934695 0.9934984 0.9999437 -0.9934695 0.9934984 0.9999437 -0.9934695 0.9934984 0.9999437 -0.9934695 0.9934984 0.9999437 -0.9934695 0.9934984 0.9999437 -0.9934694 0.9934984 0.9999437 -0.9934694 0.9934983 0.9999437 -0.9934694 0.9934983 0.9999437 -0.9934694 0.9934983 0.9999437 -0.9934694 0.9934982 0.9999437 -0.9934694 0.9934981 0.9999437 -0.9934694 0.9934981 0.9999437 -0.9934694 0.993498 0.9999437 -0.9934694 0.993498 0.9999437 -0.9934695 0.993498 0.9999437 -0.9934697 0.993498 0.9999437 -0.9934698 0.993498 0.9999437 -0.9934701 0.993498 0.9999437 -0.9934704 0.993498 0.9999437 -0.9934707 0.993498 0.9999437 -0.9934712 0.993498 0.9999437 -0.9934718 0.993498 0.9999437 -0.9934725 0.993498 0.9999437 -0.9934734 0.993498 0.9999437 -0.9934746 0.993498 0.9999437 -0.9934761 0.993498 0.9999437 -0.9934779 0.993498 0.9999437 -0.9934803 0.993498 0.9999437 -0.9934833 0.993498 0.9999437 -0.9934871 0.993498 0.9999437 -0.9934919 0.993498 0.9999437 -0.993498 0.993498 0.9999437 -0.9935057 0.993498 0.9999437 -0.9935154 0.993498 0.9999437 -0.9935277 0.993498 0.9999437 -0.9935432 0.993498 0.9999437 -0.9935629 0.993498 0.9999437 -0.9935878 0.993498 0.9999437 -0.9936193 0.993498 0.9999437 -0.9936592 0.993498 0.9999437 -0.9937096 0.993498 0.9999437 -0.9937734 0.993498 0.9999437 -0.9938541 0.993498 0.9999437 -0.9939562 0.993498 0.9999437 -0.9940854 0.993498 0.9999437 -0.9942488 0.993498 0.9999437 -0.9944556 0.993498 0.9999437 -0.9947172 0.993498 0.9999437 -0.9950481 0.993498 0.9999437 -0.9954668 0.993498 0.9999437 -0.9959964 0.993498 0.9999437 -0.9966665 0.993498 0.9999437 -0.9975143 0.993498 0.9999437 -0.9985868 0.993498 0.9999437 -0.9999437 0.993498 0.9999437 -0.9934695 0.9935061 0.9999437 -0.9934695 0.9935061 0.9999437 -0.9934695 0.9935061 0.9999437 -0.9934695 0.9935061 0.9999437 -0.9934695 0.9935061 0.9999437 -0.9934695 0.9935061 0.9999437 -0.9934695 0.9935061 0.9999437 -0.9934694 0.993506 0.9999437 -0.9934694 0.993506 0.9999437 -0.9934694 0.993506 0.9999437 -0.9934694 0.9935059 0.9999437 -0.9934694 0.9935059 0.9999437 -0.9934694 0.9935058 0.9999437 -0.9934694 0.9935058 0.9999437 -0.9934694 0.9935057 0.9999437 -0.9934694 0.9935057 0.9999437 -0.9934695 0.9935057 0.9999437 -0.9934697 0.9935057 0.9999437 -0.9934698 0.9935057 0.9999437 -0.9934701 0.9935057 0.9999437 -0.9934704 0.9935057 0.9999437 -0.9934707 0.9935057 0.9999437 -0.9934712 0.9935057 0.9999437 -0.9934718 0.9935057 0.9999437 -0.9934725 0.9935057 0.9999437 -0.9934734 0.9935057 0.9999437 -0.9934746 0.9935057 0.9999437 -0.9934761 0.9935057 0.9999437 -0.9934779 0.9935057 0.9999437 -0.9934803 0.9935057 0.9999437 -0.9934833 0.9935057 0.9999437 -0.9934871 0.9935057 0.9999437 -0.9934919 0.9935057 0.9999437 -0.993498 0.9935057 0.9999437 -0.9935057 0.9935057 0.9999437 -0.9935154 0.9935057 0.9999437 -0.9935277 0.9935057 0.9999437 -0.9935432 0.9935057 0.9999437 -0.9935629 0.9935057 0.9999437 -0.9935878 0.9935057 0.9999437 -0.9936193 0.9935057 0.9999437 -0.9936592 0.9935057 0.9999437 -0.9937096 0.9935057 0.9999437 -0.9937734 0.9935057 0.9999437 -0.9938541 0.9935057 0.9999437 -0.9939562 0.9935057 0.9999437 -0.9940854 0.9935057 0.9999437 -0.9942488 0.9935057 0.9999437 -0.9944556 0.9935057 0.9999437 -0.9947172 0.9935057 0.9999437 -0.9950481 0.9935057 0.9999437 -0.9954668 0.9935057 0.9999437 -0.9959964 0.9935057 0.9999437 -0.9966665 0.9935057 0.9999437 -0.9975143 0.9935057 0.9999437 -0.9985868 0.9935057 0.9999437 -0.9999437 0.9935057 0.9999437 -0.9934695 0.9935159 0.9999437 -0.9934695 0.9935159 0.9999437 -0.9934695 0.9935158 0.9999437 -0.9934695 0.9935158 0.9999437 -0.9934695 0.9935158 0.9999437 -0.9934695 0.9935158 0.9999437 -0.9934695 0.9935158 0.9999437 -0.9934694 0.9935158 0.9999437 -0.9934694 0.9935157 0.9999437 -0.9934694 0.9935157 0.9999437 -0.9934694 0.9935157 0.9999437 -0.9934694 0.9935156 0.9999437 -0.9934694 0.9935156 0.9999437 -0.9934694 0.9935155 0.9999437 -0.9934694 0.9935154 0.9999437 -0.9934694 0.9935154 0.9999437 -0.9934695 0.9935154 0.9999437 -0.9934697 0.9935154 0.9999437 -0.9934698 0.9935154 0.9999437 -0.9934701 0.9935154 0.9999437 -0.9934704 0.9935154 0.9999437 -0.9934707 0.9935154 0.9999437 -0.9934712 0.9935154 0.9999437 -0.9934718 0.9935154 0.9999437 -0.9934725 0.9935154 0.9999437 -0.9934734 0.9935154 0.9999437 -0.9934746 0.9935154 0.9999437 -0.9934761 0.9935154 0.9999437 -0.9934779 0.9935154 0.9999437 -0.9934803 0.9935154 0.9999437 -0.9934833 0.9935154 0.9999437 -0.9934871 0.9935154 0.9999437 -0.9934919 0.9935154 0.9999437 -0.993498 0.9935154 0.9999437 -0.9935057 0.9935154 0.9999437 -0.9935154 0.9935154 0.9999437 -0.9935277 0.9935154 0.9999437 -0.9935432 0.9935154 0.9999437 -0.9935629 0.9935154 0.9999437 -0.9935878 0.9935154 0.9999437 -0.9936193 0.9935154 0.9999437 -0.9936592 0.9935154 0.9999437 -0.9937096 0.9935154 0.9999437 -0.9937734 0.9935154 0.9999437 -0.9938541 0.9935154 0.9999437 -0.9939562 0.9935154 0.9999437 -0.9940854 0.9935154 0.9999437 -0.9942488 0.9935154 0.9999437 -0.9944556 0.9935154 0.9999437 -0.9947172 0.9935154 0.9999437 -0.9950481 0.9935154 0.9999437 -0.9954668 0.9935154 0.9999437 -0.9959964 0.9935154 0.9999437 -0.9966665 0.9935154 0.9999437 -0.9975143 0.9935154 0.9999437 -0.9985868 0.9935154 0.9999437 -0.9999437 0.9935154 0.9999437 -0.9934695 0.9935282 0.9999437 -0.9934695 0.9935281 0.9999437 -0.9934695 0.9935281 0.9999437 -0.9934695 0.9935281 0.9999437 -0.9934695 0.9935281 0.9999437 -0.9934695 0.9935281 0.9999437 -0.9934695 0.9935281 0.9999437 -0.9934694 0.9935281 0.9999437 -0.9934694 0.993528 0.9999437 -0.9934694 0.993528 0.9999437 -0.9934694 0.993528 0.9999437 -0.9934694 0.9935279 0.9999437 -0.9934694 0.9935279 0.9999437 -0.9934694 0.9935278 0.9999437 -0.9934694 0.9935277 0.9999437 -0.9934694 0.9935277 0.9999437 -0.9934695 0.9935277 0.9999437 -0.9934697 0.9935277 0.9999437 -0.9934698 0.9935277 0.9999437 -0.9934701 0.9935277 0.9999437 -0.9934704 0.9935277 0.9999437 -0.9934707 0.9935277 0.9999437 -0.9934712 0.9935277 0.9999437 -0.9934718 0.9935277 0.9999437 -0.9934725 0.9935277 0.9999437 -0.9934734 0.9935277 0.9999437 -0.9934746 0.9935277 0.9999437 -0.9934761 0.9935277 0.9999437 -0.9934779 0.9935277 0.9999437 -0.9934803 0.9935277 0.9999437 -0.9934833 0.9935277 0.9999437 -0.9934871 0.9935277 0.9999437 -0.9934919 0.9935277 0.9999437 -0.993498 0.9935277 0.9999437 -0.9935057 0.9935277 0.9999437 -0.9935154 0.9935277 0.9999437 -0.9935277 0.9935277 0.9999437 -0.9935432 0.9935277 0.9999437 -0.9935629 0.9935277 0.9999437 -0.9935878 0.9935277 0.9999437 -0.9936193 0.9935277 0.9999437 -0.9936592 0.9935277 0.9999437 -0.9937096 0.9935277 0.9999437 -0.9937734 0.9935277 0.9999437 -0.9938541 0.9935277 0.9999437 -0.9939562 0.9935277 0.9999437 -0.9940854 0.9935277 0.9999437 -0.9942488 0.9935277 0.9999437 -0.9944556 0.9935277 0.9999437 -0.9947172 0.9935277 0.9999437 -0.9950481 0.9935277 0.9999437 -0.9954668 0.9935277 0.9999437 -0.9959964 0.9935277 0.9999437 -0.9966665 0.9935277 0.9999437 -0.9975143 0.9935277 0.9999437 -0.9985868 0.9935277 0.9999437 -0.9999437 0.9935277 0.9999437 -0.9934695 0.9935437 0.9999437 -0.9934695 0.9935437 0.9999437 -0.9934695 0.9935437 0.9999437 -0.9934695 0.9935437 0.9999437 -0.9934695 0.9935437 0.9999437 -0.9934695 0.9935437 0.9999437 -0.9934695 0.9935436 0.9999437 -0.9934694 0.9935436 0.9999437 -0.9934694 0.9935436 0.9999437 -0.9934694 0.9935436 0.9999437 -0.9934694 0.9935435 0.9999437 -0.9934694 0.9935435 0.9999437 -0.9934694 0.9935434 0.9999437 -0.9934694 0.9935434 0.9999437 -0.9934694 0.9935433 0.9999437 -0.9934694 0.9935432 0.9999437 -0.9934695 0.9935432 0.9999437 -0.9934697 0.9935432 0.9999437 -0.9934698 0.9935432 0.9999437 -0.9934701 0.9935432 0.9999437 -0.9934704 0.9935432 0.9999437 -0.9934707 0.9935432 0.9999437 -0.9934712 0.9935432 0.9999437 -0.9934718 0.9935432 0.9999437 -0.9934725 0.9935432 0.9999437 -0.9934734 0.9935432 0.9999437 -0.9934746 0.9935432 0.9999437 -0.9934761 0.9935432 0.9999437 -0.9934779 0.9935432 0.9999437 -0.9934803 0.9935432 0.9999437 -0.9934833 0.9935432 0.9999437 -0.9934871 0.9935432 0.9999437 -0.9934919 0.9935432 0.9999437 -0.993498 0.9935432 0.9999437 -0.9935057 0.9935432 0.9999437 -0.9935154 0.9935432 0.9999437 -0.9935277 0.9935432 0.9999437 -0.9935432 0.9935432 0.9999437 -0.9935629 0.9935432 0.9999437 -0.9935878 0.9935432 0.9999437 -0.9936193 0.9935432 0.9999437 -0.9936592 0.9935432 0.9999437 -0.9937096 0.9935432 0.9999437 -0.9937734 0.9935432 0.9999437 -0.9938541 0.9935432 0.9999437 -0.9939562 0.9935432 0.9999437 -0.9940854 0.9935432 0.9999437 -0.9942488 0.9935432 0.9999437 -0.9944556 0.9935432 0.9999437 -0.9947172 0.9935432 0.9999437 -0.9950481 0.9935432 0.9999437 -0.9954668 0.9935432 0.9999437 -0.9959964 0.9935432 0.9999437 -0.9966665 0.9935432 0.9999437 -0.9975143 0.9935432 0.9999437 -0.9985868 0.9935432 0.9999437 -0.9999437 0.9935432 0.9999437 -0.9934695 0.9935634 0.9999437 -0.9934695 0.9935634 0.9999437 -0.9934695 0.9935634 0.9999437 -0.9934695 0.9935634 0.9999437 -0.9934695 0.9935634 0.9999437 -0.9934695 0.9935633 0.9999437 -0.9934695 0.9935633 0.9999437 -0.9934694 0.9935633 0.9999437 -0.9934694 0.9935633 0.9999437 -0.9934694 0.9935632 0.9999437 -0.9934694 0.9935632 0.9999437 -0.9934694 0.9935631 0.9999437 -0.9934694 0.9935631 0.9999437 -0.9934694 0.993563 0.9999437 -0.9934694 0.993563 0.9999437 -0.9934694 0.9935629 0.9999437 -0.9934695 0.9935629 0.9999437 -0.9934697 0.9935629 0.9999437 -0.9934698 0.9935629 0.9999437 -0.9934701 0.9935629 0.9999437 -0.9934704 0.9935629 0.9999437 -0.9934707 0.9935629 0.9999437 -0.9934712 0.9935629 0.9999437 -0.9934718 0.9935629 0.9999437 -0.9934725 0.9935629 0.9999437 -0.9934734 0.9935629 0.9999437 -0.9934746 0.9935629 0.9999437 -0.9934761 0.9935629 0.9999437 -0.9934779 0.9935629 0.9999437 -0.9934803 0.9935629 0.9999437 -0.9934833 0.9935629 0.9999437 -0.9934871 0.9935629 0.9999437 -0.9934919 0.9935629 0.9999437 -0.993498 0.9935629 0.9999437 -0.9935057 0.9935629 0.9999437 -0.9935154 0.9935629 0.9999437 -0.9935277 0.9935629 0.9999437 -0.9935432 0.9935629 0.9999437 -0.9935629 0.9935629 0.9999437 -0.9935878 0.9935629 0.9999437 -0.9936193 0.9935629 0.9999437 -0.9936592 0.9935629 0.9999437 -0.9937096 0.9935629 0.9999437 -0.9937734 0.9935629 0.9999437 -0.9938541 0.9935629 0.9999437 -0.9939562 0.9935629 0.9999437 -0.9940854 0.9935629 0.9999437 -0.9942488 0.9935629 0.9999437 -0.9944556 0.9935629 0.9999437 -0.9947172 0.9935629 0.9999437 -0.9950481 0.9935629 0.9999437 -0.9954668 0.9935629 0.9999437 -0.9959964 0.9935629 0.9999437 -0.9966665 0.9935629 0.9999437 -0.9975143 0.9935629 0.9999437 -0.9985868 0.9935629 0.9999437 -0.9999437 0.9935629 0.9999437 -0.9934695 0.9935883 0.9999437 -0.9934695 0.9935883 0.9999437 -0.9934695 0.9935883 0.9999437 -0.9934695 0.9935883 0.9999437 -0.9934695 0.9935883 0.9999437 -0.9934695 0.9935882 0.9999437 -0.9934695 0.9935882 0.9999437 -0.9934694 0.9935882 0.9999437 -0.9934694 0.9935882 0.9999437 -0.9934694 0.9935881 0.9999437 -0.9934694 0.9935881 0.9999437 -0.9934694 0.993588 0.9999437 -0.9934694 0.993588 0.9999437 -0.9934694 0.9935879 0.9999437 -0.9934694 0.9935879 0.9999437 -0.9934694 0.9935878 0.9999437 -0.9934695 0.9935878 0.9999437 -0.9934697 0.9935878 0.9999437 -0.9934698 0.9935878 0.9999437 -0.9934701 0.9935878 0.9999437 -0.9934704 0.9935878 0.9999437 -0.9934707 0.9935878 0.9999437 -0.9934712 0.9935878 0.9999437 -0.9934718 0.9935878 0.9999437 -0.9934725 0.9935878 0.9999437 -0.9934734 0.9935878 0.9999437 -0.9934746 0.9935878 0.9999437 -0.9934761 0.9935878 0.9999437 -0.9934779 0.9935878 0.9999437 -0.9934803 0.9935878 0.9999437 -0.9934833 0.9935878 0.9999437 -0.9934871 0.9935878 0.9999437 -0.9934919 0.9935878 0.9999437 -0.993498 0.9935878 0.9999437 -0.9935057 0.9935878 0.9999437 -0.9935154 0.9935878 0.9999437 -0.9935277 0.9935878 0.9999437 -0.9935432 0.9935878 0.9999437 -0.9935629 0.9935878 0.9999437 -0.9935878 0.9935878 0.9999437 -0.9936193 0.9935878 0.9999437 -0.9936592 0.9935878 0.9999437 -0.9937096 0.9935878 0.9999437 -0.9937734 0.9935878 0.9999437 -0.9938541 0.9935878 0.9999437 -0.9939562 0.9935878 0.9999437 -0.9940854 0.9935878 0.9999437 -0.9942488 0.9935878 0.9999437 -0.9944556 0.9935878 0.9999437 -0.9947172 0.9935878 0.9999437 -0.9950481 0.9935878 0.9999437 -0.9954668 0.9935878 0.9999437 -0.9959964 0.9935878 0.9999437 -0.9966665 0.9935878 0.9999437 -0.9975143 0.9935878 0.9999437 -0.9985868 0.9935878 0.9999437 -0.9999437 0.9935878 0.9999437 -0.9934695 0.9936198 0.9999437 -0.9934695 0.9936198 0.9999437 -0.9934695 0.9936198 0.9999437 -0.9934695 0.9936198 0.9999437 -0.9934695 0.9936198 0.9999437 -0.9934695 0.9936197 0.9999437 -0.9934695 0.9936197 0.9999437 -0.9934694 0.9936197 0.9999437 -0.9934694 0.9936197 0.9999437 -0.9934694 0.9936196 0.9999437 -0.9934694 0.9936196 0.9999437 -0.9934694 0.9936196 0.9999437 -0.9934694 0.9936195 0.9999437 -0.9934694 0.9936194 0.9999437 -0.9934694 0.9936194 0.9999437 -0.9934694 0.9936193 0.9999437 -0.9934695 0.9936193 0.9999437 -0.9934697 0.9936193 0.9999437 -0.9934698 0.9936193 0.9999437 -0.9934701 0.9936193 0.9999437 -0.9934704 0.9936193 0.9999437 -0.9934707 0.9936193 0.9999437 -0.9934712 0.9936193 0.9999437 -0.9934718 0.9936193 0.9999437 -0.9934725 0.9936193 0.9999437 -0.9934734 0.9936193 0.9999437 -0.9934746 0.9936193 0.9999437 -0.9934761 0.9936193 0.9999437 -0.9934779 0.9936193 0.9999437 -0.9934803 0.9936193 0.9999437 -0.9934833 0.9936193 0.9999437 -0.9934871 0.9936193 0.9999437 -0.9934919 0.9936193 0.9999437 -0.993498 0.9936193 0.9999437 -0.9935057 0.9936193 0.9999437 -0.9935154 0.9936193 0.9999437 -0.9935277 0.9936193 0.9999437 -0.9935432 0.9936193 0.9999437 -0.9935629 0.9936193 0.9999437 -0.9935878 0.9936193 0.9999437 -0.9936193 0.9936193 0.9999437 -0.9936592 0.9936193 0.9999437 -0.9937096 0.9936193 0.9999437 -0.9937734 0.9936193 0.9999437 -0.9938541 0.9936193 0.9999437 -0.9939562 0.9936193 0.9999437 -0.9940854 0.9936193 0.9999437 -0.9942488 0.9936193 0.9999437 -0.9944556 0.9936193 0.9999437 -0.9947172 0.9936193 0.9999437 -0.9950481 0.9936193 0.9999437 -0.9954668 0.9936193 0.9999437 -0.9959964 0.9936193 0.9999437 -0.9966665 0.9936193 0.9999437 -0.9975143 0.9936193 0.9999437 -0.9985868 0.9936193 0.9999437 -0.9999437 0.9936193 0.9999437 -0.9934695 0.9936597 0.9999437 -0.9934695 0.9936596 0.9999437 -0.9934695 0.9936596 0.9999437 -0.9934695 0.9936596 0.9999437 -0.9934695 0.9936596 0.9999437 -0.9934695 0.9936596 0.9999437 -0.9934695 0.9936596 0.9999437 -0.9934694 0.9936596 0.9999437 -0.9934694 0.9936595 0.9999437 -0.9934694 0.9936595 0.9999437 -0.9934694 0.9936595 0.9999437 -0.9934694 0.9936594 0.9999437 -0.9934694 0.9936594 0.9999437 -0.9934694 0.9936593 0.9999437 -0.9934694 0.9936592 0.9999437 -0.9934694 0.9936592 0.9999437 -0.9934695 0.9936592 0.9999437 -0.9934697 0.9936592 0.9999437 -0.9934698 0.9936592 0.9999437 -0.9934701 0.9936592 0.9999437 -0.9934704 0.9936592 0.9999437 -0.9934707 0.9936592 0.9999437 -0.9934712 0.9936592 0.9999437 -0.9934718 0.9936592 0.9999437 -0.9934725 0.9936592 0.9999437 -0.9934734 0.9936592 0.9999437 -0.9934746 0.9936592 0.9999437 -0.9934761 0.9936592 0.9999437 -0.9934779 0.9936592 0.9999437 -0.9934803 0.9936592 0.9999437 -0.9934833 0.9936592 0.9999437 -0.9934871 0.9936592 0.9999437 -0.9934919 0.9936592 0.9999437 -0.993498 0.9936592 0.9999437 -0.9935057 0.9936592 0.9999437 -0.9935154 0.9936592 0.9999437 -0.9935277 0.9936592 0.9999437 -0.9935432 0.9936592 0.9999437 -0.9935629 0.9936592 0.9999437 -0.9935878 0.9936592 0.9999437 -0.9936193 0.9936592 0.9999437 -0.9936592 0.9936592 0.9999437 -0.9937096 0.9936592 0.9999437 -0.9937734 0.9936592 0.9999437 -0.9938541 0.9936592 0.9999437 -0.9939562 0.9936592 0.9999437 -0.9940854 0.9936592 0.9999437 -0.9942488 0.9936592 0.9999437 -0.9944556 0.9936592 0.9999437 -0.9947172 0.9936592 0.9999437 -0.9950481 0.9936592 0.9999437 -0.9954668 0.9936592 0.9999437 -0.9959964 0.9936592 0.9999437 -0.9966665 0.9936592 0.9999437 -0.9975143 0.9936592 0.9999437 -0.9985868 0.9936592 0.9999437 -0.9999437 0.9936592 0.9999437 -0.9934695 0.9937101 0.9999437 -0.9934695 0.9937101 0.9999437 -0.9934695 0.9937101 0.9999437 -0.9934695 0.9937101 0.9999437 -0.9934695 0.99371 0.9999437 -0.9934695 0.99371 0.9999437 -0.9934695 0.99371 0.9999437 -0.9934694 0.99371 0.9999437 -0.9934694 0.99371 0.9999437 -0.9934694 0.9937099 0.9999437 -0.9934694 0.9937099 0.9999437 -0.9934694 0.9937098 0.9999437 -0.9934694 0.9937098 0.9999437 -0.9934694 0.9937097 0.9999437 -0.9934694 0.9937097 0.9999437 -0.9934694 0.9937096 0.9999437 -0.9934695 0.9937096 0.9999437 -0.9934697 0.9937096 0.9999437 -0.9934698 0.9937096 0.9999437 -0.9934701 0.9937096 0.9999437 -0.9934704 0.9937096 0.9999437 -0.9934707 0.9937096 0.9999437 -0.9934712 0.9937096 0.9999437 -0.9934718 0.9937096 0.9999437 -0.9934725 0.9937096 0.9999437 -0.9934734 0.9937096 0.9999437 -0.9934746 0.9937096 0.9999437 -0.9934761 0.9937096 0.9999437 -0.9934779 0.9937096 0.9999437 -0.9934803 0.9937096 0.9999437 -0.9934833 0.9937096 0.9999437 -0.9934871 0.9937096 0.9999437 -0.9934919 0.9937096 0.9999437 -0.993498 0.9937096 0.9999437 -0.9935057 0.9937096 0.9999437 -0.9935154 0.9937096 0.9999437 -0.9935277 0.9937096 0.9999437 -0.9935432 0.9937096 0.9999437 -0.9935629 0.9937096 0.9999437 -0.9935878 0.9937096 0.9999437 -0.9936193 0.9937096 0.9999437 -0.9936592 0.9937096 0.9999437 -0.9937096 0.9937096 0.9999437 -0.9937734 0.9937096 0.9999437 -0.9938541 0.9937096 0.9999437 -0.9939562 0.9937096 0.9999437 -0.9940854 0.9937096 0.9999437 -0.9942488 0.9937096 0.9999437 -0.9944556 0.9937096 0.9999437 -0.9947172 0.9937096 0.9999437 -0.9950481 0.9937096 0.9999437 -0.9954668 0.9937096 0.9999437 -0.9959964 0.9937096 0.9999437 -0.9966665 0.9937096 0.9999437 -0.9975143 0.9937096 0.9999437 -0.9985868 0.9937096 0.9999437 -0.9999437 0.9937096 0.9999437 -0.9934695 0.9937739 0.9999437 -0.9934695 0.9937739 0.9999437 -0.9934695 0.9937739 0.9999437 -0.9934695 0.9937738 0.9999437 -0.9934695 0.9937738 0.9999437 -0.9934695 0.9937738 0.9999437 -0.9934695 0.9937738 0.9999437 -0.9934694 0.9937738 0.9999437 -0.9934694 0.9937737 0.9999437 -0.9934694 0.9937737 0.9999437 -0.9934694 0.9937737 0.9999437 -0.9934694 0.9937736 0.9999437 -0.9934694 0.9937736 0.9999437 -0.9934694 0.9937735 0.9999437 -0.9934694 0.9937735 0.9999437 -0.9934694 0.9937734 0.9999437 -0.9934695 0.9937734 0.9999437 -0.9934697 0.9937734 0.9999437 -0.9934698 0.9937734 0.9999437 -0.9934701 0.9937734 0.9999437 -0.9934704 0.9937734 0.9999437 -0.9934707 0.9937734 0.9999437 -0.9934712 0.9937734 0.9999437 -0.9934718 0.9937734 0.9999437 -0.9934725 0.9937734 0.9999437 -0.9934734 0.9937734 0.9999437 -0.9934746 0.9937734 0.9999437 -0.9934761 0.9937734 0.9999437 -0.9934779 0.9937734 0.9999437 -0.9934803 0.9937734 0.9999437 -0.9934833 0.9937734 0.9999437 -0.9934871 0.9937734 0.9999437 -0.9934919 0.9937734 0.9999437 -0.993498 0.9937734 0.9999437 -0.9935057 0.9937734 0.9999437 -0.9935154 0.9937734 0.9999437 -0.9935277 0.9937734 0.9999437 -0.9935432 0.9937734 0.9999437 -0.9935629 0.9937734 0.9999437 -0.9935878 0.9937734 0.9999437 -0.9936193 0.9937734 0.9999437 -0.9936592 0.9937734 0.9999437 -0.9937096 0.9937734 0.9999437 -0.9937734 0.9937734 0.9999437 -0.9938541 0.9937734 0.9999437 -0.9939562 0.9937734 0.9999437 -0.9940854 0.9937734 0.9999437 -0.9942488 0.9937734 0.9999437 -0.9944556 0.9937734 0.9999437 -0.9947172 0.9937734 0.9999437 -0.9950481 0.9937734 0.9999437 -0.9954668 0.9937734 0.9999437 -0.9959964 0.9937734 0.9999437 -0.9966665 0.9937734 0.9999437 -0.9975143 0.9937734 0.9999437 -0.9985868 0.9937734 0.9999437 -0.9999437 0.9937734 0.9999437 -0.9934695 0.9938546 0.9999437 -0.9934695 0.9938546 0.9999437 -0.9934695 0.9938546 0.9999437 -0.9934695 0.9938545 0.9999437 -0.9934695 0.9938545 0.9999437 -0.9934695 0.9938545 0.9999437 -0.9934695 0.9938545 0.9999437 -0.9934694 0.9938545 0.9999437 -0.9934694 0.9938545 0.9999437 -0.9934694 0.9938544 0.9999437 -0.9934694 0.9938544 0.9999437 -0.9934694 0.9938543 0.9999437 -0.9934694 0.9938543 0.9999437 -0.9934694 0.9938542 0.9999437 -0.9934694 0.9938542 0.9999437 -0.9934694 0.9938541 0.9999437 -0.9934695 0.9938541 0.9999437 -0.9934697 0.9938541 0.9999437 -0.9934698 0.9938541 0.9999437 -0.9934701 0.9938541 0.9999437 -0.9934704 0.9938541 0.9999437 -0.9934707 0.9938541 0.9999437 -0.9934712 0.9938541 0.9999437 -0.9934718 0.9938541 0.9999437 -0.9934725 0.9938541 0.9999437 -0.9934734 0.9938541 0.9999437 -0.9934746 0.9938541 0.9999437 -0.9934761 0.9938541 0.9999437 -0.9934779 0.9938541 0.9999437 -0.9934803 0.9938541 0.9999437 -0.9934833 0.9938541 0.9999437 -0.9934871 0.9938541 0.9999437 -0.9934919 0.9938541 0.9999437 -0.993498 0.9938541 0.9999437 -0.9935057 0.9938541 0.9999437 -0.9935154 0.9938541 0.9999437 -0.9935277 0.9938541 0.9999437 -0.9935432 0.9938541 0.9999437 -0.9935629 0.9938541 0.9999437 -0.9935878 0.9938541 0.9999437 -0.9936193 0.9938541 0.9999437 -0.9936592 0.9938541 0.9999437 -0.9937096 0.9938541 0.9999437 -0.9937734 0.9938541 0.9999437 -0.9938541 0.9938541 0.9999437 -0.9939562 0.9938541 0.9999437 -0.9940854 0.9938541 0.9999437 -0.9942488 0.9938541 0.9999437 -0.9944556 0.9938541 0.9999437 -0.9947172 0.9938541 0.9999437 -0.9950481 0.9938541 0.9999437 -0.9954668 0.9938541 0.9999437 -0.9959964 0.9938541 0.9999437 -0.9966665 0.9938541 0.9999437 -0.9975143 0.9938541 0.9999437 -0.9985868 0.9938541 0.9999437 -0.9999437 0.9938541 0.9999437 -0.9934695 0.9939567 0.9999437 -0.9934695 0.9939567 0.9999437 -0.9934695 0.9939567 0.9999437 -0.9934695 0.9939566 0.9999437 -0.9934695 0.9939566 0.9999437 -0.9934695 0.9939566 0.9999437 -0.9934695 0.9939566 0.9999437 -0.9934694 0.9939566 0.9999437 -0.9934694 0.9939566 0.9999437 -0.9934694 0.9939565 0.9999437 -0.9934694 0.9939565 0.9999437 -0.9934694 0.9939564 0.9999437 -0.9934694 0.9939564 0.9999437 -0.9934694 0.9939563 0.9999437 -0.9934694 0.9939563 0.9999437 -0.9934694 0.9939562 0.9999437 -0.9934695 0.9939562 0.9999437 -0.9934697 0.9939562 0.9999437 -0.9934698 0.9939562 0.9999437 -0.9934701 0.9939562 0.9999437 -0.9934704 0.9939562 0.9999437 -0.9934707 0.9939562 0.9999437 -0.9934712 0.9939562 0.9999437 -0.9934718 0.9939562 0.9999437 -0.9934725 0.9939562 0.9999437 -0.9934734 0.9939562 0.9999437 -0.9934746 0.9939562 0.9999437 -0.9934761 0.9939562 0.9999437 -0.9934779 0.9939562 0.9999437 -0.9934803 0.9939562 0.9999437 -0.9934833 0.9939562 0.9999437 -0.9934871 0.9939562 0.9999437 -0.9934919 0.9939562 0.9999437 -0.993498 0.9939562 0.9999437 -0.9935057 0.9939562 0.9999437 -0.9935154 0.9939562 0.9999437 -0.9935277 0.9939562 0.9999437 -0.9935432 0.9939562 0.9999437 -0.9935629 0.9939562 0.9999437 -0.9935878 0.9939562 0.9999437 -0.9936193 0.9939562 0.9999437 -0.9936592 0.9939562 0.9999437 -0.9937096 0.9939562 0.9999437 -0.9937734 0.9939562 0.9999437 -0.9938541 0.9939562 0.9999437 -0.9939562 0.9939562 0.9999437 -0.9940854 0.9939562 0.9999437 -0.9942488 0.9939562 0.9999437 -0.9944556 0.9939562 0.9999437 -0.9947172 0.9939562 0.9999437 -0.9950481 0.9939562 0.9999437 -0.9954668 0.9939562 0.9999437 -0.9959964 0.9939562 0.9999437 -0.9966665 0.9939562 0.9999437 -0.9975143 0.9939562 0.9999437 -0.9985868 0.9939562 0.9999437 -0.9999437 0.9939562 0.9999437 -0.9934695 0.9940858 0.9999437 -0.9934695 0.9940858 0.9999437 -0.9934695 0.9940858 0.9999437 -0.9934695 0.9940858 0.9999437 -0.9934695 0.9940858 0.9999437 -0.9934695 0.9940858 0.9999437 -0.9934695 0.9940858 0.9999437 -0.9934694 0.9940858 0.9999437 -0.9934694 0.9940857 0.9999437 -0.9934694 0.9940857 0.9999437 -0.9934694 0.9940857 0.9999437 -0.9934694 0.9940856 0.9999437 -0.9934694 0.9940856 0.9999437 -0.9934694 0.9940855 0.9999437 -0.9934694 0.9940855 0.9999437 -0.9934694 0.9940854 0.9999437 -0.9934695 0.9940854 0.9999437 -0.9934697 0.9940854 0.9999437 -0.9934698 0.9940854 0.9999437 -0.9934701 0.9940854 0.9999437 -0.9934704 0.9940854 0.9999437 -0.9934707 0.9940854 0.9999437 -0.9934712 0.9940854 0.9999437 -0.9934718 0.9940854 0.9999437 -0.9934725 0.9940854 0.9999437 -0.9934734 0.9940854 0.9999437 -0.9934746 0.9940854 0.9999437 -0.9934761 0.9940854 0.9999437 -0.9934779 0.9940854 0.9999437 -0.9934803 0.9940854 0.9999437 -0.9934833 0.9940854 0.9999437 -0.9934871 0.9940854 0.9999437 -0.9934919 0.9940854 0.9999437 -0.993498 0.9940854 0.9999437 -0.9935057 0.9940854 0.9999437 -0.9935154 0.9940854 0.9999437 -0.9935277 0.9940854 0.9999437 -0.9935432 0.9940854 0.9999437 -0.9935629 0.9940854 0.9999437 -0.9935878 0.9940854 0.9999437 -0.9936193 0.9940854 0.9999437 -0.9936592 0.9940854 0.9999437 -0.9937096 0.9940854 0.9999437 -0.9937734 0.9940854 0.9999437 -0.9938541 0.9940854 0.9999437 -0.9939562 0.9940854 0.9999437 -0.9940854 0.9940854 0.9999437 -0.9942488 0.9940854 0.9999437 -0.9944556 0.9940854 0.9999437 -0.9947172 0.9940854 0.9999437 -0.9950481 0.9940854 0.9999437 -0.9954668 0.9940854 0.9999437 -0.9959964 0.9940854 0.9999437 -0.9966665 0.9940854 0.9999437 -0.9975143 0.9940854 0.9999437 -0.9985868 0.9940854 0.9999437 -0.9999437 0.9940854 0.9999437 -0.9934695 0.9942493 0.9999437 -0.9934695 0.9942492 0.9999437 -0.9934695 0.9942492 0.9999437 -0.9934695 0.9942492 0.9999437 -0.9934695 0.9942492 0.9999437 -0.9934695 0.9942492 0.9999437 -0.9934695 0.9942492 0.9999437 -0.9934694 0.9942492 0.9999437 -0.9934694 0.9942491 0.9999437 -0.9934694 0.9942491 0.9999437 -0.9934694 0.9942491 0.9999437 -0.9934694 0.994249 0.9999437 -0.9934694 0.994249 0.9999437 -0.9934694 0.9942489 0.9999437 -0.9934694 0.9942489 0.9999437 -0.9934694 0.9942488 0.9999437 -0.9934695 0.9942488 0.9999437 -0.9934697 0.9942488 0.9999437 -0.9934698 0.9942488 0.9999437 -0.9934701 0.9942488 0.9999437 -0.9934704 0.9942488 0.9999437 -0.9934707 0.9942488 0.9999437 -0.9934712 0.9942488 0.9999437 -0.9934718 0.9942488 0.9999437 -0.9934725 0.9942488 0.9999437 -0.9934734 0.9942488 0.9999437 -0.9934746 0.9942488 0.9999437 -0.9934761 0.9942488 0.9999437 -0.9934779 0.9942488 0.9999437 -0.9934803 0.9942488 0.9999437 -0.9934833 0.9942488 0.9999437 -0.9934871 0.9942488 0.9999437 -0.9934919 0.9942488 0.9999437 -0.993498 0.9942488 0.9999437 -0.9935057 0.9942488 0.9999437 -0.9935154 0.9942488 0.9999437 -0.9935277 0.9942488 0.9999437 -0.9935432 0.9942488 0.9999437 -0.9935629 0.9942488 0.9999437 -0.9935878 0.9942488 0.9999437 -0.9936193 0.9942488 0.9999437 -0.9936592 0.9942488 0.9999437 -0.9937096 0.9942488 0.9999437 -0.9937734 0.9942488 0.9999437 -0.9938541 0.9942488 0.9999437 -0.9939562 0.9942488 0.9999437 -0.9940854 0.9942488 0.9999437 -0.9942488 0.9942488 0.9999437 -0.9944556 0.9942488 0.9999437 -0.9947172 0.9942488 0.9999437 -0.9950481 0.9942488 0.9999437 -0.9954668 0.9942488 0.9999437 -0.9959964 0.9942488 0.9999437 -0.9966665 0.9942488 0.9999437 -0.9975143 0.9942488 0.9999437 -0.9985868 0.9942488 0.9999437 -0.9999437 0.9942488 0.9999437 -0.9934695 0.994456 0.9999437 -0.9934695 0.994456 0.9999437 -0.9934695 0.994456 0.9999437 -0.9934695 0.994456 0.9999437 -0.9934695 0.994456 0.9999437 -0.9934695 0.994456 0.9999437 -0.9934695 0.9944559 0.9999437 -0.9934694 0.9944559 0.9999437 -0.9934694 0.9944559 0.9999437 -0.9934694 0.9944559 0.9999437 -0.9934694 0.9944558 0.9999437 -0.9934694 0.9944558 0.9999437 -0.9934694 0.9944557 0.9999437 -0.9934694 0.9944557 0.9999437 -0.9934694 0.9944556 0.9999437 -0.9934694 0.9944556 0.9999437 -0.9934695 0.9944556 0.9999437 -0.9934697 0.9944556 0.9999437 -0.9934698 0.9944556 0.9999437 -0.9934701 0.9944556 0.9999437 -0.9934704 0.9944556 0.9999437 -0.9934707 0.9944556 0.9999437 -0.9934712 0.9944556 0.9999437 -0.9934718 0.9944556 0.9999437 -0.9934725 0.9944556 0.9999437 -0.9934734 0.9944556 0.9999437 -0.9934746 0.9944556 0.9999437 -0.9934761 0.9944556 0.9999437 -0.9934779 0.9944556 0.9999437 -0.9934803 0.9944556 0.9999437 -0.9934833 0.9944556 0.9999437 -0.9934871 0.9944556 0.9999437 -0.9934919 0.9944556 0.9999437 -0.993498 0.9944556 0.9999437 -0.9935057 0.9944556 0.9999437 -0.9935154 0.9944556 0.9999437 -0.9935277 0.9944556 0.9999437 -0.9935432 0.9944556 0.9999437 -0.9935629 0.9944556 0.9999437 -0.9935878 0.9944556 0.9999437 -0.9936193 0.9944556 0.9999437 -0.9936592 0.9944556 0.9999437 -0.9937096 0.9944556 0.9999437 -0.9937734 0.9944556 0.9999437 -0.9938541 0.9944556 0.9999437 -0.9939562 0.9944556 0.9999437 -0.9940854 0.9944556 0.9999437 -0.9942488 0.9944556 0.9999437 -0.9944556 0.9944556 0.9999437 -0.9947172 0.9944556 0.9999437 -0.9950481 0.9944556 0.9999437 -0.9954668 0.9944556 0.9999437 -0.9959964 0.9944556 0.9999437 -0.9966665 0.9944556 0.9999437 -0.9975143 0.9944556 0.9999437 -0.9985868 0.9944556 0.9999437 -0.9999437 0.9944556 0.9999437 -0.9934695 0.9947176 0.9999437 -0.9934695 0.9947176 0.9999437 -0.9934695 0.9947175 0.9999437 -0.9934695 0.9947175 0.9999437 -0.9934695 0.9947175 0.9999437 -0.9934695 0.9947175 0.9999437 -0.9934695 0.9947175 0.9999437 -0.9934694 0.9947175 0.9999437 -0.9934694 0.9947175 0.9999437 -0.9934694 0.9947174 0.9999437 -0.9934694 0.9947174 0.9999437 -0.9934694 0.9947174 0.9999437 -0.9934694 0.9947173 0.9999437 -0.9934694 0.9947173 0.9999437 -0.9934694 0.9947172 0.9999437 -0.9934694 0.9947172 0.9999437 -0.9934695 0.9947172 0.9999437 -0.9934697 0.9947172 0.9999437 -0.9934698 0.9947172 0.9999437 -0.9934701 0.9947172 0.9999437 -0.9934704 0.9947172 0.9999437 -0.9934707 0.9947172 0.9999437 -0.9934712 0.9947172 0.9999437 -0.9934718 0.9947172 0.9999437 -0.9934725 0.9947172 0.9999437 -0.9934734 0.9947172 0.9999437 -0.9934746 0.9947172 0.9999437 -0.9934761 0.9947172 0.9999437 -0.9934779 0.9947172 0.9999437 -0.9934803 0.9947172 0.9999437 -0.9934833 0.9947172 0.9999437 -0.9934871 0.9947172 0.9999437 -0.9934919 0.9947172 0.9999437 -0.993498 0.9947172 0.9999437 -0.9935057 0.9947172 0.9999437 -0.9935154 0.9947172 0.9999437 -0.9935277 0.9947172 0.9999437 -0.9935432 0.9947172 0.9999437 -0.9935629 0.9947172 0.9999437 -0.9935878 0.9947172 0.9999437 -0.9936193 0.9947172 0.9999437 -0.9936592 0.9947172 0.9999437 -0.9937096 0.9947172 0.9999437 -0.9937734 0.9947172 0.9999437 -0.9938541 0.9947172 0.9999437 -0.9939562 0.9947172 0.9999437 -0.9940854 0.9947172 0.9999437 -0.9942488 0.9947172 0.9999437 -0.9944556 0.9947172 0.9999437 -0.9947172 0.9947172 0.9999437 -0.9950481 0.9947172 0.9999437 -0.9954668 0.9947172 0.9999437 -0.9959964 0.9947172 0.9999437 -0.9966665 0.9947172 0.9999437 -0.9975143 0.9947172 0.9999437 -0.9985868 0.9947172 0.9999437 -0.9999437 0.9947172 0.9999437 -0.9934695 0.9950485 0.9999437 -0.9934695 0.9950485 0.9999437 -0.9934695 0.9950484 0.9999437 -0.9934695 0.9950484 0.9999437 -0.9934695 0.9950484 0.9999437 -0.9934695 0.9950484 0.9999437 -0.9934695 0.9950484 0.9999437 -0.9934694 0.9950484 0.9999437 -0.9934694 0.9950484 0.9999437 -0.9934694 0.9950483 0.9999437 -0.9934694 0.9950483 0.9999437 -0.9934694 0.9950483 0.9999437 -0.9934694 0.9950482 0.9999437 -0.9934694 0.9950482 0.9999437 -0.9934694 0.9950481 0.9999437 -0.9934694 0.9950481 0.9999437 -0.9934695 0.9950481 0.9999437 -0.9934697 0.9950481 0.9999437 -0.9934698 0.9950481 0.9999437 -0.9934701 0.9950481 0.9999437 -0.9934704 0.9950481 0.9999437 -0.9934707 0.9950481 0.9999437 -0.9934712 0.9950481 0.9999437 -0.9934718 0.9950481 0.9999437 -0.9934725 0.9950481 0.9999437 -0.9934734 0.9950481 0.9999437 -0.9934746 0.9950481 0.9999437 -0.9934761 0.9950481 0.9999437 -0.9934779 0.9950481 0.9999437 -0.9934803 0.9950481 0.9999437 -0.9934833 0.9950481 0.9999437 -0.9934871 0.9950481 0.9999437 -0.9934919 0.9950481 0.9999437 -0.993498 0.9950481 0.9999437 -0.9935057 0.9950481 0.9999437 -0.9935154 0.9950481 0.9999437 -0.9935277 0.9950481 0.9999437 -0.9935432 0.9950481 0.9999437 -0.9935629 0.9950481 0.9999437 -0.9935878 0.9950481 0.9999437 -0.9936193 0.9950481 0.9999437 -0.9936592 0.9950481 0.9999437 -0.9937096 0.9950481 0.9999437 -0.9937734 0.9950481 0.9999437 -0.9938541 0.9950481 0.9999437 -0.9939562 0.9950481 0.9999437 -0.9940854 0.9950481 0.9999437 -0.9942488 0.9950481 0.9999437 -0.9944556 0.9950481 0.9999437 -0.9947172 0.9950481 0.9999437 -0.9950481 0.9950481 0.9999437 -0.9954668 0.9950481 0.9999437 -0.9959964 0.9950481 0.9999437 -0.9966665 0.9950481 0.9999437 -0.9975143 0.9950481 0.9999437 -0.9985868 0.9950481 0.9999437 -0.9999437 0.9950481 0.9999437 -0.9934695 0.9954671 0.9999437 -0.9934695 0.9954671 0.9999437 -0.9934695 0.9954671 0.9999437 -0.9934695 0.9954671 0.9999437 -0.9934695 0.9954671 0.9999437 -0.9934695 0.9954671 0.9999437 -0.9934695 0.995467 0.9999437 -0.9934694 0.995467 0.9999437 -0.9934694 0.995467 0.9999437 -0.9934694 0.995467 0.9999437 -0.9934694 0.995467 0.9999437 -0.9934694 0.9954669 0.9999437 -0.9934694 0.9954669 0.9999437 -0.9934694 0.9954668 0.9999437 -0.9934694 0.9954668 0.9999437 -0.9934694 0.9954668 0.9999437 -0.9934695 0.9954668 0.9999437 -0.9934697 0.9954668 0.9999437 -0.9934698 0.9954668 0.9999437 -0.9934701 0.9954668 0.9999437 -0.9934704 0.9954668 0.9999437 -0.9934707 0.9954668 0.9999437 -0.9934712 0.9954668 0.9999437 -0.9934718 0.9954668 0.9999437 -0.9934725 0.9954668 0.9999437 -0.9934734 0.9954668 0.9999437 -0.9934746 0.9954668 0.9999437 -0.9934761 0.9954668 0.9999437 -0.9934779 0.9954668 0.9999437 -0.9934803 0.9954668 0.9999437 -0.9934833 0.9954668 0.9999437 -0.9934871 0.9954668 0.9999437 -0.9934919 0.9954668 0.9999437 -0.993498 0.9954668 0.9999437 -0.9935057 0.9954668 0.9999437 -0.9935154 0.9954668 0.9999437 -0.9935277 0.9954668 0.9999437 -0.9935432 0.9954668 0.9999437 -0.9935629 0.9954668 0.9999437 -0.9935878 0.9954668 0.9999437 -0.9936193 0.9954668 0.9999437 -0.9936592 0.9954668 0.9999437 -0.9937096 0.9954668 0.9999437 -0.9937734 0.9954668 0.9999437 -0.9938541 0.9954668 0.9999437 -0.9939562 0.9954668 0.9999437 -0.9940854 0.9954668 0.9999437 -0.9942488 0.9954668 0.9999437 -0.9944556 0.9954668 0.9999437 -0.9947172 0.9954668 0.9999437 -0.9950481 0.9954668 0.9999437 -0.9954668 0.9954668 0.9999437 -0.9959964 0.9954668 0.9999437 -0.9966665 0.9954668 0.9999437 -0.9975143 0.9954668 0.9999437 -0.9985868 0.9954668 0.9999437 -0.9999437 0.9954668 0.9999437 -0.9934695 0.9959967 0.9999437 -0.9934695 0.9959967 0.9999437 -0.9934695 0.9959967 0.9999437 -0.9934695 0.9959967 0.9999437 -0.9934695 0.9959967 0.9999437 -0.9934695 0.9959967 0.9999437 -0.9934695 0.9959967 0.9999437 -0.9934694 0.9959967 0.9999437 -0.9934694 0.9959967 0.9999437 -0.9934694 0.9959966 0.9999437 -0.9934694 0.9959966 0.9999437 -0.9934694 0.9959966 0.9999437 -0.9934694 0.9959965 0.9999437 -0.9934694 0.9959965 0.9999437 -0.9934694 0.9959965 0.9999437 -0.9934694 0.9959964 0.9999437 -0.9934695 0.9959964 0.9999437 -0.9934697 0.9959964 0.9999437 -0.9934698 0.9959964 0.9999437 -0.9934701 0.9959964 0.9999437 -0.9934704 0.9959964 0.9999437 -0.9934707 0.9959964 0.9999437 -0.9934712 0.9959964 0.9999437 -0.9934718 0.9959964 0.9999437 -0.9934725 0.9959964 0.9999437 -0.9934734 0.9959964 0.9999437 -0.9934746 0.9959964 0.9999437 -0.9934761 0.9959964 0.9999437 -0.9934779 0.9959964 0.9999437 -0.9934803 0.9959964 0.9999437 -0.9934833 0.9959964 0.9999437 -0.9934871 0.9959964 0.9999437 -0.9934919 0.9959964 0.9999437 -0.993498 0.9959964 0.9999437 -0.9935057 0.9959964 0.9999437 -0.9935154 0.9959964 0.9999437 -0.9935277 0.9959964 0.9999437 -0.9935432 0.9959964 0.9999437 -0.9935629 0.9959964 0.9999437 -0.9935878 0.9959964 0.9999437 -0.9936193 0.9959964 0.9999437 -0.9936592 0.9959964 0.9999437 -0.9937096 0.9959964 0.9999437 -0.9937734 0.9959964 0.9999437 -0.9938541 0.9959964 0.9999437 -0.9939562 0.9959964 0.9999437 -0.9940854 0.9959964 0.9999437 -0.9942488 0.9959964 0.9999437 -0.9944556 0.9959964 0.9999437 -0.9947172 0.9959964 0.9999437 -0.9950481 0.9959964 0.9999437 -0.9954668 0.9959964 0.9999437 -0.9959964 0.9959964 0.9999437 -0.9966665 0.9959964 0.9999437 -0.9975143 0.9959964 0.9999437 -0.9985868 0.9959964 0.9999437 -0.9999437 0.9959964 0.9999437 -0.9934695 0.9966668 0.9999437 -0.9934695 0.9966668 0.9999437 -0.9934695 0.9966668 0.9999437 -0.9934695 0.9966668 0.9999437 -0.9934695 0.9966668 0.9999437 -0.9934695 0.9966668 0.9999437 -0.9934695 0.9966667 0.9999437 -0.9934694 0.9966667 0.9999437 -0.9934694 0.9966667 0.9999437 -0.9934694 0.9966667 0.9999437 -0.9934694 0.9966667 0.9999437 -0.9934694 0.9966666 0.9999437 -0.9934694 0.9966666 0.9999437 -0.9934694 0.9966666 0.9999437 -0.9934694 0.9966666 0.9999437 -0.9934694 0.9966665 0.9999437 -0.9934695 0.9966665 0.9999437 -0.9934697 0.9966665 0.9999437 -0.9934698 0.9966665 0.9999437 -0.9934701 0.9966665 0.9999437 -0.9934704 0.9966665 0.9999437 -0.9934707 0.9966665 0.9999437 -0.9934712 0.9966665 0.9999437 -0.9934718 0.9966665 0.9999437 -0.9934725 0.9966665 0.9999437 -0.9934734 0.9966665 0.9999437 -0.9934746 0.9966665 0.9999437 -0.9934761 0.9966665 0.9999437 -0.9934779 0.9966665 0.9999437 -0.9934803 0.9966665 0.9999437 -0.9934833 0.9966665 0.9999437 -0.9934871 0.9966665 0.9999437 -0.9934919 0.9966665 0.9999437 -0.993498 0.9966665 0.9999437 -0.9935057 0.9966665 0.9999437 -0.9935154 0.9966665 0.9999437 -0.9935277 0.9966665 0.9999437 -0.9935432 0.9966665 0.9999437 -0.9935629 0.9966665 0.9999437 -0.9935878 0.9966665 0.9999437 -0.9936193 0.9966665 0.9999437 -0.9936592 0.9966665 0.9999437 -0.9937096 0.9966665 0.9999437 -0.9937734 0.9966665 0.9999437 -0.9938541 0.9966665 0.9999437 -0.9939562 0.9966665 0.9999437 -0.9940854 0.9966665 0.9999437 -0.9942488 0.9966665 0.9999437 -0.9944556 0.9966665 0.9999437 -0.9947172 0.9966665 0.9999437 -0.9950481 0.9966665 0.9999437 -0.9954668 0.9966665 0.9999437 -0.9959964 0.9966665 0.9999437 -0.9966665 0.9966665 0.9999437 -0.9975143 0.9966665 0.9999437 -0.9985868 0.9966665 0.9999437 -0.9999437 0.9966665 0.9999437 -0.9934695 0.9975145 0.9999437 -0.9934695 0.9975145 0.9999437 -0.9934695 0.9975145 0.9999437 -0.9934695 0.9975145 0.9999437 -0.9934695 0.9975145 0.9999437 -0.9934695 0.9975145 0.9999437 -0.9934695 0.9975145 0.9999437 -0.9934694 0.9975144 0.9999437 -0.9934694 0.9975144 0.9999437 -0.9934694 0.9975144 0.9999437 -0.9934694 0.9975144 0.9999437 -0.9934694 0.9975144 0.9999437 -0.9934694 0.9975144 0.9999437 -0.9934694 0.9975143 0.9999437 -0.9934694 0.9975143 0.9999437 -0.9934694 0.9975143 0.9999437 -0.9934695 0.9975143 0.9999437 -0.9934697 0.9975143 0.9999437 -0.9934698 0.9975143 0.9999437 -0.9934701 0.9975143 0.9999437 -0.9934704 0.9975143 0.9999437 -0.9934707 0.9975143 0.9999437 -0.9934712 0.9975143 0.9999437 -0.9934718 0.9975143 0.9999437 -0.9934725 0.9975143 0.9999437 -0.9934734 0.9975143 0.9999437 -0.9934746 0.9975143 0.9999437 -0.9934761 0.9975143 0.9999437 -0.9934779 0.9975143 0.9999437 -0.9934803 0.9975143 0.9999437 -0.9934833 0.9975143 0.9999437 -0.9934871 0.9975143 0.9999437 -0.9934919 0.9975143 0.9999437 -0.993498 0.9975143 0.9999437 -0.9935057 0.9975143 0.9999437 -0.9935154 0.9975143 0.9999437 -0.9935277 0.9975143 0.9999437 -0.9935432 0.9975143 0.9999437 -0.9935629 0.9975143 0.9999437 -0.9935878 0.9975143 0.9999437 -0.9936193 0.9975143 0.9999437 -0.9936592 0.9975143 0.9999437 -0.9937096 0.9975143 0.9999437 -0.9937734 0.9975143 0.9999437 -0.9938541 0.9975143 0.9999437 -0.9939562 0.9975143 0.9999437 -0.9940854 0.9975143 0.9999437 -0.9942488 0.9975143 0.9999437 -0.9944556 0.9975143 0.9999437 -0.9947172 0.9975143 0.9999437 -0.9950481 0.9975143 0.9999437 -0.9954668 0.9975143 0.9999437 -0.9959964 0.9975143 0.9999437 -0.9966665 0.9975143 0.9999437 -0.9975143 0.9975143 0.9999437 -0.9985868 0.9975143 0.9999437 -0.9999437 0.9975143 0.9999437 -0.9934695 0.9985869 0.9999437 -0.9934695 0.9985869 0.9999437 -0.9934695 0.9985869 0.9999437 -0.9934695 0.9985869 0.9999437 -0.9934695 0.9985869 0.9999437 -0.9934695 0.9985869 0.9999437 -0.9934695 0.9985869 0.9999437 -0.9934694 0.9985869 0.9999437 -0.9934694 0.9985869 0.9999437 -0.9934694 0.9985869 0.9999437 -0.9934694 0.9985869 0.9999437 -0.9934694 0.9985869 0.9999437 -0.9934694 0.9985869 0.9999437 -0.9934694 0.9985869 0.9999437 -0.9934694 0.9985868 0.9999437 -0.9934694 0.9985868 0.9999437 -0.9934695 0.9985868 0.9999437 -0.9934697 0.9985868 0.9999437 -0.9934698 0.9985868 0.9999437 -0.9934701 0.9985868 0.9999437 -0.9934704 0.9985868 0.9999437 -0.9934707 0.9985868 0.9999437 -0.9934712 0.9985868 0.9999437 -0.9934718 0.9985868 0.9999437 -0.9934725 0.9985868 0.9999437 -0.9934734 0.9985868 0.9999437 -0.9934746 0.9985868 0.9999437 -0.9934761 0.9985868 0.9999437 -0.9934779 0.9985868 0.9999437 -0.9934803 0.9985868 0.9999437 -0.9934833 0.9985868 0.9999437 -0.9934871 0.9985868 0.9999437 -0.9934919 0.9985868 0.9999437 -0.993498 0.9985868 0.9999437 -0.9935057 0.9985868 0.9999437 -0.9935154 0.9985868 0.9999437 -0.9935277 0.9985868 0.9999437 -0.9935432 0.9985868 0.9999437 -0.9935629 0.9985868 0.9999437 -0.9935878 0.9985868 0.9999437 -0.9936193 0.9985868 0.9999437 -0.9936592 0.9985868 0.9999437 -0.9937096 0.9985868 0.9999437 -0.9937734 0.9985868 0.9999437 -0.9938541 0.9985868 0.9999437 -0.9939562 0.9985868 0.9999437 -0.9940854 0.9985868 0.9999437 -0.9942488 0.9985868 0.9999437 -0.9944556 0.9985868 0.9999437 -0.9947172 0.9985868 0.9999437 -0.9950481 0.9985868 0.9999437 -0.9954668 0.9985868 0.9999437 -0.9959964 0.9985868 0.9999437 -0.9966665 0.9985868 0.9999437 -0.9975143 0.9985868 0.9999437 -0.9985868 0.9985868 0.9999437 -0.9999437 0.9985868 0.9999437 -0.9934695 0.9999437 0.9999437 -0.9934695 0.9999437 0.9999437 -0.9934695 0.9999437 0.9999437 -0.9934695 0.9999437 0.9999437 -0.9934695 0.9999437 0.9999437 -0.9934695 0.9999437 0.9999437 -0.9934695 0.9999437 0.9999437 -0.9934694 0.9999437 0.9999437 -0.9934694 0.9999437 0.9999437 -0.9934694 0.9999437 0.9999437 -0.9934694 0.9999437 0.9999437 -0.9934694 0.9999437 0.9999437 -0.9934694 0.9999437 0.9999437 -0.9934694 0.9999437 0.9999437 -0.9934694 0.9999437 0.9999437 -0.9934694 0.9999437 0.9999437 -0.9934695 0.9999437 0.9999437 -0.9934697 0.9999437 0.9999437 -0.9934698 0.9999437 0.9999437 -0.9934701 0.9999437 0.9999437 -0.9934704 0.9999437 0.9999437 -0.9934707 0.9999437 0.9999437 -0.9934712 0.9999437 0.9999437 -0.9934718 0.9999437 0.9999437 -0.9934725 0.9999437 0.9999437 -0.9934734 0.9999437 0.9999437 -0.9934746 0.9999437 0.9999437 -0.9934761 0.9999437 0.9999437 -0.9934779 0.9999437 0.9999437 -0.9934803 0.9999437 0.9999437 -0.9934833 0.9999437 0.9999437 -0.9934871 0.9999437 0.9999437 -0.9934919 0.9999437 0.9999437 -0.993498 0.9999437 0.9999437 -0.9935057 0.9999437 0.9999437 -0.9935154 0.9999437 0.9999437 -0.9935277 0.9999437 0.9999437 -0.9935432 0.9999437 0.9999437 -0.9935629 0.9999437 0.9999437 -0.9935878 0.9999437 0.9999437 -0.9936193 0.9999437 0.9999437 -0.9936592 0.9999437 0.9999437 -0.9937096 0.9999437 0.9999437 -0.9937734 0.9999437 0.9999437 -0.9938541 0.9999437 0.9999437 -0.9939562 0.9999437 0.9999437 -0.9940854 0.9999437 0.9999437 -0.9942488 0.9999437 0.9999437 -0.9944556 0.9999437 0.9999437 -0.9947172 0.9999437 0.9999437 -0.9950481 0.9999437 0.9999437 -0.9954668 0.9999437 0.9999437 -0.9959964 0.9999437 0.9999437 -0.9966665 0.9999437 0.9999437 -0.9975143 0.9999437 0.9999437 -0.9985868 0.9999437 0.9999437 -0.9999437 0.9999437 0.9999437 diff --git a/release/datafiles/icons/ops.sculpt.lasso_hide.dat b/release/datafiles/icons/ops.sculpt.lasso_hide.dat deleted file mode 100644 index 452017b6a7c..00000000000 Binary files a/release/datafiles/icons/ops.sculpt.lasso_hide.dat and /dev/null differ diff --git a/release/datafiles/splash.png b/release/datafiles/splash.png index 4475ee064ac..473e22e66c7 100644 Binary files a/release/datafiles/splash.png and b/release/datafiles/splash.png differ diff --git a/release/datafiles/userdef/userdef_default.c b/release/datafiles/userdef/userdef_default.c index b6234bbc587..ebcdab98815 100644 --- a/release/datafiles/userdef/userdef_default.c +++ b/release/datafiles/userdef/userdef_default.c @@ -18,7 +18,7 @@ #include "GPU_platform.h" -#include "BLO_userdef_default.h" /* own include */ +#include "BLO_readfile.h" /* own include */ const UserDef U_default = { .versionfile = BLENDER_FILE_VERSION, diff --git a/release/datafiles/userdef/userdef_default_theme.c b/release/datafiles/userdef/userdef_default_theme.c index 19e9ab723fc..994e62ea257 100644 --- a/release/datafiles/userdef/userdef_default_theme.c +++ b/release/datafiles/userdef/userdef_default_theme.c @@ -10,7 +10,7 @@ #include "DNA_userdef_types.h" -#include "BLO_userdef_default.h" +#include "BLO_readfile.h" /* clang-format off */ diff --git a/release/license/THIRD-PARTY-LICENSES.txt b/release/license/THIRD-PARTY-LICENSES.txt index ac8174c1712..717d1b533f1 100644 --- a/release/license/THIRD-PARTY-LICENSES.txt +++ b/release/license/THIRD-PARTY-LICENSES.txt @@ -19,19 +19,20 @@ PERFORMANCE OF THIS SOFTWARE. ------ -** Audaspace; version 1.4+ (ae29ce2) -- https://audaspace.github.io/ +** Audaspace; version 1.3.0 -- https://audaspace.github.io/ ** Cuda Wrangler; version cbf465b -- https://github.com/CudaWrangler/cuew ** Draco; version 1.3.6 -- https://google.github.io/draco/ ** Embree; version 4.1.0 -- https://github.com/embree/embree ** Intel(R) oneAPI DPC++ compiler; version 2022-12 -- https://github.com/intel/llvm#oneapi-dpc-compiler -** Intel® Open Path Guiding Library; version 0.6.0 -- http://www.openpgl.org/ +** Intel® Open Path Guiding Library; version 0.5.0 -- http://www.openpgl.org/ ** Mantaflow; version 0.13 -- http://mantaflow.com/ ** materialX; version 1.38.6 -- https://github.com/AcademySoftwareFoundation/MaterialX ** meson; version 0.63 -- https://github.com/mesonbuild/meson ** oneAPI Threading Building Block; version 2020_U3 -- https://software.intel.com/en-us/oneapi/onetbb +** OpenCL Wrangler; version 27a6867 -- https://github.com/OpenCLWrangler/clew ** OpenImageDenoise; version 1.4.3 -- https://www.openimagedenoise.org/ ** OpenImageIO; version 2.4.15.0 -- http://www.openimageio.org ** OpenSSL; version 3.1.2 -- https://www.openssl.org/ @@ -244,7 +245,7 @@ See the License for the specific language governing permissions and limitations under the License. * For Audaspace see also this required NOTICE: - Copyright © 2009-2023 Jörg Müller. All rights reserved. + Copyright © 2009-2020 Jörg Müller. All rights reserved. * For Cuda Wrangler see also this required NOTICE: Copyright 2011-2014 Blender Foundation * For Draco see also this required NOTICE: @@ -449,7 +450,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ** AutoPackage; version 1.0 -- http://autopackage.org BinReloc - a library for creating relocatable executables Written by: Hongli Lai -** LZMA SDK; version 23.01 -- https://www.7-zip.org/sdk.html +** LZMA SDK; version 5.2.5 -- https://www.7-zip.org/sdk.html LZMA SDK: Public Domain Creative Commons Legal Code @@ -3461,7 +3462,7 @@ SOFTWARE. ------ -** {fmt}; version 10.1.1 -- https://github.com/fmtlib/fmt +** {fmt}; version 10.0.0 -- https://github.com/fmtlib/fmt Copyright (c) 2012 - present, Victor Zverovich and {fmt} contributors ** Brotli; version 1.0.9 -- https://github.com/google/brotli Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors. @@ -3508,7 +3509,7 @@ Jonathan Shewchuk and Leonidas Guibas. All rights reserved. Copyright (c) 2017 Thibaut Goetghebuer-Planchon ** sse2neon; version 1.6.0 -- https://github.com/DLTcollab/sse2neon Copyright sse2neon contributors -** TinyGLTF; version 2.8.21 -- https://github.com/syoyo/tinygltf +** TinyGLTF; version 2.5.0 -- https://github.com/syoyo/tinygltf Copyright (c) 2017 Syoyo Fujita, Aurélien Chatelain and many contributors ** Wayland protocols; version 1.31 -- https://gitlab.freedesktop.org/wayland/wayland-protocols diff --git a/scripts/modules/bpy/__init__.py b/scripts/modules/bpy/__init__.py index 492c1165710..3f9ad78156c 100644 --- a/scripts/modules/bpy/__init__.py +++ b/scripts/modules/bpy/__init__.py @@ -10,7 +10,6 @@ __all__ = ( "app", "context", "data", - "msgbus", "ops", "path", "props", diff --git a/scripts/modules/bpy/utils/__init__.py b/scripts/modules/bpy/utils/__init__.py index 9261ce1bcf6..a8ba8ad6de8 100644 --- a/scripts/modules/bpy/utils/__init__.py +++ b/scripts/modules/bpy/utils/__init__.py @@ -21,8 +21,6 @@ __all__ = ( "refresh_script_paths", "app_template_paths", "register_class", - "register_cli_command", - "unregister_cli_command", "register_manual_map", "unregister_manual_map", "register_classes_factory", @@ -51,11 +49,9 @@ from _bpy import ( flip_name, unescape_identifier, register_class, - register_cli_command, resource_path, script_paths as _bpy_script_paths, unregister_class, - unregister_cli_command, user_resource as _user_resource, system_resource, ) diff --git a/scripts/modules/bpy/utils/toolsystem.py b/scripts/modules/bpy/utils/toolsystem.py index 433723a8250..514f44b9f92 100644 --- a/scripts/modules/bpy/utils/toolsystem.py +++ b/scripts/modules/bpy/utils/toolsystem.py @@ -2,10 +2,6 @@ # # SPDX-License-Identifier: GPL-2.0-or-later -__all__ = ( - "ToolDef", -) - # Until we untangle ToolDef from bl_ui internals, # use this module to document ToolDef. from bl_ui.space_toolsystem_common import ToolDef diff --git a/scripts/modules/bpy_extras/anim_utils.py b/scripts/modules/bpy_extras/anim_utils.py index 747c2516d23..15c45104551 100644 --- a/scripts/modules/bpy_extras/anim_utils.py +++ b/scripts/modules/bpy_extras/anim_utils.py @@ -233,7 +233,7 @@ def bake_action_iter( return {} # Be careful about which properties to actually consider for baking, as - # keeping references to complex Blender data-structures around for too long + # keeping references to complex Blender datastructures around for too long # can cause crashes. See #117988. clean_props = { key: rna_idprop_value_to_python(value) diff --git a/scripts/modules/bpy_extras/io_utils.py b/scripts/modules/bpy_extras/io_utils.py index 536747b3930..e45924e2fc1 100644 --- a/scripts/modules/bpy_extras/io_utils.py +++ b/scripts/modules/bpy_extras/io_utils.py @@ -297,7 +297,7 @@ def axis_conversion(from_forward='Y', from_up='Z', to_forward='Y', to_up='Z'): for i, axis_lut in enumerate(_axis_convert_lut): if value in axis_lut: return Matrix(_axis_convert_matrix[i]) - assert False, "unreachable" + assert 0 def axis_conversion_ensure(operator, forward_attr, up_attr): diff --git a/scripts/modules/bpy_types.py b/scripts/modules/bpy_types.py index d87261bed05..0d4fd3ab3b9 100644 --- a/scripts/modules/bpy_types.py +++ b/scripts/modules/bpy_types.py @@ -1317,6 +1317,24 @@ class RenderEngine(StructRNA, metaclass=RNAMeta): __slots__ = () +class UserExtensionRepo(StructRNA): + __slots__ = () + + @property + def directory(self): + """Return ``directory`` or a default path derived from the users scripts path.""" + if self.use_custom_directory: + return self.custom_directory + import bpy + import os + # TODO: this should eventually be accessed via `bpy.utils.user_resource('EXTENSIONS')` + # which points to the same location (by default). + if (path := bpy.utils.resource_path('USER')): + return os.path.join(path, "extensions", self.module) + # Unlikely this is ever encountered. + return "" + + class HydraRenderEngine(RenderEngine): __slots__ = () diff --git a/scripts/modules/rna_keymap_ui.py b/scripts/modules/rna_keymap_ui.py index 990cf1400ea..46a7f01e23c 100644 --- a/scripts/modules/rna_keymap_ui.py +++ b/scripts/modules/rna_keymap_ui.py @@ -375,7 +375,7 @@ def draw_keymaps(context, layout): rowsub.menu("USERPREF_MT_keyconfigs", text=text) rowsub.operator("wm.keyconfig_preset_add", text="", icon='ADD') - rowsub.operator("wm.keyconfig_preset_remove", text="", icon='REMOVE') + rowsub.operator("wm.keyconfig_preset_add", text="", icon='REMOVE').remove_active = True rowsub = split.row(align=True) rowsub.operator("preferences.keyconfig_import", text="Import...", icon='IMPORT') diff --git a/scripts/modules/sys_info.py b/scripts/modules/sys_info.py index 255e628ce0b..0c8e48df824 100644 --- a/scripts/modules/sys_info.py +++ b/scripts/modules/sys_info.py @@ -208,7 +208,6 @@ def write_sysinfo(filepath): output.write("Maximum Vertex Image Units:\t%d\n" % gpu.capabilities.max_textures_vert_get()) output.write("Maximum Fragment Image Units:\t%d\n" % gpu.capabilities.max_textures_frag_get()) output.write("Maximum Pipeline Image Units:\t%d\n" % gpu.capabilities.max_textures_get()) - output.write("Maximum Image Units:\t%d\n" % gpu.capabilities.max_images_get()) output.write("\nFeatures:\n") output.write("Compute Shader Support: \t%d\n" % diff --git a/scripts/presets/keyconfig/keymap_data/blender_default.py b/scripts/presets/keyconfig/keymap_data/blender_default.py index 16e3ddcc16b..8e26d6aa939 100644 --- a/scripts/presets/keyconfig/keymap_data/blender_default.py +++ b/scripts/presets/keyconfig/keymap_data/blender_default.py @@ -768,7 +768,7 @@ def km_window(params): ("wm.search_menu", {"type": 'SPACE', "value": 'PRESS'}, None), ) else: - assert False, "unreachable" + assert False return keymap @@ -3530,7 +3530,7 @@ def km_frames(params): ("screen.animation_play", {"type": 'SPACE', "value": 'PRESS'}, None), ) else: - assert False, "unreachable" + assert False items.extend([ ("screen.animation_play", {"type": 'SPACE', "value": 'PRESS', "shift": True, "ctrl": True}, @@ -4587,9 +4587,6 @@ def km_grease_pencil_paint_mode(_params): *_template_items_hide_reveal_actions("grease_pencil.layer_hide", "grease_pencil.layer_reveal"), ("paint.sample_color", {"type": 'X', "value": 'PRESS', "shift": True}, None), - - # Isolate Layer - ("grease_pencil.layer_isolate", {"type": 'NUMPAD_ASTERIX', "value": 'PRESS'}, None), ]) return keymap @@ -4616,11 +4613,6 @@ def km_grease_pencil_edit_mode(params): # Dissolve ("grease_pencil.dissolve", {"type": 'X', "value": 'PRESS', "ctrl": True}, None), ("grease_pencil.dissolve", {"type": 'DEL', "value": 'PRESS', "ctrl": True}, None), - # Copy/paste - ("grease_pencil.copy", {"type": 'C', "value": 'PRESS', "ctrl": True}, None), - ("grease_pencil.paste", {"type": 'V', "value": 'PRESS', "ctrl": True}, None), - ("grease_pencil.paste", {"type": 'V', "value": 'PRESS', "shift": True, "ctrl": True}, - {"properties": [("paste_back", True)]}), # Separate ("grease_pencil.separate", {"type": 'P', "value": 'PRESS'}, None), # Delete all active frames @@ -4668,14 +4660,6 @@ def km_grease_pencil_edit_mode(params): "ctrl": True, "repeat": True}, {"properties": [("direction", "DOWN")]}), ("grease_pencil.reorder", {"type": 'DOWN_ARROW', "value": 'PRESS', "ctrl": True, "shift": True}, {"properties": [("direction", "BOTTOM")]}), - - # Isolate Layer - ("grease_pencil.layer_isolate", {"type": 'NUMPAD_ASTERIX', "value": 'PRESS'}, None), - - # Select mode - ("grease_pencil.set_selection_mode", {"type": 'ONE', "value": 'PRESS'}, {"properties": [("mode", 'POINT')]}), - ("grease_pencil.set_selection_mode", {"type": 'TWO', "value": 'PRESS'}, {"properties": [("mode", 'STROKE')]}), - ]) return keymap @@ -5459,8 +5443,8 @@ def km_sculpt(params): {"properties": [("mode", 'TOGGLE')]}), ("sculpt.face_set_change_visibility", {"type": 'H', "value": 'PRESS'}, {"properties": [("mode", 'HIDE_ACTIVE')]}), - ("paint.hide_show_all", {"type": 'H', "value": 'PRESS', "alt": True}, - {"properties": [("action", "SHOW")]}), + ("paint.hide_show", {"type": 'H', "value": 'PRESS', "alt": True}, + {"properties": [("action", "SHOW"), ("area", "ALL")]}), ("sculpt.face_set_edit", {"type": 'W', "value": 'PRESS', "ctrl": True}, {"properties": [("mode", 'GROW')]}), ("sculpt.face_set_edit", {"type": 'W', "value": 'PRESS', "ctrl": True, "alt": True}, @@ -7886,23 +7870,8 @@ def km_3d_view_tool_sculpt_box_hide(params): {"properties": [("action", 'HIDE')]}), ("paint.hide_show", {**params.tool_maybe_tweak_event, "ctrl": True}, {"properties": [("action", 'SHOW')]}), - ("paint.hide_show_all", {"type": params.select_mouse, "value": params.select_mouse_value}, - {"properties": [("action", 'SHOW')]}), - ]}, - ) - - -def km_3d_view_tool_sculpt_lasso_hide(params): - return ( - "3D View Tool: Sculpt, Lasso Hide", - {"space_type": 'VIEW_3D', "region_type": 'WINDOW'}, - {"items": [ - ("paint.hide_show_lasso_gesture", params.tool_maybe_tweak_event, - {"properties": [("action", 'HIDE')]}), - ("paint.hide_show_lasso_gesture", {**params.tool_maybe_tweak_event, "ctrl": True}, - {"properties": [("action", 'SHOW')]}), - ("paint.hide_show_all", {"type": params.select_mouse, "value": params.select_mouse_value}, - {"properties": [("action", 'SHOW')]}), + ("paint.hide_show", {"type": params.select_mouse, "value": params.select_mouse_value}, + {"properties": [("action", 'SHOW'), ("area", 'ALL')]}), ]}, ) @@ -8752,7 +8721,6 @@ def generate_keymaps(params=None): km_3d_view_tool_edit_curve_extrude_to_cursor(params), km_3d_view_tool_edit_curves_draw(params), km_3d_view_tool_sculpt_box_hide(params), - km_3d_view_tool_sculpt_lasso_hide(params), km_3d_view_tool_sculpt_box_mask(params), km_3d_view_tool_sculpt_lasso_mask(params), km_3d_view_tool_sculpt_box_face_set(params), diff --git a/scripts/presets/keyconfig/keymap_data/industry_compatible_data.py b/scripts/presets/keyconfig/keymap_data/industry_compatible_data.py index 640c39ccdff..9ccfd81d2fb 100644 --- a/scripts/presets/keyconfig/keymap_data/industry_compatible_data.py +++ b/scripts/presets/keyconfig/keymap_data/industry_compatible_data.py @@ -3708,10 +3708,10 @@ def km_sculpt(params): {"properties": [("mode", 'HIDE_ACTIVE')]}), ("sculpt.face_set_change_visibility", {"type": 'H', "value": 'PRESS', "shift": True}, {"properties": [("mode", 'TOGGLE')]}), - ("paint.hide_show_masked", {"type": 'H', "value": 'PRESS', "ctrl": True}, - {"properties": [("action", 'HIDE')]}), - ("paint.hide_show_all", {"type": 'H', "value": 'PRESS', "alt": True}, - {"properties": [("action", 'SHOW')]}), + ("paint.hide_show", {"type": 'H', "value": 'PRESS', "ctrl": True}, + {"properties": [("action", 'HIDE'), ("area", 'MASKED')]}), + ("paint.hide_show", {"type": 'H', "value": 'PRESS', "alt": True}, + {"properties": [("action", 'SHOW'), ("area", 'ALL')]}), # Subdivision levels *_template_items_object_subdivision_set(), ("object.subdivision_set", {"type": 'D', "value": 'PRESS', "repeat": True}, diff --git a/scripts/startup/bl_operators/add_mesh_torus.py b/scripts/startup/bl_operators/add_mesh_torus.py index c80457cc9cd..cc45cb9d7d7 100644 --- a/scripts/startup/bl_operators/add_mesh_torus.py +++ b/scripts/startup/bl_operators/add_mesh_torus.py @@ -147,7 +147,8 @@ class AddTorus(Operator, object_utils.AddObjectHelper): ) major_radius: FloatProperty( name="Major Radius", - description="Radius from the origin to the center of the cross sections", + description=("Radius from the origin to the " + "center of the cross sections"), soft_min=0.0, soft_max=100.0, min=0.0, max=10_000.0, default=1.0, diff --git a/scripts/startup/bl_operators/anim.py b/scripts/startup/bl_operators/anim.py index 6b97f41a96a..289e1f1138f 100644 --- a/scripts/startup/bl_operators/anim.py +++ b/scripts/startup/bl_operators/anim.py @@ -289,11 +289,11 @@ class NLA_OT_bake(Operator): else: objects = context.selected_editable_objects if bake_options.do_pose and not bake_options.do_object: - pose_object = getattr(context, "pose_object", None) + pose_object = getattr(context, 'pose_object', None) if pose_object and pose_object not in objects: # The active object might not be selected, but it is the one in pose mode. # It can be assumed this pose needs baking. - objects.append(pose_object) + objects.append(context.pose_object) objects = [obj for obj in objects if obj.pose is not None] object_action_pairs = ( @@ -459,8 +459,8 @@ class ARMATURE_OT_copy_bone_color_to_selected(Operator): bl_options = {'REGISTER', 'UNDO'} _bone_type_enum = [ - ('EDIT', "Bone", "Copy Bone colors from the active bone to all selected bones"), - ('POSE', "Pose Bone", "Copy Pose Bone colors from the active pose bone to all selected pose bones"), + ('EDIT', 'Bone', 'Copy Bone colors from the active bone to all selected bones'), + ('POSE', 'Pose Bone', 'Copy Pose Bone colors from the active pose bone to all selected pose bones'), ] bone_type: EnumProperty( @@ -648,7 +648,7 @@ class ARMATURE_OT_collection_remove_unused(Operator): for bcoll in reversed(list(bcolls_to_remove)): armature.collections.remove(bcoll) - self.report({'INFO'}, "Removed %d of %d bone collections" % + self.report({'INFO'}, 'Removed %d of %d bone collections' % (num_bcolls_to_remove, num_bcolls_before_removal)) diff --git a/scripts/startup/bl_operators/clip.py b/scripts/startup/bl_operators/clip.py index 374fb92e23a..99aa2b8043c 100644 --- a/scripts/startup/bl_operators/clip.py +++ b/scripts/startup/bl_operators/clip.py @@ -760,7 +760,8 @@ class CLIP_OT_setup_tracking_scene(Operator): def setup_space(space): space.show_backdrop = True - CLIP_spaces_walk(context, True, 'NODE_EDITOR', 'NODE_EDITOR', setup_space) + CLIP_spaces_walk(context, True, 'NODE_EDITOR', 'NODE_EDITOR', + setup_space) sc = context.space_data scene = context.scene @@ -811,7 +812,8 @@ class CLIP_OT_setup_tracking_scene(Operator): tree.links.new(movieclip.outputs["Image"], distortion.inputs["Image"]) if need_stabilization: - tree.links.new(distortion.outputs["Image"], stabilize.inputs["Image"]) + tree.links.new(distortion.outputs["Image"], + stabilize.inputs["Image"]) tree.links.new(stabilize.outputs["Image"], scale.inputs["Image"]) else: tree.links.new(distortion.outputs["Image"], scale.inputs["Image"]) diff --git a/scripts/startup/bl_operators/console.py b/scripts/startup/bl_operators/console.py index a15831b7cd0..682fbf5023b 100644 --- a/scripts/startup/bl_operators/console.py +++ b/scripts/startup/bl_operators/console.py @@ -42,7 +42,8 @@ class ConsoleExec(Operator): if execute is not None: return execute(context, self.interactive) else: - print("Error: bpy.ops.console.execute_%s - not found" % sc.language) + print("Error: bpy.ops.console.execute_%s - not found" % + sc.language) return {'FINISHED'} @@ -64,7 +65,8 @@ class ConsoleAutocomplete(Operator): if autocomplete: return autocomplete(context) else: - print("Error: bpy.ops.console.autocomplete_%s - not found" % sc.language) + print("Error: bpy.ops.console.autocomplete_%s - not found" % + sc.language) return {'FINISHED'} @@ -86,7 +88,8 @@ class ConsoleCopyAsScript(Operator): if copy_as_script: return copy_as_script(context) else: - print("Error: copy_as_script - not found for %r" % sc.language) + print("Error: copy_as_script - not found for %r" % + sc.language) return {'FINISHED'} @@ -112,7 +115,8 @@ class ConsoleBanner(Operator): if banner: return banner(context) else: - print("Error: bpy.ops.console.banner_%s - not found" % sc.language) + print("Error: bpy.ops.console.banner_%s - not found" % + sc.language) return {'FINISHED'} @@ -140,7 +144,8 @@ class ConsoleLanguage(Operator): bpy.ops.console.banner() # insert a new blank line - bpy.ops.console.history_append(text="", current_character=0, remove_duplicates=True) + bpy.ops.console.history_append(text="", current_character=0, + remove_duplicates=True) return {'FINISHED'} diff --git a/scripts/startup/bl_operators/file.py b/scripts/startup/bl_operators/file.py index f0938b7e7c4..db1348a5a28 100644 --- a/scripts/startup/bl_operators/file.py +++ b/scripts/startup/bl_operators/file.py @@ -105,6 +105,7 @@ class WM_OT_previews_batch_generate(Operator): bpy.app.binary_path, "--background", "--factory-startup", + "-noaudio", ] if self.use_trusted: cmd.append("--enable-autoexec") @@ -115,13 +116,13 @@ class WM_OT_previews_batch_generate(Operator): "--", ]) if not self.use_scenes: - cmd.append("--no_scenes") + cmd.append('--no_scenes') if not self.use_collections: - cmd.append("--no_collections") + cmd.append('--no_collections') if not self.use_objects: - cmd.append("--no_objects") + cmd.append('--no_objects') if not self.use_intern_data: - cmd.append("--no_data_intern") + cmd.append('--no_data_intern') if not self.use_backups: cmd.append("--no_backups") if subprocess.call(cmd): @@ -214,6 +215,7 @@ class WM_OT_previews_batch_clear(Operator): bpy.app.binary_path, "--background", "--factory-startup", + "-noaudio", ] if self.use_trusted: cmd.append("--enable-autoexec") @@ -225,13 +227,13 @@ class WM_OT_previews_batch_clear(Operator): "--clear", ]) if not self.use_scenes: - cmd.append("--no_scenes") + cmd.append('--no_scenes') if not self.use_collections: - cmd.append("--no_collections") + cmd.append('--no_collections') if not self.use_objects: - cmd.append("--no_objects") + cmd.append('--no_objects') if not self.use_intern_data: - cmd.append("--no_data_intern") + cmd.append('--no_data_intern') if not self.use_backups: cmd.append("--no_backups") if subprocess.call(cmd): diff --git a/scripts/startup/bl_operators/mesh.py b/scripts/startup/bl_operators/mesh.py index 5058b91ad3e..e4110f04eb7 100644 --- a/scripts/startup/bl_operators/mesh.py +++ b/scripts/startup/bl_operators/mesh.py @@ -171,7 +171,9 @@ class MeshMirrorUV(Operator): self.report({'WARNING'}, rpt_("%d mesh(es) with no active UV layer, " "%d duplicates found in %d mesh(es), mirror may be incomplete") - % (total_no_active_UV, total_duplicates, meshes_with_duplicates)) + % (total_no_active_UV, + total_duplicates, + meshes_with_duplicates)) elif total_no_active_UV: self.report({'WARNING'}, rpt_("%d mesh(es) with no active UV layer") diff --git a/scripts/startup/bl_operators/node.py b/scripts/startup/bl_operators/node.py index 133ff608db7..9a49cc8467e 100644 --- a/scripts/startup/bl_operators/node.py +++ b/scripts/startup/bl_operators/node.py @@ -58,7 +58,8 @@ class NodeAddOperator: # convert mouse position to the View2D for later node placement if context.region.type == 'WINDOW': # convert mouse position to the View2D for later node placement - space.cursor_location_from_region(event.mouse_region_x, event.mouse_region_y) + space.cursor_location_from_region( + event.mouse_region_x, event.mouse_region_y) else: space.cursor_location = tree.view_center diff --git a/scripts/startup/bl_operators/object.py b/scripts/startup/bl_operators/object.py index f0c9b9ebdd2..c965f262883 100644 --- a/scripts/startup/bl_operators/object.py +++ b/scripts/startup/bl_operators/object.py @@ -223,7 +223,8 @@ class SubdivisionSet(Operator): ) relative: BoolProperty( name="Relative", - description="Apply the subdivision surface level as an offset relative to the current level", + description=("Apply the subdivision surface level as an offset " + "relative to the current level"), default=False, ) @@ -287,7 +288,8 @@ class SubdivisionSet(Operator): mod = obj.modifiers.new("Subdivision", 'SUBSURF') mod.levels = level except BaseException: - self.report({'WARNING'}, "Modifiers cannot be added to object: " + obj.name) + self.report({'WARNING'}, + "Modifiers cannot be added to object: " + obj.name) for obj in context.selected_editable_objects: set_object_subd(obj) @@ -323,7 +325,8 @@ class ShapeTransfer(Operator): ) use_clamp: BoolProperty( name="Clamp Offset", - description="Clamp the transformation to the distance each vertex moves in the original shape", + description=("Clamp the transformation to the distance each " + "vertex moves in the original shape"), default=False, ) @@ -444,7 +447,8 @@ class ShapeTransfer(Operator): if use_clamp: # clamp to the same movement as the original # breaks copy between different scaled meshes. - len_from = (orig_shape_coords[i] - orig_coords[i]).length + len_from = (orig_shape_coords[i] - + orig_coords[i]).length ofs = co - target_coords[i] ofs.length = len_from co = target_coords[i] + ofs @@ -900,6 +904,81 @@ class DupliOffsetFromObject(Operator): return {'FINISHED'} +class LoadImageAsEmpty: + bl_options = {'REGISTER', 'UNDO'} + + filepath: StringProperty( + subtype='FILE_PATH' + ) + + filter_image: BoolProperty(default=True, options={'HIDDEN', 'SKIP_SAVE'}) + filter_movie: BoolProperty(default=True, options={'HIDDEN', 'SKIP_SAVE'}) + filter_folder: BoolProperty(default=True, options={'HIDDEN', 'SKIP_SAVE'}) + + view_align: BoolProperty( + name="Align to View", + default=True, + ) + + @classmethod + def poll(cls, context): + return context.mode == 'OBJECT' + + def invoke(self, context, _event): + context.window_manager.fileselect_add(self) + return {'RUNNING_MODAL'} + + def execute(self, context): + scene = context.scene + cursor = scene.cursor.location + + try: + image = bpy.data.images.load(self.filepath, check_existing=True) + except RuntimeError as ex: + self.report({'ERROR'}, str(ex)) + return {'CANCELLED'} + + bpy.ops.object.empty_add( + 'INVOKE_REGION_WIN', + type='IMAGE', + location=cursor, + align=('VIEW' if self.view_align else 'WORLD'), + ) + + view_layer = context.view_layer + obj = view_layer.objects.active + obj.data = image + obj.empty_display_size = 5.0 + self.set_settings(context, obj) + return {'FINISHED'} + + def set_settings(self, context, obj): + pass + + +class LoadBackgroundImage(LoadImageAsEmpty, Operator): + """Add a reference image into the background behind objects""" + bl_idname = "object.load_background_image" + bl_label = "Load Background Image" + + def set_settings(self, context, obj): + obj.empty_image_depth = 'BACK' + obj.empty_image_side = 'FRONT' + + if context.space_data.type == 'VIEW_3D': + if not context.space_data.region_3d.is_perspective: + obj.show_empty_image_perspective = False + + +class LoadReferenceImage(LoadImageAsEmpty, Operator): + """Add a reference image into the scene between objects""" + bl_idname = "object.load_reference_image" + bl_label = "Load Reference Image" + + def set_settings(self, context, obj): + pass + + class OBJECT_OT_assign_property_defaults(Operator): """Assign the current values of custom properties as their defaults, """ \ """for use as part of the rest pose state in NLA track mixing""" @@ -951,6 +1030,8 @@ classes = ( DupliOffsetFromObject, IsolateTypeRender, JoinUVs, + LoadBackgroundImage, + LoadReferenceImage, MakeDupliFace, SelectCamera, SelectHierarchy, diff --git a/scripts/startup/bl_operators/object_align.py b/scripts/startup/bl_operators/object_align.py index 824d606dbc5..0a45f5aadac 100644 --- a/scripts/startup/bl_operators/object_align.py +++ b/scripts/startup/bl_operators/object_align.py @@ -101,7 +101,13 @@ def worldspace_bounds_from_object_data(depsgraph, obj): return Vector((left, front, up)), Vector((right, back, down)) -def align_objects(context, align_x, align_y, align_z, align_mode, relative_to, bb_quality): +def align_objects(context, + align_x, + align_y, + align_z, + align_mode, + relative_to, + bb_quality): depsgraph = context.evaluated_depsgraph_get() scene = context.scene @@ -109,7 +115,8 @@ def align_objects(context, align_x, align_y, align_z, align_mode, relative_to, b cursor = scene.cursor.location # We are accessing runtime data such as evaluated bounding box, so we need to - # be sure it is properly updated and valid (bounding box might be lost on operator redo). + # be sure it is properly updated and valid (bounding box might be lost on operator + # redo). context.view_layer.update() Left_Front_Up_SEL = [0.0, 0.0, 0.0] diff --git a/scripts/startup/bl_operators/object_quick_effects.py b/scripts/startup/bl_operators/object_quick_effects.py index 51d0f651a5e..d7ec7d37628 100644 --- a/scripts/startup/bl_operators/object_quick_effects.py +++ b/scripts/startup/bl_operators/object_quick_effects.py @@ -277,7 +277,9 @@ class QuickExplode(ObjectModeOperator, Operator): for obj in mesh_objects: if obj.particle_systems: - self.report({'ERROR'}, rpt_("Object %r already has a " "particle system") % obj.name) + self.report({'ERROR'}, + rpt_("Object %r already has a " + "particle system") % obj.name) return {'CANCELLED'} @@ -299,7 +301,7 @@ class QuickExplode(ObjectModeOperator, Operator): settings.normal_factor = self.velocity settings.render_type = 'NONE' - explode = obj.modifiers.new(name="Explode", type='EXPLODE') + explode = obj.modifiers.new(name='Explode', type='EXPLODE') explode.use_edge_cut = True if self.fade: @@ -516,7 +518,8 @@ class QuickSmoke(ObjectModeOperator, Operator): # Add Principled Volume node_principled = nodes.new(type='ShaderNodeVolumePrincipled') node_principled.location = grid_location(4, 1) - links.new(node_principled.outputs["Volume"], node_out.inputs["Volume"]) + links.new(node_principled.outputs["Volume"], + node_out.inputs["Volume"]) node_principled.inputs["Density"].default_value = 5.0 diff --git a/scripts/startup/bl_operators/object_randomize_transform.py b/scripts/startup/bl_operators/object_randomize_transform.py index 9a94fcfc405..748034125b7 100644 --- a/scripts/startup/bl_operators/object_randomize_transform.py +++ b/scripts/startup/bl_operators/object_randomize_transform.py @@ -6,7 +6,8 @@ from bpy.types import Operator from mathutils import Vector -def randomize_selected(context, seed, delta, loc, rot, scale, scale_even, _scale_min): +def randomize_selected(context, seed, delta, + loc, rot, scale, scale_even, _scale_min): import random from random import uniform @@ -99,7 +100,8 @@ class RandomizeLocRotSize(Operator): ) use_delta: BoolProperty( name="Transform Delta", - description="Randomize delta transform values instead of regular transform", + description=("Randomize delta transform values " + "instead of regular transform"), default=False, ) use_loc: BoolProperty( @@ -109,7 +111,8 @@ class RandomizeLocRotSize(Operator): ) loc: FloatVectorProperty( name="Location", - description="Maximum distance the objects can spread over each axis", + description=("Maximum distance the objects " + "can spread over each axis"), min=-100.0, max=100.0, default=(0.0, 0.0, 0.0), @@ -171,7 +174,8 @@ class RandomizeLocRotSize(Operator): # scale_min = self.scale_min scale_min = 0 - randomize_selected(context, seed, delta, loc, rot, scale, scale_even, scale_min) + randomize_selected(context, seed, delta, + loc, rot, scale, scale_even, scale_min) return {'FINISHED'} diff --git a/scripts/startup/bl_operators/presets.py b/scripts/startup/bl_operators/presets.py index a10e75875e1..a7c61cefdea 100644 --- a/scripts/startup/bl_operators/presets.py +++ b/scripts/startup/bl_operators/presets.py @@ -120,7 +120,9 @@ class AddPresetBase: if is_xml: import rna_xml - rna_xml.xml_file_write(context, filepath, preset_menu_class.preset_xml_map) + rna_xml.xml_file_write(context, + filepath, + preset_menu_class.preset_xml_map) else: def rna_recursive_attr_expand(value, rna_path_step, level): @@ -167,10 +169,15 @@ class AddPresetBase: name = preset_menu_class.bl_label # fairly sloppy but convenient. - filepath = bpy.utils.preset_find(name, self.preset_subdir, ext=ext) + filepath = bpy.utils.preset_find(name, + self.preset_subdir, + ext=ext) if not filepath: - filepath = bpy.utils.preset_find(name, self.preset_subdir, display_name=True, ext=ext) + filepath = bpy.utils.preset_find(name, + self.preset_subdir, + display_name=True, + ext=ext) if not filepath: return {'CANCELLED'} @@ -250,7 +257,9 @@ class ExecutePreset(Operator): elif ext == ".xml": import rna_xml - rna_xml.xml_file_run(context, filepath, preset_class.preset_xml_map) + rna_xml.xml_file_run(context, + filepath, + preset_class.preset_xml_map) if hasattr(preset_class, "post_cb"): preset_class.post_cb(context) @@ -554,44 +563,17 @@ class AddPresetNodeColor(AddPresetBase, Operator): class AddPresetInterfaceTheme(AddPresetBase, Operator): - """Add a custom theme to the preset list""" + """Add or remove a theme preset""" bl_idname = "wm.interface_theme_preset_add" - bl_label = "Add Theme" + bl_label = "Add Theme Preset" preset_menu = "USERPREF_MT_interface_theme_presets" preset_subdir = "interface_theme" -class RemovePresetInterfaceTheme(AddPresetBase, Operator): - """Remove a custom theme from the preset list""" - bl_idname = "wm.interface_theme_preset_remove" - bl_label = "Remove Theme" - preset_menu = "USERPREF_MT_interface_theme_presets" - preset_subdir = "interface_theme" - - remove_active: BoolProperty( - default=True, - options={'HIDDEN', 'SKIP_SAVE'}, - ) - - @classmethod - def poll(cls, context): - from bpy.utils import is_path_builtin - preset_menu_class = getattr(bpy.types, cls.preset_menu) - name = preset_menu_class.bl_label - filepath = bpy.utils.preset_find(name, cls.preset_subdir, ext=".xml") - if not bool(filepath) or is_path_builtin(filepath): - cls.poll_message_set("Built-in themes cannot be removed") - return False - return True - - def invoke(self, context, event): - return context.window_manager.invoke_confirm(self, event, title="Remove Custom Theme", confirm_text="Delete") - - class AddPresetKeyconfig(AddPresetBase, Operator): - """Add a custom keymap configuration to the preset list""" + """Add or remove a Key-config Preset""" bl_idname = "wm.keyconfig_preset_add" - bl_label = "Add Custom Keymap Configuration" + bl_label = "Add Keyconfig Preset" preset_menu = "USERPREF_MT_keyconfigs" preset_subdir = "keyconfig" @@ -599,43 +581,16 @@ class AddPresetKeyconfig(AddPresetBase, Operator): bpy.ops.preferences.keyconfig_export(filepath=filepath) bpy.utils.keyconfig_set(filepath) - -class RemovePresetKeyconfig(AddPresetBase, Operator): - """Remove a custom keymap configuration from the preset list""" - bl_idname = "wm.keyconfig_preset_remove" - bl_label = "Remove Keymap Configuration" - preset_menu = "USERPREF_MT_keyconfigs" - preset_subdir = "keyconfig" - - remove_active: BoolProperty( - default=True, - options={'HIDDEN', 'SKIP_SAVE'}, - ) - - @classmethod - def poll(cls, context): - from bpy.utils import is_path_builtin - keyconfigs = bpy.context.window_manager.keyconfigs - preset_menu_class = getattr(bpy.types, cls.preset_menu) - name = keyconfigs.active.name - filepath = bpy.utils.preset_find(name, cls.preset_subdir, ext=".py") - if not bool(filepath) or is_path_builtin(filepath): - cls.poll_message_set("Built-in keymap configurations cannot be removed") - return False - return True - def pre_cb(self, context): keyconfigs = bpy.context.window_manager.keyconfigs - preset_menu_class = getattr(bpy.types, self.preset_menu) - preset_menu_class.bl_label = keyconfigs.active.name + if self.remove_active: + preset_menu_class = getattr(bpy.types, self.preset_menu) + preset_menu_class.bl_label = keyconfigs.active.name def post_cb(self, context): keyconfigs = bpy.context.window_manager.keyconfigs - keyconfigs.remove(keyconfigs.active) - - def invoke(self, context, event): - return context.window_manager.invoke_confirm( - self, event, title="Remove Keymap Configuration", confirm_text="Delete") + if self.remove_active: + keyconfigs.remove(keyconfigs.active) class AddPresetOperator(AddPresetBase, Operator): @@ -856,9 +811,7 @@ classes = ( AddPresetFluid, AddPresetHairDynamics, AddPresetInterfaceTheme, - RemovePresetInterfaceTheme, AddPresetKeyconfig, - RemovePresetKeyconfig, AddPresetNodeColor, AddPresetOperator, AddPresetRender, diff --git a/scripts/startup/bl_operators/userpref.py b/scripts/startup/bl_operators/userpref.py index 46cef9811e5..059fae0b440 100644 --- a/scripts/startup/bl_operators/userpref.py +++ b/scripts/startup/bl_operators/userpref.py @@ -427,9 +427,9 @@ class PREFERENCES_OT_keyconfig_remove(Operator): # Add-on Operators class PREFERENCES_OT_addon_enable(Operator): - """Turn on this extension""" + """Enable an add-on""" bl_idname = "preferences.addon_enable" - bl_label = "Enable Extension" + bl_label = "Enable Add-on" module: StringProperty( name="Module", @@ -473,9 +473,9 @@ class PREFERENCES_OT_addon_enable(Operator): class PREFERENCES_OT_addon_disable(Operator): - """Turn off this extension""" + """Disable an add-on""" bl_idname = "preferences.addon_disable" - bl_label = "Disable Extension" + bl_label = "Disable Add-on" module: StringProperty( name="Module", diff --git a/scripts/startup/bl_operators/uvcalc_transform.py b/scripts/startup/bl_operators/uvcalc_transform.py index 67f3edb7ebf..567ea614a28 100644 --- a/scripts/startup/bl_operators/uvcalc_transform.py +++ b/scripts/startup/bl_operators/uvcalc_transform.py @@ -434,7 +434,8 @@ class RandomizeUVTransform(Operator): ) loc: FloatVectorProperty( name="Location", - description="Maximum distance the objects can spread over each axis", + description=("Maximum distance the objects " + "can spread over each axis"), min=-100.0, max=100.0, size=2, diff --git a/scripts/startup/bl_operators/view3d.py b/scripts/startup/bl_operators/view3d.py index bb09082d218..6c3f23b2d34 100644 --- a/scripts/startup/bl_operators/view3d.py +++ b/scripts/startup/bl_operators/view3d.py @@ -155,7 +155,8 @@ class VIEW3D_OT_edit_mesh_extrude_move(Operator): return {'FINISHED'} def execute(self, context): - return VIEW3D_OT_edit_mesh_extrude_move.extrude_region(self, context, False, self.dissolve_and_intersect) + return VIEW3D_OT_edit_mesh_extrude_move.extrude_region( + self, context, False, self.dissolve_and_intersect) def invoke(self, context, _event): return self.execute(context) diff --git a/scripts/startup/bl_operators/wm.py b/scripts/startup/bl_operators/wm.py index 69292ad0346..42d5fa6c726 100644 --- a/scripts/startup/bl_operators/wm.py +++ b/scripts/startup/bl_operators/wm.py @@ -2084,7 +2084,8 @@ class WM_OT_properties_edit_value(Operator): rna_item = eval("context.%s" % self.data_path) if WM_OT_properties_edit.get_property_type(rna_item, self.property_name) == 'PYTHON': - self.eval_string = WM_OT_properties_edit.convert_custom_property_to_string(rna_item, self.property_name) + self.eval_string = WM_OT_properties_edit.convert_custom_property_to_string(rna_item, + self.property_name) else: self.eval_string = "" @@ -2959,7 +2960,7 @@ class WM_OT_batch_rename(Operator): elif method == 'SUFFIX': name = name + text else: - assert False, "unreachable" + assert 0 elif ty == 'STRIP': chars = action.strip_chars @@ -3004,9 +3005,9 @@ class WM_OT_batch_rename(Operator): elif method == 'TITLE': name = name.title() else: - assert False, "unreachable" + assert 0 else: - assert False, "unreachable" + assert 0 return name def _data_update(self, context): diff --git a/scripts/startup/bl_ui/anim.py b/scripts/startup/bl_ui/anim.py index f3f9d61de40..21019d73162 100644 --- a/scripts/startup/bl_ui/anim.py +++ b/scripts/startup/bl_ui/anim.py @@ -1,7 +1,3 @@ -# SPDX-FileCopyrightText: 2024 Blender Authors -# -# SPDX-License-Identifier: GPL-2.0-or-later - from bpy.types import Menu diff --git a/scripts/startup/bl_ui/node_add_menu_geometry.py b/scripts/startup/bl_ui/node_add_menu_geometry.py index 76d98e2f02a..af54f2d961d 100644 --- a/scripts/startup/bl_ui/node_add_menu_geometry.py +++ b/scripts/startup/bl_ui/node_add_menu_geometry.py @@ -410,11 +410,7 @@ class NODE_MT_geometry_node_GEO_MESH_OPERATIONS(Menu): node_add_menu.add_node_type(layout, "GeometryNodeFlipFaces") node_add_menu.add_node_type(layout, "GeometryNodeMeshBoolean") node_add_menu.add_node_type(layout, "GeometryNodeMeshToCurve") - if context.preferences.experimental.use_new_volume_nodes: - node_add_menu.add_node_type(layout, "GeometryNodeMeshToDensityGrid") node_add_menu.add_node_type(layout, "GeometryNodeMeshToPoints") - if context.preferences.experimental.use_new_volume_nodes: - node_add_menu.add_node_type(layout, "GeometryNodeMeshToSDFGrid") node_add_menu.add_node_type(layout, "GeometryNodeMeshToVolume") node_add_menu.add_node_type(layout, "GeometryNodeScaleElements") node_add_menu.add_node_type(layout, "GeometryNodeSplitEdges") @@ -476,14 +472,10 @@ class NODE_MT_category_GEO_POINT(Menu): def draw(self, context): layout = self.layout node_add_menu.add_node_type(layout, "GeometryNodeDistributePointsInVolume") - if context.preferences.experimental.use_new_volume_nodes: - node_add_menu.add_node_type(layout, "GeometryNodeDistributePointsInGrid") node_add_menu.add_node_type(layout, "GeometryNodeDistributePointsOnFaces") layout.separator() node_add_menu.add_node_type(layout, "GeometryNodePoints") node_add_menu.add_node_type(layout, "GeometryNodePointsToCurves") - if context.preferences.experimental.use_new_volume_nodes: - node_add_menu.add_node_type(layout, "GeometryNodePointsToSDFGrid") node_add_menu.add_node_type(layout, "GeometryNodePointsToVertices") node_add_menu.add_node_type(layout, "GeometryNodePointsToVolume") layout.separator() @@ -541,7 +533,7 @@ class NODE_MT_category_GEO_UTILITIES(Menu): bl_idname = "NODE_MT_category_GEO_UTILITIES" bl_label = "Utilities" - def draw(self, context): + def draw(self, _context): layout = self.layout layout.menu("NODE_MT_geometry_node_GEO_COLOR") layout.menu("NODE_MT_category_GEO_TEXT") @@ -549,8 +541,6 @@ class NODE_MT_category_GEO_UTILITIES(Menu): layout.separator() layout.menu("NODE_MT_category_GEO_UTILITIES_FIELD") layout.menu("NODE_MT_category_GEO_UTILITIES_MATH") - if context.preferences.experimental.use_new_matrix_socket: - layout.menu("NODE_MT_category_utilities_matrix") layout.menu("NODE_MT_category_GEO_UTILITIES_ROTATION") layout.menu("NODE_MT_category_GEO_UTILITIES_DEPRECATED") layout.separator() @@ -602,22 +592,6 @@ class NODE_MT_category_GEO_UTILITIES_ROTATION(Menu): node_add_menu.draw_assets_for_catalog(layout, "Utilities/Rotation") -class NODE_MT_category_utilities_matrix(Menu): - bl_idname = "NODE_MT_category_utilities_matrix" - bl_label = "Matrix" - - def draw(self, _context): - layout = self.layout - node_add_menu.add_node_type(layout, "FunctionNodeCombineTransform") - node_add_menu.add_node_type(layout, "FunctionNodeInvertMatrix") - node_add_menu.add_node_type(layout, "FunctionNodeMatrixMultiply") - node_add_menu.add_node_type(layout, "FunctionNodeSeparateTransform") - node_add_menu.add_node_type(layout, "FunctionNodeTransformDirection") - node_add_menu.add_node_type(layout, "FunctionNodeTransformPoint") - node_add_menu.add_node_type(layout, "FunctionNodeTransposeMatrix") - node_add_menu.draw_assets_for_catalog(layout, "Utilities/Matrix") - - class NODE_MT_category_GEO_UTILITIES_MATH(Menu): bl_idname = "NODE_MT_category_GEO_UTILITIES_MATH" bl_label = "Math" @@ -674,7 +648,6 @@ class NODE_MT_category_GEO_VOLUME(Menu): layout = self.layout if context.preferences.experimental.use_new_volume_nodes: layout.menu("NODE_MT_geometry_node_GEO_VOLUME_READ") - layout.menu("NODE_MT_geometry_node_volume_sample") layout.menu("NODE_MT_geometry_node_GEO_VOLUME_WRITE") layout.separator() layout.menu("NODE_MT_geometry_node_GEO_VOLUME_OPERATIONS") @@ -702,16 +675,6 @@ class NODE_MT_geometry_node_GEO_VOLUME_WRITE(Menu): node_add_menu.draw_assets_for_catalog(layout, "Volume/Write") -class NODE_MT_geometry_node_volume_sample(Menu): - bl_idname = "NODE_MT_geometry_node_volume_sample" - bl_label = "Sample" - - def draw(self, context): - layout = self.layout - node_add_menu.add_node_type(layout, "GeometryNodeSampleGrid") - node_add_menu.draw_assets_for_catalog(layout, "Volume/Sample") - - class NODE_MT_geometry_node_GEO_VOLUME_OPERATIONS(Menu): bl_idname = "NODE_MT_geometry_node_GEO_VOLUME_OPERATIONS" bl_label = "Operations" @@ -719,8 +682,6 @@ class NODE_MT_geometry_node_GEO_VOLUME_OPERATIONS(Menu): def draw(self, context): layout = self.layout node_add_menu.add_node_type(layout, "GeometryNodeVolumeToMesh") - if context.preferences.experimental.use_new_volume_nodes: - node_add_menu.add_node_type(layout, "GeometryNodeGridToMesh") node_add_menu.draw_assets_for_catalog(layout, "Volume/Operations") @@ -806,7 +767,6 @@ classes = ( NODE_MT_category_simulation, NODE_MT_category_GEO_VOLUME, NODE_MT_geometry_node_GEO_VOLUME_READ, - NODE_MT_geometry_node_volume_sample, NODE_MT_geometry_node_GEO_VOLUME_WRITE, NODE_MT_geometry_node_GEO_VOLUME_OPERATIONS, NODE_MT_geometry_node_GEO_VOLUME_PRIMITIVES, @@ -819,7 +779,6 @@ classes = ( NODE_MT_category_GEO_UTILITIES_FIELD, NODE_MT_category_GEO_UTILITIES_MATH, NODE_MT_category_GEO_UTILITIES_ROTATION, - NODE_MT_category_utilities_matrix, NODE_MT_category_GEO_UTILITIES_DEPRECATED, NODE_MT_category_GEO_GROUP, ) diff --git a/scripts/startup/bl_ui/properties_animviz.py b/scripts/startup/bl_ui/properties_animviz.py index 2952c14ef06..8aa63915c85 100644 --- a/scripts/startup/bl_ui/properties_animviz.py +++ b/scripts/startup/bl_ui/properties_animviz.py @@ -43,7 +43,7 @@ class MotionPathButtonsPanel: col.prop(mps, "frame_step", text="Step") row = col.row() - row.prop(mps, "use_camera_space_bake", text="Bake to Active Camera") + row.prop(mps, "bake_in_camera_space", text="Bake to Active Camera") if bones: op_category = "pose" diff --git a/scripts/startup/bl_ui/properties_collection.py b/scripts/startup/bl_ui/properties_collection.py index 80278781799..3ee2e7b5df2 100644 --- a/scripts/startup/bl_ui/properties_collection.py +++ b/scripts/startup/bl_ui/properties_collection.py @@ -24,8 +24,10 @@ class CollectionButtonsPanel: def lineart_make_line_type_entry(col, line_type, text_disp, expand, search_from): col.prop(line_type, "use", text=text_disp) if line_type.use and expand: - col.prop_search(line_type, "layer", search_from, "layers", icon='GREASEPENCIL') - col.prop_search(line_type, "material", search_from, "materials", icon='SHADING_TEXTURE') + col.prop_search(line_type, "layer", search_from, + "layers", icon='GREASEPENCIL') + col.prop_search(line_type, "material", search_from, + "materials", icon='SHADING_TEXTURE') class COLLECTION_PT_collection_flags(CollectionButtonsPanel, Panel): diff --git a/scripts/startup/bl_ui/properties_data_armature.py b/scripts/startup/bl_ui/properties_data_armature.py index 7f14f4bd75b..d565c0cb7b7 100644 --- a/scripts/startup/bl_ui/properties_data_armature.py +++ b/scripts/startup/bl_ui/properties_data_armature.py @@ -87,13 +87,20 @@ class DATA_UL_bone_collections(UIList): active_bone = armature.edit_bones.active or armature.bones.active has_active_bone = active_bone and bcoll.name in active_bone.collections - layout.prop(bcoll, "name", text="", emboss=False, icon='DOT' if has_active_bone else 'BLANK1') + layout.prop(bcoll, "name", text="", emboss=False, + icon='DOT' if has_active_bone else 'BLANK1') if armature.override_library: icon = 'LIBRARY_DATA_OVERRIDE' if bcoll.is_local_override else 'BLANK1' - layout.prop(bcoll, "is_local_override", text="", emboss=False, icon=icon) + layout.prop( + bcoll, + "is_local_override", + text="", + emboss=False, + icon=icon) - layout.prop(bcoll, "is_visible", text="", emboss=False, icon='HIDE_OFF' if bcoll.is_visible else 'HIDE_ON') + layout.prop(bcoll, "is_visible", text="", emboss=False, + icon='HIDE_OFF' if bcoll.is_visible else 'HIDE_ON') class DATA_PT_bone_collections(ArmatureButtonsPanel, Panel): diff --git a/scripts/startup/bl_ui/properties_data_bone.py b/scripts/startup/bl_ui/properties_data_bone.py index c776316d7f0..76f0948f01e 100644 --- a/scripts/startup/bl_ui/properties_data_bone.py +++ b/scripts/startup/bl_ui/properties_data_bone.py @@ -289,12 +289,15 @@ class BONE_PT_collections(BoneButtonsPanel, Panel): # Sub-layout that's dimmed when the bone collection's own visibility flag doesn't matter. sub_visible = row.row(align=True) sub_visible.active = (not is_solo_active) and bcoll.is_visible_ancestors - sub_visible.prop(bcoll, "is_visible", text="", icon='HIDE_OFF' if bcoll.is_visible else 'HIDE_ON') + sub_visible.prop(bcoll, "is_visible", text="", + icon='HIDE_OFF' if bcoll.is_visible else 'HIDE_ON') - row.prop(bcoll, "is_solo", text="", icon='SOLO_ON' if bcoll.is_solo else 'SOLO_OFF') + row.prop(bcoll, "is_solo", text="", + icon='SOLO_ON' if bcoll.is_solo else 'SOLO_OFF') # Unassignment operator, less safe so with a bit of spacing. - props = bcoll_row.operator("armature.collection_unassign_named", text="", icon='X') + props = bcoll_row.operator("armature.collection_unassign_named", + text="", icon='X') props.name = bcoll.name props.bone_name = bone.name @@ -407,7 +410,8 @@ class BONE_PT_display_custom_shape(BoneButtonsPanel, Panel): sub.prop(pchan, "custom_shape_translation", text="Translation") sub.prop(pchan, "custom_shape_rotation_euler", text="Rotation") - sub.prop_search(pchan, "custom_shape_transform", ob.pose, "bones", text="Override Transform") + sub.prop_search(pchan, "custom_shape_transform", + ob.pose, "bones", text="Override Transform") sub.prop(pchan, "use_custom_shape_bone_size") sub.separator() @@ -555,7 +559,8 @@ class BONE_PT_custom_props(BoneButtonsPanel, rna_prop_ui.PropertyPanel, Panel): @classmethod def _poll(cls, context): context_path = cls._get_context_path(context) - rna_item, _context_member = rna_prop_ui.rna_idprop_context_value(context, context_path, cls._property_type) + rna_item, _context_member = rna_prop_ui.rna_idprop_context_value( + context, context_path, cls._property_type) return bool(rna_item) def draw(self, context): @@ -592,7 +597,7 @@ class BONE_PT_custom_props(BoneButtonsPanel, rna_prop_ui.PropertyPanel, Panel): return "active_pose_bone" bone_path = obj.pose.bones[context.bone.name].path_from_id() - return "object." + bone_path + return f"object.{bone_path}" classes = ( diff --git a/scripts/startup/bl_ui/properties_data_camera.py b/scripts/startup/bl_ui/properties_data_camera.py index 240e613fed9..1cbb23f7e15 100644 --- a/scripts/startup/bl_ui/properties_data_camera.py +++ b/scripts/startup/bl_ui/properties_data_camera.py @@ -156,7 +156,8 @@ class DATA_PT_camera_stereoscopy(CameraButtonsPanel, Panel): @classmethod def poll(cls, context): render = context.scene.render - return (super().poll(context) and render.use_multiview and render.views_format == 'STEREO_3D') + return (super().poll(context) and render.use_multiview and + render.views_format == 'STEREO_3D') def draw(self, context): layout = self.layout @@ -306,7 +307,7 @@ class DATA_PT_camera_background_image(CameraButtonsPanel, Panel): use_multiview = context.scene.render.use_multiview col = layout.column() - col.operator("view3d.camera_background_image_add", text="Add Image") + col.operator("view3d.background_image_add", text="Add Image") for i, bg in enumerate(cam.background_images): layout.active = cam.show_background_images @@ -330,7 +331,7 @@ class DATA_PT_camera_background_image(CameraButtonsPanel, Panel): icon='RESTRICT_VIEW_OFF' if bg.show_background_image else 'RESTRICT_VIEW_ON', ) - row.operator("view3d.camera_background_image_remove", text="", emboss=False, icon='X').index = i + row.operator("view3d.background_image_remove", text="", emboss=False, icon='X').index = i if bg.show_expanded: row = box.row() diff --git a/scripts/startup/bl_ui/properties_data_grease_pencil.py b/scripts/startup/bl_ui/properties_data_grease_pencil.py index 9f374a7d6dc..0d2499e911c 100644 --- a/scripts/startup/bl_ui/properties_data_grease_pencil.py +++ b/scripts/startup/bl_ui/properties_data_grease_pencil.py @@ -2,8 +2,7 @@ # # SPDX-License-Identifier: GPL-2.0-or-later import bpy -from bpy.types import Panel, Menu, UIList -from rna_prop_ui import PropertyPanel +from bpy.types import Panel, Menu class DataButtonsPanel: @@ -16,50 +15,6 @@ class DataButtonsPanel: return hasattr(context, "grease_pencil") and context.grease_pencil -class LayerDataButtonsPanel: - bl_space_type = 'PROPERTIES' - bl_region_type = 'WINDOW' - bl_context = "data" - - @classmethod - def poll(cls, context): - grease_pencil = context.grease_pencil - return grease_pencil and grease_pencil.layers.active - - -class GREASE_PENCIL_UL_masks(UIList): - def draw_item(self, _context, layout, _data, item, icon, _active_data, _active_propname, _index): - mask = item - if self.layout_type in {'DEFAULT', 'COMPACT'}: - row = layout.row(align=True) - row.prop(mask, "name", text="", emboss=False, icon_value=icon) - row.prop(mask, "invert", text="", emboss=False) - row.prop(mask, "hide", text="", emboss=False) - elif self.layout_type == 'GRID': - layout.alignment = 'CENTER' - layout.prop(mask, "name", text="", emboss=False, icon_value=icon) - - -class GREASE_PENCIL_MT_layer_mask_add(Menu): - bl_label = "Add Mask" - - def draw(self, context): - layout = self.layout - - grease_pencil = context.grease_pencil - active_layer = grease_pencil.layers.active - found = False - for layer in grease_pencil.layers: - if layer == active_layer or layer.name in active_layer.mask_layers: - continue - - found = True - layout.operator("grease_pencil.layer_mask_add", text=layer.name).name = layer.name - - if not found: - layout.label(text="No layers to add") - - class DATA_PT_context_grease_pencil(DataButtonsPanel, Panel): bl_label = "" bl_options = {'HIDE_HEADER'} @@ -82,26 +37,8 @@ class GREASE_PENCIL_MT_grease_pencil_add_layer_extra(Menu): def draw(self, context): layout = self.layout - grease_pencil = context.object.data - space = context.space_data - if space.type == 'PROPERTIES': - layout.operator("grease_pencil.layer_group_add", text="Add Group") - - layout.separator() - layout.operator("grease_pencil.layer_duplicate", text="Duplicate", icon='DUPLICATE') - layout.operator("grease_pencil.layer_duplicate", text="Duplicate Empty Keyframes").empty_keyframes = True - - layout.separator() - layout.operator("grease_pencil.layer_reveal", icon='RESTRICT_VIEW_OFF', text="Show All") - layout.operator("grease_pencil.layer_hide", icon='RESTRICT_VIEW_ON', text="Hide Others").unselected = True - - layout.separator() - layout.operator("grease_pencil.layer_lock_all", icon='LOCKED', text="Lock All") - layout.operator("grease_pencil.layer_lock_all", icon='UNLOCKED', text="Unlock All").lock = False - - layout.separator() - layout.prop(grease_pencil, "use_autolock_layers", text="Autolock Inactive Layers") + layout.operator("grease_pencil.layer_group_add", text="Add Group") class DATA_PT_grease_pencil_layers(DataButtonsPanel, Panel): @@ -124,140 +61,19 @@ class DATA_PT_grease_pencil_layers(DataButtonsPanel, Panel): col.operator("grease_pencil.layer_remove", icon='REMOVE', text="") - if not layer: - return - - layout.use_property_split = True - layout.use_property_decorate = True - col = layout.column(align=True) - # Layer main properties - row = layout.row(align=True) - row.prop(layer, "blend_mode", text="Blend Mode") + if layer: + layout.use_property_split = True + layout.use_property_decorate = True + col = layout.column(align=True) - row = layout.row(align=True) - row.prop(layer, "opacity", text="Opacity", slider=True) - - -class DATA_PT_grease_pencil_layer_masks(LayerDataButtonsPanel, Panel): - bl_label = "Masks" - bl_parent_id = "DATA_PT_grease_pencil_layers" - bl_options = {'DEFAULT_CLOSED'} - - def draw_header(self, context): - grease_pencil = context.grease_pencil - layer = grease_pencil.layers.active - - self.layout.prop(layer, "use_masks", text="") - - def draw(self, context): - layout = self.layout - grease_pencil = context.grease_pencil - layer = grease_pencil.layers.active - - layout = self.layout - layout.enabled = layer.use_masks - - if not layer: - return - - rows = 4 - row = layout.row() - col = row.column() - col.template_list("GREASE_PENCIL_UL_masks", "", layer, "mask_layers", layer.mask_layers, - "active_mask_index", rows=rows, sort_lock=True) - - col = row.column(align=True) - col.menu("GREASE_PENCIL_MT_layer_mask_add", icon='ADD', text="") - col.operator("grease_pencil.layer_mask_remove", icon='REMOVE', text="") - - col.separator() - - sub = col.column(align=True) - sub.operator("grease_pencil.layer_mask_reorder", icon='TRIA_UP', text="").direction = 'UP' - sub.operator("grease_pencil.layer_mask_reorder", icon='TRIA_DOWN', text="").direction = 'DOWN' - - -class DATA_PT_grease_pencil_layer_transform(LayerDataButtonsPanel, Panel): - bl_label = "Transform" - bl_parent_id = "DATA_PT_grease_pencil_layers" - bl_options = {'DEFAULT_CLOSED'} - - def draw(self, context): - layout = self.layout - layout.use_property_split = True - - grease_pencil = context.grease_pencil - layer = grease_pencil.layers.active - layout.active = not layer.lock - - row = layout.row(align=True) - row.prop(layer, "translation") - - row = layout.row(align=True) - row.prop(layer, "rotation") - - row = layout.row(align=True) - row.prop(layer, "scale") - - -class DATA_PT_grease_pencil_layer_relations(LayerDataButtonsPanel, Panel): - bl_label = "Relations" - bl_parent_id = "DATA_PT_grease_pencil_layers" - bl_options = {'DEFAULT_CLOSED'} - - def draw(self, context): - layout = self.layout - layout.use_property_split = True - - grease_pencil = context.grease_pencil - layer = grease_pencil.layers.active - layout.active = not layer.lock - - row = layout.row(align=True) - row.prop(layer, "parent", text="Parent") - - if layer.parent and layer.parent.type == 'ARMATURE': - row = layout.row(align=True) - row.prop_search(layer, "parent_bone", layer.parent.data, "bones", text="Bone") - - layout.separator() - - col = layout.row(align=True) - col.prop(layer, "pass_index") - - col = layout.row(align=True) - col.prop_search(layer, "viewlayer_render", context.scene, "view_layers", text="View Layer") - - -class DATA_PT_grease_pencil_settings(DataButtonsPanel, Panel): - bl_label = "Settings" - - def draw(self, context): - layout = self.layout - layout.use_property_split = True - layout.use_property_decorate = False - - grease_pencil = context.grease_pencil - col = layout.column(align=True) - col.prop(grease_pencil, "stroke_depth_order", text="Stroke Depth Order") - - -class DATA_PT_grease_pencil_custom_props(DataButtonsPanel, PropertyPanel, Panel): - _context_path = "object.data" - _property_type = bpy.types.GreasePencilv3 + col = layout.row(align=True) + col.prop(layer, "opacity", text="Opacity", slider=True) classes = ( - GREASE_PENCIL_UL_masks, - GREASE_PENCIL_MT_layer_mask_add, DATA_PT_context_grease_pencil, DATA_PT_grease_pencil_layers, - DATA_PT_grease_pencil_layer_masks, - DATA_PT_grease_pencil_layer_transform, - DATA_PT_grease_pencil_layer_relations, - DATA_PT_grease_pencil_settings, - DATA_PT_grease_pencil_custom_props, GREASE_PENCIL_MT_grease_pencil_add_layer_extra, ) diff --git a/scripts/startup/bl_ui/properties_data_light.py b/scripts/startup/bl_ui/properties_data_light.py index 28c93401d85..472bf7d86f5 100644 --- a/scripts/startup/bl_ui/properties_data_light.py +++ b/scripts/startup/bl_ui/properties_data_light.py @@ -118,7 +118,6 @@ class DATA_PT_EEVEE_light(DataButtonsPanel, Panel): col.prop(light, "use_shadow", text="Cast Shadow") col.prop(light, "shadow_softness_factor", text="Shadow Softness") - col.prop(light, "shadow_filter_radius", text="Filtering Radius") if light.type == 'SUN': col.prop(light, "shadow_trace_distance", text="Trace Distance") diff --git a/scripts/startup/bl_ui/properties_data_mesh.py b/scripts/startup/bl_ui/properties_data_mesh.py index 596d09f512b..2ab74162e81 100644 --- a/scripts/startup/bl_ui/properties_data_mesh.py +++ b/scripts/startup/bl_ui/properties_data_mesh.py @@ -637,7 +637,8 @@ class MESH_UL_color_attributes(UIList, ColorAttributesListBase): sub = split.row() sub.alignment = 'RIGHT' sub.active = False - sub.label(text="%s ▶ %s" % (iface_(domain_name), iface_(data_type.name)), translate=False) + sub.label(text="%s ▶ %s" % (iface_(domain_name), iface_(data_type.name)), + translate=False) active_render = _index == data.color_attributes.render_color_index diff --git a/scripts/startup/bl_ui/properties_data_modifier.py b/scripts/startup/bl_ui/properties_data_modifier.py index e234a0ee41e..3f82086ccd3 100644 --- a/scripts/startup/bl_ui/properties_data_modifier.py +++ b/scripts/startup/bl_ui/properties_data_modifier.py @@ -71,7 +71,7 @@ class OBJECT_MT_modifier_add(ModifierAddMenu, Menu): if geometry_nodes_supported: self.operator_modifier_add(layout, 'NODES') layout.separator() - if ob_type in {'MESH', 'CURVE', 'FONT', 'SURFACE', 'LATTICE', 'GREASEPENCIL'}: + if ob_type in {'MESH', 'CURVE', 'FONT', 'SURFACE', 'LATTICE'}: layout.menu("OBJECT_MT_modifier_add_edit") if ob_type in {'MESH', 'CURVE', 'FONT', 'SURFACE', 'VOLUME', 'GREASEPENCIL'}: layout.menu("OBJECT_MT_modifier_add_generate") @@ -107,10 +107,6 @@ class OBJECT_MT_modifier_add_edit(ModifierAddMenu, Menu): self.operator_modifier_add(layout, 'VERTEX_WEIGHT_EDIT') self.operator_modifier_add(layout, 'VERTEX_WEIGHT_MIX') self.operator_modifier_add(layout, 'VERTEX_WEIGHT_PROXIMITY') - if ob_type == 'GREASEPENCIL': - self.operator_modifier_add(layout, 'GREASE_PENCIL_TIME') - self.operator_modifier_add(layout, 'GREASE_PENCIL_VERTEX_WEIGHT_PROXIMITY') - self.operator_modifier_add(layout, 'GREASE_PENCIL_VERTEX_WEIGHT_ANGLE') layout.template_modifier_asset_menu_items(catalog_path=self.bl_label) @@ -154,15 +150,8 @@ class OBJECT_MT_modifier_add_generate(ModifierAddMenu, Menu): if ob_type == 'MESH': self.operator_modifier_add(layout, 'WIREFRAME') if ob_type == 'GREASEPENCIL': - self.operator_modifier_add(layout, 'GREASE_PENCIL_ARRAY') - self.operator_modifier_add(layout, 'GREASE_PENCIL_DASH') - self.operator_modifier_add(layout, 'GREASE_PENCIL_ENVELOPE') - self.operator_modifier_add(layout, 'GREASE_PENCIL_LENGTH') self.operator_modifier_add(layout, 'GREASE_PENCIL_MIRROR') - self.operator_modifier_add(layout, 'GREASE_PENCIL_MULTIPLY') - self.operator_modifier_add(layout, 'GREASE_PENCIL_OUTLINE') self.operator_modifier_add(layout, 'GREASE_PENCIL_SUBDIV') - self.operator_modifier_add(layout, 'LINEART') layout.template_modifier_asset_menu_items(catalog_path=self.bl_label) @@ -200,12 +189,8 @@ class OBJECT_MT_modifier_add_deform(ModifierAddMenu, Menu): if ob_type == 'VOLUME': self.operator_modifier_add(layout, 'VOLUME_DISPLACE') if ob_type == 'GREASEPENCIL': - self.operator_modifier_add(layout, 'GREASE_PENCIL_ARMATURE') - self.operator_modifier_add(layout, 'GREASE_PENCIL_HOOK') - self.operator_modifier_add(layout, 'GREASE_PENCIL_LATTICE') self.operator_modifier_add(layout, 'GREASE_PENCIL_NOISE') self.operator_modifier_add(layout, 'GREASE_PENCIL_OFFSET') - self.operator_modifier_add(layout, 'GREASE_PENCIL_SHRINKWRAP') self.operator_modifier_add(layout, 'GREASE_PENCIL_SMOOTH') self.operator_modifier_add(layout, 'GREASE_PENCIL_THICKNESS') layout.template_modifier_asset_menu_items(catalog_path=self.bl_label) diff --git a/scripts/startup/bl_ui/properties_freestyle.py b/scripts/startup/bl_ui/properties_freestyle.py index a3c7fffe744..0be97539e26 100644 --- a/scripts/startup/bl_ui/properties_freestyle.py +++ b/scripts/startup/bl_ui/properties_freestyle.py @@ -754,7 +754,8 @@ class VIEWLAYER_PT_freestyle_linestyle_color(ViewLayerFreestyleLineStyle, Panel) elif modifier.type == 'MATERIAL': row = box.row() - row.prop(modifier, "material_attribute", text="Material Attribute") + row.prop(modifier, "material_attribute", + text="Material Attribute") sub = box.column() sub.prop(modifier, "use_ramp") if modifier.material_attribute in {'LINE', 'DIFF', 'SPEC'}: diff --git a/scripts/startup/bl_ui/properties_grease_pencil_common.py b/scripts/startup/bl_ui/properties_grease_pencil_common.py index 5fed23cf1e9..cc7c3a01c96 100644 --- a/scripts/startup/bl_ui/properties_grease_pencil_common.py +++ b/scripts/startup/bl_ui/properties_grease_pencil_common.py @@ -606,8 +606,6 @@ class GreasePencilMaterialsPanel: if is_grease_pencil_version3 and ob.mode == 'EDIT': row = layout.row(align=True) row.operator("grease_pencil.stroke_material_set", text="Assign") - row.operator("grease_pencil.material_select", text="Select").deselect = False - row.operator("grease_pencil.material_select", text="Deselect").deselect = True elif not is_grease_pencil_version3 and ob.data.use_stroke_edit_mode: row = layout.row(align=True) row.operator("gpencil.stroke_change_color", text="Assign") diff --git a/scripts/startup/bl_ui/properties_mask_common.py b/scripts/startup/bl_ui/properties_mask_common.py index dfc32ac2419..4401de9cae8 100644 --- a/scripts/startup/bl_ui/properties_mask_common.py +++ b/scripts/startup/bl_ui/properties_mask_common.py @@ -36,7 +36,8 @@ def draw_mask_context_menu(layout, _context): class MASK_UL_layers(UIList): - def draw_item(self, _context, layout, _data, item, icon, _active_data, _active_propname, _index): + def draw_item(self, _context, layout, _data, item, icon, + _active_data, _active_propname, _index): # assert(isinstance(item, bpy.types.MaskLayer) mask = item if self.layout_type in {'DEFAULT', 'COMPACT'}: @@ -203,7 +204,8 @@ class MASK_PT_point: row = col.row() row.prop(parent, "type", expand=True) - col.prop_search(parent, "parent", tracking, "objects", icon='OBJECT_DATA', text="Object") + col.prop_search(parent, "parent", tracking, + "objects", icon='OBJECT_DATA', text="Object") tracks_list = "tracks" if parent.type == 'POINT_TRACK' else "plane_tracks" diff --git a/scripts/startup/bl_ui/properties_object.py b/scripts/startup/bl_ui/properties_object.py index dec3768ed95..5fe7c77a9ce 100644 --- a/scripts/startup/bl_ui/properties_object.py +++ b/scripts/startup/bl_ui/properties_object.py @@ -402,7 +402,7 @@ class OBJECT_PT_visibility(ObjectButtonsPanel, Panel): col.prop(ob, "hide_probe_sphere", text="Sphere", toggle=False, invert_checkbox=True) col.prop(ob, "hide_probe_plane", text="Plane", toggle=False, invert_checkbox=True) - if ob.type in {'GPENCIL', 'GREASEPENCIL'}: + if ob.type == 'GPENCIL': col = layout.column(heading="Grease Pencil") col.prop(ob, "use_grease_pencil_lights", toggle=False) diff --git a/scripts/startup/bl_ui/properties_paint_common.py b/scripts/startup/bl_ui/properties_paint_common.py index c3a3fb97afc..722eddd4202 100644 --- a/scripts/startup/bl_ui/properties_paint_common.py +++ b/scripts/startup/bl_ui/properties_paint_common.py @@ -391,7 +391,8 @@ class SmoothStrokePanel(BrushPanel): brush = settings.brush self.layout.use_property_split = False - self.layout.prop(brush, "use_smooth_stroke", text=self.bl_label if self.is_popover else "") + self.layout.prop(brush, "use_smooth_stroke", + text=self.bl_label if self.is_popover else "") def draw(self, context): layout = self.layout @@ -799,25 +800,19 @@ def brush_settings(layout, context, brush, popover=False): if brush.curves_sculpt_tool == 'ADD': layout.prop(brush.curves_sculpt_settings, "add_amount") col = layout.column(heading="Interpolate", align=True) - col.prop(brush.curves_sculpt_settings, "use_length_interpolate", text="Length") - col.prop(brush.curves_sculpt_settings, "use_radius_interpolate", text="Radius") - col.prop(brush.curves_sculpt_settings, "use_shape_interpolate", text="Shape") - col.prop(brush.curves_sculpt_settings, "use_point_count_interpolate", text="Point Count") + col.prop(brush.curves_sculpt_settings, "interpolate_length", text="Length") + col.prop(brush.curves_sculpt_settings, "interpolate_shape", text="Shape") + col.prop(brush.curves_sculpt_settings, "interpolate_point_count", text="Point Count") col = layout.column() - col.active = not brush.curves_sculpt_settings.use_length_interpolate - col.prop(brush.curves_sculpt_settings, "curve_length", text="Length") + col.active = not brush.curves_sculpt_settings.interpolate_length + col.prop(brush.curves_sculpt_settings, "curve_length") col = layout.column() - col.active = not brush.curves_sculpt_settings.use_radius_interpolate - col.prop(brush.curves_sculpt_settings, "curve_radius", text="Radius") - - col = layout.column() - col.active = not brush.curves_sculpt_settings.use_point_count_interpolate - col.prop(brush.curves_sculpt_settings, "points_per_curve", text="Points") - + col.active = not brush.curves_sculpt_settings.interpolate_point_count + col.prop(brush.curves_sculpt_settings, "points_per_curve") elif brush.curves_sculpt_tool == 'GROW_SHRINK': - layout.prop(brush.curves_sculpt_settings, "use_uniform_scale") + layout.prop(brush.curves_sculpt_settings, "scale_uniform") layout.prop(brush.curves_sculpt_settings, "minimum_length") @@ -1343,7 +1338,8 @@ def brush_basic_gpencil_paint_settings(layout, context, brush, *, compact=False) if gp_settings.use_pressure and not compact: col = layout.column() - col.template_curve_mapping(gp_settings, "curve_sensitivity", brush=True, use_negative_slope=True) + col.template_curve_mapping(gp_settings, "curve_sensitivity", brush=True, + use_negative_slope=True) row = layout.row(align=True) row.prop(gp_settings, "pen_strength", slider=True) @@ -1351,7 +1347,8 @@ def brush_basic_gpencil_paint_settings(layout, context, brush, *, compact=False) if gp_settings.use_strength_pressure and not compact: col = layout.column() - col.template_curve_mapping(gp_settings, "curve_strength", brush=True, use_negative_slope=True) + col.template_curve_mapping(gp_settings, "curve_strength", brush=True, + use_negative_slope=True) if brush.gpencil_tool == 'TINT': row = layout.row(align=True) @@ -1391,58 +1388,6 @@ def brush_basic_gpencil_paint_settings(layout, context, brush, *, compact=False) layout.template_curve_mapping(settings, "thickness_primitive_curve", brush=True) -def brush_basic_grease_pencil_paint_settings(layout, context, brush, *, compact=False): - gp_settings = brush.gpencil_settings - if gp_settings is None: - return - - grease_pencil_tool = brush.gpencil_tool - - UnifiedPaintPanel.prop_unified( - layout, - context, - brush, - "size", - unified_name="use_unified_size", - pressure_name="use_pressure_size", - text="Radius", - slider=True, - header=compact, - ) - - if brush.use_pressure_size and not compact: - col = layout.column() - col.template_curve_mapping(gp_settings, "curve_sensitivity", brush=True, use_negative_slope=True) - - UnifiedPaintPanel.prop_unified( - layout, - context, - brush, - "strength", - unified_name="use_unified_strength", - pressure_name="use_pressure_strength", - slider=True, - header=compact, - ) - - if brush.use_pressure_strength and not compact: - col = layout.column() - col.template_curve_mapping(gp_settings, "curve_strength", brush=True, use_negative_slope=True) - - if grease_pencil_tool == 'DRAW': - layout.prop(gp_settings, "active_smooth_factor") - row = layout.row(align=True) - if compact: - row.prop(gp_settings, "caps_type", text="", expand=True) - else: - row.prop(gp_settings, "caps_type", text="Caps Type") - elif grease_pencil_tool == 'ERASE': - layout.prop(gp_settings, "eraser_mode", expand=True) - if gp_settings.eraser_mode == "HARD": - layout.prop(gp_settings, "use_keep_caps_eraser") - layout.prop(gp_settings, "use_active_layer_only") - - def brush_basic_gpencil_sculpt_settings(layout, _context, brush, *, compact=False): if brush is None: return diff --git a/scripts/startup/bl_ui/properties_particle.py b/scripts/startup/bl_ui/properties_particle.py index 6e06c935c0e..ead9116ad55 100644 --- a/scripts/startup/bl_ui/properties_particle.py +++ b/scripts/startup/bl_ui/properties_particle.py @@ -87,7 +87,9 @@ class PARTICLE_MT_context_menu(Menu): props.remove_target_particles = True if psys is not None and psys.settings.type == 'HAIR': - layout.operator("curves.convert_from_particle_system", text="Convert to Curves") + layout.operator( + "curves.convert_from_particle_system", + text="Convert to Curves") layout.separator() diff --git a/scripts/startup/bl_ui/properties_physics_common.py b/scripts/startup/bl_ui/properties_physics_common.py index b666e7fba86..20fa1507f6d 100644 --- a/scripts/startup/bl_ui/properties_physics_common.py +++ b/scripts/startup/bl_ui/properties_physics_common.py @@ -106,7 +106,7 @@ class PHYSICS_PT_add(PhysicButtonsPanel, Panel): ) -# cache-type can be 'PSYS' 'HAIR' etc. ('FLUID' uses its own cache) +# cache-type can be 'PSYS' 'HAIR' 'FLUID' etc. def point_cache_ui(self, cache, enabled, cachetype): layout = self.layout @@ -130,8 +130,12 @@ def point_cache_ui(self, cache, enabled, cachetype): col.operator("ptcache.add", icon='ADD', text="") col.operator("ptcache.remove", icon='REMOVE', text="") - if cachetype in {'PSYS', 'HAIR'}: + if cachetype in {'PSYS', 'HAIR', 'FLUID'}: col = layout.column() + + if cachetype == 'FLUID': + col.prop(cache, "use_library_path", text="Use Library Path") + col.prop(cache, "use_external") if cache.use_external: @@ -145,14 +149,14 @@ def point_cache_ui(self, cache, enabled, cachetype): col.alignment = 'RIGHT' col.label(text=cache_info) else: - if cachetype == 'DYNAMIC_PAINT': + if cachetype in {'FLUID', 'DYNAMIC_PAINT'}: if not is_saved: col = layout.column(align=True) col.alignment = 'RIGHT' col.label(text="Cache is disabled until the file is saved") layout.enabled = False - if not cache.use_external: + if not cache.use_external or cachetype == 'FLUID': col = layout.column(align=True) if cachetype not in {'PSYS', 'DYNAMIC_PAINT'}: @@ -160,18 +164,18 @@ def point_cache_ui(self, cache, enabled, cachetype): col.prop(cache, "frame_start", text="Simulation Start") col.prop(cache, "frame_end") - if cachetype not in {'CLOTH', 'DYNAMIC_PAINT', 'RIGID_BODY'}: + if cachetype not in {'FLUID', 'CLOTH', 'DYNAMIC_PAINT', 'RIGID_BODY'}: col.prop(cache, "frame_step") cache_info = cache.info - if cache_info: # avoid empty space. + if cachetype != 'FLUID' and cache_info: # avoid empty space. col = layout.column(align=True) col.alignment = 'RIGHT' col.label(text=cache_info) can_bake = True - if cachetype not in {'DYNAMIC_PAINT', 'RIGID_BODY'}: + if cachetype not in {'FLUID', 'DYNAMIC_PAINT', 'RIGID_BODY'}: if not is_saved: col = layout.column(align=True) col.alignment = 'RIGHT' diff --git a/scripts/startup/bl_ui/properties_render.py b/scripts/startup/bl_ui/properties_render.py index 5b7105383a0..440da92e96d 100644 --- a/scripts/startup/bl_ui/properties_render.py +++ b/scripts/startup/bl_ui/properties_render.py @@ -113,8 +113,7 @@ class RENDER_PT_color_management_display_settings(RenderButtonsPanel, Panel): col = layout.column(align=True) sub = col.row() sub.active = (not view.view_transform.startswith("Filmic") and not view.view_transform.startswith("AgX") and not - view.view_transform.startswith("False Color") and not - view.view_transform.startswith("Khronos PBR Neutral")) + view.view_transform.startswith("False Color")) sub.prop(view, "use_hdr_view") @@ -211,24 +210,23 @@ class RENDER_PT_eevee_motion_blur(RenderButtonsPanel, Panel): def draw_header(self, context): scene = context.scene - props = scene.render + props = scene.eevee self.layout.prop(props, "use_motion_blur", text="") def draw(self, context): layout = self.layout layout.use_property_split = True scene = context.scene - props = scene.render - eevee_props = scene.eevee + props = scene.eevee layout.active = props.use_motion_blur col = layout.column() col.prop(props, "motion_blur_position", text="Position") col.prop(props, "motion_blur_shutter") col.separator() - col.prop(eevee_props, "motion_blur_depth_scale") - col.prop(eevee_props, "motion_blur_max") - col.prop(eevee_props, "motion_blur_steps", text="Steps") + col.prop(props, "motion_blur_depth_scale") + col.prop(props, "motion_blur_max") + col.prop(props, "motion_blur_steps", text="Steps") class RENDER_PT_eevee_next_motion_blur(RenderButtonsPanel, Panel): @@ -242,24 +240,22 @@ class RENDER_PT_eevee_next_motion_blur(RenderButtonsPanel, Panel): def draw_header(self, context): scene = context.scene - props = scene.render + props = scene.eevee self.layout.prop(props, "use_motion_blur", text="") def draw(self, context): layout = self.layout layout.use_property_split = True scene = context.scene - props = scene.render - eevee_props = scene.eevee + props = scene.eevee layout.active = props.use_motion_blur col = layout.column() col.prop(props, "motion_blur_position", text="Position") col.prop(props, "motion_blur_shutter") col.separator() - col.prop(eevee_props, "motion_blur_depth_scale") - col.prop(eevee_props, "motion_blur_max") - col.prop(eevee_props, "motion_blur_steps", text="Steps") + col.prop(props, "motion_blur_depth_scale") + col.prop(props, "motion_blur_steps", text="Steps") class RENDER_PT_eevee_next_motion_blur_curve(RenderButtonsPanel, Panel): @@ -1036,28 +1032,6 @@ class RENDER_PT_eevee_performance(RenderButtonsPanel, Panel): layout.prop(rd, "use_high_quality_normals") -class RENDER_PT_eevee_performance_viewport(RenderButtonsPanel, Panel): - bl_label = "Viewport" - bl_parent_id = "RENDER_PT_eevee_performance" - bl_options = {'DEFAULT_CLOSED'} - COMPAT_ENGINES = {'BLENDER_EEVEE_NEXT'} - - @classmethod - def poll(cls, context): - return (context.engine in cls.COMPAT_ENGINES) - - def draw(self, context): - layout = self.layout - layout.use_property_split = True - layout.use_property_decorate = False - - scene = context.scene - rd = scene.render - - col = layout.column() - col.prop(rd, "preview_pixel_size", text="Pixel Size") - - class RENDER_PT_gpencil(RenderButtonsPanel, Panel): bl_label = "Grease Pencil" bl_options = {'DEFAULT_CLOSED'} @@ -1296,7 +1270,6 @@ classes = ( RENDER_PT_eevee_next_volumes_lighting, RENDER_PT_eevee_next_volumes_shadows, RENDER_PT_eevee_performance, - RENDER_PT_eevee_performance_viewport, RENDER_PT_eevee_hair, RENDER_PT_eevee_shadows, RENDER_PT_eevee_next_lights, diff --git a/scripts/startup/bl_ui/properties_view_layer.py b/scripts/startup/bl_ui/properties_view_layer.py index 1fc2d57851f..847965ab59c 100644 --- a/scripts/startup/bl_ui/properties_view_layer.py +++ b/scripts/startup/bl_ui/properties_view_layer.py @@ -100,7 +100,7 @@ class VIEWLAYER_PT_eevee_next_layer_passes_data(ViewLayerButtonsPanel, Panel): col.prop(view_layer, "use_pass_normal") col.prop(view_layer, "use_pass_position") sub = col.column() - sub.active = not scene.render.use_motion_blur + sub.active = not scene.eevee.use_motion_blur sub.prop(view_layer, "use_pass_vector") @@ -151,7 +151,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_next_layer_passes_light(ViewLayerButtonsPanel, Panel): @@ -183,7 +184,8 @@ class VIEWLAYER_PT_eevee_next_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") col = layout.column() col.active = view_layer.use_pass_ambient_occlusion @@ -228,7 +230,8 @@ class ViewLayerAOVPanel(ViewLayerButtonsPanel, Panel): row = layout.row() col = row.column() - col.template_list("VIEWLAYER_UL_aov", "aovs", view_layer, "aovs", view_layer, "active_aov_index", rows=3) + col.template_list("VIEWLAYER_UL_aov", "aovs", view_layer, + "aovs", view_layer, "active_aov_index", rows=3) col = row.column() sub = col.column(align=True) @@ -237,7 +240,8 @@ class ViewLayerAOVPanel(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): @@ -267,7 +271,8 @@ class ViewLayerCryptomattePanel(ViewLayerButtonsPanel, Panel): col.prop(view_layer, "pass_cryptomatte_depth", text="Levels") if context.engine == 'BLENDER_EEVEE': - 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, Panel): @@ -325,6 +330,7 @@ class VIEWLAYER_PT_filter(ViewLayerButtonsPanel, Panel): layout.use_property_decorate = False scene = context.scene + rd = scene.render view_layer = context.view_layer col = layout.column(heading="Include") @@ -336,7 +342,7 @@ class VIEWLAYER_PT_filter(ViewLayerButtonsPanel, Panel): col = layout.column(heading="Use") sub = col.row() sub.prop(view_layer, "use_motion_blur", text="Motion Blur") - sub.active = scene.render.use_motion_blur + sub.active = scene.eevee.use_motion_blur class VIEWLAYER_PT_layer_custom_props(PropertyPanel, Panel): diff --git a/scripts/startup/bl_ui/space_clip.py b/scripts/startup/bl_ui/space_clip.py index 719161b9069..c161412cbbf 100644 --- a/scripts/startup/bl_ui/space_clip.py +++ b/scripts/startup/bl_ui/space_clip.py @@ -17,7 +17,8 @@ from bl_ui.properties_grease_pencil_common import ( class CLIP_UL_tracking_objects(UIList): - def draw_item(self, _context, layout, _data, item, _icon, _active_data, _active_propname, _index): + def draw_item(self, _context, layout, _data, item, _icon, + _active_data, _active_propname, _index): # assert(isinstance(item, bpy.types.MovieTrackingObject) tobj = item if self.layout_type in {'DEFAULT', 'COMPACT'}: @@ -141,7 +142,8 @@ class CLIP_HT_header(Header): props = row.operator("clip.track_markers", text="", icon='TRACKING_BACKWARDS_SINGLE') props.backwards = True props.sequence = False - props = row.operator("clip.track_markers", text="", icon='TRACKING_BACKWARDS') + props = row.operator("clip.track_markers", text="", + icon='TRACKING_BACKWARDS') props.backwards = True props.sequence = True props = row.operator("clip.track_markers", text="", icon='TRACKING_FORWARDS') @@ -169,14 +171,16 @@ class CLIP_HT_header(Header): r = active_object.reconstruction if r.is_valid and sc.view == 'CLIP': - layout.label(text=rpt_("Solve error: %.2f px") % (r.average_error), translate=False) + layout.label(text=rpt_("Solve error: %.2f px") % + (r.average_error), + translate=False) row = layout.row() row.prop(sc, "pivot_point", text="", icon_only=True) row = layout.row(align=True) icon = 'LOCKED' if sc.lock_selection else 'UNLOCKED' row.operator("clip.lock_selection_toggle", icon=icon, text="", depress=sc.lock_selection) - row.popover(panel="CLIP_PT_display") + row.popover(panel='CLIP_PT_display') elif sc.view == 'GRAPH': row = layout.row(align=True) @@ -239,11 +243,11 @@ class CLIP_HT_header(Header): row = layout.row() row.template_ID(sc, "mask", new="mask.new") - row.popover(panel="CLIP_PT_mask_display") + row.popover(panel='CLIP_PT_mask_display') row = layout.row(align=True) icon = 'LOCKED' if sc.lock_selection else 'UNLOCKED' row.operator("clip.lock_selection_toggle", icon=icon, text="", depress=sc.lock_selection) - row.popover(panel="CLIP_PT_display") + row.popover(panel='CLIP_PT_display') def draw(self, context): layout = self.layout @@ -429,12 +433,16 @@ class CLIP_PT_tracking_settings(CLIP_PT_tracking_panel, Panel): row = col.row(align=True) row.use_property_split = False - row.prop(settings, "use_default_red_channel", text="R", toggle=True) - row.prop(settings, "use_default_green_channel", text="G", toggle=True) - row.prop(settings, "use_default_blue_channel", text="B", toggle=True) + row.prop(settings, "use_default_red_channel", + text="R", toggle=True) + row.prop(settings, "use_default_green_channel", + text="G", toggle=True) + row.prop(settings, "use_default_blue_channel", + text="B", toggle=True) col.separator() - col.operator("clip.track_settings_as_default", text="Copy from Active Track") + col.operator("clip.track_settings_as_default", + text="Copy from Active Track") class CLIP_PT_tracking_settings_extras(CLIP_PT_tracking_panel, Panel): @@ -478,7 +486,8 @@ class CLIP_PT_tools_tracking(CLIP_PT_tracking_panel, Panel): props = row.operator("clip.track_markers", text="", icon='TRACKING_BACKWARDS_SINGLE') props.backwards = True props.sequence = False - props = row.operator("clip.track_markers", text="", icon='TRACKING_BACKWARDS') + props = row.operator("clip.track_markers", text="", + icon='TRACKING_BACKWARDS') props.backwards = True props.sequence = True props = row.operator("clip.track_markers", text="", icon='TRACKING_FORWARDS') @@ -703,7 +712,8 @@ class CLIP_PT_objects(CLIP_PT_clip_view_panel, Panel): tracking = sc.clip.tracking row = layout.row() - row.template_list("CLIP_UL_tracking_objects", "", tracking, "objects", tracking, "active_object_index", rows=1) + row.template_list("CLIP_UL_tracking_objects", "", tracking, "objects", + tracking, "active_object_index", rows=1) sub = row.column(align=True) @@ -755,7 +765,8 @@ class CLIP_PT_track(CLIP_PT_tracking_panel, Panel): row.prop(act_track, "use_grayscale_preview", text="B/W", toggle=True) row.separator() - row.prop(act_track, "use_alpha_preview", text="", toggle=True, icon='IMAGE_ALPHA') + row.prop(act_track, "use_alpha_preview", + text="", toggle=True, icon='IMAGE_ALPHA') layout.prop(act_track, "weight") layout.prop(act_track, "weight_stab") @@ -799,7 +810,8 @@ class CLIP_PT_plane_track(CLIP_PT_tracking_panel, Panel): layout.prop(active_track, "name") layout.prop(active_track, "use_auto_keying") row = layout.row() - row.template_ID(active_track, "image", new="image.new", open="image.open") + row.template_ID( + active_track, "image", new="image.new", open="image.open") row.menu("CLIP_MT_plane_track_image_context_menu", icon='DOWNARROW_HLT', text="") row = layout.row() @@ -1042,7 +1054,8 @@ class CLIP_PT_stabilization(CLIP_PT_reconstruction_panel, Panel): sub.operator("clip.stabilize_2d_add", icon='ADD', text="") sub.operator("clip.stabilize_2d_remove", icon='REMOVE', text="") - sub.menu("CLIP_MT_stabilize_2d_context_menu", text="", icon='DOWNARROW_HLT') + sub.menu('CLIP_MT_stabilize_2d_context_menu', text="", + icon='DOWNARROW_HLT') # Usually we don't hide things from interface, but here every pixel of # vertical space is precious. @@ -1058,7 +1071,8 @@ class CLIP_PT_stabilization(CLIP_PT_reconstruction_panel, Panel): sub.operator("clip.stabilize_2d_rotation_add", icon='ADD', text="") sub.operator("clip.stabilize_2d_rotation_remove", icon='REMOVE', text="") - sub.menu("CLIP_MT_stabilize_2d_rotation_context_menu", text="", icon='DOWNARROW_HLT') + sub.menu('CLIP_MT_stabilize_2d_rotation_context_menu', text="", + icon='DOWNARROW_HLT') col = layout.column() col.prop(stab, "use_autoscale") @@ -1630,8 +1644,10 @@ class CLIP_MT_tracking_context_menu(Menu): layout.separator() - layout.operator("clip.disable_markers", text="Disable Markers").action = 'DISABLE' - layout.operator("clip.disable_markers", text="Enable Markers").action = 'ENABLE' + layout.operator("clip.disable_markers", + text="Disable Markers").action = 'DISABLE' + layout.operator("clip.disable_markers", + text="Enable Markers").action = 'ENABLE' layout.separator() @@ -1641,7 +1657,8 @@ class CLIP_MT_tracking_context_menu(Menu): layout.separator() layout.operator("clip.lock_tracks", text="Lock Tracks").action = 'LOCK' - layout.operator("clip.lock_tracks", text="Unlock Tracks").action = 'UNLOCK' + layout.operator("clip.lock_tracks", + text="Unlock Tracks").action = 'UNLOCK' layout.separator() diff --git a/scripts/startup/bl_ui/space_console.py b/scripts/startup/bl_ui/space_console.py index 453bc5c0fe8..3a18838ff1b 100644 --- a/scripts/startup/bl_ui/space_console.py +++ b/scripts/startup/bl_ui/space_console.py @@ -73,7 +73,9 @@ class CONSOLE_MT_language(Menu): languages.sort() for language in languages: - layout.operator("console.language", text=language.title(), translate=False).language = language + layout.operator("console.language", + text=language.title(), + translate=False).language = language class CONSOLE_MT_console(Menu): diff --git a/scripts/startup/bl_ui/space_dopesheet.py b/scripts/startup/bl_ui/space_dopesheet.py index d6d78764012..00e6400e124 100644 --- a/scripts/startup/bl_ui/space_dopesheet.py +++ b/scripts/startup/bl_ui/space_dopesheet.py @@ -179,7 +179,8 @@ class DOPESHEET_PT_filters(DopesheetFilterPopoverBase, Panel): if ds_mode in {'DOPESHEET', 'ACTION', 'GPENCIL'}: layout.separator() generic_filters_only = ds_mode != 'DOPESHEET' - DopesheetFilterPopoverBase.draw_search_filters(context, layout, generic_filters_only=generic_filters_only) + DopesheetFilterPopoverBase.draw_search_filters(context, layout, + generic_filters_only=generic_filters_only) if ds_mode == 'DOPESHEET': layout.separator() diff --git a/scripts/startup/bl_ui/space_filebrowser.py b/scripts/startup/bl_ui/space_filebrowser.py index 2c509697e89..4a834fa662e 100644 --- a/scripts/startup/bl_ui/space_filebrowser.py +++ b/scripts/startup/bl_ui/space_filebrowser.py @@ -142,10 +142,12 @@ class FILEBROWSER_PT_filter(FileBrowserPanel, Panel): else: row = col.row() row.label(icon='FILE_BLEND') - row.prop(params, "use_filter_blender", text=".blend Files", toggle=False) + row.prop(params, "use_filter_blender", + text=".blend Files", toggle=False) row = col.row() row.label(icon='FILE_BACKUP') - row.prop(params, "use_filter_backup", text="Backup .blend Files", toggle=False) + row.prop(params, "use_filter_backup", + text="Backup .blend Files", toggle=False) row = col.row() row.label(icon='FILE_IMAGE') row.prop(params, "use_filter_image", text="Image Files", toggle=False) @@ -154,7 +156,8 @@ class FILEBROWSER_PT_filter(FileBrowserPanel, Panel): row.prop(params, "use_filter_movie", text="Movie Files", toggle=False) row = col.row() row.label(icon='FILE_SCRIPT') - row.prop(params, "use_filter_script", text="Script Files", toggle=False) + row.prop(params, "use_filter_script", + text="Script Files", toggle=False) row = col.row() row.label(icon='FILE_FONT') row.prop(params, "use_filter_font", text="Font Files", toggle=False) @@ -173,7 +176,8 @@ class FILEBROWSER_PT_filter(FileBrowserPanel, Panel): if is_lib_browser: row = col.row() row.label(icon='BLANK1') # Indentation - row.prop(params, "use_filter_blendid", text="Blender IDs", toggle=False) + row.prop(params, "use_filter_blendid", + text="Blender IDs", toggle=False) if params.use_filter_blendid: row = col.row() row.label(icon='BLANK1') # Indentation @@ -277,8 +281,10 @@ class FILEBROWSER_MT_bookmarks_context_menu(Menu): layout.operator("file.bookmark_cleanup", icon='X', text="Cleanup") layout.separator() - layout.operator("file.bookmark_move", icon='TRIA_UP_BAR', text="Move to Top").direction = 'TOP' - layout.operator("file.bookmark_move", icon='TRIA_DOWN_BAR', text="Move to Bottom").direction = 'BOTTOM' + layout.operator("file.bookmark_move", icon='TRIA_UP_BAR', + text="Move to Top").direction = 'TOP' + layout.operator("file.bookmark_move", icon='TRIA_DOWN_BAR', + text="Move to Bottom").direction = 'BOTTOM' class FILEBROWSER_PT_bookmarks_favorites(FileBrowserPanel, Panel): @@ -308,12 +314,15 @@ class FILEBROWSER_PT_bookmarks_favorites(FileBrowserPanel, Panel): col = row.column(align=True) col.operator("file.bookmark_add", icon='ADD', text="") col.operator("file.bookmark_delete", icon='REMOVE', text="") - col.menu("FILEBROWSER_MT_bookmarks_context_menu", icon='DOWNARROW_HLT', text="") + col.menu("FILEBROWSER_MT_bookmarks_context_menu", + icon='DOWNARROW_HLT', text="") if num_rows > 1: col.separator() - col.operator("file.bookmark_move", icon='TRIA_UP', text="").direction = 'UP' - col.operator("file.bookmark_move", icon='TRIA_DOWN', text="").direction = 'DOWN' + col.operator("file.bookmark_move", icon='TRIA_UP', + text="").direction = 'UP' + col.operator("file.bookmark_move", icon='TRIA_DOWN', + text="").direction = 'DOWN' else: layout.operator("file.bookmark_add", icon='ADD') @@ -544,8 +553,10 @@ class FILEBROWSER_MT_context_menu(FileBrowserMenu, Menu): layout.separator() - layout.operator("file.filenum", text="Increase Number", icon='ADD').increment = 1 - layout.operator("file.filenum", text="Decrease Number", icon='REMOVE').increment = -1 + layout.operator("file.filenum", text="Increase Number", + icon='ADD').increment = 1 + layout.operator("file.filenum", text="Decrease Number", + icon='REMOVE').increment = -1 layout.separator() diff --git a/scripts/startup/bl_ui/space_graph.py b/scripts/startup/bl_ui/space_graph.py index fb4f3ffa309..7df05c233b2 100644 --- a/scripts/startup/bl_ui/space_graph.py +++ b/scripts/startup/bl_ui/space_graph.py @@ -159,7 +159,7 @@ class GRAPH_MT_view(Menu): layout.prop(st, "use_realtime_update") layout.prop(st, "show_sliders") layout.prop(st, "use_auto_merge_keyframes") - layout.prop(st, "use_auto_lock_translation_axis") + layout.prop(st, "autolock_translation_axis") layout.separator() if st.mode != 'DRIVERS': diff --git a/scripts/startup/bl_ui/space_image.py b/scripts/startup/bl_ui/space_image.py index 4608a501d0a..ebce4347186 100644 --- a/scripts/startup/bl_ui/space_image.py +++ b/scripts/startup/bl_ui/space_image.py @@ -194,7 +194,8 @@ class IMAGE_MT_image(Menu): ima = sima.image show_render = sima.show_render - layout.operator("image.new", text="New", text_ctxt=i18n_contexts.id_image) + layout.operator("image.new", text="New", + text_ctxt=i18n_contexts.id_image) layout.operator("image.open", text="Open...", icon='FILE_FOLDER') layout.operator("image.read_viewlayers") @@ -210,16 +211,7 @@ class IMAGE_MT_image(Menu): layout.separator() - has_image_clipboard = False if sys.platform[:3] == "win": - has_image_clipboard = True - else: - from _bpy import _ghost_backend - if _ghost_backend() == 'WAYLAND': - has_image_clipboard = True - del _ghost_backend - - if has_image_clipboard: layout.operator("image.clipboard_copy", text="Copy") layout.operator("image.clipboard_paste", text="Paste") layout.separator() @@ -315,11 +307,6 @@ class IMAGE_MT_uvs_transform(Menu): layout.separator() - layout.operator("transform.vert_slide") - layout.operator("transform.edge_slide") - - layout.separator() - layout.operator("uv.randomize_uv_transform") @@ -535,16 +522,6 @@ class IMAGE_MT_uvs_context_menu(Menu): # UV Edit Mode if sima.show_uvedit: - ts = context.tool_settings - if ts.use_uv_select_sync: - is_vert_mode, is_edge_mode, _ = ts.mesh_select_mode - else: - uv_select_mode = ts.uv_select_mode - is_vert_mode = uv_select_mode == 'VERTEX' - is_edge_mode = uv_select_mode == 'EDGE' - # is_face_mode = uv_select_mode == 'FACE' - # is_island_mode = uv_select_mode == 'ISLAND' - # Add layout.operator("uv.unwrap") layout.operator("uv.follow_active_quads") @@ -568,18 +545,6 @@ class IMAGE_MT_uvs_context_menu(Menu): layout.separator() - if is_vert_mode or is_edge_mode: - layout.operator_context = 'INVOKE_DEFAULT' - - if is_vert_mode: - layout.operator("transform.vert_slide") - - if is_edge_mode: - layout.operator("transform.edge_slide") - - layout.operator_context = 'EXEC_REGION_WIN' - layout.separator() - # Remove layout.menu("IMAGE_MT_uvs_merge") layout.operator("uv.stitch") @@ -905,7 +870,7 @@ class IMAGE_HT_header(Header): row.prop(sima, "show_stereo_3d", text="") if show_maskedit: row = layout.row() - row.popover(panel="IMAGE_PT_mask_display") + row.popover(panel='IMAGE_PT_mask_display') # layers. layout.template_image_layers(ima, iuser) @@ -1031,10 +996,6 @@ class IMAGE_PT_snapping(Panel): row.prop(tool_settings, "use_snap_translate", text="Move", toggle=True) row.prop(tool_settings, "use_snap_rotate", text="Rotate", toggle=True) row.prop(tool_settings, "use_snap_scale", text="Scale", toggle=True) - col.label(text="Rotation Increment") - row = col.row(align=True) - row.prop(tool_settings, "snap_angle_increment_2d", text="") - row.prop(tool_settings, "snap_angle_increment_2d_precision", text="") class IMAGE_PT_proportional_edit(Panel): @@ -1614,10 +1575,10 @@ class IMAGE_PT_overlay_guides(Panel): layout.prop(uvedit, "tile_grid_shape", text="Tiles") -class IMAGE_PT_overlay_uv_stretch(Panel): +class IMAGE_PT_overlay_uv_edit(Panel): bl_space_type = 'IMAGE_EDITOR' bl_region_type = 'HEADER' - bl_label = "UV Stretch" + bl_label = "UV Editing" bl_parent_id = "IMAGE_PT_overlay" @classmethod @@ -1634,12 +1595,12 @@ class IMAGE_PT_overlay_uv_stretch(Panel): layout.active = overlay.show_overlays - row = layout.row(align=True) - row.row().prop(uvedit, "show_stretch", text="") - subrow = row.row() + # UV Stretching + row = layout.row() + row.prop(uvedit, "show_stretch") + subrow = row.row(align=True) subrow.active = uvedit.show_stretch subrow.prop(uvedit, "display_stretch_type", text="") - subrow.prop(uvedit, "stretch_opacity", text="Opacity") class IMAGE_PT_overlay_uv_edit_geometry(Panel): @@ -1791,7 +1752,7 @@ classes = ( IMAGE_PT_gizmo_display, IMAGE_PT_overlay, IMAGE_PT_overlay_guides, - IMAGE_PT_overlay_uv_stretch, + IMAGE_PT_overlay_uv_edit, IMAGE_PT_overlay_uv_edit_geometry, IMAGE_PT_overlay_texture_paint, IMAGE_PT_overlay_image, diff --git a/scripts/startup/bl_ui/space_info.py b/scripts/startup/bl_ui/space_info.py index 7d690fb6b45..c865565c454 100644 --- a/scripts/startup/bl_ui/space_info.py +++ b/scripts/startup/bl_ui/space_info.py @@ -81,7 +81,9 @@ class INFO_MT_area(Menu): layout.separator() layout.operator("screen.screen_full_area") - layout.operator("screen.screen_full_area", text="Toggle Fullscreen Area").use_hide_panels = True + layout.operator( + "screen.screen_full_area", + text="Toggle Fullscreen Area").use_hide_panels = True layout.operator("screen.area_dupli") layout.separator() diff --git a/scripts/startup/bl_ui/space_nla.py b/scripts/startup/bl_ui/space_nla.py index e454da1fb84..d43d590cbd3 100644 --- a/scripts/startup/bl_ui/space_nla.py +++ b/scripts/startup/bl_ui/space_nla.py @@ -17,6 +17,8 @@ class NLA_HT_header(Header): def draw(self, context): layout = self.layout + st = context.space_data + layout.template_header() NLA_MT_editor_menus.draw_collapsible(context, layout) diff --git a/scripts/startup/bl_ui/space_node.py b/scripts/startup/bl_ui/space_node.py index 8555e7eb956..b69e5de6d5b 100644 --- a/scripts/startup/bl_ui/space_node.py +++ b/scripts/startup/bl_ui/space_node.py @@ -407,7 +407,7 @@ class NODE_PT_material_slots(Panel): iface_("Slot") ) - # Duplicate part of `EEVEE_MATERIAL_PT_context_material`. + # Duplicate part of 'EEVEE_MATERIAL_PT_context_material'. def draw(self, context): layout = self.layout row = layout.row() @@ -818,9 +818,12 @@ class NODE_PT_quality(bpy.types.Panel): col.active = not use_realtime col.prop(tree, "render_quality", text="Render") col.prop(tree, "edit_quality", text="Edit") + col.prop(tree, "chunk_size") col = layout.column() col.active = not use_realtime + col.prop(tree, "use_opencl") + col.prop(tree, "use_groupnode_buffer") col.prop(tree, "use_two_pass") col.prop(tree, "use_viewer_border") @@ -864,9 +867,6 @@ class NODE_PT_overlay(Panel): col.prop(overlay, "show_timing", text="Timings") col.prop(overlay, "show_named_attributes", text="Named Attributes") - if snode.tree_type == 'CompositorNodeTree': - col.prop(overlay, "show_timing", text="Timings") - class NODE_MT_node_tree_interface_context_menu(Menu): bl_label = "Node Tree Interface Specials" @@ -933,7 +933,7 @@ class NODE_PT_node_tree_interface(Panel): if 'OUTPUT' in active_item.in_out: layout.prop(active_item, "attribute_domain") layout.prop(active_item, "default_attribute_name") - if hasattr(active_item, "draw"): + if hasattr(active_item, 'draw'): active_item.draw(context, layout) if active_item.item_type == 'PANEL': @@ -1086,7 +1086,7 @@ class NODE_PT_repeat_zone_items(Panel): if snode is None: return False node = context.active_node - if node is None or node.bl_idname not in {cls.input_node_type, cls.output_node_type}: + if node is None or node.bl_idname not in (cls.input_node_type, cls.output_node_type): return False if cls.get_output_node(context) is None: return False diff --git a/scripts/startup/bl_ui/space_outliner.py b/scripts/startup/bl_ui/space_outliner.py index 9849c625f7f..2459bc35392 100644 --- a/scripts/startup/bl_ui/space_outliner.py +++ b/scripts/startup/bl_ui/space_outliner.py @@ -223,7 +223,8 @@ class OUTLINER_MT_collection(Menu): space = context.space_data - layout.operator("outliner.collection_new", text="New", text_ctxt=i18n_contexts.id_collection).nested = True + layout.operator("outliner.collection_new", text="New", + text_ctxt=i18n_contexts.id_collection).nested = True layout.operator("outliner.collection_duplicate", text="Duplicate Collection") layout.operator("outliner.collection_duplicate_linked", text="Duplicate Linked") layout.operator("outliner.id_copy", text="Copy", icon='COPYDOWN') diff --git a/scripts/startup/bl_ui/space_sequencer.py b/scripts/startup/bl_ui/space_sequencer.py index 731a1f992e3..4095985a45f 100644 --- a/scripts/startup/bl_ui/space_sequencer.py +++ b/scripts/startup/bl_ui/space_sequencer.py @@ -2669,7 +2669,7 @@ class SEQUENCER_PT_modifiers(SequencerButtonsPanel, Panel): col.prop(mod, "gamma") else: if mod.type == 'SOUND_EQUALIZER': - # eq_row = box.row() + eq_row = box.row() # eq_graphs = eq_row.operator_menu_enum("sequencer.strip_modifier_equalizer_redefine", "graphs") # eq_graphs.name = mod.name flow = box.grid_flow( diff --git a/scripts/startup/bl_ui/space_text.py b/scripts/startup/bl_ui/space_text.py index f4017ac54aa..4263d96bf61 100644 --- a/scripts/startup/bl_ui/space_text.py +++ b/scripts/startup/bl_ui/space_text.py @@ -31,12 +31,14 @@ class TEXT_HT_header(Header): row.operator("text.resolve_conflict", text="", icon='QUESTION') row = layout.row(align=True) - row.template_ID(st, "text", new="text.new", unlink="text.unlink", open="text.open") + row.template_ID(st, "text", new="text.new", + unlink="text.unlink", open="text.open") if text: is_osl = text.name.endswith((".osl", ".osl")) if is_osl: - row.operator("node.shader_script_update", text="", icon='FILE_REFRESH') + row.operator("node.shader_script_update", + text="", icon='FILE_REFRESH') else: row = layout.row() row.active = is_syntax_highlight_supported @@ -172,8 +174,10 @@ class TEXT_PT_find(Panel): row = layout.row(align=True) if not st.text: row.active = False - row.prop(st, "use_match_case", text="Case", text_ctxt=i18n_contexts.id_text, toggle=True) - row.prop(st, "use_find_wrap", text="Wrap", text_ctxt=i18n_contexts.id_text, toggle=True) + row.prop(st, "use_match_case", text="Case", + text_ctxt=i18n_contexts.id_text, toggle=True) + row.prop(st, "use_find_wrap", text="Wrap", + text_ctxt=i18n_contexts.id_text, toggle=True) row.prop(st, "use_find_all", text="All", toggle=True) @@ -249,7 +253,8 @@ class TEXT_MT_text(Menu): st = context.space_data text = st.text - layout.operator("text.new", text="New", text_ctxt=i18n_contexts.id_text, icon='FILE_NEW') + layout.operator("text.new", text="New", + text_ctxt=i18n_contexts.id_text, icon='FILE_NEW') layout.operator("text.open", text="Open...", icon='FILE_FOLDER') if text: diff --git a/scripts/startup/bl_ui/space_time.py b/scripts/startup/bl_ui/space_time.py index b52ff660bdc..34312fa1e1a 100644 --- a/scripts/startup/bl_ui/space_time.py +++ b/scripts/startup/bl_ui/space_time.py @@ -190,7 +190,7 @@ def marker_menu_generic(layout, context): layout.separator() - layout.menu("NLA_MT_marker_select") + layout.menu('NLA_MT_marker_select') layout.separator() diff --git a/scripts/startup/bl_ui/space_toolsystem_common.py b/scripts/startup/bl_ui/space_toolsystem_common.py index a2d78a923b3..119d99d2939 100644 --- a/scripts/startup/bl_ui/space_toolsystem_common.py +++ b/scripts/startup/bl_ui/space_toolsystem_common.py @@ -226,7 +226,8 @@ class ToolSelectPanelHelper: @staticmethod def _tool_class_from_space_type(space_type): return next( - (cls for cls in ToolSelectPanelHelper.__subclasses__() if cls.bl_space_type == space_type), + (cls for cls in ToolSelectPanelHelper.__subclasses__() + if cls.bl_space_type == space_type), None, ) diff --git a/scripts/startup/bl_ui/space_toolsystem_toolbar.py b/scripts/startup/bl_ui/space_toolsystem_toolbar.py index 42e774ed35e..94b4bb5fbb1 100644 --- a/scripts/startup/bl_ui/space_toolsystem_toolbar.py +++ b/scripts/startup/bl_ui/space_toolsystem_toolbar.py @@ -1381,32 +1381,12 @@ class _defs_sculpt: @ToolDef.from_fn def hide_border(): - def draw_settings(_context, layout, tool): - props = tool.operator_properties("paint.hide_show") - layout.prop(props, "area", expand=False) - return dict( idname="builtin.box_hide", label="Box Hide", icon="ops.sculpt.border_hide", widget=None, keymap=(), - draw_settings=draw_settings, - ) - - @ToolDef.from_fn - def hide_lasso(): - def draw_settings(_context, layout, tool): - props = tool.operator_properties("paint.hide_show_lasso_gesture") - layout.prop(props, "area", expand=False) - - return dict( - idname="builtin.lasso_hide", - label="Lasso Hide", - icon="ops.sculpt.lasso_hide", - widget=None, - keymap=(), - draw_settings=draw_settings, ) @ToolDef.from_fn @@ -3097,10 +3077,7 @@ class VIEW3D_PT_tools_active(ToolSelectPanelHelper, Panel): _defs_sculpt.mask_lasso, _defs_sculpt.mask_line, ), - ( - _defs_sculpt.hide_border, - _defs_sculpt.hide_lasso - ), + _defs_sculpt.hide_border, ( _defs_sculpt.face_set_box, _defs_sculpt.face_set_lasso, diff --git a/scripts/startup/bl_ui/space_topbar.py b/scripts/startup/bl_ui/space_topbar.py index ea82fd692ce..d7ea640d3a8 100644 --- a/scripts/startup/bl_ui/space_topbar.py +++ b/scripts/startup/bl_ui/space_topbar.py @@ -33,9 +33,17 @@ class TOPBAR_HT_upper_bar(Header): layout.separator() if not screen.show_fullscreen: - layout.template_ID_tabs(window, "workspace", new="workspace.add", menu="TOPBAR_MT_workspace_menu") + layout.template_ID_tabs( + window, "workspace", + new="workspace.add", + menu="TOPBAR_MT_workspace_menu", + ) else: - layout.operator("screen.back_to_previous", icon='SCREEN_BACK', text="Back to Previous") + layout.operator( + "screen.back_to_previous", + icon='SCREEN_BACK', + text="Back to Previous", + ) def draw_right(self, context): layout = self.layout @@ -50,7 +58,8 @@ class TOPBAR_HT_upper_bar(Header): layout.template_running_jobs() # Active workspace view-layer is retrieved through window, not through workspace. - layout.template_ID(window, "scene", new="scene.new", unlink="scene.delete") + layout.template_ID(window, "scene", new="scene.new", + unlink="scene.delete") row = layout.row(align=True) row.template_search( @@ -75,9 +84,11 @@ class TOPBAR_PT_tool_settings_extra(Panel): layout = self.layout # Get the active tool - space_type, mode = ToolSelectPanelHelper._tool_key_from_context(context) + space_type, mode = ToolSelectPanelHelper._tool_key_from_context( + context) cls = ToolSelectPanelHelper._tool_class_from_space_type(space_type) - item, tool, _ = cls._tool_get_active(context, space_type, mode, with_icon=True) + item, tool, _ = cls._tool_get_active( + context, space_type, mode, with_icon=True) if item is None: return @@ -99,7 +110,8 @@ class TOPBAR_PT_tool_fallback(Panel): ToolSelectPanelHelper.draw_fallback_tool_items(layout, context) if tool_settings.workspace_tool_type == 'FALLBACK': tool = context.tool - ToolSelectPanelHelper.draw_active_tool_fallback(context, layout, tool) + ToolSelectPanelHelper.draw_active_tool_fallback( + context, layout, tool) class TOPBAR_PT_gpencil_layers(Panel): @@ -144,7 +156,8 @@ class TOPBAR_PT_gpencil_layers(Panel): srow = col.row(align=True) srow.prop(gpl, "opacity", text="Opacity", slider=True) - srow.prop(gpl, "use_mask_layer", text="", icon='CLIPUV_DEHLT' if gpl.use_mask_layer else 'CLIPUV_HLT') + srow.prop(gpl, "use_mask_layer", text="", + icon='CLIPUV_DEHLT' if gpl.use_mask_layer else 'CLIPUV_HLT') srow = col.row(align=True) srow.prop(gpl, "use_lights", text="Lights") @@ -157,20 +170,25 @@ class TOPBAR_PT_gpencil_layers(Panel): gpl = context.active_gpencil_layer if gpl: - sub.menu("GPENCIL_MT_layer_context_menu", icon='DOWNARROW_HLT', text="") + sub.menu("GPENCIL_MT_layer_context_menu", + icon='DOWNARROW_HLT', text="") if len(gpd.layers) > 1: col.separator() sub = col.column(align=True) - sub.operator("gpencil.layer_move", icon='TRIA_UP', text="").type = 'UP' - sub.operator("gpencil.layer_move", icon='TRIA_DOWN', text="").type = 'DOWN' + sub.operator("gpencil.layer_move", + icon='TRIA_UP', text="").type = 'UP' + sub.operator("gpencil.layer_move", + icon='TRIA_DOWN', text="").type = 'DOWN' col.separator() sub = col.column(align=True) - sub.operator("gpencil.layer_isolate", icon='HIDE_OFF', text="").affect_visibility = True - sub.operator("gpencil.layer_isolate", icon='LOCKED', text="").affect_visibility = False + sub.operator("gpencil.layer_isolate", icon='HIDE_OFF', + text="").affect_visibility = True + sub.operator("gpencil.layer_isolate", icon='LOCKED', + text="").affect_visibility = False class TOPBAR_MT_editor_menus(Menu): @@ -206,7 +224,8 @@ class TOPBAR_MT_blender(Menu): layout.separator() - layout.operator("preferences.app_template_install", text="Install Application Template...") + layout.operator("preferences.app_template_install", + text="Install Application Template...") layout.separator() @@ -220,8 +239,34 @@ class TOPBAR_MT_file_cleanup(Menu): layout = self.layout layout.separator() - layout.operator("outliner.orphans_purge", text="Purge Unused Data") - layout.operator("outliner.orphans_manage", text="Manage Unused Data") + props = layout.operator("outliner.orphans_purge", text="Unused Data-Blocks") + props.do_local_ids = True + props.do_linked_ids = True + props.do_recursive = False + props = layout.operator("outliner.orphans_purge", text="Recursive Unused Data-Blocks") + props.do_local_ids = True + props.do_linked_ids = True + props.do_recursive = True + + layout.separator() + props = layout.operator("outliner.orphans_purge", text="Unused Linked Data-Blocks") + props.do_local_ids = False + props.do_linked_ids = True + props.do_recursive = False + props = layout.operator("outliner.orphans_purge", text="Recursive Unused Linked Data-Blocks") + props.do_local_ids = False + props.do_linked_ids = True + props.do_recursive = True + + layout.separator() + props = layout.operator("outliner.orphans_purge", text="Unused Local Data-Blocks") + props.do_local_ids = True + props.do_linked_ids = False + props.do_recursive = False + props = layout.operator("outliner.orphans_purge", text="Recursive Unused Local Data-Blocks") + props.do_local_ids = True + props.do_linked_ids = False + props.do_recursive = True class TOPBAR_MT_file(Menu): @@ -324,11 +369,16 @@ class TOPBAR_MT_file_new(Menu): # Draw application templates. if not use_more: - props = layout.operator("wm.read_homefile", text="General", icon=icon) + props = layout.operator( + "wm.read_homefile", text="General", icon=icon) props.app_template = "" for d in paths: - props = layout.operator("wm.read_homefile", text=bpy.path.display_name(iface_(d)), icon=icon) + props = layout.operator( + "wm.read_homefile", + text=bpy.path.display_name(iface_(d)), + icon=icon, + ) props.app_template = d layout.operator_context = 'EXEC_DEFAULT' @@ -372,7 +422,8 @@ class TOPBAR_MT_file_defaults(Menu): layout.operator("wm.save_homefile") if app_template: display_name = bpy.path.display_name(iface_(app_template)) - props = layout.operator("wm.read_factory_settings", text="Load Factory Blender Settings") + props = layout.operator("wm.read_factory_settings", + text="Load Factory Blender Settings") props.app_template = app_template props = layout.operator("wm.read_factory_settings", text=iface_("Load Factory %s Settings", @@ -410,7 +461,8 @@ class TOPBAR_MT_templates_more(Menu): bl_label = "Templates" def draw(self, context): - bpy.types.TOPBAR_MT_file_new.draw_ex(self.layout, context, use_more=True) + bpy.types.TOPBAR_MT_file_new.draw_ex( + self.layout, context, use_more=True) class TOPBAR_MT_file_import(Menu): @@ -524,8 +576,10 @@ class TOPBAR_MT_render(Menu): rd = context.scene.render - layout.operator("render.render", text="Render Image", icon='RENDER_STILL').use_viewport = True - props = layout.operator("render.render", text="Render Animation", icon='RENDER_ANIMATION') + layout.operator("render.render", text="Render Image", + icon='RENDER_STILL').use_viewport = True + props = layout.operator( + "render.render", text="Render Animation", icon='RENDER_ANIMATION') props.animation = True props.use_viewport = True @@ -584,7 +638,8 @@ class TOPBAR_MT_edit(Menu): layout.separator() - layout.operator("screen.userpref_show", text="Preferences...", icon='PREFERENCES') + layout.operator("screen.userpref_show", + text="Preferences...", icon='PREFERENCES') class TOPBAR_MT_window(Menu): @@ -605,8 +660,10 @@ class TOPBAR_MT_window(Menu): layout.separator() - layout.operator("screen.workspace_cycle", text="Next Workspace").direction = 'NEXT' - layout.operator("screen.workspace_cycle", text="Previous Workspace").direction = 'PREV' + layout.operator("screen.workspace_cycle", + text="Next Workspace").direction = 'NEXT' + layout.operator("screen.workspace_cycle", + text="Previous Workspace").direction = 'PREV' layout.separator() @@ -687,7 +744,8 @@ class TOPBAR_MT_file_context_menu(Menu): layout.separator() - layout.operator("screen.userpref_show", text="Preferences...", icon='PREFERENCES') + layout.operator("screen.userpref_show", + text="Preferences...", icon='PREFERENCES') class TOPBAR_MT_workspace_menu(Menu): @@ -696,21 +754,26 @@ class TOPBAR_MT_workspace_menu(Menu): def draw(self, _context): layout = self.layout - layout.operator("workspace.duplicate", text="Duplicate", icon='DUPLICATE') + layout.operator("workspace.duplicate", + text="Duplicate", icon='DUPLICATE') if len(bpy.data.workspaces) > 1: layout.operator("workspace.delete", text="Delete", icon='REMOVE') layout.separator() - layout.operator("workspace.reorder_to_front", text="Reorder to Front", icon='TRIA_LEFT_BAR') - layout.operator("workspace.reorder_to_back", text="Reorder to Back", icon='TRIA_RIGHT_BAR') + layout.operator("workspace.reorder_to_front", + text="Reorder to Front", icon='TRIA_LEFT_BAR') + layout.operator("workspace.reorder_to_back", + text="Reorder to Back", icon='TRIA_RIGHT_BAR') layout.separator() # For key binding discoverability. - props = layout.operator("screen.workspace_cycle", text="Previous Workspace") + props = layout.operator("screen.workspace_cycle", + text="Previous Workspace") props.direction = 'PREV' - props = layout.operator("screen.workspace_cycle", text="Next Workspace") + props = layout.operator( + "screen.workspace_cycle", text="Next Workspace") props.direction = 'NEXT' @@ -725,7 +788,8 @@ class TOPBAR_PT_gpencil_primitive(Panel): layout = self.layout # Curve - layout.template_curve_mapping(settings, "thickness_primitive_curve", brush=True) + layout.template_curve_mapping( + settings, "thickness_primitive_curve", brush=True) # Only a popover diff --git a/scripts/startup/bl_ui/space_userpref.py b/scripts/startup/bl_ui/space_userpref.py index f177e8f0101..dfa42725cc6 100644 --- a/scripts/startup/bl_ui/space_userpref.py +++ b/scripts/startup/bl_ui/space_userpref.py @@ -247,7 +247,7 @@ class USERPREF_PT_interface_text(InterfacePanel, CenterAlignMixIn, Panel): class USERPREF_PT_interface_translation(InterfacePanel, CenterAlignMixIn, Panel): - bl_label = "Language" + bl_label = "Translation" bl_translation_context = i18n_contexts.id_windowmanager @classmethod @@ -260,7 +260,7 @@ class USERPREF_PT_interface_translation(InterfacePanel, CenterAlignMixIn, Panel) layout.prop(view, "language") - col = layout.column(heading="Translate") + col = layout.column(heading="Affect") col.active = (bpy.app.translations.locale != "en_US") col.prop(view, "use_translate_tooltips", text="Tooltips") col.prop(view, "use_translate_interface", text="Interface") @@ -876,7 +876,7 @@ class USERPREF_PT_theme(ThemePanel, Panel): row = split.row(align=True) row.menu("USERPREF_MT_interface_theme_presets", text=USERPREF_MT_interface_theme_presets.bl_label) row.operator("wm.interface_theme_preset_add", text="", icon='ADD') - row.operator("wm.interface_theme_preset_remove", text="", icon='REMOVE') + row.operator("wm.interface_theme_preset_add", text="", icon='REMOVE').remove_active = True row = split.row(align=True) row.operator("preferences.theme_install", text="Install...", icon='IMPORT') @@ -1021,7 +1021,8 @@ class USERPREF_PT_theme_interface_transparent_checker(ThemePanel, CenterAlignMix theme = context.preferences.themes[0] ui = theme.user_interface - flow = layout.grid_flow(row_major=False, columns=0, even_columns=True, even_rows=False, align=False) + flow = layout.grid_flow( + row_major=False, columns=0, even_columns=True, even_rows=False, align=False) col = flow.column(align=True) col.prop(ui, "transparent_checker_primary") @@ -1596,7 +1597,7 @@ class USERPREF_UL_asset_libraries(UIList): class USERPREF_UL_extension_repos(UIList): def draw_item(self, _context, layout, _data, item, icon, _active_data, _active_propname, _index): repo = item - icon = 'INTERNET' if repo.use_remote_path else 'DISK_DRIVE' + icon = 'WORLD' if repo.use_remote_path else 'DISK_DRIVE' if self.layout_type in {'DEFAULT', 'COMPACT'}: layout.prop(repo, "name", text="", icon=icon, emboss=False) elif self.layout_type == 'GRID': @@ -1613,24 +1614,6 @@ class USERPREF_UL_extension_repos(UIList): layout.prop(repo, "enabled", text="", emboss=False, icon='CHECKBOX_HLT' if repo.enabled else 'CHECKBOX_DEHLT') - def filter_items(self, _context, data, propname): - # Repositories has no index, converting to a list. - items = list(getattr(data, propname)) - - flags = [self.bitflag_filter_item] * len(items) - - indices = [None] * len(items) - for index, orig_index in enumerate(sorted( - range(len(items)), - key=lambda i: ( - items[i].use_remote_path is False, - items[i].name.lower(), - ) - )): - indices[orig_index] = index - - return flags, indices - # ----------------------------------------------------------------------------- # Save/Load Panels @@ -2042,7 +2025,7 @@ class USERPREF_PT_extensions_repos(Panel): bl_region_type = 'HEADER' # Show wider than most panels so the URL & directory aren't overly clipped. - bl_ui_units_x = 16 + bl_ui_units_x = 24 # NOTE: ideally `if panel := layout.panel("extensions_repo_advanced", default_closed=True):` # would be used but it isn't supported here, use a kludge to achieve a similar UI. @@ -2074,8 +2057,6 @@ class USERPREF_PT_extensions_repos(Panel): paths = context.preferences.filepaths active_repo_index = paths.active_extension_repo - layout.label(text="Repositories") - row = layout.row() row.template_list( @@ -2101,6 +2082,8 @@ class USERPREF_PT_extensions_repos(Panel): if active_repo is None: return + layout.separator() + # NOTE: changing repositories from remote to local & vice versa could be supported but is obscure enough # that it can be hidden entirely. If there is a some justification to show this, it can be exposed. # For now it can be accessed from Python if someone is. @@ -2108,11 +2091,9 @@ class USERPREF_PT_extensions_repos(Panel): if active_repo.use_remote_path: row = layout.row() - split = row.split(factor=0.936) if active_repo.remote_path == "": - split.alert = True - split.prop(active_repo, "remote_path", text="URL") - split = row.split() + row.alert = True + row.prop(active_repo, "remote_path", text="URL") if layout_panel := self._panel_layout_kludge(layout, text="Advanced"): @@ -2122,13 +2103,9 @@ class USERPREF_PT_extensions_repos(Panel): if active_repo.use_custom_directory: if active_repo.custom_directory == "": row.alert = True - row.prop(active_repo, "custom_directory", text="") else: - # Show the read-only directory property. - # Apart from being consistent with the custom directory UI, - # prefer a read-only property over a label because this is not necessarily - # valid UTF-8 which will raise a Python exception when passed in as text. - row.prop(active_repo, "directory", text="") + row.active = False + row.prop(active_repo, "custom_directory", text="") layout_panel.separator() @@ -2692,10 +2669,8 @@ class USERPREF_PT_experimental_prototypes(ExperimentalPanel, Panel): ({"property": "use_sculpt_texture_paint"}, ("blender/blender/issues/96225", "#96225")), ({"property": "use_experimental_compositors"}, ("blender/blender/issues/88150", "#88150")), ({"property": "use_grease_pencil_version3"}, ("blender/blender/projects/6", "Grease Pencil 3.0")), - ({"property": "use_new_matrix_socket"}, ("blender/blender/issues/116067", "Matrix Socket")), ({"property": "enable_overlay_next"}, ("blender/blender/issues/102179", "#102179")), - ({"property": "use_extension_repos"}, ("/blender/blender/issues/117286", "#117286")), - ({"property": "use_extension_utils"}, ("/blender/blender/issues/117286", "#117286")), + ({"property": "use_extension_repos"}, ("/blender/blender/issues/106254", "#106254")), ), ) diff --git a/scripts/startup/bl_ui/space_view3d.py b/scripts/startup/bl_ui/space_view3d.py index 64a44d34bea..afb2d50be89 100644 --- a/scripts/startup/bl_ui/space_view3d.py +++ b/scripts/startup/bl_ui/space_view3d.py @@ -209,6 +209,7 @@ class VIEW3D_HT_tool_header(Header): layout.label(text="Layer:") sub = layout.row() + sub.ui_units_x = 8 sub.popover( panel="TOPBAR_PT_gpencil_layers", text=text, @@ -460,7 +461,7 @@ class _draw_tool_settings_context_mode: if (tool is None) or (not tool.has_datablock): return False - # See: `VIEW3D_PT_tools_brush`, basically a duplicate + # See: 'VIEW3D_PT_tools_brush', basically a duplicate tool_settings = context.tool_settings settings = tool_settings.particle_edit brush = settings.brush @@ -604,12 +605,36 @@ class _draw_tool_settings_context_mode: ) brush_basic__draw_color_selector(context, layout, brush, brush.gpencil_settings, None) - from bl_ui.properties_paint_common import ( - brush_basic__draw_color_selector, - brush_basic_grease_pencil_paint_settings, + UnifiedPaintPanel.prop_unified( + layout, + context, + brush, + "size", + unified_name="use_unified_size", + pressure_name="use_pressure_size", + text="Radius", + slider=True, + header=True, ) - brush_basic_grease_pencil_paint_settings(layout, context, brush, compact=True) + UnifiedPaintPanel.prop_unified( + layout, + context, + brush, + "strength", + pressure_name="use_pressure_strength", + unified_name="use_unified_strength", + slider=True, + header=True, + ) + + if grease_pencil_tool == 'DRAW': + layout.prop(brush.gpencil_settings, "active_smooth_factor") + elif grease_pencil_tool == 'ERASE': + layout.prop(brush.gpencil_settings, "eraser_mode", expand=True) + if brush.gpencil_settings.eraser_mode == "HARD": + layout.prop(brush.gpencil_settings, "use_keep_caps_eraser") + layout.prop(brush.gpencil_settings, "use_active_layer_only") return True @@ -637,6 +662,7 @@ class VIEW3D_HT_header(Header): row = layout.row(align=True) sub = row.row() + sub.ui_units_x = 4 sub.prop_with_popover( orient_slot, "type", @@ -749,6 +775,7 @@ class VIEW3D_HT_header(Header): act_mode_i18n_context = bpy.types.Object.bl_rna.properties["mode"].translation_context sub = row.row(align=True) + sub.ui_units_x = 5.5 sub.operator_menu_enum( "object.mode_set", "mode", text=iface_(act_mode_item.name, act_mode_i18n_context), @@ -800,21 +827,13 @@ class VIEW3D_HT_header(Header): depress=(tool_settings.gpencil_selectmode_edit == 'STROKE'), ).mode = 'STROKE' - if object_mode == 'PAINT_GREASE_PENCIL': - row = layout.row(align=True) - row.prop(tool_settings, "use_gpencil_draw_additive", text="", icon='FREEZE') - - if object_mode in {'PAINT_GREASE_PENCIL', 'EDIT', 'WEIGHT_PAINT'}: row = layout.row(align=True) row.prop(tool_settings, "use_grease_pencil_multi_frame_editing", text="") - if object_mode in {'EDIT', 'WEIGHT_PAINT'}: - sub = row.row(align=True) - sub.enabled = tool_settings.use_grease_pencil_multi_frame_editing - sub.popover( - panel="VIEW3D_PT_grease_pencil_multi_frame", - text="Multiframe", - ) + if object_mode == 'PAINT_GREASE_PENCIL': + row = layout.row() + sub = row.row(align=True) + sub.prop(tool_settings, "use_gpencil_draw_additive", text="", icon='FREEZE') # Grease Pencil (legacy) if obj and obj.type == 'GPENCIL' and context.gpencil_data: @@ -843,7 +862,8 @@ class VIEW3D_HT_header(Header): # Curve edit sub-mode. row = layout.row(align=True) - row.prop(gpd, "use_curve_edit", text="", icon='IPO_BEZIER') + row.prop(gpd, "use_curve_edit", text="", + icon='IPO_BEZIER') sub = row.row(align=True) sub.active = gpd.use_curve_edit sub.popover( @@ -942,6 +962,7 @@ class VIEW3D_HT_header(Header): color_type = shading.color_type row = layout.row() + row.ui_units_x = 6 row.active = is_paint_tool and color_type == 'VERTEX' if context.preferences.experimental.use_sculpt_texture_paint: @@ -959,10 +980,12 @@ class VIEW3D_HT_header(Header): elif object_mode == 'VERTEX_PAINT': row = layout.row() + row.ui_units_x = 6 row.popover(panel="VIEW3D_PT_slots_color_attributes", icon='GROUP_VCOL') elif object_mode == 'WEIGHT_PAINT': row = layout.row() + row.ui_units_x = 6 row.popover(panel="VIEW3D_PT_slots_vertex_groups", icon='GROUP_VERTEX') elif object_mode == 'TEXTURE_PAINT': @@ -970,10 +993,12 @@ class VIEW3D_HT_header(Header): icon = 'MATERIAL' if tool_mode == 'MATERIAL' else 'IMAGE_DATA' row = layout.row() + row.ui_units_x = 9 row.popover(panel="VIEW3D_PT_slots_projectpaint", icon=icon) row.popover( panel="VIEW3D_PT_mask", - icon=VIEW3D_HT_header._texture_mask_icon(tool_settings.image_paint), + icon=VIEW3D_HT_header._texture_mask_icon( + tool_settings.image_paint), text="") else: # Transform settings depending on tool header visibility @@ -1118,12 +1143,11 @@ class VIEW3D_MT_editor_menus(Menu): elif mode_string == 'VERTEX_GPENCIL': layout.menu("VIEW3D_MT_select_edit_gpencil") elif mode_string in {'PAINT_WEIGHT', 'PAINT_VERTEX', 'PAINT_TEXTURE'}: - if obj.type == 'MESH': - mesh = obj.data - if mesh.use_paint_mask: - layout.menu("VIEW3D_MT_select_paint_mask") - elif mesh.use_paint_mask_vertex and mode_string in {'PAINT_WEIGHT', 'PAINT_VERTEX'}: - layout.menu("VIEW3D_MT_select_paint_mask_vertex") + mesh = obj.data + if mesh.use_paint_mask: + layout.menu("VIEW3D_MT_select_paint_mask") + elif mesh.use_paint_mask_vertex and mode_string in {'PAINT_WEIGHT', 'PAINT_VERTEX'}: + layout.menu("VIEW3D_MT_select_paint_mask_vertex") elif mode_string not in {'SCULPT', 'SCULPT_CURVES', 'PAINT_GREASE_PENCIL'}: layout.menu("VIEW3D_MT_select_%s" % mode_string.lower()) @@ -2565,13 +2589,6 @@ class VIEW3D_MT_grease_pencil_add(Menu): layout.operator("object.grease_pencil_add", text="Empty", icon='EMPTY_AXIS').type = 'EMPTY' layout.operator("object.grease_pencil_add", text="Stroke", icon='STROKE').type = 'STROKE' layout.operator("object.grease_pencil_add", text="Suzanne", icon='MONKEY').type = 'MONKEY' - layout.separator() - layout.operator("object.grease_pencil_add", text="Scene Line Art", icon='SCENE').type = 'LINEART_SCENE' - layout.operator( - "object.grease_pencil_add", - text="Collection Line Art", - icon='GROUP').type = 'LINEART_COLLECTION' - layout.operator("object.grease_pencil_add", text="Object Line Art", icon='CUBE').type = 'LINEART_OBJECT' class VIEW3D_MT_add(Menu): @@ -2678,10 +2695,8 @@ class VIEW3D_MT_image_add(Menu): def draw(self, _context): layout = self.layout - # Expliclitly set background mode on/off as operator will try to - # auto detect which mode to use otherwise. - layout.operator("object.empty_image_add", text="Reference", icon='IMAGE_REFERENCE').background = False - layout.operator("object.empty_image_add", text="Background", icon='IMAGE_BACKGROUND').background = True + layout.operator("object.load_reference_image", text="Reference", icon='IMAGE_REFERENCE') + layout.operator("object.load_background_image", text="Background", icon='IMAGE_BACKGROUND') class VIEW3D_MT_object_relations(Menu): @@ -3136,7 +3151,9 @@ class VIEW3D_MT_object_apply(Menu): text_ctxt=i18n_contexts.default, ).target = 'MESH' layout.operator("object.duplicates_make_real") - layout.operator("object.parent_inverse_apply", text="Parent Inverse", text_ctxt=i18n_contexts.default) + layout.operator("object.parent_inverse_apply", + text="Parent Inverse", + text_ctxt=i18n_contexts.default) layout.template_node_operator_asset_menu_items(catalog_path="Object/Apply") @@ -3551,10 +3568,8 @@ class VIEW3D_MT_paint_weight(Menu): layout.menu("VIEW3D_MT_paint_weight_lock", text="Locks") - def draw(self, context): - obj = context.active_object - if obj.type == 'MESH': - self.draw_generic(self.layout, is_editmode=False) + def draw(self, _context): + self.draw_generic(self.layout, is_editmode=False) class VIEW3D_MT_sculpt(Menu): @@ -3578,12 +3593,6 @@ class VIEW3D_MT_sculpt(Menu): props = layout.operator("paint.hide_show", text="Box Show") props.action = 'SHOW' - props = layout.operator("paint.hide_show_lasso_gesture", text="Lasso Hide") - props.action = 'HIDE' - - props = layout.operator("paint.hide_show_lasso_gesture", text="Lasso Show") - props.action = 'SHOW' - layout.separator() props = layout.operator("sculpt.face_set_change_visibility", text="Toggle Visibility") @@ -3592,13 +3601,15 @@ class VIEW3D_MT_sculpt(Menu): props = layout.operator("sculpt.face_set_change_visibility", text="Hide Active Face Set") props.mode = 'HIDE_ACTIVE' - props = layout.operator("paint.hide_show_all", text="Show All") + props = layout.operator("paint.hide_show", text="Show All") props.action = 'SHOW' + props.area = 'ALL' layout.operator("paint.visibility_invert", text="Invert Visible") - props = layout.operator("paint.hide_show_masked", text="Hide Masked") + props = layout.operator("paint.hide_show", text="Hide Masked") props.action = 'HIDE' + props.area = 'MASKED' layout.separator() @@ -4109,7 +4120,8 @@ class VIEW3D_MT_bone_collections(Menu): layout.separator() layout.operator("armature.collection_show_all") - props = layout.operator("armature.collection_create_and_assign", text="Assign to New Collection") + props = layout.operator("armature.collection_create_and_assign", + text="Assign to New Collection") props.name = "New Collection" @@ -4491,9 +4503,12 @@ class VIEW3D_MT_edit_mesh_context_menu(Menu): col.separator() - col.operator("view3d.edit_mesh_extrude_move_normal", text="Extrude Faces") - col.operator("view3d.edit_mesh_extrude_move_shrink_fatten", text="Extrude Faces Along Normals") - col.operator("mesh.extrude_faces_move", text="Extrude Individual Faces") + col.operator("view3d.edit_mesh_extrude_move_normal", + text="Extrude Faces") + col.operator("view3d.edit_mesh_extrude_move_shrink_fatten", + text="Extrude Faces Along Normals") + col.operator("mesh.extrude_faces_move", + text="Extrude Individual Faces") col.operator("mesh.inset") col.operator("mesh.poke") @@ -4553,16 +4568,23 @@ class VIEW3D_MT_edit_mesh_extrude(Menu): mesh = context.object.data if mesh.total_face_sel: - layout.operator("view3d.edit_mesh_extrude_move_normal", text="Extrude Faces") - layout.operator("view3d.edit_mesh_extrude_move_shrink_fatten", text="Extrude Faces Along Normals") - layout.operator("mesh.extrude_faces_move", text="Extrude Individual Faces") - layout.operator("view3d.edit_mesh_extrude_manifold_normal", text="Extrude Manifold") + layout.operator("view3d.edit_mesh_extrude_move_normal", + text="Extrude Faces") + layout.operator("view3d.edit_mesh_extrude_move_shrink_fatten", + text="Extrude Faces Along Normals") + layout.operator( + "mesh.extrude_faces_move", + text="Extrude Individual Faces") + layout.operator("view3d.edit_mesh_extrude_manifold_normal", + text="Extrude Manifold") if mesh.total_edge_sel and (select_mode[0] or select_mode[1]): - layout.operator("mesh.extrude_edges_move", text="Extrude Edges") + layout.operator("mesh.extrude_edges_move", + text="Extrude Edges") if mesh.total_vert_sel and select_mode[0]: - layout.operator("mesh.extrude_vertices_move", text="Extrude Vertices") + layout.operator("mesh.extrude_vertices_move", + text="Extrude Vertices") layout.separator() @@ -4727,8 +4749,10 @@ class VIEW3D_MT_edit_mesh_faces(Menu): layout.operator_context = 'INVOKE_REGION_WIN' - layout.operator("view3d.edit_mesh_extrude_move_normal", text="Extrude Faces") - layout.operator("view3d.edit_mesh_extrude_move_shrink_fatten", text="Extrude Faces Along Normals") + layout.operator("view3d.edit_mesh_extrude_move_normal", + text="Extrude Faces") + layout.operator("view3d.edit_mesh_extrude_move_shrink_fatten", + text="Extrude Faces Along Normals") layout.operator("mesh.extrude_faces_move", text="Extrude Individual Faces") layout.separator() @@ -5648,7 +5672,8 @@ class VIEW3D_MT_edit_gpencil_stroke(Menu): layout.separator() - layout.operator_menu_enum("gpencil.stroke_join", "type", text="Join", text_ctxt=i18n_contexts.id_gpencil) + layout.operator_menu_enum("gpencil.stroke_join", "type", text="Join", + text_ctxt=i18n_contexts.id_gpencil) layout.separator() @@ -5813,27 +5838,28 @@ class VIEW3D_MT_edit_greasepencil(Menu): layout.separator() + layout.operator_menu_enum("grease_pencil.separate", "mode", text="Separate") + + layout.separator() + layout.menu("GREASE_PENCIL_MT_layer_active", text="Active Layer") layout.separator() - layout.operator("grease_pencil.duplicate_move", text="Duplicate") - - layout.separator() - - layout.operator("grease_pencil.copy", text="Copy", icon='COPYDOWN') - layout.operator("grease_pencil.paste", text="Paste", icon='PASTEDOWN') + layout.operator("grease_pencil.duplicate_move") layout.separator() layout.menu("VIEW3D_MT_edit_greasepencil_showhide") - layout.operator_menu_enum("grease_pencil.separate", "mode", text="Separate") - layout.operator("grease_pencil.clean_loose") layout.separator() layout.menu("VIEW3D_MT_edit_greasepencil_delete") + layout.separator() + + layout.operator("grease_pencil.clean_loose") + class VIEW3D_MT_edit_greasepencil_stroke(Menu): bl_label = "Stroke" @@ -5849,26 +5875,27 @@ class VIEW3D_MT_edit_greasepencil_stroke(Menu): layout.menu("GREASE_PENCIL_MT_move_to_layer") layout.menu("VIEW3D_MT_grease_pencil_assign_material") layout.operator("grease_pencil.set_active_material") - layout.operator_menu_enum("grease_pencil.reorder", text="Arrange", property="direction") layout.separator() layout.operator("grease_pencil.cyclical_set", text="Toggle Cyclic").type = 'TOGGLE' - layout.operator_menu_enum("grease_pencil.caps_set", text="Set Caps", property="type") layout.operator("grease_pencil.stroke_switch_direction") + layout.operator_menu_enum("grease_pencil.caps_set", text="Set Caps", property="type") layout.separator() layout.operator("grease_pencil.set_uniform_thickness") layout.operator("grease_pencil.set_uniform_opacity") + layout.operator_menu_enum("grease_pencil.reorder", text="Reorder", property="direction") + class VIEW3D_MT_edit_greasepencil_point(Menu): bl_label = "Point" def draw(self, _context): layout = self.layout - layout.operator("grease_pencil.stroke_smooth", text="Smooth") + layout.operator("grease_pencil.stroke_smooth", text="Smooth Points") class VIEW3D_MT_edit_curves(Menu): @@ -6136,8 +6163,9 @@ class VIEW3D_MT_sculpt_face_sets_edit_pie(Menu): pie.operator("paint.visibility_invert", text="Invert Visible") - props = pie.operator("paint.hide_show_all", text="Show All") + props = pie.operator("paint.hide_show", text="Show All") props.action = "SHOW" + props.area = "ALL" class VIEW3D_MT_wpaint_vgroup_lock_pie(Menu): @@ -7590,10 +7618,6 @@ class VIEW3D_PT_snapping(Panel): row.prop(tool_settings, "use_snap_translate", text="Move", toggle=True) row.prop(tool_settings, "use_snap_rotate", text="Rotate", toggle=True) row.prop(tool_settings, "use_snap_scale", text="Scale", toggle=True) - col.label(text="Rotation Increment") - row = col.row(align=True) - row.prop(tool_settings, "snap_angle_increment_3d", text="") - row.prop(tool_settings, "snap_angle_increment_3d_precision", text="") class VIEW3D_PT_proportional_edit(Panel): @@ -7995,25 +8019,6 @@ class VIEW3D_PT_gpencil_multi_frame(Panel): layout.template_curve_mapping(settings, "multiframe_falloff_curve", brush=True) -class VIEW3D_PT_grease_pencil_multi_frame(Panel): - bl_space_type = 'VIEW_3D' - bl_region_type = 'HEADER' - bl_label = "Multi Frame" - - def draw(self, context): - layout = self.layout - tool_settings = context.tool_settings - - settings = tool_settings.gpencil_sculpt - - col = layout.column(align=True) - col.prop(settings, "use_multiframe_falloff") - - # Falloff curve - if settings.use_multiframe_falloff: - layout.template_curve_mapping(settings, "multiframe_falloff_curve", brush=True) - - # Grease Pencil Object - Curve Editing tools class VIEW3D_PT_gpencil_curve_edit(Panel): bl_space_type = 'VIEW_3D' @@ -8138,7 +8143,8 @@ class VIEW3D_MT_gpencil_edit_context_menu(Menu): # Removal Operators col.operator("gpencil.stroke_merge_by_distance").use_unselected = True - col.operator_menu_enum("gpencil.stroke_join", "type", text="Join", text_ctxt=i18n_contexts.id_gpencil) + col.operator_menu_enum("gpencil.stroke_join", "type", text="Join", + text_ctxt=i18n_contexts.id_gpencil) col.operator("gpencil.stroke_split", text="Split") col.operator("gpencil.stroke_separate", text="Separate").mode = 'STROKE' @@ -8217,12 +8223,6 @@ class VIEW3D_MT_greasepencil_edit_context_menu(Menu): col = row.column(align=True) col.label(text="Point", icon='GP_SELECT_POINTS') - # Copy/paste - col.operator("grease_pencil.copy", text="Copy", icon="COPYDOWN") - col.operator("grease_pencil.paste", text="Paste", icon="PASTEDOWN") - - col.separator() - # Main Strokes Operators col.operator("grease_pencil.stroke_subdivide", text="Subdivide") col.operator("grease_pencil.stroke_subdivide_smooth", text="Subdivide and Smooth") @@ -8240,11 +8240,7 @@ class VIEW3D_MT_greasepencil_edit_context_menu(Menu): col.separator() - col.menu("VIEW3D_MT_mirror", text="Mirror") - - col.separator() - - col.operator("grease_pencil.duplicate_move", text="Duplicate") + col.menu("VIEW3D_MT_mirror", text="Mirror Points") col.separator() @@ -8259,12 +8255,6 @@ class VIEW3D_MT_greasepencil_edit_context_menu(Menu): col = row.column(align=True) col.label(text="Stroke", icon='GP_SELECT_STROKES') - # Copy/paste - col.operator("grease_pencil.copy", text="Copy", icon="COPYDOWN") - col.operator("grease_pencil.paste", text="Paste", icon="PASTEDOWN") - - col.separator() - # Main Strokes Operators col.operator("grease_pencil.stroke_subdivide", text="Subdivide") col.operator("grease_pencil.stroke_subdivide_smooth", text="Subdivide and Smooth") @@ -8273,15 +8263,13 @@ class VIEW3D_MT_greasepencil_edit_context_menu(Menu): col.separator() # Deform Operators - col.operator("grease_pencil.stroke_smooth", text="Smooth") + col.operator("grease_pencil.stroke_smooth", text="Smooth Points") col.operator("transform.transform", text="Radius").mode = 'CURVE_SHRINKFATTEN' col.separator() - col.menu("GREASE_PENCIL_MT_move_to_layer") col.menu("VIEW3D_MT_grease_pencil_assign_material") col.operator("grease_pencil.set_active_material", text="Set as Active Material") - col.operator_menu_enum("grease_pencil.reorder", text="Arrange", property="direction") col.separator() @@ -8289,10 +8277,6 @@ class VIEW3D_MT_greasepencil_edit_context_menu(Menu): col.separator() - col.operator("grease_pencil.duplicate_move", text="Duplicate") - - col.separator() - col.operator("grease_pencil.separate", text="Separate").mode = 'SELECTED' @@ -8749,21 +8733,16 @@ class VIEW3D_PT_curves_sculpt_add_shape(Panel): brush = settings.brush col = layout.column(heading="Interpolate", align=True) - col.prop(brush.curves_sculpt_settings, "use_length_interpolate", text="Length") - col.prop(brush.curves_sculpt_settings, "use_radius_interpolate", text="Radius") - col.prop(brush.curves_sculpt_settings, "use_shape_interpolate", text="Shape") - col.prop(brush.curves_sculpt_settings, "use_point_count_interpolate", text="Point Count") + col.prop(brush.curves_sculpt_settings, "interpolate_length", text="Length") + col.prop(brush.curves_sculpt_settings, "interpolate_shape", text="Shape") + col.prop(brush.curves_sculpt_settings, "interpolate_point_count", text="Point Count") col = layout.column() - col.active = not brush.curves_sculpt_settings.use_length_interpolate + col.active = not brush.curves_sculpt_settings.interpolate_length col.prop(brush.curves_sculpt_settings, "curve_length", text="Length") col = layout.column() - col.active = not brush.curves_sculpt_settings.use_radius_interpolate - col.prop(brush.curves_sculpt_settings, "curve_radius", text="Radius") - - col = layout.column() - col.active = not brush.curves_sculpt_settings.use_point_count_interpolate + col.active = not brush.curves_sculpt_settings.interpolate_point_count col.prop(brush.curves_sculpt_settings, "points_per_curve", text="Points") @@ -8805,7 +8784,7 @@ class VIEW3D_PT_curves_sculpt_grow_shrink_scaling(Panel): settings = UnifiedPaintPanel.paint_settings(context) brush = settings.brush - layout.prop(brush.curves_sculpt_settings, "use_uniform_scale") + layout.prop(brush.curves_sculpt_settings, "scale_uniform") layout.prop(brush.curves_sculpt_settings, "minimum_length") @@ -9050,7 +9029,6 @@ classes = ( VIEW3D_PT_grease_pencil, VIEW3D_PT_annotation_onion, VIEW3D_PT_gpencil_multi_frame, - VIEW3D_PT_grease_pencil_multi_frame, VIEW3D_PT_gpencil_curve_edit, VIEW3D_PT_gpencil_sculpt_automasking, VIEW3D_PT_quad_view, diff --git a/scripts/startup/bl_ui/space_view3d_toolbar.py b/scripts/startup/bl_ui/space_view3d_toolbar.py index babbb5f1cc6..e25bb7d60cb 100644 --- a/scripts/startup/bl_ui/space_view3d_toolbar.py +++ b/scripts/startup/bl_ui/space_view3d_toolbar.py @@ -743,7 +743,8 @@ class VIEW3D_PT_stencil_projectpaint(Panel): def draw_header(self, context): ipaint = context.tool_settings.image_paint - self.layout.prop(ipaint, "use_stencil_layer", text=self.bl_label if self.is_popover else "") + self.layout.prop(ipaint, "use_stencil_layer", + text=self.bl_label if self.is_popover else "") def draw(self, context): layout = self.layout @@ -925,7 +926,8 @@ class VIEW3D_PT_tools_brush_falloff_frontface(View3DPaintPanel, Panel): settings = self.paint_settings(context) brush = settings.brush - self.layout.prop(brush, "use_frontface_falloff", text=self.bl_label if self.is_popover else "") + self.layout.prop(brush, "use_frontface_falloff", + text=self.bl_label if self.is_popover else "") def draw(self, context): settings = self.paint_settings(context) @@ -954,7 +956,8 @@ class VIEW3D_PT_tools_brush_falloff_normal(View3DPaintPanel, Panel): tool_settings = context.tool_settings ipaint = tool_settings.image_paint - self.layout.prop(ipaint, "use_normal_falloff", text=self.bl_label if self.is_popover else "") + self.layout.prop(ipaint, "use_normal_falloff", + text=self.bl_label if self.is_popover else "") def draw(self, context): tool_settings = context.tool_settings @@ -1145,17 +1148,15 @@ class VIEW3D_PT_sculpt_symmetry(Panel, View3DPaintPanel): layout.separator() - layout.label(text="Symmetrize") layout.prop(sculpt, "symmetrize_direction") - layout.prop(WindowManager.operator_properties_last("sculpt.symmetrize"), "merge_tolerance") layout.operator("sculpt.symmetrize") + layout.prop(WindowManager.operator_properties_last("sculpt.symmetrize"), "merge_tolerance") class VIEW3D_PT_sculpt_symmetry_for_topbar(Panel): bl_space_type = 'TOPBAR' bl_region_type = 'HEADER' bl_label = "Symmetry" - bl_ui_units_x = 13 draw = VIEW3D_PT_sculpt_symmetry.draw @@ -1403,7 +1404,8 @@ class VIEW3D_PT_tools_imagepaint_options_cavity(Panel): tool_settings = context.tool_settings ipaint = tool_settings.image_paint - self.layout.prop(ipaint, "use_cavity", text=self.bl_label if self.is_popover else "") + self.layout.prop(ipaint, "use_cavity", + text=self.bl_label if self.is_popover else "") def draw(self, context): layout = self.layout @@ -1413,7 +1415,8 @@ class VIEW3D_PT_tools_imagepaint_options_cavity(Panel): layout.active = ipaint.use_cavity - layout.template_curve_mapping(ipaint, "cavity_curve", brush=True, use_negative_slope=True) + layout.template_curve_mapping(ipaint, "cavity_curve", brush=True, + use_negative_slope=True) # TODO, move to space_view3d.py @@ -1701,7 +1704,8 @@ class VIEW3D_PT_tools_grease_pencil_brush_advanced(View3DPanel, Panel): elif brush.gpencil_tool == 'FILL': row = col.row(align=True) - row.prop(gp_settings, "fill_draw_mode", text="Boundary", text_ctxt=i18n_contexts.id_gpencil) + row.prop(gp_settings, "fill_draw_mode", text="Boundary", + text_ctxt=i18n_contexts.id_gpencil) row.prop( gp_settings, "show_fill_boundary", @@ -1765,7 +1769,8 @@ class VIEW3D_PT_tools_grease_pencil_brush_stabilizer(Panel, View3DPanel): brush = context.tool_settings.gpencil_paint.brush gp_settings = brush.gpencil_settings self.layout.use_property_split = False - self.layout.prop(gp_settings, "use_settings_stabilizer", text=self.bl_label if self.is_popover else "") + self.layout.prop(gp_settings, "use_settings_stabilizer", + text=self.bl_label if self.is_popover else "") def draw(self, context): layout = self.layout @@ -1798,7 +1803,8 @@ class VIEW3D_PT_tools_grease_pencil_brush_post_processing(View3DPanel, Panel): brush = context.tool_settings.gpencil_paint.brush gp_settings = brush.gpencil_settings self.layout.use_property_split = False - self.layout.prop(gp_settings, "use_settings_postprocess", text=self.bl_label if self.is_popover else "") + self.layout.prop(gp_settings, "use_settings_postprocess", + text=self.bl_label if self.is_popover else "") def draw(self, context): layout = self.layout @@ -1853,7 +1859,8 @@ class VIEW3D_PT_tools_grease_pencil_brush_random(View3DPanel, Panel): brush = context.tool_settings.gpencil_paint.brush gp_settings = brush.gpencil_settings self.layout.use_property_split = False - self.layout.prop(gp_settings, "use_settings_random", text=self.bl_label if self.is_popover else "") + self.layout.prop(gp_settings, "use_settings_random", + text=self.bl_label if self.is_popover else "") def draw(self, context): layout = self.layout @@ -1873,21 +1880,24 @@ class VIEW3D_PT_tools_grease_pencil_brush_random(View3DPanel, Panel): row.prop(gp_settings, "use_stroke_random_radius", text="", icon='GP_SELECT_STROKES') row.prop(gp_settings, "use_random_press_radius", text="", icon='STYLUS_PRESSURE') if gp_settings.use_random_press_radius and self.is_popover is False: - col.template_curve_mapping(gp_settings, "curve_random_pressure", brush=True, use_negative_slope=True) + col.template_curve_mapping(gp_settings, "curve_random_pressure", brush=True, + use_negative_slope=True) row = col.row(align=True) row.prop(gp_settings, "random_strength", text="Strength", slider=True) row.prop(gp_settings, "use_stroke_random_strength", text="", icon='GP_SELECT_STROKES') row.prop(gp_settings, "use_random_press_strength", text="", icon='STYLUS_PRESSURE') if gp_settings.use_random_press_strength and self.is_popover is False: - col.template_curve_mapping(gp_settings, "curve_random_strength", brush=True, use_negative_slope=True) + col.template_curve_mapping(gp_settings, "curve_random_strength", brush=True, + use_negative_slope=True) row = col.row(align=True) row.prop(gp_settings, "uv_random", text="UV", slider=True) row.prop(gp_settings, "use_stroke_random_uv", text="", icon='GP_SELECT_STROKES') row.prop(gp_settings, "use_random_press_uv", text="", icon='STYLUS_PRESSURE') if gp_settings.use_random_press_uv and self.is_popover is False: - col.template_curve_mapping(gp_settings, "curve_random_uv", brush=True, use_negative_slope=True) + col.template_curve_mapping(gp_settings, "curve_random_uv", brush=True, + use_negative_slope=True) col.separator() @@ -1898,21 +1908,24 @@ class VIEW3D_PT_tools_grease_pencil_brush_random(View3DPanel, Panel): row.prop(gp_settings, "use_stroke_random_hue", text="", icon='GP_SELECT_STROKES') row.prop(gp_settings, "use_random_press_hue", text="", icon='STYLUS_PRESSURE') if gp_settings.use_random_press_hue and self.is_popover is False: - col1.template_curve_mapping(gp_settings, "curve_random_hue", brush=True, use_negative_slope=True) + col1.template_curve_mapping(gp_settings, "curve_random_hue", brush=True, + use_negative_slope=True) row = col1.row(align=True) row.prop(gp_settings, "random_saturation_factor", slider=True) row.prop(gp_settings, "use_stroke_random_sat", text="", icon='GP_SELECT_STROKES') row.prop(gp_settings, "use_random_press_sat", text="", icon='STYLUS_PRESSURE') if gp_settings.use_random_press_sat and self.is_popover is False: - col1.template_curve_mapping(gp_settings, "curve_random_saturation", brush=True, use_negative_slope=True) + col1.template_curve_mapping(gp_settings, "curve_random_saturation", brush=True, + use_negative_slope=True) row = col1.row(align=True) row.prop(gp_settings, "random_value_factor", slider=True) row.prop(gp_settings, "use_stroke_random_val", text="", icon='GP_SELECT_STROKES') row.prop(gp_settings, "use_random_press_val", text="", icon='STYLUS_PRESSURE') if gp_settings.use_random_press_val and self.is_popover is False: - col1.template_curve_mapping(gp_settings, "curve_random_value", brush=True, use_negative_slope=True) + col1.template_curve_mapping(gp_settings, "curve_random_value", brush=True, + use_negative_slope=True) col.separator() @@ -1920,7 +1933,8 @@ class VIEW3D_PT_tools_grease_pencil_brush_random(View3DPanel, Panel): row.prop(gp_settings, "pen_jitter", slider=True) row.prop(gp_settings, "use_jitter_pressure", text="", icon='STYLUS_PRESSURE') if gp_settings.use_jitter_pressure and self.is_popover is False: - col.template_curve_mapping(gp_settings, "curve_jitter", brush=True, use_negative_slope=True) + col.template_curve_mapping(gp_settings, "curve_jitter", brush=True, + use_negative_slope=True) class VIEW3D_PT_tools_grease_pencil_brush_paint_falloff(GreasePencilBrushFalloff, Panel, View3DPaintPanel): @@ -2476,189 +2490,6 @@ class VIEW3D_PT_gpencil_brush_presets(Panel, PresetPanel): preset_add_operator = "scene.gpencil_brush_preset_add" -class GreasePencilV3PaintPanel: - bl_context = ".grease_pencil_paint" - bl_category = "Tool" - - @classmethod - def poll(cls, context): - if context.space_data.type in {'VIEW_3D', 'PROPERTIES'}: - # Hide for tools not using brushes. - if tool_use_brush(context) is False: - return False - - return True - else: - return True - - -class VIEW3D_PT_tools_grease_pencil_v3_brush_select(Panel, View3DPanel, GreasePencilV3PaintPanel): - bl_label = "Brushes" - - def draw(self, context): - layout = self.layout - layout.use_property_split = True - layout.use_property_decorate = False - - tool_settings = context.scene.tool_settings - gpencil_paint = tool_settings.gpencil_paint - - row = layout.row() - row.column().template_ID_preview(gpencil_paint, "brush", new="brush.add_gpencil", rows=3, cols=8) - - col = row.column() - col.menu("VIEW3D_MT_brush_gpencil_context_menu", icon='DOWNARROW_HLT', text="") - - brush = tool_settings.gpencil_paint.brush - if brush is not None: - col.prop(brush, "use_custom_icon", toggle=True, icon='FILE_IMAGE', text="") - - if brush.use_custom_icon: - layout.row().prop(brush, "icon_filepath", text="") - - -class VIEW3D_PT_tools_grease_pencil_v3_brush_settings(Panel, View3DPanel, GreasePencilV3PaintPanel): - bl_label = "Brush Settings" - bl_options = {'DEFAULT_CLOSED'} - - def draw_header_preset(self, _context): - VIEW3D_PT_gpencil_brush_presets.draw_panel_header(self.layout) - - def draw(self, context): - layout = self.layout - layout.use_property_split = True - layout.use_property_decorate = False - - tool_settings = context.scene.tool_settings - gpencil_paint = tool_settings.gpencil_paint - - brush = gpencil_paint.brush - - if brush is not None: - gp_settings = brush.gpencil_settings - - if brush.gpencil_tool in {'DRAW', 'FILL'}: - row = layout.row(align=True) - row_mat = row.row() - if gp_settings.use_material_pin: - row_mat.template_ID(gp_settings, "material", live_icon=True) - else: - row_mat.template_ID(context.active_object, "active_material", live_icon=True) - row_mat.enabled = False # will otherwise allow changing material in active slot - - row.prop(gp_settings, "use_material_pin", text="") - - if not self.is_popover: - from bl_ui.properties_paint_common import ( - brush_basic_grease_pencil_paint_settings, - ) - brush_basic_grease_pencil_paint_settings(layout, context, brush, compact=False) - - -class VIEW3D_PT_tools_grease_pencil_v3_brush_mixcolor(View3DPanel, Panel): - bl_context = ".grease_pencil_paint" - bl_label = "Color" - bl_category = "Tool" - - @classmethod - def poll(cls, context): - ob = context.object - tool_settings = context.tool_settings - settings = tool_settings.gpencil_paint - brush = settings.brush - - if ob is None or brush is None: - return False - - if context.region.type == 'TOOL_HEADER': - return False - - from bl_ui.space_toolsystem_common import ToolSelectPanelHelper - tool = ToolSelectPanelHelper.tool_active_from_context(context) - if tool and tool.idname in {'builtin.cutter', 'builtin.eyedropper', 'builtin.interpolate'}: - return False - - if brush.gpencil_tool == 'TINT': - return True - - if brush.gpencil_tool not in {'DRAW', 'FILL'}: - return False - - return True - - def draw(self, context): - layout = self.layout - tool_settings = context.tool_settings - settings = tool_settings.gpencil_paint - brush = settings.brush - gp_settings = brush.gpencil_settings - - row = layout.row() - row.prop(settings, "color_mode", expand=True) - - layout.use_property_split = True - layout.use_property_decorate = False - col = layout.column() - col.enabled = settings.color_mode == 'VERTEXCOLOR' - - col.template_color_picker(brush, "color", value_slider=True) - - sub_row = col.row(align=True) - UnifiedPaintPanel.prop_unified_color(sub_row, context, brush, "color", text="") - UnifiedPaintPanel.prop_unified_color(sub_row, context, brush, "secondary_color", text="") - - sub_row.operator("paint.brush_colors_flip", icon='FILE_REFRESH', text="") - - if brush.gpencil_tool in {'DRAW', 'FILL'}: - col.prop(gp_settings, "vertex_mode", text="Mode") - col.prop(gp_settings, "vertex_color_factor", slider=True, text="Mix Factor") - - -class VIEW3D_PT_tools_grease_pencil_v3_brush_mix_palette(View3DPanel, Panel): - bl_context = ".grease_pencil_paint" - bl_label = "Palette" - bl_category = "Tool" - bl_parent_id = "VIEW3D_PT_tools_grease_pencil_v3_brush_mixcolor" - - @classmethod - def poll(cls, context): - ob = context.object - tool_settings = context.tool_settings - settings = tool_settings.gpencil_paint - brush = settings.brush - - if ob is None or brush is None: - return False - - from bl_ui.space_toolsystem_common import ToolSelectPanelHelper - tool = ToolSelectPanelHelper.tool_active_from_context(context) - if tool and tool.idname in {'builtin.cutter', 'builtin.eyedropper', 'builtin.interpolate'}: - return False - - if brush.gpencil_tool == 'TINT': - return True - - if brush.gpencil_tool not in {'DRAW', 'FILL'}: - return False - - return True - - def draw(self, context): - layout = self.layout - layout.use_property_split = True - layout.use_property_decorate = False - tool_settings = context.tool_settings - settings = tool_settings.gpencil_paint - - col = layout.column() - col.enabled = settings.color_mode == 'VERTEXCOLOR' - - row = col.row(align=True) - row.template_ID(settings, "palette", new="palette.new") - if settings.palette: - col.template_palette(settings, "palette", color=True) - - classes = ( VIEW3D_MT_brush_context_menu, VIEW3D_MT_brush_gpencil_context_menu, @@ -2750,11 +2581,6 @@ classes = ( VIEW3D_PT_tools_grease_pencil_brush_mixcolor, VIEW3D_PT_tools_grease_pencil_brush_mix_palette, - VIEW3D_PT_tools_grease_pencil_v3_brush_select, - VIEW3D_PT_tools_grease_pencil_v3_brush_settings, - VIEW3D_PT_tools_grease_pencil_v3_brush_mixcolor, - VIEW3D_PT_tools_grease_pencil_v3_brush_mix_palette, - VIEW3D_PT_tools_grease_pencil_brush_paint_falloff, VIEW3D_PT_tools_grease_pencil_brush_sculpt_falloff, VIEW3D_PT_tools_grease_pencil_brush_weight_falloff, diff --git a/scripts/templates_py/custom_nodes.py b/scripts/templates_py/custom_nodes.py index bf2886fd00f..f6fe0979ac1 100644 --- a/scripts/templates_py/custom_nodes.py +++ b/scripts/templates_py/custom_nodes.py @@ -99,7 +99,7 @@ class MyCustomNode(MyCustomTreeNode, Node): def init(self, context): self.inputs.new('CustomSocketType', "Hello") self.inputs.new('NodeSocketFloat', "World") - self.inputs.new('NodeSocketVector', "!", use_multi_input=True) + self.inputs.new('NodeSocketVector', "!") self.outputs.new('NodeSocketColor', "How") self.outputs.new('NodeSocketColor', "are") diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt index fa48d6be171..d86c28443d9 100644 --- a/source/CMakeLists.txt +++ b/source/CMakeLists.txt @@ -7,6 +7,14 @@ if(WITH_LEGACY_OPENGL) endif() if(WITH_CLANG_TIDY AND NOT MSVC) + if(NOT CMAKE_C_COMPILER_ID MATCHES "Clang") + message(WARNING "Currently Clang-Tidy might fail with GCC toolchain, switch to Clang toolchain if that happens") + if(COMMAND target_precompile_headers) + message(STATUS "Clang-Tidy and GCC precompiled headers are incompatible, disabling precompiled headers") + set(CMAKE_DISABLE_PRECOMPILE_HEADERS ON) + endif() + endif() + find_package(ClangTidy REQUIRED) set(CMAKE_C_CLANG_TIDY ${CLANG_TIDY_EXECUTABLE};--extra-arg=-Wno-error=unknown-warning-option) diff --git a/source/blender/animrig/ANIM_animation.hh b/source/blender/animrig/ANIM_animation.hh deleted file mode 100644 index 5c312f771e2..00000000000 --- a/source/blender/animrig/ANIM_animation.hh +++ /dev/null @@ -1,297 +0,0 @@ -/* SPDX-FileCopyrightText: 2024 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup animrig - * - * \brief Animation data-block functionality. - */ -#pragma once - -#include "ANIM_fcurve.hh" - -#include "DNA_anim_types.h" - -#include "BLI_math_vector.hh" -#include "BLI_set.hh" -#include "BLI_string_ref.hh" - -struct AnimationEvalContext; -struct FCurve; -struct ID; -struct Main; -struct PointerRNA; - -namespace blender::animrig { - -/* Forward declarations for the types defined later in this file. */ -class Layer; -class Strip; -class Binding; - -/* Use an alias for the Binding handle type to help disambiguate function parameters. */ -using binding_handle_t = decltype(::AnimationBinding::handle); - -/** - * Container of animation data for one or more animated IDs. - * - * Broadly an Animation consists of Layers, each Layer has Strips, and it's the - * Strips that eventually contain the animation data. - * - * Temporary limitation: each Animation can only contain one Layer. - * - * Which sub-set of that data drives the animation of which ID is determined by - * which Binding is associated with that ID. - * - * \see AnimData::animation - * \see AnimData::binding_handle - */ -class Animation : public ::Animation { - public: - Animation() = default; - /** - * Copy constructor is deleted, as code should use regular ID library - * management functions to duplicate this data-block. - */ - Animation(const Animation &other) = delete; - - /* Animation Layers access. */ - blender::Span layers() const; - blender::MutableSpan layers(); - const Layer *layer(int64_t index) const; - Layer *layer(int64_t index); - - /* Animation Binding access. */ - blender::Span bindings() const; - blender::MutableSpan bindings(); - const Binding *binding(int64_t index) const; - Binding *binding(int64_t index); - - /** Free all data in the `Animation`. Doesn't delete the `Animation` itself. */ - void free_data(); -}; -static_assert(sizeof(Animation) == sizeof(::Animation), - "DNA struct and its C++ wrapper must have the same size"); - -/** - * Strips contain the actual animation data. - * - * Although the data model allows for different strip types, currently only a - * single type is implemented: keyframe strips. - */ -class Strip : public ::AnimationStrip { - public: - Strip() = default; - /** - * Strip cannot be duplicated via the copy constructor. Either use a concrete - * strip type's copy constructor, or use Strip::duplicate(). - * - * The reason why the copy constructor won't work is due to the double nature - * of the inheritance at play here: - * - * C-style inheritance: `KeyframeAnimationStrip` "inherits" `AnimationStrip" - * by embedding the latter. This means that any `KeyframeAnimationStrip *` - * can be reinterpreted as `AnimationStrip *`. - * - * C++-style inheritance: the C++ wrappers inherit the DNA structs, so - * `animrig::Strip` inherits `::AnimationStrip`, and - * `animrig::KeyframeStrip` inherits `::KeyframeAnimationStrip`. - */ - Strip(const Strip &other) = delete; - ~Strip(); - - Strip *duplicate(StringRefNull allocation_name) const; - - enum class Type : int8_t { Keyframe = 0 }; - - /** - * Strip type, so it's known which subclass this can be wrapped in without - * having to rely on C++ RTTI. - */ - Type type() const - { - return Type(this->strip_type); - } - - template bool is() const; - template T &as(); - template const T &as() const; -}; -static_assert(sizeof(Strip) == sizeof(::AnimationStrip), - "DNA struct and its C++ wrapper must have the same size"); - -/** - * Layers can be stacked on top of each other to define the animation. Each - * layer has a mix mode and an influence (0-1), which define how it is mixed - * with the layers below it. - * - * Layers contain one or more Strips, which in turn contain the animation data - * itself. - * - * Temporary limitation: at most one strip may exist on a layer, and it extends - * from negative to positive infinity. - */ -class Layer : public ::AnimationLayer { - public: - Layer() = default; - Layer(const Layer &other); - ~Layer(); - - enum class Flags : uint8_t { - /* Set by default, cleared to mute. */ - Enabled = (1 << 0), - /* When adding/removing a flag, also update the ENUM_OPERATORS() invocation below. */ - }; - - Flags flags() const - { - return static_cast(this->layer_flags); - } - - enum class MixMode : int8_t { - /** Channels in this layer override the same channels from underlying layers. */ - Replace = 0, - /** Channels in this layer are added to underlying layers as sequential operations. */ - Offset = 1, - /** Channels in this layer are added to underlying layers on a per-channel basis. */ - Add = 2, - /** Channels in this layer are subtracted to underlying layers on a per-channel basis. */ - Subtract = 3, - /** Channels in this layer are multiplied with underlying layers on a per-channel basis. */ - Multiply = 4, - }; - - MixMode mix_mode() const - { - return static_cast(this->layer_mix_mode); - } - - /* Strip access. */ - blender::Span strips() const; - blender::MutableSpan strips(); - const Strip *strip(int64_t index) const; - Strip *strip(int64_t index); -}; -static_assert(sizeof(Layer) == sizeof(::AnimationLayer), - "DNA struct and its C++ wrapper must have the same size"); - -ENUM_OPERATORS(Layer::Flags, Layer::Flags::Enabled); - -/** - * Identifier for a sub-set of the animation data inside an Animation data-block. - * - * An animatable ID specifies both an `Animation*` and an `AnimationBinding::handle` - * to identify which F-Curves (and in the future other animation data) it will - * be animated by. - * - * This is called an 'binding' because it acts like an binding socket of the - * Animation data-block, into which an animatable ID can be noodled. - * - * \see AnimData::binding_handle - */ -class Binding : public ::AnimationBinding { - public: - Binding() = default; - Binding(const Binding &other) = default; - ~Binding() = default; -}; -static_assert(sizeof(Binding) == sizeof(::AnimationBinding), - "DNA struct and its C++ wrapper must have the same size"); - -/** - * KeyframeStrips effectively contain a bag of F-Curves for each Binding. - */ -class KeyframeStrip : public ::KeyframeAnimationStrip { - public: - KeyframeStrip() = default; - KeyframeStrip(const KeyframeStrip &other); - ~KeyframeStrip(); - - /* ChannelBag array access. */ - blender::Span channelbags() const; - blender::MutableSpan channelbags(); - const ChannelBag *channelbag(int64_t index) const; - ChannelBag *channelbag(int64_t index); -}; -static_assert(sizeof(KeyframeStrip) == sizeof(::KeyframeAnimationStrip), - "DNA struct and its C++ wrapper must have the same size"); - -template<> KeyframeStrip &Strip::as(); -template<> const KeyframeStrip &Strip::as() const; - -/** - * Collection of F-Curves, intended for a specific Binding handle. - */ -class ChannelBag : public ::AnimationChannelBag { - public: - ChannelBag() = default; - ChannelBag(const ChannelBag &other); - ~ChannelBag(); - - /* FCurves access. */ - blender::Span fcurves() const; - blender::MutableSpan fcurves(); - const FCurve *fcurve(int64_t index) const; - FCurve *fcurve(int64_t index); -}; -static_assert(sizeof(ChannelBag) == sizeof(::AnimationChannelBag), - "DNA struct and its C++ wrapper must have the same size"); - -} // namespace blender::animrig - -/* Wrap functions for the DNA structs. */ - -inline blender::animrig::Animation &Animation::wrap() -{ - return *reinterpret_cast(this); -} -inline const blender::animrig::Animation &Animation::wrap() const -{ - return *reinterpret_cast(this); -} - -inline blender::animrig::Layer &AnimationLayer::wrap() -{ - return *reinterpret_cast(this); -} -inline const blender::animrig::Layer &AnimationLayer::wrap() const -{ - return *reinterpret_cast(this); -} - -inline blender::animrig::Binding &AnimationBinding::wrap() -{ - return *reinterpret_cast(this); -} -inline const blender::animrig::Binding &AnimationBinding::wrap() const -{ - return *reinterpret_cast(this); -} - -inline blender::animrig::Strip &AnimationStrip::wrap() -{ - return *reinterpret_cast(this); -} -inline const blender::animrig::Strip &AnimationStrip::wrap() const -{ - return *reinterpret_cast(this); -} - -inline blender::animrig::KeyframeStrip &KeyframeAnimationStrip::wrap() -{ - return *reinterpret_cast(this); -} -inline const blender::animrig::KeyframeStrip &KeyframeAnimationStrip::wrap() const -{ - return *reinterpret_cast(this); -} - -inline blender::animrig::ChannelBag &AnimationChannelBag::wrap() -{ - return *reinterpret_cast(this); -} -inline const blender::animrig::ChannelBag &AnimationChannelBag::wrap() const -{ - return *reinterpret_cast(this); -} diff --git a/source/blender/animrig/ANIM_bone_collections.hh b/source/blender/animrig/ANIM_bone_collections.hh index e5d915c0198..6616d638c29 100644 --- a/source/blender/animrig/ANIM_bone_collections.hh +++ b/source/blender/animrig/ANIM_bone_collections.hh @@ -51,7 +51,7 @@ BoneCollection *ANIM_bonecoll_new(const char *name) ATTR_WARN_UNUSED_RESULT; * \see ANIM_armature_bonecoll_remove * * \param do_id_user_count whether to update user counts for IDs referenced from IDProperties of - * the bone collection. Needs to be false when freeing an evaluated copy, true otherwise. + * the bone collection. Needs to be false when freeing a CoW copy, true otherwise. */ void ANIM_bonecoll_free(BoneCollection *bcoll, bool do_id_user_count = true); diff --git a/source/blender/animrig/ANIM_keyframing.hh b/source/blender/animrig/ANIM_keyframing.hh index eeb5c4f9e76..f40706d8006 100644 --- a/source/blender/animrig/ANIM_keyframing.hh +++ b/source/blender/animrig/ANIM_keyframing.hh @@ -12,7 +12,7 @@ #include -#include "BLI_bit_span.hh" +#include "BLI_bitmap.h" #include "BLI_vector.hh" #include "DNA_anim_types.h" #include "ED_transform.hh" @@ -206,7 +206,7 @@ int insert_key_action(Main *bmain, Span values, eInsertKeyFlags insert_key_flag, eBezTriple_KeyframeType key_type, - BitSpan keying_mask); + const BLI_bitmap *keying_mask); /** * Insert keys to the ID of the given PointerRNA for the given RNA paths. Tries to create an diff --git a/source/blender/animrig/CMakeLists.txt b/source/blender/animrig/CMakeLists.txt index d8ed65d6176..feb8df8e8b7 100644 --- a/source/blender/animrig/CMakeLists.txt +++ b/source/blender/animrig/CMakeLists.txt @@ -11,7 +11,6 @@ set(INC ../editors/include ../makesrna ../windowmanager - ../../../extern/fmtlib/include # RNA_prototypes.h ${CMAKE_BINARY_DIR}/source/blender/makesrna ) @@ -22,7 +21,6 @@ set(INC_SYS set(SRC intern/action.cc intern/anim_rna.cc - intern/animation.cc intern/animdata.cc intern/bone_collections.cc intern/bonecolor.cc @@ -33,7 +31,6 @@ set(SRC intern/visualkey.cc ANIM_action.hh - ANIM_animation.hh ANIM_animdata.hh ANIM_armature_iter.hh ANIM_bone_collections.hh @@ -53,7 +50,6 @@ set(LIB bf::dna PRIVATE bf_editor_interface PRIVATE bf::intern::guardedalloc - PRIVATE bf::intern::atomic ) diff --git a/source/blender/animrig/intern/action.cc b/source/blender/animrig/intern/action.cc index 3768b0258e0..9e4de3c55aa 100644 --- a/source/blender/animrig/intern/action.cc +++ b/source/blender/animrig/intern/action.cc @@ -8,7 +8,7 @@ #include "ANIM_action.hh" #include "BKE_action.h" -#include "BKE_fcurve.hh" +#include "BKE_fcurve.h" #include "BLI_listbase.h" #include "BLI_string.h" #include "DEG_depsgraph_build.hh" diff --git a/source/blender/animrig/intern/animation.cc b/source/blender/animrig/intern/animation.cc deleted file mode 100644 index e026c0701db..00000000000 --- a/source/blender/animrig/intern/animation.cc +++ /dev/null @@ -1,260 +0,0 @@ -/* SPDX-FileCopyrightText: 2024 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -#include "DNA_anim_defaults.h" -#include "DNA_anim_types.h" -#include "DNA_defaults.h" - -#include "BLI_listbase.h" -#include "BLI_listbase_wrapper.hh" -#include "BLI_math_base.h" -#include "BLI_string.h" -#include "BLI_string_utf8.h" -#include "BLI_string_utils.hh" - -#include "BKE_anim_data.hh" -#include "BKE_animation.hh" -#include "BKE_fcurve.hh" -#include "BKE_lib_id.hh" -#include "BKE_main.hh" - -#include "ED_keyframing.hh" - -#include "MEM_guardedalloc.h" - -#include "atomic_ops.h" - -#include "ANIM_animation.hh" -#include "ANIM_fcurve.hh" - -#include -#include - -namespace blender::animrig { - -/* ----- Animation implementation ----------- */ - -blender::Span Animation::layers() const -{ - return blender::Span{reinterpret_cast(this->layer_array), - this->layer_array_num}; -} -blender::MutableSpan Animation::layers() -{ - return blender::MutableSpan{reinterpret_cast(this->layer_array), - this->layer_array_num}; -} -const Layer *Animation::layer(const int64_t index) const -{ - return &this->layer_array[index]->wrap(); -} -Layer *Animation::layer(const int64_t index) -{ - return &this->layer_array[index]->wrap(); -} - -blender::Span Animation::bindings() const -{ - return blender::Span{reinterpret_cast(this->binding_array), - this->binding_array_num}; -} -blender::MutableSpan Animation::bindings() -{ - return blender::MutableSpan{reinterpret_cast(this->binding_array), - this->binding_array_num}; -} -const Binding *Animation::binding(const int64_t index) const -{ - return &this->binding_array[index]->wrap(); -} -Binding *Animation::binding(const int64_t index) -{ - return &this->binding_array[index]->wrap(); -} - -void Animation::free_data() -{ - /* Free layers. */ - for (Layer *layer : this->layers()) { - MEM_delete(layer); - } - MEM_SAFE_FREE(this->layer_array); - this->layer_array_num = 0; - - /* Free bindings. */ - for (Binding *binding : this->bindings()) { - MEM_delete(binding); - } - MEM_SAFE_FREE(this->binding_array); - this->binding_array_num = 0; -} - -/* ----- AnimationLayer implementation ----------- */ - -Layer::Layer(const Layer &other) -{ - memcpy(this, &other, sizeof(*this)); - - /* Strips. */ - this->strip_array = MEM_cnew_array(other.strip_array_num, __func__); - for (int i : other.strips().index_range()) { - this->strip_array[i] = other.strip(i)->duplicate(__func__); - } -} - -Layer::~Layer() -{ - for (Strip *strip : this->strips()) { - MEM_delete(strip); - } - MEM_SAFE_FREE(this->strip_array); - this->strip_array_num = 0; -} - -blender::Span Layer::strips() const -{ - return blender::Span{reinterpret_cast(this->strip_array), - this->strip_array_num}; -} -blender::MutableSpan Layer::strips() -{ - return blender::MutableSpan{reinterpret_cast(this->strip_array), - this->strip_array_num}; -} -const Strip *Layer::strip(const int64_t index) const -{ - return &this->strip_array[index]->wrap(); -} -Strip *Layer::strip(const int64_t index) -{ - return &this->strip_array[index]->wrap(); -} - -/* ----- AnimationBinding implementation ----------- */ - -/* ----- AnimationStrip implementation ----------- */ - -Strip *Strip::duplicate(const StringRefNull allocation_name) const -{ - switch (this->type()) { - case Type::Keyframe: { - const KeyframeStrip &source = this->as(); - KeyframeStrip *copy = MEM_new(allocation_name.c_str(), source); - return ©->strip.wrap(); - } - } - BLI_assert_unreachable(); - return nullptr; -} - -Strip::~Strip() -{ - switch (this->type()) { - case Type::Keyframe: - this->as().~KeyframeStrip(); - return; - } - BLI_assert_unreachable(); -} - -/* ----- KeyframeAnimationStrip implementation ----------- */ - -KeyframeStrip::KeyframeStrip(const KeyframeStrip &other) -{ - memcpy(this, &other, sizeof(*this)); - - this->channelbags_array = MEM_cnew_array(other.channelbags_array_num, - __func__); - Span channelbags_src = other.channelbags(); - for (int i : channelbags_src.index_range()) { - this->channelbags_array[i] = MEM_new(__func__, *other.channelbag(i)); - } -} - -KeyframeStrip::~KeyframeStrip() -{ - for (ChannelBag *channelbag_for_binding : this->channelbags()) { - MEM_delete(channelbag_for_binding); - } - MEM_SAFE_FREE(this->channelbags_array); - this->channelbags_array_num = 0; -} - -template<> bool Strip::is() const -{ - return this->type() == Type::Keyframe; -} - -template<> KeyframeStrip &Strip::as() -{ - BLI_assert_msg(this->is(), "Strip is not a KeyframeStrip"); - return *reinterpret_cast(this); -} - -template<> const KeyframeStrip &Strip::as() const -{ - BLI_assert_msg(this->is(), "Strip is not a KeyframeStrip"); - return *reinterpret_cast(this); -} - -blender::Span KeyframeStrip::channelbags() const -{ - return blender::Span{reinterpret_cast(this->channelbags_array), - this->channelbags_array_num}; -} -blender::MutableSpan KeyframeStrip::channelbags() -{ - return blender::MutableSpan{ - reinterpret_cast(this->channelbags_array), this->channelbags_array_num}; -} -const ChannelBag *KeyframeStrip::channelbag(const int64_t index) const -{ - return &this->channelbags_array[index]->wrap(); -} -ChannelBag *KeyframeStrip::channelbag(const int64_t index) -{ - return &this->channelbags_array[index]->wrap(); -} - -/* AnimationChannelBag implementation. */ - -ChannelBag::ChannelBag(const ChannelBag &other) -{ - this->binding_handle = other.binding_handle; - this->fcurve_array_num = other.fcurve_array_num; - - this->fcurve_array = MEM_cnew_array(other.fcurve_array_num, __func__); - for (int i = 0; i < other.fcurve_array_num; i++) { - const FCurve *fcu_src = other.fcurve_array[i]; - this->fcurve_array[i] = BKE_fcurve_copy(fcu_src); - } -} - -ChannelBag::~ChannelBag() -{ - for (FCurve *fcu : this->fcurves()) { - BKE_fcurve_free(fcu); - } - MEM_SAFE_FREE(this->fcurve_array); - this->fcurve_array_num = 0; -} - -blender::Span ChannelBag::fcurves() const -{ - return blender::Span{this->fcurve_array, this->fcurve_array_num}; -} -blender::MutableSpan ChannelBag::fcurves() -{ - return blender::MutableSpan{this->fcurve_array, this->fcurve_array_num}; -} -const FCurve *ChannelBag::fcurve(const int64_t index) const -{ - return this->fcurve_array[index]; -} -FCurve *ChannelBag::fcurve(const int64_t index) -{ - return this->fcurve_array[index]; -} - -} // namespace blender::animrig diff --git a/source/blender/animrig/intern/animdata.cc b/source/blender/animrig/intern/animdata.cc index 3034f4f0e15..ef82e27cd75 100644 --- a/source/blender/animrig/intern/animdata.cc +++ b/source/blender/animrig/intern/animdata.cc @@ -9,8 +9,8 @@ #include "ANIM_animdata.hh" #include "BKE_action.h" -#include "BKE_anim_data.hh" -#include "BKE_fcurve.hh" +#include "BKE_anim_data.h" +#include "BKE_fcurve.h" #include "BKE_lib_id.hh" #include "BLI_listbase.h" diff --git a/source/blender/animrig/intern/bone_collections.cc b/source/blender/animrig/intern/bone_collections.cc index c75a3b1d021..dd044869ec3 100644 --- a/source/blender/animrig/intern/bone_collections.cc +++ b/source/blender/animrig/intern/bone_collections.cc @@ -6,17 +6,21 @@ * \ingroup animrig */ +#include "BLI_linklist.h" #include "BLI_listbase.h" #include "BLI_map.hh" +#include "BLI_math_color.h" #include "BLI_string.h" #include "BLI_string_utf8.h" #include "BLI_string_utils.hh" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_armature_types.h" +#include "BLI_math_bits.h" + #include "MEM_guardedalloc.h" #include "BKE_animsys.h" @@ -129,8 +133,6 @@ static void bonecoll_ensure_name_unique(bArmature *armature, BoneCollection *bco BoneCollection *bcoll; }; - /* Cannot capture armature & bcoll by reference in the lambda, as that would change its signature - * and no longer be compatible with BLI_uniquename_cb(). */ auto bonecoll_name_is_duplicate = [](void *arg, const char *name) -> bool { DupNameCheckData *data = static_cast(arg); for (BoneCollection *bcoll : data->arm->collections_span()) { @@ -436,7 +438,7 @@ void ANIM_armature_bonecoll_active_name_set(bArmature *armature, const char *nam ANIM_armature_bonecoll_active_set(armature, bcoll); } -void ANIM_armature_bonecoll_active_runtime_refresh(bArmature *armature) +void ANIM_armature_bonecoll_active_runtime_refresh(struct bArmature *armature) { const std::string_view active_name = armature->active_collection_name; if (active_name.empty()) { @@ -1058,8 +1060,8 @@ static bool bcoll_list_contains(const ListBase /*BoneCollectionRef*/ *collection return false; } -bool ANIM_armature_bonecoll_contains_active_bone(const bArmature *armature, - const BoneCollection *bcoll) +bool ANIM_armature_bonecoll_contains_active_bone(const struct bArmature *armature, + const struct BoneCollection *bcoll) { if (armature->edbo) { if (!armature->act_edbone) { diff --git a/source/blender/animrig/intern/bone_collections_test.cc b/source/blender/animrig/intern/bone_collections_test.cc index e44d5409d8a..80a79143601 100644 --- a/source/blender/animrig/intern/bone_collections_test.cc +++ b/source/blender/animrig/intern/bone_collections_test.cc @@ -4,7 +4,7 @@ #include "BLI_string.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_idtype.hh" #include "BKE_lib_id.hh" diff --git a/source/blender/animrig/intern/driver.cc b/source/blender/animrig/intern/driver.cc index 3d884e21ece..f317355e9c4 100644 --- a/source/blender/animrig/intern/driver.cc +++ b/source/blender/animrig/intern/driver.cc @@ -7,6 +7,7 @@ */ #include "ANIM_driver.hh" +#include "BKE_animsys.h" #include "BKE_fcurve_driver.h" #include "DNA_anim_types.h" #include "RNA_access.hh" diff --git a/source/blender/animrig/intern/fcurve.cc b/source/blender/animrig/intern/fcurve.cc index 6a57c1f9dd7..02792e1a929 100644 --- a/source/blender/animrig/intern/fcurve.cc +++ b/source/blender/animrig/intern/fcurve.cc @@ -11,7 +11,7 @@ #include "ANIM_animdata.hh" #include "ANIM_fcurve.hh" -#include "BKE_fcurve.hh" +#include "BKE_fcurve.h" #include "BLI_math_vector_types.hh" #include "DNA_anim_types.h" #include "MEM_guardedalloc.h" diff --git a/source/blender/animrig/intern/keyframing.cc b/source/blender/animrig/intern/keyframing.cc index 618d6f07515..064eaf64c97 100644 --- a/source/blender/animrig/intern/keyframing.cc +++ b/source/blender/animrig/intern/keyframing.cc @@ -10,8 +10,6 @@ #include #include -#include - #include "ANIM_action.hh" #include "ANIM_animdata.hh" #include "ANIM_fcurve.hh" @@ -20,21 +18,20 @@ #include "ANIM_visualkey.hh" #include "BKE_action.h" -#include "BKE_anim_data.hh" +#include "BKE_anim_data.h" #include "BKE_animsys.h" -#include "BKE_fcurve.hh" +#include "BKE_fcurve.h" #include "BKE_idtype.hh" #include "BKE_lib_id.hh" #include "BKE_nla.h" -#include "BKE_report.hh" +#include "BKE_report.h" #include "DNA_scene_types.h" -#include "BLI_bit_vector.hh" #include "BLI_dynstr.h" #include "BLI_math_base.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DEG_depsgraph.hh" #include "DEG_depsgraph_query.hh" @@ -44,49 +41,11 @@ #include "RNA_path.hh" #include "RNA_prototypes.h" +#include "WM_api.hh" #include "WM_types.hh" namespace blender::animrig { -enum class SingleKeyingResult { - SUCCESS = 0, - CANNOT_CREATE_FCURVE, - FCURVE_NOT_KEYFRAMEABLE, - NO_KEY_NEEDED, - /* Make sure to always keep this at the end of the enum. */ - _KEYING_RESULT_MAX, -}; - -class CombinedKeyingResult { - private: - /* The index to the array maps a `SingleKeyingResult` to the number of times this result has - * occurred. */ - std::array result_counter{0}; - - public: - void add(const SingleKeyingResult result) - { - result_counter[int(result)]++; - } - - int get_count(const SingleKeyingResult result) const - { - return result_counter[int(result)]; - } - - bool has_errors() const - { - /* For loop starts at 1 to skip the SUCCESS flag. Assumes that SUCCESS is 0 and the rest of the - * enum are sequential values. */ - for (int i = 1; i < result_counter.size(); i++) { - if (result_counter[i] > 0) { - return true; - } - } - return false; - } -}; - void update_autoflags_fcurve_direct(FCurve *fcu, PropertyRNA *prop) { /* Set additional flags for the F-Curve (i.e. only integer values). */ @@ -160,7 +119,7 @@ static void get_keyframe_values_create_reports(ReportList *reports, const int index, const int count, const bool force_all, - const BitSpan successful_remaps) + const BLI_bitmap *successful_remaps) { DynStr *ds_failed_indices = BLI_dynstr_new(); @@ -173,7 +132,7 @@ static void get_keyframe_values_create_reports(ReportList *reports, continue; } - if (successful_remaps[i]) { + if (BLI_BITMAP_TEST_BOOL(successful_remaps, i)) { /* `values[i]` successfully remapped. */ continue; } @@ -218,7 +177,7 @@ static Vector get_keyframe_values(ReportList *reports, eInsertKeyFlags flag, const AnimationEvalContext *anim_eval_context, bool *r_force_all, - blender::BitVector<> &r_successful_remaps) + BLI_bitmap **r_successful_remaps) { Vector values; @@ -233,7 +192,7 @@ static Vector get_keyframe_values(ReportList *reports, values = get_rna_values(&ptr, prop); } - r_successful_remaps.resize(values.size()); + *r_successful_remaps = BLI_BITMAP_NEW(values.size(), __func__); /* adjust the value for NLA factors */ BKE_animsys_nla_remap_keyframe_values(nla_context, @@ -243,14 +202,14 @@ static Vector get_keyframe_values(ReportList *reports, index, anim_eval_context, r_force_all, - r_successful_remaps); + *r_successful_remaps); get_keyframe_values_create_reports(reports, ptr, prop, index, values.size(), r_force_all ? *r_force_all : false, - r_successful_remaps); + *r_successful_remaps); return values; } @@ -350,11 +309,11 @@ static float nla_time_remap(const AnimationEvalContext *anim_eval_context, } /* Insert the specified keyframe value into a single F-Curve. */ -static SingleKeyingResult insert_keyframe_value( +static bool insert_keyframe_value( FCurve *fcu, float cfra, float curval, eBezTriple_KeyframeType keytype, eInsertKeyFlags flag) { if (!BKE_fcurve_is_keyframable(fcu)) { - return SingleKeyingResult::FCURVE_NOT_KEYFRAMEABLE; + return false; } /* Adjust coordinates for cycle aware insertion. */ @@ -370,19 +329,17 @@ static SingleKeyingResult insert_keyframe_value( if (flag & INSERTKEY_NEEDED) { if (!new_key_needed(fcu, cfra, curval)) { - return SingleKeyingResult::NO_KEY_NEEDED; + return false; } + if (insert_vert_fcurve(fcu, {cfra, curval}, settings, flag) < 0) { - return SingleKeyingResult::FCURVE_NOT_KEYFRAMEABLE; + return false; } - return SingleKeyingResult::SUCCESS; + + return true; } - if (insert_vert_fcurve(fcu, {cfra, curval}, settings, flag) < 0) { - return SingleKeyingResult::FCURVE_NOT_KEYFRAMEABLE; - } - - return SingleKeyingResult::SUCCESS; + return insert_vert_fcurve(fcu, {cfra, curval}, settings, flag) >= 0; } bool insert_keyframe_direct(ReportList *reports, @@ -429,24 +386,34 @@ bool insert_keyframe_direct(ReportList *reports, update_autoflags_fcurve_direct(fcu, prop); const int index = fcu->array_index; - BitVector<> successful_remaps; - Vector values = get_keyframe_values( - reports, ptr, prop, index, nla_context, flag, anim_eval_context, nullptr, successful_remaps); + BLI_bitmap *successful_remaps = nullptr; + Vector values = get_keyframe_values(reports, + ptr, + prop, + index, + nla_context, + flag, + anim_eval_context, + nullptr, + &successful_remaps); float current_value = 0.0f; if (index >= 0 && index < values.size()) { current_value = values[index]; } + const bool curval_valid = BLI_BITMAP_TEST_BOOL(successful_remaps, index); + MEM_freeN(successful_remaps); + /* This happens if NLA rejects this insertion. */ - if (!successful_remaps[index]) { + if (!curval_valid) { return false; } const float cfra = anim_eval_context->eval_time; - const SingleKeyingResult result = insert_keyframe_value(fcu, cfra, current_value, keytype, flag); + const bool success = insert_keyframe_value(fcu, cfra, current_value, keytype, flag); - if (result != SingleKeyingResult::SUCCESS) { + if (!success) { BKE_reportf(reports, RPT_ERROR, "Failed to insert keys on F-Curve with path '%s[%d]', ensure that it is not " @@ -454,21 +421,22 @@ bool insert_keyframe_direct(ReportList *reports, fcu->rna_path, fcu->array_index); } - return result == SingleKeyingResult::SUCCESS; + return success; } /** Find or create the FCurve based on the given path, and insert the specified value into it. */ -static SingleKeyingResult insert_keyframe_fcurve_value(Main *bmain, - PointerRNA *ptr, - PropertyRNA *prop, - bAction *act, - const char group[], - const char rna_path[], - int array_index, - const float fcurve_frame, - float curval, - eBezTriple_KeyframeType keytype, - eInsertKeyFlags flag) +static bool insert_keyframe_fcurve_value(Main *bmain, + ReportList *reports, + PointerRNA *ptr, + PropertyRNA *prop, + bAction *act, + const char group[], + const char rna_path[], + int array_index, + const float fcurve_frame, + float curval, + eBezTriple_KeyframeType keytype, + eInsertKeyFlags flag) { /* Make sure the F-Curve exists. * - if we're replacing keyframes only, DO NOT create new F-Curves if they do not exist yet @@ -481,7 +449,7 @@ static SingleKeyingResult insert_keyframe_fcurve_value(Main *bmain, /* We may not have a F-Curve when we're replacing only. */ if (!fcu) { - return SingleKeyingResult::CANNOT_CREATE_FCURVE; + return false; } const bool is_new_curve = (fcu->totvert == 0); @@ -496,51 +464,23 @@ static SingleKeyingResult insert_keyframe_fcurve_value(Main *bmain, /* Update F-Curve flags to ensure proper behavior for property type. */ update_autoflags_fcurve_direct(fcu, prop); - const SingleKeyingResult result = insert_keyframe_value( - fcu, fcurve_frame, curval, keytype, flag); + const bool success = insert_keyframe_value(fcu, fcurve_frame, curval, keytype, flag); + + if (!success && reports != nullptr) { + BKE_reportf(reports, + RPT_ERROR, + "Failed to insert keys on F-Curve with path '%s[%d]', ensure that it is not " + "locked or sampled, and try removing F-Modifiers", + fcu->rna_path, + fcu->array_index); + } /* If the curve is new, make it cyclic if appropriate. */ if (is_cyclic_action && is_new_curve) { make_new_fcurve_cyclic(fcu, {act->frame_start, act->frame_end}); } - return result; -} - -static void generate_keyframe_reports_from_result(ReportList *reports, - const CombinedKeyingResult &result) -{ - std::string error = "Inserting keyframes failed due to the following reasons:"; - - if (result.get_count(SingleKeyingResult::CANNOT_CREATE_FCURVE) > 0) { - const int error_count = result.get_count(SingleKeyingResult::CANNOT_CREATE_FCURVE); - error.append( - fmt::format("\n- Could not create {} F-Curve{}. This can happen when only inserting to " - "available F-Curves.", - error_count, - error_count > 1 ? "s" : "")); - } - - if (result.get_count(SingleKeyingResult::FCURVE_NOT_KEYFRAMEABLE) > 0) { - const int error_count = result.get_count(SingleKeyingResult::FCURVE_NOT_KEYFRAMEABLE); - if (error_count == 1) { - error.append("\n- One F-Curve is not keyframeable. It might be locked or sampled."); - } - else { - error.append(fmt::format( - "\n- {} F-Curves are not keyframeable. They might be locked or sampled.", error_count)); - } - } - - if (result.get_count(SingleKeyingResult::NO_KEY_NEEDED) > 0) { - const int error_count = result.get_count(SingleKeyingResult::NO_KEY_NEEDED); - error.append(fmt::format( - "\n- Due to the setting 'Only Insert Needed', {} keyframe{} not been inserted.", - error_count, - error_count > 1 ? "s have" : " has")); - } - - BKE_reportf(reports, RPT_ERROR, "%s", error.c_str()); + return success; } int insert_keyframe(Main *bmain, @@ -599,7 +539,7 @@ int insert_keyframe(Main *bmain, anim_eval_context, &id_ptr, adt, act, &nla_cache, &nla_context); bool force_all; - BitVector successful_remaps; + BLI_bitmap *successful_remaps = nullptr; Vector values = get_keyframe_values(reports, ptr, prop, @@ -608,9 +548,7 @@ int insert_keyframe(Main *bmain, flag, anim_eval_context, &force_all, - successful_remaps); - - CombinedKeyingResult combined_result; + &successful_remaps); /* Key the entire array. */ int key_count = 0; @@ -620,22 +558,23 @@ int insert_keyframe(Main *bmain, int exclude = -1; for (array_index = 0; array_index < values.size(); array_index++) { - if (!successful_remaps[array_index]) { + if (!BLI_BITMAP_TEST_BOOL(successful_remaps, array_index)) { continue; } - const SingleKeyingResult result = insert_keyframe_fcurve_value(bmain, - &ptr, - prop, - act, - group, - rna_path, - array_index, - nla_mapped_frame, - values[array_index], - keytype, - flag); - combined_result.add(result); - if (result == SingleKeyingResult::SUCCESS) { + + if (insert_keyframe_fcurve_value(bmain, + reports, + &ptr, + prop, + act, + group, + rna_path, + array_index, + nla_mapped_frame, + values[array_index], + keytype, + flag)) + { key_count++; exclude = array_index; break; @@ -646,26 +585,23 @@ int insert_keyframe(Main *bmain, flag &= ~(INSERTKEY_REPLACE | INSERTKEY_AVAILABLE); for (array_index = 0; array_index < values.size(); array_index++) { - if (!successful_remaps[array_index]) { + if (!BLI_BITMAP_TEST_BOOL(successful_remaps, array_index)) { continue; } if (array_index != exclude) { - const SingleKeyingResult result = insert_keyframe_fcurve_value(bmain, - &ptr, - prop, - act, - group, - rna_path, - array_index, - nla_mapped_frame, - values[array_index], - keytype, - flag); - combined_result.add(result); - if (result == SingleKeyingResult::SUCCESS) { - key_count++; - } + key_count += insert_keyframe_fcurve_value(bmain, + reports, + &ptr, + prop, + act, + group, + rna_path, + array_index, + nla_mapped_frame, + values[array_index], + keytype, + flag); } } } @@ -673,49 +609,46 @@ int insert_keyframe(Main *bmain, /* Simply insert all channels. */ else { for (array_index = 0; array_index < values.size(); array_index++) { - if (!successful_remaps[array_index]) { + if (!BLI_BITMAP_TEST_BOOL(successful_remaps, array_index)) { continue; } - const SingleKeyingResult result = insert_keyframe_fcurve_value(bmain, - &ptr, - prop, - act, - group, - rna_path, - array_index, - nla_mapped_frame, - values[array_index], - keytype, - flag); - combined_result.add(result); - if (result == SingleKeyingResult::SUCCESS) { - key_count++; - } + key_count += insert_keyframe_fcurve_value(bmain, + reports, + &ptr, + prop, + act, + group, + rna_path, + array_index, + nla_mapped_frame, + values[array_index], + keytype, + flag); } } } /* Key a single index. */ else { - if (array_index >= 0 && array_index < values.size() && successful_remaps[array_index]) { - const SingleKeyingResult result = insert_keyframe_fcurve_value(bmain, - &ptr, - prop, - act, - group, - rna_path, - array_index, - nla_mapped_frame, - values[array_index], - keytype, - flag); - combined_result.add(result); - if (result == SingleKeyingResult::SUCCESS) { - key_count++; - } + if (array_index >= 0 && array_index < values.size() && + BLI_BITMAP_TEST_BOOL(successful_remaps, array_index)) + { + key_count += insert_keyframe_fcurve_value(bmain, + reports, + &ptr, + prop, + act, + group, + rna_path, + array_index, + nla_mapped_frame, + values[array_index], + keytype, + flag); } } + MEM_freeN(successful_remaps); BKE_animsys_free_nla_keyframing_context_cache(&nla_cache); if (key_count > 0) { @@ -727,10 +660,6 @@ int insert_keyframe(Main *bmain, } } - if (key_count == 0) { - generate_keyframe_reports_from_result(reports, combined_result); - } - return key_count; } @@ -935,7 +864,7 @@ int insert_key_action(Main *bmain, const Span values, eInsertKeyFlags insert_key_flag, eBezTriple_KeyframeType key_type, - const BitSpan keying_mask) + const BLI_bitmap *keying_mask) { BLI_assert(bmain != nullptr); BLI_assert(action != nullptr); @@ -952,22 +881,23 @@ int insert_key_action(Main *bmain, int property_array_index = 0; int inserted_keys = 0; for (float value : values) { - if (!keying_mask[property_array_index]) { + if (!BLI_BITMAP_TEST_BOOL(keying_mask, property_array_index)) { property_array_index++; continue; } - const SingleKeyingResult inserted_key = insert_keyframe_fcurve_value(bmain, - ptr, - prop, - action, - group.c_str(), - rna_path.c_str(), - property_array_index, - frame, - value, - key_type, - insert_key_flag); - if (inserted_key == SingleKeyingResult::SUCCESS) { + const bool inserted_key = insert_keyframe_fcurve_value(bmain, + nullptr, + ptr, + prop, + action, + group.c_str(), + rna_path.c_str(), + property_array_index, + frame, + value, + key_type, + insert_key_flag); + if (inserted_key) { inserted_keys++; } property_array_index++; @@ -1046,7 +976,7 @@ void insert_key_rna(PointerRNA *rna_pointer, prop); Vector rna_values = get_keyframe_values(&ptr, prop, visual_keyframing); - BitVector<> successful_remaps(rna_values.size(), false); + BLI_bitmap *successful_remaps = BLI_BITMAP_NEW(rna_values.size(), __func__); BKE_animsys_nla_remap_keyframe_values(nla_context, rna_pointer, prop, @@ -1066,8 +996,8 @@ void insert_key_rna(PointerRNA *rna_pointer, insert_key_flags, key_type, successful_remaps); + MEM_freeN(successful_remaps); } - BKE_animsys_free_nla_keyframing_context_cache(&nla_cache); if (insert_key_count == 0) { BKE_reportf(reports, RPT_ERROR, "Failed to insert any keys"); diff --git a/source/blender/animrig/intern/keyframing_auto.cc b/source/blender/animrig/intern/keyframing_auto.cc index f92ac73e8b3..8c8a0a6ae6e 100644 --- a/source/blender/animrig/intern/keyframing_auto.cc +++ b/source/blender/animrig/intern/keyframing_auto.cc @@ -8,8 +8,10 @@ #include "BKE_animsys.h" #include "BKE_context.hh" -#include "BKE_fcurve.hh" -#include "BKE_scene.hh" +#include "BKE_fcurve.h" +#include "BKE_layer.hh" +#include "BKE_object.hh" +#include "BKE_scene.h" #include "BLI_listbase.h" #include "BLI_string.h" @@ -20,8 +22,11 @@ #include "RNA_prototypes.h" #include "ED_keyframing.hh" +#include "ED_scene.hh" +#include "ED_transform.hh" #include "ANIM_keyframing.hh" +#include "ANIM_rna.hh" #include "WM_api.hh" #include "WM_types.hh" diff --git a/source/blender/animrig/intern/visualkey.cc b/source/blender/animrig/intern/visualkey.cc index ff7595f6994..deeb9c0abc2 100644 --- a/source/blender/animrig/intern/visualkey.cc +++ b/source/blender/animrig/intern/visualkey.cc @@ -12,10 +12,12 @@ #include "ANIM_rna.hh" #include "ANIM_visualkey.hh" +#include "BKE_animsys.h" #include "BKE_armature.hh" #include "BLI_math_matrix.h" #include "BLI_math_rotation.h" +#include "BLI_math_vector.h" #include "DNA_constraint_types.h" #include "DNA_object_types.h" @@ -23,6 +25,7 @@ #include "RNA_access.hh" #include "RNA_prototypes.h" +#include "RNA_types.hh" namespace blender::animrig { @@ -211,11 +214,11 @@ Vector visualkey_get_values(PointerRNA *ptr, PropertyRNA *prop) Object *ob = static_cast(ptr->data); /* Loc code is specific... */ if (strstr(identifier, "location")) { - values.extend({ob->object_to_world().location(), 3}); + values.extend({ob->object_to_world[3], 3}); return values; } - copy_m4_m4(tmat, ob->object_to_world().ptr()); + copy_m4_m4(tmat, ob->object_to_world); rotmode = ob->rotmode; } else if (ptr->type == &RNA_PoseBone) { diff --git a/source/blender/asset_system/AS_asset_catalog.hh b/source/blender/asset_system/AS_asset_catalog.hh index ff162a85c01..2c8ccf82a21 100644 --- a/source/blender/asset_system/AS_asset_catalog.hh +++ b/source/blender/asset_system/AS_asset_catalog.hh @@ -8,14 +8,15 @@ #pragma once +#include #include -#include #include #include #include "BLI_function_ref.hh" #include "BLI_map.hh" #include "BLI_set.hh" +#include "BLI_string_ref.hh" #include "BLI_uuid.h" #include "BLI_vector.hh" @@ -40,17 +41,12 @@ using OwningAssetCatalogMap = Map>; * directory hierarchy). */ class AssetCatalogService { std::unique_ptr catalog_collection_; - - /** - * Cached catalog tree storage. Lazy-created by #AssetCatalogService::catalog_tree(). - */ std::unique_ptr catalog_tree_; - std::mutex catalog_tree_mutex_; + CatalogFilePath asset_library_root_; Vector> undo_snapshots_; Vector> redo_snapshots_; - const CatalogFilePath asset_library_root_; const bool is_read_only_ = false; public: @@ -59,8 +55,9 @@ class AssetCatalogService { struct read_only_tag {}; public: - explicit AssetCatalogService(const CatalogFilePath &asset_library_root = {}); + AssetCatalogService(); explicit AssetCatalogService(read_only_tag); + explicit AssetCatalogService(const CatalogFilePath &asset_library_root); /** * Set tag indicating that some catalog modifications are unsaved, which could @@ -87,13 +84,8 @@ class AssetCatalogService { /** * Duplicate the catalogs from \a other_service into this one. Does not rebuild the tree, this * needs to be done by the caller (call #rebuild_tree()!). - * - * \note If a catalog from \a other already exists in this collection (identified by catalog ID), - * it will be skipped and \a on_duplicate_items will be called. */ - void add_from_existing(const AssetCatalogService &other_service, - FunctionRef on_duplicate_items); + void add_from_existing(const AssetCatalogService &other_service); /** * Write the catalog definitions to disk. @@ -133,6 +125,15 @@ class AssetCatalogService { */ void reload_catalogs(); + /** + * Make sure the tree is updated to the latest collection of catalogs stored in this service. + * Does not depend on a CDF file being available so this can be called on a service that stores + * catalogs that are not stored in a CDF. + * Most API functions that modify catalog data will trigger this, unless otherwise specified (for + * batch operations). + */ + void rebuild_tree(); + /** Return catalog with the given ID. Return nullptr if not found. */ AssetCatalog *find_catalog(CatalogID catalog_id) const; @@ -177,10 +178,7 @@ class AssetCatalogService { */ void update_catalog_path(CatalogID catalog_id, const AssetCatalogPath &new_catalog_path); - /** - * May be called from multiple threads. - */ - const AssetCatalogTree &catalog_tree(); + AssetCatalogTree *get_catalog_tree(); /** Return true only if there are no catalogs known. */ bool is_empty() const; @@ -241,7 +239,7 @@ class AssetCatalogService { * Construct an in-memory catalog definition file (CDF) from the currently known catalogs. * This object can then be processed further before saving to disk. */ std::unique_ptr construct_cdf_in_memory( - const CatalogFilePath &file_path) const; + const CatalogFilePath &file_path); /** * Find a suitable path to write a CDF to. @@ -252,13 +250,7 @@ class AssetCatalogService { static CatalogFilePath find_suitable_cdf_path_for_writing( const CatalogFilePath &blend_file_path); - std::unique_ptr read_into_tree() const; - /** - * Ensure a #catalog_tree() will update the tree. Must be called whenever the contained user - * visible catalogs change. - * May be called from multiple threads. - */ - void invalidate_catalog_tree(); + std::unique_ptr read_into_tree(); /** * For every catalog, ensure that its parent path also has a known catalog. @@ -271,9 +263,117 @@ class AssetCatalogService { void tag_all_catalogs_as_unsaved_changes(); /* For access by subclasses, as those will not be marked as friend by #AssetCatalogCollection. */ - const AssetCatalogDefinitionFile *get_catalog_definition_file() const; - const OwningAssetCatalogMap &get_catalogs() const; - const OwningAssetCatalogMap &get_deleted_catalogs() const; + AssetCatalogDefinitionFile *get_catalog_definition_file(); + OwningAssetCatalogMap &get_catalogs(); + OwningAssetCatalogMap &get_deleted_catalogs(); +}; + +/** + * All catalogs that are owned by a single asset library, and managed by a single instance of + * #AssetCatalogService. The undo system for asset catalog edits contains historical copies of this + * struct. + */ +class AssetCatalogCollection { + protected: + /** All catalogs known, except the known-but-deleted ones. */ + OwningAssetCatalogMap catalogs_; + + /** Catalogs that have been deleted. They are kept around so that the load-merge-save of catalog + * definition files can actually delete them if they already existed on disk (instead of the + * merge operation resurrecting them). */ + OwningAssetCatalogMap deleted_catalogs_; + + /* For now only a single catalog definition file is supported. + * The aim is to support an arbitrary number of such files per asset library in the future. */ + std::unique_ptr catalog_definition_file_; + + /** Whether any of the catalogs have unsaved changes. */ + bool has_unsaved_changes_ = false; + + friend AssetCatalogService; + + public: + AssetCatalogCollection() = default; + AssetCatalogCollection(const AssetCatalogCollection &other) = delete; + AssetCatalogCollection(AssetCatalogCollection &&other) noexcept = default; + + std::unique_ptr deep_copy() const; + /** + * Copy the catalogs from \a other and append them to this collection. Copies no other data + * otherwise. + */ + void add_catalogs_from_existing(const AssetCatalogCollection &other); + + protected: + static OwningAssetCatalogMap copy_catalog_map(const OwningAssetCatalogMap &orig); +}; + +/** + * Keeps track of which catalogs are defined in a certain file on disk. + * Only contains non-owning pointers to the #AssetCatalog instances, so ensure the lifetime of this + * class is shorter than that of the #`AssetCatalog`s themselves. + */ +class AssetCatalogDefinitionFile { + protected: + /* Catalogs stored in this file. They are mapped by ID to make it possible to query whether a + * catalog is already known, without having to find the corresponding `AssetCatalog*`. */ + Map catalogs_; + + public: + /* For now this is the only version of the catalog definition files that is supported. + * Later versioning code may be added to handle older files. */ + const static int SUPPORTED_VERSION; + /* String that's matched in the catalog definition file to know that the line is the version + * declaration. It has to start with a space to ensure it won't match any hypothetical future + * field that starts with "VERSION". */ + const static std::string VERSION_MARKER; + const static std::string HEADER; + + CatalogFilePath file_path; + + public: + AssetCatalogDefinitionFile() = default; + + /** + * Write the catalog definitions to the same file they were read from. + * Return true when the file was written correctly, false when there was a problem. + */ + bool write_to_disk() const; + /** + * Write the catalog definitions to an arbitrary file path. + * + * Any existing file is backed up to "filename~". Any previously existing backup is overwritten. + * + * Return true when the file was written correctly, false when there was a problem. + */ + bool write_to_disk(const CatalogFilePath &dest_file_path) const; + + bool contains(CatalogID catalog_id) const; + /** Add a catalog, overwriting the one with the same catalog ID. */ + void add_overwrite(AssetCatalog *catalog); + /** Add a new catalog. Undefined behavior if a catalog with the same ID was already added. */ + void add_new(AssetCatalog *catalog); + + /** Remove the catalog from the collection of catalogs stored in this file. */ + void forget(CatalogID catalog_id); + + using AssetCatalogParsedFn = FunctionRef)>; + void parse_catalog_file(const CatalogFilePath &catalog_definition_file_path, + AssetCatalogParsedFn callback); + + std::unique_ptr copy_and_remap( + const OwningAssetCatalogMap &catalogs, const OwningAssetCatalogMap &deleted_catalogs) const; + + protected: + bool parse_version_line(StringRef line); + std::unique_ptr parse_catalog_line(StringRef line); + + /** + * Write the catalog definitions to the given file path. + * Return true when the file was written correctly, false when there was a problem. + */ + bool write_to_disk_unsafe(const CatalogFilePath &dest_file_path) const; + bool ensure_directory_exists(const CatalogFilePath directory_path) const; }; /** @@ -286,7 +386,7 @@ class AssetCatalogService { */ class AssetCatalog { public: - const CatalogID catalog_id; + CatalogID catalog_id; AssetCatalogPath path; /** * Simple, human-readable name for the asset catalog. This is stored on assets alongside the @@ -318,7 +418,7 @@ class AssetCatalog { } flags; public: - AssetCatalog() = delete; + AssetCatalog() = default; AssetCatalog(CatalogID catalog_id, const AssetCatalogPath &path, const std::string &simple_name); /** diff --git a/source/blender/asset_system/AS_asset_catalog_tree.hh b/source/blender/asset_system/AS_asset_catalog_tree.hh index c9b3effe518..928a0dfd2e3 100644 --- a/source/blender/asset_system/AS_asset_catalog_tree.hh +++ b/source/blender/asset_system/AS_asset_catalog_tree.hh @@ -16,8 +16,6 @@ #pragma once -#include - #include "AS_asset_catalog.hh" namespace blender::asset_system { @@ -30,7 +28,7 @@ class AssetCatalogTreeItem { /** Container for child items. Uses a #std::map to keep items ordered by their name (i.e. their * last catalog component). */ using ChildMap = std::map; - using ItemIterFn = FunctionRef; + using ItemIterFn = FunctionRef; private: /** Child tree items, ordered by their names. */ @@ -67,10 +65,10 @@ class AssetCatalogTreeItem { /** Iterate over children calling \a callback for each of them, but do not recurse into their * children. */ - void foreach_child(ItemIterFn callback) const; + void foreach_child(ItemIterFn callback); private: - static void foreach_item_recursive(const ChildMap &children_, ItemIterFn callback); + static void foreach_item_recursive(ChildMap &children_, ItemIterFn callback); }; class AssetCatalogTree { @@ -84,15 +82,15 @@ class AssetCatalogTree { /** Ensure an item representing \a path is in the tree, adding it if necessary. */ void insert_item(const AssetCatalog &catalog); - void foreach_item(ItemIterFn callback) const; + void foreach_item(ItemIterFn callback); /** Iterate over root items calling \a callback for each of them, but do not recurse into their * children. */ - void foreach_root_item(ItemIterFn callback) const; + void foreach_root_item(ItemIterFn callback); bool is_empty() const; - const AssetCatalogTreeItem *find_item(const AssetCatalogPath &path) const; - const AssetCatalogTreeItem *find_root_item(const AssetCatalogPath &path) const; + AssetCatalogTreeItem *find_item(const AssetCatalogPath &path); + AssetCatalogTreeItem *find_root_item(const AssetCatalogPath &path); }; } // namespace blender::asset_system diff --git a/source/blender/asset_system/AS_asset_library.hh b/source/blender/asset_system/AS_asset_library.hh index 7a53afc1e95..3ff6d01c9d0 100644 --- a/source/blender/asset_system/AS_asset_library.hh +++ b/source/blender/asset_system/AS_asset_library.hh @@ -10,7 +10,6 @@ #include #include -#include #include "AS_asset_catalog.hh" @@ -20,14 +19,11 @@ #include "BLI_string_ref.hh" #include "BLI_vector.hh" -#include "BKE_callbacks.hh" +#include "BKE_callbacks.h" +struct IDRemapper; struct Main; -namespace blender::bke::id { -class IDRemapper; -} - namespace blender::asset_system { class AssetIdentifier; @@ -70,12 +66,6 @@ class AssetLibrary { std::unique_ptr asset_storage_; protected: - /* Changing this pointer should be protected using #catalog_service_mutex_. Note that changes - * within the catalog service may still happen without the mutex being locked. They should be - * protected separately. */ - std::unique_ptr catalog_service_; - std::mutex catalog_service_mutex_; - std::optional import_method_; /** Assets owned by this library may be imported with a different method than set in * #import_method_ above, it's just a default. */ @@ -90,6 +80,8 @@ class AssetLibrary { * for managing the "Save Catalog Changes" in the quit-confirmation dialog box. */ static bool save_catalogs_when_file_is_saved; + std::unique_ptr catalog_service; + friend class AssetLibraryService; friend class AssetRepresentation; @@ -116,8 +108,6 @@ class AssetLibrary { void load_catalogs(); - AssetCatalogService &catalog_service() const; - /** * Create a representation of an asset to be considered part of this library. Once the * representation is not needed anymore, it must be freed using #remove_asset(), or there will be @@ -138,7 +128,7 @@ class AssetLibrary { * Remove an asset from the library that was added using #add_external_asset() or * #add_local_id_asset(). Can usually be expected to be constant time complexity (worst case may * differ). - * \note This is safe to call if \a asset is freed (dangling reference), will not perform any + * \note This is save to call if \a asset is freed (dangling reference), will not perform any * change then. * \return True on success, false if the asset couldn't be found inside the library (also the * case when the reference is dangling). @@ -150,7 +140,7 @@ class AssetLibrary { * mapped to null (typically when an ID gets removed), the asset is removed, because we don't * support such empty/null assets. */ - void remap_ids_and_remove_invalid(const blender::bke::id::IDRemapper &mappings); + void remap_ids_and_remove_invalid(const IDRemapper &mappings); /** * Update `catalog_simple_name` by looking up the asset's catalog by its ID. @@ -186,7 +176,6 @@ class AssetLibrary { Vector all_valid_asset_library_refs(); AssetLibraryReference all_library_reference(); -void all_library_reload_catalogs_if_dirty(); } // namespace blender::asset_system @@ -241,6 +230,11 @@ std::string AS_asset_library_find_suitable_root_path_from_path(blender::StringRe */ std::string AS_asset_library_find_suitable_root_path_from_main(const Main *bmain); +blender::asset_system::AssetCatalogService *AS_asset_library_get_catalog_service( + const blender::asset_system::AssetLibrary *library); +blender::asset_system::AssetCatalogTree *AS_asset_library_get_catalog_tree( + const blender::asset_system::AssetLibrary *library); + /** * Force clearing of all asset library data. After calling this, new asset libraries can be loaded * just as usual using #AS_asset_library_load(), no init or other setup is needed. @@ -259,14 +253,18 @@ void AS_asset_libraries_exit(); blender::asset_system::AssetLibrary *AS_asset_library_load(const char *name, const char *library_dirpath); +/** Look up the asset's catalog and copy its simple name into #asset_data. */ +void AS_asset_library_refresh_catalog_simplename( + blender::asset_system::AssetLibrary *asset_library, AssetMetaData *asset_data); + /** Return whether any loaded AssetLibrary has unsaved changes to its catalogs. */ -bool AS_asset_library_has_any_unsaved_catalogs(); +bool AS_asset_library_has_any_unsaved_catalogs(void); /** * An asset library can include local IDs (IDs in the current file). Their pointers need to be * remapped on change (or assets removed as IDs gets removed). */ -void AS_asset_library_remap_ids(const blender::bke::id::IDRemapper &mappings); +void AS_asset_library_remap_ids(const IDRemapper *mappings); /** * Attempt to resolve a full path to an asset based on the currently available (not necessary diff --git a/source/blender/asset_system/AS_asset_representation.hh b/source/blender/asset_system/AS_asset_representation.hh index e49fd742927..4ec03e31225 100644 --- a/source/blender/asset_system/AS_asset_representation.hh +++ b/source/blender/asset_system/AS_asset_representation.hh @@ -39,7 +39,7 @@ class AssetRepresentation { */ const bool is_local_id_ = false; /** Asset library that owns this asset representation. */ - const AssetLibrary &owner_asset_library_; + const AssetLibrary *owner_asset_library_; struct ExternalAsset { std::string name; @@ -67,12 +67,16 @@ class AssetRepresentation { AssetRepresentation(AssetIdentifier &&identifier, ID &id, const AssetLibrary &owner_asset_library); + AssetRepresentation(AssetRepresentation &&other); + /* Non-copyable type. */ + AssetRepresentation(const AssetRepresentation &other) = delete; ~AssetRepresentation(); - AssetRepresentation(const AssetRepresentation &) = delete; - AssetRepresentation(AssetRepresentation &&) = delete; - AssetRepresentation &operator=(AssetRepresentation &&) = delete; - AssetRepresentation &operator=(const AssetRepresentation &) = delete; + /* Non-move-assignable type. Move construction is fine, but treat the "identity" (e.g. local vs + * external asset) of an asset representation as immutable. */ + AssetRepresentation &operator=(AssetRepresentation &&other) = delete; + /* Non-copyable type. */ + AssetRepresentation &operator=(const AssetRepresentation &other) = delete; const AssetIdentifier &get_identifier() const; @@ -80,8 +84,10 @@ class AssetRepresentation { * Create a weak reference for this asset that can be written to files, but can break under a * number of conditions. * A weak reference can only be created if an asset representation is owned by an asset library. + * + * Must be freed using #BKE_asset_weak_reference_free(). */ - AssetWeakReference make_weak_reference() const; + AssetWeakReference *make_weak_reference() const; StringRefNull get_name() const; ID_Type get_id_type() const; diff --git a/source/blender/asset_system/CMakeLists.txt b/source/blender/asset_system/CMakeLists.txt index 9b711387ce9..b48cfff5e09 100644 --- a/source/blender/asset_system/CMakeLists.txt +++ b/source/blender/asset_system/CMakeLists.txt @@ -13,8 +13,6 @@ set(INC_SYS set(SRC intern/asset_catalog.cc - intern/asset_catalog_collection.cc - intern/asset_catalog_definition_file.cc intern/asset_catalog_path.cc intern/asset_catalog_tree.cc intern/asset_identifier.cc @@ -36,8 +34,6 @@ set(SRC AS_asset_library.hh AS_asset_representation.hh AS_essentials_library.hh - intern/asset_catalog_collection.hh - intern/asset_catalog_definition_file.hh intern/asset_library_all.hh intern/asset_library_essentials.hh intern/asset_library_from_preferences.hh diff --git a/source/blender/asset_system/intern/asset_catalog.cc b/source/blender/asset_system/intern/asset_catalog.cc index 6a9767dac0f..1ea12295414 100644 --- a/source/blender/asset_system/intern/asset_catalog.cc +++ b/source/blender/asset_system/intern/asset_catalog.cc @@ -6,16 +6,15 @@ * \ingroup asset_system */ +#include #include #include #include "AS_asset_catalog.hh" #include "AS_asset_catalog_tree.hh" #include "AS_asset_library.hh" -#include "asset_catalog_collection.hh" -#include "asset_catalog_definition_file.hh" -#include "BLI_fileops.h" +#include "BLI_fileops.hh" #include "BLI_path_util.h" /* For S_ISREG() and S_ISDIR() on Windows. */ @@ -33,9 +32,19 @@ namespace blender::asset_system { const CatalogFilePath AssetCatalogService::DEFAULT_CATALOG_FILENAME = "blender_assets.cats.txt"; -AssetCatalogService::AssetCatalogService(const CatalogFilePath &asset_library_root) +const int AssetCatalogDefinitionFile::SUPPORTED_VERSION = 1; +const std::string AssetCatalogDefinitionFile::VERSION_MARKER = "VERSION "; + +const std::string AssetCatalogDefinitionFile::HEADER = + "# This is an Asset Catalog Definition file for Blender.\n" + "#\n" + "# Empty lines and lines starting with `#` will be ignored.\n" + "# The first non-ignored line should be the version indicator.\n" + "# Other lines are of the format \"UUID:catalog/path/for/assets:simple catalog name\"\n"; + +AssetCatalogService::AssetCatalogService() : catalog_collection_(std::make_unique()), - asset_library_root_(asset_library_root) + catalog_tree_(std::make_unique()) { } @@ -44,6 +53,12 @@ AssetCatalogService::AssetCatalogService(read_only_tag) : AssetCatalogService() const_cast(is_read_only_) = true; } +AssetCatalogService::AssetCatalogService(const CatalogFilePath &asset_library_root) + : AssetCatalogService() +{ + asset_library_root_ = asset_library_root; +} + void AssetCatalogService::tag_has_unsaved_changes(AssetCatalog *edited_catalog) { BLI_assert(!is_read_only_); @@ -101,16 +116,16 @@ bool AssetCatalogService::is_empty() const return catalog_collection_->catalogs_.is_empty(); } -const OwningAssetCatalogMap &AssetCatalogService::get_catalogs() const +OwningAssetCatalogMap &AssetCatalogService::get_catalogs() { return catalog_collection_->catalogs_; } -const OwningAssetCatalogMap &AssetCatalogService::get_deleted_catalogs() const +OwningAssetCatalogMap &AssetCatalogService::get_deleted_catalogs() { return catalog_collection_->deleted_catalogs_; } -const AssetCatalogDefinitionFile *AssetCatalogService::get_catalog_definition_file() const +AssetCatalogDefinitionFile *AssetCatalogService::get_catalog_definition_file() { return catalog_collection_->catalog_definition_file_.get(); } @@ -159,7 +174,7 @@ AssetCatalogFilter AssetCatalogService::create_catalog_filter( Set known_catalog_ids; matching_catalog_ids.add(active_catalog_id); - const AssetCatalog *active_catalog = this->find_catalog(active_catalog_id); + const AssetCatalog *active_catalog = find_catalog(active_catalog_id); /* This cannot just iterate over tree items to get all the required data, because tree items only * represent single UUIDs. It could be used to get the main UUIDs of the children, though, and @@ -222,8 +237,8 @@ void AssetCatalogService::prune_catalogs_by_path(const AssetCatalogPath &path) this->delete_catalog_by_id_soft(cat_id); } - this->invalidate_catalog_tree(); - AssetLibraryService::get()->tag_all_library_catalogs_dirty(); + this->rebuild_tree(); + AssetLibraryService::get()->rebuild_all_library(); } void AssetCatalogService::prune_catalogs_by_id(const CatalogID catalog_id) @@ -257,9 +272,8 @@ void AssetCatalogService::update_catalog_path(const CatalogID catalog_id, * blend file, and update the catalog simple name stored there. */ } - this->create_missing_catalogs(); - this->invalidate_catalog_tree(); - AssetLibraryService::get()->tag_all_library_catalogs_dirty(); + this->rebuild_tree(); + AssetLibraryService::get()->rebuild_all_library(); } AssetCatalog *AssetCatalogService::create_catalog(const AssetCatalogPath &catalog_path) @@ -283,8 +297,10 @@ AssetCatalog *AssetCatalogService::create_catalog(const AssetCatalogPath &catalo catalog_collection_->catalog_definition_file_->add_new(catalog_ptr); } - this->invalidate_catalog_tree(); - AssetLibraryService::get()->tag_all_library_catalogs_dirty(); + BLI_assert_msg(catalog_tree_, "An Asset Catalog tree should always exist."); + catalog_tree_->insert_item(*catalog_ptr); + + AssetLibraryService::get()->rebuild_all_library(); return catalog_ptr; } @@ -301,7 +317,7 @@ static std::string asset_definition_default_file_path_from_dir(StringRef asset_l void AssetCatalogService::load_from_disk() { - this->load_from_disk(asset_library_root_); + load_from_disk(asset_library_root_); } void AssetCatalogService::load_from_disk(const CatalogFilePath &file_or_directory_path) @@ -314,10 +330,10 @@ void AssetCatalogService::load_from_disk(const CatalogFilePath &file_or_director } if (S_ISREG(status.st_mode)) { - this->load_single_file(file_or_directory_path); + load_single_file(file_or_directory_path); } else if (S_ISDIR(status.st_mode)) { - this->load_directory_recursive(file_or_directory_path); + load_directory_recursive(file_or_directory_path); } else { /* TODO(@sybren): throw an appropriate exception. */ @@ -325,16 +341,12 @@ void AssetCatalogService::load_from_disk(const CatalogFilePath &file_or_director /* TODO: Should there be a sanitize step? E.g. to remove catalogs with identical paths? */ - this->create_missing_catalogs(); - this->invalidate_catalog_tree(); + rebuild_tree(); } -void AssetCatalogService::add_from_existing( - const AssetCatalogService &other_service, - AssetCatalogCollection::OnDuplicateCatalogIdFn on_duplicate_items) +void AssetCatalogService::add_from_existing(const AssetCatalogService &other_service) { - catalog_collection_->add_catalogs_from_existing(*other_service.catalog_collection_, - on_duplicate_items); + catalog_collection_->add_catalogs_from_existing(*other_service.catalog_collection_); } void AssetCatalogService::load_directory_recursive(const CatalogFilePath &directory_path) @@ -367,7 +379,8 @@ void AssetCatalogService::load_single_file(const CatalogFilePath &catalog_defini std::unique_ptr AssetCatalogService::parse_catalog_file( const CatalogFilePath &catalog_definition_file_path) { - auto cdf = std::make_unique(catalog_definition_file_path); + auto cdf = std::make_unique(); + cdf->file_path = catalog_definition_file_path; /* TODO(Sybren): this might have to move to a higher level when supporting multiple CDFs. */ Set seen_paths; @@ -410,7 +423,7 @@ void AssetCatalogService::reload_catalogs() const CatalogID catalog_id = catalog->catalog_id; cats_in_file.add(catalog_id); - const bool should_skip = this->is_catalog_known_with_unsaved_changes(catalog_id); + const bool should_skip = is_catalog_known_with_unsaved_changes(catalog_id); if (should_skip) { /* Do not overwrite unsaved local changes. */ return false; @@ -424,8 +437,7 @@ void AssetCatalogService::reload_catalogs() cdf->parse_catalog_file(cdf->file_path, catalog_parsed_callback); this->purge_catalogs_not_listed(cats_in_file); - this->create_missing_catalogs(); - this->invalidate_catalog_tree(); + this->rebuild_tree(); } void AssetCatalogService::purge_catalogs_not_listed(const Set &catalogs_to_keep) @@ -435,7 +447,7 @@ void AssetCatalogService::purge_catalogs_not_listed(const Set &catalo if (catalogs_to_keep.contains(cat_id)) { continue; } - if (this->is_catalog_known_with_unsaved_changes(cat_id)) { + if (is_catalog_known_with_unsaved_changes(cat_id)) { continue; } /* This catalog is not on disk, but also not modified, so get rid of it. */ @@ -443,7 +455,7 @@ void AssetCatalogService::purge_catalogs_not_listed(const Set &catalo } for (CatalogID cat_id : cats_to_remove) { - this->delete_catalog_by_id_hard(cat_id); + delete_catalog_by_id_hard(cat_id); } } @@ -469,12 +481,12 @@ bool AssetCatalogService::write_to_disk(const CatalogFilePath &blend_file_path) { BLI_assert(!is_read_only_); - if (!this->write_to_disk_ex(blend_file_path)) { + if (!write_to_disk_ex(blend_file_path)) { return false; } - this->untag_has_unsaved_changes(); - this->invalidate_catalog_tree(); + untag_has_unsaved_changes(); + rebuild_tree(); return true; } @@ -484,7 +496,7 @@ bool AssetCatalogService::write_to_disk_ex(const CatalogFilePath &blend_file_pat /* - Already loaded a CDF from disk? -> Always write to that file. */ if (catalog_collection_->catalog_definition_file_) { - this->reload_catalogs(); + reload_catalogs(); return catalog_collection_->catalog_definition_file_->write_to_disk(); } @@ -495,10 +507,9 @@ bool AssetCatalogService::write_to_disk_ex(const CatalogFilePath &blend_file_pat return true; /* Writing nothing when there is nothing to write is still a success. */ } - const CatalogFilePath cdf_path_to_write = this->find_suitable_cdf_path_for_writing( - blend_file_path); - catalog_collection_->catalog_definition_file_ = this->construct_cdf_in_memory(cdf_path_to_write); - this->reload_catalogs(); + const CatalogFilePath cdf_path_to_write = find_suitable_cdf_path_for_writing(blend_file_path); + catalog_collection_->catalog_definition_file_ = construct_cdf_in_memory(cdf_path_to_write); + reload_catalogs(); return catalog_collection_->catalog_definition_file_->write_to_disk(); } @@ -517,7 +528,7 @@ void AssetCatalogService::prepare_to_merge_on_write() /* Mark all in-memory catalogs as "dirty", to force them to be kept around on * the next "load-merge-write" cycle. */ - this->tag_all_catalogs_as_unsaved_changes(); + tag_all_catalogs_as_unsaved_changes(); } CatalogFilePath AssetCatalogService::find_suitable_cdf_path_for_writing( @@ -548,9 +559,10 @@ CatalogFilePath AssetCatalogService::find_suitable_cdf_path_for_writing( } std::unique_ptr AssetCatalogService::construct_cdf_in_memory( - const CatalogFilePath &file_path) const + const CatalogFilePath &file_path) { - auto cdf = std::make_unique(file_path); + auto cdf = std::make_unique(); + cdf->file_path = file_path; for (auto &catalog : catalog_collection_->catalogs_.values()) { cdf->add_new(catalog.get()); @@ -559,7 +571,12 @@ std::unique_ptr AssetCatalogService::construct_cdf_i return cdf; } -std::unique_ptr AssetCatalogService::read_into_tree() const +AssetCatalogTree *AssetCatalogService::get_catalog_tree() +{ + return catalog_tree_.get(); +} + +std::unique_ptr AssetCatalogService::read_into_tree() { auto tree = std::make_unique(); @@ -571,23 +588,10 @@ std::unique_ptr AssetCatalogService::read_into_tree() const return tree; } -void AssetCatalogService::invalidate_catalog_tree() +void AssetCatalogService::rebuild_tree() { - std::lock_guard lock{catalog_tree_mutex_}; - this->catalog_tree_ = nullptr; -} - -const AssetCatalogTree &AssetCatalogService::catalog_tree() -{ - std::lock_guard lock{catalog_tree_mutex_}; - if (!catalog_tree_) { - /* Ensure all catalog paths lead to valid catalogs. This is important for the catalog tree to - * be usable, e.g. it makes sure every item in the tree maps to an actual catalog. */ - this->create_missing_catalogs(); - - catalog_tree_ = read_into_tree(); - } - return *catalog_tree_; + create_missing_catalogs(); + this->catalog_tree_ = read_into_tree(); } void AssetCatalogService::create_missing_catalogs() @@ -621,7 +625,7 @@ void AssetCatalogService::create_missing_catalogs() } /* The parent doesn't exist, so create it and queue it up for checking its parent. */ - AssetCatalog *parent_catalog = this->create_catalog(parent_path); + AssetCatalog *parent_catalog = create_catalog(parent_path); parent_catalog->flags.has_unsaved_changes = true; paths_to_check.insert(parent_path); @@ -646,9 +650,8 @@ void AssetCatalogService::undo() redo_snapshots_.append(std::move(catalog_collection_)); catalog_collection_ = undo_snapshots_.pop_last(); - this->create_missing_catalogs(); - this->invalidate_catalog_tree(); - AssetLibraryService::get()->tag_all_library_catalogs_dirty(); + rebuild_tree(); + AssetLibraryService::get()->rebuild_all_library(); } void AssetCatalogService::redo() @@ -658,9 +661,8 @@ void AssetCatalogService::redo() undo_snapshots_.append(std::move(catalog_collection_)); catalog_collection_ = redo_snapshots_.pop_last(); - this->create_missing_catalogs(); - this->invalidate_catalog_tree(); - AssetLibraryService::get()->tag_all_library_catalogs_dirty(); + rebuild_tree(); + AssetLibraryService::get()->rebuild_all_library(); } void AssetCatalogService::undo_push() @@ -673,6 +675,297 @@ void AssetCatalogService::undo_push() /* ---------------------------------------------------------------------- */ +std::unique_ptr AssetCatalogCollection::deep_copy() const +{ + auto copy = std::make_unique(); + + copy->has_unsaved_changes_ = this->has_unsaved_changes_; + copy->catalogs_ = copy_catalog_map(this->catalogs_); + copy->deleted_catalogs_ = copy_catalog_map(this->deleted_catalogs_); + + if (catalog_definition_file_) { + copy->catalog_definition_file_ = catalog_definition_file_->copy_and_remap( + copy->catalogs_, copy->deleted_catalogs_); + } + + return copy; +} + +static void copy_catalog_map_into_existing(const OwningAssetCatalogMap &source, + OwningAssetCatalogMap &dest) +{ + for (const auto &orig_catalog_uptr : source.values()) { + auto copy_catalog_uptr = std::make_unique(*orig_catalog_uptr); + dest.add_new(copy_catalog_uptr->catalog_id, std::move(copy_catalog_uptr)); + } +} + +void AssetCatalogCollection::add_catalogs_from_existing(const AssetCatalogCollection &other) +{ + copy_catalog_map_into_existing(other.catalogs_, catalogs_); +} + +OwningAssetCatalogMap AssetCatalogCollection::copy_catalog_map(const OwningAssetCatalogMap &orig) +{ + OwningAssetCatalogMap copy; + copy_catalog_map_into_existing(orig, copy); + return copy; +} + +/* ---------------------------------------------------------------------- */ + +bool AssetCatalogDefinitionFile::contains(const CatalogID catalog_id) const +{ + return catalogs_.contains(catalog_id); +} + +void AssetCatalogDefinitionFile::add_new(AssetCatalog *catalog) +{ + catalogs_.add_new(catalog->catalog_id, catalog); +} + +void AssetCatalogDefinitionFile::add_overwrite(AssetCatalog *catalog) +{ + catalogs_.add_overwrite(catalog->catalog_id, catalog); +} + +void AssetCatalogDefinitionFile::forget(CatalogID catalog_id) +{ + catalogs_.remove(catalog_id); +} + +void AssetCatalogDefinitionFile::parse_catalog_file( + const CatalogFilePath &catalog_definition_file_path, + AssetCatalogParsedFn catalog_loaded_callback) +{ + fstream infile(catalog_definition_file_path, std::ios::in); + + if (!infile.is_open()) { + CLOG_ERROR(&LOG, "%s: unable to open file", catalog_definition_file_path.c_str()); + return; + } + bool seen_version_number = false; + std::string line; + while (std::getline(infile, line)) { + const StringRef trimmed_line = StringRef(line).trim(); + if (trimmed_line.is_empty() || trimmed_line[0] == '#') { + continue; + } + + if (!seen_version_number) { + /* The very first non-ignored line should be the version declaration. */ + const bool is_valid_version = this->parse_version_line(trimmed_line); + if (!is_valid_version) { + std::cerr << catalog_definition_file_path + << ": first line should be version declaration; ignoring file." << std::endl; + break; + } + seen_version_number = true; + continue; + } + + std::unique_ptr catalog = this->parse_catalog_line(trimmed_line); + if (!catalog) { + continue; + } + + AssetCatalog *non_owning_ptr = catalog.get(); + const bool keep_catalog = catalog_loaded_callback(std::move(catalog)); + if (!keep_catalog) { + continue; + } + + /* The AssetDefinitionFile should include this catalog when writing it back to disk. */ + this->add_overwrite(non_owning_ptr); + } +} + +bool AssetCatalogDefinitionFile::parse_version_line(const StringRef line) +{ + if (!line.startswith(VERSION_MARKER)) { + return false; + } + + const std::string version_string = line.substr(VERSION_MARKER.length()); + const int file_version = std::atoi(version_string.c_str()); + + /* No versioning, just a blunt check whether it's the right one. */ + return file_version == SUPPORTED_VERSION; +} + +std::unique_ptr AssetCatalogDefinitionFile::parse_catalog_line(const StringRef line) +{ + const char delim = ':'; + const int64_t first_delim = line.find_first_of(delim); + if (first_delim == StringRef::not_found) { + std::cerr << "Invalid catalog line in " << this->file_path << ": " << line << std::endl; + return std::unique_ptr(nullptr); + } + + /* Parse the catalog ID. */ + const std::string id_as_string = line.substr(0, first_delim).trim(); + bUUID catalog_id; + const bool uuid_parsed_ok = BLI_uuid_parse_string(&catalog_id, id_as_string.c_str()); + if (!uuid_parsed_ok) { + std::cerr << "Invalid UUID in " << this->file_path << ": " << line << std::endl; + return std::unique_ptr(nullptr); + } + + /* Parse the path and simple name. */ + const StringRef path_and_simple_name = line.substr(first_delim + 1); + const int64_t second_delim = path_and_simple_name.find_first_of(delim); + + std::string path_in_file; + std::string simple_name; + if (second_delim == 0) { + /* Delimiter as first character means there is no path. These lines are to be ignored. */ + return std::unique_ptr(nullptr); + } + + if (second_delim == StringRef::not_found) { + /* No delimiter means no simple name, just treat it as all "path". */ + path_in_file = path_and_simple_name; + simple_name = ""; + } + else { + path_in_file = path_and_simple_name.substr(0, second_delim); + simple_name = path_and_simple_name.substr(second_delim + 1).trim(); + } + + AssetCatalogPath catalog_path = path_in_file; + return std::make_unique(catalog_id, catalog_path.cleanup(), simple_name); +} + +bool AssetCatalogDefinitionFile::write_to_disk() const +{ + BLI_assert_msg(!this->file_path.empty(), "Writing to CDF requires its file path to be known"); + return this->write_to_disk(this->file_path); +} + +bool AssetCatalogDefinitionFile::write_to_disk(const CatalogFilePath &dest_file_path) const +{ + const CatalogFilePath writable_path = dest_file_path + ".writing"; + const CatalogFilePath backup_path = dest_file_path + "~"; + + if (!this->write_to_disk_unsafe(writable_path)) { + /* TODO: communicate what went wrong. */ + return false; + } + if (BLI_exists(dest_file_path.c_str())) { + if (BLI_rename_overwrite(dest_file_path.c_str(), backup_path.c_str())) { + /* TODO: communicate what went wrong. */ + return false; + } + } + if (BLI_rename_overwrite(writable_path.c_str(), dest_file_path.c_str())) { + /* TODO: communicate what went wrong. */ + return false; + } + + return true; +} + +bool AssetCatalogDefinitionFile::write_to_disk_unsafe(const CatalogFilePath &dest_file_path) const +{ + char directory[PATH_MAX]; + BLI_path_split_dir_part(dest_file_path.c_str(), directory, sizeof(directory)); + if (!ensure_directory_exists(directory)) { + /* TODO(Sybren): pass errors to the UI somehow. */ + return false; + } + + fstream output(dest_file_path, std::ios::out); + + /* TODO(@sybren): remember the line ending style that was originally read, then use that to write + * the file again. */ + + /* Write the header. */ + output << HEADER; + output << "" << std::endl; + output << VERSION_MARKER << SUPPORTED_VERSION << std::endl; + output << "" << std::endl; + + /* Write the catalogs, ordered by path (primary) and UUID (secondary). */ + AssetCatalogOrderedSet catalogs_by_path; + for (const AssetCatalog *catalog : catalogs_.values()) { + if (catalog->flags.is_deleted) { + continue; + } + catalogs_by_path.insert(catalog); + } + + for (const AssetCatalog *catalog : catalogs_by_path) { + output << catalog->catalog_id << ":" << catalog->path << ":" << catalog->simple_name + << std::endl; + } + output.close(); + return !output.bad(); +} + +bool AssetCatalogDefinitionFile::ensure_directory_exists( + const CatalogFilePath directory_path) const +{ + /* TODO(@sybren): design a way to get such errors presented to users (or ensure that they never + * occur). */ + if (directory_path.empty()) { + std::cerr + << "AssetCatalogService: no asset library root configured, unable to ensure it exists." + << std::endl; + return false; + } + + if (BLI_exists(directory_path.data())) { + if (!BLI_is_dir(directory_path.data())) { + std::cerr << "AssetCatalogService: " << directory_path + << " exists but is not a directory, this is not a supported situation." + << std::endl; + return false; + } + + /* Root directory exists, work is done. */ + return true; + } + + /* Ensure the root directory exists. */ + std::error_code err_code; + if (!BLI_dir_create_recursive(directory_path.data())) { + std::cerr << "AssetCatalogService: error creating directory " << directory_path << ": " + << err_code << std::endl; + return false; + } + + /* Root directory has been created, work is done. */ + return true; +} + +std::unique_ptr AssetCatalogDefinitionFile::copy_and_remap( + const OwningAssetCatalogMap &catalogs, const OwningAssetCatalogMap &deleted_catalogs) const +{ + auto copy = std::make_unique(*this); + copy->catalogs_.clear(); + + /* Remap pointers of the copy from the original AssetCatalogCollection to the given one. */ + for (CatalogID catalog_id : catalogs_.keys()) { + /* The catalog can be in the regular or the deleted map. */ + const std::unique_ptr *remapped_catalog_uptr_ptr = catalogs.lookup_ptr( + catalog_id); + if (remapped_catalog_uptr_ptr) { + copy->catalogs_.add_new(catalog_id, remapped_catalog_uptr_ptr->get()); + continue; + } + + remapped_catalog_uptr_ptr = deleted_catalogs.lookup_ptr(catalog_id); + if (remapped_catalog_uptr_ptr) { + copy->catalogs_.add_new(catalog_id, remapped_catalog_uptr_ptr->get()); + continue; + } + + BLI_assert(!"A CDF should only reference known catalogs."); + } + + return copy; +} + AssetCatalog::AssetCatalog(const CatalogID catalog_id, const AssetCatalogPath &path, const std::string &simple_name) @@ -707,8 +1000,6 @@ std::string AssetCatalog::sensible_simple_name_for_path(const AssetCatalogPath & return "..." + name.substr(name.length() - 60); } -/* ---------------------------------------------------------------------- */ - AssetCatalogFilter::AssetCatalogFilter(Set &&matching_catalog_ids, Set &&known_catalog_ids) : matching_catalog_ids_(std::move(matching_catalog_ids)), diff --git a/source/blender/asset_system/intern/asset_catalog_collection.cc b/source/blender/asset_system/intern/asset_catalog_collection.cc deleted file mode 100644 index d3b4922c25f..00000000000 --- a/source/blender/asset_system/intern/asset_catalog_collection.cc +++ /dev/null @@ -1,68 +0,0 @@ -/* SPDX-FileCopyrightText: 2023 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup asset_system - */ - -#include "asset_catalog_definition_file.hh" - -#include "asset_catalog_collection.hh" - -namespace blender::asset_system { - -std::unique_ptr AssetCatalogCollection::deep_copy() const -{ - auto copy = std::make_unique(); - - copy->has_unsaved_changes_ = this->has_unsaved_changes_; - copy->catalogs_ = this->copy_catalog_map(this->catalogs_); - copy->deleted_catalogs_ = this->copy_catalog_map(this->deleted_catalogs_); - - if (catalog_definition_file_) { - copy->catalog_definition_file_ = catalog_definition_file_->copy_and_remap( - copy->catalogs_, copy->deleted_catalogs_); - } - - return copy; -} - -static void copy_catalog_map_into_existing( - const OwningAssetCatalogMap &source, - OwningAssetCatalogMap &dest, - AssetCatalogCollection::OnDuplicateCatalogIdFn on_duplicate_items) -{ - for (const auto &orig_catalog_uptr : source.values()) { - if (dest.contains(orig_catalog_uptr->catalog_id)) { - if (on_duplicate_items) { - on_duplicate_items(*dest.lookup(orig_catalog_uptr->catalog_id), *orig_catalog_uptr); - } - continue; - } - - auto copy_catalog_uptr = std::make_unique(*orig_catalog_uptr); - dest.add_new(copy_catalog_uptr->catalog_id, std::move(copy_catalog_uptr)); - } -} - -void AssetCatalogCollection::add_catalogs_from_existing( - const AssetCatalogCollection &other, - AssetCatalogCollection::OnDuplicateCatalogIdFn on_duplicate_items) -{ - copy_catalog_map_into_existing(other.catalogs_, catalogs_, on_duplicate_items); -} - -OwningAssetCatalogMap AssetCatalogCollection::copy_catalog_map(const OwningAssetCatalogMap &orig) -{ - OwningAssetCatalogMap copy; - copy_catalog_map_into_existing( - orig, copy, /*on_duplicate_items=*/[](const AssetCatalog &, const AssetCatalog &) { - /* `copy` was empty before. If this happens it means there was a duplicate in the `orig` - * catalog map which should've been caught already. */ - BLI_assert_unreachable(); - }); - return copy; -} - -} // namespace blender::asset_system diff --git a/source/blender/asset_system/intern/asset_catalog_collection.hh b/source/blender/asset_system/intern/asset_catalog_collection.hh deleted file mode 100644 index 50c12dfe279..00000000000 --- a/source/blender/asset_system/intern/asset_catalog_collection.hh +++ /dev/null @@ -1,61 +0,0 @@ -/* SPDX-FileCopyrightText: 2023 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup asset_system - */ - -#pragma once - -#include "AS_asset_catalog.hh" - -namespace blender::asset_system { - -/** - * All catalogs that are owned by a single asset library, and managed by a single instance of - * #AssetCatalogService. The undo system for asset catalog edits contains historical copies of this - * struct. - */ -class AssetCatalogCollection { - protected: - /** All catalogs known, except the known-but-deleted ones. */ - OwningAssetCatalogMap catalogs_; - - /** Catalogs that have been deleted. They are kept around so that the load-merge-save of catalog - * definition files can actually delete them if they already existed on disk (instead of the - * merge operation resurrecting them). */ - OwningAssetCatalogMap deleted_catalogs_; - - /* For now only a single catalog definition file is supported. - * The aim is to support an arbitrary number of such files per asset library in the future. */ - std::unique_ptr catalog_definition_file_; - - /** Whether any of the catalogs have unsaved changes. */ - bool has_unsaved_changes_ = false; - - friend AssetCatalogService; - - public: - AssetCatalogCollection() = default; - AssetCatalogCollection(const AssetCatalogCollection &other) = delete; - AssetCatalogCollection(AssetCatalogCollection &&other) noexcept = default; - - std::unique_ptr deep_copy() const; - using OnDuplicateCatalogIdFn = - FunctionRef; - /** - * Copy the catalogs from \a other and append them to this collection. Copies no other data - * otherwise. - * - * \note If a catalog from \a other already exists in this collection (identified by catalog ID), - * it will be skipped and \a on_duplicate_items will be called. - */ - void add_catalogs_from_existing(const AssetCatalogCollection &other, - OnDuplicateCatalogIdFn on_duplicate_items); - - protected: - static OwningAssetCatalogMap copy_catalog_map(const OwningAssetCatalogMap &orig); -}; - -} // namespace blender::asset_system diff --git a/source/blender/asset_system/intern/asset_catalog_definition_file.cc b/source/blender/asset_system/intern/asset_catalog_definition_file.cc deleted file mode 100644 index 1ad59166c46..00000000000 --- a/source/blender/asset_system/intern/asset_catalog_definition_file.cc +++ /dev/null @@ -1,289 +0,0 @@ -/* SPDX-FileCopyrightText: 2023 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup asset_system - */ - -#include - -#include "BLI_fileops.hh" -#include "BLI_path_util.h" - -#include "CLG_log.h" - -#include "asset_catalog_definition_file.hh" - -static CLG_LogRef LOG = {"asset_system.asset_catalog_definition_file"}; - -namespace blender::asset_system { - -const int AssetCatalogDefinitionFile::SUPPORTED_VERSION = 1; -const std::string AssetCatalogDefinitionFile::VERSION_MARKER = "VERSION "; - -const std::string AssetCatalogDefinitionFile::HEADER = - "# This is an Asset Catalog Definition file for Blender.\n" - "#\n" - "# Empty lines and lines starting with `#` will be ignored.\n" - "# The first non-ignored line should be the version indicator.\n" - "# Other lines are of the format \"UUID:catalog/path/for/assets:simple catalog name\"\n"; - -bool AssetCatalogDefinitionFile::contains(const CatalogID catalog_id) const -{ - return catalogs_.contains(catalog_id); -} - -void AssetCatalogDefinitionFile::add_new(AssetCatalog *catalog) -{ - catalogs_.add_new(catalog->catalog_id, catalog); -} - -void AssetCatalogDefinitionFile::add_overwrite(AssetCatalog *catalog) -{ - catalogs_.add_overwrite(catalog->catalog_id, catalog); -} - -void AssetCatalogDefinitionFile::forget(CatalogID catalog_id) -{ - catalogs_.remove(catalog_id); -} - -void AssetCatalogDefinitionFile::parse_catalog_file( - const CatalogFilePath &catalog_definition_file_path, - AssetCatalogParsedFn catalog_loaded_callback) -{ - fstream infile(catalog_definition_file_path, std::ios::in); - - if (!infile.is_open()) { - CLOG_ERROR(&LOG, "%s: unable to open file", catalog_definition_file_path.c_str()); - return; - } - bool seen_version_number = false; - std::string line; - while (std::getline(infile, line)) { - const StringRef trimmed_line = StringRef(line).trim(); - if (trimmed_line.is_empty() || trimmed_line[0] == '#') { - continue; - } - - if (!seen_version_number) { - /* The very first non-ignored line should be the version declaration. */ - const bool is_valid_version = this->parse_version_line(trimmed_line); - if (!is_valid_version) { - std::cerr << catalog_definition_file_path - << ": first line should be version declaration; ignoring file." << std::endl; - break; - } - seen_version_number = true; - continue; - } - - std::unique_ptr catalog = this->parse_catalog_line(trimmed_line); - if (!catalog) { - continue; - } - - AssetCatalog *non_owning_ptr = catalog.get(); - const bool keep_catalog = catalog_loaded_callback(std::move(catalog)); - if (!keep_catalog) { - continue; - } - - /* The AssetDefinitionFile should include this catalog when writing it back to disk. */ - this->add_overwrite(non_owning_ptr); - } -} - -bool AssetCatalogDefinitionFile::parse_version_line(const StringRef line) -{ - if (!line.startswith(VERSION_MARKER)) { - return false; - } - - const std::string version_string = line.substr(VERSION_MARKER.length()); - const int file_version = std::atoi(version_string.c_str()); - - /* No versioning, just a blunt check whether it's the right one. */ - return file_version == SUPPORTED_VERSION; -} - -std::unique_ptr AssetCatalogDefinitionFile::parse_catalog_line(const StringRef line) -{ - const char delim = ':'; - const int64_t first_delim = line.find_first_of(delim); - if (first_delim == StringRef::not_found) { - std::cerr << "Invalid catalog line in " << this->file_path << ": " << line << std::endl; - return std::unique_ptr(nullptr); - } - - /* Parse the catalog ID. */ - const std::string id_as_string = line.substr(0, first_delim).trim(); - bUUID catalog_id; - const bool uuid_parsed_ok = BLI_uuid_parse_string(&catalog_id, id_as_string.c_str()); - if (!uuid_parsed_ok) { - std::cerr << "Invalid UUID in " << this->file_path << ": " << line << std::endl; - return std::unique_ptr(nullptr); - } - - /* Parse the path and simple name. */ - const StringRef path_and_simple_name = line.substr(first_delim + 1); - const int64_t second_delim = path_and_simple_name.find_first_of(delim); - - std::string path_in_file; - std::string simple_name; - if (second_delim == 0) { - /* Delimiter as first character means there is no path. These lines are to be ignored. */ - return std::unique_ptr(nullptr); - } - - if (second_delim == StringRef::not_found) { - /* No delimiter means no simple name, just treat it as all "path". */ - path_in_file = path_and_simple_name; - simple_name = ""; - } - else { - path_in_file = path_and_simple_name.substr(0, second_delim); - simple_name = path_and_simple_name.substr(second_delim + 1).trim(); - } - - AssetCatalogPath catalog_path = path_in_file; - return std::make_unique(catalog_id, catalog_path.cleanup(), simple_name); -} - -AssetCatalogDefinitionFile::AssetCatalogDefinitionFile(const CatalogFilePath &file_path) - : file_path(file_path) -{ -} - -bool AssetCatalogDefinitionFile::write_to_disk() const -{ - BLI_assert_msg(!this->file_path.empty(), "Writing to CDF requires its file path to be known"); - return this->write_to_disk(this->file_path); -} - -bool AssetCatalogDefinitionFile::write_to_disk(const CatalogFilePath &dest_file_path) const -{ - const CatalogFilePath writable_path = dest_file_path + ".writing"; - const CatalogFilePath backup_path = dest_file_path + "~"; - - if (!this->write_to_disk_unsafe(writable_path)) { - /* TODO: communicate what went wrong. */ - return false; - } - if (BLI_exists(dest_file_path.c_str())) { - if (BLI_rename_overwrite(dest_file_path.c_str(), backup_path.c_str())) { - /* TODO: communicate what went wrong. */ - return false; - } - } - if (BLI_rename_overwrite(writable_path.c_str(), dest_file_path.c_str())) { - /* TODO: communicate what went wrong. */ - return false; - } - - return true; -} - -bool AssetCatalogDefinitionFile::write_to_disk_unsafe(const CatalogFilePath &dest_file_path) const -{ - char directory[PATH_MAX]; - BLI_path_split_dir_part(dest_file_path.c_str(), directory, sizeof(directory)); - if (!ensure_directory_exists(directory)) { - /* TODO(Sybren): pass errors to the UI somehow. */ - return false; - } - - fstream output(dest_file_path, std::ios::out); - - /* TODO(@sybren): remember the line ending style that was originally read, then use that to write - * the file again. */ - - /* Write the header. */ - output << HEADER; - output << "" << std::endl; - output << VERSION_MARKER << SUPPORTED_VERSION << std::endl; - output << "" << std::endl; - - /* Write the catalogs, ordered by path (primary) and UUID (secondary). */ - AssetCatalogOrderedSet catalogs_by_path; - for (const AssetCatalog *catalog : catalogs_.values()) { - if (catalog->flags.is_deleted) { - continue; - } - catalogs_by_path.insert(catalog); - } - - for (const AssetCatalog *catalog : catalogs_by_path) { - output << catalog->catalog_id << ":" << catalog->path << ":" << catalog->simple_name - << std::endl; - } - output.close(); - return !output.bad(); -} - -bool AssetCatalogDefinitionFile::ensure_directory_exists( - const CatalogFilePath directory_path) const -{ - /* TODO(@sybren): design a way to get such errors presented to users (or ensure that they never - * occur). */ - if (directory_path.empty()) { - std::cerr - << "AssetCatalogService: no asset library root configured, unable to ensure it exists." - << std::endl; - return false; - } - - if (BLI_exists(directory_path.data())) { - if (!BLI_is_dir(directory_path.data())) { - std::cerr << "AssetCatalogService: " << directory_path - << " exists but is not a directory, this is not a supported situation." - << std::endl; - return false; - } - - /* Root directory exists, work is done. */ - return true; - } - - /* Ensure the root directory exists. */ - std::error_code err_code; - if (!BLI_dir_create_recursive(directory_path.data())) { - std::cerr << "AssetCatalogService: error creating directory " << directory_path << ": " - << err_code << std::endl; - return false; - } - - /* Root directory has been created, work is done. */ - return true; -} - -std::unique_ptr AssetCatalogDefinitionFile::copy_and_remap( - const OwningAssetCatalogMap &catalogs, const OwningAssetCatalogMap &deleted_catalogs) const -{ - auto copy = std::make_unique(*this); - copy->catalogs_.clear(); - - /* Remap pointers of the copy from the original AssetCatalogCollection to the given one. */ - for (CatalogID catalog_id : catalogs_.keys()) { - /* The catalog can be in the regular or the deleted map. */ - const std::unique_ptr *remapped_catalog_uptr_ptr = catalogs.lookup_ptr( - catalog_id); - if (remapped_catalog_uptr_ptr) { - copy->catalogs_.add_new(catalog_id, remapped_catalog_uptr_ptr->get()); - continue; - } - - remapped_catalog_uptr_ptr = deleted_catalogs.lookup_ptr(catalog_id); - if (remapped_catalog_uptr_ptr) { - copy->catalogs_.add_new(catalog_id, remapped_catalog_uptr_ptr->get()); - continue; - } - - BLI_assert(!"A CDF should only reference known catalogs."); - } - - return copy; -} - -} // namespace blender::asset_system diff --git a/source/blender/asset_system/intern/asset_catalog_definition_file.hh b/source/blender/asset_system/intern/asset_catalog_definition_file.hh deleted file mode 100644 index 2dfdcb23d0d..00000000000 --- a/source/blender/asset_system/intern/asset_catalog_definition_file.hh +++ /dev/null @@ -1,87 +0,0 @@ -/* SPDX-FileCopyrightText: 2023 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup asset_system - * - * Classes internal to the asset system for asset catalog management. - */ - -#pragma once - -#include "AS_asset_catalog.hh" - -#include "BLI_string_ref.hh" - -namespace blender::asset_system { - -/** - * Keeps track of which catalogs are defined in a certain file on disk. - * Only contains non-owning pointers to the #AssetCatalog instances, so ensure the lifetime of this - * class is shorter than that of the #`AssetCatalog`s themselves. - */ -class AssetCatalogDefinitionFile { - protected: - /* Catalogs stored in this file. They are mapped by ID to make it possible to query whether a - * catalog is already known, without having to find the corresponding `AssetCatalog*`. */ - Map catalogs_; - - public: - /* For now this is the only version of the catalog definition files that is supported. - * Later versioning code may be added to handle older files. */ - const static int SUPPORTED_VERSION; - /* String that's matched in the catalog definition file to know that the line is the version - * declaration. It has to start with a space to ensure it won't match any hypothetical future - * field that starts with "VERSION". */ - const static std::string VERSION_MARKER; - const static std::string HEADER; - - const CatalogFilePath file_path; - - public: - AssetCatalogDefinitionFile(const CatalogFilePath &file_path); - - /** - * Write the catalog definitions to the same file they were read from. - * Return true when the file was written correctly, false when there was a problem. - */ - bool write_to_disk() const; - /** - * Write the catalog definitions to an arbitrary file path. - * - * Any existing file is backed up to "filename~". Any previously existing backup is overwritten. - * - * Return true when the file was written correctly, false when there was a problem. - */ - bool write_to_disk(const CatalogFilePath &dest_file_path) const; - - bool contains(CatalogID catalog_id) const; - /** Add a catalog, overwriting the one with the same catalog ID. */ - void add_overwrite(AssetCatalog *catalog); - /** Add a new catalog. Undefined behavior if a catalog with the same ID was already added. */ - void add_new(AssetCatalog *catalog); - - /** Remove the catalog from the collection of catalogs stored in this file. */ - void forget(CatalogID catalog_id); - - using AssetCatalogParsedFn = FunctionRef)>; - void parse_catalog_file(const CatalogFilePath &catalog_definition_file_path, - AssetCatalogParsedFn callback); - - std::unique_ptr copy_and_remap( - const OwningAssetCatalogMap &catalogs, const OwningAssetCatalogMap &deleted_catalogs) const; - - protected: - bool parse_version_line(StringRef line); - std::unique_ptr parse_catalog_line(StringRef line); - - /** - * Write the catalog definitions to the given file path. - * Return true when the file was written correctly, false when there was a problem. - */ - bool write_to_disk_unsafe(const CatalogFilePath &dest_file_path) const; - bool ensure_directory_exists(const CatalogFilePath directory_path) const; -}; - -} // namespace blender::asset_system diff --git a/source/blender/asset_system/intern/asset_catalog_path.cc b/source/blender/asset_system/intern/asset_catalog_path.cc index a9643a69c72..a8d7924db9e 100644 --- a/source/blender/asset_system/intern/asset_catalog_path.cc +++ b/source/blender/asset_system/intern/asset_catalog_path.cc @@ -30,37 +30,37 @@ AssetCatalogPath::AssetCatalogPath(AssetCatalogPath &&other_path) noexcept uint64_t AssetCatalogPath::hash() const { std::hash hasher{}; - return hasher(path_); + return hasher(this->path_); } uint64_t AssetCatalogPath::length() const { - return path_.length(); + return this->path_.length(); } const char *AssetCatalogPath::c_str() const { - return path_.c_str(); + return this->path_.c_str(); } const std::string &AssetCatalogPath::str() const { - return path_; + return this->path_; } StringRefNull AssetCatalogPath::name() const { - const size_t last_sep_index = path_.rfind(SEPARATOR); + const size_t last_sep_index = this->path_.rfind(SEPARATOR); if (last_sep_index == std::string::npos) { - return StringRefNull(path_); + return StringRefNull(this->path_); } - return StringRefNull(path_.c_str() + last_sep_index + 1); + return StringRefNull(this->path_.c_str() + last_sep_index + 1); } bool AssetCatalogPath::operator==(const AssetCatalogPath &other_path) const { - return path_ == other_path.path_; + return this->path_ == other_path.path_; } bool AssetCatalogPath::operator!=(const AssetCatalogPath &other_path) const @@ -70,7 +70,7 @@ bool AssetCatalogPath::operator!=(const AssetCatalogPath &other_path) const bool AssetCatalogPath::operator<(const AssetCatalogPath &other_path) const { - return path_ < other_path.path_; + return this->path_ < other_path.path_; } AssetCatalogPath AssetCatalogPath::operator/(const AssetCatalogPath &path_to_append) const @@ -84,13 +84,13 @@ AssetCatalogPath AssetCatalogPath::operator/(const AssetCatalogPath &path_to_app } std::stringstream new_path; - new_path << path_ << SEPARATOR << path_to_append.path_; + new_path << this->path_ << SEPARATOR << path_to_append.path_; return AssetCatalogPath(new_path.str()); } AssetCatalogPath::operator bool() const { - return !path_.empty(); + return !this->path_.empty(); } std::ostream &operator<<(std::ostream &stream, const AssetCatalogPath &path_to_append) @@ -142,7 +142,7 @@ bool AssetCatalogPath::is_contained_in(const AssetCatalogPath &other_path) const return true; } - if (path_ == other_path.path_) { + if (this->path_ == other_path.path_) { /* Weak is-in relation: equal paths contain each other. */ return true; } @@ -154,7 +154,7 @@ bool AssetCatalogPath::is_contained_in(const AssetCatalogPath &other_path) const } /* Create StringRef to be able to use .startswith(). */ - const StringRef this_path(path_); + const StringRef this_path(this->path_); const bool prefix_ok = this_path.startswith(other_path.path_); const char next_char = this_path[other_path.length()]; return prefix_ok && next_char == SEPARATOR; @@ -165,18 +165,18 @@ AssetCatalogPath AssetCatalogPath::parent() const if (!*this) { return AssetCatalogPath(""); } - std::string::size_type last_sep_index = path_.rfind(SEPARATOR); + std::string::size_type last_sep_index = this->path_.rfind(SEPARATOR); if (last_sep_index == std::string::npos) { return AssetCatalogPath(""); } - return AssetCatalogPath(path_.substr(0, last_sep_index)); + return AssetCatalogPath(this->path_.substr(0, last_sep_index)); } void AssetCatalogPath::iterate_components(ComponentIteratorFn callback) const { const char *next_slash_ptr; - for (const char *path_component = path_.data(); path_component && path_component[0]; + for (const char *path_component = this->path_.data(); path_component && path_component[0]; /* Jump to one after the next slash if there is any. */ path_component = next_slash_ptr ? next_slash_ptr + 1 : nullptr) { @@ -215,7 +215,7 @@ AssetCatalogPath AssetCatalogPath::rebase(const AssetCatalogPath &from_path, } /* When from_path = "test", we need to skip "test/" to get the rest of the path, hence the +1. */ - const StringRef suffix = StringRef(path_).substr(from_path.length() + 1); + const StringRef suffix = StringRef(this->path_).substr(from_path.length() + 1); const AssetCatalogPath path_suffix(suffix); return to_path / path_suffix; } diff --git a/source/blender/asset_system/intern/asset_catalog_tree.cc b/source/blender/asset_system/intern/asset_catalog_tree.cc index ed148bc25bf..4756095719d 100644 --- a/source/blender/asset_system/intern/asset_catalog_tree.cc +++ b/source/blender/asset_system/intern/asset_catalog_tree.cc @@ -60,7 +60,7 @@ bool AssetCatalogTreeItem::has_children() const return !children_.empty(); } -void AssetCatalogTreeItem::foreach_item_recursive(const AssetCatalogTreeItem::ChildMap &children, +void AssetCatalogTreeItem::foreach_item_recursive(AssetCatalogTreeItem::ChildMap &children, const ItemIterFn callback) { for (auto &[key, item] : children) { @@ -69,7 +69,7 @@ void AssetCatalogTreeItem::foreach_item_recursive(const AssetCatalogTreeItem::Ch } } -void AssetCatalogTreeItem::foreach_child(const ItemIterFn callback) const +void AssetCatalogTreeItem::foreach_child(const ItemIterFn callback) { for (auto &[key, item] : children_) { callback(item); @@ -115,12 +115,12 @@ void AssetCatalogTree::insert_item(const AssetCatalog &catalog) }); } -void AssetCatalogTree::foreach_item(AssetCatalogTreeItem::ItemIterFn callback) const +void AssetCatalogTree::foreach_item(AssetCatalogTreeItem::ItemIterFn callback) { AssetCatalogTreeItem::foreach_item_recursive(root_items_, callback); } -void AssetCatalogTree::foreach_root_item(const ItemIterFn callback) const +void AssetCatalogTree::foreach_root_item(const ItemIterFn callback) { for (auto &[key, item] : root_items_) { callback(item); @@ -132,10 +132,10 @@ bool AssetCatalogTree::is_empty() const return root_items_.empty(); } -const AssetCatalogTreeItem *AssetCatalogTree::find_item(const AssetCatalogPath &path) const +AssetCatalogTreeItem *AssetCatalogTree::find_item(const AssetCatalogPath &path) { - const AssetCatalogTreeItem *result = nullptr; - this->foreach_item([&](const AssetCatalogTreeItem &item) { + AssetCatalogTreeItem *result = nullptr; + this->foreach_item([&](AssetCatalogTreeItem &item) { if (result) { /* There is no way to stop iteration. */ return; @@ -147,10 +147,10 @@ const AssetCatalogTreeItem *AssetCatalogTree::find_item(const AssetCatalogPath & return result; } -const AssetCatalogTreeItem *AssetCatalogTree::find_root_item(const AssetCatalogPath &path) const +AssetCatalogTreeItem *AssetCatalogTree::find_root_item(const AssetCatalogPath &path) { - const AssetCatalogTreeItem *result = nullptr; - this->foreach_root_item([&](const AssetCatalogTreeItem &item) { + AssetCatalogTreeItem *result = nullptr; + this->foreach_root_item([&](AssetCatalogTreeItem &item) { if (result) { /* There is no way to stop iteration. */ return; diff --git a/source/blender/asset_system/intern/asset_library.cc b/source/blender/asset_system/intern/asset_library.cc index caa65c62372..f48c72562f7 100644 --- a/source/blender/asset_system/intern/asset_library.cc +++ b/source/blender/asset_system/intern/asset_library.cc @@ -13,7 +13,6 @@ #include "AS_asset_library.hh" #include "AS_asset_representation.hh" -#include "BKE_lib_remap.hh" #include "BKE_main.hh" #include "BKE_preferences.h" @@ -24,8 +23,6 @@ #include "DNA_userdef_types.h" -#include "asset_catalog_collection.hh" -#include "asset_catalog_definition_file.hh" #include "asset_library_service.hh" #include "asset_storage.hh" #include "utils.hh" @@ -96,11 +93,36 @@ std::string AS_asset_library_find_suitable_root_path_from_main(const Main *bmain return AS_asset_library_find_suitable_root_path_from_path(bmain->filepath); } -void AS_asset_library_remap_ids(const bke::id::IDRemapper &mappings) +AssetCatalogService *AS_asset_library_get_catalog_service(const AssetLibrary *library) +{ + if (library == nullptr) { + return nullptr; + } + return library->catalog_service.get(); +} + +AssetCatalogTree *AS_asset_library_get_catalog_tree(const AssetLibrary *library) +{ + AssetCatalogService *catalog_service = AS_asset_library_get_catalog_service(library); + if (catalog_service == nullptr) { + return nullptr; + } + + return catalog_service->get_catalog_tree(); +} + +void AS_asset_library_refresh_catalog_simplename(AssetLibrary *asset_library, + AssetMetaData *asset_data) +{ + asset_library->refresh_catalog_simplename(asset_data); +} + +void AS_asset_library_remap_ids(const IDRemapper *mappings) { AssetLibraryService *service = AssetLibraryService::get(); service->foreach_loaded_asset_library( - [mappings](AssetLibrary &library) { library.remap_ids_and_remove_invalid(mappings); }, true); + [mappings](AssetLibrary &library) { library.remap_ids_and_remove_invalid(*mappings); }, + true); } void AS_asset_full_path_explode_from_weak_ref(const AssetWeakReference *asset_reference, @@ -169,14 +191,14 @@ AssetLibrary::AssetLibrary(eAssetLibraryType library_type, StringRef name, Strin name_(name), root_path_(std::make_shared(utils::normalize_directory_path(root_path))), asset_storage_(std::make_unique()), - catalog_service_(std::make_unique()) + catalog_service(std::make_unique()) { } AssetLibrary::~AssetLibrary() { if (on_save_callback_store_.func) { - this->on_blend_save_handler_unregister(); + on_blend_save_handler_unregister(); } } @@ -191,13 +213,7 @@ void AssetLibrary::load_catalogs() { auto catalog_service = std::make_unique(root_path()); catalog_service->load_from_disk(); - std::lock_guard lock{catalog_service_mutex_}; - catalog_service_ = std::move(catalog_service); -} - -AssetCatalogService &AssetLibrary::catalog_service() const -{ - return *catalog_service_; + this->catalog_service = std::move(catalog_service); } void AssetLibrary::refresh_catalogs() {} @@ -207,14 +223,14 @@ AssetRepresentation &AssetLibrary::add_external_asset(StringRef relative_asset_p const int id_type, std::unique_ptr metadata) { - AssetIdentifier identifier = this->asset_identifier_from_library(relative_asset_path); + AssetIdentifier identifier = asset_identifier_from_library(relative_asset_path); return asset_storage_->add_external_asset( std::move(identifier), name, id_type, std::move(metadata), *this); } AssetRepresentation &AssetLibrary::add_local_id_asset(StringRef relative_asset_path, ID &id) { - AssetIdentifier identifier = this->asset_identifier_from_library(relative_asset_path); + AssetIdentifier identifier = asset_identifier_from_library(relative_asset_path); return asset_storage_->add_local_id_asset(std::move(identifier), id, *this); } @@ -223,7 +239,7 @@ bool AssetLibrary::remove_asset(AssetRepresentation &asset) return asset_storage_->remove_asset(asset); } -void AssetLibrary::remap_ids_and_remove_invalid(const bke::id::IDRemapper &mappings) +void AssetLibrary::remap_ids_and_remove_invalid(const IDRemapper &mappings) { asset_storage_->remap_ids_and_remove_invalid(mappings); } @@ -262,8 +278,12 @@ void AssetLibrary::on_blend_save_post(Main *main, PointerRNA ** /*pointers*/, const int /*num_pointers*/) { + if (this->catalog_service == nullptr) { + return; + } + if (save_catalogs_when_file_is_saved) { - this->catalog_service().write_to_disk(main->filepath); + this->catalog_service->write_to_disk(main->filepath); } } @@ -285,7 +305,7 @@ void AssetLibrary::refresh_catalog_simplename(AssetMetaData *asset_data) asset_data->catalog_simple_name[0] = '\0'; return; } - const AssetCatalog *catalog = this->catalog_service().find_catalog(asset_data->catalog_id); + const AssetCatalog *catalog = this->catalog_service->find_catalog(asset_data->catalog_id); if (catalog == nullptr) { /* No-op if the catalog cannot be found. This could be the kind of "the catalog definition file * is corrupt/lost" scenario that the simple name is meant to help recover from. */ @@ -344,10 +364,4 @@ AssetLibraryReference all_library_reference() return all_library_ref; } -void all_library_reload_catalogs_if_dirty() -{ - AssetLibraryService *service = AssetLibraryService::get(); - service->reload_all_library_catalogs_if_dirty(); -} - } // namespace blender::asset_system diff --git a/source/blender/asset_system/intern/asset_library_all.cc b/source/blender/asset_system/intern/asset_library_all.cc index e094bb7d2a8..8e4dba9700e 100644 --- a/source/blender/asset_system/intern/asset_library_all.cc +++ b/source/blender/asset_system/intern/asset_library_all.cc @@ -9,20 +9,14 @@ #include #include "AS_asset_catalog_tree.hh" -#include "asset_catalog_collection.hh" -#include "asset_catalog_definition_file.hh" #include "asset_library_all.hh" -#include "CLG_log.h" - -static CLG_LogRef LOG = {"asset_system.all_asset_library"}; - namespace blender::asset_system { AllAssetLibrary::AllAssetLibrary() : AssetLibrary(ASSET_LIBRARY_ALL) {} -void AllAssetLibrary::rebuild_catalogs_from_nested(const bool reload_nested_catalogs) +void AllAssetLibrary::rebuild(const bool reload_catalogs) { /* Start with empty catalog storage. Don't do this directly in #this.catalog_service to avoid * race conditions. Rather build into a new service and replace the current one when done. */ @@ -31,51 +25,19 @@ void AllAssetLibrary::rebuild_catalogs_from_nested(const bool reload_nested_cata AssetLibrary::foreach_loaded( [&](AssetLibrary &nested) { - if (reload_nested_catalogs) { - nested.catalog_service().reload_catalogs(); + if (reload_catalogs) { + nested.catalog_service->reload_catalogs(); } - - new_catalog_service->add_from_existing( - nested.catalog_service(), - /*on_duplicate_items=*/[](const AssetCatalog &existing, - const AssetCatalog &to_be_ignored) { - if (existing.path == to_be_ignored.path) { - CLOG_INFO(&LOG, - 2, - "multiple definitions of catalog %s (path: %s), ignoring duplicate", - existing.catalog_id.str().c_str(), - existing.path.c_str()); - } - else { - CLOG_ERROR(&LOG, - "multiple definitions of catalog %s with differing paths (%s vs. %s), " - "ignoring second one", - existing.catalog_id.str().c_str(), - existing.path.c_str(), - to_be_ignored.path.c_str()); - } - }); + new_catalog_service->add_from_existing(*nested.catalog_service); }, false); - - std::lock_guard lock{catalog_service_mutex_}; - catalog_service_ = std::move(new_catalog_service); - catalogs_dirty_ = false; -} - -void AllAssetLibrary::tag_catalogs_dirty() -{ - catalogs_dirty_ = true; -} - -bool AllAssetLibrary::is_catalogs_dirty() const -{ - return catalogs_dirty_; + new_catalog_service->rebuild_tree(); + this->catalog_service = std::move(new_catalog_service); } void AllAssetLibrary::refresh_catalogs() { - this->rebuild_catalogs_from_nested(/*reload_nested_catalogs=*/true); + rebuild(/*reload_catalogs=*/true); } } // namespace blender::asset_system diff --git a/source/blender/asset_system/intern/asset_library_all.hh b/source/blender/asset_system/intern/asset_library_all.hh index 89929bcf035..6e28dcfd013 100644 --- a/source/blender/asset_system/intern/asset_library_all.hh +++ b/source/blender/asset_system/intern/asset_library_all.hh @@ -8,31 +8,17 @@ #pragma once -#include - #include "AS_asset_library.hh" namespace blender::asset_system { class AllAssetLibrary : public AssetLibrary { - std::atomic catalogs_dirty_ = true; - public: AllAssetLibrary(); void refresh_catalogs() override; - /** - * Update the available catalogs and catalog tree from the nested asset libraries. Completely - * recreates the catalog service (invalidating pointers to the previous one). - * - * \param reload_nested_catalogs: Re-read catalog definitions of nested libraries from disk and - * merge them into the in-memory representations. - */ - void rebuild_catalogs_from_nested(bool reload_nested_catalogs); - - void tag_catalogs_dirty(); - bool is_catalogs_dirty() const; + void rebuild(const bool reload_catalogs); }; } // namespace blender::asset_system diff --git a/source/blender/asset_system/intern/asset_library_on_disk.cc b/source/blender/asset_system/intern/asset_library_on_disk.cc index e1f7733c215..7028a517de9 100644 --- a/source/blender/asset_system/intern/asset_library_on_disk.cc +++ b/source/blender/asset_system/intern/asset_library_on_disk.cc @@ -15,12 +15,12 @@ OnDiskAssetLibrary::OnDiskAssetLibrary(eAssetLibraryType library_type, StringRef root_path) : AssetLibrary(library_type, name, root_path) { - this->on_blend_save_handler_register(); + on_blend_save_handler_register(); } void OnDiskAssetLibrary::refresh_catalogs() { - this->catalog_service().reload_catalogs(); + catalog_service->reload_catalogs(); } } // namespace blender::asset_system diff --git a/source/blender/asset_system/intern/asset_library_runtime.cc b/source/blender/asset_system/intern/asset_library_runtime.cc index 21dee8d5ff3..486786e79e7 100644 --- a/source/blender/asset_system/intern/asset_library_runtime.cc +++ b/source/blender/asset_system/intern/asset_library_runtime.cc @@ -12,7 +12,7 @@ namespace blender::asset_system { RuntimeAssetLibrary::RuntimeAssetLibrary() : AssetLibrary(ASSET_LIBRARY_LOCAL) { - this->on_blend_save_handler_register(); + on_blend_save_handler_register(); } } // namespace blender::asset_system diff --git a/source/blender/asset_system/intern/asset_library_service.cc b/source/blender/asset_system/intern/asset_library_service.cc index 6f9a8ae950b..675b1f2c160 100644 --- a/source/blender/asset_system/intern/asset_library_service.cc +++ b/source/blender/asset_system/intern/asset_library_service.cc @@ -6,7 +6,7 @@ * \ingroup asset_system */ -#include "BKE_blender.hh" +#include "BKE_blender.h" #include "BKE_preferences.h" #include "BLI_path_util.h" @@ -74,7 +74,7 @@ AssetLibrary *AssetLibraryService::get_asset_library( return nullptr; } - return this->get_asset_library_on_disk_builtin(type, root_path); + return get_asset_library_on_disk_builtin(type, root_path); } case ASSET_LIBRARY_LOCAL: { /* For the "Current File" library we get the asset library root path based on main. */ @@ -83,14 +83,14 @@ AssetLibrary *AssetLibraryService::get_asset_library( if (root_path.empty()) { /* File wasn't saved yet. */ - return this->get_asset_library_current_file(); + return get_asset_library_current_file(); } - return this->get_asset_library_on_disk_builtin(type, root_path); + return get_asset_library_on_disk_builtin(type, root_path); } case ASSET_LIBRARY_ALL: - return this->get_asset_library_all(bmain); + return get_asset_library_all(bmain); case ASSET_LIBRARY_CUSTOM: { - bUserAssetLibrary *custom_library = this->find_custom_asset_library_from_library_ref( + bUserAssetLibrary *custom_library = find_custom_asset_library_from_library_ref( library_reference); if (!custom_library) { return nullptr; @@ -101,8 +101,7 @@ AssetLibrary *AssetLibraryService::get_asset_library( return nullptr; } - AssetLibrary *library = this->get_asset_library_on_disk_custom(custom_library->name, - root_path); + AssetLibrary *library = get_asset_library_on_disk_custom(custom_library->name, root_path); library->import_method_ = eAssetImportMethod(custom_library->import_method); library->may_override_import_method_ = true; library->use_relative_path_ = (custom_library->flag & ASSET_LIBRARY_RELATIVE_PATH) != 0; @@ -157,7 +156,7 @@ AssetLibrary *AssetLibraryService::get_asset_library_on_disk(eAssetLibraryType l AssetLibrary *AssetLibraryService::get_asset_library_on_disk_custom(StringRef name, StringRefNull root_path) { - return this->get_asset_library_on_disk(ASSET_LIBRARY_CUSTOM, name, root_path); + return get_asset_library_on_disk(ASSET_LIBRARY_CUSTOM, name, root_path); } AssetLibrary *AssetLibraryService::get_asset_library_on_disk_builtin(eAssetLibraryType type, @@ -169,7 +168,7 @@ AssetLibrary *AssetLibraryService::get_asset_library_on_disk_builtin(eAssetLibra /* Builtin asset libraries don't need a name, the #eAssetLibraryType is enough to identify them * (and doesn't change, unlike the name). */ - return this->get_asset_library_on_disk(type, {}, root_path); + return get_asset_library_on_disk(type, {}, root_path); } AssetLibrary *AssetLibraryService::get_asset_library_current_file() @@ -187,32 +186,15 @@ AssetLibrary *AssetLibraryService::get_asset_library_current_file() return lib; } -void AssetLibraryService::tag_all_library_catalogs_dirty() +void AssetLibraryService::rebuild_all_library() { if (all_library_) { - all_library_->tag_catalogs_dirty(); - } -} - -void AssetLibraryService::reload_all_library_catalogs_if_dirty() -{ - if (all_library_ && all_library_->is_catalogs_dirty()) { - /* Don't reload catalogs from nested libraries from disk, just reflect their currently known - * state in the "All" library. Loading catalog changes from disk is only done with a - * #AS_asset_library_load()/#AssetLibraryService:get_asset_library() call. */ - const bool reload_nested_catalogs = false; - all_library_->rebuild_catalogs_from_nested(reload_nested_catalogs); + all_library_->rebuild(false); } } AssetLibrary *AssetLibraryService::get_asset_library_all(const Main *bmain) { - if (all_library_) { - CLOG_INFO(&LOG, 2, "get all lib (cached)"); - all_library_->refresh_catalogs(); - return all_library_.get(); - } - /* (Re-)load all other asset libraries. */ for (AssetLibraryReference &library_ref : all_valid_asset_library_refs()) { /* Skip self :) */ @@ -221,14 +203,20 @@ AssetLibrary *AssetLibraryService::get_asset_library_all(const Main *bmain) } /* Ensure all asset libraries are loaded. */ - this->get_asset_library(bmain, library_ref); + get_asset_library(bmain, library_ref); + } + + if (all_library_) { + CLOG_INFO(&LOG, 2, "get all lib (cached)"); + all_library_->refresh_catalogs(); + return all_library_.get(); } CLOG_INFO(&LOG, 2, "get all lib (loaded)"); all_library_ = std::make_unique(); /* Don't reload catalogs on this initial read, they've just been loaded above. */ - all_library_->rebuild_catalogs_from_nested(/*reload_nested_catalogs=*/false); + all_library_->rebuild(/*reload_catalogs=*/false); return all_library_.get(); } @@ -261,8 +249,8 @@ std::string AssetLibraryService::resolve_asset_weak_reference_to_library_path( switch (eAssetLibraryType(asset_reference.asset_library_type)) { case ASSET_LIBRARY_CUSTOM: { - bUserAssetLibrary *custom_lib = - this->find_custom_preferences_asset_library_from_asset_weak_ref(asset_reference); + bUserAssetLibrary *custom_lib = find_custom_preferences_asset_library_from_asset_weak_ref( + asset_reference); if (custom_lib) { library_dirpath = custom_lib->dirpath; break; @@ -270,7 +258,7 @@ std::string AssetLibraryService::resolve_asset_weak_reference_to_library_path( /* A bit of an odd-ball, the API supports loading custom libraries from arbitrary paths (used * by unit tests). So check all loaded on-disk libraries too. */ - AssetLibrary *loaded_custom_lib = this->find_loaded_on_disk_asset_library_from_name( + AssetLibrary *loaded_custom_lib = find_loaded_on_disk_asset_library_from_name( asset_reference.asset_library_identifier); if (!loaded_custom_lib) { return ""; @@ -380,7 +368,7 @@ std::optional AssetLibraryService:: switch (eAssetLibraryType(asset_reference.asset_library_type)) { case ASSET_LIBRARY_LOCAL: { - std::string path_in_file = this->normalize_asset_weak_reference_relative_asset_identifier( + std::string path_in_file = normalize_asset_weak_reference_relative_asset_identifier( asset_reference); const int64_t group_len = int64_t(path_in_file.find(SEP)); @@ -393,14 +381,14 @@ std::optional AssetLibraryService:: } case ASSET_LIBRARY_CUSTOM: case ASSET_LIBRARY_ESSENTIALS: { - std::string full_path = this->resolve_asset_weak_reference_to_full_path(asset_reference); + std::string full_path = resolve_asset_weak_reference_to_full_path(asset_reference); /* #full_path uses native slashes, so others don't need to be considered in the following. */ if (full_path.empty()) { return std::nullopt; } - int64_t blendfile_extension_pos = this->rfind_blendfile_extension(full_path); + int64_t blendfile_extension_pos = rfind_blendfile_extension(full_path); BLI_assert(blendfile_extension_pos != StringRef::not_found); size_t group_pos = full_path.find(SEP, blendfile_extension_pos); @@ -503,7 +491,7 @@ bool AssetLibraryService::has_any_unsaved_catalogs() const foreach_loaded_asset_library( [&has_unsaved_changes](AssetLibrary &library) { - if (library.catalog_service().has_unsaved_changes()) { + if (library.catalog_service->has_unsaved_changes()) { has_unsaved_changes = true; } }, diff --git a/source/blender/asset_system/intern/asset_library_service.hh b/source/blender/asset_system/intern/asset_library_service.hh index 9666123418a..9644549a731 100644 --- a/source/blender/asset_system/intern/asset_library_service.hh +++ b/source/blender/asset_system/intern/asset_library_service.hh @@ -43,24 +43,20 @@ class RuntimeAssetLibrary; class AssetLibraryService { static std::unique_ptr instance_; - /** - * Identify libraries with the library type, and the absolute path of the library's root path + /** Identify libraries with the library type, and the absolute path of the library's root path * (normalize with #normalize_directory_path()!). The type is relevant since the current file - * library may point to the same path as a custom library. - */ + * library may point to the same path as a custom library. */ using OnDiskLibraryIdentifier = std::pair; - /** Mapping of a (type, root path) pair to the AssetLibrary instance. */ + /* Mapping of a (type, root path) pair to the AssetLibrary instance. */ Map> on_disk_libraries_; - /** - * Library without a known path, i.e. the "Current File" library if the file isn't saved yet. If + /** Library without a known path, i.e. the "Current File" library if the file isn't saved yet. If * the file was saved, a valid path for the library can be determined and #on_disk_libraries_ - * above should be used. - */ + * above should be used. */ std::unique_ptr current_file_library_; /** The "all" asset library, merging all other libraries into one. */ std::unique_ptr all_library_; - /** Handlers for managing the life cycle of the AssetLibraryService instance. */ + /* Handlers for managing the life cycle of the AssetLibraryService instance. */ bCallbackFuncStore on_load_callback_store_; static bool atexit_handler_registered_; @@ -92,13 +88,7 @@ class AssetLibraryService { AssetLibrary *get_asset_library_current_file(); /** Get the "All" asset library, which loads all others and merges them into one. */ AssetLibrary *get_asset_library_all(const Main *bmain); - /** - * Tag the "All" asset library as needing to reload catalogs. This should be called when catalog - * data of other asset libraries changes. Note that changes to the catalog definition file on - * disk don't ever affect this "dirty" flag. It only reflects changes from this Blender session. - */ - void tag_all_library_catalogs_dirty(); - void reload_all_library_catalogs_if_dirty(); + void rebuild_all_library(); /** * Return the start position of the last blend-file extension in given path, diff --git a/source/blender/asset_system/intern/asset_representation.cc b/source/blender/asset_system/intern/asset_representation.cc index df6782241f7..0528a1c4c31 100644 --- a/source/blender/asset_system/intern/asset_representation.cc +++ b/source/blender/asset_system/intern/asset_representation.cc @@ -10,6 +10,7 @@ #include "DNA_ID.h" #include "DNA_asset_types.h" +#include "DNA_userdef_types.h" #include "AS_asset_identifier.hh" #include "AS_asset_library.hh" @@ -24,7 +25,7 @@ AssetRepresentation::AssetRepresentation(AssetIdentifier &&identifier, const AssetLibrary &owner_asset_library) : identifier_(identifier), is_local_id_(false), - owner_asset_library_(owner_asset_library), + owner_asset_library_(&owner_asset_library), external_asset_() { external_asset_.name = name; @@ -37,7 +38,7 @@ AssetRepresentation::AssetRepresentation(AssetIdentifier &&identifier, const AssetLibrary &owner_asset_library) : identifier_(identifier), is_local_id_(true), - owner_asset_library_(owner_asset_library), + owner_asset_library_(&owner_asset_library), local_asset_id_(&id) { if (!id.asset_data) { @@ -45,6 +46,18 @@ AssetRepresentation::AssetRepresentation(AssetIdentifier &&identifier, } } +AssetRepresentation::AssetRepresentation(AssetRepresentation &&other) + : identifier_(std::move(other.identifier_)), is_local_id_(other.is_local_id_) +{ + if (is_local_id_) { + local_asset_id_ = other.local_asset_id_; + other.local_asset_id_ = nullptr; + } + else { + external_asset_ = std::move(other.external_asset_); + } +} + AssetRepresentation::~AssetRepresentation() { if (!is_local_id_) { @@ -57,9 +70,13 @@ const AssetIdentifier &AssetRepresentation::get_identifier() const return identifier_; } -AssetWeakReference AssetRepresentation::make_weak_reference() const +AssetWeakReference *AssetRepresentation::make_weak_reference() const { - return AssetWeakReference::make_reference(owner_asset_library_, identifier_); + if (!owner_asset_library_) { + return nullptr; + } + + return AssetWeakReference::make_reference(*owner_asset_library_, identifier_); } StringRefNull AssetRepresentation::get_name() const @@ -87,20 +104,26 @@ AssetMetaData &AssetRepresentation::get_metadata() const std::optional AssetRepresentation::get_import_method() const { - return owner_asset_library_.import_method_; + if (!owner_asset_library_) { + return {}; + } + return owner_asset_library_->import_method_; } bool AssetRepresentation::may_override_import_method() const { - if (!owner_asset_library_.import_method_) { + if (!owner_asset_library_ || !owner_asset_library_->import_method_) { return true; } - return owner_asset_library_.may_override_import_method_; + return owner_asset_library_->may_override_import_method_; } bool AssetRepresentation::get_use_relative_path() const { - return owner_asset_library_.use_relative_path_; + if (!owner_asset_library_) { + return false; + } + return owner_asset_library_->use_relative_path_; } ID *AssetRepresentation::local_id() const @@ -115,7 +138,7 @@ bool AssetRepresentation::is_local_id() const const AssetLibrary &AssetRepresentation::owner_asset_library() const { - return owner_asset_library_; + return *owner_asset_library_; } } // namespace blender::asset_system diff --git a/source/blender/asset_system/intern/asset_storage.cc b/source/blender/asset_system/intern/asset_storage.cc index 9738212d7d8..ecf33f72c95 100644 --- a/source/blender/asset_system/intern/asset_storage.cc +++ b/source/blender/asset_system/intern/asset_storage.cc @@ -43,16 +43,16 @@ bool AssetStorage::remove_asset(AssetRepresentation &asset) return external_assets_.remove_as(&asset); } -void AssetStorage::remap_ids_and_remove_invalid(const bke::id::IDRemapper &mappings) +void AssetStorage::remap_ids_and_remove_invalid(const IDRemapper &mappings) { - Set removed_assets; + Set removed_assets{}; for (auto &asset_ptr : local_id_assets_) { AssetRepresentation &asset = *asset_ptr; BLI_assert(asset.is_local_id()); - const IDRemapperApplyResult result = mappings.apply(&asset.local_asset_id_, - ID_REMAP_APPLY_DEFAULT); + const IDRemapperApplyResult result = BKE_id_remapper_apply( + &mappings, &asset.local_asset_id_, ID_REMAP_APPLY_DEFAULT); /* Entirely remove assets whose ID is unset. We don't want assets with a null ID pointer. */ if (result == ID_REMAP_RESULT_SOURCE_UNASSIGNED) { @@ -61,7 +61,7 @@ void AssetStorage::remap_ids_and_remove_invalid(const bke::id::IDRemapper &mappi } for (AssetRepresentation *asset : removed_assets) { - this->remove_asset(*asset); + remove_asset(*asset); } } diff --git a/source/blender/asset_system/intern/asset_storage.hh b/source/blender/asset_system/intern/asset_storage.hh index 21553e762bb..91de06703fe 100644 --- a/source/blender/asset_system/intern/asset_storage.hh +++ b/source/blender/asset_system/intern/asset_storage.hh @@ -17,10 +17,7 @@ struct AssetMetaData; struct ID; - -namespace blender::bke::id { -class IDRemapper; -} +struct IDRemapper; namespace blender::asset_system { @@ -52,7 +49,7 @@ class AssetStorage { bool remove_asset(AssetRepresentation &asset); /** See #AssetLibrary::remap_ids_and_remove_nulled(). */ - void remap_ids_and_remove_invalid(const blender::bke::id::IDRemapper &mappings); + void remap_ids_and_remove_invalid(const IDRemapper &mappings); }; } // namespace blender::asset_system diff --git a/source/blender/asset_system/tests/asset_catalog_test.cc b/source/blender/asset_system/tests/asset_catalog_test.cc index 1df91369057..21b7aacaa77 100644 --- a/source/blender/asset_system/tests/asset_catalog_test.cc +++ b/source/blender/asset_system/tests/asset_catalog_test.cc @@ -4,8 +4,6 @@ #include "AS_asset_catalog.hh" #include "AS_asset_catalog_tree.hh" -#include "asset_catalog_collection.hh" -#include "asset_catalog_definition_file.hh" #include "BKE_preferences.h" @@ -46,12 +44,12 @@ class TestableAssetCatalogService : public AssetCatalogService { { } - const AssetCatalogDefinitionFile *get_catalog_definition_file() + AssetCatalogDefinitionFile *get_catalog_definition_file() { return AssetCatalogService::get_catalog_definition_file(); } - const OwningAssetCatalogMap &get_deleted_catalogs() const + OwningAssetCatalogMap &get_deleted_catalogs() { return AssetCatalogService::get_deleted_catalogs(); } @@ -69,7 +67,7 @@ class TestableAssetCatalogService : public AssetCatalogService { int64_t count_catalogs_with_path(const CatalogFilePath &path) { int64_t count = 0; - for (const auto &catalog_uptr : get_catalogs().values()) { + for (auto &catalog_uptr : get_catalogs().values()) { if (catalog_uptr->path == path) { count++; } @@ -126,10 +124,9 @@ class AssetCatalogTest : public AssetLibraryTestBase { << "Overwritten CDF should have been backed up."; /* Test that the in-memory CDF has the expected file path. */ - const AssetCatalogDefinitionFile *cdf = service.get_catalog_definition_file(); - std::string native_cdf_path = cdf->file_path; - BLI_path_slash_native(native_cdf_path.data()); - EXPECT_EQ(cdf_toplevel, native_cdf_path); + AssetCatalogDefinitionFile *cdf = service.get_catalog_definition_file(); + BLI_path_slash_native(cdf->file_path.data()); + EXPECT_EQ(cdf_toplevel, cdf->file_path); /* Test that the in-memory catalogs have been merged with the on-disk one. */ AssetCatalogService loaded_service(cdf_toplevel); @@ -268,7 +265,7 @@ TEST_F(AssetCatalogTest, write_single_file) const CatalogFilePath save_to_path = use_temp_path() + AssetCatalogService::DEFAULT_CATALOG_FILENAME; - const AssetCatalogDefinitionFile *cdf = service.get_catalog_definition_file(); + AssetCatalogDefinitionFile *cdf = service.get_catalog_definition_file(); cdf->write_to_disk(save_to_path); AssetCatalogService loaded_service(save_to_path); @@ -296,7 +293,7 @@ TEST_F(AssetCatalogTest, read_write_unicode_filepath) service.load_from_disk(load_from_path); const CatalogFilePath save_to_path = use_temp_path() + "новый.cats.txt"; - const AssetCatalogDefinitionFile *cdf = service.get_catalog_definition_file(); + AssetCatalogDefinitionFile *cdf = service.get_catalog_definition_file(); ASSERT_NE(nullptr, cdf) << "unable to load " << load_from_path; EXPECT_TRUE(cdf->write_to_disk(save_to_path)); @@ -378,7 +375,7 @@ TEST_F(AssetCatalogTest, on_blendfile_save__from_memory_into_empty_directory) EXPECT_TRUE(BLI_exists(expected_cdf_path.c_str())); /* Test that the in-memory CDF has been created, and contains the expected catalog. */ - const AssetCatalogDefinitionFile *cdf = service.get_catalog_definition_file(); + AssetCatalogDefinitionFile *cdf = service.get_catalog_definition_file(); ASSERT_NE(nullptr, cdf); EXPECT_TRUE(cdf->contains(cat->catalog_id)); @@ -413,7 +410,7 @@ TEST_F(AssetCatalogTest, on_blendfile_save__from_memory_into_existing_cdf_and_me << "Overwritten CDF should have been backed up."; /* Test that the in-memory CDF has the expected file path. */ - const AssetCatalogDefinitionFile *cdf = service.get_catalog_definition_file(); + AssetCatalogDefinitionFile *cdf = service.get_catalog_definition_file(); ASSERT_NE(nullptr, cdf); EXPECT_EQ(writable_cdf_file, cdf->file_path); @@ -569,7 +566,7 @@ TEST_F(AssetCatalogTest, delete_catalog_leaf) "path/without/simplename", }; - const AssetCatalogTree &tree = service.catalog_tree(); + AssetCatalogTree *tree = service.get_catalog_tree(); AssetCatalogTreeTestFunctions::expect_tree_items(tree, expected_paths); } @@ -623,7 +620,7 @@ TEST_F(AssetCatalogTest, delete_catalog_parent_by_path) "path/without/simplename", }; - const AssetCatalogTree &tree = service.catalog_tree(); + AssetCatalogTree *tree = service.get_catalog_tree(); AssetCatalogTreeTestFunctions::expect_tree_items(tree, expected_paths); } @@ -636,7 +633,7 @@ TEST_F(AssetCatalogTest, delete_catalog_write_to_disk) service.delete_catalog_by_id_soft(UUID_POSES_ELLIE); const CatalogFilePath save_to_path = use_temp_path(); - const AssetCatalogDefinitionFile *cdf = service.get_catalog_definition_file(); + AssetCatalogDefinitionFile *cdf = service.get_catalog_definition_file(); cdf->write_to_disk(save_to_path + SEP_STR + AssetCatalogService::DEFAULT_CATALOG_FILENAME); AssetCatalogService loaded_service(save_to_path); @@ -1025,7 +1022,7 @@ TEST_F(AssetCatalogTest, create_missing_catalogs_after_loading) EXPECT_TRUE(cat_ruzena->flags.has_unsaved_changes) << "Missing parents should be marked as having changes."; - const AssetCatalogDefinitionFile *cdf = loaded_service.get_catalog_definition_file(); + AssetCatalogDefinitionFile *cdf = loaded_service.get_catalog_definition_file(); ASSERT_NE(nullptr, cdf); EXPECT_TRUE(cdf->contains(cat_char->catalog_id)) << "Missing parents should be saved to a CDF."; EXPECT_TRUE(cdf->contains(cat_ellie->catalog_id)) << "Missing parents should be saved to a CDF."; @@ -1116,9 +1113,9 @@ class TestableAssetCatalogCollection : public AssetCatalogCollection { { return catalog_definition_file_.get(); } - AssetCatalogDefinitionFile *allocate_catalog_definition_file(StringRef file_path) + AssetCatalogDefinitionFile *allocate_catalog_definition_file() { - catalog_definition_file_ = std::make_unique(file_path); + catalog_definition_file_ = std::make_unique(); return get_catalog_definition_file(); } }; @@ -1185,8 +1182,8 @@ TEST_F(AssetCatalogTest, cat_collection_deep_copy__nonempty_cdf) catcoll.get_catalogs().add_new(cat2->catalog_id, std::move(cat2)); catcoll.get_deleted_catalogs().add_new(cat3->catalog_id, std::move(cat3)); - AssetCatalogDefinitionFile *cdf = catcoll.allocate_catalog_definition_file( - "path/to/somewhere.cats.txt"); + AssetCatalogDefinitionFile *cdf = catcoll.allocate_catalog_definition_file(); + cdf->file_path = "path/to/somewhere.cats.txt"; cdf->add_new(cat1_ptr); cdf->add_new(cat2_ptr); cdf->add_new(cat3_ptr); diff --git a/source/blender/asset_system/tests/asset_catalog_tree_test.cc b/source/blender/asset_system/tests/asset_catalog_tree_test.cc index d6001d3b495..bde16fc1ca4 100644 --- a/source/blender/asset_system/tests/asset_catalog_tree_test.cc +++ b/source/blender/asset_system/tests/asset_catalog_tree_test.cc @@ -4,8 +4,6 @@ #include "AS_asset_catalog.hh" #include "AS_asset_catalog_tree.hh" -#include "asset_catalog_collection.hh" -#include "asset_catalog_definition_file.hh" #include "BLI_path_util.h" @@ -24,7 +22,7 @@ TEST_F(AssetCatalogTreeTest, insert_item_into_tree) std::unique_ptr catalog_empty_path = AssetCatalog::from_path(""); tree.insert_item(*catalog_empty_path); - expect_tree_items(tree, {}); + expect_tree_items(&tree, {}); } { @@ -32,12 +30,12 @@ TEST_F(AssetCatalogTreeTest, insert_item_into_tree) std::unique_ptr catalog = AssetCatalog::from_path("item"); tree.insert_item(*catalog); - expect_tree_items(tree, {"item"}); + expect_tree_items(&tree, {"item"}); /* Insert child after parent already exists. */ std::unique_ptr child_catalog = AssetCatalog::from_path("item/child"); tree.insert_item(*catalog); - expect_tree_items(tree, {"item", "item/child"}); + expect_tree_items(&tree, {"item", "item/child"}); std::vector expected_paths; @@ -47,7 +45,7 @@ TEST_F(AssetCatalogTreeTest, insert_item_into_tree) tree.insert_item(*catalog); expected_paths = { "item", "item/child", "item/child/grandchild", "item/child/grandchild/grandgrandchild"}; - expect_tree_items(tree, expected_paths); + expect_tree_items(&tree, expected_paths); std::unique_ptr root_level_catalog = AssetCatalog::from_path("root level"); tree.insert_item(*catalog); @@ -56,7 +54,7 @@ TEST_F(AssetCatalogTreeTest, insert_item_into_tree) "item/child/grandchild", "item/child/grandchild/grandgrandchild", "root level"}; - expect_tree_items(tree, expected_paths); + expect_tree_items(&tree, expected_paths); } { @@ -64,7 +62,7 @@ TEST_F(AssetCatalogTreeTest, insert_item_into_tree) std::unique_ptr catalog = AssetCatalog::from_path("item/child"); tree.insert_item(*catalog); - expect_tree_items(tree, {"item", "item/child"}); + expect_tree_items(&tree, {"item", "item/child"}); } { @@ -72,7 +70,7 @@ TEST_F(AssetCatalogTreeTest, insert_item_into_tree) std::unique_ptr catalog = AssetCatalog::from_path("white space"); tree.insert_item(*catalog); - expect_tree_items(tree, {"white space"}); + expect_tree_items(&tree, {"white space"}); } { @@ -80,7 +78,7 @@ TEST_F(AssetCatalogTreeTest, insert_item_into_tree) std::unique_ptr catalog = AssetCatalog::from_path("/item/white space"); tree.insert_item(*catalog); - expect_tree_items(tree, {"item", "item/white space"}); + expect_tree_items(&tree, {"item", "item/white space"}); } { @@ -88,11 +86,11 @@ TEST_F(AssetCatalogTreeTest, insert_item_into_tree) std::unique_ptr catalog_unicode_path = AssetCatalog::from_path("Ružena"); tree.insert_item(*catalog_unicode_path); - expect_tree_items(tree, {"Ružena"}); + expect_tree_items(&tree, {"Ružena"}); catalog_unicode_path = AssetCatalog::from_path("Ružena/Ružena"); tree.insert_item(*catalog_unicode_path); - expect_tree_items(tree, {"Ružena", "Ružena/Ružena"}); + expect_tree_items(&tree, {"Ružena", "Ružena/Ružena"}); } } @@ -119,7 +117,7 @@ TEST_F(AssetCatalogTreeTest, load_single_file_into_tree) "path/without/simplename", /* From CDF. */ }; - const AssetCatalogTree &tree = service.catalog_tree(); + AssetCatalogTree *tree = service.get_catalog_tree(); expect_tree_items(tree, expected_paths); } @@ -129,13 +127,13 @@ TEST_F(AssetCatalogTreeTest, foreach_in_tree) AssetCatalogTree tree{}; const std::vector no_catalogs{}; - expect_tree_items(tree, no_catalogs); - expect_tree_root_items(tree, no_catalogs); + expect_tree_items(&tree, no_catalogs); + expect_tree_root_items(&tree, no_catalogs); /* Need a root item to check child items. */ std::unique_ptr catalog = AssetCatalog::from_path("something"); tree.insert_item(*catalog); - tree.foreach_root_item([&no_catalogs](const AssetCatalogTreeItem &item) { - expect_tree_item_child_items(item, no_catalogs); + tree.foreach_root_item([&no_catalogs](AssetCatalogTreeItem &item) { + expect_tree_item_child_items(&item, no_catalogs); }); } @@ -143,7 +141,7 @@ TEST_F(AssetCatalogTreeTest, foreach_in_tree) service.load_from_disk(asset_library_root_ + SEP_STR + "blender_assets.cats.txt"); std::vector expected_root_items{{"character", "path"}}; - const AssetCatalogTree &tree = service.catalog_tree(); + AssetCatalogTree *tree = service.get_catalog_tree(); expect_tree_root_items(tree, expected_root_items); /* Test if the direct children of the root item are what's expected. */ @@ -154,8 +152,8 @@ TEST_F(AssetCatalogTreeTest, foreach_in_tree) {"path/without"}, }; int i = 0; - tree.foreach_root_item([&expected_root_child_items, &i](const AssetCatalogTreeItem &item) { - expect_tree_item_child_items(item, expected_root_child_items[i]); + tree->foreach_root_item([&expected_root_child_items, &i](AssetCatalogTreeItem &item) { + expect_tree_item_child_items(&item, expected_root_child_items[i]); i++; }); } diff --git a/source/blender/asset_system/tests/asset_library_service_test.cc b/source/blender/asset_system/tests/asset_library_service_test.cc index 42653ea8ac1..c36f55c1b60 100644 --- a/source/blender/asset_system/tests/asset_library_service_test.cc +++ b/source/blender/asset_system/tests/asset_library_service_test.cc @@ -9,7 +9,7 @@ #include "BLI_string.h" #include "BKE_appdir.hh" -#include "BKE_callbacks.hh" +#include "BKE_callbacks.h" #include "BKE_main.hh" #include "DNA_asset_types.h" @@ -62,7 +62,7 @@ class AssetLibraryServiceTest : public testing::Test { * The returned path ends in a slash. */ CatalogFilePath use_temp_path() { - BKE_tempdir_init(nullptr); + BKE_tempdir_init(""); const CatalogFilePath tempdir = BKE_tempdir_session(); temp_library_path_ = tempdir + "test-temporary-path" + SEP_STR; return temp_library_path_; @@ -173,10 +173,10 @@ TEST_F(AssetLibraryServiceTest, catalogs_loaded) AssetLibraryService *const service = AssetLibraryService::get(); AssetLibrary *const lib = service->get_asset_library_on_disk_custom(__func__, asset_library_root_); - AssetCatalogService &cat_service = lib->catalog_service(); + AssetCatalogService *const cat_service = lib->catalog_service.get(); const bUUID UUID_POSES_ELLIE("df60e1f6-2259-475b-93d9-69a1b4a8db78"); - EXPECT_NE(nullptr, cat_service.find_catalog(UUID_POSES_ELLIE)) + EXPECT_NE(nullptr, cat_service->find_catalog(UUID_POSES_ELLIE)) << "Catalogs should be loaded after getting an asset library from disk."; } @@ -188,21 +188,21 @@ TEST_F(AssetLibraryServiceTest, has_any_unsaved_catalogs) AssetLibrary *const lib = service->get_asset_library_on_disk_custom(__func__, asset_library_root_); - AssetCatalogService &cat_service = lib->catalog_service(); + AssetCatalogService *const cat_service = lib->catalog_service.get(); EXPECT_FALSE(service->has_any_unsaved_catalogs()) << "Unchanged AssetLibrary should have no unsaved catalogs"; const bUUID UUID_POSES_ELLIE("df60e1f6-2259-475b-93d9-69a1b4a8db78"); - cat_service.prune_catalogs_by_id(UUID_POSES_ELLIE); + cat_service->prune_catalogs_by_id(UUID_POSES_ELLIE); EXPECT_FALSE(service->has_any_unsaved_catalogs()) << "Deletion of catalogs via AssetCatalogService should not automatically tag as 'unsaved " "changes'."; const bUUID UUID_POSES_RUZENA("79a4f887-ab60-4bd4-94da-d572e27d6aed"); - AssetCatalog *cat = cat_service.find_catalog(UUID_POSES_RUZENA); + AssetCatalog *cat = cat_service->find_catalog(UUID_POSES_RUZENA); ASSERT_NE(nullptr, cat) << "Catalog " << UUID_POSES_RUZENA << " should be known"; - cat_service.tag_has_unsaved_changes(cat); + cat_service->tag_has_unsaved_changes(cat); EXPECT_TRUE(service->has_any_unsaved_catalogs()) << "Tagging as having unsaved changes of a single catalog service should result in unsaved " "changes being reported."; @@ -224,17 +224,17 @@ TEST_F(AssetLibraryServiceTest, has_any_unsaved_catalogs_after_write) EXPECT_FALSE(service->has_any_unsaved_catalogs()) << "Unchanged AssetLibrary should have no unsaved catalogs"; - AssetCatalogService &cat_service = lib->catalog_service(); - AssetCatalog *cat = cat_service.find_catalog(UUID_POSES_ELLIE); + AssetCatalogService *const cat_service = lib->catalog_service.get(); + AssetCatalog *cat = cat_service->find_catalog(UUID_POSES_ELLIE); - cat_service.tag_has_unsaved_changes(cat); + cat_service->tag_has_unsaved_changes(cat); EXPECT_TRUE(service->has_any_unsaved_catalogs()) << "Tagging as having unsaved changes of a single catalog service should result in unsaved " "changes being reported."; EXPECT_TRUE(cat->flags.has_unsaved_changes); - cat_service.write_to_disk(writable_dir + "dummy_path.blend"); + cat_service->write_to_disk(writable_dir + "dummy_path.blend"); EXPECT_FALSE(service->has_any_unsaved_catalogs()) << "Written AssetCatalogService should have no unsaved catalogs"; EXPECT_FALSE(cat->flags.has_unsaved_changes); diff --git a/source/blender/asset_system/tests/asset_library_test.cc b/source/blender/asset_system/tests/asset_library_test.cc index fa1a8298aae..6afa11c058d 100644 --- a/source/blender/asset_system/tests/asset_library_test.cc +++ b/source/blender/asset_system/tests/asset_library_test.cc @@ -5,7 +5,7 @@ #include "AS_asset_catalog.hh" #include "AS_asset_library.hh" -#include "BKE_callbacks.hh" +#include "BKE_callbacks.h" #include "asset_library_service.hh" @@ -47,13 +47,14 @@ TEST_F(AssetLibraryTest, AS_asset_library_load) ASSERT_NE(nullptr, library); /* Check that it can be cast to the C++ type and has a Catalog Service. */ - const AssetCatalogService &service = library->catalog_service(); + AssetCatalogService *service = library->catalog_service.get(); + ASSERT_NE(nullptr, service); /* Check that the catalogs defined in the library are actually loaded. This just tests one single * catalog, as that indicates the file has been loaded. Testing that loading went OK is for * the asset catalog service tests. */ const bUUID uuid_poses_ellie("df60e1f6-2259-475b-93d9-69a1b4a8db78"); - AssetCatalog *poses_ellie = service.find_catalog(uuid_poses_ellie); + AssetCatalog *poses_ellie = service->find_catalog(uuid_poses_ellie); ASSERT_NE(nullptr, poses_ellie) << "unable to find POSES_ELLIE catalog"; EXPECT_EQ("character/Ellie/poselib", poses_ellie->path.str()); } @@ -72,9 +73,11 @@ TEST_F(AssetLibraryTest, load_nonexistent_directory) ASSERT_NE(nullptr, library); /* Check that it can be cast to the C++ type and has a Catalog Service. */ - AssetCatalogService &service = library->catalog_service(); + AssetCatalogService *service = library->catalog_service.get(); + ASSERT_NE(nullptr, service); + /* Check that the catalog service doesn't have any catalogs. */ - EXPECT_TRUE(service.is_empty()); + EXPECT_TRUE(service->is_empty()); } } // namespace blender::asset_system::tests diff --git a/source/blender/asset_system/tests/asset_library_test_common.hh b/source/blender/asset_system/tests/asset_library_test_common.hh index d64b8075138..d7aecb8a1a0 100644 --- a/source/blender/asset_system/tests/asset_library_test_common.hh +++ b/source/blender/asset_system/tests/asset_library_test_common.hh @@ -13,7 +13,7 @@ #include "asset_library_service.hh" #include "BKE_appdir.hh" -#include "BKE_callbacks.hh" +#include "BKE_callbacks.h" #include "BLI_fileops.h" #include "BLI_path_util.h" @@ -79,7 +79,7 @@ class AssetLibraryTestBase : public testing::Test { * The returned path ends in a slash. */ std::string use_temp_path() { - BKE_tempdir_init(nullptr); + BKE_tempdir_init(""); const std::string tempdir = BKE_tempdir_session(); temp_library_path_ = tempdir + "test-temporary-path" + SEP_STR; return temp_library_path_; @@ -99,7 +99,7 @@ class AssetCatalogTreeTestFunctions { * Recursively iterate over all tree items using #AssetCatalogTree::foreach_item() and check if * the items map exactly to \a expected_paths. */ - static void expect_tree_items(const AssetCatalogTree &tree, + static void expect_tree_items(AssetCatalogTree *tree, const std::vector &expected_paths); /** @@ -107,7 +107,7 @@ class AssetCatalogTreeTestFunctions { * expected_paths. Similar to #assert_expected_tree_items() but calls * #AssetCatalogTree::foreach_root_item() instead of #AssetCatalogTree::foreach_item(). */ - static void expect_tree_root_items(const AssetCatalogTree &tree, + static void expect_tree_root_items(AssetCatalogTree *tree, const std::vector &expected_paths); /** @@ -115,7 +115,7 @@ class AssetCatalogTreeTestFunctions { * expected_paths. Similar to #assert_expected_tree_items() but calls * #AssetCatalogTreeItem::foreach_child() instead of #AssetCatalogTree::foreach_item(). */ - static void expect_tree_item_child_items(const AssetCatalogTreeItem &parent_item, + static void expect_tree_item_child_items(AssetCatalogTreeItem *parent_item, const std::vector &expected_paths); }; @@ -139,10 +139,10 @@ static inline void compare_item_with_path(const AssetCatalogPath &expected_path, } inline void AssetCatalogTreeTestFunctions::expect_tree_items( - const AssetCatalogTree &tree, const std::vector &expected_paths) + AssetCatalogTree *tree, const std::vector &expected_paths) { int i = 0; - tree.foreach_item([&](const AssetCatalogTreeItem &actual_item) { + tree->foreach_item([&](const AssetCatalogTreeItem &actual_item) { ASSERT_LT(i, expected_paths.size()) << "More catalogs in tree than expected; did not expect " << actual_item.catalog_path(); compare_item_with_path(expected_paths[i], actual_item); @@ -151,10 +151,10 @@ inline void AssetCatalogTreeTestFunctions::expect_tree_items( } inline void AssetCatalogTreeTestFunctions::expect_tree_root_items( - const AssetCatalogTree &tree, const std::vector &expected_paths) + AssetCatalogTree *tree, const std::vector &expected_paths) { int i = 0; - tree.foreach_root_item([&](const AssetCatalogTreeItem &actual_item) { + tree->foreach_root_item([&](const AssetCatalogTreeItem &actual_item) { ASSERT_LT(i, expected_paths.size()) << "More catalogs in tree root than expected; did not expect " << actual_item.catalog_path(); @@ -164,10 +164,10 @@ inline void AssetCatalogTreeTestFunctions::expect_tree_root_items( } inline void AssetCatalogTreeTestFunctions::expect_tree_item_child_items( - const AssetCatalogTreeItem &parent_item, const std::vector &expected_paths) + AssetCatalogTreeItem *parent_item, const std::vector &expected_paths) { int i = 0; - parent_item.foreach_child([&](const AssetCatalogTreeItem &actual_item) { + parent_item->foreach_child([&](const AssetCatalogTreeItem &actual_item) { ASSERT_LT(i, expected_paths.size()) << "More catalogs in tree item than expected; did not expect " << actual_item.catalog_path(); diff --git a/source/blender/asset_system/tests/asset_representation_test.cc b/source/blender/asset_system/tests/asset_representation_test.cc index 30aaa5e1e01..93934dc4927 100644 --- a/source/blender/asset_system/tests/asset_representation_test.cc +++ b/source/blender/asset_system/tests/asset_representation_test.cc @@ -48,10 +48,12 @@ TEST_F(AssetRepresentationTest, weak_reference__current_file) AssetRepresentation &asset = add_dummy_asset(*library, "path/to/an/asset"); { - AssetWeakReference weak_ref = asset.make_weak_reference(); - EXPECT_EQ(weak_ref.asset_library_type, ASSET_LIBRARY_LOCAL); - EXPECT_EQ(weak_ref.asset_library_identifier, nullptr); - EXPECT_STREQ(weak_ref.relative_asset_identifier, "path/to/an/asset"); + AssetWeakReference *weak_ref = asset.make_weak_reference(); + EXPECT_EQ(weak_ref->asset_library_type, ASSET_LIBRARY_LOCAL); + EXPECT_EQ(weak_ref->asset_library_identifier, nullptr); + EXPECT_STREQ(weak_ref->relative_asset_identifier, "path/to/an/asset"); + + BKE_asset_weak_reference_free(&weak_ref); } } @@ -63,10 +65,11 @@ TEST_F(AssetRepresentationTest, weak_reference__custom_library) AssetRepresentation &asset = add_dummy_asset(*library, "path/to/an/asset"); { - AssetWeakReference weak_ref = asset.make_weak_reference(); - EXPECT_EQ(weak_ref.asset_library_type, ASSET_LIBRARY_CUSTOM); - EXPECT_STREQ(weak_ref.asset_library_identifier, "My custom lib"); - EXPECT_STREQ(weak_ref.relative_asset_identifier, "path/to/an/asset"); + AssetWeakReference *weak_ref = asset.make_weak_reference(); + EXPECT_EQ(weak_ref->asset_library_type, ASSET_LIBRARY_CUSTOM); + EXPECT_STREQ(weak_ref->asset_library_identifier, "My custom lib"); + EXPECT_STREQ(weak_ref->relative_asset_identifier, "path/to/an/asset"); + BKE_asset_weak_reference_free(&weak_ref); } } @@ -76,10 +79,11 @@ TEST_F(AssetRepresentationTest, weak_reference__resolve_to_full_path__current_fi AssetLibrary *library = get_builtin_library_from_type(ASSET_LIBRARY_LOCAL); AssetRepresentation &asset = add_dummy_asset(*library, "path/to/an/asset"); - AssetWeakReference weak_ref = asset.make_weak_reference(); + AssetWeakReference *weak_ref = asset.make_weak_reference(); - std::string resolved_path = service->resolve_asset_weak_reference_to_full_path(weak_ref); + std::string resolved_path = service->resolve_asset_weak_reference_to_full_path(*weak_ref); EXPECT_EQ(resolved_path, ""); + BKE_asset_weak_reference_free(&weak_ref); } /* #AssetLibraryService::resolve_asset_weak_reference_to_full_path(). */ @@ -90,13 +94,14 @@ TEST_F(AssetRepresentationTest, weak_reference__resolve_to_full_path__custom_lib asset_library_root_); AssetRepresentation &asset = add_dummy_asset(*library, "path/to/an/asset"); - AssetWeakReference weak_ref = asset.make_weak_reference(); + AssetWeakReference *weak_ref = asset.make_weak_reference(); std::string expected_path = utils::normalize_path(asset_library_root_ + "/" + "path/") + "to/an/asset"; - std::string resolved_path = service->resolve_asset_weak_reference_to_full_path(weak_ref); + std::string resolved_path = service->resolve_asset_weak_reference_to_full_path(*weak_ref); EXPECT_EQ(BLI_path_cmp(resolved_path.c_str(), expected_path.c_str()), 0); + BKE_asset_weak_reference_free(&weak_ref); } TEST_F(AssetRepresentationTest, @@ -107,13 +112,14 @@ TEST_F(AssetRepresentationTest, asset_library_root_); AssetRepresentation &asset = add_dummy_asset(*library, "path\\to\\an\\asset"); - AssetWeakReference weak_ref = asset.make_weak_reference(); + AssetWeakReference *weak_ref = asset.make_weak_reference(); std::string expected_path = utils::normalize_path(asset_library_root_ + "\\" + "path\\") + "to\\an\\asset"; - std::string resolved_path = service->resolve_asset_weak_reference_to_full_path(weak_ref); + std::string resolved_path = service->resolve_asset_weak_reference_to_full_path(*weak_ref); EXPECT_EQ(BLI_path_cmp(resolved_path.c_str(), expected_path.c_str()), 0); + BKE_asset_weak_reference_free(&weak_ref); } /* #AssetLibraryService::resolve_asset_weak_reference_to_exploded_path(). */ @@ -123,17 +129,18 @@ TEST_F(AssetRepresentationTest, weak_reference__resolve_to_exploded_path__curren AssetLibrary *library = get_builtin_library_from_type(ASSET_LIBRARY_LOCAL); AssetRepresentation &asset = add_dummy_asset(*library, "path/to/an/asset"); - AssetWeakReference weak_ref = asset.make_weak_reference(); + AssetWeakReference *weak_ref = asset.make_weak_reference(); std::string expected_full_path = utils::normalize_path("path/to/an/asset", 5); std::optional resolved_path = - service->resolve_asset_weak_reference_to_exploded_path(weak_ref); + service->resolve_asset_weak_reference_to_exploded_path(*weak_ref); EXPECT_EQ(*resolved_path->full_path, expected_full_path); EXPECT_EQ(resolved_path->dir_component, ""); EXPECT_EQ(resolved_path->group_component, "path"); /* ID names may contain slashes. */ EXPECT_EQ(resolved_path->name_component, "to/an/asset"); + BKE_asset_weak_reference_free(&weak_ref); } /* #AssetLibraryService::resolve_asset_weak_reference_to_exploded_path(). */ @@ -144,13 +151,13 @@ TEST_F(AssetRepresentationTest, weak_reference__resolve_to_exploded_path__custom asset_library_root_); AssetRepresentation &asset = add_dummy_asset(*library, "some.blend/Material/asset/name"); - AssetWeakReference weak_ref = asset.make_weak_reference(); + AssetWeakReference *weak_ref = asset.make_weak_reference(); std::string expected_full_path = utils::normalize_path(asset_library_root_ + "/some.blend/Material/") + "asset/name"; std::optional resolved_path = - service->resolve_asset_weak_reference_to_exploded_path(weak_ref); + service->resolve_asset_weak_reference_to_exploded_path(*weak_ref); EXPECT_EQ(BLI_path_cmp(resolved_path->full_path->c_str(), expected_full_path.c_str()), 0); EXPECT_EQ(BLI_path_cmp_normalized(std::string(resolved_path->dir_component).c_str(), @@ -159,6 +166,7 @@ TEST_F(AssetRepresentationTest, weak_reference__resolve_to_exploded_path__custom EXPECT_EQ(resolved_path->group_component, "Material"); /* ID names may contain slashes. */ EXPECT_EQ(resolved_path->name_component, "asset/name"); + BKE_asset_weak_reference_free(&weak_ref); } /* #AssetLibraryService::resolve_asset_weak_reference_to_exploded_path(). */ @@ -170,13 +178,13 @@ TEST_F(AssetRepresentationTest, asset_library_root_); AssetRepresentation &asset = add_dummy_asset(*library, "some.blend\\Material\\asset/name"); - AssetWeakReference weak_ref = asset.make_weak_reference(); + AssetWeakReference *weak_ref = asset.make_weak_reference(); std::string expected_full_path = utils::normalize_path(asset_library_root_ + "\\some.blend\\Material\\") + "asset/name"; std::optional resolved_path = - service->resolve_asset_weak_reference_to_exploded_path(weak_ref); + service->resolve_asset_weak_reference_to_exploded_path(*weak_ref); EXPECT_EQ(BLI_path_cmp(resolved_path->full_path->c_str(), expected_full_path.c_str()), 0); EXPECT_EQ(BLI_path_cmp_normalized(std::string(resolved_path->dir_component).c_str(), @@ -185,6 +193,7 @@ TEST_F(AssetRepresentationTest, EXPECT_EQ(resolved_path->group_component, "Material"); /* ID names may contain slashes. */ EXPECT_EQ(resolved_path->name_component, "asset/name"); + BKE_asset_weak_reference_free(&weak_ref); } } // namespace blender::asset_system::tests diff --git a/source/blender/blendthumb/src/blendthumb_png.cc b/source/blender/blendthumb/src/blendthumb_png.cc index 4b979fd776a..bfc448a5d0d 100644 --- a/source/blender/blendthumb/src/blendthumb_png.cc +++ b/source/blender/blendthumb/src/blendthumb_png.cc @@ -49,7 +49,7 @@ static blender::Vector filtered_rows_from_thumb(const Thumbnail *thumb) /* In the image data sent to the compression step, each scan-line is preceded by a filter type * byte containing the numeric code of the filter algorithm used for that scan-line. */ const size_t line_size = thumb->width * 4; - blender::Vector filtered; + blender::Vector filtered{}; size_t final_size = thumb->height * (line_size + 1); filtered.reserve(final_size); for (int i = 0; i < thumb->height; i++) { @@ -88,7 +88,7 @@ std::optional> blendthumb_create_png_data_from_thumb( } /* Create `IDAT` chunk data. */ - blender::Vector image_data; + blender::Vector image_data{}; { auto image_data_opt = zlib_compress(filtered_rows_from_thumb(thumb)); if (image_data_opt == std::nullopt) { @@ -98,7 +98,7 @@ std::optional> blendthumb_create_png_data_from_thumb( } /* Create the IHDR chunk data. */ - blender::Vector ihdr_data; + blender::Vector ihdr_data{}; { const size_t ihdr_data_final_size = 4 + 4 + 5; ihdr_data.reserve(ihdr_data_final_size); @@ -115,7 +115,7 @@ std::optional> blendthumb_create_png_data_from_thumb( } /* Join it all together to create a PNG image. */ - blender::Vector png_buf; + blender::Vector png_buf{}; { const size_t png_buf_final_size = ( /* Header. */ diff --git a/source/blender/blenfont/BLF_api.hh b/source/blender/blenfont/BLF_api.hh index 305a936a38e..4fb0368bdc8 100644 --- a/source/blender/blenfont/BLF_api.hh +++ b/source/blender/blenfont/BLF_api.hh @@ -9,9 +9,7 @@ #pragma once #include "BLI_compiler_attrs.h" -#include "BLI_string_ref.hh" #include "BLI_sys_types.h" -#include "BLI_vector.hh" /* Name of sub-directory inside #BLENDER_DATAFILES that contains font files. */ #define BLF_DATAFILES_FONTS_DIR "fonts" @@ -29,21 +27,21 @@ struct ColorManagedDisplay; struct ResultBLF; struct rcti; -int BLF_init(); -void BLF_exit(); +int BLF_init(void); +void BLF_exit(void); /** * Close any user-loaded fonts that are not used by the Interface. Call when * loading new blend files so that the old fonts are not still taking resources. */ -void BLF_reset_fonts(); +void BLF_reset_fonts(void); -void BLF_cache_clear(); +void BLF_cache_clear(void); /** * Optional cache flushing function, called before #blf_batch_draw. */ -void BLF_cache_flush_set_fn(void (*cache_flush_fn)()); +void BLF_cache_flush_set_fn(void (*cache_flush_fn)(void)); /** * Loads a font, or returns an already loaded font and increments its reference count. @@ -65,7 +63,7 @@ void BLF_unload_mem(const char *name) ATTR_NONNULL(1); #endif void BLF_unload_id(int fontid); -void BLF_unload_all(); +void BLF_unload_all(void); char *BLF_display_name_from_file(const char *filepath) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1); @@ -136,9 +134,9 @@ void BLF_matrix(int fontid, const float m[16]); * Batch draw-calls together as long as * the model-view matrix and the font remain unchanged. */ -void BLF_batch_draw_begin(); -void BLF_batch_draw_flush(); -void BLF_batch_draw_end(); +void BLF_batch_draw_begin(void); +void BLF_batch_draw_flush(void); +void BLF_batch_draw_end(void); /** * Draw the string using the current font. @@ -256,10 +254,6 @@ void BLF_rotation(int fontid, float angle); void BLF_clipping(int fontid, int xmin, int ymin, int xmax, int ymax); void BLF_wordwrap(int fontid, int wrap_width); -blender::Vector BLF_string_wrap(int fontid, - blender::StringRef str, - const int max_pixel_width); - #if BLF_BLUR_ENABLE void BLF_blur(int fontid, int size); #endif @@ -331,7 +325,7 @@ void BLF_default_set(int fontid); /** * Get default font ID so we can pass it to other functions. */ -int BLF_default(); +int BLF_default(void); /** * Draw the string using the default font, size and DPI. */ @@ -344,13 +338,13 @@ void BLF_draw_default_shadowed(float x, float y, float z, const char *str, size_ /** * Set size and DPI, and return default font ID. */ -int BLF_set_default(); +int BLF_set_default(void); /* `blf_font_default.cc` */ int BLF_load_default(bool unique); int BLF_load_mono_default(bool unique); -void BLF_load_font_stack(); +void BLF_load_font_stack(void); #ifndef NDEBUG void BLF_state_print(int fontid); diff --git a/source/blender/blenfont/CMakeLists.txt b/source/blender/blenfont/CMakeLists.txt index 066381d7892..72ed705bb0a 100644 --- a/source/blender/blenfont/CMakeLists.txt +++ b/source/blender/blenfont/CMakeLists.txt @@ -23,6 +23,8 @@ set(SRC intern/blf_font_default.cc intern/blf_glyph.cc intern/blf_thumbs.cc + intern/blf_util.cc + BLF_api.hh intern/blf_internal.hh intern/blf_internal_types.hh diff --git a/source/blender/blenfont/intern/blf.cc b/source/blender/blenfont/intern/blf.cc index 1f1c410b5b7..1f7059cfb62 100644 --- a/source/blender/blenfont/intern/blf.cc +++ b/source/blender/blenfont/intern/blf.cc @@ -935,22 +935,11 @@ void BLF_draw_buffer(int fontid, const char *str, const size_t str_len) BLF_draw_buffer_ex(fontid, str, str_len, nullptr); } -blender::Vector BLF_string_wrap(int fontid, - blender::StringRef str, - const int max_pixel_width) -{ - FontBLF *font = blf_get(fontid); - if (!font) { - return {}; - } - return blf_font_string_wrap(font, str, max_pixel_width); -} - char *BLF_display_name_from_file(const char *filepath) { /* While listing font directories this function can be called simultaneously from a greater * number of threads than we want the FreeType cache to keep open at a time. Therefore open - * with a separate FT_Library object and use FreeType calls directly to avoid any contention. */ + * with own FT_Library object and use FreeType calls directly to avoid any contention. */ char *name = nullptr; FT_Library ft_library; if (FT_Init_FreeType(&ft_library) == FT_Err_Ok) { diff --git a/source/blender/blenfont/intern/blf_font.cc b/source/blender/blenfont/intern/blf_font.cc index 73de5138457..dcd8b550df2 100644 --- a/source/blender/blenfont/intern/blf_font.cc +++ b/source/blender/blenfont/intern/blf_font.cc @@ -37,7 +37,6 @@ #include "BLI_string_cursor_utf8.h" #include "BLI_string_utf8.h" #include "BLI_threads.h" -#include "BLI_vector.hh" #include "BLF_api.hh" @@ -47,7 +46,7 @@ #include "blf_internal.hh" #include "blf_internal_types.hh" -#include "BLI_strict_flags.h" /* Keep last. */ +#include "BLI_strict_flags.h" #ifdef WIN32 # define FT_New_Face FT_New_Face__win32_compat @@ -1086,7 +1085,6 @@ void blf_str_offset_to_glyph_bounds(FontBLF *font, static void blf_font_wrap_apply(FontBLF *font, const char *str, const size_t str_len, - const int max_pixel_width, ResultBLF *r_info, void (*callback)(FontBLF *font, GlyphCacheBLF *gc, @@ -1111,7 +1109,7 @@ static void blf_font_wrap_apply(FontBLF *font, struct WordWrapVars { ft_pix wrap_width; size_t start, last[2]; - } wrap = {max_pixel_width != -1 ? ft_pix_from_int(max_pixel_width) : INT_MAX, 0, {0, 0}}; + } wrap = {font->wrap_width != -1 ? ft_pix_from_int(font->wrap_width) : INT_MAX, 0, {0, 0}}; // printf("%s wrapping (%d, %d) `%s`:\n", __func__, str_len, strlen(str), str); while ((i < str_len) && str[i]) { @@ -1200,8 +1198,7 @@ static void blf_font_draw__wrap_cb(FontBLF *font, } void blf_font_draw__wrap(FontBLF *font, const char *str, const size_t str_len, ResultBLF *r_info) { - blf_font_wrap_apply( - font, str, str_len, font->wrap_width, r_info, blf_font_draw__wrap_cb, nullptr); + blf_font_wrap_apply(font, str, str_len, r_info, blf_font_draw__wrap_cb, nullptr); } /** Utility for #blf_font_boundbox__wrap. */ @@ -1226,8 +1223,7 @@ void blf_font_boundbox__wrap( box->ymin = 32000; box->ymax = -32000; - blf_font_wrap_apply( - font, str, str_len, font->wrap_width, r_info, blf_font_boundbox_wrap_cb, box); + blf_font_wrap_apply(font, str, str_len, r_info, blf_font_boundbox_wrap_cb, box); } /** Utility for #blf_font_draw_buffer__wrap. */ @@ -1245,37 +1241,7 @@ void blf_font_draw_buffer__wrap(FontBLF *font, const size_t str_len, ResultBLF *r_info) { - blf_font_wrap_apply( - font, str, str_len, font->wrap_width, r_info, blf_font_draw_buffer__wrap_cb, nullptr); -} - -/** Wrap a blender::StringRef. */ -static void blf_font_string_wrap_cb(FontBLF * /*font*/, - GlyphCacheBLF * /*gc*/, - const char *str, - const size_t str_len, - ft_pix /*pen_y*/, - void *str_list_ptr) -{ - blender::Vector *list = static_cast *>( - str_list_ptr); - blender::StringRef line(str, str + str_len); - list->append(line); -} - -blender::Vector blf_font_string_wrap(FontBLF *font, - blender::StringRef str, - int max_pixel_width) -{ - blender::Vector list; - blf_font_wrap_apply(font, - str.data(), - size_t(str.size()), - max_pixel_width, - nullptr, - blf_font_string_wrap_cb, - &list); - return list; + blf_font_wrap_apply(font, str, str_len, r_info, blf_font_draw_buffer__wrap_cb, nullptr); } /** \} */ @@ -1410,6 +1376,7 @@ static void blf_font_fill(FontBLF *font) font->char_width = 1.0f; font->char_spacing = 0.0f; + BLI_listbase_clear(&font->cache); font->kerning_cache = nullptr; #if BLF_BLUR_ENABLE font->blur = 0; @@ -1769,7 +1736,7 @@ static FontBLF *blf_font_new_impl(const char *filepath, const size_t mem_size, void *ft_library) { - FontBLF *font = MEM_new(__func__); + FontBLF *font = (FontBLF *)MEM_callocN(sizeof(FontBLF), "blf_font_new"); font->mem_name = mem_name ? BLI_strdup(mem_name) : nullptr; font->filepath = filepath ? BLI_strdup(filepath) : nullptr; @@ -1789,6 +1756,8 @@ static FontBLF *blf_font_new_impl(const char *filepath, font->ft_lib = ft_library ? (FT_Library)ft_library : ft_lib; + BLI_mutex_init(&font->glyph_cache_mutex); + /* If we have static details about this font file, we don't have to load the Face yet. */ bool face_needed = true; @@ -1885,7 +1854,9 @@ void blf_font_free(FontBLF *font) MEM_freeN(font->mem_name); } - MEM_delete(font); + BLI_mutex_end(&font->glyph_cache_mutex); + + MEM_freeN(font); } /** \} */ diff --git a/source/blender/blenfont/intern/blf_glyph.cc b/source/blender/blenfont/intern/blf_glyph.cc index 2db0dd677f1..3fdb2d99db3 100644 --- a/source/blender/blenfont/intern/blf_glyph.cc +++ b/source/blender/blenfont/intern/blf_glyph.cc @@ -38,10 +38,9 @@ #include "blf_internal_types.hh" #include "BLI_math_vector.h" +#include "BLI_strict_flags.h" #include "BLI_string_utf8.h" -#include "BLI_strict_flags.h" /* Keep last. */ - /** * Convert glyph coverage amounts to lightness values. Uses a LUT that perceptually improves * anti-aliasing and results in text that looks a bit fuller and slightly brighter. This should @@ -75,24 +74,28 @@ static float from_16dot16(FT_Fixed value) /** \name Glyph Cache * \{ */ -static GlyphCacheBLF *blf_glyph_cache_find(FontBLF *font) +static GlyphCacheBLF *blf_glyph_cache_find(const FontBLF *font, const float size) { - for (std::unique_ptr &gc : font->cache) { - if (gc->size == font->size && (gc->bold == ((font->flags & BLF_BOLD) != 0)) && + GlyphCacheBLF *gc = (GlyphCacheBLF *)font->cache.first; + while (gc) { + if (gc->size == size && (gc->bold == ((font->flags & BLF_BOLD) != 0)) && (gc->italic == ((font->flags & BLF_ITALIC) != 0)) && (gc->char_weight == font->char_weight) && (gc->char_slant == font->char_slant) && (gc->char_width == font->char_width) && (gc->char_spacing == font->char_spacing)) { - return gc.get(); + return gc; } + gc = gc->next; } return nullptr; } static GlyphCacheBLF *blf_glyph_cache_new(FontBLF *font) { - std::unique_ptr gc = std::make_unique(); + GlyphCacheBLF *gc = (GlyphCacheBLF *)MEM_callocN(sizeof(GlyphCacheBLF), "blf_glyph_cache_new"); + gc->next = nullptr; + gc->prev = nullptr; gc->size = font->size; gc->bold = ((font->flags & BLF_BOLD) != 0); gc->italic = ((font->flags & BLF_ITALIC) != 0); @@ -101,6 +104,8 @@ static GlyphCacheBLF *blf_glyph_cache_new(FontBLF *font) gc->char_width = font->char_width; gc->char_spacing = font->char_spacing; + memset(gc->bucket, 0, sizeof(gc->bucket)); + blf_ensure_size(font); /* Determine ideal fixed-width size for monospaced output. */ @@ -119,16 +124,15 @@ static GlyphCacheBLF *blf_glyph_cache_new(FontBLF *font) gc->fixed_width = 1; } - font->cache.append(std::move(gc)); - - return font->cache.last().get(); + BLI_addhead(&font->cache, gc); + return gc; } GlyphCacheBLF *blf_glyph_cache_acquire(FontBLF *font) { - font->glyph_cache_mutex.lock(); + BLI_mutex_lock(&font->glyph_cache_mutex); - GlyphCacheBLF *gc = blf_glyph_cache_find(font); + GlyphCacheBLF *gc = blf_glyph_cache_find(font, font->size); if (!gc) { gc = blf_glyph_cache_new(font); @@ -139,24 +143,34 @@ GlyphCacheBLF *blf_glyph_cache_acquire(FontBLF *font) void blf_glyph_cache_release(FontBLF *font) { - font->glyph_cache_mutex.unlock(); + BLI_mutex_unlock(&font->glyph_cache_mutex); } -GlyphCacheBLF::~GlyphCacheBLF() +static void blf_glyph_cache_free(GlyphCacheBLF *gc) { - this->glyphs.clear_and_shrink(); - if (this->texture) { - GPU_texture_free(this->texture); + for (uint i = 0; i < ARRAY_SIZE(gc->bucket); i++) { + while (GlyphBLF *g = static_cast(BLI_pophead(&gc->bucket[i]))) { + blf_glyph_free(g); + } } - if (this->bitmap_result) { - MEM_freeN(this->bitmap_result); + if (gc->texture) { + GPU_texture_free(gc->texture); } + if (gc->bitmap_result) { + MEM_freeN(gc->bitmap_result); + } + MEM_freeN(gc); } void blf_glyph_cache_clear(FontBLF *font) { - std::lock_guard lock{font->glyph_cache_mutex}; - font->cache.clear_and_shrink(); + BLI_mutex_lock(&font->glyph_cache_mutex); + + while (GlyphCacheBLF *gc = static_cast(BLI_pophead(&font->cache))) { + blf_glyph_cache_free(gc); + } + + BLI_mutex_unlock(&font->glyph_cache_mutex); } /** @@ -168,10 +182,12 @@ static GlyphBLF *blf_glyph_cache_find_glyph(const GlyphCacheBLF *gc, uint charcode, uint8_t subpixel) { - const std::unique_ptr *ptr = gc->glyphs.lookup_ptr_as( - GlyphCacheKey{charcode, subpixel}); - if (ptr != nullptr) { - return ptr->get(); + GlyphBLF *g = static_cast(gc->bucket[blf_hash(charcode << 6 | subpixel)].first); + while (g) { + if (g->c == charcode && g->subpixel == subpixel) { + return g; + } + g = g->next; } return nullptr; } @@ -223,7 +239,7 @@ static GlyphBLF *blf_glyph_cache_add_glyph(FontBLF *font, FT_UInt glyph_index, uint8_t subpixel) { - std::unique_ptr g = std::make_unique(); + GlyphBLF *g = (GlyphBLF *)MEM_callocN(sizeof(GlyphBLF), "blf_glyph_get"); g->c = charcode; g->idx = glyph_index; g->advance_x = (ft_pix)glyph->advance.x; @@ -336,9 +352,9 @@ static GlyphBLF *blf_glyph_cache_add_glyph(FontBLF *font, } } - GlyphCacheKey key = {charcode, subpixel}; - gc->glyphs.add(key, std::move(g)); - return gc->glyphs.lookup(key).get(); + BLI_addhead(&(gc->bucket[blf_hash(g->c << 6 | subpixel)]), g); + + return g; } /** \} */ @@ -1269,7 +1285,10 @@ static FT_GlyphSlot blf_glyph_render(FontBLF *settings_font, return nullptr; } -GlyphBLF *blf_glyph_ensure(FontBLF *font, GlyphCacheBLF *gc, const uint charcode, uint8_t subpixel) +static GlyphBLF *blf_glyph_ensure_ex(FontBLF *font, + GlyphCacheBLF *gc, + const uint charcode, + uint8_t subpixel) { GlyphBLF *g = blf_glyph_cache_find_glyph(gc, charcode, subpixel); if (g) { @@ -1295,6 +1314,11 @@ GlyphBLF *blf_glyph_ensure(FontBLF *font, GlyphCacheBLF *gc, const uint charcode return g; } +GlyphBLF *blf_glyph_ensure(FontBLF *font, GlyphCacheBLF *gc, const uint charcode) +{ + return blf_glyph_ensure_ex(font, gc, charcode, 0); +} + #ifdef BLF_SUBPIXEL_AA GlyphBLF *blf_glyph_ensure_subpixel(FontBLF *font, GlyphCacheBLF *gc, GlyphBLF *g, int32_t pen_x) { @@ -1312,17 +1336,18 @@ GlyphBLF *blf_glyph_ensure_subpixel(FontBLF *font, GlyphCacheBLF *gc, GlyphBLF * const uint8_t subpixel = uint8_t(pen_x & ((font->size > 16.0f) ? 32L : 48L)); if (g->subpixel != subpixel) { - g = blf_glyph_ensure(font, gc, g->c, subpixel); + g = blf_glyph_ensure_ex(font, gc, g->c, subpixel); } return g; } #endif -GlyphBLF::~GlyphBLF() +void blf_glyph_free(GlyphBLF *g) { - if (this->bitmap) { - MEM_freeN(this->bitmap); + if (g->bitmap) { + MEM_freeN(g->bitmap); } + MEM_freeN(g); } /** \} */ diff --git a/source/blender/blenfont/intern/blf_internal.hh b/source/blender/blenfont/intern/blf_internal.hh index 85775454f9f..5c0bafa2d89 100644 --- a/source/blender/blenfont/intern/blf_internal.hh +++ b/source/blender/blenfont/intern/blf_internal.hh @@ -8,9 +8,6 @@ #pragma once -#include "BLI_string_ref.hh" -#include "BLI_vector.hh" - struct FontBLF; struct GlyphBLF; struct GlyphCacheBLF; @@ -52,16 +49,18 @@ struct rcti; extern struct FontBLF *global_font[BLF_MAX_FONT]; void blf_batch_draw_begin(struct FontBLF *font); -void blf_batch_draw(); +void blf_batch_draw(void); +unsigned int blf_next_p2(unsigned int x); +unsigned int blf_hash(unsigned int val); /** * 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 *filepath); -int blf_font_init(); -void blf_font_exit(); +int blf_font_init(void); +void blf_font_exit(void); bool blf_font_id_is_valid(int fontid); @@ -77,7 +76,7 @@ bool blf_ensure_face(struct FontBLF *font); void blf_ensure_size(struct FontBLF *font); void blf_draw_buffer__start(struct FontBLF *font); -void blf_draw_buffer__end(); +void blf_draw_buffer__end(void); struct FontBLF *blf_font_new_from_filepath(const char *filepath); struct FontBLF *blf_font_new_from_mem(const char *name, const unsigned char *mem, size_t mem_size); @@ -97,10 +96,6 @@ void blf_font_draw__wrap(struct FontBLF *font, size_t str_len, struct ResultBLF *r_info); -blender::Vector blf_font_string_wrap(FontBLF *font, - blender::StringRef str, - int max_pixel_width); - /** * Use fixed column width, but an utf8 character may occupy multiple columns. */ @@ -178,10 +173,7 @@ void blf_glyph_cache_clear(struct FontBLF *font); /** * Create (or load from cache) a fully-rendered bitmap glyph. */ -struct GlyphBLF *blf_glyph_ensure(struct FontBLF *font, - struct GlyphCacheBLF *gc, - uint charcode, - uint8_t subpixel = 0); +struct GlyphBLF *blf_glyph_ensure(struct FontBLF *font, struct GlyphCacheBLF *gc, uint charcode); #ifdef BLF_SUBPIXEL_AA struct GlyphBLF *blf_glyph_ensure_subpixel(struct FontBLF *font, @@ -198,6 +190,7 @@ float blf_character_to_curves(FontBLF *font, struct ListBase *nurbsbase, const float scale); +void blf_glyph_free(struct GlyphBLF *g); void blf_glyph_draw( struct FontBLF *font, struct GlyphCacheBLF *gc, struct GlyphBLF *g, int x, int y); diff --git a/source/blender/blenfont/intern/blf_internal_types.hh b/source/blender/blenfont/intern/blf_internal_types.hh index 571cfb946d6..b92e951894d 100644 --- a/source/blender/blenfont/intern/blf_internal_types.hh +++ b/source/blender/blenfont/intern/blf_internal_types.hh @@ -8,27 +8,16 @@ #pragma once -#include - -#include "BLI_map.hh" -#include "BLI_vector.hh" - #include "GPU_texture.h" #include "GPU_vertex_buffer.h" -struct ColorManagedDisplay; -struct FontBLF; -struct GPUBatch; -struct GPUVertBuf; -struct GPUVertBufRaw; - #include FT_MULTIPLE_MASTERS_H /* Variable font support. */ /** Maximum variation axes per font. */ #define BLF_VARIATIONS_MAX 16 #define MAKE_DVAR_TAG(a, b, c, d) \ - ((uint32_t(a) << 24u) | (uint32_t(b) << 16u) | (uint32_t(c) << 8u) | (uint32_t(d))) + (((uint32_t)a << 24u) | ((uint32_t)b << 16u) | ((uint32_t)c << 8u) | ((uint32_t)d)) #define BLF_VARIATION_AXIS_WEIGHT MAKE_DVAR_TAG('w', 'g', 'h', 't') /* 'wght' weight axis. */ #define BLF_VARIATION_AXIS_SLANT MAKE_DVAR_TAG('s', 'l', 'n', 't') /* 'slnt' slant axis. */ @@ -55,27 +44,27 @@ typedef int32_t ft_pix; #define FT_PIX_ROUND(x) FT_PIX_FLOOR((x) + 32) #define FT_PIX_CEIL(x) ((x) + 63) -inline int ft_pix_to_int(ft_pix v) +BLI_INLINE int ft_pix_to_int(ft_pix v) { - return int(v >> 6); + return (int)(v >> 6); } -inline int ft_pix_to_int_floor(ft_pix v) +BLI_INLINE int ft_pix_to_int_floor(ft_pix v) { - return int(v >> 6); /* No need for explicit floor as the bits are removed when shifting. */ + return (int)(v >> 6); /* No need for explicit floor as the bits are removed when shifting. */ } -inline int ft_pix_to_int_ceil(ft_pix v) +BLI_INLINE int ft_pix_to_int_ceil(ft_pix v) { - return int(FT_PIX_CEIL(v) >> 6); + return (int)(FT_PIX_CEIL(v) >> 6); } -inline ft_pix ft_pix_from_int(int v) +BLI_INLINE ft_pix ft_pix_from_int(int v) { return v * 64; } -inline ft_pix ft_pix_from_float(float v) +BLI_INLINE ft_pix ft_pix_from_float(float v) { return lroundf(v * 64.0f); } @@ -90,12 +79,12 @@ inline ft_pix ft_pix_from_float(float v) /** A value in the kerning cache that indicates it is not yet set. */ #define KERNING_ENTRY_UNSET INT_MAX -struct BatchBLF { +typedef struct BatchBLF { /** Can only batch glyph from the same font. */ - FontBLF *font; - GPUBatch *batch; - GPUVertBuf *verts; - GPUVertBufRaw pos_step, col_step, offset_step, glyph_size_step, glyph_comp_len_step, + struct FontBLF *font; + struct GPUBatch *batch; + struct GPUVertBuf *verts; + struct GPUVertBufRaw pos_step, col_step, offset_step, glyph_size_step, glyph_comp_len_step, glyph_mode_step; unsigned int pos_loc, col_loc, offset_loc, glyph_size_loc, glyph_comp_len_loc, glyph_mode_loc; unsigned int glyph_len; @@ -104,33 +93,23 @@ struct BatchBLF { /* Previous call `modelmatrix`. */ float mat[4][4]; bool enabled, active, simple_shader; - GlyphCacheBLF *glyph_cache; -}; + struct GlyphCacheBLF *glyph_cache; +} BatchBLF; extern BatchBLF g_batch; -struct KerningCacheBLF { +typedef struct KerningCacheBLF { /** * Cache a ascii glyph pairs. Only store the x offset we are interested in, * instead of the full #FT_Vector since it's not used for drawing at the moment. */ int ascii_table[KERNING_CACHE_TABLE_SIZE][KERNING_CACHE_TABLE_SIZE]; -}; +} KerningCacheBLF; -struct GlyphCacheKey { - uint charcode; - uint8_t subpixel; - friend bool operator==(const GlyphCacheKey &a, const GlyphCacheKey &b) - { - return a.charcode == b.charcode && a.subpixel == b.subpixel; - } - uint64_t hash() const - { - return blender::get_default_hash(charcode, subpixel); - } -}; +typedef struct GlyphCacheBLF { + struct GlyphCacheBLF *next; + struct GlyphCacheBLF *prev; -struct GlyphCacheBLF { /** Font size. */ float size; @@ -146,7 +125,7 @@ struct GlyphCacheBLF { int fixed_width; /** The glyphs. */ - blender::Map> glyphs; + ListBase bucket[257]; /** Texture array, to draw the glyphs. */ GPUTexture *texture; @@ -155,10 +134,12 @@ struct GlyphCacheBLF { int bitmap_len_landed; int bitmap_len_alloc; - ~GlyphCacheBLF(); -}; +} GlyphCacheBLF; + +typedef struct GlyphBLF { + struct GlyphBLF *next; + struct GlyphBLF *prev; -struct GlyphBLF { /** The character, as UTF-32. */ unsigned int c; @@ -202,12 +183,10 @@ struct GlyphBLF { */ int pos[2]; - GlyphCacheBLF *glyph_cache; + struct GlyphCacheBLF *glyph_cache; +} GlyphBLF; - ~GlyphBLF(); -}; - -struct FontBufInfoBLF { +typedef struct FontBufInfoBLF { /** For draw to buffer, always set this to NULL after finish! */ float *fbuf; @@ -221,16 +200,17 @@ struct FontBufInfoBLF { int ch; /** Display device used for color management. */ - ColorManagedDisplay *display; + struct ColorManagedDisplay *display; /** The color, the alphas is get from the glyph! (color is sRGB space). */ float col_init[4]; /** Cached conversion from 'col_init'. */ unsigned char col_char[4]; float col_float[4]; -}; -struct FontMetrics { +} FontBufInfoBLF; + +typedef struct FontMetrics { /** Indicate that these values have been properly loaded. */ bool valid; /** This font's default weight, 100-900, 400 is normal. */ @@ -294,9 +274,9 @@ struct FontMetrics { short superscript_xoffset; /** Positive (!) number of font units below baseline for subscript characters. */ short superscript_yoffset; -}; +} FontMetrics; -struct FontBLF { +typedef struct FontBLF { /** Full path to font file or NULL if from memory. */ char *filepath; @@ -377,7 +357,7 @@ struct FontBLF { * List of glyph caches (#GlyphCacheBLF) for this font for size, DPI, bold, italic. * Use blf_glyph_cache_acquire(font) and blf_glyph_cache_release(font) to access cache! */ - blender::Vector> cache; + ListBase cache; /** Cache of unscaled kerning values. Will be NULL if font does not have kerning. */ KerningCacheBLF *kerning_cache; @@ -401,5 +381,5 @@ struct FontBLF { FontBufInfoBLF buf_info; /** Mutex lock for glyph cache. */ - std::mutex glyph_cache_mutex; -}; + ThreadMutex glyph_cache_mutex; +} FontBLF; diff --git a/source/blender/blenfont/intern/blf_thumbs.cc b/source/blender/blenfont/intern/blf_thumbs.cc index 69662fdf11f..3733c0df12f 100644 --- a/source/blender/blenfont/intern/blf_thumbs.cc +++ b/source/blender/blenfont/intern/blf_thumbs.cc @@ -33,7 +33,7 @@ #include "BLF_api.hh" -#include "BLI_strict_flags.h" /* Keep last. */ +#include "BLI_strict_flags.h" /* Maximum length of text sample in char32_t, including nullptr terminator. */ #define BLF_SAMPLE_LEN 5 diff --git a/source/blender/blenfont/intern/blf_util.cc b/source/blender/blenfont/intern/blf_util.cc new file mode 100644 index 00000000000..5dd1e82ebdc --- /dev/null +++ b/source/blender/blenfont/intern/blf_util.cc @@ -0,0 +1,43 @@ +/* SPDX-FileCopyrightText: 2009 Blender Authors + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +/** \file + * \ingroup blf + * + * Internal utility API for BLF. + */ + +#include +#include +#include + +#include "BLI_utildefines.h" + +#include "blf_internal.hh" + +uint blf_next_p2(uint x) +{ + x -= 1; + x |= (x >> 16); + x |= (x >> 8); + x |= (x >> 4); + x |= (x >> 2); + x |= (x >> 1); + x += 1; + return x; +} + +uint blf_hash(uint val) +{ + uint key; + + key = val; + key += ~(key << 16); + key ^= (key >> 5); + key += (key << 3); + key ^= (key >> 13); + key += ~(key << 9); + key ^= (key >> 17); + return key % 257; +} diff --git a/source/blender/blenkernel/BKE_DerivedMesh.hh b/source/blender/blenkernel/BKE_DerivedMesh.hh index 234362405fe..139bf33b7be 100644 --- a/source/blender/blenkernel/BKE_DerivedMesh.hh +++ b/source/blender/blenkernel/BKE_DerivedMesh.hh @@ -58,6 +58,8 @@ struct CCGElem; struct CCGKey; struct CustomData_MeshMasks; struct Depsgraph; +struct vec2i; +struct MFace; struct Mesh; struct ModifierData; struct Object; @@ -95,7 +97,7 @@ struct DerivedMesh { * \warning The real return type is `float(*)[3]`. */ float *(*getVertArray)(DerivedMesh *dm); - blender::int2 *(*getEdgeArray)(DerivedMesh *dm); + vec2i *(*getEdgeArray)(DerivedMesh *dm); int *(*getCornerVertArray)(DerivedMesh *dm); int *(*getCornerEdgeArray)(DerivedMesh *dm); int *(*getPolyArray)(DerivedMesh *dm); @@ -104,7 +106,7 @@ struct DerivedMesh { * *{vert/edge/face}_r (must point to a buffer large enough) */ void (*copyVertArray)(DerivedMesh *dm, float (*r_positions)[3]); - void (*copyEdgeArray)(DerivedMesh *dm, blender::int2 *r_edge); + void (*copyEdgeArray)(DerivedMesh *dm, vec2i *r_edge); void (*copyCornerVertArray)(DerivedMesh *dm, int *r_corner_verts); void (*copyCornerEdgeArray)(DerivedMesh *dm, int *r_corner_edges); void (*copyPolyArray)(DerivedMesh *dm, int *r_face_offsets); @@ -124,6 +126,7 @@ struct DerivedMesh { CCGElem **(*getGridData)(DerivedMesh *dm); int *(*getGridOffset)(DerivedMesh *dm); void (*getGridKey)(DerivedMesh *dm, CCGKey *key); + unsigned int **(*getGridHidden)(DerivedMesh *dm); /* Direct Access Operations * - Can be undefined @@ -210,7 +213,7 @@ void DM_interp_vert_data(const DerivedMesh *source, int count, int dest_index); -void mesh_get_mapped_verts_coords(Mesh *mesh_eval, blender::MutableSpan r_cos); +void mesh_get_mapped_verts_coords(Mesh *me_eval, blender::MutableSpan r_cos); /** * Same as above but won't use render settings. diff --git a/source/blender/blenkernel/BKE_anim_data.hh b/source/blender/blenkernel/BKE_anim_data.h similarity index 54% rename from source/blender/blenkernel/BKE_anim_data.hh rename to source/blender/blenkernel/BKE_anim_data.h index d636ec2e0a4..5604ebb1803 100644 --- a/source/blender/blenkernel/BKE_anim_data.hh +++ b/source/blender/blenkernel/BKE_anim_data.h @@ -8,15 +8,17 @@ * \ingroup bke */ -#include - #include "BLI_sys_types.h" /* for bool */ +#ifdef __cplusplus +extern "C" { +#endif + struct AnimData; struct BlendDataReader; +struct BlendLibReader; struct BlendWriter; struct ID; -struct Library; struct LibraryForeachIDData; struct Main; struct ReportList; @@ -29,17 +31,17 @@ struct bAction; * Check if the given ID-block can have AnimData. */ bool id_type_can_have_animdata(short id_type); -bool id_can_have_animdata(const ID *id); +bool id_can_have_animdata(const struct ID *id); /** * Get #AnimData from the given ID-block. */ -AnimData *BKE_animdata_from_id(const ID *id); +struct AnimData *BKE_animdata_from_id(const struct ID *id); /** * Ensure #AnimData exists in the given ID-block (when supported). */ -AnimData *BKE_animdata_ensure_id(ID *id); +struct AnimData *BKE_animdata_ensure_id(struct ID *id); /** * Set active action used by AnimData from the given ID-block. @@ -53,75 +55,58 @@ AnimData *BKE_animdata_ensure_id(ID *id); * * \return true when the action was successfully updated, false otherwise. */ -bool BKE_animdata_set_action(ReportList *reports, ID *id, bAction *act); +bool BKE_animdata_set_action(struct ReportList *reports, struct ID *id, struct bAction *act); /** * Same as BKE_animdata_set_action(), except sets `tmpact` instead of `action`. */ -bool BKE_animdata_set_tmpact(ReportList *reports, ID *id, bAction *act); +bool BKE_animdata_set_tmpact(struct ReportList *reports, struct ID *id, struct bAction *act); -bool BKE_animdata_action_editable(const AnimData *adt); +bool BKE_animdata_action_editable(const struct AnimData *adt); /** * Ensure that the action's idroot is set correctly given the ID type of the owner. * Return true if it is, false if it was already set to an incompatible type. */ -bool BKE_animdata_action_ensure_idroot(const ID *owner, bAction *action); +bool BKE_animdata_action_ensure_idroot(const struct ID *owner, struct bAction *action); /** * Free AnimData used by the nominated ID-block, and clear ID-block's AnimData pointer. */ -void BKE_animdata_free(ID *id, bool do_id_user); +void BKE_animdata_free(struct ID *id, bool do_id_user); /** * Return true if the ID-block has non-empty AnimData. */ -bool BKE_animdata_id_is_animated(const ID *id); +bool BKE_animdata_id_is_animated(const struct ID *id); /** * Callback used by lib_query to walk over all ID usages * (mimics `foreach_id` callback of #IDTypeInfo structure). */ -void BKE_animdata_foreach_id(AnimData *adt, LibraryForeachIDData *data); +void BKE_animdata_foreach_id(struct AnimData *adt, struct LibraryForeachIDData *data); /** * Make a copy of the given AnimData - to be used when copying data-blocks. - * - * \note Regarding handling of IDs managed by the #AnimData struct, this function follows the - * behaviors of the generic #BKE_id_copy_ex, please see its documentation for more details. - * - * \param flag: Control ID pointers management, see LIB_ID_CREATE_.../LIB_ID_COPY_... flags in - * `BKE_lib_id.hh`. - * + * \param flag: Control ID pointers management, + * see LIB_ID_CREATE_.../LIB_ID_COPY_... flags in BKE_lib_id.hh * \return The copied animdata. */ -AnimData *BKE_animdata_copy(Main *bmain, AnimData *adt, int flag); - -/** - * Same as #BKE_animdata_copy, but allows to duplicate Action IDs into a library. - * - * \param owner_library the Library to 'assign' the newly created ID to. Use `nullptr` to make ID - * not use any library (i.e. become a local ID). Use `std::nullopt` for default behavior (i.e. - * behavior of the #BKE_animdata_copy function). - */ -AnimData *BKE_animdata_copy_in_lib(Main *bmain, - std::optional owner_library, - AnimData *adt, - int flag); +struct AnimData *BKE_animdata_copy(struct Main *bmain, struct AnimData *adt, int flag); /** * \param flag: Control ID pointers management, * see LIB_ID_CREATE_.../LIB_ID_COPY_... flags in BKE_lib_id.hh * \return true is successfully copied. */ -bool BKE_animdata_copy_id(Main *bmain, ID *id_to, ID *id_from, int flag); +bool BKE_animdata_copy_id(struct Main *bmain, struct ID *id_to, struct ID *id_from, int flag); /** * Copy AnimData Actions. */ -void BKE_animdata_copy_id_action(Main *bmain, ID *id); +void BKE_animdata_copy_id_action(struct Main *bmain, struct ID *id); -void BKE_animdata_duplicate_id_action(Main *bmain, ID *id, uint duplicate_flags); +void BKE_animdata_duplicate_id_action(struct Main *bmain, struct ID *id, uint duplicate_flags); /* Merge copies of data from source AnimData block */ typedef enum eAnimData_MergeCopy_Modes { @@ -138,8 +123,15 @@ typedef enum eAnimData_MergeCopy_Modes { /** * Merge copies of the data from the src AnimData into the destination AnimData. */ -void BKE_animdata_merge_copy( - Main *bmain, ID *dst_id, ID *src_id, eAnimData_MergeCopy_Modes action_mode, bool fix_drivers); +void BKE_animdata_merge_copy(struct Main *bmain, + struct ID *dst_id, + struct ID *src_id, + eAnimData_MergeCopy_Modes action_mode, + bool fix_drivers); -void BKE_animdata_blend_write(BlendWriter *writer, ID *id); -void BKE_animdata_blend_read_data(BlendDataReader *reader, ID *id); +void BKE_animdata_blend_write(struct BlendWriter *writer, struct ID *id); +void BKE_animdata_blend_read_data(struct BlendDataReader *reader, struct ID *id); + +#ifdef __cplusplus +} +#endif diff --git a/source/blender/blenkernel/BKE_animation.hh b/source/blender/blenkernel/BKE_animation.hh deleted file mode 100644 index cc245765f36..00000000000 --- a/source/blender/blenkernel/BKE_animation.hh +++ /dev/null @@ -1,17 +0,0 @@ -/* SPDX-FileCopyrightText: 2024 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup bke - * - * This file only contains the memory management functions for the Animation - * data-block. For all other functionality, see `source/blender/animrig`. - */ - -#pragma once - -struct Animation; -struct Main; - -Animation *BKE_animation_add(Main *bmain, const char name[]); diff --git a/source/blender/blenkernel/BKE_animsys.h b/source/blender/blenkernel/BKE_animsys.h index 284f9bb0b23..a7ccaf4fd00 100644 --- a/source/blender/blenkernel/BKE_animsys.h +++ b/source/blender/blenkernel/BKE_animsys.h @@ -8,7 +8,7 @@ * \ingroup bke */ -#include "BLI_bit_vector.hh" +#include "BLI_bitmap.h" #include "BLI_span.hh" #include "BLI_sys_types.h" /* for bool */ @@ -18,6 +18,7 @@ extern "C" { struct AnimData; struct BlendDataReader; +struct BlendLibReader; struct BlendWriter; struct Depsgraph; struct FCurve; @@ -264,7 +265,7 @@ void BKE_animsys_nla_remap_keyframe_values(struct NlaKeyframingContext *context, int index, const struct AnimationEvalContext *anim_eval_context, bool *r_force_all, - blender::BitVector<> &r_successful_remaps); + BLI_bitmap *r_successful_remaps); /** * Free all cached contexts from the list. diff --git a/source/blender/blenkernel/BKE_appdir.hh b/source/blender/blenkernel/BKE_appdir.hh index aee08f0a9c0..528cb849b6e 100644 --- a/source/blender/blenkernel/BKE_appdir.hh +++ b/source/blender/blenkernel/BKE_appdir.hh @@ -28,8 +28,8 @@ struct ListBase; * Without this any callers to this module that run early on, * will miss out on changes from parsing arguments. */ -void BKE_appdir_init(); -void BKE_appdir_exit(); +void BKE_appdir_init(void); +void BKE_appdir_exit(void); /** * Get the folder that's the "natural" starting point for browsing files on an OS. @@ -39,15 +39,15 @@ void BKE_appdir_exit(); * \note On Windows `Users/{MyUserName}/Documents` is used as it's the default location to save * documents. */ -const char *BKE_appdir_folder_default() ATTR_WARN_UNUSED_RESULT; -const char *BKE_appdir_folder_root() ATTR_WARN_UNUSED_RESULT ATTR_RETURNS_NONNULL; -const char *BKE_appdir_folder_default_or_root() ATTR_WARN_UNUSED_RESULT ATTR_RETURNS_NONNULL; +const char *BKE_appdir_folder_default(void) ATTR_WARN_UNUSED_RESULT; +const char *BKE_appdir_folder_root(void) ATTR_WARN_UNUSED_RESULT ATTR_RETURNS_NONNULL; +const char *BKE_appdir_folder_default_or_root(void) ATTR_WARN_UNUSED_RESULT ATTR_RETURNS_NONNULL; /** * Get the user's home directory, i.e. * - Unix: `$HOME` * - Windows: `%userprofile%` */ -const char *BKE_appdir_folder_home(); +const char *BKE_appdir_folder_home(void); /** * Get the user's document directory, i.e. * - Linux: `$HOME/Documents` @@ -104,11 +104,11 @@ std::optional BKE_appdir_resource_path_id(int folder_id, bool check * Check if this is an install with user files kept together * with the Blender executable and its installation files. */ -bool BKE_appdir_app_is_portable_install(); +bool BKE_appdir_app_is_portable_install(void); /** * Return true if templates exist */ -bool BKE_appdir_app_template_any(); +bool BKE_appdir_app_template_any(void); bool BKE_appdir_app_template_id_search(const char *app_template, char *path, size_t path_maxncpy) ATTR_NONNULL(1); bool BKE_appdir_app_template_has_userpref(const char *app_template) ATTR_NONNULL(1); @@ -122,11 +122,11 @@ void BKE_appdir_program_path_init(const char *argv0) ATTR_NONNULL(1); /** * Path to executable */ -const char *BKE_appdir_program_path() ATTR_WARN_UNUSED_RESULT ATTR_RETURNS_NONNULL; +const char *BKE_appdir_program_path(void) ATTR_WARN_UNUSED_RESULT ATTR_RETURNS_NONNULL; /** * Path to directory of executable */ -const char *BKE_appdir_program_dir() ATTR_WARN_UNUSED_RESULT ATTR_RETURNS_NONNULL; +const char *BKE_appdir_program_dir(void) ATTR_WARN_UNUSED_RESULT ATTR_RETURNS_NONNULL; /** * Gets a good default directory for fonts. @@ -149,15 +149,15 @@ void BKE_tempdir_init(const char *userdir); /** * Path to persistent temporary directory (with trailing slash) */ -const char *BKE_tempdir_base() ATTR_WARN_UNUSED_RESULT ATTR_RETURNS_NONNULL; +const char *BKE_tempdir_base(void) ATTR_WARN_UNUSED_RESULT ATTR_RETURNS_NONNULL; /** * Path to temporary directory (with trailing slash) */ -const char *BKE_tempdir_session() ATTR_WARN_UNUSED_RESULT ATTR_RETURNS_NONNULL; +const char *BKE_tempdir_session(void) ATTR_WARN_UNUSED_RESULT ATTR_RETURNS_NONNULL; /** * Delete content of this instance's temp dir. */ -void BKE_tempdir_session_purge(); +void BKE_tempdir_session_purge(void); /* folder_id */ enum { @@ -176,7 +176,7 @@ enum { BLENDER_SYSTEM_PYTHON = 54, }; -/** For #BKE_appdir_folder_id_version only. */ +/* for BKE_appdir_folder_id_version only */ enum { BLENDER_RESOURCE_PATH_USER = 0, BLENDER_RESOURCE_PATH_LOCAL = 1, diff --git a/source/blender/blenkernel/BKE_armature.hh b/source/blender/blenkernel/BKE_armature.hh index 35511f563ad..6a329b966d2 100644 --- a/source/blender/blenkernel/BKE_armature.hh +++ b/source/blender/blenkernel/BKE_armature.hh @@ -11,7 +11,6 @@ #include "BLI_bounds_types.hh" #include "BLI_function_ref.hh" #include "BLI_listbase.h" -#include "BLI_math_matrix_types.hh" #include "BLI_math_vector_types.hh" #include "BLI_set.hh" @@ -34,7 +33,6 @@ struct bConstraint; struct bGPDstroke; struct bPose; struct bPoseChannel; -struct MDeformVert; struct EditBone { EditBone *next, *prev; @@ -653,16 +651,6 @@ void BKE_armature_deform_coords_with_gpencil_stroke(const Object *ob_arm, const char *defgrp_name, bGPDstroke *gps_target); -void BKE_armature_deform_coords_with_curves( - const Object &ob_arm, - const Object &ob_target, - blender::MutableSpan vert_coords, - std::optional> vert_coords_prev, - std::optional> vert_deform_mats, - blender::Span dverts, - int deformflag, - blender::StringRefNull defgrp_name); - void BKE_armature_deform_coords_with_mesh(const Object *ob_arm, const Object *ob_target, float (*vert_coords)[3], diff --git a/source/blender/blenkernel/BKE_asset.hh b/source/blender/blenkernel/BKE_asset.hh index a98a157384d..110c0af7469 100644 --- a/source/blender/blenkernel/BKE_asset.hh +++ b/source/blender/blenkernel/BKE_asset.hh @@ -76,5 +76,8 @@ PreviewImage *BKE_asset_metadata_preview_get_from_id(const AssetMetaData *asset_ void BKE_asset_metadata_write(BlendWriter *writer, AssetMetaData *asset_data); void BKE_asset_metadata_read(BlendDataReader *reader, AssetMetaData *asset_data); +/** Frees the weak reference and its data, and nulls the given pointer. */ +void BKE_asset_weak_reference_free(AssetWeakReference **weak_ref); +AssetWeakReference *BKE_asset_weak_reference_copy(AssetWeakReference *weak_ref); void BKE_asset_weak_reference_write(BlendWriter *writer, const AssetWeakReference *weak_ref); void BKE_asset_weak_reference_read(BlendDataReader *reader, AssetWeakReference *weak_ref); diff --git a/source/blender/blenkernel/BKE_attribute.hh b/source/blender/blenkernel/BKE_attribute.hh index c0242f74e81..d144e9d5c0e 100644 --- a/source/blender/blenkernel/BKE_attribute.hh +++ b/source/blender/blenkernel/BKE_attribute.hh @@ -29,7 +29,7 @@ class GField; namespace blender::bke { enum class AttrDomain : int8_t { - /* Used to choose automatically based on other data. */ + /* Use for to choose automatically based on other data. */ Auto = -1, /* Mesh, Curve or Point Cloud Point. */ Point = 0, diff --git a/source/blender/blenkernel/BKE_attribute_math.hh b/source/blender/blenkernel/BKE_attribute_math.hh index 1838ac5171a..3395c6e6d31 100644 --- a/source/blender/blenkernel/BKE_attribute_math.hh +++ b/source/blender/blenkernel/BKE_attribute_math.hh @@ -35,8 +35,7 @@ inline void convert_to_static_type(const CPPType &cpp_type, const Func &func) int8_t, ColorGeometry4f, ColorGeometry4b, - math::Quaternion, - float4x4>([&](auto type_tag) { + math::Quaternion>([&](auto type_tag) { using T = typename decltype(type_tag)::type; if constexpr (std::is_same_v) { /* It's expected that the given cpp type is one of the supported ones. */ @@ -518,26 +517,6 @@ class ColorGeometry4bMixer { void finalize(const IndexMask &mask); }; -class float4x4Mixer { - private: - MutableSpan buffer_; - Array total_weights_; - Array location_buffer_; - Array expmap_buffer_; - Array scale_buffer_; - - public: - float4x4Mixer(MutableSpan buffer); - /** - * \param mask: Only initialize these indices. Other indices in the buffer will be invalid. - */ - float4x4Mixer(MutableSpan buffer, const IndexMask &mask); - void set(int64_t index, const float4x4 &value, float weight = 1.0f); - void mix_in(int64_t index, const float4x4 &value, float weight = 1.0f); - void finalize(); - void finalize(const IndexMask &mask); -}; - template struct DefaultMixerStruct { /* Use void by default. This can be checked for in `if constexpr` statements. */ using type = void; @@ -559,9 +538,6 @@ template<> struct DefaultMixerStruct { template<> struct DefaultMixerStruct { using type = ColorGeometry4bMixer; }; -template<> struct DefaultMixerStruct { - using type = float4x4Mixer; -}; template<> struct DefaultMixerStruct { static double int_to_double(const int &value) { diff --git a/source/blender/blenkernel/BKE_blender.hh b/source/blender/blenkernel/BKE_blender.h similarity index 55% rename from source/blender/blenkernel/BKE_blender.hh rename to source/blender/blenkernel/BKE_blender.h index 8e442ce6c4b..2ac27710922 100644 --- a/source/blender/blenkernel/BKE_blender.hh +++ b/source/blender/blenkernel/BKE_blender.h @@ -8,6 +8,10 @@ * \brief Blender util stuff */ +#ifdef __cplusplus +extern "C" { +#endif + #include "BLI_compiler_attrs.h" struct Main; @@ -16,41 +20,46 @@ struct UserDef; /** * Only to be called on exit Blender. */ -void BKE_blender_free(); +void BKE_blender_free(void); -void BKE_blender_globals_init(); -void BKE_blender_globals_clear(); +void BKE_blender_globals_init(void); +void BKE_blender_globals_clear(void); /** Replace current global Main by the given one, freeing existing one. */ -void BKE_blender_globals_main_replace(Main *bmain); +void BKE_blender_globals_main_replace(struct Main *bmain); /** * Replace current global Main by the given one, returning the old one. * * \warning Advanced, risky workaround addressing the issue that current RNA is not able to process * correctly non-G_MAIN data, use with (a lot of) care. */ -Main *BKE_blender_globals_main_swap(Main *new_gmain); +struct Main *BKE_blender_globals_main_swap(struct Main *new_gmain); -void BKE_blender_userdef_data_swap(UserDef *userdef_a, UserDef *userdef_b); -void BKE_blender_userdef_data_set(UserDef *userdef); -void BKE_blender_userdef_data_set_and_free(UserDef *userdef); +void BKE_blender_userdef_data_swap(struct UserDef *userdef_a, struct UserDef *userdef_b); +void BKE_blender_userdef_data_set(struct UserDef *userdef); +void BKE_blender_userdef_data_set_and_free(struct UserDef *userdef); /** * This function defines which settings a template will override for the user preferences. * * \note the order of `userdef_a` & `userdef_b` isn't important as values are simply swapped. */ -void BKE_blender_userdef_app_template_data_swap(UserDef *userdef_a, UserDef *userdef_b); -void BKE_blender_userdef_app_template_data_set(UserDef *userdef); -void BKE_blender_userdef_app_template_data_set_and_free(UserDef *userdef); +void BKE_blender_userdef_app_template_data_swap(struct UserDef *userdef_a, + struct UserDef *userdef_b); +void BKE_blender_userdef_app_template_data_set(struct UserDef *userdef); +void BKE_blender_userdef_app_template_data_set_and_free(struct UserDef *userdef); /** * When loading a new userdef from file, * or when exiting Blender. */ -void BKE_blender_userdef_data_free(UserDef *userdef, bool clear_fonts); +void BKE_blender_userdef_data_free(struct UserDef *userdef, bool clear_fonts); /* Blenders' own atexit (avoids leaking) */ void BKE_blender_atexit_register(void (*func)(void *user_data), void *user_data); void BKE_blender_atexit_unregister(void (*func)(void *user_data), const void *user_data); -void BKE_blender_atexit(); +void BKE_blender_atexit(void); + +#ifdef __cplusplus +} +#endif diff --git a/source/blender/blenkernel/BKE_blender_cli_command.hh b/source/blender/blenkernel/BKE_blender_cli_command.hh deleted file mode 100644 index 162f1af7f4f..00000000000 --- a/source/blender/blenkernel/BKE_blender_cli_command.hh +++ /dev/null @@ -1,67 +0,0 @@ -/* SPDX-FileCopyrightText: 2024 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -#pragma once - -/** \file - * \ingroup bke - * \brief Blender CLI Generic `--command` Support. - * - * \note all registered commands must print help to the STDOUT & exit with a zero exit-code - * when `--help` is passed in as the first argument to a command. - */ - -#include "BLI_utility_mixins.hh" - -#include -#include - -/** - * Each instance of this class can run the command with an argument list. - * The arguments begin at the first argument after the command identifier. - */ -class CommandHandler : blender::NonCopyable, blender::NonMovable { - public: - CommandHandler(const std::string &id) : id(id) {} - virtual ~CommandHandler() = default; - - /** Matched against `--command {id}`. */ - const std::string id; - - /** - * The main execution function. - * The return value is used as the commands exit-code. - */ - virtual int exec(struct bContext *C, int argc, const char **argv) = 0; - - /** True when one or more registered commands share an ID. */ - bool is_duplicate = false; -}; -/** - * \param cmd: The memory for a command type (ownership is transferred). - */ -void BKE_blender_cli_command_register(std::unique_ptr cmd); - -/** - * Unregister a previously registered command. - */ -bool BKE_blender_cli_command_unregister(CommandHandler *cmd); - -/** - * Run the command by `id`, passing in the argument list & context. - * The argument list must begin after the command identifier. - */ -int BKE_blender_cli_command_exec(struct bContext *C, - const char *id, - const int argc, - const char **argv); - -/** - * Print all known commands (used for passing `--command help` in the command-line). - */ -void BKE_blender_cli_command_print_help(); -/** - * Frees all commands (using their #CommandFreeFn call-backs). - */ -void BKE_blender_cli_command_free_all(); diff --git a/source/blender/blenkernel/BKE_blender_version.h b/source/blender/blenkernel/BKE_blender_version.h index dd074b2c94d..d7fa0e437a5 100644 --- a/source/blender/blenkernel/BKE_blender_version.h +++ b/source/blender/blenkernel/BKE_blender_version.h @@ -21,15 +21,15 @@ extern "C" { */ /** Blender major and minor version. */ -#define BLENDER_VERSION 402 +#define BLENDER_VERSION 401 /** Blender patch version for bug-fix releases. */ #define BLENDER_VERSION_PATCH 0 /** Blender release cycle stage: alpha/beta/rc/release. */ -#define BLENDER_VERSION_CYCLE alpha +#define BLENDER_VERSION_CYCLE rc /* Blender file format version. */ #define BLENDER_FILE_VERSION BLENDER_VERSION -#define BLENDER_FILE_SUBVERSION 9 +#define BLENDER_FILE_SUBVERSION 22 /* Minimum Blender version that supports reading file written with the current * version. Older Blender versions will test this and cancel loading the file, showing a warning to diff --git a/source/blender/blenkernel/BKE_blendfile.hh b/source/blender/blenkernel/BKE_blendfile.hh index 5f2205f883f..cdc26d7776c 100644 --- a/source/blender/blenkernel/BKE_blendfile.hh +++ b/source/blender/blenkernel/BKE_blendfile.hh @@ -88,8 +88,8 @@ BlendFileData *BKE_blendfile_read(const char *filepath, * \return Blend file data, this must be passed to * #BKE_blendfile_read_setup_readfile/#BKE_blendfile_read_setup_undo when non-NULL. */ -BlendFileData *BKE_blendfile_read_from_memory(const void *file_buf, - int file_buf_size, +BlendFileData *BKE_blendfile_read_from_memory(const void *filebuf, + int filelength, const BlendFileReadParams *params, ReportList *reports); @@ -113,8 +113,8 @@ void BKE_blendfile_read_make_empty(bContext *C); * Only read the #UserDef from a .blend. */ UserDef *BKE_blendfile_userdef_read(const char *filepath, ReportList *reports); -UserDef *BKE_blendfile_userdef_read_from_memory(const void *file_buf, - int file_buf_size, +UserDef *BKE_blendfile_userdef_read_from_memory(const void *filebuf, + int filelength, ReportList *reports); UserDef *BKE_blendfile_userdef_from_defaults(); @@ -135,8 +135,8 @@ bool BKE_blendfile_userdef_write_app_template(const char *filepath, ReportList * bool BKE_blendfile_userdef_write_all(ReportList *reports); WorkspaceConfigFileData *BKE_blendfile_workspace_config_read(const char *filepath, - const void *file_buf, - int file_buf_size, + const void *filebuf, + int filelength, ReportList *reports); bool BKE_blendfile_workspace_config_write(Main *bmain, const char *filepath, ReportList *reports); void BKE_blendfile_workspace_config_data_free(WorkspaceConfigFileData *workspace_config); diff --git a/source/blender/blenkernel/BKE_blendfile_link_append.hh b/source/blender/blenkernel/BKE_blendfile_link_append.hh index be00e60dee6..23821db2556 100644 --- a/source/blender/blenkernel/BKE_blendfile_link_append.hh +++ b/source/blender/blenkernel/BKE_blendfile_link_append.hh @@ -29,7 +29,7 @@ void BKE_blendfile_link_append_context_free(BlendfileLinkAppendContext *lapp_con * * \param flag: A combination of: * - #eFileSel_Params_Flag from `DNA_space_types.h` & - * - #eBLOLibLinkFlags * from `BLO_readfile.hh`. + * - #eBLOLibLinkFlags * from `BLO_readfile.h`. * \param do_set: Set the given \a flag if true, clear it otherwise. */ void BKE_blendfile_link_append_context_flag_set(BlendfileLinkAppendContext *lapp_context, diff --git a/source/blender/blenkernel/BKE_bpath.hh b/source/blender/blenkernel/BKE_bpath.h similarity index 81% rename from source/blender/blenkernel/BKE_bpath.hh rename to source/blender/blenkernel/BKE_bpath.h index 26f4d1b3fba..d7275594449 100644 --- a/source/blender/blenkernel/BKE_bpath.hh +++ b/source/blender/blenkernel/BKE_bpath.h @@ -16,6 +16,10 @@ #include "BLI_utildefines.h" +#ifdef __cplusplus +extern "C" { +#endif + struct ID; struct Main; struct ReportList; @@ -23,7 +27,7 @@ struct ReportList; /** \name Core `foreach_path` API. * \{ */ -enum eBPathForeachFlag { +typedef enum eBPathForeachFlag { /* Flags controlling the behavior of the generic BPath API. */ /** * Ensures the `absolute_base_path` member of #BPathForeachPathData is initialized properly with @@ -58,7 +62,7 @@ enum eBPathForeachFlag { * \note Only used by Image #IDType currently. */ BKE_BPATH_FOREACH_PATH_RELOAD_EDITED = (1 << 9), -}; +} eBPathForeachFlag; ENUM_OPERATORS(eBPathForeachFlag, BKE_BPATH_FOREACH_PATH_RELOAD_EDITED) struct BPathForeachPathData; @@ -75,14 +79,14 @@ struct BPathForeachPathData; * \return `true` if the path has been changed, and in that case, * result must be written to `path_dst`. */ -using BPathForeachPathFunctionCallback = bool (*)(BPathForeachPathData *bpath_data, - char *path_dst, - size_t path_dst_maxncpy, - const char *path_src); +typedef bool (*BPathForeachPathFunctionCallback)(struct BPathForeachPathData *bpath_data, + char *path_dst, + size_t path_dst_maxncpy, + const char *path_src); /** Storage for common data needed across the BPath 'foreach_path' code. */ -struct BPathForeachPathData { - Main *bmain; +typedef struct BPathForeachPathData { + struct Main *bmain; BPathForeachPathFunctionCallback callback_function; eBPathForeachFlag flag; @@ -96,16 +100,16 @@ struct BPathForeachPathData { const char *absolute_base_path; /** ID owning the path being processed. */ - ID *owner_id; + struct ID *owner_id; /** * IDTypeInfo callbacks are responsible to set this boolean if they modified one or more paths. */ bool is_path_modified; -}; +} BPathForeachPathData; /** Run `bpath_data.callback_function` on all paths contained in `id`. */ -void BKE_bpath_foreach_path_id(BPathForeachPathData *bpath_data, ID *id); +void BKE_bpath_foreach_path_id(BPathForeachPathData *bpath_data, struct ID *id); /** Run `bpath_data.callback_function` on all paths of all IDs in `bmain`. */ void BKE_bpath_foreach_path_main(BPathForeachPathData *bpath_data); @@ -125,7 +129,7 @@ void BKE_bpath_foreach_path_main(BPathForeachPathData *bpath_data); * * \return true is \a path was modified, false otherwise. */ -bool BKE_bpath_foreach_path_fixed_process(BPathForeachPathData *bpath_data, +bool BKE_bpath_foreach_path_fixed_process(struct BPathForeachPathData *bpath_data, char *path, size_t path_maxncpy); @@ -138,7 +142,7 @@ bool BKE_bpath_foreach_path_fixed_process(BPathForeachPathData *bpath_data, * * \return true is \a path_dir and/or \a path_file were modified, false otherwise. */ -bool BKE_bpath_foreach_path_dirfile_fixed_process(BPathForeachPathData *bpath_data, +bool BKE_bpath_foreach_path_dirfile_fixed_process(struct BPathForeachPathData *bpath_data, char *path_dir, size_t path_dir_maxncpy, char *path_file, @@ -153,7 +157,8 @@ bool BKE_bpath_foreach_path_dirfile_fixed_process(BPathForeachPathData *bpath_da * * \return true is \a path was modified and re-allocated, false otherwise. */ -bool BKE_bpath_foreach_path_allocated_process(BPathForeachPathData *bpath_data, char **path); +bool BKE_bpath_foreach_path_allocated_process(struct BPathForeachPathData *bpath_data, + char **path); /** \} */ @@ -161,7 +166,7 @@ bool BKE_bpath_foreach_path_allocated_process(BPathForeachPathData *bpath_data, * \{ */ /** Check for missing files. */ -void BKE_bpath_missing_files_check(Main *bmain, ReportList *reports); +void BKE_bpath_missing_files_check(struct Main *bmain, struct ReportList *reports); /** * Recursively search into given search directory, for all file paths of all IDs in given @@ -176,29 +181,33 @@ void BKE_bpath_missing_files_check(Main *bmain, ReportList *reports); * \param find_all: If `true`, also search for files which current path is still valid, if `false` * skip those still valid paths. */ -void BKE_bpath_missing_files_find(Main *bmain, +void BKE_bpath_missing_files_find(struct Main *bmain, const char *searchpath, - ReportList *reports, + struct ReportList *reports, bool find_all); /** Rebase all relative file paths in given \a bmain from \a basedir_src to \a basedir_dst. */ -void BKE_bpath_relative_rebase(Main *bmain, +void BKE_bpath_relative_rebase(struct Main *bmain, const char *basedir_src, const char *basedir_dst, - ReportList *reports); + struct ReportList *reports); /** Make all absolute file paths in given \a bmain relative to given \a basedir. */ -void BKE_bpath_relative_convert(Main *bmain, const char *basedir, ReportList *reports); +void BKE_bpath_relative_convert(struct Main *bmain, + const char *basedir, + struct ReportList *reports); /** Make all relative file paths in given \a bmain absolute, using given \a basedir as root. */ -void BKE_bpath_absolute_convert(Main *bmain, const char *basedir, ReportList *reports); +void BKE_bpath_absolute_convert(struct Main *bmain, + const char *basedir, + struct ReportList *reports); /** * Temp backup of paths from all IDs in given \a bmain. * * \return An opaque handle to pass to #BKE_bpath_list_restore and #BKE_bpath_list_free. */ -void *BKE_bpath_list_backup(Main *bmain, eBPathForeachFlag flag); +void *BKE_bpath_list_backup(struct Main *bmain, eBPathForeachFlag flag); /** * Restore the temp backup of paths from \a path_list_handle into all IDs in given \a bmain. @@ -207,7 +216,7 @@ void *BKE_bpath_list_backup(Main *bmain, eBPathForeachFlag flag); * addition/deletion/re-ordering of IDs, or their file paths) since the call to * #BKE_bpath_list_backup that generated the given \a path_list_handle. */ -void BKE_bpath_list_restore(Main *bmain, eBPathForeachFlag flag, void *path_list_handle); +void BKE_bpath_list_restore(struct Main *bmain, eBPathForeachFlag flag, void *path_list_handle); /** * Free the temp backup of paths in \a path_list_handle. @@ -218,3 +227,7 @@ void BKE_bpath_list_restore(Main *bmain, eBPathForeachFlag flag, void *path_list void BKE_bpath_list_free(void *path_list_handle); /** \} */ + +#ifdef __cplusplus +} +#endif diff --git a/source/blender/blenkernel/BKE_bvhutils.hh b/source/blender/blenkernel/BKE_bvhutils.hh index 12e2a2bc1c8..70bd5401eae 100644 --- a/source/blender/blenkernel/BKE_bvhutils.hh +++ b/source/blender/blenkernel/BKE_bvhutils.hh @@ -12,16 +12,31 @@ #include #include "BLI_bit_span.hh" -#include "BLI_index_mask_fwd.hh" #include "BLI_kdopbvh.h" #include "BLI_math_vector_types.hh" #include "BLI_span.hh" +struct BMEditMesh; struct BVHCache; struct BVHTree; struct MFace; struct Mesh; struct PointCloud; +struct vec2i; + +/** + * Struct that stores basic information about a BVHTree built from a edit-mesh. + */ +struct BVHTreeFromEditMesh { + BVHTree *tree; + + /** Default callbacks to BVH nearest and ray-cast. */ + BVHTree_NearestPointCallback nearest_callback; + BVHTree_RayCastCallback raycast_callback; + + /* Private data */ + bool cached; +}; /** * Struct that stores basic information about a #BVHTree built from a mesh. @@ -55,10 +70,39 @@ enum BVHCacheType { BVHTREE_FROM_LOOSEVERTS, BVHTREE_FROM_LOOSEEDGES, + BVHTREE_FROM_EM_LOOSEVERTS, + BVHTREE_FROM_EM_EDGES, + BVHTREE_FROM_EM_LOOPTRIS, + /* Keep `BVHTREE_MAX_ITEM` as last item. */ BVHTREE_MAX_ITEM, }; +/** + * Builds a BVH tree where nodes are the relevant elements of the given mesh. + * Configures #BVHTreeFromMesh. + * + * The tree is build in mesh space coordinates, this means special care must be made on queries + * so that the coordinates and rays are first translated on the mesh local coordinates. + * Reason for this is that bvh_from_mesh_* can use a cache in some cases and so it + * becomes possible to reuse a #BVHTree. + * + * #free_bvhtree_from_mesh should be called when the tree is no longer needed. + */ +BVHTree *bvhtree_from_editmesh_verts( + BVHTreeFromEditMesh *data, BMEditMesh *em, float epsilon, int tree_type, int axis); + +/** + * Builds a BVH-tree where nodes are the vertices of the given `em`. + */ +BVHTree *bvhtree_from_editmesh_verts_ex(BVHTreeFromEditMesh *data, + BMEditMesh *em, + blender::BitSpan verts_mask, + int verts_num_active, + float epsilon, + int tree_type, + int axis); + /** * Builds a BVH-tree where nodes are the given vertices (NOTE: does not copy given `vert`!). * \param vert_allocated: if true, vert freeing will be done when freeing data. @@ -74,6 +118,20 @@ BVHTree *bvhtree_from_mesh_verts_ex(BVHTreeFromMesh *data, int tree_type, int axis); +BVHTree *bvhtree_from_editmesh_edges( + BVHTreeFromEditMesh *data, BMEditMesh *em, float epsilon, int tree_type, int axis); + +/** + * Builds a BVH-tree where nodes are the edges of the given `em`. + */ +BVHTree *bvhtree_from_editmesh_edges_ex(BVHTreeFromEditMesh *data, + BMEditMesh *em, + blender::BitSpan edges_mask, + int edges_num_active, + float epsilon, + int tree_type, + int axis); + /** * Builds a BVH-tree where nodes are the given edges. * \param vert, vert_allocated: if true, elem freeing will be done when freeing data. @@ -91,6 +149,20 @@ BVHTree *bvhtree_from_mesh_edges_ex(BVHTreeFromMesh *data, int tree_type, int axis); +BVHTree *bvhtree_from_editmesh_corner_tris( + BVHTreeFromEditMesh *data, BMEditMesh *em, float epsilon, int tree_type, int axis); + +/** + * Builds a BVH-tree where nodes are triangles faces (#MLoopTri) of the given `bm`. + */ +BVHTree *bvhtree_from_editmesh_looptris_ex(BVHTreeFromEditMesh *data, + BMEditMesh *em, + blender::BitSpan corner_tris_mask, + int corner_tris_num_active, + float epsilon, + int tree_type, + int axis); + /** * Builds a BVH-tree where nodes are the triangle faces (#MLoopTri) of the given mesh. */ @@ -116,26 +188,19 @@ BVHTree *BKE_bvhtree_from_mesh_get(BVHTreeFromMesh *data, int tree_type); /** - * Build a bvh tree from the triangles in the mesh that correspond to the faces in the given mask. + * Builds or queries a BVH-cache for the cache BVH-tree of the request type. */ -void BKE_bvhtree_from_mesh_tris_init(const Mesh &mesh, - const blender::IndexMask &faces_mask, - BVHTreeFromMesh &r_data); +BVHTree *BKE_bvhtree_from_editmesh_get(BVHTreeFromEditMesh *data, + BMEditMesh *em, + int tree_type, + BVHCacheType bvh_cache_type, + BVHCache **bvh_cache_p, + std::mutex *mesh_eval_mutex); /** - * Build a bvh tree containing the given edges. + * Frees data allocated by a call to `bvhtree_from_editmesh_*`. */ -void BKE_bvhtree_from_mesh_edges_init(const Mesh &mesh, - const blender::IndexMask &edges_mask, - BVHTreeFromMesh &r_data); - -/** - * Build a bvh tree containing the given vertices. - */ -void BKE_bvhtree_from_mesh_verts_init(const Mesh &mesh, - const blender::IndexMask &verts_mask, - BVHTreeFromMesh &r_data); - +void free_bvhtree_from_editmesh(BVHTreeFromEditMesh *data); /** * Frees data allocated by a call to `bvhtree_from_mesh_*`. */ @@ -161,9 +226,9 @@ struct BVHTreeFromPointCloud { const float (*coords)[3]; }; -void BKE_bvhtree_from_pointcloud_get(const PointCloud &pointcloud, - const blender::IndexMask &points_mask, - BVHTreeFromPointCloud &r_data); +[[nodiscard]] BVHTree *BKE_bvhtree_from_pointcloud_get(BVHTreeFromPointCloud *data, + const PointCloud *pointcloud, + int tree_type); void free_bvhtree_from_pointcloud(BVHTreeFromPointCloud *data); diff --git a/source/blender/blenkernel/BKE_cachefile.h b/source/blender/blenkernel/BKE_cachefile.h new file mode 100644 index 00000000000..900d5ae7242 --- /dev/null +++ b/source/blender/blenkernel/BKE_cachefile.h @@ -0,0 +1,70 @@ +/* SPDX-FileCopyrightText: 2016 Blender Authors + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +#pragma once + +/** \file + * \ingroup bke + */ + +#ifdef __cplusplus +extern "C" { +#endif + +struct CacheFile; +struct CacheFileLayer; +struct CacheReader; +struct Depsgraph; +struct Main; +struct Object; +struct Scene; + +void BKE_cachefiles_init(void); +void BKE_cachefiles_exit(void); + +void *BKE_cachefile_add(struct Main *bmain, const char *name); + +void BKE_cachefile_reload(struct Depsgraph *depsgraph, struct CacheFile *cache_file); + +void BKE_cachefile_eval(struct Main *bmain, + struct Depsgraph *depsgraph, + struct CacheFile *cache_file); + +bool BKE_cachefile_filepath_get(const struct Main *bmain, + const struct Depsgraph *depsgraph, + const struct CacheFile *cache_file, + char r_filepath[1024]); + +double BKE_cachefile_time_offset(const struct CacheFile *cache_file, double time, double fps); + +/* Modifiers and constraints open and free readers through these. */ +void BKE_cachefile_reader_open(struct CacheFile *cache_file, + struct CacheReader **reader, + struct Object *object, + const char *object_path); +void BKE_cachefile_reader_free(struct CacheFile *cache_file, struct CacheReader **reader); + +/** + * Determine whether the #CacheFile should use a render engine procedural. If so, data is not read + * from the file and bounding boxes are used to represent the objects in the Scene. + * Render engines will receive the bounding box as a placeholder but can instead + * load the data directly if they support it. + */ +bool BKE_cache_file_uses_render_procedural(const struct CacheFile *cache_file, + struct Scene *scene); + +/** + * Add a layer to the cache_file. Return NULL if the `filepath` is already that of an existing + * layer or if the number of layers exceeds the maximum allowed layer count. + */ +struct CacheFileLayer *BKE_cachefile_add_layer(struct CacheFile *cache_file, + const char filepath[1024]); + +struct CacheFileLayer *BKE_cachefile_get_active_layer(struct CacheFile *cache_file); + +void BKE_cachefile_remove_layer(struct CacheFile *cache_file, struct CacheFileLayer *layer); + +#ifdef __cplusplus +} +#endif diff --git a/source/blender/blenkernel/BKE_cachefile.hh b/source/blender/blenkernel/BKE_cachefile.hh deleted file mode 100644 index 34009c05f8d..00000000000 --- a/source/blender/blenkernel/BKE_cachefile.hh +++ /dev/null @@ -1,58 +0,0 @@ -/* SPDX-FileCopyrightText: 2016 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -#pragma once - -/** \file - * \ingroup bke - */ - -struct CacheFile; -struct CacheFileLayer; -struct CacheReader; -struct Depsgraph; -struct Main; -struct Object; -struct Scene; - -void BKE_cachefiles_init(); -void BKE_cachefiles_exit(); - -void *BKE_cachefile_add(Main *bmain, const char *name); - -void BKE_cachefile_reload(Depsgraph *depsgraph, CacheFile *cache_file); - -void BKE_cachefile_eval(Main *bmain, Depsgraph *depsgraph, CacheFile *cache_file); - -bool BKE_cachefile_filepath_get(const Main *bmain, - const Depsgraph *depsgraph, - const CacheFile *cache_file, - char r_filepath[1024]); - -double BKE_cachefile_time_offset(const CacheFile *cache_file, double time, double fps); - -/* Modifiers and constraints open and free readers through these. */ -void BKE_cachefile_reader_open(CacheFile *cache_file, - CacheReader **reader, - Object *object, - const char *object_path); -void BKE_cachefile_reader_free(CacheFile *cache_file, CacheReader **reader); - -/** - * Determine whether the #CacheFile should use a render engine procedural. If so, data is not read - * from the file and bounding boxes are used to represent the objects in the Scene. - * Render engines will receive the bounding box as a placeholder but can instead - * load the data directly if they support it. - */ -bool BKE_cache_file_uses_render_procedural(const CacheFile *cache_file, Scene *scene); - -/** - * Add a layer to the cache_file. Return NULL if the `filepath` is already that of an existing - * layer or if the number of layers exceeds the maximum allowed layer count. - */ -CacheFileLayer *BKE_cachefile_add_layer(CacheFile *cache_file, const char filepath[1024]); - -CacheFileLayer *BKE_cachefile_get_active_layer(CacheFile *cache_file); - -void BKE_cachefile_remove_layer(CacheFile *cache_file, CacheFileLayer *layer); diff --git a/source/blender/blenkernel/BKE_callbacks.hh b/source/blender/blenkernel/BKE_callbacks.h similarity index 79% rename from source/blender/blenkernel/BKE_callbacks.hh rename to source/blender/blenkernel/BKE_callbacks.h index 97c85d27ca8..b382638febc 100644 --- a/source/blender/blenkernel/BKE_callbacks.hh +++ b/source/blender/blenkernel/BKE_callbacks.h @@ -8,6 +8,10 @@ #pragma once +#ifdef __cplusplus +extern "C" { +#endif + struct Depsgraph; struct ID; struct Main; @@ -69,7 +73,7 @@ struct PointerRNA; * All callbacks here must be exposed via the Python module `bpy.app.handlers`, * see `bpy_app_handlers.cc`. */ -enum eCbEvent { +typedef enum { BKE_CB_EVT_FRAME_CHANGE_PRE, BKE_CB_EVT_FRAME_CHANGE_POST, BKE_CB_EVT_RENDER_PRE, @@ -110,27 +114,36 @@ enum eCbEvent { BKE_CB_EVT_EXTENSION_REPOS_UPDATE_POST, BKE_CB_EVT_EXTENSION_REPOS_SYNC, BKE_CB_EVT_EXTENSION_REPOS_UPGRADE, - BKE_CB_EVT_EXTENSION_DROP_URL, BKE_CB_EVT_TOT, -}; +} eCbEvent; -struct bCallbackFuncStore { - bCallbackFuncStore *next, *prev; - void (*func)(Main *, PointerRNA **, int num_pointers, void *arg); +typedef struct bCallbackFuncStore { + struct bCallbackFuncStore *next, *prev; + void (*func)(struct Main *, struct PointerRNA **, int num_pointers, void *arg); void *arg; short alloc; -}; +} bCallbackFuncStore; -void BKE_callback_exec(Main *bmain, PointerRNA **pointers, int num_pointers, eCbEvent evt); -void BKE_callback_exec_null(Main *bmain, eCbEvent evt); -void BKE_callback_exec_id(Main *bmain, ID *id, eCbEvent evt); -void BKE_callback_exec_id_depsgraph(Main *bmain, ID *id, Depsgraph *depsgraph, eCbEvent evt); -void BKE_callback_exec_string(Main *bmain, eCbEvent evt, const char *str); +void BKE_callback_exec(struct Main *bmain, + struct PointerRNA **pointers, + int num_pointers, + eCbEvent evt); +void BKE_callback_exec_null(struct Main *bmain, eCbEvent evt); +void BKE_callback_exec_id(struct Main *bmain, struct ID *id, eCbEvent evt); +void BKE_callback_exec_id_depsgraph(struct Main *bmain, + struct ID *id, + struct Depsgraph *depsgraph, + eCbEvent evt); +void BKE_callback_exec_string(struct Main *bmain, eCbEvent evt, const char *str); void BKE_callback_add(bCallbackFuncStore *funcstore, eCbEvent evt); void BKE_callback_remove(bCallbackFuncStore *funcstore, eCbEvent evt); -void BKE_callback_global_init(); +void BKE_callback_global_init(void); /** * Call on application exit. */ -void BKE_callback_global_finalize(); +void BKE_callback_global_finalize(void); + +#ifdef __cplusplus +} +#endif diff --git a/source/blender/blenkernel/BKE_camera.h b/source/blender/blenkernel/BKE_camera.h index f0d31824266..4cb6a7a6f21 100644 --- a/source/blender/blenkernel/BKE_camera.h +++ b/source/blender/blenkernel/BKE_camera.h @@ -173,8 +173,8 @@ struct CameraBGImage *BKE_camera_background_image_new(struct Camera *cam); * \param copy_flag: The usual ID copying flags, see `LIB_ID_CREATE_`/`LIB_ID_COPY_` enums in * `BKE_lib_id.hh`. */ -struct CameraBGImage *BKE_camera_background_image_copy(const struct CameraBGImage *bgpic_src, - int copy_flag); +struct CameraBGImage *BKE_camera_background_image_copy(struct CameraBGImage *bgpic_src, + const int copy_flag); void BKE_camera_background_image_remove(struct Camera *cam, struct CameraBGImage *bgpic); void BKE_camera_background_image_clear(struct Camera *cam); diff --git a/source/blender/blenkernel/BKE_cloth.hh b/source/blender/blenkernel/BKE_cloth.hh index b725ea8952d..424226a8f41 100644 --- a/source/blender/blenkernel/BKE_cloth.hh +++ b/source/blender/blenkernel/BKE_cloth.hh @@ -62,7 +62,7 @@ struct ClothSolverResult { * * The m and n members of this structure represent the assumed * rectangular ordered grid for which the original paper is written. - * At some point they need to disappear and we need to determine our + * At some point they need to disappear and we need to determine out * own connectivity of the mesh based on the actual edges in the mesh. */ struct Cloth { diff --git a/source/blender/blenkernel/BKE_collection.hh b/source/blender/blenkernel/BKE_collection.h similarity index 51% rename from source/blender/blenkernel/BKE_collection.hh rename to source/blender/blenkernel/BKE_collection.h index 761b279095a..b9929af6f00 100644 --- a/source/blender/blenkernel/BKE_collection.hh +++ b/source/blender/blenkernel/BKE_collection.h @@ -15,23 +15,30 @@ #include "DNA_listBase.h" +#ifdef __cplusplus +extern "C" { +#endif + /* Structs */ struct BLI_Iterator; struct Base; struct BlendDataReader; +struct BlendLibReader; struct BlendWriter; struct Collection; +struct Depsgraph; struct ID; +struct Library; struct Main; struct Object; struct Scene; struct ViewLayer; -struct CollectionParent { +typedef struct CollectionParent { struct CollectionParent *next, *prev; struct Collection *collection; -}; +} CollectionParent; /* Collections */ @@ -39,36 +46,38 @@ struct CollectionParent { * Add a collection to a collection ListBase and synchronize all render layers * The ListBase is NULL when the collection is to be added to the master collection */ -Collection *BKE_collection_add(Main *bmain, Collection *parent, const char *name); +struct Collection *BKE_collection_add(struct Main *bmain, + struct Collection *parent, + const char *name); /** * Add \a collection_dst to all scene collections that reference object \a ob_src is in. * Used to replace an instance object with a collection (library override operator). * * Logic is very similar to #BKE_collection_object_add_from(). */ -void BKE_collection_add_from_object(Main *bmain, - Scene *scene, - const Object *ob_src, - Collection *collection_dst); +void BKE_collection_add_from_object(struct Main *bmain, + struct Scene *scene, + const struct Object *ob_src, + struct Collection *collection_dst); /** * Add \a collection_dst to all scene collections that reference collection \a collection_src is * in. * * Logic is very similar to #BKE_collection_object_add_from(). */ -void BKE_collection_add_from_collection(Main *bmain, - Scene *scene, - Collection *collection_src, - Collection *collection_dst); +void BKE_collection_add_from_collection(struct Main *bmain, + struct Scene *scene, + struct Collection *collection_src, + struct Collection *collection_dst); /** * Free (or release) any data used by this collection (does not free the collection itself). */ -void BKE_collection_free_data(Collection *collection); +void BKE_collection_free_data(struct Collection *collection); /** * Remove a collection, optionally removing its child objects or moving * them to parent collections. */ -bool BKE_collection_delete(Main *bmain, Collection *collection, bool hierarchy); +bool BKE_collection_delete(struct Main *bmain, struct Collection *collection, bool hierarchy); /** * Make a deep copy (aka duplicate) of the given collection and all of its children, recursively. @@ -78,33 +87,36 @@ bool BKE_collection_delete(Main *bmain, Collection *collection, bool hierarchy); * responsible to reconstruct collection dependencies information's * (i.e. call #BKE_main_collection_sync). */ -Collection *BKE_collection_duplicate(Main *bmain, - Collection *parent, - Collection *collection, - uint duplicate_flags, - uint duplicate_options); +struct Collection *BKE_collection_duplicate(struct Main *bmain, + struct Collection *parent, + struct Collection *collection, + uint duplicate_flags, + uint duplicate_options); /* Master Collection for Scene */ #define BKE_SCENE_COLLECTION_NAME "Scene Collection" -Collection *BKE_collection_master_add(Scene *scene); +struct Collection *BKE_collection_master_add(struct Scene *scene); /* Collection Objects */ -bool BKE_collection_has_object(Collection *collection, const Object *ob); -bool BKE_collection_has_object_recursive(Collection *collection, Object *ob); -bool BKE_collection_has_object_recursive_instanced(Collection *collection, Object *ob); -Collection *BKE_collection_object_find(Main *bmain, - Scene *scene, - Collection *collection, - Object *ob); -bool BKE_collection_is_empty(const Collection *collection); +bool BKE_collection_has_object(struct Collection *collection, const struct Object *ob); +bool BKE_collection_has_object_recursive(struct Collection *collection, struct Object *ob); +bool BKE_collection_has_object_recursive_instanced(struct Collection *collection, + struct Object *ob); +struct Collection *BKE_collection_object_find(struct Main *bmain, + struct Scene *scene, + struct Collection *collection, + struct Object *ob); +bool BKE_collection_is_empty(const struct Collection *collection); /** * Add object to given collection, ensuring this collection is 'editable' (i.e. local and not a * liboverride), and finding a suitable parent one otherwise. */ -bool BKE_collection_object_add(Main *bmain, Collection *collection, Object *ob); +bool BKE_collection_object_add(struct Main *bmain, + struct Collection *collection, + struct Object *ob); /** * Add object to given collection, similar to #BKE_collection_object_add. @@ -112,51 +124,62 @@ bool BKE_collection_object_add(Main *bmain, Collection *collection, Object *ob); * However, it additionally ensures that the selected collection is also part of the given * `view_layer`, if non-NULL. Otherwise, the object is not added to any collection. */ -bool BKE_collection_viewlayer_object_add(Main *bmain, - const ViewLayer *view_layer, - Collection *collection, - Object *ob); +bool BKE_collection_viewlayer_object_add(struct Main *bmain, + const struct ViewLayer *view_layer, + struct Collection *collection, + struct Object *ob); /** * Same as #BKE_collection_object_add, but unconditionally adds the object to the given collection. * * NOTE: required in certain cases, like do-versioning or complex ID management tasks. */ -bool BKE_collection_object_add_notest(Main *bmain, Collection *collection, Object *ob); +bool BKE_collection_object_add_notest(struct Main *bmain, + struct Collection *collection, + struct Object *ob); /** * Add \a ob_dst to all scene collections that reference object \a ob_src is in. * Used for copying objects. * * Logic is very similar to #BKE_collection_add_from_object() */ -void BKE_collection_object_add_from(Main *bmain, Scene *scene, Object *ob_src, Object *ob_dst); +void BKE_collection_object_add_from(struct Main *bmain, + struct Scene *scene, + struct Object *ob_src, + struct Object *ob_dst); /** * Remove object from collection. */ -bool BKE_collection_object_remove(Main *bmain, - Collection *collection, - Object *object, +bool BKE_collection_object_remove(struct Main *bmain, + struct Collection *collection, + struct Object *object, bool free_us); /** * Replace one object with another in a collection (managing user counts). */ -bool BKE_collection_object_replace(Main *bmain, - Collection *collection, - Object *ob_old, - Object *ob_new); +bool BKE_collection_object_replace(struct Main *bmain, + struct Collection *collection, + struct Object *ob_old, + struct Object *ob_new); /** * Move object from a collection into another * * If source collection is NULL move it from all the existing collections. */ -void BKE_collection_object_move( - Main *bmain, Scene *scene, Collection *collection_dst, Collection *collection_src, Object *ob); +void BKE_collection_object_move(struct Main *bmain, + struct Scene *scene, + struct Collection *collection_dst, + struct Collection *collection_src, + struct Object *ob); /** * Remove object from all collections of scene */ -bool BKE_scene_collections_object_remove(Main *bmain, Scene *scene, Object *object, bool free_us); +bool BKE_scene_collections_object_remove(struct Main *bmain, + struct Scene *scene, + struct Object *object, + bool free_us); /** * Check all collections in \a bmain (including embedded ones in scenes) for invalid @@ -165,7 +188,7 @@ bool BKE_scene_collections_object_remove(Main *bmain, Scene *scene, Object *obje * \note In case of duplicates, the first CollectionObject in the list is kept, all others are * removed. */ -void BKE_collections_object_remove_invalids(Main *bmain); +void BKE_collections_object_remove_invalids(struct Main *bmain); /** * Remove all NULL children from parent collections of changed \a collection. @@ -179,20 +202,22 @@ void BKE_collections_object_remove_invalids(Main *bmain); * \param child_collection: The collection that was remapped to another pointer. May be \a NULL, * in which case whole \a bmain database of collections is checked. */ -void BKE_collections_child_remove_nulls(Main *bmain, - Collection *parent_collection, - Collection *child_collection); +void BKE_collections_child_remove_nulls(struct Main *bmain, + struct Collection *parent_collection, + struct Collection *child_collection); /* Dependencies. */ -bool BKE_collection_is_in_scene(Collection *collection); -void BKE_collections_after_lib_link(Main *bmain); -bool BKE_collection_object_cyclic_check(Main *bmain, Object *object, Collection *collection); +bool BKE_collection_is_in_scene(struct Collection *collection); +void BKE_collections_after_lib_link(struct Main *bmain); +bool BKE_collection_object_cyclic_check(struct Main *bmain, + struct Object *object, + struct Collection *collection); /* Object list cache. */ -ListBase BKE_collection_object_cache_get(Collection *collection); -ListBase BKE_collection_object_cache_instanced_get(Collection *collection); +struct ListBase BKE_collection_object_cache_get(struct Collection *collection); +ListBase BKE_collection_object_cache_instanced_get(struct Collection *collection); /** Free the object cache of given `collection` and all of its ancestors (recursively). * * \param bmain: The Main database owning the collection. May be `nullptr`, only used if doing @@ -200,18 +225,18 @@ ListBase BKE_collection_object_cache_instanced_get(Collection *collection); * \param id_create_flag: Flags controlling ID creation, used here to enable or * not depsgraph tagging of affected IDs (e.g. #LIB_ID_CREATE_NO_DEG_TAG would prevent depsgraph * tagging). */ -void BKE_collection_object_cache_free(const Main *bmain, - Collection *collection, +void BKE_collection_object_cache_free(const struct Main *bmain, + struct Collection *collection, const int id_create_flag); /** * Free the object cache of all collections in given `bmain`, including master collections of * scenes. */ -void BKE_main_collections_object_cache_free(const Main *bmain); +void BKE_main_collections_object_cache_free(const struct Main *bmain); -Base *BKE_collection_or_layer_objects(const Scene *scene, - ViewLayer *view_layer, - Collection *collection); +struct Base *BKE_collection_or_layer_objects(const struct Scene *scene, + struct ViewLayer *view_layer, + struct Collection *collection); /* Editing. */ @@ -220,38 +245,44 @@ Base *BKE_collection_or_layer_objects(const Scene *scene, * * The index is calculated from top to bottom counting the children before the siblings. */ -Collection *BKE_collection_from_index(Scene *scene, int index); +struct Collection *BKE_collection_from_index(struct Scene *scene, int index); /** * The automatic/fallback name of a new collection. */ -void BKE_collection_new_name_get(Collection *collection_parent, char *rname); +void BKE_collection_new_name_get(struct Collection *collection_parent, char *rname); /** * The name to show in the interface. */ -const char *BKE_collection_ui_name_get(Collection *collection); +const char *BKE_collection_ui_name_get(struct Collection *collection); /** * Select all the objects in this Collection (and its nested collections) for this ViewLayer. * Return true if any object was selected. */ -bool BKE_collection_objects_select(const Scene *scene, - ViewLayer *view_layer, - Collection *collection, +bool BKE_collection_objects_select(const struct Scene *scene, + struct ViewLayer *view_layer, + struct Collection *collection, bool deselect); /* Collection children */ -bool BKE_collection_child_add(Main *bmain, Collection *parent, Collection *child); +bool BKE_collection_child_add(struct Main *bmain, + struct Collection *parent, + struct Collection *child); -bool BKE_collection_child_add_no_sync(Main *bmain, Collection *parent, Collection *child); +bool BKE_collection_child_add_no_sync(struct Main *bmain, + struct Collection *parent, + struct Collection *child); -bool BKE_collection_child_remove(Main *bmain, Collection *parent, Collection *child); +bool BKE_collection_child_remove(struct Main *bmain, + struct Collection *parent, + struct Collection *child); -bool BKE_collection_move(Main *bmain, - Collection *to_parent, - Collection *from_parent, - Collection *relative, +bool BKE_collection_move(struct Main *bmain, + struct Collection *to_parent, + struct Collection *from_parent, + struct Collection *relative, bool relative_after, - Collection *collection); + struct Collection *collection); /** * Find potential cycles in collections. @@ -262,16 +293,17 @@ bool BKE_collection_move(Main *bmain, * may be NULL if we just want to ensure \a new_ancestor does not already have cycles. * \return true if a cycle is found. */ -bool BKE_collection_cycle_find(Collection *new_ancestor, Collection *collection); +bool BKE_collection_cycle_find(struct Collection *new_ancestor, struct Collection *collection); /** * Find and fix potential cycles in collections. * * \param collection: The collection to check for existing cycles. * \return true if cycles are found and fixed. */ -bool BKE_collection_cycles_fix(Main *bmain, Collection *collection); +bool BKE_collection_cycles_fix(struct Main *bmain, struct Collection *collection); -bool BKE_collection_has_collection(const Collection *parent, const Collection *collection); +bool BKE_collection_has_collection(const struct Collection *parent, + const struct Collection *collection); /** * Return parent collection which is not linked. @@ -283,17 +315,17 @@ Collection *BKE_collection_parent_editable_find_recursive(const ViewLayer *view_ * * \note Given collection is assumed to already have valid parents. */ -void BKE_collection_parent_relations_rebuild(Collection *collection); +void BKE_collection_parent_relations_rebuild(struct Collection *collection); /** * Rebuild parent relationships from child ones, for all collections in given \a bmain. */ -void BKE_main_collections_parent_relations_rebuild(Main *bmain); +void BKE_main_collections_parent_relations_rebuild(struct Main *bmain); /** * Perform some validation on integrity of the data of this collection. * * \return `true` if everything is OK, false if some errors are detected. */ -bool BKE_collection_validate(Collection *collection); +bool BKE_collection_validate(struct Collection *collection); /* .blend file I/O */ @@ -301,14 +333,17 @@ bool BKE_collection_validate(Collection *collection); * Perform some pre-writing cleanup on the COllection data itself (_not_ in any sub-data * referenced by pointers). To be called before writing the Collection struct itself. */ -void BKE_collection_blend_write_prepare_nolib(BlendWriter *writer, Collection *collection); -void BKE_collection_blend_write_nolib(BlendWriter *writer, Collection *collection); -void BKE_collection_blend_read_data(BlendDataReader *reader, Collection *collection, ID *owner_id); +void BKE_collection_blend_write_prepare_nolib(struct BlendWriter *writer, + struct Collection *collection); +void BKE_collection_blend_write_nolib(struct BlendWriter *writer, struct Collection *collection); +void BKE_collection_blend_read_data(struct BlendDataReader *reader, + struct Collection *collection, + struct ID *owner_id); /* Iteration callbacks. */ -using BKE_scene_objects_Cb = void (*)(Object *ob, void *data); -using BKE_scene_collections_Cb = void (*)(Collection *ob, void *data); +typedef void (*BKE_scene_objects_Cb)(struct Object *ob, void *data); +typedef void (*BKE_scene_collections_Cb)(struct Collection *ob, void *data); /* Iteration over objects in collection. */ @@ -318,8 +353,7 @@ using BKE_scene_collections_Cb = void (*)(Collection *ob, void *data); int _object_visibility_flag = (_mode == DAG_EVAL_VIEWPORT) ? OB_HIDE_VIEWPORT : \ OB_HIDE_RENDER; \ int _base_id = 0; \ - for (Base *_base = static_cast(BKE_collection_object_cache_get(_collection).first); \ - _base; \ + for (Base *_base = (Base *)BKE_collection_object_cache_get(_collection).first; _base; \ _base = _base->next, _base_id++) \ { \ Object *_object = _base->object; \ @@ -333,8 +367,7 @@ using BKE_scene_collections_Cb = void (*)(Collection *ob, void *data); ((void)0) #define FOREACH_COLLECTION_OBJECT_RECURSIVE_BEGIN(_collection, _object) \ - for (Base *_base = static_cast(BKE_collection_object_cache_get(_collection).first); \ - _base; \ + for (Base *_base = (Base *)BKE_collection_object_cache_get(_collection).first; _base; \ _base = _base->next) \ { \ Object *_object = _base->object; \ @@ -350,28 +383,28 @@ using BKE_scene_collections_Cb = void (*)(Collection *ob, void *data); * Only use this in non-performance critical situations * (it iterates over all scene collections twice) */ -void BKE_scene_collections_iterator_begin(BLI_Iterator *iter, void *data_in); -void BKE_scene_collections_iterator_next(BLI_Iterator *iter); -void BKE_scene_collections_iterator_end(BLI_Iterator *iter); +void BKE_scene_collections_iterator_begin(struct BLI_Iterator *iter, void *data_in); +void BKE_scene_collections_iterator_next(struct BLI_Iterator *iter); +void BKE_scene_collections_iterator_end(struct BLI_Iterator *iter); -void BKE_scene_objects_iterator_begin(BLI_Iterator *iter, void *data_in); -void BKE_scene_objects_iterator_next(BLI_Iterator *iter); -void BKE_scene_objects_iterator_end(BLI_Iterator *iter); +void BKE_scene_objects_iterator_begin(struct BLI_Iterator *iter, void *data_in); +void BKE_scene_objects_iterator_next(struct BLI_Iterator *iter); +void BKE_scene_objects_iterator_end(struct BLI_Iterator *iter); /** * Iterate over objects in the scene based on a flag. * * \note The object->flag is tested against flag. */ -struct SceneObjectsIteratorExData { - Scene *scene; +typedef struct SceneObjectsIteratorExData { + struct Scene *scene; int flag; void *iter_data; -}; +} SceneObjectsIteratorExData; -void BKE_scene_objects_iterator_begin_ex(BLI_Iterator *iter, void *data_in); -void BKE_scene_objects_iterator_next_ex(BLI_Iterator *iter); -void BKE_scene_objects_iterator_end_ex(BLI_Iterator *iter); +void BKE_scene_objects_iterator_begin_ex(struct BLI_Iterator *iter, void *data_in); +void BKE_scene_objects_iterator_next_ex(struct BLI_Iterator *iter); +void BKE_scene_objects_iterator_end_ex(struct BLI_Iterator *iter); /** * Generate a new #GSet (or extend given `objects_gset` if not NULL) with all objects referenced by @@ -380,7 +413,7 @@ void BKE_scene_objects_iterator_end_ex(BLI_Iterator *iter); * \note This will include objects without a base currently * (because they would belong to excluded collections only e.g.). */ -GSet *BKE_scene_objects_as_gset(Scene *scene, GSet *objects_gset); +struct GSet *BKE_scene_objects_as_gset(struct Scene *scene, struct GSet *objects_gset); #define FOREACH_SCENE_COLLECTION_BEGIN(scene, _instance) \ ITER_BEGIN (BKE_scene_collections_iterator_begin, \ @@ -402,16 +435,16 @@ GSet *BKE_scene_objects_as_gset(Scene *scene, GSet *objects_gset); _instance_next = _scene->master_collection; \ } \ else { \ - _instance_next = static_cast((_bmain)->collections.first); \ + _instance_next = (Collection *)(_bmain)->collections.first; \ } \ \ while ((_instance = _instance_next)) { \ if (is_scene_collection) { \ - _instance_next = static_cast((_bmain)->collections.first); \ + _instance_next = (Collection *)(_bmain)->collections.first; \ is_scene_collection = false; \ } \ else { \ - _instance_next = static_cast(_instance->id.next); \ + _instance_next = (Collection *)_instance->id.next; \ } #define FOREACH_COLLECTION_END \ @@ -428,3 +461,7 @@ GSet *BKE_scene_objects_as_gset(Scene *scene, GSet *objects_gset); _instance) #define FOREACH_SCENE_OBJECT_END ITER_END + +#ifdef __cplusplus +} +#endif diff --git a/source/blender/blenkernel/BKE_constraint.h b/source/blender/blenkernel/BKE_constraint.h index f6ccb1bd8db..c3ff9a190e1 100644 --- a/source/blender/blenkernel/BKE_constraint.h +++ b/source/blender/blenkernel/BKE_constraint.h @@ -9,6 +9,7 @@ */ struct BlendDataReader; +struct BlendLibReader; struct BlendWriter; struct Depsgraph; struct ID; diff --git a/source/blender/blenkernel/BKE_curve.hh b/source/blender/blenkernel/BKE_curve.hh index 9624588b38e..7ce2203a8f6 100644 --- a/source/blender/blenkernel/BKE_curve.hh +++ b/source/blender/blenkernel/BKE_curve.hh @@ -19,6 +19,7 @@ struct BezTriple; struct BezTriple; struct BMEditMesh; +struct BoundBox; struct BPoint; struct Curve; struct Depsgraph; @@ -31,7 +32,7 @@ struct Object; struct rctf; struct TextBox; -using eBezTriple_Flag__Alias = int; +typedef int eBezTriple_Flag__Alias; struct CurveCache { ListBase disp; diff --git a/source/blender/blenkernel/BKE_curves.hh b/source/blender/blenkernel/BKE_curves.hh index 375328d83e6..1ff4aad4b2b 100644 --- a/source/blender/blenkernel/BKE_curves.hh +++ b/source/blender/blenkernel/BKE_curves.hh @@ -727,7 +727,7 @@ void interpolate_to_evaluated(const GSpan src, const OffsetIndices evaluated_offsets, GMutableSpan dst); -float4 calculate_basis(const float parameter); +void calculate_basis(const float parameter, float4 &r_weights); /** * Interpolate the control point values for the given parameter on the piecewise segment. @@ -739,13 +739,14 @@ template T interpolate(const T &a, const T &b, const T &c, const T &d, const float parameter) { BLI_assert(0.0f <= parameter && parameter <= 1.0f); - const float4 weights = calculate_basis(parameter); + float4 n; + calculate_basis(parameter, n); if constexpr (is_same_any_v) { /* Save multiplications by adjusting weights after mix. */ - return 0.5f * attribute_math::mix4(weights, a, b, c, d); + return 0.5f * attribute_math::mix4(n, a, b, c, d); } else { - return attribute_math::mix4(weights * 0.5f, a, b, c, d); + return attribute_math::mix4(n * 0.5f, a, b, c, d); } } diff --git a/source/blender/blenkernel/BKE_customdata.hh b/source/blender/blenkernel/BKE_customdata.hh index 491dcd04ba7..101a1bbf121 100644 --- a/source/blender/blenkernel/BKE_customdata.hh +++ b/source/blender/blenkernel/BKE_customdata.hh @@ -73,7 +73,7 @@ extern const CustomData_MeshMasks CD_MASK_EVERYTHING; * CD_NUMTYPES elements, that indicate if a layer can be copied. */ /** Add/copy/merge allocation types. */ -enum eCDAllocType { +typedef enum eCDAllocType { /** Allocate and set to default, which is usually just zeroed memory. */ CD_SET_DEFAULT = 2, /** @@ -81,18 +81,18 @@ enum eCDAllocType { * if all layer values will be set by the caller after creating the layer. */ CD_CONSTRUCT = 5, -}; +} eCDAllocType; #define CD_TYPE_AS_MASK(_type) (eCustomDataMask)((eCustomDataMask)1 << (eCustomDataMask)(_type)) void customData_mask_layers__print(const CustomData_MeshMasks *mask); -using cd_interp = void (*)( +typedef void (*cd_interp)( const void **sources, const float *weights, const float *sub_weights, int count, void *dest); -using cd_copy = void (*)(const void *source, void *dest, int count); -using cd_set_default_value = void (*)(void *data, int count); -using cd_free = void (*)(void *data, int count); -using cd_validate = bool (*)(void *item, uint totitems, bool do_fixes); +typedef void (*cd_copy)(const void *source, void *dest, int count); +typedef void (*cd_set_default_value)(void *data, int count); +typedef void (*cd_free)(void *data, int count); +typedef bool (*cd_validate)(void *item, uint totitems, bool do_fixes); /** * Update mask_dst with layers defined in mask_src (equivalent to a bit-wise OR). @@ -261,17 +261,14 @@ const void *CustomData_add_layer_with_data(CustomData *data, /** * Same as above but accepts a name. */ -void *CustomData_add_layer_named(CustomData *data, - eCustomDataType type, - eCDAllocType alloctype, - int totelem, - blender::StringRef name); +void *CustomData_add_layer_named( + CustomData *data, eCustomDataType type, eCDAllocType alloctype, int totelem, const char *name); const void *CustomData_add_layer_named_with_data(CustomData *data, eCustomDataType type, void *layer_data, int totelem, - blender::StringRef name, + const char *name, const ImplicitSharingInfoHandle *sharing_info); void *CustomData_add_layer_anonymous(CustomData *data, @@ -294,7 +291,7 @@ const void *CustomData_add_layer_anonymous_with_data( * In edit-mode, use #EDBM_data_layer_free instead of this function. */ bool CustomData_free_layer(CustomData *data, eCustomDataType type, int totelem, int index); -bool CustomData_free_layer_named(CustomData *data, blender::StringRef name, const int totelem); +bool CustomData_free_layer_named(CustomData *data, const char *name, const int totelem); /** * Frees the layer index with the give type. @@ -313,9 +310,7 @@ void CustomData_free_layers(CustomData *data, eCustomDataType type, int totelem) * Returns true if a layer with the specified type exists. */ bool CustomData_has_layer(const CustomData *data, eCustomDataType type); -bool CustomData_has_layer_named(const CustomData *data, - eCustomDataType type, - blender::StringRef name); +bool CustomData_has_layer_named(const CustomData *data, eCustomDataType type, const char *name); /** * Returns the number of layers with this type. @@ -495,10 +490,7 @@ void *CustomData_bmesh_get_n(const CustomData *data, void *block, eCustomDataTyp */ void *CustomData_bmesh_get_layer_n(const CustomData *data, void *block, int n); -bool CustomData_set_layer_name(CustomData *data, - eCustomDataType type, - int n, - blender::StringRef name); +bool CustomData_set_layer_name(CustomData *data, eCustomDataType type, int n, const char *name); const char *CustomData_get_layer_name(const CustomData *data, eCustomDataType type, int n); /** @@ -521,31 +513,27 @@ void *CustomData_get_layer_n_for_write(CustomData *data, eCustomDataType type, i */ const void *CustomData_get_layer_named(const CustomData *data, eCustomDataType type, - blender::StringRef name); + const char *name); void *CustomData_get_layer_named_for_write(CustomData *data, eCustomDataType type, - blender::StringRef name, + const char *name, int totelem); int CustomData_get_offset(const CustomData *data, eCustomDataType type); -int CustomData_get_offset_named(const CustomData *data, - eCustomDataType type, - blender::StringRef name); +int CustomData_get_offset_named(const CustomData *data, eCustomDataType type, const char *name); int CustomData_get_n_offset(const CustomData *data, eCustomDataType type, int n); int CustomData_get_layer_index(const CustomData *data, eCustomDataType type); int CustomData_get_layer_index_n(const CustomData *data, eCustomDataType type, int n); int CustomData_get_named_layer_index(const CustomData *data, eCustomDataType type, - blender::StringRef name); -int CustomData_get_named_layer_index_notype(const CustomData *data, blender::StringRef name); + const char *name); +int CustomData_get_named_layer_index_notype(const CustomData *data, const char *name); int CustomData_get_active_layer_index(const CustomData *data, eCustomDataType type); int CustomData_get_render_layer_index(const CustomData *data, eCustomDataType type); int CustomData_get_clone_layer_index(const CustomData *data, eCustomDataType type); int CustomData_get_stencil_layer_index(const CustomData *data, eCustomDataType type); -int CustomData_get_named_layer(const CustomData *data, - eCustomDataType type, - blender::StringRef name); +int CustomData_get_named_layer(const CustomData *data, eCustomDataType type, const char *name); int CustomData_get_active_layer(const CustomData *data, eCustomDataType type); int CustomData_get_render_layer(const CustomData *data, eCustomDataType type); int CustomData_get_clone_layer(const CustomData *data, eCustomDataType type); @@ -643,7 +631,7 @@ void CustomData_set_layer_unique_name(CustomData *data, int index); void CustomData_validate_layer_name(const CustomData *data, eCustomDataType type, - blender::StringRef name, + const char *name, char *outname); /** @@ -812,5 +800,4 @@ void CustomData_debug_info_from_layers(const CustomData *data, const char *inden namespace blender::bke { std::optional custom_data_type_to_volume_grid_type(eCustomDataType type); -std::optional volume_grid_type_to_custom_data_type(VolumeGridType type); } // namespace blender::bke diff --git a/source/blender/blenkernel/BKE_data_transfer.h b/source/blender/blenkernel/BKE_data_transfer.h index b1c8fdf704f..f0be0cd5717 100644 --- a/source/blender/blenkernel/BKE_data_transfer.h +++ b/source/blender/blenkernel/BKE_data_transfer.h @@ -17,6 +17,7 @@ extern "C" { struct Depsgraph; struct Object; struct ReportList; +struct Scene; struct SpaceTransform; /* Warning, those def are stored in files (TransferData modifier), *DO NOT* modify those values. */ diff --git a/source/blender/blenkernel/BKE_duplilist.hh b/source/blender/blenkernel/BKE_duplilist.h similarity index 62% rename from source/blender/blenkernel/BKE_duplilist.hh rename to source/blender/blenkernel/BKE_duplilist.h index 5b5cc52474e..c78a98129f7 100644 --- a/source/blender/blenkernel/BKE_duplilist.hh +++ b/source/blender/blenkernel/BKE_duplilist.h @@ -1,13 +1,25 @@ /* SPDX-FileCopyrightText: 2001-2002 NaN Holding BV. All rights reserved. * * SPDX-License-Identifier: GPL-2.0-or-later */ - #pragma once /** \file * \ingroup bke */ +#ifdef __cplusplus +namespace blender::bke { +struct GeometrySet; +} +using GeometrySetHandle = blender::bke::GeometrySet; +#else +typedef struct GeometrySetHandle GeometrySetHandle; +#endif + +#ifdef __cplusplus +extern "C" { +#endif + struct Depsgraph; struct ID; struct ListBase; @@ -16,9 +28,6 @@ struct ParticleSystem; struct Scene; struct ViewLayer; struct ViewerPath; -namespace blender::bke { -struct GeometrySet; -} /* ---------------------------------------------------- */ /* Dupli-Geometry */ @@ -26,29 +35,31 @@ struct GeometrySet; /** * \return a #ListBase of #DupliObject. */ -ListBase *object_duplilist(Depsgraph *depsgraph, Scene *sce, Object *ob); +struct ListBase *object_duplilist(struct Depsgraph *depsgraph, + struct Scene *sce, + struct Object *ob); /** * \return a #ListBase of #DupliObject for the preview geometry referenced by the #ViewerPath. */ -ListBase *object_duplilist_preview(Depsgraph *depsgraph, - Scene *scene, - Object *ob, - const ViewerPath *viewer_path); -void free_object_duplilist(ListBase *lb); +struct ListBase *object_duplilist_preview(struct Depsgraph *depsgraph, + struct Scene *scene, + struct Object *ob, + const struct ViewerPath *viewer_path); +void free_object_duplilist(struct ListBase *lb); -struct DupliObject { - DupliObject *next, *prev; +typedef struct DupliObject { + struct DupliObject *next, *prev; /* Object whose geometry is instanced. */ - Object *ob; + struct Object *ob; /* Data owned by the object above that is instanced. This might not be the same as `ob->data`. */ - ID *ob_data; + struct ID *ob_data; float mat[4][4]; float orco[3], uv[2]; - short type; /* From #Object::transflag. */ + short type; /* from Object.transflag */ char no_draw; /* If this dupli object is belongs to a preview, this is non-null. */ - const blender::bke::GeometrySet *preview_base_geometry; + const GeometrySetHandle *preview_base_geometry; /* Index of the top-level instance this dupli is part of or -1 when unused. */ int preview_instance_index; @@ -57,7 +68,7 @@ struct DupliObject { int persistent_id[8]; /* MAX_DUPLI_RECUR */ /* Particle this dupli was generated from. */ - ParticleSystem *particle_system; + struct ParticleSystem *particle_system; /* Geometry set stack for instance attributes; for each level lists the * geometry set and instance index within it. @@ -68,19 +79,19 @@ struct DupliObject { * size between 1 and MAX_DUPLI_RECUR can be used without issues. */ int instance_idx[4]; - const blender::bke::GeometrySet *instance_data[4]; + const GeometrySetHandle *instance_data[4]; /* Random ID for shading */ unsigned int random_id; -}; +} DupliObject; /** * Look up the RGBA value of a uniform shader attribute. * \return true if the attribute was found; if not, r_value is also set to zero. */ -bool BKE_object_dupli_find_rgba_attribute(const Object *ob, - const DupliObject *dupli, - const Object *dupli_parent, +bool BKE_object_dupli_find_rgba_attribute(const struct Object *ob, + const struct DupliObject *dupli, + const struct Object *dupli_parent, const char *name, float r_value[4]); @@ -88,7 +99,11 @@ bool BKE_object_dupli_find_rgba_attribute(const Object *ob, * Look up the RGBA value of a view layer/scene/world shader attribute. * \return true if the attribute was found; if not, r_value is also set to zero. */ -bool BKE_view_layer_find_rgba_attribute(const Scene *scene, - const ViewLayer *layer, +bool BKE_view_layer_find_rgba_attribute(const struct Scene *scene, + const struct ViewLayer *layer, const char *name, float r_value[4]); + +#ifdef __cplusplus +} +#endif diff --git a/source/blender/blenkernel/BKE_fcurve.hh b/source/blender/blenkernel/BKE_fcurve.h similarity index 70% rename from source/blender/blenkernel/BKE_fcurve.hh rename to source/blender/blenkernel/BKE_fcurve.h index 2ffbb42f5de..3ab81d00f85 100644 --- a/source/blender/blenkernel/BKE_fcurve.hh +++ b/source/blender/blenkernel/BKE_fcurve.h @@ -1,4 +1,4 @@ -/* SPDX-FileCopyrightText: 2024 Blender Authors +/* SPDX-FileCopyrightText: 2009 Blender Authors, Joshua Leung. All rights reserved. * * SPDX-License-Identifier: GPL-2.0-or-later */ @@ -11,16 +11,20 @@ #include "BLI_math_vector_types.hh" #include "DNA_curve_types.h" +#ifdef __cplusplus +extern "C" { +#endif + struct ChannelDriver; struct FCM_EnvelopeData; struct FCurve; struct FModifier; -struct FCurvePathCache; struct AnimData; struct AnimationEvalContext; struct BezTriple; struct BlendDataReader; +struct BlendLibReader; struct BlendWriter; struct LibraryForeachIDData; struct PathResolvedRNA; @@ -43,7 +47,7 @@ struct bContext; * \warning it is not too advisable to reorder order of members of this struct, * as you'll have to edit quite a few (#FMODIFIER_NUM_TYPES) of these structs. */ -struct FModifierTypeInfo { +typedef struct FModifierTypeInfo { /* Admin/identity. */ /** #FMODIFIER_TYPE_* */ short type; @@ -62,27 +66,27 @@ struct FModifierTypeInfo { /* data management function pointers - special handling */ /** Free any data that is allocated separately (optional). */ - void (*free_data)(FModifier *fcm); + void (*free_data)(struct FModifier *fcm); /** Copy any special data that is allocated separately (optional). */ - void (*copy_data)(FModifier *fcm, const FModifier *src); + void (*copy_data)(struct FModifier *fcm, const struct FModifier *src); /** * Set settings for data that will be used for FCuModifier.data * (memory already allocated using #MEM_callocN). */ void (*new_data)(void *mdata); /** Verifies that the modifier settings are valid */ - void (*verify_data)(FModifier *fcm); + void (*verify_data)(struct FModifier *fcm); /* evaluation */ /** Evaluate time that the modifier requires the F-Curve to be evaluated at */ float (*evaluate_modifier_time)( - FCurve *fcu, FModifier *fcm, float cvalue, float evaltime, void *storage); + struct FCurve *fcu, struct FModifier *fcm, float cvalue, float evaltime, void *storage); /** Evaluate the modifier for the given time and 'accumulated' value */ void (*evaluate_modifier)( - FCurve *fcu, FModifier *fcm, float *cvalue, float evaltime, void *storage); -}; + struct FCurve *fcu, struct FModifier *fcm, float *cvalue, float evaltime, void *storage); +} FModifierTypeInfo; /* Values which describe the behavior of a FModifier Type */ -enum eFMI_Action_Types { +typedef enum eFMI_Action_Types { /* modifier only modifies values outside of data range */ FMI_TYPE_EXTRAPOLATION = 0, /* modifier leaves data-points alone, but adjusts the interpolation between and around them */ @@ -91,10 +95,10 @@ enum eFMI_Action_Types { FMI_TYPE_REPLACE_VALUES, /* modifier generates a curve regardless of what came before */ FMI_TYPE_GENERATE_CURVE, -}; +} eFMI_Action_Types; /* Flags for the requirements of a FModifier Type */ -enum eFMI_Requirement_Flags { +typedef enum eFMI_Requirement_Flags { /* modifier requires original data-points (kind of beats the purpose of a modifier stack?) */ FMI_REQUIRES_ORIGINAL_DATA = (1 << 0), /* modifier doesn't require on any preceding data (i.e. it will generate a curve). @@ -103,7 +107,7 @@ enum eFMI_Requirement_Flags { FMI_REQUIRES_NOTHING = (1 << 1), /* refer to modifier instance */ FMI_REQUIRES_RUNTIME_CHECK = (1 << 2), -}; +} eFMI_Requirement_Flags; /* Function Prototypes for FModifierTypeInfo's */ @@ -111,7 +115,7 @@ enum eFMI_Requirement_Flags { * This function should always be used to get the appropriate type-info, * as it has checks which prevent segfaults in some weird cases. */ -const FModifierTypeInfo *fmodifier_get_typeinfo(const FModifier *fcm); +const FModifierTypeInfo *fmodifier_get_typeinfo(const struct FModifier *fcm); /** * This function should be used for getting the appropriate type-info when only * a F-Curve modifier type is known. @@ -123,11 +127,11 @@ const FModifierTypeInfo *get_fmodifier_typeinfo(int type); /** * Add a new F-Curve Modifier to the given F-Curve of a certain type. */ -FModifier *add_fmodifier(ListBase *modifiers, int type, FCurve *owner_fcu); +struct FModifier *add_fmodifier(ListBase *modifiers, int type, struct FCurve *owner_fcu); /** * Make a copy of the specified F-Modifier. */ -FModifier *copy_fmodifier(const FModifier *src); +struct FModifier *copy_fmodifier(const struct FModifier *src); /** * Duplicate all of the F-Modifiers in the Modifier stacks. */ @@ -135,7 +139,7 @@ void copy_fmodifiers(ListBase *dst, const ListBase *src); /** * Remove and free the given F-Modifier from the given stack. */ -bool remove_fmodifier(ListBase *modifiers, FModifier *fcm); +bool remove_fmodifier(ListBase *modifiers, struct FModifier *fcm); /** * Remove all of a given F-Curve's modifiers. */ @@ -144,11 +148,11 @@ void free_fmodifiers(ListBase *modifiers); /** * Find the active F-Modifier. */ -FModifier *find_active_fmodifier(ListBase *modifiers); +struct FModifier *find_active_fmodifier(ListBase *modifiers); /** * Set the active F-Modifier. */ -void set_active_fmodifier(ListBase *modifiers, FModifier *fcm); +void set_active_fmodifier(ListBase *modifiers, struct FModifier *fcm); /** * Do we have any modifiers which match certain criteria. @@ -158,11 +162,11 @@ void set_active_fmodifier(ListBase *modifiers, FModifier *fcm); */ bool list_has_suitable_fmodifier(const ListBase *modifiers, int mtype, short acttype); -struct FModifiersStackStorage { +typedef struct FModifiersStackStorage { uint modifier_count; uint size_per_modifier; void *buffer; -}; +} FModifiersStackStorage; uint evaluate_fmodifiers_storage_size_per_modifier(ListBase *modifiers); /** @@ -180,7 +184,7 @@ uint evaluate_fmodifiers_storage_size_per_modifier(ListBase *modifiers); */ float evaluate_time_fmodifiers(FModifiersStackStorage *storage, ListBase *modifiers, - FCurve *fcu, + struct FCurve *fcu, float cvalue, float evaltime); /** @@ -189,7 +193,7 @@ float evaluate_time_fmodifiers(FModifiersStackStorage *storage, */ void evaluate_value_fmodifiers(FModifiersStackStorage *storage, ListBase *modifiers, - FCurve *fcu, + struct FCurve *fcu, float *cvalue, float evaltime); @@ -197,9 +201,9 @@ void evaluate_value_fmodifiers(FModifiersStackStorage *storage, * Bake modifiers for given F-Curve to curve sample data, in the frame range defined * by start and end (inclusive). */ -void fcurve_bake_modifiers(FCurve *fcu, int start, int end); +void fcurve_bake_modifiers(struct FCurve *fcu, int start, int end); -int BKE_fcm_envelope_find_index(FCM_EnvelopeData *array, +int BKE_fcm_envelope_find_index(struct FCM_EnvelopeData *array, float frame, int arraylen, bool *r_exists); @@ -211,15 +215,15 @@ int BKE_fcm_envelope_find_index(FCM_EnvelopeData *array, #define BEZT_BINARYSEARCH_THRESH 0.01f /* was 0.00001, but giving errors */ /* -------- Data Management -------- */ -FCurve *BKE_fcurve_create(void); +struct FCurve *BKE_fcurve_create(void); /** * Frees the F-Curve itself too, so make sure #BLI_remlink is called before calling this. */ -void BKE_fcurve_free(FCurve *fcu); +void BKE_fcurve_free(struct FCurve *fcu); /** * Duplicate a F-Curve. */ -FCurve *BKE_fcurve_copy(const FCurve *fcu); +struct FCurve *BKE_fcurve_copy(const struct FCurve *fcu); /** * Frees a list of F-Curves. */ @@ -231,30 +235,30 @@ void BKE_fcurves_copy(ListBase *dst, ListBase *src); /* Set fcurve modifier name and ensure uniqueness. * Pass new name string when it's been edited otherwise pass empty string. */ -void BKE_fmodifier_name_set(FModifier *fcm, const char *name); +void BKE_fmodifier_name_set(struct FModifier *fcm, const char *name); /** * Callback used by lib_query to walk over all ID usages * (mimics `foreach_id` callback of #IDTypeInfo structure). */ -void BKE_fmodifiers_foreach_id(ListBase *fmodifiers, LibraryForeachIDData *data); +void BKE_fmodifiers_foreach_id(struct ListBase *fmodifiers, struct LibraryForeachIDData *data); /** * Callback used by lib_query to walk over all ID usages * (mimics `foreach_id` callback of #IDTypeInfo structure). */ -void BKE_fcurve_foreach_id(FCurve *fcu, LibraryForeachIDData *data); +void BKE_fcurve_foreach_id(struct FCurve *fcu, struct LibraryForeachIDData *data); /** * Find the F-Curve affecting the given RNA-access path + index, * in the list of F-Curves provided. */ -FCurve *BKE_fcurve_find(ListBase *list, const char rna_path[], int array_index); +struct FCurve *BKE_fcurve_find(ListBase *list, const char rna_path[], int array_index); /** * Quick way to loop over all f-curves of a given 'path'. */ -FCurve *BKE_fcurve_iter_step(FCurve *fcu_iter, const char rna_path[]); +struct FCurve *BKE_fcurve_iter_step(struct FCurve *fcu_iter, const char rna_path[]); /** * High level function to get an f-curve from C without having the RNA. @@ -271,8 +275,8 @@ FCurve *BKE_fcurve_iter_step(FCurve *fcu_iter, const char rna_path[]); * - Animated with driver: returns `NULL` and `*r_driven = true`. * - Not animated: returns `NULL` and `*r_driven = false`. */ -FCurve *id_data_find_fcurve( - ID *id, void *data, StructRNA *type, const char *prop_name, int index, bool *r_driven); +struct FCurve *id_data_find_fcurve( + ID *id, void *data, struct StructRNA *type, const char *prop_name, int index, bool *r_driven); /** * Get list of LinkData's containing pointers to the F-Curves @@ -302,22 +306,22 @@ int BKE_fcurves_filter(ListBase *dst, ListBase *src, const char *dataPrefix, con * \note Return pointer parameters (`r_action`, `r_driven` and `r_special`) are all optional and * may be NULL. */ -FCurve *BKE_animadata_fcurve_find_by_rna_path(AnimData *animdata, - const char *rna_path, - const int rna_index, - bAction **r_action, - bool *r_driven); +struct FCurve *BKE_animadata_fcurve_find_by_rna_path(struct AnimData *animdata, + const char *rna_path, + const int rna_index, + struct bAction **r_action, + bool *r_driven); /** * Find an f-curve based on an rna property. */ -FCurve *BKE_fcurve_find_by_rna(PointerRNA *ptr, - PropertyRNA *prop, - int rnaindex, - AnimData **r_adt, - bAction **r_action, - bool *r_driven, - bool *r_special); +struct FCurve *BKE_fcurve_find_by_rna(struct PointerRNA *ptr, + struct PropertyRNA *prop, + int rnaindex, + struct AnimData **r_adt, + struct bAction **r_action, + bool *r_driven, + bool *r_special); /** * Same as above, but takes a context data, * temp hack needed for complex paths like texture ones. @@ -325,20 +329,20 @@ FCurve *BKE_fcurve_find_by_rna(PointerRNA *ptr, * \param r_special: Optional, ignored when NULL. Set to `true` if the given RNA `ptr` is a NLA * strip, and the returned F-curve comes from this NLA strip. */ -FCurve *BKE_fcurve_find_by_rna_context_ui(bContext *C, - const PointerRNA *ptr, - PropertyRNA *prop, - int rnaindex, - AnimData **r_animdata, - bAction **r_action, - bool *r_driven, - bool *r_special); +struct FCurve *BKE_fcurve_find_by_rna_context_ui(struct bContext *C, + const struct PointerRNA *ptr, + struct PropertyRNA *prop, + int rnaindex, + struct AnimData **r_animdata, + struct bAction **r_action, + bool *r_driven, + bool *r_special); /** * Binary search algorithm for finding where to 'insert' #BezTriple with given frame number. * Returns the index to insert at (data already at that index will be offset if replace is 0) */ -int BKE_fcurve_bezt_binarysearch_index(const BezTriple array[], +int BKE_fcurve_bezt_binarysearch_index(const struct BezTriple array[], float frame, int arraylen, bool *r_replace); @@ -348,24 +352,30 @@ int BKE_fcurve_bezt_binarysearch_index(const BezTriple array[], /** * Cached f-curve look-ups, use when this needs to be done many times. */ -FCurvePathCache *BKE_fcurve_pathcache_create(ListBase *list); -void BKE_fcurve_pathcache_destroy(FCurvePathCache *fcache); -FCurve *BKE_fcurve_pathcache_find(FCurvePathCache *fcache, const char rna_path[], int array_index); +struct FCurvePathCache; +struct FCurvePathCache *BKE_fcurve_pathcache_create(ListBase *list); +void BKE_fcurve_pathcache_destroy(struct FCurvePathCache *fcache); +struct FCurve *BKE_fcurve_pathcache_find(struct FCurvePathCache *fcache, + const char rna_path[], + int array_index); /** * Fill in an array of F-Curve, leave NULL when not found. * * \return The number of F-Curves found. */ -int BKE_fcurve_pathcache_find_array(FCurvePathCache *fcache, +int BKE_fcurve_pathcache_find_array(struct FCurvePathCache *fcache, const char *rna_path, - FCurve **fcurve_result, + struct FCurve **fcurve_result, int fcurve_result_len); /** * Calculate the x range of the given F-Curve's data. * \return true if a range has been found. */ -bool BKE_fcurve_calc_range(const FCurve *fcu, float *r_min, float *r_max, bool selected_keys_only); +bool BKE_fcurve_calc_range(const struct FCurve *fcu, + float *r_min, + float *r_max, + bool selected_keys_only); /** * Calculate the x and y extents of F-Curve's data. @@ -373,11 +383,11 @@ bool BKE_fcurve_calc_range(const FCurve *fcu, float *r_min, float *r_max, bool s * Does the full range if NULL. * \return true if the bounds have been found. */ -bool BKE_fcurve_calc_bounds(const FCurve *fcu, +bool BKE_fcurve_calc_bounds(const struct FCurve *fcu, bool selected_keys_only, bool include_handles, const float frame_range[2], - rctf *r_bounds); + struct rctf *r_bounds); /** * Return an array of keyed frames, rounded to `interval`. @@ -387,11 +397,11 @@ bool BKE_fcurve_calc_bounds(const FCurve *fcu, * \note An interval of zero could be supported (this implies no rounding at all), * however this risks very small differences in float values being treated as separate keyframes. */ -float *BKE_fcurves_calc_keyed_frames_ex(FCurve **fcurve_array, +float *BKE_fcurves_calc_keyed_frames_ex(struct FCurve **fcurve_array, int fcurve_array_len, float interval, int *r_frames_len); -float *BKE_fcurves_calc_keyed_frames(FCurve **fcurve_array, +float *BKE_fcurves_calc_keyed_frames(struct FCurve **fcurve_array, int fcurve_array_len, int *r_frames_len); @@ -399,18 +409,18 @@ float *BKE_fcurves_calc_keyed_frames(FCurve **fcurve_array, * Set the index that stores the FCurve's active keyframe, assuming that \a active_bezt * is already part of `fcu->bezt`. If NULL, set active keyframe index to "none." */ -void BKE_fcurve_active_keyframe_set(FCurve *fcu, const BezTriple *active_bezt); +void BKE_fcurve_active_keyframe_set(struct FCurve *fcu, const struct BezTriple *active_bezt); /** * Get the active keyframe index, with sanity checks for point bounds. */ -int BKE_fcurve_active_keyframe_index(const FCurve *fcu); +int BKE_fcurve_active_keyframe_index(const struct FCurve *fcu); /** * Move the indexed keyframe to the given value, * and move the handles with it to ensure the slope remains the same. */ void BKE_fcurve_keyframe_move_time_with_handles(BezTriple *keyframe, const float new_time); -void BKE_fcurve_keyframe_move_value_with_handles(BezTriple *keyframe, float new_value); +void BKE_fcurve_keyframe_move_value_with_handles(struct BezTriple *keyframe, float new_value); /* .............. */ @@ -419,25 +429,25 @@ void BKE_fcurve_keyframe_move_value_with_handles(BezTriple *keyframe, float new_ * Usability of keyframes refers to whether they should be displayed, * and also whether they will have any influence on the final result. */ -bool BKE_fcurve_are_keyframes_usable(const FCurve *fcu); +bool BKE_fcurve_are_keyframes_usable(const struct FCurve *fcu); /** * Can keyframes be added to F-Curve? * Keyframes can only be added if they are already visible. */ -bool BKE_fcurve_is_keyframable(const FCurve *fcu); -bool BKE_fcurve_is_protected(const FCurve *fcu); +bool BKE_fcurve_is_keyframable(const struct FCurve *fcu); +bool BKE_fcurve_is_protected(const struct FCurve *fcu); /** * Are any of the keyframe control points selected on the F-Curve? */ -bool BKE_fcurve_has_selected_control_points(const FCurve *fcu); +bool BKE_fcurve_has_selected_control_points(const struct FCurve *fcu); /** * Checks if the F-Curve has a Cycles modifier with simple settings * that warrant transition smoothing. */ -bool BKE_fcurve_is_cyclic(const FCurve *fcu); +bool BKE_fcurve_is_cyclic(const struct FCurve *fcu); /* Type of infinite cycle for a curve. */ typedef enum eFCU_Cycle_Type { @@ -451,7 +461,7 @@ typedef enum eFCU_Cycle_Type { /** * Checks if the F-Curve has a Cycles modifier, and returns the type of the cycle behavior. */ -eFCU_Cycle_Type BKE_fcurve_get_cycle_type(const FCurve *fcu); +eFCU_Cycle_Type BKE_fcurve_get_cycle_type(const struct FCurve *fcu); /** * Recompute bezier handles of all three given BezTriples, so that `bezt` can be inserted between @@ -461,9 +471,9 @@ eFCU_Cycle_Type BKE_fcurve_get_cycle_type(const FCurve *fcu); * position. * \return Whether the split was successful. */ -bool BKE_fcurve_bezt_subdivide_handles(BezTriple *bezt, - BezTriple *prev, - BezTriple *next, +bool BKE_fcurve_bezt_subdivide_handles(struct BezTriple *bezt, + struct BezTriple *prev, + struct BezTriple *next, float *r_pdelta); /** @@ -472,7 +482,7 @@ bool BKE_fcurve_bezt_subdivide_handles(BezTriple *bezt, * \param new_totvert: new number of elements in the FCurve's `bezt` array. * Constraint: `0 <= new_totvert <= fcu->totvert` */ -void BKE_fcurve_bezt_shrink(FCurve *fcu, int new_totvert); +void BKE_fcurve_bezt_shrink(struct FCurve *fcu, int new_totvert); /** * Merge the two given BezTriple arrays `a` and `b` into a newly allocated BezTriple array of size @@ -489,7 +499,7 @@ BezTriple *BKE_bezier_array_merge( /** * Delete a keyframe from an F-curve at a specific index. */ -void BKE_fcurve_delete_key(FCurve *fcu, int index); +void BKE_fcurve_delete_key(struct FCurve *fcu, int index); /** Delete an index range of keyframes from an F-curve. This is more performant than individually * removing keys. @@ -502,12 +512,12 @@ void BKE_fcurve_delete_keys(FCurve *fcu, blender::uint2 index_range); /** * Delete selected keyframes from an F-curve. */ -bool BKE_fcurve_delete_keys_selected(FCurve *fcu); +bool BKE_fcurve_delete_keys_selected(struct FCurve *fcu); /** * Delete all keyframes from an F-curve. */ -void BKE_fcurve_delete_keys_all(FCurve *fcu); +void BKE_fcurve_delete_keys_all(struct FCurve *fcu); /** * Called during transform/snapping to make sure selected keyframes replace @@ -517,7 +527,9 @@ void BKE_fcurve_delete_keys_all(FCurve *fcu); * but may want to use a different one at times (if caller does not operate on * selection). */ -void BKE_fcurve_merge_duplicate_keys(FCurve *fcu, const int sel_flag, const bool use_handle); +void BKE_fcurve_merge_duplicate_keys(struct FCurve *fcu, + const int sel_flag, + const bool use_handle); /** * Ensure the FCurve is a proper function, such that every X-coordinate of the @@ -532,7 +544,7 @@ void BKE_fcurve_merge_duplicate_keys(FCurve *fcu, const int sel_flag, const bool * * After deduplication, call `BKE_fcurve_handles_recalc(fcu);` */ -void BKE_fcurve_deduplicate_keys(FCurve *fcu); +void BKE_fcurve_deduplicate_keys(struct FCurve *fcu); /* -------- Curve Sanity -------- */ @@ -542,7 +554,7 @@ void BKE_fcurve_deduplicate_keys(FCurve *fcu); * * If the BezTriples have been rearranged, sort them first before using this. */ -void BKE_fcurve_handles_recalc(FCurve *fcu); +void BKE_fcurve_handles_recalc(struct FCurve *fcu); /** * Variant of #BKE_fcurve_handles_recalc() that allows calculating based on a different select * flag. @@ -551,7 +563,7 @@ void BKE_fcurve_handles_recalc(FCurve *fcu); * Usually `SELECT`, but may want to use a different one at times * (if caller does not operate on selection). */ -void BKE_fcurve_handles_recalc_ex(FCurve *fcu, eBezTriple_Flag handle_sel_flag); +void BKE_fcurve_handles_recalc_ex(struct FCurve *fcu, eBezTriple_Flag handle_sel_flag); /** * Update handles, making sure the handle-types are valid (e.g. correctly deduced from an "Auto" * type), and recalculating their position vectors. @@ -562,16 +574,16 @@ void BKE_fcurve_handles_recalc_ex(FCurve *fcu, eBezTriple_Flag handle_sel_flag); * \param use_handle: Check selection state of individual handles, otherwise always update both * handles if the key is selected. */ -void testhandles_fcurve(FCurve *fcu, eBezTriple_Flag sel_flag, bool use_handle); +void testhandles_fcurve(struct FCurve *fcu, eBezTriple_Flag sel_flag, bool use_handle); /** * This function sorts BezTriples so that they are arranged in chronological order, * as tools working on F-Curves expect that the BezTriples are in order. */ -void sort_time_fcurve(FCurve *fcu); +void sort_time_fcurve(struct FCurve *fcu); /** * This function tests if any BezTriples are out of order, thus requiring a sort. */ -bool test_time_fcurve(FCurve *fcu); +bool test_time_fcurve(struct FCurve *fcu); /** * The length of each handle is not allowed to be more @@ -586,23 +598,23 @@ void BKE_fcurve_correct_bezpart(const float v1[2], float v2[2], float v3[2], con /* -------- Evaluation -------- */ /* evaluate fcurve */ -float evaluate_fcurve(FCurve *fcu, float evaltime); -float evaluate_fcurve_only_curve(FCurve *fcu, float evaltime); -float evaluate_fcurve_driver(PathResolvedRNA *anim_rna, - FCurve *fcu, - ChannelDriver *driver_orig, - const AnimationEvalContext *anim_eval_context); +float evaluate_fcurve(struct FCurve *fcu, float evaltime); +float evaluate_fcurve_only_curve(struct FCurve *fcu, float evaltime); +float evaluate_fcurve_driver(struct PathResolvedRNA *anim_rna, + struct FCurve *fcu, + struct ChannelDriver *driver_orig, + const struct AnimationEvalContext *anim_eval_context); /** * Checks if the curve has valid keys, drivers or modifiers that produce an actual curve. */ -bool BKE_fcurve_is_empty(const FCurve *fcu); +bool BKE_fcurve_is_empty(const struct FCurve *fcu); /** * Calculate the value of the given F-Curve at the given frame, * and store it's value in #FCurve.curval. */ -float calculate_fcurve(PathResolvedRNA *anim_rna, - FCurve *fcu, - const AnimationEvalContext *anim_eval_context); +float calculate_fcurve(struct PathResolvedRNA *anim_rna, + struct FCurve *fcu, + const struct AnimationEvalContext *anim_eval_context); /* ************* F-Curve Samples API ******************** */ @@ -614,7 +626,7 @@ float calculate_fcurve(PathResolvedRNA *anim_rna, * \param fcu: the F-Curve being operated on. * \param data: pointer to some specific data that may be used by one of the callbacks. */ -typedef float (*FcuSampleFunc)(FCurve *fcu, void *data, float evaltime); +typedef float (*FcuSampleFunc)(struct FCurve *fcu, void *data, float evaltime); /* ----- Sampling Callbacks ------ */ @@ -622,7 +634,7 @@ typedef float (*FcuSampleFunc)(FCurve *fcu, void *data, float evaltime); * Basic sampling callback which acts as a wrapper for #evaluate_fcurve() * 'data' arg here is unneeded here. */ -float fcurve_samplingcb_evalcurve(FCurve *fcu, void *data, float evaltime); +float fcurve_samplingcb_evalcurve(struct FCurve *fcu, void *data, float evaltime); /* -------- Main Methods -------- */ @@ -630,24 +642,24 @@ float fcurve_samplingcb_evalcurve(FCurve *fcu, void *data, float evaltime); * Main API function for creating a set of sampled curve data, given some callback function * used to retrieve the values to store. */ -void fcurve_store_samples(FCurve *fcu, void *data, int start, int end, FcuSampleFunc sample_cb); +void fcurve_store_samples( + struct FCurve *fcu, void *data, int start, int end, FcuSampleFunc sample_cb); /** * Convert baked/sampled f-curves into bezt/regular f-curves. */ -void fcurve_samples_to_keyframes(FCurve *fcu, int start, int end); +void fcurve_samples_to_keyframes(struct FCurve *fcu, int start, int end); /* ************* F-Curve .blend file API ******************** */ -void BKE_fmodifiers_blend_write(BlendWriter *writer, ListBase *fmodifiers); -void BKE_fmodifiers_blend_read_data(BlendDataReader *reader, ListBase *fmodifiers, FCurve *curve); +void BKE_fmodifiers_blend_write(struct BlendWriter *writer, struct ListBase *fmodifiers); +void BKE_fmodifiers_blend_read_data(struct BlendDataReader *reader, + ListBase *fmodifiers, + struct FCurve *curve); -/** - * Write the FCurve's data to the writer. - * If this is used to write an FCurve, be sure to call `BLO_write_struct(writer, FCurve, fcurve);` - * before calling this function. - */ -void BKE_fcurve_blend_write_data(BlendWriter *writer, FCurve *fcurve); -void BKE_fcurve_blend_write_listbase(BlendWriter *writer, ListBase *fcurves); -void BKE_fcurve_blend_read_data(BlendDataReader *reader, FCurve *fcu); -void BKE_fcurve_blend_read_data_listbase(BlendDataReader *reader, ListBase *fcurves); +void BKE_fcurve_blend_write(struct BlendWriter *writer, struct ListBase *fcurves); +void BKE_fcurve_blend_read_data(struct BlendDataReader *reader, struct ListBase *fcurves); + +#ifdef __cplusplus +} +#endif diff --git a/source/blender/blenkernel/BKE_fcurve_driver.h b/source/blender/blenkernel/BKE_fcurve_driver.h index 8cf22eec4e9..be73ac96b73 100644 --- a/source/blender/blenkernel/BKE_fcurve_driver.h +++ b/source/blender/blenkernel/BKE_fcurve_driver.h @@ -181,7 +181,7 @@ void BKE_driver_invalidate_expression(struct ChannelDriver *driver, * * - `anim_eval_context->eval_time` is the frame at which F-Curve is being evaluated. * - Has to return a float value. - * - \a driver_orig is where we cache Python expressions, in case of copy-on-eval + * - \a driver_orig is where we cache Python expressions, in case of COW */ float evaluate_driver(struct PathResolvedRNA *anim_rna, struct ChannelDriver *driver, diff --git a/source/blender/blenkernel/BKE_global.hh b/source/blender/blenkernel/BKE_global.h similarity index 94% rename from source/blender/blenkernel/BKE_global.hh rename to source/blender/blenkernel/BKE_global.h index 1abad1e3307..a143f0aab7a 100644 --- a/source/blender/blenkernel/BKE_global.hh +++ b/source/blender/blenkernel/BKE_global.h @@ -14,16 +14,13 @@ #include "BLI_utildefines.h" #include "DNA_listBase.h" +#ifdef __cplusplus +extern "C" { +#endif + struct Main; -/** - * Global data, typically accessed from #G. - * See: #BKE_blender_globals_init & #BKE_blender_globals_clear. - * - * \note This is run-time only but some global data is written - * to #FileGlobal which is used to initialize members of #Global. - */ -struct Global { +typedef struct Global { /** * Data for the current active blend file. @@ -31,13 +28,13 @@ struct Global { * Note that `CTX_data_main(C)` should be used where possible. * Otherwise access via #G_MAIN. */ - Main *main; + struct Main *main; /** * Preview main is stored to avoid loading the preview file in multiple scenarios. * It is actually shared between shader node previews and asset previews. */ - Main *pr_main; + struct Main *pr_main; /** Last saved location for images. */ char filepath_last_image[/*FILE_MAX*/ 1024]; @@ -48,7 +45,7 @@ struct Global { * Strings of recently opened files to show in the file menu. * A list of #RecentFile read from #BLENDER_HISTORY_FILE. */ - ListBase recent_files; + struct ListBase recent_files; /** * Set when Escape been pressed or `Ctrl-C` pressed in background mode. @@ -65,14 +62,6 @@ struct Global { */ bool background; - /** - * When true, suppress any non-error print messages such as files saves, loaded, quitting etc. - * This is used so command line tools can control output without unnecessary noise. - * - * \note This should only be used to suppress printing (not reports or other kinds of logging). - */ - bool quiet; - /** * Skip reading the startup file and user preferences. * Also disable saving the preferences on exit (see #G_FLAG_USERPREF_NO_SAVE_ON_EXIT), @@ -173,7 +162,7 @@ struct Global { bool opengl_deprecation_usage_detected; const char *opengl_deprecation_usage_filename; int opengl_deprecation_usage_lineno; -}; +} Global; /* **************** GLOBAL ********************* */ @@ -301,3 +290,7 @@ extern Global G; * helps with cleanup task. */ #define G_MAIN (G).main + +#ifdef __cplusplus +} +#endif diff --git a/source/blender/blenkernel/BKE_gpencil_geom_legacy.h b/source/blender/blenkernel/BKE_gpencil_geom_legacy.h index dbbad2af4d2..cf0861850ba 100644 --- a/source/blender/blenkernel/BKE_gpencil_geom_legacy.h +++ b/source/blender/blenkernel/BKE_gpencil_geom_legacy.h @@ -488,7 +488,7 @@ void BKE_gpencil_stroke_from_view_space(struct bGPDstroke *gps, /** * Calculates the perimeter of a stroke projected from the view and returns it as a new stroke. * \param subdivisions: Number of subdivisions for the start and end caps. - * \return bGPDstroke pointer to stroke perimeter. + * \return: bGPDstroke pointer to stroke perimeter. */ struct bGPDstroke *BKE_gpencil_stroke_perimeter_from_view(float viewmat[4][4], struct bGPdata *gpd, diff --git a/source/blender/blenkernel/BKE_gpencil_modifier_legacy.h b/source/blender/blenkernel/BKE_gpencil_modifier_legacy.h index 98ca3406eb7..42799374e7c 100644 --- a/source/blender/blenkernel/BKE_gpencil_modifier_legacy.h +++ b/source/blender/blenkernel/BKE_gpencil_modifier_legacy.h @@ -16,6 +16,7 @@ extern "C" { struct ARegionType; struct BlendDataReader; +struct BlendLibReader; struct BlendWriter; struct Depsgraph; struct GpencilModifierData; diff --git a/source/blender/blenkernel/BKE_grease_pencil.hh b/source/blender/blenkernel/BKE_grease_pencil.hh index 9b6030f2b1c..2322df93546 100644 --- a/source/blender/blenkernel/BKE_grease_pencil.hh +++ b/source/blender/blenkernel/BKE_grease_pencil.hh @@ -34,6 +34,14 @@ namespace blender::bke { namespace greasepencil { +struct DrawingTransforms { + float4x4 world_space_to_layer_space; + float4x4 layer_space_to_world_space; + + DrawingTransforms() = default; + DrawingTransforms(const Object &grease_pencil_ob); +}; + class DrawingRuntime { public: /** @@ -148,7 +156,6 @@ class Layer; bool is_selected() const; \ void set_selected(bool selected); \ bool use_onion_skinning() const; \ - bool use_masks() const; \ bool is_child_of(const LayerGroup &group) const; /* Implements the forwarding of the methods defined by #TREENODE_COMMON_METHODS. */ @@ -193,10 +200,6 @@ class Layer; { \ return this->as_node().use_onion_skinning(); \ } \ - inline bool class_name::use_masks() const \ - { \ - return this->as_node().use_masks(); \ - } \ inline bool class_name::is_child_of(const LayerGroup &group) const \ { \ return this->as_node().is_child_of(group); \ @@ -444,30 +447,6 @@ class Layer : public ::GreasePencilLayer { */ void update_from_dna_read(); - /** - * Returns the transformation from layer space to object space. - */ - float4x4 to_object_space(const Object &object) const; - - /** - * Returns the transformation from layer space to world space. - */ - float4x4 to_world_space(const Object &object) const; - - /** - * Returns the name of the parent bone. Should only be used in case the parent object is an - * armature. - */ - StringRefNull parent_bone_name() const; - void set_parent_bone_name(const char *new_name); - - /** - * Returns the view layer name that this layer should be rendered in or an empty - * `StringRefNull` if no such name is set. - */ - StringRefNull view_layer_name() const; - void set_view_layer_name(const char *new_name); - private: using SortedKeysIterator = const int *; @@ -481,16 +460,6 @@ class Layer : public ::GreasePencilLayer { */ SortedKeysIterator remove_leading_null_frames_in_range(SortedKeysIterator begin, SortedKeysIterator end); - - /** - * The local transform of the layer (in layer space, not object space). - */ - float4x4 local_transform() const; - - /** - * Get the parent to world matrix for this layer. - */ - float4x4 parent_to_world(const Object &parent) const; }; class LayerGroupRuntime { @@ -525,8 +494,6 @@ class LayerGroup : public ::GreasePencilLayerTreeGroup { LayerGroup(const LayerGroup &other); ~LayerGroup(); - LayerGroup &operator=(const LayerGroup &other); - public: /* Define the common functions for #TreeNode. */ TREENODE_COMMON_METHODS; @@ -690,11 +657,6 @@ inline bool TreeNode::use_onion_skinning() const { return ((this->flag & GP_LAYER_TREE_NODE_USE_ONION_SKINNING) != 0); } -inline bool TreeNode::use_masks() const -{ - return ((this->flag & GP_LAYER_TREE_NODE_HIDE_MASKS) == 0) && - (!this->parent_group() || this->parent_group()->as_node().use_masks()); -} inline bool TreeNode::is_child_of(const LayerGroup &group) const { if (const LayerGroup *parent = this->parent_group()) { @@ -741,6 +703,14 @@ inline LayerGroup &Layer::parent_group() const TREENODE_COMMON_METHODS_FORWARD_IMPL(LayerGroup); +namespace convert { + +void legacy_gpencil_frame_to_grease_pencil_drawing(const bGPDframe &gpf, + const ListBase &vertex_group_names, + GreasePencilDrawing &r_drawing); +void legacy_gpencil_to_grease_pencil(Main &main, GreasePencil &grease_pencil, bGPdata &gpd); + +} // namespace convert } // namespace greasepencil class GreasePencilRuntime { diff --git a/source/blender/blenkernel/BKE_grease_pencil_legacy_convert.hh b/source/blender/blenkernel/BKE_grease_pencil_legacy_convert.hh deleted file mode 100644 index b9a20559e64..00000000000 --- a/source/blender/blenkernel/BKE_grease_pencil_legacy_convert.hh +++ /dev/null @@ -1,40 +0,0 @@ -/* SPDX-FileCopyrightText: 2023 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -#pragma once - -/** \file - * \ingroup bke - */ - -struct bGPdata; -struct bGPDframe; -struct GreasePencil; -struct GreasePencilDrawing; -struct ListBase; -struct Main; -struct Object; -struct LineartGpencilModifierData; -struct GreasePencilLineartModifierData; - -namespace blender::bke::greasepencil::convert { - -void legacy_gpencil_frame_to_grease_pencil_drawing(const bGPDframe &gpf, - const ListBase &vertex_group_names, - GreasePencilDrawing &r_drawing); -void legacy_gpencil_to_grease_pencil(Main &bmain, GreasePencil &grease_pencil, bGPdata &gpd); - -void legacy_gpencil_object(Main &bmain, Object &object); - -void thickness_factor_to_modifier(const bGPdata &src_object_data, Object &dst_object); -void layer_adjustments_to_modifiers(Main &bmain, - const bGPdata &src_object_data, - Object &dst_object); - -void lineart_wrap_v3(const LineartGpencilModifierData *lmd_legacy, - GreasePencilLineartModifierData *lmd); -void lineart_unwrap_v3(LineartGpencilModifierData *lmd_legacy, - const GreasePencilLineartModifierData *lmd); - -} // namespace blender::bke::greasepencil::convert diff --git a/source/blender/blenkernel/BKE_icons.h b/source/blender/blenkernel/BKE_icons.h index d2777da56e2..ae786b82f90 100644 --- a/source/blender/blenkernel/BKE_icons.h +++ b/source/blender/blenkernel/BKE_icons.h @@ -74,6 +74,8 @@ struct Icon_Geom { typedef struct Icon Icon; +struct BlendDataReader; +struct BlendWriter; struct ID; struct ImBuf; struct PreviewImage; diff --git a/source/blender/blenkernel/BKE_idprop.h b/source/blender/blenkernel/BKE_idprop.h index f4d24235edb..41c9eb2435f 100644 --- a/source/blender/blenkernel/BKE_idprop.h +++ b/source/blender/blenkernel/BKE_idprop.h @@ -16,11 +16,13 @@ extern "C" { #endif struct BlendDataReader; +struct BlendLibReader; struct BlendWriter; struct ID; struct IDProperty; struct IDPropertyUIData; struct IDPropertyUIDataEnumItem; +struct Library; typedef union IDPropertyTemplate { int i; diff --git a/source/blender/blenkernel/BKE_idtype.hh b/source/blender/blenkernel/BKE_idtype.hh index b2c84877e9c..6c34de86ade 100644 --- a/source/blender/blenkernel/BKE_idtype.hh +++ b/source/blender/blenkernel/BKE_idtype.hh @@ -10,8 +10,6 @@ * ID type structure, helping to factorize common operations and data for all data-block types. */ -#include - #include "BLI_sys_types.h" struct AssetTypeInfo; @@ -20,7 +18,6 @@ struct BlendDataReader; struct BlendLibReader; struct BlendWriter; struct ID; -struct Library; struct LibraryForeachIDData; struct Main; @@ -63,41 +60,40 @@ bool BKE_idtype_cache_key_cmp(const void *key_a_v, const void *key_b_v); /* ********** Prototypes for #IDTypeInfo callbacks. ********** */ -using IDTypeInitDataFunction = void (*)(ID *id); +typedef void (*IDTypeInitDataFunction)(ID *id); /** \param flag: Copying options (see BKE_lib_id.hh's LIB_ID_COPY_... flags for more). */ -using IDTypeCopyDataFunction = void (*)( - Main *bmain, std::optional owner_library, ID *id_dst, const ID *id_src, int flag); +typedef void (*IDTypeCopyDataFunction)(Main *bmain, ID *id_dst, const ID *id_src, int flag); -using IDTypeFreeDataFunction = void (*)(ID *id); +typedef void (*IDTypeFreeDataFunction)(ID *id); /** \param flags: See BKE_lib_id.hh's LIB_ID_MAKELOCAL_... flags. */ -using IDTypeMakeLocalFunction = void (*)(Main *bmain, ID *id, int flags); +typedef void (*IDTypeMakeLocalFunction)(Main *bmain, ID *id, int flags); -using IDTypeForeachIDFunction = void (*)(ID *id, LibraryForeachIDData *data); +typedef void (*IDTypeForeachIDFunction)(ID *id, LibraryForeachIDData *data); -enum eIDTypeInfoCacheCallbackFlags { +typedef enum eIDTypeInfoCacheCallbackFlags { /** Indicates to the callback that cache may be stored in the .blend file, * so its pointer should not be cleared at read-time. */ IDTYPE_CACHE_CB_FLAGS_PERSISTENT = 1 << 0, -}; -using IDTypeForeachCacheFunctionCallback = - void (*)(ID *id, const IDCacheKey *cache_key, void **cache_p, uint flags, void *user_data); -using IDTypeForeachCacheFunction = void (*)(ID *id, - IDTypeForeachCacheFunctionCallback function_callback, - void *user_data); +} eIDTypeInfoCacheCallbackFlags; +typedef void (*IDTypeForeachCacheFunctionCallback)( + ID *id, const IDCacheKey *cache_key, void **cache_p, uint flags, void *user_data); +typedef void (*IDTypeForeachCacheFunction)(ID *id, + IDTypeForeachCacheFunctionCallback function_callback, + void *user_data); -using IDTypeForeachPathFunction = void (*)(ID *id, BPathForeachPathData *bpath_data); +typedef void (*IDTypeForeachPathFunction)(ID *id, BPathForeachPathData *bpath_data); -using IDTypeEmbeddedOwnerPointerGetFunction = ID **(*)(ID *id); +typedef ID **(*IDTypeEmbeddedOwnerPointerGetFunction)(ID *id); -using IDTypeBlendWriteFunction = void (*)(BlendWriter *writer, ID *id, const void *id_address); -using IDTypeBlendReadDataFunction = void (*)(BlendDataReader *reader, ID *id); -using IDTypeBlendReadAfterLiblinkFunction = void (*)(BlendLibReader *reader, ID *id); +typedef void (*IDTypeBlendWriteFunction)(BlendWriter *writer, ID *id, const void *id_address); +typedef void (*IDTypeBlendReadDataFunction)(BlendDataReader *reader, ID *id); +typedef void (*IDTypeBlendReadAfterLiblinkFunction)(BlendLibReader *reader, ID *id); -using IDTypeBlendReadUndoPreserve = void (*)(BlendLibReader *reader, ID *id_new, ID *id_old); +typedef void (*IDTypeBlendReadUndoPreserve)(BlendLibReader *reader, ID *id_new, ID *id_old); -using IDTypeLibOverrideApplyPost = void (*)(ID *id_dst, ID *id_src); +typedef void (*IDTypeLibOverrideApplyPost)(ID *id_dst, ID *id_src); struct IDTypeInfo { /* ********** General IDType data. ********** */ @@ -113,14 +109,6 @@ struct IDTypeInfo { */ uint64_t id_filter; - /** - * Known types of ID dependencies. - * - * Used by #BKE_library_id_can_use_filter_id, together with additional runtime heuristics, to - * generate a filter value containing only ID types that given ID could be using. - */ - uint64_t dependencies_id_types; - /** * Define the position of this data-block type in the virtual list of all data in a Main that is * returned by `set_listbasepointers()`. @@ -273,7 +261,6 @@ extern IDTypeInfo IDType_ID_CV; extern IDTypeInfo IDType_ID_PT; extern IDTypeInfo IDType_ID_VO; extern IDTypeInfo IDType_ID_GP; -extern IDTypeInfo IDType_ID_AN; /** Empty shell mostly, but needed for read code. */ extern IDTypeInfo IDType_ID_LINK_PLACEHOLDER; @@ -281,10 +268,9 @@ extern IDTypeInfo IDType_ID_LINK_PLACEHOLDER; /* ********** Helpers/Utils API. ********** */ /* Module initialization. */ -void BKE_idtype_init(); +void BKE_idtype_init(void); /* General helpers. */ -const IDTypeInfo *BKE_idtype_get_info_from_idtype_index(const int idtype_index); const IDTypeInfo *BKE_idtype_get_info_from_idcode(short id_code); const IDTypeInfo *BKE_idtype_get_info_from_id(const ID *id); @@ -350,24 +336,6 @@ bool BKE_idtype_idcode_append_is_reusable(short idcode); */ short BKE_idtype_idcode_from_name(const char *idtype_name); -/** - * Convert an \a idcode into an \a idtype_index (e.g. #ID_OB -> #INDEX_ID_OB). - */ -int BKE_idtype_idcode_to_index(short idcode); -/** - * Convert an \a idfilter into an \a idtype_index (e.g. #FILTER_ID_OB -> #INDEX_ID_OB). - */ -int BKE_idtype_idfilter_to_index(uint64_t idfilter); - -/** - * Convert an \a idtype_index into an \a idcode (e.g. #INDEX_ID_OB -> #ID_OB). - */ -short BKE_idtype_index_to_idcode(int idtype_index); -/** - * Convert an \a idtype_index into an \a idfilter (e.g. #INDEX_ID_OB -> #FILTER_ID_OB). - */ -uint64_t BKE_idtype_index_to_idfilter(int idtype_index); - /** * Convert an \a idcode into an \a idfilter (e.g. #ID_OB -> #FILTER_ID_OB). */ @@ -375,7 +343,16 @@ uint64_t BKE_idtype_idcode_to_idfilter(short idcode); /** * Convert an \a idfilter into an \a idcode (e.g. #FILTER_ID_OB -> #ID_OB). */ -short BKE_idtype_idfilter_to_idcode(uint64_t idfilter); +short BKE_idtype_idcode_from_idfilter(uint64_t idfilter); + +/** + * Convert an \a idcode into an index (e.g. #ID_OB -> #INDEX_ID_OB). + */ +int BKE_idtype_idcode_to_index(short idcode); +/** + * Get an \a idcode from an index (e.g. #INDEX_ID_OB -> #ID_OB). + */ +short BKE_idtype_idcode_from_index(int index); /** * Return an ID code and steps the index forward 1. @@ -383,7 +360,7 @@ short BKE_idtype_idfilter_to_idcode(uint64_t idfilter); * \param index: start as 0. * \return the code, 0 when all codes have been returned. */ -short BKE_idtype_idcode_iter_step(int *idtype_index); +short BKE_idtype_idcode_iter_step(int *index); /* Some helpers/wrappers around callbacks defined in #IDTypeInfo, dealing e.g. with embedded IDs. * XXX Ideally those would rather belong to #BKE_lib_id, but using callback function pointers makes diff --git a/source/blender/blenkernel/BKE_instances.hh b/source/blender/blenkernel/BKE_instances.hh index 82eb4e6c5d1..7bd81aa0e08 100644 --- a/source/blender/blenkernel/BKE_instances.hh +++ b/source/blender/blenkernel/BKE_instances.hh @@ -27,7 +27,6 @@ #include "BLI_math_matrix_types.hh" #include "BLI_shared_cache.hh" #include "BLI_vector.hh" -#include "BLI_virtual_array_fwd.hh" #include "DNA_customdata_types.h" @@ -100,7 +99,8 @@ class Instances { */ Vector references_; - int instances_num_ = 0; + /** Transformation of the instances. */ + Vector transforms_; CustomData attributes_; @@ -159,8 +159,8 @@ class Instances { Span reference_handles() const; MutableSpan reference_handles_for_write(); + MutableSpan transforms(); Span transforms() const; - MutableSpan transforms_for_write(); int instances_num() const; int references_num() const; @@ -193,9 +193,6 @@ class Instances { } }; -VArray instance_position_varray(const Instances &instances); -VMutableArray instance_position_varray_for_write(Instances &instances); - /* -------------------------------------------------------------------- */ /** \name #InstanceReference Inline Methods * \{ */ diff --git a/source/blender/blenkernel/BKE_lattice.hh b/source/blender/blenkernel/BKE_lattice.hh index e0fb7511ebc..c1c84d2d04e 100644 --- a/source/blender/blenkernel/BKE_lattice.hh +++ b/source/blender/blenkernel/BKE_lattice.hh @@ -16,6 +16,7 @@ #include "BLI_sys_types.h" struct BMEditMesh; +struct BoundBox; struct BPoint; struct Depsgraph; struct Lattice; diff --git a/source/blender/blenkernel/BKE_layer.hh b/source/blender/blenkernel/BKE_layer.hh index d489957004d..fb4eab42c38 100644 --- a/source/blender/blenkernel/BKE_layer.hh +++ b/source/blender/blenkernel/BKE_layer.hh @@ -10,7 +10,7 @@ #include "BLI_vector.hh" -#include "BKE_collection.hh" +#include "BKE_collection.h" #include "DNA_layer_types.h" #include "DNA_listBase.h" diff --git a/source/blender/blenkernel/BKE_lib_id.hh b/source/blender/blenkernel/BKE_lib_id.hh index d8bdedd1570..3958d4d497d 100644 --- a/source/blender/blenkernel/BKE_lib_id.hh +++ b/source/blender/blenkernel/BKE_lib_id.hh @@ -30,12 +30,8 @@ * specific cases requiring advanced (and potentially dangerous) handling. */ -#include - #include "BLI_compiler_attrs.h" -#include "BLI_set.hh" #include "BLI_utildefines.h" -#include "BLI_vector.hh" #include "DNA_userdef_enums.h" @@ -59,29 +55,13 @@ size_t BKE_libblock_get_alloc_info(short type, const char **name); */ void *BKE_libblock_alloc_notest(short type) ATTR_WARN_UNUSED_RESULT; /** - * Allocates and returns an ID block of the specified type, with the specified name + * Allocates and returns a block of the specified type, with the specified name * (adjusted as necessary to ensure uniqueness), and appended to the specified list. * The user count is set to 1, all other content (apart from name and links) being * initialized to zero. - * - * \note: By default, IDs allocated in a Main database will get the current library of the Main, - * i.e. usually (besides in readfile case), they will have a `nullptr` `lib` pointer and be local - * data. IDs allocated outside of a Main database will always get a `nullptr` `lib` pointer. */ void *BKE_libblock_alloc(Main *bmain, short type, const char *name, int flag) ATTR_WARN_UNUSED_RESULT; -/** - * Same as for #BKE_libblock_alloc, but allows creating a data-block for a given owner library. - * - * \param owner_library the Library to 'assign' the newly created ID to. Use `nullptr` to make ID - * not use any library (i.e. become a local ID). Use `std::nullopt` for default behavior (i.e. - * behavior of the #BKE_libblock_alloc function). - */ -void *BKE_libblock_alloc_in_lib(Main *bmain, - std::optional owner_library, - short type, - const char *name, - int flag) ATTR_WARN_UNUSED_RESULT; /** * Initialize an ID of given type, such that it has valid 'empty' data. * ID is assumed to be just calloc'ed. @@ -120,24 +100,9 @@ void BKE_lib_libblock_session_uid_renew(ID *id); /** * Generic helper to create a new empty data-block of given type in given \a bmain database. * - * \note: By default, IDs created in a Main database will get the current library of the Main, - * i.e. usually (besides in readfile case), they will have a `nullptr` `lib` pointer and be local - * data. IDs created outside of a Main database will always get a `nullptr` `lib` pointer. - * * \param name: can be NULL, in which case we get default name for this ID type. */ void *BKE_id_new(Main *bmain, short type, const char *name); -/** - * Same as for #BKE_id_new, but allows creating a data-block for (within) a given owner library. - * - * \param owner_library the Library to 'assign' the newly created ID to. Use `nullptr` to make ID - * not use any library (i.e. become a local ID). Use `std::nullopt` for default behavior (i.e. - * behavior of the #BKE_id_new function). - */ -void *BKE_id_new_in_lib(Main *bmain, - std::optional owner_library, - short type, - const char *name); /** * Generic helper to create a new temporary empty data-block of given type, * *outside* of any Main database. @@ -172,7 +137,7 @@ enum { * specific code in some copy cases (mostly for node trees). */ LIB_ID_CREATE_LOCAL = 1 << 9, - /** Create for the depsgraph, when set #LIB_TAG_COPIED_ON_EVAL must be set. + /** Create for the depsgraph, when set #LIB_TAG_COPIED_ON_WRITE must be set. * Internally this is used to share some pointers instead of duplicating them. */ LIB_ID_COPY_SET_COPIED_ON_WRITE = 1 << 10, @@ -196,6 +161,8 @@ enum { /* *** Ideally we should not have those, but we need them for now... *** */ /** EXCEPTION! Deep-copy actions used by animation-data of copied ID. */ LIB_ID_COPY_ACTIONS = 1 << 24, + /** Keep the library pointer when copying data-block outside of bmain. */ + LIB_ID_COPY_KEEP_LIB = 1 << 25, /** EXCEPTION! Deep-copy shape-keys used by copied obdata ID. */ LIB_ID_COPY_SHAPEKEY = 1 << 26, /** EXCEPTION! Specific deep-copy of node trees used e.g. for rendering purposes. */ @@ -213,34 +180,14 @@ enum { /** Create a local, outside of bmain, data-block to work on. */ LIB_ID_CREATE_LOCALIZE = LIB_ID_CREATE_NO_MAIN | LIB_ID_CREATE_NO_USER_REFCOUNT | LIB_ID_CREATE_NO_DEG_TAG, - /** Generate a local copy, outside of bmain, to work on (used by copy-on-eval e.g.). */ + /** Generate a local copy, outside of bmain, to work on (used by COW e.g.). */ LIB_ID_COPY_LOCALIZE = LIB_ID_CREATE_LOCALIZE | LIB_ID_COPY_NO_PREVIEW | LIB_ID_COPY_CACHES | LIB_ID_COPY_NO_LIB_OVERRIDE, }; void BKE_libblock_copy_ex(Main *bmain, const ID *id, ID **r_newid, int orig_flag); -/** - * Same as #BKE_libblock_copy_ex, but allows copying data into a library, and not as local data - * only. - * - * \param owner_library the Library to 'assign' the newly created ID to. Use `nullptr` to make ID - * not use any library (i.e. become a local ID). Use std::nullopt for default behavior (i.e. - * behavior of the #BKE_libblock_copy_ex function). - */ -void BKE_libblock_copy_in_lib(Main *bmain, - std::optional owner_library, - const ID *id, - ID **r_newid, - int orig_flag); - /** * Used everywhere in blenkernel. - * - * \note Typically, the newly copied ID will be a local data (its `lib` pointer will be `nullptr`). - * In practice, ID copying follows the same behavior as ID creation (see #BKE_libblock_alloc - * documentation), with one special case: when the special flag #LIB_ID_CREATE_NO_ALLOCATE is - * specified, the copied ID will have the same library as the source ID. - * */ void *BKE_libblock_copy(Main *bmain, const ID *id) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(); @@ -265,7 +212,7 @@ ID *BKE_libblock_find_name_and_library(Main *bmain, * Duplicate (a.k.a. deep copy) common processing options. * See also eDupli_ID_Flags for options controlling what kind of IDs to duplicate. */ -enum eLibIDDuplicateFlags { +typedef enum eLibIDDuplicateFlags { /** This call to a duplicate function is part of another call for some parent ID. * Therefore, this sub-process should not clear `newid` pointers, nor handle remapping itself. * NOTE: In some cases (like Object one), the duplicate function may be called on the root ID @@ -275,7 +222,7 @@ enum eLibIDDuplicateFlags { /** This call is performed on a 'root' ID, and should therefore perform some decisions regarding * sub-IDs (dependencies), check for linked vs. locale data, etc. */ LIB_ID_DUPLICATE_IS_ROOT_ID = 1 << 1, -}; +} eLibIDDuplicateFlags; ENUM_OPERATORS(eLibIDDuplicateFlags, LIB_ID_DUPLICATE_IS_ROOT_ID) @@ -372,23 +319,11 @@ void BKE_id_delete_ex(Main *bmain, void *idv, const int extra_remapping_flags) A * This is more efficient than calling #BKE_id_delete repetitively on a large set of IDs * (several times faster when deleting most of the IDs at once). * + * \warning Considered experimental for now, seems to be working OK but this is + * risky code in a complicated area. * \return Number of deleted data-blocks. */ size_t BKE_id_multi_tagged_delete(Main *bmain) ATTR_NONNULL(); -/** - * Properly delete all IDs from \a ids_to_delete, from given \a bmain database. - * - * This is more efficient than calling #BKE_id_delete repetitively on a large set of IDs - * (several times faster when deleting most of the IDs at once). - * - * \note The ID pointers are not removed from the Set (which may contain more pointers than - * originally given, when extra users or dependencies also had to be deleted with the original set - * of IDs). They are all freed though, so these pointers are all invalid after calling this - * function. - * - * \return Number of deleted data-blocks. - */ -size_t BKE_id_multi_delete(Main *bmain, blender::Set &ids_to_delete); /** * Add a 'NO_MAIN' data-block to given main (also sets user-counts of its IDs if needed). @@ -487,11 +422,6 @@ bool BKE_id_copy_is_allowed(const ID *id); * * \note User-count of new copy is always set to 1. * - * \note Typically, the newly copied ID will be a local data (its `lib` pointer will be `nullptr`). - * In practice, ID copying follows the same behavior as ID creation (see #BKE_libblock_alloc - * documentation), with one special case: when the special flag #LIB_ID_CREATE_NO_ALLOCATE is - * specified, the copied ID will have the same library as the source ID. - * * \param bmain: Main database, may be NULL only if LIB_ID_CREATE_NO_MAIN is specified. * \param id: Source data-block. * \param r_newid: Pointer to new (copied) ID pointer, may be NULL. @@ -501,17 +431,6 @@ bool BKE_id_copy_is_allowed(const ID *id); * \return NULL when copying that ID type is not supported, the new copy otherwise. */ ID *BKE_id_copy_ex(Main *bmain, const ID *id, ID **r_newid, int flag); -/** - * Enable coying non-local data into libraries. - * - * See #BKE_id_copy_ex for details. - * - * \param owner_library the Library to 'assign' the newly created ID to. Use `nullptr` to make ID - * not use any library (i.e. become a local ID). Use std::nullopt for default behavior (i.e. - * behavior of the #BKE_id_copy_ex function). - */ -struct ID *BKE_id_copy_in_lib( - Main *bmain, std::optional owner_library, const ID *id, ID **r_newid, int flag); /** * Invoke the appropriate copy method for the block and return the new id as result. * @@ -729,8 +648,9 @@ bool BKE_id_is_editable(const Main *bmain, const ID *id); /** * Returns ordered list of data-blocks for display in the UI. + * Result is list of #LinkData of IDs that must be freed. */ -blender::Vector BKE_id_ordered_list(const ListBase *lb); +void BKE_id_ordered_list(ListBase *ordered_lb, const ListBase *lb); /** * Reorder ID in the list, before or after the "relative" ID. */ diff --git a/source/blender/blenkernel/BKE_lib_query.hh b/source/blender/blenkernel/BKE_lib_query.hh index 2b308afa669..74a286b3dd8 100644 --- a/source/blender/blenkernel/BKE_lib_query.hh +++ b/source/blender/blenkernel/BKE_lib_query.hh @@ -19,14 +19,10 @@ * - `BKE_lib_query_` should be used for functions in that file. */ -#include "DNA_ID.h" - -#include "BLI_function_ref.hh" #include "BLI_sys_types.h" -#include - -struct IDTypeInfo; +struct ID; +struct IDProperty; struct LibraryForeachIDData; struct Main; @@ -143,7 +139,7 @@ struct LibraryIDLinkCallbackData { * * \return a set of flags to control further iteration (0 to keep going). */ -using LibraryIDLinkCallback = int (*)(LibraryIDLinkCallbackData *cb_data); +typedef int (*LibraryIDLinkCallback)(LibraryIDLinkCallbackData *cb_data); /* Flags for the foreach function itself. */ enum { @@ -301,9 +297,7 @@ bool BKE_library_id_can_use_idtype(ID *owner_id, short id_type_used); /** * Given the owner_id return the type of id_types it can use as a filter_id. */ -uint64_t BKE_library_id_can_use_filter_id(const ID *owner_id, - const bool include_ui, - const IDTypeInfo *owner_id_type = nullptr); +uint64_t BKE_library_id_can_use_filter_id(const ID *owner_id, const bool include_ui); /** * Check whether given ID is used locally (i.e. by another non-linked ID). @@ -322,90 +316,27 @@ void BKE_library_ID_test_usages(Main *bmain, bool *r_is_used_local, bool *r_is_used_linked); -/** Parameters and result data structure for the 'unused IDs' functions below. */ -struct LibQueryUnusedIDsData { - /** Process local data-blocks. */ - bool do_local_ids = false; - /** Process linked data-blocks. */ - bool do_linked_ids = false; - /** - * Process all actually unused data-blocks, including these that are currently only used by - * other unused data-blocks, and 'dependency islands' of several data-blocks using each-other, - * without any external valid user. - */ - bool do_recursive = false; - - /** - * Callback filter, if defined and it returns `true`, the given `id` may be considered as unused, - * otherwise it will always be considered as used. - * - * Allows for more complex handling of which IDs should be deleted, on top of the basic - * local/linked choices. - */ - blender::FunctionRef filter_fn = nullptr; - - /** - * Amount of detected as unused data-blocks, per type and total as the last value of the array - * (#INDEX_ID_NULL). - * - * \note: Return value, set by the executed function. - */ - std::array num_total; - /** - * Amount of detected as unused local data-blocks, per type and total as the last value of the - * array (#INDEX_ID_NULL). - * - * \note: Return value, set by the executed function. - */ - std::array num_local; - /** - * Amount of detected as unused linked data-blocks, per type and total as the last value of the - * array (#INDEX_ID_NULL). - * - * \note: Return value, set by the executed function. - */ - std::array num_linked; -}; - -/** - * Compute amount of unused IDs (a.k.a 'orphaned'). - * - * By default only consider IDs with `0` user count. - * If `do_recursive` is set, it will check dependencies to detect all IDs that are not actually - * used in current file, including 'archipelagos` (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_total: A zero-initialized array of #INDEX_ID_MAX integers. Number of IDs detected - * as unused from given parameters, per ID type in the matching index, and as total in - * #INDEX_ID_NULL item. - * \param r_num_local: A zero-initialized array of #INDEX_ID_MAX integers. Number of local IDs - * detected as unused from given parameters (but assuming \a do_local_ids is true), per ID type in - * the matching index, and as total in #INDEX_ID_NULL item. - * \param r_num_linked: A zero-initialized array of #INDEX_ID_MAX integers. Number of linked IDs - * detected as unused from given parameters (but assuming \a do_linked_ids is true), per ID type in - * the matching index, and as total in #INDEX_ID_NULL item. - */ -void BKE_lib_query_unused_ids_amounts(Main *bmain, LibQueryUnusedIDsData ¶meters); /** * Tag all unused IDs (a.k.a 'orphaned'). * * By default only tag IDs with `0` user count. - * If `do_recursive` is set, it will check dependencies to detect all IDs that are not actually + * If `do_tag_recursive` is set, it will check dependencies to detect all IDs that are not actually * used in current file, including 'archipelagos` (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 tag: the ID tag to use to mark the ID as unused. Should never be `0`. - * \param r_num_tagged_total: A zero-initialized array of #INDEX_ID_MAX integers. Number of IDs - * tagged as unused from given parameters, per ID type in the matching index, and as total in + * \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, int tag, LibQueryUnusedIDsData ¶meters); +void BKE_lib_query_unused_ids_tag(Main *bmain, + int tag, + bool do_local_ids, + bool do_linked_ids, + bool do_tag_recursive, + int *r_num_tagged); /** * Detect orphaned linked data blocks (i.e. linked data not used (directly or indirectly) diff --git a/source/blender/blenkernel/BKE_lib_remap.hh b/source/blender/blenkernel/BKE_lib_remap.hh index 58ddad786ad..968bdb91af1 100644 --- a/source/blender/blenkernel/BKE_lib_remap.hh +++ b/source/blender/blenkernel/BKE_lib_remap.hh @@ -21,19 +21,13 @@ */ #include "BLI_compiler_attrs.h" -#include "BLI_function_ref.hh" -#include "BLI_map.hh" -#include "BLI_set.hh" #include "BLI_span.hh" #include "BLI_utildefines.h" struct ID; +struct IDRemapper; struct Main; -namespace blender::bke::id { -class IDRemapper; -} - /* BKE_libblock_free, delete are declared in BKE_lib_id.hh for convenience. */ /* Also IDRemap->flag. */ @@ -50,13 +44,12 @@ enum { */ ID_REMAP_SKIP_NEVER_NULL_USAGE = 1 << 1, /** - * Store in the #IDRemapper all IDs using target one with a 'never NULL' pointer (like e.g. - * #Object.data), when such ID usage has (or should have) been remapped to `nullptr`. See also - * #ID_REMAP_FORCE_NEVER_NULL_USAGE and #ID_REMAP_SKIP_NEVER_NULL_USAGE. + * This tells the callback func to flag with #LIB_DOIT all IDs + * using target one with a 'never NULL' pointer (like e.g. #Object.data). */ - ID_REMAP_STORE_NEVER_NULL_USAGE = 1 << 2, + ID_REMAP_FLAG_NEVER_NULL_USAGE = 1 << 2, /** - * This tells the callback function to force setting IDs + * This tells the callback func to force setting IDs * using target one with a 'never NULL' pointer to NULL. * \warning Use with extreme care, this will leave database in broken state * and can cause crashes very easily! @@ -87,13 +80,6 @@ enum { * etc.). */ ID_REMAP_DO_LIBRARY_POINTERS = 1 << 8, - /** - * Allow remapping of an ID pointer of a certain to another one of a different type. - * - * WARNING: Use with caution. Should only be needed in a very small amount of cases, e.g. when - * converting an ID type to another. */ - ID_REMAP_ALLOW_IDTYPE_MISMATCH = 1 << 9, - /** * Don't touch the special user counts (use when the 'old' remapped ID remains in use): * - Do not transfer 'fake user' status from old to new ID. @@ -138,13 +124,9 @@ enum eIDRemapType { * * \note Is preferred over BKE_libblock_remap_locked due to performance. */ -void BKE_libblock_remap_multiple_locked(Main *bmain, - blender::bke::id::IDRemapper &mappings, - const int remap_flags); +void BKE_libblock_remap_multiple_locked(Main *bmain, IDRemapper *mappings, const int remap_flags); -void BKE_libblock_remap_multiple(Main *bmain, - blender::bke::id::IDRemapper &mappings, - const int remap_flags); +void BKE_libblock_remap_multiple(Main *bmain, IDRemapper *mappings, const int remap_flags); /** * Bare raw remapping of IDs, with no other processing than actually updating the ID pointers. @@ -155,9 +137,7 @@ void BKE_libblock_remap_multiple(Main *bmain, * case e.g. in read-file process. * * WARNING: This call will likely leave the given BMain in invalid state in many aspects. */ -void BKE_libblock_remap_multiple_raw(Main *bmain, - blender::bke::id::IDRemapper &mappings, - const int remap_flags); +void BKE_libblock_remap_multiple_raw(Main *bmain, IDRemapper *mappings, const int remap_flags); /** * Replace all references in given Main to \a old_id by \a new_id * (if \a new_id is NULL, it unlinks \a old_id). @@ -173,8 +153,12 @@ void BKE_libblock_remap(Main *bmain, void *old_idv, void *new_idv, int remap_fla /** * Unlink given \a id from given \a bmain * (does not touch to indirect, i.e. library, usages of the ID). + * + * \param do_flag_never_null: If true, all IDs using \a idv in a 'non-NULL' way are flagged by + * #LIB_TAG_DOIT flag (quite obviously, 'non-NULL' usages can never be unlinked by this function). */ -void BKE_libblock_unlink(Main *bmain, void *idv, bool do_skip_indirect) ATTR_NONNULL(); +void BKE_libblock_unlink(Main *bmain, void *idv, bool do_flag_never_null, bool do_skip_indirect) + ATTR_NONNULL(); /** * Similar to libblock_remap, but only affects IDs used by given \a idv ID. @@ -194,7 +178,7 @@ void BKE_libblock_relink_ex(Main *bmain, void *idv, void *old_idv, void *new_idv void BKE_libblock_relink_multiple(Main *bmain, const blender::Span ids, eIDRemapType remap_type, - blender::bke::id::IDRemapper &id_remapper, + IDRemapper *id_remapper, int remap_flags); /** @@ -209,8 +193,7 @@ void BKE_libblock_relink_multiple(Main *bmain, void BKE_libblock_relink_to_newid(Main *bmain, ID *id, int remap_flag) ATTR_NONNULL(); using BKE_library_free_notifier_reference_cb = void (*)(const void *); -using BKE_library_remap_editor_id_reference_cb = - void (*)(const blender::bke::id::IDRemapper &mappings); +using BKE_library_remap_editor_id_reference_cb = void (*)(const IDRemapper *mappings); void BKE_library_callback_free_notifier_reference_set(BKE_library_free_notifier_reference_cb func); void BKE_library_callback_remap_editor_id_reference_set( @@ -237,7 +220,7 @@ enum IDRemapperApplyOptions { * * NOTE: Currently unused by main remapping code, since user-count is handled by * `foreach_libblock_remap_callback_apply` there, depending on whether the remapped pointer does - * use it or not. Needed for rare cases in UI handling though (see e.g. `image_id_remap` in + * use it or not. Need for rare cases in UI handling though (see e.g. `image_id_remap` in * `space_image.cc`). */ ID_REMAP_APPLY_UPDATE_REFCOUNT = (1 << 0), @@ -250,9 +233,9 @@ enum IDRemapperApplyOptions { ID_REMAP_APPLY_ENSURE_REAL = (1 << 1), /** - * Unassign instead of remap when the new ID pointer would point to itself. + * Unassign in stead of remap when the new ID data-block would become id_self. * - * To use this option #IDRemapper::apply must be used with a non-null id_self parameter. + * To use this option 'BKE_id_remapper_apply_ex' must be used with a not-null id_self parameter. */ ID_REMAP_APPLY_UNMAP_WHEN_REMAPPING_TO_SELF = (1 << 2), @@ -261,90 +244,58 @@ enum IDRemapperApplyOptions { ENUM_OPERATORS(IDRemapperApplyOptions, ID_REMAP_APPLY_UNMAP_WHEN_REMAPPING_TO_SELF) using IDRemapperIterFunction = void (*)(ID *old_id, ID *new_id, void *user_data); -using IDTypeFilter = uint64_t; -namespace blender::bke::id { +/** + * Create a new ID Remapper. + * + * An ID remapper stores multiple remapping rules. + */ +IDRemapper *BKE_id_remapper_create(); -class IDRemapper { - Map mappings_; - IDTypeFilter source_types_ = 0; +void BKE_id_remapper_clear(IDRemapper *id_remapper); +bool BKE_id_remapper_is_empty(const IDRemapper *id_remapper); +/** Free the given ID Remapper. */ +void BKE_id_remapper_free(IDRemapper *id_remapper); +/** Add a new remapping. Does not replace an existing mapping for `old_id`, if any. */ +void BKE_id_remapper_add(IDRemapper *id_remapper, ID *old_id, ID *new_id); +/** Add a new remapping, replacing a potential already existing mapping of `old_id`. */ +void BKE_id_remapper_add_overwrite(IDRemapper *id_remapper, ID *old_id, ID *new_id); - /** - * Store all IDs using another ID with the 'NEVER_NULL' flag, which have (or - * should have been) remapped to `nullptr`. - */ - Set never_null_users_; +/** + * Apply a remapping. + * + * Update the id pointer stored in the given r_id_ptr if a remapping rule exists. + */ +IDRemapperApplyResult BKE_id_remapper_apply(const IDRemapper *id_remapper, + ID **r_id_ptr, + IDRemapperApplyOptions options); +/** + * Apply a remapping. + * + * Use this function when `ID_REMAP_APPLY_UNMAP_WHEN_REMAPPING_TO_SELF`. In this case + * the #id_self parameter is required. Otherwise the #BKE_id_remapper_apply can be used. + * + * \param id_self: required for ID_REMAP_APPLY_UNMAP_WHEN_REMAPPING_TO_SELF. + * When remapping to id_self it will then be remapped to NULL. + */ +IDRemapperApplyResult BKE_id_remapper_apply_ex(const IDRemapper *id_remapper, + ID **r_id_ptr, + IDRemapperApplyOptions options, + ID *id_self); +bool BKE_id_remapper_has_mapping_for(const IDRemapper *id_remapper, uint64_t type_filter); - public: - /** - * In almost all cases, the original pointer and its new replacement should be of the same type. - * however, there are some rare exceptions, e.g. when converting from one ID type to another. - */ - bool allow_idtype_mismatch = false; +/** + * Determine the mapping result, without applying the mapping. + */ +IDRemapperApplyResult BKE_id_remapper_get_mapping_result(const IDRemapper *id_remapper, + ID *id, + IDRemapperApplyOptions options, + const ID *id_self); +void BKE_id_remapper_iter(const IDRemapper *id_remapper, + IDRemapperIterFunction func, + void *user_data); - public: - void clear() - { - mappings_.clear(); - never_null_users_.clear(); - source_types_ = 0; - } - - bool is_empty() const - { - return mappings_.is_empty(); - } - - bool contains_mappings_for_any(IDTypeFilter filter) const - { - return (source_types_ & filter) != 0; - } - - /** Add a new remapping. Does not replace an existing mapping for `old_id`, if any. */ - void add(ID *old_id, ID *new_id); - /** Add a new remapping, replacing a potential already existing mapping of `old_id`. */ - void add_overwrite(ID *old_id, ID *new_id); - - /** Determine the mapping result, without applying the mapping. */ - IDRemapperApplyResult get_mapping_result(ID *id, - IDRemapperApplyOptions options, - const ID *id_self) const; - - /** - * Apply a remapping. - * - * Update the id pointer stored in the given r_id_ptr if a remapping rule exists. - * - * \param id_self: Only for ID_REMAP_APPLY_UNMAP_WHEN_REMAPPING_TO_SELF. - * When remapping to `id_self` it will then be remapped to `nullptr` instead. - */ - IDRemapperApplyResult apply(ID **r_id_ptr, - IDRemapperApplyOptions options, - ID *id_self = nullptr) const; - - void never_null_users_add(ID *id) - { - never_null_users_.add(id); - } - - const Set &never_null_users() const - { - return never_null_users_; - } - - /** Iterate over all remapping pairs in the remapper, and call the callback function on them. */ - void iter(FunctionRef func) const - { - for (auto item : mappings_.items()) { - func(item.key, item.value); - } - } - - /** Return a readable string for the given result. Can be used for debugging purposes. */ - static const StringRefNull result_to_string(const IDRemapperApplyResult result); - - /** Print out the rules inside the given id_remapper. Can be used for debugging purposes. */ - void print() const; -}; - -} // namespace blender::bke::id +/** Returns a readable string for the given result. Can be used for debugging purposes. */ +const char *BKE_id_remapper_result_string(const IDRemapperApplyResult result); +/** Prints out the rules inside the given id_remapper. Can be used for debugging purposes. */ +void BKE_id_remapper_print(const IDRemapper *id_remapper); diff --git a/source/blender/blenkernel/BKE_main.hh b/source/blender/blenkernel/BKE_main.hh index 8b3720304a2..522d92c5ef1 100644 --- a/source/blender/blenkernel/BKE_main.hh +++ b/source/blender/blenkernel/BKE_main.hh @@ -210,7 +210,6 @@ struct Main { ListBase collections; ListBase armatures; ListBase actions; - ListBase animations; ListBase nodetrees; ListBase brushes; ListBase particles; @@ -258,7 +257,7 @@ struct Main { * \note Always generate a non-global Main, use #BKE_blender_globals_main_replace to put a newly * created one in `G_MAIN`. */ -Main *BKE_main_new(); +Main *BKE_main_new(void); void BKE_main_free(Main *mainvar); /** Struct packaging log/report info about a Main merge result. */ diff --git a/source/blender/blenkernel/BKE_mesh.h b/source/blender/blenkernel/BKE_mesh.h index 74ddba0a1b3..fa6374c5d6f 100644 --- a/source/blender/blenkernel/BKE_mesh.h +++ b/source/blender/blenkernel/BKE_mesh.h @@ -513,7 +513,7 @@ bool BKE_mesh_validate_all_customdata(struct CustomData *vert_data, void BKE_mesh_strip_loose_faces(struct Mesh *mesh); /* In DerivedMesh.cc */ -void BKE_mesh_wrapper_deferred_finalize_mdata(struct Mesh *mesh_eval); +void BKE_mesh_wrapper_deferred_finalize_mdata(struct Mesh *me_eval); /* **** Depsgraph evaluation **** */ diff --git a/source/blender/blenkernel/BKE_mesh.hh b/source/blender/blenkernel/BKE_mesh.hh index 041f53227d7..2fc951541bb 100644 --- a/source/blender/blenkernel/BKE_mesh.hh +++ b/source/blender/blenkernel/BKE_mesh.hh @@ -290,17 +290,6 @@ inline int face_triangles_num(const int face_size) return face_size - 2; } -/** - * Return the range of triangles that belong to the given face. - */ -inline IndexRange face_triangles_range(OffsetIndices faces, int face_i) -{ - const IndexRange face = faces[face_i]; - /* This is the same as #poly_to_tri_count which is not included here. */ - const int start_triangle = face.start() - face_i * 2; - return IndexRange(start_triangle, face_triangles_num(face.size())); -} - /** * Return the index of the edge's vertex that is not the \a vert. */ @@ -317,9 +306,6 @@ inline int edge_other_vert(const int2 edge, const int vert) } // namespace mesh -/** Create a mesh with no built-in attributes. */ -Mesh *mesh_new_no_attributes(int verts_num, int edges_num, int faces_num, int corners_num); - /** Calculate edges from faces. */ void mesh_calc_edges(Mesh &mesh, bool keep_existing_edges, bool select_new_edges); diff --git a/source/blender/blenkernel/BKE_mesh_boolean_convert.hh b/source/blender/blenkernel/BKE_mesh_boolean_convert.hh new file mode 100644 index 00000000000..51c74691f8a --- /dev/null +++ b/source/blender/blenkernel/BKE_mesh_boolean_convert.hh @@ -0,0 +1,38 @@ +/* SPDX-FileCopyrightText: 2019 Blender Authors + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +#pragma once + +/** \file + * \ingroup bke + */ + +#include "BLI_array.hh" +#include "BLI_math_matrix_types.hh" +#include "BLI_mesh_boolean.hh" +#include "BLI_span.hh" + +struct Mesh; + +namespace blender::meshintersect { + +/** + * Do a mesh boolean operation directly on meshes (without going back and forth from BMesh). + * \param transforms: An array of transform matrices used for each mesh's positions. + * \param material_remaps: An array of maps from material slot numbers in the corresponding mesh + * to the material slot in the first mesh. It is OK for material_remaps or any of its constituent + * arrays to be empty. A -1 value means that the original index should be used with no mapping. + * \param r_intersecting_edges: Array to store indices of edges on the resulting mesh in. These + * 'new' edges are the result of the intersections. + */ +Mesh *direct_mesh_boolean(Span meshes, + Span transforms, + const float4x4 &target_transform, + Span> material_remaps, + bool use_self, + bool hole_tolerant, + int boolean_mode, + Vector *r_intersecting_edges); + +} // namespace blender::meshintersect diff --git a/source/blender/blenkernel/BKE_mesh_iterators.hh b/source/blender/blenkernel/BKE_mesh_iterators.hh index 0e7a2909ba3..56a9589fab0 100644 --- a/source/blender/blenkernel/BKE_mesh_iterators.hh +++ b/source/blender/blenkernel/BKE_mesh_iterators.hh @@ -49,4 +49,4 @@ void BKE_mesh_foreach_mapped_subdiv_face_center( void *user_data, MeshForeachFlag flag); -void BKE_mesh_foreach_mapped_vert_coords_get(const Mesh *mesh_eval, float (*r_cos)[3], int totcos); +void BKE_mesh_foreach_mapped_vert_coords_get(const Mesh *me_eval, float (*r_cos)[3], int totcos); diff --git a/source/blender/blenkernel/BKE_mesh_remap.hh b/source/blender/blenkernel/BKE_mesh_remap.hh index 4938c4b2748..13c877339be 100644 --- a/source/blender/blenkernel/BKE_mesh_remap.hh +++ b/source/blender/blenkernel/BKE_mesh_remap.hh @@ -15,6 +15,8 @@ #include "BKE_mesh_mapping.hh" +struct CustomData; +struct CustomData_MeshMasks; struct MemArena; struct Mesh; diff --git a/source/blender/blenkernel/BKE_mesh_runtime.hh b/source/blender/blenkernel/BKE_mesh_runtime.hh index d42c5a69fb1..ebc7009902d 100644 --- a/source/blender/blenkernel/BKE_mesh_runtime.hh +++ b/source/blender/blenkernel/BKE_mesh_runtime.hh @@ -68,5 +68,5 @@ Mesh *mesh_create_eval_no_deform_render(Depsgraph *depsgraph, void BKE_mesh_runtime_eval_to_meshkey(Mesh *me_deformed, Mesh *mesh, KeyBlock *kb); #ifndef NDEBUG -bool BKE_mesh_runtime_is_valid(Mesh *mesh_eval); +bool BKE_mesh_runtime_is_valid(Mesh *me_eval); #endif /* !NDEBUG */ diff --git a/source/blender/blenkernel/BKE_mesh_tangent.hh b/source/blender/blenkernel/BKE_mesh_tangent.hh index 9c9cb82c235..3ed972c0653 100644 --- a/source/blender/blenkernel/BKE_mesh_tangent.hh +++ b/source/blender/blenkernel/BKE_mesh_tangent.hh @@ -66,7 +66,7 @@ void BKE_mesh_calc_loop_tangent_ex(const float (*vert_positions)[3], uint loopdata_out_len, short *tangent_mask_curr_p); -void BKE_mesh_calc_loop_tangents(Mesh *mesh_eval, +void BKE_mesh_calc_loop_tangents(Mesh *me_eval, bool calc_active_tangent, const char (*tangent_names)[MAX_CUSTOMDATA_LAYER_NAME], int tangent_names_len); diff --git a/source/blender/blenkernel/BKE_modifier.hh b/source/blender/blenkernel/BKE_modifier.hh index 06b35898eef..18b76155bdf 100644 --- a/source/blender/blenkernel/BKE_modifier.hh +++ b/source/blender/blenkernel/BKE_modifier.hh @@ -165,15 +165,15 @@ struct ModifierEvalContext { struct ModifierTypeInfo { /* A unique identifier for this modifier. Used to generate the panel id type name. * See #BKE_modifier_type_panel_id. */ - char idname[64]; + char idname[32]; /* The user visible name for this modifier */ - char name[64]; + char name[32]; /* The DNA struct name for the modifier data type, used to * write the DNA data out. */ - char struct_name[64]; + char struct_name[32]; /* The size of the modifier data type, used by allocation. */ int struct_size; @@ -588,7 +588,7 @@ void BKE_modifier_deform_vertsEM(ModifierData *md, /** * Get evaluated mesh for other evaluated object, which is used as an operand for the modifier, * e.g. second operand for boolean modifier. - * Note that modifiers in stack always get fully evaluated ID pointers, + * Note that modifiers in stack always get fully evaluated COW ID pointers, * never original ones. Makes things simpler. */ Mesh *BKE_modifier_get_evaluated_mesh_from_evaluated_object(Object *ob_eval); diff --git a/source/blender/blenkernel/BKE_nla.h b/source/blender/blenkernel/BKE_nla.h index aa8295ee0ee..a14433eab48 100644 --- a/source/blender/blenkernel/BKE_nla.h +++ b/source/blender/blenkernel/BKE_nla.h @@ -28,6 +28,7 @@ struct Speaker; struct bAction; struct BlendDataReader; +struct BlendLibReader; struct BlendWriter; struct PointerRNA; struct PropertyRNA; @@ -431,11 +432,11 @@ void BKE_nlastrip_validate_name(struct AnimData *adt, struct NlaStrip *strip); /* ............ */ /** - * Check if the given NLA-Track has any strips with their own F-Curves. + * Check if the given NLA-Track has any strips with own F-Curves. */ bool BKE_nlatrack_has_animated_strips(struct NlaTrack *nlt); /** - * Check if given NLA-Tracks have any strips with their own F-Curves. + * Check if given NLA-Tracks have any strips with own F-Curves. */ bool BKE_nlatracks_have_animated_strips(ListBase *tracks); /** diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h new file mode 100644 index 00000000000..0fbc59f166e --- /dev/null +++ b/source/blender/blenkernel/BKE_node.h @@ -0,0 +1,1377 @@ +/* SPDX-FileCopyrightText: 2005 Blender Authors + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +#pragma once + +/** \file + * \ingroup bke + */ + +#include "BLI_compiler_compat.h" +#include "BLI_ghash.h" + +#include "DNA_listBase.h" + +/* for FOREACH_NODETREE_BEGIN */ +#include "DNA_node_types.h" + +#include "RNA_types.hh" + +#ifdef __cplusplus +# include "BLI_map.hh" +# include "BLI_string_ref.hh" +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* not very important, but the stack solver likes to know a maximum */ +#define MAX_SOCKET 512 + +struct BlendDataReader; +struct BlendLibReader; +struct BlendWriter; +struct FreestyleLineStyle; +struct GPUMaterial; +struct GPUNodeStack; +struct ID; +struct ImBuf; +struct Light; +struct Main; +struct Material; +struct PointerRNA; +struct Scene; +struct SpaceNode; +struct Tex; +struct World; +struct bContext; +struct bNode; +struct bNodeExecContext; +struct bNodeExecData; +struct bNodeInstanceHash; +struct bNodeLink; +struct bNodeSocket; +struct bNodeStack; +struct bNodeTree; +struct bNodeTreeExec; +struct bNodeTreeType; +struct uiLayout; + +/* -------------------------------------------------------------------- */ +/** \name Node Type Definitions + * \{ */ + +/** + * \brief Compact definition of a node socket. + * + * Can be used to quickly define a list of static sockets for a node, + * which are added to each new node of that type. + * + * \deprecated This struct is used by C nodes to define templates as simple + * static struct lists. These are converted to the new template collections + * in RNA types automatically. + */ +typedef struct bNodeSocketTemplate { + int type; + char name[64]; /* MAX_NAME */ + float val1, val2, val3, val4; /* default alloc value for inputs */ + float min, max; + int subtype; /* would use PropertySubType but this is a bad level include to use RNA */ + int flag; + + /* after this line is used internal only */ + struct bNodeSocket *sock; /* used to hold verified socket */ + char identifier[64]; /* generated from name */ +} bNodeSocketTemplate; + +/* Use `void *` for callbacks that require C++. This is rather ugly, but works well for now. This + * would not be necessary if we would use bNodeSocketType and bNodeType only in C++ code. + * However, achieving this requires quite a few changes currently. */ +#ifdef __cplusplus +namespace blender { +class CPPType; +namespace nodes { +class DNode; +class NodeMultiFunctionBuilder; +class GeoNodeExecParams; +class NodeDeclaration; +class NodeDeclarationBuilder; +class GatherAddNodeSearchParams; +class GatherLinkSearchOpParams; +struct NodeExtraInfoParams; +} // namespace nodes +namespace realtime_compositor { +class Context; +class NodeOperation; +class ShaderNode; +} // namespace realtime_compositor +} // namespace blender + +using CPPTypeHandle = blender::CPPType; +using NodeMultiFunctionBuildFunction = void (*)(blender::nodes::NodeMultiFunctionBuilder &builder); +using NodeGeometryExecFunction = void (*)(blender::nodes::GeoNodeExecParams params); +using NodeDeclareFunction = void (*)(blender::nodes::NodeDeclarationBuilder &builder); +using NodeDeclareDynamicFunction = void (*)(const bNodeTree &tree, + const bNode &node, + blender::nodes::NodeDeclarationBuilder &builder); +using SocketGetCPPValueFunction = void (*)(const void *socket_value, void *r_value); +using SocketGetGeometryNodesCPPValueFunction = void (*)(const void *socket_value, void *r_value); + +/* Adds socket link operations that are specific to this node type. */ +using NodeGatherSocketLinkOperationsFunction = + void (*)(blender::nodes::GatherLinkSearchOpParams ¶ms); + +/* Adds node add menu operations that are specific to this node type. */ +using NodeGatherAddOperationsFunction = + void (*)(blender::nodes::GatherAddNodeSearchParams ¶ms); + +using NodeGetCompositorOperationFunction = blender::realtime_compositor::NodeOperation + *(*)(blender::realtime_compositor::Context &context, blender::nodes::DNode node); +using NodeGetCompositorShaderNodeFunction = + blender::realtime_compositor::ShaderNode *(*)(blender::nodes::DNode node); +using NodeExtraInfoFunction = void (*)(blender::nodes::NodeExtraInfoParams ¶ms); + +#else +typedef void *NodeGetCompositorOperationFunction; +typedef void *NodeGetCompositorShaderNodeFunction; +typedef void *NodeMultiFunctionBuildFunction; +typedef void *NodeGeometryExecFunction; +typedef void *NodeDeclareFunction; +typedef void *NodeDeclareDynamicFunction; +typedef void *NodeGatherSocketLinkOperationsFunction; +typedef void *NodeGatherAddOperationsFunction; +typedef void *SocketGetCPPTypeFunction; +typedef void *SocketGetGeometryNodesCPPTypeFunction; +typedef void *SocketGetGeometryNodesCPPValueFunction; +typedef void *SocketGetCPPValueFunction; +typedef void *NodeExtraInfoFunction; +typedef struct CPPTypeHandle CPPTypeHandle; +#endif + +/** + * \brief Defines a socket type. + * + * Defines the appearance and behavior of a socket in the UI. + */ +typedef struct bNodeSocketType { + /** Identifier name. */ + char idname[64]; + /** Type label. */ + char label[64]; + /** Sub-type label. */ + char subtype_label[64]; + + void (*draw)(struct bContext *C, + struct uiLayout *layout, + struct PointerRNA *ptr, + struct PointerRNA *node_ptr, + const char *text); + void (*draw_color)(struct bContext *C, + struct PointerRNA *ptr, + struct PointerRNA *node_ptr, + float *r_color); + void (*draw_color_simple)(const bNodeSocketType *socket_type, float *r_color); + + void (*interface_draw)(struct ID *id, + struct bNodeTreeInterfaceSocket *socket, + struct bContext *C, + struct uiLayout *layout); + void (*interface_init_socket)(struct ID *id, + const struct bNodeTreeInterfaceSocket *interface_socket, + struct bNode *node, + struct bNodeSocket *socket, + const char *data_path); + void (*interface_from_socket)(struct ID *id, + struct bNodeTreeInterfaceSocket *interface_socket, + const struct bNode *node, + const struct bNodeSocket *socket); + + /* RNA integration */ + ExtensionRNA ext_socket; + ExtensionRNA ext_interface; + + /* for standard socket types in C */ + int type, subtype; + + /* When set, bNodeSocket->limit does not have any effect anymore. */ + bool use_link_limits_of_type; + int input_link_limit; + int output_link_limit; + + /* Callback to free the socket type. */ + void (*free_self)(struct bNodeSocketType *stype); + + /* Return the CPPType of this socket. */ + const CPPTypeHandle *base_cpp_type; + /* Get the value of this socket in a generic way. */ + SocketGetCPPValueFunction get_base_cpp_value; + /* Get geometry nodes cpp type. */ + const CPPTypeHandle *geometry_nodes_cpp_type; + /* Get geometry nodes cpp value. */ + SocketGetGeometryNodesCPPValueFunction get_geometry_nodes_cpp_value; + /* Default value for this socket type. */ + const void *geometry_nodes_default_cpp_value; +} bNodeSocketType; + +typedef void *(*NodeInitExecFunction)(struct bNodeExecContext *context, + struct bNode *node, + bNodeInstanceKey key); +typedef void (*NodeFreeExecFunction)(void *nodedata); +typedef void (*NodeExecFunction)(void *data, + int thread, + struct bNode *, + struct bNodeExecData *execdata, + struct bNodeStack **in, + struct bNodeStack **out); +typedef int (*NodeGPUExecFunction)(struct GPUMaterial *mat, + struct bNode *node, + struct bNodeExecData *execdata, + struct GPUNodeStack *in, + struct GPUNodeStack *out); +typedef void (*NodeMaterialXFunction)(void *data, struct bNode *node, struct bNodeSocket *out); + +/** + * \brief Defines a node type. + * + * Initial attributes and constants for a node as well as callback functions + * implementing the node behavior. + */ +typedef struct bNodeType { + char idname[64]; /* identifier name */ + int type; + + char ui_name[64]; /* MAX_NAME */ + char ui_description[256]; + int ui_icon; + /** Should usually use the idname instead, but this enum type is still exposed in Python. */ + const char *enum_name_legacy; + + float width, minwidth, maxwidth; + float height, minheight, maxheight; + short nclass, flag; + + /* templates for static sockets */ + bNodeSocketTemplate *inputs, *outputs; + + char storagename[64]; /* struct name for DNA */ + + /* Draw the option buttons on the node */ + void (*draw_buttons)(struct uiLayout *, struct bContext *C, struct PointerRNA *ptr); + /* Additional parameters in the side panel */ + void (*draw_buttons_ex)(struct uiLayout *, struct bContext *C, struct PointerRNA *ptr); + + /* Additional drawing on backdrop */ + void (*draw_backdrop)( + struct SpaceNode *snode, struct ImBuf *backdrop, struct bNode *node, int x, int y); + + /** + * Optional custom label function for the node header. + * \note Used as a fallback when #bNode.label isn't set. + */ + void (*labelfunc)(const struct bNodeTree *ntree, + const struct bNode *node, + char *label, + int label_maxncpy); + + /** Optional override for node class, used for drawing node header. */ + int (*ui_class)(const struct bNode *node); + + /** Called when the node is updated in the editor. */ + void (*updatefunc)(struct bNodeTree *ntree, struct bNode *node); + /** Check and update if internal ID data has changed. */ + void (*group_update_func)(struct bNodeTree *ntree, struct bNode *node); + + /** + * Initialize a new node instance of this type after creation. + * + * \note Assignments to `node->id` must not increment the user of the ID. + * This is handled by the caller of this callback. + */ + void (*initfunc)(struct bNodeTree *ntree, struct bNode *node); + /** + * Free the node instance. + * + * \note Access to `node->id` must be avoided in this function as this is called + * while freeing #Main, the state of this ID is undefined. + * Higher level logic to remove the node handles the user-count. + */ + void (*freefunc)(struct bNode *node); + /** Make a copy of the node instance. */ + void (*copyfunc)(struct bNodeTree *dest_ntree, + struct bNode *dest_node, + const struct bNode *src_node); + + /* Registerable API callback versions, called in addition to C callbacks */ + void (*initfunc_api)(const struct bContext *C, struct PointerRNA *ptr); + void (*freefunc_api)(struct PointerRNA *ptr); + void (*copyfunc_api)(struct PointerRNA *ptr, const struct bNode *src_node); + + /** + * An additional poll test for deciding whether nodes should be an option in search menus. + * Potentially more strict poll than #poll(), but doesn't have to check the same things. + */ + bool (*add_ui_poll)(const struct bContext *C); + + /** + * Can this node type be added to a node tree? + * \param r_disabled_hint: Hint to display in the UI when the poll fails. + * The callback can set this to a static string without having to + * null-check it (or without setting it to null if it's not used). + * The caller must pass a valid `const char **` and null-initialize it + * when it's not just a dummy, that is, if it actually wants to access + * the returned disabled-hint (null-check needed!). + */ + bool (*poll)(const struct bNodeType *ntype, + const struct bNodeTree *nodetree, + const char **r_disabled_hint); + /** + * Can this node be added to a node tree? + * \param r_disabled_hint: See `poll()`. + */ + bool (*poll_instance)(const struct bNode *node, + const struct bNodeTree *nodetree, + const char **r_disabled_hint); + + /* Optional handling of link insertion. Returns false if the link shouldn't be created. */ + bool (*insert_link)(struct bNodeTree *ntree, struct bNode *node, struct bNodeLink *link); + + void (*free_self)(struct bNodeType *ntype); + + /* **** execution callbacks **** */ + NodeInitExecFunction init_exec_fn; + NodeFreeExecFunction free_exec_fn; + NodeExecFunction exec_fn; + /* gpu */ + NodeGPUExecFunction gpu_fn; + /* MaterialX */ + NodeMaterialXFunction materialx_fn; + + /* Get an instance of this node's compositor operation. Freeing the instance is the + * responsibility of the caller. */ + NodeGetCompositorOperationFunction get_compositor_operation; + + /* Get an instance of this node's compositor shader node. Freeing the instance is the + * responsibility of the caller. */ + NodeGetCompositorShaderNodeFunction get_compositor_shader_node; + + /* A message to display in the node header for unsupported realtime compositor nodes. The message + * is assumed to be static and thus require no memory handling. This field is to be removed when + * all nodes are supported. */ + const char *realtime_compositor_unsupported_message; + + /* Build a multi-function for this node. */ + NodeMultiFunctionBuildFunction build_multi_function; + + /* Execute a geometry node. */ + NodeGeometryExecFunction geometry_node_execute; + + /** + * Declares which sockets and panels the node has. It has to be able to generate a declaration + * with and without a specific node context. If the declaration depends on the node, but the node + * is not provided, then the declaration should be generated as much as possible and everything + * that depends on the node context should be skipped. + */ + NodeDeclareFunction declare; + + /** + * Declaration of the node outside of any context. If the node declaration is never dependent on + * the node context, this declaration is also shared with the corresponding node instances. + * Otherwise, it mainly allows checking what sockets a node will have, without having to create + * the node. In this case, the static declaration is mostly just a hint, and does not have to + * match with the final node. + */ + NodeDeclarationHandle *static_declaration; + + /** + * Add to the list of search names and operations gathered by node link drag searching. + * Usually it isn't necessary to override the default behavior here, but a node type can have + * custom behavior here like adding custom search items. + */ + NodeGatherSocketLinkOperationsFunction gather_link_search_ops; + + /** Get extra information that is drawn next to the node. */ + NodeExtraInfoFunction get_extra_info; + + /** True when the node cannot be muted. */ + bool no_muting; + /** True when the node still works but it's usage is discouraged. */ + const char *deprecation_notice; + + /* RNA integration */ + ExtensionRNA rna_ext; +} bNodeType; + +/** #bNodeType.nclass (for add-menu and themes). */ +#define NODE_CLASS_INPUT 0 +#define NODE_CLASS_OUTPUT 1 +#define NODE_CLASS_OP_COLOR 3 +#define NODE_CLASS_OP_VECTOR 4 +#define NODE_CLASS_OP_FILTER 5 +#define NODE_CLASS_GROUP 6 +#define NODE_CLASS_CONVERTER 8 +#define NODE_CLASS_MATTE 9 +#define NODE_CLASS_DISTORT 10 +#define NODE_CLASS_PATTERN 12 +#define NODE_CLASS_TEXTURE 13 +#define NODE_CLASS_SCRIPT 32 +#define NODE_CLASS_INTERFACE 33 +#define NODE_CLASS_SHADER 40 +#define NODE_CLASS_GEOMETRY 41 +#define NODE_CLASS_ATTRIBUTE 42 +#define NODE_CLASS_LAYOUT 100 + +struct bNodeTreeExec; + +typedef void (*bNodeClassCallback)(void *calldata, int nclass, const char *name); +typedef struct bNodeTreeType { + int type; /* type identifier */ + char idname[64]; /* identifier name */ + + /* The ID name of group nodes for this type. */ + char group_idname[64]; + + char ui_name[64]; + char ui_description[256]; + int ui_icon; + + /* callbacks */ + /* Iteration over all node classes. */ + void (*foreach_nodeclass)(struct Scene *scene, void *calldata, bNodeClassCallback func); + /* Check visibility in the node editor */ + bool (*poll)(const struct bContext *C, struct bNodeTreeType *ntreetype); + /* Select a node tree from the context */ + void (*get_from_context)(const struct bContext *C, + struct bNodeTreeType *ntreetype, + struct bNodeTree **r_ntree, + struct ID **r_id, + struct ID **r_from); + + /* calls allowing threaded composite */ + void (*localize)(struct bNodeTree *localtree, struct bNodeTree *ntree); + void (*local_merge)(struct Main *bmain, struct bNodeTree *localtree, struct bNodeTree *ntree); + + /* Tree update. Overrides `nodetype->updatetreefunc`. */ + void (*update)(struct bNodeTree *ntree); + + bool (*validate_link)(eNodeSocketDatatype from, eNodeSocketDatatype to); + + void (*node_add_init)(struct bNodeTree *ntree, struct bNode *bnode); + + /* Check if the socket type is valid for this tree type. */ + bool (*valid_socket_type)(struct bNodeTreeType *ntreetype, struct bNodeSocketType *socket_type); + + /* RNA integration */ + ExtensionRNA rna_ext; +} bNodeTreeType; + +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Generic API, Trees + * \{ */ + +struct bNodeTreeType *ntreeTypeFind(const char *idname); +void ntreeTypeAdd(struct bNodeTreeType *nt); +void ntreeTypeFreeLink(const struct bNodeTreeType *nt); +bool ntreeIsRegistered(const struct bNodeTree *ntree); +struct GHashIterator *ntreeTypeGetIterator(void); + +/* Helper macros for iterating over tree types. */ +#define NODE_TREE_TYPES_BEGIN(ntype) \ + { \ + GHashIterator *__node_tree_type_iter__ = ntreeTypeGetIterator(); \ + for (; !BLI_ghashIterator_done(__node_tree_type_iter__); \ + BLI_ghashIterator_step(__node_tree_type_iter__)) \ + { \ + bNodeTreeType *ntype = (bNodeTreeType *)BLI_ghashIterator_getValue(__node_tree_type_iter__); + +#define NODE_TREE_TYPES_END \ + } \ + BLI_ghashIterator_free(__node_tree_type_iter__); \ + } \ + (void)0 + +/** + * Try to initialize all type-info in a node tree. + * + * \note In general undefined type-info is a perfectly valid case, + * the type may just be registered later. + * In that case the update_typeinfo function will set type-info on registration + * and do necessary updates. + */ +void ntreeSetTypes(const struct bContext *C, struct bNodeTree *ntree); + +struct bNodeTree *ntreeAddTree(struct Main *bmain, const char *name, const char *idname); + +/** + * Free tree which is embedded into another data-block. + */ +void ntreeFreeEmbeddedTree(struct bNodeTree *ntree); + +/** + * Get address of potential node-tree pointer of given ID. + * + * \warning Using this function directly is potentially dangerous, if you don't know or are not + * sure, please use `ntreeFromID()` instead. + */ +struct bNodeTree **BKE_ntree_ptr_from_id(struct ID *id); + +/** + * Returns the private NodeTree object of the data-block, if it has one. + */ +struct bNodeTree *ntreeFromID(struct ID *id); + +void ntreeFreeLocalTree(struct bNodeTree *ntree); + +/** + * Check recursively if a node tree contains another. + */ +bool ntreeContainsTree(const struct bNodeTree *tree_to_search_in, + const struct bNodeTree *tree_to_search_for); + +void ntreeUpdateAllUsers(struct Main *main, struct ID *id); + +/** + * XXX: old trees handle output flags automatically based on special output + * node types and last active selection. + * New tree types have a per-output socket flag to indicate the final output to use explicitly. + */ +void ntreeSetOutput(struct bNodeTree *ntree); + +/** + * Returns localized tree for execution in threads. + */ +struct bNodeTree *ntreeLocalize(struct bNodeTree *ntree); + +/** + * This is only direct data, tree itself should have been written. + */ +void ntreeBlendWrite(struct BlendWriter *writer, struct bNodeTree *ntree); + +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Generic API, Nodes + * \{ */ + +struct bNodeType *nodeTypeFind(const char *idname); +const char *nodeTypeFindAlias(const char *idname); +void nodeRegisterType(struct bNodeType *ntype); +void nodeUnregisterType(struct bNodeType *ntype); +void nodeRegisterAlias(struct bNodeType *nt, const char *alias); +struct GHashIterator *nodeTypeGetIterator(void); + +/* Helper macros for iterating over node types. */ +#define NODE_TYPES_BEGIN(ntype) \ + { \ + GHashIterator *__node_type_iter__ = nodeTypeGetIterator(); \ + for (; !BLI_ghashIterator_done(__node_type_iter__); \ + BLI_ghashIterator_step(__node_type_iter__)) { \ + bNodeType *ntype = (bNodeType *)BLI_ghashIterator_getValue(__node_type_iter__); + +#define NODE_TYPES_END \ + } \ + BLI_ghashIterator_free(__node_type_iter__); \ + } \ + ((void)0) + +struct bNodeSocketType *nodeSocketTypeFind(const char *idname); +void nodeRegisterSocketType(struct bNodeSocketType *stype); +void nodeUnregisterSocketType(struct bNodeSocketType *stype); +bool nodeSocketIsRegistered(const struct bNodeSocket *sock); +struct GHashIterator *nodeSocketTypeGetIterator(void); +const char *nodeSocketTypeLabel(const bNodeSocketType *stype); + +const char *nodeStaticSocketType(int type, int subtype); +const char *nodeStaticSocketInterfaceTypeNew(int type, int subtype); +const char *nodeStaticSocketLabel(int type, int subtype); + +/* Helper macros for iterating over node types. */ +#define NODE_SOCKET_TYPES_BEGIN(stype) \ + { \ + GHashIterator *__node_socket_type_iter__ = nodeSocketTypeGetIterator(); \ + for (; !BLI_ghashIterator_done(__node_socket_type_iter__); \ + BLI_ghashIterator_step(__node_socket_type_iter__)) \ + { \ + bNodeSocketType *stype = (bNodeSocketType *)BLI_ghashIterator_getValue( \ + __node_socket_type_iter__); + +#define NODE_SOCKET_TYPES_END \ + } \ + BLI_ghashIterator_free(__node_socket_type_iter__); \ + } \ + ((void)0) + +struct bNodeSocket *nodeFindSocket(const struct bNode *node, + eNodeSocketInOut in_out, + const char *identifier); +struct bNodeSocket *nodeAddSocket(struct bNodeTree *ntree, + struct bNode *node, + eNodeSocketInOut in_out, + const char *idname, + const char *identifier, + const char *name); +struct bNodeSocket *nodeAddStaticSocket(struct bNodeTree *ntree, + struct bNode *node, + eNodeSocketInOut in_out, + int type, + int subtype, + const char *identifier, + const char *name); +void nodeRemoveSocket(struct bNodeTree *ntree, struct bNode *node, struct bNodeSocket *sock); + +void nodeModifySocketTypeStatic( + struct bNodeTree *ntree, struct bNode *node, struct bNodeSocket *sock, int type, int subtype); + +struct bNode *nodeAddNode(const struct bContext *C, struct bNodeTree *ntree, const char *idname); +struct bNode *nodeAddStaticNode(const struct bContext *C, struct bNodeTree *ntree, int type); + +/** + * Find the first available, non-duplicate name for a given node. + */ +void nodeUniqueName(struct bNodeTree *ntree, struct bNode *node); +/** + * Create a new unique integer identifier for the node. Also set the node's + * index in the tree, which is an eagerly maintained cache. + */ +void nodeUniqueID(struct bNodeTree *ntree, struct bNode *node); + +/** + * Delete node, associated animation data and ID user count. + */ +void nodeRemoveNode(struct Main *bmain, + struct bNodeTree *ntree, + struct bNode *node, + bool do_id_user); + +void nodeDimensionsGet(const struct bNode *node, float *r_width, float *r_height); +void nodeTagUpdateID(struct bNode *node); +void nodeInternalLinks(struct bNode *node, struct bNodeLink **r_links, int *r_len); + +/** + * Also used via RNA API, so we check for proper input output direction. + */ +struct bNodeLink *nodeAddLink(struct bNodeTree *ntree, + struct bNode *fromnode, + struct bNodeSocket *fromsock, + struct bNode *tonode, + struct bNodeSocket *tosock); +void nodeRemLink(struct bNodeTree *ntree, struct bNodeLink *link); +void nodeRemSocketLinks(struct bNodeTree *ntree, struct bNodeSocket *sock); + +bool nodeLinkIsHidden(const struct bNodeLink *link); + +void nodeAttachNode(struct bNodeTree *ntree, struct bNode *node, struct bNode *parent); +void nodeDetachNode(struct bNodeTree *ntree, struct bNode *node); + +/** + * Same as above but expects that the socket definitely is in the node tree. + */ +void nodeFindNode(struct bNodeTree *ntree, + struct bNodeSocket *sock, + struct bNode **r_node, + int *r_sockindex); +/** + * Finds a node based on its name. + */ +struct bNode *nodeFindNodebyName(struct bNodeTree *ntree, const char *name); +/** + * Finds a node based on given socket and returns true on success. + */ +bool nodeFindNodeTry(struct bNodeTree *ntree, + struct bNodeSocket *sock, + struct bNode **r_node, + int *r_sockindex); + +bool nodeIsParentAndChild(const bNode *parent, const bNode *child); + +int nodeCountSocketLinks(const struct bNodeTree *ntree, const struct bNodeSocket *sock); + +void nodeSetSelected(struct bNode *node, bool select); +/** + * Two active flags, ID nodes have special flag for buttons display. + */ +void nodeSetActive(struct bNodeTree *ntree, struct bNode *node); +struct bNode *nodeGetActive(struct bNodeTree *ntree); +void nodeClearActive(struct bNodeTree *ntree); +/** + * Two active flags, ID nodes have special flag for buttons display. + */ +struct bNode *nodeGetActiveTexture(struct bNodeTree *ntree); + +int nodeSocketLinkLimit(const struct bNodeSocket *sock); + +/** + * Node Instance Hash. + */ +typedef struct bNodeInstanceHash { + /** XXX should be made a direct member, #GHash allocation needs to support it */ + GHash *ghash; +} bNodeInstanceHash; + +typedef void (*bNodeInstanceValueFP)(void *value); + +/** + * Magic number for initial hash key. + */ +extern const bNodeInstanceKey NODE_INSTANCE_KEY_BASE; +extern const bNodeInstanceKey NODE_INSTANCE_KEY_NONE; + +bNodeInstanceKey BKE_node_instance_key(bNodeInstanceKey parent_key, + const struct bNodeTree *ntree, + const struct bNode *node); + +bNodeInstanceHash *BKE_node_instance_hash_new(const char *info); +void BKE_node_instance_hash_free(bNodeInstanceHash *hash, bNodeInstanceValueFP valfreefp); +void BKE_node_instance_hash_insert(bNodeInstanceHash *hash, bNodeInstanceKey key, void *value); +void *BKE_node_instance_hash_lookup(bNodeInstanceHash *hash, bNodeInstanceKey key); +int BKE_node_instance_hash_remove(bNodeInstanceHash *hash, + bNodeInstanceKey key, + bNodeInstanceValueFP valfreefp); +void BKE_node_instance_hash_clear(bNodeInstanceHash *hash, bNodeInstanceValueFP valfreefp); +void *BKE_node_instance_hash_pop(bNodeInstanceHash *hash, bNodeInstanceKey key); +int BKE_node_instance_hash_haskey(bNodeInstanceHash *hash, bNodeInstanceKey key); +int BKE_node_instance_hash_size(bNodeInstanceHash *hash); + +void BKE_node_instance_hash_clear_tags(bNodeInstanceHash *hash); +void BKE_node_instance_hash_tag(bNodeInstanceHash *hash, void *value); +bool BKE_node_instance_hash_tag_key(bNodeInstanceHash *hash, bNodeInstanceKey key); +void BKE_node_instance_hash_remove_untagged(bNodeInstanceHash *hash, + bNodeInstanceValueFP valfreefp); + +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Node Type Access + * \{ */ + +bool nodeGroupPoll(const struct bNodeTree *nodetree, + const struct bNodeTree *grouptree, + const char **r_disabled_hint); + +void node_type_base_custom(struct bNodeType *ntype, + const char *idname, + const char *name, + const char *enum_name, + short nclass); + +/** + * \warning Nodes defining a storage type _must_ allocate this for new nodes. + * Otherwise nodes will reload as undefined (#46619). + */ +void node_type_storage(struct bNodeType *ntype, + const char *storagename, + void (*freefunc)(struct bNode *node), + void (*copyfunc)(struct bNodeTree *dest_ntree, + struct bNode *dest_node, + const struct bNode *src_node)); + +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Common Node Types + * \{ */ + +#define NODE_UNDEFINED -2 /* node type is not registered */ +#define NODE_CUSTOM -1 /* for dynamically registered custom types */ +#define NODE_GROUP 2 +// #define NODE_FORLOOP 3 /* deprecated */ +// #define NODE_WHILELOOP 4 /* deprecated */ +#define NODE_FRAME 5 +#define NODE_REROUTE 6 +#define NODE_GROUP_INPUT 7 +#define NODE_GROUP_OUTPUT 8 +#define NODE_CUSTOM_GROUP 9 + +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Node Tree Iterator + * + * Utility macro for visiting every node tree in the library data, + * including local bNodeTree blocks in other IDs. + * This avoids the need for callback functions and allows executing code + * in a single inner code block. + * + * Variables: + * + * - nodetree: + * The actual bNodeTree data block. + * Check `nodetree->idname` or `nodetree->typeinfo` to use only specific types. + * + * - id: + * The owner of the bNodeTree data block. + * Same as nodetree if it's a linkable node tree from the library. + * + * Examples: + * + * \code{.c} + * FOREACH_NODETREE_BEGIN(bmain, nodetree, id) { + * if (id == nodetree) + * printf("This is a linkable node tree"); + * } FOREACH_NODETREE_END; + * + * FOREACH_NODETREE_BEGIN(bmain, nodetree, id) { + * if (nodetree->idname == "ShaderNodeTree") + * printf("This is a shader node tree); + * if (GS(id) == ID_MA) + * printf(" and it's owned by a material"); + * } FOREACH_NODETREE_END; + * \endcode + * + * \{ */ + +/* should be an opaque type, only for internal use by BKE_node_tree_iter_*** */ +struct NodeTreeIterStore { + bNodeTree *ngroup; + Scene *scene; + struct Material *mat; + Tex *tex; + struct Light *light; + struct World *world; + struct FreestyleLineStyle *linestyle; +}; + +void BKE_node_tree_iter_init(struct NodeTreeIterStore *ntreeiter, struct Main *bmain); +bool BKE_node_tree_iter_step(struct NodeTreeIterStore *ntreeiter, + struct bNodeTree **r_nodetree, + struct ID **r_id); + +#define FOREACH_NODETREE_BEGIN(bmain, _nodetree, _id) \ + { \ + struct NodeTreeIterStore _nstore; \ + bNodeTree *_nodetree; \ + ID *_id; \ + /* avoid compiler warning about unused variables */ \ + BKE_node_tree_iter_init(&_nstore, bmain); \ + while (BKE_node_tree_iter_step(&_nstore, &_nodetree, &_id) == true) { \ + if (_nodetree) { + +#define FOREACH_NODETREE_END \ + } \ + } \ + } \ + ((void)0) + +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Node Tree + */ + +void BKE_nodetree_remove_layer_n(struct bNodeTree *ntree, struct Scene *scene, int layer_index); + +/* -------------------------------------------------------------------- */ +/** \name Shader Nodes + * \{ */ + +/* NOTE: types are needed to restore callbacks, don't change values. */ + +// #define SH_NODE_MATERIAL 100 +#define SH_NODE_RGB 101 +#define SH_NODE_VALUE 102 +#define SH_NODE_MIX_RGB_LEGACY 103 +#define SH_NODE_VALTORGB 104 +#define SH_NODE_RGBTOBW 105 +#define SH_NODE_SHADERTORGB 106 +// #define SH_NODE_TEXTURE 106 +#define SH_NODE_NORMAL 107 +// #define SH_NODE_GEOMETRY 108 +#define SH_NODE_MAPPING 109 +#define SH_NODE_CURVE_VEC 110 +#define SH_NODE_CURVE_RGB 111 +#define SH_NODE_CAMERA 114 +#define SH_NODE_MATH 115 +#define SH_NODE_VECTOR_MATH 116 +#define SH_NODE_SQUEEZE 117 +// #define SH_NODE_MATERIAL_EXT 118 +#define SH_NODE_INVERT 119 +#define SH_NODE_SEPRGB_LEGACY 120 +#define SH_NODE_COMBRGB_LEGACY 121 +#define SH_NODE_HUE_SAT 122 + +#define SH_NODE_OUTPUT_MATERIAL 124 +#define SH_NODE_OUTPUT_WORLD 125 +#define SH_NODE_OUTPUT_LIGHT 126 +#define SH_NODE_FRESNEL 127 +#define SH_NODE_MIX_SHADER 128 +#define SH_NODE_ATTRIBUTE 129 +#define SH_NODE_BACKGROUND 130 +#define SH_NODE_BSDF_GLOSSY 131 +#define SH_NODE_BSDF_DIFFUSE 132 +#define SH_NODE_BSDF_GLOSSY_LEGACY 133 +#define SH_NODE_BSDF_GLASS 134 +#define SH_NODE_BSDF_TRANSLUCENT 137 +#define SH_NODE_BSDF_TRANSPARENT 138 +#define SH_NODE_BSDF_SHEEN 139 +#define SH_NODE_EMISSION 140 +#define SH_NODE_NEW_GEOMETRY 141 +#define SH_NODE_LIGHT_PATH 142 +#define SH_NODE_TEX_IMAGE 143 +#define SH_NODE_TEX_SKY 145 +#define SH_NODE_TEX_GRADIENT 146 +#define SH_NODE_TEX_VORONOI 147 +#define SH_NODE_TEX_MAGIC 148 +#define SH_NODE_TEX_WAVE 149 +#define SH_NODE_TEX_NOISE 150 +#define SH_NODE_TEX_MUSGRAVE_DEPRECATED 152 +#define SH_NODE_TEX_COORD 155 +#define SH_NODE_ADD_SHADER 156 +#define SH_NODE_TEX_ENVIRONMENT 157 +// #define SH_NODE_OUTPUT_TEXTURE 158 +#define SH_NODE_HOLDOUT 159 +#define SH_NODE_LAYER_WEIGHT 160 +#define SH_NODE_VOLUME_ABSORPTION 161 +#define SH_NODE_VOLUME_SCATTER 162 +#define SH_NODE_GAMMA 163 +#define SH_NODE_TEX_CHECKER 164 +#define SH_NODE_BRIGHTCONTRAST 165 +#define SH_NODE_LIGHT_FALLOFF 166 +#define SH_NODE_OBJECT_INFO 167 +#define SH_NODE_PARTICLE_INFO 168 +#define SH_NODE_TEX_BRICK 169 +#define SH_NODE_BUMP 170 +#define SH_NODE_SCRIPT 171 +#define SH_NODE_AMBIENT_OCCLUSION 172 +#define SH_NODE_BSDF_REFRACTION 173 +#define SH_NODE_TANGENT 174 +#define SH_NODE_NORMAL_MAP 175 +#define SH_NODE_HAIR_INFO 176 +#define SH_NODE_SUBSURFACE_SCATTERING 177 +#define SH_NODE_WIREFRAME 178 +#define SH_NODE_BSDF_TOON 179 +#define SH_NODE_WAVELENGTH 180 +#define SH_NODE_BLACKBODY 181 +#define SH_NODE_VECT_TRANSFORM 182 +#define SH_NODE_SEPHSV_LEGACY 183 +#define SH_NODE_COMBHSV_LEGACY 184 +#define SH_NODE_BSDF_HAIR 185 +// #define SH_NODE_LAMP 186 +#define SH_NODE_UVMAP 187 +#define SH_NODE_SEPXYZ 188 +#define SH_NODE_COMBXYZ 189 +#define SH_NODE_OUTPUT_LINESTYLE 190 +#define SH_NODE_UVALONGSTROKE 191 +#define SH_NODE_TEX_POINTDENSITY 192 +#define SH_NODE_BSDF_PRINCIPLED 193 +#define SH_NODE_TEX_IES 194 +#define SH_NODE_EEVEE_SPECULAR 195 +#define SH_NODE_BEVEL 197 +#define SH_NODE_DISPLACEMENT 198 +#define SH_NODE_VECTOR_DISPLACEMENT 199 +#define SH_NODE_VOLUME_PRINCIPLED 200 +/* 201..700 occupied by other node types, continue from 701 */ +#define SH_NODE_BSDF_HAIR_PRINCIPLED 701 +#define SH_NODE_MAP_RANGE 702 +#define SH_NODE_CLAMP 703 +#define SH_NODE_TEX_WHITE_NOISE 704 +#define SH_NODE_VOLUME_INFO 705 +#define SH_NODE_VERTEX_COLOR 706 +#define SH_NODE_OUTPUT_AOV 707 +#define SH_NODE_VECTOR_ROTATE 708 +#define SH_NODE_CURVE_FLOAT 709 +#define SH_NODE_POINT_INFO 710 +#define SH_NODE_COMBINE_COLOR 711 +#define SH_NODE_SEPARATE_COLOR 712 +#define SH_NODE_MIX 713 + +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Composite Nodes + * \{ */ + +/* output socket defines */ +#define RRES_OUT_IMAGE 0 +#define RRES_OUT_ALPHA 1 + +/* NOTE: types are needed to restore callbacks, don't change values. */ +#define CMP_NODE_VIEWER 201 +#define CMP_NODE_RGB 202 +#define CMP_NODE_VALUE 203 +#define CMP_NODE_MIX_RGB 204 +#define CMP_NODE_VALTORGB 205 +#define CMP_NODE_RGBTOBW 206 +#define CMP_NODE_NORMAL 207 +#define CMP_NODE_CURVE_VEC 208 +#define CMP_NODE_CURVE_RGB 209 +#define CMP_NODE_ALPHAOVER 210 +#define CMP_NODE_BLUR 211 +#define CMP_NODE_FILTER 212 +#define CMP_NODE_MAP_VALUE 213 +#define CMP_NODE_TIME 214 +#define CMP_NODE_VECBLUR 215 +#define CMP_NODE_SEPRGBA_LEGACY 216 +#define CMP_NODE_SEPHSVA_LEGACY 217 +#define CMP_NODE_SETALPHA 218 +#define CMP_NODE_HUE_SAT 219 +#define CMP_NODE_IMAGE 220 +#define CMP_NODE_R_LAYERS 221 +#define CMP_NODE_COMPOSITE 222 +#define CMP_NODE_OUTPUT_FILE 223 +#define CMP_NODE_TEXTURE 224 +#define CMP_NODE_TRANSLATE 225 +#define CMP_NODE_ZCOMBINE 226 +#define CMP_NODE_COMBRGBA_LEGACY 227 +#define CMP_NODE_DILATEERODE 228 +#define CMP_NODE_ROTATE 229 +#define CMP_NODE_SCALE 230 +#define CMP_NODE_SEPYCCA_LEGACY 231 +#define CMP_NODE_COMBYCCA_LEGACY 232 +#define CMP_NODE_SEPYUVA_LEGACY 233 +#define CMP_NODE_COMBYUVA_LEGACY 234 +#define CMP_NODE_DIFF_MATTE 235 +#define CMP_NODE_COLOR_SPILL 236 +#define CMP_NODE_CHROMA_MATTE 237 +#define CMP_NODE_CHANNEL_MATTE 238 +#define CMP_NODE_FLIP 239 +/* Split viewer node is now a regular split node: CMP_NODE_SPLIT. */ +#define CMP_NODE_SPLITVIEWER__DEPRECATED 240 +// #define CMP_NODE_INDEX_MASK 241 +#define CMP_NODE_MAP_UV 242 +#define CMP_NODE_ID_MASK 243 +#define CMP_NODE_DEFOCUS 244 +#define CMP_NODE_DISPLACE 245 +#define CMP_NODE_COMBHSVA_LEGACY 246 +#define CMP_NODE_MATH 247 +#define CMP_NODE_LUMA_MATTE 248 +#define CMP_NODE_BRIGHTCONTRAST 249 +#define CMP_NODE_GAMMA 250 +#define CMP_NODE_INVERT 251 +#define CMP_NODE_NORMALIZE 252 +#define CMP_NODE_CROP 253 +#define CMP_NODE_DBLUR 254 +#define CMP_NODE_BILATERALBLUR 255 +#define CMP_NODE_PREMULKEY 256 +#define CMP_NODE_DIST_MATTE 257 +#define CMP_NODE_VIEW_LEVELS 258 +#define CMP_NODE_COLOR_MATTE 259 +#define CMP_NODE_COLORBALANCE 260 +#define CMP_NODE_HUECORRECT 261 +#define CMP_NODE_MOVIECLIP 262 +#define CMP_NODE_STABILIZE2D 263 +#define CMP_NODE_TRANSFORM 264 +#define CMP_NODE_MOVIEDISTORTION 265 +#define CMP_NODE_DOUBLEEDGEMASK 266 +#define CMP_NODE_OUTPUT_MULTI_FILE__DEPRECATED \ + 267 /* DEPRECATED multi file node has been merged into regular CMP_NODE_OUTPUT_FILE */ +#define CMP_NODE_MASK 268 +#define CMP_NODE_KEYINGSCREEN 269 +#define CMP_NODE_KEYING 270 +#define CMP_NODE_TRACKPOS 271 +#define CMP_NODE_INPAINT 272 +#define CMP_NODE_DESPECKLE 273 +#define CMP_NODE_ANTIALIASING 274 +#define CMP_NODE_KUWAHARA 275 +#define CMP_NODE_SPLIT 276 + +#define CMP_NODE_GLARE 301 +#define CMP_NODE_TONEMAP 302 +#define CMP_NODE_LENSDIST 303 +#define CMP_NODE_SUNBEAMS 304 + +#define CMP_NODE_COLORCORRECTION 312 +#define CMP_NODE_MASK_BOX 313 +#define CMP_NODE_MASK_ELLIPSE 314 +#define CMP_NODE_BOKEHIMAGE 315 +#define CMP_NODE_BOKEHBLUR 316 +#define CMP_NODE_SWITCH 317 +#define CMP_NODE_PIXELATE 318 + +#define CMP_NODE_MAP_RANGE 319 +#define CMP_NODE_PLANETRACKDEFORM 320 +#define CMP_NODE_CORNERPIN 321 +#define CMP_NODE_SWITCH_VIEW 322 +#define CMP_NODE_CRYPTOMATTE_LEGACY 323 +#define CMP_NODE_DENOISE 324 +#define CMP_NODE_EXPOSURE 325 +#define CMP_NODE_CRYPTOMATTE 326 +#define CMP_NODE_POSTERIZE 327 +#define CMP_NODE_CONVERT_COLOR_SPACE 328 +#define CMP_NODE_SCENE_TIME 329 +#define CMP_NODE_SEPARATE_XYZ 330 +#define CMP_NODE_COMBINE_XYZ 331 +#define CMP_NODE_COMBINE_COLOR 332 +#define CMP_NODE_SEPARATE_COLOR 333 + +/* channel toggles */ +#define CMP_CHAN_RGB 1 +#define CMP_CHAN_A 2 + +/* Default SMAA configuration values. */ +#define CMP_DEFAULT_SMAA_THRESHOLD 1.0f +#define CMP_DEFAULT_SMAA_CONTRAST_LIMIT 0.2f +#define CMP_DEFAULT_SMAA_CORNER_ROUNDING 0.25f + +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Texture Nodes + * \{ */ + +#define TEX_NODE_OUTPUT 401 +#define TEX_NODE_CHECKER 402 +#define TEX_NODE_TEXTURE 403 +#define TEX_NODE_BRICKS 404 +#define TEX_NODE_MATH 405 +#define TEX_NODE_MIX_RGB 406 +#define TEX_NODE_RGBTOBW 407 +#define TEX_NODE_VALTORGB 408 +#define TEX_NODE_IMAGE 409 +#define TEX_NODE_CURVE_RGB 410 +#define TEX_NODE_INVERT 411 +#define TEX_NODE_HUE_SAT 412 +#define TEX_NODE_CURVE_TIME 413 +#define TEX_NODE_ROTATE 414 +#define TEX_NODE_VIEWER 415 +#define TEX_NODE_TRANSLATE 416 +#define TEX_NODE_COORD 417 +#define TEX_NODE_DISTANCE 418 +#define TEX_NODE_COMPOSE_LEGACY 419 +#define TEX_NODE_DECOMPOSE_LEGACY 420 +#define TEX_NODE_VALTONOR 421 +#define TEX_NODE_SCALE 422 +#define TEX_NODE_AT 423 +#define TEX_NODE_COMBINE_COLOR 424 +#define TEX_NODE_SEPARATE_COLOR 425 + +/* 501-599 reserved. Use like this: TEX_NODE_PROC + TEX_CLOUDS, etc */ +#define TEX_NODE_PROC 500 +#define TEX_NODE_PROC_MAX 600 + +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Geometry Nodes + * \{ */ + +#define GEO_NODE_TRIANGULATE 1000 +#define GEO_NODE_TRANSFORM_GEOMETRY 1002 +#define GEO_NODE_MESH_BOOLEAN 1003 +#define GEO_NODE_OBJECT_INFO 1007 +#define GEO_NODE_JOIN_GEOMETRY 1010 +#define GEO_NODE_COLLECTION_INFO 1023 +#define GEO_NODE_IS_VIEWPORT 1024 +#define GEO_NODE_SUBDIVIDE_MESH 1029 +#define GEO_NODE_MESH_PRIMITIVE_CUBE 1032 +#define GEO_NODE_MESH_PRIMITIVE_CIRCLE 1033 +#define GEO_NODE_MESH_PRIMITIVE_UV_SPHERE 1034 +#define GEO_NODE_MESH_PRIMITIVE_CYLINDER 1035 +#define GEO_NODE_MESH_PRIMITIVE_ICO_SPHERE 1036 +#define GEO_NODE_MESH_PRIMITIVE_CONE 1037 +#define GEO_NODE_MESH_PRIMITIVE_LINE 1038 +#define GEO_NODE_MESH_PRIMITIVE_GRID 1039 +#define GEO_NODE_BOUNDING_BOX 1042 +#define GEO_NODE_SWITCH 1043 +#define GEO_NODE_CURVE_TO_MESH 1045 +#define GEO_NODE_RESAMPLE_CURVE 1047 +#define GEO_NODE_INPUT_MATERIAL 1050 +#define GEO_NODE_REPLACE_MATERIAL 1051 +#define GEO_NODE_CURVE_LENGTH 1054 +#define GEO_NODE_CONVEX_HULL 1056 +#define GEO_NODE_SEPARATE_COMPONENTS 1059 +#define GEO_NODE_CURVE_PRIMITIVE_STAR 1062 +#define GEO_NODE_CURVE_PRIMITIVE_SPIRAL 1063 +#define GEO_NODE_CURVE_PRIMITIVE_QUADRATIC_BEZIER 1064 +#define GEO_NODE_CURVE_PRIMITIVE_BEZIER_SEGMENT 1065 +#define GEO_NODE_CURVE_PRIMITIVE_CIRCLE 1066 +#define GEO_NODE_VIEWER 1067 +#define GEO_NODE_CURVE_PRIMITIVE_LINE 1068 +#define GEO_NODE_CURVE_PRIMITIVE_QUADRILATERAL 1070 +#define GEO_NODE_TRIM_CURVE 1071 +#define GEO_NODE_FILL_CURVE 1075 +#define GEO_NODE_INPUT_POSITION 1076 +#define GEO_NODE_SET_POSITION 1077 +#define GEO_NODE_INPUT_INDEX 1078 +#define GEO_NODE_INPUT_NORMAL 1079 +#define GEO_NODE_CAPTURE_ATTRIBUTE 1080 +#define GEO_NODE_MATERIAL_SELECTION 1081 +#define GEO_NODE_SET_MATERIAL 1082 +#define GEO_NODE_REALIZE_INSTANCES 1083 +#define GEO_NODE_ATTRIBUTE_STATISTIC 1084 +#define GEO_NODE_SAMPLE_CURVE 1085 +#define GEO_NODE_INPUT_TANGENT 1086 +#define GEO_NODE_STRING_JOIN 1087 +#define GEO_NODE_CURVE_SPLINE_PARAMETER 1088 +#define GEO_NODE_FILLET_CURVE 1089 +#define GEO_NODE_DISTRIBUTE_POINTS_ON_FACES 1090 +#define GEO_NODE_STRING_TO_CURVES 1091 +#define GEO_NODE_INSTANCE_ON_POINTS 1092 +#define GEO_NODE_MESH_TO_POINTS 1093 +#define GEO_NODE_POINTS_TO_VERTICES 1094 +#define GEO_NODE_REVERSE_CURVE 1095 +#define GEO_NODE_PROXIMITY 1096 +#define GEO_NODE_SUBDIVIDE_CURVE 1097 +#define GEO_NODE_INPUT_SPLINE_LENGTH 1098 +#define GEO_NODE_CURVE_SPLINE_TYPE 1099 +#define GEO_NODE_CURVE_SET_HANDLE_TYPE 1100 +#define GEO_NODE_POINTS_TO_VOLUME 1101 +#define GEO_NODE_CURVE_HANDLE_TYPE_SELECTION 1102 +#define GEO_NODE_DELETE_GEOMETRY 1103 +#define GEO_NODE_SEPARATE_GEOMETRY 1104 +#define GEO_NODE_INPUT_RADIUS 1105 +#define GEO_NODE_INPUT_CURVE_TILT 1106 +#define GEO_NODE_INPUT_CURVE_HANDLES 1107 +#define GEO_NODE_INPUT_FACE_SMOOTH 1108 +#define GEO_NODE_INPUT_SPLINE_RESOLUTION 1109 +#define GEO_NODE_INPUT_SPLINE_CYCLIC 1110 +#define GEO_NODE_SET_CURVE_RADIUS 1111 +#define GEO_NODE_SET_CURVE_TILT 1112 +#define GEO_NODE_SET_CURVE_HANDLES 1113 +#define GEO_NODE_SET_SHADE_SMOOTH 1114 +#define GEO_NODE_SET_SPLINE_RESOLUTION 1115 +#define GEO_NODE_SET_SPLINE_CYCLIC 1116 +#define GEO_NODE_SET_POINT_RADIUS 1117 +#define GEO_NODE_INPUT_MATERIAL_INDEX 1118 +#define GEO_NODE_SET_MATERIAL_INDEX 1119 +#define GEO_NODE_TRANSLATE_INSTANCES 1120 +#define GEO_NODE_SCALE_INSTANCES 1121 +#define GEO_NODE_ROTATE_INSTANCES 1122 +#define GEO_NODE_SPLIT_EDGES 1123 +#define GEO_NODE_MESH_TO_CURVE 1124 +#define GEO_NODE_TRANSFER_ATTRIBUTE_DEPRECATED 1125 +#define GEO_NODE_SUBDIVISION_SURFACE 1126 +#define GEO_NODE_CURVE_ENDPOINT_SELECTION 1127 +#define GEO_NODE_RAYCAST 1128 +#define GEO_NODE_CURVE_TO_POINTS 1130 +#define GEO_NODE_INSTANCES_TO_POINTS 1131 +#define GEO_NODE_IMAGE_TEXTURE 1132 +#define GEO_NODE_VOLUME_TO_MESH 1133 +#define GEO_NODE_INPUT_ID 1134 +#define GEO_NODE_SET_ID 1135 +#define GEO_NODE_ATTRIBUTE_DOMAIN_SIZE 1136 +#define GEO_NODE_DUAL_MESH 1137 +#define GEO_NODE_INPUT_MESH_EDGE_VERTICES 1138 +#define GEO_NODE_INPUT_MESH_FACE_AREA 1139 +#define GEO_NODE_INPUT_MESH_FACE_NEIGHBORS 1140 +#define GEO_NODE_INPUT_MESH_VERTEX_NEIGHBORS 1141 +#define GEO_NODE_GEOMETRY_TO_INSTANCE 1142 +#define GEO_NODE_INPUT_MESH_EDGE_NEIGHBORS 1143 +#define GEO_NODE_INPUT_MESH_ISLAND 1144 +#define GEO_NODE_INPUT_SCENE_TIME 1145 +#define GEO_NODE_ACCUMULATE_FIELD 1146 +#define GEO_NODE_INPUT_MESH_EDGE_ANGLE 1147 +#define GEO_NODE_EVALUATE_AT_INDEX 1148 +#define GEO_NODE_CURVE_PRIMITIVE_ARC 1149 +#define GEO_NODE_FLIP_FACES 1150 +#define GEO_NODE_SCALE_ELEMENTS 1151 +#define GEO_NODE_EXTRUDE_MESH 1152 +#define GEO_NODE_MERGE_BY_DISTANCE 1153 +#define GEO_NODE_DUPLICATE_ELEMENTS 1154 +#define GEO_NODE_INPUT_MESH_FACE_IS_PLANAR 1155 +#define GEO_NODE_STORE_NAMED_ATTRIBUTE 1156 +#define GEO_NODE_INPUT_NAMED_ATTRIBUTE 1157 +#define GEO_NODE_REMOVE_ATTRIBUTE 1158 +#define GEO_NODE_INPUT_INSTANCE_ROTATION 1159 +#define GEO_NODE_INPUT_INSTANCE_SCALE 1160 +#define GEO_NODE_VOLUME_CUBE 1161 +#define GEO_NODE_POINTS 1162 +#define GEO_NODE_EVALUATE_ON_DOMAIN 1163 +#define GEO_NODE_MESH_TO_VOLUME 1164 +#define GEO_NODE_UV_UNWRAP 1165 +#define GEO_NODE_UV_PACK_ISLANDS 1166 +#define GEO_NODE_DEFORM_CURVES_ON_SURFACE 1167 +#define GEO_NODE_INPUT_SHORTEST_EDGE_PATHS 1168 +#define GEO_NODE_EDGE_PATHS_TO_CURVES 1169 +#define GEO_NODE_EDGE_PATHS_TO_SELECTION 1170 +#define GEO_NODE_MESH_FACE_GROUP_BOUNDARIES 1171 +#define GEO_NODE_DISTRIBUTE_POINTS_IN_VOLUME 1172 +#define GEO_NODE_SELF_OBJECT 1173 +#define GEO_NODE_SAMPLE_INDEX 1174 +#define GEO_NODE_SAMPLE_NEAREST 1175 +#define GEO_NODE_SAMPLE_NEAREST_SURFACE 1176 +#define GEO_NODE_OFFSET_POINT_IN_CURVE 1177 +#define GEO_NODE_CURVE_TOPOLOGY_CURVE_OF_POINT 1178 +#define GEO_NODE_CURVE_TOPOLOGY_POINTS_OF_CURVE 1179 +#define GEO_NODE_MESH_TOPOLOGY_OFFSET_CORNER_IN_FACE 1180 +#define GEO_NODE_MESH_TOPOLOGY_CORNERS_OF_FACE 1181 +#define GEO_NODE_MESH_TOPOLOGY_CORNERS_OF_VERTEX 1182 +#define GEO_NODE_MESH_TOPOLOGY_EDGES_OF_CORNER 1183 +#define GEO_NODE_MESH_TOPOLOGY_EDGES_OF_VERTEX 1184 +#define GEO_NODE_MESH_TOPOLOGY_FACE_OF_CORNER 1185 +#define GEO_NODE_MESH_TOPOLOGY_VERTEX_OF_CORNER 1186 +#define GEO_NODE_SAMPLE_UV_SURFACE 1187 +#define GEO_NODE_SET_CURVE_NORMAL 1188 +#define GEO_NODE_IMAGE_INFO 1189 +#define GEO_NODE_BLUR_ATTRIBUTE 1190 +#define GEO_NODE_IMAGE 1191 +#define GEO_NODE_INTERPOLATE_CURVES 1192 +#define GEO_NODE_EDGES_TO_FACE_GROUPS 1193 +// #define GEO_NODE_POINTS_TO_SDF_VOLUME 1194 +// #define GEO_NODE_MESH_TO_SDF_VOLUME 1195 +// #define GEO_NODE_SDF_VOLUME_SPHERE 1196 +// #define GEO_NODE_MEAN_FILTER_SDF_VOLUME 1197 +// #define GEO_NODE_OFFSET_SDF_VOLUME 1198 +#define GEO_NODE_INDEX_OF_NEAREST 1199 +/* Function nodes use the range starting at 1200. */ +#define GEO_NODE_SIMULATION_INPUT 2100 +#define GEO_NODE_SIMULATION_OUTPUT 2101 +// #define GEO_NODE_INPUT_SIGNED_DISTANCE 2102 +// #define GEO_NODE_SAMPLE_VOLUME 2103 +#define GEO_NODE_MESH_TOPOLOGY_CORNERS_OF_EDGE 2104 +/* Leaving out two indices to avoid crashes with files that were created during the development of + * the repeat zone. */ +#define GEO_NODE_REPEAT_INPUT 2107 +#define GEO_NODE_REPEAT_OUTPUT 2108 +#define GEO_NODE_TOOL_SELECTION 2109 +#define GEO_NODE_TOOL_SET_SELECTION 2110 +#define GEO_NODE_TOOL_3D_CURSOR 2111 +#define GEO_NODE_TOOL_FACE_SET 2112 +#define GEO_NODE_TOOL_SET_FACE_SET 2113 +#define GEO_NODE_POINTS_TO_CURVES 2114 +#define GEO_NODE_INPUT_EDGE_SMOOTH 2115 +#define GEO_NODE_SPLIT_TO_INSTANCES 2116 +#define GEO_NODE_INPUT_NAMED_LAYER_SELECTION 2117 +#define GEO_NODE_INDEX_SWITCH 2118 +#define GEO_NODE_INPUT_ACTIVE_CAMERA 2119 +#define GEO_NODE_BAKE 2120 +#define GEO_NODE_GET_NAMED_GRID 2121 +#define GEO_NODE_STORE_NAMED_GRID 2122 +#define GEO_NODE_SORT_ELEMENTS 2123 +#define GEO_NODE_MENU_SWITCH 2124 + +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Function Nodes + * \{ */ + +#define FN_NODE_BOOLEAN_MATH 1200 +#define FN_NODE_COMPARE 1202 +#define FN_NODE_LEGACY_RANDOM_FLOAT 1206 +#define FN_NODE_INPUT_VECTOR 1207 +#define FN_NODE_INPUT_STRING 1208 +#define FN_NODE_FLOAT_TO_INT 1209 +#define FN_NODE_VALUE_TO_STRING 1210 +#define FN_NODE_STRING_LENGTH 1211 +#define FN_NODE_SLICE_STRING 1212 +#define FN_NODE_INPUT_SPECIAL_CHARACTERS 1213 +#define FN_NODE_RANDOM_VALUE 1214 +#define FN_NODE_ROTATE_EULER 1215 +#define FN_NODE_ALIGN_EULER_TO_VECTOR 1216 +#define FN_NODE_INPUT_COLOR 1217 +#define FN_NODE_REPLACE_STRING 1218 +#define FN_NODE_INPUT_BOOL 1219 +#define FN_NODE_INPUT_INT 1220 +#define FN_NODE_SEPARATE_COLOR 1221 +#define FN_NODE_COMBINE_COLOR 1222 +#define FN_NODE_AXIS_ANGLE_TO_ROTATION 1223 +#define FN_NODE_EULER_TO_ROTATION 1224 +#define FN_NODE_QUATERNION_TO_ROTATION 1225 +#define FN_NODE_ROTATION_TO_AXIS_ANGLE 1226 +#define FN_NODE_ROTATION_TO_EULER 1227 +#define FN_NODE_ROTATION_TO_QUATERNION 1228 +#define FN_NODE_ROTATE_VECTOR 1229 +#define FN_NODE_ROTATE_ROTATION 1230 +#define FN_NODE_INVERT_ROTATION 1231 + +/** \} */ + +void BKE_node_system_init(void); +void BKE_node_system_exit(void); + +#ifdef __cplusplus +} +#endif diff --git a/source/blender/blenkernel/BKE_node.hh b/source/blender/blenkernel/BKE_node.hh index 00c543eafc2..6b3ce114a83 100644 --- a/source/blender/blenkernel/BKE_node.hh +++ b/source/blender/blenkernel/BKE_node.hh @@ -15,6 +15,7 @@ #include "DNA_listBase.h" +#include "BKE_node.h" #include "BKE_volume_enums.hh" /* for FOREACH_NODETREE_BEGIN */ @@ -25,1363 +26,6 @@ #include "BLI_map.hh" #include "BLI_string_ref.hh" -/* not very important, but the stack solver likes to know a maximum */ -#define MAX_SOCKET 512 - -struct BlendDataReader; -struct BlendWriter; -struct FreestyleLineStyle; -struct GPUMaterial; -struct GPUNodeStack; -struct ID; -struct ImBuf; -struct Light; -struct Main; -struct Material; -struct PointerRNA; -struct Scene; -struct SpaceNode; -struct Tex; -struct World; -struct bContext; -struct bNode; -struct bNodeExecContext; -struct bNodeExecData; -struct bNodeInstanceHash; -struct bNodeLink; -struct bNodeSocket; -struct bNodeStack; -struct bNodeTree; -struct bNodeTreeExec; -struct bNodeTreeType; -struct uiLayout; - -/* -------------------------------------------------------------------- */ -/** \name Node Type Definitions - * \{ */ - -/** - * \brief Compact definition of a node socket. - * - * Can be used to quickly define a list of static sockets for a node, - * which are added to each new node of that type. - * - * \deprecated This struct is used by C nodes to define templates as simple - * static struct lists. These are converted to the new template collections - * in RNA types automatically. - */ -typedef struct bNodeSocketTemplate { - int type; - char name[64]; /* MAX_NAME */ - float val1, val2, val3, val4; /* default alloc value for inputs */ - float min, max; - int subtype; /* would use PropertySubType but this is a bad level include to use RNA */ - int flag; - - /* after this line is used internal only */ - struct bNodeSocket *sock; /* used to hold verified socket */ - char identifier[64]; /* generated from name */ -} bNodeSocketTemplate; - -/* Use `void *` for callbacks that require C++. This is rather ugly, but works well for now. This - * would not be necessary if we would use bNodeSocketType and bNodeType only in C++ code. - * However, achieving this requires quite a few changes currently. */ -#ifdef __cplusplus -namespace blender { -class CPPType; -namespace nodes { -class DNode; -class NodeMultiFunctionBuilder; -class GeoNodeExecParams; -class NodeDeclaration; -class NodeDeclarationBuilder; -class GatherAddNodeSearchParams; -class GatherLinkSearchOpParams; -struct NodeExtraInfoParams; -} // namespace nodes -namespace realtime_compositor { -class Context; -class NodeOperation; -class ShaderNode; -} // namespace realtime_compositor -} // namespace blender - -using CPPTypeHandle = blender::CPPType; -using NodeMultiFunctionBuildFunction = void (*)(blender::nodes::NodeMultiFunctionBuilder &builder); -using NodeGeometryExecFunction = void (*)(blender::nodes::GeoNodeExecParams params); -using NodeDeclareFunction = void (*)(blender::nodes::NodeDeclarationBuilder &builder); -using NodeDeclareDynamicFunction = void (*)(const bNodeTree &tree, - const bNode &node, - blender::nodes::NodeDeclarationBuilder &builder); -using SocketGetCPPValueFunction = void (*)(const void *socket_value, void *r_value); -using SocketGetGeometryNodesCPPValueFunction = void (*)(const void *socket_value, void *r_value); - -/* Adds socket link operations that are specific to this node type. */ -using NodeGatherSocketLinkOperationsFunction = - void (*)(blender::nodes::GatherLinkSearchOpParams ¶ms); - -/* Adds node add menu operations that are specific to this node type. */ -using NodeGatherAddOperationsFunction = - void (*)(blender::nodes::GatherAddNodeSearchParams ¶ms); - -using NodeGetCompositorOperationFunction = blender::realtime_compositor::NodeOperation - *(*)(blender::realtime_compositor::Context &context, blender::nodes::DNode node); -using NodeGetCompositorShaderNodeFunction = - blender::realtime_compositor::ShaderNode *(*)(blender::nodes::DNode node); -using NodeExtraInfoFunction = void (*)(blender::nodes::NodeExtraInfoParams ¶ms); - -#else -typedef void *NodeGetCompositorOperationFunction; -typedef void *NodeGetCompositorShaderNodeFunction; -typedef void *NodeMultiFunctionBuildFunction; -typedef void *NodeGeometryExecFunction; -typedef void *NodeDeclareFunction; -typedef void *NodeDeclareDynamicFunction; -typedef void *NodeGatherSocketLinkOperationsFunction; -typedef void *NodeGatherAddOperationsFunction; -typedef void *SocketGetCPPTypeFunction; -typedef void *SocketGetGeometryNodesCPPTypeFunction; -typedef void *SocketGetGeometryNodesCPPValueFunction; -typedef void *SocketGetCPPValueFunction; -typedef void *NodeExtraInfoFunction; -typedef struct CPPTypeHandle CPPTypeHandle; -#endif - -/** - * \brief Defines a socket type. - * - * Defines the appearance and behavior of a socket in the UI. - */ -typedef struct bNodeSocketType { - /** Identifier name. */ - char idname[64]; - /** Type label. */ - char label[64]; - /** Sub-type label. */ - char subtype_label[64]; - - void (*draw)(struct bContext *C, - struct uiLayout *layout, - struct PointerRNA *ptr, - struct PointerRNA *node_ptr, - const char *text); - void (*draw_color)(struct bContext *C, - struct PointerRNA *ptr, - struct PointerRNA *node_ptr, - float *r_color); - void (*draw_color_simple)(const bNodeSocketType *socket_type, float *r_color); - - void (*interface_draw)(struct ID *id, - struct bNodeTreeInterfaceSocket *socket, - struct bContext *C, - struct uiLayout *layout); - void (*interface_init_socket)(struct ID *id, - const struct bNodeTreeInterfaceSocket *interface_socket, - struct bNode *node, - struct bNodeSocket *socket, - const char *data_path); - void (*interface_from_socket)(struct ID *id, - struct bNodeTreeInterfaceSocket *interface_socket, - const struct bNode *node, - const struct bNodeSocket *socket); - - /* RNA integration */ - ExtensionRNA ext_socket; - ExtensionRNA ext_interface; - - /* for standard socket types in C */ - int type, subtype; - - /* When set, bNodeSocket->limit does not have any effect anymore. */ - bool use_link_limits_of_type; - int input_link_limit; - int output_link_limit; - - /* Callback to free the socket type. */ - void (*free_self)(struct bNodeSocketType *stype); - - /* Return the CPPType of this socket. */ - const CPPTypeHandle *base_cpp_type; - /* Get the value of this socket in a generic way. */ - SocketGetCPPValueFunction get_base_cpp_value; - /* Get geometry nodes cpp type. */ - const CPPTypeHandle *geometry_nodes_cpp_type; - /* Get geometry nodes cpp value. */ - SocketGetGeometryNodesCPPValueFunction get_geometry_nodes_cpp_value; - /* Default value for this socket type. */ - const void *geometry_nodes_default_cpp_value; -} bNodeSocketType; - -typedef void *(*NodeInitExecFunction)(struct bNodeExecContext *context, - struct bNode *node, - bNodeInstanceKey key); -typedef void (*NodeFreeExecFunction)(void *nodedata); -typedef void (*NodeExecFunction)(void *data, - int thread, - struct bNode *, - struct bNodeExecData *execdata, - struct bNodeStack **in, - struct bNodeStack **out); -typedef int (*NodeGPUExecFunction)(struct GPUMaterial *mat, - struct bNode *node, - struct bNodeExecData *execdata, - struct GPUNodeStack *in, - struct GPUNodeStack *out); -typedef void (*NodeMaterialXFunction)(void *data, struct bNode *node, struct bNodeSocket *out); - -/** - * \brief Defines a node type. - * - * Initial attributes and constants for a node as well as callback functions - * implementing the node behavior. - */ -typedef struct bNodeType { - char idname[64]; /* identifier name */ - int type; - - char ui_name[64]; /* MAX_NAME */ - char ui_description[256]; - int ui_icon; - /** Should usually use the idname instead, but this enum type is still exposed in Python. */ - const char *enum_name_legacy; - - float width, minwidth, maxwidth; - float height, minheight, maxheight; - short nclass, flag; - - /* templates for static sockets */ - bNodeSocketTemplate *inputs, *outputs; - - char storagename[64]; /* struct name for DNA */ - - /* Draw the option buttons on the node */ - void (*draw_buttons)(struct uiLayout *, struct bContext *C, struct PointerRNA *ptr); - /* Additional parameters in the side panel */ - void (*draw_buttons_ex)(struct uiLayout *, struct bContext *C, struct PointerRNA *ptr); - - /* Additional drawing on backdrop */ - void (*draw_backdrop)( - struct SpaceNode *snode, struct ImBuf *backdrop, struct bNode *node, int x, int y); - - /** - * Optional custom label function for the node header. - * \note Used as a fallback when #bNode.label isn't set. - */ - void (*labelfunc)(const struct bNodeTree *ntree, - const struct bNode *node, - char *label, - int label_maxncpy); - - /** Optional override for node class, used for drawing node header. */ - int (*ui_class)(const struct bNode *node); - - /** Called when the node is updated in the editor. */ - void (*updatefunc)(struct bNodeTree *ntree, struct bNode *node); - /** Check and update if internal ID data has changed. */ - void (*group_update_func)(struct bNodeTree *ntree, struct bNode *node); - - /** - * Initialize a new node instance of this type after creation. - * - * \note Assignments to `node->id` must not increment the user of the ID. - * This is handled by the caller of this callback. - */ - void (*initfunc)(struct bNodeTree *ntree, struct bNode *node); - /** - * Free the node instance. - * - * \note Access to `node->id` must be avoided in this function as this is called - * while freeing #Main, the state of this ID is undefined. - * Higher level logic to remove the node handles the user-count. - */ - void (*freefunc)(struct bNode *node); - /** Make a copy of the node instance. */ - void (*copyfunc)(struct bNodeTree *dest_ntree, - struct bNode *dest_node, - const struct bNode *src_node); - - /* Registerable API callback versions, called in addition to C callbacks */ - void (*initfunc_api)(const struct bContext *C, struct PointerRNA *ptr); - void (*freefunc_api)(struct PointerRNA *ptr); - void (*copyfunc_api)(struct PointerRNA *ptr, const struct bNode *src_node); - - /** - * An additional poll test for deciding whether nodes should be an option in search menus. - * Potentially more strict poll than #poll(), but doesn't have to check the same things. - */ - bool (*add_ui_poll)(const struct bContext *C); - - /** - * Can this node type be added to a node tree? - * \param r_disabled_hint: Hint to display in the UI when the poll fails. - * The callback can set this to a static string without having to - * null-check it (or without setting it to null if it's not used). - * The caller must pass a valid `const char **` and null-initialize it - * when it's not just a dummy, that is, if it actually wants to access - * the returned disabled-hint (null-check needed!). - */ - bool (*poll)(const struct bNodeType *ntype, - const struct bNodeTree *nodetree, - const char **r_disabled_hint); - /** - * Can this node be added to a node tree? - * \param r_disabled_hint: See `poll()`. - */ - bool (*poll_instance)(const struct bNode *node, - const struct bNodeTree *nodetree, - const char **r_disabled_hint); - - /* Optional handling of link insertion. Returns false if the link shouldn't be created. */ - bool (*insert_link)(struct bNodeTree *ntree, struct bNode *node, struct bNodeLink *link); - - void (*free_self)(struct bNodeType *ntype); - - /* **** execution callbacks **** */ - NodeInitExecFunction init_exec_fn; - NodeFreeExecFunction free_exec_fn; - NodeExecFunction exec_fn; - /* gpu */ - NodeGPUExecFunction gpu_fn; - /* MaterialX */ - NodeMaterialXFunction materialx_fn; - - /* Get an instance of this node's compositor operation. Freeing the instance is the - * responsibility of the caller. */ - NodeGetCompositorOperationFunction get_compositor_operation; - - /* Get an instance of this node's compositor shader node. Freeing the instance is the - * responsibility of the caller. */ - NodeGetCompositorShaderNodeFunction get_compositor_shader_node; - - /* A message to display in the node header for unsupported realtime compositor nodes. The message - * is assumed to be static and thus require no memory handling. This field is to be removed when - * all nodes are supported. */ - const char *realtime_compositor_unsupported_message; - - /* Build a multi-function for this node. */ - NodeMultiFunctionBuildFunction build_multi_function; - - /* Execute a geometry node. */ - NodeGeometryExecFunction geometry_node_execute; - - /** - * Declares which sockets and panels the node has. It has to be able to generate a declaration - * with and without a specific node context. If the declaration depends on the node, but the node - * is not provided, then the declaration should be generated as much as possible and everything - * that depends on the node context should be skipped. - */ - NodeDeclareFunction declare; - - /** - * Declaration of the node outside of any context. If the node declaration is never dependent on - * the node context, this declaration is also shared with the corresponding node instances. - * Otherwise, it mainly allows checking what sockets a node will have, without having to create - * the node. In this case, the static declaration is mostly just a hint, and does not have to - * match with the final node. - */ - NodeDeclarationHandle *static_declaration; - - /** - * Add to the list of search names and operations gathered by node link drag searching. - * Usually it isn't necessary to override the default behavior here, but a node type can have - * custom behavior here like adding custom search items. - */ - NodeGatherSocketLinkOperationsFunction gather_link_search_ops; - - /** Get extra information that is drawn next to the node. */ - NodeExtraInfoFunction get_extra_info; - - /** True when the node cannot be muted. */ - bool no_muting; - /** True when the node still works but it's usage is discouraged. */ - const char *deprecation_notice; - - /* RNA integration */ - ExtensionRNA rna_ext; -} bNodeType; - -/** #bNodeType.nclass (for add-menu and themes). */ -#define NODE_CLASS_INPUT 0 -#define NODE_CLASS_OUTPUT 1 -#define NODE_CLASS_OP_COLOR 3 -#define NODE_CLASS_OP_VECTOR 4 -#define NODE_CLASS_OP_FILTER 5 -#define NODE_CLASS_GROUP 6 -#define NODE_CLASS_CONVERTER 8 -#define NODE_CLASS_MATTE 9 -#define NODE_CLASS_DISTORT 10 -#define NODE_CLASS_PATTERN 12 -#define NODE_CLASS_TEXTURE 13 -#define NODE_CLASS_SCRIPT 32 -#define NODE_CLASS_INTERFACE 33 -#define NODE_CLASS_SHADER 40 -#define NODE_CLASS_GEOMETRY 41 -#define NODE_CLASS_ATTRIBUTE 42 -#define NODE_CLASS_LAYOUT 100 - -struct bNodeTreeExec; - -typedef void (*bNodeClassCallback)(void *calldata, int nclass, const char *name); -typedef struct bNodeTreeType { - int type; /* type identifier */ - char idname[64]; /* identifier name */ - - /* The ID name of group nodes for this type. */ - char group_idname[64]; - - char ui_name[64]; - char ui_description[256]; - int ui_icon; - - /* callbacks */ - /* Iteration over all node classes. */ - void (*foreach_nodeclass)(struct Scene *scene, void *calldata, bNodeClassCallback func); - /* Check visibility in the node editor */ - bool (*poll)(const struct bContext *C, struct bNodeTreeType *ntreetype); - /* Select a node tree from the context */ - void (*get_from_context)(const struct bContext *C, - struct bNodeTreeType *ntreetype, - struct bNodeTree **r_ntree, - struct ID **r_id, - struct ID **r_from); - - /* calls allowing threaded composite */ - void (*localize)(struct bNodeTree *localtree, struct bNodeTree *ntree); - void (*local_merge)(struct Main *bmain, struct bNodeTree *localtree, struct bNodeTree *ntree); - - /* Tree update. Overrides `nodetype->updatetreefunc`. */ - void (*update)(struct bNodeTree *ntree); - - bool (*validate_link)(eNodeSocketDatatype from, eNodeSocketDatatype to); - - void (*node_add_init)(struct bNodeTree *ntree, struct bNode *bnode); - - /* Check if the socket type is valid for this tree type. */ - bool (*valid_socket_type)(struct bNodeTreeType *ntreetype, struct bNodeSocketType *socket_type); - - /* RNA integration */ - ExtensionRNA rna_ext; -} bNodeTreeType; - -/** \} */ - -/* -------------------------------------------------------------------- */ -/** \name Generic API, Trees - * \{ */ - -struct bNodeTreeType *ntreeTypeFind(const char *idname); -void ntreeTypeAdd(struct bNodeTreeType *nt); -void ntreeTypeFreeLink(const struct bNodeTreeType *nt); -bool ntreeIsRegistered(const struct bNodeTree *ntree); -struct GHashIterator *ntreeTypeGetIterator(); - -/* Helper macros for iterating over tree types. */ -#define NODE_TREE_TYPES_BEGIN(ntype) \ - { \ - GHashIterator *__node_tree_type_iter__ = ntreeTypeGetIterator(); \ - for (; !BLI_ghashIterator_done(__node_tree_type_iter__); \ - BLI_ghashIterator_step(__node_tree_type_iter__)) \ - { \ - bNodeTreeType *ntype = (bNodeTreeType *)BLI_ghashIterator_getValue(__node_tree_type_iter__); - -#define NODE_TREE_TYPES_END \ - } \ - BLI_ghashIterator_free(__node_tree_type_iter__); \ - } \ - (void)0 - -/** - * Try to initialize all type-info in a node tree. - * - * \note In general undefined type-info is a perfectly valid case, - * the type may just be registered later. - * In that case the update_typeinfo function will set type-info on registration - * and do necessary updates. - */ -void ntreeSetTypes(const struct bContext *C, struct bNodeTree *ntree); - -struct bNodeTree *ntreeAddTree(struct Main *bmain, const char *name, const char *idname); - -/** - * Free tree which is embedded into another data-block. - */ -void ntreeFreeEmbeddedTree(struct bNodeTree *ntree); - -/** - * Get address of potential node-tree pointer of given ID. - * - * \warning Using this function directly is potentially dangerous, if you don't know or are not - * sure, please use `ntreeFromID()` instead. - */ -struct bNodeTree **BKE_ntree_ptr_from_id(struct ID *id); - -/** - * Returns the private NodeTree object of the data-block, if it has one. - */ -struct bNodeTree *ntreeFromID(struct ID *id); - -void ntreeFreeLocalTree(struct bNodeTree *ntree); - -/** - * Check recursively if a node tree contains another. - */ -bool ntreeContainsTree(const struct bNodeTree *tree_to_search_in, - const struct bNodeTree *tree_to_search_for); - -void ntreeUpdateAllUsers(struct Main *main, struct ID *id); - -/** - * XXX: old trees handle output flags automatically based on special output - * node types and last active selection. - * New tree types have a per-output socket flag to indicate the final output to use explicitly. - */ -void ntreeSetOutput(struct bNodeTree *ntree); - -/** - * Returns localized tree for execution in threads. - */ -struct bNodeTree *ntreeLocalize(struct bNodeTree *ntree); - -/** - * This is only direct data, tree itself should have been written. - */ -void ntreeBlendWrite(struct BlendWriter *writer, struct bNodeTree *ntree); - -/** \} */ - -/* -------------------------------------------------------------------- */ -/** \name Generic API, Nodes - * \{ */ - -struct bNodeType *nodeTypeFind(const char *idname); -const char *nodeTypeFindAlias(const char *idname); -void nodeRegisterType(struct bNodeType *ntype); -void nodeUnregisterType(struct bNodeType *ntype); -void nodeRegisterAlias(struct bNodeType *nt, const char *alias); -struct GHashIterator *nodeTypeGetIterator(); - -/* Helper macros for iterating over node types. */ -#define NODE_TYPES_BEGIN(ntype) \ - { \ - GHashIterator *__node_type_iter__ = nodeTypeGetIterator(); \ - for (; !BLI_ghashIterator_done(__node_type_iter__); \ - BLI_ghashIterator_step(__node_type_iter__)) { \ - bNodeType *ntype = (bNodeType *)BLI_ghashIterator_getValue(__node_type_iter__); - -#define NODE_TYPES_END \ - } \ - BLI_ghashIterator_free(__node_type_iter__); \ - } \ - ((void)0) - -struct bNodeSocketType *nodeSocketTypeFind(const char *idname); -void nodeRegisterSocketType(struct bNodeSocketType *stype); -void nodeUnregisterSocketType(struct bNodeSocketType *stype); -bool nodeSocketIsRegistered(const struct bNodeSocket *sock); -struct GHashIterator *nodeSocketTypeGetIterator(); -const char *nodeSocketTypeLabel(const bNodeSocketType *stype); - -const char *nodeStaticSocketType(int type, int subtype); -const char *nodeStaticSocketInterfaceTypeNew(int type, int subtype); -const char *nodeStaticSocketLabel(int type, int subtype); - -/* Helper macros for iterating over node types. */ -#define NODE_SOCKET_TYPES_BEGIN(stype) \ - { \ - GHashIterator *__node_socket_type_iter__ = nodeSocketTypeGetIterator(); \ - for (; !BLI_ghashIterator_done(__node_socket_type_iter__); \ - BLI_ghashIterator_step(__node_socket_type_iter__)) \ - { \ - bNodeSocketType *stype = (bNodeSocketType *)BLI_ghashIterator_getValue( \ - __node_socket_type_iter__); - -#define NODE_SOCKET_TYPES_END \ - } \ - BLI_ghashIterator_free(__node_socket_type_iter__); \ - } \ - ((void)0) - -struct bNodeSocket *nodeFindSocket(const struct bNode *node, - eNodeSocketInOut in_out, - const char *identifier); -struct bNodeSocket *nodeAddSocket(struct bNodeTree *ntree, - struct bNode *node, - eNodeSocketInOut in_out, - const char *idname, - const char *identifier, - const char *name); -struct bNodeSocket *nodeAddStaticSocket(struct bNodeTree *ntree, - struct bNode *node, - eNodeSocketInOut in_out, - int type, - int subtype, - const char *identifier, - const char *name); -void nodeRemoveSocket(struct bNodeTree *ntree, struct bNode *node, struct bNodeSocket *sock); - -void nodeModifySocketTypeStatic( - struct bNodeTree *ntree, struct bNode *node, struct bNodeSocket *sock, int type, int subtype); - -struct bNode *nodeAddNode(const struct bContext *C, struct bNodeTree *ntree, const char *idname); -struct bNode *nodeAddStaticNode(const struct bContext *C, struct bNodeTree *ntree, int type); - -/** - * Find the first available, non-duplicate name for a given node. - */ -void nodeUniqueName(struct bNodeTree *ntree, struct bNode *node); -/** - * Create a new unique integer identifier for the node. Also set the node's - * index in the tree, which is an eagerly maintained cache. - */ -void nodeUniqueID(struct bNodeTree *ntree, struct bNode *node); - -/** - * Delete node, associated animation data and ID user count. - */ -void nodeRemoveNode(struct Main *bmain, - struct bNodeTree *ntree, - struct bNode *node, - bool do_id_user); - -void nodeDimensionsGet(const struct bNode *node, float *r_width, float *r_height); -void nodeTagUpdateID(struct bNode *node); -void nodeInternalLinks(struct bNode *node, struct bNodeLink **r_links, int *r_len); - -/** - * Also used via RNA API, so we check for proper input output direction. - */ -struct bNodeLink *nodeAddLink(struct bNodeTree *ntree, - struct bNode *fromnode, - struct bNodeSocket *fromsock, - struct bNode *tonode, - struct bNodeSocket *tosock); -void nodeRemLink(struct bNodeTree *ntree, struct bNodeLink *link); -void nodeRemSocketLinks(struct bNodeTree *ntree, struct bNodeSocket *sock); - -bool nodeLinkIsHidden(const struct bNodeLink *link); - -void nodeAttachNode(struct bNodeTree *ntree, struct bNode *node, struct bNode *parent); -void nodeDetachNode(struct bNodeTree *ntree, struct bNode *node); - -/** - * Same as above but expects that the socket definitely is in the node tree. - */ -void nodeFindNode(struct bNodeTree *ntree, - struct bNodeSocket *sock, - struct bNode **r_node, - int *r_sockindex); -/** - * Finds a node based on its name. - */ -struct bNode *nodeFindNodebyName(struct bNodeTree *ntree, const char *name); -/** - * Finds a node based on given socket and returns true on success. - */ -bool nodeFindNodeTry(struct bNodeTree *ntree, - struct bNodeSocket *sock, - struct bNode **r_node, - int *r_sockindex); - -bool nodeIsParentAndChild(const bNode *parent, const bNode *child); - -int nodeCountSocketLinks(const struct bNodeTree *ntree, const struct bNodeSocket *sock); - -void nodeSetSelected(struct bNode *node, bool select); -/** - * Two active flags, ID nodes have special flag for buttons display. - */ -void nodeSetActive(struct bNodeTree *ntree, struct bNode *node); -struct bNode *nodeGetActive(struct bNodeTree *ntree); -void nodeClearActive(struct bNodeTree *ntree); -/** - * Two active flags, ID nodes have special flag for buttons display. - */ -struct bNode *nodeGetActiveTexture(struct bNodeTree *ntree); - -int nodeSocketLinkLimit(const struct bNodeSocket *sock); - -/** - * Node Instance Hash. - */ -typedef struct bNodeInstanceHash { - /** XXX should be made a direct member, #GHash allocation needs to support it */ - GHash *ghash; -} bNodeInstanceHash; - -typedef void (*bNodeInstanceValueFP)(void *value); - -/** - * Magic number for initial hash key. - */ -extern const bNodeInstanceKey NODE_INSTANCE_KEY_BASE; -extern const bNodeInstanceKey NODE_INSTANCE_KEY_NONE; - -bNodeInstanceKey BKE_node_instance_key(bNodeInstanceKey parent_key, - const struct bNodeTree *ntree, - const struct bNode *node); - -bNodeInstanceHash *BKE_node_instance_hash_new(const char *info); -void BKE_node_instance_hash_free(bNodeInstanceHash *hash, bNodeInstanceValueFP valfreefp); -void BKE_node_instance_hash_insert(bNodeInstanceHash *hash, bNodeInstanceKey key, void *value); -void *BKE_node_instance_hash_lookup(bNodeInstanceHash *hash, bNodeInstanceKey key); -int BKE_node_instance_hash_remove(bNodeInstanceHash *hash, - bNodeInstanceKey key, - bNodeInstanceValueFP valfreefp); -void BKE_node_instance_hash_clear(bNodeInstanceHash *hash, bNodeInstanceValueFP valfreefp); -void *BKE_node_instance_hash_pop(bNodeInstanceHash *hash, bNodeInstanceKey key); -int BKE_node_instance_hash_haskey(bNodeInstanceHash *hash, bNodeInstanceKey key); -int BKE_node_instance_hash_size(bNodeInstanceHash *hash); - -void BKE_node_instance_hash_clear_tags(bNodeInstanceHash *hash); -void BKE_node_instance_hash_tag(bNodeInstanceHash *hash, void *value); -bool BKE_node_instance_hash_tag_key(bNodeInstanceHash *hash, bNodeInstanceKey key); -void BKE_node_instance_hash_remove_untagged(bNodeInstanceHash *hash, - bNodeInstanceValueFP valfreefp); - -/** \} */ - -/* -------------------------------------------------------------------- */ -/** \name Node Type Access - * \{ */ - -bool nodeGroupPoll(const struct bNodeTree *nodetree, - const struct bNodeTree *grouptree, - const char **r_disabled_hint); - -void node_type_base_custom(struct bNodeType *ntype, - const char *idname, - const char *name, - const char *enum_name, - short nclass); - -/** - * \warning Nodes defining a storage type _must_ allocate this for new nodes. - * Otherwise nodes will reload as undefined (#46619). - */ -void node_type_storage(struct bNodeType *ntype, - const char *storagename, - void (*freefunc)(struct bNode *node), - void (*copyfunc)(struct bNodeTree *dest_ntree, - struct bNode *dest_node, - const struct bNode *src_node)); - -/** \} */ - -/* -------------------------------------------------------------------- */ -/** \name Common Node Types - * \{ */ - -#define NODE_UNDEFINED -2 /* node type is not registered */ -#define NODE_CUSTOM -1 /* for dynamically registered custom types */ -#define NODE_GROUP 2 -// #define NODE_FORLOOP 3 /* deprecated */ -// #define NODE_WHILELOOP 4 /* deprecated */ -#define NODE_FRAME 5 -#define NODE_REROUTE 6 -#define NODE_GROUP_INPUT 7 -#define NODE_GROUP_OUTPUT 8 -#define NODE_CUSTOM_GROUP 9 - -/** \} */ - -/* -------------------------------------------------------------------- */ -/** \name Node Tree Iterator - * - * Utility macro for visiting every node tree in the library data, - * including local bNodeTree blocks in other IDs. - * This avoids the need for callback functions and allows executing code - * in a single inner code block. - * - * Variables: - * - * - nodetree: - * The actual bNodeTree data block. - * Check `nodetree->idname` or `nodetree->typeinfo` to use only specific types. - * - * - id: - * The owner of the bNodeTree data block. - * Same as nodetree if it's a linkable node tree from the library. - * - * Examples: - * - * \code{.c} - * FOREACH_NODETREE_BEGIN(bmain, nodetree, id) { - * if (id == nodetree) - * printf("This is a linkable node tree"); - * } FOREACH_NODETREE_END; - * - * FOREACH_NODETREE_BEGIN(bmain, nodetree, id) { - * if (nodetree->idname == "ShaderNodeTree") - * printf("This is a shader node tree); - * if (GS(id) == ID_MA) - * printf(" and it's owned by a material"); - * } FOREACH_NODETREE_END; - * \endcode - * - * \{ */ - -/* should be an opaque type, only for internal use by BKE_node_tree_iter_*** */ -struct NodeTreeIterStore { - bNodeTree *ngroup; - Scene *scene; - struct Material *mat; - Tex *tex; - struct Light *light; - struct World *world; - struct FreestyleLineStyle *linestyle; -}; - -void BKE_node_tree_iter_init(struct NodeTreeIterStore *ntreeiter, struct Main *bmain); -bool BKE_node_tree_iter_step(struct NodeTreeIterStore *ntreeiter, - struct bNodeTree **r_nodetree, - struct ID **r_id); - -#define FOREACH_NODETREE_BEGIN(bmain, _nodetree, _id) \ - { \ - struct NodeTreeIterStore _nstore; \ - bNodeTree *_nodetree; \ - ID *_id; \ - /* avoid compiler warning about unused variables */ \ - BKE_node_tree_iter_init(&_nstore, bmain); \ - while (BKE_node_tree_iter_step(&_nstore, &_nodetree, &_id) == true) { \ - if (_nodetree) { - -#define FOREACH_NODETREE_END \ - } \ - } \ - } \ - ((void)0) - -/** \} */ - -/* -------------------------------------------------------------------- */ -/** \name Node Tree - */ - -void BKE_nodetree_remove_layer_n(struct bNodeTree *ntree, struct Scene *scene, int layer_index); - -/* -------------------------------------------------------------------- */ -/** \name Shader Nodes - * \{ */ - -/* NOTE: types are needed to restore callbacks, don't change values. */ - -// #define SH_NODE_MATERIAL 100 -#define SH_NODE_RGB 101 -#define SH_NODE_VALUE 102 -#define SH_NODE_MIX_RGB_LEGACY 103 -#define SH_NODE_VALTORGB 104 -#define SH_NODE_RGBTOBW 105 -#define SH_NODE_SHADERTORGB 106 -// #define SH_NODE_TEXTURE 106 -#define SH_NODE_NORMAL 107 -// #define SH_NODE_GEOMETRY 108 -#define SH_NODE_MAPPING 109 -#define SH_NODE_CURVE_VEC 110 -#define SH_NODE_CURVE_RGB 111 -#define SH_NODE_CAMERA 114 -#define SH_NODE_MATH 115 -#define SH_NODE_VECTOR_MATH 116 -#define SH_NODE_SQUEEZE 117 -// #define SH_NODE_MATERIAL_EXT 118 -#define SH_NODE_INVERT 119 -#define SH_NODE_SEPRGB_LEGACY 120 -#define SH_NODE_COMBRGB_LEGACY 121 -#define SH_NODE_HUE_SAT 122 - -#define SH_NODE_OUTPUT_MATERIAL 124 -#define SH_NODE_OUTPUT_WORLD 125 -#define SH_NODE_OUTPUT_LIGHT 126 -#define SH_NODE_FRESNEL 127 -#define SH_NODE_MIX_SHADER 128 -#define SH_NODE_ATTRIBUTE 129 -#define SH_NODE_BACKGROUND 130 -#define SH_NODE_BSDF_GLOSSY 131 -#define SH_NODE_BSDF_DIFFUSE 132 -#define SH_NODE_BSDF_GLOSSY_LEGACY 133 -#define SH_NODE_BSDF_GLASS 134 -#define SH_NODE_BSDF_TRANSLUCENT 137 -#define SH_NODE_BSDF_TRANSPARENT 138 -#define SH_NODE_BSDF_SHEEN 139 -#define SH_NODE_EMISSION 140 -#define SH_NODE_NEW_GEOMETRY 141 -#define SH_NODE_LIGHT_PATH 142 -#define SH_NODE_TEX_IMAGE 143 -#define SH_NODE_TEX_SKY 145 -#define SH_NODE_TEX_GRADIENT 146 -#define SH_NODE_TEX_VORONOI 147 -#define SH_NODE_TEX_MAGIC 148 -#define SH_NODE_TEX_WAVE 149 -#define SH_NODE_TEX_NOISE 150 -#define SH_NODE_TEX_MUSGRAVE_DEPRECATED 152 -#define SH_NODE_TEX_COORD 155 -#define SH_NODE_ADD_SHADER 156 -#define SH_NODE_TEX_ENVIRONMENT 157 -// #define SH_NODE_OUTPUT_TEXTURE 158 -#define SH_NODE_HOLDOUT 159 -#define SH_NODE_LAYER_WEIGHT 160 -#define SH_NODE_VOLUME_ABSORPTION 161 -#define SH_NODE_VOLUME_SCATTER 162 -#define SH_NODE_GAMMA 163 -#define SH_NODE_TEX_CHECKER 164 -#define SH_NODE_BRIGHTCONTRAST 165 -#define SH_NODE_LIGHT_FALLOFF 166 -#define SH_NODE_OBJECT_INFO 167 -#define SH_NODE_PARTICLE_INFO 168 -#define SH_NODE_TEX_BRICK 169 -#define SH_NODE_BUMP 170 -#define SH_NODE_SCRIPT 171 -#define SH_NODE_AMBIENT_OCCLUSION 172 -#define SH_NODE_BSDF_REFRACTION 173 -#define SH_NODE_TANGENT 174 -#define SH_NODE_NORMAL_MAP 175 -#define SH_NODE_HAIR_INFO 176 -#define SH_NODE_SUBSURFACE_SCATTERING 177 -#define SH_NODE_WIREFRAME 178 -#define SH_NODE_BSDF_TOON 179 -#define SH_NODE_WAVELENGTH 180 -#define SH_NODE_BLACKBODY 181 -#define SH_NODE_VECT_TRANSFORM 182 -#define SH_NODE_SEPHSV_LEGACY 183 -#define SH_NODE_COMBHSV_LEGACY 184 -#define SH_NODE_BSDF_HAIR 185 -// #define SH_NODE_LAMP 186 -#define SH_NODE_UVMAP 187 -#define SH_NODE_SEPXYZ 188 -#define SH_NODE_COMBXYZ 189 -#define SH_NODE_OUTPUT_LINESTYLE 190 -#define SH_NODE_UVALONGSTROKE 191 -#define SH_NODE_TEX_POINTDENSITY 192 -#define SH_NODE_BSDF_PRINCIPLED 193 -#define SH_NODE_TEX_IES 194 -#define SH_NODE_EEVEE_SPECULAR 195 -#define SH_NODE_BEVEL 197 -#define SH_NODE_DISPLACEMENT 198 -#define SH_NODE_VECTOR_DISPLACEMENT 199 -#define SH_NODE_VOLUME_PRINCIPLED 200 -/* 201..700 occupied by other node types, continue from 701 */ -#define SH_NODE_BSDF_HAIR_PRINCIPLED 701 -#define SH_NODE_MAP_RANGE 702 -#define SH_NODE_CLAMP 703 -#define SH_NODE_TEX_WHITE_NOISE 704 -#define SH_NODE_VOLUME_INFO 705 -#define SH_NODE_VERTEX_COLOR 706 -#define SH_NODE_OUTPUT_AOV 707 -#define SH_NODE_VECTOR_ROTATE 708 -#define SH_NODE_CURVE_FLOAT 709 -#define SH_NODE_POINT_INFO 710 -#define SH_NODE_COMBINE_COLOR 711 -#define SH_NODE_SEPARATE_COLOR 712 -#define SH_NODE_MIX 713 - -/** \} */ - -/* -------------------------------------------------------------------- */ -/** \name Composite Nodes - * \{ */ - -/* output socket defines */ -#define RRES_OUT_IMAGE 0 -#define RRES_OUT_ALPHA 1 - -/* NOTE: types are needed to restore callbacks, don't change values. */ -#define CMP_NODE_VIEWER 201 -#define CMP_NODE_RGB 202 -#define CMP_NODE_VALUE 203 -#define CMP_NODE_MIX_RGB 204 -#define CMP_NODE_VALTORGB 205 -#define CMP_NODE_RGBTOBW 206 -#define CMP_NODE_NORMAL 207 -#define CMP_NODE_CURVE_VEC 208 -#define CMP_NODE_CURVE_RGB 209 -#define CMP_NODE_ALPHAOVER 210 -#define CMP_NODE_BLUR 211 -#define CMP_NODE_FILTER 212 -#define CMP_NODE_MAP_VALUE 213 -#define CMP_NODE_TIME 214 -#define CMP_NODE_VECBLUR 215 -#define CMP_NODE_SEPRGBA_LEGACY 216 -#define CMP_NODE_SEPHSVA_LEGACY 217 -#define CMP_NODE_SETALPHA 218 -#define CMP_NODE_HUE_SAT 219 -#define CMP_NODE_IMAGE 220 -#define CMP_NODE_R_LAYERS 221 -#define CMP_NODE_COMPOSITE 222 -#define CMP_NODE_OUTPUT_FILE 223 -#define CMP_NODE_TEXTURE 224 -#define CMP_NODE_TRANSLATE 225 -#define CMP_NODE_ZCOMBINE 226 -#define CMP_NODE_COMBRGBA_LEGACY 227 -#define CMP_NODE_DILATEERODE 228 -#define CMP_NODE_ROTATE 229 -#define CMP_NODE_SCALE 230 -#define CMP_NODE_SEPYCCA_LEGACY 231 -#define CMP_NODE_COMBYCCA_LEGACY 232 -#define CMP_NODE_SEPYUVA_LEGACY 233 -#define CMP_NODE_COMBYUVA_LEGACY 234 -#define CMP_NODE_DIFF_MATTE 235 -#define CMP_NODE_COLOR_SPILL 236 -#define CMP_NODE_CHROMA_MATTE 237 -#define CMP_NODE_CHANNEL_MATTE 238 -#define CMP_NODE_FLIP 239 -/* Split viewer node is now a regular split node: CMP_NODE_SPLIT. */ -#define CMP_NODE_SPLITVIEWER__DEPRECATED 240 -// #define CMP_NODE_INDEX_MASK 241 -#define CMP_NODE_MAP_UV 242 -#define CMP_NODE_ID_MASK 243 -#define CMP_NODE_DEFOCUS 244 -#define CMP_NODE_DISPLACE 245 -#define CMP_NODE_COMBHSVA_LEGACY 246 -#define CMP_NODE_MATH 247 -#define CMP_NODE_LUMA_MATTE 248 -#define CMP_NODE_BRIGHTCONTRAST 249 -#define CMP_NODE_GAMMA 250 -#define CMP_NODE_INVERT 251 -#define CMP_NODE_NORMALIZE 252 -#define CMP_NODE_CROP 253 -#define CMP_NODE_DBLUR 254 -#define CMP_NODE_BILATERALBLUR 255 -#define CMP_NODE_PREMULKEY 256 -#define CMP_NODE_DIST_MATTE 257 -#define CMP_NODE_VIEW_LEVELS 258 -#define CMP_NODE_COLOR_MATTE 259 -#define CMP_NODE_COLORBALANCE 260 -#define CMP_NODE_HUECORRECT 261 -#define CMP_NODE_MOVIECLIP 262 -#define CMP_NODE_STABILIZE2D 263 -#define CMP_NODE_TRANSFORM 264 -#define CMP_NODE_MOVIEDISTORTION 265 -#define CMP_NODE_DOUBLEEDGEMASK 266 -#define CMP_NODE_OUTPUT_MULTI_FILE__DEPRECATED \ - 267 /* DEPRECATED multi file node has been merged into regular CMP_NODE_OUTPUT_FILE */ -#define CMP_NODE_MASK 268 -#define CMP_NODE_KEYINGSCREEN 269 -#define CMP_NODE_KEYING 270 -#define CMP_NODE_TRACKPOS 271 -#define CMP_NODE_INPAINT 272 -#define CMP_NODE_DESPECKLE 273 -#define CMP_NODE_ANTIALIASING 274 -#define CMP_NODE_KUWAHARA 275 -#define CMP_NODE_SPLIT 276 - -#define CMP_NODE_GLARE 301 -#define CMP_NODE_TONEMAP 302 -#define CMP_NODE_LENSDIST 303 -#define CMP_NODE_SUNBEAMS 304 - -#define CMP_NODE_COLORCORRECTION 312 -#define CMP_NODE_MASK_BOX 313 -#define CMP_NODE_MASK_ELLIPSE 314 -#define CMP_NODE_BOKEHIMAGE 315 -#define CMP_NODE_BOKEHBLUR 316 -#define CMP_NODE_SWITCH 317 -#define CMP_NODE_PIXELATE 318 - -#define CMP_NODE_MAP_RANGE 319 -#define CMP_NODE_PLANETRACKDEFORM 320 -#define CMP_NODE_CORNERPIN 321 -#define CMP_NODE_SWITCH_VIEW 322 -#define CMP_NODE_CRYPTOMATTE_LEGACY 323 -#define CMP_NODE_DENOISE 324 -#define CMP_NODE_EXPOSURE 325 -#define CMP_NODE_CRYPTOMATTE 326 -#define CMP_NODE_POSTERIZE 327 -#define CMP_NODE_CONVERT_COLOR_SPACE 328 -#define CMP_NODE_SCENE_TIME 329 -#define CMP_NODE_SEPARATE_XYZ 330 -#define CMP_NODE_COMBINE_XYZ 331 -#define CMP_NODE_COMBINE_COLOR 332 -#define CMP_NODE_SEPARATE_COLOR 333 - -/* channel toggles */ -#define CMP_CHAN_RGB 1 -#define CMP_CHAN_A 2 - -/* Default SMAA configuration values. */ -#define CMP_DEFAULT_SMAA_THRESHOLD 1.0f -#define CMP_DEFAULT_SMAA_CONTRAST_LIMIT 0.2f -#define CMP_DEFAULT_SMAA_CORNER_ROUNDING 0.25f - -/** \} */ - -/* -------------------------------------------------------------------- */ -/** \name Texture Nodes - * \{ */ - -#define TEX_NODE_OUTPUT 401 -#define TEX_NODE_CHECKER 402 -#define TEX_NODE_TEXTURE 403 -#define TEX_NODE_BRICKS 404 -#define TEX_NODE_MATH 405 -#define TEX_NODE_MIX_RGB 406 -#define TEX_NODE_RGBTOBW 407 -#define TEX_NODE_VALTORGB 408 -#define TEX_NODE_IMAGE 409 -#define TEX_NODE_CURVE_RGB 410 -#define TEX_NODE_INVERT 411 -#define TEX_NODE_HUE_SAT 412 -#define TEX_NODE_CURVE_TIME 413 -#define TEX_NODE_ROTATE 414 -#define TEX_NODE_VIEWER 415 -#define TEX_NODE_TRANSLATE 416 -#define TEX_NODE_COORD 417 -#define TEX_NODE_DISTANCE 418 -#define TEX_NODE_COMPOSE_LEGACY 419 -#define TEX_NODE_DECOMPOSE_LEGACY 420 -#define TEX_NODE_VALTONOR 421 -#define TEX_NODE_SCALE 422 -#define TEX_NODE_AT 423 -#define TEX_NODE_COMBINE_COLOR 424 -#define TEX_NODE_SEPARATE_COLOR 425 - -/* 501-599 reserved. Use like this: TEX_NODE_PROC + TEX_CLOUDS, etc */ -#define TEX_NODE_PROC 500 -#define TEX_NODE_PROC_MAX 600 - -/** \} */ - -/* -------------------------------------------------------------------- */ -/** \name Geometry Nodes - * \{ */ - -#define GEO_NODE_TRIANGULATE 1000 -#define GEO_NODE_TRANSFORM_GEOMETRY 1002 -#define GEO_NODE_MESH_BOOLEAN 1003 -#define GEO_NODE_OBJECT_INFO 1007 -#define GEO_NODE_JOIN_GEOMETRY 1010 -#define GEO_NODE_COLLECTION_INFO 1023 -#define GEO_NODE_IS_VIEWPORT 1024 -#define GEO_NODE_SUBDIVIDE_MESH 1029 -#define GEO_NODE_MESH_PRIMITIVE_CUBE 1032 -#define GEO_NODE_MESH_PRIMITIVE_CIRCLE 1033 -#define GEO_NODE_MESH_PRIMITIVE_UV_SPHERE 1034 -#define GEO_NODE_MESH_PRIMITIVE_CYLINDER 1035 -#define GEO_NODE_MESH_PRIMITIVE_ICO_SPHERE 1036 -#define GEO_NODE_MESH_PRIMITIVE_CONE 1037 -#define GEO_NODE_MESH_PRIMITIVE_LINE 1038 -#define GEO_NODE_MESH_PRIMITIVE_GRID 1039 -#define GEO_NODE_BOUNDING_BOX 1042 -#define GEO_NODE_SWITCH 1043 -#define GEO_NODE_CURVE_TO_MESH 1045 -#define GEO_NODE_RESAMPLE_CURVE 1047 -#define GEO_NODE_INPUT_MATERIAL 1050 -#define GEO_NODE_REPLACE_MATERIAL 1051 -#define GEO_NODE_CURVE_LENGTH 1054 -#define GEO_NODE_CONVEX_HULL 1056 -#define GEO_NODE_SEPARATE_COMPONENTS 1059 -#define GEO_NODE_CURVE_PRIMITIVE_STAR 1062 -#define GEO_NODE_CURVE_PRIMITIVE_SPIRAL 1063 -#define GEO_NODE_CURVE_PRIMITIVE_QUADRATIC_BEZIER 1064 -#define GEO_NODE_CURVE_PRIMITIVE_BEZIER_SEGMENT 1065 -#define GEO_NODE_CURVE_PRIMITIVE_CIRCLE 1066 -#define GEO_NODE_VIEWER 1067 -#define GEO_NODE_CURVE_PRIMITIVE_LINE 1068 -#define GEO_NODE_CURVE_PRIMITIVE_QUADRILATERAL 1070 -#define GEO_NODE_TRIM_CURVE 1071 -#define GEO_NODE_FILL_CURVE 1075 -#define GEO_NODE_INPUT_POSITION 1076 -#define GEO_NODE_SET_POSITION 1077 -#define GEO_NODE_INPUT_INDEX 1078 -#define GEO_NODE_INPUT_NORMAL 1079 -#define GEO_NODE_CAPTURE_ATTRIBUTE 1080 -#define GEO_NODE_MATERIAL_SELECTION 1081 -#define GEO_NODE_SET_MATERIAL 1082 -#define GEO_NODE_REALIZE_INSTANCES 1083 -#define GEO_NODE_ATTRIBUTE_STATISTIC 1084 -#define GEO_NODE_SAMPLE_CURVE 1085 -#define GEO_NODE_INPUT_TANGENT 1086 -#define GEO_NODE_STRING_JOIN 1087 -#define GEO_NODE_CURVE_SPLINE_PARAMETER 1088 -#define GEO_NODE_FILLET_CURVE 1089 -#define GEO_NODE_DISTRIBUTE_POINTS_ON_FACES 1090 -#define GEO_NODE_STRING_TO_CURVES 1091 -#define GEO_NODE_INSTANCE_ON_POINTS 1092 -#define GEO_NODE_MESH_TO_POINTS 1093 -#define GEO_NODE_POINTS_TO_VERTICES 1094 -#define GEO_NODE_REVERSE_CURVE 1095 -#define GEO_NODE_PROXIMITY 1096 -#define GEO_NODE_SUBDIVIDE_CURVE 1097 -#define GEO_NODE_INPUT_SPLINE_LENGTH 1098 -#define GEO_NODE_CURVE_SPLINE_TYPE 1099 -#define GEO_NODE_CURVE_SET_HANDLE_TYPE 1100 -#define GEO_NODE_POINTS_TO_VOLUME 1101 -#define GEO_NODE_CURVE_HANDLE_TYPE_SELECTION 1102 -#define GEO_NODE_DELETE_GEOMETRY 1103 -#define GEO_NODE_SEPARATE_GEOMETRY 1104 -#define GEO_NODE_INPUT_RADIUS 1105 -#define GEO_NODE_INPUT_CURVE_TILT 1106 -#define GEO_NODE_INPUT_CURVE_HANDLES 1107 -#define GEO_NODE_INPUT_FACE_SMOOTH 1108 -#define GEO_NODE_INPUT_SPLINE_RESOLUTION 1109 -#define GEO_NODE_INPUT_SPLINE_CYCLIC 1110 -#define GEO_NODE_SET_CURVE_RADIUS 1111 -#define GEO_NODE_SET_CURVE_TILT 1112 -#define GEO_NODE_SET_CURVE_HANDLES 1113 -#define GEO_NODE_SET_SHADE_SMOOTH 1114 -#define GEO_NODE_SET_SPLINE_RESOLUTION 1115 -#define GEO_NODE_SET_SPLINE_CYCLIC 1116 -#define GEO_NODE_SET_POINT_RADIUS 1117 -#define GEO_NODE_INPUT_MATERIAL_INDEX 1118 -#define GEO_NODE_SET_MATERIAL_INDEX 1119 -#define GEO_NODE_TRANSLATE_INSTANCES 1120 -#define GEO_NODE_SCALE_INSTANCES 1121 -#define GEO_NODE_ROTATE_INSTANCES 1122 -#define GEO_NODE_SPLIT_EDGES 1123 -#define GEO_NODE_MESH_TO_CURVE 1124 -#define GEO_NODE_TRANSFER_ATTRIBUTE_DEPRECATED 1125 -#define GEO_NODE_SUBDIVISION_SURFACE 1126 -#define GEO_NODE_CURVE_ENDPOINT_SELECTION 1127 -#define GEO_NODE_RAYCAST 1128 -#define GEO_NODE_CURVE_TO_POINTS 1130 -#define GEO_NODE_INSTANCES_TO_POINTS 1131 -#define GEO_NODE_IMAGE_TEXTURE 1132 -#define GEO_NODE_VOLUME_TO_MESH 1133 -#define GEO_NODE_INPUT_ID 1134 -#define GEO_NODE_SET_ID 1135 -#define GEO_NODE_ATTRIBUTE_DOMAIN_SIZE 1136 -#define GEO_NODE_DUAL_MESH 1137 -#define GEO_NODE_INPUT_MESH_EDGE_VERTICES 1138 -#define GEO_NODE_INPUT_MESH_FACE_AREA 1139 -#define GEO_NODE_INPUT_MESH_FACE_NEIGHBORS 1140 -#define GEO_NODE_INPUT_MESH_VERTEX_NEIGHBORS 1141 -#define GEO_NODE_GEOMETRY_TO_INSTANCE 1142 -#define GEO_NODE_INPUT_MESH_EDGE_NEIGHBORS 1143 -#define GEO_NODE_INPUT_MESH_ISLAND 1144 -#define GEO_NODE_INPUT_SCENE_TIME 1145 -#define GEO_NODE_ACCUMULATE_FIELD 1146 -#define GEO_NODE_INPUT_MESH_EDGE_ANGLE 1147 -#define GEO_NODE_EVALUATE_AT_INDEX 1148 -#define GEO_NODE_CURVE_PRIMITIVE_ARC 1149 -#define GEO_NODE_FLIP_FACES 1150 -#define GEO_NODE_SCALE_ELEMENTS 1151 -#define GEO_NODE_EXTRUDE_MESH 1152 -#define GEO_NODE_MERGE_BY_DISTANCE 1153 -#define GEO_NODE_DUPLICATE_ELEMENTS 1154 -#define GEO_NODE_INPUT_MESH_FACE_IS_PLANAR 1155 -#define GEO_NODE_STORE_NAMED_ATTRIBUTE 1156 -#define GEO_NODE_INPUT_NAMED_ATTRIBUTE 1157 -#define GEO_NODE_REMOVE_ATTRIBUTE 1158 -#define GEO_NODE_INPUT_INSTANCE_ROTATION 1159 -#define GEO_NODE_INPUT_INSTANCE_SCALE 1160 -#define GEO_NODE_VOLUME_CUBE 1161 -#define GEO_NODE_POINTS 1162 -#define GEO_NODE_EVALUATE_ON_DOMAIN 1163 -#define GEO_NODE_MESH_TO_VOLUME 1164 -#define GEO_NODE_UV_UNWRAP 1165 -#define GEO_NODE_UV_PACK_ISLANDS 1166 -#define GEO_NODE_DEFORM_CURVES_ON_SURFACE 1167 -#define GEO_NODE_INPUT_SHORTEST_EDGE_PATHS 1168 -#define GEO_NODE_EDGE_PATHS_TO_CURVES 1169 -#define GEO_NODE_EDGE_PATHS_TO_SELECTION 1170 -#define GEO_NODE_MESH_FACE_GROUP_BOUNDARIES 1171 -#define GEO_NODE_DISTRIBUTE_POINTS_IN_VOLUME 1172 -#define GEO_NODE_SELF_OBJECT 1173 -#define GEO_NODE_SAMPLE_INDEX 1174 -#define GEO_NODE_SAMPLE_NEAREST 1175 -#define GEO_NODE_SAMPLE_NEAREST_SURFACE 1176 -#define GEO_NODE_OFFSET_POINT_IN_CURVE 1177 -#define GEO_NODE_CURVE_TOPOLOGY_CURVE_OF_POINT 1178 -#define GEO_NODE_CURVE_TOPOLOGY_POINTS_OF_CURVE 1179 -#define GEO_NODE_MESH_TOPOLOGY_OFFSET_CORNER_IN_FACE 1180 -#define GEO_NODE_MESH_TOPOLOGY_CORNERS_OF_FACE 1181 -#define GEO_NODE_MESH_TOPOLOGY_CORNERS_OF_VERTEX 1182 -#define GEO_NODE_MESH_TOPOLOGY_EDGES_OF_CORNER 1183 -#define GEO_NODE_MESH_TOPOLOGY_EDGES_OF_VERTEX 1184 -#define GEO_NODE_MESH_TOPOLOGY_FACE_OF_CORNER 1185 -#define GEO_NODE_MESH_TOPOLOGY_VERTEX_OF_CORNER 1186 -#define GEO_NODE_SAMPLE_UV_SURFACE 1187 -#define GEO_NODE_SET_CURVE_NORMAL 1188 -#define GEO_NODE_IMAGE_INFO 1189 -#define GEO_NODE_BLUR_ATTRIBUTE 1190 -#define GEO_NODE_IMAGE 1191 -#define GEO_NODE_INTERPOLATE_CURVES 1192 -#define GEO_NODE_EDGES_TO_FACE_GROUPS 1193 -// #define GEO_NODE_POINTS_TO_SDF_VOLUME 1194 -// #define GEO_NODE_MESH_TO_SDF_VOLUME 1195 -// #define GEO_NODE_SDF_VOLUME_SPHERE 1196 -// #define GEO_NODE_MEAN_FILTER_SDF_VOLUME 1197 -// #define GEO_NODE_OFFSET_SDF_VOLUME 1198 -#define GEO_NODE_INDEX_OF_NEAREST 1199 -/* Function nodes use the range starting at 1200. */ -#define GEO_NODE_SIMULATION_INPUT 2100 -#define GEO_NODE_SIMULATION_OUTPUT 2101 -// #define GEO_NODE_INPUT_SIGNED_DISTANCE 2102 -// #define GEO_NODE_SAMPLE_VOLUME 2103 -#define GEO_NODE_MESH_TOPOLOGY_CORNERS_OF_EDGE 2104 -/* Leaving out two indices to avoid crashes with files that were created during the development of - * the repeat zone. */ -#define GEO_NODE_REPEAT_INPUT 2107 -#define GEO_NODE_REPEAT_OUTPUT 2108 -#define GEO_NODE_TOOL_SELECTION 2109 -#define GEO_NODE_TOOL_SET_SELECTION 2110 -#define GEO_NODE_TOOL_3D_CURSOR 2111 -#define GEO_NODE_TOOL_FACE_SET 2112 -#define GEO_NODE_TOOL_SET_FACE_SET 2113 -#define GEO_NODE_POINTS_TO_CURVES 2114 -#define GEO_NODE_INPUT_EDGE_SMOOTH 2115 -#define GEO_NODE_SPLIT_TO_INSTANCES 2116 -#define GEO_NODE_INPUT_NAMED_LAYER_SELECTION 2117 -#define GEO_NODE_INDEX_SWITCH 2118 -#define GEO_NODE_INPUT_ACTIVE_CAMERA 2119 -#define GEO_NODE_BAKE 2120 -#define GEO_NODE_GET_NAMED_GRID 2121 -#define GEO_NODE_STORE_NAMED_GRID 2122 -#define GEO_NODE_SORT_ELEMENTS 2123 -#define GEO_NODE_MENU_SWITCH 2124 -#define GEO_NODE_SAMPLE_GRID 2125 -#define GEO_NODE_MESH_TO_DENSITY_GRID 2126 -#define GEO_NODE_MESH_TO_SDF_GRID 2127 -#define GEO_NODE_POINTS_TO_SDF_GRID 2128 -#define GEO_NODE_GRID_TO_MESH 2129 -#define GEO_NODE_DISTRIBUTE_POINTS_IN_GRID 2130 - -/** \} */ - -/* -------------------------------------------------------------------- */ -/** \name Function Nodes - * \{ */ - -#define FN_NODE_BOOLEAN_MATH 1200 -#define FN_NODE_COMPARE 1202 -#define FN_NODE_LEGACY_RANDOM_FLOAT 1206 -#define FN_NODE_INPUT_VECTOR 1207 -#define FN_NODE_INPUT_STRING 1208 -#define FN_NODE_FLOAT_TO_INT 1209 -#define FN_NODE_VALUE_TO_STRING 1210 -#define FN_NODE_STRING_LENGTH 1211 -#define FN_NODE_SLICE_STRING 1212 -#define FN_NODE_INPUT_SPECIAL_CHARACTERS 1213 -#define FN_NODE_RANDOM_VALUE 1214 -#define FN_NODE_ROTATE_EULER 1215 -#define FN_NODE_ALIGN_EULER_TO_VECTOR 1216 -#define FN_NODE_INPUT_COLOR 1217 -#define FN_NODE_REPLACE_STRING 1218 -#define FN_NODE_INPUT_BOOL 1219 -#define FN_NODE_INPUT_INT 1220 -#define FN_NODE_SEPARATE_COLOR 1221 -#define FN_NODE_COMBINE_COLOR 1222 -#define FN_NODE_AXIS_ANGLE_TO_ROTATION 1223 -#define FN_NODE_EULER_TO_ROTATION 1224 -#define FN_NODE_QUATERNION_TO_ROTATION 1225 -#define FN_NODE_ROTATION_TO_AXIS_ANGLE 1226 -#define FN_NODE_ROTATION_TO_EULER 1227 -#define FN_NODE_ROTATION_TO_QUATERNION 1228 -#define FN_NODE_ROTATE_VECTOR 1229 -#define FN_NODE_ROTATE_ROTATION 1230 -#define FN_NODE_INVERT_ROTATION 1231 -#define FN_NODE_TRANSFORM_POINT 1232 -#define FN_NODE_TRANSFORM_DIRECTION 1233 -#define FN_NODE_MATRIX_MULTIPLY 1234 -#define FN_NODE_COMBINE_TRANSFORM 1235 -#define FN_NODE_SEPARATE_TRANSFORM 1236 -#define FN_NODE_INVERT_MATRIX 1237 -#define FN_NODE_TRANSPOSE_MATRIX 1238 - -/** \} */ - -void BKE_node_system_init(); -void BKE_node_system_exit(); - namespace blender::bke { bNodeTree *ntreeAddTreeEmbedded(Main *bmain, ID *owner_id, const char *name, const char *idname); @@ -1519,9 +163,6 @@ void nodeChainIter(const bNodeTree *ntree, * Can be called recursively (using another nodeChainIterBackwards) by * setting the recursion_lvl accordingly. * - * WARN: No node is guaranteed to be iterated as a to_node, - * since it could have been iterated earlier as a from_node. - * * \note Needs updated socket links (ntreeUpdateTree). * \note Recursive */ diff --git a/source/blender/blenkernel/BKE_node_runtime.hh b/source/blender/blenkernel/BKE_node_runtime.hh index b1b50f9f718..93f3a346249 100644 --- a/source/blender/blenkernel/BKE_node_runtime.hh +++ b/source/blender/blenkernel/BKE_node_runtime.hh @@ -30,6 +30,7 @@ struct FieldInferencingInterface; class NodeDeclaration; struct GeometryNodesLazyFunctionGraphInfo; namespace anonymous_attribute_lifetime { +struct RelationsInNode; } namespace aal = anonymous_attribute_lifetime; } // namespace blender::nodes @@ -74,12 +75,6 @@ namespace blender::bke { using NodeIDVectorSet = VectorSet; -/** - * Runtime data for #bNodeTree from the perspective of execution instructions (rather than runtime - * data from evaluation of the node tree). Evaluation data is not the responsibility of the node - * tree and should be stored elsewhere. Evaluating a node tree should be possible without changing - * it. - */ class bNodeTreeRuntime : NonCopyable, NonMovable { public: /** @@ -114,12 +109,18 @@ class bNodeTreeRuntime : NonCopyable, NonMovable { NodeIDVectorSet nodes_by_id; /** - * Legacy execution data. + * Execution data. * - * \todo Move this out of the node tree to improve semantic/physical separation between the node - * tree execution instructions and its evaluation. + * XXX It would be preferable to completely move this data out of the underlying node tree, + * so node tree execution could finally run independent of the tree itself. + * This would allow node trees to be merely linked by other data (materials, textures, etc.), + * as ID data is supposed to. + * Execution data is generated from the tree once at execution start and can then be used + * as long as necessary, even while the tree is being modified. */ bNodeTreeExec *execdata = nullptr; + + /* Callbacks. */ void (*progress)(void *, float progress) = nullptr; /** \warning may be called by different threads */ void (*stats_draw)(void *, const char *str) = nullptr; @@ -127,8 +128,6 @@ class bNodeTreeRuntime : NonCopyable, NonMovable { void (*update_draw)(void *) = nullptr; void *tbh = nullptr, *prh = nullptr, *sdh = nullptr, *udh = nullptr; - /* End legacy execution data. */ - /** Information about how inputs and outputs of the node group interact with fields. */ std::unique_ptr field_inferencing_interface; /** Information about usage of anonymous attributes within the group. */ diff --git a/source/blender/blenkernel/BKE_node_tree_interface.hh b/source/blender/blenkernel/BKE_node_tree_interface.hh index 9d88f208985..c699df7f31a 100644 --- a/source/blender/blenkernel/BKE_node_tree_interface.hh +++ b/source/blender/blenkernel/BKE_node_tree_interface.hh @@ -7,7 +7,7 @@ #include "DNA_node_tree_interface_types.h" #include "DNA_node_types.h" -#include "BKE_node.hh" +#include "BKE_node.h" #include #include @@ -130,7 +130,6 @@ static const bNodeSocketStaticTypeInfo node_socket_subtypes[] = { {"NodeSocketIntFactor", "NodeTreeInterfaceSocketIntFactor", SOCK_INT, PROP_FACTOR}, {"NodeSocketBool", "NodeTreeInterfaceSocketBool", SOCK_BOOLEAN, PROP_NONE}, {"NodeSocketRotation", "NodeTreeInterfaceSocketRotation", SOCK_ROTATION, PROP_NONE}, - {"NodeSocketMatrix", "NodeTreeInterfaceSocketMatrix", SOCK_MATRIX, PROP_NONE}, {"NodeSocketVector", "NodeTreeInterfaceSocketVector", SOCK_VECTOR, PROP_NONE}, {"NodeSocketVectorTranslation", "NodeTreeInterfaceSocketVectorTranslation", @@ -207,7 +206,6 @@ template bool socket_data_to_static_type(const eNodeSocketDatatype case SOCK_CUSTOM: case SOCK_SHADER: - case SOCK_MATRIX: case SOCK_GEOMETRY: return true; } diff --git a/source/blender/blenkernel/BKE_object.hh b/source/blender/blenkernel/BKE_object.hh index e893823faef..3c2e219030b 100644 --- a/source/blender/blenkernel/BKE_object.hh +++ b/source/blender/blenkernel/BKE_object.hh @@ -13,7 +13,6 @@ #include "BLI_bounds_types.hh" #include "BLI_compiler_attrs.h" -#include "BLI_math_matrix_types.hh" #include "BLI_math_vector_types.hh" #include "BLI_sys_types.h" #include "BLI_vector.hh" @@ -55,10 +54,8 @@ void BKE_object_workob_clear(Object *workob); * Otherwise, after changing ob->parent you need to call: * - #DEG_relations_tag_update(bmain); * - #BKE_scene_graph_update_tagged(depsgraph, bmain); - * - * \return calculated object_to_world. */ -blender::float4x4 BKE_object_calc_parent(Depsgraph *depsgraph, Scene *scene, Object *ob); +void BKE_object_workob_calc_parent(Depsgraph *depsgraph, Scene *scene, Object *ob, Object *workob); void BKE_object_transform_copy(Object *ob_tar, const Object *ob_src); void BKE_object_copy_softbody(Object *ob_dst, const Object *ob_src, int flag); @@ -322,7 +319,7 @@ blender::Vector BKE_object_pose_base_array_get(const Scene *scene, void BKE_object_get_parent_matrix(Object *ob, Object *par, float r_parentmat[4][4]); /** - * Compute object world transform and store it in `ob->object_to_world().ptr()`. + * Compute object world transform and store it in `ob->object_to_world`. */ void BKE_object_where_is_calc(Depsgraph *depsgraph, Scene *scene, Object *ob); void BKE_object_where_is_calc_ex( @@ -336,7 +333,7 @@ void BKE_object_where_is_calc_time(Depsgraph *depsgraph, Scene *scene, Object *o */ void BKE_object_where_is_calc_mat4(Object *ob, float r_obmat[4][4]); -/* Possibly belong in its own module? */ +/* Possibly belong in own module? */ void BKE_boundbox_init_from_minmax(BoundBox *bb, const float min[3], const float max[3]); void BKE_boundbox_minmax(const BoundBox *bb, diff --git a/source/blender/blenkernel/BKE_object_types.hh b/source/blender/blenkernel/BKE_object_types.hh index 63d07c92efd..fcfbedb4284 100644 --- a/source/blender/blenkernel/BKE_object_types.hh +++ b/source/blender/blenkernel/BKE_object_types.hh @@ -13,6 +13,7 @@ #include "DNA_customdata_types.h" /* #CustomData_MeshMasks. */ +struct BoundBox; struct bGPdata; struct Curve; struct CurveCache; @@ -25,10 +26,6 @@ namespace blender::bke { struct GeometrySet; struct ObjectRuntime { - /** Final transformation matrices with constraints & animsys applied. */ - float4x4 object_to_world = float4x4::identity(); - float4x4 world_to_object = float4x4::identity(); - /** * The custom data layer mask that was last used * to calculate data_eval and mesh_deform_eval. @@ -67,7 +64,7 @@ struct ObjectRuntime { /** * Original data pointer, before object->data was changed to point * to data_eval. - * Is assigned by dependency graph's copy-on-evaluation. + * Is assigned by dependency graph's copy-on-write evaluation. */ ID *data_orig = nullptr; /** @@ -103,7 +100,7 @@ struct ObjectRuntime { /** * Original grease pencil bGPdata pointer, before object->data was changed to point * to gpd_eval. - * Is assigned by dependency graph's copy-on-evaluation. + * Is assigned by dependency graph's copy-on-write evaluation. */ bGPdata *gpd_orig = nullptr; /** diff --git a/source/blender/blenkernel/BKE_paint.hh b/source/blender/blenkernel/BKE_paint.hh index 4d6963e34b6..2ace151a537 100644 --- a/source/blender/blenkernel/BKE_paint.hh +++ b/source/blender/blenkernel/BKE_paint.hh @@ -26,6 +26,7 @@ struct BMFace; struct BMLog; struct BMesh; struct BlendDataReader; +struct BlendLibReader; struct BlendWriter; struct Brush; struct CustomDataLayer; @@ -52,6 +53,7 @@ struct Image; struct ImagePool; struct ImageUser; struct KeyBlock; +struct ListBase; struct Main; struct Mesh; struct MDeformVert; diff --git a/source/blender/blenkernel/BKE_pbvh_api.hh b/source/blender/blenkernel/BKE_pbvh_api.hh index bf0a9fb4abc..949e7d056aa 100644 --- a/source/blender/blenkernel/BKE_pbvh_api.hh +++ b/source/blender/blenkernel/BKE_pbvh_api.hh @@ -301,7 +301,7 @@ blender::Span BKE_pbvh_node_get_grid_indices(const PBVHNode &node); int BKE_pbvh_node_num_unique_verts(const PBVH &pbvh, const PBVHNode &node); blender::Span BKE_pbvh_node_get_vert_indices(const PBVHNode *node); blender::Span BKE_pbvh_node_get_unique_vert_indices(const PBVHNode *node); -blender::Span BKE_pbvh_node_get_corner_indices(const PBVHNode *node); +blender::Span BKE_pbvh_node_get_loops(const PBVHNode *node); namespace blender::bke::pbvh { @@ -319,6 +319,8 @@ Span node_face_indices_calc_grids(const PBVH &pbvh, const PBVHNode &node, V } // namespace blender::bke::pbvh +blender::Vector BKE_pbvh_node_calc_face_indices(const PBVH &pbvh, const PBVHNode &node); + blender::Bounds BKE_pbvh_node_get_BB(const PBVHNode *node); blender::Bounds BKE_pbvh_node_get_original_BB(const PBVHNode *node); diff --git a/source/blender/blenkernel/BKE_preferences.h b/source/blender/blenkernel/BKE_preferences.h index 4f788637845..fec295c8d13 100644 --- a/source/blender/blenkernel/BKE_preferences.h +++ b/source/blender/blenkernel/BKE_preferences.h @@ -13,7 +13,6 @@ extern "C" { #endif #include "BLI_compiler_attrs.h" -#include "BLI_sys_types.h" struct UserDef; struct bUserExtensionRepo; @@ -85,8 +84,6 @@ bUserExtensionRepo *BKE_preferences_extension_repo_add(UserDef *userdef, const char *module, const char *custom_dirpath); void BKE_preferences_extension_repo_remove(UserDef *userdef, bUserExtensionRepo *repo); -bUserExtensionRepo *BKE_preferences_extension_repo_add_default(UserDef *userdef); -bUserExtensionRepo *BKE_preferences_extension_repo_add_default_user(UserDef *userdef); void BKE_preferences_extension_repo_name_set(UserDef *userdef, bUserExtensionRepo *repo, @@ -96,27 +93,13 @@ void BKE_preferences_extension_repo_module_set(UserDef *userdef, const char *module); void BKE_preferences_extension_repo_custom_dirpath_set(bUserExtensionRepo *repo, const char *path); -size_t BKE_preferences_extension_repo_dirpath_get(const bUserExtensionRepo *repo, - char *dirpath, - int dirpath_maxncpy); +void BKE_preferences_extension_repo_dirpath_get(const bUserExtensionRepo *repo, + char *dirpath, + int dirpath_maxncpy); bUserExtensionRepo *BKE_preferences_extension_repo_find_index(const UserDef *userdef, int index); bUserExtensionRepo *BKE_preferences_extension_repo_find_by_module(const UserDef *userdef, const char *module); -/** - * Using a full URL/remote path to find a repository that shares its prefix. - */ -bUserExtensionRepo *BKE_preferences_extension_repo_find_by_remote_path_prefix( - const UserDef *userdef, const char *remote_path_full, const bool only_enabled); -/** - * Skip the `https` or `http` part of a URL `https://`, return zero if none is found. - */ -int BKE_preferences_extension_repo_remote_scheme_end(const char *url); -/** - * Set a name based on a URL, e.g. `https://www.example.com/path` -> `www.example.com`. - */ -void BKE_preferences_extension_remote_to_name(const char *remote_path, char name[64]); - int BKE_preferences_extension_repo_get_index(const UserDef *userdef, const bUserExtensionRepo *repo); diff --git a/source/blender/blenkernel/BKE_report.hh b/source/blender/blenkernel/BKE_report.h similarity index 97% rename from source/blender/blenkernel/BKE_report.hh rename to source/blender/blenkernel/BKE_report.h index 60dd71f053c..8ec9360bab5 100644 --- a/source/blender/blenkernel/BKE_report.hh +++ b/source/blender/blenkernel/BKE_report.h @@ -14,6 +14,10 @@ #include "BLI_utildefines.h" #include "DNA_windowmanager_types.h" +#ifdef __cplusplus +extern "C" { +#endif + /** * Reporting Information and Errors. * @@ -87,3 +91,7 @@ const char *BKE_report_type_str(eReportType type); bool BKE_report_write_file_fp(FILE *fp, ReportList *reports, const char *header); bool BKE_report_write_file(const char *filepath, ReportList *reports, const char *header); + +#ifdef __cplusplus +} +#endif diff --git a/source/blender/blenkernel/BKE_scene.h b/source/blender/blenkernel/BKE_scene.h new file mode 100644 index 00000000000..f644b06f1ad --- /dev/null +++ b/source/blender/blenkernel/BKE_scene.h @@ -0,0 +1,363 @@ +/* SPDX-FileCopyrightText: 2001-2002 NaN Holding BV. All rights reserved. + * + * SPDX-License-Identifier: GPL-2.0-or-later */ +#pragma once + +/** \file + * \ingroup bke + */ + +#include "BLI_sys_types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +struct AviCodecData; +struct Collection; +struct Depsgraph; +struct GHash; +struct Main; +struct Object; +struct RenderData; +struct Scene; +struct TransformOrientation; +struct UnitSettings; +struct View3DCursor; +struct ViewLayer; + +typedef enum eSceneCopyMethod { + SCE_COPY_NEW = 0, + SCE_COPY_EMPTY = 1, + SCE_COPY_LINK_COLLECTION = 2, + SCE_COPY_FULL = 3, +} eSceneCopyMethod; + +/** Use as the contents of a 'for' loop: `for (SETLOOPER(...)) { ... }`. */ +#define SETLOOPER(_sce_basis, _sce_iter, _base) \ + _sce_iter = _sce_basis, \ + _base = _setlooper_base_step( \ + &_sce_iter, BKE_view_layer_context_active_PLACEHOLDER(_sce_basis), NULL); \ + _base; \ + _base = _setlooper_base_step(&_sce_iter, NULL, _base) + +#define SETLOOPER_VIEW_LAYER(_sce_basis, _view_layer, _sce_iter, _base) \ + _sce_iter = _sce_basis, _base = _setlooper_base_step(&_sce_iter, _view_layer, NULL); \ + _base; \ + _base = _setlooper_base_step(&_sce_iter, NULL, _base) + +#define SETLOOPER_SET_ONLY(_sce_basis, _sce_iter, _base) \ + _sce_iter = _sce_basis, _base = _setlooper_base_step(&_sce_iter, NULL, NULL); \ + _base; \ + _base = _setlooper_base_step(&_sce_iter, NULL, _base) + +/** + * Helper function for the #SETLOOPER and #SETLOOPER_VIEW_LAYER macros + * + * It iterates over the bases of the active layer and then the bases + * of the active layer of the background (set) scenes recursively. + */ +struct Base *_setlooper_base_step(struct Scene **sce_iter, + struct ViewLayer *view_layer, + struct Base *base); + +void free_avicodecdata(struct AviCodecData *acd); + +struct Scene *BKE_scene_add(struct Main *bmain, const char *name); + +void BKE_scene_remove_rigidbody_object(struct Main *bmain, + struct Scene *scene, + struct Object *ob, + bool free_us); + +/** + * Check if there is any instance of the object in the scene. + */ +bool BKE_scene_object_find(struct Scene *scene, struct Object *ob); +struct Object *BKE_scene_object_find_by_name(const struct Scene *scene, const char *name); + +/* Scene base iteration function. + * Define struct here, so no need to bother with alloc/free it. + */ +typedef struct SceneBaseIter { + struct ListBase *duplilist; + struct DupliObject *dupob; + float omat[4][4]; + struct Object *dupli_refob; + int phase; +} SceneBaseIter; + +/** + * Used by meta-balls, return *all* objects (including duplis) + * existing in the scene (including scene's sets). + */ +int BKE_scene_base_iter_next(struct Depsgraph *depsgraph, + struct SceneBaseIter *iter, + struct Scene **scene, + int val, + struct Base **base, + struct Object **ob); + +void BKE_scene_base_flag_to_objects(const struct Scene *scene, struct ViewLayer *view_layer); +/** + * Synchronize object base flags + * + * This is usually handled by the depsgraph. + * However, in rare occasions we need to use the latest object flags + * before depsgraph is fully updated. + * + * It should (ideally) only run for copy-on-written objects since this is + * runtime data generated per-view-layer. + */ +void BKE_scene_object_base_flag_sync_from_base(struct Base *base); + +/** + * Sets the active scene, mainly used when running in background mode + * (`--scene` command line argument). + * This is also called to set the scene directly, bypassing windowing code. + * Otherwise #WM_window_set_active_scene is used when changing scenes by the user. + */ +void BKE_scene_set_background(struct Main *bmain, struct Scene *sce); +/** + * Called from `creator_args.c`. + */ +struct Scene *BKE_scene_set_name(struct Main *bmain, const char *name); + +/** + * \param flag: copying options (see BKE_lib_id.hh's `LIB_ID_COPY_...` flags for more). + */ +struct ToolSettings *BKE_toolsettings_copy(struct ToolSettings *toolsettings, int flag); +void BKE_toolsettings_free(struct ToolSettings *toolsettings); + +struct Scene *BKE_scene_duplicate(struct Main *bmain, struct Scene *sce, eSceneCopyMethod type); +void BKE_scene_groups_relink(struct Scene *sce); + +bool BKE_scene_can_be_removed(const struct Main *bmain, const struct Scene *scene); + +bool BKE_scene_has_view_layer(const struct Scene *scene, const struct ViewLayer *layer); +struct Scene *BKE_scene_find_from_collection(const struct Main *bmain, + const struct Collection *collection); + +#ifdef DURIAN_CAMERA_SWITCH +struct Object *BKE_scene_camera_switch_find(struct Scene *scene); /* DURIAN_CAMERA_SWITCH */ +#endif +bool BKE_scene_camera_switch_update(struct Scene *scene); + +const char *BKE_scene_find_marker_name(const struct Scene *scene, int frame); +/** + * Return the current marker for this frame, + * we can have more than 1 marker per frame, this just returns the first (unfortunately). + */ +const char *BKE_scene_find_last_marker_name(const struct Scene *scene, int frame); + +int BKE_scene_frame_snap_by_seconds(struct Scene *scene, double interval_in_seconds, int frame); + +/** + * Checks for cycle, returns true if it's all OK. + */ +bool BKE_scene_validate_setscene(struct Main *bmain, struct Scene *sce); + +/** + * Return fractional frame number taking into account sub-frames and time + * remapping. This the time value used by animation, modifiers and physics + * evaluation. */ +float BKE_scene_ctime_get(const struct Scene *scene); +/** + * Convert integer frame number to fractional frame number taking into account + * sub-frames and time remapping. + */ +float BKE_scene_frame_to_ctime(const struct Scene *scene, int frame); + +/** + * Get current fractional frame based on frame and sub-frame. + */ +float BKE_scene_frame_get(const struct Scene *scene); +/** + * Set current frame and sub-frame based on a fractional frame. + */ +void BKE_scene_frame_set(struct Scene *scene, float frame); + +struct TransformOrientationSlot *BKE_scene_orientation_slot_get_from_flag(struct Scene *scene, + int flag); +struct TransformOrientationSlot *BKE_scene_orientation_slot_get(struct Scene *scene, + int slot_index); +/** + * Activate a transform orientation in a 3D view based on an enum value. + * + * \param orientation: If this is #V3D_ORIENT_CUSTOM or greater, the custom transform orientation + * with index \a orientation - #V3D_ORIENT_CUSTOM gets activated. + */ +void BKE_scene_orientation_slot_set_index(struct TransformOrientationSlot *orient_slot, + int orientation); +int BKE_scene_orientation_slot_get_index(const struct TransformOrientationSlot *orient_slot); +int BKE_scene_orientation_get_index(struct Scene *scene, int slot_index); +int BKE_scene_orientation_get_index_from_flag(struct Scene *scene, int flag); + +/* ** Scene evaluation ** */ + +void BKE_scene_update_sound(struct Depsgraph *depsgraph, struct Main *bmain); +void BKE_scene_update_tag_audio_volume(struct Depsgraph *, struct Scene *scene); + +void BKE_scene_graph_update_tagged(struct Depsgraph *depsgraph, struct Main *bmain); +void BKE_scene_graph_evaluated_ensure(struct Depsgraph *depsgraph, struct Main *bmain); + +void BKE_scene_graph_update_for_newframe(struct Depsgraph *depsgraph); +/** + * Applies changes right away, does all sets too. + */ +void BKE_scene_graph_update_for_newframe_ex(struct Depsgraph *depsgraph, bool clear_recalc); + +/** + * Ensures given scene/view_layer pair has a valid, up-to-date depsgraph. + * + * \warning Sets matching depsgraph as active, + * so should only be called from the active editing context (usually, from operators). + */ +void BKE_scene_view_layer_graph_evaluated_ensure(struct Main *bmain, + struct Scene *scene, + struct ViewLayer *view_layer); + +/** + * Return default view. + */ +struct SceneRenderView *BKE_scene_add_render_view(struct Scene *sce, const char *name); +bool BKE_scene_remove_render_view(struct Scene *scene, struct SceneRenderView *srv); + +/* Render profile. */ + +int get_render_subsurf_level(const struct RenderData *r, int lvl, bool for_render); +int get_render_child_particle_number(const struct RenderData *r, int child_num, bool for_render); + +bool BKE_scene_use_shading_nodes_custom(struct Scene *scene); +bool BKE_scene_use_spherical_stereo(struct Scene *scene); + +bool BKE_scene_uses_blender_eevee(const struct Scene *scene); +bool BKE_scene_uses_blender_workbench(const struct Scene *scene); +bool BKE_scene_uses_cycles(const struct Scene *scene); + +bool BKE_scene_uses_shader_previews(const struct Scene *scene); + +/** + * Return whether the Cycles experimental feature is enabled. It is invalid to call without first + * ensuring that Cycles is the active render engine (e.g. with #BKE_scene_uses_cycles). + * + * \note We cannot use `const` as RNA_id_pointer_create is not using a const ID. + */ +bool BKE_scene_uses_cycles_experimental_features(struct Scene *scene); + +void BKE_scene_copy_data_eevee(struct Scene *sce_dst, const struct Scene *sce_src); + +void BKE_scene_disable_color_management(struct Scene *scene); +bool BKE_scene_check_rigidbody_active(const struct Scene *scene); + +int BKE_scene_num_threads(const struct Scene *scene); +int BKE_render_num_threads(const struct RenderData *r); + +void BKE_render_resolution(const struct RenderData *r, + const bool use_crop, + int *r_width, + int *r_height); +int BKE_render_preview_pixel_size(const struct RenderData *r); + +/**********************************/ + +/** + * Apply the needed correction factor to value, based on unit_type + * (only length-related are affected currently) and `unit->scale_length`. + */ +double BKE_scene_unit_scale(const struct UnitSettings *unit, int unit_type, double value); + +/* Multi-view. */ + +bool BKE_scene_multiview_is_stereo3d(const struct RenderData *rd); +/** + * Return whether to render this #SceneRenderView. + */ +bool BKE_scene_multiview_is_render_view_active(const struct RenderData *rd, + const struct SceneRenderView *srv); +/** + * \return true if `viewname` is the first or if the name is NULL or not found. + */ +bool BKE_scene_multiview_is_render_view_first(const struct RenderData *rd, const char *viewname); +/** + * \return true if `viewname` is the last or if the name is NULL or not found. + */ +bool BKE_scene_multiview_is_render_view_last(const struct RenderData *rd, const char *viewname); +int BKE_scene_multiview_num_views_get(const struct RenderData *rd); +struct SceneRenderView *BKE_scene_multiview_render_view_findindex(const struct RenderData *rd, + int view_id); +const char *BKE_scene_multiview_render_view_name_get(const struct RenderData *rd, int view_id); +int BKE_scene_multiview_view_id_get(const struct RenderData *rd, const char *viewname); +void BKE_scene_multiview_filepath_get(const struct SceneRenderView *srv, + const char *filepath, + char *r_filepath); +/** + * When multi-view is not used the `filepath` is as usual (e.g., `Image.jpg`). + * When multi-view is on, even if only one view is enabled the view is incorporated + * into the file name (e.g., `Image_L.jpg`). That allows for the user to re-render + * individual views. + */ +void BKE_scene_multiview_view_filepath_get(const struct RenderData *rd, + const char *filepath, + const char *view, + char *r_filepath); +const char *BKE_scene_multiview_view_suffix_get(const struct RenderData *rd, const char *viewname); +const char *BKE_scene_multiview_view_id_suffix_get(const struct RenderData *rd, int view_id); +void BKE_scene_multiview_view_prefix_get(struct Scene *scene, + const char *name, + char *r_prefix, + const char **r_ext); +void BKE_scene_multiview_videos_dimensions_get( + const struct RenderData *rd, size_t width, size_t height, size_t *r_width, size_t *r_height); +int BKE_scene_multiview_num_videos_get(const struct RenderData *rd); + +/* depsgraph */ +void BKE_scene_allocate_depsgraph_hash(struct Scene *scene); +void BKE_scene_ensure_depsgraph_hash(struct Scene *scene); +void BKE_scene_free_depsgraph_hash(struct Scene *scene); +void BKE_scene_free_view_layer_depsgraph(struct Scene *scene, struct ViewLayer *view_layer); + +/** + * \note Do not allocate new depsgraph. + */ +struct Depsgraph *BKE_scene_get_depsgraph(const struct Scene *scene, + const struct ViewLayer *view_layer); +/** + * \note Allocate new depsgraph if necessary. + */ +struct Depsgraph *BKE_scene_ensure_depsgraph(struct Main *bmain, + struct Scene *scene, + struct ViewLayer *view_layer); + +struct GHash *BKE_scene_undo_depsgraphs_extract(struct Main *bmain); +void BKE_scene_undo_depsgraphs_restore(struct Main *bmain, struct GHash *depsgraph_extract); + +void BKE_scene_transform_orientation_remove(struct Scene *scene, + struct TransformOrientation *orientation); +struct TransformOrientation *BKE_scene_transform_orientation_find(const struct Scene *scene, + int index); +/** + * \return the index that \a orientation has within \a scene's transform-orientation list + * or -1 if not found. + */ +int BKE_scene_transform_orientation_get_index(const struct Scene *scene, + const struct TransformOrientation *orientation); + +void BKE_scene_cursor_rot_to_mat3(const struct View3DCursor *cursor, float mat[3][3]); +void BKE_scene_cursor_mat3_to_rot(struct View3DCursor *cursor, + const float mat[3][3], + bool use_compat); + +void BKE_scene_cursor_rot_to_quat(const struct View3DCursor *cursor, float quat[4]); +void BKE_scene_cursor_quat_to_rot(struct View3DCursor *cursor, + const float quat[4], + bool use_compat); + +void BKE_scene_cursor_to_mat4(const struct View3DCursor *cursor, float mat[4][4]); +void BKE_scene_cursor_from_mat4(struct View3DCursor *cursor, + const float mat[4][4], + bool use_compat); + +#ifdef __cplusplus +} +#endif diff --git a/source/blender/blenkernel/BKE_scene.hh b/source/blender/blenkernel/BKE_scene.hh deleted file mode 100644 index 518a9d47929..00000000000 --- a/source/blender/blenkernel/BKE_scene.hh +++ /dev/null @@ -1,330 +0,0 @@ -/* SPDX-FileCopyrightText: 2001-2002 NaN Holding BV. All rights reserved. - * - * SPDX-License-Identifier: GPL-2.0-or-later */ -#pragma once - -/** \file - * \ingroup bke - */ - -#include "BLI_sys_types.h" - -struct AviCodecData; -struct Base; -struct Collection; -struct Depsgraph; -struct DupliObject; -struct GHash; -struct Main; -struct ListBase; -struct Object; -struct RenderData; -struct Scene; -struct SceneRenderView; -struct ToolSettings; -struct TransformOrientation; -struct TransformOrientationSlot; -struct UnitSettings; -struct View3DCursor; -struct ViewLayer; - -enum eSceneCopyMethod { - SCE_COPY_NEW = 0, - SCE_COPY_EMPTY = 1, - SCE_COPY_LINK_COLLECTION = 2, - SCE_COPY_FULL = 3, -}; - -/** Use as the contents of a 'for' loop: `for (SETLOOPER(...)) { ... }`. */ -#define SETLOOPER(_sce_basis, _sce_iter, _base) \ - _sce_iter = _sce_basis, \ - _base = _setlooper_base_step( \ - &_sce_iter, BKE_view_layer_context_active_PLACEHOLDER(_sce_basis), NULL); \ - _base; \ - _base = _setlooper_base_step(&_sce_iter, NULL, _base) - -#define SETLOOPER_VIEW_LAYER(_sce_basis, _view_layer, _sce_iter, _base) \ - _sce_iter = _sce_basis, _base = _setlooper_base_step(&_sce_iter, _view_layer, NULL); \ - _base; \ - _base = _setlooper_base_step(&_sce_iter, NULL, _base) - -#define SETLOOPER_SET_ONLY(_sce_basis, _sce_iter, _base) \ - _sce_iter = _sce_basis, _base = _setlooper_base_step(&_sce_iter, NULL, NULL); \ - _base; \ - _base = _setlooper_base_step(&_sce_iter, NULL, _base) - -/** - * Helper function for the #SETLOOPER and #SETLOOPER_VIEW_LAYER macros - * - * It iterates over the bases of the active layer and then the bases - * of the active layer of the background (set) scenes recursively. - */ -Base *_setlooper_base_step(Scene **sce_iter, ViewLayer *view_layer, Base *base); - -void free_avicodecdata(AviCodecData *acd); - -Scene *BKE_scene_add(Main *bmain, const char *name); - -void BKE_scene_remove_rigidbody_object(Main *bmain, Scene *scene, Object *ob, bool free_us); - -/** - * Check if there is any instance of the object in the scene. - */ -bool BKE_scene_object_find(Scene *scene, Object *ob); -Object *BKE_scene_object_find_by_name(const Scene *scene, const char *name); - -/* Scene base iteration function. - * Define struct here, so no need to bother with alloc/free it. - */ -struct SceneBaseIter { - ListBase *duplilist; - DupliObject *dupob; - float omat[4][4]; - Object *dupli_refob; - int phase; -}; - -/** - * Used by meta-balls, return *all* objects (including duplis) - * existing in the scene (including scene's sets). - */ -int BKE_scene_base_iter_next( - Depsgraph *depsgraph, SceneBaseIter *iter, Scene **scene, int val, Base **base, Object **ob); - -void BKE_scene_base_flag_to_objects(const Scene *scene, ViewLayer *view_layer); -/** - * Synchronize object base flags - * - * This is usually handled by the depsgraph. - * However, in rare occasions we need to use the latest object flags - * before depsgraph is fully updated. - * - * It should (ideally) only run for copy-on-written objects since this is - * runtime data generated per-view-layer. - */ -void BKE_scene_object_base_flag_sync_from_base(Base *base); - -/** - * Sets the active scene, mainly used when running in background mode - * (`--scene` command line argument). - * This is also called to set the scene directly, bypassing windowing code. - * Otherwise #WM_window_set_active_scene is used when changing scenes by the user. - */ -void BKE_scene_set_background(Main *bmain, Scene *sce); -/** - * Called from `creator_args.c`. - */ -Scene *BKE_scene_set_name(Main *bmain, const char *name); - -/** - * \param flag: copying options (see BKE_lib_id.hh's `LIB_ID_COPY_...` flags for more). - */ -ToolSettings *BKE_toolsettings_copy(ToolSettings *toolsettings, int flag); -void BKE_toolsettings_free(ToolSettings *toolsettings); - -Scene *BKE_scene_duplicate(Main *bmain, Scene *sce, eSceneCopyMethod type); -void BKE_scene_groups_relink(Scene *sce); - -bool BKE_scene_can_be_removed(const Main *bmain, const Scene *scene); - -bool BKE_scene_has_view_layer(const Scene *scene, const ViewLayer *layer); -Scene *BKE_scene_find_from_collection(const Main *bmain, const Collection *collection); - -#ifdef DURIAN_CAMERA_SWITCH -Object *BKE_scene_camera_switch_find(Scene *scene); /* DURIAN_CAMERA_SWITCH */ -#endif -bool BKE_scene_camera_switch_update(Scene *scene); - -const char *BKE_scene_find_marker_name(const Scene *scene, int frame); -/** - * Return the current marker for this frame, - * we can have more than 1 marker per frame, this just returns the first (unfortunately). - */ -const char *BKE_scene_find_last_marker_name(const Scene *scene, int frame); - -int BKE_scene_frame_snap_by_seconds(Scene *scene, double interval_in_seconds, int frame); - -/** - * Checks for cycle, returns true if it's all OK. - */ -bool BKE_scene_validate_setscene(Main *bmain, Scene *sce); - -/** - * Return fractional frame number taking into account sub-frames and time - * remapping. This the time value used by animation, modifiers and physics - * evaluation. */ -float BKE_scene_ctime_get(const Scene *scene); -/** - * Convert integer frame number to fractional frame number taking into account - * sub-frames and time remapping. - */ -float BKE_scene_frame_to_ctime(const Scene *scene, int frame); - -/** - * Get current fractional frame based on frame and sub-frame. - */ -float BKE_scene_frame_get(const Scene *scene); -/** - * Set current frame and sub-frame based on a fractional frame. - */ -void BKE_scene_frame_set(Scene *scene, float frame); - -TransformOrientationSlot *BKE_scene_orientation_slot_get_from_flag(Scene *scene, int flag); -TransformOrientationSlot *BKE_scene_orientation_slot_get(Scene *scene, int slot_index); -/** - * Activate a transform orientation in a 3D view based on an enum value. - * - * \param orientation: If this is #V3D_ORIENT_CUSTOM or greater, the custom transform orientation - * with index \a orientation - #V3D_ORIENT_CUSTOM gets activated. - */ -void BKE_scene_orientation_slot_set_index(TransformOrientationSlot *orient_slot, int orientation); -int BKE_scene_orientation_slot_get_index(const TransformOrientationSlot *orient_slot); -int BKE_scene_orientation_get_index(Scene *scene, int slot_index); -int BKE_scene_orientation_get_index_from_flag(Scene *scene, int flag); - -/* ** Scene evaluation ** */ - -void BKE_scene_update_sound(Depsgraph *depsgraph, Main *bmain); -void BKE_scene_update_tag_audio_volume(Depsgraph *, Scene *scene); - -void BKE_scene_graph_update_tagged(Depsgraph *depsgraph, Main *bmain); -void BKE_scene_graph_evaluated_ensure(Depsgraph *depsgraph, Main *bmain); - -void BKE_scene_graph_update_for_newframe(Depsgraph *depsgraph); -/** - * Applies changes right away, does all sets too. - */ -void BKE_scene_graph_update_for_newframe_ex(Depsgraph *depsgraph, bool clear_recalc); - -/** - * Ensures given scene/view_layer pair has a valid, up-to-date depsgraph. - * - * \warning Sets matching depsgraph as active, - * so should only be called from the active editing context (usually, from operators). - */ -void BKE_scene_view_layer_graph_evaluated_ensure(Main *bmain, Scene *scene, ViewLayer *view_layer); - -/** - * Return default view. - */ -SceneRenderView *BKE_scene_add_render_view(Scene *sce, const char *name); -bool BKE_scene_remove_render_view(Scene *scene, SceneRenderView *srv); - -/* Render profile. */ - -int get_render_subsurf_level(const RenderData *r, int lvl, bool for_render); -int get_render_child_particle_number(const RenderData *r, int child_num, bool for_render); - -bool BKE_scene_use_shading_nodes_custom(Scene *scene); -bool BKE_scene_use_spherical_stereo(Scene *scene); - -bool BKE_scene_uses_blender_eevee(const Scene *scene); -bool BKE_scene_uses_blender_workbench(const Scene *scene); -bool BKE_scene_uses_cycles(const Scene *scene); - -bool BKE_scene_uses_shader_previews(const Scene *scene); - -/** - * Return whether the Cycles experimental feature is enabled. It is invalid to call without first - * ensuring that Cycles is the active render engine (e.g. with #BKE_scene_uses_cycles). - * - * \note We cannot use `const` as RNA_id_pointer_create is not using a const ID. - */ -bool BKE_scene_uses_cycles_experimental_features(Scene *scene); - -void BKE_scene_copy_data_eevee(Scene *sce_dst, const Scene *sce_src); - -void BKE_scene_disable_color_management(Scene *scene); -bool BKE_scene_check_rigidbody_active(const Scene *scene); - -int BKE_scene_num_threads(const Scene *scene); -int BKE_render_num_threads(const RenderData *r); - -void BKE_render_resolution(const RenderData *r, const bool use_crop, int *r_width, int *r_height); -int BKE_render_preview_pixel_size(const RenderData *r); - -/**********************************/ - -/** - * Apply the needed correction factor to value, based on unit_type - * (only length-related are affected currently) and `unit->scale_length`. - */ -double BKE_scene_unit_scale(const UnitSettings *unit, int unit_type, double value); - -/* Multi-view. */ - -bool BKE_scene_multiview_is_stereo3d(const RenderData *rd); -/** - * Return whether to render this #SceneRenderView. - */ -bool BKE_scene_multiview_is_render_view_active(const RenderData *rd, const SceneRenderView *srv); -/** - * \return true if `viewname` is the first or if the name is NULL or not found. - */ -bool BKE_scene_multiview_is_render_view_first(const RenderData *rd, const char *viewname); -/** - * \return true if `viewname` is the last or if the name is NULL or not found. - */ -bool BKE_scene_multiview_is_render_view_last(const RenderData *rd, const char *viewname); -int BKE_scene_multiview_num_views_get(const RenderData *rd); -SceneRenderView *BKE_scene_multiview_render_view_findindex(const RenderData *rd, int view_id); -const char *BKE_scene_multiview_render_view_name_get(const RenderData *rd, int view_id); -int BKE_scene_multiview_view_id_get(const RenderData *rd, const char *viewname); -void BKE_scene_multiview_filepath_get(const SceneRenderView *srv, - const char *filepath, - char *r_filepath); -/** - * When multi-view is not used the `filepath` is as usual (e.g., `Image.jpg`). - * When multi-view is on, even if only one view is enabled the view is incorporated - * into the file name (e.g., `Image_L.jpg`). That allows for the user to re-render - * individual views. - */ -void BKE_scene_multiview_view_filepath_get(const RenderData *rd, - const char *filepath, - const char *view, - char *r_filepath); -const char *BKE_scene_multiview_view_suffix_get(const RenderData *rd, const char *viewname); -const char *BKE_scene_multiview_view_id_suffix_get(const RenderData *rd, int view_id); -void BKE_scene_multiview_view_prefix_get(Scene *scene, - const char *name, - char *r_prefix, - const char **r_ext); -void BKE_scene_multiview_videos_dimensions_get( - const RenderData *rd, size_t width, size_t height, size_t *r_width, size_t *r_height); -int BKE_scene_multiview_num_videos_get(const RenderData *rd); - -/* depsgraph */ -void BKE_scene_allocate_depsgraph_hash(Scene *scene); -void BKE_scene_ensure_depsgraph_hash(Scene *scene); -void BKE_scene_free_depsgraph_hash(Scene *scene); -void BKE_scene_free_view_layer_depsgraph(Scene *scene, ViewLayer *view_layer); - -/** - * \note Do not allocate new depsgraph. - */ -Depsgraph *BKE_scene_get_depsgraph(const Scene *scene, const ViewLayer *view_layer); -/** - * \note Allocate new depsgraph if necessary. - */ -Depsgraph *BKE_scene_ensure_depsgraph(Main *bmain, Scene *scene, ViewLayer *view_layer); - -GHash *BKE_scene_undo_depsgraphs_extract(Main *bmain); -void BKE_scene_undo_depsgraphs_restore(Main *bmain, GHash *depsgraph_extract); - -void BKE_scene_transform_orientation_remove(Scene *scene, TransformOrientation *orientation); -TransformOrientation *BKE_scene_transform_orientation_find(const Scene *scene, int index); -/** - * \return the index that \a orientation has within \a scene's transform-orientation list - * or -1 if not found. - */ -int BKE_scene_transform_orientation_get_index(const Scene *scene, - const TransformOrientation *orientation); - -void BKE_scene_cursor_rot_to_mat3(const View3DCursor *cursor, float mat[3][3]); -void BKE_scene_cursor_mat3_to_rot(View3DCursor *cursor, const float mat[3][3], bool use_compat); - -void BKE_scene_cursor_rot_to_quat(const View3DCursor *cursor, float quat[4]); -void BKE_scene_cursor_quat_to_rot(View3DCursor *cursor, const float quat[4], bool use_compat); - -void BKE_scene_cursor_to_mat4(const View3DCursor *cursor, float mat[4][4]); -void BKE_scene_cursor_from_mat4(View3DCursor *cursor, const float mat[4][4], bool use_compat); diff --git a/source/blender/blenkernel/BKE_scene_runtime.hh b/source/blender/blenkernel/BKE_scene_runtime.hh deleted file mode 100644 index 87b2faf7552..00000000000 --- a/source/blender/blenkernel/BKE_scene_runtime.hh +++ /dev/null @@ -1,25 +0,0 @@ -/* SPDX-FileCopyrightText: 2024 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -#pragma once - -#include "BLI_map.hh" -#include "BLI_timeit.hh" -#include "BLI_utility_mixins.hh" - -namespace blender::bke { - -/* Runtime data specific to the compositing trees. */ -struct CompositorRuntime { - /* Per-node instance total execution time for the corresponding node, during the last tree - * evaluation. */ - Map per_node_execution_time; -}; - -class SceneRuntime : NonCopyable, NonMovable { - public: - CompositorRuntime compositor; -}; - -} // namespace blender::bke diff --git a/source/blender/blenkernel/BKE_screen.hh b/source/blender/blenkernel/BKE_screen.hh index 0200155d580..2b4ef5a5e01 100644 --- a/source/blender/blenkernel/BKE_screen.hh +++ b/source/blender/blenkernel/BKE_screen.hh @@ -17,10 +17,6 @@ #include "BKE_context.hh" -namespace blender::bke::id { -class IDRemapper; -} - namespace blender::asset_system { class AssetRepresentation; } @@ -32,6 +28,7 @@ struct BlendLibReader; struct BlendWriter; struct Header; struct ID; +struct IDRemapper; struct LayoutPanelState; struct LibraryForeachIDData; struct ListBase; @@ -112,7 +109,7 @@ struct SpaceType { bContextDataCallback context; /* Used when we want to replace an ID by another (or NULL). */ - void (*id_remap)(ScrArea *area, SpaceLink *sl, const blender::bke::id::IDRemapper &mappings); + void (*id_remap)(ScrArea *area, SpaceLink *sl, const IDRemapper *mappings); /** * foreach_id callback to process all ID pointers of the editor. Used indirectly by lib_query's @@ -225,7 +222,7 @@ struct ARegionType { /* register operator types on startup */ void (*operatortypes)(); - /* add items to keymap */ + /* add own items to keymap */ void (*keymap)(wmKeyConfig *keyconf); /* allows default cursor per region */ void (*cursor)(wmWindow *win, ScrArea *area, ARegion *region); diff --git a/source/blender/blenkernel/BKE_shader_fx.h b/source/blender/blenkernel/BKE_shader_fx.h index 7f393186b51..ad0eedbba4c 100644 --- a/source/blender/blenkernel/BKE_shader_fx.h +++ b/source/blender/blenkernel/BKE_shader_fx.h @@ -16,6 +16,7 @@ extern "C" { struct ARegionType; struct BlendDataReader; +struct BlendLibReader; struct BlendWriter; struct ID; struct ListBase; diff --git a/source/blender/blenkernel/BKE_shrinkwrap.hh b/source/blender/blenkernel/BKE_shrinkwrap.hh index 557f8c6d5da..4e4ba6c29f4 100644 --- a/source/blender/blenkernel/BKE_shrinkwrap.hh +++ b/source/blender/blenkernel/BKE_shrinkwrap.hh @@ -118,39 +118,6 @@ void shrinkwrapGpencilModifier_deform(ShrinkwrapGpencilModifierData *mmd, float (*vertexCos)[3], int numVerts); -struct ShrinkwrapParams { - /** Shrink target. */ - Object *target = nullptr; - /** Additional shrink target. */ - Object *aux_target = nullptr; - /* Use inverse vertex group weights. */ - bool invert_vertex_weights = false; - /** Distance offset to keep from mesh/projection point. */ - float keep_distance = 0.05f; - /** Shrink type projection. */ - short shrink_type = 0 /*MOD_SHRINKWRAP_NEAREST_SURFACE*/; - /** Shrink options. */ - char shrink_options = 0 /*MOD_SHRINKWRAP_PROJECT_ALLOW_POS_DIR*/; - /** Shrink to surface mode. */ - char shrink_mode = 0 /*MOD_SHRINKWRAP_ON_SURFACE*/; - /** Limit the projection ray cast. */ - float projection_limit = 0.0f; - /** Axis to project over. */ - char projection_axis = 0 /*MOD_SHRINKWRAP_PROJECT_OVER_NORMAL*/; - /** - * If using projection over vertex normal this controls the level of subsurface that must be - * done before getting the vertex coordinates and normal. - */ - char subsurf_levels = 0; -}; - -void shrinkwrapParams_deform(const ShrinkwrapParams ¶ms, - Object &object, - ShrinkwrapTreeData &tree, - blender::Span dvert, - int defgrp_index, - blender::MutableSpan positions); - /** * Used in `editmesh_mask_extract.cc` to shrink-wrap the extracted mesh to the sculpt. */ diff --git a/source/blender/blenkernel/BKE_subdiv_ccg.hh b/source/blender/blenkernel/BKE_subdiv_ccg.hh index dc122853e2e..7294059d871 100644 --- a/source/blender/blenkernel/BKE_subdiv_ccg.hh +++ b/source/blender/blenkernel/BKE_subdiv_ccg.hh @@ -19,6 +19,7 @@ #include "BKE_DerivedMesh.hh" struct CCGElem; +struct CCGFace; struct CCGKey; struct Mesh; struct Subdiv; diff --git a/source/blender/blenkernel/BKE_undo_system.hh b/source/blender/blenkernel/BKE_undo_system.hh index de8d5c9e7fd..c194bbb2549 100644 --- a/source/blender/blenkernel/BKE_undo_system.hh +++ b/source/blender/blenkernel/BKE_undo_system.hh @@ -17,7 +17,6 @@ struct UndoType; struct bContext; /* IDs */ -struct GreasePencil; struct Main; struct Mesh; struct Object; @@ -34,7 +33,6 @@ struct UndoRefID { struct ptr_ty *ptr; \ char name[MAX_ID_NAME]; \ } -UNDO_REF_ID_TYPE(GreasePencil); UNDO_REF_ID_TYPE(Mesh); UNDO_REF_ID_TYPE(Object); UNDO_REF_ID_TYPE(Scene); diff --git a/source/blender/blenkernel/BKE_vfont.hh b/source/blender/blenkernel/BKE_vfont.hh index 9135e0b14e3..f79e6caab50 100644 --- a/source/blender/blenkernel/BKE_vfont.hh +++ b/source/blender/blenkernel/BKE_vfont.hh @@ -121,7 +121,7 @@ void BKE_vfont_build_char(Curve *cu, int BKE_vfont_select_get(Object *ob, int *r_start, int *r_end); void BKE_vfont_select_clamp(Object *ob); -void BKE_vfont_clipboard_free(); +void BKE_vfont_clipboard_free(void); void BKE_vfont_clipboard_set(const char32_t *text_buf, const CharInfo *info_buf, size_t len); void BKE_vfont_clipboard_get(char32_t **r_text_buf, CharInfo **r_info_buf, diff --git a/source/blender/blenkernel/BKE_viewer_path.hh b/source/blender/blenkernel/BKE_viewer_path.hh index fb650f1cf22..da485e1cdb9 100644 --- a/source/blender/blenkernel/BKE_viewer_path.hh +++ b/source/blender/blenkernel/BKE_viewer_path.hh @@ -26,11 +26,10 @@ struct BlendWriter; struct BlendDataReader; +struct BlendLibReader; struct LibraryForeachIDData; - -namespace blender::bke::id { -class IDRemapper; -} +struct Library; +struct IDRemapper; enum ViewerPathEqualFlag { VIEWER_PATH_EQUAL_FLAG_IGNORE_REPEAT_ITERATION = (1 << 0), @@ -45,8 +44,7 @@ bool BKE_viewer_path_equal(const ViewerPath *a, void BKE_viewer_path_blend_write(BlendWriter *writer, const ViewerPath *viewer_path); void BKE_viewer_path_blend_read_data(BlendDataReader *reader, ViewerPath *viewer_path); void BKE_viewer_path_foreach_id(LibraryForeachIDData *data, ViewerPath *viewer_path); -void BKE_viewer_path_id_remap(ViewerPath *viewer_path, - const blender::bke::id::IDRemapper &mappings); +void BKE_viewer_path_id_remap(ViewerPath *viewer_path, const IDRemapper *mappings); ViewerPathElem *BKE_viewer_path_elem_new(ViewerPathElemType type); IDViewerPathElem *BKE_viewer_path_elem_new_id(); diff --git a/source/blender/blenkernel/BKE_volume_to_mesh.hh b/source/blender/blenkernel/BKE_volume_to_mesh.hh index 40fd6f4d76f..5dc5ada8e95 100644 --- a/source/blender/blenkernel/BKE_volume_to_mesh.hh +++ b/source/blender/blenkernel/BKE_volume_to_mesh.hh @@ -44,8 +44,6 @@ Mesh *volume_to_mesh(const openvdb::GridBase &grid, float threshold, float adaptivity); -Mesh *volume_grid_to_mesh(const openvdb::GridBase &grid, float threshold, float adaptivity); - /** * Convert an OpenVDB volume grid to corresponding mesh data: vertex positions and quad and * triangle indices. diff --git a/source/blender/blenkernel/BKE_wm_runtime.hh b/source/blender/blenkernel/BKE_wm_runtime.hh deleted file mode 100644 index 01ccdd8d301..00000000000 --- a/source/blender/blenkernel/BKE_wm_runtime.hh +++ /dev/null @@ -1,23 +0,0 @@ -/* SPDX-FileCopyrightText: 2024 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -#pragma once - -#include "DNA_windowmanager_types.h" - -namespace blender::bke { - -class WindowManagerRuntime { - public: - /** Indicates whether interface is locked for user interaction. */ - bool is_interface_locked = false; - - /** Information and error reports. */ - ReportList reports; - - WindowManagerRuntime(); - ~WindowManagerRuntime(); -}; - -} // namespace blender::bke diff --git a/source/blender/blenkernel/BKE_writemovie.hh b/source/blender/blenkernel/BKE_writeavi.h similarity index 50% rename from source/blender/blenkernel/BKE_writemovie.hh rename to source/blender/blenkernel/BKE_writeavi.h index f8a14fc971b..705ead78cdc 100644 --- a/source/blender/blenkernel/BKE_writemovie.hh +++ b/source/blender/blenkernel/BKE_writeavi.h @@ -8,40 +8,45 @@ * \ingroup bke */ +#ifdef __cplusplus +extern "C" { +#endif + /* generic blender movie support, could move to own module */ -struct ImBuf; struct RenderData; struct ReportList; struct Scene; -struct bMovieHandle { - bool (*start_movie)(void *context_v, - const Scene *scene, - RenderData *rd, +typedef struct bMovieHandle { + int (*start_movie)(void *context_v, + const struct Scene *scene, + struct RenderData *rd, + int rectx, + int recty, + struct ReportList *reports, + bool preview, + const char *suffix); + int (*append_movie)(void *context_v, + struct RenderData *rd, + int start_frame, + int frame, + int *pixels, int rectx, int recty, - ReportList *reports, - bool preview, - const char *suffix); - bool (*append_movie)(void *context_v, - RenderData *rd, - int start_frame, - int frame, - const ImBuf *image, - const char *suffix, - ReportList *reports); + const char *suffix, + struct ReportList *reports); void (*end_movie)(void *context_v); /* Optional function. */ void (*get_movie_path)(char filepath[/*FILE_MAX*/ 1024], - const RenderData *rd, + const struct RenderData *rd, bool preview, const char *suffix); - void *(*context_create)(); + void *(*context_create)(void); void (*context_free)(void *context_v); -}; +} bMovieHandle; bMovieHandle *BKE_movie_handle_get(char imtype); @@ -49,6 +54,10 @@ bMovieHandle *BKE_movie_handle_get(char imtype); * \note Similar to #BKE_image_path_from_imformat() */ void BKE_movie_filepath_get(char filepath[/*FILE_MAX*/ 1024], - const RenderData *rd, + const struct RenderData *rd, bool preview, const char *suffix); + +#ifdef __cplusplus +} +#endif diff --git a/source/blender/blenkernel/BKE_writeffmpeg.hh b/source/blender/blenkernel/BKE_writeffmpeg.hh index 2a7f78fd66f..7910371e9a3 100644 --- a/source/blender/blenkernel/BKE_writeffmpeg.hh +++ b/source/blender/blenkernel/BKE_writeffmpeg.hh @@ -29,10 +29,14 @@ enum { enum { FFMPEG_PRESET_NONE = 0, - FFMPEG_PRESET_H264 = 1, - FFMPEG_PRESET_THEORA = 2, - FFMPEG_PRESET_XVID = 3, - FFMPEG_PRESET_AV1 = 4, + FFMPEG_PRESET_DVD = 1, + FFMPEG_PRESET_SVCD = 2, + FFMPEG_PRESET_VCD = 3, + FFMPEG_PRESET_DV = 4, + FFMPEG_PRESET_H264 = 5, + FFMPEG_PRESET_THEORA = 6, + FFMPEG_PRESET_XVID = 7, + FFMPEG_PRESET_AV1 = 8, }; struct AVFrame; @@ -41,24 +45,24 @@ struct ReportList; struct Scene; struct SwsContext; -struct ImBuf; - -bool BKE_ffmpeg_start(void *context_v, - const Scene *scene, +int BKE_ffmpeg_start(void *context_v, + const Scene *scene, + RenderData *rd, + int rectx, + int recty, + ReportList *reports, + bool preview, + const char *suffix); +void BKE_ffmpeg_end(void *context_v); +int BKE_ffmpeg_append(void *context_v, RenderData *rd, + int start_frame, + int frame, + int *pixels, int rectx, int recty, - ReportList *reports, - bool preview, - const char *suffix); -void BKE_ffmpeg_end(void *context_v); -bool BKE_ffmpeg_append(void *context_v, - RenderData *rd, - int start_frame, - int frame, - const ImBuf *image, - const char *suffix, - ReportList *reports); + const char *suffix, + ReportList *reports); void BKE_ffmpeg_filepath_get(char filepath[/*FILE_MAX*/ 1024], const RenderData *rd, bool preview, @@ -68,21 +72,11 @@ void BKE_ffmpeg_preset_set(RenderData *rd, int preset); void BKE_ffmpeg_image_type_verify(RenderData *rd, const ImageFormatData *imf); bool BKE_ffmpeg_alpha_channel_is_supported(const RenderData *rd); -void *BKE_ffmpeg_context_create(); +void *BKE_ffmpeg_context_create(void); void BKE_ffmpeg_context_free(void *context_v); -void BKE_ffmpeg_exit(); - -/** - * Gets a `libswscale` context for given size and format parameters. - * After you're done using the context, call #BKE_ffmpeg_sws_release_context - * to release it. Internally the contexts are coming from the context - * pool/cache. - */ SwsContext *BKE_ffmpeg_sws_get_context( int width, int height, int av_src_format, int av_dst_format, int sws_flags); -void BKE_ffmpeg_sws_release_context(SwsContext *ctx); - void BKE_ffmpeg_sws_scale_frame(SwsContext *ctx, AVFrame *dst, const AVFrame *src); #endif diff --git a/source/blender/blenkernel/CMakeLists.txt b/source/blender/blenkernel/CMakeLists.txt index 4a5827e644a..b6f1be2ee5f 100644 --- a/source/blender/blenkernel/CMakeLists.txt +++ b/source/blender/blenkernel/CMakeLists.txt @@ -55,7 +55,6 @@ set(SRC intern/anim_path.cc intern/anim_sys.cc intern/anim_visualization.cc - intern/animation.cc intern/anonymous_attribute_id.cc intern/appdir.cc intern/armature.cc @@ -69,14 +68,13 @@ set(SRC intern/attribute_access.cc intern/attribute_math.cc intern/autoexec.cc - intern/bake_data_block_map.cc intern/bake_geometry_nodes_modifier.cc + intern/bake_data_block_map.cc intern/bake_items.cc intern/bake_items_paths.cc intern/bake_items_serialize.cc intern/bake_items_socket.cc intern/blender.cc - intern/blender_cli_command.cc intern/blender_copybuffer.cc intern/blender_undo.cc intern/blender_user_menu.cc @@ -198,6 +196,7 @@ set(SRC intern/mball.cc intern/mball_tessellate.cc intern/mesh.cc + intern/mesh_boolean_convert.cc intern/mesh_calc_edges.cc intern/mesh_compare.cc intern/mesh_convert.cc @@ -316,19 +315,17 @@ set(SRC intern/volume_grid_file_cache.cc intern/volume_render.cc intern/volume_to_mesh.cc - intern/wm_runtime.cc intern/workspace.cc intern/world.cc - intern/writemovie.cc + intern/writeavi.cc BKE_DerivedMesh.hh BKE_action.h BKE_action.hh BKE_addon.h - BKE_anim_data.hh + BKE_anim_data.h BKE_anim_path.h BKE_anim_visualization.h - BKE_animation.hh BKE_animsys.h BKE_anonymous_attribute_id.hh BKE_appdir.hh @@ -338,14 +335,13 @@ set(SRC BKE_attribute.hh BKE_attribute_math.hh BKE_autoexec.hh - BKE_bake_data_block_map.hh BKE_bake_geometry_nodes_modifier.hh + BKE_bake_data_block_map.hh BKE_bake_items.hh BKE_bake_items_paths.hh BKE_bake_items_serialize.hh BKE_bake_items_socket.hh - BKE_blender.hh - BKE_blender_cli_command.hh + BKE_blender.h BKE_blender_copybuffer.hh BKE_blender_undo.hh BKE_blender_user_menu.hh @@ -353,16 +349,16 @@ set(SRC BKE_blendfile.hh BKE_blendfile_link_append.hh BKE_boids.h - BKE_bpath.hh + BKE_bpath.h BKE_brush.hh BKE_bvhutils.hh - BKE_cachefile.hh - BKE_callbacks.hh + BKE_cachefile.h + BKE_callbacks.h BKE_camera.h BKE_ccg.h BKE_cdderivedmesh.h BKE_cloth.hh - BKE_collection.hh + BKE_collection.h BKE_collision.h BKE_colorband.hh BKE_colortools.hh @@ -385,7 +381,7 @@ set(SRC BKE_data_transfer.h BKE_deform.hh BKE_displist.h - BKE_duplilist.hh + BKE_duplilist.h BKE_dynamicpaint.h BKE_editlattice.h BKE_editmesh.hh @@ -393,7 +389,7 @@ set(SRC BKE_editmesh_cache.hh BKE_editmesh_tangent.hh BKE_effect.h - BKE_fcurve.hh + BKE_fcurve.h BKE_fcurve_driver.h BKE_file_handler.hh BKE_fluid.h @@ -401,7 +397,7 @@ set(SRC BKE_geometry_fields.hh BKE_geometry_set.hh BKE_geometry_set_instances.hh - BKE_global.hh + BKE_global.h BKE_gpencil_curve_legacy.h BKE_gpencil_geom_legacy.h BKE_gpencil_legacy.h @@ -409,7 +405,6 @@ set(SRC BKE_gpencil_update_cache_legacy.h BKE_grease_pencil.h BKE_grease_pencil.hh - BKE_grease_pencil_legacy_convert.hh BKE_grease_pencil_vertex_groups.hh BKE_icons.h BKE_idprop.h @@ -445,6 +440,7 @@ set(SRC BKE_mball_tessellate.hh BKE_mesh.h BKE_mesh.hh + BKE_mesh_boolean_convert.hh BKE_mesh_compare.hh BKE_mesh_fair.hh BKE_mesh_iterators.hh @@ -462,6 +458,7 @@ set(SRC BKE_movieclip.h BKE_multires.hh BKE_nla.h + BKE_node.h BKE_node.hh BKE_node_enum.hh BKE_node_runtime.hh @@ -487,10 +484,9 @@ set(SRC BKE_pose_backup.h BKE_preferences.h BKE_preview_image.hh - BKE_report.hh + BKE_report.h BKE_rigidbody.h - BKE_scene.hh - BKE_scene_runtime.hh + BKE_scene.h BKE_screen.hh BKE_sequencer_offscreen.h BKE_shader_fx.h @@ -525,10 +521,9 @@ set(SRC BKE_volume_openvdb.hh BKE_volume_render.hh BKE_volume_to_mesh.hh - BKE_wm_runtime.hh BKE_workspace.h BKE_world.h - BKE_writemovie.hh + BKE_writeavi.h nla_private.h particle_private.h @@ -646,6 +641,13 @@ if(WITH_IMAGE_WEBP) add_definitions(-DWITH_WEBP) endif() +if(WITH_CODEC_AVI) + list(APPEND INC + ../io/avi + ) + add_definitions(-DWITH_AVI) +endif() + if(WITH_CODEC_FFMPEG) list(APPEND SRC intern/writeffmpeg.cc @@ -820,6 +822,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/CCGSubSurf_intern.h b/source/blender/blenkernel/intern/CCGSubSurf_intern.h index acbb65256e6..6b5b6378f14 100644 --- a/source/blender/blenkernel/intern/CCGSubSurf_intern.h +++ b/source/blender/blenkernel/intern/CCGSubSurf_intern.h @@ -82,6 +82,9 @@ CCGAllocatorIFC *ccg_getStandardAllocatorIFC(void); * Catmull-Clark Gridding Subdivision Surface. */ +/* TODO(sergey): Get rid of this, it's more or less a bad level call. */ +struct DerivedMesh; + /* ** Data structures, constants. enums ** */ enum { @@ -253,6 +256,8 @@ void ccgSubSurf__effectedFaceNeighbors(CCGSubSurf *ss, void ccgSubSurf__sync_legacy(CCGSubSurf *ss); +struct OpenSubdiv_Converter; + /* `CCGSubSurf_util.cc` */ #ifdef DUMP_RESULT_GRIDS diff --git a/source/blender/blenkernel/intern/DerivedMesh.cc b/source/blender/blenkernel/intern/DerivedMesh.cc index 84d7d7f2d81..6c4553d4f08 100644 --- a/source/blender/blenkernel/intern/DerivedMesh.cc +++ b/source/blender/blenkernel/intern/DerivedMesh.cc @@ -109,13 +109,13 @@ static float *dm_getVertArray(DerivedMesh *dm) return (float *)positions; } -static blender::int2 *dm_getEdgeArray(DerivedMesh *dm) +static vec2i *dm_getEdgeArray(DerivedMesh *dm) { - blender::int2 *edge = (blender::int2 *)CustomData_get_layer_named_for_write( + vec2i *edge = (vec2i *)CustomData_get_layer_named_for_write( &dm->edgeData, CD_PROP_INT32_2D, ".edge_verts", dm->getNumEdges(dm)); if (!edge) { - edge = (blender::int2 *)CustomData_add_layer_named( + edge = (vec2i *)CustomData_add_layer_named( &dm->edgeData, CD_PROP_INT32_2D, CD_SET_DEFAULT, dm->getNumEdges(dm), ".edge_verts"); CustomData_set_layer_flag(&dm->edgeData, CD_PROP_INT32_2D, CD_FLAG_TEMPORARY); dm->copyEdgeArray(dm, edge); @@ -462,14 +462,14 @@ static void mesh_calc_finalize(const Mesh *mesh_input, Mesh *mesh_eval) mesh_eval->edit_mesh = mesh_input->edit_mesh; } -void BKE_mesh_wrapper_deferred_finalize_mdata(Mesh *mesh_eval) +void BKE_mesh_wrapper_deferred_finalize_mdata(Mesh *me_eval) { - if (mesh_eval->runtime->wrapper_type_finalize & (1 << ME_WRAPPER_TYPE_BMESH)) { - editbmesh_calc_modifier_final_normals(mesh_eval); - mesh_eval->runtime->wrapper_type_finalize = eMeshWrapperType( - mesh_eval->runtime->wrapper_type_finalize & ~(1 << ME_WRAPPER_TYPE_BMESH)); + if (me_eval->runtime->wrapper_type_finalize & (1 << ME_WRAPPER_TYPE_BMESH)) { + editbmesh_calc_modifier_final_normals(me_eval); + me_eval->runtime->wrapper_type_finalize = eMeshWrapperType( + me_eval->runtime->wrapper_type_finalize & ~(1 << ME_WRAPPER_TYPE_BMESH)); } - BLI_assert(mesh_eval->runtime->wrapper_type_finalize == 0); + BLI_assert(me_eval->runtime->wrapper_type_finalize == 0); } /** @@ -570,7 +570,7 @@ static void mesh_calc_modifiers(Depsgraph *depsgraph, /* This geometry set contains the non-mesh data that might be generated by modifiers. */ GeometrySet geometry_set_final; - BLI_assert((mesh_input->id.tag & LIB_TAG_COPIED_ON_EVAL_FINAL_RESULT) == 0); + BLI_assert((mesh_input->id.tag & LIB_TAG_COPIED_ON_WRITE_EVAL_RESULT) == 0); /* Mesh with constructive modifiers but no deformation applied. Tracked * along with final mesh if undeformed / orco coordinates are requested @@ -1446,7 +1446,7 @@ void makeDerivedMesh(Depsgraph *depsgraph, /* Evaluated meshes aren't supposed to be created on original instances. If you do, * they aren't cleaned up properly on mode switch, causing crashes, e.g #58150. */ - BLI_assert(ob->id.tag & LIB_TAG_COPIED_ON_EVAL); + BLI_assert(ob->id.tag & LIB_TAG_COPIED_ON_WRITE); BKE_object_free_derived_caches(ob); if (DEG_is_active(depsgraph)) { @@ -1492,7 +1492,7 @@ Mesh *mesh_get_eval_deform(Depsgraph *depsgraph, /* Evaluated meshes aren't supposed to be created on original instances. If you do, * they aren't cleaned up properly on mode switch, causing crashes, e.g #58150. */ - BLI_assert(ob->id.tag & LIB_TAG_COPIED_ON_EVAL); + BLI_assert(ob->id.tag & LIB_TAG_COPIED_ON_WRITE); /* if there's no derived mesh or the last data mask used doesn't include * the data we need, rebuild the derived mesh @@ -1576,7 +1576,7 @@ Mesh *editbmesh_get_eval_cage_from_orig(Depsgraph *depsgraph, Object *obedit, const CustomData_MeshMasks *dataMask) { - BLI_assert((obedit->id.tag & LIB_TAG_COPIED_ON_EVAL) == 0); + BLI_assert((obedit->id.tag & LIB_TAG_COPIED_ON_WRITE) == 0); const Scene *scene_eval = (const Scene *)DEG_get_evaluated_id(depsgraph, (ID *)&scene->id); Object *obedit_eval = (Object *)DEG_get_evaluated_id(depsgraph, &obedit->id); BMEditMesh *em_eval = BKE_editmesh_from_object(obedit_eval); @@ -1607,18 +1607,18 @@ static void make_vertexcos__mapFunc(void *user_data, } } -void mesh_get_mapped_verts_coords(Mesh *mesh_eval, blender::MutableSpan r_cos) +void mesh_get_mapped_verts_coords(Mesh *me_eval, blender::MutableSpan r_cos) { - if (mesh_eval->runtime->deformed_only == false) { + if (me_eval->runtime->deformed_only == false) { MappedUserData user_data; r_cos.fill(float3(0)); user_data.vertexcos = reinterpret_cast(r_cos.data()); user_data.vertex_visit = BLI_BITMAP_NEW(r_cos.size(), "vertexcos flags"); - BKE_mesh_foreach_mapped_vert(mesh_eval, make_vertexcos__mapFunc, &user_data, MESH_FOREACH_NOP); + BKE_mesh_foreach_mapped_vert(me_eval, make_vertexcos__mapFunc, &user_data, MESH_FOREACH_NOP); MEM_freeN(user_data.vertex_visit); } else { - r_cos.copy_from(mesh_eval->vert_positions()); + r_cos.copy_from(me_eval->vert_positions()); } } diff --git a/source/blender/blenkernel/intern/action.cc b/source/blender/blenkernel/intern/action.cc index eb41ba1b206..ba1133108f5 100644 --- a/source/blender/blenkernel/intern/action.cc +++ b/source/blender/blenkernel/intern/action.cc @@ -10,7 +10,6 @@ #include #include #include -#include #include "MEM_guardedalloc.h" @@ -33,17 +32,17 @@ #include "BLI_string_utils.hh" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_action.h" -#include "BKE_anim_data.hh" +#include "BKE_anim_data.h" #include "BKE_anim_visualization.h" #include "BKE_animsys.h" #include "BKE_armature.hh" #include "BKE_asset.hh" #include "BKE_constraint.h" #include "BKE_deform.hh" -#include "BKE_fcurve.hh" +#include "BKE_fcurve.h" #include "BKE_idprop.h" #include "BKE_idtype.hh" #include "BKE_lib_id.hh" @@ -98,11 +97,7 @@ static CLG_LogRef LOG = {"bke.action"}; * * \param flag: Copying options (see BKE_lib_id.hh's LIB_ID_COPY_... flags for more). */ -static void action_copy_data(Main * /*bmain*/, - std::optional /*owner_library*/, - ID *id_dst, - const ID *id_src, - const int flag) +static void action_copy_data(Main * /*bmain*/, ID *id_dst, const ID *id_src, const int flag) { bAction *action_dst = (bAction *)id_dst; const bAction *action_src = (const bAction *)id_src; @@ -204,7 +199,7 @@ static void action_blend_write(BlendWriter *writer, ID *id, const void *id_addre BLO_write_id_struct(writer, bAction, id_address, &act->id); BKE_id_blend_write(writer, &act->id); - BKE_fcurve_blend_write_listbase(writer, &act->curves); + BKE_fcurve_blend_write(writer, &act->curves); LISTBASE_FOREACH (bActionGroup *, grp, &act->groups) { BLO_write_struct(writer, bActionGroup, grp); @@ -234,7 +229,7 @@ static void action_blend_read_data(BlendDataReader *reader, ID *id) } /* >>> XXX deprecated - old animation system */ - BKE_fcurve_blend_read_data_listbase(reader, &act->curves); + BKE_fcurve_blend_read_data(reader, &act->curves); LISTBASE_FOREACH (bActionGroup *, agrp, &act->groups) { BLO_read_data_address(reader, &agrp->channels.first); @@ -273,7 +268,6 @@ static AssetTypeInfo AssetType_AC = { IDTypeInfo IDType_ID_AC = { /*id_code*/ ID_AC, /*id_filter*/ FILTER_ID_AC, - /*dependencies_id_types*/ 0, /*main_listbase_index*/ INDEX_ID_AC, /*struct_size*/ sizeof(bAction), /*name*/ "Action", @@ -1723,7 +1717,7 @@ void what_does_obaction(Object *ob, workob->runtime = &workob_runtime; /* init workob */ - copy_m4_m4(workob->runtime->object_to_world.ptr(), ob->object_to_world().ptr()); + copy_m4_m4(workob->object_to_world, ob->object_to_world); copy_m4_m4(workob->parentinv, ob->parentinv); copy_m4_m4(workob->constinv, ob->constinv); workob->parent = ob->parent; @@ -1784,8 +1778,6 @@ void what_does_obaction(Object *ob, /* execute effects of Action on to workob (or its PoseChannels) */ BKE_animsys_evaluate_animdata(&workob->id, &adt, anim_eval_context, ADT_RECALC_ANIM, false); } - /* Ensure stack memory set here isn't accessed later, see !118847. */ - workob->runtime = nullptr; } void BKE_pose_check_uids_unique_and_report(const bPose *pose) diff --git a/source/blender/blenkernel/intern/action_mirror.cc b/source/blender/blenkernel/intern/action_mirror.cc index 9f547075feb..2c3789d2968 100644 --- a/source/blender/blenkernel/intern/action_mirror.cc +++ b/source/blender/blenkernel/intern/action_mirror.cc @@ -25,7 +25,7 @@ #include "BKE_action.h" #include "BKE_armature.hh" -#include "BKE_fcurve.hh" +#include "BKE_fcurve.h" #include "DEG_depsgraph.hh" @@ -458,7 +458,7 @@ void BKE_action_flip_with_pose(bAction *act, Object *ob_arm) action_flip_pchan_rna_paths(act); - DEG_id_tag_update(&act->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&act->id, ID_RECALC_COPY_ON_WRITE); } /** \} */ diff --git a/source/blender/blenkernel/intern/anim_data.cc b/source/blender/blenkernel/intern/anim_data.cc index d5d41a44865..0e7e9badcde 100644 --- a/source/blender/blenkernel/intern/anim_data.cc +++ b/source/blender/blenkernel/intern/anim_data.cc @@ -8,22 +8,21 @@ #include "MEM_guardedalloc.h" #include -#include #include "BKE_action.h" -#include "BKE_anim_data.hh" +#include "BKE_anim_data.h" #include "BKE_animsys.h" #include "BKE_context.hh" -#include "BKE_fcurve.hh" +#include "BKE_fcurve.h" #include "BKE_fcurve_driver.h" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_idtype.hh" #include "BKE_lib_id.hh" #include "BKE_lib_query.hh" #include "BKE_main.hh" #include "BKE_nla.h" -#include "BKE_node.hh" -#include "BKE_report.hh" +#include "BKE_node.h" +#include "BKE_report.h" #include "DNA_ID.h" #include "DNA_anim_types.h" @@ -292,7 +291,6 @@ void BKE_animdata_foreach_id(AnimData *adt, LibraryForeachIDData *data) BKE_LIB_FOREACHID_PROCESS_FUNCTION_CALL(data, BKE_fcurve_foreach_id(fcu, data)); } - BKE_LIB_FOREACHID_PROCESS_IDSUPER(data, adt->animation, IDWALK_CB_USER); BKE_LIB_FOREACHID_PROCESS_IDSUPER(data, adt->action, IDWALK_CB_USER); BKE_LIB_FOREACHID_PROCESS_IDSUPER(data, adt->tmpact, IDWALK_CB_USER); @@ -305,10 +303,7 @@ void BKE_animdata_foreach_id(AnimData *adt, LibraryForeachIDData *data) /* Copying -------------------------------------------- */ -AnimData *BKE_animdata_copy_in_lib(Main *bmain, - std::optional owner_library, - AnimData *adt, - const int flag) +AnimData *BKE_animdata_copy(Main *bmain, AnimData *adt, const int flag) { AnimData *dadt; @@ -338,10 +333,8 @@ AnimData *BKE_animdata_copy_in_lib(Main *bmain, flag; BLI_assert(bmain != nullptr); BLI_assert(dadt->action == nullptr || dadt->action != dadt->tmpact); - dadt->action = reinterpret_cast(BKE_id_copy_in_lib( - bmain, owner_library, reinterpret_cast(dadt->action), nullptr, id_copy_flag)); - dadt->tmpact = reinterpret_cast(BKE_id_copy_in_lib( - bmain, owner_library, reinterpret_cast(dadt->tmpact), nullptr, id_copy_flag)); + dadt->action = (bAction *)BKE_id_copy_ex(bmain, (ID *)dadt->action, nullptr, id_copy_flag); + dadt->tmpact = (bAction *)BKE_id_copy_ex(bmain, (ID *)dadt->tmpact, nullptr, id_copy_flag); } else if (do_id_user) { id_us_plus((ID *)dadt->action); @@ -362,11 +355,6 @@ AnimData *BKE_animdata_copy_in_lib(Main *bmain, return dadt; } -AnimData *BKE_animdata_copy(Main *bmain, AnimData *adt, const int flag) -{ - return BKE_animdata_copy_in_lib(bmain, std::nullopt, adt, flag); -} - bool BKE_animdata_copy_id(Main *bmain, ID *id_to, ID *id_from, const int flag) { AnimData *adt; @@ -701,7 +689,7 @@ void BKE_animdata_transfer_by_basepath(Main *bmain, ID *srcID, ID *dstID, ListBa } } /* Tag source action because list of fcurves changed. */ - DEG_id_tag_update(&srcAdt->action->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&srcAdt->action->id, ID_RECALC_COPY_ON_WRITE); } /* Path Validation -------------------------------------------- */ @@ -1037,14 +1025,14 @@ void BKE_animdata_fix_paths_rename(ID *owner_id, if (fcurves_path_rename_fix( owner_id, prefix, oldName, newName, oldN, newN, &adt->action->curves, verify_paths)) { - DEG_id_tag_update(&adt->action->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&adt->action->id, ID_RECALC_COPY_ON_WRITE); } } if (adt->tmpact) { if (fcurves_path_rename_fix( owner_id, prefix, oldName, newName, oldN, newN, &adt->tmpact->curves, verify_paths)) { - DEG_id_tag_update(&adt->tmpact->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&adt->tmpact->id, ID_RECALC_COPY_ON_WRITE); } } /* Drivers - Drivers are really F-Curves */ @@ -1057,7 +1045,7 @@ void BKE_animdata_fix_paths_rename(ID *owner_id, } /* Tag owner ID if it */ if (is_self_changed) { - DEG_id_tag_update(owner_id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(owner_id, ID_RECALC_COPY_ON_WRITE); } /* free the temp names */ MEM_freeN(oldN); @@ -1462,7 +1450,7 @@ void BKE_animdata_blend_write(BlendWriter *writer, ID *id) BLO_write_struct(writer, AnimData, adt); /* write drivers */ - BKE_fcurve_blend_write_listbase(writer, &adt->drivers); + BKE_fcurve_blend_write(writer, &adt->drivers); /* write overrides */ /* FIXME: are these needed? */ @@ -1492,7 +1480,7 @@ void BKE_animdata_blend_read_data(BlendDataReader *reader, ID *id) /* link drivers */ BLO_read_list(reader, &adt->drivers); - BKE_fcurve_blend_read_data_listbase(reader, &adt->drivers); + BKE_fcurve_blend_read_data(reader, &adt->drivers); adt->driver_array = nullptr; /* link overrides */ diff --git a/source/blender/blenkernel/intern/anim_sys.cc b/source/blender/blenkernel/intern/anim_sys.cc index 8ac5231e8ce..db4fa849efc 100644 --- a/source/blender/blenkernel/intern/anim_sys.cc +++ b/source/blender/blenkernel/intern/anim_sys.cc @@ -15,7 +15,6 @@ #include "MEM_guardedalloc.h" #include "BLI_alloca.h" -#include "BLI_bit_vector.hh" #include "BLI_blenlib.h" #include "BLI_dynstr.h" #include "BLI_listbase.h" @@ -24,7 +23,7 @@ #include "BLI_string_utils.hh" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_anim_types.h" #include "DNA_light_types.h" @@ -37,18 +36,18 @@ #include "DNA_world_types.h" #include "BKE_action.h" -#include "BKE_anim_data.hh" +#include "BKE_anim_data.h" #include "BKE_animsys.h" #include "BKE_context.hh" -#include "BKE_fcurve.hh" -#include "BKE_global.hh" +#include "BKE_fcurve.h" +#include "BKE_global.h" #include "BKE_lib_id.hh" #include "BKE_lib_query.hh" #include "BKE_main.hh" #include "BKE_material.h" #include "BKE_nla.h" -#include "BKE_node.hh" -#include "BKE_report.hh" +#include "BKE_node.h" +#include "BKE_report.h" #include "BKE_texture.h" #include "DEG_depsgraph.hh" @@ -3715,32 +3714,34 @@ void BKE_animsys_nla_remap_keyframe_values(NlaKeyframingContext *context, int index, const AnimationEvalContext *anim_eval_context, bool *r_force_all, - blender::BitVector<> &r_successful_remaps) + BLI_bitmap *r_successful_remaps) { const int count = values.size(); - r_successful_remaps.fill(false); + BLI_bitmap_set_all(r_successful_remaps, false, count); if (r_force_all != nullptr) { *r_force_all = false; } - blender::BitVector remap_domain(count, false); + BLI_bitmap *remap_domain = BLI_BITMAP_NEW(count, __func__); for (int i = 0; i < count; i++) { if (!ELEM(index, i, -1)) { continue; } - remap_domain[i].set(); + BLI_BITMAP_ENABLE(remap_domain, i); } /* No context means no correction. */ if (context == nullptr || context->strip.act == nullptr) { - r_successful_remaps = remap_domain; + BLI_bitmap_copy_all(r_successful_remaps, remap_domain, count); + MEM_freeN(remap_domain); return; } /* If the strip is not evaluated, it is the same as zero influence. */ if (context->eval_strip == nullptr) { + MEM_freeN(remap_domain); return; } @@ -3752,12 +3753,14 @@ void BKE_animsys_nla_remap_keyframe_values(NlaKeyframingContext *context, if (blend_mode == NLASTRIP_MODE_REPLACE && influence == 1.0f && BLI_listbase_is_empty(&context->upper_estrips)) { - r_successful_remaps = remap_domain; + BLI_bitmap_copy_all(r_successful_remaps, remap_domain, count); + MEM_freeN(remap_domain); return; } /* Zero influence is division by zero. */ if (influence <= 0.0f) { + MEM_freeN(remap_domain); return; } @@ -3775,6 +3778,7 @@ void BKE_animsys_nla_remap_keyframe_values(NlaKeyframingContext *context, if (nec->base_snapshot.length != count) { BLI_assert_msg(0, "invalid value count"); nlaeval_snapshot_free_data(&blended_snapshot); + MEM_freeN(remap_domain); return; } @@ -3791,12 +3795,10 @@ void BKE_animsys_nla_remap_keyframe_values(NlaKeyframingContext *context, *r_force_all = true; index = -1; - remap_domain.fill(true); + BLI_bitmap_set_all(remap_domain, true, 4); } - for (const int i : remap_domain.index_range()) { - BLI_BITMAP_SET(blended_necs->remap_domain.ptr, i, remap_domain[i]); - } + BLI_bitmap_copy_all(blended_necs->remap_domain.ptr, remap_domain, count); /* Need to send id_ptr instead of prop_ptr so fcurve RNA paths resolve properly. */ PointerRNA id_ptr = RNA_id_pointer_create(prop_ptr->owner_id); @@ -3825,11 +3827,10 @@ void BKE_animsys_nla_remap_keyframe_values(NlaKeyframingContext *context, values[i] = blended_necs->values[i]; } - for (int i = 0; i < blended_necs->length; i++) { - r_successful_remaps[i].set(BLI_BITMAP_TEST_BOOL(blended_necs->remap_domain.ptr, i)); - } + BLI_bitmap_copy_all(r_successful_remaps, blended_necs->remap_domain.ptr, blended_necs->length); nlaeval_snapshot_free_data(&blended_snapshot); + MEM_freeN(remap_domain); } void BKE_animsys_free_nla_keyframing_context_cache(ListBase *cache) @@ -4115,7 +4116,7 @@ void BKE_animsys_update_driver_array(ID *id) AnimData *adt = BKE_animdata_from_id(id); /* Runtime driver map to avoid O(n^2) lookups in BKE_animsys_eval_driver. - * Ideally the depsgraph could pass a pointer to the evaluated driver directly, + * Ideally the depsgraph could pass a pointer to the COW driver directly, * but this is difficult in the current design. */ if (adt && adt->drivers.first) { BLI_assert(!adt->driver_array); @@ -4167,7 +4168,7 @@ void BKE_animsys_eval_driver(Depsgraph *depsgraph, ID *id, int driver_index, FCu PathResolvedRNA anim_rna; if (BKE_animsys_rna_path_resolve(&id_ptr, fcu->rna_path, fcu->array_index, &anim_rna)) { - /* Evaluate driver, and write results to copy-on-eval-domain destination */ + /* Evaluate driver, and write results to COW-domain destination */ const float ctime = DEG_get_ctime(depsgraph); const AnimationEvalContext anim_eval_context = BKE_animsys_eval_context_construct( depsgraph, ctime); diff --git a/source/blender/blenkernel/intern/anim_visualization.cc b/source/blender/blenkernel/intern/anim_visualization.cc index 24415a7084d..a0807285901 100644 --- a/source/blender/blenkernel/intern/anim_visualization.cc +++ b/source/blender/blenkernel/intern/anim_visualization.cc @@ -8,12 +8,14 @@ #include "MEM_guardedalloc.h" #include "DNA_action_types.h" +#include "DNA_anim_types.h" #include "DNA_object_types.h" +#include "DNA_scene_types.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_anim_visualization.h" -#include "BKE_report.hh" +#include "BKE_report.h" #include "GPU_batch.h" diff --git a/source/blender/blenkernel/intern/animation.cc b/source/blender/blenkernel/intern/animation.cc deleted file mode 100644 index cf3c93b8d5e..00000000000 --- a/source/blender/blenkernel/intern/animation.cc +++ /dev/null @@ -1,255 +0,0 @@ -/* SPDX-FileCopyrightText: 2024 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file Animation data-block. - * \ingroup bke - */ - -#include "BLI_map.hh" -#include "BLI_string_utf8.h" - -#include "BLO_read_write.hh" - -#include "BKE_animation.hh" -#include "BKE_fcurve.hh" -#include "BKE_idtype.hh" -#include "BKE_lib_id.hh" -#include "BKE_lib_query.hh" -#include "BKE_main.hh" - -#include "ANIM_animation.hh" - -#include "DNA_anim_types.h" -#include "DNA_defaults.h" - -#include "BLT_translation.hh" - -struct BlendWriter; -struct BlendDataReader; - -namespace blender::bke { - -static void animation_copy_data(Main * /*bmain*/, - std::optional /*owner_library*/, - ID *id_dst, - const ID *id_src, - const int /*flag*/) -{ - Animation *dna_anim_dst = reinterpret_cast(id_dst); - animrig::Animation &anim_dst = dna_anim_dst->wrap(); - - const Animation *dna_anim_src = reinterpret_cast(id_src); - const animrig::Animation &anim_src = dna_anim_src->wrap(); - - /* Copy all simple properties. */ - anim_dst.layer_array_num = anim_src.layer_array_num; - anim_dst.layer_active_index = anim_src.layer_active_index; - anim_dst.binding_array_num = anim_src.binding_array_num; - anim_dst.last_binding_handle = anim_src.last_binding_handle; - - /* Layers. */ - anim_dst.layer_array = MEM_cnew_array(anim_src.layer_array_num, __func__); - for (int i : anim_src.layers().index_range()) { - anim_dst.layer_array[i] = MEM_new(__func__, *anim_src.layer(i)); - } - - /* Bindings. */ - anim_dst.binding_array = MEM_cnew_array(anim_src.binding_array_num, - __func__); - for (int i : anim_src.bindings().index_range()) { - anim_dst.binding_array[i] = MEM_new(__func__, *anim_src.binding(i)); - } -} - -/** Free (or release) any data used by this animation (does not free the animation itself). */ -static void animation_free_data(ID *id) -{ - reinterpret_cast(id)->wrap().free_data(); -} - -static void animation_foreach_id(ID *id, LibraryForeachIDData *data) -{ - animrig::Animation &anim = reinterpret_cast(id)->wrap(); - - for (animrig::Layer *layer : anim.layers()) { - for (animrig::Strip *strip : layer->strips()) { - switch (strip->type()) { - case animrig::Strip::Type::Keyframe: { - auto &key_strip = strip->as(); - for (animrig::ChannelBag *channelbag_for_binding : key_strip.channelbags()) { - for (FCurve *fcurve : channelbag_for_binding->fcurves()) { - BKE_LIB_FOREACHID_PROCESS_FUNCTION_CALL(data, BKE_fcurve_foreach_id(fcurve, data)); - } - } - } - } - } - } -} - -static void write_channelbag(BlendWriter *writer, animrig::ChannelBag &channelbag) -{ - BLO_write_struct(writer, AnimationChannelBag, &channelbag); - - Span fcurves = channelbag.fcurves(); - BLO_write_pointer_array(writer, fcurves.size(), fcurves.data()); - - for (FCurve *fcurve : fcurves) { - BLO_write_struct(writer, FCurve, fcurve); - BKE_fcurve_blend_write_data(writer, fcurve); - } -} - -static void write_keyframe_strip(BlendWriter *writer, animrig::KeyframeStrip &key_strip) -{ - BLO_write_struct(writer, KeyframeAnimationStrip, &key_strip); - - auto channelbags = key_strip.channelbags(); - BLO_write_pointer_array(writer, channelbags.size(), channelbags.data()); - - for (animrig::ChannelBag *channelbag : channelbags) { - write_channelbag(writer, *channelbag); - } -} - -static void write_strips(BlendWriter *writer, Span strips) -{ - BLO_write_pointer_array(writer, strips.size(), strips.data()); - - for (animrig::Strip *strip : strips) { - switch (strip->type()) { - case animrig::Strip::Type::Keyframe: { - auto &key_strip = strip->as(); - write_keyframe_strip(writer, key_strip); - } - } - } -} - -static void write_layers(BlendWriter *writer, Span layers) -{ - BLO_write_pointer_array(writer, layers.size(), layers.data()); - - for (animrig::Layer *layer : layers) { - BLO_write_struct(writer, AnimationLayer, layer); - write_strips(writer, layer->strips()); - } -} - -static void write_bindings(BlendWriter *writer, Span bindings) -{ - BLO_write_pointer_array(writer, bindings.size(), bindings.data()); - for (animrig::Binding *binding : bindings) { - BLO_write_struct(writer, AnimationBinding, binding); - } -} - -static void animation_blend_write(BlendWriter *writer, ID *id, const void *id_address) -{ - animrig::Animation &anim = reinterpret_cast(id)->wrap(); - - BLO_write_id_struct(writer, Animation, id_address, &anim.id); - BKE_id_blend_write(writer, &anim.id); - - write_layers(writer, anim.layers()); - write_bindings(writer, anim.bindings()); -} - -static void read_channelbag(BlendDataReader *reader, animrig::ChannelBag &channelbag) -{ - BLO_read_pointer_array(reader, reinterpret_cast(&channelbag.fcurve_array)); - - for (int i = 0; i < channelbag.fcurve_array_num; i++) { - BLO_read_data_address(reader, &channelbag.fcurve_array[i]); - BKE_fcurve_blend_read_data(reader, channelbag.fcurve_array[i]); - } -} - -static void read_keyframe_strip(BlendDataReader *reader, animrig::KeyframeStrip &strip) -{ - BLO_read_pointer_array(reader, reinterpret_cast(&strip.channelbags_array)); - - for (int i = 0; i < strip.channelbags_array_num; i++) { - BLO_read_data_address(reader, &strip.channelbags_array[i]); - AnimationChannelBag *channelbag = strip.channelbags_array[i]; - read_channelbag(reader, channelbag->wrap()); - } -} - -static void read_animation_layers(BlendDataReader *reader, animrig::Animation &anim) -{ - BLO_read_pointer_array(reader, reinterpret_cast(&anim.layer_array)); - - for (int layer_idx = 0; layer_idx < anim.layer_array_num; layer_idx++) { - BLO_read_data_address(reader, &anim.layer_array[layer_idx]); - AnimationLayer *layer = anim.layer_array[layer_idx]; - - BLO_read_pointer_array(reader, reinterpret_cast(&layer->strip_array)); - for (int strip_idx = 0; strip_idx < layer->strip_array_num; strip_idx++) { - BLO_read_data_address(reader, &layer->strip_array[strip_idx]); - AnimationStrip *dna_strip = layer->strip_array[strip_idx]; - animrig::Strip &strip = dna_strip->wrap(); - - switch (strip.type()) { - case animrig::Strip::Type::Keyframe: { - read_keyframe_strip(reader, strip.as()); - } - } - } - } -} - -static void read_animation_bindings(BlendDataReader *reader, animrig::Animation &anim) -{ - BLO_read_pointer_array(reader, reinterpret_cast(&anim.binding_array)); - - for (int i = 0; i < anim.binding_array_num; i++) { - BLO_read_data_address(reader, &anim.binding_array[i]); - } -} - -static void animation_blend_read_data(BlendDataReader *reader, ID *id) -{ - animrig::Animation &animation = reinterpret_cast(id)->wrap(); - read_animation_layers(reader, animation); - read_animation_bindings(reader, animation); -} - -} // namespace blender::bke - -IDTypeInfo IDType_ID_AN = { - /*id_code*/ ID_AN, - /*id_filter*/ FILTER_ID_AN, - /*dependencies_id_types*/ 0, - /*main_listbase_index*/ INDEX_ID_AN, - /*struct_size*/ sizeof(Animation), - /*name*/ "Animation", - /*name_plural*/ N_("animations"), - /*translation_context*/ BLT_I18NCONTEXT_ID_ANIMATION, - /*flags*/ IDTYPE_FLAGS_NO_ANIMDATA, - /*asset_type_info*/ nullptr, - - /*init_data*/ nullptr, - /*copy_data*/ blender::bke::animation_copy_data, - /*free_data*/ blender::bke::animation_free_data, - /*make_local*/ nullptr, - /*foreach_id*/ blender::bke::animation_foreach_id, - /*foreach_cache*/ nullptr, - /*foreach_path*/ nullptr, - /*owner_pointer_get*/ nullptr, - - /*blend_write*/ blender::bke::animation_blend_write, - /*blend_read_data*/ blender::bke::animation_blend_read_data, - /*blend_read_after_liblink*/ nullptr, - - /*blend_read_undo_preserve*/ nullptr, - - /*lib_override_apply_post*/ nullptr, -}; - -Animation *BKE_animation_add(Main *bmain, const char name[]) -{ - Animation *anim = static_cast(BKE_id_new(bmain, ID_AN, name)); - return anim; -} diff --git a/source/blender/blenkernel/intern/appdir.cc b/source/blender/blenkernel/intern/appdir.cc index 05364804a7d..120a095a1cc 100644 --- a/source/blender/blenkernel/intern/appdir.cc +++ b/source/blender/blenkernel/intern/appdir.cc @@ -25,7 +25,7 @@ #include "BKE_appdir.hh" /* own include */ #include "BKE_blender_version.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "GHOST_Path-api.hh" @@ -1118,7 +1118,7 @@ void BKE_appdir_app_templates(ListBase *templates) */ static void where_is_temp(char *tempdir, const size_t tempdir_maxncpy, const char *userdir) { - if (userdir && BLI_temp_directory_path_copy_if_valid(tempdir, tempdir_maxncpy, userdir)) { + if (BLI_temp_directory_path_copy_if_valid(tempdir, tempdir_maxncpy, userdir)) { return; } BLI_temp_directory_path_get(tempdir, tempdir_maxncpy); @@ -1166,7 +1166,7 @@ static void tempdir_session_create(char *tempdir_session, void BKE_tempdir_init(const char *userdir) { - /* Sets #g_app.temp_dirname_base to `userdir` if specified and is a valid directory, + /* Sets #g_app.temp_dirname_base to \a userdir if specified and is a valid directory, * otherwise chooses a suitable OS-specific temporary directory. * Sets #g_app.temp_dirname_session to a #mkdtemp * generated sub-dir of #g_app.temp_dirname_base. */ diff --git a/source/blender/blenkernel/intern/armature.cc b/source/blender/blenkernel/intern/armature.cc index cd1c624083b..3cfb9d1b431 100644 --- a/source/blender/blenkernel/intern/armature.cc +++ b/source/blender/blenkernel/intern/armature.cc @@ -13,7 +13,6 @@ #include #include #include -#include #include "MEM_guardedalloc.h" @@ -28,7 +27,7 @@ #include "BLI_string.h" #include "BLI_string_ref.hh" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_defaults.h" @@ -39,7 +38,7 @@ #include "DNA_scene_types.h" #include "BKE_action.h" -#include "BKE_anim_data.hh" +#include "BKE_anim_data.h" #include "BKE_anim_visualization.h" #include "BKE_armature.hh" #include "BKE_constraint.h" @@ -51,7 +50,7 @@ #include "BKE_main.hh" #include "BKE_object.hh" #include "BKE_object_types.hh" -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "ANIM_bone_collections.hh" @@ -131,11 +130,7 @@ static void copy_bone_collection(bArmature *armature_dst, * * \param flag: Copying options (see BKE_lib_id.hh's LIB_ID_COPY_... flags for more). */ -static void armature_copy_data(Main * /*bmain*/, - std::optional /*owner_library*/, - ID *id_dst, - const ID *id_src, - const int flag) +static void armature_copy_data(Main * /*bmain*/, ID *id_dst, const ID *id_src, const int flag) { bArmature *armature_dst = (bArmature *)id_dst; const bArmature *armature_src = (const bArmature *)id_src; @@ -480,8 +475,6 @@ static void armature_undo_preserve(BlendLibReader * /*reader*/, ID *id_new, ID * IDTypeInfo IDType_ID_AR = { /*id_code*/ ID_AR, /*id_filter*/ FILTER_ID_AR, - /* IDProps of armature bones can use any type of ID. */ - /*dependencies_id_types*/ FILTER_ID_ALL, /*main_listbase_index*/ INDEX_ID_AR, /*struct_size*/ sizeof(bArmature), /*name*/ "Armature", @@ -1999,7 +1992,7 @@ void BKE_armature_mat_world_to_pose(Object *ob, const float inmat[4][4], float o } /* Get inverse of (armature) object's matrix. */ - invert_m4_m4(obmat, ob->object_to_world().ptr()); + invert_m4_m4(obmat, ob->object_to_world); /* multiply given matrix by object's-inverse to find pose-space matrix */ mul_m4_m4m4(outmat, inmat, obmat); @@ -2974,7 +2967,7 @@ void BKE_pose_where_is(Depsgraph *depsgraph, Scene *scene, Object *ob) } } else { - invert_m4_m4(ob->runtime->world_to_object.ptr(), ob->object_to_world().ptr()); + invert_m4_m4(ob->world_to_object, ob->object_to_world); /* world_to_object is needed */ /* 1. clear flags */ LISTBASE_FOREACH (bPoseChannel *, pchan, &ob->pose->chanbase) { @@ -3075,16 +3068,16 @@ void BKE_pchan_minmax(const Object *ob, pchan->custom_translation[0], pchan->custom_translation[1], pchan->custom_translation[2]); - mul_m4_series(mat, ob->object_to_world().ptr(), tmp, rmat, smat); + mul_m4_series(mat, ob->object_to_world, tmp, rmat, smat); BoundBox bb; BKE_boundbox_init_from_minmax(&bb, bb_custom->min, bb_custom->max); BKE_boundbox_minmax(&bb, mat, r_min, r_max); } else { float vec[3]; - mul_v3_m4v3(vec, ob->object_to_world().ptr(), pchan_tx->pose_head); + mul_v3_m4v3(vec, ob->object_to_world, pchan_tx->pose_head); minmax_v3v3_v3(r_min, r_max, vec); - mul_v3_m4v3(vec, ob->object_to_world().ptr(), pchan_tx->pose_tail); + mul_v3_m4v3(vec, ob->object_to_world, pchan_tx->pose_tail); minmax_v3v3_v3(r_min, r_max, vec); } } diff --git a/source/blender/blenkernel/intern/armature_deform.cc b/source/blender/blenkernel/intern/armature_deform.cc index 49730819a85..1ec7101abb1 100644 --- a/source/blender/blenkernel/intern/armature_deform.cc +++ b/source/blender/blenkernel/intern/armature_deform.cc @@ -34,7 +34,6 @@ #include "BKE_action.h" #include "BKE_armature.hh" -#include "BKE_curves.hh" #include "BKE_customdata.hh" #include "BKE_deform.hh" #include "BKE_editmesh.hh" @@ -487,17 +486,18 @@ static void armature_deform_coords_impl(const Object *ob_arm, const int deformflag, float (*vert_coords_prev)[3], const char *defgrp_name, - blender::Span dverts, const Mesh *me_target, BMEditMesh *em_target, bGPDstroke *gps_target) { const bArmature *arm = static_cast(ob_arm->data); bPoseChannel **pchan_from_defbase = nullptr; + const MDeformVert *dverts = nullptr; const bool use_envelope = (deformflag & ARM_DEF_ENVELOPE) != 0; const bool use_quaternion = (deformflag & ARM_DEF_QUATERNION) != 0; const bool invert_vgroup = (deformflag & ARM_DEF_INVERT_VGROUP) != 0; int defbase_len = 0; /* safety for vertexgroup index overflow */ + int dverts_len = 0; /* safety for vertexgroup overflow */ bool use_dverts = false; int armature_def_nr = -1; int cd_dvert_offset = -1; @@ -520,21 +520,26 @@ static void armature_deform_coords_impl(const Object *ob_arm, target_data_id = me_target == nullptr ? (const ID *)ob_target->data : &me_target->id; if (em_target == nullptr) { const Mesh *mesh = (const Mesh *)target_data_id; - dverts = mesh->deform_verts(); + dverts = mesh->deform_verts().data(); + if (dverts) { + dverts_len = mesh->verts_num; + } } } else if (ob_target->type == OB_LATTICE) { const Lattice *lt = static_cast(ob_target->data); target_data_id = (const ID *)ob_target->data; - dverts = blender::Span(lt->dvert, lt->pntsu * lt->pntsv * lt->pntsw); + dverts = lt->dvert; + if (dverts) { + dverts_len = lt->pntsu * lt->pntsv * lt->pntsw; + } } else if (ob_target->type == OB_GPENCIL_LEGACY) { target_data_id = (const ID *)ob_target->data; - dverts = blender::Span(gps_target->dvert, gps_target->totpoints); - } - else if (ob_target->type == OB_GREASE_PENCIL) { - target_data_id = (const ID *)ob_target->data; - BLI_assert(dverts.size() == vert_coords_len); + dverts = gps_target->dvert; + if (dverts) { + dverts_len = gps_target->totpoints; + } } /* Collect the vertex group names from the evaluated data. */ @@ -552,7 +557,7 @@ static void armature_deform_coords_impl(const Object *ob_arm, else if (me_target) { use_dverts = !me_target->deform_verts().is_empty(); } - else if (dverts.size() == vert_coords_len) { + else if (dverts) { use_dverts = true; } @@ -588,16 +593,16 @@ static void armature_deform_coords_impl(const Object *ob_arm, data.invert_vgroup = invert_vgroup; data.use_dverts = use_dverts; data.armature_def_nr = armature_def_nr; - data.dverts = dverts.data(); - data.dverts_len = dverts.size(); + data.dverts = dverts; + data.dverts_len = dverts_len; data.pchan_from_defbase = pchan_from_defbase; data.defbase_len = defbase_len; data.bmesh.cd_dvert_offset = cd_dvert_offset; float obinv[4][4]; - invert_m4_m4(obinv, ob_target->object_to_world().ptr()); + invert_m4_m4(obinv, ob_target->object_to_world); - mul_m4_m4m4(data.postmat, obinv, ob_arm->object_to_world().ptr()); + mul_m4_m4m4(data.postmat, obinv, ob_arm->object_to_world); invert_m4_m4(data.premat, data.postmat); if (em_target != nullptr) { @@ -647,37 +652,11 @@ void BKE_armature_deform_coords_with_gpencil_stroke(const Object *ob_arm, deformflag, vert_coords_prev, defgrp_name, - {}, nullptr, nullptr, gps_target); } -void BKE_armature_deform_coords_with_curves( - const Object &ob_arm, - const Object &ob_target, - blender::MutableSpan vert_coords, - std::optional> vert_coords_prev, - std::optional> vert_deform_mats, - blender::Span dverts, - int deformflag, - blender::StringRefNull defgrp_name) -{ - armature_deform_coords_impl( - &ob_arm, - &ob_target, - reinterpret_cast(vert_coords.data()), - vert_deform_mats ? reinterpret_cast(vert_deform_mats->data()) : nullptr, - vert_coords.size(), - deformflag, - vert_coords_prev ? reinterpret_cast(vert_coords_prev->data()) : nullptr, - defgrp_name.c_str(), - dverts, - nullptr, - nullptr, - nullptr); -} - void BKE_armature_deform_coords_with_mesh(const Object *ob_arm, const Object *ob_target, float (*vert_coords)[3], @@ -696,7 +675,6 @@ void BKE_armature_deform_coords_with_mesh(const Object *ob_arm, deformflag, vert_coords_prev, defgrp_name, - {}, me_target, nullptr, nullptr); @@ -720,7 +698,6 @@ void BKE_armature_deform_coords_with_editmesh(const Object *ob_arm, deformflag, vert_coords_prev, defgrp_name, - {}, nullptr, em_target, nullptr); diff --git a/source/blender/blenkernel/intern/armature_update.cc b/source/blender/blenkernel/intern/armature_update.cc index f09ab3954cb..8175f10bf29 100644 --- a/source/blender/blenkernel/intern/armature_update.cc +++ b/source/blender/blenkernel/intern/armature_update.cc @@ -19,14 +19,17 @@ #include "DNA_armature_types.h" #include "DNA_constraint_types.h" #include "DNA_object_types.h" +#include "DNA_scene_types.h" #include "BKE_action.h" #include "BKE_anim_path.h" #include "BKE_armature.hh" #include "BKE_curve.hh" -#include "BKE_fcurve.hh" +#include "BKE_displist.h" +#include "BKE_fcurve.h" +#include "BKE_object.hh" #include "BKE_object_types.hh" -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "BIK_api.h" @@ -254,11 +257,11 @@ static void apply_curve_transform( * unless the option to allow curve to be positioned elsewhere is activated (i.e. no root). */ if ((ik_data->flag & CONSTRAINT_SPLINEIK_NO_ROOT) == 0) { - mul_m4_v3(ik_data->tar->object_to_world().ptr(), r_vec); + mul_m4_v3(ik_data->tar->object_to_world, r_vec); } /* Convert the position to pose-space. */ - mul_m4_v3(ob->world_to_object().ptr(), r_vec); + mul_m4_v3(ob->world_to_object, r_vec); /* Set the new radius (it should be the average value). */ *r_radius = (radius + *r_radius) / 2; @@ -829,7 +832,7 @@ void BKE_pose_eval_init(Depsgraph *depsgraph, Scene * /*scene*/, Object *object) BLI_assert((object->pose->flag & POSE_RECALC) == 0); /* world_to_object is needed for solvers. */ - invert_m4_m4(object->runtime->world_to_object.ptr(), object->object_to_world().ptr()); + invert_m4_m4(object->world_to_object, object->object_to_world); /* clear flags */ for (bPoseChannel *pchan = static_cast(pose->chanbase.first); pchan != nullptr; diff --git a/source/blender/blenkernel/intern/asset.cc b/source/blender/blenkernel/intern/asset.cc index 0b3daf5eee9..1337c017ffd 100644 --- a/source/blender/blenkernel/intern/asset.cc +++ b/source/blender/blenkernel/intern/asset.cc @@ -52,10 +52,18 @@ AssetMetaData *BKE_asset_metadata_copy(const AssetMetaData *source) BKE_asset_metadata_catalog_id_set(copy, source->catalog_id, source->catalog_simple_name); - copy->author = BLI_strdup_null(source->author); - copy->description = BLI_strdup_null(source->description); - copy->copyright = BLI_strdup_null(source->copyright); - copy->license = BLI_strdup_null(source->license); + if (source->author) { + copy->author = BLI_strdup(source->author); + } + if (source->description) { + copy->description = BLI_strdup(source->description); + } + if (source->copyright) { + copy->copyright = BLI_strdup(source->copyright); + } + if (source->license) { + copy->license = BLI_strdup(source->license); + } BLI_duplicatelist(©->tags, &source->tags); copy->active_tag = source->active_tag; diff --git a/source/blender/blenkernel/intern/asset_weak_reference.cc b/source/blender/blenkernel/intern/asset_weak_reference.cc index 92cd4462171..f1d0d06f72a 100644 --- a/source/blender/blenkernel/intern/asset_weak_reference.cc +++ b/source/blender/blenkernel/intern/asset_weak_reference.cc @@ -30,13 +30,6 @@ AssetWeakReference::AssetWeakReference() { } -AssetWeakReference::AssetWeakReference(const AssetWeakReference &other) - : asset_library_type(other.asset_library_type), - asset_library_identifier(BLI_strdup_null(other.asset_library_identifier)), - relative_asset_identifier(BLI_strdup_null(other.relative_asset_identifier)) -{ -} - AssetWeakReference::AssetWeakReference(AssetWeakReference &&other) : asset_library_type(other.asset_library_type), asset_library_identifier(other.asset_library_identifier), @@ -53,41 +46,41 @@ AssetWeakReference::~AssetWeakReference() MEM_delete(relative_asset_identifier); } -AssetWeakReference &AssetWeakReference::operator=(const AssetWeakReference &other) +void BKE_asset_weak_reference_free(AssetWeakReference **weak_ref) { - if (this == &other) { - return *this; - } - std::destroy_at(this); - new (this) AssetWeakReference(other); - return *this; + MEM_delete(*weak_ref); + *weak_ref = nullptr; } -AssetWeakReference &AssetWeakReference::operator=(AssetWeakReference &&other) +AssetWeakReference *BKE_asset_weak_reference_copy(AssetWeakReference *weak_ref) { - if (this == &other) { - return *this; + if (weak_ref == nullptr) { + return nullptr; } - std::destroy_at(this); - new (this) AssetWeakReference(std::move(other)); - return *this; + + AssetWeakReference *weak_ref_copy = MEM_new(__func__); + weak_ref_copy->asset_library_type = weak_ref->asset_library_type; + weak_ref_copy->asset_library_identifier = BLI_strdup(weak_ref->asset_library_identifier); + weak_ref_copy->relative_asset_identifier = BLI_strdup(weak_ref->relative_asset_identifier); + + return weak_ref_copy; } -AssetWeakReference AssetWeakReference::make_reference( +AssetWeakReference *AssetWeakReference::make_reference( const asset_system::AssetLibrary &library, const asset_system::AssetIdentifier &asset_identifier) { - AssetWeakReference weak_ref{}; + AssetWeakReference *weak_ref = MEM_new(__func__); - weak_ref.asset_library_type = library.library_type(); + weak_ref->asset_library_type = library.library_type(); StringRefNull name = library.name(); if (!name.is_empty()) { - weak_ref.asset_library_identifier = BLI_strdupn(name.c_str(), name.size()); + weak_ref->asset_library_identifier = BLI_strdupn(name.c_str(), name.size()); } StringRefNull relative_identifier = asset_identifier.library_relative_identifier(); - weak_ref.relative_asset_identifier = BLI_strdupn(relative_identifier.c_str(), - relative_identifier.size()); + weak_ref->relative_asset_identifier = BLI_strdupn(relative_identifier.c_str(), + relative_identifier.size()); return weak_ref; } diff --git a/source/blender/blenkernel/intern/attribute.cc b/source/blender/blenkernel/intern/attribute.cc index ffe2d40f0f9..a09470ab21a 100644 --- a/source/blender/blenkernel/intern/attribute.cc +++ b/source/blender/blenkernel/intern/attribute.cc @@ -24,7 +24,7 @@ #include "BLI_string_utf8.h" #include "BLI_string_utils.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_attribute.hh" #include "BKE_curves.hh" @@ -33,7 +33,7 @@ #include "BKE_grease_pencil.hh" #include "BKE_mesh.hh" #include "BKE_pointcloud.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "RNA_access.hh" @@ -331,7 +331,7 @@ CustomDataLayer *BKE_id_attribute_new(ID *id, return nullptr; } BM_data_layer_add_named(em->bm, customdata, type, uniquename.c_str()); - const int index = CustomData_get_named_layer_index(customdata, type, uniquename); + const int index = CustomData_get_named_layer_index(customdata, type, uniquename.c_str()); return (index == -1) ? nullptr : &(customdata->layers[index]); } } @@ -343,7 +343,7 @@ CustomDataLayer *BKE_id_attribute_new(ID *id, attributes->add(uniquename, domain, eCustomDataType(type), AttributeInitDefaultValue()); - const int index = CustomData_get_named_layer_index(customdata, type, uniquename); + const int index = CustomData_get_named_layer_index(customdata, type, uniquename.c_str()); if (index == -1) { BKE_reportf(reports, RPT_WARNING, "Layer '%s' could not be created", uniquename.c_str()); } @@ -461,7 +461,7 @@ bool BKE_id_attribute_remove(ID *id, const char *name, ReportList *reports) for (const int domain : IndexRange(ATTR_DOMAIN_NUM)) { if (CustomData *data = info[domain].customdata) { const std::string name_copy = name; - const int layer_index = CustomData_get_named_layer_index_notype(data, name_copy); + const int layer_index = CustomData_get_named_layer_index_notype(data, name_copy.c_str()); if (layer_index == -1) { continue; } diff --git a/source/blender/blenkernel/intern/attribute_access.cc b/source/blender/blenkernel/intern/attribute_access.cc index 6b947417e91..92764d2df09 100644 --- a/source/blender/blenkernel/intern/attribute_access.cc +++ b/source/blender/blenkernel/intern/attribute_access.cc @@ -17,7 +17,7 @@ #include "BLI_math_vector_types.hh" #include "BLI_span.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "FN_field.hh" @@ -50,8 +50,6 @@ const blender::CPPType *custom_data_type_to_cpp_type(const eCustomDataType type) return &CPPType::get(); case CD_PROP_QUATERNION: return &CPPType::get(); - case CD_PROP_FLOAT4X4: - return &CPPType::get(); case CD_PROP_STRING: return &CPPType::get(); default: @@ -91,9 +89,6 @@ eCustomDataType cpp_type_to_custom_data_type(const blender::CPPType &type) if (type.is()) { return CD_PROP_QUATERNION; } - if (type.is()) { - return CD_PROP_FLOAT4X4; - } if (type.is()) { return CD_PROP_STRING; } @@ -172,8 +167,6 @@ static int attribute_data_type_complexity(const eCustomDataType data_type) return 8; case CD_PROP_COLOR: return 9; - case CD_PROP_FLOAT4X4: - return 10; #if 0 /* These attribute types are not supported yet. */ case CD_PROP_STRING: return 10; @@ -331,8 +324,10 @@ static const void *add_generic_custom_data_layer_with_existing_data( return CustomData_add_layer_anonymous_with_data( &custom_data, data_type, &anonymous_id, domain_size, layer_data, sharing_info); } + char attribute_name_c[MAX_CUSTOMDATA_LAYER_NAME]; + attribute_id.name().copy(attribute_name_c); return CustomData_add_layer_named_with_data( - &custom_data, data_type, layer_data, domain_size, attribute_id.name(), sharing_info); + &custom_data, data_type, layer_data, domain_size, attribute_name_c, sharing_info); } static bool add_custom_data_layer_from_attribute_init(const AttributeIDRef &attribute_id, @@ -394,7 +389,7 @@ static bool custom_data_layer_matches_attribute_id(const CustomDataLayer &layer, bool BuiltinCustomDataLayerProvider::layer_exists(const CustomData &custom_data) const { if (stored_as_named_attribute_) { - return CustomData_get_named_layer_index(&custom_data, stored_type_, name_) != -1; + return CustomData_get_named_layer_index(&custom_data, stored_type_, name_.c_str()) != -1; } return CustomData_has_layer(&custom_data, stored_type_); } @@ -418,7 +413,7 @@ GAttributeReader BuiltinCustomDataLayerProvider::try_get_for_read(const void *ow int index; if (stored_as_named_attribute_) { - index = CustomData_get_named_layer_index(custom_data, stored_type_, name_); + index = CustomData_get_named_layer_index(custom_data, stored_type_, name_.c_str()); } else { index = CustomData_get_layer_index(custom_data, stored_type_); @@ -454,7 +449,8 @@ GAttributeWriter BuiltinCustomDataLayerProvider::try_get_for_write(void *owner) void *data = nullptr; if (stored_as_named_attribute_) { - data = CustomData_get_layer_named_for_write(custom_data, stored_type_, name_, element_num); + data = CustomData_get_layer_named_for_write( + custom_data, stored_type_, name_.c_str(), element_num); } else { data = CustomData_get_layer_for_write(custom_data, stored_type_, element_num); @@ -483,7 +479,7 @@ bool BuiltinCustomDataLayerProvider::try_delete(void *owner) const const int element_num = custom_data_access_.get_element_num(owner); if (stored_as_named_attribute_) { - if (CustomData_free_layer_named(custom_data, name_, element_num)) { + if (CustomData_free_layer_named(custom_data, name_.c_str(), element_num)) { update(); return true; } @@ -512,7 +508,7 @@ bool BuiltinCustomDataLayerProvider::try_create(void *owner, const int element_num = custom_data_access_.get_element_num(owner); if (stored_as_named_attribute_) { - if (CustomData_has_layer_named(custom_data, data_type_, name_)) { + if (CustomData_has_layer_named(custom_data, data_type_, name_.c_str())) { /* Exists already. */ return false; } @@ -535,7 +531,7 @@ bool BuiltinCustomDataLayerProvider::exists(const void *owner) const return false; } if (stored_as_named_attribute_) { - return CustomData_has_layer_named(custom_data, stored_type_, name_); + return CustomData_has_layer_named(custom_data, stored_type_, name_.c_str()); } return CustomData_get_layer(custom_data, stored_type_) != nullptr; } @@ -916,9 +912,6 @@ void gather_attributes(const AttributeAccessor src_attributes, if (meta_data.domain != domain) { return true; } - if (meta_data.data_type == CD_PROP_STRING) { - return true; - } if (id.is_anonymous() && !propagation_info.propagate(id.anonymous_id())) { return true; } @@ -958,9 +951,6 @@ void gather_attributes(const AttributeAccessor src_attributes, if (meta_data.domain != domain) { return true; } - if (meta_data.data_type == CD_PROP_STRING) { - return true; - } if (id.is_anonymous() && !propagation_info.propagate(id.anonymous_id())) { return true; } @@ -993,9 +983,6 @@ void gather_attributes_group_to_group(const AttributeAccessor src_attributes, if (meta_data.domain != domain) { return true; } - if (meta_data.data_type == CD_PROP_STRING) { - return true; - } if (id.is_anonymous() && !propagation_info.propagate(id.anonymous_id())) { return true; } @@ -1026,9 +1013,6 @@ void gather_attributes_to_groups(const AttributeAccessor src_attributes, if (meta_data.domain != domain) { return true; } - if (meta_data.data_type == CD_PROP_STRING) { - return true; - } if (id.is_anonymous() && !propagation_info.propagate(id.anonymous_id())) { return true; } @@ -1078,9 +1062,6 @@ void copy_attributes_group_to_group(const AttributeAccessor src_attributes, if (meta_data.domain != domain) { return true; } - if (meta_data.data_type == CD_PROP_STRING) { - return true; - } if (id.is_anonymous() && !propagation_info.propagate(id.anonymous_id())) { return true; } @@ -1111,9 +1092,6 @@ void fill_attribute_range_default(MutableAttributeAccessor attributes, if (skip.contains(id.name())) { return true; } - if (meta_data.data_type == CD_PROP_STRING) { - return true; - } GSpanAttributeWriter attribute = attributes.lookup_for_write_span(id); const CPPType &type = attribute.span.type(); GMutableSpan data = attribute.span.slice(range); diff --git a/source/blender/blenkernel/intern/attribute_math.cc b/source/blender/blenkernel/intern/attribute_math.cc index a9509101059..f0f9101374d 100644 --- a/source/blender/blenkernel/intern/attribute_math.cc +++ b/source/blender/blenkernel/intern/attribute_math.cc @@ -3,7 +3,6 @@ * SPDX-License-Identifier: GPL-2.0-or-later */ #include "BLI_array_utils.hh" -#include "BLI_math_matrix.hh" #include "BLI_math_quaternion.hh" #include "BKE_attribute_math.hh" @@ -37,40 +36,6 @@ math::Quaternion mix4(const float4 &weights, return math::Quaternion::expmap(expmap_mixed); } -template<> float4x4 mix2(const float factor, const float4x4 &a, const float4x4 &b) -{ - return math::interpolate(a, b, factor); -} - -template<> -float4x4 mix3(const float3 &weights, const float4x4 &v0, const float4x4 &v1, const float4x4 &v2) -{ - const float3 location = mix3(weights, v0.location(), v1.location(), v2.location()); - const math::Quaternion rotation = mix3( - weights, math::to_quaternion(v0), math::to_quaternion(v1), math::to_quaternion(v2)); - const float3 scale = mix3(weights, math::to_scale(v0), math::to_scale(v1), math::to_scale(v2)); - return math::from_loc_rot_scale(location, rotation, scale); -} - -template<> -float4x4 mix4(const float4 &weights, - const float4x4 &v0, - const float4x4 &v1, - const float4x4 &v2, - const float4x4 &v3) -{ - const float3 location = mix4( - weights, v0.location(), v1.location(), v2.location(), v3.location()); - const math::Quaternion rotation = mix4(weights, - math::to_quaternion(v0), - math::to_quaternion(v1), - math::to_quaternion(v2), - math::to_quaternion(v3)); - const float3 scale = mix4( - weights, math::to_scale(v0), math::to_scale(v1), math::to_scale(v2), math::to_scale(v3)); - return math::from_loc_rot_scale(location, rotation, scale); -} - ColorGeometry4fMixer::ColorGeometry4fMixer(MutableSpan buffer, ColorGeometry4f default_color) : ColorGeometry4fMixer(buffer, buffer.index_range(), default_color) @@ -195,58 +160,6 @@ void ColorGeometry4bMixer::finalize(const IndexMask &mask) }); } -float4x4Mixer::float4x4Mixer(MutableSpan buffer) - : float4x4Mixer(buffer, buffer.index_range()) -{ -} - -float4x4Mixer::float4x4Mixer(MutableSpan buffer, const IndexMask & /*mask*/) - : buffer_(buffer), - total_weights_(buffer.size(), 0.0f), - location_buffer_(buffer.size(), float3(0)), - expmap_buffer_(buffer.size(), float3(0)), - scale_buffer_(buffer.size(), float3(0)) -{ -} - -void float4x4Mixer::float4x4Mixer::set(int64_t index, const float4x4 &value, const float weight) -{ - location_buffer_[index] = value.location() * weight; - expmap_buffer_[index] = math::to_quaternion(value).expmap() * weight; - scale_buffer_[index] = math::to_scale(value) * weight; - total_weights_[index] = weight; -} - -void float4x4Mixer::mix_in(int64_t index, const float4x4 &value, float weight) -{ - location_buffer_[index] += value.location() * weight; - expmap_buffer_[index] += math::to_quaternion(value).expmap() * weight; - scale_buffer_[index] += math::to_scale(value) * weight; - total_weights_[index] += weight; -} - -void float4x4Mixer::finalize() -{ - this->finalize(buffer_.index_range()); -} - -void float4x4Mixer::finalize(const IndexMask &mask) -{ - mask.foreach_index([&](const int64_t i) { - const float weight = total_weights_[i]; - if (weight > 0.0f) { - const float weight_inv = math::rcp(weight); - buffer_[i] = math::from_loc_rot_scale( - location_buffer_[i] * weight_inv, - math::Quaternion::expmap(expmap_buffer_[i] * weight_inv), - scale_buffer_[i] * weight_inv); - } - else { - buffer_[i] = float4x4::identity(); - } - }); -} - void gather(const GSpan src, const Span map, GMutableSpan dst) { attribute_math::convert_to_static_type(src.type(), [&](auto dummy) { diff --git a/source/blender/blenkernel/intern/bake_geometry_nodes_modifier.cc b/source/blender/blenkernel/intern/bake_geometry_nodes_modifier.cc index b3114e18412..c2c17b1ea28 100644 --- a/source/blender/blenkernel/intern/bake_geometry_nodes_modifier.cc +++ b/source/blender/blenkernel/intern/bake_geometry_nodes_modifier.cc @@ -5,16 +5,20 @@ #include #include "BKE_bake_geometry_nodes_modifier.hh" -#include "BKE_collection.hh" +#include "BKE_collection.h" +#include "BKE_curves.hh" #include "BKE_main.hh" #include "DNA_modifier_types.h" #include "DNA_node_types.h" +#include "DNA_pointcloud_types.h" #include "BLI_binary_search.hh" #include "BLI_fileops.hh" +#include "BLI_hash_md5.hh" #include "BLI_path_util.h" #include "BLI_string.h" +#include "BLI_string_utils.hh" #include "MOD_nodes.hh" @@ -45,7 +49,7 @@ IndexRange NodeBakeCache::frame_range() const } const int start_frame = this->frames.first()->frame.frame(); const int end_frame = this->frames.last()->frame.frame(); - return IndexRange::from_begin_end_inclusive(start_frame, end_frame); + return {start_frame, end_frame - start_frame + 1}; } SimulationNodeCache *ModifierCache::get_simulation_node_cache(const int id) diff --git a/source/blender/blenkernel/intern/bake_items.cc b/source/blender/blenkernel/intern/bake_items.cc index 24f9995deb2..97fd43e6e44 100644 --- a/source/blender/blenkernel/intern/bake_items.cc +++ b/source/blender/blenkernel/intern/bake_items.cc @@ -6,15 +6,22 @@ #include "BKE_bake_items_serialize.hh" #include "BKE_curves.hh" #include "BKE_instances.hh" +#include "BKE_lib_id.hh" #include "BKE_mesh.hh" #include "BKE_pointcloud.hh" #include "BKE_volume.hh" +#include "BLI_endian_defines.h" +#include "BLI_endian_switch.h" #include "BLI_math_matrix_types.hh" +#include "BLI_path_util.h" #include "DNA_material_types.h" #include "DNA_volume_types.h" +#include "RNA_access.hh" +#include "RNA_enum_types.hh" + namespace blender::bke::bake { using namespace io::serialize; diff --git a/source/blender/blenkernel/intern/bake_items_serialize.cc b/source/blender/blenkernel/intern/bake_items_serialize.cc index 57b06df5343..28edca63a09 100644 --- a/source/blender/blenkernel/intern/bake_items_serialize.cc +++ b/source/blender/blenkernel/intern/bake_items_serialize.cc @@ -716,6 +716,14 @@ static std::unique_ptr try_load_instances(const DictionaryValue &io_g instances->add_reference(std::move(reference_geometry)); } + const auto *io_transforms = io_instances->lookup_dict("transforms"); + if (!io_transforms) { + return {}; + } + if (!read_blob_simple_gspan(blob_reader, *io_transforms, instances->transforms())) { + return {}; + } + MutableAttributeAccessor attributes = instances->attributes_for_write(); if (!load_attributes(*io_attributes, attributes, blob_reader, blob_sharing)) { return {}; @@ -735,18 +743,6 @@ static std::unique_ptr try_load_instances(const DictionaryValue &io_g } } - if (!attributes.contains("instance_transform")) { - /* Try reading the transform attribute from the old bake format from before it was an - * attribute. */ - const auto *io_handles = io_instances->lookup_dict("transforms"); - if (!io_handles) { - return {}; - } - if (!read_blob_simple_gspan(blob_reader, *io_handles, instances->transforms_for_write())) { - return {}; - } - } - return instances; } @@ -977,8 +973,11 @@ static std::shared_ptr serialize_geometry_set(const GeometrySet serialize_geometry_set(reference.geometry_set(), blob_writer, blob_sharing)); } + io_instances->append( + "transforms", write_blob_simple_gspan(blob_writer, blob_sharing, instances.transforms())); + auto io_attributes = serialize_attributes( - instances.attributes(), blob_writer, blob_sharing, {}); + instances.attributes(), blob_writer, blob_sharing, {"position"}); io_instances->append("attributes", io_attributes); } return io_geometry; @@ -1043,10 +1042,6 @@ static std::shared_ptr serialize_primitive_value( const math::Quaternion value = *static_cast(value_ptr); return serialize_float_array({&value.x, 4}); } - case CD_PROP_FLOAT4X4: { - const float4x4 value = *static_cast(value_ptr); - return serialize_float_array({value.base_ptr(), value.col_len * value.row_len}); - } default: break; } @@ -1165,9 +1160,6 @@ template case CD_PROP_QUATERNION: { return deserialize_float_array(io_value, {static_cast(r_value), 4}); } - case CD_PROP_FLOAT4X4: { - return deserialize_float_array(io_value, {static_cast(r_value), 4 * 4}); - } default: break; } diff --git a/source/blender/blenkernel/intern/bake_items_socket.cc b/source/blender/blenkernel/intern/bake_items_socket.cc index 11893dcaab2..7ecee920194 100644 --- a/source/blender/blenkernel/intern/bake_items_socket.cc +++ b/source/blender/blenkernel/intern/bake_items_socket.cc @@ -47,7 +47,6 @@ Array> move_socket_values_to_bake_items(const Span(socket_value); if (value_variant.is_context_dependent_field()) { @@ -132,7 +131,6 @@ Array> move_socket_values_to_bake_items(const Span(&bake_item)) { diff --git a/source/blender/blenkernel/intern/blender.cc b/source/blender/blenkernel/intern/blender.cc index 56c15a898d3..a94244eee6c 100644 --- a/source/blender/blenkernel/intern/blender.cc +++ b/source/blender/blenkernel/intern/blender.cc @@ -22,25 +22,31 @@ #include "IMB_moviecache.hh" #include "BKE_addon.h" -#include "BKE_blender.hh" /* own include */ +#include "BKE_blender.h" /* own include */ #include "BKE_blender_user_menu.hh" /* own include */ #include "BKE_blender_version.h" /* own include */ +#include "BKE_blendfile.hh" #include "BKE_brush.hh" -#include "BKE_cachefile.hh" -#include "BKE_callbacks.hh" -#include "BKE_global.hh" +#include "BKE_cachefile.h" +#include "BKE_callbacks.h" +#include "BKE_global.h" #include "BKE_idprop.h" +#include "BKE_image.h" +#include "BKE_layer.hh" #include "BKE_main.hh" -#include "BKE_node.hh" -#include "BKE_report.hh" +#include "BKE_node.h" +#include "BKE_report.h" +#include "BKE_scene.h" #include "BKE_screen.hh" #include "BKE_studiolight.h" -#include "BKE_writeffmpeg.hh" #include "DEG_depsgraph.hh" +#include "RE_pipeline.h" #include "RE_texture.h" +#include "SEQ_sequencer.hh" + #include "BLF_api.hh" Global G; @@ -75,9 +81,6 @@ void BKE_blender_free() BKE_callback_global_finalize(); IMB_moviecache_destruct(); -#ifdef WITH_FFMPEG - BKE_ffmpeg_exit(); -#endif BKE_node_system_exit(); } @@ -360,11 +363,6 @@ void BKE_blender_userdef_app_template_data_swap(UserDef *userdef_a, UserDef *use * - various minor settings (add as needed). */ -#define VALUE_SWAP(id) \ - { \ - std::swap(userdef_a->id, userdef_b->id); \ - } - #define DATA_SWAP(id) \ { \ UserDef userdef_tmp; \ @@ -385,12 +383,12 @@ void BKE_blender_userdef_app_template_data_swap(UserDef *userdef_a, UserDef *use } \ ((void)0) - VALUE_SWAP(uistyles); - VALUE_SWAP(uifonts); - VALUE_SWAP(themes); - VALUE_SWAP(addons); - VALUE_SWAP(user_keymaps); - VALUE_SWAP(user_keyconfig_prefs); + std::swap(userdef_a->uistyles, userdef_b->uistyles); + std::swap(userdef_a->uifonts, userdef_b->uifonts); + std::swap(userdef_a->themes, userdef_b->themes); + std::swap(userdef_a->addons, userdef_b->addons); + std::swap(userdef_a->user_keymaps, userdef_b->user_keymaps); + std::swap(userdef_a->user_keyconfig_prefs, userdef_b->user_keyconfig_prefs); DATA_SWAP(font_path_ui); DATA_SWAP(font_path_ui_mono); @@ -404,8 +402,9 @@ void BKE_blender_userdef_app_template_data_swap(UserDef *userdef_a, UserDef *use DATA_SWAP(ui_scale); -#undef VALUE_SWAP +#undef SWAP_TYPELESS #undef DATA_SWAP +#undef LISTBASE_SWAP #undef FLAG_SWAP } diff --git a/source/blender/blenkernel/intern/blender_cli_command.cc b/source/blender/blenkernel/intern/blender_cli_command.cc deleted file mode 100644 index 782402a0c82..00000000000 --- a/source/blender/blenkernel/intern/blender_cli_command.cc +++ /dev/null @@ -1,181 +0,0 @@ -/* SPDX-FileCopyrightText: 2001-2002 NaN Holding BV. All rights reserved. - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup bke - * - * Generic CLI "--command" declarations. - * - * Duplicate Commands - * ================== - * - * When two or more commands share the same identifier, a warning is printed and both are disabled. - * - * This is done because command-line actions may be destructive so the down-side of running the - * wrong command could be severe. The reason this is not considered an error is we can't prevent - * it so easily, unlike operator ID's which may be longer, commands are typically short terms - * which wont necessarily include an add-ons identifier as a prefix for e.g. - * Further, an error would break loading add-ons who's primary is *not* - * necessarily to provide command-line access. - * An alternative solution could be to generate unique names (number them for example) - * but this isn't reliable as it would depend on it the order add-ons are loaded which - * isn't under user control. - */ - -#include - -#include "BLI_vector.hh" - -#include "BKE_blender_cli_command.hh" /* own include */ - -#include "MEM_guardedalloc.h" - -/* -------------------------------------------------------------------- */ -/** \name Internal API - * \{ */ - -using CommandHandlerPtr = std::unique_ptr; - -/** - * All registered command handlers. - * \note the order doesn't matter as duplicates are detected and prevented from running. - */ -blender::Vector g_command_handlers; - -static CommandHandler *blender_cli_command_lookup(const std::string &id) -{ - for (CommandHandlerPtr &cmd_iter : g_command_handlers) { - if (id == cmd_iter->id) { - return cmd_iter.get(); - } - } - return nullptr; -} - -static int blender_cli_command_index(const CommandHandler *cmd) -{ - int index = 0; - for (CommandHandlerPtr &cmd_iter : g_command_handlers) { - if (cmd_iter.get() == cmd) { - return index; - } - index++; - } - return -1; -} - -/** \} */ - -/* -------------------------------------------------------------------- */ -/** \name Public API - * \{ */ - -void BKE_blender_cli_command_register(std::unique_ptr cmd) -{ - bool is_duplicate = false; - if (CommandHandler *cmd_exists = blender_cli_command_lookup(cmd->id)) { - std::cerr << "warning: registered duplicate command \"" << cmd->id - << "\", this will be inaccessible" << std::endl; - cmd_exists->is_duplicate = true; - is_duplicate = true; - } - cmd->is_duplicate = is_duplicate; - g_command_handlers.append(std::move(cmd)); -} - -bool BKE_blender_cli_command_unregister(CommandHandler *cmd) -{ - const int cmd_index = blender_cli_command_index(cmd); - if (cmd_index == -1) { - std::cerr << "failed to unregister command handler" << std::endl; - return false; - } - - /* Update duplicates after removal. */ - if (cmd->is_duplicate) { - CommandHandler *cmd_other = nullptr; - for (CommandHandlerPtr &cmd_iter : g_command_handlers) { - /* Skip self. */ - if (cmd == cmd_iter.get()) { - continue; - } - if (cmd_iter->is_duplicate && (cmd_iter->id == cmd->id)) { - if (cmd_other) { - /* Two or more found, clear and break. */ - cmd_other = nullptr; - break; - } - cmd_other = cmd_iter.get(); - } - } - if (cmd_other) { - cmd_other->is_duplicate = false; - } - } - - g_command_handlers.remove_and_reorder(cmd_index); - - return true; -} - -int BKE_blender_cli_command_exec(bContext *C, const char *id, const int argc, const char **argv) -{ - CommandHandler *cmd = blender_cli_command_lookup(id); - if (cmd == nullptr) { - std::cerr << "Unrecognized command: \"" << id << "\"" << std::endl; - return EXIT_FAILURE; - } - if (cmd->is_duplicate) { - std::cerr << "Command: \"" << id - << "\" was registered multiple times, must be resolved, aborting!" << std::endl; - return EXIT_FAILURE; - } - - return cmd->exec(C, argc, argv); -} - -void BKE_blender_cli_command_print_help() -{ - /* As this is isn't ordered sorting in-place is acceptable, - * sort alphabetically for display purposes only. */ - std::sort(g_command_handlers.begin(), - g_command_handlers.end(), - [](const CommandHandlerPtr &a, const CommandHandlerPtr &b) { return a->id < b->id; }); - - for (int pass = 0; pass < 2; pass++) { - std::cout << ((pass == 0) ? "Blender Command Listing:" : - "Duplicate Command Listing (ignored):") - << std::endl; - - const bool is_duplicate = pass > 0; - bool found = false; - bool has_duplicate = false; - for (CommandHandlerPtr &cmd_iter : g_command_handlers) { - if (cmd_iter->is_duplicate) { - has_duplicate = true; - } - if (cmd_iter->is_duplicate != is_duplicate) { - continue; - } - - std::cout << "\t" << cmd_iter->id << std::endl; - found = true; - } - - if (!found) { - std::cout << "\tNone found" << std::endl; - } - /* Don't print that no duplicates are found as it's not helpful. */ - if (pass == 0 && !has_duplicate) { - break; - } - } -} - -void BKE_blender_cli_command_free_all() -{ - g_command_handlers.clear(); -} - -/** \} */ diff --git a/source/blender/blenkernel/intern/blender_copybuffer.cc b/source/blender/blenkernel/intern/blender_copybuffer.cc index d7399311336..a6be7e2686c 100644 --- a/source/blender/blenkernel/intern/blender_copybuffer.cc +++ b/source/blender/blenkernel/intern/blender_copybuffer.cc @@ -12,20 +12,32 @@ #include "MEM_guardedalloc.h" +#include "DNA_scene_types.h" +#include "DNA_screen_types.h" #include "DNA_userdef_types.h" +#include "DNA_view3d_types.h" +#include "DNA_windowmanager_types.h" +#include "BLI_blenlib.h" #include "BLI_utildefines.h" +#include "IMB_imbuf.hh" +#include "IMB_moviecache.hh" + #include "BKE_blender_copybuffer.hh" /* own include */ #include "BKE_blendfile.hh" #include "BKE_blendfile_link_append.hh" #include "BKE_context.hh" +#include "BKE_global.h" #include "BKE_layer.hh" #include "BKE_lib_id.hh" +#include "BKE_main.hh" +#include "BKE_scene.h" +#include "DEG_depsgraph.hh" #include "DEG_depsgraph_build.hh" -#include "BLO_readfile.hh" +#include "BLO_readfile.h" #include "BLO_writefile.hh" #include "IMB_colormanagement.hh" diff --git a/source/blender/blenkernel/intern/blender_undo.cc b/source/blender/blenkernel/intern/blender_undo.cc index 59c15140b16..880a541f0ff 100644 --- a/source/blender/blenkernel/intern/blender_undo.cc +++ b/source/blender/blenkernel/intern/blender_undo.cc @@ -34,11 +34,11 @@ #include "BKE_blender_undo.hh" /* own include */ #include "BKE_blendfile.hh" #include "BKE_context.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_main.hh" #include "BKE_undo_system.hh" -#include "BLO_readfile.hh" +#include "BLO_readfile.h" #include "BLO_undofile.hh" #include "BLO_writefile.hh" diff --git a/source/blender/blenkernel/intern/blendfile.cc b/source/blender/blenkernel/intern/blendfile.cc index 9c4903e99c4..879d1e20d93 100644 --- a/source/blender/blenkernel/intern/blendfile.cc +++ b/source/blender/blenkernel/intern/blendfile.cc @@ -27,20 +27,20 @@ #include "BLI_time.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" - #include "IMB_colormanagement.hh" #include "BKE_addon.h" #include "BKE_appdir.hh" -#include "BKE_blender.hh" +#include "BKE_blender.h" #include "BKE_blender_version.h" #include "BKE_blendfile.hh" -#include "BKE_bpath.hh" +#include "BKE_bpath.h" #include "BKE_colorband.hh" #include "BKE_context.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_idtype.hh" +#include "BKE_ipo.h" +#include "BKE_keyconfig.h" #include "BKE_layer.hh" #include "BKE_lib_id.hh" #include "BKE_lib_override.hh" @@ -50,26 +50,24 @@ #include "BKE_main_idmap.hh" #include "BKE_main_namemap.hh" #include "BKE_preferences.h" -#include "BKE_report.hh" -#include "BKE_scene.hh" +#include "BKE_report.h" +#include "BKE_scene.h" #include "BKE_screen.hh" #include "BKE_studiolight.h" #include "BKE_undo_system.hh" #include "BKE_workspace.h" -#include "BLO_read_write.hh" -#include "BLO_readfile.hh" -#include "BLO_userdef_default.h" +#include "BLO_readfile.h" #include "BLO_writefile.hh" +#include "RNA_access.hh" + #include "RE_pipeline.h" #ifdef WITH_PYTHON # include "BPY_extern.h" #endif -using namespace blender::bke; - /* -------------------------------------------------------------------- */ /** \name Blend/Library Paths * \{ */ @@ -234,7 +232,7 @@ struct ReuseOldBMainData { /** Storage for all remapping rules (old_id -> new_id) required by the preservation of old IDs * into the new Main. */ - id::IDRemapper *remapper; + IDRemapper *remapper; bool is_libraries_remapped; /** Used to find matching IDs by name/lib in new main, to remap ID usages of data ported over @@ -252,25 +250,25 @@ struct ReuseOldBMainData { * double of a linked data as a local one, without any known relationships between them. In * practice, this latter case is not expected to commonly happen. */ -static id::IDRemapper &reuse_bmain_data_remapper_ensure(ReuseOldBMainData *reuse_data) +static IDRemapper *reuse_bmain_data_remapper_ensure(ReuseOldBMainData *reuse_data) { if (reuse_data->is_libraries_remapped) { - return *reuse_data->remapper; + return reuse_data->remapper; } if (reuse_data->remapper == nullptr) { - reuse_data->remapper = MEM_new(__func__); + reuse_data->remapper = BKE_id_remapper_create(); } Main *new_bmain = reuse_data->new_bmain; Main *old_bmain = reuse_data->old_bmain; - id::IDRemapper &remapper = *reuse_data->remapper; + IDRemapper *remapper = reuse_data->remapper; LISTBASE_FOREACH (Library *, old_lib_iter, &old_bmain->libraries) { /* In case newly opened `new_bmain` is a library of the `old_bmain`, remap it to null, since a * file should never ever have linked data from itself. */ if (STREQ(old_lib_iter->filepath_abs, new_bmain->filepath)) { - remapper.add(&old_lib_iter->id, nullptr); + BKE_id_remapper_add(remapper, &old_lib_iter->id, nullptr); continue; } @@ -283,18 +281,19 @@ static id::IDRemapper &reuse_bmain_data_remapper_ensure(ReuseOldBMainData *reuse continue; } - remapper.add(&old_lib_iter->id, &new_lib_iter->id); + BKE_id_remapper_add(remapper, &old_lib_iter->id, &new_lib_iter->id); break; } } reuse_data->is_libraries_remapped = true; - return *reuse_data->remapper; + return reuse_data->remapper; } -static bool reuse_bmain_data_remapper_is_id_remapped(id::IDRemapper &remapper, ID *id) +static bool reuse_bmain_data_remapper_is_id_remapped(IDRemapper *remapper, ID *id) { - IDRemapperApplyResult result = remapper.get_mapping_result(id, ID_REMAP_APPLY_DEFAULT, nullptr); + IDRemapperApplyResult result = BKE_id_remapper_get_mapping_result( + remapper, id, ID_REMAP_APPLY_DEFAULT, nullptr); if (ELEM(result, ID_REMAP_RESULT_SOURCE_REMAPPED, ID_REMAP_RESULT_SOURCE_UNASSIGNED)) { /* ID is already remapped to its matching ID in the new main, or explicitly remapped to null, * nothing else to do here. */ @@ -324,7 +323,7 @@ static void swap_old_bmain_data_for_blendfile(ReuseOldBMainData *reuse_data, con ListBase *new_lb = which_libbase(new_bmain, id_code); ListBase *old_lb = which_libbase(old_bmain, id_code); - id::IDRemapper &remapper = reuse_bmain_data_remapper_ensure(reuse_data); + IDRemapper *remapper = reuse_bmain_data_remapper_ensure(reuse_data); /* NOTE: Full swapping is only supported for ID types that are assumed to be only local * data-blocks (like UI-like ones). Otherwise, the swapping could fail in many funny ways. */ @@ -333,7 +332,7 @@ static void swap_old_bmain_data_for_blendfile(ReuseOldBMainData *reuse_data, con std::swap(*new_lb, *old_lb); - /* TODO: Could add per-IDType control over name-maps clearing, if this becomes a performances + /* TODO: Could add per-IDType control over namemaps clearing, if this becomes a performances * concern. */ BKE_main_namemap_clear(old_bmain); BKE_main_namemap_clear(new_bmain); @@ -351,14 +350,14 @@ static void swap_old_bmain_data_for_blendfile(ReuseOldBMainData *reuse_data, con const int strcmp_result = strcmp(discarded_id_iter->name + 2, reused_id_iter->name + 2); if (strcmp_result == 0) { /* Matching IDs, we can remap the discarded 'new' one to the re-used 'old' one. */ - remapper.add(discarded_id_iter, reused_id_iter); + BKE_id_remapper_add(remapper, discarded_id_iter, reused_id_iter); discarded_id_iter = static_cast(discarded_id_iter->next); reused_id_iter = static_cast(reused_id_iter->next); } else if (strcmp_result < 0) { /* No matching reused 'old' ID for this discarded 'new' one. */ - remapper.add(discarded_id_iter, nullptr); + BKE_id_remapper_add(remapper, discarded_id_iter, nullptr); discarded_id_iter = static_cast(discarded_id_iter->next); } @@ -370,7 +369,7 @@ static void swap_old_bmain_data_for_blendfile(ReuseOldBMainData *reuse_data, con for (; discarded_id_iter != nullptr; discarded_id_iter = static_cast(discarded_id_iter->next)) { - remapper.add(discarded_id_iter, nullptr); + BKE_id_remapper_add(remapper, discarded_id_iter, nullptr); } FOREACH_MAIN_LISTBASE_ID_BEGIN (new_lb, reused_id_iter) { @@ -379,7 +378,7 @@ static void swap_old_bmain_data_for_blendfile(ReuseOldBMainData *reuse_data, con /* Ensure that the reused ID is remapped to itself, since it is known to be in the `new_bmain`. */ - remapper.add_overwrite(reused_id_iter, reused_id_iter); + BKE_id_remapper_add_overwrite(remapper, reused_id_iter, reused_id_iter); } FOREACH_MAIN_LISTBASE_ID_END; } @@ -433,8 +432,8 @@ static void swap_wm_data_for_blendfile(ReuseOldBMainData *reuse_data, const bool * new WM, and is responsible to free it properly. */ reuse_data->wm_setup_data->old_wm = old_wm; - id::IDRemapper &remapper = reuse_bmain_data_remapper_ensure(reuse_data); - remapper.add(&old_wm->id, &new_wm->id); + IDRemapper *remapper = reuse_bmain_data_remapper_ensure(reuse_data); + BKE_id_remapper_add(remapper, &old_wm->id, &new_wm->id); } /* Current (old) WM, but no (new) one in file (should only happen when reading pre 2.5 files, no * WM back then), or not loading UI: Keep current WM. */ @@ -457,7 +456,7 @@ static int swap_old_bmain_data_for_blendfile_dependencies_process_cb( ReuseOldBMainData *reuse_data = static_cast(cb_data->user_data); /* First check if it has already been remapped. */ - id::IDRemapper &remapper = reuse_bmain_data_remapper_ensure(reuse_data); + IDRemapper *remapper = reuse_bmain_data_remapper_ensure(reuse_data); if (reuse_bmain_data_remapper_is_id_remapped(remapper, id)) { return IDWALK_RET_NOP; } @@ -466,7 +465,7 @@ static int swap_old_bmain_data_for_blendfile_dependencies_process_cb( BLI_assert(id_map != nullptr); ID *id_new = BKE_main_idmap_lookup_id(id_map, id); - remapper.add(id, id_new); + BKE_id_remapper_add(remapper, id, id_new); return IDWALK_RET_NOP; } @@ -789,7 +788,7 @@ static void setup_app_data(bContext *C, /* Handle all pending remapping from swapping old and new IDs around. */ BKE_libblock_remap_multiple_raw(bfd->main, - *reuse_data.remapper, + reuse_data.remapper, (ID_REMAP_FORCE_UI_POINTERS | ID_REMAP_SKIP_USER_REFCOUNT | ID_REMAP_SKIP_UPDATE_TAGGING | ID_REMAP_SKIP_USER_CLEAR)); @@ -798,7 +797,7 @@ static void setup_app_data(bContext *C, * library of the previous opened blendfile'. */ reuse_bmain_data_invalid_local_usages_fix(&reuse_data); - MEM_delete(reuse_data.remapper); + BKE_id_remapper_free(reuse_data.remapper); reuse_data.remapper = nullptr; wm_data_consistency_ensure(CTX_wm_manager(C), curscene, cur_view_layer); @@ -921,7 +920,7 @@ static void setup_app_data(bContext *C, } } - /* Setting scene might require having a dependency graph, with copy-on-eval + /* Setting scene might require having a dependency graph, with copy on write * we need to make sure we ensure scene has correct color management before * constructing dependency graph. */ @@ -943,7 +942,7 @@ static void setup_app_data(bContext *C, BLI_assert(BKE_main_namemap_validate(bmain)); if (mode != LOAD_UNDO && !USER_EXPERIMENTAL_TEST(&U, no_override_auto_resync)) { - reports->duration.lib_overrides_resync = BLI_time_now_seconds(); + reports->duration.lib_overrides_resync = BLI_check_seconds_timer(); BKE_lib_override_library_main_resync( bmain, @@ -951,33 +950,12 @@ static void setup_app_data(bContext *C, bfd->cur_view_layer ? bfd->cur_view_layer : BKE_view_layer_default_view(curscene), reports); - reports->duration.lib_overrides_resync = BLI_time_now_seconds() - + reports->duration.lib_overrides_resync = BLI_check_seconds_timer() - reports->duration.lib_overrides_resync; /* We need to rebuild some of the deleted override rules (for UI feedback purpose). */ BKE_lib_override_library_main_operations_create(bmain, true, nullptr); } - - /* Now that liboverrides have been resynced and 'irrelevant' missing linked IDs has been removed, - * report actual missing linked data. */ - if (mode != LOAD_UNDO) { - ID *id_iter; - int missing_linked_ids_num = 0; - FOREACH_MAIN_ID_BEGIN (bmain, id_iter) { - if (ID_IS_LINKED(id_iter) && (id_iter->tag & LIB_TAG_MISSING)) { - missing_linked_ids_num++; - BLO_reportf_wrap(reports, - RPT_INFO, - RPT_("LIB: %s: '%s' missing from '%s', parent '%s'"), - BKE_idtype_idcode_to_name(GS(id_iter->name)), - id_iter->name + 2, - id_iter->lib->filepath_abs, - id_iter->lib->parent ? id_iter->lib->parent->filepath_abs : ""); - } - } - FOREACH_MAIN_ID_END; - reports->count.missing_linked_id = missing_linked_ids_num; - } } static void setup_app_blend_file_data(bContext *C, @@ -1046,9 +1024,7 @@ BlendFileData *BKE_blendfile_read(const char *filepath, { /* Don't print startup file loading. */ if (params->is_startup == false) { - if (!G.quiet) { - printf("Read blend: \"%s\"\n", filepath); - } + printf("Read blend: \"%s\"\n", filepath); } BlendFileData *bfd = BLO_read_from_file(filepath, eBLOReadSkip(params->skip_flags), reports); @@ -1065,13 +1041,13 @@ BlendFileData *BKE_blendfile_read(const char *filepath, return bfd; } -BlendFileData *BKE_blendfile_read_from_memory(const void *file_buf, - int file_buf_size, +BlendFileData *BKE_blendfile_read_from_memory(const void *filebuf, + int filelength, const BlendFileReadParams *params, ReportList *reports) { BlendFileData *bfd = BLO_read_from_memory( - file_buf, file_buf_size, eBLOReadSkip(params->skip_flags), reports); + filebuf, filelength, eBLOReadSkip(params->skip_flags), reports); if (bfd && bfd->main->is_read_invalid) { BLO_blendfiledata_free(bfd); bfd = nullptr; @@ -1169,15 +1145,15 @@ UserDef *BKE_blendfile_userdef_read(const char *filepath, ReportList *reports) return userdef; } -UserDef *BKE_blendfile_userdef_read_from_memory(const void *file_buf, - int file_buf_size, +UserDef *BKE_blendfile_userdef_read_from_memory(const void *filebuf, + int filelength, ReportList *reports) { BlendFileData *bfd; UserDef *userdef = nullptr; bfd = BLO_read_from_memory( - file_buf, file_buf_size, BLO_READ_SKIP_ALL & ~BLO_READ_SKIP_USERDEF, reports); + filebuf, filelength, BLO_READ_SKIP_ALL & ~BLO_READ_SKIP_USERDEF, reports); if (bfd) { if (bfd->user) { userdef = bfd->user; @@ -1252,9 +1228,6 @@ UserDef *BKE_blendfile_userdef_from_defaults() BKE_preferences_asset_library_default_add(userdef); - BKE_preferences_extension_repo_add_default(userdef); - BKE_preferences_extension_repo_add_default_user(userdef); - return userdef; } @@ -1306,9 +1279,8 @@ bool BKE_blendfile_userdef_write_all(ReportList *reports) if ((cfgdir = BKE_appdir_folder_id_create(BLENDER_USER_CONFIG, nullptr))) { bool ok_write; BLI_path_join(filepath, sizeof(filepath), cfgdir->c_str(), BLENDER_USERPREF_FILE); - if (!G.quiet) { - printf("Writing userprefs: \"%s\" ", filepath); - } + + printf("Writing userprefs: \"%s\" ", filepath); if (use_template_userpref) { ok_write = BKE_blendfile_userdef_write_app_template(filepath, reports); } @@ -1317,15 +1289,11 @@ bool BKE_blendfile_userdef_write_all(ReportList *reports) } if (ok_write) { - if (!G.quiet) { - printf("ok\n"); - } + printf("ok\n"); BKE_report(reports, RPT_INFO, "Preferences saved"); } else { - if (!G.quiet) { - printf("fail\n"); - } + printf("fail\n"); ok = false; BKE_report(reports, RPT_ERROR, "Saving preferences failed"); } @@ -1339,18 +1307,12 @@ bool BKE_blendfile_userdef_write_all(ReportList *reports) /* Also save app-template preferences. */ BLI_path_join(filepath, sizeof(filepath), cfgdir->c_str(), BLENDER_USERPREF_FILE); - if (!G.quiet) { - printf("Writing userprefs app-template: \"%s\" ", filepath); - } + printf("Writing userprefs app-template: \"%s\" ", filepath); if (BKE_blendfile_userdef_write(filepath, reports) != 0) { - if (!G.quiet) { - printf("ok\n"); - } + printf("ok\n"); } else { - if (!G.quiet) { - printf("fail\n"); - } + printf("fail\n"); ok = false; } } @@ -1373,8 +1335,8 @@ bool BKE_blendfile_userdef_write_all(ReportList *reports) * \{ */ WorkspaceConfigFileData *BKE_blendfile_workspace_config_read(const char *filepath, - const void *file_buf, - int file_buf_size, + const void *filebuf, + int filelength, ReportList *reports) { BlendFileData *bfd; @@ -1386,7 +1348,7 @@ WorkspaceConfigFileData *BKE_blendfile_workspace_config_read(const char *filepat bfd = BLO_read_from_file(filepath, BLO_READ_SKIP_USERDEF, &blend_file_read_reports); } else { - bfd = BLO_read_from_memory(file_buf, file_buf_size, BLO_READ_SKIP_USERDEF, reports); + bfd = BLO_read_from_memory(filebuf, filelength, BLO_READ_SKIP_USERDEF, reports); } if (bfd) { diff --git a/source/blender/blenkernel/intern/blendfile_link_append.cc b/source/blender/blenkernel/intern/blendfile_link_append.cc index 54f4d774b67..33025afb757 100644 --- a/source/blender/blenkernel/intern/blendfile_link_append.cc +++ b/source/blender/blenkernel/intern/blendfile_link_append.cc @@ -34,7 +34,7 @@ #include "BLI_memarena.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_idtype.hh" #include "BKE_key.hh" @@ -49,13 +49,13 @@ #include "BKE_material.h" #include "BKE_mesh_legacy_convert.hh" #include "BKE_object.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "BKE_rigidbody.h" -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "BKE_blendfile_link_append.hh" -#include "BLO_readfile.hh" +#include "BLO_readfile.h" #include "BLO_writefile.hh" static CLG_LogRef LOG = {"bke.blendfile_link_append"}; diff --git a/source/blender/blenkernel/intern/boids.cc b/source/blender/blenkernel/intern/boids.cc index cdc3b642846..c3157334d5a 100644 --- a/source/blender/blenkernel/intern/boids.cc +++ b/source/blender/blenkernel/intern/boids.cc @@ -28,7 +28,7 @@ #include "BKE_particle.h" #include "BLI_kdopbvh.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_modifier.hh" @@ -282,7 +282,7 @@ static bool rule_avoid_collision(BoidRule *rule, } } - /* Check boids in their own system. */ + /* Check boids in own system. */ if (acbr->options & BRULE_ACOLL_WITH_BOIDS) { neighbors = BLI_kdtree_3d_range_search_with_len_squared_cb(bbd->sim->psys->tree, pa->prev_state.co, @@ -690,7 +690,7 @@ static bool rule_fight(BoidRule *rule, BoidBrainData *bbd, BoidValues *val, Part int n; bool ret = false; - /* calculate its own group strength */ + /* calculate own group strength */ int neighbors = BLI_kdtree_3d_range_search( bbd->sim->psys->tree, pa->prev_state.co, &ptn, fbr->distance); for (n = 0; n < neighbors; n++) { @@ -962,7 +962,7 @@ void boids_precalc_rules(ParticleSettings *part, float cfra) if (flbr->ob && flbr->cfra != cfra) { /* save object locations for velocity calculations */ copy_v3_v3(flbr->oloc, flbr->loc); - copy_v3_v3(flbr->loc, flbr->ob->object_to_world().location()); + copy_v3_v3(flbr->loc, flbr->ob->object_to_world[3]); flbr->cfra = cfra; } } diff --git a/source/blender/blenkernel/intern/bpath.cc b/source/blender/blenkernel/intern/bpath.cc index cd31bfef301..4d94ac261e4 100644 --- a/source/blender/blenkernel/intern/bpath.cc +++ b/source/blender/blenkernel/intern/bpath.cc @@ -61,18 +61,18 @@ #include "BKE_lib_id.hh" #include "BKE_library.hh" #include "BKE_main.hh" -#include "BKE_node.hh" -#include "BKE_report.hh" +#include "BKE_node.h" +#include "BKE_report.h" #include "BKE_vfont.hh" -#include "BKE_bpath.hh" /* own include */ +#include "BKE_bpath.h" /* own include */ #include "CLG_log.h" #include "SEQ_iterator.hh" #ifndef _MSC_VER -# include "BLI_strict_flags.h" /* Keep last. */ +# include "BLI_strict_flags.h" #endif static CLG_LogRef LOG = {"bke.bpath"}; @@ -118,7 +118,7 @@ void BKE_bpath_foreach_path_id(BPathForeachPathData *bpath_data, ID *id) id_type->foreach_path(id, bpath_data); if (bpath_data->is_path_modified) { - DEG_id_tag_update(id, ID_RECALC_SOURCE | ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(id, ID_RECALC_SOURCE | ID_RECALC_COPY_ON_WRITE); } } diff --git a/source/blender/blenkernel/intern/bpath_test.cc b/source/blender/blenkernel/intern/bpath_test.cc index 08a726f140c..e2012d692a1 100644 --- a/source/blender/blenkernel/intern/bpath_test.cc +++ b/source/blender/blenkernel/intern/bpath_test.cc @@ -5,7 +5,7 @@ #include "CLG_log.h" -#include "BKE_bpath.hh" +#include "BKE_bpath.h" #include "BKE_idtype.hh" #include "BKE_lib_id.hh" #include "BKE_main.hh" diff --git a/source/blender/blenkernel/intern/brush.cc b/source/blender/blenkernel/intern/brush.cc index 7d81cd747f9..fa7e4a63528 100644 --- a/source/blender/blenkernel/intern/brush.cc +++ b/source/blender/blenkernel/intern/brush.cc @@ -5,24 +5,26 @@ /** \file * \ingroup bke */ -#include #include "MEM_guardedalloc.h" #include "DNA_brush_types.h" #include "DNA_defaults.h" +#include "DNA_gpencil_legacy_types.h" #include "DNA_material_types.h" +#include "DNA_object_types.h" #include "DNA_scene_types.h" #include "BLI_listbase.h" #include "BLI_math_rotation.h" #include "BLI_rand.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" -#include "BKE_bpath.hh" +#include "BKE_bpath.h" #include "BKE_brush.hh" #include "BKE_colortools.hh" +#include "BKE_context.hh" #include "BKE_gpencil_legacy.h" #include "BKE_idtype.hh" #include "BKE_lib_id.hh" @@ -56,11 +58,7 @@ static void brush_init_data(ID *id) BKE_brush_curve_preset(brush, CURVE_PRESET_SMOOTH); } -static void brush_copy_data(Main * /*bmain*/, - std::optional /*owner_library*/, - ID *id_dst, - const ID *id_src, - const int flag) +static void brush_copy_data(Main * /*bmain*/, ID *id_dst, const ID *id_src, const int flag) { Brush *brush_dst = (Brush *)id_dst; const Brush *brush_src = (const Brush *)id_src; @@ -414,8 +412,6 @@ static void brush_undo_preserve(BlendLibReader *reader, ID *id_new, ID *id_old) IDTypeInfo IDType_ID_BR = { /*id_code*/ ID_BR, /*id_filter*/ FILTER_ID_BR, - /*dependencies_id_types*/ - (FILTER_ID_BR | FILTER_ID_IM | FILTER_ID_PC | FILTER_ID_TE | FILTER_ID_MA), /*main_listbase_index*/ INDEX_ID_BR, /*struct_size*/ sizeof(Brush), /*name*/ "Brush", @@ -1648,12 +1644,10 @@ void BKE_brush_init_curves_sculpt_settings(Brush *brush) brush->curves_sculpt_settings = MEM_cnew(__func__); } BrushCurvesSculptSettings *settings = brush->curves_sculpt_settings; - settings->flag = BRUSH_CURVES_SCULPT_FLAG_INTERPOLATE_RADIUS; settings->add_amount = 1; settings->points_per_curve = 8; settings->minimum_length = 0.01f; settings->curve_length = 0.3f; - settings->curve_radius = 0.01f; settings->density_add_attempts = 100; settings->curve_parameter_falloff = BKE_curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f); } diff --git a/source/blender/blenkernel/intern/bvhutils.cc b/source/blender/blenkernel/intern/bvhutils.cc index be24b3c4771..7e54bc2bffb 100644 --- a/source/blender/blenkernel/intern/bvhutils.cc +++ b/source/blender/blenkernel/intern/bvhutils.cc @@ -6,16 +6,31 @@ * \ingroup bke */ +#include +#include +#include + +#include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" #include "DNA_pointcloud_types.h" +#include "BLI_bit_vector.hh" +#include "BLI_linklist.h" #include "BLI_math_geom.h" +#include "BLI_math_vector.h" +#include "BLI_span.hh" #include "BLI_task.h" +#include "BLI_threads.h" +#include "BLI_utildefines.h" #include "BKE_attribute.hh" #include "BKE_bvhutils.hh" #include "BKE_editmesh.hh" #include "BKE_mesh.hh" +#include "BKE_mesh_runtime.hh" +#include "BKE_pointcloud.hh" + +#include "MEM_guardedalloc.h" using blender::BitSpan; using blender::BitVector; @@ -279,6 +294,34 @@ static void mesh_corner_tris_nearest_point(void *userdata, normal_tri_v3(nearest->no, UNPACK3(vtri_co)); } } +/* Copy of function above (warning, should de-duplicate with `editmesh_bvh.cc`). */ +static void editmesh_corner_tris_nearest_point(void *userdata, + int index, + const float co[3], + BVHTreeNearest *nearest) +{ + BMEditMesh *em = static_cast(userdata); + const BMLoop **ltri = const_cast(em->looptris[index]); + + const float *t0, *t1, *t2; + t0 = ltri[0]->v->co; + t1 = ltri[1]->v->co; + t2 = ltri[2]->v->co; + + { + float nearest_tmp[3], dist_sq; + + closest_on_tri_to_point_v3(nearest_tmp, co, t0, t1, t2); + dist_sq = len_squared_v3v3(co, nearest_tmp); + + if (dist_sq < nearest->dist_sq) { + nearest->index = index; + nearest->dist_sq = dist_sq; + copy_v3_v3(nearest->co, nearest_tmp); + normal_tri_v3(nearest->no, t0, t1, t2); + } + } +} /** * Callback to BVH-tree ray-cast. @@ -354,6 +397,38 @@ static void mesh_corner_tris_spherecast(void *userdata, normal_tri_v3(hit->no, UNPACK3(vtri_co)); } } +/* Copy of function above (warning, should de-duplicate with `editmesh_bvh.cc`). */ +static void editmesh_corner_tris_spherecast(void *userdata, + int index, + const BVHTreeRay *ray, + BVHTreeRayHit *hit) +{ + BMEditMesh *em = static_cast(userdata); + const BMLoop **ltri = const_cast(em->looptris[index]); + + const float *t0, *t1, *t2; + t0 = ltri[0]->v->co; + t1 = ltri[1]->v->co; + t2 = ltri[2]->v->co; + + { + float dist; + if (ray->radius == 0.0f) { + dist = bvhtree_ray_tri_intersection(ray, hit->dist, t0, t1, t2); + } + else { + dist = bvhtree_sphereray_tri_intersection(ray, ray->radius, hit->dist, t0, t1, t2); + } + + if (dist >= 0 && dist < hit->dist) { + hit->index = index; + hit->dist = dist; + madd_v3_v3v3fl(hit->co, ray->origin, ray->direction, dist); + + normal_tri_v3(hit->no, t0, t1, t2); + } + } +} /** * Callback to BVH-tree nearest point. @@ -409,6 +484,17 @@ static void mesh_verts_spherecast_do(int index, } } +static void editmesh_verts_spherecast(void *userdata, + int index, + const BVHTreeRay *ray, + BVHTreeRayHit *hit) +{ + BMEditMesh *em = static_cast(userdata); + BMVert *eve = BM_vert_at_index(em->bm, index); + + mesh_verts_spherecast_do(index, eve->co, ray, hit); +} + /** * Callback to BVH-tree ray-cast. * The tree must have been built using bvhtree_from_mesh_verts. @@ -529,6 +615,44 @@ static void bvhtree_from_mesh_setup_data(BVHTree *tree, r_data->nearest_callback = mesh_corner_tris_nearest_point; r_data->raycast_callback = mesh_corner_tris_spherecast; break; + case BVHTREE_FROM_EM_LOOSEVERTS: + case BVHTREE_FROM_EM_EDGES: + case BVHTREE_FROM_EM_LOOPTRIS: + case BVHTREE_MAX_ITEM: + BLI_assert(false); + break; + } +} + +static void bvhtree_from_editmesh_setup_data(BVHTree *tree, + const BVHCacheType bvh_cache_type, + BVHTreeFromEditMesh *r_data) +{ + memset(r_data, 0, sizeof(*r_data)); + + r_data->tree = tree; + + switch (bvh_cache_type) { + case BVHTREE_FROM_EM_LOOSEVERTS: + r_data->nearest_callback = nullptr; + r_data->raycast_callback = editmesh_verts_spherecast; + break; + case BVHTREE_FROM_EM_EDGES: + r_data->nearest_callback = nullptr; /* TODO */ + r_data->raycast_callback = nullptr; /* TODO */ + break; + case BVHTREE_FROM_EM_LOOPTRIS: + r_data->nearest_callback = editmesh_corner_tris_nearest_point; + r_data->raycast_callback = editmesh_corner_tris_spherecast; + break; + + case BVHTREE_FROM_VERTS: + case BVHTREE_FROM_LOOSEVERTS: + case BVHTREE_FROM_EDGES: + case BVHTREE_FROM_LOOSEEDGES: + case BVHTREE_FROM_FACES: + case BVHTREE_FROM_CORNER_TRIS: + case BVHTREE_FROM_CORNER_TRIS_NO_HIDDEN: case BVHTREE_MAX_ITEM: BLI_assert(false); break; @@ -558,6 +682,34 @@ static BVHTree *bvhtree_new_common( /** \name Vertex Builder * \{ */ +static BVHTree *bvhtree_from_editmesh_verts_create_tree(float epsilon, + int tree_type, + int axis, + BMEditMesh *em, + const BitSpan verts_mask, + int verts_num_active) +{ + const int verts_num = em->bm->totvert; + + BVHTree *tree = bvhtree_new_common(epsilon, tree_type, axis, verts_num, verts_num_active); + if (!tree) { + return nullptr; + } + + BM_mesh_elem_table_ensure(em->bm, BM_VERT); + + for (int i = 0; i < verts_num; i++) { + if (!verts_mask.is_empty() && !verts_mask[i]) { + continue; + } + BMVert *eve = BM_vert_at_index(em->bm, i); + BLI_bvhtree_insert(tree, i, eve->co, 1); + } + BLI_assert(BLI_bvhtree_get_len(tree) == verts_num_active); + + return tree; +} + static BVHTree *bvhtree_from_mesh_verts_create_tree(float epsilon, int tree_type, int axis, @@ -581,6 +733,32 @@ static BVHTree *bvhtree_from_mesh_verts_create_tree(float epsilon, return tree; } +BVHTree *bvhtree_from_editmesh_verts_ex(BVHTreeFromEditMesh *data, + BMEditMesh *em, + const BitSpan verts_mask, + int verts_num_active, + float epsilon, + int tree_type, + int axis) +{ + BVHTree *tree = bvhtree_from_editmesh_verts_create_tree( + epsilon, tree_type, axis, em, verts_mask, verts_num_active); + + bvhtree_balance(tree, false); + + if (data) { + bvhtree_from_editmesh_setup_data(tree, BVHTREE_FROM_EM_LOOSEVERTS, data); + } + + return tree; +} + +BVHTree *bvhtree_from_editmesh_verts( + BVHTreeFromEditMesh *data, BMEditMesh *em, float epsilon, int tree_type, int axis) +{ + return bvhtree_from_editmesh_verts_ex(data, em, {}, -1, epsilon, tree_type, axis); +} + BVHTree *bvhtree_from_mesh_verts_ex(BVHTreeFromMesh *data, const Span vert_positions, const BitSpan verts_mask, @@ -608,6 +786,40 @@ BVHTree *bvhtree_from_mesh_verts_ex(BVHTreeFromMesh *data, /** \name Edge Builder * \{ */ +static BVHTree *bvhtree_from_editmesh_edges_create_tree(float epsilon, + int tree_type, + int axis, + BMEditMesh *em, + const BitSpan edges_mask, + int edges_num_active) +{ + const int edges_num = em->bm->totedge; + + BVHTree *tree = bvhtree_new_common(epsilon, tree_type, axis, edges_num, edges_num_active); + if (!tree) { + return nullptr; + } + + BM_mesh_elem_table_ensure(em->bm, BM_EDGE); + + int i; + BMIter iter; + BMEdge *eed; + BM_ITER_MESH_INDEX (eed, &iter, em->bm, BM_EDGES_OF_MESH, i) { + if (!edges_mask.is_empty() && !edges_mask[i]) { + continue; + } + float co[2][3]; + copy_v3_v3(co[0], eed->v1->co); + copy_v3_v3(co[1], eed->v2->co); + + BLI_bvhtree_insert(tree, i, co[0], 2); + } + BLI_assert(BLI_bvhtree_get_len(tree) == edges_num_active); + + return tree; +} + static BVHTree *bvhtree_from_mesh_edges_create_tree(const Span positions, const blender::Span edges, const BitSpan edges_mask, @@ -635,6 +847,32 @@ static BVHTree *bvhtree_from_mesh_edges_create_tree(const Span positions return tree; } +BVHTree *bvhtree_from_editmesh_edges_ex(BVHTreeFromEditMesh *data, + BMEditMesh *em, + const BitSpan edges_mask, + int edges_num_active, + float epsilon, + int tree_type, + int axis) +{ + BVHTree *tree = bvhtree_from_editmesh_edges_create_tree( + epsilon, tree_type, axis, em, edges_mask, edges_num_active); + + bvhtree_balance(tree, false); + + if (data) { + bvhtree_from_editmesh_setup_data(tree, BVHTREE_FROM_EM_EDGES, data); + } + + return tree; +} + +BVHTree *bvhtree_from_editmesh_edges( + BVHTreeFromEditMesh *data, BMEditMesh *em, float epsilon, int tree_type, int axis) +{ + return bvhtree_from_editmesh_edges_ex(data, em, {}, -1, epsilon, tree_type, axis); +} + BVHTree *bvhtree_from_mesh_edges_ex(BVHTreeFromMesh *data, const Span vert_positions, const Span edges, @@ -706,6 +944,46 @@ static BVHTree *bvhtree_from_mesh_faces_create_tree(float epsilon, /** \name corner_tri Face Builder * \{ */ +static BVHTree *bvhtree_from_editmesh_corner_tris_create_tree(float epsilon, + int tree_type, + int axis, + BMEditMesh *em, + const BitSpan corner_tris_mask, + int corner_tris_num_active) +{ + const int corner_tris_num = em->tottri; + + BVHTree *tree = bvhtree_new_common( + epsilon, tree_type, axis, corner_tris_num, corner_tris_num_active); + if (!tree) { + return nullptr; + } + + const BMLoop *(*corner_tris)[3] = const_cast(em->looptris); + + /* Insert BMesh-tessellation triangles into the BVH-tree, unless they are hidden + * and/or selected. Even if the faces themselves are not selected for the snapped + * transform, having a vertex selected means the face (and thus it's tessellated + * triangles) will be moving and will not be a good snap targets. */ + for (int i = 0; i < corner_tris_num; i++) { + const BMLoop **ltri = corner_tris[i]; + bool insert = !corner_tris_mask.is_empty() ? corner_tris_mask[i] : true; + + if (insert) { + /* No reason found to block hit-testing the triangle for snap, so insert it now. */ + float co[3][3]; + copy_v3_v3(co[0], ltri[0]->v->co); + copy_v3_v3(co[1], ltri[1]->v->co); + copy_v3_v3(co[2], ltri[2]->v->co); + + BLI_bvhtree_insert(tree, i, co[0], 3); + } + } + BLI_assert(BLI_bvhtree_get_len(tree) == corner_tris_num_active); + + return tree; +} + static BVHTree *bvhtree_from_mesh_corner_tris_create_tree(float epsilon, int tree_type, int axis, @@ -744,6 +1022,33 @@ static BVHTree *bvhtree_from_mesh_corner_tris_create_tree(float epsilon, return tree; } +BVHTree *bvhtree_from_editmesh_looptris_ex(BVHTreeFromEditMesh *data, + BMEditMesh *em, + const BitSpan corner_tris_mask, + int corner_tris_num_active, + float epsilon, + int tree_type, + int axis) +{ + /* BMESH specific check that we have tessfaces, + * we _could_ tessellate here but rather not - campbell */ + BVHTree *tree = bvhtree_from_editmesh_corner_tris_create_tree( + epsilon, tree_type, axis, em, corner_tris_mask, corner_tris_num_active); + + bvhtree_balance(tree, false); + + if (data) { + bvhtree_from_editmesh_setup_data(tree, BVHTREE_FROM_EM_LOOPTRIS, data); + } + return tree; +} + +BVHTree *bvhtree_from_editmesh_corner_tris( + BVHTreeFromEditMesh *data, BMEditMesh *em, float epsilon, int tree_type, int axis) +{ + return bvhtree_from_editmesh_looptris_ex(data, em, {}, -1, epsilon, tree_type, axis); +} + BVHTree *bvhtree_from_mesh_corner_tris_ex(BVHTreeFromMesh *data, const Span vert_positions, const Span corner_verts, @@ -905,6 +1210,9 @@ BVHTree *BKE_bvhtree_from_mesh_get(BVHTreeFromMesh *data, 0.0f, tree_type, 6, positions, corner_verts, corner_tris, {}, -1); break; } + case BVHTREE_FROM_EM_LOOSEVERTS: + case BVHTREE_FROM_EM_EDGES: + case BVHTREE_FROM_EM_LOOPTRIS: case BVHTREE_MAX_ITEM: BLI_assert_unreachable(); break; @@ -932,125 +1240,94 @@ BVHTree *BKE_bvhtree_from_mesh_get(BVHTreeFromMesh *data, return data->tree; } -void BKE_bvhtree_from_mesh_tris_init(const Mesh &mesh, - const blender::IndexMask &faces_mask, - BVHTreeFromMesh &r_data) +static BitVector<> bmverts_loose_map_get(BMesh *bm, int *r_bmvert_active_len) { - using namespace blender; - using namespace blender::bke; + BitVector<> bmvert_mask(bm->totvert); - if (faces_mask.size() == mesh.faces_num) { - /* Can use cache if all faces are in the bvh tree. */ - BKE_bvhtree_from_mesh_get(&r_data, &mesh, BVHTREE_FROM_CORNER_TRIS, 2); - return; - } - - const Span positions = mesh.vert_positions(); - const Span edges = mesh.edges(); - const Span corner_verts = mesh.corner_verts(); - const OffsetIndices faces = mesh.faces(); - const Span corner_tris = mesh.corner_tris(); - bvhtree_from_mesh_setup_data(nullptr, - BVHTREE_FROM_CORNER_TRIS, - positions, - edges, - corner_verts, - corner_tris, - nullptr, - &r_data); - - int tris_num = 0; - faces_mask.foreach_index( - [&](const int i) { tris_num += mesh::face_triangles_num(faces[i].size()); }); - - int active_num = -1; - BVHTree *tree = bvhtree_new_common(0.0f, 2, 6, tris_num, active_num); - r_data.tree = tree; - if (tree == nullptr) { - return; - } - - faces_mask.foreach_index([&](const int face_i) { - const IndexRange triangles_range = mesh::face_triangles_range(faces, face_i); - for (const int tri_i : triangles_range) { - float co[3][3]; - copy_v3_v3(co[0], positions[corner_verts[corner_tris[tri_i][0]]]); - copy_v3_v3(co[1], positions[corner_verts[corner_tris[tri_i][1]]]); - copy_v3_v3(co[2], positions[corner_verts[corner_tris[tri_i][2]]]); - - BLI_bvhtree_insert(tree, tri_i, co[0], 3); + int i, bmvert_loose_len = 0; + BMIter iter; + BMVert *v; + BM_ITER_MESH_INDEX (v, &iter, bm, BM_VERTS_OF_MESH, i) { + if (v->e == nullptr) { + bmvert_mask[i].set(); + bmvert_loose_len++; } - }); + } - BLI_bvhtree_balance(tree); + *r_bmvert_active_len = bmvert_loose_len; + + return bmvert_mask; } -void BKE_bvhtree_from_mesh_edges_init(const Mesh &mesh, - const blender::IndexMask &edges_mask, - BVHTreeFromMesh &r_data) +BVHTree *BKE_bvhtree_from_editmesh_get(BVHTreeFromEditMesh *data, + BMEditMesh *em, + const int tree_type, + const BVHCacheType bvh_cache_type, + BVHCache **bvh_cache_p, + std::mutex *mesh_eval_mutex) { - using namespace blender; - using namespace blender::bke; + bool lock_started = false; - if (edges_mask.size() == mesh.edges_num) { - /* Can use cache if all edges are in the bvh tree. */ - BKE_bvhtree_from_mesh_get(&r_data, &mesh, BVHTREE_FROM_EDGES, 2); - return; + bvhtree_from_editmesh_setup_data(nullptr, bvh_cache_type, data); + + if (bvh_cache_p) { + data->cached = bvhcache_find( + bvh_cache_p, bvh_cache_type, &data->tree, &lock_started, mesh_eval_mutex); + + if (data->cached) { + BLI_assert(lock_started == false); + return data->tree; + } } - const Span positions = mesh.vert_positions(); - const Span edges = mesh.edges(); - bvhtree_from_mesh_setup_data( - nullptr, BVHTREE_FROM_EDGES, positions, edges, {}, {}, nullptr, &r_data); - - int active_num = -1; - BVHTree *tree = bvhtree_new_common(0.0f, 2, 6, edges_mask.size(), active_num); - r_data.tree = tree; - if (tree == nullptr) { - return; + switch (bvh_cache_type) { + case BVHTREE_FROM_EM_LOOSEVERTS: { + int mask_bits_act_len = -1; + const BitVector<> mask = bmverts_loose_map_get(em->bm, &mask_bits_act_len); + data->tree = bvhtree_from_editmesh_verts_create_tree( + 0.0f, tree_type, 6, em, mask, mask_bits_act_len); + break; + } + case BVHTREE_FROM_EM_EDGES: + data->tree = bvhtree_from_editmesh_edges_create_tree(0.0f, tree_type, 6, em, {}, -1); + break; + case BVHTREE_FROM_EM_LOOPTRIS: + data->tree = bvhtree_from_editmesh_corner_tris_create_tree(0.0f, tree_type, 6, em, {}, -1); + break; + case BVHTREE_FROM_VERTS: + case BVHTREE_FROM_EDGES: + case BVHTREE_FROM_FACES: + case BVHTREE_FROM_CORNER_TRIS: + case BVHTREE_FROM_CORNER_TRIS_NO_HIDDEN: + case BVHTREE_FROM_LOOSEVERTS: + case BVHTREE_FROM_LOOSEEDGES: + case BVHTREE_MAX_ITEM: + BLI_assert(false); + break; } - edges_mask.foreach_index([&](const int edge_i) { - const int2 &edge = edges[edge_i]; - float co[2][3]; - copy_v3_v3(co[0], positions[edge[0]]); - copy_v3_v3(co[1], positions[edge[1]]); - BLI_bvhtree_insert(tree, edge_i, co[0], 2); - }); + bvhtree_balance(data->tree, lock_started); - BLI_bvhtree_balance(tree); -} - -void BKE_bvhtree_from_mesh_verts_init(const Mesh &mesh, - const blender::IndexMask &verts_mask, - BVHTreeFromMesh &r_data) -{ - using namespace blender; - using namespace blender::bke; - - if (verts_mask.size() == mesh.verts_num) { - /* Can use cache if all vertices are in the bvh tree. */ - BKE_bvhtree_from_mesh_get(&r_data, &mesh, BVHTREE_FROM_VERTS, 2); - return; + if (bvh_cache_p) { + /* Save on cache for later use */ + // printf("BVHTree built and saved on cache\n"); + BLI_assert(data->cached == false); + data->cached = true; + bvhcache_insert(*bvh_cache_p, data->tree, bvh_cache_type); + bvhcache_unlock(*bvh_cache_p, lock_started); } - const Span positions = mesh.vert_positions(); - bvhtree_from_mesh_setup_data( - nullptr, BVHTREE_FROM_VERTS, positions, {}, {}, {}, nullptr, &r_data); - - int active_num = -1; - BVHTree *tree = bvhtree_new_common(0.0f, 2, 6, verts_mask.size(), active_num); - r_data.tree = tree; - if (tree == nullptr) { - return; +#ifndef NDEBUG + if (data->tree != nullptr) { + if (BLI_bvhtree_get_tree_type(data->tree) != tree_type) { + printf("tree_type %d obtained instead of %d\n", + BLI_bvhtree_get_tree_type(data->tree), + tree_type); + } } +#endif - verts_mask.foreach_index([&](const int vert_i) { - const float3 &position = positions[vert_i]; - BLI_bvhtree_insert(tree, vert_i, position, 1); - }); - - BLI_bvhtree_balance(tree); + return data->tree; } /** \} */ @@ -1059,6 +1336,16 @@ void BKE_bvhtree_from_mesh_verts_init(const Mesh &mesh, /** \name Free Functions * \{ */ +void free_bvhtree_from_editmesh(BVHTreeFromEditMesh *data) +{ + if (data->tree) { + if (!data->cached) { + BLI_bvhtree_free(data->tree); + } + memset(data, 0, sizeof(*data)); + } +} + void free_bvhtree_from_mesh(BVHTreeFromMesh *data) { if (data->tree && !data->cached) { @@ -1074,25 +1361,29 @@ void free_bvhtree_from_mesh(BVHTreeFromMesh *data) /** \name Point Cloud BVH Building * \{ */ -void BKE_bvhtree_from_pointcloud_get(const PointCloud &pointcloud, - const blender::IndexMask &points_mask, - BVHTreeFromPointCloud &r_data) +[[nodiscard]] BVHTree *BKE_bvhtree_from_pointcloud_get(BVHTreeFromPointCloud *data, + const PointCloud *pointcloud, + const int tree_type) { - int active_num = -1; - BVHTree *tree = bvhtree_new_common(0.0f, 2, 6, points_mask.size(), active_num); - r_data.tree = tree; + int tot_point = pointcloud->totpoint; + BVHTree *tree = bvhtree_new_common(0.0f, tree_type, 6, tot_point, tot_point); if (!tree) { - return; + return nullptr; } - const Span positions = pointcloud.positions(); - points_mask.foreach_index([&](const int i) { BLI_bvhtree_insert(tree, i, positions[i], 1); }); + const Span positions = pointcloud->positions(); + for (const int i : positions.index_range()) { + BLI_bvhtree_insert(tree, i, positions[i], 1); + } - BLI_bvhtree_balance(tree); + BLI_assert(BLI_bvhtree_get_len(tree) == tot_point); + bvhtree_balance(tree, false); - r_data.coords = (const float(*)[3])positions.data(); - r_data.tree = tree; - r_data.nearest_callback = nullptr; + data->coords = (const float(*)[3])positions.data(); + data->tree = tree; + data->nearest_callback = nullptr; + + return tree; } void free_bvhtree_from_pointcloud(BVHTreeFromPointCloud *data) diff --git a/source/blender/blenkernel/intern/cachefile.cc b/source/blender/blenkernel/intern/cachefile.cc index 6c4b179eb88..04f00f185a2 100644 --- a/source/blender/blenkernel/intern/cachefile.cc +++ b/source/blender/blenkernel/intern/cachefile.cc @@ -7,9 +7,10 @@ */ #include -#include +#include "DNA_anim_types.h" #include "DNA_cachefile_types.h" +#include "DNA_constraint_types.h" #include "DNA_object_types.h" #include "DNA_scene_types.h" @@ -21,14 +22,16 @@ #include "BLI_threads.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" -#include "BKE_bpath.hh" -#include "BKE_cachefile.hh" +#include "BKE_anim_data.h" +#include "BKE_bpath.h" +#include "BKE_cachefile.h" #include "BKE_idtype.hh" #include "BKE_lib_id.hh" #include "BKE_main.hh" -#include "BKE_scene.hh" +#include "BKE_modifier.hh" +#include "BKE_scene.h" #include "DEG_depsgraph_query.hh" @@ -60,7 +63,6 @@ static void cache_file_init_data(ID *id) } static void cache_file_copy_data(Main * /*bmain*/, - std::optional /*owner_library*/, ID *id_dst, const ID *id_src, const int /*flag*/) @@ -123,7 +125,6 @@ static void cache_file_blend_read_data(BlendDataReader *reader, ID *id) IDTypeInfo IDType_ID_CF = { /*id_code*/ ID_CF, /*id_filter*/ FILTER_ID_CF, - /*dependencies_id_types*/ 0, /*main_listbase_index*/ INDEX_ID_CF, /*struct_size*/ sizeof(CacheFile), /*name*/ "CacheFile", @@ -170,7 +171,7 @@ void BKE_cachefile_reader_open(CacheFile *cache_file, { #if defined(WITH_ALEMBIC) || defined(WITH_USD) - BLI_assert(cache_file->id.tag & LIB_TAG_COPIED_ON_EVAL); + BLI_assert(cache_file->id.tag & LIB_TAG_COPIED_ON_WRITE); if (cache_file->handle == nullptr) { return; @@ -222,7 +223,7 @@ void BKE_cachefile_reader_free(CacheFile *cache_file, CacheReader **reader) BLI_spin_lock(&spin); if (*reader != nullptr) { if (cache_file) { - BLI_assert(cache_file->id.tag & LIB_TAG_COPIED_ON_EVAL); + BLI_assert(cache_file->id.tag & LIB_TAG_COPIED_ON_WRITE); switch (cache_file->type) { case CACHEFILE_TYPE_ALEMBIC: @@ -330,12 +331,12 @@ void BKE_cachefile_reload(Depsgraph *depsgraph, CacheFile *cache_file) cachefile_handle_free(cache_file_eval); } - DEG_id_tag_update(&cache_file->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&cache_file->id, ID_RECALC_COPY_ON_WRITE); } void BKE_cachefile_eval(Main *bmain, Depsgraph *depsgraph, CacheFile *cache_file) { - BLI_assert(cache_file->id.tag & LIB_TAG_COPIED_ON_EVAL); + BLI_assert(cache_file->id.tag & LIB_TAG_COPIED_ON_WRITE); /* Compute filepath. */ char filepath[FILE_MAX]; diff --git a/source/blender/blenkernel/intern/callbacks.cc b/source/blender/blenkernel/intern/callbacks.cc index dd656074ae4..309b6124ce0 100644 --- a/source/blender/blenkernel/intern/callbacks.cc +++ b/source/blender/blenkernel/intern/callbacks.cc @@ -9,12 +9,13 @@ #include "BLI_listbase.h" #include "BLI_utildefines.h" -#include "BKE_callbacks.hh" +#include "BKE_callbacks.h" #include "MEM_guardedalloc.h" #include "RNA_access.hh" #include "RNA_prototypes.h" +#include "RNA_types.hh" static ListBase callback_slots[BKE_CB_EVT_TOT] = {{nullptr}}; diff --git a/source/blender/blenkernel/intern/camera.cc b/source/blender/blenkernel/intern/camera.cc index 877397f2bfd..875006487c0 100644 --- a/source/blender/blenkernel/intern/camera.cc +++ b/source/blender/blenkernel/intern/camera.cc @@ -8,7 +8,6 @@ #include #include -#include /* Allow using deprecated functionality for .blend file I/O. */ #define DNA_DEPRECATED_ALLOW @@ -30,16 +29,19 @@ #include "BLI_utildefines.h" #include "BKE_action.h" +#include "BKE_anim_data.h" #include "BKE_camera.h" #include "BKE_idprop.h" #include "BKE_idtype.hh" +#include "BKE_layer.hh" #include "BKE_lib_id.hh" #include "BKE_lib_query.hh" +#include "BKE_main.hh" #include "BKE_object.hh" -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "BKE_screen.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DEG_depsgraph_query.hh" @@ -69,16 +71,12 @@ static void camera_init_data(ID *id) * * \param flag: Copying options (see BKE_lib_id.hh's LIB_ID_COPY_... flags for more). */ -static void camera_copy_data(Main * /*bmain*/, - std::optional /*owner_library*/, - ID *id_dst, - const ID *id_src, - const int flag) +static void camera_copy_data(Main * /*bmain*/, ID *id_dst, const ID *id_src, const int flag) { Camera *cam_dst = (Camera *)id_dst; const Camera *cam_src = (const Camera *)id_src; - /* We never handle user-count here for owned data. */ + /* We never handle user-count here for own data. */ const int flag_subdata = flag | LIB_ID_CREATE_NO_USER_REFCOUNT; BLI_listbase_clear(&cam_dst->bg_images); @@ -234,7 +232,6 @@ static void camera_blend_read_data(BlendDataReader *reader, ID *id) IDTypeInfo IDType_ID_CA = { /*id_code*/ ID_CA, /*id_filter*/ FILTER_ID_CA, - /*dependencies_id_types*/ FILTER_ID_OB | FILTER_ID_IM, /*main_listbase_index*/ INDEX_ID_CA, /*struct_size*/ sizeof(Camera), /*name*/ "Camera", @@ -278,24 +275,22 @@ void *BKE_camera_add(Main *bmain, const char *name) float BKE_camera_object_dof_distance(const Object *ob) { - const Camera *cam = (const Camera *)ob->data; + Camera *cam = (Camera *)ob->data; if (ob->type != OB_CAMERA) { return 0.0f; } if (cam->dof.focus_object) { float view_dir[3], dof_dir[3]; - normalize_v3_v3(view_dir, ob->object_to_world().ptr()[2]); + normalize_v3_v3(view_dir, ob->object_to_world[2]); bPoseChannel *pchan = BKE_pose_channel_find_name(cam->dof.focus_object->pose, cam->dof.focus_subtarget); if (pchan) { float posemat[4][4]; - mul_m4_m4m4(posemat, cam->dof.focus_object->object_to_world().ptr(), pchan->pose_mat); - sub_v3_v3v3(dof_dir, ob->object_to_world().location(), posemat[3]); + mul_m4_m4m4(posemat, cam->dof.focus_object->object_to_world, pchan->pose_mat); + sub_v3_v3v3(dof_dir, ob->object_to_world[3], posemat[3]); } else { - sub_v3_v3v3(dof_dir, - ob->object_to_world().location(), - cam->dof.focus_object->object_to_world().location()); + sub_v3_v3v3(dof_dir, ob->object_to_world[3], cam->dof.focus_object->object_to_world[3]); } return fabsf(dot_v3v3(view_dir, dof_dir)); } @@ -355,7 +350,7 @@ void BKE_camera_params_from_object(CameraParams *params, const Object *cam_ob) if (cam_ob->type == OB_CAMERA) { /* camera object */ - const Camera *cam = static_cast(cam_ob->data); + Camera *cam = static_cast(cam_ob->data); if (cam->type == CAM_ORTHO) { params->is_ortho = true; @@ -690,7 +685,7 @@ static void camera_frame_fit_data_init(const Scene *scene, BKE_camera_params_compute_matrix(params); /* initialize callback data */ - copy_m3_m4(data->camera_rotmat, (float(*)[4])ob->object_to_world().ptr()); + copy_m3_m4(data->camera_rotmat, (float(*)[4])ob->object_to_world); normalize_m3(data->camera_rotmat); /* To transform a plane which is in its homogeneous representation (4d vector), * we need the inverse of the transpose of the transform matrix... */ @@ -892,14 +887,14 @@ bool BKE_camera_view_frame_fit_to_coords(const Depsgraph *depsgraph, static void camera_model_matrix(const Object *camera, float r_modelmat[4][4]) { - copy_m4_m4(r_modelmat, camera->object_to_world().ptr()); + copy_m4_m4(r_modelmat, camera->object_to_world); } static void camera_stereo3d_model_matrix(const Object *camera, const bool is_left, float r_modelmat[4][4]) { - const Camera *data = (const Camera *)camera->data; + Camera *data = (Camera *)camera->data; float interocular_distance, convergence_distance; short convergence_mode, pivot; float sizemat[4][4]; @@ -918,7 +913,7 @@ static void camera_stereo3d_model_matrix(const Object *camera, } float size[3]; - mat4_to_size(size, camera->object_to_world().ptr()); + mat4_to_size(size, camera->object_to_world); size_to_mat4(sizemat, size); if (pivot == CAM_S3D_PIVOT_CENTER) { @@ -958,7 +953,7 @@ static void camera_stereo3d_model_matrix(const Object *camera, toeinmat[3][0] = interocular_distance * fac_signed; /* transform */ - normalize_m4_m4(r_modelmat, camera->object_to_world().ptr()); + normalize_m4_m4(r_modelmat, camera->object_to_world); mul_m4_m4m4(r_modelmat, r_modelmat, toeinmat); /* scale back to the original size */ @@ -966,7 +961,7 @@ static void camera_stereo3d_model_matrix(const Object *camera, } else { /* CAM_S3D_PIVOT_LEFT, CAM_S3D_PIVOT_RIGHT */ /* rotate perpendicular to the interocular line */ - normalize_m4_m4(r_modelmat, camera->object_to_world().ptr()); + normalize_m4_m4(r_modelmat, camera->object_to_world); mul_m4_m4m4(r_modelmat, r_modelmat, rotmat); /* translate along the interocular line */ @@ -982,7 +977,7 @@ static void camera_stereo3d_model_matrix(const Object *camera, } } else { - normalize_m4_m4(r_modelmat, camera->object_to_world().ptr()); + normalize_m4_m4(r_modelmat, camera->object_to_world); /* translate - no rotation in CAM_S3D_OFFAXIS, CAM_S3D_PARALLEL */ translate_m4(r_modelmat, -interocular_distance * fac_signed, 0.0f, 0.0f); @@ -1060,6 +1055,7 @@ void BKE_camera_multiview_window_matrix(const RenderData *rd, bool BKE_camera_multiview_spherical_stereo(const RenderData *rd, const Object *camera) { + Camera *cam; const bool is_multiview = (rd && rd->scemode & R_MULTIVIEW) != 0; if (!is_multiview) { @@ -1070,7 +1066,7 @@ bool BKE_camera_multiview_spherical_stereo(const RenderData *rd, const Object *c return false; } - const Camera *cam = static_cast(camera->data); + cam = static_cast(camera->data); if ((rd->views_format == SCE_VIEWS_FORMAT_STEREO_3D) && ELEM(cam->type, CAM_PANO, CAM_PERSP) && ((cam->stereo.flag & CAM_S3D_SPHERICAL) != 0)) @@ -1131,7 +1127,7 @@ Object *BKE_camera_multiview_render(const Scene *scene, Object *camera, const ch static float camera_stereo3d_shift_x(const Object *camera, const char *viewname) { - const Camera *data = static_cast(camera->data); + Camera *data = static_cast(camera->data); float shift = data->shiftx; float interocular_distance, convergence_distance; short convergence_mode, pivot; @@ -1173,7 +1169,7 @@ float BKE_camera_multiview_shift_x(const RenderData *rd, const char *viewname) { const bool is_multiview = (rd && rd->scemode & R_MULTIVIEW) != 0; - const Camera *data = static_cast(camera->data); + Camera *data = static_cast(camera->data); BLI_assert(camera->type == OB_CAMERA); @@ -1221,7 +1217,7 @@ CameraBGImage *BKE_camera_background_image_new(Camera *cam) return bgpic; } -CameraBGImage *BKE_camera_background_image_copy(const CameraBGImage *bgpic_src, const int flag) +CameraBGImage *BKE_camera_background_image_copy(CameraBGImage *bgpic_src, const int flag) { CameraBGImage *bgpic_dst = static_cast(MEM_dupallocN(bgpic_src)); diff --git a/source/blender/blenkernel/intern/cdderivedmesh.cc b/source/blender/blenkernel/intern/cdderivedmesh.cc index dda11c71d08..0d6cf390b7b 100644 --- a/source/blender/blenkernel/intern/cdderivedmesh.cc +++ b/source/blender/blenkernel/intern/cdderivedmesh.cc @@ -12,16 +12,23 @@ #include #include +#include "atomic_ops.h" + #include "BLI_utildefines.h" #include "BKE_DerivedMesh.hh" #include "BKE_cdderivedmesh.h" +#include "BKE_curve.hh" #include "BKE_editmesh.hh" +#include "BKE_mesh.hh" #include "BKE_mesh_mapping.hh" +#include "BKE_object.hh" +#include "BKE_paint.hh" #include "BKE_pbvh.hh" #include "DNA_curve_types.h" /* for Curve */ #include "DNA_mesh_types.h" +#include "DNA_object_types.h" #include "MEM_guardedalloc.h" @@ -31,7 +38,7 @@ struct CDDerivedMesh { /* these point to data in the DerivedMesh custom data layers, * they are only here for efficiency and convenience */ float (*vert_positions)[3]; - blender::int2 *medge; + vec2i *medge; MFace *mface; int *corner_verts; int *corner_edges; @@ -72,7 +79,7 @@ static void cdDM_copyVertArray(DerivedMesh *dm, float (*r_positions)[3]) memcpy(r_positions, cddm->vert_positions, sizeof(float[3]) * dm->numVertData); } -static void cdDM_copyEdgeArray(DerivedMesh *dm, blender::int2 *r_edge) +static void cdDM_copyEdgeArray(DerivedMesh *dm, vec2i *r_edge) { CDDerivedMesh *cddm = (CDDerivedMesh *)dm; memcpy(r_edge, cddm->medge, sizeof(*r_edge) * dm->numEdgeData); @@ -168,7 +175,7 @@ static DerivedMesh *cdDM_from_mesh_ex(Mesh *mesh, const CustomData_MeshMasks *ma cddm->vert_positions = static_cast(CustomData_get_layer_named_for_write( &dm->vertData, CD_PROP_FLOAT3, "position", mesh->verts_num)); - cddm->medge = static_cast(CustomData_get_layer_named_for_write( + cddm->medge = static_cast(CustomData_get_layer_named_for_write( &dm->edgeData, CD_PROP_INT32_2D, ".edge_verts", mesh->edges_num)); cddm->corner_verts = static_cast(CustomData_get_layer_named_for_write( &dm->loopData, CD_PROP_INT32, ".corner_vert", mesh->corners_num)); diff --git a/source/blender/blenkernel/intern/cloth.cc b/source/blender/blenkernel/intern/cloth.cc index a0dd427d97a..68be8a1c45d 100644 --- a/source/blender/blenkernel/intern/cloth.cc +++ b/source/blender/blenkernel/intern/cloth.cc @@ -29,9 +29,10 @@ #include "BKE_cloth.hh" #include "BKE_customdata.hh" #include "BKE_effect.h" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_lib_id.hh" #include "BKE_mesh.hh" +#include "BKE_mesh_runtime.hh" #include "BKE_modifier.hh" #include "BKE_pointcache.h" @@ -272,7 +273,7 @@ static int do_step_cloth( /* Get the current position. */ copy_v3_v3(verts->xconst, positions[i]); - mul_m4_v3(ob->object_to_world().ptr(), verts->xconst); + mul_m4_v3(ob->object_to_world, verts->xconst); if (vert_mass_changed) { verts->mass = clmd->sim_parms->mass; @@ -575,11 +576,11 @@ static void cloth_to_object(Object *ob, ClothModifierData *clmd, float (*vertexC if (clmd->clothObject) { /* Inverse matrix is not up to date. */ - invert_m4_m4(ob->runtime->world_to_object.ptr(), ob->object_to_world().ptr()); + invert_m4_m4(ob->world_to_object, ob->object_to_world); for (i = 0; i < cloth->mvert_num; i++) { copy_v3_v3(vertexCos[i], cloth->verts[i].x); - mul_m4_v3(ob->world_to_object().ptr(), vertexCos[i]); /* cloth is in global coords */ + mul_m4_v3(ob->world_to_object, vertexCos[i]); /* cloth is in global coords */ } } } @@ -760,11 +761,11 @@ static bool cloth_from_object( if (first) { copy_v3_v3(verts->x, positions[i]); - mul_m4_v3(ob->object_to_world().ptr(), verts->x); + mul_m4_v3(ob->object_to_world, verts->x); if (shapekey_rest) { copy_v3_v3(verts->xrest, shapekey_rest[i]); - mul_m4_v3(ob->object_to_world().ptr(), verts->xrest); + mul_m4_v3(ob->object_to_world, verts->xrest); } else { copy_v3_v3(verts->xrest, verts->x); @@ -1154,7 +1155,7 @@ static void cloth_update_verts(Object *ob, ClothModifierData *clmd, Mesh *mesh) /* vertex count is already ensured to match */ for (i = 0; i < mesh->verts_num; i++, verts++) { copy_v3_v3(verts->xrest, positions[i]); - mul_m4_v3(ob->object_to_world().ptr(), verts->xrest); + mul_m4_v3(ob->object_to_world, verts->xrest); } } diff --git a/source/blender/blenkernel/intern/collection.cc b/source/blender/blenkernel/intern/collection.cc index 5f0a29418fc..1785e0913ce 100644 --- a/source/blender/blenkernel/intern/collection.cc +++ b/source/blender/blenkernel/intern/collection.cc @@ -12,17 +12,16 @@ #include "CLG_log.h" #include -#include #include "BLI_blenlib.h" #include "BLI_iterator.h" #include "BLI_listbase.h" #include "BLI_math_base.h" #include "BLI_threads.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" -#include "BKE_anim_data.hh" -#include "BKE_collection.hh" +#include "BKE_anim_data.h" +#include "BKE_collection.h" #include "BKE_idprop.h" #include "BKE_idtype.hh" #include "BKE_layer.hh" @@ -33,7 +32,7 @@ #include "BKE_object.hh" #include "BKE_preview_image.hh" #include "BKE_rigidbody.h" -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "DNA_defaults.h" @@ -133,11 +132,7 @@ static void collection_init_data(ID *id) * * \param flag: Copying options (see BKE_lib_id.hh's LIB_ID_COPY_... flags for more). */ -static void collection_copy_data(Main *bmain, - std::optional /*owner_library*/, - ID *id_dst, - const ID *id_src, - const int flag) +static void collection_copy_data(Main *bmain, ID *id_dst, const ID *id_src, const int flag) { Collection *collection_dst = (Collection *)id_dst; const Collection *collection_src = (const Collection *)id_src; @@ -243,6 +238,7 @@ static ID **collection_owner_pointer_get(ID *id) if ((id->flag & LIB_EMBEDDED_DATA) == 0) { return nullptr; } + BLI_assert((id->tag & LIB_TAG_NO_MAIN) == 0); Collection *master_collection = (Collection *)id; BLI_assert((master_collection->flag & COLLECTION_IS_MASTER) != 0); @@ -356,7 +352,6 @@ static void collection_blend_read_after_liblink(BlendLibReader * /*reader*/, ID IDTypeInfo IDType_ID_GR = { /*id_code*/ ID_GR, /*id_filter*/ FILTER_ID_GR, - /*dependencies_id_types*/ FILTER_ID_OB | FILTER_ID_GR, /*main_listbase_index*/ INDEX_ID_GR, /*struct_size*/ sizeof(Collection), /*name*/ "Collection", @@ -934,15 +929,13 @@ Collection *BKE_collection_master_add(Scene *scene) BLI_assert(scene != nullptr && scene->master_collection == nullptr); /* Not an actual datablock, but owned by scene. */ - Collection *master_collection = static_cast(BKE_libblock_alloc_in_lib( - nullptr, scene->id.lib, ID_GR, BKE_SCENE_COLLECTION_NAME, LIB_ID_CREATE_NO_MAIN)); + Collection *master_collection = static_cast( + BKE_libblock_alloc(nullptr, ID_GR, BKE_SCENE_COLLECTION_NAME, LIB_ID_CREATE_NO_MAIN)); master_collection->id.flag |= LIB_EMBEDDED_DATA; master_collection->owner_id = &scene->id; master_collection->flag |= COLLECTION_IS_MASTER; master_collection->color_tag = COLLECTION_COLOR_NONE; - BLI_assert(scene->id.lib == master_collection->id.lib); - return master_collection; } @@ -1865,7 +1858,7 @@ void BKE_collection_parent_relations_rebuild(Collection *collection) /* Can happen when remapping data partially out-of-Main (during advanced ID management * operations like lib-override resync e.g.). */ - if ((child->collection->id.tag & (LIB_TAG_NO_MAIN | LIB_TAG_COPIED_ON_EVAL)) != 0) { + if ((child->collection->id.tag & (LIB_TAG_NO_MAIN | LIB_TAG_COPIED_ON_WRITE)) != 0) { continue; } @@ -1889,7 +1882,7 @@ static void collection_parents_rebuild_recursive(Collection *collection) LISTBASE_FOREACH (CollectionChild *, child, &collection->children) { /* See comment above in `BKE_collection_parent_relations_rebuild`. */ - if ((child->collection->id.tag & (LIB_TAG_NO_MAIN | LIB_TAG_COPIED_ON_EVAL)) != 0) { + if ((child->collection->id.tag & (LIB_TAG_NO_MAIN | LIB_TAG_COPIED_ON_WRITE)) != 0) { continue; } collection_parents_rebuild_recursive(child->collection); diff --git a/source/blender/blenkernel/intern/collision.cc b/source/blender/blenkernel/intern/collision.cc index 08dde5b9bac..d3e6c41f60a 100644 --- a/source/blender/blenkernel/intern/collision.cc +++ b/source/blender/blenkernel/intern/collision.cc @@ -11,10 +11,14 @@ #include "MEM_guardedalloc.h" #include "DNA_cloth_types.h" +#include "DNA_collection_types.h" +#include "DNA_effect_types.h" #include "DNA_object_force_types.h" #include "DNA_object_types.h" #include "DNA_scene_types.h" +#include "BLI_blenlib.h" +#include "BLI_linklist.h" #include "BLI_math_geom.h" #include "BLI_math_vector.h" #include "BLI_task.h" @@ -22,8 +26,11 @@ #include "BLI_utildefines.h" #include "BKE_cloth.hh" -#include "BKE_collection.hh" +#include "BKE_collection.h" +#include "BKE_effect.h" +#include "BKE_layer.hh" #include "BKE_modifier.hh" +#include "BKE_scene.h" #include "BKE_collision.h" #include "BLI_kdopbvh.h" diff --git a/source/blender/blenkernel/intern/colorband.cc b/source/blender/blenkernel/intern/colorband.cc index f34d65d01ee..d5a8842199e 100644 --- a/source/blender/blenkernel/intern/colorband.cc +++ b/source/blender/blenkernel/intern/colorband.cc @@ -18,6 +18,7 @@ #include "BKE_colorband.hh" #include "BKE_key.hh" +#include "BKE_material.h" void BKE_colorband_init(ColorBand *coba, bool rangetype) { diff --git a/source/blender/blenkernel/intern/colortools.cc b/source/blender/blenkernel/intern/colortools.cc index 7122ca1d6c5..e492040e310 100644 --- a/source/blender/blenkernel/intern/colortools.cc +++ b/source/blender/blenkernel/intern/colortools.cc @@ -24,7 +24,7 @@ #include "BKE_colortools.hh" #include "BKE_curve.hh" -#include "BKE_fcurve.hh" +#include "BKE_fcurve.h" #include "IMB_colormanagement.hh" #include "IMB_imbuf_types.hh" diff --git a/source/blender/blenkernel/intern/constraint.cc b/source/blender/blenkernel/intern/constraint.cc index f624ba63ce0..27669a8da92 100644 --- a/source/blender/blenkernel/intern/constraint.cc +++ b/source/blender/blenkernel/intern/constraint.cc @@ -26,7 +26,7 @@ #include "BLI_math_vector.h" #include "BLI_string_utils.hh" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_action_types.h" #include "DNA_armature_types.h" @@ -49,7 +49,7 @@ #include "BKE_animsys.h" #include "BKE_armature.hh" #include "BKE_bvhutils.hh" -#include "BKE_cachefile.hh" +#include "BKE_cachefile.h" #include "BKE_camera.h" #include "BKE_constraint.h" #include "BKE_curve.hh" @@ -57,7 +57,7 @@ #include "BKE_displist.h" #include "BKE_editmesh.hh" #include "BKE_fcurve_driver.h" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_idprop.h" #include "BKE_lib_id.hh" #include "BKE_lib_query.hh" @@ -66,7 +66,7 @@ #include "BKE_movieclip.h" #include "BKE_object.hh" #include "BKE_object_types.hh" -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "BKE_shrinkwrap.hh" #include "BKE_tracking.h" @@ -155,7 +155,7 @@ bConstraintOb *BKE_constraints_make_evalob( /* Quaternion/Axis-Angle, so Eulers should just use default order. */ cob->rotOrder = EULER_ORDER_DEFAULT; } - copy_m4_m4(cob->matrix, ob->object_to_world().ptr()); + copy_m4_m4(cob->matrix, ob->object_to_world); } else { unit_m4(cob->matrix); @@ -181,7 +181,7 @@ bConstraintOb *BKE_constraints_make_evalob( } /* matrix in world-space */ - mul_m4_m4m4(cob->matrix, ob->object_to_world().ptr(), cob->pchan->pose_mat); + mul_m4_m4m4(cob->matrix, ob->object_to_world, cob->pchan->pose_mat); } else { unit_m4(cob->matrix); @@ -222,7 +222,7 @@ void BKE_constraints_clear_evalob(bConstraintOb *cob) /* cob->ob might not exist! */ if (cob->ob) { /* copy new ob-matrix back to owner */ - copy_m4_m4(cob->ob->runtime->object_to_world.ptr(), cob->matrix); + copy_m4_m4(cob->ob->object_to_world, cob->matrix); /* copy inverse of delta back to owner */ invert_m4_m4(cob->ob->constinv, delta); @@ -233,7 +233,7 @@ void BKE_constraints_clear_evalob(bConstraintOb *cob) /* cob->ob or cob->pchan might not exist */ if (cob->ob && cob->pchan) { /* copy new pose-matrix back to owner */ - mul_m4_m4m4(cob->pchan->pose_mat, cob->ob->world_to_object().ptr(), cob->matrix); + mul_m4_m4m4(cob->pchan->pose_mat, cob->ob->world_to_object, cob->matrix); /* copy inverse of delta back to owner */ invert_m4_m4(cob->pchan->constinv, delta); @@ -282,7 +282,7 @@ void BKE_constraint_mat_convertspace(Object *ob, } else { /* World to pose. */ - invert_m4_m4(imat, ob->object_to_world().ptr()); + invert_m4_m4(imat, ob->object_to_world); mul_m4_m4m4(mat, imat, mat); /* Use pose-space as stepping stone for other spaces. */ @@ -326,7 +326,7 @@ void BKE_constraint_mat_convertspace(Object *ob, } else { /* Pose to world. */ - mul_m4_m4m4(mat, ob->object_to_world().ptr(), mat); + mul_m4_m4m4(mat, ob->object_to_world, mat); /* Use world-space as stepping stone for other spaces. */ if (to != CONSTRAINT_SPACE_WORLD) { /* Call self with slightly different values. */ @@ -436,7 +436,7 @@ void BKE_constraint_mat_convertspace(Object *ob, /* Check if object has a parent. */ if (ob->parent) { /* 'subtract' parent's effects from owner. */ - mul_m4_m4m4(diff_mat, ob->parent->object_to_world().ptr(), ob->parentinv); + mul_m4_m4m4(diff_mat, ob->parent->object_to_world, ob->parentinv); invert_m4_m4_safe(imat, diff_mat); mul_m4_m4m4(mat, imat, mat); } @@ -472,7 +472,7 @@ void BKE_constraint_mat_convertspace(Object *ob, /* check that object has a parent - otherwise this won't work */ if (ob->parent) { /* 'add' parent's effect back to owner */ - mul_m4_m4m4(diff_mat, ob->parent->object_to_world().ptr(), ob->parentinv); + mul_m4_m4m4(diff_mat, ob->parent->object_to_world, ob->parentinv); mul_m4_m4m4(mat, diff_mat, mat); } else { @@ -518,14 +518,14 @@ static void contarget_get_mesh_mat(Object *ob, const char *substring, float mat[ /* when not in EditMode, use the 'final' evaluated mesh, depsgraph * ensures we build with CD_MDEFORMVERT layer */ - const Mesh *mesh_eval = BKE_object_get_evaluated_mesh(ob); + const Mesh *me_eval = BKE_object_get_evaluated_mesh(ob); BMEditMesh *em = BKE_editmesh_from_object(ob); float plane[3]; float imat[3][3], tmat[3][3]; const int defgroup = BKE_object_defgroup_name_index(ob, substring); /* initialize target matrix using target matrix */ - copy_m4_m4(mat, ob->object_to_world().ptr()); + copy_m4_m4(mat, ob->object_to_world); /* get index of vertex group */ if (defgroup == -1) { @@ -553,11 +553,11 @@ static void contarget_get_mesh_mat(Object *ob, const char *substring, float mat[ } } } - else if (mesh_eval) { - const blender::Span positions = mesh_eval->vert_positions(); - const blender::Span vert_normals = mesh_eval->vert_normals(); + else if (me_eval) { + const blender::Span positions = me_eval->vert_positions(); + const blender::Span vert_normals = me_eval->vert_normals(); const MDeformVert *dvert = static_cast( - CustomData_get_layer(&mesh_eval->vert_data, CD_MDEFORMVERT)); + CustomData_get_layer(&me_eval->vert_data, CD_MDEFORMVERT)); /* check that dvert is a valid pointers (just in case) */ if (dvert) { @@ -591,7 +591,7 @@ static void contarget_get_mesh_mat(Object *ob, const char *substring, float mat[ * calc_gizmo_stats, V3D_ORIENT_NORMAL case */ /* We need the transpose of the inverse for a normal. */ - copy_m3_m4(imat, ob->object_to_world().ptr()); + copy_m3_m4(imat, ob->object_to_world); invert_m3_m3(tmat, imat); transpose_m3(tmat); @@ -612,7 +612,7 @@ static void contarget_get_mesh_mat(Object *ob, const char *substring, float mat[ normalize_m4(mat); /* apply the average coordinate as the new location */ - mul_v3_m4v3(mat[3], ob->object_to_world().ptr(), vec); + mul_v3_m4v3(mat[3], ob->object_to_world, vec); } /* function that sets the given matrix based on given vertex group in lattice */ @@ -634,7 +634,7 @@ static void contarget_get_lattice_mat(Object *ob, const char *substring, float m const int defgroup = BKE_object_defgroup_name_index(ob, substring); /* initialize target matrix using target matrix */ - copy_m4_m4(mat, ob->object_to_world().ptr()); + copy_m4_m4(mat, ob->object_to_world); /* get index of vertex group */ if (defgroup == -1) { @@ -668,12 +668,11 @@ static void contarget_get_lattice_mat(Object *ob, const char *substring, float m } } - /* find average location, then multiply by ob->object_to_world().ptr() to find world-space - * location */ + /* find average location, then multiply by ob->object_to_world to find world-space location */ if (grouped) { mul_v3_fl(vec, 1.0f / grouped); } - mul_v3_m4v3(tvec, ob->object_to_world().ptr(), vec); + mul_v3_m4v3(tvec, ob->object_to_world, vec); /* copy new location to matrix */ copy_v3_v3(mat[3], tvec); @@ -692,7 +691,7 @@ static void constraint_target_to_mat4(Object *ob, { /* Case OBJECT */ if (substring[0] == '\0') { - copy_m4_m4(mat, ob->object_to_world().ptr()); + copy_m4_m4(mat, ob->object_to_world); BKE_constraint_mat_convertspace(ob, nullptr, cob, mat, from, to, false); } /* Case VERTEXGROUP */ @@ -727,7 +726,7 @@ static void constraint_target_to_mat4(Object *ob, if (headtail < 0.000001f && !(is_bbone && full_bbone)) { /* skip length interpolation if set to head */ - mul_m4_m4m4(mat, ob->object_to_world().ptr(), pchan->pose_mat); + mul_m4_m4m4(mat, ob->object_to_world, pchan->pose_mat); } else if (is_bbone && pchan->bone->segments == pchan->runtime.bbone_segments) { /* use point along bbone */ @@ -753,7 +752,7 @@ static void constraint_target_to_mat4(Object *ob, mul_v3_m4v3(tempmat[3], pchan->pose_mat, loc); } - mul_m4_m4m4(mat, ob->object_to_world().ptr(), tempmat); + mul_m4_m4m4(mat, ob->object_to_world, tempmat); } else { float tempmat[4][4], loc[3]; @@ -765,11 +764,11 @@ static void constraint_target_to_mat4(Object *ob, copy_m4_m4(tempmat, pchan->pose_mat); copy_v3_v3(tempmat[3], loc); - mul_m4_m4m4(mat, ob->object_to_world().ptr(), tempmat); + mul_m4_m4m4(mat, ob->object_to_world, tempmat); } } else { - copy_m4_m4(mat, ob->object_to_world().ptr()); + copy_m4_m4(mat, ob->object_to_world); } /* convert matrix space as required */ @@ -1079,14 +1078,14 @@ static void childof_evaluate(bConstraint *con, bConstraintOb *cob, ListBase *tar if (data->flag & CHILDOF_SET_INVERSE) { invert_m4_m4(data->invmat, parmat); if (cob->pchan != nullptr) { - mul_m4_series(data->invmat, data->invmat, cob->ob->object_to_world().ptr()); + mul_m4_series(data->invmat, data->invmat, cob->ob->object_to_world); } copy_m4_m4(inverse_matrix, data->invmat); data->flag &= ~CHILDOF_SET_INVERSE; - /* Write the computed matrix back to the master copy if in copy-on-eval evaluation. */ + /* Write the computed matrix back to the master copy if in COW evaluation. */ bConstraint *orig_con = constraint_find_original_for_update(cob, con); if (orig_con != nullptr) { @@ -1399,8 +1398,8 @@ static void kinematic_get_tarmat(Depsgraph * /*depsgraph*/, else { float vec[3]; /* move grabtarget into world space */ - mul_v3_m4v3(vec, ob->object_to_world().ptr(), data->grabtarget); - copy_m4_m4(ct->matrix, ob->object_to_world().ptr()); + mul_v3_m4v3(vec, ob->object_to_world, data->grabtarget); + copy_m4_m4(ct->matrix, ob->object_to_world); copy_v3_v3(ct->matrix[3], vec); } } @@ -1540,7 +1539,7 @@ static void followpath_get_tarmat(Depsgraph * /*depsgraph*/, copy_v3_v3(totmat[3], vec); - mul_m4_m4m4(ct->matrix, ct->tar->object_to_world().ptr(), totmat); + mul_m4_m4m4(ct->matrix, ct->tar->object_to_world, totmat); } } } @@ -2570,7 +2569,7 @@ static void armdef_get_tarmat(Depsgraph * /*depsgraph*/, bPoseChannel *pchan = BKE_pose_channel_find_name(ct->tar->pose, ct->subtarget); if (pchan != nullptr) { - mul_m4_m4m4(ct->matrix, ct->tar->object_to_world().ptr(), pchan->pose_mat); + mul_m4_m4m4(ct->matrix, ct->tar->object_to_world, pchan->pose_mat); return; } } @@ -2627,7 +2626,7 @@ static void armdef_accumulate_bone(const bConstraintTarget *ct, float weight = ct->weight; /* Our object's location in target pose space. */ - invert_m4_m4(iobmat, ct->tar->object_to_world().ptr()); + invert_m4_m4(iobmat, ct->tar->object_to_world); mul_v3_m4v3(co, iobmat, wco); /* Multiply by the envelope weight when appropriate. */ @@ -2652,7 +2651,7 @@ static void armdef_accumulate_bone(const bConstraintTarget *ct, mul_m4_m4m4(basemat, bone->arm_mat, b_bone_rest_mats[index].mat); } - armdef_accumulate_matrix(ct->tar->object_to_world().ptr(), + armdef_accumulate_matrix(ct->tar->object_to_world, iobmat, basemat, b_bone_mats[index + 1].mat, @@ -2666,7 +2665,7 @@ static void armdef_accumulate_bone(const bConstraintTarget *ct, mul_m4_m4m4(basemat, bone->arm_mat, b_bone_rest_mats[index + 1].mat); } - armdef_accumulate_matrix(ct->tar->object_to_world().ptr(), + armdef_accumulate_matrix(ct->tar->object_to_world, iobmat, basemat, b_bone_mats[index + 2].mat, @@ -2677,7 +2676,7 @@ static void armdef_accumulate_bone(const bConstraintTarget *ct, } else { /* Simple bone. This requires DEG_OPCODE_BONE_DONE dependency due to chan_mat. */ - armdef_accumulate_matrix(ct->tar->object_to_world().ptr(), + armdef_accumulate_matrix(ct->tar->object_to_world, iobmat, bone->arm_mat, pchan->chan_mat, @@ -2710,7 +2709,7 @@ static void armdef_evaluate(bConstraint *con, bConstraintOb *cob, ListBase *targ /* For constraints on bones, use the rest position to bind b-bone segments * and envelopes, to allow safely changing the bone location as if parented. */ copy_v3_v3(input_co, cob->pchan->bone->arm_head); - mul_m4_v3(cob->ob->object_to_world().ptr(), input_co); + mul_m4_v3(cob->ob->object_to_world, input_co); } else { copy_v3_v3(input_co, cob->matrix[3]); @@ -3359,7 +3358,7 @@ static void distlimit_evaluate(bConstraint *con, bConstraintOb *cob, ListBase *t if (data->dist == 0) { data->dist = dist; - /* Write the computed distance back to the master copy if in copy-on-eval evaluation. */ + /* Write the computed distance back to the master copy if in COW evaluation. */ bConstraint *orig_con = constraint_find_original_for_update(cob, con); if (orig_con != nullptr) { @@ -3526,7 +3525,7 @@ static void stretchto_evaluate(bConstraint *con, bConstraintOb *cob, ListBase *t if (data->orglength == 0) { data->orglength = dist; - /* Write the computed length back to the master copy if in copy-on-eval evaluation. */ + /* Write the computed length back to the master copy if in COW evaluation. */ bConstraint *orig_con = constraint_find_original_for_update(cob, con); if (orig_con != nullptr) { @@ -3942,7 +3941,7 @@ static void clampto_evaluate(bConstraint *con, bConstraintOb *cob, ListBase *tar unit_m4(totmat); copy_v3_v3(totmat[3], vec); - mul_m4_m4m4(targetMatrix, ct->tar->object_to_world().ptr(), totmat); + mul_m4_m4m4(targetMatrix, ct->tar->object_to_world, totmat); } } @@ -4243,7 +4242,7 @@ static void shrinkwrap_get_tarmat(Depsgraph * /*depsgraph*/, if (BKE_shrinkwrap_init_tree( &tree, target_eval, scon->shrinkType, scon->shrinkMode, do_track_normal)) { - BLI_space_transform_from_matrices(&transform, cob->matrix, ct->tar->object_to_world().ptr()); + BLI_space_transform_from_matrices(&transform, cob->matrix, ct->tar->object_to_world); switch (scon->shrinkType) { case MOD_SHRINKWRAP_NEAREST_SURFACE: @@ -4917,7 +4916,7 @@ static void followtrack_evaluate_using_3d_position_object(FollowTrackContext *co /* Object matrix of the camera. */ float camera_obmat[4][4]; - copy_m4_m4(camera_obmat, camera_object->object_to_world().ptr()); + copy_m4_m4(camera_obmat, camera_object->object_to_world); /* Calculate inverted matrix of the solved camera at the current time. */ float reconstructed_camera_mat[4][4]; @@ -5069,11 +5068,10 @@ static void followtrack_project_to_depth_object_if_needed(FollowTrackContext *co } float depth_object_mat_inv[4][4]; - invert_m4_m4(depth_object_mat_inv, depth_object->object_to_world().ptr()); + invert_m4_m4(depth_object_mat_inv, depth_object->object_to_world); float ray_start[3], ray_end[3]; - mul_v3_m4v3( - ray_start, depth_object_mat_inv, context->camera_object->object_to_world().location()); + mul_v3_m4v3(ray_start, depth_object_mat_inv, context->camera_object->object_to_world[3]); mul_v3_m4v3(ray_end, depth_object_mat_inv, cob->matrix[3]); float ray_direction[3]; @@ -5096,7 +5094,7 @@ static void followtrack_project_to_depth_object_if_needed(FollowTrackContext *co &tree_data); if (result != -1) { - mul_v3_m4v3(cob->matrix[3], depth_object->object_to_world().ptr(), hit.co); + mul_v3_m4v3(cob->matrix[3], depth_object->object_to_world, hit.co); } free_bvhtree_from_mesh(&tree_data); @@ -5144,9 +5142,9 @@ static void followtrack_evaluate_using_2d_position(FollowTrackContext *context, } float disp[3]; - mul_v3_m4v3(disp, camera_object->object_to_world().ptr(), vec); + mul_v3_m4v3(disp, camera_object->object_to_world, vec); - copy_m4_m4(rmat, camera_object->object_to_world().ptr()); + copy_m4_m4(rmat, camera_object->object_to_world); zero_v3(rmat[3]); mul_m4_m4m4(cob->matrix, cob->matrix, rmat); @@ -5168,10 +5166,10 @@ static void followtrack_evaluate_using_2d_position(FollowTrackContext *context, } float disp[3]; - mul_v3_m4v3(disp, camera_object->object_to_world().ptr(), vec); + mul_v3_m4v3(disp, camera_object->object_to_world, vec); /* apply camera rotation so Z-axis would be co-linear */ - copy_m4_m4(rmat, camera_object->object_to_world().ptr()); + copy_m4_m4(rmat, camera_object->object_to_world); zero_v3(rmat[3]); mul_m4_m4m4(cob->matrix, cob->matrix, rmat); @@ -5317,7 +5315,7 @@ static void objectsolver_evaluate(bConstraint *con, bConstraintOb *cob, ListBase BKE_tracking_camera_get_reconstructed_interpolate(tracking, tracking_object, framenr, mat); invert_m4_m4(imat, mat); - mul_m4_m4m4(parmat, camob->object_to_world().ptr(), imat); + mul_m4_m4m4(parmat, camob->object_to_world, imat); copy_m4_m4(obmat, cob->matrix); @@ -5327,7 +5325,7 @@ static void objectsolver_evaluate(bConstraint *con, bConstraintOb *cob, ListBase data->flag &= ~OBJECTSOLVER_SET_INVERSE; - /* Write the computed matrix back to the master copy if in copy-on-eval evaluation. */ + /* Write the computed matrix back to the master copy if in COW evaluation. */ bConstraint *orig_con = constraint_find_original_for_update(cob, con); if (orig_con != nullptr) { @@ -5670,7 +5668,7 @@ bool BKE_constraint_apply_for_object(Depsgraph *depsgraph, BLI_freelinkN(&single_con, new_con); /* Apply transform from matrix. */ - BKE_object_apply_mat4(ob, ob_eval->object_to_world().ptr(), true, true); + BKE_object_apply_mat4(ob, ob_eval->object_to_world, true, true); return true; } @@ -6106,7 +6104,7 @@ bConstraint *BKE_constraint_find_from_target(Object *ob, return nullptr; } -/* Finds the original copy of the constraint based on an evaluated copy. */ +/* Finds the original copy of the constraint based on a COW copy. */ static bConstraint *constraint_find_original(Object *ob, bPoseChannel *pchan, bConstraint *con, @@ -6157,7 +6155,7 @@ static bConstraint *constraint_find_original(Object *ob, static bConstraint *constraint_find_original_for_update(bConstraintOb *cob, bConstraint *con) { - /* Write the computed distance back to the master copy if in copy-on-eval evaluation. */ + /* Write the computed distance back to the master copy if in COW evaluation. */ if (!DEG_is_active(cob->depsgraph)) { return nullptr; } @@ -6166,7 +6164,7 @@ static bConstraint *constraint_find_original_for_update(bConstraintOb *cob, bCon bConstraint *orig_con = constraint_find_original(cob->ob, cob->pchan, con, &orig_ob); if (orig_con != nullptr) { - DEG_id_tag_update(&orig_ob->id, ID_RECALC_SYNC_TO_EVAL | ID_RECALC_TRANSFORM); + DEG_id_tag_update(&orig_ob->id, ID_RECALC_COPY_ON_WRITE | ID_RECALC_TRANSFORM); } return orig_con; @@ -6263,7 +6261,7 @@ void BKE_constraint_target_matrix_get(Depsgraph *depsgraph, cob->ob = (Object *)ownerdata; cob->pchan = nullptr; if (cob->ob) { - copy_m4_m4(cob->matrix, cob->ob->object_to_world().ptr()); + copy_m4_m4(cob->matrix, cob->ob->object_to_world); copy_m4_m4(cob->startmat, cob->matrix); } else { diff --git a/source/blender/blenkernel/intern/context.cc b/source/blender/blenkernel/intern/context.cc index 648914b698d..075f20ce57b 100644 --- a/source/blender/blenkernel/intern/context.cc +++ b/source/blender/blenkernel/intern/context.cc @@ -30,15 +30,14 @@ #include "BLI_threads.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_context.hh" #include "BKE_layer.hh" #include "BKE_main.hh" -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "BKE_screen.hh" #include "BKE_sound.h" -#include "BKE_wm_runtime.hh" #include "BKE_workspace.h" #include "RE_engine.h" @@ -707,7 +706,7 @@ wmWindowManager *CTX_wm_manager(const bContext *C) bool CTX_wm_interface_locked(const bContext *C) { - return C->wm.manager->runtime->is_interface_locked; + return bool(C->wm.manager->is_interface_locked); } wmWindow *CTX_wm_window(const bContext *C) @@ -767,7 +766,7 @@ wmMsgBus *CTX_wm_message_bus(const bContext *C) ReportList *CTX_wm_reports(const bContext *C) { if (C->wm.manager) { - return &(C->wm.manager->runtime->reports); + return &(C->wm.manager->reports); } return nullptr; diff --git a/source/blender/blenkernel/intern/cpp_types.cc b/source/blender/blenkernel/intern/cpp_types.cc index c78d84020a8..81c23bb6307 100644 --- a/source/blender/blenkernel/intern/cpp_types.cc +++ b/source/blender/blenkernel/intern/cpp_types.cc @@ -6,6 +6,7 @@ #include "BLI_cpp_type_make.hh" #include "BLI_cpp_types_make.hh" #include "BLI_math_matrix_types.hh" +#include "BLI_math_quaternion_types.hh" #include "BLI_math_vector_types.hh" #include "BKE_cpp_types.hh" diff --git a/source/blender/blenkernel/intern/crazyspace.cc b/source/blender/blenkernel/intern/crazyspace.cc index cf2102f5d69..e76b1ec0709 100644 --- a/source/blender/blenkernel/intern/crazyspace.cc +++ b/source/blender/blenkernel/intern/crazyspace.cc @@ -11,7 +11,9 @@ #include "DNA_mesh_types.h" #include "DNA_modifier_types.h" #include "DNA_object_types.h" +#include "DNA_scene_types.h" +#include "BLI_bitmap.h" #include "BLI_linklist.h" #include "BLI_math_matrix.h" #include "BLI_math_rotation.h" @@ -28,8 +30,9 @@ #include "BKE_mesh_wrapper.hh" #include "BKE_modifier.hh" #include "BKE_multires.hh" +#include "BKE_object.hh" #include "BKE_object_types.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "DEG_depsgraph_query.hh" @@ -342,7 +345,7 @@ int BKE_sculpt_get_first_deform_matrices(Depsgraph *depsgraph, blender::Array &deformcos) { ModifierData *md; - Mesh *mesh_eval = nullptr; + Mesh *me_eval = nullptr; int modifiers_left_num = 0; VirtualModifierData virtual_modifier_data; Object object_eval; @@ -371,14 +374,14 @@ int BKE_sculpt_get_first_deform_matrices(Depsgraph *depsgraph, if (deformmats.is_empty()) { /* NOTE: Evaluated object is re-set to its original un-deformed state. */ Mesh *mesh = static_cast(object_eval.data); - mesh_eval = BKE_mesh_copy_for_eval(mesh); + me_eval = BKE_mesh_copy_for_eval(mesh); deformcos = mesh->vert_positions(); deformmats.reinitialize(mesh->verts_num); deformmats.fill(blender::float3x3::identity()); } if (mti->deform_matrices) { - mti->deform_matrices(md, &mectx, mesh_eval, deformcos, deformmats); + mti->deform_matrices(md, &mectx, me_eval, deformcos, deformmats); } else { /* More complex handling will continue in BKE_crazyspace_build_sculpt. @@ -399,8 +402,8 @@ int BKE_sculpt_get_first_deform_matrices(Depsgraph *depsgraph, } } - if (mesh_eval != nullptr) { - BKE_id_free(nullptr, mesh_eval); + if (me_eval != nullptr) { + BKE_id_free(nullptr, me_eval); } return modifiers_left_num; diff --git a/source/blender/blenkernel/intern/curve.cc b/source/blender/blenkernel/intern/curve.cc index 55ad75bd48a..391ace21270 100644 --- a/source/blender/blenkernel/intern/curve.cc +++ b/source/blender/blenkernel/intern/curve.cc @@ -9,7 +9,6 @@ #include /* floor */ #include #include -#include #include "MEM_guardedalloc.h" @@ -26,7 +25,7 @@ #include "BLI_math_vector_types.hh" #include "BLI_string.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" /* Allow using deprecated functionality for .blend file I/O. */ #define DNA_DEPRECATED_ALLOW @@ -41,18 +40,24 @@ #include "DNA_object_types.h" #include "DNA_vfont_types.h" +#include "BKE_anim_data.h" #include "BKE_curve.hh" #include "BKE_curveprofile.h" +#include "BKE_displist.h" #include "BKE_idtype.hh" #include "BKE_key.hh" #include "BKE_lib_id.hh" #include "BKE_lib_query.hh" +#include "BKE_main.hh" +#include "BKE_object.hh" #include "BKE_object_types.hh" #include "BKE_vfont.hh" #include "DEG_depsgraph.hh" #include "DEG_depsgraph_query.hh" +#include "CLG_log.h" + #include "BLO_read_write.hh" using blender::float3; @@ -80,11 +85,7 @@ static void curve_init_data(ID *id) MEMCPY_STRUCT_AFTER(curve, DNA_struct_default_get(Curve), id); } -static void curve_copy_data(Main *bmain, - std::optional owner_library, - ID *id_dst, - const ID *id_src, - const int flag) +static void curve_copy_data(Main *bmain, ID *id_dst, const ID *id_src, const int flag) { Curve *curve_dst = (Curve *)id_dst; const Curve *curve_src = (const Curve *)id_src; @@ -102,7 +103,7 @@ static void curve_copy_data(Main *bmain, curve_dst->bevel_profile = BKE_curveprofile_copy(curve_src->bevel_profile); if (curve_src->key && (flag & LIB_ID_COPY_SHAPEKEY)) { - BKE_id_copy_in_lib(bmain, owner_library, &curve_src->key->id, (ID **)&curve_dst->key, flag); + BKE_id_copy_ex(bmain, &curve_src->key->id, (ID **)&curve_dst->key, flag); /* XXX This is not nice, we need to make BKE_id_copy_ex fully re-entrant... */ curve_dst->key->from = &curve_dst->id; } @@ -276,7 +277,6 @@ static void curve_blend_read_data(BlendDataReader *reader, ID *id) IDTypeInfo IDType_ID_CU_LEGACY = { /*id_code*/ ID_CU_LEGACY, /*id_filter*/ FILTER_ID_CU_LEGACY, - /*dependencies_id_types*/ FILTER_ID_OB | FILTER_ID_MA | FILTER_ID_VF | FILTER_ID_KE, /*main_listbase_index*/ INDEX_ID_CU_LEGACY, /*struct_size*/ sizeof(Curve), /*name*/ "Curve", diff --git a/source/blender/blenkernel/intern/curve_bevel.cc b/source/blender/blenkernel/intern/curve_bevel.cc index 9240519c032..9a6d59e85ca 100644 --- a/source/blender/blenkernel/intern/curve_bevel.cc +++ b/source/blender/blenkernel/intern/curve_bevel.cc @@ -11,8 +11,9 @@ #include +#include "BLI_alloca.h" #include "BLI_listbase.h" -#include "BLI_math_base.h" /* Needed with MSVC for M_PI & M_PI_2. */ +#include "BLI_math_base.h" #include "MEM_guardedalloc.h" @@ -21,6 +22,7 @@ #include "DNA_object_types.h" #include "BKE_curve.hh" +#include "BKE_curveprofile.h" #include "BKE_displist.h" #include "BKE_object_types.hh" diff --git a/source/blender/blenkernel/intern/curve_catmull_rom.cc b/source/blender/blenkernel/intern/curve_catmull_rom.cc index a54e3ba5a55..125bf83ef39 100644 --- a/source/blender/blenkernel/intern/curve_catmull_rom.cc +++ b/source/blender/blenkernel/intern/curve_catmull_rom.cc @@ -24,17 +24,15 @@ int calculate_evaluated_num(const int points_num, const bool cyclic, const int r return eval_num + 1; } -float4 calculate_basis(const float parameter) +void calculate_basis(const float parameter, float4 &r_weights) { /* Adapted from Cycles #catmull_rom_basis_eval function. */ const float t = parameter; const float s = 1.0f - parameter; - return { - -t * s * s, - 2.0f + t * t * (3.0f * t - 5.0f), - 2.0f + s * s * (3.0f * s - 5.0f), - -s * t * t, - }; + r_weights[0] = -t * s * s; + r_weights[1] = 2.0f + t * t * (3.0f * t - 5.0f); + r_weights[2] = 2.0f + s * s * (3.0f * s - 5.0f); + r_weights[3] = -s * t * t; } template diff --git a/source/blender/blenkernel/intern/curve_convert.cc b/source/blender/blenkernel/intern/curve_convert.cc index 6b64802ccac..7443fba7e32 100644 --- a/source/blender/blenkernel/intern/curve_convert.cc +++ b/source/blender/blenkernel/intern/curve_convert.cc @@ -8,12 +8,14 @@ #include "DNA_curve_types.h" #include "DNA_object_types.h" +#include "DNA_vfont_types.h" #include "BLI_utildefines.h" #include "BKE_curve.hh" #include "BKE_displist.h" #include "BKE_lib_id.hh" +#include "BKE_modifier.hh" #include "BKE_vfont.hh" #include "DEG_depsgraph.hh" diff --git a/source/blender/blenkernel/intern/curve_decimate.cc b/source/blender/blenkernel/intern/curve_decimate.cc index 7b776b3b027..579b01fa07b 100644 --- a/source/blender/blenkernel/intern/curve_decimate.cc +++ b/source/blender/blenkernel/intern/curve_decimate.cc @@ -18,9 +18,9 @@ extern "C" { #include "curve_fit_nd.h" } -#include +#include "BLI_strict_flags.h" -#include "BLI_strict_flags.h" /* Keep last. */ +#include struct Knot { Knot *next, *prev; diff --git a/source/blender/blenkernel/intern/curve_deform.cc b/source/blender/blenkernel/intern/curve_deform.cc index 2dc44376258..422f5239b29 100644 --- a/source/blender/blenkernel/intern/curve_deform.cc +++ b/source/blender/blenkernel/intern/curve_deform.cc @@ -25,6 +25,7 @@ #include "BKE_anim_path.h" #include "BKE_curve.hh" #include "BKE_editmesh.hh" +#include "BKE_lattice.hh" #include "BKE_modifier.hh" #include "BKE_object_types.hh" @@ -47,8 +48,8 @@ struct CurveDeform { static void init_curve_deform(const Object *ob_curve, const Object *ob_target, CurveDeform *cd) { float imat[4][4]; - invert_m4_m4(imat, ob_target->object_to_world().ptr()); - mul_m4_m4m4(cd->objectspace, imat, ob_curve->object_to_world().ptr()); + invert_m4_m4(imat, ob_target->object_to_world); + mul_m4_m4m4(cd->objectspace, imat, ob_curve->object_to_world); invert_m4_m4(cd->curvespace, cd->objectspace); copy_m3_m4(cd->objectspace3, cd->objectspace); cd->no_rot_axis = 0; diff --git a/source/blender/blenkernel/intern/curve_to_mesh_convert.cc b/source/blender/blenkernel/intern/curve_to_mesh_convert.cc index b4fd7364698..a741f9a3c1d 100644 --- a/source/blender/blenkernel/intern/curve_to_mesh_convert.cc +++ b/source/blender/blenkernel/intern/curve_to_mesh_convert.cc @@ -376,27 +376,12 @@ static GSpan evaluate_attribute(const GVArray &src, const CurvesGeometry &curves, Vector &buffer) { - /* Poly curves evaluated points match the curve points, no need to interpolate. */ - if (curves.is_single_type(CURVE_TYPE_POLY)) { - if (src.is_span()) { - return src.get_internal_span(); - } - buffer.reinitialize(curves.points_num() * src.type().size()); - src.materialize(buffer.data()); - GMutableSpan eval{src.type(), buffer.data(), curves.points_num()}; - return eval; + if (curves.is_single_type(CURVE_TYPE_POLY) && src.is_span()) { + return src.get_internal_span(); } - - if (src.is_span()) { - buffer.reinitialize(curves.evaluated_points_num() * src.type().size()); - GMutableSpan eval{src.type(), buffer.data(), curves.evaluated_points_num()}; - curves.interpolate_to_evaluated(src.get_internal_span(), eval); - return eval; - } - GVArraySpan src_buffer(src); buffer.reinitialize(curves.evaluated_points_num() * src.type().size()); GMutableSpan eval{src.type(), buffer.data(), curves.evaluated_points_num()}; - curves.interpolate_to_evaluated(src_buffer, eval); + curves.interpolate_to_evaluated(src.get_internal_span(), eval); return eval; } @@ -489,7 +474,7 @@ static void build_mesh_positions(const CurvesInfo &curves_info, } const Span tangents = curves_info.main.evaluated_tangents(); const Span normals = curves_info.main.evaluated_normals(); - Span radii_eval; + Span radii_eval = {}; if (const GVArray radii = *curves_info.main.attributes().lookup("radius", AttrDomain::Point)) { radii_eval = evaluate_attribute(radii, curves_info.main, eval_buffer).typed(); } @@ -726,7 +711,7 @@ static void copy_indices_to_offset_ranges(const VArray &src, /* This unnecessarily instantiates the "is single" case (which should be handled elsewhere if * it's ever used for attributes), but the alternative is duplicating the function for spans and * other virtual arrays. */ - devirtualize_varray(src, [&](const auto src) { + devirtualize_varray(src, [&](const auto &src) { threading::parallel_for(curve_indices.index_range(), 512, [&](IndexRange range) { for (const int i : range) { dst.slice(mesh_offsets[i]).fill(src[curve_indices[i]]); @@ -858,9 +843,6 @@ Mesh *curve_to_mesh_sweep(const CurvesGeometry &main, Vector eval_buffer; - /* Make sure curve attributes can be interpolated. */ - main.ensure_can_interpolate_to_evaluated(); - build_mesh_positions(curves_info, offsets, eval_buffer, *mesh); mesh->tag_overlapping_none(); @@ -927,9 +909,6 @@ Mesh *curve_to_mesh_sweep(const CurvesGeometry &main, return true; }); - /* Make sure profile attributes can be interpolated. */ - profile.ensure_can_interpolate_to_evaluated(); - const AttributeAccessor profile_attributes = profile.attributes(); profile_attributes.for_all([&](const AttributeIDRef &id, const AttributeMetaData meta_data) { if (main_attributes.contains(id)) { diff --git a/source/blender/blenkernel/intern/curves.cc b/source/blender/blenkernel/intern/curves.cc index a87ab0366f2..8e0a03b2330 100644 --- a/source/blender/blenkernel/intern/curves.cc +++ b/source/blender/blenkernel/intern/curves.cc @@ -8,7 +8,6 @@ #include #include -#include #include "MEM_guardedalloc.h" @@ -18,6 +17,7 @@ #include "DNA_object_types.h" #include "BLI_index_range.hh" +#include "BLI_listbase.h" #include "BLI_math_base.h" #include "BLI_math_matrix.hh" #include "BLI_rand.hh" @@ -26,18 +26,22 @@ #include "BLI_utildefines.h" #include "BLI_vector.hh" -#include "BKE_anim_data.hh" +#include "BKE_anim_data.h" #include "BKE_curves.hh" +#include "BKE_customdata.hh" #include "BKE_geometry_fields.hh" #include "BKE_geometry_set.hh" +#include "BKE_global.h" #include "BKE_idtype.hh" #include "BKE_lib_id.hh" #include "BKE_lib_query.hh" +#include "BKE_lib_remap.hh" +#include "BKE_main.hh" #include "BKE_modifier.hh" #include "BKE_object.hh" #include "BKE_object_types.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DEG_depsgraph_query.hh" @@ -62,11 +66,7 @@ static void curves_init_data(ID *id) new (&curves->geometry) blender::bke::CurvesGeometry(); } -static void curves_copy_data(Main * /*bmain*/, - std::optional /*owner_library*/, - ID *id_dst, - const ID *id_src, - const int /*flag*/) +static void curves_copy_data(Main * /*bmain*/, ID *id_dst, const ID *id_src, const int /*flag*/) { Curves *curves_dst = (Curves *)id_dst; const Curves *curves_src = (const Curves *)id_src; @@ -138,7 +138,6 @@ static void curves_blend_read_data(BlendDataReader *reader, ID *id) IDTypeInfo IDType_ID_CV = { /*id_code*/ ID_CV, /*id_filter*/ FILTER_ID_CV, - /*dependencies_id_types*/ FILTER_ID_MA | FILTER_ID_OB, /*main_listbase_index*/ INDEX_ID_CV, /*struct_size*/ sizeof(Curves), /*name*/ "Curves", @@ -318,11 +317,11 @@ void curves_copy_parameters(const Curves &src, Curves &dst) CurvesSurfaceTransforms::CurvesSurfaceTransforms(const Object &curves_ob, const Object *surface_ob) { - this->curves_to_world = curves_ob.object_to_world(); + this->curves_to_world = float4x4_view(curves_ob.object_to_world); this->world_to_curves = math::invert(this->curves_to_world); if (surface_ob != nullptr) { - this->surface_to_world = surface_ob->object_to_world(); + this->surface_to_world = float4x4_view(surface_ob->object_to_world); this->world_to_surface = math::invert(this->surface_to_world); this->surface_to_curves = this->world_to_curves * this->surface_to_world; this->curves_to_surface = this->world_to_surface * this->curves_to_world; diff --git a/source/blender/blenkernel/intern/curves_geometry.cc b/source/blender/blenkernel/intern/curves_geometry.cc index de6c6fe80ec..9461d354abf 100644 --- a/source/blender/blenkernel/intern/curves_geometry.cc +++ b/source/blender/blenkernel/intern/curves_geometry.cc @@ -89,85 +89,89 @@ CurvesGeometry::CurvesGeometry(const int point_num, const int curve_num) this->runtime->type_counts[CURVE_TYPE_CATMULL_ROM] = curve_num; } -CurvesGeometry::CurvesGeometry(const CurvesGeometry &other) +/** + * \note Expects `dst` to be initialized, since the original attributes must be freed. + */ +static void copy_curves_geometry(CurvesGeometry &dst, const CurvesGeometry &src) { - this->curve_offsets = other.curve_offsets; - if (other.runtime->curve_offsets_sharing_info) { - other.runtime->curve_offsets_sharing_info->add_user(); + CustomData_free(&dst.point_data, dst.point_num); + CustomData_free(&dst.curve_data, dst.curve_num); + dst.point_num = src.point_num; + dst.curve_num = src.curve_num; + CustomData_copy(&src.point_data, &dst.point_data, CD_MASK_ALL, dst.point_num); + CustomData_copy(&src.curve_data, &dst.curve_data, CD_MASK_ALL, dst.curve_num); + + dst.vertex_group_active_index = src.vertex_group_active_index; + BKE_defgroup_copy_list(&dst.vertex_group_names, &src.vertex_group_names); + + implicit_sharing::copy_shared_pointer(src.curve_offsets, + src.runtime->curve_offsets_sharing_info, + &dst.curve_offsets, + &dst.runtime->curve_offsets_sharing_info); + + dst.tag_topology_changed(); + + /* Though type counts are a cache, they must be copied because they are calculated eagerly. */ + dst.runtime->type_counts = src.runtime->type_counts; + dst.runtime->evaluated_offsets_cache = src.runtime->evaluated_offsets_cache; + dst.runtime->nurbs_basis_cache = src.runtime->nurbs_basis_cache; + dst.runtime->evaluated_position_cache = src.runtime->evaluated_position_cache; + dst.runtime->bounds_cache = src.runtime->bounds_cache; + dst.runtime->evaluated_length_cache = src.runtime->evaluated_length_cache; + dst.runtime->evaluated_tangent_cache = src.runtime->evaluated_tangent_cache; + dst.runtime->evaluated_normal_cache = src.runtime->evaluated_normal_cache; + + if (src.runtime->bake_materials) { + dst.runtime->bake_materials = std::make_unique( + *src.runtime->bake_materials); } +} - CustomData_copy(&other.point_data, &this->point_data, CD_MASK_ALL, other.point_num); - CustomData_copy(&other.curve_data, &this->curve_data, CD_MASK_ALL, other.curve_num); - - this->point_num = other.point_num; - this->curve_num = other.curve_num; - - BKE_defgroup_copy_list(&this->vertex_group_names, &other.vertex_group_names); - this->vertex_group_active_index = other.vertex_group_active_index; - - this->runtime = MEM_new( - __func__, - CurvesGeometryRuntime{other.runtime->curve_offsets_sharing_info, - other.runtime->type_counts, - other.runtime->evaluated_offsets_cache, - other.runtime->nurbs_basis_cache, - other.runtime->evaluated_position_cache, - other.runtime->bounds_cache, - other.runtime->evaluated_length_cache, - other.runtime->evaluated_tangent_cache, - other.runtime->evaluated_normal_cache, - {}}); - - if (other.runtime->bake_materials) { - this->runtime->bake_materials = std::make_unique( - *other.runtime->bake_materials); - } +CurvesGeometry::CurvesGeometry(const CurvesGeometry &other) : CurvesGeometry() +{ + copy_curves_geometry(*this, other); } CurvesGeometry &CurvesGeometry::operator=(const CurvesGeometry &other) { - if (this == &other) { - return *this; + if (this != &other) { + copy_curves_geometry(*this, other); } - std::destroy_at(this); - new (this) CurvesGeometry(other); return *this; } -CurvesGeometry::CurvesGeometry(CurvesGeometry &&other) +/* The source should be empty, but in a valid state so that using it further will work. */ +static void move_curves_geometry(CurvesGeometry &dst, CurvesGeometry &src) { - this->curve_offsets = other.curve_offsets; - other.curve_offsets = nullptr; + dst.point_num = src.point_num; + std::swap(dst.point_data, src.point_data); + CustomData_free(&src.point_data, src.point_num); + src.point_num = 0; - this->point_data = other.point_data; - CustomData_reset(&other.point_data); + dst.curve_num = src.curve_num; + std::swap(dst.curve_data, src.curve_data); + CustomData_free(&src.curve_data, src.curve_num); + src.curve_num = 0; - this->curve_data = other.curve_data; - CustomData_reset(&other.curve_data); + std::swap(dst.curve_offsets, src.curve_offsets); - this->point_num = other.point_num; - other.point_num = 0; + std::swap(dst.vertex_group_names.first, src.vertex_group_names.first); + std::swap(dst.vertex_group_names.last, src.vertex_group_names.last); + std::swap(dst.vertex_group_active_index, src.vertex_group_active_index); - this->curve_num = other.curve_num; - other.curve_num = 0; + std::swap(dst.runtime, src.runtime); +} - this->vertex_group_names = other.vertex_group_names; - BLI_listbase_clear(&other.vertex_group_names); - - this->vertex_group_active_index = other.vertex_group_active_index; - other.vertex_group_active_index = 0; - - this->runtime = other.runtime; - other.runtime = nullptr; +CurvesGeometry::CurvesGeometry(CurvesGeometry &&other) : CurvesGeometry() +{ + move_curves_geometry(*this, other); } CurvesGeometry &CurvesGeometry::operator=(CurvesGeometry &&other) { - if (this == &other) { - return *this; + if (this != &other) { + move_curves_geometry(*this, other); } - std::destroy_at(this); - new (this) CurvesGeometry(std::move(other)); return *this; } @@ -175,12 +179,11 @@ CurvesGeometry::~CurvesGeometry() { CustomData_free(&this->point_data, this->point_num); CustomData_free(&this->curve_data, this->curve_num); + implicit_sharing::free_shared_data(&this->curve_offsets, + &this->runtime->curve_offsets_sharing_info); BLI_freelistN(&this->vertex_group_names); - if (this->runtime) { - implicit_sharing::free_shared_data(&this->curve_offsets, - &this->runtime->curve_offsets_sharing_info); - MEM_delete(this->runtime); - } + MEM_delete(this->runtime); + this->runtime = nullptr; } /** \} */ @@ -207,14 +210,14 @@ static const CustomData &domain_custom_data(const CurvesGeometry &curves, const template static VArray get_varray_attribute(const CurvesGeometry &curves, const AttrDomain domain, - const StringRef name, + const StringRefNull name, const T default_value) { const int num = domain_num(curves, domain); const eCustomDataType type = cpp_type_to_custom_data_type(CPPType::get()); const CustomData &custom_data = domain_custom_data(curves, domain); - const T *data = (const T *)CustomData_get_layer_named(&custom_data, type, name); + const T *data = (const T *)CustomData_get_layer_named(&custom_data, type, name.c_str()); if (data != nullptr) { return VArray::ForSpan(Span(data, num)); } @@ -224,13 +227,13 @@ static VArray get_varray_attribute(const CurvesGeometry &curves, template static Span get_span_attribute(const CurvesGeometry &curves, const AttrDomain domain, - const StringRef name) + const StringRefNull name) { const int num = domain_num(curves, domain); const CustomData &custom_data = domain_custom_data(curves, domain); const eCustomDataType type = cpp_type_to_custom_data_type(CPPType::get()); - T *data = (T *)CustomData_get_layer_named(&custom_data, type, name); + T *data = (T *)CustomData_get_layer_named(&custom_data, type, name.c_str()); if (data == nullptr) { return {}; } @@ -240,18 +243,18 @@ static Span get_span_attribute(const CurvesGeometry &curves, template static MutableSpan get_mutable_attribute(CurvesGeometry &curves, const AttrDomain domain, - const StringRef name, + const StringRefNull name, const T default_value = T()) { const int num = domain_num(curves, domain); const eCustomDataType type = cpp_type_to_custom_data_type(CPPType::get()); CustomData &custom_data = domain_custom_data(curves, domain); - T *data = (T *)CustomData_get_layer_named_for_write(&custom_data, type, name, num); + T *data = (T *)CustomData_get_layer_named_for_write(&custom_data, type, name.c_str(), num); if (data != nullptr) { return {data, num}; } - data = (T *)CustomData_add_layer_named(&custom_data, type, CD_SET_DEFAULT, num, name); + data = (T *)CustomData_add_layer_named(&custom_data, type, CD_SET_DEFAULT, num, name.c_str()); MutableSpan span = {data, num}; if (num > 0 && span.first() != default_value) { span.fill(default_value); @@ -1197,8 +1200,6 @@ CurvesGeometry curves_copy_point_selection( CurvesGeometry dst_curves(points_to_copy.size(), curves_to_copy.size()); - BKE_defgroup_copy_list(&dst_curves.vertex_group_names, &curves.vertex_group_names); - threading::parallel_invoke( dst_curves.curves_num() > 1024, [&]() { @@ -1258,8 +1259,6 @@ CurvesGeometry curves_copy_curve_selection( points_by_curve, curves_to_copy, dst_curves.offsets_for_write()); dst_curves.resize(dst_points_by_curve.total_size(), dst_curves.curves_num()); - BKE_defgroup_copy_list(&dst_curves.vertex_group_names, &curves.vertex_group_names); - const AttributeAccessor src_attributes = curves.attributes(); MutableAttributeAccessor dst_attributes = dst_curves.attributes_for_write(); @@ -1545,11 +1544,9 @@ void CurvesGeometry::blend_read(BlendDataReader &reader) CustomData_blend_read(&reader, &this->curve_data, this->curve_num); if (this->curve_offsets) { - this->runtime->curve_offsets_sharing_info = BLO_read_shared( - &reader, &this->curve_offsets, [&]() { - BLO_read_int32_array(&reader, this->curve_num + 1, &this->curve_offsets); - return implicit_sharing::info_for_mem_free(this->curve_offsets); - }); + BLO_read_int32_array(&reader, this->curve_num + 1, &this->curve_offsets); + this->runtime->curve_offsets_sharing_info = implicit_sharing::info_for_mem_free( + this->curve_offsets); } BLO_read_list(&reader, &this->vertex_group_names); @@ -1575,14 +1572,7 @@ void CurvesGeometry::blend_write(BlendWriter &writer, CustomData_blend_write( &writer, &this->curve_data, write_data.curve_layers, this->curve_num, CD_MASK_ALL, &id); - if (this->curve_offsets) { - BLO_write_shared( - &writer, - this->curve_offsets, - sizeof(int) * (this->curve_num + 1), - this->runtime->curve_offsets_sharing_info, - [&]() { BLO_write_int32_array(&writer, this->curve_num + 1, this->curve_offsets); }); - } + BLO_write_int32_array(&writer, this->curve_num + 1, this->curve_offsets); BKE_defbase_blend_write(&writer, &this->vertex_group_names); } diff --git a/source/blender/blenkernel/intern/customdata.cc b/source/blender/blenkernel/intern/customdata.cc index 586819971e5..188a6443d94 100644 --- a/source/blender/blenkernel/intern/customdata.cc +++ b/source/blender/blenkernel/intern/customdata.cc @@ -24,7 +24,6 @@ #include "BLI_endian_switch.h" #include "BLI_index_range.hh" #include "BLI_math_color_blend.h" -#include "BLI_math_matrix.hh" #include "BLI_math_quaternion_types.hh" #include "BLI_math_vector.hh" #include "BLI_mempool.h" @@ -41,7 +40,7 @@ # include "BLI_dynstr.h" #endif -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_anonymous_attribute_id.hh" #include "BKE_customdata.hh" @@ -114,7 +113,6 @@ bool CustomData_MeshMasks_are_matching(const CustomData_MeshMasks *mask_ref, struct LayerTypeInfo { int size; /* the memory size of one element of this layer's data */ - int alignment; /** name of the struct used, for file writing */ const char *structname; @@ -1528,16 +1526,6 @@ static void layerDefault_propquaternion(void *data, const int count) MutableSpan(static_cast(data), count).fill(math::Quaternion::identity()); } -/* -------------------------------------------------------------------- */ -/** \name Callbacks for (#math::Quaternion, #CD_PROP_FLOAT4X4) - * \{ */ - -static void layerDefault_propfloat4x4(void *data, const int count) -{ - using namespace blender; - MutableSpan(static_cast(data), count).fill(float4x4::identity()); -} - /** \} */ /* -------------------------------------------------------------------- */ @@ -1546,30 +1534,11 @@ static void layerDefault_propfloat4x4(void *data, const int count) static const LayerTypeInfo LAYERTYPEINFO[CD_NUMTYPES] = { /* 0: CD_MVERT */ /* DEPRECATED */ - {sizeof(MVert), - alignof(MVert), - "MVert", - 1, - nullptr, - nullptr, - nullptr, - nullptr, - nullptr, - nullptr}, + {sizeof(MVert), "MVert", 1, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr}, /* 1: CD_MSTICKY */ /* DEPRECATED */ - {sizeof(float[2]), - alignof(float2), - "", - 1, - nullptr, - nullptr, - nullptr, - nullptr, - nullptr, - nullptr}, + {sizeof(float[2]), "", 1, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr}, /* 2: CD_MDEFORMVERT */ {sizeof(MDeformVert), - alignof(MDeformVert), "MDeformVert", 1, nullptr, @@ -1580,30 +1549,11 @@ static const LayerTypeInfo LAYERTYPEINFO[CD_NUMTYPES] = { nullptr, layerConstruct_mdeformvert}, /* 3: CD_MEDGE */ /* DEPRECATED */ - {sizeof(MEdge), - alignof(MEdge), - "MEdge", - 1, - nullptr, - nullptr, - nullptr, - nullptr, - nullptr, - nullptr}, + {sizeof(MEdge), "MEdge", 1, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr}, /* 4: CD_MFACE */ - {sizeof(MFace), - alignof(MFace), - "MFace", - 1, - nullptr, - nullptr, - nullptr, - nullptr, - nullptr, - nullptr}, + {sizeof(MFace), "MFace", 1, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr}, /* 5: CD_MTFACE */ {sizeof(MTFace), - alignof(MTFace), "MTFace", 1, N_("UVMap"), @@ -1626,31 +1576,18 @@ static const LayerTypeInfo LAYERTYPEINFO[CD_NUMTYPES] = { layerMaxNum_tface}, /* 6: CD_MCOL */ /* 4 MCol structs per face */ - {sizeof(MCol[4]), - alignof(MCol[4]), - "MCol", - 4, - N_("Col"), - nullptr, - nullptr, - layerInterp_mcol, - layerSwap_mcol, - layerDefault_mcol}, + {sizeof(MCol[4]), "MCol", 4, + N_("Col"), nullptr, nullptr, + layerInterp_mcol, layerSwap_mcol, layerDefault_mcol, + nullptr, nullptr, nullptr, + nullptr, nullptr, nullptr, + nullptr, nullptr, nullptr, + nullptr, nullptr, nullptr}, /* 7: CD_ORIGINDEX */ - {sizeof(int), - alignof(int), - "", - 0, - nullptr, - nullptr, - nullptr, - nullptr, - nullptr, - layerDefault_origindex}, + {sizeof(int), "", 0, nullptr, nullptr, nullptr, nullptr, nullptr, layerDefault_origindex}, /* 8: CD_NORMAL */ /* 3 floats per normal vector */ {sizeof(float[3]), - alignof(blender::float3), "vec3f", 1, nullptr, @@ -1668,10 +1605,9 @@ static const LayerTypeInfo LAYERTYPEINFO[CD_NUMTYPES] = { nullptr, layerCopyValue_normal}, /* 9: CD_FACEMAP */ /* DEPRECATED */ - {sizeof(int), alignof(int), ""}, + {sizeof(int), ""}, /* 10: CD_PROP_FLOAT */ {sizeof(MFloatProperty), - alignof(float), "MFloatProperty", 1, N_("Float"), @@ -1684,7 +1620,6 @@ static const LayerTypeInfo LAYERTYPEINFO[CD_NUMTYPES] = { layerValidate_propFloat}, /* 11: CD_PROP_INT32 */ {sizeof(MIntProperty), - alignof(int), "MIntProperty", 1, N_("Int"), @@ -1694,7 +1629,6 @@ static const LayerTypeInfo LAYERTYPEINFO[CD_NUMTYPES] = { nullptr}, /* 12: CD_PROP_STRING */ {sizeof(MStringProperty), - alignof(MStringProperty), "MStringProperty", 1, N_("String"), @@ -1704,7 +1638,6 @@ static const LayerTypeInfo LAYERTYPEINFO[CD_NUMTYPES] = { nullptr}, /* 13: CD_ORIGSPACE */ {sizeof(OrigSpaceFace), - alignof(OrigSpaceFace), "OrigSpaceFace", 1, N_("UVMap"), @@ -1714,25 +1647,15 @@ static const LayerTypeInfo LAYERTYPEINFO[CD_NUMTYPES] = { layerSwap_origspace_face, layerDefault_origspace_face}, /* 14: CD_ORCO */ - {sizeof(float[3]), - alignof(blender::float3), - "", - 0, - nullptr, - nullptr, - nullptr, - nullptr, - nullptr, - nullptr}, + {sizeof(float[3]), "", 0, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr}, /* 15: CD_MTEXPOLY */ /* DEPRECATED */ /* NOTE: when we expose the UV Map / TexFace split to the user, * change this back to face Texture. */ - {sizeof(int), alignof(int), "", 0, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr}, + {sizeof(int), "", 0, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr}, /* 16: CD_MLOOPUV */ /* DEPRECATED */ - {sizeof(MLoopUV), alignof(MLoopUV), "MLoopUV", 1, N_("UVMap")}, + {sizeof(MLoopUV), "MLoopUV", 1, N_("UVMap")}, /* 17: CD_PROP_BYTE_COLOR */ {sizeof(MLoopCol), - alignof(MLoopCol), "MLoopCol", 1, N_("Col"), @@ -1754,19 +1677,9 @@ static const LayerTypeInfo LAYERTYPEINFO[CD_NUMTYPES] = { nullptr, nullptr}, /* 18: CD_TANGENT */ - {sizeof(float[4][4]), - alignof(float[4][4]), - "", - 0, - N_("Tangent"), - nullptr, - nullptr, - nullptr, - nullptr, - nullptr}, + {sizeof(float[4][4]), "", 0, N_("Tangent"), nullptr, nullptr, nullptr, nullptr, nullptr}, /* 19: CD_MDISPS */ {sizeof(MDisps), - alignof(MDisps), "MDisps", 1, nullptr, @@ -1787,30 +1700,11 @@ static const LayerTypeInfo LAYERTYPEINFO[CD_NUMTYPES] = { layerWrite_mdisps, layerFilesize_mdisps}, /* 20: CD_PREVIEW_MCOL */ - {sizeof(blender::float4x4), - alignof(blender::float4x4), - "mat4x4f", - 1, - N_("4 by 4 Float Matrix"), - nullptr, - nullptr, - nullptr, - nullptr, - layerDefault_propfloat4x4}, + {}, /* 21: CD_ID_MCOL */ /* DEPRECATED */ - {sizeof(MCol[4]), - alignof(MCol[4]), - "", - 0, - nullptr, - nullptr, - nullptr, - nullptr, - nullptr, - nullptr}, + {sizeof(MCol[4]), "", 0, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr}, /* 22: CD_TEXTURE_MCOL */ {sizeof(MCol[4]), - alignof(MCol[4]), "MCol", 4, N_("TexturedCol"), @@ -1820,40 +1714,13 @@ static const LayerTypeInfo LAYERTYPEINFO[CD_NUMTYPES] = { layerSwap_mcol, layerDefault_mcol}, /* 23: CD_CLOTH_ORCO */ - {sizeof(float[3]), - alignof(float[3]), - "", - 0, - nullptr, - nullptr, - nullptr, - nullptr, - nullptr, - nullptr}, + {sizeof(float[3]), "", 0, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr}, /* 24: CD_RECAST */ - {sizeof(MRecast), - alignof(MRecast), - "MRecast", - 1, - N_("Recast"), - nullptr, - nullptr, - nullptr, - nullptr}, + {sizeof(MRecast), "MRecast", 1, N_("Recast"), nullptr, nullptr, nullptr, nullptr}, /* 25: CD_MPOLY */ /* DEPRECATED */ - {sizeof(MPoly), - alignof(MPoly), - "MPoly", - 1, - N_("NGon Face"), - nullptr, - nullptr, - nullptr, - nullptr, - nullptr}, + {sizeof(MPoly), "MPoly", 1, N_("NGon Face"), nullptr, nullptr, nullptr, nullptr, nullptr}, /* 26: CD_MLOOP */ /* DEPRECATED */ {sizeof(MLoop), - alignof(MLoop), "MLoop", 1, N_("NGon Face-Vertex"), @@ -1863,23 +1730,15 @@ static const LayerTypeInfo LAYERTYPEINFO[CD_NUMTYPES] = { nullptr, nullptr}, /* 27: CD_SHAPE_KEYINDEX */ - {sizeof(int), alignof(int), "", 0, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr}, + {sizeof(int), "", 0, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr}, /* 28: CD_SHAPEKEY */ - {sizeof(float[3]), - alignof(float[3]), - "", - 0, - N_("ShapeKey"), - nullptr, - nullptr, - layerInterp_shapekey}, + {sizeof(float[3]), "", 0, N_("ShapeKey"), nullptr, nullptr, layerInterp_shapekey}, /* 29: CD_BWEIGHT */ /* DEPRECATED */ - {sizeof(MFloatProperty), alignof(MFloatProperty), "MFloatProperty", 1}, + {sizeof(MFloatProperty), "MFloatProperty", 1}, /* 30: CD_CREASE */ /* DEPRECATED */ - {sizeof(float), alignof(float), ""}, + {sizeof(float), ""}, /* 31: CD_ORIGSPACE_MLOOP */ {sizeof(OrigSpaceLoop), - alignof(OrigSpaceLoop), "OrigSpaceLoop", 1, N_("OS Loop"), @@ -1900,7 +1759,6 @@ static const LayerTypeInfo LAYERTYPEINFO[CD_NUMTYPES] = { {}, /* 33: CD_BM_ELEM_PYPTR */ {sizeof(void *), - alignof(void *), "", 1, nullptr, @@ -1910,10 +1768,9 @@ static const LayerTypeInfo LAYERTYPEINFO[CD_NUMTYPES] = { nullptr, nullptr}, /* 34: CD_PAINT_MASK */ /* DEPRECATED */ - {sizeof(float), alignof(float), "", 0, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr}, + {sizeof(float), "", 0, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr}, /* 35: CD_GRID_PAINT_MASK */ {sizeof(GridPaintMask), - alignof(GridPaintMask), "GridPaintMask", 1, nullptr, @@ -1925,7 +1782,6 @@ static const LayerTypeInfo LAYERTYPEINFO[CD_NUMTYPES] = { layerConstruct_grid_paint_mask}, /* 36: CD_MVERT_SKIN */ {sizeof(MVertSkin), - alignof(MVertSkin), "MVertSkin", 1, nullptr, @@ -1936,7 +1792,6 @@ static const LayerTypeInfo LAYERTYPEINFO[CD_NUMTYPES] = { layerDefault_mvert_skin}, /* 37: CD_FREESTYLE_EDGE */ {sizeof(FreestyleEdge), - alignof(FreestyleEdge), "FreestyleEdge", 1, nullptr, @@ -1947,7 +1802,6 @@ static const LayerTypeInfo LAYERTYPEINFO[CD_NUMTYPES] = { nullptr}, /* 38: CD_FREESTYLE_FACE */ {sizeof(FreestyleFace), - alignof(FreestyleFace), "FreestyleFace", 1, nullptr, @@ -1957,87 +1811,23 @@ static const LayerTypeInfo LAYERTYPEINFO[CD_NUMTYPES] = { nullptr, nullptr}, /* 39: CD_MLOOPTANGENT */ - {sizeof(float[4]), - alignof(float[4]), - "", - 0, - nullptr, - nullptr, - nullptr, - nullptr, - nullptr, - nullptr}, + {sizeof(float[4]), "", 0, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr}, /* 40: CD_TESSLOOPNORMAL */ - {sizeof(short[4][3]), - alignof(short[4][3]), - "", - 0, - nullptr, - nullptr, - nullptr, - nullptr, - layerSwap_flnor, - nullptr}, + {sizeof(short[4][3]), "", 0, nullptr, nullptr, nullptr, nullptr, layerSwap_flnor, nullptr}, /* 41: CD_CUSTOMLOOPNORMAL */ - {sizeof(short[2]), - alignof(short[2]), - "vec2s", - 1, - nullptr, - nullptr, - nullptr, - nullptr, - nullptr, - nullptr}, + {sizeof(short[2]), "vec2s", 1, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr}, /* 42: CD_SCULPT_FACE_SETS */ /* DEPRECATED */ - {sizeof(int), alignof(int), ""}, + {sizeof(int), ""}, /* 43: CD_LOCATION */ - {sizeof(float[3]), - alignof(float[3]), - "vec3f", - 1, - nullptr, - nullptr, - nullptr, - nullptr, - nullptr, - nullptr}, + {sizeof(float[3]), "vec3f", 1, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr}, /* 44: CD_RADIUS */ - {sizeof(float), - alignof(float), - "MFloatProperty", - 1, - nullptr, - nullptr, - nullptr, - nullptr, - nullptr, - nullptr}, + {sizeof(float), "MFloatProperty", 1, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr}, /* 45: CD_PROP_INT8 */ - {sizeof(int8_t), - alignof(int8_t), - "MInt8Property", - 1, - N_("Int8"), - nullptr, - nullptr, - nullptr, - nullptr, - nullptr}, + {sizeof(int8_t), "MInt8Property", 1, N_("Int8"), nullptr, nullptr, nullptr, nullptr, nullptr}, /* 46: CD_PROP_INT32_2D */ - {sizeof(blender::int2), - alignof(blender::int2), - "vec2i", - 1, - N_("Int 2D"), - nullptr, - nullptr, - nullptr, - nullptr, - nullptr}, + {sizeof(vec2i), "vec2i", 1, N_("Int 2D"), nullptr, nullptr, nullptr, nullptr, nullptr}, /* 47: CD_PROP_COLOR */ {sizeof(MPropCol), - alignof(MPropCol), "MPropCol", 1, N_("Color"), @@ -2060,7 +1850,6 @@ static const LayerTypeInfo LAYERTYPEINFO[CD_NUMTYPES] = { nullptr}, /* 48: CD_PROP_FLOAT3 */ {sizeof(float[3]), - alignof(blender::float3), "vec3f", 1, N_("Float3"), @@ -2077,7 +1866,6 @@ static const LayerTypeInfo LAYERTYPEINFO[CD_NUMTYPES] = { layerAdd_propfloat3}, /* 49: CD_PROP_FLOAT2 */ {sizeof(float[2]), - alignof(float2), "vec2f", 1, N_("Float2"), @@ -2096,7 +1884,6 @@ static const LayerTypeInfo LAYERTYPEINFO[CD_NUMTYPES] = { layerCopyValue_propfloat2}, /* 50: CD_PROP_BOOL */ {sizeof(bool), - alignof(bool), "bool", 1, N_("Boolean"), @@ -2111,19 +1898,9 @@ static const LayerTypeInfo LAYERTYPEINFO[CD_NUMTYPES] = { nullptr, nullptr}, /* 51: CD_HAIRLENGTH */ /* DEPRECATED */ /* UNUSED */ - {sizeof(float), - alignof(float), - "float", - 1, - nullptr, - nullptr, - nullptr, - nullptr, - nullptr, - nullptr}, + {sizeof(float), "float", 1, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr}, /* 52: CD_PROP_QUATERNION */ {sizeof(float[4]), - alignof(blender::float4), "vec4f", 1, N_("Quaternion"), @@ -2325,7 +2102,7 @@ static CustomDataLayer *customData_add_layer__internal( void *layer_data_to_assign, const ImplicitSharingInfo *sharing_info_to_assign, int totelem, - const StringRef name); + const char *name); void CustomData_update_typemap(CustomData *data) { @@ -2357,15 +2134,12 @@ static bool customdata_typemap_is_valid(const CustomData *data) static void *copy_layer_data(const eCustomDataType type, const void *data, const int totelem) { const LayerTypeInfo &type_info = *layerType_getInfo(type); - const int64_t size_in_bytes = int64_t(totelem) * type_info.size; - void *new_data = MEM_mallocN_aligned(size_in_bytes, type_info.alignment, __func__); if (type_info.copy) { + void *new_data = MEM_malloc_arrayN(size_t(totelem), type_info.size, __func__); type_info.copy(data, new_data, totelem); + return new_data; } - else { - memcpy(new_data, data, size_in_bytes); - } - return new_data; + return MEM_dupallocN(data); } static void free_layer_data(const eCustomDataType type, const void *data, const int totelem) @@ -2615,7 +2389,7 @@ void CustomData_realloc(CustomData *data, const int64_t old_size_in_bytes = int64_t(old_size) * typeInfo->size; const int64_t new_size_in_bytes = int64_t(new_size) * typeInfo->size; - void *new_layer_data = MEM_mallocN_aligned(new_size_in_bytes, typeInfo->alignment, __func__); + void *new_layer_data = MEM_mallocN(new_size_in_bytes, __func__); /* Copy data to new array. */ if (old_size_in_bytes) { if (typeInfo->copy) { @@ -2806,11 +2580,11 @@ int CustomData_get_layer_index_n(const CustomData *data, const eCustomDataType t int CustomData_get_named_layer_index(const CustomData *data, const eCustomDataType type, - const StringRef name) + const char *name) { for (int i = 0; i < data->totlayer; i++) { if (data->layers[i].type == type) { - if (data->layers[i].name == name) { + if (STREQ(data->layers[i].name, name)) { return i; } } @@ -2819,10 +2593,10 @@ int CustomData_get_named_layer_index(const CustomData *data, return -1; } -int CustomData_get_named_layer_index_notype(const CustomData *data, const StringRef name) +int CustomData_get_named_layer_index_notype(const CustomData *data, const char *name) { for (int i = 0; i < data->totlayer; i++) { - if (data->layers[i].name == name) { + if (STREQ(data->layers[i].name, name)) { return i; } } @@ -2863,7 +2637,7 @@ int CustomData_get_stencil_layer_index(const CustomData *data, const eCustomData int CustomData_get_named_layer(const CustomData *data, const eCustomDataType type, - const StringRef name) + const char *name) { const int named_index = CustomData_get_named_layer_index(data, type, name); const int layer_index = data->typemap[type]; @@ -3071,7 +2845,7 @@ static CustomDataLayer *customData_add_layer__internal( void *layer_data_to_assign, const ImplicitSharingInfo *sharing_info_to_assign, const int totelem, - StringRef name) + const char *name) { const LayerTypeInfo &type_info = *layerType_getInfo(type); int flag = 0; @@ -3103,27 +2877,23 @@ static CustomDataLayer *customData_add_layer__internal( * leaks into the new layer. */ memset(&new_layer, 0, sizeof(CustomDataLayer)); - const int64_t size_in_bytes = int64_t(totelem) * type_info.size; - const char *alloc_name = layerType_getName(type); - if (alloctype.has_value()) { switch (*alloctype) { case CD_SET_DEFAULT: { if (totelem > 0) { - new_layer.data = MEM_mallocN_aligned(size_in_bytes, type_info.alignment, alloc_name); if (type_info.set_default_value) { + new_layer.data = MEM_malloc_arrayN(totelem, type_info.size, layerType_getName(type)); type_info.set_default_value(new_layer.data, totelem); } else { - /* Alternatively, #MEM_calloc_arrayN is faster, but has no aligned version. */ - memset(new_layer.data, 0, size_in_bytes); + new_layer.data = MEM_calloc_arrayN(totelem, type_info.size, layerType_getName(type)); } } break; } case CD_CONSTRUCT: { if (totelem > 0) { - new_layer.data = MEM_mallocN_aligned(size_in_bytes, type_info.alignment, alloc_name); + new_layer.data = MEM_malloc_arrayN(totelem, type_info.size, layerType_getName(type)); if (type_info.construct) { type_info.construct(new_layer.data, totelem); } @@ -3156,12 +2926,12 @@ static CustomDataLayer *customData_add_layer__internal( /* Set default name if none exists. Note we only call DATA_() once * we know there is a default name, to avoid overhead of locale lookups * in the depsgraph. */ - if (name.is_empty() && type_info.defaultname) { + if (!name && type_info.defaultname) { name = DATA_(type_info.defaultname); } - if (!name.is_empty()) { - name.copy(new_layer.name); + if (name) { + STRNCPY(new_layer.name, name); CustomData_set_layer_unique_name(data, index); } else { @@ -3227,7 +2997,7 @@ void *CustomData_add_layer_named(CustomData *data, const eCustomDataType type, const eCDAllocType alloctype, const int totelem, - const StringRef name) + const char *name) { CustomDataLayer *layer = customData_add_layer__internal( data, type, alloctype, nullptr, nullptr, totelem, name); @@ -3243,7 +3013,7 @@ const void *CustomData_add_layer_named_with_data(CustomData *data, eCustomDataType type, void *layer_data, int totelem, - const StringRef name, + const char *name, const ImplicitSharingInfo *sharing_info) { CustomDataLayer *layer = customData_add_layer__internal( @@ -3262,7 +3032,7 @@ void *CustomData_add_layer_anonymous(CustomData *data, const int totelem, const AnonymousAttributeIDHandle *anonymous_id) { - const StringRef name = anonymous_id->name().c_str(); + const char *name = anonymous_id->name().c_str(); CustomDataLayer *layer = customData_add_layer__internal( data, type, alloctype, nullptr, nullptr, totelem, name); CustomData_update_typemap(data); @@ -3284,7 +3054,7 @@ const void *CustomData_add_layer_anonymous_with_data( void *layer_data, const ImplicitSharingInfo *sharing_info) { - const StringRef name = anonymous_id->name().c_str(); + const char *name = anonymous_id->name().c_str(); CustomDataLayer *layer = customData_add_layer__internal( data, type, std::nullopt, layer_data, sharing_info, totelem, name); CustomData_update_typemap(data); @@ -3352,7 +3122,7 @@ bool CustomData_free_layer(CustomData *data, return true; } -bool CustomData_free_layer_named(CustomData *data, const StringRef name, const int totelem) +bool CustomData_free_layer_named(CustomData *data, const char *name, const int totelem) { for (const int i : IndexRange(data->totlayer)) { const CustomDataLayer &layer = data->layers[i]; @@ -3383,7 +3153,7 @@ void CustomData_free_layers(CustomData *data, const eCustomDataType type, const bool CustomData_has_layer_named(const CustomData *data, const eCustomDataType type, - const StringRef name) + const char *name) { return CustomData_get_named_layer_index(data, type, name) != -1; } @@ -3761,7 +3531,7 @@ void *CustomData_get_layer_n_for_write(CustomData *data, const void *CustomData_get_layer_named(const CustomData *data, const eCustomDataType type, - const StringRef name) + const char *name) { int layer_index = CustomData_get_named_layer_index(data, type, name); if (layer_index == -1) { @@ -3772,7 +3542,7 @@ const void *CustomData_get_layer_named(const CustomData *data, void *CustomData_get_layer_named_for_write(CustomData *data, const eCustomDataType type, - const StringRef name, + const char *name, const int totelem) { const int layer_index = CustomData_get_named_layer_index(data, type, name); @@ -3805,7 +3575,7 @@ int CustomData_get_n_offset(const CustomData *data, const eCustomDataType type, int CustomData_get_offset_named(const CustomData *data, const eCustomDataType type, - const StringRef name) + const char *name) { int layer_index = CustomData_get_named_layer_index(data, type, name); if (layer_index == -1) { @@ -3818,14 +3588,15 @@ int CustomData_get_offset_named(const CustomData *data, bool CustomData_set_layer_name(CustomData *data, const eCustomDataType type, const int n, - const StringRef name) + const char *name) { const int layer_index = CustomData_get_layer_index_n(data, type, n); - if (layer_index == -1) { + + if ((layer_index == -1) || !name) { return false; } - name.copy(data->layers[layer_index].name); + STRNCPY(data->layers[layer_index].name, name); return true; } @@ -4510,7 +4281,7 @@ int CustomData_layertype_layers_max(const eCustomDataType type) } static bool cd_layer_find_dupe(CustomData *data, - const StringRef name, + const char *name, const eCustomDataType type, const int index) { @@ -4520,12 +4291,12 @@ static bool cd_layer_find_dupe(CustomData *data, CustomDataLayer *layer = &data->layers[i]; if (CD_TYPE_AS_MASK(type) & CD_MASK_PROP_ALL) { - if ((CD_TYPE_AS_MASK(layer->type) & CD_MASK_PROP_ALL) && layer->name == name) { + if ((CD_TYPE_AS_MASK(layer->type) & CD_MASK_PROP_ALL) && STREQ(layer->name, name)) { return true; } } else { - if (i != index && layer->type == type && layer->name == name) { + if (i != index && layer->type == type && STREQ(layer->name, name)) { return true; } } @@ -4587,13 +4358,13 @@ void CustomData_set_layer_unique_name(CustomData *data, const int index) void CustomData_validate_layer_name(const CustomData *data, const eCustomDataType type, - const StringRef name, + const char *name, char *outname) { int index = -1; /* if a layer name was given, try to find that layer */ - if (!name.is_empty()) { + if (name[0]) { index = CustomData_get_named_layer_index(data, type, name); } @@ -4605,9 +4376,7 @@ void CustomData_validate_layer_name(const CustomData *data, BLI_strncpy_utf8(outname, data->layers[index].name, MAX_CUSTOMDATA_LAYER_NAME); } else { - char name_c_str[MAX_CUSTOMDATA_LAYER_NAME]; - name.copy(name_c_str); - BLI_strncpy_utf8(outname, name_c_str, MAX_CUSTOMDATA_LAYER_NAME); + BLI_strncpy_utf8(outname, name, MAX_CUSTOMDATA_LAYER_NAME); } } @@ -5319,45 +5088,6 @@ static void write_grid_paint_mask(BlendWriter *writer, } } -static void blend_write_layer_data(BlendWriter *writer, - const CustomDataLayer &layer, - const int count) -{ - switch (layer.type) { - case CD_MDEFORMVERT: - BKE_defvert_blend_write(writer, count, static_cast(layer.data)); - break; - case CD_MDISPS: - write_mdisps( - writer, count, static_cast(layer.data), layer.flag & CD_FLAG_EXTERNAL); - break; - case CD_PAINT_MASK: - BLO_write_raw(writer, sizeof(float) * count, static_cast(layer.data)); - break; - case CD_GRID_PAINT_MASK: - write_grid_paint_mask(writer, count, static_cast(layer.data)); - break; - case CD_PROP_BOOL: - BLO_write_raw(writer, sizeof(bool) * count, static_cast(layer.data)); - break; - default: { - const char *structname; - int structnum; - CustomData_file_write_info(eCustomDataType(layer.type), &structname, &structnum); - if (structnum) { - int datasize = structnum * count; - BLO_write_struct_array_by_name(writer, structname, datasize, layer.data); - } - else if (!BLO_write_is_undo(writer)) { /* Do not warn on undo. */ - printf("%s error: layer '%s':%d - can't be written to file\n", - __func__, - structname, - layer.type); - } - } - } -} - void CustomData_blend_write(BlendWriter *writer, CustomData *data, Span layers_to_write, @@ -5374,10 +5104,39 @@ void CustomData_blend_write(BlendWriter *writer, writer, CustomDataLayer, data->totlayer, data->layers, layers_to_write.data()); for (const CustomDataLayer &layer : layers_to_write) { - const size_t size_in_bytes = CustomData_sizeof(eCustomDataType(layer.type)) * count; - BLO_write_shared(writer, layer.data, size_in_bytes, layer.sharing_info, [&]() { - blend_write_layer_data(writer, layer, count); - }); + switch (layer.type) { + case CD_MDEFORMVERT: + BKE_defvert_blend_write(writer, count, static_cast(layer.data)); + break; + case CD_MDISPS: + write_mdisps( + writer, count, static_cast(layer.data), layer.flag & CD_FLAG_EXTERNAL); + break; + case CD_PAINT_MASK: + BLO_write_raw(writer, sizeof(float) * count, static_cast(layer.data)); + break; + case CD_GRID_PAINT_MASK: + write_grid_paint_mask(writer, count, static_cast(layer.data)); + break; + case CD_PROP_BOOL: + BLO_write_raw(writer, sizeof(bool) * count, static_cast(layer.data)); + break; + default: { + const char *structname; + int structnum; + CustomData_file_write_info(eCustomDataType(layer.type), &structname, &structnum); + if (structnum) { + int datasize = structnum * count; + BLO_write_struct_array_by_name(writer, structname, datasize, layer.data); + } + else if (!BLO_write_is_undo(writer)) { /* Do not warn on undo. */ + printf("%s error: layer '%s':%d - can't be written to file\n", + __func__, + structname, + layer.type); + } + } + } } if (data->external) { @@ -5430,30 +5189,6 @@ static void blend_read_paint_mask(BlendDataReader *reader, } } -static void blend_read_layer_data(BlendDataReader *reader, CustomDataLayer &layer, const int count) -{ - BLO_read_data_address(reader, &layer.data); - if (CustomData_layer_ensure_data_exists(&layer, count)) { - /* Under normal operations, this shouldn't happen, but... - * For a CD_PROP_BOOL example, see #84935. - * For a CD_MLOOPUV example, see #90620. */ - CLOG_WARN(&LOG, - "Allocated custom data layer that was not saved correctly for layer.type = %d.", - layer.type); - } - - if (layer.type == CD_MDISPS) { - blend_read_mdisps( - reader, count, static_cast(layer.data), layer.flag & CD_FLAG_EXTERNAL); - } - else if (layer.type == CD_GRID_PAINT_MASK) { - blend_read_paint_mask(reader, count, static_cast(layer.data)); - } - else if (layer.type == CD_MDEFORMVERT) { - BKE_defvert_blend_read(reader, count, static_cast(layer.data)); - } -} - void CustomData_blend_read(BlendDataReader *reader, CustomData *data, const int count) { BLO_read_data_address(reader, &data->layers); @@ -5479,24 +5214,38 @@ void CustomData_blend_read(BlendDataReader *reader, CustomData *data, const int layer->sharing_info = nullptr; if (CustomData_verify_versions(data, i)) { - layer->sharing_info = BLO_read_shared( - reader, &layer->data, [&]() -> const ImplicitSharingInfo * { - blend_read_layer_data(reader, *layer, count); - if (layer->data == nullptr) { - return nullptr; - } - const ImplicitSharingInfo *sharing_info = sharing_info_by_data.lookup_default( - layer->data, nullptr); - if (sharing_info != nullptr) { - sharing_info->add_user(); - } - else { - sharing_info = make_implicit_sharing_info_for_layer( - eCustomDataType(layer->type), layer->data, count); - sharing_info_by_data.add(layer->data, sharing_info); - } - return sharing_info; - }); + BLO_read_data_address(reader, &layer->data); + if (layer->data != nullptr) { + /* Make layer data shareable. It's possible that the same data is shared between layers. */ + layer->sharing_info = sharing_info_by_data.lookup_default(layer->data, nullptr); + if (layer->sharing_info != nullptr) { + layer->sharing_info->add_user(); + } + else { + layer->sharing_info = make_implicit_sharing_info_for_layer( + eCustomDataType(layer->type), layer->data, count); + sharing_info_by_data.add(layer->data, layer->sharing_info); + } + } + if (CustomData_layer_ensure_data_exists(layer, count)) { + /* Under normal operations, this shouldn't happen, but... + * For a CD_PROP_BOOL example, see #84935. + * For a CD_MLOOPUV example, see #90620. */ + CLOG_WARN(&LOG, + "Allocated custom data layer that was not saved correctly for layer->type = %d.", + layer->type); + } + + if (layer->type == CD_MDISPS) { + blend_read_mdisps( + reader, count, static_cast(layer->data), layer->flag & CD_FLAG_EXTERNAL); + } + else if (layer->type == CD_GRID_PAINT_MASK) { + blend_read_paint_mask(reader, count, static_cast(layer->data)); + } + else if (layer->type == CD_MDEFORMVERT) { + BKE_defvert_blend_read(reader, count, static_cast(layer->data)); + } i++; } } @@ -5571,22 +5320,6 @@ std::optional custom_data_type_to_volume_grid_type(const eCustom } } -std::optional volume_grid_type_to_custom_data_type(const VolumeGridType type) -{ - switch (type) { - case VOLUME_GRID_FLOAT: - return CD_PROP_FLOAT; - case VOLUME_GRID_VECTOR_FLOAT: - return CD_PROP_FLOAT3; - case VOLUME_GRID_INT: - return CD_PROP_INT32; - case VOLUME_GRID_BOOLEAN: - return CD_PROP_BOOL; - default: - return std::nullopt; - } -} - /** \} */ } // namespace blender::bke diff --git a/source/blender/blenkernel/intern/data_transfer.cc b/source/blender/blenkernel/intern/data_transfer.cc index 89acffcdf4e..b339b75ec9b 100644 --- a/source/blender/blenkernel/intern/data_transfer.cc +++ b/source/blender/blenkernel/intern/data_transfer.cc @@ -30,7 +30,7 @@ #include "BKE_modifier.hh" #include "BKE_object.hh" #include "BKE_object_deform.h" -#include "BKE_report.hh" +#include "BKE_report.h" #include "DEG_depsgraph_query.hh" diff --git a/source/blender/blenkernel/intern/deform.cc b/source/blender/blenkernel/intern/deform.cc index b89af67c83e..35ae7115e98 100644 --- a/source/blender/blenkernel/intern/deform.cc +++ b/source/blender/blenkernel/intern/deform.cc @@ -28,7 +28,7 @@ #include "BLI_string_utils.hh" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_attribute.hh" #include "BKE_customdata.hh" diff --git a/source/blender/blenkernel/intern/displist.cc b/source/blender/blenkernel/intern/displist.cc index bcd71ea1cec..dfddc7e3221 100644 --- a/source/blender/blenkernel/intern/displist.cc +++ b/source/blender/blenkernel/intern/displist.cc @@ -15,8 +15,12 @@ #include "DNA_curve_types.h" #include "DNA_mesh_types.h" #include "DNA_object_types.h" +#include "DNA_scene_types.h" +#include "DNA_vfont_types.h" +#include "BLI_bitmap.h" #include "BLI_index_range.hh" +#include "BLI_linklist.h" #include "BLI_listbase.h" #include "BLI_math_rotation.h" #include "BLI_memarena.h" @@ -32,6 +36,7 @@ #include "BKE_geometry_set.hh" #include "BKE_key.hh" #include "BKE_lib_id.hh" +#include "BKE_mball.hh" #include "BKE_mesh.hh" #include "BKE_modifier.hh" #include "BKE_object.hh" diff --git a/source/blender/blenkernel/intern/dynamicpaint.cc b/source/blender/blenkernel/intern/dynamicpaint.cc index d4d1ec0c472..96d5c6f8c64 100644 --- a/source/blender/blenkernel/intern/dynamicpaint.cc +++ b/source/blender/blenkernel/intern/dynamicpaint.cc @@ -22,7 +22,7 @@ #include "BLI_threads.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_anim_types.h" #include "DNA_armature_types.h" @@ -40,7 +40,7 @@ #include "BKE_armature.hh" #include "BKE_bvhutils.hh" /* bvh tree */ -#include "BKE_collection.hh" +#include "BKE_collection.h" #include "BKE_collision.h" #include "BKE_colorband.hh" #include "BKE_constraint.h" @@ -60,7 +60,7 @@ #include "BKE_object.hh" #include "BKE_particle.h" #include "BKE_pointcache.h" -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "DEG_depsgraph.hh" #include "DEG_depsgraph_query.hh" @@ -3760,7 +3760,7 @@ struct DynamicPaintBrushVelocityData { const float (*positions_p)[3]; const float (*positions_c)[3]; - const float (*obmat)[4]; + float (*obmat)[4]; float (*prev_obmat)[4]; float timescale; @@ -3778,7 +3778,7 @@ static void dynamic_paint_brush_velocity_compute_cb(void *__restrict userdata, const float(*positions_p)[3] = data->positions_p; const float(*positions_c)[3] = data->positions_c; - const float(*obmat)[4] = data->obmat; + float(*obmat)[4] = data->obmat; float(*prev_obmat)[4] = data->prev_obmat; const float timescale = data->timescale; @@ -3832,7 +3832,7 @@ static void dynamicPaint_brushMeshCalculateVelocity(Depsgraph *depsgraph, float(*positions_p)[3] = reinterpret_cast( mesh_p->vert_positions_for_write().data()); - copy_m4_m4(prev_obmat, ob->object_to_world().ptr()); + copy_m4_m4(prev_obmat, ob->object_to_world); /* current frame mesh */ scene->r.cfra = cur_fra; @@ -3865,7 +3865,7 @@ static void dynamicPaint_brushMeshCalculateVelocity(Depsgraph *depsgraph, data.brush_vel = *brushVel; data.positions_p = positions_p; data.positions_c = positions_c; - data.obmat = ob->object_to_world().ptr(); + data.obmat = ob->object_to_world; data.prev_obmat = prev_obmat; data.timescale = timescale; @@ -3905,7 +3905,7 @@ static void dynamicPaint_brushObjectCalculateVelocity( SUBFRAME_RECURSION, BKE_scene_ctime_get(scene), eModifierType_DynamicPaint); - copy_m4_m4(prev_obmat, ob->object_to_world().ptr()); + copy_m4_m4(prev_obmat, ob->object_to_world); /* current frame mesh */ scene->r.cfra = cur_fra; @@ -3920,7 +3920,7 @@ static void dynamicPaint_brushObjectCalculateVelocity( /* calculate speed */ mul_m4_v3(prev_obmat, prev_loc); - mul_m4_v3(ob->object_to_world().ptr(), cur_loc); + mul_m4_v3(ob->object_to_world, cur_loc); sub_v3_v3v3(brushVel->v, cur_loc, prev_loc); mul_v3_fl(brushVel->v, 1.0f / timescale); @@ -4329,14 +4329,14 @@ static bool dynamicPaint_paintMesh(Depsgraph *depsgraph, * (Faster than transforming per surface point * coordinates and normals to object space) */ for (ii = 0; ii < numOfVerts; ii++) { - mul_m4_v3(brushOb->object_to_world().ptr(), positions[ii]); + mul_m4_v3(brushOb->object_to_world, positions[ii]); boundInsert(&mesh_bb, positions[ii]); /* for proximity project calculate average normal */ if (brush->flags & MOD_DPAINT_PROX_PROJECT && brush->collision != MOD_DPAINT_COL_VOLUME) { float nor[3]; copy_v3_v3(nor, vert_normals[ii]); - mul_mat3_m4_v3(brushOb->object_to_world().ptr(), nor); + mul_mat3_m4_v3(brushOb->object_to_world, nor); normalize_v3(nor); add_v3_v3(avg_brushNor, nor); @@ -5933,7 +5933,7 @@ static bool dynamicPaint_surfaceHasMoved(DynamicPaintSurface *surface, Object *o } /* matrix comparison */ - if (!equals_m4m4(bData->prev_obmat, ob->object_to_world().ptr())) { + if (!equals_m4m4(bData->prev_obmat, ob->object_to_world)) { return true; } @@ -6021,7 +6021,7 @@ static void dynamic_paint_generate_bake_data_cb(void *__restrict userdata, mul_v3_v3v3(scaled_nor, temp_nor, ob->scale); bData->bNormal[index].normal_scale = len_v3(scaled_nor); } - mul_mat3_m4_v3(ob->object_to_world().ptr(), temp_nor); + mul_mat3_m4_v3(ob->object_to_world, temp_nor); normalize_v3(temp_nor); negate_v3_v3(bData->bNormal[index].invNorm, temp_nor); } @@ -6059,7 +6059,7 @@ static void dynamic_paint_generate_bake_data_cb(void *__restrict userdata, mul_v3_v3v3(scaled_nor, temp_nor, ob->scale); bData->bNormal[index].normal_scale = len_v3(scaled_nor); } - mul_mat3_m4_v3(ob->object_to_world().ptr(), temp_nor); + mul_mat3_m4_v3(ob->object_to_world, temp_nor); normalize_v3(temp_nor); negate_v3_v3(bData->bNormal[index].invNorm, temp_nor); } @@ -6179,7 +6179,7 @@ static bool dynamicPaint_generateBakeData(DynamicPaintSurface *surface, bData->mesh_bounds.valid = false; for (index = 0; index < canvasNumOfVerts; index++) { copy_v3_v3(canvas_verts[index].v, positions[index]); - mul_m4_v3(ob->object_to_world().ptr(), canvas_verts[index].v); + mul_m4_v3(ob->object_to_world, canvas_verts[index].v); boundInsert(&bData->mesh_bounds, canvas_verts[index].v); } @@ -6209,7 +6209,7 @@ static bool dynamicPaint_generateBakeData(DynamicPaintSurface *surface, dynamicPaint_prepareAdjacencyData(surface, false); /* Copy current frame vertices to check against in next frame */ - copy_m4_m4(bData->prev_obmat, ob->object_to_world().ptr()); + copy_m4_m4(bData->prev_obmat, ob->object_to_world); memcpy(bData->prev_positions, positions.data(), canvasNumOfVerts * sizeof(float[3])); bData->clear = 0; diff --git a/source/blender/blenkernel/intern/editmesh.cc b/source/blender/blenkernel/intern/editmesh.cc index ef486e5e745..9e05b276535 100644 --- a/source/blender/blenkernel/intern/editmesh.cc +++ b/source/blender/blenkernel/intern/editmesh.cc @@ -19,6 +19,8 @@ #include "BKE_DerivedMesh.hh" #include "BKE_customdata.hh" #include "BKE_editmesh.hh" +#include "BKE_editmesh_cache.hh" +#include "BKE_lib_id.hh" #include "BKE_mesh.hh" #include "BKE_mesh_iterators.hh" #include "BKE_mesh_wrapper.hh" diff --git a/source/blender/blenkernel/intern/editmesh_cache.cc b/source/blender/blenkernel/intern/editmesh_cache.cc index fd244aa8d5a..682c8b3f317 100644 --- a/source/blender/blenkernel/intern/editmesh_cache.cc +++ b/source/blender/blenkernel/intern/editmesh_cache.cc @@ -14,6 +14,8 @@ #include "BLI_math_vector.h" #include "BLI_span.hh" +#include "DNA_mesh_types.h" + #include "BKE_editmesh.hh" #include "BKE_editmesh_cache.hh" /* own include */ diff --git a/source/blender/blenkernel/intern/editmesh_tangent.cc b/source/blender/blenkernel/intern/editmesh_tangent.cc index e9cb1aadc7f..eb03fbbb67f 100644 --- a/source/blender/blenkernel/intern/editmesh_tangent.cc +++ b/source/blender/blenkernel/intern/editmesh_tangent.cc @@ -12,6 +12,7 @@ #include "DNA_customdata_types.h" #include "DNA_defs.h" +#include "DNA_meshdata_types.h" #include "BKE_customdata.hh" #include "BKE_editmesh.hh" diff --git a/source/blender/blenkernel/intern/effect.cc b/source/blender/blenkernel/intern/effect.cc index c95e29e5547..59cb6543431 100644 --- a/source/blender/blenkernel/intern/effect.cc +++ b/source/blender/blenkernel/intern/effect.cc @@ -14,9 +14,11 @@ #include "MEM_guardedalloc.h" +#include "DNA_collection_types.h" #include "DNA_curve_types.h" #include "DNA_listBase.h" #include "DNA_mesh_types.h" +#include "DNA_meshdata_types.h" #include "DNA_object_force_types.h" #include "DNA_object_types.h" #include "DNA_particle_types.h" @@ -36,17 +38,20 @@ #include "BKE_anim_path.h" /* needed for where_on_path */ #include "BKE_bvhutils.hh" -#include "BKE_collection.hh" +#include "BKE_collection.h" #include "BKE_collision.h" #include "BKE_curve.hh" #include "BKE_displist.h" #include "BKE_effect.h" #include "BKE_fluid.h" -#include "BKE_global.hh" +#include "BKE_global.h" +#include "BKE_layer.hh" +#include "BKE_mesh.hh" #include "BKE_modifier.hh" #include "BKE_object.hh" #include "BKE_object_types.hh" #include "BKE_particle.h" +#include "BKE_scene.h" #include "DEG_depsgraph.hh" #include "DEG_depsgraph_physics.hh" @@ -79,7 +84,7 @@ PartDeflect *BKE_partdeflect_new(int type) pd->pdef_sbift = 0.2f; pd->pdef_sboft = 0.02f; pd->pdef_cfrict = 5.0f; - pd->seed = (uint(ceil(BLI_time_now_seconds())) + 1) % 128; + pd->seed = (uint(ceil(BLI_check_seconds_timer())) + 1) % 128; pd->f_strength = 1.0f; pd->f_damp = 1.0f; @@ -155,8 +160,8 @@ static void precalculate_effector(Depsgraph *depsgraph, EffectorCache *eff) if (eff->ob->runtime->curve_cache->anim_path_accum_length) { BKE_where_on_path( eff->ob, 0.0, eff->guide_loc, eff->guide_dir, nullptr, &eff->guide_radius, nullptr); - mul_m4_v3(eff->ob->object_to_world().ptr(), eff->guide_loc); - mul_mat3_m4_v3(eff->ob->object_to_world().ptr(), eff->guide_dir); + mul_m4_v3(eff->ob->object_to_world, eff->guide_loc); + mul_mat3_m4_v3(eff->ob->object_to_world, eff->guide_dir); } } } @@ -706,15 +711,15 @@ bool get_effector_data(EffectorCache *eff, } else if (eff->pd && eff->pd->shape == PFIELD_SHAPE_POINTS) { /* TODO: hair and points object support */ - const Mesh *mesh_eval = BKE_object_get_evaluated_mesh(eff->ob); - const blender::Span positions = mesh_eval->vert_positions(); - const blender::Span vert_normals = mesh_eval->vert_normals(); - if (mesh_eval != nullptr) { + const Mesh *me_eval = BKE_object_get_evaluated_mesh(eff->ob); + const blender::Span positions = me_eval->vert_positions(); + const blender::Span vert_normals = me_eval->vert_normals(); + if (me_eval != nullptr) { copy_v3_v3(efd->loc, positions[*efd->index]); copy_v3_v3(efd->nor, vert_normals[*efd->index]); - mul_m4_v3(eff->ob->object_to_world().ptr(), efd->loc); - mul_mat3_m4_v3(eff->ob->object_to_world().ptr(), efd->nor); + mul_m4_v3(eff->ob->object_to_world, efd->loc); + mul_mat3_m4_v3(eff->ob->object_to_world, efd->nor); normalize_v3(efd->nor); @@ -766,23 +771,23 @@ bool get_effector_data(EffectorCache *eff, const Object *ob = eff->ob; /* Use z-axis as normal. */ - normalize_v3_v3(efd->nor, ob->object_to_world().ptr()[2]); + normalize_v3_v3(efd->nor, ob->object_to_world[2]); if (eff->pd && ELEM(eff->pd->shape, PFIELD_SHAPE_PLANE, PFIELD_SHAPE_LINE)) { float temp[3], translate[3]; - sub_v3_v3v3(temp, point->loc, ob->object_to_world().location()); + sub_v3_v3v3(temp, point->loc, ob->object_to_world[3]); project_v3_v3v3(translate, temp, efd->nor); /* for vortex the shape chooses between old / new force */ if (eff->pd->forcefield == PFIELD_VORTEX || eff->pd->shape == PFIELD_SHAPE_LINE) { - add_v3_v3v3(efd->loc, ob->object_to_world().location(), translate); + add_v3_v3v3(efd->loc, ob->object_to_world[3], translate); } else { /* Normally `efd->loc` is closest point on effector XY-plane. */ sub_v3_v3v3(efd->loc, point->loc, translate); } } else { - copy_v3_v3(efd->loc, ob->object_to_world().location()); + copy_v3_v3(efd->loc, ob->object_to_world[3]); } zero_v3(efd->vel); @@ -807,8 +812,8 @@ bool get_effector_data(EffectorCache *eff, } else { /* for some effectors we need the object center every time */ - sub_v3_v3v3(efd->vec_to_point2, point->loc, eff->ob->object_to_world().location()); - normalize_v3_v3(efd->nor2, eff->ob->object_to_world().ptr()[2]); + sub_v3_v3v3(efd->vec_to_point2, point->loc, eff->ob->object_to_world[3]); + normalize_v3_v3(efd->nor2, eff->ob->object_to_world[2]); } } @@ -822,8 +827,8 @@ static void get_effector_tot( if (eff->pd->shape == PFIELD_SHAPE_POINTS) { /* TODO: hair and points object support */ - const Mesh *mesh_eval = BKE_object_get_evaluated_mesh(eff->ob); - *tot = mesh_eval != nullptr ? mesh_eval->verts_num : 1; + const Mesh *me_eval = BKE_object_get_evaluated_mesh(eff->ob); + *tot = me_eval != nullptr ? me_eval->verts_num : 1; if (*tot && eff->pd->forcefield == PFIELD_HARMONIC && point->index >= 0) { *p = point->index % *tot; @@ -881,7 +886,7 @@ static void do_texture_effector(EffectorCache *eff, copy_v3_v3(tex_co, point->loc); if (eff->pd->flag & PFIELD_TEX_OBJECT) { - mul_m4_v3(eff->ob->world_to_object().ptr(), tex_co); + mul_m4_v3(eff->ob->world_to_object, tex_co); if (eff->pd->flag & PFIELD_TEX_2D) { tex_co[2] = 0.0f; diff --git a/source/blender/blenkernel/intern/fcurve.cc b/source/blender/blenkernel/intern/fcurve.cc index 47b835fcefd..3bb8a7faf77 100644 --- a/source/blender/blenkernel/intern/fcurve.cc +++ b/source/blender/blenkernel/intern/fcurve.cc @@ -26,15 +26,15 @@ #include "BLI_sort_utils.h" #include "BLI_string_utils.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" -#include "BKE_anim_data.hh" +#include "BKE_anim_data.h" #include "BKE_animsys.h" #include "BKE_context.hh" #include "BKE_curve.hh" -#include "BKE_fcurve.hh" +#include "BKE_fcurve.h" #include "BKE_fcurve_driver.h" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_idprop.h" #include "BKE_lib_query.hh" #include "BKE_nla.h" @@ -2584,108 +2584,98 @@ void BKE_fmodifiers_blend_read_data(BlendDataReader *reader, ListBase *fmodifier } } -void BKE_fcurve_blend_write_data(BlendWriter *writer, FCurve *fcu) -{ - /* curve data */ - if (fcu->bezt) { - BLO_write_struct_array(writer, BezTriple, fcu->totvert, fcu->bezt); - } - if (fcu->fpt) { - BLO_write_struct_array(writer, FPoint, fcu->totvert, fcu->fpt); - } - - if (fcu->rna_path) { - BLO_write_string(writer, fcu->rna_path); - } - - /* driver data */ - if (fcu->driver) { - ChannelDriver *driver = fcu->driver; - - BLO_write_struct(writer, ChannelDriver, driver); - - /* variables */ - BLO_write_struct_list(writer, DriverVar, &driver->variables); - LISTBASE_FOREACH (DriverVar *, dvar, &driver->variables) { - DRIVER_TARGETS_USED_LOOPER_BEGIN (dvar) { - if (dtar->rna_path) { - BLO_write_string(writer, dtar->rna_path); - } - } - DRIVER_TARGETS_LOOPER_END; - } - } - - /* write F-Modifiers */ - BKE_fmodifiers_blend_write(writer, &fcu->modifiers); -} - -void BKE_fcurve_blend_write_listbase(BlendWriter *writer, ListBase *fcurves) +void BKE_fcurve_blend_write(BlendWriter *writer, ListBase *fcurves) { BLO_write_struct_list(writer, FCurve, fcurves); LISTBASE_FOREACH (FCurve *, fcu, fcurves) { - BKE_fcurve_blend_write_data(writer, fcu); - } -} - -void BKE_fcurve_blend_read_data(BlendDataReader *reader, FCurve *fcu) -{ - /* curve data */ - BLO_read_data_address(reader, &fcu->bezt); - BLO_read_data_address(reader, &fcu->fpt); - - /* rna path */ - BLO_read_data_address(reader, &fcu->rna_path); - - /* group */ - BLO_read_data_address(reader, &fcu->grp); - - /* clear disabled flag - allows disabled drivers to be tried again (#32155), - * but also means that another method for "reviving disabled F-Curves" exists - */ - fcu->flag &= ~FCURVE_DISABLED; - - /* driver */ - BLO_read_data_address(reader, &fcu->driver); - if (fcu->driver) { - ChannelDriver *driver = fcu->driver; - - /* Compiled expression data will need to be regenerated - * (old pointer may still be set here). */ - driver->expr_comp = nullptr; - driver->expr_simple = nullptr; - - /* Give the driver a fresh chance - the operating environment may be different now - * (addons, etc. may be different) so the driver namespace may be sane now #32155. */ - driver->flag &= ~DRIVER_FLAG_INVALID; - - /* relink variables, targets and their paths */ - BLO_read_list(reader, &driver->variables); - LISTBASE_FOREACH (DriverVar *, dvar, &driver->variables) { - DRIVER_TARGETS_LOOPER_BEGIN (dvar) { - /* only relink the targets being used */ - if (tarIndex < dvar->num_targets) { - BLO_read_data_address(reader, &dtar->rna_path); - } - else { - dtar->rna_path = nullptr; - dtar->id = nullptr; - } - } - DRIVER_TARGETS_LOOPER_END; + /* curve data */ + if (fcu->bezt) { + BLO_write_struct_array(writer, BezTriple, fcu->totvert, fcu->bezt); + } + if (fcu->fpt) { + BLO_write_struct_array(writer, FPoint, fcu->totvert, fcu->fpt); } - } - /* modifiers */ - BLO_read_list(reader, &fcu->modifiers); - BKE_fmodifiers_blend_read_data(reader, &fcu->modifiers, fcu); + if (fcu->rna_path) { + BLO_write_string(writer, fcu->rna_path); + } + + /* driver data */ + if (fcu->driver) { + ChannelDriver *driver = fcu->driver; + + BLO_write_struct(writer, ChannelDriver, driver); + + /* variables */ + BLO_write_struct_list(writer, DriverVar, &driver->variables); + LISTBASE_FOREACH (DriverVar *, dvar, &driver->variables) { + DRIVER_TARGETS_USED_LOOPER_BEGIN (dvar) { + if (dtar->rna_path) { + BLO_write_string(writer, dtar->rna_path); + } + } + DRIVER_TARGETS_LOOPER_END; + } + } + + /* write F-Modifiers */ + BKE_fmodifiers_blend_write(writer, &fcu->modifiers); + } } -void BKE_fcurve_blend_read_data_listbase(BlendDataReader *reader, ListBase *fcurves) +void BKE_fcurve_blend_read_data(BlendDataReader *reader, ListBase *fcurves) { /* Link F-Curve data to F-Curve again (non ID-libraries). */ LISTBASE_FOREACH (FCurve *, fcu, fcurves) { - BKE_fcurve_blend_read_data(reader, fcu); + /* curve data */ + BLO_read_data_address(reader, &fcu->bezt); + BLO_read_data_address(reader, &fcu->fpt); + + /* rna path */ + BLO_read_data_address(reader, &fcu->rna_path); + + /* group */ + BLO_read_data_address(reader, &fcu->grp); + + /* clear disabled flag - allows disabled drivers to be tried again (#32155), + * but also means that another method for "reviving disabled F-Curves" exists + */ + fcu->flag &= ~FCURVE_DISABLED; + + /* driver */ + BLO_read_data_address(reader, &fcu->driver); + if (fcu->driver) { + ChannelDriver *driver = fcu->driver; + + /* Compiled expression data will need to be regenerated + * (old pointer may still be set here). */ + driver->expr_comp = nullptr; + driver->expr_simple = nullptr; + + /* Give the driver a fresh chance - the operating environment may be different now + * (addons, etc. may be different) so the driver namespace may be sane now #32155. */ + driver->flag &= ~DRIVER_FLAG_INVALID; + + /* relink variables, targets and their paths */ + BLO_read_list(reader, &driver->variables); + LISTBASE_FOREACH (DriverVar *, dvar, &driver->variables) { + DRIVER_TARGETS_LOOPER_BEGIN (dvar) { + /* only relink the targets being used */ + if (tarIndex < dvar->num_targets) { + BLO_read_data_address(reader, &dtar->rna_path); + } + else { + dtar->rna_path = nullptr; + dtar->id = nullptr; + } + } + DRIVER_TARGETS_LOOPER_END; + } + } + + /* modifiers */ + BLO_read_list(reader, &fcu->modifiers); + BKE_fmodifiers_blend_read_data(reader, &fcu->modifiers, fcu); } } diff --git a/source/blender/blenkernel/intern/fcurve_cache.cc b/source/blender/blenkernel/intern/fcurve_cache.cc index fbbafb035ff..47829e9f752 100644 --- a/source/blender/blenkernel/intern/fcurve_cache.cc +++ b/source/blender/blenkernel/intern/fcurve_cache.cc @@ -18,7 +18,7 @@ #include "BLI_ghash.h" #include "BLI_listbase.h" -#include "BKE_fcurve.hh" +#include "BKE_fcurve.h" /* -------------------------------------------------------------------- */ /** \name F-Curve Path Cache diff --git a/source/blender/blenkernel/intern/fcurve_driver.cc b/source/blender/blenkernel/intern/fcurve_driver.cc index 7a96a106d1f..f7c02eabe9a 100644 --- a/source/blender/blenkernel/intern/fcurve_driver.cc +++ b/source/blender/blenkernel/intern/fcurve_driver.cc @@ -25,14 +25,14 @@ #include "BLI_threads.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_action.h" #include "BKE_animsys.h" #include "BKE_armature.hh" #include "BKE_constraint.h" #include "BKE_fcurve_driver.h" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_object.hh" #include "RNA_access.hh" @@ -435,7 +435,7 @@ static float dvar_eval_rotDiff(const AnimationEvalContext * /*anim_eval_context* return 0.0f; } - const float(*mat[2])[4]; + float(*mat[2])[4]; /* NOTE: for now, these are all just world-space. */ for (int i = 0; i < 2; i++) { @@ -457,7 +457,7 @@ static float dvar_eval_rotDiff(const AnimationEvalContext * /*anim_eval_context* } else { /* Object. */ - mat[i] = ob->object_to_world().ptr(); + mat[i] = ob->object_to_world; } } @@ -537,7 +537,7 @@ static float dvar_eval_locDiff(const AnimationEvalContext * /*anim_eval_context* else { /* Convert to world-space. */ copy_v3_v3(tmp_loc, pchan->pose_head); - mul_m4_v3(ob->object_to_world().ptr(), tmp_loc); + mul_m4_v3(ob->object_to_world, tmp_loc); } } else { @@ -548,7 +548,7 @@ static float dvar_eval_locDiff(const AnimationEvalContext * /*anim_eval_context* float mat[4][4]; /* Extract transform just like how the constraints do it! */ - copy_m4_m4(mat, ob->object_to_world().ptr()); + copy_m4_m4(mat, ob->object_to_world); BKE_constraint_mat_convertspace( ob, nullptr, nullptr, mat, CONSTRAINT_SPACE_WORLD, CONSTRAINT_SPACE_LOCAL, false); @@ -562,7 +562,7 @@ static float dvar_eval_locDiff(const AnimationEvalContext * /*anim_eval_context* } else { /* World-space. */ - copy_v3_v3(tmp_loc, ob->object_to_world().location()); + copy_v3_v3(tmp_loc, ob->object_to_world[3]); } } @@ -604,17 +604,12 @@ static float dvar_eval_transChan(const AnimationEvalContext * /*anim_eval_contex return 0.0f; } - /* Try to get pose-channel. */ - pchan = BKE_pose_channel_find_name(ob->pose, dtar->pchan_name); - if (dtar->pchan_name[0] != '\0' && !pchan) { - driver->flag |= DRIVER_FLAG_INVALID; - dtar->flag |= DTAR_FLAG_INVALID; - return 0.0f; - } - /* Target should be valid now. */ dtar->flag &= ~DTAR_FLAG_INVALID; + /* Try to get pose-channel. */ + pchan = BKE_pose_channel_find_name(ob->pose, dtar->pchan_name); + /* Check if object or bone, and get transform matrix accordingly: * - "use_eulers" code is used to prevent the problems associated with non-uniqueness * of euler decomposition from matrices #20870. @@ -645,7 +640,7 @@ static float dvar_eval_transChan(const AnimationEvalContext * /*anim_eval_contex } else { /* World-space matrix. */ - mul_m4_m4m4(mat, ob->object_to_world().ptr(), pchan->pose_mat); + mul_m4_m4m4(mat, ob->object_to_world, pchan->pose_mat); } } else { @@ -659,7 +654,7 @@ static float dvar_eval_transChan(const AnimationEvalContext * /*anim_eval_contex if (dtar->flag & DTAR_FLAG_LOCALSPACE) { if (dtar->flag & DTAR_FLAG_LOCAL_CONSTS) { /* Just like how the constraints do it! */ - copy_m4_m4(mat, ob->object_to_world().ptr()); + copy_m4_m4(mat, ob->object_to_world); BKE_constraint_mat_convertspace( ob, nullptr, nullptr, mat, CONSTRAINT_SPACE_WORLD, CONSTRAINT_SPACE_LOCAL, false); } @@ -670,7 +665,7 @@ static float dvar_eval_transChan(const AnimationEvalContext * /*anim_eval_contex } else { /* World-space matrix - just the good-old one. */ - copy_m4_m4(mat, ob->object_to_world().ptr()); + copy_m4_m4(mat, ob->object_to_world); } } diff --git a/source/blender/blenkernel/intern/fcurve_test.cc b/source/blender/blenkernel/intern/fcurve_test.cc index 5f397bfac3c..07c0cb9a727 100644 --- a/source/blender/blenkernel/intern/fcurve_test.cc +++ b/source/blender/blenkernel/intern/fcurve_test.cc @@ -5,7 +5,7 @@ #include "MEM_guardedalloc.h" -#include "BKE_fcurve.hh" +#include "BKE_fcurve.h" #include "ANIM_fcurve.hh" diff --git a/source/blender/blenkernel/intern/fluid.cc b/source/blender/blenkernel/intern/fluid.cc index 9e708c37573..323c1feec2f 100644 --- a/source/blender/blenkernel/intern/fluid.cc +++ b/source/blender/blenkernel/intern/fluid.cc @@ -29,7 +29,7 @@ #include "BKE_attribute.hh" #include "BKE_effect.h" #include "BKE_fluid.h" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_layer.hh" #include "BKE_lib_id.hh" #include "BKE_modifier.hh" @@ -62,7 +62,7 @@ # include "BKE_mesh_runtime.hh" # include "BKE_object.hh" # include "BKE_particle.h" -# include "BKE_scene.hh" +# include "BKE_scene.h" # include "BKE_texture.h" # include "DEG_depsgraph.hh" @@ -432,7 +432,7 @@ static void manta_set_domain_from_mesh(FluidDomainSettings *fds, copy_v3_v3(fds->global_size, size); copy_v3_v3(fds->dp0, min); - invert_m4_m4(fds->imat, ob->object_to_world().ptr()); + invert_m4_m4(fds->imat, ob->object_to_world); /* Prevent crash when initializing a plane as domain. */ if (!init_resolution || (size[0] < FLT_EPSILON) || (size[1] < FLT_EPSILON) || @@ -498,8 +498,8 @@ static bool fluid_modifier_init( zero_v3(fds->shift_f); add_v3_fl(fds->shift_f, 0.5f); zero_v3(fds->prev_loc); - mul_m4_v3(ob->object_to_world().ptr(), fds->prev_loc); - copy_m4_m4(fds->obmat, ob->object_to_world().ptr()); + mul_m4_v3(ob->object_to_world, fds->prev_loc); + copy_m4_m4(fds->obmat, ob->object_to_world); /* Set resolutions. */ if (fmd->domain->type == FLUID_DOMAIN_TYPE_GAS && @@ -567,11 +567,11 @@ static int get_light(Scene *scene, ViewLayer *view_layer, float *light) Light *la = static_cast(base_tmp->object->data); if (la->type == LA_LOCAL) { - copy_v3_v3(light, base_tmp->object->object_to_world().location()); + copy_v3_v3(light, base_tmp->object->object_to_world[3]); return 1; } if (!found_light) { - copy_v3_v3(light, base_tmp->object->object_to_world().location()); + copy_v3_v3(light, base_tmp->object->object_to_world[3]); found_light = 1; } } @@ -1049,7 +1049,7 @@ static void obstacles_from_mesh(Object *coll_ob, float co[3]; /* Vertex position. */ - mul_m4_v3(coll_ob->object_to_world().ptr(), positions[i]); + mul_m4_v3(coll_ob->object_to_world, positions[i]); manta_pos_to_cell(fds, positions[i]); /* Vertex velocity. */ @@ -2111,7 +2111,7 @@ static void emit_from_mesh( * This is valid because the mesh is copied above. */ for (i = 0; i < numverts; i++) { /* Vertex position. */ - mul_m4_v3(flow_ob->object_to_world().ptr(), positions[i]); + mul_m4_v3(flow_ob->object_to_world, positions[i]); manta_pos_to_cell(fds, positions[i]); /* Vertex velocity. */ @@ -2129,7 +2129,7 @@ static void emit_from_mesh( bb_boundInsert(bb, positions[i]); } mesh->tag_positions_changed(); - mul_m4_v3(flow_ob->object_to_world().ptr(), flow_center); + mul_m4_v3(flow_ob->object_to_world, flow_center); manta_pos_to_cell(fds, flow_center); /* Set emission map. @@ -2198,7 +2198,7 @@ static void adaptive_domain_adjust( float frame_shift_f[3]; float ob_loc[3] = {0}; - mul_m4_v3(ob->object_to_world().ptr(), ob_loc); + mul_m4_v3(ob->object_to_world, ob_loc); sub_v3_v3v3(frame_shift_f, ob_loc, fds->prev_loc); copy_v3_v3(fds->prev_loc, ob_loc); @@ -3488,12 +3488,12 @@ static Mesh *create_smoke_geometry(FluidDomainSettings *fds, Mesh *orgmesh, Obje /* Calculate required shift to match domain's global position * it was originally simulated at (if object moves without manta step). */ - invert_m4_m4(ob->runtime->world_to_object.ptr(), ob->object_to_world().ptr()); - mul_m4_v3(ob->object_to_world().ptr(), ob_loc); + invert_m4_m4(ob->world_to_object, ob->object_to_world); + mul_m4_v3(ob->object_to_world, ob_loc); mul_m4_v3(fds->obmat, ob_cache_loc); sub_v3_v3v3(fds->obj_shift_f, ob_cache_loc, ob_loc); /* Convert shift to local space and apply to vertices. */ - mul_mat3_m4_v3(ob->world_to_object().ptr(), fds->obj_shift_f); + mul_mat3_m4_v3(ob->world_to_object, fds->obj_shift_f); /* Apply shift to vertices. */ for (int i = 0; i < num_verts; i++) { add_v3_v3(positions[i], fds->obj_shift_f); @@ -3518,8 +3518,8 @@ static int manta_step( bool mode_replay = (mode == FLUID_DOMAIN_CACHE_REPLAY); /* Update object state. */ - invert_m4_m4(fds->imat, ob->object_to_world().ptr()); - copy_m4_m4(fds->obmat, ob->object_to_world().ptr()); + invert_m4_m4(fds->imat, ob->object_to_world); + copy_m4_m4(fds->obmat, ob->object_to_world); /* Gas domain might use adaptive domain. */ if (fds->type == FLUID_DOMAIN_TYPE_GAS) { diff --git a/source/blender/blenkernel/intern/fmodifier.cc b/source/blender/blenkernel/intern/fmodifier.cc index f3e1eac3bfd..da3f3ae90a2 100644 --- a/source/blender/blenkernel/intern/fmodifier.cc +++ b/source/blender/blenkernel/intern/fmodifier.cc @@ -20,7 +20,7 @@ #include "DNA_anim_types.h" #include "DNA_screen_types.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BLI_blenlib.h" #include "BLI_ghash.h" @@ -28,7 +28,7 @@ #include "BLI_noise.h" #include "BLI_utildefines.h" -#include "BKE_fcurve.hh" +#include "BKE_fcurve.h" #include "BKE_idprop.h" static CLG_LogRef LOG = {"bke.fmodifier"}; diff --git a/source/blender/blenkernel/intern/freestyle.cc b/source/blender/blenkernel/intern/freestyle.cc index b98f346b5a3..41e19cc4a0a 100644 --- a/source/blender/blenkernel/intern/freestyle.cc +++ b/source/blender/blenkernel/intern/freestyle.cc @@ -15,7 +15,7 @@ #include "BLI_math_rotation.h" #include "BLI_string_utils.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_freestyle.h" #include "BKE_lib_id.hh" diff --git a/source/blender/blenkernel/intern/geometry_component_curves.cc b/source/blender/blenkernel/intern/geometry_component_curves.cc index 896480d0ad7..afaae85fa12 100644 --- a/source/blender/blenkernel/intern/geometry_component_curves.cc +++ b/source/blender/blenkernel/intern/geometry_component_curves.cc @@ -8,6 +8,7 @@ #include "DNA_curve_types.h" #include "BKE_attribute_math.hh" +#include "BKE_curve.hh" #include "BKE_curves.hh" #include "BKE_deform.hh" #include "BKE_geometry_fields.hh" diff --git a/source/blender/blenkernel/intern/geometry_component_instances.cc b/source/blender/blenkernel/intern/geometry_component_instances.cc index 8137526d7f8..a417f29faf4 100644 --- a/source/blender/blenkernel/intern/geometry_component_instances.cc +++ b/source/blender/blenkernel/intern/geometry_component_instances.cc @@ -7,16 +7,23 @@ #include "BLI_index_mask.hh" #include "BLI_map.hh" #include "BLI_math_matrix_types.hh" +#include "BLI_rand.hh" #include "BLI_set.hh" #include "BLI_span.hh" #include "BLI_task.hh" #include "BLI_vector.hh" +#include "DNA_collection_types.h" + +#include "BKE_attribute_math.hh" #include "BKE_geometry_set.hh" +#include "BKE_geometry_set_instances.hh" #include "BKE_instances.hh" #include "attribute_access_intern.hh" +#include "BLI_cpp_type_make.hh" + namespace blender::bke { /* -------------------------------------------------------------------- */ @@ -102,6 +109,65 @@ void InstancesComponent::replace(Instances *instances, GeometryOwnershipType own ownership_ = ownership; } +static float3 get_transform_position(const float4x4 &transform) +{ + return transform.location(); +} + +static void set_transform_position(float4x4 &transform, const float3 position) +{ + transform.location() = position; +} + +class InstancePositionAttributeProvider final : public BuiltinAttributeProvider { + public: + InstancePositionAttributeProvider() + : BuiltinAttributeProvider( + "position", AttrDomain::Instance, CD_PROP_FLOAT3, NonCreatable, NonDeletable) + { + } + + GAttributeReader try_get_for_read(const void *owner) const final + { + const Instances *instances = static_cast(owner); + if (instances == nullptr) { + return {}; + } + Span transforms = instances->transforms(); + return {VArray::ForDerivedSpan(transforms), + domain_, + nullptr}; + } + + GAttributeWriter try_get_for_write(void *owner) const final + { + Instances *instances = static_cast(owner); + if (instances == nullptr) { + return {}; + } + MutableSpan transforms = instances->transforms(); + return {VMutableArray::ForDerivedSpan(transforms), + domain_}; + } + + bool try_delete(void * /*owner*/) const final + { + return false; + } + + bool try_create(void * /*owner*/, const AttributeInit & /*initializer*/) const final + { + return false; + } + + bool exists(const void * /*owner*/) const final + { + return true; + } +}; + static void tag_component_reference_index_changed(void *owner) { Instances &instances = *static_cast(owner); @@ -110,6 +176,7 @@ static void tag_component_reference_index_changed(void *owner) static ComponentAttributeProviders create_attribute_providers_for_instances() { + static InstancePositionAttributeProvider position; static CustomDataAccessInfo instance_custom_data_access = { [](void *owner) -> CustomData * { Instances *instances = static_cast(owner); @@ -139,15 +206,6 @@ static ComponentAttributeProviders create_attribute_providers_for_instances() instance_custom_data_access, nullptr); - static BuiltinCustomDataLayerProvider instance_transform("instance_transform", - AttrDomain::Instance, - CD_PROP_FLOAT4X4, - CD_PROP_FLOAT4X4, - BuiltinAttributeProvider::Creatable, - BuiltinAttributeProvider::NonDeletable, - instance_custom_data_access, - nullptr); - /** Indices into `Instances::references_`. Determines what data is instanced. */ static BuiltinCustomDataLayerProvider reference_index(".reference_index", AttrDomain::Instance, @@ -161,8 +219,7 @@ static ComponentAttributeProviders create_attribute_providers_for_instances() static CustomDataAttributeProvider instance_custom_data(AttrDomain::Instance, instance_custom_data_access); - return ComponentAttributeProviders({&instance_transform, &id, &reference_index}, - {&instance_custom_data}); + return ComponentAttributeProviders({&position, &id, &reference_index}, {&instance_custom_data}); } static AttributeAccessorFunctions get_instances_accessor_functions() diff --git a/source/blender/blenkernel/intern/geometry_component_volume.cc b/source/blender/blenkernel/intern/geometry_component_volume.cc index 9432ad924cf..61fb943d29e 100644 --- a/source/blender/blenkernel/intern/geometry_component_volume.cc +++ b/source/blender/blenkernel/intern/geometry_component_volume.cc @@ -2,6 +2,8 @@ * * SPDX-License-Identifier: GPL-2.0-or-later */ +#include "DNA_volume_types.h" + #include "BKE_geometry_set.hh" #include "BKE_lib_id.hh" #include "BKE_volume.hh" diff --git a/source/blender/blenkernel/intern/geometry_fields.cc b/source/blender/blenkernel/intern/geometry_fields.cc index 1a761980cb4..90005f27e55 100644 --- a/source/blender/blenkernel/intern/geometry_fields.cc +++ b/source/blender/blenkernel/intern/geometry_fields.cc @@ -17,7 +17,7 @@ #include "DNA_mesh_types.h" #include "DNA_pointcloud_types.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include @@ -396,14 +396,9 @@ GVArray AttributeFieldInput::get_varray_for_context(const GeometryFieldContext & } } } - else if (context.domain() == bke::AttrDomain::Instance && name_ == "position") { - /* Special case for "position" which is no longer an attribute on instances. */ - return bke::instance_position_varray(*context.instances()); - } else if (auto attributes = context.attributes()) { return *attributes->lookup(name_, domain, data_type); } - return {}; } diff --git a/source/blender/blenkernel/intern/geometry_set.cc b/source/blender/blenkernel/intern/geometry_set.cc index 4ec6078443a..a2797f8880f 100644 --- a/source/blender/blenkernel/intern/geometry_set.cc +++ b/source/blender/blenkernel/intern/geometry_set.cc @@ -6,7 +6,7 @@ #include "BLI_map.hh" #include "BLI_task.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_attribute.hh" #include "BKE_curves.hh" diff --git a/source/blender/blenkernel/intern/geometry_set_instances.cc b/source/blender/blenkernel/intern/geometry_set_instances.cc index 44fe085a2e7..b62e70f2ba2 100644 --- a/source/blender/blenkernel/intern/geometry_set_instances.cc +++ b/source/blender/blenkernel/intern/geometry_set_instances.cc @@ -2,9 +2,10 @@ * * SPDX-License-Identifier: GPL-2.0-or-later */ -#include "BKE_collection.hh" +#include "BKE_collection.h" #include "BKE_geometry_set_instances.hh" #include "BKE_instances.hh" +#include "BKE_mesh.hh" #include "BKE_mesh_wrapper.hh" #include "BKE_modifier.hh" #include "BKE_object_types.hh" @@ -131,21 +132,13 @@ void Instances::ensure_geometry_instances() * collection as instances. */ std::unique_ptr instances = std::make_unique(); Collection &collection = reference.collection(); - - Vector objects; FOREACH_COLLECTION_OBJECT_RECURSIVE_BEGIN (&collection, object) { - objects.append(object); + const int handle = instances->add_reference(*object); + instances->add_instance(handle, float4x4(object->object_to_world)); + float4x4 &transform = instances->transforms().last(); + transform.location() -= collection.instance_offset; } FOREACH_COLLECTION_OBJECT_RECURSIVE_END; - - instances->resize(objects.size()); - MutableSpan handles = instances->reference_handles_for_write(); - MutableSpan transforms = instances->transforms_for_write(); - for (const int i : objects.index_range()) { - handles[i] = instances->add_reference(*objects[i]); - transforms[i] = objects[i]->object_to_world(); - transforms[i].location() -= collection.instance_offset; - } instances->ensure_geometry_instances(); new_references.append(GeometrySet::from_instances(instances.release())); break; diff --git a/source/blender/blenkernel/intern/gpencil_curve_legacy.cc b/source/blender/blenkernel/intern/gpencil_curve_legacy.cc index 73278ce2585..3c3bb2402f2 100644 --- a/source/blender/blenkernel/intern/gpencil_curve_legacy.cc +++ b/source/blender/blenkernel/intern/gpencil_curve_legacy.cc @@ -12,12 +12,15 @@ #include #include +#include "CLG_log.h" + #include "MEM_guardedalloc.h" +#include "BLI_blenlib.h" #include "BLI_math_color.h" #include "BLI_math_vector.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_collection_types.h" #include "DNA_gpencil_legacy_types.h" @@ -25,12 +28,15 @@ #include "DNA_meshdata_types.h" #include "DNA_scene_types.h" -#include "BKE_collection.hh" +#include "BKE_collection.h" +#include "BKE_context.hh" #include "BKE_curve.hh" #include "BKE_gpencil_curve_legacy.h" #include "BKE_gpencil_geom_legacy.h" #include "BKE_gpencil_legacy.h" +#include "BKE_main.hh" #include "BKE_material.h" +#include "BKE_object.hh" extern "C" { #include "curve_fit_nd.h" @@ -534,7 +540,7 @@ void BKE_gpencil_convert_curve(Main *bmain, ob_gp->actcol = actcol; /* Tag for recalculation */ - DEG_id_tag_update(&gpd->id, ID_RECALC_GEOMETRY | ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&gpd->id, ID_RECALC_GEOMETRY | ID_RECALC_COPY_ON_WRITE); DEG_id_tag_update(&ob_gp->id, ID_RECALC_GEOMETRY); } diff --git a/source/blender/blenkernel/intern/gpencil_geom_legacy.cc b/source/blender/blenkernel/intern/gpencil_geom_legacy.cc index 9b5d2023c40..3ce5e8bacd3 100644 --- a/source/blender/blenkernel/intern/gpencil_geom_legacy.cc +++ b/source/blender/blenkernel/intern/gpencil_geom_legacy.cc @@ -13,6 +13,8 @@ #include #include +#include "CLG_log.h" + #include "MEM_guardedalloc.h" #include "BLI_array_utils.h" @@ -36,13 +38,19 @@ #include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" #include "DNA_scene_types.h" +#include "DNA_screen_types.h" + +#include "BLT_translation.h" #include "BKE_attribute.hh" +#include "BKE_context.hh" #include "BKE_deform.hh" #include "BKE_gpencil_curve_legacy.h" #include "BKE_gpencil_geom_legacy.h" #include "BKE_gpencil_legacy.h" +#include "BKE_main.hh" #include "BKE_material.h" +#include "BKE_mesh.hh" #include "BKE_object.hh" #include "BKE_object_types.hh" @@ -2660,21 +2668,21 @@ bool BKE_gpencil_convert_mesh(Main *bmain, /* Use evaluated data to get mesh with all modifiers on top. */ Object *ob_eval = (Object *)DEG_get_evaluated_object(depsgraph, ob_mesh); - const Mesh *mesh_eval = BKE_object_get_evaluated_mesh(ob_eval); - const Span positions = mesh_eval->vert_positions(); - const OffsetIndices faces = mesh_eval->faces(); - const Span corner_verts = mesh_eval->corner_verts(); - int faces_len = mesh_eval->faces_num; + const Mesh *me_eval = BKE_object_get_evaluated_mesh(ob_eval); + const Span positions = me_eval->vert_positions(); + const OffsetIndices faces = me_eval->faces(); + const Span corner_verts = me_eval->corner_verts(); + int faces_len = me_eval->faces_num; char element_name[200]; /* Need at least an edge. */ - if (mesh_eval->edges_num < 1) { + if (me_eval->edges_num < 1) { return false; } /* Create matching vertex groups. */ - BKE_defgroup_copy_list(&gpd->vertex_group_names, &mesh_eval->vertex_group_names); - gpd->vertex_group_active_index = mesh_eval->vertex_group_active_index; + BKE_defgroup_copy_list(&gpd->vertex_group_names, &me_eval->vertex_group_names); + gpd->vertex_group_active_index = me_eval->vertex_group_active_index; const float default_colors[2][4] = {{0.0f, 0.0f, 0.0f, 1.0f}, {0.7f, 0.7f, 0.7f, 1.0f}}; /* Lookup existing stroke material on gp object. */ @@ -2700,7 +2708,7 @@ bool BKE_gpencil_convert_mesh(Main *bmain, gpl_fill, scene->r.cfra + frame_offset, GP_GETFRAME_ADD_NEW); int i; - const VArray mesh_material_indices = *mesh_eval->attributes().lookup_or_default( + const VArray mesh_material_indices = *me_eval->attributes().lookup_or_default( "material_index", AttrDomain::Face, 0); for (i = 0; i < faces_len; i++) { const IndexRange face = faces[i]; @@ -2727,7 +2735,7 @@ bool BKE_gpencil_convert_mesh(Main *bmain, gps_fill->flag |= GP_STROKE_CYCLIC; /* Create dvert data. */ - const Span dverts = mesh_eval->deform_verts(); + const Span dverts = me_eval->deform_verts(); if (use_vgroups && !dverts.is_empty()) { gps_fill->dvert = (MDeformVert *)MEM_callocN(sizeof(MDeformVert) * face.size(), "gp_fill_dverts"); @@ -2788,7 +2796,7 @@ bool BKE_gpencil_convert_mesh(Main *bmain, use_vgroups); /* Tag for recalculation */ - DEG_id_tag_update(&gpd->id, ID_RECALC_GEOMETRY | ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&gpd->id, ID_RECALC_GEOMETRY | ID_RECALC_COPY_ON_WRITE); return true; } @@ -3972,7 +3980,7 @@ static int generate_perimeter_cap(const float point[4], /** * Calculate the perimeter (outline) of a stroke as list of tPerimeterPoint. * \param subdivisions: Number of subdivisions for the start and end caps - * \return list of tPerimeterPoint. + * \return: list of tPerimeterPoint */ static ListBase *gpencil_stroke_perimeter_ex(const bGPdata *gpd, const bGPDlayer *gpl, diff --git a/source/blender/blenkernel/intern/gpencil_legacy.cc b/source/blender/blenkernel/intern/gpencil_legacy.cc index 3628aa1c7ac..fed98c9344c 100644 --- a/source/blender/blenkernel/intern/gpencil_legacy.cc +++ b/source/blender/blenkernel/intern/gpencil_legacy.cc @@ -11,7 +11,6 @@ #include #include #include -#include #include "CLG_log.h" @@ -22,7 +21,7 @@ #include "BLI_math_vector.h" #include "BLI_string_utils.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "IMB_interp.hh" @@ -35,8 +34,8 @@ #include "DNA_space_types.h" #include "BKE_action.h" -#include "BKE_anim_data.hh" -#include "BKE_collection.hh" +#include "BKE_anim_data.h" +#include "BKE_collection.h" #include "BKE_colortools.hh" #include "BKE_deform.hh" #include "BKE_gpencil_geom_legacy.h" @@ -60,7 +59,6 @@ static CLG_LogRef LOG = {"bke.gpencil"}; static void greasepencil_copy_data(Main * /*bmain*/, - std::optional /*owner_library*/, ID *id_dst, const ID *id_src, const int /*flag*/) @@ -266,7 +264,6 @@ static void greasepencil_blend_read_data(BlendDataReader *reader, ID *id) IDTypeInfo IDType_ID_GD_LEGACY = { /*id_code*/ ID_GD_LEGACY, /*id_filter*/ FILTER_ID_GD_LEGACY, - /*dependencies_id_types*/ FILTER_ID_MA, /*main_listbase_index*/ INDEX_ID_GD_LEGACY, /*struct_size*/ sizeof(bGPdata), /*name*/ "GPencil", @@ -1061,7 +1058,7 @@ bGPdata *BKE_gpencil_data_duplicate(Main *bmain, const bGPdata *gpd_src, bool in } /* Copy internal data (layers, etc.) */ - greasepencil_copy_data(bmain, std::nullopt, &gpd_dst->id, &gpd_src->id, 0); + greasepencil_copy_data(bmain, &gpd_dst->id, &gpd_src->id, 0); /* return new */ return gpd_dst; @@ -2699,7 +2696,7 @@ void BKE_gpencil_layer_transform_matrix_get(const Depsgraph *depsgraph, /* if not layer parented, try with object parented */ if (obparent_eval == nullptr) { if ((ob_eval != nullptr) && (ob_eval->type == OB_GPENCIL_LEGACY)) { - copy_m4_m4(diff_mat, ob_eval->object_to_world().ptr()); + copy_m4_m4(diff_mat, ob_eval->object_to_world); mul_m4_m4m4(diff_mat, diff_mat, gpl->layer_mat); return; } @@ -2709,8 +2706,8 @@ void BKE_gpencil_layer_transform_matrix_get(const Depsgraph *depsgraph, } if (ELEM(gpl->partype, PAROBJECT, PARSKEL)) { - mul_m4_m4m4(diff_mat, obparent_eval->object_to_world().ptr(), gpl->inverse); - add_v3_v3(diff_mat[3], ob_eval->object_to_world().location()); + mul_m4_m4m4(diff_mat, obparent_eval->object_to_world, gpl->inverse); + add_v3_v3(diff_mat[3], ob_eval->object_to_world[3]); mul_m4_m4m4(diff_mat, diff_mat, gpl->layer_mat); return; } @@ -2718,14 +2715,14 @@ void BKE_gpencil_layer_transform_matrix_get(const Depsgraph *depsgraph, bPoseChannel *pchan = BKE_pose_channel_find_name(obparent_eval->pose, gpl->parsubstr); if (pchan) { float tmp_mat[4][4]; - mul_m4_m4m4(tmp_mat, obparent_eval->object_to_world().ptr(), pchan->pose_mat); + mul_m4_m4m4(tmp_mat, obparent_eval->object_to_world, pchan->pose_mat); mul_m4_m4m4(diff_mat, tmp_mat, gpl->inverse); - add_v3_v3(diff_mat[3], ob_eval->object_to_world().location()); + add_v3_v3(diff_mat[3], ob_eval->object_to_world[3]); } else { /* if bone not found use object (armature) */ - mul_m4_m4m4(diff_mat, obparent_eval->object_to_world().ptr(), gpl->inverse); - add_v3_v3(diff_mat[3], ob_eval->object_to_world().location()); + mul_m4_m4m4(diff_mat, obparent_eval->object_to_world, gpl->inverse); + add_v3_v3(diff_mat[3], ob_eval->object_to_world[3]); } mul_m4_m4m4(diff_mat, diff_mat, gpl->layer_mat); return; @@ -2779,15 +2776,12 @@ void BKE_gpencil_update_layer_transforms(const Depsgraph *depsgraph, Object *ob) Object *ob_parent = DEG_get_evaluated_object(depsgraph, gpl->parent); /* calculate new matrix */ if (ELEM(gpl->partype, PAROBJECT, PARSKEL)) { - mul_m4_m4m4(cur_mat, ob->world_to_object().ptr(), ob_parent->object_to_world().ptr()); + mul_m4_m4m4(cur_mat, ob->world_to_object, ob_parent->object_to_world); } else if (gpl->partype == PARBONE) { bPoseChannel *pchan = BKE_pose_channel_find_name(ob_parent->pose, gpl->parsubstr); if (pchan != nullptr) { - mul_m4_series(cur_mat, - ob->world_to_object().ptr(), - ob_parent->object_to_world().ptr(), - pchan->pose_mat); + mul_m4_series(cur_mat, ob->world_to_object, ob_parent->object_to_world, pchan->pose_mat); } else { unit_m4(cur_mat); diff --git a/source/blender/blenkernel/intern/gpencil_modifier_legacy.cc b/source/blender/blenkernel/intern/gpencil_modifier_legacy.cc index ce61fd55526..cec431bc457 100644 --- a/source/blender/blenkernel/intern/gpencil_modifier_legacy.cc +++ b/source/blender/blenkernel/intern/gpencil_modifier_legacy.cc @@ -18,7 +18,7 @@ #include "BLI_string_utils.hh" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_armature_types.h" #include "DNA_gpencil_legacy_types.h" @@ -227,7 +227,7 @@ GpencilLineartLimitInfo BKE_gpencil_get_lineart_modifier_limits(const Object *ob LISTBASE_FOREACH (GpencilModifierData *, md, &ob->greasepencil_modifiers) { if (md->type == eGpencilModifierType_Lineart) { LineartGpencilModifierData *lmd = (LineartGpencilModifierData *)md; - if (is_first || (lmd->flags & MOD_LINEART_USE_CACHE)) { + if (is_first || (lmd->flags & LRT_GPENCIL_USE_CACHE)) { info.min_level = std::min(info.min_level, lmd->level_start); info.max_level = std::max( info.max_level, (lmd->use_multiple_levels ? lmd->level_end : lmd->level_start)); @@ -248,7 +248,7 @@ void BKE_gpencil_set_lineart_modifier_limits(GpencilModifierData *md, { BLI_assert(md->type == eGpencilModifierType_Lineart); LineartGpencilModifierData *lmd = (LineartGpencilModifierData *)md; - if (is_first_lineart || lmd->flags & MOD_LINEART_USE_CACHE) { + if (is_first_lineart || lmd->flags & LRT_GPENCIL_USE_CACHE) { lmd->level_start_override = info->min_level; lmd->level_end_override = info->max_level; lmd->edge_types_override = info->edge_types; @@ -330,7 +330,7 @@ void BKE_gpencil_frame_active_set(Depsgraph *depsgraph, bGPdata *gpd) bGPdata *gpd_orig = (bGPdata *)DEG_get_original_id(&gpd->id); /* sync "actframe" changes back to main-db too, - * so that editing tools work with copy-on-evaluation + * so that editing tools work with copy-on-write * when the current frame changes */ LISTBASE_FOREACH (bGPDlayer *, gpl, &gpd_orig->layers) { @@ -640,13 +640,13 @@ bGPDframe *BKE_gpencil_frame_retime_get(Depsgraph *depsgraph, static void gpencil_assign_object_eval(Object *object) { - BLI_assert(object->id.tag & LIB_TAG_COPIED_ON_EVAL); + BLI_assert(object->id.tag & LIB_TAG_COPIED_ON_WRITE); bGPdata *gpd_eval = object->runtime->gpd_eval; - gpd_eval->id.tag |= LIB_TAG_COPIED_ON_EVAL_FINAL_RESULT; + gpd_eval->id.tag |= LIB_TAG_COPIED_ON_WRITE_EVAL_RESULT; - if (object->id.tag & LIB_TAG_COPIED_ON_EVAL) { + if (object->id.tag & LIB_TAG_COPIED_ON_WRITE) { object->data = gpd_eval; } } diff --git a/source/blender/blenkernel/intern/gpencil_update_cache_legacy.cc b/source/blender/blenkernel/intern/gpencil_update_cache_legacy.cc index 2a5a81909a9..f735cced331 100644 --- a/source/blender/blenkernel/intern/gpencil_update_cache_legacy.cc +++ b/source/blender/blenkernel/intern/gpencil_update_cache_legacy.cc @@ -13,7 +13,10 @@ #include "BLI_dlrbTree.h" #include "BLI_listbase.h" +#include "BKE_gpencil_legacy.h" + #include "DNA_gpencil_legacy_types.h" +#include "DNA_userdef_types.h" #include "MEM_guardedalloc.h" diff --git a/source/blender/blenkernel/intern/grease_pencil.cc b/source/blender/blenkernel/intern/grease_pencil.cc index d6afd9bf203..0a06002de66 100644 --- a/source/blender/blenkernel/intern/grease_pencil.cc +++ b/source/blender/blenkernel/intern/grease_pencil.cc @@ -7,11 +7,8 @@ */ #include -#include -#include "BKE_action.h" -#include "BKE_anim_data.hh" -#include "BKE_animsys.h" +#include "BKE_anim_data.h" #include "BKE_curves.hh" #include "BKE_customdata.hh" #include "BKE_deform.hh" @@ -28,10 +25,8 @@ #include "BLI_bounds.hh" #include "BLI_map.hh" -#include "BLI_math_euler_types.hh" #include "BLI_math_geom.h" #include "BLI_math_matrix.h" -#include "BLI_math_matrix_types.hh" #include "BLI_math_vector_types.hh" #include "BLI_memarena.h" #include "BLI_memory_utils.hh" @@ -46,15 +41,15 @@ #include "BLO_read_write.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_ID.h" #include "DNA_ID_enums.h" #include "DNA_brush_types.h" -#include "DNA_gpencil_modifier_types.h" #include "DNA_grease_pencil_types.h" #include "DNA_material_types.h" #include "DNA_modifier_types.h" +#include "DNA_scene_types.h" #include "DEG_depsgraph.hh" #include "DEG_depsgraph_query.hh" @@ -90,7 +85,6 @@ static void grease_pencil_init_data(ID *id) } static void grease_pencil_copy_data(Main * /*bmain*/, - std::optional /*owner_library*/, ID *id_dst, const ID *id_src, const int /*flag*/) @@ -218,7 +212,6 @@ static void grease_pencil_blend_read_data(BlendDataReader *reader, ID *id) IDTypeInfo IDType_ID_GP = { /*id_code*/ ID_GP, /*id_filter*/ FILTER_ID_GP, - /*dependencies_id_types*/ FILTER_ID_GP | FILTER_ID_MA, /*main_listbase_index*/ INDEX_ID_GP, /*struct_size*/ sizeof(GreasePencil), /*name*/ "GreasePencil", @@ -247,6 +240,14 @@ IDTypeInfo IDType_ID_GP = { namespace blender::bke::greasepencil { +DrawingTransforms::DrawingTransforms(const Object &grease_pencil_ob) +{ + /* TODO: For now layer space = object space. This needs to change once the layers have a + * transform. */ + this->layer_space_to_world_space = float4x4_view(grease_pencil_ob.object_to_world); + this->world_space_to_layer_space = math::invert(this->layer_space_to_world_space); +} + static const std::string ATTR_RADIUS = "radius"; static const std::string ATTR_OPACITY = "opacity"; static const std::string ATTR_VERTEX_COLOR = "vertex_color"; @@ -263,23 +264,20 @@ static CustomData &domain_custom_data(CurvesGeometry &curves, const AttrDomain d template static MutableSpan get_mutable_attribute(CurvesGeometry &curves, const AttrDomain domain, - const StringRef name, + const StringRefNull name, const T default_value = T()) { const int num = domain_num(curves, domain); - if (num <= 0) { - return {}; - } const eCustomDataType type = cpp_type_to_custom_data_type(CPPType::get()); CustomData &custom_data = domain_custom_data(curves, domain); - T *data = (T *)CustomData_get_layer_named_for_write(&custom_data, type, name, num); + T *data = (T *)CustomData_get_layer_named_for_write(&custom_data, type, name.c_str(), num); if (data != nullptr) { return {data, num}; } - data = (T *)CustomData_add_layer_named(&custom_data, type, CD_SET_DEFAULT, num, name); + data = (T *)CustomData_add_layer_named(&custom_data, type, CD_SET_DEFAULT, num, name.c_str()); MutableSpan span = {data, num}; - if (span.first() != default_value) { + if (num > 0 && span.first() != default_value) { span.fill(default_value); } return span; @@ -629,12 +627,14 @@ LayerMask::LayerMask() LayerMask::LayerMask(StringRefNull name) : LayerMask() { - this->layer_name = BLI_strdup_null(name.c_str()); + this->layer_name = BLI_strdup(name.c_str()); } LayerMask::LayerMask(const LayerMask &other) : LayerMask() { - this->layer_name = BLI_strdup_null(other.layer_name); + if (other.layer_name) { + this->layer_name = BLI_strdup(other.layer_name); + } this->flag = other.flag; } @@ -664,17 +664,7 @@ Layer::Layer() this->opacity = 1.0f; - this->parent = nullptr; - this->parsubstr = nullptr; - - zero_v3(this->translation); - zero_v3(this->rotation); - copy_v3_fl(this->scale, 1.0f); - - this->viewlayername = nullptr; - BLI_listbase_clear(&this->masks); - this->active_mask_index = 0; this->runtime = MEM_new(__func__); } @@ -688,30 +678,15 @@ Layer::Layer(const Layer &other) : Layer() { new (&this->base) TreeNode(other.base.wrap()); - LISTBASE_FOREACH (GreasePencilLayerMask *, other_mask, &other.masks) { - LayerMask *new_mask = MEM_new(__func__, *reinterpret_cast(other_mask)); - BLI_addtail(&this->masks, reinterpret_cast(new_mask)); - } - this->active_mask_index = other.active_mask_index; + /* TODO: duplicate masks. */ + + /* Note: We do not duplicate the frame storage since it is only needed for writing. */ this->blend_mode = other.blend_mode; this->opacity = other.opacity; - this->parent = other.parent; - this->set_parent_bone_name(other.parsubstr); - - copy_v3_v3(this->translation, other.translation); - copy_v3_v3(this->rotation, other.rotation); - copy_v3_v3(this->scale, other.scale); - - this->set_view_layer_name(other.viewlayername); - - /* Note: We do not duplicate the frame storage since it is only needed for writing to file. */ this->runtime->frames_ = other.runtime->frames_; this->runtime->sorted_keys_cache_ = other.runtime->sorted_keys_cache_; - /* Tag the frames map, so the frame storage is recreated once the DNA is saved.*/ - this->tag_frames_map_changed(); - /* TODO: what about masks cache? */ } @@ -723,12 +698,9 @@ Layer::~Layer() MEM_SAFE_FREE(this->frames_storage.values); LISTBASE_FOREACH_MUTABLE (GreasePencilLayerMask *, mask, &this->masks) { - MEM_delete(reinterpret_cast(mask)); + MEM_SAFE_FREE(mask->layer_name); + MEM_freeN(mask); } - BLI_listbase_clear(&this->masks); - - MEM_SAFE_FREE(this->parsubstr); - MEM_SAFE_FREE(this->viewlayername); MEM_delete(this->runtime); this->runtime = nullptr; @@ -974,69 +946,6 @@ void Layer::update_from_dna_read() } } -float4x4 Layer::to_world_space(const Object &object) const -{ - if (this->parent == nullptr) { - return object.object_to_world() * this->local_transform(); - } - const Object &parent = *this->parent; - return this->parent_to_world(parent) * this->local_transform(); -} - -float4x4 Layer::to_object_space(const Object &object) const -{ - if (this->parent == nullptr) { - return this->local_transform(); - } - const Object &parent = *this->parent; - return object.world_to_object() * this->parent_to_world(parent) * this->local_transform(); -} - -StringRefNull Layer::parent_bone_name() const -{ - return (this->parsubstr != nullptr) ? StringRefNull(this->parsubstr) : StringRefNull(); -} - -void Layer::set_parent_bone_name(const char *new_name) -{ - if (this->parsubstr != nullptr) { - MEM_freeN(this->parsubstr); - } - this->parsubstr = BLI_strdup_null(new_name); -} - -float4x4 Layer::parent_to_world(const Object &parent) const -{ - const float4x4 &parent_object_to_world = parent.object_to_world(); - if (parent.type == OB_ARMATURE && !this->parent_bone_name().is_empty()) { - if (bPoseChannel *channel = BKE_pose_channel_find_name(parent.pose, - this->parent_bone_name().c_str())) - { - return parent_object_to_world * float4x4_view(channel->pose_mat); - } - } - return parent_object_to_world; -} - -float4x4 Layer::local_transform() const -{ - return math::from_loc_rot_scale( - float3(this->translation), float3(this->rotation), float3(this->scale)); -} - -StringRefNull Layer::view_layer_name() const -{ - return (this->viewlayername != nullptr) ? StringRefNull(this->viewlayername) : StringRefNull(); -} - -void Layer::set_view_layer_name(const char *new_name) -{ - if (this->viewlayername != nullptr) { - MEM_freeN(this->viewlayername); - } - this->viewlayername = BLI_strdup_null(new_name); -} - LayerGroup::LayerGroup() { new (&this->base) TreeNode(GP_LAYER_TREE_GROUP); @@ -1096,18 +1005,6 @@ LayerGroup::~LayerGroup() this->runtime = nullptr; } -LayerGroup &LayerGroup::operator=(const LayerGroup &other) -{ - if (this == &other) { - return *this; - } - - this->~LayerGroup(); - new (this) LayerGroup(other); - - return *this; -} - Layer &LayerGroup::add_layer(StringRefNull name) { Layer *new_layer = MEM_new(__func__, name); @@ -1398,32 +1295,11 @@ static void grease_pencil_evaluate_modifiers(Depsgraph *depsgraph, VirtualModifierData virtualModifierData; ModifierData *md = BKE_modifiers_get_virtual_modifierlist(object, &virtualModifierData); - /* Evaluate time modifiers. - * The time offset modifier can change what drawings are shown on the current frame. But it - * doesn't affect the drawings data. Modifiers that modify the drawings data are only evaluated - * for the current frame, so we run the time offset modifiers before all the other ones. */ - ModifierData *tmd = md; - for (; tmd; tmd = tmd->next) { - const ModifierTypeInfo *mti = BKE_modifier_get_info(ModifierType(tmd->type)); - - if (!BKE_modifier_is_enabled(scene, tmd, required_mode) || - ModifierType(tmd->type) != eModifierType_GreasePencilTime) - { - continue; - } - - if (mti->modify_geometry_set != nullptr) { - mti->modify_geometry_set(tmd, &mectx, &geometry_set); - } - } - - /* Evaluate drawing modifiers. */ + /* Evaluate modifiers. */ for (; md; md = md->next) { const ModifierTypeInfo *mti = BKE_modifier_get_info(ModifierType(md->type)); - if (!BKE_modifier_is_enabled(scene, md, required_mode) || - ModifierType(md->type) == eModifierType_GreasePencilTime) - { + if (!BKE_modifier_is_enabled(scene, md, required_mode)) { continue; } @@ -1759,13 +1635,6 @@ template static void shrink_array(T **array, int *num, const int shr { BLI_assert(shrink_num > 0); const int new_array_num = *num - shrink_num; - if (new_array_num == 0) { - MEM_freeN(*array); - *array = nullptr; - *num = 0; - return; - } - T *new_array = reinterpret_cast(MEM_cnew_array(new_array_num, __func__)); blender::uninitialized_move_n(*array, new_array_num, new_array); @@ -1786,32 +1655,6 @@ blender::MutableSpan GreasePencil::drawings() this->drawing_array_num}; } -void GreasePencil::resize_drawings(const int new_num) -{ - using namespace blender; - BLI_assert(new_num > 0); - - const int prev_num = int(this->drawings().size()); - if (new_num == prev_num) { - return; - } - if (new_num > prev_num) { - const int add_num = new_num - prev_num; - grow_array(&this->drawing_array, &this->drawing_array_num, add_num); - } - else { /* if (new_num < prev_num) */ - const int shrink_num = prev_num - new_num; - MutableSpan old_drawings = this->drawings().drop_front(new_num); - for (const int64_t i : old_drawings.index_range()) { - if (old_drawings[i]) { - MEM_delete(old_drawings[i]); - } - } - shrink_array( - &this->drawing_array, &this->drawing_array_num, shrink_num); - } -} - void GreasePencil::add_empty_drawings(const int add_num) { using namespace blender; @@ -1982,7 +1825,6 @@ static void remove_drawings_unchecked(GreasePencil &grease_pencil, for (auto [key, value] : layer->frames_for_write().items()) { if (value.drawing_index == swap_index) { value.drawing_index = index_to_remove; - layer->tag_frames_map_changed(); } } } @@ -2067,37 +1909,30 @@ void GreasePencil::move_duplicate_frames( Map layer_frames_copy = layer.frames(); /* Copy frames durations. */ - Map src_layer_frames_durations; + Map layer_frames_durations; for (const auto [frame_number, frame] : layer.frames().items()) { if (!frame.is_implicit_hold()) { - src_layer_frames_durations.add(frame_number, layer.get_frame_duration_at(frame_number)); + layer_frames_durations.add(frame_number, layer.get_frame_duration_at(frame_number)); } } - /* Remove original frames for duplicates before inserting any frames. - * This has to be done early to avoid removing frames that may be inserted - * in place of the source frames. */ - for (const auto src_frame_number : frame_number_destinations.keys()) { - if (!duplicate_frames.contains(src_frame_number)) { - /* User count not decremented here, the same frame is inserted again later. */ - layer.remove_frame(src_frame_number); - } - } - - auto get_source_frame = [&](const int frame_number) -> const GreasePencilFrame * { - if (const GreasePencilFrame *ptr = duplicate_frames.lookup_ptr(frame_number)) { - return ptr; - } - return layer_frames_copy.lookup_ptr(frame_number); - }; - for (const auto [src_frame_number, dst_frame_number] : frame_number_destinations.items()) { - const GreasePencilFrame *src_frame = get_source_frame(src_frame_number); - if (!src_frame) { + const bool use_duplicate = duplicate_frames.contains(src_frame_number); + + const Map &frame_map = use_duplicate ? duplicate_frames : + layer_frames_copy; + + if (!frame_map.contains(src_frame_number)) { continue; } - const int drawing_index = src_frame->drawing_index; - const int duration = src_layer_frames_durations.lookup_default(src_frame_number, 0); + + const GreasePencilFrame src_frame = frame_map.lookup(src_frame_number); + const int drawing_index = src_frame.drawing_index; + const int duration = layer_frames_durations.lookup_default(src_frame_number, 0); + + if (!use_duplicate) { + layer.remove_frame(src_frame_number); + } /* Add and overwrite the frame at the destination number. */ if (layer.frames().contains(dst_frame_number)) { @@ -2109,7 +1944,7 @@ void GreasePencil::move_duplicate_frames( layer.remove_frame(dst_frame_number); } GreasePencilFrame *frame = layer.add_frame(dst_frame_number, drawing_index, duration); - *frame = *src_frame; + *frame = src_frame; } /* Remove drawings if they no longer have users. */ @@ -2243,10 +2078,6 @@ void GreasePencil::set_active_layer(const blender::bke::greasepencil::Layer *lay { this->active_layer = const_cast( reinterpret_cast(layer)); - - if (this->flag & GREASE_PENCIL_AUTOLOCK_LAYERS) { - this->autolock_inactive_layers(); - } } bool GreasePencil::is_layer_active(const blender::bke::greasepencil::Layer *layer) const @@ -2257,19 +2088,6 @@ bool GreasePencil::is_layer_active(const blender::bke::greasepencil::Layer *laye return this->get_active_layer() == layer; } -void GreasePencil::autolock_inactive_layers() -{ - using namespace blender::bke::greasepencil; - - for (Layer *layer : this->layers_for_write()) { - if (this->is_layer_active(layer)) { - layer->set_locked(false); - continue; - } - layer->set_locked(true); - } -} - static blender::VectorSet get_node_names(const GreasePencil &grease_pencil) { using namespace blender; @@ -2529,21 +2347,8 @@ void GreasePencil::rename_node(blender::bke::greasepencil::TreeNode &node, if (node.name() == new_name) { return; } - std::string old_name = node.name(); - if (node.is_layer()) { - node.set_name(unique_layer_name(*this, new_name)); - BKE_animdata_fix_paths_rename_all(&this->id, "layers", old_name.c_str(), node.name().c_str()); - for (bke::greasepencil::Layer *layer : this->layers_for_write()) { - LISTBASE_FOREACH (GreasePencilLayerMask *, mask, &layer->masks) { - if (STREQ(mask->layer_name, old_name.c_str())) { - mask->layer_name = BLI_strdup(node.name().c_str()); - } - } - } - } - else if (node.is_group()) { - node.set_name(unique_layer_group_name(*this, new_name)); - } + node.set_name(node.is_layer() ? unique_layer_name(*this, new_name) : + unique_layer_group_name(*this, new_name)); } static void shrink_customdata(CustomData &data, const int index_to_remove, const int size) @@ -2600,7 +2405,7 @@ void GreasePencil::remove_layer(blender::bke::greasepencil::Layer &layer) layer.parent_group().unlink_node(layer.as_node()); /* Remove drawings. */ - for (const GreasePencilFrame frame : layer.frames().values()) { + for (GreasePencilFrame frame : layer.frames_for_write().values()) { GreasePencilDrawingBase *drawing_base = this->drawing(frame.drawing_index); if (drawing_base->type != GP_DRAWING) { continue; @@ -2677,8 +2482,7 @@ static void write_drawing_array(GreasePencil &grease_pencil, BlendWriter *writer static void free_drawing_array(GreasePencil &grease_pencil) { - if (grease_pencil.drawing_array == nullptr) { - BLI_assert(grease_pencil.drawing_array_num == 0); + if (grease_pencil.drawing_array == nullptr || grease_pencil.drawing_array_num == 0) { return; } for (int i = 0; i < grease_pencil.drawing_array_num; i++) { @@ -2714,8 +2518,6 @@ static void read_layer(BlendDataReader *reader, { BLO_read_data_address(reader, &node->base.name); node->base.parent = parent; - BLO_read_data_address(reader, &node->parsubstr); - BLO_read_data_address(reader, &node->viewlayername); /* Read frames storage. */ BLO_read_int32_array(reader, node->frames_storage.num, &node->frames_storage.keys); @@ -2783,8 +2585,6 @@ static void write_layer(BlendWriter *writer, GreasePencilLayer *node) { BLO_write_struct(writer, GreasePencilLayer, node); BLO_write_string(writer, node->base.name); - BLO_write_string(writer, node->parsubstr); - BLO_write_string(writer, node->viewlayername); BLO_write_int32_array(writer, node->frames_storage.num, node->frames_storage.keys); BLO_write_struct_array( @@ -2821,3 +2621,5 @@ static void write_layer_tree(GreasePencil &grease_pencil, BlendWriter *writer) grease_pencil.root_group_ptr->wrap().prepare_for_dna_write(); write_layer_tree_group(writer, grease_pencil.root_group_ptr); } + +/** \} */ diff --git a/source/blender/blenkernel/intern/grease_pencil_convert_legacy.cc b/source/blender/blenkernel/intern/grease_pencil_convert_legacy.cc index f27ad0b873f..6749724faee 100644 --- a/source/blender/blenkernel/intern/grease_pencil_convert_legacy.cc +++ b/source/blender/blenkernel/intern/grease_pencil_convert_legacy.cc @@ -6,116 +6,24 @@ * \ingroup bke */ -#include - -#include "BKE_anim_data.hh" #include "BKE_attribute.hh" -#include "BKE_colorband.hh" -#include "BKE_colortools.hh" #include "BKE_curves.hh" #include "BKE_deform.hh" -#include "BKE_gpencil_modifier_legacy.h" #include "BKE_grease_pencil.hh" -#include "BKE_grease_pencil_legacy_convert.hh" -#include "BKE_idprop.hh" -#include "BKE_lib_id.hh" #include "BKE_material.h" -#include "BKE_modifier.hh" -#include "BKE_node.hh" -#include "BKE_node_tree_update.hh" -#include "BKE_object.hh" #include "BLI_color.hh" -#include "BLI_function_ref.hh" #include "BLI_listbase.h" -#include "BLI_math_matrix.h" #include "BLI_math_vector_types.hh" #include "BLI_string.h" -#include "BLI_string_utf8.h" #include "BLI_vector.hh" -#include "BLT_translation.hh" - -#include "DNA_anim_types.h" #include "DNA_gpencil_legacy_types.h" -#include "DNA_gpencil_modifier_types.h" #include "DNA_grease_pencil_types.h" #include "DNA_meshdata_types.h" -#include "DNA_modifier_types.h" - -#include "DEG_depsgraph.hh" -#include "DEG_depsgraph_build.hh" namespace blender::bke::greasepencil::convert { -/* -------------------------------------------------------------------- */ -/** \name Animation conversion helpers. - * - * These utilities will call given callback over all relevant F-curves - * (also includes drivers, and actions linked through the NLA). - * \{ */ - -static bool legacy_fcurves_process(ListBase &fcurves, - blender::FunctionRef callback) -{ - bool is_changed = false; - LISTBASE_FOREACH (FCurve *, fcurve, &fcurves) { - const bool local_is_changed = callback(fcurve); - is_changed = is_changed || local_is_changed; - } - return is_changed; -} - -static bool legacy_nla_strip_process(NlaStrip &nla_strip, - blender::FunctionRef callback) -{ - bool is_changed = false; - if (nla_strip.act) { - if (legacy_fcurves_process(nla_strip.act->curves, callback)) { - DEG_id_tag_update(&nla_strip.act->id, ID_RECALC_ANIMATION); - is_changed = true; - } - } - LISTBASE_FOREACH (NlaStrip *, nla_strip_children, &nla_strip.strips) { - const bool local_is_changed = legacy_nla_strip_process(*nla_strip_children, callback); - is_changed = is_changed || local_is_changed; - } - return is_changed; -} - -static bool legacy_animation_process(AnimData &anim_data, - blender::FunctionRef callback) -{ - bool is_changed = false; - if (anim_data.action) { - if (legacy_fcurves_process(anim_data.action->curves, callback)) { - DEG_id_tag_update(&anim_data.action->id, ID_RECALC_ANIMATION); - is_changed = true; - } - } - if (anim_data.tmpact) { - if (legacy_fcurves_process(anim_data.tmpact->curves, callback)) { - DEG_id_tag_update(&anim_data.tmpact->id, ID_RECALC_ANIMATION); - is_changed = true; - } - } - - { - const bool local_is_changed = legacy_fcurves_process(anim_data.drivers, callback); - is_changed = is_changed || local_is_changed; - } - - LISTBASE_FOREACH (NlaTrack *, nla_track, &anim_data.nla_tracks) { - LISTBASE_FOREACH (NlaStrip *, nla_strip, &nla_track->strips) { - const bool local_is_changed = legacy_nla_strip_process(*nla_strip, callback); - is_changed = is_changed || local_is_changed; - } - } - return is_changed; -} - -/* \} */ - /** * Find vertex groups that have assigned vertices in this drawing. * Returns: @@ -167,23 +75,13 @@ void legacy_gpencil_frame_to_grease_pencil_drawing(const bGPDframe &gpf, /* Get the number of points, number of strokes and the offsets for each stroke. */ Vector offsets; - Vector curve_types; offsets.append(0); int num_strokes = 0; int num_points = 0; - bool has_bezier_stroke = false; LISTBASE_FOREACH (bGPDstroke *, gps, &gpf.strokes) { - if (gps->editcurve != nullptr) { - has_bezier_stroke = true; - num_points += gps->editcurve->tot_curve_points; - curve_types.append(CURVE_TYPE_BEZIER); - } - else { - num_points += gps->totpoints; - curve_types.append(CURVE_TYPE_POLY); - } - num_strokes++; + num_points += gps->totpoints; offsets.append(num_points); + num_strokes++; } /* Resize the CurvesGeometry. */ @@ -196,14 +94,8 @@ void legacy_gpencil_frame_to_grease_pencil_drawing(const bGPDframe &gpf, OffsetIndices points_by_curve = curves.points_by_curve(); MutableAttributeAccessor attributes = curves.attributes_for_write(); - if (!has_bezier_stroke) { - /* All strokes are poly curves. */ - curves.fill_curve_types(CURVE_TYPE_POLY); - } - else { - curves.curve_types_for_write().copy_from(curve_types); - curves.update_curve_types(); - } + /* All strokes are poly curves. */ + curves.fill_curve_types(CURVE_TYPE_POLY); /* Find used vertex groups in this drawing. */ ListBase stroke_vertex_group_names; @@ -226,12 +118,6 @@ void legacy_gpencil_frame_to_grease_pencil_drawing(const bGPDframe &gpf, /* Point Attributes. */ MutableSpan positions = curves.positions_for_write(); - MutableSpan handle_positions_left = has_bezier_stroke ? - curves.handle_positions_left_for_write() : - MutableSpan(); - MutableSpan handle_positions_right = has_bezier_stroke ? - curves.handle_positions_right_for_write() : - MutableSpan(); MutableSpan radii = drawing.radii_for_write(); MutableSpan opacities = drawing.opacities_for_write(); SpanAttributeWriter delta_times = attributes.lookup_or_add_for_write_span( @@ -272,6 +158,9 @@ void legacy_gpencil_frame_to_grease_pencil_drawing(const bGPDframe &gpf, int stroke_i = 0; LISTBASE_FOREACH_INDEX (bGPDstroke *, gps, &gpf.strokes, stroke_i) { + /* TODO: check if `gps->editcurve` is not nullptr and parse bezier curve instead. */ + + /* Write curve attributes. */ stroke_cyclic.span[stroke_i] = (gps->flag & GP_STROKE_CYCLIC) != 0; /* TODO: This should be a `double` attribute. */ stroke_init_times.span[stroke_i] = float(gps->inittime); @@ -286,86 +175,59 @@ void legacy_gpencil_frame_to_grease_pencil_drawing(const bGPDframe &gpf, stroke_fill_colors.span[stroke_i] = ColorGeometry4f(gps->vert_color_fill); stroke_materials.span[stroke_i] = gps->mat_nr; - IndexRange points = points_by_curve[stroke_i]; - if (points.is_empty()) { + /* Write point attributes. */ + IndexRange stroke_points_range = points_by_curve[stroke_i]; + if (stroke_points_range.is_empty()) { continue; } - const Span src_points{gps->points, gps->totpoints}; - /* Previously, Grease Pencil used a radius convention where 1 `px` = 0.001 units. This `px` - * was the brush size which would be stored in the stroke thickness and then scaled by the - * point pressure factor. Finally, the render engine would divide this thickness value by - * 2000 (we're going from a thickness to a radius, hence the factor of two) to convert back - * into blender units. Store the radius now directly in blender units. This makes it - * consistent with how hair curves handle the radius. */ - const float stroke_thickness = float(gps->thickness) / 2000.0f; - MutableSpan dst_positions = positions.slice(points); - MutableSpan dst_handle_positions_left = has_bezier_stroke ? - handle_positions_left.slice(points) : - MutableSpan(); - MutableSpan dst_handle_positions_right = has_bezier_stroke ? - handle_positions_right.slice(points) : - MutableSpan(); - MutableSpan dst_radii = radii.slice(points); - MutableSpan dst_opacities = opacities.slice(points); - MutableSpan dst_deltatimes = delta_times.span.slice(points); - MutableSpan dst_rotations = rotations.span.slice(points); - MutableSpan dst_vertex_colors = vertex_colors.span.slice(points); - MutableSpan dst_selection = selection.span.slice(points); - MutableSpan dst_dverts = use_dverts ? dverts.slice(points) : - MutableSpan(); + Span stroke_points{gps->points, gps->totpoints}; + MutableSpan stroke_positions = positions.slice(stroke_points_range); + MutableSpan stroke_radii = radii.slice(stroke_points_range); + MutableSpan stroke_opacities = opacities.slice(stroke_points_range); + MutableSpan stroke_deltatimes = delta_times.span.slice(stroke_points_range); + MutableSpan stroke_rotations = rotations.span.slice(stroke_points_range); + MutableSpan stroke_vertex_colors = vertex_colors.span.slice( + stroke_points_range); + MutableSpan stroke_selections = selection.span.slice(stroke_points_range); + MutableSpan stroke_dverts = use_dverts ? dverts.slice(stroke_points_range) : + MutableSpan(); - if (curve_types[stroke_i] == CURVE_TYPE_POLY) { - threading::parallel_for(src_points.index_range(), 4096, [&](const IndexRange range) { - for (const int point_i : range) { - const bGPDspoint &pt = src_points[point_i]; - dst_positions[point_i] = float3(pt.x, pt.y, pt.z); - dst_radii[point_i] = stroke_thickness * pt.pressure; - dst_opacities[point_i] = pt.strength; - dst_rotations[point_i] = pt.uv_rot; - dst_vertex_colors[point_i] = ColorGeometry4f(pt.vert_color); - dst_selection[point_i] = (pt.flag & GP_SPOINT_SELECT) != 0; - if (use_dverts && gps->dvert) { - copy_dvert(gps->dvert[point_i], dst_dverts[point_i]); - } - } - }); - - dst_deltatimes.first() = 0; - threading::parallel_for( - src_points.index_range().drop_front(1), 4096, [&](const IndexRange range) { - for (const int point_i : range) { - const bGPDspoint &pt = src_points[point_i]; - const bGPDspoint &pt_prev = src_points[point_i - 1]; - dst_deltatimes[point_i] = pt.time - pt_prev.time; - } - }); + /* Do first point. */ + const bGPDspoint &first_pt = stroke_points.first(); + stroke_positions.first() = float3(first_pt.x, first_pt.y, first_pt.z); + /* Previously, Grease Pencil used a radius convention where 1 `px` = 0.001 units. This `px` was + * the brush size which would be stored in the stroke thickness and then scaled by the point + * pressure factor. Finally, the render engine would divide this thickness value by 2000 (we're + * going from a thickness to a radius, hence the factor of two) to convert back into blender + * units. + * Store the radius now directly in blender units. This makes it consistent with how hair + * curves handle the radius. */ + stroke_radii.first() = gps->thickness * first_pt.pressure / 2000.0f; + stroke_opacities.first() = first_pt.strength; + stroke_deltatimes.first() = 0; + stroke_rotations.first() = first_pt.uv_rot; + stroke_vertex_colors.first() = ColorGeometry4f(first_pt.vert_color); + stroke_selections.first() = (first_pt.flag & GP_SPOINT_SELECT) != 0; + if (use_dverts && gps->dvert) { + copy_dvert(gps->dvert[0], stroke_dverts.first()); } - else if (curve_types[stroke_i] == CURVE_TYPE_BEZIER) { - BLI_assert(gps->editcurve != nullptr); - Span src_curve_points{gps->editcurve->curve_points, - gps->editcurve->tot_curve_points}; - threading::parallel_for(src_curve_points.index_range(), 4096, [&](const IndexRange range) { - for (const int point_i : range) { - const bGPDcurve_point &cpt = src_curve_points[point_i]; - dst_positions[point_i] = float3(cpt.bezt.vec[1]); - dst_handle_positions_left[point_i] = float3(cpt.bezt.vec[0]); - dst_handle_positions_right[point_i] = float3(cpt.bezt.vec[2]); - dst_radii[point_i] = stroke_thickness * cpt.pressure; - dst_opacities[point_i] = cpt.strength; - dst_rotations[point_i] = cpt.uv_rot; - dst_vertex_colors[point_i] = ColorGeometry4f(cpt.vert_color); - dst_selection[point_i] = (cpt.flag & GP_CURVE_POINT_SELECT) != 0; - if (use_dverts && gps->dvert) { - copy_dvert(gps->dvert[point_i], dst_dverts[point_i]); - } - } - }); - } - else { - /* Unknown curve type. */ - BLI_assert_unreachable(); + /* Do the rest of the points. */ + for (const int i : stroke_points.index_range().drop_back(1)) { + const int point_i = i + 1; + const bGPDspoint &pt_prev = stroke_points[point_i - 1]; + const bGPDspoint &pt = stroke_points[point_i]; + stroke_positions[point_i] = float3(pt.x, pt.y, pt.z); + stroke_radii[point_i] = gps->thickness * pt.pressure / 2000.0f; + stroke_opacities[point_i] = pt.strength; + stroke_deltatimes[point_i] = pt.time - pt_prev.time; + stroke_rotations[point_i] = pt.uv_rot; + stroke_vertex_colors[point_i] = ColorGeometry4f(pt.vert_color); + stroke_selections[point_i] = (pt.flag & GP_SPOINT_SELECT) != 0; + if (use_dverts && gps->dvert) { + copy_dvert(gps->dvert[point_i], stroke_dverts[point_i]); + } } } @@ -391,24 +253,6 @@ void legacy_gpencil_to_grease_pencil(Main &bmain, GreasePencil &grease_pencil, b { using namespace blender::bke::greasepencil; - if (gpd.flag & LIB_FAKEUSER) { - id_fake_user_set(&grease_pencil.id); - } - - BLI_assert(!grease_pencil.id.properties); - if (gpd.id.properties) { - grease_pencil.id.properties = IDP_CopyProperty(gpd.id.properties); - } - - /** Convert Grease Pencil data flag. */ - SET_FLAG_FROM_TEST( - grease_pencil.flag, (gpd.flag & GP_DATA_EXPAND) != 0, GREASE_PENCIL_ANIM_CHANNEL_EXPANDED); - SET_FLAG_FROM_TEST(grease_pencil.flag, - (gpd.flag & GP_DATA_AUTOLOCK_LAYERS) != 0, - GREASE_PENCIL_AUTOLOCK_LAYERS); - SET_FLAG_FROM_TEST( - grease_pencil.flag, (gpd.draw_mode == GP_DRAWMODE_3D), GREASE_PENCIL_STROKE_ORDER_3D); - int num_drawings = 0; LISTBASE_FOREACH (bGPDlayer *, gpl, &gpd.layers) { num_drawings += BLI_listbase_count(&gpl->frames); @@ -435,23 +279,12 @@ void legacy_gpencil_to_grease_pencil(Main &bmain, GreasePencil &grease_pencil, b SET_FLAG_FROM_TEST(new_layer.base.flag, (gpl->onion_flag & GP_LAYER_ONIONSKIN), GP_LAYER_TREE_NODE_USE_ONION_SKINNING); - SET_FLAG_FROM_TEST( - new_layer.base.flag, (gpl->flag & GP_LAYER_USE_MASK) == 0, GP_LAYER_TREE_NODE_HIDE_MASKS); new_layer.blend_mode = int8_t(gpl->blend_mode); - new_layer.parent = gpl->parent; - new_layer.set_parent_bone_name(gpl->parsubstr); - - copy_v3_v3(new_layer.translation, gpl->location); - copy_v3_v3(new_layer.rotation, gpl->rotation); - copy_v3_v3(new_layer.scale, gpl->scale); - - new_layer.set_view_layer_name(gpl->viewlayername); - /* Convert the layer masks. */ LISTBASE_FOREACH (bGPDlayer_Mask *, mask, &gpl->mask_layers) { - LayerMask *new_mask = MEM_new(__func__, mask->name); + LayerMask *new_mask = new LayerMask(mask->name); new_mask->flag = mask->flag; BLI_addtail(&new_layer.masks, new_mask); } @@ -481,18 +314,6 @@ void legacy_gpencil_to_grease_pencil(Main &bmain, GreasePencil &grease_pencil, b /* TODO: Update drawing user counts. */ } - /* Second loop, to write to layer attributes after all layers were created. */ - MutableAttributeAccessor layer_attributes = grease_pencil.attributes_for_write(); - SpanAttributeWriter layer_passes = layer_attributes.lookup_or_add_for_write_span( - "pass_index", bke::AttrDomain::Layer); - - layer_idx = 0; - LISTBASE_FOREACH_INDEX (bGPDlayer *, gpl, &gpd.layers, layer_idx) { - layer_passes.span[layer_idx] = int(gpl->pass_index); - } - - layer_passes.finish(); - /* Copy vertex group names and settings. */ BKE_defgroup_copy_list(&grease_pencil.vertex_group_names, &gpd.vertex_group_names); grease_pencil.vertex_group_active_index = gpd.vertex_group_active_index; @@ -514,1437 +335,4 @@ void legacy_gpencil_to_grease_pencil(Main &bmain, GreasePencil &grease_pencil, b BKE_id_materials_copy(&bmain, &gpd.id, &grease_pencil.id); } -static bNodeTree *add_offset_radius_node_tree(Main &bmain) -{ - using namespace blender; - bNodeTree *group = ntreeAddTree(&bmain, DATA_("Offset Radius"), "GeometryNodeTree"); - - if (!group->geometry_node_asset_traits) { - group->geometry_node_asset_traits = MEM_new(__func__); - } - group->geometry_node_asset_traits->flag |= GEO_NODE_ASSET_MODIFIER; - - group->tree_interface.add_socket(DATA_("Geometry"), - "", - "NodeSocketGeometry", - NODE_INTERFACE_SOCKET_INPUT | NODE_INTERFACE_SOCKET_OUTPUT, - nullptr); - - bNodeTreeInterfaceSocket *radius_offset = group->tree_interface.add_socket( - DATA_("Offset"), "", "NodeSocketFloat", NODE_INTERFACE_SOCKET_INPUT, nullptr); - auto &radius_offset_data = *static_cast(radius_offset->socket_data); - radius_offset_data.subtype = PROP_DISTANCE; - radius_offset_data.min = -FLT_MAX; - radius_offset_data.max = FLT_MAX; - - group->tree_interface.add_socket( - DATA_("Layer"), "", "NodeSocketString", NODE_INTERFACE_SOCKET_INPUT, nullptr); - - bNode *group_output = nodeAddNode(nullptr, group, "NodeGroupOutput"); - group_output->locx = 580; - group_output->locy = 160; - bNode *group_input = nodeAddNode(nullptr, group, "NodeGroupInput"); - group_input->locx = 0; - group_input->locy = 160; - - bNode *set_curve_radius = nodeAddNode(nullptr, group, "GeometryNodeSetCurveRadius"); - set_curve_radius->locx = 400; - set_curve_radius->locy = 160; - bNode *named_layer_selection = nodeAddNode( - nullptr, group, "GeometryNodeInputNamedLayerSelection"); - named_layer_selection->locx = 200; - named_layer_selection->locy = 100; - bNode *input_radius = nodeAddNode(nullptr, group, "GeometryNodeInputRadius"); - input_radius->locx = 0; - input_radius->locy = 0; - - bNode *add = nodeAddNode(nullptr, group, "ShaderNodeMath"); - add->custom1 = NODE_MATH_ADD; - add->locx = 200; - add->locy = 0; - - nodeAddLink(group, - group_input, - nodeFindSocket(group_input, SOCK_OUT, "Socket_0"), - set_curve_radius, - nodeFindSocket(set_curve_radius, SOCK_IN, "Curve")); - nodeAddLink(group, - set_curve_radius, - nodeFindSocket(set_curve_radius, SOCK_OUT, "Curve"), - group_output, - nodeFindSocket(group_output, SOCK_IN, "Socket_0")); - - nodeAddLink(group, - group_input, - nodeFindSocket(group_input, SOCK_OUT, "Socket_2"), - named_layer_selection, - nodeFindSocket(named_layer_selection, SOCK_IN, "Name")); - nodeAddLink(group, - named_layer_selection, - nodeFindSocket(named_layer_selection, SOCK_OUT, "Selection"), - set_curve_radius, - nodeFindSocket(set_curve_radius, SOCK_IN, "Selection")); - - nodeAddLink(group, - group_input, - nodeFindSocket(group_input, SOCK_OUT, "Socket_1"), - add, - nodeFindSocket(add, SOCK_IN, "Value")); - nodeAddLink(group, - input_radius, - nodeFindSocket(input_radius, SOCK_OUT, "Radius"), - add, - nodeFindSocket(add, SOCK_IN, "Value_001")); - nodeAddLink(group, - add, - nodeFindSocket(add, SOCK_OUT, "Value"), - set_curve_radius, - nodeFindSocket(set_curve_radius, SOCK_IN, "Radius")); - - LISTBASE_FOREACH (bNode *, node, &group->nodes) { - nodeSetSelected(node, false); - } - - return group; -} - -void thickness_factor_to_modifier(const bGPdata &src_object_data, Object &dst_object) -{ - if (src_object_data.pixfactor == 1.0f) { - return; - } - const float thickness_factor = src_object_data.pixfactor; - - ModifierData *md = BKE_modifier_new(eModifierType_GreasePencilThickness); - GreasePencilThickModifierData *tmd = reinterpret_cast(md); - - tmd->thickness_fac = thickness_factor; - - STRNCPY(md->name, DATA_("Thickness")); - BKE_modifier_unique_name(&dst_object.modifiers, md); - - BLI_addtail(&dst_object.modifiers, md); - BKE_modifiers_persistent_uid_init(dst_object, *md); -} - -void layer_adjustments_to_modifiers(Main &bmain, - const bGPdata &src_object_data, - Object &dst_object) -{ - bNodeTree *offset_radius_node_tree = nullptr; - /* Replace layer adjustments with modifiers. */ - LISTBASE_FOREACH (bGPDlayer *, gpl, &src_object_data.layers) { - const float3 tint_color = float3(gpl->tintcolor); - const float tint_factor = gpl->tintcolor[3]; - const int thickness_px = gpl->line_change; - /* Tint adjustment. */ - if (tint_factor > 0.0f) { - ModifierData *md = BKE_modifier_new(eModifierType_GreasePencilTint); - GreasePencilTintModifierData *tmd = reinterpret_cast(md); - - copy_v3_v3(tmd->color, tint_color); - tmd->factor = tint_factor; - STRNCPY(tmd->influence.layer_name, gpl->info); - - char modifier_name[64]; - SNPRINTF(modifier_name, "Tint %s", gpl->info); - STRNCPY(md->name, modifier_name); - BKE_modifier_unique_name(&dst_object.modifiers, md); - - BLI_addtail(&dst_object.modifiers, md); - BKE_modifiers_persistent_uid_init(dst_object, *md); - } - /* Thickness adjustment. */ - if (thickness_px != 0) { - /* Convert the "pixel" offset value into a radius value. - * GPv2 used a conversion of 1 "px" = 0.001. */ - /* Note: this offset may be negative. */ - const float radius_offset = float(thickness_px) / 2000.0f; - if (!offset_radius_node_tree) { - offset_radius_node_tree = add_offset_radius_node_tree(bmain); - BKE_ntree_update_main_tree(&bmain, offset_radius_node_tree, nullptr); - } - auto *md = reinterpret_cast(BKE_modifier_new(eModifierType_Nodes)); - - char modifier_name[64]; - SNPRINTF(modifier_name, "Thickness %s", gpl->info); - STRNCPY(md->modifier.name, modifier_name); - BKE_modifier_unique_name(&dst_object.modifiers, &md->modifier); - md->node_group = offset_radius_node_tree; - - BLI_addtail(&dst_object.modifiers, md); - BKE_modifiers_persistent_uid_init(dst_object, md->modifier); - - md->settings.properties = bke::idprop::create_group("Nodes Modifier Settings").release(); - IDProperty *radius_offset_prop = - bke::idprop::create(DATA_("Socket_1"), radius_offset).release(); - auto *ui_data = reinterpret_cast( - IDP_ui_data_ensure(radius_offset_prop)); - ui_data->soft_min = 0.0f; - ui_data->base.rna_subtype = PROP_TRANSLATION; - IDP_AddToGroup(md->settings.properties, radius_offset_prop); - IDP_AddToGroup(md->settings.properties, - bke::idprop::create(DATA_("Socket_2"), gpl->info).release()); - } - } - - DEG_relations_tag_update(&bmain); -} - -static ModifierData &legacy_object_modifier_common(Object &object, - const ModifierType type, - GpencilModifierData &legacy_md) -{ - /* TODO: Copy of most of #ED_object_modifier_add, this should be a BKE_modifiers function - * actually. */ - const ModifierTypeInfo *mti = BKE_modifier_get_info(type); - - ModifierData &new_md = *BKE_modifier_new(type); - - if (mti->flags & eModifierTypeFlag_RequiresOriginalData) { - ModifierData *md; - for (md = static_cast(object.modifiers.first); - md && BKE_modifier_get_info(ModifierType(md->type))->type == ModifierTypeType::OnlyDeform; - md = md->next) - ; - BLI_insertlinkbefore(&object.modifiers, md, &new_md); - } - else { - BLI_addtail(&object.modifiers, &new_md); - } - - /* Generate new persistent UID and best possible unique name. */ - BKE_modifiers_persistent_uid_init(object, new_md); - if (legacy_md.name[0]) { - STRNCPY_UTF8(new_md.name, legacy_md.name); - } - BKE_modifier_unique_name(&object.modifiers, &new_md); - - /* Handle common modifier data. */ - new_md.mode = legacy_md.mode; - new_md.flag |= legacy_md.flag & (eModifierFlag_OverrideLibrary_Local | eModifierFlag_Active); - - /* Attempt to copy UI state (panels) as best as possible. */ - new_md.ui_expand_flag = legacy_md.ui_expand_flag; - - /* Convert animation data if needed. */ - AnimData *anim_data = BKE_animdata_from_id(&object.id); - if (anim_data) { - char legacy_name_esc[MAX_NAME * 2]; - BLI_str_escape(legacy_name_esc, legacy_md.name, sizeof(legacy_name_esc)); - const std::string legacy_root_path = fmt::format("grease_pencil_modifiers[\"{}\"]", - legacy_name_esc); - char new_name_esc[MAX_NAME * 2]; - BLI_str_escape(new_name_esc, new_md.name, sizeof(new_name_esc)); - - auto modifier_path_update = [&](FCurve *fcurve) -> bool { - /* NOTE: This logic will likely need to be re-used in other similar conditions for other - * areas, should be put into its own util then. */ - if (!fcurve->rna_path) { - return false; - } - StringRefNull rna_path = fcurve->rna_path; - if (!rna_path.startswith(legacy_root_path)) { - return false; - } - const std::string new_rna_path = fmt::format( - "modifiers[\"{}\"]{}", new_name_esc, rna_path.substr(int64_t(legacy_root_path.size()))); - MEM_freeN(fcurve->rna_path); - fcurve->rna_path = BLI_strdupn(new_rna_path.c_str(), new_rna_path.size()); - return true; - }; - - if (legacy_animation_process(*anim_data, modifier_path_update)) { - DEG_id_tag_update(&object.id, ID_RECALC_ANIMATION); - } - } - - return new_md; -} - -static void legacy_object_modifier_influence(GreasePencilModifierInfluenceData &influence, - StringRef layername, - const int layer_pass, - const bool invert_layer, - const bool invert_layer_pass, - Material **material, - const int material_pass, - const bool invert_material, - const bool invert_material_pass, - StringRef vertex_group_name, - const bool invert_vertex_group, - CurveMapping **custom_curve, - const bool use_custom_curve) -{ - influence.flag = 0; - - STRNCPY(influence.layer_name, layername.data()); - if (invert_layer) { - influence.flag |= GREASE_PENCIL_INFLUENCE_INVERT_LAYER_FILTER; - } - influence.layer_pass = layer_pass; - if (layer_pass > 0) { - influence.flag |= GREASE_PENCIL_INFLUENCE_USE_LAYER_PASS_FILTER; - } - if (invert_layer_pass) { - influence.flag |= GREASE_PENCIL_INFLUENCE_INVERT_LAYER_PASS_FILTER; - } - - if (material) { - influence.material = *material; - *material = nullptr; - } - if (invert_material) { - influence.flag |= GREASE_PENCIL_INFLUENCE_INVERT_MATERIAL_FILTER; - } - influence.material_pass = material_pass; - if (material_pass > 0) { - influence.flag |= GREASE_PENCIL_INFLUENCE_USE_MATERIAL_PASS_FILTER; - } - if (invert_material_pass) { - influence.flag |= GREASE_PENCIL_INFLUENCE_INVERT_MATERIAL_PASS_FILTER; - } - - STRNCPY(influence.vertex_group_name, vertex_group_name.data()); - if (invert_vertex_group) { - influence.flag |= GREASE_PENCIL_INFLUENCE_INVERT_VERTEX_GROUP; - } - - if (custom_curve) { - if (influence.custom_curve) { - BKE_curvemapping_free(influence.custom_curve); - } - influence.custom_curve = *custom_curve; - *custom_curve = nullptr; - } - if (use_custom_curve) { - influence.flag |= GREASE_PENCIL_INFLUENCE_USE_CUSTOM_CURVE; - } -} - -static void legacy_object_modifier_armature(Object &object, GpencilModifierData &legacy_md) -{ - ModifierData &md = legacy_object_modifier_common( - object, eModifierType_GreasePencilArmature, legacy_md); - auto &md_armature = reinterpret_cast(md); - auto &legacy_md_armature = reinterpret_cast(legacy_md); - - md_armature.object = legacy_md_armature.object; - legacy_md_armature.object = nullptr; - md_armature.deformflag = legacy_md_armature.deformflag; - - legacy_object_modifier_influence(md_armature.influence, - "", - 0, - false, - false, - nullptr, - 0, - false, - false, - legacy_md_armature.vgname, - legacy_md_armature.deformflag & ARM_DEF_INVERT_VGROUP, - nullptr, - false); -} - -static void legacy_object_modifier_array(Object &object, GpencilModifierData &legacy_md) -{ - ModifierData &md = legacy_object_modifier_common( - object, eModifierType_GreasePencilArray, legacy_md); - auto &md_array = reinterpret_cast(md); - auto &legacy_md_array = reinterpret_cast(legacy_md); - - md_array.object = legacy_md_array.object; - legacy_md_array.object = nullptr; - md_array.count = legacy_md_array.count; - md_array.flag = 0; - if (legacy_md_array.flag & GP_ARRAY_UNIFORM_RANDOM_SCALE) { - md_array.flag |= MOD_GREASE_PENCIL_ARRAY_UNIFORM_RANDOM_SCALE; - } - if (legacy_md_array.flag & GP_ARRAY_USE_OB_OFFSET) { - md_array.flag |= MOD_GREASE_PENCIL_ARRAY_USE_OB_OFFSET; - } - if (legacy_md_array.flag & GP_ARRAY_USE_OFFSET) { - md_array.flag |= MOD_GREASE_PENCIL_ARRAY_USE_OFFSET; - } - if (legacy_md_array.flag & GP_ARRAY_USE_RELATIVE) { - md_array.flag |= MOD_GREASE_PENCIL_ARRAY_USE_RELATIVE; - } - copy_v3_v3(md_array.offset, legacy_md_array.offset); - copy_v3_v3(md_array.shift, legacy_md_array.shift); - copy_v3_v3(md_array.rnd_offset, legacy_md_array.rnd_offset); - copy_v3_v3(md_array.rnd_rot, legacy_md_array.rnd_rot); - copy_v3_v3(md_array.rnd_scale, legacy_md_array.rnd_scale); - md_array.seed = legacy_md_array.seed; - md_array.mat_rpl = legacy_md_array.mat_rpl; - - legacy_object_modifier_influence(md_array.influence, - legacy_md_array.layername, - legacy_md_array.layer_pass, - legacy_md_array.flag & GP_ARRAY_INVERT_LAYER, - legacy_md_array.flag & GP_ARRAY_INVERT_LAYERPASS, - &legacy_md_array.material, - legacy_md_array.pass_index, - legacy_md_array.flag & GP_ARRAY_INVERT_MATERIAL, - legacy_md_array.flag & GP_ARRAY_INVERT_PASS, - "", - false, - nullptr, - false); -} - -static void legacy_object_modifier_color(Object &object, GpencilModifierData &legacy_md) -{ - ModifierData &md = legacy_object_modifier_common( - object, eModifierType_GreasePencilColor, legacy_md); - auto &md_color = reinterpret_cast(md); - auto &legacy_md_color = reinterpret_cast(legacy_md); - - switch (eModifyColorGpencil_Flag(legacy_md_color.modify_color)) { - case GP_MODIFY_COLOR_BOTH: - md_color.color_mode = MOD_GREASE_PENCIL_COLOR_BOTH; - break; - case GP_MODIFY_COLOR_STROKE: - md_color.color_mode = MOD_GREASE_PENCIL_COLOR_STROKE; - break; - case GP_MODIFY_COLOR_FILL: - md_color.color_mode = MOD_GREASE_PENCIL_COLOR_FILL; - break; - case GP_MODIFY_COLOR_HARDNESS: - md_color.color_mode = MOD_GREASE_PENCIL_COLOR_HARDNESS; - break; - } - copy_v3_v3(md_color.hsv, legacy_md_color.hsv); - - legacy_object_modifier_influence(md_color.influence, - legacy_md_color.layername, - legacy_md_color.layer_pass, - legacy_md_color.flag & GP_COLOR_INVERT_LAYER, - legacy_md_color.flag & GP_COLOR_INVERT_LAYERPASS, - &legacy_md_color.material, - legacy_md_color.pass_index, - legacy_md_color.flag & GP_COLOR_INVERT_MATERIAL, - legacy_md_color.flag & GP_COLOR_INVERT_PASS, - "", - false, - &legacy_md_color.curve_intensity, - legacy_md_color.flag & GP_COLOR_CUSTOM_CURVE); -} - -static void legacy_object_modifier_dash(Object &object, GpencilModifierData &legacy_md) -{ - ModifierData &md = legacy_object_modifier_common( - object, eModifierType_GreasePencilDash, legacy_md); - auto &md_dash = reinterpret_cast(md); - auto &legacy_md_dash = reinterpret_cast(legacy_md); - - md_dash.dash_offset = legacy_md_dash.dash_offset; - md_dash.segment_active_index = legacy_md_dash.segment_active_index; - md_dash.segments_num = legacy_md_dash.segments_len; - MEM_SAFE_FREE(md_dash.segments_array); - md_dash.segments_array = MEM_cnew_array( - legacy_md_dash.segments_len, __func__); - for (const int i : IndexRange(md_dash.segments_num)) { - GreasePencilDashModifierSegment &dst_segment = md_dash.segments_array[i]; - const DashGpencilModifierSegment &src_segment = legacy_md_dash.segments[i]; - STRNCPY(dst_segment.name, src_segment.name); - dst_segment.flag = 0; - if (src_segment.flag & GP_DASH_USE_CYCLIC) { - dst_segment.flag |= MOD_GREASE_PENCIL_DASH_USE_CYCLIC; - } - dst_segment.dash = src_segment.dash; - dst_segment.gap = src_segment.gap; - dst_segment.opacity = src_segment.opacity; - dst_segment.radius = src_segment.radius; - dst_segment.mat_nr = src_segment.mat_nr; - } - - legacy_object_modifier_influence(md_dash.influence, - legacy_md_dash.layername, - legacy_md_dash.layer_pass, - legacy_md_dash.flag & GP_DASH_INVERT_LAYER, - legacy_md_dash.flag & GP_DASH_INVERT_LAYERPASS, - &legacy_md_dash.material, - legacy_md_dash.pass_index, - legacy_md_dash.flag & GP_DASH_INVERT_MATERIAL, - legacy_md_dash.flag & GP_DASH_INVERT_PASS, - "", - false, - nullptr, - false); -} - -static void legacy_object_modifier_envelope(Object &object, GpencilModifierData &legacy_md) -{ - ModifierData &md = legacy_object_modifier_common( - object, eModifierType_GreasePencilEnvelope, legacy_md); - auto &md_envelope = reinterpret_cast(md); - auto &legacy_md_envelope = reinterpret_cast(legacy_md); - - switch (eEnvelopeGpencil_Mode(legacy_md_envelope.mode)) { - case GP_ENVELOPE_DEFORM: - md_envelope.mode = MOD_GREASE_PENCIL_ENVELOPE_DEFORM; - break; - case GP_ENVELOPE_SEGMENTS: - md_envelope.mode = MOD_GREASE_PENCIL_ENVELOPE_SEGMENTS; - break; - case GP_ENVELOPE_FILLS: - md_envelope.mode = MOD_GREASE_PENCIL_ENVELOPE_FILLS; - break; - } - md_envelope.mat_nr = legacy_md_envelope.mat_nr; - md_envelope.thickness = legacy_md_envelope.thickness; - md_envelope.strength = legacy_md_envelope.strength; - md_envelope.skip = legacy_md_envelope.skip; - md_envelope.spread = legacy_md_envelope.spread; - - legacy_object_modifier_influence(md_envelope.influence, - legacy_md_envelope.layername, - legacy_md_envelope.layer_pass, - legacy_md_envelope.flag & GP_ENVELOPE_INVERT_LAYER, - legacy_md_envelope.flag & GP_ENVELOPE_INVERT_LAYERPASS, - &legacy_md_envelope.material, - legacy_md_envelope.pass_index, - legacy_md_envelope.flag & GP_ENVELOPE_INVERT_MATERIAL, - legacy_md_envelope.flag & GP_ENVELOPE_INVERT_PASS, - legacy_md_envelope.vgname, - legacy_md_envelope.flag & GP_ENVELOPE_INVERT_VGROUP, - nullptr, - false); -} - -static void legacy_object_modifier_hook(Object &object, GpencilModifierData &legacy_md) -{ - ModifierData &md = legacy_object_modifier_common( - object, eModifierType_GreasePencilHook, legacy_md); - auto &md_hook = reinterpret_cast(md); - auto &legacy_md_hook = reinterpret_cast(legacy_md); - - md_hook.flag = 0; - if (legacy_md_hook.flag & GP_HOOK_UNIFORM_SPACE) { - md_hook.flag |= MOD_GREASE_PENCIL_HOOK_UNIFORM_SPACE; - } - switch (eHookGpencil_Falloff(legacy_md_hook.falloff_type)) { - case eGPHook_Falloff_None: - md_hook.falloff_type = MOD_GREASE_PENCIL_HOOK_Falloff_None; - break; - case eGPHook_Falloff_Curve: - md_hook.falloff_type = MOD_GREASE_PENCIL_HOOK_Falloff_Curve; - break; - case eGPHook_Falloff_Sharp: - md_hook.falloff_type = MOD_GREASE_PENCIL_HOOK_Falloff_Sharp; - break; - case eGPHook_Falloff_Smooth: - md_hook.falloff_type = MOD_GREASE_PENCIL_HOOK_Falloff_Smooth; - break; - case eGPHook_Falloff_Root: - md_hook.falloff_type = MOD_GREASE_PENCIL_HOOK_Falloff_Root; - break; - case eGPHook_Falloff_Linear: - md_hook.falloff_type = MOD_GREASE_PENCIL_HOOK_Falloff_Linear; - break; - case eGPHook_Falloff_Const: - md_hook.falloff_type = MOD_GREASE_PENCIL_HOOK_Falloff_Const; - break; - case eGPHook_Falloff_Sphere: - md_hook.falloff_type = MOD_GREASE_PENCIL_HOOK_Falloff_Sphere; - break; - case eGPHook_Falloff_InvSquare: - md_hook.falloff_type = MOD_GREASE_PENCIL_HOOK_Falloff_InvSquare; - break; - } - md_hook.object = legacy_md_hook.object; - legacy_md_hook.object = nullptr; - STRNCPY(md_hook.subtarget, legacy_md_hook.subtarget); - copy_m4_m4(md_hook.parentinv, legacy_md_hook.parentinv); - copy_v3_v3(md_hook.cent, legacy_md_hook.cent); - md_hook.falloff = legacy_md_hook.falloff; - md_hook.force = legacy_md_hook.force; - - legacy_object_modifier_influence(md_hook.influence, - legacy_md_hook.layername, - legacy_md_hook.layer_pass, - legacy_md_hook.flag & GP_HOOK_INVERT_LAYER, - legacy_md_hook.flag & GP_HOOK_INVERT_LAYERPASS, - &legacy_md_hook.material, - legacy_md_hook.pass_index, - legacy_md_hook.flag & GP_HOOK_INVERT_MATERIAL, - legacy_md_hook.flag & GP_HOOK_INVERT_PASS, - legacy_md_hook.vgname, - legacy_md_hook.flag & GP_HOOK_INVERT_VGROUP, - &legacy_md_hook.curfalloff, - true); -} - -static void legacy_object_modifier_lattice(Object &object, GpencilModifierData &legacy_md) -{ - ModifierData &md = legacy_object_modifier_common( - object, eModifierType_GreasePencilLattice, legacy_md); - auto &md_lattice = reinterpret_cast(md); - auto &legacy_md_lattice = reinterpret_cast(legacy_md); - - md_lattice.object = legacy_md_lattice.object; - legacy_md_lattice.object = nullptr; - md_lattice.strength = legacy_md_lattice.strength; - - legacy_object_modifier_influence(md_lattice.influence, - legacy_md_lattice.layername, - legacy_md_lattice.layer_pass, - legacy_md_lattice.flag & GP_LATTICE_INVERT_LAYER, - legacy_md_lattice.flag & GP_LATTICE_INVERT_LAYERPASS, - &legacy_md_lattice.material, - legacy_md_lattice.pass_index, - legacy_md_lattice.flag & GP_LATTICE_INVERT_MATERIAL, - legacy_md_lattice.flag & GP_LATTICE_INVERT_PASS, - legacy_md_lattice.vgname, - legacy_md_lattice.flag & GP_LATTICE_INVERT_VGROUP, - nullptr, - false); -} - -static void legacy_object_modifier_length(Object &object, GpencilModifierData &legacy_md) -{ - ModifierData &md = legacy_object_modifier_common( - object, eModifierType_GreasePencilLength, legacy_md); - auto &md_length = reinterpret_cast(md); - auto &legacy_md_length = reinterpret_cast(legacy_md); - - md_length.flag = legacy_md_length.flag; - md_length.start_fac = legacy_md_length.start_fac; - md_length.end_fac = legacy_md_length.end_fac; - md_length.rand_start_fac = legacy_md_length.rand_start_fac; - md_length.rand_end_fac = legacy_md_length.rand_end_fac; - md_length.rand_offset = legacy_md_length.rand_offset; - md_length.overshoot_fac = legacy_md_length.overshoot_fac; - md_length.seed = legacy_md_length.seed; - md_length.step = legacy_md_length.step; - md_length.mode = legacy_md_length.mode; - md_length.point_density = legacy_md_length.point_density; - md_length.segment_influence = legacy_md_length.segment_influence; - md_length.max_angle = legacy_md_length.max_angle; - - legacy_object_modifier_influence(md_length.influence, - legacy_md_length.layername, - legacy_md_length.layer_pass, - legacy_md_length.flag & GP_LENGTH_INVERT_LAYER, - legacy_md_length.flag & GP_LENGTH_INVERT_LAYERPASS, - &legacy_md_length.material, - legacy_md_length.pass_index, - legacy_md_length.flag & GP_LENGTH_INVERT_MATERIAL, - legacy_md_length.flag & GP_LENGTH_INVERT_PASS, - "", - false, - nullptr, - false); -} - -static void legacy_object_modifier_mirror(Object &object, GpencilModifierData &legacy_md) -{ - ModifierData &md = legacy_object_modifier_common( - object, eModifierType_GreasePencilMirror, legacy_md); - auto &md_mirror = reinterpret_cast(md); - auto &legacy_md_mirror = reinterpret_cast(legacy_md); - - md_mirror.object = legacy_md_mirror.object; - legacy_md_mirror.object = nullptr; - md_mirror.flag = 0; - if (legacy_md_mirror.flag & GP_MIRROR_AXIS_X) { - md_mirror.flag |= MOD_GREASE_PENCIL_MIRROR_AXIS_X; - } - if (legacy_md_mirror.flag & GP_MIRROR_AXIS_Y) { - md_mirror.flag |= MOD_GREASE_PENCIL_MIRROR_AXIS_Y; - } - if (legacy_md_mirror.flag & GP_MIRROR_AXIS_Z) { - md_mirror.flag |= MOD_GREASE_PENCIL_MIRROR_AXIS_Z; - } - - legacy_object_modifier_influence(md_mirror.influence, - legacy_md_mirror.layername, - legacy_md_mirror.layer_pass, - legacy_md_mirror.flag & GP_MIRROR_INVERT_LAYER, - legacy_md_mirror.flag & GP_MIRROR_INVERT_LAYERPASS, - &legacy_md_mirror.material, - legacy_md_mirror.pass_index, - legacy_md_mirror.flag & GP_MIRROR_INVERT_MATERIAL, - legacy_md_mirror.flag & GP_MIRROR_INVERT_PASS, - "", - false, - nullptr, - false); -} - -static void legacy_object_modifier_multiply(Object &object, GpencilModifierData &legacy_md) -{ - ModifierData &md = legacy_object_modifier_common( - object, eModifierType_GreasePencilMultiply, legacy_md); - auto &md_multiply = reinterpret_cast(md); - auto &legacy_md_multiply = reinterpret_cast(legacy_md); - - md_multiply.flag = 0; - if (legacy_md_multiply.flags & GP_MULTIPLY_ENABLE_FADING) { - md_multiply.flag |= MOD_GREASE_PENCIL_MULTIPLY_ENABLE_FADING; - } - md_multiply.duplications = legacy_md_multiply.duplications; - md_multiply.distance = legacy_md_multiply.distance; - md_multiply.offset = legacy_md_multiply.offset; - md_multiply.fading_center = legacy_md_multiply.fading_center; - md_multiply.fading_thickness = legacy_md_multiply.fading_thickness; - md_multiply.fading_opacity = legacy_md_multiply.fading_opacity; - - /* Note: This looks wrong, but GPv2 version uses Mirror modifier flags in its `flag` property - * and own flags in its `flags` property. */ - legacy_object_modifier_influence(md_multiply.influence, - legacy_md_multiply.layername, - legacy_md_multiply.layer_pass, - legacy_md_multiply.flag & GP_MIRROR_INVERT_LAYER, - legacy_md_multiply.flag & GP_MIRROR_INVERT_LAYERPASS, - &legacy_md_multiply.material, - legacy_md_multiply.pass_index, - legacy_md_multiply.flag & GP_MIRROR_INVERT_MATERIAL, - legacy_md_multiply.flag & GP_MIRROR_INVERT_PASS, - "", - false, - nullptr, - false); -} - -static void legacy_object_modifier_noise(Object &object, GpencilModifierData &legacy_md) -{ - ModifierData &md = legacy_object_modifier_common( - object, eModifierType_GreasePencilNoise, legacy_md); - auto &md_noise = reinterpret_cast(md); - auto &legacy_md_noise = reinterpret_cast(legacy_md); - - md_noise.flag = legacy_md_noise.flag; - md_noise.factor = legacy_md_noise.factor; - md_noise.factor_strength = legacy_md_noise.factor_strength; - md_noise.factor_thickness = legacy_md_noise.factor_thickness; - md_noise.factor_uvs = legacy_md_noise.factor_uvs; - md_noise.noise_scale = legacy_md_noise.noise_scale; - md_noise.noise_offset = legacy_md_noise.noise_offset; - md_noise.noise_mode = legacy_md_noise.noise_mode; - md_noise.step = legacy_md_noise.step; - md_noise.seed = legacy_md_noise.seed; - - legacy_object_modifier_influence(md_noise.influence, - legacy_md_noise.layername, - legacy_md_noise.layer_pass, - legacy_md_noise.flag & GP_NOISE_INVERT_LAYER, - legacy_md_noise.flag & GP_NOISE_INVERT_LAYERPASS, - &legacy_md_noise.material, - legacy_md_noise.pass_index, - legacy_md_noise.flag & GP_NOISE_INVERT_MATERIAL, - legacy_md_noise.flag & GP_NOISE_INVERT_PASS, - legacy_md_noise.vgname, - legacy_md_noise.flag & GP_NOISE_INVERT_VGROUP, - &legacy_md_noise.curve_intensity, - legacy_md_noise.flag & GP_NOISE_CUSTOM_CURVE); -} - -static void legacy_object_modifier_offset(Object &object, GpencilModifierData &legacy_md) -{ - ModifierData &md = legacy_object_modifier_common( - object, eModifierType_GreasePencilOffset, legacy_md); - auto &md_offset = reinterpret_cast(md); - auto &legacy_md_offset = reinterpret_cast(legacy_md); - - md_offset.flag = 0; - if (legacy_md_offset.flag & GP_OFFSET_UNIFORM_RANDOM_SCALE) { - md_offset.flag |= MOD_GREASE_PENCIL_OFFSET_UNIFORM_RANDOM_SCALE; - } - switch (eOffsetGpencil_Mode(legacy_md_offset.mode)) { - case GP_OFFSET_RANDOM: - md_offset.offset_mode = MOD_GREASE_PENCIL_OFFSET_RANDOM; - break; - case GP_OFFSET_LAYER: - md_offset.offset_mode = MOD_GREASE_PENCIL_OFFSET_LAYER; - break; - case GP_OFFSET_MATERIAL: - md_offset.offset_mode = MOD_GREASE_PENCIL_OFFSET_MATERIAL; - break; - case GP_OFFSET_STROKE: - md_offset.offset_mode = MOD_GREASE_PENCIL_OFFSET_STROKE; - break; - } - copy_v3_v3(md_offset.loc, legacy_md_offset.loc); - copy_v3_v3(md_offset.rot, legacy_md_offset.rot); - copy_v3_v3(md_offset.scale, legacy_md_offset.scale); - copy_v3_v3(md_offset.stroke_loc, legacy_md_offset.rnd_offset); - copy_v3_v3(md_offset.stroke_rot, legacy_md_offset.rnd_rot); - copy_v3_v3(md_offset.stroke_scale, legacy_md_offset.rnd_scale); - md_offset.seed = legacy_md_offset.seed; - md_offset.stroke_step = legacy_md_offset.stroke_step; - md_offset.stroke_start_offset = legacy_md_offset.stroke_start_offset; - - legacy_object_modifier_influence(md_offset.influence, - legacy_md_offset.layername, - legacy_md_offset.layer_pass, - legacy_md_offset.flag & GP_OFFSET_INVERT_LAYER, - legacy_md_offset.flag & GP_OFFSET_INVERT_LAYERPASS, - &legacy_md_offset.material, - legacy_md_offset.pass_index, - legacy_md_offset.flag & GP_OFFSET_INVERT_MATERIAL, - legacy_md_offset.flag & GP_OFFSET_INVERT_PASS, - legacy_md_offset.vgname, - legacy_md_offset.flag & GP_OFFSET_INVERT_VGROUP, - nullptr, - false); -} - -static void legacy_object_modifier_opacity(Object &object, GpencilModifierData &legacy_md) -{ - ModifierData &md = legacy_object_modifier_common( - object, eModifierType_GreasePencilOpacity, legacy_md); - auto &md_opacity = reinterpret_cast(md); - auto &legacy_md_opacity = reinterpret_cast(legacy_md); - - md_opacity.flag = 0; - if (legacy_md_opacity.flag & GP_OPACITY_NORMALIZE) { - md_opacity.flag |= MOD_GREASE_PENCIL_OPACITY_USE_UNIFORM_OPACITY; - } - if (legacy_md_opacity.flag & GP_OPACITY_WEIGHT_FACTOR) { - md_opacity.flag |= MOD_GREASE_PENCIL_OPACITY_USE_WEIGHT_AS_FACTOR; - } - switch (eModifyColorGpencil_Flag(legacy_md_opacity.modify_color)) { - case GP_MODIFY_COLOR_BOTH: - md_opacity.color_mode = MOD_GREASE_PENCIL_COLOR_BOTH; - break; - case GP_MODIFY_COLOR_STROKE: - md_opacity.color_mode = MOD_GREASE_PENCIL_COLOR_STROKE; - break; - case GP_MODIFY_COLOR_FILL: - md_opacity.color_mode = MOD_GREASE_PENCIL_COLOR_FILL; - break; - case GP_MODIFY_COLOR_HARDNESS: - md_opacity.color_mode = MOD_GREASE_PENCIL_COLOR_HARDNESS; - break; - } - md_opacity.color_factor = legacy_md_opacity.factor; - md_opacity.hardness_factor = legacy_md_opacity.hardness; - - legacy_object_modifier_influence(md_opacity.influence, - legacy_md_opacity.layername, - legacy_md_opacity.layer_pass, - legacy_md_opacity.flag & GP_OPACITY_INVERT_LAYER, - legacy_md_opacity.flag & GP_OPACITY_INVERT_LAYERPASS, - &legacy_md_opacity.material, - legacy_md_opacity.pass_index, - legacy_md_opacity.flag & GP_OPACITY_INVERT_MATERIAL, - legacy_md_opacity.flag & GP_OPACITY_INVERT_PASS, - legacy_md_opacity.vgname, - legacy_md_opacity.flag & GP_OPACITY_INVERT_VGROUP, - &legacy_md_opacity.curve_intensity, - legacy_md_opacity.flag & GP_OPACITY_CUSTOM_CURVE); -} - -static void legacy_object_modifier_outline(Object &object, GpencilModifierData &legacy_md) -{ - ModifierData &md = legacy_object_modifier_common( - object, eModifierType_GreasePencilOutline, legacy_md); - auto &md_outline = reinterpret_cast(md); - auto &legacy_md_outline = reinterpret_cast(legacy_md); - - md_outline.flag = 0; - if (legacy_md_outline.flag & GP_OUTLINE_KEEP_SHAPE) { - md_outline.flag |= MOD_GREASE_PENCIL_OUTLINE_KEEP_SHAPE; - } - md_outline.object = legacy_md_outline.object; - legacy_md_outline.object = nullptr; - md_outline.outline_material = legacy_md_outline.outline_material; - legacy_md_outline.outline_material = nullptr; - md_outline.sample_length = legacy_md_outline.sample_length; - md_outline.subdiv = legacy_md_outline.subdiv; - md_outline.thickness = legacy_md_outline.thickness; - - legacy_object_modifier_influence(md_outline.influence, - legacy_md_outline.layername, - legacy_md_outline.layer_pass, - legacy_md_outline.flag & GP_OUTLINE_INVERT_LAYER, - legacy_md_outline.flag & GP_OUTLINE_INVERT_LAYERPASS, - &legacy_md_outline.material, - legacy_md_outline.pass_index, - legacy_md_outline.flag & GP_OUTLINE_INVERT_MATERIAL, - legacy_md_outline.flag & GP_OUTLINE_INVERT_PASS, - "", - false, - nullptr, - false); -} - -static void legacy_object_modifier_shrinkwrap(Object &object, GpencilModifierData &legacy_md) -{ - ModifierData &md = legacy_object_modifier_common( - object, eModifierType_GreasePencilShrinkwrap, legacy_md); - auto &md_shrinkwrap = reinterpret_cast(md); - auto &legacy_md_shrinkwrap = reinterpret_cast(legacy_md); - - /* Shrinkwrap enums and flags do not have named types. */ - /* MOD_SHRINKWRAP_NEAREST_SURFACE etc. */ - md_shrinkwrap.shrink_type = legacy_md_shrinkwrap.shrink_type; - /* MOD_SHRINKWRAP_PROJECT_ALLOW_POS_DIR etc. */ - md_shrinkwrap.shrink_opts = legacy_md_shrinkwrap.shrink_opts; - /* MOD_SHRINKWRAP_ON_SURFACE etc. */ - md_shrinkwrap.shrink_mode = legacy_md_shrinkwrap.shrink_mode; - /* MOD_SHRINKWRAP_PROJECT_OVER_NORMAL etc. */ - md_shrinkwrap.proj_axis = legacy_md_shrinkwrap.proj_axis; - - md_shrinkwrap.target = legacy_md_shrinkwrap.target; - legacy_md_shrinkwrap.target = nullptr; - md_shrinkwrap.aux_target = legacy_md_shrinkwrap.aux_target; - legacy_md_shrinkwrap.aux_target = nullptr; - md_shrinkwrap.keep_dist = legacy_md_shrinkwrap.keep_dist; - md_shrinkwrap.proj_limit = legacy_md_shrinkwrap.proj_limit; - md_shrinkwrap.subsurf_levels = legacy_md_shrinkwrap.subsurf_levels; - md_shrinkwrap.smooth_factor = legacy_md_shrinkwrap.smooth_factor; - md_shrinkwrap.smooth_step = legacy_md_shrinkwrap.smooth_step; - - legacy_object_modifier_influence(md_shrinkwrap.influence, - legacy_md_shrinkwrap.layername, - legacy_md_shrinkwrap.layer_pass, - legacy_md_shrinkwrap.flag & GP_SHRINKWRAP_INVERT_LAYER, - legacy_md_shrinkwrap.flag & GP_SHRINKWRAP_INVERT_LAYERPASS, - &legacy_md_shrinkwrap.material, - legacy_md_shrinkwrap.pass_index, - legacy_md_shrinkwrap.flag & GP_SHRINKWRAP_INVERT_MATERIAL, - legacy_md_shrinkwrap.flag & GP_SHRINKWRAP_INVERT_PASS, - legacy_md_shrinkwrap.vgname, - legacy_md_shrinkwrap.flag & GP_SHRINKWRAP_INVERT_VGROUP, - nullptr, - false); -} - -static void legacy_object_modifier_smooth(Object &object, GpencilModifierData &legacy_md) -{ - ModifierData &md = legacy_object_modifier_common( - object, eModifierType_GreasePencilSmooth, legacy_md); - auto &md_smooth = reinterpret_cast(md); - auto &legacy_md_smooth = reinterpret_cast(legacy_md); - - md_smooth.flag = 0; - if (legacy_md_smooth.flag & GP_SMOOTH_MOD_LOCATION) { - md_smooth.flag |= MOD_GREASE_PENCIL_SMOOTH_MOD_LOCATION; - } - if (legacy_md_smooth.flag & GP_SMOOTH_MOD_STRENGTH) { - md_smooth.flag |= MOD_GREASE_PENCIL_SMOOTH_MOD_STRENGTH; - } - if (legacy_md_smooth.flag & GP_SMOOTH_MOD_THICKNESS) { - md_smooth.flag |= MOD_GREASE_PENCIL_SMOOTH_MOD_THICKNESS; - } - if (legacy_md_smooth.flag & GP_SMOOTH_MOD_UV) { - md_smooth.flag |= MOD_GREASE_PENCIL_SMOOTH_MOD_UV; - } - if (legacy_md_smooth.flag & GP_SMOOTH_KEEP_SHAPE) { - md_smooth.flag |= MOD_GREASE_PENCIL_SMOOTH_KEEP_SHAPE; - } - md_smooth.factor = legacy_md_smooth.factor; - md_smooth.step = legacy_md_smooth.step; - - legacy_object_modifier_influence(md_smooth.influence, - legacy_md_smooth.layername, - legacy_md_smooth.layer_pass, - legacy_md_smooth.flag & GP_SMOOTH_INVERT_LAYER, - legacy_md_smooth.flag & GP_SMOOTH_INVERT_LAYERPASS, - &legacy_md_smooth.material, - legacy_md_smooth.pass_index, - legacy_md_smooth.flag & GP_SMOOTH_INVERT_MATERIAL, - legacy_md_smooth.flag & GP_SMOOTH_INVERT_PASS, - legacy_md_smooth.vgname, - legacy_md_smooth.flag & GP_SMOOTH_INVERT_VGROUP, - &legacy_md_smooth.curve_intensity, - legacy_md_smooth.flag & GP_SMOOTH_CUSTOM_CURVE); -} - -static void legacy_object_modifier_subdiv(Object &object, GpencilModifierData &legacy_md) -{ - ModifierData &md = legacy_object_modifier_common( - object, eModifierType_GreasePencilSubdiv, legacy_md); - auto &md_subdiv = reinterpret_cast(md); - auto &legacy_md_subdiv = reinterpret_cast(legacy_md); - - switch (eSubdivGpencil_Type(legacy_md_subdiv.type)) { - case GP_SUBDIV_CATMULL: - md_subdiv.type = MOD_GREASE_PENCIL_SUBDIV_CATMULL; - break; - case GP_SUBDIV_SIMPLE: - md_subdiv.type = MOD_GREASE_PENCIL_SUBDIV_SIMPLE; - break; - } - md_subdiv.level = legacy_md_subdiv.level; - - legacy_object_modifier_influence(md_subdiv.influence, - legacy_md_subdiv.layername, - legacy_md_subdiv.layer_pass, - legacy_md_subdiv.flag & GP_SUBDIV_INVERT_LAYER, - legacy_md_subdiv.flag & GP_SUBDIV_INVERT_LAYERPASS, - &legacy_md_subdiv.material, - legacy_md_subdiv.pass_index, - legacy_md_subdiv.flag & GP_SUBDIV_INVERT_MATERIAL, - legacy_md_subdiv.flag & GP_SUBDIV_INVERT_PASS, - "", - false, - nullptr, - false); -} - -static void legacy_object_modifier_thickness(Object &object, GpencilModifierData &legacy_md) -{ - ModifierData &md = legacy_object_modifier_common( - object, eModifierType_GreasePencilThickness, legacy_md); - auto &md_thickness = reinterpret_cast(md); - auto &legacy_md_thickness = reinterpret_cast(legacy_md); - - md_thickness.flag = 0; - if (legacy_md_thickness.flag & GP_THICK_NORMALIZE) { - md_thickness.flag |= MOD_GREASE_PENCIL_THICK_NORMALIZE; - } - if (legacy_md_thickness.flag & GP_THICK_WEIGHT_FACTOR) { - md_thickness.flag |= MOD_GREASE_PENCIL_THICK_WEIGHT_FACTOR; - } - md_thickness.thickness_fac = legacy_md_thickness.thickness_fac; - md_thickness.thickness = legacy_md_thickness.thickness; - - legacy_object_modifier_influence(md_thickness.influence, - legacy_md_thickness.layername, - legacy_md_thickness.layer_pass, - legacy_md_thickness.flag & GP_THICK_INVERT_LAYER, - legacy_md_thickness.flag & GP_THICK_INVERT_LAYERPASS, - &legacy_md_thickness.material, - legacy_md_thickness.pass_index, - legacy_md_thickness.flag & GP_THICK_INVERT_MATERIAL, - legacy_md_thickness.flag & GP_THICK_INVERT_PASS, - legacy_md_thickness.vgname, - legacy_md_thickness.flag & GP_THICK_INVERT_VGROUP, - &legacy_md_thickness.curve_thickness, - legacy_md_thickness.flag & GP_THICK_CUSTOM_CURVE); -} - -static void legacy_object_modifier_time(Object &object, GpencilModifierData &legacy_md) -{ - ModifierData &md = legacy_object_modifier_common( - object, eModifierType_GreasePencilTime, legacy_md); - auto &md_time = reinterpret_cast(md); - auto &legacy_md_time = reinterpret_cast(legacy_md); - - md_time.flag = 0; - if (legacy_md_time.flag & GP_TIME_CUSTOM_RANGE) { - md_time.flag |= MOD_GREASE_PENCIL_TIME_CUSTOM_RANGE; - } - if (legacy_md_time.flag & GP_TIME_KEEP_LOOP) { - md_time.flag |= MOD_GREASE_PENCIL_TIME_KEEP_LOOP; - } - switch (eTimeGpencil_Mode(legacy_md_time.mode)) { - case GP_TIME_MODE_NORMAL: - md_time.mode = MOD_GREASE_PENCIL_TIME_MODE_NORMAL; - break; - case GP_TIME_MODE_REVERSE: - md_time.mode = MOD_GREASE_PENCIL_TIME_MODE_REVERSE; - break; - case GP_TIME_MODE_FIX: - md_time.mode = MOD_GREASE_PENCIL_TIME_MODE_FIX; - break; - case GP_TIME_MODE_PINGPONG: - md_time.mode = MOD_GREASE_PENCIL_TIME_MODE_PINGPONG; - break; - case GP_TIME_MODE_CHAIN: - md_time.mode = MOD_GREASE_PENCIL_TIME_MODE_CHAIN; - break; - } - md_time.offset = legacy_md_time.offset; - md_time.frame_scale = legacy_md_time.frame_scale; - md_time.sfra = legacy_md_time.sfra; - md_time.efra = legacy_md_time.efra; - md_time.segment_active_index = legacy_md_time.segment_active_index; - md_time.segments_num = legacy_md_time.segments_len; - MEM_SAFE_FREE(md_time.segments_array); - md_time.segments_array = MEM_cnew_array( - legacy_md_time.segments_len, __func__); - for (const int i : IndexRange(md_time.segments_num)) { - GreasePencilTimeModifierSegment &dst_segment = md_time.segments_array[i]; - const TimeGpencilModifierSegment &src_segment = legacy_md_time.segments[i]; - STRNCPY(dst_segment.name, src_segment.name); - switch (eTimeGpencil_Seg_Mode(src_segment.seg_mode)) { - case GP_TIME_SEG_MODE_NORMAL: - dst_segment.segment_mode = MOD_GREASE_PENCIL_TIME_SEG_MODE_NORMAL; - break; - case GP_TIME_SEG_MODE_REVERSE: - dst_segment.segment_mode = MOD_GREASE_PENCIL_TIME_SEG_MODE_REVERSE; - break; - case GP_TIME_SEG_MODE_PINGPONG: - dst_segment.segment_mode = MOD_GREASE_PENCIL_TIME_SEG_MODE_PINGPONG; - break; - } - dst_segment.segment_start = src_segment.seg_start; - dst_segment.segment_end = src_segment.seg_end; - dst_segment.segment_repeat = src_segment.seg_repeat; - } - - /* Note: GPv2 time modifier has a material pointer but it is unused. */ - legacy_object_modifier_influence(md_time.influence, - legacy_md_time.layername, - legacy_md_time.layer_pass, - legacy_md_time.flag & GP_TIME_INVERT_LAYER, - legacy_md_time.flag & GP_TIME_INVERT_LAYERPASS, - nullptr, - 0, - false, - false, - "", - false, - nullptr, - false); -} - -static void legacy_object_modifier_tint(Object &object, GpencilModifierData &legacy_md) -{ - ModifierData &md = legacy_object_modifier_common( - object, eModifierType_GreasePencilTint, legacy_md); - auto &md_tint = reinterpret_cast(md); - auto &legacy_md_tint = reinterpret_cast(legacy_md); - - md_tint.flag = 0; - if (legacy_md_tint.flag & GP_TINT_WEIGHT_FACTOR) { - md_tint.flag |= MOD_GREASE_PENCIL_TINT_USE_WEIGHT_AS_FACTOR; - } - switch (eGp_Vertex_Mode(legacy_md_tint.mode)) { - case GPPAINT_MODE_BOTH: - md_tint.color_mode = MOD_GREASE_PENCIL_COLOR_BOTH; - break; - case GPPAINT_MODE_STROKE: - md_tint.color_mode = MOD_GREASE_PENCIL_COLOR_STROKE; - break; - case GPPAINT_MODE_FILL: - md_tint.color_mode = MOD_GREASE_PENCIL_COLOR_FILL; - break; - } - switch (eTintGpencil_Type(legacy_md_tint.type)) { - case GP_TINT_UNIFORM: - md_tint.tint_mode = MOD_GREASE_PENCIL_TINT_UNIFORM; - break; - case GP_TINT_GRADIENT: - md_tint.tint_mode = MOD_GREASE_PENCIL_TINT_GRADIENT; - break; - } - md_tint.factor = legacy_md_tint.factor; - md_tint.radius = legacy_md_tint.radius; - copy_v3_v3(md_tint.color, legacy_md_tint.rgb); - md_tint.object = legacy_md_tint.object; - legacy_md_tint.object = nullptr; - MEM_SAFE_FREE(md_tint.color_ramp); - md_tint.color_ramp = legacy_md_tint.colorband; - legacy_md_tint.colorband = nullptr; - - legacy_object_modifier_influence(md_tint.influence, - legacy_md_tint.layername, - legacy_md_tint.layer_pass, - legacy_md_tint.flag & GP_TINT_INVERT_LAYER, - legacy_md_tint.flag & GP_TINT_INVERT_LAYERPASS, - &legacy_md_tint.material, - legacy_md_tint.pass_index, - legacy_md_tint.flag & GP_TINT_INVERT_MATERIAL, - legacy_md_tint.flag & GP_TINT_INVERT_PASS, - legacy_md_tint.vgname, - legacy_md_tint.flag & GP_TINT_INVERT_VGROUP, - &legacy_md_tint.curve_intensity, - legacy_md_tint.flag & GP_TINT_CUSTOM_CURVE); -} - -static void legacy_object_modifier_weight_angle(Object &object, GpencilModifierData &legacy_md) -{ - ModifierData &md = legacy_object_modifier_common( - object, eModifierType_GreasePencilWeightAngle, legacy_md); - auto &md_weight_angle = reinterpret_cast(md); - auto &legacy_md_weight_angle = reinterpret_cast(legacy_md); - - md_weight_angle.flag = 0; - if (legacy_md_weight_angle.flag & GP_WEIGHT_MULTIPLY_DATA) { - md_weight_angle.flag |= MOD_GREASE_PENCIL_WEIGHT_ANGLE_MULTIPLY_DATA; - } - if (legacy_md_weight_angle.flag & GP_WEIGHT_INVERT_OUTPUT) { - md_weight_angle.flag |= MOD_GREASE_PENCIL_WEIGHT_ANGLE_INVERT_OUTPUT; - } - switch (eGpencilModifierSpace(legacy_md_weight_angle.space)) { - case GP_SPACE_LOCAL: - md_weight_angle.space = MOD_GREASE_PENCIL_WEIGHT_ANGLE_SPACE_LOCAL; - break; - case GP_SPACE_WORLD: - md_weight_angle.space = MOD_GREASE_PENCIL_WEIGHT_ANGLE_SPACE_WORLD; - break; - } - md_weight_angle.axis = legacy_md_weight_angle.axis; - STRNCPY(md_weight_angle.target_vgname, legacy_md_weight_angle.target_vgname); - md_weight_angle.min_weight = legacy_md_weight_angle.min_weight; - md_weight_angle.angle = legacy_md_weight_angle.angle; - - legacy_object_modifier_influence(md_weight_angle.influence, - legacy_md_weight_angle.layername, - legacy_md_weight_angle.layer_pass, - legacy_md_weight_angle.flag & GP_WEIGHT_INVERT_LAYER, - legacy_md_weight_angle.flag & GP_WEIGHT_INVERT_LAYERPASS, - &legacy_md_weight_angle.material, - legacy_md_weight_angle.pass_index, - legacy_md_weight_angle.flag & GP_WEIGHT_INVERT_MATERIAL, - legacy_md_weight_angle.flag & GP_WEIGHT_INVERT_PASS, - legacy_md_weight_angle.vgname, - legacy_md_weight_angle.flag & GP_WEIGHT_INVERT_VGROUP, - nullptr, - false); -} - -static void legacy_object_modifier_weight_proximity(Object &object, GpencilModifierData &legacy_md) -{ - ModifierData &md = legacy_object_modifier_common( - object, eModifierType_GreasePencilWeightProximity, legacy_md); - auto &md_weight_prox = reinterpret_cast(md); - auto &legacy_md_weight_prox = reinterpret_cast(legacy_md); - - md_weight_prox.flag = 0; - if (legacy_md_weight_prox.flag & GP_WEIGHT_MULTIPLY_DATA) { - md_weight_prox.flag |= MOD_GREASE_PENCIL_WEIGHT_PROXIMITY_MULTIPLY_DATA; - } - if (legacy_md_weight_prox.flag & GP_WEIGHT_INVERT_OUTPUT) { - md_weight_prox.flag |= MOD_GREASE_PENCIL_WEIGHT_PROXIMITY_INVERT_OUTPUT; - } - STRNCPY(md_weight_prox.target_vgname, legacy_md_weight_prox.target_vgname); - md_weight_prox.min_weight = legacy_md_weight_prox.min_weight; - md_weight_prox.dist_start = legacy_md_weight_prox.dist_start; - md_weight_prox.dist_end = legacy_md_weight_prox.dist_end; - md_weight_prox.object = legacy_md_weight_prox.object; - legacy_md_weight_prox.object = nullptr; - - legacy_object_modifier_influence(md_weight_prox.influence, - legacy_md_weight_prox.layername, - legacy_md_weight_prox.layer_pass, - legacy_md_weight_prox.flag & GP_WEIGHT_INVERT_LAYER, - legacy_md_weight_prox.flag & GP_WEIGHT_INVERT_LAYERPASS, - &legacy_md_weight_prox.material, - legacy_md_weight_prox.pass_index, - legacy_md_weight_prox.flag & GP_WEIGHT_INVERT_MATERIAL, - legacy_md_weight_prox.flag & GP_WEIGHT_INVERT_PASS, - legacy_md_weight_prox.vgname, - legacy_md_weight_prox.flag & GP_WEIGHT_INVERT_VGROUP, - nullptr, - false); -} - -static void legacy_object_modifier_weight_lineart(Object &object, GpencilModifierData &legacy_md) -{ - ModifierData &md = legacy_object_modifier_common( - object, eModifierType_GreasePencilWeightAngle, legacy_md); - auto &md_lineart = reinterpret_cast(md); - auto &legacy_md_lineart = reinterpret_cast(legacy_md); - - greasepencil::convert::lineart_wrap_v3(&legacy_md_lineart, &md_lineart); -} - -static void legacy_object_modifiers(Main & /*bmain*/, Object &object) -{ - BLI_assert(BLI_listbase_is_empty(&object.modifiers)); - - while (GpencilModifierData *gpd_md = static_cast( - BLI_pophead(&object.greasepencil_modifiers))) - { - switch (gpd_md->type) { - case eGpencilModifierType_None: - /* Unknown type, just ignore. */ - break; - case eGpencilModifierType_Armature: - legacy_object_modifier_armature(object, *gpd_md); - break; - case eGpencilModifierType_Array: - legacy_object_modifier_array(object, *gpd_md); - break; - case eGpencilModifierType_Color: - legacy_object_modifier_color(object, *gpd_md); - break; - case eGpencilModifierType_Dash: - legacy_object_modifier_dash(object, *gpd_md); - break; - case eGpencilModifierType_Envelope: - legacy_object_modifier_envelope(object, *gpd_md); - break; - case eGpencilModifierType_Hook: - legacy_object_modifier_hook(object, *gpd_md); - break; - case eGpencilModifierType_Lattice: - legacy_object_modifier_lattice(object, *gpd_md); - break; - case eGpencilModifierType_Length: - legacy_object_modifier_length(object, *gpd_md); - break; - case eGpencilModifierType_Mirror: - legacy_object_modifier_mirror(object, *gpd_md); - break; - case eGpencilModifierType_Multiply: - legacy_object_modifier_multiply(object, *gpd_md); - break; - case eGpencilModifierType_Noise: - legacy_object_modifier_noise(object, *gpd_md); - break; - case eGpencilModifierType_Offset: - legacy_object_modifier_offset(object, *gpd_md); - break; - case eGpencilModifierType_Opacity: - legacy_object_modifier_opacity(object, *gpd_md); - break; - case eGpencilModifierType_Outline: - legacy_object_modifier_outline(object, *gpd_md); - break; - case eGpencilModifierType_Shrinkwrap: - legacy_object_modifier_shrinkwrap(object, *gpd_md); - break; - case eGpencilModifierType_Smooth: - legacy_object_modifier_smooth(object, *gpd_md); - break; - case eGpencilModifierType_Subdiv: - legacy_object_modifier_subdiv(object, *gpd_md); - break; - case eGpencilModifierType_Thick: - legacy_object_modifier_thickness(object, *gpd_md); - break; - case eGpencilModifierType_Time: - legacy_object_modifier_time(object, *gpd_md); - break; - case eGpencilModifierType_Tint: - legacy_object_modifier_tint(object, *gpd_md); - break; - case eGpencilModifierType_WeightAngle: - legacy_object_modifier_weight_angle(object, *gpd_md); - break; - case eGpencilModifierType_WeightProximity: - legacy_object_modifier_weight_proximity(object, *gpd_md); - break; - case eGpencilModifierType_Lineart: - legacy_object_modifier_weight_lineart(object, *gpd_md); - break; - case eGpencilModifierType_Build: - case eGpencilModifierType_Simplify: - case eGpencilModifierType_Texture: - break; - } - - BKE_gpencil_modifier_free_ex(gpd_md, 0); - } -} - -void legacy_gpencil_object(Main &bmain, Object &object) -{ - bGPdata *gpd = static_cast(object.data); - - GreasePencil *new_grease_pencil = static_cast( - BKE_id_new(&bmain, ID_GP, gpd->id.name + 2)); - object.data = new_grease_pencil; - object.type = OB_GREASE_PENCIL; - - /* NOTE: Could also use #BKE_id_free_us, to also free the legacy GP if not used anymore? */ - id_us_min(&gpd->id); - /* No need to increase user-count of `new_grease_pencil`, - * since ID creation already set it to 1. */ - - legacy_gpencil_to_grease_pencil(bmain, *new_grease_pencil, *gpd); - - legacy_object_modifiers(bmain, object); - - /* Layer adjustments should be added after all other modifiers. */ - layer_adjustments_to_modifiers(bmain, *gpd, object); - /* Thickness factor is applied after all other changes to the radii. */ - thickness_factor_to_modifier(*gpd, object); - - BKE_object_free_derived_caches(&object); -} - -void lineart_wrap_v3(const LineartGpencilModifierData *lmd_legacy, - GreasePencilLineartModifierData *lmd) -{ -#define LMD_WRAP(var) lmd->var = lmd_legacy->var - - LMD_WRAP(edge_types); - LMD_WRAP(source_type); - LMD_WRAP(use_multiple_levels); - LMD_WRAP(level_start); - LMD_WRAP(level_end); - LMD_WRAP(source_camera); - LMD_WRAP(light_contour_object); - LMD_WRAP(source_object); - LMD_WRAP(source_collection); - LMD_WRAP(target_material); - STRNCPY(lmd->source_vertex_group, lmd_legacy->source_vertex_group); - STRNCPY(lmd->vgname, lmd_legacy->vgname); - LMD_WRAP(overscan); - LMD_WRAP(shadow_camera_fov); - LMD_WRAP(shadow_camera_size); - LMD_WRAP(shadow_camera_near); - LMD_WRAP(shadow_camera_far); - LMD_WRAP(opacity); - lmd->thickness = lmd_legacy->thickness / 2; - LMD_WRAP(mask_switches); - LMD_WRAP(material_mask_bits); - LMD_WRAP(intersection_mask); - LMD_WRAP(shadow_selection); - LMD_WRAP(silhouette_selection); - LMD_WRAP(crease_threshold); - LMD_WRAP(angle_splitting_threshold); - LMD_WRAP(chain_smooth_tolerance); - LMD_WRAP(chaining_image_threshold); - LMD_WRAP(calculation_flags); - LMD_WRAP(flags); - LMD_WRAP(stroke_depth_offset); - LMD_WRAP(level_start_override); - LMD_WRAP(level_end_override); - LMD_WRAP(edge_types_override); - LMD_WRAP(shadow_selection_override); - LMD_WRAP(shadow_use_silhouette_override); - LMD_WRAP(cache); - LMD_WRAP(la_data_ptr); - -#undef LMD_WRAP -} - -void lineart_unwrap_v3(LineartGpencilModifierData *lmd_legacy, - const GreasePencilLineartModifierData *lmd) -{ -#define LMD_UNWRAP(var) lmd_legacy->var = lmd->var - - LMD_UNWRAP(edge_types); - LMD_UNWRAP(source_type); - LMD_UNWRAP(use_multiple_levels); - LMD_UNWRAP(level_start); - LMD_UNWRAP(level_end); - LMD_UNWRAP(source_camera); - LMD_UNWRAP(light_contour_object); - LMD_UNWRAP(source_object); - LMD_UNWRAP(source_collection); - LMD_UNWRAP(target_material); - STRNCPY(lmd_legacy->source_vertex_group, lmd->source_vertex_group); - STRNCPY(lmd_legacy->vgname, lmd->vgname); - LMD_UNWRAP(overscan); - LMD_UNWRAP(shadow_camera_fov); - LMD_UNWRAP(shadow_camera_size); - LMD_UNWRAP(shadow_camera_near); - LMD_UNWRAP(shadow_camera_far); - LMD_UNWRAP(opacity); - lmd_legacy->thickness = lmd->thickness * 2; - LMD_UNWRAP(mask_switches); - LMD_UNWRAP(material_mask_bits); - LMD_UNWRAP(intersection_mask); - LMD_UNWRAP(shadow_selection); - LMD_UNWRAP(silhouette_selection); - LMD_UNWRAP(crease_threshold); - LMD_UNWRAP(angle_splitting_threshold); - LMD_UNWRAP(chain_smooth_tolerance); - LMD_UNWRAP(chaining_image_threshold); - LMD_UNWRAP(calculation_flags); - LMD_UNWRAP(flags); - LMD_UNWRAP(stroke_depth_offset); - LMD_UNWRAP(level_start_override); - LMD_UNWRAP(level_end_override); - LMD_UNWRAP(edge_types_override); - LMD_UNWRAP(shadow_selection_override); - LMD_UNWRAP(shadow_use_silhouette_override); - LMD_UNWRAP(cache); - LMD_UNWRAP(la_data_ptr); - -#undef LMD_UNWRAP -} - } // namespace blender::bke::greasepencil::convert diff --git a/source/blender/blenkernel/intern/grease_pencil_test.cc b/source/blender/blenkernel/intern/grease_pencil_test.cc index 2bac034af50..461defdea32 100644 --- a/source/blender/blenkernel/intern/grease_pencil_test.cc +++ b/source/blender/blenkernel/intern/grease_pencil_test.cc @@ -363,96 +363,4 @@ TEST(greasepencil, remove_frame_fixed_duration_overwrite_end) EXPECT_TRUE(layer.frames().lookup(5).is_null()); } -TEST(greasepencil, remove_drawings_no_change) -{ - GreasePencil *grease_pencil = reinterpret_cast( - BKE_id_new_nomain(ID_GP, "Grease Pencil test")); - - grease_pencil->add_empty_drawings(3); - - Layer &layer_a = grease_pencil->add_layer("LayerA"); - Layer &layer_b = grease_pencil->add_layer("LayerB"); - layer_b.add_frame(10, 0); - layer_b.add_frame(20, 1); - layer_b.add_frame(30, 2); - - EXPECT_EQ(layer_a.frames().size(), 0); - EXPECT_EQ(layer_b.frames().size(), 3); - EXPECT_EQ(layer_b.frames().lookup(10).drawing_index, 0); - EXPECT_EQ(layer_b.frames().lookup(20).drawing_index, 1); - EXPECT_EQ(layer_b.frames().lookup(30).drawing_index, 2); - /* Test DNA storage data too. */ - layer_a.prepare_for_dna_write(); - layer_b.prepare_for_dna_write(); - EXPECT_EQ(layer_a.frames_storage.num, 0); - EXPECT_EQ(layer_b.frames_storage.num, 3); - EXPECT_EQ(layer_b.frames_storage.values[0].drawing_index, 0); - EXPECT_EQ(layer_b.frames_storage.values[1].drawing_index, 1); - EXPECT_EQ(layer_b.frames_storage.values[2].drawing_index, 2); - - grease_pencil->remove_layer(layer_a); - EXPECT_EQ(layer_b.frames().size(), 3); - EXPECT_EQ(layer_b.frames().lookup(10).drawing_index, 0); - EXPECT_EQ(layer_b.frames().lookup(20).drawing_index, 1); - EXPECT_EQ(layer_b.frames().lookup(30).drawing_index, 2); - /* Test DNA storage data too. */ - layer_b.prepare_for_dna_write(); - EXPECT_EQ(layer_b.frames_storage.num, 3); - EXPECT_EQ(layer_b.frames_storage.values[0].drawing_index, 0); - EXPECT_EQ(layer_b.frames_storage.values[1].drawing_index, 1); - EXPECT_EQ(layer_b.frames_storage.values[2].drawing_index, 2); - - BKE_id_free(nullptr, grease_pencil); -} - -TEST(greasepencil, remove_drawings_with_no_users) -{ - GreasePencil *grease_pencil = reinterpret_cast( - BKE_id_new_nomain(ID_GP, "Grease Pencil test")); - - /* Test drawing index correctness: Removing users from drawings should remove those drawings, and - * all index references should get updated to match the changed drawing indices. */ - - grease_pencil->add_empty_drawings(5); - - Layer &layer_a = grease_pencil->add_layer("LayerA"); - layer_a.add_frame(10, 0); - layer_a.add_frame(20, 1); - layer_a.add_frame(30, 2); - Layer &layer_b = grease_pencil->add_layer("LayerB"); - layer_b.add_frame(10, 3); - layer_b.add_frame(30, 4); - - EXPECT_EQ(layer_a.frames().size(), 3); - EXPECT_EQ(layer_a.frames().lookup(10).drawing_index, 0); - EXPECT_EQ(layer_a.frames().lookup(20).drawing_index, 1); - EXPECT_EQ(layer_a.frames().lookup(30).drawing_index, 2); - EXPECT_EQ(layer_b.frames().size(), 2); - EXPECT_EQ(layer_b.frames().lookup(10).drawing_index, 3); - EXPECT_EQ(layer_b.frames().lookup(30).drawing_index, 4); - /* Test DNA storage data too. */ - layer_a.prepare_for_dna_write(); - layer_b.prepare_for_dna_write(); - EXPECT_EQ(layer_a.frames_storage.num, 3); - EXPECT_EQ(layer_a.frames_storage.values[0].drawing_index, 0); - EXPECT_EQ(layer_a.frames_storage.values[1].drawing_index, 1); - EXPECT_EQ(layer_a.frames_storage.values[2].drawing_index, 2); - EXPECT_EQ(layer_b.frames_storage.num, 2); - EXPECT_EQ(layer_b.frames_storage.values[0].drawing_index, 3); - EXPECT_EQ(layer_b.frames_storage.values[1].drawing_index, 4); - - /* Drawings 0,1,2 get removed, drawings 3,4 move up (order changes). */ - grease_pencil->remove_layer(layer_a); - EXPECT_EQ(layer_b.frames().size(), 2); - EXPECT_EQ(layer_b.frames().lookup(10).drawing_index, 1); - EXPECT_EQ(layer_b.frames().lookup(30).drawing_index, 0); - /* Test DNA storage data too. */ - layer_b.prepare_for_dna_write(); - EXPECT_EQ(layer_b.frames_storage.num, 2); - EXPECT_EQ(layer_b.frames_storage.values[0].drawing_index, 1); - EXPECT_EQ(layer_b.frames_storage.values[1].drawing_index, 0); - - BKE_id_free(nullptr, grease_pencil); -} - } // namespace blender::bke::greasepencil::tests diff --git a/source/blender/blenkernel/intern/grease_pencil_vertex_groups.cc b/source/blender/blenkernel/intern/grease_pencil_vertex_groups.cc index 85a326536f5..236a65bb879 100644 --- a/source/blender/blenkernel/intern/grease_pencil_vertex_groups.cc +++ b/source/blender/blenkernel/intern/grease_pencil_vertex_groups.cc @@ -11,12 +11,15 @@ #include "BLI_listbase.h" #include "BLI_set.hh" #include "BLI_string.h" +#include "BLI_string_utils.hh" #include "BKE_curves.hh" #include "BKE_deform.hh" #include "BKE_grease_pencil.hh" #include "BKE_grease_pencil_vertex_groups.hh" +#include "BLT_translation.h" + namespace blender::bke::greasepencil { /* ------------------------------------------------------------------- */ diff --git a/source/blender/blenkernel/intern/icons.cc b/source/blender/blenkernel/intern/icons.cc index 94438af63c7..c8ffeadd3f0 100644 --- a/source/blender/blenkernel/intern/icons.cc +++ b/source/blender/blenkernel/intern/icons.cc @@ -25,7 +25,7 @@ #include "BLI_threads.h" #include "BLI_utildefines.h" -#include "BKE_global.hh" /* only for G.background test */ +#include "BKE_global.h" /* only for G.background test */ #include "BKE_icons.h" #include "BKE_preview_image.hh" #include "BKE_studiolight.h" diff --git a/source/blender/blenkernel/intern/icons_rasterize.cc b/source/blender/blenkernel/intern/icons_rasterize.cc index b7b9c79a704..4b7fe6403ec 100644 --- a/source/blender/blenkernel/intern/icons_rasterize.cc +++ b/source/blender/blenkernel/intern/icons_rasterize.cc @@ -5,6 +5,7 @@ /** \file * \ingroup bke */ +#include "MEM_guardedalloc.h" #include "BLI_bitmap_draw_2d.h" #include "BLI_math_color.h" @@ -16,7 +17,7 @@ #include "BKE_icons.h" -#include "BLI_strict_flags.h" /* Keep last. */ +#include "BLI_strict_flags.h" struct UserRasterInfo { int pt[3][2]; diff --git a/source/blender/blenkernel/intern/idprop.cc b/source/blender/blenkernel/intern/idprop.cc index 8a972e2d18f..0ce8e9b5766 100644 --- a/source/blender/blenkernel/intern/idprop.cc +++ b/source/blender/blenkernel/intern/idprop.cc @@ -22,7 +22,7 @@ #include "BLI_string.h" #include "BLI_utildefines.h" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_idprop.h" #include "BKE_lib_id.hh" @@ -32,7 +32,7 @@ #include "BLO_read_write.hh" -#include "BLI_strict_flags.h" /* Keep last. */ +#include "BLI_strict_flags.h" /* IDPropertyTemplate is a union in DNA_ID.h */ diff --git a/source/blender/blenkernel/intern/idprop_serialize.cc b/source/blender/blenkernel/intern/idprop_serialize.cc index 35ee9f0ffb7..bd59af19494 100644 --- a/source/blender/blenkernel/intern/idprop_serialize.cc +++ b/source/blender/blenkernel/intern/idprop_serialize.cc @@ -90,8 +90,9 @@ class IDPropertySerializer { std::shared_ptr create_dictionary(const IDProperty *id_property) const { std::shared_ptr result = std::make_shared(); - result->append_str(IDP_KEY_NAME, id_property->name); - result->append_str(IDP_KEY_TYPE, this->type_name()); + DictionaryValue::Items &attributes = result->elements(); + attributes.append_as(std::pair(IDP_KEY_NAME, new StringValue(id_property->name))); + attributes.append_as(std::pair(IDP_KEY_TYPE, new StringValue(type_name()))); return result; } }; @@ -100,7 +101,7 @@ class IDPropertySerializer { * \brief Helper class for parsing DictionaryValues. */ struct DictionaryEntryParser { - DictionaryValue::Lookup lookup; + const DictionaryValue::Lookup lookup; public: explicit DictionaryEntryParser(const DictionaryValue &value) : lookup(value.create_lookup()) {} @@ -173,74 +174,92 @@ struct DictionaryEntryParser { private: std::optional get_string(StringRef key) const { - const std::shared_ptr *value = lookup.lookup_ptr(key); - if (value == nullptr) { + const DictionaryValue::LookupValue *value_ptr = lookup.lookup_ptr(key); + if (value_ptr == nullptr) { return std::nullopt; } - if (value->get()->type() != eValueType::String) { + const DictionaryValue::LookupValue &value = *value_ptr; + + if (value->type() != eValueType::String) { return std::nullopt; } - return value->get()->as_string_value()->value(); + + return value->as_string_value()->value(); } const ArrayValue *get_array(StringRef key) const { - const std::shared_ptr *value = lookup.lookup_ptr(key); - if (value == nullptr) { + const DictionaryValue::LookupValue *value_ptr = lookup.lookup_ptr(key); + if (value_ptr == nullptr) { return nullptr; } - if (value->get()->type() != eValueType::Array) { + const DictionaryValue::LookupValue &value = *value_ptr; + + if (value->type() != eValueType::Array) { return nullptr; } - return value->get()->as_array_value(); + + return value->as_array_value(); } std::optional get_bool(StringRef key) const { - const std::shared_ptr *value = lookup.lookup_ptr(key); - if (value == nullptr) { + const DictionaryValue::LookupValue *value_ptr = lookup.lookup_ptr(key); + if (value_ptr == nullptr) { return std::nullopt; } - if (value->get()->type() != eValueType::Boolean) { + const DictionaryValue::LookupValue &value = *value_ptr; + + if (value->type() != eValueType::Boolean) { return std::nullopt; } - return value->get()->as_boolean_value()->value(); + + return value->as_boolean_value()->value(); } std::optional get_int(StringRef key) const { - const std::shared_ptr *value = lookup.lookup_ptr(key); - if (value == nullptr) { + const DictionaryValue::LookupValue *value_ptr = lookup.lookup_ptr(key); + if (value_ptr == nullptr) { return std::nullopt; } - if (value->get()->type() != eValueType::Int) { + const DictionaryValue::LookupValue &value = *value_ptr; + + if (value->type() != eValueType::Int) { return std::nullopt; } - return value->get()->as_int_value()->value(); + + return value->as_int_value()->value(); } std::optional get_enum(StringRef key) const { - const std::shared_ptr *value = lookup.lookup_ptr(key); - if (value == nullptr) { + const DictionaryValue::LookupValue *value_ptr = lookup.lookup_ptr(key); + if (value_ptr == nullptr) { return std::nullopt; } - if (value->get()->type() != eValueType::Int) { + const DictionaryValue::LookupValue &value = *value_ptr; + + if (value->type() != eValueType::Int) { return std::nullopt; } - return value->get()->as_int_value()->value(); + + return value->as_int_value()->value(); } std::optional get_double(StringRef key) const { - const std::shared_ptr *value = lookup.lookup_ptr(key); - if (value == nullptr) { + const DictionaryValue::LookupValue *value_ptr = lookup.lookup_ptr(key); + if (value_ptr == nullptr) { return std::nullopt; } - if (value->get()->type() != eValueType::Double) { + const DictionaryValue::LookupValue &value = *value_ptr; + + if (value->type() != eValueType::Double) { return std::nullopt; } - return value->get()->as_double_value()->value(); + + return value->as_double_value()->value(); } std::optional get_float(StringRef key) const @@ -251,16 +270,19 @@ struct DictionaryEntryParser { template std::optional> get_array_primitive(StringRef key) const { - const std::shared_ptr *value = lookup.lookup_ptr(key); - if (value == nullptr) { + const DictionaryValue::LookupValue *value_ptr = lookup.lookup_ptr(key); + if (value_ptr == nullptr) { return std::nullopt; } - if (value->get()->type() != eValueType::Array) { + const DictionaryValue::LookupValue &value = *value_ptr; + + if (value->type() != eValueType::Array) { return std::nullopt; } Vector result; - for (const std::shared_ptr &element : value->get()->as_array_value()->elements()) { + const ArrayValue::Items &elements = value->as_array_value()->elements(); + for (const ArrayValue::Item &element : elements) { const ValueType *value_type = static_cast(element.get()); PrimitiveType primitive_value = value_type->value(); result.append_as(primitive_value); @@ -299,7 +321,8 @@ class IDPStringSerializer : public IDPropertySerializer { const IDProperty *id_property) const override { std::shared_ptr result = create_dictionary(id_property); - result->append_str(IDP_KEY_VALUE, IDP_String(id_property)); + DictionaryValue::Items &attributes = result->elements(); + attributes.append_as(std::pair(IDP_KEY_VALUE, new StringValue(IDP_String(id_property)))); return result; } @@ -338,7 +361,8 @@ class IDPBoolSerializer : public IDPropertySerializer { const IDProperty *id_property) const override { std::shared_ptr result = create_dictionary(id_property); - result->append(IDP_KEY_VALUE, std::make_shared(IDP_Bool(id_property) != 0)); + DictionaryValue::Items &attributes = result->elements(); + attributes.append_as(std::pair(IDP_KEY_VALUE, new BooleanValue(IDP_Bool(id_property) != 0))); return result; } @@ -377,7 +401,8 @@ class IDPIntSerializer : public IDPropertySerializer { const IDProperty *id_property) const override { std::shared_ptr result = create_dictionary(id_property); - result->append_int(IDP_KEY_VALUE, IDP_Int(id_property)); + DictionaryValue::Items &attributes = result->elements(); + attributes.append_as(std::pair(IDP_KEY_VALUE, new IntValue(IDP_Int(id_property)))); return result; } @@ -416,7 +441,8 @@ class IDPFloatSerializer : public IDPropertySerializer { const IDProperty *id_property) const override { std::shared_ptr result = create_dictionary(id_property); - result->append_double(IDP_KEY_VALUE, IDP_Float(id_property)); + DictionaryValue::Items &attributes = result->elements(); + attributes.append_as(std::pair(IDP_KEY_VALUE, new DoubleValue(IDP_Float(id_property)))); return result; } @@ -455,7 +481,8 @@ class IDPDoubleSerializer : public IDPropertySerializer { const IDProperty *id_property) const override { std::shared_ptr result = create_dictionary(id_property); - result->append_double(IDP_KEY_VALUE, IDP_Double(id_property)); + DictionaryValue::Items &attributes = result->elements(); + attributes.append_as(std::pair(IDP_KEY_VALUE, new DoubleValue(IDP_Double(id_property)))); return result; } @@ -494,38 +521,45 @@ class IDPArraySerializer : public IDPropertySerializer { const IDProperty *id_property) const override { std::shared_ptr result = create_dictionary(id_property); + DictionaryValue::Items &attributes = result->elements(); const IDPropertySerializer &subtype_serializer = serializer_for( static_cast(id_property->subtype)); - result->append_str(IDP_KEY_SUBTYPE, subtype_serializer.type_name()); + attributes.append_as( + std::pair(IDP_KEY_SUBTYPE, new StringValue(subtype_serializer.type_name()))); - ArrayValue &array = *result->append_array(IDP_KEY_VALUE); + std::shared_ptr array = std::make_shared(); switch (static_cast(id_property->subtype)) { case IDP_INT: { int32_t *values = static_cast(IDP_Array(id_property)); - add_values(array, Span(values, id_property->len)); + add_values(array.get(), Span(values, id_property->len)); break; } + case IDP_FLOAT: { float *values = static_cast(IDP_Array(id_property)); - add_values(array, Span(values, id_property->len)); + add_values(array.get(), Span(values, id_property->len)); break; } + case IDP_DOUBLE: { double *values = static_cast(IDP_Array(id_property)); - add_values(array, Span(values, id_property->len)); + add_values(array.get(), Span(values, id_property->len)); break; } + case IDP_GROUP: { IDProperty *values = static_cast(IDP_Array(id_property)); - add_values(array, Span(values, id_property->len)); + add_values(array.get(), Span(values, id_property->len)); break; } + default: { /* IDP_ARRAY only supports IDP_INT, IDP_FLOAT, IDP_DOUBLE and IDP_GROUP. */ BLI_assert_unreachable(); break; } } + attributes.append_as(std::pair(IDP_KEY_VALUE, std::move(array))); return result; } @@ -542,13 +576,17 @@ class IDPArraySerializer : public IDPropertySerializer { switch (*property_subtype) { case IDP_INT: return idprop_array_int_from_value(entry_reader); + case IDP_FLOAT: return idprop_array_float_from_value(entry_reader); + case IDP_DOUBLE: return idprop_array_double_from_value(entry_reader); + default: - return nullptr; + break; } + return nullptr; } private: @@ -558,22 +596,25 @@ class IDPArraySerializer : public IDPropertySerializer { typename PrimitiveType, /* Type of value that can store the PrimitiveType in the Array. */ typename ValueType> - void add_values(ArrayValue &array, Span values) const + void add_values(ArrayValue *array, Span values) const { + ArrayValue::Items &items = array->elements(); for (PrimitiveType value : values) { - array.append(std::make_shared(value)); + items.append_as(std::make_shared(value)); } } - void add_values(ArrayValue &array, Span values) const + void add_values(ArrayValue *array, Span values) const { + ArrayValue::Items &items = array->elements(); for (const IDProperty &id_property : values) { const IDPropertySerializer &value_serializer = serializer_for( static_cast(id_property.type)); if (!value_serializer.supports_serializing()) { continue; } - array.append(value_serializer.idprop_to_dictionary(&id_property)); + std::shared_ptr value = value_serializer.idprop_to_dictionary(&id_property); + items.append_as(value); } } @@ -645,15 +686,18 @@ class IDPGroupSerializer : public IDPropertySerializer { const IDProperty *id_property) const override { std::shared_ptr result = create_dictionary(id_property); - + DictionaryValue::Items &attributes = result->elements(); std::shared_ptr array = std::make_shared(); + ArrayValue::Items &elements = array->elements(); + LISTBASE_FOREACH (IDProperty *, sub_property, &id_property->data.group) { + const IDPropertySerializer &sub_property_serializer = serializer_for( static_cast(sub_property->type)); - array->append(sub_property_serializer.idprop_to_dictionary(sub_property)); + elements.append_as(sub_property_serializer.idprop_to_dictionary(sub_property)); } - result->append(IDP_KEY_VALUE, std::move(array)); + attributes.append_as(std::pair(IDP_KEY_VALUE, array)); return result; } @@ -672,7 +716,7 @@ class IDPGroupSerializer : public IDPropertySerializer { } std::unique_ptr result = create_group(name->c_str()); - for (const std::shared_ptr &element : array->elements()) { + for (const ArrayValue::Item &element : array->elements()) { if (element->type() != eValueType::Dictionary) { continue; } @@ -796,12 +840,13 @@ std::unique_ptr convert_to_serialize_values(const IDProperty *proper { BLI_assert(properties != nullptr); std::unique_ptr result = std::make_unique(); + ArrayValue::Items &elements = result->elements(); const IDProperty *current_property = properties; while (current_property != nullptr) { const IDPropertySerializer &serializer = serializer_for( static_cast(current_property->type)); if (serializer.supports_serializing()) { - result->append(serializer.idprop_to_dictionary(current_property)); + elements.append_as(serializer.idprop_to_dictionary(current_property)); } current_property = current_property->next; } @@ -832,7 +877,8 @@ static IDProperty *idprop_from_value(const ArrayValue &value) IDProperty *result = nullptr; IDProperty *previous_added = nullptr; - for (const std::shared_ptr &element : value.elements()) { + const ArrayValue::Items &elements = value.elements(); + for (const ArrayValue::Item &element : elements) { if (element->type() != eValueType::Dictionary) { continue; } diff --git a/source/blender/blenkernel/intern/idprop_serialize_test.cc b/source/blender/blenkernel/intern/idprop_serialize_test.cc index 0aceaa4c8d4..f431cf56510 100644 --- a/source/blender/blenkernel/intern/idprop_serialize_test.cc +++ b/source/blender/blenkernel/intern/idprop_serialize_test.cc @@ -18,11 +18,11 @@ static void check_container_value(ArrayValue *value) { ASSERT_NE(value, nullptr); ASSERT_EQ(value->type(), eValueType::Array); - const Span> elements = value->elements(); + const ArrayValue::Items elements = value->elements(); EXPECT_FALSE(elements.is_empty()); EXPECT_EQ(elements.size(), 1); - const std::shared_ptr &item = value->elements()[0]; + const ArrayValue::Item &item = value->elements()[0]; ASSERT_EQ(item->type(), eValueType::Dictionary); } @@ -72,7 +72,7 @@ static void test_string_to_value(const StringRefNull prop_name, const StringRefN std::unique_ptr value = convert_to_serialize_values(property.get()); check_container_value(value.get()); - const std::shared_ptr &item = value->elements()[0]; + const ArrayValue::Item &item = value->elements()[0]; const DictionaryValue *object = item->as_dictionary_value(); const DictionaryValue::Lookup lookup = object->create_lookup(); @@ -93,7 +93,7 @@ static void test_int_to_value(const StringRefNull prop_name, int32_t prop_conten std::unique_ptr value = convert_to_serialize_values(property.get()); check_container_value(value.get()); - const std::shared_ptr &item = value->elements()[0]; + const ArrayValue::Item &item = value->elements()[0]; const DictionaryValue *object = item->as_dictionary_value(); const DictionaryValue::Lookup lookup = object->create_lookup(); @@ -114,7 +114,7 @@ static void test_float_to_value(const StringRefNull prop_name, float prop_conten std::unique_ptr value = convert_to_serialize_values(property.get()); check_container_value(value.get()); - const std::shared_ptr &item = value->elements()[0]; + const ArrayValue::Item &item = value->elements()[0]; const DictionaryValue *object = item->as_dictionary_value(); const DictionaryValue::Lookup lookup = object->create_lookup(); @@ -135,7 +135,7 @@ static void test_double_to_value(const StringRefNull prop_name, double prop_cont std::unique_ptr value = convert_to_serialize_values(property.get()); check_container_value(value.get()); - const std::shared_ptr &item = value->elements()[0]; + const ArrayValue::Item &item = value->elements()[0]; const DictionaryValue *object = item->as_dictionary_value(); const DictionaryValue::Lookup lookup = object->create_lookup(); @@ -157,7 +157,7 @@ static void test_array_to_value(const StringRefNull prop_name, Vector value = convert_to_serialize_values(property.get()); check_container_value(value.get()); - const std::shared_ptr &item = value->elements()[0]; + const ArrayValue::Item &item = value->elements()[0]; const DictionaryValue *object = item->as_dictionary_value(); const DictionaryValue::Lookup lookup = object->create_lookup(); @@ -168,7 +168,7 @@ static void test_array_to_value(const StringRefNull prop_name, Vector &element = *lookup.lookup_ptr("value"); const ArrayValue *subvalues = element->as_array_value(); ASSERT_NE(subvalues, nullptr); - const Span> subitems = subvalues->elements(); + const ArrayValue::Items &subitems = subvalues->elements(); ASSERT_EQ(subitems.size(), prop_content.size()); for (size_t i = 0; i < prop_content.size(); i++) { @@ -252,7 +252,7 @@ static void test_idprop(const IDProperty *id_property, static void test_idprop(const IDProperty *id_property, StringRef expected_name, - const Span values) + const Vector &values) { ASSERT_NE(id_property, nullptr); EXPECT_EQ(id_property->type, IDP_ARRAY); @@ -267,7 +267,7 @@ static void test_idprop(const IDProperty *id_property, static void test_idprop(const IDProperty *id_property, StringRef expected_name, - const Span values) + const Vector &values) { ASSERT_NE(id_property, nullptr); EXPECT_EQ(id_property->type, IDP_ARRAY); @@ -282,7 +282,7 @@ static void test_idprop(const IDProperty *id_property, static void test_idprop(const IDProperty *id_property, StringRef expected_name, - const Span values) + const Vector &values) { ASSERT_NE(id_property, nullptr); EXPECT_EQ(id_property->type, IDP_ARRAY); diff --git a/source/blender/blenkernel/intern/idprop_utils.cc b/source/blender/blenkernel/intern/idprop_utils.cc index 80c6f6648cb..c25e253d123 100644 --- a/source/blender/blenkernel/intern/idprop_utils.cc +++ b/source/blender/blenkernel/intern/idprop_utils.cc @@ -22,7 +22,7 @@ #include "MEM_guardedalloc.h" -#include "BLI_strict_flags.h" /* Keep last. */ +#include "BLI_strict_flags.h" /* -------------------------------------------------------------------- */ /** \name IDProp Repr diff --git a/source/blender/blenkernel/intern/idtype.cc b/source/blender/blenkernel/intern/idtype.cc index 13d0d599553..dc900d9dd37 100644 --- a/source/blender/blenkernel/intern/idtype.cc +++ b/source/blender/blenkernel/intern/idtype.cc @@ -6,7 +6,6 @@ * \ingroup bke */ -#include #include #include "MEM_guardedalloc.h" @@ -16,7 +15,7 @@ #include "CLG_log.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_ID.h" #include "DNA_collection_types.h" @@ -24,7 +23,7 @@ #include "DNA_scene_types.h" #include "BKE_main.hh" -#include "BKE_node.hh" +#include "BKE_node.h" #include "BKE_idtype.hh" @@ -46,17 +45,14 @@ bool BKE_idtype_cache_key_cmp(const void *key_a_v, const void *key_b_v) (key_a->identifier != key_b->identifier); } -static std::array id_types; +static IDTypeInfo *id_types[INDEX_ID_MAX] = {nullptr}; static void id_type_init() { - int init_types_num = 0; - #define INIT_TYPE(_id_code) \ { \ BLI_assert(IDType_##_id_code.main_listbase_index == INDEX_##_id_code); \ id_types[INDEX_##_id_code] = &IDType_##_id_code; \ - init_types_num++; \ } \ (void)0 @@ -83,7 +79,6 @@ static void id_type_init() INIT_TYPE(ID_GR); INIT_TYPE(ID_AR); INIT_TYPE(ID_AC); - INIT_TYPE(ID_AN); INIT_TYPE(ID_NT); INIT_TYPE(ID_BR); INIT_TYPE(ID_PA); @@ -102,13 +97,9 @@ static void id_type_init() INIT_TYPE(ID_VO); INIT_TYPE(ID_GP); - /* Special case. */ + /* Special naughty boy... */ BLI_assert(IDType_ID_LINK_PLACEHOLDER.main_listbase_index == INDEX_ID_NULL); id_types[INDEX_ID_NULL] = &IDType_ID_LINK_PLACEHOLDER; - init_types_num++; - - BLI_assert_msg(init_types_num == INDEX_ID_MAX, "Some IDTypeInfo initialization is missing"); - UNUSED_VARS_NDEBUG(init_types_num); #undef INIT_TYPE } @@ -119,23 +110,19 @@ void BKE_idtype_init() id_type_init(); } -const IDTypeInfo *BKE_idtype_get_info_from_idtype_index(const int idtype_index) +const IDTypeInfo *BKE_idtype_get_info_from_idcode(const short id_code) { - if (idtype_index >= 0 && idtype_index < int(id_types.size())) { - const IDTypeInfo *id_type = id_types[size_t(idtype_index)]; - if (id_type && id_type->name[0] != '\0') { - return id_type; - } + int id_index = BKE_idtype_idcode_to_index(id_code); + + if (id_index >= 0 && id_index < ARRAY_SIZE(id_types) && id_types[id_index] != nullptr && + id_types[id_index]->name[0] != '\0') + { + return id_types[id_index]; } return nullptr; } -const IDTypeInfo *BKE_idtype_get_info_from_idcode(const short id_code) -{ - return BKE_idtype_get_info_from_idtype_index(BKE_idtype_idcode_to_index(id_code)); -} - const IDTypeInfo *BKE_idtype_get_info_from_id(const ID *id) { return BKE_idtype_get_info_from_idcode(GS(id->name)); @@ -143,9 +130,9 @@ const IDTypeInfo *BKE_idtype_get_info_from_id(const ID *id) static const IDTypeInfo *idtype_get_info_from_name(const char *idtype_name) { - for (const IDTypeInfo *id_type : id_types) { - if (id_type && STREQ(idtype_name, id_type->name)) { - return id_type; + for (int i = ARRAY_SIZE(id_types); i--;) { + if (id_types[i] != nullptr && STREQ(idtype_name, id_types[i]->name)) { + return id_types[i]; } } @@ -218,6 +205,124 @@ bool BKE_idtype_idcode_append_is_reusable(const short idcode) return false; } +uint64_t BKE_idtype_idcode_to_idfilter(const short idcode) +{ +#define CASE_IDFILTER(_id) \ + case ID_##_id: \ + return FILTER_ID_##_id + +#define CASE_IDFILTER_NONE(_id) \ + case ID_##_id: \ + return 0 + + switch ((ID_Type)idcode) { + CASE_IDFILTER(AC); + CASE_IDFILTER(AR); + CASE_IDFILTER(BR); + CASE_IDFILTER(CA); + CASE_IDFILTER(CF); + CASE_IDFILTER(CU_LEGACY); + CASE_IDFILTER(GD_LEGACY); + CASE_IDFILTER(GP); + CASE_IDFILTER(GR); + CASE_IDFILTER(CV); + CASE_IDFILTER(IM); + CASE_IDFILTER_NONE(IP); + CASE_IDFILTER(KE); + CASE_IDFILTER(LA); + CASE_IDFILTER(LI); + CASE_IDFILTER(LP); + CASE_IDFILTER(LS); + CASE_IDFILTER(LT); + CASE_IDFILTER(MA); + CASE_IDFILTER(MB); + CASE_IDFILTER(MC); + CASE_IDFILTER(ME); + CASE_IDFILTER(MSK); + CASE_IDFILTER(NT); + CASE_IDFILTER(OB); + CASE_IDFILTER(PA); + CASE_IDFILTER(PAL); + CASE_IDFILTER(PC); + CASE_IDFILTER(PT); + CASE_IDFILTER(SCE); + CASE_IDFILTER(SCR); + CASE_IDFILTER(SO); + CASE_IDFILTER(SPK); + CASE_IDFILTER(TE); + CASE_IDFILTER(TXT); + CASE_IDFILTER(VF); + CASE_IDFILTER(VO); + CASE_IDFILTER(WM); + CASE_IDFILTER(WO); + CASE_IDFILTER(WS); + } + + BLI_assert_unreachable(); + return 0; + +#undef CASE_IDFILTER +#undef CASE_IDFILTER_NONE +} + +short BKE_idtype_idcode_from_idfilter(const uint64_t idfilter) +{ +#define CASE_IDFILTER(_id) \ + case FILTER_ID_##_id: \ + return ID_##_id + +#define CASE_IDFILTER_NONE(_id) (void)0 + + switch (idfilter) { + CASE_IDFILTER(AC); + CASE_IDFILTER(AR); + CASE_IDFILTER(BR); + CASE_IDFILTER(CA); + CASE_IDFILTER(CF); + CASE_IDFILTER(CU_LEGACY); + CASE_IDFILTER(GD_LEGACY); + CASE_IDFILTER(GP); + CASE_IDFILTER(GR); + CASE_IDFILTER(CV); + CASE_IDFILTER(IM); + CASE_IDFILTER_NONE(IP); + CASE_IDFILTER(KE); + CASE_IDFILTER(LA); + CASE_IDFILTER(LI); + CASE_IDFILTER(LP); + CASE_IDFILTER(LS); + CASE_IDFILTER(LT); + CASE_IDFILTER(MA); + CASE_IDFILTER(MB); + CASE_IDFILTER(MC); + CASE_IDFILTER(ME); + CASE_IDFILTER(MSK); + CASE_IDFILTER(NT); + CASE_IDFILTER(OB); + CASE_IDFILTER(PA); + CASE_IDFILTER(PAL); + CASE_IDFILTER(PC); + CASE_IDFILTER(PT); + CASE_IDFILTER(SCE); + CASE_IDFILTER(SCR); + CASE_IDFILTER(SO); + CASE_IDFILTER(SPK); + CASE_IDFILTER(TE); + CASE_IDFILTER(TXT); + CASE_IDFILTER(VF); + CASE_IDFILTER(VO); + CASE_IDFILTER(WM); + CASE_IDFILTER(WO); + CASE_IDFILTER(WS); + } + + BLI_assert_unreachable(); + return 0; + +#undef CASE_IDFILTER +#undef CASE_IDFILTER_NONE +} + int BKE_idtype_idcode_to_index(const short idcode) { #define CASE_IDINDEX(_id) \ @@ -226,7 +331,6 @@ int BKE_idtype_idcode_to_index(const short idcode) switch ((ID_Type)idcode) { CASE_IDINDEX(AC); - CASE_IDINDEX(AN); CASE_IDINDEX(AR); CASE_IDINDEX(BR); CASE_IDINDEX(CA); @@ -278,99 +382,68 @@ int BKE_idtype_idcode_to_index(const short idcode) #undef CASE_IDINDEX } -int BKE_idtype_idfilter_to_index(const uint64_t id_filter) +short BKE_idtype_idcode_from_index(const int index) { -#define CASE_IDINDEX(_id) \ - case FILTER_ID_##_id: \ - return INDEX_ID_##_id +#define CASE_IDCODE(_id) \ + case INDEX_ID_##_id: \ + return ID_##_id - switch (id_filter) { - CASE_IDINDEX(AC); - CASE_IDINDEX(AN); - CASE_IDINDEX(AR); - CASE_IDINDEX(BR); - CASE_IDINDEX(CA); - CASE_IDINDEX(CF); - CASE_IDINDEX(CU_LEGACY); - CASE_IDINDEX(GD_LEGACY); - CASE_IDINDEX(GP); - CASE_IDINDEX(GR); - CASE_IDINDEX(CV); - CASE_IDINDEX(IM); - CASE_IDINDEX(IP); - CASE_IDINDEX(KE); - CASE_IDINDEX(LA); - CASE_IDINDEX(LI); - CASE_IDINDEX(LS); - CASE_IDINDEX(LT); - CASE_IDINDEX(MA); - CASE_IDINDEX(MB); - CASE_IDINDEX(MC); - CASE_IDINDEX(ME); - CASE_IDINDEX(MSK); - CASE_IDINDEX(NT); - CASE_IDINDEX(OB); - CASE_IDINDEX(PA); - CASE_IDINDEX(PAL); - CASE_IDINDEX(PC); - CASE_IDINDEX(PT); - CASE_IDINDEX(LP); - CASE_IDINDEX(SCE); - CASE_IDINDEX(SCR); - CASE_IDINDEX(SPK); - CASE_IDINDEX(SO); - CASE_IDINDEX(TE); - CASE_IDINDEX(TXT); - CASE_IDINDEX(VF); - CASE_IDINDEX(VO); - CASE_IDINDEX(WM); - CASE_IDINDEX(WO); - CASE_IDINDEX(WS); + switch (index) { + CASE_IDCODE(AC); + CASE_IDCODE(AR); + CASE_IDCODE(BR); + CASE_IDCODE(CA); + CASE_IDCODE(CF); + CASE_IDCODE(CU_LEGACY); + CASE_IDCODE(GD_LEGACY); + CASE_IDCODE(GP); + CASE_IDCODE(GR); + CASE_IDCODE(CV); + CASE_IDCODE(IM); + CASE_IDCODE(IP); + CASE_IDCODE(KE); + CASE_IDCODE(LA); + CASE_IDCODE(LI); + CASE_IDCODE(LS); + CASE_IDCODE(LT); + CASE_IDCODE(MA); + CASE_IDCODE(MB); + CASE_IDCODE(MC); + CASE_IDCODE(ME); + CASE_IDCODE(MSK); + CASE_IDCODE(NT); + CASE_IDCODE(OB); + CASE_IDCODE(PA); + CASE_IDCODE(PAL); + CASE_IDCODE(PC); + CASE_IDCODE(PT); + CASE_IDCODE(LP); + CASE_IDCODE(SCE); + CASE_IDCODE(SCR); + CASE_IDCODE(SPK); + CASE_IDCODE(SO); + CASE_IDCODE(TE); + CASE_IDCODE(TXT); + CASE_IDCODE(VF); + CASE_IDCODE(VO); + CASE_IDCODE(WM); + CASE_IDCODE(WO); + CASE_IDCODE(WS); } - /* No handling of #ID_LINK_PLACEHOLDER or #INDEX_ID_NULL here. */ + /* Special naughty boy... */ + if (index == INDEX_ID_NULL) { + return ID_LINK_PLACEHOLDER; + } return -1; -#undef CASE_IDINDEX +#undef CASE_IDCODE } -short BKE_idtype_index_to_idcode(const int idtype_index) +short BKE_idtype_idcode_iter_step(int *index) { - const IDTypeInfo *id_type = BKE_idtype_get_info_from_idtype_index(idtype_index); - if (id_type) { - return id_type->id_code; - } - - BLI_assert_unreachable(); - return -1; -} - -uint64_t BKE_idtype_index_to_idfilter(const int idtype_index) -{ - const IDTypeInfo *id_type = BKE_idtype_get_info_from_idtype_index(idtype_index); - if (id_type) { - return id_type->id_filter; - } - - BLI_assert_unreachable(); - return 0; -} - -uint64_t BKE_idtype_idcode_to_idfilter(const short idcode) -{ - return BKE_idtype_index_to_idfilter(BKE_idtype_idcode_to_index(idcode)); -} - -short BKE_idtype_idfilter_to_idcode(const uint64_t idfilter) -{ - return BKE_idtype_index_to_idcode(BKE_idtype_idfilter_to_index(idfilter)); -} - -short BKE_idtype_idcode_iter_step(int *idtype_index) -{ - return (*idtype_index < int(id_types.size())) ? BKE_idtype_index_to_idcode((*idtype_index)++) : - 0; + return (*index < ARRAY_SIZE(id_types)) ? BKE_idtype_idcode_from_index((*index)++) : 0; } void BKE_idtype_id_foreach_cache(ID *id, diff --git a/source/blender/blenkernel/intern/image.cc b/source/blender/blenkernel/intern/image.cc index 35f265bd329..8329beb53e6 100644 --- a/source/blender/blenkernel/intern/image.cc +++ b/source/blender/blenkernel/intern/image.cc @@ -12,7 +12,6 @@ #include #include #include -#include #ifndef WIN32 # include #else @@ -61,11 +60,11 @@ #include "BLI_timecode.h" /* For stamp time-code format. */ #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" -#include "BKE_bpath.hh" +#include "BKE_bpath.h" #include "BKE_colortools.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_icons.h" #include "BKE_idtype.hh" #include "BKE_image.h" @@ -77,8 +76,8 @@ #include "BKE_node_tree_update.hh" #include "BKE_packedFile.h" #include "BKE_preview_image.hh" -#include "BKE_report.hh" -#include "BKE_scene.hh" +#include "BKE_report.h" +#include "BKE_scene.h" #include "BKE_workspace.h" #include "BLF_api.hh" @@ -157,11 +156,7 @@ static void image_init_data(ID *id) } } -static void image_copy_data(Main * /*bmain*/, - std::optional /*owner_library*/, - ID *id_dst, - const ID *id_src, - const int flag) +static void image_copy_data(Main * /*bmain*/, ID *id_dst, const ID *id_src, const int flag) { Image *image_dst = (Image *)id_dst; const Image *image_src = (const Image *)id_src; @@ -445,7 +440,6 @@ constexpr IDTypeInfo get_type_info() IDTypeInfo info{}; info.id_code = ID_IM; info.id_filter = FILTER_ID_IM; - info.dependencies_id_types = 0; info.main_listbase_index = INDEX_ID_IM; info.struct_size = sizeof(Image); info.name = "Image"; @@ -1500,7 +1494,7 @@ void BKE_image_packfiles_from_mem(ReportList *reports, void BKE_image_tag_time(Image *ima) { - ima->lastused = BLI_time_now_seconds_i(); + ima->lastused = BLI_check_seconds_timer_i(); } static uintptr_t image_mem_size(Image *image) @@ -3001,8 +2995,8 @@ static void image_tag_frame_recalc(Image *ima, ID *iuser_id, ImageUser *iuser, v iuser->flag |= IMA_NEED_FRAME_RECALC; if (iuser_id) { - /* Must copy image user changes to evaluated data-block. */ - DEG_id_tag_update(iuser_id, ID_RECALC_SYNC_TO_EVAL); + /* Must copy image user changes to CoW data-block. */ + DEG_id_tag_update(iuser_id, ID_RECALC_COPY_ON_WRITE); } } } @@ -3016,8 +3010,8 @@ static void image_tag_reload(Image *ima, ID *iuser_id, ImageUser *iuser, void *c image_update_views_format(ima, iuser); } if (iuser_id) { - /* Must copy image user changes to evaluated data-block. */ - DEG_id_tag_update(iuser_id, ID_RECALC_SYNC_TO_EVAL); + /* Must copy image user changes to CoW data-block. */ + DEG_id_tag_update(iuser_id, ID_RECALC_COPY_ON_WRITE); } BKE_image_partial_update_mark_full_update(ima); } diff --git a/source/blender/blenkernel/intern/image_format.cc b/source/blender/blenkernel/intern/image_format.cc index e65250e8fb2..4cc6cab8f88 100644 --- a/source/blender/blenkernel/intern/image_format.cc +++ b/source/blender/blenkernel/intern/image_format.cc @@ -16,6 +16,7 @@ #include "BLI_utildefines.h" #include "IMB_colormanagement.hh" +#include "IMB_imbuf.hh" #include "IMB_imbuf_types.hh" #include "BKE_colortools.hh" diff --git a/source/blender/blenkernel/intern/image_gpu.cc b/source/blender/blenkernel/intern/image_gpu.cc index 2811a38c676..666215d049c 100644 --- a/source/blender/blenkernel/intern/image_gpu.cc +++ b/source/blender/blenkernel/intern/image_gpu.cc @@ -8,6 +8,7 @@ #include "MEM_guardedalloc.h" +#include "BLI_bitmap.h" #include "BLI_boxpack_2d.h" #include "BLI_linklist.h" #include "BLI_listbase.h" @@ -21,7 +22,7 @@ #include "IMB_imbuf.hh" #include "IMB_imbuf_types.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_image.h" #include "BKE_image_partial_update.hh" #include "BKE_main.hh" @@ -585,7 +586,7 @@ void BKE_image_free_anim_gputextures(Main *bmain) void BKE_image_free_old_gputextures(Main *bmain) { static int lasttime = 0; - int ctime = int(BLI_time_now_seconds()); + int ctime = int(BLI_check_seconds_timer()); /* * Run garbage collector once for every collecting period of time diff --git a/source/blender/blenkernel/intern/image_partial_update.cc b/source/blender/blenkernel/intern/image_partial_update.cc index 2e5d048816e..4e28c204725 100644 --- a/source/blender/blenkernel/intern/image_partial_update.cc +++ b/source/blender/blenkernel/intern/image_partial_update.cc @@ -54,6 +54,7 @@ #include "DNA_image_types.h" +#include "IMB_imbuf.hh" #include "IMB_imbuf_types.hh" #include "BLI_listbase.h" diff --git a/source/blender/blenkernel/intern/image_partial_update_test.cc b/source/blender/blenkernel/intern/image_partial_update_test.cc index 3f2d513ae1b..bc2b30a39f2 100644 --- a/source/blender/blenkernel/intern/image_partial_update_test.cc +++ b/source/blender/blenkernel/intern/image_partial_update_test.cc @@ -6,7 +6,7 @@ #include "CLG_log.h" #include "BKE_appdir.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_idtype.hh" #include "BKE_image.h" #include "BKE_image_partial_update.hh" diff --git a/source/blender/blenkernel/intern/image_save.cc b/source/blender/blenkernel/intern/image_save.cc index 0cc7831136c..0615b18c501 100644 --- a/source/blender/blenkernel/intern/image_save.cc +++ b/source/blender/blenkernel/intern/image_save.cc @@ -15,7 +15,7 @@ #include "BLI_string.h" #include "BLI_vector.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_image_types.h" @@ -27,13 +27,13 @@ #include "IMB_openexr.hh" #include "BKE_colortools.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_image.h" #include "BKE_image_format.h" #include "BKE_image_save.h" #include "BKE_main.hh" -#include "BKE_report.hh" -#include "BKE_scene.hh" +#include "BKE_report.h" +#include "BKE_scene.h" #include "RE_pipeline.h" @@ -896,9 +896,7 @@ static void image_render_print_save_message(ReportList *reports, { if (ok) { /* no need to report, just some helpful console info */ - if (!G.quiet) { - printf("Saved: '%s'\n", filepath); - } + printf("Saved: '%s'\n", filepath); } else { /* report on error since users will want to know what failed */ diff --git a/source/blender/blenkernel/intern/instances.cc b/source/blender/blenkernel/intern/instances.cc index 6319bd74092..f43fba35002 100644 --- a/source/blender/blenkernel/intern/instances.cc +++ b/source/blender/blenkernel/intern/instances.cc @@ -6,6 +6,7 @@ #include "BLI_rand.hh" #include "BLI_task.hh" +#include "BKE_attribute_math.hh" #include "BKE_customdata.hh" #include "BKE_geometry_set.hh" #include "BKE_instances.hh" @@ -50,7 +51,7 @@ Instances::Instances() Instances::Instances(Instances &&other) : references_(std::move(other.references_)), - instances_num_(other.instances_num_), + transforms_(std::move(other.transforms_)), attributes_(other.attributes_), almost_unique_ids_cache_(std::move(other.almost_unique_ids_cache_)) { @@ -59,15 +60,15 @@ Instances::Instances(Instances &&other) Instances::Instances(const Instances &other) : references_(other.references_), - instances_num_(other.instances_num_), + transforms_(other.transforms_), almost_unique_ids_cache_(other.almost_unique_ids_cache_) { - CustomData_copy(&other.attributes_, &attributes_, CD_MASK_ALL, other.instances_num_); + CustomData_copy(&other.attributes_, &attributes_, CD_MASK_ALL, other.instances_num()); } Instances::~Instances() { - CustomData_free(&attributes_, instances_num_); + CustomData_free(&attributes_, this->instances_num()); } Instances &Instances::operator=(const Instances &other) @@ -92,55 +93,46 @@ Instances &Instances::operator=(Instances &&other) void Instances::resize(int capacity) { - CustomData_realloc(&attributes_, instances_num_, capacity, CD_SET_DEFAULT); - instances_num_ = capacity; + const int old_size = this->instances_num(); + transforms_.resize(capacity); + CustomData_realloc(&attributes_, old_size, capacity, CD_SET_DEFAULT); } void Instances::add_instance(const int instance_handle, const float4x4 &transform) { BLI_assert(instance_handle >= 0); BLI_assert(instance_handle < references_.size()); - const int old_size = instances_num_; - instances_num_++; - CustomData_realloc(&attributes_, old_size, instances_num_); + const int old_size = this->instances_num(); + transforms_.append(transform); + CustomData_realloc(&attributes_, old_size, transforms_.size()); this->reference_handles_for_write().last() = instance_handle; - this->transforms_for_write().last() = transform; } Span Instances::reference_handles() const { return {static_cast( CustomData_get_layer_named(&attributes_, CD_PROP_INT32, ".reference_index")), - instances_num_}; + this->instances_num()}; } MutableSpan Instances::reference_handles_for_write() { int *data = static_cast(CustomData_get_layer_named_for_write( - &attributes_, CD_PROP_INT32, ".reference_index", instances_num_)); + &attributes_, CD_PROP_INT32, ".reference_index", this->instances_num())); if (!data) { data = static_cast(CustomData_add_layer_named( - &attributes_, CD_PROP_INT32, CD_SET_DEFAULT, instances_num_, ".reference_index")); + &attributes_, CD_PROP_INT32, CD_SET_DEFAULT, this->instances_num(), ".reference_index")); } - return {data, instances_num_}; + return {data, this->instances_num()}; } +MutableSpan Instances::transforms() +{ + return transforms_; +} Span Instances::transforms() const { - return {static_cast( - CustomData_get_layer_named(&attributes_, CD_PROP_FLOAT4X4, "instance_transform")), - instances_num_}; -} - -MutableSpan Instances::transforms_for_write() -{ - float4x4 *data = static_cast(CustomData_get_layer_named_for_write( - &attributes_, CD_PROP_FLOAT4X4, "instance_transform", instances_num_)); - if (!data) { - data = static_cast(CustomData_add_layer_named( - &attributes_, CD_PROP_FLOAT4X4, CD_SET_DEFAULT, instances_num_, "instance_transform")); - } - return {data, instances_num_}; + return transforms_; } GeometrySet &Instances::geometry_set_from_reference(const int reference_index) @@ -187,14 +179,17 @@ void Instances::remove(const IndexMask &mask, return; } + const int new_size = mask.size(); + Instances new_instances; new_instances.references_ = std::move(references_); - new_instances.instances_num_ = mask.size(); + new_instances.transforms_.resize(new_size); + array_utils::gather(transforms_.as_span(), mask, new_instances.transforms_.as_mutable_span()); gather_attributes(this->attributes(), AttrDomain::Instance, propagation_info, - {}, + {"position"}, mask, new_instances.attributes_for_write()); @@ -205,7 +200,7 @@ void Instances::remove(const IndexMask &mask, void Instances::remove_unused_references() { - const int tot_instances = instances_num_; + const int tot_instances = this->instances_num(); const int tot_references_before = references_.size(); if (tot_instances == 0) { @@ -287,7 +282,7 @@ void Instances::remove_unused_references() int Instances::instances_num() const { - return this->instances_num_; + return transforms_.size(); } int Instances::references_num() const @@ -378,33 +373,11 @@ Span Instances::almost_unique_ids() const } } else { - r_data.reinitialize(instances_num_); + r_data.reinitialize(this->instances_num()); array_utils::fill_index_range(r_data.as_mutable_span()); } }); return almost_unique_ids_cache_.data(); } -static float3 get_transform_position(const float4x4 &transform) -{ - return transform.location(); -} - -static void set_transform_position(float4x4 &transform, const float3 position) -{ - transform.location() = position; -} - -VArray instance_position_varray(const Instances &instances) -{ - return VArray::ForDerivedSpan(instances.transforms()); -} - -VMutableArray instance_position_varray_for_write(Instances &instances) -{ - MutableSpan transforms = instances.transforms_for_write(); - return VMutableArray:: - ForDerivedSpan(transforms); -} - } // namespace blender::bke diff --git a/source/blender/blenkernel/intern/ipo.cc b/source/blender/blenkernel/intern/ipo.cc index 445a4820029..65d34788467 100644 --- a/source/blender/blenkernel/intern/ipo.cc +++ b/source/blender/blenkernel/intern/ipo.cc @@ -41,13 +41,13 @@ #include "BLI_string_utils.hh" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_action.h" -#include "BKE_anim_data.hh" -#include "BKE_fcurve.hh" +#include "BKE_anim_data.h" +#include "BKE_fcurve.h" #include "BKE_fcurve_driver.h" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_idtype.hh" #include "BKE_ipo.h" #include "BKE_key.hh" @@ -156,8 +156,7 @@ static void ipo_blend_read_data(BlendDataReader *reader, ID *id) IDTypeInfo IDType_ID_IP = { /*id_code*/ ID_IP, - /*id_filter*/ FILTER_ID_IP, - /*dependencies_id_types*/ 0, + /*id_filter*/ 0, /*main_listbase_index*/ INDEX_ID_IP, /*struct_size*/ sizeof(Ipo), /*name*/ "Ipo", @@ -2153,7 +2152,7 @@ void do_versions_ipos_to_animato(Main *bmain) if (ob->pose) { LISTBASE_FOREACH (bPoseChannel *, pchan, &ob->pose->chanbase) { LISTBASE_FOREACH (bConstraint *, con, &pchan->constraints) { - /* if constraint has its own IPO, convert add these to Object + /* if constraint has own IPO, convert add these to Object * (NOTE: they're most likely to be drivers too) */ if (con->ipo) { @@ -2173,7 +2172,7 @@ void do_versions_ipos_to_animato(Main *bmain) /* check constraints for local IPO's */ LISTBASE_FOREACH (bConstraint *, con, &ob->constraints) { - /* if constraint has its own IPO, convert add these to Object + /* if constraint has own IPO, convert add these to Object * (NOTE: they're most likely to be drivers too) */ if (con->ipo) { diff --git a/source/blender/blenkernel/intern/key.cc b/source/blender/blenkernel/intern/key.cc index b40ec9e3644..61df48879eb 100644 --- a/source/blender/blenkernel/intern/key.cc +++ b/source/blender/blenkernel/intern/key.cc @@ -9,7 +9,6 @@ #include #include #include -#include #include "MEM_guardedalloc.h" @@ -20,7 +19,7 @@ #include "BLI_string_utils.hh" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" /* Allow using deprecated functionality for .blend file I/O. */ #define DNA_DEPRECATED_ALLOW @@ -35,7 +34,7 @@ #include "DNA_object_types.h" #include "DNA_scene_types.h" -#include "BKE_anim_data.hh" +#include "BKE_anim_data.h" #include "BKE_curve.hh" #include "BKE_customdata.hh" #include "BKE_deform.hh" @@ -47,7 +46,7 @@ #include "BKE_lib_query.hh" #include "BKE_main.hh" #include "BKE_mesh.hh" -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "RNA_access.hh" #include "RNA_path.hh" @@ -55,11 +54,7 @@ #include "BLO_read_write.hh" -static void shapekey_copy_data(Main * /*bmain*/, - std::optional /*owner_library*/, - ID *id_dst, - const ID *id_src, - const int /*flag*/) +static void shapekey_copy_data(Main * /*bmain*/, ID *id_dst, const ID *id_src, const int /*flag*/) { Key *key_dst = (Key *)id_dst; const Key *key_src = (const Key *)id_src; @@ -196,8 +191,6 @@ static void shapekey_blend_read_after_liblink(BlendLibReader * /*reader*/, ID *i IDTypeInfo IDType_ID_KE = { /*id_code*/ ID_KE, /*id_filter*/ FILTER_ID_KE, - /* Warning! key->from, could be more types in future? */ - /*dependencies_id_types*/ FILTER_ID_ME | FILTER_ID_CU_LEGACY | FILTER_ID_LT, /*main_listbase_index*/ INDEX_ID_KE, /*struct_size*/ sizeof(Key), /*name*/ "Key", diff --git a/source/blender/blenkernel/intern/lattice.cc b/source/blender/blenkernel/intern/lattice.cc index fde95d5aa45..a85339a8b9b 100644 --- a/source/blender/blenkernel/intern/lattice.cc +++ b/source/blender/blenkernel/intern/lattice.cc @@ -19,7 +19,7 @@ #include "BLI_math_vector.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" /* Allow using deprecated functionality for .blend file I/O. */ #define DNA_DEPRECATED_ALLOW @@ -30,7 +30,9 @@ #include "DNA_lattice_types.h" #include "DNA_meshdata_types.h" #include "DNA_object_types.h" +#include "DNA_scene_types.h" +#include "BKE_anim_data.h" #include "BKE_curve.hh" #include "BKE_deform.hh" #include "BKE_displist.h" @@ -38,10 +40,13 @@ #include "BKE_lattice.hh" #include "BKE_lib_id.hh" #include "BKE_lib_query.hh" +#include "BKE_main.hh" #include "BKE_modifier.hh" #include "BKE_object.hh" #include "BKE_object_types.hh" +#include "DEG_depsgraph_query.hh" + #include "BLO_read_write.hh" static void lattice_init_data(ID *id) @@ -56,11 +61,7 @@ static void lattice_init_data(ID *id) BKE_lattice_resize(lattice, 2, 2, 2, nullptr); /* creates a uniform lattice */ } -static void lattice_copy_data(Main *bmain, - std::optional owner_library, - ID *id_dst, - const ID *id_src, - const int flag) +static void lattice_copy_data(Main *bmain, ID *id_dst, const ID *id_src, const int flag) { Lattice *lattice_dst = (Lattice *)id_dst; const Lattice *lattice_src = (const Lattice *)id_src; @@ -68,8 +69,7 @@ static void lattice_copy_data(Main *bmain, lattice_dst->def = static_cast(MEM_dupallocN(lattice_src->def)); if (lattice_src->key && (flag & LIB_ID_COPY_SHAPEKEY)) { - BKE_id_copy_in_lib( - bmain, owner_library, &lattice_src->key->id, (ID **)&lattice_dst->key, flag); + BKE_id_copy_ex(bmain, &lattice_src->key->id, (ID **)&lattice_dst->key, flag); /* XXX This is not nice, we need to make BKE_id_copy_ex fully re-entrant... */ lattice_dst->key->from = &lattice_dst->id; } @@ -163,7 +163,6 @@ static void lattice_blend_read_data(BlendDataReader *reader, ID *id) IDTypeInfo IDType_ID_LT = { /*id_code*/ ID_LT, /*id_filter*/ FILTER_ID_LT, - /*dependencies_id_types*/ FILTER_ID_KE, /*main_listbase_index*/ INDEX_ID_LT, /*struct_size*/ sizeof(Lattice), /*name*/ "Lattice", @@ -344,10 +343,10 @@ void BKE_lattice_resize(Lattice *lt, int uNew, int vNew, int wNew, Object *ltOb) BKE_displist_free(<Ob->runtime->curve_cache->disp); } - copy_m4_m4(mat, ltOb->object_to_world().ptr()); - unit_m4(ltOb->runtime->object_to_world.ptr()); + copy_m4_m4(mat, ltOb->object_to_world); + unit_m4(ltOb->object_to_world); BKE_lattice_deform_coords(ltOb, nullptr, vert_coords, uNew * vNew * wNew, 0, nullptr, 1.0f); - copy_m4_m4(ltOb->runtime->object_to_world.ptr(), mat); + copy_m4_m4(ltOb->object_to_world, mat); lt->typeu = typeu; lt->typev = typev; diff --git a/source/blender/blenkernel/intern/lattice_deform.cc b/source/blender/blenkernel/intern/lattice_deform.cc index b67ce7c90da..e6732f05799 100644 --- a/source/blender/blenkernel/intern/lattice_deform.cc +++ b/source/blender/blenkernel/intern/lattice_deform.cc @@ -33,6 +33,7 @@ #include "BKE_editmesh.hh" #include "BKE_key.hh" #include "BKE_lattice.hh" +#include "BKE_mesh.hh" #include "BKE_modifier.hh" #include "BKE_object.hh" #include "BKE_object_types.hh" @@ -82,15 +83,15 @@ LatticeDeformData *BKE_lattice_deform_data_create(const Object *oblatt, const Ob /* for example with a particle system: (ob == nullptr) */ if (ob == nullptr) { /* In deform-space, calc matrix. */ - invert_m4_m4(latmat, oblatt->object_to_world().ptr()); + invert_m4_m4(latmat, oblatt->object_to_world); /* back: put in deform array */ invert_m4_m4(imat, latmat); } else { /* In deform-space, calc matrix. */ - invert_m4_m4(imat, oblatt->object_to_world().ptr()); - mul_m4_m4m4(latmat, imat, ob->object_to_world().ptr()); + invert_m4_m4(imat, oblatt->object_to_world); + mul_m4_m4m4(latmat, imat, ob->object_to_world); /* back: put in deform array. */ invert_m4_m4(imat, latmat); diff --git a/source/blender/blenkernel/intern/lattice_deform_test.cc b/source/blender/blenkernel/intern/lattice_deform_test.cc index c9e4a1c4ad7..90eee096b11 100644 --- a/source/blender/blenkernel/intern/lattice_deform_test.cc +++ b/source/blender/blenkernel/intern/lattice_deform_test.cc @@ -3,21 +3,20 @@ * SPDX-License-Identifier: GPL-2.0-or-later */ #include "testing/testing.h" +#include "BKE_idtype.hh" +#include "BKE_lattice.hh" + +#include "MEM_guardedalloc.h" + +#include "DNA_lattice_types.h" +#include "DNA_mesh_types.h" +#include "DNA_object_types.h" + +#include "BLI_rand.hh" + #define DO_PERF_TESTS 0 #if DO_PERF_TESTS - -# include "BKE_idtype.hh" -# include "BKE_lattice.hh" - -# include "MEM_guardedalloc.h" - -# include "DNA_lattice_types.h" -# include "DNA_mesh_types.h" -# include "DNA_object_types.h" - -# include "BLI_rand.hh" - namespace blender::bke::tests { struct LatticeDeformTestContext { diff --git a/source/blender/blenkernel/intern/layer.cc b/source/blender/blenkernel/intern/layer.cc index b6462122836..d024b9d9f9d 100644 --- a/source/blender/blenkernel/intern/layer.cc +++ b/source/blender/blenkernel/intern/layer.cc @@ -19,10 +19,10 @@ #include "BLI_string_utf8.h" #include "BLI_string_utils.hh" #include "BLI_threads.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_animsys.h" -#include "BKE_collection.hh" +#include "BKE_collection.h" #include "BKE_freestyle.h" #include "BKE_idprop.h" #include "BKE_layer.hh" @@ -1470,14 +1470,14 @@ void BKE_main_collection_sync_remap(const Main *bmain) view_layer_bases_hash_create(view_layer, true); } - DEG_id_tag_update_ex((Main *)bmain, &scene->master_collection->id, ID_RECALC_SYNC_TO_EVAL); - DEG_id_tag_update_ex((Main *)bmain, &scene->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update_ex((Main *)bmain, &scene->master_collection->id, ID_RECALC_COPY_ON_WRITE); + DEG_id_tag_update_ex((Main *)bmain, &scene->id, ID_RECALC_COPY_ON_WRITE); } for (Collection *collection = static_cast(bmain->collections.first); collection; collection = static_cast(collection->id.next)) { - DEG_id_tag_update_ex((Main *)bmain, &collection->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update_ex((Main *)bmain, &collection->id, ID_RECALC_COPY_ON_WRITE); } BKE_main_collection_sync(bmain); diff --git a/source/blender/blenkernel/intern/layer_utils.cc b/source/blender/blenkernel/intern/layer_utils.cc index 7d5f071094e..441dfdf71b7 100644 --- a/source/blender/blenkernel/intern/layer_utils.cc +++ b/source/blender/blenkernel/intern/layer_utils.cc @@ -8,7 +8,9 @@ #include -#include "BKE_collection.hh" +#include "BLI_array.h" + +#include "BKE_collection.h" #include "BKE_customdata.hh" #include "BKE_editmesh.hh" #include "BKE_layer.hh" @@ -17,6 +19,7 @@ #include "DNA_layer_types.h" #include "DNA_mesh_types.h" #include "DNA_object_types.h" +#include "DNA_scene_types.h" #include "MEM_guardedalloc.h" diff --git a/source/blender/blenkernel/intern/lib_id.cc b/source/blender/blenkernel/intern/lib_id.cc index 6964f1d85a3..5c7d6261c53 100644 --- a/source/blender/blenkernel/intern/lib_id.cc +++ b/source/blender/blenkernel/intern/lib_id.cc @@ -38,14 +38,14 @@ #include "BLI_memarena.h" #include "BLI_string_utils.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" -#include "BKE_anim_data.hh" +#include "BKE_anim_data.h" #include "BKE_armature.hh" #include "BKE_asset.hh" -#include "BKE_bpath.hh" +#include "BKE_bpath.h" #include "BKE_context.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_gpencil_legacy.h" #include "BKE_idprop.h" #include "BKE_idtype.hh" @@ -56,7 +56,7 @@ #include "BKE_lib_remap.hh" #include "BKE_main.hh" #include "BKE_main_namemap.hh" -#include "BKE_node.hh" +#include "BKE_node.h" #include "BKE_rigidbody.h" #include "DEG_depsgraph.hh" @@ -77,16 +77,11 @@ # include "BLI_time_utildefines.h" #endif -using blender::Vector; - -using namespace blender::bke::id; - static CLG_LogRef LOG = {"bke.lib_id"}; IDTypeInfo IDType_ID_LINK_PLACEHOLDER = { /*id_code*/ ID_LINK_PLACEHOLDER, /*id_filter*/ 0, - /*dependencies_id_types*/ 0, /*main_listbase_index*/ INDEX_ID_NULL, /*struct_size*/ sizeof(ID), /*name*/ "LinkPlaceholder", @@ -180,10 +175,9 @@ static int lib_id_clear_library_data_users_update_cb(LibraryIDLinkCallbackData * ID *id = static_cast(cb_data->user_data); if (*cb_data->id_pointer == id) { /* Even though the ID itself remain the same after being made local, from depsgraph point of - * view this is a different ID. Hence we need to tag all of its users for a copy-on-eval - * update. */ + * view this is a different ID. Hence we need to tag all of its users for COW update. */ DEG_id_tag_update_ex( - cb_data->bmain, cb_data->owner_id, ID_RECALC_TAG_FOR_UNDO | ID_RECALC_SYNC_TO_EVAL); + cb_data->bmain, cb_data->owner_id, ID_RECALC_TAG_FOR_UNDO | ID_RECALC_COPY_ON_WRITE); return IDWALK_RET_STOP_ITER; } return IDWALK_RET_NOP; @@ -230,7 +224,7 @@ void BKE_lib_id_clear_library_data(Main *bmain, ID *id, const int flags) /* We need to tag this IDs and all of its users, conceptually new local ID and original linked * ones are two completely different data-blocks that were virtually remapped, even though in * reality they remain the same data. For undo this info is critical now. */ - DEG_id_tag_update_ex(bmain, id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update_ex(bmain, id, ID_RECALC_COPY_ON_WRITE); ID *id_iter; FOREACH_MAIN_ID_BEGIN (bmain, id_iter) { BKE_library_foreach_ID_link( @@ -626,28 +620,19 @@ bool BKE_id_copy_is_allowed(const ID *id) #undef LIB_ID_TYPES_NOCOPY } -ID *BKE_id_copy_in_lib(Main *bmain, - std::optional owner_library, - const ID *id, - ID **r_newid, - const int flag) +ID *BKE_id_copy_ex(Main *bmain, const ID *id, ID **r_newid, const int flag) { ID *newid = (r_newid != nullptr) ? *r_newid : nullptr; - BLI_assert_msg(newid || (flag & LIB_ID_CREATE_NO_ALLOCATE) == 0, - "Copying with 'no allocate' behavior should always get a non-null new ID buffer"); - /* Make sure destination pointer is all good. */ if ((flag & LIB_ID_CREATE_NO_ALLOCATE) == 0) { newid = nullptr; } else { - if (!newid) { - /* Invalid case, already caught by the assert above. */ - return nullptr; + if (newid != nullptr) { + /* Allow some garbage non-initialized memory to go in, and clean it up here. */ + const size_t size = BKE_libblock_get_alloc_info(GS(id->name), nullptr); + memset(newid, 0, size); } - /* Allow some garbage non-initialized memory to go in, and clean it up here. */ - const size_t size = BKE_libblock_get_alloc_info(GS(id->name), nullptr); - memset(newid, 0, size); } /* Early output if source is nullptr. */ @@ -662,21 +647,16 @@ ID *BKE_id_copy_in_lib(Main *bmain, return nullptr; } - BKE_libblock_copy_in_lib(bmain, owner_library, id, &newid, flag); + BKE_libblock_copy_ex(bmain, id, &newid, flag); if (idtype_info->copy_data != nullptr) { - idtype_info->copy_data(bmain, owner_library, newid, id, flag); + idtype_info->copy_data(bmain, newid, id, flag); } } else { BLI_assert_msg(0, "IDType Missing IDTypeInfo"); } - BLI_assert_msg(newid, "Could not get an allocated new ID to copy into"); - if (!newid) { - return nullptr; - } - /* Update ID refcount, remap pointers to self in new ID. */ IDCopyLibManagementData data{}; data.id_src = id; @@ -685,22 +665,13 @@ ID *BKE_id_copy_in_lib(Main *bmain, BKE_library_foreach_ID_link(bmain, newid, id_copy_libmanagement_cb, &data, IDWALK_NOP); /* Do not make new copy local in case we are copying outside of main... - * XXX TODO: is this behavior OK, or should we need a separate flag to control that? */ + * XXX TODO: is this behavior OK, or should we need own flag to control that? */ if ((flag & LIB_ID_CREATE_NO_MAIN) == 0) { - BLI_assert(!owner_library || newid->lib == *owner_library); - if (!ID_IS_LINKED(newid)) { - lib_id_copy_ensure_local(bmain, id, newid, 0); - } + BLI_assert((flag & LIB_ID_COPY_KEEP_LIB) == 0); + lib_id_copy_ensure_local(bmain, id, newid, 0); } else { - /* NOTE: Do not call `ensure_local` for IDs copied outside of Main, even if they do become - * local. - * - * Most of the time, this would not be the desired behavior currently. - * - * In the few cases where this is actually needed (e.g. from liboverride resync code, see - * #lib_override_library_create_from), calling code is responsible for this. */ - newid->lib = owner_library ? *owner_library : id->lib; + newid->lib = id->lib; } if (r_newid != nullptr) { @@ -710,14 +681,9 @@ ID *BKE_id_copy_in_lib(Main *bmain, return newid; } -ID *BKE_id_copy_ex(Main *bmain, const ID *id, ID **r_newid, const int flag) -{ - return BKE_id_copy_in_lib(bmain, std::nullopt, id, r_newid, flag); -} - ID *BKE_id_copy(Main *bmain, const ID *id) { - return BKE_id_copy_in_lib(bmain, std::nullopt, id, nullptr, LIB_ID_COPY_DEFAULT); + return BKE_id_copy_ex(bmain, id, nullptr, LIB_ID_COPY_DEFAULT); } ID *BKE_id_copy_for_duplicate(Main *bmain, @@ -837,10 +803,10 @@ static void id_swap(Main *bmain, IDRemapper *remapper_id_b = input_remapper_id_b; if (do_self_remap) { if (remapper_id_a == nullptr) { - remapper_id_a = MEM_new(__func__); + remapper_id_a = BKE_id_remapper_create(); } if (remapper_id_b == nullptr) { - remapper_id_b = MEM_new(__func__); + remapper_id_b = BKE_id_remapper_create(); } } @@ -886,25 +852,25 @@ static void id_swap(Main *bmain, } if (remapper_id_a != nullptr) { - remapper_id_a->add(id_b, id_a); + BKE_id_remapper_add(remapper_id_a, id_b, id_a); } if (remapper_id_b != nullptr) { - remapper_id_b->add(id_a, id_b); + BKE_id_remapper_add(remapper_id_b, id_a, id_b); } /* Finalize remapping of internal references to self broken by swapping, if requested. */ if (do_self_remap) { BKE_libblock_relink_multiple( - bmain, {id_a}, ID_REMAP_TYPE_REMAP, *remapper_id_a, self_remap_flags); + bmain, {id_a}, ID_REMAP_TYPE_REMAP, remapper_id_a, self_remap_flags); BKE_libblock_relink_multiple( - bmain, {id_b}, ID_REMAP_TYPE_REMAP, *remapper_id_b, self_remap_flags); + bmain, {id_b}, ID_REMAP_TYPE_REMAP, remapper_id_b, self_remap_flags); } if (input_remapper_id_a == nullptr && remapper_id_a != nullptr) { - MEM_delete(remapper_id_a); + BKE_id_remapper_free(remapper_id_a); } if (input_remapper_id_b == nullptr && remapper_id_b != nullptr) { - MEM_delete(remapper_id_b); + BKE_id_remapper_free(remapper_id_b); } } @@ -942,10 +908,10 @@ static void id_embedded_swap(ID **embedded_id_a, /* Restore internal pointers to the swapped embedded IDs in their owners' data. This also * includes the potential self-references inside the embedded IDs themselves. */ if (remapper_id_a != nullptr) { - remapper_id_a->add(*embedded_id_b, *embedded_id_a); + BKE_id_remapper_add(remapper_id_a, *embedded_id_b, *embedded_id_a); } if (remapper_id_b != nullptr) { - remapper_id_b->add(*embedded_id_a, *embedded_id_b); + BKE_id_remapper_add(remapper_id_b, *embedded_id_a, *embedded_id_b); } } } @@ -1248,11 +1214,7 @@ void *BKE_libblock_alloc_notest(short type) return nullptr; } -void *BKE_libblock_alloc_in_lib(Main *bmain, - std::optional owner_library, - short type, - const char *name, - const int flag) +void *BKE_libblock_alloc(Main *bmain, short type, const char *name, const int flag) { BLI_assert((flag & LIB_ID_CREATE_NO_ALLOCATE) == 0); BLI_assert((flag & LIB_ID_CREATE_NO_MAIN) != 0 || bmain != nullptr); @@ -1282,44 +1244,20 @@ void *BKE_libblock_alloc_in_lib(Main *bmain, BLI_assert(bmain->is_locked_for_linking == false || ELEM(type, ID_WS, ID_GR, ID_NT)); ListBase *lb = which_libbase(bmain, type); - /* This is important in 'readfile doversion after liblink' context mainly, but is a good - * behavior for consistency in general: ID created for a Main should get that main's current - * library pointer. - * - * NOTE: A bit convoluted. - * - When Main has a defined `curlib`, it is assumed to be a split main containing only IDs - * from that library. In that case, the library can be set later, and it avoids - * synchronization issues in the namemap between the one of that temp 'library' Main and - * the library ID runtime namemap itself. In a way, the ID can be assumed local to the - * current Main, for its assignment to this Main. - * - In all other cases, the Main is assumed 'complete', i.e. containing all local and - * linked IDs, In that case, it is critical that the ID gets the correct library assigned - * now, to ensure that the call to #BKE_id_new_name_validate gives a fully valid result - * once it has been assigned to the current Main. - */ - if (bmain->curlib) { - id->lib = nullptr; - } - else { - id->lib = owner_library ? *owner_library : nullptr; - } - BKE_main_lock(bmain); BLI_addtail(lb, id); - BKE_id_new_name_validate(bmain, lb, id, name, true); + BKE_id_new_name_validate(bmain, lb, id, name, false); bmain->is_memfile_undo_written = false; /* alphabetic insertion: is in new_id */ BKE_main_unlock(bmain); - /* Split Main case, now the ID should get the Main's #curlib. */ - if (bmain->curlib) { - BLI_assert(!owner_library || *owner_library == bmain->curlib); - id->lib = bmain->curlib; - } - /* This assert avoids having to keep name_map consistency when changing the library of an ID, * if this check is not true anymore it will have to be done here too. */ BLI_assert(bmain->curlib == nullptr || bmain->curlib->runtime.name_map == nullptr); + /* This is important in 'readfile doversion after liblink' context mainly, but is a good + * consistency change in general: ID created for a Main should get that main's current + * library pointer. */ + id->lib = bmain->curlib; /* TODO: to be removed from here! */ if ((flag & LIB_ID_CREATE_NO_DEG_TAG) == 0) { @@ -1328,12 +1266,11 @@ void *BKE_libblock_alloc_in_lib(Main *bmain, } else { BLI_strncpy(id->name + 2, name, sizeof(id->name) - 2); - id->lib = owner_library ? *owner_library : nullptr; } /* We also need to ensure a valid `session_uid` for some non-main data (like embedded IDs). * IDs not allocated however should not need those (this would e.g. avoid generating session - * uids for depsgraph evaluated IDs, if it was using this function). */ + * uids for depsgraph CoW IDs, if it was using this function). */ if ((flag & LIB_ID_CREATE_NO_ALLOCATE) == 0) { BKE_lib_libblock_session_uid_ensure(id); } @@ -1342,11 +1279,6 @@ void *BKE_libblock_alloc_in_lib(Main *bmain, return id; } -void *BKE_libblock_alloc(Main *bmain, short type, const char *name, const int flag) -{ - return BKE_libblock_alloc_in_lib(bmain, std::nullopt, type, name, flag); -} - void BKE_libblock_init_empty(ID *id) { const IDTypeInfo *idtype_info = BKE_idtype_get_info_from_id(id); @@ -1391,11 +1323,7 @@ void BKE_lib_libblock_session_uid_renew(ID *id) BKE_lib_libblock_session_uid_ensure(id); } -void *BKE_id_new_in_lib(Main *bmain, - std::optional owner_library, - const short type, - const char *name) - +void *BKE_id_new(Main *bmain, const short type, const char *name) { BLI_assert(bmain != nullptr); @@ -1403,17 +1331,12 @@ void *BKE_id_new_in_lib(Main *bmain, name = DATA_(BKE_idtype_idcode_to_name(type)); } - ID *id = static_cast(BKE_libblock_alloc_in_lib(bmain, owner_library, type, name, 0)); + ID *id = static_cast(BKE_libblock_alloc(bmain, type, name, 0)); BKE_libblock_init_empty(id); return id; } -void *BKE_id_new(Main *bmain, const short type, const char *name) -{ - return BKE_id_new_in_lib(bmain, std::nullopt, type, name); -} - void *BKE_id_new_nomain(const short type, const char *name) { if (name == nullptr) { @@ -1430,11 +1353,7 @@ void *BKE_id_new_nomain(const short type, const char *name) return id; } -void BKE_libblock_copy_in_lib(Main *bmain, - std::optional owner_library, - const ID *id, - ID **r_newid, - const int orig_flag) +void BKE_libblock_copy_ex(Main *bmain, const ID *id, ID **r_newid, const int orig_flag) { ID *new_id = *r_newid; int flag = orig_flag; @@ -1463,20 +1382,18 @@ void BKE_libblock_copy_in_lib(Main *bmain, STRNCPY(new_id->name, id->name); new_id->us = 0; new_id->tag |= LIB_TAG_NOT_ALLOCATED | LIB_TAG_NO_MAIN | LIB_TAG_NO_USER_REFCOUNT; - new_id->lib = owner_library ? *owner_library : id->lib; /* TODO: Do we want/need to copy more from ID struct itself? */ } else { - new_id = static_cast( - BKE_libblock_alloc_in_lib(bmain, owner_library, GS(id->name), id->name + 2, flag)); + new_id = static_cast(BKE_libblock_alloc(bmain, GS(id->name), id->name + 2, flag)); } BLI_assert(new_id != nullptr); if ((flag & LIB_ID_COPY_SET_COPIED_ON_WRITE) != 0) { - new_id->tag |= LIB_TAG_COPIED_ON_EVAL; + new_id->tag |= LIB_TAG_COPIED_ON_WRITE; } else { - new_id->tag &= ~LIB_TAG_COPIED_ON_EVAL; + new_id->tag &= ~LIB_TAG_COPIED_ON_WRITE; } const size_t id_len = BKE_libblock_get_alloc_info(GS(new_id->name), nullptr); @@ -1528,7 +1445,7 @@ void BKE_libblock_copy_in_lib(Main *bmain, * in their anim data *are* in bmain... super-mega-hooray. */ BLI_assert((copy_data_flag & LIB_ID_COPY_ACTIONS) == 0 || (copy_data_flag & LIB_ID_CREATE_NO_MAIN) == 0); - iat->adt = BKE_animdata_copy_in_lib(bmain, owner_library, iat->adt, copy_data_flag); + iat->adt = BKE_animdata_copy(bmain, iat->adt, copy_data_flag); } else { iat->adt = nullptr; @@ -1542,16 +1459,11 @@ void BKE_libblock_copy_in_lib(Main *bmain, *r_newid = new_id; } -void BKE_libblock_copy_ex(Main *bmain, const ID *id, ID **r_newid, const int orig_flag) -{ - BKE_libblock_copy_in_lib(bmain, std::nullopt, id, r_newid, orig_flag); -} - void *BKE_libblock_copy(Main *bmain, const ID *id) { ID *idn; - BKE_libblock_copy_in_lib(bmain, std::nullopt, id, &idn, 0); + BKE_libblock_copy_ex(bmain, id, &idn, 0); return idn; } @@ -2249,40 +2161,43 @@ static int *id_order_get(ID *id) } } -static bool id_order_compare(ID *a, ID *b) +static int id_order_compare(const void *a, const void *b) { - int *order_a = id_order_get(a); - int *order_b = id_order_get(b); + ID *id_a = static_cast(((LinkData *)a)->data); + ID *id_b = static_cast(((LinkData *)b)->data); + + int *order_a = id_order_get(id_a); + int *order_b = id_order_get(id_b); if (order_a && order_b) { if (*order_a < *order_b) { - return true; + return -1; } if (*order_a > *order_b) { - return false; + return 1; } } - return strcmp(a->name, b->name) <= 0; + return strcmp(id_a->name, id_b->name); } -Vector BKE_id_ordered_list(const ListBase *lb) +void BKE_id_ordered_list(ListBase *ordered_lb, const ListBase *lb) { - Vector ordered; + BLI_listbase_clear(ordered_lb); LISTBASE_FOREACH (ID *, id, lb) { - ordered.append(id); + BLI_addtail(ordered_lb, BLI_genericNodeN(id)); } - std::sort(ordered.begin(), ordered.end(), id_order_compare); + BLI_listbase_sort(ordered_lb, id_order_compare); - for (const int i : ordered.index_range()) { - if (int *order = id_order_get(ordered[i])) { - *order = i; + int num = 0; + LISTBASE_FOREACH (LinkData *, link, ordered_lb) { + int *order = id_order_get(static_cast(link->data)); + if (order) { + *order = num++; } } - - return ordered; } void BKE_id_reorder(const ListBase *lb, ID *id, ID *relative, bool after) diff --git a/source/blender/blenkernel/intern/lib_id_delete.cc b/source/blender/blenkernel/intern/lib_id_delete.cc index 70493f41bbf..0b0d439f71c 100644 --- a/source/blender/blenkernel/intern/lib_id_delete.cc +++ b/source/blender/blenkernel/intern/lib_id_delete.cc @@ -8,6 +8,8 @@ * Contains management of ID's for freeing & deletion. */ +#include "CLG_log.h" + #include "MEM_guardedalloc.h" /* all types are needed here, in order to do memory operations */ @@ -16,11 +18,11 @@ #include "BLI_utildefines.h" +#include "BLI_linklist.h" #include "BLI_listbase.h" -#include "BLI_set.hh" #include "BLI_vector.hh" -#include "BKE_anim_data.hh" +#include "BKE_anim_data.h" #include "BKE_asset.hh" #include "BKE_idprop.h" #include "BKE_idtype.hh" @@ -41,7 +43,7 @@ # include "BPY_extern.h" #endif -using namespace blender::bke::id; +static CLG_LogRef LOG = {"bke.lib_id_delete"}; void BKE_libblock_free_data(ID *id, const bool do_id_user) { @@ -145,9 +147,10 @@ static int id_free(Main *bmain, void *idv, int flag, const bool use_flag_from_id } if (remap_editor_id_reference_cb) { - IDRemapper remapper; - remapper.add(id, nullptr); + IDRemapper *remapper = BKE_id_remapper_create(); + BKE_id_remapper_add(remapper, id, nullptr); remap_editor_id_reference_cb(remapper); + BKE_id_remapper_free(remapper); } } @@ -213,7 +216,7 @@ void BKE_id_free_us(Main *bmain, void *idv) /* test users */ if (id->us == 0) { const bool is_lib = GS(id->name) == ID_LI; - BKE_libblock_unlink(bmain, id, false); + BKE_libblock_unlink(bmain, id, false, false); BKE_id_free(bmain, id); @@ -224,117 +227,196 @@ void BKE_id_free_us(Main *bmain, void *idv) /* test users */ } static size_t id_delete(Main *bmain, - blender::Set &ids_to_delete, + const bool do_tagged_deletion, const int extra_remapping_flags) { + const int tag = LIB_TAG_DOIT; + ListBase *lbarray[INDEX_ID_MAX]; + int base_count, i; bool has_deleted_library = false; /* Used by batch tagged deletion, when we call BKE_id_free then, id is no more in Main database, * and has already properly unlinked its other IDs usages. * UI users are always cleared in BKE_libblock_remap_locked() call, so we can always skip it. */ - const int free_flag = LIB_ID_FREE_NO_UI_USER | LIB_ID_FREE_NO_MAIN | - LIB_ID_FREE_NO_USER_REFCOUNT; - const int remapping_flags = (ID_REMAP_STORE_NEVER_NULL_USAGE | ID_REMAP_FORCE_NEVER_NULL_USAGE | + const int free_flag = LIB_ID_FREE_NO_UI_USER | + (do_tagged_deletion ? LIB_ID_FREE_NO_MAIN | LIB_ID_FREE_NO_USER_REFCOUNT : + 0); + const int remapping_flags = (ID_REMAP_FLAG_NEVER_NULL_USAGE | ID_REMAP_FORCE_NEVER_NULL_USAGE | ID_REMAP_FORCE_INTERNAL_RUNTIME_POINTERS | extra_remapping_flags); + ListBase tagged_deleted_ids = {nullptr}; - ListBase *lbarray[INDEX_ID_MAX]; - const int base_count = set_listbasepointers(bmain, lbarray); + base_count = set_listbasepointers(bmain, lbarray); BKE_main_lock(bmain); - BKE_layer_collection_resync_forbid(); - IDRemapper id_remapper; + if (do_tagged_deletion) { + IDRemapper *id_remapper = BKE_id_remapper_create(); + BKE_layer_collection_resync_forbid(); - /* Main idea of batch deletion is to remove all IDs to be deleted from Main database. - * This means that we won't have to loop over all deleted IDs to remove usages - * of other deleted IDs. - * This gives tremendous speed-up when deleting a large amount of IDs from a Main - * containing thousands of these. - * This also means that we have to be very careful here, as we by-pass many 'common' - * processing, hence risking to 'corrupt' at least user counts, if not IDs themselves. */ - bool keep_looping = true; - while (keep_looping) { - keep_looping = false; + /* Main idea of batch deletion is to remove all IDs to be deleted from Main database. + * This means that we won't have to loop over all deleted IDs to remove usages + * of other deleted IDs. + * This gives tremendous speed-up when deleting a large amount of IDs from a Main + * containing thousands of those. + * This also means that we have to be very careful here, as we by-pass many 'common' + * processing, hence risking to 'corrupt' at least user counts, if not IDs themselves. */ + bool keep_looping = true; + while (keep_looping) { + ID *id, *id_next; + keep_looping = false; - /* First tag and remove from Main all datablocks directly from target lib. - * Note that we go forward here, since we want to check dependencies before users - * (e.g. meshes before objects). Reduces the chances to have to loop many times in the - * `while (keep_looking)` outer loop. */ - for (int i = 0; i < base_count; i++) { - ListBase *lb = lbarray[i]; - ID *id_iter; + /* First tag and remove from Main all datablocks directly from target lib. + * Note that we go forward here, since we want to check dependencies before users + * (e.g. meshes before objects). Avoids to have to loop twice. */ + for (i = 0; i < base_count; i++) { + ListBase *lb = lbarray[i]; - FOREACH_MAIN_LISTBASE_ID_BEGIN (lb, id_iter) { - /* NOTE: in case we delete a library, we also delete all its datablocks! */ - if (ids_to_delete.contains(id_iter) || - (ID_IS_LINKED(id_iter) && ids_to_delete.contains(&id_iter->lib->id))) - { - BLI_remlink(lb, id_iter); - BKE_main_namemap_remove_name(bmain, id_iter, id_iter->name + 2); - ids_to_delete.add(id_iter); - id_remapper.add(id_iter, nullptr); - /* Do not tag as no_main now, we want to unlink it first (lower-level ID management - * code has some specific handling of 'no main' IDs that would be a problem in that - * case). */ + for (id = static_cast(lb->first); id; id = id_next) { + id_next = static_cast(id->next); + /* NOTE: in case we delete a library, we also delete all its datablocks! */ + if ((id->tag & tag) || (ID_IS_LINKED(id) && (id->lib->id.tag & tag))) { + BLI_remlink(lb, id); + BKE_main_namemap_remove_name(bmain, id, id->name + 2); + BLI_addtail(&tagged_deleted_ids, id); + BKE_id_remapper_add(id_remapper, id, nullptr); + /* Do not tag as no_main now, we want to unlink it first (lower-level ID management + * code has some specific handling of 'no main' IDs that would be a problem in that + * case). */ + id->tag |= tag; - /* Forcefully also delete shapekeys of the deleted ID if any, 'orphaned' shapekeys are - * not allowed in Blender and will cause lots of problem in modern code (liboverrides, - * warning on write & read, etc.). */ - Key *shape_key = BKE_key_from_id(id_iter); - if (shape_key && !ids_to_delete.contains(&shape_key->id)) { - BLI_remlink(&bmain->shapekeys, &shape_key->id); - BKE_main_namemap_remove_name(bmain, &shape_key->id, shape_key->id.name + 2); - ids_to_delete.add(&shape_key->id); - id_remapper.add(&shape_key->id, nullptr); + /* Forcefully also delete shapekeys of the deleted ID if any, 'orphaned' shapekeys are + * not allowed in Blender and will cause lots of problem in modern code (liboverrides, + * warning on write & read, etc.). */ + Key *shape_key = BKE_key_from_id(id); + if (shape_key && (shape_key->id.tag & tag) == 0) { + BLI_remlink(&bmain->shapekeys, &shape_key->id); + BKE_main_namemap_remove_name(bmain, &shape_key->id, shape_key->id.name + 2); + BLI_addtail(&tagged_deleted_ids, &shape_key->id); + BKE_id_remapper_add(id_remapper, &shape_key->id, nullptr); + shape_key->id.tag |= tag; + } + + keep_looping = true; } - - keep_looping = true; } } - FOREACH_MAIN_LISTBASE_ID_END; + + /* Will tag 'never nullptr' users of this ID too. + * + * NOTE: #BKE_libblock_unlink() cannot be used here, since it would ignore indirect + * links, this can lead to nasty crashing here in second, actual deleting loop. + * Also, this will also flag users of deleted data that cannot be unlinked + * (object using deleted obdata, etc.), so that they also get deleted. */ + BKE_libblock_remap_multiple_locked(bmain, id_remapper, remapping_flags); + BKE_id_remapper_clear(id_remapper); } - /* Will tag 'never nullptr' users of this ID too. - * - * NOTE: #BKE_libblock_unlink() cannot be used here, since it would ignore indirect - * links, this can lead to nasty crashing here in second, actual deleting loop. - * Also, this will also flag users of deleted data that cannot be unlinked - * (object using deleted obdata, etc.), so that they also get deleted. */ - BKE_libblock_remap_multiple_locked(bmain, id_remapper, remapping_flags); - for (ID *id_never_null_iter : id_remapper.never_null_users()) { - ids_to_delete.add(id_never_null_iter); + /* Since we removed IDs from Main, their own other IDs usages need to be removed 'manually'. */ + blender::Vector cleanup_ids; + for (ID *id = static_cast(tagged_deleted_ids.first); id; + id = static_cast(id->next)) + { + cleanup_ids.append(id); + } + BKE_libblock_relink_multiple(bmain, + cleanup_ids, + ID_REMAP_TYPE_CLEANUP, + id_remapper, + ID_REMAP_FORCE_INTERNAL_RUNTIME_POINTERS | + ID_REMAP_SKIP_USER_CLEAR); + cleanup_ids.clear(); + BKE_id_remapper_free(id_remapper); + + BKE_layer_collection_resync_allow(); + BKE_main_collection_sync_remap(bmain); + + /* 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 user-counts of + * deleted IDs may not be properly decreased by the remappings (since `NO_MAIN` ID user-counts + * is never affected). */ + for (ID *id = static_cast(tagged_deleted_ids.first); id; + id = static_cast(id->next)) + { + id->tag |= LIB_TAG_NO_MAIN; + /* User-count needs to be reset artificially, since some usages may not be cleared in batch + * deletion (typically, if one deleted ID uses another deleted ID, this may not be cleared by + * remapping code, depending on order in which these are handled). */ + id->us = ID_FAKE_USERS(id); } - id_remapper.clear(); } + else { + /* First tag all data-blocks directly from target lib. + * Note that we go forward here, since we want to check dependencies before users + * (e.g. meshes before objects). + * Avoids to have to loop twice. */ + IDRemapper *remapper = BKE_id_remapper_create(); + for (i = 0; i < base_count; i++) { + ListBase *lb = lbarray[i]; + ID *id, *id_next; + BKE_id_remapper_clear(remapper); - /* Since we removed IDs from Main, their own other IDs usages need to be removed 'manually'. */ - blender::Vector cleanup_ids{ids_to_delete.begin(), ids_to_delete.end()}; - BKE_libblock_relink_multiple( - bmain, - cleanup_ids, - ID_REMAP_TYPE_CLEANUP, - id_remapper, - (ID_REMAP_FORCE_INTERNAL_RUNTIME_POINTERS | ID_REMAP_SKIP_USER_CLEAR)); - cleanup_ids.clear(); + for (id = static_cast(lb->first); id; id = id_next) { + id_next = static_cast(id->next); + /* NOTE: in case we delete a library, we also delete all its datablocks! */ + if ((id->tag & tag) || (ID_IS_LINKED(id) && (id->lib->id.tag & tag))) { + id->tag |= tag; + BKE_id_remapper_add(remapper, id, nullptr); + } + } - /* 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 user-counts of - * deleted IDs may not be properly decreased by the remappings (since `NO_MAIN` ID user-counts - * is never affected). */ - for (ID *id : ids_to_delete) { - id->tag |= LIB_TAG_NO_MAIN; - /* User-count needs to be reset artificially, since some usages may not be cleared in batch - * deletion (typically, if one deleted ID uses another deleted ID, this may not be cleared by - * remapping code, depending on order in which these are handled). */ - id->us = ID_FAKE_USERS(id); + if (BKE_id_remapper_is_empty(remapper)) { + continue; + } - if (!has_deleted_library && GS(id->name) == ID_LI) { - has_deleted_library = true; + /* Will tag 'never nullptr' users of this ID too. + * + * NOTE: #BKE_libblock_unlink() cannot be used here, since it would ignore indirect + * links, this can lead to nasty crashing here in second, actual deleting loop. + * Also, this will also flag users of deleted data that cannot be unlinked + * (object using deleted obdata, etc.), so that they also get deleted. */ + BKE_libblock_remap_multiple_locked(bmain, remapper, remapping_flags); } - - id_free(bmain, id, free_flag, false); + BKE_id_remapper_free(remapper); } BKE_main_unlock(bmain); + + /* ViewLayer resync needs to be delayed during Scene freeing, since internal relationships + * between the Scene's master collection and its view_layers become invalid + * (due to remapping). */ + BKE_layer_collection_resync_forbid(); + + /* In usual reversed order, such that all usage of a given ID, even 'never nullptr' ones, + * have been already cleared when we reach it + * (e.g. Objects being processed before meshes, they'll have already released their 'reference' + * over meshes when we come to freeing obdata). */ + size_t num_datablocks_deleted = 0; + for (i = do_tagged_deletion ? 1 : base_count; i--;) { + ListBase *lb = lbarray[i]; + ID *id, *id_next; + + for (id = static_cast(do_tagged_deletion ? tagged_deleted_ids.first : lb->first); id; + id = id_next) + { + id_next = static_cast(id->next); + if (id->tag & tag) { + if (((id->tag & LIB_TAG_EXTRAUSER_SET) == 0 && ID_REAL_USERS(id) != 0) || + ((id->tag & LIB_TAG_EXTRAUSER_SET) != 0 && ID_REAL_USERS(id) != 1)) + { + CLOG_ERROR(&LOG, + "Deleting %s which still has %d users (including %d 'extra' shallow users)\n", + id->name, + ID_REAL_USERS(id), + (id->tag & LIB_TAG_EXTRAUSER_SET) != 0 ? 1 : 0); + } + if (!has_deleted_library && GS(id->name) == ID_LI) { + has_deleted_library = true; + } + id_free(bmain, id, free_flag, !do_tagged_deletion); + ++num_datablocks_deleted; + } + } + } + BKE_layer_collection_resync_allow(); BKE_main_collection_sync_remap(bmain); @@ -343,16 +425,18 @@ static size_t id_delete(Main *bmain, } bmain->is_memfile_undo_written = false; - return size_t(ids_to_delete.size()); + return num_datablocks_deleted; } void BKE_id_delete_ex(Main *bmain, void *idv, const int extra_remapping_flags) { - ID *id = static_cast(idv); - BLI_assert_msg((id->tag & LIB_TAG_NO_MAIN) == 0, "Cannot be used with IDs outside of Main"); + BLI_assert_msg((((ID *)idv)->tag & LIB_TAG_NO_MAIN) == 0, + "Cannot be used with IDs outside of Main"); - blender::Set ids_to_delete = {id}; - id_delete(bmain, ids_to_delete, extra_remapping_flags); + BKE_main_id_tag_all(bmain, LIB_TAG_DOIT, false); + ((ID *)idv)->tag |= LIB_TAG_DOIT; + + id_delete(bmain, false, extra_remapping_flags); } void BKE_id_delete(Main *bmain, void *idv) @@ -362,20 +446,7 @@ void BKE_id_delete(Main *bmain, void *idv) size_t BKE_id_multi_tagged_delete(Main *bmain) { - blender::Set ids_to_delete; - ID *id_iter; - FOREACH_MAIN_ID_BEGIN (bmain, id_iter) { - if (id_iter->tag & LIB_TAG_DOIT) { - ids_to_delete.add(id_iter); - } - } - FOREACH_MAIN_ID_END; - return id_delete(bmain, ids_to_delete, 0); -} - -size_t BKE_id_multi_delete(Main *bmain, blender::Set &ids_to_delete) -{ - return id_delete(bmain, ids_to_delete, 0); + return id_delete(bmain, true, 0); } /* -------------------------------------------------------------------- */ diff --git a/source/blender/blenkernel/intern/lib_id_eval.cc b/source/blender/blenkernel/intern/lib_id_eval.cc index ef4ad16ce38..8dd603c7201 100644 --- a/source/blender/blenkernel/intern/lib_id_eval.cc +++ b/source/blender/blenkernel/intern/lib_id_eval.cc @@ -20,7 +20,7 @@ void BKE_id_eval_properties_copy(ID *id_cow, ID *id) { const ID_Type id_type = GS(id->name); - BLI_assert((id_cow->tag & LIB_TAG_COPIED_ON_EVAL) && !(id->tag & LIB_TAG_COPIED_ON_EVAL)); + BLI_assert((id_cow->tag & LIB_TAG_COPIED_ON_WRITE) && !(id->tag & LIB_TAG_COPIED_ON_WRITE)); BLI_assert(ID_TYPE_SUPPORTS_PARAMS_WITHOUT_COW(id_type)); if (id_type == ID_ME) { BKE_mesh_copy_parameters((Mesh *)id_cow, (const Mesh *)id); diff --git a/source/blender/blenkernel/intern/lib_id_remapper.cc b/source/blender/blenkernel/intern/lib_id_remapper.cc index e82f385757b..0a8135fd7c3 100644 --- a/source/blender/blenkernel/intern/lib_id_remapper.cc +++ b/source/blender/blenkernel/intern/lib_id_remapper.cc @@ -10,90 +10,215 @@ #include "MEM_guardedalloc.h" -namespace blender::bke::id { +#include "BLI_map.hh" -void IDRemapper::add(ID *old_id, ID *new_id) +using IDTypeFilter = uint64_t; + +namespace blender::bke::id::remapper { +struct IDRemapper { + private: + Map mappings; + IDTypeFilter source_types = 0; + + public: + void clear() + { + mappings.clear(); + source_types = 0; + } + + bool is_empty() const + { + return mappings.is_empty(); + } + + void add(ID *old_id, ID *new_id) + { + BLI_assert(old_id != nullptr); + BLI_assert(new_id == nullptr || (GS(old_id->name) == GS(new_id->name))); + mappings.add(old_id, new_id); + BLI_assert(BKE_idtype_idcode_to_idfilter(GS(old_id->name)) != 0); + source_types |= BKE_idtype_idcode_to_idfilter(GS(old_id->name)); + } + + void add_overwrite(ID *old_id, ID *new_id) + { + BLI_assert(old_id != nullptr); + BLI_assert(new_id == nullptr || (GS(old_id->name) == GS(new_id->name))); + mappings.add_overwrite(old_id, new_id); + BLI_assert(BKE_idtype_idcode_to_idfilter(GS(old_id->name)) != 0); + source_types |= BKE_idtype_idcode_to_idfilter(GS(old_id->name)); + } + + bool contains_mappings_for_any(IDTypeFilter filter) const + { + return (source_types & filter) != 0; + } + + IDRemapperApplyResult get_mapping_result(ID *id, + IDRemapperApplyOptions options, + const ID *id_self) const + { + if (!mappings.contains(id)) { + return ID_REMAP_RESULT_SOURCE_UNAVAILABLE; + } + const ID *new_id = mappings.lookup(id); + if ((options & ID_REMAP_APPLY_UNMAP_WHEN_REMAPPING_TO_SELF) != 0 && id_self == new_id) { + new_id = nullptr; + } + if (new_id == nullptr) { + return ID_REMAP_RESULT_SOURCE_UNASSIGNED; + } + + return ID_REMAP_RESULT_SOURCE_REMAPPED; + } + + IDRemapperApplyResult apply(ID **r_id_ptr, IDRemapperApplyOptions options, ID *id_self) const + { + BLI_assert(r_id_ptr != nullptr); + if (*r_id_ptr == nullptr) { + return ID_REMAP_RESULT_SOURCE_NOT_MAPPABLE; + } + + if (!mappings.contains(*r_id_ptr)) { + return ID_REMAP_RESULT_SOURCE_UNAVAILABLE; + } + + if (options & ID_REMAP_APPLY_UPDATE_REFCOUNT) { + id_us_min(*r_id_ptr); + } + + *r_id_ptr = mappings.lookup(*r_id_ptr); + if (options & ID_REMAP_APPLY_UNMAP_WHEN_REMAPPING_TO_SELF && *r_id_ptr == id_self) { + *r_id_ptr = nullptr; + } + if (*r_id_ptr == nullptr) { + return ID_REMAP_RESULT_SOURCE_UNASSIGNED; + } + + if (options & ID_REMAP_APPLY_UPDATE_REFCOUNT) { + /* Do not handle LIB_TAG_INDIRECT/LIB_TAG_EXTERN here. */ + id_us_plus_no_lib(*r_id_ptr); + } + + if (options & ID_REMAP_APPLY_ENSURE_REAL) { + id_us_ensure_real(*r_id_ptr); + } + return ID_REMAP_RESULT_SOURCE_REMAPPED; + } + + void iter(IDRemapperIterFunction func, void *user_data) const + { + for (auto item : mappings.items()) { + func(item.key, item.value, user_data); + } + } +}; + +} // namespace blender::bke::id::remapper + +/** \brief wrap CPP IDRemapper to a C handle. */ +static IDRemapper *wrap(blender::bke::id::remapper::IDRemapper *remapper) { - BLI_assert(old_id != nullptr); - BLI_assert(new_id == nullptr || this->allow_idtype_mismatch || - (GS(old_id->name) == GS(new_id->name))); - BLI_assert(BKE_idtype_idcode_to_idfilter(GS(old_id->name)) != 0); - - mappings_.add(old_id, new_id); - source_types_ |= BKE_idtype_idcode_to_idfilter(GS(old_id->name)); + return static_cast(static_cast(remapper)); } -void IDRemapper::add_overwrite(ID *old_id, ID *new_id) +/** \brief wrap C handle to a CPP IDRemapper. */ +static blender::bke::id::remapper::IDRemapper *unwrap(IDRemapper *remapper) { - BLI_assert(old_id != nullptr); - BLI_assert(new_id == nullptr || this->allow_idtype_mismatch || - (GS(old_id->name) == GS(new_id->name))); - BLI_assert(BKE_idtype_idcode_to_idfilter(GS(old_id->name)) != 0); - - mappings_.add_overwrite(old_id, new_id); - source_types_ |= BKE_idtype_idcode_to_idfilter(GS(old_id->name)); + return static_cast(static_cast(remapper)); } -IDRemapperApplyResult IDRemapper::get_mapping_result(ID *id, - IDRemapperApplyOptions options, - const ID *id_self) const +/** \brief wrap C handle to a CPP IDRemapper. */ +static const blender::bke::id::remapper::IDRemapper *unwrap(const IDRemapper *remapper) { - if (!mappings_.contains(id)) { - return ID_REMAP_RESULT_SOURCE_UNAVAILABLE; - } - const ID *new_id = mappings_.lookup(id); - if ((options & ID_REMAP_APPLY_UNMAP_WHEN_REMAPPING_TO_SELF) != 0 && id_self == new_id) { - new_id = nullptr; - } - if (new_id == nullptr) { - return ID_REMAP_RESULT_SOURCE_UNASSIGNED; - } - - return ID_REMAP_RESULT_SOURCE_REMAPPED; + return static_cast( + static_cast(remapper)); } -IDRemapperApplyResult IDRemapper::apply(ID **r_id_ptr, - IDRemapperApplyOptions options, - ID *id_self) const +IDRemapper *BKE_id_remapper_create() { - BLI_assert(r_id_ptr != nullptr); - BLI_assert_msg( - ((options & ID_REMAP_APPLY_UNMAP_WHEN_REMAPPING_TO_SELF) == 0 || id_self != nullptr), - "ID_REMAP_APPLY_WHEN_REMAPPING_TO_SELF requires a non-null `id_self` parameter."); - - if (*r_id_ptr == nullptr) { - return ID_REMAP_RESULT_SOURCE_NOT_MAPPABLE; - } - - ID *const *new_id = mappings_.lookup_ptr(*r_id_ptr); - if (new_id == nullptr) { - return ID_REMAP_RESULT_SOURCE_UNAVAILABLE; - } - - if (options & ID_REMAP_APPLY_UPDATE_REFCOUNT) { - id_us_min(*r_id_ptr); - } - - *r_id_ptr = *new_id; - if (options & ID_REMAP_APPLY_UNMAP_WHEN_REMAPPING_TO_SELF && *r_id_ptr == id_self) { - *r_id_ptr = nullptr; - } - if (*r_id_ptr == nullptr) { - return ID_REMAP_RESULT_SOURCE_UNASSIGNED; - } - - if (options & ID_REMAP_APPLY_UPDATE_REFCOUNT) { - /* Do not handle LIB_TAG_INDIRECT/LIB_TAG_EXTERN here. */ - id_us_plus_no_lib(*r_id_ptr); - } - - if (options & ID_REMAP_APPLY_ENSURE_REAL) { - id_us_ensure_real(*r_id_ptr); - } - return ID_REMAP_RESULT_SOURCE_REMAPPED; + blender::bke::id::remapper::IDRemapper *remapper = + MEM_new(__func__); + return wrap(remapper); } -const StringRefNull IDRemapper::result_to_string(const IDRemapperApplyResult result) +void BKE_id_remapper_free(IDRemapper *id_remapper) +{ + blender::bke::id::remapper::IDRemapper *remapper = unwrap(id_remapper); + MEM_delete(remapper); +} + +void BKE_id_remapper_clear(IDRemapper *id_remapper) +{ + blender::bke::id::remapper::IDRemapper *remapper = unwrap(id_remapper); + remapper->clear(); +} + +bool BKE_id_remapper_is_empty(const IDRemapper *id_remapper) +{ + const blender::bke::id::remapper::IDRemapper *remapper = unwrap(id_remapper); + return remapper->is_empty(); +} + +void BKE_id_remapper_add(IDRemapper *id_remapper, ID *old_id, ID *new_id) +{ + blender::bke::id::remapper::IDRemapper *remapper = unwrap(id_remapper); + remapper->add(old_id, new_id); +} + +void BKE_id_remapper_add_overwrite(IDRemapper *id_remapper, ID *old_id, ID *new_id) +{ + blender::bke::id::remapper::IDRemapper *remapper = unwrap(id_remapper); + remapper->add_overwrite(old_id, new_id); +} + +bool BKE_id_remapper_has_mapping_for(const IDRemapper *id_remapper, uint64_t type_filter) +{ + const blender::bke::id::remapper::IDRemapper *remapper = unwrap(id_remapper); + return remapper->contains_mappings_for_any(type_filter); +} + +IDRemapperApplyResult BKE_id_remapper_get_mapping_result(const IDRemapper *id_remapper, + ID *id, + IDRemapperApplyOptions options, + const ID *id_self) +{ + const blender::bke::id::remapper::IDRemapper *remapper = unwrap(id_remapper); + return remapper->get_mapping_result(id, options, id_self); +} + +IDRemapperApplyResult BKE_id_remapper_apply_ex(const IDRemapper *id_remapper, + ID **r_id_ptr, + const IDRemapperApplyOptions options, + ID *id_self) +{ + BLI_assert_msg((options & ID_REMAP_APPLY_UNMAP_WHEN_REMAPPING_TO_SELF) == 0 || + id_self != nullptr, + "ID_REMAP_APPLY_WHEN_REMAPPING_TO_SELF requires id_self parameter."); + const blender::bke::id::remapper::IDRemapper *remapper = unwrap(id_remapper); + return remapper->apply(r_id_ptr, options, id_self); +} + +IDRemapperApplyResult BKE_id_remapper_apply(const IDRemapper *id_remapper, + ID **r_id_ptr, + const IDRemapperApplyOptions options) +{ + BLI_assert_msg((options & ID_REMAP_APPLY_UNMAP_WHEN_REMAPPING_TO_SELF) == 0, + "ID_REMAP_APPLY_UNMAP_WHEN_REMAPPING_TO_SELF requires id_self parameter. Use " + "`BKE_id_remapper_apply_ex`."); + return BKE_id_remapper_apply_ex(id_remapper, r_id_ptr, options, nullptr); +} + +void BKE_id_remapper_iter(const IDRemapper *id_remapper, + IDRemapperIterFunction func, + void *user_data) +{ + const blender::bke::id::remapper::IDRemapper *remapper = unwrap(id_remapper); + remapper->iter(func, user_data); +} + +const char *BKE_id_remapper_result_string(const IDRemapperApplyResult result) { switch (result) { case ID_REMAP_RESULT_SOURCE_NOT_MAPPABLE: @@ -104,21 +229,23 @@ const StringRefNull IDRemapper::result_to_string(const IDRemapperApplyResult res return "unassigned"; case ID_REMAP_RESULT_SOURCE_REMAPPED: return "remapped"; + default: + BLI_assert_unreachable(); } - BLI_assert_unreachable(); return ""; } -void IDRemapper::print() const +static void id_remapper_print_item_cb(ID *old_id, ID *new_id, void * /*user_data*/) { - this->iter([](ID *old_id, ID *new_id) { - if (old_id != nullptr && new_id != nullptr) { - printf("Remap %s(%p) to %s(%p)\n", old_id->name, old_id, new_id->name, new_id); - } - if (old_id != nullptr && new_id == nullptr) { - printf("Unassign %s(%p)\n", old_id->name, old_id); - } - }); + if (old_id != nullptr && new_id != nullptr) { + printf("Remap %s(%p) to %s(%p)\n", old_id->name, old_id, new_id->name, new_id); + } + if (old_id != nullptr && new_id == nullptr) { + printf("Unassign %s(%p)\n", old_id->name, old_id); + } } -} // namespace blender::bke::id +void BKE_id_remapper_print(const IDRemapper *id_remapper) +{ + BKE_id_remapper_iter(id_remapper, id_remapper_print_item_cb, nullptr); +} diff --git a/source/blender/blenkernel/intern/lib_id_remapper_test.cc b/source/blender/blenkernel/intern/lib_id_remapper_test.cc index 6c7eefa129c..b4928fafd6b 100644 --- a/source/blender/blenkernel/intern/lib_id_remapper_test.cc +++ b/source/blender/blenkernel/intern/lib_id_remapper_test.cc @@ -10,27 +10,29 @@ #include "DNA_ID.h" -using namespace blender::bke::id; - -namespace blender::bke::id::tests { +namespace blender::bke::id::remapper::tests { TEST(lib_id_remapper, unavailable) { ID id1; ID *idp = &id1; - IDRemapper remapper; - IDRemapperApplyResult result = remapper.apply(&idp, ID_REMAP_APPLY_DEFAULT); + IDRemapper *remapper = BKE_id_remapper_create(); + IDRemapperApplyResult result = BKE_id_remapper_apply(remapper, &idp, ID_REMAP_APPLY_DEFAULT); EXPECT_EQ(result, ID_REMAP_RESULT_SOURCE_UNAVAILABLE); + + BKE_id_remapper_free(remapper); } TEST(lib_id_remapper, not_mappable) { ID *idp = nullptr; - IDRemapper remapper; - IDRemapperApplyResult result = remapper.apply(&idp, ID_REMAP_APPLY_DEFAULT); + IDRemapper *remapper = BKE_id_remapper_create(); + IDRemapperApplyResult result = BKE_id_remapper_apply(remapper, &idp, ID_REMAP_APPLY_DEFAULT); EXPECT_EQ(result, ID_REMAP_RESULT_SOURCE_NOT_MAPPABLE); + + BKE_id_remapper_free(remapper); } TEST(lib_id_remapper, mapped) @@ -41,11 +43,13 @@ TEST(lib_id_remapper, mapped) STRNCPY(id1.name, "OB1"); STRNCPY(id2.name, "OB2"); - IDRemapper remapper; - remapper.add(&id1, &id2); - IDRemapperApplyResult result = remapper.apply(&idp, ID_REMAP_APPLY_DEFAULT); + IDRemapper *remapper = BKE_id_remapper_create(); + BKE_id_remapper_add(remapper, &id1, &id2); + IDRemapperApplyResult result = BKE_id_remapper_apply(remapper, &idp, ID_REMAP_APPLY_DEFAULT); EXPECT_EQ(result, ID_REMAP_RESULT_SOURCE_REMAPPED); EXPECT_EQ(idp, &id2); + + BKE_id_remapper_free(remapper); } TEST(lib_id_remapper, unassigned) @@ -54,11 +58,13 @@ TEST(lib_id_remapper, unassigned) ID *idp = &id1; STRNCPY(id1.name, "OB2"); - IDRemapper remapper; - remapper.add(&id1, nullptr); - IDRemapperApplyResult result = remapper.apply(&idp, ID_REMAP_APPLY_DEFAULT); + IDRemapper *remapper = BKE_id_remapper_create(); + BKE_id_remapper_add(remapper, &id1, nullptr); + IDRemapperApplyResult result = BKE_id_remapper_apply(remapper, &idp, ID_REMAP_APPLY_DEFAULT); EXPECT_EQ(result, ID_REMAP_RESULT_SOURCE_UNASSIGNED); EXPECT_EQ(idp, nullptr); + + BKE_id_remapper_free(remapper); } TEST(lib_id_remapper, unassign_when_mapped_to_self) @@ -74,28 +80,31 @@ TEST(lib_id_remapper, unassign_when_mapped_to_self) /* Default mapping behavior. Should just remap to id2. */ idp = &id1; - IDRemapper remapper; - remapper.add(&id1, &id2); - IDRemapperApplyResult result = remapper.apply( - &idp, ID_REMAP_APPLY_UNMAP_WHEN_REMAPPING_TO_SELF, &id_self); + IDRemapper *remapper = BKE_id_remapper_create(); + BKE_id_remapper_add(remapper, &id1, &id2); + IDRemapperApplyResult result = BKE_id_remapper_apply_ex( + remapper, &idp, ID_REMAP_APPLY_UNMAP_WHEN_REMAPPING_TO_SELF, &id_self); EXPECT_EQ(result, ID_REMAP_RESULT_SOURCE_REMAPPED); EXPECT_EQ(idp, &id2); /* Default mapping behavior. Should unassign. */ idp = &id1; - remapper.clear(); - remapper.add(&id1, nullptr); - result = remapper.apply(&idp, ID_REMAP_APPLY_UNMAP_WHEN_REMAPPING_TO_SELF, &id_self); + BKE_id_remapper_clear(remapper); + BKE_id_remapper_add(remapper, &id1, nullptr); + result = BKE_id_remapper_apply_ex( + remapper, &idp, ID_REMAP_APPLY_UNMAP_WHEN_REMAPPING_TO_SELF, &id_self); EXPECT_EQ(result, ID_REMAP_RESULT_SOURCE_UNASSIGNED); EXPECT_EQ(idp, nullptr); /* Unmap when remapping to self behavior. Should unassign. */ idp = &id1; - remapper.clear(); - remapper.add(&id1, &id_self); - result = remapper.apply(&idp, ID_REMAP_APPLY_UNMAP_WHEN_REMAPPING_TO_SELF, &id_self); + BKE_id_remapper_clear(remapper); + BKE_id_remapper_add(remapper, &id1, &id_self); + result = BKE_id_remapper_apply_ex( + remapper, &idp, ID_REMAP_APPLY_UNMAP_WHEN_REMAPPING_TO_SELF, &id_self); EXPECT_EQ(result, ID_REMAP_RESULT_SOURCE_UNASSIGNED); EXPECT_EQ(idp, nullptr); + BKE_id_remapper_free(remapper); } -} // namespace blender::bke::id::tests +} // namespace blender::bke::id::remapper::tests diff --git a/source/blender/blenkernel/intern/lib_override.cc b/source/blender/blenkernel/intern/lib_override.cc index 7df00b7c0ef..e035a36f5b7 100644 --- a/source/blender/blenkernel/intern/lib_override.cc +++ b/source/blender/blenkernel/intern/lib_override.cc @@ -25,12 +25,12 @@ #include "DEG_depsgraph.hh" #include "DEG_depsgraph_build.hh" -#include "BKE_anim_data.hh" +#include "BKE_anim_data.h" #include "BKE_armature.hh" -#include "BKE_blender.hh" -#include "BKE_collection.hh" -#include "BKE_fcurve.hh" -#include "BKE_global.hh" +#include "BKE_blender.h" +#include "BKE_collection.h" +#include "BKE_fcurve.h" +#include "BKE_global.h" #include "BKE_idtype.hh" #include "BKE_key.hh" #include "BKE_layer.hh" @@ -41,10 +41,10 @@ #include "BKE_main.hh" #include "BKE_main_namemap.hh" #include "BKE_node.hh" -#include "BKE_report.hh" -#include "BKE_scene.hh" +#include "BKE_report.h" +#include "BKE_scene.h" -#include "BLO_readfile.hh" +#include "BLO_readfile.h" #include "BLI_ghash.h" #include "BLI_linklist.h" @@ -72,8 +72,6 @@ # include "BLI_time_utildefines.h" #endif -using namespace blender::bke; - static CLG_LogRef LOG = {"bke.liboverride"}; static CLG_LogRef LOG_RESYNC = {"bke.liboverride_resync"}; @@ -253,17 +251,11 @@ static ID *lib_override_library_create_from(Main *bmain, const int lib_id_copy_flags) { /* NOTE: do not copy possible override data from the reference here. */ - ID *local_id = BKE_id_copy_in_lib( - bmain, - owner_library, - reference_id, - nullptr, - (LIB_ID_COPY_DEFAULT | LIB_ID_COPY_NO_LIB_OVERRIDE | lib_id_copy_flags)); - if (local_id == nullptr) { - return nullptr; - } - BLI_assert(local_id->lib == owner_library); - id_us_min(local_id); + ID *local_id = BKE_id_copy_ex(bmain, + reference_id, + nullptr, + LIB_ID_COPY_DEFAULT | LIB_ID_COPY_NO_LIB_OVERRIDE | + lib_id_copy_flags); /* In case we could not get an override ID with the exact same name as its linked reference, * ensure we at least get a uniquely named override ID over the whole current Main data, to @@ -277,14 +269,16 @@ static ID *lib_override_library_create_from(Main *bmain, id_sort_by_name(which_libbase(bmain, GS(local_id->name)), local_id, nullptr); } - /* In `NO_MAIN` case, generic `BKE_id_copy` code won't call this. - * In liboverride resync case however, the currently not-in-Main new IDs will be added back to - * Main later, so ensure that their linked dependencies and paths are properly handled here. - * - * NOTE: This is likely not the best place to do this. Ideally, #BKE_libblock_management_main_add - * e.g. should take care of this. But for the time being, this works and has been battle-proofed. - */ - if ((lib_id_copy_flags & LIB_ID_CREATE_NO_MAIN) != 0 && !ID_IS_LINKED(local_id)) { + if (local_id == nullptr) { + return nullptr; + } + id_us_min(local_id); + + /* TODO: Handle this properly in LIB_NO_MAIN case as well (i.e. resync case). Or offload to + * generic ID copy code? Would probably be better to have a version of #BKE_id_copy_ex that takes + * an extra `target_lib` parameter. */ + local_id->lib = owner_library; + if ((lib_id_copy_flags & LIB_ID_CREATE_NO_MAIN) != 0 && owner_library == nullptr) { lib_id_copy_ensure_local(bmain, reference_id, local_id, 0); } @@ -493,11 +487,11 @@ static void lib_override_prefill_newid_from_existing_overrides(Main *bmain, ID * FOREACH_MAIN_ID_END; } -static void lib_override_remapper_overrides_add(id::IDRemapper &id_remapper, +static void lib_override_remapper_overrides_add(IDRemapper *id_remapper, ID *reference_id, ID *local_id) { - id_remapper.add(reference_id, local_id); + BKE_id_remapper_add(id_remapper, reference_id, local_id); Key *reference_key, *local_key = nullptr; if ((reference_key = BKE_key_from_id(reference_id)) != nullptr) { @@ -506,7 +500,7 @@ static void lib_override_remapper_overrides_add(id::IDRemapper &id_remapper, BLI_assert(local_key != nullptr); } - id_remapper.add(&reference_key->id, &local_key->id); + BKE_id_remapper_add(id_remapper, &reference_key->id, &local_key->id); } } @@ -626,7 +620,7 @@ bool BKE_lib_override_library_create_from_tag(Main *bmain, BLI_assert(id_hierarchy_root != nullptr); blender::Vector relinked_ids; - id::IDRemapper id_remapper; + IDRemapper *id_remapper = BKE_id_remapper_create(); /* Still checking the whole Main, that way we can tag other local IDs as needing to be * remapped to use newly created overriding IDs, if needed. */ ID *id; @@ -699,6 +693,7 @@ bool BKE_lib_override_library_create_from_tag(Main *bmain, id_remapper, ID_REMAP_SKIP_OVERRIDE_LIBRARY | ID_REMAP_FORCE_USER_REFCOUNT); + BKE_id_remapper_free(id_remapper); relinked_ids.clear(); } else { @@ -1939,7 +1934,7 @@ static void lib_override_library_remap(Main *bmain, GHash *linkedref_to_old_override) { ID *id; - id::IDRemapper remapper; + IDRemapper *remapper = BKE_id_remapper_create(); blender::Vector nomain_ids; FOREACH_MAIN_ID_BEGIN (bmain, id) { @@ -1949,7 +1944,7 @@ static void lib_override_library_remap(Main *bmain, if (id_override_old == nullptr) { continue; } - remapper.add(id_override_old, id_override_new); + BKE_id_remapper_add(remapper, id_override_old, id_override_new); } } FOREACH_MAIN_ID_END; @@ -1973,6 +1968,7 @@ static void lib_override_library_remap(Main *bmain, ID_REMAP_TYPE_REMAP, remapper, ID_REMAP_FORCE_USER_REFCOUNT | ID_REMAP_FORCE_NEVER_NULL_USAGE); + BKE_id_remapper_free(remapper); } /** @@ -2519,7 +2515,7 @@ static bool lib_override_library_resync(Main *bmain, /* Once overrides have been properly 'transferred' from old to new ID, we can clear ID usages * of the old one. * This is necessary in case said old ID is not in Main anymore. */ - id::IDRemapper id_remapper; + IDRemapper *id_remapper = BKE_id_remapper_create(); BKE_libblock_relink_multiple(bmain, id_override_old_vector, ID_REMAP_TYPE_CLEANUP, @@ -2529,6 +2525,7 @@ static bool lib_override_library_resync(Main *bmain, id_override_old->tag |= LIB_TAG_NO_USER_REFCOUNT; } id_override_old_vector.clear(); + BKE_id_remapper_free(id_remapper); /* Delete old override IDs. * Note that we have to use tagged group deletion here, since ID deletion also uses @@ -2670,56 +2667,6 @@ static bool lib_override_library_resync(Main *bmain, return success; } -/** Cleanup: Remove unused 'place holder' linked IDs. */ -static void lib_override_cleanup_after_resync(Main *bmain) -{ - LibQueryUnusedIDsData parameters; - parameters.do_local_ids = true; - parameters.do_linked_ids = true; - parameters.do_recursive = true; - parameters.filter_fn = [](const ID *id) -> bool { - if (ID_IS_LINKED(id) && (id->tag & LIB_TAG_MISSING) != 0) { - return true; - } - /* This is a fairly complex case. - * - * LibOverride resync process takes care of removing 'no more valid' liboverrides (see at the - * end of #lib_override_library_main_resync_on_library_indirect_level). However, since it does - * not resync data which linked reference is missing (see - * #lib_override_library_main_resync_id_skip_check), these are kept 'as is'. Indeed, - * liboverride resync code cannot know if a specific liboverride data is only part of its - * hierarchy, or if it is also used by some other data (in which case it should be preserved if - * the linked reference goes missing). - * - * So instead, we consider these cases as also valid candidates for deletion here, since the - * whole recursive process in `BKE_lib_query_unused_ids_tag` will ensure that if there is still - * any valid user of these, they won't get tagged for deletion. - * - * Also, do not delete 'orphaned' liboverrides if it's a hierarchy root, or if its hierarchy - * root's reference is missing, since this is much more likely a case of actual missing data, - * rather than changes in the liboverride's hierarchy in the linked data. - */ - if (ID_IS_OVERRIDE_LIBRARY(id)) { - const IDOverrideLibrary *override_library = BKE_lib_override_library_get( - nullptr, id, nullptr, nullptr); - const ID *root = override_library->hierarchy_root; - if (root == id || (root->override_library->reference->tag & LIB_TAG_MISSING) != 0) { - return false; - } - return ((override_library->reference->tag & LIB_TAG_MISSING) != 0); - } - return false; - }; - BKE_lib_query_unused_ids_tag(bmain, LIB_TAG_DOIT, parameters); - CLOG_INFO(&LOG_RESYNC, - 2, - "Deleting %d unused linked missing IDs and their unused liboverrides (including %d " - "local ones)\n", - parameters.num_total[INDEX_ID_NULL], - parameters.num_local[INDEX_ID_NULL]); - BKE_id_multi_tagged_delete(bmain); -} - bool BKE_lib_override_library_resync(Main *bmain, Scene *scene, ViewLayer *view_layer, @@ -2752,8 +2699,6 @@ bool BKE_lib_override_library_resync(Main *bmain, * re-create the global namemap on demand. */ BKE_main_namemap_destroy(&bmain->name_map_global); - lib_override_cleanup_after_resync(bmain); - return success; } @@ -3232,7 +3177,7 @@ static bool lib_override_library_main_resync_on_library_indirect_level( BlendFileReadReport *reports) { const bool do_reports_recursive_resync_timing = (library_indirect_level != 0); - const double init_time = do_reports_recursive_resync_timing ? BLI_time_now_seconds() : 0.0; + const double init_time = do_reports_recursive_resync_timing ? BLI_check_seconds_timer() : 0.0; BKE_main_relations_create(bmain, 0); BKE_main_id_tag_all(bmain, LIB_TAG_DOIT, false); @@ -3538,7 +3483,7 @@ static bool lib_override_library_main_resync_on_library_indirect_level( BKE_lib_override_library_main_hierarchy_root_ensure(bmain); if (do_reports_recursive_resync_timing) { - reports->duration.lib_overrides_recursive_resync += BLI_time_now_seconds() - init_time; + reports->duration.lib_overrides_recursive_resync += BLI_check_seconds_timer() - init_time; } return process_lib_level_again; @@ -3721,8 +3666,6 @@ void BKE_lib_override_library_main_resync(Main *bmain, * re-create the global namemap on demand. */ BKE_main_namemap_destroy(&bmain->name_map_global); - lib_override_cleanup_after_resync(bmain); - BLI_assert(BKE_main_namemap_validate(bmain)); } @@ -4240,7 +4183,7 @@ void BKE_lib_override_library_validate(Main *bmain, ID *id, ReportList *reports) liboverride = BKE_lib_override_library_get(bmain, id, nullptr, &liboverride_id); if (!liboverride) { /* Happens in case the given ID is a liboverride-embedded one (actual embedded ID like - * NodeTree or master collection, or shape-keys), used by a totally not-liboverride owner ID. + * NodeTree or master collection, or shapekeys), used by a totally not-liboverride owner ID. * Just clear the relevant ID flag. */ id->flag &= ~LIB_EMBEDDED_DATA_LIB_OVERRIDE; @@ -4251,7 +4194,7 @@ void BKE_lib_override_library_validate(Main *bmain, ID *id, ReportList *reports) /* NOTE: In code deleting liboverride data below, #BKE_lib_override_library_make_local is used * instead of directly calling #BKE_lib_override_library_free, because the former also handles - * properly 'liboverride embedded' IDs, like root node-trees, or shape-keys. */ + * properly 'liboverride embedded' IDs, like root nodetrees, or shapekeys. */ if (liboverride->reference == nullptr) { /* This (probably) used to be a template ID, could be linked or local, not an override. */ @@ -4724,7 +4667,7 @@ static bool lib_override_library_id_reset_do(Main *bmain, } if (was_op_deleted) { - DEG_id_tag_update_ex(bmain, id_root, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update_ex(bmain, id_root, ID_RECALC_COPY_ON_WRITE); IDOverrideLibraryRuntime *liboverride_runtime = override_library_runtime_ensure( id_root->override_library); liboverride_runtime->tag |= LIBOVERRIDE_TAG_NEEDS_RELOAD; diff --git a/source/blender/blenkernel/intern/lib_override_proxy_conversion.cc b/source/blender/blenkernel/intern/lib_override_proxy_conversion.cc index 72d8843db4c..133aeeebabc 100644 --- a/source/blender/blenkernel/intern/lib_override_proxy_conversion.cc +++ b/source/blender/blenkernel/intern/lib_override_proxy_conversion.cc @@ -22,13 +22,13 @@ #include "DEG_depsgraph.hh" -#include "BKE_collection.hh" +#include "BKE_collection.h" #include "BKE_idtype.hh" #include "BKE_lib_id.hh" #include "BKE_lib_override.hh" #include "BKE_main.hh" -#include "BLO_readfile.hh" +#include "BLO_readfile.h" static CLG_LogRef LOG = {"bke.liboverride_proxy_conversion"}; @@ -69,7 +69,7 @@ bool BKE_lib_override_library_proxy_convert(Main *bmain, ob_proxy->proxy->proxy_from = nullptr; ob_proxy->proxy = ob_proxy->proxy_group = nullptr; - DEG_id_tag_update(&ob_proxy->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&ob_proxy->id, ID_RECALC_COPY_ON_WRITE); /* In case of proxy conversion, remap all local ID usages to linked IDs to their newly created * overrides. Also do that for the IDs from the same lib as the proxy in case it is linked. diff --git a/source/blender/blenkernel/intern/lib_query.cc b/source/blender/blenkernel/intern/lib_query.cc index 530e3d05b6c..4a70cef8629 100644 --- a/source/blender/blenkernel/intern/lib_query.cc +++ b/source/blender/blenkernel/intern/lib_query.cc @@ -10,20 +10,18 @@ #include "DNA_anim_types.h" -#include "BLI_function_ref.hh" #include "BLI_ghash.h" #include "BLI_linklist_stack.h" #include "BLI_listbase.h" -#include "BLI_set.hh" #include "BLI_utildefines.h" -#include "BKE_anim_data.hh" +#include "BKE_anim_data.h" #include "BKE_idprop.h" #include "BKE_idtype.hh" #include "BKE_lib_id.hh" #include "BKE_lib_query.hh" #include "BKE_main.hh" -#include "BKE_node.hh" +#include "BKE_node.h" /* status */ enum { @@ -397,24 +395,28 @@ void BKE_library_update_ID_link_user(ID *id_dst, ID *id_src, const int cb_flag) } } -uint64_t BKE_library_id_can_use_filter_id(const ID *owner_id, - const bool include_ui, - const IDTypeInfo *owner_id_type) +uint64_t BKE_library_id_can_use_filter_id(const ID *owner_id, const bool include_ui) { /* any type of ID can be used in custom props. */ if (owner_id->properties) { return FILTER_ID_ALL; } - /* When including UI data (i.e. editors), Screen UI IDs can also link to virtually any ID - * (through e.g. the Outliner). */ - if (include_ui && GS(owner_id->name) == ID_SCR) { + const short id_type_owner = GS(owner_id->name); + + /* IDProps of armature bones and nodes, and bNode->id can use virtually any type of ID. */ + if (ELEM(id_type_owner, ID_NT, ID_AR)) { + return FILTER_ID_ALL; + } + + /* Screen UI IDs can also link to virtually any ID (through e.g. the Outliner). */ + if (include_ui && id_type_owner == ID_SCR) { return FILTER_ID_ALL; } /* Casting to non const. * TODO(jbakker): We should introduce a ntree_id_has_tree function as we are actually not * interested in the result. */ - if (ntreeFromID(const_cast(owner_id))) { + if (ntreeFromID((ID *)owner_id)) { return FILTER_ID_ALL; } @@ -428,21 +430,118 @@ uint64_t BKE_library_id_can_use_filter_id(const ID *owner_id, return FILTER_ID_ALL; } - if (!owner_id_type) { - owner_id_type = BKE_idtype_get_info_from_id(owner_id); - } - if (owner_id_type) { - return owner_id_type->dependencies_id_types; + switch ((ID_Type)id_type_owner) { + case ID_LI: + return FILTER_ID_LI; + case ID_SCE: + return FILTER_ID_OB | FILTER_ID_WO | FILTER_ID_SCE | FILTER_ID_MC | FILTER_ID_MA | + FILTER_ID_GR | FILTER_ID_TXT | FILTER_ID_LS | FILTER_ID_MSK | FILTER_ID_SO | + FILTER_ID_GD_LEGACY | FILTER_ID_BR | FILTER_ID_PAL | FILTER_ID_IM | FILTER_ID_NT; + case ID_OB: + /* Could be more specific, but simpler to just always say 'yes' here. */ + return FILTER_ID_ALL; + case ID_ME: + return FILTER_ID_ME | FILTER_ID_MA | FILTER_ID_IM | FILTER_ID_KE; + case ID_CU_LEGACY: + return FILTER_ID_OB | FILTER_ID_MA | FILTER_ID_VF | FILTER_ID_KE; + case ID_MB: + return FILTER_ID_MA; + case ID_MA: + return FILTER_ID_TE | FILTER_ID_GR; + case ID_TE: + return FILTER_ID_IM | FILTER_ID_OB; + case ID_LT: + return FILTER_ID_KE; + case ID_LA: + return FILTER_ID_TE; + case ID_CA: + return FILTER_ID_OB | FILTER_ID_IM; + case ID_KE: + /* Warning! key->from, could be more types in future? */ + return FILTER_ID_ME | FILTER_ID_CU_LEGACY | FILTER_ID_LT; + case ID_SCR: + return FILTER_ID_SCE; + case ID_WO: + return FILTER_ID_TE; + case ID_SPK: + return FILTER_ID_SO; + case ID_GR: + return FILTER_ID_OB | FILTER_ID_GR; + case ID_NT: + /* Could be more specific, but node.id has no type restriction... */ + return FILTER_ID_ALL; + case ID_BR: + return FILTER_ID_BR | FILTER_ID_IM | FILTER_ID_PC | FILTER_ID_TE | FILTER_ID_MA; + case ID_PA: + return FILTER_ID_OB | FILTER_ID_GR | FILTER_ID_TE; + case ID_MC: + return FILTER_ID_GD_LEGACY | FILTER_ID_IM; + case ID_MSK: + /* WARNING! mask->parent.id, not typed. */ + return FILTER_ID_MC; + case ID_LS: + return FILTER_ID_TE | FILTER_ID_OB; + case ID_LP: + return FILTER_ID_IM; + case ID_GD_LEGACY: + return FILTER_ID_MA; + case ID_GP: + return FILTER_ID_GP | FILTER_ID_MA; + case ID_WS: + return FILTER_ID_SCE; + case ID_CV: + return FILTER_ID_MA | FILTER_ID_OB; + case ID_PT: + return FILTER_ID_MA; + case ID_VO: + return FILTER_ID_MA; + case ID_WM: + return FILTER_ID_SCE | FILTER_ID_WS; + case ID_IM: + case ID_VF: + case ID_TXT: + case ID_SO: + case ID_AR: + case ID_AC: + case ID_PAL: + case ID_PC: + case ID_CF: + /* Those types never use/reference other IDs... */ + return 0; + case ID_IP: + /* Deprecated... */ + return 0; } + BLI_assert_unreachable(); return 0; } bool BKE_library_id_can_use_idtype(ID *owner_id, const short id_type_used) { - const IDTypeInfo *owner_id_type = BKE_idtype_get_info_from_id(owner_id); + /* any type of ID can be used in custom props. */ + if (owner_id->properties) { + return true; + } + + const short id_type_owner = GS(owner_id->name); + /* Exception for ID_LI as they don't exist as a filter. */ + if (id_type_used == ID_LI) { + return id_type_owner == ID_LI; + } + + /* Exception: ID_KE aren't available as filter_id. */ + if (id_type_used == ID_KE) { + return ELEM(id_type_owner, ID_ME, ID_CU_LEGACY, ID_LT); + } + + /* Exception: ID_SCR aren't available as filter_id. */ + if (id_type_used == ID_SCR) { + return ELEM(id_type_owner, ID_WS); + } + const uint64_t filter_id_type_used = BKE_idtype_idcode_to_idfilter(id_type_used); - const uint64_t can_be_used = BKE_library_id_can_use_filter_id(owner_id, false, owner_id_type); + const uint64_t can_be_used = BKE_library_id_can_use_filter_id(owner_id, false); return (can_be_used & filter_id_type_used) != 0; } @@ -593,91 +692,20 @@ void BKE_library_ID_test_usages(Main *bmain, /* ***** IDs usages.checking/tagging. ***** */ -/* Internal data for the common processing of the 'unused IDs' query functions. - * - * While #LibQueryUnusedIDsData is a subset of this internal struct, they need to be kept separate, - * since this struct is used with partially 'enforced' values for some parameters by the - * #BKE_lib_query_unused_ids_amounts code. This allows the computation of predictive amounts for - * user feedback ('what would be the amounts of IDs detected as unused if this option was - * enabled'). - */ -struct UnusedIDsData { - Main *bmain; - - const int id_tag; - - bool do_local_ids; - bool do_linked_ids; - bool do_recursive; - - blender::FunctionRef filter_fn; - - std::array *num_total; - std::array *num_local; - std::array *num_linked; - - blender::Set unused_ids; - - UnusedIDsData(Main *bmain, const int id_tag, LibQueryUnusedIDsData ¶meters) - : bmain(bmain), - id_tag(id_tag), - do_local_ids(parameters.do_local_ids), - do_linked_ids(parameters.do_linked_ids), - do_recursive(parameters.do_recursive), - filter_fn(parameters.filter_fn), - num_total(¶meters.num_total), - num_local(¶meters.num_local), - num_linked(¶meters.num_linked) - { - } - - void reset(const bool do_local_ids, - const bool do_linked_ids, - const bool do_recursive, - std::array &num_total, - std::array &num_local, - std::array &num_linked) - { - unused_ids.clear(); - this->do_local_ids = do_local_ids; - this->do_linked_ids = do_linked_ids; - this->do_recursive = do_recursive; - this->num_total = &num_total; - this->num_local = &num_local; - this->num_linked = &num_linked; - } -}; - -static void lib_query_unused_ids_tag_id(ID *id, UnusedIDsData &data) -{ - if (data.filter_fn && !data.filter_fn(id)) { - return; - } - id->tag |= data.id_tag; - data.unused_ids.add(id); - - const int id_code = BKE_idtype_idcode_to_index(GS(id->name)); - (*data.num_total)[INDEX_ID_NULL]++; - (*data.num_total)[id_code]++; - if (ID_IS_LINKED(id)) { - (*data.num_linked)[INDEX_ID_NULL]++; - (*data.num_linked)[id_code]++; - } - else { - (*data.num_local)[INDEX_ID_NULL]++; - (*data.num_local)[id_code]++; - } -} - /* Returns `true` if given ID is detected as part of at least one dependency loop, false otherwise. */ -static bool lib_query_unused_ids_tag_recurse(ID *id, UnusedIDsData &data) +static bool 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); MainIDRelationsEntry *id_relations = static_cast( - BLI_ghash_lookup(data.bmain->relations->relations_from_pointers, id)); + BLI_ghash_lookup(bmain->relations->relations_from_pointers, id)); if ((id_relations->tags & MAINIDRELATIONS_ENTRY_TAGS_PROCESSED) != 0) { return false; @@ -688,12 +716,12 @@ static bool lib_query_unused_ids_tag_recurse(ID *id, UnusedIDsData &data) return true; } - if ((!data.do_linked_ids && ID_IS_LINKED(id)) || (!data.do_local_ids && !ID_IS_LINKED(id))) { + if ((!do_linked_ids && ID_IS_LINKED(id)) || (!do_local_ids && !ID_IS_LINKED(id))) { id_relations->tags |= MAINIDRELATIONS_ENTRY_TAGS_PROCESSED; return false; } - if (data.unused_ids.contains(id)) { + if ((id->tag & tag) != 0) { id_relations->tags |= MAINIDRELATIONS_ENTRY_TAGS_PROCESSED; return false; } @@ -751,20 +779,26 @@ static bool lib_query_unused_ids_tag_recurse(ID *id, UnusedIDsData &data) BLI_assert(id_from != nullptr); } - if (lib_query_unused_ids_tag_recurse(id_from, data)) { + if (lib_query_unused_ids_tag_recurse( + bmain, tag, do_local_ids, do_linked_ids, id_from, r_num_tagged)) + { /* Dependency loop case, ignore the `id_from` tag value here (as it should not be considered * as valid yet), and presume that this is a 'valid user' case for now. */ is_part_of_dependency_loop = true; continue; } - if (!data.unused_ids.contains(id_from)) { + if ((id_from->tag & tag) == 0) { has_valid_from_users = true; break; } } if (!has_valid_from_users && !is_part_of_dependency_loop) { /* Tag the ID as unused, only in case it is not part of a dependency loop. */ - lib_query_unused_ids_tag_id(id, data); + id->tag |= tag; + if (r_num_tagged != nullptr) { + r_num_tagged[INDEX_ID_NULL]++; + r_num_tagged[BKE_idtype_idcode_to_index(GS(id->name))]++; + } } /* This ID is not being processed anymore. @@ -783,33 +817,42 @@ static bool lib_query_unused_ids_tag_recurse(ID *id, UnusedIDsData &data) return is_part_of_dependency_loop; } -static void lib_query_unused_ids_tag(UnusedIDsData &data) +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) { - BKE_main_relations_tag_set(data.bmain, MAINIDRELATIONS_ENTRY_TAGS_PROCESSED, false); - /* First loop, to only check for immediately 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 (data.bmain, id) { - if ((!data.do_linked_ids && ID_IS_LINKED(id)) || (!data.do_local_ids && !ID_IS_LINKED(id))) { - id->tag &= ~data.id_tag; + 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) { - lib_query_unused_ids_tag_id(id, data); + id->tag |= tag; + if (r_num_tagged != nullptr) { + r_num_tagged[INDEX_ID_NULL]++; + r_num_tagged[BKE_idtype_idcode_to_index(GS(id->name))]++; + } } else { - id->tag &= ~data.id_tag; + id->tag &= ~tag; } } FOREACH_MAIN_ID_END; - if (!data.do_recursive) { + if (!do_tag_recursive) { return; } - BLI_assert(data.bmain->relations != nullptr); - FOREACH_MAIN_ID_BEGIN (data.bmain, id) { - if (lib_query_unused_ids_tag_recurse(id, data)) { + BKE_main_relations_create(bmain, 0); + FOREACH_MAIN_ID_BEGIN (bmain, id) { + if (lib_query_unused_ids_tag_recurse( + bmain, tag, do_local_ids, do_linked_ids, id, r_num_tagged)) + { /* This root processed ID is part of one or more dependency loops. * * If it was not tagged, and its matching relations entry is not marked as processed, it @@ -818,12 +861,16 @@ static void lib_query_unused_ids_tag(UnusedIDsData &data) * relations to the current Blender file (like being part of a scene, etc.). * * So the entry can be tagged as processed, and the ID tagged as unused. */ - if (!data.unused_ids.contains(id)) { + if ((id->tag & tag) == 0) { MainIDRelationsEntry *id_relations = static_cast( - BLI_ghash_lookup(data.bmain->relations->relations_from_pointers, id)); + BLI_ghash_lookup(bmain->relations->relations_from_pointers, id)); if ((id_relations->tags & MAINIDRELATIONS_ENTRY_TAGS_PROCESSED) == 0) { id_relations->tags |= MAINIDRELATIONS_ENTRY_TAGS_PROCESSED; - lib_query_unused_ids_tag_id(id, data); + id->tag |= tag; + if (r_num_tagged != nullptr) { + r_num_tagged[INDEX_ID_NULL]++; + r_num_tagged[BKE_idtype_idcode_to_index(GS(id->name))]++; + } } } } @@ -831,89 +878,15 @@ static void lib_query_unused_ids_tag(UnusedIDsData &data) #ifndef NDEBUG /* Relation entry for the root processed ID should always be marked as processed now. */ MainIDRelationsEntry *id_relations = static_cast( - BLI_ghash_lookup(data.bmain->relations->relations_from_pointers, id)); - BLI_assert((id_relations->tags & MAINIDRELATIONS_ENTRY_TAGS_PROCESSED) != 0); + BLI_ghash_lookup(bmain->relations->relations_from_pointers, id)); + if ((id_relations->tags & MAINIDRELATIONS_ENTRY_TAGS_PROCESSED) == 0) { + BLI_assert((id_relations->tags & MAINIDRELATIONS_ENTRY_TAGS_PROCESSED) != 0); + } BLI_assert((id_relations->tags & MAINIDRELATIONS_ENTRY_TAGS_INPROGRESS) == 0); #endif } FOREACH_MAIN_ID_END; -} - -void BKE_lib_query_unused_ids_amounts(Main *bmain, LibQueryUnusedIDsData ¶meters) -{ - std::array num_dummy{0}; - if (parameters.do_recursive) { - BKE_main_relations_create(bmain, 0); - } - - parameters.num_total.fill(0); - parameters.num_local.fill(0); - parameters.num_linked.fill(0); - - /* The complex fiddling with the two calls, which data they each get, based on the `do_local_ids` - * and `do_linked_ids`, is here to reduce as much as possible the extra processing: - * - * If both local and linked options are enabled, a single call with all given parameters gives - * all required data about unused IDs. - * - * If both local and linked options are disabled, total amount is left at zero, and each local - * and linked amounts are computed separately. - * - * If local is disabled and linked is enabled, the first call will compute the amount of local - * IDs that would be unused if the local option was enabled. Therefore, only the local amount can - * be kept from this call. The second call will compute valid values for both linked, and total - * data. - * - * If local is enabled and linked is disabled, the first call will compute valid values for both - * local, and total data. The second call will compute the amount of linked IDs that would be - * unused if the linked option was enabled. Therefore, only the linked amount can be kept from - * this call. - */ - - UnusedIDsData data(bmain, 0, parameters); - data.do_local_ids = true; - if (!parameters.do_local_ids) { - data.num_total = &num_dummy; - } - if (!(parameters.do_local_ids && parameters.do_linked_ids)) { - data.num_linked = &num_dummy; - } - lib_query_unused_ids_tag(data); - - if (!(parameters.do_local_ids && parameters.do_linked_ids)) { - /* In case a second run is required, clear runtime data and update settings for linked data. */ - data.reset(parameters.do_local_ids, - true, - parameters.do_recursive, - (!parameters.do_local_ids && parameters.do_linked_ids) ? parameters.num_total : - num_dummy, - num_dummy, - parameters.num_linked); - lib_query_unused_ids_tag(data); - } - - if (parameters.do_recursive) { - BKE_main_relations_free(bmain); - } -} - -void BKE_lib_query_unused_ids_tag(Main *bmain, const int tag, LibQueryUnusedIDsData ¶meters) -{ - BLI_assert(tag != 0); - - parameters.num_total.fill(0); - parameters.num_local.fill(0); - parameters.num_linked.fill(0); - - UnusedIDsData data(bmain, tag, parameters); - - if (parameters.do_recursive) { - BKE_main_relations_create(bmain, 0); - } - lib_query_unused_ids_tag(data); - if (parameters.do_recursive) { - BKE_main_relations_free(bmain); - } + BKE_main_relations_free(bmain); } static int foreach_libblock_used_linked_data_tag_clear_cb(LibraryIDLinkCallbackData *cb_data) diff --git a/source/blender/blenkernel/intern/lib_remap.cc b/source/blender/blenkernel/intern/lib_remap.cc index 99720c4a643..0fc9df39fc8 100644 --- a/source/blender/blenkernel/intern/lib_remap.cc +++ b/source/blender/blenkernel/intern/lib_remap.cc @@ -18,7 +18,7 @@ #include "DNA_object_types.h" #include "BKE_armature.hh" -#include "BKE_collection.hh" +#include "BKE_collection.h" #include "BKE_curve.hh" #include "BKE_layer.hh" #include "BKE_lib_id.hh" @@ -29,7 +29,7 @@ #include "BKE_mball.hh" #include "BKE_modifier.hh" #include "BKE_multires.hh" -#include "BKE_node.hh" +#include "BKE_node.h" #include "BKE_node_tree_update.hh" #include "BKE_object.hh" @@ -38,8 +38,6 @@ #include "lib_intern.hh" /* own include */ -using namespace blender::bke::id; - static CLG_LogRef LOG = {"bke.lib_remap"}; BKE_library_free_notifier_reference_cb free_notifier_reference_cb = nullptr; @@ -61,7 +59,7 @@ struct IDRemap { eIDRemapType type; Main *bmain; /* Only used to trigger depsgraph updates in the right bmain. */ - IDRemapper &id_remapper; + IDRemapper *id_remapper; /** The ID in which we are replacing old_id by new_id usages. */ ID *id_owner; @@ -105,7 +103,7 @@ static void foreach_libblock_remap_callback_apply(ID *id_owner, ID *id_self, ID **id_ptr, IDRemap *id_remap_data, - const IDRemapper &mappings, + const IDRemapper *mappings, const IDRemapperApplyOptions id_remapper_options, const int cb_flag, const bool is_indirect, @@ -118,16 +116,16 @@ static void foreach_libblock_remap_callback_apply(ID *id_owner, ID *old_id = *id_ptr; if (!violates_never_null) { - mappings.apply(id_ptr, id_remapper_options, id_self); + BKE_id_remapper_apply_ex(mappings, id_ptr, id_remapper_options, id_self); if (!skip_update_tagging) { if (id_remap_data->bmain != nullptr) { DEG_id_tag_update_ex(id_remap_data->bmain, id_self, - ID_RECALC_SYNC_TO_EVAL | ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY); + ID_RECALC_COPY_ON_WRITE | ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY); if (id_self != id_owner) { DEG_id_tag_update_ex(id_remap_data->bmain, id_owner, - ID_RECALC_SYNC_TO_EVAL | ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY); + ID_RECALC_COPY_ON_WRITE | ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY); } } if (GS(id_owner->name) == ID_NT) { @@ -197,15 +195,15 @@ static int foreach_libblock_remap_callback(LibraryIDLinkCallbackData *cb_data) return IDWALK_RET_NOP; } - IDRemapper &id_remapper = id_remap_data->id_remapper; + IDRemapper *id_remapper = id_remap_data->id_remapper; IDRemapperApplyOptions id_remapper_options = ID_REMAP_APPLY_DEFAULT; /* Used to cleanup all IDs used by a specific one. */ if (id_remap_data->type == ID_REMAP_TYPE_CLEANUP) { /* Clearing existing instance to reduce potential lookup times for IDs referencing many other * IDs. This makes sure that there will only be a single rule in the id_remapper. */ - id_remapper.clear(); - id_remapper.add(*id_p, nullptr); + BKE_id_remapper_clear(id_remapper); + BKE_id_remapper_add(id_remapper, *id_p, nullptr); } /* Better remap to nullptr than not remapping at all, @@ -214,9 +212,9 @@ static int foreach_libblock_remap_callback(LibraryIDLinkCallbackData *cb_data) id_remapper_options |= ID_REMAP_APPLY_UNMAP_WHEN_REMAPPING_TO_SELF; } - const IDRemapperApplyResult expected_mapping_result = id_remapper.get_mapping_result( - *id_p, id_remapper_options, id_self); - /* Exit when no modifications will be done, ensuring id->runtime counters won't changed. */ + const IDRemapperApplyResult expected_mapping_result = BKE_id_remapper_get_mapping_result( + id_remapper, *id_p, id_remapper_options, id_self); + /* Exit, when no modifications will be done; ensuring id->runtime counters won't changed. */ if (ELEM(expected_mapping_result, ID_REMAP_RESULT_SOURCE_UNAVAILABLE, ID_REMAP_RESULT_SOURCE_NOT_MAPPABLE)) @@ -249,18 +247,15 @@ static int foreach_libblock_remap_callback(LibraryIDLinkCallbackData *cb_data) id_owner->lib, (*id_p)->name, *id_p, - id_remapper.result_to_string(expected_mapping_result).c_str(), + BKE_id_remapper_result_string(expected_mapping_result), is_indirect, skip_indirect, is_reference, skip_reference); #endif - if ((id_remap_data->flag & ID_REMAP_STORE_NEVER_NULL_USAGE) && - (cb_flag & IDWALK_CB_NEVER_NULL) && - (expected_mapping_result == ID_REMAP_RESULT_SOURCE_UNASSIGNED)) - { - id_remapper.never_null_users_add(id_owner); + if ((id_remap_data->flag & ID_REMAP_FLAG_NEVER_NULL_USAGE) && (cb_flag & IDWALK_CB_NEVER_NULL)) { + id_owner->tag |= LIB_TAG_DOIT; } /* Special hack in case it's Object->data and we are in edit mode, and new_id is not nullptr @@ -297,7 +292,7 @@ static int foreach_libblock_remap_callback(LibraryIDLinkCallbackData *cb_data) static void libblock_remap_data_preprocess_ob(Object *ob, eIDRemapType remap_type, - const IDRemapper &id_remapper) + const IDRemapper *id_remapper) { if (ob->type != OB_ARMATURE) { return; @@ -308,7 +303,7 @@ static void libblock_remap_data_preprocess_ob(Object *ob, const bool is_cleanup_type = remap_type == ID_REMAP_TYPE_CLEANUP; /* Early exit when mapping, but no armature mappings present. */ - if (!is_cleanup_type && !id_remapper.contains_mappings_for_any(FILTER_ID_AR)) { + if (!is_cleanup_type && !BKE_id_remapper_has_mapping_for(id_remapper, FILTER_ID_AR)) { return; } @@ -318,8 +313,8 @@ static void libblock_remap_data_preprocess_ob(Object *ob, * Fortunately, this is just a tag, so we can accept to 'over-tag' a bit for pose recalc, * and avoid another complex and risky condition nightmare like the one we have in * foreach_libblock_remap_callback(). */ - const IDRemapperApplyResult expected_mapping_result = id_remapper.get_mapping_result( - static_cast(ob->data), ID_REMAP_APPLY_DEFAULT, nullptr); + const IDRemapperApplyResult expected_mapping_result = BKE_id_remapper_get_mapping_result( + id_remapper, static_cast(ob->data), ID_REMAP_APPLY_DEFAULT, nullptr); if (is_cleanup_type || expected_mapping_result == ID_REMAP_RESULT_SOURCE_REMAPPED) { ob->pose->flag |= POSE_RECALC; /* We need to clear pose bone pointers immediately, some code may access those before @@ -330,7 +325,7 @@ static void libblock_remap_data_preprocess_ob(Object *ob, static void libblock_remap_data_preprocess(ID *id_owner, eIDRemapType remap_type, - const IDRemapper &id_remapper) + const IDRemapper *id_remapper) { switch (GS(id_owner->name)) { case ID_OB: { @@ -429,8 +424,9 @@ static void libblock_remap_data_postprocess_nodetree_update(Main *bmain, ID *new ntreeUpdateAllUsers(bmain, new_id); } -static void libblock_remap_data_update_tags(ID *old_id, ID *new_id, IDRemap *id_remap_data) +static void libblock_remap_data_update_tags(ID *old_id, ID *new_id, void *user_data) { + IDRemap *id_remap_data = static_cast(user_data); const int remap_flags = id_remap_data->flag; if ((remap_flags & ID_REMAP_SKIP_USER_CLEAR) == 0) { /* XXX We may not want to always 'transfer' fake-user from old to new id... @@ -453,7 +449,9 @@ static void libblock_remap_data_update_tags(ID *old_id, ID *new_id, IDRemap *id_ } } -static void libblock_remap_reset_remapping_status_fn(ID *old_id, ID *new_id) +static void libblock_remap_reset_remapping_status_callback(ID *old_id, + ID *new_id, + void * /*user_data*/) { BKE_libblock_runtime_reset_remapping_status(old_id); if (new_id != nullptr) { @@ -485,16 +483,9 @@ static void libblock_remap_reset_remapping_status_fn(ID *old_id, ID *new_id) * (useful to retrieve info about remapping process). */ static void libblock_remap_data( - Main *bmain, ID *id, eIDRemapType remap_type, IDRemapper &id_remapper, const int remap_flags) + Main *bmain, ID *id, eIDRemapType remap_type, IDRemapper *id_remapper, const int remap_flags) { - IDRemap id_remap_data = { - /*.type=*/remap_type, - /*.bmain=*/bmain, - /*.id_remapper=*/id_remapper, - /*.id_owner=*/nullptr, - /*.flag=*/remap_flags, - }; - + IDRemap id_remap_data = {eIDRemapType(0)}; const bool include_ui = (remap_flags & ID_REMAP_FORCE_UI_POINTERS) != 0; const int foreach_id_flags = (((remap_flags & ID_REMAP_FORCE_INTERNAL_RUNTIME_POINTERS) != 0 ? IDWALK_DO_INTERNAL_RUNTIME_POINTERS : @@ -508,7 +499,13 @@ static void libblock_remap_data( IDWALK_DO_LIBRARY_POINTER : IDWALK_NOP)); - id_remapper.iter(libblock_remap_reset_remapping_status_fn); + id_remap_data.id_remapper = id_remapper; + id_remap_data.type = remap_type; + id_remap_data.bmain = bmain; + id_remap_data.id_owner = nullptr; + id_remap_data.flag = remap_flags; + + BKE_id_remapper_iter(id_remapper, libblock_remap_reset_remapping_status_callback, nullptr); if (id) { #ifdef DEBUG_PRINT @@ -527,7 +524,7 @@ static void libblock_remap_data( FOREACH_MAIN_ID_BEGIN (bmain, id_curr) { const uint64_t can_use_filter_id = BKE_library_id_can_use_filter_id(id_curr, include_ui); - const bool has_mapping = id_remapper.contains_mappings_for_any(can_use_filter_id); + const bool has_mapping = BKE_id_remapper_has_mapping_for(id_remapper, can_use_filter_id); /* Continue when id_remapper doesn't have any mappings that can be used by id_curr. */ if (!has_mapping) { @@ -547,20 +544,26 @@ static void libblock_remap_data( FOREACH_MAIN_ID_END; } - id_remapper.iter([&](ID *old_id, ID *new_id) { - libblock_remap_data_update_tags(old_id, new_id, &id_remap_data); - }); + BKE_id_remapper_iter(id_remapper, libblock_remap_data_update_tags, &id_remap_data); } -static void libblock_remap_foreach_idpair(ID *old_id, ID *new_id, Main *bmain, int remap_flags) +struct LibBlockRemapMultipleUserData { + Main *bmain; + int remap_flags; +}; + +static void libblock_remap_foreach_idpair_cb(ID *old_id, ID *new_id, void *user_data) { if (old_id == new_id) { return; } + LibBlockRemapMultipleUserData *data = static_cast(user_data); + Main *bmain = data->bmain; + const int remap_flags = data->remap_flags; + BLI_assert(old_id != nullptr); - BLI_assert((new_id == nullptr) || remap_flags & ID_REMAP_ALLOW_IDTYPE_MISMATCH || - GS(old_id->name) == GS(new_id->name)); + BLI_assert((new_id == nullptr) || GS(old_id->name) == GS(new_id->name)); if (free_notifier_reference_cb) { free_notifier_reference_cb(old_id); @@ -642,18 +645,20 @@ static void libblock_remap_foreach_idpair(ID *old_id, ID *new_id, Main *bmain, i BKE_libblock_runtime_reset_remapping_status(old_id); } -void BKE_libblock_remap_multiple_locked(Main *bmain, IDRemapper &mappings, const int remap_flags) +void BKE_libblock_remap_multiple_locked(Main *bmain, IDRemapper *mappings, const int remap_flags) { - if (mappings.is_empty()) { + if (BKE_id_remapper_is_empty(mappings)) { /* Early exit nothing to do. */ return; } libblock_remap_data(bmain, nullptr, ID_REMAP_TYPE_REMAP, mappings, remap_flags); - mappings.iter([&](ID *old_id, ID *new_id) { - libblock_remap_foreach_idpair(old_id, new_id, bmain, remap_flags); - }); + LibBlockRemapMultipleUserData user_data = {nullptr}; + user_data.bmain = bmain; + user_data.remap_flags = remap_flags; + + BKE_id_remapper_iter(mappings, libblock_remap_foreach_idpair_cb, &user_data); /* We assume editors do not hold references to their IDs... This is false in some cases * (Image is especially tricky here), @@ -666,9 +671,9 @@ void BKE_libblock_remap_multiple_locked(Main *bmain, IDRemapper &mappings, const DEG_relations_tag_update(bmain); } -void BKE_libblock_remap_multiple_raw(Main *bmain, IDRemapper &mappings, const int remap_flags) +void BKE_libblock_remap_multiple_raw(Main *bmain, IDRemapper *mappings, const int remap_flags) { - if (mappings.is_empty()) { + if (BKE_id_remapper_is_empty(mappings)) { /* Early exit nothing to do. */ return; } @@ -682,11 +687,12 @@ void BKE_libblock_remap_multiple_raw(Main *bmain, IDRemapper &mappings, const in void BKE_libblock_remap_locked(Main *bmain, void *old_idv, void *new_idv, const int remap_flags) { - IDRemapper remapper; + IDRemapper *remapper = BKE_id_remapper_create(); ID *old_id = static_cast(old_idv); ID *new_id = static_cast(new_idv); - remapper.add(old_id, new_id); + BKE_id_remapper_add(remapper, old_id, new_id); BKE_libblock_remap_multiple_locked(bmain, remapper, remap_flags); + BKE_id_remapper_free(remapper); } void BKE_libblock_remap(Main *bmain, void *old_idv, void *new_idv, const int remap_flags) @@ -698,7 +704,7 @@ void BKE_libblock_remap(Main *bmain, void *old_idv, void *new_idv, const int rem BKE_main_unlock(bmain); } -void BKE_libblock_remap_multiple(Main *bmain, IDRemapper &mappings, const int remap_flags) +void BKE_libblock_remap_multiple(Main *bmain, IDRemapper *mappings, const int remap_flags) { BKE_main_lock(bmain); @@ -707,9 +713,13 @@ void BKE_libblock_remap_multiple(Main *bmain, IDRemapper &mappings, const int re BKE_main_unlock(bmain); } -void BKE_libblock_unlink(Main *bmain, void *idv, const bool do_skip_indirect) +void BKE_libblock_unlink(Main *bmain, + void *idv, + const bool do_flag_never_null, + const bool do_skip_indirect) { - const int remap_flags = (do_skip_indirect ? ID_REMAP_SKIP_INDIRECT_USAGE : 0); + const int remap_flags = (do_skip_indirect ? ID_REMAP_SKIP_INDIRECT_USAGE : 0) | + (do_flag_never_null ? ID_REMAP_FLAG_NEVER_NULL_USAGE : 0); BKE_main_lock(bmain); @@ -726,11 +736,17 @@ void BKE_libblock_unlink(Main *bmain, void *idv, const bool do_skip_indirect) * ... sigh */ -static void libblock_relink_foreach_idpair(ID *old_id, - ID *new_id, - Main *bmain, - const blender::Span ids) +struct LibBlockRelinkMultipleUserData { + Main *bmain; + blender::Span ids; +}; + +static void libblock_relink_foreach_idpair_cb(ID *old_id, ID *new_id, void *user_data) { + LibBlockRelinkMultipleUserData *data = static_cast(user_data); + Main *bmain = data->bmain; + const blender::Span ids = data->ids; + BLI_assert(old_id != nullptr); BLI_assert((new_id == nullptr) || GS(old_id->name) == GS(new_id->name)); BLI_assert(old_id != new_id); @@ -782,10 +798,10 @@ static void libblock_relink_foreach_idpair(ID *old_id, void BKE_libblock_relink_multiple(Main *bmain, const blender::Span ids, const eIDRemapType remap_type, - IDRemapper &id_remapper, + IDRemapper *id_remapper, const int remap_flags) { - BLI_assert(remap_type == ID_REMAP_TYPE_REMAP || id_remapper.is_empty()); + BLI_assert(remap_type == ID_REMAP_TYPE_REMAP || BKE_id_remapper_is_empty(id_remapper)); for (ID *id_iter : ids) { libblock_remap_data(bmain, id_iter, remap_type, id_remapper, remap_flags); @@ -797,9 +813,9 @@ void BKE_libblock_relink_multiple(Main *bmain, switch (remap_type) { case ID_REMAP_TYPE_REMAP: { - id_remapper.iter([&](ID *old_id, ID *new_id) { - libblock_relink_foreach_idpair(old_id, new_id, bmain, ids); - }); + LibBlockRelinkMultipleUserData user_data = {bmain, ids}; + + BKE_id_remapper_iter(id_remapper, libblock_relink_foreach_idpair_cb, &user_data); break; } case ID_REMAP_TYPE_CLEANUP: { @@ -853,7 +869,7 @@ void BKE_libblock_relink_ex( blender::Array ids = {id}; /* No need to lock here, we are only affecting given ID, not bmain database. */ - IDRemapper id_remapper; + IDRemapper *id_remapper = BKE_id_remapper_create(); eIDRemapType remap_type = ID_REMAP_TYPE_REMAP; BLI_assert(id != nullptr); @@ -861,7 +877,7 @@ void BKE_libblock_relink_ex( if (old_id != nullptr) { BLI_assert((new_id == nullptr) || GS(old_id->name) == GS(new_id->name)); BLI_assert(old_id != new_id); - id_remapper.add(old_id, new_id); + BKE_id_remapper_add(id_remapper, old_id, new_id); } else { BLI_assert(new_id == nullptr); @@ -869,11 +885,13 @@ void BKE_libblock_relink_ex( } BKE_libblock_relink_multiple(bmain, ids, remap_type, id_remapper, remap_flags); + + BKE_id_remapper_free(id_remapper); } struct RelinkToNewIDData { blender::Vector ids; - IDRemapper id_remapper; + IDRemapper *id_remapper; }; static void libblock_relink_to_newid_prepare_data(Main *bmain, @@ -890,12 +908,12 @@ static int id_relink_to_newid_looper(LibraryIDLinkCallbackData *cb_data) Main *bmain = cb_data->bmain; ID **id_pointer = cb_data->id_pointer; ID *id = *id_pointer; - RelinkToNewIDData *relink_data = static_cast(cb_data->user_data); + RelinkToNewIDData *relink_data = (RelinkToNewIDData *)cb_data->user_data; if (id) { /* See: NEW_ID macro */ if (id->newid != nullptr) { - relink_data->id_remapper.add(id, id->newid); + BKE_id_remapper_add(relink_data->id_remapper, id, id->newid); id = id->newid; } if (id->tag & LIB_TAG_NEW) { @@ -927,6 +945,7 @@ void BKE_libblock_relink_to_newid(Main *bmain, ID *id, const int remap_flag) BLI_assert(bmain->relations == nullptr); RelinkToNewIDData relink_data{}; + relink_data.id_remapper = BKE_id_remapper_create(); libblock_relink_to_newid_prepare_data(bmain, id, &relink_data); @@ -934,4 +953,6 @@ void BKE_libblock_relink_to_newid(Main *bmain, ID *id, const int remap_flag) ID_REMAP_SKIP_OVERRIDE_LIBRARY; BKE_libblock_relink_multiple( bmain, relink_data.ids, ID_REMAP_TYPE_REMAP, relink_data.id_remapper, remap_flag_final); + + BKE_id_remapper_free(relink_data.id_remapper); } diff --git a/source/blender/blenkernel/intern/lib_remap_test.cc b/source/blender/blenkernel/intern/lib_remap_test.cc index c284fc66a36..a4bb0100094 100644 --- a/source/blender/blenkernel/intern/lib_remap_test.cc +++ b/source/blender/blenkernel/intern/lib_remap_test.cc @@ -16,7 +16,7 @@ #include "BKE_appdir.hh" #include "BKE_context.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_idtype.hh" #include "BKE_lib_id.hh" #include "BKE_lib_remap.hh" @@ -24,7 +24,7 @@ #include "BKE_mesh.hh" #include "BKE_node.hh" #include "BKE_object.hh" -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "IMB_imbuf.hh" @@ -32,8 +32,6 @@ #include "MEM_guardedalloc.h" -using namespace blender::bke::id; - namespace blender::bke::tests { class TestData { @@ -300,7 +298,7 @@ TEST(lib_remap, never_null_usage_flag_not_requested_on_delete) EXPECT_EQ(context.test_data.object->id.tag & LIB_TAG_DOIT, 0); } -TEST(lib_remap, never_null_usage_storage_requested_on_delete) +TEST(lib_remap, never_null_usage_flag_requested_on_delete) { Context context; @@ -308,19 +306,14 @@ TEST(lib_remap, never_null_usage_storage_requested_on_delete) EXPECT_EQ(context.test_data.object->data, context.test_data.mesh); EXPECT_EQ(context.test_data.object->id.tag & LIB_TAG_DOIT, 0); - /* Never null usage is requested so the owner ID (the Object) should be added to the set. */ - IDRemapper remapper; - remapper.add(&context.test_data.mesh->id, nullptr); - BKE_libblock_remap_multiple_locked( - context.test_data.bmain, - remapper, - (ID_REMAP_SKIP_NEVER_NULL_USAGE | ID_REMAP_STORE_NEVER_NULL_USAGE)); - - /* Never null usages un-assignment is not enforced (no #ID_REMAP_FORCE_NEVER_NULL_USAGE), - * so the object-data should still use the original mesh. */ + /* Never null usage is requested so the flag should be set. */ + BKE_libblock_remap(context.test_data.bmain, + context.test_data.mesh, + nullptr, + ID_REMAP_SKIP_NEVER_NULL_USAGE | ID_REMAP_FLAG_NEVER_NULL_USAGE); EXPECT_EQ(context.test_data.object->data, context.test_data.mesh); EXPECT_NE(context.test_data.object->data, nullptr); - EXPECT_TRUE(remapper.never_null_users().contains(&context.test_data.object->id)); + EXPECT_EQ(context.test_data.object->id.tag & LIB_TAG_DOIT, LIB_TAG_DOIT); } TEST(lib_remap, never_null_usage_flag_not_requested_on_remap) @@ -339,7 +332,7 @@ TEST(lib_remap, never_null_usage_flag_not_requested_on_remap) EXPECT_EQ(context.test_data.object->id.tag & LIB_TAG_DOIT, 0); } -TEST(lib_remap, never_null_usage_storage_requested_on_remap) +TEST(lib_remap, never_null_usage_flag_requested_on_remap) { Context context; Mesh *other_mesh = BKE_mesh_add(context.test_data.bmain, nullptr); @@ -348,16 +341,13 @@ TEST(lib_remap, never_null_usage_storage_requested_on_remap) EXPECT_EQ(context.test_data.object->data, context.test_data.mesh); EXPECT_EQ(context.test_data.object->id.tag & LIB_TAG_DOIT, 0); - /* Never null usage is requested, but the obdata is remapped to another Mesh, not to `nullptr`, - * so the `never_null_users` set should remain empty. */ - IDRemapper remapper; - remapper.add(&context.test_data.mesh->id, &other_mesh->id); - BKE_libblock_remap_multiple_locked( - context.test_data.bmain, - remapper, - (ID_REMAP_SKIP_NEVER_NULL_USAGE | ID_REMAP_STORE_NEVER_NULL_USAGE)); + /* Never null usage is requested so the flag should be set. */ + BKE_libblock_remap(context.test_data.bmain, + context.test_data.mesh, + other_mesh, + ID_REMAP_SKIP_NEVER_NULL_USAGE | ID_REMAP_FLAG_NEVER_NULL_USAGE); EXPECT_EQ(context.test_data.object->data, other_mesh); - EXPECT_TRUE(remapper.never_null_users().is_empty()); + EXPECT_EQ(context.test_data.object->id.tag & LIB_TAG_DOIT, LIB_TAG_DOIT); } /** \} */ diff --git a/source/blender/blenkernel/intern/library.cc b/source/blender/blenkernel/intern/library.cc index 2d9a43310f6..70c883ccd68 100644 --- a/source/blender/blenkernel/intern/library.cc +++ b/source/blender/blenkernel/intern/library.cc @@ -8,6 +8,10 @@ * Contains code specific to the `Library` ID type. */ +#include "CLG_log.h" + +#include "MEM_guardedalloc.h" + /* all types are needed here, in order to do memory operations */ #include "DNA_ID.h" @@ -17,10 +21,11 @@ #include "BLI_ghash.h" #include "BLI_set.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" -#include "BKE_bpath.hh" +#include "BKE_bpath.h" #include "BKE_idtype.hh" +#include "BKE_lib_id.hh" #include "BKE_lib_query.hh" #include "BKE_library.hh" #include "BKE_main.hh" @@ -83,7 +88,6 @@ static void library_blend_read_data(BlendDataReader * /*reader*/, ID *id) IDTypeInfo IDType_ID_LI = { /*id_code*/ ID_LI, /*id_filter*/ FILTER_ID_LI, - /*dependencies_id_types*/ FILTER_ID_LI, /*main_listbase_index*/ INDEX_ID_LI, /*struct_size*/ sizeof(Library), /*name*/ "Library", @@ -265,7 +269,7 @@ void BKE_library_main_rebuild_hierarchy(Main *bmain) } /* Otherwise, it's an indirectly used library with no known parent, another loop is needed to - * ensure all known hierarchy has valid indices when trying to find the best valid parent + * ansure all knwon hierarcy has valid indices when trying to find the best valid parent * library. */ } diff --git a/source/blender/blenkernel/intern/light.cc b/source/blender/blenkernel/intern/light.cc index 7d475b5da03..e09eceb2dbf 100644 --- a/source/blender/blenkernel/intern/light.cc +++ b/source/blender/blenkernel/intern/light.cc @@ -7,30 +7,34 @@ */ #include -#include #include "MEM_guardedalloc.h" /* Allow using deprecated functionality for .blend file I/O. */ #define DNA_DEPRECATED_ALLOW +#include "DNA_anim_types.h" #include "DNA_defaults.h" #include "DNA_light_types.h" +#include "DNA_material_types.h" #include "DNA_node_types.h" +#include "DNA_object_types.h" #include "DNA_scene_types.h" #include "DNA_texture_types.h" #include "BLI_utildefines.h" +#include "BKE_anim_data.h" #include "BKE_icons.h" #include "BKE_idtype.hh" #include "BKE_lib_id.hh" #include "BKE_lib_query.hh" #include "BKE_light.h" -#include "BKE_node.hh" +#include "BKE_main.hh" +#include "BKE_node.h" #include "BKE_preview_image.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DEG_depsgraph.hh" @@ -54,11 +58,7 @@ static void light_init_data(ID *id) * * \param flag: Copying options (see BKE_lib_id.hh's LIB_ID_COPY_... flags for more). */ -static void light_copy_data(Main *bmain, - std::optional owner_library, - ID *id_dst, - const ID *id_src, - const int flag) +static void light_copy_data(Main *bmain, ID *id_dst, const ID *id_src, const int flag) { Light *la_dst = (Light *)id_dst; const Light *la_src = (const Light *)id_src; @@ -72,11 +72,8 @@ static void light_copy_data(Main *bmain, la_dst->nodetree = ntreeLocalize(la_src->nodetree); } else { - BKE_id_copy_in_lib(bmain, - owner_library, - (ID *)la_src->nodetree, - (ID **)&la_dst->nodetree, - flag_private_id_data); + BKE_id_copy_ex( + bmain, (ID *)la_src->nodetree, (ID **)&la_dst->nodetree, flag_private_id_data); } la_dst->nodetree->owner_id = &la_dst->id; } @@ -160,7 +157,6 @@ static void light_blend_read_data(BlendDataReader *reader, ID *id) IDTypeInfo IDType_ID_LA = { /*id_code*/ ID_LA, /*id_filter*/ FILTER_ID_LA, - /*dependencies_id_types*/ FILTER_ID_TE, /*main_listbase_index*/ INDEX_ID_LA, /*struct_size*/ sizeof(Light), /*name*/ "Light", diff --git a/source/blender/blenkernel/intern/light_linking.cc b/source/blender/blenkernel/intern/light_linking.cc index 81838b91cde..4d8b5c660e4 100644 --- a/source/blender/blenkernel/intern/light_linking.cc +++ b/source/blender/blenkernel/intern/light_linking.cc @@ -16,12 +16,12 @@ #include "BLI_assert.h" #include "BLI_string.h" -#include "BKE_collection.hh" +#include "BKE_collection.h" #include "BKE_layer.hh" #include "BKE_lib_id.hh" -#include "BKE_report.hh" +#include "BKE_report.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DEG_depsgraph.hh" #include "DEG_depsgraph_build.hh" @@ -129,7 +129,7 @@ void BKE_light_linking_collection_assign(Main *bmain, { BKE_light_linking_collection_assign_only(object, new_collection, link_type); - DEG_id_tag_update(&object->id, ID_RECALC_SYNC_TO_EVAL | ID_RECALC_SHADING); + DEG_id_tag_update(&object->id, ID_RECALC_COPY_ON_WRITE | ID_RECALC_SHADING); DEG_relations_tag_update(bmain); } diff --git a/source/blender/blenkernel/intern/lightprobe.cc b/source/blender/blenkernel/intern/lightprobe.cc index dc1fe1bd011..a91dea3537a 100644 --- a/source/blender/blenkernel/intern/lightprobe.cc +++ b/source/blender/blenkernel/intern/lightprobe.cc @@ -17,12 +17,14 @@ #include "BLI_span.hh" #include "BLI_utildefines.h" +#include "BKE_anim_data.h" #include "BKE_idtype.hh" #include "BKE_lib_id.hh" #include "BKE_lib_query.hh" #include "BKE_lightprobe.h" +#include "BKE_main.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BLO_read_write.hh" @@ -53,7 +55,6 @@ static void lightprobe_blend_write(BlendWriter *writer, ID *id, const void *id_a IDTypeInfo IDType_ID_LP = { /*id_code*/ ID_LP, /*id_filter*/ FILTER_ID_LP, - /*dependencies_id_types*/ FILTER_ID_IM, /*main_listbase_index*/ INDEX_ID_LP, /*struct_size*/ sizeof(LightProbe), /*name*/ "LightProbe", diff --git a/source/blender/blenkernel/intern/linestyle.cc b/source/blender/blenkernel/intern/linestyle.cc index e83bfe745d3..7eb4e081232 100644 --- a/source/blender/blenkernel/intern/linestyle.cc +++ b/source/blender/blenkernel/intern/linestyle.cc @@ -9,8 +9,6 @@ #include #include #include -#include - #include #include "MEM_guardedalloc.h" @@ -25,8 +23,9 @@ #include "BLI_string_utils.hh" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" +#include "BKE_anim_data.h" #include "BKE_colorband.hh" #include "BKE_colortools.hh" #include "BKE_context.hh" @@ -35,6 +34,7 @@ #include "BKE_lib_id.hh" #include "BKE_lib_query.hh" #include "BKE_linestyle.h" +#include "BKE_main.hh" #include "BKE_node.hh" #include "BKE_node_tree_update.hh" #include "BKE_texture.h" @@ -52,11 +52,7 @@ static void linestyle_init_data(ID *id) BKE_linestyle_geometry_modifier_add(linestyle, nullptr, LS_MODIFIER_SAMPLING); } -static void linestyle_copy_data(Main *bmain, - std::optional owner_library, - ID *id_dst, - const ID *id_src, - const int flag) +static void linestyle_copy_data(Main *bmain, ID *id_dst, const ID *id_src, const int flag) { FreestyleLineStyle *linestyle_dst = (FreestyleLineStyle *)id_dst; const FreestyleLineStyle *linestyle_src = (const FreestyleLineStyle *)id_src; @@ -74,11 +70,10 @@ static void linestyle_copy_data(Main *bmain, } if (linestyle_src->nodetree) { - BKE_id_copy_in_lib(bmain, - owner_library, - (ID *)linestyle_src->nodetree, - (ID **)&linestyle_dst->nodetree, - flag_private_id_data); + BKE_id_copy_ex(bmain, + (ID *)linestyle_src->nodetree, + (ID **)&linestyle_dst->nodetree, + flag_private_id_data); linestyle_dst->nodetree->owner_id = &linestyle_dst->id; } @@ -650,7 +645,6 @@ static void linestyle_blend_read_data(BlendDataReader *reader, ID *id) IDTypeInfo IDType_ID_LS = { /*id_code*/ ID_LS, /*id_filter*/ FILTER_ID_LS, - /*dependencies_id_types*/ FILTER_ID_TE | FILTER_ID_OB, /*main_listbase_index*/ INDEX_ID_LS, /*struct_size*/ sizeof(FreestyleLineStyle), /*name*/ "FreestyleLineStyle", diff --git a/source/blender/blenkernel/intern/main.cc b/source/blender/blenkernel/intern/main.cc index a5c3568dfd3..ae4d61fe5bb 100644 --- a/source/blender/blenkernel/intern/main.cc +++ b/source/blender/blenkernel/intern/main.cc @@ -24,8 +24,8 @@ #include "DNA_ID.h" -#include "BKE_bpath.hh" -#include "BKE_global.hh" +#include "BKE_bpath.h" +#include "BKE_global.h" #include "BKE_idtype.hh" #include "BKE_lib_id.hh" #include "BKE_lib_query.hh" @@ -33,13 +33,11 @@ #include "BKE_main.hh" #include "BKE_main_idmap.hh" #include "BKE_main_namemap.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "IMB_imbuf.hh" #include "IMB_imbuf_types.hh" -using namespace blender::bke; - static CLG_LogRef LOG = {"bke.main"}; Main *BKE_main_new() @@ -260,7 +258,7 @@ static bool are_ids_from_different_mains_matching(Main *bmain_1, ID *id_1, Main static void main_merge_add_id_to_move(Main *bmain_dst, blender::Map> &id_map_dst, ID *id_src, - id::IDRemapper &id_remapper, + IDRemapper *id_remapper, blender::Vector &ids_to_move, const bool is_library, MainMergeReport &reports) @@ -289,7 +287,7 @@ static void main_merge_add_id_to_move(Main *bmain_dst, "found in given destination Main", id_src->name, bmain_dst->filepath); - id_remapper.add(id_src, nullptr); + BKE_id_remapper_add(id_remapper, id_src, nullptr); reports.num_unknown_ids++; } else { @@ -323,8 +321,8 @@ void BKE_main_merge(Main *bmain_dst, Main **r_bmain_src, MainMergeReport &report /* A dedicated remapper for libraries is needed because these need to be remapped _before_ IDs * are moved from `bmain_src` to `bmain_dst`, to avoid having to fix naming and ordering of IDs * afterwards (especially in case some source linked IDs become local in `bmain_dst`). */ - id::IDRemapper id_remapper; - id::IDRemapper id_remapper_libraries; + IDRemapper *id_remapper = BKE_id_remapper_create(); + IDRemapper *id_remapper_libraries = BKE_id_remapper_create(); blender::Vector ids_to_move; FOREACH_MAIN_ID_BEGIN (bmain_src, id_iter_src) { @@ -349,11 +347,11 @@ void BKE_main_merge(Main *bmain_dst, Main **r_bmain_src, MainMergeReport &report BLI_assert(!src_has_match_in_dst); if (!src_has_match_in_dst) { if (is_library) { - id_remapper_libraries.add(id_iter_src, id_iter_dst); + BKE_id_remapper_add(id_remapper_libraries, id_iter_src, id_iter_dst); reports.num_remapped_libraries++; } else { - id_remapper.add(id_iter_src, id_iter_dst); + BKE_id_remapper_add(id_remapper, id_iter_src, id_iter_dst); reports.num_remapped_ids++; } src_has_match_in_dst = true; @@ -428,6 +426,8 @@ void BKE_main_merge(Main *bmain_dst, Main **r_bmain_src, MainMergeReport &report BLI_assert(BKE_main_namemap_validate(bmain_dst)); + BKE_id_remapper_free(id_remapper); + BKE_id_remapper_free(id_remapper_libraries); BKE_main_free(bmain_src); *r_bmain_src = nullptr; } @@ -849,8 +849,6 @@ ListBase *which_libbase(Main *bmain, short type) return &(bmain->armatures); case ID_AC: return &(bmain->actions); - case ID_AN: - return &(bmain->animations); case ID_NT: return &(bmain->nodetrees); case ID_BR: @@ -896,7 +894,6 @@ int set_listbasepointers(Main *bmain, ListBase *lb[/*INDEX_ID_MAX*/]) /* Moved here to avoid problems when freeing with animato (aligorith). */ lb[INDEX_ID_AC] = &(bmain->actions); - lb[INDEX_ID_AN] = &(bmain->animations); lb[INDEX_ID_KE] = &(bmain->shapekeys); diff --git a/source/blender/blenkernel/intern/main_idmap.cc b/source/blender/blenkernel/intern/main_idmap.cc index ec70c8f0192..8fd262ed4c7 100644 --- a/source/blender/blenkernel/intern/main_idmap.cc +++ b/source/blender/blenkernel/intern/main_idmap.cc @@ -8,6 +8,7 @@ #include "MEM_guardedalloc.h" #include "BLI_ghash.h" +#include "BLI_listbase.h" #include "BLI_mempool.h" #include "BLI_utildefines.h" diff --git a/source/blender/blenkernel/intern/main_namemap.cc b/source/blender/blenkernel/intern/main_namemap.cc index c5526f92817..63e7645952e 100644 --- a/source/blender/blenkernel/intern/main_namemap.cc +++ b/source/blender/blenkernel/intern/main_namemap.cc @@ -401,7 +401,6 @@ bool BKE_main_namemap_get_name(Main *bmain, ID *id, char *name, const bool do_un * truncated name again. */ is_name_changed = true; } - return is_name_changed; } @@ -598,7 +597,7 @@ static bool main_namemap_validate_and_fix(Main *bmain, const bool do_fix) return is_valid; } - /* Clear all existing name-maps. */ + /* Clear all existing namemaps. */ BKE_main_namemap_clear(bmain); return is_valid; diff --git a/source/blender/blenkernel/intern/main_test.cc b/source/blender/blenkernel/intern/main_test.cc index b35280e4171..9c83a46e85f 100644 --- a/source/blender/blenkernel/intern/main_test.cc +++ b/source/blender/blenkernel/intern/main_test.cc @@ -11,7 +11,7 @@ #include "BLI_path_util.h" #include "BLI_string.h" -#include "BKE_collection.hh" +#include "BKE_collection.h" #include "BKE_idtype.hh" #include "BKE_lib_id.hh" #include "BKE_library.hh" diff --git a/source/blender/blenkernel/intern/mask.cc b/source/blender/blenkernel/intern/mask.cc index 05ef0ae3ed5..4119d577179 100644 --- a/source/blender/blenkernel/intern/mask.cc +++ b/source/blender/blenkernel/intern/mask.cc @@ -8,7 +8,6 @@ #include #include -#include #include "CLG_log.h" @@ -24,7 +23,7 @@ #include "BLI_string_utils.hh" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_defaults.h" #include "DNA_mask_types.h" @@ -33,7 +32,7 @@ #include "BKE_curve.hh" #include "BKE_idtype.hh" -#include "BKE_anim_data.hh" +#include "BKE_anim_data.h" #include "BKE_image.h" #include "BKE_lib_id.hh" #include "BKE_lib_query.hh" @@ -50,11 +49,7 @@ static CLG_LogRef LOG = {"bke.mask"}; -static void mask_copy_data(Main * /*bmain*/, - std::optional /*owner_library*/, - ID *id_dst, - const ID *id_src, - const int /*flag*/) +static void mask_copy_data(Main * /*bmain*/, ID *id_dst, const ID *id_src, const int /*flag*/) { Mask *mask_dst = (Mask *)id_dst; const Mask *mask_src = (const Mask *)id_src; @@ -189,7 +184,6 @@ static void mask_blend_read_data(BlendDataReader *reader, ID *id) IDTypeInfo IDType_ID_MSK = { /*id_code*/ ID_MSK, /*id_filter*/ FILTER_ID_MSK, - /*dependencies_id_types*/ FILTER_ID_MC, /* WARNING! mask->parent.id, not typed. */ /*main_listbase_index*/ INDEX_ID_MSK, /*struct_size*/ sizeof(Mask), /*name*/ "Mask", @@ -1509,7 +1503,7 @@ void BKE_mask_parent_init(MaskParent *parent) parent->id_type = ID_MC; } -/* *** animation/shape-key implementation *** +/* *** own animation/shape-key implementation *** * BKE_mask_layer_shape_XXX */ int BKE_mask_layer_shape_totvert(MaskLayer *masklay) diff --git a/source/blender/blenkernel/intern/mask_rasterize.cc b/source/blender/blenkernel/intern/mask_rasterize.cc index 1c6c6554a6e..5a71d941d36 100644 --- a/source/blender/blenkernel/intern/mask_rasterize.cc +++ b/source/blender/blenkernel/intern/mask_rasterize.cc @@ -71,7 +71,7 @@ #include "BKE_mask.h" -#include "BLI_strict_flags.h" /* Keep last. */ +#include "BLI_strict_flags.h" /* this is rather and annoying hack, use define to isolate it. * problem is caused by scanfill removing edges on us. */ diff --git a/source/blender/blenkernel/intern/material.cc b/source/blender/blenkernel/intern/material.cc index 5a82a48fa49..6f33d35c850 100644 --- a/source/blender/blenkernel/intern/material.cc +++ b/source/blender/blenkernel/intern/material.cc @@ -9,7 +9,6 @@ #include #include #include -#include #include "CLG_log.h" @@ -43,9 +42,9 @@ #include "BLI_string.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" -#include "BKE_anim_data.hh" +#include "BKE_anim_data.h" #include "BKE_attribute.hh" #include "BKE_brush.hh" #include "BKE_curve.hh" @@ -66,7 +65,7 @@ #include "BKE_object.hh" #include "BKE_object_types.hh" #include "BKE_preview_image.hh" -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "BKE_vfont.hh" #include "DEG_depsgraph.hh" @@ -92,11 +91,7 @@ static void material_init_data(ID *id) *((short *)id->name) = ID_MA; } -static void material_copy_data(Main *bmain, - std::optional owner_library, - ID *id_dst, - const ID *id_src, - const int flag) +static void material_copy_data(Main *bmain, ID *id_dst, const ID *id_src, const int flag) { Material *material_dst = (Material *)id_dst; const Material *material_src = (const Material *)id_src; @@ -110,11 +105,10 @@ static void material_copy_data(Main *bmain, material_dst->nodetree = ntreeLocalize(material_src->nodetree); } else { - BKE_id_copy_in_lib(bmain, - owner_library, - (ID *)material_src->nodetree, - (ID **)&material_dst->nodetree, - flag_private_id_data); + BKE_id_copy_ex(bmain, + (ID *)material_src->nodetree, + (ID **)&material_dst->nodetree, + flag_private_id_data); } material_dst->nodetree->owner_id = &material_dst->id; } @@ -237,7 +231,6 @@ static void material_blend_read_data(BlendDataReader *reader, ID *id) IDTypeInfo IDType_ID_MA = { /*id_code*/ ID_MA, /*id_filter*/ FILTER_ID_MA, - /*dependencies_id_types*/ FILTER_ID_TE | FILTER_ID_GR, /*main_listbase_index*/ INDEX_ID_MA, /*struct_size*/ sizeof(Material), /*name*/ "Material", @@ -557,7 +550,7 @@ void BKE_id_materials_copy(Main *bmain, ID *id_src, ID *id_dst) id_us_plus((ID *)(*matar_dst)[a]); } - DEG_id_tag_update(id_dst, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(id_dst, ID_RECALC_COPY_ON_WRITE); DEG_relations_tag_update(bmain); } } @@ -589,7 +582,7 @@ void BKE_id_material_resize(Main *bmain, ID *id, short totcol, bool do_id_user) } *totcolp = totcol; - DEG_id_tag_update(id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(id, ID_RECALC_COPY_ON_WRITE); DEG_relations_tag_update(bmain); } @@ -612,7 +605,7 @@ void BKE_id_material_append(Main *bmain, ID *id, Material *ma) id_us_plus((ID *)ma); BKE_objects_materials_test_all(bmain, id); - DEG_id_tag_update(id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(id, ID_RECALC_COPY_ON_WRITE); DEG_relations_tag_update(bmain); } } @@ -647,7 +640,7 @@ Material *BKE_id_material_pop(Main *bmain, ID *id, int index_i) material_data_index_remove_id(id, index); - DEG_id_tag_update(id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(id, ID_RECALC_COPY_ON_WRITE); DEG_relations_tag_update(bmain); } } @@ -673,7 +666,7 @@ void BKE_id_material_clear(Main *bmain, ID *id) BKE_objects_materials_test_all(bmain, id); material_data_index_clear_id(id); - DEG_id_tag_update(id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(id, ID_RECALC_COPY_ON_WRITE); DEG_relations_tag_update(bmain); } } @@ -922,7 +915,7 @@ void BKE_object_material_resize(Main *bmain, Object *ob, const short totcol, boo ob->actcol = ob->totcol; } - DEG_id_tag_update(&ob->id, ID_RECALC_SYNC_TO_EVAL | ID_RECALC_GEOMETRY); + DEG_id_tag_update(&ob->id, ID_RECALC_COPY_ON_WRITE | ID_RECALC_GEOMETRY); DEG_relations_tag_update(bmain); } @@ -1620,7 +1613,7 @@ void BKE_texpaint_slot_refresh_cache(Scene *scene, Material *ma, const Object *o } } - /* Copy-on-eval needed when adding texture slot on an object with no materials. + /* COW needed when adding texture slot on an object with no materials. * But do it only when slots actually change to avoid continuous depsgraph updates. */ if (ma->tot_slots != prev_tot_slots || ma->paint_active_slot != prev_paint_active_slot || ma->paint_clone_slot != prev_paint_clone_slot || @@ -1628,7 +1621,7 @@ void BKE_texpaint_slot_refresh_cache(Scene *scene, Material *ma, const Object *o memcmp(ma->texpaintslot, prev_texpaintslot, sizeof(*ma->texpaintslot) * ma->tot_slots) != 0)) { - DEG_id_tag_update(&ma->id, ID_RECALC_SHADING | ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&ma->id, ID_RECALC_SHADING | ID_RECALC_COPY_ON_WRITE); } MEM_SAFE_FREE(prev_texpaintslot); diff --git a/source/blender/blenkernel/intern/mball.cc b/source/blender/blenkernel/intern/mball.cc index 8002ed8dca4..35155663890 100644 --- a/source/blender/blenkernel/intern/mball.cc +++ b/source/blender/blenkernel/intern/mball.cc @@ -15,7 +15,6 @@ #include #include #include -#include #include "MEM_guardedalloc.h" @@ -29,26 +28,33 @@ #include "DNA_object_types.h" #include "DNA_scene_types.h" +#include "BLI_blenlib.h" #include "BLI_math_matrix.h" #include "BLI_math_rotation.h" #include "BLI_math_vector.h" #include "BLI_string_utils.hh" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_main.hh" +#include "BKE_anim_data.h" +#include "BKE_curve.hh" +#include "BKE_displist.h" #include "BKE_geometry_set.hh" #include "BKE_idtype.hh" #include "BKE_lattice.hh" #include "BKE_layer.hh" #include "BKE_lib_id.hh" #include "BKE_lib_query.hh" +#include "BKE_material.h" #include "BKE_mball.hh" #include "BKE_mball_tessellate.hh" +#include "BKE_mesh.hh" #include "BKE_object.hh" #include "BKE_object_types.hh" +#include "BKE_scene.h" #include "DEG_depsgraph.hh" @@ -65,11 +71,7 @@ static void metaball_init_data(ID *id) MEMCPY_STRUCT_AFTER(metaball, DNA_struct_default_get(MetaBall), id); } -static void metaball_copy_data(Main * /*bmain*/, - std::optional /*owner_library*/, - ID *id_dst, - const ID *id_src, - const int /*flag*/) +static void metaball_copy_data(Main * /*bmain*/, ID *id_dst, const ID *id_src, const int /*flag*/) { MetaBall *metaball_dst = (MetaBall *)id_dst; const MetaBall *metaball_src = (const MetaBall *)id_src; @@ -145,7 +147,6 @@ static void metaball_blend_read_data(BlendDataReader *reader, ID *id) IDTypeInfo IDType_ID_MB = { /*id_code*/ ID_MB, /*id_filter*/ FILTER_ID_MB, - /*dependencies_id_types*/ FILTER_ID_MA, /*main_listbase_index*/ INDEX_ID_MB, /*struct_size*/ sizeof(MetaBall), /*name*/ "Metaball", diff --git a/source/blender/blenkernel/intern/mball_tessellate.cc b/source/blender/blenkernel/intern/mball_tessellate.cc index b4548913e4b..11e2c999c8f 100644 --- a/source/blender/blenkernel/intern/mball_tessellate.cc +++ b/source/blender/blenkernel/intern/mball_tessellate.cc @@ -19,6 +19,7 @@ #include "DNA_object_types.h" #include "DNA_scene_types.h" +#include "BLI_listbase.h" #include "BLI_math_geom.h" #include "BLI_math_matrix.h" #include "BLI_math_rotation.h" @@ -28,16 +29,18 @@ #include "BLI_string_utils.hh" #include "BLI_utildefines.h" -#include "BKE_global.hh" +#include "BKE_displist.h" +#include "BKE_global.h" +#include "BKE_lib_id.hh" #include "BKE_mball_tessellate.hh" /* own include */ #include "BKE_mesh.hh" #include "BKE_object.hh" -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "DEG_depsgraph.hh" #include "DEG_depsgraph_query.hh" -#include "BLI_strict_flags.h" /* Keep last. */ +#include "BLI_strict_flags.h" /* experimental (faster) normal calculation (see #103021) */ #define USE_ACCUM_NORMAL @@ -1178,10 +1181,9 @@ static void init_meta(Depsgraph *depsgraph, PROCESS *process, Scene *scene, Obje const eEvaluationMode deg_eval_mode = DEG_get_mode(depsgraph); const short parenting_dupli_transflag = (OB_DUPLIFACES | OB_DUPLIVERTS); - copy_m4_m4( - obmat, - ob->object_to_world().ptr()); /* to cope with duplicators from BKE_scene_base_iter_next */ - invert_m4_m4(obinv, ob->object_to_world().ptr()); + copy_m4_m4(obmat, + ob->object_to_world); /* to cope with duplicators from BKE_scene_base_iter_next */ + invert_m4_m4(obinv, ob->object_to_world); BLI_string_split_name_number(ob->id.name + 2, '.', obname, &obnr); @@ -1230,13 +1232,13 @@ static void init_meta(Depsgraph *depsgraph, PROCESS *process, Scene *scene, Obje /* when metaball object has zero scale, then MetaElem to this MetaBall * will not be put to mainb array */ - if (has_zero_axis_m4(bob->object_to_world().ptr())) { + if (has_zero_axis_m4(bob->object_to_world)) { zero_size = 1; } else if (bob->parent) { Object *pob = bob->parent; while (pob) { - if (has_zero_axis_m4(pob->object_to_world().ptr())) { + if (has_zero_axis_m4(pob->object_to_world)) { zero_size = 1; break; } @@ -1300,7 +1302,7 @@ static void init_meta(Depsgraph *depsgraph, PROCESS *process, Scene *scene, Obje * rotation -> * ml local space */ - mul_m4_series((float(*)[4])new_ml->mat, obinv, bob->object_to_world().ptr(), pos, rot); + mul_m4_series((float(*)[4])new_ml->mat, obinv, bob->object_to_world, pos, rot); /* ml local space -> basis object space */ invert_m4_m4((float(*)[4])new_ml->imat, (float(*)[4])new_ml->mat); diff --git a/source/blender/blenkernel/intern/mesh.cc b/source/blender/blenkernel/intern/mesh.cc index 89e968be30f..c264feb9845 100644 --- a/source/blender/blenkernel/intern/mesh.cc +++ b/source/blender/blenkernel/intern/mesh.cc @@ -6,8 +6,6 @@ * \ingroup bke */ -#include - #include "MEM_guardedalloc.h" /* Allow using deprecated functionality for .blend file I/O. */ @@ -42,16 +40,16 @@ #include "BLI_vector.hh" #include "BLI_virtual_array.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" -#include "BKE_anim_data.hh" +#include "BKE_anim_data.h" #include "BKE_attribute.hh" #include "BKE_bake_data_block_id.hh" -#include "BKE_bpath.hh" +#include "BKE_bpath.h" #include "BKE_deform.hh" #include "BKE_editmesh.hh" #include "BKE_editmesh_cache.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_idtype.hh" #include "BKE_key.hh" #include "BKE_lib_id.hh" @@ -98,14 +96,10 @@ static void mesh_init_data(ID *id) mesh->runtime = new blender::bke::MeshRuntime(); - mesh->face_sets_color_seed = BLI_hash_int(BLI_time_now_seconds_i() & UINT_MAX); + mesh->face_sets_color_seed = BLI_hash_int(BLI_check_seconds_timer_i() & UINT_MAX); } -static void mesh_copy_data(Main *bmain, - std::optional owner_library, - ID *id_dst, - const ID *id_src, - const int flag) +static void mesh_copy_data(Main *bmain, ID *id_dst, const ID *id_src, const int flag) { Mesh *mesh_dst = reinterpret_cast(id_dst); const Mesh *mesh_src = reinterpret_cast(id_src); @@ -199,7 +193,7 @@ static void mesh_copy_data(Main *bmain, /* TODO: Do we want to add flag to prevent this? */ if (mesh_src->key && (flag & LIB_ID_COPY_SHAPEKEY)) { - BKE_id_copy_in_lib(bmain, owner_library, &mesh_src->key->id, (ID **)&mesh_dst->key, flag); + BKE_id_copy_ex(bmain, &mesh_src->key->id, (ID **)&mesh_dst->key, flag); /* XXX This is not nice, we need to make BKE_id_copy_ex fully re-entrant... */ mesh_dst->key->from = &mesh_dst->id; } @@ -298,7 +292,6 @@ static void mesh_blend_write(BlendWriter *writer, ID *id, const void *id_address } } - const blender::bke::MeshRuntime *mesh_runtime = mesh->runtime; mesh->runtime = nullptr; BLO_write_id_struct(writer, Mesh, id_address, &mesh->id); @@ -324,12 +317,7 @@ static void mesh_blend_write(BlendWriter *writer, ID *id, const void *id_address writer, &mesh->face_data, face_layers, mesh->faces_num, CD_MASK_MESH.pmask, &mesh->id); if (mesh->face_offset_indices) { - BLO_write_shared( - writer, - mesh->face_offset_indices, - sizeof(int) * mesh->faces_num, - mesh_runtime->face_offsets_sharing_info, - [&]() { BLO_write_int32_array(writer, mesh->faces_num + 1, mesh->face_offset_indices); }); + BLO_write_int32_array(writer, mesh->faces_num + 1, mesh->face_offset_indices); } } @@ -375,11 +363,9 @@ static void mesh_blend_read_data(BlendDataReader *reader, ID *id) mesh->runtime = new blender::bke::MeshRuntime(); if (mesh->face_offset_indices) { - mesh->runtime->face_offsets_sharing_info = BLO_read_shared( - reader, &mesh->face_offset_indices, [&]() { - BLO_read_int32_array(reader, mesh->faces_num + 1, &mesh->face_offset_indices); - return blender::implicit_sharing::info_for_mem_free(mesh->face_offset_indices); - }); + BLO_read_int32_array(reader, mesh->faces_num + 1, &mesh->face_offset_indices); + mesh->runtime->face_offsets_sharing_info = blender::implicit_sharing::info_for_mem_free( + mesh->face_offset_indices); } if (mesh->mselect == nullptr) { @@ -397,7 +383,6 @@ static void mesh_blend_read_data(BlendDataReader *reader, ID *id) IDTypeInfo IDType_ID_ME = { /*id_code*/ ID_ME, /*id_filter*/ FILTER_ID_ME, - /*dependencies_id_types*/ FILTER_ID_ME | FILTER_ID_MA | FILTER_ID_IM | FILTER_ID_KE, /*main_listbase_index*/ INDEX_ID_ME, /*struct_size*/ sizeof(Mesh), /*name*/ "Mesh", @@ -717,26 +702,6 @@ Mesh *BKE_mesh_new_nomain(const int verts_num, return mesh; } -namespace blender::bke { - -Mesh *mesh_new_no_attributes(const int verts_num, - const int edges_num, - const int faces_num, - const int corners_num) -{ - Mesh *mesh = BKE_mesh_new_nomain(0, 0, faces_num, 0); - mesh->verts_num = verts_num; - mesh->edges_num = edges_num; - mesh->corners_num = corners_num; - CustomData_free_layer_named(&mesh->vert_data, "position", 0); - CustomData_free_layer_named(&mesh->edge_data, ".edge_verts", 0); - CustomData_free_layer_named(&mesh->corner_data, ".corner_vert", 0); - CustomData_free_layer_named(&mesh->corner_data, ".corner_edge", 0); - return mesh; -} - -} // namespace blender::bke - static void copy_attribute_names(const Mesh &mesh_src, Mesh &mesh_dst) { if (mesh_src.active_color_attribute) { @@ -774,7 +739,7 @@ void BKE_mesh_copy_parameters(Mesh *me_dst, const Mesh *me_src) void BKE_mesh_copy_parameters_for_eval(Mesh *me_dst, const Mesh *me_src) { /* User counts aren't handled, don't copy into a mesh from #G_MAIN. */ - BLI_assert(me_dst->id.tag & (LIB_TAG_NO_MAIN | LIB_TAG_COPIED_ON_EVAL)); + BLI_assert(me_dst->id.tag & (LIB_TAG_NO_MAIN | LIB_TAG_COPIED_ON_WRITE)); BKE_mesh_copy_parameters(me_dst, me_src); copy_attribute_names(*me_src, *me_dst); diff --git a/source/blender/geometry/intern/mesh_boolean.cc b/source/blender/blenkernel/intern/mesh_boolean_convert.cc similarity index 70% rename from source/blender/geometry/intern/mesh_boolean.cc rename to source/blender/blenkernel/intern/mesh_boolean_convert.cc index ddcb85427c9..c0d7fce42b9 100644 --- a/source/blender/geometry/intern/mesh_boolean.cc +++ b/source/blender/blenkernel/intern/mesh_boolean_convert.cc @@ -2,11 +2,19 @@ * * SPDX-License-Identifier: GPL-2.0-or-later */ +/** \file + * \ingroup bke + */ + #include +#include "DNA_object_types.h" + #include "BKE_attribute.hh" #include "BKE_customdata.hh" +#include "BKE_material.h" #include "BKE_mesh.hh" +#include "BKE_mesh_boolean_convert.hh" #include "BLI_alloca.h" #include "BLI_array.hh" @@ -21,20 +29,7 @@ #include "BLI_task.hh" #include "BLI_virtual_array.hh" -#include "DNA_node_types.h" - -#include "GEO_mesh_boolean.hh" - -#include "bmesh.hh" -#include "bmesh_tools.hh" -#include "tools/bmesh_boolean.hh" -#include "tools/bmesh_intersect.hh" - -namespace blender::geometry::boolean { - -/* -------------------------------------------------------------------- */ -/** \name Mesh Arrangements (Old Exact Boolean) - * \{ */ +namespace blender::meshintersect { #ifdef WITH_GMP @@ -85,9 +80,9 @@ class MeshesToIMeshInfo { Array mesh_face_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; + Array mesh_to_imesh_vert; /* Similarly for each Mesh face. */ - Array mesh_to_imesh_face; + 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_target_transform; @@ -237,12 +232,12 @@ void MeshesToIMeshInfo::input_medge_for_orig_index(int orig_index, * correspondence between the Mesh MVerts/MPolys and the IMesh Verts/Faces. * All allocation of memory for the IMesh comes from `arena`. */ -static meshintersect::IMesh meshes_to_imesh(Span meshes, - Span obmats, - Span> material_remaps, - const float4x4 &target_transform, - meshintersect::IMeshArena &arena, - MeshesToIMeshInfo *r_info) +static IMesh meshes_to_imesh(Span meshes, + Span obmats, + Span> material_remaps, + const float4x4 &target_transform, + IMeshArena &arena, + MeshesToIMeshInfo *r_info) { int nmeshes = meshes.size(); BLI_assert(nmeshes > 0); @@ -279,7 +274,7 @@ static meshintersect::IMesh meshes_to_imesh(Span meshes, /* 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_vert; Vector face_edge_orig; /* To convert the coordinates of meshes 1, 2, etc. into the local space @@ -310,7 +305,7 @@ static meshintersect::IMesh meshes_to_imesh(Span meshes, * that would have a negative transform if you do that. */ bool need_face_flip = r_info->has_negative_transform[mi] != r_info->has_negative_transform[0]; - Vector verts(mesh->verts_num); + Vector verts(mesh->verts_num); const Span vert_positions = mesh->vert_positions(); const OffsetIndices faces = mesh->faces(); const Span corner_verts = mesh->corner_verts(); @@ -326,7 +321,7 @@ static meshintersect::IMesh meshes_to_imesh(Span meshes, float3 co = vert_positions[i]; mpq3 mco = mpq3(co.x, co.y, co.z); double3 dco(mco[0].get_d(), mco[1].get_d(), mco[2].get_d()); - verts[i] = new meshintersect::Vert(mco, dco, meshintersect::NO_INDEX, i); + verts[i] = new Vert(mco, dco, NO_INDEX, i); } }); } @@ -336,7 +331,7 @@ static meshintersect::IMesh meshes_to_imesh(Span meshes, float3 co = math::transform_point(r_info->to_target_transform[mi], vert_positions[i]); mpq3 mco = mpq3(co.x, co.y, co.z); double3 dco(mco[0].get_d(), mco[1].get_d(), mco[2].get_d()); - verts[i] = new meshintersect::Vert(mco, dco, meshintersect::NO_INDEX, i); + verts[i] = new Vert(mco, dco, NO_INDEX, i); } }); } @@ -353,7 +348,7 @@ static meshintersect::IMesh meshes_to_imesh(Span meshes, for (int i = 0; i < flen; ++i) { const int corner_i = face[i]; int mverti = r_info->mesh_vert_offset[mi] + corner_verts[corner_i]; - const meshintersect::Vert *fv = r_info->mesh_to_imesh_vert[mverti]; + const Vert *fv = r_info->mesh_to_imesh_vert[mverti]; if (need_face_flip) { face_vert[flen - i - 1] = fv; int iedge = i < flen - 1 ? flen - i - 2 : flen - 1; @@ -369,7 +364,7 @@ static meshintersect::IMesh meshes_to_imesh(Span meshes, } e += mesh->edges_num; } - return meshintersect::IMesh(r_info->mesh_to_imesh_face); + return IMesh(r_info->mesh_to_imesh_face); } /* Copy vertex attributes, including customdata, from `orig_mv` to `mv`. @@ -467,7 +462,7 @@ static void copy_edge_attributes(Mesh *dest_mesh, * For now, we only try to do this if `face` and `orig_face` have the same size. * Return the number of non-null MLoops filled in. */ -static int fill_orig_loops(const meshintersect::Face *f, +static int fill_orig_loops(const Face *f, const IndexRange orig_face, const Mesh *orig_me, int orig_me_index, @@ -489,7 +484,7 @@ static int fill_orig_loops(const meshintersect::Face *f, * aligned loops is only an optimization to avoid some re-interpolation. */ int first_orig_v = f->vert[0]->orig; - if (first_orig_v == meshintersect::NO_INDEX) { + if (first_orig_v == NO_INDEX) { return 0; } /* It is possible that the original vert was merged with another in another mesh. */ @@ -516,20 +511,20 @@ static int fill_orig_loops(const meshintersect::Face *f, int orig_mp_loop_index = (mp_loop_index + offset) % orig_mplen; const int vert_i = orig_corner_verts[orig_face.start() + orig_mp_loop_index]; int fv_orig = f->vert[mp_loop_index]->orig; - if (fv_orig != meshintersect::NO_INDEX) { + if (fv_orig != NO_INDEX) { fv_orig -= orig_me_vert_offset; if (fv_orig < 0 || fv_orig >= orig_me->verts_num) { - fv_orig = meshintersect::NO_INDEX; + fv_orig = NO_INDEX; } } if (vert_i == fv_orig) { const int vert_next = orig_corner_verts[orig_face.start() + ((orig_mp_loop_index + 1) % orig_mplen)]; int fvnext_orig = f->vert[(mp_loop_index + 1) % orig_mplen]->orig; - if (fvnext_orig != meshintersect::NO_INDEX) { + if (fvnext_orig != NO_INDEX) { fvnext_orig -= orig_me_vert_offset; if (fvnext_orig < 0 || fvnext_orig >= orig_me->verts_num) { - fvnext_orig = meshintersect::NO_INDEX; + fvnext_orig = NO_INDEX; } } if (vert_next == fvnext_orig) { @@ -569,7 +564,7 @@ static void get_poly2d_cos(const Mesh *mesh, * copy the Loop attributes from corresponding loops to corresponding loops. * Otherwise, interpolate the Loop attributes in the face `orig_face`. */ static void copy_or_interp_loop_attributes(Mesh *dest_mesh, - const meshintersect::Face *f, + const Face *f, const IndexRange face, const IndexRange orig_face, const Mesh *orig_me, @@ -708,7 +703,7 @@ static void merge_edge_customdata_layers(Mesh *target, MeshesToIMeshInfo &mim) * 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(meshintersect::IMesh *im, MeshesToIMeshInfo &mim) +static Mesh *imesh_to_mesh(IMesh *im, MeshesToIMeshInfo &mim) { constexpr int dbg_level = 0; @@ -716,7 +711,7 @@ static Mesh *imesh_to_mesh(meshintersect::IMesh *im, MeshesToIMeshInfo &mim) int out_totvert = im->vert_size(); int out_faces_num = im->face_size(); int out_totloop = 0; - for (const meshintersect::Face *f : im->faces()) { + for (const Face *f : im->faces()) { out_totloop += f->size(); } /* Will calculate edges later. */ @@ -727,8 +722,8 @@ static Mesh *imesh_to_mesh(meshintersect::IMesh *im, MeshesToIMeshInfo &mim) /* Set the vertex coordinate values and other data. */ MutableSpan positions = result->vert_positions_for_write(); for (int vi : im->vert_index_range()) { - const meshintersect::Vert *v = im->vert(vi); - if (v->orig != meshintersect::NO_INDEX) { + const Vert *v = im->vert(vi); + if (v->orig != NO_INDEX) { const Mesh *orig_me; int index_in_orig_me; mim.input_mvert_for_orig_index(v->orig, &orig_me, &index_in_orig_me); @@ -746,7 +741,7 @@ static Mesh *imesh_to_mesh(meshintersect::IMesh *im, MeshesToIMeshInfo &mim) MutableSpan dst_corner_verts = result->corner_verts_for_write(); MutableSpan dst_face_offsets = result->face_offsets_for_write(); for (int fi : im->face_index_range()) { - const meshintersect::Face *f = im->face(fi); + const Face *f = im->face(fi); const Mesh *orig_me; int index_in_orig_me; int orig_me_index; @@ -754,7 +749,7 @@ static Mesh *imesh_to_mesh(meshintersect::IMesh *im, MeshesToIMeshInfo &mim) f->orig, &orig_me, &orig_me_index, &index_in_orig_me); dst_face_offsets[fi] = cur_loop_index; for (int j : f->index_range()) { - const meshintersect::Vert *vf = f->vert[j]; + const Vert *vf = f->vert[j]; const int vfi = im->lookup_vert(vf); dst_corner_verts[cur_loop_index] = vfi; ++cur_loop_index; @@ -786,10 +781,10 @@ static Mesh *imesh_to_mesh(meshintersect::IMesh *im, MeshesToIMeshInfo &mim) const OffsetIndices dst_polys = result->faces(); const Span dst_corner_edges = result->corner_edges(); for (int fi : im->face_index_range()) { - const meshintersect::Face *f = im->face(fi); + const Face *f = im->face(fi); const IndexRange face = dst_polys[fi]; for (int j : f->index_range()) { - if (f->edge_orig[j] != meshintersect::NO_INDEX) { + if (f->edge_orig[j] != NO_INDEX) { const Mesh *orig_me; int index_in_orig_me; mim.input_medge_for_orig_index(f->edge_orig[j], &orig_me, &index_in_orig_me); @@ -805,29 +800,18 @@ static Mesh *imesh_to_mesh(meshintersect::IMesh *im, MeshesToIMeshInfo &mim) return result; } -static meshintersect::BoolOpType operation_to_mesh_arr_mode(const Operation operation) -{ - switch (operation) { - case Operation::Intersect: - return meshintersect::BoolOpType::Intersect; - case Operation::Union: - return meshintersect::BoolOpType::Union; - case Operation::Difference: - return meshintersect::BoolOpType::Difference; - } - BLI_assert_unreachable(); - return meshintersect::BoolOpType::None; -} +#endif // WITH_GMP -static Mesh *mesh_boolean_mesh_arr(Span meshes, - Span transforms, - const float4x4 &target_transform, - Span> material_remaps, - const bool use_self, - const bool hole_tolerant, - const meshintersect::BoolOpType boolean_mode, - Vector *r_intersecting_edges) +Mesh *direct_mesh_boolean(Span meshes, + Span transforms, + const float4x4 &target_transform, + Span> material_remaps, + const bool use_self, + const bool hole_tolerant, + const int boolean_mode, + Vector *r_intersecting_edges) { +#ifdef WITH_GMP BLI_assert(transforms.is_empty() || meshes.size() == transforms.size()); BLI_assert(material_remaps.is_empty() || material_remaps.size() == meshes.size()); if (meshes.size() <= 0) { @@ -836,12 +820,11 @@ static Mesh *mesh_boolean_mesh_arr(Span meshes, const int dbg_level = 0; if (dbg_level > 0) { - std::cout << "\nOLD_MESH_INTERSECT, nmeshes = " << meshes.size() << "\n"; + std::cout << "\nDIRECT_MESH_INTERSECT, nmeshes = " << meshes.size() << "\n"; } MeshesToIMeshInfo mim; - meshintersect::IMeshArena arena; - meshintersect::IMesh m_in = meshes_to_imesh( - meshes, transforms, material_remaps, target_transform, arena, &mim); + IMeshArena arena; + IMesh m_in = meshes_to_imesh(meshes, transforms, material_remaps, target_transform, arena, &mim); std::function shape_fn = [&mim](int f) { for (int mi = 0; mi < mim.mesh_face_offset.size() - 1; ++mi) { if (f < mim.mesh_face_offset[mi + 1]) { @@ -850,8 +833,14 @@ static Mesh *mesh_boolean_mesh_arr(Span meshes, } return int(mim.mesh_face_offset.size()) - 1; }; - meshintersect::IMesh m_out = boolean_mesh( - m_in, boolean_mode, meshes.size(), shape_fn, use_self, hole_tolerant, nullptr, &arena); + IMesh m_out = boolean_mesh(m_in, + static_cast(boolean_mode), + meshes.size(), + shape_fn, + use_self, + hole_tolerant, + nullptr, + &arena); if (dbg_level > 0) { std::cout << m_out; write_obj_mesh(m_out, "m_out"); @@ -864,7 +853,7 @@ static Mesh *mesh_boolean_mesh_arr(Span meshes, const OffsetIndices faces = result->faces(); const Span corner_edges = result->corner_edges(); for (int fi : m_out.face_index_range()) { - const meshintersect::Face &face = *m_out.face(fi); + const Face &face = *m_out.face(fi); const IndexRange mesh_face = faces[fi]; for (int i : face.index_range()) { if (face.is_intersect[i]) { @@ -876,318 +865,17 @@ static Mesh *mesh_boolean_mesh_arr(Span meshes, } return result; -} - +#else // WITH_GMP + UNUSED_VARS(meshes, + transforms, + material_remaps, + target_transform, + use_self, + hole_tolerant, + boolean_mode, + r_intersecting_edges); + return nullptr; #endif // WITH_GMP - -/** \} */ - -/* -------------------------------------------------------------------- */ -/** \name Float Boolean - * \{ */ - -/* has no meaning for faces, do this so we can tell which face is which */ -#define BM_FACE_TAG BM_ELEM_DRAW - -/** - * Function use to say what operand a face is part of, based on the `BM_FACE_TAG`,` - * which is set in `bm_mesh_create`. - */ -static int face_boolean_operand(BMFace *f, void * /*user_data*/) -{ - return BM_elem_flag_test(f, BM_FACE_TAG) ? 0 : 1; } -/* Create a BMesh that is the concatenation of the given meshes. - * The corresponding mesh-to-world transformations are also given, - * as well as a target_tranform. - * A triangulation is also calculated and returned in the last two - * parameters. - * The faces of the first mesh are tagged with BM_FACE_TAG so that the - * face_boolean_operand() function can distinguish those faces from the - * rest. - * The caller is responsible for using `BM_mesh_free` on the returned - * BMesh, and calling `MEM_freeN` on the returned looptris. - * - * TODO: maybe figure out how to use the join_geometries() function - * to join all the meshes into one mesh first, and then convert - * that single mesh to BMesh. Issues with that include needing - * to apply the transforms and material remaps. - */ -static BMesh *mesh_bm_concat(Span meshes, - Span transforms, - const float4x4 &target_transform, - Span> material_remaps, - BMLoop *(**r_looptris)[3], - int *r_looptris_tot) -{ - const int meshes_num = meshes.size(); - BLI_assert(meshes_num >= 1); - bool ok; - float4x4 inv_target_mat = math::invert(target_transform, ok); - if (!ok) { - BLI_assert_unreachable(); - inv_target_mat = float4x4::identity(); - } - Array to_target(meshes_num); - Array is_negative_transform(meshes_num); - Array is_flip(meshes_num); - const int tsize = transforms.size(); - for (const int i : IndexRange(meshes_num)) { - if (tsize > i) { - to_target[i] = inv_target_mat * transforms[i]; - is_negative_transform[i] = math::is_negative(transforms[i]); - is_flip[i] = is_negative_transform[i] != is_negative_transform[0]; - } - else { - to_target[i] = inv_target_mat; - is_negative_transform[i] = false; - is_flip[i] = false; - } - } - - /* Make a BMesh that will be a concatenation of the elements of all the meshes */ - BMAllocTemplate allocsize; - allocsize.totvert = 0; - allocsize.totedge = 0; - allocsize.totloop = 0; - allocsize.totface = 0; - for (const int i : meshes.index_range()) { - allocsize.totvert += meshes[i]->verts_num; - allocsize.totedge += meshes[i]->edges_num; - allocsize.totloop += meshes[i]->corners_num; - allocsize.totface += meshes[i]->faces_num; - } - - BMeshCreateParams bmesh_create_params{}; - BMesh *bm = BM_mesh_create(&allocsize, &bmesh_create_params); - - BM_mesh_copy_init_customdata_from_mesh_array( - bm, const_cast(meshes.begin()), meshes_num, &allocsize); - - BMeshFromMeshParams bmesh_from_mesh_params{}; - bmesh_from_mesh_params.calc_face_normal = true; - bmesh_from_mesh_params.calc_vert_normal = true; - - Array verts_end(meshes_num); - Array faces_end(meshes_num); - verts_end[0] = meshes[0]->verts_num; - faces_end[0] = meshes[0]->faces_num; - for (const int i : meshes.index_range()) { - /* Append meshes[i] elements and data to bm. */ - BM_mesh_bm_from_me(bm, meshes[i], &bmesh_from_mesh_params); - if (i > 0) { - verts_end[i] = verts_end[i - 1] + meshes[i]->verts_num; - faces_end[i] = faces_end[i - 1] + meshes[i]->faces_num; - if (is_flip[i]) { - /* Need to flip face normals to match that of mesh[0]. */ - const int cd_loop_mdisp_offset = CustomData_get_offset(&bm->ldata, CD_MDISPS); - BM_mesh_elem_table_ensure(bm, BM_FACE); - for (int j = faces_end[i - 1]; j < faces_end[i]; j++) { - BMFace *efa = bm->ftable[j]; - BM_face_normal_flip_ex(bm, efa, cd_loop_mdisp_offset, true); - } - } - } - } - - /* Make a triangulation of all polys before transforming vertices - * so we can use the original normals. */ - const int looptris_tot = poly_to_tri_count(bm->totface, bm->totloop); - BMLoop *(*looptris)[3] = (BMLoop * (*)[3]) - MEM_malloc_arrayN(looptris_tot, sizeof(*looptris), __func__); - BM_mesh_calc_tessellation_beauty(bm, looptris); - *r_looptris = looptris; - *r_looptris_tot = looptris_tot; - - /* Tranform the vertices that into the desired target_transform space. */ - BMIter iter; - BMVert *eve; - int i = 0; - int mesh_index = 0; - BM_ITER_MESH (eve, &iter, bm, BM_VERTS_OF_MESH) { - copy_v3_v3(eve->co, math::transform_point(to_target[mesh_index], float3(eve->co))); - ++i; - if (i == verts_end[mesh_index]) { - mesh_index++; - } - } - - /* Transform face normals and tag the first-operand faces. - * Also, apply material remaps. */ - BMFace *efa; - i = 0; - mesh_index = 0; - BM_ITER_MESH (efa, &iter, bm, BM_FACES_OF_MESH) { - copy_v3_v3(efa->no, math::transform_direction(to_target[mesh_index], float3(efa->no))); - if (is_negative_transform[mesh_index]) { - negate_v3(efa->no); - } - normalize_v3(efa->no); - - /* Temp tag used in `face_boolean_operand()` to test for operand 0. */ - if (i < faces_end[0]) { - BM_elem_flag_enable(efa, BM_FACE_TAG); - } - - /* Remap material. */ - int cur_mat = efa->mat_nr; - if (cur_mat < material_remaps[mesh_index].size()) { - int new_mat = material_remaps[mesh_index][cur_mat]; - if (new_mat >= 0) { - efa->mat_nr = material_remaps[mesh_index][cur_mat]; - } - } - - ++i; - if (i == faces_end[mesh_index]) { - mesh_index++; - } - } - - return bm; -} - -static int operation_to_float_mode(const Operation operation) -{ - switch (operation) { - case Operation::Intersect: - return BMESH_ISECT_BOOLEAN_ISECT; - case Operation::Union: - return BMESH_ISECT_BOOLEAN_UNION; - case Operation::Difference: - return BMESH_ISECT_BOOLEAN_DIFFERENCE; - } - BLI_assert_unreachable(); - return BMESH_ISECT_BOOLEAN_NONE; -} - -static Mesh *mesh_boolean_float(Span meshes, - Span transforms, - const float4x4 &target_transform, - Span> material_remaps, - const int boolean_mode, - Vector * /*r_intersecting_edges*/) -{ - BLI_assert(meshes.size() == transforms.size() || transforms.size() == 0); - BLI_assert(material_remaps.size() == 0 || material_remaps.size() == meshes.size()); - if (meshes.is_empty()) { - return nullptr; - } - - if (meshes.size() == 1) { - /* The float solver doesn't do self union. Just return nullptr, which will - * cause geometry nodes to leave the input as is. */ - return BKE_mesh_copy_for_eval(meshes[0]); - } - - BMLoop *(*looptris)[3]; - int looptris_tot; - if (meshes.size() == 2) { - BMesh *bm = mesh_bm_concat( - meshes, transforms, target_transform, material_remaps, &looptris, &looptris_tot); - BM_mesh_intersect(bm, - looptris, - looptris_tot, - face_boolean_operand, - nullptr, - false, - false, - true, - true, - false, - false, - boolean_mode, - 1e-6f); - MEM_freeN(looptris); - Mesh *result = BKE_mesh_from_bmesh_for_eval_nomain(bm, nullptr, meshes[0]); - BM_mesh_free(bm); - return result; - } - - /* Iteratively operate with each operand. */ - Array two_meshes = {meshes[0], meshes[1]}; - Array two_transforms = {transforms[0], transforms[1]}; - Array> two_remaps = {material_remaps[0], material_remaps[1]}; - Mesh *prev_result_mesh = nullptr; - for (const int i : meshes.index_range().drop_back(1)) { - BMesh *bm = mesh_bm_concat( - two_meshes, two_transforms, float4x4::identity(), two_remaps, &looptris, &looptris_tot); - BM_mesh_intersect(bm, - looptris, - looptris_tot, - face_boolean_operand, - nullptr, - false, - false, - true, - true, - false, - false, - boolean_mode, - 1e-6f); - MEM_freeN(looptris); - Mesh *result_i_mesh = BKE_mesh_from_bmesh_for_eval_nomain(bm, nullptr, meshes[0]); - BM_mesh_free(bm); - if (prev_result_mesh != nullptr) { - /* Except in the first iteration, two_meshes[0] holds the intermediate - * mesh result from the previous iteraiton. */ - BKE_mesh_eval_delete(prev_result_mesh); - } - if (i < meshes.size() - 2) { - two_meshes[0] = result_i_mesh; - two_meshes[1] = meshes[i + 2]; - two_transforms[0] = float4x4::identity(); - two_transforms[1] = transforms[i + 2]; - two_remaps[0] = {}; - two_remaps[1] = material_remaps[i + 2]; - prev_result_mesh = result_i_mesh; - } - else { - return result_i_mesh; - } - } - - BLI_assert_unreachable(); - return nullptr; -} - -/** \} */ - -Mesh *mesh_boolean(Span meshes, - Span transforms, - const float4x4 &target_transform, - Span> material_remaps, - BooleanOpParameters op_params, - Solver solver, - Vector *r_intersecting_edges) -{ - - switch (solver) { - case Solver::Float: - return mesh_boolean_float(meshes, - transforms, - target_transform, - material_remaps, - operation_to_float_mode(op_params.boolean_mode), - r_intersecting_edges); - case Solver::MeshArr: -#ifdef WITH_GMP - return mesh_boolean_mesh_arr(meshes, - transforms, - target_transform, - material_remaps, - !op_params.no_self_intersections, - !op_params.watertight, - operation_to_mesh_arr_mode(op_params.boolean_mode), - r_intersecting_edges); -#else - return nullptr; -#endif - default: - BLI_assert_unreachable(); - } - return nullptr; -} - -} // namespace blender::geometry::boolean +} // namespace blender::meshintersect diff --git a/source/blender/blenkernel/intern/mesh_compare.cc b/source/blender/blenkernel/intern/mesh_compare.cc index d88ef1f1c48..9f45cf41170 100644 --- a/source/blender/blenkernel/intern/mesh_compare.cc +++ b/source/blender/blenkernel/intern/mesh_compare.cc @@ -132,9 +132,6 @@ static void sort_indices(MutableSpan indices, const Span values, const i const float4 value2_quat = float4(value2); return value1_quat[component_i] < value2_quat[component_i]; } - if constexpr (std::is_same_v) { - return value1.base_ptr()[component_i] < value2.base_ptr()[component_i]; - } if constexpr (std::is_same_v) { for (int i = 0; i < 2; i++) { if (value1[i] != value2[i]) { @@ -251,10 +248,6 @@ static bool values_different(const T value1, const float4 value2_f = float4(value2); return compare_threshold_relative(value1_f[component_i], value2_f[component_i], threshold); } - if constexpr (std::is_same_v) { - return compare_threshold_relative( - value1.base_ptr()[component_i], value2.base_ptr()[component_i], threshold); - } BLI_assert_unreachable(); } @@ -582,9 +575,6 @@ static std::optional sort_domain_using_attributes( else if constexpr (is_same_any_v) { num_loops = 4; } - else if constexpr (is_same_any_v) { - num_loops = 16; - } for (const int component_i : IndexRange(num_loops)) { sort_per_set_based_on_attributes( maps.set_sizes, maps.from_sorted1, maps.from_sorted2, values1, values2, component_i); diff --git a/source/blender/blenkernel/intern/mesh_convert.cc b/source/blender/blenkernel/intern/mesh_convert.cc index fac35ce19a9..e6a9825b0c7 100644 --- a/source/blender/blenkernel/intern/mesh_convert.cc +++ b/source/blender/blenkernel/intern/mesh_convert.cc @@ -24,7 +24,7 @@ #include "BLI_string.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_DerivedMesh.hh" #include "BKE_curves.hh" @@ -510,15 +510,15 @@ void BKE_mesh_to_curve(Main *bmain, Depsgraph *depsgraph, Scene * /*scene*/, Obj if (!ob_eval) { return; } - const Mesh *mesh_eval = BKE_object_get_evaluated_mesh_no_subsurf(ob_eval); - if (!mesh_eval) { + const Mesh *me_eval = BKE_object_get_evaluated_mesh_no_subsurf(ob_eval); + if (!me_eval) { return; } ListBase nurblist = {nullptr, nullptr}; - BKE_mesh_to_curve_nurblist(mesh_eval, &nurblist, 0); - BKE_mesh_to_curve_nurblist(mesh_eval, &nurblist, 1); + BKE_mesh_to_curve_nurblist(me_eval, &nurblist, 0); + BKE_mesh_to_curve_nurblist(me_eval, &nurblist, 1); if (nurblist.first) { Curve *cu = BKE_curve_add(bmain, ob->id.name + 2, OB_CURVES_LEGACY); diff --git a/source/blender/blenkernel/intern/mesh_evaluate.cc b/source/blender/blenkernel/intern/mesh_evaluate.cc index a56a67ea31d..211adbf1cb3 100644 --- a/source/blender/blenkernel/intern/mesh_evaluate.cc +++ b/source/blender/blenkernel/intern/mesh_evaluate.cc @@ -14,8 +14,11 @@ #include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" +#include "DNA_object_types.h" +#include "BLI_alloca.h" #include "BLI_array_utils.hh" +#include "BLI_bitmap.h" #include "BLI_index_range.hh" #include "BLI_math_geom.h" #include "BLI_span.hh" @@ -23,7 +26,9 @@ #include "BLI_virtual_array.hh" #include "BKE_attribute.hh" +#include "BKE_customdata.hh" #include "BKE_mesh.hh" +#include "BKE_multires.hh" using blender::float3; using blender::int2; diff --git a/source/blender/blenkernel/intern/mesh_fair.cc b/source/blender/blenkernel/intern/mesh_fair.cc index 6cf321646c8..1c11cea840c 100644 --- a/source/blender/blenkernel/intern/mesh_fair.cc +++ b/source/blender/blenkernel/intern/mesh_fair.cc @@ -13,10 +13,16 @@ #include "BLI_math_vector.h" #include "BLI_vector.hh" +#include "DNA_object_types.h" + +#include "BKE_lib_id.hh" +#include "BKE_lib_query.hh" #include "BKE_mesh.hh" #include "BKE_mesh_fair.hh" +#include "BKE_mesh_mapping.hh" #include "bmesh.hh" +#include "bmesh_tools.hh" #include "MEM_guardedalloc.h" #include "eigen_capi.h" diff --git a/source/blender/blenkernel/intern/mesh_iterators.cc b/source/blender/blenkernel/intern/mesh_iterators.cc index 082cdc0ee86..1c03445a161 100644 --- a/source/blender/blenkernel/intern/mesh_iterators.cc +++ b/source/blender/blenkernel/intern/mesh_iterators.cc @@ -373,7 +373,7 @@ static void get_vertexcos__mapFunc(void *user_data, } } -void BKE_mesh_foreach_mapped_vert_coords_get(const Mesh *mesh_eval, +void BKE_mesh_foreach_mapped_vert_coords_get(const Mesh *me_eval, float (*r_cos)[3], const int totcos) { @@ -381,6 +381,6 @@ void BKE_mesh_foreach_mapped_vert_coords_get(const Mesh *mesh_eval, memset(r_cos, 0, sizeof(*r_cos) * totcos); user_data.vertexcos = r_cos; user_data.vertex_visit = BLI_BITMAP_NEW(totcos, __func__); - BKE_mesh_foreach_mapped_vert(mesh_eval, get_vertexcos__mapFunc, &user_data, MESH_FOREACH_NOP); + BKE_mesh_foreach_mapped_vert(me_eval, get_vertexcos__mapFunc, &user_data, MESH_FOREACH_NOP); MEM_freeN(user_data.vertex_visit); } diff --git a/source/blender/blenkernel/intern/mesh_legacy_convert.cc b/source/blender/blenkernel/intern/mesh_legacy_convert.cc index 82fb3e66418..596745e6359 100644 --- a/source/blender/blenkernel/intern/mesh_legacy_convert.cc +++ b/source/blender/blenkernel/intern/mesh_legacy_convert.cc @@ -26,13 +26,14 @@ #include "BLI_memarena.h" #include "BLI_multi_value_map.hh" #include "BLI_polyfill_2d.h" +#include "BLI_resource_scope.hh" #include "BLI_string.h" #include "BLI_task.hh" #include "BLI_utildefines.h" #include "BKE_attribute.hh" #include "BKE_customdata.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_idprop.hh" #include "BKE_main.hh" #include "BKE_mesh.hh" @@ -40,9 +41,10 @@ #include "BKE_modifier.hh" #include "BKE_multires.hh" #include "BKE_node.hh" +#include "BKE_node_runtime.hh" #include "BKE_node_tree_update.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" using blender::MutableSpan; using blender::Span; @@ -1710,7 +1712,7 @@ void BKE_mesh_legacy_convert_uvs_to_generic(Mesh *mesh) for (const int i : uv_names.index_range()) { const MLoopUV *mloopuv = static_cast( - CustomData_get_layer_named(&mesh->corner_data, CD_MLOOPUV, uv_names[i])); + CustomData_get_layer_named(&mesh->corner_data, CD_MLOOPUV, uv_names[i].c_str())); const uint32_t needed_boolean_attributes = threading::parallel_reduce( IndexRange(mesh->corners_num), 4096, @@ -1761,13 +1763,13 @@ void BKE_mesh_legacy_convert_uvs_to_generic(Mesh *mesh) } }); - CustomData_free_layer_named(&mesh->corner_data, uv_names[i], mesh->corners_num); + CustomData_free_layer_named(&mesh->corner_data, uv_names[i].c_str(), mesh->corners_num); const std::string new_name = BKE_id_attribute_calc_unique_name(mesh->id, uv_names[i].c_str()); uv_names[i] = new_name; CustomData_add_layer_named_with_data( - &mesh->corner_data, CD_PROP_FLOAT2, coords, mesh->corners_num, new_name, nullptr); + &mesh->corner_data, CD_PROP_FLOAT2, coords, mesh->corners_num, new_name.c_str(), nullptr); char buffer[MAX_CUSTOMDATA_LAYER_NAME]; if (vert_selection) { CustomData_add_layer_named_with_data( @@ -1798,18 +1800,18 @@ void BKE_mesh_legacy_convert_uvs_to_generic(Mesh *mesh) } if (active_name_i != -1) { - CustomData_set_layer_active_index(&mesh->corner_data, - CD_PROP_FLOAT2, - CustomData_get_named_layer_index(&mesh->corner_data, - CD_PROP_FLOAT2, - uv_names[active_name_i])); + CustomData_set_layer_active_index( + &mesh->corner_data, + CD_PROP_FLOAT2, + CustomData_get_named_layer_index( + &mesh->corner_data, CD_PROP_FLOAT2, uv_names[active_name_i].c_str())); } if (default_name_i != -1) { - CustomData_set_layer_render_index(&mesh->corner_data, - CD_PROP_FLOAT2, - CustomData_get_named_layer_index(&mesh->corner_data, - CD_PROP_FLOAT2, - uv_names[default_name_i])); + CustomData_set_layer_render_index( + &mesh->corner_data, + CD_PROP_FLOAT2, + CustomData_get_named_layer_index( + &mesh->corner_data, CD_PROP_FLOAT2, uv_names[default_name_i].c_str())); } } diff --git a/source/blender/blenkernel/intern/mesh_mapping.cc b/source/blender/blenkernel/intern/mesh_mapping.cc index 2f9d500950c..daeb3ce7b24 100644 --- a/source/blender/blenkernel/intern/mesh_mapping.cc +++ b/source/blender/blenkernel/intern/mesh_mapping.cc @@ -27,7 +27,7 @@ #include "BKE_mesh_mapping.hh" #include "BLI_memarena.h" -#include "BLI_strict_flags.h" /* Keep last. */ +#include "BLI_strict_flags.h" /* -------------------------------------------------------------------- */ /** \name Mesh Connectivity Mapping diff --git a/source/blender/blenkernel/intern/mesh_merge_customdata.cc b/source/blender/blenkernel/intern/mesh_merge_customdata.cc index c76389578f3..25c605b51e5 100644 --- a/source/blender/blenkernel/intern/mesh_merge_customdata.cc +++ b/source/blender/blenkernel/intern/mesh_merge_customdata.cc @@ -14,8 +14,10 @@ #include "BKE_customdata.hh" #include "BKE_mesh.hh" +#include "BKE_mesh_mapping.hh" +#include "BLI_memarena.h" -#include "BLI_strict_flags.h" /* Keep last. */ +#include "BLI_strict_flags.h" using namespace blender; diff --git a/source/blender/blenkernel/intern/mesh_mirror.cc b/source/blender/blenkernel/intern/mesh_mirror.cc index 3c99f214875..5b96ef07928 100644 --- a/source/blender/blenkernel/intern/mesh_mirror.cc +++ b/source/blender/blenkernel/intern/mesh_mirror.cc @@ -17,6 +17,7 @@ #include "BKE_attribute.hh" #include "BKE_deform.hh" #include "BKE_lib_id.hh" +#include "BKE_lib_query.hh" #include "BKE_mesh.hh" #include "BKE_mesh_mirror.hh" #include "BKE_modifier.hh" @@ -26,6 +27,8 @@ #include "MEM_guardedalloc.h" +#include "MOD_modifiertypes.hh" + Mesh *BKE_mesh_mirror_bisect_on_mirror_plane_for_modifier(MirrorModifierData *mmd, const Mesh *mesh, int axis, @@ -145,8 +148,8 @@ Mesh *BKE_mesh_mirror_apply_mirror_on_axis_for_modifier(MirrorModifierData *mmd, /* tmp is a transform from coords relative to the object's own origin, * to coords relative to the mirror object origin */ - invert_m4_m4(tmp, mirror_ob->object_to_world().ptr()); - mul_m4_m4m4(tmp, tmp, ob->object_to_world().ptr()); + invert_m4_m4(tmp, mirror_ob->object_to_world); + mul_m4_m4m4(tmp, tmp, ob->object_to_world); /* itmp is the reverse transform back to origin-relative coordinates */ invert_m4_m4(itmp, tmp); @@ -162,9 +165,9 @@ Mesh *BKE_mesh_mirror_apply_mirror_on_axis_for_modifier(MirrorModifierData *mmd, /* Account for non-uniform scale in `ob`, see: #87592. */ float ob_scale[3] = { - len_squared_v3(ob->object_to_world().ptr()[0]), - len_squared_v3(ob->object_to_world().ptr()[1]), - len_squared_v3(ob->object_to_world().ptr()[2]), + len_squared_v3(ob->object_to_world[0]), + len_squared_v3(ob->object_to_world[1]), + len_squared_v3(ob->object_to_world[2]), }; /* Scale to avoid precision loss with extreme values. */ const float ob_scale_max = max_fff(UNPACK3(ob_scale)); diff --git a/source/blender/blenkernel/intern/mesh_normals.cc b/source/blender/blenkernel/intern/mesh_normals.cc index 974b0815e17..4519dd72e47 100644 --- a/source/blender/blenkernel/intern/mesh_normals.cc +++ b/source/blender/blenkernel/intern/mesh_normals.cc @@ -25,14 +25,18 @@ #include "BLI_memarena.h" #include "BLI_span.hh" #include "BLI_task.hh" +#include "BLI_timeit.hh" #include "BLI_utildefines.h" #include "BKE_attribute.hh" #include "BKE_customdata.hh" -#include "BKE_global.hh" +#include "BKE_editmesh_cache.hh" +#include "BKE_global.h" #include "BKE_mesh.hh" #include "BKE_mesh_mapping.hh" +#include "atomic_ops.h" + // #define DEBUG_TIME #ifdef DEBUG_TIME @@ -800,48 +804,48 @@ static void corner_manifold_fan_around_vert_next(const Span corner_verts, const Span corner_to_face, const int2 e2lfan_curr, const int vert_pivot, - int *r_fan_corner, - int *r_vert_corner) + int *r_mlfan_curr_index, + int *r_mlfan_vert_index) { - const int fan_corner_orig = *r_fan_corner; - const int vert_fan_orig = corner_verts[fan_corner_orig]; + const int mlfan_curr_orig = *r_mlfan_curr_index; + const int vert_fan_orig = corner_verts[mlfan_curr_orig]; /* WARNING: This is rather complex! * We have to find our next edge around the vertex (fan mode). - * First we find the next corner, which is either previous or next to fan_corner, depending + * First we find the next corner, which is either previous or next to mlfan_curr_index, depending * whether both corners using current edge are in the same direction or not, and whether - * fan_corner actually uses the vertex we are fanning around! - * fan_corner is the index of the next corner here, and the next corner is not the real next one - * (i.e. not the future `fan_corner`). */ - *r_fan_corner = (e2lfan_curr[0] == *r_fan_corner) ? e2lfan_curr[1] : e2lfan_curr[0]; + * mlfan_curr_index actually uses the vertex we are fanning around! + * mlfan_curr_index is the index of mlfan_next here, and mlfan_next is not the real next one + * (i.e. not the future `mlfan_curr`). */ + *r_mlfan_curr_index = (e2lfan_curr[0] == *r_mlfan_curr_index) ? e2lfan_curr[1] : e2lfan_curr[0]; - BLI_assert(*r_fan_corner >= 0); + BLI_assert(*r_mlfan_curr_index >= 0); - const int vert_fan_next = corner_verts[*r_fan_corner]; - const IndexRange face_fan_next = faces[corner_to_face[*r_fan_corner]]; + const int vert_fan_next = corner_verts[*r_mlfan_curr_index]; + const IndexRange face_fan_next = faces[corner_to_face[*r_mlfan_curr_index]]; if ((vert_fan_orig == vert_fan_next && vert_fan_orig == vert_pivot) || !ELEM(vert_fan_orig, vert_fan_next, vert_pivot)) { /* We need the previous corner, but current one is our vertex's corner. */ - *r_vert_corner = *r_fan_corner; - *r_fan_corner = face_corner_prev(face_fan_next, *r_fan_corner); + *r_mlfan_vert_index = *r_mlfan_curr_index; + *r_mlfan_curr_index = face_corner_prev(face_fan_next, *r_mlfan_curr_index); } else { /* We need the next corner, which is also our vertex's corner. */ - *r_fan_corner = face_corner_next(face_fan_next, *r_fan_corner); - *r_vert_corner = *r_fan_corner; + *r_mlfan_curr_index = face_corner_next(face_fan_next, *r_mlfan_curr_index); + *r_mlfan_vert_index = *r_mlfan_curr_index; } } static void lnor_space_for_single_fan(CornerSplitTaskDataCommon *common_data, - const int corner, + const int ml_curr_index, const int space_index) { const Span corner_to_face = common_data->corner_to_face; const Span face_normals = common_data->face_normals; MutableSpan corner_normals = common_data->corner_normals; - corner_normals[corner] = face_normals[corner_to_face[corner]]; + corner_normals[ml_curr_index] = face_normals[corner_to_face[ml_curr_index]]; if (CornerNormalSpaceArray *lnors_spacearr = common_data->lnors_spacearr) { const Span positions = common_data->positions; @@ -851,33 +855,34 @@ static void lnor_space_for_single_fan(CornerSplitTaskDataCommon *common_data, const Span corner_edges = common_data->corner_edges; const Span clnors_data = common_data->clnors_data; - const int face_index = corner_to_face[corner]; - const int corner_prev = mesh::face_corner_prev(faces[face_index], corner); + const int face_index = corner_to_face[ml_curr_index]; + const int ml_prev_index = mesh::face_corner_prev(faces[face_index], ml_curr_index); /* The vertex we are "fanning" around. */ - const int vert_pivot = corner_verts[corner]; - const int vert_2 = edge_other_vert(edges[corner_edges[corner]], vert_pivot); - const int vert_3 = edge_other_vert(edges[corner_edges[corner_prev]], vert_pivot); + const int vert_pivot = corner_verts[ml_curr_index]; + const int vert_2 = edge_other_vert(edges[corner_edges[ml_curr_index]], vert_pivot); + const int vert_3 = edge_other_vert(edges[corner_edges[ml_prev_index]], vert_pivot); const float3 vec_curr = math::normalize(positions[vert_2] - positions[vert_pivot]); const float3 vec_prev = math::normalize(positions[vert_3] - positions[vert_pivot]); CornerNormalSpace &space = lnors_spacearr->spaces[space_index]; - space = corner_fan_space_define(corner_normals[corner], vec_curr, vec_prev, {}); - lnors_spacearr->corner_space_indices[corner] = space_index; + space = corner_fan_space_define(corner_normals[ml_curr_index], vec_curr, vec_prev, {}); + lnors_spacearr->corner_space_indices[ml_curr_index] = space_index; if (!clnors_data.is_empty()) { - corner_normals[corner] = corner_space_custom_data_to_normal(space, clnors_data[corner]); + corner_normals[ml_curr_index] = corner_space_custom_data_to_normal( + space, clnors_data[ml_curr_index]); } if (!lnors_spacearr->corners_by_space.is_empty()) { - lnors_spacearr->corners_by_space[space_index] = {corner}; + lnors_spacearr->corners_by_space[space_index] = {ml_curr_index}; } } } static void split_corner_normal_fan_do(CornerSplitTaskDataCommon *common_data, - const int corner, + const int ml_curr_index, const int space_index, Vector *edge_vectors) { @@ -894,8 +899,8 @@ static void split_corner_normal_fan_do(CornerSplitTaskDataCommon *common_data, const Span face_normals = common_data->face_normals; const Span clnors_data = common_data->clnors_data; - const int face_index = corner_to_face[corner]; - const int corner_prev = face_corner_prev(faces[face_index], corner); + const int face_index = corner_to_face[ml_curr_index]; + const int ml_prev_index = face_corner_prev(faces[face_index], ml_curr_index); /* Sigh! we have to fan around current vertex, until we find the other non-smooth edge, * and accumulate face normals into the vertex! @@ -903,10 +908,10 @@ static void split_corner_normal_fan_do(CornerSplitTaskDataCommon *common_data, * same as the vertex normal, but I do not see any easy way to detect that (would need to count * number of sharp edges per vertex, I doubt the additional memory usage would be worth it, * especially as it should not be a common case in real-life meshes anyway). */ - const int vert_pivot = corner_verts[corner]; /* The vertex we are "fanning" around! */ + const int vert_pivot = corner_verts[ml_curr_index]; /* The vertex we are "fanning" around! */ - /* `corner` would be `corner_prev` if we needed that one. */ - const int2 &edge_orig = edges[corner_edges[corner]]; + /* `ml_curr_index` would be mlfan_prev if we needed that one. */ + const int2 &edge_orig = edges[corner_edges[ml_curr_index]]; float3 vec_curr; float3 vec_prev; @@ -917,14 +922,14 @@ static void split_corner_normal_fan_do(CornerSplitTaskDataCommon *common_data, Vector processed_corners; - /* `vert_corner` the corner of our current edge might not be the corner of our current + /* `mlfan_vert_index` the corner of our current edge might not be the corner of our current * vertex! */ - int fan_corner = corner_prev; - int vert_corner = corner; + int mlfan_curr_index = ml_prev_index; + int mlfan_vert_index = ml_curr_index; - BLI_assert(fan_corner >= 0); - BLI_assert(vert_corner >= 0); + BLI_assert(mlfan_curr_index >= 0); + BLI_assert(mlfan_vert_index >= 0); /* Only need to compute previous edge's vector once, then we can just reuse old current one! */ { @@ -937,8 +942,10 @@ static void split_corner_normal_fan_do(CornerSplitTaskDataCommon *common_data, } } + // printf("FAN: vert %d, start edge %d\n", vert_pivot, ml_curr->e); + while (true) { - const int2 &edge = edges[corner_edges[fan_corner]]; + const int2 &edge = edges[corner_edges[mlfan_curr_index]]; /* Compute edge vectors. * NOTE: We could pre-compute those into an array, in the first iteration, instead of computing * them twice (or more) here. However, time gained is not worth memory and time lost, @@ -949,12 +956,15 @@ static void split_corner_normal_fan_do(CornerSplitTaskDataCommon *common_data, vec_curr = math::normalize(positions[vert_2] - positions[vert_pivot]); } + // printf("\thandling edge %d / corner %d\n", corner_edges[mlfan_curr_index], + // mlfan_curr_index); + /* Code similar to accumulate_vertex_normals_poly_v3. */ /* Calculate angle between the two face edges incident on this vertex. */ - lnor += face_normals[corner_to_face[fan_corner]] * + lnor += face_normals[corner_to_face[mlfan_curr_index]] * math::safe_acos_approx(math::dot(vec_curr, vec_prev)); - processed_corners.append(vert_corner); + processed_corners.append(mlfan_vert_index); if (lnors_spacearr) { if (edge != edge_orig) { @@ -965,11 +975,11 @@ static void split_corner_normal_fan_do(CornerSplitTaskDataCommon *common_data, lnors_spacearr->corners_by_space[space_index] = processed_corners.as_span(); } if (!clnors_data.is_empty()) { - clnors_avg += int2(clnors_data[vert_corner]); + clnors_avg += int2(clnors_data[mlfan_vert_index]); } } - if (IS_EDGE_SHARP(edge_to_corners[corner_edges[fan_corner]]) || (edge == edge_orig)) { + if (IS_EDGE_SHARP(edge_to_corners[corner_edges[mlfan_curr_index]]) || (edge == edge_orig)) { /* Current edge is sharp and we have finished with this fan of faces around this vert, * or this vert is smooth, and we have completed a full turn around it. */ break; @@ -981,10 +991,10 @@ static void split_corner_normal_fan_do(CornerSplitTaskDataCommon *common_data, corner_manifold_fan_around_vert_next(corner_verts, faces, corner_to_face, - edge_to_corners[corner_edges[fan_corner]], + edge_to_corners[corner_edges[mlfan_curr_index]], vert_pivot, - &fan_corner, - &vert_corner); + &mlfan_curr_index, + &mlfan_vert_index); } float length; @@ -996,7 +1006,7 @@ static void split_corner_normal_fan_do(CornerSplitTaskDataCommon *common_data, if (lnors_spacearr) { if (UNLIKELY(length == 0.0f)) { /* Use vertex normal as fallback! */ - lnor = corner_normals[vert_corner]; + lnor = corner_normals[mlfan_vert_index]; length = 1.0f; } @@ -1031,11 +1041,11 @@ static bool corner_split_generator_check_cyclic_smooth_fan(const Span corne const Span corner_to_face, const int2 e2l_prev, MutableBitSpan skip_corners, - const int corner, - const int corner_prev) + const int ml_curr_index, + const int ml_prev_index) { /* The vertex we are "fanning" around. */ - const int vert_pivot = corner_verts[corner]; + const int vert_pivot = corner_verts[ml_curr_index]; int2 e2lfan_curr = e2l_prev; if (IS_EDGE_SHARP(e2lfan_curr)) { @@ -1043,32 +1053,37 @@ static bool corner_split_generator_check_cyclic_smooth_fan(const Span corne return false; } - /* `vert_corner` the corner of our current edge might not be the corner of our current + /* `mlfan_vert_index` the corner of our current edge might not be the corner of our current * vertex! */ - int fan_corner = corner_prev; - int vert_corner = corner; + int mlfan_curr_index = ml_prev_index; + int mlfan_vert_index = ml_curr_index; - BLI_assert(fan_corner >= 0); - BLI_assert(vert_corner >= 0); + BLI_assert(mlfan_curr_index >= 0); + BLI_assert(mlfan_vert_index >= 0); - BLI_assert(!skip_corners[vert_corner]); - skip_corners[vert_corner].set(); + BLI_assert(!skip_corners[mlfan_vert_index]); + skip_corners[mlfan_vert_index].set(); while (true) { /* Find next corner of the smooth fan. */ - corner_manifold_fan_around_vert_next( - corner_verts, faces, corner_to_face, e2lfan_curr, vert_pivot, &fan_corner, &vert_corner); + corner_manifold_fan_around_vert_next(corner_verts, + faces, + corner_to_face, + e2lfan_curr, + vert_pivot, + &mlfan_curr_index, + &mlfan_vert_index); - e2lfan_curr = edge_to_corners[corner_edges[fan_corner]]; + e2lfan_curr = edge_to_corners[corner_edges[mlfan_curr_index]]; if (IS_EDGE_SHARP(e2lfan_curr)) { /* Sharp corner/edge, so not a cyclic smooth fan. */ return false; } /* Smooth corner/edge. */ - if (skip_corners[vert_corner]) { - if (vert_corner == corner) { + if (skip_corners[mlfan_vert_index]) { + if (mlfan_vert_index == ml_curr_index) { /* We walked around a whole cyclic smooth fan without finding any already-processed corner, * means we can use initial current / previous edge as start for this smooth fan. */ return true; @@ -1078,7 +1093,7 @@ static bool corner_split_generator_check_cyclic_smooth_fan(const Span corne } /* We can skip it in future, and keep checking the smooth fan. */ - skip_corners[vert_corner].set(); + skip_corners[mlfan_vert_index].set(); } } @@ -1104,16 +1119,16 @@ static void corner_split_generator(CornerSplitTaskDataCommon *common_data, for (const int face_index : faces.index_range()) { const IndexRange face = faces[face_index]; - for (const int corner : face) { - const int corner_prev = mesh::face_corner_prev(face, corner); + for (const int ml_curr_index : face) { + const int ml_prev_index = mesh::face_corner_prev(face, ml_curr_index); #if 0 printf("Checking corner %d / edge %u / vert %u (sharp edge: %d, skiploop: %d)", - corner, - corner_edges[corner], - corner_verts[corner], - IS_EDGE_SHARP(edge_to_corners[corner_edges[corner]]), - skip_corners[corner]); + ml_curr_index, + corner_edges[ml_curr_index], + corner_verts[ml_curr_index], + IS_EDGE_SHARP(edge_to_corners[corner_edges[ml_curr_index]]), + skip_corners[ml_curr_index]); #endif /* A smooth edge, we have to check for cyclic smooth fan case. @@ -1121,32 +1136,32 @@ static void corner_split_generator(CornerSplitTaskDataCommon *common_data, * corner/edge as 'entry point', otherwise we can skip it. */ /* NOTE: In theory, we could make #corner_split_generator_check_cyclic_smooth_fan() store - * vert_corner'es and edge indexes in two stacks, to avoid having to fan again around + * mlfan_vert_index'es and edge indexes in two stacks, to avoid having to fan again around * the vert during actual computation of `clnor` & `clnorspace`. * However, this would complicate the code, add more memory usage, and despite its logical * complexity, #corner_manifold_fan_around_vert_next() is quite cheap in term of CPU cycles, * so really think it's not worth it. */ - if (!IS_EDGE_SHARP(edge_to_corners[corner_edges[corner]]) && - (skip_corners[corner] || !corner_split_generator_check_cyclic_smooth_fan( - corner_verts, - corner_edges, - faces, - edge_to_corners, - corner_to_face, - edge_to_corners[corner_edges[corner_prev]], - skip_corners, - corner, - corner_prev))) + if (!IS_EDGE_SHARP(edge_to_corners[corner_edges[ml_curr_index]]) && + (skip_corners[ml_curr_index] || !corner_split_generator_check_cyclic_smooth_fan( + corner_verts, + corner_edges, + faces, + edge_to_corners, + corner_to_face, + edge_to_corners[corner_edges[ml_prev_index]], + skip_corners, + ml_curr_index, + ml_prev_index))) { // printf("SKIPPING!\n"); } else { - if (IS_EDGE_SHARP(edge_to_corners[corner_edges[corner]]) && - IS_EDGE_SHARP(edge_to_corners[corner_edges[corner_prev]])) + if (IS_EDGE_SHARP(edge_to_corners[corner_edges[ml_curr_index]]) && + IS_EDGE_SHARP(edge_to_corners[corner_edges[ml_prev_index]])) { /* Simple case (both edges around that vertex are sharp in current face), * this corner just takes its face normal. */ - r_single_corners.append(corner); + r_single_corners.append(ml_curr_index); } else { /* We do not need to check/tag corners as already computed. Due to the fact that a corner @@ -1156,7 +1171,7 @@ static void corner_split_generator(CornerSplitTaskDataCommon *common_data, * current edge, smooth previous edge), and not the alternative (smooth current edge, * sharp previous edge). All this due/thanks to the link between normals and corner * ordering (i.e. winding). */ - r_fan_corners.append(corner); + r_fan_corners.append(ml_curr_index); } } } @@ -1384,11 +1399,11 @@ static void mesh_normals_corner_custom_set(const Span positions, * We know those two corners do not point to the same edge, * since we do not allow reversed winding in a same smooth fan. */ const IndexRange face = faces[corner_to_face[lidx]]; - const int corner_prev = face_corner_prev(face, lidx); + const int mlp = (lidx == face.start()) ? face.start() + face.size() - 1 : lidx - 1; const int edge = corner_edges[lidx]; - const int edge_prev = corner_edges[corner_prev]; + const int edge_p = corner_edges[mlp]; const int prev_edge = corner_edges[prev_corner]; - sharp_edges[prev_edge == edge_prev ? prev_edge : edge] = true; + sharp_edges[prev_edge == edge_p ? prev_edge : edge] = true; org_nor = nor; } @@ -1407,11 +1422,11 @@ static void mesh_normals_corner_custom_set(const Span positions, if (dot_v3v3(org_nor, nor) < LNOR_SPACE_TRIGO_THRESHOLD) { const IndexRange face = faces[corner_to_face[lidx]]; - const int corner_prev = face_corner_prev(face, lidx); + const int mlp = (lidx == face.start()) ? face.start() + face.size() - 1 : lidx - 1; const int edge = corner_edges[lidx]; - const int edge_prev = corner_edges[corner_prev]; + const int edge_p = corner_edges[mlp]; const int prev_edge = corner_edges[prev_corner]; - sharp_edges[prev_edge == edge_prev ? prev_edge : edge] = true; + sharp_edges[prev_edge == edge_p ? prev_edge : edge] = true; } } } diff --git a/source/blender/blenkernel/intern/mesh_remap.cc b/source/blender/blenkernel/intern/mesh_remap.cc index 57df2545736..8b5911338e7 100644 --- a/source/blender/blenkernel/intern/mesh_remap.cc +++ b/source/blender/blenkernel/intern/mesh_remap.cc @@ -34,7 +34,7 @@ #include "BKE_mesh_remap.hh" /* own include */ #include "BKE_mesh_runtime.hh" -#include "BLI_strict_flags.h" /* Keep last. */ +#include "BLI_strict_flags.h" static CLG_LogRef LOG = {"bke.mesh"}; diff --git a/source/blender/blenkernel/intern/mesh_runtime.cc b/source/blender/blenkernel/intern/mesh_runtime.cc index b2794333a9a..6301bc67fd7 100644 --- a/source/blender/blenkernel/intern/mesh_runtime.cc +++ b/source/blender/blenkernel/intern/mesh_runtime.cc @@ -6,11 +6,16 @@ * \ingroup bke */ +#include "atomic_ops.h" + #include "MEM_guardedalloc.h" +#include "DNA_object_types.h" + #include "BLI_array_utils.hh" #include "BLI_math_geom.h" #include "BLI_task.hh" +#include "BLI_timeit.hh" #include "BKE_bake_data_block_id.hh" #include "BKE_bvhutils.hh" @@ -409,7 +414,7 @@ void BKE_mesh_batch_cache_free(void *batch_cache) #ifndef NDEBUG -bool BKE_mesh_runtime_is_valid(Mesh *mesh_eval) +bool BKE_mesh_runtime_is_valid(Mesh *me_eval) { const bool do_verbose = true; const bool do_fixes = false; @@ -418,44 +423,44 @@ bool BKE_mesh_runtime_is_valid(Mesh *mesh_eval) bool changed = true; if (do_verbose) { - printf("MESH: %s\n", mesh_eval->id.name + 2); + printf("MESH: %s\n", me_eval->id.name + 2); } - MutableSpan positions = mesh_eval->vert_positions_for_write(); - MutableSpan edges = mesh_eval->edges_for_write(); - MutableSpan face_offsets = mesh_eval->face_offsets_for_write(); - MutableSpan corner_verts = mesh_eval->corner_verts_for_write(); - MutableSpan corner_edges = mesh_eval->corner_edges_for_write(); + MutableSpan positions = me_eval->vert_positions_for_write(); + MutableSpan edges = me_eval->edges_for_write(); + MutableSpan face_offsets = me_eval->face_offsets_for_write(); + MutableSpan corner_verts = me_eval->corner_verts_for_write(); + MutableSpan corner_edges = me_eval->corner_edges_for_write(); is_valid &= BKE_mesh_validate_all_customdata( - &mesh_eval->vert_data, - mesh_eval->verts_num, - &mesh_eval->edge_data, - mesh_eval->edges_num, - &mesh_eval->corner_data, - mesh_eval->corners_num, - &mesh_eval->face_data, - mesh_eval->faces_num, + &me_eval->vert_data, + me_eval->verts_num, + &me_eval->edge_data, + me_eval->edges_num, + &me_eval->corner_data, + me_eval->corners_num, + &me_eval->face_data, + me_eval->faces_num, false, /* setting mask here isn't useful, gives false positives */ do_verbose, do_fixes, &changed); is_valid &= BKE_mesh_validate_arrays( - mesh_eval, + me_eval, reinterpret_cast(positions.data()), positions.size(), edges.data(), edges.size(), static_cast(CustomData_get_layer_for_write( - &mesh_eval->fdata_legacy, CD_MFACE, mesh_eval->totface_legacy)), - mesh_eval->totface_legacy, + &me_eval->fdata_legacy, CD_MFACE, me_eval->totface_legacy)), + me_eval->totface_legacy, corner_verts.data(), corner_edges.data(), corner_verts.size(), face_offsets.data(), - mesh_eval->faces_num, - mesh_eval->deform_verts_for_write().data(), + me_eval->faces_num, + me_eval->deform_verts_for_write().data(), do_verbose, do_fixes, &changed); diff --git a/source/blender/blenkernel/intern/mesh_sample.cc b/source/blender/blenkernel/intern/mesh_sample.cc index abe85e6ef69..47256dbbab7 100644 --- a/source/blender/blenkernel/intern/mesh_sample.cc +++ b/source/blender/blenkernel/intern/mesh_sample.cc @@ -5,6 +5,7 @@ #include "BKE_attribute_math.hh" #include "BKE_bvhutils.hh" #include "BKE_mesh.hh" +#include "BKE_mesh_runtime.hh" #include "BKE_mesh_sample.hh" #include "BLI_math_geom.h" diff --git a/source/blender/blenkernel/intern/mesh_tangent.cc b/source/blender/blenkernel/intern/mesh_tangent.cc index 1b688f9e384..0709318c6f9 100644 --- a/source/blender/blenkernel/intern/mesh_tangent.cc +++ b/source/blender/blenkernel/intern/mesh_tangent.cc @@ -21,13 +21,15 @@ #include "BKE_attribute.hh" #include "BKE_customdata.hh" #include "BKE_mesh.hh" +#include "BKE_mesh_runtime.hh" #include "BKE_mesh_tangent.hh" -#include "BKE_report.hh" +#include "BKE_report.h" +#include "BLI_strict_flags.h" + +#include "atomic_ops.h" #include "mikktspace.hh" -#include "BLI_strict_flags.h" /* Keep last. */ - using blender::float2; /* -------------------------------------------------------------------- */ @@ -569,7 +571,7 @@ void BKE_mesh_calc_loop_tangent_ex(const float (*vert_positions)[3], } } -void BKE_mesh_calc_loop_tangents(Mesh *mesh_eval, +void BKE_mesh_calc_loop_tangents(Mesh *me_eval, bool calc_active_tangent, const char (*tangent_names)[MAX_CUSTOMDATA_LAYER_NAME], int tangent_names_len) @@ -577,30 +579,30 @@ void BKE_mesh_calc_loop_tangents(Mesh *mesh_eval, /* TODO(@ideasman42): store in Mesh.runtime to avoid recalculation. */ using namespace blender; using namespace blender::bke; - const blender::Span corner_tris = mesh_eval->corner_tris(); - const bke::AttributeAccessor attributes = mesh_eval->attributes(); + const blender::Span corner_tris = me_eval->corner_tris(); + const bke::AttributeAccessor attributes = me_eval->attributes(); const VArraySpan sharp_face = *attributes.lookup("sharp_face", AttrDomain::Face); short tangent_mask = 0; BKE_mesh_calc_loop_tangent_ex( - reinterpret_cast(mesh_eval->vert_positions().data()), - mesh_eval->faces(), - mesh_eval->corner_verts().data(), + reinterpret_cast(me_eval->vert_positions().data()), + me_eval->faces(), + me_eval->corner_verts().data(), corner_tris.data(), - mesh_eval->corner_tri_faces().data(), + me_eval->corner_tri_faces().data(), uint(corner_tris.size()), sharp_face, - &mesh_eval->corner_data, + &me_eval->corner_data, calc_active_tangent, tangent_names, tangent_names_len, - reinterpret_cast(mesh_eval->vert_normals().data()), - reinterpret_cast(mesh_eval->face_normals().data()), - reinterpret_cast(mesh_eval->corner_normals().data()), + reinterpret_cast(me_eval->vert_normals().data()), + reinterpret_cast(me_eval->face_normals().data()), + reinterpret_cast(me_eval->corner_normals().data()), /* may be nullptr */ - static_cast(CustomData_get_layer(&mesh_eval->vert_data, CD_ORCO)), + static_cast(CustomData_get_layer(&me_eval->vert_data, CD_ORCO)), /* result */ - &mesh_eval->corner_data, - uint(mesh_eval->corners_num), + &me_eval->corner_data, + uint(me_eval->corners_num), &tangent_mask); } diff --git a/source/blender/blenkernel/intern/mesh_tessellate.cc b/source/blender/blenkernel/intern/mesh_tessellate.cc index cffa53b1116..02b7f3bf743 100644 --- a/source/blender/blenkernel/intern/mesh_tessellate.cc +++ b/source/blender/blenkernel/intern/mesh_tessellate.cc @@ -18,39 +18,46 @@ #include "BLI_math_vector.h" #include "BLI_memarena.h" #include "BLI_polyfill_2d.h" +#include "BLI_task.h" #include "BLI_task.hh" #include "BKE_mesh.hh" -#include "BLI_strict_flags.h" /* Keep last. */ +#include "BLI_strict_flags.h" namespace blender::bke::mesh { +/** Compared against total loops. */ +#define MESH_FACE_TESSELLATE_THREADED_LIMIT 4096 + /* -------------------------------------------------------------------- */ -/** \name Face Tessellation +/** \name Loop Tessellation * - * Fill in Corner Triangle Array + * Fill in Corner Triangle data-structure. * \{ */ /** * \param face_normal: This will be optimized out as a constant. */ BLI_INLINE void mesh_calc_tessellation_for_face_impl(const Span corner_verts, + const blender::OffsetIndices faces, const Span positions, - const int face_start, - const int face_size, + uint face_index, int3 *tri, MemArena **pf_arena_p, const bool face_normal, const float normal_precalc[3]) { - auto create_tri = [&](int i1, int i2, int i3) { - (*tri)[0] = face_start + i1; - (*tri)[1] = face_start + i2; - (*tri)[2] = face_start + i3; + const uint mp_loopstart = uint(faces[face_index].start()); + const uint mp_totloop = uint(faces[face_index].size()); + + auto create_tri = [&](uint i1, uint i2, uint i3) { + (*tri)[0] = int(mp_loopstart + i1); + (*tri)[1] = int(mp_loopstart + i2); + (*tri)[2] = int(mp_loopstart + i3); }; - switch (face_size) { + switch (mp_totloop) { case 3: { create_tri(0, 1, 2); break; @@ -82,9 +89,9 @@ BLI_INLINE void mesh_calc_tessellation_for_face_impl(const Span corner_vert zero_v3(normal); /* Calc normal, flipped: to get a positive 2D cross product. */ - co_prev = positions[corner_verts[face_start + face_size - 1]]; - for (int j = 0; j < face_size; j++) { - co_curr = positions[corner_verts[face_start + j]]; + co_prev = positions[corner_verts[mp_loopstart + mp_totloop - 1]]; + for (uint j = 0; j < mp_totloop; j++) { + co_curr = positions[corner_verts[mp_loopstart + j]]; add_newell_cross_v3_v3v3(normal, co_prev, co_curr); co_prev = co_curr; } @@ -97,7 +104,7 @@ BLI_INLINE void mesh_calc_tessellation_for_face_impl(const Span corner_vert axis_dominant_v3_to_m3_negate(axis_mat, normal_precalc); } - const int totfilltri = face_size - 2; + const uint totfilltri = mp_totloop - 2; MemArena *pf_arena = *pf_arena_p; if (UNLIKELY(pf_arena == nullptr)) { @@ -107,17 +114,17 @@ BLI_INLINE void mesh_calc_tessellation_for_face_impl(const Span corner_vert uint(*tris)[3] = static_cast( BLI_memarena_alloc(pf_arena, sizeof(*tris) * size_t(totfilltri))); float(*projverts)[2] = static_cast( - BLI_memarena_alloc(pf_arena, sizeof(*projverts) * size_t(face_size))); + BLI_memarena_alloc(pf_arena, sizeof(*projverts) * size_t(mp_totloop))); - for (int j = 0; j < face_size; j++) { - mul_v2_m3v3(projverts[j], axis_mat, positions[corner_verts[face_start + j]]); + for (uint j = 0; j < mp_totloop; j++) { + mul_v2_m3v3(projverts[j], axis_mat, positions[corner_verts[mp_loopstart + j]]); } - BLI_polyfill_calc_arena(projverts, uint(face_size), 1, tris, pf_arena); + BLI_polyfill_calc_arena(projverts, mp_totloop, 1, tris, pf_arena); /* Apply fill. */ - for (int j = 0; j < totfilltri; j++, tri++) { - create_tri(int(tris[j][0]), int(tris[j][1]), int(tris[j][2])); + for (uint j = 0; j < totfilltri; j++, tri++) { + create_tri(tris[j][0], tris[j][1], tris[j][2]); } BLI_memarena_clear(pf_arena); @@ -125,82 +132,165 @@ BLI_INLINE void mesh_calc_tessellation_for_face_impl(const Span corner_vert break; } } +#undef ML_TO_MLT } static void mesh_calc_tessellation_for_face(const Span corner_verts, + const blender::OffsetIndices faces, const Span positions, - const int face_start, - const int face_size, + uint face_index, int3 *tri, MemArena **pf_arena_p) { mesh_calc_tessellation_for_face_impl( - corner_verts, positions, face_start, face_size, tri, pf_arena_p, false, nullptr); + corner_verts, faces, positions, face_index, tri, pf_arena_p, false, nullptr); } static void mesh_calc_tessellation_for_face_with_normal(const Span corner_verts, + const blender::OffsetIndices faces, const Span positions, - const int face_start, - const int face_size, + uint face_index, int3 *tri, MemArena **pf_arena_p, const float normal_precalc[3]) { mesh_calc_tessellation_for_face_impl( - corner_verts, positions, face_start, face_size, tri, pf_arena_p, true, normal_precalc); + corner_verts, faces, positions, face_index, tri, pf_arena_p, true, normal_precalc); } -struct LocalData { +static void mesh_recalc_corner_tris__single_threaded(const Span corner_verts, + const blender::OffsetIndices faces, + const Span positions, + int3 *corner_tris, + const float (*face_normals)[3]) +{ MemArena *pf_arena = nullptr; + uint corner_tri_i = 0; - ~LocalData() - { - if (pf_arena) { - BLI_memarena_free(pf_arena); + if (face_normals != nullptr) { + for (const int64_t i : faces.index_range()) { + mesh_calc_tessellation_for_face_with_normal(corner_verts, + faces, + positions, + uint(i), + &corner_tris[corner_tri_i], + &pf_arena, + face_normals[i]); + corner_tri_i += uint(faces[i].size() - 2); } } + else { + for (const int64_t i : faces.index_range()) { + mesh_calc_tessellation_for_face( + corner_verts, faces, positions, uint(i), &corner_tris[corner_tri_i], &pf_arena); + corner_tri_i += uint(faces[i].size() - 2); + } + } + + if (pf_arena) { + BLI_memarena_free(pf_arena); + pf_arena = nullptr; + } + BLI_assert(corner_tri_i == uint(poly_to_tri_count(int(faces.size()), int(corner_verts.size())))); +} + +struct TessellationUserData { + Span corner_verts; + blender::OffsetIndices faces; + Span positions; + + /** Output array. */ + MutableSpan corner_tris; + + /** Optional pre-calculated face normals array. */ + const float (*face_normals)[3]; }; -static void corner_tris_calc_impl(const Span positions, - const OffsetIndices faces, - const Span corner_verts, - const Span face_normals, - MutableSpan corner_tris) +struct TessellationUserTLS { + MemArena *pf_arena; +}; + +static void mesh_calc_tessellation_for_face_fn(void *__restrict userdata, + const int index, + const TaskParallelTLS *__restrict tls) { - threading::EnumerableThreadSpecific all_local_data; - if (face_normals.is_empty()) { - threading::parallel_for(faces.index_range(), 1024, [&](const IndexRange range) { - LocalData &local_data = all_local_data.local(); - for (const int64_t i : range) { - const int face_start = int(faces[i].start()); - const int face_size = int(faces[i].size()); - const int tris_start = poly_to_tri_count(int(i), face_start); - mesh_calc_tessellation_for_face(corner_verts, - positions, - face_start, - face_size, - &corner_tris[tris_start], - &local_data.pf_arena); - } - }); + const TessellationUserData *data = static_cast(userdata); + TessellationUserTLS *tls_data = static_cast(tls->userdata_chunk); + const int corner_tri_i = poly_to_tri_count(index, int(data->faces[index].start())); + mesh_calc_tessellation_for_face_impl(data->corner_verts, + data->faces, + data->positions, + uint(index), + &data->corner_tris[corner_tri_i], + &tls_data->pf_arena, + false, + nullptr); +} + +static void mesh_calc_tessellation_for_face_with_normal_fn(void *__restrict userdata, + const int index, + const TaskParallelTLS *__restrict tls) +{ + const TessellationUserData *data = static_cast(userdata); + TessellationUserTLS *tls_data = static_cast(tls->userdata_chunk); + const int corner_tri_i = poly_to_tri_count(index, int(data->faces[index].start())); + mesh_calc_tessellation_for_face_impl(data->corner_verts, + data->faces, + data->positions, + uint(index), + &data->corner_tris[corner_tri_i], + &tls_data->pf_arena, + true, + data->face_normals[index]); +} + +static void mesh_calc_tessellation_for_face_free_fn(const void *__restrict /*userdata*/, + void *__restrict tls_v) +{ + TessellationUserTLS *tls_data = static_cast(tls_v); + if (tls_data->pf_arena) { + BLI_memarena_free(tls_data->pf_arena); } - else { - threading::parallel_for(faces.index_range(), 1024, [&](const IndexRange range) { - LocalData &local_data = all_local_data.local(); - for (const int64_t i : range) { - const int face_start = int(faces[i].start()); - const int face_size = int(faces[i].size()); - const int tris_start = poly_to_tri_count(int(i), face_start); - mesh_calc_tessellation_for_face_with_normal(corner_verts, - positions, - face_start, - face_size, - &corner_tris[tris_start], - &local_data.pf_arena, - face_normals[i]); - } - }); +} + +static void corner_tris_calc_all(const Span positions, + const blender::OffsetIndices faces, + const Span corner_verts, + const Span face_normals, + MutableSpan corner_tris) +{ + if (corner_verts.size() < MESH_FACE_TESSELLATE_THREADED_LIMIT) { + mesh_recalc_corner_tris__single_threaded( + corner_verts, + faces, + positions, + corner_tris.data(), + reinterpret_cast(face_normals.data())); + return; } + TessellationUserTLS tls_data_dummy = {nullptr}; + + TessellationUserData data{}; + data.corner_verts = corner_verts; + data.faces = faces; + data.positions = positions; + data.corner_tris = corner_tris; + data.face_normals = reinterpret_cast(face_normals.data()); + + TaskParallelSettings settings; + BLI_parallel_range_settings_defaults(&settings); + + settings.userdata_chunk = &tls_data_dummy; + settings.userdata_chunk_size = sizeof(tls_data_dummy); + + settings.func_free = mesh_calc_tessellation_for_face_free_fn; + + BLI_task_parallel_range(0, + int(faces.size()), + &data, + data.face_normals ? mesh_calc_tessellation_for_face_with_normal_fn : + mesh_calc_tessellation_for_face_fn, + &settings); } void corner_tris_calc(const Span vert_positions, @@ -208,7 +298,7 @@ void corner_tris_calc(const Span vert_positions, const Span corner_verts, MutableSpan corner_tris) { - corner_tris_calc_impl(vert_positions, faces, corner_verts, {}, corner_tris); + corner_tris_calc_all(vert_positions, faces, corner_verts, {}, corner_tris); } void corner_tris_calc_face_indices(const OffsetIndices faces, MutableSpan tri_faces) @@ -230,7 +320,7 @@ void corner_tris_calc_with_normals(const Span vert_positions, MutableSpan corner_tris) { BLI_assert(!face_normals.is_empty() || faces.is_empty()); - corner_tris_calc_impl(vert_positions, faces, corner_verts, face_normals, corner_tris); + corner_tris_calc_all(vert_positions, faces, corner_verts, face_normals, corner_tris); } /** \} */ diff --git a/source/blender/blenkernel/intern/modifier.cc b/source/blender/blenkernel/intern/modifier.cc index b1edb87591a..19d86a7745b 100644 --- a/source/blender/blenkernel/intern/modifier.cc +++ b/source/blender/blenkernel/intern/modifier.cc @@ -43,7 +43,7 @@ #include "BLI_string_utils.hh" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_DerivedMesh.hh" #include "BKE_appdir.hh" @@ -51,7 +51,7 @@ #include "BKE_editmesh_cache.hh" #include "BKE_effect.h" #include "BKE_fluid.h" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_gpencil_modifier_legacy.h" #include "BKE_idtype.hh" #include "BKE_key.hh" diff --git a/source/blender/blenkernel/intern/movieclip.cc b/source/blender/blenkernel/intern/movieclip.cc index 07ff7388d22..b1e86e81b78 100644 --- a/source/blender/blenkernel/intern/movieclip.cc +++ b/source/blender/blenkernel/intern/movieclip.cc @@ -9,7 +9,6 @@ #include #include #include -#include #ifndef WIN32 # include @@ -26,6 +25,7 @@ #include "DNA_defaults.h" +#include "DNA_constraint_types.h" #include "DNA_gpencil_legacy_types.h" #include "DNA_movieclip_types.h" #include "DNA_node_types.h" @@ -42,16 +42,19 @@ #include "BLI_math_vector.h" #include "BLI_threads.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" -#include "BKE_bpath.hh" +#include "BKE_anim_data.h" +#include "BKE_bpath.h" #include "BKE_colortools.hh" +#include "BKE_global.h" #include "BKE_idtype.hh" #include "BKE_image.h" /* openanim */ #include "BKE_lib_id.hh" #include "BKE_lib_query.hh" #include "BKE_main.hh" #include "BKE_movieclip.h" +#include "BKE_node.h" #include "BKE_node_tree_update.hh" #include "BKE_tracking.h" @@ -69,6 +72,8 @@ #include "BLO_read_write.hh" +#include "tracking_private.h" + static void free_buffers(MovieClip *clip); static void movie_clip_init_data(ID *id) @@ -82,16 +87,12 @@ static void movie_clip_init_data(ID *id) BKE_color_managed_colorspace_settings_init(&movie_clip->colorspace_settings); } -static void movie_clip_copy_data(Main * /*bmain*/, - std::optional /*owner_library*/, - ID *id_dst, - const ID *id_src, - const int flag) +static void movie_clip_copy_data(Main * /*bmain*/, ID *id_dst, const ID *id_src, const int flag) { MovieClip *movie_clip_dst = (MovieClip *)id_dst; const MovieClip *movie_clip_src = (const MovieClip *)id_src; - /* We never handle user-count here for owned data. */ + /* We never handle user-count here for own data. */ const int flag_subdata = flag | LIB_ID_CREATE_NO_USER_REFCOUNT; movie_clip_dst->anim = nullptr; @@ -284,7 +285,6 @@ static void movieclip_blend_read_data(BlendDataReader *reader, ID *id) IDTypeInfo IDType_ID_MC = { /*id_code*/ ID_MC, /*id_filter*/ FILTER_ID_MC, - /*dependencies_id_types*/ FILTER_ID_GD_LEGACY | FILTER_ID_IM, /*main_listbase_index*/ INDEX_ID_MC, /*struct_size*/ sizeof(MovieClip), /*name*/ "MovieClip", diff --git a/source/blender/blenkernel/intern/multires.cc b/source/blender/blenkernel/intern/multires.cc index 1d7f2902d2f..fb5774b2181 100644 --- a/source/blender/blenkernel/intern/multires.cc +++ b/source/blender/blenkernel/intern/multires.cc @@ -17,6 +17,7 @@ #include "DNA_scene_types.h" #include "BLI_bitmap.h" +#include "BLI_blenlib.h" #include "BLI_math_matrix.h" #include "BLI_task.h" #include "BLI_utildefines.h" @@ -25,12 +26,13 @@ #include "BKE_cdderivedmesh.h" #include "BKE_editmesh.hh" #include "BKE_mesh.hh" +#include "BKE_mesh_mapping.hh" #include "BKE_mesh_runtime.hh" #include "BKE_modifier.hh" #include "BKE_multires.hh" #include "BKE_paint.hh" #include "BKE_pbvh_api.hh" -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "BKE_subdiv_ccg.hh" #include "BKE_subsurf.hh" @@ -40,6 +42,8 @@ #include "DEG_depsgraph_query.hh" +#include "multires_reshape.hh" + #include #include diff --git a/source/blender/blenkernel/intern/multires_reshape.cc b/source/blender/blenkernel/intern/multires_reshape.cc index 95ffa77489c..852c251ddb7 100644 --- a/source/blender/blenkernel/intern/multires_reshape.cc +++ b/source/blender/blenkernel/intern/multires_reshape.cc @@ -9,13 +9,18 @@ #include "MEM_guardedalloc.h" #include "DNA_mesh_types.h" +#include "DNA_meshdata_types.h" #include "DNA_modifier_types.h" +#include "DNA_scene_types.h" #include "BKE_customdata.hh" #include "BKE_lib_id.hh" +#include "BKE_mesh.hh" +#include "BKE_mesh_runtime.hh" #include "BKE_modifier.hh" #include "BKE_multires.hh" #include "BKE_object.hh" +#include "BKE_subdiv.hh" #include "BKE_subsurf.hh" #include "BLI_math_vector.h" diff --git a/source/blender/blenkernel/intern/multires_reshape_apply_base.cc b/source/blender/blenkernel/intern/multires_reshape_apply_base.cc index 7a35824a06f..5fce126a424 100644 --- a/source/blender/blenkernel/intern/multires_reshape_apply_base.cc +++ b/source/blender/blenkernel/intern/multires_reshape_apply_base.cc @@ -11,14 +11,24 @@ #include "MEM_guardedalloc.h" #include "DNA_mesh_types.h" +#include "DNA_meshdata_types.h" +#include "DNA_modifier_types.h" +#include "DNA_object_types.h" +#include "BLI_listbase.h" #include "BLI_math_matrix.h" #include "BLI_math_vector.h" +#include "BKE_customdata.hh" +#include "BKE_lib_id.hh" #include "BKE_mesh.hh" +#include "BKE_mesh_mapping.hh" +#include "BKE_mesh_runtime.hh" #include "BKE_multires.hh" #include "BKE_subdiv_eval.hh" +#include "DEG_depsgraph_query.hh" + void multires_reshape_apply_base_update_mesh_coords(MultiresReshapeContext *reshape_context) { Mesh *base_mesh = reshape_context->base_mesh; diff --git a/source/blender/blenkernel/intern/multires_reshape_smooth.cc b/source/blender/blenkernel/intern/multires_reshape_smooth.cc index 9ae7cab5394..3a444f3e1f8 100644 --- a/source/blender/blenkernel/intern/multires_reshape_smooth.cc +++ b/source/blender/blenkernel/intern/multires_reshape_smooth.cc @@ -11,6 +11,8 @@ #include "MEM_guardedalloc.h" #include "DNA_mesh_types.h" +#include "DNA_meshdata_types.h" +#include "DNA_modifier_types.h" #include "BLI_math_matrix.h" #include "BLI_math_vector.h" @@ -27,6 +29,7 @@ #include "opensubdiv_converter_capi.hh" #include "opensubdiv_evaluator_capi.hh" +#include "opensubdiv_topology_refiner_capi.hh" #include "atomic_ops.h" #include "subdiv_converter.hh" diff --git a/source/blender/blenkernel/intern/multires_reshape_subdivide.cc b/source/blender/blenkernel/intern/multires_reshape_subdivide.cc index 4d82b210e40..c6f2f20d8f8 100644 --- a/source/blender/blenkernel/intern/multires_reshape_subdivide.cc +++ b/source/blender/blenkernel/intern/multires_reshape_subdivide.cc @@ -14,11 +14,17 @@ #include "DNA_scene_types.h" #include "BKE_customdata.hh" +#include "BKE_lib_id.hh" #include "BKE_mesh.hh" +#include "BKE_mesh_runtime.hh" +#include "BKE_modifier.hh" #include "BKE_multires.hh" +#include "BKE_subdiv.hh" #include "BKE_subsurf.hh" #include "BLI_math_vector.h" +#include "DEG_depsgraph_query.hh" + #include "multires_reshape.hh" static void multires_subdivide_create_object_space_linear_grids(Mesh *mesh) diff --git a/source/blender/blenkernel/intern/multires_reshape_util.cc b/source/blender/blenkernel/intern/multires_reshape_util.cc index 4258fbd48e5..f3b33e5c4c7 100644 --- a/source/blender/blenkernel/intern/multires_reshape_util.cc +++ b/source/blender/blenkernel/intern/multires_reshape_util.cc @@ -14,17 +14,21 @@ #include "DNA_meshdata_types.h" #include "DNA_modifier_types.h" #include "DNA_object_types.h" +#include "DNA_scene_types.h" #include "BLI_math_matrix.h" #include "BLI_task.h" #include "BKE_attribute.hh" #include "BKE_customdata.hh" +#include "BKE_mesh.hh" #include "BKE_mesh_runtime.hh" #include "BKE_multires.hh" #include "BKE_subdiv.hh" #include "BKE_subdiv_ccg.hh" #include "BKE_subdiv_eval.hh" +#include "BKE_subdiv_foreach.hh" +#include "BKE_subdiv_mesh.hh" #include "DEG_depsgraph_query.hh" @@ -758,7 +762,7 @@ void multires_reshape_object_grids_to_tangent_displacement( * \{ */ /* TODO(sergey): Make foreach_grid_coordinate more accessible and move this functionality to - * its own file. */ + * own file. */ static void assign_final_coords_from_mdisps(const MultiresReshapeContext *reshape_context, const GridCoord *grid_coord, diff --git a/source/blender/blenkernel/intern/multires_reshape_vertcos.cc b/source/blender/blenkernel/intern/multires_reshape_vertcos.cc index 0d1eb52f09e..8d9d1bdd086 100644 --- a/source/blender/blenkernel/intern/multires_reshape_vertcos.cc +++ b/source/blender/blenkernel/intern/multires_reshape_vertcos.cc @@ -8,6 +8,9 @@ #include "multires_reshape.hh" +#include "DNA_mesh_types.h" +#include "DNA_meshdata_types.h" + #include "BLI_math_vector.h" #include "BKE_subdiv_foreach.hh" diff --git a/source/blender/blenkernel/intern/multires_subdiv.cc b/source/blender/blenkernel/intern/multires_subdiv.cc index 685b8fb01f7..c3d1c970857 100644 --- a/source/blender/blenkernel/intern/multires_subdiv.cc +++ b/source/blender/blenkernel/intern/multires_subdiv.cc @@ -8,8 +8,12 @@ #include "MEM_guardedalloc.h" +#include "DNA_mesh_types.h" +#include "DNA_scene_types.h" + #include "BLI_utildefines.h" +#include "BKE_mesh.hh" #include "BKE_modifier.hh" #include "BKE_multires.hh" #include "BKE_subdiv.hh" diff --git a/source/blender/blenkernel/intern/multires_unsubdivide.cc b/source/blender/blenkernel/intern/multires_unsubdivide.cc index fd27c74a85e..6fd299a8349 100644 --- a/source/blender/blenkernel/intern/multires_unsubdivide.cc +++ b/source/blender/blenkernel/intern/multires_unsubdivide.cc @@ -20,12 +20,19 @@ #include "BLI_math_vector.h" #include "BKE_customdata.hh" +#include "BKE_lib_id.hh" #include "BKE_mesh.hh" +#include "BKE_mesh_mapping.hh" +#include "BKE_mesh_runtime.hh" +#include "BKE_modifier.hh" #include "BKE_multires.hh" +#include "BKE_subdiv.hh" #include "BKE_subsurf.hh" #include "bmesh.hh" +#include "DEG_depsgraph_query.hh" + #include "multires_reshape.hh" #include "multires_unsubdivide.hh" diff --git a/source/blender/blenkernel/intern/nla.cc b/source/blender/blenkernel/intern/nla.cc index 56c1d10cd3c..9040088dc1c 100644 --- a/source/blender/blenkernel/intern/nla.cc +++ b/source/blender/blenkernel/intern/nla.cc @@ -23,7 +23,7 @@ #include "BLI_string_utils.hh" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_anim_types.h" #include "DNA_scene_types.h" @@ -31,8 +31,8 @@ #include "DNA_speaker_types.h" #include "BKE_action.h" -#include "BKE_fcurve.hh" -#include "BKE_global.hh" +#include "BKE_fcurve.h" +#include "BKE_global.h" #include "BKE_lib_id.hh" #include "BKE_lib_query.hh" #include "BKE_main.hh" @@ -2367,7 +2367,7 @@ static void blend_write_nla_strips(BlendWriter *writer, ListBase *strips) BLO_write_struct_list(writer, NlaStrip, strips); LISTBASE_FOREACH (NlaStrip *, strip, strips) { /* write the strip's F-Curves and modifiers */ - BKE_fcurve_blend_write_listbase(writer, &strip->fcurves); + BKE_fcurve_blend_write(writer, &strip->fcurves); BKE_fmodifiers_blend_write(writer, &strip->modifiers); /* write the strip's children */ @@ -2384,7 +2384,7 @@ static void blend_data_read_nla_strips(BlendDataReader *reader, ListBase *strips /* strip's F-Curves */ BLO_read_list(reader, &strip->fcurves); - BKE_fcurve_blend_read_data_listbase(reader, &strip->fcurves); + BKE_fcurve_blend_read_data(reader, &strip->fcurves); /* strip's F-Modifiers */ BLO_read_list(reader, &strip->modifiers); diff --git a/source/blender/blenkernel/intern/node.cc b/source/blender/blenkernel/intern/node.cc index b0c02a07686..fab68a2badc 100644 --- a/source/blender/blenkernel/intern/node.cc +++ b/source/blender/blenkernel/intern/node.cc @@ -14,7 +14,6 @@ #include #include #include -#include /* Allow using deprecated functionality for .blend file I/O. */ #define DNA_DEPRECATED_ALLOW @@ -48,18 +47,18 @@ #include "BLI_time.h" #include "BLI_utildefines.h" #include "BLI_vector_set.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "IMB_imbuf.hh" -#include "BKE_anim_data.hh" +#include "BKE_anim_data.h" #include "BKE_animsys.h" #include "BKE_asset.hh" -#include "BKE_bpath.hh" +#include "BKE_bpath.h" #include "BKE_colortools.hh" #include "BKE_context.hh" #include "BKE_cryptomatte.h" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_idprop.h" #include "BKE_idprop.hh" #include "BKE_idtype.hh" @@ -151,16 +150,12 @@ static void ntree_init_data(ID *id) ntree_set_typeinfo(ntree, nullptr); } -static void ntree_copy_data(Main * /*bmain*/, - std::optional /*owner_library*/, - ID *id_dst, - const ID *id_src, - const int flag) +static void ntree_copy_data(Main * /*bmain*/, ID *id_dst, const ID *id_src, const int flag) { bNodeTree *ntree_dst = reinterpret_cast(id_dst); const bNodeTree *ntree_src = reinterpret_cast(id_src); - /* We never handle user-count here for owned data. */ + /* We never handle user-count here for own data. */ const int flag_subdata = flag | LIB_ID_CREATE_NO_USER_REFCOUNT; ntree_dst->runtime = MEM_new(__func__); @@ -358,7 +353,6 @@ static void library_foreach_node_socket(LibraryForeachIDData *data, bNodeSocket case SOCK_RGBA: case SOCK_BOOLEAN: case SOCK_ROTATION: - case SOCK_MATRIX: case SOCK_INT: case SOCK_STRING: case SOCK_CUSTOM: @@ -709,12 +703,10 @@ static void write_node_socket_default_value(BlendWriter *writer, const bNodeSock case SOCK_ROTATION: BLO_write_struct(writer, bNodeSocketValueRotation, sock->default_value); break; - case SOCK_MENU: + case SOCK_MENU: { BLO_write_struct(writer, bNodeSocketValueMenu, sock->default_value); break; - case SOCK_MATRIX: - /* Matrix sockets currently have no default value. */ - break; + } case SOCK_CUSTOM: /* Custom node sockets where default_value is defined uses custom properties for storage. */ break; @@ -803,10 +795,10 @@ void ntreeBlendWrite(BlendWriter *writer, bNodeTree *ntree) /* Not in undo case. */ if (!BLO_write_is_undo(writer)) { switch (ndg->type) { - case CMP_NODE_GLARE_STREAKS: + case 2: /* Grrrr! magic numbers :( */ ndg->angle = ndg->streaks; break; - case CMP_NODE_GLARE_SIMPLE_STAR: + case 0: ndg->angle = ndg->star_45; break; default: @@ -947,7 +939,6 @@ static bool is_node_socket_supported(const bNodeSocket *sock) case SOCK_MATERIAL: case SOCK_ROTATION: case SOCK_MENU: - case SOCK_MATRIX: return true; } return false; @@ -1277,8 +1268,6 @@ static AssetTypeInfo AssetType_NT = { IDTypeInfo IDType_ID_NT = { /*id_code*/ ID_NT, /*id_filter*/ FILTER_ID_NT, - /* IDProps of nodes, and #bNode.id, can use any type of ID. */ - /*dependencies_id_types*/ FILTER_ID_ALL, /*main_listbase_index*/ INDEX_ID_NT, /*struct_size*/ sizeof(bNodeTree), /*name*/ "NodeTree", @@ -1874,7 +1863,6 @@ static void socket_id_user_increment(bNodeSocket *sock) case SOCK_RGBA: case SOCK_BOOLEAN: case SOCK_ROTATION: - case SOCK_MATRIX: case SOCK_INT: case SOCK_STRING: case SOCK_MENU: @@ -1922,7 +1910,6 @@ static bool socket_id_user_decrement(bNodeSocket *sock) case SOCK_RGBA: case SOCK_BOOLEAN: case SOCK_ROTATION: - case SOCK_MATRIX: case SOCK_INT: case SOCK_STRING: case SOCK_MENU: @@ -1978,7 +1965,6 @@ void nodeModifySocketType(bNodeTree *ntree, case SOCK_SHADER: case SOCK_BOOLEAN: case SOCK_ROTATION: - case SOCK_MATRIX: case SOCK_CUSTOM: case SOCK_OBJECT: case SOCK_IMAGE: @@ -2085,8 +2071,6 @@ const char *nodeStaticSocketType(const int type, const int subtype) return "NodeSocketBool"; case SOCK_ROTATION: return "NodeSocketRotation"; - case SOCK_MATRIX: - return "NodeSocketMatrix"; case SOCK_VECTOR: switch (PropertySubType(subtype)) { case PROP_TRANSLATION: @@ -2170,8 +2154,6 @@ const char *nodeStaticSocketInterfaceTypeNew(const int type, const int subtype) return "NodeTreeInterfaceSocketBool"; case SOCK_ROTATION: return "NodeTreeInterfaceSocketRotation"; - case SOCK_MATRIX: - return "NodeTreeInterfaceSocketMatrix"; case SOCK_VECTOR: switch (PropertySubType(subtype)) { case PROP_TRANSLATION: @@ -2227,8 +2209,6 @@ const char *nodeStaticSocketLabel(const int type, const int /*subtype*/) return "Boolean"; case SOCK_ROTATION: return "Rotation"; - case SOCK_MATRIX: - return "Matrix"; case SOCK_VECTOR: return "Vector"; case SOCK_RGBA: @@ -2546,7 +2526,7 @@ void nodeUniqueName(bNodeTree *ntree, bNode *node) void nodeUniqueID(bNodeTree *ntree, bNode *node) { /* Use a pointer cast to avoid overflow warnings. */ - const double time = BLI_time_now_seconds() * 1000000.0; + const double time = BLI_check_seconds_timer() * 1000000.0; blender::RandomNumberGenerator id_rng{*reinterpret_cast(&time)}; /* In the unlikely case that the random ID doesn't match, choose a new one until it does. */ @@ -2776,9 +2756,6 @@ static void *socket_value_storage(bNodeSocket &socket) return &socket.default_value_typed()->value_euler; case SOCK_MENU: return &socket.default_value_typed()->value; - case SOCK_MATRIX: - /* Matrix sockets currently have no default value. */ - return nullptr; case SOCK_STRING: /* We don't want do this now! */ return nullptr; @@ -4177,7 +4154,7 @@ static void node_replace_undefined_types(bNode *node) /* This type name is arbitrary, it just has to be unique enough to not match a future node * idname. Includes the old type identifier for debugging purposes. */ const std::string old_idname = node->idname; - SNPRINTF(node->idname, "Undefined[%s]", old_idname.c_str()); + BLI_snprintf(node->idname, sizeof(node->idname), "Undefined[%s]", old_idname.c_str()); node->typeinfo = &NodeTypeUndefined; } } @@ -4367,8 +4344,6 @@ std::optional socket_type_to_custom_data_type(eNodeSocketDataty return CD_PROP_BOOL; case SOCK_ROTATION: return CD_PROP_QUATERNION; - case SOCK_MATRIX: - return CD_PROP_FLOAT4X4; case SOCK_INT: return CD_PROP_INT32; case SOCK_STRING: @@ -4397,8 +4372,6 @@ std::optional custom_data_type_to_socket_type(eCustomDataTy return SOCK_RGBA; case CD_PROP_QUATERNION: return SOCK_ROTATION; - case CD_PROP_FLOAT4X4: - return SOCK_MATRIX; default: return std::nullopt; } @@ -4433,9 +4406,6 @@ const CPPType *socket_type_to_geo_nodes_base_cpp_type(const eNodeSocketDatatype case SOCK_ROTATION: cpp_type = &CPPType::get(); break; - case SOCK_MATRIX: - cpp_type = &CPPType::get(); - break; default: cpp_type = slow_socket_type_to_geo_nodes_base_cpp_type(type); break; @@ -4464,9 +4434,6 @@ std::optional geo_nodes_base_cpp_type_to_socket_type(const if (type.is()) { return SOCK_ROTATION; } - if (type.is()) { - return SOCK_MATRIX; - } if (type.is()) { return SOCK_STRING; } diff --git a/source/blender/blenkernel/intern/node_enum_definition.cc b/source/blender/blenkernel/intern/node_enum_definition.cc index 33531cf73be..4ea5362de4f 100644 --- a/source/blender/blenkernel/intern/node_enum_definition.cc +++ b/source/blender/blenkernel/intern/node_enum_definition.cc @@ -8,7 +8,9 @@ #include "DNA_array_utils.hh" #include "DNA_node_types.h" +#include "BKE_node.h" #include "BKE_node_enum.hh" +#include "BKE_node_runtime.hh" using blender::bke::NodeSocketValueMenuRuntimeFlag; diff --git a/source/blender/blenkernel/intern/node_runtime.cc b/source/blender/blenkernel/intern/node_runtime.cc index 105d30bbd50..74054663010 100644 --- a/source/blender/blenkernel/intern/node_runtime.cc +++ b/source/blender/blenkernel/intern/node_runtime.cc @@ -10,6 +10,7 @@ #include "BLI_function_ref.hh" #include "BLI_stack.hh" #include "BLI_task.hh" +#include "BLI_timeit.hh" #include "NOD_geometry_nodes_lazy_function.hh" diff --git a/source/blender/blenkernel/intern/node_socket_value.cc b/source/blender/blenkernel/intern/node_socket_value.cc index b44ccf8f37a..6186de63c8e 100644 --- a/source/blender/blenkernel/intern/node_socket_value.cc +++ b/source/blender/blenkernel/intern/node_socket_value.cc @@ -54,9 +54,6 @@ template static std::optional static_type_to_so if constexpr (is_single_or_field_or_grid_v) { return SOCK_ROTATION; } - if constexpr (is_same_any_v>) { - return SOCK_MATRIX; - } if constexpr (is_same_any_v) { return SOCK_STRING; } @@ -198,10 +195,6 @@ void SocketValueVariant::store_single(const eNodeSocketDatatype socket_type, con value_.emplace(*static_cast(value)); break; } - case SOCK_MATRIX: { - value_.emplace(*static_cast(value)); - break; - } case SOCK_RGBA: { value_.emplace(*static_cast(value)); break; @@ -288,8 +281,6 @@ void *SocketValueVariant::allocate_single(const eNodeSocketDatatype socket_type) return value_.allocate(); case SOCK_ROTATION: return value_.allocate(); - case SOCK_MATRIX: - return value_.allocate(); case SOCK_RGBA: return value_.allocate(); case SOCK_STRING: @@ -353,9 +344,6 @@ INSTANTIATE_SINGLE_AND_FIELD_AND_GRID(blender::math::Quaternion) INSTANTIATE(std::string) INSTANTIATE(fn::GField) -INSTANTIATE(float4x4) -INSTANTIATE(fn::Field) - #ifdef WITH_OPENVDB INSTANTIATE(GVolumeGrid) #endif diff --git a/source/blender/blenkernel/intern/node_tree_update.cc b/source/blender/blenkernel/intern/node_tree_update.cc index 2a86f7ef4d3..3be422efd37 100644 --- a/source/blender/blenkernel/intern/node_tree_update.cc +++ b/source/blender/blenkernel/intern/node_tree_update.cc @@ -8,13 +8,14 @@ #include "BLI_rand.hh" #include "BLI_set.hh" #include "BLI_stack.hh" +#include "BLI_timeit.hh" #include "BLI_vector_set.hh" #include "DNA_anim_types.h" #include "DNA_modifier_types.h" #include "DNA_node_types.h" -#include "BKE_anim_data.hh" +#include "BKE_anim_data.h" #include "BKE_image.h" #include "BKE_main.hh" #include "BKE_node.hh" @@ -30,6 +31,8 @@ #include "NOD_socket.hh" #include "NOD_texture.h" +#include "DEG_depsgraph_query.hh" + using namespace blender::nodes; /** @@ -1162,7 +1165,7 @@ class NodeTreeMainUpdater { * be used without causing updates all the time currently. In the future we could try to * handle other drivers better as well. * Note that this optimization only works in practice when the depsgraph didn't also get a - * copy-on-evaluation tag for the node tree (which happens when changing node properties). It + * copy-on-write tag for the node tree (which happens when changing node properties). It * does work in a few situations like adding reroutes and duplicating nodes though. */ LISTBASE_FOREACH (const FCurve *, fcurve, &adt->drivers) { const ChannelDriver *driver = fcurve->driver; diff --git a/source/blender/blenkernel/intern/node_tree_zones.cc b/source/blender/blenkernel/intern/node_tree_zones.cc index 54288723286..3f00b63c5ad 100644 --- a/source/blender/blenkernel/intern/node_tree_zones.cc +++ b/source/blender/blenkernel/intern/node_tree_zones.cc @@ -12,6 +12,8 @@ #include "BLI_bit_span_ops.hh" #include "BLI_set.hh" #include "BLI_struct_equality_utils.hh" +#include "BLI_task.hh" +#include "BLI_timeit.hh" namespace blender::bke { diff --git a/source/blender/blenkernel/intern/object.cc b/source/blender/blenkernel/intern/object.cc index 04bfc404acc..ae37e27d5bb 100644 --- a/source/blender/blenkernel/intern/object.cc +++ b/source/blender/blenkernel/intern/object.cc @@ -12,7 +12,6 @@ #include #include #include -#include #include "CLG_log.h" @@ -63,34 +62,34 @@ #include "BLI_threads.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_DerivedMesh.hh" #include "BKE_action.h" -#include "BKE_anim_data.hh" +#include "BKE_anim_data.h" #include "BKE_anim_path.h" #include "BKE_anim_visualization.h" #include "BKE_animsys.h" #include "BKE_armature.hh" #include "BKE_asset.hh" -#include "BKE_bpath.hh" +#include "BKE_bpath.h" #include "BKE_camera.h" -#include "BKE_collection.hh" +#include "BKE_collection.h" #include "BKE_constraint.h" #include "BKE_crazyspace.hh" #include "BKE_curve.hh" #include "BKE_curves.hh" #include "BKE_deform.hh" #include "BKE_displist.h" -#include "BKE_duplilist.hh" +#include "BKE_duplilist.h" #include "BKE_editmesh.hh" #include "BKE_editmesh_cache.hh" #include "BKE_effect.h" -#include "BKE_fcurve.hh" +#include "BKE_fcurve.h" #include "BKE_fcurve_driver.h" #include "BKE_geometry_set.hh" #include "BKE_geometry_set_instances.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_gpencil_geom_legacy.h" #include "BKE_gpencil_legacy.h" #include "BKE_gpencil_modifier_legacy.h" @@ -124,7 +123,7 @@ #include "BKE_pose_backup.h" #include "BKE_preview_image.hh" #include "BKE_rigidbody.h" -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "BKE_shader_fx.h" #include "BKE_softbody.h" #include "BKE_speaker.h" @@ -139,7 +138,7 @@ #include "DRW_engine.hh" #include "BLO_read_write.hh" -#include "BLO_readfile.hh" +#include "BLO_readfile.h" #include "SEQ_sequencer.hh" @@ -189,11 +188,7 @@ static void object_init_data(ID *id) animviz_settings_init(&ob->avs); } -static void object_copy_data(Main *bmain, - std::optional /*owner_library*/, - ID *id_dst, - const ID *id_src, - const int flag) +static void object_copy_data(Main *bmain, ID *id_dst, const ID *id_src, const int flag) { Object *ob_dst = (Object *)id_dst; const Object *ob_src = (const Object *)id_src; @@ -1082,8 +1077,6 @@ static AssetTypeInfo AssetType_OB = { IDTypeInfo IDType_ID_OB = { /*id_code*/ ID_OB, /*id_filter*/ FILTER_ID_OB, - /* Could be more specific, but simpler to just always say 'yes' here. */ - /*dependencies_id_types*/ FILTER_ID_ALL, /*main_listbase_index*/ INDEX_ID_OB, /*struct_size*/ sizeof(Object), /*name*/ "Object", @@ -1184,16 +1177,14 @@ void BKE_object_modifier_hook_reset(Object *ob, HookModifierData *hmd) /* Calculate the world-space matrix for the pose-channel target first, * then carry on as usual. */ - mul_m4_m4m4(mat, hmd->object->object_to_world().ptr(), pchan->pose_mat); + mul_m4_m4m4(mat, hmd->object->object_to_world, pchan->pose_mat); invert_m4_m4(imat, mat); - mul_m4_m4m4(hmd->parentinv, imat, ob->object_to_world().ptr()); + mul_m4_m4m4(hmd->parentinv, imat, ob->object_to_world); } else { - invert_m4_m4(hmd->object->runtime->world_to_object.ptr(), - hmd->object->object_to_world().ptr()); - mul_m4_m4m4( - hmd->parentinv, hmd->object->world_to_object().ptr(), ob->object_to_world().ptr()); + invert_m4_m4(hmd->object->world_to_object, hmd->object->object_to_world); + mul_m4_m4m4(hmd->parentinv, hmd->object->world_to_object, ob->object_to_world); } } } @@ -1211,15 +1202,14 @@ void BKE_object_modifier_gpencil_hook_reset(Object *ob, HookGpencilModifierData /* Calculate the world-space matrix for the pose-channel target first, * then carry on as usual. */ - mul_m4_m4m4(mat, hmd->object->object_to_world().ptr(), pchan->pose_mat); + mul_m4_m4m4(mat, hmd->object->object_to_world, pchan->pose_mat); invert_m4_m4(imat, mat); - mul_m4_m4m4(hmd->parentinv, imat, ob->object_to_world().ptr()); + mul_m4_m4m4(hmd->parentinv, imat, ob->object_to_world); } else { - invert_m4_m4(hmd->object->runtime->world_to_object.ptr(), - hmd->object->object_to_world().ptr()); - mul_m4_m4m4(hmd->parentinv, hmd->object->world_to_object().ptr(), ob->object_to_world().ptr()); + invert_m4_m4(hmd->object->world_to_object, hmd->object->object_to_world); + mul_m4_m4m4(hmd->parentinv, hmd->object->world_to_object, ob->object_to_world); } } @@ -1281,7 +1271,7 @@ bool BKE_object_support_modifier_type_check(const Object *ob, int modifier_type) } if (ELEM(ob->type, OB_POINTCLOUD, OB_CURVES)) { - return ELEM(modifier_type, eModifierType_Nodes, eModifierType_MeshSequenceCache); + return modifier_type == eModifierType_Nodes; } if (ob->type == OB_VOLUME) { return mti->modify_geometry_set != nullptr; @@ -1548,7 +1538,7 @@ static void object_update_from_subsurf_ccg(Object *object) return; } /* If object does not own evaluated mesh we can not access it since it might be freed already - * (happens on dependency graph free where order of evaluated IDs free is undefined). + * (happens on dependency graph free where order of CoW-ed IDs free is undefined). * * Good news is: such mesh does not have modifiers applied, so no need to worry about CCG. */ if (!object->runtime->is_data_eval_owned) { @@ -1615,13 +1605,13 @@ static void object_update_from_subsurf_ccg(Object *object) void BKE_object_eval_assign_data(Object *object_eval, ID *data_eval, bool is_owned) { - BLI_assert(object_eval->id.tag & LIB_TAG_COPIED_ON_EVAL); + BLI_assert(object_eval->id.tag & LIB_TAG_COPIED_ON_WRITE); BLI_assert(object_eval->runtime->data_eval == nullptr); BLI_assert(data_eval->tag & LIB_TAG_NO_MAIN); if (is_owned) { /* Set flag for debugging. */ - data_eval->tag |= LIB_TAG_COPIED_ON_EVAL_FINAL_RESULT; + data_eval->tag |= LIB_TAG_COPIED_ON_WRITE_EVAL_RESULT; } /* Assigned evaluated data. */ @@ -1633,7 +1623,7 @@ void BKE_object_eval_assign_data(Object *object_eval, ID *data_eval, bool is_own if (GS(data->name) == GS(data_eval->name)) { /* NOTE: we are not supposed to invoke evaluation for original objects, * but some areas are still being ported, so we play safe here. */ - if (object_eval->id.tag & LIB_TAG_COPIED_ON_EVAL) { + if (object_eval->id.tag & LIB_TAG_COPIED_ON_WRITE) { object_eval->data = data_eval; } } @@ -1675,7 +1665,7 @@ void BKE_object_free_derived_caches(Object *ob) ob->runtime->mesh_deform_eval = nullptr; } - /* Restore initial pointer for copy-on-evaluation data-blocks, object->data + /* Restore initial pointer for copy-on-write data-blocks, object->data * might be pointing to an evaluated data-block data was just freed above. */ if (ob->runtime->data_orig != nullptr) { ob->data = ob->runtime->data_orig; @@ -2990,10 +2980,10 @@ void BKE_object_matrix_local_get(Object *ob, float r_mat[4][4]) BKE_object_get_parent_matrix(ob, ob->parent, par_imat); invert_m4(par_imat); - mul_m4_m4m4(r_mat, par_imat, ob->object_to_world().ptr()); + mul_m4_m4m4(r_mat, par_imat, ob->object_to_world); } else { - copy_m4_m4(r_mat, ob->object_to_world().ptr()); + copy_m4_m4(r_mat, ob->object_to_world); } } @@ -3100,15 +3090,15 @@ static void give_parvert(Object *par, int nr, float vec[3]) if (par->type == OB_MESH) { Mesh *mesh = (Mesh *)par->data; BMEditMesh *em = mesh->edit_mesh; - Mesh *mesh_eval = (em) ? BKE_object_get_editmesh_eval_final(par) : - BKE_object_get_evaluated_mesh(par); + Mesh *me_eval = (em) ? BKE_object_get_editmesh_eval_final(par) : + BKE_object_get_evaluated_mesh(par); - if (mesh_eval) { - const Span positions = mesh_eval->vert_positions(); + if (me_eval) { + const Span positions = me_eval->vert_positions(); int count = 0; - int numVerts = mesh_eval->verts_num; + int numVerts = me_eval->verts_num; - if (em && mesh_eval->runtime->wrapper_type == ME_WRAPPER_TYPE_BMESH) { + if (em && me_eval->runtime->wrapper_type == ME_WRAPPER_TYPE_BMESH) { numVerts = em->bm->totvert; if (em->bm->elem_table_dirty & BM_VERT) { #ifdef VPARENT_THREADING_HACK @@ -3123,10 +3113,10 @@ static void give_parvert(Object *par, int nr, float vec[3]) #endif } if (nr < numVerts) { - if (mesh_eval && mesh_eval->runtime->edit_data && - !mesh_eval->runtime->edit_data->vertexCos.is_empty()) + if (me_eval && me_eval->runtime->edit_data && + !me_eval->runtime->edit_data->vertexCos.is_empty()) { - add_v3_v3(vec, mesh_eval->runtime->edit_data->vertexCos[nr]); + add_v3_v3(vec, me_eval->runtime->edit_data->vertexCos[nr]); } else { const BMVert *v = BM_vert_at_index(em->bm, nr); @@ -3135,8 +3125,8 @@ static void give_parvert(Object *par, int nr, float vec[3]) count++; } } - else if (CustomData_has_layer(&mesh_eval->vert_data, CD_ORIGINDEX)) { - const int *index = (const int *)CustomData_get_layer(&mesh_eval->vert_data, CD_ORIGINDEX); + else if (CustomData_has_layer(&me_eval->vert_data, CD_ORIGINDEX)) { + const int *index = (const int *)CustomData_get_layer(&me_eval->vert_data, CD_ORIGINDEX); /* Get the average of all verts with (original index == nr). */ for (int i = 0; i < numVerts; i++) { if (index[i] == nr) { @@ -3160,7 +3150,7 @@ static void give_parvert(Object *par, int nr, float vec[3]) } else { /* use first index if its out of range */ - if (mesh_eval->verts_num) { + if (me_eval->verts_num) { copy_v3_v3(vec, positions[0]); } } @@ -3250,32 +3240,32 @@ void BKE_object_get_parent_matrix(Object *ob, Object *par, float r_parentmat[4][ } if (ok) { - mul_m4_m4m4(r_parentmat, par->object_to_world().ptr(), tmat); + mul_m4_m4m4(r_parentmat, par->object_to_world, tmat); } else { - copy_m4_m4(r_parentmat, par->object_to_world().ptr()); + copy_m4_m4(r_parentmat, par->object_to_world); } break; } case PARBONE: ob_parbone(ob, par, tmat); - mul_m4_m4m4(r_parentmat, par->object_to_world().ptr(), tmat); + mul_m4_m4m4(r_parentmat, par->object_to_world, tmat); break; case PARVERT1: unit_m4(r_parentmat); give_parvert(par, ob->par1, vec); - mul_v3_m4v3(r_parentmat[3], par->object_to_world().ptr(), vec); + mul_v3_m4v3(r_parentmat[3], par->object_to_world, vec); break; case PARVERT3: ob_parvert3(ob, par, tmat); - mul_m4_m4m4(r_parentmat, par->object_to_world().ptr(), tmat); + mul_m4_m4m4(r_parentmat, par->object_to_world, tmat); break; case PARSKEL: - copy_m4_m4(r_parentmat, par->object_to_world().ptr()); + copy_m4_m4(r_parentmat, par->object_to_world); break; } } @@ -3313,7 +3303,7 @@ static void solve_parenting( /* origin, for help line */ if (set_origin) { if ((ob->partype & PARTYPE) == PARSKEL) { - copy_v3_v3(ob->runtime->parent_display_origin, par->object_to_world().location()); + copy_v3_v3(ob->runtime->parent_display_origin, par->object_to_world[3]); } else { copy_v3_v3(ob->runtime->parent_display_origin, totmat[3]); @@ -3332,10 +3322,10 @@ static void object_where_is_calc_ex(Depsgraph *depsgraph, Object *par = ob->parent; /* calculate parent matrix */ - solve_parenting(ob, par, true, ob->runtime->object_to_world.ptr(), r_originmat); + solve_parenting(ob, par, true, ob->object_to_world, r_originmat); } else { - BKE_object_to_mat4(ob, ob->runtime->object_to_world.ptr()); + BKE_object_to_mat4(ob, ob->object_to_world); } /* try to fall back to the scene rigid body world if none given */ @@ -3352,7 +3342,7 @@ static void object_where_is_calc_ex(Depsgraph *depsgraph, } /* set negative scale flag in object */ - if (is_negative_m4(ob->object_to_world().ptr())) { + if (is_negative_m4(ob->object_to_world)) { ob->transflag |= OB_NEG_SCALE; } else { @@ -3394,28 +3384,27 @@ void BKE_object_where_is_calc(Depsgraph *depsgraph, Scene *scene, Object *ob) object_where_is_calc_ex(depsgraph, scene, ob, ctime, nullptr, nullptr); } -blender::float4x4 BKE_object_calc_parent(Depsgraph *depsgraph, Scene *scene, Object *ob) +void BKE_object_workob_calc_parent(Depsgraph *depsgraph, Scene *scene, Object *ob, Object *workob) { blender::bke::ObjectRuntime workob_runtime; - Object workob; - BKE_object_workob_clear(&workob); - workob.runtime = &workob_runtime; + BKE_object_workob_clear(workob); + workob->runtime = &workob_runtime; - unit_m4(workob.runtime->object_to_world.ptr()); - unit_m4(workob.parentinv); - unit_m4(workob.constinv); + unit_m4(workob->object_to_world); + unit_m4(workob->parentinv); + unit_m4(workob->constinv); /* Since this is used while calculating parenting, * at this moment ob_eval->parent is still nullptr. */ - workob.parent = DEG_get_evaluated_object(depsgraph, ob->parent); + workob->parent = DEG_get_evaluated_object(depsgraph, ob->parent); - workob.trackflag = ob->trackflag; - workob.upflag = ob->upflag; + workob->trackflag = ob->trackflag; + workob->upflag = ob->upflag; - workob.partype = ob->partype; - workob.par1 = ob->par1; - workob.par2 = ob->par2; - workob.par3 = ob->par3; + workob->partype = ob->partype; + workob->par1 = ob->par1; + workob->par2 = ob->par2; + workob->par3 = ob->par3; /* The effects of constraints should NOT be included in the parent-inverse matrix. Constraints * are supposed to be applied after the object's local loc/rot/scale. If the (inverted) effect of @@ -3423,11 +3412,9 @@ blender::float4x4 BKE_object_calc_parent(Depsgraph *depsgraph, Scene *scene, Obj * object's local loc/rot/scale instead of after. For example, a "Copy Rotation" constraint would * rotate the object's local translation as well. See #82156. */ - STRNCPY(workob.parsubstr, ob->parsubstr); + STRNCPY(workob->parsubstr, ob->parsubstr); - BKE_object_where_is_calc(depsgraph, scene, &workob); - - return workob.object_to_world(); + BKE_object_where_is_calc(depsgraph, scene, workob); } void BKE_object_apply_mat4_ex(Object *ob, @@ -3495,8 +3482,8 @@ void BKE_object_apply_parent_inverse(Object *ob) * `inv(parent) @ world = parentinv` * `parentinv = inv(parent) @ world` * - * NOTE: If `ob->object_to_world().ptr()` has shear, then this `parentinv` is insufficient - * because `parent @ parentinv => shearless result` + * NOTE: If `ob->object_to_world` has shear, then this `parentinv` is insufficient because + * `parent @ parentinv => shearless result` * * Thus, local will have shear which cannot be decomposed into TRS: * `local = inv(parent @ parentinv) @ world` @@ -3524,7 +3511,7 @@ void BKE_object_apply_parent_inverse(Object *ob) copy_m4_m4(ob_local, ob->parentinv); invert_m4(ob_local); mul_m4_m4_post(ob_local, par_imat); - mul_m4_m4_post(ob_local, ob->object_to_world().ptr()); + mul_m4_m4_post(ob_local, ob->object_to_world); /* Send use_compat=False so the rotation is predictable. */ BKE_object_apply_mat4(ob, ob_local, false, false); @@ -3626,7 +3613,7 @@ static float3 boundbox_to_dimensions(const Object *ob, const std::optionalobject_to_world()); + const float3 scale = math::to_scale(float4x4(ob->object_to_world)); return scale * (bounds->max - bounds->min); } @@ -3677,8 +3664,10 @@ void BKE_object_minmax(Object *ob, float r_min[3], float r_max[3]) { using namespace blender; if (const std::optional> bounds = BKE_object_boundbox_get(ob)) { - minmax_v3v3_v3(r_min, r_max, math::transform_point(ob->object_to_world(), bounds->min)); - minmax_v3v3_v3(r_min, r_max, math::transform_point(ob->object_to_world(), bounds->max)); + minmax_v3v3_v3( + r_min, r_max, math::transform_point(float4x4(ob->object_to_world), bounds->min)); + minmax_v3v3_v3( + r_min, r_max, math::transform_point(float4x4(ob->object_to_world), bounds->max)); return; } float3 size = ob->scale; @@ -3688,14 +3677,14 @@ void BKE_object_minmax(Object *ob, float r_min[3], float r_max[3]) size *= ob->empty_drawsize; } - minmax_v3v3_v3(r_min, r_max, ob->object_to_world().location()); + minmax_v3v3_v3(r_min, r_max, ob->object_to_world[3]); float3 vec; - copy_v3_v3(vec, ob->object_to_world().location()); + copy_v3_v3(vec, ob->object_to_world[3]); add_v3_v3(vec, size); minmax_v3v3_v3(r_min, r_max, vec); - copy_v3_v3(vec, ob->object_to_world().location()); + copy_v3_v3(vec, ob->object_to_world[3]); sub_v3_v3(vec, size); minmax_v3v3_v3(r_min, r_max, vec); } @@ -3741,12 +3730,12 @@ bool BKE_object_empty_image_data_is_visible_in_view3d(const Object *ob, const Re * however the issue with empty objects being visible when viewed from the side * is only noticeable in orthographic views. */ float3 view_dir; - sub_v3_v3v3(view_dir, rv3d->viewinv[3], ob->object_to_world().location()); - dot = dot_v3v3(ob->object_to_world().ptr()[2], view_dir); + sub_v3_v3v3(view_dir, rv3d->viewinv[3], ob->object_to_world[3]); + dot = dot_v3v3(ob->object_to_world[2], view_dir); eps = 0.0f; } else { - dot = dot_v3v3(ob->object_to_world().ptr()[2], rv3d->viewinv[2]); + dot = dot_v3v3(ob->object_to_world[2], rv3d->viewinv[2]); eps = 1e-5f; } if (visibility_flag & OB_EMPTY_IMAGE_HIDE_BACK) { @@ -3763,7 +3752,7 @@ bool BKE_object_empty_image_data_is_visible_in_view3d(const Object *ob, const Re if (visibility_flag & OB_EMPTY_IMAGE_HIDE_NON_AXIS_ALIGNED) { float3 proj, ob_z_axis; - normalize_v3_v3(ob_z_axis, ob->object_to_world().ptr()[2]); + normalize_v3_v3(ob_z_axis, ob->object_to_world[2]); project_plane_v3_v3v3(proj, ob_z_axis, rv3d->viewinv[2]); const float proj_length_sq = len_squared_v3(proj); if (proj_length_sq > 1e-5f) { @@ -3957,7 +3946,7 @@ void BKE_scene_foreach_display_point(Depsgraph *depsgraph, DEG_ITER_OBJECT_FLAG_DUPLI; DEG_OBJECT_ITER_BEGIN (°_iter_settings, ob) { if ((ob->base_flag & BASE_SELECTED) != 0) { - BKE_object_foreach_display_point(ob, ob->object_to_world().ptr(), func_cb, user_data); + BKE_object_foreach_display_point(ob, ob->object_to_world, func_cb, user_data); } } DEG_OBJECT_ITER_END; @@ -4000,10 +3989,10 @@ void *BKE_object_tfm_backup(Object *ob) copy_v3_v3(obtfm->drotAxis, ob->drotAxis); obtfm->rotAngle = ob->rotAngle; obtfm->drotAngle = ob->drotAngle; - copy_m4_m4(obtfm->obmat, ob->object_to_world().ptr()); + copy_m4_m4(obtfm->obmat, ob->object_to_world); copy_m4_m4(obtfm->parentinv, ob->parentinv); copy_m4_m4(obtfm->constinv, ob->constinv); - copy_m4_m4(obtfm->imat, ob->world_to_object().ptr()); + copy_m4_m4(obtfm->imat, ob->world_to_object); return (void *)obtfm; } @@ -4023,10 +4012,10 @@ void BKE_object_tfm_restore(Object *ob, void *obtfm_pt) copy_v3_v3(ob->drotAxis, obtfm->drotAxis); ob->rotAngle = obtfm->rotAngle; ob->drotAngle = obtfm->drotAngle; - copy_m4_m4(ob->runtime->object_to_world.ptr(), obtfm->obmat); + copy_m4_m4(ob->object_to_world, obtfm->obmat); copy_m4_m4(ob->parentinv, obtfm->parentinv); copy_m4_m4(ob->constinv, obtfm->constinv); - copy_m4_m4(ob->runtime->world_to_object.ptr(), obtfm->imat); + copy_m4_m4(ob->world_to_object, obtfm->imat); } /** \} */ @@ -4186,15 +4175,15 @@ Mesh *BKE_object_get_evaluated_mesh(const Object *object) Mesh *BKE_object_get_pre_modified_mesh(const Object *object) { if (object->type == OB_MESH && object->runtime->data_orig != nullptr) { - BLI_assert(object->id.tag & LIB_TAG_COPIED_ON_EVAL); + BLI_assert(object->id.tag & LIB_TAG_COPIED_ON_WRITE); BLI_assert(object->id.orig_id != nullptr); BLI_assert(object->runtime->data_orig->orig_id == ((Object *)object->id.orig_id)->data); Mesh *result = (Mesh *)object->runtime->data_orig; - BLI_assert((result->id.tag & LIB_TAG_COPIED_ON_EVAL) != 0); - BLI_assert((result->id.tag & LIB_TAG_COPIED_ON_EVAL_FINAL_RESULT) == 0); + BLI_assert((result->id.tag & LIB_TAG_COPIED_ON_WRITE) != 0); + BLI_assert((result->id.tag & LIB_TAG_COPIED_ON_WRITE_EVAL_RESULT) == 0); return result; } - BLI_assert((object->id.tag & LIB_TAG_COPIED_ON_EVAL) == 0); + BLI_assert((object->id.tag & LIB_TAG_COPIED_ON_WRITE) == 0); return (Mesh *)object->data; } @@ -4202,15 +4191,15 @@ Mesh *BKE_object_get_original_mesh(const Object *object) { Mesh *result = nullptr; if (object->id.orig_id == nullptr) { - BLI_assert((object->id.tag & LIB_TAG_COPIED_ON_EVAL) == 0); + BLI_assert((object->id.tag & LIB_TAG_COPIED_ON_WRITE) == 0); result = (Mesh *)object->data; } else { - BLI_assert((object->id.tag & LIB_TAG_COPIED_ON_EVAL) != 0); + BLI_assert((object->id.tag & LIB_TAG_COPIED_ON_WRITE) != 0); result = (Mesh *)((Object *)object->id.orig_id)->data; } BLI_assert(result != nullptr); - BLI_assert((result->id.tag & (LIB_TAG_COPIED_ON_EVAL | LIB_TAG_COPIED_ON_EVAL_FINAL_RESULT)) == + BLI_assert((result->id.tag & (LIB_TAG_COPIED_ON_WRITE | LIB_TAG_COPIED_ON_WRITE_EVAL_RESULT)) == 0); return result; } @@ -4289,10 +4278,10 @@ static int pc_cmp(const void *a, const void *b) return 0; } -/* TODO: Review the usages of this function, currently with copy-on-eval it will be called for orig - * object and then again for evaluated copies of it, think this is bad since there is no guarantee - * that we get the same stack index in both cases? Order is important since this index is used for - * filenames on disk. */ +/* TODO: Review the usages of this function, currently with COW it will be called for orig object + * and then again for COW copies of it, think this is bad since there is no guarantee that we get + * the same stack index in both cases? Order is important since this index is used for filenames + * on disk. */ int BKE_object_insert_ptcache(Object *ob) { LinkData *link = nullptr; @@ -5032,7 +5021,7 @@ void BKE_object_groups_clear(Main *bmain, Scene *scene, Object *ob) Collection *collection = nullptr; while ((collection = BKE_collection_object_find(bmain, scene, collection, ob))) { BKE_collection_object_remove(bmain, collection, ob, false); - DEG_id_tag_update(&collection->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&collection->id, ID_RECALC_COPY_ON_WRITE); } } @@ -5052,12 +5041,12 @@ KDTree_3d *BKE_object_as_kdtree(Object *ob, int *r_tot) Mesh *mesh = (Mesh *)ob->data; uint i; - Mesh *mesh_eval = ob->runtime->mesh_deform_eval ? ob->runtime->mesh_deform_eval : - BKE_object_get_evaluated_mesh(ob); + Mesh *me_eval = ob->runtime->mesh_deform_eval ? ob->runtime->mesh_deform_eval : + BKE_object_get_evaluated_mesh(ob); const int *index; - if (mesh_eval && - (index = (const int *)CustomData_get_layer(&mesh_eval->vert_data, CD_ORIGINDEX))) + if (me_eval && + (index = (const int *)CustomData_get_layer(&me_eval->vert_data, CD_ORIGINDEX))) { const Span positions = mesh->vert_positions(); @@ -5069,7 +5058,7 @@ KDTree_3d *BKE_object_as_kdtree(Object *ob, int *r_tot) for (i = 0; i < positions.size(); i++) { if (index[i] != ORIGINDEX_NONE) { float co[3]; - mul_v3_m4v3(co, ob->object_to_world().ptr(), positions[i]); + mul_v3_m4v3(co, ob->object_to_world, positions[i]); BLI_kdtree_3d_insert(tree, index[i], co); tot++; } @@ -5083,7 +5072,7 @@ KDTree_3d *BKE_object_as_kdtree(Object *ob, int *r_tot) for (i = 0; i < tot; i++) { float co[3]; - mul_v3_m4v3(co, ob->object_to_world().ptr(), positions[i]); + mul_v3_m4v3(co, ob->object_to_world, positions[i]); BLI_kdtree_3d_insert(tree, i, co); } } @@ -5112,7 +5101,7 @@ KDTree_3d *BKE_object_as_kdtree(Object *ob, int *r_tot) a = nu->pntsu; while (a--) { float co[3]; - mul_v3_m4v3(co, ob->object_to_world().ptr(), bezt->vec[1]); + mul_v3_m4v3(co, ob->object_to_world, bezt->vec[1]); BLI_kdtree_3d_insert(tree, i++, co); bezt++; } @@ -5124,7 +5113,7 @@ KDTree_3d *BKE_object_as_kdtree(Object *ob, int *r_tot) a = nu->pntsu * nu->pntsv; while (a--) { float co[3]; - mul_v3_m4v3(co, ob->object_to_world().ptr(), bp->vec); + mul_v3_m4v3(co, ob->object_to_world, bp->vec); BLI_kdtree_3d_insert(tree, i++, co); bp++; } @@ -5147,7 +5136,7 @@ KDTree_3d *BKE_object_as_kdtree(Object *ob, int *r_tot) for (bp = lt->def; i < tot; bp++) { float co[3]; - mul_v3_m4v3(co, ob->object_to_world().ptr(), bp->vec); + mul_v3_m4v3(co, ob->object_to_world, bp->vec); BLI_kdtree_3d_insert(tree, i++, co); } @@ -5368,12 +5357,3 @@ void BKE_object_replace_data_on_shallow_copy(Object *ob, ID *new_data) } /** \} */ - -const blender::float4x4 &Object::object_to_world() const -{ - return this->runtime->object_to_world; -} -const blender::float4x4 &Object::world_to_object() const -{ - return this->runtime->world_to_object; -} diff --git a/source/blender/blenkernel/intern/object_deform.cc b/source/blender/blenkernel/intern/object_deform.cc index f17c90630e8..cbc5c84b300 100644 --- a/source/blender/blenkernel/intern/object_deform.cc +++ b/source/blender/blenkernel/intern/object_deform.cc @@ -11,7 +11,7 @@ #include "MEM_guardedalloc.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BLI_ghash.h" #include "BLI_listbase.h" diff --git a/source/blender/blenkernel/intern/object_dupli.cc b/source/blender/blenkernel/intern/object_dupli.cc index 040d1817abe..3338f27847c 100644 --- a/source/blender/blenkernel/intern/object_dupli.cc +++ b/source/blender/blenkernel/intern/object_dupli.cc @@ -17,37 +17,48 @@ #include "BLI_string_utf8.h" #include "BLI_array.hh" +#include "BLI_math_color.hh" #include "BLI_math_geom.h" #include "BLI_math_matrix.h" +#include "BLI_math_matrix.hh" #include "BLI_math_rotation.h" #include "BLI_math_vector.hh" #include "BLI_rand.h" #include "BLI_span.hh" #include "BLI_vector.hh" +#include "DNA_anim_types.h" #include "DNA_collection_types.h" #include "DNA_curves_types.h" #include "DNA_grease_pencil_types.h" #include "DNA_mesh_types.h" +#include "DNA_meshdata_types.h" #include "DNA_modifier_types.h" #include "DNA_pointcloud_types.h" #include "DNA_scene_types.h" +#include "DNA_vfont_types.h" #include "DNA_volume_types.h" -#include "BKE_collection.hh" -#include "BKE_duplilist.hh" +#include "BKE_collection.h" +#include "BKE_duplilist.h" #include "BKE_editmesh.hh" #include "BKE_editmesh_cache.hh" #include "BKE_geometry_set.hh" #include "BKE_geometry_set_instances.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_idprop.h" #include "BKE_instances.hh" +#include "BKE_lattice.hh" #include "BKE_main.hh" #include "BKE_mesh.hh" +#include "BKE_mesh_iterators.hh" +#include "BKE_mesh_runtime.hh" +#include "BKE_modifier.hh" #include "BKE_object.hh" #include "BKE_object_types.hh" #include "BKE_particle.h" +#include "BKE_scene.h" +#include "BKE_type_conversions.hh" #include "BKE_vfont.hh" #include "DEG_depsgraph.hh" @@ -60,6 +71,7 @@ #include "RNA_access.hh" #include "RNA_path.hh" #include "RNA_prototypes.h" +#include "RNA_types.hh" #include "MOD_nodes.hh" @@ -449,7 +461,7 @@ static const Mesh *mesh_data_from_duplicator_object(Object *ob, { /* Gather mesh info. */ BMEditMesh *em = BKE_editmesh_from_object(ob); - const Mesh *mesh_eval; + const Mesh *me_eval; *r_em = nullptr; *r_vert_coords = nullptr; @@ -464,13 +476,13 @@ static const Mesh *mesh_data_from_duplicator_object(Object *ob, if (em != nullptr) { /* Note that this will only show deformation if #eModifierMode_OnCage is enabled. * We could change this but it matches 2.7x behavior. */ - mesh_eval = BKE_object_get_editmesh_eval_cage(ob); - if ((mesh_eval == nullptr) || (mesh_eval->runtime->wrapper_type == ME_WRAPPER_TYPE_BMESH)) { - blender::bke::EditMeshData *emd = mesh_eval ? mesh_eval->runtime->edit_data.get() : nullptr; + me_eval = BKE_object_get_editmesh_eval_cage(ob); + if ((me_eval == nullptr) || (me_eval->runtime->wrapper_type == ME_WRAPPER_TYPE_BMESH)) { + blender::bke::EditMeshData *emd = me_eval ? me_eval->runtime->edit_data.get() : nullptr; - /* Only assign edit-mesh in the case we can't use `mesh_eval`. */ + /* Only assign edit-mesh in the case we can't use `me_eval`. */ *r_em = em; - mesh_eval = nullptr; + me_eval = nullptr; if ((emd != nullptr) && !emd->vertexCos.is_empty()) { *r_vert_coords = reinterpret_cast(emd->vertexCos.data()); @@ -482,9 +494,9 @@ static const Mesh *mesh_data_from_duplicator_object(Object *ob, } } else { - mesh_eval = BKE_object_get_evaluated_mesh(ob); + me_eval = BKE_object_get_evaluated_mesh(ob); } - return mesh_eval; + return me_eval; } /** \} */ @@ -507,8 +519,8 @@ static void make_duplis_collection(const DupliContext *ctx) /* Combine collection offset and `obmat`. */ unit_m4(collection_mat); sub_v3_v3(collection_mat[3], collection->instance_offset); - mul_m4_m4m4(collection_mat, ob->object_to_world().ptr(), collection_mat); - /* Don't access 'ob->object_to_world().ptr()' from now on. */ + mul_m4_m4m4(collection_mat, ob->object_to_world, collection_mat); + /* Don't access 'ob->object_to_world' from now on. */ eEvaluationMode mode = DEG_get_mode(ctx->depsgraph); FOREACH_COLLECTION_VISIBLE_OBJECT_RECURSIVE_BEGIN (collection, cob, mode) { @@ -516,7 +528,7 @@ static void make_duplis_collection(const DupliContext *ctx) float mat[4][4]; /* Collection dupli-offset, should apply after everything else. */ - mul_m4_m4m4(mat, collection_mat, cob->object_to_world().ptr()); + mul_m4_m4m4(mat, collection_mat, cob->object_to_world); make_dupli(ctx, cob, mat, _base_id); @@ -622,11 +634,11 @@ static DupliObject *vertex_dupli(const DupliContext *ctx, /* Make offset relative to inst_ob using relative child transform. */ mul_mat3_m4_v3(child_imat, obmat[3]); /* Apply `obmat` _after_ the local vertex transform. */ - mul_m4_m4m4(obmat, inst_ob->object_to_world().ptr(), obmat); + mul_m4_m4m4(obmat, inst_ob->object_to_world, obmat); /* Space matrix is constructed by removing `obmat` transform, * this yields the world-space transform for recursive duplis. */ - mul_m4_m4m4(space_mat, obmat, inst_ob->world_to_object().ptr()); + mul_m4_m4m4(space_mat, obmat, inst_ob->world_to_object); DupliObject *dob = make_dupli(ctx, inst_ob, obmat, index); @@ -645,10 +657,10 @@ static void make_child_duplis_verts_from_mesh(const DupliContext *ctx, const int totvert = vdd->totvert; - invert_m4_m4(inst_ob->runtime->world_to_object.ptr(), inst_ob->object_to_world().ptr()); + invert_m4_m4(inst_ob->world_to_object, inst_ob->object_to_world); /* Relative transform from parent to child space. */ float child_imat[4][4]; - mul_m4_m4m4(child_imat, inst_ob->world_to_object().ptr(), ctx->object->object_to_world().ptr()); + mul_m4_m4m4(child_imat, inst_ob->world_to_object, ctx->object->object_to_world); for (int i = 0; i < totvert; i++) { DupliObject *dob = vertex_dupli(vdd->params.ctx, @@ -672,10 +684,10 @@ static void make_child_duplis_verts_from_editmesh(const DupliContext *ctx, BMEditMesh *em = vdd->em; const bool use_rotation = vdd->params.use_rotation; - invert_m4_m4(inst_ob->runtime->world_to_object.ptr(), inst_ob->object_to_world().ptr()); + invert_m4_m4(inst_ob->world_to_object, inst_ob->object_to_world); /* Relative transform from parent to child space. */ float child_imat[4][4]; - mul_m4_m4m4(child_imat, inst_ob->world_to_object().ptr(), ctx->object->object_to_world().ptr()); + mul_m4_m4m4(child_imat, inst_ob->world_to_object, ctx->object->object_to_world); BMVert *v; BMIter iter; @@ -711,9 +723,9 @@ static void make_duplis_verts(const DupliContext *ctx) BMEditMesh *em = nullptr; const float(*vert_positions_deform)[3] = nullptr; const float(*vert_normals_deform)[3] = nullptr; - const Mesh *mesh_eval = mesh_data_from_duplicator_object( + const Mesh *me_eval = mesh_data_from_duplicator_object( parent, &em, &vert_positions_deform, use_rotation ? &vert_normals_deform : nullptr); - if (em == nullptr && mesh_eval == nullptr) { + if (em == nullptr && me_eval == nullptr) { return; } @@ -732,10 +744,10 @@ static void make_duplis_verts(const DupliContext *ctx) else { VertexDupliData_Mesh vdd{}; vdd.params = vdd_params; - vdd.totvert = mesh_eval->verts_num; - vdd.vert_positions = mesh_eval->vert_positions(); - vdd.vert_normals = mesh_eval->vert_normals(); - vdd.orco = (const float(*)[3])CustomData_get_layer(&mesh_eval->vert_data, CD_ORCO); + vdd.totvert = me_eval->verts_num; + vdd.vert_positions = me_eval->vert_positions(); + vdd.vert_normals = me_eval->vert_normals(); + vdd.orco = (const float(*)[3])CustomData_get_layer(&me_eval->vert_data, CD_ORCO); make_child_duplis(ctx, &vdd, make_child_duplis_verts_from_mesh); } @@ -799,7 +811,7 @@ static void make_duplis_font(const DupliContext *ctx) return; } - copy_m4_m4(pmat, par->object_to_world().ptr()); + copy_m4_m4(pmat, par->object_to_world); /* In `par` the family name is stored, use this to find the other objects. */ @@ -844,7 +856,7 @@ static void make_duplis_font(const DupliContext *ctx) mul_m4_v3(pmat, vec); - copy_m4_m4(obmat, par->object_to_world().ptr()); + copy_m4_m4(obmat, par->object_to_world); if (UNLIKELY(ct->rot != 0.0f)) { float rmat[4][4]; @@ -966,8 +978,7 @@ static void make_duplis_geometry_set_impl(const DupliContext *ctx, make_dupli(ctx_for_instance, &object, matrix, id, &geometry_set, i); float space_matrix[4][4]; - mul_m4_m4m4( - space_matrix, instance_offset_matrices[i].ptr(), object.world_to_object().ptr()); + mul_m4_m4m4(space_matrix, instance_offset_matrices[i].ptr(), object.world_to_object); mul_m4_m4_pre(space_matrix, parent_transform); make_recursive_duplis(ctx_for_instance, &object, space_matrix, id, &geometry_set, i); break; @@ -1000,7 +1011,7 @@ static void make_duplis_geometry_set_impl(const DupliContext *ctx, } float instance_matrix[4][4]; - mul_m4_m4m4(instance_matrix, collection_matrix, object->object_to_world().ptr()); + mul_m4_m4m4(instance_matrix, collection_matrix, object->object_to_world); make_dupli(&sub_ctx, object, instance_matrix, object_id++); make_recursive_duplis(&sub_ctx, object, collection_matrix, object_id++); @@ -1036,8 +1047,7 @@ static void make_duplis_geometry_set_impl(const DupliContext *ctx, static void make_duplis_geometry_set(const DupliContext *ctx) { const GeometrySet *geometry_set = ctx->object->runtime->geometry_set_eval; - make_duplis_geometry_set_impl( - ctx, *geometry_set, ctx->object->object_to_world().ptr(), false, false); + make_duplis_geometry_set_impl(ctx, *geometry_set, ctx->object->object_to_world, false, false); } static const DupliGenerator gen_dupli_geometry_set = { @@ -1143,11 +1153,11 @@ static DupliObject *face_dupli(const DupliContext *ctx, } /* Apply `obmat` _after_ the local face transform. */ - mul_m4_m4m4(obmat, inst_ob->object_to_world().ptr(), obmat); + mul_m4_m4m4(obmat, inst_ob->object_to_world, obmat); /* Space matrix is constructed by removing `obmat` transform, * this yields the world-space transform for recursive duplis. */ - mul_m4_m4m4(space_mat, obmat, inst_ob->world_to_object().ptr()); + mul_m4_m4m4(space_mat, obmat, inst_ob->world_to_object); DupliObject *dob = make_dupli(ctx, inst_ob, obmat, index); @@ -1220,9 +1230,9 @@ static void make_child_duplis_faces_from_mesh(const DupliContext *ctx, float child_imat[4][4]; - invert_m4_m4(inst_ob->runtime->world_to_object.ptr(), inst_ob->object_to_world().ptr()); + invert_m4_m4(inst_ob->world_to_object, inst_ob->object_to_world); /* Relative transform from parent to child space. */ - mul_m4_m4m4(child_imat, inst_ob->world_to_object().ptr(), ctx->object->object_to_world().ptr()); + mul_m4_m4m4(child_imat, inst_ob->world_to_object, ctx->object->object_to_world); const float scale_fac = ctx->object->instance_faces_scale; for (const int a : blender::IndexRange(totface)) { @@ -1267,9 +1277,9 @@ static void make_child_duplis_faces_from_editmesh(const DupliContext *ctx, BLI_assert((vert_positions_deform == nullptr) || (em->bm->elem_index_dirty & BM_VERT) == 0); - invert_m4_m4(inst_ob->runtime->world_to_object.ptr(), inst_ob->object_to_world().ptr()); + invert_m4_m4(inst_ob->world_to_object, inst_ob->object_to_world); /* Relative transform from parent to child space. */ - mul_m4_m4m4(child_imat, inst_ob->world_to_object().ptr(), ctx->object->object_to_world().ptr()); + mul_m4_m4m4(child_imat, inst_ob->world_to_object, ctx->object->object_to_world); const float scale_fac = ctx->object->instance_faces_scale; BM_ITER_MESH_INDEX (f, &iter, em->bm, BM_FACES_OF_MESH, a) { @@ -1297,9 +1307,9 @@ static void make_duplis_faces(const DupliContext *ctx) /* Gather mesh info. */ BMEditMesh *em = nullptr; const float(*vert_positions_deform)[3] = nullptr; - const Mesh *mesh_eval = mesh_data_from_duplicator_object( + const Mesh *me_eval = mesh_data_from_duplicator_object( parent, &em, &vert_positions_deform, nullptr); - if (em == nullptr && mesh_eval == nullptr) { + if (em == nullptr && me_eval == nullptr) { return; } @@ -1319,17 +1329,17 @@ static void make_duplis_faces(const DupliContext *ctx) make_child_duplis(ctx, &fdd, make_child_duplis_faces_from_editmesh); } else { - const int uv_idx = CustomData_get_render_layer(&mesh_eval->corner_data, CD_PROP_FLOAT2); + const int uv_idx = CustomData_get_render_layer(&me_eval->corner_data, CD_PROP_FLOAT2); FaceDupliData_Mesh fdd{}; fdd.params = fdd_params; - fdd.totface = mesh_eval->faces_num; - fdd.faces = mesh_eval->faces(); - fdd.corner_verts = mesh_eval->corner_verts(); - fdd.vert_positions = mesh_eval->vert_positions(); + fdd.totface = me_eval->faces_num; + fdd.faces = me_eval->faces(); + fdd.corner_verts = me_eval->corner_verts(); + fdd.vert_positions = me_eval->vert_positions(); fdd.mloopuv = (uv_idx != -1) ? (const float2 *)CustomData_get_layer_n( - &mesh_eval->corner_data, CD_PROP_FLOAT2, uv_idx) : + &me_eval->corner_data, CD_PROP_FLOAT2, uv_idx) : nullptr; - fdd.orco = (const float(*)[3])CustomData_get_layer(&mesh_eval->vert_data, CD_ORCO); + fdd.orco = (const float(*)[3])CustomData_get_layer(&me_eval->vert_data, CD_ORCO); make_child_duplis(ctx, &fdd, make_child_duplis_faces_from_mesh); } @@ -1402,7 +1412,7 @@ static void make_duplis_particle_system(const DupliContext *ctx, ParticleSystem sim.psmd = psys_get_modifier(par, psys); /* Make sure emitter `world_to_object` is in global coordinates instead of render view * coordinates. */ - invert_m4_m4(par->runtime->world_to_object.ptr(), par->object_to_world().ptr()); + invert_m4_m4(par->world_to_object, par->object_to_world); /* First check for loops (particle system object used as dupli-object). */ if (part->ren_as == PART_DRAW_OB) { @@ -1592,7 +1602,7 @@ static void make_duplis_particle_system(const DupliContext *ctx, ParticleSystem b = 0; FOREACH_COLLECTION_VISIBLE_OBJECT_RECURSIVE_BEGIN (part->instance_collection, object, mode) { - copy_m4_m4(tmat, oblist[b]->object_to_world().ptr()); + copy_m4_m4(tmat, oblist[b]->object_to_world); /* Apply collection instance offset. */ sub_v3_v3(tmat[3], part->instance_collection->instance_offset); @@ -1615,7 +1625,7 @@ static void make_duplis_particle_system(const DupliContext *ctx, ParticleSystem } else { float obmat[4][4]; - copy_m4_m4(obmat, ob->object_to_world().ptr()); + copy_m4_m4(obmat, ob->object_to_world); float vec[3]; copy_v3_v3(vec, obmat[3]); @@ -1806,11 +1816,8 @@ ListBase *object_duplilist_preview(Depsgraph *depsgraph, geo_log::GeoModifierLog::find_viewer_node_log_for_path(*viewer_path)) { ctx.preview_base_geometry = &viewer_log->geometry; - make_duplis_geometry_set_impl(&ctx, - viewer_log->geometry, - ob_eval->object_to_world().ptr(), - true, - ob_eval->type == OB_CURVES); + make_duplis_geometry_set_impl( + &ctx, viewer_log->geometry, ob_eval->object_to_world, true, ob_eval->type == OB_CURVES); } } return duplilist; diff --git a/source/blender/blenkernel/intern/object_update.cc b/source/blender/blenkernel/intern/object_update.cc index c3c4a1409d6..4c65e91aea8 100644 --- a/source/blender/blenkernel/intern/object_update.cc +++ b/source/blender/blenkernel/intern/object_update.cc @@ -6,7 +6,12 @@ * \ingroup bke */ +#include "DNA_anim_types.h" +#include "DNA_collection_types.h" #include "DNA_constraint_types.h" +#include "DNA_gpencil_legacy_types.h" +#include "DNA_key_types.h" +#include "DNA_material_types.h" #include "DNA_mesh_types.h" #include "DNA_modifier_types.h" #include "DNA_scene_types.h" @@ -14,21 +19,28 @@ #include "BLI_blenlib.h" #include "BLI_math_matrix.h" #include "BLI_math_vector.h" +#include "BLI_threads.h" #include "BLI_utildefines.h" #include "BKE_DerivedMesh.hh" +#include "BKE_action.h" #include "BKE_armature.hh" #include "BKE_constraint.h" #include "BKE_curve.hh" #include "BKE_curves.h" #include "BKE_displist.h" #include "BKE_editmesh.hh" +#include "BKE_effect.h" #include "BKE_gpencil_legacy.h" #include "BKE_gpencil_modifier_legacy.h" #include "BKE_grease_pencil.h" #include "BKE_grease_pencil.hh" +#include "BKE_image.h" +#include "BKE_key.hh" #include "BKE_lattice.hh" #include "BKE_layer.hh" +#include "BKE_light.h" +#include "BKE_material.h" #include "BKE_mball.hh" #include "BKE_mesh.hh" #include "BKE_object.hh" @@ -36,7 +48,7 @@ #include "BKE_particle.h" #include "BKE_pointcache.h" #include "BKE_pointcloud.hh" -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "BKE_volume.hh" #include "MEM_guardedalloc.h" @@ -57,7 +69,7 @@ void BKE_object_eval_local_transform(Depsgraph *depsgraph, Object *ob) DEG_debug_print_eval(depsgraph, __func__, ob->id.name, ob); /* calculate local matrix */ - BKE_object_to_mat4(ob, ob->runtime->object_to_world.ptr()); + BKE_object_to_mat4(ob, ob->object_to_world); } void BKE_object_eval_parent(Depsgraph *depsgraph, Object *ob) @@ -74,18 +86,18 @@ void BKE_object_eval_parent(Depsgraph *depsgraph, Object *ob) /* get local matrix (but don't calculate it, as that was done already!) */ /* XXX: redundant? */ - copy_m4_m4(locmat, ob->object_to_world().ptr()); + copy_m4_m4(locmat, ob->object_to_world); /* get parent effect matrix */ BKE_object_get_parent_matrix(ob, par, totmat); /* total */ mul_m4_m4m4(tmat, totmat, ob->parentinv); - mul_m4_m4m4(ob->runtime->object_to_world.ptr(), tmat, locmat); + mul_m4_m4m4(ob->object_to_world, tmat, locmat); /* origin, for help line */ if ((ob->partype & PARTYPE) == PARSKEL) { - copy_v3_v3(ob->runtime->parent_display_origin, par->object_to_world().location()); + copy_v3_v3(ob->runtime->parent_display_origin, par->object_to_world[3]); } else { copy_v3_v3(ob->runtime->parent_display_origin, totmat[3]); @@ -117,9 +129,9 @@ void BKE_object_eval_transform_final(Depsgraph *depsgraph, Object *ob) DEG_debug_print_eval(depsgraph, __func__, ob->id.name, ob); /* Make sure inverse matrix is always up to date. This way users of it * do not need to worry about recalculating it. */ - invert_m4_m4_safe(ob->runtime->world_to_object.ptr(), ob->object_to_world().ptr()); + invert_m4_m4_safe(ob->world_to_object, ob->object_to_world); /* Set negative scale flag in object. */ - if (is_negative_m4(ob->object_to_world().ptr())) { + if (is_negative_m4(ob->object_to_world)) { ob->transflag |= OB_NEG_SCALE; } else { @@ -139,25 +151,25 @@ void BKE_object_handle_data_update(Depsgraph *depsgraph, Scene *scene, Object *o CustomData_MeshMasks cddata_masks = scene->customdata_mask; CustomData_MeshMasks_update(&cddata_masks, &CD_MASK_BAREMESH); /* Custom attributes should not be removed automatically. They might be used by the render - * engine or scripts. They can still be removed explicitly using geometry nodes. - * Vertex groups can be used in arbitrary situations with geometry nodes as well. */ + * engine or scripts. They can still be removed explicitly using geometry nodes. Crease and + * vertex groups can be used in arbitrary situations with geometry nodes as well. */ cddata_masks.vmask |= CD_MASK_PROP_ALL | CD_MASK_MDEFORMVERT; cddata_masks.emask |= CD_MASK_PROP_ALL; cddata_masks.fmask |= CD_MASK_PROP_ALL; cddata_masks.pmask |= CD_MASK_PROP_ALL; cddata_masks.lmask |= CD_MASK_PROP_ALL; - /* Make sure Freestyle edge/face marks appear in evaluated mesh (see #40315). + /* Make sure Freestyle edge/face marks appear in DM for render (see #40315). * Due to Line Art implementation, edge marks should also be shown in viewport. */ #ifdef WITH_FREESTYLE cddata_masks.emask |= CD_MASK_FREESTYLE_EDGE; cddata_masks.pmask |= CD_MASK_FREESTYLE_FACE; #endif if (DEG_get_mode(depsgraph) == DAG_EVAL_RENDER) { - /* Always compute orcos for render. */ + /* Always compute UVs, vertex colors as orcos for render. */ cddata_masks.vmask |= CD_MASK_ORCO; } - makeDerivedMesh(depsgraph, scene, ob, &cddata_masks); + makeDerivedMesh(depsgraph, scene, ob, &cddata_masks); /* was CD_MASK_BAREMESH */ break; } case OB_ARMATURE: @@ -240,8 +252,8 @@ void BKE_object_sync_to_original(Depsgraph *depsgraph, Object *object) /* Base flags. */ object_orig->base_flag = object->base_flag; /* Transformation flags. */ - copy_m4_m4(object_orig->runtime->object_to_world.ptr(), object->object_to_world().ptr()); - copy_m4_m4(object_orig->runtime->world_to_object.ptr(), object->world_to_object().ptr()); + copy_m4_m4(object_orig->object_to_world, object->object_to_world); + copy_m4_m4(object_orig->world_to_object, object->world_to_object); copy_m4_m4(object_orig->constinv, object->constinv); object_orig->transflag = object->transflag; object_orig->flag = object->flag; diff --git a/source/blender/blenkernel/intern/packedFile.cc b/source/blender/blenkernel/intern/packedFile.cc index e879f05ac09..9cb1c3c0693 100644 --- a/source/blender/blenkernel/intern/packedFile.cc +++ b/source/blender/blenkernel/intern/packedFile.cc @@ -32,7 +32,7 @@ #include "BKE_image_format.h" #include "BKE_main.hh" #include "BKE_packedFile.h" -#include "BKE_report.hh" +#include "BKE_report.h" #include "BKE_sound.h" #include "BKE_vfont.hh" #include "BKE_volume.hh" diff --git a/source/blender/blenkernel/intern/paint.cc b/source/blender/blenkernel/intern/paint.cc index b201e53f6d2..d6a6dc00bde 100644 --- a/source/blender/blenkernel/intern/paint.cc +++ b/source/blender/blenkernel/intern/paint.cc @@ -8,7 +8,6 @@ #include #include -#include #include "MEM_guardedalloc.h" @@ -36,7 +35,7 @@ #include "BLI_utildefines.h" #include "BLI_vector.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_attribute.hh" #include "BKE_brush.hh" @@ -62,7 +61,7 @@ #include "BKE_object_types.hh" #include "BKE_paint.hh" #include "BKE_pbvh_api.hh" -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "BKE_subdiv_ccg.hh" #include "BKE_subsurf.hh" @@ -101,11 +100,7 @@ static void palette_init_data(ID *id) id_fake_user_set(&palette->id); } -static void palette_copy_data(Main * /*bmain*/, - std::optional /*owner_library*/, - ID *id_dst, - const ID *id_src, - const int /*flag*/) +static void palette_copy_data(Main * /*bmain*/, ID *id_dst, const ID *id_src, const int /*flag*/) { Palette *palette_dst = (Palette *)id_dst; const Palette *palette_src = (const Palette *)id_src; @@ -149,7 +144,6 @@ static void palette_undo_preserve(BlendLibReader * /*reader*/, ID *id_new, ID *i IDTypeInfo IDType_ID_PAL = { /*id_code*/ ID_PAL, /*id_filter*/ FILTER_ID_PAL, - /*dependencies_id_types*/ 0, /*main_listbase_index*/ INDEX_ID_PAL, /*struct_size*/ sizeof(Palette), /*name*/ "Palette", @@ -177,7 +171,6 @@ IDTypeInfo IDType_ID_PAL = { }; static void paint_curve_copy_data(Main * /*bmain*/, - std::optional /*owner_library*/, ID *id_dst, const ID *id_src, const int /*flag*/) @@ -218,7 +211,6 @@ static void paint_curve_blend_read_data(BlendDataReader *reader, ID *id) IDTypeInfo IDType_ID_PC = { /*id_code*/ ID_PC, /*id_filter*/ FILTER_ID_PC, - /*dependencies_id_types*/ 0, /*main_listbase_index*/ INDEX_ID_PC, /*struct_size*/ sizeof(PaintCurve), /*name*/ "PaintCurve", @@ -1246,7 +1238,7 @@ void BKE_paint_stroke_get_average(const Scene *scene, const Object *ob, float st mul_v3_v3fl(stroke, ups->average_stroke_accum, fac); } else { - copy_v3_v3(stroke, ob->object_to_world().location()); + copy_v3_v3(stroke, ob->object_to_world[3]); } } @@ -1663,15 +1655,15 @@ static void sculpt_update_object(Depsgraph *depsgraph, Sculpt *sd = scene->toolsettings->sculpt; SculptSession *ss = ob->sculpt; Mesh *mesh = BKE_object_get_original_mesh(ob); - Mesh *mesh_eval = BKE_object_get_evaluated_mesh(ob_eval); + Mesh *me_eval = BKE_object_get_evaluated_mesh(ob_eval); MultiresModifierData *mmd = sculpt_multires_modifier_get(scene, ob, true); const bool use_face_sets = (ob->mode & OB_MODE_SCULPT) != 0; - BLI_assert(mesh_eval != nullptr); + BLI_assert(me_eval != nullptr); /* This is for handling a newly opened file with no object visible, - * causing `mesh_eval == nullptr`. */ - if (mesh_eval == nullptr) { + * causing `me_eval == nullptr`. */ + if (me_eval == nullptr) { return; } @@ -1691,8 +1683,8 @@ static void sculpt_update_object(Depsgraph *depsgraph, ss->multires.active = true; ss->multires.modifier = mmd; ss->multires.level = mmd->sculptlvl; - ss->totvert = mesh_eval->verts_num; - ss->faces_num = mesh_eval->faces_num; + ss->totvert = me_eval->verts_num; + ss->faces_num = me_eval->faces_num; ss->totfaces = mesh->faces_num; /* These are assigned to the base mesh in Multires. This is needed because Face Sets operators @@ -1745,7 +1737,7 @@ static void sculpt_update_object(Depsgraph *depsgraph, ss->hide_poly = (bool *)CustomData_get_layer_named(&mesh->face_data, CD_PROP_BOOL, ".hide_poly"); - ss->subdiv_ccg = mesh_eval->runtime->subdiv_ccg.get(); + ss->subdiv_ccg = me_eval->runtime->subdiv_ccg.get(); PBVH *pbvh = BKE_sculpt_object_pbvh_ensure(depsgraph, ob); BLI_assert(pbvh == ss->pbvh); @@ -1774,15 +1766,15 @@ static void sculpt_update_object(Depsgraph *depsgraph, /* If the fully evaluated mesh has the same topology as the deform-only version, use it. * This matters because crazyspace evaluation is very restrictive and excludes even modifiers * that simply recompute vertex weights (which can even include Geometry Nodes). */ - if (me_eval_deform->faces_num == mesh_eval->faces_num && - me_eval_deform->corners_num == mesh_eval->corners_num && - me_eval_deform->verts_num == mesh_eval->verts_num) + if (me_eval_deform->faces_num == me_eval->faces_num && + me_eval_deform->corners_num == me_eval->corners_num && + me_eval_deform->verts_num == me_eval->verts_num) { BKE_sculptsession_free_deformMats(ss); BLI_assert(me_eval_deform->verts_num == mesh->verts_num); - ss->deform_cos = mesh_eval->vert_positions(); + ss->deform_cos = me_eval->vert_positions(); BKE_pbvh_vert_coords_apply(ss->pbvh, ss->deform_cos); used_me_eval = true; diff --git a/source/blender/blenkernel/intern/paint_toolslots.cc b/source/blender/blenkernel/intern/paint_toolslots.cc index 4ab9259de8f..18770584f56 100644 --- a/source/blender/blenkernel/intern/paint_toolslots.cc +++ b/source/blender/blenkernel/intern/paint_toolslots.cc @@ -11,6 +11,7 @@ #include "MEM_guardedalloc.h" #include "DNA_brush_types.h" +#include "DNA_modifier_types.h" #include "DNA_scene_types.h" #include "BLI_utildefines.h" diff --git a/source/blender/blenkernel/intern/particle.cc b/source/blender/blenkernel/intern/particle.cc index b608d908dd7..ba367151c2c 100644 --- a/source/blender/blenkernel/intern/particle.cc +++ b/source/blender/blenkernel/intern/particle.cc @@ -13,7 +13,6 @@ #include #include #include -#include #include "MEM_guardedalloc.h" @@ -46,12 +45,13 @@ #include "BLI_threads.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" +#include "BKE_anim_data.h" #include "BKE_anim_path.h" #include "BKE_boids.h" #include "BKE_cloth.hh" -#include "BKE_collection.hh" +#include "BKE_collection.h" #include "BKE_colortools.hh" #include "BKE_customdata.hh" #include "BKE_deform.hh" @@ -63,14 +63,16 @@ #include "BKE_layer.hh" #include "BKE_lib_id.hh" #include "BKE_lib_query.hh" +#include "BKE_main.hh" #include "BKE_material.h" #include "BKE_mesh.hh" #include "BKE_mesh_legacy_convert.hh" +#include "BKE_mesh_runtime.hh" #include "BKE_modifier.hh" #include "BKE_object.hh" #include "BKE_particle.h" #include "BKE_pointcache.h" -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "BKE_texture.h" #include "DEG_depsgraph.hh" @@ -100,7 +102,6 @@ static void particle_settings_init(ID *id) } static void particle_settings_copy_data(Main * /*bmain*/, - std::optional /*owner_library*/, ID *id_dst, const ID *id_src, const int /*flag*/) @@ -381,7 +382,6 @@ static void particle_settings_blend_read_after_liblink(BlendLibReader * /*reader IDTypeInfo IDType_ID_PA = { /*id_code*/ ID_PA, /*id_filter*/ FILTER_ID_PA, - /*dependencies_id_types*/ FILTER_ID_OB | FILTER_ID_GR | FILTER_ID_TE, /*main_listbase_index*/ INDEX_ID_PA, /*struct_size*/ sizeof(ParticleSettings), /*name*/ "ParticleSettings", @@ -1079,7 +1079,7 @@ void psys_copy_particles(ParticleSystem *psys_dst, ParticleSystem *psys_src) * * Furthermore, #free_hair() always frees `pa->hair` if it's not nullptr, regardless of the * particle type. So *not* copying here would cause a double free (or more), e.g. freeing the - * copy-on-evaluation copy and the original data will crash Blender. + * copy-on-write copy and the original data will crash Blender. * In any case, sharing pointers between `psys_src` and `psys_dst` should be forbidden. * * So while we could in theory 'sanitize' the situation by setting `pa->hair` to nullptr in the @@ -2302,8 +2302,8 @@ void precalc_guides(ParticleSimulationData *sim, ListBase *effectors) nullptr, nullptr); - mul_m4_v3(sim->ob->object_to_world().ptr(), state.co); - mul_mat3_m4_v3(sim->ob->object_to_world().ptr(), state.vel); + mul_m4_v3(sim->ob->object_to_world, state.co); + mul_mat3_m4_v3(sim->ob->object_to_world, state.vel); pd_point_from_particle(sim, pa, &state, &point); @@ -2391,8 +2391,8 @@ bool do_guides(Depsgraph *depsgraph, } } - mul_m4_v3(eff->ob->object_to_world().ptr(), guidevec); - mul_mat3_m4_v3(eff->ob->object_to_world().ptr(), guidedir); + mul_m4_v3(eff->ob->object_to_world, guidevec); + mul_mat3_m4_v3(eff->ob->object_to_world, guidedir); normalize_v3(guidedir); @@ -2921,7 +2921,7 @@ static void psys_thread_create_path(ParticleTask *task, nullptr, orco); - mul_m4_v3(ob->object_to_world().ptr(), co); + mul_m4_v3(ob->object_to_world, co); for (w = 0; w < 4; w++) { sub_v3_v3v3(off1[w], co, key[w]->co); @@ -3384,7 +3384,7 @@ void psys_cache_paths(ParticleSimulationData *sim, float cfra, const bool use_re /* dynamic hair is in object space */ /* keyed and baked are already in global space */ if (hair_mesh) { - mul_m4_v3(sim->ob->object_to_world().ptr(), ca->co); + mul_m4_v3(sim->ob->object_to_world, ca->co); } else if (!keyed && !baked && !(psys->flag & PSYS_GLOBAL_HAIR)) { mul_m4_v3(hairmat, ca->co); @@ -3911,7 +3911,7 @@ void psys_mat_hair_to_global( psys_mat_hair_to_object(ob, mesh, from, pa, facemat); - mul_m4_m4m4(hairmat, ob->object_to_world().ptr(), facemat); + mul_m4_m4m4(hairmat, ob->object_to_world, facemat); } /************************************************/ @@ -4086,7 +4086,7 @@ void object_remove_particle_system(Main *bmain, DEG_id_tag_update(&ob->id, ID_RECALC_GEOMETRY); /* Flush object mode. */ - DEG_id_tag_update(&ob->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&ob->id, ID_RECALC_COPY_ON_WRITE); } ParticleSettings *BKE_particlesettings_add(Main *bmain, const char *name) @@ -4282,7 +4282,7 @@ static void get_cpa_texture(Mesh *mesh, case TEXCO_OBJECT: copy_v3_v3(texvec, par->state.co); if (mtex->object) { - mul_m4_v3(mtex->object->world_to_object().ptr(), texvec); + mul_m4_v3(mtex->object->world_to_object, texvec); } break; case TEXCO_UV: @@ -4372,7 +4372,7 @@ void psys_get_texture( case TEXCO_OBJECT: copy_v3_v3(texvec, pa->state.co); if (mtex->object) { - mul_m4_v3(mtex->object->world_to_object().ptr(), texvec); + mul_m4_v3(mtex->object->world_to_object, texvec); } break; case TEXCO_UV: @@ -4655,8 +4655,8 @@ void psys_get_particle_on_path(ParticleSimulationData *sim, do_particle_interpolation(psys, p, pa, t, &pind, state); if (pind.mesh) { - mul_m4_v3(sim->ob->object_to_world().ptr(), state->co); - mul_mat3_m4_v3(sim->ob->object_to_world().ptr(), state->vel); + mul_m4_v3(sim->ob->object_to_world, state->co); + mul_mat3_m4_v3(sim->ob->object_to_world, state->vel); } else if (!keyed && !cached && !(psys->flag & PSYS_GLOBAL_HAIR)) { if ((pa->flag & PARS_REKEY) == 0) { @@ -4679,7 +4679,7 @@ void psys_get_particle_on_path(ParticleSimulationData *sim, } } else if (totchild) { - // invert_m4_m4(imat, ob->object_to_world().ptr()); + // invert_m4_m4(imat, ob->object_to_world); /* interpolate childcache directly if it exists */ if (psys->childcache) { @@ -4736,7 +4736,7 @@ void psys_get_particle_on_path(ParticleSimulationData *sim, * positioning it accurately to the surface of the emitter. */ // copy_v3_v3(cpa_1st, co); - // mul_m4_v3(ob->object_to_world().ptr(), cpa_1st); + // mul_m4_v3(ob->object_to_world, cpa_1st); pa = psys->particles + cpa->parent; @@ -5201,7 +5201,7 @@ void psys_get_dupli_path_transform(ParticleSimulationData *sim, } if (psys->part->rotmode == PART_ROT_VEL) { - transpose_m3_m4(nmat, ob->world_to_object().ptr()); + transpose_m3_m4(nmat, ob->world_to_object); mul_m3_v3(nmat, nor); normalize_v3(nor); diff --git a/source/blender/blenkernel/intern/particle_child.cc b/source/blender/blenkernel/intern/particle_child.cc index b2032d34683..0ffa82e46bc 100644 --- a/source/blender/blenkernel/intern/particle_child.cc +++ b/source/blender/blenkernel/intern/particle_child.cc @@ -184,7 +184,7 @@ static void do_kink_spiral(ParticleThreadContext *ctx, zero_v3(kink_base); kink_base[part->kink_axis] = 1.0f; - mul_mat3_m4_v3(ctx->sim.ob->object_to_world().ptr(), kink_base); + mul_mat3_m4_v3(ctx->sim.ob->object_to_world, kink_base); /* Fill in invariant part of modifier context. */ ParticleChildModifierContext modifier_ctx = {nullptr}; @@ -393,7 +393,7 @@ void do_kink(ParticleKey *state, float flat, short type, short axis, - const float obmat[4][4], + float obmat[4][4], int smooth_start) { float kink[3] = {1.0f, 0.0f, 0.0f}, par_vec[3]; @@ -872,7 +872,7 @@ void do_child_modifiers(const ParticleChildModifierContext *modifier_ctx, part->kink_flat, part->kink, part->kink_axis, - sim->ob->object_to_world().ptr(), + sim->ob->object_to_world, smooth_start); } } diff --git a/source/blender/blenkernel/intern/particle_distribute.cc b/source/blender/blenkernel/intern/particle_distribute.cc index 21eda684ef0..2834d4f5246 100644 --- a/source/blender/blenkernel/intern/particle_distribute.cc +++ b/source/blender/blenkernel/intern/particle_distribute.cc @@ -22,12 +22,15 @@ #include "DNA_meshdata_types.h" #include "DNA_modifier_types.h" #include "DNA_particle_types.h" +#include "DNA_scene_types.h" #include "BKE_customdata.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_lib_id.hh" #include "BKE_mesh.hh" #include "BKE_mesh_legacy_convert.hh" +#include "BKE_mesh_runtime.hh" +#include "BKE_object.hh" #include "BKE_particle.h" #include "DEG_depsgraph_query.hh" diff --git a/source/blender/blenkernel/intern/particle_system.cc b/source/blender/blenkernel/intern/particle_system.cc index ce3e10aa146..3e2a86bb516 100644 --- a/source/blender/blenkernel/intern/particle_system.cc +++ b/source/blender/blenkernel/intern/particle_system.cc @@ -15,8 +15,10 @@ #include "MEM_guardedalloc.h" +#include "DNA_anim_types.h" #include "DNA_boid_types.h" #include "DNA_cloth_types.h" +#include "DNA_curve_types.h" #include "DNA_listBase.h" #include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" @@ -39,6 +41,7 @@ #include "BLI_string_utils.hh" #include "BLI_task.h" #include "BLI_threads.h" +#include "BLI_time.h" #include "BLI_utildefines.h" #include "BKE_animsys.h" @@ -50,19 +53,26 @@ #include "BKE_lib_id.hh" #include "BKE_lib_query.hh" #include "BKE_mesh_legacy_convert.hh" +#include "BKE_mesh_runtime.hh" #include "BKE_particle.h" +#include "BKE_bvhutils.hh" #include "BKE_cloth.hh" +#include "BKE_collection.h" +#include "BKE_lattice.hh" #include "BKE_material.h" #include "BKE_mesh.hh" #include "BKE_modifier.hh" #include "BKE_object.hh" #include "BKE_pointcache.h" -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "DEG_depsgraph.hh" +#include "DEG_depsgraph_physics.hh" #include "DEG_depsgraph_query.hh" +#include "RE_texture.h" + /* FLUID sim particle import */ #ifdef WITH_FLUID # include "DNA_fluid_types.h" @@ -759,10 +769,10 @@ void psys_get_birth_coords( /* particles live in global space so */ /* let's convert: */ /* -location */ - mul_m4_v3(ob->object_to_world().ptr(), loc); + mul_m4_v3(ob->object_to_world, loc); /* -normal */ - mul_mat3_m4_v3(ob->object_to_world().ptr(), nor); + mul_mat3_m4_v3(ob->object_to_world, nor); normalize_v3(nor); /* -tangent */ @@ -780,7 +790,7 @@ void psys_get_birth_coords( fac = -sinf(float(M_PI) * (part->tanphase + phase)); madd_v3_v3fl(vtan, utan, fac); - mul_mat3_m4_v3(ob->object_to_world().ptr(), vtan); + mul_mat3_m4_v3(ob->object_to_world, vtan); copy_v3_v3(utan, nor); mul_v3_fl(utan, dot_v3v3(vtan, nor)); @@ -795,7 +805,7 @@ void psys_get_birth_coords( r_vel[1] = 2.0f * (psys_frand(psys, p + 11) - 0.5f); r_vel[2] = 2.0f * (psys_frand(psys, p + 12) - 0.5f); - mul_mat3_m4_v3(ob->object_to_world().ptr(), r_vel); + mul_mat3_m4_v3(ob->object_to_world, r_vel); normalize_v3(r_vel); } @@ -805,7 +815,7 @@ void psys_get_birth_coords( r_ave[1] = 2.0f * (psys_frand(psys, p + 14) - 0.5f); r_ave[2] = 2.0f * (psys_frand(psys, p + 15) - 0.5f); - mul_mat3_m4_v3(ob->object_to_world().ptr(), r_ave); + mul_mat3_m4_v3(ob->object_to_world, r_ave); normalize_v3(r_ave); } @@ -817,7 +827,7 @@ void psys_get_birth_coords( r_rot[3] = 2.0f * (psys_frand(psys, p + 19) - 0.5f); normalize_qt(r_rot); - mat4_to_quat(rot, ob->object_to_world().ptr()); + mat4_to_quat(rot, ob->object_to_world); mul_qt_qtqt(r_rot, r_rot, rot); } @@ -831,7 +841,7 @@ void psys_get_birth_coords( /* boids store direction in ave */ if (fabsf(nor[2]) == 1.0f) { - sub_v3_v3v3(state->ave, loc, ob->object_to_world().location()); + sub_v3_v3v3(state->ave, loc, ob->object_to_world[3]); normalize_v3(state->ave); } else { @@ -877,15 +887,15 @@ void psys_get_birth_coords( /* *emitter object orientation */ if (part->ob_vel[0] != 0.0f) { - normalize_v3_v3(vec, ob->object_to_world().ptr()[0]); + normalize_v3_v3(vec, ob->object_to_world[0]); madd_v3_v3fl(vel, vec, part->ob_vel[0]); } if (part->ob_vel[1] != 0.0f) { - normalize_v3_v3(vec, ob->object_to_world().ptr()[1]); + normalize_v3_v3(vec, ob->object_to_world[1]); madd_v3_v3fl(vel, vec, part->ob_vel[1]); } if (part->ob_vel[2] != 0.0f) { - normalize_v3_v3(vec, ob->object_to_world().ptr()[2]); + normalize_v3_v3(vec, ob->object_to_world[2]); madd_v3_v3fl(vel, vec, part->ob_vel[2]); } @@ -933,7 +943,7 @@ void psys_get_birth_coords( case PART_ROT_OB_X: case PART_ROT_OB_Y: case PART_ROT_OB_Z: - copy_v3_v3(rot_vec, ob->object_to_world().ptr()[part->rotmode - PART_ROT_OB_X]); + copy_v3_v3(rot_vec, ob->object_to_world[part->rotmode - PART_ROT_OB_X]); use_global_space = false; break; default: @@ -960,7 +970,7 @@ void psys_get_birth_coords( float q_obmat[4]; float q_imat[4]; - mat4_to_quat(q_obmat, ob->object_to_world().ptr()); + mat4_to_quat(q_obmat, ob->object_to_world); invert_qt_qt_normalized(q_imat, q_obmat); if (part->rotmode != PART_ROT_NOR_TAN) { @@ -3384,7 +3394,7 @@ static void hair_create_input_mesh(ParticleSimulationData *sim, use_hair = psys_hair_use_simulation(pa, max_length); psys_mat_hair_to_object(sim->ob, sim->psmd->mesh_final, psys->part->from, pa, hairmat); - mul_m4_m4m4(root_mat, sim->ob->object_to_world().ptr(), hairmat); + mul_m4_m4m4(root_mat, sim->ob->object_to_world, hairmat); normalize_m4(root_mat); bending_stiffness = std::clamp( @@ -3580,7 +3590,7 @@ static void save_hair(ParticleSimulationData *sim, float /*cfra*/) HairKey *key, *root; PARTICLE_P; - invert_m4_m4(ob->runtime->world_to_object.ptr(), ob->object_to_world().ptr()); + invert_m4_m4(ob->world_to_object, ob->object_to_world); if (psys->totpart == 0) { return; @@ -3603,7 +3613,7 @@ static void save_hair(ParticleSimulationData *sim, float /*cfra*/) /* convert from global to geometry space */ copy_v3_v3(key->co, pa->state.co); - mul_m4_v3(ob->world_to_object().ptr(), key->co); + mul_m4_v3(ob->world_to_object, key->co); if (pa->totkey) { sub_v3_v3(key->co, root->co); @@ -4414,7 +4424,7 @@ static void particles_fluid_step(ParticleSimulationData *sim, mul_v3_v3(pa->state.co, scaleAbs); /* Match domain scale. */ - mul_m4_v3(ob->object_to_world().ptr(), pa->state.co); + mul_m4_v3(ob->object_to_world, pa->state.co); /* Add origin offset to particle position. */ zero_v3(tmp); @@ -5001,7 +5011,7 @@ void particle_system_update(Depsgraph *depsgraph, /* Save matrix for duplicators, * at render-time the actual dupli-object's matrix is used so don't update! */ - invert_m4_m4(psys->imat, ob->object_to_world().ptr()); + invert_m4_m4(psys->imat, ob->object_to_world); BKE_particle_batch_cache_dirty_tag(psys, BKE_PARTICLE_BATCH_DIRTY_ALL); } diff --git a/source/blender/blenkernel/intern/pbvh.cc b/source/blender/blenkernel/intern/pbvh.cc index 2a10f434558..21af091b062 100644 --- a/source/blender/blenkernel/intern/pbvh.cc +++ b/source/blender/blenkernel/intern/pbvh.cc @@ -1785,9 +1785,9 @@ bool BKE_pbvh_node_fully_unmasked_get(const PBVHNode *node) return (node->flag & PBVH_Leaf) && (node->flag & PBVH_FullyUnmasked); } -blender::Span BKE_pbvh_node_get_corner_indices(const PBVHNode *node) +blender::Span BKE_pbvh_node_get_loops(const PBVHNode *node) { - return node->corner_indices; + return node->loop_indices; } blender::Span BKE_pbvh_node_get_vert_indices(const PBVHNode *node) @@ -1834,6 +1834,26 @@ Span node_face_indices_calc_grids(const PBVH &pbvh, const PBVHNode &node, V } // namespace blender::bke::pbvh +blender::Vector BKE_pbvh_node_calc_face_indices(const PBVH &pbvh, const PBVHNode &node) +{ + using namespace blender::bke::pbvh; + Vector faces; + switch (pbvh.header.type) { + case PBVH_FACES: { + node_face_indices_calc_mesh(pbvh, node, faces); + break; + } + case PBVH_GRIDS: { + node_face_indices_calc_grids(pbvh, node, faces); + break; + } + case PBVH_BMESH: + BLI_assert_unreachable(); + break; + } + return faces; +} + int BKE_pbvh_node_num_unique_verts(const PBVH &pbvh, const PBVHNode &node) { switch (pbvh.header.type) { @@ -3078,7 +3098,7 @@ void BKE_pbvh_ensure_node_loops(PBVH *pbvh) continue; } - if (!node.corner_indices.is_empty()) { + if (!node.loop_indices.is_empty()) { return; } @@ -3088,26 +3108,27 @@ void BKE_pbvh_ensure_node_loops(PBVH *pbvh) BLI_bitmap *visit = BLI_BITMAP_NEW(totloop, __func__); /* Create loop indices from node loop triangles. */ - Vector corner_indices; + Vector loop_indices; for (PBVHNode &node : pbvh->nodes) { if (!(node.flag & PBVH_Leaf)) { continue; } - corner_indices.clear(); + loop_indices.clear(); for (const int i : node.prim_indices) { const int3 &tri = pbvh->corner_tris[i]; for (int k = 0; k < 3; k++) { if (!BLI_BITMAP_TEST(visit, tri[k])) { - corner_indices.append(tri[k]); + loop_indices.append(tri[k]); BLI_BITMAP_ENABLE(visit, tri[k]); } } } - node.corner_indices = corner_indices.as_span(); + node.loop_indices.reinitialize(loop_indices.size()); + node.loop_indices.as_mutable_span().copy_from(loop_indices); } MEM_SAFE_FREE(visit); diff --git a/source/blender/blenkernel/intern/pbvh_bmesh.cc b/source/blender/blenkernel/intern/pbvh_bmesh.cc index 9e8de909df1..078e4774d21 100644 --- a/source/blender/blenkernel/intern/pbvh_bmesh.cc +++ b/source/blender/blenkernel/intern/pbvh_bmesh.cc @@ -35,7 +35,7 @@ static CLG_LogRef LOG = {"pbvh.bmesh"}; /* Avoid skinny faces */ #define USE_EDGEQUEUE_EVEN_SUBDIV #ifdef USE_EDGEQUEUE_EVEN_SUBDIV -# include "BKE_global.hh" +# include "BKE_global.h" #endif namespace blender::bke::pbvh { @@ -1224,7 +1224,7 @@ static void pbvh_bmesh_split_edge(EdgeQueueContext *eq_ctx, PBVH *pbvh, BMEdge * static bool pbvh_bmesh_subdivide_long_edges(EdgeQueueContext *eq_ctx, PBVH *pbvh) { - const double start_time = BLI_time_now_seconds(); + const double start_time = BLI_check_seconds_timer(); bool any_subdivided = false; @@ -1267,7 +1267,7 @@ static bool pbvh_bmesh_subdivide_long_edges(EdgeQueueContext *eq_ctx, PBVH *pbvh #endif CLOG_INFO( - &LOG, 2, "Long edge subdivision took %f seconds.", BLI_time_now_seconds() - start_time); + &LOG, 2, "Long edge subdivision took %f seconds.", BLI_check_seconds_timer() - start_time); return any_subdivided; } @@ -1701,7 +1701,7 @@ static void pbvh_bmesh_collapse_edge( static bool pbvh_bmesh_collapse_short_edges(EdgeQueueContext *eq_ctx, PBVH *pbvh) { - const double start_time = BLI_time_now_seconds(); + const double start_time = BLI_check_seconds_timer(); const float min_len_squared = pbvh->bm_min_edge_len * pbvh->bm_min_edge_len; bool any_collapsed = false; @@ -1751,7 +1751,8 @@ static bool pbvh_bmesh_collapse_short_edges(EdgeQueueContext *eq_ctx, PBVH *pbvh BLI_ghash_free(deleted_verts, nullptr, nullptr); - CLOG_INFO(&LOG, 2, "Short edge collapse took %f seconds.", BLI_time_now_seconds() - start_time); + CLOG_INFO( + &LOG, 2, "Short edge collapse took %f seconds.", BLI_check_seconds_timer() - start_time); return any_collapsed; } @@ -2302,29 +2303,6 @@ bool bmesh_update_topology(PBVH *pbvh, } // namespace blender::bke::pbvh -/* Updates a given PBVH Node with the original coordinates of the corresponding BMesh vertex. - * Attempts to retrieve the value from the BMLog, falls back to the vertex's current coordinates - * if it is either not found in the log or not requested. */ -static void BKE_pbvh_bmesh_node_copy_original_co( - BMLog *log, PBVHNode *node, BMVert *v, int i, bool use_original) -{ - if (!use_original) { - copy_v3_v3(node->bm_orco[i], v->co); - } - else { - const float *origco = BM_log_find_original_vert_co(log, v); - if (origco) { - copy_v3_v3(node->bm_orco[i], origco); - } - else { - copy_v3_v3(node->bm_orco[i], v->co); - } - } - - node->bm_orvert[i] = v; - BM_elem_index_set(v, i); /* set_dirty! */ -} - void BKE_pbvh_bmesh_node_save_orig(BMesh *bm, BMLog *log, PBVHNode *node, bool use_original) { /* Skip if original coords/triangles are already saved. */ @@ -2345,11 +2323,31 @@ void BKE_pbvh_bmesh_node_save_orig(BMesh *bm, BMLog *log, PBVHNode *node, bool u /* Copy out the vertices and assign a temporary index. */ int i = 0; for (BMVert *v : node->bm_unique_verts) { - BKE_pbvh_bmesh_node_copy_original_co(log, node, v, i, use_original); + const float *origco = BM_log_original_vert_co(log, v); + + if (use_original && origco) { + copy_v3_v3(node->bm_orco[i], origco); + } + else { + copy_v3_v3(node->bm_orco[i], v->co); + } + + node->bm_orvert[i] = v; + BM_elem_index_set(v, i); /* set_dirty! */ i++; } for (BMVert *v : node->bm_other_verts) { - BKE_pbvh_bmesh_node_copy_original_co(log, node, v, i, use_original); + const float *origco = BM_log_original_vert_co(log, v); + + if (use_original && origco) { + copy_v3_v3(node->bm_orco[i], BM_log_original_vert_co(log, v)); + } + else { + copy_v3_v3(node->bm_orco[i], v->co); + } + + node->bm_orvert[i] = v; + BM_elem_index_set(v, i); /* set_dirty! */ i++; } /* Likely this is already dirty. */ diff --git a/source/blender/blenkernel/intern/pbvh_intern.hh b/source/blender/blenkernel/intern/pbvh_intern.hh index 560ae87a467..76884c11ed5 100644 --- a/source/blender/blenkernel/intern/pbvh_intern.hh +++ b/source/blender/blenkernel/intern/pbvh_intern.hh @@ -75,7 +75,7 @@ struct PBVHNode { /* Array of indices into the Mesh's corner array. * PBVH_FACES only. */ - blender::Array corner_indices; + blender::Array loop_indices; /* An array mapping face corners into the vert_indices * array. The array is sized to match 'totprim', and each of diff --git a/source/blender/blenkernel/intern/pbvh_pixels.cc b/source/blender/blenkernel/intern/pbvh_pixels.cc index 55906e4abe7..0a4a16f6ed5 100644 --- a/source/blender/blenkernel/intern/pbvh_pixels.cc +++ b/source/blender/blenkernel/intern/pbvh_pixels.cc @@ -5,17 +5,20 @@ #include "BKE_attribute.hh" #include "BKE_customdata.hh" #include "BKE_mesh.hh" +#include "BKE_mesh_mapping.hh" #include "BKE_pbvh_api.hh" #include "BKE_pbvh_pixels.hh" #include "DNA_image_types.h" +#include "DNA_object_types.h" #include "BLI_listbase.h" #include "BLI_math_geom.h" #include "BLI_math_vector.h" #include "BLI_task.h" +#include "BLI_time.h" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_image_wrappers.hh" #include "pbvh_intern.hh" diff --git a/source/blender/blenkernel/intern/pbvh_pixels_copy.cc b/source/blender/blenkernel/intern/pbvh_pixels_copy.cc index ad65e7ab8a4..371cf3e674f 100644 --- a/source/blender/blenkernel/intern/pbvh_pixels_copy.cc +++ b/source/blender/blenkernel/intern/pbvh_pixels_copy.cc @@ -472,7 +472,7 @@ struct Rows { return selected_pixels; } - void pack_into(const Span> selected_pixels, + void pack_into(const Vector> &selected_pixels, CopyPixelTile ©_tile) const { std::optional> last_group = std::nullopt; diff --git a/source/blender/blenkernel/intern/pbvh_uv_islands.cc b/source/blender/blenkernel/intern/pbvh_uv_islands.cc index 85e57f77157..e22bf3f8d8d 100644 --- a/source/blender/blenkernel/intern/pbvh_uv_islands.cc +++ b/source/blender/blenkernel/intern/pbvh_uv_islands.cc @@ -670,7 +670,7 @@ struct Fan { #endif - static bool is_path_valid(const Span path, + static bool is_path_valid(const Span &path, const MeshData &mesh_data, const int from_vertex, const int to_vertex) diff --git a/source/blender/blenkernel/intern/pointcache.cc b/source/blender/blenkernel/intern/pointcache.cc index 13238cbf74e..03490d320e4 100644 --- a/source/blender/blenkernel/intern/pointcache.cc +++ b/source/blender/blenkernel/intern/pointcache.cc @@ -43,21 +43,21 @@ #include "BLI_time.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_appdir.hh" #include "BKE_cloth.hh" -#include "BKE_collection.hh" +#include "BKE_collection.h" #include "BKE_dynamicpaint.h" #include "BKE_fluid.h" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_lib_id.hh" #include "BKE_main.hh" #include "BKE_modifier.hh" #include "BKE_object.hh" #include "BKE_particle.h" #include "BKE_pointcache.h" -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "BKE_softbody.h" #include "BLO_read_write.hh" @@ -3297,7 +3297,7 @@ void BKE_ptcache_bake(PTCacheBaker *baker) char run[32], cur[32], etd[32]; int cancel = 0; - stime = ptime = BLI_time_now_seconds(); + stime = ptime = BLI_check_seconds_timer(); for (int fr = scene->r.cfra; fr <= endframe; fr += baker->quick_step, scene->r.cfra = fr) { BKE_scene_graph_update_for_newframe(depsgraph); @@ -3311,7 +3311,7 @@ void BKE_ptcache_bake(PTCacheBaker *baker) printf("bake: frame %d :: %d\n", scene->r.cfra, endframe); } else { - ctime = BLI_time_now_seconds(); + ctime = BLI_check_seconds_timer(); fetd = (ctime - ptime) * (endframe - scene->r.cfra) / baker->quick_step; @@ -3343,7 +3343,7 @@ void BKE_ptcache_bake(PTCacheBaker *baker) if (use_timer) { /* start with newline because of \r above */ - ptcache_dt_to_str(run, sizeof(run), BLI_time_now_seconds() - stime); + ptcache_dt_to_str(run, sizeof(run), BLI_check_seconds_timer() - stime); printf("\nBake %s %s (%i frames simulated).\n", (cancel ? "canceled after" : "finished in"), run, diff --git a/source/blender/blenkernel/intern/pointcloud.cc b/source/blender/blenkernel/intern/pointcloud.cc index aa4a3c1d58e..daa2ccc412a 100644 --- a/source/blender/blenkernel/intern/pointcloud.cc +++ b/source/blender/blenkernel/intern/pointcloud.cc @@ -6,8 +6,6 @@ * \ingroup bke */ -#include - #include "MEM_guardedalloc.h" #include "DNA_defaults.h" @@ -17,26 +15,32 @@ #include "BLI_bounds.hh" #include "BLI_index_range.hh" +#include "BLI_listbase.h" #include "BLI_math_vector.hh" #include "BLI_rand.h" #include "BLI_span.hh" +#include "BLI_string.h" #include "BLI_task.hh" #include "BLI_utildefines.h" #include "BLI_vector.hh" -#include "BKE_anim_data.hh" +#include "BKE_anim_data.h" #include "BKE_bake_data_block_id.hh" #include "BKE_customdata.hh" #include "BKE_geometry_set.hh" +#include "BKE_global.h" #include "BKE_idtype.hh" #include "BKE_lib_id.hh" #include "BKE_lib_query.hh" +#include "BKE_lib_remap.hh" +#include "BKE_main.hh" +#include "BKE_mesh_wrapper.hh" #include "BKE_modifier.hh" #include "BKE_object.hh" #include "BKE_object_types.hh" #include "BKE_pointcloud.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DEG_depsgraph_query.hh" @@ -70,7 +74,6 @@ static void pointcloud_init_data(ID *id) } static void pointcloud_copy_data(Main * /*bmain*/, - std::optional /*owner_library*/, ID *id_dst, const ID *id_src, const int /*flag*/) @@ -149,7 +152,6 @@ static void pointcloud_blend_read_data(BlendDataReader *reader, ID *id) IDTypeInfo IDType_ID_PT = { /*id_code*/ ID_PT, /*id_filter*/ FILTER_ID_PT, - /*dependencies_id_types*/ FILTER_ID_MA, /*main_listbase_index*/ INDEX_ID_PT, /*struct_size*/ sizeof(PointCloud), /*name*/ "PointCloud", diff --git a/source/blender/blenkernel/intern/preferences.cc b/source/blender/blenkernel/intern/preferences.cc index 62f820dd22e..155b92eb2ca 100644 --- a/source/blender/blenkernel/intern/preferences.cc +++ b/source/blender/blenkernel/intern/preferences.cc @@ -10,6 +10,8 @@ #include +#include "DNA_asset_types.h" + #include "MEM_guardedalloc.h" #include "BLI_fileops.h" @@ -22,7 +24,7 @@ #include "BKE_appdir.hh" #include "BKE_preferences.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_defaults.h" #include "DNA_userdef_types.h" @@ -193,22 +195,6 @@ void BKE_preferences_extension_repo_remove(UserDef *userdef, bUserExtensionRepo BLI_freelinkN(&userdef->extension_repos, repo); } -bUserExtensionRepo *BKE_preferences_extension_repo_add_default(UserDef *userdef) -{ - bUserExtensionRepo *repo = BKE_preferences_extension_repo_add( - userdef, "extensions.blender.org", "blender_org", ""); - STRNCPY(repo->remote_path, "https://extensions.blender.org"); - repo->flag |= USER_EXTENSION_REPO_FLAG_USE_REMOTE_PATH; - return repo; -} - -bUserExtensionRepo *BKE_preferences_extension_repo_add_default_user(UserDef *userdef) -{ - bUserExtensionRepo *repo = BKE_preferences_extension_repo_add( - userdef, "User Default", "user_default", ""); - return repo; -} - void BKE_preferences_extension_repo_name_set(UserDef *userdef, bUserExtensionRepo *repo, const char *name) @@ -247,12 +233,13 @@ void BKE_preferences_extension_repo_custom_dirpath_set(bUserExtensionRepo *repo, STRNCPY(repo->custom_dirpath, path); } -size_t BKE_preferences_extension_repo_dirpath_get(const bUserExtensionRepo *repo, - char *dirpath, - const int dirpath_maxncpy) +void BKE_preferences_extension_repo_dirpath_get(const bUserExtensionRepo *repo, + char *dirpath, + const int dirpath_maxncpy) { if (repo->flag & USER_EXTENSION_REPO_FLAG_USE_CUSTOM_DIRECTORY) { - return BLI_strncpy_rlen(dirpath, repo->custom_dirpath, dirpath_maxncpy); + BLI_strncpy(dirpath, repo->custom_dirpath, dirpath_maxncpy); + return; } /* TODO: support `BLENDER_USER_EXTENSIONS`, until then add to user resource. */ @@ -260,9 +247,9 @@ size_t BKE_preferences_extension_repo_dirpath_get(const bUserExtensionRepo *repo /* Highly unlikely to fail as the directory doesn't have to exist. */ if (!path) { dirpath[0] = '\0'; - return 0; + return; } - return BLI_path_join(dirpath, dirpath_maxncpy, path.value().c_str(), "extensions", repo->module); + BLI_path_join(dirpath, dirpath_maxncpy, path.value().c_str(), "extensions", repo->module); } bUserExtensionRepo *BKE_preferences_extension_repo_find_index(const UserDef *userdef, int index) @@ -277,123 +264,6 @@ bUserExtensionRepo *BKE_preferences_extension_repo_find_by_module(const UserDef BLI_findstring(&userdef->extension_repos, module, offsetof(bUserExtensionRepo, module))); } -static bool url_char_is_delimiter(const char ch) -{ - /* Punctuation (space to comma). */ - if (ch >= 32 && ch <= 44) { - return true; - } - /* Other characters (colon to at-sign). */ - if (ch >= 58 && ch <= 64) { - return true; - } - if (ELEM(ch, '/', '\\')) { - return true; - } - return false; -} - -bUserExtensionRepo *BKE_preferences_extension_repo_find_by_remote_path_prefix( - const UserDef *userdef, const char *path_full, const bool only_enabled) -{ - const int path_full_len = strlen(path_full); - const int path_full_offset = BKE_preferences_extension_repo_remote_scheme_end(path_full); - - LISTBASE_FOREACH (bUserExtensionRepo *, repo, &userdef->extension_repos) { - if (only_enabled && (repo->flag & USER_EXTENSION_REPO_FLAG_DISABLED)) { - continue; - } - - /* Has a valid remote path to check. */ - if ((repo->flag & USER_EXTENSION_REPO_FLAG_USE_REMOTE_PATH) == 0) { - continue; - } - if (repo->remote_path[0] == '\0') { - continue; - } - - /* Set path variables which may be offset by the "scheme". */ - const char *path_repo = repo->remote_path; - const char *path_test = path_full; - int path_test_len = path_full_len; - - /* Allow paths beginning with both `http` & `https` to be considered equivalent. - * This is done by skipping the "scheme" prefix both have a scheme. */ - if (path_full_offset) { - const int path_repo_offset = BKE_preferences_extension_repo_remote_scheme_end(path_repo); - if (path_repo_offset) { - path_repo += path_repo_offset; - path_test += path_full_offset; - path_test_len -= path_full_offset; - } - } - - /* The length of the path without trailing slashes. */ - int path_repo_len = strlen(path_repo); - while (path_repo_len && ELEM(path_repo[path_repo_len - 1], '/', '\\')) { - path_repo_len--; - } - - if (path_test_len <= path_repo_len) { - continue; - } - if (memcmp(path_repo, path_test, path_repo_len) != 0) { - continue; - } - - /* A delimiter must follow to ensure `path_test` doesn't reference a longer host-name. - * Will typically be a `/` or a `:`. */ - if (!url_char_is_delimiter(path_test[path_repo_len])) { - continue; - } - return repo; - } - return nullptr; -} - -int BKE_preferences_extension_repo_remote_scheme_end(const char *url) -{ - /* Technically the "://" are not part of the scheme, so subtract 3 from the return value. */ - const char *scheme_check[] = { - "http://", - "https://", - "file://", - }; - for (int i = 0; i < ARRAY_SIZE(scheme_check); i++) { - const char *scheme = scheme_check[i]; - int scheme_len = strlen(scheme); - if (strncmp(url, scheme, scheme_len) == 0) { - return scheme_len - 3; - } - } - return 0; -} - -void BKE_preferences_extension_remote_to_name(const char *remote_path, - char name[sizeof(bUserExtensionRepo::name)]) -{ - name[0] = '\0'; - if (int offset = BKE_preferences_extension_repo_remote_scheme_end(remote_path)) { - remote_path += (offset + 3); - } - if (UNLIKELY(remote_path[0] == '\0')) { - return; - } - - const char *c = remote_path; - /* Skip any delimiters (likely forward slashes for `file:///` on UNIX). */ - while (*c && url_char_is_delimiter(*c)) { - c++; - } - /* Skip the domain name. */ - while (*c && !url_char_is_delimiter(*c)) { - c++; - } - - BLI_strncpy_utf8( - name, remote_path, std::min(size_t(c - remote_path) + 1, sizeof(bUserExtensionRepo::name))); -} - int BKE_preferences_extension_repo_get_index(const UserDef *userdef, const bUserExtensionRepo *repo) { diff --git a/source/blender/blenkernel/intern/preview_image.cc b/source/blender/blenkernel/intern/preview_image.cc index f31881840de..6c53b325f64 100644 --- a/source/blender/blenkernel/intern/preview_image.cc +++ b/source/blender/blenkernel/intern/preview_image.cc @@ -25,9 +25,7 @@ #include "BLI_ghash.h" #include "BLI_string.h" #include "BLI_string_ref.hh" -#ifndef NDEBUG -# include "BLI_threads.h" -#endif +#include "BLI_threads.h" #include "BLO_read_write.hh" diff --git a/source/blender/blenkernel/intern/report.cc b/source/blender/blenkernel/intern/report.cc index a40a544c9e3..ae709f0fd56 100644 --- a/source/blender/blenkernel/intern/report.cc +++ b/source/blender/blenkernel/intern/report.cc @@ -20,10 +20,10 @@ #include "BLI_string_utils.hh" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" -#include "BKE_global.hh" /* G.background only */ -#include "BKE_report.hh" +#include "BKE_global.h" /* G.background only */ +#include "BKE_report.h" const char *BKE_report_type_str(eReportType type) { diff --git a/source/blender/blenkernel/intern/rigidbody.cc b/source/blender/blenkernel/intern/rigidbody.cc index df6c75f1369..6e30868e178 100644 --- a/source/blender/blenkernel/intern/rigidbody.cc +++ b/source/blender/blenkernel/intern/rigidbody.cc @@ -36,9 +36,9 @@ #include "DNA_rigidbody_types.h" #include "DNA_scene_types.h" -#include "BKE_collection.hh" +#include "BKE_collection.h" #include "BKE_effect.h" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_layer.hh" #include "BKE_main.hh" #include "BKE_mesh.hh" @@ -46,9 +46,9 @@ #include "BKE_object.hh" #include "BKE_object_types.hh" #include "BKE_pointcache.h" -#include "BKE_report.hh" +#include "BKE_report.h" #include "BKE_rigidbody.h" -#include "BKE_scene.hh" +#include "BKE_scene.h" #ifdef WITH_BULLET # include "BKE_lib_id.hh" # include "BKE_lib_query.hh" @@ -89,7 +89,7 @@ static void RB_constraint_delete(void * /*con*/) {} void BKE_rigidbody_free_world(Scene *scene) { - bool is_orig = (scene->id.tag & LIB_TAG_COPIED_ON_EVAL) == 0; + bool is_orig = (scene->id.tag & LIB_TAG_COPIED_ON_WRITE) == 0; RigidBodyWorld *rbw = scene->rigidbody_world; scene->rigidbody_world = nullptr; @@ -146,7 +146,7 @@ void BKE_rigidbody_free_world(Scene *scene) void BKE_rigidbody_free_object(Object *ob, RigidBodyWorld *rbw) { - bool is_orig = (ob->id.tag & LIB_TAG_COPIED_ON_EVAL) == 0; + bool is_orig = (ob->id.tag & LIB_TAG_COPIED_ON_WRITE) == 0; RigidBodyOb *rbo = ob->rigidbody_object; /* sanity check */ @@ -253,7 +253,7 @@ static RigidBodyOb *rigidbody_copy_object(const Object *ob, const int flag) rboN = static_cast(MEM_dupallocN(ob->rigidbody_object)); if (is_orig) { - /* This is a regular copy, and not an evaluated copy for depsgraph evaluation */ + /* This is a regular copy, and not a CoW copy for depsgraph evaluation */ rboN->shared = static_cast( MEM_callocN(sizeof(*rboN->shared), "RigidBodyOb_Shared")); } @@ -323,10 +323,10 @@ void BKE_rigidbody_object_copy(Main *bmain, Object *ob_dst, const Object *ob_src DEG_relations_tag_update(bmain); if (need_objects_update) { - DEG_id_tag_update(&rigidbody_world->group->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&rigidbody_world->group->id, ID_RECALC_COPY_ON_WRITE); } if (need_constraints_update) { - DEG_id_tag_update(&rigidbody_world->constraints->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&rigidbody_world->constraints->id, ID_RECALC_COPY_ON_WRITE); } DEG_id_tag_update(&ob_dst->id, ID_RECALC_TRANSFORM); } @@ -349,7 +349,7 @@ static Mesh *rigidbody_get_mesh(Object *ob) return BKE_object_get_evaluated_mesh(ob); case RBO_MESH_BASE: /* This mesh may be used for computing corner_tris, which should be done - * on the original; otherwise every time the evaluated copy is recreated it will + * on the original; otherwise every time the CoW is recreated it will * have to be recomputed. */ BLI_assert(ob->rigidbody_object->mesh_source == RBO_MESH_BASE); return (Mesh *)ob->runtime->data_orig; @@ -685,7 +685,7 @@ void BKE_rigidbody_calc_volume(Object *ob, float *r_vol) corner_verts.data(), &volume, nullptr); - const float volume_scale = mat4_to_volume_scale(ob->object_to_world().ptr()); + const float volume_scale = mat4_to_volume_scale(ob->object_to_world); volume *= fabsf(volume_scale); } } @@ -811,7 +811,7 @@ static void rigidbody_validate_sim_object(RigidBodyWorld *rbw, Object *ob, bool return; } - mat4_to_loc_quat(loc, rot, ob->object_to_world().ptr()); + mat4_to_loc_quat(loc, rot, ob->object_to_world); rbo->shared->physics_object = RB_body_new( static_cast(rbo->shared->physics_shape), loc, rot); @@ -1032,7 +1032,7 @@ static void rigidbody_validate_sim_constraint(RigidBodyWorld *rbw, Object *ob, b rbc->physics_constraint = nullptr; } - mat4_to_loc_quat(loc, rot, ob->object_to_world().ptr()); + mat4_to_loc_quat(loc, rot, ob->object_to_world); if (rb1 && rb2) { switch (rbc->type) { @@ -1257,7 +1257,7 @@ RigidBodyWorld *BKE_rigidbody_world_copy(RigidBodyWorld *rbw, const int flag) } if ((flag & LIB_ID_COPY_SET_COPIED_ON_WRITE) == 0) { - /* This is a regular copy, and not an evaluated copy for depsgraph evaluation. */ + /* This is a regular copy, and not a CoW copy for depsgraph evaluation. */ rbw_copy->shared = static_cast( MEM_callocN(sizeof(*rbw_copy->shared), "RigidBodyWorld_Shared")); BKE_ptcache_copy_list(&rbw_copy->shared->ptcaches, &rbw->shared->ptcaches, LIB_ID_COPY_CACHES); @@ -1345,7 +1345,7 @@ RigidBodyOb *BKE_rigidbody_create_object(Scene *scene, Object *ob, short type) rbo->mesh_source = RBO_MESH_DEFORM; /* set initial transform */ - mat4_to_loc_quat(rbo->pos, rbo->orn, ob->object_to_world().ptr()); + mat4_to_loc_quat(rbo->pos, rbo->orn, ob->object_to_world); /* flag cache as outdated */ BKE_rigidbody_cache_reset(rbw); @@ -1513,7 +1513,7 @@ static bool rigidbody_add_object_to_scene(Main *bmain, Scene *scene, Object *ob) BKE_rigidbody_cache_reset(rbw); DEG_relations_tag_update(bmain); - DEG_id_tag_update(&rbw->group->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&rbw->group->id, ID_RECALC_COPY_ON_WRITE); return true; } @@ -1542,7 +1542,7 @@ static bool rigidbody_add_constraint_to_scene(Main *bmain, Scene *scene, Object BKE_rigidbody_cache_reset(rbw); DEG_relations_tag_update(bmain); - DEG_id_tag_update(&rbw->constraints->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&rbw->constraints->id, ID_RECALC_COPY_ON_WRITE); return true; } @@ -1622,11 +1622,11 @@ void BKE_rigidbody_remove_object(Main *bmain, Scene *scene, Object *ob, const bo rbc = obt->rigidbody_constraint; if (rbc->ob1 == ob) { rbc->ob1 = nullptr; - DEG_id_tag_update(&obt->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&obt->id, ID_RECALC_COPY_ON_WRITE); } if (rbc->ob2 == ob) { rbc->ob2 = nullptr; - DEG_id_tag_update(&obt->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&obt->id, ID_RECALC_COPY_ON_WRITE); } } } @@ -1668,7 +1668,7 @@ void BKE_rigidbody_remove_constraint(Main *bmain, Scene *scene, Object *ob, cons /* Remove from RBW constraints collection. */ if (rbw->constraints != nullptr) { BKE_collection_object_remove(bmain, rbw->constraints, ob, free_us); - DEG_id_tag_update(&rbw->constraints->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&rbw->constraints->id, ID_RECALC_COPY_ON_WRITE); } /* remove from rigidbody world, free object won't do this */ @@ -1782,7 +1782,7 @@ static void rigidbody_update_sim_ob(Depsgraph *depsgraph, Object *ob, RigidBodyO if (!(rbo->flag & RBO_FLAG_KINEMATIC)) { /* update scale for all non kinematic objects */ float new_scale[3], old_scale[3]; - mat4_to_size(new_scale, ob->object_to_world().ptr()); + mat4_to_size(new_scale, ob->object_to_world); RB_body_get_scale(static_cast(rbo->shared->physics_object), old_scale); /* Avoid updating collision shape AABBs if scale didn't change. */ @@ -1856,10 +1856,10 @@ static void rigidbody_update_simulation(Depsgraph *depsgraph, RigidBodyOb *rbo = ob->rigidbody_object; /* TODO: remove this whole block once we are sure we never get nullptr rbo here anymore. */ - /* This cannot be done in copy-on-eval evaluation context anymore... */ + /* This cannot be done in CoW evaluation context anymore... */ if (rbo == nullptr) { BLI_assert_msg(0, - "Evaluated object part of RBW object collection without RB object data, " + "CoW object part of RBW object collection without RB object data, " "should not happen.\n"); /* Since this object is included in the sim group but doesn't have * rigid body settings (perhaps it was added manually), add! @@ -1916,12 +1916,11 @@ static void rigidbody_update_simulation(Depsgraph *depsgraph, RigidBodyCon *rbc = ob->rigidbody_constraint; /* TODO: remove this whole block once we are sure we never get nullptr rbo here anymore. */ - /* This cannot be done in copy-on-eval evaluation context anymore... */ + /* This cannot be done in CoW evaluation context anymore... */ if (rbc == nullptr) { - BLI_assert_msg( - 0, - "Evaluated object part of RBW constraints collection without RB constraint data, " - "should not happen.\n"); + BLI_assert_msg(0, + "CoW object part of RBW constraints collection without RB constraint data, " + "should not happen.\n"); /* Since this object is included in the group but doesn't have * constraint settings (perhaps it was added manually), add! */ @@ -1984,7 +1983,7 @@ static ListBase rigidbody_create_substep_data(RigidBodyWorld *rbw) copy_v4_v4(data->old_rot, rot); copy_v3_v3(data->old_scale, scale); - mat4_decompose(loc, rot, scale, ob->object_to_world().ptr()); + mat4_decompose(loc, rot, scale, ob->object_to_world); copy_v3_v3(data->new_pos, loc); copy_v4_v4(data->new_rot, rot); @@ -2159,15 +2158,15 @@ void BKE_rigidbody_sync_transforms(RigidBodyWorld *rbw, Object *ob, float ctime) quat_to_mat4(mat, rbo->orn); copy_v3_v3(mat[3], rbo->pos); - mat4_to_size(size, ob->object_to_world().ptr()); + mat4_to_size(size, ob->object_to_world); size_to_mat4(size_mat, size); mul_m4_m4m4(mat, mat, size_mat); - copy_m4_m4(ob->runtime->object_to_world.ptr(), mat); + copy_m4_m4(ob->object_to_world, mat); } /* otherwise set rigid body transform to current obmat */ else { - mat4_to_loc_quat(rbo->pos, rbo->orn, ob->object_to_world().ptr()); + mat4_to_loc_quat(rbo->pos, rbo->orn, ob->object_to_world); } } diff --git a/source/blender/blenkernel/intern/scene.cc b/source/blender/blenkernel/intern/scene.cc index eac2b61592a..190848c0c1c 100644 --- a/source/blender/blenkernel/intern/scene.cc +++ b/source/blender/blenkernel/intern/scene.cc @@ -12,7 +12,6 @@ #include #include #include -#include #include "MEM_guardedalloc.h" @@ -25,6 +24,7 @@ #include "DNA_mask_types.h" #include "DNA_material_types.h" #include "DNA_mesh_types.h" +#include "DNA_modifier_types.h" #include "DNA_node_types.h" #include "DNA_object_types.h" #include "DNA_rigidbody_types.h" @@ -37,32 +37,38 @@ #include "DNA_vfont_types.h" #include "DNA_view3d_types.h" #include "DNA_windowmanager_types.h" +#include "DNA_workspace_types.h" #include "DNA_world_types.h" -#include "BKE_callbacks.hh" +#include "BKE_callbacks.h" #include "BLI_blenlib.h" #include "BLI_math_rotation.h" #include "BLI_string.h" #include "BLI_string_utils.hh" #include "BLI_task.h" #include "BLI_threads.h" +#include "BLI_time.h" #include "BLI_utildefines.h" -#include "BLO_readfile.hh" +#include "BLO_readfile.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_action.h" -#include "BKE_anim_data.hh" +#include "BKE_anim_data.h" #include "BKE_animsys.h" -#include "BKE_bpath.hh" -#include "BKE_collection.hh" +#include "BKE_armature.hh" +#include "BKE_bpath.h" +#include "BKE_cachefile.h" +#include "BKE_collection.h" #include "BKE_colortools.hh" #include "BKE_curveprofile.h" -#include "BKE_duplilist.hh" +#include "BKE_duplilist.h" #include "BKE_editmesh.hh" #include "BKE_effect.h" -#include "BKE_fcurve.hh" +#include "BKE_fcurve.h" +#include "BKE_freestyle.h" +#include "BKE_gpencil_legacy.h" #include "BKE_idprop.h" #include "BKE_idtype.hh" #include "BKE_image.h" @@ -71,28 +77,35 @@ #include "BKE_lib_id.hh" #include "BKE_lib_query.hh" #include "BKE_lib_remap.hh" +#include "BKE_linestyle.h" #include "BKE_main.hh" +#include "BKE_mask.h" +#include "BKE_modifier.hh" +#include "BKE_node.hh" #include "BKE_node_runtime.hh" +#include "BKE_object.hh" #include "BKE_paint.hh" #include "BKE_pointcache.h" #include "BKE_preview_image.hh" #include "BKE_rigidbody.h" -#include "BKE_scene.hh" -#include "BKE_scene_runtime.hh" +#include "BKE_scene.h" #include "BKE_screen.hh" #include "BKE_sound.h" #include "BKE_unit.hh" #include "BKE_workspace.h" +#include "BKE_world.h" #include "DEG_depsgraph.hh" #include "DEG_depsgraph_build.hh" #include "DEG_depsgraph_debug.hh" #include "DEG_depsgraph_query.hh" +#include "DEG_depsgraph_writeback_sync.hh" #include "RE_engine.h" #include "RNA_access.hh" +#include "SEQ_edit.hh" #include "SEQ_iterator.hh" #include "SEQ_sequencer.hh" @@ -107,8 +120,6 @@ #include "bmesh.hh" -using blender::bke::SceneRuntime; - CurveMapping *BKE_sculpt_default_cavity_curve() { @@ -238,8 +249,6 @@ static void scene_init_data(ID *id) scene->master_collection = BKE_collection_master_add(scene); BKE_view_layer_add(scene, DATA_("ViewLayer"), nullptr, VIEWLAYER_ADD_NEW); - - scene->runtime = MEM_new(__func__); } static void scene_copy_markers(Scene *scene_dst, const Scene *scene_src, const int flag) @@ -252,11 +261,7 @@ static void scene_copy_markers(Scene *scene_dst, const Scene *scene_src, const i } } -static void scene_copy_data(Main *bmain, - std::optional owner_library, - ID *id_dst, - const ID *id_src, - const int flag) +static void scene_copy_data(Main *bmain, ID *id_dst, const ID *id_src, const int flag) { Scene *scene_dst = (Scene *)id_dst; const Scene *scene_src = (const Scene *)id_src; @@ -271,11 +276,10 @@ static void scene_copy_data(Main *bmain, /* Master Collection */ if (scene_src->master_collection) { - BKE_id_copy_in_lib(bmain, - owner_library, - reinterpret_cast(scene_src->master_collection), - reinterpret_cast(&scene_dst->master_collection), - flag_private_id_data); + BKE_id_copy_ex(bmain, + (ID *)scene_src->master_collection, + (ID **)&scene_dst->master_collection, + flag_private_id_data); scene_dst->master_collection->owner_id = &scene_dst->id; } @@ -299,11 +303,8 @@ static void scene_copy_data(Main *bmain, BKE_keyingsets_copy(&(scene_dst->keyingsets), &(scene_src->keyingsets)); if (scene_src->nodetree) { - BKE_id_copy_in_lib(bmain, - owner_library, - (ID *)scene_src->nodetree, - (ID **)&scene_dst->nodetree, - flag_private_id_data); + BKE_id_copy_ex( + bmain, (ID *)scene_src->nodetree, (ID **)&scene_dst->nodetree, flag_private_id_data); BKE_libblock_relink_ex(bmain, scene_dst->nodetree, (void *)(&scene_src->id), @@ -368,8 +369,6 @@ static void scene_copy_data(Main *bmain, } BKE_scene_copy_data_eevee(scene_dst, scene_src); - - scene_dst->runtime = MEM_new(__func__); } static void scene_free_markers(Scene *scene, bool do_id_user) @@ -465,8 +464,6 @@ static void scene_free_data(ID *id) /* These are freed on `do_versions`. */ BLI_assert(scene->layer_properties == nullptr); - - MEM_delete(scene->runtime); } static void scene_foreach_rigidbodyworldSceneLooper(RigidBodyWorld * /*rbw*/, @@ -895,7 +892,6 @@ static void scene_foreach_id(ID *id, LibraryForeachIDData *data) LISTBASE_FOREACH (ViewLayer *, view_layer, &scene->view_layers) { BKE_LIB_FOREACHID_PROCESS_IDSUPER(data, view_layer->mat_override, IDWALK_CB_USER); - BKE_LIB_FOREACHID_PROCESS_IDSUPER(data, view_layer->world_override, IDWALK_CB_USER); BKE_LIB_FOREACHID_PROCESS_FUNCTION_CALL( data, IDP_foreach_property(view_layer->id_properties, @@ -1263,8 +1259,6 @@ static void scene_blend_read_data(BlendDataReader *reader, ID *id) /* set users to one by default, not in lib-link, this will increase it for compo nodes */ id_us_ensure_real(&sce->id); - sce->runtime = MEM_new(__func__); - BLO_read_list(reader, &(sce->base)); BLO_read_list(reader, &sce->keyingsets); @@ -1610,10 +1604,6 @@ constexpr IDTypeInfo get_type_info() IDTypeInfo info{}; info.id_code = ID_SCE; info.id_filter = FILTER_ID_SCE; - info.dependencies_id_types = (FILTER_ID_OB | FILTER_ID_WO | FILTER_ID_SCE | FILTER_ID_MC | - FILTER_ID_MA | FILTER_ID_GR | FILTER_ID_TXT | FILTER_ID_LS | - FILTER_ID_MSK | FILTER_ID_SO | FILTER_ID_GD_LEGACY | FILTER_ID_BR | - FILTER_ID_PAL | FILTER_ID_IM | FILTER_ID_NT); info.main_listbase_index = INDEX_ID_SCE; info.struct_size = sizeof(Scene); info.name = "Scene"; @@ -2180,13 +2170,13 @@ int BKE_scene_base_iter_next( if (iter->dupli_refob != *ob) { if (iter->dupli_refob) { /* Restore previous object's real matrix. */ - copy_m4_m4(iter->dupli_refob->runtime->object_to_world.ptr(), iter->omat); + copy_m4_m4(iter->dupli_refob->object_to_world, iter->omat); } /* Backup new object's real matrix. */ iter->dupli_refob = *ob; - copy_m4_m4(iter->omat, iter->dupli_refob->object_to_world().ptr()); + copy_m4_m4(iter->omat, iter->dupli_refob->object_to_world); } - copy_m4_m4((*ob)->runtime->object_to_world.ptr(), iter->dupob->mat); + copy_m4_m4((*ob)->object_to_world, iter->dupob->mat); iter->dupob = iter->dupob->next; } @@ -2196,7 +2186,7 @@ int BKE_scene_base_iter_next( if (iter->dupli_refob) { /* Restore last object's real matrix. */ - copy_m4_m4(iter->dupli_refob->runtime->object_to_world.ptr(), iter->omat); + copy_m4_m4(iter->dupli_refob->object_to_world, iter->omat); iter->dupli_refob = nullptr; } @@ -2278,7 +2268,7 @@ bool BKE_scene_camera_switch_update(Scene *scene) Object *camera = BKE_scene_camera_switch_find(scene); if (camera && (camera != scene->camera)) { scene->camera = camera; - DEG_id_tag_update(&scene->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&scene->id, ID_RECALC_COPY_ON_WRITE); return true; } #else diff --git a/source/blender/blenkernel/intern/screen.cc b/source/blender/blenkernel/intern/screen.cc index caf4bd18473..049de0c1afa 100644 --- a/source/blender/blenkernel/intern/screen.cc +++ b/source/blender/blenkernel/intern/screen.cc @@ -19,28 +19,38 @@ #include "MEM_guardedalloc.h" +#include "DNA_collection_types.h" #include "DNA_defaults.h" +#include "DNA_gpencil_legacy_types.h" +#include "DNA_mask_types.h" #include "DNA_scene_types.h" #include "DNA_screen_types.h" #include "DNA_space_types.h" +#include "DNA_text_types.h" #include "DNA_view3d_types.h" +#include "DNA_workspace_types.h" #include "BLI_ghash.h" #include "BLI_listbase.h" #include "BLI_math_rotation.h" #include "BLI_math_vector.h" +#include "BLI_mempool.h" #include "BLI_rect.h" #include "BLI_string.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" +#include "BKE_gpencil_legacy.h" #include "BKE_idprop.h" #include "BKE_idtype.hh" #include "BKE_lib_id.hh" #include "BKE_lib_query.hh" +#include "BKE_node.h" #include "BKE_preview_image.hh" #include "BKE_screen.hh" +#include "BKE_viewer_path.hh" +#include "BKE_workspace.h" #include "BLO_read_write.hh" @@ -159,9 +169,6 @@ static void screen_blend_read_after_liblink(BlendLibReader *reader, ID *id) IDTypeInfo IDType_ID_SCR = { /*id_code*/ ID_SCR, /*id_filter*/ FILTER_ID_SCR, - /* NOTE: Can actually link to any ID type through UI (e.g. Outliner Editor). - * This is handled separately though. */ - /*dependencies_id_types*/ FILTER_ID_SCE, /*main_listbase_index*/ INDEX_ID_SCR, /*struct_size*/ sizeof(bScreen), /*name*/ "Screen", diff --git a/source/blender/blenkernel/intern/shader_fx.cc b/source/blender/blenkernel/intern/shader_fx.cc index 034f4cffd16..c759590b3cf 100644 --- a/source/blender/blenkernel/intern/shader_fx.cc +++ b/source/blender/blenkernel/intern/shader_fx.cc @@ -11,20 +11,28 @@ #include "MEM_guardedalloc.h" #include "BLI_blenlib.h" +#include "BLI_math_vector.h" #include "BLI_string_utils.hh" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" +#include "DNA_gpencil_legacy_types.h" #include "DNA_object_types.h" +#include "DNA_scene_types.h" #include "DNA_screen_types.h" #include "DNA_shader_fx_types.h" +#include "BKE_gpencil_legacy.h" #include "BKE_lib_id.hh" #include "BKE_lib_query.hh" +#include "BKE_object.hh" #include "BKE_screen.hh" #include "BKE_shader_fx.h" +#include "DEG_depsgraph.hh" +#include "DEG_depsgraph_query.hh" + #include "FX_shader_types.h" #include "BLO_read_write.hh" diff --git a/source/blender/blenkernel/intern/shrinkwrap.cc b/source/blender/blenkernel/intern/shrinkwrap.cc index 56ec41ccbcf..da590a418a4 100644 --- a/source/blender/blenkernel/intern/shrinkwrap.cc +++ b/source/blender/blenkernel/intern/shrinkwrap.cc @@ -15,6 +15,7 @@ #include "DNA_gpencil_modifier_types.h" #include "DNA_mesh_types.h" +#include "DNA_meshdata_types.h" #include "DNA_modifier_types.h" #include "DNA_object_types.h" @@ -26,13 +27,17 @@ #include "BLI_utildefines.h" #include "BKE_DerivedMesh.hh" +#include "BKE_attribute.hh" #include "BKE_cdderivedmesh.h" +#include "BKE_lattice.hh" +#include "BKE_lib_id.hh" #include "BKE_modifier.hh" #include "BKE_shrinkwrap.hh" #include "BKE_deform.hh" #include "BKE_editmesh.hh" #include "BKE_mesh.hh" /* for OMP limits. */ +#include "BKE_mesh_runtime.hh" #include "BKE_mesh_wrapper.hh" #include "BKE_subsurf.hh" @@ -40,7 +45,7 @@ #include "MEM_guardedalloc.h" -#include "BLI_strict_flags.h" /* Keep last. */ +#include "BLI_strict_flags.h" /* for timing... */ #if 0 @@ -1518,56 +1523,6 @@ void shrinkwrapGpencilModifier_deform(ShrinkwrapGpencilModifierData *mmd, } } -void shrinkwrapParams_deform(const ShrinkwrapParams ¶ms, - Object &object, - ShrinkwrapTreeData &tree, - const blender::Span dvert, - const int defgrp_index, - const blender::MutableSpan positions) -{ - using namespace blender::bke; - - ShrinkwrapCalcData calc = NULL_ShrinkwrapCalcData; - /* Convert params struct to use the same struct and function used with meshes. */ - ShrinkwrapModifierData smd; - smd.target = params.target; - smd.auxTarget = params.aux_target; - smd.keepDist = params.keep_distance; - smd.shrinkType = params.shrink_type; - smd.shrinkOpts = params.shrink_options; - smd.shrinkMode = params.shrink_mode; - smd.projLimit = params.projection_limit; - smd.projAxis = params.projection_axis; - - /* Configure Shrinkwrap calc data. */ - calc.smd = &smd; - calc.ob = &object; - calc.numVerts = int(positions.size()); - calc.vertexCos = reinterpret_cast(positions.data()); - calc.dvert = dvert.is_empty() ? nullptr : dvert.data(); - calc.vgroup = defgrp_index; - calc.invert_vgroup = params.invert_vertex_weights; - - BLI_SPACE_TRANSFORM_SETUP(&calc.local2target, &object, params.target); - calc.keepDist = params.keep_distance; - calc.tree = &tree; - - switch (params.shrink_type) { - case MOD_SHRINKWRAP_NEAREST_SURFACE: - case MOD_SHRINKWRAP_TARGET_PROJECT: - TIMEIT_BENCH(shrinkwrap_calc_nearest_surface_point(&calc), gpdeform_surface); - break; - - case MOD_SHRINKWRAP_PROJECT: - TIMEIT_BENCH(shrinkwrap_calc_normal_projection(&calc), gpdeform_project); - break; - - case MOD_SHRINKWRAP_NEAREST_VERTEX: - TIMEIT_BENCH(shrinkwrap_calc_nearest_vertex(&calc), gpdeform_vertex); - break; - } -} - void BKE_shrinkwrap_mesh_nearest_surface_deform(Depsgraph *depsgraph, Scene *scene, Object *ob_source, diff --git a/source/blender/blenkernel/intern/softbody.cc b/source/blender/blenkernel/intern/softbody.cc index 89e9105c77a..c3ffc6c5209 100644 --- a/source/blender/blenkernel/intern/softbody.cc +++ b/source/blender/blenkernel/intern/softbody.cc @@ -50,18 +50,18 @@ #include "BLI_time.h" #include "BLI_utildefines.h" -#include "BKE_collection.hh" +#include "BKE_collection.h" #include "BKE_collision.h" #include "BKE_curve.hh" #include "BKE_customdata.hh" #include "BKE_deform.hh" #include "BKE_effect.h" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_layer.hh" #include "BKE_mesh.hh" #include "BKE_modifier.hh" #include "BKE_pointcache.h" -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "BKE_softbody.h" #include "DEG_depsgraph.hh" @@ -2658,7 +2658,7 @@ static void springs_from_mesh(Object *ob) bp = ob->soft->bpoint; for (a = 0; a < mesh->verts_num; a++, bp++) { copy_v3_v3(bp->origS, positions[a]); - mul_m4_v3(ob->object_to_world().ptr(), bp->origS); + mul_m4_v3(ob->object_to_world, bp->origS); } } /* recalculate spring length for meshes here */ @@ -2821,9 +2821,9 @@ static float globallen(float *v1, float *v2, Object *ob) { float p1[3], p2[3]; copy_v3_v3(p1, v1); - mul_m4_v3(ob->object_to_world().ptr(), p1); + mul_m4_v3(ob->object_to_world, p1); copy_v3_v3(p2, v2); - mul_m4_v3(ob->object_to_world().ptr(), p2); + mul_m4_v3(ob->object_to_world, p2); return len_v3v3(p1, p2); } @@ -3085,13 +3085,13 @@ static void softbody_to_object(Object *ob, float (*vertexCos)[3], int numVerts, SB_estimate_transform(ob, sb->lcom, sb->lrot, sb->lscale); } /* Inverse matrix is not up to date. */ - invert_m4_m4(ob->runtime->world_to_object.ptr(), ob->object_to_world().ptr()); + invert_m4_m4(ob->world_to_object, ob->object_to_world); for (a = 0; a < numVerts; a++, bp++) { copy_v3_v3(vertexCos[a], bp->pos); if (local == 0) { - /* softbody is in global coords, baked optionally not */ - mul_m4_v3(ob->world_to_object().ptr(), vertexCos[a]); + mul_m4_v3(ob->world_to_object, + vertexCos[a]); /* softbody is in global coords, baked optionally not */ } } } @@ -3173,12 +3173,12 @@ void sbFree(Object *ob) return; } - const bool is_orig = (ob->id.tag & LIB_TAG_COPIED_ON_EVAL) == 0; + const bool is_orig = (ob->id.tag & LIB_TAG_COPIED_ON_WRITE) == 0; free_softbody_intern(sb); if (is_orig) { - /* Only free shared data on non-evaluated copies */ + /* Only free shared data on non-CoW copies */ BKE_ptcache_free_list(&sb->shared->ptcaches); sb->shared->pointcache = nullptr; MEM_freeN(sb->shared); @@ -3238,7 +3238,7 @@ static void softbody_update_positions(Object *ob, /* copy the position of the goals at desired end time */ copy_v3_v3(bp->origE, vertexCos[a]); /* vertexCos came from local world, go global */ - mul_m4_v3(ob->object_to_world().ptr(), bp->origE); + mul_m4_v3(ob->object_to_world, bp->origE); /* just to be save give bp->origT a defined value * will be calculated in interpolate_exciter() */ copy_v3_v3(bp->origT, bp->origE); @@ -3295,7 +3295,7 @@ static void softbody_reset(Object *ob, SoftBody *sb, float (*vertexCos)[3], int for (a = 0, bp = sb->bpoint; a < numVerts; a++, bp++) { copy_v3_v3(bp->pos, vertexCos[a]); - mul_m4_v3(ob->object_to_world().ptr(), bp->pos); /* Yep, soft-body is global coords. */ + mul_m4_v3(ob->object_to_world, bp->pos); /* Yep, soft-body is global coords. */ copy_v3_v3(bp->origS, bp->pos); copy_v3_v3(bp->origE, bp->pos); copy_v3_v3(bp->origT, bp->pos); @@ -3357,7 +3357,7 @@ static void softbody_step( float forcetime; double sct, sst; - sst = BLI_time_now_seconds(); + sst = BLI_check_seconds_timer(); /* Integration back in time is possible in theory, but pretty useless here. * So we refuse to do so. Since we do not know anything about 'outside' changes * especially colliders we refuse to go more than 10 frames. @@ -3453,7 +3453,7 @@ static void softbody_step( } loops++; if (sb->solverflags & SBSO_MONITOR) { - sct = BLI_time_now_seconds(); + sct = BLI_check_seconds_timer(); if (sct - sst > 0.5) { printf("%3.0f%% \r", 100.0f * timedone / dtime); } @@ -3494,7 +3494,7 @@ static void softbody_step( } if (sb->solverflags & SBSO_MONITOR) { - sct = BLI_time_now_seconds(); + sct = BLI_check_seconds_timer(); if ((sct - sst > 0.5) || (G.debug & G_DEBUG)) { printf(" solver time %f sec %s\n", sct - sst, ob->id.name); } diff --git a/source/blender/blenkernel/intern/sound.cc b/source/blender/blenkernel/intern/sound.cc index 3753152840b..052a0f0a240 100644 --- a/source/blender/blenkernel/intern/sound.cc +++ b/source/blender/blenkernel/intern/sound.cc @@ -8,16 +8,16 @@ #include #include -#include #include "MEM_guardedalloc.h" #include "BLI_blenlib.h" #include "BLI_iterator.h" #include "BLI_math_rotation.h" +#include "BLI_math_vector.h" #include "BLI_threads.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" /* Allow using deprecated functionality for .blend file I/O. */ #define DNA_DEPRECATED_ALLOW @@ -40,13 +40,14 @@ # include #endif -#include "BKE_bpath.hh" -#include "BKE_global.hh" +#include "BKE_bpath.h" +#include "BKE_global.h" #include "BKE_idtype.hh" #include "BKE_lib_id.hh" #include "BKE_lib_query.hh" #include "BKE_main.hh" #include "BKE_packedFile.h" +#include "BKE_scene.h" #include "BKE_sound.h" #include "DEG_depsgraph.hh" @@ -54,16 +55,13 @@ #include "BLO_read_write.hh" +#include "SEQ_sequencer.hh" #include "SEQ_sound.hh" #include "SEQ_time.hh" static void sound_free_audio(bSound *sound); -static void sound_copy_data(Main * /*bmain*/, - std::optional /*owner_library*/, - ID *id_dst, - const ID *id_src, - const int /*flag*/) +static void sound_copy_data(Main * /*bmain*/, ID *id_dst, const ID *id_src, const int /*flag*/) { bSound *sound_dst = (bSound *)id_dst; const bSound *sound_src = (const bSound *)id_src; @@ -194,7 +192,6 @@ static void sound_blend_read_data(BlendDataReader *reader, ID *id) IDTypeInfo IDType_ID_SO = { /*id_code*/ ID_SO, /*id_filter*/ FILTER_ID_SO, - /*dependencies_id_types*/ 0, /*main_listbase_index*/ INDEX_ID_SO, /*struct_size*/ sizeof(bSound), /*name*/ "Sound", @@ -235,11 +232,11 @@ BLI_INLINE void sound_verify_evaluated_id(const ID *id) * We don't want audio system handles to be allocated on an original data-blocks, and only want * them to be allocated on a data-blocks which are result of dependency graph evaluation. * - * Data-blocks which are covered by a copy-on-evaluation system of dependency graph will have - * LIB_TAG_COPIED_ON_EVAL tag set on them. But if some of data-blocks during its evaluation + * Data-blocks which are covered by a copy-on-write system of dependency graph will have + * LIB_TAG_COPIED_ON_WRITE tag set on them. But if some of data-blocks during its evaluation * decides to re-allocate its nested one (for example, object evaluation could re-allocate mesh * when evaluating modifier stack). Such data-blocks will have - * LIB_TAG_COPIED_ON_EVAL_FINAL_RESULT tag set on them. + * LIB_TAG_COPIED_ON_WRITE_EVAL_RESULT tag set on them. * * Additionally, we also allow data-blocks outside of main database. Those can not be "original" * and could be used as a temporary evaluated result during operations like baking. @@ -247,7 +244,7 @@ BLI_INLINE void sound_verify_evaluated_id(const ID *id) * NOTE: We consider ID evaluated if ANY of those flags is set. We do NOT require ALL of them. */ BLI_assert(id->tag & - (LIB_TAG_COPIED_ON_EVAL | LIB_TAG_COPIED_ON_EVAL_FINAL_RESULT | LIB_TAG_NO_MAIN)); + (LIB_TAG_COPIED_ON_WRITE | LIB_TAG_COPIED_ON_WRITE_EVAL_RESULT | LIB_TAG_NO_MAIN)); } bSound *BKE_sound_new_file(Main *bmain, const char *filepath) @@ -604,8 +601,7 @@ void BKE_sound_load(Main *bmain, bSound *sound) AUD_Device *BKE_sound_mixdown(const Scene *scene, AUD_DeviceSpecs specs, int start, float volume) { sound_verify_evaluated_id(&scene->id); - return AUD_openMixdownDevice( - specs, scene->sound_scene, volume, AUD_RESAMPLE_QUALITY_MEDIUM, start / FPS); + return AUD_openMixdownDevice(specs, scene->sound_scene, volume, start / FPS); } void BKE_sound_create_scene(Scene *scene) @@ -1164,10 +1160,9 @@ static void sound_update_base(Scene *scene, Object *object, void *new_set) AUD_SequenceEntry_setConeAngleInner(strip->speaker_handle, speaker->cone_angle_inner); AUD_SequenceEntry_setConeVolumeOuter(strip->speaker_handle, speaker->cone_volume_outer); - mat4_to_quat(quat, object->object_to_world().ptr()); - blender::float3 location = object->object_to_world().location(); + mat4_to_quat(quat, object->object_to_world); AUD_SequenceEntry_setAnimationData( - strip->speaker_handle, AUD_AP_LOCATION, scene->r.cfra, location, 1); + strip->speaker_handle, AUD_AP_LOCATION, scene->r.cfra, object->object_to_world[3], 1); AUD_SequenceEntry_setAnimationData( strip->speaker_handle, AUD_AP_ORIENTATION, scene->r.cfra, quat, 1); AUD_SequenceEntry_setAnimationData( @@ -1207,9 +1202,9 @@ void BKE_sound_update_scene(Depsgraph *depsgraph, Scene *scene) } if (scene->camera) { - mat4_to_quat(quat, scene->camera->object_to_world().ptr()); - blender::float3 location = scene->camera->object_to_world().location(); - AUD_Sequence_setAnimationData(scene->sound_scene, AUD_AP_LOCATION, scene->r.cfra, location, 1); + mat4_to_quat(quat, scene->camera->object_to_world); + AUD_Sequence_setAnimationData( + scene->sound_scene, AUD_AP_LOCATION, scene->r.cfra, scene->camera->object_to_world[3], 1); AUD_Sequence_setAnimationData(scene->sound_scene, AUD_AP_ORIENTATION, scene->r.cfra, quat, 1); } diff --git a/source/blender/blenkernel/intern/speaker.cc b/source/blender/blenkernel/intern/speaker.cc index 221063267b1..8c78b7b249f 100644 --- a/source/blender/blenkernel/intern/speaker.cc +++ b/source/blender/blenkernel/intern/speaker.cc @@ -7,16 +7,19 @@ */ #include "DNA_defaults.h" +#include "DNA_object_types.h" #include "DNA_sound_types.h" #include "DNA_speaker_types.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" +#include "BKE_anim_data.h" #include "BKE_idtype.hh" #include "BKE_lib_id.hh" #include "BKE_lib_query.hh" +#include "BKE_main.hh" #include "BKE_speaker.h" #include "BLO_read_write.hh" @@ -51,7 +54,6 @@ static void speaker_blend_write(BlendWriter *writer, ID *id, const void *id_addr IDTypeInfo IDType_ID_SPK = { /*id_code*/ ID_SPK, /*id_filter*/ FILTER_ID_SPK, - /*dependencies_id_types*/ FILTER_ID_SO, /*main_listbase_index*/ INDEX_ID_SPK, /*struct_size*/ sizeof(Speaker), /*name*/ "Speaker", diff --git a/source/blender/blenkernel/intern/studiolight.cc b/source/blender/blenkernel/intern/studiolight.cc index dea89c741a2..d9c8705a99a 100644 --- a/source/blender/blenkernel/intern/studiolight.cc +++ b/source/blender/blenkernel/intern/studiolight.cc @@ -17,9 +17,11 @@ #include "BLI_linklist.h" #include "BLI_listbase.h" #include "BLI_math_color.h" +#include "BLI_math_matrix.h" #include "BLI_math_vector.h" #include "BLI_path_util.h" #include "BLI_string.h" +#include "BLI_string_utils.hh" #include "DNA_listBase.h" @@ -504,7 +506,7 @@ BLI_INLINE float area_element(float x, float y) static float brdf_approx(float spec_color, float roughness, float NV) { - /* Very rough approximation. We don't need it to be correct, just fast. + /* Very rough own approx. We don't need it to be correct, just fast. * Just simulate fresnel effect with roughness attenuation. */ float fresnel = exp2(-8.35f * NV) * (1.0f - roughness); return spec_color * (1.0f - fresnel) + fresnel; diff --git a/source/blender/blenkernel/intern/subdiv.cc b/source/blender/blenkernel/intern/subdiv.cc index c9c931144c1..9cf77debbfb 100644 --- a/source/blender/blenkernel/intern/subdiv.cc +++ b/source/blender/blenkernel/intern/subdiv.cc @@ -13,6 +13,7 @@ #include "BLI_utildefines.h" +#include "BKE_modifier.hh" #include "BKE_subdiv_modifier.hh" #include "MEM_guardedalloc.h" diff --git a/source/blender/blenkernel/intern/subdiv_ccg.cc b/source/blender/blenkernel/intern/subdiv_ccg.cc index a1c4a061a60..0d3fab20c03 100644 --- a/source/blender/blenkernel/intern/subdiv_ccg.cc +++ b/source/blender/blenkernel/intern/subdiv_ccg.cc @@ -21,6 +21,7 @@ #include "BKE_DerivedMesh.hh" #include "BKE_ccg.h" +#include "BKE_global.h" #include "BKE_mesh.hh" #include "BKE_subdiv.hh" #include "BKE_subdiv_eval.hh" @@ -563,11 +564,11 @@ CCGKey BKE_subdiv_ccg_key_top_level(const SubdivCCG &subdiv_ccg) static void subdiv_ccg_recalc_inner_face_normals(SubdivCCG &subdiv_ccg, const CCGKey &key, MutableSpan face_normals, - const int corner) + const int grid_index) { const int grid_size = subdiv_ccg.grid_size; const int grid_size_1 = grid_size - 1; - CCGElem *grid = subdiv_ccg.grids[corner]; + CCGElem *grid = subdiv_ccg.grids[grid_index]; for (int y = 0; y < grid_size - 1; y++) { for (int x = 0; x < grid_size - 1; x++) { CCGElem *grid_elements[4] = { @@ -593,11 +594,11 @@ static void subdiv_ccg_recalc_inner_face_normals(SubdivCCG &subdiv_ccg, static void subdiv_ccg_average_inner_face_normals(SubdivCCG &subdiv_ccg, const CCGKey &key, const Span face_normals, - const int corner) + const int grid_index) { const int grid_size = subdiv_ccg.grid_size; const int grid_size_1 = grid_size - 1; - CCGElem *grid = subdiv_ccg.grids[corner]; + CCGElem *grid = subdiv_ccg.grids[grid_index]; for (int y = 0; y < grid_size; y++) { for (int x = 0; x < grid_size; x++) { float normal_acc[3] = {0.0f, 0.0f, 0.0f}; @@ -642,7 +643,7 @@ static void subdiv_ccg_recalc_inner_grid_normals(SubdivCCG &subdiv_ccg, const In MutableSpan face_normals = face_normals_tls.local(); for (const int face_index : segment) { const IndexRange face = faces[face_index]; - for (const int grid_index : face) { + for (const int grid_index : IndexRange(face.start(), face.size())) { subdiv_ccg_recalc_inner_face_normals(subdiv_ccg, key, face_normals, grid_index); subdiv_ccg_average_inner_face_normals(subdiv_ccg, key, face_normals, grid_index); } diff --git a/source/blender/blenkernel/intern/subdiv_ccg_mask.cc b/source/blender/blenkernel/intern/subdiv_ccg_mask.cc index 2e24f52bf82..2f7492d3bd8 100644 --- a/source/blender/blenkernel/intern/subdiv_ccg_mask.cc +++ b/source/blender/blenkernel/intern/subdiv_ccg_mask.cc @@ -12,10 +12,13 @@ #include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" +#include "DNA_modifier_types.h" +#include "DNA_object_types.h" #include "BLI_utildefines.h" #include "BKE_customdata.hh" +#include "BKE_mesh.hh" #include "BKE_subdiv.hh" #include "MEM_guardedalloc.h" diff --git a/source/blender/blenkernel/intern/subdiv_converter.cc b/source/blender/blenkernel/intern/subdiv_converter.cc index 3b741da46ab..202c1c0153a 100644 --- a/source/blender/blenkernel/intern/subdiv_converter.cc +++ b/source/blender/blenkernel/intern/subdiv_converter.cc @@ -8,6 +8,8 @@ #include "subdiv_converter.hh" +#include "BLI_utildefines.h" + #include "opensubdiv_converter_capi.hh" void BKE_subdiv_converter_free(OpenSubdiv_Converter *converter) diff --git a/source/blender/blenkernel/intern/subdiv_converter_mesh.cc b/source/blender/blenkernel/intern/subdiv_converter_mesh.cc index cb90d77a65b..45df57e8e9d 100644 --- a/source/blender/blenkernel/intern/subdiv_converter_mesh.cc +++ b/source/blender/blenkernel/intern/subdiv_converter_mesh.cc @@ -20,8 +20,11 @@ #include "MEM_guardedalloc.h" +#include "opensubdiv_capi.hh" #include "opensubdiv_converter_capi.hh" +#include "bmesh_class.hh" + /* Enable work-around for non-working CPU evaluator when using bilinear scheme. * This forces Catmark scheme with all edges marked as infinitely sharp. */ #define BUGGY_SIMPLE_SCHEME_WORKAROUND 1 diff --git a/source/blender/blenkernel/intern/subdiv_displacement.cc b/source/blender/blenkernel/intern/subdiv_displacement.cc index f45ac7b5faf..e62b402f992 100644 --- a/source/blender/blenkernel/intern/subdiv_displacement.cc +++ b/source/blender/blenkernel/intern/subdiv_displacement.cc @@ -8,6 +8,8 @@ #include "BKE_subdiv.hh" +#include "BLI_utildefines.h" + #include "MEM_guardedalloc.h" void BKE_subdiv_displacement_detach(Subdiv *subdiv) diff --git a/source/blender/blenkernel/intern/subdiv_displacement_multires.cc b/source/blender/blenkernel/intern/subdiv_displacement_multires.cc index 3054dbcd28f..8037991ee56 100644 --- a/source/blender/blenkernel/intern/subdiv_displacement_multires.cc +++ b/source/blender/blenkernel/intern/subdiv_displacement_multires.cc @@ -13,6 +13,7 @@ #include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" #include "DNA_modifier_types.h" +#include "DNA_object_types.h" #include "BLI_math_matrix.h" #include "BLI_math_vector.h" diff --git a/source/blender/blenkernel/intern/subdiv_eval.cc b/source/blender/blenkernel/intern/subdiv_eval.cc index c654dba2654..e95ec7e18d9 100644 --- a/source/blender/blenkernel/intern/subdiv_eval.cc +++ b/source/blender/blenkernel/intern/subdiv_eval.cc @@ -10,6 +10,7 @@ #include "BLI_math_vector.h" #include "BLI_task.h" +#include "BLI_timeit.hh" #include "BLI_utildefines.h" #include "BKE_customdata.hh" diff --git a/source/blender/blenkernel/intern/subdiv_foreach.cc b/source/blender/blenkernel/intern/subdiv_foreach.cc index f6938a83980..4f2d90086a4 100644 --- a/source/blender/blenkernel/intern/subdiv_foreach.cc +++ b/source/blender/blenkernel/intern/subdiv_foreach.cc @@ -10,10 +10,13 @@ #include "atomic_ops.h" +#include "DNA_key_types.h" + #include "BLI_bitmap.h" #include "BLI_task.h" #include "BKE_customdata.hh" +#include "BKE_key.hh" #include "BKE_mesh.hh" #include "BKE_subdiv.hh" #include "BKE_subdiv_mesh.hh" diff --git a/source/blender/blenkernel/intern/subdiv_mesh.cc b/source/blender/blenkernel/intern/subdiv_mesh.cc index 1852a2f9584..7740ee0eb5c 100644 --- a/source/blender/blenkernel/intern/subdiv_mesh.cc +++ b/source/blender/blenkernel/intern/subdiv_mesh.cc @@ -8,10 +8,13 @@ #include +#include "atomic_ops.h" + #include "DNA_key_types.h" #include "DNA_mesh_types.h" #include "BLI_array.hh" +#include "BLI_bitmap.h" #include "BLI_math_vector.h" #include "BLI_math_vector_types.hh" #include "BLI_task.hh" diff --git a/source/blender/blenkernel/intern/subdiv_modifier.cc b/source/blender/blenkernel/intern/subdiv_modifier.cc index a513b39718f..5e9ef6919fd 100644 --- a/source/blender/blenkernel/intern/subdiv_modifier.cc +++ b/source/blender/blenkernel/intern/subdiv_modifier.cc @@ -2,6 +2,7 @@ * * SPDX-License-Identifier: GPL-2.0-or-later */ +#include "BKE_attribute.hh" #include "BKE_subdiv_modifier.hh" #include "MEM_guardedalloc.h" @@ -9,6 +10,7 @@ #include "DNA_mesh_types.h" #include "DNA_modifier_types.h" #include "DNA_object_types.h" +#include "DNA_scene_types.h" #include "DNA_userdef_types.h" #include "BKE_customdata.hh" @@ -19,6 +21,8 @@ #include "GPU_capabilities.h" #include "GPU_context.h" +#include "opensubdiv_capi.hh" + SubdivSettings BKE_subsurf_modifier_settings_init(const SubsurfModifierData *smd, const bool use_render_params) { diff --git a/source/blender/blenkernel/intern/subdiv_stats.cc b/source/blender/blenkernel/intern/subdiv_stats.cc index 8986c855c4f..1aa58661f2d 100644 --- a/source/blender/blenkernel/intern/subdiv_stats.cc +++ b/source/blender/blenkernel/intern/subdiv_stats.cc @@ -26,12 +26,12 @@ void BKE_subdiv_stats_init(SubdivStats *stats) void BKE_subdiv_stats_begin(SubdivStats *stats, eSubdivStatsValue value) { - stats->begin_timestamp_[value] = BLI_time_now_seconds(); + stats->begin_timestamp_[value] = BLI_check_seconds_timer(); } void BKE_subdiv_stats_end(SubdivStats *stats, eSubdivStatsValue value) { - stats->values_[value] = BLI_time_now_seconds() - stats->begin_timestamp_[value]; + stats->values_[value] = BLI_check_seconds_timer() - stats->begin_timestamp_[value]; } void BKE_subdiv_stats_reset(SubdivStats *stats, eSubdivStatsValue value) diff --git a/source/blender/blenkernel/intern/subsurf_ccg.cc b/source/blender/blenkernel/intern/subsurf_ccg.cc index c738d7aeb71..67c11e5cac9 100644 --- a/source/blender/blenkernel/intern/subsurf_ccg.cc +++ b/source/blender/blenkernel/intern/subsurf_ccg.cc @@ -23,6 +23,7 @@ #include "DNA_scene_types.h" #include "BLI_bitmap.h" +#include "BLI_blenlib.h" #include "BLI_memarena.h" #include "BLI_ordered_edge.hh" #include "BLI_set.hh" @@ -34,9 +35,13 @@ #include "BKE_ccg.h" #include "BKE_cdderivedmesh.h" #include "BKE_customdata.hh" +#include "BKE_mesh.hh" #include "BKE_mesh_mapping.hh" +#include "BKE_modifier.hh" #include "BKE_multires.hh" -#include "BKE_scene.hh" +#include "BKE_object.hh" +#include "BKE_paint.hh" +#include "BKE_scene.h" #include "BKE_subsurf.hh" #include "CCGSubSurf.h" @@ -815,13 +820,13 @@ static void ccgDM_copyFinalVertArray(DerivedMesh *dm, float (*r_positions)[3]) } /* utility function */ -BLI_INLINE void ccgDM_to_MEdge(blender::int2 *edge, const int v1, const int v2) +BLI_INLINE void ccgDM_to_MEdge(vec2i *edge, const int v1, const int v2) { edge->x = v1; edge->y = v2; } -static void ccgDM_copyFinalEdgeArray(DerivedMesh *dm, blender::int2 *edges) +static void ccgDM_copyFinalEdgeArray(DerivedMesh *dm, vec2i *edges) { CCGDerivedMesh *ccgdm = (CCGDerivedMesh *)dm; CCGSubSurf *ss = ccgdm->ss; @@ -1292,6 +1297,14 @@ static void ccgDM_getGridKey(DerivedMesh *dm, CCGKey *key) CCG_key_top_level(key, ccgdm->ss); } +static BLI_bitmap **ccgDM_getGridHidden(DerivedMesh *dm) +{ + CCGDerivedMesh *ccgdm = (CCGDerivedMesh *)dm; + + ccgdm_create_grids(dm); + return ccgdm->gridHidden; +} + static void set_default_ccgdm_callbacks(CCGDerivedMesh *ccgdm) { ccgdm->dm.getNumVerts = ccgDM_getNumVerts; @@ -1313,6 +1326,7 @@ static void set_default_ccgdm_callbacks(CCGDerivedMesh *ccgdm) ccgdm->dm.getGridData = ccgDM_getGridData; ccgdm->dm.getGridOffset = ccgDM_getGridOffset; ccgdm->dm.getGridKey = ccgDM_getGridKey; + ccgdm->dm.getGridHidden = ccgDM_getGridHidden; ccgdm->dm.release = ccgDM_release; } diff --git a/source/blender/blenkernel/intern/text.cc b/source/blender/blenkernel/intern/text.cc index 3e53bdcefda..7d9f64af2ae 100644 --- a/source/blender/blenkernel/intern/text.cc +++ b/source/blender/blenkernel/intern/text.cc @@ -9,7 +9,6 @@ #include /* abort */ #include /* strstr */ #include -#include #include #include @@ -23,16 +22,23 @@ #include "BLI_string_utf8.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" +#include "DNA_constraint_types.h" +#include "DNA_material_types.h" +#include "DNA_node_types.h" +#include "DNA_object_types.h" +#include "DNA_scene_types.h" #include "DNA_screen_types.h" +#include "DNA_space_types.h" #include "DNA_text_types.h" #include "DNA_userdef_types.h" -#include "BKE_bpath.hh" +#include "BKE_bpath.h" #include "BKE_idtype.hh" #include "BKE_lib_id.hh" #include "BKE_main.hh" +#include "BKE_node.h" #include "BKE_text.h" #include "BLO_read_write.hh" @@ -102,11 +108,7 @@ static void text_init_data(ID *id) * * \param flag: Copying options (see BKE_lib_id.hh's LIB_ID_COPY_... flags for more). */ -static void text_copy_data(Main * /*bmain*/, - std::optional /*owner_library*/, - ID *id_dst, - const ID *id_src, - const int /*flag*/) +static void text_copy_data(Main * /*bmain*/, ID *id_dst, const ID *id_src, const int /*flag*/) { Text *text_dst = (Text *)id_dst; const Text *text_src = (Text *)id_src; @@ -227,7 +229,6 @@ static void text_blend_read_data(BlendDataReader *reader, ID *id) IDTypeInfo IDType_ID_TXT = { /*id_code*/ ID_TXT, /*id_filter*/ FILTER_ID_TXT, - /*dependencies_id_types*/ 0, /*main_listbase_index*/ INDEX_ID_TXT, /*struct_size*/ sizeof(Text), /*name*/ "Text", diff --git a/source/blender/blenkernel/intern/text_suggestions.cc b/source/blender/blenkernel/intern/text_suggestions.cc index f53ae8d2da8..fc0dc7f366a 100644 --- a/source/blender/blenkernel/intern/text_suggestions.cc +++ b/source/blender/blenkernel/intern/text_suggestions.cc @@ -16,6 +16,7 @@ #include "BLI_string.h" #include "BKE_text_suggestions.h" /* Own include. */ +#include "DNA_text_types.h" /**********************/ /* Static definitions */ diff --git a/source/blender/blenkernel/intern/texture.cc b/source/blender/blenkernel/intern/texture.cc index a28b566d636..ca2876a6fe0 100644 --- a/source/blender/blenkernel/intern/texture.cc +++ b/source/blender/blenkernel/intern/texture.cc @@ -10,7 +10,6 @@ #include #include #include -#include #include "MEM_guardedalloc.h" @@ -22,7 +21,7 @@ #include "BLI_math_vector.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" /* Allow using deprecated functionality for .blend file I/O. */ #define DNA_DEPRECATED_ALLOW @@ -30,21 +29,31 @@ #include "DNA_brush_types.h" #include "DNA_color_types.h" #include "DNA_defaults.h" +#include "DNA_key_types.h" #include "DNA_linestyle_types.h" #include "DNA_material_types.h" #include "DNA_node_types.h" #include "DNA_object_types.h" #include "DNA_particle_types.h" +#include "IMB_imbuf.hh" + +#include "BKE_main.hh" + +#include "BKE_anim_data.h" #include "BKE_colorband.hh" #include "BKE_colortools.hh" #include "BKE_icons.h" #include "BKE_idtype.hh" #include "BKE_image.h" +#include "BKE_key.hh" #include "BKE_lib_id.hh" #include "BKE_lib_query.hh" +#include "BKE_material.h" +#include "BKE_node.hh" #include "BKE_node_runtime.hh" #include "BKE_preview_image.hh" +#include "BKE_scene.h" #include "BKE_texture.h" #include "NOD_texture.h" @@ -66,11 +75,7 @@ static void texture_init_data(ID *id) BKE_imageuser_default(&texture->iuser); } -static void texture_copy_data(Main *bmain, - std::optional owner_library, - ID *id_dst, - const ID *id_src, - const int flag) +static void texture_copy_data(Main *bmain, ID *id_dst, const ID *id_src, const int flag) { Tex *texture_dst = (Tex *)id_dst; const Tex *texture_src = (const Tex *)id_src; @@ -95,11 +100,8 @@ static void texture_copy_data(Main *bmain, texture_dst->nodetree = ntreeLocalize(texture_src->nodetree); } else { - BKE_id_copy_in_lib(bmain, - owner_library, - (ID *)texture_src->nodetree, - (ID **)&texture_dst->nodetree, - flag_private_id_data); + BKE_id_copy_ex( + bmain, (ID *)texture_src->nodetree, (ID **)&texture_dst->nodetree, flag_private_id_data); } texture_dst->nodetree->owner_id = &texture_dst->id; } @@ -196,7 +198,6 @@ static void texture_blend_read_data(BlendDataReader *reader, ID *id) IDTypeInfo IDType_ID_TE = { /*id_code*/ ID_TE, /*id_filter*/ FILTER_ID_TE, - /*dependencies_id_types*/ FILTER_ID_IM | FILTER_ID_OB, /*main_listbase_index*/ INDEX_ID_TE, /*struct_size*/ sizeof(Tex), /*name*/ "Texture", diff --git a/source/blender/blenkernel/intern/tracking.cc b/source/blender/blenkernel/intern/tracking.cc index 4564041ea4a..c74cee34160 100644 --- a/source/blender/blenkernel/intern/tracking.cc +++ b/source/blender/blenkernel/intern/tracking.cc @@ -36,14 +36,14 @@ #include "BLI_threads.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" -#include "BKE_fcurve.hh" +#include "BKE_fcurve.h" #include "BKE_layer.hh" #include "BKE_lib_id.hh" #include "BKE_movieclip.h" #include "BKE_object.hh" -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "BKE_tracking.h" #include "IMB_imbuf.hh" @@ -55,9 +55,6 @@ #include "libmv-capi.h" #include "tracking_private.h" -using blender::Array; -using blender::int2; - struct MovieDistortion { libmv_CameraIntrinsics *intrinsics; /* Parameters needed for coordinates normalization. */ @@ -1118,14 +1115,23 @@ static void track_mask_gpencil_layer_rasterize(const int frame_width, while (stroke) { const bGPDspoint *stroke_points = stroke->points; if (stroke->flag & GP_STROKE_2DSPACE) { - Array mask_points(stroke->totpoints); - for (const int i : mask_points.index_range()) { - mask_points[i][0] = stroke_points[i].x * frame_width - region_min[0]; - mask_points[i][1] = stroke_points[i].y * frame_height - region_min[1]; + int *mask_points, *point; + point = mask_points = MEM_cnew_array(2 * stroke->totpoints, + "track mask rasterization points"); + for (int i = 0; i < stroke->totpoints; i++, point += 2) { + point[0] = stroke_points[i].x * frame_width - region_min[0]; + point[1] = stroke_points[i].y * frame_height - region_min[1]; } /* TODO: add an option to control whether AA is enabled or not */ - BLI_bitmap_draw_2d_poly_v2i_n( - 0, 0, mask_width, mask_height, mask_points, track_mask_set_pixel_cb, &data); + BLI_bitmap_draw_2d_poly_v2i_n(0, + 0, + mask_width, + mask_height, + (const int(*)[2])mask_points, + stroke->totpoints, + track_mask_set_pixel_cb, + &data); + MEM_freeN(mask_points); } stroke = stroke->next; } diff --git a/source/blender/blenkernel/intern/tracking_auto.cc b/source/blender/blenkernel/intern/tracking_auto.cc index ab9f294e4fe..d8513a9b298 100644 --- a/source/blender/blenkernel/intern/tracking_auto.cc +++ b/source/blender/blenkernel/intern/tracking_auto.cc @@ -6,6 +6,7 @@ * \ingroup bke */ +#include "atomic_ops.h" #include #include "MEM_guardedalloc.h" @@ -17,8 +18,10 @@ #include "BLI_math_vector.h" #include "BLI_task.h" #include "BLI_threads.h" +#include "BLI_time.h" #include "BLI_utildefines.h" +#include "BKE_global.h" #include "BKE_movieclip.h" #include "BKE_tracking.h" diff --git a/source/blender/blenkernel/intern/tracking_solver.cc b/source/blender/blenkernel/intern/tracking_solver.cc index aa6239872b0..cd8fd0e0635 100644 --- a/source/blender/blenkernel/intern/tracking_solver.cc +++ b/source/blender/blenkernel/intern/tracking_solver.cc @@ -12,6 +12,7 @@ #include "MEM_guardedalloc.h" +#include "DNA_anim_types.h" #include "DNA_movieclip_types.h" #include "BLI_listbase.h" @@ -20,12 +21,13 @@ #include "BLI_string.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" -#include "BKE_fcurve.hh" +#include "BKE_fcurve.h" #include "BKE_movieclip.h" #include "BKE_tracking.h" +#include "RNA_access.hh" #include "RNA_prototypes.h" #include "libmv-capi.h" diff --git a/source/blender/blenkernel/intern/tracking_stabilize.cc b/source/blender/blenkernel/intern/tracking_stabilize.cc index 9b5b03cc67a..bf99d21b8f1 100644 --- a/source/blender/blenkernel/intern/tracking_stabilize.cc +++ b/source/blender/blenkernel/intern/tracking_stabilize.cc @@ -10,8 +10,10 @@ #include +#include "DNA_anim_types.h" #include "DNA_movieclip_types.h" #include "DNA_scene_types.h" +#include "RNA_access.hh" #include "RNA_prototypes.h" #include "BLI_ghash.h" @@ -23,7 +25,7 @@ #include "BLI_task.h" #include "BLI_utildefines.h" -#include "BKE_fcurve.hh" +#include "BKE_fcurve.h" #include "BKE_movieclip.h" #include "BKE_tracking.h" diff --git a/source/blender/blenkernel/intern/tracking_util.cc b/source/blender/blenkernel/intern/tracking_util.cc index 142324c1442..d6baaa5b2c9 100644 --- a/source/blender/blenkernel/intern/tracking_util.cc +++ b/source/blender/blenkernel/intern/tracking_util.cc @@ -24,13 +24,14 @@ #include "BLI_threads.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_movieclip.h" #include "BKE_tracking.h" #include "IMB_imbuf.hh" #include "IMB_imbuf_types.hh" +#include "IMB_moviecache.hh" #include "tracking_private.h" diff --git a/source/blender/blenkernel/intern/type_conversions.cc b/source/blender/blenkernel/intern/type_conversions.cc index 1e36204ee3a..f42844c62a7 100644 --- a/source/blender/blenkernel/intern/type_conversions.cc +++ b/source/blender/blenkernel/intern/type_conversions.cc @@ -349,21 +349,11 @@ static ColorGeometry4f byte_color_to_color(const ColorGeometry4b &a) return a.decode(); } -static math::Quaternion float4x4_to_quaternion(const float4x4 &a) -{ - return math::to_quaternion(a); -} - static float3 quaternion_to_float3(const math::Quaternion &a) { return float3(math::to_euler(a).xyz()); } -static float4x4 quaternion_to_float4x4(const math::Quaternion &a) -{ - return math::from_rotation(a); -} - static DataTypeConversions create_implicit_conversions() { DataTypeConversions conversions; @@ -451,10 +441,7 @@ static DataTypeConversions create_implicit_conversions() add_implicit_conversion(conversions); add_implicit_conversion(conversions); - add_implicit_conversion(conversions); - add_implicit_conversion(conversions); - add_implicit_conversion(conversions); return conversions; } diff --git a/source/blender/blenkernel/intern/undo_system.cc b/source/blender/blenkernel/intern/undo_system.cc index 700a75d717b..4f94810a5b8 100644 --- a/source/blender/blenkernel/intern/undo_system.cc +++ b/source/blender/blenkernel/intern/undo_system.cc @@ -18,13 +18,13 @@ #include "BLI_sys_types.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_listBase.h" #include "DNA_windowmanager_types.h" #include "BKE_context.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_lib_override.hh" #include "BKE_main.hh" #include "BKE_undo_system.hh" diff --git a/source/blender/blenkernel/intern/vfont.cc b/source/blender/blenkernel/intern/vfont.cc index 06b920300a0..27639f1797a 100644 --- a/source/blender/blenkernel/intern/vfont.cc +++ b/source/blender/blenkernel/intern/vfont.cc @@ -12,7 +12,6 @@ #include #include #include -#include #include "CLG_log.h" @@ -30,7 +29,7 @@ #include "BLI_threads.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_curve_types.h" #include "DNA_object_types.h" @@ -38,9 +37,9 @@ #include "DNA_vfont_types.h" #include "BKE_anim_path.h" -#include "BKE_bpath.hh" +#include "BKE_bpath.h" #include "BKE_curve.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_idtype.hh" #include "BKE_lib_id.hh" #include "BKE_main.hh" @@ -83,11 +82,7 @@ static void vfont_init_data(ID *id) } } -static void vfont_copy_data(Main * /*bmain*/, - std::optional /*owner_library*/, - ID *id_dst, - const ID * /*id_src*/, - const int flag) +static void vfont_copy_data(Main * /*bmain*/, ID *id_dst, const ID * /*id_src*/, const int flag) { VFont *vfont_dst = (VFont *)id_dst; @@ -168,7 +163,6 @@ static void vfont_blend_read_data(BlendDataReader *reader, ID *id) IDTypeInfo IDType_ID_VF = { /*id_code*/ ID_VF, /*id_filter*/ FILTER_ID_VF, - /*dependencies_id_types*/ 0, /*main_listbase_index*/ INDEX_ID_VF, /*struct_size*/ sizeof(VFont), /*name*/ "Font", @@ -1429,14 +1423,14 @@ static bool vfont_to_curve(Object *ob, float timeofs, sizefac; if (ob != nullptr) { - invert_m4_m4(imat, ob->object_to_world().ptr()); + invert_m4_m4(imat, ob->object_to_world); } else { unit_m4(imat); } copy_m3_m4(imat3, imat); - copy_m3_m4(cmat, cu->textoncurve->object_to_world().ptr()); + copy_m3_m4(cmat, cu->textoncurve->object_to_world); mul_m3_m3m3(cmat, cmat, imat3); sizefac = normalize_v3(cmat[0]) / font_size; diff --git a/source/blender/blenkernel/intern/viewer_path.cc b/source/blender/blenkernel/intern/viewer_path.cc index 01f9b268ca7..b94c15063e9 100644 --- a/source/blender/blenkernel/intern/viewer_path.cc +++ b/source/blender/blenkernel/intern/viewer_path.cc @@ -142,14 +142,13 @@ void BKE_viewer_path_foreach_id(LibraryForeachIDData *data, ViewerPath *viewer_p } } -void BKE_viewer_path_id_remap(ViewerPath *viewer_path, - const blender::bke::id::IDRemapper &mappings) +void BKE_viewer_path_id_remap(ViewerPath *viewer_path, const IDRemapper *mappings) { LISTBASE_FOREACH (ViewerPathElem *, elem, &viewer_path->path) { switch (ViewerPathElemType(elem->type)) { case VIEWER_PATH_ELEM_TYPE_ID: { auto *typed_elem = reinterpret_cast(elem); - mappings.apply(&typed_elem->id, ID_REMAP_APPLY_DEFAULT); + BKE_id_remapper_apply(mappings, &typed_elem->id, ID_REMAP_APPLY_DEFAULT); break; } case VIEWER_PATH_ELEM_TYPE_MODIFIER: diff --git a/source/blender/blenkernel/intern/volume.cc b/source/blender/blenkernel/intern/volume.cc index 5b3ace72759..c8ef524ead8 100644 --- a/source/blender/blenkernel/intern/volume.cc +++ b/source/blender/blenkernel/intern/volume.cc @@ -6,8 +6,6 @@ * \ingroup bke */ -#include - #include "MEM_guardedalloc.h" #include "DNA_defaults.h" @@ -31,11 +29,11 @@ #include "BLI_task.hh" #include "BLI_utildefines.h" -#include "BKE_anim_data.hh" +#include "BKE_anim_data.h" #include "BKE_bake_data_block_id.hh" -#include "BKE_bpath.hh" +#include "BKE_bpath.h" #include "BKE_geometry_set.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_idtype.hh" #include "BKE_lib_id.hh" #include "BKE_lib_query.hh" @@ -45,14 +43,14 @@ #include "BKE_object.hh" #include "BKE_object_types.hh" #include "BKE_packedFile.h" -#include "BKE_report.hh" -#include "BKE_scene.hh" +#include "BKE_report.h" +#include "BKE_scene.h" #include "BKE_volume.hh" #include "BKE_volume_grid.hh" #include "BKE_volume_grid_file_cache.hh" #include "BKE_volume_openvdb.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DEG_depsgraph_query.hh" @@ -150,11 +148,7 @@ static void volume_init_data(ID *id) STRNCPY(volume->velocity_grid, "velocity"); } -static void volume_copy_data(Main * /*bmain*/, - std::optional /*owner_library*/, - ID *id_dst, - const ID *id_src, - const int /*flag*/) +static void volume_copy_data(Main * /*bmain*/, ID *id_dst, const ID *id_src, const int /*flag*/) { Volume *volume_dst = (Volume *)id_dst; const Volume *volume_src = (const Volume *)id_src; @@ -279,7 +273,6 @@ static void volume_blend_read_after_liblink(BlendLibReader * /*reader*/, ID *id) IDTypeInfo IDType_ID_VO = { /*id_code*/ ID_VO, /*id_filter*/ FILTER_ID_VO, - /*dependencies_id_types*/ FILTER_ID_MA, /*main_listbase_index*/ INDEX_ID_VO, /*struct_size*/ sizeof(Volume), /*name*/ "Volume", @@ -783,19 +776,19 @@ void BKE_volume_grids_backup_restore(Volume *volume, VolumeGridVector *grids, co #ifdef WITH_OPENVDB /* Restore grids after datablock was re-copied from original by depsgraph, * we don't want to load them again if possible. */ - BLI_assert(volume->id.tag & LIB_TAG_COPIED_ON_EVAL); + BLI_assert(volume->id.tag & LIB_TAG_COPIED_ON_WRITE); BLI_assert(volume->runtime->grids != nullptr && grids != nullptr); if (!grids->is_loaded()) { - /* No grids loaded in evaluated datablock, nothing lost by discarding. */ + /* No grids loaded in CoW datablock, nothing lost by discarding. */ MEM_delete(grids); } else if (!STREQ(volume->filepath, filepath)) { - /* Filepath changed, discard grids from evaluated datablock. */ + /* Filepath changed, discard grids from CoW datablock. */ MEM_delete(grids); } else { - /* Keep grids from evaluated datablock. We might still unload them a little + /* Keep grids from CoW datablock. We might still unload them a little * later in BKE_volume_eval_geometry if the frame changes. */ MEM_delete(volume->runtime->grids); volume->runtime->grids = grids; diff --git a/source/blender/blenkernel/intern/volume_render.cc b/source/blender/blenkernel/intern/volume_render.cc index 7b5f29b8d74..f4fbfb2e4ce 100644 --- a/source/blender/blenkernel/intern/volume_render.cc +++ b/source/blender/blenkernel/intern/volume_render.cc @@ -16,6 +16,7 @@ #include "DNA_volume_types.h" +#include "BKE_volume.hh" #include "BKE_volume_grid.hh" #include "BKE_volume_openvdb.hh" #include "BKE_volume_render.hh" diff --git a/source/blender/blenkernel/intern/volume_to_mesh.cc b/source/blender/blenkernel/intern/volume_to_mesh.cc index 7eeec20da59..4bc83392dd8 100644 --- a/source/blender/blenkernel/intern/volume_to_mesh.cc +++ b/source/blender/blenkernel/intern/volume_to_mesh.cc @@ -8,7 +8,10 @@ #include "BLI_span.hh" #include "BLI_utildefines.h" +#include "DNA_volume_types.h" + #include "BKE_mesh.hh" +#include "BKE_volume.hh" #include "BKE_volume_grid.hh" #include "BKE_volume_openvdb.hh" @@ -184,13 +187,6 @@ Mesh *volume_to_mesh(const openvdb::GridBase &grid, return mesh; } -Mesh *volume_grid_to_mesh(const openvdb::GridBase &grid, - const float threshold, - const float adaptivity) -{ - return volume_to_mesh(grid, {VOLUME_TO_MESH_RESOLUTION_MODE_GRID}, threshold, adaptivity); -} - #endif /* WITH_OPENVDB */ } // namespace blender::bke diff --git a/source/blender/blenkernel/intern/wm_runtime.cc b/source/blender/blenkernel/intern/wm_runtime.cc deleted file mode 100644 index 7062527ae5c..00000000000 --- a/source/blender/blenkernel/intern/wm_runtime.cc +++ /dev/null @@ -1,24 +0,0 @@ -/* SPDX-FileCopyrightText: 2024 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup bke - */ - -#include "BKE_report.hh" -#include "BKE_wm_runtime.hh" - -namespace blender::bke { - -WindowManagerRuntime::WindowManagerRuntime() -{ - BKE_reports_init(&this->reports, RPT_STORE); -} - -WindowManagerRuntime::~WindowManagerRuntime() -{ - BKE_reports_free(&this->reports); -} - -} // namespace blender::bke diff --git a/source/blender/blenkernel/intern/workspace.cc b/source/blender/blenkernel/intern/workspace.cc index a55a3d54970..099120cdf16 100644 --- a/source/blender/blenkernel/intern/workspace.cc +++ b/source/blender/blenkernel/intern/workspace.cc @@ -15,23 +15,28 @@ #include "BLI_string_utils.hh" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_asset.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_idprop.h" #include "BKE_idtype.hh" #include "BKE_lib_id.hh" #include "BKE_lib_query.hh" #include "BKE_main.hh" +#include "BKE_object.hh" +#include "BKE_scene.h" #include "BKE_viewer_path.hh" #include "BKE_workspace.h" +#include "DNA_object_types.h" #include "DNA_scene_types.h" #include "DNA_screen_types.h" #include "DNA_windowmanager_types.h" #include "DNA_workspace_types.h" +#include "DEG_depsgraph.hh" + #include "MEM_guardedalloc.h" #include "BLO_read_write.hh" @@ -169,7 +174,6 @@ static void workspace_blend_read_after_liblink(BlendLibReader *reader, ID *id) IDTypeInfo IDType_ID_WS = { /*id_code*/ ID_WS, /*id_filter*/ FILTER_ID_WS, - /*dependencies_id_types*/ FILTER_ID_SCE, /*main_listbase_index*/ INDEX_ID_WS, /*struct_size*/ sizeof(WorkSpace), /*name*/ "WorkSpace", diff --git a/source/blender/blenkernel/intern/world.cc b/source/blender/blenkernel/intern/world.cc index 6c6bdc57b02..1602dc4bb65 100644 --- a/source/blender/blenkernel/intern/world.cc +++ b/source/blender/blenkernel/intern/world.cc @@ -9,7 +9,6 @@ #include #include #include -#include #include "MEM_guardedalloc.h" @@ -24,15 +23,17 @@ #include "BLI_listbase.h" #include "BLI_utildefines.h" +#include "BKE_anim_data.h" #include "BKE_icons.h" #include "BKE_idtype.hh" #include "BKE_lib_id.hh" #include "BKE_lib_query.hh" -#include "BKE_node.hh" +#include "BKE_main.hh" +#include "BKE_node.h" #include "BKE_preview_image.hh" #include "BKE_world.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DRW_engine.hh" @@ -82,11 +83,7 @@ static void world_init_data(ID *id) * * \param flag: Copying options (see BKE_lib_id.hh's LIB_ID_COPY_... flags for more). */ -static void world_copy_data(Main *bmain, - std::optional owner_library, - ID *id_dst, - const ID *id_src, - const int flag) +static void world_copy_data(Main *bmain, ID *id_dst, const ID *id_src, const int flag) { World *wrld_dst = (World *)id_dst; const World *wrld_src = (const World *)id_src; @@ -100,11 +97,8 @@ static void world_copy_data(Main *bmain, wrld_dst->nodetree = ntreeLocalize(wrld_src->nodetree); } else { - BKE_id_copy_in_lib(bmain, - owner_library, - (ID *)wrld_src->nodetree, - (ID **)&wrld_dst->nodetree, - flag_private_id_data); + BKE_id_copy_ex( + bmain, (ID *)wrld_src->nodetree, (ID **)&wrld_dst->nodetree, flag_private_id_data); } wrld_dst->nodetree->owner_id = &wrld_dst->id; } @@ -185,7 +179,6 @@ static void world_blend_read_data(BlendDataReader *reader, ID *id) IDTypeInfo IDType_ID_WO = { /*id_code*/ ID_WO, /*id_filter*/ FILTER_ID_WO, - /*dependencies_id_types*/ FILTER_ID_TE, /*main_listbase_index*/ INDEX_ID_WO, /*struct_size*/ sizeof(World), /*name*/ "World", diff --git a/source/blender/blenkernel/intern/writeavi.cc b/source/blender/blenkernel/intern/writeavi.cc new file mode 100644 index 00000000000..2e511946b8c --- /dev/null +++ b/source/blender/blenkernel/intern/writeavi.cc @@ -0,0 +1,319 @@ +/* SPDX-FileCopyrightText: 2001-2002 NaN Holding BV. All rights reserved. + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +/** \file + * Functions for writing AVI-format files. + * Added interface for generic movie support (ton) + * \ingroup bke + */ + +#include + +#include "MEM_guardedalloc.h" + +#include "DNA_scene_types.h" + +#include "BLI_utildefines.h" + +#include "BKE_report.h" +#ifdef WITH_AVI +# include "BLI_blenlib.h" + +# include "BKE_main.hh" +#endif + +#include "BKE_writeavi.h" + +/* ********************** general blender movie support ***************************** */ + +static int start_stub(void * /*context_v*/, + const Scene * /*scene*/, + RenderData * /*rd*/, + int /*rectx*/, + int /*recty*/, + ReportList * /*reports*/, + bool /*preview*/, + const char * /*suffix*/) +{ + return 0; +} + +static void end_stub(void * /*context_v*/) {} + +static int append_stub(void * /*context_v*/, + RenderData * /*rd*/, + int /*start_frame*/, + int /*frame*/, + int * /*pixels*/, + int /*rectx*/, + int /*recty*/, + const char * /*suffix*/, + ReportList * /*reports*/) +{ + return 0; +} + +static void *context_create_stub() +{ + return nullptr; +} + +static void context_free_stub(void * /*context_v*/) {} + +#ifdef WITH_AVI +# include "AVI_avi.h" + +/* callbacks */ +static int start_avi(void *context_v, + const Scene *scene, + RenderData *rd, + int rectx, + int recty, + ReportList *reports, + bool preview, + const char *suffix); +static void end_avi(void *context_v); +static int append_avi(void *context_v, + RenderData *rd, + int start_frame, + int frame, + int *pixels, + int rectx, + int recty, + const char *suffix, + ReportList *reports); +static void filepath_avi(char filepath[FILE_MAX], + const RenderData *rd, + bool preview, + const char *suffix); +static void *context_create_avi(void); +static void context_free_avi(void *context_v); +#endif /* WITH_AVI */ + +#ifdef WITH_FFMPEG +# include "BKE_writeffmpeg.hh" +#endif + +bMovieHandle *BKE_movie_handle_get(const char imtype) +{ + static bMovieHandle mh = {nullptr}; + /* stub callbacks in case none of the movie formats is supported */ + mh.start_movie = start_stub; + mh.append_movie = append_stub; + mh.end_movie = end_stub; + mh.get_movie_path = nullptr; + mh.context_create = context_create_stub; + mh.context_free = context_free_stub; + +/* set the default handle, as builtin */ +#ifdef WITH_AVI + mh.start_movie = start_avi; + mh.append_movie = append_avi; + mh.end_movie = end_avi; + mh.get_movie_path = filepath_avi; + mh.context_create = context_create_avi; + mh.context_free = context_free_avi; +#endif + +/* do the platform specific handles */ +#ifdef WITH_FFMPEG + if (ELEM(imtype, + R_IMF_IMTYPE_FFMPEG, + R_IMF_IMTYPE_H264, + R_IMF_IMTYPE_XVID, + R_IMF_IMTYPE_THEORA, + R_IMF_IMTYPE_AV1)) + { + mh.start_movie = BKE_ffmpeg_start; + mh.append_movie = BKE_ffmpeg_append; + mh.end_movie = BKE_ffmpeg_end; + mh.get_movie_path = BKE_ffmpeg_filepath_get; + mh.context_create = BKE_ffmpeg_context_create; + mh.context_free = BKE_ffmpeg_context_free; + } +#endif + + /* in case all above are disabled */ + (void)imtype; + + return (mh.append_movie != append_stub) ? &mh : nullptr; +} + +/* ****************************************************************** */ + +#ifdef WITH_AVI + +static void filepath_avi(char filepath[FILE_MAX], + const RenderData *rd, + bool preview, + const char *suffix) +{ + int sfra, efra; + + if (filepath == nullptr) { + return; + } + + if (preview) { + sfra = rd->psfra; + efra = rd->pefra; + } + else { + sfra = rd->sfra; + efra = rd->efra; + } + + BLI_strncpy(filepath, rd->pic, FILE_MAX); + BLI_path_abs(filepath, BKE_main_blendfile_path_from_global()); + + BLI_file_ensure_parent_dir_exists(filepath); + + if (rd->scemode & R_EXTENSION) { + if (!BLI_path_extension_check(filepath, ".avi")) { + BLI_path_frame_range(filepath, FILE_MAX, sfra, efra, 4); + BLI_strncat(filepath, ".avi", FILE_MAX); + } + } + else { + if (BLI_path_frame_check_chars(filepath)) { + BLI_path_frame_range(filepath, FILE_MAX, sfra, efra, 4); + } + } + + BLI_path_suffix(filepath, FILE_MAX, suffix, ""); +} + +static int start_avi(void *context_v, + const Scene * /*scene*/, + RenderData *rd, + int rectx, + int recty, + ReportList *reports, + bool preview, + const char *suffix) +{ + int x, y; + char filepath[FILE_MAX]; + AviFormat format; + int quality; + double framerate; + AviMovie *avi = static_cast(context_v); + + filepath_avi(filepath, rd, preview, suffix); + + x = rectx; + y = recty; + + quality = rd->im_format.quality; + framerate = double(rd->frs_sec) / double(rd->frs_sec_base); + + if (rd->im_format.imtype != R_IMF_IMTYPE_AVIJPEG) { + format = AVI_FORMAT_AVI_RGB; + } + else { + format = AVI_FORMAT_MJPEG; + } + + if (AVI_open_compress(filepath, avi, 1, format) != AVI_ERROR_NONE) { + BKE_report(reports, RPT_ERROR, "Cannot open or start AVI movie file"); + return 0; + } + + AVI_set_compress_option(avi, AVI_OPTION_TYPE_MAIN, 0, AVI_OPTION_WIDTH, &x); + AVI_set_compress_option(avi, AVI_OPTION_TYPE_MAIN, 0, AVI_OPTION_HEIGHT, &y); + AVI_set_compress_option(avi, AVI_OPTION_TYPE_MAIN, 0, AVI_OPTION_QUALITY, &quality); + AVI_set_compress_option(avi, AVI_OPTION_TYPE_MAIN, 0, AVI_OPTION_FRAMERATE, &framerate); + + avi->interlace = 0; + avi->odd_fields = 0; + + printf("Created avi: %s\n", filepath); + return 1; +} + +static int append_avi(void *context_v, + RenderData * /*rd*/, + int start_frame, + int frame, + int *pixels, + int rectx, + int recty, + const char * /*suffix*/, + ReportList * /*reports*/) +{ + uint *rt1, *rt2, *rectot; + int x, y; + char *cp, rt; + AviMovie *avi = static_cast(context_v); + + if (avi == nullptr) { + return 0; + } + + /* NOTE(@zr): that LIBAVI free's the buffer (stupid interface). */ + rectot = static_cast(MEM_mallocN(rectx * recty * sizeof(int), "rectot")); + rt1 = rectot; + rt2 = (uint *)pixels + (recty - 1) * rectx; + /* Flip Y and convert to ABGR. */ + for (y = 0; y < recty; y++, rt1 += rectx, rt2 -= rectx) { + memcpy(rt1, rt2, rectx * sizeof(int)); + + cp = (char *)rt1; + for (x = rectx; x > 0; x--) { + rt = cp[0]; + cp[0] = cp[3]; + cp[3] = rt; + rt = cp[1]; + cp[1] = cp[2]; + cp[2] = rt; + cp += 4; + } + } + + AVI_write_frame(avi, (frame - start_frame), AVI_FORMAT_RGB32, rectot, rectx * recty * 4); + // printf("added frame %3d (frame %3d in avi): ", frame, frame-start_frame); + + return 1; +} + +static void end_avi(void *context_v) +{ + AviMovie *avi = static_cast(context_v); + + if (avi == nullptr) { + return; + } + + AVI_close_compress(avi); +} + +static void *context_create_avi() +{ + AviMovie *avi = static_cast(MEM_mallocN(sizeof(AviMovie), "avimovie")); + return avi; +} + +static void context_free_avi(void *context_v) +{ + AviMovie *avi = static_cast(context_v); + if (avi) { + MEM_freeN(avi); + } +} + +#endif /* WITH_AVI */ + +void BKE_movie_filepath_get(char filepath[/*FILE_MAX*/ 1024], + const RenderData *rd, + bool preview, + const char *suffix) +{ + bMovieHandle *mh = BKE_movie_handle_get(rd->im_format.imtype); + if (mh && mh->get_movie_path) { + mh->get_movie_path(filepath, rd, preview, suffix); + } + else { + filepath[0] = '\0'; + } +} diff --git a/source/blender/blenkernel/intern/writeffmpeg.cc b/source/blender/blenkernel/intern/writeffmpeg.cc index 48bb1a1438d..6c524182640 100644 --- a/source/blender/blenkernel/intern/writeffmpeg.cc +++ b/source/blender/blenkernel/intern/writeffmpeg.cc @@ -28,12 +28,13 @@ # include "BLI_math_base.h" # include "BLI_threads.h" # include "BLI_utildefines.h" -# include "BLI_vector.hh" -# include "BKE_global.hh" +# include "BKE_global.h" +# include "BKE_idprop.h" # include "BKE_image.h" +# include "BKE_lib_id.hh" # include "BKE_main.hh" -# include "BKE_report.hh" +# include "BKE_report.h" # include "BKE_sound.h" # include "BKE_writeffmpeg.hh" @@ -57,25 +58,6 @@ extern "C" { struct StampData; -/* libswscale context creation and destruction is expensive. - * Maintain a cache of already created contexts. */ - -constexpr int64_t swscale_cache_max_entries = 32; - -struct SwscaleContext { - int width = 0, height = 0; - AVPixelFormat src_format = AV_PIX_FMT_NONE, dst_format = AV_PIX_FMT_NONE; - int flags = 0; - - SwsContext *context = nullptr; - int64_t last_use_timestamp = 0; - bool is_used = false; -}; - -static ThreadMutex swscale_cache_lock = PTHREAD_MUTEX_INITIALIZER; -static int64_t swscale_cache_timestamp = 0; -static blender::Vector *swscale_cache = nullptr; - struct FFMpegContext { int ffmpeg_type; AVCodecID ffmpeg_codec; @@ -338,7 +320,7 @@ static const char **get_file_extensions(int format) } /* Write a frame to the output file */ -static bool write_video_frame(FFMpegContext *context, AVFrame *frame, ReportList *reports) +static int write_video_frame(FFMpegContext *context, AVFrame *frame, ReportList *reports) { int ret, success = 1; AVPacket *packet = av_packet_alloc(); @@ -394,14 +376,8 @@ static bool write_video_frame(FFMpegContext *context, AVFrame *frame, ReportList } /* read and encode a frame of video from the buffer */ -static AVFrame *generate_video_frame(FFMpegContext *context, const ImBuf *image) +static AVFrame *generate_video_frame(FFMpegContext *context, const uint8_t *pixels) { - /* For now only 8-bit/channel images are supported. */ - const uint8_t *pixels = image->byte_buffer.data; - if (pixels == nullptr) { - return nullptr; - } - AVCodecParameters *codec = context->video_stream->codecpar; int height = codec->height; AVFrame *rgb_frame; @@ -691,7 +667,7 @@ static const AVCodec *get_av1_encoder( return codec; } -static SwsContext *sws_create_context( +SwsContext *BKE_ffmpeg_sws_get_context( int width, int height, int av_src_format, int av_dst_format, int sws_flags) { # if defined(FFMPEG_SWSCALE_THREADING) @@ -729,128 +705,6 @@ static SwsContext *sws_create_context( return c; } - -static void init_swscale_cache_if_needed() -{ - if (swscale_cache == nullptr) { - swscale_cache = new blender::Vector(); - swscale_cache_timestamp = 0; - } -} - -static bool remove_oldest_swscale_context() -{ - int64_t oldest_index = -1; - int64_t oldest_time = 0; - for (int64_t index = 0; index < swscale_cache->size(); index++) { - SwscaleContext &ctx = (*swscale_cache)[index]; - if (ctx.is_used) { - continue; - } - int64_t time = swscale_cache_timestamp - ctx.last_use_timestamp; - if (time > oldest_time) { - oldest_time = time; - oldest_index = index; - } - } - - if (oldest_index >= 0) { - SwscaleContext &ctx = (*swscale_cache)[oldest_index]; - sws_freeContext(ctx.context); - swscale_cache->remove_and_reorder(oldest_index); - return true; - } - return false; -} - -static void maintain_swscale_cache_size() -{ - while (swscale_cache->size() > swscale_cache_max_entries) { - if (!remove_oldest_swscale_context()) { - /* Could not remove anything (all contexts are actively used), - * stop trying. */ - break; - } - } -} - -SwsContext *BKE_ffmpeg_sws_get_context( - int width, int height, int av_src_format, int av_dst_format, int sws_flags) -{ - BLI_mutex_lock(&swscale_cache_lock); - - init_swscale_cache_if_needed(); - - swscale_cache_timestamp++; - - /* Search for unused context that has suitable parameters. */ - SwsContext *ctx = nullptr; - for (SwscaleContext &c : *swscale_cache) { - if (!c.is_used && c.width == width && c.height == height && c.src_format == av_src_format && - c.dst_format == av_dst_format && c.flags == sws_flags) - { - ctx = c.context; - /* Mark as used. */ - c.is_used = true; - c.last_use_timestamp = swscale_cache_timestamp; - break; - } - } - if (ctx == nullptr) { - /* No free matching context in cache: create a new one. */ - ctx = sws_create_context(width, height, av_src_format, av_dst_format, sws_flags); - SwscaleContext c; - c.width = width; - c.height = height; - c.src_format = AVPixelFormat(av_src_format); - c.dst_format = AVPixelFormat(av_dst_format); - c.flags = sws_flags; - c.context = ctx; - c.is_used = true; - c.last_use_timestamp = swscale_cache_timestamp; - swscale_cache->append(c); - - maintain_swscale_cache_size(); - } - - BLI_mutex_unlock(&swscale_cache_lock); - return ctx; -} - -void BKE_ffmpeg_sws_release_context(SwsContext *ctx) -{ - BLI_mutex_lock(&swscale_cache_lock); - init_swscale_cache_if_needed(); - - bool found = false; - for (SwscaleContext &c : *swscale_cache) { - if (c.context == ctx) { - BLI_assert_msg(c.is_used, "Releasing ffmpeg swscale context that is not in use"); - c.is_used = false; - found = true; - break; - } - } - BLI_assert_msg(found, "Releasing ffmpeg swscale context that is not in cache"); - UNUSED_VARS_NDEBUG(found); - maintain_swscale_cache_size(); - - BLI_mutex_unlock(&swscale_cache_lock); -} - -void BKE_ffmpeg_exit() -{ - BLI_mutex_lock(&swscale_cache_lock); - if (swscale_cache != nullptr) { - for (SwscaleContext &c : *swscale_cache) { - sws_freeContext(c.context); - } - delete swscale_cache; - swscale_cache = nullptr; - } - BLI_mutex_unlock(&swscale_cache_lock); -} - void BKE_ffmpeg_sws_scale_frame(SwsContext *ctx, AVFrame *dst, const AVFrame *src) { # if defined(FFMPEG_SWSCALE_THREADING) @@ -1279,12 +1133,12 @@ static void ffmpeg_add_metadata_callback(void *data, av_dict_set(metadata, propname, propvalue, 0); } -static bool start_ffmpeg_impl(FFMpegContext *context, - RenderData *rd, - int rectx, - int recty, - const char *suffix, - ReportList *reports) +static int start_ffmpeg_impl(FFMpegContext *context, + RenderData *rd, + int rectx, + int recty, + const char *suffix, + ReportList *reports) { /* Handle to the output file */ AVFormatContext *of; @@ -1330,19 +1184,19 @@ static bool start_ffmpeg_impl(FFMpegContext *context, exts = get_file_extensions(context->ffmpeg_type); if (!exts) { BKE_report(reports, RPT_ERROR, "No valid formats found"); - return false; + return 0; } fmt = av_guess_format(nullptr, exts[0], nullptr); if (!fmt) { BKE_report(reports, RPT_ERROR, "No valid formats found"); - return false; + return 0; } of = avformat_alloc_context(); if (!of) { BKE_report(reports, RPT_ERROR, "Can't allocate FFmpeg format context"); - return false; + return 0; } enum AVCodecID audio_codec = context->ffmpeg_audio_codec; @@ -1475,7 +1329,7 @@ static bool start_ffmpeg_impl(FFMpegContext *context, context->outfile = of; av_dump_format(of, 0, filepath, 1); - return true; + return 1; fail: if (of->pb) { @@ -1491,7 +1345,7 @@ fail: } avformat_free_context(of); - return false; + return 0; } /** @@ -1632,22 +1486,23 @@ void BKE_ffmpeg_filepath_get(char filepath[/*FILE_MAX*/ 1024], ffmpeg_filepath_get(nullptr, filepath, rd, preview, suffix); } -bool BKE_ffmpeg_start(void *context_v, - const Scene *scene, - RenderData *rd, - int rectx, - int recty, - ReportList *reports, - bool preview, - const char *suffix) +int BKE_ffmpeg_start(void *context_v, + const Scene *scene, + RenderData *rd, + int rectx, + int recty, + ReportList *reports, + bool preview, + const char *suffix) { + int success; FFMpegContext *context = static_cast(context_v); context->ffmpeg_autosplit_count = 0; context->ffmpeg_preview = preview; context->stamp_data = BKE_stamp_info_from_scene_static(scene); - bool success = start_ffmpeg_impl(context, rd, rectx, recty, suffix, reports); + success = start_ffmpeg_impl(context, rd, rectx, recty, suffix, reports); # ifdef WITH_AUDASPACE if (context->audio_stream) { AVCodecContext *c = context->audio_codec; @@ -1704,22 +1559,24 @@ static void write_audio_frames(FFMpegContext *context, double to_pts) } # endif -bool BKE_ffmpeg_append(void *context_v, - RenderData *rd, - int start_frame, - int frame, - const ImBuf *image, - const char *suffix, - ReportList *reports) +int BKE_ffmpeg_append(void *context_v, + RenderData *rd, + int start_frame, + int frame, + int *pixels, + int rectx, + int recty, + const char *suffix, + ReportList *reports) { FFMpegContext *context = static_cast(context_v); AVFrame *avframe; - bool success = true; + int success = 1; - PRINT("Writing frame %i, render width=%d, render height=%d\n", frame, image->x, image->y); + PRINT("Writing frame %i, render width=%d, render height=%d\n", frame, rectx, recty); if (context->video_stream) { - avframe = generate_video_frame(context, image); + avframe = generate_video_frame(context, (uchar *)pixels); success = (avframe && write_video_frame(context, avframe, reports)); # ifdef WITH_AUDASPACE /* Add +1 frame because we want to encode audio up until the next video frame. */ @@ -1734,7 +1591,7 @@ bool BKE_ffmpeg_append(void *context_v, end_ffmpeg_impl(context, true); context->ffmpeg_autosplit_count++; - success &= start_ffmpeg_impl(context, rd, image->x, image->y, suffix, reports); + success &= start_ffmpeg_impl(context, rd, rectx, recty, suffix, reports); } } } @@ -1822,7 +1679,7 @@ static void end_ffmpeg_impl(FFMpegContext *context, int is_autosplit) } if (context->img_convert_ctx != nullptr) { - BKE_ffmpeg_sws_release_context(context->img_convert_ctx); + sws_freeContext(context->img_convert_ctx); context->img_convert_ctx = nullptr; } } @@ -1838,6 +1695,55 @@ void BKE_ffmpeg_preset_set(RenderData *rd, int preset) bool is_ntsc = (rd->frs_sec != 25); switch (preset) { + case FFMPEG_PRESET_VCD: + rd->ffcodecdata.type = FFMPEG_MPEG1; + rd->ffcodecdata.video_bitrate = 1150; + rd->xsch = 352; + rd->ysch = is_ntsc ? 240 : 288; + rd->ffcodecdata.gop_size = is_ntsc ? 18 : 15; + rd->ffcodecdata.rc_max_rate = 1150; + rd->ffcodecdata.rc_min_rate = 1150; + rd->ffcodecdata.rc_buffer_size = 40 * 8; + rd->ffcodecdata.mux_packet_size = 2324; + rd->ffcodecdata.mux_rate = 2352 * 75 * 8; + break; + + case FFMPEG_PRESET_SVCD: + rd->ffcodecdata.type = FFMPEG_MPEG2; + rd->ffcodecdata.video_bitrate = 2040; + rd->xsch = 480; + rd->ysch = is_ntsc ? 480 : 576; + rd->ffcodecdata.gop_size = is_ntsc ? 18 : 15; + rd->ffcodecdata.rc_max_rate = 2516; + rd->ffcodecdata.rc_min_rate = 0; + rd->ffcodecdata.rc_buffer_size = 224 * 8; + rd->ffcodecdata.mux_packet_size = 2324; + rd->ffcodecdata.mux_rate = 0; + break; + + case FFMPEG_PRESET_DVD: + rd->ffcodecdata.type = FFMPEG_MPEG2; + rd->ffcodecdata.video_bitrate = 6000; + +# if 0 /* Don't set resolution, see #21351. */ + rd->xsch = 720; + rd->ysch = isntsc ? 480 : 576; +# endif + + rd->ffcodecdata.gop_size = is_ntsc ? 18 : 15; + rd->ffcodecdata.rc_max_rate = 9000; + rd->ffcodecdata.rc_min_rate = 0; + rd->ffcodecdata.rc_buffer_size = 224 * 8; + rd->ffcodecdata.mux_packet_size = 2048; + rd->ffcodecdata.mux_rate = 10080000; + break; + + case FFMPEG_PRESET_DV: + rd->ffcodecdata.type = FFMPEG_DV; + rd->xsch = 720; + rd->ysch = is_ntsc ? 480 : 576; + break; + case FFMPEG_PRESET_H264: rd->ffcodecdata.type = FFMPEG_AVI; rd->ffcodecdata.codec = AV_CODEC_ID_H264; @@ -1848,6 +1754,7 @@ void BKE_ffmpeg_preset_set(RenderData *rd, int preset) rd->ffcodecdata.rc_buffer_size = 224 * 8; rd->ffcodecdata.mux_packet_size = 2048; rd->ffcodecdata.mux_rate = 10080000; + break; case FFMPEG_PRESET_THEORA: @@ -1869,7 +1776,6 @@ void BKE_ffmpeg_preset_set(RenderData *rd, int preset) rd->ffcodecdata.mux_packet_size = 2048; rd->ffcodecdata.mux_rate = 10080000; break; - case FFMPEG_PRESET_AV1: rd->ffcodecdata.type = FFMPEG_AV1; rd->ffcodecdata.codec = AV_CODEC_ID_AV1; @@ -1880,6 +1786,7 @@ void BKE_ffmpeg_preset_set(RenderData *rd, int preset) rd->ffcodecdata.rc_buffer_size = 224 * 8; rd->ffcodecdata.mux_packet_size = 2048; rd->ffcodecdata.mux_rate = 10080000; + break; } } diff --git a/source/blender/blenkernel/intern/writemovie.cc b/source/blender/blenkernel/intern/writemovie.cc deleted file mode 100644 index 30b1fbe365e..00000000000 --- a/source/blender/blenkernel/intern/writemovie.cc +++ /dev/null @@ -1,105 +0,0 @@ -/* SPDX-FileCopyrightText: 2001-2002 NaN Holding BV. All rights reserved. - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * Functions for writing movie files. - * \ingroup bke - */ - -#include - -#include "MEM_guardedalloc.h" - -#include "DNA_scene_types.h" - -#include "BLI_utildefines.h" - -#include "BKE_report.hh" - -#ifdef WITH_FFMPEG -# include "BKE_writeffmpeg.hh" -#endif - -#include "BKE_writemovie.hh" - -static bool start_stub(void * /*context_v*/, - const Scene * /*scene*/, - RenderData * /*rd*/, - int /*rectx*/, - int /*recty*/, - ReportList * /*reports*/, - bool /*preview*/, - const char * /*suffix*/) -{ - return false; -} - -static void end_stub(void * /*context_v*/) {} - -static bool append_stub(void * /*context_v*/, - RenderData * /*rd*/, - int /*start_frame*/, - int /*frame*/, - const ImBuf * /*image*/, - const char * /*suffix*/, - ReportList * /*reports*/) -{ - return false; -} - -static void *context_create_stub() -{ - return nullptr; -} - -static void context_free_stub(void * /*context_v*/) {} - -bMovieHandle *BKE_movie_handle_get(const char imtype) -{ - static bMovieHandle mh = {nullptr}; - /* Stub callbacks in case ffmpeg is not compiled in. */ - mh.start_movie = start_stub; - mh.append_movie = append_stub; - mh.end_movie = end_stub; - mh.get_movie_path = nullptr; - mh.context_create = context_create_stub; - mh.context_free = context_free_stub; - -#ifdef WITH_FFMPEG - if (ELEM(imtype, - R_IMF_IMTYPE_AVIRAW, - R_IMF_IMTYPE_AVIJPEG, - R_IMF_IMTYPE_FFMPEG, - R_IMF_IMTYPE_H264, - R_IMF_IMTYPE_XVID, - R_IMF_IMTYPE_THEORA, - R_IMF_IMTYPE_AV1)) - { - mh.start_movie = BKE_ffmpeg_start; - mh.append_movie = BKE_ffmpeg_append; - mh.end_movie = BKE_ffmpeg_end; - mh.get_movie_path = BKE_ffmpeg_filepath_get; - mh.context_create = BKE_ffmpeg_context_create; - mh.context_free = BKE_ffmpeg_context_free; - } -#else - (void)imtype; -#endif - - return (mh.append_movie != append_stub) ? &mh : nullptr; -} - -void BKE_movie_filepath_get(char filepath[/*FILE_MAX*/ 1024], - const RenderData *rd, - bool preview, - const char *suffix) -{ - bMovieHandle *mh = BKE_movie_handle_get(rd->im_format.imtype); - if (mh && mh->get_movie_path) { - mh->get_movie_path(filepath, rd, preview, suffix); - } - else { - filepath[0] = '\0'; - } -} diff --git a/source/blender/blenkernel/particle_private.h b/source/blender/blenkernel/particle_private.h index 144c67ef449..551d89e4d47 100644 --- a/source/blender/blenkernel/particle_private.h +++ b/source/blender/blenkernel/particle_private.h @@ -38,7 +38,7 @@ void do_kink(ParticleKey *state, float flat, short type, short axis, - const float obmat[4][4], + float obmat[4][4], int smooth_start); float do_clump(ParticleKey *state, const float par_co[3], diff --git a/source/blender/blenlib/BLI_array_utils.hh b/source/blender/blenlib/BLI_array_utils.hh index 1e05402e42c..197ff2f5107 100644 --- a/source/blender/blenlib/BLI_array_utils.hh +++ b/source/blender/blenlib/BLI_array_utils.hh @@ -261,7 +261,7 @@ template inline Vector find_all_ranges(const Span spa int64_t length = (span.first() == value) ? 1 : 0; for (const int64_t i : span.index_range().drop_front(1)) { if (span[i - 1] == value && span[i] != value) { - ranges.append(IndexRange::from_end_size(i, length)); + ranges.append(IndexRange(i - length, length)); length = 0; } else if (span[i] == value) { @@ -269,7 +269,7 @@ template inline Vector find_all_ranges(const Span spa } } if (length > 0) { - ranges.append(IndexRange::from_end_size(span.size(), length)); + ranges.append(IndexRange(span.size() - length, length)); } return ranges; } diff --git a/source/blender/blenlib/BLI_bit_vector.hh b/source/blender/blenlib/BLI_bit_vector.hh index eafcdfb8e56..acc98592952 100644 --- a/source/blender/blenlib/BLI_bit_vector.hh +++ b/source/blender/blenlib/BLI_bit_vector.hh @@ -236,7 +236,7 @@ class BitVector { IndexRange index_range() const { - return IndexRange(size_in_bits_); + return {0, size_in_bits_}; } /** @@ -283,7 +283,7 @@ class BitVector { } size_in_bits_ = new_size_in_bits; if (old_size_in_bits < new_size_in_bits) { - MutableBitSpan(data_, IndexRange::from_begin_end(old_size_in_bits, new_size_in_bits)) + MutableBitSpan(data_, IndexRange(old_size_in_bits, new_size_in_bits - old_size_in_bits)) .set_all(value); } } diff --git a/source/blender/blenlib/BLI_bitmap_draw_2d.h b/source/blender/blenlib/BLI_bitmap_draw_2d.h index 17cd5a54d97..4355887ccfb 100644 --- a/source/blender/blenlib/BLI_bitmap_draw_2d.h +++ b/source/blender/blenlib/BLI_bitmap_draw_2d.h @@ -8,8 +8,9 @@ * \ingroup bli */ -#include "BLI_math_vector_types.hh" -#include "BLI_span.hh" +#ifdef __cplusplus +extern "C" { +#endif /** * Plot a line from \a p1 to \a p2 (inclusive). @@ -46,6 +47,11 @@ void BLI_bitmap_draw_2d_poly_v2i_n(int xmin, int ymin, int xmax, int ymax, - blender::Span verts, + const int verts[][2], + int verts_len, void (*callback)(int x, int x_end, int y, void *), void *user_data); + +#ifdef __cplusplus +} +#endif diff --git a/source/blender/blenlib/BLI_bounds.hh b/source/blender/blenlib/BLI_bounds.hh index 35102be81f4..37200accc10 100644 --- a/source/blender/blenlib/BLI_bounds.hh +++ b/source/blender/blenlib/BLI_bounds.hh @@ -17,9 +17,7 @@ #include "BLI_math_vector.hh" #include "BLI_task.hh" -namespace blender { - -namespace bounds { +namespace blender::bounds { template [[nodiscard]] inline Bounds merge(const Bounds &a, const Bounds &b) { @@ -117,75 +115,4 @@ template [](const Bounds &a, const Bounds &b) { return merge(a, b); }); } -} // namespace bounds - -namespace detail { - -template -[[nodiscard]] inline bool less_or_equal_than(const VecBase &a, const VecBase &b) -{ - for (int i = 0; i < Size; i++) { - if (a[i] > b[i]) { - return false; - } - } - return true; -} - -} // namespace detail - -template inline bool Bounds::is_empty() const -{ - if constexpr (std::is_integral::value || std::is_floating_point::value) { - return this->max <= this->min; - } - else { - return detail::less_or_equal_than(this->max, this->min); - } -} - -template inline T Bounds::center() const -{ - return math::midpoint(this->min, this->max); -} - -template inline T Bounds::size() const -{ - return math::abs(max - min); -} - -template inline void Bounds::translate(const T &offset) -{ - this->min += offset; - this->max += offset; -} - -template inline void Bounds::scale_from_center(const T &scale) -{ - const T center = this->center(); - const T new_half_size = this->size() / T(2) * scale; - this->min = center - new_half_size; - this->max = center + new_half_size; -} - -template inline void Bounds::resize(const T &new_size) -{ - this->min = this->center() - (new_size / T(2)); - this->max = this->min + new_size; -} - -template inline void Bounds::recenter(const T &new_center) -{ - const T offset = new_center - this->center(); - this->translate(offset); -} - -template -template -inline void Bounds::pad(const PaddingT &padding) -{ - this->min = this->min - padding; - this->max = this->max + padding; -} - -} // namespace blender +} // namespace blender::bounds diff --git a/source/blender/blenlib/BLI_bounds_types.hh b/source/blender/blenlib/BLI_bounds_types.hh index 21cb8d33039..5613c5433b4 100644 --- a/source/blender/blenlib/BLI_bounds_types.hh +++ b/source/blender/blenlib/BLI_bounds_types.hh @@ -16,52 +16,6 @@ template struct Bounds { Bounds() = default; Bounds(const T &value) : min(value), max(value) {} Bounds(const T &min, const T &max) : min(min), max(max) {} - - /** - * Returns true when the size of the bounds is zero (or negative). - * This matches the behavior of #BLI_rcti_is_empty/#BLI_rctf_is_empty. - */ - bool is_empty() const; - /** - * Return the center (i.e. the midpoint) of the bounds. - * This matches the behavior of #BLI_rctf_cent/#BLI_rcti_cent. - */ - T center() const; - /** - * Return the size of the bounds. - * E.g. for a Bounds this would return the dimensions of bounding box as a float3. - * This matches the behavior of #BLI_rctf_size/#BLI_rcti_size. - */ - T size() const; - - /** - * Translate the bounds by #offset. - * This matches the behavior of #BLI_rctf_translate/#BLI_rcti_translate. - */ - void translate(const T &offset); - /** - * Scale the bounds from the center. - * This matches the behavior of #BLI_rctf_scale/#BLI_rcti_scale. - */ - void scale_from_center(const T &scale); - - /** - * Resize the bounds in-place to ensure their size is #new_size. - * The center of the bounds doesn't change. - * This matches the behavior of #BLI_rctf_resize/#BLI_rcti_resize. - */ - void resize(const T &new_size); - /** - * Translate the bounds such that their center is #new_center. - * This matches the behavior of #BLI_rctf_recenter/#BLI_rcti_recenter. - */ - void recenter(const T &new_center); - - /** - * Adds some padding to the bounds. - * This matches the behavior of #BLI_rcti_pad/#BLI_rctf_pad. - */ - template void pad(const PaddingT &padding); }; } // namespace blender diff --git a/source/blender/blenlib/BLI_compiler_attrs.h b/source/blender/blenlib/BLI_compiler_attrs.h index 0f48ca0dd2d..0a9d20748cb 100644 --- a/source/blender/blenlib/BLI_compiler_attrs.h +++ b/source/blender/blenlib/BLI_compiler_attrs.h @@ -86,7 +86,7 @@ /* Alignment directive */ #ifdef _WIN64 -# define BLI_ALIGN_STRUCT __declspec(align(64)) +# define ALIGN_STRUCT __declspec(align(64)) #else -# define BLI_ALIGN_STRUCT +# define ALIGN_STRUCT #endif diff --git a/source/blender/blenlib/BLI_convexhull_2d.h b/source/blender/blenlib/BLI_convexhull_2d.h index 0871cd5855c..4e2963cabae 100644 --- a/source/blender/blenlib/BLI_convexhull_2d.h +++ b/source/blender/blenlib/BLI_convexhull_2d.h @@ -16,24 +16,22 @@ extern "C" { * Extract 2D convex hull. * * \param points: An array of 2D points. - * \param points_num: The number of points in points. - * \param r_points: An array of the convex hull vertex indices (max is `points_num`). - * Vertices are ordered counter clockwise, the polygons cross product is always negative (or zero). - * + * \param n: The number of points in points. + * \param r_points: An array of the convex hull vertex indices (max is n). * \return The number of indices in r_points. * - * \note Performance is `O(points_num.log(points_num))`, same as `qsort`. + * \note Performance is `O(n.log(n))`, same as `qsort`. */ -int BLI_convexhull_2d(const float (*points)[2], int points_num, int r_points[/*points_num*/]); +int BLI_convexhull_2d(const float (*points)[2], int n, int r_points[/*n*/]); /** * \return The best angle for fitting the points to an axis aligned bounding box. * * \note We could return the index of the best edge too if its needed. * - * \param points: Arbitrary 2D points. + * \param points: Arbitrary 2d points. */ -float BLI_convexhull_aabb_fit_points_2d(const float (*points)[2], int points_num); +float BLI_convexhull_aabb_fit_points_2d(const float (*points)[2], int n); #ifdef __cplusplus } diff --git a/source/blender/blenlib/BLI_hash_mm2a.hh b/source/blender/blenlib/BLI_hash_mm2a.hh index fc61807371e..a9fcfa6768f 100644 --- a/source/blender/blenlib/BLI_hash_mm2a.hh +++ b/source/blender/blenlib/BLI_hash_mm2a.hh @@ -10,12 +10,12 @@ #include "BLI_sys_types.h" -struct BLI_HashMurmur2A { +typedef struct BLI_HashMurmur2A { uint32_t hash; uint32_t tail; uint32_t count; uint32_t size; -}; +} BLI_HashMurmur2A; void BLI_hash_mm2a_init(BLI_HashMurmur2A *mm2, uint32_t seed); diff --git a/source/blender/blenlib/BLI_implicit_sharing.hh b/source/blender/blenlib/BLI_implicit_sharing.hh index e639989d057..42a76dcbcc7 100644 --- a/source/blender/blenlib/BLI_implicit_sharing.hh +++ b/source/blender/blenlib/BLI_implicit_sharing.hh @@ -125,11 +125,6 @@ class ImplicitSharingInfo : NonCopyable, NonMovable { return version_.load(std::memory_order_acquire); } - int strong_users() const - { - return strong_users_.load(std::memory_order_acquire); - } - /** * Call when the data is no longer needed. This might just decrement the user count, or it might * also delete the data if this was the last user. diff --git a/source/blender/blenlib/BLI_index_mask.hh b/source/blender/blenlib/BLI_index_mask.hh index 7d5ae8a7ad3..82338992abe 100644 --- a/source/blender/blenlib/BLI_index_mask.hh +++ b/source/blender/blenlib/BLI_index_mask.hh @@ -17,7 +17,6 @@ #include "BLI_task.hh" #include "BLI_unique_sorted_indices.hh" #include "BLI_vector.hh" -#include "BLI_vector_set.hh" #include "BLI_virtual_array_fwd.hh" namespace blender::index_mask { @@ -116,25 +115,7 @@ class IndexMaskMemory : public LinearAllocator<> { } }; -/** - * A sequence of unique and ordered indices in one segment of an IndexMask. The segment as a whole - * has an `int64_t` index offset that is added to each referenced `int16_t` index. - */ -class IndexMaskSegment : public OffsetSpan { - public: - using OffsetSpan::OffsetSpan; - - explicit IndexMaskSegment(const OffsetSpan span); - - IndexMaskSegment slice(const IndexRange &range) const; - IndexMaskSegment slice(const int64_t start, const int64_t size) const; - - /** - * Get a new segment where each index is modified by the given amount. This works in constant - * time, because only the offset value is changed. - */ - IndexMaskSegment shift(const int64_t shift) const; -}; +using IndexMaskSegment = OffsetSpan; /** * An #IndexMask is a sequence of unique and sorted indices (`BLI_unique_sorted_indices.hh`). @@ -205,23 +186,6 @@ class IndexMask : private IndexMaskData { static IndexMask from_bools(const IndexMask &universe, const VArray &bools, IndexMaskMemory &memory); - /** - * Constructs a mask by repeating the indices in the given mask with a stride. - * For example, with an input mask containing `{3, 5}` and a stride of 10 the resulting mask - * would contain `{3, 5, 13, 15, 23, 25, ...}`. - */ - static IndexMask from_repeating(const IndexMask &mask_to_repeat, - int64_t repetitions, - int64_t stride, - int64_t initial_offset, - IndexMaskMemory &memory); - /** - * Constructs a mask that contains every nth index the given number of times. - */ - static IndexMask from_every_nth(int64_t n, - int64_t indices_num, - const int64_t initial_offset, - IndexMaskMemory &memory); /** * Construct a mask from the given segments. The provided segments are expected to be * sorted and owned by #memory already. @@ -251,26 +215,12 @@ class IndexMask : private IndexMaskData { Fn &&get_group_index, MutableSpan r_masks); - /** Creates an index mask for every unique group id. */ - static Vector from_group_ids(const VArray &group_ids, - IndexMaskMemory &memory, - VectorSet &r_index_by_group_id); - static Vector from_group_ids(const IndexMask &universe, - const VArray &group_ids, - IndexMaskMemory &memory, - VectorSet &r_index_by_group_id); - int64_t size() const; bool is_empty() const; IndexRange index_range() const; int64_t first() const; int64_t last() const; - /** - * Returns the smallest range that contains all indices stored in this mask. - */ - IndexRange bounds() const; - /** * \return Minimum number of elements an array has to have so that it can be indexed by every * index stored in the mask. @@ -318,19 +268,14 @@ class IndexMask : private IndexMaskData { IndexMask slice_content(IndexRange range) const; IndexMask slice_content(int64_t start, int64_t size) const; /** - * Same #slice but can also add an offset to every index in the mask. + * Same as above but can also add an offset to every index in the mask. * Takes O(log n + range.size()) time but with a very small constant factor. */ - IndexMask slice_and_shift(IndexRange range, int64_t offset, IndexMaskMemory &memory) const; - IndexMask slice_and_shift(int64_t start, - int64_t size, - int64_t offset, - IndexMaskMemory &memory) const; - - /** - * Adds an offset to every index in the mask. - */ - IndexMask shift(const int64_t offset, IndexMaskMemory &memory) const; + IndexMask slice_and_offset(IndexRange range, int64_t offset, IndexMaskMemory &memory) const; + IndexMask slice_and_offset(int64_t start, + int64_t size, + int64_t offset, + IndexMaskMemory &memory) const; /** * \return A new index mask that contains all the indices from the universe that are not in the @@ -347,22 +292,6 @@ class IndexMask : private IndexMaskData { */ IndexMaskSegment segment(int64_t segment_i) const; - /** - * Iterate over the indices in multiple masks which have the same size. The given function is - * called for groups of segments where each segment has the same size and comes from a different - * input mask. - * For example, if the input masks are (both have size 18): - * A: [0, 15), {20, 24, 25} - * B: [0, 5), [10, 15], {20, 30, 40, 50, 60, 70, 80, 90} - * Then the function will be called multiple times, each time with two segments: - * 1. [0, 5), [0, 5) - * 2. [5, 10), [10, 15) - * 3. [10, 15), {20, 30, 40, 50, 60} - * 4. {20, 24, 25}, {70, 80, 90} - */ - static void foreach_segment_zipped(Span masks, - FunctionRef segments)> fn); - /** * Calls the function once for every index. * @@ -429,7 +358,7 @@ class IndexMask : private IndexMaskData { /** * Set the bits at indices in the mask to 1 and all other bits to 0. */ - void to_bits(MutableBitSpan r_bits, int64_t offset = 0) const; + void to_bits(MutableBitSpan r_bits) const; /** * Set the bools at indices in the mask to true and all others to false. */ @@ -460,9 +389,6 @@ class IndexMask : private IndexMaskData { * Is used by some functions to get low level access to the mask in order to construct it. */ IndexMaskData &data_for_inplace_construction(); - - friend bool operator==(const IndexMask &a, const IndexMask &b); - friend bool operator!=(const IndexMask &a, const IndexMask &b); }; /** @@ -540,16 +466,6 @@ inline void masked_fill(MutableSpan data, const T &value, const IndexMask &ma */ template void build_reverse_map(const IndexMask &mask, MutableSpan r_map); -/** - * Joins segments together based on heuristics. Generally, one wants as few segments as possible, - * but one also wants full-range-segments if possible and we don't want to copy too many indices - * around to reduce the number of segments. - * - * \return Number of consolidated segments. Those are ordered to the beginning of the span. - */ -int64_t consolidate_index_mask_segments(MutableSpan segments, - IndexMaskMemory &memory); - /* -------------------------------------------------------------------- */ /** \name #RawMaskIterator Inline Methods * \{ */ @@ -564,32 +480,6 @@ inline bool operator==(const RawMaskIterator &a, const RawMaskIterator &b) return !(a != b); } -/* -------------------------------------------------------------------- */ -/** \name #IndexMaskSegment Inline Methods - * \{ */ - -inline IndexMaskSegment::IndexMaskSegment(const OffsetSpan span) - : OffsetSpan(span) -{ -} - -inline IndexMaskSegment IndexMaskSegment::slice(const IndexRange &range) const -{ - return IndexMaskSegment(static_cast *>(this)->slice(range)); -} - -inline IndexMaskSegment IndexMaskSegment::slice(const int64_t start, const int64_t size) const -{ - return IndexMaskSegment( - static_cast *>(this)->slice(start, size)); -} - -inline IndexMaskSegment IndexMaskSegment::shift(const int64_t shift) const -{ - BLI_assert(this->is_empty() || (*this)[0] + shift >= 0); - return IndexMaskSegment(this->offset() + shift, this->base_span()); -} - /* -------------------------------------------------------------------- */ /** \name #IndexMask Inline Methods * \{ */ @@ -659,16 +549,6 @@ inline IndexRange IndexMask::index_range() const return IndexRange(indices_num_); } -inline IndexRange IndexMask::bounds() const -{ - if (this->is_empty()) { - return IndexRange(); - } - const int64_t first = this->first(); - const int64_t last = this->last(); - return IndexRange::from_begin_end_inclusive(first, last); -} - inline int64_t IndexMask::first() const { BLI_assert(indices_num_ > 0); @@ -1046,11 +926,6 @@ inline Vector, N> IndexMask::to_spans return segments; } -inline bool operator!=(const IndexMask &a, const IndexMask &b) -{ - return !(a == b); -} - } // namespace blender::index_mask namespace blender { diff --git a/source/blender/blenlib/BLI_index_mask_expression.hh b/source/blender/blenlib/BLI_index_mask_expression.hh deleted file mode 100644 index a11875349f7..00000000000 --- a/source/blender/blenlib/BLI_index_mask_expression.hh +++ /dev/null @@ -1,94 +0,0 @@ -/* SPDX-FileCopyrightText: 2024 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -#pragma once - -#include "BLI_index_mask.hh" -#include "BLI_resource_scope.hh" - -namespace blender::index_mask { - -struct AtomicExpr; -struct UnionExpr; -struct IntersectionExpr; -struct DifferenceExpr; - -struct Expr { - enum class Type { - Atomic, - Union, - Intersection, - Difference, - }; - - Type type; - int index; - Vector terms; - - int expression_array_size() const; - - const AtomicExpr &as_atomic() const; - const UnionExpr &as_union() const; - const IntersectionExpr &as_intersection() const; - const DifferenceExpr &as_difference() const; -}; - -struct AtomicExpr : public Expr { - const IndexMask *mask; -}; - -struct UnionExpr : public Expr {}; - -struct IntersectionExpr : public Expr {}; - -struct DifferenceExpr : public Expr {}; - -class ExprBuilder { - private: - ResourceScope scope_; - int expr_count_ = 0; - - public: - using Term = std::variant; - - const UnionExpr &merge(const Span terms); - const DifferenceExpr &subtract(const Term &main_term, const Span subtract_terms); - const IntersectionExpr &intersect(const Span terms); - - private: - const Expr &term_to_expr(const Term &term); -}; - -IndexMask evaluate_expression(const Expr &expression, IndexMaskMemory &memory); - -inline int Expr::expression_array_size() const -{ - return this->index + 1; -} - -inline const AtomicExpr &Expr::as_atomic() const -{ - BLI_assert(this->type == Type::Atomic); - return static_cast(*this); -} - -inline const UnionExpr &Expr::as_union() const -{ - BLI_assert(this->type == Type::Union); - return static_cast(*this); -} - -inline const IntersectionExpr &Expr::as_intersection() const -{ - BLI_assert(this->type == Type::Intersection); - return static_cast(*this); -} - -inline const DifferenceExpr &Expr::as_difference() const -{ - BLI_assert(this->type == Type::Difference); - return static_cast(*this); -} - -} // namespace blender::index_mask diff --git a/source/blender/blenlib/BLI_index_range.hh b/source/blender/blenlib/BLI_index_range.hh index 933be715f75..316dda821a1 100644 --- a/source/blender/blenlib/BLI_index_range.hh +++ b/source/blender/blenlib/BLI_index_range.hh @@ -41,7 +41,6 @@ #include #include "BLI_assert.h" -#include "BLI_random_access_iterator_mixin.hh" namespace blender { @@ -60,42 +59,19 @@ class IndexRange { BLI_assert(size >= 0); } - constexpr IndexRange(const int64_t start, const int64_t size) : start_(start), size_(size) + constexpr IndexRange(int64_t start, int64_t size) : start_(start), size_(size) { BLI_assert(start >= 0); BLI_assert(size >= 0); } - constexpr static IndexRange from_begin_size(const int64_t begin, const int64_t size) - { - return IndexRange(begin, size); - } - - constexpr static IndexRange from_begin_end(const int64_t begin, const int64_t end) - { - return IndexRange(begin, end - begin); - } - - constexpr static IndexRange from_begin_end_inclusive(const int64_t begin, const int64_t last) - { - return IndexRange(begin, last - begin + 1); - } - - constexpr static IndexRange from_end_size(const int64_t end, const int64_t size) - { - return IndexRange(end - size, size); - } - - constexpr static IndexRange from_single(const int64_t index) - { - return IndexRange(index, 1); - } - - class Iterator : public iterator::RandomAccessIteratorMixin { + class Iterator { public: + using iterator_category = std::forward_iterator_tag; using value_type = int64_t; using pointer = const int64_t *; - using reference = int64_t; + using reference = const int64_t &; + using difference_type = std::ptrdiff_t; private: int64_t current_; @@ -103,12 +79,35 @@ class IndexRange { public: constexpr explicit Iterator(int64_t current) : current_(current) {} - constexpr int64_t operator*() const + constexpr Iterator &operator++() { - return current_; + current_++; + return *this; } - const int64_t &iter_prop() const + constexpr Iterator operator++(int) + { + Iterator copied_iterator = *this; + ++(*this); + return copied_iterator; + } + + constexpr friend bool operator!=(const Iterator &a, const Iterator &b) + { + return a.current_ != b.current_; + } + + constexpr friend bool operator==(const Iterator &a, const Iterator &b) + { + return a.current_ == b.current_; + } + + constexpr friend int64_t operator-(const Iterator &a, const Iterator &b) + { + return a.current_ - b.current_; + } + + constexpr int64_t operator*() const { return current_; } @@ -167,14 +166,6 @@ class IndexRange { return size_ == 0; } - /** - * Creates a new index range with the same beginning but a different end. - */ - constexpr IndexRange with_new_end(const int64_t new_end) const - { - return IndexRange::from_begin_end(start_, new_end); - } - /** * Create a new range starting at the end of the current one. */ diff --git a/source/blender/blenlib/BLI_lasso_2d.h b/source/blender/blenlib/BLI_lasso_2d.h new file mode 100644 index 00000000000..4a15eba51dd --- /dev/null +++ b/source/blender/blenlib/BLI_lasso_2d.h @@ -0,0 +1,33 @@ +/* SPDX-FileCopyrightText: 2001-2002 NaN Holding BV. All rights reserved. + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +#pragma once + +/** \file + * \ingroup bli + */ + +#ifdef __cplusplus +extern "C" { +#endif + +struct rcti; + +void BLI_lasso_boundbox(struct rcti *rect, const int mcoords[][2], unsigned int mcoords_len); +bool BLI_lasso_is_point_inside( + const int mcoords[][2], unsigned int mcoords_len, int sx, int sy, int error_value); +/** + * Edge version for lasso select. We assume bound-box check was done. + */ +bool BLI_lasso_is_edge_inside(const int mcoords[][2], + unsigned int mcoords_len, + int x0, + int y0, + int x1, + int y1, + int error_value); + +#ifdef __cplusplus +} +#endif diff --git a/source/blender/blenlib/BLI_lasso_2d.hh b/source/blender/blenlib/BLI_lasso_2d.hh deleted file mode 100644 index cad445cdbca..00000000000 --- a/source/blender/blenlib/BLI_lasso_2d.hh +++ /dev/null @@ -1,25 +0,0 @@ -/* SPDX-FileCopyrightText: 2001-2002 NaN Holding BV. All rights reserved. - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -#pragma once - -/** \file - * \ingroup bli - */ - -#include "BLI_math_vector_types.hh" -#include "BLI_span.hh" - -struct rcti; - -void BLI_lasso_boundbox(rcti *rect, blender::Span mcoords); -bool BLI_lasso_is_point_inside(blender::Span mcoords, - int sx, - int sy, - int error_value); -/** - * Edge version for lasso select. We assume bound-box check was done. - */ -bool BLI_lasso_is_edge_inside( - blender::Span mcoords, int x0, int y0, int x1, int y1, int error_value); diff --git a/source/blender/blenlib/BLI_linear_allocator.hh b/source/blender/blenlib/BLI_linear_allocator.hh index 5c8cb344367..36151998e8c 100644 --- a/source/blender/blenlib/BLI_linear_allocator.hh +++ b/source/blender/blenlib/BLI_linear_allocator.hh @@ -213,38 +213,6 @@ template class LinearAllocator : NonCopya this->provide_buffer(aligned_buffer.ptr(), Size); } - /** - * Some algorithms can be implemented more efficiently by over-allocating the destination memory - * a bit. This allows the algorithm not to worry about having enough memory. Generally, this can - * be a useful strategy if the actual required memory is not known in advance, but an upper bound - * can be found. Ideally, one can free the over-allocated memory in the end again to reduce - * memory consumption. - * - * A linear allocator generally does allow freeing any memory. However, there is one exception. - * One can free the end of the last allocation (but not any previous allocation). While uses of - * this approach are quite limited, it's still the best option in some situations. - */ - void free_end_of_previous_allocation(const int64_t original_allocation_size, - const void *free_after) - { - /* If the original allocation size was large, it might have been separately allocated. In this - * case, we can't free the end of it anymore. */ - if (original_allocation_size <= large_buffer_threshold) { - const int64_t new_begin = uintptr_t(free_after); - BLI_assert(new_begin <= current_begin_); -#ifndef NDEBUG - /* This condition is not really necessary but it helps finding the cases where memory was - * freed. */ - const int64_t freed_bytes_num = current_begin_ - new_begin; - if (freed_bytes_num > 0) { - current_begin_ = new_begin; - } -#else - current_begin_ = new_begin; -#endif - } - } - /** * This allocator takes ownership of the buffers owned by `other`. Therefor, when `other` is * destructed, memory allocated using it is not freed. diff --git a/source/blender/blenlib/BLI_linear_allocator_chunked_list.hh b/source/blender/blenlib/BLI_linear_allocator_chunked_list.hh deleted file mode 100644 index d982a024efd..00000000000 --- a/source/blender/blenlib/BLI_linear_allocator_chunked_list.hh +++ /dev/null @@ -1,190 +0,0 @@ -/* SPDX-FileCopyrightText: 2024 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -#pragma once - -#include - -#include "BLI_linear_allocator.hh" -#include "BLI_struct_equality_utils.hh" -#include "BLI_utility_mixins.hh" - -namespace blender::linear_allocator { - -/** - * The list is a linked list of segments containing multiple elements. The capacity of each segment - * is a template parameter because that removes the need to store it for every segment. - */ -template struct ChunkedListSegment { - /** Pointer to the next segment in the list. */ - ChunkedListSegment *next = nullptr; - /** - * Number of constructed elements in this segment. The constructed elements are always at the - * beginning of the array below. - */ - int64_t size = 0; - /** - * The memory that actually contains the values in the end. The values are constructed and - * destructed by higher level code. - */ - std::array, Capacity> values; -}; - -/** - * This is a special purpose container data structure that can be used to efficiently gather many - * elements into many (small) lists for later retrieval. Insertion order is *not* maintained. - * - * To use this data structure, one has to have a separate #LinearAllocator which is passed to the - * `append` function. This allows the same allocator to be used by many lists. Passing it into the - * append function also removes the need to store the allocator pointer in every list. - * - * It is an improvement over #Vector because it does not require any reallocations. #VectorList - * could also be used to overcome the reallocation issue. - * - * This data structure is also an improvement over #VectorList because: - * - It has a much lower memory footprint when empty. - * - Allows using a #LinearAllocator for all allocations, without storing the pointer to it in - * every vector. - * - It wastes less memory due to over-allocations. - */ -template class ChunkedList : NonCopyable { - private: - using Segment = ChunkedListSegment; - Segment *current_segment_ = nullptr; - - public: - ChunkedList() = default; - - ChunkedList(ChunkedList &&other) - { - current_segment_ = other.current_segment_; - other.current_segment_ = nullptr; - } - - ~ChunkedList() - { - /* This code assumes that the #ChunkedListSegment does not have to be destructed if the - * contained type is trivially destructible. */ - static_assert(std::is_trivially_destructible_v>); - if constexpr (!std::is_trivially_destructible_v) { - for (Segment *segment = current_segment_; segment; segment = segment->next) { - for (const int64_t i : IndexRange(segment->size)) { - T &value = *segment->values[i]; - std::destroy_at(&value); - } - } - } - } - - ChunkedList &operator=(ChunkedList &&other) - { - if (this == &other) { - return *this; - } - std::destroy_at(this); - new (this) ChunkedList(std::move(other)); - return *this; - } - - /** - * Add an element to the list. The insertion order is not maintained. The given allocator is used - * to allocate any extra memory that may be needed. - */ - void append(LinearAllocator<> &allocator, const T &value) - { - this->append_as(allocator, value); - } - - void append(LinearAllocator<> &allocator, T &&value) - { - this->append_as(allocator, std::move(value)); - } - - template void append_as(LinearAllocator<> &allocator, Args &&...args) - { - if (current_segment_ == nullptr || current_segment_->size == SegmentCapacity) { - /* Allocate a new segment if necessary. */ - static_assert(std::is_trivially_destructible_v); - Segment *new_segment = allocator.construct().release(); - new_segment->next = current_segment_; - current_segment_ = new_segment; - } - T *value = &*current_segment_->values[current_segment_->size++]; - new (value) T(std::forward(args)...); - } - - class ConstIterator { - private: - const Segment *segment_ = nullptr; - int64_t index_ = 0; - - public: - ConstIterator(const Segment *segment, int64_t index = 0) : segment_(segment), index_(index) {} - - ConstIterator &operator++() - { - index_++; - if (index_ == segment_->size) { - segment_ = segment_->next; - index_ = 0; - } - return *this; - } - - const T &operator*() const - { - return *segment_->values[index_]; - } - - BLI_STRUCT_EQUALITY_OPERATORS_2(ConstIterator, segment_, index_) - }; - - class MutableIterator { - private: - Segment *segment_ = nullptr; - int64_t index_ = 0; - - public: - MutableIterator(Segment *segment, int64_t index = 0) : segment_(segment), index_(index) {} - - MutableIterator &operator++() - { - index_++; - if (index_ == segment_->size) { - segment_ = segment_->next; - index_ = 0; - } - return *this; - } - - T &operator*() - { - return *segment_->values[index_]; - } - - BLI_STRUCT_EQUALITY_OPERATORS_2(MutableIterator, segment_, index_) - }; - - ConstIterator begin() const - { - return ConstIterator(current_segment_, 0); - } - - ConstIterator end() const - { - return ConstIterator(nullptr, 0); - } - - MutableIterator begin() - { - return MutableIterator(current_segment_, 0); - } - - MutableIterator end() - { - return MutableIterator(nullptr, 0); - } -}; - -} // namespace blender::linear_allocator diff --git a/source/blender/blenlib/BLI_math_basis_types.hh b/source/blender/blenlib/BLI_math_basis_types.hh index 4bb4afbd3fd..49ed8d4a86c 100644 --- a/source/blender/blenlib/BLI_math_basis_types.hh +++ b/source/blender/blenlib/BLI_math_basis_types.hh @@ -61,11 +61,9 @@ class Axis { constexpr Axis(const Value axis) : axis_(axis){}; /** Convert an uppercase axis character 'X', 'Y' or 'Z' to an enum value. */ - constexpr static Axis from_char(char axis_char) + constexpr explicit Axis(char axis_char) : axis_(static_cast(axis_char - 'X')) { - const Axis axis = static_cast(axis_char - 'X'); - BLI_assert(int(Value::X) <= axis.as_int() && axis.as_int() <= int(Value::Z)); - return axis; + BLI_assert(Value::X <= axis_ && axis_ <= Value::Z); } /** Allow casting from DNA enums stored as short / int. */ @@ -182,12 +180,12 @@ class AxisSigned { friend std::ostream &operator<<(std::ostream &stream, const AxisSigned axis); }; -constexpr bool operator<=(const Axis::Value a, const Axis::Value b) +constexpr static bool operator<=(const Axis::Value a, const Axis::Value b) { return int(a) <= int(b); } -constexpr bool operator<=(const AxisSigned::Value a, const AxisSigned::Value b) +constexpr static bool operator<=(const AxisSigned::Value a, const AxisSigned::Value b) { return int(a) <= int(b); } diff --git a/source/blender/blenlib/BLI_math_interp.hh b/source/blender/blenlib/BLI_math_interp.hh index b000b5301dc..2354acfec40 100644 --- a/source/blender/blenlib/BLI_math_interp.hh +++ b/source/blender/blenlib/BLI_math_interp.hh @@ -249,7 +249,7 @@ void interpolate_cubic_mitchell_fl( #define EWA_MAXIDX 255 extern const float EWA_WTS[EWA_MAXIDX + 1]; -using ewa_filter_read_pixel_cb = void (*)(void *userdata, int x, int y, float result[4]); +typedef void (*ewa_filter_read_pixel_cb)(void *userdata, int x, int y, float result[4]); void BLI_ewa_imp2radangle( float A, float B, float C, float F, float *a, float *b, float *th, float *ecc); diff --git a/source/blender/blenlib/BLI_math_matrix.h b/source/blender/blenlib/BLI_math_matrix.h index 2b6eb7c5c90..2846d315db4 100644 --- a/source/blender/blenlib/BLI_math_matrix.h +++ b/source/blender/blenlib/BLI_math_matrix.h @@ -621,8 +621,7 @@ void BLI_space_transform_apply_normal(const struct SpaceTransform *data, float n void BLI_space_transform_invert_normal(const struct SpaceTransform *data, float no[3]); #define BLI_SPACE_TRANSFORM_SETUP(data, local, target) \ - BLI_space_transform_from_matrices( \ - (data), (local)->object_to_world().ptr(), (target)->object_to_world().ptr()) + BLI_space_transform_from_matrices((data), (local)->object_to_world, (target)->object_to_world) /** \} */ diff --git a/source/blender/blenlib/BLI_math_matrix_types.hh b/source/blender/blenlib/BLI_math_matrix_types.hh index 1b45896877d..978d30466f6 100644 --- a/source/blender/blenlib/BLI_math_matrix_types.hh +++ b/source/blender/blenlib/BLI_math_matrix_types.hh @@ -364,6 +364,24 @@ struct alignas(Alignment) MatBase : public vec_struct_base, N return *this; } + /** Multiply two matrices using matrix multiplication. */ + MatBase operator*(const MatBase &b) const + { + const MatBase &a = *this; + /* This is the reference implementation. + * Might be overloaded with vectorized / optimized code. */ + /* TODO(fclem): It should be possible to return non-square matrices when multiplying against + * MatBase. */ + MatBase result{}; + unroll([&](auto j) { + unroll([&](auto i) { + /* Same as dot product, but avoid dependency on vector math. */ + unroll([&](auto k) { result[j][i] += a[k][i] * b[j][k]; }); + }); + }); + return result; + } + /** Multiply each component by a scalar. */ friend MatBase operator*(const MatBase &a, T b) { @@ -470,17 +488,17 @@ struct alignas(Alignment) MatBase : public vec_struct_base, N friend std::ostream &operator<<(std::ostream &stream, const MatBase &mat) { stream << "(\n"; - unroll([&](auto i) { + unroll([&](auto i) { stream << "("; - unroll([&](auto j) { + unroll([&](auto j) { /** NOTE: j and i are swapped to follow mathematical convention. */ stream << mat[j][i]; - if (j < NumCol - 1) { + if (j < NumRow - 1) { stream << ", "; } }); stream << ")"; - if (i < NumRow - 1) { + if (i < NumCol - 1) { stream << ","; } stream << "\n"; @@ -629,6 +647,34 @@ struct MatView : NonCopyable, NonMovable { return result; } + /** Multiply two matrices using matrix multiplication. */ + template + MatBase operator*(const MatView &b) const + { + const MatView &a = *this; + /* This is the reference implementation. + * Might be overloaded with vectorized / optimized code. */ + MatBase result{}; + unroll([&](auto j) { + unroll([&](auto i) { + /* Same as dot product, but avoid dependency on vector math. */ + unroll([&](auto k) { result[j][i] += a[k][i] * b[j][k]; }); + }); + }); + return result; + } + MatT operator*(const MatT &b) const { return *this * b.view(); @@ -886,120 +932,6 @@ struct MutableMatView } }; -namespace detail { - -/** Multiply two matrices using matrix multiplication. */ -template -MatBase matrix_mul_impl(const MatA &a, const MatB &b) -{ - static_assert(A_NumCol == B_NumRow); - /* This is the reference implementation. - * Might be overloaded with vectorized / optimized code. */ - MatBase result{}; - unroll([&](auto j) { - unroll([&](auto i) { - /* Same as dot product, but avoid dependency on vector math. */ - unroll([&](auto k) { result[j][i] += a[k][i] * b[j][k]; }); - }); - }); - return result; -} - -} // namespace detail - -template -MatBase operator*(const MatBase &a, - const MatBase &b) -{ - return detail::matrix_mul_impl(a, b); -} - -template -MatBase operator*(const MatView &a, - const MatView &b) -{ - return detail::matrix_mul_impl(a, b); -} -template -MatBase operator*(const MatView &a, - const MatBase &b) -{ - return detail::matrix_mul_impl(a, b); -} - -template -MatBase operator*(const MatBase &a, - const MatView &b) -{ - return detail::matrix_mul_impl(a, b); -} - using float2x2 = MatBase; using float2x3 = MatBase; using float2x4 = MatBase; @@ -1026,12 +958,12 @@ using double4x3 = MatBase; using double4x4 = MatBase; /* Specialization for SSE optimization. */ -template<> float4x4 operator*(const float4x4 &a, const float4x4 &b); -template<> float3x3 operator*(const float3x3 &a, const float3x3 &b); +template<> float4x4 float4x4::operator*(const float4x4 &b) const; +template<> float3x3 float3x3::operator*(const float3x3 &b) const; -extern template float2x2 operator*(const float2x2 &a, const float2x2 &b); -extern template double2x2 operator*(const double2x2 &a, const double2x2 &b); -extern template double3x3 operator*(const double3x3 &a, const double3x3 &b); -extern template double4x4 operator*(const double4x4 &a, const double4x4 &b); +extern template float2x2 float2x2::operator*(const float2x2 &b) const; +extern template double2x2 double2x2::operator*(const double2x2 &b) const; +extern template double3x3 double3x3::operator*(const double3x3 &b) const; +extern template double4x4 double4x4::operator*(const double4x4 &b) const; } // namespace blender diff --git a/source/blender/blenlib/BLI_offset_indices.hh b/source/blender/blenlib/BLI_offset_indices.hh index 825983957bd..3c9c5575103 100644 --- a/source/blender/blenlib/BLI_offset_indices.hh +++ b/source/blender/blenlib/BLI_offset_indices.hh @@ -66,14 +66,16 @@ template class OffsetIndices { BLI_assert(index < offsets_.size() - 1); const int64_t begin = offsets_[index]; const int64_t end = offsets_[index + 1]; - return IndexRange::from_begin_end(begin, end); + const int64_t size = end - begin; + return IndexRange(begin, size); } IndexRange operator[](const IndexRange indices) const { const int64_t begin = offsets_[indices.start()]; const int64_t end = offsets_[indices.one_after_last()]; - return IndexRange::from_begin_end(begin, end); + const int64_t size = end - begin; + return IndexRange(begin, size); } /** diff --git a/source/blender/blenlib/BLI_offset_span.hh b/source/blender/blenlib/BLI_offset_span.hh index 4978e1e1f60..747d0be3510 100644 --- a/source/blender/blenlib/BLI_offset_span.hh +++ b/source/blender/blenlib/BLI_offset_span.hh @@ -4,7 +4,6 @@ #pragma once -#include "BLI_random_access_iterator_mixin.hh" #include "BLI_span.hh" namespace blender { @@ -71,12 +70,7 @@ template class OffsetSpan { return {offset_, data_.slice(start, size)}; } - class Iterator : public iterator::RandomAccessIteratorMixin { - public: - using value_type = T; - using pointer = const T *; - using reference = T; - + class Iterator { private: T offset_; const BaseT *data_; @@ -84,14 +78,21 @@ template class OffsetSpan { public: Iterator(const T offset, const BaseT *data) : offset_(offset), data_(data) {} + Iterator &operator++() + { + data_++; + return *this; + } + T operator*() const { return T(*data_) + offset_; } - const BaseT *const &iter_prop() const + friend bool operator!=(const Iterator &a, const Iterator &b) { - return data_; + BLI_assert(a.offset_ == b.offset_); + return a.data_ != b.data_; } }; diff --git a/source/blender/blenlib/BLI_random_access_iterator_mixin.hh b/source/blender/blenlib/BLI_random_access_iterator_mixin.hh deleted file mode 100644 index d8ac886a2af..00000000000 --- a/source/blender/blenlib/BLI_random_access_iterator_mixin.hh +++ /dev/null @@ -1,133 +0,0 @@ -/* SPDX-FileCopyrightText: 2024 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -#pragma once - -#include - -namespace blender::iterator { - -/** - * Simplifies implementing a random-access-iterator. - * - * The actual iterator should derive from this class publicly. Additionally, it has to provide a - * const `iter_prop` method which returns a reference to the internal property that corresponds to - * the current position. This is typically a pointer or an index. - * - * Implementing some random-access-iterator is generally quite simple but requires a lot of - * boilerplate code because algorithms expect many operators to work on the iterator type. - * They are expected to behave similarly to pointers and thus have to implement many of the same - * operators. - */ -template class RandomAccessIteratorMixin { - public: - using iterator_category = std::random_access_iterator_tag; - using difference_type = std::ptrdiff_t; - - constexpr friend Derived &operator++(Derived &a) - { - ++a.iter_prop_mutable(); - return a; - } - - constexpr friend Derived operator++(Derived &a, int) - { - Derived copy = a; - ++a; - return copy; - } - - constexpr friend Derived &operator--(Derived &a) - { - --a.iter_prop_mutable(); - return a; - } - - constexpr friend Derived operator--(Derived &a, int) - { - Derived copy = a; - --a; - return copy; - } - - constexpr friend Derived &operator+=(Derived &a, const std::ptrdiff_t n) - { - a.iter_prop_mutable() += n; - return a; - } - - constexpr friend Derived &operator-=(Derived &a, const std::ptrdiff_t n) - { - a.iter_prop_mutable() -= n; - return a; - } - - constexpr friend Derived operator+(const Derived &a, const std::ptrdiff_t n) - { - Derived copy = a; - copy.iter_prop_mutable() += n; - return copy; - } - - constexpr friend Derived operator-(const Derived &a, const std::ptrdiff_t n) - { - Derived copy = a; - copy.iter_prop_mutable() -= n; - return copy; - } - - constexpr friend auto operator-(const Derived &a, const Derived &b) - { - return a.iter_prop() - b.iter_prop(); - } - - constexpr friend bool operator!=(const Derived &a, const Derived &b) - { - return a.iter_prop() != b.iter_prop(); - } - - constexpr friend bool operator==(const Derived &a, const Derived &b) - { - return a.iter_prop() == b.iter_prop(); - } - - constexpr friend bool operator<(const Derived &a, const Derived &b) - { - return a.iter_prop() < b.iter_prop(); - } - - constexpr friend bool operator>(const Derived &a, const Derived &b) - { - return a.iter_prop() > b.iter_prop(); - } - - constexpr friend bool operator<=(const Derived &a, const Derived &b) - { - return a.iter_prop() <= b.iter_prop(); - } - - constexpr friend bool operator>=(const Derived &a, const Derived &b) - { - return a.iter_prop() >= b.iter_prop(); - } - - constexpr decltype(auto) operator[](const std::ptrdiff_t i) - { - return *(*static_cast(this) + i); - } - - constexpr decltype(auto) operator[](const std::ptrdiff_t i) const - { - return *(*static_cast(this) + i); - } - - auto &iter_prop_mutable() - { - const auto &const_iter_prop = static_cast(this)->iter_prop(); - return const_cast> &>( - const_iter_prop); - } -}; - -} // namespace blender::iterator diff --git a/source/blender/blenlib/BLI_serialize.hh b/source/blender/blenlib/BLI_serialize.hh index e49b4123196..19376e5765b 100644 --- a/source/blender/blenlib/BLI_serialize.hh +++ b/source/blender/blenlib/BLI_serialize.hh @@ -198,7 +198,7 @@ class StringValue : public Value { std::string string_; public: - StringValue(std::string string) : Value(eValueType::String), string_(std::move(string)) {} + StringValue(const StringRef string) : Value(eValueType::String), string_(string) {} const std::string &value() const { @@ -206,12 +206,44 @@ class StringValue : public Value { } }; -class ArrayValue : public Value { - Vector> values_; +/** + * Template for arrays and objects. + * + * Both ArrayValue and DictionaryValue store their values in an array. + */ +template< + /** The container type where the elements are stored in. */ + typename Container, + + /** ValueType representing the value (object/array). */ + eValueType V, + + /** Type of the data inside the container. */ + typename ContainerItem = typename Container::value_type> +class ContainerValue : public Value { + public: + using Items = Container; + using Item = ContainerItem; + + private: + Container inner_value_; public: - ArrayValue() : Value(eValueType::Array) {} + ContainerValue() : Value(V) {} + const Container &elements() const + { + return inner_value_; + } + + Container &elements() + { + return inner_value_; + } +}; + +class ArrayValue : public ContainerValue>, eValueType::Array> { + public: void append(std::shared_ptr value); void append_bool(bool value); void append_int(int value); @@ -220,38 +252,32 @@ class ArrayValue : public Value { void append_null(); std::shared_ptr append_dict(); std::shared_ptr append_array(); - - Span> elements() const - { - return values_; - } }; +/** + * Internal storage type for DictionaryValue. + * + * The elements are stored as an key value pair. The value is a shared pointer so it can be shared + * when using `DictionaryValue::create_lookup`. + */ +using DictionaryElementType = std::pair>; + /** * Object is a key-value container where the key must be a std::string. * Internally it is stored in a blender::Vector to ensure the order of keys. */ -class DictionaryValue : public Value { +class DictionaryValue + : public ContainerValue, eValueType::Dictionary> { public: - /** - * Elements are stored as an key value pair. The value is a shared pointer so it can be - * shared when using `DictionaryValue::create_lookup`. - */ - using Item = std::pair>; - using Lookup = Map>; - - private: - Vector values_; - - public: - DictionaryValue() : Value(eValueType::Dictionary) {} + using LookupValue = std::shared_ptr; + using Lookup = Map; /** * Return a lookup map to quickly lookup by key. * * The lookup is owned by the caller. */ - Lookup create_lookup() const; + const Lookup create_lookup() const; const std::shared_ptr *lookup(const StringRef key) const; std::optional lookup_str(const StringRef key) const; @@ -259,10 +285,6 @@ class DictionaryValue : public Value { std::optional lookup_double(const StringRef key) const; const DictionaryValue *lookup_dict(const StringRef key) const; const ArrayValue *lookup_array(const StringRef key) const; - Span elements() const - { - return values_; - } void append(std::string key, std::shared_ptr value); void append_int(std::string key, int64_t value); diff --git a/source/blender/blenlib/BLI_shared_cache.hh b/source/blender/blenlib/BLI_shared_cache.hh index f090d382fe3..5f715ef4191 100644 --- a/source/blender/blenlib/BLI_shared_cache.hh +++ b/source/blender/blenlib/BLI_shared_cache.hh @@ -13,14 +13,14 @@ namespace blender { * saving unnecessary computation by making a calculated value accessible from any object that * shares the cache. Unlike `CacheMutex`, the cached data is embedded inside of this object. * - * When data is copied (copy-on-evaluation before changing a mesh, for example), the cache is - * shared, allowing its calculation on either the source or original to make the result available - * on both objects. As soon as either object is changed in a way that invalidates the cache, the - * data is "un-shared", and they will no-longer influence each other. + * When data is copied (copy-on-write before changing a mesh, for example), the cache is shared, + * allowing its calculation on either the source or original to make the result available on both + * objects. As soon as either object is changed in a way that invalidates the cache, the data is + * "un-shared", and they will no-longer influence each other. * - * One important use case is a typical copy-on-evaluation update loop of a persistent geometry - * data-block in `Main`. Even if bounds are only calculated on the evaluated *copied* geometry, if - * nothing changes them, they only need to be calculated on the first evaluation, because the same + * One important use case is a typical CoW update loop of a persistent geometry data-block in + * `Main`. Even if bounds are only calculated on the evaluated *copied* geometry, if nothing + * changes them, they only need to be calculated on the first evaluation, because the same * evaluated bounds are also accessible from the original geometry. * * The cache is implemented with a shared pointer, so it is relatively cheap, but to avoid diff --git a/source/blender/blenlib/BLI_simd.h b/source/blender/blenlib/BLI_simd.h index 885966d2cdf..3d348b35e88 100644 --- a/source/blender/blenlib/BLI_simd.h +++ b/source/blender/blenlib/BLI_simd.h @@ -10,9 +10,7 @@ * SIMD instruction support. */ -// TODO: Re-enable this once blenlib is converted to C++ -#if (defined(__ARM_NEON) /* || (defined(_M_ARM64) && defined(_MSC_VER))*/) && \ - defined(WITH_SSE2NEON) +#if defined(__ARM_NEON) && defined(WITH_SSE2NEON) /* SSE/SSE2 emulation on ARM Neon. Match SSE precision. */ # if !defined(SSE2NEON_PRECISE_MINMAX) # define SSE2NEON_PRECISE_MINMAX 1 diff --git a/source/blender/blenlib/BLI_strict_flags.h b/source/blender/blenlib/BLI_strict_flags.h index 112156c2bc3..e97bd5f0278 100644 --- a/source/blender/blenlib/BLI_strict_flags.h +++ b/source/blender/blenlib/BLI_strict_flags.h @@ -6,12 +6,8 @@ /** \file * \ingroup bli - * Strict compiler flags for areas of code we want + * \brief Strict compiler flags for areas of code we want * to ensure don't do conversions without us knowing about it. - * - * \note Typically this include should be ordered as the last include in a C/C++ file - * otherwise it can cause warnings in any includes after it which aren't expected - * to use strict warnings. */ #ifdef __GNUC__ diff --git a/source/blender/blenlib/BLI_string_ref.hh b/source/blender/blenlib/BLI_string_ref.hh index 9f7c6402cda..40146961b10 100644 --- a/source/blender/blenlib/BLI_string_ref.hh +++ b/source/blender/blenlib/BLI_string_ref.hh @@ -105,8 +105,6 @@ class StringRefBase { /** * References a null-terminated const char array. - * - * StringRefNull can be compared with StringRef and StringRefNull. */ class StringRefNull : public StringRefBase { @@ -122,8 +120,6 @@ class StringRefNull : public StringRefBase { /** * References a const char array. It might not be null terminated. - * - * StringRef can be compared with StringRef and StringRefNull. */ class StringRef : public StringRefBase { public: @@ -592,10 +588,7 @@ inline std::string operator+(StringRef a, StringRef b) /* This does not compare StringRef and std::string_view, because of ambiguous overloads. This is * not a problem when std::string_view is only used at api boundaries. To compare a StringRef and a * std::string_view, one should convert the std::string_view to StringRef (which is very cheap). - * Ideally, we only use StringRef in our code to avoid this problem altogether. - * - * NOTE: these functions are also suitable for StringRefNull comparisons, as these are - * implicitly converted to StringRef by the compiler. */ + * Ideally, we only use StringRef in our code to avoid this problem altogether. */ constexpr bool operator==(StringRef a, StringRef b) { return std::string_view(a) == std::string_view(b); diff --git a/source/blender/blenlib/BLI_string_search.hh b/source/blender/blenlib/BLI_string_search.hh index fc694d6c093..ccbf766e100 100644 --- a/source/blender/blenlib/BLI_string_search.hh +++ b/source/blender/blenlib/BLI_string_search.hh @@ -98,7 +98,7 @@ template class StringSearch : private StringSearchBase { * \param weight: Can be used to customize the order when multiple items have the same match * score. */ - void add(const StringRef str, T *user_data, const int weight = 0) + void add(const StringRefNull str, T *user_data, const int weight = 0) { this->add_impl(str, (void *)user_data, weight); } diff --git a/source/blender/blenlib/BLI_system.h b/source/blender/blenlib/BLI_system.h index 4d78b425500..ab2ef59ce54 100644 --- a/source/blender/blenlib/BLI_system.h +++ b/source/blender/blenlib/BLI_system.h @@ -15,7 +15,7 @@ extern "C" { */ int BLI_cpu_support_sse2(void); -int BLI_cpu_support_sse42(void); +int BLI_cpu_support_sse41(void); void BLI_system_backtrace(FILE *fp); /** Get CPU brand, result is to be MEM_freeN()-ed. */ diff --git a/source/blender/blenlib/BLI_task.hh b/source/blender/blenlib/BLI_task.hh index 865db72639b..fe88d3cfec4 100644 --- a/source/blender/blenlib/BLI_task.hh +++ b/source/blender/blenlib/BLI_task.hh @@ -35,7 +35,6 @@ #include "BLI_function_ref.hh" #include "BLI_index_range.hh" #include "BLI_lazy_threading.hh" -#include "BLI_span.hh" #include "BLI_utildefines.h" namespace blender { @@ -69,10 +68,6 @@ namespace detail { void parallel_for_impl(IndexRange range, int64_t grain_size, FunctionRef function); -void parallel_for_weighted_impl(IndexRange range, - int64_t grain_size, - FunctionRef function, - FunctionRef)> task_sizes_fn); } // namespace detail template @@ -88,40 +83,6 @@ inline void parallel_for(IndexRange range, int64_t grain_size, const Function &f detail::parallel_for_impl(range, grain_size, function); } -/** - * Almost like `parallel_for` but allows passing in a function that estimates the amount of work - * per index. This allows distributing work to threads more evenly. - * - * Using this function makes sense when the work load for each index can differ significantly, so - * that it is impossible to determine a good constant grain size. - * - * This function has a bit more overhead than the unweighted #parallel_for. If that is noticeable - * highly depends on the use-case. So the overhead should be measured when trying to use this - * function for cases where all tasks may be very small. - * - * \param task_size_fn: Gets the task index as input and computes that tasks size. - * \param grain_size: Determines approximately how large a combined task should be. For example, if - * the grain size is 100, then 5 tasks of size 20 fit into it. - */ -template -inline void parallel_for_weighted(IndexRange range, - int64_t grain_size, - const Function &function, - const TaskSizeFn &task_size_fn) -{ - if (range.is_empty()) { - return; - } - detail::parallel_for_weighted_impl( - range, grain_size, function, [&](const IndexRange sub_range, MutableSpan r_sizes) { - for (const int64_t i : sub_range.index_range()) { - const int64_t task_size = task_size_fn(sub_range[i]); - BLI_assert(task_size >= 0); - r_sizes[i] = task_size; - } - }); -} - /** * Move the sub-range boundaries down to the next aligned index. The "global" begin and end * remain fixed though. @@ -140,7 +101,7 @@ inline IndexRange align_sub_range(const IndexRange unaligned_range, const int64_t aligned_end = unaligned_end == global_end ? unaligned_end : std::max(global_begin, unaligned_end & alignment_mask); - const IndexRange aligned_range = IndexRange::from_begin_end(aligned_begin, aligned_end); + const IndexRange aligned_range{aligned_begin, aligned_end - aligned_begin}; return aligned_range; } diff --git a/source/blender/blenlib/BLI_tempfile.h b/source/blender/blenlib/BLI_tempfile.h index 2b537af7942..c62e8b36635 100644 --- a/source/blender/blenlib/BLI_tempfile.h +++ b/source/blender/blenlib/BLI_tempfile.h @@ -8,7 +8,6 @@ #pragma once -#include "BLI_compiler_attrs.h" #include "BLI_sys_types.h" #ifdef __cplusplus @@ -16,23 +15,21 @@ extern "C" { #endif /** - * Sets `tempdir` from `dirpath` when it's a valid directory. + * Sets `temp_directory` from `dirpath` when it's a valid directory. * Simple sanitize operations are performed and a trailing slash is ensured. */ -bool BLI_temp_directory_path_copy_if_valid(char *tempdir, - const size_t tempdir_maxncpy, - const char *dirpath) ATTR_NONNULL(1, 3); +bool BLI_temp_directory_path_copy_if_valid(char *temp_directory, + const size_t buffer_size, + const char *dirpath); -/** - * Get the path to a directory suitable for temporary files. +/* Get the path to a directory suitable for temporary files. * * The return path is guaranteed to exist and to be a directory, as well as to contain a trailing * directory separator. * - * At maximum the `tempdir_maxncpy` number of characters is written to the `tempdir`. - * The directory path is always null-terminated. - */ -void BLI_temp_directory_path_get(char *tempdir, const size_t tempdir_maxncpy) ATTR_NONNULL(1); + * At maximum the buffer_size number of characters is written to the temp_directory. The directory + * path is always null-terminated. */ +void BLI_temp_directory_path_get(char *temp_directory, const size_t buffer_size); #ifdef __cplusplus } diff --git a/source/blender/blenlib/BLI_time.h b/source/blender/blenlib/BLI_time.h index 29613bc3fca..b4529d9c7f3 100644 --- a/source/blender/blenlib/BLI_time.h +++ b/source/blender/blenlib/BLI_time.h @@ -13,20 +13,24 @@ extern "C" { #endif -/** - * Return an indication of time, expressed as seconds since some fixed point. - * Successive calls are guaranteed to generate values greater than or equal to the last call. - */ -extern double BLI_time_now_seconds(void); +extern + /** Return an indication of time, expressed as + * seconds since some fixed point. Successive calls + * are guaranteed to generate values greater than or + * equal to the last call. */ + double + BLI_check_seconds_timer(void); -/** `int` version of #BLI_time_now_seconds. */ -extern long int BLI_time_now_seconds_i(void); +extern + /** `int` version of #BLI_check_seconds_timer. */ + long int + BLI_check_seconds_timer_i(void); /** * Platform-independent sleep function. * \param ms: Number of milliseconds to sleep */ -void BLI_time_sleep_ms(int ms); +void BLI_sleep_ms(int ms); #ifdef __cplusplus } diff --git a/source/blender/blenlib/BLI_time_utildefines.h b/source/blender/blenlib/BLI_time_utildefines.h index cfefca51749..0daa80222a6 100644 --- a/source/blender/blenlib/BLI_time_utildefines.h +++ b/source/blender/blenlib/BLI_time_utildefines.h @@ -9,12 +9,12 @@ #pragma once -#include "BLI_time.h" /* for BLI_time_now_seconds */ +#include "BLI_time.h" /* for BLI_check_seconds_timer */ #include "BLI_utildefines.h" /* for AT */ #define TIMEIT_START(var) \ { \ - double _timeit_##var = BLI_time_now_seconds(); \ + double _timeit_##var = BLI_check_seconds_timer(); \ printf("time start (" #var "): " AT "\n"); \ fflush(stdout); \ { \ @@ -23,7 +23,7 @@ /** * \return the time since TIMEIT_START was called. */ -#define TIMEIT_VALUE(var) (float)(BLI_time_now_seconds() - _timeit_##var) +#define TIMEIT_VALUE(var) (float)(BLI_check_seconds_timer() - _timeit_##var) #define TIMEIT_VALUE_PRINT(var) \ { \ @@ -54,7 +54,7 @@ { \ static float _sum_##var = 0.0f; \ static float _num_##var = 0.0f; \ - double _timeit_##var = BLI_time_now_seconds(); \ + double _timeit_##var = BLI_check_seconds_timer(); \ printf("time start (" #var "): " AT "\n"); \ fflush(stdout); \ { \ @@ -95,13 +95,13 @@ #define TIMEIT_BLOCK_START(id) \ { \ - double _timeit_block_start_##id = BLI_time_now_seconds(); \ + double _timeit_block_start_##id = BLI_check_seconds_timer(); \ { \ (void)0 #define TIMEIT_BLOCK_END(id) \ } \ - _timeit_var_##id += (BLI_time_now_seconds() - _timeit_block_start_##id); \ + _timeit_var_##id += (BLI_check_seconds_timer() - _timeit_block_start_##id); \ } \ (void)0 diff --git a/source/blender/blenlib/BLI_uuid.h b/source/blender/blenlib/BLI_uuid.h index 99409ecccfc..91122776ae3 100644 --- a/source/blender/blenlib/BLI_uuid.h +++ b/source/blender/blenlib/BLI_uuid.h @@ -60,8 +60,6 @@ bool BLI_uuid_parse_string(bUUID *uuid, const char *buffer) ATTR_NONNULL(); # include # include -# include "BLI_string_ref.hh" - /** Output the UUID as formatted ASCII string, see #BLI_uuid_format(). */ std::ostream &operator<<(std::ostream &stream, bUUID uuid); @@ -81,10 +79,7 @@ class bUUID : public ::bUUID { bUUID(std::initializer_list field_values); /** Initialize by parsing the string; undefined behavior when the string is invalid. */ - explicit bUUID(const StringRefNull string_formatted_uuid); - - /** Return the UUID as formatted ASCII string, see #BLI_uuid_format(). */ - std::string str() const; + explicit bUUID(const std::string &string_formatted_uuid); uint64_t hash() const; }; // namespace blender diff --git a/source/blender/blenlib/BLI_uvproject.h b/source/blender/blenlib/BLI_uvproject.h index 3aae1e5a24d..1ee807813c2 100644 --- a/source/blender/blenlib/BLI_uvproject.h +++ b/source/blender/blenlib/BLI_uvproject.h @@ -17,11 +17,11 @@ struct ProjCameraInfo; /** * Create UV info from the camera, needs to be freed. * - * \param rotmat: can be `obedit->object_to_world().ptr()` when uv project is used. + * \param rotmat: can be `obedit->object_to_world` when uv project is used. * \param winx, winy: can be from `scene->r.xsch / ysch`. */ -struct ProjCameraInfo *BLI_uvproject_camera_info(const struct Object *ob, - const float rotmat[4][4], +struct ProjCameraInfo *BLI_uvproject_camera_info(struct Object *ob, + float rotmat[4][4], float winx, float winy); diff --git a/source/blender/blenlib/BLI_virtual_array.hh b/source/blender/blenlib/BLI_virtual_array.hh index 69f9018dec8..a74d5aa21c0 100644 --- a/source/blender/blenlib/BLI_virtual_array.hh +++ b/source/blender/blenlib/BLI_virtual_array.hh @@ -1217,19 +1217,6 @@ template class SingleAsSpan { } }; -template class VArrayRef { - private: - const VArray &ref_; - - public: - VArrayRef(const VArray &ref) : ref_(ref) {} - - const T operator[](const int64_t index) const - { - return ref_[index]; - } -}; - /** To be used with #call_with_devirtualized_parameters. */ template struct VArrayDevirtualizer { const VArray &varray; @@ -1270,7 +1257,7 @@ inline void devirtualize_varray(const VArray &varray, const Func &func, bool return; } } - func(VArrayRef(varray)); + func(varray); } /** @@ -1293,7 +1280,7 @@ inline void devirtualize_varray2(const VArray &varray1, return; } } - func(VArrayRef(varray1), VArrayRef(varray2)); + func(varray1, varray2); } } // namespace blender diff --git a/source/blender/blenlib/CMakeLists.txt b/source/blender/blenlib/CMakeLists.txt index e8ef92025c4..7f33907e20b 100644 --- a/source/blender/blenlib/CMakeLists.txt +++ b/source/blender/blenlib/CMakeLists.txt @@ -51,12 +51,12 @@ set(SRC intern/bit_ref.cc intern/bit_span.cc intern/bitmap.c - intern/bitmap_draw_2d.cc + intern/bitmap_draw_2d.c intern/boxpack_2d.c intern/buffer.c intern/cache_mutex.cc intern/compute_context.cc - intern/convexhull_2d.cc + intern/convexhull_2d.c intern/cpp_type.cc intern/cpp_types.cc intern/delaunay_2d.cc @@ -82,14 +82,13 @@ set(SRC intern/hash_tables.cc intern/implicit_sharing.cc intern/index_mask.cc - intern/index_mask_expression.cc intern/index_range.cc intern/jitter_2d.c intern/kdtree_1d.c intern/kdtree_2d.c intern/kdtree_3d.c intern/kdtree_4d.c - intern/lasso_2d.cc + intern/lasso_2d.c intern/lazy_threading.cc intern/length_parameterize.cc intern/listbase.cc @@ -156,7 +155,7 @@ set(SRC intern/timecode.c intern/timeit.cc intern/uuid.cc - intern/uvproject.cc + intern/uvproject.c intern/vector.cc intern/virtual_array.cc intern/voxel.c @@ -253,7 +252,6 @@ set(SRC BLI_implicit_sharing_ptr.hh BLI_index_mask.hh BLI_index_mask_fwd.hh - BLI_index_mask_expression.hh BLI_index_range.hh BLI_inplace_priority_queue.hh BLI_iterator.h @@ -261,11 +259,10 @@ set(SRC BLI_kdopbvh.h BLI_kdtree.h BLI_kdtree_impl.h - BLI_lasso_2d.hh + BLI_lasso_2d.h BLI_lazy_threading.hh BLI_length_parameterize.hh BLI_linear_allocator.hh - BLI_linear_allocator_chunked_list.hh BLI_link_utils.h BLI_linklist.h BLI_linklist_lockfree.h @@ -333,7 +330,6 @@ set(SRC BLI_quadric.h BLI_rand.h BLI_rand.hh - BLI_random_access_iterator_mixin.hh BLI_range.h BLI_rect.h BLI_resource_scope.hh @@ -502,7 +498,6 @@ if(WITH_GTESTS) tests/BLI_bitmap_test.cc tests/BLI_bounds_test.cc tests/BLI_color_test.cc - tests/BLI_convexhull_2d_test.cc tests/BLI_cpp_type_test.cc tests/BLI_delaunay_2d_test.cc tests/BLI_disjoint_set_test.cc @@ -518,13 +513,11 @@ if(WITH_GTESTS) tests/BLI_heap_test.cc tests/BLI_implicit_sharing_test.cc tests/BLI_index_mask_test.cc - tests/BLI_index_mask_expression_test.cc tests/BLI_index_range_test.cc tests/BLI_inplace_priority_queue_test.cc tests/BLI_kdopbvh_test.cc tests/BLI_kdtree_test.cc tests/BLI_length_parameterize_test.cc - tests/BLI_linear_allocator_chunked_list_test.cc tests/BLI_linear_allocator_test.cc tests/BLI_linklist_lockfree_test.cc tests/BLI_listbase_test.cc @@ -551,7 +544,6 @@ if(WITH_GTESTS) tests/BLI_path_util_test.cc tests/BLI_polyfill_2d_test.cc tests/BLI_pool_test.cc - tests/BLI_random_access_iterator_mixin_test.cc tests/BLI_ressource_strings.h tests/BLI_serialize_test.cc tests/BLI_session_uid_test.cc diff --git a/source/blender/blenlib/intern/BLI_assert.c b/source/blender/blenlib/intern/BLI_assert.c index 600e7a2c0ab..deefc847f61 100644 --- a/source/blender/blenlib/intern/BLI_assert.c +++ b/source/blender/blenlib/intern/BLI_assert.c @@ -9,10 +9,7 @@ */ #include "BLI_assert.h" /* Own include. */ - -#ifndef NDEBUG -# include "BLI_system.h" -#endif +#include "BLI_system.h" #include #include diff --git a/source/blender/blenlib/intern/BLI_filelist.cc b/source/blender/blenlib/intern/BLI_filelist.cc index 0dee9390d34..563ed235829 100644 --- a/source/blender/blenlib/intern/BLI_filelist.cc +++ b/source/blender/blenlib/intern/BLI_filelist.cc @@ -42,6 +42,8 @@ #include "BLI_string.h" #include "BLI_string_utils.hh" +#include "../imbuf/IMB_imbuf.hh" + /* * Ordering function for sorting lists of files/directories. Returns -1 if * entry1 belongs before entry2, 0 if they are equal, 1 if they should be swapped. diff --git a/source/blender/blenlib/intern/BLI_ghash.c b/source/blender/blenlib/intern/BLI_ghash.c index 809df575b45..cda177beb35 100644 --- a/source/blender/blenlib/intern/BLI_ghash.c +++ b/source/blender/blenlib/intern/BLI_ghash.c @@ -24,7 +24,8 @@ #define GHASH_INTERNAL_API #include "BLI_ghash.h" /* own include */ -#include "BLI_strict_flags.h" /* Keep last. */ +/* keep last */ +#include "BLI_strict_flags.h" /* -------------------------------------------------------------------- */ /** \name Structs & Constants diff --git a/source/blender/blenlib/intern/BLI_ghash_utils.cc b/source/blender/blenlib/intern/BLI_ghash_utils.cc index 9376dae39a3..3d4ce192b46 100644 --- a/source/blender/blenlib/intern/BLI_ghash_utils.cc +++ b/source/blender/blenlib/intern/BLI_ghash_utils.cc @@ -9,7 +9,7 @@ * (not its implementation). */ -#include +#include #include "MEM_guardedalloc.h" @@ -17,7 +17,8 @@ #include "BLI_hash_mm2a.hh" #include "BLI_utildefines.h" -#include "BLI_strict_flags.h" /* Keep last. */ +/* keep last */ +#include "BLI_strict_flags.h" /* -------------------------------------------------------------------- */ /** \name Generic Key Hash & Comparison Functions @@ -34,13 +35,13 @@ uint BLI_ghashutil_ptrhash(const void *key) { /* Based Python3.7's pointer hashing function. */ - size_t y = size_t(key); + size_t y = (size_t)key; /* bottom 3 or 4 bits are likely to be 0; rotate y by 4 to avoid * excessive hash collisions for dictionaries and sets */ /* NOTE: Unlike Python `sizeof(uint)` is used instead of `sizeof(void *)`, * Otherwise casting to 'uint' ignores the upper bits on 64bit platforms. */ - return uint(y >> 4) | (uint(y) << (sizeof(uint[8]) - 4)); + return (uint)(y >> 4) | ((uint)y << (sizeof(uint[8]) - 4)); } #endif bool BLI_ghashutil_ptrcmp(const void *a, const void *b) @@ -85,7 +86,7 @@ uint BLI_ghashutil_uinthash(uint key) uint BLI_ghashutil_inthash_p(const void *ptr) { - uintptr_t key = uintptr_t(ptr); + uintptr_t key = (uintptr_t)ptr; key += ~(key << 16); key ^= (key >> 5); @@ -94,12 +95,12 @@ uint BLI_ghashutil_inthash_p(const void *ptr) key += ~(key << 9); key ^= (key >> 17); - return uint(key & 0xffffffff); + return (uint)(key & 0xffffffff); } uint BLI_ghashutil_inthash_p_murmur(const void *ptr) { - uintptr_t key = uintptr_t(ptr); + uintptr_t key = (uintptr_t)ptr; return BLI_hash_mm2((const uchar *)&key, sizeof(key), 0); } @@ -125,7 +126,7 @@ uint BLI_ghashutil_strhash_n(const char *key, size_t n) uint h = 5381; for (p = (const signed char *)key; n-- && *p != '\0'; p++) { - h = uint((h << 5) + h) + uint(*p); + h = (uint)((h << 5) + h) + (uint)*p; } return h; @@ -136,7 +137,7 @@ uint BLI_ghashutil_strhash_p(const void *ptr) uint h = 5381; for (p = static_cast(ptr); *p != '\0'; p++) { - h = uint((h << 5) + h) + uint(*p); + h = (uint)((h << 5) + h) + (uint)*p; } return h; diff --git a/source/blender/blenlib/intern/BLI_heap.c b/source/blender/blenlib/intern/BLI_heap.c index 8f596988482..032d439f7b7 100644 --- a/source/blender/blenlib/intern/BLI_heap.c +++ b/source/blender/blenlib/intern/BLI_heap.c @@ -14,10 +14,9 @@ #include "MEM_guardedalloc.h" #include "BLI_heap.h" +#include "BLI_strict_flags.h" #include "BLI_utildefines.h" -#include "BLI_strict_flags.h" /* Keep last. */ - /***/ struct HeapNode { diff --git a/source/blender/blenlib/intern/BLI_heap_simple.c b/source/blender/blenlib/intern/BLI_heap_simple.c index 470ec73af23..9854ffd3ffa 100644 --- a/source/blender/blenlib/intern/BLI_heap_simple.c +++ b/source/blender/blenlib/intern/BLI_heap_simple.c @@ -18,10 +18,9 @@ #include "MEM_guardedalloc.h" #include "BLI_heap_simple.h" +#include "BLI_strict_flags.h" #include "BLI_utildefines.h" -#include "BLI_strict_flags.h" /* Keep last. */ - #define HEAP_PARENT(i) (((i)-1) >> 1) /* -------------------------------------------------------------------- */ diff --git a/source/blender/blenlib/intern/BLI_index_range.cc b/source/blender/blenlib/intern/BLI_index_range.cc index 8a6684f21ce..df2c56f1c0e 100644 --- a/source/blender/blenlib/intern/BLI_index_range.cc +++ b/source/blender/blenlib/intern/BLI_index_range.cc @@ -4,8 +4,11 @@ #include +#include "BLI_array.hh" #include "BLI_index_range.hh" -#include "BLI_utildefines.h" +#include "BLI_span.hh" +#include "BLI_task.hh" +#include "BLI_vector.hh" namespace blender { diff --git a/source/blender/blenlib/intern/BLI_kdopbvh.c b/source/blender/blenlib/intern/BLI_kdopbvh.c index be3a8aeee6a..b748ea3bfe7 100644 --- a/source/blender/blenlib/intern/BLI_kdopbvh.c +++ b/source/blender/blenlib/intern/BLI_kdopbvh.c @@ -33,7 +33,7 @@ #include "BLI_task.h" #include "BLI_utildefines.h" -#include "BLI_strict_flags.h" /* Keep last. */ +#include "BLI_strict_flags.h" /* used for iterative_raycast */ // #define USE_SKIP_LINKS diff --git a/source/blender/blenlib/intern/BLI_linklist.c b/source/blender/blenlib/intern/BLI_linklist.c index bb57fc3299f..db400d51234 100644 --- a/source/blender/blenlib/intern/BLI_linklist.c +++ b/source/blender/blenlib/intern/BLI_linklist.c @@ -19,7 +19,7 @@ #include "BLI_mempool.h" #include "BLI_utildefines.h" -#include "BLI_strict_flags.h" /* Keep last. */ +#include "BLI_strict_flags.h" int BLI_linklist_count(const LinkNode *list) { diff --git a/source/blender/blenlib/intern/BLI_linklist_lockfree.c b/source/blender/blenlib/intern/BLI_linklist_lockfree.c index 88fd1fe0878..992af907266 100644 --- a/source/blender/blenlib/intern/BLI_linklist_lockfree.c +++ b/source/blender/blenlib/intern/BLI_linklist_lockfree.c @@ -9,11 +9,10 @@ #include "MEM_guardedalloc.h" #include "BLI_linklist_lockfree.h" +#include "BLI_strict_flags.h" #include "atomic_ops.h" -#include "BLI_strict_flags.h" /* Keep last. */ - void BLI_linklist_lockfree_init(LockfreeLinkList *list) { list->dummy_node.next = NULL; diff --git a/source/blender/blenlib/intern/BLI_memarena.c b/source/blender/blenlib/intern/BLI_memarena.c index 6f36db18095..5b0a8bd41fb 100644 --- a/source/blender/blenlib/intern/BLI_memarena.c +++ b/source/blender/blenlib/intern/BLI_memarena.c @@ -21,6 +21,7 @@ #include "BLI_asan.h" #include "BLI_memarena.h" +#include "BLI_strict_flags.h" #include "BLI_utildefines.h" #ifdef WITH_MEM_VALGRIND @@ -32,8 +33,6 @@ # define VALGRIND_MOVE_MEMPOOL(pool_a, pool_b) UNUSED_VARS(pool_a, pool_b) #endif -#include "BLI_strict_flags.h" /* Keep last. */ - struct MemBuf { struct MemBuf *next; uchar data[0]; diff --git a/source/blender/blenlib/intern/BLI_memblock.c b/source/blender/blenlib/intern/BLI_memblock.c index 95b375b8be4..595bae69b2f 100644 --- a/source/blender/blenlib/intern/BLI_memblock.c +++ b/source/blender/blenlib/intern/BLI_memblock.c @@ -11,13 +11,15 @@ #include #include +#include "atomic_ops.h" + #include "BLI_utildefines.h" #include "BLI_memblock.h" /* own include */ #include "MEM_guardedalloc.h" -#include "BLI_strict_flags.h" /* Keep last. */ +#include "BLI_strict_flags.h" /* keep last */ #define CHUNK_LIST_SIZE 16 diff --git a/source/blender/blenlib/intern/BLI_memiter.c b/source/blender/blenlib/intern/BLI_memiter.c index 11d81373154..a2278176b4c 100644 --- a/source/blender/blenlib/intern/BLI_memiter.c +++ b/source/blender/blenlib/intern/BLI_memiter.c @@ -35,7 +35,7 @@ #include "MEM_guardedalloc.h" -#include "BLI_strict_flags.h" /* Keep last. */ +#include "BLI_strict_flags.h" /* keep last */ /* TODO: Valgrind. */ diff --git a/source/blender/blenlib/intern/BLI_mempool.c b/source/blender/blenlib/intern/BLI_mempool.c index 610c39176ed..12569172e97 100644 --- a/source/blender/blenlib/intern/BLI_mempool.c +++ b/source/blender/blenlib/intern/BLI_mempool.c @@ -31,12 +31,12 @@ #include "MEM_guardedalloc.h" +#include "BLI_strict_flags.h" /* keep last */ + #ifdef WITH_MEM_VALGRIND # include "valgrind/memcheck.h" #endif -#include "BLI_strict_flags.h" /* Keep last. */ - #ifdef WITH_ASAN # define POISON_REDZONE_SIZE 32 #else diff --git a/source/blender/blenlib/intern/BLI_timer.c b/source/blender/blenlib/intern/BLI_timer.c index 52323be4f8f..2a308207931 100644 --- a/source/blender/blenlib/intern/BLI_timer.c +++ b/source/blender/blenlib/intern/BLI_timer.c @@ -12,7 +12,7 @@ #include "MEM_guardedalloc.h" -#define GET_TIME() BLI_time_now_seconds() +#define GET_TIME() BLI_check_seconds_timer() typedef struct TimedFunction { struct TimedFunction *next, *prev; diff --git a/source/blender/blenlib/intern/array_store.cc b/source/blender/blenlib/intern/array_store.cc index 6f7dcf03a4d..b1932ff5fa0 100644 --- a/source/blender/blenlib/intern/array_store.cc +++ b/source/blender/blenlib/intern/array_store.cc @@ -6,7 +6,7 @@ * \ingroup bli * \brief Array storage to minimize duplication. * - * This is done by splitting arrays into chunks and using copy-on-evaluation, + * This is done by splitting arrays into chunks and using copy-on-write (COW), * to de-duplicate chunks, from the users perspective this is an implementation detail. * * Overview @@ -96,10 +96,12 @@ #include "BLI_listbase.h" #include "BLI_mempool.h" -#include "BLI_array_store.h" /* Own include. */ -#include "BLI_ghash.h" /* Only for #BLI_array_store_is_valid. */ +#include "BLI_strict_flags.h" -#include "BLI_strict_flags.h" /* Keep last. */ +#include "BLI_array_store.h" /* Own include. */ + +/* Only for #BLI_array_store_is_valid. */ +#include "BLI_ghash.h" struct BChunkList; diff --git a/source/blender/blenlib/intern/array_store_utils.cc b/source/blender/blenlib/intern/array_store_utils.cc index 2856a92a998..71d67a16038 100644 --- a/source/blender/blenlib/intern/array_store_utils.cc +++ b/source/blender/blenlib/intern/array_store_utils.cc @@ -9,6 +9,8 @@ #include "MEM_guardedalloc.h" +#include "BLI_utildefines.h" + #include "BLI_array_store.h" #include "BLI_array_store_utils.h" /* own include */ diff --git a/source/blender/blenlib/intern/array_utils.c b/source/blender/blenlib/intern/array_utils.c index cb1ffd47903..9b7544ab94e 100644 --- a/source/blender/blenlib/intern/array_utils.c +++ b/source/blender/blenlib/intern/array_utils.c @@ -17,13 +17,12 @@ #include "BLI_alloca.h" #include "BLI_math_base.h" +#include "BLI_strict_flags.h" #include "BLI_sys_types.h" #include "BLI_utildefines.h" #include "BLI_array_utils.h" -#include "BLI_strict_flags.h" /* Keep last. */ - void _bli_array_reverse(void *arr_v, uint arr_len, size_t arr_stride) { const uint arr_stride_uint = (uint)arr_stride; diff --git a/source/blender/blenlib/intern/bitmap_draw_2d.cc b/source/blender/blenlib/intern/bitmap_draw_2d.c similarity index 90% rename from source/blender/blenlib/intern/bitmap_draw_2d.cc rename to source/blender/blenlib/intern/bitmap_draw_2d.c index f25feb024ae..372bd58a113 100644 --- a/source/blender/blenlib/intern/bitmap_draw_2d.cc +++ b/source/blender/blenlib/intern/bitmap_draw_2d.c @@ -8,7 +8,7 @@ * Utility functions for primitive drawing operations. */ -#include +#include #include "MEM_guardedalloc.h" @@ -18,10 +18,7 @@ #include "BLI_sort.h" #include "BLI_utildefines.h" -#include "BLI_strict_flags.h" /* Keep last. */ - -using blender::int2; -using blender::Span; +#include "BLI_strict_flags.h" /* -------------------------------------------------------------------- */ /** \name Draw Line @@ -149,7 +146,7 @@ void BLI_bitmap_draw_2d_line_v2v2i(const int p1[2], static float inv_slope(const int a[2], const int b[2]) { - return float(a[0] - b[0]) / float(a[1] - b[1]); + return ((float)(a[0] - b[0]) / (float)(a[1] - b[1])); } /** @@ -166,13 +163,13 @@ static void draw_tri_flat_max(const int p[2], void (*callback)(int x, int x_end, int y, void *), void *user_data) { - float cur_x1 = float(p[0]); + float cur_x1 = (float)p[0]; float cur_x2 = cur_x1; /* start-end inclusive */ const int min_y = p[1]; const int max_y_end = max_y + 1; for (int scanline_y = min_y; scanline_y != max_y_end; scanline_y += 1) { - callback(int(cur_x1), 1 + int(cur_x2), scanline_y, user_data); + callback((int)cur_x1, 1 + (int)cur_x2, scanline_y, user_data); cur_x1 += inv_slope1; cur_x2 += inv_slope2; } @@ -192,13 +189,13 @@ static void draw_tri_flat_min(const int p[2], void (*callback)(int x, int x_end, int y, void *), void *user_data) { - float cur_x1 = float(p[0]); + float cur_x1 = (float)p[0]; float cur_x2 = cur_x1; /* start-end inclusive */ const int max_y = p[1]; const int min_y_end = min_y - 1; for (int scanline_y = max_y; scanline_y != min_y_end; scanline_y -= 1) { - callback(int(cur_x1), 1 + int(cur_x2), scanline_y, user_data); + callback((int)cur_x1, 1 + (int)cur_x2, scanline_y, user_data); cur_x1 -= inv_slope1; cur_x2 -= inv_slope2; } @@ -284,9 +281,9 @@ void BLI_bitmap_draw_2d_tri_v2i( /* sort edge-segments on y, then x axis */ static int draw_poly_v2i_n__span_y_sort(const void *a_p, const void *b_p, void *verts_p) { - const int(*verts)[2] = static_cast(verts_p); - const int *a = static_cast(a_p); - const int *b = static_cast(b_p); + const int(*verts)[2] = verts_p; + const int *a = a_p; + const int *b = b_p; const int *co_a = verts[a[0]]; const int *co_b = verts[b[0]]; @@ -320,18 +317,18 @@ void BLI_bitmap_draw_2d_poly_v2i_n(const int xmin, const int ymin, const int xmax, const int ymax, - const Span verts, + const int verts[][2], + const int verts_len, void (*callback)(int x, int x_end, int y, void *), void *user_data) { /* Originally by Darel Rex Finley, 2007. * Optimized by Campbell Barton, 2016 to track sorted intersections. */ - int(*span_y)[2] = static_cast( - MEM_mallocN(sizeof(*span_y) * size_t(verts.size()), __func__)); + int(*span_y)[2] = MEM_mallocN(sizeof(*span_y) * (size_t)verts_len, __func__); int span_y_len = 0; - for (int i_curr = 0, i_prev = int(verts.size() - 1); i_curr < verts.size(); i_prev = i_curr++) { + for (int i_curr = 0, i_prev = verts_len - 1; i_curr < verts_len; i_prev = i_curr++) { const int *co_prev = verts[i_prev]; const int *co_curr = verts[i_curr]; @@ -353,17 +350,13 @@ void BLI_bitmap_draw_2d_poly_v2i_n(const int xmin, } } - BLI_qsort_r(span_y, - size_t(span_y_len), - sizeof(*span_y), - draw_poly_v2i_n__span_y_sort, - (void *)verts.data()); + BLI_qsort_r( + span_y, (size_t)span_y_len, sizeof(*span_y), draw_poly_v2i_n__span_y_sort, (void *)verts); struct NodeX { int span_y_index; int x; - } *node_x = static_cast( - MEM_mallocN(sizeof(*node_x) * size_t(verts.size() + 1), __func__)); + } *node_x = MEM_mallocN(sizeof(*node_x) * (size_t)(verts_len + 1), __func__); int node_x_len = 0; int span_y_index = 0; @@ -371,7 +364,7 @@ void BLI_bitmap_draw_2d_poly_v2i_n(const int xmin, while ((span_y_index < span_y_len) && (verts[span_y[span_y_index][0]][1] < ymin)) { BLI_assert(verts[span_y[span_y_index][0]][1] < verts[span_y[span_y_index][1]][1]); if (verts[span_y[span_y_index][1]][1] >= ymin) { - NodeX *n = &node_x[node_x_len++]; + struct NodeX *n = &node_x[node_x_len++]; n->span_y_index = span_y_index; } span_y_index += 1; @@ -384,7 +377,7 @@ void BLI_bitmap_draw_2d_poly_v2i_n(const int xmin, bool do_remove = false; for (int i = 0, x_ix_prev = INT_MIN; i < node_x_len; i++) { - NodeX *n = &node_x[i]; + struct NodeX *n = &node_x[i]; const int *s = span_y[n->span_y_index]; const int *co_prev = verts[s[0]]; const int *co_curr = verts[s[1]]; @@ -394,7 +387,7 @@ void BLI_bitmap_draw_2d_poly_v2i_n(const int xmin, const double x = (co_prev[0] - co_curr[0]); const double y = (co_prev[1] - co_curr[1]); const double y_px = (pixel_y - co_curr[1]); - const int x_ix = int(double(co_curr[0]) + ((y_px / y) * x)); + const int x_ix = (int)((double)co_curr[0] + ((y_px / y) * x)); n->x = x_ix; if (is_sorted && (x_ix_prev > x_ix)) { @@ -412,7 +405,7 @@ void BLI_bitmap_draw_2d_poly_v2i_n(const int xmin, const int node_x_end = node_x_len - 1; while (i < node_x_end) { if (node_x[i].x > node_x[i + 1].x) { - SWAP(NodeX, node_x[i], node_x[i + 1]); + SWAP(struct NodeX, node_x[i], node_x[i + 1]); if (i != 0) { i -= 1; } @@ -470,7 +463,7 @@ void BLI_bitmap_draw_2d_poly_v2i_n(const int xmin, * not ideal but sorting once will resolve. */ /* x is initialized for the next pixel_y */ - NodeX *n = &node_x[node_x_len++]; + struct NodeX *n = &node_x[node_x_len++]; n->span_y_index = span_y_index; span_y_index += 1; } diff --git a/source/blender/blenlib/intern/boxpack_2d.c b/source/blender/blenlib/intern/boxpack_2d.c index ee67e5ca8e5..cb65e218039 100644 --- a/source/blender/blenlib/intern/boxpack_2d.c +++ b/source/blender/blenlib/intern/boxpack_2d.c @@ -18,7 +18,7 @@ #include "BLI_sort.h" /* qsort_r */ #define qsort_r BLI_qsort_r -#include "BLI_strict_flags.h" /* Keep last. */ +#include "BLI_strict_flags.h" #ifdef __GNUC__ # pragma GCC diagnostic error "-Wpadded" diff --git a/source/blender/blenlib/intern/buffer.c b/source/blender/blenlib/intern/buffer.c index 61a4c71637d..63492879808 100644 --- a/source/blender/blenlib/intern/buffer.c +++ b/source/blender/blenlib/intern/buffer.c @@ -36,7 +36,7 @@ #include "BLI_buffer.h" #include "BLI_utildefines.h" -#include "BLI_strict_flags.h" /* Keep last. */ +#include "BLI_strict_flags.h" static void *buffer_alloc(BLI_Buffer *buffer, const size_t len) { diff --git a/source/blender/blenlib/intern/convexhull_2d.c b/source/blender/blenlib/intern/convexhull_2d.c new file mode 100644 index 00000000000..18290597af2 --- /dev/null +++ b/source/blender/blenlib/intern/convexhull_2d.c @@ -0,0 +1,283 @@ +/* SPDX-FileCopyrightText: 2023 Blender Authors + * SPDX-FileCopyrightText: 2001 softSurfer (http://www.softsurfer.com) + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +/** \file + * \ingroup bli + */ + +#include +#include + +#include "MEM_guardedalloc.h" + +#include "BLI_convexhull_2d.h" +#include "BLI_math_vector.h" +#include "BLI_strict_flags.h" +#include "BLI_utildefines.h" + +/* 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 + * liable for any real or imagined damage resulting from its use. + * Users of this code must verify correctness for their application. + * http://softsurfer.com/Archive/algorithm_0203/algorithm_0203.htm + */ + +/* -------------------------------------------------------------------- */ +/** \name Main Convex-Hull Calculation + * \{ */ + +/** + * tests if a point is Left|On|Right of an infinite line. + * Input: three points P0, P1, and P2 + * \returns > 0.0 for P2 left of the line through P0 and P1. + * = 0.0 for P2 on the line. + * < 0.0 for P2 right of the line. + */ +static float is_left(const float p0[2], const float p1[2], const float p2[2]) +{ + return (p1[0] - p0[0]) * (p2[1] - p0[1]) - (p2[0] - p0[0]) * (p1[1] - p0[1]); +} + +static int BLI_convexhull_2d_sorted(const float (*points)[2], const int n, int r_points[]) +{ + BLI_assert(n >= 2); /* Doesn't handle trivial cases. */ + /* the output array r_points[] will be used as the stack */ + int bot = 0; + int top = -1; /* indices for bottom and top of the stack */ + int i; /* array scan index */ + int minmin, minmax; + int maxmin, maxmax; + float xmax; + + /* Get the indices of points with min x-coord and min|max y-coord */ + float xmin = points[0][0]; + for (i = 1; i < n; i++) { + if (points[i][0] != xmin) { + break; + } + } + + minmin = 0; + minmax = i - 1; + if (minmax == n - 1) { /* degenerate case: all x-coords == xmin */ + r_points[++top] = minmin; + if (points[minmax][1] != points[minmin][1]) { + /* a nontrivial segment */ + r_points[++top] = minmax; + } + BLI_assert(top + 1 <= n); + return top + 1; + } + + /* Get the indices of points with max x-coord and min|max y-coord */ + + maxmax = n - 1; + xmax = points[n - 1][0]; + for (i = n - 2; i >= 0; i--) { + if (points[i][0] != xmax) { + break; + } + } + maxmin = i + 1; + + /* Compute the lower hull on the stack r_points */ + r_points[++top] = minmin; /* push minmin point onto stack */ + i = minmax; + while (++i <= maxmin) { + /* the lower line joins points[minmin] with points[maxmin] */ + if (is_left(points[minmin], points[maxmin], points[i]) >= 0 && i < maxmin) { + continue; /* ignore points[i] above or on the lower line */ + } + + while (top > 0) { /* there are at least 2 points on the stack */ + /* test if points[i] is left of the line at the stack top */ + if (is_left(points[r_points[top - 1]], points[r_points[top]], points[i]) > 0.0f) { + break; /* points[i] is a new hull vertex */ + } + top--; /* pop top point off stack */ + } + + r_points[++top] = i; /* push points[i] onto stack */ + } + + /* Next, compute the upper hull on the stack r_points above the bottom hull */ + if (maxmax != maxmin) { /* if distinct xmax points */ + r_points[++top] = maxmax; /* push maxmax point onto stack */ + } + + bot = top; /* the bottom point of the upper hull stack */ + i = maxmin; + while (--i >= minmax) { + /* the upper line joins points[maxmax] with points[minmax] */ + if (is_left(points[maxmax], points[minmax], points[i]) >= 0 && i > minmax) { + continue; /* ignore points[i] below or on the upper line */ + } + + while (top > bot) { /* at least 2 points on the upper stack */ + /* test if points[i] is left of the line at the stack top */ + if (is_left(points[r_points[top - 1]], points[r_points[top]], points[i]) > 0.0f) { + break; /* points[i] is a new hull vertex */ + } + top--; /* pop top point off stack */ + } + + if (points[i][0] == points[r_points[0]][0] && points[i][1] == points[r_points[0]][1]) { + BLI_assert(top + 1 <= n); + return top + 1; /* special case (mgomes) */ + } + + r_points[++top] = i; /* push points[i] onto stack */ + } + + if (minmax != minmin && r_points[0] != minmin) { + r_points[++top] = minmin; /* push joining endpoint onto stack */ + } + + BLI_assert(top + 1 <= n); + return top + 1; +} + +struct PointRef { + const float *pt; /* 2d vector */ +}; + +static int pointref_cmp_yx(const void *a_, const void *b_) +{ + const struct PointRef *a = a_; + const struct PointRef *b = b_; + + if (a->pt[1] > b->pt[1]) { + return 1; + } + if (a->pt[1] < b->pt[1]) { + return -1; + } + + if (a->pt[0] > b->pt[0]) { + return 1; + } + if (a->pt[0] < b->pt[0]) { + return -1; + } + return 0; +} + +int BLI_convexhull_2d(const float (*points)[2], const int n, int r_points[]) +{ + BLI_assert(n >= 0); + if (n < 2) { + if (n == 1) { + r_points[0] = 0; + } + return n; + } + struct PointRef *points_ref = MEM_mallocN(sizeof(*points_ref) * (size_t)n, __func__); + float(*points_sort)[2] = MEM_mallocN(sizeof(*points_sort) * (size_t)n, __func__); + + for (int i = 0; i < n; i++) { + points_ref[i].pt = points[i]; + } + + /* Sort the points by X, then by Y. */ + qsort(points_ref, (size_t)n, sizeof(struct PointRef), pointref_cmp_yx); + + for (int i = 0; i < n; i++) { + memcpy(points_sort[i], points_ref[i].pt, sizeof(float[2])); + } + + int points_hull_num = BLI_convexhull_2d_sorted(points_sort, n, r_points); + + /* Map back to the unsorted index values. */ + for (int i = 0; i < points_hull_num; i++) { + r_points[i] = (int)((const float(*)[2])points_ref[r_points[i]].pt - points); + } + + MEM_freeN(points_ref); + MEM_freeN(points_sort); + + BLI_assert(points_hull_num <= n); + return points_hull_num; +} + +/** \} */ + +/* Helper functions */ + +/* -------------------------------------------------------------------- */ +/** \name Utility Convex-Hull Functions + * \{ */ + +static float BLI_convexhull_aabb_fit_hull_2d(const float (*points_hull)[2], int n) +{ + float area_best = FLT_MAX; + float dvec_best[2]; /* best angle, delay atan2 */ + + int i_prev = n - 1; + for (int i = 0; i < n; i++) { + const float *ev_a = points_hull[i]; + const float *ev_b = points_hull[i_prev]; + float dvec[2]; /* 2d rotation matrix */ + + sub_v2_v2v2(dvec, ev_a, ev_b); + if (normalize_v2(dvec) != 0.0f) { + /* rotation matrix */ + float min[2] = {FLT_MAX, FLT_MAX}, max[2] = {-FLT_MAX, -FLT_MAX}; + float area; + + for (int j = 0; j < n; j++) { + float tvec[2]; + mul_v2_v2_cw(tvec, dvec, points_hull[j]); + + min[0] = min_ff(min[0], tvec[0]); + min[1] = min_ff(min[1], tvec[1]); + + max[0] = max_ff(max[0], tvec[0]); + max[1] = max_ff(max[1], tvec[1]); + + area = (max[0] - min[0]) * (max[1] - min[1]); + if (area > area_best) { + break; + } + } + + if (area < area_best) { + area_best = area; + copy_v2_v2(dvec_best, dvec); + } + } + + i_prev = i; + } + + return (area_best != FLT_MAX) ? (float)atan2(dvec_best[0], dvec_best[1]) : 0.0f; +} + +float BLI_convexhull_aabb_fit_points_2d(const float (*points)[2], int n) +{ + BLI_assert(n >= 0); + float angle = 0.0f; + + int *index_map = MEM_mallocN(sizeof(*index_map) * (size_t)n, __func__); + + int points_hull_num = BLI_convexhull_2d(points, n, index_map); + + if (points_hull_num > 1) { + float(*points_hull)[2] = MEM_mallocN(sizeof(*points_hull) * (size_t)points_hull_num, __func__); + for (int j = 0; j < points_hull_num; j++) { + copy_v2_v2(points_hull[j], points[index_map[j]]); + } + + angle = BLI_convexhull_aabb_fit_hull_2d(points_hull, points_hull_num); + MEM_freeN(points_hull); + } + + MEM_freeN(index_map); + + return angle; +} + +/** \} */ diff --git a/source/blender/blenlib/intern/convexhull_2d.cc b/source/blender/blenlib/intern/convexhull_2d.cc deleted file mode 100644 index 9f00245cd5a..00000000000 --- a/source/blender/blenlib/intern/convexhull_2d.cc +++ /dev/null @@ -1,443 +0,0 @@ -/* SPDX-FileCopyrightText: 2023 Blender Authors - * SPDX-FileCopyrightText: 2001 softSurfer (http://www.softsurfer.com) - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup bli - */ - -#include -#include -#include - -#include "MEM_guardedalloc.h" - -#include "BLI_bounds.hh" -#include "BLI_convexhull_2d.h" -#include "BLI_math_vector.h" -#include "BLI_utildefines.h" - -#include "BLI_strict_flags.h" /* Keep last. */ - -/** - * Assert the optimized bounds match a brute force check, - * disable by default is this is slow for dense hulls, using `O(n^2)` complexity. - */ -// #define USE_BRUTE_FORCE_ASSERT - -using namespace blender; - -/* -------------------------------------------------------------------- */ -/** \name Internal Math Functions - * \{ */ - -static float sincos_rotate_cw_x(const float2 &sincos, const float2 &p) -{ - return (sincos[0] * p[0]) + (sincos[1] * p[1]); -} - -static float sincos_rotate_cw_y(const float2 &sincos, const float2 &p) -{ - return (sincos[1] * p[0]) - (sincos[0] * p[1]); -} - -/** \} */ - -/* -------------------------------------------------------------------- */ -/** \name Main Convex-Hull Calculation - * \{ */ - -/* 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 - * liable for any real or imagined damage resulting from its use. - * Users of this code must verify correctness for their application. - * http://softsurfer.com/Archive/algorithm_0203/algorithm_0203.htm */ - -/** - * tests if a point is Left|On|Right of an infinite line. - * Input: three points P0, P1, and P2 - * \returns > 0.0 for P2 left of the line through P0 and P1. - * = 0.0 for P2 on the line. - * < 0.0 for P2 right of the line. - */ -static float is_left(const float p0[2], const float p1[2], const float p2[2]) -{ - return (p1[0] - p0[0]) * (p2[1] - p0[1]) - (p2[0] - p0[0]) * (p1[1] - p0[1]); -} - -static int convexhull_2d_sorted(const float (*points)[2], const int points_num, int r_points[]) -{ - BLI_assert(points_num >= 2); /* Doesn't handle trivial cases. */ - /* The output array `r_points[]` will be used as the stack. */ - int bot = 0; - /* Indices for bottom and top of the stack. */ - int top = -1; - /* Array scan index. */ - int i; - - const int minmin = 0; - const int maxmax = points_num - 1; - int minmax; - int maxmin; - - float xmax; - - /* Get the indices of points with min X-coord and min|max Y-coord. */ - float xmin = points[0][0]; - for (i = 1; i <= maxmax; i++) { - if (points[i][0] != xmin) { - break; - } - } - - minmax = i - 1; - if (minmax == maxmax) { /* Degenerate case: all x-coords == X-min. */ - r_points[++top] = minmin; - if (points[minmax][1] != points[minmin][1]) { - /* A nontrivial segment. */ - r_points[++top] = minmax; - } - BLI_assert(top + 1 <= points_num); - return top + 1; - } - - /* Get the indices of points with max X-coord and min|max Y-coord. */ - - xmax = points[maxmax][0]; - for (i = maxmax - 1; i >= 0; i--) { - if (points[i][0] != xmax) { - break; - } - } - maxmin = i + 1; - - /* Compute the lower hull on the stack `r_points`. */ - r_points[++top] = minmin; /* Push `minmin` point onto stack. */ - i = minmax; - while (++i <= maxmin) { - /* The lower line joins `points[minmin]` with `points[maxmin]`. */ - if (is_left(points[minmin], points[maxmin], points[i]) >= 0 && i < maxmin) { - continue; /* Ignore `points[i]` above or on the lower line. */ - } - - while (top > 0) { /* There are at least 2 points on the stack. */ - /* Test if `points[i]` is left of the line at the stack top. */ - if (is_left(points[r_points[top - 1]], points[r_points[top]], points[i]) > 0.0f) { - break; /* `points[i]` is a new hull vertex. */ - } - top--; /* Pop top point off stack. */ - } - - r_points[++top] = i; /* Push `points[i]` onto stack. */ - } - - /* Next, compute the upper hull on the stack `r_points` above the bottom hull. */ - if (maxmax != maxmin) { /* If distinct `xmax` points. */ - r_points[++top] = maxmax; /* Push `maxmax` point onto stack. */ - } - - bot = top; /* the bottom point of the upper hull stack */ - i = maxmin; - while (--i >= minmax) { - /* The upper line joins `points[maxmax]` with `points[minmax]`. */ - if (is_left(points[maxmax], points[minmax], points[i]) >= 0 && i > minmax) { - continue; /* Ignore points[i] below or on the upper line. */ - } - - while (top > bot) { /* At least 2 points on the upper stack. */ - /* Test if `points[i]` is left of the line at the stack top. */ - if (is_left(points[r_points[top - 1]], points[r_points[top]], points[i]) > 0.0f) { - break; /* points[i] is a new hull vertex. */ - } - top--; /* Pop top point off stack. */ - } - - if (points[i][0] == points[r_points[0]][0] && points[i][1] == points[r_points[0]][1]) { - BLI_assert(top + 1 <= points_num); - return top + 1; /* Special case (mgomes). */ - } - - r_points[++top] = i; /* Push points[i] onto stack. */ - } - - if (minmax != minmin && r_points[0] != minmin) { - r_points[++top] = minmin; /* Push joining endpoint onto stack. */ - } - - BLI_assert(top + 1 <= points_num); - return top + 1; -} - -int BLI_convexhull_2d(const float (*points)[2], const int points_num, int r_points[]) -{ - BLI_assert(points_num >= 0); - if (points_num < 2) { - if (points_num == 1) { - r_points[0] = 0; - } - return points_num; - } - int *points_map = static_cast(MEM_mallocN(sizeof(int) * size_t(points_num), __func__)); - float(*points_sort)[2] = static_cast( - MEM_mallocN(sizeof(*points_sort) * size_t(points_num), __func__)); - - for (int i = 0; i < points_num; i++) { - points_map[i] = i; - } - - /* Sort the points by X, then by Y. */ - std::sort(points_map, points_map + points_num, [points](const int &a_index, const int &b_index) { - const float *a = points[a_index]; - const float *b = points[b_index]; - if (a[1] > b[1]) { - return false; - } - if (a[1] < b[1]) { - return true; - } - - if (a[0] > b[0]) { - return false; - } - if (a[0] < b[0]) { - return true; - } - return false; - }); - - for (int i = 0; i < points_num; i++) { - copy_v2_v2(points_sort[i], points[points_map[i]]); - } - - int points_hull_num = convexhull_2d_sorted(points_sort, points_num, r_points); - - /* Map back to the unsorted index values. */ - for (int i = 0; i < points_hull_num; i++) { - r_points[i] = points_map[r_points[i]]; - } - - MEM_freeN(points_map); - MEM_freeN(points_sort); - - BLI_assert(points_hull_num <= points_num); - return points_hull_num; -} - -/** \} */ - -/* -------------------------------------------------------------------- */ -/** \name Comupte AABB Fitting Angle (For Assertion) - * \{ */ - -#if defined(USE_BRUTE_FORCE_ASSERT) && !defined(NDEBUG) -static float convexhull_aabb_fit_hull_2d_brute_force(const float (*points_hull)[2], - int points_hull_num) -{ - float area_best = FLT_MAX; - float2 sincos_best = {0.0f, 1.0f}; /* Track the best angle as a unit vector, delaying `atan2`. */ - - for (int i = 0, i_prev = points_hull_num - 1; i < points_hull_num; i_prev = i++) { - /* 2D rotation matrix. */ - float dvec_length = 0.0f; - const float2 sincos = math::normalize_and_get_length( - float2(points_hull[i]) - float2(points_hull[i_prev]), dvec_length); - if (UNLIKELY(dvec_length == 0.0f)) { - continue; - } - - blender::Bounds bounds[2] = {{FLT_MAX, -FLT_MAX}, {FLT_MAX, -FLT_MAX}}; - float area_test; - - for (int j = 0; j < points_hull_num; j++) { - const float2 tvec = { - sincos_rotate_cw_x(sincos, points_hull[j]), - sincos_rotate_cw_y(sincos, points_hull[j]), - }; - - bounds[0].min = math::min(bounds[0].min, tvec[0]); - bounds[0].max = math::max(bounds[0].max, tvec[0]); - bounds[1].min = math::min(bounds[1].min, tvec[1]); - bounds[1].max = math::max(bounds[1].max, tvec[1]); - - area_test = (bounds[0].max - bounds[0].min) * (bounds[1].max - bounds[1].min); - if (area_test > area_best) { - break; - } - } - - if (area_test < area_best) { - area_best = area_test; - sincos_best = sincos; - } - } - - return (area_best != FLT_MAX) ? float(atan2(sincos_best[0], sincos_best[1])) : 0.0f; -} -#endif - -/** \} */ - -/* -------------------------------------------------------------------- */ -/** \name Comupte AABB Fitting Angle (Optimized) - * \{ */ - -/** - * When using the rotating calipers, step one half of the caliper to a new index. - * - * Note that this relies on `points_hull` being ordered CCW which #BLI_convexhull_2d ensures. - */ -template -static float convexhull_2d_compute_extent_on_axis(const float (*points_hull)[2], - const int points_hull_num, - const float2 &sincos, - int *index_p) -{ - /* NOTE(@ideasman42): This could be optimized to use a search strategy - * that computes the upper bounds and narrows down the result instead of - * simply checking every point until the new maximum is reached. - * From looking into I couldn't find cases where doing this has significant benefits, - * especially when compared with the complexity of using more involved logic for - * the common case, where only a few steps are needed. - * Typically the number of points to scan is small (around [0..8]). - * And while a high-detail hull with single outliner points will cause stepping over - * many more points, in practice there are rarely more than a few of these in a convex-hull. - * Nevertheless, a high-poly hull that has subtle curves containing many points as well as - * some sharp-corners wont perform as well with this method. */ - - const int index_init = *index_p; - int index_best = index_init; - float value_init = (Axis == 0) ? sincos_rotate_cw_x(sincos, points_hull[index_best]) : - sincos_rotate_cw_y(sincos, points_hull[index_best]); - float value_best = value_init; - /* Simply scan up the array. */ - for (int count = 1; count < points_hull_num; count++) { - const int index_test = (index_init + count) % points_hull_num; - const float value_test = (Axis == 0) ? sincos_rotate_cw_x(sincos, points_hull[index_test]) : - sincos_rotate_cw_y(sincos, points_hull[index_test]); - if ((AxisSign == -1) ? (value_test > value_best) : (value_test < value_best)) { - break; - } - value_best = value_test; - index_best = index_test; - } - - *index_p = index_best; - return value_best; -} - -static float convexhull_aabb_fit_hull_2d(const float (*points_hull)[2], int points_hull_num) -{ - float area_best = FLT_MAX; - float2 sincos_best; /* Track the best angle as a unit vector, delaying `atan2`. */ - bool is_first = true; - - /* Initialize to zero because the first pass uses the first index to set the bounds. */ - blender::Bounds bounds_index[2] = {{0, 0}, {0, 0}}; - - for (int i = 0, i_prev = points_hull_num - 1; i < points_hull_num; i_prev = i++) { - /* 2D rotation matrix. */ - float dvec_length = 0.0f; - const float2 sincos = math::normalize_and_get_length( - float2(points_hull[i]) - float2(points_hull[i_prev]), dvec_length); - if (UNLIKELY(dvec_length == 0.0f)) { - continue; - } - - if (UNLIKELY(is_first)) { - is_first = false; - - blender::Bounds bounds[2]; - - bounds[0].min = bounds[0].max = sincos_rotate_cw_x(sincos, points_hull[0]); - bounds[1].min = bounds[1].max = sincos_rotate_cw_y(sincos, points_hull[0]); - - bounds_index[0].min = bounds_index[0].max = 0; - bounds_index[1].min = bounds_index[1].max = 0; - - for (int j = 1; j < points_hull_num; j++) { - const float2 tvec = { - sincos_rotate_cw_x(sincos, points_hull[j]), - sincos_rotate_cw_y(sincos, points_hull[j]), - }; - for (int axis = 0; axis < 2; axis++) { - if (tvec[axis] < bounds[axis].min) { - bounds[axis].min = tvec[axis]; - bounds_index[axis].min = j; - } - if (tvec[axis] > bounds[axis].max) { - bounds[axis].max = tvec[axis]; - bounds_index[axis].max = j; - } - } - } - - area_best = (bounds[0].max - bounds[0].min) * (bounds[1].max - bounds[1].min); - sincos_best = sincos; - continue; - } - - /* Step the calipers to the new rotation `sincos`, returning the bounds at the same time. */ - blender::Bounds bounds_test[2] = { - {convexhull_2d_compute_extent_on_axis<0, -1>( - points_hull, points_hull_num, sincos, &bounds_index[0].min), - convexhull_2d_compute_extent_on_axis<0, 1>( - points_hull, points_hull_num, sincos, &bounds_index[0].max)}, - {convexhull_2d_compute_extent_on_axis<1, -1>( - points_hull, points_hull_num, sincos, &bounds_index[1].min), - convexhull_2d_compute_extent_on_axis<1, 1>( - points_hull, points_hull_num, sincos, &bounds_index[1].max)}, - - }; - - const float area_test = (bounds_test[0].max - bounds_test[0].min) * - (bounds_test[1].max - bounds_test[1].min); - - if (area_test < area_best) { - area_best = area_test; - sincos_best = sincos; - } - } - - const float angle = (area_best != FLT_MAX) ? float(atan2(sincos_best[0], sincos_best[1])) : 0.0f; - -#if defined(USE_BRUTE_FORCE_ASSERT) && !defined(NDEBUG) - { - /* Ensure the optimized result matches the brute-force version. */ - const float angle_test = convexhull_aabb_fit_hull_2d_brute_force(points_hull, points_hull_num); - BLI_assert(angle == angle_test); - } -#endif - - return angle; -} - -float BLI_convexhull_aabb_fit_points_2d(const float (*points)[2], int points_num) -{ - BLI_assert(points_num >= 0); - float angle = 0.0f; - - int *index_map = static_cast( - MEM_mallocN(sizeof(*index_map) * size_t(points_num), __func__)); - - int points_hull_num = BLI_convexhull_2d(points, points_num, index_map); - - if (points_hull_num > 1) { - float(*points_hull)[2] = static_cast( - MEM_mallocN(sizeof(*points_hull) * size_t(points_hull_num), __func__)); - for (int j = 0; j < points_hull_num; j++) { - copy_v2_v2(points_hull[j], points[index_map[j]]); - } - - angle = convexhull_aabb_fit_hull_2d(points_hull, points_hull_num); - MEM_freeN(points_hull); - } - - MEM_freeN(index_map); - - return angle; -} - -/** \} */ diff --git a/source/blender/blenlib/intern/delaunay_2d.cc b/source/blender/blenlib/intern/delaunay_2d.cc index 03a31a541bc..4681e5c86e9 100644 --- a/source/blender/blenlib/intern/delaunay_2d.cc +++ b/source/blender/blenlib/intern/delaunay_2d.cc @@ -1683,11 +1683,10 @@ void fill_crossdata_for_intersect(const FatCo &curco, switch (isect.kind) { case isect_result>::LINE_LINE_CROSS: { #ifdef WITH_GMP - if (!std::is_same::value) + if (!std::is_same::value) { #else - if (true) + if (true) { #endif - { double len_ab = distance(va->co.approx, vb->co.approx); if (lambda * len_ab <= epsilon) { fill_crossdata_for_through_vert(va, se_vcva, cd, cd_next); @@ -1837,7 +1836,9 @@ void get_next_crossing_from_edge(CrossData *cd, } } -template void dump_crossings(const Span> crossings) +constexpr int inline_crossings_size = 128; +template +void dump_crossings(const Vector, inline_crossings_size> &crossings) { std::cout << "CROSSINGS\n"; for (int i = 0; i < crossings.size(); ++i) { @@ -1916,7 +1917,7 @@ void add_edge_constraint( * one hop. Saves a bunch of orient2d tests in that common case. */ int visit = ++cdt_state->visit_count; - Vector, 128> crossings; + Vector, inline_crossings_size> crossings; crossings.append(CrossData(T(0), v1, nullptr, nullptr)); int n; while (!((n = crossings.size()) > 0 && crossings[n - 1].vert == v2)) { @@ -1948,7 +1949,7 @@ void add_edge_constraint( } if (dbg_level > 0) { - dump_crossings(crossings); + dump_crossings(crossings); } /* diff --git a/source/blender/blenlib/intern/easing.c b/source/blender/blenlib/intern/easing.c index aa4c0f8a501..6824da2cf8c 100644 --- a/source/blender/blenlib/intern/easing.c +++ b/source/blender/blenlib/intern/easing.c @@ -10,7 +10,7 @@ #include "BLI_easing.h" /* own include */ -#include "BLI_strict_flags.h" /* Keep last. */ +#include "BLI_strict_flags.h" /* blend if (amplitude < fabsf(change) */ #define USE_ELASTIC_BLEND diff --git a/source/blender/blenlib/intern/filereader_zstd.c b/source/blender/blenlib/intern/filereader_zstd.c index 0c14ad2b9de..45ef6dcea43 100644 --- a/source/blender/blenlib/intern/filereader_zstd.c +++ b/source/blender/blenlib/intern/filereader_zstd.c @@ -9,6 +9,8 @@ #include #include +#include "BLI_blenlib.h" +#include "BLI_endian_switch.h" #include "BLI_filereader.h" #include "BLI_math_base.h" diff --git a/source/blender/blenlib/intern/generic_virtual_array.cc b/source/blender/blenlib/intern/generic_virtual_array.cc index 64d4f52a3ed..e0812456da0 100644 --- a/source/blender/blenlib/intern/generic_virtual_array.cc +++ b/source/blender/blenlib/intern/generic_virtual_array.cc @@ -265,33 +265,21 @@ template class GVArrayImpl_For_SmallTrivialSingleValue : public } private: - void get(const int64_t index, void *r_value) const final + void get(const int64_t /*index*/, void *r_value) const override { - this->get_to_uninitialized(index, r_value); + this->copy_value_to(r_value); } - void get_to_uninitialized(const int64_t /*index*/, void *r_value) const final + void get_to_uninitialized(const int64_t /*index*/, void *r_value) const override { - memcpy(r_value, &buffer_, type_->size()); + this->copy_value_to(r_value); } - void materialize(const IndexMask &mask, void *dst) const final + void copy_value_to(void *dst) const { - this->materialize_to_uninitialized(mask, dst); - } - void materialize_to_uninitialized(const IndexMask &mask, void *dst) const final - { - type_->fill_construct_indices(buffer_, dst, mask); - } - void materialize_compressed(const IndexMask &mask, void *dst) const final - { - this->materialize_compressed_to_uninitialized(mask, dst); - } - void materialize_compressed_to_uninitialized(const IndexMask &mask, void *dst) const final - { - type_->fill_construct_n(buffer_, dst, mask.size()); + memcpy(dst, &buffer_, type_->size()); } - CommonVArrayInfo common_info() const final + CommonVArrayInfo common_info() const override { return CommonVArrayInfo{CommonVArrayInfo::Type::Single, true, &buffer_}; } @@ -511,29 +499,15 @@ class GVArrayImpl_For_SlicedGVArray : public GVArrayImpl { return {}; } - void materialize(const IndexMask &mask, void *dst) const final - { - IndexMaskMemory memory; - const IndexMask shifted_mask = mask.shift(offset_, memory); - varray_.materialize(shifted_mask, dst); - } - void materialize_to_uninitialized(const IndexMask &mask, void *dst) const final - { - IndexMaskMemory memory; - const IndexMask shifted_mask = mask.shift(offset_, memory); - varray_.materialize_to_uninitialized(shifted_mask, dst); - } - void materialize_compressed(const IndexMask &mask, void *dst) const final - { - IndexMaskMemory memory; - const IndexMask shifted_mask = mask.shift(offset_, memory); - varray_.materialize_compressed(shifted_mask, dst); - } void materialize_compressed_to_uninitialized(const IndexMask &mask, void *dst) const override { - IndexMaskMemory memory; - const IndexMask shifted_mask = mask.shift(offset_, memory); - varray_.materialize_compressed_to_uninitialized(shifted_mask, dst); + IndexMaskFromSegment mask_from_segment; + mask.foreach_segment([&](const IndexMaskSegment segment, const int64_t start) { + const IndexMask &segment_mask = mask_from_segment.update( + {segment.offset() + offset_, segment.base_span()}); + varray_.materialize_compressed_to_uninitialized(segment_mask, + POINTER_OFFSET(dst, type_->size() * start)); + }); } }; diff --git a/source/blender/blenlib/intern/gsqueue.c b/source/blender/blenlib/intern/gsqueue.c index c53a07d60e2..55cfbd65655 100644 --- a/source/blender/blenlib/intern/gsqueue.c +++ b/source/blender/blenlib/intern/gsqueue.c @@ -14,10 +14,9 @@ #include "MEM_guardedalloc.h" #include "BLI_gsqueue.h" +#include "BLI_strict_flags.h" #include "BLI_utildefines.h" -#include "BLI_strict_flags.h" /* Keep last. */ - /* target chunk size: 64kb */ #define CHUNK_SIZE_DEFAULT (1 << 16) /* ensure we get at least this many elems per chunk */ diff --git a/source/blender/blenlib/intern/hash_md5.cc b/source/blender/blenlib/intern/hash_md5.cc index 0a7e09a9b73..0388cfdd6a9 100644 --- a/source/blender/blenlib/intern/hash_md5.cc +++ b/source/blender/blenlib/intern/hash_md5.cc @@ -10,9 +10,9 @@ * according to the definition of MD5 in RFC 1321 from April 1992. */ -#include -#include -#include +#include +#include +#include #include #include "BLI_hash_md5.hh" /* own include */ @@ -78,7 +78,7 @@ struct md5_ctx { /* This array contains the bytes used to pad the buffer to the next 64-byte boundary. * (RFC 1321, 3.1: Step 1) */ -static const uchar fillbuf[64] = {0x80, 0 /* , 0, 0, ... */}; +static const unsigned char fillbuf[64] = {0x80, 0 /* , 0, 0, ... */}; /** * Initialize structure containing state of computation. @@ -268,7 +268,8 @@ static void *md5_read_ctx(const md5_ctx *ctx, void *resbuf) return resbuf; } -/* Top level public functions. */ +/* +Top level public functions. */ int BLI_hash_md5_stream(FILE *stream, void *resblock) { @@ -285,7 +286,7 @@ int BLI_hash_md5_stream(FILE *stream, void *resblock) len[1] = 0; /* Iterate over full file contents. */ - while (true) { + while (1) { /* We read the file in blocks of BLOCKSIZE bytes. * One call of the computation function processes the whole buffer * so that with the next round of the loop another block can be read. @@ -382,12 +383,12 @@ void *BLI_hash_md5_buffer(const char *buffer, size_t len, void *resblock) char *BLI_hash_md5_to_hexdigest(const void *resblock, char r_hex_digest[33]) { static const char hex_map[17] = "0123456789abcdef"; - const uchar *p; + const unsigned char *p; char *q; short len; - for (q = r_hex_digest, p = (const uchar *)resblock, len = 0; len < 16; p++, len++) { - const uchar c = *p; + for (q = r_hex_digest, p = (const unsigned char *)resblock, len = 0; len < 16; p++, len++) { + const unsigned char c = *p; *q++ = hex_map[c >> 4]; *q++ = hex_map[c & 15]; } diff --git a/source/blender/blenlib/intern/hash_mm2a.cc b/source/blender/blenlib/intern/hash_mm2a.cc index f8a26aad932..9af4b60c690 100644 --- a/source/blender/blenlib/intern/hash_mm2a.cc +++ b/source/blender/blenlib/intern/hash_mm2a.cc @@ -45,7 +45,7 @@ static void mm2a_mix_tail(BLI_HashMurmur2A *mm2, const uchar **data, size_t *len) { while (*len && ((*len < 4) || mm2->count)) { - mm2->tail |= uint32_t(**data) << (mm2->count * 8); + mm2->tail |= (uint32_t)(**data) << (mm2->count * 8); mm2->count++; (*len)--; @@ -69,7 +69,7 @@ void BLI_hash_mm2a_init(BLI_HashMurmur2A *mm2, uint32_t seed) void BLI_hash_mm2a_add(BLI_HashMurmur2A *mm2, const uchar *data, size_t len) { - mm2->size += uint32_t(len); + mm2->size += (uint32_t)len; mm2a_mix_tail(mm2, &data, &len); diff --git a/source/blender/blenlib/intern/index_mask.cc b/source/blender/blenlib/intern/index_mask.cc index d5039cc63d7..979676e77e5 100644 --- a/source/blender/blenlib/intern/index_mask.cc +++ b/source/blender/blenlib/intern/index_mask.cc @@ -2,7 +2,6 @@ * * SPDX-License-Identifier: GPL-2.0-or-later */ -#include #include #include @@ -10,16 +9,15 @@ #include "BLI_bit_vector.hh" #include "BLI_enumerable_thread_specific.hh" #include "BLI_index_mask.hh" -#include "BLI_index_mask_expression.hh" #include "BLI_math_base.hh" #include "BLI_set.hh" #include "BLI_sort.hh" +#include "BLI_strict_flags.h" #include "BLI_task.hh" #include "BLI_threads.h" +#include "BLI_timeit.hh" #include "BLI_virtual_array.hh" -#include "BLI_strict_flags.h" /* Keep last. */ - namespace blender::index_mask { template void build_reverse_map(const IndexMask &mask, MutableSpan r_map) @@ -96,18 +94,23 @@ std::ostream &operator<<(std::ostream &stream, const IndexMask &mask) mask.to_indices(indices); Vector>> segments; unique_sorted_indices::split_to_ranges_and_spans(indices, 8, segments); - Vector parts; + std::cout << "(Size: " << mask.size() << " | "; for (const std::variant> &segment : segments) { if (std::holds_alternative(segment)) { const IndexRange range = std::get(segment); - parts.append(fmt::format("{}-{}", range.first(), range.last())); + std::cout << range; } else { const Span segment_indices = std::get>(segment); - parts.append(fmt::format("{}", fmt::join(segment_indices, ", "))); + std::cout << "["; + for (const int64_t index : segment_indices) { + std::cout << index << ","; + } + std::cout << "]"; } + std::cout << ", "; } - stream << fmt::format("(Size: {} | {})", mask.size(), fmt::join(parts, ", ")); + std::cout << ")"; return stream; } @@ -170,17 +173,17 @@ IndexMask IndexMask::slice_content(const int64_t start, const int64_t size) cons return this->slice(*first_it, *last_it, sliced_mask_size); } -IndexMask IndexMask::slice_and_shift(const IndexRange range, - const int64_t offset, - IndexMaskMemory &memory) const +IndexMask IndexMask::slice_and_offset(const IndexRange range, + const int64_t offset, + IndexMaskMemory &memory) const { - return this->slice_and_shift(range.start(), range.size(), offset, memory); + return this->slice_and_offset(range.start(), range.size(), offset, memory); } -IndexMask IndexMask::slice_and_shift(const int64_t start, - const int64_t size, - const int64_t offset, - IndexMaskMemory &memory) const +IndexMask IndexMask::slice_and_offset(const int64_t start, + const int64_t size, + const int64_t offset, + IndexMaskMemory &memory) const { if (size == 0) { return {}; @@ -188,35 +191,31 @@ IndexMask IndexMask::slice_and_shift(const int64_t start, if (std::optional range = this->to_range()) { return range->slice(start, size).shift(offset); } - return this->slice(start, size).shift(offset, memory); -} - -IndexMask IndexMask::shift(const int64_t offset, IndexMaskMemory &memory) const -{ - if (indices_num_ == 0) { - return {}; - } - BLI_assert(this->first() + offset >= 0); + IndexMask sliced_mask = this->slice(start, size); if (offset == 0) { - return *this; + return sliced_mask; } - if (std::optional range = this->to_range()) { + if (std::optional range = sliced_mask.to_range()) { return range->shift(offset); } - IndexMask shifted_mask = *this; - MutableSpan new_segment_offsets = memory.allocate_array(segments_num_); - for (const int64_t i : IndexRange(segments_num_)) { - new_segment_offsets[i] = segment_offsets_[i] + offset; + MutableSpan new_segment_offsets = memory.allocate_array( + sliced_mask.segments_num_); + for (const int64_t i : new_segment_offsets.index_range()) { + new_segment_offsets[i] = sliced_mask.segment_offsets_[i] + offset; } - shifted_mask.segment_offsets_ = new_segment_offsets.data(); - return shifted_mask; + sliced_mask.segment_offsets_ = new_segment_offsets.data(); + return sliced_mask; } -int64_t consolidate_index_mask_segments(MutableSpan segments, - IndexMaskMemory & /*memory*/) +/** + * Merges consecutive segments in some cases. Having fewer but larger segments generally allows for + * better performance when using the mask later on. + */ +static void consolidate_segments(Vector &segments, + IndexMaskMemory & /*memory*/) { if (segments.is_empty()) { - return 0; + return; } const Span static_indices = get_static_indices_array(); @@ -232,7 +231,7 @@ int64_t consolidate_index_mask_segments(MutableSpan segments, return; } /* Join multiple ranges together into a bigger range. */ - const IndexRange range = IndexRange::from_begin_end_inclusive(group_first, group_last); + const IndexRange range{group_first, group_last + 1 - group_first}; segments[group_start_segment_i] = IndexMaskSegment(range[0], static_indices.take_front(range.size())); for (int64_t i = group_start_segment_i + 1; i <= last_segment_i; i++) { @@ -265,13 +264,7 @@ int64_t consolidate_index_mask_segments(MutableSpan segments, finish_group(segments.size() - 1); /* Remove all segments that have been merged into previous segments. */ - const int64_t new_segments_num = std::remove_if(segments.begin(), - segments.end(), - [](const IndexMaskSegment segment) { - return segment.is_empty(); - }) - - segments.begin(); - return new_segments_num; + segments.remove_if([](const IndexMaskSegment segment) { return segment.is_empty(); }); } IndexMask IndexMask::from_segments(const Span segments, IndexMaskMemory &memory) @@ -392,12 +385,166 @@ struct ParallelSegmentsCollector { } }; +/** + * Convert a range to potentially multiple index mask segments. + */ +static void range_to_segments(const IndexRange range, Vector &r_segments) +{ + const Span static_indices = get_static_indices_array(); + for (int64_t start = 0; start < range.size(); start += max_segment_size) { + const int64_t size = std::min(max_segment_size, range.size() - start); + r_segments.append_as(range.start() + start, static_indices.take_front(size)); + } +} + +static int64_t get_size_before_gap(const Span indices) +{ + BLI_assert(indices.size() >= 2); + if (indices[1] > indices[0] + 1) { + /* For sparse indices, often the next gap is just after the next index. + * In this case we can skip the logarithmic check below. */ + return 1; + } + return unique_sorted_indices::find_size_of_next_range(indices); +} + +static void inverted_indices_to_segments(const IndexMaskSegment segment, + LinearAllocator<> &allocator, + Vector &r_segments) +{ + constexpr int64_t range_threshold = 64; + const int64_t offset = segment.offset(); + const Span static_indices = get_static_indices_array(); + + int64_t inverted_index_count = 0; + std::array inverted_indices_array; + auto add_indices = [&](const int16_t start, const int16_t num) { + int16_t *new_indices_begin = inverted_indices_array.data() + inverted_index_count; + std::iota(new_indices_begin, new_indices_begin + num, start); + inverted_index_count += num; + }; + + auto finish_indices = [&]() { + if (inverted_index_count == 0) { + return; + } + MutableSpan offset_indices = allocator.allocate_array(inverted_index_count); + offset_indices.copy_from(Span(inverted_indices_array).take_front(inverted_index_count)); + r_segments.append_as(offset, offset_indices); + inverted_index_count = 0; + }; + + Span indices = segment.base_span(); + while (indices.size() > 1) { + const int64_t size_before_gap = get_size_before_gap(indices); + if (size_before_gap == indices.size()) { + break; + } + + const int16_t gap_first = indices[size_before_gap - 1] + 1; + const int16_t next = indices[size_before_gap]; + const int16_t gap_size = next - gap_first; + if (gap_size > range_threshold) { + finish_indices(); + r_segments.append_as(offset + gap_first, static_indices.take_front(gap_size)); + } + else { + add_indices(gap_first, gap_size); + } + + indices = indices.drop_front(size_before_gap); + } + + finish_indices(); +} + +static void invert_segments(const IndexMask &mask, + const IndexRange segment_range, + LinearAllocator<> &allocator, + Vector &r_segments) +{ + for (const int64_t segment_i : segment_range) { + const IndexMaskSegment segment = mask.segment(segment_i); + inverted_indices_to_segments(segment, allocator, r_segments); + + const IndexMaskSegment next_segment = mask.segment(segment_i + 1); + const int64_t between_start = segment.last() + 1; + const int64_t size_between_segments = next_segment[0] - segment.last() - 1; + const IndexRange range_between_segments(between_start, size_between_segments); + if (!range_between_segments.is_empty()) { + range_to_segments(range_between_segments, r_segments); + } + } +} + IndexMask IndexMask::complement(const IndexRange universe, IndexMaskMemory &memory) const { - ExprBuilder builder; - const IndexMask universe_mask{universe}; - const Expr &expr = builder.subtract(&universe_mask, {this}); - return evaluate_expression(expr, memory); + if (this->is_empty()) { + return universe; + } + if (universe.is_empty()) { + return {}; + } + const std::optional this_range = this->to_range(); + if (this_range) { + const bool first_in_range = this_range->first() <= universe.first(); + const bool last_in_range = this_range->last() >= universe.last(); + if (first_in_range && last_in_range) { + /* This mask fills the entire universe, so the complement is empty. */ + return {}; + } + if (first_in_range) { + /* This mask is a range that contains the start of the universe. + * The complement is a range that contains the end of the universe. */ + const int64_t complement_start = this_range->one_after_last(); + const int64_t complement_size = universe.one_after_last() - complement_start; + return IndexRange(complement_start, complement_size); + } + if (last_in_range) { + /* This mask is a range that contains the end of the universe. + * The complement is a range that contains the start of the universe. */ + const int64_t complement_start = universe.first(); + const int64_t complement_size = this_range->first() - complement_start; + return IndexRange(complement_start, complement_size); + } + } + + Vector segments; + + if (universe.start() < this->first()) { + range_to_segments(universe.take_front(this->first() - universe.start()), segments); + } + + if (!this_range) { + const int64_t segments_num = this->segments_num(); + + constexpr int64_t min_grain_size = 16; + constexpr int64_t max_grain_size = 4096; + const int64_t threads_num = BLI_system_thread_count(); + const int64_t grain_size = std::clamp( + segments_num / threads_num, min_grain_size, max_grain_size); + + const IndexRange non_last_segments = IndexRange(segments_num).drop_back(1); + if (segments_num < min_grain_size) { + invert_segments(*this, non_last_segments, memory, segments); + } + else { + ParallelSegmentsCollector segments_collector; + threading::parallel_for(non_last_segments, grain_size, [&](const IndexRange range) { + ParallelSegmentsCollector::LocalData &local_data = + segments_collector.data_by_thread.local(); + invert_segments(*this, range, local_data.allocator, local_data.segments); + }); + segments_collector.reduce(memory, segments); + } + inverted_indices_to_segments(this->segment(segments_num - 1), memory, segments); + } + + if (universe.last() > this->first()) { + range_to_segments(universe.take_back(universe.last() - this->last()), segments); + } + + return IndexMask::from_segments(segments, memory); } template @@ -433,8 +580,7 @@ IndexMask IndexMask::from_indices(const Span indices, IndexMaskMemory &memory }); segments_collector.reduce(memory, segments); } - const int64_t consolidated_segments_num = consolidate_index_mask_segments(segments, memory); - segments.resize(consolidated_segments_num); + consolidate_segments(segments, memory); return IndexMask::from_segments(segments, memory); } @@ -490,9 +636,13 @@ IndexMask IndexMask::from_union(const IndexMask &mask_a, const IndexMask &mask_b, IndexMaskMemory &memory) { - ExprBuilder builder; - const Expr &expr = builder.merge({&mask_a, &mask_b}); - return evaluate_expression(expr, memory); + const int64_t new_size = math::max(mask_a.min_array_size(), mask_b.min_array_size()); + Array tmp(new_size, false); + mask_a.foreach_index_optimized(GrainSize(2048), + [&](const int64_t i) { tmp[i] = true; }); + mask_b.foreach_index_optimized(GrainSize(2048), + [&](const int64_t i) { tmp[i] = true; }); + return IndexMask::from_bools(tmp, memory); } IndexMask IndexMask::from_initializers(const Span initializers, @@ -534,20 +684,17 @@ template void IndexMask::to_indices(MutableSpan r_indices) const }); } -void IndexMask::to_bits(MutableBitSpan r_bits, const int64_t offset) const +void IndexMask::to_bits(MutableBitSpan r_bits) const { - BLI_assert(r_bits.size() >= this->min_array_size() + offset); + BLI_assert(r_bits.size() >= this->min_array_size()); r_bits.reset_all(); this->foreach_segment_optimized([&](const auto segment) { if constexpr (std::is_same_v, IndexRange>) { const IndexRange range = segment; - const IndexRange shifted_range = range.shift(offset); - r_bits.slice(shifted_range).set_all(); + r_bits.slice(range).set_all(); } else { - const IndexMaskSegment indices = segment; - const IndexMaskSegment shifted_indices = indices.shift(offset); - for (const int64_t i : shifted_indices) { + for (const int64_t i : segment) { r_bits[i].set(); } } @@ -638,8 +785,7 @@ IndexMask from_predicate_impl( segments_collector.reduce(memory, segments); } - const int64_t consolidated_segments_num = consolidate_index_mask_segments(segments, memory); - segments.resize(consolidated_segments_num); + consolidate_segments(segments, memory); return IndexMask::from_segments(segments, memory); } } // namespace detail @@ -717,284 +863,6 @@ bool IndexMask::contains(const int64_t query_index) const return this->find(query_index).has_value(); } -static Array build_every_nth_index_array(const int64_t n) -{ - Array data(max_segment_size / n); - for (const int64_t i : data.index_range()) { - const int64_t index = i * n; - BLI_assert(index < max_segment_size); - data[i] = int16_t(index); - } - return data; -} - -/** - * Returns a span containing every nth index. This is optimized for a few special values of n - * which are cached. The returned indices have either static life-time, or they are freed when the - * given memory is feed. - */ -static Span get_every_nth_index(const int64_t n, - const int64_t repetitions, - IndexMaskMemory &memory) -{ - BLI_assert(n >= 2); - BLI_assert(n * repetitions <= max_segment_size); - - switch (n) { - case 2: { - static auto data = build_every_nth_index_array(2); - return data.as_span().take_front(repetitions); - } - case 3: { - static auto data = build_every_nth_index_array(3); - return data.as_span().take_front(repetitions); - } - case 4: { - static auto data = build_every_nth_index_array(4); - return data.as_span().take_front(repetitions); - } - default: { - MutableSpan data = memory.allocate_array(repetitions); - for (const int64_t i : IndexRange(repetitions)) { - const int64_t index = i * n; - BLI_assert(index < max_segment_size); - data[i] = int16_t(index); - } - return data; - } - } -} - -IndexMask IndexMask::from_repeating(const IndexMask &mask_to_repeat, - const int64_t repetitions, - const int64_t stride, - const int64_t initial_offset, - IndexMaskMemory &memory) -{ - if (mask_to_repeat.is_empty()) { - return {}; - } - BLI_assert(mask_to_repeat.last() < stride); - if (repetitions == 0) { - return {}; - } - if (repetitions == 1 && initial_offset == 0) { - /* The output is the same as the input mask. */ - return mask_to_repeat; - } - const std::optional range_to_repeat = mask_to_repeat.to_range(); - if (range_to_repeat && range_to_repeat->first() == 0 && range_to_repeat->size() == stride) { - /* The output is a range. */ - return IndexRange(initial_offset, repetitions * stride); - } - const int64_t segments_num = mask_to_repeat.segments_num(); - const IndexRange bounds = mask_to_repeat.bounds(); - - /* Avoid having many very small segments by creating a single segment that contains the input - * multiple times already. This way, a lower total number of segments is necessary. */ - if (segments_num == 1 && stride <= max_segment_size / 2 && mask_to_repeat.size() <= 256) { - const IndexMaskSegment src_segment = mask_to_repeat.segment(0); - /* Number of repetitions that fit into a single segment. */ - const int64_t inline_repetitions_num = std::min(repetitions, max_segment_size / stride); - Span repeated_indices; - if (src_segment.size() == 1) { - /* Optimize the case when a single index is repeated. */ - repeated_indices = get_every_nth_index(stride, inline_repetitions_num, memory); - } - else { - /* More general case that repeats multiple indices. */ - MutableSpan repeated_indices_mut = memory.allocate_array( - inline_repetitions_num * src_segment.size()); - for (const int64_t repetition : IndexRange(inline_repetitions_num)) { - for (const int64_t i : src_segment.index_range()) { - const int64_t index = src_segment[i] - src_segment[0] + repetition * stride; - BLI_assert(index < max_segment_size); - repeated_indices_mut[repetition * src_segment.size() + i] = int16_t(index); - } - } - repeated_indices = repeated_indices_mut; - } - BLI_assert(repeated_indices[0] == 0); - - Vector repeated_segments; - const int64_t result_segments_num = ceil_division(repetitions, inline_repetitions_num); - for (const int64_t i : IndexRange(result_segments_num)) { - const int64_t used_repetitions = std::min(inline_repetitions_num, - repetitions - i * inline_repetitions_num); - repeated_segments.append( - IndexMaskSegment(initial_offset + bounds.first() + i * stride * inline_repetitions_num, - repeated_indices.take_front(used_repetitions * src_segment.size()))); - } - return IndexMask::from_segments(repeated_segments, memory); - } - - /* Simply repeat and offset the existing segments in the input mask. */ - Vector repeated_segments; - for (const int64_t repetition : IndexRange(repetitions)) { - for (const int64_t segment_i : IndexRange(segments_num)) { - const IndexMaskSegment segment = mask_to_repeat.segment(segment_i); - repeated_segments.append(IndexMaskSegment( - segment.offset() + repetition * stride + initial_offset, segment.base_span())); - } - } - return IndexMask::from_segments(repeated_segments, memory); -} - -IndexMask IndexMask::from_every_nth(const int64_t n, - const int64_t indices_num, - const int64_t initial_offset, - IndexMaskMemory &memory) -{ - BLI_assert(n >= 1); - return IndexMask::from_repeating(IndexRange(1), indices_num, n, initial_offset, memory); -} - -void IndexMask::foreach_segment_zipped(const Span masks, - const FunctionRef segments)> fn) -{ - BLI_assert(!masks.is_empty()); - BLI_assert(std::all_of(masks.begin() + 1, masks.end(), [&](const IndexMask &maks) { - return masks[0].size() == maks.size(); - })); - - Array segment_iter(masks.size(), 0); - Array start_iter(masks.size(), 0); - - Array segments(masks.size()); - Array sequences(masks.size()); - - /* This function only take positions of indices in to account. - * Masks with the same size is fragmented in positions space. - * So, all last segments (index in mask does not matter) of all masks will be ended in the same - * position. All segment iterators will be out of range at the same time. */ - while (segment_iter[0] != masks[0].segments_num()) { - for (const int64_t mask_i : masks.index_range()) { - if (start_iter[mask_i] == 0) { - segments[mask_i] = masks[mask_i].segment(segment_iter[mask_i]); - } - } - - int16_t next_common_sequence_size = std::numeric_limits::max(); - for (const int64_t mask_i : masks.index_range()) { - next_common_sequence_size = math::min(next_common_sequence_size, - int16_t(segments[mask_i].size() - start_iter[mask_i])); - } - - for (const int64_t mask_i : masks.index_range()) { - sequences[mask_i] = segments[mask_i].slice(start_iter[mask_i], next_common_sequence_size); - } - - if (!fn(sequences)) { - break; - } - - for (const int64_t mask_i : masks.index_range()) { - if (segments[mask_i].size() - start_iter[mask_i] == next_common_sequence_size) { - segment_iter[mask_i]++; - start_iter[mask_i] = 0; - } - else { - start_iter[mask_i] += next_common_sequence_size; - } - } - } -} - -static bool segments_is_equal(const IndexMaskSegment &a, const IndexMaskSegment &b) -{ - if (a.size() != b.size()) { - return false; - } - if (a.is_empty()) { - /* Both segments are empty. */ - return true; - } - if (a[0] != b[0]) { - return false; - } - - const bool a_is_range = unique_sorted_indices::non_empty_is_range(a.base_span()); - const bool b_is_range = unique_sorted_indices::non_empty_is_range(b.base_span()); - if (a_is_range || b_is_range) { - return a_is_range && b_is_range; - } - - const Span a_indices = a.base_span(); - [[maybe_unused]] const Span b_indices = b.base_span(); - - const int64_t offset_difference = int16_t(b.offset() - a.offset()); - - BLI_assert(a_indices[0] >= 0 && b_indices[0] >= 0); - BLI_assert(b_indices[0] == a_indices[0] - offset_difference); - - return std::equal(a_indices.begin(), - a_indices.end(), - b.base_span().begin(), - [offset_difference](const int16_t a_index, const int16_t b_index) -> bool { - return a_index - offset_difference == b_index; - }); -} - -bool operator==(const IndexMask &a, const IndexMask &b) -{ - if (a.size() != b.size()) { - return false; - } - - const std::optional a_as_range = a.to_range(); - const std::optional b_as_range = b.to_range(); - if (a_as_range.has_value() || b_as_range.has_value()) { - return a_as_range == b_as_range; - } - - bool equals = true; - IndexMask::foreach_segment_zipped({a, b}, [&](const Span segments) { - equals &= segments_is_equal(segments[0], segments[1]); - return equals; - }); - - return equals; -} - -Vector IndexMask::from_group_ids(const IndexMask &universe, - const VArray &group_ids, - IndexMaskMemory &memory, - VectorSet &r_index_by_group_id) -{ - BLI_assert(group_ids.size() >= universe.min_array_size()); - Vector result_masks; - if (const std::optional single_group_id = group_ids.get_if_single()) { - /* Optimize for the case when all group ids are the same. */ - const int64_t group_index = r_index_by_group_id.index_of_or_add(*single_group_id); - const int64_t groups_num = r_index_by_group_id.size(); - result_masks.resize(groups_num); - result_masks[group_index] = universe; - return result_masks; - } - - const VArraySpan group_ids_span{group_ids}; - universe.foreach_index([&](const int64_t i) { r_index_by_group_id.add(group_ids_span[i]); }); - const int64_t groups_num = r_index_by_group_id.size(); - result_masks.resize(groups_num); - IndexMask::from_groups( - universe, - memory, - [&](const int64_t i) { - const int group_id = group_ids_span[i]; - return r_index_by_group_id.index_of(group_id); - }, - result_masks); - return result_masks; -} - -Vector IndexMask::from_group_ids(const VArray &group_ids, - IndexMaskMemory &memory, - VectorSet &r_index_by_group_id) -{ - return IndexMask::from_group_ids( - IndexMask(group_ids.size()), group_ids, memory, r_index_by_group_id); -} - template IndexMask IndexMask::from_indices(Span, IndexMaskMemory &); template IndexMask IndexMask::from_indices(Span, IndexMaskMemory &); template void IndexMask::to_indices(MutableSpan) const; diff --git a/source/blender/blenlib/intern/index_mask_expression.cc b/source/blender/blenlib/intern/index_mask_expression.cc deleted file mode 100644 index 4252d912d32..00000000000 --- a/source/blender/blenlib/intern/index_mask_expression.cc +++ /dev/null @@ -1,1360 +0,0 @@ -/* SPDX-FileCopyrightText: 2024 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** - * Expression evaluation has multiple phases: - * 1. A coarse evaluation that tries to find segments which can be trivially evaluated. For - * example, taking the union of two overlapping ranges can be done in O(1) time. - * 2. For all segments which can't be fully evaluated using coarse evaluation, an exact evaluation - * is done. This uses either an index-based or bit-based approach depending on a heuristic. - * 3. Construct the final index mask based on the resulting intermediate segments. - */ - -#include "BLI_array.hh" -#include "BLI_bit_group_vector.hh" -#include "BLI_bit_span_ops.hh" -#include "BLI_enumerable_thread_specific.hh" -#include "BLI_index_mask_expression.hh" -#include "BLI_stack.hh" -#include "BLI_strict_flags.h" -#include "BLI_task.hh" -#include "BLI_timeit.hh" - -namespace blender::index_mask { - -/** - * Number of expression terms which don't require extra allocations in some places. - */ -constexpr int64_t inline_expr_array_size = 16; - -/** - * The result of the coarse evaluation for a specific index range. - */ -struct CoarseSegment { - enum class Type { - /** - * Coarse evaluation couldn't fully resolve this segment. The segment requires another - * evaluation that is more detailed. - */ - Unknown, - /** All indices in the segment are part of the result. */ - Full, - /** The evaluated result of this segment is just the copy of an input index mask. */ - Copy, - }; - Type type = Type::Unknown; - IndexRange bounds; - /** Mask used when the type is #Copy. */ - const IndexMask *mask = nullptr; -}; - -/** Contains the result of a coarse evaluation split into potentially many segments. */ -struct CoarseResult { - Vector segments; -}; - -/** Used during coarse evaluation to split the full range into multiple segments. */ -struct CourseBoundary { - /** - * The position of the boundary. The boundary is right before this index. So if this boundary is - * a beginning of a segment, the index marks the first element. If it is the end, the index marks - * the one-after-last position. - */ - int64_t index; - /** Whether this boundary is the beginning or end of the segment below. */ - bool is_begin; - /** The segment this boundary comes from. */ - const CoarseSegment *segment; -}; - -/** For the difference operation, we need to know if a boundary belongs to the main term or not. */ -struct DifferenceCourseBoundary : public CourseBoundary { - bool is_main; -}; - -/** - * Result of the expression evaluation within a specific index range. Sometimes this can be derived - * directly from the coarse evaluation, but sometimes an additional exact evaluation is necessary. - */ -struct EvaluatedSegment { - enum class Type { - /** All indices in this segment are part of the evaluated index mask. */ - Full, - /** The result in this segment is the same as what is contained in the #copy_mask below. */ - Copy, - /** The result comes from exact evaluation and is a new set of indices. */ - Indices, - }; - - Type type = Type::Indices; - IndexRange bounds; - /** Only used when the type is #Type::Copy. */ - const IndexMask *copy_mask = nullptr; - /** Only used when the type is #Type::Indices. */ - IndexMaskSegment indices; -}; - -/** - * There are different ways to do the exact evaluation. Depending on the expression or data, one - * or the other is more efficient. - */ -enum class ExactEvalMode { - /** - * Does the evaluation by working directly with arrays of sorted indices. This is usually best - * when the expression does not have intermediate results, i.e. it is very simple. - */ - Indices, - /** - * The evaluation works with bits. There is extra overhead to convert the input masks to bit - * arrays and to convert the final result back into indices. In exchange, the actual expression - * evaluation is significantly cheaper because it's just a bunch of bit operations. For larger - * expressions, this is typically much more efficient. - */ - Bits, -}; - -static void sort_course_boundaries(MutableSpan boundaries) -{ - std::sort(boundaries.begin(), - boundaries.end(), - [](const CourseBoundary &a, const CourseBoundary &b) { return a.index < b.index; }); -} - -static void sort_course_boundaries(MutableSpan boundaries) -{ - std::sort(boundaries.begin(), - boundaries.end(), - [](const DifferenceCourseBoundary &a, const DifferenceCourseBoundary &b) { - return a.index < b.index; - }); -} - -/** Smaller segments should generally be merged together. */ -static constexpr int64_t segment_size_threshold = 32; - -/** Extends a previous full segment or appends a new one. */ -static CoarseSegment &add_coarse_segment__full(CoarseSegment *prev_segment, - const int64_t prev_boundary_index, - const int64_t current_boundary_index, - CoarseResult &result) -{ - const int64_t size = current_boundary_index - prev_boundary_index; - if (prev_segment) { - if (prev_segment->type == CoarseSegment::Type::Full && - prev_segment->bounds.one_after_last() == prev_boundary_index) - { - prev_segment->bounds = prev_segment->bounds.with_new_end(current_boundary_index); - return *prev_segment; - } - if (current_boundary_index - prev_segment->bounds.start() < max_segment_size) { - if (prev_segment->bounds.size() + size < segment_size_threshold) { - /* Extend the previous segment because it's so small and change it into an unknown one. */ - prev_segment->bounds = prev_segment->bounds.with_new_end(current_boundary_index); - prev_segment->type = CoarseSegment::Type::Unknown; - return *prev_segment; - } - } - } - result.segments.append( - {CoarseSegment::Type::Full, IndexRange::from_begin_size(prev_boundary_index, size)}); - return result.segments.last(); -} - -/** Extends a previous unknown segment or appends a new one. */ -static CoarseSegment &add_coarse_segment__unknown(CoarseSegment *prev_segment, - const int64_t prev_boundary_index, - const int64_t current_boundary_index, - CoarseResult &result) -{ - if (prev_segment) { - if (prev_segment->bounds.start() + segment_size_threshold >= prev_boundary_index) { - /* The previous segment is very short, so extend it. */ - prev_segment->type = CoarseSegment::Type::Unknown; - prev_segment->bounds = prev_segment->bounds.with_new_end(current_boundary_index); - return *prev_segment; - } - } - result.segments.append( - {CoarseSegment::Type::Unknown, - IndexRange::from_begin_end(prev_boundary_index, current_boundary_index)}); - return result.segments.last(); -} - -/** Extends a previous copy segment or appends a new one. */ -static CoarseSegment &add_coarse_segment__copy(CoarseSegment *prev_segment, - const int64_t prev_boundary_index, - const int64_t current_boundary_index, - const IndexMask ©_from_mask, - CoarseResult &result) -{ - if (prev_segment) { - if (prev_segment->type == CoarseSegment::Type::Copy && - prev_segment->bounds.one_after_last() == prev_boundary_index && - prev_segment->mask == ©_from_mask) - { - /* Can extend the previous copy segment. */ - prev_segment->bounds = prev_segment->bounds.with_new_end(current_boundary_index); - return *prev_segment; - } - if (prev_segment->bounds.start() + segment_size_threshold >= current_boundary_index) { - /* The previous and this segment together are very short, so better merge them together. */ - prev_segment->bounds = prev_segment->bounds.with_new_end(current_boundary_index); - prev_segment->type = CoarseSegment::Type::Unknown; - return *prev_segment; - } - } - result.segments.append({CoarseSegment::Type::Copy, - IndexRange::from_begin_end(prev_boundary_index, current_boundary_index), - ©_from_mask}); - return result.segments.last(); -} - -static void evaluate_coarse_union(const Span boundaries, CoarseResult &r_result) -{ - if (boundaries.is_empty()) { - return; - } - - CoarseResult &result = r_result; - CoarseSegment *prev_segment = nullptr; - Vector active_segments; - int64_t prev_boundary_index = boundaries[0].index; - - for (const CourseBoundary &boundary : boundaries) { - if (prev_boundary_index < boundary.index) { - /* Compute some properties of the input segments that were active between the current and the - * previous boundary. */ - bool has_full = false; - bool has_unknown = false; - bool copy_from_single_mask = true; - const IndexMask *copy_from_mask = nullptr; - for (const CoarseSegment *active_segment : active_segments) { - switch (active_segment->type) { - case CoarseSegment::Type::Unknown: { - has_unknown = true; - break; - } - case CoarseSegment::Type::Full: { - has_full = true; - break; - } - case CoarseSegment::Type::Copy: { - if (copy_from_mask != nullptr && copy_from_mask != active_segment->mask) { - copy_from_single_mask = false; - } - copy_from_mask = active_segment->mask; - break; - } - } - } - /* Determine the resulting coarse segment type based on the properties computed above. */ - if (has_full) { - prev_segment = &add_coarse_segment__full( - prev_segment, prev_boundary_index, boundary.index, result); - } - else if (has_unknown || !copy_from_single_mask) { - prev_segment = &add_coarse_segment__unknown( - prev_segment, prev_boundary_index, boundary.index, result); - } - else if (copy_from_mask != nullptr && copy_from_single_mask) { - prev_segment = &add_coarse_segment__copy( - prev_segment, prev_boundary_index, boundary.index, *copy_from_mask, result); - } - - prev_boundary_index = boundary.index; - } - - /* Update active segments. */ - if (boundary.is_begin) { - active_segments.append(boundary.segment); - } - else { - active_segments.remove_first_occurrence_and_reorder(boundary.segment); - } - } -} - -static void evaluate_coarse_intersection(const Span boundaries, - const int64_t terms_num, - CoarseResult &r_result) -{ - if (boundaries.is_empty()) { - return; - } - - CoarseResult &result = r_result; - CoarseSegment *prev_segment = nullptr; - Vector active_segments; - int64_t prev_boundary_index = boundaries[0].index; - - for (const CourseBoundary &boundary : boundaries) { - if (prev_boundary_index < boundary.index) { - /* Only if one segment of each term is active, it's possible that the output contains - * anything. */ - if (active_segments.size() == terms_num) { - /* Compute some properties of the input segments that were active between the current and - * previous boundary. */ - int full_count = 0; - int unknown_count = 0; - int copy_count = 0; - bool copy_from_single_mask = true; - const IndexMask *copy_from_mask = nullptr; - for (const CoarseSegment *active_segment : active_segments) { - switch (active_segment->type) { - case CoarseSegment::Type::Unknown: { - unknown_count++; - break; - } - case CoarseSegment::Type::Full: { - full_count++; - break; - } - case CoarseSegment::Type::Copy: { - copy_count++; - if (copy_from_mask != nullptr && copy_from_mask != active_segment->mask) { - copy_from_single_mask = false; - } - copy_from_mask = active_segment->mask; - break; - } - } - } - /* Determine the resulting coarse segment type based on the properties computed above. */ - BLI_assert(full_count + unknown_count + copy_count == terms_num); - if (full_count == terms_num) { - prev_segment = &add_coarse_segment__full( - prev_segment, prev_boundary_index, boundary.index, result); - } - else if (unknown_count > 0 || copy_count < terms_num || !copy_from_single_mask) { - prev_segment = &add_coarse_segment__unknown( - prev_segment, prev_boundary_index, boundary.index, result); - } - else if (copy_count == terms_num && copy_from_single_mask) { - prev_segment = &add_coarse_segment__copy( - prev_segment, prev_boundary_index, boundary.index, *copy_from_mask, result); - } - } - - prev_boundary_index = boundary.index; - } - - /* Update active segments. */ - if (boundary.is_begin) { - active_segments.append(boundary.segment); - } - else { - active_segments.remove_first_occurrence_and_reorder(boundary.segment); - } - } -} - -static void evaluate_coarse_difference(const Span boundaries, - CoarseResult &r_result) -{ - if (boundaries.is_empty()) { - return; - } - - CoarseResult &result = r_result; - CoarseSegment *prev_segment = nullptr; - Vector active_main_segments; - Vector active_subtract_segments; - int64_t prev_boundary_index = boundaries[0].index; - - for (const DifferenceCourseBoundary &boundary : boundaries) { - if (prev_boundary_index < boundary.index) { - /* There is only one main term, so at most one main segment can be active at once. */ - BLI_assert(active_main_segments.size() <= 1); - if (active_main_segments.size() == 1) { - const CoarseSegment &active_main_segment = *active_main_segments[0]; - /* Compute some properties of the input segments that were active between the current and - * the previous boundary. */ - bool has_subtract_full = false; - bool has_subtract_same_mask = false; - for (const CoarseSegment *active_subtract_segment : active_subtract_segments) { - switch (active_subtract_segment->type) { - case CoarseSegment::Type::Unknown: { - break; - } - case CoarseSegment::Type::Full: { - has_subtract_full = true; - break; - } - case CoarseSegment::Type::Copy: { - if (active_main_segment.type == CoarseSegment::Type::Copy) { - if (active_main_segment.mask == active_subtract_segment->mask) { - has_subtract_same_mask = true; - } - } - break; - } - } - } - /* Determine the resulting coarse segment type based on the properties computed above. */ - if (has_subtract_full) { - /* Do nothing, the resulting segment is empty for the current range. */ - } - else { - switch (active_main_segment.type) { - case CoarseSegment::Type::Unknown: { - prev_segment = &add_coarse_segment__unknown( - prev_segment, prev_boundary_index, boundary.index, result); - break; - } - case CoarseSegment::Type::Full: { - if (active_subtract_segments.is_empty()) { - prev_segment = &add_coarse_segment__full( - prev_segment, prev_boundary_index, boundary.index, result); - } - else { - prev_segment = &add_coarse_segment__unknown( - prev_segment, prev_boundary_index, boundary.index, result); - } - break; - } - case CoarseSegment::Type::Copy: { - if (active_subtract_segments.is_empty()) { - prev_segment = &add_coarse_segment__copy(prev_segment, - prev_boundary_index, - boundary.index, - *active_main_segment.mask, - result); - } - else if (has_subtract_same_mask) { - /* Do nothing, subtracting a mask from itself results in an empty mask. */ - } - else { - prev_segment = &add_coarse_segment__unknown( - prev_segment, prev_boundary_index, boundary.index, result); - } - break; - } - } - } - } - - prev_boundary_index = boundary.index; - } - - /* Update active segments. */ - if (boundary.is_main) { - if (boundary.is_begin) { - active_main_segments.append(boundary.segment); - } - else { - active_main_segments.remove_first_occurrence_and_reorder(boundary.segment); - } - } - else { - if (boundary.is_begin) { - active_subtract_segments.append(boundary.segment); - } - else { - active_subtract_segments.remove_first_occurrence_and_reorder(boundary.segment); - } - } - } -} - -/** - * The coarse evaluation only looks at the index masks as a whole within the given bounds. This - * limitation allows it to do many operations in constant time independent of the number of indices - * within each mask. For example, it can detect that two full index masks that overlap result in a - * new full index mask when the union of intersection is computed. - * - * For more complex index-masks, coarse evaluation outputs segments with type - * #CoarseSegment::Type::Unknown. Those segments can be evaluated in more detail afterwards. - * - * \param root_expression: Expression to be evaluated. - * \param eval_order: Pre-computed evaluation order. All children of a term must come before - * the term itself. - * \param eval_bounds: If given, the evaluation is restriced to those bounds. Otherwise, the full - * referenced masks are used. - */ -static CoarseResult evaluate_coarse(const Expr &root_expression, - const Span eval_order, - const std::optional eval_bounds = std::nullopt) -{ - /* An expression result for each intermediate expression. */ - Array, inline_expr_array_size> expression_results( - root_expression.expression_array_size()); - - /* Process expressions in a pre-determined order. */ - for (const Expr *expression : eval_order) { - CoarseResult &expr_result = expression_results[expression->index].emplace(); - switch (expression->type) { - case Expr::Type::Atomic: { - const AtomicExpr &expr = expression->as_atomic(); - - IndexMask mask; - if (eval_bounds.has_value()) { - mask = expr.mask->slice_content(*eval_bounds); - } - else { - mask = *expr.mask; - } - - if (!mask.is_empty()) { - const IndexRange bounds = mask.bounds(); - if (const std::optional range = mask.to_range()) { - expr_result.segments.append({CoarseSegment::Type::Full, bounds}); - } - else { - expr_result.segments.append({CoarseSegment::Type::Copy, bounds, expr.mask}); - } - } - break; - } - case Expr::Type::Union: { - const UnionExpr &expr = expression->as_union(); - Vector boundaries; - for (const Expr *term : expr.terms) { - const CoarseResult &term_result = *expression_results[term->index]; - for (const CoarseSegment &segment : term_result.segments) { - boundaries.append({segment.bounds.first(), true, &segment}); - boundaries.append({segment.bounds.one_after_last(), false, &segment}); - } - } - sort_course_boundaries(boundaries); - evaluate_coarse_union(boundaries, expr_result); - break; - } - case Expr::Type::Intersection: { - const IntersectionExpr &expr = expression->as_intersection(); - Vector boundaries; - for (const Expr *term : expr.terms) { - const CoarseResult &term_result = *expression_results[term->index]; - for (const CoarseSegment &segment : term_result.segments) { - boundaries.append({segment.bounds.first(), true, &segment}); - boundaries.append({segment.bounds.one_after_last(), false, &segment}); - } - } - sort_course_boundaries(boundaries); - evaluate_coarse_intersection(boundaries, expr.terms.size(), expr_result); - break; - } - case Expr::Type::Difference: { - const DifferenceExpr &expr = expression->as_difference(); - Vector boundaries; - const CoarseResult &main_term_result = *expression_results[expr.terms[0]->index]; - for (const CoarseSegment &segment : main_term_result.segments) { - boundaries.append({{segment.bounds.first(), true, &segment}, true}); - boundaries.append({{segment.bounds.one_after_last(), false, &segment}, true}); - } - for (const Expr *term : expr.terms.as_span().drop_front(1)) { - const CoarseResult &term_result = *expression_results[term->index]; - for (const CoarseSegment &segment : term_result.segments) { - boundaries.append({{segment.bounds.first(), true, &segment}, false}); - boundaries.append({{segment.bounds.one_after_last(), false, &segment}, false}); - } - } - sort_course_boundaries(boundaries); - evaluate_coarse_difference(boundaries, expr_result); - break; - } - } - } - - CoarseResult &final_result = *expression_results[root_expression.index]; - return std::move(final_result); -} - -static Span bits_to_indices(const BoundedBitSpan bits, LinearAllocator<> &allocator) -{ - /* TODO: Could first count the number of set bits. */ - Vector indices_vec; - bits::foreach_1_index(bits, [&](const int64_t i) { - BLI_assert(i < max_segment_size); - indices_vec.append_unchecked(int16_t(i)); - }); - return allocator.construct_array_copy(indices_vec); -} - -/** - * Does an exact evaluation of the expression within the given bounds. The evaluation generally - * works in three steps: - * 1. Convert input indices into bit spans. - * 2. Use bit operations to evaluate the expression. - * 3. Convert resulting bit span back to indices. - * - * The trade-off here is that the actual expression evaluation is much faster but the conversions - * take some extra time. Therefore, this approach is best when the evaluation would otherwise take - * longer than the conversions which is usually the case for non-trivial expressions. - */ -static IndexMaskSegment evaluate_exact_with_bits(const Expr &root_expression, - LinearAllocator<> &allocator, - const IndexRange bounds, - const Span eval_order) -{ - BLI_assert(bounds.size() <= max_segment_size); - const int64_t bounds_min = bounds.start(); - const int expr_array_size = root_expression.expression_array_size(); - - /* Make bit span sizes a multiple of `BitsPerInt`. This allows the bit-wise operations to run a - * bit more efficiently, because only full integers are processed. */ - const int64_t ints_in_bounds = ceil_division(bounds.size(), bits::BitsPerInt); - BitGroupVector<16 * 1024> expression_results( - expr_array_size, ints_in_bounds * bits::BitsPerInt, false); - - for (const Expr *expression : eval_order) { - MutableBoundedBitSpan expr_result = expression_results[expression->index]; - switch (expression->type) { - case Expr::Type::Atomic: { - const AtomicExpr &expr = expression->as_atomic(); - const IndexMask mask = expr.mask->slice_content(bounds); - mask.to_bits(expr_result, -bounds_min); - break; - } - case Expr::Type::Union: { - for (const Expr *term : expression->terms) { - expr_result |= expression_results[term->index]; - } - break; - } - case Expr::Type::Intersection: { - bits::copy_from_or(expr_result, expression_results[expression->terms[0]->index]); - for (const Expr *term : expression->terms.as_span().drop_front(1)) { - expr_result &= expression_results[term->index]; - } - break; - } - case Expr::Type::Difference: { - bits::copy_from_or(expr_result, expression_results[expression->terms[0]->index]); - for (const Expr *term : expression->terms.as_span().drop_front(1)) { - bits::mix_into_first_expr( - [](const bits::BitInt a, const bits::BitInt b) { return a & ~b; }, - expr_result, - expression_results[term->index]); - } - break; - } - } - } - const BoundedBitSpan final_bits = expression_results[root_expression.index]; - const Span indices = bits_to_indices(final_bits, allocator); - return IndexMaskSegment(bounds_min, indices); -} - -/** Compute a new set of indices that is the union of the given segments. */ -static IndexMaskSegment union_index_mask_segments(const Span segments, - const int64_t bounds_min, - int16_t *r_values) -{ - if (segments.is_empty()) { - return {}; - } - if (segments.size() == 1) { - return segments[0]; - } - if (segments.size() == 2) { - const IndexMaskSegment a = segments[0].shift(-bounds_min); - const IndexMaskSegment b = segments[1].shift(-bounds_min); - const int64_t size = std::set_union(a.begin(), a.end(), b.begin(), b.end(), r_values) - - r_values; - return {bounds_min, {r_values, size}}; - } - - /* Sort input segments by their size, so that smaller segments are unioned first. This results in - * smaller intermediate arrays and thus less work overall. */ - Vector sorted_segments(segments); - std::sort( - sorted_segments.begin(), - sorted_segments.end(), - [](const IndexMaskSegment &a, const IndexMaskSegment &b) { return a.size() < b.size(); }); - - std::array tmp_indices; - /* Can use r_values for temporary values because if it's large enough for the final result, it's - * also large enough for intermediate results. */ - int16_t *buffer_a = r_values; - int16_t *buffer_b = tmp_indices.data(); - - if (sorted_segments.size() % 2 == 1) { - /* Swap buffers so that the result is in #r_values in the end. */ - std::swap(buffer_a, buffer_b); - } - - int64_t count = 0; - { - /* Initial union. */ - const IndexMaskSegment a = sorted_segments[0].shift(-bounds_min); - const IndexMaskSegment b = sorted_segments[1].shift(-bounds_min); - int16_t *dst = buffer_a; - count = std::set_union(a.begin(), a.end(), b.begin(), b.end(), dst) - dst; - } - - /* Union one input into the result at a time. In theory, one could write an algorithm that unions - * multiple sorted arrays at once, but that's more complex and it's not obvious that it would be - * faster in the end. */ - for (const int64_t segment_i : sorted_segments.index_range().drop_front(2)) { - const int16_t *a = buffer_a; - const IndexMaskSegment b = sorted_segments[segment_i].shift(-bounds_min); - int16_t *dst = buffer_b; - count = std::set_union(a, a + count, b.begin(), b.end(), dst) - dst; - std::swap(buffer_a, buffer_b); - } - return {bounds_min, {r_values, count}}; -} - -/** Compute a new set of indices that is the intersection of the given segments. */ -static IndexMaskSegment intersect_index_mask_segments(const Span segments, - const int64_t bounds_min, - int16_t *r_values) -{ - if (segments.is_empty()) { - return {}; - } - if (segments.size() == 1) { - return segments[0]; - } - if (segments.size() == 2) { - const IndexMaskSegment a = segments[0].shift(-bounds_min); - const IndexMaskSegment b = segments[1].shift(-bounds_min); - const int64_t size = std::set_intersection(a.begin(), a.end(), b.begin(), b.end(), r_values) - - r_values; - return {bounds_min, {r_values, size}}; - } - - /* Intersect smaller segments first, because then the intermediate results will generally be - * smaller. */ - Vector sorted_segments(segments); - std::sort( - sorted_segments.begin(), - sorted_segments.end(), - [](const IndexMaskSegment &a, const IndexMaskSegment &b) { return a.size() < b.size(); }); - - std::array tmp_indices_1; - std::array tmp_indices_2; - int16_t *buffer_a = tmp_indices_1.data(); - int16_t *buffer_b = tmp_indices_2.data(); - - int64_t count = 0; - { - /* Initial intersection. */ - const IndexMaskSegment a = sorted_segments[0].shift(-bounds_min); - const IndexMaskSegment b = sorted_segments[1].shift(-bounds_min); - int16_t *dst = buffer_a; - count = std::set_intersection(a.begin(), a.end(), b.begin(), b.end(), dst) - dst; - } - - for (const int64_t segment_i : sorted_segments.index_range().drop_front(2)) { - const int16_t *a = buffer_a; - const IndexMaskSegment b = sorted_segments[segment_i].shift(-bounds_min); - /* The result of the final intersection should be written directly to #r_values to avoid an - * additional copy in the end. */ - int16_t *dst = (segment_i == sorted_segments.size() - 1) ? r_values : buffer_b; - count = std::set_intersection(a, a + count, b.begin(), b.end(), dst) - dst; - std::swap(buffer_a, buffer_b); - } - return {bounds_min, {r_values, count}}; -} - -/** - * Compute a new set of indices that is the difference between the main-segment and all the - * subtract-segments. - */ -static IndexMaskSegment difference_index_mask_segments( - const IndexMaskSegment main_segment, - const Span subtract_segments, - const int64_t bounds_min, - int16_t *r_values) -{ - if (main_segment.is_empty()) { - return {}; - } - if (subtract_segments.is_empty()) { - return main_segment; - } - if (subtract_segments.size() == 1) { - const IndexMaskSegment shifted_main_segment = main_segment.shift(-bounds_min); - const IndexMaskSegment subtract_segment = subtract_segments[0].shift(-bounds_min); - const int64_t size = std::set_difference(shifted_main_segment.begin(), - shifted_main_segment.end(), - subtract_segment.begin(), - subtract_segment.end(), - r_values) - - r_values; - return {bounds_min, {r_values, size}}; - } - - int64_t subtract_count = 0; - for (const IndexMaskSegment &segment : subtract_segments) { - subtract_count += segment.size(); - } - if (subtract_count < main_segment.size() / 2) { - /* Can be more efficient to union all the subtract indices first before computing the - * difference. This avoids potentially multiple larger intermediate arrays. */ - std::array union_indices; - const IndexMaskSegment shifted_main_segment = main_segment.shift(-bounds_min); - const IndexMaskSegment unioned_subtract_segment = - union_index_mask_segments(subtract_segments, bounds_min, union_indices.data()) - .shift(-bounds_min); - const int64_t size = std::set_difference(shifted_main_segment.begin(), - shifted_main_segment.end(), - unioned_subtract_segment.begin(), - unioned_subtract_segment.end(), - r_values) - - r_values; - return {bounds_min, {r_values, size}}; - } - - /* Sort larger segments to the front. This way the intermediate arrays are likely smaller. */ - Vector sorted_subtract_segments(subtract_segments); - std::sort( - sorted_subtract_segments.begin(), - sorted_subtract_segments.end(), - [](const IndexMaskSegment &a, const IndexMaskSegment &b) { return a.size() > b.size(); }); - - std::array tmp_indices_1; - std::array tmp_indices_2; - int16_t *buffer_a = tmp_indices_1.data(); - int16_t *buffer_b = tmp_indices_2.data(); - - int64_t count = 0; - { - /* Initial difference. */ - const IndexMaskSegment shifted_main_segment = main_segment.shift(-bounds_min); - const IndexMaskSegment subtract_segment = sorted_subtract_segments[0].shift(-bounds_min); - int16_t *dst = buffer_a; - count = std::set_difference(shifted_main_segment.begin(), - shifted_main_segment.end(), - subtract_segment.begin(), - subtract_segment.end(), - dst) - - dst; - } - - for (const int64_t segment_i : sorted_subtract_segments.index_range().drop_front(1)) { - const IndexMaskSegment &subtract_segment = sorted_subtract_segments[segment_i].shift( - -bounds_min); - /* The final result should be written directly to #r_values to avoid an additional copy. */ - int16_t *dst = (segment_i == sorted_subtract_segments.size() - 1) ? r_values : buffer_b; - count = std::set_difference(buffer_a, - buffer_a + count, - subtract_segment.begin(), - subtract_segment.end(), - dst) - - dst; - std::swap(buffer_a, buffer_b); - } - return {bounds_min, {r_values, count}}; -} - -/** - * Does an exact evaluation of the expression with in the given bounds. The evaluation builds on - * top of algorithms like `std::set_union`. This approach is especially useful if the expression is - * simple and doesn't have many intermediate values. - */ -static IndexMaskSegment evaluate_exact_with_indices(const Expr &root_expression, - LinearAllocator<> &allocator, - const IndexRange bounds, - const Span eval_order) -{ - BLI_assert(bounds.size() <= max_segment_size); - const int64_t bounds_min = bounds.start(); - const int expr_array_size = root_expression.expression_array_size(); - Array results(expr_array_size); - for (const Expr *expression : eval_order) { - switch (expression->type) { - case Expr::Type::Atomic: { - const AtomicExpr &expr = expression->as_atomic(); - const IndexMask mask = expr.mask->slice_content(bounds); - /* The caller should make sure that the bounds are aligned to segment bounds. */ - BLI_assert(mask.segments_num() <= 1); - if (mask.segments_num() == 1) { - results[expression->index] = mask.segment(0); - } - break; - } - case Expr::Type::Union: { - const UnionExpr &expr = expression->as_union(); - Array term_segments(expr.terms.size()); - int64_t result_size_upper_bound = 0; - bool used_short_circuit = false; - for (const int64_t term_i : expr.terms.index_range()) { - const Expr &term = *expr.terms[term_i]; - const IndexMaskSegment term_segment = results[term.index]; - if (term_segment.size() == bounds.size()) { - /* Can skip computing the union if we know that one of the inputs contains all possible - * indices already. */ - results[expression->index] = term_segment; - used_short_circuit = true; - break; - } - term_segments[term_i] = term_segment; - result_size_upper_bound += term_segment.size(); - } - if (used_short_circuit) { - break; - } - result_size_upper_bound = std::min(result_size_upper_bound, bounds.size()); - MutableSpan dst = allocator.allocate_array(result_size_upper_bound); - const IndexMaskSegment result_segment = union_index_mask_segments( - term_segments, bounds_min, dst.data()); - allocator.free_end_of_previous_allocation(dst.size_in_bytes(), - result_segment.base_span().end()); - results[expression->index] = result_segment; - break; - } - case Expr::Type::Intersection: { - const IntersectionExpr &expr = expression->as_intersection(); - Array term_segments(expr.terms.size()); - int64_t result_size_upper_bound = bounds.size(); - bool used_short_circuit = false; - for (const int64_t term_i : expr.terms.index_range()) { - const Expr &term = *expr.terms[term_i]; - const IndexMaskSegment term_segment = results[term.index]; - if (term_segment.is_empty()) { - /* Can skip computing the intersection if we know that one of the inputs is empty. */ - results[expression->index] = {}; - used_short_circuit = true; - break; - } - result_size_upper_bound = std::min(result_size_upper_bound, term_segment.size()); - term_segments[term_i] = term_segment; - } - if (used_short_circuit) { - break; - } - MutableSpan dst = allocator.allocate_array(result_size_upper_bound); - const IndexMaskSegment result_segment = intersect_index_mask_segments( - term_segments, bounds_min, dst.data()); - allocator.free_end_of_previous_allocation(dst.size_in_bytes(), - result_segment.base_span().end()); - results[expression->index] = result_segment; - break; - } - case Expr::Type::Difference: { - const DifferenceExpr &expr = expression->as_difference(); - const Expr &main_term = *expr.terms[0]; - const IndexMaskSegment main_segment = results[main_term.index]; - if (main_segment.is_empty()) { - /* Can skip the computation of the main segment is empty. */ - results[expression->index] = {}; - break; - } - int64_t result_size_upper_bound = main_segment.size(); - bool used_short_circuit = false; - Array subtract_segments(expr.terms.size() - 1); - for (const int64_t term_i : expr.terms.index_range().drop_front(1)) { - const Expr &subtract_term = *expr.terms[term_i]; - const IndexMaskSegment term_segment = results[subtract_term.index]; - if (term_segment.size() == bounds.size()) { - /* Can skip computing the difference if we know that one of the subtract-terms is - * full. */ - results[expression->index] = {}; - used_short_circuit = true; - break; - } - result_size_upper_bound = std::min(result_size_upper_bound, - bounds.size() - term_segment.size()); - subtract_segments[term_i - 1] = term_segment; - } - if (used_short_circuit) { - break; - } - MutableSpan dst = allocator.allocate_array(result_size_upper_bound); - const IndexMaskSegment result_segment = difference_index_mask_segments( - main_segment, subtract_segments, bounds_min, dst.data()); - allocator.free_end_of_previous_allocation(dst.size_in_bytes(), - result_segment.base_span().end()); - results[expression->index] = result_segment; - break; - } - } - } - return results[root_expression.index]; -} - -/** - * Turn the evaluated segments into index mask segments that are then used to initialize the - * resulting index mask. - */ -static Vector build_result_mask_segments( - const Span evaluated_segments) -{ - const std::array &static_indices_array = get_static_indices_array(); - - Vector result_mask_segments; - for (const EvaluatedSegment &evaluated_segment : evaluated_segments) { - switch (evaluated_segment.type) { - case EvaluatedSegment::Type::Full: { - const int64_t full_size = evaluated_segment.bounds.size(); - for (int64_t i = 0; i < full_size; i += max_segment_size) { - const int64_t size = std::min(i + max_segment_size, full_size) - i; - result_mask_segments.append(IndexMaskSegment( - evaluated_segment.bounds.first() + i, Span(static_indices_array).take_front(size))); - } - break; - } - case EvaluatedSegment::Type::Copy: { - const IndexMask sliced_mask = evaluated_segment.copy_mask->slice_content( - evaluated_segment.bounds); - sliced_mask.foreach_segment( - [&](const IndexMaskSegment &segment) { result_mask_segments.append(segment); }); - break; - } - case EvaluatedSegment::Type::Indices: { - result_mask_segments.append(evaluated_segment.indices); - break; - } - } - } - return result_mask_segments; -} - -/** - * Computes an evaluation order of the expression. The important aspect is that all child terms - * come before the term that uses them. - */ -static Vector compute_eval_order(const Expr &root_expression) -{ - Vector eval_order; - if (root_expression.type == Expr::Type::Atomic) { - eval_order.append(&root_expression); - return eval_order; - } - - Array is_evaluated_states(root_expression.expression_array_size(), - false); - Stack expr_stack; - expr_stack.push(&root_expression); - - while (!expr_stack.is_empty()) { - const Expr &expression = *expr_stack.peek(); - bool &is_evaluated = is_evaluated_states[expression.index]; - if (is_evaluated) { - expr_stack.pop(); - continue; - } - bool all_terms_evaluated = true; - for (const Expr *term : expression.terms) { - bool &term_evaluated = is_evaluated_states[term->index]; - if (!term_evaluated) { - if (term->type == Expr::Type::Atomic) { - eval_order.append(term); - term_evaluated = true; - } - else { - expr_stack.push(term); - all_terms_evaluated = false; - } - } - } - if (all_terms_evaluated) { - eval_order.append(&expression); - is_evaluated = true; - expr_stack.pop(); - } - } - - return eval_order; -} - -/** Uses a heuristic to decide which exact evaluation mode probably works best. */ -static ExactEvalMode determine_exact_eval_mode(const Expr &root_expression) -{ - for (const Expr *term : root_expression.terms) { - if (!term->terms.is_empty()) { - /* Use bits when there are nested expressions as this is often faster. */ - return ExactEvalMode::Bits; - } - } - return ExactEvalMode::Indices; -} - -static void evaluate_coarse_and_split_until_segments_are_short( - const Expr &root_expression, - const Span eval_order, - Vector &r_evaluated_segments, - Vector &r_short_unknown_segments) -{ - /* Coarse evaluation splits the full range into segments. Long segments are split up and get - * another coarse evaluation. Short segments will be evaluated exactly. */ - Stack long_unknown_segments; - - /* The point at which a range starts being "short". */ - const int64_t coarse_segment_size_threshold = max_segment_size; - - /* Checks the coarse results and inserts its segments into either `long_unknown_segments` for - * further coarse evaluation, `r_short_unknown_segments` for exact evaluation or - * `r_evaluated_segments` if no further evaluation is necessary. */ - auto handle_coarse_result = [&](const CoarseResult &coarse_result) { - for (const CoarseSegment &segment : coarse_result.segments) { - switch (segment.type) { - case CoarseSegment::Type::Unknown: { - if (segment.bounds.size() > coarse_segment_size_threshold) { - long_unknown_segments.push(segment.bounds); - } - else { - r_short_unknown_segments.append(segment.bounds); - } - break; - } - case CoarseSegment::Type::Copy: { - BLI_assert(segment.mask); - r_evaluated_segments.append( - {EvaluatedSegment::Type::Copy, segment.bounds, segment.mask}); - break; - } - case CoarseSegment::Type::Full: { - r_evaluated_segments.append({EvaluatedSegment::Type::Full, segment.bounds}); - break; - } - } - } - }; - - /* Initial coarse evaluation without any explicit bounds. The bounds are implied by the index - * masks used in the expression. */ - const CoarseResult initial_coarse_result = evaluate_coarse(root_expression, eval_order); - handle_coarse_result(initial_coarse_result); - - /* Do coarse evaluation until all unknown segments are short enough to do exact evaluation. */ - while (!long_unknown_segments.is_empty()) { - const IndexRange unknown_bounds = long_unknown_segments.pop(); - const int64_t split_pos = unknown_bounds.size() / 2; - const IndexRange left_half = unknown_bounds.take_front(split_pos); - const IndexRange right_half = unknown_bounds.drop_front(split_pos); - const CoarseResult left_result = evaluate_coarse(root_expression, eval_order, left_half); - const CoarseResult right_result = evaluate_coarse(root_expression, eval_order, right_half); - handle_coarse_result(left_result); - handle_coarse_result(right_result); - } -} - -static void evaluate_short_unknown_segments_exactly( - const Expr &root_expression, - const ExactEvalMode exact_eval_mode, - const Span eval_order, - const Span short_unknown_segments, - IndexMaskMemory &memory, - Vector &r_evaluated_segments) -{ - /* Evaluate a segment exactly. */ - auto evaluate_unknown_segment = [&](const IndexRange bounds, - LinearAllocator<> &allocator, - Vector &r_local_evaluated_segments) { - /* Use the predetermined evaluation mode. */ - switch (exact_eval_mode) { - case ExactEvalMode::Bits: { - const IndexMaskSegment indices = evaluate_exact_with_bits( - root_expression, allocator, bounds, eval_order); - if (!indices.is_empty()) { - r_local_evaluated_segments.append( - {EvaluatedSegment::Type::Indices, bounds, nullptr, indices}); - } - break; - } - case ExactEvalMode::Indices: { - /* #evaluate_exact_with_indices requires that all index masks have a single segment in the - * provided bounds. So split up the range into subranges first if necessary. */ - Vector split_indices; - /* Always adding the beginning and end of the bounds simplifies the code below. */ - split_indices.extend({bounds.first(), bounds.one_after_last()}); - for (const int64_t eval_order_i : eval_order.index_range()) { - const Expr &expr = *eval_order[eval_order_i]; - if (expr.type != Expr::Type::Atomic) { - continue; - } - const AtomicExpr &atomic_expr = expr.as_atomic(); - const IndexMask mask = atomic_expr.mask->slice_content(bounds); - const int64_t segments_num = mask.segments_num(); - if (segments_num <= 1) { - /* This mask only has a single segment in the bounds anyway, so no extra split-position - * is necessary. */ - continue; - } - /* Split at the beginning of each segment. Skipping the first, because that does not need - * an extra split position. Alternatively, one could also split at the end of each - * segment except the last one. It doesn't matter much. */ - for (const int64_t segment_i : IndexRange(segments_num).drop_front(1)) { - const IndexMaskSegment segment = mask.segment(segment_i); - split_indices.append(segment[0]); - } - } - std::sort(split_indices.begin(), split_indices.end()); - for (const int64_t boundary_i : split_indices.index_range().drop_back(1)) { - const IndexRange sub_bounds = IndexRange::from_begin_end(split_indices[boundary_i], - split_indices[boundary_i + 1]); - if (sub_bounds.is_empty()) { - continue; - } - const IndexMaskSegment indices = evaluate_exact_with_indices( - root_expression, allocator, sub_bounds, eval_order); - if (!indices.is_empty()) { - r_local_evaluated_segments.append( - {EvaluatedSegment::Type::Indices, sub_bounds, nullptr, indices}); - } - } - break; - } - } - }; - - /* Decide whether multi-threading should be used or not. There is some extra overhead even when - * just attempting to use multi-threading. */ - const int64_t unknown_segment_eval_grain_size = 8; - if (short_unknown_segments.size() < unknown_segment_eval_grain_size) { - for (const IndexRange &bounds : short_unknown_segments) { - evaluate_unknown_segment(bounds, memory, r_evaluated_segments); - } - } - else { - /* Do exact evaluation in multiple threads. The allocators and evaluated segments created by - * each thread are merged in the end. */ - struct LocalData { - LinearAllocator<> allocator; - Vector evaluated_segments; - }; - threading::EnumerableThreadSpecific data_by_thread; - threading::parallel_for(short_unknown_segments.index_range(), - unknown_segment_eval_grain_size, - [&](const IndexRange range) { - LocalData &data = data_by_thread.local(); - for (const IndexRange &bounds : short_unknown_segments.slice(range)) - { - evaluate_unknown_segment( - bounds, data.allocator, data.evaluated_segments); - } - }); - for (LocalData &data : data_by_thread) { - if (!data.evaluated_segments.is_empty()) { - r_evaluated_segments.extend(data.evaluated_segments); - memory.transfer_ownership_from(data.allocator); - } - } - } -} - -static IndexMask evaluated_segments_to_index_mask(MutableSpan evaluated_segments, - IndexMaskMemory &memory) -{ - if (evaluated_segments.is_empty()) { - return {}; - } - if (evaluated_segments.size() == 1) { - const EvaluatedSegment &evaluated_segment = evaluated_segments[0]; - switch (evaluated_segment.type) { - case EvaluatedSegment::Type::Full: { - return IndexMask(IndexRange(evaluated_segment.bounds)); - } - case EvaluatedSegment::Type::Copy: { - return evaluated_segment.copy_mask->slice_content(evaluated_segment.bounds); - } - case EvaluatedSegment::Type::Indices: { - return IndexMask::from_segments({evaluated_segment.indices}, memory); - } - } - } - - std::sort(evaluated_segments.begin(), - evaluated_segments.end(), - [](const EvaluatedSegment &a, const EvaluatedSegment &b) { - return a.bounds.start() < b.bounds.start(); - }); - - Vector result_segments = build_result_mask_segments(evaluated_segments); - return IndexMask::from_segments(result_segments, memory); -} - -static IndexMask evaluate_expression_impl(const Expr &root_expression, - IndexMaskMemory &memory, - const ExactEvalMode exact_eval_mode) -{ - /* Precompute the evaluation order here, because it's used potentially many times throughout the - * algorithm. */ - const Vector eval_order = compute_eval_order( - root_expression); - - /* Non-overlapping evaluated segments which become the resulting index mask in the end. Note that - * these segments are only sorted in the end. */ - Vector evaluated_segments; - Vector short_unknown_segments; - - evaluate_coarse_and_split_until_segments_are_short( - root_expression, eval_order, evaluated_segments, short_unknown_segments); - evaluate_short_unknown_segments_exactly(root_expression, - exact_eval_mode, - eval_order, - short_unknown_segments, - memory, - evaluated_segments); - return evaluated_segments_to_index_mask(evaluated_segments, memory); -} - -IndexMask evaluate_expression(const Expr &expression, IndexMaskMemory &memory) -{ - const ExactEvalMode exact_eval_mode = determine_exact_eval_mode(expression); - IndexMask mask = evaluate_expression_impl(expression, memory, exact_eval_mode); -#ifndef NDEBUG - { - /* Check that both exact eval modes have the same result. */ - const ExactEvalMode other_exact_eval_mode = (exact_eval_mode == ExactEvalMode::Bits) ? - ExactEvalMode::Indices : - ExactEvalMode::Bits; - IndexMask other_mask = evaluate_expression_impl(expression, memory, other_exact_eval_mode); - BLI_assert(mask == other_mask); - } -#endif - return mask; -} - -const UnionExpr &ExprBuilder::merge(const Span terms) -{ - Vector term_expressions; - for (const Term &term : terms) { - term_expressions.append(&this->term_to_expr(term)); - } - UnionExpr &expr = scope_.construct(); - expr.type = Expr::Type::Union; - expr.index = expr_count_++; - expr.terms = std::move(term_expressions); - return expr; -} - -const DifferenceExpr &ExprBuilder::subtract(const Term &main_term, const Span subtract_terms) -{ - Vector term_expressions; - term_expressions.append(&this->term_to_expr(main_term)); - for (const Term &subtract_term : subtract_terms) { - term_expressions.append(&this->term_to_expr(subtract_term)); - } - DifferenceExpr &expr = scope_.construct(); - expr.type = Expr::Type::Difference; - expr.index = expr_count_++; - expr.terms = std::move(term_expressions); - return expr; -} - -const IntersectionExpr &ExprBuilder::intersect(const Span terms) -{ - Vector term_expressions; - for (const Term &term : terms) { - term_expressions.append(&this->term_to_expr(term)); - } - IntersectionExpr &expr = scope_.construct(); - expr.type = Expr::Type::Intersection; - expr.index += expr_count_++; - expr.terms = std::move(term_expressions); - return expr; -} - -const Expr &ExprBuilder::term_to_expr(const Term &term) -{ - if (const Expr *const *expr = std::get_if(&term)) { - return **expr; - } - AtomicExpr &expr = scope_.construct(); - expr.type = Expr::Type::Atomic; - expr.index = expr_count_++; - if (const IndexRange *range = std::get_if(&term)) { - expr.mask = &scope_.construct(*range); - } - else { - expr.mask = std::get(term); - } - return expr; -} - -} // namespace blender::index_mask diff --git a/source/blender/blenlib/intern/jitter_2d.c b/source/blender/blenlib/intern/jitter_2d.c index 39007c57874..afd1caa7352 100644 --- a/source/blender/blenlib/intern/jitter_2d.c +++ b/source/blender/blenlib/intern/jitter_2d.c @@ -14,7 +14,7 @@ #include "BLI_jitter_2d.h" #include "BLI_rand.h" -#include "BLI_strict_flags.h" /* Keep last. */ +#include "BLI_strict_flags.h" void BLI_jitterate1(float (*jit1)[2], float (*jit2)[2], int num, float radius1) { diff --git a/source/blender/blenlib/intern/kdtree_impl.h b/source/blender/blenlib/intern/kdtree_impl.h index 4324f4009b1..6e24ce0be7f 100644 --- a/source/blender/blenlib/intern/kdtree_impl.h +++ b/source/blender/blenlib/intern/kdtree_impl.h @@ -10,12 +10,11 @@ #include "BLI_kdtree_impl.h" #include "BLI_math_base.h" +#include "BLI_strict_flags.h" #include "BLI_utildefines.h" #include -#include "BLI_strict_flags.h" /* Keep last. */ - #define _BLI_KDTREE_CONCAT_AUX(MACRO_ARG1, MACRO_ARG2) MACRO_ARG1##MACRO_ARG2 #define _BLI_KDTREE_CONCAT(MACRO_ARG1, MACRO_ARG2) _BLI_KDTREE_CONCAT_AUX(MACRO_ARG1, MACRO_ARG2) #define BLI_kdtree_nd_(id) _BLI_KDTREE_CONCAT(KDTREE_PREFIX_ID, _##id) diff --git a/source/blender/blenlib/intern/lasso_2d.c b/source/blender/blenlib/intern/lasso_2d.c new file mode 100644 index 00000000000..8a20dbe2c25 --- /dev/null +++ b/source/blender/blenlib/intern/lasso_2d.c @@ -0,0 +1,89 @@ +/* SPDX-FileCopyrightText: 2001-2002 NaN Holding BV. All rights reserved. + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +/** \file + * \ingroup bli + */ + +#include "DNA_vec_types.h" + +#include "BLI_math_base.h" +#include "BLI_math_geom.h" +#include "BLI_strict_flags.h" + +#include "BLI_lasso_2d.h" /* own include */ + +void BLI_lasso_boundbox(rcti *rect, const int mcoords[][2], const uint mcoords_len) +{ + uint a; + + rect->xmin = rect->xmax = mcoords[0][0]; + rect->ymin = rect->ymax = mcoords[0][1]; + + for (a = 1; a < mcoords_len; a++) { + if (mcoords[a][0] < rect->xmin) { + rect->xmin = mcoords[a][0]; + } + else if (mcoords[a][0] > rect->xmax) { + rect->xmax = mcoords[a][0]; + } + if (mcoords[a][1] < rect->ymin) { + rect->ymin = mcoords[a][1]; + } + else if (mcoords[a][1] > rect->ymax) { + rect->ymax = mcoords[a][1]; + } + } +} + +bool BLI_lasso_is_point_inside(const int mcoords[][2], + const uint mcoords_len, + const int sx, + const int sy, + const int error_value) +{ + if (sx == error_value || mcoords_len == 0) { + return false; + } + + const int pt[2] = {sx, sy}; + return isect_point_poly_v2_int(pt, mcoords, mcoords_len); +} + +bool BLI_lasso_is_edge_inside(const int mcoords[][2], + const uint mcoords_len, + int x0, + int y0, + int x1, + int y1, + const int error_value) +{ + + if (x0 == error_value || x1 == error_value || mcoords_len == 0) { + return false; + } + + const int v1[2] = {x0, y0}, v2[2] = {x1, y1}; + + /* check points in lasso */ + if (BLI_lasso_is_point_inside(mcoords, mcoords_len, v1[0], v1[1], error_value)) { + return true; + } + if (BLI_lasso_is_point_inside(mcoords, mcoords_len, v2[0], v2[1], error_value)) { + return true; + } + + /* no points in lasso, so we have to intersect with lasso edge */ + + if (isect_seg_seg_v2_int(mcoords[0], mcoords[mcoords_len - 1], v1, v2) > 0) { + return true; + } + for (uint a = 0; a < mcoords_len - 1; a++) { + if (isect_seg_seg_v2_int(mcoords[a], mcoords[a + 1], v1, v2) > 0) { + return true; + } + } + + return false; +} diff --git a/source/blender/blenlib/intern/lasso_2d.cc b/source/blender/blenlib/intern/lasso_2d.cc deleted file mode 100644 index dc80e7e0f0f..00000000000 --- a/source/blender/blenlib/intern/lasso_2d.cc +++ /dev/null @@ -1,86 +0,0 @@ -/* SPDX-FileCopyrightText: 2001-2002 NaN Holding BV. All rights reserved. - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup bli - */ - -#include "DNA_vec_types.h" - -#include "BLI_math_base.h" -#include "BLI_math_geom.h" - -#include "BLI_lasso_2d.hh" /* own include */ - -#include "BLI_strict_flags.h" /* Keep last. */ - -using blender::int2; -using blender::Span; - -void BLI_lasso_boundbox(rcti *rect, const Span mcoords) -{ - rect->xmin = rect->xmax = mcoords[0][0]; - rect->ymin = rect->ymax = mcoords[0][1]; - - for (const int64_t a : mcoords.index_range().drop_front(1)) { - if (mcoords[a][0] < rect->xmin) { - rect->xmin = mcoords[a][0]; - } - else if (mcoords[a][0] > rect->xmax) { - rect->xmax = mcoords[a][0]; - } - if (mcoords[a][1] < rect->ymin) { - rect->ymin = mcoords[a][1]; - } - else if (mcoords[a][1] > rect->ymax) { - rect->ymax = mcoords[a][1]; - } - } -} - -bool BLI_lasso_is_point_inside(const Span mcoords, - const int sx, - const int sy, - const int error_value) -{ - if (sx == error_value || mcoords.is_empty()) { - return false; - } - - const int pt[2] = {sx, sy}; - return isect_point_poly_v2_int( - pt, reinterpret_cast(mcoords.data()), uint(mcoords.size())); -} - -bool BLI_lasso_is_edge_inside( - const Span mcoords, int x0, int y0, int x1, int y1, const int error_value) -{ - - if (x0 == error_value || x1 == error_value || mcoords.is_empty()) { - return false; - } - - const int v1[2] = {x0, y0}, v2[2] = {x1, y1}; - - /* check points in lasso */ - if (BLI_lasso_is_point_inside(mcoords, v1[0], v1[1], error_value)) { - return true; - } - if (BLI_lasso_is_point_inside(mcoords, v2[0], v2[1], error_value)) { - return true; - } - - /* no points in lasso, so we have to intersect with lasso edge */ - - if (isect_seg_seg_v2_int(mcoords[0], mcoords.last(), v1, v2) > 0) { - return true; - } - for (const int64_t i : mcoords.index_range().drop_back(1)) { - if (isect_seg_seg_v2_int(mcoords[i], mcoords[i + 1], v1, v2) > 0) { - return true; - } - } - - return false; -} diff --git a/source/blender/blenlib/intern/listbase.cc b/source/blender/blenlib/intern/listbase.cc index dac2206ea7f..2919785db6c 100644 --- a/source/blender/blenlib/intern/listbase.cc +++ b/source/blender/blenlib/intern/listbase.cc @@ -19,7 +19,7 @@ #include "BLI_listbase.h" -#include "BLI_strict_flags.h" /* Keep last. */ +#include "BLI_strict_flags.h" void BLI_movelisttolist(ListBase *dst, ListBase *src) { diff --git a/source/blender/blenlib/intern/math_base.c b/source/blender/blenlib/intern/math_base.c index 73a609d1311..f9a54c2cb80 100644 --- a/source/blender/blenlib/intern/math_base.c +++ b/source/blender/blenlib/intern/math_base.c @@ -7,8 +7,7 @@ */ #include "BLI_math_base.h" - -#include "BLI_strict_flags.h" /* Keep last. */ +#include "BLI_strict_flags.h" int pow_i(int base, int exp) { diff --git a/source/blender/blenlib/intern/math_boolean.cc b/source/blender/blenlib/intern/math_boolean.cc index 2deff8dc909..be94df8146e 100644 --- a/source/blender/blenlib/intern/math_boolean.cc +++ b/source/blender/blenlib/intern/math_boolean.cc @@ -6,6 +6,7 @@ * \ingroup bli */ +#include "BLI_hash.hh" #include "BLI_math_boolean.hh" #include "BLI_math_mpq.hh" #include "BLI_math_vector_types.hh" diff --git a/source/blender/blenlib/intern/math_color.c b/source/blender/blenlib/intern/math_color.c index 9298561ec74..2a1660a9366 100644 --- a/source/blender/blenlib/intern/math_color.c +++ b/source/blender/blenlib/intern/math_color.c @@ -9,7 +9,7 @@ #include "BLI_math_color.h" #include "BLI_utildefines.h" -#include "BLI_strict_flags.h" /* Keep last. */ +#include "BLI_strict_flags.h" void hsv_to_rgb(float h, float s, float v, float *r_r, float *r_g, float *r_b) { diff --git a/source/blender/blenlib/intern/math_geom.cc b/source/blender/blenlib/intern/math_geom.cc index 5cc13a0589d..b0da1aad36d 100644 --- a/source/blender/blenlib/intern/math_geom.cc +++ b/source/blender/blenlib/intern/math_geom.cc @@ -11,13 +11,14 @@ #include "BLI_math_base.hh" #include "BLI_math_geom.h" +#include "BLI_math_base_safe.h" #include "BLI_math_bits.h" #include "BLI_math_matrix.h" #include "BLI_math_rotation.h" #include "BLI_math_vector.h" #include "BLI_utildefines.h" -#include "BLI_strict_flags.h" /* Keep last. */ +#include "BLI_strict_flags.h" /********************************** Polygons *********************************/ diff --git a/source/blender/blenlib/intern/math_interp.cc b/source/blender/blenlib/intern/math_interp.cc index d5aae4bcd5b..f31b78faa04 100644 --- a/source/blender/blenlib/intern/math_interp.cc +++ b/source/blender/blenlib/intern/math_interp.cc @@ -15,8 +15,7 @@ #include "BLI_math_vector.h" #include "BLI_math_vector_types.hh" #include "BLI_simd.h" - -#include "BLI_strict_flags.h" /* Keep last. */ +#include "BLI_strict_flags.h" namespace blender::math { @@ -298,7 +297,7 @@ BLI_INLINE void bilinear_fl_impl(const float *buffer, x2 = 0; } } - else if (border && (x2 < 0 || x1 >= width)) { + else if (x2 < 0 || x1 >= width) { copy_vn_fl(output, components, 0.0f); return; } @@ -307,7 +306,7 @@ BLI_INLINE void bilinear_fl_impl(const float *buffer, y2 = 0; } } - else if (border && (y2 < 0 || y1 >= height)) { + else if (y2 < 0 || y1 >= height) { copy_vn_fl(output, components, 0.0f); return; } @@ -406,9 +405,17 @@ BLI_INLINE uchar4 bilinear_byte_impl(const uchar *buffer, int width, int height, y1234 = _mm_andnot_si128(invalid_1234, y1234); } else { - /* Clamp samples to image edges. */ + /* Clamp samples to image edges, unless all four of them are outside + * in which case return black. */ __m128i xy12_clamped = max_i_simd(xy12, _mm_setzero_si128()); xy12_clamped = min_i_simd(xy12_clamped, size_minus_1); + __m128i valid_xy12 = _mm_cmpeq_epi32(xy12, xy12_clamped); + __m128i valid_pairs = _mm_and_si128(valid_xy12, + _mm_shuffle_epi32(valid_xy12, _MM_SHUFFLE(0, 3, 2, 1))); + if (_mm_movemask_ps(_mm_castsi128_ps(valid_pairs)) == 0) { + return uchar4(0); + } + x1234 = _mm_shuffle_epi32(xy12_clamped, _MM_SHUFFLE(2, 2, 0, 0)); y1234 = _mm_shuffle_epi32(xy12_clamped, _MM_SHUFFLE(3, 1, 3, 1)); } @@ -472,8 +479,8 @@ BLI_INLINE uchar4 bilinear_byte_impl(const uchar *buffer, int width, int height, int y1 = int(vf); int y2 = y1 + 1; - /* Completely outside of the image in bordered mode? */ - if (border && (x2 < 0 || x1 >= width || y2 < 0 || y1 >= height)) { + /* Completely outside of the image? */ + if (x2 < 0 || x1 >= width || y2 < 0 || y1 >= height) { return uchar4(0); } diff --git a/source/blender/blenlib/intern/math_matrix.c b/source/blender/blenlib/intern/math_matrix.c index 53ec86dff97..6ccecfa52a1 100644 --- a/source/blender/blenlib/intern/math_matrix.c +++ b/source/blender/blenlib/intern/math_matrix.c @@ -11,6 +11,7 @@ #include "BLI_math_solvers.h" #include "BLI_math_vector.h" #include "BLI_simd.h" +#include "BLI_strict_flags.h" #ifndef MATH_STANDALONE # include "eigen_capi.h" @@ -18,8 +19,6 @@ #include -#include "BLI_strict_flags.h" /* Keep last. */ - /********************************* Init **************************************/ void zero_m2(float m[2][2]) diff --git a/source/blender/blenlib/intern/math_matrix.cc b/source/blender/blenlib/intern/math_matrix.cc index 3458b7113cd..fb3ca714545 100644 --- a/source/blender/blenlib/intern/math_matrix.cc +++ b/source/blender/blenlib/intern/math_matrix.cc @@ -21,9 +21,10 @@ namespace blender { -template<> float4x4 operator*(const float4x4 &a, const float4x4 &b) +template<> float4x4 float4x4::operator*(const float4x4 &b) const { using namespace math; + const float4x4 &a = *this; float4x4 result; #if BLI_HAVE_SSE2 @@ -68,9 +69,10 @@ template<> float4x4 operator*(const float4x4 &a, const float4x4 &b) return result; } -template<> float3x3 operator*(const float3x3 &a, const float3x3 &b) +template<> float3x3 float3x3::operator*(const float3x3 &b) const { using namespace math; + const float3x3 &a = *this; float3x3 result; #if 0 /* 1.2 times slower. Could be used as reference for aligned version. */ @@ -112,10 +114,10 @@ template<> float3x3 operator*(const float3x3 &a, const float3x3 &b) return result; } -template float2x2 operator*(const float2x2 &a, const float2x2 &b); -template double2x2 operator*(const double2x2 &a, const double2x2 &b); -template double3x3 operator*(const double3x3 &a, const double3x3 &b); -template double4x4 operator*(const double4x4 &a, const double4x4 &b); +template float2x2 float2x2::operator*(const float2x2 &b) const; +template double2x2 double2x2::operator*(const double2x2 &b) const; +template double3x3 double3x3::operator*(const double3x3 &b) const; +template double4x4 double4x4::operator*(const double4x4 &b) const; } // namespace blender diff --git a/source/blender/blenlib/intern/math_rotation.c b/source/blender/blenlib/intern/math_rotation.c index d3d47dd847a..796554506cd 100644 --- a/source/blender/blenlib/intern/math_rotation.c +++ b/source/blender/blenlib/intern/math_rotation.c @@ -12,8 +12,7 @@ #include "BLI_math_geom.h" #include "BLI_math_matrix.h" #include "BLI_math_vector.h" - -#include "BLI_strict_flags.h" /* Keep last. */ +#include "BLI_strict_flags.h" /******************************** Quaternions ********************************/ @@ -1034,7 +1033,7 @@ void sin_cos_from_fraction(int numerator, int denominator, float *r_sin, float * BLI_assert(-denominator / 4 <= numerator); /* Numerator may be negative. */ BLI_assert(numerator <= denominator / 4); - BLI_assert(ELEM(cos_sign, -1.0f, 1.0f)); + BLI_assert(cos_sign == -1.0f || cos_sign == 1.0f); const float angle = (float)(2.0 * M_PI) * ((float)numerator / (float)denominator); *r_sin = sinf(angle); diff --git a/source/blender/blenlib/intern/math_solvers.c b/source/blender/blenlib/intern/math_solvers.c index fbae5f6d980..93801d1684e 100644 --- a/source/blender/blenlib/intern/math_solvers.c +++ b/source/blender/blenlib/intern/math_solvers.c @@ -14,12 +14,12 @@ #include "BLI_utildefines.h" +#include "BLI_strict_flags.h" + #include "eigen_capi.h" #include -#include "BLI_strict_flags.h" /* Keep last. */ - /********************************** Eigen Solvers *********************************/ bool BLI_eigen_solve_selfadjoint_m3(const float m3[3][3], diff --git a/source/blender/blenlib/intern/math_statistics.c b/source/blender/blenlib/intern/math_statistics.c index c121c0d9c8b..25f78e19b7d 100644 --- a/source/blender/blenlib/intern/math_statistics.c +++ b/source/blender/blenlib/intern/math_statistics.c @@ -9,11 +9,12 @@ #include "BLI_math_base.h" #include "BLI_math_statistics.h" #include "BLI_math_vector.h" +#include "MEM_guardedalloc.h" #include "BLI_task.h" #include "BLI_utildefines.h" -#include "BLI_strict_flags.h" /* Keep last. */ +#include "BLI_strict_flags.h" /********************************** Covariance Matrices *********************************/ diff --git a/source/blender/blenlib/intern/math_vector.c b/source/blender/blenlib/intern/math_vector.c index 6a9ce1f172d..6fddd30d813 100644 --- a/source/blender/blenlib/intern/math_vector.c +++ b/source/blender/blenlib/intern/math_vector.c @@ -11,8 +11,7 @@ #include "BLI_math_base_safe.h" #include "BLI_math_geom.h" #include "BLI_math_rotation.h" - -#include "BLI_strict_flags.h" /* Keep last. */ +#include "BLI_strict_flags.h" /* -------------------------------------------------------------------- */ /** \name Interpolation diff --git a/source/blender/blenlib/intern/memory_utils.c b/source/blender/blenlib/intern/memory_utils.c index 6e7d6b95737..e898865ef38 100644 --- a/source/blender/blenlib/intern/memory_utils.c +++ b/source/blender/blenlib/intern/memory_utils.c @@ -16,7 +16,7 @@ #include "BLI_memory_utils.h" -#include "BLI_strict_flags.h" /* Keep last. */ +#include "BLI_strict_flags.h" bool BLI_memory_is_zero(const void *arr, const size_t arr_size) { diff --git a/source/blender/blenlib/intern/mesh_boolean.cc b/source/blender/blenlib/intern/mesh_boolean.cc index 68ecb161928..69b315aeafe 100644 --- a/source/blender/blenlib/intern/mesh_boolean.cc +++ b/source/blender/blenlib/intern/mesh_boolean.cc @@ -29,7 +29,9 @@ # include "BLI_span.hh" # include "BLI_stack.hh" # include "BLI_task.hh" +# include "BLI_time.h" # include "BLI_vector.hh" +# include "BLI_vector_set.hh" # include "BLI_mesh_boolean.hh" @@ -102,7 +104,7 @@ static std::ostream &operator<<(std::ostream &os, const Edge &e) return os; } -static std::ostream &operator<<(std::ostream &os, const Span a) +static std::ostream &operator<<(std::ostream &os, const Span &a) { for (int i : a.index_range()) { os << a[i]; @@ -149,7 +151,7 @@ class TriMeshTopology : NonCopyable { /* Which edges are incident on the given vertex? * We assume v has some incident edges. */ - Span vert_edges(const Vert *v) const + const Vector &vert_edges(const Vert *v) const { return vert_edges_.lookup(v); } @@ -1540,7 +1542,7 @@ static int find_ambient_cell(const IMesh &tm, /* Find edge attached to v_extreme with max absolute slope * when projected onto the XY plane. That edge is guaranteed to * be on the convex hull of the mesh. */ - const Span edges = tmtopo.vert_edges(v_extreme); + const Vector &edges = tmtopo.vert_edges(v_extreme); const mpq_class &extreme_x = v_extreme->co_exact.x; const mpq_class &extreme_y = v_extreme->co_exact.y; Edge ehull; @@ -1625,7 +1627,7 @@ static Edge find_good_sorting_edge(const Vert *testp, mpq_class nlen2 = math::length_squared(normal); mpq_class max_abs_slope = -1; Edge esort; - const Span edges = tmtopo.vert_edges(closestp); + const Vector &edges = tmtopo.vert_edges(closestp); for (Edge e : edges) { const Vert *v_other = (e.v0() == closestp) ? e.v1() : e.v0(); const mpq3 &co_other = v_other->co_exact; @@ -1697,7 +1699,7 @@ static int find_containing_cell(const Vert *v, if (close_edge != -1) { const Vert *v0 = tri[close_edge]; const Vert *v1 = tri[(close_edge + 1) % 3]; - const Span edges = tmtopo.vert_edges(v0); + const Vector &edges = tmtopo.vert_edges(v0); if (dbg_level > 0) { std::cout << "look for edge containing " << v0 << " and " << v1 << "\n"; std::cout << " in edges: "; @@ -1907,8 +1909,8 @@ struct ComponentContainer { * (maybe not directly nested, which is why there can be more than one). */ static Vector find_component_containers(int comp, - const Span> components, - const Span ambient_cell, + const Vector> &components, + const Array &ambient_cell, const IMesh &tm, const PatchesInfo &pinfo, const TriMeshTopology &tmtopo, @@ -2022,7 +2024,7 @@ static Vector find_component_containers(int comp, * by an appropriate epsilon so that we conservatively will say * that components could intersect if the BBs overlap. */ -static void populate_comp_bbs(const Span> components, +static void populate_comp_bbs(const Vector> &components, const PatchesInfo &pinfo, const IMesh &im, Array &comp_bb) @@ -2970,7 +2972,7 @@ static std::ostream &operator<<(std::ostream &os, const FaceMergeState &fms) * Hence, try to be tolerant of such unexpected topology. */ static void init_face_merge_state(FaceMergeState *fms, - const Span tris, + const Vector &tris, const IMesh &tm, const double3 &norm) { @@ -3507,7 +3509,7 @@ static IMesh polymesh_from_trimesh_with_dissolve(const IMesh &tm_out, Array face(tot_out_face); int out_f_index = 0; for (int in_f : imesh_in.face_index_range()) { - const Span f_faces = face_output_face[in_f]; + const Vector &f_faces = face_output_face[in_f]; if (f_faces.size() > 0) { std::copy(f_faces.begin(), f_faces.end(), &face[out_f_index]); out_f_index += f_faces.size(); @@ -3557,7 +3559,7 @@ IMesh boolean_trimesh(IMesh &tm_in, return IMesh(tm_in); } # ifdef PERFDEBUG - double start_time = BLI_time_now_seconds(); + double start_time = BLI_check_seconds_timer(); std::cout << " boolean_trimesh, timing begins\n"; # endif @@ -3567,7 +3569,7 @@ IMesh boolean_trimesh(IMesh &tm_in, std::cout << "\nboolean_tm_input after intersection:\n" << tm_si; } # ifdef PERFDEBUG - double intersect_time = BLI_time_now_seconds(); + double intersect_time = BLI_check_seconds_timer(); std::cout << " intersected, time = " << intersect_time - start_time << "\n"; # endif @@ -3578,12 +3580,12 @@ IMesh boolean_trimesh(IMesh &tm_in, auto si_shape_fn = [shape_fn, tm_si](int t) { return shape_fn(tm_si.face(t)->orig); }; TriMeshTopology tm_si_topo(tm_si); # ifdef PERFDEBUG - double topo_time = BLI_time_now_seconds(); + double topo_time = BLI_check_seconds_timer(); std::cout << " topology built, time = " << topo_time - intersect_time << "\n"; # endif bool pwn = is_pwn(tm_si, tm_si_topo); # ifdef PERFDEBUG - double pwn_time = BLI_time_now_seconds(); + double pwn_time = BLI_check_seconds_timer(); std::cout << " pwn checked, time = " << pwn_time - topo_time << "\n"; # endif IMesh tm_out; @@ -3599,14 +3601,14 @@ IMesh boolean_trimesh(IMesh &tm_in, tm_out = raycast_patches_boolean(tm_si, op, nshapes, shape_fn, pinfo, arena); } # ifdef PERFDEBUG - double raycast_time = BLI_time_now_seconds(); + double raycast_time = BLI_check_seconds_timer(); std::cout << " raycast_boolean done, time = " << raycast_time - pwn_time << "\n"; # endif } else { PatchesInfo pinfo = find_patches(tm_si, tm_si_topo); # ifdef PERFDEBUG - double patch_time = BLI_time_now_seconds(); + double patch_time = BLI_check_seconds_timer(); std::cout << " patches found, time = " << patch_time - pwn_time << "\n"; # endif CellsInfo cinfo = find_cells(tm_si, tm_si_topo, pinfo); @@ -3614,12 +3616,12 @@ IMesh boolean_trimesh(IMesh &tm_in, std::cout << "Input is PWN\n"; } # ifdef PERFDEBUG - double cell_time = BLI_time_now_seconds(); + double cell_time = BLI_check_seconds_timer(); std::cout << " cells found, time = " << cell_time - pwn_time << "\n"; # endif finish_patch_cell_graph(tm_si, cinfo, pinfo, tm_si_topo, arena); # ifdef PERFDEBUG - double finish_pc_time = BLI_time_now_seconds(); + double finish_pc_time = BLI_check_seconds_timer(); std::cout << " finished patch-cell graph, time = " << finish_pc_time - cell_time << "\n"; # endif bool pc_ok = patch_cell_graph_ok(cinfo, pinfo); @@ -3631,7 +3633,7 @@ IMesh boolean_trimesh(IMesh &tm_in, cinfo.init_windings(nshapes); int c_ambient = find_ambient_cell(tm_si, nullptr, tm_si_topo, pinfo, arena); # ifdef PERFDEBUG - double amb_time = BLI_time_now_seconds(); + double amb_time = BLI_check_seconds_timer(); std::cout << " ambient cell found, time = " << amb_time - finish_pc_time << "\n"; # endif if (c_ambient == NO_INDEX) { @@ -3641,12 +3643,12 @@ IMesh boolean_trimesh(IMesh &tm_in, } propagate_windings_and_in_output_volume(pinfo, cinfo, c_ambient, op, nshapes, si_shape_fn); # ifdef PERFDEBUG - double propagate_time = BLI_time_now_seconds(); + double propagate_time = BLI_check_seconds_timer(); std::cout << " windings propagated, time = " << propagate_time - amb_time << "\n"; # endif tm_out = extract_from_in_output_volume_diffs(tm_si, pinfo, cinfo, arena); # ifdef PERFDEBUG - double extract_time = BLI_time_now_seconds(); + double extract_time = BLI_check_seconds_timer(); std::cout << " extracted, time = " << extract_time - propagate_time << "\n"; # endif if (dbg_level > 0) { @@ -3662,7 +3664,7 @@ IMesh boolean_trimesh(IMesh &tm_in, std::cout << "boolean tm output:\n" << tm_out; } # ifdef PERFDEBUG - double end_time = BLI_time_now_seconds(); + double end_time = BLI_check_seconds_timer(); std::cout << " boolean_trimesh done, total time = " << end_time - start_time << "\n"; # endif return tm_out; @@ -3708,7 +3710,7 @@ IMesh boolean_mesh(IMesh &imesh, IMesh *tm_in = imesh_triangulated; IMesh our_triangulation; # ifdef PERFDEBUG - double start_time = BLI_time_now_seconds(); + double start_time = BLI_check_seconds_timer(); std::cout << "boolean_mesh, timing begins\n"; # endif if (tm_in == nullptr) { @@ -3716,7 +3718,7 @@ IMesh boolean_mesh(IMesh &imesh, tm_in = &our_triangulation; } # ifdef PERFDEBUG - double tri_time = BLI_time_now_seconds(); + double tri_time = BLI_check_seconds_timer(); std::cout << "triangulated, time = " << tri_time - start_time << "\n"; # endif if (dbg_level > 1) { @@ -3724,7 +3726,7 @@ IMesh boolean_mesh(IMesh &imesh, } IMesh tm_out = boolean_trimesh(*tm_in, op, nshapes, shape_fn, use_self, hole_tolerant, arena); # ifdef PERFDEBUG - double bool_tri_time = BLI_time_now_seconds(); + double bool_tri_time = BLI_check_seconds_timer(); std::cout << "boolean_trimesh done, time = " << bool_tri_time - tri_time << "\n"; # endif if (dbg_level > 1) { @@ -3733,7 +3735,7 @@ IMesh boolean_mesh(IMesh &imesh, } IMesh ans = polymesh_from_trimesh_with_dissolve(tm_out, imesh, arena); # ifdef PERFDEBUG - double dissolve_time = BLI_time_now_seconds(); + double dissolve_time = BLI_check_seconds_timer(); std::cout << "polymesh from dissolving, time = " << dissolve_time - bool_tri_time << "\n"; # endif if (dbg_level > 0) { @@ -3744,7 +3746,7 @@ IMesh boolean_mesh(IMesh &imesh, } } # ifdef PERFDEBUG - double end_time = BLI_time_now_seconds(); + double end_time = BLI_check_seconds_timer(); std::cout << "boolean_mesh done, total time = " << end_time - start_time << "\n"; # endif return ans; diff --git a/source/blender/blenlib/intern/mesh_intersect.cc b/source/blender/blenlib/intern/mesh_intersect.cc index b8579e6583b..2e49f598212 100644 --- a/source/blender/blenlib/intern/mesh_intersect.cc +++ b/source/blender/blenlib/intern/mesh_intersect.cc @@ -21,6 +21,7 @@ # include "BLI_hash.hh" # include "BLI_kdopbvh.h" # include "BLI_map.hh" +# include "BLI_math_boolean.hh" # include "BLI_math_geom.h" # include "BLI_math_matrix.h" # include "BLI_math_mpq.hh" @@ -34,6 +35,7 @@ # include "BLI_task.h" # include "BLI_task.hh" # include "BLI_threads.h" +# include "BLI_time.h" # include "BLI_vector.hh" # include "BLI_vector_set.hh" @@ -2331,7 +2333,7 @@ class TriOverlaps { public: TriOverlaps(const IMesh &tm, - const Span tri_bb, + const Array &tri_bb, int nshapes, std::function shape_fn, bool use_self) @@ -2642,7 +2644,7 @@ static void calc_subdivided_non_cluster_tris(Array &r_tri_subdivided, static void calc_cluster_tris(Array &tri_subdivided, const IMesh &tm, const CoplanarClusterInfo &clinfo, - const Span cluster_subdivided, + const Array &cluster_subdivided, IMeshArena *arena) { for (int c : clinfo.index_range()) { @@ -2954,7 +2956,7 @@ IMesh trimesh_nary_intersect(const IMesh &tm_in, } # ifdef PERFDEBUG perfdata_init(); - double start_time = BLI_time_now_seconds(); + double start_time = BLI_check_seconds_timer(); std::cout << "trimesh_nary_intersect start\n"; # endif /* Usually can use tm_in but if it has degenerate or illegal triangles, @@ -2972,17 +2974,17 @@ IMesh trimesh_nary_intersect(const IMesh &tm_in, } } # ifdef PERFDEBUG - double clean_time = BLI_time_now_seconds(); + double clean_time = BLI_check_seconds_timer(); std::cout << "cleaned, time = " << clean_time - start_time << "\n"; # endif Array tri_bb = calc_face_bounding_boxes(*tm_clean); # ifdef PERFDEBUG - double bb_calc_time = BLI_time_now_seconds(); + double bb_calc_time = BLI_check_seconds_timer(); std::cout << "bbs calculated, time = " << bb_calc_time - clean_time << "\n"; # endif TriOverlaps tri_ov(*tm_clean, tri_bb, nshapes, shape_fn, use_self); # ifdef PERFDEBUG - double overlap_time = BLI_time_now_seconds(); + double overlap_time = BLI_check_seconds_timer(); std::cout << "intersect overlaps calculated, time = " << overlap_time - bb_calc_time << "\n"; # endif Array tri_subdivided(tm_clean->face_size(), NoInitialization()); @@ -2995,7 +2997,7 @@ IMesh trimesh_nary_intersect(const IMesh &tm_in, } }); # ifdef PERFDEBUG - double plane_populate = BLI_time_now_seconds(); + double plane_populate = BLI_check_seconds_timer(); std::cout << "planes populated, time = " << plane_populate - overlap_time << "\n"; # endif /* itt_map((a,b)) will hold the intersection value resulting from intersecting @@ -3004,7 +3006,7 @@ IMesh trimesh_nary_intersect(const IMesh &tm_in, itt_map.reserve(tri_ov.overlap().size()); calc_overlap_itts(itt_map, *tm_clean, tri_ov, arena); # ifdef PERFDEBUG - double itt_time = BLI_time_now_seconds(); + double itt_time = BLI_check_seconds_timer(); std::cout << "itts found, time = " << itt_time - plane_populate << "\n"; # endif CoplanarClusterInfo clinfo = find_clusters(*tm_clean, tri_bb, itt_map); @@ -3012,7 +3014,7 @@ IMesh trimesh_nary_intersect(const IMesh &tm_in, std::cout << clinfo; } # ifdef PERFDEBUG - double find_cluster_time = BLI_time_now_seconds(); + double find_cluster_time = BLI_check_seconds_timer(); std::cout << "clusters found, time = " << find_cluster_time - itt_time << "\n"; doperfmax(0, tm_in.face_size()); doperfmax(1, clinfo.tot_cluster()); @@ -3020,7 +3022,7 @@ IMesh trimesh_nary_intersect(const IMesh &tm_in, # endif calc_subdivided_non_cluster_tris(tri_subdivided, *tm_clean, itt_map, clinfo, tri_ov, arena); # ifdef PERFDEBUG - double subdivided_tris_time = BLI_time_now_seconds(); + double subdivided_tris_time = BLI_check_seconds_timer(); std::cout << "subdivided non-cluster tris found, time = " << subdivided_tris_time - itt_time << "\n"; # endif @@ -3029,13 +3031,13 @@ IMesh trimesh_nary_intersect(const IMesh &tm_in, cluster_subdivided[c] = calc_cluster_subdivided(clinfo, c, *tm_clean, tri_ov, itt_map, arena); } # ifdef PERFDEBUG - double cluster_subdivide_time = BLI_time_now_seconds(); + double cluster_subdivide_time = BLI_check_seconds_timer(); std::cout << "subdivided clusters found, time = " << cluster_subdivide_time - subdivided_tris_time << "\n"; # endif calc_cluster_tris(tri_subdivided, *tm_clean, clinfo, cluster_subdivided, arena); # ifdef PERFDEBUG - double extract_time = BLI_time_now_seconds(); + double extract_time = BLI_check_seconds_timer(); std::cout << "subdivided cluster tris found, time = " << extract_time - cluster_subdivide_time << "\n"; # endif @@ -3045,7 +3047,7 @@ IMesh trimesh_nary_intersect(const IMesh &tm_in, std::cout << combined; } # ifdef PERFDEBUG - double end_time = BLI_time_now_seconds(); + double end_time = BLI_check_seconds_timer(); std::cout << "triangles combined, time = " << end_time - extract_time << "\n"; std::cout << "trimesh_nary_intersect done, total time = " << end_time - start_time << "\n"; dump_perfdata(); diff --git a/source/blender/blenlib/intern/path_util.cc b/source/blender/blenlib/intern/path_util.cc index 46ef7b53396..0a91702897f 100644 --- a/source/blender/blenlib/intern/path_util.cc +++ b/source/blender/blenlib/intern/path_util.cc @@ -12,10 +12,13 @@ #include #include +#include "DNA_listBase.h" + #include "BLI_fileops.h" #include "BLI_fnmatch.h" #include "BLI_path_util.h" #include "BLI_string.h" +#include "BLI_string_utf8.h" #include "BLI_string_utils.hh" #include "BLI_utildefines.h" diff --git a/source/blender/blenlib/intern/polyfill_2d.c b/source/blender/blenlib/intern/polyfill_2d.c index 5b81a947659..7e96defb5e8 100644 --- a/source/blender/blenlib/intern/polyfill_2d.c +++ b/source/blender/blenlib/intern/polyfill_2d.c @@ -40,7 +40,7 @@ #include "BLI_polyfill_2d.h" /* own include */ -#include "BLI_strict_flags.h" /* Keep last. */ +#include "BLI_strict_flags.h" /* avoid fan-fill topology */ #define USE_CLIP_EVEN diff --git a/source/blender/blenlib/intern/polyfill_2d_beautify.c b/source/blender/blenlib/intern/polyfill_2d_beautify.c index ae83a487f4c..d9d786ae7eb 100644 --- a/source/blender/blenlib/intern/polyfill_2d_beautify.c +++ b/source/blender/blenlib/intern/polyfill_2d_beautify.c @@ -31,7 +31,7 @@ #include "BLI_polyfill_2d_beautify.h" /* own include */ -#include "BLI_strict_flags.h" /* Keep last. */ +#include "BLI_strict_flags.h" /* Used to find matching edges. */ struct OrderEdge { diff --git a/source/blender/blenlib/intern/quadric.c b/source/blender/blenlib/intern/quadric.c index d70e8806ed0..8a999d2c386 100644 --- a/source/blender/blenlib/intern/quadric.c +++ b/source/blender/blenlib/intern/quadric.c @@ -17,14 +17,14 @@ * often need high precision, see #44780. */ -#include +#include "BLI_strict_flags.h" #include "BLI_math_base.h" #include "BLI_math_matrix.h" #include "BLI_math_vector.h" #include "BLI_quadric.h" /* own include */ -#include "BLI_strict_flags.h" /* Keep last. */ +#include #define QUADRIC_FLT_TOT (sizeof(Quadric) / sizeof(double)) diff --git a/source/blender/blenlib/intern/rand.cc b/source/blender/blenlib/intern/rand.cc index a1ec6550c9b..29cc51d55cd 100644 --- a/source/blender/blenlib/intern/rand.cc +++ b/source/blender/blenlib/intern/rand.cc @@ -19,10 +19,10 @@ #include "BLI_math_vector.h" #include "BLI_rand.h" #include "BLI_rand.hh" -#include "BLI_sys_types.h" #include "BLI_threads.h" -#include "BLI_strict_flags.h" /* Keep last. */ +#include "BLI_strict_flags.h" +#include "BLI_sys_types.h" extern "C" uchar BLI_noise_hash_uchar_512[512]; /* `noise.cc` */ #define hash BLI_noise_hash_uchar_512 diff --git a/source/blender/blenlib/intern/scanfill.c b/source/blender/blenlib/intern/scanfill.c index fe6529426ed..af93fb82205 100644 --- a/source/blender/blenlib/intern/scanfill.c +++ b/source/blender/blenlib/intern/scanfill.c @@ -32,7 +32,7 @@ #include "BLI_scanfill.h" /* own include */ -#include "BLI_strict_flags.h" /* Keep last. */ +#include "BLI_strict_flags.h" /* local types */ typedef struct PolyFill { diff --git a/source/blender/blenlib/intern/scanfill_utils.c b/source/blender/blenlib/intern/scanfill_utils.c index 78728efb4cc..279e8856c34 100644 --- a/source/blender/blenlib/intern/scanfill_utils.c +++ b/source/blender/blenlib/intern/scanfill_utils.c @@ -22,7 +22,7 @@ #include "BLI_scanfill.h" /* own include */ -#include "BLI_strict_flags.h" /* Keep last. */ +#include "BLI_strict_flags.h" typedef struct PolyInfo { ScanFillEdge *edge_first, *edge_last; @@ -425,7 +425,7 @@ bool BLI_scanfill_calc_self_isect(ScanFillContext *sf_ctx, return false; } - /* move free edges into their own list */ + /* move free edges into own list */ { ScanFillEdge *eed; ScanFillEdge *eed_next; @@ -438,7 +438,7 @@ bool BLI_scanfill_calc_self_isect(ScanFillContext *sf_ctx, } } - /* move free vertices into their own list */ + /* move free vertices into own list */ { ScanFillEdge *eed; ScanFillVert *eve; diff --git a/source/blender/blenlib/intern/serialize.cc b/source/blender/blenlib/intern/serialize.cc index 15492c47394..f7c55705558 100644 --- a/source/blender/blenlib/intern/serialize.cc +++ b/source/blender/blenlib/intern/serialize.cc @@ -68,10 +68,11 @@ const DictionaryValue *Value::as_dictionary_value() const static void convert_to_json(nlohmann::ordered_json &j, const Value &value); static void convert_to_json(nlohmann::ordered_json &j, const ArrayValue &value) { + const ArrayValue::Items &items = value.elements(); /* Create a json array to store the elements. If this isn't done and items is empty it would * return use a null value, in stead of an empty array. */ j = "[]"_json; - for (const std::shared_ptr &item_value : value.elements()) { + for (const ArrayValue::Item &item_value : items) { nlohmann::ordered_json json_item; convert_to_json(json_item, *item_value); j.push_back(json_item); @@ -80,10 +81,11 @@ static void convert_to_json(nlohmann::ordered_json &j, const ArrayValue &value) static void convert_to_json(nlohmann::ordered_json &j, const DictionaryValue &value) { + const DictionaryValue::Items &attributes = value.elements(); /* Create a json object to store the attributes. If this isn't done and attributes is empty it * would return use a null value, in stead of an empty object. */ j = "{}"_json; - for (const DictionaryValue::Item &attribute : value.elements()) { + for (const DictionaryValue::Item &attribute : attributes) { nlohmann::ordered_json json_item; convert_to_json(json_item, *attribute.second); j[attribute.first] = json_item; @@ -141,8 +143,11 @@ static std::unique_ptr convert_from_json(const nlohmann::ordered_json &j) static std::unique_ptr convert_from_json_to_array(const nlohmann::ordered_json &j) { std::unique_ptr array = std::make_unique(); + ArrayValue::Items &elements = array->elements(); for (auto element : j.items()) { - array->append(convert_from_json(element.value())); + nlohmann::ordered_json element_json = element.value(); + std::unique_ptr value = convert_from_json(element_json); + elements.append_as(value.release()); } return array; } @@ -151,8 +156,12 @@ static std::unique_ptr convert_from_json_to_object( const nlohmann::ordered_json &j) { std::unique_ptr object = std::make_unique(); + DictionaryValue::Items &elements = object->elements(); for (auto element : j.items()) { - object->append(element.key(), convert_from_json(element.value())); + std::string key = element.key(); + nlohmann::ordered_json element_json = element.value(); + std::unique_ptr value = convert_from_json(element_json); + elements.append_as(std::pair(key, value.release())); } return object; } @@ -207,7 +216,7 @@ static std::unique_ptr convert_from_json(const nlohmann::ordered_json &j) void ArrayValue::append(std::shared_ptr value) { - values_.append(std::move(value)); + this->elements().append(std::move(value)); } void ArrayValue::append_bool(const bool value) @@ -249,10 +258,10 @@ std::shared_ptr ArrayValue::append_array() return value; } -DictionaryValue::Lookup DictionaryValue::create_lookup() const +const DictionaryValue::Lookup DictionaryValue::create_lookup() const { Lookup result; - for (const Item &item : values_) { + for (const Item &item : elements()) { result.add_as(item.first, item.second); } return result; @@ -260,7 +269,7 @@ DictionaryValue::Lookup DictionaryValue::create_lookup() const const std::shared_ptr *DictionaryValue::lookup(const StringRef key) const { - for (const auto &item : values_) { + for (const auto &item : this->elements()) { if (item.first == key) { return &item.second; } @@ -316,7 +325,7 @@ const ArrayValue *DictionaryValue::lookup_array(const StringRef key) const void DictionaryValue::append(std::string key, std::shared_ptr value) { - values_.append({std::move(key), std::move(value)}); + this->elements().append({std::move(key), std::move(value)}); } void DictionaryValue::append_int(std::string key, const int64_t value) @@ -329,9 +338,9 @@ void DictionaryValue::append_double(std::string key, const double value) this->append(std::move(key), std::make_shared(value)); } -void DictionaryValue::append_str(std::string key, std::string value) +void DictionaryValue::append_str(std::string key, const std::string value) { - this->append(std::move(key), std::make_shared(std::move(value))); + this->append(std::move(key), std::make_shared(value)); } std::shared_ptr DictionaryValue::append_dict(std::string key) diff --git a/source/blender/blenlib/intern/session_uid.c b/source/blender/blenlib/intern/session_uid.c index 7aa0731fd6b..d13151e27e9 100644 --- a/source/blender/blenlib/intern/session_uid.c +++ b/source/blender/blenlib/intern/session_uid.c @@ -8,6 +8,8 @@ #include "BLI_session_uid.h" +#include "BLI_utildefines.h" + #include "atomic_ops.h" /* Special value which indicates the UID has not been assigned yet. */ diff --git a/source/blender/blenlib/intern/stack.c b/source/blender/blenlib/intern/stack.c index b771265932a..addb478d4f9 100644 --- a/source/blender/blenlib/intern/stack.c +++ b/source/blender/blenlib/intern/stack.c @@ -14,7 +14,7 @@ #include "BLI_stack.h" /* own include */ -#include "BLI_strict_flags.h" /* Keep last. */ +#include "BLI_strict_flags.h" #define USE_TOTELEM diff --git a/source/blender/blenlib/intern/string.c b/source/blender/blenlib/intern/string.c index ea513f63250..1a957fb89fe 100644 --- a/source/blender/blenlib/intern/string.c +++ b/source/blender/blenlib/intern/string.c @@ -20,7 +20,7 @@ #include "BLI_utildefines.h" -#include "BLI_strict_flags.h" /* Keep last. */ +#include "BLI_strict_flags.h" /* -------------------------------------------------------------------- */ /** \name String Duplicate/Copy diff --git a/source/blender/blenlib/intern/string_cursor_utf8.c b/source/blender/blenlib/intern/string_cursor_utf8.c index be1977d2a0d..d8c2f40f633 100644 --- a/source/blender/blenlib/intern/string_cursor_utf8.c +++ b/source/blender/blenlib/intern/string_cursor_utf8.c @@ -14,7 +14,7 @@ #include "BLI_string_cursor_utf8.h" /* own include */ -#include "BLI_strict_flags.h" /* Keep last. */ +#include "BLI_strict_flags.h" /** * The category of character as returned by #cursor_delim_type_unicode. diff --git a/source/blender/blenlib/intern/string_search.cc b/source/blender/blenlib/intern/string_search.cc index b6c57a6bba5..73c0e64ba4b 100644 --- a/source/blender/blenlib/intern/string_search.cc +++ b/source/blender/blenlib/intern/string_search.cc @@ -12,6 +12,7 @@ #include "BLI_string_utf8.h" #include "BLI_string_utf8_symbols.h" #include "BLI_task.hh" +#include "BLI_timeit.hh" /* Right arrow, keep in sync with #UI_MENU_ARROW_SEP in `UI_interface.hh`. */ #define UI_MENU_ARROW_SEP BLI_STR_UTF8_BLACK_RIGHT_POINTING_SMALL_TRIANGLE diff --git a/source/blender/blenlib/intern/string_utf8.cc b/source/blender/blenlib/intern/string_utf8.cc index 6402376e103..07d889272cb 100644 --- a/source/blender/blenlib/intern/string_utf8.cc +++ b/source/blender/blenlib/intern/string_utf8.cc @@ -29,7 +29,7 @@ # pragma GCC diagnostic error "-Wsign-conversion" #endif -#include "BLI_strict_flags.h" /* Keep last. */ +#include "BLI_strict_flags.h" /* -------------------------------------------------------------------- */ /** \name UTF8 Character Decoding (Skip & Mask Lookup) diff --git a/source/blender/blenlib/intern/string_utils.cc b/source/blender/blenlib/intern/string_utils.cc index 92222b5e0e3..c53a1e62327 100644 --- a/source/blender/blenlib/intern/string_utils.cc +++ b/source/blender/blenlib/intern/string_utils.cc @@ -24,7 +24,7 @@ #include "DNA_listBase.h" -#include "BLI_strict_flags.h" /* Keep last. */ +#include "BLI_strict_flags.h" /* -------------------------------------------------------------------- */ /** \name String Replace diff --git a/source/blender/blenlib/intern/system.c b/source/blender/blenlib/intern/system.c index 888b20d2f89..0b9fb4b6c9a 100644 --- a/source/blender/blenlib/intern/system.c +++ b/source/blender/blenlib/intern/system.c @@ -13,6 +13,9 @@ #include "BLI_math_base.h" #include "BLI_string.h" #include "BLI_system.h" +#include "BLI_utildefines.h" + +#include "MEM_guardedalloc.h" /* for backtrace and gethostname/GetComputerName */ #if defined(WIN32) @@ -127,7 +130,6 @@ static void __cpuid( char *BLI_cpu_brand_string(void) { -#if !defined(_M_ARM64) char buf[49] = {0}; int result[4] = {0}; __cpuid(result, 0x80000000); @@ -139,36 +141,19 @@ char *BLI_cpu_brand_string(void) /* TODO(sergey): Make it a bit more presentable by removing trademark. */ return brand; } -#else - // No CPUID on ARM64, so we pull from the registry (on Windows) instead - DWORD vendorIdentifierLength = 255; - char vendorIdentifier[255]; - if (RegGetValueA(HKEY_LOCAL_MACHINE, - "HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0", - "VendorIdentifier", - RRF_RT_REG_SZ, - NULL, - &vendorIdentifier, - &vendorIdentifierLength) == ERROR_SUCCESS) - { - return BLI_strdup(vendorIdentifier); - } -#endif return NULL; } -int BLI_cpu_support_sse42(void) +int BLI_cpu_support_sse41(void) { -#if !defined(_M_ARM64) int result[4], num; __cpuid(result, 0); num = result[0]; if (num >= 1) { __cpuid(result, 0x00000001); - return (result[2] & ((int)1 << 20)) != 0; + return (result[2] & ((int)1 << 19)) != 0; } -#endif return 0; } diff --git a/source/blender/blenlib/intern/system_win32.c b/source/blender/blenlib/intern/system_win32.c index 2924db0f668..8b384a670d5 100644 --- a/source/blender/blenlib/intern/system_win32.c +++ b/source/blender/blenlib/intern/system_win32.c @@ -144,27 +144,15 @@ static bool BLI_windows_system_backtrace_run_trace(FILE *fp, HANDLE hThread, PCO symbolinfo->SizeOfStruct = sizeof(SYMBOL_INFO); STACKFRAME frame = {0}; - DWORD machineType = 0; -#if defined(_M_AMD64) frame.AddrPC.Offset = context->Rip; frame.AddrPC.Mode = AddrModeFlat; frame.AddrFrame.Offset = context->Rsp; frame.AddrFrame.Mode = AddrModeFlat; frame.AddrStack.Offset = context->Rsp; frame.AddrStack.Mode = AddrModeFlat; - machineType = IMAGE_FILE_MACHINE_AMD64; -#elif defined(_M_ARM64) - frame.AddrPC.Offset = context->Pc; - frame.AddrPC.Mode = AddrModeFlat; - frame.AddrFrame.Offset = context->Fp; - frame.AddrFrame.Mode = AddrModeFlat; - frame.AddrStack.Offset = context->Sp; - frame.AddrStack.Mode = AddrModeFlat; - machineType = IMAGE_FILE_MACHINE_ARM64; -#endif while (true) { - if (StackWalk64(machineType, + if (StackWalk64(IMAGE_FILE_MACHINE_AMD64, GetCurrentProcess(), hThread, &frame, diff --git a/source/blender/blenlib/intern/task_graph.cc b/source/blender/blenlib/intern/task_graph.cc index cd7e09c31c2..1e46bfebcbc 100644 --- a/source/blender/blenlib/intern/task_graph.cc +++ b/source/blender/blenlib/intern/task_graph.cc @@ -8,9 +8,7 @@ * Task graph. */ -#ifdef WITH_CXX_GUARDEDALLOC -# include "MEM_guardedalloc.h" -#endif +#include "MEM_guardedalloc.h" #include "BLI_task.h" diff --git a/source/blender/blenlib/intern/task_iterator.c b/source/blender/blenlib/intern/task_iterator.c index 05a73ca53d8..3fb95bac1ff 100644 --- a/source/blender/blenlib/intern/task_iterator.c +++ b/source/blender/blenlib/intern/task_iterator.c @@ -12,11 +12,17 @@ #include "MEM_guardedalloc.h" +#include "DNA_listBase.h" + +#include "BLI_listbase.h" +#include "BLI_math_base.h" #include "BLI_mempool.h" #include "BLI_mempool_private.h" #include "BLI_task.h" #include "BLI_threads.h" +#include "atomic_ops.h" + /* -------------------------------------------------------------------- */ /** \name Macros * \{ */ diff --git a/source/blender/blenlib/intern/task_range.cc b/source/blender/blenlib/intern/task_range.cc index 9acb2ed84f6..0ff589d929c 100644 --- a/source/blender/blenlib/intern/task_range.cc +++ b/source/blender/blenlib/intern/task_range.cc @@ -12,13 +12,12 @@ #include "MEM_guardedalloc.h" -#include "BLI_array.hh" +#include "DNA_listBase.h" + #include "BLI_lazy_threading.hh" -#include "BLI_offset_indices.hh" #include "BLI_task.h" #include "BLI_task.hh" #include "BLI_threads.h" -#include "BLI_vector.hh" #include "atomic_ops.h" @@ -182,45 +181,4 @@ void parallel_for_impl(const IndexRange range, function(range); } -void parallel_for_weighted_impl( - const IndexRange range, - const int64_t grain_size, - const FunctionRef function, - const FunctionRef)> task_sizes_fn) -{ - /* Shouldn't be too small, because then there is more overhead when the individual tasks are - * small. Also shouldn't be too large because then the serial code to split up tasks causes extra - * overhead. */ - const int64_t outer_grain_size = std::min(grain_size, 512); - threading::parallel_for(range, outer_grain_size, [&](const IndexRange sub_range) { - /* Compute the size of every task in the current range. */ - Array task_sizes(sub_range.size()); - task_sizes_fn(sub_range, task_sizes); - - /* Split range into multiple segments that have a size that approximates the grain size. */ - Vector offsets_vec; - offsets_vec.append(0); - int64_t counter = 0; - for (const int64_t i : sub_range.index_range()) { - counter += task_sizes[i]; - if (counter >= grain_size) { - offsets_vec.append(i + 1); - counter = 0; - } - } - if (offsets_vec.last() < sub_range.size()) { - offsets_vec.append(sub_range.size()); - } - const OffsetIndices offsets = offsets_vec.as_span(); - - /* Run the dynamically split tasks in parallel. */ - threading::parallel_for(offsets.index_range(), 1, [&](const IndexRange offsets_range) { - for (const int64_t i : offsets_range) { - const IndexRange actual_range = offsets[i].shift(sub_range.start()); - function(actual_range); - } - }); - }); -} - } // namespace blender::threading::detail diff --git a/source/blender/blenlib/intern/tempfile.c b/source/blender/blenlib/intern/tempfile.c index e34005757e1..06c6f4f25d3 100644 --- a/source/blender/blenlib/intern/tempfile.c +++ b/source/blender/blenlib/intern/tempfile.c @@ -8,19 +8,13 @@ #include "BLI_path_util.h" #include "BLI_string.h" -bool BLI_temp_directory_path_copy_if_valid(char *tempdir, - const size_t tempdir_maxncpy, +bool BLI_temp_directory_path_copy_if_valid(char *temp_directory, + const size_t buffer_size, const char *dirpath) { - /* NOTE(@ideasman42): it is *not* the purpose of this function to check that - * `dirpath` is writable under all circumstances. - * Only check `dirpath` doesn't resolve to an empty string & points to a directory. - * - * While other checks could be added to avoid problems writing temporary files: - * (read-only, permission failure, out-of-I-nodes, disk-full... etc) - * it's out of scope for this function as these characteristics can change at run-time. - * In general temporary file IO should handle failure properly with sufficient user feedback, - * without attempting to *solve* the problem by anticipating file-system issues ahead of time. */ + if (dirpath == NULL) { + return false; + } /* Disallow paths starting with two forward slashes. While they are valid paths, * Blender interprets them as relative in situations relative paths aren't supported, @@ -35,24 +29,24 @@ bool BLI_temp_directory_path_copy_if_valid(char *tempdir, return false; } - BLI_strncpy(tempdir, dirpath, tempdir_maxncpy); + BLI_strncpy(temp_directory, dirpath, buffer_size); /* Add a trailing slash if needed. */ - BLI_path_slash_ensure(tempdir, tempdir_maxncpy); + BLI_path_slash_ensure(temp_directory, buffer_size); /* There's nothing preventing an environment variable (even preferences) from being CWD relative. * This causes: * - Asserts in code-paths which expect absolute paths (blend-file IO). * - The temporary directory to change if the CWD changes. * Avoid issues by ensuring the temporary directory is *never* CWD relative. */ - BLI_path_abs_from_cwd(tempdir, tempdir_maxncpy); + BLI_path_abs_from_cwd(temp_directory, buffer_size); return true; } -void BLI_temp_directory_path_get(char *tempdir, const size_t tempdir_maxncpy) +void BLI_temp_directory_path_get(char *temp_directory, const size_t buffer_size) { - tempdir[0] = '\0'; + temp_directory[0] = '\0'; const char *env_vars[] = { #ifdef WIN32 @@ -66,16 +60,16 @@ void BLI_temp_directory_path_get(char *tempdir, const size_t tempdir_maxncpy) }; for (int i = 0; i < ARRAY_SIZE(env_vars); i++) { - const char *tempdir_test = BLI_getenv(env_vars[i]); - if (tempdir_test == NULL) { - continue; - } - if (BLI_temp_directory_path_copy_if_valid(tempdir, tempdir_maxncpy, tempdir_test)) { + if (BLI_temp_directory_path_copy_if_valid( + temp_directory, buffer_size, BLI_getenv(env_vars[i]))) + { break; } } - if (tempdir[0] == '\0') { - BLI_strncpy(tempdir, "/tmp/", tempdir_maxncpy); + if (temp_directory[0] == '\0') { + BLI_strncpy(temp_directory, "/tmp/", buffer_size); } + + BLI_dir_create_recursive(temp_directory); } diff --git a/source/blender/blenlib/intern/threads.cc b/source/blender/blenlib/intern/threads.cc index 71277b1c786..1ae433d51d4 100644 --- a/source/blender/blenlib/intern/threads.cc +++ b/source/blender/blenlib/intern/threads.cc @@ -63,7 +63,7 @@ * // tag job 'processed * BLI_threadpool_insert(&lb, job); * } - * else BLI_time_sleep_ms(50); + * else BLI_sleep_ms(50); * * // Find if a job is ready, this the do_something_func() should write in job somewhere. * cont = 0; @@ -410,13 +410,7 @@ void BLI_spin_lock(SpinLock *spin) #elif defined(__APPLE__) BLI_mutex_lock(spin); #elif defined(_MSC_VER) -# if defined(_M_ARM64) - // InterlockedExchangeAcquire takes a long arg on MSVC ARM64 - static_assert(sizeof(long) == sizeof(SpinLock)); - while (InterlockedExchangeAcquire((volatile long *)spin, 1)) { -# else while (InterlockedExchangeAcquire(spin, 1)) { -# endif while (*spin) { /* Spin-lock hint for processors with hyper-threading. */ YieldProcessor(); @@ -693,7 +687,7 @@ void *BLI_thread_queue_pop_timeout(ThreadQueue *queue, int ms) void *work = nullptr; timespec timeout; - t = BLI_time_now_seconds(); + t = BLI_check_seconds_timer(); wait_timeout(&timeout, ms); /* wait until there is work */ @@ -702,7 +696,7 @@ void *BLI_thread_queue_pop_timeout(ThreadQueue *queue, int ms) if (pthread_cond_timedwait(&queue->push_cond, &queue->mutex, &timeout) == ETIMEDOUT) { break; } - if (BLI_time_now_seconds() - t >= ms * 0.001) { + if (BLI_check_seconds_timer() - t >= ms * 0.001) { break; } } diff --git a/source/blender/blenlib/intern/time.c b/source/blender/blenlib/intern/time.c index e8b27f98174..2af01aea92a 100644 --- a/source/blender/blenlib/intern/time.c +++ b/source/blender/blenlib/intern/time.c @@ -12,7 +12,7 @@ # define WIN32_LEAN_AND_MEAN # include -double BLI_time_now_seconds(void) +double BLI_check_seconds_timer(void) { static int hasperfcounter = -1; /* (-1 == unknown) */ static double perffreq; @@ -47,12 +47,12 @@ double BLI_time_now_seconds(void) } } -long int BLI_time_now_seconds_i(void) +long int BLI_check_seconds_timer_i(void) { - return (long int)BLI_time_now_seconds(); + return (long int)BLI_check_seconds_timer(); } -void BLI_time_sleep_ms(int ms) +void BLI_sleep_ms(int ms) { Sleep(ms); } @@ -62,7 +62,7 @@ void BLI_time_sleep_ms(int ms) # include # include -double BLI_time_now_seconds(void) +double BLI_check_seconds_timer(void) { struct timeval tv; struct timezone tz; @@ -72,7 +72,7 @@ double BLI_time_now_seconds(void) return ((double)tv.tv_sec + tv.tv_usec / 1000000.0); } -long int BLI_time_now_seconds_i(void) +long int BLI_check_seconds_timer_i(void) { struct timeval tv; struct timezone tz; @@ -82,7 +82,7 @@ long int BLI_time_now_seconds_i(void) return tv.tv_sec; } -void BLI_time_sleep_ms(int ms) +void BLI_sleep_ms(int ms) { if (ms >= 1000) { sleep(ms / 1000); diff --git a/source/blender/blenlib/intern/timecode.c b/source/blender/blenlib/intern/timecode.c index 5989ae47417..8b4546d82fa 100644 --- a/source/blender/blenlib/intern/timecode.c +++ b/source/blender/blenlib/intern/timecode.c @@ -18,7 +18,7 @@ #include "DNA_userdef_types.h" /* for eTimecodeStyles only */ -#include "BLI_strict_flags.h" /* Keep last. */ +#include "BLI_strict_flags.h" size_t BLI_timecode_string_from_time(char *str, const size_t maxncpy, diff --git a/source/blender/blenlib/intern/uuid.cc b/source/blender/blenlib/intern/uuid.cc index be42a089d90..49da4804af0 100644 --- a/source/blender/blenlib/intern/uuid.cc +++ b/source/blender/blenlib/intern/uuid.cc @@ -153,7 +153,7 @@ bUUID::bUUID(const std::initializer_list field_values) std::copy(field_iter, field_values.end(), this->node); } -bUUID::bUUID(const StringRefNull string_formatted_uuid) +bUUID::bUUID(const std::string &string_formatted_uuid) { const bool parsed_ok = BLI_uuid_parse_string(this, string_formatted_uuid.c_str()); if (!parsed_ok) { @@ -168,13 +168,6 @@ bUUID::bUUID(const ::bUUID &struct_uuid) *(static_cast<::bUUID *>(this)) = struct_uuid; } -std::string bUUID::str() const -{ - std::string string(36, '\0'); - BLI_uuid_format(string.data(), *this); - return string; -} - uint64_t bUUID::hash() const { /* Convert the struct into two 64-bit numbers, and XOR them to get the hash. */ diff --git a/source/blender/blenlib/intern/uvproject.cc b/source/blender/blenlib/intern/uvproject.c similarity index 87% rename from source/blender/blenlib/intern/uvproject.cc rename to source/blender/blenlib/intern/uvproject.c index c335cd17981..e2922ed1e76 100644 --- a/source/blender/blenlib/intern/uvproject.cc +++ b/source/blender/blenlib/intern/uvproject.c @@ -6,7 +6,7 @@ * \ingroup bli */ -#include +#include #include "MEM_guardedalloc.h" @@ -18,7 +18,7 @@ #include "BLI_math_vector.h" #include "BLI_uvproject.h" -struct ProjCameraInfo { +typedef struct ProjCameraInfo { float camangle; float camsize; float xasp, yasp; @@ -26,7 +26,7 @@ struct ProjCameraInfo { float rotmat[4][4]; float caminv[4][4]; bool do_persp, do_pano, do_rotmat; -}; +} ProjCameraInfo; void BLI_uvproject_from_camera(float target[2], float source[3], ProjCameraInfo *uci) { @@ -44,7 +44,7 @@ void BLI_uvproject_from_camera(float target[2], float source[3], ProjCameraInfo mul_m4_v4(uci->caminv, pv4); if (uci->do_pano) { - float angle = atan2f(pv4[0], -pv4[2]) / (float(M_PI) * 2.0f); /* angle around the camera */ + float angle = atan2f(pv4[0], -pv4[2]) / ((float)M_PI * 2.0f); /* angle around the camera */ if (uci->do_persp == false) { target[0] = angle; /* no correct method here, just map to 0-1 */ target[1] = pv4[1] / uci->camsize; @@ -53,7 +53,7 @@ void BLI_uvproject_from_camera(float target[2], float source[3], ProjCameraInfo float vec2d[2]; /* 2D position from the camera */ vec2d[0] = pv4[0]; vec2d[1] = pv4[2]; - target[0] = angle * (float(M_PI) / uci->camangle); + target[0] = angle * ((float)M_PI / uci->camangle); target[1] = pv4[1] / (len_v2(vec2d) * (uci->camsize * 2.0f)); } } @@ -121,13 +121,10 @@ void BLI_uvproject_from_view(float target[2], target[1] = (y + target[1]) / winy; } -ProjCameraInfo *BLI_uvproject_camera_info(const Object *ob, - const float rotmat[4][4], - float winx, - float winy) +ProjCameraInfo *BLI_uvproject_camera_info(Object *ob, float rotmat[4][4], float winx, float winy) { ProjCameraInfo uci; - const Camera *camera = static_cast(ob->data); + Camera *camera = ob->data; uci.do_pano = (camera->type == CAM_PANO); uci.do_persp = (camera->type == CAM_PERSP); @@ -136,7 +133,7 @@ ProjCameraInfo *BLI_uvproject_camera_info(const Object *ob, uci.camsize = uci.do_persp ? tanf(uci.camangle) : camera->ortho_scale; /* account for scaled cameras */ - copy_m4_m4(uci.caminv, ob->object_to_world().ptr()); + copy_m4_m4(uci.caminv, ob->object_to_world); normalize_m4(uci.caminv); if (invert_m4(uci.caminv)) { @@ -165,12 +162,12 @@ ProjCameraInfo *BLI_uvproject_camera_info(const Object *ob, uci.shiftx = 0.5f - (camera->shiftx * uci.xasp); uci.shifty = 0.5f - (camera->shifty * uci.yasp); - uci_pt = static_cast(MEM_mallocN(sizeof(ProjCameraInfo), __func__)); + uci_pt = MEM_mallocN(sizeof(ProjCameraInfo), "ProjCameraInfo"); *uci_pt = uci; return uci_pt; } - return nullptr; + return NULL; } void BLI_uvproject_from_view_ortho(float target[2], float source[3], const float rotmat[4][4]) diff --git a/source/blender/blenlib/intern/voxel.c b/source/blender/blenlib/intern/voxel.c index 0ea2b1de57a..85e8c9e46f2 100644 --- a/source/blender/blenlib/intern/voxel.c +++ b/source/blender/blenlib/intern/voxel.c @@ -9,7 +9,7 @@ #include "BLI_utildefines.h" #include "BLI_voxel.h" -#include "BLI_strict_flags.h" /* Keep last. */ +#include "BLI_strict_flags.h" BLI_INLINE float D(const float *data, const int res[3], int x, int y, int z) { diff --git a/source/blender/blenlib/tests/BLI_array_test.cc b/source/blender/blenlib/tests/BLI_array_test.cc index 44e6c9a2ce8..d4eafdc02a6 100644 --- a/source/blender/blenlib/tests/BLI_array_test.cc +++ b/source/blender/blenlib/tests/BLI_array_test.cc @@ -2,13 +2,11 @@ * * SPDX-License-Identifier: Apache-2.0 */ -#include "testing/testing.h" - #include "BLI_array.hh" #include "BLI_exception_safety_test_utils.hh" +#include "BLI_strict_flags.h" #include "BLI_vector.hh" - -#include "BLI_strict_flags.h" /* Keep last. */ +#include "testing/testing.h" namespace blender::tests { diff --git a/source/blender/blenlib/tests/BLI_bit_group_vector_test.cc b/source/blender/blenlib/tests/BLI_bit_group_vector_test.cc index 974a6fd92bd..8885f3d5c00 100644 --- a/source/blender/blenlib/tests/BLI_bit_group_vector_test.cc +++ b/source/blender/blenlib/tests/BLI_bit_group_vector_test.cc @@ -2,11 +2,10 @@ * * SPDX-License-Identifier: Apache-2.0 */ -#include "testing/testing.h" - #include "BLI_bit_group_vector.hh" +#include "BLI_strict_flags.h" -#include "BLI_strict_flags.h" /* Keep last. */ +#include "testing/testing.h" namespace blender::bits::tests { diff --git a/source/blender/blenlib/tests/BLI_bit_vector_test.cc b/source/blender/blenlib/tests/BLI_bit_vector_test.cc index 7efeb6bc832..803ff0f021f 100644 --- a/source/blender/blenlib/tests/BLI_bit_vector_test.cc +++ b/source/blender/blenlib/tests/BLI_bit_vector_test.cc @@ -2,12 +2,11 @@ * * SPDX-License-Identifier: Apache-2.0 */ -#include "testing/testing.h" - #include "BLI_bit_vector.hh" #include "BLI_exception_safety_test_utils.hh" +#include "BLI_strict_flags.h" -#include "BLI_strict_flags.h" /* Keep last. */ +#include "testing/testing.h" namespace blender::bits::tests { diff --git a/source/blender/blenlib/tests/BLI_bounds_test.cc b/source/blender/blenlib/tests/BLI_bounds_test.cc index 9da09ebd4e7..44f6cff9ace 100644 --- a/source/blender/blenlib/tests/BLI_bounds_test.cc +++ b/source/blender/blenlib/tests/BLI_bounds_test.cc @@ -12,111 +12,6 @@ namespace blender::tests { TEST(bounds, Empty) -{ - Bounds bounds1(float2(0.0f)); - Bounds bounds2(float2(1.0f), float2(-1.0f)); - Bounds bounds3(float2(-1.0f), float2(1.0f)); - EXPECT_TRUE(bounds1.is_empty()); - EXPECT_TRUE(bounds2.is_empty()); - EXPECT_FALSE(bounds3.is_empty()); -} - -TEST(bounds, EmptyInt) -{ - Bounds bounds1(0); - Bounds bounds2(1, -1); - Bounds bounds3(-1, 1); - EXPECT_TRUE(bounds1.is_empty()); - EXPECT_TRUE(bounds2.is_empty()); - EXPECT_FALSE(bounds3.is_empty()); -} - -TEST(bounds, Center) -{ - Bounds bounds1(float2(0.0f)); - Bounds bounds2(float2(-1.0f)); - Bounds bounds3(float2(-1.0f), float2(1.0f)); - Bounds bounds4(float2(-3.0f, -5.0f), float2(2.0f, 4.0f)); - EXPECT_EQ(bounds1.center(), float2(0.0f)); - EXPECT_EQ(bounds2.center(), float2(-1.0f)); - EXPECT_EQ(bounds3.center(), float2(0.0f)); - EXPECT_EQ(bounds4.center(), float2(-0.5f, -0.5f)); -} - -TEST(bounds, Size) -{ - Bounds bounds1(float2(0.0f)); - Bounds bounds2(float2(-1.0f)); - Bounds bounds3(float2(-3.0f, -5.0f), float2(2.0f, 4.0f)); - EXPECT_EQ(bounds1.size(), float2(0.0f)); - EXPECT_EQ(bounds2.size(), float2(0.0f)); - EXPECT_EQ(bounds3.size(), float2(5.0f, 9.0f)); -} - -TEST(bounds, Translate) -{ - Bounds bounds1(float2(0.0f)); - Bounds bounds2(float2(-3.0f, -5.0f), float2(2.0f, 4.0f)); - bounds1.translate(float2(-1.0f)); - bounds2.translate(float2(2.0f)); - EXPECT_EQ(bounds1.min, float2(-1.0f)); - EXPECT_EQ(bounds1.max, float2(-1.0f)); - EXPECT_EQ(bounds2.min, float2(-1.0f, -3.0f)); - EXPECT_EQ(bounds2.max, float2(4.0f, 6.0f)); -} - -TEST(bounds, ScaleFromCenter) -{ - Bounds bounds1(float2(0.0f)); - Bounds bounds2(float2(-3.0f, -5.0f), float2(2.0f, 4.0f)); - bounds1.scale_from_center(float2(2.0f)); - const float2 bound2_size = bounds2.size(); - bounds2.scale_from_center(float2(2.0f, 1.0f)); - EXPECT_EQ(bounds1.min, float2(0.0f)); - EXPECT_EQ(bounds1.max, float2(0.0f)); - EXPECT_EQ(bounds2.min, float2(-5.5f, -5.0f)); - EXPECT_EQ(bounds2.max, float2(4.5f, 4.0f)); - EXPECT_EQ(bounds2.size(), bound2_size * float2(2.0f, 1.0f)); -} - -TEST(bounds, Resize) -{ - Bounds bounds1(float2(0.0f)); - Bounds bounds2(float2(-3.0f, -5.0f), float2(2.0f, 4.0f)); - bounds1.resize(float2(1.0f)); - bounds2.resize(float2(7.0f, 10.0f)); - EXPECT_EQ(bounds1.center(), float2(0.0f)); - EXPECT_EQ(bounds1.size(), float2(1.0f)); - EXPECT_EQ(bounds2.size(), float2(7.0f, 10.0f)); -} - -TEST(bounds, Recenter) -{ - Bounds bounds1(float2(0.0f)); - Bounds bounds2(float2(-3.0f, -5.0f), float2(2.0f, 4.0f)); - bounds1.recenter(float2(-1.0f)); - bounds2.recenter(float2(2.0f, 3.0f)); - EXPECT_EQ(bounds1.center(), float2(-1.0f)); - EXPECT_EQ(bounds2.center(), float2(2.0f, 3.0f)); -} - -TEST(bounds, Pad) -{ - Bounds bounds1(float2(0.0f)); - Bounds bounds2(float2(-1.0f), float2(1.0f)); - Bounds bounds3(float2(-3.0f, -5.0f), float2(2.0f, 4.0f)); - bounds1.pad(float2(1.0f)); - bounds2.pad(1.0f); - bounds3.pad(float2(1.0f, 2.0f)); - EXPECT_EQ(bounds1.min, float2(-1.0f)); - EXPECT_EQ(bounds1.max, float2(1.0f)); - EXPECT_EQ(bounds2.min, float2(-2.0f)); - EXPECT_EQ(bounds2.max, float2(2.0f)); - EXPECT_EQ(bounds3.min, float2(-4.0f, -7.0f)); - EXPECT_EQ(bounds3.max, float2(3.0f, 6.0f)); -} - -TEST(bounds, MinMaxEmpty) { Span empty_span{}; EXPECT_TRUE(empty_span.is_empty()); diff --git a/source/blender/blenlib/tests/BLI_convexhull_2d_test.cc b/source/blender/blenlib/tests/BLI_convexhull_2d_test.cc deleted file mode 100644 index 36f08e68736..00000000000 --- a/source/blender/blenlib/tests/BLI_convexhull_2d_test.cc +++ /dev/null @@ -1,346 +0,0 @@ -/* SPDX-FileCopyrightText: 2024 Blender Authors - * - * SPDX-License-Identifier: Apache-2.0 */ - -/** \file - * Test that convex hull calculation and fitting convex hulls - * to a bounding box is working properly. - * - * \note Bounding box fitting checks compare against exact values. - * In this case there are multiple correct angles since both - * 45 degrees & -45 degrees will give the desired outcome. - * Keep using exact value matches so any changes to the return values are detected. - * If this becomes a problem for maintaining tests then values could be normalized for comparison. - */ - -#include "testing/testing.h" - -#include "BLI_array.hh" -#include "BLI_convexhull_2d.h" -#include "BLI_math_angle_types.hh" -#include "BLI_math_geom.h" -#include "BLI_math_matrix.h" -#include "BLI_math_matrix_types.hh" -#include "BLI_math_rotation.hh" -#include "BLI_math_vector.h" -#include "BLI_math_vector.hh" -#include "BLI_math_vector_types.hh" -#include "BLI_rand.hh" - -using namespace blender; - -/** - * Increase to a large number (8k or so) to test many permutations, - * too slow for regular tests. - */ -#define DEFAULT_TEST_ITER 8 - -/** The size of a polygon when generating data. */ -#define DEFAULT_TEST_POLY_NUM 12 - -#define DEFAULT_TEST_RANDOM_SEED 123 - -/** The epsilon to use when comparing floating point rotations (as radians). */ -#define ROTATION_EPS 1e-6 - -/* -------------------------------------------------------------------- */ -/** \name Internal Utilities - * \{ */ - -static blender::Array convexhull_points_from_map(blender::Span points, - blender::Span points_map) -{ - blender::Array points_hull(points_map.size()); - int index = 0; - for (int p_index : points_map) { - points_hull[index++] = points[p_index]; - } - return points_hull; -} - -static blender::Array convexhull_2d_as_array(blender::Span points) -{ - blender::Array points_hull_map(points.size()); - int points_hull_map_num = BLI_convexhull_2d( - reinterpret_cast(points.data()), points.size(), points_hull_map.data()); - - blender::Span points_hull_map_span(points_hull_map.data(), points_hull_map_num); - return convexhull_points_from_map(points, points_hull_map_span); -} - -/** \} */ - -/* -------------------------------------------------------------------- */ -/** \name Wrap Public API's - * \{ */ - -static float convexhull_2d_aabb_fit_points_2d(blender::Span points) -{ - return BLI_convexhull_aabb_fit_points_2d(reinterpret_cast(points.data()), - points.size()); -} - -/** \} */ - -/* -------------------------------------------------------------------- */ -/** \name Tests - * \{ */ - -TEST(convexhull_2d, IsConvex) -{ - blender::Array points(DEFAULT_TEST_POLY_NUM); - RandomNumberGenerator rng = RandomNumberGenerator(DEFAULT_TEST_RANDOM_SEED); - for (int iter = 0; iter < DEFAULT_TEST_ITER; iter++) { - for (float2 &p : points) { - p = float2(rng.get_float(), rng.get_float()); - } - blender::Array points_hull = convexhull_2d_as_array(points); - if (UNLIKELY(points_hull.size() < 3)) { - continue; - } - - int i_prev = points_hull.size() - 2; - int i_curr = points_hull.size() - 1; - for (int i_next = 0; i_next < points_hull.size(); i_prev = i_curr, i_curr = i_next++) { - EXPECT_GE(cross_tri_v2(points_hull[i_prev], points_hull[i_curr], points_hull[i_next]), 0.0f); - } - } -} - -TEST(convexhull_2d, IsCCW) -{ - blender::Array points(DEFAULT_TEST_POLY_NUM); - RandomNumberGenerator rng = RandomNumberGenerator(DEFAULT_TEST_RANDOM_SEED); - for (int iter = 0; iter < DEFAULT_TEST_ITER; iter++) { - for (float2 &p : points) { - p = float2(rng.get_float(), rng.get_float()); - } - blender::Array points_hull = convexhull_2d_as_array(points); - - EXPECT_GE( - cross_poly_v2(reinterpret_cast(points_hull.data()), points_hull.size()), - 0.0f); - } -} - -TEST(convexhull_2d, NOP) -{ - { /* Single point. */ - blender::Array points = {{0.0f, 0.0f}}; - EXPECT_NEAR(convexhull_2d_aabb_fit_points_2d(points), 0.0f, ROTATION_EPS); - } - - { /* Single point, 2x duplicates. */ - blender::Array points = {{0.0f, 0.0f}, {0.0f, 0.0f}}; - EXPECT_NEAR(convexhull_2d_aabb_fit_points_2d(points), 0.0f, ROTATION_EPS); - } - { /* Single point, 3x duplicates. */ - blender::Array points = {{0.0f, 0.0f}, {0.0f, 0.0f}, {0.0f, 0.0f}}; - EXPECT_NEAR(convexhull_2d_aabb_fit_points_2d(points), 0.0f, ROTATION_EPS); - } -} - -TEST(convexhull_2d, Lines_AxisAligned) -{ - { /* Horizontal line (2 points). */ - for (int sign_x = -1; sign_x <= 2; sign_x += 2) { - blender::Array points = {{0.0f, 0.0f}, {1.0f * sign_x, 0.0}}; - EXPECT_NEAR(convexhull_2d_aabb_fit_points_2d(points), - float(math::AngleRadian::from_degree(-90.0f)), - ROTATION_EPS); - } - } - { /* Horizontal line (3 points). */ - for (int sign_x = -1; sign_x <= 2; sign_x += 2) { - blender::Array points = {{0.0f, 0.0f}, {1.0f * sign_x, 0.0}, {2.0f * sign_x, 0.0}}; - EXPECT_NEAR(convexhull_2d_aabb_fit_points_2d(points), - float(math::AngleRadian::from_degree(-90.0f)), - ROTATION_EPS); - } - } - - { /* Vertical line (2 points). */ - for (int sign_y = -1; sign_y <= 2; sign_y += 2) { - blender::Array points = {{0.0f, 0.0f}, {0.0f, 1.0f * sign_y}}; - EXPECT_NEAR(convexhull_2d_aabb_fit_points_2d(points), - float(math::AngleRadian::from_degree(180.0f)), - ROTATION_EPS); - } - } - { /* Vertical line (3 points). */ - for (int sign_y = -1; sign_y <= 2; sign_y += 2) { - blender::Array points = {{0.0f, 0.0f}, {0.0f, 1.0f * sign_y}, {0.0f, 2.0f * sign_y}}; - EXPECT_NEAR(convexhull_2d_aabb_fit_points_2d(points), - float(math::AngleRadian::from_degree(180.0f)), - ROTATION_EPS); - } - } - - { /* Horizontal line (many points). */ - blender::Array points(8); - RandomNumberGenerator rng = RandomNumberGenerator(DEFAULT_TEST_RANDOM_SEED); - for (int iter = 0; iter < DEFAULT_TEST_ITER; iter++) { - /* Add points, Y is always positive. */ - for (float2 &p : points) { - p = rng.get_unit_float2(); - p[0] = 0.0; - } - - EXPECT_NEAR(convexhull_2d_aabb_fit_points_2d(points), M_PI, ROTATION_EPS); - } - } - - { /* Vertical line (many points). */ - blender::Array points(8); - RandomNumberGenerator rng = RandomNumberGenerator(DEFAULT_TEST_RANDOM_SEED); - for (int iter = 0; iter < DEFAULT_TEST_ITER; iter++) { - /* Add points, Y is always positive. */ - for (float2 &p : points) { - p = rng.get_unit_float2(); - p[0] = 0.0; - } - - blender::Array points_hull = convexhull_2d_as_array(points); - EXPECT_NEAR(convexhull_2d_aabb_fit_points_2d(points_hull), M_PI, ROTATION_EPS); - } - } -} - -TEST(convexhull_2d, Lines_Diagonal) -{ - { /* Diagonal line (2 points). */ - const float expected[4] = {-135, 135, 135, -135}; - int index = 0; - for (int sign_x = -1; sign_x <= 2; sign_x += 2) { - for (int sign_y = -1; sign_y <= 2; sign_y += 2) { - blender::Array points = {{0.0f, 0.0f}, {1.0f * sign_x, 1.0f * sign_y}}; - EXPECT_NEAR(convexhull_2d_aabb_fit_points_2d(points), - float(math::AngleRadian::from_degree(expected[index])), - ROTATION_EPS); - index++; - } - } - } - - { /* Diagonal line (3 points). */ - const float expected[4] = {-135, 135, 135, -135}; - int index = 0; - for (int sign_x = -1; sign_x <= 2; sign_x += 2) { - for (int sign_y = -1; sign_y <= 2; sign_y += 2) { - blender::Array points = { - {0.0f, 0.0f}, - {1.0f * sign_x, 1.0f * sign_y}, - {2.0f * sign_x, 2.0f * sign_y}, - }; - EXPECT_NEAR(convexhull_2d_aabb_fit_points_2d(points), - float(math::AngleRadian::from_degree(expected[index])), - ROTATION_EPS); - index++; - } - } - } -} - -TEST(convexhull_2d, Simple) -{ - { /* 45degree rotated square. */ - blender::Array points = { - {0.0f, -1.0f}, - {-1.0f, 0.0f}, - {0.0f, 1.0f}, - {1.0f, 0.0f}, - }; - EXPECT_NEAR(convexhull_2d_aabb_fit_points_2d(points), - float(math::AngleRadian::from_degree(135.0f)), - ROTATION_EPS); - } - - { /* Axis aligned square. */ - blender::Array points = { - {-1.0f, -1.0f}, - {-1.0f, 1.0f}, - {1.0f, 1.0f}, - {1.0f, -1.0f}, - }; - EXPECT_NEAR(convexhull_2d_aabb_fit_points_2d(points), - float(math::AngleRadian::from_degree(180.0f)), - ROTATION_EPS); - } -} - -/** - * Generate complex rotated/translated shapes with a known size. - * Check the rotation returned by #BLI_convexhull_aabb_fit_points_2d - * rotates the points into a bounding box with an area no larger than generated size. - */ -TEST(convexhull_2d, Complex) -{ - auto shape_generate_fn = [](RandomNumberGenerator &rng, - const float2 &size, - const int points_num) -> blender::Array { - /* Avoid zero area boxes. */ - blender::Array points(points_num); - const int points_num_reserved = 4; - BLI_assert(points_num_reserved >= 4); - - /* Ensure there are always points at the bounds. */ - points[0] = {0.0f, rng.get_float()}; /* Left. */ - points[1] = {1.0f, rng.get_float()}; /* Right. */ - points[2] = {rng.get_float(), 0.0f}; /* Bottom. */ - points[3] = {rng.get_float(), 1.0f}; /* Top. */ - - for (int i = points_num_reserved; i < points_num; i++) { - points[i] = {rng.get_float(), rng.get_float()}; - } - - /* Shuffle to ensure the solution is valid no matter the order of the input, - * Only the first `points_num_reserved` matter as remaining points are random. */ - for (int i = 0; i < points_num_reserved; i++) { - std::swap(points[i], points[rng.get_int32(points_num)]); - } - - /* Map from 0-1 to a random transformation. */ - const float2 translation = { - (rng.get_float() * 2.0f) - 1.0f, - (rng.get_float() * 2.0f) - 1.0f, - }; - - const float2x2 rot_mat = math::from_rotation( - math::AngleRadian(rng.get_float() * M_PI)); - for (float2 &p : points) { - BLI_assert(p[0] >= 0.0 && p[0] <= 1.0f); - BLI_assert(p[1] >= 0.0 && p[1] <= 1.0f); - /* Center from [-0.5..0.5], apply size, rotate & translate. */ - p = (((p - float2(0.5f, 0.5f)) * size) * rot_mat) + translation; - } - - return points; - }; - - RandomNumberGenerator rng = RandomNumberGenerator(DEFAULT_TEST_RANDOM_SEED); - for (int i = 0; i < DEFAULT_TEST_ITER; i++) { - constexpr float size_margin = 0.1; - /* Random size from `[size_margin..2]`. */ - float2 size = { - math::min((rng.get_float() * 2.0f) + size_margin, 2.0f), - math::min((rng.get_float() * 2.0f) + size_margin, 2.0f), - }; - - blender::Array points = shape_generate_fn(rng, size, DEFAULT_TEST_POLY_NUM); - const float angle = convexhull_2d_aabb_fit_points_2d(points); - - const float2x2 rot_mat = math::from_rotation(-angle); - float2 tempmin, tempmax; - INIT_MINMAX2(tempmin, tempmax); - for (const float2 &p : points) { - math::min_max(p * rot_mat, tempmin, tempmax); - } - - const float2 size_result = tempmax - tempmin; - float area_input = size[0] * size[1]; - float area_result = size_result[0] * size_result[1]; - EXPECT_LE(area_result, area_input + 1e-6f); - } -} - -/** \} */ diff --git a/source/blender/blenlib/tests/BLI_delaunay_2d_test.cc b/source/blender/blenlib/tests/BLI_delaunay_2d_test.cc index f1a67cb1030..5e4cf2fd167 100644 --- a/source/blender/blenlib/tests/BLI_delaunay_2d_test.cc +++ b/source/blender/blenlib/tests/BLI_delaunay_2d_test.cc @@ -95,7 +95,7 @@ template CDT_input fill_input_from_string(const char *spec) /* Find an original index in a table mapping new to original. * Return -1 if not found. */ -static int get_orig_index(const Span> out_to_orig, int orig_index) +static int get_orig_index(const Array> &out_to_orig, int orig_index) { int n = int(out_to_orig.size()); for (int i = 0; i < n; ++i) { @@ -264,9 +264,9 @@ static bool draw_append = false; /* Will be set to true after first call. */ template void graph_draw(const std::string &label, - const Span> verts, - const Span> edges, - const Span> faces) + const Array> &verts, + const Array> &edges, + const Array> &faces) { /* Would like to use BKE_tempdir_base() here, but that brings in dependence on kernel library. * This is just for developer debugging anyway, and should never be called in production Blender. @@ -1877,9 +1877,9 @@ void text_test( } in.epsilon = b_before_arcs_in.epsilon; in.need_ids = need_ids; - double tstart = BLI_time_now_seconds(); + double tstart = BLI_check_seconds_timer(); CDT_result out = delaunay_2d_calc(in, otype); - double tend = BLI_time_now_seconds(); + double tend = BLI_check_seconds_timer(); if (print_timing) { std::cout << "time = " << tend - tstart << "\n"; } @@ -2190,10 +2190,10 @@ void rand_delaunay_test(int test_kind, } /* Run the test. */ - double tstart = BLI_time_now_seconds(); + double tstart = BLI_check_seconds_timer(); CDT_result out = delaunay_2d_calc(in, otype); EXPECT_NE(out.vert.size(), 0); - times[lg_size] += BLI_time_now_seconds() - tstart; + times[lg_size] += BLI_check_seconds_timer() - tstart; if (DO_DRAW) { graph_draw(test_label, out.vert, out.edge, out.face); } diff --git a/source/blender/blenlib/tests/BLI_disjoint_set_test.cc b/source/blender/blenlib/tests/BLI_disjoint_set_test.cc index 93e0b2e907d..2de71465530 100644 --- a/source/blender/blenlib/tests/BLI_disjoint_set_test.cc +++ b/source/blender/blenlib/tests/BLI_disjoint_set_test.cc @@ -2,11 +2,10 @@ * * SPDX-License-Identifier: Apache-2.0 */ -#include "testing/testing.h" - #include "BLI_disjoint_set.hh" +#include "BLI_strict_flags.h" -#include "BLI_strict_flags.h" /* Keep last. */ +#include "testing/testing.h" namespace blender::tests { diff --git a/source/blender/blenlib/tests/BLI_index_mask_expression_test.cc b/source/blender/blenlib/tests/BLI_index_mask_expression_test.cc deleted file mode 100644 index d8cb53117f9..00000000000 --- a/source/blender/blenlib/tests/BLI_index_mask_expression_test.cc +++ /dev/null @@ -1,269 +0,0 @@ -/* SPDX-FileCopyrightText: 2024 Blender Authors - * - * SPDX-License-Identifier: Apache-2.0 */ - -#include "BLI_array.hh" -#include "BLI_index_mask_expression.hh" -#include "BLI_rand.hh" -#include "BLI_set.hh" -#include "BLI_strict_flags.h" -#include "BLI_timeit.hh" - -#include "testing/testing.h" - -namespace blender::index_mask::tests { - -TEST(index_mask_expression, Union) -{ - IndexMaskMemory memory; - const IndexMask mask_a = IndexMask::from_initializers({5, IndexRange(50, 100), 100'000}, memory); - const IndexMask mask_b = IndexMask::from_initializers({IndexRange(10, 10), 60, 200}, memory); - - ExprBuilder builder; - const Expr &expr = builder.merge({&mask_a, &mask_b}); - const IndexMask union_mask = evaluate_expression(expr, memory); - - EXPECT_EQ(union_mask, - IndexMask::from_initializers( - {5, IndexRange(10, 10), IndexRange(50, 100), 200, 100'000}, memory)); -} - -TEST(index_mask_expression, UnionMulti) -{ - IndexMaskMemory memory; - const IndexMask mask_a = IndexMask::from_initializers({3, 5, 6, 8, 9}, memory); - const IndexMask mask_b = IndexMask::from_initializers({4, 6, 7, 12}, memory); - const IndexMask mask_c = IndexMask::from_initializers({0, 5}, memory); - const IndexMask mask_d = IndexMask::from_initializers({6, 7, 10}, memory); - - ExprBuilder builder; - const Expr &expr = builder.merge({&mask_a, &mask_b, &mask_c, &mask_d}); - const IndexMask union_mask = evaluate_expression(expr, memory); - - EXPECT_EQ(union_mask, IndexMask::from_initializers({0, 3, 4, 5, 6, 7, 8, 9, 10, 12}, memory)); -} - -TEST(index_mask_expression, IntersectMulti) -{ - IndexMaskMemory memory; - const IndexMask mask_a = IndexMask::from_initializers({3, 5, 6, 8, 9}, memory); - const IndexMask mask_b = IndexMask::from_initializers({2, 5, 6, 10}, memory); - const IndexMask mask_c = IndexMask::from_initializers({4, 5, 6}, memory); - const IndexMask mask_d = IndexMask::from_initializers({1, 5, 10}, memory); - - ExprBuilder builder; - const Expr &expr = builder.intersect({&mask_a, &mask_b, &mask_c, &mask_d}); - const IndexMask intersect_mask = evaluate_expression(expr, memory); - - EXPECT_EQ(intersect_mask, IndexMask::from_initializers({5}, memory)); -} - -TEST(index_mask_expression, DifferenceMulti) -{ - IndexMaskMemory memory; - const IndexMask mask_a = IndexMask::from_initializers({1, 2, 3, 5, 6, 7, 9, 10}, memory); - const IndexMask mask_b = IndexMask::from_initializers({2, 5, 6, 10}, memory); - const IndexMask mask_c = IndexMask::from_initializers({4, 5, 6}, memory); - const IndexMask mask_d = IndexMask::from_initializers({1, 5, 10}, memory); - - ExprBuilder builder; - const Expr &expr = builder.subtract(&mask_a, {&mask_b, &mask_c, &mask_d}); - const IndexMask difference_mask = evaluate_expression(expr, memory); - - EXPECT_EQ(difference_mask, IndexMask::from_initializers({3, 7, 9}, memory)); -} - -TEST(index_mask_expression, Intersection) -{ - IndexMaskMemory memory; - const IndexMask mask_a = IndexMask::from_initializers({5, IndexRange(50, 100), 100'000}, memory); - const IndexMask mask_b = IndexMask::from_initializers( - {5, 6, IndexRange(100, 100), 80000, 100'000}, memory); - - ExprBuilder builder; - const Expr &expr = builder.intersect({&mask_a, &mask_b}); - const IndexMask intersection_mask = evaluate_expression(expr, memory); - - EXPECT_EQ(intersection_mask, - IndexMask::from_initializers({5, IndexRange(100, 50), 100'000}, memory)); -} - -TEST(index_mask_expression, Difference) -{ - IndexMaskMemory memory; - const IndexMask mask_a = IndexMask::from_initializers({5, IndexRange(50, 100), 100'000}, memory); - const IndexMask mask_b = IndexMask::from_initializers({5, 60, IndexRange(100, 20)}, memory); - - ExprBuilder builder; - const Expr &expr = builder.subtract(&mask_a, {&mask_b}); - const IndexMask difference_mask = evaluate_expression(expr, memory); - - EXPECT_EQ(difference_mask, - IndexMask::from_initializers( - {IndexRange(50, 10), IndexRange(61, 39), IndexRange(120, 30), 100'000}, memory)); -} - -TEST(index_mask_expression, FizzBuzz) -{ - IndexMaskMemory memory; - const IndexMask mask_3 = IndexMask::from_every_nth(3, 11, 0, memory); /* 0 - 30 */ - const IndexMask mask_5 = IndexMask::from_every_nth(5, 11, 0, memory); /* 0 - 50 */ - - { - ExprBuilder builder; - const Expr &expr = builder.merge({&mask_3, &mask_5}); - const IndexMask result = evaluate_expression(expr, memory); - EXPECT_EQ( - result, - IndexMask::from_initializers( - {0, 3, 5, 6, 9, 10, 12, 15, 18, 20, 21, 24, 25, 27, 30, 35, 40, 45, 50}, memory)); - } - { - ExprBuilder builder; - const Expr &expr = builder.intersect({&mask_3, &mask_5}); - const IndexMask result = evaluate_expression(expr, memory); - EXPECT_EQ(result, IndexMask::from_initializers({0, 15, 30}, memory)); - } - { - ExprBuilder builder; - const Expr &expr = builder.subtract(&mask_3, {&mask_5}); - const IndexMask result = evaluate_expression(expr, memory); - EXPECT_EQ(result, IndexMask::from_initializers({3, 6, 9, 12, 18, 21, 24, 27}, memory)); - } - { - ExprBuilder builder; - const Expr &expr = builder.merge( - {&builder.intersect({&mask_3, &mask_5}), &builder.subtract(&mask_3, {&mask_5})}); - const IndexMask &result = evaluate_expression(expr, memory); - EXPECT_EQ(result, - IndexMask::from_initializers({0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30}, memory)); - } -} - -TEST(index_mask_expression, UnionToFullRange) -{ - IndexMaskMemory memory; - const IndexMask mask_1 = IndexMask::from_initializers({2, 4, 5, 7}, memory); - const IndexMask mask_2 = IndexMask::from_initializers({6, 8}, memory); - const IndexMask mask_3 = IndexMask::from_initializers({1, 3}, memory); - - ExprBuilder builder; - const Expr &expr = builder.merge({&mask_1, &mask_2, &mask_3}); - const IndexMask result = evaluate_expression(expr, memory); - EXPECT_TRUE(result.to_range().has_value()); - EXPECT_EQ(*result.to_range(), IndexRange::from_begin_end_inclusive(1, 8)); - EXPECT_EQ(result.segments_num(), 1); -} - -TEST(index_mask_expression, UnionIndividualIndices) -{ - IndexMaskMemory memory; - const IndexMask mask_1 = IndexMask::from_initializers({3}, memory); - const IndexMask mask_2 = IndexMask::from_initializers({6}, memory); - const IndexMask mask_3 = IndexMask::from_initializers({5}, memory); - - ExprBuilder builder; - const Expr &expr = builder.merge({&mask_1, &mask_2, &mask_3}); - const IndexMask result = evaluate_expression(expr, memory); - EXPECT_EQ(result, IndexMask::from_initializers({3, 5, 6}, memory)); - EXPECT_EQ(result.segments_num(), 1); -} - -TEST(index_mask_expression, UnionLargeRanges) -{ - IndexMaskMemory memory; - const IndexMask mask_a(IndexRange(0, 1'000'000)); - const IndexMask mask_b(IndexRange(900'000, 1'100'000)); - - ExprBuilder builder; - const Expr &expr = builder.merge({&mask_a, &mask_b}); - const IndexMask result_mask = evaluate_expression(expr, memory); - - EXPECT_EQ(result_mask, IndexMask(IndexRange(0, 2'000'000))); -} - -TEST(index_mask_expression, SubtractSmall) -{ - IndexMaskMemory memory; - const IndexMask mask_a = IndexMask::from_initializers({3, 4, 5, 6, 7, 8, 9}, memory); - const IndexMask mask_b = IndexMask::from_initializers({5, 7}, memory); - const IndexMask mask_c = IndexMask::from_initializers({8}, memory); - - ExprBuilder builder; - const Expr &expr = builder.subtract(&mask_a, {&mask_b, &mask_c}); - const IndexMask result = evaluate_expression(expr, memory); - - EXPECT_EQ(result, IndexMask::from_initializers({3, 4, 6, 9}, memory)); - EXPECT_EQ(result.segments_num(), 1); -} - -TEST(index_mask_expression, RangeTerms) -{ - IndexMaskMemory memory; - ExprBuilder builder; - - const IndexRange range_a = IndexRange::from_begin_end(30'000, 50'000); - const IndexRange range_b = IndexRange::from_begin_end(40'000, 100'000); - const IndexRange range_c = IndexRange::from_begin_end(45'000, 48'000); - - const Expr &expr = builder.subtract(&builder.merge({range_a, range_b}), {range_c}); - const IndexMask result_mask = evaluate_expression(expr, memory); - - EXPECT_EQ(result_mask, - IndexMask::from_initializers({IndexRange::from_begin_end(30'000, 45'000), - IndexRange::from_begin_end(48'000, 100'000)}, - memory)); -} - -TEST(index_mask_expression, SingleMask) -{ - IndexMaskMemory memory; - const IndexMask mask = IndexMask::from_initializers({5, 6, 8, 9}, memory); - - ExprBuilder builder; - const Expr &expr = builder.merge({&mask}); - const IndexMask result = evaluate_expression(expr, memory); - - EXPECT_EQ(result, mask); -} - -TEST(index_mask_expression, SubtractSelf) -{ - IndexMaskMemory memory; - const IndexMask mask = IndexMask ::from_initializers({6, 8, 10, 100}, memory); - - ExprBuilder builder; - const Expr &expr = builder.subtract(&mask, {&mask}); - const IndexMask result = evaluate_expression(expr, memory); - - EXPECT_TRUE(result.is_empty()); -} - -/* Disable benchmark by default. */ -#if 0 -TEST(index_mask_expression, Benchmark) -{ -# ifdef NDEBUG - const int64_t iterations = 100; -# else - const int64_t iterations = 1; -# endif - - for ([[maybe_unused]] const int64_t _1 : IndexRange(5)) { - IndexMaskMemory m; - const IndexMask a = IndexMask::from_every_nth(3, 1'000'000, 0, m); - const IndexMask b = IndexMask::from_every_nth(100, 5'000, 0, m); - ExprBuilder builder; - const Expr &expr = builder.merge({&a, &b}); - - SCOPED_TIMER("benchmark"); - for ([[maybe_unused]] const int64_t _2 : IndexRange(iterations)) { - IndexMaskMemory memory; - const IndexMask result = evaluate_expression(expr, memory); - UNUSED_VARS(result); - } - } -} -#endif - -} // namespace blender::index_mask::tests diff --git a/source/blender/blenlib/tests/BLI_index_mask_test.cc b/source/blender/blenlib/tests/BLI_index_mask_test.cc index 54f3ae48ff1..d3d2fa073f3 100644 --- a/source/blender/blenlib/tests/BLI_index_mask_test.cc +++ b/source/blender/blenlib/tests/BLI_index_mask_test.cc @@ -2,15 +2,14 @@ * * SPDX-License-Identifier: Apache-2.0 */ -#include "testing/testing.h" - #include "BLI_array.hh" #include "BLI_index_mask.hh" #include "BLI_rand.hh" #include "BLI_set.hh" +#include "BLI_strict_flags.h" #include "BLI_timeit.hh" -#include "BLI_strict_flags.h" /* Keep last. */ +#include "testing/testing.h" namespace blender::index_mask::tests { @@ -24,7 +23,6 @@ TEST(index_mask, IndicesToMask) EXPECT_EQ(mask.first(), 5); EXPECT_EQ(mask.last(), 101000); EXPECT_EQ(mask.min_array_size(), 101001); - EXPECT_EQ(mask.bounds(), IndexRange::from_begin_end_inclusive(5, 101000)); } TEST(index_mask, FromBits) @@ -53,7 +51,6 @@ TEST(index_mask, FromSize) EXPECT_EQ(mask.first(), 0); EXPECT_EQ(mask.last(), 4); EXPECT_EQ(mask.min_array_size(), 5); - EXPECT_EQ(mask.bounds(), IndexRange(5)); } { const IndexMask mask(max_segment_size); @@ -64,7 +61,6 @@ TEST(index_mask, FromSize) EXPECT_EQ(mask.first(), 0); EXPECT_EQ(mask.last(), max_segment_size - 1); EXPECT_EQ(mask.min_array_size(), max_segment_size); - EXPECT_EQ(mask.bounds(), IndexRange(max_segment_size)); } } @@ -109,7 +105,6 @@ TEST(index_mask, DefaultConstructor) IndexMask mask; EXPECT_EQ(mask.size(), 0); EXPECT_EQ(mask.min_array_size(), 0); - EXPECT_EQ(mask.bounds(), IndexRange()); } TEST(index_mask, ForeachRange) @@ -458,398 +453,4 @@ TEST(index_mask, SliceContent) } } -TEST(index_mask, EqualsRangeSelf) -{ - IndexMask mask = IndexRange(16384); - EXPECT_EQ(mask, mask); -} - -TEST(index_mask, EqualsRange) -{ - IndexMask mask_a = IndexRange(16384); - IndexMask mask_b = IndexRange(16384); - EXPECT_EQ(mask_a, mask_b); -} - -TEST(index_mask, EqualsRangeLarge) -{ - IndexMask mask_a = IndexRange(96384); - IndexMask mask_b = IndexRange(96384); - EXPECT_EQ(mask_a, mask_b); -} - -TEST(index_mask, EqualsRangeBegin) -{ - IndexMask mask_a = IndexRange(102, 16384 - 102); - IndexMask mask_b = IndexRange(102, 16384 - 102); - EXPECT_EQ(mask_a, mask_b); -} - -TEST(index_mask, EqualsRangeEnd) -{ - IndexMask mask_a = IndexRange(16384 + 1); - IndexMask mask_b = IndexRange(16384 + 1); - EXPECT_EQ(mask_a, mask_b); -} - -TEST(index_mask, NonEqualsRange) -{ - IndexMask mask_a = IndexRange(16384); - IndexMask mask_b = IndexRange(1, 16384); - EXPECT_NE(mask_a, mask_b); -} - -TEST(index_mask, EqualsSelf) -{ - IndexMaskMemory memory; - IndexMask mask = IndexMask::from_union(IndexRange(16384), IndexRange(16384 * 3, 533), memory); - EXPECT_EQ(mask, mask); -} - -TEST(index_mask, Equals) -{ - IndexMaskMemory memory; - IndexMask mask_a = IndexMask::from_union(IndexRange(16384), IndexRange(16384 * 3, 533), memory); - IndexMask mask_b = IndexMask::from_union(IndexRange(16384), IndexRange(16384 * 3, 533), memory); - EXPECT_EQ(mask_a, mask_b); -} - -TEST(index_mask, NonEquals) -{ - IndexMaskMemory memory; - IndexMask mask_a = IndexMask::from_union(IndexRange(16384), IndexRange(16384 * 3, 533), memory); - IndexMask mask_b = IndexMask::from_union( - IndexRange(55, 16384), IndexRange(16384 * 5, 533), memory); - EXPECT_NE(mask_a, mask_b); -} - -TEST(index_mask, NotEqualsRangeAndIndices) -{ - IndexMaskMemory memory; - IndexMask mask_a = IndexMask::from_union( - IndexRange(2040), IndexMask::from_indices({2072, 2073, 2075}, memory), memory); - IndexMask mask_b = IndexMask::from_union( - IndexRange(2040), IndexMask::from_indices({2072, 2073 + 1, 2075}, memory), memory); - - EXPECT_NE(mask_a, mask_b); -} - -static bool mask_segments_equals(const IndexMaskSegment &a, const IndexMaskSegment &b) -{ - if (a.size() != b.size()) { - return false; - } - for (const int64_t i : a.index_range()) { - if (a[i] != b[i]) { - return false; - } - } - return true; -} - -TEST(index_mask, ZippedForeachSelf) -{ - IndexMaskMemory memory; - IndexMask mask = IndexMask::from_initializers({IndexRange(500), 555, 699, 222, 900, 100}, - memory); - { - int calls_num = 0; - IndexMask::foreach_segment_zipped({mask}, [&](Span segments) { - EXPECT_FALSE(segments.is_empty()); - calls_num++; - return true; - }); - EXPECT_EQ(calls_num, 2); - } - - { - int calls_num = 0; - IndexMask::foreach_segment_zipped({mask, mask}, [&](Span segments) { - EXPECT_FALSE(segments.is_empty()); - EXPECT_TRUE(mask_segments_equals(segments[0], segments[1])); - calls_num++; - return true; - }); - EXPECT_EQ(calls_num, 2); - } - - { - int calls_num = 0; - IndexMask::foreach_segment_zipped({mask, mask, mask}, [&](Span segments) { - EXPECT_FALSE(segments.is_empty()); - EXPECT_TRUE(mask_segments_equals(segments[0], segments[1])); - EXPECT_TRUE(mask_segments_equals(segments[0], segments[2])); - calls_num++; - return true; - }); - EXPECT_EQ(calls_num, 2); - } - - { - int calls_num = 0; - IndexMask::foreach_segment_zipped( - {mask, mask, mask, mask}, [&](Span segments) { - EXPECT_FALSE(segments.is_empty()); - EXPECT_TRUE(mask_segments_equals(segments[0], segments[1])); - EXPECT_TRUE(mask_segments_equals(segments[0], segments[2])); - EXPECT_TRUE(mask_segments_equals(segments[0], segments[3])); - calls_num++; - return true; - }); - EXPECT_EQ(calls_num, 2); - } -} - -TEST(index_mask, ZippedForeachSameSegments) -{ - IndexMaskMemory memory; - IndexMask mask_a = IndexMask::from_initializers({0, 1, 2}, memory); - IndexMask mask_b = IndexMask::from_initializers({3, 4, 5}, memory); - IndexMask mask_c = IndexMask::from_initializers({6, 7, 8}, memory); - { - int calls_num = 0; - IndexMask::foreach_segment_zipped({mask_a}, [&](Span segments) { - EXPECT_FALSE(segments.is_empty()); - calls_num++; - return true; - }); - EXPECT_EQ(calls_num, 1); - } - { - int calls_num = 0; - IndexMask::foreach_segment_zipped({mask_a, mask_b}, [&](Span segments) { - EXPECT_FALSE(segments.is_empty()); - EXPECT_EQ(segments[0].size(), segments[1].size()); - EXPECT_FALSE(mask_segments_equals(segments[0], segments[1])); - calls_num++; - return true; - }); - EXPECT_EQ(calls_num, 1); - } - { - int calls_num = 0; - IndexMask::foreach_segment_zipped( - {mask_a, mask_b, mask_c}, [&](Span segments) { - EXPECT_FALSE(segments.is_empty()); - EXPECT_EQ(segments[0].size(), segments[1].size()); - EXPECT_EQ(segments[0].size(), segments[2].size()); - EXPECT_FALSE(mask_segments_equals(segments[0], segments[1])); - EXPECT_FALSE(mask_segments_equals(segments[0], segments[2])); - EXPECT_FALSE(mask_segments_equals(segments[1], segments[2])); - calls_num++; - return true; - }); - EXPECT_EQ(calls_num, 1); - } -} - -TEST(index_mask, ZippedForeachEqual) -{ - Span indices(get_static_indices_array()); - - IndexMaskMemory memory; - IndexMask mask_a = IndexMask::from_segments( - {{0, indices.take_front(5)}, {5, indices.take_front(5)}}, memory); - IndexMask mask_b = IndexMask::from_segments( - {{0, indices.take_front(3)}, {3, indices.take_front(4)}, {7, indices.take_front(3)}}, - memory); - IndexMask mask_c = IndexMask::from_segments({{0, indices.take_front(10)}}, memory); - - int index = 0; - Array reference_segments{{0, indices.take_front(3)}, - {3, indices.take_front(2)}, - {5, indices.take_front(2)}, - {7, indices.take_front(3)}}; - - IndexMask::foreach_segment_zipped( - {mask_a, mask_b, mask_c}, [&](Span segments) { - EXPECT_TRUE(mask_segments_equals(reference_segments[index], segments[0])); - EXPECT_TRUE(mask_segments_equals(reference_segments[index], segments[1])); - EXPECT_TRUE(mask_segments_equals(reference_segments[index], segments[2])); - index++; - return true; - }); - EXPECT_EQ(index, 4); -} - -TEST(index_mask, FromRepeatingEmpty) -{ - IndexMaskMemory memory; - const IndexMask mask = IndexMask::from_repeating(IndexMask(), 100, 0, 10, memory); - EXPECT_TRUE(mask.is_empty()); -} - -TEST(index_mask, FromRepeatingSingle) -{ - IndexMaskMemory memory; - const IndexMask mask = IndexMask::from_repeating(IndexMask(1), 5, 10, 2, memory); - EXPECT_EQ(mask, IndexMask::from_initializers({2, 12, 22, 32, 42}, memory)); -} - -TEST(index_mask, FromRepeatingSame) -{ - IndexMaskMemory memory; - const IndexMask mask = IndexMask::from_indices({4, 6, 7}, memory); - const IndexMask repeated_mask = IndexMask::from_repeating(mask, 1, 100, 0, memory); - EXPECT_EQ(mask, repeated_mask); -} - -TEST(index_mask, FromRepeatingMultiple) -{ - IndexMaskMemory memory; - const IndexMask mask = IndexMask::from_repeating( - IndexMask::from_indices({5, 6, 7, 50}, memory), 3, 100, 1000, memory); - EXPECT_EQ(mask[0], 1005); - EXPECT_EQ(mask[1], 1006); - EXPECT_EQ(mask[2], 1007); - EXPECT_EQ(mask[3], 1050); - EXPECT_EQ(mask[4], 1105); - EXPECT_EQ(mask[5], 1106); - EXPECT_EQ(mask[6], 1107); - EXPECT_EQ(mask[7], 1150); - EXPECT_EQ(mask[8], 1205); - EXPECT_EQ(mask[9], 1206); - EXPECT_EQ(mask[10], 1207); - EXPECT_EQ(mask[11], 1250); -} - -TEST(index_mask, FromRepeatingRangeFromSingle) -{ - IndexMaskMemory memory; - const IndexMask mask = IndexMask::from_repeating(IndexMask(IndexRange(1)), 50'000, 1, 0, memory); - EXPECT_EQ(*mask.to_range(), IndexRange(50'000)); -} - -TEST(index_mask, FromRepeatingRangeFromRange) -{ - IndexMaskMemory memory; - const IndexMask mask = IndexMask::from_repeating( - IndexMask(IndexRange(100)), 50'000, 100, 100, memory); - EXPECT_EQ(*mask.to_range(), IndexRange(100, 5'000'000)); -} - -TEST(index_mask, FromRepeatingEverySecond) -{ - IndexMaskMemory memory; - const IndexMask mask = IndexMask::from_repeating(IndexMask(1), 500'000, 2, 0, memory); - EXPECT_EQ(mask[0], 0); - EXPECT_EQ(mask[1], 2); - EXPECT_EQ(mask[2], 4); - EXPECT_EQ(mask[3], 6); - EXPECT_EQ(mask[20'000], 40'000); -} - -TEST(index_mask, FromRepeatingMultipleRanges) -{ - IndexMaskMemory memory; - const IndexMask mask = IndexMask::from_repeating( - IndexMask::from_initializers({IndexRange(0, 100), IndexRange(10'000, 100)}, memory), - 5, - 100'000, - 0, - memory); - EXPECT_EQ(mask[0], 0); - EXPECT_EQ(mask[1], 1); - EXPECT_EQ(mask[2], 2); - EXPECT_EQ(mask[100], 10'000); - EXPECT_EQ(mask[101], 10'001); - EXPECT_EQ(mask[102], 10'002); - EXPECT_EQ(mask[200], 100'000); - EXPECT_EQ(mask[201], 100'001); - EXPECT_EQ(mask[202], 100'002); - EXPECT_EQ(mask[300], 110'000); - EXPECT_EQ(mask[301], 110'001); - EXPECT_EQ(mask[302], 110'002); -} - -TEST(index_mask, FromRepeatingNoRepetitions) -{ - IndexMaskMemory memory; - const IndexMask mask = IndexMask::from_repeating(IndexMask(IndexRange(5)), 0, 100, 0, memory); - EXPECT_TRUE(mask.is_empty()); -} - -TEST(index_mask, FromEveryNth) -{ - IndexMaskMemory memory; - { - const IndexMask mask = IndexMask::from_every_nth(2, 5, 0, memory); - EXPECT_EQ(mask, IndexMask::from_initializers({0, 2, 4, 6, 8}, memory)); - } - { - const IndexMask mask = IndexMask::from_every_nth(3, 5, 100, memory); - EXPECT_EQ(mask, IndexMask::from_initializers({100, 103, 106, 109, 112}, memory)); - } - { - const IndexMask mask = IndexMask::from_every_nth(4, 5, 0, memory); - EXPECT_EQ(mask, IndexMask::from_initializers({0, 4, 8, 12, 16}, memory)); - } - { - const IndexMask mask = IndexMask::from_every_nth(10, 5, 100, memory); - EXPECT_EQ(mask, IndexMask::from_initializers({100, 110, 120, 130, 140}, memory)); - } - { - const IndexMask mask = IndexMask::from_every_nth(1, 5, 100, memory); - EXPECT_EQ(mask, IndexMask::from_initializers({100, 101, 102, 103, 104}, memory)); - } - { - const IndexMask mask = IndexMask::from_every_nth(100'000, 5, 0, memory); - EXPECT_EQ(mask, IndexMask::from_initializers({0, 100'000, 200'000, 300'000, 400'000}, memory)); - } -} - -TEST(index_mask, Shift) -{ - IndexMaskMemory memory; - { - const IndexMask mask; - const IndexMask shifted_mask = mask.shift(10, memory); - EXPECT_TRUE(shifted_mask.is_empty()); - EXPECT_EQ(mask, shifted_mask); - } - { - const IndexMask mask{IndexRange(100, 10)}; - const IndexMask shifted_mask = mask.shift(1000, memory); - EXPECT_EQ(shifted_mask.size(), 10); - EXPECT_EQ(shifted_mask[0], 1100); - EXPECT_EQ(shifted_mask[9], 1109); - } - { - const IndexMask mask = IndexMask::from_initializers({4, 6, 7, IndexRange(100, 100)}, memory); - const IndexMask shifted_mask = mask.shift(1000, memory).shift(-1000, memory); - EXPECT_EQ(mask, shifted_mask); - } - { - const IndexMask mask{IndexRange(100, 10)}; - const IndexMask shifted_mask = mask.shift(0, memory); - EXPECT_EQ(mask, shifted_mask); - } -} - -TEST(index_mask, SliceAndShift) -{ - IndexMaskMemory memory; - { - const IndexMask mask{IndexRange(100, 10)}; - const IndexMask new_mask = mask.slice_and_shift(5, 5, 1000, memory); - EXPECT_EQ(new_mask.size(), 5); - EXPECT_EQ(new_mask[0], 1105); - EXPECT_EQ(new_mask[1], 1106); - } - { - const IndexMask mask = IndexMask::from_indices({10, 100, 1'000, 10'000, 100'000}, memory); - const IndexMask new_mask = mask.slice_and_shift(IndexRange(1, 4), -100, memory); - EXPECT_EQ(new_mask.size(), 4); - EXPECT_EQ(new_mask[0], 0); - EXPECT_EQ(new_mask[1], 900); - EXPECT_EQ(new_mask[2], 9'900); - EXPECT_EQ(new_mask[3], 99'900); - } - { - const IndexMask mask = IndexMask::from_indices({10, 100}, memory); - const IndexMask new_mask = mask.slice_and_shift(1, 0, 100, memory); - EXPECT_TRUE(new_mask.is_empty()); - } -} - } // namespace blender::index_mask::tests diff --git a/source/blender/blenlib/tests/BLI_index_range_test.cc b/source/blender/blenlib/tests/BLI_index_range_test.cc index 4596fb32175..57dc9f7bb02 100644 --- a/source/blender/blenlib/tests/BLI_index_range_test.cc +++ b/source/blender/blenlib/tests/BLI_index_range_test.cc @@ -2,12 +2,10 @@ * * SPDX-License-Identifier: Apache-2.0 */ -#include "testing/testing.h" - #include "BLI_index_range.hh" +#include "BLI_strict_flags.h" #include "BLI_vector.hh" - -#include "BLI_strict_flags.h" /* Keep last. */ +#include "testing/testing.h" namespace blender::tests { @@ -23,86 +21,6 @@ TEST(index_range, DefaultConstructor) EXPECT_EQ(vector.size(), 0); } -TEST(index_range, FromBeginSize) -{ - { - const IndexRange range = IndexRange::from_begin_size(0, 0); - EXPECT_TRUE(range.is_empty()); - } - { - const IndexRange range = IndexRange::from_begin_size(0, 10); - EXPECT_EQ(range.size(), 10); - EXPECT_EQ(range.first(), 0); - } - { - const IndexRange range = IndexRange::from_begin_size(4, 10); - EXPECT_EQ(range.size(), 10); - EXPECT_EQ(range.first(), 4); - EXPECT_EQ(range.last(), 13); - } -} - -TEST(index_range, FromBeginEnd) -{ - { - const IndexRange range = IndexRange::from_begin_end(0, 0); - EXPECT_TRUE(range.is_empty()); - } - { - const IndexRange range = IndexRange::from_begin_end(0, 10); - EXPECT_EQ(range.size(), 10); - EXPECT_EQ(range.first(), 0); - } - { - const IndexRange range = IndexRange::from_begin_end(4, 10); - EXPECT_EQ(range.size(), 6); - EXPECT_EQ(range.first(), 4); - EXPECT_EQ(range.last(), 9); - } -} - -TEST(index_range, FromBeginEndInclusive) -{ - { - const IndexRange range = IndexRange::from_begin_end_inclusive(0, 0); - EXPECT_EQ(range.size(), 1); - EXPECT_EQ(range.first(), 0); - } - { - const IndexRange range = IndexRange::from_begin_end_inclusive(100, 200); - EXPECT_EQ(range.size(), 101); - EXPECT_EQ(range.first(), 100); - EXPECT_EQ(range.last(), 200); - } -} - -TEST(index_range, FromEndSize) -{ - { - const IndexRange range = IndexRange::from_end_size(0, 0); - EXPECT_TRUE(range.is_empty()); - } - { - const IndexRange range = IndexRange::from_end_size(100, 20); - EXPECT_EQ(range.first(), 80); - EXPECT_EQ(range.last(), 99); - } -} - -TEST(index_range, FromSingle) -{ - { - const IndexRange range = IndexRange::from_single(0); - EXPECT_EQ(range.size(), 1); - EXPECT_EQ(range.first(), 0); - } - { - const IndexRange range = IndexRange::from_single(100); - EXPECT_EQ(range.size(), 1); - EXPECT_EQ(range.first(), 100); - } -} - TEST(index_range, SingleElementRange) { IndexRange range(4, 1); diff --git a/source/blender/blenlib/tests/BLI_linear_allocator_chunked_list_test.cc b/source/blender/blenlib/tests/BLI_linear_allocator_chunked_list_test.cc deleted file mode 100644 index dec3337f014..00000000000 --- a/source/blender/blenlib/tests/BLI_linear_allocator_chunked_list_test.cc +++ /dev/null @@ -1,102 +0,0 @@ -/* SPDX-FileCopyrightText: 2024 Blender Authors - * - * SPDX-License-Identifier: Apache-2.0 */ - -#include "testing/testing.h" - -#include - -#include "BLI_linear_allocator_chunked_list.hh" -#include "BLI_set.hh" - -#include "BLI_strict_flags.h" /* Keep last. */ - -namespace blender::linear_allocator::tests { - -TEST(LinearAllocator_ChunkedList, Append) -{ - LinearAllocator<> allocator; - ChunkedList list; - - list.append(allocator, "1"); - list.append(allocator, "2"); - list.append(allocator, "this_is_an_extra_long_string"); - - Set retrieved_values; - for (const std::string &value : const_cast &>(list)) { - retrieved_values.add(value); - } - EXPECT_EQ(retrieved_values.size(), 3); - EXPECT_TRUE(retrieved_values.contains("1")); - EXPECT_TRUE(retrieved_values.contains("2")); - EXPECT_TRUE(retrieved_values.contains("this_is_an_extra_long_string")); -} - -TEST(LinearAllocator_ChunkedList, AppendMany) -{ - LinearAllocator<> allocator; - ChunkedList list; - - for (const int64_t i : IndexRange(10000)) { - list.append(allocator, int(i)); - } - - Set values; - for (const int value : list) { - values.add(value); - } - - EXPECT_EQ(values.size(), 10000); -} - -TEST(LinearAllocator_ChunkedList, Move) -{ - LinearAllocator<> allocator; - ChunkedList a; - a.append(allocator, 1); - ChunkedList b = std::move(a); - - a.append(allocator, 2); - b.append(allocator, 3); - - { - Set a_values; - for (const int value : a) { - a_values.add(value); - } - Set b_values; - for (const int value : b) { - b_values.add(value); - } - - EXPECT_EQ(a_values.size(), 1); - EXPECT_TRUE(a_values.contains(2)); - - EXPECT_EQ(b_values.size(), 2); - EXPECT_TRUE(b_values.contains(1)); - EXPECT_TRUE(b_values.contains(3)); - } - - a = std::move(b); - /* Want to test self-move. Using std::move twice quiets a compiler warning. */ - a = std::move(std::move(a)); - - { - Set a_values; - for (const int value : a) { - a_values.add(value); - } - Set b_values; - for (const int value : b) { - b_values.add(value); - } - - EXPECT_EQ(a_values.size(), 2); - EXPECT_TRUE(a_values.contains(1)); - EXPECT_TRUE(a_values.contains(3)); - - EXPECT_TRUE(b_values.is_empty()); - } -} - -} // namespace blender::linear_allocator::tests diff --git a/source/blender/blenlib/tests/BLI_linear_allocator_test.cc b/source/blender/blenlib/tests/BLI_linear_allocator_test.cc index 92292901a41..8701fb301d5 100644 --- a/source/blender/blenlib/tests/BLI_linear_allocator_test.cc +++ b/source/blender/blenlib/tests/BLI_linear_allocator_test.cc @@ -2,12 +2,10 @@ * * SPDX-License-Identifier: Apache-2.0 */ -#include "testing/testing.h" - #include "BLI_linear_allocator.hh" #include "BLI_rand.hh" - -#include "BLI_strict_flags.h" /* Keep last. */ +#include "BLI_strict_flags.h" +#include "testing/testing.h" namespace blender::tests { diff --git a/source/blender/blenlib/tests/BLI_map_test.cc b/source/blender/blenlib/tests/BLI_map_test.cc index 43a2ce1b04b..d9b31ea7d16 100644 --- a/source/blender/blenlib/tests/BLI_map_test.cc +++ b/source/blender/blenlib/tests/BLI_map_test.cc @@ -5,16 +5,15 @@ #include #include -#include "testing/testing.h" - #include "BLI_exception_safety_test_utils.hh" #include "BLI_map.hh" #include "BLI_rand.h" #include "BLI_set.hh" +#include "BLI_strict_flags.h" #include "BLI_timeit.hh" #include "BLI_vector.hh" -#include "BLI_strict_flags.h" /* Keep last. */ +#include "testing/testing.h" namespace blender::tests { diff --git a/source/blender/blenlib/tests/BLI_math_interp_test.cc b/source/blender/blenlib/tests/BLI_math_interp_test.cc index fa09dcdc884..0ce66170467 100644 --- a/source/blender/blenlib/tests/BLI_math_interp_test.cc +++ b/source/blender/blenlib/tests/BLI_math_interp_test.cc @@ -13,7 +13,7 @@ using namespace blender::math; static constexpr float float_tolerance = 0.00005f; static constexpr int image_width = 3; static constexpr int image_height = 3; -static constexpr uchar image_char[image_height][image_width][4] = { +static constexpr unsigned char image_char[image_height][image_width][4] = { {{255, 254, 217, 216}, {230, 230, 230, 230}, {240, 160, 90, 20}}, {{0, 1, 2, 3}, {62, 72, 82, 92}, {126, 127, 128, 129}}, {{1, 2, 3, 4}, {73, 108, 153, 251}, {128, 129, 130, 131}}, diff --git a/source/blender/blenlib/tests/BLI_math_matrix_types_test.cc b/source/blender/blenlib/tests/BLI_math_matrix_types_test.cc index 9b706fcf45b..7cf20ccd00c 100644 --- a/source/blender/blenlib/tests/BLI_math_matrix_types_test.cc +++ b/source/blender/blenlib/tests/BLI_math_matrix_types_test.cc @@ -255,21 +255,6 @@ TEST(math_matrix_types, MatrixMultiplyOperator) EXPECT_EQ(result4[0][1], expect4[0][1]); EXPECT_EQ(result4[1][0], expect4[1][0]); EXPECT_EQ(result4[1][1], expect4[1][1]); - - float3x4 a5(float4(1), float4(3), float4(5)); - float2x3 b5(float3(11, 7, 5), float3(13, 11, 17)); - - float2x4 expect5(float4(57), float4(131)); - - float2x4 result5 = a5 * b5; - EXPECT_EQ(result5[0][0], expect5[0][0]); - EXPECT_EQ(result5[0][1], expect5[0][1]); - EXPECT_EQ(result5[0][2], expect5[0][2]); - EXPECT_EQ(result5[0][3], expect5[0][3]); - EXPECT_EQ(result5[1][0], expect5[1][0]); - EXPECT_EQ(result5[1][1], expect5[1][1]); - EXPECT_EQ(result5[1][2], expect5[1][2]); - EXPECT_EQ(result5[1][3], expect5[1][3]); } TEST(math_matrix_types, VectorMultiplyOperator) diff --git a/source/blender/blenlib/tests/BLI_memory_utils_test.cc b/source/blender/blenlib/tests/BLI_memory_utils_test.cc index b4716b55fcb..c6fa3bbd000 100644 --- a/source/blender/blenlib/tests/BLI_memory_utils_test.cc +++ b/source/blender/blenlib/tests/BLI_memory_utils_test.cc @@ -2,12 +2,10 @@ * * SPDX-License-Identifier: Apache-2.0 */ -#include "testing/testing.h" - #include "BLI_math_vector_types.hh" #include "BLI_memory_utils.hh" - -#include "BLI_strict_flags.h" /* Keep last. */ +#include "BLI_strict_flags.h" +#include "testing/testing.h" namespace blender::tests { diff --git a/source/blender/blenlib/tests/BLI_mesh_intersect_test.cc b/source/blender/blenlib/tests/BLI_mesh_intersect_test.cc index 22b3d0f702b..de51be79de8 100644 --- a/source/blender/blenlib/tests/BLI_mesh_intersect_test.cc +++ b/source/blender/blenlib/tests/BLI_mesh_intersect_test.cc @@ -980,7 +980,7 @@ static void spheresphere_test(int nrings, double y_offset, bool use_self) return; } BLI_task_scheduler_init(); /* Without this, no parallelism. */ - double time_start = BLI_time_now_seconds(); + double time_start = BLI_check_seconds_timer(); IMeshArena arena; int nsegs = 2 * nrings; int sphere_verts_num; @@ -1009,7 +1009,7 @@ static void spheresphere_test(int nrings, double y_offset, bool use_self) sphere_verts_num, &arena); IMesh mesh(tris); - double time_create = BLI_time_now_seconds(); + double time_create = BLI_check_seconds_timer(); // write_obj_mesh(mesh, "spheresphere_in"); IMesh out; if (use_self) { @@ -1020,7 +1020,7 @@ static void spheresphere_test(int nrings, double y_offset, bool use_self) out = trimesh_nary_intersect( mesh, 2, [nf](int t) { return t < nf ? 0 : 1; }, false, &arena); } - double time_intersect = BLI_time_now_seconds(); + double time_intersect = BLI_check_seconds_timer(); std::cout << "Create time: " << time_create - time_start << "\n"; std::cout << "Intersect time: " << time_intersect - time_create << "\n"; std::cout << "Total time: " << time_intersect - time_start << "\n"; @@ -1120,7 +1120,7 @@ static void spheregrid_test(int nrings, int grid_level, double z_offset, bool us return; } BLI_task_scheduler_init(); /* Without this, no parallelism. */ - double time_start = BLI_time_now_seconds(); + double time_start = BLI_check_seconds_timer(); IMeshArena arena; int sphere_verts_num; int sphere_tris_num; @@ -1154,7 +1154,7 @@ static void spheregrid_test(int nrings, int grid_level, double z_offset, bool us sphere_tris_num, &arena); IMesh mesh(tris); - double time_create = BLI_time_now_seconds(); + double time_create = BLI_check_seconds_timer(); // write_obj_mesh(mesh, "spheregrid_in"); IMesh out; if (use_self) { @@ -1165,7 +1165,7 @@ static void spheregrid_test(int nrings, int grid_level, double z_offset, bool us out = trimesh_nary_intersect( mesh, 2, [nf](int t) { return t < nf ? 0 : 1; }, false, &arena); } - double time_intersect = BLI_time_now_seconds(); + double time_intersect = BLI_check_seconds_timer(); std::cout << "Create time: " << time_create - time_start << "\n"; std::cout << "Intersect time: " << time_intersect - time_create << "\n"; std::cout << "Total time: " << time_intersect - time_start << "\n"; @@ -1187,7 +1187,7 @@ static void gridgrid_test(int x_level_1, /* Make two grids, each 4x4, with given subdivision levels in x and y, * and the second offset from the first by x_off, y_off, and rotated by rot_deg degrees. */ BLI_task_scheduler_init(); /* Without this, no parallelism. */ - double time_start = BLI_time_now_seconds(); + double time_start = BLI_check_seconds_timer(); IMeshArena arena; int x_subdivs_1 = 1 << x_level_1; int y_subdivs_1 = 1 << y_level_1; @@ -1223,7 +1223,7 @@ static void gridgrid_test(int x_level_1, grid_tris_1_num, &arena); IMesh mesh(tris); - double time_create = BLI_time_now_seconds(); + double time_create = BLI_check_seconds_timer(); // write_obj_mesh(mesh, "gridgrid_in"); IMesh out; if (use_self) { @@ -1234,7 +1234,7 @@ static void gridgrid_test(int x_level_1, out = trimesh_nary_intersect( mesh, 2, [nf](int t) { return t < nf ? 0 : 1; }, false, &arena); } - double time_intersect = BLI_time_now_seconds(); + double time_intersect = BLI_check_seconds_timer(); std::cout << "Create time: " << time_create - time_start << "\n"; std::cout << "Intersect time: " << time_intersect - time_create << "\n"; std::cout << "Total time: " << time_intersect - time_start << "\n"; diff --git a/source/blender/blenlib/tests/BLI_pool_test.cc b/source/blender/blenlib/tests/BLI_pool_test.cc index 5ed775d300a..f00a56be569 100644 --- a/source/blender/blenlib/tests/BLI_pool_test.cc +++ b/source/blender/blenlib/tests/BLI_pool_test.cc @@ -2,12 +2,10 @@ * * SPDX-License-Identifier: Apache-2.0 */ -#include "testing/testing.h" - #include "BLI_exception_safety_test_utils.hh" #include "BLI_pool.hh" - -#include "BLI_strict_flags.h" /* Keep last. */ +#include "BLI_strict_flags.h" +#include "testing/testing.h" namespace blender::tests { diff --git a/source/blender/blenlib/tests/BLI_random_access_iterator_mixin_test.cc b/source/blender/blenlib/tests/BLI_random_access_iterator_mixin_test.cc deleted file mode 100644 index 2de8d82ff2b..00000000000 --- a/source/blender/blenlib/tests/BLI_random_access_iterator_mixin_test.cc +++ /dev/null @@ -1,52 +0,0 @@ -/* SPDX-FileCopyrightText: 2024 Blender Authors - * - * SPDX-License-Identifier: Apache-2.0 */ - -#include - -#include "testing/testing.h" - -#include "BLI_random_access_iterator_mixin.hh" -#include "BLI_vector.hh" - -namespace blender::iterator::tests { - -template -struct DoublingIterator : public RandomAccessIteratorMixin> { - private: - const T *data_; - - public: - DoublingIterator(const T *data) : data_(data) {} - - T operator*() const - { - return *data_ * 2; - } - - const T *const &iter_prop() const - { - return data_; - } -}; - -TEST(random_access_iterator_mixin, DoublingIterator) -{ - std::array my_array = {3, 6, 1, 2}; - - const DoublingIterator begin = DoublingIterator(&*my_array.begin()); - const DoublingIterator end = begin + my_array.size(); - - Vector values; - for (DoublingIterator it = begin; it != end; ++it) { - values.append(*it); - } - - EXPECT_EQ(values.size(), 4); - EXPECT_EQ(values[0], 6); - EXPECT_EQ(values[1], 12); - EXPECT_EQ(values[2], 2); - EXPECT_EQ(values[3], 4); -} - -} // namespace blender::iterator::tests diff --git a/source/blender/blenlib/tests/BLI_set_test.cc b/source/blender/blenlib/tests/BLI_set_test.cc index ee4b9a73ded..082c83f7d4f 100644 --- a/source/blender/blenlib/tests/BLI_set_test.cc +++ b/source/blender/blenlib/tests/BLI_set_test.cc @@ -5,16 +5,14 @@ #include #include -#include "testing/testing.h" - #include "BLI_exception_safety_test_utils.hh" #include "BLI_ghash.h" #include "BLI_rand.h" #include "BLI_set.hh" +#include "BLI_strict_flags.h" #include "BLI_timeit.hh" #include "BLI_vector.hh" - -#include "BLI_strict_flags.h" /* Keep last. */ +#include "testing/testing.h" namespace blender { namespace tests { diff --git a/source/blender/blenlib/tests/BLI_span_test.cc b/source/blender/blenlib/tests/BLI_span_test.cc index fbb964af730..1b98842b819 100644 --- a/source/blender/blenlib/tests/BLI_span_test.cc +++ b/source/blender/blenlib/tests/BLI_span_test.cc @@ -2,12 +2,10 @@ * * SPDX-License-Identifier: Apache-2.0 */ -#include "testing/testing.h" - #include "BLI_span.hh" +#include "BLI_strict_flags.h" #include "BLI_vector.hh" - -#include "BLI_strict_flags.h" /* Keep last. */ +#include "testing/testing.h" namespace blender::tests { diff --git a/source/blender/blenlib/tests/BLI_stack_cxx_test.cc b/source/blender/blenlib/tests/BLI_stack_cxx_test.cc index 4461b8bed54..cb8e17ca52f 100644 --- a/source/blender/blenlib/tests/BLI_stack_cxx_test.cc +++ b/source/blender/blenlib/tests/BLI_stack_cxx_test.cc @@ -2,13 +2,11 @@ * * SPDX-License-Identifier: Apache-2.0 */ -#include "testing/testing.h" - #include "BLI_exception_safety_test_utils.hh" #include "BLI_stack.hh" +#include "BLI_strict_flags.h" #include "BLI_vector.hh" - -#include "BLI_strict_flags.h" /* Keep last. */ +#include "testing/testing.h" namespace blender::tests { diff --git a/source/blender/blenlib/tests/BLI_string_ref_test.cc b/source/blender/blenlib/tests/BLI_string_ref_test.cc index 7f2559286b9..2f89c9e37e6 100644 --- a/source/blender/blenlib/tests/BLI_string_ref_test.cc +++ b/source/blender/blenlib/tests/BLI_string_ref_test.cc @@ -2,13 +2,11 @@ * * SPDX-License-Identifier: Apache-2.0 */ +#include "BLI_strict_flags.h" #include "BLI_string_ref.hh" #include "BLI_vector.hh" - #include "testing/testing.h" -#include "BLI_strict_flags.h" /* Keep last. */ - namespace blender::tests { TEST(string_ref_null, DefaultConstructor) @@ -34,71 +32,6 @@ TEST(string_ref_null, CStringLengthConstructor) EXPECT_EQ(ref.data(), str); } -TEST(string_ref_null, CompareEqual) -{ - StringRefNull ref1("test"); - StringRefNull ref2("test"); - StringRefNull ref3("other"); - EXPECT_TRUE(ref1 == ref2); - EXPECT_FALSE(ref1 == ref3); - EXPECT_TRUE(ref1 != ref3); - EXPECT_FALSE(ref1 != ref2); -} - -TEST(string_ref_null, CompareEqualCharPtr1) -{ - StringRefNull ref("test"); - EXPECT_TRUE(ref == "test"); - EXPECT_FALSE(ref == "other"); - EXPECT_TRUE(ref != "other"); - EXPECT_FALSE(ref != "test"); -} - -TEST(string_ref_null, CompareEqualCharPtr2) -{ - StringRefNull ref("test"); - EXPECT_TRUE("test" == ref); - EXPECT_FALSE("other" == ref); - EXPECT_TRUE(ref != "other"); - EXPECT_FALSE(ref != "test"); -} - -TEST(string_ref_null, CompareEqualString1) -{ - StringRefNull ref("test"); - EXPECT_TRUE(ref == std::string("test")); - EXPECT_FALSE(ref == std::string("other")); - EXPECT_TRUE(ref != std::string("other")); - EXPECT_FALSE(ref != std::string("test")); -} - -TEST(string_ref_null, CompareEqualString2) -{ - StringRefNull ref("test"); - EXPECT_TRUE(std::string("test") == ref); - EXPECT_FALSE(std::string("other") == ref); - EXPECT_TRUE(std::string("other") != ref); - EXPECT_FALSE(std::string("test") != ref); -} - -TEST(string_ref_null, CompareEqualStringRef1) -{ - StringRefNull ref("test"); - EXPECT_TRUE(ref == StringRef("test")); - EXPECT_FALSE(ref == StringRef("other")); - EXPECT_TRUE(ref != StringRef("other")); - EXPECT_FALSE(ref != StringRef("test")); -} - -TEST(string_ref_null, CompareEqualStringRef2) -{ - StringRefNull ref("test"); - EXPECT_TRUE(StringRef("test") == ref); - EXPECT_FALSE(StringRef("other") == ref); - EXPECT_TRUE(StringRef("other") != ref); - EXPECT_FALSE(StringRef("test") != ref); -} - TEST(string_ref, DefaultConstructor) { StringRef ref; diff --git a/source/blender/blenlib/tests/BLI_uuid_test.cc b/source/blender/blenlib/tests/BLI_uuid_test.cc index 7bb39de27a5..aeef967e979 100644 --- a/source/blender/blenlib/tests/BLI_uuid_test.cc +++ b/source/blender/blenlib/tests/BLI_uuid_test.cc @@ -94,7 +94,6 @@ TEST(BLI_uuid, string_formatting) memset(&uuid, 0, sizeof(uuid)); BLI_uuid_format(buffer.data(), uuid); EXPECT_EQ("00000000-0000-0000-0000-000000000000", buffer); - EXPECT_EQ("00000000-0000-0000-0000-000000000000", uuid.str()); /* Demo of where the bits end up in the formatted string. */ uuid.time_low = 1; @@ -106,20 +105,17 @@ TEST(BLI_uuid, string_formatting) uuid.node[5] = 7; BLI_uuid_format(buffer.data(), uuid); EXPECT_EQ("00000001-0002-0003-0405-060000000007", buffer); - EXPECT_EQ("00000001-0002-0003-0405-060000000007", uuid.str()); /* Somewhat more complex bit patterns. This is a version 1 UUID generated from Python. */ const bUUID uuid1 = {3540651616, 5282, 4588, 139, 153, 0xf7, 0x73, 0x69, 0x44, 0xdb, 0x8b}; BLI_uuid_format(buffer.data(), uuid1); EXPECT_EQ("d30a0e60-14a2-11ec-8b99-f7736944db8b", buffer); - EXPECT_EQ("d30a0e60-14a2-11ec-8b99-f7736944db8b", uuid1.str()); /* Namespace UUID, example listed in RFC4211. */ const bUUID namespace_dns = { 0x6ba7b810, 0x9dad, 0x11d1, 0x80, 0xb4, 0x00, 0xc0, 0x4f, 0xd4, 0x30, 0xc8}; BLI_uuid_format(buffer.data(), namespace_dns); EXPECT_EQ("6ba7b810-9dad-11d1-80b4-00c04fd430c8", buffer); - EXPECT_EQ("6ba7b810-9dad-11d1-80b4-00c04fd430c8", namespace_dns.str()); } TEST(BLI_uuid, string_parsing_ok) diff --git a/source/blender/blenlib/tests/BLI_vector_set_test.cc b/source/blender/blenlib/tests/BLI_vector_set_test.cc index f171ea8d388..7c434830a27 100644 --- a/source/blender/blenlib/tests/BLI_vector_set_test.cc +++ b/source/blender/blenlib/tests/BLI_vector_set_test.cc @@ -3,12 +3,10 @@ * SPDX-License-Identifier: Apache-2.0 */ #include "BLI_exception_safety_test_utils.hh" +#include "BLI_strict_flags.h" #include "BLI_vector_set.hh" - #include "testing/testing.h" -#include "BLI_strict_flags.h" /* Keep last. */ - namespace blender::tests { TEST(vector_set, DefaultConstructor) diff --git a/source/blender/blenlib/tests/BLI_vector_test.cc b/source/blender/blenlib/tests/BLI_vector_test.cc index ab30ebb5b38..18eccce0c1a 100644 --- a/source/blender/blenlib/tests/BLI_vector_test.cc +++ b/source/blender/blenlib/tests/BLI_vector_test.cc @@ -3,12 +3,11 @@ * SPDX-License-Identifier: Apache-2.0 */ #include "BLI_exception_safety_test_utils.hh" +#include "BLI_strict_flags.h" #include "BLI_vector.hh" #include "testing/testing.h" #include -#include "BLI_strict_flags.h" /* Keep last. */ - namespace blender::tests { TEST(vector, DefaultConstructor) diff --git a/source/blender/blenlib/tests/BLI_virtual_array_test.cc b/source/blender/blenlib/tests/BLI_virtual_array_test.cc index 397037822f3..2f4f5093584 100644 --- a/source/blender/blenlib/tests/BLI_virtual_array_test.cc +++ b/source/blender/blenlib/tests/BLI_virtual_array_test.cc @@ -4,13 +4,12 @@ #include "BLI_array.hh" #include "BLI_generic_virtual_array.hh" +#include "BLI_strict_flags.h" #include "BLI_vector.hh" #include "BLI_vector_set.hh" #include "BLI_virtual_array.hh" #include "testing/testing.h" -#include "BLI_strict_flags.h" /* Keep last. */ - namespace blender::tests { TEST(virtual_array, Span) diff --git a/source/blender/blenloader/BLO_read_write.hh b/source/blender/blenloader/BLO_read_write.hh index 7bacb74d658..ffdb968e184 100644 --- a/source/blender/blenloader/BLO_read_write.hh +++ b/source/blender/blenloader/BLO_read_write.hh @@ -33,11 +33,6 @@ #include "DNA_windowmanager_types.h" /* for eReportType */ -#include "BLI_function_ref.hh" - -namespace blender { -class ImplicitSharingInfo; -} struct BlendDataReader; struct BlendFileReadReport; struct BlendLibReader; @@ -187,21 +182,6 @@ void BLO_write_string(BlendWriter *writer, const char *data_ptr); /* Misc. */ -/** - * Check if the data can be written more efficiently by making use of implicit-sharing. If yes, the - * user count of the sharing-info is increased making the data immutable. The provided callback - * should serialize the potentially shared data. It is only called when necessary. - * - * \param approximate_size_in_bytes: Used to be able to approximate how large the undo step is in - * total. - * \param write_fn: Use the #BlendWrite to serialize the potentially shared data. - */ -void BLO_write_shared(BlendWriter *writer, - const void *data, - size_t approximate_size_in_bytes, - const blender::ImplicitSharingInfo *sharing_info, - blender::FunctionRef write_fn); - /** * Sometimes different data is written depending on whether the file is saved to disk or used for * undo. This function returns true when the current file-writing is done for undo. @@ -265,26 +245,6 @@ void BLO_read_pointer_array(BlendDataReader *reader, void **ptr_p); /* Misc. */ -void blo_read_shared_impl(BlendDataReader *reader, - void *data, - const blender::ImplicitSharingInfo **r_sharing_info, - blender::FunctionRef read_fn); - -/** - * Check if there is any shared data for the given data pointer. If yes, return the existing - * sharing-info. If not, call the provided function to actually read the data now. - */ -template -const blender::ImplicitSharingInfo *BLO_read_shared( - BlendDataReader *reader, - T **data_ptr, - blender::FunctionRef read_fn) -{ - const blender::ImplicitSharingInfo *sharing_info; - blo_read_shared_impl(reader, *data_ptr, &sharing_info, read_fn); - return sharing_info; -} - int BLO_read_fileversion_get(BlendDataReader *reader); bool BLO_read_requires_endian_switch(BlendDataReader *reader); bool BLO_read_data_is_undo(BlendDataReader *reader); diff --git a/source/blender/blenloader/BLO_readfile.hh b/source/blender/blenloader/BLO_readfile.h similarity index 75% rename from source/blender/blenloader/BLO_readfile.hh rename to source/blender/blenloader/BLO_readfile.h index 192455b0943..3d3f9dea74b 100644 --- a/source/blender/blenloader/BLO_readfile.hh +++ b/source/blender/blenloader/BLO_readfile.h @@ -11,18 +11,17 @@ * \brief external readfile function prototypes. */ -struct AssetMetaData; +#ifdef __cplusplus +extern "C" { +#endif + struct BHead; -struct BlendHandle; struct BlendThumbnail; struct FileData; -struct ID; -struct Library; struct LinkNode; struct ListBase; struct Main; struct MemFile; -struct PreviewImage; struct ReportList; struct Scene; struct UserDef; @@ -32,11 +31,13 @@ struct WorkSpace; struct bScreen; struct wmWindowManager; -struct WorkspaceConfigFileData { - Main *main; /* has to be freed when done reading file data */ +typedef struct BlendHandle BlendHandle; - ListBase workspaces; -}; +typedef struct WorkspaceConfigFileData { + struct Main *main; /* has to be freed when done reading file data */ + + struct ListBase workspaces; +} WorkspaceConfigFileData; /* -------------------------------------------------------------------- */ /** \name BLO Read File API @@ -44,15 +45,15 @@ struct WorkspaceConfigFileData { * \see #BLO_write_file for file writing. * \{ */ -enum eBlenFileType { +typedef enum eBlenFileType { BLENFILETYPE_BLEND = 1, // BLENFILETYPE_PUB = 2, /* UNUSED */ // BLENFILETYPE_RUNTIME = 3, /* UNUSED */ -}; +} eBlenFileType; -struct BlendFileData { - Main *main; - UserDef *user; +typedef struct BlendFileData { + struct Main *main; + struct UserDef *user; int fileflags; int globalf; @@ -64,27 +65,27 @@ struct BlendFileData { char filepath[1024]; /* 1024 = FILE_MAX */ /** TODO: think this isn't needed anymore? */ - bScreen *curscreen; - Scene *curscene; + struct bScreen *curscreen; + struct Scene *curscene; /** Layer to activate in workspaces when reading without UI. */ - ViewLayer *cur_view_layer; + struct ViewLayer *cur_view_layer; eBlenFileType type; -}; +} BlendFileData; /** * Data used by WM readfile code and BKE's setup_app_data to handle the complex preservation logic * of WindowManager and other UI data-blocks across blend-file reading process. */ -struct BlendFileReadWMSetupData { - /** The existing WM when file-reading process is started. */ - wmWindowManager *old_wm; +typedef struct BlendFileReadWMSetupData { + /** The existing WM when filereading process is started. */ + struct wmWindowManager *old_wm; /** The startup file is being read. */ bool is_read_homefile; /** The factory startup file is being read. */ bool is_factory_startup; -}; +} BlendFileReadWMSetupData; struct BlendFileReadParams { uint skip_flags : 3; /* #eBLOReadSkip */ @@ -94,9 +95,9 @@ struct BlendFileReadParams { int undo_direction; /* #eUndoStepDir */ }; -struct BlendFileReadReport { +typedef struct BlendFileReadReport { /** General reports handling. */ - ReportList *reports; + struct ReportList *reports; /** Timing information. */ struct { @@ -136,11 +137,11 @@ struct BlendFileReadReport { */ int resynced_lib_overrides_libraries_count; bool do_resynced_lib_overrides_libraries_list; - LinkNode *resynced_lib_overrides_libraries; -}; + struct LinkNode *resynced_lib_overrides_libraries; +} BlendFileReadReport; /** Skip reading some data-block types (may want to skip screen data too). */ -enum eBLOReadSkip { +typedef enum eBLOReadSkip { BLO_READ_SKIP_NONE = 0, /** Skip #BLO_CODE_USER blocks. */ BLO_READ_SKIP_USERDEF = (1 << 0), @@ -148,7 +149,7 @@ enum eBLOReadSkip { BLO_READ_SKIP_DATA = (1 << 1), /** Do not attempt to re-use IDs from old bmain for unchanged ones in case of undo. */ BLO_READ_SKIP_UNDO_OLD_MAIN = (1 << 2), -}; +} eBLOReadSkip; ENUM_OPERATORS(eBLOReadSkip, BLO_READ_SKIP_UNDO_OLD_MAIN) #define BLO_READ_SKIP_ALL (BLO_READ_SKIP_USERDEF | BLO_READ_SKIP_DATA) @@ -162,7 +163,7 @@ ENUM_OPERATORS(eBLOReadSkip, BLO_READ_SKIP_UNDO_OLD_MAIN) */ BlendFileData *BLO_read_from_file(const char *filepath, eBLOReadSkip skip_flags, - BlendFileReadReport *reports); + struct BlendFileReadReport *reports); /** * Open a blender file from memory. The function returns NULL * and sets a report in the list if it cannot open the file. @@ -175,7 +176,7 @@ BlendFileData *BLO_read_from_file(const char *filepath, BlendFileData *BLO_read_from_memory(const void *mem, int memsize, eBLOReadSkip skip_flags, - ReportList *reports); + struct ReportList *reports); /** * Used for undo/redo, skips part of libraries reading * (assuming their data are already loaded & valid). @@ -185,11 +186,11 @@ BlendFileData *BLO_read_from_memory(const void *mem, * \param filepath: current file, only for retrieving library data. * Typically `BKE_main_blendfile_path(oldmain)`. */ -BlendFileData *BLO_read_from_memfile(Main *oldmain, +BlendFileData *BLO_read_from_memfile(struct Main *oldmain, const char *filepath, - MemFile *memfile, - const BlendFileReadParams *params, - ReportList *reports); + struct MemFile *memfile, + const struct BlendFileReadParams *params, + struct ReportList *reports); /** * Frees a BlendFileData structure and *all* the data associated with it @@ -209,7 +210,7 @@ void BLO_blendfiledata_free(BlendFileData *bfd); * * \param new_bmain: the newly read Main data-base. */ -void BLO_read_do_version_after_setup(Main *new_bmain, BlendFileReadReport *reports); +void BLO_read_do_version_after_setup(struct Main *new_bmain, struct BlendFileReadReport *reports); /** \} */ @@ -217,9 +218,9 @@ void BLO_read_do_version_after_setup(Main *new_bmain, BlendFileReadReport *repor /** \name BLO Blend File Handle API * \{ */ -struct BLODataBlockInfo { +typedef struct BLODataBlockInfo { char name[64]; /* MAX_NAME */ - AssetMetaData *asset_data; + struct AssetMetaData *asset_data; /** Ownership over #asset_data above can be "stolen out" of this struct, for more permanent * storage. In that case, set this to false to avoid double freeing of the stolen data. */ bool free_asset_data; @@ -230,7 +231,7 @@ struct BLODataBlockInfo { * either no preview was found, or that it wasn't looked for in the first place. */ bool no_preview_found; -}; +} BLODataBlockInfo; /** * Frees contained data, not \a datablock_info itself. @@ -239,7 +240,7 @@ void BLO_datablock_info_free(BLODataBlockInfo *datablock_info); /** * Can be used to free the list returned by #BLO_blendhandle_get_datablock_info(). */ -void BLO_datablock_info_linklist_free(LinkNode * /*BLODataBlockInfo*/ datablock_infos); +void BLO_datablock_info_linklist_free(struct LinkNode * /*BLODataBlockInfo*/ datablock_infos); /** * Open a blendhandle from a file path. @@ -248,7 +249,7 @@ void BLO_datablock_info_linklist_free(LinkNode * /*BLODataBlockInfo*/ datablock_ * \param reports: Report errors in opening the file (can be NULL). * \return A handle on success, or NULL on failure. */ -BlendHandle *BLO_blendhandle_from_file(const char *filepath, BlendFileReadReport *reports); +BlendHandle *BLO_blendhandle_from_file(const char *filepath, struct BlendFileReadReport *reports); /** * Open a blendhandle from memory. * @@ -258,7 +259,7 @@ BlendHandle *BLO_blendhandle_from_file(const char *filepath, BlendFileReadReport */ BlendHandle *BLO_blendhandle_from_memory(const void *mem, int memsize, - BlendFileReadReport *reports); + struct BlendFileReadReport *reports); /** * Gets the names of all the data-blocks in a file of a certain type @@ -270,11 +271,11 @@ BlendHandle *BLO_blendhandle_from_memory(const void *mem, * \param r_tot_names: The length of the returned list. * \return A BLI_linklist of strings. The string links should be freed with #MEM_freeN(). */ -LinkNode *BLO_blendhandle_get_datablock_names(BlendHandle *bh, - int ofblocktype, +struct LinkNode *BLO_blendhandle_get_datablock_names(BlendHandle *bh, + int ofblocktype, - bool use_assets_only, - int *r_tot_names); + bool use_assets_only, + int *r_tot_names); /** * Gets the names and asset-data (if ID is an asset) of data-blocks in a file of a certain type. * The data-blocks can be limited to assets. @@ -289,10 +290,10 @@ LinkNode *BLO_blendhandle_get_datablock_names(BlendHandle *bh, * \note The links should be freed using #BLO_datablock_info_free() or the entire list using * #BLO_datablock_info_linklist_free(). */ -LinkNode * /*BLODataBlockInfo*/ BLO_blendhandle_get_datablock_info(BlendHandle *bh, - int ofblocktype, - bool use_assets_only, - int *r_tot_info_items); +struct LinkNode * /*BLODataBlockInfo*/ BLO_blendhandle_get_datablock_info(BlendHandle *bh, + int ofblocktype, + bool use_assets_only, + int *r_tot_info_items); /** * Gets the previews of all the data-blocks in a file of a certain type * (e.g. all the scene previews in a file). @@ -302,7 +303,7 @@ LinkNode * /*BLODataBlockInfo*/ BLO_blendhandle_get_datablock_info(BlendHandle * * \param r_tot_prev: The length of the returned list. * \return A BLI_linklist of #PreviewImage. The #PreviewImage links should be freed with malloc. */ -LinkNode *BLO_blendhandle_get_previews(BlendHandle *bh, int ofblocktype, int *r_tot_prev); +struct LinkNode *BLO_blendhandle_get_previews(BlendHandle *bh, int ofblocktype, int *r_tot_prev); /** * Get the PreviewImage of a single data block in a file. * (e.g. all the scene previews in a file). @@ -312,9 +313,9 @@ LinkNode *BLO_blendhandle_get_previews(BlendHandle *bh, int ofblocktype, int *r_ * \param name: Name of the block without the ID_ prefix, to read the preview image from. * \return PreviewImage or NULL when no preview Images have been found. Caller owns the returned */ -PreviewImage *BLO_blendhandle_get_preview_for_id(BlendHandle *bh, - int ofblocktype, - const char *name); +struct PreviewImage *BLO_blendhandle_get_preview_for_id(BlendHandle *bh, + int ofblocktype, + const char *name); /** * Gets the names of all the linkable data-block types available in a file. * (e.g. "Scene", "Mesh", "Light", etc.). @@ -322,7 +323,7 @@ PreviewImage *BLO_blendhandle_get_preview_for_id(BlendHandle *bh, * \param bh: The blendhandle to access. * \return A BLI_linklist of strings. The string links should be freed with #MEM_freeN(). */ -LinkNode *BLO_blendhandle_get_linkable_groups(BlendHandle *bh); +struct LinkNode *BLO_blendhandle_get_linkable_groups(BlendHandle *bh); /** * Close and free a blendhandle. The handle becomes invalid after this call. @@ -335,7 +336,7 @@ void BLO_blendhandle_close(BlendHandle *bh); * Mark the given Main (and the 'root' local one in case of lib-split Mains) as invalid, and * generate an error report containing given `message`. */ -void BLO_read_invalidate_message(BlendHandle *bh, Main *bmain, const char *message); +void BLO_read_invalidate_message(BlendHandle *bh, struct Main *bmain, const char *message); /** * BLI_assert-like macro to check a condition, and if `false`, fail the whole .blend reading @@ -367,7 +368,7 @@ void BLO_read_invalidate_message(BlendHandle *bh, Main *bmain, const char *messa * \note merged with 'user-level' options from operators etc. in 16 lower bits * (see #eFileSel_Params_Flag in DNA_space_types.h). */ -enum eBLOLibLinkFlags { +typedef enum eBLOLibLinkFlags { /** Generate a placeholder (empty ID) if not found in current lib file. */ BLO_LIBLINK_USE_PLACEHOLDERS = 1 << 16, /** Force loaded ID to be tagged as #LIB_TAG_INDIRECT (used in reload context only). */ @@ -388,16 +389,16 @@ enum eBLOLibLinkFlags { BLO_LIBLINK_OBDATA_INSTANCE = 1 << 24, /** Instantiate collections as empties, instead of linking them into current view layer. */ BLO_LIBLINK_COLLECTION_INSTANCE = 1 << 25, -}; +} eBLOLibLinkFlags; /** * Struct for passing arguments to * #BLO_library_link_begin, #BLO_library_link_named_part & #BLO_library_link_end. * Wrap these in parameters since it's important both functions receive matching values. */ -struct LibraryLink_Params { +typedef struct LibraryLink_Params { /** The current main database, e.g. #G_MAIN or `CTX_data_main(C)`. */ - Main *bmain; + struct Main *bmain; /** Options for linking, used for instantiating. */ int flag; /** Additional tag for #ID.tag. */ @@ -405,25 +406,25 @@ struct LibraryLink_Params { /** Context for instancing objects (optional, no instantiation will be performed when NULL). */ struct { /** The scene in which to instantiate objects/collections. */ - Scene *scene; + struct Scene *scene; /** The scene layer in which to instantiate objects/collections. */ - ViewLayer *view_layer; + struct ViewLayer *view_layer; /** The active 3D viewport (only used to define local-view). */ - const View3D *v3d; + const struct View3D *v3d; } context; -}; +} LibraryLink_Params; -void BLO_library_link_params_init(LibraryLink_Params *params, - Main *bmain, +void BLO_library_link_params_init(struct LibraryLink_Params *params, + struct Main *bmain, int flag, int id_tag_extra); -void BLO_library_link_params_init_with_context(LibraryLink_Params *params, - Main *bmain, +void BLO_library_link_params_init_with_context(struct LibraryLink_Params *params, + struct Main *bmain, int flag, int id_tag_extra, - Scene *scene, - ViewLayer *view_layer, - const View3D *v3d); + struct Scene *scene, + struct ViewLayer *view_layer, + const struct View3D *v3d); /** * Initialize the #BlendHandle for linking library data. @@ -434,9 +435,9 @@ void BLO_library_link_params_init_with_context(LibraryLink_Params *params, * \param params: Settings for linking that don't change from beginning to end of linking. * \return the library #Main, to be passed to #BLO_library_link_named_part as \a mainl. */ -Main *BLO_library_link_begin(BlendHandle **bh, - const char *filepath, - const LibraryLink_Params *params); +struct Main *BLO_library_link_begin(BlendHandle **bh, + const char *filepath, + const struct LibraryLink_Params *params); /** * Link a named data-block from an external blend file. * @@ -446,11 +447,11 @@ Main *BLO_library_link_begin(BlendHandle **bh, * \param name: The name of the data-block (without the 2 char ID prefix). * \return the linked ID when found. */ -ID *BLO_library_link_named_part(Main *mainl, - BlendHandle **bh, - short idcode, - const char *name, - const LibraryLink_Params *params); +struct ID *BLO_library_link_named_part(struct Main *mainl, + BlendHandle **bh, + short idcode, + const char *name, + const struct LibraryLink_Params *params); /** * Finalize linking from a given .blend file (library). * Optionally instance the indirect object/collection in the scene when the flags are set. @@ -460,37 +461,39 @@ ID *BLO_library_link_named_part(Main *mainl, * \param bh: The blender file handle (WARNING! may be freed by this function!). * \param params: Settings for linking that don't change from beginning to end of linking. */ -void BLO_library_link_end(Main *mainl, BlendHandle **bh, const LibraryLink_Params *params); +void BLO_library_link_end(struct Main *mainl, + BlendHandle **bh, + const struct LibraryLink_Params *params); /** * Struct for temporarily loading datablocks from a blend file. */ -struct TempLibraryContext { +typedef struct TempLibraryContext { /** Temporary main used for library data. */ - Main *bmain_lib; + struct Main *bmain_lib; /** Temporary main used to load data into (currently initialized from `real_main`). */ - Main *bmain_base; - BlendHandle *blendhandle; - BlendFileReadReport bf_reports; - LibraryLink_Params liblink_params; - Library *lib; + struct Main *bmain_base; + struct BlendHandle *blendhandle; + struct BlendFileReadReport bf_reports; + struct LibraryLink_Params liblink_params; + struct Library *lib; /** The ID datablock that was loaded. Is NULL if loading failed. */ - ID *temp_id; -}; + struct ID *temp_id; +} TempLibraryContext; -TempLibraryContext *BLO_library_temp_load_id(Main *real_main, +TempLibraryContext *BLO_library_temp_load_id(struct Main *real_main, const char *blend_file_path, short idcode, const char *idname, - ReportList *reports); + struct ReportList *reports); void BLO_library_temp_free(TempLibraryContext *temp_lib_ctx); /** \} */ -void *BLO_library_read_struct(FileData *fd, BHead *bh, const char *blockname); +void *BLO_library_read_struct(struct FileData *fd, struct BHead *bh, const char *blockname); -using BLOExpandDoitCallback = void (*)(void *fdhandle, Main *mainvar, void *idv); +typedef void (*BLOExpandDoitCallback)(void *fdhandle, struct Main *mainvar, void *idv); /** * Set the callback func used over all ID data found by \a BLO_expand_main func. @@ -505,7 +508,7 @@ void BLO_main_expander(BLOExpandDoitCallback expand_doit_func); * \param fdhandle: usually file-data, or own handle. May be nullptr. * \param mainvar: the Main database to expand. */ -void BLO_expand_main(void *fdhandle, Main *mainvar); +void BLO_expand_main(void *fdhandle, struct Main *mainvar); /** * Update defaults in startup.blend, without having to save and embed it. @@ -520,11 +523,11 @@ void BLO_expand_main(void *fdhandle, Main *mainvar); * Versioning the screen data can be safely skipped without "Load UI" since the screen data * will have been versioned when it was first loaded. */ -void BLO_update_defaults_startup_blend(Main *bmain, const char *app_template); -void BLO_update_defaults_workspace(WorkSpace *workspace, const char *app_template); +void BLO_update_defaults_startup_blend(struct Main *bmain, const char *app_template); +void BLO_update_defaults_workspace(struct WorkSpace *workspace, const char *app_template); /** Disable unwanted experimental feature settings on startup. */ -void BLO_sanitize_experimental_features_userpref_blend(UserDef *userdef); +void BLO_sanitize_experimental_features_userpref_blend(struct UserDef *userdef); /** * Does a very light reading of given .blend file to extract its stored thumbnail. @@ -534,7 +537,7 @@ void BLO_sanitize_experimental_features_userpref_blend(UserDef *userdef); * (MEM-allocated, as stored in file, use #BKE_main_thumbnail_to_imbuf() * to convert it to ImBuf image). */ -BlendThumbnail *BLO_thumbnail_from_file(const char *filepath); +struct BlendThumbnail *BLO_thumbnail_from_file(const char *filepath); /** * Does a very light reading of given .blend file to extract its version. @@ -543,3 +546,12 @@ BlendThumbnail *BLO_thumbnail_from_file(const char *filepath); * \return The file version */ short BLO_version_from_file(const char *filepath); + +/** Default theme, see: `release/datafiles/userdef/userdef_default_theme.c`. */ +extern const struct bTheme U_theme_default; +/** Default preferences, defined by: `release/datafiles/userdef/userdef_default.c`. */ +extern const struct UserDef U_default; + +#ifdef __cplusplus +} +#endif diff --git a/source/blender/blenloader/BLO_undofile.hh b/source/blender/blenloader/BLO_undofile.hh index 83ee072c456..c9056c6ac26 100644 --- a/source/blender/blenloader/BLO_undofile.hh +++ b/source/blender/blenloader/BLO_undofile.hh @@ -13,22 +13,9 @@ #include "BLI_listbase.h" #include "BLI_map.hh" -namespace blender { -class ImplicitSharingInfo; -} -struct GHash; struct Main; struct Scene; -struct MemFileSharedStorage { - /** - * Maps the data pointer to the sharing info that it is owned by. - */ - blender::Map map; - - ~MemFileSharedStorage(); -}; - struct MemFileChunk { void *next, *prev; const char *buf; @@ -48,11 +35,6 @@ struct MemFileChunk { struct MemFile { ListBase chunks; size_t size; - /** - * Some data is not serialized into a new buffer because the undo-step can take ownership of it - * without making a copy. This is faster and requires less memory. - */ - MemFileSharedStorage *shared_storage; }; struct MemFileWriteData { @@ -112,5 +94,11 @@ void BLO_memfile_clear_future(MemFile *memfile); /* Utilities. */ Main *BLO_memfile_main_get(MemFile *memfile, Main *bmain, Scene **r_scene); +/** + * Saves .blend using undo buffer. + * + * \return success. + */ +bool BLO_memfile_write_file(MemFile *memfile, const char *filepath); FileReader *BLO_memfile_new_filereader(MemFile *memfile, int undo_direction); diff --git a/source/blender/blenloader/BLO_userdef_default.h b/source/blender/blenloader/BLO_userdef_default.h deleted file mode 100644 index be92fb8b7e3..00000000000 --- a/source/blender/blenloader/BLO_userdef_default.h +++ /dev/null @@ -1,20 +0,0 @@ -/* SPDX-FileCopyrightText: 2001-2002 NaN Holding BV. All rights reserved. - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -#pragma once - -#include "DNA_userdef_types.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/** Default theme, see: `release/datafiles/userdef/userdef_default_theme.c`. */ -extern const bTheme U_theme_default; -/** Default preferences, defined by: `release/datafiles/userdef/userdef_default.c`. */ -extern const UserDef U_default; - -#ifdef __cplusplus -} -#endif diff --git a/source/blender/blenloader/CMakeLists.txt b/source/blender/blenloader/CMakeLists.txt index d22ba74fe6f..1496ce79c2e 100644 --- a/source/blender/blenloader/CMakeLists.txt +++ b/source/blender/blenloader/CMakeLists.txt @@ -49,9 +49,8 @@ set(SRC BLO_blend_defs.hh BLO_blend_validate.hh BLO_read_write.hh - BLO_readfile.hh + BLO_readfile.h BLO_undofile.hh - BLO_userdef_default.h BLO_writefile.hh intern/readfile.hh intern/versioning_common.hh @@ -59,13 +58,13 @@ set(SRC set(LIB PRIVATE bf::animrig + PRIVATE bf::blenfont bf_blenkernel PRIVATE bf::blenlib PRIVATE bf::depsgraph PRIVATE bf::dna PRIVATE bf::intern::clog PRIVATE bf::intern::guardedalloc - PRIVATE bf::extern::fmtlib ) if(WITH_BUILDINFO) @@ -118,7 +117,6 @@ if(WITH_GTESTS) ) set(TEST_UTIL_LIB ${LIB} - PRIVATE bf::blenfont bf_blenloader ) blender_add_lib(bf_blenloader_test_util "${TEST_UTIL_SRC}" "${TEST_UTIL_INC}" "${TEST_UTIL_INC_SYS}" "${TEST_UTIL_LIB}") @@ -134,7 +132,3 @@ if(WITH_GTESTS) ) blender_add_test_suite_lib(blenloader "${TEST_SRC}" "${INC}" "${INC_SYS}" "${TEST_LIB}") endif() - -if(WITH_EXPERIMENTAL_FEATURES) - add_definitions(-DWITH_EXPERIMENTAL_FEATURES) -endif() diff --git a/source/blender/blenloader/intern/blend_validate.cc b/source/blender/blenloader/intern/blend_validate.cc index 5ca9d7c466f..248038acfe4 100644 --- a/source/blender/blenloader/intern/blend_validate.cc +++ b/source/blender/blenloader/intern/blend_validate.cc @@ -15,6 +15,7 @@ #include "BLI_utildefines.h" +#include "BLI_blenlib.h" #include "BLI_linklist.h" #include "MEM_guardedalloc.h" @@ -30,11 +31,11 @@ #include "BKE_lib_remap.hh" #include "BKE_library.hh" #include "BKE_main.hh" -#include "BKE_node.hh" -#include "BKE_report.hh" +#include "BKE_node.h" +#include "BKE_report.h" #include "BLO_blend_validate.hh" -#include "BLO_readfile.hh" +#include "BLO_readfile.h" #include "readfile.hh" diff --git a/source/blender/blenloader/intern/readblenentry.cc b/source/blender/blenloader/intern/readblenentry.cc index f5b353ae24b..2a92e86fc16 100644 --- a/source/blender/blenloader/intern/readblenentry.cc +++ b/source/blender/blenloader/intern/readblenentry.cc @@ -17,6 +17,7 @@ #include "BLI_ghash.h" #include "BLI_linklist.h" +#include "BLI_listbase.h" #include "BLI_path_util.h" /* Only for assertions. */ #include "BLI_string.h" #include "BLI_utildefines.h" @@ -30,7 +31,8 @@ #include "BKE_preview_image.hh" #include "BLO_blend_defs.hh" -#include "BLO_readfile.hh" +#include "BLO_readfile.h" +#include "BLO_undofile.hh" #include "readfile.hh" diff --git a/source/blender/blenloader/intern/readfile.cc b/source/blender/blenloader/intern/readfile.cc index 239018e278f..7db3ade897d 100644 --- a/source/blender/blenloader/intern/readfile.cc +++ b/source/blender/blenloader/intern/readfile.cc @@ -58,14 +58,14 @@ #include "BLI_threads.h" #include "BLI_time.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" -#include "BKE_anim_data.hh" +#include "BKE_anim_data.h" #include "BKE_animsys.h" #include "BKE_asset.hh" #include "BKE_blender_version.h" -#include "BKE_collection.hh" -#include "BKE_global.hh" /* for G */ +#include "BKE_collection.h" +#include "BKE_global.h" /* for G */ #include "BKE_idprop.h" #include "BKE_idtype.hh" #include "BKE_layer.hh" @@ -82,8 +82,8 @@ #include "BKE_node.hh" /* for tree type defines */ #include "BKE_object.hh" #include "BKE_packedFile.h" -#include "BKE_report.hh" -#include "BKE_scene.hh" +#include "BKE_report.h" +#include "BKE_scene.h" #include "BKE_screen.hh" #include "BKE_undo_system.hh" #include "BKE_workspace.h" @@ -95,7 +95,7 @@ #include "BLO_blend_defs.hh" #include "BLO_blend_validate.hh" #include "BLO_read_write.hh" -#include "BLO_readfile.hh" +#include "BLO_readfile.h" #include "BLO_undofile.hh" #include "SEQ_iterator.hh" @@ -2039,7 +2039,7 @@ static int direct_link_id_restore_recalc(const FileData *fd, /* If the contents datablock changed, the depsgraph needs to copy the * datablock again to ensure it matches the original datablock. */ if (!is_identical) { - recalc |= ID_RECALC_SYNC_TO_EVAL; + recalc |= ID_RECALC_COPY_ON_WRITE; } /* Special exceptions. */ @@ -2401,30 +2401,91 @@ static void placeholders_ensure_valid(Main *bmain) } } -static const char *idtype_alloc_name_get(short id_code) +static const char *dataname(short id_code) { - static const std::array id_alloc_names = [] { - auto n = decltype(id_alloc_names)(); - for (int idtype_index = 0; idtype_index < INDEX_ID_MAX; idtype_index++) { - const IDTypeInfo *idtype_info = BKE_idtype_get_info_from_idtype_index(idtype_index); - BLI_assert(idtype_info); - if (idtype_index == INDEX_ID_NULL) { - /* #INDEX_ID_NULL returns the #IDType_ID_LINK_PLACEHOLDER type info, here we will rather - * use it for unknown/invalid ID types. */ - n[size_t(idtype_index)] = "Data from UNKNWOWN ID Type"; - } - else { - n[size_t(idtype_index)] = std::string("Data from '") + idtype_info->name + "'"; - } - } - return n; - }(); - - const int idtype_index = BKE_idtype_idcode_to_index(id_code); - if (LIKELY(idtype_index >= 0 && idtype_index < INDEX_ID_MAX)) { - return id_alloc_names[size_t(idtype_index)].c_str(); + switch ((ID_Type)id_code) { + case ID_OB: + return "Data from OB"; + case ID_ME: + return "Data from ME"; + case ID_IP: + return "Data from IP"; + case ID_SCE: + return "Data from SCE"; + case ID_MA: + return "Data from MA"; + case ID_TE: + return "Data from TE"; + case ID_CU_LEGACY: + return "Data from CU"; + case ID_GR: + return "Data from GR"; + case ID_AR: + return "Data from AR"; + case ID_AC: + return "Data from AC"; + case ID_LI: + return "Data from LI"; + case ID_MB: + return "Data from MB"; + case ID_IM: + return "Data from IM"; + case ID_LT: + return "Data from LT"; + case ID_LA: + return "Data from LA"; + case ID_CA: + return "Data from CA"; + case ID_KE: + return "Data from KE"; + case ID_WO: + return "Data from WO"; + case ID_SCR: + return "Data from SCR"; + case ID_VF: + return "Data from VF"; + case ID_TXT: + return "Data from TXT"; + case ID_SPK: + return "Data from SPK"; + case ID_LP: + return "Data from LP"; + case ID_SO: + return "Data from SO"; + case ID_NT: + return "Data from NT"; + case ID_BR: + return "Data from BR"; + case ID_PA: + return "Data from PA"; + case ID_PAL: + return "Data from PAL"; + case ID_PC: + return "Data from PCRV"; + case ID_GD_LEGACY: + return "Data from GD"; + case ID_WM: + return "Data from WM"; + case ID_MC: + return "Data from MC"; + case ID_MSK: + return "Data from MSK"; + case ID_LS: + return "Data from LS"; + case ID_CF: + return "Data from CF"; + case ID_WS: + return "Data from WS"; + case ID_CV: + return "Data from HA"; + case ID_PT: + return "Data from PT"; + case ID_VO: + return "Data from VO"; + case ID_GP: + return "Data from GP"; } - return id_alloc_names[INDEX_ID_NULL].c_str(); + return "Data from Lib Block"; } static bool direct_link_id(FileData *fd, Main *main, const int tag, ID *id, ID *id_old) @@ -2970,7 +3031,7 @@ static BHead *read_libblock(FileData *fd, /* Read datablock contents. * Use convenient malloc name for debugging and better memory link prints. */ - const char *allocname = idtype_alloc_name_get(idcode); + const char *allocname = dataname(idcode); bhead = read_data_into_datamap(fd, bhead, allocname); const bool success = direct_link_id(fd, main, id_tag, id, id_old); oldnewmap_clear(fd->datamap); @@ -3294,7 +3355,7 @@ static void lib_link_all(FileData *fd, Main *bmain) } FOREACH_MAIN_ID_END; - /* Cleanup `ID.orig_id`, this is now reserved for depsgraph/copy-on-eval usage only. */ + /* Cleanup `ID.orig_id`, this is now reserved for depsgraph/COW usage only. */ FOREACH_MAIN_ID_BEGIN (bmain, id) { id->orig_id = nullptr; } @@ -3662,7 +3723,7 @@ BlendFileData *blo_read_file_internal(FileData *fd, const char *filepath) } if ((fd->skip_flags & BLO_READ_SKIP_DATA) == 0) { - fd->reports->duration.libraries = BLI_time_now_seconds(); + fd->reports->duration.libraries = BLI_check_seconds_timer(); read_libraries(fd, &mainlist); blo_join_main(&mainlist); @@ -3677,7 +3738,7 @@ BlendFileData *blo_read_file_internal(FileData *fd, const char *filepath) read_undo_remap_noundo_data(fd); } - fd->reports->duration.libraries = BLI_time_now_seconds() - fd->reports->duration.libraries; + fd->reports->duration.libraries = BLI_check_seconds_timer() - fd->reports->duration.libraries; /* Skip in undo case. */ if (!is_undo) { @@ -3735,7 +3796,7 @@ BlendFileData *blo_read_file_internal(FileData *fd, const char *filepath) * we can re-generate overrides from their references. */ if (!is_undo) { /* Do not apply in undo case! */ - fd->reports->duration.lib_overrides = BLI_time_now_seconds(); + fd->reports->duration.lib_overrides = BLI_check_seconds_timer(); std::string cur_view_layer_name = bfd->cur_view_layer != nullptr ? bfd->cur_view_layer->name : @@ -3756,7 +3817,7 @@ BlendFileData *blo_read_file_internal(FileData *fd, const char *filepath) * Proper fix involves first addressing #90610. */ BKE_main_collections_parent_relations_rebuild(bfd->main); - fd->reports->duration.lib_overrides = BLI_time_now_seconds() - + fd->reports->duration.lib_overrides = BLI_check_seconds_timer() - fd->reports->duration.lib_overrides; } @@ -4502,13 +4563,13 @@ static void read_library_linked_id( read_libblock(fd, mainvar, bhead, id->tag, false, r_id); } else { - CLOG_INFO(&LOG, - 3, - "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)); + BLO_reportf_wrap(basefd->reports, + RPT_INFO, + RPT_("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->reports->count.missing_linked_id++; /* Generate a placeholder for this ID (simplified version of read_libblock actually...). */ @@ -4958,32 +5019,6 @@ void BLO_read_pointer_array(BlendDataReader *reader, void **ptr_p) *ptr_p = final_array; } -void blo_read_shared_impl( - BlendDataReader *reader, - void *data, - const blender::ImplicitSharingInfo **r_sharing_info, - const blender::FunctionRef read_fn) -{ - if (BLO_read_data_is_undo(reader)) { - if (reader->fd->flags & FD_FLAGS_IS_MEMFILE) { - UndoReader *undo_reader = reinterpret_cast(reader->fd->file); - MemFile &memfile = *undo_reader->memfile; - if (memfile.shared_storage) { - /* Check if the data was saved with sharing-info. */ - if (const blender::ImplicitSharingInfo *sharing_info = - memfile.shared_storage->map.lookup_default(data, nullptr)) - { - /* Add a new owner of the data that is passed to the caller. */ - sharing_info->add_user(); - *r_sharing_info = sharing_info; - return; - } - } - } - } - *r_sharing_info = read_fn(); -} - bool BLO_read_data_is_undo(BlendDataReader *reader) { return (reader->fd->flags & FD_FLAGS_IS_MEMFILE); diff --git a/source/blender/blenloader/intern/readfile.hh b/source/blender/blenloader/intern/readfile.hh index f13db6d9005..6bc5566d6c6 100644 --- a/source/blender/blenloader/intern/readfile.hh +++ b/source/blender/blenloader/intern/readfile.hh @@ -20,7 +20,7 @@ #include "DNA_space_types.h" #include "DNA_windowmanager_types.h" /* for eReportType */ -#include "BLO_readfile.hh" +#include "BLO_readfile.h" struct BlendFileData; struct BlendFileReadParams; diff --git a/source/blender/blenloader/intern/readfile_tempload.cc b/source/blender/blenloader/intern/readfile_tempload.cc index 3b636a8424d..d20424e480d 100644 --- a/source/blender/blenloader/intern/readfile_tempload.cc +++ b/source/blender/blenloader/intern/readfile_tempload.cc @@ -5,13 +5,14 @@ /** \file * \ingroup blenloader */ -#include "BLO_readfile.hh" +#include "BLO_readfile.h" #include "MEM_guardedalloc.h" #include "BLI_string.h" #include "BKE_main.hh" +#include "BKE_report.h" #include "DNA_ID.h" diff --git a/source/blender/blenloader/intern/undofile.cc b/source/blender/blenloader/intern/undofile.cc index f84c0e46fa1..d7b101eeded 100644 --- a/source/blender/blenloader/intern/undofile.cc +++ b/source/blender/blenloader/intern/undofile.cc @@ -25,16 +25,16 @@ #include "DNA_listBase.h" #include "BLI_blenlib.h" -#include "BLI_implicit_sharing.hh" -#include "BLO_readfile.hh" +#include "BLO_readfile.h" #include "BLO_undofile.hh" #include "BKE_lib_id.hh" #include "BKE_main.hh" #include "BKE_undo_system.hh" -#include "BLI_strict_flags.h" /* Keep last. */ +/* keep last */ +#include "BLI_strict_flags.h" /* **************** support for memory-write, for undo buffers *************** */ @@ -46,19 +46,9 @@ void BLO_memfile_free(MemFile *memfile) } MEM_freeN(chunk); } - MEM_delete(memfile->shared_storage); - memfile->shared_storage = nullptr; memfile->size = 0; } -MemFileSharedStorage::~MemFileSharedStorage() -{ - for (const blender::ImplicitSharingInfo *sharing_info : map.values()) { - /* Removing the user makes sure shared data is freed when the undo step was its last owner. */ - sharing_info->remove_user_and_delete_if_last(); - } -} - void BLO_memfile_merge(MemFile *first, MemFile *second) { /* We use this mapping to store the memory buffers from second memfile chunks which are not owned @@ -186,6 +176,61 @@ Main *BLO_memfile_main_get(MemFile *memfile, Main *bmain, Scene **r_scene) return bmain_undo; } +bool BLO_memfile_write_file(MemFile *memfile, const char *filepath) +{ + MemFileChunk *chunk; + int file, oflags; + + /* NOTE: This is currently used for auto-save and `quit.blend`, + * where _not_ following symbolic-links is OK, + * however if this is ever executed explicitly by the user, + * we may want to allow writing to symbolic-links. */ + + oflags = O_BINARY | O_WRONLY | O_CREAT | O_TRUNC; +#ifdef O_NOFOLLOW + /* use O_NOFOLLOW to avoid writing to a symlink - use 'O_EXCL' (CVE-2008-1103) */ + oflags |= O_NOFOLLOW; +#else + /* TODO(sergey): How to deal with symlinks on windows? */ +# ifndef _MSC_VER +# warning "Symbolic links will be followed on undo save, possibly causing CVE-2008-1103" +# endif +#endif + file = BLI_open(filepath, oflags, 0666); + + if (file == -1) { + fprintf(stderr, + "Unable to save '%s': %s\n", + filepath, + errno ? strerror(errno) : "Unknown error opening file"); + return false; + } + + for (chunk = static_cast(memfile->chunks.first); chunk; + chunk = static_cast(chunk->next)) + { +#ifdef _WIN32 + if (size_t(write(file, chunk->buf, uint(chunk->size))) != chunk->size) +#else + if (size_t(write(file, chunk->buf, chunk->size)) != chunk->size) +#endif + { + break; + } + } + + close(file); + + if (chunk) { + fprintf(stderr, + "Unable to save '%s': %s\n", + filepath, + errno ? strerror(errno) : "Unknown error writing file"); + return false; + } + return true; +} + static int64_t undo_read(FileReader *reader, void *buffer, size_t size) { UndoReader *undo = (UndoReader *)reader; diff --git a/source/blender/blenloader/intern/versioning_250.cc b/source/blender/blenloader/intern/versioning_250.cc index 148d49b6b3c..0ca8f91f420 100644 --- a/source/blender/blenloader/intern/versioning_250.cc +++ b/source/blender/blenloader/intern/versioning_250.cc @@ -24,8 +24,10 @@ #include "DNA_cloth_types.h" #include "DNA_constraint_types.h" #include "DNA_fluid_types.h" +#include "DNA_ipo_types.h" #include "DNA_key_types.h" #include "DNA_lattice_types.h" +#include "DNA_light_types.h" #include "DNA_material_types.h" #include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" @@ -39,6 +41,7 @@ #include "DNA_sound_types.h" #include "DNA_space_types.h" #include "DNA_view3d_types.h" +#include "DNA_world_types.h" #include "MEM_guardedalloc.h" @@ -48,25 +51,28 @@ #include "BLI_math_rotation.h" #include "BLI_utildefines.h" -#include "BKE_anim_data.hh" +#include "BKE_anim_data.h" #include "BKE_anim_visualization.h" #include "BKE_armature.hh" #include "BKE_colortools.hh" #include "BKE_customdata.hh" -#include "BKE_global.hh" /* for G */ +#include "BKE_global.h" /* for G */ #include "BKE_lib_id.hh" #include "BKE_main.hh" +#include "BKE_mesh.hh" #include "BKE_modifier.hh" #include "BKE_multires.hh" -#include "BKE_node.hh" +#include "BKE_node.h" #include "BKE_node_tree_update.hh" #include "BKE_particle.h" +#include "BKE_pointcache.h" #include "BKE_screen.hh" +#include "BKE_sound.h" #include "BKE_texture.h" #include "SEQ_iterator.hh" -#include "BLO_readfile.hh" +#include "BLO_readfile.h" #include "readfile.hh" diff --git a/source/blender/blenloader/intern/versioning_260.cc b/source/blender/blenloader/intern/versioning_260.cc index 89e0cc44a41..ed9553ac075 100644 --- a/source/blender/blenloader/intern/versioning_260.cc +++ b/source/blender/blenloader/intern/versioning_260.cc @@ -23,6 +23,7 @@ #include "DNA_dynamicpaint_types.h" #include "DNA_fluid_types.h" #include "DNA_genfile.h" +#include "DNA_key_types.h" #include "DNA_light_types.h" #include "DNA_linestyle_types.h" #include "DNA_material_types.h" @@ -32,6 +33,7 @@ #include "DNA_object_fluidsim_types.h" #include "DNA_object_types.h" #include "DNA_screen_types.h" +#include "DNA_sdna_types.h" #include "DNA_sequence_types.h" #include "DNA_space_types.h" #include "DNA_text_types.h" @@ -48,16 +50,20 @@ #include "BLI_math_vector.h" #include "BLI_string_utils.hh" +#include "BLT_translation.h" + #include "BKE_anim_visualization.h" #include "BKE_customdata.hh" #include "BKE_image.h" #include "BKE_main.hh" /* for Main */ +#include "BKE_mesh.hh" /* for ME_ defines (patching) */ #include "BKE_mesh_legacy_convert.hh" #include "BKE_modifier.hh" #include "BKE_node_runtime.hh" #include "BKE_node_tree_update.hh" #include "BKE_particle.h" -#include "BKE_scene.hh" +#include "BKE_pointcache.h" +#include "BKE_scene.h" #include "BKE_screen.hh" #include "BKE_text.h" /* for txt_extended_ascii_as_utf8 */ #include "BKE_texture.h" @@ -75,8 +81,9 @@ #include "NOD_common.h" #include "NOD_composite.hh" +#include "NOD_texture.h" -#include "BLO_readfile.hh" +#include "BLO_readfile.h" #include "readfile.hh" @@ -1726,6 +1733,14 @@ void blo_do_versions_260(FileData *fd, Library * /*lib*/, Main *bmain) if (!MAIN_VERSION_FILE_ATLEAST(bmain, 263, 10)) { { /* composite redesign */ + LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) { + if (scene->nodetree) { + if (scene->nodetree->chunksize == 0) { + scene->nodetree->chunksize = 256; + } + } + } + FOREACH_NODETREE_BEGIN (bmain, ntree, id) { if (ntree->type == NTREE_COMPOSIT) { LISTBASE_FOREACH (bNode *, node, &ntree->nodes) { diff --git a/source/blender/blenloader/intern/versioning_270.cc b/source/blender/blenloader/intern/versioning_270.cc index 30924010a6a..1f274170641 100644 --- a/source/blender/blenloader/intern/versioning_270.cc +++ b/source/blender/blenloader/intern/versioning_270.cc @@ -33,11 +33,13 @@ #include "DNA_mask_types.h" #include "DNA_mesh_types.h" #include "DNA_modifier_types.h" +#include "DNA_object_force_types.h" #include "DNA_object_types.h" #include "DNA_particle_types.h" #include "DNA_pointcache_types.h" #include "DNA_rigidbody_types.h" #include "DNA_screen_types.h" +#include "DNA_sdna_types.h" #include "DNA_sequence_types.h" #include "DNA_space_types.h" #include "DNA_view3d_types.h" @@ -46,7 +48,7 @@ #undef DNA_GENFILE_VERSIONING_MACROS -#include "BKE_anim_data.hh" +#include "BKE_anim_data.h" #include "BKE_animsys.h" #include "BKE_colortools.hh" #include "BKE_customdata.hh" @@ -54,9 +56,10 @@ #include "BKE_main.hh" #include "BKE_mask.h" #include "BKE_modifier.hh" -#include "BKE_node.hh" -#include "BKE_scene.hh" +#include "BKE_node.h" +#include "BKE_scene.h" #include "BKE_screen.hh" +#include "BKE_tracking.h" #include "DNA_material_types.h" #include "SEQ_effects.hh" @@ -69,10 +72,11 @@ #include "BLI_string.h" #include "BLI_string_utils.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" -#include "BLO_readfile.hh" +#include "BLO_readfile.h" +#include "NOD_common.h" #include "NOD_composite.hh" #include "NOD_socket.hh" @@ -1464,10 +1468,10 @@ void blo_do_versions_270(FileData *fd, Library * /*lib*/, Main *bmain) if (node->type == CMP_NODE_GLARE) { NodeGlare *ndg = static_cast(node->storage); switch (ndg->type) { - case CMP_NODE_GLARE_STREAKS: + case 2: /* Grrrr! magic numbers :( */ ndg->streaks = ndg->angle; break; - case CMP_NODE_GLARE_SIMPLE_STAR: + case 0: ndg->star_45 = ndg->angle != 0; break; default: diff --git a/source/blender/blenloader/intern/versioning_280.cc b/source/blender/blenloader/intern/versioning_280.cc index fb0dd443673..af3773f2a97 100644 --- a/source/blender/blenloader/intern/versioning_280.cc +++ b/source/blender/blenloader/intern/versioning_280.cc @@ -62,16 +62,21 @@ #undef DNA_GENFILE_VERSIONING_MACROS #include "BKE_animsys.h" -#include "BKE_blender.hh" -#include "BKE_collection.hh" +#include "BKE_blender.h" +#include "BKE_brush.hh" +#include "BKE_cloth.hh" +#include "BKE_collection.h" #include "BKE_colortools.hh" #include "BKE_constraint.h" #include "BKE_curveprofile.h" #include "BKE_customdata.hh" -#include "BKE_fcurve.hh" +#include "BKE_fcurve.h" #include "BKE_fcurve_driver.h" #include "BKE_freestyle.h" +#include "BKE_global.h" #include "BKE_gpencil_geom_legacy.h" +#include "BKE_gpencil_legacy.h" +#include "BKE_gpencil_modifier_legacy.h" #include "BKE_idprop.h" #include "BKE_key.hh" #include "BKE_layer.hh" @@ -79,10 +84,11 @@ #include "BKE_main.hh" #include "BKE_mesh.hh" #include "BKE_mesh_legacy_convert.hh" -#include "BKE_node.hh" +#include "BKE_node.h" +#include "BKE_node_tree_update.hh" #include "BKE_paint.hh" #include "BKE_pointcache.h" -#include "BKE_report.hh" +#include "BKE_report.h" #include "BKE_rigidbody.h" #include "BKE_screen.hh" #include "BKE_studiolight.h" @@ -98,10 +104,12 @@ #include "IMB_colormanagement.hh" #include "IMB_imbuf.hh" -#include "BLT_translation.hh" +#include "DEG_depsgraph.hh" + +#include "BLT_translation.h" #include "BLO_read_write.hh" -#include "BLO_readfile.hh" +#include "BLO_readfile.h" #include "readfile.hh" #include "versioning_common.hh" @@ -322,7 +330,6 @@ static void do_version_layers_to_collections(Main *bmain, Scene *scene) view_layer->pass_alpha_threshold = srl->pass_alpha_threshold; view_layer->samples = srl->samples; view_layer->mat_override = srl->mat_override; - view_layer->world_override = srl->world_override; BKE_freestyle_config_free(&view_layer->freestyle_config, true); view_layer->freestyle_config = srl->freestyleConfig; @@ -3460,7 +3467,7 @@ void blo_do_versions_280(FileData *fd, Library * /*lib*/, Main *bmain) scene->eevee.bloom_clamp = 0.0f; scene->eevee.motion_blur_samples = 8; - scene->eevee.motion_blur_shutter_deprecated = 0.5f; + scene->eevee.motion_blur_shutter = 0.5f; scene->eevee.shadow_method = SHADOW_ESM; scene->eevee.shadow_cube_size = 512; @@ -3531,7 +3538,7 @@ void blo_do_versions_280(FileData *fd, Library * /*lib*/, Main *bmain) EEVEE_GET_BOOL(props, gtao_bounce, SCE_EEVEE_GTAO_BOUNCE); EEVEE_GET_BOOL(props, dof_enable, SCE_EEVEE_DOF_ENABLED); EEVEE_GET_BOOL(props, bloom_enable, SCE_EEVEE_BLOOM_ENABLED); - EEVEE_GET_BOOL(props, motion_blur_enable, SCE_EEVEE_MOTION_BLUR_ENABLED_DEPRECATED); + EEVEE_GET_BOOL(props, motion_blur_enable, SCE_EEVEE_MOTION_BLUR_ENABLED); EEVEE_GET_BOOL(props, shadow_high_bitdepth, SCE_EEVEE_SHADOW_HIGH_BITDEPTH); EEVEE_GET_BOOL(props, taa_reprojection, SCE_EEVEE_TAA_REPROJECTION); // EEVEE_GET_BOOL(props, sss_enable, SCE_EEVEE_SSS_ENABLED); @@ -3580,7 +3587,7 @@ void blo_do_versions_280(FileData *fd, Library * /*lib*/, Main *bmain) EEVEE_GET_FLOAT(props, bloom_clamp); EEVEE_GET_INT(props, motion_blur_samples); - EEVEE_GET_FLOAT(props, motion_blur_shutter_deprecated); + EEVEE_GET_FLOAT(props, motion_blur_shutter); EEVEE_GET_INT(props, shadow_method); EEVEE_GET_INT(props, shadow_cube_size); diff --git a/source/blender/blenloader/intern/versioning_290.cc b/source/blender/blenloader/intern/versioning_290.cc index d5c94e47ebb..03d07c483e8 100644 --- a/source/blender/blenloader/intern/versioning_290.cc +++ b/source/blender/blenloader/intern/versioning_290.cc @@ -25,6 +25,7 @@ #include "DNA_cachefile_types.h" #include "DNA_collection_types.h" #include "DNA_constraint_types.h" +#include "DNA_curves_types.h" #include "DNA_fluid_types.h" #include "DNA_genfile.h" #include "DNA_gpencil_legacy_types.h" @@ -47,13 +48,15 @@ #undef DNA_GENFILE_VERSIONING_MACROS +#include "BKE_animsys.h" #include "BKE_armature.hh" -#include "BKE_collection.hh" +#include "BKE_attribute.hh" +#include "BKE_collection.h" #include "BKE_colortools.hh" #include "BKE_cryptomatte.h" #include "BKE_curve.hh" #include "BKE_customdata.hh" -#include "BKE_fcurve.hh" +#include "BKE_fcurve.h" #include "BKE_gpencil_legacy.h" #include "BKE_lib_id.hh" #include "BKE_main.hh" @@ -65,11 +68,15 @@ #include "IMB_imbuf.hh" #include "MEM_guardedalloc.h" +#include "RNA_access.hh" + #include "SEQ_proxy.hh" +#include "SEQ_render.hh" #include "SEQ_sequencer.hh" #include "SEQ_time.hh" +#include "SEQ_transform.hh" -#include "BLO_readfile.hh" +#include "BLO_readfile.h" #include "readfile.hh" #include "versioning_common.hh" @@ -1190,7 +1197,7 @@ void blo_do_versions_290(FileData *fd, Library * /*lib*/, Main *bmain) LISTBASE_FOREACH (ModifierData *, md, &object->modifiers) { if (md->type == eModifierType_Boolean) { BooleanModifierData *bmd = (BooleanModifierData *)md; - bmd->solver = eBooleanModifierSolver_Float; + bmd->solver = eBooleanModifierSolver_Fast; bmd->flag = eBooleanModifierFlag_Object; } } diff --git a/source/blender/blenloader/intern/versioning_300.cc b/source/blender/blenloader/intern/versioning_300.cc index 633e0100ffd..ec8dda52171 100644 --- a/source/blender/blenloader/intern/versioning_300.cc +++ b/source/blender/blenloader/intern/versioning_300.cc @@ -55,19 +55,19 @@ #undef DNA_GENFILE_VERSIONING_MACROS #include "BKE_action.h" -#include "BKE_anim_data.hh" +#include "BKE_anim_data.h" #include "BKE_animsys.h" #include "BKE_armature.hh" #include "BKE_asset.hh" #include "BKE_attribute.hh" -#include "BKE_collection.hh" +#include "BKE_collection.h" #include "BKE_colortools.hh" #include "BKE_curve.hh" #include "BKE_curves.hh" #include "BKE_customdata.hh" #include "BKE_data_transfer.h" #include "BKE_deform.hh" -#include "BKE_fcurve.hh" +#include "BKE_fcurve.h" #include "BKE_fcurve_driver.h" #include "BKE_idprop.h" #include "BKE_image.h" @@ -86,7 +86,7 @@ #include "RNA_enum_types.hh" #include "RNA_prototypes.h" -#include "BLO_readfile.hh" +#include "BLO_readfile.h" #include "readfile.hh" @@ -2658,7 +2658,7 @@ void blo_do_versions_300(FileData *fd, Library * /*lib*/, Main *bmain) LISTBASE_FOREACH (GpencilModifierData *, md, &ob->greasepencil_modifiers) { if (md->type == eGpencilModifierType_Lineart) { LineartGpencilModifierData *lmd = (LineartGpencilModifierData *)md; - lmd->flags |= MOD_LINEART_USE_CACHE; + lmd->flags |= LRT_GPENCIL_USE_CACHE; lmd->chain_smooth_tolerance = 0.2f; } } @@ -2897,7 +2897,7 @@ void blo_do_versions_300(FileData *fd, Library * /*lib*/, Main *bmain) LISTBASE_FOREACH (GpencilModifierData *, md, &ob->greasepencil_modifiers) { if (md->type == eGpencilModifierType_Lineart) { LineartGpencilModifierData *lmd = (LineartGpencilModifierData *)md; - lmd->calculation_flags |= MOD_LINEART_USE_CREASE_ON_SMOOTH_SURFACES; + lmd->calculation_flags |= LRT_USE_CREASE_ON_SMOOTH_SURFACES; } } } diff --git a/source/blender/blenloader/intern/versioning_400.cc b/source/blender/blenloader/intern/versioning_400.cc index af92f7cf3dd..40023fd08d7 100644 --- a/source/blender/blenloader/intern/versioning_400.cc +++ b/source/blender/blenloader/intern/versioning_400.cc @@ -11,6 +11,8 @@ #include #include +#include "CLG_log.h" + /* Define macros in `DNA_genfile.h`. */ #define DNA_GENFILE_VERSIONING_MACROS @@ -38,16 +40,16 @@ #include "BLI_assert.h" #include "BLI_listbase.h" #include "BLI_map.hh" -#include "BLI_math_rotation.h" #include "BLI_math_vector.h" #include "BLI_set.hh" #include "BLI_string.h" #include "BLI_string_ref.hh" -#include "BKE_anim_data.hh" +#include "BKE_anim_data.h" #include "BKE_animsys.h" #include "BKE_armature.hh" #include "BKE_attribute.hh" +#include "BKE_collection.h" #include "BKE_curve.hh" #include "BKE_effect.h" #include "BKE_grease_pencil.hh" @@ -55,19 +57,24 @@ #include "BKE_main.hh" #include "BKE_material.h" #include "BKE_mesh_legacy_convert.hh" +#include "BKE_node.hh" #include "BKE_node_runtime.hh" -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "BKE_tracking.h" #include "SEQ_iterator.hh" +#include "SEQ_retiming.hh" +#include "SEQ_sequencer.hh" #include "ANIM_armature_iter.hh" #include "ANIM_bone_collections.hh" -#include "BLT_translation.hh" +#include "ED_armature.hh" + +#include "BLT_translation.h" #include "BLO_read_write.hh" -#include "BLO_readfile.hh" +#include "BLO_readfile.h" #include "readfile.hh" @@ -1595,7 +1602,7 @@ static void version_principled_bsdf_specular_tint(bNodeTree *ntree) } } else if (base_color_sock->link) { - /* Metallic Mix is a no-op and equivalent to Base Color. */ + /* Metallic Mix is a no-op and equivalent to Base Color*/ metallic_mix_out = base_color_sock->link->fromsock; metallic_mix_node = base_color_sock->link->fromnode; } @@ -1940,13 +1947,6 @@ static bool seq_filter_bilinear_to_auto(Sequence *seq, void * /*user_data*/) return true; } -static void image_settings_avi_to_ffmpeg(Scene *scene) -{ - if (ELEM(scene->r.im_format.imtype, R_IMF_IMTYPE_AVIRAW, R_IMF_IMTYPE_AVIJPEG)) { - scene->r.im_format.imtype = R_IMF_IMTYPE_FFMPEG; - } -} - void blo_do_versions_400(FileData *fd, Library * /*lib*/, Main *bmain) { if (!MAIN_VERSION_FILE_ATLEAST(bmain, 400, 1)) { @@ -2887,6 +2887,15 @@ void blo_do_versions_400(FileData *fd, Library * /*lib*/, Main *bmain) } } + /* Keep point/spot light soft falloff for files created before 4.0. */ + if (!MAIN_VERSION_FILE_ATLEAST(bmain, 400, 0)) { + LISTBASE_FOREACH (Light *, light, &bmain->lights) { + if (light->type == LA_LOCAL || light->type == LA_SPOT) { + light->mode |= LA_USE_SOFT_FALLOFF; + } + } + } + if (!MAIN_VERSION_FILE_ATLEAST(bmain, 401, 21)) { LISTBASE_FOREACH (Brush *, brush, &bmain->brushes) { /* The `sculpt_flag` was used to store the `BRUSH_DIR_IN` @@ -2897,114 +2906,6 @@ void blo_do_versions_400(FileData *fd, Library * /*lib*/, Main *bmain) } } - /* Keep point/spot light soft falloff for files created before 4.0. */ - if (!MAIN_VERSION_FILE_ATLEAST(bmain, 400, 0)) { - LISTBASE_FOREACH (Light *, light, &bmain->lights) { - if (ELEM(light->type, LA_LOCAL, LA_SPOT)) { - light->mode |= LA_USE_SOFT_FALLOFF; - } - } - } - - if (!MAIN_VERSION_FILE_ATLEAST(bmain, 402, 1)) { - using namespace blender::bke::greasepencil; - /* Initialize newly added scale layer transform to one. */ - LISTBASE_FOREACH (GreasePencil *, grease_pencil, &bmain->grease_pencils) { - for (Layer *layer : grease_pencil->layers_for_write()) { - copy_v3_fl(layer->scale, 1.0f); - } - } - } - - if (!MAIN_VERSION_FILE_ATLEAST(bmain, 402, 2)) { - LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) { - bool is_cycles = scene && STREQ(scene->r.engine, RE_engine_id_CYCLES); - if (is_cycles) { - if (IDProperty *cscene = version_cycles_properties_from_ID(&scene->id)) { - int cposition = version_cycles_property_int(cscene, "motion_blur_position", 1); - BLI_assert(cposition >= 0 && cposition < 3); - int order_conversion[3] = {SCE_MB_START, SCE_MB_CENTER, SCE_MB_END}; - scene->r.motion_blur_position = order_conversion[std::clamp(cposition, 0, 2)]; - } - } - else { - SET_FLAG_FROM_TEST( - scene->r.mode, scene->eevee.flag & SCE_EEVEE_MOTION_BLUR_ENABLED_DEPRECATED, R_MBLUR); - scene->r.motion_blur_position = scene->eevee.motion_blur_position_deprecated; - scene->r.motion_blur_shutter = scene->eevee.motion_blur_shutter_deprecated; - } - } - } - - if (!MAIN_VERSION_FILE_ATLEAST(bmain, 402, 3)) { - constexpr int NTREE_EXECUTION_MODE_FULL_FRAME = 1; - - constexpr int NTREE_COM_GROUPNODE_BUFFER = 1 << 3; - constexpr int NTREE_COM_OPENCL = 1 << 1; - - FOREACH_NODETREE_BEGIN (bmain, ntree, id) { - if (ntree->type != NTREE_COMPOSIT) { - continue; - } - - ntree->flag &= ~(NTREE_COM_GROUPNODE_BUFFER | NTREE_COM_OPENCL); - - if (ntree->execution_mode == NTREE_EXECUTION_MODE_FULL_FRAME) { - ntree->execution_mode = NTREE_EXECUTION_MODE_CPU; - } - } - FOREACH_NODETREE_END; - } - - if (!MAIN_VERSION_FILE_ATLEAST(bmain, 402, 4)) { - if (!DNA_struct_member_exists(fd->filesdna, "SpaceImage", "float", "stretch_opacity")) { - LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) { - LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) { - LISTBASE_FOREACH (SpaceLink *, sl, &area->spacedata) { - if (sl->spacetype == SPACE_IMAGE) { - SpaceImage *sima = reinterpret_cast(sl); - sima->stretch_opacity = 0.9f; - } - } - } - } - } - } - - if (!MAIN_VERSION_FILE_ATLEAST(bmain, 402, 5)) { - LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) { - image_settings_avi_to_ffmpeg(scene); - } - } - - if (!MAIN_VERSION_FILE_ATLEAST(bmain, 402, 6)) { - LISTBASE_FOREACH (Brush *, brush, &bmain->brushes) { - if (BrushCurvesSculptSettings *settings = brush->curves_sculpt_settings) { - settings->flag |= BRUSH_CURVES_SCULPT_FLAG_INTERPOLATE_RADIUS; - settings->curve_radius = 0.01f; - } - } - } - - if (!MAIN_VERSION_FILE_ATLEAST(bmain, 402, 8)) { - LISTBASE_FOREACH (Light *, light, &bmain->lights) { - light->shadow_filter_radius = 3.0f; - } - } - - if (!MAIN_VERSION_FILE_ATLEAST(bmain, 402, 9)) { - const float default_snap_angle_increment = DEG2RADF(5.0f); - const float default_snap_angle_increment_precision = DEG2RADF(1.0f); - LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) { - scene->toolsettings->snap_angle_increment_2d = default_snap_angle_increment; - scene->toolsettings->snap_angle_increment_3d = default_snap_angle_increment; - scene->toolsettings->snap_angle_increment_2d_precision = - default_snap_angle_increment_precision; - scene->toolsettings->snap_angle_increment_3d_precision = - default_snap_angle_increment_precision; - } - } - /** * Always bump subversion in BKE_blender_version.h when adding versioning * code here, and wrap it inside a MAIN_VERSION_FILE_ATLEAST check. diff --git a/source/blender/blenloader/intern/versioning_common.cc b/source/blender/blenloader/intern/versioning_common.cc index a1f0d4e8582..1e428e3c975 100644 --- a/source/blender/blenloader/intern/versioning_common.cc +++ b/source/blender/blenloader/intern/versioning_common.cc @@ -26,13 +26,14 @@ #include "BKE_main.hh" #include "BKE_main_namemap.hh" #include "BKE_mesh_legacy_convert.hh" +#include "BKE_node.hh" #include "BKE_node_runtime.hh" #include "SEQ_sequencer.hh" #include "MEM_guardedalloc.h" -#include "BLO_readfile.hh" +#include "BLO_readfile.h" #include "readfile.hh" #include "versioning_common.hh" diff --git a/source/blender/blenloader/intern/versioning_defaults.cc b/source/blender/blenloader/intern/versioning_defaults.cc index e74f9ddc84f..cb25dfeffc0 100644 --- a/source/blender/blenloader/intern/versioning_defaults.cc +++ b/source/blender/blenloader/intern/versioning_defaults.cc @@ -22,6 +22,7 @@ #include "BLI_math_vector.h" #include "BLI_math_vector_types.hh" #include "BLI_string.h" +#include "BLI_system.h" #include "BLI_utildefines.h" #include "DNA_camera_types.h" @@ -32,6 +33,7 @@ #include "DNA_mask_types.h" #include "DNA_material_types.h" #include "DNA_mesh_types.h" +#include "DNA_meshdata_types.h" #include "DNA_object_types.h" #include "DNA_scene_types.h" #include "DNA_screen_types.h" @@ -54,15 +56,16 @@ #include "BKE_main_namemap.hh" #include "BKE_material.h" #include "BKE_mesh.hh" +#include "BKE_node.hh" #include "BKE_node_runtime.hh" #include "BKE_node_tree_update.hh" #include "BKE_paint.hh" #include "BKE_screen.hh" #include "BKE_workspace.h" -#include "BLO_readfile.hh" +#include "BLO_readfile.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "versioning_common.hh" @@ -317,7 +320,7 @@ static void blo_update_defaults_scene(Main *bmain, Scene *scene) /* New EEVEE defaults. */ scene->eevee.bloom_intensity = 0.05f; scene->eevee.bloom_clamp = 0.0f; - scene->eevee.motion_blur_shutter_deprecated = 0.5f; + scene->eevee.motion_blur_shutter = 0.5f; copy_v3_v3(scene->display.light_direction, blender::float3(M_SQRT1_3)); copy_v2_fl2(scene->safe_areas.title, 0.1f, 0.05f); @@ -329,14 +332,6 @@ static void blo_update_defaults_scene(Main *bmain, Scene *scene) /* Enable Soft Shadows by default. */ scene->eevee.flag |= SCE_EEVEE_SHADOW_SOFT; - /* Default Rotate Increment. */ - const float default_snap_angle_increment = DEG2RADF(5.0f); - scene->toolsettings->snap_angle_increment_2d = default_snap_angle_increment; - scene->toolsettings->snap_angle_increment_3d = default_snap_angle_increment; - const float default_snap_angle_increment_precision = DEG2RADF(1.0f); - scene->toolsettings->snap_angle_increment_2d_precision = default_snap_angle_increment_precision; - scene->toolsettings->snap_angle_increment_3d_precision = default_snap_angle_increment_precision; - /* Be sure `curfalloff` and primitive are initialized. */ ToolSettings *ts = scene->toolsettings; if (ts->gp_sculpt.cur_falloff == nullptr) { diff --git a/source/blender/blenloader/intern/versioning_dna.cc b/source/blender/blenloader/intern/versioning_dna.cc index ebe8fb710ff..5700442591d 100644 --- a/source/blender/blenloader/intern/versioning_dna.cc +++ b/source/blender/blenloader/intern/versioning_dna.cc @@ -14,7 +14,7 @@ #include "DNA_genfile.h" #include "DNA_listBase.h" -#include "BLO_readfile.hh" +#include "BLO_readfile.h" #include "readfile.hh" void blo_do_versions_dna(SDNA *sdna, const int versionfile, const int subversionfile) diff --git a/source/blender/blenloader/intern/versioning_legacy.cc b/source/blender/blenloader/intern/versioning_legacy.cc index 4effb383608..c17403bd3df 100644 --- a/source/blender/blenloader/intern/versioning_legacy.cc +++ b/source/blender/blenloader/intern/versioning_legacy.cc @@ -27,6 +27,7 @@ #include "DNA_effect_types.h" #include "DNA_key_types.h" #include "DNA_lattice_types.h" +#include "DNA_light_types.h" #include "DNA_material_types.h" #include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" @@ -57,13 +58,13 @@ #include "BKE_constraint.h" #include "BKE_customdata.hh" #include "BKE_deform.hh" -#include "BKE_fcurve.hh" +#include "BKE_fcurve.h" #include "BKE_lattice.hh" #include "BKE_main.hh" /* for Main */ #include "BKE_mesh.hh" /* for ME_ defines (patching) */ #include "BKE_mesh_legacy_convert.hh" #include "BKE_modifier.hh" -#include "BKE_node.hh" +#include "BKE_node.h" #include "BKE_object.hh" #include "BKE_particle.h" #include "BKE_pointcache.h" @@ -71,7 +72,7 @@ #include "SEQ_iterator.hh" #include "SEQ_sequencer.hh" -#include "BLO_readfile.hh" +#include "BLO_readfile.h" #include "readfile.hh" @@ -617,8 +618,8 @@ void blo_do_versions_pre250(FileData *fd, Library *lib, Main *bmain) if (bmain->versionfile <= 153) { Scene *sce = static_cast(bmain->scenes.first); while (sce) { - if (sce->r.motion_blur_shutter == 0.0f) { - sce->r.motion_blur_shutter = 1.0f; + if (sce->r.blurfac == 0.0f) { + sce->r.blurfac = 1.0f; } sce = static_cast(sce->id.next); } @@ -2592,7 +2593,7 @@ void blo_do_versions_pre250(FileData *fd, Library *lib, Main *bmain) ob = static_cast(ob->id.next)) { if (ob->pd) { - ob->pd->seed = (uint(ceil(BLI_time_now_seconds())) + 1) % 128; + ob->pd->seed = (uint(ceil(BLI_check_seconds_timer())) + 1) % 128; } } } diff --git a/source/blender/blenloader/intern/versioning_userdef.cc b/source/blender/blenloader/intern/versioning_userdef.cc index 63d2a158083..855bb4b52a4 100644 --- a/source/blender/blenloader/intern/versioning_userdef.cc +++ b/source/blender/blenloader/intern/versioning_userdef.cc @@ -19,6 +19,7 @@ #include "BLI_utildefines.h" #include "DNA_anim_types.h" +#include "DNA_collection_types.h" #include "DNA_curve_types.h" #include "DNA_scene_types.h" #include "DNA_space_types.h" @@ -33,10 +34,9 @@ #include "BKE_main.hh" #include "BKE_preferences.h" -#include "BLO_readfile.hh" -#include "BLO_userdef_default.h" +#include "BLO_readfile.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "GPU_platform.h" @@ -52,7 +52,7 @@ * If this is important we can set the translations as part of versioning preferences, * however that should only be done if there are important use-cases. */ #if 0 -# include "BLT_translation.hh" +# include "BLT_translation.h" #else # define N_(msgid) msgid #endif @@ -923,13 +923,6 @@ void blo_do_versions_userdef(UserDef *userdef) } } - if (!USER_VERSION_ATLEAST(402, 6)) { - if (BLI_listbase_is_empty(&userdef->extension_repos)) { - BKE_preferences_extension_repo_add_default(userdef); - BKE_preferences_extension_repo_add_default_user(userdef); - } - } - /** * Always bump subversion in BKE_blender_version.h when adding versioning * code here, and wrap it inside a USER_VERSION_ATLEAST check. @@ -953,11 +946,10 @@ void BLO_sanitize_experimental_features_userpref_blend(UserDef *userdef) * * At that time master already has its version bumped so its user preferences * are not touched by these settings. */ -#ifdef WITH_EXPERIMENTAL_FEATURES + if (BKE_blender_version_is_alpha()) { return; } -#endif MEMSET_STRUCT_AFTER(&userdef->experimental, 0, SANITIZE_AFTER_HERE); } diff --git a/source/blender/blenloader/intern/writefile.cc b/source/blender/blenloader/intern/writefile.cc index 4102f0d1aa5..e1640a18f69 100644 --- a/source/blender/blenloader/intern/writefile.cc +++ b/source/blender/blenloader/intern/writefile.cc @@ -91,7 +91,6 @@ #include "BLI_blenlib.h" #include "BLI_endian_defines.h" #include "BLI_endian_switch.h" -#include "BLI_implicit_sharing.hh" #include "BLI_link_utils.h" #include "BLI_linklist.h" #include "BLI_math_base.h" @@ -101,8 +100,8 @@ #include "MEM_guardedalloc.h" /* MEM_freeN */ #include "BKE_blender_version.h" -#include "BKE_bpath.hh" -#include "BKE_global.hh" /* For #Global `G`. */ +#include "BKE_bpath.h" +#include "BKE_global.h" /* For #Global `G`. */ #include "BKE_idprop.h" #include "BKE_idtype.hh" #include "BKE_layer.hh" @@ -113,13 +112,13 @@ #include "BKE_main_namemap.hh" #include "BKE_node.hh" #include "BKE_packedFile.h" -#include "BKE_report.hh" +#include "BKE_report.h" #include "BKE_workspace.h" #include "BLO_blend_defs.hh" #include "BLO_blend_validate.hh" #include "BLO_read_write.hh" -#include "BLO_readfile.hh" +#include "BLO_readfile.h" #include "BLO_undofile.hh" #include "BLO_writefile.hh" @@ -1825,33 +1824,6 @@ void BLO_write_string(BlendWriter *writer, const char *data_ptr) } } -void BLO_write_shared(BlendWriter *writer, - const void *data, - const size_t approximate_size_in_bytes, - const blender::ImplicitSharingInfo *sharing_info, - const blender::FunctionRef write_fn) -{ - if (data == nullptr) { - return; - } - if (BLO_write_is_undo(writer)) { - MemFile &memfile = *writer->wd->mem.written_memfile; - if (sharing_info != nullptr) { - if (memfile.shared_storage == nullptr) { - memfile.shared_storage = MEM_new(__func__); - } - if (memfile.shared_storage->map.add(data, sharing_info)) { - /* The undo-step takes (shared) ownership of the data, which also makes it immutable. */ - sharing_info->add_user(); - /* This size is an estimate, but good enough to count data with many users less. */ - memfile.size += approximate_size_in_bytes / sharing_info->strong_users(); - return; - } - } - } - write_fn(); -} - bool BLO_write_is_undo(BlendWriter *writer) { return writer->wd->use_memfile; diff --git a/source/blender/blenloader/tests/blendfile_loading_base_test.cc b/source/blender/blenloader/tests/blendfile_loading_base_test.cc index ef07b240032..d50168523e8 100644 --- a/source/blender/blenloader/tests/blendfile_loading_base_test.cc +++ b/source/blender/blenloader/tests/blendfile_loading_base_test.cc @@ -6,10 +6,10 @@ #include "MEM_guardedalloc.h" #include "BKE_appdir.hh" -#include "BKE_blender.hh" -#include "BKE_callbacks.hh" +#include "BKE_blender.h" +#include "BKE_callbacks.h" #include "BKE_context.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_idtype.hh" #include "BKE_image.h" #include "BKE_layer.hh" @@ -17,7 +17,7 @@ #include "BKE_mball_tessellate.hh" #include "BKE_modifier.hh" #include "BKE_node.hh" -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "BKE_vfont.hh" #include "BLF_api.hh" @@ -25,7 +25,7 @@ #include "BLI_path_util.h" #include "BLI_threads.h" -#include "BLO_readfile.hh" +#include "BLO_readfile.h" #include "DEG_depsgraph.hh" #include "DEG_depsgraph_build.hh" diff --git a/source/blender/blentranslation/BLT_lang.hh b/source/blender/blentranslation/BLT_lang.h similarity index 88% rename from source/blender/blentranslation/BLT_lang.hh rename to source/blender/blentranslation/BLT_lang.h index 6f11f77d2b9..c15ffb7e27b 100644 --- a/source/blender/blentranslation/BLT_lang.hh +++ b/source/blender/blentranslation/BLT_lang.h @@ -8,21 +8,23 @@ #pragma once -struct EnumPropertyItem; +#ifdef __cplusplus +extern "C" { +#endif /* Search the path directory to the locale files, this try all * the case for Linux, Win and Mac. * Also dynamically builds locales and locales' menu from "languages" text file. */ -void BLT_lang_init(); +void BLT_lang_init(void); /* Free languages and locales_menu arrays created by BLT_lang_init. */ -void BLT_lang_free(); +void BLT_lang_free(void); /* Set the current locale. */ void BLT_lang_set(const char *); /* Get the current locale ([partial] ISO code, e.g. `pt_BR`). */ -const char *BLT_lang_get(); +const char *BLT_lang_get(void); /* Get locale's elements (if relevant pointer is not NULL and element actually exists, e.g. * if there is no variant, *variant and *language_variant will always be NULL). @@ -46,4 +48,8 @@ void BLT_lang_locale_explode(const char *locale, char **language_variant); /* Get EnumPropertyItem's for translations menu. */ -EnumPropertyItem *BLT_lang_RNA_enum_properties(); +struct EnumPropertyItem *BLT_lang_RNA_enum_properties(void); + +#ifdef __cplusplus +}; +#endif diff --git a/source/blender/blentranslation/BLT_translation.hh b/source/blender/blentranslation/BLT_translation.h similarity index 96% rename from source/blender/blentranslation/BLT_translation.hh rename to source/blender/blentranslation/BLT_translation.h index 00378ab489d..ccdd69ed278 100644 --- a/source/blender/blentranslation/BLT_translation.hh +++ b/source/blender/blentranslation/BLT_translation.h @@ -12,6 +12,10 @@ #define TEXT_DOMAIN_NAME "blender" +#ifdef __cplusplus +extern "C" { +#endif + bool BLT_is_default_context(const char *msgctxt); const char *BLT_pgettext(const char *msgctxt, const char *msgid); @@ -21,11 +25,11 @@ const char *BLT_pgettext(const char *msgctxt, const char *msgid); * - tooltips only include the popup tooltips when hovering a button. * - report is for longer, additional information displayed in the UI, such as error messages. * - new_dataname is the actual user-created data such as objects, meshes, etc. */ -bool BLT_translate(); -bool BLT_translate_iface(); -bool BLT_translate_tooltips(); -bool BLT_translate_reports(); -bool BLT_translate_new_dataname(); +bool BLT_translate(void); +bool BLT_translate_iface(void); +bool BLT_translate_tooltips(void); +bool BLT_translate_reports(void); +bool BLT_translate_new_dataname(void); const char *BLT_translate_do(const char *msgctxt, const char *msgid); const char *BLT_translate_do_iface(const char *msgctxt, const char *msgid); const char *BLT_translate_do_tooltip(const char *msgctxt, const char *msgid); @@ -84,9 +88,8 @@ const char *BLT_translate_do_new_dataname(const char *msgctxt, const char *msgid #define BLT_I18NCONTEXT_PLURAL "Plural" /* ID-types contexts. */ -/* WARNING! Keep it in sync with ID-types in `blenkernel/intern/idtype.cc`. */ +/* WARNING! Keep it in sync with idtypes in blenkernel/intern/idcode.c */ #define BLT_I18NCONTEXT_ID_ACTION "Action" -#define BLT_I18NCONTEXT_ID_ANIMATION "Animation" #define BLT_I18NCONTEXT_ID_ARMATURE "Armature" #define BLT_I18NCONTEXT_ID_BRUSH "Brush" #define BLT_I18NCONTEXT_ID_CACHEFILE "CacheFile" @@ -142,11 +145,11 @@ const char *BLT_translate_do_new_dataname(const char *msgctxt, const char *msgid #define BLT_I18NCONTEXT_UNIT "Unit" /* Helper for bpy.app.i18n object... */ -struct BLT_i18n_contexts_descriptor { +typedef struct { const char *c_id; const char *py_id; const char *value; -}; +} BLT_i18n_contexts_descriptor; #define BLT_I18NCONTEXTS_ITEM(ctxt_id, py_id) \ { \ @@ -215,3 +218,7 @@ struct BLT_i18n_contexts_descriptor { NULL, NULL, NULL \ } \ } + +#ifdef __cplusplus +}; +#endif diff --git a/source/blender/blentranslation/CMakeLists.txt b/source/blender/blentranslation/CMakeLists.txt index af0aaf3974b..841bc181912 100644 --- a/source/blender/blentranslation/CMakeLists.txt +++ b/source/blender/blentranslation/CMakeLists.txt @@ -17,8 +17,8 @@ set(SRC intern/blt_lang.cc intern/blt_translation.cc - BLT_lang.hh - BLT_translation.hh + BLT_lang.h + BLT_translation.h ) set(LIB diff --git a/source/blender/blentranslation/intern/blt_lang.cc b/source/blender/blentranslation/intern/blt_lang.cc index efdf8f09848..6da6d929aa8 100644 --- a/source/blender/blentranslation/intern/blt_lang.cc +++ b/source/blender/blentranslation/intern/blt_lang.cc @@ -18,8 +18,8 @@ #include "RNA_types.hh" -#include "BLT_lang.hh" /* own include */ -#include "BLT_translation.hh" +#include "BLT_lang.h" /* own include */ +#include "BLT_translation.h" #include "BLI_path_util.h" #include "BLI_string.h" diff --git a/source/blender/blentranslation/intern/blt_translation.cc b/source/blender/blentranslation/intern/blt_translation.cc index 257be744cdd..b7e9cf38094 100644 --- a/source/blender/blentranslation/intern/blt_translation.cc +++ b/source/blender/blentranslation/intern/blt_translation.cc @@ -12,7 +12,7 @@ #include #include -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "MEM_guardedalloc.h" diff --git a/source/blender/bmesh/intern/bmesh_core.cc b/source/blender/bmesh/intern/bmesh_core.cc index 1d5b116b2d6..8b8c370a015 100644 --- a/source/blender/bmesh/intern/bmesh_core.cc +++ b/source/blender/bmesh/intern/bmesh_core.cc @@ -16,7 +16,7 @@ #include "BLI_utildefines_stack.h" #include "BLI_vector.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_customdata.hh" #include "BKE_mesh.hh" diff --git a/source/blender/bmesh/intern/bmesh_delete.cc b/source/blender/bmesh/intern/bmesh_delete.cc index fe6bc94b353..afe0b4a8e3a 100644 --- a/source/blender/bmesh/intern/bmesh_delete.cc +++ b/source/blender/bmesh/intern/bmesh_delete.cc @@ -11,6 +11,7 @@ #include "BLI_utildefines.h" #include "bmesh.hh" +#include "intern/bmesh_private.hh" /* BMO functions */ diff --git a/source/blender/bmesh/intern/bmesh_interp.cc b/source/blender/bmesh/intern/bmesh_interp.cc index e78c011d531..a2deece1932 100644 --- a/source/blender/bmesh/intern/bmesh_interp.cc +++ b/source/blender/bmesh/intern/bmesh_interp.cc @@ -18,6 +18,7 @@ #include "BLI_math_matrix.h" #include "BLI_math_vector.h" #include "BLI_memarena.h" +#include "BLI_string.h" #include "BLI_task.h" #include "BKE_attribute.hh" diff --git a/source/blender/bmesh/intern/bmesh_iterators.cc b/source/blender/bmesh/intern/bmesh_iterators.cc index 1fcc11f2700..9e914e79a03 100644 --- a/source/blender/bmesh/intern/bmesh_iterators.cc +++ b/source/blender/bmesh/intern/bmesh_iterators.cc @@ -12,6 +12,7 @@ #include "MEM_guardedalloc.h" +#include "BLI_bitmap.h" #include "BLI_utildefines.h" #include "bmesh.hh" diff --git a/source/blender/bmesh/intern/bmesh_log.cc b/source/blender/bmesh/intern/bmesh_log.cc index 855aa160cc6..c4f95e7f6a9 100644 --- a/source/blender/bmesh/intern/bmesh_log.cc +++ b/source/blender/bmesh/intern/bmesh_log.cc @@ -31,7 +31,7 @@ #include "bmesh_log.hh" #include "range_tree.h" -#include "BLI_strict_flags.h" /* Keep last. */ +#include "BLI_strict_flags.h" struct BMLogEntry { BMLogEntry *next, *prev; @@ -918,17 +918,6 @@ void BM_log_before_all_removed(BMesh *bm, BMLog *log) } } -const float *BM_log_find_original_vert_co(BMLog *log, BMVert *v) -{ - BMLogEntry *entry = log->current_entry; - const BMLogVert *lv; - uint v_id = bm_log_vert_id_get(log, v); - void *key = POINTER_FROM_UINT(v_id); - - lv = static_cast(BLI_ghash_lookup(entry->modified_verts, key)); - return lv == nullptr ? nullptr : lv->co; -} - const float *BM_log_original_vert_co(BMLog *log, BMVert *v) { BMLogEntry *entry = log->current_entry; diff --git a/source/blender/bmesh/intern/bmesh_log.hh b/source/blender/bmesh/intern/bmesh_log.hh index 302bd8f784e..a33627dbfe1 100644 --- a/source/blender/bmesh/intern/bmesh_log.hh +++ b/source/blender/bmesh/intern/bmesh_log.hh @@ -180,15 +180,6 @@ void BM_log_all_added(BMesh *bm, BMLog *log); /** Log all vertices/faces in the #BMesh as removed. */ void BM_log_before_all_removed(BMesh *bm, BMLog *log); -/** - * Search the log for the original vertex coordinates. - * - * Does not modify the log or the vertex. - * - * \return the pointer or nullptr if the vertex isn't found. - */ -const float *BM_log_find_original_vert_co(BMLog *log, BMVert *v); - /** * Get the logged coordinates of a vertex. * diff --git a/source/blender/bmesh/intern/bmesh_mesh.cc b/source/blender/bmesh/intern/bmesh_mesh.cc index 747fa97d37b..5474003ea74 100644 --- a/source/blender/bmesh/intern/bmesh_mesh.cc +++ b/source/blender/bmesh/intern/bmesh_mesh.cc @@ -11,6 +11,7 @@ #include "MEM_guardedalloc.h" #include "DNA_listBase.h" +#include "DNA_scene_types.h" #include "BLI_listbase.h" #include "BLI_math_matrix.h" diff --git a/source/blender/bmesh/intern/bmesh_mesh_convert.cc b/source/blender/bmesh/intern/bmesh_mesh_convert.cc index a199a0b0975..f4b6c0a3c5a 100644 --- a/source/blender/bmesh/intern/bmesh_mesh_convert.cc +++ b/source/blender/bmesh/intern/bmesh_mesh_convert.cc @@ -265,7 +265,7 @@ void BM_mesh_bm_from_me(BMesh *bm, const Mesh *mesh, const BMeshFromMeshParams * BLI_SCOPED_DEFER([&]() { for (const std::string &name : temporary_layers_to_delete) { - CustomData_free_layer_named(&mesh_ldata, name, mesh->corners_num); + CustomData_free_layer_named(&mesh_ldata, name.c_str(), mesh->corners_num); } MEM_SAFE_FREE(mesh_vdata.layers); @@ -1622,10 +1622,7 @@ void BM_mesh_bm_to_me(Main *bmain, BMesh *bm, Mesh *mesh, const BMeshToMeshParam material_index.finish(); } -void BM_mesh_bm_to_me_compact(BMesh &bm, - Mesh &mesh, - const CustomData_MeshMasks *mask, - const bool add_mesh_attributes) +void BM_mesh_bm_to_me_for_eval(BMesh &bm, Mesh &mesh, const CustomData_MeshMasks *cd_mask_extra) { /* NOTE: The function is called from multiple threads with the same input BMesh and different * mesh objects. */ @@ -1633,6 +1630,7 @@ void BM_mesh_bm_to_me_compact(BMesh &bm, using namespace blender; /* Must be an empty mesh. */ BLI_assert(mesh.verts_num == 0); + BLI_assert(cd_mask_extra == nullptr || (cd_mask_extra->vmask & CD_MASK_SHAPEKEY) == 0); /* Just in case, clear the derived geometry caches from the input mesh. */ BKE_mesh_runtime_clear_geometry(&mesh); @@ -1644,8 +1642,6 @@ void BM_mesh_bm_to_me_compact(BMesh &bm, mesh.runtime->deformed_only = true; - const bool use_threading = (mesh.faces_num + mesh.edges_num) > 1024; - /* In a first pass, update indices of BMesh elements and build tables for easy iteration later. * Also check if some optional mesh attributes should be added in the next step. Since each * domain has no effect on others, process the independent domains on separate threads. */ @@ -1659,14 +1655,13 @@ void BM_mesh_bm_to_me_compact(BMesh &bm, bool need_sharp_edge = false; bool need_sharp_face = false; bool need_uv_seams = false; - Array vert_table; Array edge_table; Array face_table; Array loop_table; Vector loop_layers_not_to_copy; threading::parallel_invoke( - use_threading, + (mesh.faces_num + mesh.edges_num) > 1024, [&]() { vert_table.reinitialize(bm.totvert); bm_vert_table_build(bm, vert_table, need_select_vert, need_hide_vert); @@ -1693,16 +1688,22 @@ void BM_mesh_bm_to_me_compact(BMesh &bm, }); bm.elem_index_dirty &= ~(BM_VERT | BM_EDGE | BM_FACE | BM_LOOP); - if (mask) { - CustomData_merge_layout(&bm.vdata, &mesh.vert_data, mask->vmask, CD_CONSTRUCT, mesh.verts_num); - CustomData_merge_layout(&bm.edata, &mesh.edge_data, mask->emask, CD_CONSTRUCT, mesh.edges_num); - CustomData_merge_layout( - &bm.ldata, &mesh.corner_data, mask->lmask, CD_CONSTRUCT, mesh.corners_num); - CustomData_merge_layout(&bm.pdata, &mesh.face_data, mask->pmask, CD_CONSTRUCT, mesh.faces_num); + /* Don't process shape-keys. We only feed them through the modifier stack as needed, + * e.g. for applying modifiers or the like. */ + CustomData_MeshMasks mask = CD_MASK_DERIVEDMESH; + if (cd_mask_extra != nullptr) { + CustomData_MeshMasks_update(&mask, cd_mask_extra); } + mask.vmask &= ~CD_MASK_SHAPEKEY; + CustomData_merge_layout(&bm.vdata, &mesh.vert_data, mask.vmask, CD_CONSTRUCT, mesh.verts_num); + CustomData_merge_layout(&bm.edata, &mesh.edge_data, mask.emask, CD_CONSTRUCT, mesh.edges_num); + CustomData_merge_layout( + &bm.ldata, &mesh.corner_data, mask.lmask, CD_CONSTRUCT, mesh.corners_num); + CustomData_merge_layout(&bm.pdata, &mesh.face_data, mask.pmask, CD_CONSTRUCT, mesh.faces_num); /* Add optional mesh attributes before parallel iteration. */ assert_bmesh_has_no_mesh_only_attributes(bm); + bke::MutableAttributeAccessor attrs = mesh.attributes_for_write(); bke::SpanAttributeWriter select_vert; bke::SpanAttributeWriter hide_vert; bke::SpanAttributeWriter select_edge; @@ -1713,48 +1714,41 @@ void BM_mesh_bm_to_me_compact(BMesh &bm, bke::SpanAttributeWriter hide_poly; bke::SpanAttributeWriter sharp_face; bke::SpanAttributeWriter material_index; - - if (add_mesh_attributes) { - bke::MutableAttributeAccessor attrs = mesh.attributes_for_write(); - if (need_select_vert) { - select_vert = attrs.lookup_or_add_for_write_only_span(".select_vert", - AttrDomain::Point); - } - if (need_hide_vert) { - hide_vert = attrs.lookup_or_add_for_write_only_span(".hide_vert", AttrDomain::Point); - } - if (need_select_edge) { - select_edge = attrs.lookup_or_add_for_write_only_span(".select_edge", - AttrDomain::Edge); - } - if (need_sharp_edge) { - sharp_edge = attrs.lookup_or_add_for_write_only_span("sharp_edge", AttrDomain::Edge); - } - if (need_uv_seams) { - uv_seams = attrs.lookup_or_add_for_write_only_span(".uv_seam", AttrDomain::Edge); - } - if (need_hide_edge) { - hide_edge = attrs.lookup_or_add_for_write_only_span(".hide_edge", AttrDomain::Edge); - } - if (need_select_poly) { - select_poly = attrs.lookup_or_add_for_write_only_span(".select_poly", + if (need_select_vert) { + select_vert = attrs.lookup_or_add_for_write_only_span(".select_vert", AttrDomain::Point); + } + if (need_hide_vert) { + hide_vert = attrs.lookup_or_add_for_write_only_span(".hide_vert", AttrDomain::Point); + } + if (need_select_edge) { + select_edge = attrs.lookup_or_add_for_write_only_span(".select_edge", AttrDomain::Edge); + } + if (need_sharp_edge) { + sharp_edge = attrs.lookup_or_add_for_write_only_span("sharp_edge", AttrDomain::Edge); + } + if (need_uv_seams) { + uv_seams = attrs.lookup_or_add_for_write_only_span(".uv_seam", AttrDomain::Edge); + } + if (need_hide_edge) { + hide_edge = attrs.lookup_or_add_for_write_only_span(".hide_edge", AttrDomain::Edge); + } + if (need_select_poly) { + select_poly = attrs.lookup_or_add_for_write_only_span(".select_poly", AttrDomain::Face); + } + if (need_hide_poly) { + hide_poly = attrs.lookup_or_add_for_write_only_span(".hide_poly", AttrDomain::Face); + } + if (need_sharp_face) { + sharp_face = attrs.lookup_or_add_for_write_only_span("sharp_face", AttrDomain::Face); + } + if (need_material_index) { + material_index = attrs.lookup_or_add_for_write_only_span("material_index", AttrDomain::Face); - } - if (need_hide_poly) { - hide_poly = attrs.lookup_or_add_for_write_only_span(".hide_poly", AttrDomain::Face); - } - if (need_sharp_face) { - sharp_face = attrs.lookup_or_add_for_write_only_span("sharp_face", AttrDomain::Face); - } - if (need_material_index) { - material_index = attrs.lookup_or_add_for_write_only_span("material_index", - AttrDomain::Face); - } } /* Loop over all elements in parallel, copying attributes and building the Mesh topology. */ threading::parallel_invoke( - use_threading, + (mesh.faces_num + mesh.edges_num) > 1024, [&]() { bm_to_mesh_verts(bm, vert_table, mesh, select_vert.span, hide_vert.span); }, [&]() { bm_to_mesh_edges(bm, @@ -1773,9 +1767,6 @@ void BM_mesh_bm_to_me_compact(BMesh &bm, hide_poly.span, sharp_face.span, material_index.span); - if (bm.act_face) { - mesh.act_face = BM_elem_index_get(bm.act_face); - } }, [&]() { bm_to_mesh_loops(bm, loop_table, mesh); @@ -1784,29 +1775,14 @@ void BM_mesh_bm_to_me_compact(BMesh &bm, } }); - if (add_mesh_attributes) { - select_vert.finish(); - hide_vert.finish(); - select_edge.finish(); - hide_edge.finish(); - sharp_edge.finish(); - uv_seams.finish(); - select_poly.finish(); - hide_poly.finish(); - sharp_face.finish(); - material_index.finish(); - } -} - -void BM_mesh_bm_to_me_for_eval(BMesh &bm, Mesh &mesh, const CustomData_MeshMasks *cd_mask_extra) -{ - /* Don't process shape-keys. We only feed them through the modifier stack as needed, - * e.g. for applying modifiers or the like. */ - CustomData_MeshMasks mask = CD_MASK_DERIVEDMESH; - if (cd_mask_extra != nullptr) { - CustomData_MeshMasks_update(&mask, cd_mask_extra); - } - mask.vmask &= ~CD_MASK_SHAPEKEY; - - BM_mesh_bm_to_me_compact(bm, mesh, &mask, true); + select_vert.finish(); + hide_vert.finish(); + select_edge.finish(); + hide_edge.finish(); + sharp_edge.finish(); + uv_seams.finish(); + select_poly.finish(); + hide_poly.finish(); + sharp_face.finish(); + material_index.finish(); } diff --git a/source/blender/bmesh/intern/bmesh_mesh_convert.hh b/source/blender/bmesh/intern/bmesh_mesh_convert.hh index e36bbc77b79..44249e0deba 100644 --- a/source/blender/bmesh/intern/bmesh_mesh_convert.hh +++ b/source/blender/bmesh/intern/bmesh_mesh_convert.hh @@ -90,16 +90,3 @@ void BM_mesh_bm_to_me(struct Main *bmain, BMesh *bm, Mesh *mesh, const BMeshToMe * \note Was `cddm_from_bmesh_ex` in 2.7x, removed `MFace` support. */ void BM_mesh_bm_to_me_for_eval(BMesh &bm, Mesh &mesh, const CustomData_MeshMasks *cd_mask_extra); - -/** - * A version of #BM_mesh_bm_to_me_for_eval but copying data layers and Mesh attributes is optional. - * It also allows shape-keys but don't re-assigns shape-key indices. - * - * \param mask Custom data masks to control which layers are copied. - * If nullptr, no layer data is copied. - * \param add_mesh_attributes If true, adds mesh attributes during the conversion. - */ -void BM_mesh_bm_to_me_compact(BMesh &bm, - Mesh &mesh, - const CustomData_MeshMasks *mask, - bool add_mesh_attributes); diff --git a/source/blender/bmesh/intern/bmesh_mesh_debug.cc b/source/blender/bmesh/intern/bmesh_mesh_debug.cc index de4a81e52ce..b3671991886 100644 --- a/source/blender/bmesh/intern/bmesh_mesh_debug.cc +++ b/source/blender/bmesh/intern/bmesh_mesh_debug.cc @@ -13,7 +13,7 @@ #ifndef NDEBUG -# include +# include # include "MEM_guardedalloc.h" diff --git a/source/blender/bmesh/intern/bmesh_mesh_duplicate.cc b/source/blender/bmesh/intern/bmesh_mesh_duplicate.cc index f2b76cc6e16..6d2221e8b8a 100644 --- a/source/blender/bmesh/intern/bmesh_mesh_duplicate.cc +++ b/source/blender/bmesh/intern/bmesh_mesh_duplicate.cc @@ -8,11 +8,15 @@ * Duplicate geometry from one mesh from another. */ +#include "DNA_object_types.h" + #include "MEM_guardedalloc.h" #include "BLI_alloca.h" +#include "BLI_math_vector.h" #include "bmesh.hh" +#include "intern/bmesh_private.hh" /* for element checking */ static BMVert *bm_vert_copy(BMesh *bm_dst, const std::optional &cd_vert_map, diff --git a/source/blender/bmesh/intern/bmesh_mesh_normals.cc b/source/blender/bmesh/intern/bmesh_mesh_normals.cc index f2571d0ae3c..5acf31e3e62 100644 --- a/source/blender/bmesh/intern/bmesh_mesh_normals.cc +++ b/source/blender/bmesh/intern/bmesh_mesh_normals.cc @@ -24,7 +24,7 @@ #include "BKE_customdata.hh" #include "BKE_editmesh.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_mesh.hh" #include "intern/bmesh_private.hh" diff --git a/source/blender/bmesh/intern/bmesh_mesh_partial_update.cc b/source/blender/bmesh/intern/bmesh_mesh_partial_update.cc index 70ec7a4dedb..3ea4551b6c7 100644 --- a/source/blender/bmesh/intern/bmesh_mesh_partial_update.cc +++ b/source/blender/bmesh/intern/bmesh_mesh_partial_update.cc @@ -35,9 +35,13 @@ * \note Others can be added as needed. */ +#include "DNA_object_types.h" + #include "MEM_guardedalloc.h" +#include "BLI_alloca.h" #include "BLI_bitmap.h" +#include "BLI_math_vector.h" #include "bmesh.hh" diff --git a/source/blender/bmesh/intern/bmesh_mesh_tessellate.cc b/source/blender/bmesh/intern/bmesh_mesh_tessellate.cc index 518f2b93521..b8494e25d0b 100644 --- a/source/blender/bmesh/intern/bmesh_mesh_tessellate.cc +++ b/source/blender/bmesh/intern/bmesh_mesh_tessellate.cc @@ -13,7 +13,9 @@ #include "MEM_guardedalloc.h" +#include "BLI_alloca.h" #include "BLI_heap.h" +#include "BLI_linklist.h" #include "BLI_math_geom.h" #include "BLI_math_matrix.h" #include "BLI_memarena.h" @@ -22,6 +24,7 @@ #include "BLI_task.h" #include "bmesh.hh" +#include "bmesh_tools.hh" /** * On systems with 32+ cores, diff --git a/source/blender/bmesh/intern/bmesh_mesh_validate.cc b/source/blender/bmesh/intern/bmesh_mesh_validate.cc index 8a6adfe549d..3e81f446064 100644 --- a/source/blender/bmesh/intern/bmesh_mesh_validate.cc +++ b/source/blender/bmesh/intern/bmesh_mesh_validate.cc @@ -28,13 +28,6 @@ errtot++; \ } \ (void)0 -# elif defined(_MSVC_TRADITIONAL) && !_MSVC_TRADITIONAL -# define ERRMSG(format, ...) \ - { \ - fprintf(stderr, "%s: " format ", " AT "\n", __func__, ##__VA_ARGS__); \ - errtot++; \ - } \ - (void)0 # else # define ERRMSG(format, ...) \ { \ diff --git a/source/blender/bmesh/intern/bmesh_operators.cc b/source/blender/bmesh/intern/bmesh_operators.cc index d45466122d6..dc4493acc70 100644 --- a/source/blender/bmesh/intern/bmesh_operators.cc +++ b/source/blender/bmesh/intern/bmesh_operators.cc @@ -18,7 +18,7 @@ #include "BLI_string.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "bmesh.hh" #include "intern/bmesh_private.hh" diff --git a/source/blender/bmesh/intern/bmesh_polygon.cc b/source/blender/bmesh/intern/bmesh_polygon.cc index bfc889d30b0..b5c6c88a48c 100644 --- a/source/blender/bmesh/intern/bmesh_polygon.cc +++ b/source/blender/bmesh/intern/bmesh_polygon.cc @@ -15,6 +15,7 @@ #include "MEM_guardedalloc.h" #include "BLI_alloca.h" +#include "BLI_heap.h" #include "BLI_linklist.h" #include "BLI_math_base.hh" #include "BLI_math_geom.h" diff --git a/source/blender/bmesh/intern/bmesh_polygon_edgenet.cc b/source/blender/bmesh/intern/bmesh_polygon_edgenet.cc index 5e5aa0fbfd7..0351f136050 100644 --- a/source/blender/bmesh/intern/bmesh_polygon_edgenet.cc +++ b/source/blender/bmesh/intern/bmesh_polygon_edgenet.cc @@ -1642,7 +1642,7 @@ finally: /* Sanity check: ensure we don't have connecting edges before splicing begins. */ # ifndef NDEBUG { - TempVertPair *tvp = temp_vert_pairs.list; + struct TempVertPair *tvp = temp_vert_pairs.list; do { /* We must _never_ create connections here * (in case the islands can't have a connection at all). */ diff --git a/source/blender/bmesh/intern/bmesh_query.cc b/source/blender/bmesh/intern/bmesh_query.cc index ea0dba07205..1d007e574ae 100644 --- a/source/blender/bmesh/intern/bmesh_query.cc +++ b/source/blender/bmesh/intern/bmesh_query.cc @@ -2086,7 +2086,7 @@ static double bm_mesh_calc_volume_face(const BMFace *f) } double BM_mesh_calc_volume(BMesh *bm, bool is_signed) { - /* warning, calls its own tessellation function, may be slow */ + /* warning, calls own tessellation function, may be slow */ double vol = 0.0; BMFace *f; BMIter fiter; diff --git a/source/blender/bmesh/intern/bmesh_query_uv.cc b/source/blender/bmesh/intern/bmesh_query_uv.cc index a22c3ae8365..7c94997eb7d 100644 --- a/source/blender/bmesh/intern/bmesh_query_uv.cc +++ b/source/blender/bmesh/intern/bmesh_query_uv.cc @@ -9,14 +9,17 @@ #include "MEM_guardedalloc.h" #include "BLI_array.hh" +#include "BLI_linklist.h" #include "BLI_math_geom.h" #include "BLI_math_vector.h" #include "BLI_math_vector_types.hh" +#include "BLI_utildefines_stack.h" #include "BKE_attribute.hh" #include "BKE_customdata.hh" #include "bmesh.hh" +#include "intern/bmesh_private.hh" BMUVOffsets BM_uv_map_get_offsets_from_layer(const BMesh *bm, const int layer) { diff --git a/source/blender/bmesh/operators/bmo_bevel.cc b/source/blender/bmesh/operators/bmo_bevel.cc index 4812d287c45..c46a7b33195 100644 --- a/source/blender/bmesh/operators/bmo_bevel.cc +++ b/source/blender/bmesh/operators/bmo_bevel.cc @@ -10,6 +10,7 @@ #include "BLI_utildefines.h" +#include "BKE_curveprofile.h" #include "DNA_curveprofile_types.h" #include "bmesh.hh" #include "bmesh_tools.hh" diff --git a/source/blender/bmesh/operators/bmo_fill_edgeloop.cc b/source/blender/bmesh/operators/bmo_fill_edgeloop.cc index 6c1913f8634..0da0393e2d0 100644 --- a/source/blender/bmesh/operators/bmo_fill_edgeloop.cc +++ b/source/blender/bmesh/operators/bmo_fill_edgeloop.cc @@ -10,6 +10,8 @@ #include "MEM_guardedalloc.h" +#include "BLI_listbase.h" + #include "bmesh.hh" #include "intern/bmesh_operators_private.hh" /* own include */ diff --git a/source/blender/bmesh/operators/bmo_fill_grid.cc b/source/blender/bmesh/operators/bmo_fill_grid.cc index d1a6c9d1351..864df11a05a 100644 --- a/source/blender/bmesh/operators/bmo_fill_grid.cc +++ b/source/blender/bmesh/operators/bmo_fill_grid.cc @@ -20,7 +20,7 @@ #include "intern/bmesh_operators_private.hh" /* own include */ -#include "BLI_strict_flags.h" /* Keep last. */ +#include "BLI_strict_flags.h" #define EDGE_MARK 4 #define FACE_OUT 16 diff --git a/source/blender/bmesh/operators/bmo_mesh_convert.cc b/source/blender/bmesh/operators/bmo_mesh_convert.cc index 98cc5efc2ac..9619e5869bb 100644 --- a/source/blender/bmesh/operators/bmo_mesh_convert.cc +++ b/source/blender/bmesh/operators/bmo_mesh_convert.cc @@ -17,7 +17,7 @@ #include "bmesh.hh" #include "intern/bmesh_operators_private.hh" -#include "BKE_global.hh" +#include "BKE_global.h" void bmo_mesh_to_bmesh_exec(BMesh *bm, BMOperator *op) { diff --git a/source/blender/bmesh/operators/bmo_utils.cc b/source/blender/bmesh/operators/bmo_utils.cc index 7268d50c930..4045c34d64a 100644 --- a/source/blender/bmesh/operators/bmo_utils.cc +++ b/source/blender/bmesh/operators/bmo_utils.cc @@ -13,6 +13,7 @@ #include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" +#include "DNA_object_types.h" #include "BLI_alloca.h" #include "BLI_math_matrix.h" @@ -20,6 +21,7 @@ #include "BKE_attribute.hh" #include "BKE_customdata.hh" +#include "BKE_object.hh" #include "bmesh.hh" diff --git a/source/blender/bmesh/tools/bmesh_bevel.cc b/source/blender/bmesh/tools/bmesh_bevel.cc index ba342d82f6d..2f73e4943d7 100644 --- a/source/blender/bmesh/tools/bmesh_bevel.cc +++ b/source/blender/bmesh/tools/bmesh_bevel.cc @@ -13,6 +13,7 @@ #include "DNA_curveprofile_types.h" #include "DNA_meshdata_types.h" #include "DNA_modifier_types.h" +#include "DNA_scene_types.h" #include "BLI_alloca.h" #include "BLI_math_geom.h" @@ -7763,7 +7764,7 @@ void BM_mesh_bevel(BMesh *bm, } #ifdef BEVEL_DEBUG_TIME - double start_time = BLI_time_now_seconds(); + double start_time = BLI_check_seconds_timer(); #endif /* Disable the miters with the cutoff vertex mesh method, the combination isn't useful anyway. */ @@ -7931,7 +7932,7 @@ void BM_mesh_bevel(BMesh *bm, BLI_memarena_free(bp.mem_arena); #ifdef BEVEL_DEBUG_TIME - double end_time = BLI_time_now_seconds(); + double end_time = BLI_check_seconds_timer(); printf("BMESH BEVEL TIME = %.3f\n", end_time - start_time); #endif } diff --git a/source/blender/bmesh/tools/bmesh_bisect_plane.cc b/source/blender/bmesh/tools/bmesh_bisect_plane.cc index 915c571d1eb..545c8c2a0ea 100644 --- a/source/blender/bmesh/tools/bmesh_bisect_plane.cc +++ b/source/blender/bmesh/tools/bmesh_bisect_plane.cc @@ -23,6 +23,7 @@ #include "BLI_linklist.h" #include "BLI_linklist_stack.h" #include "BLI_math_geom.h" +#include "BLI_math_matrix.h" #include "BLI_math_vector.h" #include "BLI_utildefines.h" #include "BLI_utildefines_stack.h" diff --git a/source/blender/bmesh/tools/bmesh_boolean.cc b/source/blender/bmesh/tools/bmesh_boolean.cc index 47403cf383a..7d776390481 100644 --- a/source/blender/bmesh/tools/bmesh_boolean.cc +++ b/source/blender/bmesh/tools/bmesh_boolean.cc @@ -14,6 +14,7 @@ #include "BLI_math_mpq.hh" #include "BLI_mesh_boolean.hh" #include "BLI_mesh_intersect.hh" +#include "BLI_time.h" #include "bmesh.hh" #include "bmesh_boolean.hh" @@ -350,11 +351,11 @@ static bool bmesh_boolean(BMesh *bm, IMeshArena arena; IMesh m_triangulated; # ifdef PERF_DEBUG - double start_time = BLI_time_now_seconds(); + double start_time = BLI_check_seconds_timer(); # endif IMesh m_in = mesh_from_bm(bm, looptris, looptris_tot, &m_triangulated, &arena); # ifdef PERF_DEBUG - double mesh_time = BLI_time_now_seconds(); + double mesh_time = BLI_check_seconds_timer(); std::cout << "bmesh_boolean, imesh_from_bm done, time = " << mesh_time - start_time << "\n"; # endif std::function shape_fn; @@ -382,12 +383,12 @@ static bool bmesh_boolean(BMesh *bm, IMesh m_out = boolean_mesh( m_in, boolean_mode, nshapes, shape_fn, use_self, hole_tolerant, &m_triangulated, &arena); # ifdef PERF_DEBUG - double boolean_time = BLI_time_now_seconds(); + double boolean_time = BLI_check_seconds_timer(); std::cout << "boolean done, time = " << boolean_time - mesh_time << "\n"; # endif bool any_change = apply_mesh_output_to_bmesh(bm, m_out, keep_hidden); # ifdef PERF_DEBUG - double apply_mesh_time = BLI_time_now_seconds(); + double apply_mesh_time = BLI_check_seconds_timer(); std::cout << "applied boolean output to bmesh, time = " << apply_mesh_time - boolean_time << "\n"; # endif diff --git a/source/blender/bmesh/tools/bmesh_edgenet.cc b/source/blender/bmesh/tools/bmesh_edgenet.cc index 87493b24425..4136dadff3f 100644 --- a/source/blender/bmesh/tools/bmesh_edgenet.cc +++ b/source/blender/bmesh/tools/bmesh_edgenet.cc @@ -20,7 +20,7 @@ #include "bmesh.hh" #include "bmesh_edgenet.hh" /* own include */ -#include "BLI_strict_flags.h" /* Keep last. */ +#include "BLI_strict_flags.h" /* keep last */ /* Struct for storing a path of verts walked over */ struct VertNetInfo { diff --git a/source/blender/bmesh/tools/bmesh_intersect.cc b/source/blender/bmesh/tools/bmesh_intersect.cc index 0090464d1c3..f45f29c6718 100644 --- a/source/blender/bmesh/tools/bmesh_intersect.cc +++ b/source/blender/bmesh/tools/bmesh_intersect.cc @@ -41,7 +41,7 @@ #include "tools/bmesh_edgesplit.hh" -#include "BLI_strict_flags.h" /* Keep last. */ +#include "BLI_strict_flags.h" /* * Some of these depend on each other: diff --git a/source/blender/bmesh/tools/bmesh_path_uv.cc b/source/blender/bmesh/tools/bmesh_path_uv.cc index b0551727ef8..9b0c6261135 100644 --- a/source/blender/bmesh/tools/bmesh_path_uv.cc +++ b/source/blender/bmesh/tools/bmesh_path_uv.cc @@ -15,6 +15,8 @@ #include "BLI_math_geom.h" #include "BLI_math_vector.h" +#include "DNA_meshdata_types.h" + #include "bmesh.hh" #include "bmesh_path_uv.hh" /* own include */ #include "intern/bmesh_query.hh" diff --git a/source/blender/bmesh/tools/bmesh_region_match.cc b/source/blender/bmesh/tools/bmesh_region_match.cc index 1f723faffef..ad4c002111e 100644 --- a/source/blender/bmesh/tools/bmesh_region_match.cc +++ b/source/blender/bmesh/tools/bmesh_region_match.cc @@ -52,7 +52,7 @@ # include "BLI_time_utildefines.h" #endif -#include "BLI_strict_flags.h" /* Keep last. */ +#include "BLI_strict_flags.h" /* -------------------------------------------------------------------- */ /** \name Internal UIDWalk API diff --git a/source/blender/bmesh/tools/bmesh_wireframe.cc b/source/blender/bmesh/tools/bmesh_wireframe.cc index 8edfb203f57..fada3432fd3 100644 --- a/source/blender/bmesh/tools/bmesh_wireframe.cc +++ b/source/blender/bmesh/tools/bmesh_wireframe.cc @@ -12,6 +12,8 @@ #include "MEM_guardedalloc.h" +#include "DNA_meshdata_types.h" + #include "bmesh.hh" #include "BLI_math_geom.h" diff --git a/source/blender/compositor/CMakeLists.txt b/source/blender/compositor/CMakeLists.txt index 6b7c153ddf9..6a034ef2e06 100644 --- a/source/blender/compositor/CMakeLists.txt +++ b/source/blender/compositor/CMakeLists.txt @@ -22,6 +22,7 @@ if(WITH_COMPOSITOR_CPU) ../nodes/intern ../render ../render/intern + ../../../extern/clew/include # RNA_prototypes.h ${CMAKE_BINARY_DIR}/source/blender/makesrna @@ -34,13 +35,18 @@ if(WITH_COMPOSITOR_CPU) set(SRC COM_compositor.hh COM_defines.h - COM_profile.hh intern/COM_BufferArea.h + intern/COM_BufferOperation.cc + intern/COM_BufferOperation.h intern/COM_BufferRange.h intern/COM_BuffersIterator.h intern/COM_CPUDevice.cc intern/COM_CPUDevice.h + intern/COM_ChunkOrder.cc + intern/COM_ChunkOrder.h + intern/COM_ChunkOrderHotspot.cc + intern/COM_ChunkOrderHotspot.h intern/COM_CompositorContext.cc intern/COM_CompositorContext.h intern/COM_ConstantFolder.cc @@ -53,6 +59,8 @@ if(WITH_COMPOSITOR_CPU) intern/COM_Device.h intern/COM_Enums.cc intern/COM_Enums.h + intern/COM_ExecutionGroup.cc + intern/COM_ExecutionGroup.h intern/COM_ExecutionModel.cc intern/COM_ExecutionModel.h intern/COM_ExecutionSystem.cc @@ -61,6 +69,8 @@ if(WITH_COMPOSITOR_CPU) intern/COM_FullFrameExecutionModel.h intern/COM_MemoryBuffer.cc intern/COM_MemoryBuffer.h + intern/COM_MemoryProxy.cc + intern/COM_MemoryProxy.h intern/COM_MetaData.cc intern/COM_MetaData.h intern/COM_MultiThreadedOperation.cc @@ -77,13 +87,19 @@ if(WITH_COMPOSITOR_CPU) intern/COM_NodeOperation.h intern/COM_NodeOperationBuilder.cc intern/COM_NodeOperationBuilder.h + intern/COM_OpenCLDevice.cc + intern/COM_OpenCLDevice.h intern/COM_SharedOperationBuffers.cc intern/COM_SharedOperationBuffers.h + intern/COM_SingleThreadedOperation.cc + intern/COM_SingleThreadedOperation.h + intern/COM_TiledExecutionModel.cc + intern/COM_TiledExecutionModel.h + intern/COM_WorkPackage.cc intern/COM_WorkPackage.h intern/COM_WorkScheduler.cc intern/COM_WorkScheduler.h intern/COM_compositor.cc - intern/COM_profile.cc operations/COM_QualityStepHelper.cc operations/COM_QualityStepHelper.h @@ -317,10 +333,18 @@ if(WITH_COMPOSITOR_CPU) operations/COM_GammaCorrectOperation.h operations/COM_GaussianAlphaBlurBaseOperation.cc operations/COM_GaussianAlphaBlurBaseOperation.h + operations/COM_GaussianAlphaXBlurOperation.cc + operations/COM_GaussianAlphaXBlurOperation.h + operations/COM_GaussianAlphaYBlurOperation.cc + operations/COM_GaussianAlphaYBlurOperation.h operations/COM_GaussianBlurBaseOperation.cc operations/COM_GaussianBlurBaseOperation.h operations/COM_GaussianBokehBlurOperation.cc operations/COM_GaussianBokehBlurOperation.h + operations/COM_GaussianXBlurOperation.cc + operations/COM_GaussianXBlurOperation.h + operations/COM_GaussianYBlurOperation.cc + operations/COM_GaussianYBlurOperation.h operations/COM_KuwaharaAnisotropicOperation.cc operations/COM_KuwaharaAnisotropicOperation.h operations/COM_KuwaharaAnisotropicStructureTensorOperation.cc @@ -447,12 +471,16 @@ if(WITH_COMPOSITOR_CPU) operations/COM_GammaOperation.h operations/COM_MixOperation.cc operations/COM_MixOperation.h + operations/COM_ReadBufferOperation.cc + operations/COM_ReadBufferOperation.h operations/COM_SetColorOperation.cc operations/COM_SetColorOperation.h operations/COM_SetValueOperation.cc operations/COM_SetValueOperation.h operations/COM_SetVectorOperation.cc operations/COM_SetVectorOperation.h + operations/COM_WriteBufferOperation.cc + operations/COM_WriteBufferOperation.h operations/COM_MathBaseOperation.cc operations/COM_MathBaseOperation.h @@ -506,6 +534,8 @@ if(WITH_COMPOSITOR_CPU) operations/COM_TransformOperation.h operations/COM_TranslateOperation.cc operations/COM_TranslateOperation.h + operations/COM_WrapOperation.cc + operations/COM_WrapOperation.h # Filter operations operations/COM_ConvolutionEdgeFilterOperation.cc @@ -520,8 +550,6 @@ if(WITH_COMPOSITOR_CPU) operations/COM_DilateErodeOperation.h operations/COM_GlareBaseOperation.cc operations/COM_GlareBaseOperation.h - operations/COM_GlareBloomOperation.cc - operations/COM_GlareBloomOperation.h operations/COM_GlareFogGlowOperation.cc operations/COM_GlareFogGlowOperation.h operations/COM_GlareGhostOperation.cc @@ -577,6 +605,7 @@ if(WITH_COMPOSITOR_CPU) PRIVATE bf::intern::clog PRIVATE bf::intern::guardedalloc bf_realtime_compositor + extern_clew PRIVATE bf::intern::atomic ) @@ -584,6 +613,15 @@ if(WITH_COMPOSITOR_CPU) ${CMAKE_CURRENT_BINARY_DIR}/operations ) + data_to_c( + ${CMAKE_CURRENT_SOURCE_DIR}/operations/COM_OpenCLKernels.cl + ${CMAKE_CURRENT_BINARY_DIR}/operations/COM_OpenCLKernels.cl.h + SRC + STRIP_LEADING_C_COMMENTS + ) + + add_definitions(-DCL_USE_DEPRECATED_OPENCL_1_1_APIS) + set(GENSRC_DIR ${CMAKE_CURRENT_BINARY_DIR}/operations) set(GENSRC ${GENSRC_DIR}/COM_SMAAAreaTexture.h) add_custom_command( diff --git a/source/blender/compositor/COM_compositor.hh b/source/blender/compositor/COM_compositor.hh index fb8408b80ef..896da42a0c7 100644 --- a/source/blender/compositor/COM_compositor.hh +++ b/source/blender/compositor/COM_compositor.hh @@ -10,9 +10,6 @@ namespace blender::realtime_compositor { class RenderContext; } -namespace blender::compositor { -class ProfilerData; -} struct Render; @@ -33,6 +30,49 @@ struct Render; * \defgroup Operation All operations of the compositor * \ingroup compositor * + * \page Introduction of the Blender Compositor + * + * \section bcomp Blender compositor + * This project redesigns the internals of Blender's compositor. + * The project has been executed in 2011 by At Mind. + * At Mind is a technology company located in Amsterdam, The Netherlands. + * The project has been crowd-funded. This code has been released under GPL2 to be used in Blender. + * + * \section goals The goals of the project + * the new compositor has 2 goals. + * - Make a faster compositor (speed of calculation) + * - Make the compositor work faster for you (workflow) + * + * \section speed Faster compositor + * The speedup has been done by making better use of the hardware Blenders is working on. + * The previous compositor only used a single threaded model to calculate a node. + * The only exception to this is the Defocus node. + * Only when it is possible to calculate two full nodes in parallel a second thread was used. + * Current workstations have 8-16 threads available, and most of the time these are idle. + * + * In the new compositor we want to use as much of threads as possible. + * Even new OpenCL capable GPU-hardware can be used for calculation. + * + * \section workflow Work faster + * The previous compositor only showed the final image. + * The compositor could wait a long time before seeing the result of his work. + * The new compositor will work in a way that it will focus on + * getting information back to the user. It will prioritize its work to get earlier user feedback. + * + * \page memory Memory model + * The main issue is the type of memory model to use. + * Blender is used by consumers and professionals. + * Ranging from low-end machines to very high-end machines. + * The system should work on high-end machines and on low-end machines. + * \page executing Executing + * \section prepare Prepare execution + * + * during the preparation of the execution All ReadBufferOperation will receive an offset. + * This offset is used during execution as an optimization trick + * Next all operations will be initialized for execution \see NodeOperation.init_execution + * Next all ExecutionGroup's will be initialized for execution \see ExecutionGroup.init_execution + * this all is controlled from \see ExecutionSystem.execute + * * \section priority Render priority * Render priority is an priority of an output node. * A user has a different need of Render priorities of output nodes @@ -42,6 +82,152 @@ struct Render; * All NodeOperation has a setting for their render-priority, * but only for output NodeOperation these have effect. * In ExecutionSystem.execute all priorities are checked. + * For every priority the ExecutionGroup's are check if the + * priority do match. + * When match the ExecutionGroup will be executed (this happens in serial) + * + * \see ExecutionSystem.execute control of the Render priority + * \see NodeOperation.get_render_priority receive the render priority + * \see ExecutionGroup.execute the main loop to execute a whole ExecutionGroup + * + * \section order Chunk order + * + * When a ExecutionGroup is executed, first the order of chunks are determined. + * The settings are stored in the ViewerNode inside the ExecutionGroup. + * ExecutionGroups that have no viewer-node, + * will use a default one. + * There are several possible chunk orders + * - [@ref ChunkOrdering.CenterOut]: + * Start calculating from a configurable point and order by nearest chunk. + * - [@ref ChunkOrdering.Random]: + * Randomize all chunks. + * - [@ref ChunkOrdering.TopDown]: + * Start calculation from the bottom to the top of the image. + * - [@ref ChunkOrdering.RuleOfThirds]: + * Experimental order based on 9 hot-spots in the image. + * + * When the chunk-order is determined, the first few chunks will be checked if they can be scheduled. + * Chunks can have three states: + * - [@ref eWorkPackageState.NotScheduled]: + * Chunk is not yet scheduled, or dependencies are not met. + * - [@ref eWorkPackageState.Scheduled]: + * All dependencies are met, chunk is scheduled, but not finished. + * - [@ref eWorkPackageState.Executed]: + * Chunk is finished. + * + * \see ExecutionGroup.execute + * \see ViewerOperation.get_chunk_order + * \see ChunkOrdering + * + * \section interest Area of interest + * An ExecutionGroup can have dependencies to other ExecutionGroup's. + * Data passing from one ExecutionGroup to another one are stored in 'chunks'. + * If not all input chunks are available the chunk execution will not be scheduled. + *
+ * +-------------------------------------+              +--------------------------------------+
+ * | ExecutionGroup A                    |              | ExecutionGroup B                     |
+ * | +----------------+  +-------------+ |              | +------------+   +-----------------+ |
+ * | | NodeOperation a|  | WriteBuffer | |              | | ReadBuffer |   | ViewerOperation | |
+ * | |                *==* Operation   | |              | | Operation  *===*                 | |
+ * | |                |  |             | |              | |            |   |                 | |
+ * | +----------------+  +-------------+ |              | +------------+   +-----------------+ |
+ * |                                |    |              |   |                                  |
+ * +--------------------------------|----+              +---|----------------------------------+
+ *                                  |                       |
+ *                                  |                       |
+ *                                +---------------------------+
+ *                                | MemoryProxy               |
+ *                                | +----------+  +---------+ |
+ *                                | | Chunk a  |  | Chunk b | |
+ *                                | |          |  |         | |
+ *                                | +----------+  +---------+ |
+ *                                |                           |
+ *                                +---------------------------+
+ * 
+ * + * In the above example ExecutionGroup B has an outputoperation (ViewerOperation) + * and is being executed. + * The first chunk is evaluated [@ref ExecutionGroup.schedule_chunk_when_possible], + * but not all input chunks are available. + * The relevant ExecutionGroup (that can calculate the missing chunks; ExecutionGroup A) + * is asked to calculate the area ExecutionGroup B is missing. + * [@ref ExecutionGroup.schedule_area_when_possible] + * ExecutionGroup B checks what chunks the area spans, and tries to schedule these chunks. + * If all input data is available these chunks are scheduled [@ref ExecutionGroup.schedule_chunk] + * + *
+ *
+ * +-------------------------+        +----------------+                           +----------------+
+ * | ExecutionSystem.execute |        | ExecutionGroup |                           | ExecutionGroup |
+ * +-------------------------+        | (B)            |                           | (A)            |
+ *            O                       +----------------+                           +----------------+
+ *            O                                |                                            |
+ *            O       ExecutionGroup.execute   |                                            |
+ *            O------------------------------->O                                            |
+ *            .                                O                                            |
+ *            .                                O-------\                                    |
+ *            .                                .       | ExecutionGroup.schedule_chunk_when_possible
+ *            .                                .  O----/ (*)                                |
+ *            .                                .  O                                         |
+ *            .                                .  O                                         |
+ *            .                                .  O  ExecutionGroup.schedule_area_when_possible|
+ *            .                                .  O---------------------------------------->O
+ *            .                                .  .                                         O----------\ ExecutionGroup.schedule_chunk_when_possible
+ *            .                                .  .                                         .          | (*)
+ *            .                                .  .                                         .  O-------/
+ *            .                                .  .                                         .  O
+ *            .                                .  .                                         .  O
+ *            .                                .  .                                         .  O-------\ ExecutionGroup.schedule_chunk
+ *            .                                .  .                                         .  .       |
+ *            .                                .  .                                         .  .  O----/
+ *            .                                .  .                                         .  O<=O
+ *            .                                .  .                                         O<=O
+ *            .                                .  .                                         O
+ *            .                                .  O<========================================O
+ *            .                                .  O                                         |
+ *            .                                O<=O                                         |
+ *            .                                O                                            |
+ *            .                                O                                            |
+ * 
+ * + * This happens until all chunks of (ExecutionGroup B) are finished executing or the user break's the process. + * + * NodeOperation like the ScaleOperation can influence the area of interest by reimplementing the + * [@ref NodeOperation.determine_area_of_interest] method + * + *
+ *
+ * +--------------------------+                             +---------------------------------+
+ * | ExecutionGroup A         |                             | ExecutionGroup B                |
+ * |                          |                             |                                 |
+ * +--------------------------+                             +---------------------------------+
+ *           Needed chunks from ExecutionGroup A               |   Chunk of ExecutionGroup B (to be evaluated)
+ *            +-------+ +-------+                              |                  +--------+
+ *            |Chunk 1| |Chunk 2|               +----------------+                |Chunk 1 |
+ *            |       | |       |               | ScaleOperation |                |        |
+ *            +-------+ +-------+               +----------------+                +--------+
+ *
+ *            +-------+ +-------+
+ *            |Chunk 3| |Chunk 4|
+ *            |       | |       |
+ *            +-------+ +-------+
+ *
+ * 
+ * + * \see ExecutionGroup.execute Execute a complete ExecutionGroup. + * Halts until finished or breaked by user + * \see ExecutionGroup.schedule_chunk_when_possible Tries to schedule a single chunk, + * checks if all input data is available. Can trigger dependent chunks to be calculated + * \see ExecutionGroup.schedule_area_when_possible + * Tries to schedule an area. This can be multiple chunks + * (is called from [@ref ExecutionGroup.schedule_chunk_when_possible]) + * \see ExecutionGroup.schedule_chunk Schedule a chunk on the WorkScheduler + * \see NodeOperation.determine_depending_area_of_interest Influence the area of interest of a chunk. + * \see WriteBufferOperation Operation to write to a MemoryProxy/MemoryBuffer + * \see ReadBufferOperation Operation to read from a MemoryProxy/MemoryBuffer + * \see MemoryProxy proxy for information about memory image + * (a image consist out of multiple chunks) + * \see MemoryBuffer Allocated memory for a single chunk * * \section workscheduler WorkScheduler * the WorkScheduler is implemented as a static class. the responsibility of the WorkScheduler @@ -62,6 +248,47 @@ struct Render; * This is done by changing the `COM_threading_model` * to `ThreadingModel::SingleThreaded`. When compiling the work-scheduler * will be changes to support no threading and run everything on the CPU. + * + * \section devices Devices + * A Device within the compositor context is a Hardware component that can used to calculate chunks. + * This chunk is encapsulated in a WorkPackage. + * the WorkScheduler controls the devices and selects the device where a + * WorkPackage will be calculated. + * + * \subsection WS_Devices Work-scheduler + * The WorkScheduler controls all Devices. + * When initializing the compositor the WorkScheduler selects all + * devices that will be used during compositor. + * There are two types of Devices, CPUDevice and OpenCLDevice. + * When an ExecutionGroup schedules a Chunk the schedule method of the WorkScheduler + * The Workscheduler determines if the chunk can be run on an OpenCLDevice + * (and that there are available OpenCLDevice). + * If this is the case the chunk will be added to the work-list for OpenCLDevice's + * otherwise the chunk will be added to the work-list of CPUDevices. + * + * A thread will read the work-list and sends a work-package to its device. + * + * \see WorkScheduler.schedule method that is called to schedule a chunk + * \see Device.execute method called to execute a chunk + * + * \subsection CPUDevice CPUDevice + * When a CPUDevice gets a WorkPackage the Device will get the input-buffer that is needed to + * calculate the chunk. Allocation is already done by the ExecutionGroup. + * The output-buffer of the chunk is being created. + * The OutputOperation of the ExecutionGroup is called to execute the area of the output-buffer. + * + * \see ExecutionGroup + * \see NodeOperation.execute_region executes a single chunk of a NodeOperation + * \see CPUDevice.execute + * + * \subsection GPUDevice OpenCLDevice + * + * To be completed! + * \see NodeOperation.execute_opencl_region + * \see OpenCLDevice.execute + * + * \section execute_pixel executing a pixel + * Finally the last step, the node functionality :) */ /** @@ -98,7 +325,7 @@ struct Render; * should be checked further, probably it'll be also needed for preview * generation in display space */ -/* clang-format on */ +/* clang-format off */ void COM_execute(Render *render, RenderData *render_data, @@ -106,17 +333,16 @@ void COM_execute(Render *render, bNodeTree *node_tree, bool rendering, const char *view_name, - blender::realtime_compositor::RenderContext *render_context, - blender::compositor::ProfilerData &profiler_data); + blender::realtime_compositor::RenderContext *render_context); /** * \brief Deinitialize the compositor caches and allocated memory. * Use COM_clear_caches to only free the caches. */ -void COM_deinitialize(); +void COM_deinitialize(void); /** * \brief Clear all compositor caches. (Compositor system will still remain available). * To deinitialize the compositor use the COM_deinitialize method. */ -// void COM_clear_caches(); // NOT YET WRITTEN +// void COM_clear_caches(void); // NOT YET WRITTEN diff --git a/source/blender/compositor/COM_defines.h b/source/blender/compositor/COM_defines.h index d5ae44317f8..66f3a878144 100644 --- a/source/blender/compositor/COM_defines.h +++ b/source/blender/compositor/COM_defines.h @@ -12,6 +12,16 @@ namespace blender::compositor { using Size2f = float2; +enum class eExecutionModel { + /** + * Operations are executed from outputs to inputs grouped in execution groups and rendered + * in tiles. + */ + Tiled, + /** Operations are fully rendered in order from inputs to outputs. */ + FullFrame +}; + enum class eDimension { X, Y }; /** @@ -74,6 +84,28 @@ constexpr DataType COM_num_channels_data_type(const int num_channels) } } +/* Configurable items. + * + * Chunk size determination. + * + * Chunk order. */ +/** + * \brief The order of chunks to be scheduled + * \ingroup Execution + */ +enum class ChunkOrdering { + /** \brief order from a distance to centerX/centerY */ + CenterOut = 0, + /** \brief order randomly */ + Random = 1, + /** \brief no ordering */ + TopDown = 2, + /** \brief experimental ordering with 9 hot-spots. */ + RuleOfThirds = 3, + + Default = ChunkOrdering::CenterOut, +}; + constexpr float COM_PREVIEW_SIZE = 140.f; constexpr float COM_RULE_OF_THIRDS_DIVIDER = 100.0f; constexpr float COM_BLUR_BOKEH_PIXELS = 512; diff --git a/source/blender/compositor/COM_precomp.h b/source/blender/compositor/COM_precomp.h index e557346d3ae..a45c771eb6b 100644 --- a/source/blender/compositor/COM_precomp.h +++ b/source/blender/compositor/COM_precomp.h @@ -23,10 +23,12 @@ #include "COM_ConvertOperation.h" #include "COM_Debug.h" #include "COM_Enums.h" +#include "COM_ExecutionGroup.h" #include "COM_ExecutionSystem.h" #include "COM_MultiThreadedOperation.h" #include "COM_Node.h" #include "COM_NodeOperation.h" +#include "COM_OpenCLDevice.h" #include "COM_SetAlphaMultiplyOperation.h" #include "COM_SetColorOperation.h" #include "COM_SetSamplerOperation.h" diff --git a/source/blender/compositor/COM_profile.hh b/source/blender/compositor/COM_profile.hh deleted file mode 100644 index c71274eda9a..00000000000 --- a/source/blender/compositor/COM_profile.hh +++ /dev/null @@ -1,58 +0,0 @@ -/* SPDX-FileCopyrightText: 2024 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -#pragma once - -#include "BLI_map.hh" -#include "BLI_timeit.hh" - -#include "DNA_node_types.h" - -#include "BKE_node.hh" - -struct bNodeTree; - -namespace blender::compositor { - -class NodeOperation; - -/* Profiling data gathered during execution of a compositing node tree. */ -class ProfilerData { - public: - /* Per-node accumulated execution time. Includes execution time of all operations the node was - * broken down into. */ - Map per_node_execution_time; -}; - -/* Profiler implementation which is used by the node execution system. */ -class Profiler { - /* Local copy of the profiling data, which is known to not cause threading conflicts with the - * interface thread while the compositing tree is evaluated in the background. */ - ProfilerData data_; - - public: - void add_operation_execution_time(const NodeOperation &operation, - const timeit::TimePoint &start, - const timeit::TimePoint &end); - - void finalize(const bNodeTree &node_tree); - - const ProfilerData &get_data() const - { - return data_; - } - - private: - /* Add execution time to the node denoted by its key. */ - void add_execution_time(const bNodeInstanceKey parent_key, - const timeit::Nanoseconds &execution_time); - - /* Accumulate execution time of the group node instances, and store their execution time in the - * per_node_execution_time_. - * Returns total execution time of the given node tree. */ - timeit::Nanoseconds accumulate_node_group_times( - const bNodeTree &node_tree, const bNodeInstanceKey parent_key = NODE_INSTANCE_KEY_BASE); -}; - -} // namespace blender::compositor diff --git a/source/blender/compositor/intern/COM_BufferOperation.cc b/source/blender/compositor/intern/COM_BufferOperation.cc new file mode 100644 index 00000000000..ac2dfbc0fb8 --- /dev/null +++ b/source/blender/compositor/intern/COM_BufferOperation.cc @@ -0,0 +1,82 @@ +/* SPDX-FileCopyrightText: 2021 Blender Authors + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +#include "COM_BufferOperation.h" + +namespace blender::compositor { + +BufferOperation::BufferOperation(MemoryBuffer *buffer, DataType data_type) +{ + buffer_ = buffer; + inflated_buffer_ = nullptr; + set_canvas(buffer->get_rect()); + add_output_socket(data_type); + flags_.is_constant_operation = buffer_->is_a_single_elem(); + flags_.is_fullframe_operation = false; +} + +const float *BufferOperation::get_constant_elem() +{ + BLI_assert(buffer_->is_a_single_elem()); + return buffer_->get_buffer(); +} + +void BufferOperation::init_execution() +{ + if (buffer_->is_a_single_elem()) { + init_mutex(); + } +} + +void *BufferOperation::initialize_tile_data(rcti * /*rect*/) +{ + if (buffer_->is_a_single_elem() == false) { + return buffer_; + } + + lock_mutex(); + if (!inflated_buffer_) { + inflated_buffer_ = buffer_->inflate(); + } + unlock_mutex(); + return inflated_buffer_; +} + +void BufferOperation::deinit_execution() +{ + if (buffer_->is_a_single_elem()) { + deinit_mutex(); + } + delete inflated_buffer_; +} + +void BufferOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + switch (sampler) { + case PixelSampler::Nearest: + buffer_->read(output, x, y); + break; + case PixelSampler::Bilinear: + default: + buffer_->read_bilinear(output, x, y); + break; + case PixelSampler::Bicubic: + /* No bicubic. Same implementation as ReadBufferOperation. */ + buffer_->read_bilinear(output, x, y); + break; + } +} + +void BufferOperation::execute_pixel_filtered( + float output[4], float x, float y, float dx[2], float dy[2]) +{ + const float uv[2] = {x, y}; + const float deriv[2][2] = {{dx[0], dx[1]}, {dy[0], dy[1]}}; + buffer_->readEWA(output, uv, deriv); +} + +} // namespace blender::compositor diff --git a/source/blender/compositor/intern/COM_BufferOperation.h b/source/blender/compositor/intern/COM_BufferOperation.h new file mode 100644 index 00000000000..dcbb4360730 --- /dev/null +++ b/source/blender/compositor/intern/COM_BufferOperation.h @@ -0,0 +1,28 @@ +/* SPDX-FileCopyrightText: 2021 Blender Authors + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +#pragma once + +#include "COM_ConstantOperation.h" + +namespace blender::compositor { + +class BufferOperation : public ConstantOperation { + private: + MemoryBuffer *buffer_; + MemoryBuffer *inflated_buffer_; + + public: + BufferOperation(MemoryBuffer *buffer, DataType data_type); + + const float *get_constant_elem() override; + void *initialize_tile_data(rcti *rect) override; + void init_execution() override; + void deinit_execution() override; + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + void execute_pixel_filtered( + float output[4], float x, float y, float dx[2], float dy[2]) override; +}; + +} // namespace blender::compositor diff --git a/source/blender/compositor/intern/COM_CPUDevice.cc b/source/blender/compositor/intern/COM_CPUDevice.cc index 6896d68c473..d24a62d7feb 100644 --- a/source/blender/compositor/intern/COM_CPUDevice.cc +++ b/source/blender/compositor/intern/COM_CPUDevice.cc @@ -4,7 +4,8 @@ #include "COM_CPUDevice.h" -#include "COM_WorkPackage.h" +#include "COM_ExecutionGroup.h" +#include "COM_NodeOperation.h" namespace blender::compositor { @@ -12,7 +13,21 @@ CPUDevice::CPUDevice(int thread_id) : thread_id_(thread_id) {} void CPUDevice::execute(WorkPackage *work_package) { - work_package->execute_fn(); + switch (work_package->type) { + case eWorkPackageType::Tile: { + const uint chunk_number = work_package->chunk_number; + ExecutionGroup *execution_group = work_package->execution_group; + + execution_group->get_output_operation()->execute_region(&work_package->rect, chunk_number); + execution_group->finalize_chunk_execution(chunk_number, nullptr); + break; + } + case eWorkPackageType::CustomFunction: { + work_package->execute_fn(); + break; + } + } + if (work_package->executed_fn) { work_package->executed_fn(); } diff --git a/source/blender/compositor/intern/COM_ChunkOrder.cc b/source/blender/compositor/intern/COM_ChunkOrder.cc new file mode 100644 index 00000000000..9fbf3eac235 --- /dev/null +++ b/source/blender/compositor/intern/COM_ChunkOrder.cc @@ -0,0 +1,28 @@ +/* SPDX-FileCopyrightText: 2011 Blender Authors + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +#include + +#include "COM_ChunkOrder.h" + +namespace blender::compositor { + +void ChunkOrder::update_distance(ChunkOrderHotspot *hotspots, uint len_hotspots) +{ + double new_distance = DBL_MAX; + for (int index = 0; index < len_hotspots; index++) { + double distance_to_hotspot = hotspots[index].calc_distance(x, y); + if (distance_to_hotspot < new_distance) { + new_distance = distance_to_hotspot; + } + } + this->distance = new_distance; +} + +bool operator<(const ChunkOrder &a, const ChunkOrder &b) +{ + return a.distance < b.distance; +} + +} // namespace blender::compositor diff --git a/source/blender/compositor/intern/COM_ChunkOrder.h b/source/blender/compositor/intern/COM_ChunkOrder.h new file mode 100644 index 00000000000..3eb63c559bb --- /dev/null +++ b/source/blender/compositor/intern/COM_ChunkOrder.h @@ -0,0 +1,33 @@ +/* SPDX-FileCopyrightText: 2011 Blender Authors + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +#pragma once + +#ifdef WITH_CXX_GUARDEDALLOC +# include "MEM_guardedalloc.h" +#endif + +#include "BLI_sys_types.h" + +#include "COM_ChunkOrderHotspot.h" + +namespace blender::compositor { + +/** Helper to determine the order how chunks are prioritized during execution. */ +struct ChunkOrder { + uint index = 0; + int x = 0; + int y = 0; + double distance = 0.0; + + friend bool operator<(const ChunkOrder &a, const ChunkOrder &b); + + void update_distance(ChunkOrderHotspot *hotspots, uint len_hotspots); + +#ifdef WITH_CXX_GUARDEDALLOC + MEM_CXX_CLASS_ALLOC_FUNCS("COM:ChunkOrderHotspot") +#endif +}; + +} // namespace blender::compositor diff --git a/source/blender/compositor/intern/COM_ChunkOrderHotspot.cc b/source/blender/compositor/intern/COM_ChunkOrderHotspot.cc new file mode 100644 index 00000000000..5fc7b146ea3 --- /dev/null +++ b/source/blender/compositor/intern/COM_ChunkOrderHotspot.cc @@ -0,0 +1,19 @@ +/* SPDX-FileCopyrightText: 2011 Blender Authors + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +#include "COM_ChunkOrderHotspot.h" +#include + +namespace blender::compositor { + +double ChunkOrderHotspot::calc_distance(int x, int y) +{ + int dx = this->x - x; + int dy = this->y - y; + double result = sqrt(double(dx * dx + dy * dy)); + result += double(this->addition); + return result; +} + +} // namespace blender::compositor diff --git a/source/blender/compositor/intern/COM_ChunkOrderHotspot.h b/source/blender/compositor/intern/COM_ChunkOrderHotspot.h new file mode 100644 index 00000000000..ede28058859 --- /dev/null +++ b/source/blender/compositor/intern/COM_ChunkOrderHotspot.h @@ -0,0 +1,27 @@ +/* SPDX-FileCopyrightText: 2011 Blender Authors + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +#pragma once + +#ifdef WITH_CXX_GUARDEDALLOC +# include "MEM_guardedalloc.h" +#endif + +namespace blender::compositor { + +struct ChunkOrderHotspot { + int x; + int y; + float addition; + + ChunkOrderHotspot(int x, int y, float addition) : x(x), y(y), addition(addition) {} + + double calc_distance(int x, int y); + +#ifdef WITH_CXX_GUARDEDALLOC + MEM_CXX_CLASS_ALLOC_FUNCS("COM:ChunkOrderHotspot") +#endif +}; + +} // namespace blender::compositor diff --git a/source/blender/compositor/intern/COM_CompositorContext.cc b/source/blender/compositor/intern/COM_CompositorContext.cc index 786af4e983f..816fcf60397 100644 --- a/source/blender/compositor/intern/COM_CompositorContext.cc +++ b/source/blender/compositor/intern/COM_CompositorContext.cc @@ -11,6 +11,7 @@ CompositorContext::CompositorContext() scene_ = nullptr; rd_ = nullptr; quality_ = eCompositorQuality::High; + hasActiveOpenCLDevices_ = false; fast_calculation_ = false; bnodetree_ = nullptr; } @@ -27,4 +28,20 @@ Size2f CompositorContext::get_render_size() const get_render_data()->ysch * get_render_percentage_as_factor()}; } +eExecutionModel CompositorContext::get_execution_model() const +{ + if (U.experimental.use_full_frame_compositor) { + BLI_assert(bnodetree_ != nullptr); + switch (bnodetree_->execution_mode) { + case 1: + return eExecutionModel::FullFrame; + case 0: + return eExecutionModel::Tiled; + default: + BLI_assert_msg(0, "Invalid execution mode"); + } + } + return eExecutionModel::Tiled; +} + } // namespace blender::compositor diff --git a/source/blender/compositor/intern/COM_CompositorContext.h b/source/blender/compositor/intern/COM_CompositorContext.h index e61d0eb8dbb..dbe3851aede 100644 --- a/source/blender/compositor/intern/COM_CompositorContext.h +++ b/source/blender/compositor/intern/COM_CompositorContext.h @@ -59,6 +59,11 @@ class CompositorContext { */ bNodeInstanceHash *previews_; + /** + * \brief does this system have active opencl devices? + */ + bool hasActiveOpenCLDevices_; + /** * \brief Skip slow nodes */ @@ -175,6 +180,22 @@ class CompositorContext { */ int get_framenumber() const; + /** + * \brief has this system active opencl_devices? + */ + bool get_has_active_opencl_devices() const + { + return hasActiveOpenCLDevices_; + } + + /** + * \brief set has this system active opencl_devices? + */ + void setHasActiveOpenCLDevices(bool hasAvtiveOpenCLDevices) + { + hasActiveOpenCLDevices_ = hasAvtiveOpenCLDevices; + } + /** Whether it has a view with a specific name and not the default one. */ bool has_explicit_view() const { @@ -213,6 +234,11 @@ class CompositorContext { view_name_ = view_name; } + int get_chunksize() const + { + return this->get_bnodetree()->chunksize; + } + void set_fast_calculation(bool fast_calculation) { fast_calculation_ = fast_calculation; @@ -221,6 +247,10 @@ class CompositorContext { { return fast_calculation_; } + bool is_groupnode_buffer_enabled() const + { + return (this->get_bnodetree()->flag & NTREE_COM_GROUPNODE_BUFFER) != 0; + } /** * \brief Get the render percentage as a factor. @@ -232,6 +262,11 @@ class CompositorContext { } Size2f get_render_size() const; + + /** + * Get active execution model. + */ + eExecutionModel get_execution_model() const; }; } // namespace blender::compositor diff --git a/source/blender/compositor/intern/COM_ConstantFolder.cc b/source/blender/compositor/intern/COM_ConstantFolder.cc index 6e16d6ea720..817fab1660b 100644 --- a/source/blender/compositor/intern/COM_ConstantFolder.cc +++ b/source/blender/compositor/intern/COM_ConstantFolder.cc @@ -133,7 +133,7 @@ Vector ConstantFolder::try_fold_operations(Span last_folds = try_fold_operations( operations_builder_.get_operations()); int folds_count = last_folds.size(); diff --git a/source/blender/compositor/intern/COM_Converter.cc b/source/blender/compositor/intern/COM_Converter.cc index 0f3d71564da..57f03db7e40 100644 --- a/source/blender/compositor/intern/COM_Converter.cc +++ b/source/blender/compositor/intern/COM_Converter.cc @@ -550,11 +550,13 @@ void COM_convert_canvas(NodeOperationBuilder &builder, builder.add_operation(syop); rcti scale_canvas = from_operation->get_canvas(); - ScaleOperation::scale_area(scale_canvas, scaleX, scaleY); - scale_canvas.xmax = scale_canvas.xmin + to_operation->get_width(); - scale_canvas.ymax = scale_canvas.ymin + to_operation->get_height(); - addX = 0; - addY = 0; + if (builder.context().get_execution_model() == eExecutionModel::FullFrame) { + ScaleOperation::scale_area(scale_canvas, scaleX, scaleY); + scale_canvas.xmax = scale_canvas.xmin + to_operation->get_width(); + scale_canvas.ymax = scale_canvas.ymin + to_operation->get_height(); + addX = 0; + addY = 0; + } scale_operation->set_canvas(scale_canvas); sxop->set_canvas(scale_canvas); syop->set_canvas(scale_canvas); diff --git a/source/blender/compositor/intern/COM_Debug.cc b/source/blender/compositor/intern/COM_Debug.cc index e4a2d4ef167..e1cd8ae729b 100644 --- a/source/blender/compositor/intern/COM_Debug.cc +++ b/source/blender/compositor/intern/COM_Debug.cc @@ -14,8 +14,11 @@ #include "IMB_imbuf.hh" #include "IMB_imbuf_types.hh" +#include "COM_ExecutionGroup.h" +#include "COM_ReadBufferOperation.h" #include "COM_SetValueOperation.h" #include "COM_ViewerOperation.h" +#include "COM_WriteBufferOperation.h" namespace blender::compositor { @@ -24,17 +27,14 @@ DebugInfo::NodeNameMap DebugInfo::node_names_; DebugInfo::OpNameMap DebugInfo::op_names_; std::string DebugInfo::current_node_name_; std::string DebugInfo::current_op_name_; +DebugInfo::GroupStateMap DebugInfo::group_states_; static std::string operation_class_name(const NodeOperation *op) { std::string full_name = typeid(*op).name(); - /* The typeid name is implementation defined, but it is typically a full C++ name that is either - * mangled or demangled. In case it was demangled, remove the namespaces, but if it was mangled, - * return the entire name, since there is no easy way to demangle it. */ + /* Remove name-spaces. */ size_t pos = full_name.find_last_of(':'); - if (pos == std::string::npos) { - return full_name; - } + BLI_assert(pos != std::string::npos); return full_name.substr(pos + 1); } @@ -58,6 +58,7 @@ std::string DebugInfo::operation_name(const NodeOperation *op) int DebugInfo::graphviz_operation(const ExecutionSystem *system, NodeOperation *operation, + const ExecutionGroup *group, char *str, int maxlen) { @@ -79,9 +80,20 @@ int DebugInfo::graphviz_operation(const ExecutionSystem *system, else if (operation->get_flags().is_set_operation) { fillcolor = "khaki1"; } + else if (operation->get_flags().is_read_buffer_operation) { + fillcolor = "darkolivegreen3"; + } + else if (operation->get_flags().is_write_buffer_operation) { + fillcolor = "darkorange"; + } len += snprintf(str + len, maxlen > len ? maxlen - len : 0, "// OPERATION: %p\r\n", operation); - len += snprintf(str + len, maxlen > len ? maxlen - len : 0, "\"O_%p\"", operation); + if (group) { + len += snprintf(str + len, maxlen > len ? maxlen - len : 0, "\"O_%p_%p\"", operation, group); + } + else { + len += snprintf(str + len, maxlen > len ? maxlen - len : 0, "\"O_%p\"", operation); + } len += snprintf(str + len, maxlen > len ? maxlen - len : 0, " [fillcolor=%s,style=filled,shape=record,label=\"{", @@ -210,11 +222,14 @@ int DebugInfo::graphviz_legend_group( return len; } -int DebugInfo::graphviz_legend(char *str, int maxlen) +int DebugInfo::graphviz_legend(char *str, int maxlen, const bool has_execution_groups) { int len = 0; len += snprintf(str + len, maxlen > len ? maxlen - len : 0, "{\r\n"); + if (has_execution_groups) { + len += snprintf(str + len, maxlen > len ? maxlen - len : 0, "rank = sink;\r\n"); + } len += snprintf( str + len, maxlen > len ? maxlen - len : 0, "Legend [shape=none, margin=0, label=<\r\n"); @@ -234,9 +249,25 @@ int DebugInfo::graphviz_legend(char *str, int maxlen) "Viewer", "lightskyblue3", str + len, maxlen > len ? maxlen - len : 0); len += graphviz_legend_color( "Active Viewer", "lightskyblue1", str + len, maxlen > len ? maxlen - len : 0); + if (has_execution_groups) { + len += graphviz_legend_color( + "Write Buffer", "darkorange", str + len, maxlen > len ? maxlen - len : 0); + len += graphviz_legend_color( + "Read Buffer", "darkolivegreen3", str + len, maxlen > len ? maxlen - len : 0); + } len += graphviz_legend_color( "Input Value", "khaki1", str + len, maxlen > len ? maxlen - len : 0); + if (has_execution_groups) { + len += snprintf(str + len, maxlen > len ? maxlen - len : 0, "\r\n"); + len += graphviz_legend_group( + "Group Waiting", "white", "dashed", str + len, maxlen > len ? maxlen - len : 0); + len += graphviz_legend_group( + "Group Running", "firebrick1", "solid", str + len, maxlen > len ? maxlen - len : 0); + len += graphviz_legend_group( + "Group Finished", "chartreuse4", "solid", str + len, maxlen > len ? maxlen - len : 0); + } + len += snprintf(str + len, maxlen > len ? maxlen - len : 0, "\r\n"); len += snprintf(str + len, maxlen > len ? maxlen - len : 0, ">];\r\n"); len += snprintf(str + len, maxlen > len ? maxlen - len : 0, "}\r\n"); @@ -246,6 +277,7 @@ int DebugInfo::graphviz_legend(char *str, int maxlen) bool DebugInfo::graphviz_system(const ExecutionSystem *system, char *str, int maxlen) { + char strbuf[64]; int len = 0; len += snprintf(str + len, maxlen > len ? maxlen - len : 0, "digraph compositorexecution {\r\n"); @@ -254,7 +286,39 @@ bool DebugInfo::graphviz_system(const ExecutionSystem *system, char *str, int ma len += snprintf(str + len, maxlen > len ? maxlen - len : 0, "splines=false\r\n"); std::map> op_groups; + int index = 0; + for (const ExecutionGroup *group : system->groups_) { + len += snprintf(str + len, maxlen > len ? maxlen - len : 0, "// GROUP: %d\r\n", index); + len += snprintf(str + len, maxlen > len ? maxlen - len : 0, "subgraph cluster_%d{\r\n", index); + /* used as a check for executing group */ + if (group_states_[group] == EG_WAIT) { + len += snprintf(str + len, maxlen > len ? maxlen - len : 0, "style=dashed\r\n"); + } + else if (group_states_[group] == EG_RUNNING) { + len += snprintf(str + len, maxlen > len ? maxlen - len : 0, "style=filled\r\n"); + len += snprintf(str + len, maxlen > len ? maxlen - len : 0, "color=black\r\n"); + len += snprintf(str + len, maxlen > len ? maxlen - len : 0, "fillcolor=firebrick1\r\n"); + } + else if (group_states_[group] == EG_FINISHED) { + len += snprintf(str + len, maxlen > len ? maxlen - len : 0, "style=filled\r\n"); + len += snprintf(str + len, maxlen > len ? maxlen - len : 0, "color=black\r\n"); + len += snprintf(str + len, maxlen > len ? maxlen - len : 0, "fillcolor=chartreuse4\r\n"); + } + for (NodeOperation *operation : group->operations_) { + + SNPRINTF(strbuf, "_%p", group); + op_groups[operation].push_back(std::string(strbuf)); + + len += graphviz_operation( + system, operation, group, str + len, maxlen > len ? maxlen - len : 0); + } + + len += snprintf(str + len, maxlen > len ? maxlen - len : 0, "}\r\n"); + index++; + } + + /* operations not included in any group */ for (NodeOperation *operation : system->operations_) { if (op_groups.find(operation) != op_groups.end()) { continue; @@ -262,7 +326,29 @@ bool DebugInfo::graphviz_system(const ExecutionSystem *system, char *str, int ma op_groups[operation].push_back(std::string("")); - len += graphviz_operation(system, operation, str + len, maxlen > len ? maxlen - len : 0); + len += graphviz_operation( + system, operation, nullptr, str + len, maxlen > len ? maxlen - len : 0); + } + + for (NodeOperation *operation : system->operations_) { + if (operation->get_flags().is_read_buffer_operation) { + ReadBufferOperation *read = (ReadBufferOperation *)operation; + WriteBufferOperation *write = read->get_memory_proxy()->get_write_buffer_operation(); + std::vector &read_groups = op_groups[read]; + std::vector &write_groups = op_groups[write]; + + for (int k = 0; k < write_groups.size(); k++) { + for (int l = 0; l < read_groups.size(); l++) { + len += snprintf(str + len, + maxlen > len ? maxlen - len : 0, + "\"O_%p%s\" -> \"O_%p%s\" [style=dotted]\r\n", + write, + write_groups[k].c_str(), + read, + read_groups[l].c_str()); + } + } + } } for (NodeOperation *op : system->operations_) { @@ -317,7 +403,10 @@ bool DebugInfo::graphviz_system(const ExecutionSystem *system, char *str, int ma } } - len += graphviz_legend(str + len, maxlen > len ? maxlen - len : 0); + const bool has_execution_groups = system->get_context().get_execution_model() == + eExecutionModel::Tiled && + system->groups_.size() > 0; + len += graphviz_legend(str + len, maxlen > len ? maxlen - len : 0, has_execution_groups); len += snprintf(str + len, maxlen > len ? maxlen - len : 0, "}\r\n"); diff --git a/source/blender/compositor/intern/COM_Debug.h b/source/blender/compositor/intern/COM_Debug.h index 871ae393b08..608fe9f0af0 100644 --- a/source/blender/compositor/intern/COM_Debug.h +++ b/source/blender/compositor/intern/COM_Debug.h @@ -24,11 +24,15 @@ static constexpr bool COM_EXPORT_OPERATION_BUFFERS = false; class Node; class NodeOperation; class ExecutionSystem; +class ExecutionGroup; class DebugInfo { public: + typedef enum { EG_WAIT, EG_RUNNING, EG_FINISHED } GroupState; + typedef std::map NodeNameMap; typedef std::map OpNameMap; + typedef std::map GroupStateMap; static std::string node_name(const Node *node); static std::string operation_name(const NodeOperation *op); @@ -43,6 +47,8 @@ class DebugInfo { static std::string current_node_name_; /** Base name for automatic sub-operations. */ static std::string current_op_name_; + /** For visualizing group states. */ + static GroupStateMap group_states_; public: static void convert_started() @@ -52,10 +58,14 @@ class DebugInfo { } } - static void execute_started() + static void execute_started(const ExecutionSystem *system) { if (COM_EXPORT_GRAPHVIZ) { file_index_ = 1; + group_states_.clear(); + for (ExecutionGroup *execution_group : system->groups_) { + group_states_[execution_group] = EG_WAIT; + } } if (COM_EXPORT_OPERATION_BUFFERS) { delete_operation_exports(); @@ -90,6 +100,19 @@ class DebugInfo { } }; + static void execution_group_started(const ExecutionGroup *group) + { + if (COM_EXPORT_GRAPHVIZ) { + group_states_[group] = EG_RUNNING; + } + }; + static void execution_group_finished(const ExecutionGroup *group) + { + if (COM_EXPORT_GRAPHVIZ) { + group_states_[group] = EG_FINISHED; + } + }; + static void operation_rendered(const NodeOperation *op, MemoryBuffer *render) { /* Don't export constant operations as there are too many and it's rarely useful. */ @@ -103,6 +126,7 @@ class DebugInfo { protected: static int graphviz_operation(const ExecutionSystem *system, NodeOperation *operation, + const ExecutionGroup *group, char *str, int maxlen); static int graphviz_legend_color(const char *name, const char *color, char *str, int maxlen); @@ -110,7 +134,7 @@ class DebugInfo { const char *name, const char *color, const char *style, char *str, int maxlen); static int graphviz_legend_group( const char *name, const char *color, const char *style, char *str, int maxlen); - static int graphviz_legend(char *str, int maxlen); + static int graphviz_legend(char *str, int maxlen, bool has_execution_groups); static bool graphviz_system(const ExecutionSystem *system, char *str, int maxlen); static void export_operation(const NodeOperation *op, MemoryBuffer *render); diff --git a/source/blender/compositor/intern/COM_Enums.cc b/source/blender/compositor/intern/COM_Enums.cc index 04d3805da65..9f8f65b47b9 100644 --- a/source/blender/compositor/intern/COM_Enums.cc +++ b/source/blender/compositor/intern/COM_Enums.cc @@ -43,4 +43,23 @@ std::ostream &operator<<(std::ostream &os, const eCompositorPriority &priority) return os; } +std::ostream &operator<<(std::ostream &os, const eWorkPackageState &execution_state) +{ + switch (execution_state) { + case eWorkPackageState::NotScheduled: { + os << "ExecutionState::NotScheduled"; + break; + } + case eWorkPackageState::Scheduled: { + os << "ExecutionState::Scheduled"; + break; + } + case eWorkPackageState::Executed: { + os << "ExecutionState::Executed"; + break; + } + } + return os; +} + } // namespace blender::compositor diff --git a/source/blender/compositor/intern/COM_Enums.h b/source/blender/compositor/intern/COM_Enums.h index a35e49541b4..d062553bb4f 100644 --- a/source/blender/compositor/intern/COM_Enums.h +++ b/source/blender/compositor/intern/COM_Enums.h @@ -31,11 +31,48 @@ enum class eCompositorQuality { * \ingroup Execution */ enum class eCompositorPriority { + /** \brief High quality setting */ High = 2, + /** \brief Medium quality setting */ Medium = 1, + /** \brief Low quality setting */ Low = 0, }; +/** + * \brief the execution state of a chunk in an ExecutionGroup + * \ingroup Execution + */ +enum class eWorkPackageState { + /** + * \brief chunk is not yet scheduled + */ + NotScheduled = 0, + /** + * \brief chunk is scheduled, but not yet executed + */ + Scheduled = 1, + /** + * \brief chunk is executed. + */ + Executed = 2, +}; + +/** + * \brief Work type to execute. + * \ingroup Execution + */ +enum class eWorkPackageType { + /** + * \brief Executes an execution group tile. + */ + Tile = 0, + /** + * \brief Executes a custom function. + */ + CustomFunction = 1 +}; + enum class PixelSampler { Nearest = 0, Bilinear = 1, @@ -44,5 +81,6 @@ enum class PixelSampler { void expand_area_for_sampler(rcti &area, PixelSampler sampler); std::ostream &operator<<(std::ostream &os, const eCompositorPriority &priority); +std::ostream &operator<<(std::ostream &os, const eWorkPackageState &execution_state); } // namespace blender::compositor diff --git a/source/blender/compositor/intern/COM_ExecutionGroup.cc b/source/blender/compositor/intern/COM_ExecutionGroup.cc new file mode 100644 index 00000000000..12ad6a0be57 --- /dev/null +++ b/source/blender/compositor/intern/COM_ExecutionGroup.cc @@ -0,0 +1,583 @@ +/* SPDX-FileCopyrightText: 2011 Blender Authors + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +#include "COM_ExecutionGroup.h" +#include "COM_ChunkOrder.h" +#include "COM_Debug.h" +#include "COM_ReadBufferOperation.h" +#include "COM_ViewerOperation.h" +#include "COM_WorkScheduler.h" +#include "COM_WriteBufferOperation.h" +#include "COM_defines.h" + +#include "BLI_rand.hh" +#include "BLI_string.h" +#include "BLI_time.h" + +#include "BLT_translation.h" + +namespace blender::compositor { + +std::ostream &operator<<(std::ostream &os, const ExecutionGroupFlags &flags) +{ + if (flags.initialized) { + os << "init,"; + } + if (flags.is_output) { + os << "output,"; + } + if (flags.complex) { + os << "complex,"; + } + if (flags.open_cl) { + os << "open_cl,"; + } + if (flags.single_threaded) { + os << "single_threaded,"; + } + return os; +} + +ExecutionGroup::ExecutionGroup(int id) +{ + id_ = id; + bTree_ = nullptr; + height_ = 0; + width_ = 0; + max_read_buffer_offset_ = 0; + x_chunks_len_ = 0; + y_chunks_len_ = 0; + chunks_len_ = 0; + chunks_finished_ = 0; + BLI_rcti_init(&viewer_border_, 0, 0, 0, 0); + execution_start_time_ = 0; +} + +std::ostream &operator<<(std::ostream &os, const ExecutionGroup &execution_group) +{ + os << "ExecutionGroup(id=" << execution_group.get_id(); + os << ",flags={" << execution_group.get_flags() << "}"; + os << ",operation=" << *execution_group.get_output_operation() << ""; + os << ")"; + return os; +} + +eCompositorPriority ExecutionGroup::get_render_priority() +{ + return this->get_output_operation()->get_render_priority(); +} + +bool ExecutionGroup::can_contain(NodeOperation &operation) +{ + if (!flags_.initialized) { + return true; + } + + if (operation.get_flags().is_read_buffer_operation) { + return true; + } + if (operation.get_flags().is_write_buffer_operation) { + return false; + } + if (operation.get_flags().is_set_operation) { + return true; + } + + /* complex groups don't allow further ops (except read buffer and values, see above) */ + if (flags_.complex) { + return false; + } + /* complex ops can't be added to other groups (except their own, which they initialize, see + * above) */ + if (operation.get_flags().complex) { + return false; + } + + return true; +} + +bool ExecutionGroup::add_operation(NodeOperation *operation) +{ + if (!can_contain(*operation)) { + return false; + } + + if (!operation->get_flags().is_read_buffer_operation && + !operation->get_flags().is_write_buffer_operation) + { + flags_.complex = operation->get_flags().complex; + flags_.open_cl = operation->get_flags().open_cl; + flags_.single_threaded = operation->get_flags().single_threaded; + flags_.initialized = true; + } + + operations_.append(operation); + + return true; +} + +NodeOperation *ExecutionGroup::get_output_operation() const +{ + /* The first operation of the group is always the output operation. */ + return this->operations_[0]; +} + +void ExecutionGroup::init_work_packages() +{ + work_packages_.clear(); + if (chunks_len_ != 0) { + work_packages_.resize(chunks_len_); + for (uint index = 0; index < chunks_len_; index++) { + work_packages_[index].type = eWorkPackageType::Tile; + work_packages_[index].state = eWorkPackageState::NotScheduled; + work_packages_[index].execution_group = this; + work_packages_[index].chunk_number = index; + determine_chunk_rect(&work_packages_[index].rect, index); + } + } +} + +void ExecutionGroup::init_read_buffer_operations() +{ + uint max_offset = 0; + for (NodeOperation *operation : operations_) { + if (operation->get_flags().is_read_buffer_operation) { + ReadBufferOperation *read_operation = static_cast(operation); + read_operations_.append(read_operation); + max_offset = std::max(max_offset, read_operation->get_offset()); + } + } + max_offset++; + max_read_buffer_offset_ = max_offset; +} + +void ExecutionGroup::init_execution() +{ + init_number_of_chunks(); + init_work_packages(); + init_read_buffer_operations(); +} + +void ExecutionGroup::deinit_execution() +{ + work_packages_.clear(); + chunks_len_ = 0; + x_chunks_len_ = 0; + y_chunks_len_ = 0; + read_operations_.clear(); + bTree_ = nullptr; +} + +void ExecutionGroup::determine_resolution(uint resolution[2]) +{ + NodeOperation *operation = this->get_output_operation(); + resolution[0] = operation->get_width(); + resolution[1] = operation->get_height(); + this->set_resolution(resolution); + BLI_rcti_init(&viewer_border_, 0, width_, 0, height_); +} + +void ExecutionGroup::init_number_of_chunks() +{ + if (flags_.single_threaded) { + x_chunks_len_ = 1; + y_chunks_len_ = 1; + chunks_len_ = 1; + } + else { + const float chunk_sizef = chunk_size_; + const int border_width = BLI_rcti_size_x(&viewer_border_); + const int border_height = BLI_rcti_size_y(&viewer_border_); + x_chunks_len_ = ceil(border_width / chunk_sizef); + y_chunks_len_ = ceil(border_height / chunk_sizef); + chunks_len_ = x_chunks_len_ * y_chunks_len_; + } +} + +blender::Array ExecutionGroup::get_execution_order() const +{ + blender::Array chunk_order(chunks_len_); + for (int chunk_index = 0; chunk_index < chunks_len_; chunk_index++) { + chunk_order[chunk_index] = chunk_index; + } + + NodeOperation *operation = this->get_output_operation(); + float centerX = 0.5f; + float centerY = 0.5f; + ChunkOrdering order_type = ChunkOrdering::Default; + + if (operation->get_flags().is_viewer_operation) { + ViewerOperation *viewer = (ViewerOperation *)operation; + centerX = viewer->getCenterX(); + centerY = viewer->getCenterY(); + order_type = viewer->get_chunk_order(); + } + + const int border_width = BLI_rcti_size_x(&viewer_border_); + const int border_height = BLI_rcti_size_y(&viewer_border_); + int index; + switch (order_type) { + case ChunkOrdering::Random: { + static blender::RandomNumberGenerator rng; + blender::MutableSpan span = chunk_order.as_mutable_span(); + /* Shuffle twice to make it more random. */ + rng.shuffle(span); + rng.shuffle(span); + break; + } + case ChunkOrdering::CenterOut: { + ChunkOrderHotspot hotspot(border_width * centerX, border_height * centerY, 0.0f); + blender::Array chunk_orders(chunks_len_); + for (index = 0; index < chunks_len_; index++) { + const WorkPackage &work_package = work_packages_[index]; + chunk_orders[index].index = index; + chunk_orders[index].x = work_package.rect.xmin - viewer_border_.xmin; + chunk_orders[index].y = work_package.rect.ymin - viewer_border_.ymin; + chunk_orders[index].update_distance(&hotspot, 1); + } + + std::sort(&chunk_orders[0], &chunk_orders[chunks_len_ - 1]); + for (index = 0; index < chunks_len_; index++) { + chunk_order[index] = chunk_orders[index].index; + } + + break; + } + case ChunkOrdering::RuleOfThirds: { + uint tx = border_width / 6; + uint ty = border_height / 6; + uint mx = border_width / 2; + uint my = border_height / 2; + uint bx = mx + 2 * tx; + uint by = my + 2 * ty; + float addition = chunks_len_ / COM_RULE_OF_THIRDS_DIVIDER; + + ChunkOrderHotspot hotspots[9] = { + ChunkOrderHotspot(mx, my, addition * 0), + ChunkOrderHotspot(tx, my, addition * 1), + ChunkOrderHotspot(bx, my, addition * 2), + ChunkOrderHotspot(bx, by, addition * 3), + ChunkOrderHotspot(tx, ty, addition * 4), + ChunkOrderHotspot(bx, ty, addition * 5), + ChunkOrderHotspot(tx, by, addition * 6), + ChunkOrderHotspot(mx, ty, addition * 7), + ChunkOrderHotspot(mx, by, addition * 8), + }; + + blender::Array chunk_orders(chunks_len_); + for (index = 0; index < chunks_len_; index++) { + const WorkPackage &work_package = work_packages_[index]; + chunk_orders[index].index = index; + chunk_orders[index].x = work_package.rect.xmin - viewer_border_.xmin; + chunk_orders[index].y = work_package.rect.ymin - viewer_border_.ymin; + chunk_orders[index].update_distance(hotspots, 9); + } + + std::sort(&chunk_orders[0], &chunk_orders[chunks_len_]); + + for (index = 0; index < chunks_len_; index++) { + chunk_order[index] = chunk_orders[index].index; + } + + break; + } + case ChunkOrdering::TopDown: + default: + break; + } + return chunk_order; +} + +void ExecutionGroup::execute(ExecutionSystem *graph) +{ + const CompositorContext &context = graph->get_context(); + const bNodeTree *bTree = context.get_bnodetree(); + if (width_ == 0 || height_ == 0) { + return; + } /** \note Break out... no pixels to calculate. */ + if (bTree->runtime->test_break && bTree->runtime->test_break(bTree->runtime->tbh)) { + return; + } /** \note Early break out for blur and preview nodes. */ + if (chunks_len_ == 0) { + return; + } /** \note Early break out. */ + uint chunk_index; + + execution_start_time_ = BLI_check_seconds_timer(); + + chunks_finished_ = 0; + bTree_ = bTree; + + blender::Array chunk_order = get_execution_order(); + + DebugInfo::execution_group_started(this); + DebugInfo::graphviz(graph); + + bool breaked = false; + bool finished = false; + uint start_index = 0; + const int max_number_evaluated = BLI_system_thread_count() * 2; + + while (!finished && !breaked) { + bool start_evaluated = false; + finished = true; + int number_evaluated = 0; + + for (int index = start_index; index < chunks_len_ && number_evaluated < max_number_evaluated; + index++) + { + chunk_index = chunk_order[index]; + int y_chunk = chunk_index / x_chunks_len_; + int x_chunk = chunk_index - (y_chunk * x_chunks_len_); + const WorkPackage &work_package = work_packages_[chunk_index]; + switch (work_package.state) { + case eWorkPackageState::NotScheduled: { + schedule_chunk_when_possible(graph, x_chunk, y_chunk); + finished = false; + start_evaluated = true; + number_evaluated++; + + if (bTree->runtime->update_draw) { + bTree->runtime->update_draw(bTree->runtime->udh); + } + break; + } + case eWorkPackageState::Scheduled: { + finished = false; + start_evaluated = true; + number_evaluated++; + break; + } + case eWorkPackageState::Executed: { + if (!start_evaluated) { + start_index = index + 1; + } + } + }; + } + + WorkScheduler::finish(); + + if (bTree->runtime->test_break && bTree->runtime->test_break(bTree->runtime->tbh)) { + breaked = true; + } + } + DebugInfo::execution_group_finished(this); + DebugInfo::graphviz(graph); +} + +MemoryBuffer **ExecutionGroup::get_input_buffers_opencl(int chunk_number) +{ + WorkPackage &work_package = work_packages_[chunk_number]; + + MemoryBuffer **memory_buffers = (MemoryBuffer **)MEM_callocN( + sizeof(MemoryBuffer *) * max_read_buffer_offset_, __func__); + rcti output; + for (ReadBufferOperation *read_operation : read_operations_) { + MemoryProxy *memory_proxy = read_operation->get_memory_proxy(); + this->determine_depending_area_of_interest(&work_package.rect, read_operation, &output); + MemoryBuffer *memory_buffer = + memory_proxy->get_executor()->construct_consolidated_memory_buffer(*memory_proxy, output); + memory_buffers[read_operation->get_offset()] = memory_buffer; + } + return memory_buffers; +} + +MemoryBuffer *ExecutionGroup::construct_consolidated_memory_buffer(MemoryProxy &memory_proxy, + rcti &rect) +{ + MemoryBuffer *image_buffer = memory_proxy.get_buffer(); + MemoryBuffer *result = new MemoryBuffer(&memory_proxy, rect, MemoryBufferState::Temporary); + result->fill_from(*image_buffer); + return result; +} + +void ExecutionGroup::finalize_chunk_execution(int chunk_number, MemoryBuffer **memory_buffers) +{ + WorkPackage &work_package = work_packages_[chunk_number]; + if (work_package.state == eWorkPackageState::Scheduled) { + work_package.state = eWorkPackageState::Executed; + } + + atomic_add_and_fetch_u(&chunks_finished_, 1); + if (memory_buffers) { + for (uint index = 0; index < max_read_buffer_offset_; index++) { + MemoryBuffer *buffer = memory_buffers[index]; + if (buffer) { + if (buffer->is_temporarily()) { + memory_buffers[index] = nullptr; + delete buffer; + } + } + } + MEM_freeN(memory_buffers); + } + if (bTree_) { + /* Status report is only performed for top level Execution Groups. */ + float progress = chunks_finished_; + progress /= chunks_len_; + bTree_->runtime->progress(bTree_->runtime->prh, progress); + + char buf[128]; + SNPRINTF(buf, RPT_("Compositing | Tile %u-%u"), chunks_finished_, chunks_len_); + bTree_->runtime->stats_draw(bTree_->runtime->sdh, buf); + } +} + +inline void ExecutionGroup::determine_chunk_rect(rcti *r_rect, + const uint x_chunk, + const uint y_chunk) const +{ + const int border_width = BLI_rcti_size_x(&viewer_border_); + const int border_height = BLI_rcti_size_y(&viewer_border_); + + if (flags_.single_threaded) { + BLI_rcti_init(r_rect, viewer_border_.xmin, border_width, viewer_border_.ymin, border_height); + } + else { + const uint minx = x_chunk * chunk_size_ + viewer_border_.xmin; + const uint miny = y_chunk * chunk_size_ + viewer_border_.ymin; + const uint width = std::min(uint(viewer_border_.xmax), width_); + const uint height = std::min(uint(viewer_border_.ymax), height_); + BLI_rcti_init(r_rect, + std::min(minx, width_), + std::min(minx + chunk_size_, width), + std::min(miny, height_), + std::min(miny + chunk_size_, height)); + } +} + +void ExecutionGroup::determine_chunk_rect(rcti *r_rect, const uint chunk_number) const +{ + const uint y_chunk = chunk_number / x_chunks_len_; + const uint x_chunk = chunk_number - (y_chunk * x_chunks_len_); + determine_chunk_rect(r_rect, x_chunk, y_chunk); +} + +MemoryBuffer *ExecutionGroup::allocate_output_buffer(rcti &rect) +{ + /* We assume that this method is only called from complex execution groups. */ + NodeOperation *operation = this->get_output_operation(); + if (operation->get_flags().is_write_buffer_operation) { + WriteBufferOperation *write_operation = (WriteBufferOperation *)operation; + MemoryBuffer *buffer = new MemoryBuffer( + write_operation->get_memory_proxy(), rect, MemoryBufferState::Temporary); + return buffer; + } + return nullptr; +} + +bool ExecutionGroup::schedule_area_when_possible(ExecutionSystem *graph, rcti *area) +{ + if (flags_.single_threaded) { + return schedule_chunk_when_possible(graph, 0, 0); + } + /* Find all chunks inside the rect + * determine `minxchunk`, `minychunk`, `maxxchunk`, `maxychunk` + * where x and y are chunk-numbers. */ + + int indexx, indexy; + int minx = max_ii(area->xmin - viewer_border_.xmin, 0); + int maxx = min_ii(area->xmax - viewer_border_.xmin, viewer_border_.xmax - viewer_border_.xmin); + int miny = max_ii(area->ymin - viewer_border_.ymin, 0); + int maxy = min_ii(area->ymax - viewer_border_.ymin, viewer_border_.ymax - viewer_border_.ymin); + int minxchunk = minx / int(chunk_size_); + int maxxchunk = (maxx + int(chunk_size_) - 1) / int(chunk_size_); + int minychunk = miny / int(chunk_size_); + int maxychunk = (maxy + int(chunk_size_) - 1) / int(chunk_size_); + minxchunk = max_ii(minxchunk, 0); + minychunk = max_ii(minychunk, 0); + maxxchunk = min_ii(maxxchunk, int(x_chunks_len_)); + maxychunk = min_ii(maxychunk, int(y_chunks_len_)); + + bool result = true; + for (indexx = minxchunk; indexx < maxxchunk; indexx++) { + for (indexy = minychunk; indexy < maxychunk; indexy++) { + if (!schedule_chunk_when_possible(graph, indexx, indexy)) { + result = false; + } + } + } + + return result; +} + +bool ExecutionGroup::schedule_chunk(uint chunk_number) +{ + WorkPackage &work_package = work_packages_[chunk_number]; + if (work_package.state == eWorkPackageState::NotScheduled) { + work_package.state = eWorkPackageState::Scheduled; + WorkScheduler::schedule(&work_package); + return true; + } + return false; +} + +bool ExecutionGroup::schedule_chunk_when_possible(ExecutionSystem *graph, + const int chunk_x, + const int chunk_y) +{ + if (chunk_x < 0 || chunk_x >= int(x_chunks_len_)) { + return true; + } + if (chunk_y < 0 || chunk_y >= int(y_chunks_len_)) { + return true; + } + + /* Check if chunk is already executed or scheduled and not yet executed. */ + const int chunk_index = chunk_y * x_chunks_len_ + chunk_x; + WorkPackage &work_package = work_packages_[chunk_index]; + if (work_package.state == eWorkPackageState::Executed) { + return true; + } + if (work_package.state == eWorkPackageState::Scheduled) { + return false; + } + + bool can_be_executed = true; + rcti area; + + for (ReadBufferOperation *read_operation : read_operations_) { + BLI_rcti_init(&area, 0, 0, 0, 0); + MemoryProxy *memory_proxy = read_operation->get_memory_proxy(); + determine_depending_area_of_interest(&work_package.rect, read_operation, &area); + ExecutionGroup *group = memory_proxy->get_executor(); + + if (!group->schedule_area_when_possible(graph, &area)) { + can_be_executed = false; + } + } + + if (can_be_executed) { + schedule_chunk(chunk_index); + } + + return false; +} + +void ExecutionGroup::determine_depending_area_of_interest(rcti *input, + ReadBufferOperation *read_operation, + rcti *output) +{ + this->get_output_operation()->determine_depending_area_of_interest( + input, read_operation, output); +} + +void ExecutionGroup::set_viewer_border(float xmin, float xmax, float ymin, float ymax) +{ + const NodeOperation &operation = *this->get_output_operation(); + if (operation.get_flags().use_viewer_border) { + BLI_rcti_init(&viewer_border_, xmin * width_, xmax * width_, ymin * height_, ymax * height_); + } +} + +void ExecutionGroup::set_render_border(float xmin, float xmax, float ymin, float ymax) +{ + const NodeOperation &operation = *this->get_output_operation(); + if (operation.is_output_operation(true) && operation.get_flags().use_render_border) { + BLI_rcti_init(&viewer_border_, xmin * width_, xmax * width_, ymin * height_, ymax * height_); + } +} + +} // namespace blender::compositor diff --git a/source/blender/compositor/intern/COM_ExecutionGroup.h b/source/blender/compositor/intern/COM_ExecutionGroup.h new file mode 100644 index 00000000000..27c1c22fe19 --- /dev/null +++ b/source/blender/compositor/intern/COM_ExecutionGroup.h @@ -0,0 +1,392 @@ +/* SPDX-FileCopyrightText: 2011 Blender Authors + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +#pragma once + +#ifdef WITH_CXX_GUARDEDALLOC +# include "MEM_guardedalloc.h" +#endif + +#include + +#include "BLI_array.hh" +#include "BLI_vector.hh" + +#include "COM_Enums.h" +#include "COM_WorkPackage.h" + +#include "DNA_node_types.h" +#include "DNA_vec_types.h" + +namespace blender::compositor { + +class ExecutionSystem; +class NodeOperation; +class MemoryProxy; +class MemoryBuffer; +class ReadBufferOperation; + +struct ExecutionGroupFlags { + bool initialized : 1; + /** + * Is this ExecutionGroup an output ExecutionGroup + * An OutputExecution group are groups containing a + * ViewerOperation, CompositeOperation, PreviewOperation. + */ + bool is_output : 1; + bool complex : 1; + + /** + * Can this ExecutionGroup be scheduled on an OpenCLDevice. + */ + bool open_cl : 1; + + /** + * Schedule this execution group as a single chunk. This + * chunk will be executed by a single thread. + */ + bool single_threaded : 1; + + ExecutionGroupFlags() + { + initialized = false; + is_output = false; + complex = false; + open_cl = false; + single_threaded = false; + } +}; + +std::ostream &operator<<(std::ostream &os, const ExecutionGroupFlags &flags); + +/** + * \brief Class ExecutionGroup is a group of Operations that are executed as one. + * This grouping is used to combine Operations that can be executed as one whole when + * multi-processing. + * \ingroup Execution + */ +class ExecutionGroup { + private: + // fields + /** + * Id of the execution group. For debugging purposes. + */ + int id_; + + /** + * \brief list of operations in this ExecutionGroup + */ + Vector operations_; + + ExecutionGroupFlags flags_; + + /** + * \brief Width of the output + */ + unsigned int width_; + + /** + * \brief Height of the output + */ + unsigned int height_; + + /** + * \brief size of a single chunk, being Width or of height + * a chunk is always a square, except at the edges of the MemoryBuffer + */ + unsigned int chunk_size_; + + /** + * \brief number of chunks in the x-axis + */ + unsigned int x_chunks_len_; + + /** + * \brief number of chunks in the y-axis + */ + unsigned int y_chunks_len_; + + /** + * \brief total number of chunks + */ + unsigned int chunks_len_; + + /** + * \brief what is the maximum number field of all ReadBufferOperation in this ExecutionGroup. + * \note this is used to construct the MemoryBuffers that will be passed during execution. + */ + unsigned int max_read_buffer_offset_; + + /** + * \brief All read operations of this execution group. + */ + Vector read_operations_; + + /** + * \brief reference to the original bNodeTree, + * this field is only set for the 'top' execution group. + * \note can only be used to call the callbacks for progress, status and break. + */ + const bNodeTree *bTree_; + + /** + * \brief total number of chunks that have been calculated for this ExecutionGroup + */ + unsigned int chunks_finished_; + + /** + * \brief work_packages_ holds all unit of work. + */ + Vector work_packages_; + + /** + * \brief denotes boundary for border compositing + * \note measured in pixel space + */ + rcti viewer_border_; + + /** + * \brief start time of execution + */ + double execution_start_time_; + + // methods + /** + * \brief check whether parameter operation can be added to the execution group + * \param operation: the operation to be added + */ + bool can_contain(NodeOperation &operation); + + /** + * \brief Determine the rect (minx, maxx, miny, maxy) of a chunk at a position. + */ + void determine_chunk_rect(rcti *r_rect, unsigned int x_chunk, unsigned int y_chunk) const; + + /** + * \brief determine the number of chunks, based on the chunk_size, width and height. + * \note The result are stored in the fields number_of_chunks, number_of_xchunks, + * number_of_ychunks + */ + void init_number_of_chunks(); + + /** + * \brief try to schedule a specific chunk. + * \note scheduling succeeds when all input requirements are met and the chunks hasn't been + * scheduled yet. + * \param graph: + * \param x_chunk: + * \param y_chunk: + * \return [true:false] + * true: package(s) are scheduled + * false: scheduling is deferred (depending workpackages are scheduled) + */ + bool schedule_chunk_when_possible(ExecutionSystem *graph, int chunk_x, int chunk_y); + + /** + * \brief try to schedule a specific area. + * \note Check if a certain area is available, when not available this are will be checked. + * \note This method is called from other ExecutionGroup's. + * \param graph: + * \param area: + * \return [true:false] + * true: package(s) are scheduled + * false: scheduling is deferred (depending workpackages are scheduled) + */ + bool schedule_area_when_possible(ExecutionSystem *graph, rcti *area); + + /** + * \brief add a chunk to the WorkScheduler. + * \param chunknumber: + */ + bool schedule_chunk(unsigned int chunk_number); + + /** + * \brief determine the area of interest of a certain input area + * \note This method only evaluates a single ReadBufferOperation + * \param input: the input area + * \param read_operation: The ReadBufferOperation where the area needs to be evaluated + * \param output: the area needed of the ReadBufferOperation. Result + */ + void determine_depending_area_of_interest(rcti *input, + ReadBufferOperation *read_operation, + rcti *output); + + /** + * Return the execution order of the user visible chunks. + */ + blender::Array get_execution_order() const; + + void init_read_buffer_operations(); + void init_work_packages(); + + public: + // constructors + ExecutionGroup(int id); + + int get_id() const + { + return id_; + } + + const ExecutionGroupFlags get_flags() const + { + return flags_; + } + + // methods + /** + * \brief add an operation to this ExecutionGroup + * \note this method will add input of the operations recursively + * \note this method can create multiple ExecutionGroup's + * \param system: + * \param operation: + * \return True if the operation was successfully added + */ + bool add_operation(NodeOperation *operation); + + /** + * \brief set whether this ExecutionGroup is an output + * \param is_output: + */ + void set_output_execution_group(bool is_output) + { + flags_.is_output = is_output; + } + + /** + * \brief determine the resolution of this ExecutionGroup + * \param resolution: + */ + void determine_resolution(unsigned int resolution[2]); + + /** + * \brief set the resolution of this executiongroup + * \param resolution: + */ + void set_resolution(unsigned int resolution[2]) + { + width_ = resolution[0]; + height_ = resolution[1]; + } + + /** + * \brief get the width of this execution group + */ + unsigned int get_width() const + { + return width_; + } + + /** + * \brief get the height of this execution group + */ + unsigned int get_height() const + { + return height_; + } + + /** + * \brief get the output operation of this ExecutionGroup + * \return NodeOperation *output operation + */ + NodeOperation *get_output_operation() const; + + /** + * \brief compose multiple chunks into a single chunk + * \return `(Memorybuffer *)` consolidated chunk + */ + MemoryBuffer *construct_consolidated_memory_buffer(MemoryProxy &memory_proxy, rcti &rect); + + /** + * \brief init_execution is called just before the execution of the whole graph will be done. + * \note The implementation will calculate the chunk_size of this execution group. + */ + void init_execution(); + + /** + * \brief get all input-buffers needed to calculate an chunk + * \note all input-buffers must be executed + * \param chunk_number: the chunk to be calculated + * \return `(MemoryBuffer **)` the input-buffers. + */ + MemoryBuffer **get_input_buffers_opencl(int chunk_number); + + /** + * \brief allocate the output-buffer of a chunk + * \param chunk_number: the number of the chunk in the ExecutionGroup + * \param rect: the rect of that chunk + * \see determine_chunk_rect + */ + MemoryBuffer *allocate_output_buffer(rcti &rect); + + /** + * \brief after a chunk is executed the needed resources can be freed or unlocked. + * \param chunknumber: + * \param memorybuffers: + */ + void finalize_chunk_execution(int chunk_number, MemoryBuffer **memory_buffers); + + /** + * \brief deinit_execution is called just after execution the whole graph. + * \note It will release all needed resources + */ + void deinit_execution(); + + /** + * \brief schedule an ExecutionGroup + * \note this method will return when all chunks have been calculated, or the execution has + * breaked (by user) + * + * first the order of the chunks will be determined. This is determined by finding the + * ViewerOperation and get the relevant information from it. + * - ChunkOrdering + * - CenterX + * - CenterY + * + * After determining the order of the chunks the chunks will be scheduled + * + * \see ViewerOperation + * \param graph: + */ + /** + * This method is called for the top execution groups. containing the compositor node or the + * preview node or the viewer node). + */ + void execute(ExecutionSystem *graph); + + /** + * \brief Determine the rect (minx, maxx, miny, maxy) of a chunk. + */ + void determine_chunk_rect(rcti *r_rect, unsigned int chunk_number) const; + + void set_chunksize(int chunksize) + { + chunk_size_ = chunksize; + } + + /** + * \brief get the Render priority of this ExecutionGroup + * \see ExecutionSystem.execute + */ + eCompositorPriority get_render_priority(); + + /** + * \brief set border for viewer operation + * \note all the coordinates are assumed to be in normalized space + */ + void set_viewer_border(float xmin, float xmax, float ymin, float ymax); + + void set_render_border(float xmin, float xmax, float ymin, float ymax); + + /* allow the DebugInfo class to look at internals */ + friend class DebugInfo; + +#ifdef WITH_CXX_GUARDEDALLOC + MEM_CXX_CLASS_ALLOC_FUNCS("COM:ExecutionGroup") +#endif +}; + +std::ostream &operator<<(std::ostream &os, const ExecutionGroup &execution_group); + +} // namespace blender::compositor diff --git a/source/blender/compositor/intern/COM_ExecutionModel.h b/source/blender/compositor/intern/COM_ExecutionModel.h index d08699da5cd..2ce24e5e06b 100644 --- a/source/blender/compositor/intern/COM_ExecutionModel.h +++ b/source/blender/compositor/intern/COM_ExecutionModel.h @@ -12,14 +12,11 @@ # include "MEM_guardedalloc.h" #endif -#include "COM_profile.hh" - namespace blender::compositor { class CompositorContext; class ExecutionSystem; class NodeOperation; -class ProfilerData; /** * Base class for execution models. Contains shared implementation. @@ -46,8 +43,6 @@ class ExecutionModel { */ Span operations_; - Profiler profiler_; - public: ExecutionModel(CompositorContext &context, Span operations); @@ -55,11 +50,6 @@ class ExecutionModel { virtual void execute(ExecutionSystem &exec_system) = 0; - const ProfilerData &get_profiler_data() const - { - return profiler_.get_data(); - } - #ifdef WITH_CXX_GUARDEDALLOC MEM_CXX_CLASS_ALLOC_FUNCS("COM:BaseExecutionModel") #endif diff --git a/source/blender/compositor/intern/COM_ExecutionSystem.cc b/source/blender/compositor/intern/COM_ExecutionSystem.cc index 88117f89891..5740ec26333 100644 --- a/source/blender/compositor/intern/COM_ExecutionSystem.cc +++ b/source/blender/compositor/intern/COM_ExecutionSystem.cc @@ -5,9 +5,11 @@ #include "COM_ExecutionSystem.h" #include "COM_Debug.h" +#include "COM_ExecutionGroup.h" #include "COM_FullFrameExecutionModel.h" #include "COM_NodeOperation.h" #include "COM_NodeOperationBuilder.h" +#include "COM_TiledExecutionModel.h" #include "COM_WorkPackage.h" #include "COM_WorkScheduler.h" @@ -23,9 +25,7 @@ ExecutionSystem::ExecutionSystem(RenderData *rd, bool rendering, bool fastcalculation, const char *view_name, - realtime_compositor::RenderContext *render_context, - ProfilerData &profiler_data) - : profiler_data_(profiler_data) + realtime_compositor::RenderContext *render_context) { num_work_threads_ = WorkScheduler::get_num_cpu_threads(); context_.set_render_context(render_context); @@ -42,6 +42,8 @@ ExecutionSystem::ExecutionSystem(RenderData *rd, context_.set_quality((eCompositorQuality)editingtree->edit_quality); } context_.set_rendering(rendering); + context_.setHasActiveOpenCLDevices(WorkScheduler::has_gpu_devices() && + (editingtree->flag & NTREE_COM_OPENCL)); context_.set_render_data(rd); @@ -53,7 +55,17 @@ ExecutionSystem::ExecutionSystem(RenderData *rd, builder.convert_to_operations(this); } - execution_model_ = new FullFrameExecutionModel(context_, active_buffers_, operations_); + switch (context_.get_execution_model()) { + case eExecutionModel::Tiled: + execution_model_ = new TiledExecutionModel(context_, operations_, groups_); + break; + case eExecutionModel::FullFrame: + execution_model_ = new FullFrameExecutionModel(context_, active_buffers_, operations_); + break; + default: + BLI_assert_msg(0, "Non implemented execution model"); + break; + } } ExecutionSystem::~ExecutionSystem() @@ -67,22 +79,27 @@ ExecutionSystem::~ExecutionSystem() delete operation; } operations_.clear(); + + for (ExecutionGroup *group : groups_) { + delete group; + } + groups_.clear(); } -void ExecutionSystem::set_operations(const Span operations) +void ExecutionSystem::set_operations(const Vector &operations, + const Vector &groups) { operations_ = operations; + groups_ = groups; } void ExecutionSystem::execute() { - DebugInfo::execute_started(); + DebugInfo::execute_started(this); for (NodeOperation *op : operations_) { op->init_data(); } execution_model_->execute(*this); - - profiler_data_ = execution_model_->get_profiler_data(); } void ExecutionSystem::execute_work(const rcti &work_rect, @@ -111,6 +128,7 @@ void ExecutionSystem::execute_work(const rcti &work_rect, } WorkPackage &sub_work = sub_works[i]; + sub_work.type = eWorkPackageType::CustomFunction; sub_work.execute_fn = [=, &work_func, &work_rect]() { if (is_breaked()) { return; diff --git a/source/blender/compositor/intern/COM_ExecutionSystem.h b/source/blender/compositor/intern/COM_ExecutionSystem.h index 8080302d5e3..4e367a73248 100644 --- a/source/blender/compositor/intern/COM_ExecutionSystem.h +++ b/source/blender/compositor/intern/COM_ExecutionSystem.h @@ -26,8 +26,6 @@ class RenderContext; namespace blender::compositor { -class ProfilerData; - /** * \page execution Execution model * In order to get to an efficient model for execution, several steps are being done. these steps @@ -82,9 +80,36 @@ class ProfilerData; * * \see COM_convert_data_type Datatype conversions * \see Converter.convert_resolution Image size conversions + * + * \section EM_Step4 Step4: group operations in executions groups + * ExecutionGroup are groups of operations that are calculated as being one bigger operation. + * All operations will be part of an ExecutionGroup. + * Complex nodes will be added to separate groups. Between ExecutionGroup's the data will be stored + * in MemoryBuffers. ReadBufferOperations and WriteBufferOperations are added where needed. + * + *
+ *
+ *        +------------------------------+      +----------------+
+ *        | ExecutionGroup A             |      |ExecutionGroup B|   ExecutionGroup
+ *        | +----------+     +----------+|      |+----------+    |
+ *   /----->| Operation|---->| Operation|-\ /--->| Operation|-\  |   NodeOperation
+ *   |    | | A        |     | B        ||| |   || C        | |  |
+ *   |    | | cFFA     |  /->| cFFA     ||| |   || cFFA     | |  |
+ *   |    | +----------+  |  +----------+|| |   |+----------+ |  |
+ *   |    +---------------|--------------+v |   +-------------v--+
+ * +-*----+           +---*--+         +--*-*--+           +--*----+
+ * |inputA|           |inputB|         |outputA|           |outputB| MemoryBuffer
+ * |cFAA  |           |cFAA  |         |cFAA   |           |cFAA   |
+ * +------+           +------+         +-------+           +-------+
+ * 
+ * \see ExecutionSystem.group_operations method doing this step + * \see ExecutionSystem.add_read_write_buffer_operations + * \see NodeOperation.is_complex + * \see ExecutionGroup class representing the ExecutionGroup */ /* Forward declarations. */ +class ExecutionGroup; class ExecutionModel; class NodeOperation; @@ -109,6 +134,11 @@ class ExecutionSystem { */ Vector operations_; + /** + * \brief vector of groups + */ + Vector groups_; + /** * Active execution model implementation. */ @@ -122,8 +152,6 @@ class ExecutionSystem { ThreadMutex work_mutex_; ThreadCondition work_finished_cond_; - ProfilerData &profiler_data_; - public: /** * \brief Create a new ExecutionSystem and initialize it with the @@ -138,21 +166,21 @@ class ExecutionSystem { bool rendering, bool fastcalculation, const char *view_name, - realtime_compositor::RenderContext *render_context, - ProfilerData &profiler_data); + realtime_compositor::RenderContext *render_context); /** * Destructor */ ~ExecutionSystem(); - void set_operations(Span operations); + void set_operations(const Vector &operations, + const Vector &groups); /** * \brief execute this system - * - initialize the NodeOperation's - * - schedule the outputs based on their priority - * - deinitialize the NodeOperation's + * - initialize the NodeOperation's and ExecutionGroup's + * - schedule the output ExecutionGroup's based on their priority + * - deinitialize the ExecutionGroup's and NodeOperation's */ void execute(); @@ -164,6 +192,11 @@ class ExecutionSystem { return context_; } + SharedOperationBuffers &get_active_buffers() + { + return active_buffers_; + } + /** * Multi-threadedly execute given work function passing work_rect splits as argument. */ diff --git a/source/blender/compositor/intern/COM_FullFrameExecutionModel.cc b/source/blender/compositor/intern/COM_FullFrameExecutionModel.cc index ed571da57df..1ac1d2d4be7 100644 --- a/source/blender/compositor/intern/COM_FullFrameExecutionModel.cc +++ b/source/blender/compositor/intern/COM_FullFrameExecutionModel.cc @@ -6,14 +6,12 @@ #include "BLI_string.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "COM_Debug.h" #include "COM_ViewerOperation.h" #include "COM_WorkScheduler.h" -#include "BLI_timeit.hh" - #ifdef WITH_CXX_GUARDEDALLOC # include "MEM_guardedalloc.h" #endif @@ -44,8 +42,6 @@ void FullFrameExecutionModel::execute(ExecutionSystem &exec_system) determine_areas_to_render_and_reads(); render_operations(); - - profiler_.finalize(*node_tree); } void FullFrameExecutionModel::determine_areas_to_render_and_reads() @@ -105,8 +101,6 @@ void FullFrameExecutionModel::render_operation(NodeOperation *op) constexpr int output_x = 0; constexpr int output_y = 0; - const timeit::TimePoint time_start = timeit::Clock::now(); - const bool has_outputs = op->get_number_of_output_sockets() > 0; MemoryBuffer *op_buf = has_outputs ? create_operation_buffer(op, output_x, output_y) : nullptr; if (op->get_width() > 0 && op->get_height() > 0) { @@ -126,15 +120,13 @@ void FullFrameExecutionModel::render_operation(NodeOperation *op) active_buffers_.set_rendered_buffer(op, std::unique_ptr(op_buf)); operation_finished(op); - - profiler_.add_operation_execution_time(*op, time_start, timeit::Clock::now()); } void FullFrameExecutionModel::render_operations() { const bool is_rendering = context_.is_rendering(); - WorkScheduler::start(); + WorkScheduler::start(this->context_); for (eCompositorPriority priority : priorities_) { for (NodeOperation *op : operations_) { const bool has_size = op->get_width() > 0 && op->get_height() > 0; diff --git a/source/blender/compositor/intern/COM_MemoryBuffer.cc b/source/blender/compositor/intern/COM_MemoryBuffer.cc index c30b2c4ed4a..db6940f062a 100644 --- a/source/blender/compositor/intern/COM_MemoryBuffer.cc +++ b/source/blender/compositor/intern/COM_MemoryBuffer.cc @@ -4,6 +4,8 @@ #include "COM_MemoryBuffer.h" +#include "COM_MemoryProxy.h" + #include "IMB_colormanagement.hh" #include "IMB_imbuf_types.hh" @@ -28,14 +30,31 @@ static rcti create_rect(const int width, const int height) return rect; } +MemoryBuffer::MemoryBuffer(MemoryProxy *memory_proxy, const rcti &rect, MemoryBufferState state) +{ + rect_ = rect; + is_a_single_elem_ = false; + memory_proxy_ = memory_proxy; + num_channels_ = COM_data_type_num_channels(memory_proxy->get_data_type()); + buffer_ = (float *)MEM_mallocN_aligned( + sizeof(float) * buffer_len() * num_channels_, 16, "COM_MemoryBuffer"); + owns_data_ = true; + state_ = state; + datatype_ = memory_proxy->get_data_type(); + + set_strides(); +} + MemoryBuffer::MemoryBuffer(DataType data_type, const rcti &rect, bool is_a_single_elem) { rect_ = rect; is_a_single_elem_ = is_a_single_elem; + memory_proxy_ = nullptr; num_channels_ = COM_data_type_num_channels(data_type); buffer_ = (float *)MEM_mallocN_aligned( sizeof(float) * buffer_len() * num_channels_, 16, "COM_MemoryBuffer"); owns_data_ = true; + state_ = MemoryBufferState::Temporary; datatype_ = data_type; set_strides(); @@ -54,16 +73,19 @@ MemoryBuffer::MemoryBuffer(float *buffer, { rect_ = rect; is_a_single_elem_ = is_a_single_elem; + memory_proxy_ = nullptr; num_channels_ = num_channels; datatype_ = COM_num_channels_data_type(num_channels); buffer_ = buffer; owns_data_ = false; + state_ = MemoryBufferState::Temporary; set_strides(); } MemoryBuffer::MemoryBuffer(const MemoryBuffer &src) : MemoryBuffer(src.datatype_, src.rect_, false) { + memory_proxy_ = src.memory_proxy_; /* src may be single elem buffer */ fill_from(src); } @@ -412,20 +434,14 @@ void MemoryBuffer::add_pixel(int x, int y, const float color[4]) } } -static void read_ewa_elem_checked(void *userdata, int x, int y, float result[4]) +static void read_ewa_elem(void *userdata, int x, int y, float result[4]) { const MemoryBuffer *buffer = static_cast(userdata); buffer->read_elem_checked(x, y, result); } -static void read_ewa_elem_clamped(void *userdata, int x, int y, float result[4]) -{ - const MemoryBuffer *buffer = static_cast(userdata); - buffer->read_elem_clamped(x, y, result); -} - void MemoryBuffer::read_elem_filtered( - const float x, const float y, float dx[2], float dy[2], bool extend_boundary, float *out) const + const float x, const float y, float dx[2], float dy[2], float *out) const { BLI_assert(datatype_ == DataType::Color); @@ -447,11 +463,49 @@ void MemoryBuffer::read_elem_filtered( uv_normal, du_normal, dv_normal, - extend_boundary ? read_ewa_elem_clamped : read_ewa_elem_checked, + read_ewa_elem, const_cast(this), out); } +/* TODO(manzanilla): to be removed with tiled implementation. */ +static void read_ewa_pixel_sampled(void *userdata, int x, int y, float result[4]) +{ + MemoryBuffer *buffer = (MemoryBuffer *)userdata; + buffer->read(result, x, y); +} + +/* TODO(manzanilla): to be removed with tiled implementation. */ +void MemoryBuffer::readEWA(float *result, const float uv[2], const float derivatives[2][2]) +{ + if (is_a_single_elem_) { + memcpy(result, buffer_, sizeof(float) * num_channels_); + } + else { + BLI_assert(datatype_ == DataType::Color); + float inv_width = 1.0f / float(this->get_width()), + inv_height = 1.0f / float(this->get_height()); + /* TODO(sergey): Render pipeline uses normalized coordinates and derivatives, + * but compositor uses pixel space. For now let's just divide the values and + * switch compositor to normalized space for EWA later. + */ + float uv_normal[2] = {uv[0] * inv_width, uv[1] * inv_height}; + float du_normal[2] = {derivatives[0][0] * inv_width, derivatives[0][1] * inv_height}; + float dv_normal[2] = {derivatives[1][0] * inv_width, derivatives[1][1] * inv_height}; + + BLI_ewa_filter(this->get_width(), + this->get_height(), + false, + true, + uv_normal, + du_normal, + dv_normal, + read_ewa_pixel_sampled, + this, + result); + } +} + void MemoryBuffer::copy_single_elem_from(const MemoryBuffer *src, const int channel_offset, const int elem_size, diff --git a/source/blender/compositor/intern/COM_MemoryBuffer.h b/source/blender/compositor/intern/COM_MemoryBuffer.h index 08e9224857a..177ea614d2e 100644 --- a/source/blender/compositor/intern/COM_MemoryBuffer.h +++ b/source/blender/compositor/intern/COM_MemoryBuffer.h @@ -12,7 +12,6 @@ #include "BLI_math_base.hh" #include "BLI_math_interp.hh" #include "BLI_math_vector.h" -#include "BLI_math_vector_types.hh" #include "BLI_rect.h" #include @@ -22,14 +21,28 @@ struct ImBuf; namespace blender::compositor { +/** + * \brief state of a memory buffer + * \ingroup Memory + */ +enum class MemoryBufferState { + /** \brief memory has been allocated on creator device and CPU machine, + * but kernel has not been executed */ + Default = 0, + /** \brief chunk is consolidated from other chunks. special state. */ + Temporary = 6, +}; + enum class MemoryBufferExtend { Clip, Extend, Repeat, }; +class MemoryProxy; + /** - * \brief a MemoryBuffer contains access to the data + * \brief a MemoryBuffer contains access to the data of a chunk */ class MemoryBuffer { public: @@ -52,16 +65,26 @@ class MemoryBuffer { int row_stride; private: + /** + * \brief proxy of the memory (same for all chunks in the same buffer) + */ + MemoryProxy *memory_proxy_; + /** * \brief the type of buffer DataType::Value, DataType::Vector, DataType::Color */ DataType datatype_; /** - * \brief region of this buffer inside + * \brief region of this buffer inside relative to the MemoryProxy */ rcti rect_; + /** + * \brief state of the buffer + */ + MemoryBufferState state_; + /** * \brief the actual float buffer/data */ @@ -90,6 +113,11 @@ class MemoryBuffer { int to_positive_y_stride_; public: + /** + * \brief construct new temporarily MemoryBuffer for an area + */ + MemoryBuffer(MemoryProxy *memory_proxy, const rcti &rect, MemoryBufferState state); + /** * \brief construct new temporarily MemoryBuffer for an area */ @@ -202,20 +230,6 @@ class MemoryBuffer { read_elem_checked(floor_x(x), floor_y(y), out); } - /* Equivalent to the GLSL texture() function with bilinear interpolation and extended boundary - * conditions. The coordinates are thus expected to have half-pixels offsets. For float buffers, - * the green and green channels will be zero and the alpha will be one. */ - float4 texture_bilinear_extend(float2 coordinates) const - { - const int2 size = int2(get_width(), get_height()); - const float2 texel_coordinates = (coordinates * float2(size)) - 0.5f; - - float4 result = float4(0.0f, 0.0f, 0.0f, 1.0f); - math::interpolate_bilinear_fl( - buffer_, result, size.x, size.y, num_channels_, texel_coordinates.x, texel_coordinates.y); - return result; - } - void read_elem_bilinear(float x, float y, float *out) const { /* Only clear past +/-1 borders to be able to smooth edges. */ @@ -278,8 +292,7 @@ class MemoryBuffer { } } - void read_elem_filtered( - float x, float y, float dx[2], float dy[2], bool extend_boundary, float *out) const; + void read_elem_filtered(float x, float y, float dx[2], float dy[2], float *out) const; /** * Get channel value at given coordinates. @@ -371,6 +384,12 @@ class MemoryBuffer { return buffer_; } + float *release_ownership_buffer() + { + owns_data_ = false; + return buffer_; + } + /** * Converts a single elem buffer to a full size buffer (allocates memory for all * elements in resolution). @@ -472,6 +491,8 @@ class MemoryBuffer { y = y + rect_.ymin; } + /* TODO(manzanilla): to be removed with tiled implementation. For applying #MemoryBufferExtend + * use #wrap_pixel. */ inline void read(float *result, int x, int y, @@ -493,6 +514,28 @@ class MemoryBuffer { memcpy(result, buffer, sizeof(float) * num_channels_); } } + + /* TODO(manzanilla): to be removed with tiled implementation. */ + inline void read_no_check(float *result, + int x, + int y, + MemoryBufferExtend extend_x = MemoryBufferExtend::Clip, + MemoryBufferExtend extend_y = MemoryBufferExtend::Clip) + { + int u = x; + int v = y; + + this->wrap_pixel(u, v, extend_x, extend_y); + const int offset = get_coords_offset(u, v); + + BLI_assert(offset >= 0); + BLI_assert(offset < this->buffer_len() * num_channels_); + BLI_assert(!(extend_x == MemoryBufferExtend::Clip && (u < rect_.xmin || u >= rect_.xmax)) && + !(extend_y == MemoryBufferExtend::Clip && (v < rect_.ymin || v >= rect_.ymax))); + float *buffer = &buffer_[offset]; + memcpy(result, buffer, sizeof(float) * num_channels_); + } + void write_pixel(int x, int y, const float color[4]); void add_pixel(int x, int y, const float color[4]); inline void read_bilinear(float *result, @@ -526,6 +569,16 @@ class MemoryBuffer { } } + void readEWA(float *result, const float uv[2], const float derivatives[2][2]); + + /** + * \brief is this MemoryBuffer a temporarily buffer (based on an area, not on a chunk) + */ + inline bool is_temporarily() const + { + return state_ == MemoryBufferState::Temporary; + } + /** * \brief Apply a color processor on the given area. */ diff --git a/source/blender/compositor/intern/COM_MemoryProxy.cc b/source/blender/compositor/intern/COM_MemoryProxy.cc new file mode 100644 index 00000000000..2388cf69645 --- /dev/null +++ b/source/blender/compositor/intern/COM_MemoryProxy.cc @@ -0,0 +1,37 @@ +/* SPDX-FileCopyrightText: 2011 Blender Authors + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +#include "COM_MemoryProxy.h" +#include "COM_MemoryBuffer.h" + +namespace blender::compositor { + +MemoryProxy::MemoryProxy(DataType datatype) +{ + write_buffer_operation_ = nullptr; + executor_ = nullptr; + buffer_ = nullptr; + datatype_ = datatype; +} + +void MemoryProxy::allocate(uint width, uint height) +{ + rcti result; + result.xmin = 0; + result.xmax = width; + result.ymin = 0; + result.ymax = height; + + buffer_ = new MemoryBuffer(this, result, MemoryBufferState::Default); +} + +void MemoryProxy::free() +{ + if (buffer_) { + delete buffer_; + buffer_ = nullptr; + } +} + +} // namespace blender::compositor diff --git a/source/blender/compositor/intern/COM_MemoryProxy.h b/source/blender/compositor/intern/COM_MemoryProxy.h new file mode 100644 index 00000000000..ca531eb66dc --- /dev/null +++ b/source/blender/compositor/intern/COM_MemoryProxy.h @@ -0,0 +1,114 @@ +/* SPDX-FileCopyrightText: 2011 Blender Authors + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +#pragma once + +#ifdef WITH_CXX_GUARDEDALLOC +# include "MEM_guardedalloc.h" +#endif + +#include "COM_defines.h" + +namespace blender::compositor { + +/* Forward declarations. */ +class MemoryBuffer; +class ExecutionGroup; +class WriteBufferOperation; + +/** + * \brief A MemoryProxy is a unique identifier for a memory buffer. + * A single MemoryProxy is used among all chunks of the same buffer, + * the MemoryBuffer only stores the data of a single chunk. + * \ingroup Memory + */ +class MemoryProxy { + private: + /** + * \brief reference to the output operation of the executiongroup + */ + WriteBufferOperation *write_buffer_operation_; + + /** + * \brief reference to the executor. the Execution group that can fill a chunk + */ + ExecutionGroup *executor_; + + /** + * \brief the allocated memory + */ + MemoryBuffer *buffer_; + + /** + * \brief datatype of this MemoryProxy + */ + DataType datatype_; + + public: + MemoryProxy(DataType type); + + /** + * \brief set the ExecutionGroup that can be scheduled to calculate a certain chunk. + * \param group: the ExecutionGroup to set + */ + void set_executor(ExecutionGroup *executor) + { + executor_ = executor; + } + + /** + * \brief get the ExecutionGroup that can be scheduled to calculate a certain chunk. + */ + ExecutionGroup *get_executor() const + { + return executor_; + } + + /** + * \brief set the WriteBufferOperation that is responsible for writing to this MemoryProxy + * \param operation: + */ + void set_write_buffer_operation(WriteBufferOperation *operation) + { + write_buffer_operation_ = operation; + } + + /** + * \brief get the WriteBufferOperation that is responsible for writing to this MemoryProxy + * \return WriteBufferOperation + */ + WriteBufferOperation *get_write_buffer_operation() const + { + return write_buffer_operation_; + } + + /** + * \brief allocate memory of size width x height + */ + void allocate(unsigned int width, unsigned int height); + + /** + * \brief free the allocated memory + */ + void free(); + + /** + * \brief get the allocated memory + */ + inline MemoryBuffer *get_buffer() + { + return buffer_; + } + + inline DataType get_data_type() + { + return datatype_; + } + +#ifdef WITH_CXX_GUARDEDALLOC + MEM_CXX_CLASS_ALLOC_FUNCS("COM:MemoryProxy") +#endif +}; + +} // namespace blender::compositor diff --git a/source/blender/compositor/intern/COM_MultiThreadedOperation.cc b/source/blender/compositor/intern/COM_MultiThreadedOperation.cc index 695e83e8cf8..cfb65c9376f 100644 --- a/source/blender/compositor/intern/COM_MultiThreadedOperation.cc +++ b/source/blender/compositor/intern/COM_MultiThreadedOperation.cc @@ -11,6 +11,7 @@ MultiThreadedOperation::MultiThreadedOperation() { num_passes_ = 1; current_pass_ = 0; + flags_.is_fullframe_operation = true; } void MultiThreadedOperation::update_memory_buffer(MemoryBuffer *output, diff --git a/source/blender/compositor/intern/COM_Node.h b/source/blender/compositor/intern/COM_Node.h index 7d79b342870..b957fbf3eba 100644 --- a/source/blender/compositor/intern/COM_Node.h +++ b/source/blender/compositor/intern/COM_Node.h @@ -98,7 +98,7 @@ class Node { /** * \brief get access to the vector of input sockets */ - Span get_input_sockets() const + const Vector &get_input_sockets() const { return inputs_; } @@ -106,7 +106,7 @@ class Node { /** * \brief get access to the vector of input sockets */ - Span get_output_sockets() const + const Vector &get_output_sockets() const { return outputs_; } diff --git a/source/blender/compositor/intern/COM_NodeGraph.cc b/source/blender/compositor/intern/COM_NodeGraph.cc index 3059ebbc296..013d55d1845 100644 --- a/source/blender/compositor/intern/COM_NodeGraph.cc +++ b/source/blender/compositor/intern/COM_NodeGraph.cc @@ -231,7 +231,7 @@ void NodeGraph::add_proxies_group_inputs(bNode *b_node, bNode *b_node_io) } } -void NodeGraph::add_proxies_group_outputs(const CompositorContext & /*context*/, +void NodeGraph::add_proxies_group_outputs(const CompositorContext &context, bNode *b_node, bNode *b_node_io) { @@ -247,8 +247,16 @@ void NodeGraph::add_proxies_group_outputs(const CompositorContext & /*context*/, { bNodeSocket *b_sock_group = find_b_node_output(b_node, b_sock_io->identifier); if (b_sock_group) { - SocketProxyNode *proxy = new SocketProxyNode(b_node_io, b_sock_io, b_sock_group, true); - add_node(proxy, b_group_tree, key, is_active_group); + if (context.is_groupnode_buffer_enabled() && + context.get_execution_model() == eExecutionModel::Tiled) + { + SocketBufferNode *buffer = new SocketBufferNode(b_node_io, b_sock_io, b_sock_group); + add_node(buffer, b_group_tree, key, is_active_group); + } + else { + SocketProxyNode *proxy = new SocketProxyNode(b_node_io, b_sock_io, b_sock_group, true); + add_node(proxy, b_group_tree, key, is_active_group); + } } } } diff --git a/source/blender/compositor/intern/COM_NodeGraph.h b/source/blender/compositor/intern/COM_NodeGraph.h index b4d9a9a94e8..6a0592e66e1 100644 --- a/source/blender/compositor/intern/COM_NodeGraph.h +++ b/source/blender/compositor/intern/COM_NodeGraph.h @@ -37,11 +37,11 @@ class NodeGraph { public: ~NodeGraph(); - Span nodes() const + const Vector &nodes() const { return nodes_; } - Span links() const + const Vector &links() const { return links_; } diff --git a/source/blender/compositor/intern/COM_NodeOperation.cc b/source/blender/compositor/intern/COM_NodeOperation.cc index 55b813c74cf..0cc71829c33 100644 --- a/source/blender/compositor/intern/COM_NodeOperation.cc +++ b/source/blender/compositor/intern/COM_NodeOperation.cc @@ -4,9 +4,10 @@ #include +#include "COM_BufferOperation.h" #include "COM_ExecutionSystem.h" +#include "COM_ReadBufferOperation.h" -#include "COM_ConstantOperation.h" #include "COM_NodeOperation.h" /* own include */ namespace blender::compositor { @@ -155,6 +156,26 @@ void NodeOperation::init_execution() /* pass */ } +void NodeOperation::init_mutex() +{ + BLI_mutex_init(&mutex_); +} + +void NodeOperation::lock_mutex() +{ + BLI_mutex_lock(&mutex_); +} + +void NodeOperation::unlock_mutex() +{ + BLI_mutex_unlock(&mutex_); +} + +void NodeOperation::deinit_mutex() +{ + BLI_mutex_end(&mutex_); +} + void NodeOperation::deinit_execution() { /* pass */ @@ -192,15 +213,57 @@ NodeOperation *NodeOperation::get_input_operation(int index) return nullptr; } +bool NodeOperation::determine_depending_area_of_interest(rcti *input, + ReadBufferOperation *read_operation, + rcti *output) +{ + if (inputs_.is_empty()) { + BLI_rcti_init(output, input->xmin, input->xmax, input->ymin, input->ymax); + return false; + } + + rcti temp_output; + bool first = true; + for (int i = 0; i < get_number_of_input_sockets(); i++) { + NodeOperation *input_operation = this->get_input_operation(i); + if (input_operation && + input_operation->determine_depending_area_of_interest(input, read_operation, &temp_output)) + { + if (first) { + output->xmin = temp_output.xmin; + output->ymin = temp_output.ymin; + output->xmax = temp_output.xmax; + output->ymax = temp_output.ymax; + first = false; + } + else { + output->xmin = std::min(output->xmin, temp_output.xmin); + output->ymin = std::min(output->ymin, temp_output.ymin); + output->xmax = std::max(output->xmax, temp_output.xmax); + output->ymax = std::max(output->ymax, temp_output.ymax); + } + } + } + return !first; +} + /* -------------------------------------------------------------------- */ /** \name Full Frame Methods * \{ */ -void NodeOperation::get_area_of_interest(const int /*input_idx*/, +void NodeOperation::get_area_of_interest(const int input_idx, const rcti &output_area, rcti &r_input_area) { - r_input_area = output_area; + if (get_flags().is_fullframe_operation) { + r_input_area = output_area; + } + else { + /* Non full-frame operations never implement this method. To ensure correctness assume + * whole area is used. */ + NodeOperation *input_op = get_input_operation(input_idx); + r_input_area = input_op->get_canvas(); + } } void NodeOperation::get_area_of_interest(NodeOperation *input_op, @@ -220,7 +283,12 @@ void NodeOperation::render(MemoryBuffer *output_buf, Span areas, Span inputs_bufs) { - render_full_frame(output_buf, areas, inputs_bufs); + if (get_flags().is_fullframe_operation) { + render_full_frame(output_buf, areas, inputs_bufs); + } + else { + render_full_frame_fallback(output_buf, areas, inputs_bufs); + } } void NodeOperation::render_full_frame(MemoryBuffer *output_buf, @@ -234,6 +302,92 @@ void NodeOperation::render_full_frame(MemoryBuffer *output_buf, deinit_execution(); } +void NodeOperation::render_full_frame_fallback(MemoryBuffer *output_buf, + Span areas, + Span inputs_bufs) +{ + Vector orig_input_links = replace_inputs_with_buffers(inputs_bufs); + + init_execution(); + const bool is_output_operation = get_number_of_output_sockets() == 0; + if (!is_output_operation && output_buf->is_a_single_elem()) { + float *output_elem = output_buf->get_elem(0, 0); + read_sampled(output_elem, 0, 0, PixelSampler::Nearest); + } + else { + for (const rcti &rect : areas) { + exec_system_->execute_work(rect, [=](const rcti &split_rect) { + rcti tile_rect = split_rect; + if (is_output_operation) { + execute_region(&tile_rect, 0); + } + else { + render_tile(output_buf, &tile_rect); + } + }); + } + } + deinit_execution(); + + remove_buffers_and_restore_original_inputs(orig_input_links); +} + +void NodeOperation::render_tile(MemoryBuffer *output_buf, rcti *tile_rect) +{ + const bool is_complex = get_flags().complex; + void *tile_data = is_complex ? initialize_tile_data(tile_rect) : nullptr; + const int elem_stride = output_buf->elem_stride; + for (int y = tile_rect->ymin; y < tile_rect->ymax; y++) { + float *output_elem = output_buf->get_elem(tile_rect->xmin, y); + if (is_complex) { + for (int x = tile_rect->xmin; x < tile_rect->xmax; x++) { + read(output_elem, x, y, tile_data); + output_elem += elem_stride; + } + } + else { + for (int x = tile_rect->xmin; x < tile_rect->xmax; x++) { + read_sampled(output_elem, x, y, PixelSampler::Nearest); + output_elem += elem_stride; + } + } + } + if (tile_data) { + deinitialize_tile_data(tile_rect, tile_data); + } +} + +Vector NodeOperation::replace_inputs_with_buffers( + Span inputs_bufs) +{ + BLI_assert(inputs_bufs.size() == get_number_of_input_sockets()); + Vector orig_links(inputs_bufs.size()); + for (int i = 0; i < inputs_bufs.size(); i++) { + NodeOperationInput *input_socket = get_input_socket(i); + BufferOperation *buffer_op = new BufferOperation(inputs_bufs[i], + input_socket->get_data_type()); + orig_links[i] = input_socket->get_link(); + input_socket->set_link(buffer_op->get_output_socket()); + buffer_op->init_execution(); + } + return orig_links; +} + +void NodeOperation::remove_buffers_and_restore_original_inputs( + Span original_inputs_links) +{ + BLI_assert(original_inputs_links.size() == get_number_of_input_sockets()); + for (int i = 0; i < original_inputs_links.size(); i++) { + NodeOperation *buffer_op = get_input_operation(i); + BLI_assert(buffer_op != nullptr); + BLI_assert(typeid(*buffer_op) == typeid(BufferOperation)); + buffer_op->deinit_execution(); + NodeOperationInput *input_socket = get_input_socket(i); + input_socket->set_link(original_inputs_links[i]); + delete buffer_op; + } +} + /** \} */ /***************** @@ -290,6 +444,15 @@ void NodeOperationOutput::determine_canvas(const rcti &preferred_area, rcti &r_a std::ostream &operator<<(std::ostream &os, const NodeOperationFlags &node_operation_flags) { + if (node_operation_flags.complex) { + os << "complex,"; + } + if (node_operation_flags.open_cl) { + os << "open_cl,"; + } + if (node_operation_flags.single_threaded) { + os << "single_threaded,"; + } if (node_operation_flags.use_render_border) { os << "render_border,"; } @@ -302,6 +465,12 @@ std::ostream &operator<<(std::ostream &os, const NodeOperationFlags &node_operat if (node_operation_flags.is_set_operation) { os << "set_operation,"; } + if (node_operation_flags.is_write_buffer_operation) { + os << "write_buffer,"; + } + if (node_operation_flags.is_read_buffer_operation) { + os << "read_buffer,"; + } if (node_operation_flags.is_proxy_operation) { os << "proxy,"; } @@ -314,6 +483,9 @@ std::ostream &operator<<(std::ostream &os, const NodeOperationFlags &node_operat if (!node_operation_flags.use_datatype_conversion) { os << "no_conversion,"; } + if (node_operation_flags.is_fullframe_operation) { + os << "full_frame,"; + } if (node_operation_flags.is_constant_operation) { os << "contant_operation,"; } @@ -333,6 +505,16 @@ std::ostream &operator<<(std::ostream &os, const NodeOperation &node_operation) os << ",name=" << node_operation.get_name(); } os << ",flags={" << flags << "}"; + if (flags.is_read_buffer_operation) { + const ReadBufferOperation *read_operation = (const ReadBufferOperation *)&node_operation; + const MemoryProxy *proxy = read_operation->get_memory_proxy(); + if (proxy) { + const WriteBufferOperation *write_operation = proxy->get_write_buffer_operation(); + if (write_operation) { + os << ",write=" << (NodeOperation &)*write_operation; + } + } + } os << ")"; return os; diff --git a/source/blender/compositor/intern/COM_NodeOperation.h b/source/blender/compositor/intern/COM_NodeOperation.h index b68b4d67bd1..82c002e1852 100644 --- a/source/blender/compositor/intern/COM_NodeOperation.h +++ b/source/blender/compositor/intern/COM_NodeOperation.h @@ -19,13 +19,16 @@ #include "COM_MemoryBuffer.h" #include "COM_MetaData.h" -#include "BKE_node.hh" #include "BKE_node_runtime.hh" +#include "clew.h" + #include "DNA_node_types.h" namespace blender::compositor { +class OpenCLDevice; +class ReadBufferOperation; class ExecutionSystem; class NodeOperation; class NodeOperationOutput; @@ -161,6 +164,28 @@ class NodeOperationOutput { }; struct NodeOperationFlags { + /** + * Is this an complex operation. + * + * The input and output buffers of Complex operations are stored in buffers. It allows + * sequential and read/write. + * + * Complex operations are typically doing many reads to calculate the output of a single pixel. + * Mostly Filter types (Blurs, Convolution, Defocus etc) need this to be set to true. + */ + bool complex : 1; + + /** + * Does this operation support OpenCL. + */ + bool open_cl : 1; + + /** + * TODO: Remove this flag and #SingleThreadedOperation if tiled implementation is removed. + * Full-frame implementation doesn't need it. + */ + bool single_threaded : 1; + /** * Does the operation needs a viewer border. * Basically, setting border need to happen for only operations @@ -188,6 +213,8 @@ struct NodeOperationFlags { * TODO: To be replaced by is_constant_operation flag once tiled implementation is removed. */ bool is_set_operation : 1; + bool is_write_buffer_operation : 1; + bool is_read_buffer_operation : 1; bool is_proxy_operation : 1; bool is_viewer_operation : 1; bool is_preview_operation : 1; @@ -200,6 +227,11 @@ struct NodeOperationFlags { */ bool use_datatype_conversion : 1; + /** + * Has this operation fullframe implementation. + */ + bool is_fullframe_operation : 1; + /** * Whether operation is a primitive constant operation (Color/Vector/Value). */ @@ -213,14 +245,20 @@ struct NodeOperationFlags { NodeOperationFlags() { + complex = false; + single_threaded = false; + open_cl = false; use_render_border = false; use_viewer_border = false; is_canvas_set = false; is_set_operation = false; + is_read_buffer_operation = false; + is_write_buffer_operation = false; is_proxy_operation = false; is_viewer_operation = false; is_preview_operation = false; use_datatype_conversion = true; + is_fullframe_operation = false; is_constant_operation = false; can_be_constant = false; } @@ -272,8 +310,6 @@ class NodeOperation { private: int id_; std::string name_; - bNodeInstanceKey node_instance_key_{NODE_INSTANCE_KEY_NONE}; - Vector inputs_; Vector outputs_; @@ -287,12 +323,28 @@ class NodeOperation { std::function modify_determined_canvas_fn_; + /** + * \brief mutex reference for very special node initializations + * \note only use when you really know what you are doing. + * this mutex is used to share data among chunks in the same operation + * \see TonemapOperation for an example of usage + * \see NodeOperation.init_mutex initializes this mutex + * \see NodeOperation.deinit_mutex deinitializes this mutex + * \see NodeOperation.get_mutex retrieve a pointer to this mutex. + */ + ThreadMutex mutex_; + /** * \brief reference to the editing bNodeTree, used for break and update callback */ const bNodeTree *btree_; protected: + /** + * Compositor execution model. + */ + eExecutionModel execution_model_; + rcti canvas_ = COM_AREA_NONE; /** @@ -325,15 +377,6 @@ class NodeOperation { return id_; } - const void set_node_instance_key(const bNodeInstanceKey &node_instance_key) - { - node_instance_key_ = node_instance_key; - } - const bNodeInstanceKey get_node_instance_key() const - { - return node_instance_key_; - } - /** Get constant value when operation is constant, otherwise return default_value. */ float get_constant_value_default(float default_value); /** Get constant elem when operation is constant, otherwise return default_elem. */ @@ -386,6 +429,11 @@ class NodeOperation { return false; } + void set_execution_model(const eExecutionModel model) + { + execution_model_ = model; + } + void set_bnodetree(const bNodeTree *tree) { btree_ = tree; @@ -404,6 +452,58 @@ class NodeOperation { virtual void init_execution(); + /** + * \brief when a chunk is executed by a CPUDevice, this method is called + * \ingroup execution + * \param rect: the rectangle of the chunk (location and size) + * \param chunk_number: the chunk_number to be calculated + * \param memory_buffers: all input MemoryBuffer's needed + */ + virtual void execute_region(rcti * /*rect*/, unsigned int /*chunk_number*/) {} + + /** + * \brief when a chunk is executed by an OpenCLDevice, this method is called + * \ingroup execution + * \note this method is only implemented in WriteBufferOperation + * \param context: the OpenCL context + * \param program: the OpenCL program containing all compositor kernels + * \param queue: the OpenCL command queue of the device the chunk is executed on + * \param rect: the rectangle of the chunk (location and size) + * \param chunk_number: the chunk_number to be calculated + * \param memory_buffers: all input MemoryBuffer's needed + * \param output_buffer: the output-buffer to write to + */ + virtual void execute_opencl_region(OpenCLDevice * /*device*/, + rcti * /*rect*/, + unsigned int /*chunk_number*/, + MemoryBuffer ** /*memory_buffers*/, + MemoryBuffer * /*output_buffer*/) + { + } + + /** + * \brief custom handle to add new tasks to the OpenCL command queue + * in order to execute a chunk on an GPUDevice. + * \ingroup execution + * \param context: the OpenCL context + * \param program: the OpenCL program containing all compositor kernels + * \param queue: the OpenCL command queue of the device the chunk is executed on + * \param output_memory_buffer: the allocated memory buffer in main CPU memory + * \param cl_output_buffer: the allocated memory buffer in OpenCLDevice memory + * \param input_memory_buffers: all input MemoryBuffer's needed + * \param cl_mem_to_clean_up: all created cl_mem references must be added to this list. + * Framework will clean this after execution + * \param cl_kernels_to_clean_up: all created cl_kernel references must be added to this list. + * Framework will clean this after execution + */ + virtual void execute_opencl(OpenCLDevice * /*device*/, + MemoryBuffer * /*output_memory_buffer*/, + cl_mem /*cl_output_buffer*/, + MemoryBuffer ** /*input_memory_buffers*/, + std::list * /*cl_mem_to_clean_up*/, + std::list * /*cl_kernels_to_clean_up*/) + { + } virtual void deinit_execution(); void set_canvas(const rcti &canvas_area); @@ -426,6 +526,10 @@ class NodeOperation { return false; } + virtual bool determine_depending_area_of_interest(rcti *input, + ReadBufferOperation *read_operation, + rcti *output); + /** * \brief set the index of the input socket that will determine the canvas of this * operation \param index: the index to set @@ -473,6 +577,36 @@ class NodeOperation { return BLI_rcti_size_y(&get_canvas()); } + inline void read_sampled(float result[4], float x, float y, PixelSampler sampler) + { + execute_pixel_sampled(result, x, y, sampler); + } + + inline void read_filtered(float result[4], float x, float y, float dx[2], float dy[2]) + { + execute_pixel_filtered(result, x, y, dx, dy); + } + + inline void read(float result[4], int x, int y, void *chunk_data) + { + execute_pixel(result, x, y, chunk_data); + } + + inline void read_clamped(float result[4], int x, int y, void *chunk_data) + { + execute_pixel(result, + math::clamp(x, 0, int(this->get_width()) - 1), + math::clamp(y, 0, int(this->get_height()) - 1), + chunk_data); + } + + virtual void *initialize_tile_data(rcti * /*rect*/) + { + return 0; + } + + virtual void deinitialize_tile_data(rcti * /*rect*/, void * /*data*/) {} + virtual MemoryBuffer *get_input_memory_buffer(MemoryBuffer ** /*memory_buffers*/) { return 0; @@ -558,9 +692,85 @@ class NodeOperation { void add_input_socket(DataType datatype, ResizeMode resize_mode = ResizeMode::Center); void add_output_socket(DataType datatype); + /* TODO(manzanilla): to be removed with tiled implementation. */ + void set_width(unsigned int width) + { + canvas_.xmax = canvas_.xmin + width; + flags_.is_canvas_set = true; + } + void set_height(unsigned int height) + { + canvas_.ymax = canvas_.ymin + height; + flags_.is_canvas_set = true; + } + SocketReader *get_input_socket_reader(unsigned int index); + void deinit_mutex(); + void init_mutex(); + void lock_mutex(); + void unlock_mutex(); + + /** + * \brief set whether this operation is complex + * + * Complex operations are typically doing many reads to calculate the output of a single pixel. + * Mostly Filter types (Blurs, Convolution, Defocus etc) need this to be set to true. + */ + void set_complex(bool complex) + { + flags_.complex = complex; + } + + /** + * \brief calculate a single pixel + * \note this method is called for non-complex + * \param result: is a float[4] array to store the result + * \param x: the x-coordinate of the pixel to calculate in image space + * \param y: the y-coordinate of the pixel to calculate in image space + * \param input_buffers: chunks that can be read by their ReadBufferOperation. + */ + virtual void execute_pixel_sampled(float /*output*/[4], + float /*x*/, + float /*y*/, + PixelSampler /*sampler*/) + { + } + + /** + * \brief calculate a single pixel + * \note this method is called for complex + * \param result: is a float[4] array to store the result + * \param x: the x-coordinate of the pixel to calculate in image space + * \param y: the y-coordinate of the pixel to calculate in image space + * \param input_buffers: chunks that can be read by their ReadBufferOperation. + * \param chunk_data: chunk specific data a during execution time. + */ + virtual void execute_pixel(float output[4], int x, int y, void * /*chunk_data*/) + { + execute_pixel_sampled(output, x, y, PixelSampler::Nearest); + } + + /** + * \brief calculate a single pixel using an EWA filter + * \note this method is called for complex + * \param result: is a float[4] array to store the result + * \param x: the x-coordinate of the pixel to calculate in image space + * \param y: the y-coordinate of the pixel to calculate in image space + * \param dx: + * \param dy: + * \param input_buffers: chunks that can be read by their ReadBufferOperation. + */ + virtual void execute_pixel_filtered( + float /*output*/[4], float /*x*/, float /*y*/, float /*dx*/[2], float /*dy*/[2]) + { + } + private: + /* -------------------------------------------------------------------- */ + /** \name Full Frame Methods + * \{ */ + /** * Renders given areas using operations full frame implementation. */ @@ -568,6 +778,22 @@ class NodeOperation { Span areas, Span inputs_bufs); + /** + * Renders given areas using operations tiled implementation. + */ + void render_full_frame_fallback(MemoryBuffer *output_buf, + Span areas, + Span inputs); + void render_tile(MemoryBuffer *output_buf, rcti *tile_rect); + /** + * \return Replaced inputs links. + */ + Vector replace_inputs_with_buffers(Span inputs_bufs); + void remove_buffers_and_restore_original_inputs( + Span original_inputs_links); + + /** \} */ + /* allow the DebugInfo class to look at internals */ friend class DebugInfo; diff --git a/source/blender/compositor/intern/COM_NodeOperationBuilder.cc b/source/blender/compositor/intern/COM_NodeOperationBuilder.cc index 6afac170ba1..70a2fbbe12f 100644 --- a/source/blender/compositor/intern/COM_NodeOperationBuilder.cc +++ b/source/blender/compositor/intern/COM_NodeOperationBuilder.cc @@ -11,11 +11,14 @@ #include "COM_Converter.h" #include "COM_Debug.h" +#include "COM_ExecutionGroup.h" #include "COM_PreviewOperation.h" +#include "COM_ReadBufferOperation.h" #include "COM_SetColorOperation.h" #include "COM_SetValueOperation.h" #include "COM_SetVectorOperation.h" #include "COM_ViewerOperation.h" +#include "COM_WriteBufferOperation.h" #include "COM_ConstantFolder.h" #include "COM_NodeOperationBuilder.h" /* own include */ @@ -81,15 +84,22 @@ void NodeOperationBuilder::convert_to_operations(ExecutionSystem *system) add_datatype_conversions(); - save_graphviz("compositor_prior_folding"); - ConstantFolder folder(*this); - folder.fold_operations(); + if (context_->get_execution_model() == eExecutionModel::FullFrame) { + save_graphviz("compositor_prior_folding"); + ConstantFolder folder(*this); + folder.fold_operations(); + } determine_canvases(); save_graphviz("compositor_prior_merging"); merge_equal_operations(); + if (context_->get_execution_model() == eExecutionModel::Tiled) { + /* surround complex ops with read/write buffer */ + add_complex_operation_buffers(); + } + /* links not available from here on */ /* XXX make links_ a local variable to avoid confusion! */ links_.clear(); @@ -99,8 +109,13 @@ void NodeOperationBuilder::convert_to_operations(ExecutionSystem *system) /* ensure topological (link-based) order of nodes */ // sort_operations(); /* not needed yet. */ + if (context_->get_execution_model() == eExecutionModel::Tiled) { + /* create execution groups */ + group_operations(); + } + /* transfer resulting operations to the system */ - system->set_operations(operations_); + system->set_operations(operations_, groups_); } void NodeOperationBuilder::add_operation(NodeOperation *operation) @@ -109,8 +124,8 @@ void NodeOperationBuilder::add_operation(NodeOperation *operation) operations_.append(operation); if (current_node_) { operation->set_name(current_node_->get_bnode()->name); - operation->set_node_instance_key(current_node_->get_instance_key()); } + operation->set_execution_model(context_->get_execution_model()); operation->set_execution_system(exec_system_); } @@ -501,6 +516,133 @@ Vector NodeOperationBuilder::cache_output_links( return inputs; } +WriteBufferOperation *NodeOperationBuilder::find_attached_write_buffer_operation( + NodeOperationOutput *output) const +{ + for (const Link &link : links_) { + if (link.from() == output) { + NodeOperation &op = link.to()->get_operation(); + if (op.get_flags().is_write_buffer_operation) { + return (WriteBufferOperation *)(&op); + } + } + } + return nullptr; +} + +void NodeOperationBuilder::add_input_buffers(NodeOperation * /*operation*/, + NodeOperationInput *input) +{ + if (!input->is_connected()) { + return; + } + + NodeOperationOutput *output = input->get_link(); + if (output->get_operation().get_flags().is_read_buffer_operation) { + /* input is already buffered, no need to add another */ + return; + } + + /* this link will be replaced below */ + remove_input_link(input); + + /* check of other end already has write operation, otherwise add a new one */ + WriteBufferOperation *writeoperation = find_attached_write_buffer_operation(output); + if (!writeoperation) { + writeoperation = new WriteBufferOperation(output->get_data_type()); + writeoperation->set_bnodetree(context_->get_bnodetree()); + add_operation(writeoperation); + + add_link(output, writeoperation->get_input_socket(0)); + + writeoperation->read_resolution_from_input_socket(); + } + + /* add readbuffer op for the input */ + ReadBufferOperation *readoperation = new ReadBufferOperation(output->get_data_type()); + readoperation->set_memory_proxy(writeoperation->get_memory_proxy()); + this->add_operation(readoperation); + + add_link(readoperation->get_output_socket(), input); + + readoperation->read_resolution_from_write_buffer(); +} + +void NodeOperationBuilder::add_output_buffers(NodeOperation *operation, + NodeOperationOutput *output) +{ + /* cache connected sockets, so we can safely remove links first before replacing them */ + Vector targets = cache_output_links(output); + if (targets.is_empty()) { + return; + } + + WriteBufferOperation *write_operation = nullptr; + for (NodeOperationInput *target : targets) { + /* try to find existing write buffer operation */ + if (target->get_operation().get_flags().is_write_buffer_operation) { + BLI_assert(write_operation == nullptr); /* there should only be one write op connected */ + write_operation = (WriteBufferOperation *)&target->get_operation(); + } + else { + /* remove all links to other nodes */ + remove_input_link(target); + } + } + + /* if no write buffer operation exists yet, create a new one */ + if (!write_operation) { + write_operation = new WriteBufferOperation(operation->get_output_socket()->get_data_type()); + write_operation->set_bnodetree(context_->get_bnodetree()); + add_operation(write_operation); + + add_link(output, write_operation->get_input_socket(0)); + } + + write_operation->read_resolution_from_input_socket(); + + /* add readbuffer op for every former connected input */ + for (NodeOperationInput *target : targets) { + if (&target->get_operation() == write_operation) { + continue; /* skip existing write op links */ + } + + ReadBufferOperation *readoperation = new ReadBufferOperation( + operation->get_output_socket()->get_data_type()); + readoperation->set_memory_proxy(write_operation->get_memory_proxy()); + add_operation(readoperation); + + add_link(readoperation->get_output_socket(), target); + + readoperation->read_resolution_from_write_buffer(); + } +} + +void NodeOperationBuilder::add_complex_operation_buffers() +{ + /* NOTE: complex ops and get cached here first, since adding operations + * will invalidate iterators over the main operations_ + */ + Vector complex_ops; + for (NodeOperation *operation : operations_) { + if (operation->get_flags().complex) { + complex_ops.append(operation); + } + } + + for (NodeOperation *op : complex_ops) { + DebugInfo::operation_read_write_buffer(op); + + for (int index = 0; index < op->get_number_of_input_sockets(); index++) { + add_input_buffers(op, op->get_input_socket(index)); + } + + for (int index = 0; index < op->get_number_of_output_sockets(); index++) { + add_output_buffers(op, op->get_output_socket(index)); + } + } +} + using Tags = std::set; static void find_reachable_operations_recursive(Tags &reachable, NodeOperation *op) @@ -516,6 +658,13 @@ static void find_reachable_operations_recursive(Tags &reachable, NodeOperation * find_reachable_operations_recursive(reachable, &input->get_link()->get_operation()); } } + + /* associated write-buffer operations are executed as well */ + if (op->get_flags().is_read_buffer_operation) { + ReadBufferOperation *read_op = (ReadBufferOperation *)op; + MemoryProxy *memproxy = read_op->get_memory_proxy(); + find_reachable_operations_recursive(reachable, memproxy->get_write_buffer_operation()); + } } void NodeOperationBuilder::prune_operations() @@ -575,10 +724,62 @@ void NodeOperationBuilder::sort_operations() operations_ = sorted; } +static void add_group_operations_recursive(Tags &visited, NodeOperation *op, ExecutionGroup *group) +{ + if (visited.find(op) != visited.end()) { + return; + } + visited.insert(op); + + if (!group->add_operation(op)) { + return; + } + + /* add all eligible input ops to the group */ + for (int i = 0; i < op->get_number_of_input_sockets(); i++) { + NodeOperationInput *input = op->get_input_socket(i); + if (input->is_connected()) { + add_group_operations_recursive(visited, &input->get_link()->get_operation(), group); + } + } +} + +ExecutionGroup *NodeOperationBuilder::make_group(NodeOperation *op) +{ + ExecutionGroup *group = new ExecutionGroup(groups_.size()); + groups_.append(group); + + Tags visited; + add_group_operations_recursive(visited, op, group); + + return group; +} + +void NodeOperationBuilder::group_operations() +{ + for (NodeOperation *op : operations_) { + if (op->is_output_operation(context_->is_rendering())) { + ExecutionGroup *group = make_group(op); + group->set_output_execution_group(true); + } + + /* add new groups for associated memory proxies where needed */ + if (op->get_flags().is_read_buffer_operation) { + ReadBufferOperation *read_op = (ReadBufferOperation *)op; + MemoryProxy *memproxy = read_op->get_memory_proxy(); + + if (memproxy->get_executor() == nullptr) { + ExecutionGroup *group = make_group(memproxy->get_write_buffer_operation()); + memproxy->set_executor(group); + } + } + } +} + void NodeOperationBuilder::save_graphviz(StringRefNull name) { if (COM_EXPORT_GRAPHVIZ) { - exec_system_->set_operations(operations_); + exec_system_->set_operations(operations_, groups_); DebugInfo::graphviz(exec_system_, name); } } @@ -598,6 +799,15 @@ std::ostream &operator<<(std::ostream &os, const NodeOperationBuilder &builder) os << " op" << link.from()->get_operation().get_id() << " -> op" << link.to()->get_operation().get_id() << ";\n"; } + for (const NodeOperation *operation : builder.get_operations()) { + if (operation->get_flags().is_read_buffer_operation) { + const ReadBufferOperation &read_operation = static_cast( + *operation); + const WriteBufferOperation &write_operation = + *read_operation.get_memory_proxy()->get_write_buffer_operation(); + os << " op" << write_operation.get_id() << " -> op" << read_operation.get_id() << ";\n"; + } + } os << "}\n"; os << "# Builder end\n"; diff --git a/source/blender/compositor/intern/COM_NodeOperationBuilder.h b/source/blender/compositor/intern/COM_NodeOperationBuilder.h index 4d2d652ca54..e8319ede17b 100644 --- a/source/blender/compositor/intern/COM_NodeOperationBuilder.h +++ b/source/blender/compositor/intern/COM_NodeOperationBuilder.h @@ -18,11 +18,13 @@ class NodeInput; class NodeOutput; class ExecutionSystem; +class ExecutionGroup; class NodeOperation; class NodeOperationInput; class NodeOperationOutput; class PreviewOperation; +class WriteBufferOperation; class ViewerOperation; class ConstantOperation; @@ -53,6 +55,7 @@ class NodeOperationBuilder { Vector operations_; Vector links_; + Vector groups_; /** Maps operation inputs to node inputs */ Map input_map_; @@ -104,12 +107,12 @@ class NodeOperationBuilder { return active_viewer_; } - Span get_operations() const + const Vector &get_operations() const { return operations_; } - Span get_links() const + const Vector &get_links() const { return links_; } @@ -130,6 +133,12 @@ class NodeOperationBuilder { /** Helper function to store connected inputs for replacement */ Vector cache_output_links(NodeOperationOutput *output) const; + /** Find a connected write buffer operation to an OpOutput */ + WriteBufferOperation *find_attached_write_buffer_operation(NodeOperationOutput *output) const; + /** Add read/write buffer operations around complex operations */ + void add_complex_operation_buffers(); + void add_input_buffers(NodeOperation *operation, NodeOperationInput *input); + void add_output_buffers(NodeOperation *operation, NodeOperationOutput *output); /** Remove unreachable operations */ void prune_operations(); @@ -137,6 +146,10 @@ class NodeOperationBuilder { /** Sort operations by link dependencies */ void sort_operations(); + /** Create execution groups */ + void group_operations(); + ExecutionGroup *make_group(NodeOperation *op); + private: PreviewOperation *make_preview_operation() const; void unlink_inputs_and_relink_outputs(NodeOperation *unlinked_op, NodeOperation *linked_op); diff --git a/source/blender/compositor/intern/COM_OpenCLDevice.cc b/source/blender/compositor/intern/COM_OpenCLDevice.cc new file mode 100644 index 00000000000..c2f6de56dfc --- /dev/null +++ b/source/blender/compositor/intern/COM_OpenCLDevice.cc @@ -0,0 +1,271 @@ +/* SPDX-FileCopyrightText: 2011 Blender Authors + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +#include "COM_OpenCLDevice.h" + +#include "COM_ExecutionGroup.h" +#include "COM_ReadBufferOperation.h" + +namespace blender::compositor { + +enum COM_VendorID { NVIDIA = 0x10DE, AMD = 0x1002 }; +const cl_image_format IMAGE_FORMAT_COLOR = { + CL_RGBA, + CL_FLOAT, +}; +const cl_image_format IMAGE_FORMAT_VECTOR = { + CL_RGB, + CL_FLOAT, +}; +const cl_image_format IMAGE_FORMAT_VALUE = { + CL_R, + CL_FLOAT, +}; + +OpenCLDevice::OpenCLDevice(cl_context context, + cl_device_id device, + cl_program program, + cl_int vendor_id) +{ + device_ = device; + context_ = context; + program_ = program; + queue_ = nullptr; + vendor_id_ = vendor_id; + + cl_int error; + queue_ = clCreateCommandQueue(context_, device_, 0, &error); +} + +OpenCLDevice::OpenCLDevice(OpenCLDevice &&other) noexcept + : context_(other.context_), + device_(other.device_), + program_(other.program_), + queue_(other.queue_), + vendor_id_(other.vendor_id_) +{ + other.queue_ = nullptr; +} + +OpenCLDevice::~OpenCLDevice() +{ + if (queue_) { + clReleaseCommandQueue(queue_); + } +} + +void OpenCLDevice::execute(WorkPackage *work_package) +{ + const uint chunk_number = work_package->chunk_number; + ExecutionGroup *execution_group = work_package->execution_group; + + MemoryBuffer **input_buffers = execution_group->get_input_buffers_opencl(chunk_number); + MemoryBuffer *output_buffer = execution_group->allocate_output_buffer(work_package->rect); + + execution_group->get_output_operation()->execute_opencl_region( + this, &work_package->rect, chunk_number, input_buffers, output_buffer); + + delete output_buffer; + + execution_group->finalize_chunk_execution(chunk_number, input_buffers); +} +cl_mem OpenCLDevice::COM_cl_attach_memory_buffer_to_kernel_parameter( + cl_kernel kernel, + int parameter_index, + int offset_index, + std::list *cleanup, + MemoryBuffer **input_memory_buffers, + SocketReader *reader) +{ + return COM_cl_attach_memory_buffer_to_kernel_parameter(kernel, + parameter_index, + offset_index, + cleanup, + input_memory_buffers, + (ReadBufferOperation *)reader); +} + +const cl_image_format *OpenCLDevice::determine_image_format(MemoryBuffer *memory_buffer) +{ + switch (memory_buffer->get_num_channels()) { + case 1: + return &IMAGE_FORMAT_VALUE; + break; + case 3: + return &IMAGE_FORMAT_VECTOR; + break; + case 4: + return &IMAGE_FORMAT_COLOR; + break; + default: + BLI_assert_msg(0, "Unsupported num_channels."); + } + + return &IMAGE_FORMAT_COLOR; +} + +cl_mem OpenCLDevice::COM_cl_attach_memory_buffer_to_kernel_parameter( + cl_kernel kernel, + int parameter_index, + int offset_index, + std::list *cleanup, + MemoryBuffer **input_memory_buffers, + ReadBufferOperation *reader) +{ + cl_int error; + + MemoryBuffer *result = reader->get_input_memory_buffer(input_memory_buffers); + + const cl_image_format *image_format = determine_image_format(result); + + cl_mem cl_buffer = clCreateImage2D(context_, + CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, + image_format, + result->get_width(), + result->get_height(), + 0, + result->get_buffer(), + &error); + + if (error != CL_SUCCESS) { + printf("CLERROR[%d]: %s\n", error, clewErrorString(error)); + } + if (error == CL_SUCCESS) { + cleanup->push_back(cl_buffer); + } + + error = clSetKernelArg(kernel, parameter_index, sizeof(cl_mem), &cl_buffer); + if (error != CL_SUCCESS) { + printf("CLERROR[%d]: %s\n", error, clewErrorString(error)); + } + + COM_cl_attach_memory_buffer_offset_to_kernel_parameter(kernel, offset_index, result); + return cl_buffer; +} + +void OpenCLDevice::COM_cl_attach_memory_buffer_offset_to_kernel_parameter( + cl_kernel kernel, int offset_index, MemoryBuffer *memory_buffer) +{ + if (offset_index != -1) { + cl_int error; + const rcti &rect = memory_buffer->get_rect(); + cl_int2 offset = {{rect.xmin, rect.ymin}}; + + error = clSetKernelArg(kernel, offset_index, sizeof(cl_int2), &offset); + if (error != CL_SUCCESS) { + printf("CLERROR[%d]: %s\n", error, clewErrorString(error)); + } + } +} + +void OpenCLDevice::COM_cl_attach_size_to_kernel_parameter(cl_kernel kernel, + int offset_index, + NodeOperation *operation) +{ + if (offset_index != -1) { + cl_int error; + cl_int2 offset = {{(cl_int)operation->get_width(), (cl_int)operation->get_height()}}; + + error = clSetKernelArg(kernel, offset_index, sizeof(cl_int2), &offset); + if (error != CL_SUCCESS) { + printf("CLERROR[%d]: %s\n", error, clewErrorString(error)); + } + } +} + +void OpenCLDevice::COM_cl_attach_output_memory_buffer_to_kernel_parameter( + cl_kernel kernel, int parameter_index, cl_mem cl_output_memory_buffer) +{ + cl_int error; + error = clSetKernelArg(kernel, parameter_index, sizeof(cl_mem), &cl_output_memory_buffer); + if (error != CL_SUCCESS) { + printf("CLERROR[%d]: %s\n", error, clewErrorString(error)); + } +} + +void OpenCLDevice::COM_cl_enqueue_range(cl_kernel kernel, MemoryBuffer *output_memory_buffer) +{ + cl_int error; + const size_t size[] = { + size_t(output_memory_buffer->get_width()), + size_t(output_memory_buffer->get_height()), + }; + + error = clEnqueueNDRangeKernel(queue_, kernel, 2, nullptr, size, nullptr, 0, nullptr, nullptr); + if (error != CL_SUCCESS) { + printf("CLERROR[%d]: %s\n", error, clewErrorString(error)); + } +} + +void OpenCLDevice::COM_cl_enqueue_range(cl_kernel kernel, + MemoryBuffer *output_memory_buffer, + int offset_index, + NodeOperation *operation) +{ + cl_int error; + const int width = output_memory_buffer->get_width(); + const int height = output_memory_buffer->get_height(); + int offsetx; + int offsety; + int local_size = 1024; + size_t size[2]; + cl_int2 offset; + + if (vendor_id_ == NVIDIA) { + local_size = 32; + } + + bool breaked = false; + for (offsety = 0; offsety < height && (!breaked); offsety += local_size) { + offset.s[1] = offsety; + if (offsety + local_size < height) { + size[1] = local_size; + } + else { + size[1] = height - offsety; + } + + for (offsetx = 0; offsetx < width && (!breaked); offsetx += local_size) { + if (offsetx + local_size < width) { + size[0] = local_size; + } + else { + size[0] = width - offsetx; + } + offset.s[0] = offsetx; + + error = clSetKernelArg(kernel, offset_index, sizeof(cl_int2), &offset); + if (error != CL_SUCCESS) { + printf("CLERROR[%d]: %s\n", error, clewErrorString(error)); + } + error = clEnqueueNDRangeKernel( + queue_, kernel, 2, nullptr, size, nullptr, 0, nullptr, nullptr); + if (error != CL_SUCCESS) { + printf("CLERROR[%d]: %s\n", error, clewErrorString(error)); + } + clFlush(queue_); + if (operation->is_braked()) { + breaked = false; + } + } + } +} + +cl_kernel OpenCLDevice::COM_cl_create_kernel(const char *kernelname, + std::list *cl_kernels_to_clean_up) +{ + cl_int error; + cl_kernel kernel = clCreateKernel(program_, kernelname, &error); + if (error != CL_SUCCESS) { + printf("CLERROR[%d]: %s\n", error, clewErrorString(error)); + } + else { + if (cl_kernels_to_clean_up) { + cl_kernels_to_clean_up->push_back(kernel); + } + } + return kernel; +} + +} // namespace blender::compositor diff --git a/source/blender/compositor/intern/COM_OpenCLDevice.h b/source/blender/compositor/intern/COM_OpenCLDevice.h new file mode 100644 index 00000000000..89acd9fcd84 --- /dev/null +++ b/source/blender/compositor/intern/COM_OpenCLDevice.h @@ -0,0 +1,120 @@ +/* SPDX-FileCopyrightText: 2011 Blender Authors + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +class OpenCLDevice; + +#pragma once + +#include + +#include "COM_Device.h" + +#include "clew.h" + +namespace blender::compositor { + +class NodeOperation; +class MemoryBuffer; +class ReadBufferOperation; + +typedef NodeOperation SocketReader; + +/** + * \brief device representing an GPU OpenCL device. + * an instance of this class represents a single cl_device + */ +class OpenCLDevice : public Device { + private: + /** + * \brief OPENCL context + */ + cl_context context_; + + /** + * \brief OPENCL device + */ + cl_device_id device_; + + /** + * \brief OPENCL program + */ + cl_program program_; + + /** + * \brief OPENCL command queue + */ + cl_command_queue queue_; + + /** + * \brief OPENCL vendor ID + */ + cl_int vendor_id_; + + public: + /** + * \brief constructor with OPENCL device + * \param context: + * \param device: + * \param program: + * \param vendorID: + */ + OpenCLDevice(cl_context context, cl_device_id device, cl_program program, cl_int vendor_id); + + OpenCLDevice(OpenCLDevice &&other) noexcept; + + ~OpenCLDevice(); + + /** + * \brief execute a WorkPackage + * \param work: the WorkPackage to execute + */ + void execute(WorkPackage *work) override; + + /** + * \brief determine an image format + * \param memorybuffer: + */ + static const cl_image_format *determine_image_format(MemoryBuffer *memory_buffer); + + cl_context get_context() + { + return context_; + } + + cl_command_queue get_queue() + { + return queue_; + } + + cl_mem COM_cl_attach_memory_buffer_to_kernel_parameter(cl_kernel kernel, + int parameter_index, + int offset_index, + std::list *cleanup, + MemoryBuffer **input_memory_buffers, + SocketReader *reader); + cl_mem COM_cl_attach_memory_buffer_to_kernel_parameter(cl_kernel kernel, + int parameter_index, + int offset_index, + std::list *cleanup, + MemoryBuffer **input_memory_buffers, + ReadBufferOperation *reader); + void COM_cl_attach_memory_buffer_offset_to_kernel_parameter(cl_kernel kernel, + int offset_index, + MemoryBuffer *memory_buffers); + void COM_cl_attach_output_memory_buffer_to_kernel_parameter(cl_kernel kernel, + int parameter_index, + cl_mem cl_output_memory_buffer); + void COM_cl_attach_size_to_kernel_parameter(cl_kernel kernel, + int offset_index, + NodeOperation *operation); + void COM_cl_enqueue_range(cl_kernel kernel, MemoryBuffer *output_memory_buffer); + void COM_cl_enqueue_range(cl_kernel kernel, + MemoryBuffer *output_memory_buffer, + int offset_index, + NodeOperation *operation); + cl_kernel COM_cl_create_kernel(const char *kernelname, + std::list *cl_kernels_to_clean_up); +}; + +} // namespace blender::compositor diff --git a/source/blender/compositor/intern/COM_SingleThreadedOperation.cc b/source/blender/compositor/intern/COM_SingleThreadedOperation.cc new file mode 100644 index 00000000000..22b6224434f --- /dev/null +++ b/source/blender/compositor/intern/COM_SingleThreadedOperation.cc @@ -0,0 +1,49 @@ +/* SPDX-FileCopyrightText: 2011 Blender Authors + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +#include "COM_SingleThreadedOperation.h" + +namespace blender::compositor { + +SingleThreadedOperation::SingleThreadedOperation() +{ + cached_instance_ = nullptr; + flags_.complex = true; + flags_.single_threaded = true; +} + +void SingleThreadedOperation::init_execution() +{ + init_mutex(); +} + +void SingleThreadedOperation::execute_pixel(float output[4], int x, int y, void * /*data*/) +{ + cached_instance_->read_no_check(output, x, y); +} + +void SingleThreadedOperation::deinit_execution() +{ + deinit_mutex(); + if (cached_instance_) { + delete cached_instance_; + cached_instance_ = nullptr; + } +} +void *SingleThreadedOperation::initialize_tile_data(rcti *rect) +{ + if (cached_instance_) { + return cached_instance_; + } + + lock_mutex(); + if (cached_instance_ == nullptr) { + // + cached_instance_ = create_memory_buffer(rect); + } + unlock_mutex(); + return cached_instance_; +} + +} // namespace blender::compositor diff --git a/source/blender/compositor/intern/COM_SingleThreadedOperation.h b/source/blender/compositor/intern/COM_SingleThreadedOperation.h new file mode 100644 index 00000000000..1cdbcd931b6 --- /dev/null +++ b/source/blender/compositor/intern/COM_SingleThreadedOperation.h @@ -0,0 +1,44 @@ +/* SPDX-FileCopyrightText: 2011 Blender Authors + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +#pragma once + +#include "COM_NodeOperation.h" + +namespace blender::compositor { + +class SingleThreadedOperation : public NodeOperation { + private: + MemoryBuffer *cached_instance_; + + protected: + inline bool is_cached() + { + return cached_instance_ != nullptr; + } + + public: + SingleThreadedOperation(); + + /** + * The inner loop of this operation. + */ + void execute_pixel(float output[4], int x, int y, void *data) override; + + /** + * Initialize the execution + */ + void init_execution() override; + + /** + * Deinitialize the execution + */ + void deinit_execution() override; + + void *initialize_tile_data(rcti *rect) override; + + virtual MemoryBuffer *create_memory_buffer(rcti *rect) = 0; +}; + +} // namespace blender::compositor diff --git a/source/blender/compositor/intern/COM_TiledExecutionModel.cc b/source/blender/compositor/intern/COM_TiledExecutionModel.cc new file mode 100644 index 00000000000..62d4b1e0189 --- /dev/null +++ b/source/blender/compositor/intern/COM_TiledExecutionModel.cc @@ -0,0 +1,148 @@ +/* SPDX-FileCopyrightText: 2021 Blender Authors + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +#include "COM_TiledExecutionModel.h" +#include "COM_Debug.h" +#include "COM_ExecutionGroup.h" +#include "COM_ReadBufferOperation.h" +#include "COM_WorkScheduler.h" + +#include "BLT_translation.h" + +#ifdef WITH_CXX_GUARDEDALLOC +# include "MEM_guardedalloc.h" +#endif + +namespace blender::compositor { + +TiledExecutionModel::TiledExecutionModel(CompositorContext &context, + Span operations, + Span groups) + : ExecutionModel(context, operations), groups_(groups) +{ + const bNodeTree *node_tree = context.get_bnodetree(); + node_tree->runtime->stats_draw(node_tree->runtime->sdh, + RPT_("Compositing | Determining resolution")); + + uint resolution[2]; + for (ExecutionGroup *group : groups_) { + resolution[0] = 0; + resolution[1] = 0; + group->determine_resolution(resolution); + + if (border_.use_render_border) { + const rctf *render_border = border_.render_border; + group->set_render_border( + render_border->xmin, render_border->xmax, render_border->ymin, render_border->ymax); + } + + if (border_.use_viewer_border) { + const rctf *viewer_border = border_.viewer_border; + group->set_viewer_border( + viewer_border->xmin, viewer_border->xmax, viewer_border->ymin, viewer_border->ymax); + } + } +} + +static void update_read_buffer_offset(Span operations) +{ + uint order = 0; + for (NodeOperation *operation : operations) { + if (operation->get_flags().is_read_buffer_operation) { + ReadBufferOperation *read_operation = (ReadBufferOperation *)operation; + read_operation->set_offset(order); + order++; + } + } +} + +static void init_write_operations_for_execution(Span operations, + const bNodeTree *bTree) +{ + for (NodeOperation *operation : operations) { + if (operation->get_flags().is_write_buffer_operation) { + operation->set_bnodetree(bTree); + operation->init_execution(); + } + } +} + +static void link_write_buffers(Span operations) +{ + for (NodeOperation *operation : operations) { + if (operation->get_flags().is_read_buffer_operation) { + ReadBufferOperation *read_operation = static_cast(operation); + read_operation->update_memory_buffer(); + } + } +} + +static void init_non_write_operations_for_execution(Span operations, + const bNodeTree *bTree) +{ + for (NodeOperation *operation : operations) { + if (!operation->get_flags().is_write_buffer_operation) { + operation->set_bnodetree(bTree); + operation->init_execution(); + } + } +} + +static void init_execution_groups_for_execution(Span groups, + const int chunk_size) +{ + for (ExecutionGroup *execution_group : groups) { + execution_group->set_chunksize(chunk_size); + execution_group->init_execution(); + } +} + +void TiledExecutionModel::execute(ExecutionSystem &exec_system) +{ + const bNodeTree *editingtree = this->context_.get_bnodetree(); + + editingtree->runtime->stats_draw(editingtree->runtime->sdh, + RPT_("Compositing | Initializing execution")); + + update_read_buffer_offset(operations_); + + init_write_operations_for_execution(operations_, context_.get_bnodetree()); + link_write_buffers(operations_); + init_non_write_operations_for_execution(operations_, context_.get_bnodetree()); + init_execution_groups_for_execution(groups_, context_.get_chunksize()); + + WorkScheduler::start(context_); + execute_groups(eCompositorPriority::High, exec_system); + if (!context_.is_fast_calculation()) { + execute_groups(eCompositorPriority::Medium, exec_system); + execute_groups(eCompositorPriority::Low, exec_system); + } + WorkScheduler::finish(); + WorkScheduler::stop(); + + editingtree->runtime->stats_draw(editingtree->runtime->sdh, + RPT_("Compositing | De-initializing execution")); + + for (NodeOperation *operation : operations_) { + operation->deinit_execution(); + } + + for (ExecutionGroup *execution_group : groups_) { + execution_group->deinit_execution(); + } +} + +void TiledExecutionModel::execute_groups(eCompositorPriority priority, + ExecutionSystem &exec_system) +{ + for (ExecutionGroup *execution_group : groups_) { + if (execution_group->get_flags().is_output && + execution_group->get_render_priority() == priority) + { + execution_group->execute(&exec_system); + } + } +} + +} // namespace blender::compositor diff --git a/source/blender/compositor/intern/COM_TiledExecutionModel.h b/source/blender/compositor/intern/COM_TiledExecutionModel.h new file mode 100644 index 00000000000..d65acf3490a --- /dev/null +++ b/source/blender/compositor/intern/COM_TiledExecutionModel.h @@ -0,0 +1,41 @@ +/* SPDX-FileCopyrightText: 2021 Blender Authors + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +#pragma once + +#include "COM_Enums.h" +#include "COM_ExecutionModel.h" + +#ifdef WITH_CXX_GUARDEDALLOC +# include "MEM_guardedalloc.h" +#endif + +namespace blender::compositor { + +class ExecutionGroup; + +/** + * Operations are executed from outputs to inputs grouped in execution groups and rendered in + * tiles. + */ +class TiledExecutionModel : public ExecutionModel { + private: + Span groups_; + + public: + TiledExecutionModel(CompositorContext &context, + Span operations, + Span groups); + + void execute(ExecutionSystem &exec_system) override; + + private: + void execute_groups(eCompositorPriority priority, ExecutionSystem &exec_system); + +#ifdef WITH_CXX_GUARDEDALLOC + MEM_CXX_CLASS_ALLOC_FUNCS("COM:TiledExecutionModel") +#endif +}; + +} // namespace blender::compositor diff --git a/source/blender/compositor/intern/COM_WorkPackage.cc b/source/blender/compositor/intern/COM_WorkPackage.cc new file mode 100644 index 00000000000..cad3aa75e58 --- /dev/null +++ b/source/blender/compositor/intern/COM_WorkPackage.cc @@ -0,0 +1,22 @@ +/* SPDX-FileCopyrightText: 2011 Blender Authors + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +#include "COM_WorkPackage.h" + +#include "COM_ExecutionGroup.h" + +namespace blender::compositor { + +std::ostream &operator<<(std::ostream &os, const WorkPackage &work_package) +{ + os << "WorkPackage(execution_group=" << *work_package.execution_group; + os << ",chunk=" << work_package.chunk_number; + os << ",state=" << work_package.state; + os << ",rect=(" << work_package.rect.xmin << "," << work_package.rect.ymin << ")-(" + << work_package.rect.xmax << "," << work_package.rect.ymax << ")"; + os << ")"; + return os; +} + +} // namespace blender::compositor diff --git a/source/blender/compositor/intern/COM_WorkPackage.h b/source/blender/compositor/intern/COM_WorkPackage.h index 951eb981977..bf7824d778c 100644 --- a/source/blender/compositor/intern/COM_WorkPackage.h +++ b/source/blender/compositor/intern/COM_WorkPackage.h @@ -8,17 +8,43 @@ # include "MEM_guardedalloc.h" #endif +#include "COM_Enums.h" + +#include "DNA_vec_types.h" + #include +#include namespace blender::compositor { +/* Forward Declarations. */ +class ExecutionGroup; /** * \brief contains data about work that can be scheduled * \see WorkScheduler */ struct WorkPackage { + eWorkPackageType type; + + eWorkPackageState state = eWorkPackageState::NotScheduled; + /** - * Called to execute work. + * \brief execution_group with the operations-setup to be evaluated + */ + ExecutionGroup *execution_group; + + /** + * \brief number of the chunk to be executed + */ + unsigned int chunk_number; + + /** + * Area of the execution group that the work package calculates. + */ + rcti rect; + + /** + * Custom function to execute when work package type is CustomFunction. */ std::function execute_fn; @@ -32,4 +58,6 @@ struct WorkPackage { #endif }; +std::ostream &operator<<(std::ostream &os, const WorkPackage &work_package); + } // namespace blender::compositor diff --git a/source/blender/compositor/intern/COM_WorkScheduler.cc b/source/blender/compositor/intern/COM_WorkScheduler.cc index af7b9e7509e..484794f1722 100644 --- a/source/blender/compositor/intern/COM_WorkScheduler.cc +++ b/source/blender/compositor/intern/COM_WorkScheduler.cc @@ -5,6 +5,13 @@ #include "COM_WorkScheduler.h" #include "COM_CPUDevice.h" +#include "COM_CompositorContext.h" +#include "COM_ExecutionGroup.h" +#include "COM_OpenCLDevice.h" +#include "COM_OpenCLKernels.cl.h" +#include "COM_WriteBufferOperation.h" + +#include "clew.h" #include "MEM_guardedalloc.h" @@ -12,7 +19,7 @@ #include "BLI_threads.h" #include "BLI_vector.hh" -#include "BKE_global.hh" +#include "BKE_global.h" namespace blender::compositor { @@ -35,6 +42,14 @@ constexpr ThreadingModel COM_threading_model() return ThreadingModel::Queue; } +/** + * Does the active threading model support opencl? + */ +constexpr bool COM_is_opencl_enabled() +{ + return COM_threading_model() != ThreadingModel::SingleThreaded; +} + static ThreadLocal(CPUDevice *) g_thread_device; static struct { struct { @@ -54,9 +69,222 @@ static struct { TaskPool *pool; } task; + struct { + ThreadQueue *queue; + cl_context context; + cl_program program; + /** \brief list of all OpenCLDevices. for every OpenCL GPU device an instance of OpenCLDevice + * is created. */ + Vector devices; + /** \brief list of all thread for every GPUDevice in cpudevices a thread exists. */ + ListBase threads; + /** \brief all scheduled work for the GPU. */ + bool active = false; + bool initialized = false; + } opencl; + int num_cpu_threads; } g_work_scheduler; +/* -------------------------------------------------------------------- */ +/** \name OpenCL Scheduling + * \{ */ + +static void CL_CALLBACK cl_context_error(const char *errinfo, + const void * /*private_info*/, + size_t /*cb*/, + void * /*user_data*/) +{ + printf("OPENCL error: %s\n", errinfo); +} + +static void *thread_execute_gpu(void *data) +{ + Device *device = (Device *)data; + WorkPackage *work; + + while ((work = (WorkPackage *)BLI_thread_queue_pop(g_work_scheduler.opencl.queue))) { + device->execute(work); + } + + return nullptr; +} + +static void opencl_start(const CompositorContext &context) +{ + if (context.get_has_active_opencl_devices()) { + g_work_scheduler.opencl.queue = BLI_thread_queue_init(); + BLI_threadpool_init(&g_work_scheduler.opencl.threads, + thread_execute_gpu, + g_work_scheduler.opencl.devices.size()); + for (Device &device : g_work_scheduler.opencl.devices) { + BLI_threadpool_insert(&g_work_scheduler.opencl.threads, &device); + } + g_work_scheduler.opencl.active = true; + } + else { + g_work_scheduler.opencl.active = false; + } +} + +static bool opencl_schedule(WorkPackage *package) +{ + if (package->type == eWorkPackageType::Tile && package->execution_group->get_flags().open_cl && + g_work_scheduler.opencl.active) + { + BLI_thread_queue_push(g_work_scheduler.opencl.queue, package); + return true; + } + return false; +} + +static void opencl_finish() +{ + if (g_work_scheduler.opencl.active) { + BLI_thread_queue_wait_finish(g_work_scheduler.opencl.queue); + } +} + +static void opencl_stop() +{ + if (g_work_scheduler.opencl.active) { + BLI_thread_queue_nowait(g_work_scheduler.opencl.queue); + BLI_threadpool_end(&g_work_scheduler.opencl.threads); + BLI_thread_queue_free(g_work_scheduler.opencl.queue); + g_work_scheduler.opencl.queue = nullptr; + } +} + +static bool opencl_has_gpu_devices() +{ + return !g_work_scheduler.opencl.devices.is_empty(); +} + +static void opencl_initialize(const bool use_opencl) +{ + /* deinitialize OpenCL GPU's */ + 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) { + return; + } + + if (clCreateContextFromType) { + cl_uint number_of_platforms = 0; + cl_int error; + error = clGetPlatformIDs(0, nullptr, &number_of_platforms); + if (error == -1001) { + } /* GPU not supported */ + else if (error != CL_SUCCESS) { + printf("CLERROR[%d]: %s\n", error, clewErrorString(error)); + } + if (G.f & G_DEBUG) { + printf("%u number of platforms\n", number_of_platforms); + } + cl_platform_id *platforms = (cl_platform_id *)MEM_mallocN( + sizeof(cl_platform_id) * number_of_platforms, __func__); + error = clGetPlatformIDs(number_of_platforms, platforms, nullptr); + uint index_platform; + for (index_platform = 0; index_platform < number_of_platforms; index_platform++) { + cl_platform_id platform = platforms[index_platform]; + cl_uint number_of_devices = 0; + clGetDeviceIDs(platform, CL_DEVICE_TYPE_GPU, 0, nullptr, &number_of_devices); + if (number_of_devices <= 0) { + continue; + } + + cl_device_id *cldevices = (cl_device_id *)MEM_mallocN( + sizeof(cl_device_id) * number_of_devices, __func__); + clGetDeviceIDs(platform, CL_DEVICE_TYPE_GPU, number_of_devices, cldevices, nullptr); + + g_work_scheduler.opencl.context = clCreateContext( + nullptr, number_of_devices, cldevices, cl_context_error, 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_work_scheduler.opencl.program = clCreateProgramWithSource( + g_work_scheduler.opencl.context, 1, cl_str, nullptr, &error); + error = clBuildProgram(g_work_scheduler.opencl.program, + number_of_devices, + 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_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_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)); + } + build_log[ret_val_size] = '\0'; + printf("%s", build_log); + MEM_freeN(build_log); + } + else { + uint index_devices; + for (index_devices = 0; index_devices < number_of_devices; index_devices++) { + cl_device_id device = cldevices[index_devices]; + cl_int vendorID = 0; + cl_int error2 = clGetDeviceInfo( + device, CL_DEVICE_VENDOR_ID, sizeof(cl_int), &vendorID, nullptr); + if (error2 != CL_SUCCESS) { + printf("CLERROR[%d]: %s\n", error2, clewErrorString(error2)); + } + g_work_scheduler.opencl.devices.append_as(g_work_scheduler.opencl.context, + device, + g_work_scheduler.opencl.program, + vendorID); + } + } + MEM_freeN(cldevices); + } + MEM_freeN(platforms); + } + + g_work_scheduler.opencl.initialized = true; + } +} + +static void opencl_deinitialize() +{ + g_work_scheduler.opencl.devices.clear_and_shrink(); + + if (g_work_scheduler.opencl.program) { + clReleaseProgram(g_work_scheduler.opencl.program); + g_work_scheduler.opencl.program = nullptr; + } + + if (g_work_scheduler.opencl.context) { + clReleaseContext(g_work_scheduler.opencl.context); + g_work_scheduler.opencl.context = nullptr; + } + + g_work_scheduler.opencl.initialized = false; +} + +/** \} */ + /* -------------------------------------------------------------------- */ /** \name Single threaded Scheduling * \{ */ @@ -191,6 +419,12 @@ static void threading_model_task_stop() void WorkScheduler::schedule(WorkPackage *package) { + if (COM_is_opencl_enabled()) { + if (opencl_schedule(package)) { + return; + } + } + switch (COM_threading_model()) { case ThreadingModel::SingleThreaded: { threading_model_single_thread_execute(package); @@ -209,8 +443,12 @@ void WorkScheduler::schedule(WorkPackage *package) } } -void WorkScheduler::start() +void WorkScheduler::start(const CompositorContext &context) { + if (COM_is_opencl_enabled()) { + opencl_start(context); + } + switch (COM_threading_model()) { case ThreadingModel::SingleThreaded: /* Nothing to do. */ @@ -228,6 +466,10 @@ void WorkScheduler::start() void WorkScheduler::finish() { + if (COM_is_opencl_enabled()) { + opencl_finish(); + } + switch (COM_threading_model()) { case ThreadingModel::SingleThreaded: /* Nothing to do. */ @@ -245,6 +487,10 @@ void WorkScheduler::finish() void WorkScheduler::stop() { + if (COM_is_opencl_enabled()) { + opencl_stop(); + } + switch (COM_threading_model()) { case ThreadingModel::SingleThreaded: /* Nothing to do. */ @@ -260,8 +506,20 @@ void WorkScheduler::stop() } } -void WorkScheduler::initialize(int num_cpu_threads) +bool WorkScheduler::has_gpu_devices() { + if (COM_is_opencl_enabled()) { + return opencl_has_gpu_devices(); + } + return false; +} + +void WorkScheduler::initialize(bool use_opencl, int num_cpu_threads) +{ + if (COM_is_opencl_enabled()) { + opencl_initialize(use_opencl); + } + g_work_scheduler.num_cpu_threads = num_cpu_threads; switch (COM_threading_model()) { case ThreadingModel::SingleThreaded: @@ -280,6 +538,10 @@ void WorkScheduler::initialize(int num_cpu_threads) void WorkScheduler::deinitialize() { + if (COM_is_opencl_enabled()) { + opencl_deinitialize(); + } + switch (COM_threading_model()) { case ThreadingModel::SingleThreaded: /* Nothing to do. */ diff --git a/source/blender/compositor/intern/COM_WorkScheduler.h b/source/blender/compositor/intern/COM_WorkScheduler.h index 4a1ac60a983..fb1a4c83e00 100644 --- a/source/blender/compositor/intern/COM_WorkScheduler.h +++ b/source/blender/compositor/intern/COM_WorkScheduler.h @@ -12,6 +12,8 @@ namespace blender::compositor { struct WorkPackage; +class CompositorContext; + /** \brief the workscheduler * \ingroup execution */ @@ -19,6 +21,9 @@ struct WorkScheduler { /** * \brief schedule a chunk of a group to be calculated. * An execution group schedules a chunk in the WorkScheduler + * when ExecutionGroup.get_flags().open_cl is set the work will be handled by a OpenCLDevice + * otherwise the work is scheduled for an CPUDevice + * \see ExecutionGroup.execute */ static void schedule(WorkPackage *package); @@ -28,9 +33,13 @@ struct WorkScheduler { * during initialization the mutexes are initialized. * there are two mutexes (for every device type one) * After mutex initialization the system is queried in order to count the number of CPUDevices - * to be created. For every hardware thread a CPUDevice is created. + * and GPUDevices to be created. For every hardware thread a CPUDevice and for every OpenCL GPU + * device a OpenCLDevice is created. these devices are stored in a separate list (cpudevices & + * gpudevices) + * + * This function can be called multiple times to lazily initialize OpenCL. */ - static void initialize(int num_cpu_threads); + static void initialize(bool use_opencl, int num_cpu_threads); /** * \brief deinitialize the WorkScheduler @@ -44,7 +53,7 @@ struct WorkScheduler { * for every device a thread is created. * \see initialize Initialization and query of the number of devices */ - static void start(); + static void start(const CompositorContext &context); /** * \brief stop the execution @@ -58,6 +67,14 @@ struct WorkScheduler { */ static void finish(); + /** + * \brief Are there OpenCL capable GPU devices initialized? + * the result of this method is stored in the CompositorContext + * A node can generate a different operation tree when OpenCLDevices exists. + * \see CompositorContext.get_has_active_opencl_devices + */ + static bool has_gpu_devices(); + static int get_num_cpu_threads(); static int current_thread_id(); diff --git a/source/blender/compositor/intern/COM_compositor.cc b/source/blender/compositor/intern/COM_compositor.cc index 01d201df31b..ea73f8c87d2 100644 --- a/source/blender/compositor/intern/COM_compositor.cc +++ b/source/blender/compositor/intern/COM_compositor.cc @@ -4,11 +4,11 @@ #include "BLI_threads.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_node.hh" #include "BKE_node_runtime.hh" -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "COM_ExecutionSystem.h" #include "COM_WorkScheduler.h" @@ -55,8 +55,7 @@ void COM_execute(Render *render, bNodeTree *node_tree, bool rendering, const char *view_name, - blender::realtime_compositor::RenderContext *render_context, - blender::compositor::ProfilerData &profiler_data) + blender::realtime_compositor::RenderContext *render_context) { /* Initialize mutex, TODO: this mutex init is actually not thread safe and * should be done somewhere as part of blender startup, all the other @@ -79,29 +78,25 @@ void COM_execute(Render *render, compositor_reset_node_tree_status(node_tree); if (U.experimental.use_full_frame_compositor && - node_tree->execution_mode == NTREE_EXECUTION_MODE_GPU) + node_tree->execution_mode == NTREE_EXECUTION_MODE_REALTIME) { - /* GPU compositor. */ + /* Realtime GPU compositor. */ RE_compositor_execute( *render, *scene, *render_data, *node_tree, rendering, view_name, render_context); } else { - /* CPU compositor. */ + /* Tiled and Full Frame compositors. */ /* Initialize workscheduler. */ - blender::compositor::WorkScheduler::initialize(BKE_render_num_threads(render_data)); + const bool use_opencl = (node_tree->flag & NTREE_COM_OPENCL) != 0; + blender::compositor::WorkScheduler::initialize(use_opencl, + BKE_render_num_threads(render_data)); /* Execute. */ const bool twopass = (node_tree->flag & NTREE_TWO_PASS) && !rendering; if (twopass) { - blender::compositor::ExecutionSystem fast_pass(render_data, - scene, - node_tree, - rendering, - true, - view_name, - render_context, - profiler_data); + blender::compositor::ExecutionSystem fast_pass( + render_data, scene, node_tree, rendering, true, view_name, render_context); fast_pass.execute(); if (node_tree->runtime->test_break(node_tree->runtime->tbh)) { @@ -111,7 +106,7 @@ void COM_execute(Render *render, } blender::compositor::ExecutionSystem system( - render_data, scene, node_tree, rendering, false, view_name, render_context, profiler_data); + render_data, scene, node_tree, rendering, false, view_name, render_context); system.execute(); } diff --git a/source/blender/compositor/intern/COM_profile.cc b/source/blender/compositor/intern/COM_profile.cc deleted file mode 100644 index 5bfee3b269d..00000000000 --- a/source/blender/compositor/intern/COM_profile.cc +++ /dev/null @@ -1,76 +0,0 @@ -/* SPDX-FileCopyrightText: 2024 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -#include "COM_profile.hh" - -#include "BKE_node_runtime.hh" - -#include "COM_NodeOperation.h" - -#include "DNA_node_types.h" - -namespace blender::compositor { - -void Profiler::add_operation_execution_time(const NodeOperation &operation, - const timeit::TimePoint &start, - const timeit::TimePoint &end) -{ - const timeit::Nanoseconds execution_time = end - start; - - const bNodeInstanceKey key = operation.get_node_instance_key(); - if (key.value == NODE_INSTANCE_KEY_NONE.value) { - /* The operation does not come from any node. It was, for example, added to convert data type. - * Do not accumulate time from its execution. */ - return; - } - - this->add_execution_time(key, execution_time); -} - -void Profiler::add_execution_time(const bNodeInstanceKey key, - const timeit::Nanoseconds &execution_time) -{ - data_.per_node_execution_time.lookup_or_add(key, timeit::Nanoseconds(0)) += execution_time; -} - -void Profiler::finalize(const bNodeTree &node_tree) -{ - this->accumulate_node_group_times(node_tree); -} - -timeit::Nanoseconds Profiler::accumulate_node_group_times(const bNodeTree &node_tree, - const bNodeInstanceKey parent_key) -{ - timeit::Nanoseconds tree_execution_time(0); - - for (const bNode *node : node_tree.all_nodes()) { - const bNodeInstanceKey key = BKE_node_instance_key(parent_key, &node_tree, node); - - if (node->type != NODE_GROUP) { - /* Non-group node, no need to recurse into. Simply accumulate the node's execution time to - * the current tree's execution time. */ - tree_execution_time += data_.per_node_execution_time.lookup_default(key, - timeit::Nanoseconds(0)); - continue; - } - - if (node->id == nullptr) { - /* Node group has lost link to its node tree. For example, due to missing linked file. */ - continue; - } - - const timeit::Nanoseconds group_execution_time = this->accumulate_node_group_times( - *reinterpret_cast(node->id), key); - - /* Store execution time of the group node. */ - this->add_execution_time(key, group_execution_time); - - /* Add group execution time to the overall tree execution time. */ - tree_execution_time += group_execution_time; - } - - return tree_execution_time; -} - -} // namespace blender::compositor diff --git a/source/blender/compositor/nodes/COM_BlurNode.cc b/source/blender/compositor/nodes/COM_BlurNode.cc index abfddb63833..f7f6156ba59 100644 --- a/source/blender/compositor/nodes/COM_BlurNode.cc +++ b/source/blender/compositor/nodes/COM_BlurNode.cc @@ -5,9 +5,11 @@ #include "COM_BlurNode.h" #include "COM_FastGaussianBlurOperation.h" #include "COM_GammaCorrectOperation.h" -#include "COM_GaussianAlphaBlurBaseOperation.h" -#include "COM_GaussianBlurBaseOperation.h" +#include "COM_GaussianAlphaXBlurOperation.h" +#include "COM_GaussianAlphaYBlurOperation.h" #include "COM_GaussianBokehBlurOperation.h" +#include "COM_GaussianXBlurOperation.h" +#include "COM_GaussianYBlurOperation.h" #include "COM_MathBaseOperation.h" #include "COM_SetValueOperation.h" @@ -54,13 +56,35 @@ void BlurNode::convert_to_operations(NodeConverter &converter, converter.map_input_socket(get_input_socket(1), clamp->get_input_socket(0)); converter.add_link(zero->get_output_socket(), clamp->get_input_socket(1)); + GaussianAlphaXBlurOperation *operationx = new GaussianAlphaXBlurOperation(); + operationx->set_data(data); + operationx->set_quality(quality); + operationx->set_size(1.0f); + operationx->set_falloff(PROP_SMOOTH); + operationx->set_subtract(false); + operationx->set_extend_bounds(extend_bounds); + + converter.add_operation(operationx); + converter.add_link(clamp->get_output_socket(), operationx->get_input_socket(0)); + + GaussianAlphaYBlurOperation *operationy = new GaussianAlphaYBlurOperation(); + operationy->set_data(data); + operationy->set_quality(quality); + operationy->set_size(1.0f); + operationy->set_falloff(PROP_SMOOTH); + operationy->set_subtract(false); + operationy->set_extend_bounds(extend_bounds); + + converter.add_operation(operationy); + converter.add_link(operationx->get_output_socket(), operationy->get_input_socket(0)); + GaussianBlurReferenceOperation *operation = new GaussianBlurReferenceOperation(); operation->set_data(data); operation->set_quality(quality); operation->set_extend_bounds(extend_bounds); converter.add_operation(operation); - converter.add_link(clamp->get_output_socket(), operation->get_input_socket(1)); + converter.add_link(operationy->get_output_socket(), operation->get_input_socket(1)); output_operation = operation; input_operation = operation; @@ -69,6 +93,7 @@ void BlurNode::convert_to_operations(NodeConverter &converter, GaussianXBlurOperation *operationx = new GaussianXBlurOperation(); operationx->set_data(data); operationx->set_quality(quality); + operationx->check_opencl(); operationx->set_extend_bounds(extend_bounds); converter.add_operation(operationx); @@ -77,6 +102,7 @@ void BlurNode::convert_to_operations(NodeConverter &converter, GaussianYBlurOperation *operationy = new GaussianYBlurOperation(); operationy->set_data(data); operationy->set_quality(quality); + operationy->check_opencl(); operationy->set_extend_bounds(extend_bounds); converter.add_operation(operationy); diff --git a/source/blender/compositor/nodes/COM_BokehBlurNode.cc b/source/blender/compositor/nodes/COM_BokehBlurNode.cc index 43099ab4333..b685b212e7e 100644 --- a/source/blender/compositor/nodes/COM_BokehBlurNode.cc +++ b/source/blender/compositor/nodes/COM_BokehBlurNode.cc @@ -34,7 +34,6 @@ void BokehBlurNode::convert_to_operations(NodeConverter &converter, converter.map_input_socket(get_input_socket(0), operation->get_input_socket(0)); converter.map_input_socket(get_input_socket(1), operation->get_input_socket(1)); converter.map_input_socket(get_input_socket(2), operation->get_input_socket(2)); - converter.map_input_socket(get_input_socket(3), operation->get_input_socket(3)); converter.map_output_socket(get_output_socket(0), operation->get_output_socket()); } else { diff --git a/source/blender/compositor/nodes/COM_CornerPinNode.cc b/source/blender/compositor/nodes/COM_CornerPinNode.cc index 716f1e1bae6..94b124c1419 100644 --- a/source/blender/compositor/nodes/COM_CornerPinNode.cc +++ b/source/blender/compositor/nodes/COM_CornerPinNode.cc @@ -5,8 +5,6 @@ #include "COM_CornerPinNode.h" #include "COM_PlaneCornerPinOperation.h" -#include "COM_SMAAOperation.h" -#include "COM_SetAlphaMultiplyOperation.h" namespace blender::compositor { @@ -15,36 +13,7 @@ CornerPinNode::CornerPinNode(bNode *editor_node) : Node(editor_node) {} void CornerPinNode::convert_to_operations(NodeConverter &converter, const CompositorContext & /*context*/) const { - PlaneCornerPinMaskOperation *plane_mask_operation = new PlaneCornerPinMaskOperation(); - converter.add_operation(plane_mask_operation); - - SMAAEdgeDetectionOperation *smaa_edge_detection = new SMAAEdgeDetectionOperation(); - converter.add_operation(smaa_edge_detection); - - converter.add_link(plane_mask_operation->get_output_socket(), - smaa_edge_detection->get_input_socket(0)); - - SMAABlendingWeightCalculationOperation *smaa_blending_weights = - new SMAABlendingWeightCalculationOperation(); - converter.add_operation(smaa_blending_weights); - - converter.add_link(smaa_edge_detection->get_output_socket(), - smaa_blending_weights->get_input_socket(0)); - - SMAANeighborhoodBlendingOperation *smaa_neighborhood = new SMAANeighborhoodBlendingOperation(); - converter.add_operation(smaa_neighborhood); - - converter.add_link(plane_mask_operation->get_output_socket(), - smaa_neighborhood->get_input_socket(0)); - converter.add_link(smaa_blending_weights->get_output_socket(), - smaa_neighborhood->get_input_socket(1)); - - converter.map_output_socket(this->get_output_socket(1), smaa_neighborhood->get_output_socket()); - - PlaneCornerPinWarpImageOperation *warp_image_operation = new PlaneCornerPinWarpImageOperation(); - converter.add_operation(warp_image_operation); - converter.map_input_socket(this->get_input_socket(0), warp_image_operation->get_input_socket(0)); - + NodeInput *input_image = this->get_input_socket(0); /* NOTE: socket order differs between UI node and operations: * bNode uses intuitive order following top-down layout: * upper-left, upper-right, lower-left, lower-right @@ -52,20 +21,23 @@ void CornerPinNode::convert_to_operations(NodeConverter &converter, * lower-left, lower-right, upper-right, upper-left */ const int node_corner_index[4] = {3, 4, 2, 1}; + + NodeOutput *output_warped_image = this->get_output_socket(0); + NodeOutput *output_plane = this->get_output_socket(1); + + PlaneCornerPinWarpImageOperation *warp_image_operation = new PlaneCornerPinWarpImageOperation(); + converter.add_operation(warp_image_operation); + PlaneCornerPinMaskOperation *plane_mask_operation = new PlaneCornerPinMaskOperation(); + converter.add_operation(plane_mask_operation); + + converter.map_input_socket(input_image, warp_image_operation->get_input_socket(0)); for (int i = 0; i < 4; i++) { NodeInput *corner_input = get_input_socket(node_corner_index[i]); converter.map_input_socket(corner_input, warp_image_operation->get_input_socket(i + 1)); converter.map_input_socket(corner_input, plane_mask_operation->get_input_socket(i)); } - - SetAlphaMultiplyOperation *set_alpha_operation = new SetAlphaMultiplyOperation(); - converter.add_operation(set_alpha_operation); - converter.add_link(warp_image_operation->get_output_socket(), - set_alpha_operation->get_input_socket(0)); - converter.add_link(smaa_neighborhood->get_output_socket(), - set_alpha_operation->get_input_socket(1)); - converter.map_output_socket(this->get_output_socket(0), - set_alpha_operation->get_output_socket()); + converter.map_output_socket(output_warped_image, warp_image_operation->get_output_socket()); + converter.map_output_socket(output_plane, plane_mask_operation->get_output_socket()); } } // namespace blender::compositor diff --git a/source/blender/compositor/nodes/COM_DefocusNode.cc b/source/blender/compositor/nodes/COM_DefocusNode.cc index 239924d7dd6..5330766f71b 100644 --- a/source/blender/compositor/nodes/COM_DefocusNode.cc +++ b/source/blender/compositor/nodes/COM_DefocusNode.cc @@ -94,10 +94,6 @@ void DefocusNode::convert_to_operations(NodeConverter &converter, bokeh->delete_data_on_finish(); converter.add_operation(bokeh); - SetValueOperation *bounding_box_operation = new SetValueOperation(); - bounding_box_operation->set_value(1.0f); - converter.add_operation(bounding_box_operation); - VariableSizeBokehBlurOperation *operation = new VariableSizeBokehBlurOperation(); operation->set_quality(eCompositorQuality::High); operation->set_max_blur(data->maxblur); @@ -106,7 +102,6 @@ void DefocusNode::convert_to_operations(NodeConverter &converter, converter.add_link(bokeh->get_output_socket(), operation->get_input_socket(1)); converter.add_link(radius_operation->get_output_socket(), operation->get_input_socket(2)); - converter.add_link(bounding_box_operation->get_output_socket(), operation->get_input_socket(3)); if (data->gamco) { GammaCorrectOperation *correct = new GammaCorrectOperation(); diff --git a/source/blender/compositor/nodes/COM_DilateErodeNode.cc b/source/blender/compositor/nodes/COM_DilateErodeNode.cc index f087b42e507..33f770ec1cf 100644 --- a/source/blender/compositor/nodes/COM_DilateErodeNode.cc +++ b/source/blender/compositor/nodes/COM_DilateErodeNode.cc @@ -4,7 +4,8 @@ #include "COM_DilateErodeNode.h" #include "COM_DilateErodeOperation.h" -#include "COM_GaussianAlphaBlurBaseOperation.h" +#include "COM_GaussianAlphaXBlurOperation.h" +#include "COM_GaussianAlphaYBlurOperation.h" #include "COM_SMAAOperation.h" namespace blender::compositor { diff --git a/source/blender/compositor/nodes/COM_GlareNode.cc b/source/blender/compositor/nodes/COM_GlareNode.cc index 380d4b122f6..2f49a9c6d06 100644 --- a/source/blender/compositor/nodes/COM_GlareNode.cc +++ b/source/blender/compositor/nodes/COM_GlareNode.cc @@ -3,7 +3,6 @@ * SPDX-License-Identifier: GPL-2.0-or-later */ #include "COM_GlareNode.h" -#include "COM_GlareBloomOperation.h" #include "COM_GlareFogGlowOperation.h" #include "COM_GlareGhostOperation.h" #include "COM_GlareSimpleStarOperation.h" @@ -28,21 +27,18 @@ void GlareNode::convert_to_operations(NodeConverter &converter, GlareBaseOperation *glareoperation = nullptr; switch (glare->type) { default: - case CMP_NODE_GLARE_GHOST: + case 3: glareoperation = new GlareGhostOperation(); break; - case CMP_NODE_GLARE_STREAKS: + case 2: /* Streaks. */ glareoperation = new GlareStreaksOperation(); break; - case CMP_NODE_GLARE_FOG_GLOW: + case 1: /* Fog glow. */ glareoperation = new GlareFogGlowOperation(); break; - case CMP_NODE_GLARE_SIMPLE_STAR: + case 0: /* Simple star. */ glareoperation = new GlareSimpleStarOperation(); break; - case CMP_NODE_GLARE_BLOOM: - glareoperation = new GlareBloomOperation(); - break; } BLI_assert(glareoperation); glareoperation->set_glare_settings(glare); diff --git a/source/blender/compositor/nodes/COM_KeyingNode.cc b/source/blender/compositor/nodes/COM_KeyingNode.cc index 87e451b8cd8..9ea2642d361 100644 --- a/source/blender/compositor/nodes/COM_KeyingNode.cc +++ b/source/blender/compositor/nodes/COM_KeyingNode.cc @@ -18,7 +18,8 @@ #include "COM_SetAlphaMultiplyOperation.h" -#include "COM_GaussianAlphaBlurBaseOperation.h" +#include "COM_GaussianAlphaXBlurOperation.h" +#include "COM_GaussianAlphaYBlurOperation.h" #include "BLI_math_color.h" diff --git a/source/blender/compositor/nodes/COM_KuwaharaNode.cc b/source/blender/compositor/nodes/COM_KuwaharaNode.cc index 8219fa3b4fd..bf21e75865a 100644 --- a/source/blender/compositor/nodes/COM_KuwaharaNode.cc +++ b/source/blender/compositor/nodes/COM_KuwaharaNode.cc @@ -2,12 +2,15 @@ * * SPDX-License-Identifier: GPL-2.0-or-later */ +#define DNA_DEPRECATED_ALLOW /* For copy of deprecated NodeKuwaharaData members. */ + #include "DNA_node_types.h" #include "DNA_scene_types.h" #include "COM_KuwaharaNode.h" -#include "COM_GaussianBlurBaseOperation.h" +#include "COM_GaussianXBlurOperation.h" +#include "COM_GaussianYBlurOperation.h" #include "COM_KuwaharaAnisotropicOperation.h" #include "COM_KuwaharaAnisotropicStructureTensorOperation.h" #include "COM_KuwaharaClassicOperation.h" @@ -24,7 +27,7 @@ void KuwaharaNode::convert_to_operations(NodeConverter &converter, switch (data->variation) { case CMP_NODE_KUWAHARA_CLASSIC: { KuwaharaClassicOperation *kuwahara_classic = new KuwaharaClassicOperation(); - kuwahara_classic->set_high_precision(data->high_precision); + kuwahara_classic->set_data(data); converter.add_operation(kuwahara_classic); converter.map_input_socket(get_input_socket(0), kuwahara_classic->get_input_socket(0)); converter.map_input_socket(get_input_socket(1), kuwahara_classic->get_input_socket(1)); @@ -76,8 +79,7 @@ void KuwaharaNode::convert_to_operations(NodeConverter &converter, KuwaharaAnisotropicOperation *kuwahara_anisotropic_operation = new KuwaharaAnisotropicOperation(); - kuwahara_anisotropic_operation->set_sharpness(data->sharpness); - kuwahara_anisotropic_operation->set_eccentricity(data->eccentricity); + kuwahara_anisotropic_operation->data = *data; converter.add_operation(kuwahara_anisotropic_operation); converter.map_input_socket(get_input_socket(0), diff --git a/source/blender/compositor/nodes/COM_PlaneTrackDeformNode.cc b/source/blender/compositor/nodes/COM_PlaneTrackDeformNode.cc index 21f3d26202b..2583e881141 100644 --- a/source/blender/compositor/nodes/COM_PlaneTrackDeformNode.cc +++ b/source/blender/compositor/nodes/COM_PlaneTrackDeformNode.cc @@ -5,8 +5,6 @@ #include "COM_PlaneTrackDeformNode.h" #include "COM_PlaneTrackOperation.h" -#include "COM_SMAAOperation.h" -#include "COM_SetAlphaMultiplyOperation.h" namespace blender::compositor { @@ -24,39 +22,9 @@ void PlaneTrackDeformNode::convert_to_operations(NodeConverter &converter, int frame_number = context.get_framenumber(); - PlaneTrackMaskOperation *plane_mask_operation = new PlaneTrackMaskOperation(); - plane_mask_operation->set_movie_clip(clip); - plane_mask_operation->set_tracking_object(data->tracking_object); - plane_mask_operation->set_plane_track_name(data->plane_track_name); - plane_mask_operation->set_framenumber(frame_number); - if (data->flag & CMP_NODE_PLANE_TRACK_DEFORM_FLAG_MOTION_BLUR) { - plane_mask_operation->set_motion_blur_samples(data->motion_blur_samples); - plane_mask_operation->set_motion_blur_shutter(data->motion_blur_shutter); - } - converter.add_operation(plane_mask_operation); - - SMAAEdgeDetectionOperation *smaa_edge_detection = new SMAAEdgeDetectionOperation(); - converter.add_operation(smaa_edge_detection); - - converter.add_link(plane_mask_operation->get_output_socket(), - smaa_edge_detection->get_input_socket(0)); - - SMAABlendingWeightCalculationOperation *smaa_blending_weights = - new SMAABlendingWeightCalculationOperation(); - converter.add_operation(smaa_blending_weights); - - converter.add_link(smaa_edge_detection->get_output_socket(), - smaa_blending_weights->get_input_socket(0)); - - SMAANeighborhoodBlendingOperation *smaa_neighborhood = new SMAANeighborhoodBlendingOperation(); - converter.add_operation(smaa_neighborhood); - - converter.add_link(plane_mask_operation->get_output_socket(), - smaa_neighborhood->get_input_socket(0)); - converter.add_link(smaa_blending_weights->get_output_socket(), - smaa_neighborhood->get_input_socket(1)); - - converter.map_output_socket(this->get_output_socket(1), smaa_neighborhood->get_output_socket()); + NodeInput *input_image = this->get_input_socket(0); + NodeOutput *output_warped_image = this->get_output_socket(0); + NodeOutput *output_plane = this->get_output_socket(1); PlaneTrackWarpImageOperation *warp_image_operation = new PlaneTrackWarpImageOperation(); warp_image_operation->set_movie_clip(clip); @@ -69,16 +37,21 @@ void PlaneTrackDeformNode::convert_to_operations(NodeConverter &converter, } converter.add_operation(warp_image_operation); - converter.map_input_socket(this->get_input_socket(0), warp_image_operation->get_input_socket(0)); + converter.map_input_socket(input_image, warp_image_operation->get_input_socket(0)); + converter.map_output_socket(output_warped_image, warp_image_operation->get_output_socket()); - SetAlphaMultiplyOperation *set_alpha_operation = new SetAlphaMultiplyOperation(); - converter.add_operation(set_alpha_operation); - converter.add_link(warp_image_operation->get_output_socket(), - set_alpha_operation->get_input_socket(0)); - converter.add_link(smaa_neighborhood->get_output_socket(), - set_alpha_operation->get_input_socket(1)); - converter.map_output_socket(this->get_output_socket(0), - set_alpha_operation->get_output_socket()); + PlaneTrackMaskOperation *plane_mask_operation = new PlaneTrackMaskOperation(); + plane_mask_operation->set_movie_clip(clip); + plane_mask_operation->set_tracking_object(data->tracking_object); + plane_mask_operation->set_plane_track_name(data->plane_track_name); + plane_mask_operation->set_framenumber(frame_number); + if (data->flag & CMP_NODE_PLANE_TRACK_DEFORM_FLAG_MOTION_BLUR) { + plane_mask_operation->set_motion_blur_samples(data->motion_blur_samples); + plane_mask_operation->set_motion_blur_shutter(data->motion_blur_shutter); + } + converter.add_operation(plane_mask_operation); + + converter.map_output_socket(output_plane, plane_mask_operation->get_output_socket()); } } // namespace blender::compositor diff --git a/source/blender/compositor/nodes/COM_RotateNode.cc b/source/blender/compositor/nodes/COM_RotateNode.cc index fe0a0ea40a0..1879ce49500 100644 --- a/source/blender/compositor/nodes/COM_RotateNode.cc +++ b/source/blender/compositor/nodes/COM_RotateNode.cc @@ -15,7 +15,7 @@ RotateNode::RotateNode(bNode *editor_node) : Node(editor_node) } void RotateNode::convert_to_operations(NodeConverter &converter, - const CompositorContext & /*context*/) const + const CompositorContext &context) const { NodeInput *input_socket = this->get_input_socket(0); NodeInput *input_degree_socket = this->get_input_socket(1); @@ -24,8 +24,21 @@ void RotateNode::convert_to_operations(NodeConverter &converter, converter.add_operation(operation); PixelSampler sampler = (PixelSampler)this->get_bnode()->custom1; - operation->set_sampler(sampler); - converter.map_input_socket(input_socket, operation->get_input_socket(0)); + switch (context.get_execution_model()) { + case eExecutionModel::Tiled: { + SetSamplerOperation *sampler_op = new SetSamplerOperation(); + sampler_op->set_sampler(sampler); + converter.add_operation(sampler_op); + converter.add_link(sampler_op->get_output_socket(), operation->get_input_socket(0)); + converter.map_input_socket(input_socket, sampler_op->get_input_socket(0)); + break; + } + case eExecutionModel::FullFrame: { + operation->set_sampler(sampler); + converter.map_input_socket(input_socket, operation->get_input_socket(0)); + break; + } + } converter.map_input_socket(input_degree_socket, operation->get_input_socket(1)); converter.map_output_socket(output_socket, operation->get_output_socket(0)); diff --git a/source/blender/compositor/nodes/COM_SocketProxyNode.cc b/source/blender/compositor/nodes/COM_SocketProxyNode.cc index 33731fb28d7..be6947651ea 100644 --- a/source/blender/compositor/nodes/COM_SocketProxyNode.cc +++ b/source/blender/compositor/nodes/COM_SocketProxyNode.cc @@ -3,6 +3,8 @@ * SPDX-License-Identifier: GPL-2.0-or-later */ #include "COM_SocketProxyNode.h" +#include "COM_ReadBufferOperation.h" +#include "COM_WriteBufferOperation.h" namespace blender::compositor { @@ -41,4 +43,47 @@ void SocketProxyNode::convert_to_operations(NodeConverter &converter, converter.map_output_socket(get_output_socket(), proxy_output); } +SocketBufferNode::SocketBufferNode(bNode *editor_node, + bNodeSocket *editor_input, + bNodeSocket *editor_output) + : Node(editor_node, false) +{ + DataType dt; + + dt = DataType::Value; + if (editor_input->type == SOCK_RGBA) { + dt = DataType::Color; + } + if (editor_input->type == SOCK_VECTOR) { + dt = DataType::Vector; + } + this->add_input_socket(dt, editor_input); + + dt = DataType::Value; + if (editor_output->type == SOCK_RGBA) { + dt = DataType::Color; + } + if (editor_output->type == SOCK_VECTOR) { + dt = DataType::Vector; + } + this->add_output_socket(dt, editor_output); +} + +void SocketBufferNode::convert_to_operations(NodeConverter &converter, + const CompositorContext & /*context*/) const +{ + NodeOutput *output = this->get_output_socket(0); + NodeInput *input = this->get_input_socket(0); + + DataType datatype = output->get_data_type(); + WriteBufferOperation *write_operation = new WriteBufferOperation(datatype); + ReadBufferOperation *read_operation = new ReadBufferOperation(datatype); + read_operation->set_memory_proxy(write_operation->get_memory_proxy()); + converter.add_operation(write_operation); + converter.add_operation(read_operation); + + converter.map_input_socket(input, write_operation->get_input_socket(0)); + converter.map_output_socket(output, read_operation->get_output_socket()); +} + } // namespace blender::compositor diff --git a/source/blender/compositor/nodes/COM_SocketProxyNode.h b/source/blender/compositor/nodes/COM_SocketProxyNode.h index 61bdd17a550..76530b070e3 100644 --- a/source/blender/compositor/nodes/COM_SocketProxyNode.h +++ b/source/blender/compositor/nodes/COM_SocketProxyNode.h @@ -35,4 +35,11 @@ class SocketProxyNode : public Node { bool use_conversion_; }; +class SocketBufferNode : public Node { + public: + SocketBufferNode(bNode *editor_node, bNodeSocket *editor_input, bNodeSocket *editor_output); + void convert_to_operations(NodeConverter &converter, + const CompositorContext &context) const override; +}; + } // namespace blender::compositor diff --git a/source/blender/compositor/nodes/COM_Stabilize2dNode.cc b/source/blender/compositor/nodes/COM_Stabilize2dNode.cc index e5ac119a216..1c38f23a177 100644 --- a/source/blender/compositor/nodes/COM_Stabilize2dNode.cc +++ b/source/blender/compositor/nodes/COM_Stabilize2dNode.cc @@ -55,55 +55,119 @@ void Stabilize2dNode::convert_to_operations(NodeConverter &converter, converter.add_operation(x_attribute); converter.add_operation(y_attribute); - ScaleRelativeOperation *scale_operation = new ScaleRelativeOperation(); - scale_operation->set_sampler(sampler); - RotateOperation *rotate_operation = new RotateOperation(); - rotate_operation->set_do_degree2_rad_conversion(false); - rotate_operation->set_sampler(sampler); - TranslateOperation *translate_operation = new TranslateCanvasOperation(); + switch (context.get_execution_model()) { + case eExecutionModel::Tiled: { + ScaleRelativeOperation *scale_operation = new ScaleRelativeOperation(); + scale_operation->set_sampler(sampler); + RotateOperation *rotate_operation = new RotateOperation(); + rotate_operation->set_do_degree2_rad_conversion(false); + TranslateOperation *translate_operation = new TranslateOperation(); + SetSamplerOperation *psoperation = new SetSamplerOperation(); + psoperation->set_sampler(sampler); - converter.add_operation(scale_operation); - converter.add_operation(translate_operation); - converter.add_operation(rotate_operation); + converter.add_operation(scale_operation); + converter.add_operation(translate_operation); + converter.add_operation(rotate_operation); + converter.add_operation(psoperation); - converter.add_link(scale_attribute->get_output_socket(), scale_operation->get_input_socket(1)); - converter.add_link(scale_attribute->get_output_socket(), scale_operation->get_input_socket(2)); + converter.add_link(scale_attribute->get_output_socket(), + scale_operation->get_input_socket(1)); + converter.add_link(scale_attribute->get_output_socket(), + scale_operation->get_input_socket(2)); - converter.add_link(angle_attribute->get_output_socket(), rotate_operation->get_input_socket(1)); + converter.add_link(angle_attribute->get_output_socket(), + rotate_operation->get_input_socket(1)); - converter.add_link(x_attribute->get_output_socket(), translate_operation->get_input_socket(1)); - converter.add_link(y_attribute->get_output_socket(), translate_operation->get_input_socket(2)); + converter.add_link(x_attribute->get_output_socket(), + translate_operation->get_input_socket(1)); + converter.add_link(y_attribute->get_output_socket(), + translate_operation->get_input_socket(2)); - NodeOperationInput *stabilization_socket = nullptr; - if (invert) { - /* Translate -> Rotate -> Scale. */ - stabilization_socket = translate_operation->get_input_socket(0); - converter.map_input_socket(image_input, translate_operation->get_input_socket(0)); + converter.map_output_socket(get_output_socket(), psoperation->get_output_socket()); - converter.add_link(translate_operation->get_output_socket(), - rotate_operation->get_input_socket(0)); - converter.add_link(rotate_operation->get_output_socket(), - scale_operation->get_input_socket(0)); + if (invert) { + /* Translate -> Rotate -> Scale. */ + converter.map_input_socket(image_input, translate_operation->get_input_socket(0)); - converter.map_output_socket(get_output_socket(), scale_operation->get_output_socket()); + converter.add_link(translate_operation->get_output_socket(), + rotate_operation->get_input_socket(0)); + converter.add_link(rotate_operation->get_output_socket(), + scale_operation->get_input_socket(0)); + + converter.add_link(scale_operation->get_output_socket(), psoperation->get_input_socket(0)); + } + else { + /* Scale -> Rotate -> Translate. */ + converter.map_input_socket(image_input, scale_operation->get_input_socket(0)); + + converter.add_link(scale_operation->get_output_socket(), + rotate_operation->get_input_socket(0)); + converter.add_link(rotate_operation->get_output_socket(), + translate_operation->get_input_socket(0)); + + converter.add_link(translate_operation->get_output_socket(), + psoperation->get_input_socket(0)); + } + break; + } + case eExecutionModel::FullFrame: { + ScaleRelativeOperation *scale_operation = new ScaleRelativeOperation(); + scale_operation->set_sampler(sampler); + RotateOperation *rotate_operation = new RotateOperation(); + rotate_operation->set_do_degree2_rad_conversion(false); + rotate_operation->set_sampler(sampler); + TranslateOperation *translate_operation = new TranslateCanvasOperation(); + + converter.add_operation(scale_operation); + converter.add_operation(translate_operation); + converter.add_operation(rotate_operation); + + converter.add_link(scale_attribute->get_output_socket(), + scale_operation->get_input_socket(1)); + converter.add_link(scale_attribute->get_output_socket(), + scale_operation->get_input_socket(2)); + + converter.add_link(angle_attribute->get_output_socket(), + rotate_operation->get_input_socket(1)); + + converter.add_link(x_attribute->get_output_socket(), + translate_operation->get_input_socket(1)); + converter.add_link(y_attribute->get_output_socket(), + translate_operation->get_input_socket(2)); + + NodeOperationInput *stabilization_socket = nullptr; + if (invert) { + /* Translate -> Rotate -> Scale. */ + stabilization_socket = translate_operation->get_input_socket(0); + converter.map_input_socket(image_input, translate_operation->get_input_socket(0)); + + converter.add_link(translate_operation->get_output_socket(), + rotate_operation->get_input_socket(0)); + converter.add_link(rotate_operation->get_output_socket(), + scale_operation->get_input_socket(0)); + + converter.map_output_socket(get_output_socket(), scale_operation->get_output_socket()); + } + else { + /* Scale -> Rotate -> Translate. */ + stabilization_socket = scale_operation->get_input_socket(0); + converter.map_input_socket(image_input, scale_operation->get_input_socket(0)); + + converter.add_link(scale_operation->get_output_socket(), + rotate_operation->get_input_socket(0)); + converter.add_link(rotate_operation->get_output_socket(), + translate_operation->get_input_socket(0)); + + converter.map_output_socket(get_output_socket(), translate_operation->get_output_socket()); + } + + x_attribute->set_socket_input_resolution_for_stabilization(stabilization_socket); + y_attribute->set_socket_input_resolution_for_stabilization(stabilization_socket); + scale_attribute->set_socket_input_resolution_for_stabilization(stabilization_socket); + angle_attribute->set_socket_input_resolution_for_stabilization(stabilization_socket); + break; + } } - else { - /* Scale -> Rotate -> Translate. */ - stabilization_socket = scale_operation->get_input_socket(0); - converter.map_input_socket(image_input, scale_operation->get_input_socket(0)); - - converter.add_link(scale_operation->get_output_socket(), - rotate_operation->get_input_socket(0)); - converter.add_link(rotate_operation->get_output_socket(), - translate_operation->get_input_socket(0)); - - converter.map_output_socket(get_output_socket(), translate_operation->get_output_socket()); - } - - x_attribute->set_socket_input_resolution_for_stabilization(stabilization_socket); - y_attribute->set_socket_input_resolution_for_stabilization(stabilization_socket); - scale_attribute->set_socket_input_resolution_for_stabilization(stabilization_socket); - angle_attribute->set_socket_input_resolution_for_stabilization(stabilization_socket); } } // namespace blender::compositor diff --git a/source/blender/compositor/nodes/COM_TransformNode.cc b/source/blender/compositor/nodes/COM_TransformNode.cc index a598fd9dc4d..f07442e7591 100644 --- a/source/blender/compositor/nodes/COM_TransformNode.cc +++ b/source/blender/compositor/nodes/COM_TransformNode.cc @@ -16,7 +16,7 @@ TransformNode::TransformNode(bNode *editor_node) : Node(editor_node) } void TransformNode::convert_to_operations(NodeConverter &converter, - const CompositorContext & /*context*/) const + const CompositorContext &context) const { NodeInput *image_input = this->get_input_socket(0); NodeInput *x_input = this->get_input_socket(1); @@ -24,34 +24,73 @@ void TransformNode::convert_to_operations(NodeConverter &converter, NodeInput *angle_input = this->get_input_socket(3); NodeInput *scale_input = this->get_input_socket(4); - ScaleRelativeOperation *scale_operation = new ScaleRelativeOperation(); - converter.add_operation(scale_operation); + switch (context.get_execution_model()) { + case eExecutionModel::Tiled: { + ScaleRelativeOperation *scale_operation = new ScaleRelativeOperation(); + converter.add_operation(scale_operation); - RotateOperation *rotate_operation = new RotateOperation(); - rotate_operation->set_do_degree2_rad_conversion(false); - converter.add_operation(rotate_operation); + RotateOperation *rotate_operation = new RotateOperation(); + rotate_operation->set_do_degree2_rad_conversion(false); + converter.add_operation(rotate_operation); - TranslateOperation *translate_operation = new TranslateCanvasOperation(); - converter.add_operation(translate_operation); + TranslateOperation *translate_operation = new TranslateOperation(); + converter.add_operation(translate_operation); - PixelSampler sampler = (PixelSampler)this->get_bnode()->custom1; - scale_operation->set_sampler(sampler); - rotate_operation->set_sampler(sampler); + SetSamplerOperation *sampler = new SetSamplerOperation(); + sampler->set_sampler((PixelSampler)this->get_bnode()->custom1); + converter.add_operation(sampler); - converter.map_input_socket(image_input, scale_operation->get_input_socket(0)); - converter.map_input_socket(scale_input, scale_operation->get_input_socket(1)); - converter.map_input_socket(scale_input, - scale_operation->get_input_socket(2)); // xscale = yscale + converter.map_input_socket(image_input, sampler->get_input_socket(0)); + converter.add_link(sampler->get_output_socket(), scale_operation->get_input_socket(0)); + converter.map_input_socket(scale_input, scale_operation->get_input_socket(1)); + converter.map_input_socket(scale_input, + scale_operation->get_input_socket(2)); // xscale = yscale - converter.add_link(scale_operation->get_output_socket(), rotate_operation->get_input_socket(0)); - converter.map_input_socket(angle_input, rotate_operation->get_input_socket(1)); + converter.add_link(scale_operation->get_output_socket(), + rotate_operation->get_input_socket(0)); + converter.map_input_socket(angle_input, rotate_operation->get_input_socket(1)); - converter.add_link(rotate_operation->get_output_socket(), - translate_operation->get_input_socket(0)); - converter.map_input_socket(x_input, translate_operation->get_input_socket(1)); - converter.map_input_socket(y_input, translate_operation->get_input_socket(2)); + converter.add_link(rotate_operation->get_output_socket(), + translate_operation->get_input_socket(0)); + converter.map_input_socket(x_input, translate_operation->get_input_socket(1)); + converter.map_input_socket(y_input, translate_operation->get_input_socket(2)); - converter.map_output_socket(get_output_socket(), translate_operation->get_output_socket()); + converter.map_output_socket(get_output_socket(), translate_operation->get_output_socket()); + break; + } + case eExecutionModel::FullFrame: { + ScaleRelativeOperation *scale_operation = new ScaleRelativeOperation(); + converter.add_operation(scale_operation); + + RotateOperation *rotate_operation = new RotateOperation(); + rotate_operation->set_do_degree2_rad_conversion(false); + converter.add_operation(rotate_operation); + + TranslateOperation *translate_operation = new TranslateCanvasOperation(); + converter.add_operation(translate_operation); + + PixelSampler sampler = (PixelSampler)this->get_bnode()->custom1; + scale_operation->set_sampler(sampler); + rotate_operation->set_sampler(sampler); + + converter.map_input_socket(image_input, scale_operation->get_input_socket(0)); + converter.map_input_socket(scale_input, scale_operation->get_input_socket(1)); + converter.map_input_socket(scale_input, + scale_operation->get_input_socket(2)); // xscale = yscale + + converter.add_link(scale_operation->get_output_socket(), + rotate_operation->get_input_socket(0)); + converter.map_input_socket(angle_input, rotate_operation->get_input_socket(1)); + + converter.add_link(rotate_operation->get_output_socket(), + translate_operation->get_input_socket(0)); + converter.map_input_socket(x_input, translate_operation->get_input_socket(1)); + converter.map_input_socket(y_input, translate_operation->get_input_socket(2)); + + converter.map_output_socket(get_output_socket(), translate_operation->get_output_socket()); + break; + } + } } } // namespace blender::compositor diff --git a/source/blender/compositor/nodes/COM_TranslateNode.cc b/source/blender/compositor/nodes/COM_TranslateNode.cc index ad3f17f5c49..8ba403d62b5 100644 --- a/source/blender/compositor/nodes/COM_TranslateNode.cc +++ b/source/blender/compositor/nodes/COM_TranslateNode.cc @@ -5,6 +5,8 @@ #include "COM_TranslateNode.h" #include "COM_TranslateOperation.h" +#include "COM_WrapOperation.h" +#include "COM_WriteBufferOperation.h" namespace blender::compositor { @@ -14,7 +16,7 @@ TranslateNode::TranslateNode(bNode *editor_node) : Node(editor_node) } void TranslateNode::convert_to_operations(NodeConverter &converter, - const CompositorContext & /*context*/) const + const CompositorContext &context) const { const bNode *bnode = this->get_bnode(); const NodeTranslateData *data = (const NodeTranslateData *)bnode->storage; @@ -24,7 +26,9 @@ void TranslateNode::convert_to_operations(NodeConverter &converter, NodeInput *input_ysocket = this->get_input_socket(2); NodeOutput *output_socket = this->get_output_socket(0); - TranslateOperation *operation = new TranslateCanvasOperation(); + TranslateOperation *operation = context.get_execution_model() == eExecutionModel::Tiled ? + new TranslateOperation() : + new TranslateCanvasOperation(); operation->set_wrapping(data->wrap_axis); operation->set_is_relative(data->relative); @@ -32,7 +36,21 @@ void TranslateNode::convert_to_operations(NodeConverter &converter, converter.map_input_socket(input_xsocket, operation->get_input_socket(1)); converter.map_input_socket(input_ysocket, operation->get_input_socket(2)); converter.map_output_socket(output_socket, operation->get_output_socket(0)); - converter.map_input_socket(input_socket, operation->get_input_socket(0)); + if (data->wrap_axis && context.get_execution_model() != eExecutionModel::FullFrame) { + /* TODO: To be removed with tiled implementation. */ + WriteBufferOperation *write_operation = new WriteBufferOperation(DataType::Color); + WrapOperation *wrap_operation = new WrapOperation(DataType::Color); + wrap_operation->set_memory_proxy(write_operation->get_memory_proxy()); + wrap_operation->set_wrapping(data->wrap_axis); + + converter.add_operation(write_operation); + converter.add_operation(wrap_operation); + converter.map_input_socket(input_socket, write_operation->get_input_socket(0)); + converter.add_link(wrap_operation->get_output_socket(), operation->get_input_socket(0)); + } + else { + converter.map_input_socket(input_socket, operation->get_input_socket(0)); + } } } // namespace blender::compositor diff --git a/source/blender/compositor/nodes/COM_ViewerNode.cc b/source/blender/compositor/nodes/COM_ViewerNode.cc index 0be56d248d4..1260b1966ca 100644 --- a/source/blender/compositor/nodes/COM_ViewerNode.cc +++ b/source/blender/compositor/nodes/COM_ViewerNode.cc @@ -29,6 +29,7 @@ void ViewerNode::convert_to_operations(NodeConverter &converter, viewer_operation->set_bnodetree(context.get_bnodetree()); viewer_operation->set_image(image); viewer_operation->set_image_user(image_user); + viewer_operation->set_chunk_order((ChunkOrdering)editor_node->custom1); viewer_operation->setCenterX(editor_node->custom3); viewer_operation->setCenterY(editor_node->custom4); /* alpha socket gives either 1 or a custom alpha value if "use alpha" is enabled */ diff --git a/source/blender/compositor/operations/COM_AlphaOverKeyOperation.cc b/source/blender/compositor/operations/COM_AlphaOverKeyOperation.cc index 73377835370..61ed9bf6f86 100644 --- a/source/blender/compositor/operations/COM_AlphaOverKeyOperation.cc +++ b/source/blender/compositor/operations/COM_AlphaOverKeyOperation.cc @@ -11,6 +11,36 @@ AlphaOverKeyOperation::AlphaOverKeyOperation() flags_.can_be_constant = true; } +void AlphaOverKeyOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float input_color1[4]; + float input_over_color[4]; + float value[4]; + + input_value_operation_->read_sampled(value, x, y, sampler); + input_color1_operation_->read_sampled(input_color1, x, y, sampler); + input_color2_operation_->read_sampled(input_over_color, x, y, sampler); + + if (input_over_color[3] <= 0.0f) { + copy_v4_v4(output, input_color1); + } + else if (value[0] == 1.0f && input_over_color[3] >= 1.0f) { + copy_v4_v4(output, input_over_color); + } + else { + float premul = value[0] * input_over_color[3]; + float mul = 1.0f - premul; + + output[0] = (mul * input_color1[0]) + premul * input_over_color[0]; + output[1] = (mul * input_color1[1]) + premul * input_over_color[1]; + output[2] = (mul * input_color1[2]) + premul * input_over_color[2]; + output[3] = (mul * input_color1[3]) + value[0] * input_over_color[3]; + } +} + void AlphaOverKeyOperation::update_memory_buffer_row(PixelCursor &p) { for (; p.out < p.row_end; p.next()) { diff --git a/source/blender/compositor/operations/COM_AlphaOverKeyOperation.h b/source/blender/compositor/operations/COM_AlphaOverKeyOperation.h index 2dd87f33963..8fda605e61d 100644 --- a/source/blender/compositor/operations/COM_AlphaOverKeyOperation.h +++ b/source/blender/compositor/operations/COM_AlphaOverKeyOperation.h @@ -16,6 +16,11 @@ class AlphaOverKeyOperation : public MixBaseOperation { public: AlphaOverKeyOperation(); + /** + * The inner loop of this operation. + */ + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + void update_memory_buffer_row(PixelCursor &p) override; }; diff --git a/source/blender/compositor/operations/COM_AlphaOverMixedOperation.cc b/source/blender/compositor/operations/COM_AlphaOverMixedOperation.cc index 8d9e8b94bea..8e6d59d05e7 100644 --- a/source/blender/compositor/operations/COM_AlphaOverMixedOperation.cc +++ b/source/blender/compositor/operations/COM_AlphaOverMixedOperation.cc @@ -12,6 +12,37 @@ AlphaOverMixedOperation::AlphaOverMixedOperation() flags_.can_be_constant = true; } +void AlphaOverMixedOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float input_color1[4]; + float input_over_color[4]; + float value[4]; + + input_value_operation_->read_sampled(value, x, y, sampler); + input_color1_operation_->read_sampled(input_color1, x, y, sampler); + input_color2_operation_->read_sampled(input_over_color, x, y, sampler); + + if (input_over_color[3] <= 0.0f) { + copy_v4_v4(output, input_color1); + } + else if (value[0] == 1.0f && input_over_color[3] >= 1.0f) { + copy_v4_v4(output, input_over_color); + } + else { + float addfac = 1.0f - x_ + input_over_color[3] * x_; + float premul = value[0] * addfac; + float mul = 1.0f - value[0] * input_over_color[3]; + + output[0] = (mul * input_color1[0]) + premul * input_over_color[0]; + output[1] = (mul * input_color1[1]) + premul * input_over_color[1]; + output[2] = (mul * input_color1[2]) + premul * input_over_color[2]; + output[3] = (mul * input_color1[3]) + value[0] * input_over_color[3]; + } +} + void AlphaOverMixedOperation::update_memory_buffer_row(PixelCursor &p) { for (; p.out < p.row_end; p.next()) { diff --git a/source/blender/compositor/operations/COM_AlphaOverMixedOperation.h b/source/blender/compositor/operations/COM_AlphaOverMixedOperation.h index d03c42eb305..65ef10d56f8 100644 --- a/source/blender/compositor/operations/COM_AlphaOverMixedOperation.h +++ b/source/blender/compositor/operations/COM_AlphaOverMixedOperation.h @@ -22,6 +22,11 @@ class AlphaOverMixedOperation : public MixBaseOperation { */ AlphaOverMixedOperation(); + /** + * The inner loop of this operation. + */ + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + void setX(float x) { x_ = x; diff --git a/source/blender/compositor/operations/COM_AlphaOverPremultiplyOperation.cc b/source/blender/compositor/operations/COM_AlphaOverPremultiplyOperation.cc index f7169f68b09..be20630fa6a 100644 --- a/source/blender/compositor/operations/COM_AlphaOverPremultiplyOperation.cc +++ b/source/blender/compositor/operations/COM_AlphaOverPremultiplyOperation.cc @@ -11,6 +11,36 @@ AlphaOverPremultiplyOperation::AlphaOverPremultiplyOperation() flags_.can_be_constant = true; } +void AlphaOverPremultiplyOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float input_color1[4]; + float input_over_color[4]; + float value[4]; + + input_value_operation_->read_sampled(value, x, y, sampler); + input_color1_operation_->read_sampled(input_color1, x, y, sampler); + input_color2_operation_->read_sampled(input_over_color, x, y, sampler); + + /* Zero alpha values should still permit an add of RGB data */ + if (input_over_color[3] < 0.0f) { + copy_v4_v4(output, input_color1); + } + else if (value[0] == 1.0f && input_over_color[3] >= 1.0f) { + copy_v4_v4(output, input_over_color); + } + else { + float mul = 1.0f - value[0] * input_over_color[3]; + + output[0] = (mul * input_color1[0]) + value[0] * input_over_color[0]; + output[1] = (mul * input_color1[1]) + value[0] * input_over_color[1]; + output[2] = (mul * input_color1[2]) + value[0] * input_over_color[2]; + output[3] = (mul * input_color1[3]) + value[0] * input_over_color[3]; + } +} + void AlphaOverPremultiplyOperation::update_memory_buffer_row(PixelCursor &p) { for (; p.out < p.row_end; p.next()) { diff --git a/source/blender/compositor/operations/COM_AlphaOverPremultiplyOperation.h b/source/blender/compositor/operations/COM_AlphaOverPremultiplyOperation.h index f55207394c5..644e54db6af 100644 --- a/source/blender/compositor/operations/COM_AlphaOverPremultiplyOperation.h +++ b/source/blender/compositor/operations/COM_AlphaOverPremultiplyOperation.h @@ -16,6 +16,11 @@ class AlphaOverPremultiplyOperation : public MixBaseOperation { public: AlphaOverPremultiplyOperation(); + /** + * The inner loop of this operation. + */ + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + void update_memory_buffer_row(PixelCursor &p) override; }; diff --git a/source/blender/compositor/operations/COM_BilateralBlurOperation.cc b/source/blender/compositor/operations/COM_BilateralBlurOperation.cc index 0435b190e6f..43313de77a0 100644 --- a/source/blender/compositor/operations/COM_BilateralBlurOperation.cc +++ b/source/blender/compositor/operations/COM_BilateralBlurOperation.cc @@ -11,14 +11,87 @@ BilateralBlurOperation::BilateralBlurOperation() this->add_input_socket(DataType::Color); this->add_input_socket(DataType::Color); this->add_output_socket(DataType::Color); + flags_.complex = true; flags_.can_be_constant = true; + + input_color_program_ = nullptr; + input_determinator_program_ = nullptr; } void BilateralBlurOperation::init_execution() { + input_color_program_ = get_input_socket_reader(0); + input_determinator_program_ = get_input_socket_reader(1); QualityStepHelper::init_execution(COM_QH_INCREASE); } +void BilateralBlurOperation::execute_pixel(float output[4], int x, int y, void *data) +{ + /* Read the determinator color at x, y, + * this will be used as the reference color for the determinator. */ + float determinator_reference_color[4]; + float determinator[4]; + float temp_color[4]; + float blur_color[4]; + float blur_divider; + float sigmacolor = data_->sigma_color; + float delta_color; + input_determinator_program_->read(determinator_reference_color, x, y, data); + + zero_v4(blur_color); + blur_divider = 0.0f; + /* TODO(sergey): This isn't really good bilateral filter, it should be + * using gaussian bell for weights. Also sigma_color doesn't seem to be + * used correct at all. + */ + for (int yi = -radius_; yi <= radius_; yi += QualityStepHelper::get_step()) { + for (int xi = -radius_; xi <= radius_; xi += QualityStepHelper::get_step()) { + /* Read determinator. */ + input_determinator_program_->read_clamped(determinator, x + xi, y + yi, data); + delta_color = (fabsf(determinator_reference_color[0] - determinator[0]) + + fabsf(determinator_reference_color[1] - determinator[1]) + + /* Do not take the alpha channel into account. */ + fabsf(determinator_reference_color[2] - determinator[2])); + if (delta_color < sigmacolor) { + /* Add this to the blur. */ + input_color_program_->read_clamped(temp_color, x + xi, y + yi, data); + add_v4_v4(blur_color, temp_color); + blur_divider += 1.0f; + } + } + } + + if (blur_divider > 0.0f) { + mul_v4_v4fl(output, blur_color, 1.0f / blur_divider); + } + else { + output[0] = 0.0f; + output[1] = 0.0f; + output[2] = 0.0f; + output[3] = 1.0f; + } +} + +void BilateralBlurOperation::deinit_execution() +{ + input_color_program_ = nullptr; + input_determinator_program_ = nullptr; +} + +bool BilateralBlurOperation::determine_depending_area_of_interest( + rcti *input, ReadBufferOperation *read_operation, rcti *output) +{ + rcti new_input; + int add = radius_ + 1; + + new_input.xmax = input->xmax + (add); + new_input.xmin = input->xmin - (add); + new_input.ymax = input->ymax + (add); + new_input.ymin = input->ymin - (add); + + return NodeOperation::determine_depending_area_of_interest(&new_input, read_operation, output); +} + void BilateralBlurOperation::get_area_of_interest(const int /*input_idx*/, const rcti &output_area, rcti &r_input_area) diff --git a/source/blender/compositor/operations/COM_BilateralBlurOperation.h b/source/blender/compositor/operations/COM_BilateralBlurOperation.h index 0920fc6fb52..4661d07444b 100644 --- a/source/blender/compositor/operations/COM_BilateralBlurOperation.h +++ b/source/blender/compositor/operations/COM_BilateralBlurOperation.h @@ -13,14 +13,33 @@ namespace blender::compositor { class BilateralBlurOperation : public MultiThreadedOperation, public QualityStepHelper { private: + SocketReader *input_color_program_; + SocketReader *input_determinator_program_; NodeBilateralBlurData *data_; int radius_; public: BilateralBlurOperation(); + /** + * The inner loop of this operation. + */ + void execute_pixel(float output[4], int x, int y, void *data) override; + + /** + * Initialize the execution + */ void init_execution() override; + /** + * Deinitialize the execution + */ + void deinit_execution() override; + + bool determine_depending_area_of_interest(rcti *input, + ReadBufferOperation *read_operation, + rcti *output) override; + void set_data(NodeBilateralBlurData *data) { data_ = data; diff --git a/source/blender/compositor/operations/COM_BlurBaseOperation.cc b/source/blender/compositor/operations/COM_BlurBaseOperation.cc index 6403e89c11a..2d4399c2250 100644 --- a/source/blender/compositor/operations/COM_BlurBaseOperation.cc +++ b/source/blender/compositor/operations/COM_BlurBaseOperation.cc @@ -15,7 +15,9 @@ BlurBaseOperation::BlurBaseOperation(DataType data_type) this->add_input_socket(data_type); this->add_input_socket(DataType::Value); this->add_output_socket(data_type); + flags_.complex = true; flags_.can_be_constant = true; + input_program_ = nullptr; memset(&data_, 0, sizeof(NodeBlurData)); size_ = 1.0f; sizeavailable_ = false; @@ -25,7 +27,9 @@ BlurBaseOperation::BlurBaseOperation(DataType data_type) void BlurBaseOperation::init_data() { - update_size(); + if (execution_model_ == eExecutionModel::FullFrame) { + update_size(); + } data_.image_in_width = this->get_width(); data_.image_in_height = this->get_height(); @@ -51,6 +55,9 @@ void BlurBaseOperation::init_data() void BlurBaseOperation::init_execution() { + input_program_ = this->get_input_socket_reader(0); + input_size_ = this->get_input_socket_reader(1); + QualityStepHelper::init_execution(COM_QH_MULTIPLY); } @@ -141,6 +148,12 @@ float *BlurBaseOperation::make_dist_fac_inverse(float rad, int size, int falloff return dist_fac_invert; } +void BlurBaseOperation::deinit_execution() +{ + input_program_ = nullptr; + input_size_ = nullptr; +} + void BlurBaseOperation::set_data(const NodeBlurData *data) { memcpy(&data_, data, sizeof(NodeBlurData)); @@ -163,10 +176,21 @@ void BlurBaseOperation::update_size() return; } - NodeOperation *size_input = get_input_operation(SIZE_INPUT_INDEX); - if (size_input->get_flags().is_constant_operation) { - size_ = *static_cast(size_input)->get_constant_elem(); - } /* Else use default. */ + switch (execution_model_) { + case eExecutionModel::Tiled: { + float result[4]; + this->get_input_socket_reader(1)->read_sampled(result, 0, 0, PixelSampler::Nearest); + size_ = result[0]; + break; + } + case eExecutionModel::FullFrame: { + NodeOperation *size_input = get_input_operation(SIZE_INPUT_INDEX); + if (size_input->get_flags().is_constant_operation) { + size_ = *static_cast(size_input)->get_constant_elem(); + } /* Else use default. */ + break; + } + } sizeavailable_ = true; } @@ -177,15 +201,26 @@ void BlurBaseOperation::determine_canvas(const rcti &preferred_area, rcti &r_are return; } - /* Setting a modifier ensures all non main inputs have extended bounds as preferred - * canvas, avoiding unnecessary canvas conversions that would hide constant - * operations. */ - set_determined_canvas_modifier([=](rcti &canvas) { - /* Rounding to even prevents jiggling in backdrop while switching size values. */ - canvas.xmax += round_to_even(2 * size_ * data_.sizex); - canvas.ymax += round_to_even(2 * size_ * data_.sizey); - }); - NodeOperation::determine_canvas(preferred_area, r_area); + switch (execution_model_) { + case eExecutionModel::Tiled: { + NodeOperation::determine_canvas(preferred_area, r_area); + r_area.xmax += 2 * size_ * data_.sizex; + r_area.ymax += 2 * size_ * data_.sizey; + break; + } + case eExecutionModel::FullFrame: { + /* Setting a modifier ensures all non main inputs have extended bounds as preferred + * canvas, avoiding unnecessary canvas conversions that would hide constant + * operations. */ + set_determined_canvas_modifier([=](rcti &canvas) { + /* Rounding to even prevents jiggling in backdrop while switching size values. */ + canvas.xmax += round_to_even(2 * size_ * data_.sizex); + canvas.ymax += round_to_even(2 * size_ * data_.sizey); + }); + NodeOperation::determine_canvas(preferred_area, r_area); + break; + } + } } void BlurBaseOperation::get_area_of_interest(const int input_idx, diff --git a/source/blender/compositor/operations/COM_BlurBaseOperation.h b/source/blender/compositor/operations/COM_BlurBaseOperation.h index ab293bbd292..9f7ac9fec81 100644 --- a/source/blender/compositor/operations/COM_BlurBaseOperation.h +++ b/source/blender/compositor/operations/COM_BlurBaseOperation.h @@ -35,6 +35,11 @@ class BlurBaseOperation : public MultiThreadedOperation, public QualityStepHelpe void update_size(); + /** + * Cached reference to the input_program + */ + SocketReader *input_program_; + SocketReader *input_size_; NodeBlurData data_; float size_; @@ -45,8 +50,16 @@ class BlurBaseOperation : public MultiThreadedOperation, public QualityStepHelpe public: virtual void init_data() override; + /** + * Initialize the execution + */ void init_execution() override; + /** + * Deinitialize the execution + */ + void deinit_execution() override; + void set_data(const NodeBlurData *data); void set_size(float size) diff --git a/source/blender/compositor/operations/COM_BokehBlurOperation.cc b/source/blender/compositor/operations/COM_BokehBlurOperation.cc index 1686af6dfc6..bd4b9eab927 100644 --- a/source/blender/compositor/operations/COM_BokehBlurOperation.cc +++ b/source/blender/compositor/operations/COM_BokehBlurOperation.cc @@ -8,6 +8,8 @@ #include "COM_BokehBlurOperation.h" #include "COM_ConstantOperation.h" +#include "COM_OpenCLDevice.h" + namespace blender::compositor { constexpr int IMAGE_INPUT_INDEX = 0; @@ -23,35 +25,195 @@ BokehBlurOperation::BokehBlurOperation() this->add_input_socket(DataType::Value); this->add_output_socket(DataType::Color); + flags_.complex = true; + flags_.open_cl = true; flags_.can_be_constant = true; size_ = 1.0f; sizeavailable_ = false; + input_program_ = nullptr; + input_bokeh_program_ = nullptr; + input_bounding_box_reader_ = nullptr; extend_bounds_ = false; } void BokehBlurOperation::init_data() { - update_size(); + if (execution_model_ == eExecutionModel::FullFrame) { + update_size(); + } +} + +void *BokehBlurOperation::initialize_tile_data(rcti * /*rect*/) +{ + lock_mutex(); + if (!sizeavailable_) { + update_size(); + } + void *buffer = get_input_operation(0)->initialize_tile_data(nullptr); + unlock_mutex(); + return buffer; } void BokehBlurOperation::init_execution() { + init_mutex(); + + input_program_ = get_input_socket_reader(0); + input_bokeh_program_ = get_input_socket_reader(1); + input_bounding_box_reader_ = get_input_socket_reader(2); + QualityStepHelper::init_execution(COM_QH_INCREASE); } +void BokehBlurOperation::execute_pixel(float output[4], int x, int y, void *data) +{ + MemoryBuffer *input_buffer = (MemoryBuffer *)data; + + float temp_bounding_box[4]; + input_bounding_box_reader_->read_sampled(temp_bounding_box, x, y, PixelSampler::Nearest); + if (temp_bounding_box[0] <= 0.0f) { + copy_v4_v4(output, input_buffer->get_elem(x, y)); + return; + } + + const float max_dim = std::max(this->get_width(), this->get_height()); + int radius = size_ * max_dim / 100.0f; + const int2 bokeh_size = int2(input_bokeh_program_->get_width(), + input_bokeh_program_->get_height()); + + float4 accumulated_color = float4(0.0f); + float4 accumulated_weight = float4(0.0f); + int step = get_step(); + for (int yi = -radius; yi <= radius; yi += step) { + for (int xi = -radius; xi <= radius; xi += step) { + const float2 normalized_texel = (float2(xi, yi) + radius + 0.5f) / (radius * 2.0f + 1.0f); + const float2 weight_texel = (1.0f - normalized_texel) * float2(bokeh_size - 1); + float4 weight; + input_bokeh_program_->read(weight, int(weight_texel.x), int(weight_texel.y), nullptr); + const float4 color = float4(input_buffer->get_elem_clamped(x + xi, y + yi)) * weight; + accumulated_color += color; + accumulated_weight += weight; + } + } + + const float4 final_color = math::safe_divide(accumulated_color, accumulated_weight); + copy_v4_v4(output, final_color); +} + +void BokehBlurOperation::deinit_execution() +{ + deinit_mutex(); + input_program_ = nullptr; + input_bokeh_program_ = nullptr; + input_bounding_box_reader_ = nullptr; +} + +bool BokehBlurOperation::determine_depending_area_of_interest(rcti *input, + ReadBufferOperation *read_operation, + rcti *output) +{ + rcti new_input; + rcti bokeh_input; + const float max_dim = std::max(this->get_width(), this->get_height()); + + if (sizeavailable_) { + new_input.xmax = input->xmax + (size_ * max_dim / 100.0f); + new_input.xmin = input->xmin - (size_ * max_dim / 100.0f); + new_input.ymax = input->ymax + (size_ * max_dim / 100.0f); + new_input.ymin = input->ymin - (size_ * max_dim / 100.0f); + } + else { + new_input.xmax = input->xmax + (10.0f * max_dim / 100.0f); + new_input.xmin = input->xmin - (10.0f * max_dim / 100.0f); + new_input.ymax = input->ymax + (10.0f * max_dim / 100.0f); + new_input.ymin = input->ymin - (10.0f * max_dim / 100.0f); + } + + NodeOperation *operation = get_input_operation(1); + bokeh_input.xmax = operation->get_width(); + bokeh_input.xmin = 0; + bokeh_input.ymax = operation->get_height(); + bokeh_input.ymin = 0; + if (operation->determine_depending_area_of_interest(&bokeh_input, read_operation, output)) { + return true; + } + operation = get_input_operation(0); + if (operation->determine_depending_area_of_interest(&new_input, read_operation, output)) { + return true; + } + operation = get_input_operation(2); + if (operation->determine_depending_area_of_interest(input, read_operation, output)) { + return true; + } + if (!sizeavailable_) { + rcti size_input; + size_input.xmin = 0; + size_input.ymin = 0; + size_input.xmax = 5; + size_input.ymax = 5; + operation = get_input_operation(3); + if (operation->determine_depending_area_of_interest(&size_input, read_operation, output)) { + return true; + } + } + return false; +} + +void BokehBlurOperation::execute_opencl(OpenCLDevice *device, + MemoryBuffer *output_memory_buffer, + cl_mem cl_output_buffer, + MemoryBuffer **input_memory_buffers, + std::list *cl_mem_to_clean_up, + std::list * /*cl_kernels_to_clean_up*/) +{ + cl_kernel kernel = device->COM_cl_create_kernel("bokeh_blur_kernel", nullptr); + if (!sizeavailable_) { + update_size(); + } + const float max_dim = std::max(this->get_width(), this->get_height()); + cl_int radius = size_ * max_dim / 100.0f; + cl_int step = this->get_step(); + + device->COM_cl_attach_memory_buffer_to_kernel_parameter( + kernel, 0, -1, cl_mem_to_clean_up, input_memory_buffers, input_bounding_box_reader_); + device->COM_cl_attach_memory_buffer_to_kernel_parameter( + kernel, 1, 4, cl_mem_to_clean_up, input_memory_buffers, input_program_); + device->COM_cl_attach_memory_buffer_to_kernel_parameter( + kernel, 2, -1, cl_mem_to_clean_up, input_memory_buffers, input_bokeh_program_); + device->COM_cl_attach_output_memory_buffer_to_kernel_parameter(kernel, 3, cl_output_buffer); + device->COM_cl_attach_memory_buffer_offset_to_kernel_parameter(kernel, 5, output_memory_buffer); + clSetKernelArg(kernel, 6, sizeof(cl_int), &radius); + clSetKernelArg(kernel, 7, sizeof(cl_int), &step); + device->COM_cl_attach_size_to_kernel_parameter(kernel, 8, this); + + device->COM_cl_enqueue_range(kernel, output_memory_buffer, 9, this); +} + void BokehBlurOperation::update_size() { if (sizeavailable_) { return; } - NodeOperation *size_input = get_input_operation(SIZE_INPUT_INDEX); - if (size_input->get_flags().is_constant_operation) { - size_ = *static_cast(size_input)->get_constant_elem(); - CLAMP(size_, 0.0f, 10.0f); - } /* Else use default. */ + switch (execution_model_) { + case eExecutionModel::Tiled: { + float result[4]; + this->get_input_socket_reader(3)->read_sampled(result, 0, 0, PixelSampler::Nearest); + size_ = result[0]; + CLAMP(size_, 0.0f, 10.0f); + break; + } + case eExecutionModel::FullFrame: { + NodeOperation *size_input = get_input_operation(SIZE_INPUT_INDEX); + if (size_input->get_flags().is_constant_operation) { + size_ = *static_cast(size_input)->get_constant_elem(); + CLAMP(size_, 0.0f, 10.0f); + } /* Else use default. */ + break; + } + } sizeavailable_ = true; } @@ -62,14 +224,27 @@ void BokehBlurOperation::determine_canvas(const rcti &preferred_area, rcti &r_ar return; } - set_determined_canvas_modifier([=](rcti &canvas) { - const float max_dim = std::max(BLI_rcti_size_x(&canvas), BLI_rcti_size_y(&canvas)); - /* Rounding to even prevents image jiggling in backdrop while switching size values. */ - float add_size = round_to_even(2 * size_ * max_dim / 100.0f); - canvas.xmax += add_size; - canvas.ymax += add_size; - }); - NodeOperation::determine_canvas(preferred_area, r_area); + switch (execution_model_) { + case eExecutionModel::Tiled: { + NodeOperation::determine_canvas(preferred_area, r_area); + const float max_dim = std::max(BLI_rcti_size_x(&r_area), BLI_rcti_size_y(&r_area)); + float add_size = round_to_even(2 * size_ * max_dim / 100.0f); + r_area.xmax += add_size; + r_area.ymax += add_size; + break; + } + case eExecutionModel::FullFrame: { + set_determined_canvas_modifier([=](rcti &canvas) { + const float max_dim = std::max(BLI_rcti_size_x(&canvas), BLI_rcti_size_y(&canvas)); + /* Rounding to even prevents image jiggling in backdrop while switching size values. */ + float add_size = round_to_even(2 * size_ * max_dim / 100.0f); + canvas.xmax += add_size; + canvas.ymax += add_size; + }); + NodeOperation::determine_canvas(preferred_area, r_area); + break; + } + } } void BokehBlurOperation::get_area_of_interest(const int input_idx, diff --git a/source/blender/compositor/operations/COM_BokehBlurOperation.h b/source/blender/compositor/operations/COM_BokehBlurOperation.h index ad967d83932..24278327c29 100644 --- a/source/blender/compositor/operations/COM_BokehBlurOperation.h +++ b/source/blender/compositor/operations/COM_BokehBlurOperation.h @@ -11,6 +11,9 @@ namespace blender::compositor { class BokehBlurOperation : public MultiThreadedOperation, public QualityStepHelper { private: + SocketReader *input_program_; + SocketReader *input_bokeh_program_; + SocketReader *input_bounding_box_reader_; void update_size(); float size_; bool sizeavailable_; @@ -22,14 +25,39 @@ class BokehBlurOperation : public MultiThreadedOperation, public QualityStepHelp void init_data() override; + void *initialize_tile_data(rcti *rect) override; + /** + * The inner loop of this operation. + */ + void execute_pixel(float output[4], int x, int y, void *data) override; + + /** + * Initialize the execution + */ void init_execution() override; + /** + * Deinitialize the execution + */ + void deinit_execution() override; + + bool determine_depending_area_of_interest(rcti *input, + ReadBufferOperation *read_operation, + rcti *output) override; + void set_size(float size) { size_ = size; sizeavailable_ = true; } + void execute_opencl(OpenCLDevice *device, + MemoryBuffer *output_memory_buffer, + cl_mem cl_output_buffer, + MemoryBuffer **input_memory_buffers, + std::list *cl_mem_to_clean_up, + std::list *cl_kernels_to_clean_up) override; + void set_extend_bounds(bool extend_bounds) { extend_bounds_ = extend_bounds; diff --git a/source/blender/compositor/operations/COM_BokehImageOperation.cc b/source/blender/compositor/operations/COM_BokehImageOperation.cc index 0b2668b617f..3aff7f00d27 100644 --- a/source/blender/compositor/operations/COM_BokehImageOperation.cc +++ b/source/blender/compositor/operations/COM_BokehImageOperation.cc @@ -75,6 +75,30 @@ float BokehImageOperation::is_inside_bokeh(float distance, float x, float y) } return inside_bokeh; } +void BokehImageOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler /*sampler*/) +{ + float shift = data_->lensshift; + float shift2 = shift / 2.0f; + float distance = circular_distance_; + float inside_bokeh_max = is_inside_bokeh(distance, x, y); + float inside_bokeh_med = is_inside_bokeh(distance - fabsf(shift2 * distance), x, y); + float inside_bokeh_min = is_inside_bokeh(distance - fabsf(shift * distance), x, y); + if (shift < 0) { + output[0] = inside_bokeh_max; + output[1] = inside_bokeh_med; + output[2] = inside_bokeh_min; + } + else { + output[0] = inside_bokeh_min; + output[1] = inside_bokeh_med; + output[2] = inside_bokeh_max; + } + output[3] = (inside_bokeh_max + inside_bokeh_med + inside_bokeh_min) / 3.0f; +} + void BokehImageOperation::update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span /*inputs*/) diff --git a/source/blender/compositor/operations/COM_BokehImageOperation.h b/source/blender/compositor/operations/COM_BokehImageOperation.h index c73a2a1f994..db6c83fdb5e 100644 --- a/source/blender/compositor/operations/COM_BokehImageOperation.h +++ b/source/blender/compositor/operations/COM_BokehImageOperation.h @@ -95,7 +95,19 @@ class BokehImageOperation : public MultiThreadedOperation { public: BokehImageOperation(); + /** + * \brief The inner loop of this operation. + */ + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + + /** + * \brief Initialize the execution + */ void init_execution() override; + + /** + * \brief De-initialize the execution + */ void deinit_execution() override; /** diff --git a/source/blender/compositor/operations/COM_BoxMaskOperation.cc b/source/blender/compositor/operations/COM_BoxMaskOperation.cc index 523e02a4c4d..23f89d5545c 100644 --- a/source/blender/compositor/operations/COM_BoxMaskOperation.cc +++ b/source/blender/compositor/operations/COM_BoxMaskOperation.cc @@ -11,17 +11,87 @@ BoxMaskOperation::BoxMaskOperation() this->add_input_socket(DataType::Value); this->add_input_socket(DataType::Value); this->add_output_socket(DataType::Value); + input_mask_ = nullptr; + input_value_ = nullptr; cosine_ = 0.0f; sine_ = 0.0f; } void BoxMaskOperation::init_execution() { + input_mask_ = this->get_input_socket_reader(0); + input_value_ = this->get_input_socket_reader(1); const double rad = double(data_->rotation); cosine_ = cos(rad); sine_ = sin(rad); aspect_ratio_ = float(this->get_width()) / this->get_height(); } +void BoxMaskOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float input_mask[4]; + float input_value[4]; + + float rx = x / std::max(this->get_width() - 1.0f, FLT_EPSILON); + float ry = y / std::max(this->get_height() - 1.0f, FLT_EPSILON); + + const float dy = (ry - data_->y) / aspect_ratio_; + const float dx = rx - data_->x; + rx = data_->x + (cosine_ * dx + sine_ * dy); + ry = data_->y + (-sine_ * dx + cosine_ * dy); + + input_mask_->read_sampled(input_mask, x, y, sampler); + input_value_->read_sampled(input_value, x, y, sampler); + + float half_height = data_->height / 2.0f + FLT_EPSILON; + float half_width = data_->width / 2.0f + FLT_EPSILON; + bool inside = (rx >= data_->x - half_width && rx <= data_->x + half_width && + ry >= data_->y - half_height && ry <= data_->y + half_height); + + switch (mask_type_) { + case CMP_NODE_MASKTYPE_ADD: + if (inside) { + output[0] = std::max(input_mask[0], input_value[0]); + } + else { + output[0] = input_mask[0]; + } + break; + case CMP_NODE_MASKTYPE_SUBTRACT: + if (inside) { + output[0] = input_mask[0] - input_value[0]; + CLAMP(output[0], 0, 1); + } + else { + output[0] = input_mask[0]; + } + break; + case CMP_NODE_MASKTYPE_MULTIPLY: + if (inside) { + output[0] = input_mask[0] * input_value[0]; + } + else { + output[0] = 0; + } + break; + case CMP_NODE_MASKTYPE_NOT: + if (inside) { + if (input_mask[0] > 0.0f) { + output[0] = 0; + } + else { + output[0] = input_value[0]; + } + } + else { + output[0] = input_mask[0]; + } + break; + } +} + void BoxMaskOperation::update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span inputs) @@ -80,4 +150,10 @@ void BoxMaskOperation::apply_mask(MemoryBuffer *output, } } +void BoxMaskOperation::deinit_execution() +{ + input_mask_ = nullptr; + input_value_ = nullptr; +} + } // namespace blender::compositor diff --git a/source/blender/compositor/operations/COM_BoxMaskOperation.h b/source/blender/compositor/operations/COM_BoxMaskOperation.h index 48adb764a9c..2f4527128a9 100644 --- a/source/blender/compositor/operations/COM_BoxMaskOperation.h +++ b/source/blender/compositor/operations/COM_BoxMaskOperation.h @@ -12,6 +12,12 @@ class BoxMaskOperation : public MultiThreadedOperation { private: using MaskFunc = std::function; + /** + * Cached reference to the input_program + */ + SocketReader *input_mask_; + SocketReader *input_value_; + float sine_; float cosine_; float aspect_ratio_; @@ -22,8 +28,21 @@ class BoxMaskOperation : public MultiThreadedOperation { public: BoxMaskOperation(); + /** + * The inner loop of this operation. + */ + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + + /** + * Initialize the execution + */ void init_execution() override; + /** + * Deinitialize the execution + */ + void deinit_execution() override; + void set_data(const NodeBoxMask *data) { data_ = data; diff --git a/source/blender/compositor/operations/COM_BrightnessOperation.cc b/source/blender/compositor/operations/COM_BrightnessOperation.cc index 738dda2fc35..cc69d58b7bc 100644 --- a/source/blender/compositor/operations/COM_BrightnessOperation.cc +++ b/source/blender/compositor/operations/COM_BrightnessOperation.cc @@ -14,6 +14,7 @@ BrightnessOperation::BrightnessOperation() this->add_input_socket(DataType::Value); this->add_input_socket(DataType::Value); this->add_output_socket(DataType::Color); + input_program_ = nullptr; use_premultiply_ = false; flags_.can_be_constant = true; } @@ -23,6 +24,56 @@ void BrightnessOperation::set_use_premultiply(bool use_premultiply) use_premultiply_ = use_premultiply; } +void BrightnessOperation::init_execution() +{ + input_program_ = this->get_input_socket_reader(0); + input_brightness_program_ = this->get_input_socket_reader(1); + input_contrast_program_ = this->get_input_socket_reader(2); +} + +void BrightnessOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float input_value[4]; + float a, b; + float input_brightness[4]; + float input_contrast[4]; + input_program_->read_sampled(input_value, x, y, sampler); + input_brightness_program_->read_sampled(input_brightness, x, y, sampler); + input_contrast_program_->read_sampled(input_contrast, x, y, sampler); + float brightness = input_brightness[0]; + float contrast = input_contrast[0]; + brightness /= 100.0f; + float delta = contrast / 200.0f; + /* + * The algorithm is by Werner D. Streidt + * (http://visca.com/ffactory/archives/5-99/msg00021.html) + * Extracted of OpenCV `demhist.c`. + */ + if (contrast > 0) { + a = 1.0f - delta * 2.0f; + a = 1.0f / max_ff(a, FLT_EPSILON); + b = a * (brightness - delta); + } + else { + delta *= -1; + a = max_ff(1.0f - delta * 2.0f, 0.0f); + b = a * brightness + delta; + } + if (use_premultiply_) { + premul_to_straight_v4(input_value); + } + output[0] = a * input_value[0] + b; + output[1] = a * input_value[1] + b; + output[2] = a * input_value[2] + b; + output[3] = input_value[3]; + if (use_premultiply_) { + straight_to_premul_v4(output); + } +} + void BrightnessOperation::update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span inputs) @@ -67,4 +118,11 @@ void BrightnessOperation::update_memory_buffer_partial(MemoryBuffer *output, } } +void BrightnessOperation::deinit_execution() +{ + input_program_ = nullptr; + input_brightness_program_ = nullptr; + input_contrast_program_ = nullptr; +} + } // namespace blender::compositor diff --git a/source/blender/compositor/operations/COM_BrightnessOperation.h b/source/blender/compositor/operations/COM_BrightnessOperation.h index 2f3d921c67d..644f9b1571a 100644 --- a/source/blender/compositor/operations/COM_BrightnessOperation.h +++ b/source/blender/compositor/operations/COM_BrightnessOperation.h @@ -10,11 +10,33 @@ namespace blender::compositor { class BrightnessOperation : public MultiThreadedOperation { private: + /** + * Cached reference to the input_program + */ + SocketReader *input_program_; + SocketReader *input_brightness_program_; + SocketReader *input_contrast_program_; + bool use_premultiply_; public: BrightnessOperation(); + /** + * The inner loop of this operation. + */ + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + + /** + * Initialize the execution + */ + void init_execution() override; + + /** + * Deinitialize the execution + */ + void deinit_execution() override; + void set_use_premultiply(bool use_premultiply); void update_memory_buffer_partial(MemoryBuffer *output, diff --git a/source/blender/compositor/operations/COM_CalculateMeanOperation.cc b/source/blender/compositor/operations/COM_CalculateMeanOperation.cc index 1c851c31897..89f6020a177 100644 --- a/source/blender/compositor/operations/COM_CalculateMeanOperation.cc +++ b/source/blender/compositor/operations/COM_CalculateMeanOperation.cc @@ -14,16 +14,103 @@ CalculateMeanOperation::CalculateMeanOperation() { this->add_input_socket(DataType::Color, ResizeMode::Align); this->add_output_socket(DataType::Value); - is_calculated_ = false; + image_reader_ = nullptr; + iscalculated_ = false; setting_ = 1; - flags_.is_constant_operation = true; - - needs_canvas_to_get_constant_ = true; + flags_.complex = true; } - void CalculateMeanOperation::init_execution() { - is_calculated_ = false; + image_reader_ = this->get_input_socket_reader(0); + iscalculated_ = false; + NodeOperation::init_mutex(); +} + +void CalculateMeanOperation::execute_pixel(float output[4], int /*x*/, int /*y*/, void * /*data*/) +{ + output[0] = result_; +} + +void CalculateMeanOperation::deinit_execution() +{ + image_reader_ = nullptr; + NodeOperation::deinit_mutex(); +} + +bool CalculateMeanOperation::determine_depending_area_of_interest( + rcti * /*input*/, ReadBufferOperation *read_operation, rcti *output) +{ + rcti image_input; + if (iscalculated_) { + return false; + } + NodeOperation *operation = get_input_operation(0); + image_input.xmax = operation->get_width(); + image_input.xmin = 0; + image_input.ymax = operation->get_height(); + image_input.ymin = 0; + if (operation->determine_depending_area_of_interest(&image_input, read_operation, output)) { + return true; + } + return false; +} + +void *CalculateMeanOperation::initialize_tile_data(rcti *rect) +{ + lock_mutex(); + if (!iscalculated_) { + MemoryBuffer *tile = (MemoryBuffer *)image_reader_->initialize_tile_data(rect); + calculate_mean(tile); + iscalculated_ = true; + } + unlock_mutex(); + return nullptr; +} + +void CalculateMeanOperation::calculate_mean(MemoryBuffer *tile) +{ + result_ = 0.0f; + float *buffer = tile->get_buffer(); + int size = tile->get_width() * tile->get_height(); + int pixels = 0; + float sum = 0.0f; + for (int i = 0, offset = 0; i < size; i++, offset += 4) { + if (buffer[offset + 3] > 0) { + pixels++; + + switch (setting_) { + case 1: { + sum += IMB_colormanagement_get_luminance(&buffer[offset]); + break; + } + case 2: { + sum += buffer[offset]; + break; + } + case 3: { + sum += buffer[offset + 1]; + break; + } + case 4: { + sum += buffer[offset + 2]; + break; + } + case 5: { + float yuv[3]; + rgb_to_yuv(buffer[offset], + buffer[offset + 1], + buffer[offset + 2], + &yuv[0], + &yuv[1], + &yuv[2], + BLI_YUV_ITU_BT709); + sum += yuv[0]; + break; + } + } + } + } + result_ = sum / pixels; } void CalculateMeanOperation::set_setting(int setting) @@ -65,41 +152,25 @@ void CalculateMeanOperation::get_area_of_interest(int input_idx, r_input_area = get_input_operation(input_idx)->get_canvas(); } -void CalculateMeanOperation::determine_canvas(const rcti &preferred_area, rcti &r_area) +void CalculateMeanOperation::update_memory_buffer_started(MemoryBuffer * /*output*/, + const rcti & /*area*/, + Span inputs) { - ConstantOperation::determine_canvas(preferred_area, r_area); - r_area = preferred_area; -} - -const float *CalculateMeanOperation::get_constant_elem() -{ - /* Node de-duplication uses the constant value as part of a hash for constant operations. - * The constant is not known in advance here, but need to return something. The value does - * not really matter, because if two CalculateMean operations are connected to different - * inputs it will be handled via hash of the input subtree. */ - static float f = 0; - return &f; -} - -void CalculateMeanOperation::update_memory_buffer(MemoryBuffer *output, - const rcti &area, - Span inputs) -{ - if (!is_calculated_) { + if (!iscalculated_) { MemoryBuffer *input = inputs[0]; - constant_value_ = calculate_value(input); - is_calculated_ = true; + result_ = calc_mean(input); + iscalculated_ = true; } - - output->fill(area, &constant_value_); } -float CalculateMeanOperation::calculate_value(const MemoryBuffer *input) const +void CalculateMeanOperation::update_memory_buffer_partial(MemoryBuffer *output, + const rcti &area, + Span /*inputs*/) { - return calculate_mean(input); + output->fill(area, &result_); } -float CalculateMeanOperation::calculate_mean(const MemoryBuffer *input) const +float CalculateMeanOperation::calc_mean(const MemoryBuffer *input) { PixelsSum total = {0}; exec_system_->execute_work( @@ -114,7 +185,7 @@ float CalculateMeanOperation::calculate_mean(const MemoryBuffer *input) const } using PixelsSum = CalculateMeanOperation::PixelsSum; -PixelsSum CalculateMeanOperation::calc_area_sum(const MemoryBuffer *input, const rcti &area) const +PixelsSum CalculateMeanOperation::calc_area_sum(const MemoryBuffer *input, const rcti &area) { PixelsSum result = {0}; for (const float *elem : input->get_buffer_area(area)) { diff --git a/source/blender/compositor/operations/COM_CalculateMeanOperation.h b/source/blender/compositor/operations/COM_CalculateMeanOperation.h index b4a4ab729fb..ff176c2a129 100644 --- a/source/blender/compositor/operations/COM_CalculateMeanOperation.h +++ b/source/blender/compositor/operations/COM_CalculateMeanOperation.h @@ -4,7 +4,7 @@ #pragma once -#include "COM_ConstantOperation.h" +#include "COM_MultiThreadedOperation.h" #include "DNA_node_types.h" #include @@ -14,7 +14,7 @@ namespace blender::compositor { * \brief base class of CalculateMean, implementing the simple CalculateMean * \ingroup operation */ -class CalculateMeanOperation : public ConstantOperation { +class CalculateMeanOperation : public MultiThreadedOperation { public: struct PixelsSum { float sum; @@ -22,36 +22,57 @@ class CalculateMeanOperation : public ConstantOperation { }; protected: - bool is_calculated_; - float constant_value_; + /** + * \brief Cached reference to the reader + */ + SocketReader *image_reader_; + + bool iscalculated_; + float result_; int setting_; std::function setting_func_; public: CalculateMeanOperation(); + /** + * The inner loop of this operation. + */ + void execute_pixel(float output[4], int x, int y, void *data) override; + + /** + * Initialize the execution + */ void init_execution() override; + void *initialize_tile_data(rcti *rect) override; + + /** + * Deinitialize the execution + */ + void deinit_execution() override; + + bool determine_depending_area_of_interest(rcti *input, + ReadBufferOperation *read_operation, + rcti *output) override; void set_setting(int setting); void get_area_of_interest(int input_idx, const rcti &output_area, rcti &r_input_area) override; - void determine_canvas(const rcti &preferred_area, rcti &r_area) override; - const float *get_constant_elem() override; - void update_memory_buffer(MemoryBuffer *output, - const rcti &area, - Span inputs) override; + virtual void update_memory_buffer_started(MemoryBuffer *output, + const rcti &area, + Span inputs) override; + + virtual void update_memory_buffer_partial(MemoryBuffer *output, + const rcti &area, + Span inputs) override; protected: - /* Calculate value which will be written to the single-element output in the - * update_memory_buffer(). - * The caller takes care of checking the value is only calculated once. */ - virtual float calculate_value(const MemoryBuffer *input) const; - - float calculate_mean(const MemoryBuffer *input) const; + void calculate_mean(MemoryBuffer *tile); + float calc_mean(const MemoryBuffer *input); private: - PixelsSum calc_area_sum(const MemoryBuffer *input, const rcti &area) const; + PixelsSum calc_area_sum(const MemoryBuffer *input, const rcti &area); }; } // namespace blender::compositor diff --git a/source/blender/compositor/operations/COM_CalculateStandardDeviationOperation.cc b/source/blender/compositor/operations/COM_CalculateStandardDeviationOperation.cc index 31013cea35c..733064755d7 100644 --- a/source/blender/compositor/operations/COM_CalculateStandardDeviationOperation.cc +++ b/source/blender/compositor/operations/COM_CalculateStandardDeviationOperation.cc @@ -10,27 +10,111 @@ namespace blender::compositor { -float CalculateStandardDeviationOperation::calculate_value(const MemoryBuffer *input) const +void CalculateStandardDeviationOperation::execute_pixel(float output[4], + int /*x*/, + int /*y*/, + void * /*data*/) { - const float mean = this->calculate_mean(input); + output[0] = standard_deviation_; +} - PixelsSum total = {0}; - exec_system_->execute_work( - input->get_rect(), - [=](const rcti &split) { return this->calc_area_sum(input, split, mean); }, - total, - [](PixelsSum &join, const PixelsSum &chunk) { - join.sum += chunk.sum; - join.num_pixels += chunk.num_pixels; - }); +void *CalculateStandardDeviationOperation::initialize_tile_data(rcti *rect) +{ + lock_mutex(); + if (!iscalculated_) { + MemoryBuffer *tile = (MemoryBuffer *)image_reader_->initialize_tile_data(rect); + CalculateMeanOperation::calculate_mean(tile); + standard_deviation_ = 0.0f; + float *buffer = tile->get_buffer(); + int size = tile->get_width() * tile->get_height(); + int pixels = 0; + float sum = 0.0f; + float mean = result_; + for (int i = 0, offset = 0; i < size; i++, offset += 4) { + if (buffer[offset + 3] > 0) { + pixels++; - return total.num_pixels <= 1 ? 0.0f : sqrt(total.sum / float(total.num_pixels - 1)); + switch (setting_) { + case 1: /* rgb combined */ + { + float value = IMB_colormanagement_get_luminance(&buffer[offset]); + sum += (value - mean) * (value - mean); + break; + } + case 2: /* red */ + { + float value = buffer[offset]; + sum += (value - mean) * (value - mean); + break; + } + case 3: /* green */ + { + float value = buffer[offset + 1]; + sum += (value - mean) * (value - mean); + break; + } + case 4: /* blue */ + { + float value = buffer[offset + 2]; + sum += (value - mean) * (value - mean); + break; + } + case 5: /* luminance */ + { + float yuv[3]; + rgb_to_yuv(buffer[offset], + buffer[offset + 1], + buffer[offset + 2], + &yuv[0], + &yuv[1], + &yuv[2], + BLI_YUV_ITU_BT709); + sum += (yuv[0] - mean) * (yuv[0] - mean); + break; + } + } + } + } + standard_deviation_ = sqrt(sum / float(pixels - 1)); + iscalculated_ = true; + } + unlock_mutex(); + return nullptr; +} + +void CalculateStandardDeviationOperation::update_memory_buffer_started(MemoryBuffer * /*output*/, + const rcti & /*area*/, + Span inputs) +{ + if (!iscalculated_) { + const MemoryBuffer *input = inputs[0]; + const float mean = CalculateMeanOperation::calc_mean(input); + + PixelsSum total = {0}; + exec_system_->execute_work( + input->get_rect(), + [=](const rcti &split) { return calc_area_sum(input, split, mean); }, + total, + [](PixelsSum &join, const PixelsSum &chunk) { + join.sum += chunk.sum; + join.num_pixels += chunk.num_pixels; + }); + standard_deviation_ = total.num_pixels <= 1 ? 0.0f : + sqrt(total.sum / float(total.num_pixels - 1)); + iscalculated_ = true; + } +} + +void CalculateStandardDeviationOperation::update_memory_buffer_partial( + MemoryBuffer *output, const rcti &area, Span /*inputs*/) +{ + output->fill(area, &standard_deviation_); } using PixelsSum = CalculateMeanOperation::PixelsSum; PixelsSum CalculateStandardDeviationOperation::calc_area_sum(const MemoryBuffer *input, const rcti &area, - const float mean) const + const float mean) { PixelsSum result = {0}; for (const float *elem : input->get_buffer_area(area)) { diff --git a/source/blender/compositor/operations/COM_CalculateStandardDeviationOperation.h b/source/blender/compositor/operations/COM_CalculateStandardDeviationOperation.h index 88a951cc535..bfc71cbbf19 100644 --- a/source/blender/compositor/operations/COM_CalculateStandardDeviationOperation.h +++ b/source/blender/compositor/operations/COM_CalculateStandardDeviationOperation.h @@ -19,10 +19,24 @@ class CalculateStandardDeviationOperation : public CalculateMeanOperation { protected: float standard_deviation_; - float calculate_value(const MemoryBuffer *input) const override; + public: + /** + * The inner loop of this operation. + */ + void execute_pixel(float output[4], int x, int y, void *data) override; + + void *initialize_tile_data(rcti *rect) override; + + void update_memory_buffer_started(MemoryBuffer *output, + const rcti &area, + Span inputs) override; + + void update_memory_buffer_partial(MemoryBuffer *output, + const rcti &area, + Span inputs) override; private: - PixelsSum calc_area_sum(const MemoryBuffer *input, const rcti &area, float mean) const; + PixelsSum calc_area_sum(const MemoryBuffer *input, const rcti &area, float mean); }; } // namespace blender::compositor diff --git a/source/blender/compositor/operations/COM_ChangeHSVOperation.cc b/source/blender/compositor/operations/COM_ChangeHSVOperation.cc index 16d51cced48..0a6451efda6 100644 --- a/source/blender/compositor/operations/COM_ChangeHSVOperation.cc +++ b/source/blender/compositor/operations/COM_ChangeHSVOperation.cc @@ -13,9 +13,51 @@ ChangeHSVOperation::ChangeHSVOperation() this->add_input_socket(DataType::Value); this->add_input_socket(DataType::Value); this->add_output_socket(DataType::Color); + input_operation_ = nullptr; flags_.can_be_constant = true; } +void ChangeHSVOperation::init_execution() +{ + input_operation_ = get_input_socket_reader(0); + hue_operation_ = get_input_socket_reader(1); + saturation_operation_ = get_input_socket_reader(2); + value_operation_ = get_input_socket_reader(3); +} + +void ChangeHSVOperation::deinit_execution() +{ + input_operation_ = nullptr; + hue_operation_ = nullptr; + saturation_operation_ = nullptr; + value_operation_ = nullptr; +} + +void ChangeHSVOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float input_color1[4]; + float hue[4], saturation[4], value[4]; + + input_operation_->read_sampled(input_color1, x, y, sampler); + hue_operation_->read_sampled(hue, x, y, sampler); + saturation_operation_->read_sampled(saturation, x, y, sampler); + value_operation_->read_sampled(value, x, y, sampler); + + output[0] = input_color1[0] + (hue[0] - 0.5f); + if (output[0] > 1.0f) { + output[0] -= 1.0f; + } + else if (output[0] < 0.0f) { + output[0] += 1.0f; + } + output[1] = input_color1[1] * saturation[0]; + output[2] = input_color1[2] * value[0]; + output[3] = input_color1[3]; +} + void ChangeHSVOperation::update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span inputs) diff --git a/source/blender/compositor/operations/COM_ChangeHSVOperation.h b/source/blender/compositor/operations/COM_ChangeHSVOperation.h index b2b81586fa3..4e903c79325 100644 --- a/source/blender/compositor/operations/COM_ChangeHSVOperation.h +++ b/source/blender/compositor/operations/COM_ChangeHSVOperation.h @@ -13,9 +13,26 @@ namespace blender::compositor { * it assumes we are in sRGB color space. */ class ChangeHSVOperation : public MultiThreadedOperation { + private: + SocketReader *input_operation_; + SocketReader *hue_operation_; + SocketReader *saturation_operation_; + SocketReader *value_operation_; + public: + /** + * Default constructor + */ ChangeHSVOperation(); + void init_execution() override; + void deinit_execution() override; + + /** + * The inner loop of this operation. + */ + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + void update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span inputs) override; diff --git a/source/blender/compositor/operations/COM_ChannelMatteOperation.cc b/source/blender/compositor/operations/COM_ChannelMatteOperation.cc index 4d17442fcc5..eb256c4d4ea 100644 --- a/source/blender/compositor/operations/COM_ChannelMatteOperation.cc +++ b/source/blender/compositor/operations/COM_ChannelMatteOperation.cc @@ -11,11 +11,14 @@ ChannelMatteOperation::ChannelMatteOperation() add_input_socket(DataType::Color); add_output_socket(DataType::Value); + input_image_program_ = nullptr; flags_.can_be_constant = true; } void ChannelMatteOperation::init_execution() { + input_image_program_ = this->get_input_socket_reader(0); + limit_range_ = limit_max_ - limit_min_; switch (limit_method_) { @@ -60,6 +63,50 @@ void ChannelMatteOperation::init_execution() } } +void ChannelMatteOperation::deinit_execution() +{ + input_image_program_ = nullptr; +} + +void ChannelMatteOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float in_color[4]; + float alpha; + + const float limit_max = limit_max_; + const float limit_min = limit_min_; + const float limit_range = limit_range_; + + input_image_program_->read_sampled(in_color, x, y, sampler); + + /* matte operation */ + alpha = in_color[ids_[0]] - std::max(in_color[ids_[1]], in_color[ids_[2]]); + + /* flip because 0.0 is transparent, not 1.0 */ + alpha = 1.0f - alpha; + + /* test range */ + if (alpha > limit_max) { + alpha = in_color[3]; /* Whatever it was prior. */ + } + else if (alpha < limit_min) { + alpha = 0.0f; + } + else { /* Blend. */ + alpha = (alpha - limit_min) / limit_range; + } + + /* Store matte(alpha) value in [0] to go with + * COM_SetAlphaMultiplyOperation and the Value output. + */ + + /* Don't make something that was more transparent less transparent. */ + output[0] = std::min(alpha, in_color[3]); +} + void ChannelMatteOperation::update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span inputs) diff --git a/source/blender/compositor/operations/COM_ChannelMatteOperation.h b/source/blender/compositor/operations/COM_ChannelMatteOperation.h index 5c7d05b6a53..1274004f3e8 100644 --- a/source/blender/compositor/operations/COM_ChannelMatteOperation.h +++ b/source/blender/compositor/operations/COM_ChannelMatteOperation.h @@ -14,6 +14,8 @@ namespace blender::compositor { */ class ChannelMatteOperation : public MultiThreadedOperation { private: + SocketReader *input_image_program_; + // int color_space_; /* node->custom1 */ /* UNUSED */ /* TODO? */ int matte_channel_; /* node->custom2 */ int limit_method_; /* node->algorithm */ @@ -35,9 +37,18 @@ class ChannelMatteOperation : public MultiThreadedOperation { int ids_[3]; public: + /** + * Default constructor + */ ChannelMatteOperation(); + /** + * The inner loop of this operation. + */ + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + void init_execution() override; + void deinit_execution() override; void set_settings(NodeChroma *node_chroma, const int custom2) { diff --git a/source/blender/compositor/operations/COM_ChromaMatteOperation.cc b/source/blender/compositor/operations/COM_ChromaMatteOperation.cc index 81ce18ac4f3..71df80a88be 100644 --- a/source/blender/compositor/operations/COM_ChromaMatteOperation.cc +++ b/source/blender/compositor/operations/COM_ChromaMatteOperation.cc @@ -12,9 +12,90 @@ ChromaMatteOperation::ChromaMatteOperation() add_input_socket(DataType::Color); add_output_socket(DataType::Value); + input_image_program_ = nullptr; + input_key_program_ = nullptr; flags_.can_be_constant = true; } +void ChromaMatteOperation::init_execution() +{ + input_image_program_ = this->get_input_socket_reader(0); + input_key_program_ = this->get_input_socket_reader(1); +} + +void ChromaMatteOperation::deinit_execution() +{ + input_image_program_ = nullptr; + input_key_program_ = nullptr; +} + +void ChromaMatteOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float in_key[4]; + float in_image[4]; + + const float acceptance = settings_->t1; /* in radians */ + const float cutoff = settings_->t2; /* in radians */ + const float gain = settings_->fstrength; + + float x_angle, z_angle, alpha; + float theta, beta; + float kfg; + + input_key_program_->read_sampled(in_key, x, y, sampler); + input_image_program_->read_sampled(in_image, x, y, sampler); + + /* Store matte(alpha) value in [0] to go with + * #COM_SetAlphaMultiplyOperation and the Value output. */ + + /* Algorithm from book "Video Demystified", does not include the spill reduction part. */ + /* Find theta, the angle that the color space should be rotated based on key. */ + + /* rescale to -1.0..1.0 */ + // in_image[0] = (in_image[0] * 2.0f) - 1.0f; // UNUSED + in_image[1] = (in_image[1] * 2.0f) - 1.0f; + in_image[2] = (in_image[2] * 2.0f) - 1.0f; + + // in_key[0] = (in_key[0] * 2.0f) - 1.0f; // UNUSED + in_key[1] = (in_key[1] * 2.0f) - 1.0f; + in_key[2] = (in_key[2] * 2.0f) - 1.0f; + + theta = atan2(in_key[2], in_key[1]); + + /* Rotate the cb and cr into x/z space. */ + x_angle = in_image[1] * cosf(theta) + in_image[2] * sinf(theta); + z_angle = in_image[2] * cosf(theta) - in_image[1] * sinf(theta); + + /* If within the acceptance angle. */ + /* If kfg is <0 then the pixel is outside of the key color. */ + kfg = x_angle - (fabsf(z_angle) / tanf(acceptance / 2.0f)); + + if (kfg > 0.0f) { /* found a pixel that is within key color */ + alpha = 1.0f - (kfg / gain); + + beta = atan2(z_angle, x_angle); + + /* if beta is within the cutoff angle */ + if (fabsf(beta) < (cutoff / 2.0f)) { + alpha = 0.0f; + } + + /* don't make something that was more transparent less transparent */ + if (alpha < in_image[3]) { + output[0] = alpha; + } + else { + output[0] = in_image[3]; + } + } + else { /* Pixel is outside key color. */ + output[0] = in_image[3]; /* Make pixel just as transparent as it was before. */ + } +} + void ChromaMatteOperation::update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span inputs) diff --git a/source/blender/compositor/operations/COM_ChromaMatteOperation.h b/source/blender/compositor/operations/COM_ChromaMatteOperation.h index 72ceb3d9160..47762ac3e65 100644 --- a/source/blender/compositor/operations/COM_ChromaMatteOperation.h +++ b/source/blender/compositor/operations/COM_ChromaMatteOperation.h @@ -15,10 +15,23 @@ namespace blender::compositor { class ChromaMatteOperation : public MultiThreadedOperation { private: NodeChroma *settings_; + SocketReader *input_image_program_; + SocketReader *input_key_program_; public: + /** + * Default constructor + */ ChromaMatteOperation(); + /** + * The inner loop of this operation. + */ + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + + void init_execution() override; + void deinit_execution() override; + void set_settings(NodeChroma *node_chroma) { settings_ = node_chroma; diff --git a/source/blender/compositor/operations/COM_ColorBalanceASCCDLOperation.cc b/source/blender/compositor/operations/COM_ColorBalanceASCCDLOperation.cc index c3911ef10be..8968b009ce0 100644 --- a/source/blender/compositor/operations/COM_ColorBalanceASCCDLOperation.cc +++ b/source/blender/compositor/operations/COM_ColorBalanceASCCDLOperation.cc @@ -23,10 +23,42 @@ ColorBalanceASCCDLOperation::ColorBalanceASCCDLOperation() this->add_input_socket(DataType::Value); this->add_input_socket(DataType::Color); this->add_output_socket(DataType::Color); + input_value_operation_ = nullptr; + input_color_operation_ = nullptr; this->set_canvas_input_index(1); flags_.can_be_constant = true; } +void ColorBalanceASCCDLOperation::init_execution() +{ + input_value_operation_ = this->get_input_socket_reader(0); + input_color_operation_ = this->get_input_socket_reader(1); +} + +void ColorBalanceASCCDLOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float input_color[4]; + float value[4]; + + input_value_operation_->read_sampled(value, x, y, sampler); + input_color_operation_->read_sampled(input_color, x, y, sampler); + + float fac = value[0]; + fac = std::min(1.0f, fac); + const float mfac = 1.0f - fac; + + output[0] = mfac * input_color[0] + + fac * colorbalance_cdl(input_color[0], offset_[0], power_[0], slope_[0]); + output[1] = mfac * input_color[1] + + fac * colorbalance_cdl(input_color[1], offset_[1], power_[1], slope_[1]); + output[2] = mfac * input_color[2] + + fac * colorbalance_cdl(input_color[2], offset_[2], power_[2], slope_[2]); + output[3] = input_color[3]; +} + void ColorBalanceASCCDLOperation::update_memory_buffer_row(PixelCursor &p) { for (; p.out < p.row_end; p.next()) { @@ -44,4 +76,10 @@ void ColorBalanceASCCDLOperation::update_memory_buffer_row(PixelCursor &p) } } +void ColorBalanceASCCDLOperation::deinit_execution() +{ + input_value_operation_ = nullptr; + input_color_operation_ = nullptr; +} + } // namespace blender::compositor diff --git a/source/blender/compositor/operations/COM_ColorBalanceASCCDLOperation.h b/source/blender/compositor/operations/COM_ColorBalanceASCCDLOperation.h index 75772678802..88be57ff91d 100644 --- a/source/blender/compositor/operations/COM_ColorBalanceASCCDLOperation.h +++ b/source/blender/compositor/operations/COM_ColorBalanceASCCDLOperation.h @@ -14,13 +14,37 @@ namespace blender::compositor { */ class ColorBalanceASCCDLOperation : public MultiThreadedRowOperation { protected: + /** + * Prefetched reference to the input_program + */ + SocketReader *input_value_operation_; + SocketReader *input_color_operation_; + float offset_[3]; float power_[3]; float slope_[3]; public: + /** + * Default constructor + */ ColorBalanceASCCDLOperation(); + /** + * The inner loop of this operation. + */ + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + + /** + * Initialize the execution + */ + void init_execution() override; + + /** + * Deinitialize the execution + */ + void deinit_execution() override; + void set_offset(float offset[3]) { copy_v3_v3(offset_, offset); diff --git a/source/blender/compositor/operations/COM_ColorBalanceLGGOperation.cc b/source/blender/compositor/operations/COM_ColorBalanceLGGOperation.cc index 0ebad370beb..9b0e4466bba 100644 --- a/source/blender/compositor/operations/COM_ColorBalanceLGGOperation.cc +++ b/source/blender/compositor/operations/COM_ColorBalanceLGGOperation.cc @@ -30,10 +30,42 @@ ColorBalanceLGGOperation::ColorBalanceLGGOperation() this->add_input_socket(DataType::Value); this->add_input_socket(DataType::Color); this->add_output_socket(DataType::Color); + input_value_operation_ = nullptr; + input_color_operation_ = nullptr; this->set_canvas_input_index(1); flags_.can_be_constant = true; } +void ColorBalanceLGGOperation::init_execution() +{ + input_value_operation_ = this->get_input_socket_reader(0); + input_color_operation_ = this->get_input_socket_reader(1); +} + +void ColorBalanceLGGOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float input_color[4]; + float value[4]; + + input_value_operation_->read_sampled(value, x, y, sampler); + input_color_operation_->read_sampled(input_color, x, y, sampler); + + float fac = value[0]; + fac = std::min(1.0f, fac); + const float mfac = 1.0f - fac; + + output[0] = mfac * input_color[0] + + fac * colorbalance_lgg(input_color[0], lift_[0], gamma_inv_[0], gain_[0]); + output[1] = mfac * input_color[1] + + fac * colorbalance_lgg(input_color[1], lift_[1], gamma_inv_[1], gain_[1]); + output[2] = mfac * input_color[2] + + fac * colorbalance_lgg(input_color[2], lift_[2], gamma_inv_[2], gain_[2]); + output[3] = input_color[3]; +} + void ColorBalanceLGGOperation::update_memory_buffer_row(PixelCursor &p) { for (; p.out < p.row_end; p.next()) { @@ -51,4 +83,10 @@ void ColorBalanceLGGOperation::update_memory_buffer_row(PixelCursor &p) } } +void ColorBalanceLGGOperation::deinit_execution() +{ + input_value_operation_ = nullptr; + input_color_operation_ = nullptr; +} + } // namespace blender::compositor diff --git a/source/blender/compositor/operations/COM_ColorBalanceLGGOperation.h b/source/blender/compositor/operations/COM_ColorBalanceLGGOperation.h index 9d25bb1d1dc..deb829c8a73 100644 --- a/source/blender/compositor/operations/COM_ColorBalanceLGGOperation.h +++ b/source/blender/compositor/operations/COM_ColorBalanceLGGOperation.h @@ -14,13 +14,37 @@ namespace blender::compositor { */ class ColorBalanceLGGOperation : public MultiThreadedRowOperation { protected: + /** + * Prefetched reference to the input_program + */ + SocketReader *input_value_operation_; + SocketReader *input_color_operation_; + float gain_[3]; float lift_[3]; float gamma_inv_[3]; public: + /** + * Default constructor + */ ColorBalanceLGGOperation(); + /** + * The inner loop of this operation. + */ + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + + /** + * Initialize the execution + */ + void init_execution() override; + + /** + * Deinitialize the execution + */ + void deinit_execution() override; + void set_gain(const float gain[3]) { copy_v3_v3(gain_, gain); diff --git a/source/blender/compositor/operations/COM_ColorCorrectionOperation.cc b/source/blender/compositor/operations/COM_ColorCorrectionOperation.cc index 157ed2b94b2..08b350c9d6c 100644 --- a/source/blender/compositor/operations/COM_ColorCorrectionOperation.cc +++ b/source/blender/compositor/operations/COM_ColorCorrectionOperation.cc @@ -13,11 +13,18 @@ ColorCorrectionOperation::ColorCorrectionOperation() this->add_input_socket(DataType::Color); this->add_input_socket(DataType::Value); this->add_output_socket(DataType::Color); + input_image_ = nullptr; + input_mask_ = nullptr; red_channel_enabled_ = true; green_channel_enabled_ = true; blue_channel_enabled_ = true; flags_.can_be_constant = true; } +void ColorCorrectionOperation::init_execution() +{ + input_image_ = this->get_input_socket_reader(0); + input_mask_ = this->get_input_socket_reader(1); +} /* Calculate x^y if the function is defined. Otherwise return the given fallback value. */ BLI_INLINE float color_correct_powf_safe(const float x, const float y, const float fallback_value) @@ -28,6 +35,111 @@ BLI_INLINE float color_correct_powf_safe(const float x, const float y, const flo return powf(x, y); } +void ColorCorrectionOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float input_image_color[4]; + float input_mask[4]; + input_image_->read_sampled(input_image_color, x, y, sampler); + input_mask_->read_sampled(input_mask, x, y, sampler); + + float level = (input_image_color[0] + input_image_color[1] + input_image_color[2]) / 3.0f; + float contrast = data_->master.contrast; + float saturation = data_->master.saturation; + float gamma = data_->master.gamma; + float gain = data_->master.gain; + float lift = data_->master.lift; + float r, g, b; + + float value = input_mask[0]; + value = std::min(1.0f, value); + const float mvalue = 1.0f - value; + + float level_shadows = 0.0; + float level_midtones = 0.0; + float level_highlights = 0.0; +#define MARGIN 0.10f +#define MARGIN_DIV (0.5f / MARGIN) + if (level < data_->startmidtones - MARGIN) { + level_shadows = 1.0f; + } + else if (level < data_->startmidtones + MARGIN) { + level_midtones = ((level - data_->startmidtones) * MARGIN_DIV) + 0.5f; + level_shadows = 1.0f - level_midtones; + } + else if (level < data_->endmidtones - MARGIN) { + level_midtones = 1.0f; + } + else if (level < data_->endmidtones + MARGIN) { + level_highlights = ((level - data_->endmidtones) * MARGIN_DIV) + 0.5f; + level_midtones = 1.0f - level_highlights; + } + else { + level_highlights = 1.0f; + } +#undef MARGIN +#undef MARGIN_DIV + contrast *= (level_shadows * data_->shadows.contrast) + + (level_midtones * data_->midtones.contrast) + + (level_highlights * data_->highlights.contrast); + saturation *= (level_shadows * data_->shadows.saturation) + + (level_midtones * data_->midtones.saturation) + + (level_highlights * data_->highlights.saturation); + gamma *= (level_shadows * data_->shadows.gamma) + (level_midtones * data_->midtones.gamma) + + (level_highlights * data_->highlights.gamma); + gain *= (level_shadows * data_->shadows.gain) + (level_midtones * data_->midtones.gain) + + (level_highlights * data_->highlights.gain); + lift += (level_shadows * data_->shadows.lift) + (level_midtones * data_->midtones.lift) + + (level_highlights * data_->highlights.lift); + + float invgamma = 1.0f / gamma; + float luma = IMB_colormanagement_get_luminance(input_image_color); + + r = input_image_color[0]; + g = input_image_color[1]; + b = input_image_color[2]; + + r = (luma + saturation * (r - luma)); + g = (luma + saturation * (g - luma)); + b = (luma + saturation * (b - luma)); + + r = 0.5f + ((r - 0.5f) * contrast); + g = 0.5f + ((g - 0.5f) * contrast); + b = 0.5f + ((b - 0.5f) * contrast); + + /* Check for negative values to avoid nan. */ + r = color_correct_powf_safe(r * gain + lift, invgamma, r); + g = color_correct_powf_safe(g * gain + lift, invgamma, g); + b = color_correct_powf_safe(b * gain + lift, invgamma, b); + + /* Mix with mask. */ + r = mvalue * input_image_color[0] + value * r; + g = mvalue * input_image_color[1] + value * g; + b = mvalue * input_image_color[2] + value * b; + + if (red_channel_enabled_) { + output[0] = r; + } + else { + output[0] = input_image_color[0]; + } + if (green_channel_enabled_) { + output[1] = g; + } + else { + output[1] = input_image_color[1]; + } + if (blue_channel_enabled_) { + output[2] = b; + } + else { + output[2] = input_image_color[2]; + } + output[3] = input_image_color[3]; +} + void ColorCorrectionOperation::update_memory_buffer_row(PixelCursor &p) { for (; p.out < p.row_end; p.next()) { @@ -105,4 +217,10 @@ void ColorCorrectionOperation::update_memory_buffer_row(PixelCursor &p) } } +void ColorCorrectionOperation::deinit_execution() +{ + input_image_ = nullptr; + input_mask_ = nullptr; +} + } // namespace blender::compositor diff --git a/source/blender/compositor/operations/COM_ColorCorrectionOperation.h b/source/blender/compositor/operations/COM_ColorCorrectionOperation.h index a386f956e19..f90875a43f5 100644 --- a/source/blender/compositor/operations/COM_ColorCorrectionOperation.h +++ b/source/blender/compositor/operations/COM_ColorCorrectionOperation.h @@ -10,6 +10,11 @@ namespace blender::compositor { class ColorCorrectionOperation : public MultiThreadedRowOperation { private: + /** + * Cached reference to the input_program + */ + SocketReader *input_image_; + SocketReader *input_mask_; NodeColorCorrection *data_; bool red_channel_enabled_; @@ -19,6 +24,21 @@ class ColorCorrectionOperation : public MultiThreadedRowOperation { public: ColorCorrectionOperation(); + /** + * The inner loop of this operation. + */ + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + + /** + * Initialize the execution + */ + void init_execution() override; + + /** + * Deinitialize the execution + */ + void deinit_execution() override; + void set_data(NodeColorCorrection *data) { data_ = data; diff --git a/source/blender/compositor/operations/COM_ColorCurveOperation.cc b/source/blender/compositor/operations/COM_ColorCurveOperation.cc index 420cd8b5346..2d573e50a34 100644 --- a/source/blender/compositor/operations/COM_ColorCurveOperation.cc +++ b/source/blender/compositor/operations/COM_ColorCurveOperation.cc @@ -16,15 +16,72 @@ ColorCurveOperation::ColorCurveOperation() this->add_input_socket(DataType::Color); this->add_output_socket(DataType::Color); + input_fac_program_ = nullptr; + input_image_program_ = nullptr; + input_black_program_ = nullptr; + input_white_program_ = nullptr; + this->set_canvas_input_index(1); } void ColorCurveOperation::init_execution() { CurveBaseOperation::init_execution(); + input_fac_program_ = this->get_input_socket_reader(0); + input_image_program_ = this->get_input_socket_reader(1); + input_black_program_ = this->get_input_socket_reader(2); + input_white_program_ = this->get_input_socket_reader(3); BKE_curvemapping_premultiply(curve_mapping_, false); } +void ColorCurveOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + CurveMapping *cumap = curve_mapping_; + + float fac[4]; + float image[4]; + + /* local versions of cumap->black, cumap->white, cumap->bwmul */ + float black[4]; + float white[4]; + float bwmul[3]; + + input_black_program_->read_sampled(black, x, y, sampler); + input_white_program_->read_sampled(white, x, y, sampler); + + /* get our own local bwmul value, + * since we can't be threadsafe and use cumap->bwmul & friends */ + BKE_curvemapping_set_black_white_ex(black, white, bwmul); + + input_fac_program_->read_sampled(fac, x, y, sampler); + input_image_program_->read_sampled(image, x, y, sampler); + + if (*fac >= 1.0f) { + BKE_curvemapping_evaluate_premulRGBF_ex(cumap, output, image, black, bwmul); + } + else if (*fac <= 0.0f) { + copy_v3_v3(output, image); + } + else { + float col[4]; + BKE_curvemapping_evaluate_premulRGBF_ex(cumap, col, image, black, bwmul); + interp_v3_v3v3(output, image, col, *fac); + } + output[3] = image[3]; +} + +void ColorCurveOperation::deinit_execution() +{ + CurveBaseOperation::deinit_execution(); + input_fac_program_ = nullptr; + input_image_program_ = nullptr; + input_black_program_ = nullptr; + input_white_program_ = nullptr; +} + void ColorCurveOperation::update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span inputs) @@ -63,17 +120,54 @@ ConstantLevelColorCurveOperation::ConstantLevelColorCurveOperation() this->add_input_socket(DataType::Color); this->add_output_socket(DataType::Color); + input_fac_program_ = nullptr; + input_image_program_ = nullptr; + this->set_canvas_input_index(1); } void ConstantLevelColorCurveOperation::init_execution() { CurveBaseOperation::init_execution(); + input_fac_program_ = this->get_input_socket_reader(0); + input_image_program_ = this->get_input_socket_reader(1); BKE_curvemapping_premultiply(curve_mapping_, false); BKE_curvemapping_set_black_white(curve_mapping_, black_, white_); } +void ConstantLevelColorCurveOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float fac[4]; + float image[4]; + + input_fac_program_->read_sampled(fac, x, y, sampler); + input_image_program_->read_sampled(image, x, y, sampler); + + if (*fac >= 1.0f) { + BKE_curvemapping_evaluate_premulRGBF(curve_mapping_, output, image); + } + else if (*fac <= 0.0f) { + copy_v3_v3(output, image); + } + else { + float col[4]; + BKE_curvemapping_evaluate_premulRGBF(curve_mapping_, col, image); + interp_v3_v3v3(output, image, col, *fac); + } + output[3] = image[3]; +} + +void ConstantLevelColorCurveOperation::deinit_execution() +{ + CurveBaseOperation::deinit_execution(); + input_fac_program_ = nullptr; + input_image_program_ = nullptr; +} + void ConstantLevelColorCurveOperation::update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span inputs) diff --git a/source/blender/compositor/operations/COM_ColorCurveOperation.h b/source/blender/compositor/operations/COM_ColorCurveOperation.h index 072075c6396..7d69f9d0149 100644 --- a/source/blender/compositor/operations/COM_ColorCurveOperation.h +++ b/source/blender/compositor/operations/COM_ColorCurveOperation.h @@ -9,11 +9,33 @@ namespace blender::compositor { class ColorCurveOperation : public CurveBaseOperation { + private: + /** + * Cached reference to the input_program + */ + SocketReader *input_fac_program_; + SocketReader *input_image_program_; + SocketReader *input_black_program_; + SocketReader *input_white_program_; + public: ColorCurveOperation(); + /** + * The inner loop of this operation. + */ + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + + /** + * Initialize the execution + */ void init_execution() override; + /** + * Deinitialize the execution + */ + void deinit_execution() override; + void update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span inputs) override; @@ -21,14 +43,32 @@ class ColorCurveOperation : public CurveBaseOperation { class ConstantLevelColorCurveOperation : public CurveBaseOperation { private: + /** + * Cached reference to the input_program + */ + SocketReader *input_fac_program_; + SocketReader *input_image_program_; float black_[3]; float white_[3]; public: ConstantLevelColorCurveOperation(); + /** + * The inner loop of this operation. + */ + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + + /** + * Initialize the execution + */ void init_execution() override; + /** + * Deinitialize the execution + */ + void deinit_execution() override; + void set_black_level(float black[3]) { copy_v3_v3(black_, black); diff --git a/source/blender/compositor/operations/COM_ColorExposureOperation.cc b/source/blender/compositor/operations/COM_ColorExposureOperation.cc index 4346a89be09..69ac6028fb3 100644 --- a/source/blender/compositor/operations/COM_ColorExposureOperation.cc +++ b/source/blender/compositor/operations/COM_ColorExposureOperation.cc @@ -11,9 +11,34 @@ ExposureOperation::ExposureOperation() this->add_input_socket(DataType::Color); this->add_input_socket(DataType::Value); this->add_output_socket(DataType::Color); + input_program_ = nullptr; flags_.can_be_constant = true; } +void ExposureOperation::init_execution() +{ + input_program_ = this->get_input_socket_reader(0); + input_exposure_program_ = this->get_input_socket_reader(1); +} + +void ExposureOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float input_value[4]; + float input_exposure[4]; + input_program_->read_sampled(input_value, x, y, sampler); + input_exposure_program_->read_sampled(input_exposure, x, y, sampler); + const float exposure = pow(2, input_exposure[0]); + + output[0] = input_value[0] * exposure; + output[1] = input_value[1] * exposure; + output[2] = input_value[2] * exposure; + + output[3] = input_value[3]; +} + void ExposureOperation::update_memory_buffer_row(PixelCursor &p) { for (; p.out < p.row_end; p.next()) { @@ -27,4 +52,10 @@ void ExposureOperation::update_memory_buffer_row(PixelCursor &p) } } +void ExposureOperation::deinit_execution() +{ + input_program_ = nullptr; + input_exposure_program_ = nullptr; +} + } // namespace blender::compositor diff --git a/source/blender/compositor/operations/COM_ColorExposureOperation.h b/source/blender/compositor/operations/COM_ColorExposureOperation.h index 8f75a238b8c..93695b30016 100644 --- a/source/blender/compositor/operations/COM_ColorExposureOperation.h +++ b/source/blender/compositor/operations/COM_ColorExposureOperation.h @@ -9,9 +9,31 @@ namespace blender::compositor { class ExposureOperation : public MultiThreadedRowOperation { + private: + /** + * Cached reference to the input_program + */ + SocketReader *input_program_; + SocketReader *input_exposure_program_; + public: ExposureOperation(); + /** + * The inner loop of this operation. + */ + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + + /** + * Initialize the execution + */ + void init_execution() override; + + /** + * Deinitialize the execution + */ + void deinit_execution() override; + void update_memory_buffer_row(PixelCursor &p) override; }; diff --git a/source/blender/compositor/operations/COM_ColorMatteOperation.cc b/source/blender/compositor/operations/COM_ColorMatteOperation.cc index 7afa92c7c36..f959f06b170 100644 --- a/source/blender/compositor/operations/COM_ColorMatteOperation.cc +++ b/source/blender/compositor/operations/COM_ColorMatteOperation.cc @@ -12,9 +12,64 @@ ColorMatteOperation::ColorMatteOperation() add_input_socket(DataType::Color); add_output_socket(DataType::Value); + input_image_program_ = nullptr; + input_key_program_ = nullptr; flags_.can_be_constant = true; } +void ColorMatteOperation::init_execution() +{ + input_image_program_ = this->get_input_socket_reader(0); + input_key_program_ = this->get_input_socket_reader(1); +} + +void ColorMatteOperation::deinit_execution() +{ + input_image_program_ = nullptr; + input_key_program_ = nullptr; +} + +void ColorMatteOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float in_color[4]; + float in_key[4]; + + const float hue = settings_->t1; + const float sat = settings_->t2; + const float val = settings_->t3; + + float h_wrap; + + input_image_program_->read_sampled(in_color, x, y, sampler); + input_key_program_->read_sampled(in_key, x, y, sampler); + + /* Store matte(alpha) value in [0] to go with + * COM_SetAlphaMultiplyOperation and the Value output. + */ + + if ( + /* Do hue last because it needs to wrap, and does some more checks. */ + + /* sat */ (fabsf(in_color[1] - in_key[1]) < sat) && + /* val */ (fabsf(in_color[2] - in_key[2]) < val) && + + /* multiply by 2 because it wraps on both sides of the hue, + * otherwise 0.5 would key all hue's */ + + /* hue */ + ((h_wrap = 2.0f * fabsf(in_color[0] - in_key[0])) < hue || (2.0f - h_wrap) < hue)) + { + output[0] = 0.0f; /* make transparent */ + } + + else { /* Pixel is outside key color. */ + output[0] = in_color[3]; /* Make pixel just as transparent as it was before. */ + } +} + void ColorMatteOperation::update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span inputs) diff --git a/source/blender/compositor/operations/COM_ColorMatteOperation.h b/source/blender/compositor/operations/COM_ColorMatteOperation.h index 2c02eda0bca..1edec85076e 100644 --- a/source/blender/compositor/operations/COM_ColorMatteOperation.h +++ b/source/blender/compositor/operations/COM_ColorMatteOperation.h @@ -15,10 +15,23 @@ namespace blender::compositor { class ColorMatteOperation : public MultiThreadedOperation { private: NodeChroma *settings_; + SocketReader *input_image_program_; + SocketReader *input_key_program_; public: + /** + * Default constructor + */ ColorMatteOperation(); + /** + * The inner loop of this operation. + */ + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + + void init_execution() override; + void deinit_execution() override; + void set_settings(NodeChroma *node_chroma) { settings_ = node_chroma; diff --git a/source/blender/compositor/operations/COM_ColorRampOperation.cc b/source/blender/compositor/operations/COM_ColorRampOperation.cc index bc7342e249f..2d966570c76 100644 --- a/source/blender/compositor/operations/COM_ColorRampOperation.cc +++ b/source/blender/compositor/operations/COM_ColorRampOperation.cc @@ -13,9 +13,30 @@ ColorRampOperation::ColorRampOperation() this->add_input_socket(DataType::Value); this->add_output_socket(DataType::Color); + input_program_ = nullptr; color_band_ = nullptr; flags_.can_be_constant = true; } +void ColorRampOperation::init_execution() +{ + input_program_ = this->get_input_socket_reader(0); +} + +void ColorRampOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float values[4]; + + input_program_->read_sampled(values, x, y, sampler); + BKE_colorband_evaluate(color_band_, values[0], output); +} + +void ColorRampOperation::deinit_execution() +{ + input_program_ = nullptr; +} void ColorRampOperation::update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, diff --git a/source/blender/compositor/operations/COM_ColorRampOperation.h b/source/blender/compositor/operations/COM_ColorRampOperation.h index 8d16d5419d7..304b720a545 100644 --- a/source/blender/compositor/operations/COM_ColorRampOperation.h +++ b/source/blender/compositor/operations/COM_ColorRampOperation.h @@ -11,11 +11,30 @@ namespace blender::compositor { class ColorRampOperation : public MultiThreadedOperation { private: + /** + * Cached reference to the input_program + */ + SocketReader *input_program_; ColorBand *color_band_; public: ColorRampOperation(); + /** + * The inner loop of this operation. + */ + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + + /** + * Initialize the execution + */ + void init_execution() override; + + /** + * Deinitialize the execution + */ + void deinit_execution() override; + void set_color_band(ColorBand *color_band) { color_band_ = color_band; diff --git a/source/blender/compositor/operations/COM_ColorSpillOperation.cc b/source/blender/compositor/operations/COM_ColorSpillOperation.cc index a206ed2f637..d6b7fcba26e 100644 --- a/source/blender/compositor/operations/COM_ColorSpillOperation.cc +++ b/source/blender/compositor/operations/COM_ColorSpillOperation.cc @@ -13,6 +13,8 @@ ColorSpillOperation::ColorSpillOperation() add_input_socket(DataType::Value); add_output_socket(DataType::Color); + input_image_reader_ = nullptr; + input_fac_reader_ = nullptr; spill_channel_ = 1; /* GREEN */ spill_method_ = 0; flags_.can_be_constant = true; @@ -20,6 +22,8 @@ ColorSpillOperation::ColorSpillOperation() void ColorSpillOperation::init_execution() { + input_image_reader_ = this->get_input_socket_reader(0); + input_fac_reader_ = this->get_input_socket_reader(1); if (spill_channel_ == 0) { rmut_ = -1.0f; gmut_ = 1.0f; @@ -59,6 +63,45 @@ void ColorSpillOperation::init_execution() } } +void ColorSpillOperation::deinit_execution() +{ + input_image_reader_ = nullptr; + input_fac_reader_ = nullptr; +} + +void ColorSpillOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float fac[4]; + float input[4]; + input_fac_reader_->read_sampled(fac, x, y, sampler); + input_image_reader_->read_sampled(input, x, y, sampler); + float rfac = std::min(1.0f, fac[0]); + float map; + + switch (spill_method_) { + case 0: /* simple */ + map = rfac * (input[spill_channel_] - (settings_->limscale * input[settings_->limchan])); + break; + default: /* average */ + map = rfac * (input[spill_channel_] - + (settings_->limscale * AVG(input[channel2_], input[channel3_]))); + break; + } + + if (map > 0.0f) { + output[0] = input[0] + rmut_ * (settings_->uspillr * map); + output[1] = input[1] + gmut_ * (settings_->uspillg * map); + output[2] = input[2] + bmut_ * (settings_->uspillb * map); + output[3] = input[3]; + } + else { + copy_v4_v4(output, input); + } +} + void ColorSpillOperation::update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span inputs) diff --git a/source/blender/compositor/operations/COM_ColorSpillOperation.h b/source/blender/compositor/operations/COM_ColorSpillOperation.h index 2c18104e567..cfc157bd313 100644 --- a/source/blender/compositor/operations/COM_ColorSpillOperation.h +++ b/source/blender/compositor/operations/COM_ColorSpillOperation.h @@ -15,6 +15,8 @@ namespace blender::compositor { class ColorSpillOperation : public MultiThreadedOperation { protected: NodeColorspill *settings_; + SocketReader *input_image_reader_; + SocketReader *input_fac_reader_; int spill_channel_; int spill_method_; int channel2_; @@ -22,9 +24,18 @@ class ColorSpillOperation : public MultiThreadedOperation { float rmut_, gmut_, bmut_; public: + /** + * Default constructor + */ ColorSpillOperation(); + /** + * The inner loop of this operation. + */ + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + void init_execution() override; + void deinit_execution() override; void set_settings(NodeColorspill *node_color_spill) { diff --git a/source/blender/compositor/operations/COM_CompositorOperation.cc b/source/blender/compositor/operations/COM_CompositorOperation.cc index e69e184f124..6ca2f8bac14 100644 --- a/source/blender/compositor/operations/COM_CompositorOperation.cc +++ b/source/blender/compositor/operations/COM_CompositorOperation.cc @@ -6,9 +6,9 @@ #include "BLI_string.h" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_image.h" -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "IMB_imbuf.hh" @@ -23,6 +23,8 @@ CompositorOperation::CompositorOperation() this->set_render_data(nullptr); output_buffer_ = nullptr; + image_input_ = nullptr; + alpha_input_ = nullptr; use_alpha_input_ = false; active_ = false; @@ -41,6 +43,8 @@ void CompositorOperation::init_execution() } /* When initializing the tree during initial load the width and height can be zero. */ + image_input_ = get_input_socket_reader(0); + alpha_input_ = get_input_socket_reader(1); if (this->get_width() * this->get_height() != 0) { output_buffer_ = (float *)MEM_callocN( sizeof(float[4]) * this->get_width() * this->get_height(), "CompositorOperation"); @@ -89,6 +93,89 @@ void CompositorOperation::deinit_execution() } output_buffer_ = nullptr; + image_input_ = nullptr; + alpha_input_ = nullptr; +} + +void CompositorOperation::execute_region(rcti *rect, uint /*tile_number*/) +{ + float color[8]; /* 7 is enough. */ + float *buffer = output_buffer_; + + if (!buffer) { + return; + } + int x1 = rect->xmin; + int y1 = rect->ymin; + int x2 = rect->xmax; + int y2 = rect->ymax; + int offset = (y1 * this->get_width() + x1); + int add = (this->get_width() - (x2 - x1)); + int offset4 = offset * COM_DATA_TYPE_COLOR_CHANNELS; + int x; + int y; + bool breaked = false; + int dx = 0, dy = 0; + +#if 0 + const RenderData *rd = rd_; + + if (rd->mode & R_BORDER && rd->mode & R_CROP) { + /** + * When using cropped render result, need to re-position area of interest, + * so it'll match bounds of render border within frame. By default, canvas + * will be centered between full frame and cropped frame, so we use such + * scheme to map cropped coordinates to full-frame coordinates + * + * ^ Y + * | Width + * +------------------------------------------------+ + * | | + * | | + * | Centered canvas, we map coordinate from it | + * | +------------------+ | + * | | | | H + * | | | | e + * | +------------------+ . Center | | i + * | | | | | | g + * | | | | | | h + * | |....dx.... +------|-----------+ | t + * | | . dy | | + * | +------------------+ | + * | Render border, we map coordinates to it | + * | | X + * +------------------------------------------------+----> + * Full frame + */ + + int full_width, full_height; + BKE_render_resolution(rd, false, &full_width, &full_height); + + dx = rd->border.xmin * full_width - (full_width - this->get_width()) / 2.0f; + dy = rd->border.ymin * full_height - (full_height - this->get_height()) / 2.0f; + } +#endif + + for (y = y1; y < y2 && (!breaked); y++) { + for (x = x1; x < x2 && (!breaked); x++) { + int input_x = x + dx, input_y = y + dy; + + image_input_->read_sampled(color, input_x, input_y, PixelSampler::Nearest); + if (use_alpha_input_) { + alpha_input_->read_sampled(&(color[3]), input_x, input_y, PixelSampler::Nearest); + } + + copy_v4_v4(buffer + offset4, color); + + offset4 += COM_DATA_TYPE_COLOR_CHANNELS; + offset++; + if (is_braked()) { + breaked = true; + } + } + offset += add; + offset4 += add * COM_DATA_TYPE_COLOR_CHANNELS; + } } void CompositorOperation::set_scene_name(const char *scene_name) @@ -130,8 +217,16 @@ void CompositorOperation::determine_canvas(const rcti & /*preferred_area*/, rcti rcti local_preferred; BLI_rcti_init(&local_preferred, 0, width, 0, height); - set_determined_canvas_modifier([&](rcti &canvas) { canvas = local_preferred; }); - NodeOperation::determine_canvas(local_preferred, r_area); + switch (execution_model_) { + case eExecutionModel::Tiled: + NodeOperation::determine_canvas(local_preferred, r_area); + r_area = local_preferred; + break; + case eExecutionModel::FullFrame: + set_determined_canvas_modifier([&](rcti &canvas) { canvas = local_preferred; }); + NodeOperation::determine_canvas(local_preferred, r_area); + break; + } } } // namespace blender::compositor diff --git a/source/blender/compositor/operations/COM_CompositorOperation.h b/source/blender/compositor/operations/COM_CompositorOperation.h index a0eebe9c471..f0115c84852 100644 --- a/source/blender/compositor/operations/COM_CompositorOperation.h +++ b/source/blender/compositor/operations/COM_CompositorOperation.h @@ -31,6 +31,16 @@ class CompositorOperation : public MultiThreadedOperation { */ float *output_buffer_; + /** + * \brief local reference to the input image operation + */ + SocketReader *image_input_; + + /** + * \brief local reference to the input alpha operation + */ + SocketReader *alpha_input_; + /** * \brief Ignore any alpha input */ @@ -52,6 +62,7 @@ class CompositorOperation : public MultiThreadedOperation { { return active_; } + void execute_region(rcti *rect, unsigned int tile_number) override; void set_scene(const struct Scene *scene) { scene_ = scene; diff --git a/source/blender/compositor/operations/COM_ConstantOperation.cc b/source/blender/compositor/operations/COM_ConstantOperation.cc index 527a9b2a449..6b6d599401f 100644 --- a/source/blender/compositor/operations/COM_ConstantOperation.cc +++ b/source/blender/compositor/operations/COM_ConstantOperation.cc @@ -10,6 +10,7 @@ ConstantOperation::ConstantOperation() { needs_canvas_to_get_constant_ = false; flags_.is_constant_operation = true; + flags_.is_fullframe_operation = true; } bool ConstantOperation::can_get_constant_elem() const diff --git a/source/blender/compositor/operations/COM_ConstantOperation.h b/source/blender/compositor/operations/COM_ConstantOperation.h index b7a950a81e4..a5a384c64dd 100644 --- a/source/blender/compositor/operations/COM_ConstantOperation.h +++ b/source/blender/compositor/operations/COM_ConstantOperation.h @@ -28,7 +28,7 @@ class ConstantOperation : public NodeOperation { void update_memory_buffer(MemoryBuffer *output, const rcti &area, - Span inputs) override; + Span inputs) final; }; } // namespace blender::compositor diff --git a/source/blender/compositor/operations/COM_ConvertColorProfileOperation.cc b/source/blender/compositor/operations/COM_ConvertColorProfileOperation.cc index 95464a14940..eeba7a681e7 100644 --- a/source/blender/compositor/operations/COM_ConvertColorProfileOperation.cc +++ b/source/blender/compositor/operations/COM_ConvertColorProfileOperation.cc @@ -12,7 +12,29 @@ ConvertColorProfileOperation::ConvertColorProfileOperation() { this->add_input_socket(DataType::Color); this->add_output_socket(DataType::Color); + input_operation_ = nullptr; predivided_ = false; } +void ConvertColorProfileOperation::init_execution() +{ + input_operation_ = this->get_input_socket_reader(0); +} + +void ConvertColorProfileOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float color[4]; + input_operation_->read_sampled(color, x, y, sampler); + IMB_buffer_float_from_float( + output, color, 4, to_profile_, from_profile_, predivided_, 1, 1, 0, 0); +} + +void ConvertColorProfileOperation::deinit_execution() +{ + input_operation_ = nullptr; +} + } // namespace blender::compositor diff --git a/source/blender/compositor/operations/COM_ConvertColorProfileOperation.h b/source/blender/compositor/operations/COM_ConvertColorProfileOperation.h index 09cf3e528de..b92c8dcbeb1 100644 --- a/source/blender/compositor/operations/COM_ConvertColorProfileOperation.h +++ b/source/blender/compositor/operations/COM_ConvertColorProfileOperation.h @@ -14,6 +14,11 @@ namespace blender::compositor { */ class ConvertColorProfileOperation : public NodeOperation { private: + /** + * Cached reference to the input_program + */ + SocketReader *input_operation_; + /** * \brief color profile where to convert from */ @@ -35,6 +40,21 @@ class ConvertColorProfileOperation : public NodeOperation { */ ConvertColorProfileOperation(); + /** + * The inner loop of this operation. + */ + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + + /** + * Initialize the execution + */ + void init_execution() override; + + /** + * Deinitialize the execution + */ + void deinit_execution() override; + void set_from_color_profile(int color_profile) { from_profile_ = color_profile; diff --git a/source/blender/compositor/operations/COM_ConvertColorSpaceOperation.cc b/source/blender/compositor/operations/COM_ConvertColorSpaceOperation.cc index 89af6187112..f06bca284e3 100644 --- a/source/blender/compositor/operations/COM_ConvertColorSpaceOperation.cc +++ b/source/blender/compositor/operations/COM_ConvertColorSpaceOperation.cc @@ -12,6 +12,7 @@ ConvertColorSpaceOperation::ConvertColorSpaceOperation() { this->add_input_socket(DataType::Color); this->add_output_socket(DataType::Color); + this->input_program_ = nullptr; color_processor_ = nullptr; } @@ -37,10 +38,23 @@ void ConvertColorSpaceOperation::init_execution() return; } + this->input_program_ = this->get_input_socket_reader(0); + color_processor_ = IMB_colormanagement_colorspace_processor_new(settings_->from_color_space, settings_->to_color_space); } +void ConvertColorSpaceOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + this->input_program_->read_sampled(output, x, y, sampler); + if (color_processor_ != nullptr) { + IMB_colormanagement_processor_apply_pixel(color_processor_, output, 3); + } +} + void ConvertColorSpaceOperation::update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span inputs) @@ -59,6 +73,7 @@ void ConvertColorSpaceOperation::deinit_execution() if (color_processor_ != nullptr) { IMB_colormanagement_processor_free(color_processor_); } + this->input_program_ = nullptr; this->color_processor_ = nullptr; } diff --git a/source/blender/compositor/operations/COM_ConvertColorSpaceOperation.h b/source/blender/compositor/operations/COM_ConvertColorSpaceOperation.h index d60d0336dfb..e8e3b8067cc 100644 --- a/source/blender/compositor/operations/COM_ConvertColorSpaceOperation.h +++ b/source/blender/compositor/operations/COM_ConvertColorSpaceOperation.h @@ -12,6 +12,7 @@ namespace blender::compositor { class ConvertColorSpaceOperation : public MultiThreadedOperation { private: + SocketReader *input_program_; NodeConvertColorSpace *settings_; ColormanageProcessor *color_processor_; @@ -19,8 +20,19 @@ class ConvertColorSpaceOperation : public MultiThreadedOperation { ConvertColorSpaceOperation(); void set_settings(NodeConvertColorSpace *node_color_space); + /** + * The inner loop of this operation. + */ + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + /** + * Initialize the execution + */ void init_execution() override; + + /** + * Deinitialize the execution + */ void deinit_execution() override; void update_memory_buffer_partial(MemoryBuffer *output, diff --git a/source/blender/compositor/operations/COM_ConvertDepthToRadiusOperation.cc b/source/blender/compositor/operations/COM_ConvertDepthToRadiusOperation.cc index 4ecf27c4a09..c23ba17da3e 100644 --- a/source/blender/compositor/operations/COM_ConvertDepthToRadiusOperation.cc +++ b/source/blender/compositor/operations/COM_ConvertDepthToRadiusOperation.cc @@ -46,6 +46,40 @@ void ConvertDepthToRadiusOperation::init_execution() blur_y_operation_->set_size(1.0f); } +/* Given a depth texture, compute the radius of the circle of confusion in pixels based on equation + * (8) of the paper: + * + * Potmesil, Michael, and Indranil Chakravarty. "A lens and aperture camera model for synthetic + * image generation." ACM SIGGRAPH Computer Graphics 15.3 (1981): 297-305. */ +void ConvertDepthToRadiusOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float input_value[4]; + depth_input_operation_->read_sampled(input_value, x, y, sampler); + const float depth = input_value[0]; + + /* Compute `Vu` in equation (7). */ + const float distance_to_image_of_object = (focal_length * depth) / (depth - focal_length); + + /* Compute C in equation (8). Notice that the last multiplier was included in the absolute since + * it is negative when the object distance is less than the focal length, as noted in equation + * (7). */ + float diameter = abs((distance_to_image_of_object - distance_to_image_of_focus) * + (focal_length / (f_stop * distance_to_image_of_object))); + + /* The diameter is in meters, so multiply by the pixels per meter. */ + float radius = (diameter / 2.0f) * pixels_per_meter; + + output[0] = math::min(max_radius, radius); +} + +void ConvertDepthToRadiusOperation::deinit_execution() +{ + depth_input_operation_ = nullptr; +} + /* Given a depth texture, compute the radius of the circle of confusion in pixels based on equation * (8) of the paper: * diff --git a/source/blender/compositor/operations/COM_ConvertDepthToRadiusOperation.h b/source/blender/compositor/operations/COM_ConvertDepthToRadiusOperation.h index e8ef8592999..32eacf5a617 100644 --- a/source/blender/compositor/operations/COM_ConvertDepthToRadiusOperation.h +++ b/source/blender/compositor/operations/COM_ConvertDepthToRadiusOperation.h @@ -4,7 +4,8 @@ #pragma once -#include "COM_GaussianBlurBaseOperation.h" +#include "COM_GaussianXBlurOperation.h" +#include "COM_GaussianYBlurOperation.h" #include "COM_MultiThreadedOperation.h" namespace blender::compositor { @@ -29,8 +30,12 @@ class ConvertDepthToRadiusOperation : public MultiThreadedOperation { public: ConvertDepthToRadiusOperation(); + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + void init_execution() override; + void deinit_execution() override; + void set_data(const NodeDefocus *data) { data_ = data; diff --git a/source/blender/compositor/operations/COM_ConvertOperation.cc b/source/blender/compositor/operations/COM_ConvertOperation.cc index d4b15bea1ef..f14dcab1396 100644 --- a/source/blender/compositor/operations/COM_ConvertOperation.cc +++ b/source/blender/compositor/operations/COM_ConvertOperation.cc @@ -12,9 +12,20 @@ namespace blender::compositor { ConvertBaseOperation::ConvertBaseOperation() { + input_operation_ = nullptr; flags_.can_be_constant = true; } +void ConvertBaseOperation::init_execution() +{ + input_operation_ = this->get_input_socket_reader(0); +} + +void ConvertBaseOperation::deinit_execution() +{ + input_operation_ = nullptr; +} + void ConvertBaseOperation::hash_output_params() {} void ConvertBaseOperation::update_memory_buffer_partial(MemoryBuffer *output, @@ -33,6 +44,17 @@ ConvertValueToColorOperation::ConvertValueToColorOperation() : ConvertBaseOperat this->add_output_socket(DataType::Color); } +void ConvertValueToColorOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float value; + input_operation_->read_sampled(&value, x, y, sampler); + output[0] = output[1] = output[2] = value; + output[3] = 1.0f; +} + void ConvertValueToColorOperation::update_memory_buffer_partial(BuffersIterator &it) { for (; !it.is_end(); ++it) { @@ -49,6 +71,16 @@ ConvertColorToValueOperation::ConvertColorToValueOperation() : ConvertBaseOperat this->add_output_socket(DataType::Value); } +void ConvertColorToValueOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float input_color[4]; + input_operation_->read_sampled(input_color, x, y, sampler); + output[0] = (input_color[0] + input_color[1] + input_color[2]) / 3.0f; +} + void ConvertColorToValueOperation::update_memory_buffer_partial(BuffersIterator &it) { for (; !it.is_end(); ++it) { @@ -65,6 +97,16 @@ ConvertColorToBWOperation::ConvertColorToBWOperation() : ConvertBaseOperation() this->add_output_socket(DataType::Value); } +void ConvertColorToBWOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float input_color[4]; + input_operation_->read_sampled(input_color, x, y, sampler); + output[0] = IMB_colormanagement_get_luminance(input_color); +} + void ConvertColorToBWOperation::update_memory_buffer_partial(BuffersIterator &it) { for (; !it.is_end(); ++it) { @@ -80,6 +122,16 @@ ConvertColorToVectorOperation::ConvertColorToVectorOperation() : ConvertBaseOper this->add_output_socket(DataType::Vector); } +void ConvertColorToVectorOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float color[4]; + input_operation_->read_sampled(color, x, y, sampler); + copy_v3_v3(output, color); +} + void ConvertColorToVectorOperation::update_memory_buffer_partial(BuffersIterator &it) { for (; !it.is_end(); ++it) { @@ -95,6 +147,16 @@ ConvertValueToVectorOperation::ConvertValueToVectorOperation() : ConvertBaseOper this->add_output_socket(DataType::Vector); } +void ConvertValueToVectorOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float value; + input_operation_->read_sampled(&value, x, y, sampler); + output[0] = output[1] = output[2] = value; +} + void ConvertValueToVectorOperation::update_memory_buffer_partial(BuffersIterator &it) { for (; !it.is_end(); ++it) { @@ -110,6 +172,15 @@ ConvertVectorToColorOperation::ConvertVectorToColorOperation() : ConvertBaseOper this->add_output_socket(DataType::Color); } +void ConvertVectorToColorOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + input_operation_->read_sampled(output, x, y, sampler); + output[3] = 1.0f; +} + void ConvertVectorToColorOperation::update_memory_buffer_partial(BuffersIterator &it) { for (; !it.is_end(); ++it) { @@ -126,6 +197,16 @@ ConvertVectorToValueOperation::ConvertVectorToValueOperation() : ConvertBaseOper this->add_output_socket(DataType::Value); } +void ConvertVectorToValueOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float input[4]; + input_operation_->read_sampled(input, x, y, sampler); + output[0] = (input[0] + input[1] + input[2]) / 3.0f; +} + void ConvertVectorToValueOperation::update_memory_buffer_partial(BuffersIterator &it) { for (; !it.is_end(); ++it) { @@ -158,6 +239,24 @@ void ConvertRGBToYCCOperation::set_mode(int mode) } } +void ConvertRGBToYCCOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float input_color[4]; + float color[3]; + + input_operation_->read_sampled(input_color, x, y, sampler); + rgb_to_ycc( + input_color[0], input_color[1], input_color[2], &color[0], &color[1], &color[2], mode_); + + /* divided by 255 to normalize for viewing in */ + /* R,G,B --> Y,Cb,Cr */ + mul_v3_v3fl(output, color, 1.0f / 255.0f); + output[3] = input_color[3]; +} + void ConvertRGBToYCCOperation::hash_output_params() { ConvertBaseOperation::hash_output_params(); @@ -200,6 +299,23 @@ void ConvertYCCToRGBOperation::set_mode(int mode) } } +void ConvertYCCToRGBOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float input_color[4]; + input_operation_->read_sampled(input_color, x, y, sampler); + + /* need to un-normalize the data */ + /* R,G,B --> Y,Cb,Cr */ + mul_v3_fl(input_color, 255.0f); + + ycc_to_rgb( + input_color[0], input_color[1], input_color[2], &output[0], &output[1], &output[2], mode_); + output[3] = input_color[3]; +} + void ConvertYCCToRGBOperation::hash_output_params() { ConvertBaseOperation::hash_output_params(); @@ -225,6 +341,23 @@ ConvertRGBToYUVOperation::ConvertRGBToYUVOperation() : ConvertBaseOperation() this->add_output_socket(DataType::Color); } +void ConvertRGBToYUVOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float input_color[4]; + input_operation_->read_sampled(input_color, x, y, sampler); + rgb_to_yuv(input_color[0], + input_color[1], + input_color[2], + &output[0], + &output[1], + &output[2], + BLI_YUV_ITU_BT709); + output[3] = input_color[3]; +} + void ConvertRGBToYUVOperation::update_memory_buffer_partial(BuffersIterator &it) { for (; !it.is_end(); ++it) { @@ -242,6 +375,23 @@ ConvertYUVToRGBOperation::ConvertYUVToRGBOperation() : ConvertBaseOperation() this->add_output_socket(DataType::Color); } +void ConvertYUVToRGBOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float input_color[4]; + input_operation_->read_sampled(input_color, x, y, sampler); + yuv_to_rgb(input_color[0], + input_color[1], + input_color[2], + &output[0], + &output[1], + &output[2], + BLI_YUV_ITU_BT709); + output[3] = input_color[3]; +} + void ConvertYUVToRGBOperation::update_memory_buffer_partial(BuffersIterator &it) { for (; !it.is_end(); ++it) { @@ -259,6 +409,17 @@ ConvertRGBToHSVOperation::ConvertRGBToHSVOperation() : ConvertBaseOperation() this->add_output_socket(DataType::Color); } +void ConvertRGBToHSVOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float input_color[4]; + input_operation_->read_sampled(input_color, x, y, sampler); + rgb_to_hsv_v(input_color, output); + output[3] = input_color[3]; +} + void ConvertRGBToHSVOperation::update_memory_buffer_partial(BuffersIterator &it) { for (; !it.is_end(); ++it) { @@ -276,6 +437,20 @@ ConvertHSVToRGBOperation::ConvertHSVToRGBOperation() : ConvertBaseOperation() this->add_output_socket(DataType::Color); } +void ConvertHSVToRGBOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float input_color[4]; + input_operation_->read_sampled(input_color, x, y, sampler); + hsv_to_rgb_v(input_color, output); + output[0] = max_ff(output[0], 0.0f); + output[1] = max_ff(output[1], 0.0f); + output[2] = max_ff(output[2], 0.0f); + output[3] = input_color[3]; +} + void ConvertHSVToRGBOperation::update_memory_buffer_partial(BuffersIterator &it) { for (; !it.is_end(); ++it) { @@ -296,6 +471,17 @@ ConvertRGBToHSLOperation::ConvertRGBToHSLOperation() : ConvertBaseOperation() this->add_output_socket(DataType::Color); } +void ConvertRGBToHSLOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float input_color[4]; + input_operation_->read_sampled(input_color, x, y, sampler); + rgb_to_hsl_v(input_color, output); + output[3] = input_color[3]; +} + void ConvertRGBToHSLOperation::update_memory_buffer_partial(BuffersIterator &it) { for (; !it.is_end(); ++it) { @@ -313,6 +499,20 @@ ConvertHSLToRGBOperation::ConvertHSLToRGBOperation() : ConvertBaseOperation() this->add_output_socket(DataType::Color); } +void ConvertHSLToRGBOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float input_color[4]; + input_operation_->read_sampled(input_color, x, y, sampler); + hsl_to_rgb_v(input_color, output); + output[0] = max_ff(output[0], 0.0f); + output[1] = max_ff(output[1], 0.0f); + output[2] = max_ff(output[2], 0.0f); + output[3] = input_color[3]; +} + void ConvertHSLToRGBOperation::update_memory_buffer_partial(BuffersIterator &it) { for (; !it.is_end(); ++it) { @@ -333,6 +533,17 @@ ConvertPremulToStraightOperation::ConvertPremulToStraightOperation() : ConvertBa this->add_output_socket(DataType::Color); } +void ConvertPremulToStraightOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + ColorSceneLinear4f input; + input_operation_->read_sampled(input, x, y, sampler); + ColorSceneLinear4f converted = input.unpremultiply_alpha(); + copy_v4_v4(output, converted); +} + void ConvertPremulToStraightOperation::update_memory_buffer_partial(BuffersIterator &it) { for (; !it.is_end(); ++it) { @@ -348,6 +559,17 @@ ConvertStraightToPremulOperation::ConvertStraightToPremulOperation() : ConvertBa this->add_output_socket(DataType::Color); } +void ConvertStraightToPremulOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + ColorSceneLinear4f input; + input_operation_->read_sampled(input, x, y, sampler); + ColorSceneLinear4f converted = input.premultiply_alpha(); + copy_v4_v4(output, converted); +} + void ConvertStraightToPremulOperation::update_memory_buffer_partial(BuffersIterator &it) { for (; !it.is_end(); ++it) { @@ -361,8 +583,28 @@ SeparateChannelOperation::SeparateChannelOperation() { this->add_input_socket(DataType::Color); this->add_output_socket(DataType::Value); + input_operation_ = nullptr; flags_.can_be_constant = true; } +void SeparateChannelOperation::init_execution() +{ + input_operation_ = this->get_input_socket_reader(0); +} + +void SeparateChannelOperation::deinit_execution() +{ + input_operation_ = nullptr; +} + +void SeparateChannelOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float input[4]; + input_operation_->read_sampled(input, x, y, sampler); + output[0] = input[channel_]; +} void SeparateChannelOperation::update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, @@ -383,10 +625,54 @@ CombineChannelsOperation::CombineChannelsOperation() this->add_input_socket(DataType::Value); this->add_output_socket(DataType::Color); this->set_canvas_input_index(0); + input_channel1_operation_ = nullptr; + input_channel2_operation_ = nullptr; + input_channel3_operation_ = nullptr; + input_channel4_operation_ = nullptr; flags_.can_be_constant = true; } +void CombineChannelsOperation::init_execution() +{ + input_channel1_operation_ = this->get_input_socket_reader(0); + input_channel2_operation_ = this->get_input_socket_reader(1); + input_channel3_operation_ = this->get_input_socket_reader(2); + input_channel4_operation_ = this->get_input_socket_reader(3); +} + +void CombineChannelsOperation::deinit_execution() +{ + input_channel1_operation_ = nullptr; + input_channel2_operation_ = nullptr; + input_channel3_operation_ = nullptr; + input_channel4_operation_ = nullptr; +} + +void CombineChannelsOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float input[4]; + if (input_channel1_operation_) { + input_channel1_operation_->read_sampled(input, x, y, sampler); + output[0] = input[0]; + } + if (input_channel2_operation_) { + input_channel2_operation_->read_sampled(input, x, y, sampler); + output[1] = input[0]; + } + if (input_channel3_operation_) { + input_channel3_operation_->read_sampled(input, x, y, sampler); + output[2] = input[0]; + } + if (input_channel4_operation_) { + input_channel4_operation_->read_sampled(input, x, y, sampler); + output[3] = input[0]; + } +} + void CombineChannelsOperation::update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span inputs) diff --git a/source/blender/compositor/operations/COM_ConvertOperation.h b/source/blender/compositor/operations/COM_ConvertOperation.h index 70b58af2dda..2c6add73d04 100644 --- a/source/blender/compositor/operations/COM_ConvertOperation.h +++ b/source/blender/compositor/operations/COM_ConvertOperation.h @@ -9,9 +9,15 @@ namespace blender::compositor { class ConvertBaseOperation : public MultiThreadedOperation { + protected: + SocketReader *input_operation_; + public: ConvertBaseOperation(); + void init_execution() override; + void deinit_execution() override; + void update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span inputs) final; @@ -25,6 +31,8 @@ class ConvertValueToColorOperation : public ConvertBaseOperation { public: ConvertValueToColorOperation(); + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + protected: void update_memory_buffer_partial(BuffersIterator &it) override; }; @@ -33,6 +41,8 @@ class ConvertColorToValueOperation : public ConvertBaseOperation { public: ConvertColorToValueOperation(); + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + protected: void update_memory_buffer_partial(BuffersIterator &it) override; }; @@ -41,6 +51,8 @@ class ConvertColorToBWOperation : public ConvertBaseOperation { public: ConvertColorToBWOperation(); + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + protected: void update_memory_buffer_partial(BuffersIterator &it) override; }; @@ -49,6 +61,8 @@ class ConvertColorToVectorOperation : public ConvertBaseOperation { public: ConvertColorToVectorOperation(); + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + protected: void update_memory_buffer_partial(BuffersIterator &it) override; }; @@ -57,6 +71,8 @@ class ConvertValueToVectorOperation : public ConvertBaseOperation { public: ConvertValueToVectorOperation(); + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + protected: void update_memory_buffer_partial(BuffersIterator &it) override; }; @@ -65,6 +81,8 @@ class ConvertVectorToColorOperation : public ConvertBaseOperation { public: ConvertVectorToColorOperation(); + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + protected: void update_memory_buffer_partial(BuffersIterator &it) override; }; @@ -73,6 +91,8 @@ class ConvertVectorToValueOperation : public ConvertBaseOperation { public: ConvertVectorToValueOperation(); + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + protected: void update_memory_buffer_partial(BuffersIterator &it) override; }; @@ -85,6 +105,8 @@ class ConvertRGBToYCCOperation : public ConvertBaseOperation { public: ConvertRGBToYCCOperation(); + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + /** Set the YCC mode */ void set_mode(int mode); @@ -101,6 +123,8 @@ class ConvertYCCToRGBOperation : public ConvertBaseOperation { public: ConvertYCCToRGBOperation(); + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + /** Set the YCC mode */ void set_mode(int mode); @@ -113,6 +137,8 @@ class ConvertRGBToYUVOperation : public ConvertBaseOperation { public: ConvertRGBToYUVOperation(); + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + protected: void update_memory_buffer_partial(BuffersIterator &it) override; }; @@ -121,6 +147,8 @@ class ConvertYUVToRGBOperation : public ConvertBaseOperation { public: ConvertYUVToRGBOperation(); + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + protected: void update_memory_buffer_partial(BuffersIterator &it) override; }; @@ -129,6 +157,8 @@ class ConvertRGBToHSVOperation : public ConvertBaseOperation { public: ConvertRGBToHSVOperation(); + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + protected: void update_memory_buffer_partial(BuffersIterator &it) override; }; @@ -137,6 +167,8 @@ class ConvertHSVToRGBOperation : public ConvertBaseOperation { public: ConvertHSVToRGBOperation(); + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + protected: void update_memory_buffer_partial(BuffersIterator &it) override; }; @@ -145,6 +177,8 @@ class ConvertRGBToHSLOperation : public ConvertBaseOperation { public: ConvertRGBToHSLOperation(); + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + protected: void update_memory_buffer_partial(BuffersIterator &it) override; }; @@ -153,6 +187,8 @@ class ConvertHSLToRGBOperation : public ConvertBaseOperation { public: ConvertHSLToRGBOperation(); + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + protected: void update_memory_buffer_partial(BuffersIterator &it) override; }; @@ -161,6 +197,8 @@ class ConvertPremulToStraightOperation : public ConvertBaseOperation { public: ConvertPremulToStraightOperation(); + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + protected: void update_memory_buffer_partial(BuffersIterator &it) override; }; @@ -169,16 +207,23 @@ class ConvertStraightToPremulOperation : public ConvertBaseOperation { public: ConvertStraightToPremulOperation(); + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + protected: void update_memory_buffer_partial(BuffersIterator &it) override; }; class SeparateChannelOperation : public MultiThreadedOperation { private: + SocketReader *input_operation_; int channel_; public: SeparateChannelOperation(); + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + + void init_execution() override; + void deinit_execution() override; void set_channel(int channel) { @@ -191,8 +236,18 @@ class SeparateChannelOperation : public MultiThreadedOperation { }; class CombineChannelsOperation : public MultiThreadedOperation { + private: + SocketReader *input_channel1_operation_; + SocketReader *input_channel2_operation_; + SocketReader *input_channel3_operation_; + SocketReader *input_channel4_operation_; + public: CombineChannelsOperation(); + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + + void init_execution() override; + void deinit_execution() override; void update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, diff --git a/source/blender/compositor/operations/COM_ConvolutionEdgeFilterOperation.cc b/source/blender/compositor/operations/COM_ConvolutionEdgeFilterOperation.cc index e4d0d967de7..cdfeb9b5ac6 100644 --- a/source/blender/compositor/operations/COM_ConvolutionEdgeFilterOperation.cc +++ b/source/blender/compositor/operations/COM_ConvolutionEdgeFilterOperation.cc @@ -6,6 +6,80 @@ namespace blender::compositor { +void ConvolutionEdgeFilterOperation::execute_pixel(float output[4], int x, int y, void * /*data*/) +{ + float in1[4], in2[4], res1[4] = {0.0}, res2[4] = {0.0}; + + int x1 = x - 1; + int x2 = x; + int x3 = x + 1; + int y1 = y - 1; + int y2 = y; + int y3 = y + 1; + CLAMP(x1, 0, get_width() - 1); + CLAMP(x2, 0, get_width() - 1); + CLAMP(x3, 0, get_width() - 1); + CLAMP(y1, 0, get_height() - 1); + CLAMP(y2, 0, get_height() - 1); + CLAMP(y3, 0, get_height() - 1); + + float value[4]; + input_value_operation_->read(value, x2, y2, nullptr); + float mval = 1.0f - value[0]; + + input_operation_->read(in1, x1, y1, nullptr); + madd_v3_v3fl(res1, in1, filter_[0]); + madd_v3_v3fl(res2, in1, filter_[0]); + + input_operation_->read(in1, x2, y1, nullptr); + madd_v3_v3fl(res1, in1, filter_[1]); + madd_v3_v3fl(res2, in1, filter_[3]); + + input_operation_->read(in1, x3, y1, nullptr); + madd_v3_v3fl(res1, in1, filter_[2]); + madd_v3_v3fl(res2, in1, filter_[6]); + + input_operation_->read(in1, x1, y2, nullptr); + madd_v3_v3fl(res1, in1, filter_[3]); + madd_v3_v3fl(res2, in1, filter_[1]); + + input_operation_->read(in2, x2, y2, nullptr); + madd_v3_v3fl(res1, in2, filter_[4]); + madd_v3_v3fl(res2, in2, filter_[4]); + + input_operation_->read(in1, x3, y2, nullptr); + madd_v3_v3fl(res1, in1, filter_[5]); + madd_v3_v3fl(res2, in1, filter_[7]); + + input_operation_->read(in1, x1, y3, nullptr); + madd_v3_v3fl(res1, in1, filter_[6]); + madd_v3_v3fl(res2, in1, filter_[2]); + + input_operation_->read(in1, x2, y3, nullptr); + madd_v3_v3fl(res1, in1, filter_[7]); + madd_v3_v3fl(res2, in1, filter_[5]); + + input_operation_->read(in1, x3, y3, nullptr); + madd_v3_v3fl(res1, in1, filter_[8]); + madd_v3_v3fl(res2, in1, filter_[8]); + + output[0] = sqrt(res1[0] * res1[0] + res2[0] * res2[0]); + output[1] = sqrt(res1[1] * res1[1] + res2[1] * res2[1]); + output[2] = sqrt(res1[2] * res1[2] + res2[2] * res2[2]); + + output[0] = output[0] * value[0] + in2[0] * mval; + output[1] = output[1] * value[0] + in2[1] * mval; + output[2] = output[2] * value[0] + in2[2] * mval; + + output[3] = in2[3]; + + /* Make sure we don't return negative color. */ + output[0] = std::max(output[0], 0.0f); + output[1] = std::max(output[1], 0.0f); + output[2] = std::max(output[2], 0.0f); + output[3] = std::max(output[3], 0.0f); +} + void ConvolutionEdgeFilterOperation::update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span inputs) diff --git a/source/blender/compositor/operations/COM_ConvolutionEdgeFilterOperation.h b/source/blender/compositor/operations/COM_ConvolutionEdgeFilterOperation.h index 9411a221d4a..a48871682b3 100644 --- a/source/blender/compositor/operations/COM_ConvolutionEdgeFilterOperation.h +++ b/source/blender/compositor/operations/COM_ConvolutionEdgeFilterOperation.h @@ -10,6 +10,8 @@ namespace blender::compositor { class ConvolutionEdgeFilterOperation : public ConvolutionFilterOperation { public: + void execute_pixel(float output[4], int x, int y, void *data) override; + void update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span inputs) override; diff --git a/source/blender/compositor/operations/COM_ConvolutionFilterOperation.cc b/source/blender/compositor/operations/COM_ConvolutionFilterOperation.cc index 14b5df26e6f..42728282bef 100644 --- a/source/blender/compositor/operations/COM_ConvolutionFilterOperation.cc +++ b/source/blender/compositor/operations/COM_ConvolutionFilterOperation.cc @@ -12,8 +12,15 @@ ConvolutionFilterOperation::ConvolutionFilterOperation() this->add_input_socket(DataType::Value); this->add_output_socket(DataType::Color); this->set_canvas_input_index(0); + input_operation_ = nullptr; + flags_.complex = true; flags_.can_be_constant = true; } +void ConvolutionFilterOperation::init_execution() +{ + input_operation_ = this->get_input_socket_reader(0); + input_value_operation_ = this->get_input_socket_reader(1); +} void ConvolutionFilterOperation::set3x3Filter( float f1, float f2, float f3, float f4, float f5, float f6, float f7, float f8, float f9) @@ -31,6 +38,78 @@ void ConvolutionFilterOperation::set3x3Filter( filter_width_ = 3; } +void ConvolutionFilterOperation::deinit_execution() +{ + input_operation_ = nullptr; + input_value_operation_ = nullptr; +} + +void ConvolutionFilterOperation::execute_pixel(float output[4], int x, int y, void * /*data*/) +{ + float in1[4]; + float in2[4]; + int x1 = x - 1; + int x2 = x; + int x3 = x + 1; + int y1 = y - 1; + int y2 = y; + int y3 = y + 1; + CLAMP(x1, 0, get_width() - 1); + CLAMP(x2, 0, get_width() - 1); + CLAMP(x3, 0, get_width() - 1); + CLAMP(y1, 0, get_height() - 1); + CLAMP(y2, 0, get_height() - 1); + CLAMP(y3, 0, get_height() - 1); + float value[4]; + input_value_operation_->read(value, x2, y2, nullptr); + const float mval = 1.0f - value[0]; + + zero_v4(output); + input_operation_->read(in1, x1, y1, nullptr); + madd_v4_v4fl(output, in1, filter_[0]); + input_operation_->read(in1, x2, y1, nullptr); + madd_v4_v4fl(output, in1, filter_[1]); + input_operation_->read(in1, x3, y1, nullptr); + madd_v4_v4fl(output, in1, filter_[2]); + input_operation_->read(in1, x1, y2, nullptr); + madd_v4_v4fl(output, in1, filter_[3]); + input_operation_->read(in2, x2, y2, nullptr); + madd_v4_v4fl(output, in2, filter_[4]); + input_operation_->read(in1, x3, y2, nullptr); + madd_v4_v4fl(output, in1, filter_[5]); + input_operation_->read(in1, x1, y3, nullptr); + madd_v4_v4fl(output, in1, filter_[6]); + input_operation_->read(in1, x2, y3, nullptr); + madd_v4_v4fl(output, in1, filter_[7]); + input_operation_->read(in1, x3, y3, nullptr); + madd_v4_v4fl(output, in1, filter_[8]); + + output[0] = output[0] * value[0] + in2[0] * mval; + output[1] = output[1] * value[0] + in2[1] * mval; + output[2] = output[2] * value[0] + in2[2] * mval; + output[3] = output[3] * value[0] + in2[3] * mval; + + /* Make sure we don't return negative color. */ + output[0] = std::max(output[0], 0.0f); + output[1] = std::max(output[1], 0.0f); + output[2] = std::max(output[2], 0.0f); + output[3] = std::max(output[3], 0.0f); +} + +bool ConvolutionFilterOperation::determine_depending_area_of_interest( + rcti *input, ReadBufferOperation *read_operation, rcti *output) +{ + rcti new_input; + int addx = (filter_width_ - 1) / 2 + 1; + int addy = (filter_height_ - 1) / 2 + 1; + new_input.xmax = input->xmax + addx; + new_input.xmin = input->xmin - addx; + new_input.ymax = input->ymax + addy; + new_input.ymin = input->ymin - addy; + + return NodeOperation::determine_depending_area_of_interest(&new_input, read_operation, output); +} + void ConvolutionFilterOperation::get_area_of_interest(const int input_idx, const rcti &output_area, rcti &r_input_area) diff --git a/source/blender/compositor/operations/COM_ConvolutionFilterOperation.h b/source/blender/compositor/operations/COM_ConvolutionFilterOperation.h index 2ed01dea786..daadad6f9c4 100644 --- a/source/blender/compositor/operations/COM_ConvolutionFilterOperation.h +++ b/source/blender/compositor/operations/COM_ConvolutionFilterOperation.h @@ -18,12 +18,21 @@ class ConvolutionFilterOperation : public MultiThreadedOperation { int filter_height_; protected: + SocketReader *input_operation_; + SocketReader *input_value_operation_; float filter_[9]; public: ConvolutionFilterOperation(); void set3x3Filter( float f1, float f2, float f3, float f4, float f5, float f6, float f7, float f8, float f9); + bool determine_depending_area_of_interest(rcti *input, + ReadBufferOperation *read_operation, + rcti *output) override; + void execute_pixel(float output[4], int x, int y, void *data) override; + + void init_execution() override; + void deinit_execution() override; void get_area_of_interest(int input_idx, const rcti &output_area, rcti &r_input_area) final; virtual void update_memory_buffer_partial(MemoryBuffer *output, diff --git a/source/blender/compositor/operations/COM_CropOperation.cc b/source/blender/compositor/operations/COM_CropOperation.cc index ce5d1c93159..75742e5606b 100644 --- a/source/blender/compositor/operations/COM_CropOperation.cc +++ b/source/blender/compositor/operations/COM_CropOperation.cc @@ -12,6 +12,7 @@ CropBaseOperation::CropBaseOperation() { this->add_input_socket(DataType::Color, ResizeMode::Align); this->add_output_socket(DataType::Color); + input_operation_ = nullptr; settings_ = nullptr; flags_.can_be_constant = true; } @@ -46,14 +47,30 @@ void CropBaseOperation::update_area() void CropBaseOperation::init_execution() { + input_operation_ = this->get_input_socket_reader(0); update_area(); } +void CropBaseOperation::deinit_execution() +{ + input_operation_ = nullptr; +} + CropOperation::CropOperation() : CropBaseOperation() { /* pass */ } +void CropOperation::execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) +{ + if ((x < xmax_ && x >= xmin_) && (y < ymax_ && y >= ymin_)) { + input_operation_->read_sampled(output, x, y, sampler); + } + else { + zero_v4(output); + } +} + void CropOperation::update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span inputs) @@ -73,6 +90,20 @@ CropImageOperation::CropImageOperation() : CropBaseOperation() /* pass */ } +bool CropImageOperation::determine_depending_area_of_interest(rcti *input, + ReadBufferOperation *read_operation, + rcti *output) +{ + rcti new_input; + + new_input.xmax = input->xmax + xmin_; + new_input.xmin = input->xmin + xmin_; + new_input.ymax = input->ymax + ymin_; + new_input.ymin = input->ymin + ymin_; + + return NodeOperation::determine_depending_area_of_interest(&new_input, read_operation, output); +} + void CropImageOperation::get_area_of_interest(const int input_idx, const rcti &output_area, rcti &r_input_area) @@ -93,6 +124,19 @@ void CropImageOperation::determine_canvas(const rcti &preferred_area, rcti &r_ar r_area.ymax = r_area.ymin + (ymax_ - ymin_); } +void CropImageOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + if (x >= 0 && x < get_width() && y >= 0 && y < get_height()) { + input_operation_->read_sampled(output, (x + xmin_), (y + ymin_), sampler); + } + else { + zero_v4(output); + } +} + void CropImageOperation::update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span inputs) diff --git a/source/blender/compositor/operations/COM_CropOperation.h b/source/blender/compositor/operations/COM_CropOperation.h index 55cad40f52b..b40bfc81b0e 100644 --- a/source/blender/compositor/operations/COM_CropOperation.h +++ b/source/blender/compositor/operations/COM_CropOperation.h @@ -10,6 +10,7 @@ namespace blender::compositor { class CropBaseOperation : public MultiThreadedOperation { protected: + SocketReader *input_operation_; NodeTwoXYs *settings_; bool relative_; int xmax_; @@ -22,6 +23,7 @@ class CropBaseOperation : public MultiThreadedOperation { public: CropBaseOperation(); void init_execution() override; + void deinit_execution() override; void set_crop_settings(NodeTwoXYs *settings) { settings_ = settings; @@ -36,6 +38,8 @@ class CropOperation : public CropBaseOperation { private: public: CropOperation(); + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + void update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span inputs) override; @@ -45,7 +49,12 @@ class CropImageOperation : public CropBaseOperation { private: public: CropImageOperation(); + bool determine_depending_area_of_interest(rcti *input, + ReadBufferOperation *read_operation, + rcti *output) override; void determine_canvas(const rcti &preferred_area, rcti &r_area) override; + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + void get_area_of_interest(int input_idx, const rcti &output_area, rcti &r_input_area) override; void update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, diff --git a/source/blender/compositor/operations/COM_CryptomatteOperation.cc b/source/blender/compositor/operations/COM_CryptomatteOperation.cc index 924c06d09ed..dc5cb210329 100644 --- a/source/blender/compositor/operations/COM_CryptomatteOperation.cc +++ b/source/blender/compositor/operations/COM_CryptomatteOperation.cc @@ -13,6 +13,7 @@ CryptomatteOperation::CryptomatteOperation(size_t num_inputs) this->add_input_socket(DataType::Color); } this->add_output_socket(DataType::Color); + flags_.complex = true; flags_.can_be_constant = true; } @@ -30,6 +31,33 @@ void CryptomatteOperation::add_object_index(float object_index) } } +void CryptomatteOperation::execute_pixel(float output[4], int x, int y, void *data) +{ + float input[4]; + output[0] = output[1] = output[2] = output[3] = 0.0f; + for (size_t i = 0; i < inputs.size(); i++) { + inputs[i]->read(input, x, y, data); + if (i == 0) { + /* Write the front-most object as false color for picking. */ + output[0] = input[0]; + uint32_t m3hash; + ::memcpy(&m3hash, &input[0], sizeof(uint32_t)); + /* Since the red channel is likely to be out of display range, + * setting green and blue gives more meaningful images. */ + output[1] = (float(m3hash << 8) / float(UINT32_MAX)); + output[2] = (float(m3hash << 16) / float(UINT32_MAX)); + } + for (float hash : object_index_) { + if (input[0] == hash) { + output[3] += input[1]; + } + if (input[2] == hash) { + output[3] += input[3]; + } + } + } +} + void CryptomatteOperation::update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span inputs) diff --git a/source/blender/compositor/operations/COM_CryptomatteOperation.h b/source/blender/compositor/operations/COM_CryptomatteOperation.h index 8b99755c3e1..908a44fea11 100644 --- a/source/blender/compositor/operations/COM_CryptomatteOperation.h +++ b/source/blender/compositor/operations/COM_CryptomatteOperation.h @@ -18,6 +18,7 @@ class CryptomatteOperation : public MultiThreadedOperation { CryptomatteOperation(size_t num_inputs = 6); void init_execution() override; + void execute_pixel(float output[4], int x, int y, void *data) override; void add_object_index(float object_index); diff --git a/source/blender/compositor/operations/COM_CurveBaseOperation.h b/source/blender/compositor/operations/COM_CurveBaseOperation.h index 432ef9a823d..085ca91bfd2 100644 --- a/source/blender/compositor/operations/COM_CurveBaseOperation.h +++ b/source/blender/compositor/operations/COM_CurveBaseOperation.h @@ -12,12 +12,18 @@ namespace blender::compositor { class CurveBaseOperation : public MultiThreadedOperation { protected: + /** + * Cached reference to the input_program + */ CurveMapping *curve_mapping_; public: CurveBaseOperation(); ~CurveBaseOperation(); + /** + * Initialize the execution + */ void init_execution() override; void deinit_execution() override; diff --git a/source/blender/compositor/operations/COM_DenoiseOperation.cc b/source/blender/compositor/operations/COM_DenoiseOperation.cc index 45bb65aaf61..52f09d4e79f 100644 --- a/source/blender/compositor/operations/COM_DenoiseOperation.cc +++ b/source/blender/compositor/operations/COM_DenoiseOperation.cc @@ -19,7 +19,7 @@ bool COM_is_denoise_supported() # ifdef __APPLE__ return true; # else - return BLI_cpu_support_sse42(); + return BLI_cpu_support_sse41(); # endif #else @@ -113,10 +113,25 @@ class DenoiseFilter { DenoiseBaseOperation::DenoiseBaseOperation() { - flags_.can_be_constant = true; + flags_.is_fullframe_operation = true; output_rendered_ = false; } +bool DenoiseBaseOperation::determine_depending_area_of_interest( + rcti * /*input*/, ReadBufferOperation *read_operation, rcti *output) +{ + if (is_cached()) { + return false; + } + + rcti new_input; + new_input.xmax = this->get_width(); + new_input.xmin = 0; + new_input.ymax = this->get_height(); + new_input.ymin = 0; + return NodeOperation::determine_depending_area_of_interest(&new_input, read_operation, output); +} + void DenoiseBaseOperation::get_area_of_interest(const int /*input_idx*/, const rcti & /*output_area*/, rcti &r_input_area) @@ -132,6 +147,21 @@ DenoiseOperation::DenoiseOperation() this->add_output_socket(DataType::Color); settings_ = nullptr; } +void DenoiseOperation::init_execution() +{ + SingleThreadedOperation::init_execution(); + input_program_color_ = get_input_socket_reader(0); + input_program_normal_ = get_input_socket_reader(1); + input_program_albedo_ = get_input_socket_reader(2); +} + +void DenoiseOperation::deinit_execution() +{ + input_program_color_ = nullptr; + input_program_normal_ = nullptr; + input_program_albedo_ = nullptr; + SingleThreadedOperation::deinit_execution(); +} static bool are_guiding_passes_noise_free(const NodeDenoise *settings) { @@ -152,29 +182,48 @@ void DenoiseOperation::hash_output_params() } } +MemoryBuffer *DenoiseOperation::create_memory_buffer(rcti *rect2) +{ + MemoryBuffer *tile_color = (MemoryBuffer *)input_program_color_->initialize_tile_data(rect2); + MemoryBuffer *tile_normal = (MemoryBuffer *)input_program_normal_->initialize_tile_data(rect2); + MemoryBuffer *tile_albedo = (MemoryBuffer *)input_program_albedo_->initialize_tile_data(rect2); + rcti rect; + rect.xmin = 0; + rect.ymin = 0; + rect.xmax = get_width(); + rect.ymax = get_height(); + MemoryBuffer *result = new MemoryBuffer(DataType::Color, rect); + this->generate_denoise(result, tile_color, tile_normal, tile_albedo, settings_); + return result; +} + void DenoiseOperation::generate_denoise(MemoryBuffer *output, MemoryBuffer *input_color, MemoryBuffer *input_normal, MemoryBuffer *input_albedo, const NodeDenoise *settings) { - if (input_color->is_a_single_elem()) { - output->fill(output->get_rect(), input_color->get_elem(0, 0)); + BLI_assert(input_color->get_buffer()); + if (!input_color->get_buffer()) { return; } BLI_assert(COM_is_denoise_supported()); + /* OpenImageDenoise needs full buffers. */ + MemoryBuffer *buf_color = input_color->is_a_single_elem() ? input_color->inflate() : input_color; + MemoryBuffer *buf_normal = input_normal && input_normal->is_a_single_elem() ? + input_normal->inflate() : + input_normal; + MemoryBuffer *buf_albedo = input_albedo && input_albedo->is_a_single_elem() ? + input_albedo->inflate() : + input_albedo; DenoiseFilter filter; filter.init_and_lock_denoiser(this, output); - filter.set_image("color", input_color); - if (!input_albedo->is_a_single_elem()) { - filter.set_image("albedo", input_albedo); - if (!input_normal->is_a_single_elem()) { - filter.set_image("normal", input_normal); - } - } + filter.set_image("color", buf_color); + filter.set_image("normal", buf_normal); + filter.set_image("albedo", buf_albedo); BLI_assert(settings); if (settings) { @@ -188,6 +237,17 @@ void DenoiseOperation::generate_denoise(MemoryBuffer *output, /* Copy the alpha channel, OpenImageDenoise currently only supports RGB. */ output->copy_from(input_color, input_color->get_rect(), 3, COM_DATA_TYPE_VALUE_CHANNELS, 3); + + /* Delete inflated buffers. */ + if (input_color->is_a_single_elem()) { + delete buf_color; + } + if (input_normal && input_normal->is_a_single_elem()) { + delete buf_normal; + } + if (input_albedo && input_albedo->is_a_single_elem()) { + delete buf_albedo; + } } void DenoiseOperation::update_memory_buffer(MemoryBuffer *output, @@ -212,20 +272,35 @@ void DenoisePrefilterOperation::hash_output_params() hash_param(image_name_); } +MemoryBuffer *DenoisePrefilterOperation::create_memory_buffer(rcti *rect2) +{ + MemoryBuffer *input = (MemoryBuffer *)this->get_input_operation(0)->initialize_tile_data(rect2); + rcti rect; + BLI_rcti_init(&rect, 0, get_width(), 0, get_height()); + + MemoryBuffer *result = new MemoryBuffer(get_output_socket()->get_data_type(), rect); + generate_denoise(result, input); + + return result; +} + void DenoisePrefilterOperation::generate_denoise(MemoryBuffer *output, MemoryBuffer *input) { - if (input->is_a_single_elem()) { - copy_v4_v4(output->get_elem(0, 0), input->get_elem(0, 0)); - return; - } - BLI_assert(COM_is_denoise_supported()); + /* Denoising needs full buffers. */ + MemoryBuffer *input_buf = input->is_a_single_elem() ? input->inflate() : input; + DenoiseFilter filter; filter.init_and_lock_denoiser(this, output); - filter.set_image(image_name_, input); + filter.set_image(image_name_, input_buf); filter.execute(); filter.deinit_and_unlock_denoiser(); + + /* Delete inflated buffers. */ + if (input->is_a_single_elem()) { + delete input_buf; + } } void DenoisePrefilterOperation::update_memory_buffer(MemoryBuffer *output, diff --git a/source/blender/compositor/operations/COM_DenoiseOperation.h b/source/blender/compositor/operations/COM_DenoiseOperation.h index 4aa4a1eb6c8..156ac5eacbb 100644 --- a/source/blender/compositor/operations/COM_DenoiseOperation.h +++ b/source/blender/compositor/operations/COM_DenoiseOperation.h @@ -4,14 +4,14 @@ #pragma once -#include "COM_NodeOperation.h" +#include "COM_SingleThreadedOperation.h" #include "DNA_node_types.h" namespace blender::compositor { bool COM_is_denoise_supported(); -class DenoiseBaseOperation : public NodeOperation { +class DenoiseBaseOperation : public SingleThreadedOperation { protected: bool output_rendered_; @@ -19,11 +19,22 @@ class DenoiseBaseOperation : public NodeOperation { DenoiseBaseOperation(); public: + bool determine_depending_area_of_interest(rcti *input, + ReadBufferOperation *read_operation, + rcti *output) override; + void get_area_of_interest(int input_idx, const rcti &output_area, rcti &r_input_area) override; }; class DenoiseOperation : public DenoiseBaseOperation { private: + /** + * \brief Cached reference to the input programs + */ + SocketReader *input_program_color_; + SocketReader *input_program_albedo_; + SocketReader *input_program_normal_; + /** * \brief settings of the denoise node. */ @@ -31,6 +42,15 @@ class DenoiseOperation : public DenoiseBaseOperation { public: DenoiseOperation(); + /** + * Initialize the execution + */ + void init_execution() override; + + /** + * Deinitialize the execution + */ + void deinit_execution() override; void set_denoise_settings(const NodeDenoise *settings) { @@ -48,6 +68,8 @@ class DenoiseOperation : public DenoiseBaseOperation { MemoryBuffer *input_normal, MemoryBuffer *input_albedo, const NodeDenoise *settings); + + MemoryBuffer *create_memory_buffer(rcti *rect) override; }; class DenoisePrefilterOperation : public DenoiseBaseOperation { @@ -68,6 +90,7 @@ class DenoisePrefilterOperation : public DenoiseBaseOperation { protected: void hash_output_params() override; + MemoryBuffer *create_memory_buffer(rcti *rect) override; private: void generate_denoise(MemoryBuffer *output, MemoryBuffer *input); diff --git a/source/blender/compositor/operations/COM_DespeckleOperation.cc b/source/blender/compositor/operations/COM_DespeckleOperation.cc index 0dc4f72dfc4..c6585356af7 100644 --- a/source/blender/compositor/operations/COM_DespeckleOperation.cc +++ b/source/blender/compositor/operations/COM_DespeckleOperation.cc @@ -14,8 +14,21 @@ DespeckleOperation::DespeckleOperation() this->add_input_socket(DataType::Value); this->add_output_socket(DataType::Color); this->set_canvas_input_index(0); + input_operation_ = nullptr; + flags_.complex = true; flags_.can_be_constant = true; } +void DespeckleOperation::init_execution() +{ + input_operation_ = this->get_input_socket_reader(0); + input_value_operation_ = this->get_input_socket_reader(1); +} + +void DespeckleOperation::deinit_execution() +{ + input_operation_ = nullptr; + input_value_operation_ = nullptr; +} BLI_INLINE int color_diff(const float a[3], const float b[3], const float threshold) { @@ -23,6 +36,105 @@ BLI_INLINE int color_diff(const float a[3], const float b[3], const float thresh (fabsf(a[2] - b[2]) > threshold)); } +void DespeckleOperation::execute_pixel(float output[4], int x, int y, void * /*data*/) +{ + float w = 0.0f; + float color_org[4]; + float color_mid[4]; + float color_mid_ok[4]; + float in1[4]; + int x1 = x - 1; + int x2 = x; + int x3 = x + 1; + int y1 = y - 1; + int y2 = y; + int y3 = y + 1; + CLAMP(x1, 0, get_width() - 1); + CLAMP(x2, 0, get_width() - 1); + CLAMP(x3, 0, get_width() - 1); + CLAMP(y1, 0, get_height() - 1); + CLAMP(y2, 0, get_height() - 1); + CLAMP(y3, 0, get_height() - 1); + float value[4]; + input_value_operation_->read(value, x2, y2, nullptr); + // const float mval = 1.0f - value[0]; + + input_operation_->read(color_org, x2, y2, nullptr); + +#define TOT_DIV_ONE 1.0f +#define TOT_DIV_CNR float(M_SQRT1_2) + +#define WTOT (TOT_DIV_ONE * 4 + TOT_DIV_CNR * 4) + +#define COLOR_ADD(fac) \ + { \ + madd_v4_v4fl(color_mid, in1, fac); \ + if (color_diff(in1, color_org, threshold_)) { \ + w += fac; \ + madd_v4_v4fl(color_mid_ok, in1, fac); \ + } \ + } + + zero_v4(color_mid); + zero_v4(color_mid_ok); + + input_operation_->read(in1, x1, y1, nullptr); + COLOR_ADD(TOT_DIV_CNR) + input_operation_->read(in1, x2, y1, nullptr); + COLOR_ADD(TOT_DIV_ONE) + input_operation_->read(in1, x3, y1, nullptr); + COLOR_ADD(TOT_DIV_CNR) + input_operation_->read(in1, x1, y2, nullptr); + COLOR_ADD(TOT_DIV_ONE) + +#if 0 + input_operation_->read(in2, x2, y2, nullptr); + madd_v4_v4fl(color_mid, in2, filter_[4]); +#endif + + input_operation_->read(in1, x3, y2, nullptr); + COLOR_ADD(TOT_DIV_ONE) + input_operation_->read(in1, x1, y3, nullptr); + COLOR_ADD(TOT_DIV_CNR) + input_operation_->read(in1, x2, y3, nullptr); + COLOR_ADD(TOT_DIV_ONE) + input_operation_->read(in1, x3, y3, nullptr); + COLOR_ADD(TOT_DIV_CNR) + + mul_v4_fl(color_mid, 1.0f / (4.0f + (4.0f * float(M_SQRT1_2)))); + // mul_v4_fl(color_mid, 1.0f / w); + + if ((w != 0.0f) && ((w / WTOT) > (threshold_neighbor_)) && + color_diff(color_mid, color_org, threshold_)) + { + mul_v4_fl(color_mid_ok, 1.0f / w); + interp_v4_v4v4(output, color_org, color_mid_ok, value[0]); + } + else { + copy_v4_v4(output, color_org); + } + +#undef TOT_DIV_ONE +#undef TOT_DIV_CNR +#undef WTOT +#undef COLOR_ADD +} + +bool DespeckleOperation::determine_depending_area_of_interest(rcti *input, + ReadBufferOperation *read_operation, + rcti *output) +{ + rcti new_input; + int addx = 2; //(filter_width_ - 1) / 2 + 1; + int addy = 2; //(filter_height_ - 1) / 2 + 1; + new_input.xmax = input->xmax + addx; + new_input.xmin = input->xmin - addx; + new_input.ymax = input->ymax + addy; + new_input.ymin = input->ymin - addy; + + return NodeOperation::determine_depending_area_of_interest(&new_input, read_operation, output); +} + void DespeckleOperation::get_area_of_interest(const int input_idx, const rcti &output_area, rcti &r_input_area) diff --git a/source/blender/compositor/operations/COM_DespeckleOperation.h b/source/blender/compositor/operations/COM_DespeckleOperation.h index b0c307f9d92..ca726ad025f 100644 --- a/source/blender/compositor/operations/COM_DespeckleOperation.h +++ b/source/blender/compositor/operations/COM_DespeckleOperation.h @@ -19,8 +19,16 @@ class DespeckleOperation : public MultiThreadedOperation { // int filter_width_; // int filter_height_; + protected: + SocketReader *input_operation_; + SocketReader *input_value_operation_; + public: DespeckleOperation(); + bool determine_depending_area_of_interest(rcti *input, + ReadBufferOperation *read_operation, + rcti *output) override; + void execute_pixel(float output[4], int x, int y, void *data) override; void set_threshold(float threshold) { @@ -31,6 +39,9 @@ class DespeckleOperation : public MultiThreadedOperation { threshold_neighbor_ = threshold; } + void init_execution() override; + void deinit_execution() override; + void get_area_of_interest(int input_idx, const rcti &output_area, rcti &r_input_area) override; void update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, diff --git a/source/blender/compositor/operations/COM_DifferenceMatteOperation.cc b/source/blender/compositor/operations/COM_DifferenceMatteOperation.cc index 0b4bfd511bd..08c3a380978 100644 --- a/source/blender/compositor/operations/COM_DifferenceMatteOperation.cc +++ b/source/blender/compositor/operations/COM_DifferenceMatteOperation.cc @@ -12,9 +12,66 @@ DifferenceMatteOperation::DifferenceMatteOperation() add_input_socket(DataType::Color); add_output_socket(DataType::Value); + input_image1_program_ = nullptr; + input_image2_program_ = nullptr; flags_.can_be_constant = true; } +void DifferenceMatteOperation::init_execution() +{ + input_image1_program_ = this->get_input_socket_reader(0); + input_image2_program_ = this->get_input_socket_reader(1); +} +void DifferenceMatteOperation::deinit_execution() +{ + input_image1_program_ = nullptr; + input_image2_program_ = nullptr; +} + +void DifferenceMatteOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float in_color1[4]; + float in_color2[4]; + + const float tolerance = settings_->t1; + const float falloff = settings_->t2; + float difference; + float alpha; + + input_image1_program_->read_sampled(in_color1, x, y, sampler); + input_image2_program_->read_sampled(in_color2, x, y, sampler); + + difference = (fabsf(in_color2[0] - in_color1[0]) + fabsf(in_color2[1] - in_color1[1]) + + fabsf(in_color2[2] - in_color1[2])); + + /* average together the distances */ + difference = difference / 3.0f; + + /* make 100% transparent */ + if (difference <= tolerance) { + output[0] = 0.0f; + } + /* In the falloff region, make partially transparent. */ + else if (difference <= falloff + tolerance) { + difference = difference - tolerance; + alpha = difference / falloff; + /* Only change if more transparent than before. */ + if (alpha < in_color1[3]) { + output[0] = alpha; + } + else { /* leave as before */ + output[0] = in_color1[3]; + } + } + else { + /* foreground object */ + output[0] = in_color1[3]; + } +} + void DifferenceMatteOperation::update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span inputs) diff --git a/source/blender/compositor/operations/COM_DifferenceMatteOperation.h b/source/blender/compositor/operations/COM_DifferenceMatteOperation.h index ab306d95249..92edba3d17f 100644 --- a/source/blender/compositor/operations/COM_DifferenceMatteOperation.h +++ b/source/blender/compositor/operations/COM_DifferenceMatteOperation.h @@ -15,10 +15,23 @@ namespace blender::compositor { class DifferenceMatteOperation : public MultiThreadedOperation { private: NodeChroma *settings_; + SocketReader *input_image1_program_; + SocketReader *input_image2_program_; public: + /** + * Default constructor + */ DifferenceMatteOperation(); + /** + * The inner loop of this operation. + */ + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + + void init_execution() override; + void deinit_execution() override; + void set_settings(NodeChroma *node_chroma) { settings_ = node_chroma; diff --git a/source/blender/compositor/operations/COM_DilateErodeOperation.cc b/source/blender/compositor/operations/COM_DilateErodeOperation.cc index e2b2f0696fa..4d932daf34d 100644 --- a/source/blender/compositor/operations/COM_DilateErodeOperation.cc +++ b/source/blender/compositor/operations/COM_DilateErodeOperation.cc @@ -3,6 +3,7 @@ * SPDX-License-Identifier: GPL-2.0-or-later */ #include "COM_DilateErodeOperation.h" +#include "COM_OpenCLDevice.h" namespace blender::compositor { @@ -10,7 +11,9 @@ DilateErodeThresholdOperation::DilateErodeThresholdOperation() { this->add_input_socket(DataType::Value); this->add_output_socket(DataType::Value); + flags_.complex = true; flags_.can_be_constant = true; + input_program_ = nullptr; inset_ = 0.0f; switch_ = 0.5f; distance_ = 0.0f; @@ -34,6 +37,117 @@ void DilateErodeThresholdOperation::init_data() } } +void DilateErodeThresholdOperation::init_execution() +{ + input_program_ = this->get_input_socket_reader(0); +} + +void *DilateErodeThresholdOperation::initialize_tile_data(rcti * /*rect*/) +{ + void *buffer = input_program_->initialize_tile_data(nullptr); + return buffer; +} + +void DilateErodeThresholdOperation::execute_pixel(float output[4], int x, int y, void *data) +{ + float input_value[4]; + const float sw = switch_; + const float distance = distance_; + float pixelvalue; + const float rd = scope_ * scope_; + const float inset = inset_; + float mindist = rd * 2; + + MemoryBuffer *input_buffer = (MemoryBuffer *)data; + float *buffer = input_buffer->get_buffer(); + const rcti &input_rect = input_buffer->get_rect(); + const int minx = std::max(x - scope_, input_rect.xmin); + const int miny = std::max(y - scope_, input_rect.ymin); + const int maxx = std::min(x + scope_, input_rect.xmax); + const int maxy = std::min(y + scope_, input_rect.ymax); + const int buffer_width = input_buffer->get_width(); + int offset; + + input_buffer->read(input_value, x, y); + if (input_value[0] > sw) { + for (int yi = miny; yi < maxy; yi++) { + const float dy = yi - y; + offset = ((yi - input_rect.ymin) * buffer_width + (minx - input_rect.xmin)); + for (int xi = minx; xi < maxx; xi++) { + if (buffer[offset] < sw) { + const float dx = xi - x; + const float dis = dx * dx + dy * dy; + mindist = std::min(mindist, dis); + } + offset++; + } + } + pixelvalue = -sqrtf(mindist); + } + else { + for (int yi = miny; yi < maxy; yi++) { + const float dy = yi - y; + offset = ((yi - input_rect.ymin) * buffer_width + (minx - input_rect.xmin)); + for (int xi = minx; xi < maxx; xi++) { + if (buffer[offset] > sw) { + const float dx = xi - x; + const float dis = dx * dx + dy * dy; + mindist = std::min(mindist, dis); + } + offset++; + } + } + pixelvalue = sqrtf(mindist); + } + + if (distance > 0.0f) { + const float delta = distance - pixelvalue; + if (delta >= 0.0f) { + if (delta >= inset) { + output[0] = 1.0f; + } + else { + output[0] = delta / inset; + } + } + else { + output[0] = 0.0f; + } + } + else { + const float delta = -distance + pixelvalue; + if (delta < 0.0f) { + if (delta < -inset) { + output[0] = 1.0f; + } + else { + output[0] = (-delta) / inset; + } + } + else { + output[0] = 0.0f; + } + } +} + +void DilateErodeThresholdOperation::deinit_execution() +{ + input_program_ = nullptr; +} + +bool DilateErodeThresholdOperation::determine_depending_area_of_interest( + rcti *input, ReadBufferOperation *read_operation, rcti *output) +{ + rcti new_input; + + new_input.xmax = input->xmax + scope_; + new_input.xmin = input->xmin - scope_; + new_input.ymax = input->ymax + scope_; + new_input.ymin = input->ymin - scope_; + + return NodeOperation::determine_depending_area_of_interest(&new_input, read_operation, output); +} + void DilateErodeThresholdOperation::get_area_of_interest(const int input_idx, const rcti &output_area, rcti &r_input_area) @@ -144,7 +258,10 @@ DilateDistanceOperation::DilateDistanceOperation() { this->add_input_socket(DataType::Value); this->add_output_socket(DataType::Value); + input_program_ = nullptr; distance_ = 0.0f; + flags_.complex = true; + flags_.open_cl = true; flags_.can_be_constant = true; } @@ -156,6 +273,91 @@ void DilateDistanceOperation::init_data() } } +void DilateDistanceOperation::init_execution() +{ + input_program_ = this->get_input_socket_reader(0); +} + +void *DilateDistanceOperation::initialize_tile_data(rcti * /*rect*/) +{ + void *buffer = input_program_->initialize_tile_data(nullptr); + return buffer; +} + +void DilateDistanceOperation::execute_pixel(float output[4], int x, int y, void *data) +{ + const float distance = distance_; + const float mindist = distance * distance; + + MemoryBuffer *input_buffer = (MemoryBuffer *)data; + float *buffer = input_buffer->get_buffer(); + const rcti &input_rect = input_buffer->get_rect(); + const int minx = std::max(x - scope_, input_rect.xmin); + const int miny = std::max(y - scope_, input_rect.ymin); + const int maxx = std::min(x + scope_, input_rect.xmax); + const int maxy = std::min(y + scope_, input_rect.ymax); + const int buffer_width = input_buffer->get_width(); + int offset; + + float value = 0.0f; + + for (int yi = miny; yi < maxy; yi++) { + const float dy = yi - y; + offset = ((yi - input_rect.ymin) * buffer_width + (minx - input_rect.xmin)); + for (int xi = minx; xi < maxx; xi++) { + const float dx = xi - x; + const float dis = dx * dx + dy * dy; + if (dis <= mindist) { + value = std::max(buffer[offset], value); + } + offset++; + } + } + output[0] = value; +} + +void DilateDistanceOperation::deinit_execution() +{ + input_program_ = nullptr; +} + +bool DilateDistanceOperation::determine_depending_area_of_interest( + rcti *input, ReadBufferOperation *read_operation, rcti *output) +{ + rcti new_input; + + new_input.xmax = input->xmax + scope_; + new_input.xmin = input->xmin - scope_; + new_input.ymax = input->ymax + scope_; + new_input.ymin = input->ymin - scope_; + + return NodeOperation::determine_depending_area_of_interest(&new_input, read_operation, output); +} + +void DilateDistanceOperation::execute_opencl(OpenCLDevice *device, + MemoryBuffer *output_memory_buffer, + cl_mem cl_output_buffer, + MemoryBuffer **input_memory_buffers, + std::list *cl_mem_to_clean_up, + std::list * /*cl_kernels_to_clean_up*/) +{ + cl_kernel dilate_kernel = device->COM_cl_create_kernel("dilate_kernel", nullptr); + + cl_int distance_squared = distance_ * distance_; + cl_int scope = scope_; + + device->COM_cl_attach_memory_buffer_to_kernel_parameter( + dilate_kernel, 0, 2, cl_mem_to_clean_up, input_memory_buffers, input_program_); + device->COM_cl_attach_output_memory_buffer_to_kernel_parameter( + dilate_kernel, 1, cl_output_buffer); + device->COM_cl_attach_memory_buffer_offset_to_kernel_parameter( + dilate_kernel, 3, output_memory_buffer); + clSetKernelArg(dilate_kernel, 4, sizeof(cl_int), &scope); + clSetKernelArg(dilate_kernel, 5, sizeof(cl_int), &distance_squared); + device->COM_cl_attach_size_to_kernel_parameter(dilate_kernel, 6, this); + device->COM_cl_enqueue_range(dilate_kernel, output_memory_buffer, 7, this); +} + void DilateDistanceOperation::get_area_of_interest(const int input_idx, const rcti &output_area, rcti &r_input_area) @@ -247,6 +449,62 @@ ErodeDistanceOperation::ErodeDistanceOperation() : DilateDistanceOperation() /* pass */ } +void ErodeDistanceOperation::execute_pixel(float output[4], int x, int y, void *data) +{ + const float distance = distance_; + const float mindist = distance * distance; + + MemoryBuffer *input_buffer = (MemoryBuffer *)data; + float *buffer = input_buffer->get_buffer(); + const rcti &input_rect = input_buffer->get_rect(); + const int minx = std::max(x - scope_, input_rect.xmin); + const int miny = std::max(y - scope_, input_rect.ymin); + const int maxx = std::min(x + scope_, input_rect.xmax); + const int maxy = std::min(y + scope_, input_rect.ymax); + const int buffer_width = input_buffer->get_width(); + int offset; + + float value = 1.0f; + + for (int yi = miny; yi < maxy; yi++) { + const float dy = yi - y; + offset = ((yi - input_rect.ymin) * buffer_width + (minx - input_rect.xmin)); + for (int xi = minx; xi < maxx; xi++) { + const float dx = xi - x; + const float dis = dx * dx + dy * dy; + if (dis <= mindist) { + value = std::min(buffer[offset], value); + } + offset++; + } + } + output[0] = value; +} + +void ErodeDistanceOperation::execute_opencl(OpenCLDevice *device, + MemoryBuffer *output_memory_buffer, + cl_mem cl_output_buffer, + MemoryBuffer **input_memory_buffers, + std::list *cl_mem_to_clean_up, + std::list * /*cl_kernels_to_clean_up*/) +{ + cl_kernel erode_kernel = device->COM_cl_create_kernel("erode_kernel", nullptr); + + cl_int distance_squared = distance_ * distance_; + cl_int scope = scope_; + + device->COM_cl_attach_memory_buffer_to_kernel_parameter( + erode_kernel, 0, 2, cl_mem_to_clean_up, input_memory_buffers, input_program_); + device->COM_cl_attach_output_memory_buffer_to_kernel_parameter( + erode_kernel, 1, cl_output_buffer); + device->COM_cl_attach_memory_buffer_offset_to_kernel_parameter( + erode_kernel, 3, output_memory_buffer); + clSetKernelArg(erode_kernel, 4, sizeof(cl_int), &scope); + clSetKernelArg(erode_kernel, 5, sizeof(cl_int), &distance_squared); + device->COM_cl_attach_size_to_kernel_parameter(erode_kernel, 6, this); + device->COM_cl_enqueue_range(erode_kernel, output_memory_buffer, 7, this); +} + void ErodeDistanceOperation::update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span inputs) @@ -262,6 +520,156 @@ DilateStepOperation::DilateStepOperation() { this->add_input_socket(DataType::Value); this->add_output_socket(DataType::Value); + flags_.complex = true; + input_program_ = nullptr; +} +void DilateStepOperation::init_execution() +{ + input_program_ = this->get_input_socket_reader(0); +} + +/* Small helper to pass data from initialize_tile_data to execute_pixel. */ +struct tile_info { + rcti rect; + int width; + float *buffer; +}; + +static tile_info *create_cache(int xmin, int xmax, int ymin, int ymax) +{ + tile_info *result = (tile_info *)MEM_mallocN(sizeof(tile_info), "dilate erode tile"); + result->rect.xmin = xmin; + result->rect.xmax = xmax; + result->rect.ymin = ymin; + result->rect.ymax = ymax; + result->width = xmax - xmin; + result->buffer = (float *)MEM_callocN(sizeof(float) * (ymax - ymin) * result->width, + "dilate erode cache"); + return result; +} + +void *DilateStepOperation::initialize_tile_data(rcti *rect) +{ + MemoryBuffer *tile = (MemoryBuffer *)input_program_->initialize_tile_data(nullptr); + int x, y, i; + int width = tile->get_width(); + int height = tile->get_height(); + float *buffer = tile->get_buffer(); + + int half_window = iterations_; + int window = half_window * 2 + 1; + + int xmin = std::max(0, rect->xmin - half_window); + int ymin = std::max(0, rect->ymin - half_window); + int xmax = std::min(width, rect->xmax + half_window); + int ymax = std::min(height, rect->ymax + half_window); + + int bwidth = rect->xmax - rect->xmin; + int bheight = rect->ymax - rect->ymin; + + /* NOTE: Cache buffer has original tile-size width, but new height. + * We have to calculate the additional rows in the first pass, + * to have valid data available for the second pass. */ + tile_info *result = create_cache(rect->xmin, rect->xmax, ymin, ymax); + float *rectf = result->buffer; + + /* temp holds maxima for every step in the algorithm, buf holds a + * single row or column of input values, padded with FLT_MAX's to + * simplify the logic. */ + float *temp = (float *)MEM_mallocN(sizeof(float) * (2 * window - 1), "dilate erode temp"); + float *buf = (float *)MEM_mallocN(sizeof(float) * (std::max(bwidth, bheight) + 5 * half_window), + "dilate erode buf"); + + /* The following is based on the van Herk/Gil-Werman algorithm for morphology operations. + * first pass, horizontal dilate/erode. */ + for (y = ymin; y < ymax; y++) { + for (x = 0; x < bwidth + 5 * half_window; x++) { + buf[x] = -FLT_MAX; + } + for (x = xmin; x < xmax; x++) { + buf[x - rect->xmin + window - 1] = buffer[(y * width + x)]; + } + + for (i = 0; i < (bwidth + 3 * half_window) / window; i++) { + int start = (i + 1) * window - 1; + + temp[window - 1] = buf[start]; + for (x = 1; x < window; x++) { + temp[window - 1 - x] = std::max(temp[window - x], buf[start - x]); + temp[window - 1 + x] = std::max(temp[window + x - 2], buf[start + x]); + } + + start = half_window + (i - 1) * window + 1; + for (x = -std::min(0, start); x < window - std::max(0, start + window - bwidth); x++) { + rectf[bwidth * (y - ymin) + (start + x)] = std::max(temp[x], temp[x + window - 1]); + } + } + } + + /* Second pass, vertical dilate/erode. */ + for (x = 0; x < bwidth; x++) { + for (y = 0; y < bheight + 5 * half_window; y++) { + buf[y] = -FLT_MAX; + } + for (y = ymin; y < ymax; y++) { + buf[y - rect->ymin + window - 1] = rectf[(y - ymin) * bwidth + x]; + } + + for (i = 0; i < (bheight + 3 * half_window) / window; i++) { + int start = (i + 1) * window - 1; + + temp[window - 1] = buf[start]; + for (y = 1; y < window; y++) { + temp[window - 1 - y] = std::max(temp[window - y], buf[start - y]); + temp[window - 1 + y] = std::max(temp[window + y - 2], buf[start + y]); + } + + start = half_window + (i - 1) * window + 1; + for (y = -std::min(0, start); y < window - std::max(0, start + window - bheight); y++) { + rectf[bwidth * (y + start + (rect->ymin - ymin)) + x] = std::max(temp[y], + temp[y + window - 1]); + } + } + } + + MEM_freeN(temp); + MEM_freeN(buf); + + return result; +} + +void DilateStepOperation::execute_pixel(float output[4], int x, int y, void *data) +{ + tile_info *tile = (tile_info *)data; + int nx = x - tile->rect.xmin; + int ny = y - tile->rect.ymin; + output[0] = tile->buffer[tile->width * ny + nx]; +} + +void DilateStepOperation::deinit_execution() +{ + input_program_ = nullptr; +} + +void DilateStepOperation::deinitialize_tile_data(rcti * /*rect*/, void *data) +{ + tile_info *tile = (tile_info *)data; + MEM_freeN(tile->buffer); + MEM_freeN(tile); +} + +bool DilateStepOperation::determine_depending_area_of_interest(rcti *input, + ReadBufferOperation *read_operation, + rcti *output) +{ + rcti new_input; + int it = iterations_; + new_input.xmax = input->xmax + it; + new_input.xmin = input->xmin - it; + new_input.ymax = input->ymax + it; + new_input.ymin = input->ymin - it; + + return NodeOperation::determine_depending_area_of_interest(&new_input, read_operation, output); } void DilateStepOperation::get_area_of_interest(const int input_idx, @@ -390,6 +798,96 @@ ErodeStepOperation::ErodeStepOperation() : DilateStepOperation() /* pass */ } +void *ErodeStepOperation::initialize_tile_data(rcti *rect) +{ + MemoryBuffer *tile = (MemoryBuffer *)input_program_->initialize_tile_data(nullptr); + int x, y, i; + int width = tile->get_width(); + int height = tile->get_height(); + float *buffer = tile->get_buffer(); + + int half_window = iterations_; + int window = half_window * 2 + 1; + + int xmin = std::max(0, rect->xmin - half_window); + int ymin = std::max(0, rect->ymin - half_window); + int xmax = std::min(width, rect->xmax + half_window); + int ymax = std::min(height, rect->ymax + half_window); + + int bwidth = rect->xmax - rect->xmin; + int bheight = rect->ymax - rect->ymin; + + /* NOTE: Cache buffer has original tile-size width, but new height. + * We have to calculate the additional rows in the first pass, + * to have valid data available for the second pass. */ + tile_info *result = create_cache(rect->xmin, rect->xmax, ymin, ymax); + float *rectf = result->buffer; + + /* temp holds maxima for every step in the algorithm, buf holds a + * single row or column of input values, padded with FLT_MAX's to + * simplify the logic. */ + float *temp = (float *)MEM_mallocN(sizeof(float) * (2 * window - 1), "dilate erode temp"); + float *buf = (float *)MEM_mallocN(sizeof(float) * (std::max(bwidth, bheight) + 5 * half_window), + "dilate erode buf"); + + /* The following is based on the van Herk/Gil-Werman algorithm for morphology operations. + * first pass, horizontal dilate/erode */ + for (y = ymin; y < ymax; y++) { + for (x = 0; x < bwidth + 5 * half_window; x++) { + buf[x] = FLT_MAX; + } + for (x = xmin; x < xmax; x++) { + buf[x - rect->xmin + window - 1] = buffer[(y * width + x)]; + } + + for (i = 0; i < (bwidth + 3 * half_window) / window; i++) { + int start = (i + 1) * window - 1; + + temp[window - 1] = buf[start]; + for (x = 1; x < window; x++) { + temp[window - 1 - x] = std::min(temp[window - x], buf[start - x]); + temp[window - 1 + x] = std::min(temp[window + x - 2], buf[start + x]); + } + + start = half_window + (i - 1) * window + 1; + for (x = -std::min(0, start); x < window - std::max(0, start + window - bwidth); x++) { + rectf[bwidth * (y - ymin) + (start + x)] = std::min(temp[x], temp[x + window - 1]); + } + } + } + + /* Second pass, vertical dilate/erode. */ + for (x = 0; x < bwidth; x++) { + for (y = 0; y < bheight + 5 * half_window; y++) { + buf[y] = FLT_MAX; + } + for (y = ymin; y < ymax; y++) { + buf[y - rect->ymin + window - 1] = rectf[(y - ymin) * bwidth + x]; + } + + for (i = 0; i < (bheight + 3 * half_window) / window; i++) { + int start = (i + 1) * window - 1; + + temp[window - 1] = buf[start]; + for (y = 1; y < window; y++) { + temp[window - 1 - y] = std::min(temp[window - y], buf[start - y]); + temp[window - 1 + y] = std::min(temp[window + y - 2], buf[start + y]); + } + + start = half_window + (i - 1) * window + 1; + for (y = -std::min(0, start); y < window - std::max(0, start + window - bheight); y++) { + rectf[bwidth * (y + start + (rect->ymin - ymin)) + x] = std::min(temp[y], + temp[y + window - 1]); + } + } + } + + MEM_freeN(temp); + MEM_freeN(buf); + + return result; +} + struct Min2Selector { float operator()(float f1, float f2) const { diff --git a/source/blender/compositor/operations/COM_DilateErodeOperation.h b/source/blender/compositor/operations/COM_DilateErodeOperation.h index 15895a40da6..817f2940a38 100644 --- a/source/blender/compositor/operations/COM_DilateErodeOperation.h +++ b/source/blender/compositor/operations/COM_DilateErodeOperation.h @@ -13,6 +13,11 @@ class DilateErodeThresholdOperation : public MultiThreadedOperation { struct PixelData; private: + /** + * Cached reference to the input_program + */ + SocketReader *input_program_; + float distance_; float switch_; float inset_; @@ -27,7 +32,22 @@ class DilateErodeThresholdOperation : public MultiThreadedOperation { /* DilateErode Distance Threshold */ DilateErodeThresholdOperation(); + /** + * The inner loop of this operation. + */ + void execute_pixel(float output[4], int x, int y, void *data) override; + void init_data() override; + /** + * Initialize the execution + */ + void init_execution() override; + + void *initialize_tile_data(rcti *rect) override; + /** + * Deinitialize the execution + */ + void deinit_execution() override; void set_distance(float distance) { @@ -42,6 +62,10 @@ class DilateErodeThresholdOperation : public MultiThreadedOperation { inset_ = inset; } + bool determine_depending_area_of_interest(rcti *input, + ReadBufferOperation *read_operation, + rcti *output) override; + void get_area_of_interest(int input_idx, const rcti &output_area, rcti &r_input_area) override; void update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, @@ -53,6 +77,10 @@ class DilateDistanceOperation : public MultiThreadedOperation { struct PixelData; protected: + /** + * Cached reference to the input_program + */ + SocketReader *input_program_; float distance_; int scope_; @@ -60,12 +88,38 @@ class DilateDistanceOperation : public MultiThreadedOperation { /* Dilate Distance. */ DilateDistanceOperation(); + /** + * The inner loop of this operation. + */ + void execute_pixel(float output[4], int x, int y, void *data) override; + void init_data() override; + /** + * Initialize the execution + */ + void init_execution() override; + + void *initialize_tile_data(rcti *rect) override; + /** + * Deinitialize the execution + */ + void deinit_execution() override; void set_distance(float distance) { distance_ = distance; } + bool determine_depending_area_of_interest(rcti *input, + ReadBufferOperation *read_operation, + rcti *output) override; + + void execute_opencl(OpenCLDevice *device, + MemoryBuffer *output_memory_buffer, + cl_mem cl_output_buffer, + MemoryBuffer **input_memory_buffers, + std::list *cl_mem_to_clean_up, + std::list *cl_kernels_to_clean_up) override; + void get_area_of_interest(int input_idx, const rcti &output_area, rcti &r_input_area) final; virtual void update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, @@ -77,6 +131,18 @@ class ErodeDistanceOperation : public DilateDistanceOperation { /* Erode Distance */ ErodeDistanceOperation(); + /** + * The inner loop of this operation. + */ + void execute_pixel(float output[4], int x, int y, void *data) override; + + void execute_opencl(OpenCLDevice *device, + MemoryBuffer *output_memory_buffer, + cl_mem cl_output_buffer, + MemoryBuffer **input_memory_buffers, + std::list *cl_mem_to_clean_up, + std::list *cl_kernels_to_clean_up) override; + void update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span inputs) override; @@ -84,17 +150,43 @@ class ErodeDistanceOperation : public DilateDistanceOperation { class DilateStepOperation : public MultiThreadedOperation { protected: + /** + * Cached reference to the input_program + */ + SocketReader *input_program_; + int iterations_; public: /* Dilate step */ DilateStepOperation(); + /** + * The inner loop of this operation. + */ + void execute_pixel(float output[4], int x, int y, void *data) override; + + /** + * Initialize the execution + */ + void init_execution() override; + + void *initialize_tile_data(rcti *rect) override; + /** + * Deinitialize the execution + */ + void deinit_execution() override; + void deinitialize_tile_data(rcti *rect, void *data) override; + void set_iterations(int iterations) { iterations_ = iterations; } + bool determine_depending_area_of_interest(rcti *input, + ReadBufferOperation *read_operation, + rcti *output) override; + void get_area_of_interest(int input_idx, const rcti &output_area, rcti &r_input_area) final; virtual void update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, @@ -106,6 +198,7 @@ class ErodeStepOperation : public DilateStepOperation { /** Erode step. */ ErodeStepOperation(); + void *initialize_tile_data(rcti *rect) override; void update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span inputs) override; diff --git a/source/blender/compositor/operations/COM_DirectionalBlurOperation.cc b/source/blender/compositor/operations/COM_DirectionalBlurOperation.cc index 4e4315272c4..0191ee70057 100644 --- a/source/blender/compositor/operations/COM_DirectionalBlurOperation.cc +++ b/source/blender/compositor/operations/COM_DirectionalBlurOperation.cc @@ -3,6 +3,7 @@ * SPDX-License-Identifier: GPL-2.0-or-later */ #include "COM_DirectionalBlurOperation.h" +#include "COM_OpenCLDevice.h" namespace blender::compositor { @@ -10,11 +11,15 @@ DirectionalBlurOperation::DirectionalBlurOperation() { this->add_input_socket(DataType::Color); this->add_output_socket(DataType::Color); + flags_.complex = true; + flags_.open_cl = true; flags_.can_be_constant = true; + input_program_ = nullptr; } void DirectionalBlurOperation::init_execution() { + input_program_ = get_input_socket_reader(0); QualityStepHelper::init_execution(COM_QH_INCREASE); const float angle = data_->angle; const float zoom = data_->zoom; @@ -40,6 +45,90 @@ void DirectionalBlurOperation::init_execution() rot_ = itsc * spin; } +void DirectionalBlurOperation::execute_pixel(float output[4], int x, int y, void * /*data*/) +{ + const int iterations = pow(2.0f, data_->iter); + float col[4] = {0.0f, 0.0f, 0.0f, 0.0f}; + float col2[4] = {0.0f, 0.0f, 0.0f, 0.0f}; + input_program_->read_sampled(col2, x, y, PixelSampler::Bilinear); + float ltx = tx_; + float lty = ty_; + float lsc = sc_; + float lrot = rot_; + /* blur the image */ + for (int i = 0; i < iterations; i++) { + const float cs = cosf(lrot), ss = sinf(lrot); + const float isc = 1.0f / (1.0f + lsc); + + const float v = isc * (y - center_y_pix_) + lty; + const float u = isc * (x - center_x_pix_) + ltx; + + input_program_->read_sampled(col, + cs * u + ss * v + center_x_pix_, + cs * v - ss * u + center_y_pix_, + PixelSampler::Bilinear); + + add_v4_v4(col2, col); + + /* double transformations */ + ltx += tx_; + lty += ty_; + lrot += rot_; + lsc += sc_; + } + + mul_v4_v4fl(output, col2, 1.0f / (iterations + 1)); +} + +void DirectionalBlurOperation::execute_opencl(OpenCLDevice *device, + MemoryBuffer *output_memory_buffer, + cl_mem cl_output_buffer, + MemoryBuffer **input_memory_buffers, + std::list *cl_mem_to_clean_up, + std::list * /*cl_kernels_to_clean_up*/) +{ + cl_kernel directional_blur_kernel = device->COM_cl_create_kernel("directional_blur_kernel", + nullptr); + + cl_int iterations = pow(2.0f, data_->iter); + cl_float2 ltxy = {{tx_, ty_}}; + cl_float2 centerpix = {{center_x_pix_, center_y_pix_}}; + cl_float lsc = sc_; + cl_float lrot = rot_; + + device->COM_cl_attach_memory_buffer_to_kernel_parameter( + directional_blur_kernel, 0, -1, cl_mem_to_clean_up, input_memory_buffers, input_program_); + device->COM_cl_attach_output_memory_buffer_to_kernel_parameter( + directional_blur_kernel, 1, cl_output_buffer); + device->COM_cl_attach_memory_buffer_offset_to_kernel_parameter( + directional_blur_kernel, 2, output_memory_buffer); + clSetKernelArg(directional_blur_kernel, 3, sizeof(cl_int), &iterations); + clSetKernelArg(directional_blur_kernel, 4, sizeof(cl_float), &lsc); + clSetKernelArg(directional_blur_kernel, 5, sizeof(cl_float), &lrot); + clSetKernelArg(directional_blur_kernel, 6, sizeof(cl_float2), <xy); + clSetKernelArg(directional_blur_kernel, 7, sizeof(cl_float2), ¢erpix); + + device->COM_cl_enqueue_range(directional_blur_kernel, output_memory_buffer, 8, this); +} + +void DirectionalBlurOperation::deinit_execution() +{ + input_program_ = nullptr; +} + +bool DirectionalBlurOperation::determine_depending_area_of_interest( + rcti * /*input*/, ReadBufferOperation *read_operation, rcti *output) +{ + rcti new_input; + + new_input.xmax = this->get_width(); + new_input.xmin = 0; + new_input.ymax = this->get_height(); + new_input.ymin = 0; + + return NodeOperation::determine_depending_area_of_interest(&new_input, read_operation, output); +} + void DirectionalBlurOperation::get_area_of_interest(const int input_idx, const rcti & /*output_area*/, rcti &r_input_area) diff --git a/source/blender/compositor/operations/COM_DirectionalBlurOperation.h b/source/blender/compositor/operations/COM_DirectionalBlurOperation.h index b399c541558..a08f893bb18 100644 --- a/source/blender/compositor/operations/COM_DirectionalBlurOperation.h +++ b/source/blender/compositor/operations/COM_DirectionalBlurOperation.h @@ -11,6 +11,7 @@ namespace blender::compositor { class DirectionalBlurOperation : public MultiThreadedOperation, public QualityStepHelper { private: + SocketReader *input_program_; const NodeDBlurData *data_; float center_x_pix_, center_y_pix_; @@ -20,13 +21,37 @@ class DirectionalBlurOperation : public MultiThreadedOperation, public QualitySt public: DirectionalBlurOperation(); + /** + * The inner loop of this operation. + */ + void execute_pixel(float output[4], int x, int y, void *data) override; + + /** + * Initialize the execution + */ void init_execution() override; + /** + * Deinitialize the execution + */ + void deinit_execution() override; + + bool determine_depending_area_of_interest(rcti *input, + ReadBufferOperation *read_operation, + rcti *output) override; + void set_data(const NodeDBlurData *data) { data_ = data; } + void execute_opencl(OpenCLDevice *device, + MemoryBuffer *output_memory_buffer, + cl_mem cl_output_buffer, + MemoryBuffer **input_memory_buffers, + std::list *cl_mem_to_clean_up, + std::list *cl_kernels_to_clean_up) override; + void get_area_of_interest(int input_idx, const rcti &output_area, rcti &r_input_area) override; void update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, diff --git a/source/blender/compositor/operations/COM_DisplaceOperation.cc b/source/blender/compositor/operations/COM_DisplaceOperation.cc index 7be21ee796d..8dccb35bde8 100644 --- a/source/blender/compositor/operations/COM_DisplaceOperation.cc +++ b/source/blender/compositor/operations/COM_DisplaceOperation.cc @@ -13,12 +13,29 @@ DisplaceOperation::DisplaceOperation() this->add_input_socket(DataType::Value); this->add_input_socket(DataType::Value); this->add_output_socket(DataType::Color); + flags_.complex = true; flags_.can_be_constant = true; + + input_color_program_ = nullptr; } void DisplaceOperation::init_execution() { + input_color_program_ = this->get_input_socket_reader(0); NodeOperation *vector = this->get_input_socket_reader(1); + NodeOperation *scale_x = this->get_input_socket_reader(2); + NodeOperation *scale_y = this->get_input_socket_reader(3); + if (execution_model_ == eExecutionModel::Tiled) { + vector_read_fn_ = [=](float x, float y, float *out) { + vector->read_sampled(out, x, y, PixelSampler::Bilinear); + }; + scale_x_read_fn_ = [=](float x, float y, float *out) { + scale_x->read_sampled(out, x, y, PixelSampler::Nearest); + }; + scale_y_read_fn_ = [=](float x, float y, float *out) { + scale_y->read_sampled(out, x, y, PixelSampler::Nearest); + }; + } width_x4_ = this->get_width() * 4; height_x4_ = this->get_height() * 4; @@ -26,6 +43,24 @@ void DisplaceOperation::init_execution() input_vector_height_ = vector->get_height(); } +void DisplaceOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler /*sampler*/) +{ + float xy[2] = {x, y}; + float uv[2], deriv[2][2]; + + pixel_transform(xy, uv, deriv); + if (is_zero_v2(deriv[0]) && is_zero_v2(deriv[1])) { + input_color_program_->read_sampled(output, uv[0], uv[1], PixelSampler::Bilinear); + } + else { + /* EWA filtering (without nearest it gets blurry with NO distortion) */ + input_color_program_->read_filtered(output, uv[0], uv[1], deriv[0], deriv[1]); + } +} + bool DisplaceOperation::read_displacement( float x, float y, float xscale, float yscale, const float origin[2], float &r_u, float &r_v) { @@ -103,6 +138,58 @@ void DisplaceOperation::pixel_transform(const float xy[2], float r_uv[2], float } } +void DisplaceOperation::deinit_execution() +{ + input_color_program_ = nullptr; + vector_read_fn_ = nullptr; + scale_x_read_fn_ = nullptr; + scale_y_read_fn_ = nullptr; +} + +bool DisplaceOperation::determine_depending_area_of_interest(rcti *input, + ReadBufferOperation *read_operation, + rcti *output) +{ + rcti color_input; + rcti vector_input; + NodeOperation *operation = nullptr; + + /* the vector buffer only needs a 2x2 buffer. The image needs whole buffer */ + /* image */ + operation = get_input_operation(0); + color_input.xmax = operation->get_width(); + color_input.xmin = 0; + color_input.ymax = operation->get_height(); + color_input.ymin = 0; + if (operation->determine_depending_area_of_interest(&color_input, read_operation, output)) { + return true; + } + + /* vector */ + operation = get_input_operation(1); + vector_input.xmax = input->xmax + 1; + vector_input.xmin = input->xmin - 1; + vector_input.ymax = input->ymax + 1; + vector_input.ymin = input->ymin - 1; + if (operation->determine_depending_area_of_interest(&vector_input, read_operation, output)) { + return true; + } + + /* scale x */ + operation = get_input_operation(2); + if (operation->determine_depending_area_of_interest(input, read_operation, output)) { + return true; + } + + /* scale y */ + operation = get_input_operation(3); + if (operation->determine_depending_area_of_interest(input, read_operation, output)) { + return true; + } + + return false; +} + void DisplaceOperation::get_area_of_interest(const int input_idx, const rcti &output_area, rcti &r_input_area) @@ -152,7 +239,7 @@ void DisplaceOperation::update_memory_buffer_partial(MemoryBuffer *output, } else { /* EWA filtering (without nearest it gets blurry with NO distortion). */ - input_color->read_elem_filtered(uv[0], uv[1], deriv[0], deriv[1], false, it.out); + input_color->read_elem_filtered(uv[0], uv[1], deriv[0], deriv[1], it.out); } } } diff --git a/source/blender/compositor/operations/COM_DisplaceOperation.h b/source/blender/compositor/operations/COM_DisplaceOperation.h index f8915c8888a..fb28a0d89fd 100644 --- a/source/blender/compositor/operations/COM_DisplaceOperation.h +++ b/source/blender/compositor/operations/COM_DisplaceOperation.h @@ -10,6 +10,11 @@ namespace blender::compositor { class DisplaceOperation : public MultiThreadedOperation { private: + /** + * Cached reference to the input_program + */ + SocketReader *input_color_program_; + float width_x4_; float height_x4_; @@ -23,10 +28,30 @@ class DisplaceOperation : public MultiThreadedOperation { public: DisplaceOperation(); + /** + * we need a 2x2 differential filter for Vector Input and full buffer for the image + */ + bool determine_depending_area_of_interest(rcti *input, + ReadBufferOperation *read_operation, + rcti *output) override; + + /** + * The inner loop of this operation. + */ + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + void pixel_transform(const float xy[2], float r_uv[2], float r_deriv[2][2]); + /** + * Initialize the execution + */ void init_execution() override; + /** + * Deinitialize the execution + */ + void deinit_execution() override; + void get_area_of_interest(int input_idx, const rcti &output_area, rcti &r_input_area) override; void update_memory_buffer_started(MemoryBuffer *output, const rcti &area, diff --git a/source/blender/compositor/operations/COM_DisplaceSimpleOperation.cc b/source/blender/compositor/operations/COM_DisplaceSimpleOperation.cc index 6fafa03cb31..9d07b189992 100644 --- a/source/blender/compositor/operations/COM_DisplaceSimpleOperation.cc +++ b/source/blender/compositor/operations/COM_DisplaceSimpleOperation.cc @@ -14,15 +14,109 @@ DisplaceSimpleOperation::DisplaceSimpleOperation() this->add_input_socket(DataType::Value); this->add_output_socket(DataType::Color); + input_color_program_ = nullptr; + input_vector_program_ = nullptr; + input_scale_xprogram_ = nullptr; + input_scale_yprogram_ = nullptr; + flags_.can_be_constant = true; } void DisplaceSimpleOperation::init_execution() { + input_color_program_ = this->get_input_socket_reader(0); + input_vector_program_ = this->get_input_socket_reader(1); + input_scale_xprogram_ = this->get_input_socket_reader(2); + input_scale_yprogram_ = this->get_input_socket_reader(3); + width_x4_ = this->get_width() * 4; height_x4_ = this->get_height() * 4; } +/* minimum distance (in pixels) a pixel has to be displaced + * in order to take effect */ +// #define DISPLACE_EPSILON 0.01f + +void DisplaceSimpleOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float in_vector[4]; + float in_scale[4]; + + float p_dx, p_dy; /* main displacement in pixel space */ + float u, v; + + input_scale_xprogram_->read_sampled(in_scale, x, y, sampler); + float xs = in_scale[0]; + input_scale_yprogram_->read_sampled(in_scale, x, y, sampler); + float ys = in_scale[0]; + + /* clamp x and y displacement to triple image resolution - + * to prevent hangs from huge values mistakenly plugged in eg. z buffers */ + CLAMP(xs, -width_x4_, width_x4_); + CLAMP(ys, -height_x4_, height_x4_); + + input_vector_program_->read_sampled(in_vector, x, y, sampler); + p_dx = in_vector[0] * xs; + p_dy = in_vector[1] * ys; + + /* displaced pixel in uv coords, for image sampling */ + /* clamp nodes to avoid glitches */ + u = x - p_dx + 0.5f; + v = y - p_dy + 0.5f; + CLAMP(u, 0.0f, this->get_width() - 1.0f); + CLAMP(v, 0.0f, this->get_height() - 1.0f); + + input_color_program_->read_sampled(output, u, v, sampler); +} + +void DisplaceSimpleOperation::deinit_execution() +{ + input_color_program_ = nullptr; + input_vector_program_ = nullptr; + input_scale_xprogram_ = nullptr; + input_scale_yprogram_ = nullptr; +} + +bool DisplaceSimpleOperation::determine_depending_area_of_interest( + rcti *input, ReadBufferOperation *read_operation, rcti *output) +{ + rcti color_input; + NodeOperation *operation = nullptr; + + /* the vector buffer only needs a 2x2 buffer. The image needs whole buffer */ + /* image */ + operation = get_input_operation(0); + color_input.xmax = operation->get_width(); + color_input.xmin = 0; + color_input.ymax = operation->get_height(); + color_input.ymin = 0; + if (operation->determine_depending_area_of_interest(&color_input, read_operation, output)) { + return true; + } + + /* vector */ + if (operation->determine_depending_area_of_interest(input, read_operation, output)) { + return true; + } + + /* scale x */ + operation = get_input_operation(2); + if (operation->determine_depending_area_of_interest(input, read_operation, output)) { + return true; + } + + /* scale y */ + operation = get_input_operation(3); + if (operation->determine_depending_area_of_interest(input, read_operation, output)) { + return true; + } + + return false; +} + void DisplaceSimpleOperation::get_area_of_interest(const int input_idx, const rcti &output_area, rcti &r_input_area) diff --git a/source/blender/compositor/operations/COM_DisplaceSimpleOperation.h b/source/blender/compositor/operations/COM_DisplaceSimpleOperation.h index 0f0e0ccbb64..31e8dcd269c 100644 --- a/source/blender/compositor/operations/COM_DisplaceSimpleOperation.h +++ b/source/blender/compositor/operations/COM_DisplaceSimpleOperation.h @@ -10,14 +10,42 @@ namespace blender::compositor { class DisplaceSimpleOperation : public MultiThreadedOperation { private: + /** + * Cached reference to the input_program + */ + SocketReader *input_color_program_; + SocketReader *input_vector_program_; + SocketReader *input_scale_xprogram_; + SocketReader *input_scale_yprogram_; + float width_x4_; float height_x4_; public: DisplaceSimpleOperation(); + /** + * we need a full buffer for the image + */ + bool determine_depending_area_of_interest(rcti *input, + ReadBufferOperation *read_operation, + rcti *output) override; + + /** + * The inner loop of this operation. + */ + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + + /** + * Initialize the execution + */ void init_execution() override; + /** + * Deinitialize the execution + */ + void deinit_execution() override; + void get_area_of_interest(int input_idx, const rcti &output_area, rcti &r_input_area) override; void update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, diff --git a/source/blender/compositor/operations/COM_DistanceRGBMatteOperation.cc b/source/blender/compositor/operations/COM_DistanceRGBMatteOperation.cc index d36347dc358..261eb17151d 100644 --- a/source/blender/compositor/operations/COM_DistanceRGBMatteOperation.cc +++ b/source/blender/compositor/operations/COM_DistanceRGBMatteOperation.cc @@ -12,14 +12,73 @@ DistanceRGBMatteOperation::DistanceRGBMatteOperation() this->add_input_socket(DataType::Color); this->add_output_socket(DataType::Value); + input_image_program_ = nullptr; + input_key_program_ = nullptr; flags_.can_be_constant = true; } +void DistanceRGBMatteOperation::init_execution() +{ + input_image_program_ = this->get_input_socket_reader(0); + input_key_program_ = this->get_input_socket_reader(1); +} + +void DistanceRGBMatteOperation::deinit_execution() +{ + input_image_program_ = nullptr; + input_key_program_ = nullptr; +} + float DistanceRGBMatteOperation::calculate_distance(const float key[4], const float image[4]) { return len_v3v3(key, image); } +void DistanceRGBMatteOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float in_key[4]; + float in_image[4]; + + const float tolerance = settings_->t1; + const float falloff = settings_->t2; + + float distance; + float alpha; + + input_key_program_->read_sampled(in_key, x, y, sampler); + input_image_program_->read_sampled(in_image, x, y, sampler); + + distance = this->calculate_distance(in_key, in_image); + + /* Store matte(alpha) value in [0] to go with + * COM_SetAlphaMultiplyOperation and the Value output. + */ + + /* Make 100% transparent. */ + if (distance < tolerance) { + output[0] = 0.0f; + } + /* In the falloff region, make partially transparent. */ + else if (distance < falloff + tolerance) { + distance = distance - tolerance; + alpha = distance / falloff; + /* Only change if more transparent than before. */ + if (alpha < in_image[3]) { + output[0] = alpha; + } + else { /* leave as before */ + output[0] = in_image[3]; + } + } + else { + /* leave as before */ + output[0] = in_image[3]; + } +} + void DistanceRGBMatteOperation::update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span inputs) diff --git a/source/blender/compositor/operations/COM_DistanceRGBMatteOperation.h b/source/blender/compositor/operations/COM_DistanceRGBMatteOperation.h index 1e7a4e86b7e..dc80b8959e0 100644 --- a/source/blender/compositor/operations/COM_DistanceRGBMatteOperation.h +++ b/source/blender/compositor/operations/COM_DistanceRGBMatteOperation.h @@ -15,12 +15,25 @@ namespace blender::compositor { class DistanceRGBMatteOperation : public MultiThreadedOperation { protected: const NodeChroma *settings_; + SocketReader *input_image_program_; + SocketReader *input_key_program_; virtual float calculate_distance(const float key[4], const float image[4]); public: + /** + * Default constructor + */ DistanceRGBMatteOperation(); + /** + * The inner loop of this operation. + */ + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + + void init_execution() override; + void deinit_execution() override; + void set_settings(const NodeChroma *node_chroma) { settings_ = node_chroma; diff --git a/source/blender/compositor/operations/COM_DotproductOperation.cc b/source/blender/compositor/operations/COM_DotproductOperation.cc index 3c9720f2480..ea8690be6ad 100644 --- a/source/blender/compositor/operations/COM_DotproductOperation.cc +++ b/source/blender/compositor/operations/COM_DotproductOperation.cc @@ -12,8 +12,35 @@ DotproductOperation::DotproductOperation() this->add_input_socket(DataType::Vector); this->add_output_socket(DataType::Value); this->set_canvas_input_index(0); + input1Operation_ = nullptr; + input2Operation_ = nullptr; flags_.can_be_constant = true; } +void DotproductOperation::init_execution() +{ + input1Operation_ = this->get_input_socket_reader(0); + input2Operation_ = this->get_input_socket_reader(1); +} + +void DotproductOperation::deinit_execution() +{ + input1Operation_ = nullptr; + input2Operation_ = nullptr; +} + +/** \todo current implementation is the inverse of a dot-product. not 'logically' correct + */ +void DotproductOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float input1[4]; + float input2[4]; + input1Operation_->read_sampled(input1, x, y, sampler); + input2Operation_->read_sampled(input2, x, y, sampler); + output[0] = -(input1[0] * input2[0] + input1[1] * input2[1] + input1[2] * input2[2]); +} void DotproductOperation::update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, diff --git a/source/blender/compositor/operations/COM_DotproductOperation.h b/source/blender/compositor/operations/COM_DotproductOperation.h index 640e986bec0..4c261a4793f 100644 --- a/source/blender/compositor/operations/COM_DotproductOperation.h +++ b/source/blender/compositor/operations/COM_DotproductOperation.h @@ -9,8 +9,16 @@ namespace blender::compositor { class DotproductOperation : public MultiThreadedOperation { + private: + SocketReader *input1Operation_; + SocketReader *input2Operation_; + public: DotproductOperation(); + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + + void init_execution() override; + void deinit_execution() override; void update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, diff --git a/source/blender/compositor/operations/COM_DoubleEdgeMaskOperation.cc b/source/blender/compositor/operations/COM_DoubleEdgeMaskOperation.cc index 61f2fe863eb..c02f4810eba 100644 --- a/source/blender/compositor/operations/COM_DoubleEdgeMaskOperation.cc +++ b/source/blender/compositor/operations/COM_DoubleEdgeMaskOperation.cc @@ -143,12 +143,76 @@ DoubleEdgeMaskOperation::DoubleEdgeMaskOperation() this->add_input_socket(DataType::Value); this->add_input_socket(DataType::Value); this->add_output_socket(DataType::Value); + input_inner_mask_ = nullptr; + input_outer_mask_ = nullptr; include_all_inner_edges_ = false; include_edges_of_image_ = false; + flags_.complex = true; flags_.can_be_constant = true; is_output_rendered_ = false; } +bool DoubleEdgeMaskOperation::determine_depending_area_of_interest( + rcti * /*input*/, ReadBufferOperation *read_operation, rcti *output) +{ + if (cached_instance_ == nullptr) { + rcti new_input; + new_input.xmax = this->get_width(); + new_input.xmin = 0; + new_input.ymax = this->get_height(); + new_input.ymin = 0; + return NodeOperation::determine_depending_area_of_interest(&new_input, read_operation, output); + } + + return false; +} + +void DoubleEdgeMaskOperation::init_execution() +{ + input_inner_mask_ = this->get_input_socket_reader(0); + input_outer_mask_ = this->get_input_socket_reader(1); + init_mutex(); + cached_instance_ = nullptr; +} + +void *DoubleEdgeMaskOperation::initialize_tile_data(rcti *rect) +{ + if (cached_instance_) { + return cached_instance_; + } + + lock_mutex(); + if (cached_instance_ == nullptr) { + MemoryBuffer *inner_mask = (MemoryBuffer *)input_inner_mask_->initialize_tile_data(rect); + MemoryBuffer *outer_mask = (MemoryBuffer *)input_outer_mask_->initialize_tile_data(rect); + float *data = (float *)MEM_mallocN(sizeof(float) * this->get_width() * this->get_height(), + __func__); + float *imask = inner_mask->get_buffer(); + float *omask = outer_mask->get_buffer(); + compute_double_edge_mask(imask, omask, data); + cached_instance_ = data; + } + unlock_mutex(); + return cached_instance_; +} +void DoubleEdgeMaskOperation::execute_pixel(float output[4], int x, int y, void *data) +{ + float *buffer = (float *)data; + int index = (y * this->get_width() + x); + output[0] = buffer[index]; +} + +void DoubleEdgeMaskOperation::deinit_execution() +{ + input_inner_mask_ = nullptr; + input_outer_mask_ = nullptr; + deinit_mutex(); + if (cached_instance_) { + MEM_freeN(cached_instance_); + cached_instance_ = nullptr; + } +} + void DoubleEdgeMaskOperation::get_area_of_interest(int /*input_idx*/, const rcti & /*output_area*/, rcti &r_input_area) diff --git a/source/blender/compositor/operations/COM_DoubleEdgeMaskOperation.h b/source/blender/compositor/operations/COM_DoubleEdgeMaskOperation.h index cb1d2235538..3339aa0133b 100644 --- a/source/blender/compositor/operations/COM_DoubleEdgeMaskOperation.h +++ b/source/blender/compositor/operations/COM_DoubleEdgeMaskOperation.h @@ -12,9 +12,17 @@ namespace blender::compositor { class DoubleEdgeMaskOperation : public NodeOperation { private: + /** + * Cached reference to the input_program + */ + SocketReader *input_outer_mask_; + SocketReader *input_inner_mask_; bool include_all_inner_edges_; bool include_edges_of_image_; + /* TODO(manzanilla): To be removed with tiled implementation. */ + float *cached_instance_; + bool is_output_rendered_; public: @@ -35,6 +43,27 @@ class DoubleEdgeMaskOperation : public NodeOperation { const float *outer_mask, float *output_mask); + /** + * The inner loop of this operation. + */ + void execute_pixel(float output[4], int x, int y, void *data) override; + + /** + * Initialize the execution + */ + void init_execution() override; + + /** + * Deinitialize the execution + */ + void deinit_execution() override; + + void *initialize_tile_data(rcti *rect) override; + + bool determine_depending_area_of_interest(rcti *input, + ReadBufferOperation *read_operation, + rcti *output) override; + void set_include_all_inner_edges(bool include_all_inner_edges) { include_all_inner_edges_ = include_all_inner_edges; diff --git a/source/blender/compositor/operations/COM_EllipseMaskOperation.cc b/source/blender/compositor/operations/COM_EllipseMaskOperation.cc index d257b47fb37..10f08a1964f 100644 --- a/source/blender/compositor/operations/COM_EllipseMaskOperation.cc +++ b/source/blender/compositor/operations/COM_EllipseMaskOperation.cc @@ -11,17 +11,93 @@ EllipseMaskOperation::EllipseMaskOperation() this->add_input_socket(DataType::Value); this->add_input_socket(DataType::Value); this->add_output_socket(DataType::Value); + input_mask_ = nullptr; + input_value_ = nullptr; cosine_ = 0.0f; sine_ = 0.0f; } void EllipseMaskOperation::init_execution() { + input_mask_ = this->get_input_socket_reader(0); + input_value_ = this->get_input_socket_reader(1); const double rad = double(data_->rotation); cosine_ = cos(rad); sine_ = sin(rad); aspect_ratio_ = float(this->get_width()) / this->get_height(); } +void EllipseMaskOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float input_mask[4]; + float input_value[4]; + + float rx = x / std::max(this->get_width() - 1.0f, FLT_EPSILON); + float ry = y / std::max(this->get_height() - 1.0f, FLT_EPSILON); + + const float dy = (ry - data_->y) / aspect_ratio_; + const float dx = rx - data_->x; + rx = data_->x + (cosine_ * dx + sine_ * dy); + ry = data_->y + (-sine_ * dx + cosine_ * dy); + + input_mask_->read_sampled(input_mask, x, y, sampler); + input_value_->read_sampled(input_value, x, y, sampler); + + const float half_height = (data_->height) / 2.0f; + const float half_width = data_->width / 2.0f; + float sx = rx - data_->x; + sx *= sx; + const float tx = half_width * half_width; + float sy = ry - data_->y; + sy *= sy; + const float ty = half_height * half_height; + + bool inside = ((sx / tx) + (sy / ty)) <= (1.0f + FLT_EPSILON); + + switch (mask_type_) { + case CMP_NODE_MASKTYPE_ADD: + if (inside) { + output[0] = std::max(input_mask[0], input_value[0]); + } + else { + output[0] = input_mask[0]; + } + break; + case CMP_NODE_MASKTYPE_SUBTRACT: + if (inside) { + output[0] = input_mask[0] - input_value[0]; + CLAMP(output[0], 0, 1); + } + else { + output[0] = input_mask[0]; + } + break; + case CMP_NODE_MASKTYPE_MULTIPLY: + if (inside) { + output[0] = input_mask[0] * input_value[0]; + } + else { + output[0] = 0; + } + break; + case CMP_NODE_MASKTYPE_NOT: + if (inside) { + if (input_mask[0] > 0.0f) { + output[0] = 0; + } + else { + output[0] = input_value[0]; + } + } + else { + output[0] = input_mask[0]; + } + break; + } +} + void EllipseMaskOperation::update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span inputs) @@ -93,4 +169,10 @@ void EllipseMaskOperation::apply_mask(MemoryBuffer *output, } } +void EllipseMaskOperation::deinit_execution() +{ + input_mask_ = nullptr; + input_value_ = nullptr; +} + } // namespace blender::compositor diff --git a/source/blender/compositor/operations/COM_EllipseMaskOperation.h b/source/blender/compositor/operations/COM_EllipseMaskOperation.h index 19231971bd3..431b954e5af 100644 --- a/source/blender/compositor/operations/COM_EllipseMaskOperation.h +++ b/source/blender/compositor/operations/COM_EllipseMaskOperation.h @@ -12,6 +12,12 @@ class EllipseMaskOperation : public MultiThreadedOperation { private: using MaskFunc = std::function; + /** + * Cached reference to the input_program + */ + SocketReader *input_mask_; + SocketReader *input_value_; + float sine_; float cosine_; float aspect_ratio_; @@ -22,8 +28,21 @@ class EllipseMaskOperation : public MultiThreadedOperation { public: EllipseMaskOperation(); + /** + * The inner loop of this operation. + */ + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + + /** + * Initialize the execution + */ void init_execution() override; + /** + * Deinitialize the execution + */ + void deinit_execution() override; + void set_data(NodeEllipseMask *data) { data_ = data; diff --git a/source/blender/compositor/operations/COM_FastGaussianBlurOperation.cc b/source/blender/compositor/operations/COM_FastGaussianBlurOperation.cc index 42321fdd3c7..ec87e31d5d2 100644 --- a/source/blender/compositor/operations/COM_FastGaussianBlurOperation.cc +++ b/source/blender/compositor/operations/COM_FastGaussianBlurOperation.cc @@ -14,6 +14,39 @@ FastGaussianBlurOperation::FastGaussianBlurOperation() : BlurBaseOperation(DataT data_.filtertype = R_FILTER_FAST_GAUSS; } +void FastGaussianBlurOperation::execute_pixel(float output[4], int x, int y, void *data) +{ + MemoryBuffer *new_data = (MemoryBuffer *)data; + new_data->read(output, x, y); +} + +bool FastGaussianBlurOperation::determine_depending_area_of_interest( + rcti * /*input*/, ReadBufferOperation *read_operation, rcti *output) +{ + rcti new_input; + rcti size_input; + size_input.xmin = 0; + size_input.ymin = 0; + size_input.xmax = 5; + size_input.ymax = 5; + + NodeOperation *operation = this->get_input_operation(1); + if (operation->determine_depending_area_of_interest(&size_input, read_operation, output)) { + return true; + } + + if (iirgaus_) { + return false; + } + + new_input.xmin = 0; + new_input.ymin = 0; + new_input.xmax = this->get_width(); + new_input.ymax = this->get_height(); + + return NodeOperation::determine_depending_area_of_interest(&new_input, read_operation, output); +} + void FastGaussianBlurOperation::init_data() { BlurBaseOperation::init_data(); @@ -24,6 +57,7 @@ void FastGaussianBlurOperation::init_data() void FastGaussianBlurOperation::init_execution() { BlurBaseOperation::init_execution(); + BlurBaseOperation::init_mutex(); } void FastGaussianBlurOperation::deinit_execution() @@ -32,6 +66,7 @@ void FastGaussianBlurOperation::deinit_execution() delete iirgaus_; iirgaus_ = nullptr; } + BlurBaseOperation::deinit_mutex(); } void FastGaussianBlurOperation::set_size(int size_x, int size_y) @@ -43,6 +78,41 @@ void FastGaussianBlurOperation::set_size(int size_x, int size_y) sizeavailable_ = true; } +void *FastGaussianBlurOperation::initialize_tile_data(rcti *rect) +{ + lock_mutex(); + if (!iirgaus_) { + MemoryBuffer *new_buf = (MemoryBuffer *)input_program_->initialize_tile_data(rect); + MemoryBuffer *copy = new MemoryBuffer(*new_buf); + update_size(); + + int c; + sx_ = data_.sizex * size_ / 2.0f; + sy_ = data_.sizey * size_ / 2.0f; + + if ((sx_ == sy_) && (sx_ > 0.0f)) { + for (c = 0; c < COM_DATA_TYPE_COLOR_CHANNELS; c++) { + IIR_gauss(copy, sx_, c, 3); + } + } + else { + if (sx_ > 0.0f) { + for (c = 0; c < COM_DATA_TYPE_COLOR_CHANNELS; c++) { + IIR_gauss(copy, sx_, c, 1); + } + } + if (sy_ > 0.0f) { + for (c = 0; c < COM_DATA_TYPE_COLOR_CHANNELS; c++) { + IIR_gauss(copy, sy_, c, 2); + } + } + } + iirgaus_ = copy; + } + unlock_mutex(); + return iirgaus_; +} + void FastGaussianBlurOperation::IIR_gauss(MemoryBuffer *src, float sigma, uint chan, uint xy) { BLI_assert(!src->is_a_single_elem()); @@ -246,11 +316,40 @@ FastGaussianBlurValueOperation::FastGaussianBlurValueOperation() this->add_input_socket(DataType::Value); this->add_output_socket(DataType::Value); iirgaus_ = nullptr; + inputprogram_ = nullptr; sigma_ = 1.0f; overlay_ = 0; + flags_.complex = true; } -void FastGaussianBlurValueOperation::init_execution() {} +void FastGaussianBlurValueOperation::execute_pixel(float output[4], int x, int y, void *data) +{ + MemoryBuffer *new_data = (MemoryBuffer *)data; + new_data->read(output, x, y); +} + +bool FastGaussianBlurValueOperation::determine_depending_area_of_interest( + rcti * /*input*/, ReadBufferOperation *read_operation, rcti *output) +{ + rcti new_input; + + if (iirgaus_) { + return false; + } + + new_input.xmin = 0; + new_input.ymin = 0; + new_input.xmax = this->get_width(); + new_input.ymax = this->get_height(); + + return NodeOperation::determine_depending_area_of_interest(&new_input, read_operation, output); +} + +void FastGaussianBlurValueOperation::init_execution() +{ + inputprogram_ = get_input_socket_reader(0); + init_mutex(); +} void FastGaussianBlurValueOperation::deinit_execution() { @@ -258,6 +357,44 @@ void FastGaussianBlurValueOperation::deinit_execution() delete iirgaus_; iirgaus_ = nullptr; } + deinit_mutex(); +} + +void *FastGaussianBlurValueOperation::initialize_tile_data(rcti *rect) +{ + lock_mutex(); + if (!iirgaus_) { + MemoryBuffer *new_buf = (MemoryBuffer *)inputprogram_->initialize_tile_data(rect); + MemoryBuffer *copy = new MemoryBuffer(*new_buf); + FastGaussianBlurOperation::IIR_gauss(copy, sigma_, 0, 3); + + if (overlay_ == FAST_GAUSS_OVERLAY_MIN) { + float *src = new_buf->get_buffer(); + float *dst = copy->get_buffer(); + for (int i = copy->get_width() * copy->get_height(); i != 0; + i--, src += COM_DATA_TYPE_VALUE_CHANNELS, dst += COM_DATA_TYPE_VALUE_CHANNELS) + { + if (*src < *dst) { + *dst = *src; + } + } + } + else if (overlay_ == FAST_GAUSS_OVERLAY_MAX) { + float *src = new_buf->get_buffer(); + float *dst = copy->get_buffer(); + for (int i = copy->get_width() * copy->get_height(); i != 0; + i--, src += COM_DATA_TYPE_VALUE_CHANNELS, dst += COM_DATA_TYPE_VALUE_CHANNELS) + { + if (*src > *dst) { + *dst = *src; + } + } + } + + iirgaus_ = copy; + } + unlock_mutex(); + return iirgaus_; } void FastGaussianBlurValueOperation::get_area_of_interest(const int /*input_idx*/, diff --git a/source/blender/compositor/operations/COM_FastGaussianBlurOperation.h b/source/blender/compositor/operations/COM_FastGaussianBlurOperation.h index 99b5bfacac6..200f76771c7 100644 --- a/source/blender/compositor/operations/COM_FastGaussianBlurOperation.h +++ b/source/blender/compositor/operations/COM_FastGaussianBlurOperation.h @@ -17,8 +17,13 @@ class FastGaussianBlurOperation : public BlurBaseOperation { public: FastGaussianBlurOperation(); + bool determine_depending_area_of_interest(rcti *input, + ReadBufferOperation *read_operation, + rcti *output) override; + void execute_pixel(float output[4], int x, int y, void *data) override; static void IIR_gauss(MemoryBuffer *src, float sigma, unsigned int channel, unsigned int xy); + void *initialize_tile_data(rcti *rect) override; void init_data() override; void deinit_execution() override; void init_execution() override; @@ -46,6 +51,7 @@ class FastGaussianBlurValueOperation : public MultiThreadedOperation { private: float sigma_; MemoryBuffer *iirgaus_; + SocketReader *inputprogram_; /** * -1: re-mix with darker @@ -56,7 +62,12 @@ class FastGaussianBlurValueOperation : public MultiThreadedOperation { public: FastGaussianBlurValueOperation(); + bool determine_depending_area_of_interest(rcti *input, + ReadBufferOperation *read_operation, + rcti *output) override; + void execute_pixel(float output[4], int x, int y, void *data) override; + void *initialize_tile_data(rcti *rect) override; void deinit_execution() override; void init_execution() override; void set_sigma(float sigma) diff --git a/source/blender/compositor/operations/COM_FileOutputOperation.cc b/source/blender/compositor/operations/COM_FileOutputOperation.cc index a03a785178d..01c33d995c8 100644 --- a/source/blender/compositor/operations/COM_FileOutputOperation.cc +++ b/source/blender/compositor/operations/COM_FileOutputOperation.cc @@ -16,7 +16,7 @@ #include "BKE_image.h" #include "BKE_image_format.h" #include "BKE_main.hh" -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "RE_pipeline.h" @@ -51,6 +51,34 @@ static float *initialize_buffer(uint width, uint height, DataType datatype) MEM_malloc_arrayN(size_t(width) * height, sizeof(float) * size, "File Output Buffer.")); } +static void write_buffer_rect( + rcti *rect, SocketReader *reader, float *buffer, uint width, DataType datatype) +{ + + if (!buffer) { + return; + } + int x1 = rect->xmin; + int y1 = rect->ymin; + int x2 = rect->xmax; + int y2 = rect->ymax; + + int size = get_channels_count(datatype); + int offset = (y1 * width + x1) * size; + for (int y = y1; y < y2; y++) { + for (int x = x1; x < x2; x++) { + float color[4]; + reader->read_sampled(color, x, y, PixelSampler::Nearest); + + for (int i = 0; i < size; i++) { + buffer[offset + i] = color[i]; + } + offset += size; + } + offset += (width - (x2 - x1)) * size; + } +} + FileOutputOperation::FileOutputOperation(const CompositorContext *context, const NodeImageMultiFile *node_data, Vector inputs) @@ -74,6 +102,17 @@ void FileOutputOperation::init_execution() } } +void FileOutputOperation::execute_region(rcti *rect, uint /*tile_number*/) +{ + for (int i = 0; i < file_output_inputs_.size(); i++) { + const FileOutputInput &input = file_output_inputs_[i]; + if (!input.image_input || !input.output_buffer) { + continue; + } + write_buffer_rect(rect, input.image_input, input.output_buffer, get_width(), input.data_type); + } +} + void FileOutputOperation::update_memory_buffer_partial(MemoryBuffer * /*output*/, const rcti &area, Span inputs) diff --git a/source/blender/compositor/operations/COM_FileOutputOperation.h b/source/blender/compositor/operations/COM_FileOutputOperation.h index 33a5f09569e..61d9ef0ae94 100644 --- a/source/blender/compositor/operations/COM_FileOutputOperation.h +++ b/source/blender/compositor/operations/COM_FileOutputOperation.h @@ -40,6 +40,7 @@ class FileOutputOperation : public MultiThreadedOperation { const NodeImageMultiFile *node_data, Vector inputs); + void execute_region(rcti *rect, unsigned int tile_number) override; bool is_output_operation(bool /*rendering*/) const override { return true; diff --git a/source/blender/compositor/operations/COM_FlipOperation.cc b/source/blender/compositor/operations/COM_FlipOperation.cc index 04bf25baa6e..fdd10a4f645 100644 --- a/source/blender/compositor/operations/COM_FlipOperation.cc +++ b/source/blender/compositor/operations/COM_FlipOperation.cc @@ -11,21 +11,27 @@ FlipOperation::FlipOperation() this->add_input_socket(DataType::Color, ResizeMode::None); this->add_output_socket(DataType::Color); this->set_canvas_input_index(0); + input_operation_ = nullptr; flip_x_ = true; flip_y_ = false; flags_.can_be_constant = true; } - -void FlipOperation::get_area_of_interest(const int input_idx, - const rcti & /*output_area*/, - rcti &r_input_area) +void FlipOperation::init_execution() { - BLI_assert(input_idx == 0); - UNUSED_VARS_NDEBUG(input_idx); + input_operation_ = this->get_input_socket_reader(0); +} - /* The full input image should be flipped to avoid cropping effects caused by previous scaling or - * translating, or a smaller output area. */ - r_input_area = get_canvas(); +void FlipOperation::deinit_execution() +{ + input_operation_ = nullptr; +} + +void FlipOperation::execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) +{ + float nx = flip_x_ ? (int(this->get_width()) - 1) - x : x; + float ny = flip_y_ ? (int(this->get_height()) - 1) - y : y; + + input_operation_->read_sampled(output, nx, ny, sampler); } void FlipOperation::update_memory_buffer_partial(MemoryBuffer *output, diff --git a/source/blender/compositor/operations/COM_FlipOperation.h b/source/blender/compositor/operations/COM_FlipOperation.h index 0abb346c02c..98884887dbc 100644 --- a/source/blender/compositor/operations/COM_FlipOperation.h +++ b/source/blender/compositor/operations/COM_FlipOperation.h @@ -10,12 +10,16 @@ namespace blender::compositor { class FlipOperation : public MultiThreadedOperation { private: + SocketReader *input_operation_; bool flip_x_; bool flip_y_; public: FlipOperation(); + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + void init_execution() override; + void deinit_execution() override; void setFlipX(bool flipX) { flip_x_ = flipX; @@ -25,8 +29,6 @@ class FlipOperation : public MultiThreadedOperation { flip_y_ = flipY; } - void get_area_of_interest(int input_idx, const rcti &output_area, rcti &r_input_area) override; - void update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span inputs) override; diff --git a/source/blender/compositor/operations/COM_GammaCorrectOperation.cc b/source/blender/compositor/operations/COM_GammaCorrectOperation.cc index a7f5163486d..d3fc957d6d9 100644 --- a/source/blender/compositor/operations/COM_GammaCorrectOperation.cc +++ b/source/blender/compositor/operations/COM_GammaCorrectOperation.cc @@ -10,8 +10,39 @@ GammaCorrectOperation::GammaCorrectOperation() { this->add_input_socket(DataType::Color); this->add_output_socket(DataType::Color); + input_program_ = nullptr; flags_.can_be_constant = true; } +void GammaCorrectOperation::init_execution() +{ + input_program_ = this->get_input_socket_reader(0); +} + +void GammaCorrectOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float input_color[4]; + input_program_->read_sampled(input_color, x, y, sampler); + if (input_color[3] > 0.0f) { + input_color[0] /= input_color[3]; + input_color[1] /= input_color[3]; + input_color[2] /= input_color[3]; + } + + /* Check for negative to avoid NAN's. */ + output[0] = input_color[0] > 0.0f ? input_color[0] * input_color[0] : 0.0f; + output[1] = input_color[1] > 0.0f ? input_color[1] * input_color[1] : 0.0f; + output[2] = input_color[2] > 0.0f ? input_color[2] * input_color[2] : 0.0f; + output[3] = input_color[3]; + + if (input_color[3] > 0.0f) { + output[0] *= input_color[3]; + output[1] *= input_color[3]; + output[2] *= input_color[3]; + } +} void GammaCorrectOperation::update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, @@ -41,12 +72,48 @@ void GammaCorrectOperation::update_memory_buffer_partial(MemoryBuffer *output, } } +void GammaCorrectOperation::deinit_execution() +{ + input_program_ = nullptr; +} + GammaUncorrectOperation::GammaUncorrectOperation() { this->add_input_socket(DataType::Color); this->add_output_socket(DataType::Color); + input_program_ = nullptr; flags_.can_be_constant = true; } +void GammaUncorrectOperation::init_execution() +{ + input_program_ = this->get_input_socket_reader(0); +} + +void GammaUncorrectOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float input_color[4]; + input_program_->read_sampled(input_color, x, y, sampler); + + if (input_color[3] > 0.0f) { + input_color[0] /= input_color[3]; + input_color[1] /= input_color[3]; + input_color[2] /= input_color[3]; + } + + output[0] = input_color[0] > 0.0f ? sqrtf(input_color[0]) : 0.0f; + output[1] = input_color[1] > 0.0f ? sqrtf(input_color[1]) : 0.0f; + output[2] = input_color[2] > 0.0f ? sqrtf(input_color[2]) : 0.0f; + output[3] = input_color[3]; + + if (input_color[3] > 0.0f) { + output[0] *= input_color[3]; + output[1] *= input_color[3]; + output[2] *= input_color[3]; + } +} void GammaUncorrectOperation::update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, @@ -75,4 +142,9 @@ void GammaUncorrectOperation::update_memory_buffer_partial(MemoryBuffer *output, } } +void GammaUncorrectOperation::deinit_execution() +{ + input_program_ = nullptr; +} + } // namespace blender::compositor diff --git a/source/blender/compositor/operations/COM_GammaCorrectOperation.h b/source/blender/compositor/operations/COM_GammaCorrectOperation.h index ed5b889670e..6f4e02f72b1 100644 --- a/source/blender/compositor/operations/COM_GammaCorrectOperation.h +++ b/source/blender/compositor/operations/COM_GammaCorrectOperation.h @@ -9,18 +9,60 @@ namespace blender::compositor { class GammaCorrectOperation : public MultiThreadedOperation { + private: + /** + * Cached reference to the input_program + */ + SocketReader *input_program_; + public: GammaCorrectOperation(); + /** + * The inner loop of this operation. + */ + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + + /** + * Initialize the execution + */ + void init_execution() override; + + /** + * Deinitialize the execution + */ + void deinit_execution() override; + void update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span inputs) override; }; class GammaUncorrectOperation : public MultiThreadedOperation { + private: + /** + * Cached reference to the input_program + */ + SocketReader *input_program_; + public: GammaUncorrectOperation(); + /** + * The inner loop of this operation. + */ + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + + /** + * Initialize the execution + */ + void init_execution() override; + + /** + * Deinitialize the execution + */ + void deinit_execution() override; + void update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span inputs) override; diff --git a/source/blender/compositor/operations/COM_GammaOperation.cc b/source/blender/compositor/operations/COM_GammaOperation.cc index 27928285bc8..e3c6e043aba 100644 --- a/source/blender/compositor/operations/COM_GammaOperation.cc +++ b/source/blender/compositor/operations/COM_GammaOperation.cc @@ -11,8 +11,31 @@ GammaOperation::GammaOperation() this->add_input_socket(DataType::Color); this->add_input_socket(DataType::Value); this->add_output_socket(DataType::Color); + input_program_ = nullptr; + input_gamma_program_ = nullptr; flags_.can_be_constant = true; } +void GammaOperation::init_execution() +{ + input_program_ = this->get_input_socket_reader(0); + input_gamma_program_ = this->get_input_socket_reader(1); +} + +void GammaOperation::execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) +{ + float input_value[4]; + float input_gamma[4]; + + input_program_->read_sampled(input_value, x, y, sampler); + input_gamma_program_->read_sampled(input_gamma, x, y, sampler); + const float gamma = input_gamma[0]; + /* check for negative to avoid NAN's */ + output[0] = input_value[0] > 0.0f ? powf(input_value[0], gamma) : input_value[0]; + output[1] = input_value[1] > 0.0f ? powf(input_value[1], gamma) : input_value[1]; + output[2] = input_value[2] > 0.0f ? powf(input_value[2], gamma) : input_value[2]; + + output[3] = input_value[3]; +} void GammaOperation::update_memory_buffer_row(PixelCursor &p) { @@ -28,4 +51,10 @@ void GammaOperation::update_memory_buffer_row(PixelCursor &p) } } +void GammaOperation::deinit_execution() +{ + input_program_ = nullptr; + input_gamma_program_ = nullptr; +} + } // namespace blender::compositor diff --git a/source/blender/compositor/operations/COM_GammaOperation.h b/source/blender/compositor/operations/COM_GammaOperation.h index 728060faf83..bc6bd791e1a 100644 --- a/source/blender/compositor/operations/COM_GammaOperation.h +++ b/source/blender/compositor/operations/COM_GammaOperation.h @@ -9,9 +9,31 @@ namespace blender::compositor { class GammaOperation : public MultiThreadedRowOperation { + private: + /** + * Cached reference to the input_program + */ + SocketReader *input_program_; + SocketReader *input_gamma_program_; + public: GammaOperation(); + /** + * The inner loop of this operation. + */ + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + + /** + * Initialize the execution + */ + void init_execution() override; + + /** + * Deinitialize the execution + */ + void deinit_execution() override; + void update_memory_buffer_row(PixelCursor &p) override; }; diff --git a/source/blender/compositor/operations/COM_GaussianAlphaBlurBaseOperation.cc b/source/blender/compositor/operations/COM_GaussianAlphaBlurBaseOperation.cc index dd88529d5b5..2d31e6a1875 100644 --- a/source/blender/compositor/operations/COM_GaussianAlphaBlurBaseOperation.cc +++ b/source/blender/compositor/operations/COM_GaussianAlphaBlurBaseOperation.cc @@ -18,16 +18,20 @@ GaussianAlphaBlurBaseOperation::GaussianAlphaBlurBaseOperation(eDimension dim) void GaussianAlphaBlurBaseOperation::init_data() { BlurBaseOperation::init_data(); - rad_ = max_ff(size_ * this->get_blur_size(dimension_), 0.0f); - rad_ = min_ff(rad_, MAX_GAUSSTAB_RADIUS); - filtersize_ = min_ii(ceil(rad_), MAX_GAUSSTAB_RADIUS); + if (execution_model_ == eExecutionModel::FullFrame) { + rad_ = max_ff(size_ * this->get_blur_size(dimension_), 0.0f); + rad_ = min_ff(rad_, MAX_GAUSSTAB_RADIUS); + filtersize_ = min_ii(ceil(rad_), MAX_GAUSSTAB_RADIUS); + } } void GaussianAlphaBlurBaseOperation::init_execution() { BlurBaseOperation::init_execution(); - gausstab_ = BlurBaseOperation::make_gausstab(rad_, filtersize_); - distbuf_inv_ = BlurBaseOperation::make_dist_fac_inverse(rad_, filtersize_, falloff_); + if (execution_model_ == eExecutionModel::FullFrame) { + gausstab_ = BlurBaseOperation::make_gausstab(rad_, filtersize_); + distbuf_inv_ = BlurBaseOperation::make_dist_fac_inverse(rad_, filtersize_, falloff_); + } } void GaussianAlphaBlurBaseOperation::deinit_execution() diff --git a/source/blender/compositor/operations/COM_GaussianAlphaBlurBaseOperation.h b/source/blender/compositor/operations/COM_GaussianAlphaBlurBaseOperation.h index b0ed3608fb1..33e4af006ae 100644 --- a/source/blender/compositor/operations/COM_GaussianAlphaBlurBaseOperation.h +++ b/source/blender/compositor/operations/COM_GaussianAlphaBlurBaseOperation.h @@ -48,14 +48,4 @@ class GaussianAlphaBlurBaseOperation : public BlurBaseOperation { } }; -class GaussianAlphaXBlurOperation : public GaussianAlphaBlurBaseOperation { - public: - GaussianAlphaXBlurOperation() : GaussianAlphaBlurBaseOperation(eDimension::X) {} -}; - -class GaussianAlphaYBlurOperation : public GaussianAlphaBlurBaseOperation { - public: - GaussianAlphaYBlurOperation() : GaussianAlphaBlurBaseOperation(eDimension::Y) {} -}; - } // namespace blender::compositor diff --git a/source/blender/compositor/operations/COM_GaussianAlphaXBlurOperation.cc b/source/blender/compositor/operations/COM_GaussianAlphaXBlurOperation.cc new file mode 100644 index 00000000000..eaf19d77b1c --- /dev/null +++ b/source/blender/compositor/operations/COM_GaussianAlphaXBlurOperation.cc @@ -0,0 +1,170 @@ +/* SPDX-FileCopyrightText: 2011 Blender Authors + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +#include "COM_GaussianAlphaXBlurOperation.h" + +namespace blender::compositor { + +GaussianAlphaXBlurOperation::GaussianAlphaXBlurOperation() + : GaussianAlphaBlurBaseOperation(eDimension::X) +{ +} + +void *GaussianAlphaXBlurOperation::initialize_tile_data(rcti * /*rect*/) +{ + lock_mutex(); + if (!sizeavailable_) { + update_gauss(); + } + void *buffer = get_input_operation(0)->initialize_tile_data(nullptr); + unlock_mutex(); + return buffer; +} + +void GaussianAlphaXBlurOperation::init_execution() +{ + GaussianAlphaBlurBaseOperation::init_execution(); + + init_mutex(); + + if (sizeavailable_ && execution_model_ == eExecutionModel::Tiled) { + float rad = max_ff(size_ * data_.sizex, 0.0f); + filtersize_ = min_ii(ceil(rad), MAX_GAUSSTAB_RADIUS); + + gausstab_ = BlurBaseOperation::make_gausstab(rad, filtersize_); + distbuf_inv_ = BlurBaseOperation::make_dist_fac_inverse(rad, filtersize_, falloff_); + } +} + +void GaussianAlphaXBlurOperation::update_gauss() +{ + if (gausstab_ == nullptr) { + update_size(); + float rad = max_ff(size_ * data_.sizex, 0.0f); + filtersize_ = min_ii(ceil(rad), MAX_GAUSSTAB_RADIUS); + + gausstab_ = BlurBaseOperation::make_gausstab(rad, filtersize_); + } + + if (distbuf_inv_ == nullptr) { + update_size(); + float rad = max_ff(size_ * data_.sizex, 0.0f); + rad = min_ff(rad, MAX_GAUSSTAB_RADIUS); + filtersize_ = min_ii(ceil(rad), MAX_GAUSSTAB_RADIUS); + + distbuf_inv_ = BlurBaseOperation::make_dist_fac_inverse(rad, filtersize_, falloff_); + } +} + +void GaussianAlphaXBlurOperation::execute_pixel(float output[4], int x, int y, void *data) +{ + const bool do_invert = do_subtract_; + MemoryBuffer *input_buffer = (MemoryBuffer *)data; + float *buffer = input_buffer->get_buffer(); + int bufferwidth = input_buffer->get_width(); + const rcti &input_rect = input_buffer->get_rect(); + int bufferstartx = input_rect.xmin; + int bufferstarty = input_rect.ymin; + + const rcti &rect = input_buffer->get_rect(); + int xmin = max_ii(x - filtersize_, rect.xmin); + int xmax = min_ii(x + filtersize_ + 1, rect.xmax); + int ymin = max_ii(y, rect.ymin); + + /* *** this is the main part which is different to 'GaussianXBlurOperation' *** */ + int step = get_step(); + int bufferindex = (xmin - bufferstartx) + ((ymin - bufferstarty) * bufferwidth); + + /* gauss */ + float alpha_accum = 0.0f; + float multiplier_accum = 0.0f; + + /* dilate */ + float value_max = finv_test( + buffer[(x) + (y * bufferwidth)], + do_invert); /* init with the current color to avoid unneeded lookups */ + float distfacinv_max = 1.0f; /* 0 to 1 */ + + for (int nx = xmin; nx < xmax; nx += step) { + const int index = (nx - x) + filtersize_; + float value = finv_test(buffer[bufferindex], do_invert); + float multiplier; + + /* gauss */ + { + multiplier = gausstab_[index]; + alpha_accum += value * multiplier; + multiplier_accum += multiplier; + } + + /* dilate - find most extreme color */ + if (value > value_max) { + multiplier = distbuf_inv_[index]; + value *= multiplier; + if (value > value_max) { + value_max = value; + distfacinv_max = multiplier; + } + } + bufferindex += step; + } + + /* blend between the max value and gauss blue - gives nice feather */ + const float value_blur = alpha_accum / multiplier_accum; + const float value_final = (value_max * distfacinv_max) + (value_blur * (1.0f - distfacinv_max)); + output[0] = finv_test(value_final, do_invert); +} + +void GaussianAlphaXBlurOperation::deinit_execution() +{ + GaussianAlphaBlurBaseOperation::deinit_execution(); + + if (gausstab_) { + MEM_freeN(gausstab_); + gausstab_ = nullptr; + } + + if (distbuf_inv_) { + MEM_freeN(distbuf_inv_); + distbuf_inv_ = nullptr; + } + + deinit_mutex(); +} + +bool GaussianAlphaXBlurOperation::determine_depending_area_of_interest( + rcti *input, ReadBufferOperation *read_operation, rcti *output) +{ + rcti new_input; +#if 0 /* until we add size input */ + rcti size_input; + size_input.xmin = 0; + size_input.ymin = 0; + size_input.xmax = 5; + size_input.ymax = 5; + + NodeOperation *operation = this->get_input_operation(1); + if (operation->determine_depending_area_of_interest(&size_input, read_operation, output)) { + return true; + } + else +#endif + { + if (sizeavailable_ && gausstab_ != nullptr) { + new_input.xmax = input->xmax + filtersize_ + 1; + new_input.xmin = input->xmin - filtersize_ - 1; + new_input.ymax = input->ymax; + new_input.ymin = input->ymin; + } + else { + new_input.xmax = this->get_width(); + new_input.xmin = 0; + new_input.ymax = this->get_height(); + new_input.ymin = 0; + } + return NodeOperation::determine_depending_area_of_interest(&new_input, read_operation, output); + } +} + +} // namespace blender::compositor diff --git a/source/blender/compositor/operations/COM_GaussianAlphaXBlurOperation.h b/source/blender/compositor/operations/COM_GaussianAlphaXBlurOperation.h new file mode 100644 index 00000000000..7d6c9c0213f --- /dev/null +++ b/source/blender/compositor/operations/COM_GaussianAlphaXBlurOperation.h @@ -0,0 +1,40 @@ +/* SPDX-FileCopyrightText: 2011 Blender Authors + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +#pragma once + +#include "COM_GaussianAlphaBlurBaseOperation.h" + +namespace blender::compositor { + +/* TODO(manzanilla): everything to be removed with tiled implementation except the constructor. */ +class GaussianAlphaXBlurOperation : public GaussianAlphaBlurBaseOperation { + private: + void update_gauss(); + + public: + GaussianAlphaXBlurOperation(); + + /** + * \brief The inner loop of this operation. + */ + void execute_pixel(float output[4], int x, int y, void *data) override; + + /** + * \brief initialize the execution + */ + void init_execution() override; + + /** + * \brief Deinitialize the execution + */ + void deinit_execution() override; + + void *initialize_tile_data(rcti *rect) override; + bool determine_depending_area_of_interest(rcti *input, + ReadBufferOperation *read_operation, + rcti *output) override; +}; + +} // namespace blender::compositor diff --git a/source/blender/compositor/operations/COM_GaussianAlphaYBlurOperation.cc b/source/blender/compositor/operations/COM_GaussianAlphaYBlurOperation.cc new file mode 100644 index 00000000000..865a63b4e99 --- /dev/null +++ b/source/blender/compositor/operations/COM_GaussianAlphaYBlurOperation.cc @@ -0,0 +1,171 @@ +/* SPDX-FileCopyrightText: 2011 Blender Authors + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +#include "COM_GaussianAlphaYBlurOperation.h" + +namespace blender::compositor { + +GaussianAlphaYBlurOperation::GaussianAlphaYBlurOperation() + : GaussianAlphaBlurBaseOperation(eDimension::Y) +{ +} + +void *GaussianAlphaYBlurOperation::initialize_tile_data(rcti * /*rect*/) +{ + lock_mutex(); + if (!sizeavailable_) { + update_gauss(); + } + void *buffer = get_input_operation(0)->initialize_tile_data(nullptr); + unlock_mutex(); + return buffer; +} + +/* TODO(manzanilla): to be removed with tiled implementation. */ +void GaussianAlphaYBlurOperation::init_execution() +{ + GaussianAlphaBlurBaseOperation::init_execution(); + + init_mutex(); + + if (sizeavailable_ && execution_model_ == eExecutionModel::Tiled) { + float rad = max_ff(size_ * data_.sizey, 0.0f); + filtersize_ = min_ii(ceil(rad), MAX_GAUSSTAB_RADIUS); + + gausstab_ = BlurBaseOperation::make_gausstab(rad, filtersize_); + distbuf_inv_ = BlurBaseOperation::make_dist_fac_inverse(rad, filtersize_, falloff_); + } +} + +/* TODO(manzanilla): to be removed with tiled implementation. */ +void GaussianAlphaYBlurOperation::update_gauss() +{ + if (gausstab_ == nullptr) { + update_size(); + float rad = max_ff(size_ * data_.sizey, 0.0f); + rad = min_ff(rad, MAX_GAUSSTAB_RADIUS); + filtersize_ = min_ii(ceil(rad), MAX_GAUSSTAB_RADIUS); + + gausstab_ = BlurBaseOperation::make_gausstab(rad, filtersize_); + } + + if (distbuf_inv_ == nullptr) { + update_size(); + float rad = max_ff(size_ * data_.sizey, 0.0f); + filtersize_ = min_ii(ceil(rad), MAX_GAUSSTAB_RADIUS); + + distbuf_inv_ = BlurBaseOperation::make_dist_fac_inverse(rad, filtersize_, falloff_); + } +} + +void GaussianAlphaYBlurOperation::execute_pixel(float output[4], int x, int y, void *data) +{ + const bool do_invert = do_subtract_; + MemoryBuffer *input_buffer = (MemoryBuffer *)data; + const rcti &input_rect = input_buffer->get_rect(); + float *buffer = input_buffer->get_buffer(); + int bufferwidth = input_buffer->get_width(); + int bufferstartx = input_rect.xmin; + int bufferstarty = input_rect.ymin; + + int xmin = max_ii(x, input_rect.xmin); + int ymin = max_ii(y - filtersize_, input_rect.ymin); + int ymax = min_ii(y + filtersize_ + 1, input_rect.ymax); + + /* *** this is the main part which is different to 'GaussianYBlurOperation' *** */ + int step = get_step(); + + /* gauss */ + float alpha_accum = 0.0f; + float multiplier_accum = 0.0f; + + /* dilate */ + float value_max = finv_test( + buffer[(x) + (y * bufferwidth)], + do_invert); /* init with the current color to avoid unneeded lookups */ + float distfacinv_max = 1.0f; /* 0 to 1 */ + + for (int ny = ymin; ny < ymax; ny += step) { + int bufferindex = (xmin - bufferstartx) + ((ny - bufferstarty) * bufferwidth); + + const int index = (ny - y) + filtersize_; + float value = finv_test(buffer[bufferindex], do_invert); + float multiplier; + + /* gauss */ + { + multiplier = gausstab_[index]; + alpha_accum += value * multiplier; + multiplier_accum += multiplier; + } + + /* dilate - find most extreme color */ + if (value > value_max) { + multiplier = distbuf_inv_[index]; + value *= multiplier; + if (value > value_max) { + value_max = value; + distfacinv_max = multiplier; + } + } + } + + /* blend between the max value and gauss blue - gives nice feather */ + const float value_blur = alpha_accum / multiplier_accum; + const float value_final = (value_max * distfacinv_max) + (value_blur * (1.0f - distfacinv_max)); + output[0] = finv_test(value_final, do_invert); +} + +void GaussianAlphaYBlurOperation::deinit_execution() +{ + GaussianAlphaBlurBaseOperation::deinit_execution(); + + if (gausstab_) { + MEM_freeN(gausstab_); + gausstab_ = nullptr; + } + + if (distbuf_inv_) { + MEM_freeN(distbuf_inv_); + distbuf_inv_ = nullptr; + } + + deinit_mutex(); +} + +bool GaussianAlphaYBlurOperation::determine_depending_area_of_interest( + rcti *input, ReadBufferOperation *read_operation, rcti *output) +{ + rcti new_input; +#if 0 /* until we add size input */ + rcti size_input; + size_input.xmin = 0; + size_input.ymin = 0; + size_input.xmax = 5; + size_input.ymax = 5; + + NodeOperation *operation = this->get_input_operation(1); + if (operation->determine_depending_area_of_interest(&size_input, read_operation, output)) { + return true; + } + else +#endif + { + if (sizeavailable_ && gausstab_ != nullptr) { + new_input.xmax = input->xmax; + new_input.xmin = input->xmin; + new_input.ymax = input->ymax + filtersize_ + 1; + new_input.ymin = input->ymin - filtersize_ - 1; + } + else { + new_input.xmax = this->get_width(); + new_input.xmin = 0; + new_input.ymax = this->get_height(); + new_input.ymin = 0; + } + return NodeOperation::determine_depending_area_of_interest(&new_input, read_operation, output); + } +} + +} // namespace blender::compositor diff --git a/source/blender/compositor/operations/COM_GaussianAlphaYBlurOperation.h b/source/blender/compositor/operations/COM_GaussianAlphaYBlurOperation.h new file mode 100644 index 00000000000..4125eeb8744 --- /dev/null +++ b/source/blender/compositor/operations/COM_GaussianAlphaYBlurOperation.h @@ -0,0 +1,40 @@ +/* SPDX-FileCopyrightText: 2011 Blender Authors + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +#pragma once + +#include "COM_GaussianAlphaBlurBaseOperation.h" + +namespace blender::compositor { + +/* TODO(manzanilla): everything to be removed with tiled implementation except the constructor. */ +class GaussianAlphaYBlurOperation : public GaussianAlphaBlurBaseOperation { + private: + void update_gauss(); + + public: + GaussianAlphaYBlurOperation(); + + /** + * The inner loop of this operation. + */ + void execute_pixel(float output[4], int x, int y, void *data) override; + + /** + * \brief initialize the execution + */ + void init_execution() override; + + /** + * Deinitialize the execution + */ + void deinit_execution() override; + + void *initialize_tile_data(rcti *rect) override; + bool determine_depending_area_of_interest(rcti *input, + ReadBufferOperation *read_operation, + rcti *output) override; +}; + +} // namespace blender::compositor diff --git a/source/blender/compositor/operations/COM_GaussianBlurBaseOperation.cc b/source/blender/compositor/operations/COM_GaussianBlurBaseOperation.cc index ac2ff5407ea..c2987b7bf66 100644 --- a/source/blender/compositor/operations/COM_GaussianBlurBaseOperation.cc +++ b/source/blender/compositor/operations/COM_GaussianBlurBaseOperation.cc @@ -21,18 +21,22 @@ GaussianBlurBaseOperation::GaussianBlurBaseOperation(eDimension dim) void GaussianBlurBaseOperation::init_data() { BlurBaseOperation::init_data(); - rad_ = max_ff(size_ * this->get_blur_size(dimension_), 0.0f); - rad_ = min_ff(rad_, MAX_GAUSSTAB_RADIUS); - filtersize_ = min_ii(ceil(rad_), MAX_GAUSSTAB_RADIUS); + if (execution_model_ == eExecutionModel::FullFrame) { + rad_ = max_ff(size_ * this->get_blur_size(dimension_), 0.0f); + rad_ = min_ff(rad_, MAX_GAUSSTAB_RADIUS); + filtersize_ = min_ii(ceil(rad_), MAX_GAUSSTAB_RADIUS); + } } void GaussianBlurBaseOperation::init_execution() { BlurBaseOperation::init_execution(); - gausstab_ = BlurBaseOperation::make_gausstab(rad_, filtersize_); + if (execution_model_ == eExecutionModel::FullFrame) { + gausstab_ = BlurBaseOperation::make_gausstab(rad_, filtersize_); #if BLI_HAVE_SSE2 - gausstab_sse_ = BlurBaseOperation::convert_gausstab_sse(gausstab_, filtersize_); + gausstab_sse_ = BlurBaseOperation::convert_gausstab_sse(gausstab_, filtersize_); #endif + } } void GaussianBlurBaseOperation::deinit_execution() @@ -77,29 +81,59 @@ void GaussianBlurBaseOperation::update_memory_buffer_partial(MemoryBuffer *outpu const rcti &area, Span inputs) { - const int2 unit_offset = dimension_ == eDimension::X ? int2(1, 0) : int2(0, 1); MemoryBuffer *input = inputs[IMAGE_INPUT_INDEX]; - for (BuffersIterator it = output->iterate_with({input}, area); !it.is_end(); ++it) { - alignas(16) float4 accumulated_color = float4(0.0f); + const rcti &input_rect = input->get_rect(); + BuffersIterator it = output->iterate_with({input}, area); + + int min_input_coord = -1; + int max_input_coord = -1; + int elem_stride = -1; + std::function get_current_coord; + switch (dimension_) { + case eDimension::X: + min_input_coord = input_rect.xmin; + max_input_coord = input_rect.xmax; + elem_stride = input->elem_stride; + get_current_coord = [&] { return it.x; }; + break; + case eDimension::Y: + min_input_coord = input_rect.ymin; + max_input_coord = input_rect.ymax; + elem_stride = input->row_stride; + get_current_coord = [&] { return it.y; }; + break; + } + + for (; !it.is_end(); ++it) { + const int coord = get_current_coord(); + const int coord_min = max_ii(coord - filtersize_, min_input_coord); + const int coord_max = min_ii(coord + filtersize_ + 1, max_input_coord); + + float ATTR_ALIGN(16) color_accum[4] = {0.0f, 0.0f, 0.0f, 0.0f}; + float multiplier_accum = 0.0f; + + const int step = QualityStepHelper::get_step(); + const float *in = it.in(0) + (intptr_t(coord_min) - coord) * elem_stride; + const int in_stride = elem_stride * step; + int gauss_idx = (coord_min - coord) + filtersize_; + const int gauss_end = gauss_idx + (coord_max - coord_min); #if BLI_HAVE_SSE2 - __m128 accumulated_color_sse = _mm_setzero_ps(); - for (int i = -filtersize_; i <= filtersize_; i++) { - const int2 offset = unit_offset * i; - __m128 weight = gausstab_sse_[i + filtersize_]; - __m128 color = _mm_load_ps(input->get_elem_clamped(it.x + offset.x, it.y + offset.y)); - __m128 weighted_color = _mm_mul_ps(color, weight); - accumulated_color_sse = _mm_add_ps(accumulated_color_sse, weighted_color); + __m128 accum_r = _mm_load_ps(color_accum); + for (; gauss_idx < gauss_end; in += in_stride, gauss_idx += step) { + __m128 reg_a = _mm_load_ps(in); + reg_a = _mm_mul_ps(reg_a, gausstab_sse_[gauss_idx]); + accum_r = _mm_add_ps(accum_r, reg_a); + multiplier_accum += gausstab_[gauss_idx]; } - _mm_store_ps(accumulated_color, accumulated_color_sse); + _mm_store_ps(color_accum, accum_r); #else - for (int i = -filtersize_; i <= filtersize_; i++) { - const int2 offset = unit_offset * i; - const float weight = gausstab_[i + filtersize_]; - const float4 color = input->get_elem_clamped(it.x + offset.x, it.y + offset.y); - accumulated_color += color * weight; + for (; gauss_idx < gauss_end; in += in_stride, gauss_idx += step) { + const float multiplier = gausstab_[gauss_idx]; + madd_v4_v4fl(color_accum, in, multiplier); + multiplier_accum += multiplier; } #endif - copy_v4_v4(it.out, accumulated_color); + mul_v4_v4fl(it.out, color_accum, 1.0f / multiplier_accum); } } diff --git a/source/blender/compositor/operations/COM_GaussianBlurBaseOperation.h b/source/blender/compositor/operations/COM_GaussianBlurBaseOperation.h index c35fe56e199..f72c6e604fd 100644 --- a/source/blender/compositor/operations/COM_GaussianBlurBaseOperation.h +++ b/source/blender/compositor/operations/COM_GaussianBlurBaseOperation.h @@ -31,14 +31,4 @@ class GaussianBlurBaseOperation : public BlurBaseOperation { Span inputs) override; }; -class GaussianXBlurOperation : public GaussianBlurBaseOperation { - public: - GaussianXBlurOperation() : GaussianBlurBaseOperation(eDimension::X) {} -}; - -class GaussianYBlurOperation : public GaussianBlurBaseOperation { - public: - GaussianYBlurOperation() : GaussianBlurBaseOperation(eDimension::Y) {} -}; - } // namespace blender::compositor diff --git a/source/blender/compositor/operations/COM_GaussianBokehBlurOperation.cc b/source/blender/compositor/operations/COM_GaussianBokehBlurOperation.cc index 4a1f337033a..3f514f69d11 100644 --- a/source/blender/compositor/operations/COM_GaussianBokehBlurOperation.cc +++ b/source/blender/compositor/operations/COM_GaussianBokehBlurOperation.cc @@ -2,11 +2,6 @@ * * SPDX-License-Identifier: GPL-2.0-or-later */ -#include - -#include "BLI_index_range.hh" -#include "BLI_math_vector.hh" - #include "COM_GaussianBokehBlurOperation.h" #include "RE_pipeline.h" @@ -18,14 +13,27 @@ GaussianBokehBlurOperation::GaussianBokehBlurOperation() : BlurBaseOperation(Dat gausstab_ = nullptr; } +void *GaussianBokehBlurOperation::initialize_tile_data(rcti * /*rect*/) +{ + lock_mutex(); + if (!sizeavailable_) { + update_gauss(); + } + void *buffer = get_input_operation(0)->initialize_tile_data(nullptr); + unlock_mutex(); + return buffer; +} + void GaussianBokehBlurOperation::init_data() { BlurBaseOperation::init_data(); const float width = this->get_width(); const float height = this->get_height(); - if (!sizeavailable_) { - update_size(); + if (execution_model_ == eExecutionModel::FullFrame) { + if (!sizeavailable_) { + update_size(); + } } radxf_ = size_ * float(data_.sizex); @@ -43,6 +51,8 @@ void GaussianBokehBlurOperation::init_execution() { BlurBaseOperation::init_execution(); + init_mutex(); + if (sizeavailable_) { update_gauss(); } @@ -87,6 +97,62 @@ void GaussianBokehBlurOperation::update_gauss() } } +void GaussianBokehBlurOperation::execute_pixel(float output[4], int x, int y, void *data) +{ + float result[4]; + input_size_->read_sampled(result, 0, 0, PixelSampler::Nearest); + size_ = result[0]; + + const float width = this->get_width(); + const float height = this->get_height(); + + radxf_ = size_ * float(data_.sizex); + CLAMP(radxf_, 0.0f, width / 2.0f); + + radyf_ = size_ * float(data_.sizey); + CLAMP(radyf_, 0.0f, height / 2.0f); + + radx_ = ceil(radxf_); + rady_ = ceil(radyf_); + + float temp_color[4]; + temp_color[0] = 0; + temp_color[1] = 0; + temp_color[2] = 0; + temp_color[3] = 0; + float multiplier_accum = 0; + MemoryBuffer *input_buffer = (MemoryBuffer *)data; + float *buffer = input_buffer->get_buffer(); + int bufferwidth = input_buffer->get_width(); + const rcti &input_rect = input_buffer->get_rect(); + int bufferstartx = input_rect.xmin; + int bufferstarty = input_rect.ymin; + + int ymin = max_ii(y - rady_, input_rect.ymin); + int ymax = min_ii(y + rady_ + 1, input_rect.ymax); + int xmin = max_ii(x - radx_, input_rect.xmin); + int xmax = min_ii(x + radx_ + 1, input_rect.xmax); + + int index; + int step = QualityStepHelper::get_step(); + int offsetadd = QualityStepHelper::get_offset_add(); + const int add_const = (xmin - x + radx_); + const int mul_const = (radx_ * 2 + 1); + for (int ny = ymin; ny < ymax; ny += step) { + index = ((ny - y) + rady_) * mul_const + add_const; + int bufferindex = ((xmin - bufferstartx) * 4) + ((ny - bufferstarty) * 4 * bufferwidth); + for (int nx = xmin; nx < xmax; nx += step) { + const float multiplier = gausstab_[index]; + madd_v4_v4fl(temp_color, &buffer[bufferindex], multiplier); + multiplier_accum += multiplier; + index += step; + bufferindex += offsetadd; + } + } + + mul_v4_v4fl(output, temp_color, 1.0f / multiplier_accum); +} + void GaussianBokehBlurOperation::deinit_execution() { BlurBaseOperation::deinit_execution(); @@ -95,6 +161,41 @@ void GaussianBokehBlurOperation::deinit_execution() MEM_freeN(gausstab_); gausstab_ = nullptr; } + + deinit_mutex(); +} + +bool GaussianBokehBlurOperation::determine_depending_area_of_interest( + rcti *input, ReadBufferOperation *read_operation, rcti *output) +{ + rcti new_input; + rcti size_input; + size_input.xmin = 0; + size_input.ymin = 0; + size_input.xmax = 5; + size_input.ymax = 5; + NodeOperation *operation = this->get_input_operation(1); + + if (operation->determine_depending_area_of_interest(&size_input, read_operation, output)) { + return true; + } + + if (sizeavailable_ && gausstab_ != nullptr) { + new_input.xmin = 0; + new_input.ymin = 0; + new_input.xmax = this->get_width(); + new_input.ymax = this->get_height(); + } + else { + int addx = radx_; + int addy = rady_; + new_input.xmax = input->xmax + addx; + new_input.xmin = input->xmin - addx; + new_input.ymax = input->ymax + addy; + new_input.ymin = input->ymin - addy; + } + return BlurBaseOperation::determine_depending_area_of_interest( + &new_input, read_operation, output); } void GaussianBokehBlurOperation::get_area_of_interest(const int input_idx, @@ -153,7 +254,7 @@ void GaussianBokehBlurOperation::update_memory_buffer_partial(MemoryBuffer *outp GaussianBlurReferenceOperation::GaussianBlurReferenceOperation() : BlurBaseOperation(DataType::Color) { - weights_ = nullptr; + maintabs_ = nullptr; use_variable_size_ = true; } @@ -202,6 +303,12 @@ void GaussianBlurReferenceOperation::init_data() rady_ = float(filtersizey_); } +void *GaussianBlurReferenceOperation::initialize_tile_data(rcti * /*rect*/) +{ + void *buffer = get_input_operation(0)->initialize_tile_data(nullptr); + return buffer; +} + void GaussianBlurReferenceOperation::init_execution() { BlurBaseOperation::init_execution(); @@ -211,45 +318,109 @@ void GaussianBlurReferenceOperation::init_execution() void GaussianBlurReferenceOperation::update_gauss() { - const int2 radius = int2(filtersizex_, filtersizey_); - const float2 scale = math::safe_divide(float2(1.0f), float2(radius)); - const int2 size = radius + int2(1); + int i; + int x = std::max(filtersizex_, filtersizey_); + maintabs_ = (float **)MEM_mallocN(x * sizeof(float *), "gauss array"); + for (i = 0; i < x; i++) { + maintabs_[i] = make_gausstab(i + 1, i + 1); + } +} - rcti weights_area; - BLI_rcti_init(&weights_area, 0, size.x, 0, size.y); - weights_ = std::make_unique(DataType::Value, weights_area, false); - - float sum = 0.0f; - - const float center_weight = RE_filter_value(data_.filtertype, 0.0f); - *weights_->get_elem(0, 0) = center_weight; - sum += center_weight; - - for (const int x : IndexRange(size.x).drop_front(1)) { - const float weight = RE_filter_value(data_.filtertype, x * scale.x); - *weights_->get_elem(x, 0) = weight; - sum += weight * 2.0f; +void GaussianBlurReferenceOperation::execute_pixel(float output[4], int x, int y, void *data) +{ + MemoryBuffer *memorybuffer = (MemoryBuffer *)data; + float *buffer = memorybuffer->get_buffer(); + float *gausstabx, *gausstabcenty; + float *gausstaby, *gausstabcentx; + int i, j; + float *src; + float sum, val; + float rval, gval, bval, aval; + int imgx = get_width(); + int imgy = get_height(); + float temp_size[4]; + input_size_->read(temp_size, x, y, data); + float ref_size = temp_size[0]; + int refradx = int(ref_size * radx_); + int refrady = int(ref_size * rady_); + if (refradx > filtersizex_) { + refradx = filtersizex_; + } + else if (refradx < 1) { + refradx = 1; + } + if (refrady > filtersizey_) { + refrady = filtersizey_; + } + else if (refrady < 1) { + refrady = 1; } - for (const int y : IndexRange(size.y).drop_front(1)) { - const float weight = RE_filter_value(data_.filtertype, y * scale.y); - *weights_->get_elem(0, y) = weight; - sum += weight * 2.0f; + if (refradx == 1 && refrady == 1) { + memorybuffer->read_no_check(output, x, y); } + else { + int minxr = x - refradx < 0 ? -x : -refradx; + int maxxr = x + refradx > imgx ? imgx - x : refradx; + int minyr = y - refrady < 0 ? -y : -refrady; + int maxyr = y + refrady > imgy ? imgy - y : refrady; - for (const int y : IndexRange(size.y).drop_front(1)) { - for (const int x : IndexRange(size.x).drop_front(1)) { - const float weight = RE_filter_value(data_.filtertype, math::length(float2(x, y) * scale)); - *weights_->get_elem(x, y) = weight; - sum += weight * 4.0f; + float *srcd = buffer + COM_DATA_TYPE_COLOR_CHANNELS * ((y + minyr) * imgx + x + minxr); + + gausstabx = maintabs_[refradx - 1]; + gausstabcentx = gausstabx + refradx; + gausstaby = maintabs_[refrady - 1]; + gausstabcenty = gausstaby + refrady; + + sum = gval = rval = bval = aval = 0.0f; + for (i = minyr; i < maxyr; i++, srcd += COM_DATA_TYPE_COLOR_CHANNELS * imgx) { + src = srcd; + for (j = minxr; j < maxxr; j++, src += COM_DATA_TYPE_COLOR_CHANNELS) { + + val = gausstabcenty[i] * gausstabcentx[j]; + sum += val; + rval += val * src[0]; + gval += val * src[1]; + bval += val * src[2]; + aval += val * src[3]; + } } + sum = 1.0f / sum; + output[0] = rval * sum; + output[1] = gval * sum; + output[2] = bval * sum; + output[3] = aval * sum; + } +} + +void GaussianBlurReferenceOperation::deinit_execution() +{ + int x, i; + x = std::max(filtersizex_, filtersizey_); + for (i = 0; i < x; i++) { + MEM_freeN(maintabs_[i]); + } + MEM_freeN(maintabs_); + BlurBaseOperation::deinit_execution(); +} + +bool GaussianBlurReferenceOperation::determine_depending_area_of_interest( + rcti *input, ReadBufferOperation *read_operation, rcti *output) +{ + rcti new_input; + NodeOperation *operation = this->get_input_operation(1); + + if (operation->determine_depending_area_of_interest(input, read_operation, output)) { + return true; } - for (const int y : IndexRange(size.y)) { - for (const int x : IndexRange(size.x)) { - *weights_->get_elem(x, y) /= sum; - } - } + int addx = data_.sizex + 2; + int addy = data_.sizey + 2; + new_input.xmax = input->xmax + addx; + new_input.xmin = input->xmin - addx; + new_input.ymax = input->ymax + addy; + new_input.ymin = input->ymin - addy; + return NodeOperation::determine_depending_area_of_interest(&new_input, read_operation, output); } void GaussianBlurReferenceOperation::get_area_of_interest(const int input_idx, @@ -273,56 +444,56 @@ void GaussianBlurReferenceOperation::update_memory_buffer_partial(MemoryBuffer * const rcti &area, Span inputs) { - const MemoryBuffer *size_input = inputs[SIZE_INPUT_INDEX]; const MemoryBuffer *image_input = inputs[IMAGE_INPUT_INDEX]; - - int2 weights_size = int2(weights_->get_width(), weights_->get_height()); - int2 base_radius = weights_size - int2(1); - - for (BuffersIterator it = output->iterate_with({}, area); !it.is_end(); ++it) { - float4 accumulated_color = float4(0.0f); - float4 accumulated_weight = float4(0.0f); - - int2 radius = int2(math::ceil(float2(base_radius) * *size_input->get_elem(it.x, it.y))); - - float4 center_color = float4(image_input->get_elem_clamped(it.x, it.y)); - float center_weight = *weights_->get_elem(0, 0); - accumulated_color += center_color * center_weight; - accumulated_weight += center_weight; - - for (int x = 1; x <= radius.x; x++) { - float weight_coordinates = (x / float(radius.x)) * base_radius.x; - float weight; - weights_->read_elem_bilinear(weight_coordinates, 0.0f, &weight); - accumulated_color += float4(image_input->get_elem_clamped(it.x + x, it.y)) * weight; - accumulated_color += float4(image_input->get_elem_clamped(it.x - x, it.y)) * weight; - accumulated_weight += weight * 2.0f; + MemoryBuffer *size_input = inputs[SIZE_INPUT_INDEX]; + for (BuffersIterator it = output->iterate_with({size_input}, area); !it.is_end(); ++it) { + const float ref_size = *it.in(0); + int ref_radx = int(ref_size * radx_); + int ref_rady = int(ref_size * rady_); + if (ref_radx > filtersizex_) { + ref_radx = filtersizex_; + } + else if (ref_radx < 1) { + ref_radx = 1; + } + if (ref_rady > filtersizey_) { + ref_rady = filtersizey_; + } + else if (ref_rady < 1) { + ref_rady = 1; } - for (int y = 1; y <= radius.y; y++) { - float weight_coordinates = (y / float(radius.y)) * base_radius.y; - float weight; - weights_->read_elem_bilinear(0.0f, weight_coordinates, &weight); - accumulated_color += float4(image_input->get_elem_clamped(it.x, it.y + y)) * weight; - accumulated_color += float4(image_input->get_elem_clamped(it.x, it.y - y)) * weight; - accumulated_weight += weight * 2.0f; + const int x = it.x; + const int y = it.y; + if (ref_radx == 1 && ref_rady == 1) { + image_input->read_elem(x, y, it.out); + continue; } - for (int y = 1; y <= radius.y; y++) { - for (int x = 1; x <= radius.x; x++) { - float2 weight_coordinates = (float2(x, y) / float2(radius)) * float2(base_radius); - float weight; - weights_->read_elem_bilinear(weight_coordinates.x, weight_coordinates.y, &weight); - accumulated_color += float4(image_input->get_elem_clamped(it.x + x, it.y + y)) * weight; - accumulated_color += float4(image_input->get_elem_clamped(it.x - x, it.y + y)) * weight; - accumulated_color += float4(image_input->get_elem_clamped(it.x + x, it.y - y)) * weight; - accumulated_color += float4(image_input->get_elem_clamped(it.x - x, it.y - y)) * weight; - accumulated_weight += weight * 4.0f; + const int w = get_width(); + const int height = get_height(); + const int minxr = x - ref_radx < 0 ? -x : -ref_radx; + const int maxxr = x + ref_radx > w ? w - x : ref_radx; + const int minyr = y - ref_rady < 0 ? -y : -ref_rady; + const int maxyr = y + ref_rady > height ? height - y : ref_rady; + + const float *gausstabx = maintabs_[ref_radx - 1]; + const float *gausstabcentx = gausstabx + ref_radx; + const float *gausstaby = maintabs_[ref_rady - 1]; + const float *gausstabcenty = gausstaby + ref_rady; + + float gauss_sum = 0.0f; + float color_sum[4] = {0}; + const float *row_color = image_input->get_elem(x + minxr, y + minyr); + for (int i = minyr; i < maxyr; i++, row_color += image_input->row_stride) { + const float *color = row_color; + for (int j = minxr; j < maxxr; j++, color += image_input->elem_stride) { + const float val = gausstabcenty[i] * gausstabcentx[j]; + gauss_sum += val; + madd_v4_v4fl(color_sum, color, val); } } - - accumulated_color = math::safe_divide(accumulated_color, accumulated_weight); - copy_v4_v4(it.out, accumulated_color); + mul_v4_v4fl(it.out, color_sum, 1.0f / gauss_sum); } } diff --git a/source/blender/compositor/operations/COM_GaussianBokehBlurOperation.h b/source/blender/compositor/operations/COM_GaussianBokehBlurOperation.h index 63728bccc0b..14bb7074569 100644 --- a/source/blender/compositor/operations/COM_GaussianBokehBlurOperation.h +++ b/source/blender/compositor/operations/COM_GaussianBokehBlurOperation.h @@ -4,8 +4,6 @@ #pragma once -#include - #include "COM_BlurBaseOperation.h" #include "COM_NodeOperation.h" #include "COM_QualityStepHelper.h" @@ -24,8 +22,21 @@ class GaussianBokehBlurOperation : public BlurBaseOperation { GaussianBokehBlurOperation(); void init_data() override; void init_execution() override; + void *initialize_tile_data(rcti *rect) override; + /** + * The inner loop of this operation. + */ + void execute_pixel(float output[4], int x, int y, void *data) override; + + /** + * Deinitialize the execution + */ void deinit_execution() override; + bool determine_depending_area_of_interest(rcti *input, + ReadBufferOperation *read_operation, + rcti *output) override; + void get_area_of_interest(int input_idx, const rcti &output_area, rcti &r_input_area) override; void update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, @@ -34,7 +45,7 @@ class GaussianBokehBlurOperation : public BlurBaseOperation { class GaussianBlurReferenceOperation : public BlurBaseOperation { private: - std::unique_ptr weights_; + float **maintabs_; void update_gauss(); int filtersizex_; @@ -46,6 +57,20 @@ class GaussianBlurReferenceOperation : public BlurBaseOperation { GaussianBlurReferenceOperation(); void init_data() override; void init_execution() override; + void *initialize_tile_data(rcti *rect) override; + /** + * The inner loop of this operation. + */ + void execute_pixel(float output[4], int x, int y, void *data) override; + + /** + * Deinitialize the execution + */ + void deinit_execution() override; + + bool determine_depending_area_of_interest(rcti *input, + ReadBufferOperation *read_operation, + rcti *output) override; void get_area_of_interest(int input_idx, const rcti &output_area, rcti &r_input_area) override; void update_memory_buffer_partial(MemoryBuffer *output, diff --git a/source/blender/compositor/operations/COM_GaussianXBlurOperation.cc b/source/blender/compositor/operations/COM_GaussianXBlurOperation.cc new file mode 100644 index 00000000000..537ad0fefa3 --- /dev/null +++ b/source/blender/compositor/operations/COM_GaussianXBlurOperation.cc @@ -0,0 +1,185 @@ +/* SPDX-FileCopyrightText: 2011 Blender Authors + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +#include "COM_GaussianXBlurOperation.h" +#include "COM_OpenCLDevice.h" + +namespace blender::compositor { + +GaussianXBlurOperation::GaussianXBlurOperation() : GaussianBlurBaseOperation(eDimension::X) {} + +void *GaussianXBlurOperation::initialize_tile_data(rcti * /*rect*/) +{ + lock_mutex(); + if (!sizeavailable_) { + update_gauss(); + } + void *buffer = get_input_operation(0)->initialize_tile_data(nullptr); + unlock_mutex(); + return buffer; +} + +/* TODO(manzanilla): to be removed with tiled implementation. */ +void GaussianXBlurOperation::init_execution() +{ + GaussianBlurBaseOperation::init_execution(); + + init_mutex(); + + if (sizeavailable_ && execution_model_ == eExecutionModel::Tiled) { + float rad = max_ff(size_ * data_.sizex, 0.0f); + filtersize_ = min_ii(ceil(rad), MAX_GAUSSTAB_RADIUS); + + /* TODO(sergey): De-duplicate with the case below and Y blur. */ + gausstab_ = BlurBaseOperation::make_gausstab(rad, filtersize_); +#if BLI_HAVE_SSE2 + gausstab_sse_ = BlurBaseOperation::convert_gausstab_sse(gausstab_, filtersize_); +#endif + } +} + +/* TODO(manzanilla): to be removed with tiled implementation. */ +void GaussianXBlurOperation::update_gauss() +{ + if (gausstab_ == nullptr) { + update_size(); + float rad = max_ff(size_ * data_.sizex, 0.0f); + rad = min_ff(rad, MAX_GAUSSTAB_RADIUS); + filtersize_ = min_ii(ceil(rad), MAX_GAUSSTAB_RADIUS); + + gausstab_ = BlurBaseOperation::make_gausstab(rad, filtersize_); +#if BLI_HAVE_SSE2 + gausstab_sse_ = BlurBaseOperation::convert_gausstab_sse(gausstab_, filtersize_); +#endif + } +} + +void GaussianXBlurOperation::execute_pixel(float output[4], int x, int y, void *data) +{ + float ATTR_ALIGN(16) color_accum[4] = {0.0f, 0.0f, 0.0f, 0.0f}; + float multiplier_accum = 0.0f; + MemoryBuffer *input_buffer = (MemoryBuffer *)data; + const rcti &input_rect = input_buffer->get_rect(); + float *buffer = input_buffer->get_buffer(); + int bufferwidth = input_buffer->get_width(); + int bufferstartx = input_rect.xmin; + int bufferstarty = input_rect.ymin; + + int xmin = max_ii(x - filtersize_, input_rect.xmin); + int xmax = min_ii(x + filtersize_ + 1, input_rect.xmax); + int ymin = max_ii(y, input_rect.ymin); + + int step = get_step(); + int offsetadd = get_offset_add(); + int bufferindex = ((xmin - bufferstartx) * 4) + ((ymin - bufferstarty) * 4 * bufferwidth); + +#if BLI_HAVE_SSE2 + __m128 accum_r = _mm_load_ps(color_accum); + for (int nx = xmin, index = (xmin - x) + filtersize_; nx < xmax; nx += step, index += step) { + __m128 reg_a = _mm_load_ps(&buffer[bufferindex]); + reg_a = _mm_mul_ps(reg_a, gausstab_sse_[index]); + accum_r = _mm_add_ps(accum_r, reg_a); + multiplier_accum += gausstab_[index]; + bufferindex += offsetadd; + } + _mm_store_ps(color_accum, accum_r); +#else + for (int nx = xmin, index = (xmin - x) + filtersize_; nx < xmax; nx += step, index += step) { + const float multiplier = gausstab_[index]; + madd_v4_v4fl(color_accum, &buffer[bufferindex], multiplier); + multiplier_accum += multiplier; + bufferindex += offsetadd; + } +#endif + mul_v4_v4fl(output, color_accum, 1.0f / multiplier_accum); +} + +void GaussianXBlurOperation::execute_opencl(OpenCLDevice *device, + MemoryBuffer *output_memory_buffer, + cl_mem cl_output_buffer, + MemoryBuffer **input_memory_buffers, + std::list *cl_mem_to_clean_up, + std::list * /*cl_kernels_to_clean_up*/) +{ + cl_kernel gaussian_xblur_operation_kernel = device->COM_cl_create_kernel( + "gaussian_xblur_operation_kernel", nullptr); + cl_int filter_size = filtersize_; + + cl_mem gausstab = clCreateBuffer(device->get_context(), + CL_MEM_READ_ONLY | CL_MEM_USE_HOST_PTR, + sizeof(float) * (filtersize_ * 2 + 1), + gausstab_, + nullptr); + + device->COM_cl_attach_memory_buffer_to_kernel_parameter(gaussian_xblur_operation_kernel, + 0, + 1, + cl_mem_to_clean_up, + input_memory_buffers, + input_program_); + device->COM_cl_attach_output_memory_buffer_to_kernel_parameter( + gaussian_xblur_operation_kernel, 2, cl_output_buffer); + device->COM_cl_attach_memory_buffer_offset_to_kernel_parameter( + gaussian_xblur_operation_kernel, 3, output_memory_buffer); + clSetKernelArg(gaussian_xblur_operation_kernel, 4, sizeof(cl_int), &filter_size); + device->COM_cl_attach_size_to_kernel_parameter(gaussian_xblur_operation_kernel, 5, this); + clSetKernelArg(gaussian_xblur_operation_kernel, 6, sizeof(cl_mem), &gausstab); + + device->COM_cl_enqueue_range(gaussian_xblur_operation_kernel, output_memory_buffer, 7, this); + + clReleaseMemObject(gausstab); +} + +void GaussianXBlurOperation::deinit_execution() +{ + GaussianBlurBaseOperation::deinit_execution(); + + if (gausstab_) { + MEM_freeN(gausstab_); + gausstab_ = nullptr; + } +#if BLI_HAVE_SSE2 + if (gausstab_sse_) { + MEM_freeN(gausstab_sse_); + gausstab_sse_ = nullptr; + } +#endif + + deinit_mutex(); +} + +bool GaussianXBlurOperation::determine_depending_area_of_interest( + rcti *input, ReadBufferOperation *read_operation, rcti *output) +{ + rcti new_input; + + if (!sizeavailable_) { + rcti size_input; + size_input.xmin = 0; + size_input.ymin = 0; + size_input.xmax = 5; + size_input.ymax = 5; + NodeOperation *operation = this->get_input_operation(1); + if (operation->determine_depending_area_of_interest(&size_input, read_operation, output)) { + return true; + } + } + { + if (sizeavailable_ && gausstab_ != nullptr) { + new_input.xmax = input->xmax + filtersize_ + 1; + new_input.xmin = input->xmin - filtersize_ - 1; + new_input.ymax = input->ymax; + new_input.ymin = input->ymin; + } + else { + new_input.xmax = this->get_width(); + new_input.xmin = 0; + new_input.ymax = this->get_height(); + new_input.ymin = 0; + } + return NodeOperation::determine_depending_area_of_interest(&new_input, read_operation, output); + } +} + +} // namespace blender::compositor diff --git a/source/blender/compositor/operations/COM_GaussianXBlurOperation.h b/source/blender/compositor/operations/COM_GaussianXBlurOperation.h new file mode 100644 index 00000000000..e01110ff697 --- /dev/null +++ b/source/blender/compositor/operations/COM_GaussianXBlurOperation.h @@ -0,0 +1,52 @@ +/* SPDX-FileCopyrightText: 2011 Blender Authors + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +#pragma once + +#include "COM_GaussianBlurBaseOperation.h" + +namespace blender::compositor { + +/* TODO(manzanilla): everything to be removed with tiled implementation except the constructor. */ +class GaussianXBlurOperation : public GaussianBlurBaseOperation { + private: + void update_gauss(); + + public: + GaussianXBlurOperation(); + + /** + * \brief The inner loop of this operation. + */ + void execute_pixel(float output[4], int x, int y, void *data) override; + + void execute_opencl(OpenCLDevice *device, + MemoryBuffer *output_memory_buffer, + cl_mem cl_output_buffer, + MemoryBuffer **input_memory_buffers, + std::list *cl_mem_to_clean_up, + std::list *cl_kernels_to_clean_up) override; + + /** + * \brief initialize the execution + */ + void init_execution() override; + + /** + * \brief Deinitialize the execution + */ + void deinit_execution() override; + + void *initialize_tile_data(rcti *rect) override; + bool determine_depending_area_of_interest(rcti *input, + ReadBufferOperation *read_operation, + rcti *output) override; + + void check_opencl() + { + flags_.open_cl = (data_.sizex >= 128); + } +}; + +} // namespace blender::compositor diff --git a/source/blender/compositor/operations/COM_GaussianYBlurOperation.cc b/source/blender/compositor/operations/COM_GaussianYBlurOperation.cc new file mode 100644 index 00000000000..3d6219147cc --- /dev/null +++ b/source/blender/compositor/operations/COM_GaussianYBlurOperation.cc @@ -0,0 +1,185 @@ +/* SPDX-FileCopyrightText: 2011 Blender Authors + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +#include "COM_GaussianYBlurOperation.h" +#include "COM_OpenCLDevice.h" + +namespace blender::compositor { + +GaussianYBlurOperation::GaussianYBlurOperation() : GaussianBlurBaseOperation(eDimension::Y) {} + +void *GaussianYBlurOperation::initialize_tile_data(rcti * /*rect*/) +{ + lock_mutex(); + if (!sizeavailable_) { + update_gauss(); + } + void *buffer = get_input_operation(0)->initialize_tile_data(nullptr); + unlock_mutex(); + return buffer; +} + +void GaussianYBlurOperation::init_execution() +{ + GaussianBlurBaseOperation::init_execution(); + + init_mutex(); + + if (sizeavailable_ && execution_model_ == eExecutionModel::Tiled) { + float rad = max_ff(size_ * data_.sizey, 0.0f); + filtersize_ = min_ii(ceil(rad), MAX_GAUSSTAB_RADIUS); + + gausstab_ = BlurBaseOperation::make_gausstab(rad, filtersize_); +#if BLI_HAVE_SSE2 + gausstab_sse_ = BlurBaseOperation::convert_gausstab_sse(gausstab_, filtersize_); +#endif + } +} + +void GaussianYBlurOperation::update_gauss() +{ + if (gausstab_ == nullptr) { + update_size(); + float rad = max_ff(size_ * data_.sizey, 0.0f); + rad = min_ff(rad, MAX_GAUSSTAB_RADIUS); + filtersize_ = min_ii(ceil(rad), MAX_GAUSSTAB_RADIUS); + + gausstab_ = BlurBaseOperation::make_gausstab(rad, filtersize_); +#if BLI_HAVE_SSE2 + gausstab_sse_ = BlurBaseOperation::convert_gausstab_sse(gausstab_, filtersize_); +#endif + } +} + +void GaussianYBlurOperation::execute_pixel(float output[4], int x, int y, void *data) +{ + float ATTR_ALIGN(16) color_accum[4] = {0.0f, 0.0f, 0.0f, 0.0f}; + float multiplier_accum = 0.0f; + MemoryBuffer *input_buffer = (MemoryBuffer *)data; + const rcti &input_rect = input_buffer->get_rect(); + float *buffer = input_buffer->get_buffer(); + int bufferwidth = input_buffer->get_width(); + int bufferstartx = input_rect.xmin; + int bufferstarty = input_rect.ymin; + + int xmin = max_ii(x, input_rect.xmin); + int ymin = max_ii(y - filtersize_, input_rect.ymin); + int ymax = min_ii(y + filtersize_ + 1, input_rect.ymax); + + int index; + int step = get_step(); + const int buffer_indexx = ((xmin - bufferstartx) * 4); + +#if BLI_HAVE_SSE2 + __m128 accum_r = _mm_load_ps(color_accum); + for (int ny = ymin; ny < ymax; ny += step) { + index = (ny - y) + filtersize_; + int bufferindex = buffer_indexx + ((ny - bufferstarty) * 4 * bufferwidth); + const float multiplier = gausstab_[index]; + __m128 reg_a = _mm_load_ps(&buffer[bufferindex]); + reg_a = _mm_mul_ps(reg_a, gausstab_sse_[index]); + accum_r = _mm_add_ps(accum_r, reg_a); + multiplier_accum += multiplier; + } + _mm_store_ps(color_accum, accum_r); +#else + for (int ny = ymin; ny < ymax; ny += step) { + index = (ny - y) + filtersize_; + int bufferindex = buffer_indexx + ((ny - bufferstarty) * 4 * bufferwidth); + const float multiplier = gausstab_[index]; + madd_v4_v4fl(color_accum, &buffer[bufferindex], multiplier); + multiplier_accum += multiplier; + } +#endif + mul_v4_v4fl(output, color_accum, 1.0f / multiplier_accum); +} + +void GaussianYBlurOperation::execute_opencl(OpenCLDevice *device, + MemoryBuffer *output_memory_buffer, + cl_mem cl_output_buffer, + MemoryBuffer **input_memory_buffers, + std::list *cl_mem_to_clean_up, + std::list * /*cl_kernels_to_clean_up*/) +{ + cl_kernel gaussian_yblur_operation_kernel = device->COM_cl_create_kernel( + "gaussian_yblur_operation_kernel", nullptr); + cl_int filter_size = filtersize_; + + cl_mem gausstab = clCreateBuffer(device->get_context(), + CL_MEM_READ_ONLY | CL_MEM_USE_HOST_PTR, + sizeof(float) * (filtersize_ * 2 + 1), + gausstab_, + nullptr); + + device->COM_cl_attach_memory_buffer_to_kernel_parameter(gaussian_yblur_operation_kernel, + 0, + 1, + cl_mem_to_clean_up, + input_memory_buffers, + input_program_); + device->COM_cl_attach_output_memory_buffer_to_kernel_parameter( + gaussian_yblur_operation_kernel, 2, cl_output_buffer); + device->COM_cl_attach_memory_buffer_offset_to_kernel_parameter( + gaussian_yblur_operation_kernel, 3, output_memory_buffer); + clSetKernelArg(gaussian_yblur_operation_kernel, 4, sizeof(cl_int), &filter_size); + device->COM_cl_attach_size_to_kernel_parameter(gaussian_yblur_operation_kernel, 5, this); + clSetKernelArg(gaussian_yblur_operation_kernel, 6, sizeof(cl_mem), &gausstab); + + device->COM_cl_enqueue_range(gaussian_yblur_operation_kernel, output_memory_buffer, 7, this); + + clReleaseMemObject(gausstab); +} + +void GaussianYBlurOperation::deinit_execution() +{ + GaussianBlurBaseOperation::deinit_execution(); + + if (gausstab_) { + MEM_freeN(gausstab_); + gausstab_ = nullptr; + } +#if BLI_HAVE_SSE2 + if (gausstab_sse_) { + MEM_freeN(gausstab_sse_); + gausstab_sse_ = nullptr; + } +#endif + + deinit_mutex(); +} + +bool GaussianYBlurOperation::determine_depending_area_of_interest( + rcti *input, ReadBufferOperation *read_operation, rcti *output) +{ + rcti new_input; + + if (!sizeavailable_) { + rcti size_input; + size_input.xmin = 0; + size_input.ymin = 0; + size_input.xmax = 5; + size_input.ymax = 5; + NodeOperation *operation = this->get_input_operation(1); + if (operation->determine_depending_area_of_interest(&size_input, read_operation, output)) { + return true; + } + } + { + if (sizeavailable_ && gausstab_ != nullptr) { + new_input.xmax = input->xmax; + new_input.xmin = input->xmin; + new_input.ymax = input->ymax + filtersize_ + 1; + new_input.ymin = input->ymin - filtersize_ - 1; + } + else { + new_input.xmax = this->get_width(); + new_input.xmin = 0; + new_input.ymax = this->get_height(); + new_input.ymin = 0; + } + return NodeOperation::determine_depending_area_of_interest(&new_input, read_operation, output); + } +} + +} // namespace blender::compositor diff --git a/source/blender/compositor/operations/COM_GaussianYBlurOperation.h b/source/blender/compositor/operations/COM_GaussianYBlurOperation.h new file mode 100644 index 00000000000..4a84196c451 --- /dev/null +++ b/source/blender/compositor/operations/COM_GaussianYBlurOperation.h @@ -0,0 +1,52 @@ +/* SPDX-FileCopyrightText: 2011 Blender Authors + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +#pragma once + +#include "COM_GaussianBlurBaseOperation.h" + +namespace blender::compositor { + +/* TODO(manzanilla): everything to be removed with tiled implementation except the constructor. */ +class GaussianYBlurOperation : public GaussianBlurBaseOperation { + private: + void update_gauss(); + + public: + GaussianYBlurOperation(); + + /** + * The inner loop of this operation. + */ + void execute_pixel(float output[4], int x, int y, void *data) override; + + void execute_opencl(OpenCLDevice *device, + MemoryBuffer *output_memory_buffer, + cl_mem cl_output_buffer, + MemoryBuffer **input_memory_buffers, + std::list *cl_mem_to_clean_up, + std::list *cl_kernels_to_clean_up) override; + + /** + * \brief initialize the execution + */ + void init_execution() override; + + /** + * Deinitialize the execution + */ + void deinit_execution() override; + + void *initialize_tile_data(rcti *rect) override; + bool determine_depending_area_of_interest(rcti *input, + ReadBufferOperation *read_operation, + rcti *output) override; + + void check_opencl() + { + flags_.open_cl = (data_.sizex >= 128); + } +}; + +} // namespace blender::compositor diff --git a/source/blender/compositor/operations/COM_GlareBaseOperation.cc b/source/blender/compositor/operations/COM_GlareBaseOperation.cc index 1f49351d27a..4cfa1ee9b3c 100644 --- a/source/blender/compositor/operations/COM_GlareBaseOperation.cc +++ b/source/blender/compositor/operations/COM_GlareBaseOperation.cc @@ -11,9 +11,51 @@ GlareBaseOperation::GlareBaseOperation() this->add_input_socket(DataType::Color); this->add_output_socket(DataType::Color); settings_ = nullptr; + flags_.is_fullframe_operation = true; flags_.can_be_constant = true; is_output_rendered_ = false; } +void GlareBaseOperation::init_execution() +{ + SingleThreadedOperation::init_execution(); + input_program_ = get_input_socket_reader(0); +} + +void GlareBaseOperation::deinit_execution() +{ + input_program_ = nullptr; + SingleThreadedOperation::deinit_execution(); +} + +MemoryBuffer *GlareBaseOperation::create_memory_buffer(rcti *rect2) +{ + MemoryBuffer *tile = (MemoryBuffer *)input_program_->initialize_tile_data(rect2); + rcti rect; + rect.xmin = 0; + rect.ymin = 0; + rect.xmax = get_width(); + rect.ymax = get_height(); + MemoryBuffer *result = new MemoryBuffer(DataType::Color, rect); + float *data = result->get_buffer(); + this->generate_glare(data, tile, settings_); + return result; +} + +bool GlareBaseOperation::determine_depending_area_of_interest(rcti * /*input*/, + ReadBufferOperation *read_operation, + rcti *output) +{ + if (is_cached()) { + return false; + } + + rcti new_input; + new_input.xmax = this->get_width(); + new_input.xmin = 0; + new_input.ymax = this->get_height(); + new_input.ymin = 0; + return NodeOperation::determine_depending_area_of_interest(&new_input, read_operation, output); +} void GlareBaseOperation::get_area_of_interest(const int input_idx, const rcti & /*output_area*/, diff --git a/source/blender/compositor/operations/COM_GlareBaseOperation.h b/source/blender/compositor/operations/COM_GlareBaseOperation.h index fb9bed305ca..784c6232f6a 100644 --- a/source/blender/compositor/operations/COM_GlareBaseOperation.h +++ b/source/blender/compositor/operations/COM_GlareBaseOperation.h @@ -4,7 +4,7 @@ #pragma once -#include "COM_NodeOperation.h" +#include "COM_SingleThreadedOperation.h" #include "DNA_node_types.h" namespace blender::compositor { @@ -23,8 +23,13 @@ typedef float fRGB[4]; } \ (void)0 -class GlareBaseOperation : public NodeOperation { +class GlareBaseOperation : public SingleThreadedOperation { private: + /** + * \brief Cached reference to the input_program + */ + SocketReader *input_program_; + /** * \brief settings of the glare node. */ @@ -33,10 +38,23 @@ class GlareBaseOperation : public NodeOperation { bool is_output_rendered_; public: + /** + * Initialize the execution + */ + void init_execution() override; + + /** + * Deinitialize the execution + */ + void deinit_execution() override; + void set_glare_settings(const NodeGlare *settings) { settings_ = settings; } + bool determine_depending_area_of_interest(rcti *input, + ReadBufferOperation *read_operation, + rcti *output) override; void get_area_of_interest(int input_idx, const rcti &output_area, rcti &r_input_area) final; @@ -50,6 +68,8 @@ class GlareBaseOperation : public NodeOperation { virtual void generate_glare(float *data, MemoryBuffer *input_tile, const NodeGlare *settings) = 0; + + MemoryBuffer *create_memory_buffer(rcti *rect) override; }; } // namespace blender::compositor diff --git a/source/blender/compositor/operations/COM_GlareBloomOperation.cc b/source/blender/compositor/operations/COM_GlareBloomOperation.cc deleted file mode 100644 index 3b55b7b8da8..00000000000 --- a/source/blender/compositor/operations/COM_GlareBloomOperation.cc +++ /dev/null @@ -1,316 +0,0 @@ -/* SPDX-FileCopyrightText: 2024 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -#include -#include -#include - -#include "BLI_array.hh" -#include "BLI_index_range.hh" -#include "BLI_math_base.hh" -#include "BLI_math_vector.h" -#include "BLI_math_vector.hh" -#include "BLI_task.hh" - -#include "COM_GlareBloomOperation.h" - -#define MAX_GLARE_SIZE 9 - -namespace blender::compositor { - -static void upsample(const MemoryBuffer &input, MemoryBuffer &output) -{ - const int2 output_size = int2(output.get_width(), output.get_height()); - - /* All the offsets in the following code section are in the normalized pixel space of the output - * image, so compute its normalized pixel size. */ - float2 pixel_size = 1.0f / float2(output_size); - - threading::parallel_for(IndexRange(output_size.y), 1, [&](const IndexRange sub_y_range) { - for (const int64_t y : sub_y_range) { - for (const int64_t x : IndexRange(output_size.x)) { - /* Each invocation corresponds to one output pixel, where the output has twice the size of - * the input. */ - int2 texel = int2(x, y); - - /* Add 0.5 to evaluate the buffer at the center of the pixel and divide by the image size - * to get the coordinates into the buffer's expected [0, 1] range. */ - float2 coordinates = (float2(texel) + float2(0.5)) / float2(output_size); - - /* Upsample by applying a 3x3 tent filter on the bi-linearly interpolated values evaluated - * at the center of neighboring output pixels. As more tent filter upsampling passes are - * applied, the result approximates a large sized Gaussian filter. This upsampling strategy - * is described in the talk: - * - * Next Generation Post Processing in Call of Duty: Advanced Warfare - * https://www.iryoku.com/next-generation-post-processing-in-call-of-duty-advanced-warfare - * - * In particular, the upsampling strategy is described and illustrated in slide 162 titled - * "Upsampling - Our Solution". */ - float4 upsampled = float4(0.0f); - upsampled += (4.0f / 16.0f) * input.texture_bilinear_extend(coordinates); - upsampled += (2.0f / 16.0f) * - input.texture_bilinear_extend(coordinates + pixel_size * float2(-1.0f, 0.0f)); - upsampled += (2.0f / 16.0f) * - input.texture_bilinear_extend(coordinates + pixel_size * float2(0.0f, 1.0f)); - upsampled += (2.0f / 16.0f) * - input.texture_bilinear_extend(coordinates + pixel_size * float2(1.0f, 0.0f)); - upsampled += (2.0f / 16.0f) * - input.texture_bilinear_extend(coordinates + pixel_size * float2(0.0f, -1.0f)); - upsampled += (1.0f / 16.0f) * input.texture_bilinear_extend( - coordinates + pixel_size * float2(-1.0f, -1.0f)); - upsampled += (1.0f / 16.0f) * - input.texture_bilinear_extend(coordinates + pixel_size * float2(-1.0f, 1.0f)); - upsampled += (1.0f / 16.0f) * - input.texture_bilinear_extend(coordinates + pixel_size * float2(1.0f, -1.0f)); - upsampled += (1.0f / 16.0f) * - input.texture_bilinear_extend(coordinates + pixel_size * float2(1.0f, 1.0f)); - - const float4 original_value = output.get_elem(texel.x, texel.y); - copy_v4_v4(output.get_elem(texel.x, texel.y), original_value + upsampled); - } - } - }); -} - -/* Computes the weighted average of the given four colors, which are assumed to the colors of - * spatially neighboring pixels. The weights are computed so as to reduce the contributions of - * fireflies on the result by applying a form of local tone mapping as described by Brian Karis in - * the article "Graphic Rants: Tone Mapping". - * - * https://graphicrants.blogspot.com/2013/12/tone-mapping.html */ -static float4 karis_brightness_weighted_sum(float4 color1, - float4 color2, - float4 color3, - float4 color4) -{ - const float4 brightness = float4(math::reduce_max(color1.xyz()), - math::reduce_max(color2.xyz()), - math::reduce_max(color3.xyz()), - math::reduce_max(color4.xyz())); - const float4 weights = 1.0f / (brightness + 1.0); - const float weights_sum = math::reduce_add(weights); - const float4 sum = color1 * weights[0] + color2 * weights[1] + color3 * weights[2] + - color4 * weights[3]; - return math::safe_divide(sum, weights_sum); -} - -static void downsample(const MemoryBuffer &input, MemoryBuffer &output, bool use_karis_average) -{ - const int2 input_size = int2(input.get_width(), input.get_height()); - const int2 output_size = int2(output.get_width(), output.get_height()); - - /* All the offsets in the following code section are in the normalized pixel space of the - * input.texture_bilinear_extend, so compute its normalized pixel size. */ - float2 pixel_size = 1.0f / float2(input_size); - - threading::parallel_for(IndexRange(output_size.y), 1, [&](const IndexRange sub_y_range) { - for (const int64_t y : sub_y_range) { - for (const int64_t x : IndexRange(output_size.x)) { - /* Each invocation corresponds to one output pixel, where the output has half the size of - * the input. */ - int2 texel = int2(x, y); - - /* Add 0.5 to evaluate the buffer at the center of the pixel and divide by the image size - * to get the coordinates into the buffer's expected [0, 1] range. */ - float2 coordinates = (float2(texel) + float2(0.5f)) / float2(output_size); - - /* Each invocation downsamples a 6x6 area of pixels around the center of the corresponding - * output pixel, but instead of sampling each of the 36 pixels in the area, we only sample - * 13 positions using bilinear fetches at the center of a number of overlapping square - * 4-pixel groups. This downsampling strategy is described in the talk: - * - * Next Generation Post Processing in Call of Duty: Advanced Warfare - * https://www.iryoku.com/next-generation-post-processing-in-call-of-duty-advanced-warfare - * - * In particular, the downsampling strategy is described and illustrated in slide 153 - * titled "Downsampling - Our Solution". This is employed as it significantly improves the - * stability of the glare as can be seen in the videos in the talk. */ - float4 center = input.texture_bilinear_extend(coordinates); - float4 upper_left_near = input.texture_bilinear_extend(coordinates + - pixel_size * float2(-1.0f, 1.0f)); - float4 upper_right_near = input.texture_bilinear_extend(coordinates + - pixel_size * float2(1.0f, 1.0f)); - float4 lower_left_near = input.texture_bilinear_extend(coordinates + - pixel_size * float2(-1.0f, -1.0f)); - float4 lower_right_near = input.texture_bilinear_extend(coordinates + - pixel_size * float2(1.0f, -1.0f)); - float4 left_far = input.texture_bilinear_extend(coordinates + - pixel_size * float2(-2.0f, 0.0f)); - float4 right_far = input.texture_bilinear_extend(coordinates + - pixel_size * float2(2.0f, 0.0f)); - float4 upper_far = input.texture_bilinear_extend(coordinates + - pixel_size * float2(0.0f, 2.0f)); - float4 lower_far = input.texture_bilinear_extend(coordinates + - pixel_size * float2(0.0f, -2.0f)); - float4 upper_left_far = input.texture_bilinear_extend(coordinates + - pixel_size * float2(-2.0f, 2.0f)); - float4 upper_right_far = input.texture_bilinear_extend(coordinates + - pixel_size * float2(2.0f, 2.0f)); - float4 lower_left_far = input.texture_bilinear_extend(coordinates + - pixel_size * float2(-2.0f, -2.0f)); - float4 lower_right_far = input.texture_bilinear_extend(coordinates + - pixel_size * float2(2.0f, -2.0f)); - - if (!use_karis_average) { - /* The original weights equation mentioned in slide 153 is: - * 0.5 + 0.125 + 0.125 + 0.125 + 0.125 = 1 - * The 0.5 corresponds to the center group of pixels and the 0.125 corresponds to the - * other groups of pixels. The center is sampled 4 times, the far non corner pixels are - * sampled 2 times, the near corner pixels are sampled only once; but their weight is - * quadruple the weights of other groups; so they count as sampled 4 times, finally the - * far corner pixels are sampled only once, essentially totaling 32 samples. So the - * weights are as used in the following code section. */ - float4 result = (4.0f / 32.0f) * center + - (4.0f / 32.0f) * (upper_left_near + upper_right_near + lower_left_near + - lower_right_near) + - (2.0f / 32.0f) * (left_far + right_far + upper_far + lower_far) + - (1.0f / 32.0f) * (upper_left_far + upper_right_far + lower_left_far + - lower_right_far); - copy_v4_v4(output.get_elem(texel.x, texel.y), result); - } - else { - /* Reduce the contributions of fireflies on the result by reducing each group of pixels - * using a Karis brightness weighted sum. This is described in slide 168 titled - * "Fireflies - Partial Karis Average". - * - * This needn't be done on all downsampling passes, but only the first one, since - * fireflies will not survive the first pass, later passes can use the weighted average. - */ - float4 center_weighted_sum = karis_brightness_weighted_sum( - upper_left_near, upper_right_near, lower_right_near, lower_left_near); - float4 upper_left_weighted_sum = karis_brightness_weighted_sum( - upper_left_far, upper_far, center, left_far); - float4 upper_right_weighted_sum = karis_brightness_weighted_sum( - upper_far, upper_right_far, right_far, center); - float4 lower_right_weighted_sum = karis_brightness_weighted_sum( - center, right_far, lower_right_far, lower_far); - float4 lower_left_weighted_sum = karis_brightness_weighted_sum( - left_far, center, lower_far, lower_left_far); - - /* The original weights equation mentioned in slide 153 is: - * 0.5 + 0.125 + 0.125 + 0.125 + 0.125 = 1 - * Multiply both sides by 8 and you get: - * 4 + 1 + 1 + 1 + 1 = 8 - * So the weights are as used in the following code section. */ - float4 result = (4.0f / 8.0f) * center_weighted_sum + - (1.0f / 8.0f) * (upper_left_weighted_sum + upper_right_weighted_sum + - lower_left_weighted_sum + lower_right_weighted_sum); - copy_v4_v4(output.get_elem(texel.x, texel.y), result); - } - } - } - }); -} - -/* Progressively down-sample the given buffer into a buffer with half the size for the given - * chain length, returning an array containing the chain of down-sampled buffers. The first - * buffer of the chain is the given buffer itself for easier handling. The chain length is - * expected not to exceed the binary logarithm of the smaller dimension of the given buffer, - * because that would buffer in down-sampling passes that produce useless textures with just - * one pixel. */ -static Array> compute_bloom_downsample_chain( - MemoryBuffer &highlights, int chain_length) -{ - Array> downsample_chain(chain_length); - - /* We append the original highlights buffer to the first buffer of the chain to make the code - * easier. In turn, the number of passes is one less than the chain length, because the first - * buffer needn't be computed. */ - downsample_chain[0] = std::make_unique(highlights); - const IndexRange downsample_passes_range(chain_length - 1); - - for (const int i : downsample_passes_range) { - const MemoryBuffer &input = *downsample_chain[i]; - - const int2 input_size = int2(input.get_width(), input.get_height()); - const int2 output_size = input_size / 2; - - rcti output_rect; - BLI_rcti_init(&output_rect, 0, output_size.x, 0, output_size.y); - downsample_chain[i + 1] = std::make_unique(DataType::Color, output_rect, false); - MemoryBuffer &output = *downsample_chain[i + 1]; - - /* For the first down-sample pass, we use a special "Karis" down-sample pass that applies a - * form of local tone mapping to reduce the contributions of fireflies, see the shader for - * more information. Later passes use a simple average down-sampling filter because fireflies - * doesn't service the first pass. */ - const bool use_karis_average = i == downsample_passes_range.first(); - downsample(input, output, use_karis_average); - } - - return downsample_chain; -} - -/* The size of the bloom relative to its maximum possible size, see the - * compute_bloom_size_halving_count() method for more information. */ -static int get_bloom_size(const NodeGlare *settings) -{ - return settings->size; -} - -/* The bloom has a maximum possible size when the bloom size is equal to MAX_GLARE_SIZE and - * halves for every unit decrement of the bloom size. This method computes the number of halving - * that should take place, which is simply the difference to MAX_GLARE_SIZE. */ -static int compute_bloom_size_halving_count(const NodeGlare *settings) -{ - return MAX_GLARE_SIZE - get_bloom_size(settings); -} - -/* Bloom is computed by first progressively half-down-sampling the highlights down to a certain - * size, then progressively double-up-sampling the last down-sampled buffer up to the original size - * of the highlights, adding the down-sampled buffer of the same size in each up-sampling step. - * This can be illustrated as follows: - * - * Highlights ---+---> Bloom - * | | - * Down-sampled ---+---> Up-sampled - * | | - * Down-sampled ---+---> Up-sampled - * | | - * Down-sampled ---+---> Up-sampled - * | ^ - * ... | - * Down-sampled ------------' - * - * The smooth down-sampling followed by smooth up-sampling can be thought of as a cheap way to - * approximate a large radius blur, and adding the corresponding down-sampled buffer while - * up-sampling is done to counter the attenuation that happens during down-sampling. - * - * Smaller down-sampled buffers contribute to larger glare size, so controlling the size can be - * done by stopping down-sampling down to a certain size, where the maximum possible size is - * achieved when down-sampling happens down to the smallest size of 2. */ -void GlareBloomOperation::generate_glare(float *output, - MemoryBuffer *highlights, - const NodeGlare *settings) -{ - /* The maximum possible glare size is achieved when we down-sampled down to the smallest size - * of 2, which would buffer in a down-sampling chain length of the binary logarithm of the - * smaller dimension of the size of the highlights. - * - * However, as users might want a smaller glare size, we reduce the chain length by the halving - * count supplied by the user. */ - const int2 size = int2(highlights->get_width(), highlights->get_height()); - const int smaller_glare_dimension = math::min(size.x, size.y); - const int chain_length = int(std::log2(smaller_glare_dimension)) - - compute_bloom_size_halving_count(settings); - - Array> downsample_chain = compute_bloom_downsample_chain( - *highlights, chain_length); - - /* Notice that for a chain length of n, we need (n - 1) up-sampling passes. */ - const IndexRange upsample_passes_range(chain_length - 1); - - for (const int i : upsample_passes_range) { - const MemoryBuffer &input = *downsample_chain[upsample_passes_range.last() - i + 1]; - MemoryBuffer &output = *downsample_chain[upsample_passes_range.last() - i]; - upsample(input, output); - } - - memcpy(output, - downsample_chain[0]->get_buffer(), - size.x * size.y * COM_DATA_TYPE_COLOR_CHANNELS * sizeof(float)); -} - -} // namespace blender::compositor diff --git a/source/blender/compositor/operations/COM_GlareBloomOperation.h b/source/blender/compositor/operations/COM_GlareBloomOperation.h deleted file mode 100644 index 9ec9935e226..00000000000 --- a/source/blender/compositor/operations/COM_GlareBloomOperation.h +++ /dev/null @@ -1,21 +0,0 @@ -/* SPDX-FileCopyrightText: 2024 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -#pragma once - -#include "COM_GlareBaseOperation.h" -#include "COM_NodeOperation.h" -#include "DNA_node_types.h" - -namespace blender::compositor { - -class GlareBloomOperation : public GlareBaseOperation { - public: - GlareBloomOperation() : GlareBaseOperation() {} - - protected: - void generate_glare(float *data, MemoryBuffer *input_tile, const NodeGlare *settings) override; -}; - -} // namespace blender::compositor diff --git a/source/blender/compositor/operations/COM_GlareThresholdOperation.cc b/source/blender/compositor/operations/COM_GlareThresholdOperation.cc index 18be474ede1..94f257f4834 100644 --- a/source/blender/compositor/operations/COM_GlareThresholdOperation.cc +++ b/source/blender/compositor/operations/COM_GlareThresholdOperation.cc @@ -12,6 +12,7 @@ GlareThresholdOperation::GlareThresholdOperation() { this->add_input_socket(DataType::Color, ResizeMode::FitAny); this->add_output_socket(DataType::Color); + input_program_ = nullptr; flags_.can_be_constant = true; } @@ -25,6 +26,38 @@ void GlareThresholdOperation::determine_canvas(const rcti &preferred_area, rcti r_area.ymax = r_area.ymin + height; } +void GlareThresholdOperation::init_execution() +{ + input_program_ = this->get_input_socket_reader(0); +} + +void GlareThresholdOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + const float threshold = settings_->threshold; + + input_program_->read_sampled(output, x, y, sampler); + if (IMB_colormanagement_get_luminance(output) >= threshold) { + output[0] -= threshold; + output[1] -= threshold; + output[2] -= threshold; + + output[0] = std::max(output[0], 0.0f); + output[1] = std::max(output[1], 0.0f); + output[2] = std::max(output[2], 0.0f); + } + else { + zero_v3(output); + } +} + +void GlareThresholdOperation::deinit_execution() +{ + input_program_ = nullptr; +} + void GlareThresholdOperation::update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span inputs) diff --git a/source/blender/compositor/operations/COM_GlareThresholdOperation.h b/source/blender/compositor/operations/COM_GlareThresholdOperation.h index 0f2f535b52a..ead0f5bbdaa 100644 --- a/source/blender/compositor/operations/COM_GlareThresholdOperation.h +++ b/source/blender/compositor/operations/COM_GlareThresholdOperation.h @@ -11,6 +11,11 @@ namespace blender::compositor { class GlareThresholdOperation : public MultiThreadedOperation { private: + /** + * \brief Cached reference to the input_program + */ + SocketReader *input_program_; + /** * \brief settings of the glare node. */ @@ -19,6 +24,21 @@ class GlareThresholdOperation : public MultiThreadedOperation { public: GlareThresholdOperation(); + /** + * The inner loop of this operation. + */ + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + + /** + * Initialize the execution + */ + void init_execution() override; + + /** + * Deinitialize the execution + */ + void deinit_execution() override; + void set_glare_settings(const NodeGlare *settings) { settings_ = settings; diff --git a/source/blender/compositor/operations/COM_HueSaturationValueCorrectOperation.cc b/source/blender/compositor/operations/COM_HueSaturationValueCorrectOperation.cc index 3945ce793e7..7295745d4c7 100644 --- a/source/blender/compositor/operations/COM_HueSaturationValueCorrectOperation.cc +++ b/source/blender/compositor/operations/COM_HueSaturationValueCorrectOperation.cc @@ -14,6 +14,49 @@ HueSaturationValueCorrectOperation::HueSaturationValueCorrectOperation() { this->add_input_socket(DataType::Color); this->add_output_socket(DataType::Color); + + input_program_ = nullptr; +} +void HueSaturationValueCorrectOperation::init_execution() +{ + CurveBaseOperation::init_execution(); + input_program_ = this->get_input_socket_reader(0); +} + +void HueSaturationValueCorrectOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float hsv[4], f; + + input_program_->read_sampled(hsv, x, y, sampler); + + /* adjust hue, scaling returned default 0.5 up to 1 */ + f = BKE_curvemapping_evaluateF(curve_mapping_, 0, hsv[0]); + hsv[0] += f - 0.5f; + + /* adjust saturation, scaling returned default 0.5 up to 1 */ + f = BKE_curvemapping_evaluateF(curve_mapping_, 1, hsv[0]); + hsv[1] *= (f * 2.0f); + + /* adjust value, scaling returned default 0.5 up to 1 */ + f = BKE_curvemapping_evaluateF(curve_mapping_, 2, hsv[0]); + hsv[2] *= (f * 2.0f); + + hsv[0] = hsv[0] - floorf(hsv[0]); /* mod 1.0 */ + CLAMP(hsv[1], 0.0f, 1.0f); + + output[0] = hsv[0]; + output[1] = hsv[1]; + output[2] = hsv[2]; + output[3] = hsv[3]; +} + +void HueSaturationValueCorrectOperation::deinit_execution() +{ + CurveBaseOperation::deinit_execution(); + input_program_ = nullptr; } void HueSaturationValueCorrectOperation::update_memory_buffer_partial(MemoryBuffer *output, @@ -24,19 +67,16 @@ void HueSaturationValueCorrectOperation::update_memory_buffer_partial(MemoryBuff for (BuffersIterator it = output->iterate_with(inputs, area); !it.is_end(); ++it) { copy_v4_v4(hsv, it.in(0)); - /* We parameterize the curve using the hue value. */ - const float parameter = hsv[0]; - /* Adjust hue, scaling returned default 0.5 up to 1. */ - float f = BKE_curvemapping_evaluateF(curve_mapping_, 0, parameter); + float f = BKE_curvemapping_evaluateF(curve_mapping_, 0, hsv[0]); hsv[0] += f - 0.5f; /* Adjust saturation, scaling returned default 0.5 up to 1. */ - f = BKE_curvemapping_evaluateF(curve_mapping_, 1, parameter); + f = BKE_curvemapping_evaluateF(curve_mapping_, 1, hsv[0]); hsv[1] *= (f * 2.0f); /* Adjust value, scaling returned default 0.5 up to 1. */ - f = BKE_curvemapping_evaluateF(curve_mapping_, 2, parameter); + f = BKE_curvemapping_evaluateF(curve_mapping_, 2, hsv[0]); hsv[2] *= (f * 2.0f); hsv[0] = hsv[0] - floorf(hsv[0]); /* Mod 1.0. */ diff --git a/source/blender/compositor/operations/COM_HueSaturationValueCorrectOperation.h b/source/blender/compositor/operations/COM_HueSaturationValueCorrectOperation.h index 444325d4b7b..1957a719565 100644 --- a/source/blender/compositor/operations/COM_HueSaturationValueCorrectOperation.h +++ b/source/blender/compositor/operations/COM_HueSaturationValueCorrectOperation.h @@ -5,13 +5,35 @@ #pragma once #include "COM_CurveBaseOperation.h" +#include "COM_NodeOperation.h" namespace blender::compositor { class HueSaturationValueCorrectOperation : public CurveBaseOperation { + private: + /** + * Cached reference to the input_program + */ + SocketReader *input_program_; + public: HueSaturationValueCorrectOperation(); + /** + * The inner loop of this operation. + */ + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + + /** + * Initialize the execution + */ + void init_execution() override; + + /** + * Deinitialize the execution + */ + void deinit_execution() override; + void update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span inputs) override; diff --git a/source/blender/compositor/operations/COM_IDMaskOperation.cc b/source/blender/compositor/operations/COM_IDMaskOperation.cc index 15b6a24f168..270f5e3acf7 100644 --- a/source/blender/compositor/operations/COM_IDMaskOperation.cc +++ b/source/blender/compositor/operations/COM_IDMaskOperation.cc @@ -10,9 +10,25 @@ IDMaskOperation::IDMaskOperation() { this->add_input_socket(DataType::Value); this->add_output_socket(DataType::Value); + flags_.complex = true; flags_.can_be_constant = true; } +void *IDMaskOperation::initialize_tile_data(rcti *rect) +{ + void *buffer = get_input_operation(0)->initialize_tile_data(rect); + return buffer; +} + +void IDMaskOperation::execute_pixel(float output[4], int x, int y, void *data) +{ + MemoryBuffer *input_buffer = (MemoryBuffer *)data; + const int buffer_width = input_buffer->get_width(); + float *buffer = input_buffer->get_buffer(); + int buffer_index = (y * buffer_width + x); + output[0] = (roundf(buffer[buffer_index]) == object_index_) ? 1.0f : 0.0f; +} + void IDMaskOperation::update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span inputs) diff --git a/source/blender/compositor/operations/COM_IDMaskOperation.h b/source/blender/compositor/operations/COM_IDMaskOperation.h index 814316eeec2..bb1e689c168 100644 --- a/source/blender/compositor/operations/COM_IDMaskOperation.h +++ b/source/blender/compositor/operations/COM_IDMaskOperation.h @@ -15,6 +15,9 @@ class IDMaskOperation : public MultiThreadedOperation { public: IDMaskOperation(); + void *initialize_tile_data(rcti *rect) override; + void execute_pixel(float output[4], int x, int y, void *data) override; + void set_object_index(float object_index) { object_index_ = object_index; diff --git a/source/blender/compositor/operations/COM_ImageOperation.cc b/source/blender/compositor/operations/COM_ImageOperation.cc index 61570dc9e00..c9415306ebf 100644 --- a/source/blender/compositor/operations/COM_ImageOperation.cc +++ b/source/blender/compositor/operations/COM_ImageOperation.cc @@ -4,7 +4,7 @@ #include "COM_ImageOperation.h" -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "IMB_colormanagement.hh" #include "IMB_interp.hh" @@ -15,6 +15,8 @@ BaseImageOperation::BaseImageOperation() { image_ = nullptr; buffer_ = nullptr; + image_float_buffer_ = nullptr; + image_byte_buffer_ = nullptr; image_user_ = nullptr; imagewidth_ = 0; imageheight_ = 0; @@ -60,6 +62,8 @@ void BaseImageOperation::init_execution() ImBuf *stackbuf = get_im_buf(); buffer_ = stackbuf; if (stackbuf) { + image_float_buffer_ = stackbuf->float_buffer.data; + image_byte_buffer_ = stackbuf->byte_buffer.data; imagewidth_ = stackbuf->x; imageheight_ = stackbuf->y; number_of_channels_ = stackbuf->channels; @@ -68,6 +72,8 @@ void BaseImageOperation::init_execution() void BaseImageOperation::deinit_execution() { + image_float_buffer_ = nullptr; + image_byte_buffer_ = nullptr; BKE_image_release_ibuf(image_, buffer_, nullptr); } @@ -84,6 +90,67 @@ void BaseImageOperation::determine_canvas(const rcti & /*preferred_area*/, rcti BKE_image_release_ibuf(image_, stackbuf, nullptr); } +static void sample_image_at_location(ImBuf *ibuf, + float x, + float y, + PixelSampler sampler, + bool make_linear_rgb, + bool ensure_premultiplied, + float color[4]) +{ + if (ibuf->float_buffer.data) { + switch (sampler) { + case PixelSampler::Nearest: + imbuf::interpolate_nearest_fl(ibuf, color, x, y); + break; + case PixelSampler::Bilinear: + imbuf::interpolate_bilinear_border_fl(ibuf, color, x, y); + break; + case PixelSampler::Bicubic: + imbuf::interpolate_cubic_bspline_fl(ibuf, color, x, y); + break; + } + } + else { + uchar4 byte_color; + switch (sampler) { + case PixelSampler::Nearest: + byte_color = imbuf::interpolate_nearest_byte(ibuf, x, y); + break; + case PixelSampler::Bilinear: + byte_color = imbuf::interpolate_bilinear_border_byte(ibuf, x, y); + break; + case PixelSampler::Bicubic: + byte_color = imbuf::interpolate_cubic_bspline_byte(ibuf, x, y); + break; + } + rgba_uchar_to_float(color, byte_color); + if (make_linear_rgb) { + IMB_colormanagement_colorspace_to_scene_linear_v4( + color, false, ibuf->byte_buffer.colorspace); + } + if (ensure_premultiplied) { + straight_to_premul_v4(color); + } + } +} + +void ImageOperation::execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) +{ + int ix = x, iy = y; + if (image_float_buffer_ == nullptr && image_byte_buffer_ == nullptr) { + zero_v4(output); + } + else if (ix < 0 || iy < 0 || ix >= buffer_->x || iy >= buffer_->y) { + zero_v4(output); + } + else { + const bool ensure_premultiplied = !ELEM( + image_->alpha_mode, IMA_ALPHA_CHANNEL_PACKED, IMA_ALPHA_IGNORE); + sample_image_at_location(buffer_, x, y, sampler, true, ensure_premultiplied, output); + } +} + void ImageOperation::update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span /*inputs*/) @@ -93,6 +160,23 @@ void ImageOperation::update_memory_buffer_partial(MemoryBuffer *output, output->copy_from(buffer_, area, ensure_premultiplied, true); } +void ImageAlphaOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float tempcolor[4]; + + if (image_float_buffer_ == nullptr && image_byte_buffer_ == nullptr) { + output[0] = 0.0f; + } + else { + tempcolor[3] = 1.0f; + sample_image_at_location(buffer_, x, y, sampler, false, false, tempcolor); + output[0] = tempcolor[3]; + } +} + void ImageAlphaOperation::update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span /*inputs*/) diff --git a/source/blender/compositor/operations/COM_ImageOperation.h b/source/blender/compositor/operations/COM_ImageOperation.h index 547fb1b0a86..dfc73b739c9 100644 --- a/source/blender/compositor/operations/COM_ImageOperation.h +++ b/source/blender/compositor/operations/COM_ImageOperation.h @@ -24,6 +24,9 @@ class BaseImageOperation : public MultiThreadedOperation { ImBuf *buffer_; Image *image_; ImageUser *image_user_; + /* TODO: Remove raw buffers when removing Tiled implementation. */ + float *image_float_buffer_; + uint8_t *image_byte_buffer_; int imageheight_; int imagewidth_; @@ -70,6 +73,7 @@ class ImageOperation : public BaseImageOperation { * Constructor */ ImageOperation(); + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; void update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, @@ -81,6 +85,7 @@ class ImageAlphaOperation : public BaseImageOperation { * Constructor */ ImageAlphaOperation(); + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; void update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, diff --git a/source/blender/compositor/operations/COM_InpaintOperation.cc b/source/blender/compositor/operations/COM_InpaintOperation.cc index bdfc4b9d82e..d12b7c0dea5 100644 --- a/source/blender/compositor/operations/COM_InpaintOperation.cc +++ b/source/blender/compositor/operations/COM_InpaintOperation.cc @@ -153,18 +153,47 @@ InpaintSimpleOperation::InpaintSimpleOperation() { this->add_input_socket(DataType::Color); this->add_output_socket(DataType::Color); + input_image_program_ = nullptr; cached_buffer_ = nullptr; cached_buffer_ready_ = false; + flags_.complex = true; + flags_.is_fullframe_operation = true; flags_.can_be_constant = true; } void InpaintSimpleOperation::init_execution() { + input_image_program_ = this->get_input_socket_reader(0); cached_buffer_ = nullptr; cached_buffer_ready_ = false; + this->init_mutex(); +} + +void *InpaintSimpleOperation::initialize_tile_data(rcti *rect) +{ + if (cached_buffer_ready_) { + return cached_buffer_; + } + lock_mutex(); + if (!cached_buffer_ready_) { + MemoryBuffer *input = (MemoryBuffer *)input_image_program_->initialize_tile_data(rect); + cached_buffer_ = new MemoryBuffer(DataType::Color, input->get_rect()); + inpaint(input, cached_buffer_); + cached_buffer_ready_ = true; + } + + unlock_mutex(); + return cached_buffer_; +} + +void InpaintSimpleOperation::execute_pixel(float output[4], int x, int y, void * /*data*/) +{ + copy_v4_v4(output, cached_buffer_->get_elem(x, y)); } void InpaintSimpleOperation::deinit_execution() { + input_image_program_ = nullptr; + this->deinit_mutex(); if (cached_buffer_) { delete cached_buffer_; cached_buffer_ = nullptr; @@ -173,6 +202,23 @@ void InpaintSimpleOperation::deinit_execution() cached_buffer_ready_ = false; } +bool InpaintSimpleOperation::determine_depending_area_of_interest( + rcti * /*input*/, ReadBufferOperation *read_operation, rcti *output) +{ + if (cached_buffer_ready_) { + return false; + } + + rcti new_input; + + new_input.xmax = get_width(); + new_input.xmin = 0; + new_input.ymax = get_height(); + new_input.ymin = 0; + + return NodeOperation::determine_depending_area_of_interest(&new_input, read_operation, output); +} + void InpaintSimpleOperation::get_area_of_interest(const int input_idx, const rcti & /*output_area*/, rcti &r_input_area) diff --git a/source/blender/compositor/operations/COM_InpaintOperation.h b/source/blender/compositor/operations/COM_InpaintOperation.h index be3c4aff53c..1d3b22d2a7d 100644 --- a/source/blender/compositor/operations/COM_InpaintOperation.h +++ b/source/blender/compositor/operations/COM_InpaintOperation.h @@ -14,6 +14,7 @@ namespace blender::compositor { class InpaintSimpleOperation : public NodeOperation { protected: + SocketReader *input_image_program_; MemoryBuffer *cached_buffer_; bool cached_buffer_ready_; int max_distance_; @@ -36,8 +37,12 @@ class InpaintSimpleOperation : public NodeOperation { void inpaint(const MemoryBuffer *input, MemoryBuffer *output); + void execute_pixel(float output[4], int x, int y, void *data) override; + void init_execution() override; + void *initialize_tile_data(rcti *rect) override; + void deinit_execution() override; void set_max_distance(int max_distance) @@ -45,6 +50,10 @@ class InpaintSimpleOperation : public NodeOperation { max_distance_ = max_distance; } + bool determine_depending_area_of_interest(rcti *input, + ReadBufferOperation *read_operation, + rcti *output) override; + void get_area_of_interest(int input_idx, const rcti &output_area, rcti &r_input_area) override; void update_memory_buffer(MemoryBuffer *output, const rcti &area, diff --git a/source/blender/compositor/operations/COM_InvertOperation.cc b/source/blender/compositor/operations/COM_InvertOperation.cc index 40d70cddc90..05dfb4dce90 100644 --- a/source/blender/compositor/operations/COM_InvertOperation.cc +++ b/source/blender/compositor/operations/COM_InvertOperation.cc @@ -11,11 +11,54 @@ InvertOperation::InvertOperation() this->add_input_socket(DataType::Value); this->add_input_socket(DataType::Color); this->add_output_socket(DataType::Color); + input_value_program_ = nullptr; + input_color_program_ = nullptr; color_ = true; alpha_ = false; set_canvas_input_index(1); flags_.can_be_constant = true; } +void InvertOperation::init_execution() +{ + input_value_program_ = this->get_input_socket_reader(0); + input_color_program_ = this->get_input_socket_reader(1); +} + +void InvertOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float input_value[4]; + float input_color[4]; + input_value_program_->read_sampled(input_value, x, y, sampler); + input_color_program_->read_sampled(input_color, x, y, sampler); + + const float value = input_value[0]; + const float inverted_value = 1.0f - value; + + if (color_) { + output[0] = (1.0f - input_color[0]) * value + input_color[0] * inverted_value; + output[1] = (1.0f - input_color[1]) * value + input_color[1] * inverted_value; + output[2] = (1.0f - input_color[2]) * value + input_color[2] * inverted_value; + } + else { + copy_v3_v3(output, input_color); + } + + if (alpha_) { + output[3] = (1.0f - input_color[3]) * value + input_color[3] * inverted_value; + } + else { + output[3] = input_color[3]; + } +} + +void InvertOperation::deinit_execution() +{ + input_value_program_ = nullptr; + input_color_program_ = nullptr; +} void InvertOperation::update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, diff --git a/source/blender/compositor/operations/COM_InvertOperation.h b/source/blender/compositor/operations/COM_InvertOperation.h index c99ace2e2e7..ce7ab8a5972 100644 --- a/source/blender/compositor/operations/COM_InvertOperation.h +++ b/source/blender/compositor/operations/COM_InvertOperation.h @@ -10,12 +10,33 @@ namespace blender::compositor { class InvertOperation : public MultiThreadedOperation { private: + /** + * Cached reference to the input_program + */ + SocketReader *input_value_program_; + SocketReader *input_color_program_; + bool alpha_; bool color_; public: InvertOperation(); + /** + * The inner loop of this operation. + */ + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + + /** + * Initialize the execution + */ + void init_execution() override; + + /** + * Deinitialize the execution + */ + void deinit_execution() override; + void set_color(bool color) { color_ = color; diff --git a/source/blender/compositor/operations/COM_KeyingBlurOperation.cc b/source/blender/compositor/operations/COM_KeyingBlurOperation.cc index 9ac991d1cff..d237ba99727 100644 --- a/source/blender/compositor/operations/COM_KeyingBlurOperation.cc +++ b/source/blender/compositor/operations/COM_KeyingBlurOperation.cc @@ -14,9 +14,71 @@ KeyingBlurOperation::KeyingBlurOperation() size_ = 0; axis_ = BLUR_AXIS_X; + flags_.complex = true; flags_.can_be_constant = true; } +void *KeyingBlurOperation::initialize_tile_data(rcti *rect) +{ + void *buffer = get_input_operation(0)->initialize_tile_data(rect); + + return buffer; +} + +void KeyingBlurOperation::execute_pixel(float output[4], int x, int y, void *data) +{ + MemoryBuffer *input_buffer = (MemoryBuffer *)data; + const int buffer_width = input_buffer->get_width(); + float *buffer = input_buffer->get_buffer(); + int count = 0; + float average = 0.0f; + + if (axis_ == 0) { + const int start = std::max(0, x - size_ + 1); + const int end = std::min(buffer_width, x + size_); + for (int cx = start; cx < end; cx++) { + int buffer_index = (y * buffer_width + cx); + average += buffer[buffer_index]; + count++; + } + } + else { + const int start = std::max(0, y - size_ + 1); + const int end = std::min(input_buffer->get_height(), y + size_); + for (int cy = start; cy < end; cy++) { + int buffer_index = (cy * buffer_width + x); + average += buffer[buffer_index]; + count++; + } + } + + average /= float(count); + + output[0] = average; +} + +bool KeyingBlurOperation::determine_depending_area_of_interest(rcti *input, + ReadBufferOperation *read_operation, + rcti *output) +{ + rcti new_input; + + if (axis_ == BLUR_AXIS_X) { + new_input.xmin = input->xmin - size_; + new_input.ymin = input->ymin; + new_input.xmax = input->xmax + size_; + new_input.ymax = input->ymax; + } + else { + new_input.xmin = input->xmin; + new_input.ymin = input->ymin - size_; + new_input.xmax = input->xmax; + new_input.ymax = input->ymax + size_; + } + + return NodeOperation::determine_depending_area_of_interest(&new_input, read_operation, output); +} + void KeyingBlurOperation::get_area_of_interest(const int /*input_idx*/, const rcti &output_area, rcti &r_input_area) diff --git a/source/blender/compositor/operations/COM_KeyingBlurOperation.h b/source/blender/compositor/operations/COM_KeyingBlurOperation.h index dd04d2b2a20..0f5a699ad44 100644 --- a/source/blender/compositor/operations/COM_KeyingBlurOperation.h +++ b/source/blender/compositor/operations/COM_KeyingBlurOperation.h @@ -33,6 +33,14 @@ class KeyingBlurOperation : public MultiThreadedOperation { axis_ = value; } + void *initialize_tile_data(rcti *rect) override; + + void execute_pixel(float output[4], int x, int y, void *data) override; + + bool determine_depending_area_of_interest(rcti *input, + ReadBufferOperation *read_operation, + rcti *output) override; + void get_area_of_interest(int input_idx, const rcti &output_area, rcti &r_input_area) override; void update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, diff --git a/source/blender/compositor/operations/COM_KeyingClipOperation.cc b/source/blender/compositor/operations/COM_KeyingClipOperation.cc index 55fb357a044..f1b02b3f4ae 100644 --- a/source/blender/compositor/operations/COM_KeyingClipOperation.cc +++ b/source/blender/compositor/operations/COM_KeyingClipOperation.cc @@ -19,9 +19,97 @@ KeyingClipOperation::KeyingClipOperation() is_edge_matte_ = false; + flags_.complex = true; flags_.can_be_constant = true; } +void *KeyingClipOperation::initialize_tile_data(rcti *rect) +{ + void *buffer = get_input_operation(0)->initialize_tile_data(rect); + + return buffer; +} + +void KeyingClipOperation::execute_pixel(float output[4], int x, int y, void *data) +{ + const int delta = kernel_radius_; + const float tolerance = kernel_tolerance_; + + MemoryBuffer *input_buffer = (MemoryBuffer *)data; + float *buffer = input_buffer->get_buffer(); + + int buffer_width = input_buffer->get_width(); + int buffer_height = input_buffer->get_height(); + + float value = buffer[(y * buffer_width + x)]; + + bool ok = false; + + const int start_x = max_ff(0, x - delta); + const int start_y = max_ff(0, y - delta); + const int end_x = min_ff(x + delta, buffer_width - 1); + const int end_y = min_ff(y + delta, buffer_height - 1); + + int count = 0, total_count = (end_x - start_x + 1) * (end_y - start_y + 1); + int threshold_count = ceil(float(total_count) * 0.9f); + + if (delta == 0) { + ok = true; + } + + for (int cx = start_x; ok == false && cx <= end_x; cx++) { + for (int cy = start_y; ok == false && cy <= end_y; cy++) { + int buffer_index = (cy * buffer_width + cx); + float current_value = buffer[buffer_index]; + + if (fabsf(current_value - value) < tolerance) { + count++; + if (count >= threshold_count) { + ok = true; + } + } + } + } + + if (is_edge_matte_) { + if (ok) { + output[0] = 0.0f; + } + else { + output[0] = 1.0f; + } + } + else { + output[0] = value; + + if (ok) { + if (output[0] < clip_black_) { + output[0] = 0.0f; + } + else if (output[0] >= clip_white_) { + output[0] = 1.0f; + } + else { + output[0] = (output[0] - clip_black_) / (clip_white_ - clip_black_); + } + } + } +} + +bool KeyingClipOperation::determine_depending_area_of_interest(rcti *input, + ReadBufferOperation *read_operation, + rcti *output) +{ + rcti new_input; + + new_input.xmin = input->xmin - kernel_radius_; + new_input.ymin = input->ymin - kernel_radius_; + new_input.xmax = input->xmax + kernel_radius_; + new_input.ymax = input->ymax + kernel_radius_; + + return NodeOperation::determine_depending_area_of_interest(&new_input, read_operation, output); +} + void KeyingClipOperation::get_area_of_interest(const int input_idx, const rcti &output_area, rcti &r_input_area) diff --git a/source/blender/compositor/operations/COM_KeyingClipOperation.h b/source/blender/compositor/operations/COM_KeyingClipOperation.h index f58a818a400..bde4ec3ec13 100644 --- a/source/blender/compositor/operations/COM_KeyingClipOperation.h +++ b/source/blender/compositor/operations/COM_KeyingClipOperation.h @@ -47,6 +47,14 @@ class KeyingClipOperation : public MultiThreadedOperation { is_edge_matte_ = value; } + void *initialize_tile_data(rcti *rect) override; + + void execute_pixel(float output[4], int x, int y, void *data) override; + + bool determine_depending_area_of_interest(rcti *input, + ReadBufferOperation *read_operation, + rcti *output) override; + void get_area_of_interest(int input_idx, const rcti &output_area, rcti &r_input_area) override; void update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, diff --git a/source/blender/compositor/operations/COM_KeyingDespillOperation.cc b/source/blender/compositor/operations/COM_KeyingDespillOperation.cc index 11534866362..a3bc7726212 100644 --- a/source/blender/compositor/operations/COM_KeyingDespillOperation.cc +++ b/source/blender/compositor/operations/COM_KeyingDespillOperation.cc @@ -17,9 +17,55 @@ KeyingDespillOperation::KeyingDespillOperation() despill_factor_ = 0.5f; color_balance_ = 0.5f; + pixel_reader_ = nullptr; + screen_reader_ = nullptr; flags_.can_be_constant = true; } +void KeyingDespillOperation::init_execution() +{ + pixel_reader_ = this->get_input_socket_reader(0); + screen_reader_ = this->get_input_socket_reader(1); +} + +void KeyingDespillOperation::deinit_execution() +{ + pixel_reader_ = nullptr; + screen_reader_ = nullptr; +} + +void KeyingDespillOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float pixel_color[4]; + float screen_color[4]; + + pixel_reader_->read_sampled(pixel_color, x, y, sampler); + screen_reader_->read_sampled(screen_color, x, y, sampler); + + const int screen_primary_channel = max_axis_v3(screen_color); + const int other_1 = (screen_primary_channel + 1) % 3; + const int other_2 = (screen_primary_channel + 2) % 3; + + const int min_channel = std::min(other_1, other_2); + const int max_channel = std::max(other_1, other_2); + + float average_value, amount; + + average_value = color_balance_ * pixel_color[min_channel] + + (1.0f - color_balance_) * pixel_color[max_channel]; + amount = (pixel_color[screen_primary_channel] - average_value); + + copy_v4_v4(output, pixel_color); + + const float amount_despill = despill_factor_ * amount; + if (amount_despill > 0.0f) { + output[screen_primary_channel] = pixel_color[screen_primary_channel] - amount_despill; + } +} + void KeyingDespillOperation::update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span inputs) diff --git a/source/blender/compositor/operations/COM_KeyingDespillOperation.h b/source/blender/compositor/operations/COM_KeyingDespillOperation.h index 16c4cf22a4a..7fdbd4d79ac 100644 --- a/source/blender/compositor/operations/COM_KeyingDespillOperation.h +++ b/source/blender/compositor/operations/COM_KeyingDespillOperation.h @@ -13,12 +13,17 @@ namespace blender::compositor { */ class KeyingDespillOperation : public MultiThreadedOperation { protected: + SocketReader *pixel_reader_; + SocketReader *screen_reader_; float despill_factor_; float color_balance_; public: KeyingDespillOperation(); + void init_execution() override; + void deinit_execution() override; + void set_despill_factor(float value) { despill_factor_ = value; @@ -28,6 +33,8 @@ class KeyingDespillOperation : public MultiThreadedOperation { color_balance_ = value; } + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + void update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span inputs) override; diff --git a/source/blender/compositor/operations/COM_KeyingOperation.cc b/source/blender/compositor/operations/COM_KeyingOperation.cc index 8756c6070c4..67214d8215f 100644 --- a/source/blender/compositor/operations/COM_KeyingOperation.cc +++ b/source/blender/compositor/operations/COM_KeyingOperation.cc @@ -18,8 +18,8 @@ static float get_pixel_saturation(const float pixel_color[4], const int min_channel = std::min(other_1, other_2); const int max_channel = std::max(other_1, other_2); - const float val = pixel_color[max_channel] + - screen_balance * (pixel_color[min_channel] - pixel_color[max_channel]); + const float val = screen_balance * pixel_color[min_channel] + + (1.0f - screen_balance) * pixel_color[max_channel]; return (pixel_color[primary_channel] - val) * fabsf(1.0f - val); } @@ -32,9 +32,71 @@ KeyingOperation::KeyingOperation() screen_balance_ = 0.5f; + pixel_reader_ = nullptr; + screen_reader_ = nullptr; + flags_.can_be_constant = true; } +void KeyingOperation::init_execution() +{ + pixel_reader_ = this->get_input_socket_reader(0); + screen_reader_ = this->get_input_socket_reader(1); +} + +void KeyingOperation::deinit_execution() +{ + pixel_reader_ = nullptr; + screen_reader_ = nullptr; +} + +void KeyingOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float pixel_color[4]; + float screen_color[4]; + + pixel_reader_->read_sampled(pixel_color, x, y, sampler); + screen_reader_->read_sampled(screen_color, x, y, sampler); + + const int primary_channel = max_axis_v3(screen_color); + const float min_pixel_color = min_fff(pixel_color[0], pixel_color[1], pixel_color[2]); + + if (min_pixel_color > 1.0f) { + /* overexposure doesn't happen on screen itself and usually happens + * on light sources in the shot, this need to be checked separately + * because saturation and falloff calculation is based on the fact + * that pixels are not overexposed + */ + output[0] = 1.0f; + } + else { + float saturation = get_pixel_saturation(pixel_color, screen_balance_, primary_channel); + float screen_saturation = get_pixel_saturation(screen_color, screen_balance_, primary_channel); + + if (saturation < 0) { + /* means main channel of pixel is different from screen, + * assume this is completely a foreground + */ + output[0] = 1.0f; + } + else if (saturation >= screen_saturation) { + /* matched main channels and higher saturation on pixel + * is treated as completely background + */ + output[0] = 0.0f; + } + else { + /* nice alpha falloff on edges */ + float distance = 1.0f - saturation / screen_saturation; + + output[0] = distance; + } + } +} + void KeyingOperation::update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span inputs) diff --git a/source/blender/compositor/operations/COM_KeyingOperation.h b/source/blender/compositor/operations/COM_KeyingOperation.h index 02f1a5dd54c..87e3247767d 100644 --- a/source/blender/compositor/operations/COM_KeyingOperation.h +++ b/source/blender/compositor/operations/COM_KeyingOperation.h @@ -17,16 +17,24 @@ namespace blender::compositor { */ class KeyingOperation : public MultiThreadedOperation { protected: + SocketReader *pixel_reader_; + SocketReader *screen_reader_; + float screen_balance_; public: KeyingOperation(); + void init_execution() override; + void deinit_execution() override; + void set_screen_balance(float value) { screen_balance_ = value; } + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + void update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span inputs) override; diff --git a/source/blender/compositor/operations/COM_KeyingScreenOperation.cc b/source/blender/compositor/operations/COM_KeyingScreenOperation.cc index 8966f084f1e..ed56fd27812 100644 --- a/source/blender/compositor/operations/COM_KeyingScreenOperation.cc +++ b/source/blender/compositor/operations/COM_KeyingScreenOperation.cc @@ -26,14 +26,21 @@ KeyingScreenOperation::KeyingScreenOperation() movie_clip_ = nullptr; framenumber_ = 0; tracking_object_[0] = 0; + flags_.complex = true; cached_marker_points_ = nullptr; } void KeyingScreenOperation::init_execution() { - BLI_assert(cached_marker_points_ == nullptr); - if (movie_clip_) { - cached_marker_points_ = compute_marker_points(); + init_mutex(); + if (execution_model_ == eExecutionModel::FullFrame) { + BLI_assert(cached_marker_points_ == nullptr); + if (movie_clip_) { + cached_marker_points_ = compute_marker_points(); + } + } + else { + cached_marker_points_ = nullptr; } } @@ -137,6 +144,23 @@ Array *KeyingScreenOperation::compute_marker return marker_points; } +void *KeyingScreenOperation::initialize_tile_data(rcti * /*rect*/) +{ + if (movie_clip_ == nullptr) { + return nullptr; + } + + if (!cached_marker_points_) { + lock_mutex(); + if (cached_marker_points_ == nullptr) { + cached_marker_points_ = compute_marker_points(); + } + unlock_mutex(); + } + + return nullptr; +} + void KeyingScreenOperation::determine_canvas(const rcti &preferred_area, rcti &r_area) { r_area = COM_AREA_NONE; @@ -154,6 +178,31 @@ void KeyingScreenOperation::determine_canvas(const rcti &preferred_area, rcti &r } } +void KeyingScreenOperation::execute_pixel(float output[4], int x, int y, void * /* data */) +{ + if (!cached_marker_points_) { + copy_v4_fl(output, 0.0f); + return; + } + + const int2 size = int2(this->get_width(), this->get_height()); + const float2 normalized_pixel_location = float2(x, y) / float2(size); + const float squared_shape_parameter = math::square(1.0f / smoothness_); + + float4 weighted_sum = float4(0.0f); + float sum_of_weights = 0.0f; + for (const MarkerPoint &marker_point : *cached_marker_points_) { + const float2 difference = normalized_pixel_location - marker_point.position; + const float squared_distance = math::dot(difference, difference); + const float gaussian = math::exp(-squared_distance * squared_shape_parameter); + weighted_sum += marker_point.color * gaussian; + sum_of_weights += gaussian; + } + weighted_sum /= sum_of_weights; + + copy_v4_v4(output, weighted_sum); +} + void KeyingScreenOperation::update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span inputs) diff --git a/source/blender/compositor/operations/COM_KeyingScreenOperation.h b/source/blender/compositor/operations/COM_KeyingScreenOperation.h index f9d0484db40..aae53312c86 100644 --- a/source/blender/compositor/operations/COM_KeyingScreenOperation.h +++ b/source/blender/compositor/operations/COM_KeyingScreenOperation.h @@ -47,6 +47,8 @@ class KeyingScreenOperation : public MultiThreadedOperation { void init_execution() override; void deinit_execution() override; + void *initialize_tile_data(rcti *rect) override; + void set_movie_clip(MovieClip *clip) { movie_clip_ = clip; @@ -64,6 +66,8 @@ class KeyingScreenOperation : public MultiThreadedOperation { framenumber_ = framenumber; } + void execute_pixel(float output[4], int x, int y, void *data) override; + void update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span inputs) override; diff --git a/source/blender/compositor/operations/COM_KuwaharaAnisotropicOperation.cc b/source/blender/compositor/operations/COM_KuwaharaAnisotropicOperation.cc index 4e96041efe5..d52d61700e7 100644 --- a/source/blender/compositor/operations/COM_KuwaharaAnisotropicOperation.cc +++ b/source/blender/compositor/operations/COM_KuwaharaAnisotropicOperation.cc @@ -19,9 +19,279 @@ KuwaharaAnisotropicOperation::KuwaharaAnisotropicOperation() this->add_input_socket(DataType::Value); this->add_input_socket(DataType::Color); this->add_output_socket(DataType::Color); + this->flags_.is_fullframe_operation = true; this->flags_.can_be_constant = true; } +void KuwaharaAnisotropicOperation::init_execution() +{ + image_reader_ = this->get_input_socket_reader(0); + size_reader_ = this->get_input_socket_reader(1); + structure_tensor_reader_ = this->get_input_socket_reader(2); +} + +void KuwaharaAnisotropicOperation::deinit_execution() +{ + image_reader_ = nullptr; + size_reader_ = nullptr; + structure_tensor_reader_ = nullptr; +} + +/* An implementation of the Anisotropic Kuwahara filter described in the paper: + * + * Kyprianidis, Jan Eric, Henry Kang, and Jurgen Dollner. "Image and video abstraction by + * anisotropic Kuwahara filtering." 2009. + * + * But with the polynomial weighting functions described in the paper: + * + * Kyprianidis, Jan Eric, et al. "Anisotropic Kuwahara Filtering with Polynomial Weighting + * Functions." 2010. + * + * And the sector weight function described in the paper: + * + * Kyprianidis, Jan Eric. "Image and video abstraction by multi-scale anisotropic Kuwahara + * filtering." 2011. + */ +void KuwaharaAnisotropicOperation::execute_pixel_sampled(float output[4], + float x_float, + float y_float, + PixelSampler /*sampler*/) +{ + using namespace math; + const int x = x_float; + const int y = y_float; + + /* The structure tensor is encoded in a float4 using a column major storage order, as can be + * seen in the KuwaharaAnisotropicStructureTensorOperation. */ + float4 encoded_structure_tensor; + structure_tensor_reader_->read(encoded_structure_tensor, x, y, nullptr); + float dxdx = encoded_structure_tensor.x; + float dxdy = encoded_structure_tensor.y; + float dydy = encoded_structure_tensor.w; + + /* Compute the first and second eigenvalues of the structure tensor using the equations in + * section "3.1 Orientation and Anisotropy Estimation" of the paper. */ + float eigenvalue_first_term = (dxdx + dydy) / 2.0f; + float eigenvalue_square_root_term = sqrt(square(dxdx - dydy) + 4.0f * square(dxdy)) / 2.0f; + float first_eigenvalue = eigenvalue_first_term + eigenvalue_square_root_term; + float second_eigenvalue = eigenvalue_first_term - eigenvalue_square_root_term; + + /* Compute the normalized eigenvector of the structure tensor oriented in direction of the + * minimum rate of change using the equations in section "3.1 Orientation and Anisotropy + * Estimation" of the paper. */ + float2 eigenvector = float2(first_eigenvalue - dxdx, -dxdy); + float eigenvector_length = length(eigenvector); + float2 unit_eigenvector = eigenvector_length != 0.0f ? eigenvector / eigenvector_length : + float2(1.0f); + + /* Compute the amount of anisotropy using equations in section "3.1 Orientation and Anisotropy + * Estimation" of the paper. The anisotropy ranges from 0 to 1, where 0 corresponds to + * isotropic and 1 corresponds to entirely anisotropic regions. */ + float eigenvalue_sum = first_eigenvalue + second_eigenvalue; + float eigenvalue_difference = first_eigenvalue - second_eigenvalue; + float anisotropy = eigenvalue_sum > 0.0f ? eigenvalue_difference / eigenvalue_sum : 0.0f; + + float4 size; + size_reader_->read(size, x, y, nullptr); + float radius = max(0.0f, size.x); + + /* Compute the width and height of an ellipse that is more width-elongated for high anisotropy + * and more circular for low anisotropy, controlled using the eccentricity factor. Since the + * anisotropy is in the [0, 1] range, the width factor tends to 1 as the eccentricity tends to + * infinity and tends to infinity when the eccentricity tends to zero. This is based on the + * equations in section "3.2. Anisotropic Kuwahara Filtering" of the paper. */ + float ellipse_width_factor = (get_eccentricity() + anisotropy) / get_eccentricity(); + float ellipse_width = ellipse_width_factor * radius; + float ellipse_height = radius / ellipse_width_factor; + + /* Compute the cosine and sine of the angle that the eigenvector makes with the x axis. Since + * the eigenvector is normalized, its x and y components are the cosine and sine of the angle + * it makes with the x axis. */ + float cosine = unit_eigenvector.x; + float sine = unit_eigenvector.y; + + /* Compute an inverse transformation matrix that represents an ellipse of the given width and + * height and makes and an angle with the x axis of the given cosine and sine. This is an + * inverse matrix, so it transforms the ellipse into a disk of unit radius. */ + float2x2 inverse_ellipse_matrix = float2x2( + float2(cosine / ellipse_width, -sine / ellipse_height), + float2(sine / ellipse_width, cosine / ellipse_height)); + + /* Compute the bounding box of a zero centered ellipse whose major axis is aligned with the + * eigenvector and has the given width and height. This is based on the equations described in: + * + * https://iquilezles.org/articles/ellipses/ + * + * Notice that we only compute the upper bound, the lower bound is just negative that since the + * ellipse is zero centered. Also notice that we take the ceiling of the bounding box, just to + * ensure the filter window is at least 1x1. */ + float2 ellipse_major_axis = ellipse_width * unit_eigenvector; + float2 ellipse_minor_axis = ellipse_height * float2(unit_eigenvector.y, unit_eigenvector.x) * + float2(-1, 1); + int2 ellipse_bounds = int2(ceil(sqrt(square(ellipse_major_axis) + square(ellipse_minor_axis)))); + + /* Compute the overlap polynomial parameters for 8-sector ellipse based on the equations in + * section "3 Alternative Weighting Functions" of the polynomial weights paper. More on this + * later in the code. */ + const int number_of_sectors = 8; + float sector_center_overlap_parameter = 2.0f / radius; + float sector_envelope_angle = ((3.0f / 2.0f) * M_PI) / number_of_sectors; + float cross_sector_overlap_parameter = (sector_center_overlap_parameter + + cos(sector_envelope_angle)) / + square(sin(sector_envelope_angle)); + + /* We need to compute the weighted mean of color and squared color of each of the 8 sectors of + * the ellipse, so we declare arrays for accumulating those and initialize them in the next + * code section. */ + float4 weighted_mean_of_squared_color_of_sectors[8]; + float4 weighted_mean_of_color_of_sectors[8]; + float sum_of_weights_of_sectors[8]; + + /* The center pixel (0, 0) is exempt from the main loop below for reasons that are explained in + * the first if statement in the loop, so we need to accumulate its color, squared color, and + * weight separately first. Luckily, the zero coordinates of the center pixel zeros out most of + * the complex computations below, and it can easily be shown that the weight for the center + * pixel in all sectors is simply (1 / number_of_sectors). */ + float4 center_color; + image_reader_->read(center_color, x, y, nullptr); + float4 center_color_squared = center_color * center_color; + float center_weight = 1.0f / number_of_sectors; + float4 weighted_center_color = center_color * center_weight; + float4 weighted_center_color_squared = center_color_squared * center_weight; + for (int i = 0; i < number_of_sectors; i++) { + weighted_mean_of_squared_color_of_sectors[i] = weighted_center_color_squared; + weighted_mean_of_color_of_sectors[i] = weighted_center_color; + sum_of_weights_of_sectors[i] = center_weight; + } + + /* Loop over the window of pixels inside the bounding box of the ellipse. However, we utilize + * the fact that ellipses are mirror symmetric along the horizontal axis, so we reduce the + * window to only the upper two quadrants, and compute each two mirrored pixels at the same + * time using the same weight as an optimization. */ + for (int j = 0; j <= ellipse_bounds.y; j++) { + for (int i = -ellipse_bounds.x; i <= ellipse_bounds.x; i++) { + /* Since we compute each two mirrored pixels at the same time, we need to also exempt the + * pixels whose x coordinates are negative and their y coordinates are zero, that's because + * those are mirrored versions of the pixels whose x coordinates are positive and their y + * coordinates are zero, and we don't want to compute and accumulate them twice. Moreover, + * we also need to exempt the center pixel with zero coordinates for the same reason, + * however, since the mirror of the center pixel is itself, it need to be accumulated + * separately, hence why we did that in the code section just before this loop. */ + if (j == 0 && i <= 0) { + continue; + } + + /* Map the pixels of the ellipse into a unit disk, exempting any points that are not part + * of the ellipse or disk. */ + float2 disk_point = inverse_ellipse_matrix * float2(i, j); + float disk_point_length_squared = dot(disk_point, disk_point); + if (disk_point_length_squared > 1.0f) { + continue; + } + + /* While each pixel belongs to a single sector in the ellipse, we expand the definition of + * a sector a bit to also overlap with other sectors as illustrated in Figure 8 of the + * polynomial weights paper. So each pixel may contribute to multiple sectors, and thus we + * compute its weight in each of the 8 sectors. */ + float sector_weights[8]; + + /* We evaluate the weighting polynomial at each of the 8 sectors by rotating the disk point + * by 45 degrees and evaluating the weighting polynomial at each incremental rotation. To + * avoid potentially expensive rotations, we utilize the fact that rotations by 90 degrees + * are simply swapping of the coordinates and negating the x component. We also note that + * since the y term of the weighting polynomial is squared, it is not affected by the sign + * and can be computed once for the x and once for the y coordinates. So we compute every + * other even-indexed 4 weights by successive 90 degree rotations as discussed. */ + float2 polynomial = sector_center_overlap_parameter - + cross_sector_overlap_parameter * square(disk_point); + sector_weights[0] = square(max(0.0f, disk_point.y + polynomial.x)); + sector_weights[2] = square(max(0.0f, -disk_point.x + polynomial.y)); + sector_weights[4] = square(max(0.0f, -disk_point.y + polynomial.x)); + sector_weights[6] = square(max(0.0f, disk_point.x + polynomial.y)); + + /* Then we rotate the disk point by 45 degrees, which is a simple expression involving a + * constant as can be demonstrated by applying a 45 degree rotation matrix. */ + float2 rotated_disk_point = M_SQRT1_2 * + float2(disk_point.x - disk_point.y, disk_point.x + disk_point.y); + + /* Finally, we compute every other odd-index 4 weights starting from the 45 degree rotated + * disk point. */ + float2 rotated_polynomial = sector_center_overlap_parameter - + cross_sector_overlap_parameter * square(rotated_disk_point); + sector_weights[1] = square(max(0.0f, rotated_disk_point.y + rotated_polynomial.x)); + sector_weights[3] = square(max(0.0f, -rotated_disk_point.x + rotated_polynomial.y)); + sector_weights[5] = square(max(0.0f, -rotated_disk_point.y + rotated_polynomial.x)); + sector_weights[7] = square(max(0.0f, rotated_disk_point.x + rotated_polynomial.y)); + + /* We compute a radial Gaussian weighting component such that pixels further away from the + * sector center gets attenuated, and we also divide by the sum of sector weights to + * normalize them, since the radial weight will eventually be multiplied to the sector + * weight below. */ + float sector_weights_sum = sector_weights[0] + sector_weights[1] + sector_weights[2] + + sector_weights[3] + sector_weights[4] + sector_weights[5] + + sector_weights[6] + sector_weights[7]; + float radial_gaussian_weight = exp(-M_PI * disk_point_length_squared) / sector_weights_sum; + + /* Load the color of the pixel and its mirrored pixel and compute their square. */ + float4 upper_color; + image_reader_->read(upper_color, + clamp(x + i, 0, int(this->get_width()) - 1), + clamp(y + j, 0, int(this->get_height()) - 1), + nullptr); + float4 lower_color; + image_reader_->read(lower_color, + clamp(x - i, 0, int(this->get_width()) - 1), + clamp(y - j, 0, int(this->get_height()) - 1), + nullptr); + float4 upper_color_squared = upper_color * upper_color; + float4 lower_color_squared = lower_color * lower_color; + + for (int k = 0; k < number_of_sectors; k++) { + float weight = sector_weights[k] * radial_gaussian_weight; + + /* Accumulate the pixel to each of the sectors multiplied by the sector weight. */ + int upper_index = k; + sum_of_weights_of_sectors[upper_index] += weight; + weighted_mean_of_color_of_sectors[upper_index] += upper_color * weight; + weighted_mean_of_squared_color_of_sectors[upper_index] += upper_color_squared * weight; + + /* Accumulate the mirrored pixel to each of the sectors multiplied by the sector weight. + */ + int lower_index = (k + number_of_sectors / 2) % number_of_sectors; + sum_of_weights_of_sectors[lower_index] += weight; + weighted_mean_of_color_of_sectors[lower_index] += lower_color * weight; + weighted_mean_of_squared_color_of_sectors[lower_index] += lower_color_squared * weight; + } + } + } + + /* Compute the weighted sum of mean of sectors, such that sectors with lower standard deviation + * gets more significant weight than sectors with higher standard deviation. */ + float sum_of_weights = 0.0f; + float4 weighted_sum = float4(0.0f); + for (int i = 0; i < number_of_sectors; i++) { + weighted_mean_of_color_of_sectors[i] /= sum_of_weights_of_sectors[i]; + weighted_mean_of_squared_color_of_sectors[i] /= sum_of_weights_of_sectors[i]; + + float4 color_mean = weighted_mean_of_color_of_sectors[i]; + float4 squared_color_mean = weighted_mean_of_squared_color_of_sectors[i]; + float4 color_variance = abs(squared_color_mean - color_mean * color_mean); + + float standard_deviation = dot(sqrt(color_variance.xyz()), float3(1.0)); + + /* Compute the sector weight based on the weight function introduced in section "3.3.1 + * Single-scale Filtering" of the multi-scale paper. Use a threshold of 0.02 to avoid zero + * division and avoid artifacts in homogeneous regions as demonstrated in the paper. */ + float weight = 1.0f / pow(max(0.02f, standard_deviation), get_sharpness()); + + sum_of_weights += weight; + weighted_sum += color_mean * weight; + } + weighted_sum /= sum_of_weights; + + copy_v4_v4(output, weighted_sum); +} + /* An implementation of the Anisotropic Kuwahara filter described in the paper: * * Kyprianidis, Jan Eric, Henry Kang, and Jurgen Dollner. "Image and video abstraction by @@ -279,7 +549,7 @@ void KuwaharaAnisotropicOperation::update_memory_buffer_partial(MemoryBuffer *ou * zero to counter its exponential nature for more intuitive user control. */ float KuwaharaAnisotropicOperation::get_sharpness() { - return sharpness_ * sharpness_ * 16.0f; + return data.sharpness * data.sharpness * 16.0f; } /* The eccentricity controls how much the image anisotropy affects the eccentricity of the @@ -297,17 +567,7 @@ float KuwaharaAnisotropicOperation::get_sharpness() * that of infinity. */ float KuwaharaAnisotropicOperation::get_eccentricity() { - return 1.0f / math::max(0.01f, eccentricity_); -} - -void KuwaharaAnisotropicOperation::set_sharpness(float sharpness) -{ - sharpness_ = sharpness; -} - -void KuwaharaAnisotropicOperation::set_eccentricity(float eccentricity) -{ - eccentricity_ = eccentricity; + return 1.0f / math::max(0.01f, data.eccentricity); } } // namespace blender::compositor diff --git a/source/blender/compositor/operations/COM_KuwaharaAnisotropicOperation.h b/source/blender/compositor/operations/COM_KuwaharaAnisotropicOperation.h index 5b52032975a..76b41c04cb9 100644 --- a/source/blender/compositor/operations/COM_KuwaharaAnisotropicOperation.h +++ b/source/blender/compositor/operations/COM_KuwaharaAnisotropicOperation.h @@ -11,19 +11,23 @@ namespace blender::compositor { class KuwaharaAnisotropicOperation : public MultiThreadedOperation { + SocketReader *image_reader_; + SocketReader *size_reader_; + SocketReader *structure_tensor_reader_; + public: - float sharpness_; - float eccentricity_; + NodeKuwaharaData data; KuwaharaAnisotropicOperation(); + void init_execution() override; + void deinit_execution() override; + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; void update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span inputs) override; float get_sharpness(); float get_eccentricity(); - void set_sharpness(float sharpness); - void set_eccentricity(float eccentricity); }; } // namespace blender::compositor diff --git a/source/blender/compositor/operations/COM_KuwaharaAnisotropicStructureTensorOperation.cc b/source/blender/compositor/operations/COM_KuwaharaAnisotropicStructureTensorOperation.cc index 665bac0e26a..e6c693a90a8 100644 --- a/source/blender/compositor/operations/COM_KuwaharaAnisotropicStructureTensorOperation.cc +++ b/source/blender/compositor/operations/COM_KuwaharaAnisotropicStructureTensorOperation.cc @@ -15,9 +15,81 @@ KuwaharaAnisotropicStructureTensorOperation::KuwaharaAnisotropicStructureTensorO { this->add_input_socket(DataType::Color); this->add_output_socket(DataType::Color); + this->flags_.is_fullframe_operation = true; this->flags_.can_be_constant = true; } +void KuwaharaAnisotropicStructureTensorOperation::init_execution() +{ + image_reader_ = this->get_input_socket_reader(0); +} + +void KuwaharaAnisotropicStructureTensorOperation::deinit_execution() +{ + image_reader_ = nullptr; +} + +/* Computes the structure tensor of the image using a Dirac delta window function as described in + * section "3.2 Local Structure Estimation" of the paper: + * + * Kyprianidis, Jan Eric. "Image and video abstraction by multi-scale anisotropic Kuwahara + * filtering." 2011. + * + * The structure tensor should then be smoothed using a Gaussian function to eliminate high + * frequency details. */ +void KuwaharaAnisotropicStructureTensorOperation::execute_pixel_sampled(float output[4], + float x_float, + float y_float, + PixelSampler /*sampler*/) +{ + using math::max, math::min, math::dot; + const int x = x_float; + const int y = y_float; + const int width = this->get_width(); + const int height = this->get_height(); + + /* The weight kernels of the filter optimized for rotational symmetry described in section "3.2.1 + * Gradient Calculation". */ + const float corner_weight = 0.182f; + const float center_weight = 1.0f - 2.0f * corner_weight; + + float4 input_color; + float3 x_partial_derivative = float3(0.0f); + image_reader_->read(input_color, max(0, x - 1), min(height - 1, y + 1), nullptr); + x_partial_derivative += input_color.xyz() * -corner_weight; + image_reader_->read(input_color, max(0, x - 1), y, nullptr); + x_partial_derivative += input_color.xyz() * -center_weight; + image_reader_->read(input_color, max(0, x - 1), max(0, y - 1), nullptr); + x_partial_derivative += input_color.xyz() * -corner_weight; + image_reader_->read(input_color, min(width, x + 1), min(height - 1, y + 1), nullptr); + x_partial_derivative += input_color.xyz() * corner_weight; + image_reader_->read(input_color, min(width, x + 1), y, nullptr); + x_partial_derivative += input_color.xyz() * center_weight; + image_reader_->read(input_color, min(width, x + 1), max(0, y - 1), nullptr); + x_partial_derivative += input_color.xyz() * corner_weight; + + float3 y_partial_derivative = float3(0.0f); + image_reader_->read(input_color, max(0, x - 1), min(height - 1, y + 1), nullptr); + y_partial_derivative += input_color.xyz() * corner_weight; + image_reader_->read(input_color, x, min(height - 1, y + 1), nullptr); + y_partial_derivative += input_color.xyz() * center_weight; + image_reader_->read(input_color, min(width, x + 1), min(height - 1, y + 1), nullptr); + y_partial_derivative += input_color.xyz() * corner_weight; + image_reader_->read(input_color, max(0, x - 1), max(0, y - 1), nullptr); + y_partial_derivative += input_color.xyz() * -corner_weight; + image_reader_->read(input_color, x, max(0, y - 1), nullptr); + y_partial_derivative += input_color.xyz() * -center_weight; + image_reader_->read(input_color, min(width, x + 1), max(0, y - 1), nullptr); + y_partial_derivative += input_color.xyz() * -corner_weight; + + /* We encode the structure tensor in a float4 using a column major storage order. */ + float4 structure_tensor = float4(dot(x_partial_derivative, x_partial_derivative), + dot(x_partial_derivative, y_partial_derivative), + dot(x_partial_derivative, y_partial_derivative), + dot(y_partial_derivative, y_partial_derivative)); + copy_v4_v4(output, structure_tensor); +} + /* Computes the structure tensor of the image using a Dirac delta window function as described in * section "3.2 Local Structure Estimation" of the paper: * diff --git a/source/blender/compositor/operations/COM_KuwaharaAnisotropicStructureTensorOperation.h b/source/blender/compositor/operations/COM_KuwaharaAnisotropicStructureTensorOperation.h index 5a8f6069e10..2a76cfd3e7e 100644 --- a/source/blender/compositor/operations/COM_KuwaharaAnisotropicStructureTensorOperation.h +++ b/source/blender/compositor/operations/COM_KuwaharaAnisotropicStructureTensorOperation.h @@ -9,9 +9,14 @@ namespace blender::compositor { class KuwaharaAnisotropicStructureTensorOperation : public MultiThreadedOperation { + SocketReader *image_reader_; + public: KuwaharaAnisotropicStructureTensorOperation(); + void init_execution() override; + void deinit_execution() override; + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; void update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span inputs) override; diff --git a/source/blender/compositor/operations/COM_KuwaharaClassicOperation.cc b/source/blender/compositor/operations/COM_KuwaharaClassicOperation.cc index 9dee9642ae9..856d9562518 100644 --- a/source/blender/compositor/operations/COM_KuwaharaClassicOperation.cc +++ b/source/blender/compositor/operations/COM_KuwaharaClassicOperation.cc @@ -19,9 +19,135 @@ KuwaharaClassicOperation::KuwaharaClassicOperation() this->add_input_socket(DataType::Color); this->add_output_socket(DataType::Color); + this->flags_.is_fullframe_operation = true; this->flags_.can_be_constant = true; } +void KuwaharaClassicOperation::init_execution() +{ + image_reader_ = this->get_input_socket_reader(0); + size_reader_ = this->get_input_socket_reader(1); + sat_reader_ = this->get_input_socket_reader(2); + sat_squared_reader_ = this->get_input_socket_reader(3); +} + +void KuwaharaClassicOperation::deinit_execution() +{ + image_reader_ = nullptr; + size_reader_ = nullptr; + sat_reader_ = nullptr; + sat_squared_reader_ = nullptr; +} + +void KuwaharaClassicOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float4 mean_of_color[] = {float4(0.0f), float4(0.0f), float4(0.0f), float4(0.0f)}; + float4 mean_of_squared_color[] = {float4(0.0f), float4(0.0f), float4(0.0f), float4(0.0f)}; + int quadrant_pixel_count[] = {0, 0, 0, 0}; + + float4 size; + size_reader_->read_sampled(size, x, y, sampler); + const int kernel_size = int(math::max(0.0f, size[0])); + + /* For high radii, we accelerate the filter using a summed area table, making the filter + * execute in constant time as opposed to having quadratic complexity. Except if high precision + * is enabled, since summed area tables are less precise. */ + if (!data_->high_precision && size[0] > 5.0f) { + for (int q = 0; q < 4; q++) { + /* A fancy expression to compute the sign of the quadrant q. */ + int2 sign = int2((q % 2) * 2 - 1, ((q / 2) * 2 - 1)); + + int2 lower_bound = int2(x, y) - + int2(sign.x > 0 ? 0 : kernel_size, sign.y > 0 ? 0 : kernel_size); + int2 upper_bound = int2(x, y) + + int2(sign.x < 0 ? 0 : kernel_size, sign.y < 0 ? 0 : kernel_size); + + /* Limit the quadrants to the image bounds. */ + int2 image_bound = int2(this->get_width(), this->get_height()) - int2(1); + int2 corrected_lower_bound = math::min(image_bound, math::max(int2(0, 0), lower_bound)); + int2 corrected_upper_bound = math::min(image_bound, math::max(int2(0, 0), upper_bound)); + int2 region_size = corrected_upper_bound - corrected_lower_bound + int2(1, 1); + quadrant_pixel_count[q] = region_size.x * region_size.y; + + rcti kernel_area; + kernel_area.xmin = corrected_lower_bound[0]; + kernel_area.ymin = corrected_lower_bound[1]; + kernel_area.xmax = corrected_upper_bound[0]; + kernel_area.ymax = corrected_upper_bound[1]; + + mean_of_color[q] = summed_area_table_sum_tiled(sat_reader_, kernel_area); + mean_of_squared_color[q] = summed_area_table_sum_tiled(sat_squared_reader_, kernel_area); + } + } + else { + /* Split surroundings of pixel into 4 overlapping regions. */ + for (int dy = -kernel_size; dy <= kernel_size; dy++) { + for (int dx = -kernel_size; dx <= kernel_size; dx++) { + + int xx = x + dx; + int yy = y + dy; + if (xx < 0 || yy < 0 || xx >= this->get_width() || yy >= this->get_height()) { + continue; + } + + float4 color; + image_reader_->read_sampled(color, xx, yy, sampler); + + if (dx >= 0 && dy >= 0) { + const int quadrant_index = 0; + mean_of_color[quadrant_index] += color; + mean_of_squared_color[quadrant_index] += color * color; + quadrant_pixel_count[quadrant_index]++; + } + + if (dx <= 0 && dy >= 0) { + const int quadrant_index = 1; + mean_of_color[quadrant_index] += color; + mean_of_squared_color[quadrant_index] += color * color; + quadrant_pixel_count[quadrant_index]++; + } + + if (dx <= 0 && dy <= 0) { + const int quadrant_index = 2; + mean_of_color[quadrant_index] += color; + mean_of_squared_color[quadrant_index] += color * color; + quadrant_pixel_count[quadrant_index]++; + } + + if (dx >= 0 && dy <= 0) { + const int quadrant_index = 3; + mean_of_color[quadrant_index] += color; + mean_of_squared_color[quadrant_index] += color * color; + quadrant_pixel_count[quadrant_index]++; + } + } + } + } + + /* Choose the region with lowest variance. */ + float min_var = FLT_MAX; + int min_index = 0; + for (int i = 0; i < 4; i++) { + mean_of_color[i] /= quadrant_pixel_count[i]; + mean_of_squared_color[i] /= quadrant_pixel_count[i]; + float4 color_variance = mean_of_squared_color[i] - mean_of_color[i] * mean_of_color[i]; + + float variance = math::dot(color_variance.xyz(), float3(1.0f)); + if (variance < min_var) { + min_var = variance; + min_index = i; + } + } + + output[0] = mean_of_color[min_index].x; + output[1] = mean_of_color[min_index].y; + output[2] = mean_of_color[min_index].z; + output[3] = mean_of_color[min_index].w; /* Also apply filter to alpha channel. */ +} + void KuwaharaClassicOperation::update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span inputs) @@ -52,7 +178,7 @@ void KuwaharaClassicOperation::update_memory_buffer_partial(MemoryBuffer *output /* For high radii, we accelerate the filter using a summed area table, making the filter * execute in constant time as opposed to having quadratic complexity. Except if high precision * is enabled, since summed area tables are less precise. */ - if (!high_precision_ && size > 5.0f) { + if (!data_->high_precision && size > 5.0f) { for (int q = 0; q < 4; q++) { /* A fancy expression to compute the sign of the quadrant q. */ int2 sign = int2((q % 2) * 2 - 1, ((q / 2) * 2 - 1)); diff --git a/source/blender/compositor/operations/COM_KuwaharaClassicOperation.h b/source/blender/compositor/operations/COM_KuwaharaClassicOperation.h index fb57c6990a7..2b049036b7a 100644 --- a/source/blender/compositor/operations/COM_KuwaharaClassicOperation.h +++ b/source/blender/compositor/operations/COM_KuwaharaClassicOperation.h @@ -9,16 +9,24 @@ namespace blender::compositor { class KuwaharaClassicOperation : public MultiThreadedOperation { - bool high_precision_; + const NodeKuwaharaData *data_; + SocketReader *image_reader_; + SocketReader *size_reader_; + SocketReader *sat_reader_; + SocketReader *sat_squared_reader_; public: KuwaharaClassicOperation(); - void set_high_precision(bool high_precision) + void set_data(const NodeKuwaharaData *data) { - high_precision_ = high_precision; + data_ = data; } + void init_execution() override; + void deinit_execution() override; + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + void update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span inputs) override; diff --git a/source/blender/compositor/operations/COM_LuminanceMatteOperation.cc b/source/blender/compositor/operations/COM_LuminanceMatteOperation.cc index bb84cd6c3b6..99f90946ae0 100644 --- a/source/blender/compositor/operations/COM_LuminanceMatteOperation.cc +++ b/source/blender/compositor/operations/COM_LuminanceMatteOperation.cc @@ -13,9 +13,58 @@ LuminanceMatteOperation::LuminanceMatteOperation() add_input_socket(DataType::Color); add_output_socket(DataType::Value); + input_image_program_ = nullptr; flags_.can_be_constant = true; } +void LuminanceMatteOperation::init_execution() +{ + input_image_program_ = this->get_input_socket_reader(0); +} + +void LuminanceMatteOperation::deinit_execution() +{ + input_image_program_ = nullptr; +} + +void LuminanceMatteOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float in_color[4]; + input_image_program_->read_sampled(in_color, x, y, sampler); + + const float high = settings_->t1; + const float low = settings_->t2; + const float luminance = IMB_colormanagement_get_luminance(in_color); + + float alpha; + + /* one line thread-friend algorithm: + * output[0] = std::min(input_value[3], std::min(1.0f, std::max(0.0f, ((luminance - low) / (high + * - low)))); + */ + + /* test range */ + if (luminance > high) { + alpha = 1.0f; + } + else if (luminance < low) { + alpha = 0.0f; + } + else { /* Blend. */ + alpha = (luminance - low) / (high - low); + } + + /* Store matte(alpha) value in [0] to go with + * COM_SetAlphaMultiplyOperation and the Value output. + */ + + /* don't make something that was more transparent less transparent */ + output[0] = min_ff(alpha, in_color[3]); +} + void LuminanceMatteOperation::update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span inputs) diff --git a/source/blender/compositor/operations/COM_LuminanceMatteOperation.h b/source/blender/compositor/operations/COM_LuminanceMatteOperation.h index 31e56c2448b..5ceeb6c70f5 100644 --- a/source/blender/compositor/operations/COM_LuminanceMatteOperation.h +++ b/source/blender/compositor/operations/COM_LuminanceMatteOperation.h @@ -15,6 +15,7 @@ namespace blender::compositor { class LuminanceMatteOperation : public MultiThreadedOperation { private: NodeChroma *settings_; + SocketReader *input_image_program_; public: /** @@ -22,6 +23,14 @@ class LuminanceMatteOperation : public MultiThreadedOperation { */ LuminanceMatteOperation(); + /** + * The inner loop of this operation. + */ + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + + void init_execution() override; + void deinit_execution() override; + void set_settings(NodeChroma *node_chroma) { settings_ = node_chroma; diff --git a/source/blender/compositor/operations/COM_MapRangeOperation.cc b/source/blender/compositor/operations/COM_MapRangeOperation.cc index 781df2ca46c..2d04616b7d0 100644 --- a/source/blender/compositor/operations/COM_MapRangeOperation.cc +++ b/source/blender/compositor/operations/COM_MapRangeOperation.cc @@ -14,14 +14,83 @@ MapRangeOperation::MapRangeOperation() this->add_input_socket(DataType::Value); this->add_input_socket(DataType::Value); this->add_output_socket(DataType::Value); + input_operation_ = nullptr; use_clamp_ = false; flags_.can_be_constant = true; } +void MapRangeOperation::init_execution() +{ + input_operation_ = this->get_input_socket_reader(0); + source_min_operation_ = this->get_input_socket_reader(1); + source_max_operation_ = this->get_input_socket_reader(2); + dest_min_operation_ = this->get_input_socket_reader(3); + dest_max_operation_ = this->get_input_socket_reader(4); +} + /* The code below assumes all data is inside range +- this, and that input buffer is single channel */ #define BLENDER_ZMAX 10000.0f +void MapRangeOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float inputs[8]; /* includes the 5 inputs + 3 pads */ + float value; + float source_min, source_max; + float dest_min, dest_max; + + input_operation_->read_sampled(inputs, x, y, sampler); + source_min_operation_->read_sampled(inputs + 1, x, y, sampler); + source_max_operation_->read_sampled(inputs + 2, x, y, sampler); + dest_min_operation_->read_sampled(inputs + 3, x, y, sampler); + dest_max_operation_->read_sampled(inputs + 4, x, y, sampler); + + value = inputs[0]; + source_min = inputs[1]; + source_max = inputs[2]; + dest_min = inputs[3]; + dest_max = inputs[4]; + + if (fabsf(source_max - source_min) < 1e-6f) { + output[0] = 0.0f; + return; + } + + if (value >= -BLENDER_ZMAX && value <= BLENDER_ZMAX) { + value = (value - source_min) / (source_max - source_min); + value = dest_min + value * (dest_max - dest_min); + } + else if (value > BLENDER_ZMAX) { + value = dest_max; + } + else { + value = dest_min; + } + + if (use_clamp_) { + if (dest_max > dest_min) { + CLAMP(value, dest_min, dest_max); + } + else { + CLAMP(value, dest_max, dest_min); + } + } + + output[0] = value; +} + +void MapRangeOperation::deinit_execution() +{ + input_operation_ = nullptr; + source_min_operation_ = nullptr; + source_max_operation_ = nullptr; + dest_min_operation_ = nullptr; + dest_max_operation_ = nullptr; +} + void MapRangeOperation::update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span inputs) diff --git a/source/blender/compositor/operations/COM_MapRangeOperation.h b/source/blender/compositor/operations/COM_MapRangeOperation.h index c4dfb823233..214b00812e5 100644 --- a/source/blender/compositor/operations/COM_MapRangeOperation.h +++ b/source/blender/compositor/operations/COM_MapRangeOperation.h @@ -15,6 +15,15 @@ namespace blender::compositor { */ class MapRangeOperation : public MultiThreadedOperation { private: + /** + * Cached reference to the input_program + */ + SocketReader *input_operation_; + SocketReader *source_min_operation_; + SocketReader *source_max_operation_; + SocketReader *dest_min_operation_; + SocketReader *dest_max_operation_; + bool use_clamp_; public: @@ -23,6 +32,21 @@ class MapRangeOperation : public MultiThreadedOperation { */ MapRangeOperation(); + /** + * The inner loop of this operation. + */ + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + + /** + * Initialize the execution + */ + void init_execution() override; + + /** + * Deinitialize the execution + */ + void deinit_execution() override; + /** * Clamp the output */ diff --git a/source/blender/compositor/operations/COM_MapUVOperation.cc b/source/blender/compositor/operations/COM_MapUVOperation.cc index 59121a478c9..a9e8e50f260 100644 --- a/source/blender/compositor/operations/COM_MapUVOperation.cc +++ b/source/blender/compositor/operations/COM_MapUVOperation.cc @@ -13,8 +13,12 @@ MapUVOperation::MapUVOperation() this->add_output_socket(DataType::Color); alpha_ = 0.0f; nearest_neighbour_ = false; + flags_.complex = true; flags_.can_be_constant = true; set_canvas_input_index(UV_INPUT_INDEX); + + inputUVProgram_ = nullptr; + input_color_program_ = nullptr; } void MapUVOperation::init_data() @@ -28,6 +32,61 @@ void MapUVOperation::init_data() uv_height_ = uv_input->get_height(); } +void MapUVOperation::init_execution() +{ + input_color_program_ = this->get_input_socket_reader(0); + inputUVProgram_ = this->get_input_socket_reader(1); + if (execution_model_ == eExecutionModel::Tiled) { + uv_input_read_fn_ = [=](float x, float y, float *out) { + inputUVProgram_->read_sampled(out, x, y, PixelSampler::Bilinear); + }; + } +} + +void MapUVOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler /*sampler*/) +{ + float xy[2] = {x, y}; + float uv[2], deriv[2][2], alpha; + + pixel_transform(xy, uv, deriv, alpha); + if (alpha == 0.0f) { + zero_v4(output); + return; + } + + if (nearest_neighbour_) { + input_color_program_->read_sampled(output, uv[0], uv[1], PixelSampler::Nearest); + } + else { + /* EWA filtering */ + input_color_program_->read_filtered(output, uv[0], uv[1], deriv[0], deriv[1]); + + /* UV to alpha threshold */ + const float threshold = alpha_ * 0.05f; + /* XXX alpha threshold is used to fade out pixels on boundaries with invalid derivatives. + * this calculation is not very well defined, should be looked into if it becomes a problem ... + */ + float du = len_v2(deriv[0]); + float dv = len_v2(deriv[1]); + float factor = 1.0f - threshold * (du / input_color_program_->get_width() + + dv / input_color_program_->get_height()); + if (factor < 0.0f) { + alpha = 0.0f; + } + else { + alpha *= factor; + } + } + + /* "premul" */ + if (alpha < 1.0f) { + mul_v4_fl(output, alpha); + } +} + bool MapUVOperation::read_uv(float x, float y, float &r_u, float &r_v, float &r_alpha) { if (x < 0.0f || x >= uv_width_ || y < 0.0f || y >= uv_height_) { @@ -96,6 +155,43 @@ void MapUVOperation::pixel_transform(const float xy[2], } } +void MapUVOperation::deinit_execution() +{ + inputUVProgram_ = nullptr; + input_color_program_ = nullptr; +} + +bool MapUVOperation::determine_depending_area_of_interest(rcti *input, + ReadBufferOperation *read_operation, + rcti *output) +{ + rcti color_input; + rcti uv_input; + NodeOperation *operation = nullptr; + + /* the uv buffer only needs a 3x3 buffer. The image needs whole buffer */ + + operation = get_input_operation(0); + color_input.xmax = operation->get_width(); + color_input.xmin = 0; + color_input.ymax = operation->get_height(); + color_input.ymin = 0; + if (operation->determine_depending_area_of_interest(&color_input, read_operation, output)) { + return true; + } + + operation = get_input_operation(1); + uv_input.xmax = input->xmax + 1; + uv_input.xmin = input->xmin - 1; + uv_input.ymax = input->ymax + 1; + uv_input.ymin = input->ymin - 1; + if (operation->determine_depending_area_of_interest(&uv_input, read_operation, output)) { + return true; + } + + return false; +} + void MapUVOperation::get_area_of_interest(const int input_idx, const rcti &output_area, rcti &r_input_area) @@ -144,7 +240,7 @@ void MapUVOperation::update_memory_buffer_partial(MemoryBuffer *output, } else { /* EWA filtering. */ - input_image->read_elem_filtered(uv[0], uv[1], deriv[0], deriv[1], false, it.out); + input_image->read_elem_filtered(uv[0], uv[1], deriv[0], deriv[1], it.out); /* UV to alpha threshold. */ const float threshold = alpha_ * 0.05f; diff --git a/source/blender/compositor/operations/COM_MapUVOperation.h b/source/blender/compositor/operations/COM_MapUVOperation.h index ca86af65407..a20b09dc00e 100644 --- a/source/blender/compositor/operations/COM_MapUVOperation.h +++ b/source/blender/compositor/operations/COM_MapUVOperation.h @@ -12,6 +12,11 @@ class MapUVOperation : public MultiThreadedOperation { private: static constexpr int IMAGE_INPUT_INDEX = 0; static constexpr int UV_INPUT_INDEX = 1; + /** + * Cached reference to the input_program + */ + SocketReader *inputUVProgram_; + SocketReader *input_color_program_; int uv_width_; int uv_height_; @@ -25,10 +30,32 @@ class MapUVOperation : public MultiThreadedOperation { public: MapUVOperation(); + /** + * we need a 3x3 differential filter for UV Input and full buffer for the image + */ + bool determine_depending_area_of_interest(rcti *input, + ReadBufferOperation *read_operation, + rcti *output) override; + + /** + * The inner loop of this operation. + */ + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + void pixel_transform(const float xy[2], float r_uv[2], float r_deriv[2][2], float &r_alpha); void init_data() override; + /** + * Initialize the execution + */ + void init_execution() override; + + /** + * Deinitialize the execution + */ + void deinit_execution() override; + void set_alpha(float alpha) { alpha_ = alpha; diff --git a/source/blender/compositor/operations/COM_MapValueOperation.cc b/source/blender/compositor/operations/COM_MapValueOperation.cc index cb385711baa..09eda657142 100644 --- a/source/blender/compositor/operations/COM_MapValueOperation.cc +++ b/source/blender/compositor/operations/COM_MapValueOperation.cc @@ -10,9 +10,43 @@ MapValueOperation::MapValueOperation() { this->add_input_socket(DataType::Value); this->add_output_socket(DataType::Value); + input_operation_ = nullptr; flags_.can_be_constant = true; } +void MapValueOperation::init_execution() +{ + input_operation_ = this->get_input_socket_reader(0); +} + +void MapValueOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float src[4]; + input_operation_->read_sampled(src, x, y, sampler); + const TexMapping *texmap = settings_; + float value = (src[0] + texmap->loc[0]) * texmap->size[0]; + if (texmap->flag & TEXMAP_CLIP_MIN) { + if (value < texmap->min[0]) { + value = texmap->min[0]; + } + } + if (texmap->flag & TEXMAP_CLIP_MAX) { + if (value > texmap->max[0]) { + value = texmap->max[0]; + } + } + + output[0] = value; +} + +void MapValueOperation::deinit_execution() +{ + input_operation_ = nullptr; +} + void MapValueOperation::update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span inputs) diff --git a/source/blender/compositor/operations/COM_MapValueOperation.h b/source/blender/compositor/operations/COM_MapValueOperation.h index 26ed2ed466d..2bcc077c659 100644 --- a/source/blender/compositor/operations/COM_MapValueOperation.h +++ b/source/blender/compositor/operations/COM_MapValueOperation.h @@ -15,11 +15,33 @@ namespace blender::compositor { */ class MapValueOperation : public MultiThreadedOperation { private: + /** + * Cached reference to the input_program + */ + SocketReader *input_operation_; const TexMapping *settings_; public: + /** + * Default constructor + */ MapValueOperation(); + /** + * The inner loop of this operation. + */ + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + + /** + * Initialize the execution + */ + void init_execution() override; + + /** + * Deinitialize the execution + */ + void deinit_execution() override; + /** * \brief set the TexMapping settings */ diff --git a/source/blender/compositor/operations/COM_MaskOperation.cc b/source/blender/compositor/operations/COM_MaskOperation.cc index 545ef9e8936..9496f153490 100644 --- a/source/blender/compositor/operations/COM_MaskOperation.cc +++ b/source/blender/compositor/operations/COM_MaskOperation.cc @@ -94,6 +94,39 @@ void MaskOperation::determine_canvas(const rcti &preferred_area, rcti &r_area) } } +void MaskOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler /*sampler*/) +{ + const float xy[2] = { + (x * mask_width_inv_) + mask_px_ofs_[0], + (y * mask_height_inv_) + mask_px_ofs_[1], + }; + + if (raster_mask_handle_tot_ == 1) { + if (raster_mask_handles_[0]) { + output[0] = BKE_maskrasterize_handle_sample(raster_mask_handles_[0], xy); + } + else { + output[0] = 0.0f; + } + } + else { + /* In case loop below fails. */ + output[0] = 0.0f; + + for (uint i = 0; i < raster_mask_handle_tot_; i++) { + if (raster_mask_handles_[i]) { + output[0] += BKE_maskrasterize_handle_sample(raster_mask_handles_[i], xy); + } + } + + /* until we get better falloff */ + output[0] /= raster_mask_handle_tot_; + } +} + void MaskOperation::update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span /*inputs*/) diff --git a/source/blender/compositor/operations/COM_MaskOperation.h b/source/blender/compositor/operations/COM_MaskOperation.h index b79766ec53c..498231771be 100644 --- a/source/blender/compositor/operations/COM_MaskOperation.h +++ b/source/blender/compositor/operations/COM_MaskOperation.h @@ -90,6 +90,8 @@ class MaskOperation : public MultiThreadedOperation { frame_shutter_ = shutter; } + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + void update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span inputs) override; diff --git a/source/blender/compositor/operations/COM_MathBaseOperation.cc b/source/blender/compositor/operations/COM_MathBaseOperation.cc index abe29702da0..35cd7caf605 100644 --- a/source/blender/compositor/operations/COM_MathBaseOperation.cc +++ b/source/blender/compositor/operations/COM_MathBaseOperation.cc @@ -16,10 +16,27 @@ MathBaseOperation::MathBaseOperation() this->add_input_socket(DataType::Value); this->add_input_socket(DataType::Value); this->add_output_socket(DataType::Value); + input_value1_operation_ = nullptr; + input_value2_operation_ = nullptr; + input_value3_operation_ = nullptr; use_clamp_ = false; flags_.can_be_constant = true; } +void MathBaseOperation::init_execution() +{ + input_value1_operation_ = this->get_input_socket_reader(0); + input_value2_operation_ = this->get_input_socket_reader(1); + input_value3_operation_ = this->get_input_socket_reader(2); +} + +void MathBaseOperation::deinit_execution() +{ + input_value1_operation_ = nullptr; + input_value2_operation_ = nullptr; + input_value3_operation_ = nullptr; +} + void MathBaseOperation::determine_canvas(const rcti &preferred_area, rcti &r_area) { NodeOperationInput *socket; @@ -35,6 +52,13 @@ void MathBaseOperation::determine_canvas(const rcti &preferred_area, rcti &r_are NodeOperation::determine_canvas(preferred_area, r_area); } +void MathBaseOperation::clamp_if_needed(float *color) +{ + if (use_clamp_) { + CLAMP(color[0], 0.0f, 1.0f); + } +} + void MathBaseOperation::update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span inputs) @@ -43,6 +67,75 @@ void MathBaseOperation::update_memory_buffer_partial(MemoryBuffer *output, update_memory_buffer_partial(it); } +void MathAddOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float input_value1[4]; + float input_value2[4]; + + input_value1_operation_->read_sampled(input_value1, x, y, sampler); + input_value2_operation_->read_sampled(input_value2, x, y, sampler); + + output[0] = input_value1[0] + input_value2[0]; + + clamp_if_needed(output); +} + +void MathSubtractOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float input_value1[4]; + float input_value2[4]; + + input_value1_operation_->read_sampled(input_value1, x, y, sampler); + input_value2_operation_->read_sampled(input_value2, x, y, sampler); + + output[0] = input_value1[0] - input_value2[0]; + + clamp_if_needed(output); +} + +void MathMultiplyOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float input_value1[4]; + float input_value2[4]; + + input_value1_operation_->read_sampled(input_value1, x, y, sampler); + input_value2_operation_->read_sampled(input_value2, x, y, sampler); + + output[0] = input_value1[0] * input_value2[0]; + + clamp_if_needed(output); +} + +void MathDivideOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float input_value1[4]; + float input_value2[4]; + + input_value1_operation_->read_sampled(input_value1, x, y, sampler); + input_value2_operation_->read_sampled(input_value2, x, y, sampler); + + if (input_value2[0] == 0) { /* We don't want to divide by zero. */ + output[0] = 0.0; + } + else { + output[0] = input_value1[0] / input_value2[0]; + } + + clamp_if_needed(output); +} + void MathDivideOperation::update_memory_buffer_partial(BuffersIterator &it) { for (; !it.is_end(); ++it) { @@ -51,6 +144,22 @@ void MathDivideOperation::update_memory_buffer_partial(BuffersIterator &i } } +void MathSineOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float input_value1[4]; + float input_value2[4]; + + input_value1_operation_->read_sampled(input_value1, x, y, sampler); + input_value2_operation_->read_sampled(input_value2, x, y, sampler); + + output[0] = sin(input_value1[0]); + + clamp_if_needed(output); +} + void MathSineOperation::update_memory_buffer_partial(BuffersIterator &it) { for (; !it.is_end(); ++it) { @@ -59,6 +168,22 @@ void MathSineOperation::update_memory_buffer_partial(BuffersIterator &it) } } +void MathCosineOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float input_value1[4]; + float input_value2[4]; + + input_value1_operation_->read_sampled(input_value1, x, y, sampler); + input_value2_operation_->read_sampled(input_value2, x, y, sampler); + + output[0] = cos(input_value1[0]); + + clamp_if_needed(output); +} + void MathCosineOperation::update_memory_buffer_partial(BuffersIterator &it) { for (; !it.is_end(); ++it) { @@ -67,6 +192,22 @@ void MathCosineOperation::update_memory_buffer_partial(BuffersIterator &i } } +void MathTangentOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float input_value1[4]; + float input_value2[4]; + + input_value1_operation_->read_sampled(input_value1, x, y, sampler); + input_value2_operation_->read_sampled(input_value2, x, y, sampler); + + output[0] = tan(input_value1[0]); + + clamp_if_needed(output); +} + void MathTangentOperation::update_memory_buffer_partial(BuffersIterator &it) { for (; !it.is_end(); ++it) { @@ -75,6 +216,22 @@ void MathTangentOperation::update_memory_buffer_partial(BuffersIterator & } } +void MathHyperbolicSineOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float input_value1[4]; + float input_value2[4]; + + input_value1_operation_->read_sampled(input_value1, x, y, sampler); + input_value2_operation_->read_sampled(input_value2, x, y, sampler); + + output[0] = sinh(input_value1[0]); + + clamp_if_needed(output); +} + void MathHyperbolicSineOperation::update_memory_buffer_partial(BuffersIterator &it) { for (; !it.is_end(); ++it) { @@ -83,6 +240,22 @@ void MathHyperbolicSineOperation::update_memory_buffer_partial(BuffersIteratorread_sampled(input_value1, x, y, sampler); + input_value2_operation_->read_sampled(input_value2, x, y, sampler); + + output[0] = cosh(input_value1[0]); + + clamp_if_needed(output); +} + void MathHyperbolicCosineOperation::update_memory_buffer_partial(BuffersIterator &it) { for (; !it.is_end(); ++it) { @@ -91,6 +264,22 @@ void MathHyperbolicCosineOperation::update_memory_buffer_partial(BuffersIterator } } +void MathHyperbolicTangentOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float input_value1[4]; + float input_value2[4]; + + input_value1_operation_->read_sampled(input_value1, x, y, sampler); + input_value2_operation_->read_sampled(input_value2, x, y, sampler); + + output[0] = tanh(input_value1[0]); + + clamp_if_needed(output); +} + void MathHyperbolicTangentOperation::update_memory_buffer_partial(BuffersIterator &it) { for (; !it.is_end(); ++it) { @@ -99,6 +288,27 @@ void MathHyperbolicTangentOperation::update_memory_buffer_partial(BuffersIterato } } +void MathArcSineOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float input_value1[4]; + float input_value2[4]; + + input_value1_operation_->read_sampled(input_value1, x, y, sampler); + input_value2_operation_->read_sampled(input_value2, x, y, sampler); + + if (input_value1[0] <= 1 && input_value1[0] >= -1) { + output[0] = asin(input_value1[0]); + } + else { + output[0] = 0.0; + } + + clamp_if_needed(output); +} + void MathArcSineOperation::update_memory_buffer_partial(BuffersIterator &it) { for (; !it.is_end(); ++it) { @@ -107,6 +317,27 @@ void MathArcSineOperation::update_memory_buffer_partial(BuffersIterator & } } +void MathArcCosineOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float input_value1[4]; + float input_value2[4]; + + input_value1_operation_->read_sampled(input_value1, x, y, sampler); + input_value2_operation_->read_sampled(input_value2, x, y, sampler); + + if (input_value1[0] <= 1 && input_value1[0] >= -1) { + output[0] = acos(input_value1[0]); + } + else { + output[0] = 0.0; + } + + clamp_if_needed(output); +} + void MathArcCosineOperation::update_memory_buffer_partial(BuffersIterator &it) { for (; !it.is_end(); ++it) { @@ -115,6 +346,22 @@ void MathArcCosineOperation::update_memory_buffer_partial(BuffersIterator } } +void MathArcTangentOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float input_value1[4]; + float input_value2[4]; + + input_value1_operation_->read_sampled(input_value1, x, y, sampler); + input_value2_operation_->read_sampled(input_value2, x, y, sampler); + + output[0] = atan(input_value1[0]); + + clamp_if_needed(output); +} + void MathArcTangentOperation::update_memory_buffer_partial(BuffersIterator &it) { for (; !it.is_end(); ++it) { @@ -123,6 +370,34 @@ void MathArcTangentOperation::update_memory_buffer_partial(BuffersIteratorread_sampled(input_value1, x, y, sampler); + input_value2_operation_->read_sampled(input_value2, x, y, sampler); + + if (input_value1[0] >= 0) { + output[0] = pow(input_value1[0], input_value2[0]); + } + else { + float y_mod_1 = fmod(input_value2[0], 1); + /* if input value is not nearly an integer, fall back to zero, nicer than straight rounding */ + if (y_mod_1 > 0.999f || y_mod_1 < 0.001f) { + output[0] = pow(input_value1[0], floorf(input_value2[0] + 0.5f)); + } + else { + output[0] = 0.0; + } + } + + clamp_if_needed(output); +} + void MathPowerOperation::update_memory_buffer_partial(BuffersIterator &it) { for (; !it.is_end(); ++it) { @@ -146,6 +421,27 @@ void MathPowerOperation::update_memory_buffer_partial(BuffersIterator &it } } +void MathLogarithmOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float input_value1[4]; + float input_value2[4]; + + input_value1_operation_->read_sampled(input_value1, x, y, sampler); + input_value2_operation_->read_sampled(input_value2, x, y, sampler); + + if (input_value1[0] > 0 && input_value2[0] > 0) { + output[0] = log(input_value1[0]) / log(input_value2[0]); + } + else { + output[0] = 0.0; + } + + clamp_if_needed(output); +} + void MathLogarithmOperation::update_memory_buffer_partial(BuffersIterator &it) { for (; !it.is_end(); ++it) { @@ -161,6 +457,22 @@ void MathLogarithmOperation::update_memory_buffer_partial(BuffersIterator } } +void MathMinimumOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float input_value1[4]; + float input_value2[4]; + + input_value1_operation_->read_sampled(input_value1, x, y, sampler); + input_value2_operation_->read_sampled(input_value2, x, y, sampler); + + output[0] = std::min(input_value1[0], input_value2[0]); + + clamp_if_needed(output); +} + void MathMinimumOperation::update_memory_buffer_partial(BuffersIterator &it) { for (; !it.is_end(); ++it) { @@ -169,6 +481,22 @@ void MathMinimumOperation::update_memory_buffer_partial(BuffersIterator & } } +void MathMaximumOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float input_value1[4]; + float input_value2[4]; + + input_value1_operation_->read_sampled(input_value1, x, y, sampler); + input_value2_operation_->read_sampled(input_value2, x, y, sampler); + + output[0] = std::max(input_value1[0], input_value2[0]); + + clamp_if_needed(output); +} + void MathMaximumOperation::update_memory_buffer_partial(BuffersIterator &it) { for (; !it.is_end(); ++it) { @@ -177,6 +505,22 @@ void MathMaximumOperation::update_memory_buffer_partial(BuffersIterator & } } +void MathRoundOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float input_value1[4]; + float input_value2[4]; + + input_value1_operation_->read_sampled(input_value1, x, y, sampler); + input_value2_operation_->read_sampled(input_value2, x, y, sampler); + + output[0] = round(input_value1[0]); + + clamp_if_needed(output); +} + void MathRoundOperation::update_memory_buffer_partial(BuffersIterator &it) { for (; !it.is_end(); ++it) { @@ -185,6 +529,59 @@ void MathRoundOperation::update_memory_buffer_partial(BuffersIterator &it } } +void MathLessThanOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float input_value1[4]; + float input_value2[4]; + + input_value1_operation_->read_sampled(input_value1, x, y, sampler); + input_value2_operation_->read_sampled(input_value2, x, y, sampler); + + output[0] = input_value1[0] < input_value2[0] ? 1.0f : 0.0f; + + clamp_if_needed(output); +} + +void MathGreaterThanOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float input_value1[4]; + float input_value2[4]; + + input_value1_operation_->read_sampled(input_value1, x, y, sampler); + input_value2_operation_->read_sampled(input_value2, x, y, sampler); + + output[0] = input_value1[0] > input_value2[0] ? 1.0f : 0.0f; + + clamp_if_needed(output); +} + +void MathModuloOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float input_value1[4]; + float input_value2[4]; + + input_value1_operation_->read_sampled(input_value1, x, y, sampler); + input_value2_operation_->read_sampled(input_value2, x, y, sampler); + + if (input_value2[0] == 0) { + output[0] = 0.0; + } + else { + output[0] = fmod(input_value1[0], input_value2[0]); + } + + clamp_if_needed(output); +} + void MathModuloOperation::update_memory_buffer_partial(BuffersIterator &it) { for (; !it.is_end(); ++it) { @@ -194,6 +591,27 @@ void MathModuloOperation::update_memory_buffer_partial(BuffersIterator &i } } +void MathFlooredModuloOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float input_value1[4]; + float input_value2[4]; + + input_value1_operation_->read_sampled(input_value1, x, y, sampler); + input_value2_operation_->read_sampled(input_value2, x, y, sampler); + + if (input_value2[0] == 0) { + output[0] = 0.0; + } + else { + output[0] = input_value1[0] - floorf(input_value1[0] / input_value2[0]) * input_value2[0]; + } + + clamp_if_needed(output); +} + void MathFlooredModuloOperation::update_memory_buffer_partial(BuffersIterator &it) { for (; !it.is_end(); ++it) { @@ -203,6 +621,20 @@ void MathFlooredModuloOperation::update_memory_buffer_partial(BuffersIteratorread_sampled(input_value1, x, y, sampler); + + output[0] = fabs(input_value1[0]); + + clamp_if_needed(output); +} + void MathAbsoluteOperation::update_memory_buffer_partial(BuffersIterator &it) { for (; !it.is_end(); ++it) { @@ -211,6 +643,20 @@ void MathAbsoluteOperation::update_memory_buffer_partial(BuffersIterator } } +void MathRadiansOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float input_value1[4]; + + input_value1_operation_->read_sampled(input_value1, x, y, sampler); + + output[0] = DEG2RADF(input_value1[0]); + + clamp_if_needed(output); +} + void MathRadiansOperation::update_memory_buffer_partial(BuffersIterator &it) { for (; !it.is_end(); ++it) { @@ -219,6 +665,20 @@ void MathRadiansOperation::update_memory_buffer_partial(BuffersIterator & } } +void MathDegreesOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float input_value1[4]; + + input_value1_operation_->read_sampled(input_value1, x, y, sampler); + + output[0] = RAD2DEGF(input_value1[0]); + + clamp_if_needed(output); +} + void MathDegreesOperation::update_memory_buffer_partial(BuffersIterator &it) { for (; !it.is_end(); ++it) { @@ -227,6 +687,22 @@ void MathDegreesOperation::update_memory_buffer_partial(BuffersIterator & } } +void MathArcTan2Operation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float input_value1[4]; + float input_value2[4]; + + input_value1_operation_->read_sampled(input_value1, x, y, sampler); + input_value2_operation_->read_sampled(input_value2, x, y, sampler); + + output[0] = atan2(input_value1[0], input_value2[0]); + + clamp_if_needed(output); +} + void MathArcTan2Operation::update_memory_buffer_partial(BuffersIterator &it) { for (; !it.is_end(); ++it) { @@ -235,6 +711,20 @@ void MathArcTan2Operation::update_memory_buffer_partial(BuffersIterator & } } +void MathFloorOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float input_value1[4]; + + input_value1_operation_->read_sampled(input_value1, x, y, sampler); + + output[0] = floor(input_value1[0]); + + clamp_if_needed(output); +} + void MathFloorOperation::update_memory_buffer_partial(BuffersIterator &it) { for (; !it.is_end(); ++it) { @@ -243,6 +733,20 @@ void MathFloorOperation::update_memory_buffer_partial(BuffersIterator &it } } +void MathCeilOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float input_value1[4]; + + input_value1_operation_->read_sampled(input_value1, x, y, sampler); + + output[0] = ceil(input_value1[0]); + + clamp_if_needed(output); +} + void MathCeilOperation::update_memory_buffer_partial(BuffersIterator &it) { for (; !it.is_end(); ++it) { @@ -251,6 +755,20 @@ void MathCeilOperation::update_memory_buffer_partial(BuffersIterator &it) } } +void MathFractOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float input_value1[4]; + + input_value1_operation_->read_sampled(input_value1, x, y, sampler); + + output[0] = input_value1[0] - floor(input_value1[0]); + + clamp_if_needed(output); +} + void MathFractOperation::update_memory_buffer_partial(BuffersIterator &it) { for (; !it.is_end(); ++it) { @@ -259,6 +777,25 @@ void MathFractOperation::update_memory_buffer_partial(BuffersIterator &it } } +void MathSqrtOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float input_value1[4]; + + input_value1_operation_->read_sampled(input_value1, x, y, sampler); + + if (input_value1[0] > 0) { + output[0] = sqrt(input_value1[0]); + } + else { + output[0] = 0.0f; + } + + clamp_if_needed(output); +} + void MathSqrtOperation::update_memory_buffer_partial(BuffersIterator &it) { for (; !it.is_end(); ++it) { @@ -267,6 +804,25 @@ void MathSqrtOperation::update_memory_buffer_partial(BuffersIterator &it) } } +void MathInverseSqrtOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float input_value1[4]; + + input_value1_operation_->read_sampled(input_value1, x, y, sampler); + + if (input_value1[0] > 0) { + output[0] = 1.0f / sqrt(input_value1[0]); + } + else { + output[0] = 0.0f; + } + + clamp_if_needed(output); +} + void MathInverseSqrtOperation::update_memory_buffer_partial(BuffersIterator &it) { for (; !it.is_end(); ++it) { @@ -275,6 +831,20 @@ void MathInverseSqrtOperation::update_memory_buffer_partial(BuffersIteratorread_sampled(input_value1, x, y, sampler); + + output[0] = compatible_signf(input_value1[0]); + + clamp_if_needed(output); +} + void MathSignOperation::update_memory_buffer_partial(BuffersIterator &it) { for (; !it.is_end(); ++it) { @@ -283,6 +853,20 @@ void MathSignOperation::update_memory_buffer_partial(BuffersIterator &it) } } +void MathExponentOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float input_value1[4]; + + input_value1_operation_->read_sampled(input_value1, x, y, sampler); + + output[0] = expf(input_value1[0]); + + clamp_if_needed(output); +} + void MathExponentOperation::update_memory_buffer_partial(BuffersIterator &it) { for (; !it.is_end(); ++it) { @@ -291,6 +875,20 @@ void MathExponentOperation::update_memory_buffer_partial(BuffersIterator } } +void MathTruncOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float input_value1[4]; + + input_value1_operation_->read_sampled(input_value1, x, y, sampler); + + output[0] = (input_value1[0] >= 0.0f) ? floor(input_value1[0]) : ceil(input_value1[0]); + + clamp_if_needed(output); +} + void MathTruncOperation::update_memory_buffer_partial(BuffersIterator &it) { for (; !it.is_end(); ++it) { @@ -300,6 +898,27 @@ void MathTruncOperation::update_memory_buffer_partial(BuffersIterator &it } } +void MathSnapOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float input_value1[4]; + float input_value2[4]; + + input_value1_operation_->read_sampled(input_value1, x, y, sampler); + input_value2_operation_->read_sampled(input_value2, x, y, sampler); + + if (input_value1[0] == 0 || input_value2[0] == 0) { /* We don't want to divide by zero. */ + output[0] = 0.0f; + } + else { + output[0] = floorf(input_value1[0] / input_value2[0]) * input_value2[0]; + } + + clamp_if_needed(output); +} + void MathSnapOperation::update_memory_buffer_partial(BuffersIterator &it) { for (; !it.is_end(); ++it) { @@ -315,6 +934,24 @@ void MathSnapOperation::update_memory_buffer_partial(BuffersIterator &it) } } +void MathWrapOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float input_value1[4]; + float input_value2[4]; + float input_value3[4]; + + input_value1_operation_->read_sampled(input_value1, x, y, sampler); + input_value2_operation_->read_sampled(input_value2, x, y, sampler); + input_value3_operation_->read_sampled(input_value3, x, y, sampler); + + output[0] = wrapf(input_value1[0], input_value2[0], input_value3[0]); + + clamp_if_needed(output); +} + void MathWrapOperation::update_memory_buffer_partial(BuffersIterator &it) { for (; !it.is_end(); ++it) { @@ -323,6 +960,22 @@ void MathWrapOperation::update_memory_buffer_partial(BuffersIterator &it) } } +void MathPingpongOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float input_value1[4]; + float input_value2[4]; + + input_value1_operation_->read_sampled(input_value1, x, y, sampler); + input_value2_operation_->read_sampled(input_value2, x, y, sampler); + + output[0] = pingpongf(input_value1[0], input_value2[0]); + + clamp_if_needed(output); +} + void MathPingpongOperation::update_memory_buffer_partial(BuffersIterator &it) { for (; !it.is_end(); ++it) { @@ -331,6 +984,26 @@ void MathPingpongOperation::update_memory_buffer_partial(BuffersIterator } } +void MathCompareOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float input_value1[4]; + float input_value2[4]; + float input_value3[4]; + + input_value1_operation_->read_sampled(input_value1, x, y, sampler); + input_value2_operation_->read_sampled(input_value2, x, y, sampler); + input_value3_operation_->read_sampled(input_value3, x, y, sampler); + + output[0] = (fabsf(input_value1[0] - input_value2[0]) <= std::max(input_value3[0], 1e-5f)) ? + 1.0f : + 0.0f; + + clamp_if_needed(output); +} + void MathCompareOperation::update_memory_buffer_partial(BuffersIterator &it) { for (; !it.is_end(); ++it) { @@ -339,6 +1012,24 @@ void MathCompareOperation::update_memory_buffer_partial(BuffersIterator & } } +void MathMultiplyAddOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float input_value1[4]; + float input_value2[4]; + float input_value3[4]; + + input_value1_operation_->read_sampled(input_value1, x, y, sampler); + input_value2_operation_->read_sampled(input_value2, x, y, sampler); + input_value3_operation_->read_sampled(input_value3, x, y, sampler); + + output[0] = input_value1[0] * input_value2[0] + input_value3[0]; + + clamp_if_needed(output); +} + void MathMultiplyAddOperation::update_memory_buffer_partial(BuffersIterator &it) { for (; !it.is_end(); ++it) { @@ -347,6 +1038,24 @@ void MathMultiplyAddOperation::update_memory_buffer_partial(BuffersIteratorread_sampled(input_value1, x, y, sampler); + input_value2_operation_->read_sampled(input_value2, x, y, sampler); + input_value3_operation_->read_sampled(input_value3, x, y, sampler); + + output[0] = smoothminf(input_value1[0], input_value2[0], input_value3[0]); + + clamp_if_needed(output); +} + void MathSmoothMinOperation::update_memory_buffer_partial(BuffersIterator &it) { for (; !it.is_end(); ++it) { @@ -355,6 +1064,24 @@ void MathSmoothMinOperation::update_memory_buffer_partial(BuffersIterator } } +void MathSmoothMaxOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float input_value1[4]; + float input_value2[4]; + float input_value3[4]; + + input_value1_operation_->read_sampled(input_value1, x, y, sampler); + input_value2_operation_->read_sampled(input_value2, x, y, sampler); + input_value3_operation_->read_sampled(input_value3, x, y, sampler); + + output[0] = -smoothminf(-input_value1[0], -input_value2[0], input_value3[0]); + + clamp_if_needed(output); +} + void MathSmoothMaxOperation::update_memory_buffer_partial(BuffersIterator &it) { for (; !it.is_end(); ++it) { diff --git a/source/blender/compositor/operations/COM_MathBaseOperation.h b/source/blender/compositor/operations/COM_MathBaseOperation.h index d59ec3b579d..6d96e53d645 100644 --- a/source/blender/compositor/operations/COM_MathBaseOperation.h +++ b/source/blender/compositor/operations/COM_MathBaseOperation.h @@ -14,11 +14,24 @@ namespace blender::compositor { */ class MathBaseOperation : public MultiThreadedOperation { protected: + /** + * Prefetched reference to the input_program + */ + SocketReader *input_value1_operation_; + SocketReader *input_value2_operation_; + SocketReader *input_value3_operation_; + bool use_clamp_; protected: + /** + * Default constructor + */ MathBaseOperation(); + /* TODO(manzanilla): to be removed with tiled implementation. */ + void clamp_if_needed(float color[4]); + float clamp_when_enabled(float value) { if (use_clamp_) { @@ -35,6 +48,16 @@ class MathBaseOperation : public MultiThreadedOperation { } public: + /** + * Initialize the execution + */ + void init_execution() override; + + /** + * Deinitialize the execution + */ + void deinit_execution() override; + /** * Determine resolution */ @@ -65,175 +88,298 @@ class MathFunctor2Operation : public MathBaseOperation { } }; -class MathAddOperation : public MathFunctor2Operation {}; -class MathSubtractOperation : public MathFunctor2Operation {}; -class MathMultiplyOperation : public MathFunctor2Operation {}; +class MathAddOperation : public MathFunctor2Operation { + public: + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; +}; +class MathSubtractOperation : public MathFunctor2Operation { + public: + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; +}; +class MathMultiplyOperation : public MathFunctor2Operation { + public: + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; +}; class MathDivideOperation : public MathBaseOperation { + public: + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + protected: void update_memory_buffer_partial(BuffersIterator &it) override; }; class MathSineOperation : public MathBaseOperation { + public: + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + protected: void update_memory_buffer_partial(BuffersIterator &it) override; }; class MathCosineOperation : public MathBaseOperation { + public: + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + protected: void update_memory_buffer_partial(BuffersIterator &it) override; }; class MathTangentOperation : public MathBaseOperation { + public: + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + protected: void update_memory_buffer_partial(BuffersIterator &it) override; }; class MathHyperbolicSineOperation : public MathBaseOperation { + public: + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + protected: void update_memory_buffer_partial(BuffersIterator &it) override; }; class MathHyperbolicCosineOperation : public MathBaseOperation { + public: + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + protected: void update_memory_buffer_partial(BuffersIterator &it) override; }; class MathHyperbolicTangentOperation : public MathBaseOperation { + public: + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + protected: void update_memory_buffer_partial(BuffersIterator &it) override; }; class MathArcSineOperation : public MathBaseOperation { + public: + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + protected: void update_memory_buffer_partial(BuffersIterator &it) override; }; class MathArcCosineOperation : public MathBaseOperation { + public: + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + protected: void update_memory_buffer_partial(BuffersIterator &it) override; }; class MathArcTangentOperation : public MathBaseOperation { + public: + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + protected: void update_memory_buffer_partial(BuffersIterator &it) override; }; class MathPowerOperation : public MathBaseOperation { + public: + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + protected: void update_memory_buffer_partial(BuffersIterator &it) override; }; class MathLogarithmOperation : public MathBaseOperation { + public: + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + protected: void update_memory_buffer_partial(BuffersIterator &it) override; }; class MathMinimumOperation : public MathBaseOperation { + public: + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + protected: void update_memory_buffer_partial(BuffersIterator &it) override; }; class MathMaximumOperation : public MathBaseOperation { + public: + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + protected: void update_memory_buffer_partial(BuffersIterator &it) override; }; class MathRoundOperation : public MathBaseOperation { + public: + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + protected: void update_memory_buffer_partial(BuffersIterator &it) override; }; -class MathLessThanOperation : public MathFunctor2Operation {}; -class MathGreaterThanOperation : public MathFunctor2Operation {}; +class MathLessThanOperation : public MathFunctor2Operation { + public: + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; +}; +class MathGreaterThanOperation : public MathFunctor2Operation { + public: + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; +}; class MathModuloOperation : public MathBaseOperation { + public: + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + protected: void update_memory_buffer_partial(BuffersIterator &it) override; }; class MathFlooredModuloOperation : public MathBaseOperation { + public: + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + protected: void update_memory_buffer_partial(BuffersIterator &it) override; }; class MathAbsoluteOperation : public MathBaseOperation { + public: + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + protected: void update_memory_buffer_partial(BuffersIterator &it) override; }; class MathRadiansOperation : public MathBaseOperation { + public: + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + protected: void update_memory_buffer_partial(BuffersIterator &it) override; }; class MathDegreesOperation : public MathBaseOperation { + public: + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + protected: void update_memory_buffer_partial(BuffersIterator &it) override; }; class MathArcTan2Operation : public MathBaseOperation { + public: + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + protected: void update_memory_buffer_partial(BuffersIterator &it) override; }; class MathFloorOperation : public MathBaseOperation { + public: + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + protected: void update_memory_buffer_partial(BuffersIterator &it) override; }; class MathCeilOperation : public MathBaseOperation { + public: + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + protected: void update_memory_buffer_partial(BuffersIterator &it) override; }; class MathFractOperation : public MathBaseOperation { + public: + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + protected: void update_memory_buffer_partial(BuffersIterator &it) override; }; class MathSqrtOperation : public MathBaseOperation { + public: + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + protected: void update_memory_buffer_partial(BuffersIterator &it) override; }; class MathInverseSqrtOperation : public MathBaseOperation { + public: + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + protected: void update_memory_buffer_partial(BuffersIterator &it) override; }; class MathSignOperation : public MathBaseOperation { + public: + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + protected: void update_memory_buffer_partial(BuffersIterator &it) override; }; class MathExponentOperation : public MathBaseOperation { + public: + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + protected: void update_memory_buffer_partial(BuffersIterator &it) override; }; class MathTruncOperation : public MathBaseOperation { + public: + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + protected: void update_memory_buffer_partial(BuffersIterator &it) override; }; class MathSnapOperation : public MathBaseOperation { + public: + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + protected: void update_memory_buffer_partial(BuffersIterator &it) override; }; class MathWrapOperation : public MathBaseOperation { + public: + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + protected: void update_memory_buffer_partial(BuffersIterator &it) override; }; class MathPingpongOperation : public MathBaseOperation { + public: + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + protected: void update_memory_buffer_partial(BuffersIterator &it) override; }; class MathCompareOperation : public MathBaseOperation { + public: + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + protected: void update_memory_buffer_partial(BuffersIterator &it) override; }; class MathMultiplyAddOperation : public MathBaseOperation { + public: + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + protected: void update_memory_buffer_partial(BuffersIterator &it) override; }; class MathSmoothMinOperation : public MathBaseOperation { + public: + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + protected: void update_memory_buffer_partial(BuffersIterator &it) override; }; class MathSmoothMaxOperation : public MathBaseOperation { + public: + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + protected: void update_memory_buffer_partial(BuffersIterator &it) override; }; diff --git a/source/blender/compositor/operations/COM_MixOperation.cc b/source/blender/compositor/operations/COM_MixOperation.cc index 059d810aae9..a2a9bbd5e92 100644 --- a/source/blender/compositor/operations/COM_MixOperation.cc +++ b/source/blender/compositor/operations/COM_MixOperation.cc @@ -16,11 +16,45 @@ MixBaseOperation::MixBaseOperation() this->add_input_socket(DataType::Color); this->add_input_socket(DataType::Color); this->add_output_socket(DataType::Color); + input_value_operation_ = nullptr; + input_color1_operation_ = nullptr; + input_color2_operation_ = nullptr; this->set_use_value_alpha_multiply(false); this->set_use_clamp(false); flags_.can_be_constant = true; } +void MixBaseOperation::init_execution() +{ + input_value_operation_ = this->get_input_socket_reader(0); + input_color1_operation_ = this->get_input_socket_reader(1); + input_color2_operation_ = this->get_input_socket_reader(2); +} + +void MixBaseOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float input_color1[4]; + float input_color2[4]; + float input_value[4]; + + input_value_operation_->read_sampled(input_value, x, y, sampler); + input_color1_operation_->read_sampled(input_color1, x, y, sampler); + input_color2_operation_->read_sampled(input_color2, x, y, sampler); + + float value = input_value[0]; + if (this->use_value_alpha_multiply()) { + value *= input_color2[3]; + } + float valuem = 1.0f - value; + output[0] = valuem * (input_color1[0]) + value * (input_color2[0]); + output[1] = valuem * (input_color1[1]) + value * (input_color2[1]); + output[2] = valuem * (input_color1[2]) + value * (input_color2[2]); + output[3] = input_color1[3]; +} + void MixBaseOperation::determine_canvas(const rcti &preferred_area, rcti &r_area) { NodeOperationInput *socket; @@ -44,6 +78,13 @@ void MixBaseOperation::determine_canvas(const rcti &preferred_area, rcti &r_area NodeOperation::determine_canvas(preferred_area, r_area); } +void MixBaseOperation::deinit_execution() +{ + input_value_operation_ = nullptr; + input_color1_operation_ = nullptr; + input_color2_operation_ = nullptr; +} + void MixBaseOperation::update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span inputs) @@ -85,6 +126,31 @@ void MixBaseOperation::update_memory_buffer_row(PixelCursor &p) /* ******** Mix Add Operation ******** */ +void MixAddOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float input_color1[4]; + float input_color2[4]; + float input_value[4]; + + input_value_operation_->read_sampled(input_value, x, y, sampler); + input_color1_operation_->read_sampled(input_color1, x, y, sampler); + input_color2_operation_->read_sampled(input_color2, x, y, sampler); + + float value = input_value[0]; + if (this->use_value_alpha_multiply()) { + value *= input_color2[3]; + } + output[0] = input_color1[0] + value * input_color2[0]; + output[1] = input_color1[1] + value * input_color2[1]; + output[2] = input_color1[2] + value * input_color2[2]; + output[3] = input_color1[3]; + + clamp_if_needed(output); +} + void MixAddOperation::update_memory_buffer_row(PixelCursor &p) { while (p.out < p.row_end) { @@ -104,6 +170,33 @@ void MixAddOperation::update_memory_buffer_row(PixelCursor &p) /* ******** Mix Blend Operation ******** */ +void MixBlendOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float input_color1[4]; + float input_color2[4]; + float input_value[4]; + float value; + + input_value_operation_->read_sampled(input_value, x, y, sampler); + input_color1_operation_->read_sampled(input_color1, x, y, sampler); + input_color2_operation_->read_sampled(input_color2, x, y, sampler); + value = input_value[0]; + + if (this->use_value_alpha_multiply()) { + value *= input_color2[3]; + } + float valuem = 1.0f - value; + output[0] = valuem * (input_color1[0]) + value * (input_color2[0]); + output[1] = valuem * (input_color1[1]) + value * (input_color2[1]); + output[2] = valuem * (input_color1[2]) + value * (input_color2[2]); + output[3] = input_color1[3]; + + clamp_if_needed(output); +} + void MixBlendOperation::update_memory_buffer_row(PixelCursor &p) { while (p.out < p.row_end) { @@ -124,6 +217,82 @@ void MixBlendOperation::update_memory_buffer_row(PixelCursor &p) /* ******** Mix Burn Operation ******** */ +void MixColorBurnOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float input_color1[4]; + float input_color2[4]; + float input_value[4]; + float tmp; + + input_value_operation_->read_sampled(input_value, x, y, sampler); + input_color1_operation_->read_sampled(input_color1, x, y, sampler); + input_color2_operation_->read_sampled(input_color2, x, y, sampler); + + float value = input_value[0]; + if (this->use_value_alpha_multiply()) { + value *= input_color2[3]; + } + float valuem = 1.0f - value; + + tmp = valuem + value * input_color2[0]; + if (tmp <= 0.0f) { + output[0] = 0.0f; + } + else { + tmp = 1.0f - (1.0f - input_color1[0]) / tmp; + if (tmp < 0.0f) { + output[0] = 0.0f; + } + else if (tmp > 1.0f) { + output[0] = 1.0f; + } + else { + output[0] = tmp; + } + } + + tmp = valuem + value * input_color2[1]; + if (tmp <= 0.0f) { + output[1] = 0.0f; + } + else { + tmp = 1.0f - (1.0f - input_color1[1]) / tmp; + if (tmp < 0.0f) { + output[1] = 0.0f; + } + else if (tmp > 1.0f) { + output[1] = 1.0f; + } + else { + output[1] = tmp; + } + } + + tmp = valuem + value * input_color2[2]; + if (tmp <= 0.0f) { + output[2] = 0.0f; + } + else { + tmp = 1.0f - (1.0f - input_color1[2]) / tmp; + if (tmp < 0.0f) { + output[2] = 0.0f; + } + else if (tmp > 1.0f) { + output[2] = 1.0f; + } + else { + output[2] = tmp; + } + } + + output[3] = input_color1[3]; + + clamp_if_needed(output); +} + void MixColorBurnOperation::update_memory_buffer_row(PixelCursor &p) { while (p.out < p.row_end) { @@ -168,6 +337,44 @@ void MixColorBurnOperation::update_memory_buffer_row(PixelCursor &p) /* ******** Mix Color Operation ******** */ +void MixColorOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float input_color1[4]; + float input_color2[4]; + float input_value[4]; + + input_value_operation_->read_sampled(input_value, x, y, sampler); + input_color1_operation_->read_sampled(input_color1, x, y, sampler); + input_color2_operation_->read_sampled(input_color2, x, y, sampler); + + float value = input_value[0]; + if (this->use_value_alpha_multiply()) { + value *= input_color2[3]; + } + float valuem = 1.0f - value; + + float colH, colS, colV; + rgb_to_hsv(input_color2[0], input_color2[1], input_color2[2], &colH, &colS, &colV); + if (colS != 0.0f) { + float rH, rS, rV; + float tmpr, tmpg, tmpb; + rgb_to_hsv(input_color1[0], input_color1[1], input_color1[2], &rH, &rS, &rV); + hsv_to_rgb(colH, colS, rV, &tmpr, &tmpg, &tmpb); + output[0] = (valuem * input_color1[0]) + (value * tmpr); + output[1] = (valuem * input_color1[1]) + (value * tmpg); + output[2] = (valuem * input_color1[2]) + (value * tmpb); + } + else { + copy_v3_v3(output, input_color1); + } + output[3] = input_color1[3]; + + clamp_if_needed(output); +} + void MixColorOperation::update_memory_buffer_row(PixelCursor &p) { while (p.out < p.row_end) { @@ -200,6 +407,32 @@ void MixColorOperation::update_memory_buffer_row(PixelCursor &p) /* ******** Mix Darken Operation ******** */ +void MixDarkenOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float input_color1[4]; + float input_color2[4]; + float input_value[4]; + + input_value_operation_->read_sampled(input_value, x, y, sampler); + input_color1_operation_->read_sampled(input_color1, x, y, sampler); + input_color2_operation_->read_sampled(input_color2, x, y, sampler); + + float value = input_value[0]; + if (this->use_value_alpha_multiply()) { + value *= input_color2[3]; + } + float valuem = 1.0f - value; + output[0] = min_ff(input_color1[0], input_color2[0]) * value + input_color1[0] * valuem; + output[1] = min_ff(input_color1[1], input_color2[1]) * value + input_color1[1] * valuem; + output[2] = min_ff(input_color1[2], input_color2[2]) * value + input_color1[2] * valuem; + output[3] = input_color1[3]; + + clamp_if_needed(output); +} + void MixDarkenOperation::update_memory_buffer_row(PixelCursor &p) { while (p.out < p.row_end) { @@ -220,6 +453,32 @@ void MixDarkenOperation::update_memory_buffer_row(PixelCursor &p) /* ******** Mix Difference Operation ******** */ +void MixDifferenceOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float input_color1[4]; + float input_color2[4]; + float input_value[4]; + + input_value_operation_->read_sampled(input_value, x, y, sampler); + input_color1_operation_->read_sampled(input_color1, x, y, sampler); + input_color2_operation_->read_sampled(input_color2, x, y, sampler); + + float value = input_value[0]; + if (this->use_value_alpha_multiply()) { + value *= input_color2[3]; + } + float valuem = 1.0f - value; + output[0] = valuem * input_color1[0] + value * fabsf(input_color1[0] - input_color2[0]); + output[1] = valuem * input_color1[1] + value * fabsf(input_color1[1] - input_color2[1]); + output[2] = valuem * input_color1[2] + value * fabsf(input_color1[2] - input_color2[2]); + output[3] = input_color1[3]; + + clamp_if_needed(output); +} + void MixDifferenceOperation::update_memory_buffer_row(PixelCursor &p) { while (p.out < p.row_end) { @@ -240,6 +499,38 @@ void MixDifferenceOperation::update_memory_buffer_row(PixelCursor &p) /* ******** Mix Exclusion Operation ******** */ +void MixExclusionOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float input_color1[4]; + float input_color2[4]; + float input_value[4]; + + input_value_operation_->read_sampled(input_value, x, y, sampler); + input_color1_operation_->read_sampled(input_color1, x, y, sampler); + input_color2_operation_->read_sampled(input_color2, x, y, sampler); + + float value = input_value[0]; + if (this->use_value_alpha_multiply()) { + value *= input_color2[3]; + } + float valuem = 1.0f - value; + output[0] = max_ff(valuem * input_color1[0] + value * (input_color1[0] + input_color2[0] - + 2.0f * input_color1[0] * input_color2[0]), + 0.0f); + output[1] = max_ff(valuem * input_color1[1] + value * (input_color1[1] + input_color2[1] - + 2.0f * input_color1[1] * input_color2[1]), + 0.0f); + output[2] = max_ff(valuem * input_color1[2] + value * (input_color1[2] + input_color2[2] - + 2.0f * input_color1[2] * input_color2[2]), + 0.0f); + output[3] = input_color1[3]; + + clamp_if_needed(output); +} + void MixExclusionOperation::update_memory_buffer_row(PixelCursor &p) { while (p.out < p.row_end) { @@ -266,6 +557,49 @@ void MixExclusionOperation::update_memory_buffer_row(PixelCursor &p) /* ******** Mix Divide Operation ******** */ +void MixDivideOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float input_color1[4]; + float input_color2[4]; + float input_value[4]; + + input_value_operation_->read_sampled(input_value, x, y, sampler); + input_color1_operation_->read_sampled(input_color1, x, y, sampler); + input_color2_operation_->read_sampled(input_color2, x, y, sampler); + + float value = input_value[0]; + if (this->use_value_alpha_multiply()) { + value *= input_color2[3]; + } + float valuem = 1.0f - value; + + if (input_color2[0] != 0.0f) { + output[0] = valuem * (input_color1[0]) + value * (input_color1[0]) / input_color2[0]; + } + else { + output[0] = 0.0f; + } + if (input_color2[1] != 0.0f) { + output[1] = valuem * (input_color1[1]) + value * (input_color1[1]) / input_color2[1]; + } + else { + output[1] = 0.0f; + } + if (input_color2[2] != 0.0f) { + output[2] = valuem * (input_color1[2]) + value * (input_color1[2]) / input_color2[2]; + } + else { + output[2] = 0.0f; + } + + output[3] = input_color1[3]; + + clamp_if_needed(output); +} + void MixDivideOperation::update_memory_buffer_row(PixelCursor &p) { while (p.out < p.row_end) { @@ -303,6 +637,87 @@ void MixDivideOperation::update_memory_buffer_row(PixelCursor &p) /* ******** Mix Dodge Operation ******** */ +void MixDodgeOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float input_color1[4]; + float input_color2[4]; + float input_value[4]; + float tmp; + + input_value_operation_->read_sampled(input_value, x, y, sampler); + input_color1_operation_->read_sampled(input_color1, x, y, sampler); + input_color2_operation_->read_sampled(input_color2, x, y, sampler); + + float value = input_value[0]; + if (this->use_value_alpha_multiply()) { + value *= input_color2[3]; + } + + if (input_color1[0] != 0.0f) { + tmp = 1.0f - value * input_color2[0]; + if (tmp <= 0.0f) { + output[0] = 1.0f; + } + else { + tmp = input_color1[0] / tmp; + if (tmp > 1.0f) { + output[0] = 1.0f; + } + else { + output[0] = tmp; + } + } + } + else { + output[0] = 0.0f; + } + + if (input_color1[1] != 0.0f) { + tmp = 1.0f - value * input_color2[1]; + if (tmp <= 0.0f) { + output[1] = 1.0f; + } + else { + tmp = input_color1[1] / tmp; + if (tmp > 1.0f) { + output[1] = 1.0f; + } + else { + output[1] = tmp; + } + } + } + else { + output[1] = 0.0f; + } + + if (input_color1[2] != 0.0f) { + tmp = 1.0f - value * input_color2[2]; + if (tmp <= 0.0f) { + output[2] = 1.0f; + } + else { + tmp = input_color1[2] / tmp; + if (tmp > 1.0f) { + output[2] = 1.0f; + } + else { + output[2] = tmp; + } + } + } + else { + output[2] = 0.0f; + } + + output[3] = input_color1[3]; + + clamp_if_needed(output); +} + void MixDodgeOperation::update_memory_buffer_row(PixelCursor &p) { while (p.out < p.row_end) { @@ -363,6 +778,39 @@ void MixDodgeOperation::update_memory_buffer_row(PixelCursor &p) /* ******** Mix Glare Operation ******** */ +void MixGlareOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float input_color1[4]; + float input_color2[4]; + float input_value[4]; + float value, input_weight, glare_weight; + + input_value_operation_->read_sampled(input_value, x, y, sampler); + input_color1_operation_->read_sampled(input_color1, x, y, sampler); + input_color2_operation_->read_sampled(input_color2, x, y, sampler); + value = input_value[0]; + /* Linear interpolation between 3 cases: + * value=-1:output=input value=0:output=input+glare value=1:output=glare + */ + if (value < 0.0f) { + input_weight = 1.0f; + glare_weight = 1.0f + value; + } + else { + input_weight = 1.0f - value; + glare_weight = 1.0f; + } + output[0] = input_weight * std::max(input_color1[0], 0.0f) + glare_weight * input_color2[0]; + output[1] = input_weight * std::max(input_color1[1], 0.0f) + glare_weight * input_color2[1]; + output[2] = input_weight * std::max(input_color1[2], 0.0f) + glare_weight * input_color2[2]; + output[3] = input_color1[3]; + + clamp_if_needed(output); +} + void MixGlareOperation::update_memory_buffer_row(PixelCursor &p) { while (p.out < p.row_end) { @@ -392,6 +840,44 @@ void MixGlareOperation::update_memory_buffer_row(PixelCursor &p) /* ******** Mix Hue Operation ******** */ +void MixHueOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float input_color1[4]; + float input_color2[4]; + float input_value[4]; + + input_value_operation_->read_sampled(input_value, x, y, sampler); + input_color1_operation_->read_sampled(input_color1, x, y, sampler); + input_color2_operation_->read_sampled(input_color2, x, y, sampler); + + float value = input_value[0]; + if (this->use_value_alpha_multiply()) { + value *= input_color2[3]; + } + float valuem = 1.0f - value; + + float colH, colS, colV; + rgb_to_hsv(input_color2[0], input_color2[1], input_color2[2], &colH, &colS, &colV); + if (colS != 0.0f) { + float rH, rS, rV; + float tmpr, tmpg, tmpb; + rgb_to_hsv(input_color1[0], input_color1[1], input_color1[2], &rH, &rS, &rV); + hsv_to_rgb(colH, rS, rV, &tmpr, &tmpg, &tmpb); + output[0] = valuem * (input_color1[0]) + value * tmpr; + output[1] = valuem * (input_color1[1]) + value * tmpg; + output[2] = valuem * (input_color1[2]) + value * tmpb; + } + else { + copy_v3_v3(output, input_color1); + } + output[3] = input_color1[3]; + + clamp_if_needed(output); +} + void MixHueOperation::update_memory_buffer_row(PixelCursor &p) { while (p.out < p.row_end) { @@ -424,6 +910,32 @@ void MixHueOperation::update_memory_buffer_row(PixelCursor &p) /* ******** Mix Lighten Operation ******** */ +void MixLightenOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float input_color1[4]; + float input_color2[4]; + float input_value[4]; + + input_value_operation_->read_sampled(input_value, x, y, sampler); + input_color1_operation_->read_sampled(input_color1, x, y, sampler); + input_color2_operation_->read_sampled(input_color2, x, y, sampler); + + float value = input_value[0]; + if (this->use_value_alpha_multiply()) { + value *= input_color2[3]; + } + float valuem = 1.0f - value; + output[0] = max_ff(input_color1[0], input_color2[0]) * value + input_color1[0] * valuem; + output[1] = max_ff(input_color1[1], input_color2[1]) * value + input_color1[1] * valuem; + output[2] = max_ff(input_color1[2], input_color2[2]) * value + input_color1[2] * valuem; + output[3] = input_color1[3]; + + clamp_if_needed(output); +} + void MixLightenOperation::update_memory_buffer_row(PixelCursor &p) { while (p.out < p.row_end) { @@ -444,6 +956,47 @@ void MixLightenOperation::update_memory_buffer_row(PixelCursor &p) /* ******** Mix Linear Light Operation ******** */ +void MixLinearLightOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float input_color1[4]; + float input_color2[4]; + float input_value[4]; + + input_value_operation_->read_sampled(input_value, x, y, sampler); + input_color1_operation_->read_sampled(input_color1, x, y, sampler); + input_color2_operation_->read_sampled(input_color2, x, y, sampler); + + float value = input_value[0]; + if (this->use_value_alpha_multiply()) { + value *= input_color2[3]; + } + if (input_color2[0] > 0.5f) { + output[0] = input_color1[0] + value * (2.0f * (input_color2[0] - 0.5f)); + } + else { + output[0] = input_color1[0] + value * (2.0f * (input_color2[0]) - 1.0f); + } + if (input_color2[1] > 0.5f) { + output[1] = input_color1[1] + value * (2.0f * (input_color2[1] - 0.5f)); + } + else { + output[1] = input_color1[1] + value * (2.0f * (input_color2[1]) - 1.0f); + } + if (input_color2[2] > 0.5f) { + output[2] = input_color1[2] + value * (2.0f * (input_color2[2] - 0.5f)); + } + else { + output[2] = input_color1[2] + value * (2.0f * (input_color2[2]) - 1.0f); + } + + output[3] = input_color1[3]; + + clamp_if_needed(output); +} + void MixLinearLightOperation::update_memory_buffer_row(PixelCursor &p) { while (p.out < p.row_end) { @@ -479,6 +1032,32 @@ void MixLinearLightOperation::update_memory_buffer_row(PixelCursor &p) /* ******** Mix Multiply Operation ******** */ +void MixMultiplyOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float input_color1[4]; + float input_color2[4]; + float input_value[4]; + + input_value_operation_->read_sampled(input_value, x, y, sampler); + input_color1_operation_->read_sampled(input_color1, x, y, sampler); + input_color2_operation_->read_sampled(input_color2, x, y, sampler); + + float value = input_value[0]; + if (this->use_value_alpha_multiply()) { + value *= input_color2[3]; + } + float valuem = 1.0f - value; + output[0] = input_color1[0] * (valuem + value * input_color2[0]); + output[1] = input_color1[1] * (valuem + value * input_color2[1]); + output[2] = input_color1[2] * (valuem + value * input_color2[2]); + output[3] = input_color1[3]; + + clamp_if_needed(output); +} + void MixMultiplyOperation::update_memory_buffer_row(PixelCursor &p) { while (p.out < p.row_end) { @@ -500,6 +1079,52 @@ void MixMultiplyOperation::update_memory_buffer_row(PixelCursor &p) /* ******** Mix Overlay Operation ******** */ +void MixOverlayOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float input_color1[4]; + float input_color2[4]; + float input_value[4]; + + input_value_operation_->read_sampled(input_value, x, y, sampler); + input_color1_operation_->read_sampled(input_color1, x, y, sampler); + input_color2_operation_->read_sampled(input_color2, x, y, sampler); + + float value = input_value[0]; + if (this->use_value_alpha_multiply()) { + value *= input_color2[3]; + } + + float valuem = 1.0f - value; + + if (input_color1[0] < 0.5f) { + output[0] = input_color1[0] * (valuem + 2.0f * value * input_color2[0]); + } + else { + output[0] = 1.0f - + (valuem + 2.0f * value * (1.0f - input_color2[0])) * (1.0f - input_color1[0]); + } + if (input_color1[1] < 0.5f) { + output[1] = input_color1[1] * (valuem + 2.0f * value * input_color2[1]); + } + else { + output[1] = 1.0f - + (valuem + 2.0f * value * (1.0f - input_color2[1])) * (1.0f - input_color1[1]); + } + if (input_color1[2] < 0.5f) { + output[2] = input_color1[2] * (valuem + 2.0f * value * input_color2[2]); + } + else { + output[2] = 1.0f - + (valuem + 2.0f * value * (1.0f - input_color2[2])) * (1.0f - input_color1[2]); + } + output[3] = input_color1[3]; + + clamp_if_needed(output); +} + void MixOverlayOperation::update_memory_buffer_row(PixelCursor &p) { while (p.out < p.row_end) { @@ -536,6 +1161,41 @@ void MixOverlayOperation::update_memory_buffer_row(PixelCursor &p) /* ******** Mix Saturation Operation ******** */ +void MixSaturationOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float input_color1[4]; + float input_color2[4]; + float input_value[4]; + + input_value_operation_->read_sampled(input_value, x, y, sampler); + input_color1_operation_->read_sampled(input_color1, x, y, sampler); + input_color2_operation_->read_sampled(input_color2, x, y, sampler); + + float value = input_value[0]; + if (this->use_value_alpha_multiply()) { + value *= input_color2[3]; + } + float valuem = 1.0f - value; + + float rH, rS, rV; + rgb_to_hsv(input_color1[0], input_color1[1], input_color1[2], &rH, &rS, &rV); + if (rS != 0.0f) { + float colH, colS, colV; + rgb_to_hsv(input_color2[0], input_color2[1], input_color2[2], &colH, &colS, &colV); + hsv_to_rgb(rH, (valuem * rS + value * colS), rV, &output[0], &output[1], &output[2]); + } + else { + copy_v3_v3(output, input_color1); + } + + output[3] = input_color1[3]; + + clamp_if_needed(output); +} + void MixSaturationOperation::update_memory_buffer_row(PixelCursor &p) { while (p.out < p.row_end) { @@ -565,6 +1225,33 @@ void MixSaturationOperation::update_memory_buffer_row(PixelCursor &p) /* ******** Mix Screen Operation ******** */ +void MixScreenOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float input_color1[4]; + float input_color2[4]; + float input_value[4]; + + input_value_operation_->read_sampled(input_value, x, y, sampler); + input_color1_operation_->read_sampled(input_color1, x, y, sampler); + input_color2_operation_->read_sampled(input_color2, x, y, sampler); + + float value = input_value[0]; + if (this->use_value_alpha_multiply()) { + value *= input_color2[3]; + } + float valuem = 1.0f - value; + + output[0] = 1.0f - (valuem + value * (1.0f - input_color2[0])) * (1.0f - input_color1[0]); + output[1] = 1.0f - (valuem + value * (1.0f - input_color2[1])) * (1.0f - input_color1[1]); + output[2] = 1.0f - (valuem + value * (1.0f - input_color2[2])) * (1.0f - input_color1[2]); + output[3] = input_color1[3]; + + clamp_if_needed(output); +} + void MixScreenOperation::update_memory_buffer_row(PixelCursor &p) { while (p.out < p.row_end) { @@ -586,6 +1273,45 @@ void MixScreenOperation::update_memory_buffer_row(PixelCursor &p) /* ******** Mix Soft Light Operation ******** */ +void MixSoftLightOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float input_color1[4]; + float input_color2[4]; + float input_value[4]; + + input_value_operation_->read_sampled(input_value, x, y, sampler); + input_color1_operation_->read_sampled(input_color1, x, y, sampler); + input_color2_operation_->read_sampled(input_color2, x, y, sampler); + + float value = input_value[0]; + if (this->use_value_alpha_multiply()) { + value *= input_color2[3]; + } + float valuem = 1.0f - value; + float scr, scg, scb; + + /* first calculate non-fac based Screen mix */ + scr = 1.0f - (1.0f - input_color2[0]) * (1.0f - input_color1[0]); + scg = 1.0f - (1.0f - input_color2[1]) * (1.0f - input_color1[1]); + scb = 1.0f - (1.0f - input_color2[2]) * (1.0f - input_color1[2]); + + output[0] = valuem * (input_color1[0]) + + value * (((1.0f - input_color1[0]) * input_color2[0] * (input_color1[0])) + + (input_color1[0] * scr)); + output[1] = valuem * (input_color1[1]) + + value * (((1.0f - input_color1[1]) * input_color2[1] * (input_color1[1])) + + (input_color1[1] * scg)); + output[2] = valuem * (input_color1[2]) + + value * (((1.0f - input_color1[2]) * input_color2[2] * (input_color1[2])) + + (input_color1[2] * scb)); + output[3] = input_color1[3]; + + clamp_if_needed(output); +} + void MixSoftLightOperation::update_memory_buffer_row(PixelCursor &p) { while (p.out < p.row_end) { @@ -616,6 +1342,31 @@ void MixSoftLightOperation::update_memory_buffer_row(PixelCursor &p) /* ******** Mix Subtract Operation ******** */ +void MixSubtractOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float input_color1[4]; + float input_color2[4]; + float input_value[4]; + + input_value_operation_->read_sampled(input_value, x, y, sampler); + input_color1_operation_->read_sampled(input_color1, x, y, sampler); + input_color2_operation_->read_sampled(input_color2, x, y, sampler); + + float value = input_value[0]; + if (this->use_value_alpha_multiply()) { + value *= input_color2[3]; + } + output[0] = input_color1[0] - value * (input_color2[0]); + output[1] = input_color1[1] - value * (input_color2[1]); + output[2] = input_color1[2] - value * (input_color2[2]); + output[3] = input_color1[3]; + + clamp_if_needed(output); +} + void MixSubtractOperation::update_memory_buffer_row(PixelCursor &p) { while (p.out < p.row_end) { @@ -635,6 +1386,35 @@ void MixSubtractOperation::update_memory_buffer_row(PixelCursor &p) /* ******** Mix Value Operation ******** */ +void MixValueOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float input_color1[4]; + float input_color2[4]; + float input_value[4]; + + input_value_operation_->read_sampled(input_value, x, y, sampler); + input_color1_operation_->read_sampled(input_color1, x, y, sampler); + input_color2_operation_->read_sampled(input_color2, x, y, sampler); + + float value = input_value[0]; + if (this->use_value_alpha_multiply()) { + value *= input_color2[3]; + } + float valuem = 1.0f - value; + + float rH, rS, rV; + float colH, colS, colV; + rgb_to_hsv(input_color1[0], input_color1[1], input_color1[2], &rH, &rS, &rV); + rgb_to_hsv(input_color2[0], input_color2[1], input_color2[2], &colH, &colS, &colV); + hsv_to_rgb(rH, rS, (valuem * rV + value * colV), &output[0], &output[1], &output[2]); + output[3] = input_color1[3]; + + clamp_if_needed(output); +} + void MixValueOperation::update_memory_buffer_row(PixelCursor &p) { while (p.out < p.row_end) { diff --git a/source/blender/compositor/operations/COM_MixOperation.h b/source/blender/compositor/operations/COM_MixOperation.h index 7d6ebbb083e..9f422faf0a6 100644 --- a/source/blender/compositor/operations/COM_MixOperation.h +++ b/source/blender/compositor/operations/COM_MixOperation.h @@ -35,6 +35,12 @@ class MixBaseOperation : public MultiThreadedOperation { } }; + /** + * Prefetched reference to the input_program + */ + SocketReader *input_value_operation_; + SocketReader *input_color1_operation_; + SocketReader *input_color2_operation_; bool value_alpha_multiply_; bool use_clamp_; @@ -46,8 +52,26 @@ class MixBaseOperation : public MultiThreadedOperation { } public: + /** + * Default constructor + */ MixBaseOperation(); + /** + * The inner loop of this operation. + */ + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + + /** + * Initialize the execution + */ + void init_execution() override; + + /** + * Deinitialize the execution + */ + void deinit_execution() override; + void determine_canvas(const rcti &preferred_area, rcti &r_area) override; void set_use_value_alpha_multiply(const bool value) @@ -72,101 +96,161 @@ class MixBaseOperation : public MultiThreadedOperation { }; class MixAddOperation : public MixBaseOperation { + public: + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + protected: void update_memory_buffer_row(PixelCursor &p) override; }; class MixBlendOperation : public MixBaseOperation { + public: + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + protected: void update_memory_buffer_row(PixelCursor &p) override; }; class MixColorBurnOperation : public MixBaseOperation { + public: + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + protected: void update_memory_buffer_row(PixelCursor &p) override; }; class MixColorOperation : public MixBaseOperation { + public: + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + protected: void update_memory_buffer_row(PixelCursor &p) override; }; class MixDarkenOperation : public MixBaseOperation { + public: + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + protected: void update_memory_buffer_row(PixelCursor &p) override; }; class MixDifferenceOperation : public MixBaseOperation { + public: + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + protected: void update_memory_buffer_row(PixelCursor &p) override; }; class MixExclusionOperation : public MixBaseOperation { + public: + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + protected: void update_memory_buffer_row(PixelCursor &p) override; }; class MixDivideOperation : public MixBaseOperation { + public: + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + protected: void update_memory_buffer_row(PixelCursor &p) override; }; class MixDodgeOperation : public MixBaseOperation { + public: + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + protected: void update_memory_buffer_row(PixelCursor &p) override; }; class MixGlareOperation : public MixBaseOperation { + public: + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + protected: void update_memory_buffer_row(PixelCursor &p) override; }; class MixHueOperation : public MixBaseOperation { + public: + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + protected: void update_memory_buffer_row(PixelCursor &p) override; }; class MixLightenOperation : public MixBaseOperation { + public: + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + protected: void update_memory_buffer_row(PixelCursor &p) override; }; class MixLinearLightOperation : public MixBaseOperation { + public: + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + protected: void update_memory_buffer_row(PixelCursor &p) override; }; class MixMultiplyOperation : public MixBaseOperation { + public: + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + protected: void update_memory_buffer_row(PixelCursor &p) override; }; class MixOverlayOperation : public MixBaseOperation { + public: + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + protected: void update_memory_buffer_row(PixelCursor &p) override; }; class MixSaturationOperation : public MixBaseOperation { + public: + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + protected: void update_memory_buffer_row(PixelCursor &p) override; }; class MixScreenOperation : public MixBaseOperation { + public: + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + protected: void update_memory_buffer_row(PixelCursor &p) override; }; class MixSoftLightOperation : public MixBaseOperation { + public: + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + protected: void update_memory_buffer_row(PixelCursor &p) override; }; class MixSubtractOperation : public MixBaseOperation { + public: + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + protected: void update_memory_buffer_row(PixelCursor &p) override; }; class MixValueOperation : public MixBaseOperation { + public: + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + protected: void update_memory_buffer_row(PixelCursor &p) override; }; diff --git a/source/blender/compositor/operations/COM_MovieClipAttributeOperation.cc b/source/blender/compositor/operations/COM_MovieClipAttributeOperation.cc index 4e3b2009b44..7aad3c3ce31 100644 --- a/source/blender/compositor/operations/COM_MovieClipAttributeOperation.cc +++ b/source/blender/compositor/operations/COM_MovieClipAttributeOperation.cc @@ -75,6 +75,14 @@ void MovieClipAttributeOperation::calc_value() } } +void MovieClipAttributeOperation::execute_pixel_sampled(float output[4], + float /*x*/, + float /*y*/, + PixelSampler /*sampler*/) +{ + output[0] = value_; +} + void MovieClipAttributeOperation::determine_canvas(const rcti &preferred_area, rcti &r_area) { r_area = preferred_area; diff --git a/source/blender/compositor/operations/COM_MovieClipAttributeOperation.h b/source/blender/compositor/operations/COM_MovieClipAttributeOperation.h index 13a8b3f29e6..90969f6ff4b 100644 --- a/source/blender/compositor/operations/COM_MovieClipAttributeOperation.h +++ b/source/blender/compositor/operations/COM_MovieClipAttributeOperation.h @@ -38,6 +38,10 @@ class MovieClipAttributeOperation : public ConstantOperation { void init_execution() override; + /** + * The inner loop of this operation. + */ + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; void determine_canvas(const rcti &preferred_area, rcti &r_area) override; const float *get_constant_elem() override; diff --git a/source/blender/compositor/operations/COM_MovieClipOperation.cc b/source/blender/compositor/operations/COM_MovieClipOperation.cc index 2485c4aea7e..1ea9f78e491 100644 --- a/source/blender/compositor/operations/COM_MovieClipOperation.cc +++ b/source/blender/compositor/operations/COM_MovieClipOperation.cc @@ -65,6 +65,35 @@ void MovieClipBaseOperation::determine_canvas(const rcti & /*preferred_area*/, r } } +void MovieClipBaseOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + ImBuf *ibuf = movie_clip_buffer_; + + if (ibuf == nullptr) { + zero_v4(output); + } + else if (ibuf->byte_buffer.data == nullptr && ibuf->float_buffer.data == nullptr) { + /* Happens for multi-layer EXR, i.e. */ + zero_v4(output); + } + else { + switch (sampler) { + case PixelSampler::Nearest: + imbuf::interpolate_nearest_fl(ibuf, output, x, y); + break; + case PixelSampler::Bilinear: + imbuf::interpolate_bilinear_border_fl(ibuf, output, x, y); + break; + case PixelSampler::Bicubic: + imbuf::interpolate_cubic_bspline_fl(ibuf, output, x, y); + break; + } + } +} + void MovieClipBaseOperation::update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span /*inputs*/) @@ -87,6 +116,16 @@ MovieClipAlphaOperation::MovieClipAlphaOperation() : MovieClipBaseOperation() this->add_output_socket(DataType::Value); } +void MovieClipAlphaOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float result[4]; + MovieClipBaseOperation::execute_pixel_sampled(result, x, y, sampler); + output[0] = result[3]; +} + void MovieClipAlphaOperation::update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span /*inputs*/) diff --git a/source/blender/compositor/operations/COM_MovieClipOperation.h b/source/blender/compositor/operations/COM_MovieClipOperation.h index 1df02a380f0..007a4619c35 100644 --- a/source/blender/compositor/operations/COM_MovieClipOperation.h +++ b/source/blender/compositor/operations/COM_MovieClipOperation.h @@ -51,6 +51,7 @@ class MovieClipBaseOperation : public MultiThreadedOperation { { framenumber_ = framenumber; } + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; void update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, @@ -65,6 +66,7 @@ class MovieClipOperation : public MovieClipBaseOperation { class MovieClipAlphaOperation : public MovieClipBaseOperation { public: MovieClipAlphaOperation(); + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; void update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, diff --git a/source/blender/compositor/operations/COM_MovieDistortionOperation.cc b/source/blender/compositor/operations/COM_MovieDistortionOperation.cc index 7bfc85e45d2..77b00de0c36 100644 --- a/source/blender/compositor/operations/COM_MovieDistortionOperation.cc +++ b/source/blender/compositor/operations/COM_MovieDistortionOperation.cc @@ -15,6 +15,7 @@ MovieDistortionOperation::MovieDistortionOperation(bool distortion) this->add_input_socket(DataType::Color); this->add_output_socket(DataType::Color); this->set_canvas_input_index(0); + input_operation_ = nullptr; movie_clip_ = nullptr; apply_ = distortion; @@ -56,6 +57,7 @@ void MovieDistortionOperation::init_data() void MovieDistortionOperation::init_execution() { + input_operation_ = this->get_input_socket_reader(0); if (movie_clip_) { MovieTracking *tracking = &movie_clip_->tracking; distortion_ = BKE_tracking_distortion_new(tracking, calibration_width_, calibration_height_); @@ -67,12 +69,66 @@ void MovieDistortionOperation::init_execution() void MovieDistortionOperation::deinit_execution() { + input_operation_ = nullptr; movie_clip_ = nullptr; if (distortion_ != nullptr) { BKE_tracking_distortion_free(distortion_); } } +void MovieDistortionOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler /*sampler*/) +{ + const int width = this->get_width(); + const int height = this->get_height(); + if (distortion_ == nullptr || width == 0 || height == 0) { + /* When there is no precomputed distortion pass-through the coordinate as-is to the input + * samples. + * If the frame size is zero do the same and bypass any math. In theory it is probably more + * correct to zero the output but it is easier and safe to let the input to do so than to deal + * with possible different number of channels here. */ + input_operation_->read_sampled(output, x, y, PixelSampler::Bilinear); + return; + } + + // float overscan = 0.0f; + const float w = float(width) /* / (1 + overscan) */; + const float h = float(height) /* / (1 + overscan) */; + const float pixel_aspect = pixel_aspect_; + const float aspx = w / float(calibration_width_); + const float aspy = h / float(calibration_height_); + float in[2]; + float out[2]; + + in[0] = (x /* - 0.5 * overscan * w */) / aspx; + in[1] = (y /* - 0.5 * overscan * h */) / aspy / pixel_aspect; + + if (apply_) { + BKE_tracking_distortion_undistort_v2(distortion_, in, out); + } + else { + BKE_tracking_distortion_distort_v2(distortion_, in, out); + } + + float u = out[0] * aspx /* + 0.5 * overscan * w */, + v = (out[1] * aspy /* + 0.5 * overscan * h */) * pixel_aspect; + + input_operation_->read_sampled(output, u, v, PixelSampler::Bilinear); +} + +bool MovieDistortionOperation::determine_depending_area_of_interest( + rcti *input, ReadBufferOperation *read_operation, rcti *output) +{ + rcti new_input; + new_input.xmin = input->xmin - margin_[0]; + new_input.ymin = input->ymin - margin_[1]; + new_input.xmax = input->xmax + margin_[0]; + new_input.ymax = input->ymax + margin_[1]; + return NodeOperation::determine_depending_area_of_interest(&new_input, read_operation, output); +} + void MovieDistortionOperation::get_area_of_interest(const int input_idx, const rcti &output_area, rcti &r_input_area) diff --git a/source/blender/compositor/operations/COM_MovieDistortionOperation.h b/source/blender/compositor/operations/COM_MovieDistortionOperation.h index 2d1f9f94a6c..7f16ac77e05 100644 --- a/source/blender/compositor/operations/COM_MovieDistortionOperation.h +++ b/source/blender/compositor/operations/COM_MovieDistortionOperation.h @@ -14,6 +14,7 @@ namespace blender::compositor { class MovieDistortionOperation : public MultiThreadedOperation { private: + SocketReader *input_operation_; MovieClip *movie_clip_; int margin_[2]; @@ -27,6 +28,7 @@ class MovieDistortionOperation : public MultiThreadedOperation { public: MovieDistortionOperation(bool distortion); + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; void init_data() override; void init_execution() override; @@ -40,6 +42,9 @@ class MovieDistortionOperation : public MultiThreadedOperation { { framenumber_ = framenumber; } + bool determine_depending_area_of_interest(rcti *input, + ReadBufferOperation *read_operation, + rcti *output) override; void get_area_of_interest(int input_idx, const rcti &output_area, rcti &r_input_area) override; void update_memory_buffer_partial(MemoryBuffer *output, diff --git a/source/blender/compositor/operations/COM_MultilayerImageOperation.cc b/source/blender/compositor/operations/COM_MultilayerImageOperation.cc index 6f3aa56c55d..b7e3fed43ef 100644 --- a/source/blender/compositor/operations/COM_MultilayerImageOperation.cc +++ b/source/blender/compositor/operations/COM_MultilayerImageOperation.cc @@ -76,4 +76,82 @@ std::unique_ptr MultilayerColorOperation::get_meta_data() return std::move(callback_data.meta_data); } +void MultilayerColorOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + if (image_float_buffer_ == nullptr) { + zero_v4(output); + } + else { + if (number_of_channels_ == 4) { + switch (sampler) { + case PixelSampler::Nearest: + imbuf::interpolate_nearest_fl(buffer_, output, x, y); + break; + case PixelSampler::Bilinear: + imbuf::interpolate_bilinear_border_fl(buffer_, output, x, y); + break; + case PixelSampler::Bicubic: + imbuf::interpolate_cubic_bspline_fl(buffer_, output, x, y); + break; + } + } + else { + int yi = y; + int xi = x; + if (xi < 0 || yi < 0 || uint(xi) >= this->get_width() || uint(yi) >= this->get_height()) { + zero_v4(output); + } + else { + int offset = (yi * this->get_width() + xi) * 3; + copy_v3_v3(output, &image_float_buffer_[offset]); + } + } + } +} + +void MultilayerValueOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler /*sampler*/) +{ + if (image_float_buffer_ == nullptr) { + output[0] = 0.0f; + } + else { + int yi = y; + int xi = x; + if (xi < 0 || yi < 0 || uint(xi) >= this->get_width() || uint(yi) >= this->get_height()) { + output[0] = 0.0f; + } + else { + float result = image_float_buffer_[yi * this->get_width() + xi]; + output[0] = result; + } + } +} + +void MultilayerVectorOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler /*sampler*/) +{ + if (image_float_buffer_ == nullptr) { + output[0] = 0.0f; + } + else { + int yi = y; + int xi = x; + if (xi < 0 || yi < 0 || uint(xi) >= this->get_width() || uint(yi) >= this->get_height()) { + output[0] = 0.0f; + } + else { + int offset = (yi * this->get_width() + xi) * 3; + copy_v3_v3(output, &image_float_buffer_[offset]); + } + } +} + } // namespace blender::compositor diff --git a/source/blender/compositor/operations/COM_MultilayerImageOperation.h b/source/blender/compositor/operations/COM_MultilayerImageOperation.h index 76a04687d8f..d7679de0517 100644 --- a/source/blender/compositor/operations/COM_MultilayerImageOperation.h +++ b/source/blender/compositor/operations/COM_MultilayerImageOperation.h @@ -36,6 +36,7 @@ class MultilayerColorOperation : public MultilayerBaseOperation { { this->add_output_socket(DataType::Color); } + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; std::unique_ptr get_meta_data() override; }; @@ -46,6 +47,7 @@ class MultilayerValueOperation : public MultilayerBaseOperation { { this->add_output_socket(DataType::Value); } + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; }; class MultilayerVectorOperation : public MultilayerBaseOperation { @@ -55,6 +57,7 @@ class MultilayerVectorOperation : public MultilayerBaseOperation { { this->add_output_socket(DataType::Vector); } + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; }; } // namespace blender::compositor diff --git a/source/blender/compositor/operations/COM_NormalizeOperation.cc b/source/blender/compositor/operations/COM_NormalizeOperation.cc index 5cd8f3e9dc9..56d53af0692 100644 --- a/source/blender/compositor/operations/COM_NormalizeOperation.cc +++ b/source/blender/compositor/operations/COM_NormalizeOperation.cc @@ -10,20 +10,111 @@ NormalizeOperation::NormalizeOperation() { this->add_input_socket(DataType::Value); this->add_output_socket(DataType::Value); + image_reader_ = nullptr; cached_instance_ = nullptr; + flags_.complex = true; flags_.can_be_constant = true; } +void NormalizeOperation::init_execution() +{ + image_reader_ = this->get_input_socket_reader(0); + NodeOperation::init_mutex(); +} + +void NormalizeOperation::execute_pixel(float output[4], int x, int y, void *data) +{ + /* using generic two floats struct to store `x: min`, `y: multiply` */ + NodeTwoFloats *minmult = (NodeTwoFloats *)data; + + image_reader_->read(output, x, y, nullptr); + + output[0] = (output[0] - minmult->x) * minmult->y; + + /* clamp infinities */ + if (output[0] > 1.0f) { + output[0] = 1.0f; + } + else if (output[0] < 0.0f) { + output[0] = 0.0f; + } +} void NormalizeOperation::deinit_execution() { + image_reader_ = nullptr; delete cached_instance_; cached_instance_ = nullptr; + NodeOperation::deinit_mutex(); +} + +bool NormalizeOperation::determine_depending_area_of_interest(rcti * /*input*/, + ReadBufferOperation *read_operation, + rcti *output) +{ + rcti image_input; + if (cached_instance_) { + return false; + } + + NodeOperation *operation = get_input_operation(0); + image_input.xmax = operation->get_width(); + image_input.xmin = 0; + image_input.ymax = operation->get_height(); + image_input.ymin = 0; + + if (operation->determine_depending_area_of_interest(&image_input, read_operation, output)) { + return true; + } + return false; } /* The code below assumes all data is inside range +- this, and that input buffer is single channel */ #define BLENDER_ZMAX 10000.0f +void *NormalizeOperation::initialize_tile_data(rcti *rect) +{ + lock_mutex(); + if (cached_instance_ == nullptr) { + MemoryBuffer *tile = (MemoryBuffer *)image_reader_->initialize_tile_data(rect); + /* using generic two floats struct to store `x: min`, `y: multiply`. */ + NodeTwoFloats *minmult = new NodeTwoFloats(); + + float *buffer = tile->get_buffer(); + int p = tile->get_width() * tile->get_height(); + float *bc = buffer; + + float minv = 1.0f + BLENDER_ZMAX; + float maxv = -1.0f - BLENDER_ZMAX; + + float value; + while (p--) { + value = bc[0]; + if ((value > maxv) && (value <= BLENDER_ZMAX)) { + maxv = value; + } + if ((value < minv) && (value >= -BLENDER_ZMAX)) { + minv = value; + } + bc++; + } + + minmult->x = minv; + /* The rare case of flat buffer would cause a divide by 0 */ + minmult->y = ((maxv != minv) ? 1.0f / (maxv - minv) : 0.0f); + + cached_instance_ = minmult; + } + + unlock_mutex(); + return cached_instance_; +} + +void NormalizeOperation::deinitialize_tile_data(rcti * /*rect*/, void * /*data*/) +{ + /* pass */ +} + void NormalizeOperation::get_area_of_interest(const int /*input_idx*/, const rcti & /*output_area*/, rcti &r_input_area) diff --git a/source/blender/compositor/operations/COM_NormalizeOperation.h b/source/blender/compositor/operations/COM_NormalizeOperation.h index 50ec78fdd8a..4d868204851 100644 --- a/source/blender/compositor/operations/COM_NormalizeOperation.h +++ b/source/blender/compositor/operations/COM_NormalizeOperation.h @@ -15,6 +15,11 @@ namespace blender::compositor { */ class NormalizeOperation : public MultiThreadedOperation { protected: + /** + * \brief Cached reference to the reader + */ + SocketReader *image_reader_; + /** * \brief temporarily cache of the execution storage * it stores `x->min` and `y->multiply`. @@ -24,8 +29,28 @@ class NormalizeOperation : public MultiThreadedOperation { public: NormalizeOperation(); + /** + * The inner loop of this operation. + */ + void execute_pixel(float output[4], int x, int y, void *data) override; + + /** + * Initialize the execution + */ + void init_execution() override; + + void *initialize_tile_data(rcti *rect) override; + void deinitialize_tile_data(rcti *rect, void *data) override; + + /** + * Deinitialize the execution + */ void deinit_execution() override; + bool determine_depending_area_of_interest(rcti *input, + ReadBufferOperation *read_operation, + rcti *output) override; + void get_area_of_interest(int input_idx, const rcti &output_area, rcti &r_input_area) override; void update_memory_buffer_started(MemoryBuffer *output, const rcti &area, diff --git a/source/blender/compositor/operations/COM_OpenCLKernels.cl b/source/blender/compositor/operations/COM_OpenCLKernels.cl new file mode 100644 index 00000000000..589eb51d5f5 --- /dev/null +++ b/source/blender/compositor/operations/COM_OpenCLKernels.cl @@ -0,0 +1,297 @@ +/* SPDX-FileCopyrightText: 2011 Blender Authors + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +/* This file contains all opencl kernels for node-operation implementations. */ + +/* Global SAMPLERS. */ +const sampler_t SAMPLER_NEAREST = CLK_NORMALIZED_COORDS_FALSE | CLK_ADDRESS_CLAMP_TO_EDGE | CLK_FILTER_NEAREST; +const sampler_t SAMPLER_NEAREST_CLAMP = CLK_NORMALIZED_COORDS_FALSE | CLK_ADDRESS_CLAMP | CLK_FILTER_NEAREST; + +__constant const int2 zero = {0,0}; + +// KERNEL --- BOKEH BLUR --- +__kernel void bokeh_blur_kernel(__read_only image2d_t bounding_box, __read_only image2d_t input_image, + __read_only image2d_t bokeh_image, __write_only image2d_t output, + int2 offset_input, int2 offset_output, int radius, int step, int2 dimension, int2 offset) +{ + int2 coords = {get_global_id(0), get_global_id(1)}; + coords += offset; + float temp_bounding_box; + float4 color = {0.0f,0.0f,0.0f,0.0f}; + float4 multiplyer = {0.0f,0.0f,0.0f,0.0f}; + float4 bokeh; + const float radius2 = radius*2.0f; + const int2 real_coordinate = coords + offset_output; + int2 image_coordinates = real_coordinate - offset_input; + + temp_bounding_box = read_imagef(bounding_box, SAMPLER_NEAREST, coords).s0; + + if (temp_bounding_box > 0.0f && radius > 0 ) { + const int2 bokeh_image_dim = get_image_dim(bokeh_image); + const int2 bokeh_image_center = bokeh_image_dim/2; + const int2 minXY = max(real_coordinate - radius, zero); + const int2 maxXY = min(real_coordinate + radius, dimension); + int nx, ny; + + float2 uv; + int2 input_xy; + + if (radius < 2) { + color = read_imagef(input_image, SAMPLER_NEAREST, image_coordinates); + multiplyer = (float4)(1.0f, 1.0f, 1.0f, 1.0f); + } + + for (ny = minXY.y, input_xy.y = ny - offset_input.y ; ny < maxXY.y ; ny += step, input_xy.y += step) { + uv.y = ((real_coordinate.y-ny)/radius2)*bokeh_image_dim.y+bokeh_image_center.y; + + for (nx = minXY.x, input_xy.x = nx - offset_input.x; nx < maxXY.x ; nx += step, input_xy.x += step) { + uv.x = ((real_coordinate.x-nx)/radius2)*bokeh_image_dim.x+bokeh_image_center.x; + bokeh = read_imagef(bokeh_image, SAMPLER_NEAREST, uv); + color += bokeh * read_imagef(input_image, SAMPLER_NEAREST, input_xy); + multiplyer += bokeh; + } + } + color /= multiplyer; + } + else { + color = read_imagef(input_image, SAMPLER_NEAREST, image_coordinates); + } + + write_imagef(output, coords, color); +} + +//KERNEL --- DEFOCUS /VARIABLESIZEBOKEHBLUR --- +__kernel void defocus_kernel(__read_only image2d_t input_image, __read_only image2d_t bokeh_image, + __read_only image2d_t input_size, + __write_only image2d_t output, int2 offset_input, int2 offset_output, + int step, int max_blur_scalar, float threshold, float scalar, int2 dimension, int2 offset) +{ + float4 color = {1.0f, 0.0f, 0.0f, 1.0f}; + int2 coords = {get_global_id(0), get_global_id(1)}; + coords += offset; + const int2 real_coordinate = coords + offset_output; + + float4 read_color; + float4 temp_color; + float4 bokeh; + float size; + float4 multiplier_accum = {1.0f, 1.0f, 1.0f, 1.0f}; + float4 color_accum; + + int minx = max(real_coordinate.s0 - max_blur_scalar, 0); + int miny = max(real_coordinate.s1 - max_blur_scalar, 0); + int maxx = min(real_coordinate.s0 + max_blur_scalar, dimension.s0); + int maxy = min(real_coordinate.s1 + max_blur_scalar, dimension.s1); + + { + int2 input_coordinate = real_coordinate - offset_input; + float size_center = read_imagef(input_size, SAMPLER_NEAREST, input_coordinate).s0 * scalar; + color_accum = read_imagef(input_image, SAMPLER_NEAREST, input_coordinate); + read_color = color_accum; + + if (size_center > threshold) { + for (int ny = miny; ny < maxy; ny += step) { + input_coordinate.s1 = ny - offset_input.s1; + float dy = ny - real_coordinate.s1; + for (int nx = minx; nx < maxx; nx += step) { + float dx = nx - real_coordinate.s0; + if (dx != 0 || dy != 0) { + input_coordinate.s0 = nx - offset_input.s0; + size = min(read_imagef(input_size, SAMPLER_NEAREST, input_coordinate).s0 * scalar, size_center); + if (size > threshold) { + if (size >= fabs(dx) && size >= fabs(dy)) { + float2 uv = {256.0f + dx * 255.0f / size, + 256.0f + dy * 255.0f / size}; + bokeh = read_imagef(bokeh_image, SAMPLER_NEAREST, uv); + temp_color = read_imagef(input_image, SAMPLER_NEAREST, input_coordinate); + color_accum += bokeh * temp_color; + multiplier_accum += bokeh; + } + } + } + } + } + } + + color = color_accum * (1.0f / multiplier_accum); + + /* blend in out values over the threshold, otherwise we get sharp, ugly transitions */ + if ((size_center > threshold) && + (size_center < threshold * 2.0f)) + { + /* factor from 0-1 */ + float fac = (size_center - threshold) / threshold; + color = (read_color * (1.0f - fac)) + (color * fac); + } + + write_imagef(output, coords, color); + } +} + + +// KERNEL --- DILATE --- +__kernel void dilate_kernel(__read_only image2d_t input_image, __write_only image2d_t output, + int2 offset_input, int2 offset_output, int scope, int distance_squared, int2 dimension, + int2 offset) +{ + int2 coords = {get_global_id(0), get_global_id(1)}; + coords += offset; + const int2 real_coordinate = coords + offset_output; + + const int2 minXY = max(real_coordinate - scope, zero); + const int2 maxXY = min(real_coordinate + scope, dimension); + + float value = 0.0f; + int nx, ny; + int2 input_xy; + + for (ny = minXY.y, input_xy.y = ny - offset_input.y ; ny < maxXY.y ; ny ++, input_xy.y++) { + const float deltaY = (real_coordinate.y - ny); + for (nx = minXY.x, input_xy.x = nx - offset_input.x; nx < maxXY.x ; nx ++, input_xy.x++) { + const float deltaX = (real_coordinate.x - nx); + const float measured_distance = deltaX * deltaX + deltaY * deltaY; + if (measured_distance <= distance_squared) { + value = max(value, read_imagef(input_image, SAMPLER_NEAREST, input_xy).s0); + } + } + } + + float4 color = {value,0.0f,0.0f,0.0f}; + write_imagef(output, coords, color); +} + +// KERNEL --- DILATE --- +__kernel void erode_kernel(__read_only image2d_t input_image, __write_only image2d_t output, + int2 offset_input, int2 offset_output, int scope, int distance_squared, int2 dimension, + int2 offset) +{ + int2 coords = {get_global_id(0), get_global_id(1)}; + coords += offset; + const int2 real_coordinate = coords + offset_output; + + const int2 minXY = max(real_coordinate - scope, zero); + const int2 maxXY = min(real_coordinate + scope, dimension); + + float value = 1.0f; + int nx, ny; + int2 input_xy; + + for (ny = minXY.y, input_xy.y = ny - offset_input.y ; ny < maxXY.y ; ny ++, input_xy.y++) { + for (nx = minXY.x, input_xy.x = nx - offset_input.x; nx < maxXY.x ; nx ++, input_xy.x++) { + const float deltaX = (real_coordinate.x - nx); + const float deltaY = (real_coordinate.y - ny); + const float measured_distance = deltaX * deltaX+deltaY * deltaY; + if (measured_distance <= distance_squared) { + value = min(value, read_imagef(input_image, SAMPLER_NEAREST, input_xy).s0); + } + } + } + + float4 color = {value,0.0f,0.0f,0.0f}; + write_imagef(output, coords, color); +} + +// KERNEL --- DIRECTIONAL BLUR --- +__kernel void directional_blur_kernel(__read_only image2d_t input_image, __write_only image2d_t output, + int2 offset_output, int iterations, float scale, float rotation, float2 translate, + float2 center, int2 offset) +{ + int2 coords = {get_global_id(0), get_global_id(1)}; + coords += offset; + const int2 real_coordinate = coords + offset_output; + + float4 col; + float2 ltxy = translate; + float lsc = scale; + float lrot = rotation; + + col = read_imagef(input_image, SAMPLER_NEAREST, real_coordinate); + + /* blur the image */ + for (int i = 0; i < iterations; ++i) { + const float cs = cos(lrot), ss = sin(lrot); + const float isc = 1.0f / (1.0f + lsc); + + const float v = isc * (real_coordinate.s1 - center.s1) + ltxy.s1; + const float u = isc * (real_coordinate.s0 - center.s0) + ltxy.s0; + float2 uv = { + cs * u + ss * v + center.s0, + cs * v - ss * u + center.s1 + }; + + col += read_imagef(input_image, SAMPLER_NEAREST_CLAMP, uv); + + /* double transformations */ + ltxy += translate; + lrot += rotation; + lsc += scale; + } + + col *= (1.0f/(iterations+1)); + + write_imagef(output, coords, col); +} + +// KERNEL --- GAUSSIAN BLUR --- +__kernel void gaussian_xblur_operation_kernel(__read_only image2d_t input_image, + int2 offset_input, + __write_only image2d_t output, + int2 offset_output, + int filter_size, + int2 dimension, + __global float *gausstab, + int2 offset) +{ + float4 color = {0.0f, 0.0f, 0.0f, 0.0f}; + int2 coords = {get_global_id(0), get_global_id(1)}; + coords += offset; + const int2 real_coordinate = coords + offset_output; + int2 input_coordinate = real_coordinate - offset_input; + float weight = 0.0f; + + int xmin = max(real_coordinate.x - filter_size, 0) - offset_input.x; + int xmax = min(real_coordinate.x + filter_size + 1, dimension.x) - offset_input.x; + + for (int nx = xmin, i = max(filter_size - real_coordinate.x, 0); nx < xmax; ++nx, ++i) { + float w = gausstab[i]; + input_coordinate.x = nx; + color += read_imagef(input_image, SAMPLER_NEAREST, input_coordinate) * w; + weight += w; + } + + color *= (1.0f / weight); + + write_imagef(output, coords, color); +} + +__kernel void gaussian_yblur_operation_kernel(__read_only image2d_t input_image, + int2 offset_input, + __write_only image2d_t output, + int2 offset_output, + int filter_size, + int2 dimension, + __global float *gausstab, + int2 offset) +{ + float4 color = {0.0f, 0.0f, 0.0f, 0.0f}; + int2 coords = {get_global_id(0), get_global_id(1)}; + coords += offset; + const int2 real_coordinate = coords + offset_output; + int2 input_coordinate = real_coordinate - offset_input; + float weight = 0.0f; + + int ymin = max(real_coordinate.y - filter_size, 0) - offset_input.y; + int ymax = min(real_coordinate.y + filter_size + 1, dimension.y) - offset_input.y; + + for (int ny = ymin, i = max(filter_size - real_coordinate.y, 0); ny < ymax; ++ny, ++i) { + float w = gausstab[i]; + input_coordinate.y = ny; + color += read_imagef(input_image, SAMPLER_NEAREST, input_coordinate) * w; + weight += w; + } + + color *= (1.0f / weight); + + write_imagef(output, coords, color); +} diff --git a/source/blender/compositor/operations/COM_PixelateOperation.cc b/source/blender/compositor/operations/COM_PixelateOperation.cc index 9e07173a170..9a540eee36a 100644 --- a/source/blender/compositor/operations/COM_PixelateOperation.cc +++ b/source/blender/compositor/operations/COM_PixelateOperation.cc @@ -13,12 +13,67 @@ PixelateOperation::PixelateOperation() this->add_input_socket(DataType::Color); this->add_output_socket(DataType::Color); this->set_canvas_input_index(0); + input_operation_ = nullptr; flags_.can_be_constant = true; pixel_size_ = 1; } +void PixelateOperation::init_execution() +{ + input_operation_ = this->get_input_socket_reader(0); +} + +void PixelateOperation::deinit_execution() +{ + input_operation_ = nullptr; +} + +bool PixelateOperation::determine_depending_area_of_interest(rcti *input, + ReadBufferOperation *read_operation, + rcti *output) +{ + rcti new_input; + + new_input.xmin = input->xmin; + new_input.xmax = input->xmax + pixel_size_ - 1; + new_input.ymax = input->ymax; + new_input.ymax = input->ymax + pixel_size_ - 1; + + return NodeOperation::determine_depending_area_of_interest(&new_input, read_operation, output); +} + +void PixelateOperation::execute_pixel_sampled(float output[4], + const float x, + const float y, + const PixelSampler sampler) +{ + const int width = this->get_width(); + const int height = this->get_height(); + + const int x_start = (int(x) / pixel_size_) * pixel_size_; + const int y_start = (int(y) / pixel_size_) * pixel_size_; + + const int x_end = std::min(x_start + pixel_size_, width); + const int y_end = std::min(y_start + pixel_size_, height); + + float4 color_accum(0, 0, 0, 0); + + for (int iy = y_start; iy < y_end; ++iy) { + for (int ix = x_start; ix < x_end; ++ix) { + float4 color; + input_operation_->read_sampled(color, ix, iy, sampler); + + color_accum += color; + } + } + + const int scale = (x_end - x_start) * (y_end - y_start); + + copy_v4_v4(output, color_accum / float(scale)); +} + void PixelateOperation::get_area_of_interest(const int /*input_idx*/, const rcti &output_area, rcti &r_input_area) diff --git a/source/blender/compositor/operations/COM_PixelateOperation.h b/source/blender/compositor/operations/COM_PixelateOperation.h index e4479354562..eb2a368b1f2 100644 --- a/source/blender/compositor/operations/COM_PixelateOperation.h +++ b/source/blender/compositor/operations/COM_PixelateOperation.h @@ -8,8 +8,20 @@ namespace blender::compositor { +/** + * \brief Pixelate operation + * + * The Tile compositor is by default sub-pixel accurate. + * For some setups you don want this. + * This operation will remove the sub-pixel accuracy + */ class PixelateOperation : public MultiThreadedOperation { private: + /** + * \brief cached reference to the input operation + */ + SocketReader *input_operation_; + int pixel_size_; public: @@ -24,6 +36,29 @@ class PixelateOperation : public MultiThreadedOperation { pixel_size_ = pixel_size; } + /** + * \brief initialization of the execution + */ + void init_execution() override; + + /** + * \brief de-initialization of the execution + */ + void deinit_execution() override; + + bool determine_depending_area_of_interest(rcti *input, + ReadBufferOperation *read_operation, + rcti *output) override; + + /** + * \brief execute_pixel + * \param output: result + * \param x: x-coordinate + * \param y: y-coordinate + * \param sampler: sampler + */ + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + void get_area_of_interest(int input_idx, const rcti &output_area, rcti &r_input_area) override; void update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, diff --git a/source/blender/compositor/operations/COM_PlaneCornerPinOperation.cc b/source/blender/compositor/operations/COM_PlaneCornerPinOperation.cc index ecd70de6566..9eda293ec53 100644 --- a/source/blender/compositor/operations/COM_PlaneCornerPinOperation.cc +++ b/source/blender/compositor/operations/COM_PlaneCornerPinOperation.cc @@ -42,6 +42,36 @@ static bool check_corners(float corners[4][2]) return true; } +/* TODO(manzanilla): to be removed with tiled implementation. */ +static void read_corners_from_sockets(rcti *rect, SocketReader *readers[4], float corners[4][2]) +{ + for (int i = 0; i < 4; i++) { + float result[4] = {0.0f, 0.0f, 0.0f, 0.0f}; + readers[i]->read_sampled(result, rect->xmin, rect->ymin, PixelSampler::Nearest); + corners[i][0] = result[0]; + corners[i][1] = result[1]; + } + + /* convexity check: + * concave corners need to be prevented, otherwise + * BKE_tracking_homography_between_two_quads will freeze + */ + if (!check_corners(corners)) { + /* simply revert to default corners + * there could be a more elegant solution, + * this prevents freezing at least. + */ + corners[0][0] = 0.0f; + corners[0][1] = 0.0f; + corners[1][0] = 1.0f; + corners[1][1] = 0.0f; + corners[2][0] = 1.0f; + corners[2][1] = 1.0f; + corners[3][0] = 0.0f; + corners[3][1] = 1.0f; + } +} + static void set_default_corner(const int corner_idx, float r_corner[2]) { BLI_assert(corner_idx >= 0 && corner_idx < 4); @@ -91,25 +121,78 @@ static void read_input_corners(NodeOperation *op, const int first_input_idx, flo /* ******** PlaneCornerPinMaskOperation ******** */ -PlaneCornerPinMaskOperation::PlaneCornerPinMaskOperation() +PlaneCornerPinMaskOperation::PlaneCornerPinMaskOperation() : corners_ready_(false) { add_input_socket(DataType::Vector); add_input_socket(DataType::Vector); add_input_socket(DataType::Vector); add_input_socket(DataType::Vector); + + /* XXX this is stupid: we need to make this "complex", + * so we can use the initialize_tile_data function + * to read corners from input sockets ... + */ + flags_.complex = true; } void PlaneCornerPinMaskOperation::init_data() { - float corners[4][2]; - read_input_corners(this, 0, corners); - calculate_corners(corners, true, 0); + if (execution_model_ == eExecutionModel::FullFrame) { + float corners[4][2]; + read_input_corners(this, 0, corners); + calculate_corners(corners, true, 0); + } +} + +/* TODO(manzanilla): to be removed with tiled implementation. Same for #deinit_execution and do the + * same on #PlaneCornerPinWarpImageOperation. */ +void PlaneCornerPinMaskOperation::init_execution() +{ + PlaneDistortMaskOperation::init_execution(); + + init_mutex(); +} + +void PlaneCornerPinMaskOperation::deinit_execution() +{ + PlaneDistortMaskOperation::deinit_execution(); + + deinit_mutex(); +} + +void *PlaneCornerPinMaskOperation::initialize_tile_data(rcti *rect) +{ + void *data = PlaneDistortMaskOperation::initialize_tile_data(rect); + + /* get corner values once, by reading inputs at (0,0) + * XXX this assumes invariable values (no image inputs), + * we don't have a nice generic system for that yet + */ + lock_mutex(); + if (!corners_ready_) { + SocketReader *readers[4] = { + get_input_socket_reader(0), + get_input_socket_reader(1), + get_input_socket_reader(2), + get_input_socket_reader(3), + }; + float corners[4][2]; + read_corners_from_sockets(rect, readers, corners); + calculate_corners(corners, true, 0); + + corners_ready_ = true; + } + unlock_mutex(); + + return data; } void PlaneCornerPinMaskOperation::determine_canvas(const rcti &preferred_area, rcti &r_area) { - /* Determine input canvases. */ - PlaneDistortMaskOperation::determine_canvas(preferred_area, r_area); + if (execution_model_ == eExecutionModel::FullFrame) { + /* Determine input canvases. */ + PlaneDistortMaskOperation::determine_canvas(preferred_area, r_area); + } r_area = preferred_area; } @@ -123,7 +206,7 @@ void PlaneCornerPinMaskOperation::get_area_of_interest(const int /*input_idx*/, /* ******** PlaneCornerPinWarpImageOperation ******** */ -PlaneCornerPinWarpImageOperation::PlaneCornerPinWarpImageOperation() +PlaneCornerPinWarpImageOperation::PlaneCornerPinWarpImageOperation() : corners_ready_(false) { add_input_socket(DataType::Vector); add_input_socket(DataType::Vector); @@ -133,9 +216,79 @@ PlaneCornerPinWarpImageOperation::PlaneCornerPinWarpImageOperation() void PlaneCornerPinWarpImageOperation::init_data() { - float corners[4][2]; - read_input_corners(this, 1, corners); - calculate_corners(corners, true, 0); + if (execution_model_ == eExecutionModel::FullFrame) { + float corners[4][2]; + read_input_corners(this, 1, corners); + calculate_corners(corners, true, 0); + } +} + +void PlaneCornerPinWarpImageOperation::init_execution() +{ + PlaneDistortWarpImageOperation::init_execution(); + + init_mutex(); +} + +void PlaneCornerPinWarpImageOperation::deinit_execution() +{ + PlaneDistortWarpImageOperation::deinit_execution(); + + deinit_mutex(); +} + +void *PlaneCornerPinWarpImageOperation::initialize_tile_data(rcti *rect) +{ + void *data = PlaneDistortWarpImageOperation::initialize_tile_data(rect); + + /* get corner values once, by reading inputs at (0,0) + * XXX this assumes invariable values (no image inputs), + * we don't have a nice generic system for that yet + */ + lock_mutex(); + if (!corners_ready_) { + /* corner sockets start at index 1 */ + SocketReader *readers[4] = { + get_input_socket_reader(1), + get_input_socket_reader(2), + get_input_socket_reader(3), + get_input_socket_reader(4), + }; + float corners[4][2]; + read_corners_from_sockets(rect, readers, corners); + calculate_corners(corners, true, 0); + + corners_ready_ = true; + } + unlock_mutex(); + + return data; +} + +bool PlaneCornerPinWarpImageOperation::determine_depending_area_of_interest( + rcti *input, ReadBufferOperation *read_operation, rcti *output) +{ + for (int i = 0; i < 4; i++) { + if (get_input_operation(i + 1)->determine_depending_area_of_interest( + input, read_operation, output)) + { + return true; + } + } + + /* XXX this is bad, but unavoidable with the current design: + * we don't know the actual corners and matrix at this point, + * so all we can do is get the full input image + */ + output->xmin = 0; + output->ymin = 0; + output->xmax = get_input_operation(0)->get_width(); + output->ymax = get_input_operation(0)->get_height(); + return true; +#if 0 + return PlaneDistortWarpImageOperation::determine_depending_area_of_interest( + input, read_operation, output); +#endif } void PlaneCornerPinWarpImageOperation::get_area_of_interest(const int input_idx, diff --git a/source/blender/compositor/operations/COM_PlaneCornerPinOperation.h b/source/blender/compositor/operations/COM_PlaneCornerPinOperation.h index fdc8fd8a300..17b0fccada8 100644 --- a/source/blender/compositor/operations/COM_PlaneCornerPinOperation.h +++ b/source/blender/compositor/operations/COM_PlaneCornerPinOperation.h @@ -4,15 +4,31 @@ #pragma once +#include + #include "COM_PlaneDistortCommonOperation.h" +#include "DNA_movieclip_types.h" +#include "DNA_tracking_types.h" + +#include "BLI_listbase.h" +#include "BLI_string.h" + namespace blender::compositor { class PlaneCornerPinMaskOperation : public PlaneDistortMaskOperation { + private: + /* TODO(manzanilla): to be removed with tiled implementation. */ + bool corners_ready_; + public: PlaneCornerPinMaskOperation(); void init_data() override; + void init_execution() override; + void deinit_execution() override; + + void *initialize_tile_data(rcti *rect) override; void determine_canvas(const rcti &preferred_area, rcti &r_area) override; @@ -20,10 +36,21 @@ class PlaneCornerPinMaskOperation : public PlaneDistortMaskOperation { }; class PlaneCornerPinWarpImageOperation : public PlaneDistortWarpImageOperation { + private: + bool corners_ready_; + public: PlaneCornerPinWarpImageOperation(); void init_data() override; + void init_execution() override; + void deinit_execution() override; + + void *initialize_tile_data(rcti *rect) override; + + bool determine_depending_area_of_interest(rcti *input, + ReadBufferOperation *read_operation, + rcti *output) override; void get_area_of_interest(int input_idx, const rcti &output_area, rcti &r_input_area) override; }; diff --git a/source/blender/compositor/operations/COM_PlaneDistortCommonOperation.cc b/source/blender/compositor/operations/COM_PlaneDistortCommonOperation.cc index e62eda1809a..d52bf7fb373 100644 --- a/source/blender/compositor/operations/COM_PlaneDistortCommonOperation.cc +++ b/source/blender/compositor/operations/COM_PlaneDistortCommonOperation.cc @@ -61,6 +61,8 @@ PlaneDistortWarpImageOperation::PlaneDistortWarpImageOperation() : PlaneDistortB { this->add_input_socket(DataType::Color, ResizeMode::Align); this->add_output_socket(DataType::Color); + pixel_reader_ = nullptr; + flags_.complex = true; } void PlaneDistortWarpImageOperation::calculate_corners(const float corners[4][2], @@ -88,6 +90,39 @@ void PlaneDistortWarpImageOperation::calculate_corners(const float corners[4][2] sample_data->frame_space_corners, frame_corners, sample_data->perspective_matrix); } +void PlaneDistortWarpImageOperation::init_execution() +{ + pixel_reader_ = this->get_input_socket_reader(0); +} + +void PlaneDistortWarpImageOperation::deinit_execution() +{ + pixel_reader_ = nullptr; +} + +void PlaneDistortWarpImageOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler /*sampler*/) +{ + float uv[2]; + float deriv[2][2]; + if (motion_blur_samples_ == 1) { + warp_coord(x, y, samples_[0].perspective_matrix, uv, deriv); + pixel_reader_->read_filtered(output, uv[0], uv[1], deriv[0], deriv[1]); + } + else { + zero_v4(output); + for (int sample = 0; sample < motion_blur_samples_; sample++) { + float color[4]; + warp_coord(x, y, samples_[sample].perspective_matrix, uv, deriv); + pixel_reader_->read_filtered(color, uv[0], uv[1], deriv[0], deriv[1]); + add_v4_v4(output, color); + } + mul_v4_fl(output, 1.0f / float(motion_blur_samples_)); + } +} + void PlaneDistortWarpImageOperation::update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span inputs) @@ -99,7 +134,7 @@ void PlaneDistortWarpImageOperation::update_memory_buffer_partial(MemoryBuffer * if (motion_blur_samples_ == 1) { for (; !it.is_end(); ++it) { warp_coord(it.x, it.y, samples_[0].perspective_matrix, uv, deriv); - input_img->read_elem_filtered(uv[0], uv[1], deriv[0], deriv[1], true, it.out); + input_img->read_elem_filtered(uv[0], uv[1], deriv[0], deriv[1], it.out); } } else { @@ -108,7 +143,7 @@ void PlaneDistortWarpImageOperation::update_memory_buffer_partial(MemoryBuffer * for (const int sample : IndexRange(motion_blur_samples_)) { float color[4]; warp_coord(it.x, it.y, samples_[sample].perspective_matrix, uv, deriv); - input_img->read_elem_filtered(uv[0], uv[1], deriv[0], deriv[1], true, color); + input_img->read_elem_filtered(uv[0], uv[1], deriv[0], deriv[1], color); add_v4_v4(it.out, color); } mul_v4_fl(it.out, 1.0f / float(motion_blur_samples_)); @@ -116,6 +151,36 @@ void PlaneDistortWarpImageOperation::update_memory_buffer_partial(MemoryBuffer * } } +bool PlaneDistortWarpImageOperation::determine_depending_area_of_interest( + rcti *input, ReadBufferOperation *read_operation, rcti *output) +{ + float min[2], max[2]; + INIT_MINMAX2(min, max); + + for (int sample = 0; sample < motion_blur_samples_; sample++) { + float UVs[4][2]; + float deriv[2][2]; + MotionSample *sample_data = &samples_[sample]; + /* TODO(sergey): figure out proper way to do this. */ + warp_coord(input->xmin - 2, input->ymin - 2, sample_data->perspective_matrix, UVs[0], deriv); + warp_coord(input->xmax + 2, input->ymin - 2, sample_data->perspective_matrix, UVs[1], deriv); + warp_coord(input->xmax + 2, input->ymax + 2, sample_data->perspective_matrix, UVs[2], deriv); + warp_coord(input->xmin - 2, input->ymax + 2, sample_data->perspective_matrix, UVs[3], deriv); + for (int i = 0; i < 4; i++) { + minmax_v2v2_v2(min, max, UVs[i]); + } + } + + rcti new_input; + + new_input.xmin = min[0] - 1; + new_input.ymin = min[1] - 1; + new_input.xmax = max[0] + 1; + new_input.ymax = max[1] + 1; + + return NodeOperation::determine_depending_area_of_interest(&new_input, read_operation, output); +} + void PlaneDistortWarpImageOperation::get_area_of_interest(const int input_idx, const rcti &output_area, rcti &r_input_area) @@ -175,6 +240,63 @@ void PlaneDistortWarpImageOperation::get_area_of_interest(const int input_idx, PlaneDistortMaskOperation::PlaneDistortMaskOperation() : PlaneDistortBaseOperation() { add_output_socket(DataType::Value); + + /* Currently hardcoded to 8 samples. */ + osa_ = 8; +} + +void PlaneDistortMaskOperation::init_execution() +{ + BLI_jitter_init(jitter_, osa_); +} + +void PlaneDistortMaskOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler /*sampler*/) +{ + float point[2]; + int inside_counter = 0; + if (motion_blur_samples_ == 1) { + MotionSample *sample_data = &samples_[0]; + for (int sample = 0; sample < osa_; sample++) { + point[0] = x + jitter_[sample][0]; + point[1] = y + jitter_[sample][1]; + if (isect_point_tri_v2(point, + sample_data->frame_space_corners[0], + sample_data->frame_space_corners[1], + sample_data->frame_space_corners[2]) || + isect_point_tri_v2(point, + sample_data->frame_space_corners[0], + sample_data->frame_space_corners[2], + sample_data->frame_space_corners[3])) + { + inside_counter++; + } + } + output[0] = float(inside_counter) / osa_; + } + else { + for (int motion_sample = 0; motion_sample < motion_blur_samples_; motion_sample++) { + MotionSample *sample_data = &samples_[motion_sample]; + for (int osa_sample = 0; osa_sample < osa_; osa_sample++) { + point[0] = x + jitter_[osa_sample][0]; + point[1] = y + jitter_[osa_sample][1]; + if (isect_point_tri_v2(point, + sample_data->frame_space_corners[0], + sample_data->frame_space_corners[1], + sample_data->frame_space_corners[2]) || + isect_point_tri_v2(point, + sample_data->frame_space_corners[0], + sample_data->frame_space_corners[2], + sample_data->frame_space_corners[3])) + { + inside_counter++; + } + } + } + output[0] = float(inside_counter) / (osa_ * motion_blur_samples_); + } } void PlaneDistortMaskOperation::update_memory_buffer_partial(MemoryBuffer *output, @@ -182,22 +304,37 @@ void PlaneDistortMaskOperation::update_memory_buffer_partial(MemoryBuffer *outpu Span /*inputs*/) { for (BuffersIterator it = output->iterate_with({}, area); !it.is_end(); ++it) { - float accumulated_mask = 0.0f; - const float2 point = float2(it.x, it.y); + int inside_count = 0; for (const int motion_sample : IndexRange(motion_blur_samples_)) { MotionSample &sample = samples_[motion_sample]; - const bool is_inside_plane = isect_point_tri_v2(point, - sample.frame_space_corners[0], - sample.frame_space_corners[1], - sample.frame_space_corners[2]) || - isect_point_tri_v2(point, - sample.frame_space_corners[0], - sample.frame_space_corners[2], - sample.frame_space_corners[3]); - accumulated_mask += is_inside_plane ? 1.0f : 0.0f; + inside_count += get_jitter_samples_inside_count(it.x, it.y, sample); } - *it.out = accumulated_mask / motion_blur_samples_; + *it.out = float(inside_count) / (osa_ * motion_blur_samples_); } } +int PlaneDistortMaskOperation::get_jitter_samples_inside_count(int x, + int y, + MotionSample &sample_data) +{ + float point[2]; + int inside_count = 0; + for (int sample = 0; sample < osa_; sample++) { + point[0] = x + jitter_[sample][0]; + point[1] = y + jitter_[sample][1]; + if (isect_point_tri_v2(point, + sample_data.frame_space_corners[0], + sample_data.frame_space_corners[1], + sample_data.frame_space_corners[2]) || + isect_point_tri_v2(point, + sample_data.frame_space_corners[0], + sample_data.frame_space_corners[2], + sample_data.frame_space_corners[3])) + { + inside_count++; + } + } + return inside_count; +} + } // namespace blender::compositor diff --git a/source/blender/compositor/operations/COM_PlaneDistortCommonOperation.h b/source/blender/compositor/operations/COM_PlaneDistortCommonOperation.h index 269a26261d6..90efd7d17ae 100644 --- a/source/blender/compositor/operations/COM_PlaneDistortCommonOperation.h +++ b/source/blender/compositor/operations/COM_PlaneDistortCommonOperation.h @@ -48,11 +48,23 @@ class PlaneDistortBaseOperation : public MultiThreadedOperation { }; class PlaneDistortWarpImageOperation : public PlaneDistortBaseOperation { + protected: + SocketReader *pixel_reader_; + public: PlaneDistortWarpImageOperation(); void calculate_corners(const float corners[4][2], bool normalized, int sample) override; + void init_execution() override; + void deinit_execution() override; + + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + + bool determine_depending_area_of_interest(rcti *input, + ReadBufferOperation *read_operation, + rcti *output) override; + void get_area_of_interest(int input_idx, const rcti &output_area, rcti &r_input_area) override; void update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, @@ -60,12 +72,23 @@ class PlaneDistortWarpImageOperation : public PlaneDistortBaseOperation { }; class PlaneDistortMaskOperation : public PlaneDistortBaseOperation { + protected: + int osa_; + float jitter_[32][2]; + public: PlaneDistortMaskOperation(); + void init_execution() override; + + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + void update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span inputs) override; + + private: + int get_jitter_samples_inside_count(int x, int y, MotionSample &sample_data); }; } // namespace blender::compositor diff --git a/source/blender/compositor/operations/COM_PlaneTrackOperation.cc b/source/blender/compositor/operations/COM_PlaneTrackOperation.cc index eb6316d4b78..6660b0114ea 100644 --- a/source/blender/compositor/operations/COM_PlaneTrackOperation.cc +++ b/source/blender/compositor/operations/COM_PlaneTrackOperation.cc @@ -81,7 +81,18 @@ void PlaneTrackCommon::determine_canvas(const rcti &preferred_area, rcti &r_area void PlaneTrackMaskOperation::init_data() { PlaneDistortMaskOperation::init_data(); - PlaneTrackCommon::read_and_calculate_corners(this); + if (execution_model_ == eExecutionModel::FullFrame) { + PlaneTrackCommon::read_and_calculate_corners(this); + } +} + +/* TODO(manzanilla): to be removed with tiled implementation. */ +void PlaneTrackMaskOperation::init_execution() +{ + PlaneDistortMaskOperation::init_execution(); + if (execution_model_ == eExecutionModel::Tiled) { + PlaneTrackCommon::read_and_calculate_corners(this); + } } /* ******** PlaneTrackWarpImageOperation ******** */ @@ -89,7 +100,18 @@ void PlaneTrackMaskOperation::init_data() void PlaneTrackWarpImageOperation::init_data() { PlaneDistortWarpImageOperation::init_data(); - PlaneTrackCommon::read_and_calculate_corners(this); + if (execution_model_ == eExecutionModel::FullFrame) { + PlaneTrackCommon::read_and_calculate_corners(this); + } +} + +/* TODO(manzanilla): to be removed with tiled implementation. */ +void PlaneTrackWarpImageOperation::init_execution() +{ + PlaneDistortWarpImageOperation::init_execution(); + if (execution_model_ == eExecutionModel::Tiled) { + PlaneTrackCommon::read_and_calculate_corners(this); + } } } // namespace blender::compositor diff --git a/source/blender/compositor/operations/COM_PlaneTrackOperation.h b/source/blender/compositor/operations/COM_PlaneTrackOperation.h index da07a7ab340..21294ebba26 100644 --- a/source/blender/compositor/operations/COM_PlaneTrackOperation.h +++ b/source/blender/compositor/operations/COM_PlaneTrackOperation.h @@ -11,6 +11,9 @@ #include "DNA_movieclip_types.h" #include "DNA_tracking_types.h" +#include "BLI_listbase.h" +#include "BLI_string.h" + namespace blender::compositor { class PlaneTrackCommon { @@ -56,6 +59,8 @@ class PlaneTrackMaskOperation : public PlaneDistortMaskOperation, public PlaneTr void init_data() override; + void init_execution() override; + void determine_canvas(const rcti &preferred_area, rcti &r_area) override { PlaneTrackCommon::determine_canvas(preferred_area, r_area); @@ -73,6 +78,8 @@ class PlaneTrackWarpImageOperation : public PlaneDistortWarpImageOperation, void init_data() override; + void init_execution() override; + void determine_canvas(const rcti &preferred_area, rcti &r_area) override { PlaneTrackCommon::determine_canvas(preferred_area, r_area); diff --git a/source/blender/compositor/operations/COM_PosterizeOperation.cc b/source/blender/compositor/operations/COM_PosterizeOperation.cc index 51c246b0274..05c2bca73b8 100644 --- a/source/blender/compositor/operations/COM_PosterizeOperation.cc +++ b/source/blender/compositor/operations/COM_PosterizeOperation.cc @@ -11,9 +11,36 @@ PosterizeOperation::PosterizeOperation() this->add_input_socket(DataType::Color); this->add_input_socket(DataType::Value); this->add_output_socket(DataType::Color); + input_program_ = nullptr; + input_steps_program_ = nullptr; flags_.can_be_constant = true; } +void PosterizeOperation::init_execution() +{ + input_program_ = this->get_input_socket_reader(0); + input_steps_program_ = this->get_input_socket_reader(1); +} + +void PosterizeOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float input_value[4]; + float input_steps[4]; + + input_program_->read_sampled(input_value, x, y, sampler); + input_steps_program_->read_sampled(input_steps, x, y, sampler); + CLAMP(input_steps[0], 2.0f, 1024.0f); + const float steps_inv = 1.0f / input_steps[0]; + + output[0] = floor(input_value[0] / steps_inv) * steps_inv; + output[1] = floor(input_value[1] / steps_inv) * steps_inv; + output[2] = floor(input_value[2] / steps_inv) * steps_inv; + output[3] = input_value[3]; +} + void PosterizeOperation::update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span inputs) @@ -32,4 +59,10 @@ void PosterizeOperation::update_memory_buffer_partial(MemoryBuffer *output, } } +void PosterizeOperation::deinit_execution() +{ + input_program_ = nullptr; + input_steps_program_ = nullptr; +} + } // namespace blender::compositor diff --git a/source/blender/compositor/operations/COM_PosterizeOperation.h b/source/blender/compositor/operations/COM_PosterizeOperation.h index d2cfbf809be..01a17a9f7c1 100644 --- a/source/blender/compositor/operations/COM_PosterizeOperation.h +++ b/source/blender/compositor/operations/COM_PosterizeOperation.h @@ -9,9 +9,31 @@ namespace blender::compositor { class PosterizeOperation : public MultiThreadedOperation { + private: + /** + * Cached reference to the input_program + */ + SocketReader *input_program_; + SocketReader *input_steps_program_; + public: PosterizeOperation(); + /** + * The inner loop of this operation. + */ + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + + /** + * Initialize the execution + */ + void init_execution() override; + + /** + * Deinitialize the execution + */ + void deinit_execution() override; + void update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span inputs) override; diff --git a/source/blender/compositor/operations/COM_PreviewOperation.cc b/source/blender/compositor/operations/COM_PreviewOperation.cc index 40e59bb32b9..9b819b87c5a 100644 --- a/source/blender/compositor/operations/COM_PreviewOperation.cc +++ b/source/blender/compositor/operations/COM_PreviewOperation.cc @@ -19,6 +19,7 @@ PreviewOperation::PreviewOperation(const ColorManagedViewSettings *view_settings this->add_input_socket(DataType::Color, ResizeMode::Align); preview_ = nullptr; output_image_ = nullptr; + input_ = nullptr; divider_ = 1.0f; view_settings_ = view_settings; display_settings_ = display_settings; @@ -38,6 +39,7 @@ void PreviewOperation::verify_preview(bNodeInstanceHash *previews, bNodeInstance void PreviewOperation::init_execution() { + input_ = get_input_socket_reader(0); output_image_ = preview_->ibuf; if (this->get_width() == uint(preview_->ibuf->x) && @@ -55,8 +57,49 @@ void PreviewOperation::init_execution() void PreviewOperation::deinit_execution() { output_image_ = nullptr; + input_ = nullptr; } +void PreviewOperation::execute_region(rcti *rect, uint /*tile_number*/) +{ + int offset; + float color[4]; + ColormanageProcessor *cm_processor; + + cm_processor = IMB_colormanagement_display_processor_new(view_settings_, display_settings_); + + for (int y = rect->ymin; y < rect->ymax; y++) { + offset = (y * get_width() + rect->xmin) * 4; + for (int x = rect->xmin; x < rect->xmax; x++) { + float rx = floor(x / divider_); + float ry = floor(y / divider_); + + color[0] = 0.0f; + color[1] = 0.0f; + color[2] = 0.0f; + color[3] = 1.0f; + input_->read_sampled(color, rx, ry, PixelSampler::Nearest); + IMB_colormanagement_processor_apply_v4(cm_processor, color); + rgba_float_to_uchar(output_image_->byte_buffer.data + offset, color); + offset += 4; + } + } + + IMB_colormanagement_processor_free(cm_processor); +} +bool PreviewOperation::determine_depending_area_of_interest(rcti *input, + ReadBufferOperation *read_operation, + rcti *output) +{ + rcti new_input; + + new_input.xmin = input->xmin / divider_; + new_input.xmax = input->xmax / divider_; + new_input.ymin = input->ymin / divider_; + new_input.ymax = input->ymax / divider_; + + return NodeOperation::determine_depending_area_of_interest(&new_input, read_operation, output); +} void PreviewOperation::determine_canvas(const rcti & /*preferred_area*/, rcti &r_area) { /* Use default preview resolution as preferred ensuring it has size so that diff --git a/source/blender/compositor/operations/COM_PreviewOperation.h b/source/blender/compositor/operations/COM_PreviewOperation.h index 20be8f3e86b..9f74c893786 100644 --- a/source/blender/compositor/operations/COM_PreviewOperation.h +++ b/source/blender/compositor/operations/COM_PreviewOperation.h @@ -4,7 +4,7 @@ #pragma once -#include "BKE_global.hh" +#include "BKE_global.h" #include "BLI_rect.h" #include "COM_MultiThreadedOperation.h" #include "DNA_color_types.h" @@ -20,6 +20,7 @@ class PreviewOperation : public MultiThreadedOperation { * \brief holds reference to the SDNA bNode, where this nodes will render the preview image for */ bNodePreview *preview_; + SocketReader *input_; float divider_; unsigned int default_width_; unsigned int default_height_; @@ -42,7 +43,11 @@ class PreviewOperation : public MultiThreadedOperation { void deinit_execution() override; eCompositorPriority get_render_priority() const override; + void execute_region(rcti *rect, unsigned int tile_number) override; void determine_canvas(const rcti &preferred_area, rcti &r_area) override; + bool determine_depending_area_of_interest(rcti *input, + ReadBufferOperation *read_operation, + rcti *output) override; void get_area_of_interest(int input_idx, const rcti &output_area, rcti &r_input_area) override; void update_memory_buffer_partial(MemoryBuffer *output, diff --git a/source/blender/compositor/operations/COM_ProjectorLensDistortionOperation.cc b/source/blender/compositor/operations/COM_ProjectorLensDistortionOperation.cc index 7eecd4e8fea..c2e2d9e5da8 100644 --- a/source/blender/compositor/operations/COM_ProjectorLensDistortionOperation.cc +++ b/source/blender/compositor/operations/COM_ProjectorLensDistortionOperation.cc @@ -12,26 +12,123 @@ ProjectorLensDistortionOperation::ProjectorLensDistortionOperation() this->add_input_socket(DataType::Color); this->add_input_socket(DataType::Value); this->add_output_socket(DataType::Color); + flags_.complex = true; flags_.can_be_constant = true; + input_program_ = nullptr; + dispersion_available_ = false; dispersion_ = 0.0f; } void ProjectorLensDistortionOperation::init_data() { - NodeOperation *dispersion_input = get_input_operation(1); - if (dispersion_input->get_flags().is_constant_operation) { - dispersion_ = static_cast(dispersion_input)->get_constant_elem()[0]; + if (execution_model_ == eExecutionModel::FullFrame) { + NodeOperation *dispersion_input = get_input_operation(1); + if (dispersion_input->get_flags().is_constant_operation) { + dispersion_ = static_cast(dispersion_input)->get_constant_elem()[0]; + } + kr_ = 0.25f * max_ff(min_ff(dispersion_, 1.0f), 0.0f); + kr2_ = kr_ * 20; } - kr_ = 0.25f * max_ff(min_ff(dispersion_, 1.0f), 0.0f); - kr2_ = kr_ * 20; +} + +void ProjectorLensDistortionOperation::init_execution() +{ + this->init_mutex(); + input_program_ = this->get_input_socket_reader(0); +} + +void *ProjectorLensDistortionOperation::initialize_tile_data(rcti * /*rect*/) +{ + update_dispersion(); + void *buffer = input_program_->initialize_tile_data(nullptr); + return buffer; +} + +void ProjectorLensDistortionOperation::execute_pixel(float output[4], int x, int y, void *data) +{ + float input_value[4]; + const float height = this->get_height(); + const float width = this->get_width(); + const float v = (y + 0.5f) / height; + const float u = (x + 0.5f) / width; + MemoryBuffer *input_buffer = (MemoryBuffer *)data; + input_buffer->read_bilinear(input_value, (u * width + kr2_) - 0.5f, v * height - 0.5f); + output[0] = input_value[0]; + input_buffer->read(input_value, x, y); + output[1] = input_value[1]; + input_buffer->read_bilinear(input_value, (u * width - kr2_) - 0.5f, v * height - 0.5f); + output[2] = input_value[2]; + output[3] = 1.0f; +} + +void ProjectorLensDistortionOperation::deinit_execution() +{ + this->deinit_mutex(); + input_program_ = nullptr; +} + +bool ProjectorLensDistortionOperation::determine_depending_area_of_interest( + rcti *input, ReadBufferOperation *read_operation, rcti *output) +{ + rcti new_input; + if (dispersion_available_) { + new_input.ymax = input->ymax; + new_input.ymin = input->ymin; + new_input.xmin = input->xmin - kr2_ - 2; + new_input.xmax = input->xmax + kr2_ + 2; + } + else { + rcti disp_input; + BLI_rcti_init(&disp_input, 0, 5, 0, 5); + if (this->get_input_operation(1)->determine_depending_area_of_interest( + &disp_input, read_operation, output)) + { + return true; + } + new_input.xmin = input->xmin - 7; /* (0.25f * 20 * 1) + 2 == worse case dispersion */ + new_input.ymin = input->ymin; + new_input.ymax = input->ymax; + new_input.xmax = input->xmax + 7; /* (0.25f * 20 * 1) + 2 == worse case dispersion */ + } + if (this->get_input_operation(0)->determine_depending_area_of_interest( + &new_input, read_operation, output)) + { + return true; + } + return false; +} + +/* TODO(manzanilla): to be removed with tiled implementation. */ +void ProjectorLensDistortionOperation::update_dispersion() +{ + if (dispersion_available_) { + return; + } + this->lock_mutex(); + if (!dispersion_available_) { + float result[4]; + this->get_input_socket_reader(1)->read_sampled(result, 1, 1, PixelSampler::Nearest); + dispersion_ = result[0]; + kr_ = 0.25f * max_ff(min_ff(dispersion_, 1.0f), 0.0f); + kr2_ = kr_ * 20; + dispersion_available_ = true; + } + this->unlock_mutex(); } void ProjectorLensDistortionOperation::determine_canvas(const rcti &preferred_area, rcti &r_area) { - set_determined_canvas_modifier([=](rcti &canvas) { - /* Ensure screen space. */ - BLI_rcti_translate(&canvas, -canvas.xmin, -canvas.ymin); - }); + switch (execution_model_) { + case eExecutionModel::FullFrame: { + set_determined_canvas_modifier([=](rcti &canvas) { + /* Ensure screen space. */ + BLI_rcti_translate(&canvas, -canvas.xmin, -canvas.ymin); + }); + break; + } + default: + break; + } NodeOperation::determine_canvas(preferred_area, r_area); } diff --git a/source/blender/compositor/operations/COM_ProjectorLensDistortionOperation.h b/source/blender/compositor/operations/COM_ProjectorLensDistortionOperation.h index c0ab16b2b18..e80cba1cc9d 100644 --- a/source/blender/compositor/operations/COM_ProjectorLensDistortionOperation.h +++ b/source/blender/compositor/operations/COM_ProjectorLensDistortionOperation.h @@ -11,14 +11,42 @@ namespace blender::compositor { class ProjectorLensDistortionOperation : public MultiThreadedOperation { private: + /** + * Cached reference to the input_program + */ + SocketReader *input_program_; + float dispersion_; + /* TODO(manzanilla): to be removed with tiled implementation. */ + bool dispersion_available_; float kr_, kr2_; public: ProjectorLensDistortionOperation(); + /** + * The inner loop of this operation. + */ + void execute_pixel(float output[4], int x, int y, void *data) override; + void init_data() override; + /** + * Initialize the execution + */ + void init_execution() override; + + void *initialize_tile_data(rcti *rect) override; + /** + * Deinitialize the execution + */ + void deinit_execution() override; + + bool determine_depending_area_of_interest(rcti *input, + ReadBufferOperation *read_operation, + rcti *output) override; + + void update_dispersion(); void determine_canvas(const rcti &preferred_area, rcti &r_area) override; void get_area_of_interest(int input_idx, const rcti &output_area, rcti &r_input_area) override; diff --git a/source/blender/compositor/operations/COM_QualityStepHelper.h b/source/blender/compositor/operations/COM_QualityStepHelper.h index 1795c788073..c4e930b649a 100644 --- a/source/blender/compositor/operations/COM_QualityStepHelper.h +++ b/source/blender/compositor/operations/COM_QualityStepHelper.h @@ -20,6 +20,9 @@ class QualityStepHelper { int offsetadd_; protected: + /** + * Initialize the execution + */ void init_execution(QualityHelper helper); inline int get_step() const diff --git a/source/blender/compositor/operations/COM_ReadBufferOperation.cc b/source/blender/compositor/operations/COM_ReadBufferOperation.cc new file mode 100644 index 00000000000..654d136ebac --- /dev/null +++ b/source/blender/compositor/operations/COM_ReadBufferOperation.cc @@ -0,0 +1,125 @@ +/* SPDX-FileCopyrightText: 2011 Blender Authors + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +#include "COM_ReadBufferOperation.h" + +#include "COM_ExecutionGroup.h" +#include "COM_WriteBufferOperation.h" + +namespace blender::compositor { + +ReadBufferOperation::ReadBufferOperation(DataType datatype) +{ + this->add_output_socket(datatype); + single_value_ = false; + offset_ = 0; + buffer_ = nullptr; + flags_.is_read_buffer_operation = true; +} + +void *ReadBufferOperation::initialize_tile_data(rcti * /*rect*/) +{ + return buffer_; +} + +void ReadBufferOperation::determine_canvas(const rcti &preferred_area, rcti &r_area) +{ + if (memory_proxy_ != nullptr) { + WriteBufferOperation *operation = memory_proxy_->get_write_buffer_operation(); + operation->determine_canvas(preferred_area, r_area); + operation->set_canvas(r_area); + + /** \todo may not occur! But does with blur node. */ + if (memory_proxy_->get_executor()) { + uint resolution[2] = {uint(BLI_rcti_size_x(&r_area)), uint(BLI_rcti_size_y(&r_area))}; + memory_proxy_->get_executor()->set_resolution(resolution); + } + + single_value_ = operation->is_single_value(); + } +} +void ReadBufferOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + if (single_value_) { + /* write buffer has a single value stored at (0,0) */ + buffer_->read(output, 0, 0); + } + else { + switch (sampler) { + case PixelSampler::Nearest: + buffer_->read(output, x, y); + break; + case PixelSampler::Bilinear: + default: + buffer_->read_bilinear(output, x, y); + break; + case PixelSampler::Bicubic: + buffer_->read_bilinear(output, x, y); + break; + } + } +} + +void ReadBufferOperation::execute_pixel_extend(float output[4], + float x, + float y, + PixelSampler sampler, + MemoryBufferExtend extend_x, + MemoryBufferExtend extend_y) +{ + if (single_value_) { + /* write buffer has a single value stored at (0,0) */ + buffer_->read(output, 0, 0); + } + else if (sampler == PixelSampler::Nearest) { + buffer_->read(output, x, y, extend_x, extend_y); + } + else { + buffer_->read_bilinear(output, x, y, extend_x, extend_y); + } +} + +void ReadBufferOperation::execute_pixel_filtered( + float output[4], float x, float y, float dx[2], float dy[2]) +{ + if (single_value_) { + /* write buffer has a single value stored at (0,0) */ + buffer_->read(output, 0, 0); + } + else { + const float uv[2] = {x, y}; + const float deriv[2][2] = {{dx[0], dx[1]}, {dy[0], dy[1]}}; + buffer_->readEWA(output, uv, deriv); + } +} + +bool ReadBufferOperation::determine_depending_area_of_interest(rcti *input, + ReadBufferOperation *read_operation, + rcti *output) +{ + if (this == read_operation) { + BLI_rcti_init(output, input->xmin, input->xmax, input->ymin, input->ymax); + return true; + } + return false; +} + +void ReadBufferOperation::read_resolution_from_write_buffer() +{ + if (memory_proxy_ != nullptr) { + WriteBufferOperation *operation = memory_proxy_->get_write_buffer_operation(); + this->set_width(operation->get_width()); + this->set_height(operation->get_height()); + } +} + +void ReadBufferOperation::update_memory_buffer() +{ + buffer_ = this->get_memory_proxy()->get_buffer(); +} + +} // namespace blender::compositor diff --git a/source/blender/compositor/operations/COM_ReadBufferOperation.h b/source/blender/compositor/operations/COM_ReadBufferOperation.h new file mode 100644 index 00000000000..0fbd7a9bf4e --- /dev/null +++ b/source/blender/compositor/operations/COM_ReadBufferOperation.h @@ -0,0 +1,63 @@ +/* SPDX-FileCopyrightText: 2011 Blender Authors + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +#pragma once + +#include "COM_MemoryBuffer.h" +#include "COM_MemoryProxy.h" +#include "COM_NodeOperation.h" + +namespace blender::compositor { + +class ReadBufferOperation : public NodeOperation { + private: + MemoryProxy *memory_proxy_; + bool single_value_; /* single value stored in buffer, copied from associated write operation */ + unsigned int offset_; + MemoryBuffer *buffer_; + + public: + ReadBufferOperation(DataType datatype); + void set_memory_proxy(MemoryProxy *memory_proxy) + { + memory_proxy_ = memory_proxy; + } + + MemoryProxy *get_memory_proxy() const + { + return memory_proxy_; + } + + void determine_canvas(const rcti &preferred_area, rcti &r_area) override; + + void *initialize_tile_data(rcti *rect) override; + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + void execute_pixel_extend(float output[4], + float x, + float y, + PixelSampler sampler, + MemoryBufferExtend extend_x, + MemoryBufferExtend extend_y); + void execute_pixel_filtered( + float output[4], float x, float y, float dx[2], float dy[2]) override; + void set_offset(unsigned int offset) + { + offset_ = offset; + } + unsigned int get_offset() const + { + return offset_; + } + bool determine_depending_area_of_interest(rcti *input, + ReadBufferOperation *read_operation, + rcti *output) override; + MemoryBuffer *get_input_memory_buffer(MemoryBuffer **memory_buffers) override + { + return memory_buffers[offset_]; + } + void read_resolution_from_write_buffer(); + void update_memory_buffer(); +}; + +} // namespace blender::compositor diff --git a/source/blender/compositor/operations/COM_RenderLayersProg.cc b/source/blender/compositor/operations/COM_RenderLayersProg.cc index abdb2174f08..02afacc2108 100644 --- a/source/blender/compositor/operations/COM_RenderLayersProg.cc +++ b/source/blender/compositor/operations/COM_RenderLayersProg.cc @@ -86,6 +86,71 @@ void RenderLayersProg::do_interpolation(float output[4], float x, float y, Pixel } } +void RenderLayersProg::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ +#if 0 + const RenderData *rd = rd_; + + int dx = 0, dy = 0; + + if (rd->mode & R_BORDER && rd->mode & R_CROP) { + /* see comment in execute_region describing coordinate mapping, + * here it simply goes other way around + */ + int full_width, full_height; + BKE_render_resolution(rd, false, &full_width, &full_height); + + dx = rd->border.xmin * full_width - (full_width - this->get_width()) / 2.0f; + dy = rd->border.ymin * full_height - (full_height - this->get_height()) / 2.0f; + } + + int ix = x - dx; + int iy = y - dy; +#endif + +#ifndef NDEBUG + { + const DataType data_type = this->get_output_socket()->get_data_type(); + int actual_element_size = elementsize_; + int expected_element_size; + if (data_type == DataType::Value) { + expected_element_size = 1; + } + else if (data_type == DataType::Vector) { + expected_element_size = 3; + } + else if (data_type == DataType::Color) { + expected_element_size = 4; + } + else { + expected_element_size = 0; + BLI_assert_msg(0, "Something horribly wrong just happened"); + } + BLI_assert(expected_element_size == actual_element_size); + } +#endif + + if (input_buffer_ == nullptr) { + int elemsize = elementsize_; + if (elemsize == 1) { + output[0] = 0.0f; + } + else if (elemsize == 3) { + zero_v3(output); + } + else { + BLI_assert(elemsize == 4); + zero_v4(output); + } + } + else { + do_interpolation(output, x, y, sampler); + } +} + void RenderLayersProg::deinit_execution() { input_buffer_ = nullptr; @@ -175,6 +240,21 @@ void RenderLayersProg::update_memory_buffer_partial(MemoryBuffer *output, /* ******** Render Layers AO Operation ******** */ +void RenderLayersAOOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float *input_buffer = this->get_input_buffer(); + if (input_buffer == nullptr) { + zero_v3(output); + } + else { + do_interpolation(output, x, y, sampler); + } + output[3] = 1.0f; +} + void RenderLayersAOOperation::update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span /*inputs*/) @@ -192,6 +272,23 @@ void RenderLayersAOOperation::update_memory_buffer_partial(MemoryBuffer *output, /* ******** Render Layers Alpha Operation ******** */ +void RenderLayersAlphaProg::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float *input_buffer = this->get_input_buffer(); + + if (input_buffer == nullptr) { + output[0] = 0.0f; + } + else { + float temp[4]; + do_interpolation(temp, x, y, sampler); + output[0] = temp[3]; + } +} + void RenderLayersAlphaProg::update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span /*inputs*/) @@ -208,6 +305,26 @@ void RenderLayersAlphaProg::update_memory_buffer_partial(MemoryBuffer *output, /* ******** Render Layers Depth Operation ******** */ +void RenderLayersDepthProg::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler /*sampler*/) +{ + int ix = x; + int iy = y; + float *input_buffer = this->get_input_buffer(); + + if (input_buffer == nullptr || ix < 0 || iy < 0 || ix >= int(this->get_width()) || + iy >= int(this->get_height())) + { + output[0] = 10e10f; + } + else { + uint offset = (iy * this->get_width() + ix); + output[0] = input_buffer[offset]; + } +} + void RenderLayersDepthProg::update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span /*inputs*/) diff --git a/source/blender/compositor/operations/COM_RenderLayersProg.h b/source/blender/compositor/operations/COM_RenderLayersProg.h index 5d5ecc638cf..40aa4c66078 100644 --- a/source/blender/compositor/operations/COM_RenderLayersProg.h +++ b/source/blender/compositor/operations/COM_RenderLayersProg.h @@ -111,6 +111,7 @@ class RenderLayersProg : public MultiThreadedOperation { } void init_execution() override; void deinit_execution() override; + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; std::unique_ptr get_meta_data() override; @@ -125,6 +126,7 @@ class RenderLayersAOOperation : public RenderLayersProg { : RenderLayersProg(pass_name, type, elementsize) { } + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; void update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, @@ -137,6 +139,7 @@ class RenderLayersAlphaProg : public RenderLayersProg { : RenderLayersProg(pass_name, type, elementsize) { } + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; void update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, @@ -149,6 +152,7 @@ class RenderLayersDepthProg : public RenderLayersProg { : RenderLayersProg(pass_name, type, elementsize) { } + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; void update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, diff --git a/source/blender/compositor/operations/COM_RotateOperation.cc b/source/blender/compositor/operations/COM_RotateOperation.cc index 4c3f7880a96..d4d69364204 100644 --- a/source/blender/compositor/operations/COM_RotateOperation.cc +++ b/source/blender/compositor/operations/COM_RotateOperation.cc @@ -14,6 +14,8 @@ RotateOperation::RotateOperation() this->add_input_socket(DataType::Value, ResizeMode::None); this->add_output_socket(DataType::Color); this->set_canvas_input_index(0); + image_socket_ = nullptr; + degree_socket_ = nullptr; do_degree2_rad_conversion_ = false; is_degree_set_ = false; sampler_ = PixelSampler::Bilinear; @@ -111,19 +113,44 @@ void RotateOperation::get_rotation_canvas(const rcti &input_canvas, BLI_rcti_translate(&r_canvas, -offset_x, -offset_y); } -void RotateOperation::init_data() {} +void RotateOperation::init_data() +{ + if (execution_model_ == eExecutionModel::Tiled) { + get_rotation_center(get_canvas(), center_x_, center_y_); + } +} + +void RotateOperation::init_execution() +{ + image_socket_ = this->get_input_socket_reader(0); + degree_socket_ = this->get_input_socket_reader(1); +} + +void RotateOperation::deinit_execution() +{ + image_socket_ = nullptr; + degree_socket_ = nullptr; +} inline void RotateOperation::ensure_degree() { if (!is_degree_set_) { - float degree = get_input_operation(DEGREE_INPUT_INDEX)->get_constant_value_default(0.0f); + float degree[4]; + switch (execution_model_) { + case eExecutionModel::Tiled: + degree_socket_->read_sampled(degree, 0, 0, PixelSampler::Nearest); + break; + case eExecutionModel::FullFrame: + degree[0] = get_input_operation(DEGREE_INPUT_INDEX)->get_constant_value_default(0.0f); + break; + } double rad; if (do_degree2_rad_conversion_) { - rad = DEG2RAD(double(degree)); + rad = DEG2RAD(double(degree[0])); } else { - rad = degree; + rad = degree[0]; } cosine_ = cos(rad); sine_ = sin(rad); @@ -132,8 +159,59 @@ inline void RotateOperation::ensure_degree() } } +void RotateOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + ensure_degree(); + const float dy = y - center_y_; + const float dx = x - center_x_; + const float nx = center_x_ + (cosine_ * dx + sine_ * dy); + const float ny = center_y_ + (-sine_ * dx + cosine_ * dy); + image_socket_->read_sampled(output, nx, ny, sampler); +} + +bool RotateOperation::determine_depending_area_of_interest(rcti *input, + ReadBufferOperation *read_operation, + rcti *output) +{ + ensure_degree(); + rcti new_input; + + const float dxmin = input->xmin - center_x_; + const float dymin = input->ymin - center_y_; + const float dxmax = input->xmax - center_x_; + const float dymax = input->ymax - center_y_; + + const float x1 = center_x_ + (cosine_ * dxmin + sine_ * dymin); + const float x2 = center_x_ + (cosine_ * dxmax + sine_ * dymin); + const float x3 = center_x_ + (cosine_ * dxmin + sine_ * dymax); + const float x4 = center_x_ + (cosine_ * dxmax + sine_ * dymax); + const float y1 = center_y_ + (-sine_ * dxmin + cosine_ * dymin); + const float y2 = center_y_ + (-sine_ * dxmax + cosine_ * dymin); + const float y3 = center_y_ + (-sine_ * dxmin + cosine_ * dymax); + const float y4 = center_y_ + (-sine_ * dxmax + cosine_ * dymax); + const float minx = std::min(x1, std::min(x2, std::min(x3, x4))); + const float maxx = std::max(x1, std::max(x2, std::max(x3, x4))); + const float miny = std::min(y1, std::min(y2, std::min(y3, y4))); + const float maxy = std::max(y1, std::max(y2, std::max(y3, y4))); + + new_input.xmax = ceil(maxx) + 1; + new_input.xmin = floor(minx) - 1; + new_input.ymax = ceil(maxy) + 1; + new_input.ymin = floor(miny) - 1; + + return NodeOperation::determine_depending_area_of_interest(&new_input, read_operation, output); +} + void RotateOperation::determine_canvas(const rcti &preferred_area, rcti &r_area) { + if (execution_model_ == eExecutionModel::Tiled) { + NodeOperation::determine_canvas(preferred_area, r_area); + return; + } + const bool image_determined = get_input_socket(IMAGE_INPUT_INDEX)->determine_canvas(preferred_area, r_area); if (image_determined) { diff --git a/source/blender/compositor/operations/COM_RotateOperation.h b/source/blender/compositor/operations/COM_RotateOperation.h index 536153e3f9a..150e5c4d667 100644 --- a/source/blender/compositor/operations/COM_RotateOperation.h +++ b/source/blender/compositor/operations/COM_RotateOperation.h @@ -13,6 +13,12 @@ class RotateOperation : public MultiThreadedOperation { constexpr static int IMAGE_INPUT_INDEX = 0; constexpr static int DEGREE_INPUT_INDEX = 1; + SocketReader *image_socket_; + SocketReader *degree_socket_; + /* TODO(manzanilla): to be removed with tiled implementation. */ + float center_x_; + float center_y_; + float cosine_; float sine_; bool do_degree2_rad_conversion_; @@ -51,7 +57,13 @@ class RotateOperation : public MultiThreadedOperation { float cosine, rcti &r_canvas); + bool determine_depending_area_of_interest(rcti *input, + ReadBufferOperation *read_operation, + rcti *output) override; + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; void init_data() override; + void init_execution() override; + void deinit_execution() override; void set_do_degree2_rad_conversion(bool abool) { diff --git a/source/blender/compositor/operations/COM_SMAAOperation.cc b/source/blender/compositor/operations/COM_SMAAOperation.cc index f49a069a81e..32204cb7aea 100644 --- a/source/blender/compositor/operations/COM_SMAAOperation.cc +++ b/source/blender/compositor/operations/COM_SMAAOperation.cc @@ -42,6 +42,18 @@ namespace blender::compositor { /*-----------------------------------------------------------------------------*/ /* Internal Functions to Sample Pixel Color from Image */ +/* TODO(manzanilla): to be removed with tiled implementation. Replace it with + * #buffer->read_elem_checked. */ +static inline void sample(SocketReader *reader, int x, int y, float color[4]) +{ + if (x < 0 || x >= reader->get_width() || y < 0 || y >= reader->get_height()) { + color[0] = color[1] = color[2] = color[3] = 0.0; + return; + } + + reader->read(color, x, y, nullptr); +} + static inline void sample(MemoryBuffer *reader, int x, int y, float color[4]) { reader->read_elem_checked(x, y, color); @@ -140,11 +152,26 @@ SMAAEdgeDetectionOperation::SMAAEdgeDetectionOperation() this->add_input_socket(DataType::Color); /* image */ this->add_input_socket(DataType::Value); /* Depth, material ID, etc. TODO: currently unused. */ this->add_output_socket(DataType::Color); + flags_.complex = true; flags_.can_be_constant = true; + image_reader_ = nullptr; + value_reader_ = nullptr; this->set_threshold(CMP_DEFAULT_SMAA_THRESHOLD); this->set_local_contrast_adaptation_factor(CMP_DEFAULT_SMAA_CONTRAST_LIMIT); } +void SMAAEdgeDetectionOperation::init_execution() +{ + image_reader_ = this->get_input_socket_reader(0); + value_reader_ = this->get_input_socket_reader(1); +} + +void SMAAEdgeDetectionOperation::deinit_execution() +{ + image_reader_ = nullptr; + value_reader_ = nullptr; +} + void SMAAEdgeDetectionOperation::set_threshold(float threshold) { /* UI values are between 0 and 1 for simplicity but algorithm expects values between 0 and 0.5 */ @@ -157,6 +184,18 @@ void SMAAEdgeDetectionOperation::set_local_contrast_adaptation_factor(float fact contrast_limit_ = scalenorm(1, 10, factor); } +bool SMAAEdgeDetectionOperation::determine_depending_area_of_interest( + rcti *input, ReadBufferOperation *read_operation, rcti *output) +{ + rcti new_input; + new_input.xmax = input->xmax + 1; + new_input.xmin = input->xmin - 2; + new_input.ymax = input->ymax + 1; + new_input.ymin = input->ymin - 2; + + return NodeOperation::determine_depending_area_of_interest(&new_input, read_operation, output); +} + void SMAAEdgeDetectionOperation::get_area_of_interest(const int /*input_idx*/, const rcti &output_area, rcti &r_input_area) @@ -167,6 +206,87 @@ void SMAAEdgeDetectionOperation::get_area_of_interest(const int /*input_idx*/, r_input_area.ymin = output_area.ymin - 2; } +void SMAAEdgeDetectionOperation::execute_pixel(float output[4], int x, int y, void * /*data*/) +{ + float color[4]; + + /* Calculate luma deltas: */ + sample(image_reader_, x, y, color); + float L = IMB_colormanagement_get_luminance(color); + sample(image_reader_, x - 1, y, color); + float Lleft = IMB_colormanagement_get_luminance(color); + sample(image_reader_, x, y - 1, color); + float Ltop = IMB_colormanagement_get_luminance(color); + float Dleft = fabsf(L - Lleft); + float Dtop = fabsf(L - Ltop); + + /* We do the usual threshold: */ + output[0] = (x > 0 && Dleft >= threshold_) ? 1.0f : 0.0f; + output[1] = (y > 0 && Dtop >= threshold_) ? 1.0f : 0.0f; + output[2] = 0.0f; + output[3] = 1.0f; + + /* Then discard if there is no edge: */ + if (is_zero_v2(output)) { + return; + } + + /* Calculate right and bottom deltas: */ + sample(image_reader_, x + 1, y, color); + float Lright = IMB_colormanagement_get_luminance(color); + sample(image_reader_, x, y + 1, color); + float Lbottom = IMB_colormanagement_get_luminance(color); + float Dright = fabsf(L - Lright); + float Dbottom = fabsf(L - Lbottom); + + /* Calculate the maximum delta in the direct neighborhood: */ + float max_delta = fmaxf(fmaxf(Dleft, Dright), fmaxf(Dtop, Dbottom)); + + /* Calculate luma used for both left and top edges: */ + sample(image_reader_, x - 1, y - 1, color); + float Llefttop = IMB_colormanagement_get_luminance(color); + + /* Left edge */ + if (output[0] != 0.0f) { + /* Calculate deltas around the left pixel: */ + sample(image_reader_, x - 2, y, color); + float Lleftleft = IMB_colormanagement_get_luminance(color); + sample(image_reader_, x - 1, y + 1, color); + float Lleftbottom = IMB_colormanagement_get_luminance(color); + float Dleftleft = fabsf(Lleft - Lleftleft); + float Dlefttop = fabsf(Lleft - Llefttop); + float Dleftbottom = fabsf(Lleft - Lleftbottom); + + /* Calculate the final maximum delta: */ + max_delta = fmaxf(max_delta, fmaxf(Dleftleft, fmaxf(Dlefttop, Dleftbottom))); + + /* Local contrast adaptation: */ + if (max_delta > contrast_limit_ * Dleft) { + output[0] = 0.0f; + } + } + + /* Top edge */ + if (output[1] != 0.0f) { + /* Calculate top-top delta: */ + sample(image_reader_, x, y - 2, color); + float Ltoptop = IMB_colormanagement_get_luminance(color); + sample(image_reader_, x + 1, y - 1, color); + float Ltopright = IMB_colormanagement_get_luminance(color); + float Dtoptop = fabsf(Ltop - Ltoptop); + float Dtopleft = fabsf(Ltop - Llefttop); + float Dtopright = fabsf(Ltop - Ltopright); + + /* Calculate the final maximum delta: */ + max_delta = fmaxf(max_delta, fmaxf(Dtoptop, fmaxf(Dtopleft, Dtopright))); + + /* Local contrast adaptation: */ + if (max_delta > contrast_limit_ * Dtop) { + output[1] = 0.0f; + } + } +} + void SMAAEdgeDetectionOperation::update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span inputs) @@ -263,16 +383,128 @@ SMAABlendingWeightCalculationOperation::SMAABlendingWeightCalculationOperation() { this->add_input_socket(DataType::Color); /* edges */ this->add_output_socket(DataType::Color); + flags_.complex = true; flags_.can_be_constant = true; + image_reader_ = nullptr; this->set_corner_rounding(CMP_DEFAULT_SMAA_CORNER_ROUNDING); } +void *SMAABlendingWeightCalculationOperation::initialize_tile_data(rcti *rect) +{ + return get_input_operation(0)->initialize_tile_data(rect); +} + +void SMAABlendingWeightCalculationOperation::init_execution() +{ + image_reader_ = this->get_input_socket_reader(0); + if (execution_model_ == eExecutionModel::Tiled) { + sample_image_fn_ = [=](int x, int y, float *out) { sample(image_reader_, x, y, out); }; + } +} + void SMAABlendingWeightCalculationOperation::set_corner_rounding(float rounding) { /* UI values are between 0 and 1 for simplicity but algorithm expects values between 0 and 100 */ corner_rounding_ = int(scalenorm(0, 100, rounding)); } +void SMAABlendingWeightCalculationOperation::execute_pixel(float output[4], + int x, + int y, + void * /*data*/) +{ + float edges[4], c[4]; + + zero_v4(output); + sample(image_reader_, x, y, edges); + + /* Edge at north */ + if (edges[1] > 0.0f) { + /* Diagonals have both north and west edges, so calculating weights for them */ + /* in one of the boundaries is enough. */ + calculate_diag_weights(x, y, edges, output); + + /* We give priority to diagonals, so if we find a diagonal we skip. */ + /* horizontal/vertical processing. */ + if (!is_zero_v2(output)) { + return; + } + + /* Find the distance to the left and the right: */ + int left = search_xleft(x, y); + int right = search_xright(x, y); + int d1 = x - left, d2 = right - x; + + /* Fetch the left and right crossing edges: */ + int e1 = 0, e2 = 0; + sample(image_reader_, left, y - 1, c); + if (c[0] > 0.0) { + e1 += 1; + } + sample(image_reader_, left, y, c); + if (c[0] > 0.0) { + e1 += 2; + } + sample(image_reader_, right + 1, y - 1, c); + if (c[0] > 0.0) { + e2 += 1; + } + sample(image_reader_, right + 1, y, c); + if (c[0] > 0.0) { + e2 += 2; + } + + /* Ok, we know how this pattern looks like, now it is time for getting */ + /* the actual area: */ + area(d1, d2, e1, e2, output); /* R, G */ + + /* Fix corners: */ + if (corner_rounding_) { + detect_horizontal_corner_pattern(output, left, right, y, d1, d2); + } + } + + /* Edge at west */ + if (edges[0] > 0.0f) { + /* Did we already do diagonal search for this west edge from the left neighboring pixel? */ + if (is_vertical_search_unneeded(x, y)) { + return; + } + + /* Find the distance to the top and the bottom: */ + int top = search_yup(x, y); + int bottom = search_ydown(x, y); + int d1 = y - top, d2 = bottom - y; + + /* Fetch the top and bottom crossing edges: */ + int e1 = 0, e2 = 0; + sample(image_reader_, x - 1, top, c); + if (c[1] > 0.0) { + e1 += 1; + } + sample(image_reader_, x, top, c); + if (c[1] > 0.0) { + e1 += 2; + } + sample(image_reader_, x - 1, bottom + 1, c); + if (c[1] > 0.0) { + e2 += 1; + } + sample(image_reader_, x, bottom + 1, c); + if (c[1] > 0.0) { + e2 += 2; + } + + /* Get the area for this direction: */ + area(d1, d2, e1, e2, output + 2); /* B, A */ + + /* Fix corners: */ + if (corner_rounding_) { + detect_vertical_corner_pattern(output + 2, x, top, bottom, d1, d2); + } + } +} + void SMAABlendingWeightCalculationOperation::update_memory_buffer_started( MemoryBuffer * /*output*/, const rcti & /*out_area*/, Span inputs) { @@ -380,6 +612,26 @@ void SMAABlendingWeightCalculationOperation::update_memory_buffer_partial( } } +void SMAABlendingWeightCalculationOperation::deinit_execution() +{ + image_reader_ = nullptr; +} + +bool SMAABlendingWeightCalculationOperation::determine_depending_area_of_interest( + rcti *input, ReadBufferOperation *read_operation, rcti *output) +{ + rcti new_input; + + new_input.xmax = input->xmax + fmax(SMAA_MAX_SEARCH_STEPS, SMAA_MAX_SEARCH_STEPS_DIAG + 1); + new_input.xmin = input->xmin - + fmax(fmax(SMAA_MAX_SEARCH_STEPS - 1, 1), SMAA_MAX_SEARCH_STEPS_DIAG + 1); + new_input.ymax = input->ymax + fmax(SMAA_MAX_SEARCH_STEPS, SMAA_MAX_SEARCH_STEPS_DIAG); + new_input.ymin = input->ymin - + fmax(fmax(SMAA_MAX_SEARCH_STEPS - 1, 1), SMAA_MAX_SEARCH_STEPS_DIAG); + + return NodeOperation::determine_depending_area_of_interest(&new_input, read_operation, output); +} + void SMAABlendingWeightCalculationOperation::get_area_of_interest(const int /*input_idx*/, const rcti &output_area, rcti &r_input_area) @@ -738,7 +990,69 @@ SMAANeighborhoodBlendingOperation::SMAANeighborhoodBlendingOperation() this->add_input_socket(DataType::Color); /* image */ this->add_input_socket(DataType::Color); /* blend */ this->add_output_socket(DataType::Color); + flags_.complex = true; flags_.can_be_constant = true; + image1Reader_ = nullptr; + image2Reader_ = nullptr; +} + +void *SMAANeighborhoodBlendingOperation::initialize_tile_data(rcti *rect) +{ + return get_input_operation(0)->initialize_tile_data(rect); +} + +void SMAANeighborhoodBlendingOperation::init_execution() +{ + image1Reader_ = this->get_input_socket_reader(0); + image2Reader_ = this->get_input_socket_reader(1); +} + +void SMAANeighborhoodBlendingOperation::execute_pixel(float output[4], + int x, + int y, + void * /*data*/) +{ + float w[4]; + + /* Fetch the blending weights for current pixel: */ + sample(image2Reader_, x, y, w); + float left = w[2], top = w[0]; + sample(image2Reader_, x + 1, y, w); + float right = w[3]; + sample(image2Reader_, x, y + 1, w); + float bottom = w[1]; + + /* Is there any blending weight with a value greater than 0.0? */ + if (right + bottom + left + top < 1e-5f) { + sample(image1Reader_, x, y, output); + return; + } + + /* Calculate the blending offsets: */ + void (*samplefunc)(SocketReader *reader, int x, int y, float xoffset, float color[4]); + float offset1, offset2, weight1, weight2, color1[4], color2[4]; + + if (fmaxf(right, left) > fmaxf(bottom, top)) { /* max(horizontal) > max(vertical) */ + samplefunc = sample_bilinear_horizontal; + offset1 = right; + offset2 = -left; + weight1 = right / (right + left); + weight2 = left / (right + left); + } + else { + samplefunc = sample_bilinear_vertical; + offset1 = bottom; + offset2 = -top; + weight1 = bottom / (bottom + top); + weight2 = top / (bottom + top); + } + + /* We exploit bilinear filtering to mix current pixel with the chosen neighbor: */ + samplefunc(image1Reader_, x, y, offset1, color1); + samplefunc(image1Reader_, x, y, offset2, color2); + + mul_v4_v4fl(output, color1, weight1); + madd_v4_v4fl(output, color2, weight2); } void SMAANeighborhoodBlendingOperation::update_memory_buffer_partial(MemoryBuffer *output, @@ -794,6 +1108,25 @@ void SMAANeighborhoodBlendingOperation::update_memory_buffer_partial(MemoryBuffe } } +void SMAANeighborhoodBlendingOperation::deinit_execution() +{ + image1Reader_ = nullptr; + image2Reader_ = nullptr; +} + +bool SMAANeighborhoodBlendingOperation::determine_depending_area_of_interest( + rcti *input, ReadBufferOperation *read_operation, rcti *output) +{ + rcti new_input; + + new_input.xmax = input->xmax + 1; + new_input.xmin = input->xmin - 1; + new_input.ymax = input->ymax + 1; + new_input.ymin = input->ymin - 1; + + return NodeOperation::determine_depending_area_of_interest(&new_input, read_operation, output); +} + void SMAANeighborhoodBlendingOperation::get_area_of_interest(const int /*input_idx*/, const rcti &output_area, rcti &r_input_area) diff --git a/source/blender/compositor/operations/COM_SMAAOperation.h b/source/blender/compositor/operations/COM_SMAAOperation.h index 845611705e2..d82346313bd 100644 --- a/source/blender/compositor/operations/COM_SMAAOperation.h +++ b/source/blender/compositor/operations/COM_SMAAOperation.h @@ -13,16 +13,38 @@ namespace blender::compositor { class SMAAEdgeDetectionOperation : public MultiThreadedOperation { protected: + SocketReader *image_reader_; + SocketReader *value_reader_; + float threshold_; float contrast_limit_; public: SMAAEdgeDetectionOperation(); + /** + * the inner loop of this program + */ + virtual void execute_pixel(float output[4], int x, int y, void *data) override; + + /** + * Initialize the execution + */ + void init_execution() override; + + /** + * Deinitialize the execution + */ + void deinit_execution() override; + void set_threshold(float threshold); void set_local_contrast_adaptation_factor(float factor); + bool determine_depending_area_of_interest(rcti *input, + ReadBufferOperation *read_operation, + rcti *output) override; + void get_area_of_interest(int input_idx, const rcti &output_area, rcti &r_input_area) override; void update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, @@ -34,14 +56,35 @@ class SMAAEdgeDetectionOperation : public MultiThreadedOperation { class SMAABlendingWeightCalculationOperation : public MultiThreadedOperation { private: + SocketReader *image_reader_; std::function sample_image_fn_; int corner_rounding_; public: SMAABlendingWeightCalculationOperation(); + /** + * the inner loop of this program + */ + void execute_pixel(float output[4], int x, int y, void *data) override; + + /** + * Initialize the execution + */ + void init_execution() override; + void *initialize_tile_data(rcti *rect) override; + + /** + * Deinitialize the execution + */ + void deinit_execution() override; + void set_corner_rounding(float rounding); + bool determine_depending_area_of_interest(rcti *input, + ReadBufferOperation *read_operation, + rcti *output) override; + void get_area_of_interest(int input_idx, const rcti &output_area, rcti &r_input_area) override; void update_memory_buffer_started(MemoryBuffer *output, const rcti &area, @@ -80,9 +123,33 @@ class SMAABlendingWeightCalculationOperation : public MultiThreadedOperation { /* Neighborhood Blending (Third Pass) */ class SMAANeighborhoodBlendingOperation : public MultiThreadedOperation { + private: + SocketReader *image1Reader_; + SocketReader *image2Reader_; + public: SMAANeighborhoodBlendingOperation(); + /** + * the inner loop of this program + */ + void execute_pixel(float output[4], int x, int y, void *data) override; + + /** + * Initialize the execution + */ + void init_execution() override; + void *initialize_tile_data(rcti *rect) override; + + /** + * Deinitialize the execution + */ + void deinit_execution() override; + + bool determine_depending_area_of_interest(rcti *input, + ReadBufferOperation *read_operation, + rcti *output) override; + void get_area_of_interest(int input_idx, const rcti &output_area, rcti &r_input_area) override; void update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, diff --git a/source/blender/compositor/operations/COM_ScaleOperation.cc b/source/blender/compositor/operations/COM_ScaleOperation.cc index e59f53807ae..3194245a9dd 100644 --- a/source/blender/compositor/operations/COM_ScaleOperation.cc +++ b/source/blender/compositor/operations/COM_ScaleOperation.cc @@ -32,6 +32,9 @@ ScaleOperation::ScaleOperation(DataType data_type) : BaseScaleOperation() this->add_input_socket(DataType::Value); this->add_input_socket(DataType::Value); this->add_output_socket(data_type); + input_operation_ = nullptr; + input_xoperation_ = nullptr; + input_yoperation_ = nullptr; flags_.can_be_constant = true; } @@ -94,6 +97,20 @@ void ScaleOperation::init_data() canvas_center_y_ = canvas_.ymin + get_height() / 2.0f; } +void ScaleOperation::init_execution() +{ + input_operation_ = this->get_input_socket_reader(0); + input_xoperation_ = this->get_input_socket_reader(1); + input_yoperation_ = this->get_input_socket_reader(2); +} + +void ScaleOperation::deinit_execution() +{ + input_operation_ = nullptr; + input_xoperation_ = nullptr; + input_yoperation_ = nullptr; +} + void ScaleOperation::get_scale_offset(const rcti &input_canvas, const rcti &scale_canvas, float &r_scale_offset_x, @@ -177,6 +194,11 @@ void ScaleOperation::update_memory_buffer_partial(MemoryBuffer *output, void ScaleOperation::determine_canvas(const rcti &preferred_area, rcti &r_area) { + if (execution_model_ == eExecutionModel::Tiled) { + NodeOperation::determine_canvas(preferred_area, r_area); + return; + } + const bool image_determined = get_input_socket(IMAGE_INPUT_INDEX)->determine_canvas(preferred_area, r_area); if (image_determined) { @@ -210,11 +232,127 @@ ScaleRelativeOperation::ScaleRelativeOperation() : ScaleOperation() {} ScaleRelativeOperation::ScaleRelativeOperation(DataType data_type) : ScaleOperation(data_type) {} +void ScaleRelativeOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + PixelSampler effective_sampler = get_effective_sampler(sampler); + + float scaleX[4]; + float scaleY[4]; + + input_xoperation_->read_sampled(scaleX, x, y, effective_sampler); + input_yoperation_->read_sampled(scaleY, x, y, effective_sampler); + + const float scx = scaleX[0]; + const float scy = scaleY[0]; + + float nx = this->canvas_center_x_ + (x - this->canvas_center_x_) / scx; + float ny = this->canvas_center_y_ + (y - this->canvas_center_y_) / scy; + input_operation_->read_sampled(output, nx, ny, effective_sampler); +} + +bool ScaleRelativeOperation::determine_depending_area_of_interest( + rcti *input, ReadBufferOperation *read_operation, rcti *output) +{ + rcti new_input; + if (!variable_size_) { + float scaleX[4]; + float scaleY[4]; + + input_xoperation_->read_sampled(scaleX, 0, 0, PixelSampler::Nearest); + input_yoperation_->read_sampled(scaleY, 0, 0, PixelSampler::Nearest); + + const float scx = scaleX[0]; + const float scy = scaleY[0]; + + new_input.xmax = this->canvas_center_x_ + (input->xmax - this->canvas_center_x_) / scx + 1; + new_input.xmin = this->canvas_center_x_ + (input->xmin - this->canvas_center_x_) / scx - 1; + new_input.ymax = this->canvas_center_y_ + (input->ymax - this->canvas_center_y_) / scy + 1; + new_input.ymin = this->canvas_center_y_ + (input->ymin - this->canvas_center_y_) / scy - 1; + } + else { + new_input.xmax = this->get_width(); + new_input.xmin = 0; + new_input.ymax = this->get_height(); + new_input.ymin = 0; + } + return BaseScaleOperation::determine_depending_area_of_interest( + &new_input, read_operation, output); +} + +void ScaleAbsoluteOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + PixelSampler effective_sampler = get_effective_sampler(sampler); + + float scaleX[4]; + float scaleY[4]; + + input_xoperation_->read_sampled(scaleX, x, y, effective_sampler); + input_yoperation_->read_sampled(scaleY, x, y, effective_sampler); + + const float scx = scaleX[0]; /* Target absolute scale. */ + const float scy = scaleY[0]; /* Target absolute scale. */ + + const float width = this->get_width(); + const float height = this->get_height(); + /* Divide. */ + float relative_xscale = scx / width; + float relative_yscale = scy / height; + + float nx = this->canvas_center_x_ + (x - this->canvas_center_x_) / relative_xscale; + float ny = this->canvas_center_y_ + (y - this->canvas_center_y_) / relative_yscale; + + input_operation_->read_sampled(output, nx, ny, effective_sampler); +} + +bool ScaleAbsoluteOperation::determine_depending_area_of_interest( + rcti *input, ReadBufferOperation *read_operation, rcti *output) +{ + rcti new_input; + if (!variable_size_) { + float scaleX[4]; + float scaleY[4]; + + input_xoperation_->read_sampled(scaleX, 0, 0, PixelSampler::Nearest); + input_yoperation_->read_sampled(scaleY, 0, 0, PixelSampler::Nearest); + + const float scx = scaleX[0]; + const float scy = scaleY[0]; + const float width = this->get_width(); + const float height = this->get_height(); + /* Divide. */ + float relateve_xscale = scx / width; + float relateve_yscale = scy / height; + + new_input.xmax = this->canvas_center_x_ + + (input->xmax - this->canvas_center_x_) / relateve_xscale; + new_input.xmin = this->canvas_center_x_ + + (input->xmin - this->canvas_center_x_) / relateve_xscale; + new_input.ymax = this->canvas_center_y_ + + (input->ymax - this->canvas_center_y_) / relateve_yscale; + new_input.ymin = this->canvas_center_y_ + + (input->ymin - this->canvas_center_y_) / relateve_yscale; + } + else { + new_input.xmax = this->get_width(); + new_input.xmin = 0; + new_input.ymax = this->get_height(); + new_input.ymin = 0; + } + return ScaleOperation::determine_depending_area_of_interest(&new_input, read_operation, output); +} + ScaleFixedSizeOperation::ScaleFixedSizeOperation() : BaseScaleOperation() { this->add_input_socket(DataType::Color, ResizeMode::None); this->add_output_socket(DataType::Color); this->set_canvas_input_index(0); + input_operation_ = nullptr; is_offset_ = false; } @@ -257,7 +395,7 @@ void ScaleFixedSizeOperation::init_data(const rcti &input_canvas) const float div = asp_src / asp_dst; rel_x_ /= div; offset_x_ += ((w_src - (w_src * div)) / (w_src / w_dst)) / 2.0f; - if (is_crop_) { + if (is_crop_ && execution_model_ == eExecutionModel::FullFrame) { int fit_width = new_width_ * div; const int added_width = fit_width - new_width_; @@ -270,7 +408,7 @@ void ScaleFixedSizeOperation::init_data(const rcti &input_canvas) const float div = asp_dst / asp_src; rel_y_ /= div; offset_y_ += ((h_src - (h_src * div)) / (h_src / h_dst)) / 2.0f; - if (is_crop_) { + if (is_crop_ && execution_model_ == eExecutionModel::FullFrame) { int fit_height = new_height_ * div; const int added_height = fit_height - new_height_; @@ -285,6 +423,47 @@ void ScaleFixedSizeOperation::init_data(const rcti &input_canvas) /* *** end framing options *** */ } +void ScaleFixedSizeOperation::init_execution() +{ + input_operation_ = this->get_input_socket_reader(0); +} + +void ScaleFixedSizeOperation::deinit_execution() +{ + input_operation_ = nullptr; +} + +void ScaleFixedSizeOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + PixelSampler effective_sampler = get_effective_sampler(sampler); + + if (is_offset_) { + float nx = ((x - offset_x_) * rel_x_); + float ny = ((y - offset_y_) * rel_y_); + input_operation_->read_sampled(output, nx, ny, effective_sampler); + } + else { + input_operation_->read_sampled(output, x * rel_x_, y * rel_y_, effective_sampler); + } +} + +bool ScaleFixedSizeOperation::determine_depending_area_of_interest( + rcti *input, ReadBufferOperation *read_operation, rcti *output) +{ + rcti new_input; + + new_input.xmax = (input->xmax - offset_x_) * rel_x_ + 1; + new_input.xmin = (input->xmin - offset_x_) * rel_x_; + new_input.ymax = (input->ymax - offset_y_) * rel_y_ + 1; + new_input.ymin = (input->ymin - offset_y_) * rel_y_; + + return BaseScaleOperation::determine_depending_area_of_interest( + &new_input, read_operation, output); +} + void ScaleFixedSizeOperation::determine_canvas(const rcti &preferred_area, rcti &r_area) { rcti local_preferred = preferred_area; @@ -296,10 +475,12 @@ void ScaleFixedSizeOperation::determine_canvas(const rcti &preferred_area, rcti if (input_determined) { init_data(input_canvas); r_area = input_canvas; - r_area.xmin /= rel_x_; - r_area.ymin /= rel_y_; - r_area.xmin += offset_x_; - r_area.ymin += offset_y_; + if (execution_model_ == eExecutionModel::FullFrame) { + r_area.xmin /= rel_x_; + r_area.ymin /= rel_y_; + r_area.xmin += offset_x_; + r_area.ymin += offset_y_; + } r_area.xmax = r_area.xmin + new_width_; r_area.ymax = r_area.ymin + new_height_; diff --git a/source/blender/compositor/operations/COM_ScaleOperation.h b/source/blender/compositor/operations/COM_ScaleOperation.h index 254a24b4284..25895ba7a26 100644 --- a/source/blender/compositor/operations/COM_ScaleOperation.h +++ b/source/blender/compositor/operations/COM_ScaleOperation.h @@ -29,6 +29,7 @@ class BaseScaleOperation : public MultiThreadedOperation { } int sampler_; + /* TODO(manzanilla): to be removed with tiled implementation. */ bool variable_size_; }; @@ -41,6 +42,9 @@ class ScaleOperation : public BaseScaleOperation { static constexpr int X_INPUT_INDEX = 1; static constexpr int Y_INPUT_INDEX = 2; + SocketReader *input_operation_; + SocketReader *input_xoperation_; + SocketReader *input_yoperation_; float canvas_center_x_; float canvas_center_y_; @@ -74,6 +78,8 @@ class ScaleOperation : public BaseScaleOperation { static void clamp_area_size_max(rcti &area, Size2f max_size); void init_data() override; + void init_execution() override; + void deinit_execution() override; void get_area_of_interest(int input_idx, const rcti &output_area, rcti &r_input_area) override; void update_memory_buffer_partial(MemoryBuffer *output, @@ -97,6 +103,10 @@ class ScaleRelativeOperation : public ScaleOperation { public: ScaleRelativeOperation(); ScaleRelativeOperation(DataType data_type); + bool determine_depending_area_of_interest(rcti *input, + ReadBufferOperation *read_operation, + rcti *output) override; + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; float get_relative_scale_x_factor(float /*width*/) override { @@ -111,6 +121,11 @@ class ScaleRelativeOperation : public ScaleOperation { class ScaleAbsoluteOperation : public ScaleOperation { public: + bool determine_depending_area_of_interest(rcti *input, + ReadBufferOperation *read_operation, + rcti *output) override; + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + float get_relative_scale_x_factor(float width) override { return 1.0f / width; @@ -123,6 +138,7 @@ class ScaleAbsoluteOperation : public ScaleOperation { }; class ScaleFixedSizeOperation : public BaseScaleOperation { + SocketReader *input_operation_; int new_width_; int new_height_; float rel_x_; @@ -140,8 +156,14 @@ class ScaleFixedSizeOperation : public BaseScaleOperation { public: /** Absolute fixed size. */ ScaleFixedSizeOperation(); + bool determine_depending_area_of_interest(rcti *input, + ReadBufferOperation *read_operation, + rcti *output) override; void determine_canvas(const rcti &preferred_area, rcti &r_area) override; + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + void init_execution() override; + void deinit_execution() override; void set_new_width(int width) { new_width_ = width; diff --git a/source/blender/compositor/operations/COM_ScreenLensDistortionOperation.cc b/source/blender/compositor/operations/COM_ScreenLensDistortionOperation.cc index 9d9c5f92bae..488b7c2fb9f 100644 --- a/source/blender/compositor/operations/COM_ScreenLensDistortionOperation.cc +++ b/source/blender/compositor/operations/COM_ScreenLensDistortionOperation.cc @@ -17,7 +17,9 @@ ScreenLensDistortionOperation::ScreenLensDistortionOperation() this->add_input_socket(DataType::Value); this->add_input_socket(DataType::Value); this->add_output_socket(DataType::Color); + flags_.complex = true; flags_.can_be_constant = true; + input_program_ = nullptr; distortion_ = 0.0f; dispersion_ = 0.0f; distortion_const_ = false; @@ -42,26 +44,71 @@ void ScreenLensDistortionOperation::init_data() cx_ = 0.5f * float(get_width()); cy_ = 0.5f * float(get_height()); - NodeOperation *distortion_op = get_input_operation(1); - NodeOperation *dispersion_op = get_input_operation(2); - if (!distortion_const_ && distortion_op->get_flags().is_constant_operation) { - distortion_ = static_cast(distortion_op)->get_constant_elem()[0]; + switch (execution_model_) { + case eExecutionModel::FullFrame: { + NodeOperation *distortion_op = get_input_operation(1); + NodeOperation *dispersion_op = get_input_operation(2); + if (!distortion_const_ && distortion_op->get_flags().is_constant_operation) { + distortion_ = static_cast(distortion_op)->get_constant_elem()[0]; + } + if (!dispersion_const_ && distortion_op->get_flags().is_constant_operation) { + dispersion_ = static_cast(dispersion_op)->get_constant_elem()[0]; + } + update_variables(distortion_, dispersion_); + break; + } + case eExecutionModel::Tiled: { + /* If both are constant, init variables once. */ + if (distortion_const_ && dispersion_const_) { + update_variables(distortion_, dispersion_); + variables_ready_ = true; + } + break; + } } - if (!dispersion_const_ && distortion_op->get_flags().is_constant_operation) { - dispersion_ = static_cast(dispersion_op)->get_constant_elem()[0]; - } - update_variables(distortion_, dispersion_); } void ScreenLensDistortionOperation::init_execution() { - SocketReader *input_reader = this->get_input_socket_reader(0); + input_program_ = this->get_input_socket_reader(0); + this->init_mutex(); - uint rng_seed = uint(BLI_time_now_seconds_i() & UINT_MAX); - rng_seed ^= uint(POINTER_AS_INT(input_reader)); + uint rng_seed = uint(BLI_check_seconds_timer_i() & UINT_MAX); + rng_seed ^= uint(POINTER_AS_INT(input_program_)); rng_ = BLI_rng_new(rng_seed); } +void *ScreenLensDistortionOperation::initialize_tile_data(rcti * /*rect*/) +{ + void *buffer = input_program_->initialize_tile_data(nullptr); + + /* get distortion/dispersion values once, by reading inputs at (0,0) + * XXX this assumes invariable values (no image inputs), + * we don't have a nice generic system for that yet + */ + if (!variables_ready_) { + this->lock_mutex(); + + if (!distortion_const_) { + float result[4]; + get_input_socket_reader(1)->read_sampled(result, 0, 0, PixelSampler::Nearest); + distortion_ = result[0]; + } + if (!dispersion_const_) { + float result[4]; + get_input_socket_reader(2)->read_sampled(result, 0, 0, PixelSampler::Nearest); + dispersion_ = result[0]; + } + + update_variables(distortion_, dispersion_); + variables_ready_ = true; + + this->unlock_mutex(); + } + + return buffer; +} + void ScreenLensDistortionOperation::get_uv(const float xy[2], float uv[2]) const { uv[0] = sc_ * ((xy[0] + 0.5f) - cx_) / cx_; @@ -113,7 +160,14 @@ void ScreenLensDistortionOperation::accumulate(const MemoryBuffer *buffer, float xy[2]; distort_uv(uv, t, xy); - buffer->read_elem_bilinear(xy[0], xy[1], color); + switch (execution_model_) { + case eExecutionModel::Tiled: + buffer->read_bilinear(color, xy[0], xy[1]); + break; + case eExecutionModel::FullFrame: + buffer->read_elem_bilinear(xy[0], xy[1], color); + break; + } sum[a] += (1.0f - tz) * color[a]; sum[b] += (tz)*color[b]; @@ -122,8 +176,48 @@ void ScreenLensDistortionOperation::accumulate(const MemoryBuffer *buffer, } } +void ScreenLensDistortionOperation::execute_pixel(float output[4], int x, int y, void *data) +{ + MemoryBuffer *buffer = (MemoryBuffer *)data; + float xy[2] = {float(x), float(y)}; + float uv[2]; + get_uv(xy, uv); + float uv_dot = len_squared_v2(uv); + + int count[3] = {0, 0, 0}; + float delta[3][2]; + float sum[4] = {0, 0, 0, 0}; + + bool valid_r = get_delta(uv_dot, k4_[0], uv, delta[0]); + bool valid_g = get_delta(uv_dot, k4_[1], uv, delta[1]); + bool valid_b = get_delta(uv_dot, k4_[2], uv, delta[2]); + + if (valid_r && valid_g && valid_b) { + accumulate(buffer, 0, 1, uv_dot, uv, delta, sum, count); + accumulate(buffer, 1, 2, uv_dot, uv, delta, sum, count); + + if (count[0]) { + output[0] = 2.0f * sum[0] / float(count[0]); + } + if (count[1]) { + output[1] = 2.0f * sum[1] / float(count[1]); + } + if (count[2]) { + output[2] = 2.0f * sum[2] / float(count[2]); + } + + /* set alpha */ + output[3] = 1.0f; + } + else { + zero_v4(output); + } +} + void ScreenLensDistortionOperation::deinit_execution() { + this->deinit_mutex(); + input_program_ = nullptr; BLI_rng_free(rng_); } @@ -142,6 +236,121 @@ void ScreenLensDistortionOperation::determineUV(float result[6], float x, float get_delta(uv_dot, k4_[2], uv, result + 4); } +bool ScreenLensDistortionOperation::determine_depending_area_of_interest( + rcti * /*input*/, ReadBufferOperation *read_operation, rcti *output) +{ + rcti new_input_value; + new_input_value.xmin = 0; + new_input_value.ymin = 0; + new_input_value.xmax = 2; + new_input_value.ymax = 2; + + NodeOperation *operation = get_input_operation(1); + if (operation->determine_depending_area_of_interest(&new_input_value, read_operation, output)) { + return true; + } + + operation = get_input_operation(2); + if (operation->determine_depending_area_of_interest(&new_input_value, read_operation, output)) { + return true; + } + + /* XXX the original method of estimating the area-of-interest does not work + * it assumes a linear increase/decrease of mapped coordinates, which does not + * yield correct results for the area and leaves uninitialized buffer areas. + * So now just use the full image area, which may not be as efficient but works at least ... + */ +#if 1 + rcti image_input; + + operation = get_input_operation(0); + image_input.xmax = operation->get_width(); + image_input.xmin = 0; + image_input.ymax = operation->get_height(); + image_input.ymin = 0; + + if (operation->determine_depending_area_of_interest(&image_input, read_operation, output)) { + return true; + } + return false; +#else + rcti new_input; + const float margin = 2; + + BLI_rcti_init_minmax(&new_input); + + if (dispersion_const_ && distortion_const_) { + /* update from fixed distortion/dispersion */ +# define UPDATE_INPUT(x, y) \ + { \ + float coords[6]; \ + determineUV(coords, x, y); \ + new_input.xmin = min_ffff(new_input.xmin, coords[0], coords[2], coords[4]); \ + new_input.ymin = min_ffff(new_input.ymin, coords[1], coords[3], coords[5]); \ + new_input.xmax = max_ffff(new_input.xmax, coords[0], coords[2], coords[4]); \ + new_input.ymax = max_ffff(new_input.ymax, coords[1], coords[3], coords[5]); \ + } \ + (void)0 + + UPDATE_INPUT(input->xmin, input->xmax); + UPDATE_INPUT(input->xmin, input->ymax); + UPDATE_INPUT(input->xmax, input->ymax); + UPDATE_INPUT(input->xmax, input->ymin); + +# undef UPDATE_INPUT + } + else { + /* use maximum dispersion 1.0 if not const */ + float dispersion = dispersion_const_ ? dispersion_ : 1.0f; + +# define UPDATE_INPUT(x, y, distortion) \ + { \ + float coords[6]; \ + update_variables(distortion, dispersion); \ + determineUV(coords, x, y); \ + new_input.xmin = min_ffff(new_input.xmin, coords[0], coords[2], coords[4]); \ + new_input.ymin = min_ffff(new_input.ymin, coords[1], coords[3], coords[5]); \ + new_input.xmax = max_ffff(new_input.xmax, coords[0], coords[2], coords[4]); \ + new_input.ymax = max_ffff(new_input.ymax, coords[1], coords[3], coords[5]); \ + } \ + (void)0 + + if (distortion_const_) { + /* update from fixed distortion */ + UPDATE_INPUT(input->xmin, input->xmax, distortion_); + UPDATE_INPUT(input->xmin, input->ymax, distortion_); + UPDATE_INPUT(input->xmax, input->ymax, distortion_); + UPDATE_INPUT(input->xmax, input->ymin, distortion_); + } + else { + /* update from min/max distortion (-1..1) */ + UPDATE_INPUT(input->xmin, input->xmax, -1.0f); + UPDATE_INPUT(input->xmin, input->ymax, -1.0f); + UPDATE_INPUT(input->xmax, input->ymax, -1.0f); + UPDATE_INPUT(input->xmax, input->ymin, -1.0f); + + UPDATE_INPUT(input->xmin, input->xmax, 1.0f); + UPDATE_INPUT(input->xmin, input->ymax, 1.0f); + UPDATE_INPUT(input->xmax, input->ymax, 1.0f); + UPDATE_INPUT(input->xmax, input->ymin, 1.0f); + +# undef UPDATE_INPUT + } + } + + new_input.xmin -= margin; + new_input.ymin -= margin; + new_input.xmax += margin; + new_input.ymax += margin; + + operation = get_input_operation(0); + if (operation->determine_depending_area_of_interest(&new_input, read_operation, output)) { + return true; + } + return false; +#endif +} + void ScreenLensDistortionOperation::update_variables(float distortion, float dispersion) { k_[1] = max_ff(min_ff(distortion, 1.0f), -0.999f); @@ -160,10 +369,17 @@ void ScreenLensDistortionOperation::update_variables(float distortion, float dis void ScreenLensDistortionOperation::determine_canvas(const rcti &preferred_area, rcti &r_area) { - set_determined_canvas_modifier([=](rcti &canvas) { - /* Ensure screen space. */ - BLI_rcti_translate(&canvas, -canvas.xmin, -canvas.ymin); - }); + switch (execution_model_) { + case eExecutionModel::FullFrame: { + set_determined_canvas_modifier([=](rcti &canvas) { + /* Ensure screen space. */ + BLI_rcti_translate(&canvas, -canvas.xmin, -canvas.ymin); + }); + break; + } + default: + break; + } NodeOperation::determine_canvas(preferred_area, r_area); } @@ -182,8 +398,86 @@ void ScreenLensDistortionOperation::get_area_of_interest(const int input_idx, * yield correct results for the area and leaves uninitialized buffer areas. * So now just use the full image area, which may not be as efficient but works at least ... */ +#if 1 NodeOperation *image = get_input_operation(0); r_input_area = image->get_canvas(); + +#else /* Original method in tiled implementation. */ + rcti new_input; + const float margin = 2; + + BLI_rcti_init_minmax(&new_input); + + if (dispersion_const_ && distortion_const_) { + /* update from fixed distortion/dispersion */ +# define UPDATE_INPUT(x, y) \ + { \ + float coords[6]; \ + determineUV(coords, x, y); \ + new_input.xmin = min_ffff(new_input.xmin, coords[0], coords[2], coords[4]); \ + new_input.ymin = min_ffff(new_input.ymin, coords[1], coords[3], coords[5]); \ + new_input.xmax = max_ffff(new_input.xmax, coords[0], coords[2], coords[4]); \ + new_input.ymax = max_ffff(new_input.ymax, coords[1], coords[3], coords[5]); \ + } \ + (void)0 + + UPDATE_INPUT(input->xmin, input->xmax); + UPDATE_INPUT(input->xmin, input->ymax); + UPDATE_INPUT(input->xmax, input->ymax); + UPDATE_INPUT(input->xmax, input->ymin); + +# undef UPDATE_INPUT + } + else { + /* use maximum dispersion 1.0 if not const */ + float dispersion = dispersion_const_ ? dispersion_ : 1.0f; + +# define UPDATE_INPUT(x, y, distortion) \ + { \ + float coords[6]; \ + update_variables(distortion, dispersion); \ + determineUV(coords, x, y); \ + new_input.xmin = min_ffff(new_input.xmin, coords[0], coords[2], coords[4]); \ + new_input.ymin = min_ffff(new_input.ymin, coords[1], coords[3], coords[5]); \ + new_input.xmax = max_ffff(new_input.xmax, coords[0], coords[2], coords[4]); \ + new_input.ymax = max_ffff(new_input.ymax, coords[1], coords[3], coords[5]); \ + } \ + (void)0 + + if (distortion_const_) { + /* update from fixed distortion */ + UPDATE_INPUT(input->xmin, input->xmax, distortion_); + UPDATE_INPUT(input->xmin, input->ymax, distortion_); + UPDATE_INPUT(input->xmax, input->ymax, distortion_); + UPDATE_INPUT(input->xmax, input->ymin, distortion_); + } + else { + /* update from min/max distortion (-1..1) */ + UPDATE_INPUT(input->xmin, input->xmax, -1.0f); + UPDATE_INPUT(input->xmin, input->ymax, -1.0f); + UPDATE_INPUT(input->xmax, input->ymax, -1.0f); + UPDATE_INPUT(input->xmax, input->ymin, -1.0f); + + UPDATE_INPUT(input->xmin, input->xmax, 1.0f); + UPDATE_INPUT(input->xmin, input->ymax, 1.0f); + UPDATE_INPUT(input->xmax, input->ymax, 1.0f); + UPDATE_INPUT(input->xmax, input->ymin, 1.0f); + +# undef UPDATE_INPUT + } + } + + new_input.xmin -= margin; + new_input.ymin -= margin; + new_input.xmax += margin; + new_input.ymax += margin; + + operation = get_input_operation(0); + if (operation->determine_depending_area_of_interest(&new_input, read_operation, output)) { + return true; + } + return false; +#endif } void ScreenLensDistortionOperation::update_memory_buffer_partial(MemoryBuffer *output, diff --git a/source/blender/compositor/operations/COM_ScreenLensDistortionOperation.h b/source/blender/compositor/operations/COM_ScreenLensDistortionOperation.h index c261c37d39e..18f49fe6ffd 100644 --- a/source/blender/compositor/operations/COM_ScreenLensDistortionOperation.h +++ b/source/blender/compositor/operations/COM_ScreenLensDistortionOperation.h @@ -13,6 +13,10 @@ namespace blender::compositor { class ScreenLensDistortionOperation : public MultiThreadedOperation { private: + /** + * Cached reference to the input_program + */ + SocketReader *input_program_; struct RNG *rng_; bool fit_; @@ -34,7 +38,20 @@ class ScreenLensDistortionOperation : public MultiThreadedOperation { void init_data() override; + /** + * The inner loop of this operation. + */ + void execute_pixel(float output[4], int x, int y, void *data) override; + + /** + * Initialize the execution + */ void init_execution() override; + + void *initialize_tile_data(rcti *rect) override; + /** + * Deinitialize the execution + */ void deinit_execution() override; void set_fit(bool fit) @@ -51,6 +68,10 @@ class ScreenLensDistortionOperation : public MultiThreadedOperation { /** Set constant dispersion value */ void set_dispersion(float dispersion); + bool determine_depending_area_of_interest(rcti *input, + ReadBufferOperation *read_operation, + rcti *output) override; + void determine_canvas(const rcti &preferred_area, rcti &r_area) override; void get_area_of_interest(int input_idx, const rcti &output_area, rcti &r_input_area) override; void update_memory_buffer_partial(MemoryBuffer *output, diff --git a/source/blender/compositor/operations/COM_SetAlphaMultiplyOperation.cc b/source/blender/compositor/operations/COM_SetAlphaMultiplyOperation.cc index 7d26407ce42..5d036d273ca 100644 --- a/source/blender/compositor/operations/COM_SetAlphaMultiplyOperation.cc +++ b/source/blender/compositor/operations/COM_SetAlphaMultiplyOperation.cc @@ -12,9 +12,37 @@ SetAlphaMultiplyOperation::SetAlphaMultiplyOperation() this->add_input_socket(DataType::Value); this->add_output_socket(DataType::Color); + input_color_ = nullptr; + input_alpha_ = nullptr; flags_.can_be_constant = true; } +void SetAlphaMultiplyOperation::init_execution() +{ + input_color_ = get_input_socket_reader(0); + input_alpha_ = get_input_socket_reader(1); +} + +void SetAlphaMultiplyOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float color_input[4]; + float alpha_input[4]; + + input_color_->read_sampled(color_input, x, y, sampler); + input_alpha_->read_sampled(alpha_input, x, y, sampler); + + mul_v4_v4fl(output, color_input, alpha_input[0]); +} + +void SetAlphaMultiplyOperation::deinit_execution() +{ + input_color_ = nullptr; + input_alpha_ = nullptr; +} + void SetAlphaMultiplyOperation::update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span inputs) diff --git a/source/blender/compositor/operations/COM_SetAlphaMultiplyOperation.h b/source/blender/compositor/operations/COM_SetAlphaMultiplyOperation.h index b1eb1b51b9c..b29a8f36e5f 100644 --- a/source/blender/compositor/operations/COM_SetAlphaMultiplyOperation.h +++ b/source/blender/compositor/operations/COM_SetAlphaMultiplyOperation.h @@ -14,9 +14,18 @@ namespace blender::compositor { * `output color.rgba = input color.rgba * input alpha` */ class SetAlphaMultiplyOperation : public MultiThreadedOperation { + private: + SocketReader *input_color_; + SocketReader *input_alpha_; + public: SetAlphaMultiplyOperation(); + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + + void init_execution() override; + void deinit_execution() override; + void update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span inputs) override; diff --git a/source/blender/compositor/operations/COM_SetAlphaReplaceOperation.cc b/source/blender/compositor/operations/COM_SetAlphaReplaceOperation.cc index d0c12c251a7..fa5817a31fc 100644 --- a/source/blender/compositor/operations/COM_SetAlphaReplaceOperation.cc +++ b/source/blender/compositor/operations/COM_SetAlphaReplaceOperation.cc @@ -12,9 +12,35 @@ SetAlphaReplaceOperation::SetAlphaReplaceOperation() this->add_input_socket(DataType::Value); this->add_output_socket(DataType::Color); + input_color_ = nullptr; + input_alpha_ = nullptr; flags_.can_be_constant = true; } +void SetAlphaReplaceOperation::init_execution() +{ + input_color_ = get_input_socket_reader(0); + input_alpha_ = get_input_socket_reader(1); +} + +void SetAlphaReplaceOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float alpha_input[4]; + + input_color_->read_sampled(output, x, y, sampler); + input_alpha_->read_sampled(alpha_input, x, y, sampler); + output[3] = alpha_input[0]; +} + +void SetAlphaReplaceOperation::deinit_execution() +{ + input_color_ = nullptr; + input_alpha_ = nullptr; +} + void SetAlphaReplaceOperation::update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span inputs) diff --git a/source/blender/compositor/operations/COM_SetAlphaReplaceOperation.h b/source/blender/compositor/operations/COM_SetAlphaReplaceOperation.h index 899b056bffa..fd3cfed84dd 100644 --- a/source/blender/compositor/operations/COM_SetAlphaReplaceOperation.h +++ b/source/blender/compositor/operations/COM_SetAlphaReplaceOperation.h @@ -13,9 +13,24 @@ namespace blender::compositor { * it assumes we are in sRGB color space. */ class SetAlphaReplaceOperation : public MultiThreadedOperation { + private: + SocketReader *input_color_; + SocketReader *input_alpha_; + public: + /** + * Default constructor + */ SetAlphaReplaceOperation(); + /** + * the inner loop of this program + */ + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + + void init_execution() override; + void deinit_execution() override; + void update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span inputs) override; diff --git a/source/blender/compositor/operations/COM_SetColorOperation.cc b/source/blender/compositor/operations/COM_SetColorOperation.cc index 8897f6b7d5c..c9c54a4324c 100644 --- a/source/blender/compositor/operations/COM_SetColorOperation.cc +++ b/source/blender/compositor/operations/COM_SetColorOperation.cc @@ -12,6 +12,14 @@ SetColorOperation::SetColorOperation() flags_.is_set_operation = true; } +void SetColorOperation::execute_pixel_sampled(float output[4], + float /*x*/, + float /*y*/, + PixelSampler /*sampler*/) +{ + copy_v4_v4(output, color_); +} + void SetColorOperation::determine_canvas(const rcti &preferred_area, rcti &r_area) { r_area = preferred_area; diff --git a/source/blender/compositor/operations/COM_SetColorOperation.h b/source/blender/compositor/operations/COM_SetColorOperation.h index 30a9774a9bc..13ab49cbe73 100644 --- a/source/blender/compositor/operations/COM_SetColorOperation.h +++ b/source/blender/compositor/operations/COM_SetColorOperation.h @@ -64,6 +64,11 @@ class SetColorOperation : public ConstantOperation { copy_v4_v4(color_, value); } + /** + * The inner loop of this operation. + */ + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + void determine_canvas(const rcti &preferred_area, rcti &r_area) override; }; diff --git a/source/blender/compositor/operations/COM_SetSamplerOperation.cc b/source/blender/compositor/operations/COM_SetSamplerOperation.cc index c1fc0793d8d..78c283c9706 100644 --- a/source/blender/compositor/operations/COM_SetSamplerOperation.cc +++ b/source/blender/compositor/operations/COM_SetSamplerOperation.cc @@ -12,4 +12,21 @@ SetSamplerOperation::SetSamplerOperation() this->add_output_socket(DataType::Color); } +void SetSamplerOperation::init_execution() +{ + reader_ = this->get_input_socket_reader(0); +} +void SetSamplerOperation::deinit_execution() +{ + reader_ = nullptr; +} + +void SetSamplerOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler /*sampler*/) +{ + reader_->read_sampled(output, x, y, sampler_); +} + } // namespace blender::compositor diff --git a/source/blender/compositor/operations/COM_SetSamplerOperation.h b/source/blender/compositor/operations/COM_SetSamplerOperation.h index 17e28bd3006..87b96995c74 100644 --- a/source/blender/compositor/operations/COM_SetSamplerOperation.h +++ b/source/blender/compositor/operations/COM_SetSamplerOperation.h @@ -15,14 +15,25 @@ namespace blender::compositor { class SetSamplerOperation : public NodeOperation { private: PixelSampler sampler_; + SocketReader *reader_; public: + /** + * Default constructor + */ SetSamplerOperation(); void set_sampler(PixelSampler sampler) { sampler_ = sampler; } + + /** + * The inner loop of this operation. + */ + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + void init_execution() override; + void deinit_execution() override; }; } // namespace blender::compositor diff --git a/source/blender/compositor/operations/COM_SetValueOperation.cc b/source/blender/compositor/operations/COM_SetValueOperation.cc index 79f04b1eb1a..237bab490ce 100644 --- a/source/blender/compositor/operations/COM_SetValueOperation.cc +++ b/source/blender/compositor/operations/COM_SetValueOperation.cc @@ -12,6 +12,14 @@ SetValueOperation::SetValueOperation() flags_.is_set_operation = true; } +void SetValueOperation::execute_pixel_sampled(float output[4], + float /*x*/, + float /*y*/, + PixelSampler /*sampler*/) +{ + output[0] = value_; +} + void SetValueOperation::determine_canvas(const rcti &preferred_area, rcti &r_area) { r_area = preferred_area; diff --git a/source/blender/compositor/operations/COM_SetValueOperation.h b/source/blender/compositor/operations/COM_SetValueOperation.h index 9f503ab9d17..9d075c565b4 100644 --- a/source/blender/compositor/operations/COM_SetValueOperation.h +++ b/source/blender/compositor/operations/COM_SetValueOperation.h @@ -36,6 +36,11 @@ class SetValueOperation : public ConstantOperation { value_ = value; } + /** + * The inner loop of this operation. + */ + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + void determine_canvas(const rcti &preferred_area, rcti &r_area) override; }; diff --git a/source/blender/compositor/operations/COM_SetVectorOperation.cc b/source/blender/compositor/operations/COM_SetVectorOperation.cc index 557f3a94ba4..1d71833c8e7 100644 --- a/source/blender/compositor/operations/COM_SetVectorOperation.cc +++ b/source/blender/compositor/operations/COM_SetVectorOperation.cc @@ -12,6 +12,16 @@ SetVectorOperation::SetVectorOperation() flags_.is_set_operation = true; } +void SetVectorOperation::execute_pixel_sampled(float output[4], + float /*x*/, + float /*y*/, + PixelSampler /*sampler*/) +{ + output[0] = vector_.x; + output[1] = vector_.y; + output[2] = vector_.z; +} + void SetVectorOperation::determine_canvas(const rcti &preferred_area, rcti &r_area) { r_area = preferred_area; diff --git a/source/blender/compositor/operations/COM_SetVectorOperation.h b/source/blender/compositor/operations/COM_SetVectorOperation.h index d91ca9a894e..9ae9366afc0 100644 --- a/source/blender/compositor/operations/COM_SetVectorOperation.h +++ b/source/blender/compositor/operations/COM_SetVectorOperation.h @@ -65,6 +65,11 @@ class SetVectorOperation : public ConstantOperation { vector_.w = value; } + /** + * The inner loop of this operation. + */ + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + void determine_canvas(const rcti &preferred_area, rcti &r_area) override; void set_vector(const float vector[3]) diff --git a/source/blender/compositor/operations/COM_SplitOperation.cc b/source/blender/compositor/operations/COM_SplitOperation.cc index add20b80844..033dea840e7 100644 --- a/source/blender/compositor/operations/COM_SplitOperation.cc +++ b/source/blender/compositor/operations/COM_SplitOperation.cc @@ -11,10 +11,41 @@ SplitOperation::SplitOperation() this->add_input_socket(DataType::Color); this->add_input_socket(DataType::Color); this->add_output_socket(DataType::Color); + image1Input_ = nullptr; + image2Input_ = nullptr; flags_.can_be_constant = true; } +void SplitOperation::init_execution() +{ + /* When initializing the tree during initial load the width and height can be zero. */ + image1Input_ = get_input_socket_reader(0); + image2Input_ = get_input_socket_reader(1); +} + +void SplitOperation::deinit_execution() +{ + image1Input_ = nullptr; + image2Input_ = nullptr; +} + +void SplitOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler /*sampler*/) +{ + int perc = x_split_ ? split_percentage_ * this->get_width() / 100.0f : + split_percentage_ * this->get_height() / 100.0f; + bool image1 = x_split_ ? x >= perc : y >= perc; + if (image1) { + image1Input_->read_sampled(output, x, y, PixelSampler::Nearest); + } + else { + image2Input_->read_sampled(output, x, y, PixelSampler::Nearest); + } +} + void SplitOperation::determine_canvas(const rcti &preferred_area, rcti &r_area) { rcti unused_area = COM_AREA_NONE; diff --git a/source/blender/compositor/operations/COM_SplitOperation.h b/source/blender/compositor/operations/COM_SplitOperation.h index ff5ea9e4683..16b6389b591 100644 --- a/source/blender/compositor/operations/COM_SplitOperation.h +++ b/source/blender/compositor/operations/COM_SplitOperation.h @@ -10,11 +10,17 @@ namespace blender::compositor { class SplitOperation : public MultiThreadedOperation { private: + SocketReader *image1Input_; + SocketReader *image2Input_; + float split_percentage_; bool x_split_; public: SplitOperation(); + void init_execution() override; + void deinit_execution() override; + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; void determine_canvas(const rcti &preferred_area, rcti &r_area) override; void set_split_percentage(float split_percentage) { diff --git a/source/blender/compositor/operations/COM_SummedAreaTableOperation.cc b/source/blender/compositor/operations/COM_SummedAreaTableOperation.cc index 276d120da1e..f96ab032d64 100644 --- a/source/blender/compositor/operations/COM_SummedAreaTableOperation.cc +++ b/source/blender/compositor/operations/COM_SummedAreaTableOperation.cc @@ -17,9 +17,38 @@ SummedAreaTableOperation::SummedAreaTableOperation() mode_ = eMode::Identity; + this->flags_.is_fullframe_operation = true; this->flags_.can_be_constant = true; } +void SummedAreaTableOperation::init_execution() +{ + SingleThreadedOperation::init_execution(); + image_reader_ = this->get_input_socket_reader(0); +} + +void SummedAreaTableOperation::deinit_execution() +{ + image_reader_ = nullptr; + SingleThreadedOperation::deinit_execution(); +} + +bool SummedAreaTableOperation::determine_depending_area_of_interest( + rcti * /*input*/, ReadBufferOperation *read_operation, rcti *output) +{ + rcti image_input; + + NodeOperation *operation = get_input_operation(0); + image_input.xmax = operation->get_width(); + image_input.xmin = 0; + image_input.ymax = operation->get_height(); + image_input.ymin = 0; + if (operation->determine_depending_area_of_interest(&image_input, read_operation, output)) { + return true; + } + return false; +} + void SummedAreaTableOperation::get_area_of_interest(int input_idx, const rcti & /*output_area*/, rcti &r_input_area) @@ -61,6 +90,41 @@ void SummedAreaTableOperation::update_memory_buffer(MemoryBuffer *output, }); } +MemoryBuffer *SummedAreaTableOperation::create_memory_buffer(rcti *area) +{ + /* Note: although this is a single threaded call, multithreading is used. */ + MemoryBuffer *output = new MemoryBuffer(DataType::Color, *area); + + /* First pass: copy input to output and sum horizontally. */ + threading::parallel_for( + IndexRange(area->ymin, area->ymax - area->ymin), 1, [&](const IndexRange range_y) { + for (const int y : range_y) { + float4 accumulated_color = float4(0.0f); + for (const int x : IndexRange(area->xmin, area->xmax - area->xmin)) { + float4 color; + image_reader_->read(&color.x, x, y, nullptr); + accumulated_color += mode_ == eMode::Squared ? color * color : color; + copy_v4_v4(output->get_elem(x, y), accumulated_color); + } + } + }); + + /* Second pass: vertical sum. */ + threading::parallel_for( + IndexRange(area->xmin, area->xmax - area->xmin), 1, [&](const IndexRange range_x) { + for (const int x : range_x) { + float4 accumulated_color = float4(0.0f); + for (const int y : IndexRange(area->ymin, area->ymax - area->ymin)) { + + accumulated_color += float4(output->get_elem(x, y)); + copy_v4_v4(output->get_elem(x, y), accumulated_color); + } + } + }); + + return output; +} + void SummedAreaTableOperation::set_mode(eMode mode) { mode_ = mode; @@ -71,6 +135,52 @@ SummedAreaTableOperation::eMode SummedAreaTableOperation::get_mode() return mode_; } +float4 summed_area_table_sum_tiled(SocketReader *buffer, const rcti &area) +{ + /* + * a, b, c and d are the bounding box of the given area. They are defined as follows: + * + * y + * â–² + * │ + * ├──────x───────x + * │ │c d│ + * ├──────x───────x + * │ │a b│ + * └──────┴───────┴──────► x + * + * Note: this is the same definition as in https://en.wikipedia.org/wiki/Summed-area_table + * but using the blender convention with the origin being at the lower left. + */ + + BLI_assert(area.xmin <= area.xmax && area.ymin <= area.ymax); + + int2 lower_bound(area.xmin, area.ymin); + int2 upper_bound(area.xmax, area.ymax); + + int2 corrected_lower_bound = lower_bound - int2(1, 1); + int2 corrected_upper_bound; + corrected_upper_bound[0] = math::min(int(buffer->get_width()) - 1, upper_bound[0]); + corrected_upper_bound[1] = math::min(int(buffer->get_height()) - 1, upper_bound[1]); + + float4 a, b, c, d, addend, substrahend; + buffer->read_sampled( + &a.x, corrected_upper_bound[0], corrected_upper_bound[1], PixelSampler::Nearest); + buffer->read_sampled( + &d.x, corrected_lower_bound[0], corrected_lower_bound[1], PixelSampler::Nearest); + addend = a + d; + + buffer->read_sampled( + &b.x, corrected_lower_bound[0], corrected_upper_bound[1], PixelSampler::Nearest); + buffer->read_sampled( + &c.x, corrected_upper_bound[0], corrected_lower_bound[1], PixelSampler::Nearest); + substrahend = b + c; + + float4 sum = addend - substrahend; + + return sum; +} + float4 summed_area_table_sum(MemoryBuffer *buffer, const rcti &area) { /* diff --git a/source/blender/compositor/operations/COM_SummedAreaTableOperation.h b/source/blender/compositor/operations/COM_SummedAreaTableOperation.h index 37bab63478a..e4766a56740 100644 --- a/source/blender/compositor/operations/COM_SummedAreaTableOperation.h +++ b/source/blender/compositor/operations/COM_SummedAreaTableOperation.h @@ -4,14 +4,14 @@ #pragma once -#include "COM_NodeOperation.h" +#include "COM_SingleThreadedOperation.h" namespace blender::compositor { /** * \brief SummedAreaTableOperation class computes the summed area table. */ -class SummedAreaTableOperation : public NodeOperation { +class SummedAreaTableOperation : public SingleThreadedOperation { public: SummedAreaTableOperation(); @@ -21,18 +21,36 @@ class SummedAreaTableOperation : public NodeOperation { void set_mode(const eMode mode); eMode get_mode(); + /** + * Initialize the execution + */ + void init_execution() override; + + /** + * Deinitialize the execution + */ + void deinit_execution() override; + + bool determine_depending_area_of_interest(rcti *input, + ReadBufferOperation *read_operation, + rcti *output) override; + void get_area_of_interest(int input_idx, const rcti &output_area, rcti &r_input_area) override; + MemoryBuffer *create_memory_buffer(rcti *rect) override; + void update_memory_buffer(MemoryBuffer *output, const rcti &area, Span inputs) override; private: + SocketReader *image_reader_; eMode mode_; }; /* Computes the sum of the rectangular region defined by the given area from the * given summed area table. All coordinates within the area are included. */ float4 summed_area_table_sum(MemoryBuffer *buffer, const rcti &area); +float4 summed_area_table_sum_tiled(SocketReader *buffer, const rcti &area); } // namespace blender::compositor diff --git a/source/blender/compositor/operations/COM_SunBeamsOperation.cc b/source/blender/compositor/operations/COM_SunBeamsOperation.cc index 1449df2393c..b519ecb7e0e 100644 --- a/source/blender/compositor/operations/COM_SunBeamsOperation.cc +++ b/source/blender/compositor/operations/COM_SunBeamsOperation.cc @@ -18,6 +18,65 @@ SunBeamsOperation::SunBeamsOperation() this->add_input_socket(DataType::Color); this->add_output_socket(DataType::Color); this->set_canvas_input_index(0); + + flags_.complex = true; +} + +void SunBeamsOperation::init_execution() +{ + input_program_ = this->get_input_socket_reader(0); +} + +void SunBeamsOperation::execute_pixel(float output[4], int x, int y, void * /* data */) +{ + const float2 input_size = float2(input_program_->get_width(), input_program_->get_height()); + const int max_steps = int(data_.ray_length * math::length(input_size)); + const float2 source = float2(data_.source); + + const float2 texel = float2(x, y); + + /* The number of steps is the distance in pixels from the source to the current texel. With + * at least a single step and at most the user specified maximum ray length, which is + * proportional to the diagonal pixel count. */ + const float unbounded_steps = math::max(1.0f, math::distance(texel, source * input_size)); + const int steps = math::min(max_steps, int(unbounded_steps)); + + /* We integrate from the current pixel to the source pixel, so compute the start coordinates + * and step vector in the direction to source. Notice that the step vector is still computed + * from the unbounded steps, such that the total integration length becomes limited by the + * bounded steps, and thus by the maximum ray length. */ + const float2 coordinates = (texel + float2(0.5f)) / input_size; + const float2 vector_to_source = source - coordinates; + const float2 step_vector = vector_to_source / unbounded_steps; + + float accumulated_weight = 0.0f; + float4 accumulated_color = float4(0.0f); + for (int i = 0; i <= steps; i++) { + float2 position = coordinates + i * step_vector; + + /* We are already past the image boundaries, and any future steps are also past the image + * boundaries, so break. */ + if (position.x < 0.0f || position.y < 0.0f || position.x > 1.0f || position.y > 1.0f) { + break; + } + + const float2 coordinates = position * input_size; + + float4 sample_color; + input_program_->read_sampled( + sample_color, coordinates.x, coordinates.y, PixelSampler::Bilinear); + + /* Attenuate the contributions of pixels that are further away from the source using a + * quadratic falloff. Also weight by the alpha to give more significance to opaque pixels. + */ + const float weight = (math::square(1.0f - i / float(steps))) * sample_color.w; + + accumulated_weight += weight; + accumulated_color += sample_color * weight; + } + + accumulated_color /= accumulated_weight != 0.0f ? accumulated_weight : 1.0f; + copy_v4_v4(output, accumulated_color); } void SunBeamsOperation::update_memory_buffer_partial(MemoryBuffer *output, @@ -79,4 +138,9 @@ void SunBeamsOperation::update_memory_buffer_partial(MemoryBuffer *output, } } +void SunBeamsOperation::deinit_execution() +{ + input_program_ = nullptr; +} + } // namespace blender::compositor diff --git a/source/blender/compositor/operations/COM_SunBeamsOperation.h b/source/blender/compositor/operations/COM_SunBeamsOperation.h index b9afe0faa4d..302908bd8c8 100644 --- a/source/blender/compositor/operations/COM_SunBeamsOperation.h +++ b/source/blender/compositor/operations/COM_SunBeamsOperation.h @@ -12,6 +12,10 @@ class SunBeamsOperation : public MultiThreadedOperation { public: SunBeamsOperation(); + void execute_pixel(float output[4], int x, int y, void *data) override; + + void init_execution() override; + void set_data(const NodeSunBeams &data) { data_ = data; @@ -21,8 +25,11 @@ class SunBeamsOperation : public MultiThreadedOperation { const rcti &area, Span inputs) override; + void deinit_execution() override; + private: NodeSunBeams data_; + SocketReader *input_program_; }; } // namespace blender::compositor diff --git a/source/blender/compositor/operations/COM_TextureOperation.cc b/source/blender/compositor/operations/COM_TextureOperation.cc index e87a57cffb0..890e4d5ed2c 100644 --- a/source/blender/compositor/operations/COM_TextureOperation.cc +++ b/source/blender/compositor/operations/COM_TextureOperation.cc @@ -7,7 +7,7 @@ #include "BKE_image.h" #include "BKE_node.hh" -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "NOD_texture.h" @@ -18,9 +18,12 @@ TextureBaseOperation::TextureBaseOperation() this->add_input_socket(DataType::Vector); // offset this->add_input_socket(DataType::Vector); // size texture_ = nullptr; + input_size_ = nullptr; + input_offset_ = nullptr; rd_ = nullptr; pool_ = nullptr; scene_color_manage_ = false; + flags_.complex = true; } TextureOperation::TextureOperation() : TextureBaseOperation() { @@ -33,6 +36,8 @@ TextureAlphaOperation::TextureAlphaOperation() : TextureBaseOperation() void TextureBaseOperation::init_execution() { + input_offset_ = get_input_socket_reader(0); + input_size_ = get_input_socket_reader(1); pool_ = BKE_image_pool_new(); if (texture_ != nullptr && texture_->nodetree != nullptr && texture_->use_nodes) { ntreeTexBeginExecTree(texture_->nodetree); @@ -41,6 +46,8 @@ void TextureBaseOperation::init_execution() } void TextureBaseOperation::deinit_execution() { + input_size_ = nullptr; + input_offset_ = nullptr; BKE_image_pool_free(pool_); pool_ = nullptr; if (texture_ != nullptr && texture_->use_nodes && texture_->nodetree != nullptr && @@ -61,43 +68,117 @@ void TextureBaseOperation::determine_canvas(const rcti &preferred_area, rcti &r_ r_area.ymax = preferred_area.ymin + height; } - /* Determine inputs. */ - rcti temp = COM_AREA_NONE; - NodeOperation::determine_canvas(r_area, temp); + if (execution_model_ == eExecutionModel::FullFrame) { + /* Determine inputs. */ + rcti temp = COM_AREA_NONE; + NodeOperation::determine_canvas(r_area, temp); + } +} + +void TextureAlphaOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float color[4]; + TextureBaseOperation::execute_pixel_sampled(color, x, y, sampler); + output[0] = color[3]; +} + +void TextureBaseOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + TexResult texres = {0.0f}; + float texture_size[4]; + float texture_offset[4]; + float vec[3]; + int retval; + const float cx = this->get_width() / 2; + const float cy = this->get_height() / 2; + float u = (x - cx) / this->get_width() * 2; + float v = (y - cy) / this->get_height() * 2; + + /* When no interpolation/filtering happens in multitex() force nearest interpolation. + * We do it here because (a) we can't easily say multitex() that we want nearest + * interpolation and (b) in such configuration multitex() simply floor's the value + * which often produces artifacts. + */ + if (texture_ != nullptr && (texture_->imaflag & TEX_INTERPOL) == 0) { + u += 0.5f / cx; + v += 0.5f / cy; + } + + input_size_->read_sampled(texture_size, x, y, sampler); + input_offset_->read_sampled(texture_offset, x, y, sampler); + + vec[0] = texture_size[0] * (u + texture_offset[0]); + vec[1] = texture_size[1] * (v + texture_offset[1]); + vec[2] = texture_size[2] * texture_offset[2]; + + const int thread_id = WorkScheduler::current_thread_id(); + retval = multitex_ext( + texture_, vec, nullptr, nullptr, 0, &texres, thread_id, pool_, scene_color_manage_, false); + + output[3] = texres.talpha ? texres.trgba[3] : texres.tin; + if (retval & TEX_RGB) { + copy_v3_v3(output, texres.trgba); + } + else { + output[0] = output[1] = output[2] = output[3]; + } } void TextureBaseOperation::update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span inputs) { - const float3 offset = inputs[0]->get_elem(0, 0); - const float3 scale = inputs[1]->get_elem(0, 0); - const int2 size = int2(this->get_width(), this->get_height()); + const int op_width = this->get_width(); + const int op_height = this->get_height(); + const float center_x = op_width / 2; + const float center_y = op_height / 2; + TexResult tex_result = {0}; + float vec[3]; + const int thread_id = WorkScheduler::current_thread_id(); for (BuffersIterator it = output->iterate_with(inputs, area); !it.is_end(); ++it) { - /* Compute the coordinates in the [-1, 1] range and add 0.5 to evaluate the texture at the - * center of pixels in case it was interpolated. */ - const float2 pixel_coordinates = ((float2(it.x, it.y) + 0.5f) / float2(size)) * 2.0f - 1.0f; - /* Note that it is expected that the offset is scaled by the scale. */ - const float3 coordinates = (float3(pixel_coordinates, 0.0f) + offset) * scale; + const float *tex_offset = it.in(0); + const float *tex_size = it.in(1); + float u = (it.x - center_x) / op_width * 2; + float v = (it.y - center_y) / op_height * 2; - TexResult texture_result; - const int result_type = multitex_ext(texture_, - coordinates, - nullptr, - nullptr, - 0, - &texture_result, - WorkScheduler::current_thread_id(), - pool_, - scene_color_manage_, - false); - - float4 color = float4(texture_result.trgba); - color.w = texture_result.talpha ? color.w : texture_result.tin; - if (!(result_type & TEX_RGB)) { - copy_v3_fl(color, color.w); + /* When no interpolation/filtering happens in multitex() force nearest interpolation. + * We do it here because (a) we can't easily say multitex() that we want nearest + * interpolation and (b) in such configuration multitex() simply floor's the value + * which often produces artifacts. + */ + if (texture_ != nullptr && (texture_->imaflag & TEX_INTERPOL) == 0) { + u += 0.5f / center_x; + v += 0.5f / center_y; + } + + vec[0] = tex_size[0] * (u + tex_offset[0]); + vec[1] = tex_size[1] * (v + tex_offset[1]); + vec[2] = tex_size[2] * tex_offset[2]; + + const int retval = multitex_ext(texture_, + vec, + nullptr, + nullptr, + 0, + &tex_result, + thread_id, + pool_, + scene_color_manage_, + false); + + it.out[3] = tex_result.talpha ? tex_result.trgba[3] : tex_result.tin; + if (retval & TEX_RGB) { + copy_v3_v3(it.out, tex_result.trgba); + } + else { + it.out[0] = it.out[1] = it.out[2] = it.out[3]; } - copy_v4_v4(it.out, color); } } diff --git a/source/blender/compositor/operations/COM_TextureOperation.h b/source/blender/compositor/operations/COM_TextureOperation.h index 51bd5aa8d0e..0fa32bbeb32 100644 --- a/source/blender/compositor/operations/COM_TextureOperation.h +++ b/source/blender/compositor/operations/COM_TextureOperation.h @@ -23,6 +23,8 @@ class TextureBaseOperation : public MultiThreadedOperation { private: Tex *texture_; const RenderData *rd_; + SocketReader *input_size_; + SocketReader *input_offset_; struct ImagePool *pool_; bool scene_color_manage_; @@ -38,6 +40,8 @@ class TextureBaseOperation : public MultiThreadedOperation { TextureBaseOperation(); public: + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + void set_texture(Tex *texture) { texture_ = texture; @@ -65,6 +69,7 @@ class TextureOperation : public TextureBaseOperation { class TextureAlphaOperation : public TextureBaseOperation { public: TextureAlphaOperation(); + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; void update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, diff --git a/source/blender/compositor/operations/COM_TonemapOperation.cc b/source/blender/compositor/operations/COM_TonemapOperation.cc index bea0b03b1c7..949f5ff4229 100644 --- a/source/blender/compositor/operations/COM_TonemapOperation.cc +++ b/source/blender/compositor/operations/COM_TonemapOperation.cc @@ -14,10 +14,131 @@ TonemapOperation::TonemapOperation() { this->add_input_socket(DataType::Color, ResizeMode::Align); this->add_output_socket(DataType::Color); + image_reader_ = nullptr; data_ = nullptr; cached_instance_ = nullptr; + flags_.complex = true; flags_.can_be_constant = true; } +void TonemapOperation::init_execution() +{ + image_reader_ = this->get_input_socket_reader(0); + NodeOperation::init_mutex(); +} + +void TonemapOperation::execute_pixel(float output[4], int x, int y, void *data) +{ + AvgLogLum *avg = (AvgLogLum *)data; + + image_reader_->read(output, x, y, nullptr); + mul_v3_fl(output, avg->al); + float dr = output[0] + data_->offset; + float dg = output[1] + data_->offset; + float db = output[2] + data_->offset; + output[0] /= ((dr == 0.0f) ? 1.0f : dr); + output[1] /= ((dg == 0.0f) ? 1.0f : dg); + output[2] /= ((db == 0.0f) ? 1.0f : db); + const float igm = avg->igm; + if (igm != 0.0f) { + output[0] = powf(std::max(output[0], 0.0f), igm); + output[1] = powf(std::max(output[1], 0.0f), igm); + output[2] = powf(std::max(output[2], 0.0f), igm); + } +} +void PhotoreceptorTonemapOperation::execute_pixel(float output[4], int x, int y, void *data) +{ + AvgLogLum *avg = (AvgLogLum *)data; + const NodeTonemap *ntm = data_; + + const float f = expf(-data_->f); + const float m = (ntm->m > 0.0f) ? ntm->m : (0.3f + 0.7f * powf(avg->auto_key, 1.4f)); + const float ic = 1.0f - ntm->c, ia = 1.0f - ntm->a; + + image_reader_->read(output, x, y, nullptr); + + const float L = IMB_colormanagement_get_luminance(output); + float I_l = output[0] + ic * (L - output[0]); + float I_g = avg->cav[0] + ic * (avg->lav - avg->cav[0]); + float I_a = I_l + ia * (I_g - I_l); + output[0] /= (output[0] + powf(f * I_a, m)); + I_l = output[1] + ic * (L - output[1]); + I_g = avg->cav[1] + ic * (avg->lav - avg->cav[1]); + I_a = I_l + ia * (I_g - I_l); + output[1] /= (output[1] + powf(f * I_a, m)); + I_l = output[2] + ic * (L - output[2]); + I_g = avg->cav[2] + ic * (avg->lav - avg->cav[2]); + I_a = I_l + ia * (I_g - I_l); + output[2] /= (output[2] + powf(f * I_a, m)); +} + +void TonemapOperation::deinit_execution() +{ + image_reader_ = nullptr; + delete cached_instance_; + NodeOperation::deinit_mutex(); +} + +bool TonemapOperation::determine_depending_area_of_interest(rcti * /*input*/, + ReadBufferOperation *read_operation, + rcti *output) +{ + rcti image_input; + + NodeOperation *operation = get_input_operation(0); + image_input.xmax = operation->get_width(); + image_input.xmin = 0; + image_input.ymax = operation->get_height(); + image_input.ymin = 0; + if (operation->determine_depending_area_of_interest(&image_input, read_operation, output)) { + return true; + } + return false; +} + +void *TonemapOperation::initialize_tile_data(rcti *rect) +{ + lock_mutex(); + if (cached_instance_ == nullptr) { + MemoryBuffer *tile = (MemoryBuffer *)image_reader_->initialize_tile_data(rect); + AvgLogLum *data = new AvgLogLum(); + + float *buffer = tile->get_buffer(); + + float lsum = 0.0f; + int p = tile->get_width() * tile->get_height(); + float *bc = buffer; + float avl, maxl = -1e10f, minl = 1e10f; + const float sc = 1.0f / p; + float Lav = 0.0f; + float cav[4] = {0.0f, 0.0f, 0.0f, 0.0f}; + while (p--) { + float L = IMB_colormanagement_get_luminance(bc); + Lav += L; + add_v3_v3(cav, bc); + lsum += logf(std::max(L, 0.0f) + 1e-5f); + maxl = (L > maxl) ? L : maxl; + minl = (L < minl) ? L : minl; + bc += 4; + } + data->lav = Lav * sc; + mul_v3_v3fl(data->cav, cav, sc); + maxl = log(double(maxl) + 1e-5); + minl = log(double(minl) + 1e-5); + avl = lsum * sc; + data->auto_key = (maxl > minl) ? ((maxl - avl) / (maxl - minl)) : 1.0f; + float al = exp(double(avl)); + data->al = (al == 0.0f) ? 0.0f : (data_->key / al); + data->igm = (data_->gamma == 0.0f) ? 1 : (1.0f / data_->gamma); + cached_instance_ = data; + } + unlock_mutex(); + return cached_instance_; +} + +void TonemapOperation::deinitialize_tile_data(rcti * /*rect*/, void * /*data*/) +{ + /* pass */ +} void TonemapOperation::get_area_of_interest(const int input_idx, const rcti & /*output_area*/, diff --git a/source/blender/compositor/operations/COM_TonemapOperation.h b/source/blender/compositor/operations/COM_TonemapOperation.h index 6254c9177bd..fcb11d2148b 100644 --- a/source/blender/compositor/operations/COM_TonemapOperation.h +++ b/source/blender/compositor/operations/COM_TonemapOperation.h @@ -27,6 +27,11 @@ typedef struct AvgLogLum { */ class TonemapOperation : public MultiThreadedOperation { protected: + /** + * \brief Cached reference to the reader + */ + SocketReader *image_reader_; + /** * \brief settings of the Tone-map */ @@ -40,11 +45,33 @@ class TonemapOperation : public MultiThreadedOperation { public: TonemapOperation(); + /** + * The inner loop of this operation. + */ + void execute_pixel(float output[4], int x, int y, void *data) override; + + /** + * Initialize the execution + */ + void init_execution() override; + + void *initialize_tile_data(rcti *rect) override; + void deinitialize_tile_data(rcti *rect, void *data) override; + + /** + * Deinitialize the execution + */ + void deinit_execution() override; + void set_data(const NodeTonemap *data) { data_ = data; } + bool determine_depending_area_of_interest(rcti *input, + ReadBufferOperation *read_operation, + rcti *output) override; + void get_area_of_interest(int input_idx, const rcti &output_area, rcti &r_input_area) override; void update_memory_buffer_started(MemoryBuffer *output, const rcti &area, @@ -61,6 +88,11 @@ class TonemapOperation : public MultiThreadedOperation { */ class PhotoreceptorTonemapOperation : public TonemapOperation { public: + /** + * The inner loop of this operation. + */ + void execute_pixel(float output[4], int x, int y, void *data) override; + void update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span inputs) override; diff --git a/source/blender/compositor/operations/COM_TrackPositionOperation.cc b/source/blender/compositor/operations/COM_TrackPositionOperation.cc index 5cfbbfe8603..8366d3906c0 100644 --- a/source/blender/compositor/operations/COM_TrackPositionOperation.cc +++ b/source/blender/compositor/operations/COM_TrackPositionOperation.cc @@ -113,6 +113,21 @@ void TrackPositionOperation::calc_track_position() } } +void TrackPositionOperation::execute_pixel_sampled(float output[4], + float /*x*/, + float /*y*/, + PixelSampler /*sampler*/) +{ + output[0] = marker_pos_[axis_] - relative_pos_[axis_]; + + if (axis_ == 0) { + output[0] *= width_; + } + else { + output[0] *= height_; + } +} + const float *TrackPositionOperation::get_constant_elem() { if (!is_track_position_calculated_) { diff --git a/source/blender/compositor/operations/COM_TrackPositionOperation.h b/source/blender/compositor/operations/COM_TrackPositionOperation.h index 0421185d4db..79d984ba9a9 100644 --- a/source/blender/compositor/operations/COM_TrackPositionOperation.h +++ b/source/blender/compositor/operations/COM_TrackPositionOperation.h @@ -79,6 +79,8 @@ class TrackPositionOperation : public ConstantOperation { void init_execution() override; + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + const float *get_constant_elem() override; private: diff --git a/source/blender/compositor/operations/COM_TranslateOperation.cc b/source/blender/compositor/operations/COM_TranslateOperation.cc index 827994d8195..242e098004b 100644 --- a/source/blender/compositor/operations/COM_TranslateOperation.cc +++ b/source/blender/compositor/operations/COM_TranslateOperation.cc @@ -14,6 +14,9 @@ TranslateOperation::TranslateOperation(DataType data_type, ResizeMode resize_mod this->add_input_socket(DataType::Value, ResizeMode::None); this->add_output_socket(data_type); this->set_canvas_input_index(0); + input_operation_ = nullptr; + input_xoperation_ = nullptr; + input_yoperation_ = nullptr; is_delta_set_ = false; is_relative_ = false; this->x_extend_mode_ = MemoryBufferExtend::Clip; @@ -22,6 +25,49 @@ TranslateOperation::TranslateOperation(DataType data_type, ResizeMode resize_mod this->flags_.can_be_constant = true; } +void TranslateOperation::init_execution() +{ + input_operation_ = this->get_input_socket_reader(0); + input_xoperation_ = this->get_input_socket_reader(1); + input_yoperation_ = this->get_input_socket_reader(2); +} + +void TranslateOperation::deinit_execution() +{ + input_operation_ = nullptr; + input_xoperation_ = nullptr; + input_yoperation_ = nullptr; +} + +void TranslateOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler /*sampler*/) +{ + ensure_delta(); + + float original_xpos = x - this->get_delta_x(); + float original_ypos = y - this->get_delta_y(); + + input_operation_->read_sampled(output, original_xpos, original_ypos, PixelSampler::Bilinear); +} + +bool TranslateOperation::determine_depending_area_of_interest(rcti *input, + ReadBufferOperation *read_operation, + rcti *output) +{ + rcti new_input; + + ensure_delta(); + + new_input.xmin = input->xmin - this->get_delta_x(); + new_input.xmax = input->xmax - this->get_delta_x(); + new_input.ymin = input->ymin - this->get_delta_y(); + new_input.ymax = input->ymax - this->get_delta_y(); + + return NodeOperation::determine_depending_area_of_interest(&new_input, read_operation, output); +} + void TranslateOperation::set_wrapping(int wrapping_type) { switch (wrapping_type) { @@ -51,23 +97,10 @@ void TranslateOperation::get_area_of_interest(const int input_idx, const int delta_x = this->get_delta_x(); BLI_rcti_translate(&r_input_area, -delta_x, 0); } - else if (x_extend_mode_ == MemoryBufferExtend::Repeat) { - /* The region of interest should consider the whole input image to avoid cropping effects, - * e.g. by prior scaling or rotating. Note: this is still consistent with immediate - * realization of transform nodes in GPU compositor, where nodes are to be evaluated from - * left to right. */ - const int in_width = get_width(); - BLI_rcti_resize_x(&r_input_area, in_width); - } - if (y_extend_mode_ == MemoryBufferExtend::Clip) { const int delta_y = this->get_delta_y(); BLI_rcti_translate(&r_input_area, 0, -delta_y); } - else if (y_extend_mode_ == MemoryBufferExtend::Repeat) { - const int in_height = get_height(); - BLI_rcti_resize_y(&r_input_area, in_height); - } } else { r_input_area = output_area; @@ -79,23 +112,6 @@ void TranslateOperation::update_memory_buffer_partial(MemoryBuffer *output, Span inputs) { MemoryBuffer *input = inputs[0]; - if (input->is_a_single_elem()) { - copy_v4_v4(output->get_elem(0, 0), input->get_elem(0, 0)); - return; - } - - /* Some compositor operations produce an empty output buffer by specifying a COM_AREA_NONE canvas - * to indicate an invalid output, for instance, when the Mask operation reference an invalid - * mask. The intention is that this buffer would signal that a fallback value would fill the - * canvas of consumer operations. Since the aforementioned filling is achieved through the - * Translate operation as part of canvas conversion in COM_convert_canvas, we handle the empty - * buffer case here and fill the output using a fallback black color. */ - if (BLI_rcti_is_empty(&input->get_rect())) { - const float value[4] = {0.0f, 0.0f, 0.0f, 1.0f}; - output->fill(area, value); - return; - } - const int delta_x = this->get_delta_x(); const int delta_y = this->get_delta_y(); for (int y = area.ymin; y < area.ymax; y++) { diff --git a/source/blender/compositor/operations/COM_TranslateOperation.h b/source/blender/compositor/operations/COM_TranslateOperation.h index 0179cc62c95..82333c57dd6 100644 --- a/source/blender/compositor/operations/COM_TranslateOperation.h +++ b/source/blender/compositor/operations/COM_TranslateOperation.h @@ -16,6 +16,9 @@ class TranslateOperation : public MultiThreadedOperation { static constexpr int Y_INPUT_INDEX = 2; private: + SocketReader *input_operation_; + SocketReader *input_xoperation_; + SocketReader *input_yoperation_; float delta_x_; float delta_y_; bool is_delta_set_; @@ -28,6 +31,13 @@ class TranslateOperation : public MultiThreadedOperation { public: TranslateOperation(); TranslateOperation(DataType data_type, ResizeMode mode = ResizeMode::Center); + bool determine_depending_area_of_interest(rcti *input, + ReadBufferOperation *read_operation, + rcti *output) override; + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + + void init_execution() override; + void deinit_execution() override; float get_delta_x() { @@ -50,15 +60,30 @@ class TranslateOperation : public MultiThreadedOperation { inline void ensure_delta() { if (!is_delta_set_) { - delta_x_ = get_input_operation(X_INPUT_INDEX)->get_constant_value_default(0.0f); - delta_y_ = get_input_operation(Y_INPUT_INDEX)->get_constant_value_default(0.0f); - if (get_is_relative()) { - const int input_width = BLI_rcti_size_x( - &get_input_operation(IMAGE_INPUT_INDEX)->get_canvas()); - const int input_height = BLI_rcti_size_y( - &get_input_operation(IMAGE_INPUT_INDEX)->get_canvas()); - delta_x_ *= input_width; - delta_y_ *= input_height; + if (execution_model_ == eExecutionModel::Tiled) { + float temp_delta[4]; + input_xoperation_->read_sampled(temp_delta, 0, 0, PixelSampler::Nearest); + delta_x_ = temp_delta[0]; + input_yoperation_->read_sampled(temp_delta, 0, 0, PixelSampler::Nearest); + delta_y_ = temp_delta[0]; + if (get_is_relative()) { + const int input_width = BLI_rcti_size_x(&input_operation_->get_canvas()); + const int input_height = BLI_rcti_size_y(&input_operation_->get_canvas()); + delta_x_ *= input_width; + delta_y_ *= input_height; + } + } + else { + delta_x_ = get_input_operation(X_INPUT_INDEX)->get_constant_value_default(0.0f); + delta_y_ = get_input_operation(Y_INPUT_INDEX)->get_constant_value_default(0.0f); + if (get_is_relative()) { + const int input_width = BLI_rcti_size_x( + &get_input_operation(IMAGE_INPUT_INDEX)->get_canvas()); + const int input_height = BLI_rcti_size_y( + &get_input_operation(IMAGE_INPUT_INDEX)->get_canvas()); + delta_x_ *= input_width; + delta_y_ *= input_height; + } } is_delta_set_ = true; diff --git a/source/blender/compositor/operations/COM_VariableSizeBokehBlurOperation.cc b/source/blender/compositor/operations/COM_VariableSizeBokehBlurOperation.cc index 9ad0dabb22d..3d76d41442c 100644 --- a/source/blender/compositor/operations/COM_VariableSizeBokehBlurOperation.cc +++ b/source/blender/compositor/operations/COM_VariableSizeBokehBlurOperation.cc @@ -2,10 +2,8 @@ * * SPDX-License-Identifier: GPL-2.0-or-later */ -#include "BLI_math_base.hh" -#include "BLI_math_vector.hh" - #include "COM_VariableSizeBokehBlurOperation.h" +#include "COM_OpenCLDevice.h" namespace blender::compositor { @@ -14,38 +12,264 @@ VariableSizeBokehBlurOperation::VariableSizeBokehBlurOperation() this->add_input_socket(DataType::Color); this->add_input_socket(DataType::Color, ResizeMode::Align); /* Do not resize the bokeh image. */ this->add_input_socket(DataType::Value); /* Radius. */ - this->add_input_socket(DataType::Value); /* Bounding Box. */ #ifdef COM_DEFOCUS_SEARCH /* Inverse search radius optimization structure. */ this->add_input_socket(DataType::Color, ResizeMode::None); #endif this->add_output_socket(DataType::Color); + flags_.complex = true; + flags_.open_cl = true; flags_.can_be_constant = true; + input_program_ = nullptr; + input_bokeh_program_ = nullptr; + input_size_program_ = nullptr; max_blur_ = 32.0f; threshold_ = 1.0f; do_size_scale_ = false; +#ifdef COM_DEFOCUS_SEARCH + input_search_program_ = nullptr; +#endif } void VariableSizeBokehBlurOperation::init_execution() { + input_program_ = get_input_socket_reader(0); + input_bokeh_program_ = get_input_socket_reader(1); + input_size_program_ = get_input_socket_reader(2); +#ifdef COM_DEFOCUS_SEARCH + input_search_program_ = get_input_socket_reader(3); +#endif QualityStepHelper::init_execution(COM_QH_INCREASE); } struct VariableSizeBokehBlurTileData { MemoryBuffer *color; MemoryBuffer *bokeh; MemoryBuffer *size; - MemoryBuffer *mask; int max_blur_scalar; }; +void *VariableSizeBokehBlurOperation::initialize_tile_data(rcti *rect) +{ + VariableSizeBokehBlurTileData *data = new VariableSizeBokehBlurTileData(); + data->color = (MemoryBuffer *)input_program_->initialize_tile_data(rect); + data->bokeh = (MemoryBuffer *)input_bokeh_program_->initialize_tile_data(rect); + data->size = (MemoryBuffer *)input_size_program_->initialize_tile_data(rect); + + rcti rect2 = COM_AREA_NONE; + this->determine_depending_area_of_interest( + rect, (ReadBufferOperation *)input_size_program_, &rect2); + + const float max_dim = std::max(this->get_width(), this->get_height()); + const float scalar = do_size_scale_ ? (max_dim / 100.0f) : 1.0f; + + data->max_blur_scalar = int(data->size->get_max_value(rect2) * scalar); + CLAMP(data->max_blur_scalar, 1.0f, max_blur_); + return data; +} + +void VariableSizeBokehBlurOperation::deinitialize_tile_data(rcti * /*rect*/, void *data) +{ + VariableSizeBokehBlurTileData *result = (VariableSizeBokehBlurTileData *)data; + delete result; +} + +void VariableSizeBokehBlurOperation::execute_pixel(float output[4], int x, int y, void *data) +{ + VariableSizeBokehBlurTileData *tile_data = (VariableSizeBokehBlurTileData *)data; + MemoryBuffer *input_program_buffer = tile_data->color; + MemoryBuffer *input_bokeh_buffer = tile_data->bokeh; + MemoryBuffer *input_size_buffer = tile_data->size; + float *input_size_float_buffer = input_size_buffer->get_buffer(); + float *input_program_float_buffer = input_program_buffer->get_buffer(); + float read_color[4]; + float bokeh[4]; + float temp_size[4]; + float multiplier_accum[4]; + float color_accum[4]; + + const float max_dim = std::max(get_width(), get_height()); + const float scalar = do_size_scale_ ? (max_dim / 100.0f) : 1.0f; + int max_blur_scalar = tile_data->max_blur_scalar; + + BLI_assert(input_bokeh_buffer->get_width() == COM_BLUR_BOKEH_PIXELS); + BLI_assert(input_bokeh_buffer->get_height() == COM_BLUR_BOKEH_PIXELS); + +#ifdef COM_DEFOCUS_SEARCH + float search[4]; + input_search_program_->read(search, + x / InverseSearchRadiusOperation::DIVIDER, + y / InverseSearchRadiusOperation::DIVIDER, + nullptr); + int minx = search[0]; + int miny = search[1]; + int maxx = search[2]; + int maxy = search[3]; +#else + int minx = std::max(x - max_blur_scalar, 0); + int miny = std::max(y - max_blur_scalar, 0); + int maxx = std::min(x + max_blur_scalar, int(get_width())); + int maxy = std::min(y + max_blur_scalar, int(get_height())); +#endif + { + input_size_buffer->read_no_check(temp_size, x, y); + input_program_buffer->read_no_check(read_color, x, y); + + copy_v4_v4(color_accum, read_color); + copy_v4_fl(multiplier_accum, 1.0f); + float size_center = temp_size[0] * scalar; + + const int add_xstep_value = QualityStepHelper::get_step(); + const int add_ystep_value = add_xstep_value; + const int add_xstep_color = add_xstep_value * COM_DATA_TYPE_COLOR_CHANNELS; + + if (size_center > threshold_) { + for (int ny = miny; ny < maxy; ny += add_ystep_value) { + float dy = ny - y; + int offset_value_ny = ny * input_size_buffer->get_width(); + int offset_value_nx_ny = offset_value_ny + (minx); + int offset_color_nx_ny = offset_value_nx_ny * COM_DATA_TYPE_COLOR_CHANNELS; + for (int nx = minx; nx < maxx; nx += add_xstep_value) { + if (nx != x || ny != y) { + float size = std::min(input_size_float_buffer[offset_value_nx_ny] * scalar, + size_center); + if (size > threshold_) { + float dx = nx - x; + if (size > fabsf(dx) && size > fabsf(dy)) { + float uv[2] = { + float(COM_BLUR_BOKEH_PIXELS / 2) + + (dx / size) * float((COM_BLUR_BOKEH_PIXELS / 2) - 1), + float(COM_BLUR_BOKEH_PIXELS / 2) + + (dy / size) * float((COM_BLUR_BOKEH_PIXELS / 2) - 1), + }; + input_bokeh_buffer->read(bokeh, uv[0], uv[1]); + madd_v4_v4v4(color_accum, bokeh, &input_program_float_buffer[offset_color_nx_ny]); + add_v4_v4(multiplier_accum, bokeh); + } + } + } + offset_color_nx_ny += add_xstep_color; + offset_value_nx_ny += add_xstep_value; + } + } + } + + output[0] = color_accum[0] / multiplier_accum[0]; + output[1] = color_accum[1] / multiplier_accum[1]; + output[2] = color_accum[2] / multiplier_accum[2]; + output[3] = color_accum[3] / multiplier_accum[3]; + + /* blend in out values over the threshold, otherwise we get sharp, ugly transitions */ + if ((size_center > threshold_) && (size_center < threshold_ * 2.0f)) { + /* factor from 0-1 */ + float fac = (size_center - threshold_) / threshold_; + interp_v4_v4v4(output, read_color, output, fac); + } + } +} + +void VariableSizeBokehBlurOperation::execute_opencl( + OpenCLDevice *device, + MemoryBuffer *output_memory_buffer, + cl_mem cl_output_buffer, + MemoryBuffer **input_memory_buffers, + std::list *cl_mem_to_clean_up, + std::list * /*cl_kernels_to_clean_up*/) +{ + cl_kernel defocus_kernel = device->COM_cl_create_kernel("defocus_kernel", nullptr); + + cl_int step = this->get_step(); + cl_int max_blur; + cl_float threshold = threshold_; + + MemoryBuffer *size_memory_buffer = input_size_program_->get_input_memory_buffer( + input_memory_buffers); + + const float max_dim = std::max(get_width(), get_height()); + cl_float scalar = do_size_scale_ ? (max_dim / 100.0f) : 1.0f; + + max_blur = (cl_int)min_ff(size_memory_buffer->get_max_value() * scalar, float(max_blur_)); + + device->COM_cl_attach_memory_buffer_to_kernel_parameter( + defocus_kernel, 0, -1, cl_mem_to_clean_up, input_memory_buffers, input_program_); + device->COM_cl_attach_memory_buffer_to_kernel_parameter( + defocus_kernel, 1, -1, cl_mem_to_clean_up, input_memory_buffers, input_bokeh_program_); + device->COM_cl_attach_memory_buffer_to_kernel_parameter( + defocus_kernel, 2, 4, cl_mem_to_clean_up, input_memory_buffers, input_size_program_); + device->COM_cl_attach_output_memory_buffer_to_kernel_parameter( + defocus_kernel, 3, cl_output_buffer); + device->COM_cl_attach_memory_buffer_offset_to_kernel_parameter( + defocus_kernel, 5, output_memory_buffer); + clSetKernelArg(defocus_kernel, 6, sizeof(cl_int), &step); + clSetKernelArg(defocus_kernel, 7, sizeof(cl_int), &max_blur); + clSetKernelArg(defocus_kernel, 8, sizeof(cl_float), &threshold); + clSetKernelArg(defocus_kernel, 9, sizeof(cl_float), &scalar); + device->COM_cl_attach_size_to_kernel_parameter(defocus_kernel, 10, this); + + device->COM_cl_enqueue_range(defocus_kernel, output_memory_buffer, 11, this); +} + +void VariableSizeBokehBlurOperation::deinit_execution() +{ + input_program_ = nullptr; + input_bokeh_program_ = nullptr; + input_size_program_ = nullptr; +#ifdef COM_DEFOCUS_SEARCH + input_search_program_ = nullptr; +#endif +} + +bool VariableSizeBokehBlurOperation::determine_depending_area_of_interest( + rcti *input, ReadBufferOperation *read_operation, rcti *output) +{ + rcti new_input; + rcti bokeh_input; + + const float max_dim = std::max(get_width(), get_height()); + const float scalar = do_size_scale_ ? (max_dim / 100.0f) : 1.0f; + int max_blur_scalar = max_blur_ * scalar; + + new_input.xmax = input->xmax + max_blur_scalar + 2; + new_input.xmin = input->xmin - max_blur_scalar + 2; + new_input.ymax = input->ymax + max_blur_scalar - 2; + new_input.ymin = input->ymin - max_blur_scalar - 2; + bokeh_input.xmax = COM_BLUR_BOKEH_PIXELS; + bokeh_input.xmin = 0; + bokeh_input.ymax = COM_BLUR_BOKEH_PIXELS; + bokeh_input.ymin = 0; + + NodeOperation *operation = get_input_operation(2); + if (operation->determine_depending_area_of_interest(&new_input, read_operation, output)) { + return true; + } + operation = get_input_operation(1); + if (operation->determine_depending_area_of_interest(&bokeh_input, read_operation, output)) { + return true; + } +#ifdef COM_DEFOCUS_SEARCH + rcti search_input; + search_input.xmax = (input->xmax / InverseSearchRadiusOperation::DIVIDER) + 1; + search_input.xmin = (input->xmin / InverseSearchRadiusOperation::DIVIDER) - 1; + search_input.ymax = (input->ymax / InverseSearchRadiusOperation::DIVIDER) + 1; + search_input.ymin = (input->ymin / InverseSearchRadiusOperation::DIVIDER) - 1; + operation = get_input_operation(3); + if (operation->determine_depending_area_of_interest(&search_input, read_operation, output)) { + return true; + } +#endif + operation = get_input_operation(0); + if (operation->determine_depending_area_of_interest(&new_input, read_operation, output)) { + return true; + } + return false; +} + void VariableSizeBokehBlurOperation::get_area_of_interest(const int input_idx, const rcti &output_area, rcti &r_input_area) { switch (input_idx) { case IMAGE_INPUT_INDEX: - case BOUNDING_BOX_INPUT_INDEX: case SIZE_INPUT_INDEX: { const float max_dim = std::max(get_width(), get_height()); const float scalar = do_size_scale_ ? (max_dim / 100.0f) : 1.0f; @@ -74,64 +298,130 @@ void VariableSizeBokehBlurOperation::get_area_of_interest(const int input_idx, } } +struct PixelData { + float multiplier_accum[4]; + float color_accum[4]; + float threshold; + float scalar; + float size_center; + int max_blur_scalar; + int step; + MemoryBuffer *bokeh_input; + MemoryBuffer *size_input; + MemoryBuffer *image_input; + int image_width; + int image_height; +}; + +static void blur_pixel(int x, int y, PixelData &p) +{ + BLI_assert(p.bokeh_input->get_width() == COM_BLUR_BOKEH_PIXELS); + BLI_assert(p.bokeh_input->get_height() == COM_BLUR_BOKEH_PIXELS); + +#ifdef COM_DEFOCUS_SEARCH + float search[4]; + inputs[DEFOCUS_INPUT_INDEX]->read_elem_checked(x / InverseSearchRadiusOperation::DIVIDER, + y / InverseSearchRadiusOperation::DIVIDER, + search); + const int minx = search[0]; + const int miny = search[1]; + const int maxx = search[2]; + const int maxy = search[3]; +#else + const int minx = std::max(x - p.max_blur_scalar, 0); + const int miny = std::max(y - p.max_blur_scalar, 0); + const int maxx = std::min(x + p.max_blur_scalar, p.image_width); + const int maxy = std::min(y + p.max_blur_scalar, p.image_height); +#endif + + const int color_row_stride = p.image_input->row_stride * p.step; + const int color_elem_stride = p.image_input->elem_stride * p.step; + const int size_row_stride = p.size_input->row_stride * p.step; + const int size_elem_stride = p.size_input->elem_stride * p.step; + const float *row_color = p.image_input->get_elem(minx, miny); + const float *row_size = p.size_input->get_elem(minx, miny); + for (int ny = miny; ny < maxy; + ny += p.step, row_size += size_row_stride, row_color += color_row_stride) + { + const float dy = ny - y; + const float *size_elem = row_size; + const float *color = row_color; + for (int nx = minx; nx < maxx; + nx += p.step, size_elem += size_elem_stride, color += color_elem_stride) + { + if (nx == x && ny == y) { + continue; + } + const float size = std::min(size_elem[0] * p.scalar, p.size_center); + if (size <= p.threshold) { + continue; + } + const float dx = nx - x; + if (size <= fabsf(dx) || size <= fabsf(dy)) { + continue; + } + + /* XXX: There is no way to ensure bokeh input is an actual bokeh with #COM_BLUR_BOKEH_PIXELS + * size, anything may be connected. Use the real input size and remove asserts? */ + const float u = float(COM_BLUR_BOKEH_PIXELS / 2) + + (dx / size) * float((COM_BLUR_BOKEH_PIXELS / 2) - 1); + const float v = float(COM_BLUR_BOKEH_PIXELS / 2) + + (dy / size) * float((COM_BLUR_BOKEH_PIXELS / 2) - 1); + float bokeh[4]; + p.bokeh_input->read_elem_checked(u, v, bokeh); + madd_v4_v4v4(p.color_accum, bokeh, color); + add_v4_v4(p.multiplier_accum, bokeh); + } + } +} + void VariableSizeBokehBlurOperation::update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span inputs) { - MemoryBuffer *input_buffer = inputs[0]; - MemoryBuffer *bokeh_buffer = inputs[1]; - MemoryBuffer *size_buffer = inputs[2]; - MemoryBuffer *mask_buffer = inputs[3]; + PixelData p; + p.bokeh_input = inputs[BOKEH_INPUT_INDEX]; + p.size_input = inputs[SIZE_INPUT_INDEX]; + p.image_input = inputs[IMAGE_INPUT_INDEX]; + p.step = QualityStepHelper::get_step(); + p.threshold = threshold_; + p.image_width = this->get_width(); + p.image_height = this->get_height(); - const float max_dim = std::max(get_width(), get_height()); - const float base_size = do_size_scale_ ? (max_dim / 100.0f) : 1.0f; - const float maximum_size = size_buffer->get_max_value(); - const int search_radius = math::clamp(int(maximum_size * base_size), 0, max_blur_); - const int2 bokeh_size = int2(bokeh_buffer->get_width(), bokeh_buffer->get_height()); + rcti scalar_area = COM_AREA_NONE; + this->get_area_of_interest(SIZE_INPUT_INDEX, area, scalar_area); + BLI_rcti_isect(&scalar_area, &p.size_input->get_rect(), &scalar_area); + const float max_size = p.size_input->get_max_value(scalar_area); - BuffersIterator it = output->iterate_with({}, area); - for (; !it.is_end(); ++it) { - if (*mask_buffer->get_elem(it.x, it.y) <= 0.0f) { - copy_v4_v4(it.out, input_buffer->get_elem(it.x, it.y)); - continue; + const float max_dim = std::max(this->get_width(), this->get_height()); + p.scalar = do_size_scale_ ? (max_dim / 100.0f) : 1.0f; + p.max_blur_scalar = int(max_size * p.scalar); + CLAMP(p.max_blur_scalar, 1, max_blur_); + + for (BuffersIterator it = output->iterate_with({p.image_input, p.size_input}, area); + !it.is_end(); + ++it) + { + const float *color = it.in(0); + const float size = *it.in(1); + copy_v4_v4(p.color_accum, color); + copy_v4_fl(p.multiplier_accum, 1.0f); + p.size_center = size * p.scalar; + + if (p.size_center > p.threshold) { + blur_pixel(it.x, it.y, p); } - const float center_size = math::max(0.0f, *size_buffer->get_elem(it.x, it.y) * base_size); + it.out[0] = p.color_accum[0] / p.multiplier_accum[0]; + it.out[1] = p.color_accum[1] / p.multiplier_accum[1]; + it.out[2] = p.color_accum[2] / p.multiplier_accum[2]; + it.out[3] = p.color_accum[3] / p.multiplier_accum[3]; - float4 accumulated_color = float4(input_buffer->get_elem(it.x, it.y)); - float4 accumulated_weight = float4(1.0f); - const int step = get_step(); - if (center_size >= threshold_) { - for (int yi = -search_radius; yi <= search_radius; yi += step) { - for (int xi = -search_radius; xi <= search_radius; xi += step) { - if (xi == 0 && yi == 0) { - continue; - } - const float candidate_size = math::max( - 0.0f, *size_buffer->get_elem_clamped(it.x + xi, it.y + yi) * base_size); - const float size = math::min(center_size, candidate_size); - if (size < threshold_ || math::max(math::abs(xi), math::abs(yi)) > size) { - continue; - } - - const float2 normalized_texel = (float2(xi, yi) + size + 0.5f) / (size * 2.0f + 1.0f); - const float2 weight_texel = (1.0f - normalized_texel) * float2(bokeh_size - 1); - const float4 weight = bokeh_buffer->get_elem(int(weight_texel.x), int(weight_texel.y)); - const float4 color = input_buffer->get_elem_clamped(it.x + xi, it.y + yi); - accumulated_color += color * weight; - accumulated_weight += weight; - } - } - } - - const float4 final_color = math::safe_divide(accumulated_color, accumulated_weight); - copy_v4_v4(it.out, final_color); - - /* blend in out values over the threshold, otherwise we get sharp, ugly transitions */ - if ((center_size > threshold_) && (center_size < threshold_ * 2.0f)) { - /* factor from 0-1 */ - float fac = (center_size - threshold_) / threshold_; - interp_v4_v4v4(it.out, input_buffer->get_elem(it.x, it.y), it.out, fac); + /* Blend in out values over the threshold, otherwise we get sharp, ugly transitions. */ + if ((p.size_center > p.threshold) && (p.size_center < p.threshold * 2.0f)) { + /* Factor from 0-1. */ + const float fac = (p.size_center - p.threshold) / p.threshold; + interp_v4_v4v4(it.out, color, it.out, fac); } } } @@ -142,6 +432,88 @@ InverseSearchRadiusOperation::InverseSearchRadiusOperation() { this->add_input_socket(DataType::Value, ResizeMode::Align); /* Radius. */ this->add_output_socket(DataType::Color); + this->flags.complex = true; + input_radius_ = nullptr; +} + +void InverseSearchRadiusOperation::init_execution() +{ + input_radius_ = this->get_input_socket_reader(0); +} + +void *InverseSearchRadiusOperation::initialize_tile_data(rcti *rect) +{ + MemoryBuffer *data = new MemoryBuffer(DataType::Color, rect); + float *buffer = data->get_buffer(); + int x, y; + int width = input_radius_->get_width(); + int height = input_radius_->get_height(); + float temp[4]; + int offset = 0; + for (y = rect->ymin; y < rect->ymax; y++) { + for (x = rect->xmin; x < rect->xmax; x++) { + int rx = x * DIVIDER; + int ry = y * DIVIDER; + buffer[offset] = std::max(rx - max_blur_, 0); + buffer[offset + 1] = std::max(ry - max_blur_, 0); + buffer[offset + 2] = std::min(rx + DIVIDER + max_blur_, width); + buffer[offset + 3] = std::min(ry + DIVIDER + max_blur_, height); + offset += 4; + } + } +# if 0 + for (x = rect->xmin; x < rect->xmax; x++) { + for (y = rect->ymin; y < rect->ymax; y++) { + int rx = x * DIVIDER; + int ry = y * DIVIDER; + float radius = 0.0f; + float maxx = x; + float maxy = y; + + for (int x2 = 0; x2 < DIVIDER; x2++) { + for (int y2 = 0; y2 < DIVIDER; y2++) { + input_radius_->read(temp, rx + x2, ry + y2, PixelSampler::Nearest); + if (radius < temp[0]) { + radius = temp[0]; + maxx = x2; + maxy = y2; + } + } + } + int impact_radius = ceil(radius / DIVIDER); + for (int x2 = x - impact_radius; x2 < x + impact_radius; x2++) { + for (int y2 = y - impact_radius; y2 < y + impact_radius; y2++) { + data->read(temp, x2, y2); + temp[0] = std::min(temp[0], maxx); + temp[1] = std::min(temp[1], maxy); + temp[2] = std::max(temp[2], maxx); + temp[3] = std::max(temp[3], maxy); + data->write_pixel(x2, y2, temp); + } + } + } + } +# endif + return data; +} + +void InverseSearchRadiusOperation::execute_pixel_chunk(float output[4], int x, int y, void *data) +{ + MemoryBuffer *buffer = (MemoryBuffer *)data; + buffer->read_no_check(output, x, y); +} + +void InverseSearchRadiusOperation::deinitialize_tile_data(rcti *rect, void *data) +{ + if (data) { + MemoryBuffer *mb = (MemoryBuffer *)data; + delete mb; + } +} + +void InverseSearchRadiusOperation::deinit_execution() +{ + input_radius_ = nullptr; } void InverseSearchRadiusOperation::determine_resolution(uint resolution[2], @@ -152,6 +524,16 @@ void InverseSearchRadiusOperation::determine_resolution(uint resolution[2], resolution[1] = resolution[1] / DIVIDER; } +bool InverseSearchRadiusOperation::determine_depending_area_of_interest( + rcti *input, ReadBufferOperation *read_operation, rcti *output) +{ + rcti new_rect; + new_rect.ymin = input->ymin * DIVIDER - max_blur_; + new_rect.ymax = input->ymax * DIVIDER + max_blur_; + new_rect.xmin = input->xmin * DIVIDER - max_blur_; + new_rect.xmax = input->xmax * DIVIDER + max_blur_; + return NodeOperation::determine_depending_area_of_interest(&new_rect, read_operation, output); +} #endif } // namespace blender::compositor diff --git a/source/blender/compositor/operations/COM_VariableSizeBokehBlurOperation.h b/source/blender/compositor/operations/COM_VariableSizeBokehBlurOperation.h index 28728d9298f..e239a916afe 100644 --- a/source/blender/compositor/operations/COM_VariableSizeBokehBlurOperation.h +++ b/source/blender/compositor/operations/COM_VariableSizeBokehBlurOperation.h @@ -16,20 +16,46 @@ class VariableSizeBokehBlurOperation : public MultiThreadedOperation, public Qua static constexpr int IMAGE_INPUT_INDEX = 0; static constexpr int BOKEH_INPUT_INDEX = 1; static constexpr int SIZE_INPUT_INDEX = 2; - static constexpr int BOUNDING_BOX_INPUT_INDEX = 3; #ifdef COM_DEFOCUS_SEARCH - static constexpr int DEFOCUS_INPUT_INDEX = 4; + static constexpr int DEFOCUS_INPUT_INDEX = 3; #endif int max_blur_; float threshold_; bool do_size_scale_; /* scale size, matching 'BokehBlurNode' */ + SocketReader *input_program_; + SocketReader *input_bokeh_program_; + SocketReader *input_size_program_; +#ifdef COM_DEFOCUS_SEARCH + SocketReader *input_search_program_; +#endif public: VariableSizeBokehBlurOperation(); + /** + * The inner loop of this operation. + */ + void execute_pixel(float output[4], int x, int y, void *data) override; + + /** + * Initialize the execution + */ void init_execution() override; + void *initialize_tile_data(rcti *rect) override; + + void deinitialize_tile_data(rcti *rect, void *data) override; + + /** + * Deinitialize the execution + */ + void deinit_execution() override; + + bool determine_depending_area_of_interest(rcti *input, + ReadBufferOperation *read_operation, + rcti *output) override; + void set_max_blur(int max_radius) { max_blur_ = max_radius; @@ -45,6 +71,13 @@ class VariableSizeBokehBlurOperation : public MultiThreadedOperation, public Qua do_size_scale_ = scale_size; } + void execute_opencl(OpenCLDevice *device, + MemoryBuffer *output_memory_buffer, + cl_mem cl_output_buffer, + MemoryBuffer **input_memory_buffers, + std::list *cl_mem_to_clean_up, + std::list *cl_kernels_to_clean_up) override; + void get_area_of_interest(int input_idx, const rcti &output_area, rcti &r_input_area) override; void update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, @@ -56,12 +89,33 @@ class VariableSizeBokehBlurOperation : public MultiThreadedOperation, public Qua class InverseSearchRadiusOperation : public NodeOperation { private: int max_blur_; + SocketReader *input_radius_; public: static const int DIVIDER = 4; InverseSearchRadiusOperation(); + /** + * The inner loop of this operation. + */ + void execute_pixel_chunk(float output[4], int x, int y, void *data); + + /** + * Initialize the execution + */ + void init_execution() override; + void *initialize_tile_data(rcti *rect) override; + void deinitialize_tile_data(rcti *rect, void *data) override; + + /** + * Deinitialize the execution + */ + void deinit_execution() override; + + bool determine_depending_area_of_interest(rcti *input, + ReadBufferOperation *read_operation, + rcti *output) override; void determine_canvas(const rcti &preferred_area, rcti &r_area) override; void set_max_blur(int max_radius) diff --git a/source/blender/compositor/operations/COM_VectorBlurOperation.cc b/source/blender/compositor/operations/COM_VectorBlurOperation.cc index 152231633f7..c3311bea5c9 100644 --- a/source/blender/compositor/operations/COM_VectorBlurOperation.cc +++ b/source/blender/compositor/operations/COM_VectorBlurOperation.cc @@ -35,20 +35,74 @@ VectorBlurOperation::VectorBlurOperation() this->add_output_socket(DataType::Color); settings_ = nullptr; cached_instance_ = nullptr; + input_image_program_ = nullptr; + input_speed_program_ = nullptr; + input_zprogram_ = nullptr; + flags_.complex = true; + flags_.is_fullframe_operation = true; } void VectorBlurOperation::init_execution() { + init_mutex(); + input_image_program_ = get_input_socket_reader(0); + input_zprogram_ = get_input_socket_reader(1); + input_speed_program_ = get_input_socket_reader(2); cached_instance_ = nullptr; QualityStepHelper::init_execution(COM_QH_INCREASE); } +void VectorBlurOperation::execute_pixel(float output[4], int x, int y, void *data) +{ + float *buffer = (float *)data; + int index = (y * this->get_width() + x) * COM_DATA_TYPE_COLOR_CHANNELS; + copy_v4_v4(output, &buffer[index]); +} + void VectorBlurOperation::deinit_execution() { + deinit_mutex(); + input_image_program_ = nullptr; + input_speed_program_ = nullptr; + input_zprogram_ = nullptr; if (cached_instance_) { MEM_freeN(cached_instance_); cached_instance_ = nullptr; } } +void *VectorBlurOperation::initialize_tile_data(rcti *rect) +{ + if (cached_instance_) { + return cached_instance_; + } + + lock_mutex(); + if (cached_instance_ == nullptr) { + MemoryBuffer *tile = (MemoryBuffer *)input_image_program_->initialize_tile_data(rect); + MemoryBuffer *speed = (MemoryBuffer *)input_speed_program_->initialize_tile_data(rect); + MemoryBuffer *z = (MemoryBuffer *)input_zprogram_->initialize_tile_data(rect); + float *data = (float *)MEM_dupallocN(tile->get_buffer()); + this->generate_vector_blur(data, tile, speed, z); + cached_instance_ = data; + } + unlock_mutex(); + return cached_instance_; +} + +bool VectorBlurOperation::determine_depending_area_of_interest(rcti * /*input*/, + ReadBufferOperation *read_operation, + rcti *output) +{ + if (cached_instance_ == nullptr) { + rcti new_input; + new_input.xmax = this->get_width(); + new_input.xmin = 0; + new_input.ymax = this->get_height(); + new_input.ymin = 0; + return NodeOperation::determine_depending_area_of_interest(&new_input, read_operation, output); + } + + return false; +} void VectorBlurOperation::get_area_of_interest(const int /*input_idx*/, const rcti & /*output_area*/, diff --git a/source/blender/compositor/operations/COM_VectorBlurOperation.h b/source/blender/compositor/operations/COM_VectorBlurOperation.h index f7bac082372..d01d928b6f7 100644 --- a/source/blender/compositor/operations/COM_VectorBlurOperation.h +++ b/source/blender/compositor/operations/COM_VectorBlurOperation.h @@ -16,6 +16,13 @@ class VectorBlurOperation : public NodeOperation, public QualityStepHelper { static constexpr int Z_INPUT_INDEX = 1; static constexpr int SPEED_INPUT_INDEX = 2; + /** + * \brief Cached reference to the input_program + */ + SocketReader *input_image_program_; + SocketReader *input_speed_program_; + SocketReader *input_zprogram_; + /** * \brief settings of the glare node. */ @@ -26,13 +33,30 @@ class VectorBlurOperation : public NodeOperation, public QualityStepHelper { public: VectorBlurOperation(); + /** + * The inner loop of this operation. + */ + void execute_pixel(float output[4], int x, int y, void *data) override; + + /** + * Initialize the execution + */ void init_execution() override; + + /** + * Deinitialize the execution + */ void deinit_execution() override; + void *initialize_tile_data(rcti *rect) override; + void set_vector_blur_settings(const NodeBlurData *settings) { settings_ = settings; } + bool determine_depending_area_of_interest(rcti *input, + ReadBufferOperation *read_operation, + rcti *output) override; void get_area_of_interest(int input_idx, const rcti &output_area, rcti &r_input_area) override; void update_memory_buffer(MemoryBuffer *output, diff --git a/source/blender/compositor/operations/COM_VectorCurveOperation.cc b/source/blender/compositor/operations/COM_VectorCurveOperation.cc index a293d958237..41bf7f44907 100644 --- a/source/blender/compositor/operations/COM_VectorCurveOperation.cc +++ b/source/blender/compositor/operations/COM_VectorCurveOperation.cc @@ -13,8 +13,33 @@ VectorCurveOperation::VectorCurveOperation() this->add_input_socket(DataType::Vector); this->add_output_socket(DataType::Vector); + input_program_ = nullptr; + this->flags_.can_be_constant = true; } +void VectorCurveOperation::init_execution() +{ + CurveBaseOperation::init_execution(); + input_program_ = this->get_input_socket_reader(0); +} + +void VectorCurveOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float input[4]; + + input_program_->read_sampled(input, x, y, sampler); + + BKE_curvemapping_evaluate_premulRGBF(curve_mapping_, output, input); +} + +void VectorCurveOperation::deinit_execution() +{ + CurveBaseOperation::deinit_execution(); + input_program_ = nullptr; +} void VectorCurveOperation::update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, diff --git a/source/blender/compositor/operations/COM_VectorCurveOperation.h b/source/blender/compositor/operations/COM_VectorCurveOperation.h index ee5413abf7b..683894ae021 100644 --- a/source/blender/compositor/operations/COM_VectorCurveOperation.h +++ b/source/blender/compositor/operations/COM_VectorCurveOperation.h @@ -5,13 +5,35 @@ #pragma once #include "COM_CurveBaseOperation.h" +#include "COM_NodeOperation.h" namespace blender::compositor { class VectorCurveOperation : public CurveBaseOperation { + private: + /** + * Cached reference to the input_program + */ + SocketReader *input_program_; + public: VectorCurveOperation(); + /** + * The inner loop of this operation. + */ + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + + /** + * Initialize the execution + */ + void init_execution() override; + + /** + * Deinitialize the execution + */ + void deinit_execution() override; + void update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span inputs) override; diff --git a/source/blender/compositor/operations/COM_ViewerOperation.cc b/source/blender/compositor/operations/COM_ViewerOperation.cc index e0f34c527cd..0e9aa56bd06 100644 --- a/source/blender/compositor/operations/COM_ViewerOperation.cc +++ b/source/blender/compositor/operations/COM_ViewerOperation.cc @@ -4,7 +4,7 @@ #include "COM_ViewerOperation.h" #include "BKE_image.h" -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "COM_ExecutionSystem.h" #include "IMB_colormanagement.hh" @@ -26,6 +26,8 @@ ViewerOperation::ViewerOperation() this->add_input_socket(DataType::Color); this->add_input_socket(DataType::Value); + image_input_ = nullptr; + alpha_input_ = nullptr; rd_ = nullptr; view_name_ = nullptr; flags_.use_viewer_border = true; @@ -34,6 +36,10 @@ ViewerOperation::ViewerOperation() void ViewerOperation::init_execution() { + /* When initializing the tree during initial load the width and height can be zero. */ + image_input_ = get_input_socket_reader(0); + alpha_input_ = get_input_socket_reader(1); + if (is_active_viewer_output() && !exec_system_->is_breaked()) { init_image(); } @@ -41,9 +47,50 @@ void ViewerOperation::init_execution() void ViewerOperation::deinit_execution() { + image_input_ = nullptr; + alpha_input_ = nullptr; output_buffer_ = nullptr; } +void ViewerOperation::execute_region(rcti *rect, uint /*tile_number*/) +{ + float *buffer = output_buffer_; + if (!buffer) { + return; + } + const int x1 = rect->xmin; + const int y1 = rect->ymin; + const int x2 = rect->xmax; + const int y2 = rect->ymax; + const int offsetadd = (this->get_width() - (x2 - x1)); + const int offsetadd4 = offsetadd * 4; + int offset = (y1 * this->get_width() + x1); + int offset4 = offset * 4; + float alpha[4]; + int x; + int y; + bool breaked = false; + + for (y = y1; y < y2 && (!breaked); y++) { + for (x = x1; x < x2; x++) { + image_input_->read_sampled(&(buffer[offset4]), x, y, PixelSampler::Nearest); + if (use_alpha_input_) { + alpha_input_->read_sampled(alpha, x, y, PixelSampler::Nearest); + buffer[offset4 + 3] = alpha[0]; + } + + offset++; + offset4 += 4; + } + if (is_braked()) { + breaked = true; + } + offset += offsetadd; + offset4 += offsetadd4; + } + update_image(rect); +} + void ViewerOperation::determine_canvas(const rcti &preferred_area, rcti &r_area) { int scene_render_width, scene_render_height; diff --git a/source/blender/compositor/operations/COM_ViewerOperation.h b/source/blender/compositor/operations/COM_ViewerOperation.h index 0a6e90c7727..3c7c5e971a2 100644 --- a/source/blender/compositor/operations/COM_ViewerOperation.h +++ b/source/blender/compositor/operations/COM_ViewerOperation.h @@ -4,7 +4,7 @@ #pragma once -#include "BKE_global.hh" +#include "BKE_global.h" #include "BLI_rect.h" #include "COM_MultiThreadedOperation.h" #include "DNA_image_types.h" @@ -21,6 +21,7 @@ class ViewerOperation : public MultiThreadedOperation { bool active_; float center_x_; float center_y_; + ChunkOrdering chunk_order_; ImBuf *ibuf_; bool use_alpha_input_; const RenderData *rd_; @@ -29,10 +30,14 @@ class ViewerOperation : public MultiThreadedOperation { const ColorManagedViewSettings *view_settings_; const ColorManagedDisplaySettings *display_settings_; + SocketReader *image_input_; + SocketReader *alpha_input_; + public: ViewerOperation(); void init_execution() override; void deinit_execution() override; + void execute_region(rcti *rect, unsigned int tile_number) override; void determine_canvas(const rcti &preferred_area, rcti &r_area) override; bool is_output_operation(bool /*rendering*/) const override { @@ -65,6 +70,10 @@ class ViewerOperation : public MultiThreadedOperation { { center_y_ = centerY; } + void set_chunk_order(ChunkOrdering tile_order) + { + chunk_order_ = tile_order; + } float getCenterX() const { return center_x_; @@ -73,6 +82,10 @@ class ViewerOperation : public MultiThreadedOperation { { return center_y_; } + ChunkOrdering get_chunk_order() const + { + return chunk_order_; + } eCompositorPriority get_render_priority() const override; void set_use_alpha_input(bool value) { diff --git a/source/blender/compositor/operations/COM_WrapOperation.cc b/source/blender/compositor/operations/COM_WrapOperation.cc new file mode 100644 index 00000000000..def8afd0a6a --- /dev/null +++ b/source/blender/compositor/operations/COM_WrapOperation.cc @@ -0,0 +1,108 @@ +/* SPDX-FileCopyrightText: 2011 Blender Authors + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +#include + +#include "COM_WrapOperation.h" + +namespace blender::compositor { + +WrapOperation::WrapOperation(DataType datatype) : ReadBufferOperation(datatype) +{ + wrapping_type_ = CMP_NODE_WRAP_NONE; +} + +inline float WrapOperation::get_wrapped_original_xpos(float x) +{ + if (this->get_width() == 0) { + return 0; + } + while (x < 0) { + x += this->get_width(); + } + return fmodf(x, this->get_width()); +} + +inline float WrapOperation::get_wrapped_original_ypos(float y) +{ + if (this->get_height() == 0) { + return 0; + } + while (y < 0) { + y += this->get_height(); + } + return fmodf(y, this->get_height()); +} + +void WrapOperation::execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) +{ + float nx, ny; + nx = x; + ny = y; + MemoryBufferExtend extend_x = MemoryBufferExtend::Clip, extend_y = MemoryBufferExtend::Clip; + switch (wrapping_type_) { + case CMP_NODE_WRAP_NONE: + /* Intentionally empty, original_xpos and original_ypos have been set before. */ + break; + case CMP_NODE_WRAP_X: + /* Wrap only on the x-axis. */ + nx = this->get_wrapped_original_xpos(x); + extend_x = MemoryBufferExtend::Repeat; + break; + case CMP_NODE_WRAP_Y: + /* Wrap only on the y-axis. */ + ny = this->get_wrapped_original_ypos(y); + extend_y = MemoryBufferExtend::Repeat; + break; + case CMP_NODE_WRAP_XY: + /* Wrap on both. */ + nx = this->get_wrapped_original_xpos(x); + ny = this->get_wrapped_original_ypos(y); + extend_x = MemoryBufferExtend::Repeat; + extend_y = MemoryBufferExtend::Repeat; + break; + } + + execute_pixel_extend(output, nx, ny, sampler, extend_x, extend_y); +} + +bool WrapOperation::determine_depending_area_of_interest(rcti *input, + ReadBufferOperation *read_operation, + rcti *output) +{ + rcti new_input; + new_input.xmin = input->xmin; + new_input.xmax = input->xmax; + new_input.ymin = input->ymin; + new_input.ymax = input->ymax; + + if (ELEM(wrapping_type_, CMP_NODE_WRAP_X, CMP_NODE_WRAP_XY)) { + /* Wrap only on the x-axis if tile is wrapping. */ + new_input.xmin = get_wrapped_original_xpos(input->xmin); + new_input.xmax = roundf(get_wrapped_original_xpos(input->xmax)); + if (new_input.xmin >= new_input.xmax) { + new_input.xmin = 0; + new_input.xmax = this->get_width(); + } + } + if (ELEM(wrapping_type_, CMP_NODE_WRAP_Y, CMP_NODE_WRAP_XY)) { + /* Wrap only on the y-axis if tile is wrapping. */ + new_input.ymin = get_wrapped_original_ypos(input->ymin); + new_input.ymax = roundf(get_wrapped_original_ypos(input->ymax)); + if (new_input.ymin >= new_input.ymax) { + new_input.ymin = 0; + new_input.ymax = this->get_height(); + } + } + + return ReadBufferOperation::determine_depending_area_of_interest( + &new_input, read_operation, output); +} + +void WrapOperation::set_wrapping(int wrapping_type) +{ + wrapping_type_ = wrapping_type; +} + +} // namespace blender::compositor diff --git a/source/blender/compositor/operations/COM_WrapOperation.h b/source/blender/compositor/operations/COM_WrapOperation.h new file mode 100644 index 00000000000..bfb73b1a42a --- /dev/null +++ b/source/blender/compositor/operations/COM_WrapOperation.h @@ -0,0 +1,29 @@ +/* SPDX-FileCopyrightText: 2011 Blender Authors + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +#pragma once + +#include "COM_ReadBufferOperation.h" + +namespace blender::compositor { + +class WrapOperation : public ReadBufferOperation { + private: + int wrapping_type_; + + public: + WrapOperation(DataType datatype); + bool determine_depending_area_of_interest(rcti *input, + ReadBufferOperation *read_operation, + rcti *output) override; + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + + void set_wrapping(int wrapping_type); + float get_wrapped_original_xpos(float x); + float get_wrapped_original_ypos(float y); + + void setFactorXY(float factorX, float factorY); +}; + +} // namespace blender::compositor diff --git a/source/blender/compositor/operations/COM_WriteBufferOperation.cc b/source/blender/compositor/operations/COM_WriteBufferOperation.cc new file mode 100644 index 00000000000..d53abfd0094 --- /dev/null +++ b/source/blender/compositor/operations/COM_WriteBufferOperation.cc @@ -0,0 +1,215 @@ +/* SPDX-FileCopyrightText: 2011 Blender Authors + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +#include "COM_WriteBufferOperation.h" +#include "COM_OpenCLDevice.h" + +namespace blender::compositor { + +WriteBufferOperation::WriteBufferOperation(DataType datatype) +{ + this->add_input_socket(datatype); + memory_proxy_ = new MemoryProxy(datatype); + memory_proxy_->set_write_buffer_operation(this); + memory_proxy_->set_executor(nullptr); + flags_.is_write_buffer_operation = true; +} +WriteBufferOperation::~WriteBufferOperation() +{ + if (memory_proxy_) { + delete memory_proxy_; + memory_proxy_ = nullptr; + } +} + +void WriteBufferOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + input_->read_sampled(output, x, y, sampler); +} + +void WriteBufferOperation::init_execution() +{ + input_ = this->get_input_operation(0); + memory_proxy_->allocate(this->get_width(), this->get_height()); +} + +void WriteBufferOperation::deinit_execution() +{ + input_ = nullptr; + memory_proxy_->free(); +} + +void WriteBufferOperation::execute_region(rcti *rect, uint /*tile_number*/) +{ + MemoryBuffer *memory_buffer = memory_proxy_->get_buffer(); + float *buffer = memory_buffer->get_buffer(); + const uint8_t num_channels = memory_buffer->get_num_channels(); + if (input_->get_flags().complex) { + void *data = input_->initialize_tile_data(rect); + int x1 = rect->xmin; + int y1 = rect->ymin; + int x2 = rect->xmax; + int y2 = rect->ymax; + int x; + int y; + bool breaked = false; + for (y = y1; y < y2 && (!breaked); y++) { + int offset4 = (y * memory_buffer->get_width() + x1) * num_channels; + for (x = x1; x < x2; x++) { + input_->read(&(buffer[offset4]), x, y, data); + offset4 += num_channels; + } + if (is_braked()) { + breaked = true; + } + } + if (data) { + input_->deinitialize_tile_data(rect, data); + data = nullptr; + } + } + else { + int x1 = rect->xmin; + int y1 = rect->ymin; + int x2 = rect->xmax; + int y2 = rect->ymax; + + int x; + int y; + bool breaked = false; + for (y = y1; y < y2 && (!breaked); y++) { + int offset4 = (y * memory_buffer->get_width() + x1) * num_channels; + for (x = x1; x < x2; x++) { + input_->read_sampled(&(buffer[offset4]), x, y, PixelSampler::Nearest); + offset4 += num_channels; + } + if (is_braked()) { + breaked = true; + } + } + } +} + +void WriteBufferOperation::execute_opencl_region(OpenCLDevice *device, + rcti * /*rect*/, + uint /*chunk_number*/, + MemoryBuffer **input_memory_buffers, + MemoryBuffer *output_buffer) +{ + float *output_float_buffer = output_buffer->get_buffer(); + cl_int error; + /* + * 1. create cl_mem from output_buffer. + * 2. call NodeOperation (input) executeOpenCLChunk(...). + * 3. schedule read back from OPENCL to main device (output_buffer). + * 4. schedule native callback. + * + * NOTE: list of cl_mem will be filled by 2, and needs to be cleaned up by 4 + */ + /* STEP 1 */ + const uint output_buffer_width = output_buffer->get_width(); + const uint output_buffer_height = output_buffer->get_height(); + + const cl_image_format *image_format = OpenCLDevice::determine_image_format(output_buffer); + + cl_mem cl_output_buffer = clCreateImage2D(device->get_context(), + CL_MEM_WRITE_ONLY | CL_MEM_USE_HOST_PTR, + image_format, + output_buffer_width, + output_buffer_height, + 0, + output_float_buffer, + &error); + if (error != CL_SUCCESS) { + printf("CLERROR[%d]: %s\n", error, clewErrorString(error)); + } + + /* STEP 2 */ + std::list *cl_mem_to_clean_up = new std::list(); + cl_mem_to_clean_up->push_back(cl_output_buffer); + std::list *cl_kernels_to_clean_up = new std::list(); + + input_->execute_opencl(device, + output_buffer, + cl_output_buffer, + input_memory_buffers, + cl_mem_to_clean_up, + cl_kernels_to_clean_up); + + /* STEP 3 */ + + size_t origin[3] = {0, 0, 0}; + size_t region[3] = {output_buffer_width, output_buffer_height, 1}; + + // clFlush(queue); + // clFinish(queue); + + error = clEnqueueBarrier(device->get_queue()); + if (error != CL_SUCCESS) { + printf("CLERROR[%d]: %s\n", error, clewErrorString(error)); + } + error = clEnqueueReadImage(device->get_queue(), + cl_output_buffer, + CL_TRUE, + origin, + region, + 0, + 0, + output_float_buffer, + 0, + nullptr, + nullptr); + if (error != CL_SUCCESS) { + printf("CLERROR[%d]: %s\n", error, clewErrorString(error)); + } + + this->get_memory_proxy()->get_buffer()->fill_from(*output_buffer); + + /* STEP 4 */ + while (!cl_mem_to_clean_up->empty()) { + cl_mem mem = cl_mem_to_clean_up->front(); + error = clReleaseMemObject(mem); + if (error != CL_SUCCESS) { + printf("CLERROR[%d]: %s\n", error, clewErrorString(error)); + } + cl_mem_to_clean_up->pop_front(); + } + + while (!cl_kernels_to_clean_up->empty()) { + cl_kernel kernel = cl_kernels_to_clean_up->front(); + error = clReleaseKernel(kernel); + if (error != CL_SUCCESS) { + printf("CLERROR[%d]: %s\n", error, clewErrorString(error)); + } + cl_kernels_to_clean_up->pop_front(); + } + delete cl_kernels_to_clean_up; +} + +void WriteBufferOperation::determine_canvas(const rcti &preferred_area, rcti &r_area) +{ + NodeOperation::determine_canvas(preferred_area, r_area); + /* make sure there is at least one pixel stored in case the input is a single value */ + single_value_ = false; + if (BLI_rcti_size_x(&r_area) == 0) { + r_area.xmax += 1; + single_value_ = true; + } + if (BLI_rcti_size_y(&r_area) == 0) { + r_area.ymax += 1; + single_value_ = true; + } +} + +void WriteBufferOperation::read_resolution_from_input_socket() +{ + NodeOperation *input_operation = this->get_input_operation(0); + this->set_width(input_operation->get_width()); + this->set_height(input_operation->get_height()); +} + +} // namespace blender::compositor diff --git a/source/blender/compositor/operations/COM_WriteBufferOperation.h b/source/blender/compositor/operations/COM_WriteBufferOperation.h new file mode 100644 index 00000000000..8a615c0d2cb --- /dev/null +++ b/source/blender/compositor/operations/COM_WriteBufferOperation.h @@ -0,0 +1,53 @@ +/* SPDX-FileCopyrightText: 2011 Blender Authors + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +#pragma once + +#include "COM_MemoryProxy.h" +#include "COM_NodeOperation.h" + +namespace blender::compositor { + +class OpenCLDevice; +class MemoryProxy; + +/** + * \brief NodeOperation to write to a tile + * \ingroup Operation + */ +class WriteBufferOperation : public NodeOperation { + MemoryProxy *memory_proxy_; + bool single_value_; /* single value stored in buffer */ + NodeOperation *input_; + + public: + WriteBufferOperation(DataType datatype); + ~WriteBufferOperation(); + MemoryProxy *get_memory_proxy() + { + return memory_proxy_; + } + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + bool is_single_value() const + { + return single_value_; + } + + void execute_region(rcti *rect, unsigned int tile_number) override; + void init_execution() override; + void deinit_execution() override; + void execute_opencl_region(OpenCLDevice *device, + rcti *rect, + unsigned int chunk_number, + MemoryBuffer **memory_buffers, + MemoryBuffer *output_buffer) override; + void determine_canvas(const rcti &preferred_area, rcti &r_area) override; + void read_resolution_from_input_socket(); + inline NodeOperation *get_input() + { + return input_; + } +}; + +} // namespace blender::compositor diff --git a/source/blender/compositor/operations/COM_ZCombineOperation.cc b/source/blender/compositor/operations/COM_ZCombineOperation.cc index cfaf4f1672a..c4d696b65b4 100644 --- a/source/blender/compositor/operations/COM_ZCombineOperation.cc +++ b/source/blender/compositor/operations/COM_ZCombineOperation.cc @@ -14,9 +14,39 @@ ZCombineOperation::ZCombineOperation() this->add_input_socket(DataType::Value); this->add_output_socket(DataType::Color); + image1Reader_ = nullptr; + depth1Reader_ = nullptr; + image2Reader_ = nullptr; + depth2Reader_ = nullptr; flags_.can_be_constant = true; } +void ZCombineOperation::init_execution() +{ + image1Reader_ = this->get_input_socket_reader(0); + depth1Reader_ = this->get_input_socket_reader(1); + image2Reader_ = this->get_input_socket_reader(2); + depth2Reader_ = this->get_input_socket_reader(3); +} + +void ZCombineOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float depth1[4]; + float depth2[4]; + + depth1Reader_->read_sampled(depth1, x, y, sampler); + depth2Reader_->read_sampled(depth2, x, y, sampler); + if (depth1[0] < depth2[0]) { + image1Reader_->read_sampled(output, x, y, sampler); + } + else { + image2Reader_->read_sampled(output, x, y, sampler); + } +} + void ZCombineOperation::update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span inputs) @@ -29,6 +59,34 @@ void ZCombineOperation::update_memory_buffer_partial(MemoryBuffer *output, } } +void ZCombineAlphaOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float depth1[4]; + float depth2[4]; + float color1[4]; + float color2[4]; + + depth1Reader_->read_sampled(depth1, x, y, sampler); + depth2Reader_->read_sampled(depth2, x, y, sampler); + if (depth1[0] < depth2[0]) { + image1Reader_->read_sampled(color1, x, y, sampler); + image2Reader_->read_sampled(color2, x, y, sampler); + } + else { + image1Reader_->read_sampled(color2, x, y, sampler); + image2Reader_->read_sampled(color1, x, y, sampler); + } + float fac = color1[3]; + float ifac = 1.0f - fac; + output[0] = fac * color1[0] + ifac * color2[0]; + output[1] = fac * color1[1] + ifac * color2[1]; + output[2] = fac * color1[2] + ifac * color2[2]; + output[3] = std::max(color1[3], color2[3]); +} + void ZCombineAlphaOperation::update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span inputs) @@ -55,6 +113,14 @@ void ZCombineAlphaOperation::update_memory_buffer_partial(MemoryBuffer *output, } } +void ZCombineOperation::deinit_execution() +{ + image1Reader_ = nullptr; + depth1Reader_ = nullptr; + image2Reader_ = nullptr; + depth2Reader_ = nullptr; +} + // MASK combine ZCombineMaskOperation::ZCombineMaskOperation() { @@ -62,6 +128,33 @@ ZCombineMaskOperation::ZCombineMaskOperation() this->add_input_socket(DataType::Color); this->add_input_socket(DataType::Color); this->add_output_socket(DataType::Color); + + mask_reader_ = nullptr; + image1Reader_ = nullptr; + image2Reader_ = nullptr; +} + +void ZCombineMaskOperation::init_execution() +{ + mask_reader_ = this->get_input_socket_reader(0); + image1Reader_ = this->get_input_socket_reader(1); + image2Reader_ = this->get_input_socket_reader(2); +} + +void ZCombineMaskOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float mask[4]; + float color1[4]; + float color2[4]; + + mask_reader_->read_sampled(mask, x, y, sampler); + image1Reader_->read_sampled(color1, x, y, sampler); + image2Reader_->read_sampled(color2, x, y, sampler); + + interp_v4_v4v4(output, color1, color2, 1.0f - mask[0]); } void ZCombineMaskOperation::update_memory_buffer_partial(MemoryBuffer *output, @@ -76,6 +169,28 @@ void ZCombineMaskOperation::update_memory_buffer_partial(MemoryBuffer *output, } } +void ZCombineMaskAlphaOperation::execute_pixel_sampled(float output[4], + float x, + float y, + PixelSampler sampler) +{ + float mask[4]; + float color1[4]; + float color2[4]; + + mask_reader_->read_sampled(mask, x, y, sampler); + image1Reader_->read_sampled(color1, x, y, sampler); + image2Reader_->read_sampled(color2, x, y, sampler); + + float fac = (1.0f - mask[0]) * (1.0f - color1[3]) + mask[0] * color2[3]; + float mfac = 1.0f - fac; + + output[0] = color1[0] * mfac + color2[0] * fac; + output[1] = color1[1] * mfac + color2[1] * fac; + output[2] = color1[2] * mfac + color2[2] * fac; + output[3] = std::max(color1[3], color2[3]); +} + void ZCombineMaskAlphaOperation::update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span inputs) @@ -94,4 +209,11 @@ void ZCombineMaskAlphaOperation::update_memory_buffer_partial(MemoryBuffer *outp } } +void ZCombineMaskOperation::deinit_execution() +{ + image1Reader_ = nullptr; + mask_reader_ = nullptr; + image2Reader_ = nullptr; +} + } // namespace blender::compositor diff --git a/source/blender/compositor/operations/COM_ZCombineOperation.h b/source/blender/compositor/operations/COM_ZCombineOperation.h index efe0b2a2075..52b461ccce8 100644 --- a/source/blender/compositor/operations/COM_ZCombineOperation.h +++ b/source/blender/compositor/operations/COM_ZCombineOperation.h @@ -13,29 +13,59 @@ namespace blender::compositor { * it assumes we are in sRGB color space. */ class ZCombineOperation : public MultiThreadedOperation { + protected: + SocketReader *image1Reader_; + SocketReader *depth1Reader_; + SocketReader *image2Reader_; + SocketReader *depth2Reader_; + public: + /** + * Default constructor + */ ZCombineOperation(); + void init_execution() override; + void deinit_execution() override; + + /** + * The inner loop of this operation. + */ + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + void update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span inputs) override; }; class ZCombineAlphaOperation : public ZCombineOperation { + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + void update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span inputs) override; }; class ZCombineMaskOperation : public MultiThreadedOperation { + protected: + SocketReader *mask_reader_; + SocketReader *image1Reader_; + SocketReader *image2Reader_; + public: ZCombineMaskOperation(); + void init_execution() override; + void deinit_execution() override; + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + void update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span inputs) override; }; class ZCombineMaskAlphaOperation : public ZCombineMaskOperation { + void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override; + void update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span inputs) override; diff --git a/source/blender/compositor/realtime_compositor/CMakeLists.txt b/source/blender/compositor/realtime_compositor/CMakeLists.txt index df90fddbb79..da11d37809b 100644 --- a/source/blender/compositor/realtime_compositor/CMakeLists.txt +++ b/source/blender/compositor/realtime_compositor/CMakeLists.txt @@ -150,8 +150,8 @@ set(GLSL_SRC shaders/compositor_ellipse_mask.glsl shaders/compositor_filter.glsl shaders/compositor_flip.glsl - shaders/compositor_glare_bloom_downsample.glsl - shaders/compositor_glare_bloom_upsample.glsl + shaders/compositor_glare_fog_glow_downsample.glsl + shaders/compositor_glare_fog_glow_upsample.glsl shaders/compositor_glare_ghost_accumulate.glsl shaders/compositor_glare_ghost_base.glsl shaders/compositor_glare_highlights.glsl @@ -191,9 +191,7 @@ set(GLSL_SRC shaders/compositor_parallel_reduction.glsl shaders/compositor_pixelate.glsl shaders/compositor_plane_deform.glsl - shaders/compositor_plane_deform_mask.glsl shaders/compositor_plane_deform_motion_blur.glsl - shaders/compositor_plane_deform_motion_blur_mask.glsl shaders/compositor_premultiply_alpha.glsl shaders/compositor_projector_lens_distortion.glsl shaders/compositor_read_input.glsl @@ -317,6 +315,7 @@ set(SRC_SHADER_CREATE_INFOS shaders/infos/compositor_parallel_reduction_info.hh shaders/infos/compositor_pixelate_info.hh shaders/infos/compositor_plane_deform_info.hh + shaders/infos/compositor_plane_deform_motion_blur_info.hh shaders/infos/compositor_premultiply_alpha_info.hh shaders/infos/compositor_projector_lens_distortion_info.hh shaders/infos/compositor_read_input_info.hh diff --git a/source/blender/compositor/realtime_compositor/COM_context.hh b/source/blender/compositor/realtime_compositor/COM_context.hh index 90900e79970..bf4e70c621c 100644 --- a/source/blender/compositor/realtime_compositor/COM_context.hh +++ b/source/blender/compositor/realtime_compositor/COM_context.hh @@ -112,10 +112,6 @@ class Context { * render pipeline. */ virtual RenderContext *render_context() const; - /* Returns true if the compositor evaluation is canceled and that the evaluator should stop - * executing as soon as possible. */ - virtual bool is_canceled() const; - /* Get the size of the compositing region. See get_compositing_region(). The output size is * sanitized such that it is at least 1 in both dimensions. However, the developer is expected to * gracefully handled zero sizes regions by checking the is_valid_compositing_region method. */ diff --git a/source/blender/compositor/realtime_compositor/algorithms/COM_algorithm_parallel_reduction.hh b/source/blender/compositor/realtime_compositor/algorithms/COM_algorithm_parallel_reduction.hh index 23b52a2894a..d6d7dab321a 100644 --- a/source/blender/compositor/realtime_compositor/algorithms/COM_algorithm_parallel_reduction.hh +++ b/source/blender/compositor/realtime_compositor/algorithms/COM_algorithm_parallel_reduction.hh @@ -72,9 +72,6 @@ float sum_luminance_squared_difference(Context &context, * coefficients to compute the luminance. */ float maximum_luminance(Context &context, GPUTexture *texture, float3 luminance_coefficients); -/* Computes the maximum float value of all pixels in the given texture. */ -float maximum_float(Context &context, GPUTexture *texture); - /* Computes the maximum float of all pixels in the given float texture, limited to the given range. * Values outside of the given range are ignored. If non of the pixel values are in the range, the * lower bound of the range is returned. For instance, if the given range is [-10, 10] and the @@ -94,9 +91,6 @@ float maximum_float_in_range(Context &context, * coefficients to compute the luminance. */ float minimum_luminance(Context &context, GPUTexture *texture, float3 luminance_coefficients); -/* Computes the minimum float value of all pixels in the given texture. */ -float minimum_float(Context &context, GPUTexture *texture); - /* Computes the minimum float of all pixels in the given float texture, limited to the given range. * Values outside of the given range are ignored. If non of the pixel values are in the range, the * upper bound of the range is returned. For instance, if the given range is [-10, 10] and the diff --git a/source/blender/compositor/realtime_compositor/algorithms/intern/morphological_distance_feather.cc b/source/blender/compositor/realtime_compositor/algorithms/intern/morphological_distance_feather.cc index 74ee0c75e3d..4f25c766260 100644 --- a/source/blender/compositor/realtime_compositor/algorithms/intern/morphological_distance_feather.cc +++ b/source/blender/compositor/realtime_compositor/algorithms/intern/morphological_distance_feather.cc @@ -9,6 +9,7 @@ #include "GPU_texture.h" #include "COM_algorithm_morphological_distance_feather.hh" /* Own include. */ +#include "COM_algorithm_symmetric_separable_blur.hh" #include "COM_context.hh" #include "COM_morphological_distance_feather_weights.hh" #include "COM_result.hh" diff --git a/source/blender/compositor/realtime_compositor/algorithms/intern/parallel_reduction.cc b/source/blender/compositor/realtime_compositor/algorithms/intern/parallel_reduction.cc index b62118bc3d6..933fecde44a 100644 --- a/source/blender/compositor/realtime_compositor/algorithms/intern/parallel_reduction.cc +++ b/source/blender/compositor/realtime_compositor/algorithms/intern/parallel_reduction.cc @@ -12,6 +12,7 @@ #include "GPU_texture.h" #include "COM_context.hh" +#include "COM_utilities.hh" #include "COM_algorithm_parallel_reduction.hh" @@ -265,20 +266,6 @@ float maximum_luminance(Context &context, GPUTexture *texture, float3 luminance_ return maximum; } -float maximum_float(Context &context, GPUTexture *texture) -{ - GPUShader *shader = context.get_shader("compositor_maximum_float", ResultPrecision::Full); - GPU_shader_bind(shader); - - float *reduced_value = parallel_reduction_dispatch( - context, texture, shader, Result::texture_format(ResultType::Float, ResultPrecision::Full)); - const float maximum = *reduced_value; - MEM_freeN(reduced_value); - GPU_shader_unbind(); - - return maximum; -} - float maximum_float_in_range(Context &context, GPUTexture *texture, float lower_bound, @@ -320,20 +307,6 @@ float minimum_luminance(Context &context, GPUTexture *texture, float3 luminance_ return minimum; } -float minimum_float(Context &context, GPUTexture *texture) -{ - GPUShader *shader = context.get_shader("compositor_minimum_float", ResultPrecision::Full); - GPU_shader_bind(shader); - - float *reduced_value = parallel_reduction_dispatch( - context, texture, shader, Result::texture_format(ResultType::Float, ResultPrecision::Full)); - const float minimum = *reduced_value; - MEM_freeN(reduced_value); - GPU_shader_unbind(); - - return minimum; -} - float minimum_float_in_range(Context &context, GPUTexture *texture, float lower_bound, diff --git a/source/blender/compositor/realtime_compositor/cached_resources/intern/cached_mask.cc b/source/blender/compositor/realtime_compositor/cached_resources/intern/cached_mask.cc index 58c8daa239a..68277554f80 100644 --- a/source/blender/compositor/realtime_compositor/cached_resources/intern/cached_mask.cc +++ b/source/blender/compositor/realtime_compositor/cached_resources/intern/cached_mask.cc @@ -8,6 +8,7 @@ #include "BLI_array.hh" #include "BLI_hash.hh" #include "BLI_index_range.hh" +#include "BLI_listbase.h" #include "BLI_math_vector_types.hh" #include "BLI_task.hh" diff --git a/source/blender/compositor/realtime_compositor/cached_resources/intern/ocio_color_space_conversion_shader.cc b/source/blender/compositor/realtime_compositor/cached_resources/intern/ocio_color_space_conversion_shader.cc index c9eb4c36919..77bd2c66990 100644 --- a/source/blender/compositor/realtime_compositor/cached_resources/intern/ocio_color_space_conversion_shader.cc +++ b/source/blender/compositor/realtime_compositor/cached_resources/intern/ocio_color_space_conversion_shader.cc @@ -16,7 +16,7 @@ #include "GPU_capabilities.h" #include "GPU_shader.h" #include "GPU_texture.h" -#include "GPU_uniform_buffer.hh" +#include "GPU_uniform_buffer.h" #include "gpu_shader_create_info.hh" diff --git a/source/blender/compositor/realtime_compositor/intern/compile_state.cc b/source/blender/compositor/realtime_compositor/intern/compile_state.cc index cdac5ca4532..f1f42ebc25d 100644 --- a/source/blender/compositor/realtime_compositor/intern/compile_state.cc +++ b/source/blender/compositor/realtime_compositor/intern/compile_state.cc @@ -74,8 +74,7 @@ ShaderCompileUnit &CompileState::get_shader_compile_unit() void CompileState::reset_shader_compile_unit() { - shader_compile_unit_.clear(); - shader_compile_unit_domain_ = Domain::identity(); + return shader_compile_unit_.clear(); } bool CompileState::should_compile_shader_compile_unit(DNode node) diff --git a/source/blender/compositor/realtime_compositor/intern/context.cc b/source/blender/compositor/realtime_compositor/intern/context.cc index 2b49705b895..61cb7939232 100644 --- a/source/blender/compositor/realtime_compositor/intern/context.cc +++ b/source/blender/compositor/realtime_compositor/intern/context.cc @@ -5,13 +5,10 @@ #include "BLI_math_vector.hh" #include "BLI_rect.h" -#include "DNA_node_types.h" #include "DNA_vec_types.h" #include "GPU_shader.h" -#include "BKE_node_runtime.hh" - #include "COM_context.hh" #include "COM_render_context.hh" #include "COM_static_cache_manager.hh" @@ -26,14 +23,6 @@ RenderContext *Context::render_context() const return nullptr; } -bool Context::is_canceled() const -{ - if (!this->get_node_tree().runtime->test_break) { - return false; - } - return this->get_node_tree().runtime->test_break(get_node_tree().runtime->tbh); -} - int2 Context::get_compositing_region_size() const { const rcti compositing_region = get_compositing_region(); diff --git a/source/blender/compositor/realtime_compositor/intern/node_operation.cc b/source/blender/compositor/realtime_compositor/intern/node_operation.cc index 19fb8e40630..1b17845fba7 100644 --- a/source/blender/compositor/realtime_compositor/intern/node_operation.cc +++ b/source/blender/compositor/realtime_compositor/intern/node_operation.cc @@ -20,7 +20,7 @@ #include "NOD_derived_node_tree.hh" #include "NOD_node_declaration.hh" -#include "BKE_node.hh" +#include "BKE_node.h" #include "COM_context.hh" #include "COM_input_descriptor.hh" diff --git a/source/blender/compositor/realtime_compositor/intern/render_context.cc b/source/blender/compositor/realtime_compositor/intern/render_context.cc index 6bd7a7b8656..86dc5bb6d3c 100644 --- a/source/blender/compositor/realtime_compositor/intern/render_context.cc +++ b/source/blender/compositor/realtime_compositor/intern/render_context.cc @@ -8,6 +8,7 @@ #include "BLI_assert.h" #include "BLI_listbase.h" #include "BLI_map.hh" +#include "BLI_math_base.hh" #include "BLI_math_vector_types.hh" #include "BLI_string.h" #include "BLI_utildefines.h" @@ -22,7 +23,7 @@ #include "BKE_image.h" #include "BKE_image_save.h" -#include "BKE_report.hh" +#include "BKE_report.h" #include "RE_pipeline.h" diff --git a/source/blender/compositor/realtime_compositor/intern/scheduler.cc b/source/blender/compositor/realtime_compositor/intern/scheduler.cc index 9e7e3fc5f00..70d8c05ff2b 100644 --- a/source/blender/compositor/realtime_compositor/intern/scheduler.cc +++ b/source/blender/compositor/realtime_compositor/intern/scheduler.cc @@ -10,6 +10,7 @@ #include "NOD_derived_node_tree.hh" +#include "BKE_node.hh" #include "BKE_node_runtime.hh" #include "COM_context.hh" diff --git a/source/blender/compositor/realtime_compositor/intern/shader_operation.cc b/source/blender/compositor/realtime_compositor/intern/shader_operation.cc index 8ef4e9555fa..a59b3f11796 100644 --- a/source/blender/compositor/realtime_compositor/intern/shader_operation.cc +++ b/source/blender/compositor/realtime_compositor/intern/shader_operation.cc @@ -17,7 +17,7 @@ #include "GPU_material.hh" #include "GPU_shader.h" #include "GPU_texture.h" -#include "GPU_uniform_buffer.hh" +#include "GPU_uniform_buffer.h" #include "gpu_shader_create_info.hh" diff --git a/source/blender/compositor/realtime_compositor/shaders/compositor_glare_bloom_downsample.glsl b/source/blender/compositor/realtime_compositor/shaders/compositor_glare_fog_glow_downsample.glsl similarity index 100% rename from source/blender/compositor/realtime_compositor/shaders/compositor_glare_bloom_downsample.glsl rename to source/blender/compositor/realtime_compositor/shaders/compositor_glare_fog_glow_downsample.glsl diff --git a/source/blender/compositor/realtime_compositor/shaders/compositor_glare_bloom_upsample.glsl b/source/blender/compositor/realtime_compositor/shaders/compositor_glare_fog_glow_upsample.glsl similarity index 100% rename from source/blender/compositor/realtime_compositor/shaders/compositor_glare_bloom_upsample.glsl rename to source/blender/compositor/realtime_compositor/shaders/compositor_glare_fog_glow_upsample.glsl diff --git a/source/blender/compositor/realtime_compositor/shaders/compositor_plane_deform.glsl b/source/blender/compositor/realtime_compositor/shaders/compositor_plane_deform.glsl index ced3b24691f..54e1b19b419 100644 --- a/source/blender/compositor/realtime_compositor/shaders/compositor_plane_deform.glsl +++ b/source/blender/compositor/realtime_compositor/shaders/compositor_plane_deform.glsl @@ -8,6 +8,8 @@ void main() { ivec2 texel = ivec2(gl_GlobalInvocationID.xy); + /* Add 0.5 to evaluate the input sampler at the center of the pixel and divide by the image size + * to get the coordinates into the sampler's expected [0, 1] range. */ vec2 coordinates = (vec2(texel) + vec2(0.5)) / vec2(texture_size(input_tx)); vec3 transformed_coordinates = mat3(homography_matrix) * vec3(coordinates, 1.0); @@ -21,8 +23,14 @@ void main() vec4 sampled_color = textureGrad(input_tx, projected_coordinates, x_gradient, y_gradient); - /* Premultiply the mask value as an alpha. */ - vec4 plane_color = sampled_color * texture_load(mask_tx, texel).x; + /* The plane mask is 1 if it is inside the plane and 0 otherwise. However, we use the alpha value + * of the sampled color for pixels outside of the plane to utilize the anti-aliasing effect of + * the anisotropic filtering. Therefore, the input_tx sampler should use anisotropic filtering + * and be clamped to zero border color. */ + bool is_inside_plane = all(greaterThanEqual(projected_coordinates, vec2(0.0))) && + all(lessThanEqual(projected_coordinates, vec2(1.0))); + float mask_value = is_inside_plane ? 1.0 : sampled_color.a; - imageStore(output_img, texel, plane_color); + imageStore(output_img, texel, sampled_color); + imageStore(mask_img, texel, vec4(mask_value)); } diff --git a/source/blender/compositor/realtime_compositor/shaders/compositor_plane_deform_mask.glsl b/source/blender/compositor/realtime_compositor/shaders/compositor_plane_deform_mask.glsl deleted file mode 100644 index 4762ab8c3c3..00000000000 --- a/source/blender/compositor/realtime_compositor/shaders/compositor_plane_deform_mask.glsl +++ /dev/null @@ -1,19 +0,0 @@ -/* SPDX-FileCopyrightText: 2024 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -void main() -{ - ivec2 texel = ivec2(gl_GlobalInvocationID.xy); - - vec2 coordinates = (vec2(texel) + vec2(0.5)) / vec2(imageSize(mask_img)); - - vec3 transformed_coordinates = mat3(homography_matrix) * vec3(coordinates, 1.0); - vec2 projected_coordinates = transformed_coordinates.xy / transformed_coordinates.z; - - bool is_inside_plane = all(greaterThanEqual(projected_coordinates, vec2(0.0))) && - all(lessThanEqual(projected_coordinates, vec2(1.0))); - float mask_value = is_inside_plane ? 1.0 : 0.0; - - imageStore(mask_img, texel, vec4(mask_value)); -} diff --git a/source/blender/compositor/realtime_compositor/shaders/compositor_plane_deform_motion_blur.glsl b/source/blender/compositor/realtime_compositor/shaders/compositor_plane_deform_motion_blur.glsl index e4981d6dacd..199f517c631 100644 --- a/source/blender/compositor/realtime_compositor/shaders/compositor_plane_deform_motion_blur.glsl +++ b/source/blender/compositor/realtime_compositor/shaders/compositor_plane_deform_motion_blur.glsl @@ -2,14 +2,17 @@ * * SPDX-License-Identifier: GPL-2.0-or-later */ -#pragma BLENDER_REQUIRE(gpu_shader_compositor_texture_utilities.glsl) - void main() { ivec2 texel = ivec2(gl_GlobalInvocationID.xy); - vec2 coordinates = (vec2(texel) + vec2(0.5)) / vec2(imageSize(output_img)); + /* Add 0.5 to evaluate the sampler at the center of the pixel and divide by the size to get the + * coordinates into the sampler's expected [0, 1] range. We choose the maximum between both + * output sizes because one of the outputs might be a dummy 1x1 image. */ + ivec2 output_size = max(imageSize(output_img), imageSize(mask_img)); + vec2 coordinates = (vec2(texel) + vec2(0.5)) / vec2(output_size); + float accumulated_mask = 0.0; vec4 accumulated_color = vec4(0.0); for (int i = 0; i < number_of_motion_blur_samples; i++) { mat3 homography_matrix = mat3(homography_matrices[i]); @@ -25,12 +28,19 @@ void main() vec4 sampled_color = textureGrad(input_tx, projected_coordinates, x_gradient, y_gradient); accumulated_color += sampled_color; + + /* The plane mask is 1 if it is inside the plane and 0 otherwise. However, we use the alpha + * value of the sampled color for pixels outside of the plane to utilize the anti-aliasing + * effect of the anisotropic filtering. Therefore, the input_tx sampler should use anisotropic + * filtering and be clamped to zero border color. */ + bool is_inside_plane = all(greaterThanEqual(projected_coordinates, vec2(0.0))) && + all(lessThanEqual(projected_coordinates, vec2(1.0))); + accumulated_mask += is_inside_plane ? 1.0 : sampled_color.a; } + accumulated_mask /= number_of_motion_blur_samples; accumulated_color /= number_of_motion_blur_samples; - /* Premultiply the mask value as an alpha. */ - vec4 plane_color = accumulated_color * texture_load(mask_tx, texel).x; - - imageStore(output_img, texel, plane_color); + imageStore(output_img, texel, accumulated_color); + imageStore(mask_img, texel, vec4(accumulated_mask)); } diff --git a/source/blender/compositor/realtime_compositor/shaders/compositor_plane_deform_motion_blur_mask.glsl b/source/blender/compositor/realtime_compositor/shaders/compositor_plane_deform_motion_blur_mask.glsl deleted file mode 100644 index 9f41bf6aa88..00000000000 --- a/source/blender/compositor/realtime_compositor/shaders/compositor_plane_deform_motion_blur_mask.glsl +++ /dev/null @@ -1,26 +0,0 @@ -/* SPDX-FileCopyrightText: 2024 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -void main() -{ - ivec2 texel = ivec2(gl_GlobalInvocationID.xy); - - vec2 coordinates = (vec2(texel) + vec2(0.5)) / vec2(imageSize(mask_img)); - - float accumulated_mask = 0.0; - for (int i = 0; i < number_of_motion_blur_samples; i++) { - mat3 homography_matrix = mat3(homography_matrices[i]); - - vec3 transformed_coordinates = homography_matrix * vec3(coordinates, 1.0); - vec2 projected_coordinates = transformed_coordinates.xy / transformed_coordinates.z; - - bool is_inside_plane = all(greaterThanEqual(projected_coordinates, vec2(0.0))) && - all(lessThanEqual(projected_coordinates, vec2(1.0))); - accumulated_mask += is_inside_plane ? 1.0 : 0.0; - } - - accumulated_mask /= number_of_motion_blur_samples; - - imageStore(mask_img, texel, vec4(accumulated_mask)); -} diff --git a/source/blender/compositor/realtime_compositor/shaders/compositor_symmetric_blur_variable_size.glsl b/source/blender/compositor/realtime_compositor/shaders/compositor_symmetric_blur_variable_size.glsl index d1d40cf19dc..efe57042aab 100644 --- a/source/blender/compositor/realtime_compositor/shaders/compositor_symmetric_blur_variable_size.glsl +++ b/source/blender/compositor/realtime_compositor/shaders/compositor_symmetric_blur_variable_size.glsl @@ -38,10 +38,10 @@ float load_size(ivec2 texel) { if (extend_bounds) { ivec2 blur_radius = texture_size(weights_tx) - 1; - return clamp(texture_load(size_tx, texel - blur_radius).x, 0.0, 1.0); + return texture_load(size_tx, texel - blur_radius).x; } else { - return clamp(texture_load(size_tx, texel).x, 0.0, 1.0); + return texture_load(size_tx, texel).x; } } @@ -52,57 +52,100 @@ void main() vec4 accumulated_color = vec4(0.0); vec4 accumulated_weight = vec4(0.0); - /* The weights texture only stores the weights for the first quadrant, but since the weights are - * symmetric, other quadrants can be found using mirroring. It follows that the base blur radius - * is the weights texture size minus one, where the one corresponds to the zero weight. */ - ivec2 weights_size = texture_size(weights_tx); - ivec2 base_radius = weights_size - ivec2(1); - ivec2 radius = ivec2(ceil(vec2(base_radius) * load_size(texel))); - vec2 coordinates_scale = vec2(1.0) / vec2(radius + ivec2(1)); - /* First, compute the contribution of the center pixel. */ vec4 center_color = load_input(texel); float center_weight = texture_load(weights_tx, ivec2(0)).x; accumulated_color += center_color * center_weight; accumulated_weight += center_weight; - /* Then, compute the contributions of the pixels along the x axis of the filter, noting that the - * weights texture only stores the weights for the positive half, but since the filter is - * symmetric, the same weight is used for the negative half and we add both of their + ivec2 weights_size = texture_size(weights_tx); + + /* Then, compute the contributions of the pixels along the x axis of the filter, but only + * accumulate them if their distance to the center is less their computed variable blur size, + * noting that the weights texture only stores the weights for the positive half, but since the + * filter is symmetric, the same weight is used for the negative half and we add both of their * contributions. */ - for (int x = 1; x <= radius.x; x++) { - float weight_coordinates = (x + 0.5) * coordinates_scale.x; - float weight = texture(weights_tx, vec2(weight_coordinates, 0.0)).x; - accumulated_color += load_input(texel + ivec2(x, 0)) * weight; - accumulated_color += load_input(texel + ivec2(-x, 0)) * weight; - accumulated_weight += weight * 2.0; + for (int x = 1; x < weights_size.x; x++) { + float weight = texture_load(weights_tx, ivec2(x, 0)).x; + + float right_size = load_size(texel + ivec2(x, 0)); + float right_blur_radius = right_size * weights_size.x; + if (x < right_blur_radius) { + accumulated_color += load_input(texel + ivec2(x, 0)) * weight; + accumulated_weight += weight; + } + + float left_size = load_size(texel + ivec2(-x, 0)); + float left_blur_radius = right_size * weights_size.x; + if (x < left_blur_radius) { + accumulated_color += load_input(texel + ivec2(-x, 0)) * weight; + accumulated_weight += weight; + } } - /* Then, compute the contributions of the pixels along the y axis of the filter, noting that the - * weights texture only stores the weights for the positive half, but since the filter is - * symmetric, the same weight is used for the negative half and we add both of their + /* Then, compute the contributions of the pixels along the y axis of the filter, but only + * accumulate them if their distance to the center is less their computed variable blur size, + * noting that the weights texture only stores the weights for the positive half, but since the + * filter is symmetric, the same weight is used for the negative half and we add both of their * contributions. */ - for (int y = 1; y <= radius.y; y++) { - float weight_coordinates = (y + 0.5) * coordinates_scale.y; - float weight = texture(weights_tx, vec2(0.0, weight_coordinates)).x; - accumulated_color += load_input(texel + ivec2(0, y)) * weight; - accumulated_color += load_input(texel + ivec2(0, -y)) * weight; - accumulated_weight += weight * 2.0; + for (int y = 1; y < weights_size.y; y++) { + float weight = texture_load(weights_tx, ivec2(0, y)).x; + + float top_size = load_size(texel + ivec2(0, y)); + float top_blur_radius = top_size * weights_size.y; + if (y < top_blur_radius) { + accumulated_color += load_input(texel + ivec2(0, y)) * weight; + accumulated_weight += weight; + } + + float bottom_size = load_size(texel + ivec2(0, -y)); + float bottom_blur_radius = bottom_size * weights_size.x; + if (y < bottom_blur_radius) { + accumulated_color += load_input(texel + ivec2(0, -y)) * weight; + accumulated_weight += weight; + } } - /* Finally, compute the contributions of the pixels in the four quadrants of the filter, noting - * that the weights texture only stores the weights for the upper right quadrant, but since the - * filter is symmetric, the same weight is used for the rest of the quadrants and we add all four - * of their contributions. */ - for (int y = 1; y <= radius.y; y++) { - for (int x = 1; x <= radius.x; x++) { - vec2 weight_coordinates = (vec2(x, y) + vec2(0.5)) * coordinates_scale; - float weight = texture(weights_tx, weight_coordinates).x; - accumulated_color += load_input(texel + ivec2(x, y)) * weight; - accumulated_color += load_input(texel + ivec2(-x, y)) * weight; - accumulated_color += load_input(texel + ivec2(x, -y)) * weight; - accumulated_color += load_input(texel + ivec2(-x, -y)) * weight; - accumulated_weight += weight * 4.0; + /* Finally, compute the contributions of the pixels in the four quadrants of the filter, but only + * accumulate them if the center lies inside the rectangle centered at the pixel whose width and + * height is the variable blur size, noting that the weights texture only stores the weights for + * the upper right quadrant, but since the filter is symmetric, the same weight is used for the + * rest of the quadrants and we add all four of their contributions. */ + for (int y = 1; y < weights_size.y; y++) { + for (int x = 1; x < weights_size.x; x++) { + float weight = texture_load(weights_tx, ivec2(x, y)).x; + + /* Upper right quadrant. */ + float upper_right_size = load_size(texel + ivec2(x, y)); + vec2 upper_right_blur_radius = upper_right_size * vec2(weights_size); + if (x < upper_right_blur_radius.x && y < upper_right_blur_radius.y) { + accumulated_color += load_input(texel + ivec2(x, y)) * weight; + accumulated_weight += weight; + } + + /* Upper left quadrant. */ + float upper_left_size = load_size(texel + ivec2(-x, y)); + vec2 upper_left_blur_radius = upper_left_size * vec2(weights_size); + if (x < upper_left_blur_radius.x && y < upper_left_blur_radius.y) { + accumulated_color += load_input(texel + ivec2(-x, y)) * weight; + accumulated_weight += weight; + } + + /* Bottom right quadrant. */ + float bottom_right_size = load_size(texel + ivec2(x, -y)); + vec2 bottom_right_blur_radius = bottom_right_size * vec2(weights_size); + if (x < bottom_right_blur_radius.x && y < bottom_right_blur_radius.y) { + accumulated_color += load_input(texel + ivec2(x, -y)) * weight; + accumulated_weight += weight; + } + + /* Bottom left quadrant. */ + float bottom_left_size = load_size(texel + ivec2(-x, -y)); + vec2 bottom_left_blur_radius = bottom_left_size * vec2(weights_size); + if (x < bottom_left_blur_radius.x && y < bottom_left_blur_radius.y) { + accumulated_color += load_input(texel + ivec2(-x, -y)) * weight; + accumulated_weight += weight; + } } } diff --git a/source/blender/compositor/realtime_compositor/shaders/compositor_write_output.glsl b/source/blender/compositor/realtime_compositor/shaders/compositor_write_output.glsl index 1cc526bf574..0f53afec776 100644 --- a/source/blender/compositor/realtime_compositor/shaders/compositor_write_output.glsl +++ b/source/blender/compositor/realtime_compositor/shaders/compositor_write_output.glsl @@ -7,11 +7,6 @@ void main() { ivec2 texel = ivec2(gl_GlobalInvocationID.xy); - ivec2 output_texel = texel + lower_bound; - if (any(greaterThan(output_texel, upper_bound))) { - return; - } - vec4 input_color = texture_load(input_tx, texel); #if defined(DIRECT_OUTPUT) diff --git a/source/blender/compositor/realtime_compositor/shaders/infos/compositor_glare_info.hh b/source/blender/compositor/realtime_compositor/shaders/infos/compositor_glare_info.hh index 397d61a68a2..9e74a62b2f7 100644 --- a/source/blender/compositor/realtime_compositor/shaders/infos/compositor_glare_info.hh +++ b/source/blender/compositor/realtime_compositor/shaders/infos/compositor_glare_info.hh @@ -107,29 +107,29 @@ GPU_SHADER_CREATE_INFO(compositor_glare_streaks_accumulate) .compute_source("compositor_glare_streaks_accumulate.glsl") .do_static_compilation(true); -/* ----- - * Bloom - * ----- */ +/* -------- + * Fog Glow + * -------- */ -GPU_SHADER_CREATE_INFO(compositor_glare_bloom_downsample_shared) +GPU_SHADER_CREATE_INFO(compositor_glare_fog_glow_downsample_shared) .local_group_size(16, 16) .sampler(0, ImageType::FLOAT_2D, "input_tx") .image(0, GPU_RGBA16F, Qualifier::WRITE, ImageType::FLOAT_2D, "output_img") - .compute_source("compositor_glare_bloom_downsample.glsl"); + .compute_source("compositor_glare_fog_glow_downsample.glsl"); -GPU_SHADER_CREATE_INFO(compositor_glare_bloom_downsample_simple_average) +GPU_SHADER_CREATE_INFO(compositor_glare_fog_glow_downsample_simple_average) .define("SIMPLE_AVERAGE") - .additional_info("compositor_glare_bloom_downsample_shared") + .additional_info("compositor_glare_fog_glow_downsample_shared") .do_static_compilation(true); -GPU_SHADER_CREATE_INFO(compositor_glare_bloom_downsample_karis_average) +GPU_SHADER_CREATE_INFO(compositor_glare_fog_glow_downsample_karis_average) .define("KARIS_AVERAGE") - .additional_info("compositor_glare_bloom_downsample_shared") + .additional_info("compositor_glare_fog_glow_downsample_shared") .do_static_compilation(true); -GPU_SHADER_CREATE_INFO(compositor_glare_bloom_upsample) +GPU_SHADER_CREATE_INFO(compositor_glare_fog_glow_upsample) .local_group_size(16, 16) .sampler(0, ImageType::FLOAT_2D, "input_tx") .image(0, GPU_RGBA16F, Qualifier::READ_WRITE, ImageType::FLOAT_2D, "output_img") - .compute_source("compositor_glare_bloom_upsample.glsl") + .compute_source("compositor_glare_fog_glow_upsample.glsl") .do_static_compilation(true); diff --git a/source/blender/compositor/realtime_compositor/shaders/infos/compositor_parallel_reduction_info.hh b/source/blender/compositor/realtime_compositor/shaders/infos/compositor_parallel_reduction_info.hh index b0859269a99..c3201d1fcc2 100644 --- a/source/blender/compositor/realtime_compositor/shaders/infos/compositor_parallel_reduction_info.hh +++ b/source/blender/compositor/realtime_compositor/shaders/infos/compositor_parallel_reduction_info.hh @@ -111,17 +111,6 @@ GPU_SHADER_CREATE_INFO(compositor_maximum_luminance) .define("REDUCE(lhs, rhs)", "max(lhs, rhs)") .do_static_compilation(true); -GPU_SHADER_CREATE_INFO(compositor_maximum_float) - .additional_info("compositor_parallel_reduction_shared") - .typedef_source("common_math_lib.glsl") - .image(0, GPU_R32F, Qualifier::WRITE, ImageType::FLOAT_2D, "output_img") - .define("TYPE", "float") - .define("IDENTITY", "FLT_MIN") - .define("INITIALIZE(value)", "value.x") - .define("LOAD(value)", "value.x") - .define("REDUCE(lhs, rhs)", "max(rhs, lhs)") - .do_static_compilation(true); - GPU_SHADER_CREATE_INFO(compositor_maximum_float_in_range) .additional_info("compositor_parallel_reduction_shared") .image(0, GPU_R32F, Qualifier::WRITE, ImageType::FLOAT_2D, "output_img") @@ -150,17 +139,6 @@ GPU_SHADER_CREATE_INFO(compositor_minimum_luminance) .define("REDUCE(lhs, rhs)", "min(lhs, rhs)") .do_static_compilation(true); -GPU_SHADER_CREATE_INFO(compositor_minimum_float) - .additional_info("compositor_parallel_reduction_shared") - .typedef_source("common_math_lib.glsl") - .image(0, GPU_R32F, Qualifier::WRITE, ImageType::FLOAT_2D, "output_img") - .define("TYPE", "float") - .define("IDENTITY", "FLT_MAX") - .define("INITIALIZE(value)", "value.x") - .define("LOAD(value)", "value.x") - .define("REDUCE(lhs, rhs)", "min(rhs, lhs)") - .do_static_compilation(true); - GPU_SHADER_CREATE_INFO(compositor_minimum_float_in_range) .additional_info("compositor_parallel_reduction_shared") .image(0, GPU_R32F, Qualifier::WRITE, ImageType::FLOAT_2D, "output_img") diff --git a/source/blender/compositor/realtime_compositor/shaders/infos/compositor_plane_deform_info.hh b/source/blender/compositor/realtime_compositor/shaders/infos/compositor_plane_deform_info.hh index 445896c8b06..118c9aac1ab 100644 --- a/source/blender/compositor/realtime_compositor/shaders/infos/compositor_plane_deform_info.hh +++ b/source/blender/compositor/realtime_compositor/shaders/infos/compositor_plane_deform_info.hh @@ -4,36 +4,11 @@ #include "gpu_shader_create_info.hh" -GPU_SHADER_CREATE_INFO(compositor_plane_deform_mask) - .local_group_size(16, 16) - .push_constant(Type::MAT4, "homography_matrix") - .image(0, GPU_R16F, Qualifier::WRITE, ImageType::FLOAT_2D, "mask_img") - .compute_source("compositor_plane_deform_mask.glsl") - .do_static_compilation(true); - GPU_SHADER_CREATE_INFO(compositor_plane_deform) .local_group_size(16, 16) .push_constant(Type::MAT4, "homography_matrix") .sampler(0, ImageType::FLOAT_2D, "input_tx") - .sampler(1, ImageType::FLOAT_2D, "mask_tx") .image(0, GPU_RGBA16F, Qualifier::WRITE, ImageType::FLOAT_2D, "output_img") + .image(1, GPU_R16F, Qualifier::WRITE, ImageType::FLOAT_2D, "mask_img") .compute_source("compositor_plane_deform.glsl") .do_static_compilation(true); - -GPU_SHADER_CREATE_INFO(compositor_plane_deform_motion_blur_mask) - .local_group_size(16, 16) - .push_constant(Type::INT, "number_of_motion_blur_samples") - .uniform_buf(0, "mat4", "homography_matrices[64]") - .image(0, GPU_R16F, Qualifier::WRITE, ImageType::FLOAT_2D, "mask_img") - .compute_source("compositor_plane_deform_motion_blur_mask.glsl") - .do_static_compilation(true); - -GPU_SHADER_CREATE_INFO(compositor_plane_deform_motion_blur) - .local_group_size(16, 16) - .push_constant(Type::INT, "number_of_motion_blur_samples") - .uniform_buf(0, "mat4", "homography_matrices[64]") - .sampler(0, ImageType::FLOAT_2D, "input_tx") - .sampler(1, ImageType::FLOAT_2D, "mask_tx") - .image(0, GPU_RGBA16F, Qualifier::WRITE, ImageType::FLOAT_2D, "output_img") - .compute_source("compositor_plane_deform_motion_blur.glsl") - .do_static_compilation(true); diff --git a/source/blender/compositor/realtime_compositor/shaders/infos/compositor_plane_deform_motion_blur_info.hh b/source/blender/compositor/realtime_compositor/shaders/infos/compositor_plane_deform_motion_blur_info.hh new file mode 100644 index 00000000000..0f1c3ad377f --- /dev/null +++ b/source/blender/compositor/realtime_compositor/shaders/infos/compositor_plane_deform_motion_blur_info.hh @@ -0,0 +1,15 @@ +/* SPDX-FileCopyrightText: 2023 Blender Authors + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +#include "gpu_shader_create_info.hh" + +GPU_SHADER_CREATE_INFO(compositor_plane_deform_motion_blur) + .local_group_size(16, 16) + .push_constant(Type::INT, "number_of_motion_blur_samples") + .uniform_buf(0, "mat4", "homography_matrices[64]") + .sampler(0, ImageType::FLOAT_2D, "input_tx") + .image(0, GPU_RGBA16F, Qualifier::WRITE, ImageType::FLOAT_2D, "output_img") + .image(1, GPU_R16F, Qualifier::WRITE, ImageType::FLOAT_2D, "mask_img") + .compute_source("compositor_plane_deform_motion_blur.glsl") + .do_static_compilation(true); diff --git a/source/blender/compositor/realtime_compositor/shaders/infos/compositor_write_output_info.hh b/source/blender/compositor/realtime_compositor/shaders/infos/compositor_write_output_info.hh index cf4b32d5a8e..9a4c5a5beee 100644 --- a/source/blender/compositor/realtime_compositor/shaders/infos/compositor_write_output_info.hh +++ b/source/blender/compositor/realtime_compositor/shaders/infos/compositor_write_output_info.hh @@ -7,7 +7,6 @@ GPU_SHADER_CREATE_INFO(compositor_write_output_shared) .local_group_size(16, 16) .push_constant(Type::IVEC2, "lower_bound") - .push_constant(Type::IVEC2, "upper_bound") .sampler(0, ImageType::FLOAT_2D, "input_tx") .image(0, GPU_RGBA16F, Qualifier::WRITE, ImageType::FLOAT_2D, "output_img") .compute_source("compositor_write_output.glsl"); diff --git a/source/blender/compositor/realtime_compositor/shaders/library/gpu_shader_compositor_hue_correct.glsl b/source/blender/compositor/realtime_compositor/shaders/library/gpu_shader_compositor_hue_correct.glsl index a2cc9f86c72..51a08961dff 100644 --- a/source/blender/compositor/realtime_compositor/shaders/library/gpu_shader_compositor_hue_correct.glsl +++ b/source/blender/compositor/realtime_compositor/shaders/library/gpu_shader_compositor_hue_correct.glsl @@ -4,16 +4,9 @@ #pragma BLENDER_REQUIRE(gpu_shader_common_color_utils.glsl) -/* Curve maps are stored in texture samplers, so ensure that the parameters evaluate the sampler at - * the center of the pixels, because samplers are evaluated using linear interpolation. Given the - * parameter in the [0, 1] range. */ -vec3 compute_hue_curve_map_coordinates(vec3 parameters) -{ - const float sampler_resolution = 257.0; - float sampler_offset = 0.5 / sampler_resolution; - float sampler_scale = 1.0 - (1.0 / sampler_resolution); - return parameters * sampler_scale + sampler_offset; -} +/* Curve maps are stored in sampler objects that are evaluated in the [0, 1] range, so normalize + * parameters accordingly. */ +#define NORMALIZE_PARAMETER(parameter, minimum, range) ((parameter - minimum) * range) void node_composite_hue_correct(float factor, vec4 color, @@ -26,18 +19,19 @@ void node_composite_hue_correct(float factor, vec4 hsv; rgb_to_hsv(color, hsv); - /* First, normalize the hue value into the [0, 1] range for each of the curve maps and compute - * the proper sampler coordinates for interpolation, then adjust each of the Hue, Saturation, and - * Values accordingly to the following rules. A curve map value of 0.5 means no change in hue, so - * adjust the value to get an identity at 0.5. Since the identity of addition is 0, we subtract - * 0.5 (0.5 - 0.5 = 0). A curve map value of 0.5 means no change in saturation or value, so - * adjust the value to get an identity at 0.5. Since the identity of multiplication is 1, we - * multiply by 2 (0.5 * 2 = 1). */ - vec3 parameters = (hsv.xxx - minimums) * range_dividers; - vec3 coordinates = compute_hue_curve_map_coordinates(parameters); - hsv.x += texture(curve_map, vec2(coordinates.x, layer)).x - 0.5; - hsv.y *= texture(curve_map, vec2(coordinates.y, layer)).y * 2.0; - hsv.z *= texture(curve_map, vec2(coordinates.z, layer)).z * 2.0; + /* First, adjust the hue channel on its own, since corrections in the saturation and value + * channels depends on the new value of the hue, not its original value. A curve map value of 0.5 + * means no change in hue, so adjust the value to get an identity at 0.5. Since the identity of + * addition is 0, we subtract 0.5 (0.5 - 0.5 = 0). */ + const float hue_parameter = NORMALIZE_PARAMETER(hsv.x, minimums.x, range_dividers.x); + hsv.x += texture(curve_map, vec2(hue_parameter, layer)).x - 0.5; + + /* Second, adjust the saturation and value based on the new value of the hue. A curve map value + * of 0.5 means no change in hue, so adjust the value to get an identity at 0.5. Since the + * identity of duplication is 1, we multiply by 2 (0.5 * 2 = 1). */ + vec2 parameters = NORMALIZE_PARAMETER(hsv.x, minimums.yz, range_dividers.yz); + hsv.y *= texture(curve_map, vec2(parameters.x, layer)).y * 2.0; + hsv.z *= texture(curve_map, vec2(parameters.y, layer)).z * 2.0; /* Sanitize the new hue and saturation values. */ hsv.x = fract(hsv.x); diff --git a/source/blender/compositor/tests/COM_ComputeSummedAreaTableOperation_test.cc b/source/blender/compositor/tests/COM_ComputeSummedAreaTableOperation_test.cc index b4b63f596ef..e69738f335a 100644 --- a/source/blender/compositor/tests/COM_ComputeSummedAreaTableOperation_test.cc +++ b/source/blender/compositor/tests/COM_ComputeSummedAreaTableOperation_test.cc @@ -11,6 +11,7 @@ namespace blender::compositor::tests { struct SatParams { /* Input parameters. */ SummedAreaTableOperation::eMode mode; + eExecutionModel execution_model; rcti area; float4 fill_value; @@ -26,6 +27,7 @@ TEST_P(SummedAreaTableTestP, Values) SummedAreaTableOperation sat = SummedAreaTableOperation(); + sat.set_execution_model(params.execution_model); sat.set_mode(params.mode); const rcti area = params.area; MemoryBuffer output(DataType::Color, area); @@ -50,6 +52,7 @@ INSTANTIATE_TEST_SUITE_P(FullFrame5x2_IdentityOnes, SummedAreaTableTestP, testing::Values(SatParams{ SummedAreaTableOperation::eMode::Identity, + eExecutionModel::FullFrame, rcti{0, 5, 0, 2}, /* Area. */ {1.0f, 1.0f, 1.0f, 1.0f}, /* Fill value. */ @@ -63,6 +66,7 @@ INSTANTIATE_TEST_SUITE_P( SummedAreaTableTestP, testing::Values(SatParams{ SummedAreaTableOperation::eMode::Squared, + eExecutionModel::FullFrame, rcti{0, 5, 0, 2}, /* Area. */ {1.0f, 1.0f, 1.0f, 1.0f}, /* Fill value. */ @@ -74,6 +78,7 @@ INSTANTIATE_TEST_SUITE_P( INSTANTIATE_TEST_SUITE_P(FullFrame3x2_Squared, SummedAreaTableTestP, testing::Values(SatParams{SummedAreaTableOperation::eMode::Squared, + eExecutionModel::FullFrame, rcti{0, 3, 0, 2}, /* Area. */ {2.0f, 2.0f, 1.5f, .1f}, /* Fill value. */ @@ -93,6 +98,7 @@ class SummedAreaTableSumTest : public ::testing::Test { protected: void SetUp() override { + operation_->set_execution_model(eExecutionModel::FullFrame); operation_->set_mode(SummedAreaTableOperation::eMode::Squared); area_ = rcti{0, 5, 0, 4}; diff --git a/source/blender/compositor/tests/COM_NodeOperation_test.cc b/source/blender/compositor/tests/COM_NodeOperation_test.cc index efb2488ab60..0230b01b891 100644 --- a/source/blender/compositor/tests/COM_NodeOperation_test.cc +++ b/source/blender/compositor/tests/COM_NodeOperation_test.cc @@ -14,7 +14,8 @@ class NonHashedOperation : public NodeOperation { { set_id(id); add_output_socket(DataType::Value); - set_canvas({0, 2, 0, 3}); + set_width(2); + set_height(3); } }; @@ -26,7 +27,8 @@ class NonHashedConstantOperation : public ConstantOperation { { set_id(id); add_output_socket(DataType::Value); - set_canvas({0, 2, 0, 3}); + set_width(2); + set_height(3); constant_ = 1.0f; } @@ -51,7 +53,8 @@ class HashedOperation : public NodeOperation { { add_input_socket(DataType::Value); add_output_socket(DataType::Color); - set_canvas({0, width, 0, height}); + set_width(width); + set_height(height); param1 = 2; param2 = 7.0f; diff --git a/source/blender/datatoc/datatoc_icon_split.py b/source/blender/datatoc/datatoc_icon_split.py index 73900e1f117..dea590acc97 100755 --- a/source/blender/datatoc/datatoc_icon_split.py +++ b/source/blender/datatoc/datatoc_icon_split.py @@ -8,7 +8,7 @@ This script dices up PNG into small files to store in version control. Example: ./blender.bin \ - --background \ + --background -noaudio \ --python ./release/datafiles/icon_dice.py -- \ --image=./release/datafiles/blender_icons16.png \ --output=./release/datafiles/blender_icons16 diff --git a/source/blender/depsgraph/CMakeLists.txt b/source/blender/depsgraph/CMakeLists.txt index 11bb48f01da..00420e0085e 100644 --- a/source/blender/depsgraph/CMakeLists.txt +++ b/source/blender/depsgraph/CMakeLists.txt @@ -43,7 +43,6 @@ set(SRC intern/builder/pipeline.cc intern/builder/pipeline_all_objects.cc intern/builder/pipeline_compositor.cc - intern/builder/pipeline_from_collection.cc intern/builder/pipeline_from_ids.cc intern/builder/pipeline_render.cc intern/builder/pipeline_view_layer.cc @@ -115,7 +114,6 @@ set(SRC intern/builder/pipeline.h intern/builder/pipeline_all_objects.h intern/builder/pipeline_compositor.h - intern/builder/pipeline_from_collection.h intern/builder/pipeline_from_ids.h intern/builder/pipeline_render.h intern/builder/pipeline_view_layer.h diff --git a/source/blender/depsgraph/DEG_depsgraph_build.hh b/source/blender/depsgraph/DEG_depsgraph_build.hh index 5eaaadef52c..b61c9540231 100644 --- a/source/blender/depsgraph/DEG_depsgraph_build.hh +++ b/source/blender/depsgraph/DEG_depsgraph_build.hh @@ -52,11 +52,6 @@ void DEG_graph_build_for_render_pipeline(Depsgraph *graph); */ void DEG_graph_build_for_compositor_preview(Depsgraph *graph, bNodeTree *nodetree); -/** - * Builds the minimal dependency graph needed for evaluation of all IDs within the Collection. - */ -void DEG_graph_build_from_collection(Depsgraph *graph, Collection *collection); - /** * Builds the minimal dependency graph needed for evaluation of the given IDs. */ diff --git a/source/blender/depsgraph/DEG_depsgraph_query.hh b/source/blender/depsgraph/DEG_depsgraph_query.hh index e713d191ffd..3f756f0abb4 100644 --- a/source/blender/depsgraph/DEG_depsgraph_query.hh +++ b/source/blender/depsgraph/DEG_depsgraph_query.hh @@ -108,8 +108,8 @@ ID *DEG_get_original_id(ID *id); /** * Check whether given ID is an original. * - * Original IDs are considered all the IDs which are not covered by copy-on-evaluation system and - * are not out-of-main localized data-blocks. + * Original IDs are considered all the IDs which are not covered by copy-on-write system and are + * not out-of-main localized data-blocks. */ bool DEG_is_original_id(const ID *id); bool DEG_is_original_object(const Object *object); diff --git a/source/blender/depsgraph/intern/builder/deg_builder.cc b/source/blender/depsgraph/intern/builder/deg_builder.cc index 83964d0b7e3..b171061cb4d 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder.cc +++ b/source/blender/depsgraph/intern/builder/deg_builder.cc @@ -21,7 +21,7 @@ #include "BLI_utildefines.h" #include "BKE_action.h" -#include "BKE_collection.hh" +#include "BKE_collection.h" #include "BKE_lib_id.hh" #include "RNA_prototypes.h" @@ -196,9 +196,9 @@ void deg_graph_build_finalize(Main *bmain, Depsgraph *graph) if (id_node->customdata_masks != id_node->previous_customdata_masks) { flag |= ID_RECALC_GEOMETRY; } - const bool is_expanded = deg_eval_copy_is_expanded(id_node->id_cow); + const bool is_expanded = deg_copy_on_write_is_expanded(id_node->id_cow); if (!is_expanded) { - flag |= ID_RECALC_SYNC_TO_EVAL; + flag |= ID_RECALC_COPY_ON_WRITE; /* This means ID is being added to the dependency graph first * time, which is similar to "ob-visible-change" */ if (id_type == ID_OB) { diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc index 38cefdff685..76a2c5ddefd 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc +++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc @@ -53,12 +53,12 @@ #include "DNA_world_types.h" #include "BKE_action.h" -#include "BKE_anim_data.hh" +#include "BKE_anim_data.h" #include "BKE_animsys.h" #include "BKE_armature.hh" #include "BKE_bake_geometry_nodes_modifier.hh" -#include "BKE_cachefile.hh" -#include "BKE_collection.hh" +#include "BKE_cachefile.h" +#include "BKE_collection.h" #include "BKE_constraint.h" #include "BKE_curve.hh" #include "BKE_effect.h" @@ -87,7 +87,7 @@ #include "BKE_particle.h" #include "BKE_pointcache.h" #include "BKE_rigidbody.h" -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "BKE_shader_fx.h" #include "BKE_sound.h" #include "BKE_tracking.h" @@ -141,7 +141,7 @@ DepsgraphNodeBuilder::~DepsgraphNodeBuilder() { for (IDInfo *id_info : id_info_hash_.values()) { if (id_info->id_cow != nullptr) { - deg_free_eval_copy_datablock(id_info->id_cow); + deg_free_copy_on_write_datablock(id_info->id_cow); MEM_freeN(id_info->id_cow); } MEM_freeN(id_info); @@ -164,7 +164,7 @@ IDNode *DepsgraphNodeBuilder::add_id_node(ID *id) previously_visible_components_mask = id_info->previously_visible_components_mask; previous_eval_flags = id_info->previous_eval_flags; previous_customdata_masks = id_info->previous_customdata_masks; - /* Tag ID info to not free the evaluated ID pointer. */ + /* Tag ID info to not free the CoW ID pointer. */ id_info->id_cow = nullptr; } id_node = graph_->add_id_node(id, id_cow); @@ -176,11 +176,11 @@ IDNode *DepsgraphNodeBuilder::add_id_node(ID *id) const bool is_newly_created = id_node->components.is_empty(); if (is_newly_created) { - if (deg_eval_copy_is_needed(id_type)) { - ComponentNode *comp_cow = id_node->add_component(NodeType::COPY_ON_EVAL); + if (deg_copy_on_write_is_needed(id_type)) { + ComponentNode *comp_cow = id_node->add_component(NodeType::COPY_ON_WRITE); OperationNode *op_cow = comp_cow->add_operation( - [id_node](::Depsgraph *depsgraph) { deg_create_eval_copy(depsgraph, id_node); }, - OperationCode::COPY_ON_EVAL); + [id_node](::Depsgraph *depsgraph) { deg_evaluate_copy_on_write(depsgraph, id_node); }, + OperationCode::COPY_ON_WRITE); graph_->operations.append(op_cow); } @@ -365,8 +365,8 @@ ID *DepsgraphNodeBuilder::get_cow_id(const ID *id_orig) const ID *DepsgraphNodeBuilder::ensure_cow_id(ID *id_orig) { - if (id_orig->tag & LIB_TAG_COPIED_ON_EVAL) { - /* ID is already remapped to copy-on-evaluation. */ + if (id_orig->tag & LIB_TAG_COPIED_ON_WRITE) { + /* ID is already remapped to copy-on-write. */ return id_orig; } IDNode *id_node = add_id_node(id_orig); @@ -377,17 +377,17 @@ ID *DepsgraphNodeBuilder::ensure_cow_id(ID *id_orig) void DepsgraphNodeBuilder::begin_build() { - /* Store existing evaluated versions of datablock, so we can re-use + /* Store existing copy-on-write versions of datablock, so we can re-use * them for new ID nodes. */ for (IDNode *id_node : graph_->id_nodes) { - /* It is possible that the ID does not need to have evaluated version in which case id_cow is - * the same as id_orig. Additionally, such ID might have been removed, which makes the check + /* It is possible that the ID does not need to have CoW version in which case id_cow is the + * same as id_orig. Additionally, such ID might have been removed, which makes the check * for whether id_cow is expanded to access freed memory. In order to deal with this we - * check whether an evaluated copy is needed based on a scalar value which does not lead to - * access of possibly deleted memory. */ + * check whether CoW is needed based on a scalar value which does not lead to access of + * possibly deleted memory. */ IDInfo *id_info = (IDInfo *)MEM_mallocN(sizeof(IDInfo), "depsgraph id info"); - if (deg_eval_copy_is_needed(id_node->id_type) && deg_eval_copy_is_expanded(id_node->id_cow) && - id_node->id_orig != id_node->id_cow) + if (deg_copy_on_write_is_needed(id_node->id_type) && + deg_copy_on_write_is_expanded(id_node->id_cow) && id_node->id_orig != id_node->id_cow) { id_info->id_cow = id_node->id_cow; } @@ -412,12 +412,12 @@ void DepsgraphNodeBuilder::begin_build() graph_->entry_tags.clear(); } -/* Util callbacks for `BKE_library_foreach_ID_link`, used to detect when an evaluated ID is using - * ID pointers that are either: - * - evaluated ID pointers that do not exist anymore in current depsgraph. - * - Orig ID pointers that do have now an evaluated version in current depsgraph. - * In both cases, it means the evaluated ID user needs to be flushed, to ensure its pointers are - * properly remapped. +/* Util callbacks for `BKE_library_foreach_ID_link`, used to detect when a COW ID is using ID + * pointers that are either: + * - COW ID pointers that do not exist anymore in current depsgraph. + * - Orig ID pointers that do have now a COW version in current depsgraph. + * In both cases, it means the COW ID user needs to be flushed, to ensure its pointers are properly + * remapped. * * NOTE: This is split in two, a static function and a public method of the node builder, to allow * the code to access the builder's data more easily. */ @@ -426,30 +426,30 @@ int DepsgraphNodeBuilder::foreach_id_cow_detect_need_for_update_callback(ID *id_ ID *id_pointer) { if (id_pointer->orig_id == nullptr) { - /* `id_cow_self` uses a non-cow ID, if that ID has an evaluated copy in current depsgraph its - * owner needs to be remapped, i.e. copy-on-eval-flushed. */ + /* `id_cow_self` uses a non-cow ID, if that ID has a COW copy in current depsgraph its owner + * needs to be remapped, i.e. COW-flushed. */ IDNode *id_node = find_id_node(id_pointer); if (id_node != nullptr && id_node->id_cow != nullptr) { graph_id_tag_update(bmain_, graph_, id_cow_self->orig_id, - ID_RECALC_SYNC_TO_EVAL, + ID_RECALC_COPY_ON_WRITE, DEG_UPDATE_SOURCE_RELATIONS); return IDWALK_RET_STOP_ITER; } } else { - /* `id_cow_self` uses an evaluated ID, if that evaluated copy is removed from current depsgraph - * its owner needs to be remapped, i.e. copy-on-eval-flushed. */ - /* NOTE: at that stage, old existing evaluated copies that are to be removed from current state - * of evaluated depsgraph are still valid pointers, they are freed later (typically during + /* `id_cow_self` uses a COW ID, if that COW copy is removed from current depsgraph its owner + * needs to be remapped, i.e. COW-flushed. */ + /* NOTE: at that stage, old existing COW copies that are to be removed from current state of + * evaluated depsgraph are still valid pointers, they are freed later (typically during * destruction of the builder itself). */ IDNode *id_node = find_id_node(id_pointer->orig_id); if (id_node == nullptr) { graph_id_tag_update(bmain_, graph_, id_cow_self->orig_id, - ID_RECALC_SYNC_TO_EVAL, + ID_RECALC_COPY_ON_WRITE, DEG_UPDATE_SOURCE_RELATIONS); return IDWALK_RET_STOP_ITER; } @@ -463,9 +463,9 @@ static int foreach_id_cow_detect_need_for_update_callback(LibraryIDLinkCallbackD if (id == nullptr) { return IDWALK_RET_NOP; } - if (!ID_TYPE_USE_COPY_ON_EVAL(GS(id->name))) { - /* No need to go further if the id never had an evaluated copy in the depsgraph. This function - * is only concerned with keeping the mapping between original and evaluated IDs intact. */ + if (!ID_TYPE_IS_COW(GS(id->name))) { + /* No need to go further if the id never had a cow copy in the depsgraph. This function is + * only concerned with keeping the mapping between original and COW ids intact. */ return IDWALK_RET_NOP; } @@ -477,7 +477,7 @@ static int foreach_id_cow_detect_need_for_update_callback(LibraryIDLinkCallbackD void DepsgraphNodeBuilder::update_invalid_cow_pointers() { - /* NOTE: Currently the only ID types that depsgraph may decide to not evaluate/generate evaluated + /* NOTE: Currently the only ID types that depsgraph may decide to not evaluate/generate COW * copies for, even though they are referenced by other data-blocks, are Collections and Objects * (through their various visibility flags, and the ones from #LayerCollections too). However, * this code is kept generic as it makes it more future-proof, and optimization here would give @@ -493,11 +493,11 @@ void DepsgraphNodeBuilder::update_invalid_cow_pointers() continue; } if (ELEM(id_node->id_cow, id_node->id_orig, nullptr)) { - /* Node/ID with no copy-on-eval data, no need to check it. */ + /* Node/ID with no COW data, no need to check it. */ continue; } - if ((id_node->id_cow->recalc & ID_RECALC_SYNC_TO_EVAL) != 0) { - /* Node/ID already tagged for copy-on-eval flush, no need to check it. */ + if ((id_node->id_cow->recalc & ID_RECALC_COPY_ON_WRITE) != 0) { + /* Node/ID already tagged for COW flush, no need to check it. */ continue; } if ((id_node->id_cow->flag & LIB_EMBEDDED_DATA) != 0) { @@ -512,9 +512,8 @@ void DepsgraphNodeBuilder::update_invalid_cow_pointers() * * E.g. when undoing creation/deletion of a collection directly child of a scene's master * collection, the scene itself is re-read in place, but its master collection becomes a - * completely new different pointer, and the existing copy-on-eval of the old master - * collection in the matching deg node is therefore pointing to fully invalid (freed) memory. - */ + * completely new different pointer, and the existing COW of the old master collection in the + * matching deg node is therefore pointing to fully invalid (freed) memory. */ continue; } BKE_library_foreach_ID_link(nullptr, @@ -557,10 +556,6 @@ void DepsgraphNodeBuilder::build_id(ID *id, const bool force_be_visible) case ID_AC: build_action((bAction *)id); break; - case ID_AN: - /* TODO: actually handle this ID type properly, will be done in a followup commit. */ - build_generic_id(id); - break; case ID_AR: build_armature((bArmature *)id); break; @@ -655,7 +650,7 @@ void DepsgraphNodeBuilder::build_id(ID *id, const bool force_be_visible) case ID_PAL: case ID_PC: case ID_WS: - BLI_assert(!deg_eval_copy_is_needed(id_type)); + BLI_assert(!deg_copy_on_write_is_needed(id_type)); build_generic_id(id); break; } @@ -978,10 +973,8 @@ void DepsgraphNodeBuilder::build_object_data(Object *object) case OB_CURVES: case OB_POINTCLOUD: case OB_VOLUME: - build_object_data_geometry(object); - break; case OB_GREASE_PENCIL: - build_object_data_grease_pencil(object); + build_object_data_geometry(object); break; case OB_ARMATURE: build_rig(object); @@ -1033,20 +1026,6 @@ void DepsgraphNodeBuilder::build_object_data_lightprobe(Object *object) add_operation_node(&object->id, NodeType::PARAMETERS, OperationCode::LIGHT_PROBE_EVAL); } -void DepsgraphNodeBuilder::build_object_data_grease_pencil(Object *object) -{ - GreasePencil &grease_pencil = *static_cast(object->data); - /* Build the layer parents. */ - for (const bke::greasepencil::Layer *layer : grease_pencil.layers()) { - Object *parent = layer->parent; - if (parent == nullptr) { - continue; - } - build_object(-1, parent, DEG_ID_LINKED_INDIRECTLY, false); - } - build_object_data_geometry(object); -} - void DepsgraphNodeBuilder::build_object_data_speaker(Object *object) { Speaker *speaker = (Speaker *)object->data; @@ -1300,7 +1279,7 @@ void DepsgraphNodeBuilder::build_driver(ID *id, FCurve *fcurve, int driver_index /* Create data node for this driver */ ID *id_cow = get_cow_id(id); - /* TODO(sergey): ideally we could pass the copy-on-eval of fcu, but since it + /* TODO(sergey): ideally we could pass the COW of fcu, but since it * has not yet been allocated at this point we can't. As a workaround * the animation systems allocates an array so we can do a fast lookup * with the driver index. */ @@ -1702,7 +1681,7 @@ void DepsgraphNodeBuilder::build_object_data_geometry_datablock(ID *obdata) return; } OperationNode *op_node; - /* Make sure we've got an ID node before requesting evaluated pointer. */ + /* Make sure we've got an ID node before requesting CoW pointer. */ (void)add_id_node((ID *)obdata); ID *obdata_cow = get_cow_id(obdata); build_idproperties(obdata->properties); diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes.h b/source/blender/depsgraph/intern/builder/deg_builder_nodes.h index 8092c81a223..f8a14854726 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.h +++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.h @@ -68,7 +68,7 @@ class DepsgraphNodeBuilder : public DepsgraphBuilder { DepsgraphNodeBuilder(Main *bmain, Depsgraph *graph, DepsgraphBuilderCache *cache); ~DepsgraphNodeBuilder(); - /* For given original ID get ID which is created by copy-on-evaluation system. */ + /* For given original ID get ID which is created by CoW system. */ ID *get_cow_id(const ID *id_orig) const; /* Similar to above, but for the cases when there is no ID node we create * one. */ @@ -80,7 +80,7 @@ class DepsgraphNodeBuilder : public DepsgraphBuilder { return (T *)get_cow_id(&orig->id); } - /* For a given evaluated datablock get corresponding original one. */ + /* For a given COW datablock get corresponding original one. */ template T *get_orig_datablock(const T *cow) const { return (T *)cow->id.orig_id; @@ -194,7 +194,6 @@ class DepsgraphNodeBuilder : public DepsgraphBuilder { virtual void build_object_data_light(Object *object); virtual void build_object_data_lightprobe(Object *object); virtual void build_object_data_speaker(Object *object); - virtual void build_object_data_grease_pencil(Object *object); virtual void build_object_transform(Object *object); virtual void build_object_constraints(Object *object); virtual void build_object_pointcache(Object *object); @@ -307,7 +306,7 @@ class DepsgraphNodeBuilder : public DepsgraphBuilder { void tag_previously_tagged_nodes(); /** - * Check for IDs that need to be flushed (copy-on-eval-updated) + * Check for IDs that need to be flushed (COW-updated) * because the depsgraph itself created or removed some of their evaluated dependencies. */ void update_invalid_cow_pointers(); diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes_view_layer.cc b/source/blender/depsgraph/intern/builder/deg_builder_nodes_view_layer.cc index bcd4291f6c0..f8f65f852f4 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_nodes_view_layer.cc +++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes_view_layer.cc @@ -73,7 +73,7 @@ void DepsgraphNodeBuilder::build_view_layer(Scene *scene, ViewLayer *view_layer, eDepsNode_LinkedState_Type linked_state) { - /* NOTE: Pass view layer index of 0 since after scene evaluated copy there is + /* NOTE: Pass view layer index of 0 since after scene CoW there is * only one view layer in there. */ view_layer_index_ = 0; /* Scene ID block. */ @@ -87,10 +87,10 @@ void DepsgraphNodeBuilder::build_view_layer(Scene *scene, /* Setup currently building context. */ scene_ = scene; view_layer_ = view_layer; - /* Get pointer to an evaluated version of scene ID. */ + /* Get pointer to a CoW version of scene ID. */ Scene *scene_cow = get_cow_datablock(scene); /* Scene objects. */ - /* NOTE: Base is used for function bindings as-is, so need to pass evaluated base, + /* NOTE: Base is used for function bindings as-is, so need to pass CoW base, * but object is expected to be an original one. Hence we go into some * tricks here iterating over the view layer. */ int base_index = 0; @@ -143,10 +143,6 @@ void DepsgraphNodeBuilder::build_view_layer(Scene *scene, if (view_layer->mat_override != nullptr) { build_material(view_layer->mat_override); } - /* World override */ - if (view_layer->world_override != nullptr) { - build_world(view_layer->world_override); - } /* Freestyle linesets. */ LISTBASE_FOREACH (FreestyleLineSet *, fls, &view_layer->freestyle_config.linesets) { build_freestyle_lineset(fls); diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc index 48e319cdf51..96119c07514 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc +++ b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc @@ -56,16 +56,15 @@ #include "DNA_world_types.h" #include "BKE_action.h" -#include "BKE_anim_data.hh" +#include "BKE_anim_data.h" #include "BKE_armature.hh" -#include "BKE_collection.hh" +#include "BKE_collection.h" #include "BKE_collision.h" #include "BKE_constraint.h" #include "BKE_curve.hh" #include "BKE_effect.h" #include "BKE_fcurve_driver.h" #include "BKE_gpencil_modifier_legacy.h" -#include "BKE_grease_pencil.hh" #include "BKE_idprop.h" #include "BKE_image.h" #include "BKE_key.hh" @@ -525,10 +524,6 @@ void DepsgraphRelationBuilder::build_id(ID *id) case ID_AC: build_action((bAction *)id); break; - case ID_AN: - /* TODO: actually handle this ID type properly, will be done in a followup commit. */ - build_generic_id(id); - break; case ID_AR: build_armature((bArmature *)id); break; @@ -613,7 +608,7 @@ void DepsgraphRelationBuilder::build_id(ID *id) case ID_PAL: case ID_PC: case ID_WS: - BLI_assert(!deg_eval_copy_is_needed(id_type)); + BLI_assert(!deg_copy_on_write_is_needed(id_type)); build_generic_id(id); break; } @@ -1504,7 +1499,7 @@ void DepsgraphRelationBuilder::build_constraints(ID *id, /* Standard object relation. */ /* TODO: loc vs rot vs scale? */ if (&ct->tar->id == id) { - /* Constraint targeting its own object: + /* Constraint targeting own object: * - This case is fine IF we're dealing with a bone * constraint pointing to its own armature. In that * case, it's just transform -> bone. @@ -1640,10 +1635,10 @@ void DepsgraphRelationBuilder::build_animdata_curves_targets(ID *id, const IDNode *id_node_from = operation_from->owner->owner; const IDNode *id_node_to = operation_to->owner->owner; if (id_node_from != id_node_to) { - ComponentKey cow_key(id_node_to->id_orig, NodeType::COPY_ON_EVAL); + ComponentKey cow_key(id_node_to->id_orig, NodeType::COPY_ON_WRITE); add_relation(cow_key, adt_key, - "Animated Copy-on-Eval -> Animation", + "Animated CoW -> Animation", RELATION_CHECK_BEFORE_ADD | RELATION_FLAG_NO_FLUSH); } } @@ -1686,7 +1681,7 @@ void DepsgraphRelationBuilder::build_animdata_drivers(ID *id) /* create the driver's relations to targets */ build_driver(id, fcu); - /* prevent driver from occurring before its own animation... */ + /* prevent driver from occurring before own animation... */ if (adt->action || adt->nla_tracks.first) { add_relation(adt_key, driver_key, "AnimData Before Drivers"); } @@ -1851,11 +1846,10 @@ void DepsgraphRelationBuilder::build_driver_data(ID *id, FCurve *fcu) OperationKey bone_key(&object->id, NodeType::BONE, pchan->name, target_op); add_relation(driver_key, bone_key, "Arm Bone -> Driver -> Bone"); } - /* Make the driver depend on copy-on-eval, similar to the generic case below. */ + /* Make the driver depend on COW, similar to the generic case below. */ if (id_ptr != id) { - ComponentKey cow_key(id_ptr, NodeType::COPY_ON_EVAL); - add_relation( - cow_key, driver_key, "Driven Copy-on-Eval -> Driver", RELATION_CHECK_BEFORE_ADD); + ComponentKey cow_key(id_ptr, NodeType::COPY_ON_WRITE); + add_relation(cow_key, driver_key, "Driven CoW -> Driver", RELATION_CHECK_BEFORE_ADD); } } else { @@ -1873,9 +1867,8 @@ void DepsgraphRelationBuilder::build_driver_data(ID *id, FCurve *fcu) PointerRNA ptr; if (RNA_path_resolve_full(&id_ptr, fcu->rna_path, &ptr, nullptr, nullptr)) { if (id_ptr.owner_id != ptr.owner_id) { - ComponentKey cow_key(ptr.owner_id, NodeType::COPY_ON_EVAL); - add_relation( - cow_key, driver_key, "Driven Copy-on-Eval -> Driver", RELATION_CHECK_BEFORE_ADD); + ComponentKey cow_key(ptr.owner_id, NodeType::COPY_ON_WRITE); + add_relation(cow_key, driver_key, "Driven CoW -> Driver", RELATION_CHECK_BEFORE_ADD); } } } @@ -2055,18 +2048,18 @@ void DepsgraphRelationBuilder::build_driver_rna_path_variable(const OperationKey * driver is re-evaluated. * * The most straightforward (at the moment of writing this comment) way of figuring out - * such relation is to use copy-on-evaluation operation of the target ID. There are two down + * such relation is to use copy-on-write operation of the target ID. There are two down * sides of this approach which are considered a design limitation as there is a belief * that they are not common in practice or are not reliable due to other issues: * - * - IDs which are not covered with the copy-on-evaluation mechanism. + * - IDs which are not covered with the copy-on-write mechanism. * * Such IDs are either do not have ID properties, or are not part of the dependency * graph. * * - Modifications of evaluated IDs from a Python handler. * Such modifications are not fully integrated in the dependency graph evaluation as it - * has issues with copy-on-evaluation tagging and the fact that relations are defined by the + * has issues with copy-on-write tagging and the fact that relations are defined by the * original main database status. * * The original report for this is #98618. @@ -2077,8 +2070,8 @@ void DepsgraphRelationBuilder::build_driver_rna_path_variable(const OperationKey * scene.camera not caused by animation should actually force a dependency graph rebuild. */ if (target_id != variable_exit_key.ptr.owner_id && GS(target_id->name) != ID_SCE) { - if (deg_eval_copy_is_needed(GS(target_id->name))) { - ComponentKey target_id_key(target_id, NodeType::COPY_ON_EVAL); + if (deg_copy_on_write_is_needed(GS(target_id->name))) { + ComponentKey target_id_key(target_id, NodeType::COPY_ON_WRITE); add_relation(target_id_key, driver_key, "Target ID -> Driver"); } } @@ -2496,9 +2489,9 @@ void DepsgraphRelationBuilder::build_object_data_geometry(Object *object) OperationKey obdata_ubereval_key(&object->id, NodeType::GEOMETRY, OperationCode::GEOMETRY_EVAL); /* Special case: modifiers evaluation queries scene for various things like * data mask to be used. We add relation here to ensure object is never - * evaluated prior to Scene's evaluated copy is ready. */ + * evaluated prior to Scene's CoW is ready. */ ComponentKey scene_key(&scene_->id, NodeType::SCENE); - add_relation(scene_key, obdata_ubereval_key, "Copy-on-Eval Relation", RELATION_FLAG_NO_FLUSH); + add_relation(scene_key, obdata_ubereval_key, "CoW Relation", RELATION_FLAG_NO_FLUSH); /* Relation to the instance, so that instancer can use geometry of this object. */ add_relation(ComponentKey(&object->id, NodeType::GEOMETRY), OperationKey(&object->id, NodeType::INSTANCING, OperationCode::INSTANCE), @@ -2736,32 +2729,9 @@ void DepsgraphRelationBuilder::build_object_data_geometry_datablock(ID *obdata) break; } case ID_GP: { - GreasePencil &grease_pencil = *reinterpret_cast(obdata); - - /* Update geometry when time is changed. */ TimeSourceKey time_key; - ComponentKey geometry_key(&grease_pencil.id, NodeType::GEOMETRY); + ComponentKey geometry_key(obdata, NodeType::GEOMETRY); add_relation(time_key, geometry_key, "Grease Pencil Frame Change"); - - /* Add relations for layer parents. */ - for (const bke::greasepencil::Layer *layer : grease_pencil.layers()) { - Object *parent = layer->parent; - if (parent == nullptr) { - continue; - } - if (parent->type == OB_ARMATURE && !layer->parent_bone_name().is_empty()) { - ComponentKey bone_key(&parent->id, NodeType::BONE, layer->parent_bone_name().c_str()); - OperationKey armature_key( - &parent->id, NodeType::TRANSFORM, OperationCode::TRANSFORM_FINAL); - - add_relation(bone_key, geometry_key, "Grease Pencil Layer Bone Parent"); - add_relation(armature_key, geometry_key, "Grease Pencil Layer Armature Parent"); - } - else { - ComponentKey transform_key(&parent->id, NodeType::TRANSFORM); - add_relation(transform_key, geometry_key, "Grease Pencil Layer Object Parent"); - } - } break; } default: @@ -2910,8 +2880,8 @@ void DepsgraphRelationBuilder::build_nodetree(bNodeTree *ntree) OperationKey ntree_geo_preprocess_key( &ntree->id, NodeType::NTREE_GEOMETRY_PREPROCESS, OperationCode::NTREE_GEOMETRY_PREPROCESS); if (ntree->type == NTREE_GEOMETRY) { - OperationKey ntree_cow_key(&ntree->id, NodeType::COPY_ON_EVAL, OperationCode::COPY_ON_EVAL); - add_relation(ntree_cow_key, ntree_geo_preprocess_key, "Copy-on-Eval -> Preprocess"); + OperationKey ntree_cow_key(&ntree->id, NodeType::COPY_ON_WRITE, OperationCode::COPY_ON_WRITE); + add_relation(ntree_cow_key, ntree_geo_preprocess_key, "COW -> Preprocess"); add_relation(ntree_geo_preprocess_key, ntree_output_key, "Preprocess -> Output", @@ -3395,8 +3365,9 @@ void DepsgraphRelationBuilder::build_nested_datablock(ID *owner, ID *id, bool fl if (!flush_cow_changes) { relation_flag |= RELATION_FLAG_NO_FLUSH; } - OperationKey owner_copy_on_write_key(owner, NodeType::COPY_ON_EVAL, OperationCode::COPY_ON_EVAL); - OperationKey id_copy_on_write_key(id, NodeType::COPY_ON_EVAL, OperationCode::COPY_ON_EVAL); + OperationKey owner_copy_on_write_key( + owner, NodeType::COPY_ON_WRITE, OperationCode::COPY_ON_WRITE); + OperationKey id_copy_on_write_key(id, NodeType::COPY_ON_WRITE, OperationCode::COPY_ON_WRITE); add_relation(id_copy_on_write_key, owner_copy_on_write_key, "Eval Order", relation_flag); } @@ -3425,11 +3396,11 @@ void DepsgraphRelationBuilder::build_copy_on_write_relations(IDNode *id_node) const ID_Type id_type = GS(id_orig->name); - if (!deg_eval_copy_is_needed(id_type)) { + if (!deg_copy_on_write_is_needed(id_type)) { return; } - OperationKey copy_on_write_key(id_orig, NodeType::COPY_ON_EVAL, OperationCode::COPY_ON_EVAL); + OperationKey copy_on_write_key(id_orig, NodeType::COPY_ON_WRITE, OperationCode::COPY_ON_WRITE); /* XXX: This is a quick hack to make Alt-A to work. */ // add_relation(time_source_key, copy_on_write_key, "Fluxgate capacitor hack"); /* Resat of code is using rather low level trickery, so need to get some @@ -3438,8 +3409,8 @@ void DepsgraphRelationBuilder::build_copy_on_write_relations(IDNode *id_node) OperationNode *op_cow = node_cow->get_exit_operation(); /* Plug any other components to this one. */ for (ComponentNode *comp_node : id_node->components.values()) { - if (comp_node->type == NodeType::COPY_ON_EVAL) { - /* Copy-on-eval component never depends on itself. */ + if (comp_node->type == NodeType::COPY_ON_WRITE) { + /* Copy-on-write component never depends on itself. */ continue; } if (!comp_node->depends_on_cow()) { @@ -3458,8 +3429,8 @@ void DepsgraphRelationBuilder::build_copy_on_write_relations(IDNode *id_node) } /* Notes on exceptions: * - View layers have cached array of bases in them, which is not - * copied by copy-on-evaluation, and not preserved. PROBABLY it is better - * to preserve that cache in copy-on-evaluation, but for the time being + * copied by copy-on-write, and not preserved. PROBABLY it is better + * to preserve that cache in copy-on-write, but for the time being * we allow flush to layer collections component which will ensure * that cached array of bases exists and is up-to-date. */ if (ELEM(comp_node->type, NodeType::LAYER_COLLECTIONS)) { @@ -3474,16 +3445,16 @@ void DepsgraphRelationBuilder::build_copy_on_write_relations(IDNode *id_node) * copy of ID. */ OperationNode *op_entry = comp_node->get_entry_operation(); if (op_entry != nullptr) { - Relation *rel = graph_->add_new_relation(op_cow, op_entry, "Copy-on-Eval Dependency"); + Relation *rel = graph_->add_new_relation(op_cow, op_entry, "CoW Dependency"); rel->flag |= rel_flag; } - /* All dangling operations should also be executed after copy-on-evaluation. */ + /* All dangling operations should also be executed after copy-on-write. */ for (OperationNode *op_node : comp_node->operations_map->values()) { if (op_node == op_entry) { continue; } if (op_node->inlinks.is_empty()) { - Relation *rel = graph_->add_new_relation(op_cow, op_node, "Copy-on-Eval Dependency"); + Relation *rel = graph_->add_new_relation(op_cow, op_node, "CoW Dependency"); rel->flag |= rel_flag; } else { @@ -3499,18 +3470,18 @@ void DepsgraphRelationBuilder::build_copy_on_write_relations(IDNode *id_node) } } if (!has_same_comp_dependency) { - Relation *rel = graph_->add_new_relation(op_cow, op_node, "Copy-on-Eval Dependency"); + Relation *rel = graph_->add_new_relation(op_cow, op_node, "CoW Dependency"); rel->flag |= rel_flag; } } } /* NOTE: We currently ignore implicit relations to an external - * data-blocks for copy-on-evaluation operations. This means, for example, - * copy-on-evaluation component of Object will not wait for copy-on-evaluation + * data-blocks for copy-on-write operations. This means, for example, + * copy-on-write component of Object will not wait for copy-on-write * component of its Mesh. This is because pointers are all known * already so remapping will happen all correct. And then If some object * evaluation step needs geometry, it will have transitive dependency - * to Mesh copy-on-evaluation already. */ + * to Mesh copy-on-write already. */ } /* TODO(sergey): This solves crash for now, but causes too many * updates potentially. */ @@ -3518,9 +3489,9 @@ void DepsgraphRelationBuilder::build_copy_on_write_relations(IDNode *id_node) Object *object = (Object *)id_orig; ID *object_data_id = (ID *)object->data; if (object_data_id != nullptr) { - if (deg_eval_copy_is_needed(object_data_id)) { + if (deg_copy_on_write_is_needed(object_data_id)) { OperationKey data_copy_on_write_key( - object_data_id, NodeType::COPY_ON_EVAL, OperationCode::COPY_ON_EVAL); + object_data_id, NodeType::COPY_ON_WRITE, OperationCode::COPY_ON_WRITE); add_relation( data_copy_on_write_key, copy_on_write_key, "Eval Order", RELATION_FLAG_GODMODE); } @@ -3534,14 +3505,14 @@ void DepsgraphRelationBuilder::build_copy_on_write_relations(IDNode *id_node) /* NOTE: Relation is disabled since AnimationBackup() is disabled. * See comment in AnimationBackup:init_from_id(). */ - /* Copy-on-eval of write will iterate over f-curves to store current values corresponding - * to their RNA path. This means that action must be copied prior to the ID's copy-on-evaluation, + /* Copy-on-write of write will iterate over f-curves to store current values corresponding + * to their RNA path. This means that action must be copied prior to the ID's copy-on-write, * otherwise depsgraph might try to access freed data. */ AnimData *animation_data = BKE_animdata_from_id(id_orig); if (animation_data != nullptr) { if (animation_data->action != nullptr) { OperationKey action_copy_on_write_key( - &animation_data->action->id, NodeType::COPY_ON_EVAL, OperationCode::COPY_ON_EVAL); + &animation_data->action->id, NodeType::COPY_ON_WRITE, OperationCode::COPY_ON_WRITE); add_relation(action_copy_on_write_key, copy_on_write_key, "Eval Order", diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations_drivers.cc b/source/blender/depsgraph/intern/builder/deg_builder_relations_drivers.cc index a7b74b4ddbd..4539fb85b51 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_relations_drivers.cc +++ b/source/blender/depsgraph/intern/builder/deg_builder_relations_drivers.cc @@ -16,7 +16,7 @@ #include "DNA_anim_types.h" -#include "BKE_anim_data.hh" +#include "BKE_anim_data.h" #include "intern/builder/deg_builder_relations.h" #include "intern/depsgraph_relation.hh" diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations_rig.cc b/source/blender/depsgraph/intern/builder/deg_builder_relations_rig.cc index 161bf14ba8a..04dc215d52b 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_relations_rig.cc +++ b/source/blender/depsgraph/intern/builder/deg_builder_relations_rig.cc @@ -95,12 +95,10 @@ void DepsgraphRelationBuilder::build_ik_pose(Object *object, if (data->tar != object) { ComponentKey target_key(&data->tar->id, NodeType::TRANSFORM); add_relation(target_key, target_dependent_key, con->name); - /* Ensure target evaluated copy is ready by the time IK tree is built just in case. */ - ComponentKey target_cow_key(&data->tar->id, NodeType::COPY_ON_EVAL); - add_relation(target_cow_key, - init_ik_key, - "IK Target Copy-on-Eval -> Init IK Tree", - RELATION_CHECK_BEFORE_ADD); + /* Ensure target CoW is ready by the time IK tree is built just in case. */ + ComponentKey target_cow_key(&data->tar->id, NodeType::COPY_ON_WRITE); + add_relation( + target_cow_key, init_ik_key, "IK Target CoW -> Init IK Tree", RELATION_CHECK_BEFORE_ADD); } /* Subtarget references: */ if ((data->tar->type == OB_ARMATURE) && (data->subtarget[0])) { @@ -130,12 +128,10 @@ void DepsgraphRelationBuilder::build_ik_pose(Object *object, if (data->poletar != object) { ComponentKey target_key(&data->poletar->id, NodeType::TRANSFORM); add_relation(target_key, target_dependent_key, con->name); - /* Ensure target evaluated copy is ready by the time IK tree is built just in case. */ - ComponentKey target_cow_key(&data->poletar->id, NodeType::COPY_ON_EVAL); - add_relation(target_cow_key, - init_ik_key, - "IK Target Copy-on-Eval -> Init IK Tree", - RELATION_CHECK_BEFORE_ADD); + /* Ensure target CoW is ready by the time IK tree is built just in case. */ + ComponentKey target_cow_key(&data->poletar->id, NodeType::COPY_ON_WRITE); + add_relation( + target_cow_key, init_ik_key, "IK Target CoW -> Init IK Tree", RELATION_CHECK_BEFORE_ADD); } /* Subtarget references: */ if ((data->poletar->type == OB_ARMATURE) && (data->polesubtarget[0])) { diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations_view_layer.cc b/source/blender/depsgraph/intern/builder/deg_builder_relations_view_layer.cc index 605de2cf886..5770d64749e 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_relations_view_layer.cc +++ b/source/blender/depsgraph/intern/builder/deg_builder_relations_view_layer.cc @@ -108,7 +108,7 @@ void DepsgraphRelationBuilder::build_view_layer(Scene *scene, scene_ = scene; BKE_view_layer_synced_ensure(scene, view_layer); /* Scene objects. */ - /* NOTE: Nodes builder requires us to pass evaluated base because it's being + /* NOTE: Nodes builder requires us to pass CoW base because it's being * passed to the evaluation functions. During relations builder we only * do nullptr-pointer check of the base, so it's fine to pass original one. */ LISTBASE_FOREACH (Base *, base, BKE_view_layer_object_bases_get(view_layer)) { @@ -144,10 +144,6 @@ void DepsgraphRelationBuilder::build_view_layer(Scene *scene, if (view_layer->mat_override != nullptr) { build_material(view_layer->mat_override); } - /* World override */ - if (view_layer->world_override != nullptr) { - build_world(view_layer->world_override); - } /* Freestyle linesets. */ LISTBASE_FOREACH (FreestyleLineSet *, fls, &view_layer->freestyle_config.linesets) { build_freestyle_lineset(fls); diff --git a/source/blender/depsgraph/intern/builder/pipeline.cc b/source/blender/depsgraph/intern/builder/pipeline.cc index abe5d772e30..dd75f4e216f 100644 --- a/source/blender/depsgraph/intern/builder/pipeline.cc +++ b/source/blender/depsgraph/intern/builder/pipeline.cc @@ -6,7 +6,7 @@ #include "BLI_time.h" -#include "BKE_global.hh" +#include "BKE_global.h" #include "DNA_scene_types.h" @@ -29,7 +29,7 @@ void AbstractBuilderPipeline::build() { double start_time = 0.0; if (G.debug & (G_DEBUG_DEPSGRAPH_BUILD | G_DEBUG_DEPSGRAPH_TIME)) { - start_time = BLI_time_now_seconds(); + start_time = BLI_check_seconds_timer(); } build_step_sanity_check(); @@ -38,7 +38,7 @@ void AbstractBuilderPipeline::build() build_step_finalize(); if (G.debug & (G_DEBUG_DEPSGRAPH_BUILD | G_DEBUG_DEPSGRAPH_TIME)) { - printf("Depsgraph built in %f seconds.\n", BLI_time_now_seconds() - start_time); + printf("Depsgraph built in %f seconds.\n", BLI_check_seconds_timer() - start_time); } } diff --git a/source/blender/depsgraph/intern/builder/pipeline_from_collection.cc b/source/blender/depsgraph/intern/builder/pipeline_from_collection.cc deleted file mode 100644 index 5844c340dc5..00000000000 --- a/source/blender/depsgraph/intern/builder/pipeline_from_collection.cc +++ /dev/null @@ -1,122 +0,0 @@ -/* SPDX-FileCopyrightText: 2024 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -#include "pipeline_from_collection.h" - -#include "BKE_collection.hh" - -#include "DNA_layer_types.h" - -#include "DEG_depsgraph.hh" - -#include "intern/builder/deg_builder_nodes.h" -#include "intern/builder/deg_builder_relations.h" -#include "intern/depsgraph.hh" - -namespace blender::deg { - -namespace { - -class DepsgraphFromCollectionIDsFilter { - public: - DepsgraphFromCollectionIDsFilter(const Set &ids) : ids_(ids) {} - - bool contains(ID *id) - { - return ids_.contains(id); - } - - protected: - const Set &ids_; -}; - -class DepsgraphFromCollectionIDsNodeBuilder : public DepsgraphNodeBuilder { - public: - DepsgraphFromCollectionIDsNodeBuilder(Main *bmain, - Depsgraph *graph, - DepsgraphBuilderCache *cache, - const Set &ids) - : DepsgraphNodeBuilder(bmain, graph, cache), filter_(ids) - { - } - - bool need_pull_base_into_graph(const Base *base) override - { - if (!filter_.contains(&base->object->id)) { - return false; - } - return DepsgraphNodeBuilder::need_pull_base_into_graph(base); - } - - protected: - DepsgraphFromCollectionIDsFilter filter_; -}; - -class DepsgraphFromCollectionIDsRelationBuilder : public DepsgraphRelationBuilder { - public: - DepsgraphFromCollectionIDsRelationBuilder(Main *bmain, - Depsgraph *graph, - DepsgraphBuilderCache *cache, - const Set &ids) - : DepsgraphRelationBuilder(bmain, graph, cache), filter_(ids) - { - } - - bool need_pull_base_into_graph(const Base *base) override - { - if (!filter_.contains(&base->object->id)) { - return false; - } - return DepsgraphRelationBuilder::need_pull_base_into_graph(base); - } - - protected: - DepsgraphFromCollectionIDsFilter filter_; -}; - -} // namespace - -FromCollectionBuilderPipeline::FromCollectionBuilderPipeline(::Depsgraph *graph, - Collection *collection) - : AbstractBuilderPipeline(graph) -{ - Base *base = BKE_collection_or_layer_objects(scene_, view_layer_, collection); - const int base_flag = (deg_graph_->mode == DAG_EVAL_RENDER) ? BASE_ENABLED_RENDER : - BASE_ENABLED_VIEWPORT; - for (; base; base = base->next) { - if (base->flag & base_flag) { - ids_.add(&base->object->id); - } - } -} - -unique_ptr FromCollectionBuilderPipeline::construct_node_builder() -{ - return std::make_unique( - bmain_, deg_graph_, &builder_cache_, ids_); -} - -unique_ptr FromCollectionBuilderPipeline::construct_relation_builder() -{ - return std::make_unique( - bmain_, deg_graph_, &builder_cache_, ids_); -} - -void FromCollectionBuilderPipeline::build_nodes(DepsgraphNodeBuilder &node_builder) -{ - node_builder.build_view_layer(scene_, view_layer_, DEG_ID_LINKED_DIRECTLY); - for (ID *id : ids_) { - node_builder.build_id(id, true); - } -} - -void FromCollectionBuilderPipeline::build_relations(DepsgraphRelationBuilder &relation_builder) -{ - relation_builder.build_view_layer(scene_, view_layer_, DEG_ID_LINKED_DIRECTLY); - for (ID *id : ids_) { - relation_builder.build_id(id); - } -} - -} // namespace blender::deg diff --git a/source/blender/depsgraph/intern/builder/pipeline_from_collection.h b/source/blender/depsgraph/intern/builder/pipeline_from_collection.h deleted file mode 100644 index 62893b77c67..00000000000 --- a/source/blender/depsgraph/intern/builder/pipeline_from_collection.h +++ /dev/null @@ -1,42 +0,0 @@ -/* SPDX-FileCopyrightText: 2024 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup depsgraph - */ - -#pragma once - -#include "pipeline.h" - -struct Collection; - -namespace blender::deg { - -/* Optimized builders for dependency graph built from a given Collection. - * - * General notes: - * - * - We pull in all bases if their objects are in the set of IDs. This allows to have proper - * visibility and other flags assigned to the objects. - * All other bases (the ones which points to object which is outside of the set of IDs) are - * completely ignored. - */ - -class FromCollectionBuilderPipeline : public AbstractBuilderPipeline { - public: - FromCollectionBuilderPipeline(::Depsgraph *graph, Collection *collection); - - protected: - virtual unique_ptr construct_node_builder() override; - virtual unique_ptr construct_relation_builder() override; - - virtual void build_nodes(DepsgraphNodeBuilder &node_builder) override; - virtual void build_relations(DepsgraphRelationBuilder &relation_builder) override; - - private: - Set ids_; -}; - -} // namespace blender::deg diff --git a/source/blender/depsgraph/intern/debug/deg_debug.cc b/source/blender/depsgraph/intern/debug/deg_debug.cc index 5ec2fdedb94..5f5cfc065f8 100644 --- a/source/blender/depsgraph/intern/debug/deg_debug.cc +++ b/source/blender/depsgraph/intern/debug/deg_debug.cc @@ -14,7 +14,7 @@ #include "BLI_time_utildefines.h" #include "BLI_utildefines.h" -#include "BKE_global.hh" +#include "BKE_global.h" #include "intern/depsgraph.hh" @@ -33,7 +33,7 @@ void DepsgraphDebug::begin_graph_evaluation() return; } - const double current_time = BLI_time_now_seconds(); + const double current_time = BLI_check_seconds_timer(); graph_evaluation_start_time_ = current_time; } @@ -44,7 +44,7 @@ void DepsgraphDebug::end_graph_evaluation() return; } - const double graph_eval_end_time = BLI_time_now_seconds(); + const double graph_eval_end_time = BLI_check_seconds_timer(); const double graph_eval_time = graph_eval_end_time - graph_evaluation_start_time_; if (name.empty()) { diff --git a/source/blender/depsgraph/intern/debug/deg_debug.h b/source/blender/depsgraph/intern/debug/deg_debug.h index 29ac35dab67..3eceb76943d 100644 --- a/source/blender/depsgraph/intern/debug/deg_debug.h +++ b/source/blender/depsgraph/intern/debug/deg_debug.h @@ -10,7 +10,7 @@ #include "intern/depsgraph_type.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "DEG_depsgraph_debug.hh" diff --git a/source/blender/depsgraph/intern/debug/deg_debug_relations_graphviz.cc b/source/blender/depsgraph/intern/debug/deg_debug_relations_graphviz.cc index 447e7909b69..fb8595edd08 100644 --- a/source/blender/depsgraph/intern/debug/deg_debug_relations_graphviz.cc +++ b/source/blender/depsgraph/intern/debug/deg_debug_relations_graphviz.cc @@ -94,7 +94,7 @@ static const int deg_debug_node_type_color_map[][2] = { {NodeType::CACHE, 9}, {NodeType::POINT_CACHE, 10}, {NodeType::LAYER_COLLECTIONS, 11}, - {NodeType::COPY_ON_EVAL, 12}, + {NodeType::COPY_ON_WRITE, 12}, {-1, 0}, }; #endif @@ -290,7 +290,7 @@ static void deg_debug_graphviz_relation_arrowhead(const Relation *rel, dot::Dire { OperationNode *op_from = (OperationNode *)rel->from; OperationNode *op_to = (OperationNode *)rel->to; - if (op_from->owner->type == NodeType::COPY_ON_EVAL && + if (op_from->owner->type == NodeType::COPY_ON_WRITE && !op_to->owner->need_tag_cow_before_update()) { shape = shape_no_cow; @@ -403,7 +403,7 @@ static void deg_debug_graphviz_node(DotExportContext &ctx, case NodeType::LAYER_COLLECTIONS: case NodeType::PARTICLE_SYSTEM: case NodeType::PARTICLE_SETTINGS: - case NodeType::COPY_ON_EVAL: + case NodeType::COPY_ON_WRITE: case NodeType::OBJECT_FROM_LAYER: case NodeType::HIERARCHY: case NodeType::BATCH_CACHE: @@ -457,7 +457,7 @@ static void deg_debug_graphviz_node_relations(DotExportContext &ctx, const Node deg_debug_graphviz_relation_arrowhead(rel, edge); edge.attributes.set("penwidth", penwidth); - /* NOTE: edge from node to our own cluster is not possible and gives graphviz + /* NOTE: edge from node to own cluster is not possible and gives graphviz * warning, avoid this here by just linking directly to the invisible * placeholder node. */ dot::Cluster *tail_cluster = ctx.clusters_map.lookup_default(tail, nullptr); diff --git a/source/blender/depsgraph/intern/depsgraph.cc b/source/blender/depsgraph/intern/depsgraph.cc index 2f76ee84f4b..88db9136951 100644 --- a/source/blender/depsgraph/intern/depsgraph.cc +++ b/source/blender/depsgraph/intern/depsgraph.cc @@ -19,9 +19,9 @@ #include "BLI_hash.h" #include "BLI_utildefines.h" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_idtype.hh" -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "DEG_depsgraph.hh" #include "DEG_depsgraph_debug.hh" @@ -108,7 +108,7 @@ IDNode *Depsgraph::find_id_node(const ID *id) const IDNode *Depsgraph::add_id_node(ID *id, ID *id_cow_hint) { - BLI_assert((id->tag & LIB_TAG_COPIED_ON_EVAL) == 0); + BLI_assert((id->tag & LIB_TAG_COPIED_ON_WRITE) == 0); IDNode *id_node = find_id_node(id); if (!id_node) { DepsNodeFactory *factory = type_get_factory(NodeType::ID_REF); @@ -131,19 +131,19 @@ static void clear_id_nodes_conditional(Depsgraph::IDDepsNodes *id_nodes, const F { for (IDNode *id_node : *id_nodes) { if (id_node->id_cow == nullptr) { - /* This means builder "stole" ownership of the evaluated - * datablock for its own dirty needs. */ + /* This means builder "stole" ownership of the copy-on-written + * datablock for her own dirty needs. */ continue; } if (id_node->id_cow == id_node->id_orig) { - /* Evaluated copy is not needed for this ID type. + /* Copy-on-write version is not needed for this ID type. * * NOTE: Is important to not de-reference the original datablock here because it might be * freed already (happens during main database free when some IDs are freed prior to a * scene). */ continue; } - if (!deg_eval_copy_is_expanded(id_node->id_cow)) { + if (!deg_copy_on_write_is_expanded(id_node->id_cow)) { continue; } const ID_Type id_type = GS(id_node->id_cow->name); @@ -188,8 +188,8 @@ Relation *Depsgraph::add_new_relation(Node *from, Node *to, const char *descript if (from->type == NodeType::OPERATION && to->type == NodeType::OPERATION) { OperationNode *operation_from = static_cast(from); OperationNode *operation_to = static_cast(to); - BLI_assert(operation_to->owner->type != NodeType::COPY_ON_EVAL || - operation_from->owner->type == NodeType::COPY_ON_EVAL); + BLI_assert(operation_to->owner->type != NodeType::COPY_ON_WRITE || + operation_from->owner->type == NodeType::COPY_ON_WRITE); } #endif @@ -243,12 +243,12 @@ ID *Depsgraph::get_cow_id(const ID *id_orig) const IDNode *id_node = find_id_node(id_orig); if (id_node == nullptr) { /* This function is used from places where we expect ID to be either - * already a copy-on-evaluation version or have a corresponding copy-on-evaluation + * already a copy-on-write version or have a corresponding copy-on-write * version. * * We try to enforce that in debug builds, for release we play a bit * safer game here. */ - if ((id_orig->tag & LIB_TAG_COPIED_ON_EVAL) == 0) { + if ((id_orig->tag & LIB_TAG_COPIED_ON_WRITE) == 0) { /* TODO(sergey): This is nice sanity check to have, but it fails * in following situations: * @@ -257,7 +257,7 @@ ID *Depsgraph::get_cow_id(const ID *id_orig) const * - Object or mesh has material at a slot which is not used (for * example, object has material slot by materials are set to * object data). */ - // BLI_assert_msg(0, "Request for non-existing copy-on-evaluation ID"); + // BLI_assert_msg(0, "Request for non-existing copy-on-write ID"); } return (ID *)id_orig; } diff --git a/source/blender/depsgraph/intern/depsgraph.hh b/source/blender/depsgraph/intern/depsgraph.hh index dcf00eb347a..a4bc13ba10f 100644 --- a/source/blender/depsgraph/intern/depsgraph.hh +++ b/source/blender/depsgraph/intern/depsgraph.hh @@ -75,7 +75,7 @@ struct Depsgraph { /* Copy-on-Write Functionality ........ */ - /* For given original ID get ID which is created by copy-on-evaluation system. */ + /* For given original ID get ID which is created by CoW system. */ ID *get_cow_id(const ID *id_orig) const; /* Core Graph Functionality ........... */ diff --git a/source/blender/depsgraph/intern/depsgraph_build.cc b/source/blender/depsgraph/intern/depsgraph_build.cc index d143b112e07..822fe1e5f81 100644 --- a/source/blender/depsgraph/intern/depsgraph_build.cc +++ b/source/blender/depsgraph/intern/depsgraph_build.cc @@ -22,9 +22,9 @@ #include "DNA_object_types.h" #include "DNA_scene_types.h" -#include "BKE_collection.hh" +#include "BKE_collection.h" #include "BKE_main.hh" -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "DEG_depsgraph.hh" #include "DEG_depsgraph_build.hh" @@ -33,7 +33,6 @@ #include "builder/deg_builder_relations.h" #include "builder/pipeline_all_objects.h" #include "builder/pipeline_compositor.h" -#include "builder/pipeline_from_collection.h" #include "builder/pipeline_from_ids.h" #include "builder/pipeline_render.h" #include "builder/pipeline_view_layer.h" @@ -277,12 +276,6 @@ void DEG_graph_build_from_ids(Depsgraph *graph, ID **ids, const int num_ids) builder.build(); } -void DEG_graph_build_from_collection(Depsgraph *graph, Collection *collection) -{ - deg::FromCollectionBuilderPipeline builder(graph, collection); - builder.build(); -} - void DEG_graph_tag_relations_update(Depsgraph *graph) { DEG_DEBUG_PRINTF(graph, TAG, "%s: Tagging relations for update.\n", __func__); diff --git a/source/blender/depsgraph/intern/depsgraph_eval.cc b/source/blender/depsgraph/intern/depsgraph_eval.cc index b55a2e35cbe..3ed12e3a39d 100644 --- a/source/blender/depsgraph/intern/depsgraph_eval.cc +++ b/source/blender/depsgraph/intern/depsgraph_eval.cc @@ -13,7 +13,7 @@ #include "BLI_listbase.h" #include "BLI_utildefines.h" -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "DNA_object_types.h" #include "DNA_scene_types.h" diff --git a/source/blender/depsgraph/intern/depsgraph_light_linking.cc b/source/blender/depsgraph/intern/depsgraph_light_linking.cc index 30afc4e5cec..758eceb340c 100644 --- a/source/blender/depsgraph/intern/depsgraph_light_linking.cc +++ b/source/blender/depsgraph/intern/depsgraph_light_linking.cc @@ -16,7 +16,7 @@ #include "BLI_map.hh" #include "BLI_utildefines.h" -#include "BKE_collection.hh" +#include "BKE_collection.h" #include "DNA_collection_types.h" #include "DNA_layer_types.h" diff --git a/source/blender/depsgraph/intern/depsgraph_query.cc b/source/blender/depsgraph/intern/depsgraph_query.cc index aa0a5e28838..381c5c1e30a 100644 --- a/source/blender/depsgraph/intern/depsgraph_query.cc +++ b/source/blender/depsgraph/intern/depsgraph_query.cc @@ -44,7 +44,7 @@ static const ID *get_original_id(const ID *id) if (id->orig_id == nullptr) { return id; } - BLI_assert((id->tag & LIB_TAG_COPIED_ON_EVAL) != 0); + BLI_assert((id->tag & LIB_TAG_COPIED_ON_WRITE) != 0); return (ID *)id->orig_id; } @@ -189,7 +189,7 @@ Scene *DEG_get_evaluated_scene(const Depsgraph *graph) Scene *scene_cow = deg_graph->scene_cow; /* TODO(sergey): Shall we expand data-block here? Or is it OK to assume * that caller is OK with just a pointer in case scene is not updated yet? */ - BLI_assert(scene_cow != nullptr && deg::deg_eval_copy_is_expanded(&scene_cow->id)); + BLI_assert(scene_cow != nullptr && deg::deg_copy_on_write_is_expanded(&scene_cow->id)); return scene_cow; } @@ -250,16 +250,16 @@ void DEG_get_evaluated_rna_pointer(const Depsgraph *depsgraph, } else { /* For everything else, try to get RNA Path of the BMain-pointer, - * then use that to look up what the evaluated one should be - * given the evaluated ID pointer as the new lookup point */ + * then use that to look up what the COW-domain one should be + * given the COW ID pointer as the new lookup point */ /* TODO: Find a faster alternative, or implement support for other * common types too above (e.g. modifiers) */ if (const std::optional path = RNA_path_from_ID_to_struct(ptr)) { PointerRNA cow_id_ptr = RNA_id_pointer_create(cow_id); if (!RNA_path_resolve(&cow_id_ptr, path->c_str(), r_ptr_eval, nullptr)) { - /* Couldn't find evaluated copy of data */ + /* Couldn't find COW copy of data */ fprintf(stderr, - "%s: Couldn't resolve RNA path ('%s') relative to evaluated ID (%p) for '%s'\n", + "%s: Couldn't resolve RNA path ('%s') relative to COW ID (%p) for '%s'\n", __func__, path->c_str(), (void *)cow_id, @@ -294,18 +294,19 @@ bool DEG_is_original_id(const ID *id) * What we want here is to be able to tell whether given ID is a result of dependency graph * evaluation or not. * - * All the data-blocks which are created by copy-on-evaluation mechanism will have will be tagged - * with LIB_TAG_COPIED_ON_EVAL tag. Those data-blocks can not be original. + * All the data-blocks which are created by copy-on-write mechanism will have will be tagged with + * LIB_TAG_COPIED_ON_WRITE tag. Those data-blocks can not be original. * * Modifier stack evaluation might create special data-blocks which have all the modifiers - * applied, and those will be tagged with LIB_TAG_COPIED_ON_EVAL_FINAL_RESULT. Such data-blocks + * applied, and those will be tagged with LIB_TAG_COPIED_ON_WRITE_EVAL_RESULT. Such data-blocks * can not be original as well. * * Localization is usually happening from evaluated data-block, or will have some special pointer * magic which will make them to act as evaluated. * * NOTE: We consider ID evaluated if ANY of those flags is set. We do NOT require ALL of them. */ - if (id->tag & (LIB_TAG_COPIED_ON_EVAL | LIB_TAG_COPIED_ON_EVAL_FINAL_RESULT | LIB_TAG_LOCALIZED)) + if (id->tag & + (LIB_TAG_COPIED_ON_WRITE | LIB_TAG_COPIED_ON_WRITE_EVAL_RESULT | LIB_TAG_LOCALIZED)) { return false; } diff --git a/source/blender/depsgraph/intern/depsgraph_query_foreach.cc b/source/blender/depsgraph/intern/depsgraph_query_foreach.cc index 589bad8483a..4265eb6f818 100644 --- a/source/blender/depsgraph/intern/depsgraph_query_foreach.cc +++ b/source/blender/depsgraph/intern/depsgraph_query_foreach.cc @@ -203,7 +203,7 @@ void deg_foreach_ancestor_ID(const Depsgraph *graph, const ID *id, DEGForeachIDC ComponentNode *comp_node = op_node->owner; IDNode *id_node = comp_node->owner; if (!visited.contains(id_node)) { - /* TODO(sergey): Is it orig or evaluated? */ + /* TODO(sergey): Is it orig or CoW? */ callback(id_node->id_orig); visited.add_new(id_node); } diff --git a/source/blender/depsgraph/intern/depsgraph_query_iter.cc b/source/blender/depsgraph/intern/depsgraph_query_iter.cc index db9f053536d..c7665dccfc0 100644 --- a/source/blender/depsgraph/intern/depsgraph_query_iter.cc +++ b/source/blender/depsgraph/intern/depsgraph_query_iter.cc @@ -13,7 +13,7 @@ #include "MEM_guardedalloc.h" -#include "BKE_duplilist.hh" +#include "BKE_duplilist.h" #include "BKE_geometry_set.hh" #include "BKE_idprop.h" #include "BKE_layer.hh" @@ -180,11 +180,10 @@ bool deg_iterator_duplis_step(DEGObjectIterData *data) bool is_neg_scale = is_negative_m4(dob->mat); SET_FLAG_FROM_TEST(data->temp_dupli_object.transflag, is_neg_scale, OB_NEG_SCALE); - copy_m4_m4(data->temp_dupli_object.runtime->object_to_world.ptr(), dob->mat); - invert_m4_m4(data->temp_dupli_object.runtime->world_to_object.ptr(), - data->temp_dupli_object.object_to_world().ptr()); + copy_m4_m4(data->temp_dupli_object.object_to_world, dob->mat); + invert_m4_m4(data->temp_dupli_object.world_to_object, data->temp_dupli_object.object_to_world); data->next_object = &data->temp_dupli_object; - BLI_assert(deg::deg_validate_eval_copy_datablock(&data->temp_dupli_object.id)); + BLI_assert(deg::deg_validate_copy_on_write_datablock(&data->temp_dupli_object.id)); return true; } @@ -238,7 +237,7 @@ bool deg_iterator_objects_step(DEGObjectIterData *data) Object *object = (Object *)id_node->id_cow; Object *object_orig = DEG_get_original_object(object); - BLI_assert(deg::deg_validate_eval_copy_datablock(&object->id)); + BLI_assert(deg::deg_validate_copy_on_write_datablock(&object->id)); object->runtime->select_id = object_orig->runtime->select_id; const bool use_preview = object_orig == data->object_orig_with_preview; diff --git a/source/blender/depsgraph/intern/depsgraph_tag.cc b/source/blender/depsgraph/intern/depsgraph_tag.cc index 2919e43f8fc..385a53b0bdf 100644 --- a/source/blender/depsgraph/intern/depsgraph_tag.cc +++ b/source/blender/depsgraph/intern/depsgraph_tag.cc @@ -28,12 +28,12 @@ #include "DNA_screen_types.h" #include "DNA_windowmanager_types.h" -#include "BKE_anim_data.hh" -#include "BKE_global.hh" +#include "BKE_anim_data.h" +#include "BKE_global.h" #include "BKE_idtype.hh" #include "BKE_lib_override.hh" #include "BKE_node.hh" -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "BKE_screen.hh" #include "BKE_workspace.h" @@ -102,8 +102,8 @@ void depsgraph_select_tag_to_component_opcode(const ID *id, *operation_code = OperationCode::GEOMETRY_SELECT_UPDATE; } else { - *component_type = NodeType::COPY_ON_EVAL; - *operation_code = OperationCode::COPY_ON_EVAL; + *component_type = NodeType::COPY_ON_WRITE; + *operation_code = OperationCode::COPY_ON_WRITE; } } @@ -171,8 +171,8 @@ void depsgraph_tag_to_component_opcode(const ID *id, *component_type = NodeType::PARTICLE_SYSTEM; } break; - case ID_RECALC_SYNC_TO_EVAL: - *component_type = NodeType::COPY_ON_EVAL; + case ID_RECALC_COPY_ON_WRITE: + *component_type = NodeType::COPY_ON_WRITE; break; case ID_RECALC_SHADING: *component_type = NodeType::SHADING; @@ -250,7 +250,7 @@ void depsgraph_update_editors_tag(Main *bmain, Depsgraph *graph, ID *id) { /* NOTE: We handle this immediately, without delaying anything, to be * sure we don't cause threading issues with OpenGL. */ - /* TODO(sergey): Make sure this works for evaluated data-blocks as well. */ + /* TODO(sergey): Make sure this works for CoW-ed data-blocks as well. */ DEGEditorUpdateContext update_ctx = {nullptr}; update_ctx.bmain = bmain; update_ctx.depsgraph = (::Depsgraph *)graph; @@ -261,9 +261,9 @@ void depsgraph_update_editors_tag(Main *bmain, Depsgraph *graph, ID *id) void depsgraph_id_tag_copy_on_write(Depsgraph *graph, IDNode *id_node, eUpdateSource update_source) { - ComponentNode *cow_comp = id_node->find_component(NodeType::COPY_ON_EVAL); + ComponentNode *cow_comp = id_node->find_component(NodeType::COPY_ON_WRITE); if (cow_comp == nullptr) { - BLI_assert(!deg_eval_copy_is_needed(GS(id_node->id_orig->name))); + BLI_assert(!deg_copy_on_write_is_needed(GS(id_node->id_orig->name))); return; } cow_comp->tag_update(graph, update_source); @@ -277,8 +277,8 @@ void depsgraph_tag_component(Depsgraph *graph, { ComponentNode *component_node = id_node->find_component(component_type); /* NOTE: Animation component might not be existing yet (which happens when adding new driver or - * adding a new keyframe), so the required copy-on-evaluation tag needs to be taken care - * explicitly here. */ + * adding a new keyframe), so the required copy-on-write tag needs to be taken care explicitly + * here. */ if (component_node == nullptr) { if (component_type == NodeType::ANIMATION) { id_node->is_cow_explicitly_tagged = true; @@ -295,11 +295,11 @@ void depsgraph_tag_component(Depsgraph *graph, operation_node->tag_update(graph, update_source); } } - /* If component depends on copy-on-evaluation, tag it as well. */ + /* If component depends on copy-on-write, tag it as well. */ if (component_node->need_tag_cow_before_update()) { depsgraph_id_tag_copy_on_write(graph, id_node, update_source); } - if (component_type == NodeType::COPY_ON_EVAL) { + if (component_type == NodeType::COPY_ON_WRITE) { id_node->is_cow_explicitly_tagged = true; } } @@ -498,7 +498,7 @@ void deg_graph_node_tag_zero(Main *bmain, if (comp_node->type == NodeType::ANIMATION) { continue; } - if (comp_node->type == NodeType::COPY_ON_EVAL) { + if (comp_node->type == NodeType::COPY_ON_WRITE) { id_node->is_cow_explicitly_tagged = true; } @@ -532,7 +532,7 @@ void deg_graph_tag_parameters_if_needed(Main *bmain, /* Clear flags which are known to not affect parameters usable by drivers. */ const uint clean_flags = flags & - ~(ID_RECALC_SYNC_TO_EVAL | ID_RECALC_SELECT | ID_RECALC_BASE_FLAGS); + ~(ID_RECALC_COPY_ON_WRITE | ID_RECALC_SELECT | ID_RECALC_BASE_FLAGS); if (clean_flags == 0) { /* Changes are limited to only things which are not usable by drivers. */ @@ -571,8 +571,8 @@ void graph_tag_ids_for_visible_update(Depsgraph *graph) continue; } uint flags = 0; - if (!deg::deg_eval_copy_is_expanded(id_node->id_cow)) { - flags |= ID_RECALC_SYNC_TO_EVAL; + if (!deg::deg_copy_on_write_is_expanded(id_node->id_cow)) { + flags |= ID_RECALC_COPY_ON_WRITE; if (do_time) { if (BKE_animdata_from_id(id_node->id_orig) != nullptr) { flags |= ID_RECALC_ANIMATION; @@ -594,12 +594,12 @@ void graph_tag_ids_for_visible_update(Depsgraph *graph) if (id_type == ID_OB) { flags |= ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY; } - /* For non-copy-on-eval datablocks like images, there is no need to update when + /* For non-COW datablocks like images, there is no need to update when * they just got added to the depsgraph and there is no flag indicating - * a specific change that was made to them. Unlike evaluated datablocks which + * a specific change that was made to them. Unlike COW datablocks which * have just been copied. * This helps preserve cached image draw data for the compositor. */ - if (ID_TYPE_USE_COPY_ON_EVAL(id_type) || flags != 0) { + if (ID_TYPE_IS_COW(id_type) || flags != 0) { graph_id_tag_update(bmain, graph, id_node->id_orig, flags, DEG_UPDATE_SOURCE_VISIBILITY); } if (id_type == ID_SCE) { @@ -770,8 +770,8 @@ const char *DEG_update_tag_as_string(IDRecalcFlag flag) return "PSYS_PHYS"; case ID_RECALC_PSYS_ALL: return "PSYS_ALL"; - case ID_RECALC_SYNC_TO_EVAL: - return "COPY_ON_EVAL"; + case ID_RECALC_COPY_ON_WRITE: + return "COPY_ON_WRITE"; case ID_RECALC_SHADING: return "SHADING"; case ID_RECALC_SELECT: @@ -840,7 +840,7 @@ void DEG_id_tag_update_ex(Main *bmain, ID *id, uint flags) deg::id_tag_update(bmain, id, flags, deg::DEG_UPDATE_SOURCE_USER_EDIT); } -void DEG_id_tag_update_for_side_effect_request(Depsgraph *depsgraph, ID *id, uint flags) +void DEG_id_tag_update_for_side_effect_request(Depsgraph *depsgraph, ID *id, unsigned int flags) { BLI_assert(depsgraph != nullptr); BLI_assert(id != nullptr); diff --git a/source/blender/depsgraph/intern/eval/deg_eval.cc b/source/blender/depsgraph/intern/eval/deg_eval.cc index 2556c242af5..218a6eccacf 100644 --- a/source/blender/depsgraph/intern/eval/deg_eval.cc +++ b/source/blender/depsgraph/intern/eval/deg_eval.cc @@ -17,7 +17,7 @@ #include "BLI_time.h" #include "BLI_utildefines.h" -#include "BKE_global.hh" +#include "BKE_global.h" #include "DNA_node_types.h" #include "DNA_object_types.h" @@ -62,7 +62,7 @@ enum class EvaluationStage { /* Stage 1: Only Copy-on-Write operations are to be evaluated, prior to anything else. * This allows other operations to access its dependencies when there is a dependency cycle * involved. */ - COPY_ON_EVAL, + COPY_ON_WRITE, /* Evaluate actual ID nodes visibility based on the current state of animation and drivers. */ DYNAMIC_VISIBILITY, @@ -93,9 +93,9 @@ void evaluate_node(const DepsgraphEvalState *state, OperationNode *operation_nod BLI_assert_msg(!operation_node->is_noop(), "NOOP nodes should not actually be scheduled"); /* Perform operation. */ if (state->do_stats) { - const double start_time = BLI_time_now_seconds(); + const double start_time = BLI_check_seconds_timer(); operation_node->evaluate(depsgraph); - operation_node->stats.current_time += BLI_time_now_seconds() - start_time; + operation_node->stats.current_time += BLI_check_seconds_timer() - start_time; } else { operation_node->evaluate(depsgraph); @@ -126,9 +126,9 @@ void deg_task_run_func(TaskPool *pool, void *taskdata) bool check_operation_node_visible(const DepsgraphEvalState *state, OperationNode *op_node) { const ComponentNode *comp_node = op_node->owner; - /* Special case for copy-on-eval component: it is to be always evaluated, to keep copied + /* Special case for copy on write component: it is to be always evaluated, to keep copied * "database" in a consistent state. */ - if (comp_node->type == NodeType::COPY_ON_EVAL) { + if (comp_node->type == NodeType::COPY_ON_WRITE) { return true; } @@ -212,8 +212,8 @@ bool need_evaluate_operation_at_stage(DepsgraphEvalState *state, { const ComponentNode *component_node = operation_node->owner; switch (state->stage) { - case EvaluationStage::COPY_ON_EVAL: - return (component_node->type == NodeType::COPY_ON_EVAL); + case EvaluationStage::COPY_ON_WRITE: + return (component_node->type == NodeType::COPY_ON_WRITE); case EvaluationStage::DYNAMIC_VISIBILITY: return operation_node->flag & OperationFlag::DEPSOP_FLAG_AFFECTS_VISIBILITY; @@ -261,7 +261,7 @@ void schedule_node(DepsgraphEvalState *state, if (node->num_links_pending != 0) { return; } - /* During the copy-on-eval stage only schedule copy-on-eval nodes. */ + /* During the COW stage only schedule COW nodes. */ if (!need_evaluate_operation_at_stage(state, node)) { return; } @@ -353,19 +353,19 @@ void evaluate_graph_single_threaded_if_needed(DepsgraphEvalState *state) void depsgraph_ensure_view_layer(Depsgraph *graph) { - /* We update evaluated scene in the following cases: + /* We update copy-on-write scene in the following cases: * - It was not expanded yet. - * - It was tagged for update of evaluated component. + * - It was tagged for update of CoW component. * This allows us to have proper view layer pointer. */ Scene *scene_cow = graph->scene_cow; - if (deg_eval_copy_is_expanded(&scene_cow->id) && - (scene_cow->id.recalc & ID_RECALC_SYNC_TO_EVAL) == 0) + if (deg_copy_on_write_is_expanded(&scene_cow->id) && + (scene_cow->id.recalc & ID_RECALC_COPY_ON_WRITE) == 0) { return; } const IDNode *scene_id_node = graph->find_id_node(&graph->scene->id); - deg_update_eval_copy_datablock(graph, scene_id_node); + deg_update_copy_on_write_datablock(graph, scene_id_node); } TaskPool *deg_evaluate_task_pool_create(DepsgraphEvalState *state) @@ -408,9 +408,9 @@ void deg_evaluate_on_refresh(Depsgraph *graph) /* Evaluation happens in several incremental steps: * - * - Start with the copy-on-evaluation operations which never form dependency cycles. This will - * ensure that if a dependency graph has a cycle evaluation functions will always "see" valid - * expanded datablock. It might not be evaluated yet, but at least the datablock will be valid. + * - Start with the copy-on-write operations which never form dependency cycles. This will ensure + * that if a dependency graph has a cycle evaluation functions will always "see" valid expanded + * datablock. It might not be evaluated yet, but at least the datablock will be valid. * * - If there is potentially dynamically changing visibility in the graph update the actual * nodes visibilities, so that actual heavy data evaluation can benefit from knowledge that @@ -425,7 +425,7 @@ void deg_evaluate_on_refresh(Depsgraph *graph) TaskPool *task_pool = deg_evaluate_task_pool_create(&state); - evaluate_graph_threaded_stage(&state, task_pool, EvaluationStage::COPY_ON_EVAL); + evaluate_graph_threaded_stage(&state, task_pool, EvaluationStage::COPY_ON_WRITE); if (graph->has_animated_visibility || graph->need_update_nodes_visibility) { /* Update pending parents including only the ones which are affecting operations which are diff --git a/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc b/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc index 7cfbedabaaa..43b8f64eb26 100644 --- a/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc +++ b/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc @@ -26,14 +26,14 @@ #include "BLI_utildefines.h" #include "BKE_curve.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_gpencil_legacy.h" #include "BKE_gpencil_update_cache_legacy.h" #include "BKE_idprop.h" #include "BKE_layer.hh" #include "BKE_lib_id.hh" #include "BKE_object_types.hh" -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "DEG_depsgraph.hh" #include "DEG_depsgraph_query.hh" @@ -69,7 +69,7 @@ #endif #include "BKE_action.h" -#include "BKE_anim_data.hh" +#include "BKE_anim_data.h" #include "BKE_animsys.h" #include "BKE_armature.hh" #include "BKE_editmesh.hh" @@ -132,7 +132,7 @@ void nested_id_hack_discard_pointers(ID *id_cow) case ID_SCE: { Scene *scene_cow = (Scene *)id_cow; /* Node trees always have their own ID node in the graph, and are - * being copied as part of their copy-on-evaluation process. */ + * being copied as part of their copy-on-write process. */ scene_cow->nodetree = nullptr; /* Tool settings pointer is shared with the original scene. */ scene_cow->toolsettings = nullptr; @@ -424,7 +424,7 @@ void view_layer_remove_disabled_bases(const Depsgraph *depsgraph, * * NOTE: We are using original base since the object which evaluated base * points to is not yet copied. This is dangerous access from evaluated - * domain to original one, but this is how the entire copy-on-evaluation works: + * domain to original one, but this is how the entire copy-on-write works: * it does need to access original for an initial copy. */ const bool is_object_enabled = deg_check_base_in_depsgraph(depsgraph, base); if (is_object_enabled) { @@ -486,7 +486,7 @@ inline bool check_datablock_expanded(const ID *id_cow) } /* Callback for BKE_library_foreach_ID_link which remaps original ID pointer - * with the one created by copy-on-evaluation system. */ + * with the one created by CoW system. */ struct RemapCallbackUserData { /* Dependency graph for which remapping is happening. */ @@ -503,7 +503,7 @@ int foreach_libblock_remap_callback(LibraryIDLinkCallbackData *cb_data) RemapCallbackUserData *user_data = (RemapCallbackUserData *)cb_data->user_data; const Depsgraph *depsgraph = user_data->depsgraph; ID *id_orig = *id_p; - if (deg_eval_copy_is_needed(id_orig)) { + if (deg_copy_on_write_is_needed(id_orig)) { ID *id_cow = depsgraph->get_cow_id(id_orig); BLI_assert(id_cow != nullptr); DEG_COW_PRINT( @@ -689,9 +689,9 @@ void update_animation_data_after_copy(const ID *id_orig, ID *id_cow) } /* Do some special treatment of data transfer from original ID to its - * evaluated complementary part. + * CoW complementary part. * - * Only use for the newly created evaluated data-blocks. */ + * Only use for the newly created CoW data-blocks. */ void update_id_after_copy(const Depsgraph *depsgraph, const IDNode *id_node, const ID *id_orig, @@ -762,10 +762,10 @@ int foreach_libblock_validate_callback(LibraryIDLinkCallbackData *cb_data) } /* Actual implementation of logic which "expands" all the data which was not - * yet copied-on-eval. + * yet copied-on-write. * - * NOTE: Expects that evaluated datablock is empty. */ -ID *deg_expand_eval_copy_datablock(const Depsgraph *depsgraph, const IDNode *id_node) + * NOTE: Expects that CoW datablock is empty. */ +ID *deg_expand_copy_on_write_datablock(const Depsgraph *depsgraph, const IDNode *id_node) { const ID *id_orig = id_node->id_orig; ID *id_cow = id_node->id_cow; @@ -773,7 +773,7 @@ ID *deg_expand_eval_copy_datablock(const Depsgraph *depsgraph, const IDNode *id_ /* No need to expand such datablocks, their copied ID is same as original * one already. */ - if (!deg_eval_copy_is_needed(id_orig)) { + if (!deg_copy_on_write_is_needed(id_orig)) { return id_cow; } @@ -821,7 +821,7 @@ ID *deg_expand_eval_copy_datablock(const Depsgraph *depsgraph, const IDNode *id_ done = id_copy_inplace_no_main(id_orig, id_cow); } if (!done) { - BLI_assert_msg(0, "No idea how to perform evaluated copy on datablock"); + BLI_assert_msg(0, "No idea how to perform CoW on datablock"); } /* Update pointers to nested ID datablocks. */ DEG_COW_PRINT( @@ -832,7 +832,7 @@ ID *deg_expand_eval_copy_datablock(const Depsgraph *depsgraph, const IDNode *id_ #endif /* Do it now, so remapping will understand that possibly remapped self ID * is not to be remapped again. */ - deg_tag_eval_copy_id(id_cow, id_orig); + deg_tag_copy_on_write_id(id_cow, id_orig); /* Perform remapping of the nodes. */ RemapCallbackUserData user_data = {nullptr}; user_data.depsgraph = depsgraph; @@ -850,17 +850,17 @@ ID *deg_expand_eval_copy_datablock(const Depsgraph *depsgraph, const IDNode *id_ } // namespace -ID *deg_update_eval_copy_datablock(const Depsgraph *depsgraph, const IDNode *id_node) +ID *deg_update_copy_on_write_datablock(const Depsgraph *depsgraph, const IDNode *id_node) { const ID *id_orig = id_node->id_orig; ID *id_cow = id_node->id_cow; /* Similar to expansion, no need to do anything here. */ - if (!deg_eval_copy_is_needed(id_orig)) { + if (!deg_copy_on_write_is_needed(id_orig)) { return id_cow; } - /* When updating object data in edit-mode, don't request copy-on-eval update since this will - * duplicate all object data which is unnecessary when the edit-mode data is used for calculating + /* When updating object data in edit-mode, don't request COW update since this will duplicate + * all object data which is unnecessary when the edit-mode data is used for calculating * modifiers. * * TODO: Investigate modes besides edit-mode. */ @@ -881,7 +881,7 @@ ID *deg_update_eval_copy_datablock(const Depsgraph *depsgraph, const IDNode *id_ update_edit_mode_pointers(depsgraph, id_orig, id_cow); return id_cow; } - /* In case we don't need to do a copy-on-evaluation, we can use the update cache of the grease + /* In case we don't need to do a copy-on-write, we can use the update cache of the grease * pencil data to do an update-on-write. */ if (id_type == ID_GD_LEGACY && BKE_gpencil_can_avoid_full_copy_on_write( (const ::Depsgraph *)depsgraph, (bGPdata *)id_orig)) @@ -893,8 +893,8 @@ ID *deg_update_eval_copy_datablock(const Depsgraph *depsgraph, const IDNode *id_ RuntimeBackup backup(depsgraph); backup.init_from_id(id_cow); - deg_free_eval_copy_datablock(id_cow); - deg_expand_eval_copy_datablock(depsgraph, id_node); + deg_free_copy_on_write_datablock(id_cow); + deg_expand_copy_on_write_datablock(depsgraph, id_node); backup.restore_to_id(id_cow); return id_cow; } @@ -902,11 +902,11 @@ ID *deg_update_eval_copy_datablock(const Depsgraph *depsgraph, const IDNode *id_ /** * \note Depsgraph is supposed to have ID node already. */ -ID *deg_update_eval_copy_datablock(const Depsgraph *depsgraph, ID *id_orig) +ID *deg_update_copy_on_write_datablock(const Depsgraph *depsgraph, ID *id_orig) { IDNode *id_node = depsgraph->find_id_node(id_orig); BLI_assert(id_node != nullptr); - return deg_update_eval_copy_datablock(depsgraph, id_node); + return deg_update_copy_on_write_datablock(depsgraph, id_node); } namespace { @@ -983,15 +983,15 @@ void discard_edit_mode_pointers(ID *id_cow) } // namespace /** - * Free content of the evaluated data-block. + * Free content of the CoW data-block. * Notes: * - Does not recurse into nested ID data-blocks. * - Does not free data-block itself. */ -void deg_free_eval_copy_datablock(ID *id_cow) +void deg_free_copy_on_write_datablock(ID *id_cow) { if (!check_datablock_expanded(id_cow)) { - /* Actual content was never copied on top of evaluated data-block, we have + /* Actual content was never copied on top of CoW block, we have * nothing to free. */ return; } @@ -1020,7 +1020,7 @@ void deg_free_eval_copy_datablock(ID *id_cow) id_cow->name[0] = '\0'; } -void deg_create_eval_copy(::Depsgraph *graph, const IDNode *id_node) +void deg_evaluate_copy_on_write(::Depsgraph *graph, const IDNode *id_node) { const Depsgraph *depsgraph = reinterpret_cast(graph); DEG_debug_print_eval(graph, __func__, id_node->id_orig->name, id_node->id_cow); @@ -1029,10 +1029,10 @@ void deg_create_eval_copy(::Depsgraph *graph, const IDNode *id_node) * ensures scene and view layer pointers are valid. */ return; } - deg_update_eval_copy_datablock(depsgraph, id_node); + deg_update_copy_on_write_datablock(depsgraph, id_node); } -bool deg_validate_eval_copy_datablock(ID *id_cow) +bool deg_validate_copy_on_write_datablock(ID *id_cow) { if (id_cow == nullptr) { return false; @@ -1044,30 +1044,30 @@ bool deg_validate_eval_copy_datablock(ID *id_cow) return data.is_valid; } -void deg_tag_eval_copy_id(ID *id_cow, const ID *id_orig) +void deg_tag_copy_on_write_id(ID *id_cow, const ID *id_orig) { BLI_assert(id_cow != id_orig); - BLI_assert((id_orig->tag & LIB_TAG_COPIED_ON_EVAL) == 0); - id_cow->tag |= LIB_TAG_COPIED_ON_EVAL; + BLI_assert((id_orig->tag & LIB_TAG_COPIED_ON_WRITE) == 0); + id_cow->tag |= LIB_TAG_COPIED_ON_WRITE; /* This ID is no longer localized, is a self-sustaining copy now. */ id_cow->tag &= ~LIB_TAG_LOCALIZED; id_cow->orig_id = (ID *)id_orig; } -bool deg_eval_copy_is_expanded(const ID *id_cow) +bool deg_copy_on_write_is_expanded(const ID *id_cow) { return check_datablock_expanded(id_cow); } -bool deg_eval_copy_is_needed(const ID *id_orig) +bool deg_copy_on_write_is_needed(const ID *id_orig) { const ID_Type id_type = GS(id_orig->name); - return deg_eval_copy_is_needed(id_type); + return deg_copy_on_write_is_needed(id_type); } -bool deg_eval_copy_is_needed(const ID_Type id_type) +bool deg_copy_on_write_is_needed(const ID_Type id_type) { - return ID_TYPE_USE_COPY_ON_EVAL(id_type); + return ID_TYPE_IS_COW(id_type); } } // namespace blender::deg diff --git a/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.h b/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.h index 3a060f1cdb1..9518e4b855b 100644 --- a/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.h +++ b/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.h @@ -14,7 +14,7 @@ struct ID; -/* Uncomment this to have verbose log about original and evaluated pointers +/* Uncomment this to have verbose log about original and CoW pointers * logged, with detailed information when they are allocated, expanded * and remapped. */ @@ -35,46 +35,46 @@ class DepsgraphNodeBuilder; struct IDNode; /** - * Makes sure given evaluated data-block is brought back to state of the original + * Makes sure given CoW data-block is brought back to state of the original * data-block. */ -ID *deg_update_eval_copy_datablock(const struct Depsgraph *depsgraph, const IDNode *id_node); -ID *deg_update_eval_copy_datablock(const struct Depsgraph *depsgraph, struct ID *id_orig); +ID *deg_update_copy_on_write_datablock(const struct Depsgraph *depsgraph, const IDNode *id_node); +ID *deg_update_copy_on_write_datablock(const struct Depsgraph *depsgraph, struct ID *id_orig); /** Helper function which frees memory used by copy-on-written data-block. */ -void deg_free_eval_copy_datablock(struct ID *id_cow); +void deg_free_copy_on_write_datablock(struct ID *id_cow); /** - * Callback function for depsgraph operation node which ensures evaluated + * Callback function for depsgraph operation node which ensures copy-on-write * data-block is ready for use by further evaluation routines. */ -void deg_create_eval_copy(struct ::Depsgraph *depsgraph, const struct IDNode *id_node); +void deg_evaluate_copy_on_write(struct ::Depsgraph *depsgraph, const struct IDNode *id_node); /** * Check that given ID is properly expanded and does not have any shallow * copies inside. */ -bool deg_validate_eval_copy_datablock(ID *id_cow); +bool deg_validate_copy_on_write_datablock(ID *id_cow); /** Tag given ID block as being copy-on-written. */ -void deg_tag_eval_copy_id(struct ID *id_cow, const struct ID *id_orig); +void deg_tag_copy_on_write_id(struct ID *id_cow, const struct ID *id_orig); /** * Check whether ID data-block is expanded. * * TODO(sergey): Make it an inline function or a macro. */ -bool deg_eval_copy_is_expanded(const struct ID *id_cow); +bool deg_copy_on_write_is_expanded(const struct ID *id_cow); /** - * Check whether an evaluated data-block copy is needed for given ID. + * Check whether copy-on-write data-block is needed for given ID. * * There are some exceptions on data-blocks which are covered by dependency graph * but which we don't want to start duplicating. * * This includes images. */ -bool deg_eval_copy_is_needed(const ID *id_orig); -bool deg_eval_copy_is_needed(const ID_Type id_type); +bool deg_copy_on_write_is_needed(const ID *id_orig); +bool deg_copy_on_write_is_needed(const ID_Type id_type); } // namespace blender::deg diff --git a/source/blender/depsgraph/intern/eval/deg_eval_flush.cc b/source/blender/depsgraph/intern/eval/deg_eval_flush.cc index 22a8585bdbe..3f9960b82da 100644 --- a/source/blender/depsgraph/intern/eval/deg_eval_flush.cc +++ b/source/blender/depsgraph/intern/eval/deg_eval_flush.cc @@ -19,7 +19,7 @@ #include "BKE_key.hh" #include "BKE_object.hh" -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "DNA_key_types.h" #include "DNA_object_types.h" @@ -243,9 +243,9 @@ void flush_editors_id_update(Depsgraph *graph, const DEGEditorUpdateContext *upd * time, to distinguish between user edits and initial evaluation when * the data-block becomes visible. * - * TODO: image data-blocks do not use copy-on-eval, so might not be detected + * TODO: image data-blocks do not use COW, so might not be detected * correctly. */ - if (deg_eval_copy_is_expanded(id_cow)) { + if (deg_copy_on_write_is_expanded(id_cow)) { if (graph->is_active && id_node->is_user_modified) { deg_editors_id_update(update_ctx, id_orig); } @@ -262,7 +262,7 @@ void invalidate_tagged_evaluated_transform(ID *id) switch (id_type) { case ID_OB: { Object *object = (Object *)id; - copy_vn_fl((float *)object->object_to_world().ptr(), 16, NAN); + copy_vn_fl((float *)object->object_to_world, 16, NAN); break; } default: @@ -293,7 +293,7 @@ void invalidate_tagged_evaluated_data(Depsgraph *graph) continue; } ID *id_cow = id_node->id_cow; - if (!deg_eval_copy_is_expanded(id_cow)) { + if (!deg_copy_on_write_is_expanded(id_cow)) { continue; } for (ComponentNode *comp_node : id_node->components.values()) { diff --git a/source/blender/depsgraph/intern/eval/deg_eval_runtime_backup.cc b/source/blender/depsgraph/intern/eval/deg_eval_runtime_backup.cc index e7fe01f650b..d7dd686597a 100644 --- a/source/blender/depsgraph/intern/eval/deg_eval_runtime_backup.cc +++ b/source/blender/depsgraph/intern/eval/deg_eval_runtime_backup.cc @@ -33,7 +33,7 @@ RuntimeBackup::RuntimeBackup(const Depsgraph *depsgraph) void RuntimeBackup::init_from_id(ID *id) { - if (!deg_eval_copy_is_expanded(id)) { + if (!deg_copy_on_write_is_expanded(id)) { return; } have_backup = true; diff --git a/source/blender/depsgraph/intern/eval/deg_eval_runtime_backup.h b/source/blender/depsgraph/intern/eval/deg_eval_runtime_backup.h index 364787a6a05..dc6b11ece97 100644 --- a/source/blender/depsgraph/intern/eval/deg_eval_runtime_backup.h +++ b/source/blender/depsgraph/intern/eval/deg_eval_runtime_backup.h @@ -34,13 +34,13 @@ class RuntimeBackup { /* Denotes whether init_from_id did put anything into the backup storage. * This will not be the case when init_from_id() is called for an ID which has never been - * copied-on-eval. In this case there is no need to backup or restore anything. + * copied-on-write. In this case there is no need to backup or restore anything. * * It also allows to have restore() logic to be symmetrical to init() without need to worry * that init() might not have happened. * * In practice this is used by audio system to lock audio while scene is going through - * copy-on-evaluation mechanism. */ + * copy-on-write mechanism. */ bool have_backup; /* Struct members of the ID pointer. */ diff --git a/source/blender/depsgraph/intern/eval/deg_eval_runtime_backup_animation.cc b/source/blender/depsgraph/intern/eval/deg_eval_runtime_backup_animation.cc index f8ed612e7c9..9fc0b9ff55e 100644 --- a/source/blender/depsgraph/intern/eval/deg_eval_runtime_backup_animation.cc +++ b/source/blender/depsgraph/intern/eval/deg_eval_runtime_backup_animation.cc @@ -100,7 +100,7 @@ void AnimationBackup::restore_to_id(ID *id) /* Resolve path to the property. * * NOTE: Do it again (after storing), since the sub-data pointers might be - * changed after copy-on-evaluation. */ + * changed after copy-on-write. */ PathResolvedRNA resolved_rna; if (!BKE_animsys_rna_path_resolve(&id_pointer_rna, value_backup.rna_path.c_str(), diff --git a/source/blender/depsgraph/intern/eval/deg_eval_runtime_backup_gpencil.cc b/source/blender/depsgraph/intern/eval/deg_eval_runtime_backup_gpencil.cc index a06179a884a..d24bd9630bb 100644 --- a/source/blender/depsgraph/intern/eval/deg_eval_runtime_backup_gpencil.cc +++ b/source/blender/depsgraph/intern/eval/deg_eval_runtime_backup_gpencil.cc @@ -30,7 +30,7 @@ void GPencilBackup::restore_to_gpencil(bGPdata *gpd) if (depsgraph->is_active) { BKE_gpencil_free_update_cache(gpd_orig); } - /* Doing a copy-on-evaluation copies the update cache pointer. Make sure to reset it + /* Doing a copy-on-write copies the update cache pointer. Make sure to reset it * to null as we should never use the update cache from eval data. */ gpd->runtime.update_cache = nullptr; /* Make sure to update the original runtime pointers in the eval data. */ diff --git a/source/blender/depsgraph/intern/node/deg_node.cc b/source/blender/depsgraph/intern/node/deg_node.cc index 4e591ee2550..2a7b851a053 100644 --- a/source/blender/depsgraph/intern/node/deg_node.cc +++ b/source/blender/depsgraph/intern/node/deg_node.cc @@ -62,8 +62,8 @@ const char *nodeTypeAsString(NodeType type) return "SEQUENCER"; case NodeType::LAYER_COLLECTIONS: return "LAYER_COLLECTIONS"; - case NodeType::COPY_ON_EVAL: - return "COPY_ON_EVAL"; + case NodeType::COPY_ON_WRITE: + return "COPY_ON_WRITE"; case NodeType::OBJECT_FROM_LAYER: return "OBJECT_FROM_LAYER"; case NodeType::HIERARCHY: @@ -141,7 +141,7 @@ eDepsSceneComponentType nodeTypeToSceneComponent(NodeType type) case NodeType::TIMESOURCE: case NodeType::ID_REF: case NodeType::LAYER_COLLECTIONS: - case NodeType::COPY_ON_EVAL: + case NodeType::COPY_ON_WRITE: case NodeType::OBJECT_FROM_LAYER: case NodeType::HIERARCHY: case NodeType::AUDIO: @@ -225,7 +225,7 @@ eDepsObjectComponentType nodeTypeToObjectComponent(NodeType type) case NodeType::ID_REF: case NodeType::SEQUENCER: case NodeType::LAYER_COLLECTIONS: - case NodeType::COPY_ON_EVAL: + case NodeType::COPY_ON_WRITE: case NodeType::OBJECT_FROM_LAYER: case NodeType::HIERARCHY: case NodeType::AUDIO: diff --git a/source/blender/depsgraph/intern/node/deg_node.hh b/source/blender/depsgraph/intern/node/deg_node.hh index 8359b4a3195..7fb94478983 100644 --- a/source/blender/depsgraph/intern/node/deg_node.hh +++ b/source/blender/depsgraph/intern/node/deg_node.hh @@ -72,9 +72,9 @@ enum class NodeType { /* Component which contains all operations needed for layer collections * evaluation. */ LAYER_COLLECTIONS, - /* Entry component of majority of ID nodes: prepares evaluated pointers for + /* Entry component of majority of ID nodes: prepares CoW pointers for * execution. */ - COPY_ON_EVAL, + COPY_ON_WRITE, /* Used by all operations which are updating object when something is * changed in view layer. */ OBJECT_FROM_LAYER, diff --git a/source/blender/depsgraph/intern/node/deg_node_component.cc b/source/blender/depsgraph/intern/node/deg_node_component.cc index 28ce4f972a0..f05d056d143 100644 --- a/source/blender/depsgraph/intern/node/deg_node_component.cc +++ b/source/blender/depsgraph/intern/node/deg_node_component.cc @@ -319,7 +319,7 @@ DEG_COMPONENT_NODE_DEFINE(Animation, ANIMATION, ID_RECALC_ANIMATION); DEG_COMPONENT_NODE_DEFINE(BatchCache, BATCH_CACHE, ID_RECALC_SHADING); DEG_COMPONENT_NODE_DEFINE(Bone, BONE, ID_RECALC_GEOMETRY); DEG_COMPONENT_NODE_DEFINE(Cache, CACHE, 0); -DEG_COMPONENT_NODE_DEFINE(CopyOnWrite, COPY_ON_EVAL, ID_RECALC_SYNC_TO_EVAL); +DEG_COMPONENT_NODE_DEFINE(CopyOnWrite, COPY_ON_WRITE, ID_RECALC_COPY_ON_WRITE); DEG_COMPONENT_NODE_DEFINE(ImageAnimation, IMAGE_ANIMATION, 0); DEG_COMPONENT_NODE_DEFINE(Geometry, GEOMETRY, ID_RECALC_GEOMETRY); DEG_COMPONENT_NODE_DEFINE(LayerCollections, LAYER_COLLECTIONS, 0); @@ -355,7 +355,7 @@ void deg_register_component_depsnodes() register_node_typeinfo(&DNTI_BONE); register_node_typeinfo(&DNTI_CACHE); register_node_typeinfo(&DNTI_BATCH_CACHE); - register_node_typeinfo(&DNTI_COPY_ON_EVAL); + register_node_typeinfo(&DNTI_COPY_ON_WRITE); register_node_typeinfo(&DNTI_GEOMETRY); register_node_typeinfo(&DNTI_LAYER_COLLECTIONS); register_node_typeinfo(&DNTI_PARAMETERS); diff --git a/source/blender/depsgraph/intern/node/deg_node_component.hh b/source/blender/depsgraph/intern/node/deg_node_component.hh index c22690f5e16..fce921f4477 100644 --- a/source/blender/depsgraph/intern/node/deg_node_component.hh +++ b/source/blender/depsgraph/intern/node/deg_node_component.hh @@ -130,7 +130,7 @@ struct ComponentNode : public Node { return true; } - /* Denotes whether copy-on-eval component is to be tagged when this component + /* Denotes whether COW component is to be tagged when this component * is tagged for update. */ virtual bool need_tag_cow_before_update() { @@ -230,7 +230,7 @@ struct ParametersComponentNode : public ComponentNode { { if (ID_TYPE_SUPPORTS_PARAMS_WITHOUT_COW(owner->id_type)) { /* Disabled as this is not true for newly added objects, needs investigation. */ - // BLI_assert(deg_eval_copy_is_expanded(owner->id_cow)); + // BLI_assert(deg_copy_on_write_is_expanded(owner->id_cow)); return false; } return true; diff --git a/source/blender/depsgraph/intern/node/deg_node_id.cc b/source/blender/depsgraph/intern/node/deg_node_id.cc index b497f2e6037..3079a2290cd 100644 --- a/source/blender/depsgraph/intern/node/deg_node_id.cc +++ b/source/blender/depsgraph/intern/node/deg_node_id.cc @@ -85,19 +85,19 @@ void IDNode::init_copy_on_write(ID *id_cow_hint) * bindings. Rest of data we'll be copying to the new datablock when * it is actually needed. */ if (id_cow_hint != nullptr) { - // BLI_assert(deg_eval_copy_is_needed(id_orig)); - if (deg_eval_copy_is_needed(id_orig)) { + // BLI_assert(deg_copy_on_write_is_needed(id_orig)); + if (deg_copy_on_write_is_needed(id_orig)) { id_cow = id_cow_hint; } else { id_cow = id_orig; } } - else if (deg_eval_copy_is_needed(id_orig)) { + else if (deg_copy_on_write_is_needed(id_orig)) { id_cow = (ID *)BKE_libblock_alloc_notest(GS(id_orig->name)); DEG_COW_PRINT( "Create shallow copy for %s: id_orig=%p id_cow=%p\n", id_orig->name, id_orig, id_cow); - deg_tag_eval_copy_id(id_cow, id_orig); + deg_tag_copy_on_write_id(id_cow, id_orig); } else { id_cow = id_orig; @@ -120,13 +120,12 @@ void IDNode::destroy() delete comp_node; } - /* Free memory used by this evaluated ID. */ + /* Free memory used by this CoW ID. */ if (!ELEM(id_cow, id_orig, nullptr)) { - deg_free_eval_copy_datablock(id_cow); + deg_free_copy_on_write_datablock(id_cow); MEM_freeN(id_cow); id_cow = nullptr; - DEG_COW_PRINT( - "Destroy evaluated ID for %s: id_orig=%p id_cow=%p\n", id_orig->name, id_orig, id_cow); + DEG_COW_PRINT("Destroy CoW for %s: id_orig=%p id_cow=%p\n", id_orig->name, id_orig, id_cow); } /* Tag that the node is freed. */ diff --git a/source/blender/depsgraph/intern/node/deg_node_id.hh b/source/blender/depsgraph/intern/node/deg_node_id.hh index b2740c7275a..1aef3afa9e1 100644 --- a/source/blender/depsgraph/intern/node/deg_node_id.hh +++ b/source/blender/depsgraph/intern/node/deg_node_id.hh @@ -59,9 +59,9 @@ struct IDNode : public Node { IDComponentsMask get_visible_components_mask() const; - /* Type of the ID stored separately, so it's possible to perform check whether evaluated copy is - * needed without de-referencing the id_cow (which is not safe when ID is NOT covered by - * copy-on-evaluation and has been deleted from the main database.) */ + /* Type of the ID stored separately, so it's possible to perform check whether CoW is needed + * without de-referencing the id_cow (which is not safe when ID is NOT covered by CoW and has + * been deleted from the main database.) */ ID_Type id_type; /* ID Block referenced. */ @@ -74,7 +74,7 @@ struct IDNode : public Node { uint id_orig_session_uid; /* Evaluated data-block. - * Will be covered by the copy-on-evaluation system if the ID Type needs it. */ + * Will be covered by the copy-on-write system if the ID Type needs it. */ ID *id_cow; /* Hash to make it faster to look up components. */ diff --git a/source/blender/depsgraph/intern/node/deg_node_operation.cc b/source/blender/depsgraph/intern/node/deg_node_operation.cc index 2b2008263a4..afbc20af6e4 100644 --- a/source/blender/depsgraph/intern/node/deg_node_operation.cc +++ b/source/blender/depsgraph/intern/node/deg_node_operation.cc @@ -162,9 +162,9 @@ const char *operationCodeAsString(OperationCode opcode) /* Collections. */ case OperationCode::VIEW_LAYER_EVAL: return "VIEW_LAYER_EVAL"; - /* Copy on eval. */ - case OperationCode::COPY_ON_EVAL: - return "COPY_ON_EVAL"; + /* Copy on write. */ + case OperationCode::COPY_ON_WRITE: + return "COPY_ON_WRITE"; /* Shading. */ case OperationCode::SHADING: return "SHADING"; diff --git a/source/blender/depsgraph/intern/node/deg_node_operation.hh b/source/blender/depsgraph/intern/node/deg_node_operation.hh index 7677497b8b4..1f05559b01f 100644 --- a/source/blender/depsgraph/intern/node/deg_node_operation.hh +++ b/source/blender/depsgraph/intern/node/deg_node_operation.hh @@ -159,7 +159,7 @@ enum class OperationCode { VIEW_LAYER_EVAL, /* Copy on Write. ------------------------------------------------------- */ - COPY_ON_EVAL, + COPY_ON_WRITE, /* Shading. ------------------------------------------------------------- */ SHADING, diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt index 5da847a09d1..9bc077432bf 100644 --- a/source/blender/draw/CMakeLists.txt +++ b/source/blender/draw/CMakeLists.txt @@ -57,13 +57,12 @@ set(SRC intern/mesh_extractors/extract_mesh_vbo_lnor.cc intern/mesh_extractors/extract_mesh_vbo_mesh_analysis.cc intern/mesh_extractors/extract_mesh_vbo_orco.cc - intern/mesh_extractors/extract_mesh_vbo_pos.cc + intern/mesh_extractors/extract_mesh_vbo_pos_nor.cc intern/mesh_extractors/extract_mesh_vbo_sculpt_data.cc intern/mesh_extractors/extract_mesh_vbo_select_idx.cc intern/mesh_extractors/extract_mesh_vbo_skin_roots.cc intern/mesh_extractors/extract_mesh_vbo_tan.cc intern/mesh_extractors/extract_mesh_vbo_uv.cc - intern/mesh_extractors/extract_mesh_vbo_vnor.cc intern/mesh_extractors/extract_mesh_vbo_weights.cc intern/draw_attributes.cc intern/draw_cache_impl_curve.cc @@ -182,8 +181,10 @@ set(SRC engines/gpencil/gpencil_antialiasing.cc engines/gpencil/gpencil_cache_utils.cc engines/gpencil/gpencil_draw_data.cc + engines/gpencil/gpencil_engine.cc engines/gpencil/gpencil_engine_c.cc engines/gpencil/gpencil_render.cc + engines/gpencil/gpencil_shader.cc engines/gpencil/gpencil_shader_c.cc engines/gpencil/gpencil_shader_fx.cc engines/select/select_draw_utils.cc @@ -304,7 +305,14 @@ set(SRC engines/eevee_next/eevee_volume.hh engines/eevee_next/eevee_world.hh engines/external/external_engine.h + engines/gpencil/gpencil_antialiasing.hh engines/gpencil/gpencil_engine.h + engines/gpencil/gpencil_layer.hh + engines/gpencil/gpencil_light.hh + engines/gpencil/gpencil_material.hh + engines/gpencil/gpencil_object.hh + engines/gpencil/gpencil_shader.hh + engines/gpencil/gpencil_vfx.hh engines/image/image_batches.hh engines/image/image_buffer_cache.hh engines/image/image_drawing_mode.hh @@ -556,10 +564,8 @@ set(GLSL_SRC engines/eevee_next/shaders/eevee_ray_trace_screen_comp.glsl engines/eevee_next/shaders/eevee_ray_trace_screen_lib.glsl engines/eevee_next/shaders/eevee_ray_types_lib.glsl - engines/eevee_next/shaders/eevee_reflection_probe_convolve_comp.glsl engines/eevee_next/shaders/eevee_reflection_probe_eval_lib.glsl engines/eevee_next/shaders/eevee_reflection_probe_lib.glsl - engines/eevee_next/shaders/eevee_reflection_probe_mapping_lib.glsl engines/eevee_next/shaders/eevee_reflection_probe_remap_comp.glsl engines/eevee_next/shaders/eevee_reflection_probe_select_comp.glsl engines/eevee_next/shaders/eevee_reflection_probe_update_irradiance_comp.glsl @@ -708,7 +714,9 @@ set(GLSL_SRC intern/draw_shader_shared.h engines/gpencil/shaders/gpencil_frag.glsl + engines/gpencil/shaders/grease_pencil_frag.glsl engines/gpencil/shaders/gpencil_vert.glsl + engines/gpencil/shaders/grease_pencil_vert.glsl engines/gpencil/shaders/gpencil_antialiasing_frag.glsl engines/gpencil/shaders/gpencil_antialiasing_vert.glsl engines/gpencil/shaders/gpencil_common_lib.glsl @@ -716,6 +724,7 @@ set(GLSL_SRC engines/gpencil/shaders/gpencil_mask_invert_frag.glsl engines/gpencil/shaders/gpencil_depth_merge_frag.glsl engines/gpencil/shaders/gpencil_depth_merge_vert.glsl + engines/gpencil/shaders/grease_pencil_depth_merge_vert.glsl engines/gpencil/shaders/gpencil_vfx_frag.glsl engines/gpencil/gpencil_defines.h diff --git a/source/blender/draw/DRW_engine.hh b/source/blender/draw/DRW_engine.hh index 0710e4f23da..ef6316cf627 100644 --- a/source/blender/draw/DRW_engine.hh +++ b/source/blender/draw/DRW_engine.hh @@ -57,12 +57,12 @@ struct DRWUpdateContext { }; void DRW_notify_view_update(const DRWUpdateContext *update_ctx); -enum eDRWSelectStage { +typedef enum eDRWSelectStage { DRW_SELECT_PASS_PRE = 1, DRW_SELECT_PASS_POST, -}; -using DRW_SelectPassFn = bool (*)(eDRWSelectStage stage, void *user_data); -using DRW_ObjectFilterFn = bool (*)(Object *ob, void *user_data); +} eDRWSelectStage; +typedef bool (*DRW_SelectPassFn)(eDRWSelectStage stage, void *user_data); +typedef bool (*DRW_ObjectFilterFn)(Object *ob, void *user_data); /** * Everything starts here. diff --git a/source/blender/draw/DRW_select_buffer.hh b/source/blender/draw/DRW_select_buffer.hh index f865d963c3a..c886f9a8e92 100644 --- a/source/blender/draw/DRW_select_buffer.hh +++ b/source/blender/draw/DRW_select_buffer.hh @@ -11,7 +11,6 @@ #include "DNA_ID.h" #include "BLI_array.hh" -#include "BLI_math_vector_types.hh" #include "BLI_sys_types.h" /* for bool and uint */ struct ARegion; @@ -104,7 +103,8 @@ uint *DRW_select_buffer_bitmap_from_circle(Depsgraph *depsgraph, uint *DRW_select_buffer_bitmap_from_poly(Depsgraph *depsgraph, ARegion *region, View3D *v3d, - blender::Span poly, + const int poly[][2], + int face_len, const rcti *rect, uint *r_bitmap_len); /** diff --git a/source/blender/draw/engines/basic/basic_engine.cc b/source/blender/draw/engines/basic/basic_engine.cc index 07c77f9c5ea..0fbf8c3bc9c 100644 --- a/source/blender/draw/engines/basic/basic_engine.cc +++ b/source/blender/draw/engines/basic/basic_engine.cc @@ -11,7 +11,7 @@ #include "DRW_render.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_object.hh" #include "BKE_object_types.hh" #include "BKE_paint.hh" @@ -233,7 +233,7 @@ static void basic_cache_populate(void *vedata, Object *ob) if (G.debug_value == 889 && ob->sculpt && BKE_object_sculpt_pbvh_get(ob)) { int debug_node_nr = 0; - DRW_debug_modelmat(ob->object_to_world().ptr()); + DRW_debug_modelmat(ob->object_to_world); BKE_pbvh_draw_debug_cb(BKE_object_sculpt_pbvh_get(ob), DRW_sculpt_debug_cb, &debug_node_nr); } } diff --git a/source/blender/draw/engines/compositor/compositor_engine.cc b/source/blender/draw/engines/compositor/compositor_engine.cc index ffa5e0584a5..afb1cbca255 100644 --- a/source/blender/draw/engines/compositor/compositor_engine.cc +++ b/source/blender/draw/engines/compositor/compositor_engine.cc @@ -8,7 +8,7 @@ #include "BLI_string_ref.hh" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_ID.h" #include "DNA_ID_enums.h" @@ -91,14 +91,42 @@ class Context : public realtime_compositor::Context { return int2(float2(DRW_viewport_size_get())); } - /* We limit the compositing region to the camera region if in camera view, while we use the - * entire viewport otherwise. */ + /* Returns true if the viewport is in camera view and has an opaque passepartout, that is, the + * area outside of the camera border is not visible. */ + bool is_opaque_camera_view() const + { + /* Check if the viewport is in camera view. */ + if (DRW_context_state_get()->rv3d->persp != RV3D_CAMOB) { + return false; + } + + /* Check if the camera object that is currently in view is an actual camera. It is possible for + * a non camera object to be used as a camera, in which case, there will be no passepartout or + * any other camera setting, so those pseudo cameras can be ignored. */ + Object *camera_object = DRW_context_state_get()->v3d->camera; + if (camera_object->type != OB_CAMERA) { + return false; + } + + /* Check if the camera has passepartout active and is totally opaque. */ + Camera *cam = static_cast(camera_object->data); + if (!(cam->flag & CAM_SHOWPASSEPARTOUT) || cam->passepartalpha != 1.0f) { + return false; + } + + return true; + } + rcti get_compositing_region() const override { const int2 viewport_size = int2(float2(DRW_viewport_size_get())); const rcti render_region = rcti{0, viewport_size.x, 0, viewport_size.y}; - if (DRW_context_state_get()->rv3d->persp != RV3D_CAMOB) { + /* If the camera view is not opaque, that means the content outside of the camera region is + * visible to some extent, so it would make sense to include them in the compositing region. + * Otherwise, we limit the compositing region to the visible camera region because anything + * outside of the camera region will not be visible anyways. */ + if (!is_opaque_camera_view()) { return render_region; } diff --git a/source/blender/draw/engines/eevee/eevee_data.cc b/source/blender/draw/engines/eevee/eevee_data.cc index 3c31bbfbdeb..14f4eb47cd3 100644 --- a/source/blender/draw/engines/eevee/eevee_data.cc +++ b/source/blender/draw/engines/eevee/eevee_data.cc @@ -13,7 +13,7 @@ #include "BLI_ghash.h" #include "BLI_memblock.h" -#include "BKE_duplilist.hh" +#include "BKE_duplilist.h" #include "BKE_modifier.hh" #include "BKE_object.hh" diff --git a/source/blender/draw/engines/eevee/eevee_depth_of_field.cc b/source/blender/draw/engines/eevee/eevee_depth_of_field.cc index fe728d8a701..e9cfcf77817 100644 --- a/source/blender/draw/engines/eevee/eevee_depth_of_field.cc +++ b/source/blender/draw/engines/eevee/eevee_depth_of_field.cc @@ -188,7 +188,7 @@ int EEVEE_depth_of_field_init(EEVEE_ViewLayerData * /*sldata*/, EEVEE_Data *veda const DRWContextState *draw_ctx = DRW_context_state_get(); const Scene *scene_eval = DEG_get_evaluated_scene(draw_ctx->depsgraph); - const Camera *cam = static_cast( + Camera *cam = static_cast( (camera != nullptr && camera->type == OB_CAMERA) ? camera->data : nullptr); if (cam && (cam->dof.flag & CAM_DOF_ENABLED)) { diff --git a/source/blender/draw/engines/eevee/eevee_effects.cc b/source/blender/draw/engines/eevee/eevee_effects.cc index edfea89a4b4..3cd4ca94d23 100644 --- a/source/blender/draw/engines/eevee/eevee_effects.cc +++ b/source/blender/draw/engines/eevee/eevee_effects.cc @@ -10,7 +10,7 @@ #include "DRW_render.hh" -#include "BKE_global.hh" /* for G.debug_value */ +#include "BKE_global.h" /* for G.debug_value */ #include "GPU_capabilities.h" #include "GPU_platform.h" diff --git a/source/blender/draw/engines/eevee/eevee_engine.cc b/source/blender/draw/engines/eevee/eevee_engine.cc index f54cecb3430..b5d774fc0d6 100644 --- a/source/blender/draw/engines/eevee/eevee_engine.cc +++ b/source/blender/draw/engines/eevee/eevee_engine.cc @@ -12,7 +12,7 @@ #include "BLI_rand.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_object.hh" @@ -472,7 +472,7 @@ static void eevee_render_to_image(void *vedata, Depsgraph *depsgraph = draw_ctx->depsgraph; Scene *scene = DEG_get_evaluated_scene(depsgraph); EEVEE_ViewLayerData *sldata = EEVEE_view_layer_data_ensure(); - const bool do_motion_blur = (scene->r.mode & R_MBLUR) != 0; + const bool do_motion_blur = (scene->eevee.flag & SCE_EEVEE_MOTION_BLUR_ENABLED) != 0; const bool do_motion_blur_fx = do_motion_blur && (scene->eevee.motion_blur_max > 0); if (!EEVEE_render_init(static_cast(vedata), engine, depsgraph)) { @@ -482,7 +482,7 @@ static void eevee_render_to_image(void *vedata, int initial_frame = scene->r.cfra; float initial_subframe = scene->r.subframe; - float shuttertime = (do_motion_blur) ? scene->r.motion_blur_shutter : 0.0f; + 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_timesteps = time_steps_tot; @@ -496,14 +496,14 @@ static void eevee_render_to_image(void *vedata, /* Compute start time. The motion blur will cover `[time ...time + shuttertime]`. */ float time = initial_frame + initial_subframe; - switch (scene->r.motion_blur_position) { - case SCE_MB_START: + switch (scene->eevee.motion_blur_position) { + case SCE_EEVEE_MB_START: /* No offset. */ break; - case SCE_MB_CENTER: + case SCE_EEVEE_MB_CENTER: time -= shuttertime * 0.5f; break; - case SCE_MB_END: + case SCE_EEVEE_MB_END: time -= shuttertime; break; default: diff --git a/source/blender/draw/engines/eevee/eevee_lightcache.cc b/source/blender/draw/engines/eevee/eevee_lightcache.cc index cdb6aaa0158..02d8d20d059 100644 --- a/source/blender/draw/engines/eevee/eevee_lightcache.cc +++ b/source/blender/draw/engines/eevee/eevee_lightcache.cc @@ -10,7 +10,7 @@ #include "DRW_render.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BLI_endian_switch.h" #include "BLI_threads.h" @@ -1380,7 +1380,7 @@ void EEVEE_lightbake_update(void *custom_data) EEVEE_lightcache_info_update(&lbake->scene->eevee); - DEG_id_tag_update(&scene_orig->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&scene_orig->id, ID_RECALC_COPY_ON_WRITE); } static bool lightbake_do_sample(EEVEE_LightBake *lbake, @@ -1453,7 +1453,7 @@ void EEVEE_lightbake_job(void *custom_data, wmJobWorkerStatus *worker_status) * because this step is locking at this moment. */ /* TODO: remove this. */ if (lbake->delay) { - BLI_time_sleep_ms(lbake->delay); + BLI_sleep_ms(lbake->delay); } /* Render world irradiance and reflection first */ diff --git a/source/blender/draw/engines/eevee/eevee_lightprobes.cc b/source/blender/draw/engines/eevee/eevee_lightprobes.cc index fb8ba406868..19849acd0f0 100644 --- a/source/blender/draw/engines/eevee/eevee_lightprobes.cc +++ b/source/blender/draw/engines/eevee/eevee_lightprobes.cc @@ -18,14 +18,14 @@ #include "DNA_view3d_types.h" #include "DNA_world_types.h" -#include "BKE_collection.hh" +#include "BKE_collection.h" #include "BKE_object.hh" #include "MEM_guardedalloc.h" #include "GPU_capabilities.h" #include "GPU_material.hh" #include "GPU_texture.h" -#include "GPU_uniform_buffer.hh" +#include "GPU_uniform_buffer.h" #include "DEG_depsgraph_query.hh" @@ -424,7 +424,7 @@ static bool eevee_lightprobes_culling_test(Object *ob) const float max[3] = {1.0f, 1.0f, 1.0f}; BKE_boundbox_init_from_minmax(&bbox, min, max); - copy_m4_m4(tmp, ob->object_to_world().ptr()); + copy_m4_m4(tmp, ob->object_to_world); normalize_v3(tmp[2]); mul_v3_fl(tmp[2], probe->distinf); @@ -467,7 +467,7 @@ void EEVEE_lightprobes_cache_add(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata /* Debug Display */ DRWCallBuffer *grp = vedata->stl->g_data->planar_display_shgrp; if (grp && (probe->flag & LIGHTPROBE_FLAG_SHOW_DATA)) { - DRW_buffer_add_entry(grp, &pinfo->num_planar, ob->object_to_world().ptr()); + DRW_buffer_add_entry(grp, &pinfo->num_planar, ob->object_to_world); } pinfo->num_planar++; @@ -510,30 +510,30 @@ void EEVEE_lightprobes_grid_data_from_object(Object *ob, EEVEE_LightGrid *egrid, mul_v3_v3fl(half_cell_dim, cell_dim, 0.5f); /* Matrix converting world space to cell ranges. */ - invert_m4_m4(egrid->mat, ob->object_to_world().ptr()); + invert_m4_m4(egrid->mat, ob->object_to_world); /* First cell. */ copy_v3_fl(egrid->corner, -1.0f); add_v3_v3(egrid->corner, half_cell_dim); - mul_m4_v3(ob->object_to_world().ptr(), egrid->corner); + mul_m4_v3(ob->object_to_world, egrid->corner); /* Opposite neighbor cell. */ copy_v3_fl3(egrid->increment_x, cell_dim[0], 0.0f, 0.0f); add_v3_v3(egrid->increment_x, half_cell_dim); add_v3_fl(egrid->increment_x, -1.0f); - mul_m4_v3(ob->object_to_world().ptr(), egrid->increment_x); + mul_m4_v3(ob->object_to_world, egrid->increment_x); sub_v3_v3(egrid->increment_x, egrid->corner); copy_v3_fl3(egrid->increment_y, 0.0f, cell_dim[1], 0.0f); add_v3_v3(egrid->increment_y, half_cell_dim); add_v3_fl(egrid->increment_y, -1.0f); - mul_m4_v3(ob->object_to_world().ptr(), egrid->increment_y); + mul_m4_v3(ob->object_to_world, egrid->increment_y); sub_v3_v3(egrid->increment_y, egrid->corner); copy_v3_fl3(egrid->increment_z, 0.0f, 0.0f, cell_dim[2]); add_v3_v3(egrid->increment_z, half_cell_dim); add_v3_fl(egrid->increment_z, -1.0f); - mul_m4_v3(ob->object_to_world().ptr(), egrid->increment_z); + mul_m4_v3(ob->object_to_world, egrid->increment_z); sub_v3_v3(egrid->increment_z, egrid->corner); /* Visibility bias */ @@ -549,7 +549,7 @@ void EEVEE_lightprobes_cube_data_from_object(Object *ob, EEVEE_LightProbe *eprob LightProbe *probe = (LightProbe *)ob->data; /* Update transforms */ - copy_v3_v3(eprobe->position, ob->object_to_world().location()); + copy_v3_v3(eprobe->position, ob->object_to_world[3]); /* Attenuation */ eprobe->attenuation_type = probe->attenuation_type; @@ -557,7 +557,7 @@ void EEVEE_lightprobes_cube_data_from_object(Object *ob, EEVEE_LightProbe *eprob unit_m4(eprobe->attenuationmat); scale_m4_fl(eprobe->attenuationmat, probe->distinf); - mul_m4_m4m4(eprobe->attenuationmat, ob->object_to_world().ptr(), eprobe->attenuationmat); + mul_m4_m4m4(eprobe->attenuationmat, ob->object_to_world, eprobe->attenuationmat); invert_m4(eprobe->attenuationmat); /* Parallax */ @@ -572,7 +572,7 @@ void EEVEE_lightprobes_cube_data_from_object(Object *ob, EEVEE_LightProbe *eprob scale_m4_fl(eprobe->parallaxmat, probe->distinf); } - mul_m4_m4m4(eprobe->parallaxmat, ob->object_to_world().ptr(), eprobe->parallaxmat); + mul_m4_m4m4(eprobe->parallaxmat, ob->object_to_world, eprobe->parallaxmat); invert_m4(eprobe->parallaxmat); } @@ -588,8 +588,8 @@ void EEVEE_lightprobes_planar_data_from_object(Object *ob, vis_test->cached = false; /* Computing mtx : matrix that mirror position around object's XY plane. */ - normalize_m4_m4(normat, ob->object_to_world().ptr()); /* object > world */ - invert_m4_m4(imat, normat); /* world > object */ + normalize_m4_m4(normat, ob->object_to_world); /* object > world */ + invert_m4_m4(imat, normat); /* world > object */ /* XY reflection plane */ imat[0][2] = -imat[0][2]; imat[1][2] = -imat[1][2]; @@ -598,39 +598,38 @@ void EEVEE_lightprobes_planar_data_from_object(Object *ob, mul_m4_m4m4(eplanar->mtx, normat, imat); /* world > object > mirrored obj > world */ /* Compute clip plane equation / normal. */ - copy_v3_v3(eplanar->plane_equation, ob->object_to_world().ptr()[2]); + copy_v3_v3(eplanar->plane_equation, ob->object_to_world[2]); normalize_v3(eplanar->plane_equation); /* plane normal */ - eplanar->plane_equation[3] = -dot_v3v3(eplanar->plane_equation, - ob->object_to_world().location()); + eplanar->plane_equation[3] = -dot_v3v3(eplanar->plane_equation, ob->object_to_world[3]); eplanar->clipsta = probe->clipsta; /* Compute XY clip planes. */ - normalize_v3_v3(eplanar->clip_vec_x, ob->object_to_world().ptr()[0]); - normalize_v3_v3(eplanar->clip_vec_y, ob->object_to_world().ptr()[1]); + normalize_v3_v3(eplanar->clip_vec_x, ob->object_to_world[0]); + normalize_v3_v3(eplanar->clip_vec_y, ob->object_to_world[1]); float vec[3] = {0.0f, 0.0f, 0.0f}; vec[0] = 1.0f; vec[1] = 0.0f; vec[2] = 0.0f; - mul_m4_v3(ob->object_to_world().ptr(), vec); /* Point on the edge */ + mul_m4_v3(ob->object_to_world, vec); /* Point on the edge */ eplanar->clip_edge_x_pos = dot_v3v3(eplanar->clip_vec_x, vec); vec[0] = 0.0f; vec[1] = 1.0f; vec[2] = 0.0f; - mul_m4_v3(ob->object_to_world().ptr(), vec); /* Point on the edge */ + mul_m4_v3(ob->object_to_world, vec); /* Point on the edge */ eplanar->clip_edge_y_pos = dot_v3v3(eplanar->clip_vec_y, vec); vec[0] = -1.0f; vec[1] = 0.0f; vec[2] = 0.0f; - mul_m4_v3(ob->object_to_world().ptr(), vec); /* Point on the edge */ + mul_m4_v3(ob->object_to_world, vec); /* Point on the edge */ eplanar->clip_edge_x_neg = dot_v3v3(eplanar->clip_vec_x, vec); vec[0] = 0.0f; vec[1] = -1.0f; vec[2] = 0.0f; - mul_m4_v3(ob->object_to_world().ptr(), vec); /* Point on the edge */ + mul_m4_v3(ob->object_to_world, vec); /* Point on the edge */ eplanar->clip_edge_y_neg = dot_v3v3(eplanar->clip_vec_y, vec); /* Facing factors */ diff --git a/source/blender/draw/engines/eevee/eevee_lights.cc b/source/blender/draw/engines/eevee/eevee_lights.cc index cb21b6c4b2a..b4fdc7bfa0f 100644 --- a/source/blender/draw/engines/eevee/eevee_lights.cc +++ b/source/blender/draw/engines/eevee/eevee_lights.cc @@ -144,7 +144,7 @@ static void eevee_light_setup(Object *ob, EEVEE_Light *evli) const float light_threshold = draw_ctx->scene->eevee.light_threshold; /* Position */ - copy_v3_v3(evli->position, ob->object_to_world().location()); + copy_v3_v3(evli->position, ob->object_to_world[3]); /* Color */ copy_v3_v3(evli->color, &la->r); @@ -165,7 +165,7 @@ static void eevee_light_setup(Object *ob, EEVEE_Light *evli) evli->invsqrdist_volume = 1.0f / max_ff(1e-4f, square_f(att_radius_volume)); /* Vectors */ - normalize_m4_m4_ex(mat, ob->object_to_world().ptr(), scale); + normalize_m4_m4_ex(mat, ob->object_to_world, scale); copy_v3_v3(evli->forwardvec, mat[2]); normalize_v3(evli->forwardvec); negate_v3(evli->forwardvec); diff --git a/source/blender/draw/engines/eevee/eevee_materials.cc b/source/blender/draw/engines/eevee/eevee_materials.cc index 6fff97dcfb8..79c6772126e 100644 --- a/source/blender/draw/engines/eevee/eevee_materials.cc +++ b/source/blender/draw/engines/eevee/eevee_materials.cc @@ -16,7 +16,7 @@ #include "BLI_rand.h" #include "BLI_string_utils.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_paint.hh" #include "BKE_particle.h" @@ -909,7 +909,7 @@ void EEVEE_materials_cache_populate(EEVEE_Data *vedata, if (G.debug_value == 889 && ob->sculpt && BKE_object_sculpt_pbvh_get(ob)) { int debug_node_nr = 0; - DRW_debug_modelmat(ob->object_to_world().ptr()); + DRW_debug_modelmat(ob->object_to_world); BKE_pbvh_draw_debug_cb( BKE_object_sculpt_pbvh_get(ob), DRW_sculpt_debug_cb, &debug_node_nr); } diff --git a/source/blender/draw/engines/eevee/eevee_motion_blur.cc b/source/blender/draw/engines/eevee/eevee_motion_blur.cc index 43521c76b41..7dd874115c3 100644 --- a/source/blender/draw/engines/eevee/eevee_motion_blur.cc +++ b/source/blender/draw/engines/eevee/eevee_motion_blur.cc @@ -15,7 +15,7 @@ #include "BKE_animsys.h" #include "BKE_camera.h" -#include "BKE_duplilist.hh" +#include "BKE_duplilist.h" #include "BKE_object.hh" #include "BKE_screen.hh" @@ -52,7 +52,7 @@ int EEVEE_motion_blur_init(EEVEE_ViewLayerData * /*sldata*/, EEVEE_Data *vedata) effects->motion_blur_max = max_ii(0, scene->eevee.motion_blur_max); - if ((effects->motion_blur_max > 0) && (scene->r.mode & R_MBLUR)) { + if ((effects->motion_blur_max > 0) && (scene->eevee.flag & SCE_EEVEE_MOTION_BLUR_ENABLED)) { if (DRW_state_is_scene_render()) { int mb_step = effects->motion_blur_step; DRW_view_viewmat_get(nullptr, effects->motion_blur.camera[mb_step].viewmat, false); @@ -296,7 +296,7 @@ void EEVEE_motion_blur_curves_cache_populate(EEVEE_ViewLayerData * /*sldata*/, int mb_step = effects->motion_blur_step; /* Store transform. */ - copy_m4_m4(mb_data->obmat[mb_step], ob->object_to_world().ptr()); + copy_m4_m4(mb_data->obmat[mb_step], ob->object_to_world); EEVEE_HairMotionData *mb_curves = EEVEE_motion_blur_curves_data_get(mb_data); @@ -367,7 +367,7 @@ void EEVEE_motion_blur_cache_populate(EEVEE_ViewLayerData * /*sldata*/, if (mb_data) { int mb_step = effects->motion_blur_step; /* Store transform. */ - copy_m4_m4(mb_data->obmat[mb_step], ob->object_to_world().ptr()); + copy_m4_m4(mb_data->obmat[mb_step], ob->object_to_world); EEVEE_GeometryMotionData *mb_geom = EEVEE_motion_blur_geometry_data_get(mb_data); diff --git a/source/blender/draw/engines/eevee/eevee_occlusion.cc b/source/blender/draw/engines/eevee/eevee_occlusion.cc index c8691033b61..8e7c832f39a 100644 --- a/source/blender/draw/engines/eevee/eevee_occlusion.cc +++ b/source/blender/draw/engines/eevee/eevee_occlusion.cc @@ -14,7 +14,7 @@ #include "DEG_depsgraph_query.hh" -#include "BKE_global.hh" /* for G.debug_value */ +#include "BKE_global.h" /* for G.debug_value */ #include "eevee_private.h" diff --git a/source/blender/draw/engines/eevee/eevee_render.cc b/source/blender/draw/engines/eevee/eevee_render.cc index d9d6ada0f61..78fd8554410 100644 --- a/source/blender/draw/engines/eevee/eevee_render.cc +++ b/source/blender/draw/engines/eevee/eevee_render.cc @@ -16,7 +16,7 @@ #include "DNA_node_types.h" #include "DNA_object_types.h" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_object.hh" #include "BLI_rand.h" diff --git a/source/blender/draw/engines/eevee/eevee_renderpasses.cc b/source/blender/draw/engines/eevee/eevee_renderpasses.cc index b249d83f9af..649d0092fcb 100644 --- a/source/blender/draw/engines/eevee/eevee_renderpasses.cc +++ b/source/blender/draw/engines/eevee/eevee_renderpasses.cc @@ -11,7 +11,7 @@ #include "draw_color_management.h" /* TODO: remove dependency. */ -#include "BKE_global.hh" /* for G.debug_value */ +#include "BKE_global.h" /* for G.debug_value */ #include "BLI_hash.h" #include "BLI_string_utils.hh" diff --git a/source/blender/draw/engines/eevee/eevee_shaders_extra.cc b/source/blender/draw/engines/eevee/eevee_shaders_extra.cc index 4fadcb51946..7d5fedf4926 100644 --- a/source/blender/draw/engines/eevee/eevee_shaders_extra.cc +++ b/source/blender/draw/engines/eevee/eevee_shaders_extra.cc @@ -131,7 +131,7 @@ void eevee_shader_material_create_info_amend(GPUMaterial *gpumat, attr_load << "void attrib_load()\n"; attr_load << "{\n"; - attr_load << ((!codegen.attr_load.empty()) ? codegen.attr_load : ""); + attr_load << ((codegen.attr_load) ? codegen.attr_load : ""); attr_load << "}\n\n"; std::stringstream vert_gen, frag_gen, geom_gen; @@ -152,18 +152,20 @@ void eevee_shader_material_create_info_amend(GPUMaterial *gpumat, { frag_gen << frag; - frag_gen << codegen.material_functions; + if (codegen.material_functions) { + frag_gen << codegen.material_functions; + } frag_gen << "Closure nodetree_exec()\n"; frag_gen << "{\n"; if (is_volume) { - frag_gen << ((!codegen.volume.empty()) ? codegen.volume : "return CLOSURE_DEFAULT;\n"); + frag_gen << ((codegen.volume) ? codegen.volume : "return CLOSURE_DEFAULT;\n"); } else { - frag_gen << ((!codegen.surface.empty()) ? codegen.surface : "return CLOSURE_DEFAULT;\n"); + frag_gen << ((codegen.surface) ? codegen.surface : "return CLOSURE_DEFAULT;\n"); } frag_gen << "}\n\n"; - if (!codegen.displacement.empty() && (is_hair || is_mesh)) { + if (codegen.displacement && (is_hair || is_mesh)) { info.define("EEVEE_DISPLACEMENT_BUMP"); frag_gen << "vec3 displacement_exec()\n"; diff --git a/source/blender/draw/engines/eevee/eevee_shadows.cc b/source/blender/draw/engines/eevee/eevee_shadows.cc index dce8e84ac16..5c21a8cceee 100644 --- a/source/blender/draw/engines/eevee/eevee_shadows.cc +++ b/source/blender/draw/engines/eevee/eevee_shadows.cc @@ -163,7 +163,7 @@ void EEVEE_shadows_caster_register(EEVEE_ViewLayerData *sldata, Object *ob) for (int i = 0; i < 8; i++) { float vec[3]; copy_v3_v3(vec, bb.vec[i]); - mul_m4_v3(ob->object_to_world().ptr(), vec); + mul_m4_v3(ob->object_to_world, vec); minmax_v3v3_v3(min, max, vec); } @@ -246,7 +246,7 @@ void EEVEE_shadows_update(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata) sldata->shadow_fb = GPU_framebuffer_create("shadow_fb"); } - /* Gather all the light's own update bits. to avoid costly intersection check. */ + /* Gather all light own update bits. to avoid costly intersection check. */ for (int j = 0; j < linfo->cube_len; j++) { const EEVEE_Light *evli = linfo->light_data + linfo->shadow_cube_light_indices[j]; /* Setup shadow cube in UBO and tag for update if necessary. */ diff --git a/source/blender/draw/engines/eevee/eevee_shadows_cube.cc b/source/blender/draw/engines/eevee/eevee_shadows_cube.cc index 091ee9b527f..846d33c5f6a 100644 --- a/source/blender/draw/engines/eevee/eevee_shadows_cube.cc +++ b/source/blender/draw/engines/eevee/eevee_shadows_cube.cc @@ -189,13 +189,13 @@ void EEVEE_shadows_draw_cubemap(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, for (int j = 0; j < 6; j++) { /* Optimization: Only render the needed faces. */ /* Skip all but -Z face. */ - if ((ELEM(evli->light_type, LA_SPOT, LAMPTYPE_SPOT_DISK)) && j != 5 && + if ((evli->light_type == LA_SPOT || evli->light_type == LAMPTYPE_SPOT_DISK) && j != 5 && spot_angle_fit_single_face(evli)) { continue; } /* Skip +Z face. */ - if (!(ELEM(evli->light_type, LA_LOCAL, LAMPTYPE_OMNI_DISK)) && j == 4) { + if (!(evli->light_type == LA_LOCAL || evli->light_type == LAMPTYPE_OMNI_DISK) && j == 4) { continue; } /* TODO(fclem): some cube sides can be invisible in the main views. Cull them. */ diff --git a/source/blender/draw/engines/eevee/eevee_volumes.cc b/source/blender/draw/engines/eevee/eevee_volumes.cc index ef942a2e0b8..eb42b810bfd 100644 --- a/source/blender/draw/engines/eevee/eevee_volumes.cc +++ b/source/blender/draw/engines/eevee/eevee_volumes.cc @@ -20,7 +20,7 @@ #include "DNA_world_types.h" #include "BKE_fluid.h" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_mesh.hh" #include "BKE_modifier.hh" #include "BKE_volume.hh" @@ -305,7 +305,7 @@ void EEVEE_volumes_cache_object_add(EEVEE_ViewLayerData *sldata, } float size[3]; - mat4_to_size(size, ob->object_to_world().ptr()); + mat4_to_size(size, ob->object_to_world); /* Check if any of the axes have 0 length. (see #69070) */ const float epsilon = 1e-8f; if ((size[0] < epsilon) || (size[1] < epsilon) || (size[2] < epsilon)) { diff --git a/source/blender/draw/engines/eevee/shaders/closure_type_lib.glsl b/source/blender/draw/engines/eevee/shaders/closure_type_lib.glsl index c7f94cc3178..c6408a630af 100644 --- a/source/blender/draw/engines/eevee/shaders/closure_type_lib.glsl +++ b/source/blender/draw/engines/eevee/shaders/closure_type_lib.glsl @@ -51,7 +51,6 @@ vec3 coordinate_camera(vec3 P); vec3 coordinate_screen(vec3 P); vec3 coordinate_reflect(vec3 P, vec3 N); vec3 coordinate_incoming(vec3 P); -float film_scaling_factor_get(); /* Single BSDFs. */ Closure closure_eval(ClosureDiffuse diffuse); diff --git a/source/blender/draw/engines/eevee/shaders/common_uniforms_lib.glsl b/source/blender/draw/engines/eevee/shaders/common_uniforms_lib.glsl index 34a759f7b84..b7950d3ca13 100644 --- a/source/blender/draw/engines/eevee/shaders/common_uniforms_lib.glsl +++ b/source/blender/draw/engines/eevee/shaders/common_uniforms_lib.glsl @@ -20,21 +20,21 @@ layout(std140) uniform common_block vec4 volCoordScale; /* To convert volume uvs to screen uvs */ float volHistoryAlpha; float volShadowSteps; - bool32_t volUseLights; - bool32_t volUseSoftShadows; + bool volUseLights; + bool volUseSoftShadows; /* Screen Space Reflections */ vec4 ssrParameters; float ssrBorderFac; float ssrMaxRoughness; float ssrFireflyFac; float ssrBrdfBias; - bool32_t ssrToggle; - bool32_t ssrefractToggle; + bool ssrToggle; + bool ssrefractToggle; /* SubSurface Scattering */ float sssJitterThreshold; - bool32_t sssToggle; + bool sssToggle; /* Specular */ - bool32_t specToggle; + bool specToggle; /* Lights */ int laNumLight; /* Probes */ diff --git a/source/blender/draw/engines/eevee/shaders/infos/engine_eevee_legacy_shared.h b/source/blender/draw/engines/eevee/shaders/infos/engine_eevee_legacy_shared.h index add26ffb2ae..a6e9ac3aa6b 100644 --- a/source/blender/draw/engines/eevee/shaders/infos/engine_eevee_legacy_shared.h +++ b/source/blender/draw/engines/eevee/shaders/infos/engine_eevee_legacy_shared.h @@ -39,21 +39,21 @@ struct CommonUniformBlock { vec4 _volCoordScale; /* To convert volume uvs to screen uvs */ float _volHistoryAlpha; float _volShadowSteps; - bool32_t _volUseLights; - bool32_t _volUseSoftShadows; + bool _volUseLights; + bool _volUseSoftShadows; /* Screen Space Reflections */ vec4 _ssrParameters; float _ssrBorderFac; float _ssrMaxRoughness; float _ssrFireflyFac; float _ssrBrdfBias; - bool32_t _ssrToggle; - bool32_t _ssrefractToggle; + bool _ssrToggle; + bool _ssrefractToggle; /* SubSurface Scattering */ float _sssJitterThreshold; - bool32_t _sssToggle; + bool _sssToggle; /* Specular */ - bool32_t _specToggle; + bool _specToggle; /* Lights */ int _laNumLight; /* Probes */ @@ -166,14 +166,14 @@ struct LightBlock { BLI_STATIC_ASSERT_ALIGN(LightBlock, 16) struct RenderpassBlock { - bool32_t _renderPassDiffuse; - bool32_t _renderPassDiffuseLight; - bool32_t _renderPassGlossy; - bool32_t _renderPassGlossyLight; - bool32_t _renderPassEmit; - bool32_t _renderPassSSSColor; - bool32_t _renderPassEnvironment; - bool32_t _renderPassAOV; + bool _renderPassDiffuse; + bool _renderPassDiffuseLight; + bool _renderPassGlossy; + bool _renderPassGlossyLight; + bool _renderPassEmit; + bool _renderPassSSSColor; + bool _renderPassEnvironment; + bool _renderPassAOV; uint _renderPassAOVActive; }; BLI_STATIC_ASSERT_ALIGN(RenderpassBlock, 16) diff --git a/source/blender/draw/engines/eevee/shaders/surface_lib.glsl b/source/blender/draw/engines/eevee/shaders/surface_lib.glsl index 676d4ef3505..68ce4d27617 100644 --- a/source/blender/draw/engines/eevee/shaders/surface_lib.glsl +++ b/source/blender/draw/engines/eevee/shaders/surface_lib.glsl @@ -250,8 +250,3 @@ vec3 coordinate_incoming(vec3 P) return cameraVec(P); #endif } - -float film_scaling_factor_get() -{ - return 1.0; -} diff --git a/source/blender/draw/engines/eevee/shaders/volumetric_frag.glsl b/source/blender/draw/engines/eevee/shaders/volumetric_frag.glsl index 73821f83c84..17a6d98c28c 100644 --- a/source/blender/draw/engines/eevee/shaders/volumetric_frag.glsl +++ b/source/blender/draw/engines/eevee/shaders/volumetric_frag.glsl @@ -62,11 +62,6 @@ vec3 coordinate_incoming(vec3 P) { return cameraVec(P); } - -float film_scaling_factor_get() -{ - return 1.0; -} #endif void main() diff --git a/source/blender/draw/engines/eevee/shaders/volumetric_vert.glsl b/source/blender/draw/engines/eevee/shaders/volumetric_vert.glsl index b51486113f5..b44e3e8e7f9 100644 --- a/source/blender/draw/engines/eevee/shaders/volumetric_vert.glsl +++ b/source/blender/draw/engines/eevee/shaders/volumetric_vert.glsl @@ -107,11 +107,6 @@ vec3 coordinate_incoming(vec3 P) return vec3(0.0); } -float film_scaling_factor_get() -{ - return 1.0; -} - float attr_load_temperature_post(float attr) { return attr; diff --git a/source/blender/draw/engines/eevee_next/eevee_camera.cc b/source/blender/draw/engines/eevee_next/eevee_camera.cc index bba33b0085f..1184f202fcd 100644 --- a/source/blender/draw/engines/eevee_next/eevee_camera.cc +++ b/source/blender/draw/engines/eevee_next/eevee_camera.cc @@ -110,7 +110,7 @@ void Camera::sync() if (inst_.is_baking()) { /* Any view so that shadows and light culling works during irradiance bake. */ - draw::View &view = inst_.volume_probes.bake.view_z_; + draw::View &view = inst_.irradiance_cache.bake.view_z_; data.viewmat = view.viewmat(); data.viewinv = view.viewinv(); data.winmat = view.winmat(); diff --git a/source/blender/draw/engines/eevee_next/eevee_defines.hh b/source/blender/draw/engines/eevee_next/eevee_defines.hh index ea0c4abd153..36341f45938 100644 --- a/source/blender/draw/engines/eevee_next/eevee_defines.hh +++ b/source/blender/draw/engines/eevee_next/eevee_defines.hh @@ -30,30 +30,16 @@ #define CULLING_TILE_GROUP_SIZE 256 /* Reflection Probes. */ -#define SPHERE_PROBE_GROUP_SIZE 16 -#define SPHERE_PROBE_SELECT_GROUP_SIZE 64 -#define SPHERE_PROBE_MIPMAP_LEVELS 5 -#define SPHERE_PROBE_SH_GROUP_SIZE 512 -#define SPHERE_PROBE_SH_SAMPLES_PER_GROUP 64 -/* Must be power of two for correct partitioning. */ -#define SPHERE_PROBE_ATLAS_MAX_SUBDIV 10 -#define SPHERE_PROBE_ATLAS_RES (1 << SPHERE_PROBE_ATLAS_MAX_SUBDIV) -/* Start and end value for mixing sphere probe and volume probes. */ -#define SPHERE_PROBE_MIX_START_ROUGHNESS 0.7 -#define SPHERE_PROBE_MIX_END_ROUGHNESS 0.9 -/* Roughness of the last mip map for sphere probes. */ -#define SPHERE_PROBE_MIP_MAX_ROUGHNESS 0.7 -/** - * Limited by the UBO size limit `(16384 bytes / sizeof(SphereProbeData))`. - */ -#define SPHERE_PROBE_MAX 128 +#define REFLECTION_PROBES_MAX 128 +#define REFLECTION_PROBE_GROUP_SIZE 16 +#define REFLECTION_PROBE_SELECT_GROUP_SIZE 64 +/* Number of additional pixels on the border of an octahedral map to reserve for fixing seams. + * Border size requires depends on the max number of mipmap levels. */ +#define REFLECTION_PROBE_MIPMAP_LEVELS 5 +#define REFLECTION_PROBE_SH_GROUP_SIZE 512 +#define REFLECTION_PROBE_SH_SAMPLES_PER_GROUP 64 -/** - * Limited by the performance impact it can cause. - * Limited by the max layer count supported by a hardware (256). - * Limited by the UBO size limit `(16384 bytes / sizeof(PlanarProbeData))`. - */ -#define PLANAR_PROBE_MAX 16 +#define PLANAR_PROBES_MAX 16 /** * IMPORTANT: Some data packing are tweaked for these values. @@ -184,8 +170,8 @@ /* Only during surface shading (forward and deferred eval). */ #define SHADOW_TILEMAPS_TEX_SLOT 4 #define SHADOW_ATLAS_TEX_SLOT 5 -#define VOLUME_PROBE_TEX_SLOT 6 -#define SPHERE_PROBE_TEX_SLOT 7 +#define IRRADIANCE_ATLAS_TEX_SLOT 6 +#define REFLECTION_PROBE_TEX_SLOT 7 #define VOLUME_SCATTERING_TEX_SLOT 8 #define VOLUME_TRANSMITTANCE_TEX_SLOT 9 /* Currently only used by ray-tracing, but might become used by forward too. */ @@ -216,7 +202,7 @@ #define UNIFORM_BUF_SLOT 1 /* Only during surface shading (forward and deferred eval). */ #define IRRADIANCE_GRID_BUF_SLOT 2 -#define SPHERE_PROBE_BUF_SLOT 3 +#define REFLECTION_PROBE_BUF_SLOT 3 #define PLANAR_PROBE_BUF_SLOT 4 /* Only during pre-pass. */ #define VELOCITY_CAMERA_PREV_BUF 2 diff --git a/source/blender/draw/engines/eevee_next/eevee_depth_of_field.cc b/source/blender/draw/engines/eevee_next/eevee_depth_of_field.cc index 0278fe24e5a..c713e386804 100644 --- a/source/blender/draw/engines/eevee_next/eevee_depth_of_field.cc +++ b/source/blender/draw/engines/eevee_next/eevee_depth_of_field.cc @@ -24,7 +24,7 @@ #include "GPU_platform.h" #include "GPU_texture.h" -#include "GPU_uniform_buffer.hh" +#include "GPU_uniform_buffer.h" #include "eevee_camera.hh" #include "eevee_instance.hh" diff --git a/source/blender/draw/engines/eevee_next/eevee_depth_of_field.hh b/source/blender/draw/engines/eevee_next/eevee_depth_of_field.hh index fc212b97ae6..58ccfbb64fa 100644 --- a/source/blender/draw/engines/eevee_next/eevee_depth_of_field.hh +++ b/source/blender/draw/engines/eevee_next/eevee_depth_of_field.hh @@ -67,7 +67,7 @@ class DepthOfField { /** Stabilization (flicker attenuation) of Color and CoC output of the setup pass. */ TextureFromPool stabilize_output_tx_ = {"dof_taa"}; GPUTexture *stabilize_input_ = nullptr; - bool32_t stabilize_valid_history_ = false; + bool1 stabilize_valid_history_ = false; int3 dispatch_stabilize_size_ = int3(-1); PassSimple stabilize_ps_ = {"Stabilize"}; diff --git a/source/blender/draw/engines/eevee_next/eevee_engine.cc b/source/blender/draw/engines/eevee_next/eevee_engine.cc index 039f41a1490..0967eccc1fb 100644 --- a/source/blender/draw/engines/eevee_next/eevee_engine.cc +++ b/source/blender/draw/engines/eevee_next/eevee_engine.cc @@ -2,7 +2,7 @@ * * SPDX-License-Identifier: GPL-2.0-or-later */ -#include "BKE_global.hh" +#include "BKE_global.h" #include "BLI_rect.h" #include "GPU_capabilities.h" diff --git a/source/blender/draw/engines/eevee_next/eevee_film.cc b/source/blender/draw/engines/eevee_next/eevee_film.cc index 7dd5d9b0e6f..bf3c8d427a3 100644 --- a/source/blender/draw/engines/eevee_next/eevee_film.cc +++ b/source/blender/draw/engines/eevee_next/eevee_film.cc @@ -66,7 +66,7 @@ void Film::init_aovs() } if (aovs.size() > AOV_MAX) { - inst_.info += "Error: Too many AOVs\n"; + inst_.info = "Error: Too many AOVs"; return; } @@ -77,10 +77,6 @@ void Film::init_aovs() hash = BLI_hash_string(aov->name); index++; } - - if (!aovs.is_empty()) { - enabled_categories_ |= PASS_CATEGORY_AOV; - } } float *Film::read_aov(ViewLayerAOV *aov) @@ -213,7 +209,6 @@ void Film::init(const int2 &extent, const rcti *output_rect) Scene &scene = *inst_.scene; SceneEEVEE &scene_eevee = scene.eevee; - enabled_categories_ = PassCategory(0); init_aovs(); { @@ -236,22 +231,11 @@ void Film::init(const int2 &extent, const rcti *output_rect) /* Filter obsolete passes. */ enabled_passes_ &= ~(EEVEE_RENDER_PASS_UNUSED_8 | EEVEE_RENDER_PASS_BLOOM); - if (scene.r.mode & R_MBLUR) { + if (scene_eevee.flag & SCE_EEVEE_MOTION_BLUR_ENABLED) { /* Disable motion vector pass if motion blur is enabled. */ enabled_passes_ &= ~EEVEE_RENDER_PASS_VECTOR; } } - { - data_.scaling_factor = 1; - if (inst_.is_viewport()) { - if (!bool(enabled_passes_ & - (EEVEE_RENDER_PASS_CRYPTOMATTE_ASSET | EEVEE_RENDER_PASS_CRYPTOMATTE_MATERIAL | - EEVEE_RENDER_PASS_CRYPTOMATTE_OBJECT | EEVEE_RENDER_PASS_NORMAL))) - { - data_.scaling_factor = BKE_render_preview_pixel_size(&inst_.scene->r); - } - } - } { rcti fallback_rect; if (BLI_rcti_is_empty(output_rect)) { @@ -264,6 +248,9 @@ void Film::init(const int2 &extent, const rcti *output_rect) data_.extent = int2(BLI_rcti_size_x(output_rect), BLI_rcti_size_y(output_rect)); data_.offset = int2(output_rect->xmin, output_rect->ymin); data_.extent_inv = 1.0f / float2(data_.extent); + /* TODO(fclem): parameter hidden in experimental. + * We need to figure out LOD bias first in order to preserve texture crispiness. */ + data_.scaling_factor = 1; data_.render_extent = math::divide_ceil(extent, int2(data_.scaling_factor)); data_.render_offset = data_.offset; @@ -298,18 +285,10 @@ void Film::init(const int2 &extent, const rcti *output_rect) const eViewLayerEEVEEPassType color_passes_3 = EEVEE_RENDER_PASS_TRANSPARENT; data_.exposure_scale = pow2f(scene.view_settings.exposure); - if (enabled_passes_ & data_passes) { - enabled_categories_ |= PASS_CATEGORY_DATA; - } - if (enabled_passes_ & color_passes_1) { - enabled_categories_ |= PASS_CATEGORY_COLOR_1; - } - if (enabled_passes_ & color_passes_2) { - enabled_categories_ |= PASS_CATEGORY_COLOR_2; - } - if (enabled_passes_ & color_passes_3) { - enabled_categories_ |= PASS_CATEGORY_COLOR_3; - } + data_.has_data = (enabled_passes_ & data_passes) != 0; + data_.any_render_pass_1 = (enabled_passes_ & color_passes_1) != 0; + data_.any_render_pass_2 = (enabled_passes_ & color_passes_2) != 0; + data_.any_render_pass_3 = (enabled_passes_ & color_passes_3) != 0; } { /* Set pass offsets. */ @@ -379,18 +358,9 @@ void Film::init(const int2 &extent, const rcti *output_rect) data_.cryptomatte_object_id = cryptomatte_index_get(EEVEE_RENDER_PASS_CRYPTOMATTE_OBJECT); data_.cryptomatte_asset_id = cryptomatte_index_get(EEVEE_RENDER_PASS_CRYPTOMATTE_ASSET); data_.cryptomatte_material_id = cryptomatte_index_get(EEVEE_RENDER_PASS_CRYPTOMATTE_MATERIAL); - - if ((enabled_passes_ & - (EEVEE_RENDER_PASS_CRYPTOMATTE_ASSET | EEVEE_RENDER_PASS_CRYPTOMATTE_MATERIAL | - EEVEE_RENDER_PASS_CRYPTOMATTE_OBJECT)) != 0) - { - enabled_categories_ |= PASS_CATEGORY_CRYPTOMATTE; - } } { - int2 weight_extent = (inst_.camera.is_panoramic() || (data_.scaling_factor > 1)) ? - data_.extent : - int2(1); + int2 weight_extent = inst_.camera.is_panoramic() ? data_.extent : int2(data_.scaling_factor); eGPUTextureFormat color_format = GPU_RGBA16F; eGPUTextureFormat float_format = GPU_R16F; @@ -420,7 +390,7 @@ void Film::init(const int2 &extent, const rcti *output_rect) if (reset > 0) { data_.use_history = 0; - use_reprojection_ = false; + data_.use_reprojection = 0; /* Avoid NaN in uninitialized texture memory making history blending dangerous. */ color_accum_tx_.clear(float4(0.0f)); @@ -453,14 +423,9 @@ void Film::sync() * Still bind previous step to avoid undefined behavior. */ eVelocityStep step_next = inst_.is_viewport() ? STEP_PREVIOUS : STEP_NEXT; - GPUShader *sh = inst_.shaders.static_shader_get(shader); accumulate_ps_.init(); - accumulate_ps_.specialize_constant(sh, "enabled_categories", uint(enabled_categories_)); - accumulate_ps_.specialize_constant(sh, "samples_len", &data_.samples_len); - accumulate_ps_.specialize_constant(sh, "use_reprojection", &use_reprojection_); - accumulate_ps_.specialize_constant(sh, "scaling_factor", data_.scaling_factor); accumulate_ps_.state_set(DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_ALWAYS); - accumulate_ps_.shader_set(sh); + accumulate_ps_.shader_set(inst_.shaders.static_shader_get(shader)); accumulate_ps_.bind_resources(inst_.uniform_data); accumulate_ps_.bind_ubo("camera_prev", &(*velocity.camera_steps[STEP_PREVIOUS])); accumulate_ps_.bind_ubo("camera_curr", &(*velocity.camera_steps[STEP_CURRENT])); @@ -510,11 +475,11 @@ void Film::sync() void Film::end_sync() { - use_reprojection_ = inst_.sampling.interactive_mode(); + data_.use_reprojection = inst_.sampling.interactive_mode(); /* Just bypass the reprojection and reset the accumulation. */ if (inst_.is_viewport() && force_disable_reprojection_ && inst_.sampling.is_reset()) { - use_reprojection_ = false; + data_.use_reprojection = false; data_.use_history = false; } @@ -546,7 +511,7 @@ float2 Film::pixel_jitter_get() const eViewLayerEEVEEPassType Film::enabled_passes_get() const { - if (inst_.is_viewport() && use_reprojection_) { + if (inst_.is_viewport() && data_.use_reprojection) { /* Enable motion vector rendering but not the accumulation buffer. */ return enabled_passes_ | EEVEE_RENDER_PASS_VECTOR; } diff --git a/source/blender/draw/engines/eevee_next/eevee_film.hh b/source/blender/draw/engines/eevee_next/eevee_film.hh index 89039e763c8..03232c69f27 100644 --- a/source/blender/draw/engines/eevee_next/eevee_film.hh +++ b/source/blender/draw/engines/eevee_next/eevee_film.hh @@ -79,8 +79,6 @@ class Film { int2 display_extent; eViewLayerEEVEEPassType enabled_passes_ = eViewLayerEEVEEPassType(0); - PassCategory enabled_categories_ = PassCategory(0); - bool use_reprojection_ = false; public: Film(Instance &inst, FilmData &data) : inst_(inst), data_(data){}; @@ -120,11 +118,6 @@ class Film { return display_extent; } - int scaling_factor_get() const - { - return data_.scaling_factor; - } - float2 pixel_jitter_get() const; float background_opacity_get() const diff --git a/source/blender/draw/engines/eevee_next/eevee_gbuffer.hh b/source/blender/draw/engines/eevee_next/eevee_gbuffer.hh index cf296929107..7a8e5f04d23 100644 --- a/source/blender/draw/engines/eevee_next/eevee_gbuffer.hh +++ b/source/blender/draw/engines/eevee_next/eevee_gbuffer.hh @@ -11,7 +11,6 @@ #pragma once #include "DRW_render.hh" -#include "GPU_capabilities.h" #include "eevee_material.hh" #include "eevee_shader_shared.hh" @@ -152,41 +151,6 @@ struct GBuffer { normal_img_tx = normal_tx.layer_range_view(1, normal_count - 1); } - /* Bind the GBuffer frame-buffer correctly using the correct workarounds. */ - void bind(Framebuffer &gbuffer_fb) - { - if (/* FIXME(fclem): Vulkan doesn't implement load / store config yet. */ - GPU_backend_get_type() == GPU_BACKEND_VULKAN || - /* FIXME(fclem): Metal has bug in backend. */ - GPU_backend_get_type() == GPU_BACKEND_METAL) - { - header_tx.clear(uint4(0)); - } - - if (GPU_backend_get_type() == GPU_BACKEND_METAL) { - /* TODO(fclem): Load/store action is broken on Metal. */ - GPU_framebuffer_bind(gbuffer_fb); - } - else { - if (!GPU_stencil_export_support()) { - /* Clearing custom load-store frame-buffers is invalid, - * clear the stencil as a regular frame-buffer first. */ - GPU_framebuffer_bind(gbuffer_fb); - GPU_framebuffer_clear_stencil(gbuffer_fb, 0x0u); - } - GPU_framebuffer_bind_ex( - gbuffer_fb, - { - {GPU_LOADACTION_LOAD, GPU_STOREACTION_STORE}, /* Depth */ - {GPU_LOADACTION_LOAD, GPU_STOREACTION_STORE}, /* Combined */ - {GPU_LOADACTION_CLEAR, GPU_STOREACTION_STORE, {0}}, /* GBuf Header */ - {GPU_LOADACTION_DONT_CARE, GPU_STOREACTION_STORE}, /* GBuf Normal */ - {GPU_LOADACTION_DONT_CARE, GPU_STOREACTION_STORE}, /* GBuf Closure */ - {GPU_LOADACTION_DONT_CARE, GPU_STOREACTION_STORE}, /* GBuf Closure 2*/ - }); - } - } - void release() { /* TODO(fclem): Use texture from pool once they support texture array. */ diff --git a/source/blender/draw/engines/eevee_next/eevee_hizbuffer.cc b/source/blender/draw/engines/eevee_next/eevee_hizbuffer.cc index 0a6b7fa7dba..be07e299ad4 100644 --- a/source/blender/draw/engines/eevee_next/eevee_hizbuffer.cc +++ b/source/blender/draw/engines/eevee_next/eevee_hizbuffer.cc @@ -2,7 +2,7 @@ * * SPDX-License-Identifier: GPL-2.0-or-later */ -#include "BKE_global.hh" +#include "BKE_global.h" #include "eevee_instance.hh" @@ -18,8 +18,8 @@ namespace blender::eevee { void HiZBuffer::sync() { int2 render_extent = inst_.film.render_extent_get(); - int2 probe_extent = int2(inst_.sphere_probes.probe_render_extent()); /* Padding to avoid complexity during down-sampling and screen tracing. */ + int2 probe_extent = int2(inst_.reflection_probes.probe_render_extent()); int2 hiz_extent = math::ceil_to_multiple(math::max(render_extent, probe_extent), int2(1u << (HIZ_MIP_COUNT - 1))); int2 dispatch_size = math::divide_ceil(hiz_extent, int2(HIZ_GROUP_SIZE)); @@ -111,10 +111,10 @@ void HiZBuffer::update() void HiZBuffer::debug_draw(View &view, GPUFrameBuffer *view_fb) { if (inst_.debug_mode == eDebugMode::DEBUG_HIZ_VALIDATION) { - inst_.info += + inst_.info = "Debug Mode: HiZ Validation\n" " - Red: pixel in front of HiZ tile value.\n" - " - Blue: No error.\n"; + " - Blue: No error."; inst_.hiz_buffer.update(); GPU_framebuffer_bind(view_fb); inst_.manager->submit(debug_draw_ps_, view); diff --git a/source/blender/draw/engines/eevee_next/eevee_instance.cc b/source/blender/draw/engines/eevee_next/eevee_instance.cc index 275f0ee1a01..d98b48d3953 100644 --- a/source/blender/draw/engines/eevee_next/eevee_instance.cc +++ b/source/blender/draw/engines/eevee_next/eevee_instance.cc @@ -10,7 +10,7 @@ #include -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_object.hh" #include "BLI_rect.h" #include "DEG_depsgraph_query.hh" @@ -71,13 +71,6 @@ void Instance::init(const int2 &output_res, if (output_res != film.display_extent_get()) { sampling.reset(); } - if (output_rect) { - int2 offset = int2(output_rect->xmin, output_rect->ymin); - int2 extent = int2(BLI_rcti_size_x(output_rect), BLI_rcti_size_y(output_rect)); - if (offset != film.get_data().offset || extent != film.get_data().extent) { - sampling.reset(); - } - } if (assign_if_different(overlays_enabled_, v3d && !(v3d->flag2 & V3D_HIDE_OVERLAYS))) { sampling.reset(); } @@ -97,11 +90,10 @@ void Instance::init(const int2 &output_res, shadows.init(); motion_blur.init(); main_view.init(); - light_probes.init(); planar_probes.init(); /* Irradiance Cache needs reflection probes to be initialized. */ - sphere_probes.init(); - volume_probes.init(); + reflection_probes.init(); + irradiance_cache.init(); volume.init(); lookdev.init(visible_rect); } @@ -132,11 +124,10 @@ void Instance::init_light_bake(Depsgraph *depsgraph, draw::Manager *manager) depth_of_field.init(); shadows.init(); main_view.init(); - light_probes.init(); planar_probes.init(); /* Irradiance Cache needs reflection probes to be initialized. */ - sphere_probes.init(); - volume_probes.init(); + reflection_probes.init(); + irradiance_cache.init(); volume.init(); lookdev.init(&empty_rect); } @@ -182,7 +173,8 @@ void Instance::begin_sync() volume.begin_sync(); pipelines.begin_sync(); cryptomatte.begin_sync(); - sphere_probes.begin_sync(); + reflection_probes.begin_sync(); + planar_probes.begin_sync(); light_probes.begin_sync(); gpencil_engine_enabled = false; @@ -196,7 +188,7 @@ void Instance::begin_sync() film.sync(); render_buffers.sync(); ambient_occlusion.sync(); - volume_probes.sync(); + irradiance_cache.sync(); lookdev.sync(); use_surfaces = (view_layer->layflag & SCE_LAY_SOLID) != 0; @@ -246,7 +238,7 @@ void Instance::object_sync(Object *ob) if (partsys_is_visible && ob != DRW_context_state_get()->object_edit) { auto sync_hair = [&](ObjectHandle hair_handle, ModifierData &md, ParticleSystem &particle_sys) { - ResourceHandle _res_handle = manager->resource_handle(ob->object_to_world()); + ResourceHandle _res_handle = manager->resource_handle(float4x4(ob->object_to_world)); sync.sync_curves(ob, hair_handle, _res_handle, ob_ref, &md, &particle_sys); }; foreach_hair_particle_handle(ob, ob_handle, sync_hair); @@ -275,7 +267,7 @@ void Instance::object_sync(Object *ob) sync.sync_gpencil(ob, ob_handle, res_handle); break; case OB_LIGHTPROBE: - light_probes.sync_probe(ob, ob_handle); + sync.sync_light_probe(ob, ob_handle); break; default: break; @@ -311,7 +303,7 @@ void Instance::end_sync() cryptomatte.end_sync(); pipelines.end_sync(); light_probes.end_sync(); - sphere_probes.end_sync(); + reflection_probes.end_sync(); planar_probes.end_sync(); uniform_data.push_update(); @@ -352,7 +344,7 @@ void Instance::render_sync() bool Instance::do_reflection_probe_sync() const { - if (!sphere_probes.update_probes_this_sample_) { + if (!reflection_probes.update_probes_this_sample_) { return false; } if (materials.queued_shaders_count > 0) { @@ -486,6 +478,12 @@ void Instance::render_read_result(RenderLayer *render_layer, const char *view_na void Instance::render_frame(RenderLayer *render_layer, const char *view_name) { + /* TODO(jbakker): should we check on the subtype as well? Now it also populates even when there + * are other light probes in the scene. */ + if (DEG_id_type_any_exists(this->depsgraph, ID_LP)) { + reflection_probes.update_probes_next_sample_ = true; + planar_probes.update_probes_ = true; + } while (!sampling.finished()) { this->render_sample(); @@ -637,7 +635,7 @@ void Instance::light_bake_irradiance( context_disable(); }; - volume_probes.bake.init(probe); + irradiance_cache.bake.init(probe); custom_pipeline_wrapper([&]() { manager->begin_sync(); @@ -648,19 +646,19 @@ void Instance::light_bake_irradiance( capture_view.render_world(); - volume_probes.bake.surfels_create(probe); + irradiance_cache.bake.surfels_create(probe); - if (volume_probes.bake.should_break()) { + if (irradiance_cache.bake.should_break()) { return; } - volume_probes.bake.surfels_lights_eval(); + irradiance_cache.bake.surfels_lights_eval(); - volume_probes.bake.clusters_build(); - volume_probes.bake.irradiance_offset(); + irradiance_cache.bake.clusters_build(); + irradiance_cache.bake.irradiance_offset(); }); - if (volume_probes.bake.should_break()) { + if (irradiance_cache.bake.should_break()) { return; } @@ -675,9 +673,9 @@ void Instance::light_bake_irradiance( for (int i = 0; i < 16 && !sampling.finished(); i++) { sampling.step(); - volume_probes.bake.raylists_build(); - volume_probes.bake.propagate_light(); - volume_probes.bake.irradiance_capture(); + irradiance_cache.bake.raylists_build(); + irradiance_cache.bake.propagate_light(); + irradiance_cache.bake.irradiance_capture(); } if (sampling.finished()) { @@ -687,11 +685,11 @@ void Instance::light_bake_irradiance( LightProbeGridCacheFrame *cache_frame; if (sampling.finished()) { - cache_frame = volume_probes.bake.read_result_packed(); + cache_frame = irradiance_cache.bake.read_result_packed(); } else { /* TODO(fclem): Only do this read-back if needed. But it might be tricky to know when. */ - cache_frame = volume_probes.bake.read_result_unpacked(); + cache_frame = irradiance_cache.bake.read_result_unpacked(); } float progress = sampling.sample_index() / float(sampling.sample_count()); diff --git a/source/blender/draw/engines/eevee_next/eevee_instance.hh b/source/blender/draw/engines/eevee_next/eevee_instance.hh index c52b5d9caf8..691b92b869e 100644 --- a/source/blender/draw/engines/eevee_next/eevee_instance.hh +++ b/source/blender/draw/engines/eevee_next/eevee_instance.hh @@ -86,6 +86,8 @@ class Instance { LightModule lights; AmbientOcclusion ambient_occlusion; RayTraceModule raytracing; + ReflectionProbeModule reflection_probes; + PlanarProbeModule planar_probes; VelocityModule velocity; MotionBlurModule motion_blur; DepthOfField depth_of_field; @@ -101,10 +103,8 @@ class Instance { World world; LookdevView lookdev_view; LookdevModule lookdev; - SphereProbeModule sphere_probes; - PlanarProbeModule planar_probes; - VolumeProbeModule volume_probes; LightProbeModule light_probes; + IrradianceCache irradiance_cache; VolumeModule volume; /** Input data. */ @@ -149,6 +149,8 @@ class Instance { lights(*this), ambient_occlusion(*this, uniform_data.data.ao), raytracing(*this, uniform_data.data.raytrace), + reflection_probes(*this), + planar_probes(*this), velocity(*this), motion_blur(*this), depth_of_field(*this), @@ -163,11 +165,12 @@ class Instance { world(*this), lookdev_view(*this), lookdev(*this), - sphere_probes(*this), - planar_probes(*this), - volume_probes(*this), light_probes(*this), - volume(*this, uniform_data.data.volumes){}; + irradiance_cache(*this), + volume(*this, uniform_data.data.volumes) + { + BLI_assert_unreachable(); + }; ~Instance(){}; /* Render & Viewport. */ diff --git a/source/blender/draw/engines/eevee_next/eevee_irradiance_cache.cc b/source/blender/draw/engines/eevee_next/eevee_irradiance_cache.cc index fd4439d05e0..cb17109df08 100644 --- a/source/blender/draw/engines/eevee_next/eevee_irradiance_cache.cc +++ b/source/blender/draw/engines/eevee_next/eevee_irradiance_cache.cc @@ -21,7 +21,7 @@ namespace blender::eevee { /** \name Interface * \{ */ -void VolumeProbeModule::init() +void IrradianceCache::init() { display_grids_enabled_ = DRW_state_draw_support(); @@ -48,7 +48,7 @@ void VolumeProbeModule::init() if (do_full_update_) { /* Delete all references to existing bricks. */ - for (VolumeProbe &grid : inst_.light_probes.volume_map_.values()) { + for (IrradianceGrid &grid : inst_.light_probes.grid_map_.values()) { grid.bricks.clear(); } brick_pool_.clear(); @@ -71,22 +71,22 @@ void VolumeProbeModule::init() irradiance_atlas_tx_.clear(float4(0.0f)); } - inst_.sphere_probes.tag_world_irradiance_for_update(); + inst_.reflection_probes.do_world_update_irradiance_set(true); } if (irradiance_atlas_tx_.is_valid() == false) { - inst_.info += "Irradiance Atlas texture could not be created\n"; + inst_.info = "Irradiance Atlas texture could not be created"; } } -void VolumeProbeModule::sync() +void IrradianceCache::sync() { if (inst_.is_baking()) { bake.sync(); } } -Vector VolumeProbeModule::bricks_alloc(int brick_len) +Vector IrradianceCache::bricks_alloc(int brick_len) { if (brick_pool_.size() < brick_len) { /* Fail allocation. Not enough brick in the atlas. */ @@ -101,20 +101,20 @@ Vector VolumeProbeModule::bricks_alloc(int brick_len) return allocated; } -void VolumeProbeModule::bricks_free(Vector &bricks) +void IrradianceCache::bricks_free(Vector &bricks) { brick_pool_.extend(bricks.as_span()); bricks.clear(); } -void VolumeProbeModule::set_view(View & /*view*/) +void IrradianceCache::set_view(View & /*view*/) { - Vector grid_loaded; + Vector grid_loaded; bool any_update = false; /* First allocate the needed bricks and populate the brick buffer. */ bricks_infos_buf_.clear(); - for (VolumeProbe &grid : inst_.light_probes.volume_map_.values()) { + for (IrradianceGrid &grid : inst_.light_probes.grid_map_.values()) { LightProbeGridCacheFrame *cache = grid.cache ? grid.cache->grid_static_cache : nullptr; if (cache == nullptr) { continue; @@ -127,7 +127,7 @@ void VolumeProbeModule::set_view(View & /*view*/) int3 grid_size = int3(cache->size); if (grid_size.x <= 0 || grid_size.y <= 0 || grid_size.z <= 0) { - inst_.info += "Error: Malformed irradiance grid data\n"; + inst_.info = "Error: Malformed irradiance grid data"; continue; } @@ -135,9 +135,9 @@ void VolumeProbeModule::set_view(View & /*view*/) /* Note that we reserve 1 slot for the world irradiance. */ if (grid_loaded.size() >= IRRADIANCE_GRID_MAX - 1) { - inst_.info += "Error: Too many irradiance grids in the scene\n"; + inst_.info = "Error: Too many irradiance grids in the scene"; /* TODO frustum cull and only load visible grids. */ - // inst_.info += "Error: Too many grid visible\n"; + // inst_.info = "Error: Too many grid visible"; continue; } @@ -148,7 +148,7 @@ void VolumeProbeModule::set_view(View & /*view*/) grid.bricks = bricks_alloc(brick_len); if (grid.bricks.is_empty()) { - inst_.info += "Error: Irradiance grid allocation failed\n"; + inst_.info = "Error: Irradiance grid allocation failed"; continue; } grid.do_update = true; @@ -165,7 +165,7 @@ void VolumeProbeModule::set_view(View & /*view*/) bricks_infos_buf_.extend(grid.bricks); if (grid_size.x <= 0 || grid_size.y <= 0 || grid_size.z <= 0) { - inst_.info += "Error: Malformed irradiance grid data\n"; + inst_.info = "Error: Malformed irradiance grid data"; continue; } @@ -182,7 +182,7 @@ void VolumeProbeModule::set_view(View & /*view*/) * before tagging update. But this is a bit too complex and update is quite cheap. So we update * everything if there is any update on any grid. */ if (any_update) { - for (VolumeProbe *grid : grid_loaded) { + for (IrradianceGrid *grid : grid_loaded) { grid->do_update = true; } } @@ -190,43 +190,44 @@ void VolumeProbeModule::set_view(View & /*view*/) /* Then create brick & grid infos UBOs content. */ { /* Stable sorting of grids. */ - std::sort( - grid_loaded.begin(), grid_loaded.end(), [](const VolumeProbe *a, const VolumeProbe *b) { - float volume_a = math::determinant(float3x3(a->object_to_world)); - float volume_b = math::determinant(float3x3(b->object_to_world)); - if (volume_a != volume_b) { - /* Smallest first. */ - return volume_a < volume_b; - } - /* Volumes are identical. Any arbitrary criteria can be used to sort them. - * Use position to avoid unstable result caused by depsgraph non deterministic eval - * order. This could also become a priority parameter. */ - float3 _a = a->object_to_world.location(); - float3 _b = b->object_to_world.location(); - if (_a.x != _b.x) { - return _a.x < _b.x; - } - else if (_a.y != _b.y) { - return _a.y < _b.y; - } - else if (_a.z != _b.z) { - return _a.z < _b.z; - } - else { - /* Fallback to memory address, since there's no good alternative. */ - return a < b; - } - }); + std::sort(grid_loaded.begin(), + grid_loaded.end(), + [](const IrradianceGrid *a, const IrradianceGrid *b) { + float volume_a = math::determinant(float3x3(a->object_to_world)); + float volume_b = math::determinant(float3x3(b->object_to_world)); + if (volume_a != volume_b) { + /* Smallest first. */ + return volume_a < volume_b; + } + /* Volumes are identical. Any arbitrary criteria can be used to sort them. + * Use position to avoid unstable result caused by depsgraph non deterministic eval + * order. This could also become a priority parameter. */ + float3 _a = a->object_to_world.location(); + float3 _b = b->object_to_world.location(); + if (_a.x != _b.x) { + return _a.x < _b.x; + } + else if (_a.y != _b.y) { + return _a.y < _b.y; + } + else if (_a.z != _b.z) { + return _a.z < _b.z; + } + else { + /* Fallback to memory address, since there's no good alternative. */ + return a < b; + } + }); /* Insert grids in UBO in sorted order. */ int grids_len = 0; - for (VolumeProbe *grid : grid_loaded) { + for (IrradianceGrid *grid : grid_loaded) { grid->grid_index = grids_len; grids_infos_buf_[grids_len++] = *grid; } /* Insert world grid last. */ - VolumeProbeData grid; + IrradianceGridData grid; grid.world_to_grid_transposed = float3x4::identity(); grid.grid_size = int3(1); grid.brick_offset = bricks_infos_buf_.size(); @@ -252,7 +253,7 @@ void VolumeProbeModule::set_view(View & /*view*/) for (auto it = grid_loaded.rbegin(); it != grid_loaded.rend(); ++it) { grid_start_index--; - VolumeProbe *grid = *it; + IrradianceGrid *grid = *it; if (!grid->do_update) { continue; } @@ -307,7 +308,7 @@ void VolumeProbeModule::set_view(View & /*view*/) } if (irradiance_a_tx.is_valid() == false) { - inst_.info += "Error: Could not allocate irradiance staging texture\n"; + inst_.info = "Error: Could not allocate irradiance staging texture"; /* Avoid undefined behavior with uninitialized values. Still load a clear texture. */ float4 zero(0.0f); irradiance_a_tx.ensure_3d(GPU_RGB16F, int3(1), usage, zero); @@ -390,7 +391,7 @@ void VolumeProbeModule::set_view(View & /*view*/) do_update_world_ = false; } -void VolumeProbeModule::viewport_draw(View &view, GPUFrameBuffer *view_fb) +void IrradianceCache::viewport_draw(View &view, GPUFrameBuffer *view_fb) { if (!inst_.is_baking()) { debug_pass_draw(view, view_fb); @@ -398,33 +399,33 @@ void VolumeProbeModule::viewport_draw(View &view, GPUFrameBuffer *view_fb) } } -void VolumeProbeModule::debug_pass_draw(View &view, GPUFrameBuffer *view_fb) +void IrradianceCache::debug_pass_draw(View &view, GPUFrameBuffer *view_fb) { switch (inst_.debug_mode) { case eDebugMode::DEBUG_IRRADIANCE_CACHE_SURFELS_NORMAL: - inst_.info += "Debug Mode: Surfels Normal\n"; + inst_.info = "Debug Mode: Surfels Normal"; break; case eDebugMode::DEBUG_IRRADIANCE_CACHE_SURFELS_CLUSTER: - inst_.info += "Debug Mode: Surfels Cluster\n"; + inst_.info = "Debug Mode: Surfels Cluster"; break; case eDebugMode::DEBUG_IRRADIANCE_CACHE_SURFELS_IRRADIANCE: - inst_.info += "Debug Mode: Surfels Irradiance\n"; + inst_.info = "Debug Mode: Surfels Irradiance"; break; case eDebugMode::DEBUG_IRRADIANCE_CACHE_SURFELS_VISIBILITY: - inst_.info += "Debug Mode: Surfels Visibility\n"; + inst_.info = "Debug Mode: Surfels Visibility"; break; case eDebugMode::DEBUG_IRRADIANCE_CACHE_VALIDITY: - inst_.info += "Debug Mode: Irradiance Validity\n"; + inst_.info = "Debug Mode: Irradiance Validity"; break; case eDebugMode::DEBUG_IRRADIANCE_CACHE_VIRTUAL_OFFSET: - inst_.info += "Debug Mode: Virtual Offset\n"; + inst_.info = "Debug Mode: Virtual Offset"; break; default: /* Nothing to display. */ return; } - for (const VolumeProbe &grid : inst_.light_probes.volume_map_.values()) { + for (const IrradianceGrid &grid : inst_.light_probes.grid_map_.values()) { if (grid.cache == nullptr) { continue; } @@ -526,13 +527,13 @@ void VolumeProbeModule::debug_pass_draw(View &view, GPUFrameBuffer *view_fb) } } -void VolumeProbeModule::display_pass_draw(View &view, GPUFrameBuffer *view_fb) +void IrradianceCache::display_pass_draw(View &view, GPUFrameBuffer *view_fb) { if (!display_grids_enabled_) { return; } - for (const VolumeProbe &grid : inst_.light_probes.volume_map_.values()) { + for (const IrradianceGrid &grid : inst_.light_probes.grid_map_.values()) { if (!grid.viewport_display || grid.viewport_display_size == 0.0f || !grid.cache || !grid.cache->grid_static_cache) { @@ -700,7 +701,7 @@ void IrradianceBake::sync() sub.shader_set(inst_.shaders.static_shader_get(SURFEL_RAY)); sub.bind_ssbo(SURFEL_BUF_SLOT, &surfels_buf_); sub.bind_ssbo(CAPTURE_BUF_SLOT, &capture_info_buf_); - sub.bind_resources(inst_.sphere_probes); + sub.bind_resources(inst_.reflection_probes); sub.push_constant("radiance_src", &radiance_src_); sub.push_constant("radiance_dst", &radiance_dst_); sub.barrier(GPU_BARRIER_SHADER_STORAGE); @@ -713,7 +714,7 @@ void IrradianceBake::sync() pass.shader_set(inst_.shaders.static_shader_get(LIGHTPROBE_IRRADIANCE_RAY)); pass.bind_ssbo(SURFEL_BUF_SLOT, &surfels_buf_); pass.bind_ssbo(CAPTURE_BUF_SLOT, &capture_info_buf_); - pass.bind_resources(inst_.sphere_probes); + pass.bind_resources(inst_.reflection_probes); pass.bind_ssbo("list_start_buf", &list_start_buf_); pass.bind_ssbo("list_info_buf", &list_info_buf_); pass.push_constant("radiance_src", &radiance_src_); @@ -740,9 +741,9 @@ void IrradianceBake::sync() } } -void IrradianceBake::surfel_raster_views_sync(const float3 &scene_min, - const float3 &scene_max, - const float4x4 &probe_to_world) +void IrradianceBake::surfel_raster_views_sync(float3 scene_min, + float3 scene_max, + float4x4 probe_to_world) { using namespace blender::math; @@ -814,7 +815,7 @@ void IrradianceBake::surfels_create(const Object &probe_object) const ::LightProbe *lightprobe = static_cast<::LightProbe *>(probe_object.data); int3 grid_resolution = int3(&lightprobe->grid_resolution_x); - float4x4 grid_local_to_world = invert(probe_object.world_to_object()); + float4x4 grid_local_to_world = invert(float4x4(probe_object.world_to_object)); /* TODO(fclem): Options. */ capture_info_buf_.capture_world_direct = capture_world_; @@ -824,14 +825,15 @@ void IrradianceBake::surfels_create(const Object &probe_object) capture_info_buf_.capture_indirect = capture_indirect_; capture_info_buf_.capture_emission = capture_emission_; - LightProbeModule &light_probes = inst_.light_probes; - SphereProbeData &world_data = *static_cast(&light_probes.world_sphere_); - capture_info_buf_.world_atlas_coord = world_data.atlas_coord; + ReflectionProbeModule &reflections = inst_.reflection_probes; + ReflectionProbeAtlasCoordinate atlas_coord = reflections.world_atlas_coord_get(); + ReflectionProbeCoordinate coord = atlas_coord.as_sampling_coord(reflections.atlas_extent()); + capture_info_buf_.world_atlas_coord = coord; dispatch_per_grid_sample_ = math::divide_ceil(grid_resolution, int3(IRRADIANCE_GRID_GROUP_SIZE)); capture_info_buf_.irradiance_grid_size = grid_resolution; capture_info_buf_.irradiance_grid_local_to_world = grid_local_to_world; - capture_info_buf_.irradiance_grid_world_to_local = probe_object.world_to_object(); + capture_info_buf_.irradiance_grid_world_to_local = float4x4(probe_object.world_to_object); capture_info_buf_.irradiance_grid_world_to_local_rotation = float4x4( invert(normalize(float3x3(grid_local_to_world)))); @@ -866,7 +868,7 @@ void IrradianceBake::surfels_create(const Object &probe_object) !irradiance_L1_b_tx_.is_valid() || !irradiance_L1_c_tx_.is_valid() || !validity_tx_.is_valid() || !virtual_offset_tx_.is_valid()) { - inst_.info += "Error: Not enough memory to bake " + std::string(probe_object.id.name) + ".\n"; + inst_.info = "Error: Not enough memory to bake " + std::string(probe_object.id.name) + "."; do_break_ = true; return; } @@ -927,7 +929,7 @@ void IrradianceBake::surfels_create(const Object &probe_object) float epsilon = 1.0f / surfel_density_; scene_min -= epsilon; scene_max += epsilon; - surfel_raster_views_sync(scene_min, scene_max, probe_object.object_to_world()); + surfel_raster_views_sync(scene_min, scene_max, float4x4(probe_object.object_to_world)); DRW_stats_group_end(); @@ -972,8 +974,7 @@ void IrradianceBake::surfels_create(const Object &probe_object) if (required_mem > max_size) { capture_info_buf_.surfel_len = 0u; capture_info_buf_.push_update(); - inst_.info += "Error: Not enough memory to bake " + std::string(probe_object.id.name) + - ".\n"; + inst_.info = "Error: Not enough memory to bake " + std::string(probe_object.id.name) + "."; do_break_ = true; return; } diff --git a/source/blender/draw/engines/eevee_next/eevee_irradiance_cache.hh b/source/blender/draw/engines/eevee_next/eevee_irradiance_cache.hh index 175d67dd5b1..a8cd1a6750f 100644 --- a/source/blender/draw/engines/eevee_next/eevee_irradiance_cache.hh +++ b/source/blender/draw/engines/eevee_next/eevee_irradiance_cache.hh @@ -24,7 +24,7 @@ class Instance; class CapturePipeline; class ShadowModule; class Camera; -class SphereProbeModule; +class ReflectionProbeModule; /** * Baking related pass and data. Not used at runtime. @@ -146,9 +146,7 @@ class IrradianceBake { } /** Create the views used to rasterize the scene into surfel representation. */ - void surfel_raster_views_sync(const float3 &scene_min, - const float3 &scene_max, - const float4x4 &probe_to_world); + void surfel_raster_views_sync(float3 scene_min, float3 scene_max, float4x4 probe_to_world); /** Create a surfel representation of the scene from the probe using the capture pipeline. */ void surfels_create(const Object &probe_object); /** Evaluate direct lighting (and also clear the surfels radiance). */ @@ -188,7 +186,7 @@ class IrradianceBake { * Runtime container of diffuse indirect lighting. * Also have debug and baking components. */ -class VolumeProbeModule { +class IrradianceCache { public: IrradianceBake bake; @@ -204,27 +202,27 @@ class VolumeProbeModule { /** Reserved atlas brick for world irradiance. */ int world_brick_index_ = 0; /** Data structure used to index irradiance cache pages inside the atlas. */ - VolumeProbeDataBuf grids_infos_buf_ = {"grids_infos_buf_"}; + IrradianceGridDataBuf grids_infos_buf_ = {"grids_infos_buf_"}; IrradianceBrickBuf bricks_infos_buf_ = {"bricks_infos_buf_"}; /** Pool of atlas regions to allocate to different grids. */ Vector brick_pool_; /** Stream data into the irradiance atlas texture. */ - PassSimple grid_upload_ps_ = {"VolumeProbeModule.Upload"}; + PassSimple grid_upload_ps_ = {"IrradianceCache.Upload"}; /** If true, will trigger the reupload of all grid data instead of just streaming new ones. */ bool do_full_update_ = true; /** Display debug data. */ - PassSimple debug_ps_ = {"VolumeProbeModule.Debug"}; + PassSimple debug_ps_ = {"IrradianceCache.Debug"}; /** Debug surfel elements copied from the light cache. */ draw::StorageArrayBuffer debug_surfels_buf_; /** Display grid cache data. */ bool display_grids_enabled_ = false; - PassSimple display_grids_ps_ = {"VolumeProbeModule.Display Grids"}; + PassSimple display_grids_ps_ = {"IrradianceCache.Display Grids"}; public: - VolumeProbeModule(Instance &inst) : bake(inst), inst_(inst){}; - ~VolumeProbeModule(){}; + IrradianceCache(Instance &inst) : bake(inst), inst_(inst){}; + ~IrradianceCache(){}; void init(); void sync(); @@ -238,14 +236,14 @@ class VolumeProbeModule { { pass.bind_ubo(IRRADIANCE_GRID_BUF_SLOT, &grids_infos_buf_); pass.bind_ssbo(IRRADIANCE_BRICK_BUF_SLOT, &bricks_infos_buf_); - pass.bind_texture(VOLUME_PROBE_TEX_SLOT, &irradiance_atlas_tx_); + pass.bind_texture(IRRADIANCE_ATLAS_TEX_SLOT, &irradiance_atlas_tx_); } private: void debug_pass_draw(View &view, GPUFrameBuffer *view_fb); void display_pass_draw(View &view, GPUFrameBuffer *view_fb); - friend class SphereProbeModule; + friend class ReflectionProbeModule; }; } // namespace blender::eevee diff --git a/source/blender/draw/engines/eevee_next/eevee_light.cc b/source/blender/draw/engines/eevee_next/eevee_light.cc index 384f7cc9931..26ee49d5e45 100644 --- a/source/blender/draw/engines/eevee_next/eevee_light.cc +++ b/source/blender/draw/engines/eevee_next/eevee_light.cc @@ -62,7 +62,7 @@ void Light::sync(ShadowModule &shadows, const Object *ob, float threshold) this->influence_radius_invsqr_volume = 1.0f / square_f(max_ff(influence_radius_volume, 1e-8f)); this->color = float3(&la->r) * la->energy; - normalize_m4_m4_ex(this->object_mat.ptr(), ob->object_to_world().ptr(), scale); + normalize_m4_m4_ex(this->object_mat.ptr(), ob->object_to_world, scale); /* Make sure we have consistent handedness (in case of negatively scaled Z axis). */ float3 cross = math::cross(float3(this->_right), float3(this->_up)); if (math::dot(cross, float3(this->_back)) < 0.0f) { @@ -78,8 +78,6 @@ void Light::sync(ShadowModule &shadows, const Object *ob, float threshold) this->power[LIGHT_SPECULAR] = la->spec_fac * shape_power; this->power[LIGHT_VOLUME] = la->volume_fac * point_power; - this->pcf_radius = la->shadow_filter_radius; - eLightType new_type = to_light_type(la->type, la->area_shape, la->mode & LA_USE_SOFT_FALLOFF); if (assign_if_different(this->type, new_type)) { shadow_discard_safe(shadows); @@ -97,23 +95,12 @@ void Light::sync(ShadowModule &shadows, const Object *ob, float threshold) /* Reuse shape radius as near clip plane. */ /* This assumes `shape_parameters_set` has already set `radius_squared`. */ float radius = math::sqrt(this->radius_squared); - float shadow_radius = la->shadow_softness_factor * radius; - if (ELEM(la->type, LA_LOCAL, LA_SPOT)) { - /* `shape_parameters_set` can increase the radius of point and spot lights to ensure a - * minimum radius/energy ratio. - * But we don't want to take that into account for computing the shadow-map projection, - * since non-zero radius introduces padding (required for soft-shadows tracing), reducing - * the effective resolution of shadow-maps. - * So we use the original light radius instead. */ - shadow_radius = la->shadow_softness_factor * la->radius; - } this->punctual->sync(this->type, this->object_mat, la->spotsize, radius, this->influence_radius_max, - la->shadow_softness_factor, - shadow_radius); + la->shadow_softness_factor); } } else { @@ -351,7 +338,7 @@ void LightModule::end_sync() if (sun_lights_len_ + local_lights_len_ > CULLING_MAX_ITEM) { sun_lights_len_ = min_ii(sun_lights_len_, CULLING_MAX_ITEM); local_lights_len_ = min_ii(local_lights_len_, CULLING_MAX_ITEM - sun_lights_len_); - inst_.info += "Error: Too many lights in the scene.\n"; + inst_.info = "Error: Too many lights in the scene."; } lights_len_ = sun_lights_len_ + local_lights_len_; @@ -484,7 +471,7 @@ void LightModule::set_view(View &view, const int2 extent) void LightModule::debug_draw(View &view, GPUFrameBuffer *view_fb) { if (inst_.debug_mode == eDebugMode::DEBUG_LIGHT_CULLING) { - inst_.info += "Debug Mode: Light Culling Validation\n"; + inst_.info = "Debug Mode: Light Culling Validation"; inst_.hiz_buffer.update(); GPU_framebuffer_bind(view_fb); inst_.manager->submit(debug_draw_ps_, view); diff --git a/source/blender/draw/engines/eevee_next/eevee_lightcache.cc b/source/blender/draw/engines/eevee_next/eevee_lightcache.cc index 693e41958d1..420d403def0 100644 --- a/source/blender/draw/engines/eevee_next/eevee_lightcache.cc +++ b/source/blender/draw/engines/eevee_next/eevee_lightcache.cc @@ -12,7 +12,7 @@ #include "DRW_render.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_lightprobe.h" #include "DNA_lightprobe_types.h" @@ -129,7 +129,7 @@ class LightBake { bake_result_[i] = nullptr; } /* Propagate the cache to evaluated object. */ - DEG_id_tag_update(&orig_ob->id, ID_RECALC_SYNC_TO_EVAL | ID_RECALC_SHADING); + DEG_id_tag_update(&orig_ob->id, ID_RECALC_COPY_ON_WRITE | ID_RECALC_SHADING); } } @@ -142,7 +142,7 @@ class LightBake { DEG_evaluate_on_framechange(depsgraph_, frame_); if (delay_ms_ > 0) { - BLI_time_sleep_ms(delay_ms_); + BLI_sleep_ms(delay_ms_); } context_enable(); diff --git a/source/blender/draw/engines/eevee_next/eevee_lightprobe.cc b/source/blender/draw/engines/eevee_next/eevee_lightprobe.cc index 4c2edb7abb0..404b8246d75 100644 --- a/source/blender/draw/engines/eevee_next/eevee_lightprobe.cc +++ b/source/blender/draw/engines/eevee_next/eevee_lightprobe.cc @@ -6,8 +6,7 @@ * \ingroup eevee * * Module that handles light probe update tagging. - * Lighting data is contained in their respective module `VolumeProbeModule`, `SphereProbeModule` - * and `PlanarProbeModule`. + * Lighting data is contained in their respective module `IrradianceCache` and `ReflectionProbes`. */ #include "DNA_lightprobe_types.h" @@ -18,64 +17,17 @@ #include "draw_debug.hh" -#include - namespace blender::eevee { -/* -------------------------------------------------------------------- */ -/** \name Light-Probe Module - * \{ */ - -LightProbeModule::LightProbeModule(Instance &inst) : inst_(inst) -{ - /* Initialize the world probe. */ - world_sphere_.clipping_distances = float2(1.0f, 10.0f); - world_sphere_.world_to_probe_transposed = float3x4::identity(); - world_sphere_.influence_shape = SHAPE_ELIPSOID; - world_sphere_.parallax_shape = SHAPE_ELIPSOID; - /* Full influence. */ - world_sphere_.influence_scale = 0.0f; - world_sphere_.influence_bias = 1.0f; - world_sphere_.parallax_distance = 1e10f; - /* In any case, the world must always be up to valid and used for render. */ - world_sphere_.use_for_render = true; -} - -static eLightProbeResolution resolution_to_probe_resolution_enum(int resolution) -{ - switch (resolution) { - case 64: - return LIGHT_PROBE_RESOLUTION_64; - case 128: - return LIGHT_PROBE_RESOLUTION_128; - case 256: - return LIGHT_PROBE_RESOLUTION_256; - case 512: - return LIGHT_PROBE_RESOLUTION_512; - case 1024: - return LIGHT_PROBE_RESOLUTION_1024; - default: - /* Default to maximum resolution because the old max was 4K for Legacy-EEVEE. */ - case 2048: - return LIGHT_PROBE_RESOLUTION_2048; - } -} - -void LightProbeModule::init() -{ - const SceneEEVEE &sce_eevee = inst_.scene->eevee; - sphere_object_resolution_ = resolution_to_probe_resolution_enum(sce_eevee.gi_cubemap_resolution); -} - void LightProbeModule::begin_sync() { auto_bake_enabled_ = inst_.is_viewport() && (inst_.scene->eevee.flag & SCE_EEVEE_GI_AUTOBAKE) != 0; } -void LightProbeModule::sync_volume(const Object *ob, ObjectHandle &handle) +void LightProbeModule::sync_grid(const Object *ob, ObjectHandle &handle) { - VolumeProbe &grid = volume_map_.lookup_or_add_default(handle.object_key); + IrradianceGrid &grid = grid_map_.lookup_or_add_default(handle.object_key); grid.used = true; if (handle.recalc != 0 || grid.initialized == false) { const ::LightProbe *lightprobe = static_cast(ob->data); @@ -83,7 +35,7 @@ void LightProbeModule::sync_volume(const Object *ob, ObjectHandle &handle) grid.initialized = true; grid.updated = true; grid.surfel_density = static_cast(ob->data)->surfel_density; - grid.object_to_world = ob->object_to_world(); + grid.object_to_world = float4x4(ob->object_to_world); grid.world_to_object = float4x4( math::normalize(math::transpose(float3x3(grid.object_to_world)))); @@ -101,77 +53,17 @@ void LightProbeModule::sync_volume(const Object *ob, ObjectHandle &handle) grid.viewport_display_size = lightprobe->data_display_size; /* Force reupload. */ - inst_.volume_probes.bricks_free(grid.bricks); + inst_.irradiance_cache.bricks_free(grid.bricks); } } -void LightProbeModule::sync_sphere(const Object *ob, ObjectHandle &handle) +void LightProbeModule::sync_cube(ObjectHandle &handle) { - SphereProbe &cube = sphere_map_.lookup_or_add_default(handle.object_key); + ReflectionCube &cube = cube_map_.lookup_or_add_default(handle.object_key); cube.used = true; if (handle.recalc != 0 || cube.initialized == false) { - const ::LightProbe &light_probe = *(::LightProbe *)ob->data; - cube.initialized = true; - cube.updated = true; - cube.do_render = true; - - SphereProbeModule &probe_module = inst_.sphere_probes; - eLightProbeResolution probe_resolution = sphere_object_resolution_; - int subdivision_lvl = probe_module.subdivision_level_get(probe_resolution); - - if (cube.atlas_coord.subdivision_lvl != subdivision_lvl) { - cube.atlas_coord.free(); - cube.atlas_coord = find_empty_atlas_region(subdivision_lvl); - SphereProbeData &cube_data = *static_cast(&cube); - /* Update gpu data sampling coordinates. */ - cube_data.atlas_coord = cube.atlas_coord.as_sampling_coord(); - /* Coordinates have changed. Area might contain random data. Do not use for rendering. */ - cube.use_for_render = false; - } - - bool use_custom_parallax = (light_probe.flag & LIGHTPROBE_FLAG_CUSTOM_PARALLAX) != 0; - float influence_distance = light_probe.distinf; - float influence_falloff = light_probe.falloff; - float parallax_distance = light_probe.distpar; - parallax_distance = use_custom_parallax ? max_ff(parallax_distance, influence_distance) : - influence_distance; - - auto to_eevee_shape = [](int bl_shape_type) { - return (bl_shape_type == LIGHTPROBE_SHAPE_BOX) ? SHAPE_CUBOID : SHAPE_ELIPSOID; - }; - cube.influence_shape = to_eevee_shape(light_probe.attenuation_type); - cube.parallax_shape = to_eevee_shape(light_probe.parallax_type); - - float4x4 object_to_world = math::scale(ob->object_to_world(), float3(influence_distance)); - cube.location = object_to_world.location(); - cube.volume = math::abs(math::determinant(object_to_world)); - cube.world_to_probe_transposed = float3x4(math::transpose(math::invert(object_to_world))); - cube.influence_scale = 1.0 / max_ff(1e-8f, influence_falloff); - cube.influence_bias = cube.influence_scale; - cube.parallax_distance = parallax_distance / influence_distance; - cube.clipping_distances = float2(light_probe.clipsta, light_probe.clipend); - - cube.viewport_display = light_probe.flag & LIGHTPROBE_FLAG_SHOW_DATA; - cube.viewport_display_size = light_probe.data_display_size; - } -} - -void LightProbeModule::sync_planar(const Object *ob, ObjectHandle &handle) -{ - PlanarProbe &plane = planar_map_.lookup_or_add_default(handle.object_key); - plane.used = true; - if (handle.recalc != 0 || plane.initialized == false) { - const ::LightProbe *light_probe = (::LightProbe *)ob->data; - - plane.initialized = true; - plane.updated = true; - plane.plane_to_world = ob->object_to_world(); - plane.plane_to_world.z_axis() = math::normalize(plane.plane_to_world.z_axis()) * - light_probe->distinf; - plane.world_to_plane = math::invert(plane.plane_to_world); - plane.clipping_offset = light_probe->clipsta; - plane.viewport_display = (light_probe->flag & LIGHTPROBE_FLAG_SHOW_DATA) != 0; + cube_update_ = true; } } @@ -180,184 +72,84 @@ void LightProbeModule::sync_probe(const Object *ob, ObjectHandle &handle) const ::LightProbe *lightprobe = static_cast(ob->data); switch (lightprobe->type) { case LIGHTPROBE_TYPE_SPHERE: - sync_sphere(ob, handle); + sync_cube(handle); return; case LIGHTPROBE_TYPE_PLANE: - sync_planar(ob, handle); + /* TODO(fclem): Remove support? Add support? */ return; case LIGHTPROBE_TYPE_VOLUME: - sync_volume(ob, handle); + sync_grid(ob, handle); return; } BLI_assert_unreachable(); } -void LightProbeModule::sync_world(const ::World *world, bool has_update) -{ - const eLightProbeResolution probe_resolution = static_cast( - world->probe_resolution); - - SphereProbeModule &sph_module = inst_.sphere_probes; - int subdivision_lvl = sph_module.subdivision_level_get(probe_resolution); - - if (subdivision_lvl != world_sphere_.atlas_coord.subdivision_lvl) { - world_sphere_.atlas_coord.free(); - world_sphere_.atlas_coord = find_empty_atlas_region(subdivision_lvl); - SphereProbeData &world_data = *static_cast(&world_sphere_); - world_data.atlas_coord = world_sphere_.atlas_coord.as_sampling_coord(); - has_update = true; - } - - if (has_update) { - world_sphere_.do_render = true; - sph_module.tag_world_irradiance_for_update(); - } -} - void LightProbeModule::end_sync() { - /* Check for deleted or updated grid. */ - volume_update_ = false; - volume_map_.remove_if([&](const Map::MutableItem &item) { - VolumeProbe &grid = item.value; - bool remove_grid = !grid.used; - if (grid.updated || remove_grid) { - volume_update_ = true; - } - grid.updated = false; - grid.used = false; - return remove_grid; - }); - - /* Check for deleted or updated cube. */ - sphere_update_ = false; - sphere_map_.remove_if([&](const Map::MutableItem &item) { - SphereProbe &cube = item.value; - bool remove_cube = !cube.used; - if (cube.updated || remove_cube) { - sphere_update_ = true; - } - cube.updated = false; - cube.used = false; - return remove_cube; - }); - - /* Check for deleted or updated plane. */ - planar_update_ = false; - planar_map_.remove_if([&](const Map::MutableItem &item) { - PlanarProbe &plane = item.value; - bool remove_plane = !plane.used; - if (plane.updated || remove_plane) { - planar_update_ = true; - } - plane.updated = false; - plane.used = false; - return remove_plane; - }); -} - -SphereProbeAtlasCoord LightProbeModule::find_empty_atlas_region(int subdivision_level) const -{ - int layer_count = sphere_layer_count(); - SphereProbeAtlasCoord::LocationFinder location_finder(layer_count, subdivision_level); - - location_finder.mark_space_used(world_sphere_.atlas_coord); - for (const SphereProbe &probe : sphere_map_.values()) { - location_finder.mark_space_used(probe.atlas_coord); - } - return location_finder.first_free_spot(); -} - -int LightProbeModule::sphere_layer_count() const -{ - int max_layer = world_sphere_.atlas_coord.atlas_layer; - for (const SphereProbe &probe : sphere_map_.values()) { - max_layer = max_ii(max_layer, probe.atlas_coord.atlas_layer); - } - int layer_count = max_layer + 1; - return layer_count; -} - -/** \} */ - -/* -------------------------------------------------------------------- */ -/** \name SphereProbeAtlasCoord - * \{ */ - -SphereProbeAtlasCoord::LocationFinder::LocationFinder(int allocated_layer_count, - int subdivision_level) -{ - subdivision_level_ = subdivision_level; - areas_per_dimension_ = 1 << subdivision_level_; - areas_per_layer_ = square_i(areas_per_dimension_); - /* Always add an additional layer to make sure that there is always a free area. - * If this area is chosen the atlas will grow. */ - int area_len = (allocated_layer_count + 1) * areas_per_layer_; - areas_occupancy_.resize(area_len, false); -} - -void SphereProbeAtlasCoord::LocationFinder::mark_space_used(const SphereProbeAtlasCoord &coord) -{ - if (coord.atlas_layer == -1) { - /* Coordinate not allocated yet. */ - return; - } - /* The input probe data can be stored in a different subdivision level and should tag all areas - * of the target subdivision level. Shift right if subdivision is higher, left if lower. */ - const int shift_right = max_ii(coord.subdivision_lvl - subdivision_level_, 0); - const int shift_left = max_ii(subdivision_level_ - coord.subdivision_lvl, 0); - const int2 pos_in_location_finder = (coord.area_location() >> shift_right) << shift_left; - /* Tag all areas this probe overlaps. */ - const int layer_offset = coord.atlas_layer * areas_per_layer_; - const int areas_overlapped_per_dim = 1 << shift_left; - for (const int y : IndexRange(areas_overlapped_per_dim)) { - for (const int x : IndexRange(areas_overlapped_per_dim)) { - const int2 pos = pos_in_location_finder + int2(x, y); - const int area_index = pos.x + pos.y * areas_per_dimension_; - areas_occupancy_[area_index + layer_offset].set(); + { + /* Check for deleted or updated grid. */ + grid_update_ = false; + auto it_end = grid_map_.items().end(); + for (auto it = grid_map_.items().begin(); it != it_end; ++it) { + IrradianceGrid &grid = (*it).value; + if (grid.updated) { + grid.updated = false; + grid_update_ = true; + } + if (!grid.used) { + inst_.irradiance_cache.bricks_free(grid.bricks); + grid_map_.remove(it); + grid_update_ = true; + continue; + } + /* Untag for next sync. */ + grid.used = false; } } -} - -SphereProbeAtlasCoord SphereProbeAtlasCoord::LocationFinder::first_free_spot() const -{ - SphereProbeAtlasCoord result; - result.subdivision_lvl = subdivision_level_; - for (int index : areas_occupancy_.index_range()) { - if (!areas_occupancy_[index]) { - result.atlas_layer = index / areas_per_layer_; - result.area_index = index % areas_per_layer_; - return result; + { + /* Check for deleted or updated cube. */ + cube_update_ = false; + auto it_end = cube_map_.items().end(); + for (auto it = cube_map_.items().begin(); it != it_end; ++it) { + ReflectionCube &cube = (*it).value; + if (cube.updated) { + cube.updated = false; + cube_update_ = true; + } + if (!cube.used) { + cube_map_.remove(it); + cube_update_ = true; + continue; + } + /* Untag for next sync. */ + cube.used = false; } } - /* There should always be a free area. See constructor. */ - BLI_assert_unreachable(); - return result; -} -void SphereProbeAtlasCoord::LocationFinder::print_debug() const -{ - std::ostream &os = std::cout; - int layer = 0, row = 0, column = 0; - os << "subdivision " << subdivision_level_ << "\n"; - for (bool spot_taken : areas_occupancy_) { - if (row == 0 && column == 0) { - os << "layer " << layer << "\n"; - } - os << (spot_taken ? 'X' : '-'); - column++; - if (column == areas_per_dimension_) { - os << "\n"; - column = 0; - row++; - } - if (row == areas_per_dimension_) { - row = 0; - layer++; +#if 0 /* TODO make this work with new per object light cache. */ + /* If light-cache auto-update is enable we tag the relevant part + * of the cache to update and fire up a baking job. */ + if (auto_bake_enabled_ && (grid_update_ || cube_update_)) { + Scene *original_scene = DEG_get_input_scene(inst_.depsgraph); + LightCache *light_cache = original_scene->eevee.light_cache_data; + + if (light_cache != nullptr) { + if (grid_update_) { + light_cache->flag |= LIGHTCACHE_UPDATE_GRID; + } + /* TODO(fclem): Reflection Cube-map should capture albedo + normal and be + * relit at runtime. So no dependency like in the old system. */ + if (cube_update_) { + light_cache->flag |= LIGHTCACHE_UPDATE_CUBE; + } + /* Tag the lightcache to auto update. */ + light_cache->flag |= LIGHTCACHE_UPDATE_AUTO; + /* Use a notifier to trigger the operator after drawing. */ + /* TODO(fclem): Avoid usage of global DRW. */ + WM_event_add_notifier(DRW_context_state_get()->evil_C, NC_LIGHTPROBE, original_scene); } } +#endif } -/** \} */ - } // namespace blender::eevee diff --git a/source/blender/draw/engines/eevee_next/eevee_lightprobe.hh b/source/blender/draw/engines/eevee_next/eevee_lightprobe.hh index 3c1095e3db8..0d047729d7d 100644 --- a/source/blender/draw/engines/eevee_next/eevee_lightprobe.hh +++ b/source/blender/draw/engines/eevee_next/eevee_lightprobe.hh @@ -6,120 +6,27 @@ * \ingroup eevee * * Module that handles light probe update tagging. - * Lighting data is contained in their respective module `VolumeProbeModule`, `SphereProbeModule` - * and `PlanarProbeModule`. + * Lighting data is contained in their respective module `IrradianceCache` and `ReflectionProbes`. */ #pragma once -#include "BLI_bit_vector.hh" #include "BLI_map.hh" -#include "eevee_defines.hh" #include "eevee_sync.hh" namespace blender::eevee { class Instance; -class VolumeProbeModule; - -/* -------------------------------------------------------------------- */ -/** \name SphereProbeAtlasCoord - * \{ */ - -struct SphereProbeAtlasCoord { - /** On which layer of the texture array is this reflection probe stored. */ - int atlas_layer = -1; - /** Gives the extent of this probe relative to the atlas size. */ - int subdivision_lvl = -1; - /** Area index within the layer with the according subdivision level. */ - int area_index = -1; - - /** Release the current atlas space held by this probe. */ - void free() - { - atlas_layer = -1; - } - - /* Return the area extent in pixel. */ - int area_extent(int mip_lvl = 0) const - { - return SPHERE_PROBE_ATLAS_RES >> (subdivision_lvl + mip_lvl); - } - - /* Coordinate of the area in [0..area_count_per_dimension[ range. */ - int2 area_location() const - { - const int area_count_per_dimension = 1 << subdivision_lvl; - return int2(area_index % area_count_per_dimension, area_index / area_count_per_dimension); - } - - /* Coordinate of the bottom left corner of the area in [0..SPHERE_PROBE_ATLAS_RES[ range. */ - int2 area_offset(int mip_lvl = 0) const - { - return area_location() * area_extent(mip_lvl); - } - - SphereProbeUvArea as_sampling_coord() const - { - SphereProbeUvArea coord; - coord.scale = float(area_extent()) / SPHERE_PROBE_ATLAS_RES; - coord.offset = float2(area_offset()) / SPHERE_PROBE_ATLAS_RES; - coord.layer = atlas_layer; - return coord; - } - - SphereProbePixelArea as_write_coord(int mip_lvl) const - { - SphereProbePixelArea coord; - coord.extent = area_extent(mip_lvl); - coord.offset = area_offset(); - coord.layer = atlas_layer; - return coord; - } - - /** - * Utility class to find a location in the probe atlas that can be used to store a new probe in - * a specified subdivision level. - * - * The allocation space is subdivided in target subdivision level and is multi layered. - * A layer has `(2 ^ subdivision_lvl) ^ 2` areas. - * - * All allocated probe areas are then process and the candidate areas containing allocated probes - * are marked as occupied. The location finder then return the first available area. - */ - class LocationFinder { - BitVector<> areas_occupancy_; - int subdivision_level_; - /* Area count for the given subdivision level. */ - int areas_per_dimension_; - int areas_per_layer_; - - public: - LocationFinder(int allocated_layer_count, int subdivision_level); - - /* Mark space to be occupied by the given probe_data. */ - void mark_space_used(const SphereProbeAtlasCoord &coord); - - SphereProbeAtlasCoord first_free_spot() const; - - void print_debug() const; - }; -}; - -/** \} */ +class IrradianceCache; struct LightProbe { bool used = false; bool initialized = false; - /* NOTE: Might be not needed if depsgraph updates work as intended. */ bool updated = false; - /** Display debug visuals in the viewport. */ - bool viewport_display = false; - float viewport_display_size = 0.0f; }; -struct VolumeProbe : public LightProbe, VolumeProbeData { +struct IrradianceGrid : public LightProbe, IrradianceGridData { /** Copy of the transform matrix. */ float4x4 object_to_world; /** Precomputed inverse transform with normalized axes. No position. Used for rotating SH. */ @@ -144,104 +51,41 @@ struct VolumeProbe : public LightProbe, VolumeProbeData { float dilation_threshold; float dilation_radius; float intensity; + /** Display irradiance samples in the viewport. */ + bool viewport_display; + float viewport_display_size; }; -struct SphereProbe : public LightProbe, SphereProbeData { - /** Used to sort the probes by priority. */ - float volume; - /** True if the area in the atlas needs to be updated. */ - bool do_render = true; - /** False if the area in the atlas contains undefined data. */ - bool use_for_render = false; - /** Far and near clipping distances for rendering. */ - float2 clipping_distances; - /** Atlas region this probe is rendered at (or will be rendered at). */ - SphereProbeAtlasCoord atlas_coord; -}; - -struct PlanarProbe : public LightProbe, PlanarProbeData { - /* Copy of object matrices. */ - float4x4 plane_to_world; - float4x4 world_to_plane; - /* Offset to the clipping plane in the normal direction. */ - float clipping_offset; - /* Index in the resource array. */ - int resource_index; - - public: - /** - * Update the PlanarProbeData part of the struct. - * `view` is the view we want to render this probe with. - */ - void set_view(const draw::View &view, int layer_id); - - /** - * Create the reflection clip plane equation that clips along the XY plane of the given - * transform. The `clip_offset` will push the clip plane a bit further to avoid missing pixels in - * reflections. The transform does not need to be normalized but is expected to be orthogonal. - * \note Only works after `set_view` was called. - */ - float4 reflection_clip_plane_get() - { - return float4(-normal, math::dot(normal, plane_to_world.location()) - clipping_offset); - } - - private: - /** - * Create the reflection matrix that reflect along the XY plane of the given transform. - * The transform does not need to be normalized but is expected to be orthogonal. - */ - float4x4 reflection_matrix_get() - { - return plane_to_world * math::from_scale(float3(1, 1, -1)) * world_to_plane; - } -}; +struct ReflectionCube : public LightProbe {}; class LightProbeModule { - friend class IrradianceBake; - friend class VolumeProbeModule; - friend class PlanarProbeModule; - friend class SphereProbeModule; + friend class IrradianceCache; private: Instance &inst_; /** Light Probe map to detect deletion and store associated data. */ - Map volume_map_; - Map sphere_map_; - Map planar_map_; - /* World probe is stored separately. */ - SphereProbe world_sphere_; - /** True if a light-probe update was detected. */ - bool volume_update_; - bool sphere_update_; - bool planar_update_; + Map grid_map_; + Map cube_map_; + /** True if a grid update was detected. It will trigger a bake if auto bake is enabled. */ + bool grid_update_; + /** True if a grid update was detected. It will trigger a bake if auto bake is enabled. */ + bool cube_update_; /** True if the auto bake feature is enabled & available in this context. */ bool auto_bake_enabled_; - eLightProbeResolution sphere_object_resolution_ = LIGHT_PROBE_RESOLUTION_64; - public: - LightProbeModule(Instance &inst); + LightProbeModule(Instance &inst) : inst_(inst){}; ~LightProbeModule(){}; - void init(); - void begin_sync(); + + void sync_cube(ObjectHandle &handle); + void sync_grid(const Object *ob, ObjectHandle &handle); + void sync_probe(const Object *ob, ObjectHandle &handle); - void sync_world(const ::World *world, bool has_update); + void end_sync(); - - private: - void sync_sphere(const Object *ob, ObjectHandle &handle); - void sync_volume(const Object *ob, ObjectHandle &handle); - void sync_planar(const Object *ob, ObjectHandle &handle); - - /** Get the number of atlas layers needed to store light probe spheres. */ - int sphere_layer_count() const; - - /** Returns coordinates of an area in the atlas for a probe with the given subdivision level. */ - SphereProbeAtlasCoord find_empty_atlas_region(int subdivision_level) const; }; } // namespace blender::eevee diff --git a/source/blender/draw/engines/eevee_next/eevee_lookdev.cc b/source/blender/draw/engines/eevee_next/eevee_lookdev.cc index bc8dce3c04c..b3caa771c55 100644 --- a/source/blender/draw/engines/eevee_next/eevee_lookdev.cc +++ b/source/blender/draw/engines/eevee_next/eevee_lookdev.cc @@ -235,8 +235,8 @@ void LookdevModule::sync_pass(PassSimple &pass, pass.bind_image("aov_value_img", dummy_aov_value_tx_); pass.bind_resources(inst_.uniform_data); pass.bind_resources(inst_.hiz_buffer.front); - pass.bind_resources(inst_.sphere_probes); - pass.bind_resources(inst_.volume_probes); + pass.bind_resources(inst_.reflection_probes); + pass.bind_resources(inst_.irradiance_cache); pass.bind_resources(inst_.shadows); pass.bind_resources(inst_.volume.result); pass.bind_resources(inst_.cryptomatte); diff --git a/source/blender/draw/engines/eevee_next/eevee_material.hh b/source/blender/draw/engines/eevee_next/eevee_material.hh index ed4ded64cf9..3e8ad8675d5 100644 --- a/source/blender/draw/engines/eevee_next/eevee_material.hh +++ b/source/blender/draw/engines/eevee_next/eevee_material.hh @@ -134,9 +134,6 @@ static inline eClosureBits shader_closure_bits_from_flag(const GPUMaterial *gpum if (GPU_material_flag_get(gpumat, GPU_MATFLAG_GLOSSY)) { closure_bits |= CLOSURE_REFLECTION; } - if (GPU_material_flag_get(gpumat, GPU_MATFLAG_COAT)) { - closure_bits |= CLOSURE_CLEARCOAT; - } if (GPU_material_flag_get(gpumat, GPU_MATFLAG_SUBSURFACE)) { closure_bits |= CLOSURE_SSS; } diff --git a/source/blender/draw/engines/eevee_next/eevee_motion_blur.cc b/source/blender/draw/engines/eevee_next/eevee_motion_blur.cc index ee889ea0913..ca9891c0e1c 100644 --- a/source/blender/draw/engines/eevee_next/eevee_motion_blur.cc +++ b/source/blender/draw/engines/eevee_next/eevee_motion_blur.cc @@ -28,7 +28,7 @@ void MotionBlurModule::init() const Scene *scene = inst_.scene; const ViewLayer *view_layer = inst_.view_layer; - enabled_ = (scene->r.mode & R_MBLUR) != 0; + enabled_ = (scene->eevee.flag & SCE_EEVEE_MOTION_BLUR_ENABLED) != 0; if (enabled_) { enabled_ = (view_layer->layflag & SCE_LAY_MOTION_BLUR) != 0; } @@ -46,8 +46,8 @@ void MotionBlurModule::init() initial_frame_ = scene->r.cfra; initial_subframe_ = scene->r.subframe; frame_time_ = initial_frame_ + initial_subframe_; - shutter_position_ = scene->r.motion_blur_position; - shutter_time_ = scene->r.motion_blur_shutter; + shutter_position_ = scene->eevee.motion_blur_position; + shutter_time_ = scene->eevee.motion_blur_shutter; data_.depth_scale = scene->eevee.motion_blur_depth_scale; motion_blur_fx_enabled_ = true; /* TODO(fclem): UI option. */ @@ -108,13 +108,13 @@ void MotionBlurModule::step() float MotionBlurModule::shutter_time_to_scene_time(float time) { switch (shutter_position_) { - case SCE_MB_START: + case SCE_EEVEE_MB_START: /* No offset. */ break; - case SCE_MB_CENTER: + case SCE_EEVEE_MB_CENTER: time -= 0.5f; break; - case SCE_MB_END: + case SCE_EEVEE_MB_END: time -= 1.0; break; default: diff --git a/source/blender/draw/engines/eevee_next/eevee_motion_blur.hh b/source/blender/draw/engines/eevee_next/eevee_motion_blur.hh index 1bb4921d9d3..290facd368a 100644 --- a/source/blender/draw/engines/eevee_next/eevee_motion_blur.hh +++ b/source/blender/draw/engines/eevee_next/eevee_motion_blur.hh @@ -75,7 +75,7 @@ class MotionBlurModule { float initial_subframe_; /** Time of the frame we are rendering. */ float frame_time_; - /** Enum controlling when the shutter opens. See RenderData.motion_blur_position. */ + /** Enum controlling when the shutter opens. See SceneEEVEE.motion_blur_position. */ int shutter_position_; /** Time in scene frame the shutter is open. Controls the amount of blur. */ float shutter_time_; diff --git a/source/blender/draw/engines/eevee_next/eevee_pipeline.cc b/source/blender/draw/engines/eevee_next/eevee_pipeline.cc index 95c66a4eb21..29aed713e79 100644 --- a/source/blender/draw/engines/eevee_next/eevee_pipeline.cc +++ b/source/blender/draw/engines/eevee_next/eevee_pipeline.cc @@ -10,8 +10,12 @@ * This file is only for shading passes. Other passes are declared in their own module. */ -#include "eevee_pipeline.hh" +#include "GPU_capabilities.h" + #include "eevee_instance.hh" + +#include "eevee_pipeline.hh" + #include "eevee_shadow.hh" #include "draw_common.hh" @@ -291,8 +295,8 @@ void ForwardPipeline::sync() opaque_ps_.bind_resources(inst_.volume.result); opaque_ps_.bind_resources(inst_.sampling); opaque_ps_.bind_resources(inst_.hiz_buffer.front); - opaque_ps_.bind_resources(inst_.volume_probes); - opaque_ps_.bind_resources(inst_.sphere_probes); + opaque_ps_.bind_resources(inst_.irradiance_cache); + opaque_ps_.bind_resources(inst_.reflection_probes); } opaque_single_sided_ps_ = &opaque_ps_.sub("SingleSided"); @@ -319,8 +323,8 @@ void ForwardPipeline::sync() sub.bind_resources(inst_.volume.result); sub.bind_resources(inst_.sampling); sub.bind_resources(inst_.hiz_buffer.front); - sub.bind_resources(inst_.volume_probes); - sub.bind_resources(inst_.sphere_probes); + sub.bind_resources(inst_.irradiance_cache); + sub.bind_resources(inst_.reflection_probes); } } @@ -368,7 +372,7 @@ PassMain::Sub *ForwardPipeline::prepass_transparent_add(const Object *ob, state |= DRW_STATE_CULL_BACK; } has_transparent_ = true; - float sorting_value = math::dot(float3(ob->object_to_world().location()), camera_forward_); + float sorting_value = math::dot(float3(ob->object_to_world[3]), camera_forward_); PassMain::Sub *pass = &transparent_ps_.sub(GPU_material_get_name(gpumat), sorting_value); pass->state_set(state); pass->material_set(*inst_.manager, gpumat); @@ -384,7 +388,7 @@ PassMain::Sub *ForwardPipeline::material_transparent_add(const Object *ob, state |= DRW_STATE_CULL_BACK; } has_transparent_ = true; - float sorting_value = math::dot(float3(ob->object_to_world().location()), camera_forward_); + float sorting_value = math::dot(float3(ob->object_to_world[3]), camera_forward_); PassMain::Sub *pass = &transparent_ps_.sub(GPU_material_get_name(gpumat), sorting_value); pass->state_set(state); pass->material_set(*inst_.manager, gpumat); @@ -406,7 +410,7 @@ void ForwardPipeline::render(View &view, Framebuffer &prepass_fb, Framebuffer &c inst_.hiz_buffer.set_dirty(); inst_.shadows.set_view(view, inst_.render_buffers.depth_tx); - inst_.volume_probes.set_view(view); + inst_.irradiance_cache.set_view(view); if (has_opaque_) { combined_fb.bind(); @@ -459,8 +463,8 @@ void DeferredLayerBase::gbuffer_pass_sync(Instance &inst) * Non-NPR shaders will override these resource bindings. */ gbuffer_ps_.bind_resources(inst.lights); gbuffer_ps_.bind_resources(inst.shadows); - gbuffer_ps_.bind_resources(inst.sphere_probes); - gbuffer_ps_.bind_resources(inst.volume_probes); + gbuffer_ps_.bind_resources(inst.reflection_probes); + gbuffer_ps_.bind_resources(inst.irradiance_cache); DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_EQUAL; @@ -587,8 +591,8 @@ void DeferredLayer::end_sync() sub.bind_resources(inst_.shadows); sub.bind_resources(inst_.sampling); sub.bind_resources(inst_.hiz_buffer.front); - sub.bind_resources(inst_.sphere_probes); - sub.bind_resources(inst_.volume_probes); + sub.bind_resources(inst_.reflection_probes); + sub.bind_resources(inst_.irradiance_cache); sub.state_stencil(0xFFu, i + 1, 0xFFu); sub.draw_procedural(GPU_PRIM_TRIS, 1, 3); } @@ -715,10 +719,40 @@ void DeferredLayer::render(View &main_view, /* Update for lighting pass or AO node. */ inst_.hiz_buffer.update(); - inst_.volume_probes.set_view(render_view); + inst_.irradiance_cache.set_view(render_view); inst_.shadows.set_view(render_view, inst_.render_buffers.depth_tx); - inst_.gbuffer.bind(gbuffer_fb); + if (/* FIXME(fclem): Vulkan doesn't implement load / store config yet. */ + GPU_backend_get_type() == GPU_BACKEND_VULKAN || + /* FIXME(fclem): Metal has bug in backend. */ + GPU_backend_get_type() == GPU_BACKEND_METAL) + { + inst_.gbuffer.header_tx.clear(uint4(0)); + } + + if (GPU_backend_get_type() == GPU_BACKEND_METAL) { + /* TODO(fclem): Load/store action is broken on Metal. */ + GPU_framebuffer_bind(gbuffer_fb); + } + else { + if (!GPU_stencil_export_support()) { + /* Clearing custom load-store frame-buffers is invalid, + * clear the stencil as a regular frame-buffer first. */ + GPU_framebuffer_bind(gbuffer_fb); + GPU_framebuffer_clear_stencil(gbuffer_fb, 0x0u); + } + GPU_framebuffer_bind_ex( + gbuffer_fb, + { + {GPU_LOADACTION_LOAD, GPU_STOREACTION_STORE}, /* Depth */ + {GPU_LOADACTION_LOAD, GPU_STOREACTION_STORE}, /* Combined */ + {GPU_LOADACTION_CLEAR, GPU_STOREACTION_STORE, {0}}, /* GBuf Header */ + {GPU_LOADACTION_DONT_CARE, GPU_STOREACTION_STORE}, /* GBuf Normal*/ + {GPU_LOADACTION_DONT_CARE, GPU_STOREACTION_STORE}, /* GBuf Closure */ + {GPU_LOADACTION_DONT_CARE, GPU_STOREACTION_STORE}, /* GBuf Closure 2*/ + }); + } + inst_.manager->submit(gbuffer_ps_, render_view); for (int i = 0; i < ARRAY_SIZE(direct_radiance_txs_); i++) { @@ -1040,7 +1074,7 @@ GridAABB VolumePipeline::grid_aabb_from_object(Object *ob) BoundBox bb; BKE_boundbox_init_from_minmax(&bb, bounds.min, bounds.max); for (float3 l_corner : bb.vec) { - float3 w_corner = math::transform_point(ob->object_to_world(), l_corner); + float3 w_corner = math::transform_point(float4x4(ob->object_to_world), l_corner); /* Note that this returns the nearest cell corner coordinate. * So sub-froxel AABB will effectively return the same coordinate * for each corner (making it empty and skipped) unless it @@ -1126,39 +1160,38 @@ bool VolumePipeline::use_hit_list() const /** \} */ /* -------------------------------------------------------------------- */ -/** \name Deferred Probe Pipeline - * - * Closure data are written to intermediate buffer allowing screen space processing. +/** \name Deferred Probe Layer * \{ */ -void DeferredProbePipeline::begin_sync() +void DeferredProbeLayer::begin_sync() { - draw::PassMain &pass = opaque_layer_.prepass_ps_; - pass.init(); { - /* Common resources. */ + prepass_ps_.init(); + { + /* Common resources. */ - /* Textures. */ - pass.bind_texture(RBUFS_UTILITY_TEX_SLOT, inst_.pipelines.utility_tx); + /* Textures. */ + prepass_ps_.bind_texture(RBUFS_UTILITY_TEX_SLOT, inst_.pipelines.utility_tx); - pass.bind_resources(inst_.uniform_data); - pass.bind_resources(inst_.velocity); - pass.bind_resources(inst_.sampling); + prepass_ps_.bind_resources(inst_.uniform_data); + prepass_ps_.bind_resources(inst_.velocity); + prepass_ps_.bind_resources(inst_.sampling); + } + + DRWState state_depth_only = DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS; + /* Only setting up static pass because we don't use motion vectors for light-probes. */ + prepass_double_sided_static_ps_ = &prepass_ps_.sub("DoubleSided"); + prepass_double_sided_static_ps_->state_set(state_depth_only); + prepass_single_sided_static_ps_ = &prepass_ps_.sub("SingleSided"); + prepass_single_sided_static_ps_->state_set(state_depth_only | DRW_STATE_CULL_BACK); } - DRWState state_depth_only = DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS; - /* Only setting up static pass because we don't use motion vectors for light-probes. */ - opaque_layer_.prepass_double_sided_static_ps_ = &pass.sub("DoubleSided"); - opaque_layer_.prepass_double_sided_static_ps_->state_set(state_depth_only); - opaque_layer_.prepass_single_sided_static_ps_ = &pass.sub("SingleSided"); - opaque_layer_.prepass_single_sided_static_ps_->state_set(state_depth_only | DRW_STATE_CULL_BACK); - - opaque_layer_.gbuffer_pass_sync(inst_); + this->gbuffer_pass_sync(inst_); } -void DeferredProbePipeline::end_sync() +void DeferredProbeLayer::end_sync() { - if (opaque_layer_.closure_bits_ & (CLOSURE_DIFFUSE | CLOSURE_REFLECTION)) { + if (closure_bits_ & (CLOSURE_DIFFUSE | CLOSURE_REFLECTION)) { PassSimple &pass = eval_light_ps_; pass.init(); /* Use depth test to reject background pixels. */ @@ -1173,39 +1206,97 @@ void DeferredProbePipeline::end_sync() pass.bind_resources(inst_.shadows); pass.bind_resources(inst_.sampling); pass.bind_resources(inst_.hiz_buffer.front); - pass.bind_resources(inst_.volume_probes); + pass.bind_resources(inst_.irradiance_cache); pass.barrier(GPU_BARRIER_TEXTURE_FETCH | GPU_BARRIER_SHADER_IMAGE_ACCESS); pass.draw_procedural(GPU_PRIM_TRIS, 1, 3); } } -PassMain::Sub *DeferredProbePipeline::prepass_add(::Material *blender_mat, GPUMaterial *gpumat) +PassMain::Sub *DeferredProbeLayer::prepass_add(::Material *blender_mat, GPUMaterial *gpumat) { PassMain::Sub *pass = (blender_mat->blend_flag & MA_BL_CULL_BACKFACE) ? - opaque_layer_.prepass_single_sided_static_ps_ : - opaque_layer_.prepass_double_sided_static_ps_; + prepass_single_sided_static_ps_ : + prepass_double_sided_static_ps_; return &pass->sub(GPU_material_get_name(gpumat)); } -PassMain::Sub *DeferredProbePipeline::material_add(::Material *blender_mat, GPUMaterial *gpumat) +PassMain::Sub *DeferredProbeLayer::material_add(::Material *blender_mat, GPUMaterial *gpumat) { eClosureBits closure_bits = shader_closure_bits_from_flag(gpumat); - opaque_layer_.closure_bits_ |= closure_bits; - opaque_layer_.closure_count_ = max_ii(opaque_layer_.closure_count_, count_bits_i(closure_bits)); + closure_bits_ |= closure_bits; + closure_count_ = max_ii(closure_count_, count_bits_i(closure_bits)); bool has_shader_to_rgba = (closure_bits & CLOSURE_SHADER_TO_RGBA) != 0; bool backface_culling = (blender_mat->blend_flag & MA_BL_CULL_BACKFACE) != 0; PassMain::Sub *pass = (has_shader_to_rgba) ? - ((backface_culling) ? opaque_layer_.gbuffer_single_sided_hybrid_ps_ : - opaque_layer_.gbuffer_double_sided_hybrid_ps_) : - ((backface_culling) ? opaque_layer_.gbuffer_single_sided_ps_ : - opaque_layer_.gbuffer_double_sided_ps_); + ((backface_culling) ? gbuffer_single_sided_hybrid_ps_ : + gbuffer_double_sided_hybrid_ps_) : + ((backface_culling) ? gbuffer_single_sided_ps_ : + gbuffer_double_sided_ps_); return &pass->sub(GPU_material_get_name(gpumat)); } +void DeferredProbeLayer::render(View &view, + Framebuffer &prepass_fb, + Framebuffer &combined_fb, + Framebuffer &gbuffer_fb, + int2 extent) +{ + inst_.pipelines.data.is_probe_reflection = true; + inst_.uniform_data.push_update(); + + GPU_framebuffer_bind(prepass_fb); + inst_.manager->submit(prepass_ps_, view); + + inst_.hiz_buffer.set_source(&inst_.render_buffers.depth_tx); + inst_.lights.set_view(view, extent); + inst_.shadows.set_view(view, inst_.render_buffers.depth_tx); + inst_.irradiance_cache.set_view(view); + + /* Update for lighting pass. */ + inst_.hiz_buffer.update(); + + GPU_framebuffer_bind(gbuffer_fb); + inst_.manager->submit(gbuffer_ps_, view); + + GPU_framebuffer_bind(combined_fb); + inst_.manager->submit(eval_light_ps_, view); + + inst_.pipelines.data.is_probe_reflection = false; + inst_.uniform_data.push_update(); +} + +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Deferred Probe Pipeline + * + * Closure data are written to intermediate buffer allowing screen space processing. + * \{ */ + +void DeferredProbePipeline::begin_sync() +{ + opaque_layer_.begin_sync(); +} + +void DeferredProbePipeline::end_sync() +{ + opaque_layer_.end_sync(); +} + +PassMain::Sub *DeferredProbePipeline::prepass_add(::Material *blender_mat, GPUMaterial *gpumat) +{ + return opaque_layer_.prepass_add(blender_mat, gpumat); +} + +PassMain::Sub *DeferredProbePipeline::material_add(::Material *blender_mat, GPUMaterial *gpumat) +{ + return opaque_layer_.material_add(blender_mat, gpumat); +} + void DeferredProbePipeline::render(View &view, Framebuffer &prepass_fb, Framebuffer &combined_fb, @@ -1213,24 +1304,7 @@ void DeferredProbePipeline::render(View &view, int2 extent) { GPU_debug_group_begin("Probe.Render"); - - GPU_framebuffer_bind(prepass_fb); - inst_.manager->submit(opaque_layer_.prepass_ps_, view); - - inst_.hiz_buffer.set_source(&inst_.render_buffers.depth_tx); - inst_.lights.set_view(view, extent); - inst_.shadows.set_view(view, inst_.render_buffers.depth_tx); - inst_.volume_probes.set_view(view); - - /* Update for lighting pass. */ - inst_.hiz_buffer.update(); - - inst_.gbuffer.bind(gbuffer_fb); - inst_.manager->submit(opaque_layer_.gbuffer_ps_, view); - - GPU_framebuffer_bind(combined_fb); - inst_.manager->submit(eval_light_ps_, view); - + opaque_layer_.render(view, prepass_fb, combined_fb, gbuffer_fb, extent); GPU_debug_group_end(); } @@ -1273,8 +1347,8 @@ void PlanarProbePipeline::begin_sync() pass.bind_resources(inst_.shadows); pass.bind_resources(inst_.sampling); pass.bind_resources(inst_.hiz_buffer.front); - pass.bind_resources(inst_.sphere_probes); - pass.bind_resources(inst_.volume_probes); + pass.bind_resources(inst_.reflection_probes); + pass.bind_resources(inst_.irradiance_cache); pass.barrier(GPU_BARRIER_TEXTURE_FETCH | GPU_BARRIER_SHADER_IMAGE_ACCESS); pass.draw_procedural(GPU_PRIM_TRIS, 1, 3); } @@ -1334,12 +1408,22 @@ void PlanarProbePipeline::render(View &view, inst_.hiz_buffer.set_source(&depth_layer_tx, 0); inst_.lights.set_view(view, extent); inst_.shadows.set_view(view, depth_layer_tx); - inst_.volume_probes.set_view(view); + inst_.irradiance_cache.set_view(view); /* Update for lighting pass. */ inst_.hiz_buffer.update(); - inst_.gbuffer.bind(gbuffer_fb); + GPU_framebuffer_bind_ex( + gbuffer_fb, + { + {GPU_LOADACTION_LOAD, GPU_STOREACTION_STORE}, /* Depth */ + {GPU_LOADACTION_CLEAR, GPU_STOREACTION_STORE, {0.0f}}, /* Combined */ + {GPU_LOADACTION_CLEAR, GPU_STOREACTION_STORE, {0}}, /* GBuf Header */ + {GPU_LOADACTION_DONT_CARE, GPU_STOREACTION_STORE}, /* GBuf Normal*/ + {GPU_LOADACTION_DONT_CARE, GPU_STOREACTION_STORE}, /* GBuf Closure */ + {GPU_LOADACTION_DONT_CARE, GPU_STOREACTION_STORE}, /* GBuf Closure 2*/ + }); + inst_.manager->submit(gbuffer_ps_, view); GPU_framebuffer_bind(combined_fb); @@ -1364,10 +1448,10 @@ void CapturePipeline::sync() /* Surfel output is done using a SSBO, so no need for a fragment shader output color or depth. */ /* WORKAROUND: Avoid rasterizer discard, but the shaders actually use no fragment output. */ surface_ps_.state_set(DRW_STATE_WRITE_STENCIL); - surface_ps_.framebuffer_set(&inst_.volume_probes.bake.empty_raster_fb_); + surface_ps_.framebuffer_set(&inst_.irradiance_cache.bake.empty_raster_fb_); - surface_ps_.bind_ssbo(SURFEL_BUF_SLOT, &inst_.volume_probes.bake.surfels_buf_); - surface_ps_.bind_ssbo(CAPTURE_BUF_SLOT, &inst_.volume_probes.bake.capture_info_buf_); + surface_ps_.bind_ssbo(SURFEL_BUF_SLOT, &inst_.irradiance_cache.bake.surfels_buf_); + surface_ps_.bind_ssbo(CAPTURE_BUF_SLOT, &inst_.irradiance_cache.bake.capture_info_buf_); surface_ps_.bind_texture(RBUFS_UTILITY_TEX_SLOT, inst_.pipelines.utility_tx); /* TODO(fclem): Remove. Bind to get the camera data, diff --git a/source/blender/draw/engines/eevee_next/eevee_pipeline.hh b/source/blender/draw/engines/eevee_next/eevee_pipeline.hh index 709e3aa9991..dcbab759b26 100644 --- a/source/blender/draw/engines/eevee_next/eevee_pipeline.hh +++ b/source/blender/draw/engines/eevee_next/eevee_pipeline.hh @@ -200,8 +200,7 @@ struct DeferredLayerBase { /* SSS require an additional layer compared to diffuse. */ count += count_bits_i(closure_bits_ & CLOSURE_SSS); /* Reflection and refraction can have at most two layers. */ - count += 2 * count_bits_i(closure_bits_ & - (CLOSURE_REFRACTION | CLOSURE_REFLECTION | CLOSURE_CLEARCOAT)); + count += 2 * count_bits_i(closure_bits_ & (CLOSURE_REFRACTION | CLOSURE_REFLECTION)); return count; } @@ -211,9 +210,8 @@ struct DeferredLayerBase { /* TODO(fclem): We could count the number of different tangent frame in the shader and use * min(tangent_frame_count, closure_count) once we have the normal reuse optimization. * For now, allocate a split normal layer for each Closure. */ - int count = count_bits_i(closure_bits_ & - (CLOSURE_REFRACTION | CLOSURE_REFLECTION | CLOSURE_CLEARCOAT | - CLOSURE_DIFFUSE | CLOSURE_TRANSLUCENT)); + int count = count_bits_i(closure_bits_ & (CLOSURE_REFRACTION | CLOSURE_REFLECTION | + CLOSURE_DIFFUSE | CLOSURE_TRANSLUCENT)); /* Count the additional infos layer needed by some closures. */ count += count_bits_i(closure_bits_ & (CLOSURE_SSS | CLOSURE_TRANSLUCENT)); return count; @@ -487,16 +485,38 @@ class VolumePipeline { /** \name Deferred Probe Capture. * \{ */ -class DeferredProbePipeline { +class DeferredProbePipeline; + +class DeferredProbeLayer : DeferredLayerBase { + friend DeferredProbePipeline; + private: Instance &inst_; - DeferredLayerBase opaque_layer_; - PassSimple eval_light_ps_ = {"EvalLights"}; public: - DeferredProbePipeline(Instance &inst) : inst_(inst){}; + DeferredProbeLayer(Instance &inst) : inst_(inst){}; + + void begin_sync(); + void end_sync(); + + PassMain::Sub *prepass_add(::Material *blender_mat, GPUMaterial *gpumat); + PassMain::Sub *material_add(::Material *blender_mat, GPUMaterial *gpumat); + + void render(View &view, + Framebuffer &prepass_fb, + Framebuffer &combined_fb, + Framebuffer &gbuffer_fb, + int2 extent); +}; + +class DeferredProbePipeline { + private: + DeferredProbeLayer opaque_layer_; + + public: + DeferredProbePipeline(Instance &inst) : opaque_layer_(inst){}; void begin_sync(); void end_sync(); diff --git a/source/blender/draw/engines/eevee_next/eevee_planar_probes.cc b/source/blender/draw/engines/eevee_next/eevee_planar_probes.cc index 0e746dd81d9..3c9a7e62d0a 100644 --- a/source/blender/draw/engines/eevee_next/eevee_planar_probes.cc +++ b/source/blender/draw/engines/eevee_next/eevee_planar_probes.cc @@ -13,6 +13,18 @@ using namespace blender::math; /** \name Planar Probe * \{ */ +void PlanarProbe::sync(const float4x4 &world_to_object, + float clipping_offset, + float influence_distance, + bool viewport_display) +{ + this->plane_to_world = float4x4(world_to_object); + this->plane_to_world.z_axis() = normalize(this->plane_to_world.z_axis()) * influence_distance; + this->world_to_plane = invert(this->plane_to_world); + this->clipping_offset = clipping_offset; + this->viewport_display = viewport_display; +} + void PlanarProbe::set_view(const draw::View &view, int layer_id) { this->viewmat = view.viewmat() * reflection_matrix_get(); @@ -28,6 +40,16 @@ void PlanarProbe::set_view(const draw::View &view, int layer_id) this->layer_id = layer_id; } +float4x4 PlanarProbe::reflection_matrix_get() +{ + return plane_to_world * from_scale(float3(1, 1, -1)) * world_to_plane; +} + +float4 PlanarProbe::reflection_clip_plane_get() +{ + return float4(-normal, dot(normal, plane_to_world.location()) - clipping_offset); +} + /** \} */ /* -------------------------------------------------------------------- */ @@ -36,33 +58,47 @@ void PlanarProbe::set_view(const draw::View &view, int layer_id) void PlanarProbeModule::init() { - /* This triggers the compilation of clipped shader only if we can detect light-probe planes. */ - if (inst_.is_viewport()) { - /* This check needs to happen upfront before sync, so we use the previous sync result. */ - update_probes_ = !inst_.light_probes.planar_map_.is_empty(); + update_probes_ = !probes_.is_empty(); + do_display_draw_ = false; +} + +void PlanarProbeModule::begin_sync() +{ + for (PlanarProbe &probe : probes_.values()) { + probe.is_probe_used = false; } - else { - /* TODO(jbakker): should we check on the subtype as well? Now it also populates even when - * there are other light probes in the scene. */ - update_probes_ = DEG_id_type_any_exists(inst_.depsgraph, ID_LP); +} + +void PlanarProbeModule::sync_object(Object *ob, ObjectHandle &ob_handle) +{ + const ::LightProbe *light_probe = (::LightProbe *)ob->data; + if (light_probe->type != LIGHTPROBE_TYPE_PLANE) { + return; } - do_display_draw_ = false; + PlanarProbe &probe = find_or_insert(ob_handle); + probe.sync(float4x4(ob->object_to_world), + light_probe->clipsta, + light_probe->distinf, + light_probe->flag & LIGHTPROBE_FLAG_SHOW_DATA); + probe.is_probe_used = true; } void PlanarProbeModule::end_sync() { + probes_.remove_if([](const PlanarProbes::Item &item) { return !item.value.is_probe_used; }); + /* When first planar probes are enabled it can happen that the first sample is off. */ - if (!update_probes_ && !inst_.light_probes.planar_map_.is_empty()) { + if (!update_probes_ && !probes_.is_empty()) { DRW_viewport_request_redraw(); } } void PlanarProbeModule::set_view(const draw::View &main_view, int2 main_view_extent) { - GBuffer &gbuf = inst_.gbuffer; + GBuffer &gbuf = instance_.gbuffer; - const int64_t num_probes = inst_.light_probes.planar_map_.size(); + const int64_t num_probes = probes_.size(); /* TODO resolution percentage. */ int2 extent = main_view_extent; @@ -83,12 +119,12 @@ void PlanarProbeModule::set_view(const draw::View &main_view, int2 main_view_ext int resource_index = 0; int display_index = 0; - for (PlanarProbe &probe : inst_.light_probes.planar_map_.values()) { - if (resource_index == PLANAR_PROBE_MAX) { + for (PlanarProbe &probe : probes_.values()) { + if (resource_index == PLANAR_PROBES_MAX) { break; } - PlanarResources &res = resources_[resource_index]; + PlanarProbeResources &res = resources_[resource_index]; /* TODO Cull out of view planars. */ @@ -101,8 +137,8 @@ void PlanarProbeModule::set_view(const draw::View &main_view, int2 main_view_ext world_clip_buf_.push_update(); gbuf.acquire(extent, - inst_.pipelines.deferred.closure_layer_count(), - inst_.pipelines.deferred.normal_layer_count()); + instance_.pipelines.deferred.closure_layer_count(), + instance_.pipelines.deferred.normal_layer_count()); res.combined_fb.ensure(GPU_ATTACHMENT_TEXTURE_LAYER(depth_tx_, resource_index), GPU_ATTACHMENT_TEXTURE_LAYER(radiance_tx_, resource_index)); @@ -114,7 +150,7 @@ void PlanarProbeModule::set_view(const draw::View &main_view, int2 main_view_ext GPU_ATTACHMENT_TEXTURE_LAYER(gbuf.closure_tx.layer_view(0), 0), GPU_ATTACHMENT_TEXTURE_LAYER(gbuf.closure_tx.layer_view(1), 0)); - inst_.pipelines.planar.render( + instance_.pipelines.planar.render( res.view, depth_tx_.layer_view(resource_index), res.gbuffer_fb, res.combined_fb, extent); if (do_display_draw_ && probe.viewport_display) { @@ -126,7 +162,7 @@ void PlanarProbeModule::set_view(const draw::View &main_view, int2 main_view_ext gbuf.release(); - if (resource_index < PLANAR_PROBE_MAX) { + if (resource_index < PLANAR_PROBES_MAX) { /* Tag the end of the array. */ probe_planar_buf_[resource_index].layer_id = -1; } @@ -139,6 +175,12 @@ void PlanarProbeModule::set_view(const draw::View &main_view, int2 main_view_ext } } +PlanarProbe &PlanarProbeModule::find_or_insert(ObjectHandle &ob_handle) +{ + PlanarProbe &planar_probe = probes_.lookup_or_add_default(ob_handle.object_key.hash()); + return planar_probe; +} + void PlanarProbeModule::viewport_draw(View &view, GPUFrameBuffer *view_fb) { if (!do_display_draw_) { @@ -149,12 +191,12 @@ void PlanarProbeModule::viewport_draw(View &view, GPUFrameBuffer *view_fb) viewport_display_ps_.state_set(DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS_EQUAL | DRW_STATE_CULL_BACK); viewport_display_ps_.framebuffer_set(&view_fb); - viewport_display_ps_.shader_set(inst_.shaders.static_shader_get(DISPLAY_PROBE_PLANAR)); + viewport_display_ps_.shader_set(instance_.shaders.static_shader_get(DISPLAY_PROBE_PLANAR)); bind_resources(viewport_display_ps_); viewport_display_ps_.bind_ssbo("display_data_buf", display_data_buf_); viewport_display_ps_.draw_procedural(GPU_PRIM_TRIS, 1, display_data_buf_.size() * 6); - inst_.manager->submit(viewport_display_ps_, view); + instance_.manager->submit(viewport_display_ps_, view); } /** \} */ diff --git a/source/blender/draw/engines/eevee_next/eevee_planar_probes.hh b/source/blender/draw/engines/eevee_next/eevee_planar_probes.hh index e467a39ef2e..147ccac991e 100644 --- a/source/blender/draw/engines/eevee_next/eevee_planar_probes.hh +++ b/source/blender/draw/engines/eevee_next/eevee_planar_probes.hh @@ -22,43 +22,91 @@ class Instance; class HiZBuffer; struct ObjectHandle; +/* -------------------------------------------------------------------- */ +/** \name Planar Probe + * \{ */ + +struct PlanarProbe : ProbePlanarData { + /* Copy of object matrices. */ + float4x4 plane_to_world; + float4x4 world_to_plane; + /* Offset to the clipping plane in the normal direction. */ + float clipping_offset; + /* Index in the resource array. */ + int resource_index; + /* Pruning flag. */ + bool is_probe_used = false; + /** Display a debug plane in the viewport. */ + bool viewport_display = false; + + public: + void sync(const float4x4 &world_to_object, + float clipping_offset, + float influence_distance, + bool viewport_display); + + /** + * Update the ProbePlanarData part of the struct. + * `view` is the view we want to render this probe with. + */ + void set_view(const draw::View &view, int layer_id); + + /** + * Create the reflection clip plane equation that clips along the XY plane of the given + * transform. The `clip_offset` will push the clip plane a bit further to avoid missing pixels in + * reflections. The transform does not need to be normalized but is expected to be orthogonal. + * \note Only works after `set_view` was called. + */ + float4 reflection_clip_plane_get(); + + private: + /** + * Create the reflection matrix that reflect along the XY plane of the given transform. + * The transform does not need to be normalized but is expected to be orthogonal. + */ + float4x4 reflection_matrix_get(); +}; + +struct PlanarProbeResources : NonCopyable { + Framebuffer combined_fb = {"planar.combined_fb"}; + Framebuffer gbuffer_fb = {"planar.gbuffer_fb"}; + draw::View view = {"planar.view"}; +}; + +/** \} */ + /* -------------------------------------------------------------------- */ /** \name Planar Probe Module * \{ */ class PlanarProbeModule { - friend class Instance; - friend class HiZBuffer; - friend class PlanarProbePipeline; + using PlanarProbes = Map; private: - Instance &inst_; + Instance &instance_; - struct PlanarResources : NonCopyable { - Framebuffer combined_fb = {"planar.combined_fb"}; - Framebuffer gbuffer_fb = {"planar.gbuffer_fb"}; - draw::View view = {"planar.view"}; - }; - - std::array resources_; + PlanarProbes probes_; + std::array resources_; Texture radiance_tx_ = {"planar.radiance_tx"}; Texture depth_tx_ = {"planar.depth_tx"}; ClipPlaneBuf world_clip_buf_ = {"world_clip_buf"}; - PlanarProbeDataBuf probe_planar_buf_ = {"probe_planar_buf"}; + ProbePlanarDataBuf probe_planar_buf_ = {"probe_planar_buf"}; bool update_probes_ = false; /** Viewport data display drawing. */ bool do_display_draw_ = false; - PlanarProbeDisplayDataBuf display_data_buf_; + ProbePlanarDisplayDataBuf display_data_buf_; PassSimple viewport_display_ps_ = {"PlanarProbeModule.Viewport Display"}; public: - PlanarProbeModule(Instance &instance) : inst_(instance) {} + PlanarProbeModule(Instance &instance) : instance_(instance) {} void init(); + void begin_sync(); + void sync_object(Object *ob, ObjectHandle &ob_handle); void end_sync(); void set_view(const draw::View &main_view, int2 main_view_extent); @@ -78,6 +126,13 @@ class PlanarProbeModule { { return update_probes_; } + + private: + PlanarProbe &find_or_insert(ObjectHandle &ob_handle); + + friend class Instance; + friend class HiZBuffer; + friend class PlanarProbePipeline; }; /** \} */ diff --git a/source/blender/draw/engines/eevee_next/eevee_raytrace.cc b/source/blender/draw/engines/eevee_next/eevee_raytrace.cc index e46e6e254cc..1d5a2748c08 100644 --- a/source/blender/draw/engines/eevee_next/eevee_raytrace.cc +++ b/source/blender/draw/engines/eevee_next/eevee_raytrace.cc @@ -11,7 +11,7 @@ #include #include -#include "BKE_global.hh" +#include "BKE_global.h" #include "eevee_instance.hh" @@ -106,8 +106,8 @@ void RayTraceModule::sync() pass.bind_texture("depth_tx", &depth_tx); pass.bind_resources(inst_.uniform_data); pass.bind_resources(inst_.planar_probes); - pass.bind_resources(inst_.volume_probes); - pass.bind_resources(inst_.sphere_probes); + pass.bind_resources(inst_.irradiance_cache); + pass.bind_resources(inst_.reflection_probes); pass.bind_resources(inst_.gbuffer); /* TODO(@fclem): Use another dispatch with only tiles that touches planar captures. */ pass.dispatch(raytrace_tracing_dispatch_buf_); @@ -134,8 +134,8 @@ void RayTraceModule::sync() pass.bind_image("ray_radiance_img", &ray_radiance_tx_); pass.bind_resources(inst_.uniform_data); pass.bind_resources(inst_.sampling); - pass.bind_resources(inst_.volume_probes); - pass.bind_resources(inst_.sphere_probes); + pass.bind_resources(inst_.irradiance_cache); + pass.bind_resources(inst_.reflection_probes); pass.bind_resources(inst_.gbuffer); pass.dispatch(raytrace_tracing_dispatch_buf_); pass.barrier(GPU_BARRIER_SHADER_IMAGE_ACCESS); @@ -150,8 +150,8 @@ void RayTraceModule::sync() pass.bind_image("ray_radiance_img", &ray_radiance_tx_); pass.bind_texture("depth_tx", &depth_tx); pass.bind_resources(inst_.uniform_data); - pass.bind_resources(inst_.volume_probes); - pass.bind_resources(inst_.sphere_probes); + pass.bind_resources(inst_.irradiance_cache); + pass.bind_resources(inst_.reflection_probes); pass.bind_resources(inst_.sampling); pass.dispatch(raytrace_tracing_dispatch_buf_); pass.barrier(GPU_BARRIER_SHADER_IMAGE_ACCESS); @@ -269,8 +269,8 @@ void RayTraceModule::sync() pass.bind_resources(inst_.uniform_data); pass.bind_resources(inst_.sampling); pass.bind_resources(inst_.gbuffer); - pass.bind_resources(inst_.volume_probes); - pass.bind_resources(inst_.sphere_probes); + pass.bind_resources(inst_.irradiance_cache); + pass.bind_resources(inst_.reflection_probes); pass.dispatch(horizon_denoise_dispatch_buf_); pass.barrier(GPU_BARRIER_SHADER_IMAGE_ACCESS); } diff --git a/source/blender/draw/engines/eevee_next/eevee_reflection_probes.cc b/source/blender/draw/engines/eevee_next/eevee_reflection_probes.cc index 3e19627a687..e5408cb8f34 100644 --- a/source/blender/draw/engines/eevee_next/eevee_reflection_probes.cc +++ b/source/blender/draw/engines/eevee_next/eevee_reflection_probes.cc @@ -2,246 +2,512 @@ * * SPDX-License-Identifier: GPL-2.0-or-later */ -#include "eevee_reflection_probes.hh" +#include "BLI_bit_vector.hh" + #include "eevee_instance.hh" +#include "eevee_reflection_probes.hh" + +#include namespace blender::eevee { +/* -------------------------------------------------------------------- */ +/** \name ProbeLocationFinder + * \{ */ + +/** + * Utility class to find a location in the probes_tx_ that can be used to store a new probe in + * a specified subdivision level. + */ +class ProbeLocationFinder { + BitVector<> taken_spots_; + int probes_per_dimension_; + int probes_per_layer_; + int subdivision_level_; + + public: + ProbeLocationFinder(int num_layers, int subdivision_level) + { + subdivision_level_ = subdivision_level; + probes_per_dimension_ = 1 << subdivision_level_; + probes_per_layer_ = probes_per_dimension_ * probes_per_dimension_; + int num_spots = num_layers * probes_per_layer_; + taken_spots_.resize(num_spots, false); + } + + void print_debug() const + { + std::ostream &os = std::cout; + int layer = 0; + int row = 0; + int column = 0; + + os << "subdivision " << subdivision_level_ << "\n"; + + for (bool spot_taken : taken_spots_) { + if (row == 0 && column == 0) { + os << "layer " << layer << "\n"; + } + + os << (spot_taken ? '1' : '0'); + + column++; + if (column == probes_per_dimension_) { + os << "\n"; + column = 0; + row++; + } + if (row == probes_per_dimension_) { + row = 0; + layer++; + } + } + } + + /** + * Mark space to be occupied by the given probe_data. + * + * The input probe data can be stored in a different subdivision level and should be converted to + * the subdivision level what we are looking for. + */ + void mark_space_used(const ReflectionProbeAtlasCoordinate &coord) + { + const int shift_right = max_ii(coord.layer_subdivision - subdivision_level_, 0); + const int shift_left = max_ii(subdivision_level_ - coord.layer_subdivision, 0); + const int spots_per_dimension = 1 << shift_left; + const int probes_per_dimension_in_probe_data = 1 << coord.layer_subdivision; + const int2 pos_in_probe_data = int2(coord.area_index % probes_per_dimension_in_probe_data, + coord.area_index / probes_per_dimension_in_probe_data); + const int2 pos_in_location_finder = int2((pos_in_probe_data.x >> shift_right) << shift_left, + (pos_in_probe_data.y >> shift_right) << shift_left); + const int layer_offset = coord.layer * probes_per_layer_; + for (const int y : IndexRange(spots_per_dimension)) { + for (const int x : IndexRange(spots_per_dimension)) { + const int2 pos = pos_in_location_finder + int2(x, y); + const int area_index = pos.x + pos.y * probes_per_dimension_; + taken_spots_[area_index + layer_offset].set(); + } + } + } + + /** + * Get the first free spot. + * + * .x contains the layer the first free spot was detected. + * .y contains the area_index to use. + * + * Asserts when no free spot is found. ProbeLocationFinder should always be initialized with an + * additional layer to make sure that there is always a free spot. + */ + ReflectionProbeAtlasCoordinate first_free_spot() const + { + ReflectionProbeAtlasCoordinate result; + result.layer_subdivision = subdivision_level_; + for (int index : taken_spots_.index_range()) { + if (!taken_spots_[index]) { + result.layer = index / probes_per_layer_; + result.area_index = index % probes_per_layer_; + return result; + } + } + BLI_assert_unreachable(); + return result; + } +}; + +/** \} */ + /* -------------------------------------------------------------------- */ /** \name Reflection Probe Module * \{ */ -int SphereProbeModule::probe_render_extent() const +eLightProbeResolution ReflectionProbeModule::reflection_probe_resolution() const +{ + switch (instance_.scene->eevee.gi_cubemap_resolution) { + case 64: + return LIGHT_PROBE_RESOLUTION_64; + case 128: + return LIGHT_PROBE_RESOLUTION_128; + case 256: + return LIGHT_PROBE_RESOLUTION_256; + case 512: + return LIGHT_PROBE_RESOLUTION_512; + case 1024: + return LIGHT_PROBE_RESOLUTION_1024; + default: + return LIGHT_PROBE_RESOLUTION_2048; + } + return LIGHT_PROBE_RESOLUTION_2048; +} + +int ReflectionProbeModule::probe_render_extent() const { return instance_.scene->eevee.gi_cubemap_resolution / 2; } -void SphereProbeModule::init() +void ReflectionProbeModule::init() { - if (!instance_.is_viewport()) { - /* TODO(jbakker): should we check on the subtype as well? Now it also populates even when - * there are other light probes in the scene. */ - update_probes_next_sample_ = DEG_id_type_any_exists(instance_.depsgraph, ID_LP); + if (!is_initialized) { + is_initialized = true; + + /* Initialize the world probe. */ + + ReflectionProbe world_probe = {}; + world_probe.type = ReflectionProbe::Type::WORLD; + world_probe.is_probe_used = true; + world_probe.do_render = true; + world_probe.clipping_distances = float2(1.0f, 10.0f); + world_probe.world_to_probe_transposed = float3x4::identity(); + world_probe.influence_shape = SHAPE_ELIPSOID; + world_probe.parallax_shape = SHAPE_ELIPSOID; + /* Full influence. */ + world_probe.influence_scale = 0.0f; + world_probe.influence_bias = 1.0f; + world_probe.parallax_distance = 1e10f; + + probes_.add(world_object_key_, world_probe); + + probes_tx_.ensure_2d_array(GPU_RGBA16F, + int2(max_resolution_), + 1, + GPU_TEXTURE_USAGE_SHADER_WRITE | GPU_TEXTURE_USAGE_SHADER_READ, + nullptr, + REFLECTION_PROBE_MIPMAP_LEVELS); + GPU_texture_mipmap_mode(probes_tx_, true, true); + probes_tx_.clear(float4(0.0f)); } - do_display_draw_ = false; -} - -void SphereProbeModule::begin_sync() -{ - update_probes_this_sample_ = update_probes_next_sample_; - - LightProbeModule &light_probes = instance_.light_probes; - SphereProbeData &world_data = *static_cast(&light_probes.world_sphere_); { const RaytraceEEVEE &options = instance_.scene->eevee.ray_tracing_options; float probe_brightness_clamp = (options.sample_clamp > 0.0) ? options.sample_clamp : 1e20; PassSimple &pass = remap_ps_; pass.init(); - pass.shader_set(instance_.shaders.static_shader_get(SPHERE_PROBE_REMAP)); + pass.shader_set(instance_.shaders.static_shader_get(REFLECTION_PROBE_REMAP)); pass.bind_texture("cubemap_tx", &cubemap_tx_); pass.bind_texture("atlas_tx", &probes_tx_); pass.bind_image("atlas_img", &probes_tx_); pass.push_constant("probe_coord_packed", reinterpret_cast(&probe_sampling_coord_)); pass.push_constant("write_coord_packed", reinterpret_cast(&probe_write_coord_)); - pass.push_constant("world_coord_packed", reinterpret_cast(&world_data.atlas_coord)); + pass.push_constant("world_coord_packed", reinterpret_cast(&world_sampling_coord_)); + pass.push_constant("mip_level", &probe_mip_level_); pass.push_constant("probe_brightness_clamp", probe_brightness_clamp); pass.dispatch(&dispatch_probe_pack_); } - { - PassSimple &pass = convolve_ps_; - pass.init(); - pass.shader_set(instance_.shaders.static_shader_get(SPHERE_PROBE_CONVOLVE)); - pass.bind_texture("cubemap_tx", &cubemap_tx_); - pass.bind_texture("in_atlas_mip_tx", &convolve_input_); - pass.bind_image("out_atlas_mip_img", &convolve_output_); - pass.push_constant("probe_coord_packed", reinterpret_cast(&probe_sampling_coord_)); - pass.push_constant("write_coord_packed", reinterpret_cast(&probe_write_coord_)); - pass.push_constant("read_coord_packed", reinterpret_cast(&probe_read_coord_)); - pass.push_constant("read_lod", &convolve_lod_); - pass.barrier(GPU_BARRIER_TEXTURE_FETCH); - pass.dispatch(&dispatch_probe_convolve_); - } + { PassSimple &pass = update_irradiance_ps_; pass.init(); - pass.shader_set(instance_.shaders.static_shader_get(SPHERE_PROBE_UPDATE_IRRADIANCE)); - pass.push_constant("world_coord_packed", reinterpret_cast(&world_data.atlas_coord)); - pass.bind_image("irradiance_atlas_img", &instance_.volume_probes.irradiance_atlas_tx_); + pass.shader_set(instance_.shaders.static_shader_get(REFLECTION_PROBE_UPDATE_IRRADIANCE)); + pass.push_constant("world_coord_packed", reinterpret_cast(&world_sampling_coord_)); + pass.bind_image("irradiance_atlas_img", &instance_.irradiance_cache.irradiance_atlas_tx_); pass.bind_texture("reflection_probes_tx", &probes_tx_); pass.dispatch(int2(1, 1)); } + + do_display_draw_ = false; +} + +void ReflectionProbeModule::begin_sync() +{ + for (ReflectionProbe &reflection_probe : probes_.values()) { + if (reflection_probe.type == ReflectionProbe::Type::PROBE) { + reflection_probe.is_probe_used = false; + } + } + + update_probes_this_sample_ = false; + if (update_probes_next_sample_) { + update_probes_this_sample_ = true; + } + { PassSimple &pass = select_ps_; pass.init(); - pass.shader_set(instance_.shaders.static_shader_get(SPHERE_PROBE_SELECT)); + pass.shader_set(instance_.shaders.static_shader_get(REFLECTION_PROBE_SELECT)); pass.push_constant("reflection_probe_count", &reflection_probe_count_); pass.bind_ssbo("reflection_probe_buf", &data_buf_); - instance_.volume_probes.bind_resources(pass); + instance_.irradiance_cache.bind_resources(pass); instance_.sampling.bind_resources(pass); pass.dispatch(&dispatch_probe_select_); pass.barrier(GPU_BARRIER_UNIFORM); } } -bool SphereProbeModule::ensure_atlas() +int ReflectionProbeModule::needed_layers_get() const { - /* Make sure the atlas is always initialized even if there is nothing to render to it to fulfill - * the resource bindings. */ - eGPUTextureUsage usage = GPU_TEXTURE_USAGE_SHADER_WRITE | GPU_TEXTURE_USAGE_SHADER_READ; - - if (probes_tx_.ensure_2d_array(GPU_RGBA16F, - int2(SPHERE_PROBE_ATLAS_RES), - instance_.light_probes.sphere_layer_count(), - usage, - nullptr, - SPHERE_PROBE_MIPMAP_LEVELS)) - { - probes_tx_.ensure_mip_views(); - /* TODO(fclem): Clearing means that we need to render all probes again. - * If existing data exists, copy it using `CopyImageSubData`. */ - for (auto i : IndexRange(SPHERE_PROBE_MIPMAP_LEVELS)) { - /* Avoid undefined pixel data. Clear all mips. */ - float4 data(0.0f); - GPU_texture_clear(probes_tx_.mip_view(i), GPU_DATA_FLOAT, &data); - } - GPU_texture_mipmap_mode(probes_tx_, true, true); - return true; + int max_layer = 0; + for (const ReflectionProbe &probe : probes_.values()) { + max_layer = max_ii(max_layer, probe.atlas_coord.layer); } - return false; + return max_layer + 1; } -void SphereProbeModule::end_sync() +static int layer_subdivision_for(const int max_resolution, + const eLightProbeResolution probe_resolution) { - const bool atlas_resized = ensure_atlas(); - if (atlas_resized) { - instance_.light_probes.world_sphere_.do_render = true; + int i_probe_resolution = int(probe_resolution); + return max_ii(int(log2(max_resolution)) - i_probe_resolution, 0); +} + +void ReflectionProbeModule::sync_world(::World *world) +{ + ReflectionProbe &probe = probes_.lookup(world_object_key_); + + eLightProbeResolution resolution = static_cast(world->probe_resolution); + int layer_subdivision = layer_subdivision_for(max_resolution_, resolution); + if (layer_subdivision != probe.atlas_coord.layer_subdivision) { + probe.atlas_coord = find_empty_atlas_region(layer_subdivision); + do_world_update_set(true); } - const bool world_updated = instance_.light_probes.world_sphere_.do_render; - /* Detect if we need to render probe objects. */ - update_probes_next_sample_ = false; - for (SphereProbe &probe : instance_.light_probes.sphere_map_.values()) { - if (atlas_resized || world_updated) { - /* Last minute tagging. */ + world_sampling_coord_ = probe.atlas_coord.as_sampling_coord(atlas_extent()); +} + +void ReflectionProbeModule::sync_world_lookdev() +{ + ReflectionProbe &probe = probes_.lookup(world_object_key_); + + const eLightProbeResolution resolution = reflection_probe_resolution(); + int layer_subdivision = layer_subdivision_for(max_resolution_, resolution); + if (layer_subdivision != probe.atlas_coord.layer_subdivision) { + probe.atlas_coord = find_empty_atlas_region(layer_subdivision); + } + world_sampling_coord_ = probe.atlas_coord.as_sampling_coord(atlas_extent()); + + do_world_update_set(true); +} + +void ReflectionProbeModule::sync_object(Object *ob, ObjectHandle &ob_handle) +{ + const ::LightProbe &light_probe = *(::LightProbe *)ob->data; + if (light_probe.type != LIGHTPROBE_TYPE_SPHERE) { + return; + } + + ReflectionProbe &probe = probes_.lookup_or_add_cb(ob_handle.object_key.hash(), [&]() { + ReflectionProbe probe = {}; + probe.do_render = true; + probe.type = ReflectionProbe::Type::PROBE; + return probe; + }); + + probe.do_render |= (ob_handle.recalc != 0); + probe.is_probe_used = true; + + const bool probe_sync_active = instance_.do_reflection_probe_sync(); + if (!probe_sync_active && probe.do_render) { + update_probes_next_sample_ = true; + } + + /* Only update data when rerendering the probes to reduce flickering. */ + if (!probe_sync_active) { + return; + } + + probe.clipping_distances = float2(light_probe.clipsta, light_probe.clipend); + + int subdivision = layer_subdivision_for(max_resolution_, reflection_probe_resolution()); + if (probe.atlas_coord.layer_subdivision != subdivision) { + probe.atlas_coord = find_empty_atlas_region(subdivision); + } + + bool use_custom_parallax = (light_probe.flag & LIGHTPROBE_FLAG_CUSTOM_PARALLAX) != 0; + float parallax_distance = use_custom_parallax ? + max_ff(light_probe.distpar, light_probe.distinf) : + light_probe.distinf; + float influence_distance = light_probe.distinf; + float influence_falloff = light_probe.falloff; + probe.influence_shape = (light_probe.attenuation_type == LIGHTPROBE_SHAPE_BOX) ? SHAPE_CUBOID : + SHAPE_ELIPSOID; + probe.parallax_shape = (light_probe.parallax_type == LIGHTPROBE_SHAPE_BOX) ? SHAPE_CUBOID : + SHAPE_ELIPSOID; + + float4x4 object_to_world = math::scale(float4x4(ob->object_to_world), + float3(influence_distance)); + probe.location = object_to_world.location(); + probe.volume = math::abs(math::determinant(object_to_world)); + probe.world_to_probe_transposed = float3x4(math::transpose(math::invert(object_to_world))); + probe.influence_scale = 1.0 / max_ff(1e-8f, influence_falloff); + probe.influence_bias = probe.influence_scale; + probe.parallax_distance = parallax_distance / influence_distance; + + probe.viewport_display = light_probe.flag & LIGHTPROBE_FLAG_SHOW_DATA; + probe.viewport_display_size = light_probe.data_display_size; +} + +ReflectionProbeAtlasCoordinate ReflectionProbeModule::find_empty_atlas_region( + int subdivision_level) const +{ + ProbeLocationFinder location_finder(needed_layers_get() + 1, subdivision_level); + for (const ReflectionProbe &probe : probes_.values()) { + if (probe.atlas_coord.layer != -1) { + location_finder.mark_space_used(probe.atlas_coord); + } + } + return location_finder.first_free_spot(); +} + +void ReflectionProbeModule::end_sync() +{ + const bool probes_removed = remove_unused_probes(); + const bool world_updated = do_world_update_get(); + const bool only_world = has_only_world_probe(); + const int number_layers_needed = needed_layers_get(); + const int current_layers = probes_tx_.depth(); + const bool resize_layers = current_layers < number_layers_needed; + + const bool rerender_all_probes = resize_layers || world_updated; + if (rerender_all_probes) { + for (ReflectionProbe &probe : probes_.values()) { probe.do_render = true; } - if (probe.do_render) { - /* Tag the next redraw to warm up the probe pipeline. - * Keep doing this until there is no update. - * This avoids stuttering when moving a light-probe. */ + } + + const bool do_update = instance_.do_reflection_probe_sync() || (only_world && world_updated); + if (!do_update) { + /* World has changed this sample, but probe update isn't initialized this sample. */ + if (world_updated && !only_world) { update_probes_next_sample_ = true; } + if (update_probes_next_sample_ && !update_probes_this_sample_) { + DRW_viewport_request_redraw(); + } + + if (!update_probes_next_sample_ && probes_removed) { + data_buf_.push_update(); + } + return; } - /* When reflection probes are synced the sampling must be reset. - * - * This fixes issues when using a single non-projected sample. Without resetting the - * previous rendered viewport will be drawn and reflection probes will not be updated. - * #Instance::render_sample */ - if (instance_.do_reflection_probe_sync()) { - instance_.sampling.reset(); + if (resize_layers) { + probes_tx_.ensure_2d_array(GPU_RGBA16F, + int2(max_resolution_), + number_layers_needed, + GPU_TEXTURE_USAGE_SHADER_WRITE | GPU_TEXTURE_USAGE_SHADER_READ, + nullptr, + 9999); + GPU_texture_mipmap_mode(probes_tx_, true, true); + probes_tx_.clear(float4(0.0f)); } - /* If we cannot render probes this redraw make sure we request another redraw. */ - if (update_probes_next_sample_ && (instance_.do_reflection_probe_sync() == false)) { - DRW_viewport_request_redraw(); + + /* Check reset probe updating as we will rendering probes. */ + if (update_probes_this_sample_ || only_world) { + update_probes_next_sample_ = false; } + data_buf_.push_update(); } -void SphereProbeModule::ensure_cubemap_render_target(int resolution) +bool ReflectionProbeModule::remove_unused_probes() { - eGPUTextureUsage usage = GPU_TEXTURE_USAGE_ATTACHMENT | GPU_TEXTURE_USAGE_SHADER_READ; - cubemap_tx_.ensure_cube(GPU_RGBA16F, resolution, usage); - /* TODO(fclem): deallocate it. */ + const int64_t removed_count = probes_.remove_if( + [](const ReflectionProbes::Item &item) { return !item.value.is_probe_used; }); + return removed_count > 0; } -SphereProbeModule::UpdateInfo SphereProbeModule::update_info_from_probe(const SphereProbe &probe) +bool ReflectionProbeModule::do_world_update_get() const { - SphereProbeModule::UpdateInfo info = {}; - info.atlas_coord = probe.atlas_coord; - info.cube_target_extent = probe.atlas_coord.area_extent() / 2; - info.clipping_distances = probe.clipping_distances; - info.probe_pos = probe.location; - info.do_render = probe.do_render; - info.do_world_irradiance_update = false; - return info; + const ReflectionProbe &world_probe = probes_.lookup(world_object_key_); + return world_probe.do_render; } -std::optional SphereProbeModule::world_update_info_pop() +void ReflectionProbeModule::do_world_update_set(bool value) { - SphereProbe &world_probe = instance_.light_probes.world_sphere_; - if (!world_probe.do_render && !do_world_irradiance_update) { - return std::nullopt; - } - SphereProbeModule::UpdateInfo info = update_info_from_probe(world_probe); - info.do_world_irradiance_update = do_world_irradiance_update; - world_probe.do_render = false; - do_world_irradiance_update = false; - ensure_cubemap_render_target(info.cube_target_extent); - return info; + ReflectionProbe &world_probe = probes_.lookup(world_object_key_); + world_probe.do_render = value; + do_world_update_irradiance_set(value); } -std::optional SphereProbeModule::probe_update_info_pop() +void ReflectionProbeModule::do_world_update_irradiance_set(bool value) { - if (!instance_.do_reflection_probe_sync()) { - /* Do not update probes during this sample as we did not sync the draw::Passes. */ - return std::nullopt; - } + ReflectionProbe &world_probe = probes_.lookup(world_object_key_); + world_probe.do_world_irradiance_update = value; +} - for (SphereProbe &probe : instance_.light_probes.sphere_map_.values()) { - if (!probe.do_render) { +bool ReflectionProbeModule::has_only_world_probe() const +{ + return probes_.size() == 1; +} + +std::optional ReflectionProbeModule::update_info_pop( + const ReflectionProbe::Type probe_type) +{ + const bool do_probe_sync = instance_.do_reflection_probe_sync(); + const bool only_world = has_only_world_probe(); + const int max_shift = int(log2(max_resolution_)); + for (ReflectionProbe &probe : probes_.values()) { + if (!probe.do_render && !probe.do_world_irradiance_update) { continue; } - SphereProbeModule::UpdateInfo info = update_info_from_probe(probe); + if (probe.type != probe_type) { + continue; + } + /* Do not update this probe during this sample. */ + if (probe.type == ReflectionProbe::Type::WORLD && !only_world && !do_probe_sync) { + continue; + } + if (probe.type == ReflectionProbe::Type::PROBE && !do_probe_sync) { + continue; + } + + ReflectionProbeUpdateInfo info = {}; + info.probe_type = probe.type; + info.atlas_coord = probe.atlas_coord; + info.resolution = 1 << (max_shift - probe.atlas_coord.layer_subdivision - 1); + info.clipping_distances = probe.clipping_distances; + info.probe_pos = probe.location; + info.do_render = probe.do_render; + info.do_world_irradiance_update = probe.do_world_irradiance_update; + probe.do_render = false; - probe.use_for_render = true; - ensure_cubemap_render_target(info.cube_target_extent); + probe.do_world_irradiance_update = false; + + if (cubemap_tx_.ensure_cube(GPU_RGBA16F, + info.resolution, + GPU_TEXTURE_USAGE_ATTACHMENT | GPU_TEXTURE_USAGE_SHADER_READ)) + { + GPU_texture_mipmap_mode(cubemap_tx_, false, true); + } + return info; } return std::nullopt; } -void SphereProbeModule::remap_to_octahedral_projection(const SphereProbeAtlasCoord &atlas_coord) +void ReflectionProbeModule::remap_to_octahedral_projection( + const ReflectionProbeAtlasCoordinate &atlas_coord) { + int resolution = max_resolution_ >> atlas_coord.layer_subdivision; /* Update shader parameters that change per dispatch. */ - probe_sampling_coord_ = atlas_coord.as_sampling_coord(); - probe_write_coord_ = atlas_coord.as_write_coord(0); - int resolution = probe_write_coord_.extent; - dispatch_probe_pack_ = int3(int2(ceil_division(resolution, SPHERE_PROBE_GROUP_SIZE)), 1); - instance_.manager->submit(remap_ps_); + probe_sampling_coord_ = atlas_coord.as_sampling_coord(atlas_extent()); + probe_write_coord_ = atlas_coord.as_write_coord(atlas_extent(), 0); + probe_mip_level_ = atlas_coord.layer_subdivision; + dispatch_probe_pack_ = int3(int2(ceil_division(resolution, REFLECTION_PROBE_GROUP_SIZE)), 1); - /* Populate the mip levels */ - for (auto i : IndexRange(SPHERE_PROBE_MIPMAP_LEVELS - 1)) { - convolve_lod_ = i; - convolve_input_ = probes_tx_.mip_view(i); - convolve_output_ = probes_tx_.mip_view(i + 1); - probe_read_coord_ = atlas_coord.as_write_coord(i); - probe_write_coord_ = atlas_coord.as_write_coord(i + 1); - int out_mip_res = probe_write_coord_.extent; - dispatch_probe_convolve_ = int3(int2(ceil_division(out_mip_res, SPHERE_PROBE_GROUP_SIZE)), 1); - instance_.manager->submit(convolve_ps_); - } - /* Sync with atlas usage for shading. */ - GPU_memory_barrier(GPU_BARRIER_TEXTURE_FETCH); + instance_.manager->submit(remap_ps_); } -void SphereProbeModule::update_world_irradiance() +void ReflectionProbeModule::update_world_irradiance() { instance_.manager->submit(update_irradiance_ps_); - /* All volume probe that needs to composite the world probe need to be updated. */ - instance_.volume_probes.do_update_world_ = true; } -void SphereProbeModule::set_view(View & /*view*/) +void ReflectionProbeModule::update_probes_texture_mipmaps() { - Vector probe_active; - for (auto &probe : instance_.light_probes.sphere_map_.values()) { + GPU_texture_update_mipmap_chain(probes_tx_); +} + +void ReflectionProbeModule::set_view(View & /*view*/) +{ + Vector probe_active; + for (auto &probe : probes_.values()) { /* Last slot is reserved for the world probe. */ - if (reflection_probe_count_ >= SPHERE_PROBE_MAX - 1) { + if (reflection_probe_count_ >= REFLECTION_PROBES_MAX - 1) { break; } - if (!probe.use_for_render) { + probe.prepare_for_upload(atlas_extent()); + /* World is always considered active and added last. */ + if (probe.type == ReflectionProbe::Type::WORLD) { continue; } /* TODO(fclem): Culling. */ @@ -249,29 +515,32 @@ void SphereProbeModule::set_view(View & /*view*/) } /* Stable sorting of probes. */ - std::sort( - probe_active.begin(), probe_active.end(), [](const SphereProbe *a, const SphereProbe *b) { - if (a->volume != b->volume) { - /* Smallest first. */ - return a->volume < b->volume; - } - /* Volumes are identical. Any arbitrary criteria can be used to sort them. - * Use position to avoid unstable result caused by depsgraph non deterministic eval - * order. This could also become a priority parameter. */ - float3 _a = a->location; - float3 _b = b->location; - if (_a.x != _b.x) { - return _a.x < _b.x; - } - if (_a.y != _b.y) { - return _a.y < _b.y; - } - if (_a.z != _b.z) { - return _a.z < _b.z; - } - /* Fallback to memory address, since there's no good alternative. */ - return a < b; - }); + std::sort(probe_active.begin(), + probe_active.end(), + [](const ReflectionProbe *a, const ReflectionProbe *b) { + if (a->volume != b->volume) { + /* Smallest first. */ + return a->volume < b->volume; + } + /* Volumes are identical. Any arbitrary criteria can be used to sort them. + * Use position to avoid unstable result caused by depsgraph non deterministic eval + * order. This could also become a priority parameter. */ + float3 _a = a->location; + float3 _b = b->location; + if (_a.x != _b.x) { + return _a.x < _b.x; + } + else if (_a.y != _b.y) { + return _a.y < _b.y; + } + else if (_a.z != _b.z) { + return _a.z < _b.z; + } + else { + /* Fallback to memory address, since there's no good alternative. */ + return a < b; + } + }); /* Push all sorted data to the UBO. */ int probe_id = 0; @@ -279,46 +548,42 @@ void SphereProbeModule::set_view(View & /*view*/) data_buf_[probe_id++] = *probe; } /* Add world probe at the end. */ - data_buf_[probe_id++] = instance_.light_probes.world_sphere_; + data_buf_[probe_id++] = probes_.lookup(world_object_key_); /* Tag the end of the array. */ - if (probe_id < SPHERE_PROBE_MAX) { + if (probe_id < REFLECTION_PROBES_MAX) { data_buf_[probe_id].atlas_coord.layer = -1; } data_buf_.push_update(); - reflection_probe_count_ = probe_id; - dispatch_probe_select_.x = divide_ceil_u(reflection_probe_count_, - SPHERE_PROBE_SELECT_GROUP_SIZE); - instance_.manager->submit(select_ps_); - - sync_display(probe_active); -} - -void SphereProbeModule::sync_display(Vector &probe_active) -{ - do_display_draw_ = false; - if (!DRW_state_draw_support()) { - return; - } - - int display_index = 0; - for (int i : probe_active.index_range()) { - if (probe_active[i]->viewport_display) { - SphereProbeDisplayData &sph_data = display_data_buf_.get_or_resize(display_index++); - sph_data.probe_index = i; - sph_data.display_size = probe_active[i]->viewport_display_size; + do_display_draw_ = DRW_state_draw_support() && probe_active.size() > 0; + if (do_display_draw_) { + int display_index = 0; + for (int i : probe_active.index_range()) { + if (probe_active[i]->viewport_display) { + display_data_buf_.get_or_resize(display_index++) = { + i, probe_active[i]->viewport_display_size}; + } + } + do_display_draw_ = display_index > 0; + if (do_display_draw_) { + display_data_buf_.resize(display_index); + display_data_buf_.push_update(); } } - if (display_index == 0) { - return; - } - do_display_draw_ = true; - display_data_buf_.resize(display_index); - display_data_buf_.push_update(); + /* Add one for world probe. */ + reflection_probe_count_ = probe_active.size() + 1; + dispatch_probe_select_.x = divide_ceil_u(reflection_probe_count_, + REFLECTION_PROBE_SELECT_GROUP_SIZE); + instance_.manager->submit(select_ps_); } -void SphereProbeModule::viewport_draw(View &view, GPUFrameBuffer *view_fb) +ReflectionProbeAtlasCoordinate ReflectionProbeModule::world_atlas_coord_get() const +{ + return probes_.lookup(world_object_key_).atlas_coord; +} + +void ReflectionProbeModule::viewport_draw(View &view, GPUFrameBuffer *view_fb) { if (!do_display_draw_) { return; @@ -329,7 +594,7 @@ void SphereProbeModule::viewport_draw(View &view, GPUFrameBuffer *view_fb) DRW_STATE_DEPTH_LESS_EQUAL | DRW_STATE_CULL_BACK); viewport_display_ps_.framebuffer_set(&view_fb); viewport_display_ps_.shader_set(instance_.shaders.static_shader_get(DISPLAY_PROBE_REFLECTION)); - viewport_display_ps_.bind_resources(*this); + bind_resources(viewport_display_ps_); viewport_display_ps_.bind_ssbo("display_data_buf", display_data_buf_); viewport_display_ps_.draw_procedural(GPU_PRIM_TRIS, 1, display_data_buf_.size() * 6); @@ -338,4 +603,37 @@ void SphereProbeModule::viewport_draw(View &view, GPUFrameBuffer *view_fb) /** \} */ +/* -------------------------------------------------------------------- */ +/** \name Debugging + * + * \{ */ + +void ReflectionProbeModule::debug_print() const +{ + std::ostream &os = std::cout; + for (const ReflectionProbe &probe : probes_.values()) { + switch (probe.type) { + case ReflectionProbe::Type::WORLD: { + os << "WORLD"; + os << " do_render: " << probe.do_render; + os << "\n"; + break; + } + case ReflectionProbe::Type::PROBE: { + os << "PROBE"; + os << " do_render: " << probe.do_render; + os << " is_used: " << probe.is_probe_used; + os << "\n"; + break; + } + } + os << " - layer: " << probe.atlas_coord.layer; + os << " subdivision: " << probe.atlas_coord.layer_subdivision; + os << " area: " << probe.atlas_coord.area_index; + os << "\n"; + } +} + +/** \} */ + } // namespace blender::eevee diff --git a/source/blender/draw/engines/eevee_next/eevee_reflection_probes.hh b/source/blender/draw/engines/eevee_next/eevee_reflection_probes.hh index 46034f2ccb1..164d75accc9 100644 --- a/source/blender/draw/engines/eevee_next/eevee_reflection_probes.hh +++ b/source/blender/draw/engines/eevee_next/eevee_reflection_probes.hh @@ -8,7 +8,6 @@ #pragma once -#include "eevee_lightprobe.hh" #include "eevee_shader_shared.hh" #include "BKE_cryptomatte.hh" @@ -23,41 +22,168 @@ class Instance; struct ObjectHandle; struct WorldHandle; class CaptureView; +struct ReflectionProbeUpdateInfo; + +/* -------------------------------------------------------------------- */ +/** \name Reflection Probe + * \{ */ + +struct ReflectionProbeAtlasCoordinate { + /** On which layer of the texture array is this reflection probe stored. */ + int layer = -1; + /** + * Subdivision of the layer. 0 = no subdivision and resolution would be + * ReflectionProbeModule::MAX_RESOLUTION. + */ + int layer_subdivision = -1; + /** + * Which area of the subdivided layer is the reflection probe located. + * + * A layer has (2^layer_subdivision)^2 areas. + */ + int area_index = -1; + + /* Return the area extent in pixel. */ + int area_extent(int atlas_extent) const + { + return atlas_extent >> layer_subdivision; + } + + /* Coordinate of the area in [0..area_count_per_dimension[ range. */ + int2 area_location() const + { + const int area_count_per_dimension = 1 << layer_subdivision; + return int2(area_index % area_count_per_dimension, area_index / area_count_per_dimension); + } + + /* Coordinate of the bottom left corner of the area in [0..atlas_extent[ range. */ + int2 area_offset(int atlas_extent) const + { + return area_location() * area_extent(atlas_extent); + } + + ReflectionProbeCoordinate as_sampling_coord(int atlas_extent) const + { + /** + * We want to cover the last mip exactly at the pixel center to reduce padding texels and + * interpolation artifacts. + * This is a diagram of a 2px^2 map with `c` being the texels corners and `x` the pixels + * centers. + * + * c-------c-------c + * | | | + * | x | x | < + * | | | | + * c-------c-------c | sampling area + * | | | | + * | x | x | < + * | | | + * c-------c-------c + * ^-------^ + * sampling area + */ + /* First level only need half a pixel of padding around the sampling area. */ + const int mip_max_lvl_padding = 1; + const int mip_min_lvl_padding = mip_max_lvl_padding << REFLECTION_PROBE_MIPMAP_LEVELS; + /* Extent and offset in mip 0 texels. */ + const int sampling_area_extent = area_extent(atlas_extent) - mip_min_lvl_padding; + const int2 sampling_area_offset = area_offset(atlas_extent) + mip_min_lvl_padding / 2; + /* Convert to atlas UVs. */ + ReflectionProbeCoordinate coord; + coord.scale = sampling_area_extent / float(atlas_extent); + coord.offset = float2(sampling_area_offset) / float(atlas_extent); + coord.layer = layer; + return coord; + } + + ReflectionProbeWriteCoordinate as_write_coord(int atlas_extent, int mip_lvl) const + { + ReflectionProbeWriteCoordinate coord; + coord.extent = atlas_extent >> (layer_subdivision + mip_lvl); + coord.offset = (area_location() * coord.extent) >> mip_lvl; + coord.layer = layer; + return coord; + } +}; + +struct ReflectionProbe : ReflectionProbeData { + public: + enum class Type { + WORLD, + PROBE, + } type; + + /* Used to sort the probes by priority. */ + float volume; + + /* Should the area in the probes_tx_ be updated? */ + bool do_render = false; + bool do_world_irradiance_update = false; + + /** + * Probes that aren't used during a draw can be cleared. + * + * Only valid when type == Type::Probe. + */ + bool is_probe_used = false; + + /** + * Far and near clipping distances for rendering + */ + float2 clipping_distances; + + /** Display debug spheres in the viewport. */ + bool viewport_display; + float viewport_display_size; + + ReflectionProbeAtlasCoordinate atlas_coord; + + void prepare_for_upload(int atlas_extent) + { + /* Compute LOD factor. */ + const int probe_resolution = atlas_coord.area_extent(atlas_extent); + const float bias = 0.0; + const float lod_factor = bias + 0.5 * log2f(square_i(probe_resolution)); + this->lod_factor = lod_factor; + + /* Compute sampling offset and scale. */ + static_cast(this)->atlas_coord = atlas_coord.as_sampling_coord( + atlas_extent); + } +}; + +/** \} */ /* -------------------------------------------------------------------- */ /** \name Reflection Probe Module * \{ */ -class SphereProbeModule { - friend LightProbeModule; - /* Capture View requires access to the probe texture for frame-buffer configuration. */ - friend class CaptureView; - /* Instance requires access to #update_probes_this_sample_ */ - friend class Instance; +class ReflectionProbeModule { + using ReflectionProbes = Map; private: + /** + * The maximum resolution of a cube-map side. + * + * Must be a power of two; intention to be used as a cube-map atlas. + */ + static constexpr int max_resolution_ = 2048; + + static constexpr uint64_t world_object_key_ = 0; + + bool is_initialized = false; Instance &instance_; - SphereProbeDataBuf data_buf_; + ReflectionProbeDataBuf data_buf_; + ReflectionProbes probes_; /** Probes texture stored in octahedral mapping. */ Texture probes_tx_ = {"Probes"}; - /** Copy the rendered cube-map to the atlas texture. */ PassSimple remap_ps_ = {"Probe.CubemapToOctahedral"}; - /** Extract irradiance information from the world. */ PassSimple update_irradiance_ps_ = {"Probe.UpdateIrradiance"}; - /** Copy volume probe irradiance for the center of sphere probes. */ PassSimple select_ps_ = {"Probe.Select"}; - /** Convolve the octahedral map to fill the Mip-map levels. */ - PassSimple convolve_ps_ = {"Probe.Convolve"}; - /** Input mip level for the convolution. */ - GPUTexture *convolve_input_ = nullptr; - /** Output mip level for the convolution. */ - GPUTexture *convolve_output_ = nullptr; - int convolve_lod_ = 0; int3 dispatch_probe_pack_ = int3(1); - int3 dispatch_probe_convolve_ = int3(1); int3 dispatch_probe_select_ = int3(1); /** @@ -68,51 +194,55 @@ class SphereProbeModule { Texture cubemap_tx_ = {"Probe.Cubemap"}; /** Index of the probe being updated. */ int probe_index_ = 0; + /** Mip level being sampled for remapping. */ + int probe_mip_level_ = 0; /** Updated Probe coordinates in the atlas. */ - SphereProbeUvArea probe_sampling_coord_; - SphereProbePixelArea probe_write_coord_; - /** Source Probe coordinates in the atlas. */ - SphereProbePixelArea probe_read_coord_; + ReflectionProbeCoordinate probe_sampling_coord_; + ReflectionProbeWriteCoordinate probe_write_coord_; /** World coordinates in the atlas. */ - SphereProbeUvArea world_sampling_coord_; + ReflectionProbeCoordinate world_sampling_coord_; /** Number of the probe to process in the select phase. */ int reflection_probe_count_ = 0; - /** - * True if the next redraw will trigger a light-probe sphere update. - * As syncing the draw passes for rendering has a significant overhead, - * we only trigger this sync path if we detect updates. But we only know - * this after `end_sync` which is too late to sync objects for light-probe - * rendering. So we tag the next redraw (or sample) to do the sync. - */ bool update_probes_next_sample_ = false; - /** True if the this redraw will trigger a light-probe sphere update. */ bool update_probes_this_sample_ = false; - /** Compute world irradiance coefficient and store them into the volume probe atlas. */ - bool do_world_irradiance_update = true; /** Viewport data display drawing. */ bool do_display_draw_ = false; - SphereProbeDisplayDataBuf display_data_buf_; - PassSimple viewport_display_ps_ = {"ProbeSphereModule.Viewport Display"}; + ReflectionProbeDisplayDataBuf display_data_buf_; + PassSimple viewport_display_ps_ = {"ReflectionProbeModule.Viewport Display"}; public: - SphereProbeModule(Instance &instance) : instance_(instance){}; + ReflectionProbeModule(Instance &instance) : instance_(instance) {} void init(); void begin_sync(); + void sync_world(::World *world); + void sync_world_lookdev(); + void sync_object(Object *ob, ObjectHandle &ob_handle); void end_sync(); void viewport_draw(View &view, GPUFrameBuffer *view_fb); template void bind_resources(PassType &pass) { - pass.bind_texture(SPHERE_PROBE_TEX_SLOT, &probes_tx_); - pass.bind_ubo(SPHERE_PROBE_BUF_SLOT, &data_buf_); + pass.bind_texture(REFLECTION_PROBE_TEX_SLOT, &probes_tx_); + pass.bind_ubo(REFLECTION_PROBE_BUF_SLOT, &data_buf_); } + bool do_world_update_get() const; + void do_world_update_set(bool value); + void do_world_update_irradiance_set(bool value); + void set_view(View &view); + void debug_print() const; + + int atlas_extent() const + { + return probes_tx_.width(); + } + /** * Get the resolution of a single cube-map side when rendering probes. * @@ -120,58 +250,59 @@ class SphereProbeModule { */ int probe_render_extent() const; - void tag_world_irradiance_for_update() - { - do_world_irradiance_update = true; - } + ReflectionProbeAtlasCoordinate world_atlas_coord_get() const; private: - /* Return the subdivision level for the requested probe resolution. - * Result is safely clamped to max resolution. */ - int subdivision_level_get(const eLightProbeResolution probe_resolution) - { - return max_ii(SPHERE_PROBE_ATLAS_MAX_SUBDIV - int(probe_resolution), 0); - } + /** Get the number of layers that is needed to store probes. */ + int needed_layers_get() const; + + bool remove_unused_probes(); /** - * Ensure atlas texture is the right size. - * Returns true if the texture has been cleared and all probes needs to be rendered again. + * Create a reflection probe data element that points to an empty spot in the cubemap that can + * hold a texture with the given subdivision_level. */ - bool ensure_atlas(); - - /** - * Ensure the cube-map target texture for rendering the probe is allocated. - */ - void ensure_cubemap_render_target(int resolution); - - struct UpdateInfo { - float3 probe_pos; - /** Resolution of the cube-map to be rendered. */ - int cube_target_extent; - - float2 clipping_distances; - - SphereProbeAtlasCoord atlas_coord; - - bool do_render; - bool do_world_irradiance_update; - }; - - UpdateInfo update_info_from_probe(const SphereProbe &probe); + ReflectionProbeAtlasCoordinate find_empty_atlas_region(int subdivision_level) const; /** * Pop the next reflection probe that requires to be updated. */ - std::optional world_update_info_pop(); - std::optional probe_update_info_pop(); + std::optional update_info_pop(ReflectionProbe::Type probe_type); - /** - * Internal processing passes. - */ - void remap_to_octahedral_projection(const SphereProbeAtlasCoord &atlas_coord); + void remap_to_octahedral_projection(const ReflectionProbeAtlasCoordinate &atlas_coord); + void update_probes_texture_mipmaps(); void update_world_irradiance(); - void sync_display(Vector &probe_active); + bool has_only_world_probe() const; + + eLightProbeResolution reflection_probe_resolution() const; + + /* Capture View requires access to the cube-maps texture for frame-buffer configuration. */ + friend class CaptureView; + /* Instance requires access to #update_probes_this_sample_ */ + friend class Instance; +}; + +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Reflection Probe Update Info + * \{ */ + +struct ReflectionProbeUpdateInfo { + float3 probe_pos; + ReflectionProbe::Type probe_type; + /** + * Resolution of the cubemap to be rendered. + */ + int resolution; + + float2 clipping_distances; + + ReflectionProbeAtlasCoordinate atlas_coord; + + bool do_render; + bool do_world_irradiance_update; }; /** \} */ diff --git a/source/blender/draw/engines/eevee_next/eevee_sampling.cc b/source/blender/draw/engines/eevee_next/eevee_sampling.cc index 3d739553945..c29039fbf06 100644 --- a/source/blender/draw/engines/eevee_next/eevee_sampling.cc +++ b/source/blender/draw/engines/eevee_next/eevee_sampling.cc @@ -143,8 +143,8 @@ void Sampling::step() } /* Using leaped Halton sequence so we can reused the same primes as lens. */ double3 r, offset = {0, 0, 0}; - uint64_t leap = 13; - uint3 primes = {5, 7, 11}; + uint64_t leap = 11; + uint3 primes = {5, 4, 7}; BLI_halton_3d(primes, offset, sample_raytrace * leap, r); data_.dimensions[SAMPLING_SHADOW_U] = r[0]; data_.dimensions[SAMPLING_SHADOW_V] = r[1]; diff --git a/source/blender/draw/engines/eevee_next/eevee_shader.cc b/source/blender/draw/engines/eevee_next/eevee_shader.cc index b89e83e463b..5cc66249a25 100644 --- a/source/blender/draw/engines/eevee_next/eevee_shader.cc +++ b/source/blender/draw/engines/eevee_next/eevee_shader.cc @@ -18,7 +18,6 @@ #include "eevee_shadow.hh" #include "BLI_assert.h" -#include "BLI_math_bits.h" namespace blender::eevee { @@ -215,13 +214,11 @@ const char *ShaderModule::static_shader_create_info_name_get(eShaderType shader_ return "eevee_lightprobe_irradiance_ray"; case LIGHTPROBE_IRRADIANCE_LOAD: return "eevee_lightprobe_irradiance_load"; - case SPHERE_PROBE_CONVOLVE: - return "eevee_reflection_probe_convolve"; - case SPHERE_PROBE_REMAP: + case REFLECTION_PROBE_REMAP: return "eevee_reflection_probe_remap"; - case SPHERE_PROBE_UPDATE_IRRADIANCE: + case REFLECTION_PROBE_UPDATE_IRRADIANCE: return "eevee_reflection_probe_update_irradiance"; - case SPHERE_PROBE_SELECT: + case REFLECTION_PROBE_SELECT: return "eevee_reflection_probe_select"; case SHADOW_CLIPMAP_CLEAR: return "eevee_shadow_clipmap_clear"; @@ -390,78 +387,35 @@ void ShaderModule::material_create_info_ammend(GPUMaterial *gpumat, GPUCodegenOu info.additional_info("eevee_cryptomatte_out"); } - int32_t closure_data_slots = 0; - int32_t closure_extra_eval = 0; + int lit_closure_count = 0; if (GPU_material_flag_get(gpumat, GPU_MATFLAG_DIFFUSE)) { info.define("MAT_DIFFUSE"); - closure_data_slots |= (1 << 0); - } - if (GPU_material_flag_get(gpumat, GPU_MATFLAG_SUBSURFACE)) { - info.define("MAT_SUBSURFACE"); - closure_data_slots |= (1 << 0); - } - if (GPU_material_flag_get(gpumat, GPU_MATFLAG_REFRACT)) { - info.define("MAT_REFRACTION"); - closure_data_slots |= (1 << 0); - } - if (GPU_material_flag_get(gpumat, GPU_MATFLAG_TRANSLUCENT)) { - info.define("MAT_TRANSLUCENT"); - closure_data_slots |= (1 << 1); + lit_closure_count++; } if (GPU_material_flag_get(gpumat, GPU_MATFLAG_GLOSSY)) { info.define("MAT_REFLECTION"); - closure_data_slots |= (1 << 2); + lit_closure_count++; } - if (GPU_material_flag_get(gpumat, GPU_MATFLAG_COAT)) { - info.define("MAT_CLEARCOAT"); - closure_data_slots |= (1 << 3); + if (GPU_material_flag_get(gpumat, GPU_MATFLAG_TRANSLUCENT)) { + info.define("MAT_TRANSLUCENT"); + lit_closure_count++; + } + if (GPU_material_flag_get(gpumat, GPU_MATFLAG_SUBSURFACE)) { + info.define("MAT_SUBSURFACE"); + lit_closure_count++; + } + if (GPU_material_flag_get(gpumat, GPU_MATFLAG_REFRACT)) { + info.define("MAT_REFRACTION"); + /* TODO(fclem): Support refracted lights. */ } if (GPU_material_flag_get(gpumat, GPU_MATFLAG_TRANSLUCENT | GPU_MATFLAG_SUBSURFACE)) { info.define("SHADOW_SUBSURFACE"); } - int32_t CLOSURE_BIN_COUNT = count_bits_i(closure_data_slots); - switch (CLOSURE_BIN_COUNT) { - /* These need to be separated since the strings need to be static. */ - case 0: - case 1: - info.define("CLOSURE_BIN_COUNT", "1"); - break; - case 2: - info.define("CLOSURE_BIN_COUNT", "2"); - break; - case 3: - info.define("CLOSURE_BIN_COUNT", "3"); - break; - default: - BLI_assert_unreachable(); - break; - } - - if (pipeline_type == MAT_PIPE_DEFERRED) { - switch (CLOSURE_BIN_COUNT) { - /* These need to be separated since the strings need to be static. */ - case 0: - case 1: - info.define("GBUFFER_LAYER_MAX", "1"); - break; - case 2: - info.define("GBUFFER_LAYER_MAX", "2"); - break; - case 3: - info.define("GBUFFER_LAYER_MAX", "3"); - break; - default: - BLI_assert_unreachable(); - break; - } - } - if ((pipeline_type == MAT_PIPE_FORWARD) || GPU_material_flag_get(gpumat, GPU_MATFLAG_SHADER_TO_RGBA)) { - int32_t lit_closure_count = CLOSURE_BIN_COUNT + closure_extra_eval; switch (lit_closure_count) { case 0: /* Define nothing. This will in turn define SKIP_LIGHT_EVAL. */ @@ -476,6 +430,9 @@ void ShaderModule::material_create_info_ammend(GPUMaterial *gpumat, GPUCodegenOu case 3: info.define("LIGHT_CLOSURE_EVAL_COUNT", "3"); break; + case 4: + info.define("LIGHT_CLOSURE_EVAL_COUNT", "4"); + break; default: BLI_assert_unreachable(); break; @@ -569,7 +526,7 @@ void ShaderModule::material_create_info_ammend(GPUMaterial *gpumat, GPUCodegenOu std::stringstream attr_load; attr_load << "void attrib_load()\n"; attr_load << "{\n"; - attr_load << ((!codegen.attr_load.empty()) ? codegen.attr_load : ""); + attr_load << ((codegen.attr_load) ? codegen.attr_load : ""); attr_load << "}\n\n"; std::stringstream vert_gen, frag_gen, comp_gen; @@ -587,7 +544,7 @@ void ShaderModule::material_create_info_ammend(GPUMaterial *gpumat, GPUCodegenOu } if (!is_compute) { - const bool use_vertex_displacement = (!codegen.displacement.empty()) && + const bool use_vertex_displacement = (codegen.displacement != nullptr) && (displacement_type != MAT_DISPLACEMENT_BUMP) && (!ELEM(geometry_type, MAT_GEOM_WORLD, @@ -604,9 +561,9 @@ void ShaderModule::material_create_info_ammend(GPUMaterial *gpumat, GPUCodegenOu } if (!is_compute && pipeline_type != MAT_PIPE_VOLUME_OCCUPANCY) { - frag_gen << ((!codegen.material_functions.empty()) ? codegen.material_functions : "\n"); + frag_gen << ((codegen.material_functions) ? codegen.material_functions : "\n"); - if (!codegen.displacement.empty()) { + if (codegen.displacement) { /* Bump displacement. Needed to recompute normals after displacement. */ info.define("MAT_DISPLACEMENT_BUMP"); @@ -616,28 +573,28 @@ void ShaderModule::material_create_info_ammend(GPUMaterial *gpumat, GPUCodegenOu frag_gen << "}\n\n"; } - frag_gen << "Closure nodetree_surface(float closure_rand)\n"; + frag_gen << "Closure nodetree_surface()\n"; frag_gen << "{\n"; - frag_gen << " closure_weights_reset(closure_rand);\n"; - frag_gen << ((!codegen.surface.empty()) ? codegen.surface : "return Closure(0);\n"); + frag_gen << " closure_weights_reset();\n"; + frag_gen << ((codegen.surface) ? codegen.surface : "return Closure(0);\n"); frag_gen << "}\n\n"; frag_gen << "float nodetree_thickness()\n"; frag_gen << "{\n"; /* TODO(fclem): Better default. */ - frag_gen << ((!codegen.thickness.empty()) ? codegen.thickness : "return 0.1;\n"); + frag_gen << ((codegen.thickness) ? codegen.thickness : "return 0.1;\n"); frag_gen << "}\n\n"; info.fragment_source_generated = frag_gen.str(); } if (is_compute) { - comp_gen << ((!codegen.material_functions.empty()) ? codegen.material_functions : "\n"); + comp_gen << ((codegen.material_functions) ? codegen.material_functions : "\n"); comp_gen << "Closure nodetree_volume()\n"; comp_gen << "{\n"; - comp_gen << " closure_weights_reset(0.0);\n"; - comp_gen << ((!codegen.volume.empty()) ? codegen.volume : "return Closure(0);\n"); + comp_gen << " closure_weights_reset();\n"; + comp_gen << ((codegen.volume) ? codegen.volume : "return Closure(0);\n"); comp_gen << "}\n\n"; info.compute_source_generated = comp_gen.str(); diff --git a/source/blender/draw/engines/eevee_next/eevee_shader.hh b/source/blender/draw/engines/eevee_next/eevee_shader.hh index 119ccb40aa5..b52efbaa379 100644 --- a/source/blender/draw/engines/eevee_next/eevee_shader.hh +++ b/source/blender/draw/engines/eevee_next/eevee_shader.hh @@ -104,10 +104,9 @@ enum eShaderType { RAY_TRACE_PLANAR, RAY_TRACE_SCREEN, - SPHERE_PROBE_CONVOLVE, - SPHERE_PROBE_REMAP, - SPHERE_PROBE_SELECT, - SPHERE_PROBE_UPDATE_IRRADIANCE, + REFLECTION_PROBE_REMAP, + REFLECTION_PROBE_UPDATE_IRRADIANCE, + REFLECTION_PROBE_SELECT, SHADOW_CLIPMAP_CLEAR, SHADOW_DEBUG, diff --git a/source/blender/draw/engines/eevee_next/eevee_shader_shared.hh b/source/blender/draw/engines/eevee_next/eevee_shader_shared.hh index 9ba174578b0..ec08d71c7cc 100644 --- a/source/blender/draw/engines/eevee_next/eevee_shader_shared.hh +++ b/source/blender/draw/engines/eevee_next/eevee_shader_shared.hh @@ -30,6 +30,7 @@ using namespace draw; constexpr GPUSamplerState no_filter = GPUSamplerState::default_sampler(); constexpr GPUSamplerState with_filter = {GPU_SAMPLER_FILTERING_LINEAR}; + #endif #define UBO_MIN_MAX_SUPPORTED_SIZE 1 << 14 @@ -211,7 +212,7 @@ struct CameraData { float _pad1; float _pad2; - bool32_t initialized; + bool1 initialized; #ifdef __cplusplus /* Small constructor to allow detecting new buffers. */ @@ -239,16 +240,6 @@ enum ePassStorageType : uint32_t { PASS_STORAGE_CRYPTOMATTE = 2u, }; -enum PassCategory : uint32_t { - PASS_CATEGORY_DATA = 1u << 0, - PASS_CATEGORY_COLOR_1 = 1u << 1, - PASS_CATEGORY_COLOR_2 = 1u << 2, - PASS_CATEGORY_COLOR_3 = 1u << 3, - PASS_CATEGORY_AOV = 1u << 4, - PASS_CATEGORY_CRYPTOMATTE = 1u << 5, -}; -ENUM_OPERATORS(PassCategory, PASS_CATEGORY_CRYPTOMATTE) - struct FilmSample { int2 texel; float weight; @@ -277,7 +268,15 @@ struct FilmData { /** Scaling factor to convert texel to uvs. */ float2 extent_inv; /** Is true if history is valid and can be sampled. Bypass history to resets accumulation. */ - bool32_t use_history; + bool1 use_history; + /** Is true if combined buffer is valid and can be re-projected to reduce variance. */ + bool1 use_reprojection; + /** Is true if accumulation of non-filtered passes is needed. */ + bool1 has_data; + /** Is true if accumulation of filtered passes is needed. */ + bool1 any_render_pass_1; + bool1 any_render_pass_2; + bool1 any_render_pass_3; /** Controlled by user in lookdev mode or by render settings. */ float background_opacity; /** Output counts per type. */ @@ -305,7 +304,7 @@ struct FilmData { /** Storage type of the render-pass to be displayed. */ ePassStorageType display_storage_type; /** True if we bypass the accumulation and directly output the accumulation buffer. */ - bool32_t display_only; + bool1 display_only; /** Start of AOVs and number of aov. */ int aov_color_id, aov_color_len; int aov_value_id, aov_value_len; @@ -327,7 +326,6 @@ struct FilmData { int samples_len; /** Sum of the weights of all samples in the sample table. */ float samples_weight_total; - int _pad1; FilmSample samples[FILM_PRECOMP_SAMPLE_MAX]; }; BLI_STATIC_ASSERT_ALIGN(FilmData, 16) @@ -370,7 +368,7 @@ struct AOVsInfoData { /** Id of the AOV to be displayed (from the start of the AOV array). -1 for combined. */ int display_id; /** True if the AOV to be displayed is from the value accumulation buffer. */ - bool32_t display_is_value; + bool1 display_is_value; }; BLI_STATIC_ASSERT_ALIGN(AOVsInfoData, 16) @@ -426,7 +424,7 @@ struct VelocityGeometryIndex { /** Offset inside #VelocityGeometryBuf for each time-step. Indexed using eVelocityStep. */ packed_int3 ofs; /** If true, compute deformation motion blur. */ - bool32_t do_deform; + bool1 do_deform; /** * Length of data inside #VelocityGeometryBuf for each time-step. * Indexed using eVelocityStep. @@ -807,6 +805,8 @@ struct LightData { int tilemap_index; /** Directional : Offset of the LOD min in LOD min tile units. */ int2 clipmap_base_offset; + /** Number of step for shadow map tracing. */ + int shadow_ray_step_count; /** Punctual: Other parts of the perspective matrix. */ float clip_side; /** Punctual: Shift to apply to the light origin to get the shadow projection origin. */ @@ -815,9 +815,7 @@ struct LightData { float shadow_shape_scale_or_angle; /** Trace distance for directional lights. */ float shadow_trace_distance; - /* Radius in pixels for shadow filtering. */ - float pcf_radius; - int _pad0; + float _pad2; }; BLI_STATIC_ASSERT_ALIGN(LightData, 16) @@ -1024,7 +1022,7 @@ struct ShadowSceneData { int step_count; /* Bias the shading point by using the normal to avoid self intersection. */ float normal_bias; - int _pad0; + int _pad2; }; BLI_STATIC_ASSERT_ALIGN(ShadowSceneData, 16) @@ -1045,8 +1043,7 @@ enum LightProbeShape : uint32_t { SHAPE_CUBOID = 1u, }; -/* Sampling coordinates using UV space. */ -struct SphereProbeUvArea { +struct ReflectionProbeCoordinate { /* Offset in UV space to the start of the sampling space of the octahedron map. */ float2 offset; /* Scaling of the squared UV space of the octahedron map. */ @@ -1054,10 +1051,9 @@ struct SphereProbeUvArea { /* Layer of the atlas where the octahedron map is stored. */ float layer; }; -BLI_STATIC_ASSERT_ALIGN(SphereProbeUvArea, 16) +BLI_STATIC_ASSERT_ALIGN(ReflectionProbeCoordinate, 16) -/* Pixel read/write coordinates using pixel space. */ -struct SphereProbePixelArea { +struct ReflectionProbeWriteCoordinate { /* Offset in pixel space to the start of the writing space of the octahedron map. * Note that the writing space is not the same as the sampling space as we have borders. */ int2 offset; @@ -1066,23 +1062,29 @@ struct SphereProbePixelArea { /* Layer of the atlas where the octahedron map is stored. */ int layer; }; -BLI_STATIC_ASSERT_ALIGN(SphereProbePixelArea, 16) +BLI_STATIC_ASSERT_ALIGN(ReflectionProbeWriteCoordinate, 16) /** Mapping data to locate a reflection probe in texture. */ -struct SphereProbeData { +struct ReflectionProbeData { /** Transform to probe local position with non-uniform scaling. */ float3x4 world_to_probe_transposed; packed_float3 location; + float _pad2; + /** Shape of the parallax projection. */ - float parallax_distance; LightProbeShape parallax_shape; LightProbeShape influence_shape; + float parallax_distance; /** Influence factor based on the distance to the parallax shape. */ float influence_scale; float influence_bias; + /** LOD factor for mipmap selection. */ + float lod_factor; + float _pad0; + float _pad1; - SphereProbeUvArea atlas_coord; + ReflectionProbeCoordinate atlas_coord; /** * Irradiance at the probe location encoded as spherical harmonics. @@ -1090,21 +1092,21 @@ struct SphereProbeData { */ ReflectionProbeLowFreqLight low_freq_light; }; -BLI_STATIC_ASSERT_ALIGN(SphereProbeData, 16) +BLI_STATIC_ASSERT_ALIGN(ReflectionProbeData, 16) /** Viewport Display Pass. */ -struct SphereProbeDisplayData { +struct ReflectionProbeDisplayData { int probe_index; float display_size; float _pad0; float _pad1; }; -BLI_STATIC_ASSERT_ALIGN(SphereProbeDisplayData, 16) +BLI_STATIC_ASSERT_ALIGN(ReflectionProbeDisplayData, 16) /** \} */ /* -------------------------------------------------------------------- */ -/** \name Volume Probe Cache +/** \name Irradiance Cache * \{ */ struct SurfelRadiance { @@ -1137,7 +1139,7 @@ struct Surfel { /** Cluster this surfel is assigned to. */ int cluster_id; /** True if the light can bounce or be emitted by the surfel back face. */ - bool32_t double_sided; + bool1 double_sided; int _pad0; int _pad1; int _pad2; @@ -1152,9 +1154,9 @@ struct CaptureInfoData { /** Number of surfels inside the surfel buffer or the needed len. */ packed_int3 irradiance_grid_size; /** True if the surface shader needs to write the surfel data. */ - bool32_t do_surfel_output; + bool1 do_surfel_output; /** True if the surface shader needs to increment the surfel_len. */ - bool32_t do_surfel_count; + bool1 do_surfel_count; /** Number of surfels inside the surfel buffer or the needed len. */ uint surfel_len; /** Total number of a ray for light transportation. */ @@ -1187,15 +1189,15 @@ struct CaptureInfoData { /** Radius of surfels. */ float surfel_radius; /** Capture options. */ - bool32_t capture_world_direct; - bool32_t capture_world_indirect; - bool32_t capture_visibility_direct; - bool32_t capture_visibility_indirect; - bool32_t capture_indirect; - bool32_t capture_emission; + bool1 capture_world_direct; + bool1 capture_world_indirect; + bool1 capture_visibility_direct; + bool1 capture_visibility_indirect; + bool1 capture_indirect; + bool1 capture_emission; int _pad0; /* World light probe atlas coordinate. */ - SphereProbeUvArea world_atlas_coord; + ReflectionProbeCoordinate world_atlas_coord; }; BLI_STATIC_ASSERT_ALIGN(CaptureInfoData, 16) @@ -1209,7 +1211,7 @@ struct SurfelListInfoData { }; BLI_STATIC_ASSERT_ALIGN(SurfelListInfoData, 16) -struct VolumeProbeData { +struct IrradianceGridData { /** World to non-normalized local grid space [0..size-1]. Stored transposed for compactness. */ float3x4 world_to_grid_transposed; /** Number of bricks for this grid. */ @@ -1222,7 +1224,7 @@ struct VolumeProbeData { float facing_bias; int _pad1; }; -BLI_STATIC_ASSERT_ALIGN(VolumeProbeData, 16) +BLI_STATIC_ASSERT_ALIGN(IrradianceGridData, 16) struct IrradianceBrick { /* Offset in pixel to the start of the data inside the atlas texture. */ @@ -1278,7 +1280,6 @@ enum eClosureBits : uint32_t { CLOSURE_VOLUME = (1u << 11u), CLOSURE_AMBIENT_OCCLUSION = (1u << 12u), CLOSURE_SHADER_TO_RGBA = (1u << 13u), - CLOSURE_CLEARCOAT = (1u << 14u), }; enum GBufferMode : uint32_t { @@ -1327,9 +1328,9 @@ struct RayTraceData { float roughness_mask_scale; float roughness_mask_bias; /** If set to true will bypass spatial denoising. */ - bool32_t skip_denoise; + bool1 skip_denoise; /** If set to false will bypass tracing for refractive closures. */ - bool32_t trace_refraction; + bool1 trace_refraction; /** Closure being ray-traced. */ int closure_index; int _pad0; @@ -1419,7 +1420,7 @@ static inline float3 burley_eval(float3 d, float r) /** \name Light-probe Planar Data * \{ */ -struct PlanarProbeData { +struct ProbePlanarData { /** Matrices used to render the planar capture. */ float4x4 viewmat; float4x4 winmat; @@ -1430,7 +1431,7 @@ struct PlanarProbeData { /** Layer in the planar capture textures used by this probe. */ int layer_id; }; -BLI_STATIC_ASSERT_ALIGN(PlanarProbeData, 16) +BLI_STATIC_ASSERT_ALIGN(ProbePlanarData, 16) struct ClipPlaneData { /** World space clip plane equation. Used to render planar light-probes. */ @@ -1439,14 +1440,14 @@ struct ClipPlaneData { BLI_STATIC_ASSERT_ALIGN(ClipPlaneData, 16) /** Viewport Display Pass. */ -struct PlanarProbeDisplayData { +struct ProbePlanarDisplayData { float4x4 plane_to_world; int probe_index; float _pad0; float _pad1; float _pad2; }; -BLI_STATIC_ASSERT_ALIGN(PlanarProbeDisplayData, 16) +BLI_STATIC_ASSERT_ALIGN(ProbePlanarDisplayData, 16) /** \} */ @@ -1456,8 +1457,8 @@ BLI_STATIC_ASSERT_ALIGN(PlanarProbeDisplayData, 16) struct PipelineInfoData { float alpha_hash_scale; - bool32_t is_probe_reflection; - bool32_t use_combined_lightprobe_eval; + bool1 is_probe_reflection; + bool1 use_combined_lightprobe_eval; float _pad2; }; BLI_STATIC_ASSERT_ALIGN(PipelineInfoData, 16) @@ -1576,7 +1577,7 @@ using DepthOfFieldScatterListBuf = draw::StorageArrayBuffer; using DispatchIndirectBuf = draw::StorageBuffer; using UniformDataBuf = draw::UniformBuffer; -using VolumeProbeDataBuf = draw::UniformArrayBuffer; +using IrradianceGridDataBuf = draw::UniformArrayBuffer; using IrradianceBrickBuf = draw::StorageVectorBuffer; using LightCullingDataBuf = draw::StorageBuffer; using LightCullingKeyBuf = draw::StorageArrayBuffer; @@ -1588,10 +1589,11 @@ using MotionBlurDataBuf = draw::UniformBuffer; using MotionBlurTileIndirectionBuf = draw::StorageBuffer; using RayTraceTileBuf = draw::StorageArrayBuffer; using SubsurfaceTileBuf = RayTraceTileBuf; -using SphereProbeDataBuf = draw::UniformArrayBuffer; -using SphereProbeDisplayDataBuf = draw::StorageArrayBuffer; -using PlanarProbeDataBuf = draw::UniformArrayBuffer; -using PlanarProbeDisplayDataBuf = draw::StorageArrayBuffer; +using ReflectionProbeDataBuf = + draw::UniformArrayBuffer; +using ReflectionProbeDisplayDataBuf = draw::StorageArrayBuffer; +using ProbePlanarDataBuf = draw::UniformArrayBuffer; +using ProbePlanarDisplayDataBuf = draw::StorageArrayBuffer; using SamplingDataBuf = draw::StorageBuffer; using ShadowStatisticsBuf = draw::StorageBuffer; using ShadowPagesInfoDataBuf = draw::StorageBuffer; diff --git a/source/blender/draw/engines/eevee_next/eevee_shadow.cc b/source/blender/draw/engines/eevee_next/eevee_shadow.cc index 7214a64d0ee..27545efa8f8 100644 --- a/source/blender/draw/engines/eevee_next/eevee_shadow.cc +++ b/source/blender/draw/engines/eevee_next/eevee_shadow.cc @@ -8,7 +8,7 @@ * The shadow module manages shadow update tagging & shadow rendering. */ -#include "BKE_global.hh" +#include "BKE_global.h" #include "BLI_math_rotation.h" #include "BLI_rect.h" @@ -224,8 +224,7 @@ void ShadowPunctual::sync(eLightType light_type, float cone_aperture, float light_shape_radius, float max_distance, - float softness_factor, - float shadow_radius) + float softness_factor) { if (is_spot_light(light_type)) { tilemaps_needed_ = (cone_aperture > DEG2RADF(90.0f)) ? 5 : 1; @@ -248,7 +247,6 @@ void ShadowPunctual::sync(eLightType light_type, position_ = float3(object_mat[3]); softness_factor_ = softness_factor; - shadow_radius_ = shadow_radius; } void ShadowPunctual::release_excess_tilemaps() @@ -343,7 +341,8 @@ void ShadowPunctual::end_sync(Light &light, float lod_bias) ShadowTileMapPool &tilemap_pool = shadows_.tilemap_pool; float side, near, far; - compute_projection_boundaries(light_radius_, shadow_radius_, max_distance_, near, far, side); + compute_projection_boundaries( + light_radius_, light_radius_ * softness_factor_, max_distance_, near, far, side); /* Shift shadow map origin for area light to avoid clipping nearby geometry. */ float shift = is_area_light(light.type) ? near : 0.0f; @@ -774,7 +773,7 @@ void ShadowModule::init() /* Make allocation safe. Avoids crash later on. */ if (!atlas_tx_.is_valid()) { atlas_tx_.ensure_2d_array(ShadowModule::atlas_type, int2(1), 1); - inst_.info += "Error: Could not allocate shadow atlas. Most likely out of GPU memory.\n"; + inst_.info = "Error: Could not allocate shadow atlas. Most likely out of GPU memory."; } /* Read end of the swap-chain to avoid stall. */ @@ -795,12 +794,12 @@ void ShadowModule::init() std::stringstream ss; ss << "Error: Shadow buffer full, may result in missing shadows and lower performance. (" << stats.page_used_count << " / " << shadow_page_len_ << ")\n"; - inst_.info += ss.str(); + inst_.info = ss.str(); } if (stats.view_needed_count > SHADOW_VIEW_MAX && enabled_) { std::stringstream ss; ss << "Error: Too many shadow updates, some shadow might be incorrect.\n"; - inst_.info += ss.str(); + inst_.info = ss.str(); } } @@ -832,9 +831,9 @@ void ShadowModule::begin_sync() pass.init(); if (inst_.is_baking()) { - SurfelBuf &surfels_buf = inst_.volume_probes.bake.surfels_buf_; - CaptureInfoBuf &capture_info_buf = inst_.volume_probes.bake.capture_info_buf_; - float surfel_coverage_area = inst_.volume_probes.bake.surfel_density_; + SurfelBuf &surfels_buf = inst_.irradiance_cache.bake.surfels_buf_; + CaptureInfoBuf &capture_info_buf = inst_.irradiance_cache.bake.capture_info_buf_; + float surfel_coverage_area = inst_.irradiance_cache.bake.surfel_density_; /* Directional shadows. */ float texel_size = ShadowDirectional::tile_size_get(0) / float(SHADOW_PAGE_RES); @@ -851,7 +850,7 @@ void ShadowModule::begin_sync() sub.push_constant("directional_level", directional_level); sub.push_constant("tilemap_projection_ratio", projection_ratio); sub.bind_resources(inst_.lights); - sub.dispatch(&inst_.volume_probes.bake.dispatch_per_surfel_); + sub.dispatch(&inst_.irradiance_cache.bake.dispatch_per_surfel_); /* Skip opaque and transparent tagging for light baking. */ return; @@ -1009,6 +1008,28 @@ void ShadowModule::end_sync() { Manager &manager = *inst_.manager; + { + /* Mark for update all shadow pages touching an updated shadow caster. */ + PassSimple &pass = caster_update_ps_; + pass.init(); + pass.shader_set(inst_.shaders.static_shader_get(SHADOW_TILEMAP_TAG_UPDATE)); + pass.bind_ssbo("tilemaps_buf", tilemap_pool.tilemaps_data); + pass.bind_ssbo("tiles_buf", tilemap_pool.tiles_data); + /* Past caster transforms. */ + if (past_casters_updated_.size() > 0) { + pass.bind_ssbo("bounds_buf", &manager.bounds_buf.previous()); + pass.bind_ssbo("resource_ids_buf", past_casters_updated_); + pass.dispatch(int3(past_casters_updated_.size(), 1, tilemap_pool.tilemaps_data.size())); + } + /* Current caster transforms. */ + if (curr_casters_updated_.size() > 0) { + pass.bind_ssbo("bounds_buf", &manager.bounds_buf.current()); + pass.bind_ssbo("resource_ids_buf", curr_casters_updated_); + pass.dispatch(int3(curr_casters_updated_.size(), 1, tilemap_pool.tilemaps_data.size())); + } + pass.barrier(GPU_BARRIER_SHADER_STORAGE); + } + { PassSimple &pass = tilemap_setup_ps_; pass.init(); @@ -1058,28 +1079,6 @@ void ShadowModule::end_sync() } } - { - /* Mark for update all shadow pages touching an updated shadow caster. */ - PassSimple &pass = caster_update_ps_; - pass.init(); - pass.shader_set(inst_.shaders.static_shader_get(SHADOW_TILEMAP_TAG_UPDATE)); - pass.bind_ssbo("tilemaps_buf", tilemap_pool.tilemaps_data); - pass.bind_ssbo("tiles_buf", tilemap_pool.tiles_data); - /* Past caster transforms. */ - if (past_casters_updated_.size() > 0) { - pass.bind_ssbo("bounds_buf", &manager.bounds_buf.previous()); - pass.bind_ssbo("resource_ids_buf", past_casters_updated_); - pass.dispatch(int3(past_casters_updated_.size(), 1, tilemap_pool.tilemaps_data.size())); - } - /* Current caster transforms. */ - if (curr_casters_updated_.size() > 0) { - pass.bind_ssbo("bounds_buf", &manager.bounds_buf.current()); - pass.bind_ssbo("resource_ids_buf", curr_casters_updated_); - pass.dispatch(int3(curr_casters_updated_.size(), 1, tilemap_pool.tilemaps_data.size())); - } - pass.barrier(GPU_BARRIER_SHADER_STORAGE); - } - /* Non volume usage tagging happens between these two steps. * (Setup at begin_sync) */ @@ -1338,7 +1337,13 @@ void ShadowModule::set_view(View &view, GPUTexture *depth_tx) } inst_.hiz_buffer.update(); - bool update_casters = true; + + /* Run caster update once and before the update loop. + * This is valid even before the view update since only the static tilemaps + * are concerned about this tagging. */ + /* TODO(fclem): There is an optimization opportunity here where we can + * test casters only against the static tilemaps instead of all of them. */ + inst_.manager->submit(caster_update_ps_, view); do { DRW_stats_group_start("Shadow"); @@ -1346,12 +1351,6 @@ void ShadowModule::set_view(View &view, GPUTexture *depth_tx) GPU_uniformbuf_clear_to_zero(shadow_multi_view_.matrices_ubo_get()); inst_.manager->submit(tilemap_setup_ps_, view); - if (assign_if_different(update_casters, false)) { - /* Run caster update only once. */ - /* TODO(fclem): There is an optimization opportunity here where we can - * test casters only against the static tilemaps instead of all of them. */ - inst_.manager->submit(caster_update_ps_, view); - } inst_.manager->submit(tilemap_usage_ps_, view); inst_.manager->submit(tilemap_update_ps_, view); @@ -1359,7 +1358,7 @@ void ShadowModule::set_view(View &view, GPUTexture *depth_tx) statistics_buf_.current().async_flush_to_host(); - /* Isolate shadow update into its own command buffer. + /* Isolate shadow update into own command buffer. * If parameter buffer exceeds limits, then other work will not be impacted. */ bool use_flush = (shadow_technique == ShadowTechnique::TILE_COPY) && (GPU_backend_get_type() == GPU_BACKEND_METAL); @@ -1421,16 +1420,16 @@ void ShadowModule::debug_draw(View &view, GPUFrameBuffer *view_fb) switch (inst_.debug_mode) { case DEBUG_SHADOW_TILEMAPS: - inst_.info += "Debug Mode: Shadow Tilemap\n"; + inst_.info = "Debug Mode: Shadow Tilemap\n"; break; case DEBUG_SHADOW_VALUES: - inst_.info += "Debug Mode: Shadow Values\n"; + inst_.info = "Debug Mode: Shadow Values\n"; break; case DEBUG_SHADOW_TILE_RANDOM_COLOR: - inst_.info += "Debug Mode: Shadow Tile Random Color\n"; + inst_.info = "Debug Mode: Shadow Tile Random Color\n"; break; case DEBUG_SHADOW_TILEMAP_RANDOM_COLOR: - inst_.info += "Debug Mode: Shadow Tilemap Random Color\n"; + inst_.info = "Debug Mode: Shadow Tilemap Random Color\n"; break; default: break; diff --git a/source/blender/draw/engines/eevee_next/eevee_shadow.hh b/source/blender/draw/engines/eevee_next/eevee_shadow.hh index dd77848c64c..2ffe6db1ed8 100644 --- a/source/blender/draw/engines/eevee_next/eevee_shadow.hh +++ b/source/blender/draw/engines/eevee_next/eevee_shadow.hh @@ -395,11 +395,6 @@ class ShadowPunctual : public NonCopyable, NonMovable { int tilemaps_needed_; /** Scaling factor to the light shape for shadow ray casting. */ float softness_factor_; - /** - * `radius * softness_factor` (Bypasses LightModule radius modifications - * to avoid unnecessary padding in the shadow projection). - */ - float shadow_radius_; public: ShadowPunctual(ShadowModule &module) : shadows_(module){}; @@ -419,8 +414,7 @@ class ShadowPunctual : public NonCopyable, NonMovable { float cone_aperture, float light_shape_radius, float max_distance, - float softness_factor, - float shadow_radius); + float softness_factor); /** * Release the tile-maps that will not be used in the current frame. diff --git a/source/blender/draw/engines/eevee_next/eevee_sync.cc b/source/blender/draw/engines/eevee_next/eevee_sync.cc index 2a9a83f3e5c..fa6bc345c50 100644 --- a/source/blender/draw/engines/eevee_next/eevee_sync.cc +++ b/source/blender/draw/engines/eevee_next/eevee_sync.cc @@ -571,6 +571,19 @@ void SyncModule::sync_curves(Object *ob, /** \} */ +/* -------------------------------------------------------------------- */ +/** \name Light Probes + * \{ */ + +void SyncModule::sync_light_probe(Object *ob, ObjectHandle &ob_handle) +{ + inst_.light_probes.sync_probe(ob, ob_handle); + inst_.reflection_probes.sync_object(ob, ob_handle); + inst_.planar_probes.sync_object(ob, ob_handle); +} + +/** \} */ + void foreach_hair_particle_handle(Object *ob, ObjectHandle ob_handle, HairHandleCallback callback) { int sub_key = 1; diff --git a/source/blender/draw/engines/eevee_next/eevee_sync.hh b/source/blender/draw/engines/eevee_next/eevee_sync.hh index ac958087e8b..60e25df44ab 100644 --- a/source/blender/draw/engines/eevee_next/eevee_sync.hh +++ b/source/blender/draw/engines/eevee_next/eevee_sync.hh @@ -11,7 +11,7 @@ #pragma once -#include "BKE_duplilist.hh" +#include "BKE_duplilist.h" #include "BLI_ghash.h" #include "BLI_map.hh" #include "DEG_depsgraph_query.hh" @@ -186,6 +186,7 @@ class SyncModule { const ObjectRef &ob_ref, ModifierData *modifier_data = nullptr, ParticleSystem *particle_sys = nullptr); + void sync_light_probe(Object *ob, ObjectHandle &ob_handle); }; using HairHandleCallback = FunctionRef; diff --git a/source/blender/draw/engines/eevee_next/eevee_velocity.cc b/source/blender/draw/engines/eevee_next/eevee_velocity.cc index 323079c377f..db070b8e8d3 100644 --- a/source/blender/draw/engines/eevee_next/eevee_velocity.cc +++ b/source/blender/draw/engines/eevee_next/eevee_velocity.cc @@ -11,7 +11,7 @@ * It is the module that tracks the objects between frames updates. */ -#include "BKE_duplilist.hh" +#include "BKE_duplilist.h" #include "BKE_object.hh" #include "BLI_map.hh" #include "DEG_depsgraph_query.hh" @@ -38,8 +38,7 @@ namespace blender::eevee { void VelocityModule::init() { - if (!inst_.is_viewport() && !inst_.is_baking() && - (inst_.film.enabled_passes_get() & EEVEE_RENDER_PASS_VECTOR) && + if (!inst_.is_viewport() && (inst_.film.enabled_passes_get() & EEVEE_RENDER_PASS_VECTOR) && !inst_.motion_blur.postfx_enabled()) { /* No motion blur and the vector pass was requested. Do the steps sync here. */ @@ -54,7 +53,7 @@ void VelocityModule::init() /* For viewport, only previous motion is supported. * Still bind previous step to avoid undefined behavior. */ - next_step_ = (inst_.is_viewport() || inst_.is_baking()) ? STEP_PREVIOUS : STEP_NEXT; + next_step_ = inst_.is_viewport() ? STEP_PREVIOUS : STEP_NEXT; } /* Similar to Instance::object_sync, but only syncs velocity. */ @@ -154,17 +153,18 @@ bool VelocityModule::step_object_sync(Object *ob, vel.obj.ofs[step_] = object_steps_usage[step_]++; vel.obj.resource_id = resource_handle.resource_index(); vel.id = object_key.hash(); - object_steps[step_]->get_or_resize(vel.obj.ofs[step_]) = ob->object_to_world(); + object_steps[step_]->get_or_resize(vel.obj.ofs[step_]) = float4x4_view(ob->object_to_world); if (step_ == STEP_CURRENT) { /* Replace invalid steps. Can happen if object was hidden in one of those steps. */ if (vel.obj.ofs[STEP_PREVIOUS] == -1) { vel.obj.ofs[STEP_PREVIOUS] = object_steps_usage[STEP_PREVIOUS]++; - object_steps[STEP_PREVIOUS]->get_or_resize( - vel.obj.ofs[STEP_PREVIOUS]) = ob->object_to_world(); + object_steps[STEP_PREVIOUS]->get_or_resize(vel.obj.ofs[STEP_PREVIOUS]) = float4x4_view( + ob->object_to_world); } if (vel.obj.ofs[STEP_NEXT] == -1) { vel.obj.ofs[STEP_NEXT] = object_steps_usage[STEP_NEXT]++; - object_steps[STEP_NEXT]->get_or_resize(vel.obj.ofs[STEP_NEXT]) = ob->object_to_world(); + object_steps[STEP_NEXT]->get_or_resize(vel.obj.ofs[STEP_NEXT]) = float4x4_view( + ob->object_to_world); } } diff --git a/source/blender/draw/engines/eevee_next/eevee_view.cc b/source/blender/draw/engines/eevee_next/eevee_view.cc index 828875cc79a..af51fe40add 100644 --- a/source/blender/draw/engines/eevee_next/eevee_view.cc +++ b/source/blender/draw/engines/eevee_next/eevee_view.cc @@ -15,7 +15,7 @@ * its type. Passes are shared between views. */ -#include "BKE_global.hh" +#include "BKE_global.h" #include "DRW_render.hh" #include "eevee_instance.hh" @@ -120,7 +120,7 @@ void ShadingView::render() /* TODO(fclem): Move it after the first prepass (and hiz update) once pipeline is stabilized. */ inst_.lights.set_view(render_view_, extent_); - inst_.sphere_probes.set_view(render_view_); + inst_.reflection_probes.set_view(render_view_); inst_.pipelines.background.render(render_view_); @@ -151,8 +151,8 @@ void ShadingView::render() inst_.lights.debug_draw(render_view_, combined_fb_); inst_.hiz_buffer.debug_draw(render_view_, combined_fb_); inst_.shadows.debug_draw(render_view_, combined_fb_); - inst_.volume_probes.viewport_draw(render_view_, combined_fb_); - inst_.sphere_probes.viewport_draw(render_view_, combined_fb_); + inst_.irradiance_cache.viewport_draw(render_view_, combined_fb_); + inst_.reflection_probes.viewport_draw(render_view_, combined_fb_); inst_.planar_probes.viewport_draw(render_view_, combined_fb_); inst_.ambient_occlusion.render_pass(render_view_); @@ -210,35 +210,10 @@ void ShadingView::update_view() float4x4 viewmat = main_view_.viewmat(); float4x4 winmat = main_view_.winmat(); - /* - * Mixed resolution rendering. The center of the display pixels must align with the center of - * the render pixels. If they don't align, the winmat needs to be re-projected. - */ - int2 scaling_factor = int2(inst_.film.scaling_factor_get()); - int2 display_extent = inst_.film.display_extent_get(); - int2 overscan = inst_.film.get_data().render_offset - inst_.film.get_data().offset; - int2 rescaled_render_extent = (extent_ - 2 * overscan) * scaling_factor; - - if (rescaled_render_extent != display_extent) { - float left; - float right; - float bottom; - float top; - float near; - float far; - const bool is_perspective = main_view_.is_persp(); - projmat_dimensions(winmat.ptr(), &left, &right, &bottom, &top, &near, &far); - float2 scale = (float2(rescaled_render_extent) / float2(display_extent)); - right = left + ((right - left) * scale.x); - top = bottom + ((top - bottom) * scale.y); - - if (is_perspective) { - winmat = math::projection::perspective(left, right, bottom, top, near, far); - } - else { - winmat = math::projection::orthographic(left, right, bottom, top, near, far); - } - } + /* TODO(fclem): Mixed-resolution rendering: We need to make sure we render with exactly the same + * distances between pixels to line up render samples and target pixels. + * So if the target resolution is not a multiple of the resolution divisor, we need to make the + * projection window bigger in the +X and +Y directions. */ /* Anti-Aliasing / Super-Sampling jitter. */ float2 jitter = inst_.film.pixel_jitter_get() / float2(extent_); @@ -262,7 +237,8 @@ void ShadingView::update_view() void CaptureView::render_world() { - const auto update_info = inst_.sphere_probes.world_update_info_pop(); + const std::optional update_info = + inst_.reflection_probes.update_info_pop(ReflectionProbe::Type::WORLD); if (!update_info.has_value()) { return; } @@ -281,17 +257,19 @@ void CaptureView::render_world() update_info->clipping_distances.y); view.sync(view_m4, win_m4); - combined_fb_.ensure(GPU_ATTACHMENT_NONE, - GPU_ATTACHMENT_TEXTURE_CUBEFACE(inst_.sphere_probes.cubemap_tx_, face)); + combined_fb_.ensure( + GPU_ATTACHMENT_NONE, + GPU_ATTACHMENT_TEXTURE_CUBEFACE(inst_.reflection_probes.cubemap_tx_, face)); GPU_framebuffer_bind(combined_fb_); inst_.pipelines.world.render(view); } - inst_.sphere_probes.remap_to_octahedral_projection(update_info->atlas_coord); + inst_.reflection_probes.remap_to_octahedral_projection(update_info->atlas_coord); + inst_.reflection_probes.update_probes_texture_mipmaps(); } if (update_info->do_world_irradiance_update) { - inst_.sphere_probes.update_world_irradiance(); + inst_.reflection_probes.update_world_irradiance(); } GPU_debug_group_end(); @@ -301,15 +279,14 @@ void CaptureView::render_probes() { Framebuffer prepass_fb; View view = {"Capture.View"}; - while (const auto update_info = inst_.sphere_probes.probe_update_info_pop()) { + bool do_update_mipmap_chain = false; + while (const std::optional update_info = + inst_.reflection_probes.update_info_pop(ReflectionProbe::Type::PROBE)) + { GPU_debug_group_begin("Probe.Capture"); + do_update_mipmap_chain = true; - if (!inst_.pipelines.data.is_probe_reflection) { - inst_.pipelines.data.is_probe_reflection = true; - inst_.uniform_data.push_update(); - } - - int2 extent = int2(update_info->cube_target_extent); + int2 extent = int2(update_info->resolution); inst_.render_buffers.acquire(extent); inst_.render_buffers.vector_tx.clear(float4(0.0f)); @@ -331,15 +308,17 @@ void CaptureView::render_probes() update_info->clipping_distances.y); view.sync(view_m4, win_m4); - combined_fb_.ensure(GPU_ATTACHMENT_TEXTURE(inst_.render_buffers.depth_tx), - GPU_ATTACHMENT_TEXTURE_CUBEFACE(inst_.sphere_probes.cubemap_tx_, face)); + combined_fb_.ensure( + GPU_ATTACHMENT_TEXTURE(inst_.render_buffers.depth_tx), + GPU_ATTACHMENT_TEXTURE_CUBEFACE(inst_.reflection_probes.cubemap_tx_, face)); - gbuffer_fb_.ensure(GPU_ATTACHMENT_TEXTURE(inst_.render_buffers.depth_tx), - GPU_ATTACHMENT_TEXTURE_CUBEFACE(inst_.sphere_probes.cubemap_tx_, face), - GPU_ATTACHMENT_TEXTURE(inst_.gbuffer.header_tx), - GPU_ATTACHMENT_TEXTURE_LAYER(inst_.gbuffer.normal_tx.layer_view(0), 0), - GPU_ATTACHMENT_TEXTURE_LAYER(inst_.gbuffer.closure_tx.layer_view(0), 0), - GPU_ATTACHMENT_TEXTURE_LAYER(inst_.gbuffer.closure_tx.layer_view(1), 0)); + gbuffer_fb_.ensure( + GPU_ATTACHMENT_TEXTURE(inst_.render_buffers.depth_tx), + GPU_ATTACHMENT_TEXTURE_CUBEFACE(inst_.reflection_probes.cubemap_tx_, face), + GPU_ATTACHMENT_TEXTURE(inst_.gbuffer.header_tx), + GPU_ATTACHMENT_TEXTURE_LAYER(inst_.gbuffer.normal_tx.layer_view(0), 0), + GPU_ATTACHMENT_TEXTURE_LAYER(inst_.gbuffer.closure_tx.layer_view(0), 0), + GPU_ATTACHMENT_TEXTURE_LAYER(inst_.gbuffer.closure_tx.layer_view(1), 0)); GPU_framebuffer_bind(combined_fb_); GPU_framebuffer_clear_color_depth(combined_fb_, float4(0.0f, 0.0f, 0.0f, 1.0f), 1.0f); @@ -349,12 +328,12 @@ void CaptureView::render_probes() inst_.render_buffers.release(); inst_.gbuffer.release(); GPU_debug_group_end(); - inst_.sphere_probes.remap_to_octahedral_projection(update_info->atlas_coord); + inst_.reflection_probes.remap_to_octahedral_projection(update_info->atlas_coord); } - if (inst_.pipelines.data.is_probe_reflection) { - inst_.pipelines.data.is_probe_reflection = false; - inst_.uniform_data.push_update(); + if (do_update_mipmap_chain) { + /* TODO: only update the regions that have been updated. */ + inst_.reflection_probes.update_probes_texture_mipmaps(); } } diff --git a/source/blender/draw/engines/eevee_next/eevee_volume.cc b/source/blender/draw/engines/eevee_next/eevee_volume.cc index bf357b511e0..d4c70292a05 100644 --- a/source/blender/draw/engines/eevee_next/eevee_volume.cc +++ b/source/blender/draw/engines/eevee_next/eevee_volume.cc @@ -192,8 +192,8 @@ void VolumeModule::end_sync() scatter_ps_.shader_set( inst_.shaders.static_shader_get(use_lights_ ? VOLUME_SCATTER_WITH_LIGHTS : VOLUME_SCATTER)); inst_.lights.bind_resources(scatter_ps_); - inst_.sphere_probes.bind_resources(scatter_ps_); - inst_.volume_probes.bind_resources(scatter_ps_); + inst_.reflection_probes.bind_resources(scatter_ps_); + inst_.irradiance_cache.bind_resources(scatter_ps_); inst_.shadows.bind_resources(scatter_ps_); inst_.sampling.bind_resources(scatter_ps_); scatter_ps_.bind_image("in_scattering_img", &prop_scattering_tx_); diff --git a/source/blender/draw/engines/eevee_next/eevee_world.cc b/source/blender/draw/engines/eevee_next/eevee_world.cc index a263795c2b8..6e9618a0900 100644 --- a/source/blender/draw/engines/eevee_next/eevee_world.cc +++ b/source/blender/draw/engines/eevee_next/eevee_world.cc @@ -119,14 +119,17 @@ void World::sync() } } + inst_.reflection_probes.sync_world(bl_world); + if (has_update) { + inst_.reflection_probes.do_world_update_set(true); + } + /* We have to manually test here because we have overrides. */ ::World *orig_world = (::World *)DEG_get_original_id(&bl_world->id); if (assign_if_different(prev_original_world, orig_world)) { - has_update = true; + inst_.reflection_probes.do_world_update_set(true); } - inst_.light_probes.sync_world(bl_world, has_update); - GPUMaterial *gpumat = inst_.shaders.world_shader_get(bl_world, ntree, MAT_PIPE_DEFERRED); inst_.manager->register_layer_attributes(gpumat); diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_bxdf_lib.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_bxdf_lib.glsl index 4bf783768aa..1eda69b2ce6 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_bxdf_lib.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_bxdf_lib.glsl @@ -8,7 +8,6 @@ #pragma BLENDER_REQUIRE(gpu_shader_utildefines_lib.glsl) #pragma BLENDER_REQUIRE(gpu_shader_math_base_lib.glsl) -#pragma BLENDER_REQUIRE(gpu_shader_math_fast_lib.glsl) /* -------------------------------------------------------------------- */ /** \name GGX @@ -130,18 +129,4 @@ float F_eta(float eta, float cos_theta) return 1.0; } -/* Return the equivalent reflective roughness resulting in a similar lobe. */ -float refraction_roughness_remapping(float roughness, float ior) -{ - /* This is a very rough mapping used by manually curve fitting the apparent roughness - * (blurriness) of GGX reflections and GGX refraction. - * A better fit is desirable if it is in the same order of complexity. */ - if (ior > 1.0) { - return roughness * sqrt_fast(1.0 - 1.0 / ior); - } - else { - return roughness * sqrt_fast(saturate(1.0 - ior)) * 0.8; - } -} - /** \} */ diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_closure_lib.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_closure_lib.glsl index 5690244d712..5a7d894b1f9 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_closure_lib.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_closure_lib.glsl @@ -3,7 +3,6 @@ * SPDX-License-Identifier: GPL-2.0-or-later */ #pragma BLENDER_REQUIRE(gpu_shader_codegen_lib.glsl) -#pragma BLENDER_REQUIRE(eevee_bxdf_lib.glsl) /* Return the apparent roughness of a closure compared to a GGX lobe. */ float closure_apparent_roughness_get(ClosureUndetermined cl) @@ -17,8 +16,8 @@ float closure_apparent_roughness_get(ClosureUndetermined cl) case CLOSURE_BSDF_MICROFACET_GGX_REFLECTION_ID: return to_closure_reflection(cl).roughness; case CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID: - return refraction_roughness_remapping(to_closure_refraction(cl).roughness, - to_closure_refraction(cl).ior); + /* TODO: This is incorrect. Depends on IOR. */ + return to_closure_refraction(cl).roughness; case CLOSURE_NONE_ID: default: return 0.0; diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_cryptomatte_lib.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_cryptomatte_lib.glsl index a5578c872e8..706b9365941 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_cryptomatte_lib.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_cryptomatte_lib.glsl @@ -34,8 +34,6 @@ void cryptomatte_clear_samples(FilmSample dst) int layer_len = imageSize(cryptomatte_img).z; for (int i = 0; i < layer_len; i++) { imageStore(cryptomatte_img, ivec3(dst.texel, i), vec4(0.0)); - /* Ensure stores are visible to later reads. */ - imageFence(cryptomatte_img); } } @@ -73,6 +71,4 @@ void cryptomatte_store_film_sample(FilmSample dst, imageStore(cryptomatte_img, img_co, sample_pair); break; } - /* Ensure stores are visible to later reads. */ - imageFence(cryptomatte_img); } diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_deferred_capture_frag.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_deferred_capture_frag.glsl index 0109600d790..8329ac48e94 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_deferred_capture_frag.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_deferred_capture_frag.glsl @@ -20,7 +20,6 @@ void main() GBufferReader gbuf = gbuffer_read(gbuf_header_tx, gbuf_closure_tx, gbuf_normal_tx, texel); if (gbuf.closure_count == 0) { - out_radiance = vec4(0.0); return; } diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_deferred_combine_frag.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_deferred_combine_frag.glsl index b108d14eca9..57cff98670b 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_deferred_combine_frag.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_deferred_combine_frag.glsl @@ -55,15 +55,18 @@ void main() out_combined = vec4(0.0, 0.0, 0.0, 0.0); for (int i = 0; i < GBUFFER_LAYER_MAX && i < gbuf.closure_count; i++) { + vec3 closure_light = load_radiance_direct(texel, i); ClosureUndetermined cl = gbuffer_closure_get(gbuf, i); - if (cl.type == CLOSURE_NONE_ID) { - continue; - } - int layer_index = gbuffer_closure_get_bin_index(gbuf, i); - vec3 closure_light = load_radiance_direct(texel, layer_index); if (!use_combined_lightprobe_eval) { - closure_light += load_radiance_indirect(texel, layer_index); + vec3 closure_indirect = load_radiance_indirect(texel, i); + if (cl.type == CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID) { + /* TODO(fclem): Add instead of replacing when we support correct refracted light. */ + closure_light = closure_indirect; + } + else { + closure_light += closure_indirect; + } } switch (cl.type) { diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_deferred_light_frag.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_deferred_light_frag.glsl index a1c0ec0f651..20272a3d7fc 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_deferred_light_frag.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_deferred_light_frag.glsl @@ -15,6 +15,35 @@ #pragma BLENDER_REQUIRE(eevee_subsurface_lib.glsl) #pragma BLENDER_REQUIRE(eevee_lightprobe_eval_lib.glsl) +ClosureLight closure_light_new(ClosureUndetermined cl, vec3 V) +{ + ClosureLight cl_light; + cl_light.N = cl.N; + cl_light.ltc_mat = LTC_LAMBERT_MAT; + cl_light.type = LIGHT_DIFFUSE; + cl_light.light_shadowed = vec3(0.0); + switch (cl.type) { + case CLOSURE_BSDF_TRANSLUCENT_ID: + cl_light.N = -cl.N; + break; + case CLOSURE_BSSRDF_BURLEY_ID: + case CLOSURE_BSDF_DIFFUSE_ID: + break; + case CLOSURE_BSDF_MICROFACET_GGX_REFLECTION_ID: + cl_light.ltc_mat = LTC_GGX_MAT(dot(cl.N, V), cl.data.x); + cl_light.type = LIGHT_SPECULAR; + break; + case CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID: + cl_light.N = -cl.N; + cl_light.type = LIGHT_SPECULAR; + break; + case CLOSURE_NONE_ID: + /* TODO(fclem): Assert. */ + break; + } + return cl_light; +} + void main() { ivec2 texel = ivec2(gl_FragCoord.xy); @@ -47,7 +76,6 @@ void main() cl_light.N = -Ng; cl_light.ltc_mat = LTC_LAMBERT_MAT; cl_light.type = LIGHT_DIFFUSE; - cl_light.subsurface = true; stack.cl[gbuf.closure_count] = cl_light; } #endif @@ -82,20 +110,39 @@ void main() for (int i = 0; i < LIGHT_CLOSURE_EVAL_COUNT && i < gbuf.closure_count; i++) { ClosureUndetermined cl = gbuffer_closure_get(gbuf, i); - lightprobe_eval(samp, cl, g_data.P, V, stack.cl[i].light_shadowed); + switch (cl.type) { + case CLOSURE_BSDF_TRANSLUCENT_ID: + /* TODO: Support in ray tracing first. Otherwise we have a discrepancy. */ + stack.cl[i].light_shadowed += lightprobe_eval(samp, to_closure_translucent(cl), P, V); + break; + case CLOSURE_BSSRDF_BURLEY_ID: + /* TODO: Support translucency in ray tracing first. Otherwise we have a discrepancy. */ + case CLOSURE_BSDF_DIFFUSE_ID: + stack.cl[i].light_shadowed += lightprobe_eval(samp, to_closure_diffuse(cl), P, V); + break; + case CLOSURE_BSDF_MICROFACET_GGX_REFLECTION_ID: + stack.cl[i].light_shadowed += lightprobe_eval(samp, to_closure_reflection(cl), P, V); + break; + case CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID: + /* TODO(fclem): Add instead of replacing when we support correct refracted light. */ + stack.cl[i].light_shadowed = lightprobe_eval(samp, to_closure_refraction(cl), P, V); + break; + case CLOSURE_NONE_ID: + /* TODO(fclem): Assert. */ + break; + } } } for (int i = 0; i < LIGHT_CLOSURE_EVAL_COUNT && i < gbuf.closure_count; i++) { - int layer_index = gbuffer_closure_get_bin_index(gbuf, i); /* TODO(fclem): Layered texture. */ - if (layer_index == 0) { + if (i == 0) { imageStore(direct_radiance_1_img, texel, vec4(stack.cl[i].light_shadowed, 1.0)); } - else if (layer_index == 1) { + else if (i == 1) { imageStore(direct_radiance_2_img, texel, vec4(stack.cl[i].light_shadowed, 1.0)); } - else if (layer_index == 2) { + else if (i == 2) { imageStore(direct_radiance_3_img, texel, vec4(stack.cl[i].light_shadowed, 1.0)); } } diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_film_cryptomatte_post_comp.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_film_cryptomatte_post_comp.glsl index 490abb65a4d..5a77f525e3f 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_film_cryptomatte_post_comp.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_film_cryptomatte_post_comp.glsl @@ -61,8 +61,6 @@ void cryptomatte_store_samples(ivec2 texel, int layer, vec2 samples[CRYPTOMATTE_ pass_sample.zw = samples[p * 2 + 1]; imageStore(cryptomatte_img, ivec3(texel, p + layer_id), pass_sample); } - /* Ensure stores are visible to later reads. */ - imageFence(cryptomatte_img); } void main() diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_film_lib.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_film_lib.glsl index acb2d1e3862..d6c350a4f33 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_film_lib.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_film_lib.glsl @@ -54,22 +54,24 @@ FilmSample film_sample_get(int sample_n, ivec2 texel_film) * reprojecting the incoming pixel data into film pixel space. */ #else +# ifdef SCALED_RENDERING + texel_film /= uniform_buf.film.scaling_factor; +# endif + FilmSample film_sample = uniform_buf.film.samples[sample_n]; - film_sample.texel += (texel_film / scaling_factor) + uniform_buf.film.render_offset; + film_sample.texel += texel_film + uniform_buf.film.render_offset; /* Use extend on borders. */ film_sample.texel = clamp(film_sample.texel, ivec2(0, 0), uniform_buf.film.render_extent - 1); /* TODO(fclem): Panoramic projection will need to compute the sample weight in the shader * instead of precomputing it on CPU. */ - if (scaling_factor > 1) { - /* We need to compute the real distance and weight since a sample - * can be used by many final pixel. */ - vec2 offset = (vec2(film_sample.texel) + 0.5 - uniform_buf.film.subpixel_offset) * - scaling_factor - - (vec2(texel_film) + 0.5); - film_sample.weight = film_filter_weight(uniform_buf.film.filter_radius, - length_squared(offset)); - } +# ifdef SCALED_RENDERING + /* We need to compute the real distance and weight since a sample + * can be used by many final pixel. */ + vec2 offset = uniform_buf.film.subpixel_offset - + vec2(texel_film % uniform_buf.film.scaling_factor); + film_sample.weight = film_filter_weight(uniform_buf.film.filter_size, length_squared(offset)); +# endif #endif /* PANORAMIC */ @@ -82,14 +84,13 @@ FilmSample film_sample_get(int sample_n, ivec2 texel_film) /* Returns the combined weights of all samples affecting this film pixel. */ float film_weight_accumulation(ivec2 texel_film) { - /* TODO(fclem): Reference implementation, also needed for panoramic cameras. */ - if (scaling_factor > 1) { - float weight = 0.0; - for (int i = 0; i < uniform_buf.film.samples_len; i++) { - weight += film_sample_get(i, texel_film).weight; - } - return weight; +#if 0 /* TODO(fclem): Reference implementation, also needed for panoramic cameras. */ + float weight = 0.0; + for (int i = 0; i < uniform_buf.film.samples_len; i++) { + weight += film_sample_get(i, texel_film).weight; } + return weight; +#endif return uniform_buf.film.samples_weight_total; } @@ -142,10 +143,17 @@ void film_sample_accum_combined(FilmSample samp, inout vec4 accum, inout float w weight_accum += weight; } +#ifdef GPU_METAL +void film_sample_cryptomatte_accum(FilmSample samp, + int layer, + sampler2D tex, + thread vec2 *crypto_samples) +#else void film_sample_cryptomatte_accum(FilmSample samp, int layer, sampler2D tex, inout vec2 crypto_samples[4]) +#endif { float hash = texelFetch(tex, samp.texel, 0)[layer]; /* Find existing entry. */ @@ -172,7 +180,7 @@ void film_cryptomatte_layer_accum_and_store( } /* x = hash, y = accumulated weight. Only keep track of 4 highest weighted samples. */ vec2 crypto_samples[4] = vec2[4](vec2(0.0), vec2(0.0), vec2(0.0), vec2(0.0)); - for (int i = 0; i < samples_len; i++) { + for (int i = 0; i < uniform_buf.film.samples_len; i++) { FilmSample src = film_sample_get(i, texel_film); film_sample_cryptomatte_accum(src, layer_component, cryptomatte_tx, crypto_samples); } @@ -193,7 +201,7 @@ float film_distance_load(ivec2 texel) /* Repeat texture coordinates as the weight can be optimized to a small portion of the film. */ texel = texel % imageSize(in_weight_img).xy; - if (!uniform_buf.film.use_history || use_reprojection) { + if (!uniform_buf.film.use_history || uniform_buf.film.use_reprojection) { return 1.0e16; } return imageLoad(in_weight_img, ivec3(texel, FILM_WEIGHT_LAYER_DISTANCE)).x; @@ -204,7 +212,7 @@ float film_weight_load(ivec2 texel) /* Repeat texture coordinates as the weight can be optimized to a small portion of the film. */ texel = texel % imageSize(in_weight_img).xy; - if (!uniform_buf.film.use_history || use_reprojection) { + if (!uniform_buf.film.use_history || uniform_buf.film.use_reprojection) { return 0.0; } return imageLoad(in_weight_img, ivec3(texel, FILM_WEIGHT_LAYER_ACCUMULATION)).x; @@ -240,7 +248,11 @@ vec2 film_pixel_history_motion_vector(ivec2 texel_sample) /* \a t is inter-pixel position. 0 means perfectly on a pixel center. * Returns weights in both dimensions. * Multiply each dimension weights to get final pixel weights. */ +#ifdef GPU_METAL +void film_get_catmull_rom_weights(vec2 t, thread vec2 *weights) +#else void film_get_catmull_rom_weights(vec2 t, out vec2 weights[4]) +#endif { vec2 t2 = t * t; vec2 t3 = t2 * t; @@ -444,7 +456,7 @@ void film_store_combined( /* Undo the weighting to get final spatially-filtered color. */ color_src = color / color_weight; - if (use_reprojection) { + if (uniform_buf.film.use_reprojection) { /* Interactive accumulation. Do reprojection and Temporal Anti-Aliasing. */ /* Reproject by finding where this pixel was in the previous frame. */ @@ -620,7 +632,7 @@ void film_process_data(ivec2 texel_film, out vec4 out_color, out float out_depth vec4 combined_accum = vec4(0.0); FilmSample src; - for (int i = samples_len - 1; i >= 0; i--) { + for (int i = uniform_buf.film.samples_len - 1; i >= 0; i--) { src = film_sample_get(i, texel_film); film_sample_accum_combined(src, combined_accum, weight_accum); } @@ -628,13 +640,13 @@ void film_process_data(ivec2 texel_film, out vec4 out_color, out float out_depth film_store_combined(dst, src.texel, combined_accum, weight_accum, out_color); } - if (flag_test(enabled_categories, PASS_CATEGORY_DATA)) { + if (uniform_buf.film.has_data) { float film_distance = film_distance_load(texel_film); /* Get sample closest to target texel. It is always sample 0. */ FilmSample film_sample = film_sample_get(0, texel_film); - if (use_reprojection || film_sample.weight < film_distance) { + if (uniform_buf.film.use_reprojection || film_sample.weight < film_distance) { float depth = texelFetch(depth_tx, film_sample.texel, 0).x; vec4 vector = velocity_resolve(vector_tx, film_sample.texel, depth); /* Transform to pixel space, matching Cycles format. */ @@ -664,13 +676,13 @@ void film_process_data(ivec2 texel_film, out vec4 out_color, out float out_depth } } - if (flag_test(enabled_categories, PASS_CATEGORY_COLOR_1)) { + if (uniform_buf.film.any_render_pass_1) { vec4 diffuse_light_accum = vec4(0.0); vec4 specular_light_accum = vec4(0.0); vec4 volume_light_accum = vec4(0.0); vec4 emission_accum = vec4(0.0); - for (int i = 0; i < samples_len; i++) { + for (int i = 0; i < uniform_buf.film.samples_len; i++) { FilmSample src = film_sample_get(i, texel_film); film_sample_accum(src, uniform_buf.film.diffuse_light_id, @@ -699,7 +711,7 @@ void film_process_data(ivec2 texel_film, out vec4 out_color, out float out_depth film_store_color(dst, uniform_buf.film.emission_id, emission_accum, out_color); } - if (flag_test(enabled_categories, PASS_CATEGORY_COLOR_2)) { + if (uniform_buf.film.any_render_pass_2) { vec4 diffuse_color_accum = vec4(0.0); vec4 specular_color_accum = vec4(0.0); vec4 environment_accum = vec4(0.0); @@ -707,7 +719,7 @@ void film_process_data(ivec2 texel_film, out vec4 out_color, out float out_depth float shadow_accum = 0.0; float ao_accum = 0.0; - for (int i = 0; i < samples_len; i++) { + for (int i = 0; i < uniform_buf.film.samples_len; i++) { FilmSample src = film_sample_get(i, texel_film); film_sample_accum(src, uniform_buf.film.diffuse_color_id, @@ -748,10 +760,10 @@ void film_process_data(ivec2 texel_film, out vec4 out_color, out float out_depth film_store_value(dst, uniform_buf.film.mist_id, mist_accum, out_color); } - if (flag_test(enabled_categories, PASS_CATEGORY_COLOR_3)) { + if (uniform_buf.film.any_render_pass_3) { vec4 transparent_accum = vec4(0.0); - for (int i = 0; i < samples_len; i++) { + for (int i = 0; i < uniform_buf.film.samples_len; i++) { FilmSample src = film_sample_get(i, texel_film); film_sample_accum(src, uniform_buf.film.transparent_id, @@ -765,41 +777,37 @@ void film_process_data(ivec2 texel_film, out vec4 out_color, out float out_depth film_store_color(dst, uniform_buf.film.transparent_id, transparent_accum, out_color); } - if (flag_test(enabled_categories, PASS_CATEGORY_AOV)) { - for (int aov = 0; aov < uniform_buf.film.aov_color_len; aov++) { - vec4 aov_accum = vec4(0.0); + for (int aov = 0; aov < uniform_buf.film.aov_color_len; aov++) { + vec4 aov_accum = vec4(0.0); - for (int i = 0; i < samples_len; i++) { - FilmSample src = film_sample_get(i, texel_film); - film_sample_accum(src, 0, uniform_buf.render_pass.color_len + aov, rp_color_tx, aov_accum); - } - film_store_color(dst, uniform_buf.film.aov_color_id + aov, aov_accum, out_color); - } - - for (int aov = 0; aov < uniform_buf.film.aov_value_len; aov++) { - float aov_accum = 0.0; - - for (int i = 0; i < samples_len; i++) { - FilmSample src = film_sample_get(i, texel_film); - film_sample_accum(src, 0, uniform_buf.render_pass.value_len + aov, rp_value_tx, aov_accum); - } - film_store_value(dst, uniform_buf.film.aov_value_id + aov, aov_accum, out_color); + for (int i = 0; i < uniform_buf.film.samples_len; i++) { + FilmSample src = film_sample_get(i, texel_film); + film_sample_accum(src, 0, uniform_buf.render_pass.color_len + aov, rp_color_tx, aov_accum); } + film_store_color(dst, uniform_buf.film.aov_color_id + aov, aov_accum, out_color); } - if (flag_test(enabled_categories, PASS_CATEGORY_CRYPTOMATTE)) { - if (uniform_buf.film.cryptomatte_samples_len != 0) { - /* Cryptomatte passes cannot be cleared by a weighted store like other passes. */ - if (!uniform_buf.film.use_history || use_reprojection) { - cryptomatte_clear_samples(dst); - } + for (int aov = 0; aov < uniform_buf.film.aov_value_len; aov++) { + float aov_accum = 0.0; - film_cryptomatte_layer_accum_and_store( - dst, texel_film, uniform_buf.film.cryptomatte_object_id, 0, out_color); - film_cryptomatte_layer_accum_and_store( - dst, texel_film, uniform_buf.film.cryptomatte_asset_id, 1, out_color); - film_cryptomatte_layer_accum_and_store( - dst, texel_film, uniform_buf.film.cryptomatte_material_id, 2, out_color); + for (int i = 0; i < uniform_buf.film.samples_len; i++) { + FilmSample src = film_sample_get(i, texel_film); + film_sample_accum(src, 0, uniform_buf.render_pass.value_len + aov, rp_value_tx, aov_accum); } + film_store_value(dst, uniform_buf.film.aov_value_id + aov, aov_accum, out_color); + } + + if (uniform_buf.film.cryptomatte_samples_len != 0) { + /* Cryptomatte passes cannot be cleared by a weighted store like other passes. */ + if (!uniform_buf.film.use_history || uniform_buf.film.use_reprojection) { + cryptomatte_clear_samples(dst); + } + + film_cryptomatte_layer_accum_and_store( + dst, texel_film, uniform_buf.film.cryptomatte_object_id, 0, out_color); + film_cryptomatte_layer_accum_and_store( + dst, texel_film, uniform_buf.film.cryptomatte_asset_id, 1, out_color); + film_cryptomatte_layer_accum_and_store( + dst, texel_film, uniform_buf.film.cryptomatte_material_id, 2, out_color); } } diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_forward_lib.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_forward_lib.glsl index 3de8852752a..71f34554e13 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_forward_lib.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_forward_lib.glsl @@ -13,34 +13,111 @@ #pragma BLENDER_REQUIRE(eevee_light_eval_lib.glsl) #pragma BLENDER_REQUIRE(eevee_lightprobe_eval_lib.glsl) -#if CLOSURE_BIN_COUNT != LIGHT_CLOSURE_EVAL_COUNT -# error Closure data count and eval count must match -#endif - void forward_lighting_eval(float thickness, out vec3 radiance, out vec3 transmittance) { float vPz = dot(drw_view_forward(), g_data.P) - dot(drw_view_forward(), drw_view_position()); vec3 V = drw_world_incident_vector(g_data.P); ClosureLightStack stack; - for (int i = 0; i < LIGHT_CLOSURE_EVAL_COUNT; i++) { - stack.cl[i] = closure_light_new(g_closure_get(i), V); - } + + ClosureLight cl_diffuse; + cl_diffuse.N = g_diffuse_data.N; + cl_diffuse.ltc_mat = LTC_LAMBERT_MAT; + cl_diffuse.type = LIGHT_DIFFUSE; + + ClosureLight cl_subsurface; + cl_subsurface.N = -g_diffuse_data.N; + cl_subsurface.ltc_mat = LTC_LAMBERT_MAT; + cl_subsurface.type = LIGHT_DIFFUSE; + + ClosureLight cl_translucent; + cl_translucent.N = -g_translucent_data.N; + cl_translucent.ltc_mat = LTC_LAMBERT_MAT; + cl_translucent.type = LIGHT_DIFFUSE; + + ClosureLight cl_reflection; + cl_reflection.N = g_reflection_data.N; + cl_reflection.ltc_mat = LTC_GGX_MAT(dot(g_reflection_data.N, V), g_reflection_data.data.x); + cl_reflection.type = LIGHT_SPECULAR; + + int cl_layer = 0; + +#ifdef MAT_DIFFUSE + const int cl_diffuse_id = cl_layer++; + stack.cl[cl_diffuse_id] = cl_diffuse; +#endif + +#ifdef MAT_SUBSURFACE + const int cl_subsurface_id = cl_layer++; + stack.cl[cl_subsurface_id] = cl_subsurface; +#endif + +#ifdef MAT_TRANSLUCENT + const int cl_translucent_id = cl_layer++; + stack.cl[cl_translucent_id] = cl_translucent; +#endif + +#ifdef MAT_REFLECTION + const int cl_reflection_id = cl_layer++; + stack.cl[cl_reflection_id] = cl_reflection; +#endif #ifndef SKIP_LIGHT_EVAL light_eval(stack, g_data.P, g_data.Ng, V, vPz, thickness); #endif +#ifdef MAT_SUBSURFACE + vec3 sss_profile = subsurface_transmission(to_closure_subsurface(g_diffuse_data).sss_radius, + thickness); + stack.cl[cl_subsurface_id].light_shadowed *= sss_profile; + stack.cl[cl_subsurface_id].light_unshadowed *= sss_profile; + /* Fuse back the SSS transmittance with the diffuse lighting. */ + stack.cl[cl_diffuse_id].light_shadowed += stack.cl[cl_subsurface_id].light_shadowed; + stack.cl[cl_diffuse_id].light_unshadowed += stack.cl[cl_subsurface_id].light_unshadowed; +#endif + + vec3 diffuse_light = vec3(0.0); + vec3 translucent_light = vec3(0.0); + vec3 reflection_light = vec3(0.0); + vec3 refraction_light = vec3(0.0); + LightProbeSample samp = lightprobe_load(g_data.P, g_data.Ng, V); +#ifdef MAT_DIFFUSE + diffuse_light = stack.cl[cl_diffuse_id].light_shadowed; + diffuse_light += lightprobe_eval(samp, to_closure_diffuse(g_diffuse_data), g_data.P, V); +#endif +#ifdef MAT_TRANSLUCENT + translucent_light = stack.cl[cl_translucent_id].light_shadowed; + translucent_light += lightprobe_eval( + samp, to_closure_translucent(g_translucent_data), g_data.P, V); +#endif +#ifdef MAT_REFLECTION + reflection_light = stack.cl[cl_reflection_id].light_shadowed; + reflection_light += lightprobe_eval(samp, to_closure_reflection(g_reflection_data), g_data.P, V); +#endif +#ifdef MAT_REFRACTION + /* TODO(fclem): Refraction from light. */ + refraction_light += lightprobe_eval(samp, to_closure_refraction(g_refraction_data), g_data.P, V); +#endif + + /* Apply weight. */ + g_diffuse_data.color *= g_diffuse_data.weight; + g_translucent_data.color *= g_translucent_data.weight; + g_reflection_data.color *= g_reflection_data.weight; + g_refraction_data.color *= g_refraction_data.weight; + /* Mask invalid lighting from undefined closure. */ + diffuse_light = (g_diffuse_data.weight > 1e-5) ? diffuse_light : vec3(0.0); + translucent_light = (g_translucent_data.weight > 1e-5) ? translucent_light : vec3(0.0); + reflection_light = (g_reflection_data.weight > 1e-5) ? reflection_light : vec3(0.0); + refraction_light = (g_refraction_data.weight > 1e-5) ? refraction_light : vec3(0.0); + /* Combine all radiance. */ radiance = g_emission; - for (int i = 0; i < LIGHT_CLOSURE_EVAL_COUNT; i++) { - ClosureUndetermined cl = g_closure_get(i); - lightprobe_eval(samp, cl, g_data.P, V, stack.cl[i].light_shadowed); - if (cl.weight > 1e-5) { - radiance += stack.cl[i].light_shadowed * cl.color * cl.weight; - } - } + radiance += g_diffuse_data.color * diffuse_light; + radiance += g_reflection_data.color * reflection_light; + radiance += g_refraction_data.color * refraction_light; + radiance += g_translucent_data.color * translucent_light; + transmittance = g_transmittance; } diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_gbuffer_closure_test.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_gbuffer_closure_test.glsl index bafcc1122aa..7ef8bd1f582 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_gbuffer_closure_test.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_gbuffer_closure_test.glsl @@ -15,9 +15,10 @@ GBufferData gbuffer_new() { GBufferData data; - data.closure[0].weight = 0.0; - data.closure[1].weight = 0.0; - data.closure[2].weight = 0.0; + data.diffuse.weight = 0.0; + data.translucent.weight = 0.0; + data.reflection.weight = 0.0; + data.refraction.weight = 0.0; data.thickness = 0.2; data.object_id = 0xF220u; data.surface_N = normalize(vec3(0.1, 0.2, 0.3)); @@ -35,120 +36,119 @@ void main() TEST(eevee_gbuffer, ClosureDiffuse) { data_in = gbuffer_new(); - data_in.closure[0].type = CLOSURE_BSDF_DIFFUSE_ID; - data_in.closure[0].weight = 1.0; - data_in.closure[0].color = vec3(0.1, 0.2, 0.3); - data_in.closure[0].N = normalize(vec3(0.2, 0.1, 0.3)); + data_in.diffuse.type = CLOSURE_BSDF_DIFFUSE_ID; + data_in.diffuse.weight = 1.0; + data_in.diffuse.color = vec3(0.1, 0.2, 0.3); + data_in.diffuse.N = normalize(vec3(0.2, 0.1, 0.3)); g_data_packed = gbuffer_pack(data_in); data_out = gbuffer_read(header_tx, closure_tx, normal_tx, ivec2(0)); - EXPECT_EQ(g_data_packed.data_len, 1); + EXPECT_EQ(g_data_packed.layer_data, 1); EXPECT_EQ(data_out.closure_count, 1); ClosureUndetermined out_diffuse = gbuffer_closure_get(data_out, 0); EXPECT_EQ(out_diffuse.type, CLOSURE_BSDF_DIFFUSE_ID); - EXPECT_EQ(data_in.closure[0].type, CLOSURE_BSDF_DIFFUSE_ID); - EXPECT_NEAR(data_in.closure[0].color, out_diffuse.color, 1e-5); - EXPECT_NEAR(data_in.closure[0].N, out_diffuse.N, 1e-5); + EXPECT_EQ(data_in.diffuse.type, CLOSURE_BSDF_DIFFUSE_ID); + EXPECT_NEAR(data_in.diffuse.color, out_diffuse.color, 1e-5); + EXPECT_NEAR(data_in.diffuse.N, out_diffuse.N, 1e-5); } TEST(eevee_gbuffer, ClosureSubsurface) { data_in = gbuffer_new(); - data_in.closure[0].type = CLOSURE_BSSRDF_BURLEY_ID; - data_in.closure[0].weight = 1.0; - data_in.closure[0].color = vec3(0.1, 0.2, 0.3); - data_in.closure[0].data.rgb = vec3(0.2, 0.3, 0.4); - data_in.closure[0].N = normalize(vec3(0.2, 0.1, 0.3)); + data_in.diffuse.type = CLOSURE_BSSRDF_BURLEY_ID; + data_in.diffuse.weight = 1.0; + data_in.diffuse.color = vec3(0.1, 0.2, 0.3); + data_in.diffuse.data.rgb = vec3(0.2, 0.3, 0.4); + data_in.diffuse.N = normalize(vec3(0.2, 0.1, 0.3)); g_data_packed = gbuffer_pack(data_in); data_out = gbuffer_read(header_tx, closure_tx, normal_tx, ivec2(0)); - EXPECT_EQ(g_data_packed.data_len, 2); + EXPECT_EQ(g_data_packed.layer_data, 2); EXPECT_EQ(data_out.closure_count, 1); ClosureUndetermined out_sss_burley = gbuffer_closure_get(data_out, 0); EXPECT_EQ(out_sss_burley.type, CLOSURE_BSSRDF_BURLEY_ID); - EXPECT_EQ(data_in.closure[0].type, CLOSURE_BSSRDF_BURLEY_ID); - EXPECT_NEAR(data_in.closure[0].color, out_sss_burley.color, 1e-5); - EXPECT_NEAR(data_in.closure[0].N, out_sss_burley.N, 1e-5); - EXPECT_NEAR( - data_in.closure[0].data.rgb, to_closure_subsurface(out_sss_burley).sss_radius, 1e-5); + EXPECT_EQ(data_in.diffuse.type, CLOSURE_BSSRDF_BURLEY_ID); + EXPECT_NEAR(data_in.diffuse.color, out_sss_burley.color, 1e-5); + EXPECT_NEAR(data_in.diffuse.N, out_sss_burley.N, 1e-5); + EXPECT_NEAR(data_in.diffuse.data.rgb, to_closure_subsurface(out_sss_burley).sss_radius, 1e-5); } TEST(eevee_gbuffer, ClosureTranslucent) { data_in = gbuffer_new(); - data_in.closure[0].type = CLOSURE_BSDF_TRANSLUCENT_ID; - data_in.closure[0].weight = 1.0; - data_in.closure[0].color = vec3(0.1, 0.2, 0.3); - data_in.closure[0].N = normalize(vec3(0.2, 0.1, 0.3)); + data_in.translucent.type = CLOSURE_BSDF_TRANSLUCENT_ID; + data_in.translucent.weight = 1.0; + data_in.translucent.color = vec3(0.1, 0.2, 0.3); + data_in.translucent.N = normalize(vec3(0.2, 0.1, 0.3)); g_data_packed = gbuffer_pack(data_in); data_out = gbuffer_read(header_tx, closure_tx, normal_tx, ivec2(0)); - EXPECT_EQ(g_data_packed.data_len, 1); + EXPECT_EQ(g_data_packed.layer_data, 1); EXPECT_EQ(data_out.closure_count, 1); ClosureUndetermined out_translucent = gbuffer_closure_get(data_out, 0); EXPECT_EQ(out_translucent.type, CLOSURE_BSDF_TRANSLUCENT_ID); - EXPECT_EQ(data_in.closure[0].type, CLOSURE_BSDF_TRANSLUCENT_ID); - EXPECT_NEAR(data_in.closure[0].color, out_translucent.color, 1e-5); - EXPECT_NEAR(data_in.closure[0].N, out_translucent.N, 1e-5); + EXPECT_EQ(data_in.translucent.type, CLOSURE_BSDF_TRANSLUCENT_ID); + EXPECT_NEAR(data_in.translucent.color, out_translucent.color, 1e-5); + EXPECT_NEAR(data_in.translucent.N, out_translucent.N, 1e-5); } TEST(eevee_gbuffer, ClosureReflection) { data_in = gbuffer_new(); - data_in.closure[0].type = CLOSURE_BSDF_MICROFACET_GGX_REFLECTION_ID; - data_in.closure[0].weight = 1.0; - data_in.closure[0].color = vec3(0.1, 0.2, 0.3); - data_in.closure[0].data.x = 0.4; - data_in.closure[0].N = normalize(vec3(0.2, 0.1, 0.3)); + data_in.reflection.type = CLOSURE_BSDF_MICROFACET_GGX_REFLECTION_ID; + data_in.reflection.weight = 1.0; + data_in.reflection.color = vec3(0.1, 0.2, 0.3); + data_in.reflection.data.x = 0.4; + data_in.reflection.N = normalize(vec3(0.2, 0.1, 0.3)); g_data_packed = gbuffer_pack(data_in); data_out = gbuffer_read(header_tx, closure_tx, normal_tx, ivec2(0)); - EXPECT_EQ(g_data_packed.data_len, 2); + EXPECT_EQ(g_data_packed.layer_data, 2); EXPECT_EQ(data_out.closure_count, 1); ClosureUndetermined out_reflection = gbuffer_closure_get(data_out, 0); EXPECT_EQ(out_reflection.type, CLOSURE_BSDF_MICROFACET_GGX_REFLECTION_ID); - EXPECT_EQ(data_in.closure[0].type, CLOSURE_BSDF_MICROFACET_GGX_REFLECTION_ID); - EXPECT_NEAR(data_in.closure[0].color, out_reflection.color, 1e-5); - EXPECT_NEAR(data_in.closure[0].N, out_reflection.N, 1e-5); - EXPECT_NEAR(data_in.closure[0].data.r, out_reflection.data.r, 1e-5); + EXPECT_EQ(data_in.reflection.type, CLOSURE_BSDF_MICROFACET_GGX_REFLECTION_ID); + EXPECT_NEAR(data_in.reflection.color, out_reflection.color, 1e-5); + EXPECT_NEAR(data_in.reflection.N, out_reflection.N, 1e-5); + EXPECT_NEAR(data_in.reflection.data.r, out_reflection.data.r, 1e-5); } TEST(eevee_gbuffer, ClosureRefraction) { data_in = gbuffer_new(); - data_in.closure[0].type = CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID; - data_in.closure[0].weight = 1.0; - data_in.closure[0].color = vec3(0.1, 0.2, 0.3); - data_in.closure[0].data.x = 0.4; - data_in.closure[0].data.y = 0.5; - data_in.closure[0].N = normalize(vec3(0.2, 0.1, 0.3)); + data_in.refraction.type = CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID; + data_in.refraction.weight = 1.0; + data_in.refraction.color = vec3(0.1, 0.2, 0.3); + data_in.refraction.data.x = 0.4; + data_in.refraction.data.y = 0.5; + data_in.refraction.N = normalize(vec3(0.2, 0.1, 0.3)); g_data_packed = gbuffer_pack(data_in); data_out = gbuffer_read(header_tx, closure_tx, normal_tx, ivec2(0)); - EXPECT_EQ(g_data_packed.data_len, 2); + EXPECT_EQ(g_data_packed.layer_data, 2); EXPECT_EQ(data_out.closure_count, 1); ClosureUndetermined out_refraction = gbuffer_closure_get(data_out, 0); EXPECT_EQ(out_refraction.type, CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID); - EXPECT_EQ(data_in.closure[0].type, CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID); - EXPECT_NEAR(data_in.closure[0].color, out_refraction.color, 1e-5); - EXPECT_NEAR(data_in.closure[0].N, out_refraction.N, 1e-5); - EXPECT_NEAR(data_in.closure[0].data.r, out_refraction.data.r, 1e-5); - EXPECT_NEAR(data_in.closure[0].data.g, out_refraction.data.g, 1e-5); + EXPECT_EQ(data_in.refraction.type, CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID); + EXPECT_NEAR(data_in.refraction.color, out_refraction.color, 1e-5); + EXPECT_NEAR(data_in.refraction.N, out_refraction.N, 1e-5); + EXPECT_NEAR(data_in.refraction.data.r, out_refraction.data.r, 1e-5); + EXPECT_NEAR(data_in.refraction.data.g, out_refraction.data.g, 1e-5); } TEST(eevee_gbuffer, ClosureCombination) @@ -167,12 +167,12 @@ void main() in_cl1.N = normalize(vec3(0.2, 0.3, 0.4)); data_in = gbuffer_new(); - data_in.closure[0] = in_cl0; - data_in.closure[1] = in_cl1; + data_in.refraction = in_cl0; + data_in.reflection = in_cl1; g_data_packed = gbuffer_pack(data_in); - EXPECT_EQ(g_data_packed.data_len, 4); + EXPECT_EQ(g_data_packed.layer_data, 4); data_out = gbuffer_read(header_tx, closure_tx, normal_tx, ivec2(0)); @@ -198,22 +198,22 @@ void main() TEST(eevee_gbuffer, ClosureColorless) { data_in = gbuffer_new(); - data_in.closure[0].type = CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID; - data_in.closure[0].weight = 1.0; - data_in.closure[0].color = vec3(0.1, 0.1, 0.1); - data_in.closure[0].data.x = 0.4; - data_in.closure[0].data.y = 0.5; - data_in.closure[0].N = normalize(vec3(0.2, 0.1, 0.3)); + data_in.refraction.type = CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID; + data_in.refraction.weight = 1.0; + data_in.refraction.color = vec3(0.1, 0.1, 0.1); + data_in.refraction.data.x = 0.4; + data_in.refraction.data.y = 0.5; + data_in.refraction.N = normalize(vec3(0.2, 0.1, 0.3)); - data_in.closure[1].type = CLOSURE_BSDF_MICROFACET_GGX_REFLECTION_ID; - data_in.closure[1].weight = 1.0; - data_in.closure[1].color = vec3(0.1, 0.1, 0.1); - data_in.closure[1].data.x = 0.4; - data_in.closure[1].N = normalize(vec3(0.2, 0.3, 0.4)); + data_in.reflection.type = CLOSURE_BSDF_MICROFACET_GGX_REFLECTION_ID; + data_in.reflection.weight = 1.0; + data_in.reflection.color = vec3(0.1, 0.1, 0.1); + data_in.reflection.data.x = 0.4; + data_in.reflection.N = normalize(vec3(0.2, 0.3, 0.4)); g_data_packed = gbuffer_pack(data_in); - EXPECT_EQ(g_data_packed.data_len, 2); + EXPECT_EQ(g_data_packed.layer_data, 2); data_out = gbuffer_read(header_tx, closure_tx, normal_tx, ivec2(0)); @@ -223,16 +223,16 @@ void main() ClosureUndetermined out_refraction = gbuffer_closure_get(data_out, 0); EXPECT_EQ(out_refraction.type, CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID); - EXPECT_EQ(data_in.closure[0].type, CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID); - EXPECT_NEAR(data_in.closure[0].color, out_refraction.color, 1e-5); - EXPECT_NEAR(data_in.closure[0].N, out_refraction.N, 1e-5); - EXPECT_NEAR(data_in.closure[0].data.r, out_refraction.data.r, 1e-5); - EXPECT_NEAR(data_in.closure[0].data.g, out_refraction.data.g, 1e-5); + EXPECT_EQ(data_in.refraction.type, CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID); + EXPECT_NEAR(data_in.refraction.color, out_refraction.color, 1e-5); + EXPECT_NEAR(data_in.refraction.N, out_refraction.N, 1e-5); + EXPECT_NEAR(data_in.refraction.data.r, out_refraction.data.r, 1e-5); + EXPECT_NEAR(data_in.refraction.data.g, out_refraction.data.g, 1e-5); EXPECT_EQ(out_reflection.type, CLOSURE_BSDF_MICROFACET_GGX_REFLECTION_ID); - EXPECT_EQ(data_in.closure[1].type, CLOSURE_BSDF_MICROFACET_GGX_REFLECTION_ID); - EXPECT_NEAR(data_in.closure[1].color, out_reflection.color, 1e-5); - EXPECT_NEAR(data_in.closure[1].N, out_reflection.N, 1e-5); - EXPECT_NEAR(data_in.closure[1].data.r, out_reflection.data.r, 1e-5); + EXPECT_EQ(data_in.reflection.type, CLOSURE_BSDF_MICROFACET_GGX_REFLECTION_ID); + EXPECT_NEAR(data_in.reflection.color, out_reflection.color, 1e-5); + EXPECT_NEAR(data_in.reflection.N, out_reflection.N, 1e-5); + EXPECT_NEAR(data_in.reflection.data.r, out_reflection.data.r, 1e-5); } } diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_gbuffer_lib.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_gbuffer_lib.glsl index 7ad69019d68..1b403956574 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_gbuffer_lib.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_gbuffer_lib.glsl @@ -6,16 +6,6 @@ * G-buffer: Packing and unpacking of G-buffer data. * * See #GBuffer for a breakdown of the G-buffer layout. - * - * There is two way of indexing closure data from the GBuffer: - * - per "bin": same closure indices as during the material evaluation pass. - * Can have none-closures. - * - per "layer": gbuffer internal storage order. Tightly packed, will only have none-closures at - * the end of the array. - * - * Indexing per bin is better to avoid parameter discontinuity for a given closure - * (i.e: for denoising), whereas indexing per layer is better for iterating through the closure - * without dealing with none-closures. */ #pragma BLENDER_REQUIRE(gpu_shader_math_vector_lib.glsl) @@ -27,18 +17,17 @@ * * \{ */ -/* Note: Only specialized for the gbuffer pass. */ -#ifndef GBUFFER_LAYER_MAX -# define GBUFFER_LAYER_MAX 3 -#endif -#define GBUFFER_NORMAL_MAX (GBUFFER_LAYER_MAX + /* Additional data */ 1) +#define GBUFFER_LAYER_MAX 3 +#define GBUFFER_NORMAL_MAX GBUFFER_LAYER_MAX #define GBUFFER_DATA_MAX (GBUFFER_LAYER_MAX * 2) -#define GBUFFER_HEADER_BITS_PER_LAYER 4 /* Note: Reserve the last 4 bits for the normal layers ids. */ #define GBUFFER_NORMAL_BITS_SHIFT 12 struct GBufferData { - ClosureUndetermined closure[GBUFFER_LAYER_MAX]; + ClosureUndetermined diffuse; + ClosureUndetermined translucent; + ClosureUndetermined reflection; + ClosureUndetermined refraction; /* Additional object information if any closure needs it. */ float thickness; uint object_id; @@ -48,19 +37,18 @@ struct GBufferData { /* Result of Packing the GBuffer. */ struct GBufferWriter { - /* Packed GBuffer data in layer indexing. */ + /* TODO(fclem): Better packing. */ vec4 data[GBUFFER_DATA_MAX]; - /* Packed normal data. Redundant normals are omitted. */ vec2 N[GBUFFER_NORMAL_MAX]; - /* Header containing which closures are encoded and which normals are used. */ + uint header; /** Only used for book-keeping. Not actually written. Can be derived from header. */ - /* Number of bins written in the header. Counts empty bins. */ - int bins_len; + /* Number of layers written in the header. */ + int layer_gbuf; /* Number of data written in the data array. */ - int data_len; + int layer_data; /* Number of normal written in the normal array. */ - int normal_len; + int layer_normal; }; /* Result of loading the GBuffer. */ @@ -76,33 +64,12 @@ struct GBufferReader { /* Number of valid closure encoded in the gbuffer. */ int closure_count; /* Only used for book-keeping when reading. */ - int data_len; - /* Only used for debugging and testing. */ - int normal_len; + int layer_data; + int layer_normal; /* Texel of the gbuffer being read. */ ivec2 texel; }; -ClosureType gbuffer_mode_to_closure_type(uint mode) -{ - switch (mode) { - case GBUF_DIFFUSE: - return ClosureType(CLOSURE_BSDF_DIFFUSE_ID); - case GBUF_TRANSLUCENT: - return ClosureType(CLOSURE_BSDF_TRANSLUCENT_ID); - case GBUF_SUBSURFACE: - return ClosureType(CLOSURE_BSSRDF_BURLEY_ID); - case GBUF_REFLECTION_COLORLESS: - case GBUF_REFLECTION: - return ClosureType(CLOSURE_BSDF_MICROFACET_GGX_REFLECTION_ID); - case GBUF_REFRACTION_COLORLESS: - case GBUF_REFRACTION: - return ClosureType(CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID); - default: - return ClosureType(CLOSURE_NONE_ID); - } -} - /** \} */ /* -------------------------------------------------------------------- */ @@ -302,20 +269,20 @@ bool gbuffer_is_refraction(vec4 gbuffer) return gbuffer.w < 1.0; } -uint gbuffer_header_pack(GBufferMode mode, uint bin) +uint gbuffer_header_pack(GBufferMode mode, uint layer) { - return (mode << (4u * bin)); + return (mode << (4u * layer)); } -GBufferMode gbuffer_header_unpack(uint data, uint bin) +GBufferMode gbuffer_header_unpack(uint data, uint layer) { - return GBufferMode((data >> (4u * bin)) & 15u); + return GBufferMode((data >> (4u * layer)) & 15u); } void gbuffer_append_closure(inout GBufferWriter gbuf, GBufferMode closure_type) { - gbuf.header |= gbuffer_header_pack(closure_type, gbuf.bins_len); - gbuf.bins_len++; + gbuf.header |= gbuffer_header_pack(closure_type, gbuf.layer_gbuf); + gbuf.layer_gbuf++; } void gbuffer_register_closure(inout GBufferReader gbuf, ClosureUndetermined cl, int slot) { @@ -337,10 +304,6 @@ void gbuffer_register_closure(inout GBufferReader gbuf, ClosureUndetermined cl, #endif } } -void gbuffer_skip_closure(inout GBufferReader gbuf) -{ - gbuf.closure_count++; -} ClosureUndetermined gbuffer_closure_get(GBufferReader gbuf, int i) { @@ -364,7 +327,7 @@ ClosureUndetermined gbuffer_closure_get(GBufferReader gbuf, int i) void gbuffer_append_data(inout GBufferWriter gbuf, vec4 data) { - switch (gbuf.data_len) { + switch (gbuf.layer_data) { #if GBUFFER_DATA_MAX > 0 case 0: gbuf.data[0] = data; @@ -396,18 +359,14 @@ void gbuffer_append_data(inout GBufferWriter gbuf, vec4 data) break; #endif } - gbuf.data_len++; + gbuf.layer_data++; } vec4 gbuffer_pop_first_data(inout GBufferReader gbuf, samplerGBufferClosure closure_tx) { - vec4 data = fetchGBuffer(closure_tx, gbuf.texel, gbuf.data_len); - gbuf.data_len++; + vec4 data = fetchGBuffer(closure_tx, gbuf.texel, gbuf.layer_data); + gbuf.layer_data++; return data; } -void gbuffer_skip_data(inout GBufferReader gbuf) -{ - gbuf.data_len++; -} /** * Set the dedicated normal bit for the last added closure. @@ -436,30 +395,30 @@ int gbuffer_header_normal_layer_id_get(uint header, int layer_id) void gbuffer_append_normal(inout GBufferWriter gbuf, vec3 normal) { vec2 packed_N = gbuffer_normal_pack(normal); - int layer_id = gbuf.bins_len - 1; + int layer_id = gbuf.layer_gbuf - 1; /* Try to reuse previous normals. */ #if GBUFFER_NORMAL_MAX > 1 - if (gbuf.normal_len > 0 && all(equal(gbuf.N[0], packed_N))) { + if (gbuf.layer_normal > 0 && all(equal(gbuf.N[0], packed_N))) { gbuffer_header_normal_layer_id_set(gbuf.header, layer_id, 0u); return; } #endif #if GBUFFER_NORMAL_MAX > 2 - if (gbuf.normal_len > 1 && all(equal(gbuf.N[1], packed_N))) { + if (gbuf.layer_normal > 1 && all(equal(gbuf.N[1], packed_N))) { gbuffer_header_normal_layer_id_set(gbuf.header, layer_id, 1u); return; } #endif #if GBUFFER_NORMAL_MAX > 3 - if (gbuf.normal_len > 2 && all(equal(gbuf.N[2], packed_N))) { + if (gbuf.layer_normal > 2 && all(equal(gbuf.N[2], packed_N))) { gbuffer_header_normal_layer_id_set(gbuf.header, layer_id, 2u); return; } #endif /* Could not reuse. Add another normal. */ - gbuffer_header_normal_layer_id_set(gbuf.header, layer_id, uint(gbuf.normal_len)); + gbuffer_header_normal_layer_id_set(gbuf.header, layer_id, uint(gbuf.layer_normal)); - switch (gbuf.normal_len) { + switch (gbuf.layer_normal) { #if GBUFFER_NORMAL_MAX > 0 case 0: gbuf.N[0] = packed_N; @@ -476,31 +435,27 @@ void gbuffer_append_normal(inout GBufferWriter gbuf, vec3 normal) break; #endif } - gbuf.normal_len++; + gbuf.layer_normal++; } vec3 gbuffer_normal_get(inout GBufferReader gbuf, int layer_id, samplerGBufferNormal normal_tx) { int normal_layer_id = gbuffer_header_normal_layer_id_get(gbuf.header, layer_id); vec2 normal_packed = fetchGBuffer(normal_tx, gbuf.texel, normal_layer_id).rg; - gbuf.normal_len = max(gbuf.normal_len, normal_layer_id + 1); + gbuf.layer_normal = max(gbuf.layer_normal, normal_layer_id + 1); return gbuffer_normal_unpack(normal_packed); } -void gbuffer_skip_normal(inout GBufferReader gbuf) -{ - /* Nothing to do. Normals are indexed. */ -} /* Pack geometry additional infos onto the normal stack. Needs to be run last. */ void gbuffer_additional_info_pack(inout GBufferWriter gbuf, float thickness, uint object_id) { - gbuf.N[gbuf.normal_len] = vec2(gbuffer_thickness_pack(thickness), - gbuffer_object_id_unorm16_pack(object_id)); - gbuf.normal_len++; + gbuf.N[gbuf.layer_normal] = vec2(gbuffer_thickness_pack(thickness), + gbuffer_object_id_unorm16_pack(object_id)); + gbuf.layer_normal++; } void gbuffer_additional_info_load(inout GBufferReader gbuf, samplerGBufferNormal normal_tx) { - vec2 data_packed = fetchGBuffer(normal_tx, gbuf.texel, gbuf.normal_len).rg; - gbuf.normal_len++; + vec2 data_packed = fetchGBuffer(normal_tx, gbuf.texel, gbuf.layer_normal).rg; + gbuf.layer_normal++; gbuf.thickness = gbuffer_thickness_unpack(data_packed.x); gbuf.object_id = gbuffer_object_id_unorm16_unpack(data_packed.y); } @@ -526,12 +481,7 @@ void gbuffer_closure_diffuse_pack(inout GBufferWriter gbuf, ClosureUndetermined gbuffer_append_data(gbuf, gbuffer_closure_color_pack(cl.color)); gbuffer_append_normal(gbuf, cl.N); } -void gbuffer_closure_diffuse_skip(inout GBufferReader gbuf) -{ - gbuffer_skip_closure(gbuf); - gbuffer_skip_data(gbuf); - gbuffer_skip_normal(gbuf); -} + void gbuffer_closure_diffuse_load(inout GBufferReader gbuf, int layer, samplerGBufferClosure closure_tx, @@ -552,12 +502,7 @@ void gbuffer_closure_translucent_pack(inout GBufferWriter gbuf, ClosureUndetermi gbuffer_append_data(gbuf, gbuffer_closure_color_pack(cl.color)); gbuffer_append_normal(gbuf, cl.N); } -void gbuffer_closure_translucent_skip(inout GBufferReader gbuf) -{ - gbuffer_skip_closure(gbuf); - gbuffer_skip_data(gbuf); - gbuffer_skip_normal(gbuf); -} + void gbuffer_closure_translucent_load(inout GBufferReader gbuf, int layer, samplerGBufferClosure closure_tx, @@ -579,13 +524,7 @@ void gbuffer_closure_subsurface_pack(inout GBufferWriter gbuf, ClosureUndetermin gbuffer_append_data(gbuf, gbuffer_sss_radii_pack(cl.data.xyz)); gbuffer_append_normal(gbuf, cl.N); } -void gbuffer_closure_subsurface_skip(inout GBufferReader gbuf) -{ - gbuffer_skip_closure(gbuf); - gbuffer_skip_data(gbuf); - gbuffer_skip_data(gbuf); - gbuffer_skip_normal(gbuf); -} + void gbuffer_closure_subsurface_load(inout GBufferReader gbuf, int layer, samplerGBufferClosure closure_tx, @@ -609,13 +548,7 @@ void gbuffer_closure_reflection_pack(inout GBufferWriter gbuf, ClosureUndetermin gbuffer_append_data(gbuf, vec4(cl.data.x, 0.0, 0.0, 0.0)); gbuffer_append_normal(gbuf, cl.N); } -void gbuffer_closure_reflection_skip(inout GBufferReader gbuf) -{ - gbuffer_skip_closure(gbuf); - gbuffer_skip_data(gbuf); - gbuffer_skip_data(gbuf); - gbuffer_skip_normal(gbuf); -} + void gbuffer_closure_reflection_load(inout GBufferReader gbuf, int layer, samplerGBufferClosure closure_tx, @@ -639,13 +572,7 @@ void gbuffer_closure_refraction_pack(inout GBufferWriter gbuf, ClosureUndetermin gbuffer_append_data(gbuf, vec4(cl.data.x, gbuffer_ior_pack(cl.data.y), 0.0, 0.0)); gbuffer_append_normal(gbuf, cl.N); } -void gbuffer_closure_refraction_skip(inout GBufferReader gbuf) -{ - gbuffer_skip_closure(gbuf); - gbuffer_skip_data(gbuf); - gbuffer_skip_data(gbuf); - gbuffer_skip_normal(gbuf); -} + void gbuffer_closure_refraction_load(inout GBufferReader gbuf, int layer, samplerGBufferClosure closure_tx, @@ -678,12 +605,7 @@ void gbuffer_closure_reflection_colorless_pack(inout GBufferWriter gbuf, Closure gbuffer_append_data(gbuf, vec4(cl.data.x, 0.0, intensity_packed)); gbuffer_append_normal(gbuf, cl.N); } -void gbuffer_closure_reflection_colorless_skip(inout GBufferReader gbuf) -{ - gbuffer_skip_closure(gbuf); - gbuffer_skip_data(gbuf); - gbuffer_skip_normal(gbuf); -} + void gbuffer_closure_reflection_colorless_load(inout GBufferReader gbuf, int layer, samplerGBufferClosure closure_tx, @@ -707,12 +629,7 @@ void gbuffer_closure_refraction_colorless_pack(inout GBufferWriter gbuf, Closure gbuffer_append_data(gbuf, vec4(cl.data.x, gbuffer_ior_pack(cl.data.y), intensity_packed)); gbuffer_append_normal(gbuf, cl.N); } -void gbuffer_closure_refraction_colorless_skip(inout GBufferReader gbuf) -{ - gbuffer_skip_closure(gbuf); - gbuffer_skip_data(gbuf); - gbuffer_skip_normal(gbuf); -} + void gbuffer_closure_refraction_colorless_load(inout GBufferReader gbuf, int layer, samplerGBufferClosure closure_tx, @@ -738,10 +655,6 @@ void gbuffer_closure_refraction_colorless_load(inout GBufferReader gbuf, * Special cases where we can save some space by packing multiple closures data together. * \{ */ -/* Still unused. Have to finalize support. - * Might be difficult to make it work with #gbuffer_read_bin(). */ -#if 0 - void gbuffer_closure_metal_clear_coat_pack(inout GBufferWriter gbuf, ClosureUndetermined cl_bottom, ClosureUndetermined cl_coat) @@ -749,7 +662,7 @@ void gbuffer_closure_metal_clear_coat_pack(inout GBufferWriter gbuf, vec2 intensity_packed = gbuffer_closure_intensity_pack(cl_coat.color.r); gbuffer_append_closure(gbuf, GBUF_METAL_CLEARCOAT); gbuffer_append_data(gbuf, gbuffer_closure_color_pack(cl_bottom.color)); - gbuffer_append_data(gbuf, vec4(cl_bottom.data.x, cl_coat.data.x, intensity_packed)); + gbuffer_append_data(gbuf, vec4(cl_bottom.data.x, cl_coat.data.y, intensity_packed)); gbuffer_append_normal(gbuf, cl_bottom.N); } @@ -774,8 +687,6 @@ void gbuffer_closure_metal_clear_coat_load(inout GBufferReader gbuf, gbuffer_register_closure(gbuf, coat, 1); } -#endif - /** \} */ /* -------------------------------------------------------------------- */ @@ -787,18 +698,32 @@ GBufferWriter gbuffer_pack(GBufferData data_in) { GBufferWriter gbuf; gbuf.header = 0u; - gbuf.bins_len = 0; - gbuf.data_len = 0; - gbuf.normal_len = 0; + gbuf.layer_gbuf = 0; + gbuf.layer_data = 0; + gbuf.layer_normal = 0; /* Check special configurations first. */ bool has_additional_data = false; - for (int i = 0; i < GBUFFER_LAYER_MAX; i++) { - ClosureUndetermined cl = data_in.closure[i]; + for (int i = 0; i < 4; i++) { + ClosureUndetermined cl; + /* TODO(fclem): Rename inside GBufferData. */ + switch (i) { + case 0: + cl = data_in.diffuse; + break; + case 1: + cl = data_in.refraction; + break; + case 2: + cl = data_in.reflection; + break; + case 3: + cl = data_in.translucent; + break; + } if (cl.weight <= 1e-5) { - gbuf.bins_len++; continue; } @@ -834,7 +759,7 @@ GBufferWriter gbuffer_pack(GBufferData data_in) } } - if (gbuf.normal_len == 0) { + if (gbuf.layer_normal == 0) { gbuffer_closure_unlit_pack(gbuf, data_in.surface_N); } @@ -845,12 +770,11 @@ GBufferWriter gbuffer_pack(GBufferData data_in) return gbuf; } -/* Return the number of closure as encoded in the given header value. */ +/* Return the number of closure as encoded in the give header value. */ int gbuffer_closure_count(uint header) { /* Note: Need to be adjusted for different global GBUFFER_LAYER_MAX. */ - const int bits_per_layer = GBUFFER_HEADER_BITS_PER_LAYER; - uvec3 closure_types = (uvec3(header) >> uvec3(0u, 4u, 8u)) & ((1u << bits_per_layer) - 1); + uvec3 closure_types = (uvec3(header) >> uvec3(0u, 4u, 8u)) & ((1u << 4) - 1); if (closure_types.x == GBUF_METAL_CLEARCOAT) { return 2; @@ -858,66 +782,39 @@ int gbuffer_closure_count(uint header) return reduce_add(ivec3(not(equal(closure_types, uvec3(0u))))); } -/* Return the type of a closure using its bin index. */ -ClosureType gbuffer_closure_type_get_by_bin(uint header, int bin_index) -{ - /* TODO(fclem): Doesn't take GBUF_METAL_CLEARCOAT into account or other mode that could merge two - * bins into one layer. */ - const int bits_per_layer = GBUFFER_HEADER_BITS_PER_LAYER; - uint mode = (header >> (bin_index * bits_per_layer)) & ((1u << bits_per_layer) - 1); - return gbuffer_mode_to_closure_type(mode); -} - -/* Only read closure types out of the header. The rest of GBufferReader is undefined. */ GBufferReader gbuffer_read_header_closure_types(uint header) { GBufferReader gbuf; - for (int bin = 0; bin < GBUFFER_LAYER_MAX; bin++) { - GBufferMode mode = gbuffer_header_unpack(header, bin); - ClosureType closure_type = gbuffer_mode_to_closure_type(mode); - gbuffer_register_closure(gbuf, closure_new(closure_type), bin); + for (int layer = 0; layer < GBUFFER_LAYER_MAX; layer++) { + GBufferMode mode = gbuffer_header_unpack(header, layer); + ClosureType closure_type = CLOSURE_NONE_ID; + switch (mode) { + case GBUF_DIFFUSE: + closure_type = CLOSURE_BSDF_DIFFUSE_ID; + break; + case GBUF_TRANSLUCENT: + closure_type = CLOSURE_BSDF_TRANSLUCENT_ID; + break; + case GBUF_SUBSURFACE: + closure_type = CLOSURE_BSSRDF_BURLEY_ID; + break; + case GBUF_REFLECTION_COLORLESS: + case GBUF_REFLECTION: + closure_type = CLOSURE_BSDF_MICROFACET_GGX_REFLECTION_ID; + break; + case GBUF_REFRACTION_COLORLESS: + case GBUF_REFRACTION: + closure_type = CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID; + break; + default: + break; + } + gbuffer_register_closure(gbuf, closure_new(closure_type), layer); } return gbuf; } -/* Return the bin index of a closure using its layer index. */ -int gbuffer_closure_get_bin_index(GBufferReader gbuf, int layer_index) -{ - int layer = 0; - for (int bin = 0; bin < GBUFFER_LAYER_MAX; bin++) { - GBufferMode mode = gbuffer_header_unpack(gbuf.header, bin); - /* Gbuffer header can have holes. Skip GBUF_NONE. */ - if (mode != GBUF_NONE) { - if (layer == layer_index) { - return bin; - } - layer++; - } - } - /* Should never happen. But avoid out of bound access. */ - return 0; -} - -ClosureUndetermined gbuffer_closure_get_by_bin(GBufferReader gbuf, int bin_index) -{ - int layer_index = 0; - for (int bin = 0; bin < GBUFFER_LAYER_MAX; bin++) { - GBufferMode mode = gbuffer_header_unpack(gbuf.header, bin); - if (bin == bin_index) { - return gbuffer_closure_get(gbuf, layer_index); - } - else { - if (mode != GBUF_NONE) { - layer_index++; - } - } - } - /* Should never happen. */ - return closure_new(CLOSURE_NONE_ID); -} - -/* Read the entirety of the GBuffer. */ GBufferReader gbuffer_read(samplerGBufferHeader header_tx, samplerGBufferClosure closure_tx, samplerGBufferNormal normal_tx, @@ -928,16 +825,15 @@ GBufferReader gbuffer_read(samplerGBufferHeader header_tx, gbuf.thickness = 0.0; gbuf.closure_count = 0; gbuf.object_id = 0u; - gbuf.data_len = 0; - gbuf.normal_len = 0; + gbuf.layer_data = 0; + gbuf.layer_normal = 0; gbuf.surface_N = vec3(0.0); - for (int bin = 0; bin < GBUFFER_LAYER_MAX; bin++) { - gbuffer_register_closure(gbuf, closure_new(CLOSURE_NONE_ID), bin); - } gbuf.header = fetchGBuffer(header_tx, texel); - if (gbuf.header == 0u) { + for (int layer = 0; layer < GBUFFER_LAYER_MAX; layer++) { + gbuffer_register_closure(gbuf, closure_new(CLOSURE_NONE_ID), layer); + } return gbuf; } @@ -945,41 +841,42 @@ GBufferReader gbuffer_read(samplerGBufferHeader header_tx, gbuf.surface_N = gbuffer_normal_unpack(fetchGBuffer(normal_tx, texel, 0).xy); bool has_additional_data = false; - for (int bin = 0; bin < GBUFFER_LAYER_MAX; bin++) { - GBufferMode mode = gbuffer_header_unpack(gbuf.header, bin); + for (int layer = 0; layer < GBUFFER_LAYER_MAX; layer++) { + GBufferMode mode = gbuffer_header_unpack(gbuf.header, layer); switch (mode) { default: case GBUF_NONE: + gbuffer_register_closure(gbuf, closure_new(CLOSURE_NONE_ID), layer); break; case GBUF_DIFFUSE: - gbuffer_closure_diffuse_load(gbuf, gbuf.closure_count, closure_tx, normal_tx); + gbuffer_closure_diffuse_load(gbuf, layer, closure_tx, normal_tx); gbuf.closure_count++; break; case GBUF_TRANSLUCENT: - gbuffer_closure_translucent_load(gbuf, gbuf.closure_count, closure_tx, normal_tx); + gbuffer_closure_translucent_load(gbuf, layer, closure_tx, normal_tx); gbuf.closure_count++; has_additional_data = true; break; case GBUF_SUBSURFACE: - gbuffer_closure_subsurface_load(gbuf, gbuf.closure_count, closure_tx, normal_tx); + gbuffer_closure_subsurface_load(gbuf, layer, closure_tx, normal_tx); gbuf.closure_count++; has_additional_data = true; break; case GBUF_REFLECTION: - gbuffer_closure_reflection_load(gbuf, gbuf.closure_count, closure_tx, normal_tx); + gbuffer_closure_reflection_load(gbuf, layer, closure_tx, normal_tx); gbuf.closure_count++; break; case GBUF_REFRACTION: - gbuffer_closure_refraction_load(gbuf, gbuf.closure_count, closure_tx, normal_tx); + gbuffer_closure_refraction_load(gbuf, layer, closure_tx, normal_tx); gbuf.closure_count++; has_additional_data = true; break; case GBUF_REFLECTION_COLORLESS: - gbuffer_closure_reflection_colorless_load(gbuf, gbuf.closure_count, closure_tx, normal_tx); + gbuffer_closure_reflection_colorless_load(gbuf, layer, closure_tx, normal_tx); gbuf.closure_count++; break; case GBUF_REFRACTION_COLORLESS: - gbuffer_closure_refraction_colorless_load(gbuf, gbuf.closure_count, closure_tx, normal_tx); + gbuffer_closure_refraction_colorless_load(gbuf, layer, closure_tx, normal_tx); gbuf.closure_count++; has_additional_data = true; break; @@ -993,90 +890,4 @@ GBufferReader gbuffer_read(samplerGBufferHeader header_tx, return gbuf; } -/* Read only one bin from the GBuffer. */ -ClosureUndetermined gbuffer_read_bin(samplerGBufferHeader header_tx, - samplerGBufferClosure closure_tx, - samplerGBufferNormal normal_tx, - ivec2 texel, - int bin_index) -{ - GBufferReader gbuf; - gbuf.texel = texel; - gbuf.closure_count = 0; - gbuf.data_len = 0; - gbuf.normal_len = 0; - gbuf.header = fetchGBuffer(header_tx, texel); - - if (gbuf.header == 0u) { - return closure_new(CLOSURE_NONE_ID); - } - - GBufferMode mode; - for (int bin = 0; bin < GBUFFER_LAYER_MAX; bin++) { - mode = gbuffer_header_unpack(gbuf.header, bin); - - if (mode != GBUF_NONE && bin >= bin_index) { - break; - } - - switch (mode) { - default: - case GBUF_NONE: - break; - case GBUF_DIFFUSE: - gbuffer_closure_diffuse_skip(gbuf); - break; - case GBUF_TRANSLUCENT: - gbuffer_closure_translucent_skip(gbuf); - break; - case GBUF_SUBSURFACE: - gbuffer_closure_subsurface_skip(gbuf); - break; - case GBUF_REFLECTION: - gbuffer_closure_reflection_skip(gbuf); - break; - case GBUF_REFRACTION: - gbuffer_closure_refraction_skip(gbuf); - break; - case GBUF_REFLECTION_COLORLESS: - gbuffer_closure_reflection_colorless_skip(gbuf); - break; - case GBUF_REFRACTION_COLORLESS: - gbuffer_closure_refraction_colorless_skip(gbuf); - break; - } - } - - bool has_additional_data = false; - switch (mode) { - default: - case GBUF_NONE: - gbuffer_register_closure(gbuf, closure_new(CLOSURE_NONE_ID), gbuf.closure_count); - break; - case GBUF_DIFFUSE: - gbuffer_closure_diffuse_load(gbuf, gbuf.closure_count, closure_tx, normal_tx); - break; - case GBUF_TRANSLUCENT: - gbuffer_closure_translucent_load(gbuf, gbuf.closure_count, closure_tx, normal_tx); - break; - case GBUF_SUBSURFACE: - gbuffer_closure_subsurface_load(gbuf, gbuf.closure_count, closure_tx, normal_tx); - break; - case GBUF_REFLECTION: - gbuffer_closure_reflection_load(gbuf, gbuf.closure_count, closure_tx, normal_tx); - break; - case GBUF_REFRACTION: - gbuffer_closure_refraction_load(gbuf, gbuf.closure_count, closure_tx, normal_tx); - break; - case GBUF_REFLECTION_COLORLESS: - gbuffer_closure_reflection_colorless_load(gbuf, gbuf.closure_count, closure_tx, normal_tx); - break; - case GBUF_REFRACTION_COLORLESS: - gbuffer_closure_refraction_colorless_load(gbuf, gbuf.closure_count, closure_tx, normal_tx); - break; - } - - return gbuffer_closure_get(gbuf, gbuf.closure_count); -} - /** \} */ diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_gbuffer_normal_test.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_gbuffer_normal_test.glsl index 65e9282af51..ea6c740eb09 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_gbuffer_normal_test.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_gbuffer_normal_test.glsl @@ -15,9 +15,10 @@ GBufferData gbuffer_new() { GBufferData data; - data.closure[0].weight = 0.0; - data.closure[1].weight = 0.0; - data.closure[2].weight = 0.0; + data.diffuse.weight = 0.0; + data.translucent.weight = 0.0; + data.reflection.weight = 0.0; + data.refraction.weight = 0.0; data.thickness = 0.2; data.object_id = 0xF220u; data.surface_N = normalize(vec3(0.1, 0.2, 0.3)); @@ -30,9 +31,9 @@ void main() { GBufferWriter gbuf; gbuf.header = 0u; - gbuf.bins_len = 0; - gbuf.data_len = 0; - gbuf.normal_len = 0; + gbuf.layer_gbuf = 0; + gbuf.layer_data = 0; + gbuf.layer_normal = 0; vec3 N0 = normalize(vec3(0.2, 0.1, 0.3)); vec3 N1 = normalize(vec3(0.1, 0.2, 0.3)); @@ -41,22 +42,22 @@ void main() gbuffer_append_closure(gbuf, GBUF_DIFFUSE); gbuffer_append_normal(gbuf, N0); - EXPECT_EQ(gbuf.bins_len, 1); - EXPECT_EQ(gbuf.normal_len, 1); + EXPECT_EQ(gbuf.layer_gbuf, 1); + EXPECT_EQ(gbuf.layer_normal, 1); EXPECT_EQ(gbuf.N[0], gbuffer_normal_pack(N0)); gbuffer_append_closure(gbuf, GBUF_DIFFUSE); gbuffer_append_normal(gbuf, N1); - EXPECT_EQ(gbuf.bins_len, 2); - EXPECT_EQ(gbuf.normal_len, 2); + EXPECT_EQ(gbuf.layer_gbuf, 2); + EXPECT_EQ(gbuf.layer_normal, 2); EXPECT_EQ(gbuf.N[1], gbuffer_normal_pack(N1)); gbuffer_append_closure(gbuf, GBUF_DIFFUSE); gbuffer_append_normal(gbuf, N2); - EXPECT_EQ(gbuf.bins_len, 3); - EXPECT_EQ(gbuf.normal_len, 3); + EXPECT_EQ(gbuf.layer_gbuf, 3); + EXPECT_EQ(gbuf.layer_normal, 3); EXPECT_EQ(gbuf.N[2], gbuffer_normal_pack(N2)); } @@ -64,30 +65,30 @@ void main() { GBufferWriter gbuf; gbuf.header = 0u; - gbuf.bins_len = 0; - gbuf.data_len = 0; - gbuf.normal_len = 0; + gbuf.layer_gbuf = 0; + gbuf.layer_data = 0; + gbuf.layer_normal = 0; vec3 N0 = normalize(vec3(0.2, 0.1, 0.3)); gbuffer_append_closure(gbuf, GBUF_DIFFUSE); gbuffer_append_normal(gbuf, N0); - EXPECT_EQ(gbuf.bins_len, 1); - EXPECT_EQ(gbuf.normal_len, 1); + EXPECT_EQ(gbuf.layer_gbuf, 1); + EXPECT_EQ(gbuf.layer_normal, 1); EXPECT_EQ(gbuf.N[0], gbuffer_normal_pack(N0)); gbuffer_append_closure(gbuf, GBUF_DIFFUSE); gbuffer_append_normal(gbuf, N0); - EXPECT_EQ(gbuf.bins_len, 2); - EXPECT_EQ(gbuf.normal_len, 1); + EXPECT_EQ(gbuf.layer_gbuf, 2); + EXPECT_EQ(gbuf.layer_normal, 1); gbuffer_append_closure(gbuf, GBUF_DIFFUSE); gbuffer_append_normal(gbuf, N0); - EXPECT_EQ(gbuf.bins_len, 3); - EXPECT_EQ(gbuf.normal_len, 1); + EXPECT_EQ(gbuf.layer_gbuf, 3); + EXPECT_EQ(gbuf.layer_normal, 1); } GBufferData data_in; @@ -114,18 +115,18 @@ void main() TEST(eevee_gbuffer, NormalReuseDoubleFirst) { data_in = gbuffer_new(); - data_in.closure[0] = cl1; - data_in.closure[1] = cl1; + data_in.refraction = cl1; + data_in.reflection = cl1; g_data_packed = gbuffer_pack(data_in); - EXPECT_EQ(g_data_packed.data_len, 2); - EXPECT_EQ(g_data_packed.normal_len, 1); + EXPECT_EQ(g_data_packed.layer_gbuf, 2); + EXPECT_EQ(g_data_packed.layer_normal, 1); data_out = gbuffer_read(header_tx, closure_tx, normal_tx, ivec2(0)); EXPECT_EQ(data_out.closure_count, 2); - EXPECT_EQ(data_out.normal_len, 1); + EXPECT_EQ(data_out.layer_normal, 1); EXPECT_NEAR(cl1.N, gbuffer_closure_get(data_out, 0).N, 1e-5); EXPECT_NEAR(cl1.N, gbuffer_closure_get(data_out, 1).N, 1e-5); } @@ -133,18 +134,18 @@ void main() TEST(eevee_gbuffer, NormalReuseDoubleNone) { data_in = gbuffer_new(); - data_in.closure[0] = cl1; - data_in.closure[1] = cl2; + data_in.refraction = cl1; + data_in.reflection = cl2; g_data_packed = gbuffer_pack(data_in); - EXPECT_EQ(g_data_packed.data_len, 2); - EXPECT_EQ(g_data_packed.normal_len, 2); + EXPECT_EQ(g_data_packed.layer_gbuf, 2); + EXPECT_EQ(g_data_packed.layer_normal, 2); data_out = gbuffer_read(header_tx, closure_tx, normal_tx, ivec2(0)); EXPECT_EQ(data_out.closure_count, 2); - EXPECT_EQ(data_out.normal_len, 2); + EXPECT_EQ(data_out.layer_normal, 2); EXPECT_NEAR(cl1.N, gbuffer_closure_get(data_out, 0).N, 1e-5); EXPECT_NEAR(cl2.N, gbuffer_closure_get(data_out, 1).N, 1e-5); } @@ -152,18 +153,18 @@ void main() TEST(eevee_gbuffer, NormalReuseTripleFirst) { data_in = gbuffer_new(); - data_in.closure[0] = cl1; - data_in.closure[1] = cl2; - data_in.closure[2] = cl2; + data_in.diffuse = cl1; + data_in.refraction = cl2; + data_in.reflection = cl2; g_data_packed = gbuffer_pack(data_in); - EXPECT_EQ(g_data_packed.normal_len, 2); + EXPECT_EQ(g_data_packed.layer_normal, 2); data_out = gbuffer_read(header_tx, closure_tx, normal_tx, ivec2(0)); EXPECT_EQ(data_out.closure_count, 3); - EXPECT_EQ(data_out.normal_len, 2); + EXPECT_EQ(data_out.layer_normal, 2); EXPECT_NEAR(cl1.N, gbuffer_closure_get(data_out, 0).N, 1e-5); EXPECT_NEAR(cl2.N, gbuffer_closure_get(data_out, 1).N, 1e-5); EXPECT_NEAR(cl2.N, gbuffer_closure_get(data_out, 2).N, 1e-5); @@ -172,18 +173,18 @@ void main() TEST(eevee_gbuffer, NormalReuseTripleSecond) { data_in = gbuffer_new(); - data_in.closure[0] = cl2; - data_in.closure[1] = cl1; - data_in.closure[2] = cl2; + data_in.diffuse = cl2; + data_in.refraction = cl1; + data_in.reflection = cl2; g_data_packed = gbuffer_pack(data_in); - EXPECT_EQ(g_data_packed.normal_len, 2); + EXPECT_EQ(g_data_packed.layer_normal, 2); data_out = gbuffer_read(header_tx, closure_tx, normal_tx, ivec2(0)); EXPECT_EQ(data_out.closure_count, 3); - EXPECT_EQ(data_out.normal_len, 2); + EXPECT_EQ(data_out.layer_normal, 2); EXPECT_NEAR(cl2.N, gbuffer_closure_get(data_out, 0).N, 1e-5); EXPECT_NEAR(cl1.N, gbuffer_closure_get(data_out, 1).N, 1e-5); EXPECT_NEAR(cl2.N, gbuffer_closure_get(data_out, 2).N, 1e-5); @@ -192,18 +193,18 @@ void main() TEST(eevee_gbuffer, NormalReuseTripleThird) { data_in = gbuffer_new(); - data_in.closure[0] = cl2; - data_in.closure[1] = cl2; - data_in.closure[2] = cl1; + data_in.diffuse = cl2; + data_in.refraction = cl2; + data_in.reflection = cl1; g_data_packed = gbuffer_pack(data_in); - EXPECT_EQ(g_data_packed.normal_len, 2); + EXPECT_EQ(g_data_packed.layer_normal, 2); data_out = gbuffer_read(header_tx, closure_tx, normal_tx, ivec2(0)); EXPECT_EQ(data_out.closure_count, 3); - EXPECT_EQ(data_out.normal_len, 2); + EXPECT_EQ(data_out.layer_normal, 2); EXPECT_NEAR(cl2.N, gbuffer_closure_get(data_out, 0).N, 1e-5); EXPECT_NEAR(cl2.N, gbuffer_closure_get(data_out, 1).N, 1e-5); EXPECT_NEAR(cl1.N, gbuffer_closure_get(data_out, 2).N, 1e-5); @@ -212,18 +213,18 @@ void main() TEST(eevee_gbuffer, NormalReuseTripleNone) { data_in = gbuffer_new(); - data_in.closure[0] = cl1; - data_in.closure[1] = cl2; - data_in.closure[2] = cl3; + data_in.diffuse = cl1; + data_in.refraction = cl2; + data_in.reflection = cl3; g_data_packed = gbuffer_pack(data_in); - EXPECT_EQ(g_data_packed.normal_len, 3); + EXPECT_EQ(g_data_packed.layer_normal, 3); data_out = gbuffer_read(header_tx, closure_tx, normal_tx, ivec2(0)); EXPECT_EQ(data_out.closure_count, 3); - EXPECT_EQ(data_out.normal_len, 3); + EXPECT_EQ(data_out.layer_normal, 3); EXPECT_NEAR(cl1.N, gbuffer_closure_get(data_out, 0).N, 1e-5); EXPECT_NEAR(cl2.N, gbuffer_closure_get(data_out, 1).N, 1e-5); EXPECT_NEAR(cl3.N, gbuffer_closure_get(data_out, 2).N, 1e-5); diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_horizon_denoise_comp.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_horizon_denoise_comp.glsl index 80db3b8e832..8acd2e13fa3 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_horizon_denoise_comp.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_horizon_denoise_comp.glsl @@ -81,13 +81,16 @@ void main() return; } - ClosureUndetermined closure_center = gbuffer_read_bin( - gbuf_header_tx, gbuf_closure_tx, gbuf_normal_tx, texel_fullres, closure_index); + GBufferReader gbuf = gbuffer_read( + gbuf_header_tx, gbuf_closure_tx, gbuf_normal_tx, texel_fullres); - if (closure_center.type == CLOSURE_NONE_ID) { + bool has_valid_closure = closure_index < gbuf.closure_count; + if (!has_valid_closure) { return; } + ClosureUndetermined closure_center = gbuffer_closure_get(gbuf, closure_index); + vec3 center_N = closure_center.N; float roughness = closure_apparent_roughness_get(closure_center); diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_horizon_scan_comp.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_horizon_scan_comp.glsl index a4c2dc2a0b7..d861c2772dc 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_horizon_scan_comp.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_horizon_scan_comp.glsl @@ -32,16 +32,19 @@ void main() return; } - HorizonScanContext ctx; - ctx.closure = gbuffer_read_bin( - gbuf_header_tx, gbuf_closure_tx, gbuf_normal_tx, texel_fullres, closure_index); - ctx.closure.N = drw_normal_world_to_view(ctx.closure.N); + GBufferReader gbuf = gbuffer_read( + gbuf_header_tx, gbuf_closure_tx, gbuf_normal_tx, texel_fullres); - if (ctx.closure.type == CLOSURE_NONE_ID) { + bool has_valid_closure = closure_index < gbuf.closure_count; + if (!has_valid_closure) { imageStore(horizon_radiance_img, texel, vec4(FLT_11_11_10_MAX, 0.0)); return; } + HorizonScanContext ctx; + ctx.closure = gbuffer_closure_get(gbuf, closure_index); + ctx.closure.N = drw_normal_world_to_view(ctx.closure.N); + vec3 vP = drw_point_screen_to_view(vec3(uv, depth)); vec2 noise = utility_tx_fetch(utility_tx, vec2(texel), UTIL_BLUE_NOISE_LAYER).rg; diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_light_culling_debug_frag.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_light_culling_debug_frag.glsl index d2c790b28da..344dbc76635 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_light_culling_debug_frag.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_light_culling_debug_frag.glsl @@ -37,7 +37,7 @@ void main() LightData light = light_buf[l_idx]; LightVector lv = light_vector_get(light, false, P); /* Use light vector as Ng to never cull based on angle to light. */ - if (light_attenuation_surface(light, false, lv.L, lv).x > LIGHT_ATTENUATION_THRESHOLD) { + if (light_attenuation_surface(light, false, lv.L, false, lv) > LIGHT_ATTENUATION_THRESHOLD) { light_nocull |= 1u << l_idx; } } diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_light_eval_lib.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_light_eval_lib.glsl index b65fff65d1a..6a63c5ab2d5 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_light_eval_lib.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_light_eval_lib.glsl @@ -14,7 +14,6 @@ */ #pragma BLENDER_REQUIRE(eevee_shadow_tracing_lib.glsl) -#pragma BLENDER_REQUIRE(eevee_bxdf_lib.glsl) #pragma BLENDER_REQUIRE(eevee_light_lib.glsl) #pragma BLENDER_REQUIRE(eevee_shadow_lib.glsl) #pragma BLENDER_REQUIRE(gpu_shader_codegen_lib.glsl) @@ -53,9 +52,10 @@ void light_shadow_single(uint l_idx, return; } + bool use_subsurface = thickness > 0.0; LightVector lv = light_vector_get(light, is_directional, P); - vec2 attenuation = light_attenuation_surface(light, is_directional, Ng, lv); - if (reduce_max(attenuation) < LIGHT_ATTENUATION_THRESHOLD) { + float attenuation = light_attenuation_surface(light, is_directional, Ng, use_subsurface, lv); + if (attenuation < LIGHT_ATTENUATION_THRESHOLD) { return; } @@ -99,50 +99,11 @@ struct ClosureLight { vec4 ltc_mat; /* Enum (used as index) telling how to treat the lighting. */ LightingType type; - /* True if closure is receiving light from below the surface. */ - bool subsurface; /* Output both shadowed and unshadowed for shadow denoising. */ vec3 light_shadowed; vec3 light_unshadowed; }; -ClosureLight closure_light_new(ClosureUndetermined cl, vec3 V) -{ - ClosureLight cl_light; - cl_light.N = cl.N; - cl_light.ltc_mat = LTC_LAMBERT_MAT; - cl_light.type = LIGHT_DIFFUSE; - cl_light.light_shadowed = vec3(0.0); - cl_light.subsurface = false; - switch (cl.type) { - case CLOSURE_BSDF_TRANSLUCENT_ID: - cl_light.N = -cl.N; - cl_light.subsurface = true; - break; - case CLOSURE_BSSRDF_BURLEY_ID: - case CLOSURE_BSDF_DIFFUSE_ID: - break; - case CLOSURE_BSDF_MICROFACET_GGX_REFLECTION_ID: - cl_light.ltc_mat = LTC_GGX_MAT(dot(cl.N, V), cl.data.x); - cl_light.type = LIGHT_SPECULAR; - break; - case CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID: { - ClosureRefraction cl_refract = to_closure_refraction(cl); - vec3 R = refract(-V, cl.N, 1.0 / cl_refract.ior); - float roughness = refraction_roughness_remapping(cl_refract.roughness, cl_refract.ior); - cl_light.ltc_mat = LTC_GGX_MAT(dot(-cl.N, R), roughness); - cl_light.N = -cl.N; - cl_light.type = LIGHT_SPECULAR; - cl_light.subsurface = true; - break; - } - case CLOSURE_NONE_ID: - /* TODO(fclem): Assert. */ - break; - } - return cl_light; -} - struct ClosureLightStack { /* NOTE: This is wrapped into a struct to avoid array shenanigans on MSL. */ ClosureLight cl[LIGHT_CLOSURE_EVAL_COUNT]; @@ -154,16 +115,14 @@ void light_eval_single_closure(LightData light, vec3 P, vec3 V, float thickness, - vec2 attenuation, - float shadow) + float attenuation, + float visibility) { if (light.power[cl.type] > 0.0) { float ltc_result = light_ltc(utility_tx, light, cl.N, V, lv, cl.ltc_mat); vec3 out_radiance = light.color * light.power[cl.type] * ltc_result; - float attenuation_sided = (cl.subsurface) ? attenuation.y : attenuation.x; - float visibility = shadow * attenuation_sided; cl.light_shadowed += visibility * out_radiance; - cl.light_unshadowed += attenuation_sided * out_radiance; + cl.light_unshadowed += attenuation * out_radiance; } } @@ -189,8 +148,8 @@ void light_eval_single(uint l_idx, bool use_subsurface = thickness > 0.0; LightVector lv = light_vector_get(light, is_directional, P); - vec2 attenuation = light_attenuation_surface(light, is_directional, Ng, lv); - if (reduce_max(attenuation) < LIGHT_ATTENUATION_THRESHOLD) { + float attenuation = light_attenuation_surface(light, is_directional, Ng, use_subsurface, lv); + if (attenuation < LIGHT_ATTENUATION_THRESHOLD) { return; } float shadow = 1.0; @@ -204,10 +163,11 @@ void light_eval_single(uint l_idx, shadow = result.light_visibilty; #endif } + float visibility = attenuation * shadow; /* WATCH(@fclem): Might have to manually unroll for best performance. */ for (int i = 0; i < LIGHT_CLOSURE_EVAL_COUNT; i++) { - light_eval_single_closure(light, lv, stack.cl[i], P, V, thickness, attenuation, shadow); + light_eval_single_closure(light, lv, stack.cl[i], P, V, thickness, attenuation, visibility); } } diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_light_lib.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_light_lib.glsl index 98662627d6e..4f8762975a3 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_light_lib.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_light_lib.glsl @@ -118,34 +118,24 @@ float light_attenuation_common(LightData light, const bool is_directional, vec3 /** * Fade light influence when surface is not facing the light. - * This is needed because LTC leaks light at roughness not 0 or 1 - * when the light is below the horizon. * L is normalized vector to light shape center. * Ng is ideally the geometric normal. */ -vec2 light_attenuation_facing(LightData light, vec3 L, float distance_to_light, vec3 Ng) +float light_attenuation_facing(LightData light, vec3 L, vec3 Ng, bool use_subsurface) { - float radius; - if (is_area_light(light.type)) { - radius = length(vec2(light._area_size_x, light._area_size_y)); + if (use_subsurface) { + return 1.0; } - else { - radius = light._radius; - } - /* Sine of angle between light center and light edge. */ - float sin_solid_angle = radius / distance_to_light; - /* Sine of angle between light center and shading plane. */ - float sin_light_angle = dot(L, Ng); - /* Do attenuation after the horizon line to avoid harsh cut - * or biasing of surfaces without light bleeding. */ - /* Compute for both front facing and back-facing. */ - return saturate((vec2(sin_light_angle, -sin_light_angle) + sin_solid_angle + 0.1) * 10.0); + /* TODO(fclem): Take into consideration the light radius. */ + return float(dot(L, Ng) > 0.0); } -vec2 light_attenuation_surface(LightData light, const bool is_directional, vec3 Ng, LightVector lv) +float light_attenuation_surface( + LightData light, const bool is_directional, vec3 Ng, bool use_subsurface, LightVector lv) { + /* TODO(fclem): add cutoff attenuation when back-facing. For now do nothing with Ng. */ return light_attenuation_common(light, is_directional, lv.L) * - light_attenuation_facing(light, lv.L, lv.dist, Ng) * + light_attenuation_facing(light, lv.L, Ng, use_subsurface) * light_influence_attenuation(lv.dist, light.influence_radius_invsqr_surface); } diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_lightprobe_eval_lib.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_lightprobe_eval_lib.glsl index a2b1d0b2307..074f9549b5d 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_lightprobe_eval_lib.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_lightprobe_eval_lib.glsl @@ -3,9 +3,7 @@ * SPDX-License-Identifier: GPL-2.0-or-later */ #pragma BLENDER_REQUIRE(gpu_shader_math_base_lib.glsl) -#pragma BLENDER_REQUIRE(gpu_shader_math_fast_lib.glsl) #pragma BLENDER_REQUIRE(gpu_shader_codegen_lib.glsl) -#pragma BLENDER_REQUIRE(eevee_bxdf_lib.glsl) #pragma BLENDER_REQUIRE(eevee_lightprobe_lib.glsl) #pragma BLENDER_REQUIRE(eevee_ray_generate_lib.glsl) #pragma BLENDER_REQUIRE(eevee_reflection_probe_eval_lib.glsl) @@ -13,7 +11,7 @@ #pragma BLENDER_REQUIRE(eevee_sampling_lib.glsl) #pragma BLENDER_REQUIRE(eevee_spherical_harmonics_lib.glsl) -#ifdef SPHERE_PROBE +#ifdef REFLECTION_PROBE struct LightProbeSample { SphericalHarmonicL1 volume_irradiance; @@ -26,8 +24,8 @@ struct LightProbeSample { */ LightProbeSample lightprobe_load(vec3 P, vec3 Ng, vec3 V) { - float noise = interlieved_gradient_noise(UTIL_TEXEL, 0.0, 0.0); - noise = fract(noise + sampling_rng_1D_get(SAMPLING_LIGHTPROBE)); + /* TODO: Dependency hell */ + float noise = 0.0; LightProbeSample result; result.volume_irradiance = lightprobe_irradiance_sample(P, V, Ng); @@ -36,7 +34,7 @@ LightProbeSample lightprobe_load(vec3 P, vec3 Ng, vec3 V) } /* Return the best parallax corrected ray direction from the probe center. */ -vec3 lightprobe_sphere_parallax(SphereProbeData probe, vec3 P, vec3 L) +vec3 lightprobe_sphere_parallax(ReflectionProbeData probe, vec3 P, vec3 L) { bool is_world = (probe.influence_scale == 0.0); if (is_world) { @@ -65,7 +63,7 @@ vec3 lightprobe_sphere_parallax(SphereProbeData probe, vec3 P, vec3 L) vec3 lightprobe_spherical_sample_normalized_with_parallax( int probe_index, vec3 P, vec3 L, float lod, SphericalHarmonicL1 P_sh) { - SphereProbeData probe = reflection_probe_buf[probe_index]; + ReflectionProbeData probe = reflection_probe_buf[probe_index]; ReflectionProbeLowFreqLight shading_sh = reflection_probes_extract_low_freq(P_sh); vec3 normalization_factor = reflection_probes_normalization_eval( L, shading_sh, probe.low_freq_light); @@ -75,7 +73,7 @@ vec3 lightprobe_spherical_sample_normalized_with_parallax( float pdf_to_lod(float pdf) { - return 0.0; /* TODO */ + return 1.0; /* TODO */ } vec3 lightprobe_eval_direction(LightProbeSample samp, vec3 P, vec3 L, float pdf) @@ -86,6 +84,18 @@ vec3 lightprobe_eval_direction(LightProbeSample samp, vec3 P, vec3 L, float pdf) return radiance_sh; } +float lightprobe_roughness_to_cube_sh_mix_fac(float roughness) +{ + /* Temporary. Do something better. */ + return square(saturate(roughness * 4.0 - 2.0)); +} + +float lightprobe_roughness_to_lod(float roughness) +{ + /* Temporary. Do something better. */ + return sqrt(roughness) * REFLECTION_PROBE_MIPMAP_LEVELS; +} + vec3 lightprobe_eval(LightProbeSample samp, ClosureDiffuse cl, vec3 P, vec3 V) { vec3 radiance_sh = spherical_harmonics_evaluate_lambert(cl.N, samp.volume_irradiance); @@ -100,14 +110,9 @@ vec3 lightprobe_eval(LightProbeSample samp, ClosureTranslucent cl, vec3 P, vec3 vec3 lightprobe_reflection_dominant_dir(vec3 N, vec3 V, float roughness) { - /* From Frostbite PBR Course - * http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf - * Listing 22. - * Note that the reference labels squared roughness (GGX input) as roughness. */ - float m = square(roughness); vec3 R = -reflect(V, N); - float smoothness = 1.0 - m; - float fac = smoothness * (sqrt(smoothness) + m); + float smoothness = 1.0 - roughness; + float fac = smoothness * (sqrt(smoothness) + roughness); return normalize(mix(N, R, fac)); } @@ -115,64 +120,34 @@ vec3 lightprobe_eval(LightProbeSample samp, ClosureReflection reflection, vec3 P { vec3 L = lightprobe_reflection_dominant_dir(reflection.N, V, reflection.roughness); - float lod = sphere_probe_roughness_to_lod(reflection.roughness); + float lod = lightprobe_roughness_to_lod(reflection.roughness); vec3 radiance_cube = lightprobe_spherical_sample_normalized_with_parallax( samp.spherical_id, P, L, lod, samp.volume_irradiance); - float fac = sphere_probe_roughness_to_mix_fac(reflection.roughness); + float fac = lightprobe_roughness_to_cube_sh_mix_fac(reflection.roughness); vec3 radiance_sh = spherical_harmonics_evaluate_lambert(L, samp.volume_irradiance); return mix(radiance_cube, radiance_sh, fac); } vec3 lightprobe_refraction_dominant_dir(vec3 N, vec3 V, float ior, float roughness) { - /* Reusing same thing as lightprobe_reflection_dominant_dir for now with the roughness mapped to - * reflection roughness. */ - float m = square(roughness); vec3 R = refract(-V, N, 1.0 / ior); - float smoothness = 1.0 - m; - float fac = smoothness * (sqrt(smoothness) + m); + float smoothness = 1.0 - roughness; + float fac = smoothness * (sqrt(smoothness) + roughness); return normalize(mix(-N, R, fac)); } vec3 lightprobe_eval(LightProbeSample samp, ClosureRefraction cl, vec3 P, vec3 V) { - float effective_roughness = refraction_roughness_remapping(cl.roughness, cl.ior); + vec3 L = lightprobe_refraction_dominant_dir(cl.N, V, cl.ior, cl.roughness); - vec3 L = lightprobe_refraction_dominant_dir(cl.N, V, cl.ior, effective_roughness); - - float lod = sphere_probe_roughness_to_lod(effective_roughness); + float lod = lightprobe_roughness_to_lod(cl.roughness); vec3 radiance_cube = lightprobe_spherical_sample_normalized_with_parallax( samp.spherical_id, P, L, lod, samp.volume_irradiance); - float fac = sphere_probe_roughness_to_mix_fac(effective_roughness); + float fac = lightprobe_roughness_to_cube_sh_mix_fac(cl.roughness); vec3 radiance_sh = spherical_harmonics_evaluate_lambert(L, samp.volume_irradiance); return mix(radiance_cube, radiance_sh, fac); } -void lightprobe_eval( - LightProbeSample samp, ClosureUndetermined cl, vec3 P, vec3 V, inout vec3 radiance) -{ - switch (cl.type) { - case CLOSURE_BSDF_TRANSLUCENT_ID: - /* TODO: Support in ray tracing first. Otherwise we have a discrepancy. */ - radiance += lightprobe_eval(samp, to_closure_translucent(cl), P, V); - break; - case CLOSURE_BSSRDF_BURLEY_ID: - /* TODO: Support translucency in ray tracing first. Otherwise we have a discrepancy. */ - case CLOSURE_BSDF_DIFFUSE_ID: - radiance += lightprobe_eval(samp, to_closure_diffuse(cl), P, V); - break; - case CLOSURE_BSDF_MICROFACET_GGX_REFLECTION_ID: - radiance += lightprobe_eval(samp, to_closure_reflection(cl), P, V); - break; - case CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID: - radiance += lightprobe_eval(samp, to_closure_refraction(cl), P, V); - break; - case CLOSURE_NONE_ID: - /* TODO(fclem): Assert. */ - break; - } -} - -#endif /* SPHERE_PROBE */ +#endif /* REFLECTION_PROBE */ diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_lightprobe_irradiance_ray_comp.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_lightprobe_irradiance_ray_comp.glsl index c50fe6b5bc7..3c7f33f5826 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_lightprobe_irradiance_ray_comp.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_lightprobe_irradiance_ray_comp.glsl @@ -67,7 +67,7 @@ void irradiance_capture_world(vec3 L, inout SphericalHarmonicL1 sh) float visibility = 0.0; if (capture_info_buf.capture_world_direct) { - SphereProbeUvArea atlas_coord = capture_info_buf.world_atlas_coord; + ReflectionProbeCoordinate atlas_coord = capture_info_buf.world_atlas_coord; radiance = reflection_probes_sample(L, 0.0, atlas_coord).rgb; /* Clamped brightness. */ diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_lightprobe_lib.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_lightprobe_lib.glsl index 8815448cc1e..3ae4db73cc7 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_lightprobe_lib.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_lightprobe_lib.glsl @@ -19,7 +19,7 @@ vec3 lightprobe_irradiance_grid_sample_position(mat4 grid_local_to_world_mat, * Return true if sample position is valid. * \a r_lP is the local position in grid units [0..grid_size). */ -bool lightprobe_irradiance_grid_local_coord(VolumeProbeData grid_data, vec3 P, out vec3 r_lP) +bool lightprobe_irradiance_grid_local_coord(IrradianceGridData grid_data, vec3 P, out vec3 r_lP) { /* Position in cell units. */ /* NOTE: The vector-matrix multiplication swapped on purpose to cancel the matrix transpose. */ @@ -29,7 +29,7 @@ bool lightprobe_irradiance_grid_local_coord(VolumeProbeData grid_data, vec3 P, o return all(equal(lP, r_lP)); } -int lightprobe_irradiance_grid_brick_index_get(VolumeProbeData grid_data, ivec3 brick_coord) +int lightprobe_irradiance_grid_brick_index_get(IrradianceGridData grid_data, ivec3 brick_coord) { int3 grid_size_in_bricks = divide_ceil(grid_data.grid_size, int3(IRRADIANCE_GRID_BRICK_SIZE - 1)); @@ -46,7 +46,7 @@ ivec3 lightprobe_irradiance_grid_cell_corner(int cell_corner_id) return (ivec3(cell_corner_id) >> ivec3(0, 1, 2)) & 1; } -float lightprobe_planar_score(PlanarProbeData planar, vec3 P, vec3 V, vec3 L) +float lightprobe_planar_score(ProbePlanarData planar, vec3 P, vec3 V, vec3 L) { vec3 lP = vec4(P, 1.0) * planar.world_to_object_transposed; if (any(greaterThan(abs(lP), vec3(1.0)))) { @@ -68,9 +68,9 @@ int lightprobe_planar_select(vec3 P, vec3 V, vec3 L) float best_score = saturate(dot(L, -V)); int best_index = -1; - for (int index = 0; index < PLANAR_PROBE_MAX; index++) { + for (int index = 0; index < PLANAR_PROBES_MAX; index++) { if (probe_planar_buf[index].layer_id == -1) { - /* PlanarProbeData doesn't contain any gap, exit at first item that is invalid. */ + /* ProbePlanarData doesn't contain any gap, exit at first item that is invalid. */ break; } float score = lightprobe_planar_score(probe_planar_buf[index], P, V, L); diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_lightprobe_volume_eval_lib.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_lightprobe_volume_eval_lib.glsl index 43a9b73d9cc..23dacca97b8 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_lightprobe_volume_eval_lib.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_lightprobe_volume_eval_lib.glsl @@ -30,7 +30,7 @@ ivec3 lightprobe_irradiance_grid_brick_coord(vec3 lP) /** * Return the local coordinated of the shading point inside the brick in unnormalized coordinate. */ -vec3 lightprobe_irradiance_grid_brick_local_coord(VolumeProbeData grid_data, +vec3 lightprobe_irradiance_grid_brick_local_coord(IrradianceGridData grid_data, vec3 lP, ivec3 brick_coord) { @@ -44,7 +44,7 @@ vec3 lightprobe_irradiance_grid_brick_local_coord(VolumeProbeData grid_data, /** * Return the biased local brick local coordinated. */ -vec3 lightprobe_irradiance_grid_bias_sample_coord(VolumeProbeData grid_data, +vec3 lightprobe_irradiance_grid_bias_sample_coord(IrradianceGridData grid_data, uvec2 brick_atlas_coord, vec3 brick_lP, vec3 lNg) @@ -136,13 +136,6 @@ SphericalHarmonicL1 lightprobe_irradiance_sample( #ifdef IRRADIANCE_GRID_SAMPLING float random = interlieved_gradient_noise(UTIL_TEXEL, 0.0, 0.0); random = fract(random + sampling_rng_1D_get(SAMPLING_LIGHTPROBE)); -#endif -#ifdef GPU_METAL -/* NOTE: Performs a chunked unroll to avoid the compiler unrolling the entire loop, avoiding - * very high instruction counts and long compilation time. Full unroll results in 90k + - * instructions. Chunked unroll is 5.1k instructions with reduced register pressure, while - * retaining most of the benefits of unrolling. */ -# pragma clang loop unroll_count(16) #endif for (; i < IRRADIANCE_GRID_MAX; i++) { /* Last grid is tagged as invalid to stop the iteration. */ @@ -157,7 +150,9 @@ SphericalHarmonicL1 lightprobe_irradiance_sample( index = i; #ifdef IRRADIANCE_GRID_SAMPLING float distance_to_border = reduce_min(min(lP, vec3(grids_infos_buf[i].grid_size) - lP)); - if (distance_to_border < random * 0.5 /* Half cell blending. */) { + if (distance_to_border < random) { + /* Remap random to the remaining interval. */ + random = (random - distance_to_border) / (1.0 - distance_to_border); /* Try to sample another grid to get smooth transitions at borders. */ continue; } @@ -166,7 +161,7 @@ SphericalHarmonicL1 lightprobe_irradiance_sample( } } - VolumeProbeData grid_data = grids_infos_buf[index]; + IrradianceGridData grid_data = grids_infos_buf[index]; /* TODO(fclem): Make sure this is working as expected. */ mat3x3 world_to_grid_transposed = mat3x3(grid_data.world_to_grid_transposed); diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_nodetree_lib.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_nodetree_lib.glsl index 87ffbf7e8f5..bef2fe3bfae 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_nodetree_lib.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_nodetree_lib.glsl @@ -8,8 +8,6 @@ #pragma BLENDER_REQUIRE(gpu_shader_codegen_lib.glsl) #pragma BLENDER_REQUIRE(eevee_renderpass_lib.glsl) -#define filmScalingFactor float(uniform_buf.film.scaling_factor) - vec3 g_emission; vec3 g_transmittance; float g_holdout; @@ -22,38 +20,16 @@ vec3 g_volume_absorption; #define Closure float #define CLOSURE_DEFAULT 0.0 -/* Maximum number of picked closure. */ -#ifndef CLOSURE_BIN_COUNT -# define CLOSURE_BIN_COUNT 1 -#endif /* Sampled closure parameters. */ -ClosureUndetermined g_closure_bins[CLOSURE_BIN_COUNT]; +ClosureUndetermined g_diffuse_data; +ClosureUndetermined g_translucent_data; +ClosureUndetermined g_reflection_data; +ClosureUndetermined g_refraction_data; /* Random number per sampled closure type. */ -float g_closure_rand[CLOSURE_BIN_COUNT]; - -ClosureUndetermined g_closure_get(int i) -{ - switch (i) { - default: - case 0: - return g_closure_bins[0]; -#if CLOSURE_BIN_COUNT > 1 - case 1: - return g_closure_bins[1]; -#endif -#if CLOSURE_BIN_COUNT > 2 - case 2: - return g_closure_bins[2]; -#endif - } -} - -ClosureUndetermined g_closure_get_resolved(int i, float weight_fac) -{ - ClosureUndetermined cl = g_closure_get(i); - cl.color *= cl.weight * weight_fac; - return cl; -} +float g_diffuse_rand; +float g_translucent_rand; +float g_reflection_rand; +float g_refraction_rand; ClosureType closure_type_get(ClosureDiffuse cl) { @@ -101,7 +77,7 @@ bool closure_select_check(float weight, inout float total_weight, inout float r) * Assign `candidate` to `destination` based on a random value and the respective weights. */ void closure_select(inout ClosureUndetermined destination, - inout float random, + float random, ClosureUndetermined candidate) { if (closure_select_check(candidate.weight, destination.weight, random)) { @@ -111,23 +87,28 @@ void closure_select(inout ClosureUndetermined destination, } } -void closure_weights_reset(float closure_rand) +float g_closure_rand; + +void closure_weights_reset() { - g_closure_rand[0] = closure_rand; - g_closure_bins[0].weight = 0.0; -#if CLOSURE_BIN_COUNT > 1 - g_closure_rand[1] = closure_rand; - g_closure_bins[1].weight = 0.0; -#endif -#if CLOSURE_BIN_COUNT > 2 - g_closure_rand[2] = closure_rand; - g_closure_bins[2].weight = 0.0; -#endif + g_diffuse_data.weight = 0.0; + g_translucent_data.weight = 0.0; + g_reflection_data.weight = 0.0; + g_refraction_data.weight = 0.0; g_volume_scattering = vec3(0.0); g_volume_anisotropy = 0.0; g_volume_absorption = vec3(0.0); +#if defined(GPU_FRAGMENT_SHADER) + g_diffuse_rand = g_translucent_rand = g_reflection_rand = g_refraction_rand = g_closure_rand; +#else + g_diffuse_rand = 0.0; + g_translucent_rand = 0.0; + g_reflection_rand = 0.0; + g_refraction_rand = 0.0; +#endif + g_emission = vec3(0.0); g_transmittance = vec3(0.0); g_volume_scattering = vec3(0.0); @@ -146,8 +127,7 @@ Closure closure_eval(ClosureDiffuse diffuse) { ClosureUndetermined cl; closure_base_copy(cl, diffuse); - /* Diffuse & SSS always use the first closure. */ - closure_select(g_closure_bins[0], g_closure_rand[0], cl); + closure_select(g_diffuse_data, g_diffuse_rand, cl); return Closure(0); } @@ -156,8 +136,7 @@ Closure closure_eval(ClosureSubsurface diffuse) ClosureUndetermined cl; closure_base_copy(cl, diffuse); cl.data.rgb = diffuse.sss_radius; - /* Diffuse & SSS always use the first closure. */ - closure_select(g_closure_bins[0], g_closure_rand[0], cl); + closure_select(g_diffuse_data, g_diffuse_rand, cl); return Closure(0); } @@ -165,53 +144,16 @@ Closure closure_eval(ClosureTranslucent translucent) { ClosureUndetermined cl; closure_base_copy(cl, translucent); -#if CLOSURE_BIN_COUNT == 1 - /* Only one closure type is present in the whole tree. */ - closure_select(g_closure_bins[0], g_closure_rand[0], cl); -#else - /* Use second slot so we can have diffuse + translucent without noise. */ - closure_select(g_closure_bins[1], g_closure_rand[1], cl); -#endif + closure_select(g_translucent_data, g_translucent_rand, cl); return Closure(0); } -/* Alternate between two bins on a per closure basis. - * Allow clearcoat layer without noise. - * Choosing the bin with the least weight can choose a - * different bin for the same closure and - * produce issue with ray-tracing denoiser. - * Always start with the second bin, this one doesn't - * overlap with other closure. */ -bool g_closure_reflection_bin = true; -#define CHOOSE_MIN_WEIGHT_CLOSURE_BIN(a, b) \ - if (g_closure_reflection_bin) { \ - closure_select(g_closure_bins[b], g_closure_rand[b], cl); \ - } \ - else { \ - closure_select(g_closure_bins[a], g_closure_rand[a], cl); \ - } \ - g_closure_reflection_bin = !g_closure_reflection_bin; - Closure closure_eval(ClosureReflection reflection) { ClosureUndetermined cl; closure_base_copy(cl, reflection); cl.data.r = reflection.roughness; - -#if CLOSURE_BIN_COUNT == 1 - /* Only one reflection closure is present in the whole tree. */ - closure_select(g_closure_bins[0], g_closure_rand[0], cl); -#elif CLOSURE_BIN_COUNT == 2 - /* Case with either only one reflection and one other closure - * or only multiple reflection closures. */ - CHOOSE_MIN_WEIGHT_CLOSURE_BIN(0, 1); -#elif CLOSURE_BIN_COUNT == 3 - /* Case with multiple reflection closures and one other closure. */ - CHOOSE_MIN_WEIGHT_CLOSURE_BIN(1, 2); -#endif - -#undef CHOOSE_MIN_WEIGHT_CLOSURE_BIN - + closure_select(g_reflection_data, g_reflection_rand, cl); return Closure(0); } @@ -221,9 +163,7 @@ Closure closure_eval(ClosureRefraction refraction) closure_base_copy(cl, refraction); cl.data.r = refraction.roughness; cl.data.g = refraction.ior; - /* Use same slot as diffuse as mixed diffuse/refraction are not common. - * Allow glass material with clearcoat without noise. */ - closure_select(g_closure_bins[0], g_closure_rand[0], cl); + closure_select(g_refraction_data, g_refraction_rand, cl); return Closure(0); } @@ -387,7 +327,7 @@ float ambient_occlusion_eval(vec3 normal, #ifndef GPU_METAL void attrib_load(); -Closure nodetree_surface(float closure_rand); +Closure nodetree_surface(); /* Closure nodetree_volume(); */ vec3 nodetree_displacement(); float nodetree_thickness(); @@ -573,7 +513,7 @@ vec2 bsdf_lut(float cos_theta, float roughness, float ior, bool do_multiscatter) #ifdef EEVEE_MATERIAL_STUBS # define attrib_load() # define nodetree_displacement() vec3(0.0) -# define nodetree_surface(closure_rand) Closure(0) +# define nodetree_surface() Closure(0) # define nodetree_volume() Closure(0) # define nodetree_thickness() 0.1 #endif @@ -691,20 +631,6 @@ vec3 coordinate_incoming(vec3 P) /** \} */ -/* -------------------------------------------------------------------- */ -/** \name Mixed render resolution - * - * Callbacks image texture sampling. - * - * \{ */ - -float film_scaling_factor_get() -{ - return float(uniform_buf.film.scaling_factor); -} - -/** \} */ - /* -------------------------------------------------------------------- */ /** \name Volume Attribute post * diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_octahedron_lib.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_octahedron_lib.glsl index e99f8b91511..94d45bea1b9 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_octahedron_lib.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_octahedron_lib.glsl @@ -36,16 +36,3 @@ vec3 octahedral_uv_to_direction(vec2 co) return v; } - -/* Mirror the UV if they are not on the diagonal or unit UV squares. - * Doesn't extend outside of [-1..2] range. But this is fine since we use it only for borders. */ -vec2 octahedral_mirror_repeat_uv(vec2 uv) -{ - vec2 m = abs(uv - 0.5) + 0.5; - vec2 f = floor(m); - float x = f.x - f.y; - if (x != 0.0) { - uv.xy = 1.0 - uv.xy; - } - return fract(uv); -} diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_ray_denoise_bilateral_comp.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_ray_denoise_bilateral_comp.glsl index 5800af70c82..d5b831904cb 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_ray_denoise_bilateral_comp.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_ray_denoise_bilateral_comp.glsl @@ -71,14 +71,17 @@ void main() float center_depth = texelFetch(depth_tx, texel_fullres, 0).r; vec3 center_P = drw_point_screen_to_world(vec3(center_uv, center_depth)); - ClosureUndetermined center_closure = gbuffer_read_bin( - gbuf_header_tx, gbuf_closure_tx, gbuf_normal_tx, texel_fullres, closure_index); + GBufferReader gbuf = gbuffer_read( + gbuf_header_tx, gbuf_closure_tx, gbuf_normal_tx, texel_fullres); - if (center_closure.type == CLOSURE_NONE_ID) { + bool has_valid_closure = closure_index < gbuf.closure_count; + if (!has_valid_closure) { /* Output nothing. This shouldn't even be loaded. */ return; } + ClosureUndetermined center_closure = gbuffer_closure_get(gbuf, closure_index); + float roughness = closure_apparent_roughness_get(center_closure); float variance = imageLoad(in_variance_img, texel_fullres).r; vec3 in_radiance = imageLoad(in_radiance_img, texel_fullres).rgb; @@ -134,13 +137,15 @@ void main() continue; } - ClosureUndetermined sample_closure = gbuffer_read_bin( - gbuf_header_tx, gbuf_closure_tx, gbuf_normal_tx, sample_texel, closure_index); + GBufferReader sample_gbuf = gbuffer_read( + gbuf_header_tx, gbuf_closure_tx, gbuf_normal_tx, sample_texel); - if (sample_closure.type == CLOSURE_NONE_ID) { + if (closure_index >= sample_gbuf.closure_count) { continue; } + ClosureUndetermined sample_closure = gbuffer_closure_get(sample_gbuf, closure_index); + float depth_weight = bilateral_depth_weight(center_closure.N, center_P, sample_P); float spatial_weight = bilateral_spatial_weight(filter_size, vec2(offset)); float normal_weight = bilateral_normal_weight(center_closure.N, sample_closure.N); diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_ray_denoise_spatial_comp.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_ray_denoise_spatial_comp.glsl index 549ac4c8873..35880d2e311 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_ray_denoise_spatial_comp.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_ray_denoise_spatial_comp.glsl @@ -109,10 +109,11 @@ void main() return; } - ClosureUndetermined closure = gbuffer_read_bin( - gbuf_header_tx, gbuf_closure_tx, gbuf_normal_tx, texel_fullres, closure_index); + GBufferReader gbuf = gbuffer_read( + gbuf_header_tx, gbuf_closure_tx, gbuf_normal_tx, texel_fullres); - if (closure.type == CLOSURE_NONE_ID) { + bool has_valid_closure = closure_index < gbuf.closure_count; + if (!has_valid_closure) { invalid_pixel_write(texel_fullres); return; } @@ -121,6 +122,8 @@ void main() vec3 P = drw_point_screen_to_world(vec3(uv, 0.5)); vec3 V = drw_world_incident_vector(P); + ClosureUndetermined closure = gbuffer_closure_get(gbuf, closure_index); + /* Compute filter size and needed sample count */ float apparent_roughness = closure_apparent_roughness_get(closure); float filter_size_factor = saturate(apparent_roughness * 8.0); diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_ray_generate_comp.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_ray_generate_comp.glsl index 83fdc1ac5ef..f7c87236c85 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_ray_generate_comp.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_ray_generate_comp.glsl @@ -21,10 +21,11 @@ void main() ivec2 texel_fullres = texel * uniform_buf.raytrace.resolution_scale + uniform_buf.raytrace.resolution_bias; - ClosureUndetermined closure = gbuffer_read_bin( - gbuf_header_tx, gbuf_closure_tx, gbuf_normal_tx, texel_fullres, closure_index); + GBufferReader gbuf = gbuffer_read( + gbuf_header_tx, gbuf_closure_tx, gbuf_normal_tx, texel_fullres); - if (closure.type == CLOSURE_NONE_ID) { + bool valid_pixel = closure_index < gbuf.closure_count; + if (!valid_pixel) { imageStore(out_ray_data_img, texel, vec4(0.0)); return; } @@ -35,7 +36,7 @@ void main() vec2 noise = utility_tx_fetch(utility_tx, vec2(texel), UTIL_BLUE_NOISE_LAYER).rg; noise = fract(noise + sampling_rng_2D_get(SAMPLING_RAYTRACE_U)); - BsdfSample samp = ray_generate_direction(noise.xy, closure, V); + BsdfSample samp = ray_generate_direction(noise.xy, gbuffer_closure_get(gbuf, closure_index), V); /* Store inverse pdf to speedup denoising. * Limit to the smallest non-0 value that the format can encode. diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_ray_tile_classify_comp.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_ray_tile_classify_comp.glsl index c35b7570dcd..f8a9db7cb23 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_ray_tile_classify_comp.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_ray_tile_classify_comp.glsl @@ -42,9 +42,9 @@ void main() GBufferReader gbuf = gbuffer_read(gbuf_header_tx, gbuf_closure_tx, gbuf_normal_tx, texel); for (int i = 0; i < GBUFFER_LAYER_MAX; i++) { - ClosureUndetermined cl = gbuffer_closure_get_by_bin(gbuf, i); + ClosureUndetermined cl = gbuffer_closure_get(gbuf, i); if (cl.type == CLOSURE_NONE_ID) { - continue; + break; } float roughness = closure_apparent_roughness_get(cl); float ray_roughness_fac = ray_roughness_factor(uniform_buf.raytrace, roughness); diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_ray_trace_planar_comp.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_ray_trace_planar_comp.glsl index 0255af2f70a..617205ec9de 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_ray_trace_planar_comp.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_ray_trace_planar_comp.glsl @@ -37,7 +37,8 @@ void main() uniform_buf.raytrace.resolution_bias; uint gbuf_header = texelFetch(gbuf_header_tx, texel_fullres, 0).r; - ClosureType closure_type = gbuffer_closure_type_get_by_bin(gbuf_header, closure_index); + GBufferReader gbuf = gbuffer_read_header_closure_types(gbuf_header); + ClosureType closure_type = gbuffer_closure_get(gbuf, closure_index).type; if ((closure_type == CLOSURE_BSDF_TRANSLUCENT_ID) || (closure_type == CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID)) @@ -57,7 +58,7 @@ void main() return; } - PlanarProbeData planar = probe_planar_buf[planar_id]; + ProbePlanarData planar = probe_planar_buf[planar_id]; /* Tag the ray data so that screen trace will not try to evaluate it and override the result. */ imageStore(ray_data_img, texel, vec4(ray_data.xyz, -ray_data.w)); diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_ray_trace_screen_comp.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_ray_trace_screen_comp.glsl index c9143d7e3ef..af5a4ece603 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_ray_trace_screen_comp.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_ray_trace_screen_comp.glsl @@ -39,7 +39,8 @@ void main() uniform_buf.raytrace.resolution_bias; uint gbuf_header = texelFetch(gbuf_header_tx, texel_fullres, 0).r; - ClosureType closure_type = gbuffer_closure_type_get_by_bin(gbuf_header, closure_index); + GBufferReader gbuf = gbuffer_read_header_closure_types(gbuf_header); + uint closure_type = gbuffer_closure_get(gbuf, closure_index).type; bool is_reflection = true; if ((closure_type == CLOSURE_BSDF_TRANSLUCENT_ID) || diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_ray_trace_screen_lib.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_ray_trace_screen_lib.glsl index cf84c85d605..c2a230b6d3b 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_ray_trace_screen_lib.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_ray_trace_screen_lib.glsl @@ -164,7 +164,7 @@ METAL_ATTR ScreenTraceHitData raytrace_screen(RayTraceData rt_data, ScreenTraceHitData raytrace_planar(RayTraceData rt_data, depth2DArray planar_depth_tx, - PlanarProbeData planar, + ProbePlanarData planar, float stride_rand, Ray ray) { diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_reflection_probe_convolve_comp.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_reflection_probe_convolve_comp.glsl deleted file mode 100644 index 968f0861cf1..00000000000 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_reflection_probe_convolve_comp.glsl +++ /dev/null @@ -1,147 +0,0 @@ -/* SPDX-FileCopyrightText: 2023 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/* Shader to convert cube-map to octahedral projection. */ - -#pragma BLENDER_REQUIRE(gpu_shader_utildefines_lib.glsl) -#pragma BLENDER_REQUIRE(gpu_shader_math_base_lib.glsl) -#pragma BLENDER_REQUIRE(gpu_shader_math_matrix_lib.glsl) -#pragma BLENDER_REQUIRE(eevee_reflection_probe_mapping_lib.glsl) -#pragma BLENDER_REQUIRE(eevee_sampling_lib.glsl) - -/* Bypass convolution cascade and projection logic. */ -// #define ALWAYS_SAMPLE_CUBEMAP -/* Debugging texel alignment. */ -// #define USE_PIXEL_CHECKERBOARD - -float roughness_from_relative_mip(float prev_mip_roughness, float curr_mip_roughness) -{ -#ifdef ALWAYS_SAMPLE_CUBEMAP - /* For reference and debugging. */ - return curr_mip_roughness; -#else - /* The exponent should be 2 but result is a bit less blurry than expected in practice. */ - const float exponent = 3.0; - /* From linear roughness to GGX roughness input. */ - float m_prev = pow(prev_mip_roughness, exponent); - float m_curr = pow(curr_mip_roughness, exponent); - /* Given that spherical gaussians are very close to regular gaussian in 1D, - * we reuse the same rule for successive convolution (i.e: `G(x,a) X G(x,b) = G(x,a+b)`). - * While this isn't technically correct, this still works quite well in practice. */ - float m_target = m_curr - m_prev; - /* From GGX roughness input to linear roughness. */ - return pow(m_target, 1.0 / exponent); -#endif -} - -float cone_cosine_from_roughness(float linear_roughness) -{ - /* From linear roughness to GGX roughness input. */ - float m = square(linear_roughness); - /* Chosen so that roughness of 1.0 maps to half pi cone aperture. */ - float cutoff_value = mix(0.01, 0.14, m); - /* Inversion of the spherical gaussian. This gives the cutoff for the half angle from N.H. */ - float half_angle_cos = 1.0 + (log(cutoff_value) * square(m)) / 2.0; - float half_angle_sin = safe_sqrt(1.0 - square(half_angle_cos)); - /* Use cosine rule to avoid acos. Return cos(2 * half_angle). */ - return square(half_angle_cos) - square(half_angle_sin); -} - -int sample_count_get() -{ - /* After experimenting this is likely to be the best value if we keep the max resolution to 2048. - * This isn't ideal, but the better solution would be to use multiple steps per mip which would - * reduce the number of sample per step (use sum of gaussian per step). */ - return 196; -} - -float sample_weight(vec3 out_direction, vec3 in_direction, float linear_roughness) -{ - out_direction = normalize(out_direction); - in_direction = normalize(in_direction); - - float cos_theta = saturate(dot(out_direction, in_direction)); - - /* From linear roughness to GGX roughness input. */ - float m = square(linear_roughness); - /* Map GGX roughness to spherical gaussian sharpness. - * From "SG Series Part 4: Specular Lighting From an SG Light Source" by MJP - * https://therealmjp.github.io/posts/sg-series-part-4-specular-lighting-from-an-sg-light-source/ - */ - vec3 N = out_direction; - vec3 H = normalize(out_direction + in_direction); - float NH = saturate(dot(N, H)); - /* GGX. */ - // return exp(-square(acos(NH) / m)); - /* Spherical Gaussian. */ - return exp(2.0 * (NH - 1.0) / square(m)); -} - -mat3x3 tangent_basis(vec3 N) -{ - /* TODO(fclem): This create a discontinuity at Z=0. */ - return from_up_axis(N); -} - -void main() -{ - SphereProbeUvArea sample_coord = reinterpret_as_atlas_coord(probe_coord_packed); - SphereProbePixelArea out_texel_area = reinterpret_as_write_coord(write_coord_packed); - SphereProbePixelArea in_texel_area = reinterpret_as_write_coord(read_coord_packed); - - /* Texel in probe. */ - ivec2 out_local_texel = ivec2(gl_GlobalInvocationID.xy); - - /* Exit when pixel being written doesn't fit in the area reserved for the probe. */ - if (any(greaterThanEqual(out_local_texel, ivec2(out_texel_area.extent)))) { - return; - } - - /* From mip to linear roughness (same as UI). */ - float prev_mip_roughness = sphere_probe_lod_to_roughness(float(read_lod)); - float curr_mip_roughness = sphere_probe_lod_to_roughness(float(read_lod + 1)); - /* In order to reduce the sample count, we sample the content of previous mip level. - * But this one has already been convolved. So we have to derive the equivalent roughness - * that produces the same result. */ - float mip_roughness = roughness_from_relative_mip(prev_mip_roughness, curr_mip_roughness); - /* Clamp to avoid numerical imprecision. */ - float mip_roughness_clamped = max(mip_roughness, BSDF_ROUGHNESS_THRESHOLD); - float cone_cos = cone_cosine_from_roughness(mip_roughness_clamped); - - vec3 out_direction = sphere_probe_texel_to_direction( - out_local_texel, out_texel_area, sample_coord); - out_direction = normalize(out_direction); - - mat3x3 basis = tangent_basis(out_direction); - - ivec2 out_texel = out_texel_area.offset + out_local_texel; - - float weight_accum = 0.0; - vec4 radiance_accum = vec4(0.0); - - int sample_count = sample_count_get(); - for (int i = 0; i < sample_count; i++) { - vec2 rand = hammersley_2d(i, sample_count); - vec3 in_direction = basis * sample_uniform_cone(rand, cone_cos); - -#ifndef ALWAYS_SAMPLE_CUBEMAP - vec2 in_uv = sphere_probe_direction_to_uv(in_direction, float(read_lod), sample_coord); - vec4 radiance = texture(in_atlas_mip_tx, vec3(in_uv, sample_coord.layer)); -#else /* For reference and debugging. */ - vec4 radiance = texture(cubemap_tx, in_direction); -#endif - - float weight = sample_weight(out_direction, in_direction, mip_roughness_clamped); - radiance_accum += radiance * weight; - weight_accum += weight; - } - vec4 out_radiance = radiance_accum * safe_rcp(weight_accum); - -#ifdef USE_PIXEL_CHECKERBOARD - ivec2 a = out_texel % 2; - out_radiance = vec4(a.x == a.y); -#endif - - imageStore(out_atlas_mip_img, ivec3(out_texel, out_texel_area.layer), out_radiance); -} diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_reflection_probe_eval_lib.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_reflection_probe_eval_lib.glsl index e14e73b44e0..91234a1c22b 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_reflection_probe_eval_lib.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_reflection_probe_eval_lib.glsl @@ -8,12 +8,12 @@ #pragma BLENDER_REQUIRE(eevee_bxdf_sampling_lib.glsl) #pragma BLENDER_REQUIRE(eevee_reflection_probe_lib.glsl) -#ifdef SPHERE_PROBE +#ifdef REFLECTION_PROBE int reflection_probes_select(vec3 P, float random_probe) { - for (int index = 0; index < SPHERE_PROBE_MAX; index++) { - SphereProbeData probe_data = reflection_probe_buf[index]; - /* SphereProbeData doesn't contain any gap, exit at first item that is invalid. */ + for (int index = 0; index < REFLECTION_PROBES_MAX; index++) { + ReflectionProbeData probe_data = reflection_probe_buf[index]; + /* ReflectionProbeData doesn't contain any gap, exit at first item that is invalid. */ if (probe_data.atlas_coord.layer == -1) { /* We hit the end of the array. Return last valid index. */ return index - 1; @@ -29,6 +29,6 @@ int reflection_probes_select(vec3 P, float random_probe) } } /* This should never happen (world probe is always last). */ - return SPHERE_PROBE_MAX - 1; + return REFLECTION_PROBES_MAX - 1; } -#endif /* SPHERE_PROBE */ +#endif /* REFLECTION_PROBE */ diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_reflection_probe_lib.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_reflection_probe_lib.glsl index 34469b7cc11..3541b44dd16 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_reflection_probe_lib.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_reflection_probe_lib.glsl @@ -5,21 +5,12 @@ #pragma BLENDER_REQUIRE(gpu_shader_math_vector_lib.glsl) #pragma BLENDER_REQUIRE(eevee_octahedron_lib.glsl) #pragma BLENDER_REQUIRE(eevee_spherical_harmonics_lib.glsl) -#pragma BLENDER_REQUIRE(eevee_reflection_probe_mapping_lib.glsl) -#ifdef SPHERE_PROBE -vec4 reflection_probes_sample(vec3 L, float lod, SphereProbeUvArea uv_area) +#ifdef REFLECTION_PROBE +vec4 reflection_probes_sample(vec3 L, float lod, ReflectionProbeCoordinate atlas_coord) { - float lod_min = floor(lod); - float lod_max = ceil(lod); - float mix_fac = lod - lod_min; - - vec2 altas_uv_min, altas_uv_max; - sphere_probe_direction_to_uv(L, lod_min, lod_max, uv_area, altas_uv_min, altas_uv_max); - - vec4 color_min = textureLod(reflection_probes_tx, vec3(altas_uv_min, uv_area.layer), lod_min); - vec4 color_max = textureLod(reflection_probes_tx, vec3(altas_uv_max, uv_area.layer), lod_max); - return mix(color_min, color_max, mix_fac); + vec2 octahedral_uv = octahedral_uv_from_direction(L) * atlas_coord.scale + atlas_coord.offset; + return textureLod(reflection_probes_tx, vec3(octahedral_uv, atlas_coord.layer), lod); } #endif diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_reflection_probe_mapping_lib.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_reflection_probe_mapping_lib.glsl deleted file mode 100644 index 91362c761b0..00000000000 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_reflection_probe_mapping_lib.glsl +++ /dev/null @@ -1,128 +0,0 @@ -/* SPDX-FileCopyrightText: 2023 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -#pragma BLENDER_REQUIRE(gpu_shader_utildefines_lib.glsl) -#pragma BLENDER_REQUIRE(gpu_shader_math_base_lib.glsl) -#pragma BLENDER_REQUIRE(gpu_shader_math_fast_lib.glsl) -#pragma BLENDER_REQUIRE(eevee_octahedron_lib.glsl) - -SphereProbePixelArea reinterpret_as_write_coord(ivec4 packed_coord) -{ - SphereProbePixelArea unpacked; - unpacked.offset = packed_coord.xy; - unpacked.extent = packed_coord.z; - unpacked.layer = packed_coord.w; - return unpacked; -} - -SphereProbeUvArea reinterpret_as_atlas_coord(ivec4 packed_coord) -{ - SphereProbeUvArea unpacked; - unpacked.offset = intBitsToFloat(packed_coord.xy); - unpacked.scale = intBitsToFloat(packed_coord.z); - unpacked.layer = intBitsToFloat(packed_coord.w); - return unpacked; -} - -/* local_texel is the texel coordinate inside the probe area [0..texel_area.extent) range. - * Returned vector is not normalized. */ -vec3 sphere_probe_texel_to_direction(ivec2 local_texel, - SphereProbePixelArea texel_area, - SphereProbeUvArea uv_area, - out vec2 sampling_uv) -{ - /* Texel in probe atlas. */ - ivec2 texel = local_texel + texel_area.offset; - /* UV in sampling area. No half pixel bias to texel as the octahedral map edges area lined up - * with texel center. Note that we don't use the last row & column of pixel, hence the -2 instead - * of -1. See sphere_probe_miplvl_scale_bias. */ - sampling_uv = vec2(texel) / vec2(texel_area.extent - 2); - /* Direction in world space. */ - return octahedral_uv_to_direction(sampling_uv); -} - -/* local_texel is the texel coordinate inside the probe area [0..texel_area.extent) range. - * Returned vector is not normalized. */ -vec3 sphere_probe_texel_to_direction(ivec2 local_texel, - SphereProbePixelArea texel_area, - SphereProbeUvArea uv_area) -{ - vec2 sampling_uv_unused; - return sphere_probe_texel_to_direction(local_texel, texel_area, uv_area, sampling_uv_unused); -} - -/* Apply correct bias and scale for the given level of detail. */ -vec2 sphere_probe_miplvl_scale_bias(float mip_lvl, SphereProbeUvArea uv_area, vec2 uv) -{ - /* Add 0.5 to avoid rounding error. */ - int mip_0_res = int(float(SPHERE_PROBE_ATLAS_RES) * uv_area.scale + 0.5); - float mip_lvl_res = float(mip_0_res >> int(mip_lvl)); - float mip_lvl_res_inv = 1.0 / mip_lvl_res; - /* We place texel centers at the edges of the octahedron, to avoid artifacts caused by - * interpolating across the edges. - * The first pixel scaling aligns all the border edges (half pixel border). - * The second pixel scaling aligns the center edges (odd number of pixel). */ - float scale = (mip_lvl_res - 2.0) * mip_lvl_res_inv; - float offset = 0.5 * mip_lvl_res_inv; - return uv * scale + offset; -} - -void sphere_probe_direction_to_uv(vec3 L, - float lod_min, - float lod_max, - SphereProbeUvArea uv_area, - out vec2 altas_uv_min, - out vec2 altas_uv_max) -{ - vec2 octahedral_uv = octahedral_uv_from_direction(L); - /* We use a custom per mip level scaling and bias. This avoid some projection artifact and - * padding border waste. But we need to do the mipmap interpolation ourself. */ - vec2 local_uv_min = sphere_probe_miplvl_scale_bias(lod_min, uv_area, octahedral_uv); - vec2 local_uv_max = sphere_probe_miplvl_scale_bias(lod_max, uv_area, octahedral_uv); - /* Remap into atlas location. */ - altas_uv_min = local_uv_min * uv_area.scale + uv_area.offset; - altas_uv_max = local_uv_max * uv_area.scale + uv_area.offset; -} - -/* Single mip variant. */ -vec2 sphere_probe_direction_to_uv(vec3 L, float lod, SphereProbeUvArea uv_area) -{ - vec2 altas_uv_min, altas_uv_max_unused; - sphere_probe_direction_to_uv(L, lod, 0.0, uv_area, altas_uv_min, altas_uv_max_unused); - return altas_uv_min; -} - -float sphere_probe_roughness_to_mix_fac(float roughness) -{ - const float scale = 1.0 / (SPHERE_PROBE_MIX_END_ROUGHNESS - SPHERE_PROBE_MIX_START_ROUGHNESS); - const float bias = scale * SPHERE_PROBE_MIX_START_ROUGHNESS; - return square(saturate(roughness * scale - bias)); -} - -/* Input roughness is linear roughness (UI roughness). */ -float sphere_probe_roughness_to_lod(float roughness) -{ - /* From "Moving Frostbite to Physically Based Rendering 3.0" eq 53. */ - float ratio = saturate(roughness / SPHERE_PROBE_MIP_MAX_ROUGHNESS); - float ratio_sqrt = sqrt_fast(ratio); - /* Mix with linear to avoid mip 1 being too sharp. */ - float mip_ratio = mix(ratio, ratio_sqrt, 0.4); - return mip_ratio * float(SPHERE_PROBE_MIPMAP_LEVELS - 1); -} - -/* Return linear roughness (UI roughness). */ -float sphere_probe_lod_to_roughness(float lod) -{ - /* Inverse of sphere_probe_roughness_to_lod. */ - float mip_ratio = lod / float(SPHERE_PROBE_MIPMAP_LEVELS - 1); - float a = mip_ratio; - const float b = 0.6; /* Factor of ratio. */ - const float c = 0.4; /* Factor of ratio_sqrt. */ - float b2 = square(b); - float c2 = square(c); - float c4 = square(c2); - /* In wolfram alpha we trust. */ - float ratio = (-sqrt(4.0 * a * b * c2 + c4) + 2.0 * a * b + c2) / (2.0 * b2); - return ratio * SPHERE_PROBE_MIP_MAX_ROUGHNESS; -} diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_reflection_probe_remap_comp.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_reflection_probe_remap_comp.glsl index 58d2a7ccab6..1830e07494e 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_reflection_probe_remap_comp.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_reflection_probe_remap_comp.glsl @@ -4,14 +4,45 @@ /* Shader to convert cube-map to octahedral projection. */ -#pragma BLENDER_REQUIRE(eevee_reflection_probe_mapping_lib.glsl) +#pragma BLENDER_REQUIRE(eevee_octahedron_lib.glsl) #pragma BLENDER_REQUIRE(eevee_colorspace_lib.glsl) +ReflectionProbeCoordinate reinterpret_as_atlas_coord(ivec4 packed_coord) +{ + ReflectionProbeCoordinate unpacked; + unpacked.offset = intBitsToFloat(packed_coord.xy); + unpacked.scale = intBitsToFloat(packed_coord.z); + unpacked.layer = intBitsToFloat(packed_coord.w); + return unpacked; +} + +ReflectionProbeWriteCoordinate reinterpret_as_write_coord(ivec4 packed_coord) +{ + ReflectionProbeWriteCoordinate unpacked; + unpacked.offset = packed_coord.xy; + unpacked.extent = packed_coord.z; + unpacked.layer = packed_coord.w; + return unpacked; +} + +/* Mirror the UV if they are not on the diagonal or unit UV squares. + * Doesn't extend outside of [-1..2] range. But this is fine since we use it only for borders. */ +vec2 mirror_repeat_uv(vec2 uv) +{ + vec2 m = abs(uv - 0.5) + 0.5; + vec2 f = floor(m); + float x = f.x - f.y; + if (x != 0.0) { + uv.xy = 1.0 - uv.xy; + } + return fract(uv); +} + void main() { - SphereProbeUvArea world_coord = reinterpret_as_atlas_coord(world_coord_packed); - SphereProbeUvArea sample_coord = reinterpret_as_atlas_coord(probe_coord_packed); - SphereProbePixelArea write_coord = reinterpret_as_write_coord(write_coord_packed); + ReflectionProbeCoordinate world_coord = reinterpret_as_atlas_coord(world_coord_packed); + ReflectionProbeCoordinate sample_coord = reinterpret_as_atlas_coord(probe_coord_packed); + ReflectionProbeWriteCoordinate write_coord = reinterpret_as_write_coord(write_coord_packed); /* Texel in probe. */ ivec2 local_texel = ivec2(gl_GlobalInvocationID.xy); @@ -21,10 +52,16 @@ void main() return; } - vec2 wrapped_uv; - vec3 direction = sphere_probe_texel_to_direction( - local_texel, write_coord, sample_coord, wrapped_uv); - vec4 radiance_and_transmittance = texture(cubemap_tx, direction); + /* Texel in probe atlas. */ + ivec2 texel = local_texel + write_coord.offset; + /* UV in probe atlas. */ + vec2 atlas_uv = (vec2(texel) + 0.5) / vec2(imageSize(atlas_img).xy); + /* UV in sampling area. */ + vec2 sampling_uv = (atlas_uv - sample_coord.offset) / sample_coord.scale; + vec2 wrapped_uv = mirror_repeat_uv(sampling_uv); + /* Direction in world space. */ + vec3 direction = octahedral_uv_to_direction(wrapped_uv); + vec4 radiance_and_transmittance = textureLod(cubemap_tx, direction, float(mip_level)); vec3 radiance = radiance_and_transmittance.xyz; float opacity = 1.0 - radiance_and_transmittance.a; @@ -39,6 +76,5 @@ void main() radiance = colorspace_brightness_clamp_max(radiance, probe_brightness_clamp); - ivec3 texel = ivec3(local_texel + write_coord.offset, write_coord.layer); - imageStore(atlas_img, texel, vec4(radiance, 1.0)); + imageStore(atlas_img, ivec3(texel, write_coord.layer), vec4(radiance, 1.0)); } diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_reflection_probe_select_comp.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_reflection_probe_select_comp.glsl index b70fc8c16e4..8acae79c16b 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_reflection_probe_select_comp.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_reflection_probe_select_comp.glsl @@ -18,7 +18,7 @@ void main() } SphericalHarmonicL1 sh; - if (idx == reflection_probe_count - 1) { + if (idx == 0) { sh = lightprobe_irradiance_world(); } else { diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_reflection_probe_update_irradiance_comp.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_reflection_probe_update_irradiance_comp.glsl index 2d17de12c64..28cb99d3f4a 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_reflection_probe_update_irradiance_comp.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_reflection_probe_update_irradiance_comp.glsl @@ -5,10 +5,19 @@ /* Shader to extract spherical harmonics cooefs from octahedral mapped reflection probe. */ #pragma BLENDER_REQUIRE(eevee_reflection_probe_lib.glsl) -#pragma BLENDER_REQUIRE(eevee_reflection_probe_mapping_lib.glsl) #pragma BLENDER_REQUIRE(eevee_spherical_harmonics_lib.glsl) +#pragma BLENDER_REQUIRE(eevee_octahedron_lib.glsl) #pragma BLENDER_REQUIRE(eevee_sampling_lib.glsl) +ReflectionProbeCoordinate reinterpret_as_atlas_coord(ivec4 packed_coord) +{ + ReflectionProbeCoordinate unpacked; + unpacked.offset = intBitsToFloat(packed_coord.xy); + unpacked.scale = intBitsToFloat(packed_coord.z); + unpacked.layer = intBitsToFloat(packed_coord.w); + return unpacked; +} + void atlas_store(vec4 sh_coefficient, ivec2 atlas_coord, int layer) { for (int x = 0; x < IRRADIANCE_GRID_BRICK_SIZE; x++) { @@ -33,14 +42,15 @@ void main() cooef.L1.M0 = vec4(0.0); cooef.L1.Mp1 = vec4(0.0); - SphereProbeUvArea atlas_coord = reinterpret_as_atlas_coord(world_coord_packed); - float layer_mipmap = 2; + ReflectionProbeCoordinate atlas_coord = reinterpret_as_atlas_coord(world_coord_packed); + float layer_mipmap = 5; /* Perform multiple sample. */ uint store_index = gl_LocalInvocationID.x; - float total_samples = float(gl_WorkGroupSize.x * SPHERE_PROBE_SH_SAMPLES_PER_GROUP); + float total_samples = float(gl_WorkGroupSize.x * REFLECTION_PROBE_SH_SAMPLES_PER_GROUP); float sample_weight = 4.0 * M_PI / total_samples; - float sample_offset = float(gl_LocalInvocationID.x * SPHERE_PROBE_SH_SAMPLES_PER_GROUP); - for (int sample_index = 0; sample_index < SPHERE_PROBE_SH_SAMPLES_PER_GROUP; sample_index++) { + float sample_offset = float(gl_LocalInvocationID.x * REFLECTION_PROBE_SH_SAMPLES_PER_GROUP); + for (int sample_index = 0; sample_index < REFLECTION_PROBE_SH_SAMPLES_PER_GROUP; sample_index++) + { vec2 rand = fract(hammersley_2d(sample_index + sample_offset, total_samples)); vec3 direction = sample_sphere(rand); vec4 light = reflection_probes_sample(direction, layer_mipmap, atlas_coord); diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_sampling_lib.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_sampling_lib.glsl index 11c77e25240..f6c190d3666 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_sampling_lib.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_sampling_lib.glsl @@ -103,13 +103,6 @@ vec2 hammersley_2d(int i, int sample_count) return hammersley_2d(uint(i), uint(sample_count)); } -/* Not random but still useful. sample_count should be an even. */ -vec2 regular_grid_2d(int i, int sample_count) -{ - int sample_per_dim = int(sqrt(float(sample_count))); - return (vec2(i % sample_per_dim, i / sample_per_dim) + 0.5) / float(sample_per_dim); -} - /** \} */ /* -------------------------------------------------------------------- */ @@ -160,17 +153,4 @@ vec3 sample_hemisphere(vec2 rand) return vec3(sin_theta * sample_circle(rand.y), cos_theta); } -/** - * Uniform cone distribution. - * \a rand is 2 random float in the [0..1] range. - * \a cos_angle is the cosine of the half angle. - * Returns point on a Z positive hemisphere of radius 1 and centered on the origin. - */ -vec3 sample_uniform_cone(vec2 rand, float cos_angle) -{ - float cos_theta = mix(cos_angle, 1.0, rand.x); - float sin_theta = safe_sqrt(1.0 - square(cos_theta)); - return vec3(sin_theta * sample_circle(rand.y), cos_theta); -} - /** \} */ diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_shadow_debug_frag.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_shadow_debug_frag.glsl index 515623ff5c4..b54a1f750fc 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_shadow_debug_frag.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_shadow_debug_frag.glsl @@ -63,20 +63,17 @@ vec3 debug_tile_state_color(ShadowTileData tile) return col; } -ShadowSampleParams debug_shadow_sample_get(vec3 P, LightData light) -{ - if (is_sun_light(light.type)) { - return shadow_directional_sample_params_get(shadow_tilemaps_tx, light, P); - } - else { - return shadow_punctual_sample_params_get(light, P); - } -} - -ShadowTileData debug_tile_get(vec3 P, LightData light) -{ - return shadow_tile_data_get(shadow_tilemaps_tx, debug_shadow_sample_get(P, light)); -} +// ShadowSample debug_tile_get(vec3 P, LightData light) +// { +// vec3 lNg = vec3(1.0, 0.0, 0.0); +// if (is_sun_light(light.type)) { +// return shadow_directional_sample_get(shadow_atlas_tx, shadow_tilemaps_tx, light, P, lNg); +// } +// else { +// vec3 lL = light_world_to_local(light, P - light._position); +// return shadow_punctual_sample_get(shadow_atlas_tx, shadow_tilemaps_tx, light, lL, lNg); +// } +// } LightData debug_light_get() { @@ -131,24 +128,23 @@ bool debug_tilemaps(vec3 P, LightData light) void debug_tile_state(vec3 P, LightData light) { - ShadowTileData tile = debug_tile_get(P, light); - out_color_add = vec4(debug_tile_state_color(tile), 0) * 0.5; - out_color_mul = vec4(0.5); + // ShadowSample samp = debug_tile_get(P, light); + // out_color_add = vec4(debug_tile_state_color(samp.tile), 0) * 0.5; + // out_color_mul = vec4(0.5); } void debug_atlas_values(vec3 P, LightData light) { - ShadowSampleParams samp = debug_shadow_sample_get(P, light); - float depth = shadow_read_depth(shadow_atlas_tx, shadow_tilemaps_tx, samp); - out_color_add = vec4(float3(depth), 0.0); - out_color_mul = vec4(0.5); + // ShadowSample samp = debug_tile_get(P, light); + // out_color_add = vec4(vec3(samp.occluder_dist), 0); + // out_color_mul = vec4(0.0); } void debug_random_tile_color(vec3 P, LightData light) { - ShadowTileData tile = debug_tile_get(P, light); - out_color_add = vec4(debug_random_color(ivec2(tile.page.xy)), 0) * 0.5; - out_color_mul = vec4(0.5); + // ShadowSample samp = debug_tile_get(P, light); + // out_color_add = vec4(debug_random_color(ivec2(samp.tile.page.xy)), 0) * 0.5; + // out_color_mul = vec4(0.5); } void debug_random_tilemap_color(vec3 P, LightData light) diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_shadow_lib.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_shadow_lib.glsl index b110abcd71a..36639c3befa 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_shadow_lib.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_shadow_lib.glsl @@ -14,39 +14,20 @@ # define SHADOW_ATLAS_TYPE usampler2DArray #endif -struct ShadowSampleParams { - vec3 lP; - vec3 uv; - int tilemap_index; - float z_range; -}; - -ShadowTileData shadow_tile_data_get(usampler2D tilemaps_tx, ShadowSampleParams params) +float shadow_read_depth_at_tilemap_uv(SHADOW_ATLAS_TYPE atlas_tx, + usampler2D tilemaps_tx, + int tilemap_index, + vec2 tilemap_uv) { /* Prevent out of bound access. Assumes the input is already non negative. */ - vec2 tilemap_uv = min(params.uv.xy, vec2(0.99999)); + tilemap_uv = min(tilemap_uv, vec2(0.99999)); ivec2 texel_coord = ivec2(tilemap_uv * float(SHADOW_MAP_MAX_RES)); /* Using bitwise ops is way faster than integer ops. */ const int page_shift = SHADOW_PAGE_LOD; ivec2 tile_coord = texel_coord >> page_shift; - return shadow_tile_load(tilemaps_tx, tile_coord, params.tilemap_index); -} - -float shadow_read_depth(SHADOW_ATLAS_TYPE atlas_tx, - usampler2D tilemaps_tx, - ShadowSampleParams params) -{ - /* Prevent out of bound access. Assumes the input is already non negative. */ - vec2 tilemap_uv = min(params.uv.xy, vec2(0.99999)); - - ivec2 texel_coord = ivec2(tilemap_uv * float(SHADOW_MAP_MAX_RES)); - /* Using bitwise ops is way faster than integer ops. */ - const int page_shift = SHADOW_PAGE_LOD; - - ivec2 tile_coord = texel_coord >> page_shift; - ShadowTileData tile = shadow_tile_load(tilemaps_tx, tile_coord, params.tilemap_index); + ShadowTileData tile = shadow_tile_load(tilemaps_tx, tile_coord, tilemap_index); if (!tile.is_allocated) { return -1.0; @@ -70,36 +51,25 @@ struct ShadowEvalResult { /** \name Shadow Sampling Functions * \{ */ -mat4x4 shadow_projection_perspective(float side, float near_clip, float far_clip) +/* TODO(fclem): Remove. Only here to avoid include order hell with common_math_lib. */ +mat4x4 shadow_projection_perspective( + float left, float right, float bottom, float top, float near_clip, float far_clip) { + float x_delta = right - left; + float y_delta = top - bottom; float z_delta = far_clip - near_clip; mat4x4 mat = mat4x4(1.0); - mat[0][0] = near_clip / side; - mat[1][1] = near_clip / side; - mat[2][0] = 0.0; - mat[2][1] = 0.0; - mat[2][2] = -(far_clip + near_clip) / z_delta; - mat[2][3] = -1.0; - mat[3][2] = (-2.0 * near_clip * far_clip) / z_delta; - mat[3][3] = 0.0; - return mat; -} - -mat4x4 shadow_projection_perspective_inverse(float side, float near_clip, float far_clip) -{ - float z_delta = far_clip - near_clip; - float d = 2.0 * near_clip * far_clip; - - mat4x4 mat = mat4x4(1.0); - mat[0][0] = side / near_clip; - mat[1][1] = side / near_clip; - mat[2][0] = 0.0; - mat[2][1] = 0.0; - mat[2][2] = 0.0; - mat[2][3] = (near_clip - far_clip) / d; - mat[3][2] = -1.0; - mat[3][3] = (near_clip + far_clip) / d; + if (x_delta != 0.0 && y_delta != 0.0 && z_delta != 0.0) { + mat[0][0] = near_clip * 2.0 / x_delta; + mat[1][1] = near_clip * 2.0 / y_delta; + mat[2][0] = (right + left) / x_delta; /* NOTE: negate Z. */ + mat[2][1] = (top + bottom) / y_delta; + mat[2][2] = -(far_clip + near_clip) / z_delta; + mat[2][3] = -1.0; + mat[3][2] = (-2.0 * near_clip * far_clip) / z_delta; + mat[3][3] = 0.0; + } return mat; } @@ -122,140 +92,33 @@ float shadow_linear_occluder_distance(LightData light, return receiver_z - occluder_z; } -mat4 shadow_punctual_projection_perspective(LightData light) -{ - /* Face Local (View) Space > Clip Space. */ - float clip_far = intBitsToFloat(light.clip_far); - float clip_near = intBitsToFloat(light.clip_near); - float clip_side = light.clip_side; - return shadow_projection_perspective(clip_side, clip_near, clip_far); -} - -mat4 shadow_punctual_projection_perspective_inverse(LightData light) -{ - /* Face Local (View) Space > Clip Space. */ - float clip_far = intBitsToFloat(light.clip_far); - float clip_near = intBitsToFloat(light.clip_near); - float clip_side = light.clip_side; - return shadow_projection_perspective_inverse(clip_side, clip_near, clip_far); -} - -vec3 shadow_punctual_reconstruct_position(ShadowSampleParams params, - mat4 wininv, - LightData light, - vec3 uvw) -{ - vec3 clip_P = uvw * 2.0 - 1.0; - vec3 lP = project_point(wininv, clip_P); - int face_id = params.tilemap_index - light.tilemap_index; - lP = shadow_punctual_face_local_to_local_position(face_id, lP); - return mat3(light.object_mat) * lP + light._position; -} - -ShadowSampleParams shadow_punctual_sample_params_get(LightData light, vec3 P) +ShadowEvalResult shadow_punctual_sample_get(SHADOW_ATLAS_TYPE atlas_tx, + usampler2D tilemaps_tx, + LightData light, + vec3 P) { vec3 lP = (P - light._position) * mat3(light.object_mat); int face_id = shadow_punctual_face_index_get(lP); /* Local Light Space > Face Local (View) Space. */ lP = shadow_punctual_local_position_to_face_local(face_id, lP); - mat4 winmat = shadow_punctual_projection_perspective(light); + /* Face Local (View) Space > Clip Space. */ + float clip_far = intBitsToFloat(light.clip_far); + float clip_near = intBitsToFloat(light.clip_near); + float clip_side = light.clip_side; + /* TODO: Could be simplified since frustum is completely symmetrical. */ + mat4 winmat = shadow_projection_perspective( + -clip_side, clip_side, -clip_side, clip_side, clip_near, clip_far); vec3 clip_P = project_point(winmat, lP); /* Clip Space > UV Space. */ vec3 uv_P = saturate(clip_P * 0.5 + 0.5); - ShadowSampleParams result; - result.lP = lP; - result.uv = uv_P; - result.tilemap_index = light.tilemap_index + face_id; - result.z_range = 1.0; - return result; -} - -ShadowEvalResult shadow_punctual_sample_get(SHADOW_ATLAS_TYPE atlas_tx, - usampler2D tilemaps_tx, - LightData light, - vec3 P) -{ - ShadowSampleParams params = shadow_punctual_sample_params_get(light, P); - - float depth = shadow_read_depth(atlas_tx, tilemaps_tx, params); + float depth = shadow_read_depth_at_tilemap_uv( + atlas_tx, tilemaps_tx, light.tilemap_index + face_id, uv_P.xy); ShadowEvalResult result; - result.light_visibilty = float(params.uv.z < depth); - result.occluder_distance = shadow_linear_occluder_distance(light, false, params.lP, depth); - return result; -} - -struct ShadowDirectionalSampleInfo { - float clip_near; - float clip_far; - int level_relative; - int lod_relative; - ivec2 clipmap_offset; - vec2 clipmap_origin; -}; - -ShadowDirectionalSampleInfo shadow_directional_sample_info_get(LightData light, vec3 lP) -{ - ShadowDirectionalSampleInfo info; - info.clip_near = orderedIntBitsToFloat(light.clip_near); - info.clip_far = orderedIntBitsToFloat(light.clip_far); - - int level = shadow_directional_level(light, lP - light._position); - /* This difference needs to be less than 32 for the later shift to be valid. - * This is ensured by ShadowDirectional::clipmap_level_range(). */ - info.level_relative = level - light.clipmap_lod_min; - info.lod_relative = (light.type == LIGHT_SUN_ORTHO) ? light.clipmap_lod_min : level; - - info.clipmap_offset = shadow_decompress_grid_offset( - light.type, light.clipmap_base_offset, info.level_relative); - info.clipmap_origin = vec2(light._clipmap_origin_x, light._clipmap_origin_y); - - return info; -} - -vec3 shadow_directional_reconstruct_position(ShadowSampleParams params, LightData light, vec3 uvw) -{ - ShadowDirectionalSampleInfo info = shadow_directional_sample_info_get(light, params.lP); - - vec2 tilemap_uv = uvw.xy; - tilemap_uv += vec2(info.clipmap_offset) / float(SHADOW_TILEMAP_RES); - vec2 clipmap_pos = (tilemap_uv - 0.5) / exp2(-float(info.lod_relative)); - - vec3 lP; - lP.xy = clipmap_pos + info.clipmap_origin; - lP.z = (params.uv.z + info.clip_near) * -1.0; - - return mat3(light.object_mat) * lP; -} - -ShadowSampleParams shadow_directional_sample_params_get(usampler2D tilemaps_tx, - LightData light, - vec3 P) -{ - vec3 lP = P * mat3(light.object_mat); - ShadowDirectionalSampleInfo info = shadow_directional_sample_info_get(light, lP); - - ShadowCoordinates coord = shadow_directional_coordinates(light, lP); - - /* Assumed to be non-null. */ - float z_range = info.clip_far - info.clip_near; - float dist_to_near_plane = -lP.z - info.clip_near; - - vec2 clipmap_pos = lP.xy - info.clipmap_origin; - vec2 tilemap_uv = clipmap_pos * exp2(-float(info.lod_relative)) + 0.5; - - /* Translate tilemap UVs to its origin. */ - tilemap_uv -= vec2(info.clipmap_offset) / float(SHADOW_TILEMAP_RES); - /* Clamp to avoid out of tilemap access. */ - tilemap_uv = saturate(tilemap_uv); - - ShadowSampleParams result; - result.lP = lP; - result.uv = vec3(tilemap_uv, dist_to_near_plane); - result.tilemap_index = light.tilemap_index + info.level_relative; - result.z_range = z_range; + result.light_visibilty = float(uv_P.z < depth); + result.occluder_distance = shadow_linear_occluder_distance(light, false, lP, depth); return result; } @@ -264,13 +127,40 @@ ShadowEvalResult shadow_directional_sample_get(SHADOW_ATLAS_TYPE atlas_tx, LightData light, vec3 P) { - ShadowSampleParams params = shadow_directional_sample_params_get(tilemaps_tx, light, P); + vec3 lP = P * mat3(light.object_mat); + ShadowCoordinates coord = shadow_directional_coordinates(light, lP); - float depth = shadow_read_depth(atlas_tx, tilemaps_tx, params); + float clip_near = orderedIntBitsToFloat(light.clip_near); + float clip_far = orderedIntBitsToFloat(light.clip_far); + /* Assumed to be non-null. */ + float z_range = clip_far - clip_near; + float dist_to_near_plane = -lP.z - clip_near; + + int level = shadow_directional_level(light, lP - light._position); + /* This difference needs to be less than 32 for the later shift to be valid. + * This is ensured by ShadowDirectional::clipmap_level_range(). */ + int level_relative = level - light.clipmap_lod_min; + + int lod_relative = (light.type == LIGHT_SUN_ORTHO) ? light.clipmap_lod_min : level; + + vec2 clipmap_origin = vec2(light._clipmap_origin_x, light._clipmap_origin_y); + vec2 clipmap_pos = lP.xy - clipmap_origin; + vec2 tilemap_uv = clipmap_pos * exp2(-float(lod_relative)) + 0.5; + + /* Compute offset in tile. */ + ivec2 clipmap_offset = shadow_decompress_grid_offset( + light.type, light.clipmap_base_offset, level_relative); + /* Translate tilemap UVs to its origin. */ + tilemap_uv -= vec2(clipmap_offset) / float(SHADOW_TILEMAP_RES); + /* Clamp to avoid out of tilemap access. */ + tilemap_uv = saturate(tilemap_uv); + + float depth = shadow_read_depth_at_tilemap_uv( + atlas_tx, tilemaps_tx, light.tilemap_index + level_relative, tilemap_uv); ShadowEvalResult result; - result.light_visibilty = float(params.uv.z < depth * params.z_range); - result.occluder_distance = shadow_linear_occluder_distance(light, true, params.lP, depth); + result.light_visibilty = float(dist_to_near_plane < depth * z_range); + result.occluder_distance = shadow_linear_occluder_distance(light, true, lP, depth); return result; } diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_shadow_tag_usage_lib.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_shadow_tag_usage_lib.glsl index dc2680c15f4..8e4116877f9 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_shadow_tag_usage_lib.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_shadow_tag_usage_lib.glsl @@ -89,7 +89,7 @@ void shadow_tag_usage_tilemap_punctual( } vec3 lP = light_world_to_local(light, P - light._position); - float dist_to_light = max(length(lP) - radius, 1e-5); + float dist_to_light = length(lP) - radius; if (dist_to_light > light.influence_radius_max) { return; } @@ -132,7 +132,7 @@ void shadow_tag_usage_tilemap_punctual( lP = shadow_punctual_local_position_to_face_local(face_id, lP); ShadowCoordinates coord = shadow_punctual_coordinates(light, lP, face_id); - int lod = int(floor(-log2(footprint_ratio) + tilemaps_buf[coord.tilemap_index].lod_bias)); + int lod = int(ceil(-log2(footprint_ratio) + tilemaps_buf[coord.tilemap_index].lod_bias)); lod += lod_bias; lod = clamp(lod, 0, SHADOW_TILEMAP_LOD); diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_shadow_tilemap_lib.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_shadow_tilemap_lib.glsl index 6d6e113795f..0c8febfda06 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_shadow_tilemap_lib.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_shadow_tilemap_lib.glsl @@ -205,24 +205,6 @@ vec3 shadow_punctual_local_position_to_face_local(int face_id, vec3 lL) } } -vec3 shadow_punctual_face_local_to_local_position(int face_id, vec3 fL) -{ - switch (face_id) { - case 1: - return vec3(-fL.z, -fL.x, fL.y); - case 2: - return vec3(fL.z, fL.x, fL.y); - case 3: - return vec3(fL.x, -fL.z, fL.y); - case 4: - return vec3(-fL.x, fL.z, fL.y); - case 5: - return vec3(fL.x, -fL.y, -fL.z); - default: - return fL; - } -} - /* Turns local light coordinate into shadow region index. Matches eCubeFace order. * \note lL does not need to be normalized. */ int shadow_punctual_face_index_get(vec3 lL) diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_shadow_tracing_lib.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_shadow_tracing_lib.glsl index b13ef58182e..2b08ebd5f00 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_shadow_tracing_lib.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_shadow_tracing_lib.glsl @@ -12,8 +12,6 @@ #pragma BLENDER_REQUIRE(eevee_shadow_lib.glsl) #pragma BLENDER_REQUIRE(eevee_sampling_lib.glsl) #pragma BLENDER_REQUIRE(eevee_bxdf_sampling_lib.glsl) -#pragma BLENDER_REQUIRE(draw_view_lib.glsl) -#pragma BLENDER_REQUIRE(draw_math_geom_lib.glsl) float shadow_read_depth_at_tilemap_uv(int tilemap_index, vec2 tilemap_uv) { @@ -365,9 +363,7 @@ ShadowRayPunctual shadow_ray_generate_punctual(LightData light, vec3 local_ray_start = lP + projection_origin; vec3 local_ray_end = local_ray_start + direction; - /* Use an offset in the ray direction to jitter which face is traced. - * This helps hiding some harsh discontinuity. */ - int face_id = shadow_punctual_face_index_get(local_ray_start + direction * 0.5); + int face_id = shadow_punctual_face_index_get(local_ray_start); /* Local Light Space > Face Local (View) Space. */ vec3 view_ray_start = shadow_punctual_local_position_to_face_local(face_id, local_ray_start); vec3 view_ray_end = shadow_punctual_local_position_to_face_local(face_id, local_ray_end); @@ -410,94 +406,6 @@ SHADOW_MAP_TRACE_FN(ShadowRayPunctual) /** \name Shadow Evaluation * \{ */ -/* Compute the world space offset of the shading position required for - * stochastic percentage closer filtering of shadow-maps. */ -vec3 shadow_pcf_offset(LightData light, const bool is_directional, vec3 P, vec3 Ng) -{ - if (light.pcf_radius <= 0.001) { - /* Early return. */ - return vec3(0.0); - } - - vec3 L = light_vector_get(light, is_directional, P).L; - if (dot(L, Ng) < 0.001) { - /* Don't apply PCF to almost perpendicular, - * since we can't project the offset to the surface. */ - return vec3(0.0); - } - - ShadowSampleParams params; - if (is_directional) { - params = shadow_directional_sample_params_get(shadow_tilemaps_tx, light, P); - } - else { - params = shadow_punctual_sample_params_get(light, P); - } - ShadowTileData tile = shadow_tile_data_get(shadow_tilemaps_tx, params); - if (!tile.is_allocated) { - return vec3(0.0); - } - - /* Compute the shadow-map tangent-bitangent matrix. */ - - float uv_offset = 1.0 / float(SHADOW_MAP_MAX_RES); - vec3 TP, BP; - if (is_directional) { - TP = shadow_directional_reconstruct_position( - params, light, params.uv + vec3(uv_offset, 0.0, 0.0)); - BP = shadow_directional_reconstruct_position( - params, light, params.uv + vec3(0.0, uv_offset, 0.0)); - } - else { - mat4 wininv = shadow_punctual_projection_perspective_inverse(light); - TP = shadow_punctual_reconstruct_position( - params, wininv, light, params.uv + vec3(uv_offset, 0.0, 0.0)); - BP = shadow_punctual_reconstruct_position( - params, wininv, light, params.uv + vec3(0.0, uv_offset, 0.0)); - } - - /* TODO: Use a mat2x3 (Currently not supported by the Metal backend). */ - mat3 TBN = mat3(TP - P, BP - P, Ng); - - /* Compute the actual offset. */ - - vec2 rand = vec2(0.0); -#ifdef EEVEE_SAMPLING_DATA - rand = sampling_rng_2D_get(SAMPLING_SHADOW_V); -#endif - vec2 pcf_offset = interlieved_gradient_noise(UTIL_TEXEL, vec2(0.0), rand); - pcf_offset = pcf_offset * 2.0 - 1.0; - pcf_offset *= light.pcf_radius; - - vec3 ws_offset = TBN * vec3(pcf_offset, 0.0); - vec3 offset_P = P + ws_offset; - - /* Project the offset position into the surface */ - -#ifdef GPU_NVIDIA - /* Workaround for a bug in the Nvidia shader compiler. - * If we don't compute L here again, it breaks shadows on reflection probes. */ - L = light_vector_get(light, is_directional, P).L; -#endif - - if (abs(dot(Ng, L)) > 0.999) { - return ws_offset; - } - - offset_P = line_plane_intersect(offset_P, L, P, Ng); - ws_offset = offset_P - P; - - if (dot(ws_offset, L) < 0.0) { - /* Project the offset position into the perpendicular plane, since it's closer to the light - * (avoids overshadowing at geometry angles). */ - vec3 perpendicular_plane_normal = cross(Ng, normalize(cross(Ng, L))); - offset_P = line_plane_intersect(offset_P, L, P, perpendicular_plane_normal); - ws_offset = offset_P - P; - } - - return ws_offset; -} - /** * Evaluate shadowing by casting rays toward the light direction. */ @@ -525,8 +433,6 @@ ShadowEvalResult shadow_eval(LightData light, float normal_offset = 0.02; #endif - P += shadow_pcf_offset(light, is_directional, P, Ng); - /* Avoid self intersection. */ P = offset_ray(P, Ng); /* The above offset isn't enough in most situation. Still add a bigger bias. */ diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_spherical_harmonics_lib.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_spherical_harmonics_lib.glsl index fc237387b7a..682c84c91e6 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_spherical_harmonics_lib.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_spherical_harmonics_lib.glsl @@ -368,17 +368,20 @@ SphericalHarmonicL1 spherical_harmonics_triple_product(SphericalHarmonicL1 a, /* Adapted from: * "Code Generation and Factoring for Fast Evaluation of Low-order Spherical Harmonic Products * and Squares" Function "SH_product_3". */ - const float L0_M0_coef = 0.282094792; SphericalHarmonicL1 sh; - sh.L0.M0 = a.L0.M0 * b.L0.M0; - sh.L0.M0 += a.L1.Mn1 * b.L1.Mn1; - sh.L0.M0 += a.L1.M0 * b.L1.M0; - sh.L0.M0 += a.L1.Mp1 * b.L1.Mp1; - sh.L0.M0 *= L0_M0_coef; + sh.L0.M0 = 0.282094792 * a.L0.M0 * b.L0.M0; - sh.L1.Mn1 = L0_M0_coef * (a.L0.M0 * b.L1.Mn1 + b.L0.M0 * a.L1.Mn1); - sh.L1.M0 = L0_M0_coef * (a.L0.M0 * b.L1.M0 + b.L0.M0 * a.L1.M0); - sh.L1.Mp1 = L0_M0_coef * (a.L0.M0 * b.L1.Mp1 + b.L0.M0 * a.L1.Mp1); + vec4 ta = 0.282094791 * a.L0.M0; + vec4 tb = 0.282094791 * b.L0.M0; + + sh.L1.Mn1 = ta * b.L1.Mn1 + tb * a.L1.Mn1; + sh.L0.M0 += 0.282094791 * (a.L1.Mn1 * b.L1.Mn1); + + sh.L1.M0 += ta * b.L1.M0 + tb * a.L1.M0; + sh.L0.M0 += 0.282094795 * (a.L1.M0 * b.L1.M0); + + sh.L1.Mp1 += ta * b.L1.Mp1 + tb * a.L1.Mp1; + sh.L0.M0 += 0.282094791 * (a.L1.Mp1 * b.L1.Mp1); return sh; } diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_surf_capture_frag.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_surf_capture_frag.glsl index 897d7c5bc25..dc5713bf578 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_surf_capture_frag.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_surf_capture_frag.glsl @@ -27,23 +27,15 @@ void main() init_globals(); /* TODO(fclem): Remove random sampling for capture and accumulate color. */ - float closure_rand = 0.5; + g_closure_rand = 0.5; - nodetree_surface(closure_rand); + nodetree_surface(); - vec3 albedo = vec3(0.0); + g_diffuse_data.color *= g_diffuse_data.weight; + g_reflection_data.color *= g_reflection_data.weight; + g_refraction_data.color *= g_refraction_data.weight; - for (int i = 0; i < CLOSURE_BIN_COUNT; i++) { - ClosureUndetermined cl = g_closure_get_resolved(i, 1.0); - if (cl.weight <= 1e-5) { - continue; - } - if (cl.type != CLOSURE_BSDF_TRANSLUCENT_ID && - cl.type != CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID) - { - albedo += cl.color; - } - } + vec3 albedo = g_diffuse_data.color + g_reflection_data.color; /* ----- Surfel output ----- */ diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_surf_deferred_frag.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_surf_deferred_frag.glsl index 88ba50d9a29..4c21d0b398a 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_surf_deferred_frag.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_surf_deferred_frag.glsl @@ -24,9 +24,7 @@ vec4 closure_to_rgba(Closure cl) out_color.a = saturate(1.0 - average(g_transmittance)); /* Reset for the next closure tree. */ - float noise = utility_tx_fetch(utility_tx, gl_FragCoord.xy, UTIL_BLUE_NOISE_LAYER).r; - float closure_rand = fract(noise + sampling_rng_1D_get(SAMPLING_CLOSURE)); - closure_weights_reset(closure_rand); + closure_weights_reset(); return out_color; } @@ -39,11 +37,11 @@ void main() init_globals(); float noise = utility_tx_fetch(utility_tx, gl_FragCoord.xy, UTIL_BLUE_NOISE_LAYER).r; - float closure_rand = fract(noise + sampling_rng_1D_get(SAMPLING_CLOSURE)); + g_closure_rand = fract(noise + sampling_rng_1D_get(SAMPLING_CLOSURE)); fragment_displacement(); - nodetree_surface(closure_rand); + nodetree_surface(); g_holdout = saturate(g_holdout); @@ -53,6 +51,15 @@ void main() float transparency = 1.0 - average(g_transmittance); float transparency_rcp = safe_rcp(transparency); g_emission *= transparency_rcp; + g_diffuse_data.weight *= transparency_rcp; + g_translucent_data.weight *= transparency_rcp; + g_reflection_data.weight *= transparency_rcp; + g_refraction_data.weight *= transparency_rcp; + + g_diffuse_data.color *= g_diffuse_data.weight; + g_translucent_data.color *= g_translucent_data.weight; + g_reflection_data.color *= g_reflection_data.weight; + g_refraction_data.color *= g_refraction_data.weight; ivec2 out_texel = ivec2(gl_FragCoord.xy); @@ -72,13 +79,10 @@ void main() /* ----- GBuffer output ----- */ GBufferData gbuf_data; - gbuf_data.closure[0] = g_closure_get_resolved(0, transparency_rcp); -#if CLOSURE_BIN_COUNT > 1 - gbuf_data.closure[1] = g_closure_get_resolved(1, transparency_rcp); -#endif -#if CLOSURE_BIN_COUNT > 2 - gbuf_data.closure[2] = g_closure_get_resolved(2, transparency_rcp); -#endif + gbuf_data.diffuse = g_diffuse_data; + gbuf_data.translucent = g_translucent_data; + gbuf_data.reflection = g_reflection_data; + gbuf_data.refraction = g_refraction_data; gbuf_data.surface_N = g_data.N; gbuf_data.thickness = thickness; gbuf_data.object_id = resource_id; @@ -93,11 +97,11 @@ void main() /* Output remaining closures using image store. */ /* NOTE: The image view start at layer 2 so all destination layer is `layer - 2`. */ - for (int layer = 2; layer < GBUFFER_DATA_MAX && layer < gbuf.data_len; layer++) { + for (int layer = 2; layer < GBUFFER_DATA_MAX && layer < gbuf.layer_data; layer++) { imageStore(out_gbuf_closure_img, ivec3(out_texel, layer - 2), gbuf.data[layer]); } /* NOTE: The image view start at layer 1 so all destination layer is `layer - 1`. */ - for (int layer = 1; layer < GBUFFER_NORMAL_MAX && layer < gbuf.normal_len; layer++) { + for (int layer = 1; layer < GBUFFER_NORMAL_MAX && layer < gbuf.layer_normal; layer++) { imageStore(out_gbuf_normal_img, ivec3(out_texel, layer - 1), gbuf.N[layer].xyyy); } diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_surf_depth_frag.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_surf_depth_frag.glsl index f62ffe16fb2..b5d55177d45 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_surf_depth_frag.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_surf_depth_frag.glsl @@ -21,7 +21,7 @@ vec4 closure_to_rgba(Closure cl) out_color.a = saturate(1.0 - average(g_transmittance)); /* Reset for the next closure tree. */ - closure_weights_reset(0.0); + closure_weights_reset(); return out_color; } @@ -31,7 +31,7 @@ void main() #ifdef MAT_TRANSPARENT init_globals(); - nodetree_surface(0.0); + nodetree_surface(); # ifdef MAT_FORWARD /* Pre-pass only allows fully opaque areas to cut through all transparent layers. */ diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_surf_forward_frag.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_surf_forward_frag.glsl index cb5477724fd..c200d780c4f 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_surf_forward_frag.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_surf_forward_frag.glsl @@ -26,9 +26,7 @@ vec4 closure_to_rgba(Closure cl_unused) forward_lighting_eval(g_thickness, radiance, transmittance); /* Reset for the next closure tree. */ - float noise = utility_tx_fetch(utility_tx, gl_FragCoord.xy, UTIL_BLUE_NOISE_LAYER).r; - float closure_rand = fract(noise + sampling_rng_1D_get(SAMPLING_CLOSURE)); - closure_weights_reset(closure_rand); + closure_weights_reset(); return vec4(radiance, saturate(1.0 - average(transmittance))); } @@ -41,13 +39,13 @@ void main() init_globals(); float noise = utility_tx_fetch(utility_tx, gl_FragCoord.xy, UTIL_BLUE_NOISE_LAYER).r; - float closure_rand = fract(noise + sampling_rng_1D_get(SAMPLING_CLOSURE)); + g_closure_rand = fract(noise + sampling_rng_1D_get(SAMPLING_CLOSURE)); fragment_displacement(); g_thickness = max(0.0, nodetree_thickness()); - nodetree_surface(closure_rand); + nodetree_surface(); vec3 radiance, transmittance; forward_lighting_eval(g_thickness, radiance, transmittance); diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_surf_hybrid_frag.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_surf_hybrid_frag.glsl index 91796d721e8..fa0a76307a6 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_surf_hybrid_frag.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_surf_hybrid_frag.glsl @@ -27,9 +27,7 @@ vec4 closure_to_rgba(Closure cl_unused) forward_lighting_eval(g_thickness, radiance, transmittance); /* Reset for the next closure tree. */ - float noise = utility_tx_fetch(utility_tx, gl_FragCoord.xy, UTIL_BLUE_NOISE_LAYER).r; - float closure_rand = fract(noise + sampling_rng_1D_get(SAMPLING_CLOSURE)); - closure_weights_reset(closure_rand); + closure_weights_reset(); return vec4(radiance, saturate(1.0 - average(transmittance))); } @@ -42,11 +40,11 @@ void main() init_globals(); float noise = utility_tx_fetch(utility_tx, gl_FragCoord.xy, UTIL_BLUE_NOISE_LAYER).r; - float closure_rand = fract(noise + sampling_rng_1D_get(SAMPLING_CLOSURE)); + g_closure_rand = fract(noise + sampling_rng_1D_get(SAMPLING_CLOSURE)); fragment_displacement(); - nodetree_surface(closure_rand); + nodetree_surface(); g_holdout = saturate(g_holdout); @@ -56,6 +54,15 @@ void main() float transparency = 1.0 - average(g_transmittance); float transparency_rcp = safe_rcp(transparency); g_emission *= transparency_rcp; + g_diffuse_data.weight *= transparency_rcp; + g_translucent_data.weight *= transparency_rcp; + g_reflection_data.weight *= transparency_rcp; + g_refraction_data.weight *= transparency_rcp; + + g_diffuse_data.color *= g_diffuse_data.weight; + g_translucent_data.color *= g_translucent_data.weight; + g_reflection_data.color *= g_reflection_data.weight; + g_refraction_data.color *= g_refraction_data.weight; ivec2 out_texel = ivec2(gl_FragCoord.xy); @@ -75,13 +82,10 @@ void main() /* ----- GBuffer output ----- */ GBufferData gbuf_data; - gbuf_data.closure[0] = g_closure_get_resolved(0, transparency_rcp); -#if CLOSURE_BIN_COUNT > 1 - gbuf_data.closure[1] = g_closure_get_resolved(1, transparency_rcp); -#endif -#if CLOSURE_BIN_COUNT > 2 - gbuf_data.closure[2] = g_closure_get_resolved(2, transparency_rcp); -#endif + gbuf_data.diffuse = g_diffuse_data; + gbuf_data.translucent = g_translucent_data; + gbuf_data.reflection = g_reflection_data; + gbuf_data.refraction = g_refraction_data; gbuf_data.surface_N = g_data.N; gbuf_data.thickness = g_thickness; gbuf_data.object_id = resource_id; @@ -96,11 +100,11 @@ void main() /* Output remaining closures using image store. */ /* NOTE: The image view start at layer 2 so all destination layer is `layer - 2`. */ - for (int layer = 2; layer < GBUFFER_DATA_MAX && layer < gbuf.data_len; layer++) { + for (int layer = 2; layer < GBUFFER_DATA_MAX && layer < gbuf.layer_data; layer++) { imageStore(out_gbuf_closure_img, ivec3(out_texel, layer - 2), gbuf.data[layer]); } /* NOTE: The image view start at layer 1 so all destination layer is `layer - 1`. */ - for (int layer = 1; layer < GBUFFER_NORMAL_MAX && layer < gbuf.normal_len; layer++) { + for (int layer = 1; layer < GBUFFER_NORMAL_MAX && layer < gbuf.layer_normal; layer++) { imageStore(out_gbuf_normal_img, ivec3(out_texel, layer - 1), gbuf.N[layer].xyyy); } diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_surf_shadow_frag.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_surf_shadow_frag.glsl index 99b391f5174..4bf88f64e14 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_surf_shadow_frag.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_surf_shadow_frag.glsl @@ -28,7 +28,7 @@ void main() #ifdef MAT_TRANSPARENT init_globals(); - nodetree_surface(0.0); + nodetree_surface(); float noise_offset = sampling_rng_1D_get(SAMPLING_TRANSPARENCY); float random_threshold = transparency_hashed_alpha_threshold(1.0, noise_offset, g_data.P); @@ -58,12 +58,6 @@ void main() uint page_packed = render_map_buf[render_page_index]; ivec3 page = ivec3(shadow_page_unpack(page_packed)); - /* If the page index is invalid this page shouldn't be rendered, - * however shadow_page_unpack clamps the result to a valid page. - * Instead of doing an early return (and introducing branching), - * we simply ensure the page layer is out-of-bounds. */ - page.z = page_packed < SHADOW_MAX_PAGE ? page.z : -1; - ivec3 out_texel = ivec3((page.xy << page_shift) | texel_page, page.z); uint u_depth = floatBitsToUint(f_depth); diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_surf_world_frag.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_surf_world_frag.glsl index f63504fde6b..f8b5e7cd9bf 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_surf_world_frag.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_surf_world_frag.glsl @@ -31,7 +31,7 @@ void main() g_data.P = -g_data.N; attrib_load(); - nodetree_surface(0.0); + nodetree_surface(); g_holdout = saturate(g_holdout); diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_surfel_light_comp.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_surfel_light_comp.glsl index c2adf0529cf..1febad8adb5 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_surfel_light_comp.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_surfel_light_comp.glsl @@ -33,8 +33,6 @@ void main() surfel.albedo_front; } - V = -surfel.normal; - Ng = -surfel.normal; stack.cl[0].N = -surfel.normal; light_eval(stack, P, Ng, V); diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_surfel_ray_comp.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_surfel_ray_comp.glsl index 71175ce37c5..815171aadf2 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_surfel_ray_comp.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_surfel_ray_comp.glsl @@ -88,7 +88,7 @@ void radiance_transfer_world(inout Surfel receiver, vec3 L) float visibility = 0.0; if (capture_info_buf.capture_world_indirect) { - SphereProbeUvArea atlas_coord = capture_info_buf.world_atlas_coord; + ReflectionProbeCoordinate atlas_coord = capture_info_buf.world_atlas_coord; radiance = reflection_probes_sample(L, 0.0, atlas_coord).rgb; } diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_thickness_lib.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_thickness_lib.glsl index fc6811c5db1..838cc8bdbaf 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_thickness_lib.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_thickness_lib.glsl @@ -23,7 +23,7 @@ void thickness_from_shadow_single( LightVector lv = light_vector_get(light, is_directional, P); /* Note that we reverse the surface normal to reject surfaces facing the light. */ - float attenuation = light_attenuation_surface(light, is_directional, Ng, lv).y; + float attenuation = light_attenuation_surface(light, is_directional, Ng, true, lv); if ((attenuation < LIGHT_ATTENUATION_THRESHOLD)) { return; } diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_vertex_copy_comp.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_vertex_copy_comp.glsl index 4135716455a..61841343c55 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_vertex_copy_comp.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_vertex_copy_comp.glsl @@ -5,7 +5,7 @@ void main() { uint vertex_id = gl_GlobalInvocationID.x; - if (vertex_id >= uint(vertex_count)) { + if (vertex_id >= vertex_count) { return; } out_buf[start_offset + vertex_id] = vec4(in_buf[vertex_id * vertex_stride + 0], diff --git a/source/blender/draw/engines/eevee_next/shaders/infos/eevee_deferred_info.hh b/source/blender/draw/engines/eevee_next/shaders/infos/eevee_deferred_info.hh index 3de0d44b6bf..c86e2f4c619 100644 --- a/source/blender/draw/engines/eevee_next/shaders/infos/eevee_deferred_info.hh +++ b/source/blender/draw/engines/eevee_next/shaders/infos/eevee_deferred_info.hh @@ -144,7 +144,7 @@ GPU_SHADER_CREATE_INFO(eevee_deferred_planar_eval) .early_fragment_test(true) /* Inputs. */ .fragment_out(0, Type::VEC4, "out_radiance") - .define("SPHERE_PROBE") + .define("REFLECTION_PROBE") .define("SHADOW_SUBSURFACE") .define("LIGHT_CLOSURE_EVAL_COUNT", "2") .additional_info("eevee_shared", diff --git a/source/blender/draw/engines/eevee_next/shaders/infos/eevee_film_info.hh b/source/blender/draw/engines/eevee_next/shaders/infos/eevee_film_info.hh index 8005eaeec45..7d727b894b3 100644 --- a/source/blender/draw/engines/eevee_next/shaders/infos/eevee_film_info.hh +++ b/source/blender/draw/engines/eevee_next/shaders/infos/eevee_film_info.hh @@ -23,10 +23,6 @@ GPU_SHADER_CREATE_INFO(eevee_film) .image(5, GPU_RGBA16F, Qualifier::READ_WRITE, ImageType::FLOAT_2D_ARRAY, "color_accum_img") .image(6, GPU_R16F, Qualifier::READ_WRITE, ImageType::FLOAT_2D_ARRAY, "value_accum_img") .image(7, GPU_RGBA32F, Qualifier::READ_WRITE, ImageType::FLOAT_2D_ARRAY, "cryptomatte_img") - .specialization_constant(Type::UINT, "enabled_categories", 0) - .specialization_constant(Type::INT, "samples_len", 0) - .specialization_constant(Type::BOOL, "use_reprojection", false) - .specialization_constant(Type::INT, "scaling_factor", 1) .additional_info("eevee_shared") .additional_info("eevee_global_ubo") .additional_info("eevee_velocity_camera") diff --git a/source/blender/draw/engines/eevee_next/shaders/infos/eevee_irradiance_cache_info.hh b/source/blender/draw/engines/eevee_next/shaders/infos/eevee_irradiance_cache_info.hh index e6eac533fe1..33559612601 100644 --- a/source/blender/draw/engines/eevee_next/shaders/infos/eevee_irradiance_cache_info.hh +++ b/source/blender/draw/engines/eevee_next/shaders/infos/eevee_irradiance_cache_info.hh @@ -182,7 +182,7 @@ GPU_SHADER_CREATE_INFO(eevee_lightprobe_irradiance_load) .push_constant(Type::FLOAT, "dilation_threshold") .push_constant(Type::FLOAT, "dilation_radius") .push_constant(Type::FLOAT, "grid_intensity_factor") - .uniform_buf(0, "VolumeProbeData", "grids_infos_buf[IRRADIANCE_GRID_MAX]") + .uniform_buf(0, "IrradianceGridData", "grids_infos_buf[IRRADIANCE_GRID_MAX]") .storage_buf(0, Qualifier::READ, "uint", "bricks_infos_buf[]") .sampler(0, ImageType::FLOAT_3D, "irradiance_a_tx") .sampler(1, ImageType::FLOAT_3D, "irradiance_b_tx") @@ -200,20 +200,20 @@ GPU_SHADER_CREATE_INFO(eevee_lightprobe_irradiance_load) GPU_SHADER_CREATE_INFO(eevee_volume_probe_data) .uniform_buf(IRRADIANCE_GRID_BUF_SLOT, - "VolumeProbeData", + "IrradianceGridData", "grids_infos_buf[IRRADIANCE_GRID_MAX]") /* NOTE: Use uint instead of IrradianceBrickPacked because Metal needs to know the exact type. */ .storage_buf(IRRADIANCE_BRICK_BUF_SLOT, Qualifier::READ, "uint", "bricks_infos_buf[]") - .sampler(VOLUME_PROBE_TEX_SLOT, ImageType::FLOAT_3D, "irradiance_atlas_tx") + .sampler(IRRADIANCE_ATLAS_TEX_SLOT, ImageType::FLOAT_3D, "irradiance_atlas_tx") .define("IRRADIANCE_GRID_SAMPLING"); GPU_SHADER_CREATE_INFO(eevee_lightprobe_data) .additional_info("eevee_reflection_probe_data", "eevee_volume_probe_data"); GPU_SHADER_CREATE_INFO(eevee_lightprobe_planar_data) - .define("SPHERE_PROBE") - .uniform_buf(PLANAR_PROBE_BUF_SLOT, "PlanarProbeData", "probe_planar_buf[PLANAR_PROBE_MAX]") + .define("REFLECTION_PROBE") + .uniform_buf(PLANAR_PROBE_BUF_SLOT, "ProbePlanarData", "probe_planar_buf[PLANAR_PROBES_MAX]") .sampler(PLANAR_PROBE_RADIANCE_TEX_SLOT, ImageType::FLOAT_2D_ARRAY, "planar_radiance_tx") .sampler(PLANAR_PROBE_DEPTH_TEX_SLOT, ImageType::DEPTH_2D_ARRAY, "planar_depth_tx"); diff --git a/source/blender/draw/engines/eevee_next/shaders/infos/eevee_reflection_probe_info.hh b/source/blender/draw/engines/eevee_next/shaders/infos/eevee_reflection_probe_info.hh index 0164c19cb10..6ee1ae84905 100644 --- a/source/blender/draw/engines/eevee_next/shaders/infos/eevee_reflection_probe_info.hh +++ b/source/blender/draw/engines/eevee_next/shaders/infos/eevee_reflection_probe_info.hh @@ -10,18 +10,19 @@ * \{ */ GPU_SHADER_CREATE_INFO(eevee_reflection_probe_data) - .define("SPHERE_PROBE") - .uniform_buf(SPHERE_PROBE_BUF_SLOT, - "SphereProbeData", - "reflection_probe_buf[SPHERE_PROBE_MAX]") - .sampler(SPHERE_PROBE_TEX_SLOT, ImageType::FLOAT_2D_ARRAY, "reflection_probes_tx"); + .define("REFLECTION_PROBE") + .uniform_buf(REFLECTION_PROBE_BUF_SLOT, + "ReflectionProbeData", + "reflection_probe_buf[REFLECTION_PROBES_MAX]") + .sampler(REFLECTION_PROBE_TEX_SLOT, ImageType::FLOAT_2D_ARRAY, "reflection_probes_tx"); /* Sample cubemap and remap into an octahedral texture. */ GPU_SHADER_CREATE_INFO(eevee_reflection_probe_remap) - .local_group_size(SPHERE_PROBE_GROUP_SIZE, SPHERE_PROBE_GROUP_SIZE) + .local_group_size(REFLECTION_PROBE_GROUP_SIZE, REFLECTION_PROBE_GROUP_SIZE) .push_constant(Type::IVEC4, "probe_coord_packed") .push_constant(Type::IVEC4, "write_coord_packed") .push_constant(Type::IVEC4, "world_coord_packed") + .push_constant(Type::INT, "mip_level") .push_constant(Type::FLOAT, "probe_brightness_clamp") .sampler(0, ImageType::FLOAT_CUBE, "cubemap_tx") .sampler(1, ImageType::FLOAT_2D_ARRAY, "atlas_tx") @@ -33,8 +34,8 @@ GPU_SHADER_CREATE_INFO(eevee_reflection_probe_remap) /* Extract spherical harmonics band L0 + L1 from octahedral mapped reflection probe and update the * world brick of the irradiance cache. */ GPU_SHADER_CREATE_INFO(eevee_reflection_probe_update_irradiance) - .local_group_size(SPHERE_PROBE_SH_GROUP_SIZE, 1) - .define("SPHERE_PROBE") + .local_group_size(REFLECTION_PROBE_SH_GROUP_SIZE, 1) + .define("REFLECTION_PROBE") .push_constant(Type::IVEC4, "world_coord_packed") .sampler(0, ImageType::FLOAT_2D_ARRAY, "reflection_probes_tx") .image(0, GPU_RGBA16F, Qualifier::READ_WRITE, ImageType::FLOAT_3D, "irradiance_atlas_img") @@ -43,36 +44,23 @@ GPU_SHADER_CREATE_INFO(eevee_reflection_probe_update_irradiance) .do_static_compilation(true); GPU_SHADER_CREATE_INFO(eevee_reflection_probe_select) - .local_group_size(SPHERE_PROBE_SELECT_GROUP_SIZE) + .local_group_size(REFLECTION_PROBE_SELECT_GROUP_SIZE) .storage_buf(0, Qualifier::READ_WRITE, - "SphereProbeData", - "reflection_probe_buf[SPHERE_PROBE_MAX]") + "ReflectionProbeData", + "reflection_probe_buf[REFLECTION_PROBES_MAX]") .push_constant(Type::INT, "reflection_probe_count") .additional_info("eevee_shared", "eevee_sampling_data", "eevee_volume_probe_data") .compute_source("eevee_reflection_probe_select_comp.glsl") .do_static_compilation(true); -GPU_SHADER_CREATE_INFO(eevee_reflection_probe_convolve) - .local_group_size(SPHERE_PROBE_GROUP_SIZE, SPHERE_PROBE_GROUP_SIZE) - .additional_info("eevee_shared") - .push_constant(Type::IVEC4, "probe_coord_packed") - .push_constant(Type::IVEC4, "write_coord_packed") - .push_constant(Type::IVEC4, "read_coord_packed") - .push_constant(Type::INT, "read_lod") - .sampler(0, ImageType::FLOAT_CUBE, "cubemap_tx") - .sampler(1, ImageType::FLOAT_2D_ARRAY, "in_atlas_mip_tx") - .image(1, GPU_RGBA16F, Qualifier::WRITE, ImageType::FLOAT_2D_ARRAY, "out_atlas_mip_img") - .compute_source("eevee_reflection_probe_convolve_comp.glsl") - .do_static_compilation(true); - GPU_SHADER_INTERFACE_INFO(eevee_display_probe_reflection_iface, "") .smooth(Type::VEC2, "lP") .flat(Type::INT, "probe_index"); GPU_SHADER_CREATE_INFO(eevee_display_probe_reflection) .additional_info("eevee_shared", "draw_view", "eevee_reflection_probe_data") - .storage_buf(0, Qualifier::READ, "SphereProbeDisplayData", "display_data_buf[]") + .storage_buf(0, Qualifier::READ, "ReflectionProbeDisplayData", "display_data_buf[]") .vertex_source("eevee_display_probe_reflection_vert.glsl") .vertex_out(eevee_display_probe_reflection_iface) .fragment_source("eevee_display_probe_reflection_frag.glsl") @@ -83,7 +71,7 @@ GPU_SHADER_INTERFACE_INFO(eevee_display_probe_planar_iface, "").flat(Type::INT, GPU_SHADER_CREATE_INFO(eevee_display_probe_planar) .additional_info("eevee_shared", "draw_view", "eevee_lightprobe_planar_data") - .storage_buf(0, Qualifier::READ, "PlanarProbeDisplayData", "display_data_buf[]") + .storage_buf(0, Qualifier::READ, "ProbePlanarDisplayData", "display_data_buf[]") .vertex_source("eevee_display_probe_planar_vert.glsl") .vertex_out(eevee_display_probe_planar_iface) .fragment_source("eevee_display_probe_planar_frag.glsl") diff --git a/source/blender/draw/engines/gpencil/gpencil_antialiasing.hh b/source/blender/draw/engines/gpencil/gpencil_antialiasing.hh new file mode 100644 index 00000000000..cdcd2282a3d --- /dev/null +++ b/source/blender/draw/engines/gpencil/gpencil_antialiasing.hh @@ -0,0 +1,154 @@ +/* SPDX-FileCopyrightText: 2023 Blender Authors + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +/** \file + * \ingroup draw + */ + +#pragma once + +#include "BKE_gpencil_legacy.h" +#include "BKE_image.h" +#include "DRW_gpu_wrapper.hh" +#include "DRW_render.hh" + +#include "draw_manager.hh" +#include "draw_pass.hh" + +#include "gpencil_shader.hh" + +#include "BLI_smaa_textures.h" + +namespace blender::draw::greasepencil { + +using namespace draw; + +/** Final anti-aliasing post processing and compositing on top of render. */ +class AntiAliasing { + private: + ShaderModule &shaders_; + + Texture smaa_search_tx_ = {"smaa_search", + GPU_R8, + GPU_TEXTURE_USAGE_SHADER_READ, + int2(SEARCHTEX_WIDTH, SEARCHTEX_HEIGHT)}; + Texture smaa_area_tx_ = { + "smaa_area", GPU_RG8, GPU_TEXTURE_USAGE_SHADER_READ, int2(AREATEX_WIDTH, AREATEX_HEIGHT)}; + + TextureFromPool edge_detect_tx_ = {"edge_detect_tx"}; + Framebuffer edge_detect_fb_ = {"edge_detect_fb"}; + PassSimple edge_detect_ps_ = {"edge_detect_ps"}; + + TextureFromPool blend_weight_tx_ = {"blend_weight_tx"}; + Framebuffer blend_weight_fb_ = {"blend_weight_fb"}; + PassSimple blend_weight_ps_ = {"blend_weight_ps"}; + + PassSimple resolve_ps_ = {"resolve_ps"}; + + bool draw_wireframe_ = false; + float luma_weight_ = 1.0f; + bool anti_aliasing_enabled_ = true; + + public: + AntiAliasing(ShaderModule &shaders) : shaders_(shaders) + { + GPU_texture_update(smaa_search_tx_, GPU_DATA_UBYTE, searchTexBytes); + GPU_texture_update(smaa_area_tx_, GPU_DATA_UBYTE, areaTexBytes); + + GPU_texture_filter_mode(smaa_search_tx_, true); + GPU_texture_filter_mode(smaa_area_tx_, true); + } + + void init(const View3D *v3d, const Scene *scene) + { + if (v3d) { + draw_wireframe_ = (v3d->shading.type == OB_WIRE); + } + + luma_weight_ = scene->grease_pencil_settings.smaa_threshold; + anti_aliasing_enabled_ = true; // GPENCIL_SIMPLIFY_AA(scene); + } + + void begin_sync(TextureFromPool &color_tx, Framebuffer &scene_fb, TextureFromPool &reveal_tx) + { + /* TODO(fclem): No global access. */ + const float *size = DRW_viewport_size_get(); + const float *sizeinv = DRW_viewport_invert_size_get(); + const float4 metrics = {sizeinv[0], sizeinv[1], size[0], size[1]}; + + anti_aliasing_pass(color_tx, reveal_tx, metrics); + + /* Resolve pass. */ + PassSimple &pass = resolve_ps_; + pass.init(); + pass.framebuffer_set(&scene_fb); + pass.state_set(DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND_CUSTOM); + pass.shader_set(shaders_.static_shader_get(ANTIALIASING_RESOLVE)); + /** \note use color_tx as dummy if AA is disabled. */ + pass.bind_texture("blendTex", anti_aliasing_enabled_ ? &blend_weight_tx_ : &color_tx); + pass.bind_texture("colorTex", &color_tx); + pass.bind_texture("revealTex", &reveal_tx); + pass.push_constant("doAntiAliasing", anti_aliasing_enabled_); + pass.push_constant("onlyAlpha", draw_wireframe_); + pass.push_constant("viewportMetrics", metrics); + pass.draw_procedural(GPU_PRIM_TRIS, 1, 3); + } + + void draw(Manager &manager, const int2 render_resolution) + { + DRW_stats_group_start("Anti-Aliasing"); + + if (anti_aliasing_enabled_) { + edge_detect_tx_.acquire(render_resolution, GPU_RG8); + edge_detect_fb_.ensure(GPU_ATTACHMENT_NONE, GPU_ATTACHMENT_TEXTURE(edge_detect_tx_)); + manager.submit(edge_detect_ps_); + + blend_weight_tx_.acquire(render_resolution, GPU_RGBA8); + blend_weight_fb_.ensure(GPU_ATTACHMENT_NONE, GPU_ATTACHMENT_TEXTURE(blend_weight_tx_)); + manager.submit(blend_weight_ps_); + edge_detect_tx_.release(); + } + + manager.submit(resolve_ps_); + blend_weight_tx_.release(); + + DRW_stats_group_end(); + } + + private: + void anti_aliasing_pass(TextureFromPool &color_tx, + TextureFromPool &reveal_tx, + const float4 metrics) + { + if (!anti_aliasing_enabled_) { + return; + } + + /* Stage 1: Edge detection. */ + edge_detect_ps_.init(); + edge_detect_ps_.framebuffer_set(&edge_detect_fb_); + edge_detect_ps_.state_set(DRW_STATE_WRITE_COLOR); + edge_detect_ps_.shader_set(shaders_.static_shader_get(ANTIALIASING_EDGE_DETECT)); + edge_detect_ps_.bind_texture("colorTex", &color_tx); + edge_detect_ps_.bind_texture("revealTex", &reveal_tx); + edge_detect_ps_.push_constant("viewportMetrics", metrics); + edge_detect_ps_.push_constant("lumaWeight", luma_weight_); + edge_detect_ps_.clear_color(float4(0.0f)); + edge_detect_ps_.draw_procedural(GPU_PRIM_TRIS, 1, 3); + + /* Stage 2: Blend Weight/Coord. */ + blend_weight_ps_.init(); + blend_weight_ps_.framebuffer_set(&blend_weight_fb_); + blend_weight_ps_.state_set(DRW_STATE_WRITE_COLOR); + blend_weight_ps_.shader_set(shaders_.static_shader_get(ANTIALIASING_BLEND_WEIGHT)); + blend_weight_ps_.bind_texture("edgesTex", &edge_detect_tx_); + blend_weight_ps_.bind_texture("areaTex", smaa_area_tx_); + blend_weight_ps_.bind_texture("searchTex", smaa_search_tx_); + blend_weight_ps_.push_constant("viewportMetrics", metrics); + blend_weight_ps_.clear_color(float4(0.0f)); + blend_weight_ps_.draw_procedural(GPU_PRIM_TRIS, 1, 3); + } +}; + +} // namespace blender::draw::greasepencil diff --git a/source/blender/draw/engines/gpencil/gpencil_cache_utils.cc b/source/blender/draw/engines/gpencil/gpencil_cache_utils.cc index af09f6c9971..906dc37a07e 100644 --- a/source/blender/draw/engines/gpencil/gpencil_cache_utils.cc +++ b/source/blender/draw/engines/gpencil/gpencil_cache_utils.cc @@ -17,7 +17,6 @@ #include "BKE_gpencil_geom_legacy.h" #include "BKE_gpencil_legacy.h" -#include "BKE_grease_pencil.hh" #include "BKE_lib_id.hh" #include "BKE_object.hh" @@ -37,19 +36,17 @@ /** \name Object * \{ */ -GPENCIL_tObject *gpencil_object_cache_add(GPENCIL_PrivateData *pd, - Object *ob, - const bool is_stroke_order_3d, - const std::optional> bounds) +GPENCIL_tObject *gpencil_object_cache_add(GPENCIL_PrivateData *pd, Object *ob) { using namespace blender; + bGPdata *gpd = (bGPdata *)ob->data; GPENCIL_tObject *tgp_ob = static_cast(BLI_memblock_alloc(pd->gp_object_pool)); tgp_ob->layers.first = tgp_ob->layers.last = nullptr; tgp_ob->vfx.first = tgp_ob->vfx.last = nullptr; - tgp_ob->camera_z = dot_v3v3(pd->camera_z_axis, ob->object_to_world().location()); - tgp_ob->is_drawmode3d = is_stroke_order_3d || pd->draw_depth_only; - tgp_ob->object_scale = mat4_to_scale(ob->object_to_world().ptr()); + tgp_ob->camera_z = dot_v3v3(pd->camera_z_axis, ob->object_to_world[3]); + tgp_ob->is_drawmode3d = (gpd->draw_mode == GP_DRAWMODE_3D) || pd->draw_depth_only; + tgp_ob->object_scale = mat4_to_scale(ob->object_to_world); /* Check if any material with holdout flag enabled. */ tgp_ob->do_mat_holdout = false; @@ -69,6 +66,8 @@ GPENCIL_tObject *gpencil_object_cache_add(GPENCIL_PrivateData *pd, * strokes not aligned with the object axes. Maybe we could try to * compute the minimum axis of all strokes. But this would be more * computationally heavy and should go into the GPData evaluation. */ + const std::optional> bounds = BKE_gpencil_data_minmax(gpd).value_or( + Bounds(float3(0))); float3 size = (bounds->max - bounds->min) * 0.5f; float3 center = math::midpoint(bounds->min, bounds->max); /* Convert bbox to matrix */ @@ -79,7 +78,7 @@ GPENCIL_tObject *gpencil_object_cache_add(GPENCIL_PrivateData *pd, add_v3_fl(size, 1e-8f); rescale_m4(mat, size); /* BBox space to World. */ - mul_m4_m4m4(mat, ob->object_to_world().ptr(), mat); + mul_m4_m4m4(mat, ob->object_to_world, mat); if (DRW_view_is_persp_get(nullptr)) { /* BBox center to camera vector. */ sub_v3_v3v3(tgp_ob->plane_normal, pd->camera_pos, mat[3]); @@ -104,9 +103,9 @@ GPENCIL_tObject *gpencil_object_cache_add(GPENCIL_PrivateData *pd, unit_m4(tgp_ob->plane_mat); copy_v3_v3(tgp_ob->plane_mat[2], tgp_ob->plane_normal); orthogonalize_m4(tgp_ob->plane_mat, 2); - mul_mat3_m4_v3(ob->object_to_world().ptr(), size); + mul_mat3_m4_v3(ob->object_to_world, size); float radius = len_v3(size); - mul_m4_v3(ob->object_to_world().ptr(), center); + mul_m4_v3(ob->object_to_world, center); rescale_m4(tgp_ob->plane_mat, blender::float3{radius, radius, radius}); copy_v3_v3(tgp_ob->plane_mat[3], center); @@ -204,28 +203,6 @@ static float gpencil_layer_final_opacity_get(const GPENCIL_PrivateData *pd, return gpl->opacity; } -static float grease_pencil_layer_final_opacity_get(const GPENCIL_PrivateData *pd, - const Object *ob, - const GreasePencil &grease_pencil, - const blender::bke::greasepencil::Layer &layer) -{ - const bool is_obact = ((pd->obact) && (pd->obact == ob)); - const bool is_fade = (pd->fade_layer_opacity > -1.0f) && (is_obact) && - grease_pencil.is_layer_active(&layer); - - /* Defines layer opacity. For active object depends of layer opacity factor, and - * for no active object, depends if the fade grease pencil objects option is enabled. */ - if (!pd->is_render) { - if (is_obact && is_fade) { - return layer.opacity * pd->fade_layer_opacity; - } - if (!is_obact && (pd->fade_gp_object_opacity > -1.0f)) { - return layer.opacity * pd->fade_gp_object_opacity; - } - } - return layer.opacity; -} - static void gpencil_layer_final_tint_and_alpha_get(const GPENCIL_PrivateData *pd, const bGPdata *gpd, const bGPDlayer *gpl, @@ -276,20 +253,6 @@ static void gpencil_layer_random_color_get(const Object *ob, hsv_to_rgb_v(hsv, r_color); } -static void grease_pencil_layer_random_color_get(const Object *ob, - const blender::bke::greasepencil::Layer &layer, - float r_color[3]) -{ - const float hsv_saturation = 0.7f; - const float hsv_value = 0.6f; - - uint ob_hash = BLI_ghashutil_strhash_p_murmur(ob->id.name); - uint gpl_hash = BLI_ghashutil_strhash_p_murmur(layer.name().c_str()); - float hue = BLI_hash_int_01(ob_hash * gpl_hash); - const float hsv[3] = {hue, hsv_saturation, hsv_value}; - hsv_to_rgb_v(hsv, r_color); -} - GPENCIL_tLayer *gpencil_layer_cache_add(GPENCIL_PrivateData *pd, const Object *ob, const bGPDlayer *gpl, @@ -470,179 +433,4 @@ GPENCIL_tLayer *gpencil_layer_cache_get(GPENCIL_tObject *tgp_ob, int number) return nullptr; } -GPENCIL_tLayer *grease_pencil_layer_cache_add(GPENCIL_PrivateData *pd, - const Object *ob, - const blender::bke::greasepencil::Layer &layer, - std::optional /*onion_id*/, - GPENCIL_tObject *tgp_ob) - -{ - using namespace blender::bke::greasepencil; - const GreasePencil &grease_pencil = *static_cast(ob->data); - - const bool is_in_front = (ob->dtx & OB_DRAW_IN_FRONT); - /* Grease Pencil 3 doesn't have this. */ - const bool is_screenspace = false; - const bool override_vertcol = (pd->v3d_color_type != -1); - const bool is_vert_col_mode = (pd->v3d_color_type == V3D_SHADING_VERTEX_COLOR) || - (ob->mode == OB_MODE_VERTEX_PAINT) || pd->is_render; - const bool is_viewlayer_render = pd->is_render && !layer.view_layer_name().is_empty() && - STREQ(pd->view_layer->name, layer.view_layer_name().c_str()); - const bool disable_masks_render = is_viewlayer_render && - (layer.base.flag & GP_LAYER_DISABLE_MASKS_IN_VIEWLAYER) != 0; - bool is_masked = !disable_masks_render && layer.use_masks() && - !BLI_listbase_is_empty(&layer.masks); - - float vert_col_opacity = (override_vertcol) ? - (is_vert_col_mode ? pd->vertex_paint_opacity : 0.0f) : - pd->vertex_paint_opacity; - /* Negate thickness sign to tag that strokes are in screen space. - * Convert to world units (by default, 1 meter = 1000 pixels). */ - float thickness_scale = (is_screenspace) ? -1.0f : 1.0f / 1000.0f; - float layer_opacity = grease_pencil_layer_final_opacity_get(pd, ob, grease_pencil, layer); - - float4 layer_tint(0.0f); - float layer_alpha = pd->xray_alpha; - /* TODO: Onion skinning! */ - // gpencil_layer_final_tint_and_alpha_get(pd, gpd, gpl, gpf, layer_tint, &layer_alpha); - - /* Create the new layer descriptor. */ - GPENCIL_tLayer *tgp_layer = static_cast(BLI_memblock_alloc(pd->gp_layer_pool)); - BLI_LINKS_APPEND(&tgp_ob->layers, tgp_layer); - tgp_layer->layer_id = *grease_pencil.get_layer_index(layer); - tgp_layer->mask_bits = nullptr; - tgp_layer->mask_invert_bits = nullptr; - tgp_layer->blend_ps = nullptr; - - /* Masking: Go through mask list and extract valid masks in a bitmap. */ - if (is_masked) { - bool valid_mask = false; - /* WARNING: only #GP_MAX_MASKBITS amount of bits. - * TODO(fclem): Find a better system without any limitation. */ - tgp_layer->mask_bits = static_cast(BLI_memblock_alloc(pd->gp_maskbit_pool)); - tgp_layer->mask_invert_bits = static_cast( - BLI_memblock_alloc(pd->gp_maskbit_pool)); - BLI_bitmap_set_all(tgp_layer->mask_bits, false, GP_MAX_MASKBITS); - - LISTBASE_FOREACH (GreasePencilLayerMask *, mask, &layer.masks) { - if (mask->flag & GP_LAYER_MASK_HIDE) { - continue; - } - const TreeNode *node = grease_pencil.find_node_by_name(mask->layer_name); - if (node == nullptr) { - continue; - } - const Layer &mask_layer = node->as_layer(); - if ((&mask_layer == &layer) || !mask_layer.is_visible()) { - continue; - } - const int index = *grease_pencil.get_layer_index(mask_layer); - if (index < GP_MAX_MASKBITS) { - const bool invert = (mask->flag & GP_LAYER_MASK_INVERT) != 0; - BLI_BITMAP_SET(tgp_layer->mask_bits, index, true); - BLI_BITMAP_SET(tgp_layer->mask_invert_bits, index, invert); - valid_mask = true; - } - } - - if (valid_mask) { - pd->use_mask_fb = true; - } - else { - tgp_layer->mask_bits = nullptr; - } - is_masked = valid_mask; - } - - /* Blending: Force blending for masked layer. */ - if (is_masked || (layer.blend_mode != GP_LAYER_BLEND_NONE) || (layer_opacity < 1.0f)) { - DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_STENCIL_EQUAL; - switch (layer.blend_mode) { - case GP_LAYER_BLEND_NONE: - state |= DRW_STATE_BLEND_ALPHA_PREMUL; - break; - case GP_LAYER_BLEND_ADD: - state |= DRW_STATE_BLEND_ADD_FULL; - break; - case GP_LAYER_BLEND_SUBTRACT: - state |= DRW_STATE_BLEND_SUB; - break; - case GP_LAYER_BLEND_MULTIPLY: - case GP_LAYER_BLEND_DIVIDE: - case GP_LAYER_BLEND_HARDLIGHT: - state |= DRW_STATE_BLEND_MUL; - break; - } - - if (ELEM(layer.blend_mode, GP_LAYER_BLEND_SUBTRACT, GP_LAYER_BLEND_HARDLIGHT)) { - /* For these effect to propagate, we need a signed floating point buffer. */ - pd->use_signed_fb = true; - } - - tgp_layer->blend_ps = DRW_pass_create("GPencil Blend Layer", state); - - GPUShader *sh = GPENCIL_shader_layer_blend_get(); - DRWShadingGroup *grp = DRW_shgroup_create(sh, tgp_layer->blend_ps); - DRW_shgroup_uniform_int_copy(grp, "blendMode", layer.blend_mode); - DRW_shgroup_uniform_float_copy(grp, "blendOpacity", layer_opacity); - DRW_shgroup_uniform_texture_ref(grp, "colorBuf", &pd->color_layer_tx); - DRW_shgroup_uniform_texture_ref(grp, "revealBuf", &pd->reveal_layer_tx); - DRW_shgroup_uniform_texture_ref(grp, "maskBuf", (is_masked) ? &pd->mask_tx : &pd->dummy_tx); - DRW_shgroup_stencil_mask(grp, 0xFF); - DRW_shgroup_call_procedural_triangles(grp, nullptr, 1); - - if (layer.blend_mode == GP_LAYER_BLEND_HARDLIGHT) { - /* We cannot do custom blending on Multi-Target frame-buffers. - * Workaround by doing 2 passes. */ - grp = DRW_shgroup_create(sh, tgp_layer->blend_ps); - DRW_shgroup_state_disable(grp, DRW_STATE_BLEND_MUL); - DRW_shgroup_state_enable(grp, DRW_STATE_BLEND_ADD_FULL); - DRW_shgroup_uniform_int_copy(grp, "blendMode", 999); - DRW_shgroup_call_procedural_triangles(grp, nullptr, 1); - } - - pd->use_layer_fb = true; - } - - /* Geometry pass */ - { - GPUTexture *depth_tex = (is_in_front) ? pd->dummy_tx : pd->scene_depth_tx; - GPUTexture **mask_tex = (is_masked) ? &pd->mask_tx : &pd->dummy_tx; - - DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | DRW_STATE_BLEND_ALPHA_PREMUL; - /* For 2D mode, we render all strokes with uniform depth (increasing with stroke id). */ - state |= tgp_ob->is_drawmode3d ? DRW_STATE_DEPTH_LESS_EQUAL : DRW_STATE_DEPTH_GREATER; - /* Always write stencil. Only used as optimization for blending. */ - state |= DRW_STATE_WRITE_STENCIL | DRW_STATE_STENCIL_ALWAYS; - - tgp_layer->geom_ps = DRW_pass_create("GPencil Layer", state); - - GPUShader *sh = GPENCIL_shader_geometry_get(); - DRWShadingGroup *grp = tgp_layer->base_shgrp = DRW_shgroup_create(sh, tgp_layer->geom_ps); - - DRW_shgroup_uniform_texture(grp, "gpSceneDepthTexture", depth_tex); - DRW_shgroup_uniform_texture_ref(grp, "gpMaskTexture", mask_tex); - DRW_shgroup_uniform_vec3_copy(grp, "gpNormal", tgp_ob->plane_normal); - DRW_shgroup_uniform_bool_copy(grp, "gpStrokeOrder3d", tgp_ob->is_drawmode3d); - DRW_shgroup_uniform_float_copy(grp, "gpThicknessScale", tgp_ob->object_scale); - /* Replaced by a modifier in GPv3. */ - DRW_shgroup_uniform_float_copy(grp, "gpThicknessOffset", 0.0f); - DRW_shgroup_uniform_float_copy(grp, "gpThicknessWorldScale", thickness_scale); - DRW_shgroup_uniform_float_copy(grp, "gpVertexColorOpacity", vert_col_opacity); - - /* If random color type, need color by layer. */ - float gpl_color[4]; - copy_v4_v4(gpl_color, layer_tint); - if (pd->v3d_color_type == V3D_SHADING_RANDOM_COLOR) { - grease_pencil_layer_random_color_get(ob, layer, gpl_color); - gpl_color[3] = 1.0f; - } - DRW_shgroup_uniform_vec4_copy(grp, "gpLayerTint", gpl_color); - - DRW_shgroup_uniform_float_copy(grp, "gpLayerOpacity", layer_alpha); - DRW_shgroup_stencil_mask(grp, 0xFF); - } - - return tgp_layer; -} /** \} */ diff --git a/source/blender/draw/engines/gpencil/gpencil_draw_data.cc b/source/blender/draw/engines/gpencil/gpencil_draw_data.cc index 97e80c65bdb..4b45b53e355 100644 --- a/source/blender/draw/engines/gpencil/gpencil_draw_data.cc +++ b/source/blender/draw/engines/gpencil/gpencil_draw_data.cc @@ -16,7 +16,7 @@ #include "BLI_math_color.h" #include "BLI_memblock.h" -#include "GPU_uniform_buffer.hh" +#include "GPU_uniform_buffer.h" #include "IMB_imbuf_types.hh" @@ -157,10 +157,7 @@ static MaterialGPencilStyle *gpencil_viewport_material_overrides( return gp_style; } -GPENCIL_MaterialPool *gpencil_material_pool_create(GPENCIL_PrivateData *pd, - Object *ob, - int *ofs, - const bool is_vertex_mode) +GPENCIL_MaterialPool *gpencil_material_pool_create(GPENCIL_PrivateData *pd, Object *ob, int *ofs) { GPENCIL_MaterialPool *matpool = pd->last_material_pool; @@ -178,8 +175,10 @@ GPENCIL_MaterialPool *gpencil_material_pool_create(GPENCIL_PrivateData *pd, } /* Force vertex color in solid mode with vertex paint mode. Same behavior as meshes. */ - int color_type = (pd->v3d_color_type != -1 && is_vertex_mode) ? V3D_SHADING_VERTEX_COLOR : - pd->v3d_color_type; + bGPdata *gpd = (bGPdata *)ob->data; + int color_type = (pd->v3d_color_type != -1 && GPENCIL_VERTEX_MODE(gpd)) ? + V3D_SHADING_VERTEX_COLOR : + pd->v3d_color_type; const eV3DShadingLightingMode lighting_mode = eV3DShadingLightingMode( (pd->v3d != nullptr) ? eV3DShadingLightingMode(pd->v3d->shading.light) : V3D_LIGHTING_STUDIO); @@ -379,27 +378,27 @@ void gpencil_light_pool_populate(GPENCIL_LightPool *lightpool, Object *ob) float(*mat)[4] = reinterpret_cast(&gp_light->right); if (la->type == LA_SPOT) { - copy_m4_m4(mat, ob->world_to_object().ptr()); + copy_m4_m4(mat, ob->world_to_object); gp_light->type = GP_LIGHT_TYPE_SPOT; gp_light->spot_size = cosf(la->spotsize * 0.5f); gp_light->spot_blend = (1.0f - gp_light->spot_size) * la->spotblend; } else if (la->type == LA_AREA) { /* Simulate area lights using a spot light. */ - normalize_m4_m4(mat, ob->object_to_world().ptr()); + normalize_m4_m4(mat, ob->object_to_world); invert_m4(mat); gp_light->type = GP_LIGHT_TYPE_SPOT; gp_light->spot_size = cosf(M_PI_2); gp_light->spot_blend = (1.0f - gp_light->spot_size) * 1.0f; } else if (la->type == LA_SUN) { - normalize_v3_v3(gp_light->forward, ob->object_to_world().ptr()[2]); + normalize_v3_v3(gp_light->forward, ob->object_to_world[2]); gp_light->type = GP_LIGHT_TYPE_SUN; } else { gp_light->type = GP_LIGHT_TYPE_POINT; } - copy_v4_v4(gp_light->position, ob->object_to_world().location()); + copy_v4_v4(gp_light->position, ob->object_to_world[3]); copy_v3_v3(gp_light->color, &la->r); mul_v3_fl(gp_light->color, la->energy * light_power_get(la)); diff --git a/source/blender/draw/engines/gpencil/gpencil_engine.cc b/source/blender/draw/engines/gpencil/gpencil_engine.cc new file mode 100644 index 00000000000..6b8350d7253 --- /dev/null +++ b/source/blender/draw/engines/gpencil/gpencil_engine.cc @@ -0,0 +1,449 @@ +/* SPDX-FileCopyrightText: 2023 Blender Authors + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +/** \file + * \ingroup draw + */ + +#include "BKE_gpencil_modifier_legacy.h" + +#include "BLI_listbase_wrapper.hh" + +#include "DEG_depsgraph_query.hh" + +#include "DNA_shader_fx_types.h" + +#include "DRW_engine.hh" +#include "DRW_render.hh" + +#include "ED_screen.hh" +#include "ED_view3d.hh" + +#include "GPU_capabilities.h" + +#include "IMB_imbuf_types.hh" + +#include "RE_pipeline.h" + +#include "draw_manager.hh" +#include "draw_pass.hh" + +#define GP_LIGHT +#include "gpencil_antialiasing.hh" +#include "gpencil_defines.h" +#include "gpencil_engine.h" +#include "gpencil_layer.hh" +#include "gpencil_light.hh" +#include "gpencil_material.hh" +#include "gpencil_object.hh" +#include "gpencil_shader.hh" +#include "gpencil_shader_shared.h" +#include "gpencil_vfx.hh" + +namespace blender::draw::greasepencil { + +using namespace draw; + +class Instance { + private: + ShaderModule &shaders; + LayerModule layers; + MaterialModule materials; + ObjectModule objects; + LightModule lights; + VfxModule vfx; + AntiAliasing anti_aliasing; + + /** Contains all gpencil objects in the scene as well as their effect sub-passes. */ + PassSortable main_ps_ = {"gp_main_ps"}; + + /** Contains all composited GPencil object. */ + TextureFromPool depth_tx_ = {"gp_depth_tx"}; + TextureFromPool color_tx_ = {"gp_color_tx"}; + TextureFromPool reveal_tx_ = {"gp_reveal_tx"}; + Framebuffer main_fb_ = {"gp_main_fb"}; + + /** Underlying scene pixel. Used to composite the output of the grease pencil render onto the + * scene (including merging the depth buffers). */ + Framebuffer scene_fb_ = {"gp_scene_fb"}; + + /** Texture format for all intermediate buffers. */ + eGPUTextureFormat texture_format_ = GPU_RGBA16F; + + UniformBuffer scene_buf_; + + /** Dummy textures. */ + static constexpr float dummy_px_[4] = {1.0f, 0.0f, 1.0f, 1.0f}; + Texture dummy_depth_tx_ = {"dummy_depth", + GPU_DEPTH_COMPONENT32F, + GPU_TEXTURE_USAGE_SHADER_READ, + int2(1), + (float *)dummy_px_}; + Texture dummy_color_tx_ = { + "dummy_color", GPU_RGBA16F, GPU_TEXTURE_USAGE_SHADER_READ, int2(1), (float *)dummy_px_}; + + /** Scene depth used for manual depth testing. Default to dummy depth to skip depth test. */ + GPUTexture *scene_depth_tx_ = dummy_depth_tx_; + + /** Context. */ + Depsgraph *depsgraph_ = nullptr; + Object *camera_ = nullptr; + Manager *manager_ = nullptr; + draw::View view_ = {"MainView"}; + + /** \note Needs not to be temporary variable since it is dereferenced later. */ + std::array clear_colors_ = {float4(0.0f, 0.0f, 0.0f, 0.0f), + float4(1.0f, 1.0f, 1.0f, 1.0f)}; + + public: + Instance() + : shaders(*ShaderModule::module_get()), + objects(layers, materials, shaders), + vfx(shaders), + anti_aliasing(shaders){}; + + void init(Depsgraph *depsgraph, + Manager *manager, + const DRWView *viewport_draw_view, + const View3D *v3d, + const RegionView3D *rv3d) + { + depsgraph_ = depsgraph; + manager_ = manager; + if (viewport_draw_view != nullptr) { + view_.sync(viewport_draw_view); + } + + const Scene *scene = DEG_get_evaluated_scene(depsgraph_); + + const bool is_viewport = (v3d != nullptr); + + if (is_viewport) { + /* Use lower precision for viewport. */ + texture_format_ = GPU_R11F_G11F_B10F; + camera_ = (rv3d->persp == RV3D_CAMOB) ? v3d->camera : nullptr; + } + + objects.init(v3d, scene); + lights.init(v3d); + /* TODO(@fclem): VFX. */ + // vfx.init(use_vfx_, camera_, rv3d); + anti_aliasing.init(v3d, scene); + } + + void begin_sync() + { + objects.begin_sync(depsgraph_, view_); + layers.begin_sync(); + materials.begin_sync(); + lights.begin_sync(depsgraph_); + + main_ps_.init(); + PassMain::Sub &sub = main_ps_.sub("InitSubpass", -FLT_MAX); + sub.framebuffer_set(&main_fb_); + sub.clear_multi(clear_colors_); + /* TODO(fclem): Textures. */ + sub.bind_texture(GPENCIL_SCENE_DEPTH_TEX_SLOT, &dummy_depth_tx_); + sub.bind_texture(GPENCIL_MASK_TEX_SLOT, &dummy_color_tx_); + sub.bind_texture(GPENCIL_FILL_TEX_SLOT, &dummy_color_tx_); + sub.bind_texture(GPENCIL_STROKE_TEX_SLOT, &dummy_color_tx_); + sub.bind_ubo(GPENCIL_SCENE_SLOT, &scene_buf_); + objects.bind_resources(sub); + layers.bind_resources(sub); + materials.bind_resources(sub); + lights.bind_resources(sub); + + anti_aliasing.begin_sync(color_tx_, scene_fb_, reveal_tx_); + } + + void object_sync(ObjectRef &object_ref) + { + switch (object_ref.object->type) { + case OB_GREASE_PENCIL: + objects.sync_grease_pencil( + *manager_, object_ref, main_fb_, scene_fb_, depth_tx_, main_ps_); + break; + case OB_LAMP: + lights.sync(object_ref); + break; + default: + break; + } + } + + void end_sync() + { + objects.end_sync(); + layers.end_sync(); + materials.end_sync(); + lights.end_sync(); + } + + void render_sync(RenderEngine *engine, Depsgraph *depsgraph) + { + /* TODO: Remove old draw manager calls. */ + DRW_cache_restart(); + + manager_->begin_sync(); + + begin_sync(); + + auto object_sync_render = + [](void *vedata, Object *ob, RenderEngine * /*engine*/, Depsgraph * /*depsgraph*/) { + Instance &inst = *reinterpret_cast(vedata); + ObjectRef ob_ref = DRW_object_ref_get(ob); + inst.object_sync(ob_ref); + }; + + /* HACK: We pass `this` here so we have access to the `Instance` in `object_sync_render`. */ + DRW_render_object_iter(this, engine, depsgraph, object_sync_render); + + end_sync(); + + manager_->end_sync(); + + /* TODO: Remove old draw manager calls. */ + DRW_render_instance_buffer_finish(); + } + + void draw(GPUTexture *dst_color_tx, GPUTexture *dst_depth_tx, const int2 render_resolution) + { + if (!objects.scene_has_visible_gpencil_object()) { + return; + } + + scene_fb_.ensure(GPU_ATTACHMENT_TEXTURE(dst_depth_tx), GPU_ATTACHMENT_TEXTURE(dst_color_tx)); + + depth_tx_.acquire(render_resolution, GPU_DEPTH24_STENCIL8); + color_tx_.acquire(render_resolution, texture_format_); + reveal_tx_.acquire(render_resolution, texture_format_); + main_fb_.ensure(GPU_ATTACHMENT_TEXTURE(depth_tx_), + GPU_ATTACHMENT_TEXTURE(color_tx_), + GPU_ATTACHMENT_TEXTURE(reveal_tx_)); + + scene_buf_.render_size = float2(render_resolution); + scene_buf_.push_update(); + + objects.acquire_temporary_buffers(render_resolution, texture_format_); + + manager_->submit(main_ps_, view_); + + objects.release_temporary_buffers(); + + anti_aliasing.draw(*manager_, render_resolution); + + depth_tx_.release(); + color_tx_.release(); + reveal_tx_.release(); + } + + draw::View &view() + { + return view_; + } +}; + +} // namespace blender::draw::greasepencil + +/* -------------------------------------------------------------------- */ +/** \name Interface with legacy C DRW manager + * \{ */ + +using namespace blender; + +struct GPENCIL_NEXT_Data { + DrawEngineType *engine_type; + DRWViewportEmptyList *fbl; + DRWViewportEmptyList *txl; + DRWViewportEmptyList *psl; + DRWViewportEmptyList *stl; + draw::greasepencil::Instance *instance; + + char info[GPU_INFO_SIZE]; +}; + +static void gpencil_engine_init(void *vedata) +{ + GPENCIL_NEXT_Data *ved = reinterpret_cast(vedata); + if (ved->instance == nullptr) { + ved->instance = new draw::greasepencil::Instance(); + } + + draw::Manager *manager = DRW_manager_get(); + const DRWContextState *ctx_state = DRW_context_state_get(); + const DRWView *default_view = DRW_view_default_get(); + + ved->instance->init( + ctx_state->depsgraph, manager, default_view, ctx_state->v3d, ctx_state->rv3d); +} + +static void gpencil_draw_scene(void *vedata) +{ + GPENCIL_NEXT_Data *ved = reinterpret_cast(vedata); + if (DRW_state_is_select() || DRW_state_is_depth()) { + return; + } + DefaultTextureList *dtxl = DRW_viewport_texture_list_get(); + const DRWView *default_view = DRW_view_default_get(); + const float2 viewport_size = DRW_viewport_size_get(); + ved->instance->view().sync(default_view); + ved->instance->draw(dtxl->color, dtxl->depth, int2(viewport_size)); +} + +static void gpencil_cache_init(void *vedata) +{ + reinterpret_cast(vedata)->instance->begin_sync(); +} + +static void gpencil_cache_populate(void *vedata, Object *object) +{ + draw::ObjectRef ref; + ref.object = object; + ref.dupli_object = DRW_object_get_dupli(object); + ref.dupli_parent = DRW_object_get_dupli_parent(object); + + reinterpret_cast(vedata)->instance->object_sync(ref); +} + +static void gpencil_cache_finish(void *vedata) +{ + reinterpret_cast(vedata)->instance->end_sync(); +} + +static void gpencil_instance_free(void *instance) +{ + delete reinterpret_cast(instance); +} + +static void gpencil_engine_free() +{ + blender::draw::greasepencil::ShaderModule::module_free(); +} + +/** Get the color and depth textures of the render result in the render layer. */ +static void get_render_result_textures(RenderEngine *engine, + RenderLayer *render_layer, + const draw::View &view, + const int2 render_resolution, + draw::Texture &r_color_tx, + draw::Texture &r_depth_tx) +{ + /* Create depth texture & color texture from render result. */ + const char *viewname = RE_GetActiveRenderView(engine->re); + RenderPass *rpass_z_src = RE_pass_find_by_name(render_layer, RE_PASSNAME_Z, viewname); + RenderPass *rpass_col_src = RE_pass_find_by_name(render_layer, RE_PASSNAME_COMBINED, viewname); + + float *pix_z = (rpass_z_src) ? rpass_z_src->ibuf->float_buffer.data : nullptr; + float *pix_col = (rpass_col_src) ? rpass_col_src->ibuf->float_buffer.data : nullptr; + + if (!pix_z || !pix_col) { + RE_engine_set_error_message(engine, + "Warning: To render grease pencil, enable Combined and Z passes."); + } + + if (pix_z) { + /* Depth need to be remapped to [0..1] range. */ + pix_z = static_cast(MEM_dupallocN(pix_z)); + + int pix_num = rpass_z_src->rectx * rpass_z_src->recty; + + if (view.is_persp()) { + for (int i = 0; i < pix_num; i++) { + pix_z[i] = (-view.winmat()[3][2] / -pix_z[i]) - view.winmat()[2][2]; + pix_z[i] = clamp_f(pix_z[i] * 0.5f + 0.5f, 0.0f, 1.0f); + } + } + else { + /* Keep in mind, near and far distance are negatives. */ + float near = view.near_clip(); + float far = view.far_clip(); + float range_inv = 1.0f / fabsf(far - near); + for (int i = 0; i < pix_num; i++) { + pix_z[i] = (pix_z[i] + near) * range_inv; + pix_z[i] = clamp_f(pix_z[i], 0.0f, 1.0f); + } + } + } + + /* FIXME(fclem): we have a precision loss in the depth buffer because of this re-upload. + * Find where it comes from! */ + const eGPUTextureUsage usage = GPU_TEXTURE_USAGE_ATTACHMENT | GPU_TEXTURE_USAGE_HOST_READ; + r_depth_tx.ensure_2d(GPU_DEPTH_COMPONENT24, render_resolution, usage, pix_z); + r_color_tx.ensure_2d(GPU_RGBA16F, render_resolution, usage, pix_col); +} + +static void gpencil_render_to_image(void * /*vedata*/, + RenderEngine *engine, + RenderLayer *render_layer, + const rcti * /*rect*/) +{ + draw::greasepencil::Instance instance; + draw::Manager &manager = *DRW_manager_get(); + + Render *render = engine->re; + Depsgraph *depsgraph = DRW_context_state_get()->depsgraph; + Object *camera_original_ob = RE_GetCamera(render); + const char *viewname = RE_GetActiveRenderView(render); + const int2 render_resolution = int2(engine->resolution_x, engine->resolution_y); + + instance.init(depsgraph, &manager, nullptr, nullptr, nullptr); + + float4x4 viewinv, winmat; + Object *camera_eval = DEG_get_evaluated_object(depsgraph, camera_original_ob); + RE_GetCameraModelMatrix(render, camera_eval, viewinv.ptr()); + float4x4 viewmat = math::invert(viewinv); + RE_GetCameraWindow(render, camera_eval, winmat.ptr()); + + instance.view().sync(viewmat, winmat); + instance.render_sync(engine, depsgraph); + + draw::Texture color_tx; + draw::Texture depth_tx; + /* TODO: Support `R_BORDER` render mode. */ + get_render_result_textures( + engine, render_layer, instance.view(), render_resolution, color_tx, depth_tx); + + instance.draw(color_tx, depth_tx, render_resolution); + + RenderPass *rp = RE_pass_find_by_name(render_layer, RE_PASSNAME_COMBINED, viewname); + if (!rp) { + return; + } + float *result = reinterpret_cast(color_tx.read(GPU_DATA_FLOAT)); + + if (result) { + BLI_mutex_lock(&engine->update_render_passes_mutex); + /* WORKAROUND: We use texture read to avoid using a frame-buffer to get the render result. + * However, on some implementation, we need a buffer with a few extra bytes for the read to + * happen correctly (see #GLTexture::read()). So we need a custom memory allocation. */ + /* Avoid `memcpy()`, replace the pointer directly. */ + RE_pass_set_buffer_data(rp, result); + BLI_mutex_unlock(&engine->update_render_passes_mutex); + } +} + +extern "C" { + +static const DrawEngineDataSize gpencil_data_size = DRW_VIEWPORT_DATA_SIZE(GPENCIL_NEXT_Data); + +DrawEngineType draw_engine_gpencil_next_type = { + /*next*/ nullptr, + /*prev*/ nullptr, + /*idname*/ N_("Gpencil"), + /*vedata_size*/ &gpencil_data_size, + /*engine_init*/ &gpencil_engine_init, + /*engine_free*/ &gpencil_engine_free, + /*instance_free*/ &gpencil_instance_free, + /*cache_init*/ &gpencil_cache_init, + /*cache_populate*/ &gpencil_cache_populate, + /*cache_finish*/ &gpencil_cache_finish, + /*draw_scene*/ &gpencil_draw_scene, + /*view_update*/ nullptr, + /*id_update*/ nullptr, + /*render_to_image*/ &gpencil_render_to_image, + /*store_metadata*/ nullptr, +}; +} + +/** \} */ diff --git a/source/blender/draw/engines/gpencil/gpencil_engine.h b/source/blender/draw/engines/gpencil/gpencil_engine.h index 5f8501033c6..ab4d9ea4309 100644 --- a/source/blender/draw/engines/gpencil/gpencil_engine.h +++ b/source/blender/draw/engines/gpencil/gpencil_engine.h @@ -13,9 +13,6 @@ #include "DRW_render.hh" #include "BLI_bitmap.h" -#include "BLI_bounds.hh" - -#include "BKE_grease_pencil.hh" #include "GPU_batch.h" @@ -29,6 +26,7 @@ extern "C" { #include "gpencil_shader_shared.h" extern DrawEngineType draw_engine_gpencil_type; +extern DrawEngineType draw_engine_gpencil_next_type; struct GPENCIL_Data; struct GPENCIL_StorageList; @@ -324,10 +322,7 @@ typedef struct GPENCIL_PrivateData { /* geometry batch cache functions */ struct GpencilBatchCache *gpencil_batch_cache_get(struct Object *ob, int cfra); -GPENCIL_tObject *gpencil_object_cache_add(GPENCIL_PrivateData *pd, - Object *ob, - bool is_stroke_order_3d, - std::optional> bounds); +GPENCIL_tObject *gpencil_object_cache_add(GPENCIL_PrivateData *pd, Object *ob); void gpencil_object_cache_sort(GPENCIL_PrivateData *pd); GPENCIL_tLayer *gpencil_layer_cache_add(GPENCIL_PrivateData *pd, @@ -337,20 +332,12 @@ GPENCIL_tLayer *gpencil_layer_cache_add(GPENCIL_PrivateData *pd, GPENCIL_tObject *tgp_ob); GPENCIL_tLayer *gpencil_layer_cache_get(GPENCIL_tObject *tgp_ob, int number); -GPENCIL_tLayer *grease_pencil_layer_cache_add(GPENCIL_PrivateData *pd, - const Object *ob, - const blender::bke::greasepencil::Layer &layer, - std::optional onion_id, - GPENCIL_tObject *tgp_ob); /** * Creates a linked list of material pool containing all materials assigned for a given object. * We merge the material pools together if object does not contain a huge amount of materials. * Also return an offset to the first material of the object in the UBO. */ -GPENCIL_MaterialPool *gpencil_material_pool_create(GPENCIL_PrivateData *pd, - Object *ob, - int *ofs, - bool is_vertex_mode); +GPENCIL_MaterialPool *gpencil_material_pool_create(GPENCIL_PrivateData *pd, Object *ob, int *ofs); void gpencil_material_resources_get(GPENCIL_MaterialPool *first_pool, int mat_id, struct GPUTexture **r_tex_stroke, @@ -366,10 +353,7 @@ GPENCIL_LightPool *gpencil_light_pool_add(GPENCIL_PrivateData *pd); GPENCIL_LightPool *gpencil_light_pool_create(GPENCIL_PrivateData *pd, Object *ob); /* effects */ -void gpencil_vfx_cache_populate(GPENCIL_Data *vedata, - Object *ob, - GPENCIL_tObject *tgp_ob, - const bool is_edit_mode); +void gpencil_vfx_cache_populate(GPENCIL_Data *vedata, Object *ob, GPENCIL_tObject *tgp_ob); /* Shaders */ struct GPUShader *GPENCIL_shader_antialiasing(int stage); diff --git a/source/blender/draw/engines/gpencil/gpencil_engine_c.cc b/source/blender/draw/engines/gpencil/gpencil_engine_c.cc index de48df2161f..37594d3049d 100644 --- a/source/blender/draw/engines/gpencil/gpencil_engine_c.cc +++ b/source/blender/draw/engines/gpencil/gpencil_engine_c.cc @@ -8,12 +8,8 @@ #include "DRW_engine.hh" #include "DRW_render.hh" -#include "BKE_curves.hh" -#include "BKE_gpencil_geom_legacy.h" #include "BKE_gpencil_legacy.h" #include "BKE_gpencil_modifier_legacy.h" -#include "BKE_grease_pencil.h" -#include "BKE_grease_pencil.hh" #include "BKE_lib_id.hh" #include "BKE_main.hh" #include "BKE_object.hh" @@ -21,12 +17,11 @@ #include "BKE_shader_fx.h" #include "BKE_camera.h" -#include "BKE_global.hh" /* for G.debug */ +#include "BKE_global.h" /* for G.debug */ #include "BLI_link_utils.h" #include "BLI_listbase.h" #include "BLI_memblock.h" -#include "BLI_virtual_array.hh" #include "DNA_camera_types.h" #include "DNA_gpencil_legacy_types.h" @@ -34,13 +29,12 @@ #include "DNA_view3d_types.h" #include "GPU_texture.h" -#include "GPU_uniform_buffer.hh" +#include "GPU_uniform_buffer.h" #include "gpencil_engine.h" #include "DEG_depsgraph_query.hh" -#include "ED_grease_pencil.hh" #include "ED_screen.hh" #include "ED_view3d.hh" @@ -119,10 +113,8 @@ void GPENCIL_engine_init(void *ved) stl->pd->v3d_color_type = (v3d->shading.type == OB_SOLID) ? v3d->shading.color_type : -1; /* Special case: If Vertex Paint mode, use always Vertex mode. */ - if (v3d->shading.type == OB_SOLID && ctx->obact && - ((ctx->obact->type == OB_GPENCIL_LEGACY && - ctx->obact->mode == OB_MODE_VERTEX_GPENCIL_LEGACY) || - (ctx->obact->type == OB_GREASE_PENCIL && ctx->obact->mode == OB_MODE_VERTEX_PAINT))) + if (v3d->shading.type == OB_SOLID && ctx->obact && ctx->obact->type == OB_GPENCIL_LEGACY && + ctx->obact->mode == OB_MODE_VERTEX_GPENCIL_LEGACY) { stl->pd->v3d_color_type = V3D_SHADING_VERTEX_COLOR; } @@ -567,10 +559,7 @@ static void gpencil_sbuffer_cache_populate_fast(GPENCIL_Data *vedata, gpIterPopu GPUTexture *depth_texture = iter->pd->scene_depth_tx; GPENCIL_tObject *last_tgp_ob = iter->pd->tobjects.last; /* Create another temp object that only contain the stroke. */ - const std::optional> bounds = BKE_gpencil_data_minmax(gpd).value_or( - blender::Bounds(float3(0))); - iter->tgp_ob = gpencil_object_cache_add( - iter->pd, iter->ob, (gpd->draw_mode == GP_DRAWMODE_3D), bounds); + iter->tgp_ob = gpencil_object_cache_add(iter->pd, iter->ob); /* Remove from the main list. */ iter->pd->tobjects.last = last_tgp_ob; last_tgp_ob->next = nullptr; @@ -593,202 +582,13 @@ static void gpencil_sbuffer_cache_populate_fast(GPENCIL_Data *vedata, gpIterPopu gpencil_stroke_cache_populate(nullptr, nullptr, iter->pd->sbuffer_stroke, iter); gpencil_drawcall_flush(iter); - gpencil_vfx_cache_populate( - vedata, iter->ob, iter->tgp_ob, (gpd != nullptr && GPENCIL_ANY_EDIT_MODE(gpd))); + gpencil_vfx_cache_populate(vedata, iter->ob, iter->tgp_ob); /* Restore state. */ iter->do_sbuffer_call = 0; iter->pd->scene_depth_tx = depth_texture; } -static GPENCIL_tObject *grease_pencil_object_cache_populate(GPENCIL_PrivateData *pd, - GPENCIL_TextureList *txl, - Object *ob) -{ - using namespace blender; - using namespace blender::ed::greasepencil; - using namespace blender::bke::greasepencil; - GreasePencil &grease_pencil = *static_cast(ob->data); - const bool is_vertex_mode = (ob->mode & OB_MODE_VERTEX_PAINT) != 0; - const std::optional> bounds = grease_pencil.bounds_min_max_eval(); - - const bool use_stroke_order_3d = (grease_pencil.flag & GREASE_PENCIL_STROKE_ORDER_3D) != 0; - GPENCIL_tObject *tgp_ob = gpencil_object_cache_add(pd, ob, use_stroke_order_3d, bounds); - - int mat_ofs = 0; - GPENCIL_MaterialPool *matpool = gpencil_material_pool_create(pd, ob, &mat_ofs, is_vertex_mode); - - GPUTexture *tex_fill = txl->dummy_texture; - GPUTexture *tex_stroke = txl->dummy_texture; - - GPUBatch *iter_geom = nullptr; - DRWShadingGroup *grp; - int vfirst = 0; - int vcount = 0; - - const auto drawcall_flush = [&]() { -#if !DISABLE_BATCHING - if (iter_geom != nullptr) { - DRW_shgroup_call_range(grp, ob, iter_geom, vfirst, vcount); - } -#endif - iter_geom = nullptr; - vfirst = -1; - vcount = 0; - }; - - const auto drawcall_add = [&](GPUBatch *draw_geom, int v_first, int v_count) { -#if DISABLE_BATCHING - DRW_shgroup_call_range(grp, ob, geom, v_first, v_count); - return; -#endif - int last = vfirst + vcount; - /* Interrupt draw-call grouping if the sequence is not consecutive. */ - if ((draw_geom != iter_geom) || (v_first - last > 0)) { - drawcall_flush(); - } - iter_geom = draw_geom; - if (vfirst == -1) { - vfirst = v_first; - } - vcount = v_first + v_count - vfirst; - }; - - int t_offset = 0; - const Vector drawings = retrieve_visible_drawings(*pd->scene, grease_pencil); - const Span layers = grease_pencil.layers(); - for (const DrawingInfo info : drawings) { - const Layer &layer = *layers[info.layer_index]; - - drawcall_flush(); - - GPENCIL_tLayer *tgp_layer = grease_pencil_layer_cache_add(pd, ob, layer, {}, tgp_ob); - - const bool use_lights = pd->use_lighting && - ((layer.base.flag & GP_LAYER_TREE_NODE_USE_LIGHTS) != 0) && - (ob->dtx & OB_USE_GPENCIL_LIGHTS); - - GPUUniformBuf *lights_ubo = (use_lights) ? pd->global_light_pool->ubo : - pd->shadeless_light_pool->ubo; - - GPUUniformBuf *ubo_mat; - gpencil_material_resources_get(matpool, 0, nullptr, nullptr, &ubo_mat); - - grp = tgp_layer->base_shgrp; - DRW_shgroup_uniform_block(grp, "gp_lights", lights_ubo); - DRW_shgroup_uniform_block(grp, "gp_materials", ubo_mat); - DRW_shgroup_uniform_texture(grp, "gpFillTexture", tex_fill); - DRW_shgroup_uniform_texture(grp, "gpStrokeTexture", tex_stroke); - DRW_shgroup_uniform_int_copy(grp, "gpMaterialOffset", mat_ofs); - /* Since we don't use the sbuffer in GPv3, this is always 0. */ - DRW_shgroup_uniform_float_copy(grp, "gpStrokeIndexOffset", 0.0f); - DRW_shgroup_uniform_vec2_copy(grp, "viewportSize", DRW_viewport_size_get()); - - const bke::CurvesGeometry &curves = info.drawing.strokes(); - const OffsetIndices points_by_curve = curves.points_by_curve(); - const bke::AttributeAccessor attributes = curves.attributes(); - const VArray stroke_materials = *attributes.lookup_or_default( - "material_index", bke::AttrDomain::Curve, 0); - const VArray cyclic = *attributes.lookup_or_default( - "cyclic", bke::AttrDomain::Curve, false); - - IndexMaskMemory memory; - const IndexMask visible_strokes = ed::greasepencil::retrieve_visible_strokes( - *ob, info.drawing, memory); - - visible_strokes.foreach_index([&](const int stroke_i) { - const IndexRange points = points_by_curve[stroke_i]; - const int material_index = stroke_materials[stroke_i]; - MaterialGPencilStyle *gp_style = BKE_object_material_get(ob, material_index + 1)->gp_style; - - const bool hide_material = (gp_style->flag & GP_MATERIAL_HIDE) != 0; - const bool show_stroke = ((gp_style->flag & GP_MATERIAL_STROKE_SHOW) != 0); - const bool show_fill = (points.size() >= 3) && - ((gp_style->flag & GP_MATERIAL_FILL_SHOW) != 0) && - (!pd->simplify_fill); - const bool only_lines = !ELEM(ob->mode, - OB_MODE_PAINT_GREASE_PENCIL, - OB_MODE_WEIGHT_PAINT, - OB_MODE_VERTEX_PAINT) && - info.frame_number != pd->cfra && pd->use_multiedit_lines_only; - /* bool is_onion = gpl && gpf && gpf->runtime.onion_id != 0; */ - const bool is_onion = false; - const bool hide_onion = is_onion && ((gp_style->flag & GP_MATERIAL_HIDE_ONIONSKIN) != 0); - - const int num_stroke_triangles = (points.size() >= 3) ? (points.size() - 2) : 0; - const int num_stroke_vertices = (points.size() + - int(cyclic[stroke_i] && (points.size() >= 3))); - - const bool skip_stroke = hide_material || (!show_stroke && !show_fill) || - (only_lines && !is_onion) || hide_onion; - - if (skip_stroke) { - t_offset += num_stroke_triangles; - t_offset += num_stroke_vertices * 2; - return; - } - - GPUUniformBuf *new_ubo_mat; - GPUTexture *new_tex_fill = nullptr; - GPUTexture *new_tex_stroke = nullptr; - gpencil_material_resources_get( - matpool, mat_ofs + material_index, &new_tex_stroke, &new_tex_fill, &new_ubo_mat); - - bool resource_changed = (ubo_mat != new_ubo_mat) || - (new_tex_fill && (new_tex_fill != tex_fill)) || - (new_tex_stroke && (new_tex_stroke != tex_stroke)); - - if (resource_changed) { - drawcall_flush(); - - grp = DRW_shgroup_create_sub(grp); - if (new_ubo_mat != ubo_mat) { - DRW_shgroup_uniform_block(grp, "gp_materials", new_ubo_mat); - ubo_mat = new_ubo_mat; - } - if (new_tex_fill) { - DRW_shgroup_uniform_texture(grp, "gpFillTexture", new_tex_fill); - tex_fill = new_tex_fill; - } - if (new_tex_stroke) { - DRW_shgroup_uniform_texture(grp, "gpStrokeTexture", new_tex_stroke); - tex_stroke = new_tex_stroke; - } - } - - GPUBatch *geom = draw::DRW_cache_grease_pencil_get(pd->scene, ob); - if (iter_geom != geom) { - drawcall_flush(); - - GPUVertBuf *position_tx = draw::DRW_cache_grease_pencil_position_buffer_get(pd->scene, ob); - GPUVertBuf *color_tx = draw::DRW_cache_grease_pencil_color_buffer_get(pd->scene, ob); - DRW_shgroup_buffer_texture(grp, "gp_pos_tx", position_tx); - DRW_shgroup_buffer_texture(grp, "gp_col_tx", color_tx); - } - - if (show_fill) { - int v_first = t_offset * 3; - int v_count = num_stroke_triangles * 3; - drawcall_add(geom, v_first, v_count); - } - - t_offset += num_stroke_triangles; - - if (show_stroke) { - int v_first = t_offset * 3; - int v_count = num_stroke_vertices * 2 * 3; - drawcall_add(geom, v_first, v_count); - } - - t_offset += num_stroke_vertices * 2; - }); - } - - drawcall_flush(); - - return tgp_ob; -} - void GPENCIL_cache_populate(void *ved, Object *ob) { GPENCIL_Data *vedata = (GPENCIL_Data *)ved; @@ -802,18 +602,16 @@ void GPENCIL_cache_populate(void *ved, Object *ob) } if (ob->data && (ob->type == OB_GPENCIL_LEGACY) && (ob->dt >= OB_SOLID)) { - bGPdata *gpd = (bGPdata *)ob->data; - const std::optional> bounds = BKE_gpencil_data_minmax(gpd).value_or( - blender::Bounds(float3(0))); gpIterPopulateData iter = {nullptr}; iter.ob = ob; iter.pd = pd; - iter.tgp_ob = gpencil_object_cache_add(pd, ob, (gpd->draw_mode == GP_DRAWMODE_3D), bounds); - iter.matpool = gpencil_material_pool_create(pd, ob, &iter.mat_ofs, GPENCIL_VERTEX_MODE(gpd)); + iter.tgp_ob = gpencil_object_cache_add(pd, ob); + iter.matpool = gpencil_material_pool_create(pd, ob, &iter.mat_ofs); iter.tex_fill = txl->dummy_texture; iter.tex_stroke = txl->dummy_texture; /* Special case for rendering onion skin. */ + bGPdata *gpd = (bGPdata *)ob->data; bool do_onion = (!pd->is_render) ? pd->do_onion : (gpd->onion_flag & GP_ONION_GHOST_ALWAYS); gpd->runtime.playing = short(pd->playing); @@ -848,18 +646,12 @@ void GPENCIL_cache_populate(void *ved, Object *ob) gpencil_sbuffer_cache_populate(&iter); } - gpencil_vfx_cache_populate( - vedata, ob, iter.tgp_ob, (gpd != nullptr && GPENCIL_ANY_EDIT_MODE(gpd))); + gpencil_vfx_cache_populate(vedata, ob, iter.tgp_ob); if (pd->do_fast_drawing) { gpencil_sbuffer_cache_populate_fast(vedata, &iter); } } - else if (ob->data && (ob->type == OB_GREASE_PENCIL) && (ob->dt >= OB_SOLID)) { - GPENCIL_tObject *tgp_ob = grease_pencil_object_cache_populate(pd, txl, ob); - gpencil_vfx_cache_populate( - vedata, ob, tgp_ob, ELEM(ob->mode, OB_MODE_EDIT, OB_MODE_SCULPT, OB_MODE_WEIGHT_PAINT)); - } if (ob->type == OB_LAMP && pd->use_lights) { gpencil_light_pool_populate(pd->global_light_pool, ob); @@ -1136,7 +928,7 @@ void GPENCIL_draw_scene(void *ved) /* Fade 3D objects. */ if ((!pd->is_render) && (pd->fade_3d_object_opacity > -1.0f) && (pd->obact != nullptr) && - (ELEM(pd->obact->type, OB_GPENCIL_LEGACY, OB_GREASE_PENCIL))) + (pd->obact->type == OB_GPENCIL_LEGACY)) { float background_color[3]; ED_view3d_background_color_get(pd->scene, pd->v3d, background_color); diff --git a/source/blender/draw/engines/gpencil/gpencil_layer.hh b/source/blender/draw/engines/gpencil/gpencil_layer.hh new file mode 100644 index 00000000000..f9fe3e06e7d --- /dev/null +++ b/source/blender/draw/engines/gpencil/gpencil_layer.hh @@ -0,0 +1,69 @@ +/* SPDX-FileCopyrightText: 2023 Blender Authors + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +/** \file + * \ingroup draw + */ + +#pragma once + +#include "BKE_grease_pencil.hh" +#include "DRW_gpu_wrapper.hh" +#include "DRW_render.hh" + +#include "draw_manager.hh" +#include "draw_pass.hh" + +namespace blender::draw::greasepencil { + +using namespace draw; + +class LayerModule { + private: + /** Contains all Objects in the scene. Indexed by gpObject.layer_offset + layer_id. */ + StorageVectorBuffer layers_buf_ = "gp_layers_buf"; + + public: + void begin_sync() + { + layers_buf_.clear(); + } + + void sync(const Object * /*object*/, + const bke::greasepencil::Layer &layer, + bool &do_layer_blending) + { + /* TODO(fclem): All of this is placeholder. */ + gpLayer gp_layer; + // gp_layer.vertex_color_opacity = 0.0f; unused + gp_layer.thickness_offset = 0.0f; + gp_layer.tint = float4(1.0f, 1.0f, 1.0f, 0.0f); + gp_layer.stroke_index_offset = 0.0f; + + gp_layer.opacity = layer.opacity; + + if (layer.opacity != 1.0f) { + do_layer_blending = true; + } + + layers_buf_.append(gp_layer); + } + + void end_sync() + { + layers_buf_.push_update(); + } + + void bind_resources(PassMain::Sub &sub) + { + sub.bind_ssbo(GPENCIL_LAYER_SLOT, &layers_buf_); + } + + uint object_offset_get() const + { + return layers_buf_.size(); + } +}; + +} // namespace blender::draw::greasepencil diff --git a/source/blender/draw/engines/gpencil/gpencil_light.hh b/source/blender/draw/engines/gpencil/gpencil_light.hh new file mode 100644 index 00000000000..7b4f4cc2308 --- /dev/null +++ b/source/blender/draw/engines/gpencil/gpencil_light.hh @@ -0,0 +1,131 @@ +/* SPDX-FileCopyrightText: 2022 Blender Authors + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +/** \file + * \ingroup draw + */ + +#pragma once + +#include "BKE_gpencil_legacy.h" +#include "BKE_image.h" +#include "DRW_gpu_wrapper.hh" +#include "DRW_render.hh" + +#include "draw_manager.hh" +#include "draw_pass.hh" + +namespace blender::draw::greasepencil { + +using namespace draw; + +class LightModule { + private: + /** Contains all lights in the scene. */ + StorageVectorBuffer lights_buf_ = "gp_lights_buf"; + + float studiolight_intensity_ = 1.0f; + bool use_scene_lights_ = true; + bool use_scene_world_ = true; + + public: + void init(const View3D *v3d) + { + if (v3d != nullptr) { + use_scene_lights_ = V3D_USES_SCENE_LIGHTS(v3d); + use_scene_world_ = V3D_USES_SCENE_WORLD(v3d); + studiolight_intensity_ = v3d->shading.studiolight_intensity; + } + } + + void begin_sync(Depsgraph *depsgraph) + { + lights_buf_.clear(); + + World *world = DEG_get_evaluated_scene(depsgraph)->world; + if (world != nullptr && use_scene_world_) { + ambient_sync(float3(world->horr, world->horg, world->horb)); + } + else { + ambient_sync(float3(studiolight_intensity_)); + } + } + + void sync(ObjectRef &object_ref) + { + if (!use_scene_lights_) { + return; + } + const Object *ob = object_ref.object; + const Light *la = static_cast(ob->data); + + float light_power; + if (la->type == LA_AREA) { + light_power = 1.0f / (4.0f * M_PI); + } + else if (ELEM(la->type, LA_SPOT, LA_LOCAL)) { + light_power = 1.0f / (4.0f * M_PI * M_PI); + } + else { + light_power = 1.0f / M_PI; + } + + gpLight light; + float4x4 &mat = *reinterpret_cast(&light.right); + switch (la->type) { + case LA_SPOT: + light.type = GP_LIGHT_TYPE_SPOT; + light.spot_size = cosf(la->spotsize * 0.5f); + light.spot_blend = (1.0f - light.spot_size) * la->spotblend; + mat = float4x4(ob->world_to_object); + break; + case LA_AREA: + /* Simulate area lights using a spot light. */ + light.type = GP_LIGHT_TYPE_SPOT; + light.spot_size = cosf(M_PI_2); + light.spot_blend = (1.0f - light.spot_size) * 1.0f; + normalize_m4_m4(mat.ptr(), ob->object_to_world); + invert_m4(mat.ptr()); + break; + case LA_SUN: + light.forward = math::normalize(float3(ob->object_to_world[2])); + light.type = GP_LIGHT_TYPE_SUN; + break; + default: + light.type = GP_LIGHT_TYPE_POINT; + break; + } + light.position = float3(object_ref.object->object_to_world[3]); + light.color = float3(la->r, la->g, la->b) * (la->energy * light_power); + + lights_buf_.append(light); + } + + void end_sync() + { + /* Tag light list end. */ + gpLight light; + light.color[0] = -1.0f; + lights_buf_.append(light); + + lights_buf_.push_update(); + } + + void bind_resources(PassMain::Sub &sub) + { + sub.bind_ssbo(GPENCIL_LIGHT_SLOT, &lights_buf_); + } + + private: + void ambient_sync(float3 color) + { + gpLight light; + light.type = GP_LIGHT_TYPE_AMBIENT; + light.color = color; + + lights_buf_.append(light); + } +}; + +} // namespace blender::draw::greasepencil diff --git a/source/blender/draw/engines/gpencil/gpencil_material.hh b/source/blender/draw/engines/gpencil/gpencil_material.hh new file mode 100644 index 00000000000..8b6e4c0336a --- /dev/null +++ b/source/blender/draw/engines/gpencil/gpencil_material.hh @@ -0,0 +1,319 @@ +/* SPDX-FileCopyrightText: 2022 Blender Authors + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +/** \file + * \ingroup draw + */ + +#pragma once + +#include "BKE_gpencil_legacy.h" +#include "BKE_image.h" +#include "DRW_gpu_wrapper.hh" +#include "DRW_render.hh" + +#include "draw_manager.hh" +#include "draw_pass.hh" + +namespace blender::draw::greasepencil { + +using namespace draw; + +class MaterialModule { + private: + /** Contains all materials in the scene. Indexed by gpObject.material_offset + mat_id. */ + StorageVectorBuffer materials_buf_ = "gp_materials_buf"; + /** List of all the texture used. */ + Vector texture_pool_; + + int v3d_color_type_ = -1; + int v3d_lighting_mode_ = V3D_LIGHTING_STUDIO; + float v3d_xray_alpha_ = 1.0f; + float3 v3d_single_color_ = {1.0f, 1.0f, 1.0f}; + + public: + void init(const View3D *v3d) + { + if (v3d != nullptr) { + const bool shading_mode_supports_xray = (v3d->shading.type <= OB_SOLID); + v3d_color_type_ = (v3d->shading.type == OB_SOLID) ? v3d->shading.color_type : -1; + v3d_lighting_mode_ = v3d->shading.light; + v3d_xray_alpha_ = (shading_mode_supports_xray && XRAY_ENABLED(v3d)) ? XRAY_ALPHA(v3d) : 1.0f; + v3d_single_color_ = float3(v3d->shading.single_color); + } + } + + void begin_sync() + { + materials_buf_.clear(); + texture_pool_.clear(); + } + + void sync(const Object *object, const int mat_slot, bool &do_mat_holdout) + { + const MaterialGPencilStyle *gp_style = BKE_gpencil_material_settings((Object *)object, + mat_slot + 1); + + MaterialGPencilStyle gp_style_override; + + gp_style = material_override(object, &gp_style_override, gp_style); + + /* Material with holdout. */ + if (gp_style->flag & GP_MATERIAL_IS_STROKE_HOLDOUT) { + do_mat_holdout = true; + } + if (gp_style->flag & GP_MATERIAL_IS_FILL_HOLDOUT) { + do_mat_holdout = true; + } + + materials_buf_.append(material_sync(gp_style)); + } + + void end_sync() + { + materials_buf_.push_update(); + } + + void bind_resources(PassMain::Sub &sub) + { + sub.bind_ssbo(GPENCIL_MATERIAL_SLOT, &materials_buf_); + } + + uint object_offset_get() const + { + return materials_buf_.size(); + } + + private: + /* Returns the correct flag for this texture. */ + gpMaterialFlag texture_sync(::Image *image, gpMaterialFlag use_flag, gpMaterialFlag premul_flag) + { + ImageUser iuser = {nullptr}; + GPUTexture *gpu_tex = nullptr; + bool premul = false; + + if (image == nullptr) { + texture_pool_.append(nullptr); + return GP_FLAG_NONE; + } + + gpu_tex = BKE_image_get_gpu_texture(image, &iuser); + if (gpu_tex) { + premul = (image->alpha_mode == IMA_ALPHA_PREMUL) != 0; + } + + texture_pool_.append(gpu_tex); + + return gpMaterialFlag(use_flag | (premul ? premul_flag : GP_FLAG_NONE)); + } + + void uv_transform_sync(const float ofs[2], + const float scale[2], + const float rotation, + float r_rot_scale[2][2], + float r_offset[2]) + { + /* OPTI this could use 3x2 matrices and reduce the number of operations drastically. */ + float mat[4][4]; + unit_m4(mat); + /* Offset to center. */ + translate_m4(mat, 0.5f, 0.5f, 0.0f); + /* Reversed order. */ + float3 tmp = {1.0f / scale[0], 1.0f / scale[1], 0.0}; + rescale_m4(mat, tmp); + rotate_m4(mat, 'Z', -rotation); + translate_m4(mat, ofs[0], ofs[1], 0.0f); + /* Convert to 3x2 */ + copy_v2_v2(r_rot_scale[0], mat[0]); + copy_v2_v2(r_rot_scale[1], mat[1]); + copy_v2_v2(r_offset, mat[3]); + } + + /* Amend object fill color in order to avoid completely flat look. */ + void material_shade_color(float color[3]) + { + if (v3d_lighting_mode_ == V3D_LIGHTING_FLAT) { + return; + } + /* This is scene referred color, not gamma corrected and not per perceptual. + * So we lower the threshold a bit. (1.0 / 3.0) */ + if (color[0] + color[1] + color[2] > 1.1) { + add_v3_fl(color, -0.25f); + } + else { + add_v3_fl(color, 0.15f); + } + CLAMP3(color, 0.0f, 1.0f); + } + + const MaterialGPencilStyle *material_override(const Object *object, + MaterialGPencilStyle *gp_style_override, + const MaterialGPencilStyle *gp_style) + { + switch (v3d_color_type_) { + case V3D_SHADING_MATERIAL_COLOR: + case V3D_SHADING_RANDOM_COLOR: + /* Random uses a random color per layer and this is done using the layer tint. + * A simple color by object, like meshes, is not practical in grease pencil. */ + copy_v4_v4(gp_style_override->stroke_rgba, gp_style->stroke_rgba); + copy_v4_v4(gp_style_override->fill_rgba, gp_style->fill_rgba); + gp_style = gp_style_override; + gp_style_override->stroke_style = GP_MATERIAL_STROKE_STYLE_SOLID; + gp_style_override->fill_style = GP_MATERIAL_FILL_STYLE_SOLID; + break; + case V3D_SHADING_TEXTURE_COLOR: + *gp_style_override = blender::dna::shallow_copy(*gp_style); + gp_style = gp_style_override; + if ((gp_style_override->stroke_style == GP_MATERIAL_STROKE_STYLE_TEXTURE) && + (gp_style_override->sima)) + { + copy_v4_fl(gp_style_override->stroke_rgba, 1.0f); + gp_style_override->mix_stroke_factor = 0.0f; + } + + if ((gp_style_override->fill_style == GP_MATERIAL_FILL_STYLE_TEXTURE) && + (gp_style_override->ima)) + { + copy_v4_fl(gp_style_override->fill_rgba, 1.0f); + gp_style_override->mix_factor = 0.0f; + } + else if (gp_style_override->fill_style == GP_MATERIAL_FILL_STYLE_GRADIENT) { + /* gp_style_override->fill_rgba is needed for correct gradient. */ + gp_style_override->mix_factor = 0.0f; + } + break; + case V3D_SHADING_SINGLE_COLOR: + gp_style = gp_style_override; + gp_style_override->stroke_style = GP_MATERIAL_STROKE_STYLE_SOLID; + gp_style_override->fill_style = GP_MATERIAL_FILL_STYLE_SOLID; + copy_v3_v3(gp_style_override->fill_rgba, v3d_single_color_); + gp_style_override->fill_rgba[3] = 1.0f; + copy_v4_v4(gp_style_override->stroke_rgba, gp_style_override->fill_rgba); + material_shade_color(gp_style_override->fill_rgba); + break; + case V3D_SHADING_OBJECT_COLOR: + gp_style = gp_style_override; + gp_style_override->stroke_style = GP_MATERIAL_STROKE_STYLE_SOLID; + gp_style_override->fill_style = GP_MATERIAL_FILL_STYLE_SOLID; + copy_v4_v4(gp_style_override->fill_rgba, object->color); + copy_v4_v4(gp_style_override->stroke_rgba, object->color); + material_shade_color(gp_style_override->fill_rgba); + break; + case V3D_SHADING_VERTEX_COLOR: + gp_style = gp_style_override; + gp_style_override->stroke_style = GP_MATERIAL_STROKE_STYLE_SOLID; + gp_style_override->fill_style = GP_MATERIAL_FILL_STYLE_SOLID; + copy_v4_fl(gp_style_override->fill_rgba, 1.0f); + copy_v4_fl(gp_style_override->stroke_rgba, 1.0f); + break; + default: + break; + } + return gp_style; + } + + gpMaterial material_sync(const MaterialGPencilStyle *gp_style) + { + gpMaterial material; + material.flag = 0; + + /* Dots/Square alignment. */ + if (gp_style->mode != GP_MATERIAL_MODE_LINE) { + switch (gp_style->alignment_mode) { + case GP_MATERIAL_FOLLOW_PATH: + material.flag = GP_STROKE_ALIGNMENT_STROKE; + break; + case GP_MATERIAL_FOLLOW_OBJ: + material.flag = GP_STROKE_ALIGNMENT_OBJECT; + break; + case GP_MATERIAL_FOLLOW_FIXED: + default: + material.flag = GP_STROKE_ALIGNMENT_FIXED; + break; + } + if (gp_style->mode == GP_MATERIAL_MODE_DOT) { + material.flag |= GP_STROKE_DOTS; + } + } + + /* Overlap. */ + if ((gp_style->mode != GP_MATERIAL_MODE_LINE) || + (gp_style->flag & GP_MATERIAL_DISABLE_STENCIL)) + { + material.flag |= GP_STROKE_OVERLAP; + } + + /* Material with holdout. */ + if (gp_style->flag & GP_MATERIAL_IS_STROKE_HOLDOUT) { + material.flag |= GP_STROKE_HOLDOUT; + } + if (gp_style->flag & GP_MATERIAL_IS_FILL_HOLDOUT) { + material.flag |= GP_FILL_HOLDOUT; + } + + /* Dots or Squares rotation. */ + material.alignment_rot[0] = cosf(gp_style->alignment_rotation); + material.alignment_rot[1] = sinf(gp_style->alignment_rotation); + + if (gp_style->flag & GP_MATERIAL_STROKE_SHOW) { + material.flag |= GP_SHOW_STROKE; + } + if (gp_style->flag & GP_MATERIAL_FILL_SHOW) { + material.flag |= GP_SHOW_FILL; + } + + /* Stroke Style */ + if ((gp_style->stroke_style == GP_MATERIAL_STROKE_STYLE_TEXTURE) && (gp_style->sima)) { + material.flag |= texture_sync( + gp_style->sima, GP_STROKE_TEXTURE_USE, GP_STROKE_TEXTURE_PREMUL); + copy_v4_v4(material.stroke_color, gp_style->stroke_rgba); + material.stroke_texture_mix = 1.0f - gp_style->mix_stroke_factor; + material.stroke_u_scale = 500.0f / gp_style->texture_pixsize; + } + else /* if (gp_style->stroke_style == GP_MATERIAL_STROKE_STYLE_SOLID) */ { + texture_sync(nullptr, GP_FLAG_NONE, GP_FLAG_NONE); + material.flag &= ~GP_STROKE_TEXTURE_USE; + copy_v4_v4(material.stroke_color, gp_style->stroke_rgba); + material.stroke_texture_mix = 0.0f; + } + + /* Fill Style */ + if ((gp_style->fill_style == GP_MATERIAL_FILL_STYLE_TEXTURE) && (gp_style->ima)) { + material.flag |= texture_sync(gp_style->ima, GP_FILL_TEXTURE_USE, GP_FILL_TEXTURE_PREMUL); + material.flag |= (gp_style->flag & GP_MATERIAL_TEX_CLAMP) ? GP_FILL_TEXTURE_CLIP : 0; + uv_transform_sync(gp_style->texture_offset, + gp_style->texture_scale, + gp_style->texture_angle, + (float(*)[2]) & material.fill_uv_rot_scale[0], + material.fill_uv_offset); + copy_v4_v4(material.fill_color, gp_style->fill_rgba); + material.fill_texture_mix = 1.0f - gp_style->mix_factor; + } + else if (gp_style->fill_style == GP_MATERIAL_FILL_STYLE_GRADIENT) { + texture_sync(nullptr, GP_FLAG_NONE, GP_FLAG_NONE); + bool use_radial = (gp_style->gradient_type == GP_MATERIAL_GRADIENT_RADIAL); + material.flag |= GP_FILL_GRADIENT_USE; + material.flag |= use_radial ? GP_FILL_GRADIENT_RADIAL : 0; + uv_transform_sync(gp_style->texture_offset, + gp_style->texture_scale, + gp_style->texture_angle, + (float(*)[2]) & material.fill_uv_rot_scale[0], + material.fill_uv_offset); + copy_v4_v4(material.fill_color, gp_style->fill_rgba); + copy_v4_v4(material.fill_mix_color, gp_style->mix_rgba); + material.fill_texture_mix = 1.0f - gp_style->mix_factor; + if (gp_style->flag & GP_MATERIAL_FLIP_FILL) { + swap_v4_v4(material.fill_color, material.fill_mix_color); + } + } + else /* if (gp_style->fill_style == GP_MATERIAL_FILL_STYLE_SOLID) */ { + texture_sync(nullptr, GP_FLAG_NONE, GP_FLAG_NONE); + copy_v4_v4(material.fill_color, gp_style->fill_rgba); + material.fill_texture_mix = 0.0f; + } + return material; + } +}; + +} // namespace blender::draw::greasepencil diff --git a/source/blender/draw/engines/gpencil/gpencil_object.hh b/source/blender/draw/engines/gpencil/gpencil_object.hh new file mode 100644 index 00000000000..dc172957694 --- /dev/null +++ b/source/blender/draw/engines/gpencil/gpencil_object.hh @@ -0,0 +1,324 @@ +/* SPDX-FileCopyrightText: 2022 Blender Authors + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +/** \file + * \ingroup draw + */ + +#pragma once + +#include "BLI_math_quaternion_types.hh" + +#include "BKE_grease_pencil.hh" +#include "BKE_image.h" +#include "DRW_gpu_wrapper.hh" +#include "DRW_render.hh" + +#include "draw_manager.hh" +#include "draw_pass.hh" + +#include "gpencil_layer.hh" +#include "gpencil_material.hh" +#include "gpencil_shader.hh" + +namespace blender::draw::greasepencil { + +using namespace draw; + +class ObjectModule { + private: + LayerModule &layers_; + MaterialModule &materials_; + ShaderModule &shaders_; + + /** Contains all Objects in the scene. Indexed by drw_ResourceID. */ + StorageArrayBuffer objects_buf_ = "gp_objects_buf"; + + /** Contains all gpencil objects in the scene as well as their effect sub-passes. */ + PassSortable main_ps_ = {"gp_main_ps"}; + + /** Contains all composited GPencil layers from one object if is uses VFX. */ + TextureFromPool object_color_tx_ = {"gp_color_object_tx"}; + TextureFromPool object_reveal_tx_ = {"gp_reveal_object_tx"}; + Framebuffer object_fb_ = {"gp_object_fb"}; + bool is_object_fb_needed_ = false; + + /** Contains all strokes from one layer if is uses blending. (also used as target for VFX) */ + TextureFromPool layer_color_tx_ = {"gp_color_layer_tx"}; + TextureFromPool layer_reveal_tx_ = {"gp_reveal_layer_tx"}; + Framebuffer layer_fb_ = {"gp_layer_fb"}; + bool is_layer_fb_needed_ = false; + + bool use_onion_ = true; + bool use_stroke_fill_ = true; + bool use_vfx_ = true; + bool is_render_ = true; + bool is_persp_ = true; + + /** Forward vector used to sort gpencil objects. */ + float3 camera_forward_; + float3 camera_pos_; + + const Scene *scene_ = nullptr; + + /** \note Needs not to be temporary variable since it is dereferenced later. */ + std::array clear_colors_ = {float4(0.0f, 0.0f, 0.0f, 0.0f), + float4(1.0f, 1.0f, 1.0f, 1.0f)}; + + public: + ObjectModule(LayerModule &layers, MaterialModule &materials, ShaderModule &shaders) + : layers_(layers), materials_(materials), shaders_(shaders){}; + + void init(const View3D *v3d, const Scene *scene) + { + const bool is_viewport = (v3d != nullptr); + scene_ = scene; + + if (is_viewport) { + /* TODO(fclem): Avoid access to global DRW. */ + const bContext *evil_C = DRW_context_state_get()->evil_C; + const bool playing = (evil_C != nullptr) ? + ED_screen_animation_playing(CTX_wm_manager(evil_C)) != nullptr : + false; + const bool hide_overlay = ((v3d->flag2 & V3D_HIDE_OVERLAYS) != 0); + const bool show_onion = ((v3d->gp_flag & V3D_GP_SHOW_ONION_SKIN) != 0); + use_onion_ = show_onion && !hide_overlay && !playing; + use_stroke_fill_ = GPENCIL_SIMPLIFY_FILL(scene, playing); + use_vfx_ = GPENCIL_SIMPLIFY_FX(scene, playing); + is_render_ = false; + } + else { + use_stroke_fill_ = GPENCIL_SIMPLIFY_FILL(scene, false); + use_vfx_ = GPENCIL_SIMPLIFY_FX(scene, false); + } + } + + void begin_sync(Depsgraph * /*depsgraph*/, const View &main_view) + { + camera_forward_ = main_view.forward(); + camera_pos_ = main_view.location(); + + is_object_fb_needed_ = false; + is_layer_fb_needed_ = false; + + is_persp_ = main_view.is_persp(); + /* TODO(fclem): Shrink buffer. */ + // objects_buf_.shrink(); + } + + void sync_grease_pencil(Manager &manager, + ObjectRef &object_ref, + Framebuffer &main_fb, + Framebuffer &scene_fb, + TextureFromPool &depth_tx, + PassSortable &main_ps) + { + using namespace blender::bke::greasepencil; + + Object *object = object_ref.object; + const GreasePencil &grease_pencil = *static_cast(object->data); + + if (grease_pencil.drawings().is_empty()) { + return; + } + + const bool is_stroke_order_3d = false; /* TODO */ + bool do_material_holdout = false; + bool do_layer_blending = false; + bool object_has_vfx = false; /* TODO: `vfx.object_has_vfx(gpd);`. */ + + uint material_offset = materials_.object_offset_get(); + for (const int i : IndexRange(BKE_object_material_count_eval(object))) { + materials_.sync(object, i, do_material_holdout); + } + + uint layer_offset = layers_.object_offset_get(); + for (const Layer *layer : grease_pencil.layers()) { + layers_.sync(object, *layer, do_layer_blending); + } + + /* Order rendering using camera Z distance. */ + float3 position = float3(object->object_to_world[3]); + float camera_z = math::dot(position, camera_forward_); + + PassMain::Sub &object_subpass = main_ps.sub("GPObject", camera_z); + object_subpass.framebuffer_set((object_has_vfx) ? &object_fb_ : &main_fb); + object_subpass.clear_depth(is_stroke_order_3d ? 1.0f : 0.0f); + if (object_has_vfx) { + object_subpass.clear_multi(clear_colors_); + } + + DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | DRW_STATE_BLEND_ALPHA_PREMUL; + /* For 2D mode, we render all strokes with uniform depth (increasing with stroke id). */ + state |= (is_stroke_order_3d) ? DRW_STATE_DEPTH_LESS_EQUAL : DRW_STATE_DEPTH_GREATER; + /* Always write stencil. Only used as optimization for blending. */ + state |= DRW_STATE_WRITE_STENCIL | DRW_STATE_STENCIL_ALWAYS; + + object_subpass.state_set(state); + object_subpass.shader_set(shaders_.static_shader_get(GREASE_PENCIL)); + + GPUVertBuf *position_tx = DRW_cache_grease_pencil_position_buffer_get(scene_, object); + GPUVertBuf *color_tx = DRW_cache_grease_pencil_color_buffer_get(scene_, object); + GPUBatch *geom = DRW_cache_grease_pencil_get(scene_, object); + + /* TODO(fclem): Pass per frame object matrix here. */ + ResourceHandle handle = manager.resource_handle(object_ref); + gpObject &ob = objects_buf_.get_or_resize(handle.resource_index()); + ob.is_shadeless = false; + ob.stroke_order3d = false; + ob.tint = float4(1.0); // frame_tint_get(gpd, frame.gpf, current_frame_); + ob.layer_offset = layer_offset; + ob.material_offset = material_offset; + + if (do_layer_blending) { + /* TODO: Do layer blending. */ + // for (const LayerData &layer : frame.layers) { + // UNUSED_VARS(layer); + // if (has_blending(layer)) { + // object_subpass.framebuffer_set(*vfx_fb.current()); + // } + + /* TODO(fclem): Only draw subrange of geometry for this layer. */ + object_subpass.bind_texture("gp_pos_tx", position_tx); + object_subpass.bind_texture("gp_col_tx", color_tx); + object_subpass.draw(geom, handle); + + /* TODO: Do layer blending. */ + // if (has_blending(layer)) { + // layer_blend_sync(object_ref, object_subpass); + // } + // } + } + else { + /* Fast path. */ + object_subpass.bind_texture("gp_pos_tx", position_tx); + object_subpass.bind_texture("gp_col_tx", color_tx); + object_subpass.draw(geom, handle); + } + + /** Merging the object depth buffer into the scene depth buffer. */ + float4x4 plane_mat = get_object_plane_mat(*object); + ResourceHandle handle_plane_mat = manager.resource_handle(plane_mat); + object_subpass.framebuffer_set(&scene_fb); + object_subpass.state_set(DRW_STATE_DEPTH_LESS | DRW_STATE_WRITE_DEPTH); + object_subpass.shader_set(shaders_.static_shader_get(DEPTH_MERGE)); + object_subpass.bind_texture("depthBuf", (object_has_vfx) ? nullptr : &depth_tx); + object_subpass.draw(DRW_cache_quad_get(), handle_plane_mat); + + /* TODO: Do object VFX. */ +#if 0 + if (object_has_vfx) { + VfxContext vfx_ctx(object_subpass, + layer_fb_, + object_fb_, + object_color_tx_, + layer_color_tx_, + object_reveal_tx_, + layer_reveal_tx_, + is_render_); + + /* \note Update this boolean as the actual number of vfx drawn might differ. */ + object_has_vfx = vfx.object_sync(main_fb_, object_ref, vfx_ctx, do_material_holdout); + + if (object_has_vfx || do_layer_blending) { + is_layer_fb_needed_ = true; + } + } +#endif + } + + void end_sync() + { + objects_buf_.push_update(); + } + + void bind_resources(PassMain::Sub &sub) + { + sub.bind_ssbo(GPENCIL_OBJECT_SLOT, &objects_buf_); + } + + void acquire_temporary_buffers(int2 render_size, eGPUTextureFormat format) + { + object_color_tx_.acquire(render_size, format); + object_reveal_tx_.acquire(render_size, format); + object_fb_.ensure(GPU_ATTACHMENT_NONE, + GPU_ATTACHMENT_TEXTURE(object_color_tx_), + GPU_ATTACHMENT_TEXTURE(object_reveal_tx_)); + if (is_layer_fb_needed_) { + layer_color_tx_.acquire(render_size, format); + layer_reveal_tx_.acquire(render_size, format); + layer_fb_.ensure(GPU_ATTACHMENT_NONE, + GPU_ATTACHMENT_TEXTURE(layer_color_tx_), + GPU_ATTACHMENT_TEXTURE(layer_reveal_tx_)); + } + } + + void release_temporary_buffers() + { + object_color_tx_.release(); + object_reveal_tx_.release(); + + layer_color_tx_.release(); + layer_reveal_tx_.release(); + } + + bool scene_has_visible_gpencil_object() const + { + return objects_buf_.size() > 0; + } + + /** + * Define a matrix that will be used to render a triangle to merge the depth of the rendered + * gpencil object with the rest of the scene. + */ + float4x4 get_object_plane_mat(const Object &object) + { + using namespace math; + /* Find the normal most likely to represent the gpObject. */ + /* TODO: This does not work quite well if you use + * strokes not aligned with the object axes. Maybe we could try to + * compute the minimum axis of all strokes. But this would be more + * computationally heavy and should go into the GPData evaluation. */ + BLI_assert(object.type == OB_GREASE_PENCIL); + const GreasePencil &grease_pencil = *static_cast(object.data); + const std::optional> bounds = grease_pencil.bounds_min_max_eval(); + if (!bounds) { + return float4x4::identity(); + } + + /* Convert bbox to matrix */ + const float3 size = float3(bounds->max - bounds->min) + 1e-8f; + const float3 center = midpoint(bounds->min, bounds->max); + + /* BBox space to World. */ + const float4x4 object_to_world = float4x4(object.object_to_world); + float4x4 bbox_mat = object_to_world * + from_loc_rot_scale(center, Quaternion::identity(), size); + float3 plane_normal; + if (is_persp_) { + /* BBox center to camera vector. */ + plane_normal = camera_pos_ - bbox_mat.location(); + } + else { + plane_normal = camera_forward_; + } + /* World to BBox space. */ + float4x4 bbox_mat_inv = invert(bbox_mat); + /* mat_inv_t is a "normal" matrix which will transform + * BBox normal space to world space. */ + float4x4 bbox_mat_inv_t = transpose(bbox_mat_inv); + + /* Normalize the vector in BBox space. */ + plane_normal = normalize(transform_direction(bbox_mat_inv, plane_normal)); + plane_normal = normalize(transform_direction(bbox_mat_inv_t, plane_normal)); + + float4x4 plane_mat = from_up_axis(plane_normal); + float radius = length(transform_direction(object_to_world, size)); + plane_mat = scale(plane_mat, float3(radius)); + plane_mat.location() = transform_point(object_to_world, center); + return plane_mat; + } +}; + +} // namespace blender::draw::greasepencil diff --git a/source/blender/draw/engines/gpencil/gpencil_render.cc b/source/blender/draw/engines/gpencil/gpencil_render.cc index 1d59557c47d..faf3cb3f681 100644 --- a/source/blender/draw/engines/gpencil/gpencil_render.cc +++ b/source/blender/draw/engines/gpencil/gpencil_render.cc @@ -146,7 +146,7 @@ static void GPENCIL_render_cache(void *vedata, RenderEngine * /*engine*/, Depsgraph * /*depsgraph*/) { - if (ob && ELEM(ob->type, OB_GPENCIL_LEGACY, OB_GREASE_PENCIL, OB_LAMP)) { + if (ob && ELEM(ob->type, OB_GPENCIL_LEGACY, OB_LAMP)) { if (DRW_object_visibility_in_active_context(ob) & OB_VISIBLE_SELF) { GPENCIL_cache_populate(vedata, ob); } diff --git a/source/blender/draw/engines/gpencil/gpencil_shader.cc b/source/blender/draw/engines/gpencil/gpencil_shader.cc new file mode 100644 index 00000000000..c8e9724489d --- /dev/null +++ b/source/blender/draw/engines/gpencil/gpencil_shader.cc @@ -0,0 +1,119 @@ +/* SPDX-FileCopyrightText: 2023 Blender Authors + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +/** \file + * \ingroup draw + */ + +#include "gpencil_shader.hh" + +#include + +namespace blender::draw::greasepencil { + +ShaderModule *ShaderModule::g_shader_module = nullptr; + +ShaderModule *ShaderModule::module_get() +{ + if (g_shader_module == nullptr) { + /* TODO(@fclem) thread-safety. */ + g_shader_module = new ShaderModule(); + } + return g_shader_module; +} + +void ShaderModule::module_free() +{ + if (g_shader_module != nullptr) { + /* TODO(@fclem) thread-safety. */ + delete g_shader_module; + g_shader_module = nullptr; + } +} + +ShaderModule::ShaderModule() +{ + for (GPUShader *&shader : shaders_) { + shader = nullptr; + } + +#ifndef NDEBUG + /* Ensure all shader are described. */ + for (auto i : IndexRange(MAX_SHADER_TYPE)) { + const char *name = static_shader_create_info_name_get(eShaderType(i)); + if (name == nullptr) { + std::cerr << "GPencil: Missing case for eShaderType(" << i + << ") in static_shader_create_info_name_get()." << std::endl; + BLI_assert(0); + } + const GPUShaderCreateInfo *create_info = GPU_shader_create_info_get(name); + BLI_assert_msg(create_info != nullptr, "GPencil: Missing create info for static shader."); + } +#endif +} + +ShaderModule::~ShaderModule() +{ + for (GPUShader *&shader : shaders_) { + DRW_SHADER_FREE_SAFE(shader); + } +} + +const char *ShaderModule::static_shader_create_info_name_get(eShaderType shader_type) +{ + switch (shader_type) { + case ANTIALIASING_EDGE_DETECT: + return "gpencil_antialiasing_stage_0"; + case ANTIALIASING_BLEND_WEIGHT: + return "gpencil_antialiasing_stage_1"; + case ANTIALIASING_RESOLVE: + return "gpencil_antialiasing_stage_2"; + case GREASE_PENCIL: + return "gpencil_geometry_next"; + case LAYER_BLEND: + return "gpencil_layer_blend"; + case DEPTH_MERGE: + return "grease_pencil_depth_merge"; + case MASK_INVERT: + return "gpencil_mask_invert"; + case FX_COMPOSITE: + return "gpencil_fx_composite"; + case FX_COLORIZE: + return "gpencil_fx_colorize"; + case FX_BLUR: + return "gpencil_fx_blur"; + case FX_GLOW: + return "gpencil_fx_glow"; + case FX_PIXEL: + return "gpencil_fx_pixelize"; + case FX_RIM: + return "gpencil_fx_rim"; + case FX_SHADOW: + return "gpencil_fx_shadow"; + case FX_TRANSFORM: + return "gpencil_fx_transform"; + /* To avoid compiler warning about missing case. */ + case MAX_SHADER_TYPE: + return ""; + } + return ""; +} + +GPUShader *ShaderModule::static_shader_get(eShaderType shader_type) +{ + if (shaders_[shader_type] == nullptr) { + const char *shader_name = static_shader_create_info_name_get(shader_type); + + shaders_[shader_type] = GPU_shader_create_from_info_name(shader_name); + + if (shaders_[shader_type] == nullptr) { + std::cerr << "GPencil: error: Could not compile static shader \"" << shader_name << "\"" + << std::endl; + } + BLI_assert(shaders_[shader_type] != nullptr); + } + return shaders_[shader_type]; +} + +} // namespace blender::draw::greasepencil diff --git a/source/blender/draw/engines/gpencil/gpencil_shader.hh b/source/blender/draw/engines/gpencil/gpencil_shader.hh new file mode 100644 index 00000000000..23fc2f12619 --- /dev/null +++ b/source/blender/draw/engines/gpencil/gpencil_shader.hh @@ -0,0 +1,66 @@ +/* SPDX-FileCopyrightText: 2023 Blender Authors + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +/** \file + * \ingroup draw + */ + +#pragma once + +#include "DRW_render.hh" + +namespace blender::draw::greasepencil { + +enum eShaderType { + /* SMAA anti-aliasing. */ + ANTIALIASING_EDGE_DETECT = 0, + ANTIALIASING_BLEND_WEIGHT, + ANTIALIASING_RESOLVE, + /* GPencil Object rendering */ + GREASE_PENCIL, + /* All layer blend types in one shader! */ + LAYER_BLEND, + /* Merge the final object depth to the depth buffer. */ + DEPTH_MERGE, + /* Invert the content of the mask buffer. */ + MASK_INVERT, + /* Final Compositing over rendered background. */ + FX_COMPOSITE, + /* Effects. */ + FX_COLORIZE, + FX_BLUR, + FX_GLOW, + FX_PIXEL, + FX_RIM, + FX_SHADOW, + FX_TRANSFORM, + + MAX_SHADER_TYPE, +}; + +/** + * Shader module. shared between instances. + */ +class ShaderModule { + private: + std::array shaders_; + + /** Shared shader module across all engine instances. */ + static ShaderModule *g_shader_module; + + public: + ShaderModule(); + ~ShaderModule(); + + GPUShader *static_shader_get(eShaderType shader_type); + + /** Only to be used by Instance constructor. */ + static ShaderModule *module_get(); + static void module_free(); + + private: + const char *static_shader_create_info_name_get(eShaderType shader_type); +}; + +} // namespace blender::draw::greasepencil diff --git a/source/blender/draw/engines/gpencil/gpencil_shader_fx.cc b/source/blender/draw/engines/gpencil/gpencil_shader_fx.cc index 850e039ab61..8de719e3517 100644 --- a/source/blender/draw/engines/gpencil/gpencil_shader_fx.cc +++ b/source/blender/draw/engines/gpencil/gpencil_shader_fx.cc @@ -22,12 +22,17 @@ #include "gpencil_engine.h" /* verify if this fx is active */ -static bool effect_is_active(ShaderFxData *fx, bool is_edit, bool is_viewport) +static bool effect_is_active(bGPdata *gpd, ShaderFxData *fx, bool is_viewport) { if (fx == nullptr) { return false; } + if (gpd == nullptr) { + return false; + } + + bool is_edit = GPENCIL_ANY_EDIT_MODE(gpd); if (((fx->mode & eShaderFxMode_Editmode) == 0) && (is_edit) && (is_viewport)) { return false; } @@ -95,7 +100,7 @@ static void gpencil_vfx_blur(BlurShaderFxData *fx, Object *ob, gpIterVfxData *it float winmat[4][4], persmat[4][4]; float blur_size[2] = {fx->radius[0], fx->radius[1]}; DRW_view_persmat_get(nullptr, persmat, false); - const float w = fabsf(mul_project_m4_v3_zfac(persmat, ob->object_to_world().location())); + const float w = fabsf(mul_project_m4_v3_zfac(persmat, ob->object_to_world[3])); if (fx->flag & FX_BLUR_DOF_MODE) { /* Compute circle of confusion size. */ @@ -107,7 +112,7 @@ static void gpencil_vfx_blur(BlurShaderFxData *fx, Object *ob, gpIterVfxData *it DRW_view_winmat_get(nullptr, winmat, false); const float *vp_size = DRW_viewport_size_get(); float world_pixel_scale = 1.0f / GPENCIL_PIXEL_FACTOR; - float scale = mat4_to_scale(ob->object_to_world().ptr()); + float scale = mat4_to_scale(ob->object_to_world); float distance_factor = world_pixel_scale * scale * winmat[1][1] * vp_size[1] / w; mul_v2_fl(blur_size, distance_factor); } @@ -176,11 +181,11 @@ static void gpencil_vfx_rim(RimShaderFxData *fx, Object *ob, gpIterVfxData *iter const float *vp_size = DRW_viewport_size_get(); const float *vp_size_inv = DRW_viewport_invert_size_get(); - const float w = fabsf(mul_project_m4_v3_zfac(persmat, ob->object_to_world().location())); + const float w = fabsf(mul_project_m4_v3_zfac(persmat, ob->object_to_world[3])); /* Modify by distance to camera and object scale. */ float world_pixel_scale = 1.0f / GPENCIL_PIXEL_FACTOR; - float scale = mat4_to_scale(ob->object_to_world().ptr()); + float scale = mat4_to_scale(ob->object_to_world); float distance_factor = (world_pixel_scale * scale * winmat[1][1] * vp_size[1]) / w; mul_v2_fl(offset, distance_factor); mul_v2_v2(offset, vp_size_inv); @@ -251,8 +256,8 @@ static void gpencil_vfx_pixelize(PixelShaderFxData *fx, Object *ob, gpIterVfxDat mul_v2_v2(pixel_size, vp_size_inv); /* Fixed pixelisation center from object center. */ - const float w = fabsf(mul_project_m4_v3_zfac(persmat, ob->object_to_world().location())); - mul_v3_m4v3(ob_center, persmat, ob->object_to_world().location()); + const float w = fabsf(mul_project_m4_v3_zfac(persmat, ob->object_to_world[3])); + mul_v3_m4v3(ob_center, persmat, ob->object_to_world[3]); mul_v3_fl(ob_center, 1.0f / w); const bool use_antialiasing = ((fx->flag & FX_PIXEL_FILTER_NEAREST) == 0); @@ -263,7 +268,7 @@ static void gpencil_vfx_pixelize(PixelShaderFxData *fx, Object *ob, gpIterVfxDat /* Modify by distance to camera and object scale. */ float world_pixel_scale = 1.0f / GPENCIL_PIXEL_FACTOR; - float scale = mat4_to_scale(ob->object_to_world().ptr()); + float scale = mat4_to_scale(ob->object_to_world); mul_v2_fl(pixel_size, (world_pixel_scale * scale * winmat[1][1] * vp_size[1]) / w); /* Center to texel */ @@ -319,8 +324,8 @@ static void gpencil_vfx_shadow(ShadowShaderFxData *fx, Object *ob, gpIterVfxData const float ratio = vp_size_inv[1] / vp_size_inv[0]; copy_v3_v3(rot_center, - (use_obj_pivot && fx->object) ? fx->object->object_to_world().location() : - ob->object_to_world().location()); + (use_obj_pivot && fx->object) ? fx->object->object_to_world[3] : + ob->object_to_world[3]); const float w = fabsf(mul_project_m4_v3_zfac(persmat, rot_center)); mul_v3_m4v3(rot_center, persmat, rot_center); @@ -328,7 +333,7 @@ static void gpencil_vfx_shadow(ShadowShaderFxData *fx, Object *ob, gpIterVfxData /* Modify by distance to camera and object scale. */ float world_pixel_scale = 1.0f / GPENCIL_PIXEL_FACTOR; - float scale = mat4_to_scale(ob->object_to_world().ptr()); + float scale = mat4_to_scale(ob->object_to_world); float distance_factor = (world_pixel_scale * scale * winmat[1][1] * vp_size[1]) / w; mul_v2_fl(offset, distance_factor); mul_v2_v2(offset, vp_size_inv); @@ -496,13 +501,13 @@ static void gpencil_vfx_wave(WaveShaderFxData *fx, Object *ob, gpIterVfxData *it const float *vp_size = DRW_viewport_size_get(); const float *vp_size_inv = DRW_viewport_invert_size_get(); - const float w = fabsf(mul_project_m4_v3_zfac(persmat, ob->object_to_world().location())); - mul_v3_m4v3(wave_center, persmat, ob->object_to_world().location()); + const float w = fabsf(mul_project_m4_v3_zfac(persmat, ob->object_to_world[3])); + mul_v3_m4v3(wave_center, persmat, ob->object_to_world[3]); mul_v3_fl(wave_center, 1.0f / w); /* Modify by distance to camera and object scale. */ float world_pixel_scale = 1.0f / GPENCIL_PIXEL_FACTOR; - float scale = mat4_to_scale(ob->object_to_world().ptr()); + float scale = mat4_to_scale(ob->object_to_world); float distance_factor = (world_pixel_scale * scale * winmat[1][1] * vp_size[1]) / w; wave_center[0] = wave_center[0] * 0.5f + 0.5f; @@ -553,7 +558,7 @@ static void gpencil_vfx_swirl(SwirlShaderFxData *fx, Object * /*ob*/, gpIterVfxD DRW_view_persmat_get(nullptr, persmat, false); const float *vp_size = DRW_viewport_size_get(); - copy_v3_v3(swirl_center, fx->object->object_to_world().location()); + copy_v3_v3(swirl_center, fx->object->object_to_world[3]); const float w = fabsf(mul_project_m4_v3_zfac(persmat, swirl_center)); mul_v3_m4v3(swirl_center, persmat, swirl_center); @@ -561,7 +566,7 @@ static void gpencil_vfx_swirl(SwirlShaderFxData *fx, Object * /*ob*/, gpIterVfxD /* Modify by distance to camera and object scale. */ float world_pixel_scale = 1.0f / GPENCIL_PIXEL_FACTOR; - float scale = mat4_to_scale(fx->object->object_to_world().ptr()); + float scale = mat4_to_scale(fx->object->object_to_world); float distance_factor = (world_pixel_scale * scale * winmat[1][1] * vp_size[1]) / w; mul_v2_fl(swirl_center, 0.5f); @@ -585,11 +590,9 @@ static void gpencil_vfx_swirl(SwirlShaderFxData *fx, Object * /*ob*/, gpIterVfxD DRW_shgroup_call_procedural_triangles(grp, nullptr, 1); } -void gpencil_vfx_cache_populate(GPENCIL_Data *vedata, - Object *ob, - GPENCIL_tObject *tgp_ob, - const bool is_edit_mode) +void gpencil_vfx_cache_populate(GPENCIL_Data *vedata, Object *ob, GPENCIL_tObject *tgp_ob) { + bGPdata *gpd = (bGPdata *)ob->data; GPENCIL_FramebufferList *fbl = vedata->fbl; GPENCIL_PrivateData *pd = vedata->stl->pd; @@ -607,7 +610,7 @@ void gpencil_vfx_cache_populate(GPENCIL_Data *vedata, /* If simplify enabled, nothing more to do. */ if (!pd->simplify_fx) { LISTBASE_FOREACH (ShaderFxData *, fx, &ob->shader_fx) { - if (effect_is_active(fx, is_edit_mode, pd->is_viewport)) { + if (effect_is_active(gpd, fx, pd->is_viewport)) { switch (fx->type) { case eShaderFxType_Blur: gpencil_vfx_blur((BlurShaderFxData *)fx, ob, &iter); diff --git a/source/blender/draw/engines/gpencil/gpencil_shader_shared.h b/source/blender/draw/engines/gpencil/gpencil_shader_shared.h index 36c5b432410..e1a6f93a629 100644 --- a/source/blender/draw/engines/gpencil/gpencil_shader_shared.h +++ b/source/blender/draw/engines/gpencil/gpencil_shader_shared.h @@ -8,8 +8,11 @@ # include "GPU_shader_shared_utils.h" # ifndef __cplusplus +typedef struct gpScene gpScene; typedef struct gpMaterial gpMaterial; typedef struct gpLight gpLight; +typedef struct gpObject gpObject; +typedef struct gpLayer gpLayer; typedef enum gpMaterialFlag gpMaterialFlag; # ifdef GP_LIGHT typedef enum gpLightType gpLightType; @@ -35,6 +38,8 @@ enum gpMaterialFlag { GP_FILL_TEXTURE_CLIP = (1u << 12u), GP_FILL_GRADIENT_USE = (1u << 13u), GP_FILL_GRADIENT_RADIAL = (1u << 14u), + GP_SHOW_STROKE = (1u << 15u), + GP_SHOW_FILL = (1u << 16u), GP_FILL_FLAGS = (GP_FILL_TEXTURE_USE | GP_FILL_TEXTURE_PREMUL | GP_FILL_TEXTURE_CLIP | GP_FILL_GRADIENT_USE | GP_FILL_GRADIENT_RADIAL | GP_FILL_HOLDOUT), }; @@ -55,6 +60,12 @@ enum gpLightType { # define gpLightType uint #endif +struct gpScene { + float2 render_size; + float2 _pad0; +}; +BLI_STATIC_ASSERT_ALIGN(gpScene, 16) + struct gpMaterial { float4 stroke_color; float4 fill_color; @@ -121,6 +132,38 @@ struct gpLight { BLI_STATIC_ASSERT_ALIGN(gpLight, 16) #endif +struct gpObject { + /** Weather or not to apply lighting to the GPencil object. */ + bool1 is_shadeless; + /** Switch between 2d and 3D stroke order. */ + bool1 stroke_order3d; + /** Offset inside the layer buffer to the first layer data of this object. */ + uint layer_offset; + /** Offset inside the material buffer to the first material data of this object. */ + uint material_offset; + /** Color to multiply to the final mixed color. */ + float4 tint; + /** Color to multiply to the final mixed color. */ + float3 normal; + + float _pad0; +}; +BLI_STATIC_ASSERT_ALIGN(gpObject, 16) + +struct gpLayer { + /** Amount of vertex color to blend with actual material color. */ + float vertex_color_opacity; + /** Thickness change of all the strokes. */ + float thickness_offset; + /** Thickness change of all the strokes. */ + float opacity; + /** Offset to apply to stroke index to be able to insert a currently drawn stroke in between. */ + float stroke_index_offset; + /** Color to multiply to the final mixed color. */ + float4 tint; +}; +BLI_STATIC_ASSERT_ALIGN(gpLayer, 16) + #ifndef GPU_SHADER # undef gpMaterialFlag # undef gpLightType diff --git a/source/blender/draw/engines/gpencil/gpencil_vfx.hh b/source/blender/draw/engines/gpencil/gpencil_vfx.hh new file mode 100644 index 00000000000..2b22173f974 --- /dev/null +++ b/source/blender/draw/engines/gpencil/gpencil_vfx.hh @@ -0,0 +1,336 @@ +/* SPDX-FileCopyrightText: 2017 Blender Authors + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +/** \file + * \ingroup draw + */ +#include "BKE_camera.h" +#include "BLI_listbase_wrapper.hh" +#include "DNA_camera_types.h" +#include "DNA_gpencil_legacy_types.h" +#include "DNA_shader_fx_types.h" + +#include "draw_manager.hh" +#include "draw_pass.hh" + +#include "gpencil_engine.h" +#include "gpencil_shader.hh" +#include "gpencil_shader_shared.h" + +namespace blender::draw::greasepencil { + +using namespace draw; + +struct VfxContext { + PassMain::Sub *object_subpass; + SwapChain vfx_fb; + SwapChain color_tx; + SwapChain reveal_tx; + bool is_viewport; + + VfxContext(PassMain::Sub &object_subpass_, + Framebuffer &layer_fb, + Framebuffer &object_fb, + TextureFromPool &object_color_tx, + TextureFromPool &layer_color_tx, + TextureFromPool &object_reveal_tx, + TextureFromPool &layer_reveal_tx, + bool is_render_) + { + object_subpass = &object_subpass_; + /* These may not be allocated yet, use address of future pointer. */ + vfx_fb.current() = &layer_fb; + vfx_fb.next() = &object_fb; + + color_tx.current() = &object_color_tx; + color_tx.next() = &layer_color_tx; + reveal_tx.current() = &object_reveal_tx; + reveal_tx.next() = &layer_reveal_tx; + + is_viewport = (is_render_ == false); + } + + PassMain::Sub &create_vfx_pass(const char *name, GPUShader *shader) + { + PassMain::Sub &sub = object_subpass->sub(name); + sub.framebuffer_set(vfx_fb.current()); + sub.shader_set(shader); + sub.bind_texture("colorBuf", color_tx.current()); + sub.bind_texture("revealBuf", reveal_tx.current()); + + vfx_fb.swap(); + color_tx.swap(); + reveal_tx.swap(); + + return sub; + } + + /* Verify if the given fx is active. */ + bool effect_is_active(const bGPdata *gpd, const ShaderFxData *fx) + { + if (fx == NULL) { + return false; + } + + if (gpd == NULL) { + return false; + } + + bool is_edit = GPENCIL_ANY_EDIT_MODE(gpd); + if (((fx->mode & eShaderFxMode_Editmode) == 0) && (is_edit) && (is_viewport)) { + return false; + } + + if (((fx->mode & eShaderFxMode_Realtime) && (is_viewport == true)) || + ((fx->mode & eShaderFxMode_Render) && (is_viewport == false))) + { + return true; + } + + return false; + } +}; + +class VfxModule { + private: + ShaderModule &shaders; + /* Global switch for all vfx. */ + bool vfx_enabled_ = false; + /* Global switch for all Depth Of Field blur. */ + bool dof_enabled_ = false; + /* Pseudo depth of field parameter. Used to scale blur radius. */ + float dof_parameters_[2]; + + public: + VfxModule(ShaderModule &shaders_) : shaders(shaders_){}; + + void init(bool enable, const Object *camera_object, const RegionView3D *rv3d) + { + vfx_enabled_ = enable; + + const Camera *camera = (camera_object != nullptr) ? + static_cast(camera_object->data) : + nullptr; + + /* Pseudo DOF setup. */ + if (camera && (camera->dof.flag & CAM_DOF_ENABLED)) { + const float *vp_size = DRW_viewport_size_get(); + float fstop = camera->dof.aperture_fstop; + float sensor = BKE_camera_sensor_size( + camera->sensor_fit, camera->sensor_x, camera->sensor_y); + float focus_dist = BKE_camera_object_dof_distance(camera_object); + float focal_len = camera->lens; + + const float scale_camera = 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; + float sensor_scaled = scale_camera * sensor; + + if (rv3d != nullptr) { + sensor_scaled *= rv3d->viewcamtexcofac[0]; + } + + dof_parameters_[1] = aperture * fabsf(focal_len_scaled / (focus_dist - focal_len_scaled)); + dof_parameters_[1] *= vp_size[0] / sensor_scaled; + dof_parameters_[0] = -focus_dist * dof_parameters_[1]; + } + else { + /* Disable DoF blur scaling. Produce Circle of Confusion of 0 pixel. */ + dof_parameters_[0] = dof_parameters_[1] = 0.0f; + } + } + + /* Return true if any vfx is needed */ + bool object_sync(Framebuffer &main_fb, + ObjectRef &object_ref, + VfxContext &vfx_ctx, + bool do_material_holdout) + { + Object *object = object_ref.object; + bGPdata *gpd = (bGPdata *)object->data; + + int vfx_count = 0; + + if (vfx_enabled_) { + for (const ShaderFxData *fx : ListBaseWrapper(&object->shader_fx)) { + if (!vfx_ctx.effect_is_active(gpd, fx)) { + continue; + } + switch (fx->type) { + case eShaderFxType_Blur: + vfx_count += vfx_blur(*(const BlurShaderFxData *)fx, object, vfx_ctx); + break; + case eShaderFxType_Colorize: + vfx_count += vfx_colorize(*(const ColorizeShaderFxData *)fx, object, vfx_ctx); + break; + case eShaderFxType_Flip: + vfx_count += vfx_flip(*(const FlipShaderFxData *)fx, object, vfx_ctx); + break; + case eShaderFxType_Pixel: + vfx_count += vfx_pixelize(*(const PixelShaderFxData *)fx, object, vfx_ctx); + break; + case eShaderFxType_Rim: + vfx_count += vfx_rim(*(const RimShaderFxData *)fx, object, vfx_ctx); + break; + case eShaderFxType_Shadow: + vfx_count += vfx_shadow(*(const ShadowShaderFxData *)fx, object, vfx_ctx); + break; + case eShaderFxType_Glow: + vfx_count += vfx_glow(*(const GlowShaderFxData *)fx, object, vfx_ctx); + break; + case eShaderFxType_Swirl: + vfx_count += vfx_swirl(*(const SwirlShaderFxData *)fx, object, vfx_ctx); + break; + case eShaderFxType_Wave: + vfx_count += vfx_wave(*(const WaveShaderFxData *)fx, object, vfx_ctx); + break; + default: + break; + } + } + } + + if (do_material_holdout) { + vfx_count += 1; + } + + if (vfx_count > 0) { + /* We need an extra pass to combine result to main buffer. */ + merge_sync(main_fb, vfx_ctx); + } + + return vfx_count > 0; + } + + private: + int vfx_blur(const BlurShaderFxData &fx, const Object *object, VfxContext &vfx_ctx) + { + if ((fx.flag & FX_BLUR_DOF_MODE) && !dof_enabled_) { + /* No blur outside camera view (or when DOF is disabled on the camera). */ + return 0; + } + + float winmat[4][4], persmat[4][4]; + float2 blur_size = {fx.radius[0], fx.radius[1]}; + + /* TODO(fclem): Replace by draw::View. */ + DRW_view_persmat_get(nullptr, persmat, false); + const float w = fabsf(mul_project_m4_v3_zfac(persmat, object->object_to_world[3])); + + if (fx.flag & FX_BLUR_DOF_MODE) { + /* Compute circle of confusion size. */ + float coc = (dof_parameters_[0] / -w) - dof_parameters_[1]; + blur_size = float2(fabsf(coc)); + } + else { + /* Modify by distance to camera and object scale. */ + /* TODO(fclem): Replace by draw::View. */ + DRW_view_winmat_get(nullptr, winmat, false); + /* TODO(fclem): Replace by this->render_size. */ + const float *vp_size = DRW_viewport_size_get(); + + float world_pixel_scale = 1.0f / GPENCIL_PIXEL_FACTOR; + float scale = mat4_to_scale(object->object_to_world); + float distance_factor = world_pixel_scale * scale * winmat[1][1] * vp_size[1] / w; + blur_size *= distance_factor; + } + + if ((fx.samples == 0.0f) || (blur_size[0] == 0.0f && blur_size[1] == 0.0f)) { + return 0; + } + + GPUShader *sh = shaders.static_shader_get(eShaderType::FX_BLUR); + + const float rot_sin = sin(fx.rotation); + const float rot_cos = cos(fx.rotation); + + if (blur_size[0] > 0.0f) { + PassMain::Sub &sub = vfx_ctx.create_vfx_pass("Fx Blur H", sh); + sub.state_set(DRW_STATE_WRITE_COLOR); + sub.push_constant("offset", float2(blur_size[0] * rot_cos, blur_size[0] * rot_sin)); + sub.push_constant("sampCount", max_ii(1, min_ii(fx.samples, blur_size[0]))); + sub.draw_procedural(GPU_PRIM_TRIS, 1, 3); + } + if (blur_size[1] > 0.0f) { + PassMain::Sub &sub = vfx_ctx.create_vfx_pass("Fx Blur V", sh); + sub.state_set(DRW_STATE_WRITE_COLOR); + sub.push_constant("offset", float2(-blur_size[1] * rot_sin, blur_size[1] * rot_cos)); + sub.push_constant("sampCount", max_ii(1, min_ii(fx.samples, blur_size[1]))); + sub.draw_procedural(GPU_PRIM_TRIS, 1, 3); + } + + /* Return number of passes. */ + return int(blur_size[0] > 0.0f) + int(blur_size[1] > 0.0f); + } + + int vfx_colorize(const ColorizeShaderFxData &fx, const Object *object, VfxContext &vfx_ctx) + { + UNUSED_VARS(fx, object, vfx_ctx); + return 0; + } + + int vfx_flip(const FlipShaderFxData &fx, const Object *object, VfxContext &vfx_ctx) + { + UNUSED_VARS(fx, object, vfx_ctx); + return 0; + } + + int vfx_pixelize(const PixelShaderFxData &fx, const Object *object, VfxContext &vfx_ctx) + { + UNUSED_VARS(fx, object, vfx_ctx); + return 0; + } + + int vfx_rim(const RimShaderFxData &fx, const Object *object, VfxContext &vfx_ctx) + { + UNUSED_VARS(fx, object, vfx_ctx); + return 0; + } + + int vfx_shadow(const ShadowShaderFxData &fx, const Object *object, VfxContext &vfx_ctx) + { + UNUSED_VARS(fx, object, vfx_ctx); + return 0; + } + + int vfx_glow(const GlowShaderFxData &fx, const Object *object, VfxContext &vfx_ctx) + { + UNUSED_VARS(fx, object, vfx_ctx); + return 0; + } + + int vfx_swirl(const SwirlShaderFxData &fx, const Object *object, VfxContext &vfx_ctx) + { + UNUSED_VARS(fx, object, vfx_ctx); + return 0; + } + + int vfx_wave(const WaveShaderFxData &fx, const Object *object, VfxContext &vfx_ctx) + { + UNUSED_VARS(fx, object, vfx_ctx); + return 0; + } + + void merge_sync(Framebuffer &main_fb, VfxContext &vfx_ctx) + { + PassMain::Sub &sub = vfx_ctx.object_subpass->sub("GPencil Object Composite"); + sub.framebuffer_set(&main_fb); + + sub.shader_set(shaders.static_shader_get(FX_COMPOSITE)); + sub.bind_texture("colorBuf", vfx_ctx.color_tx.current()); + sub.bind_texture("revealBuf", vfx_ctx.reveal_tx.current()); + + sub.state_set(DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND_MUL); + sub.push_constant("isFirstPass", true); + sub.draw_procedural(GPU_PRIM_TRIS, 1, 3); + /* We cannot do custom blending on multi-target frame-buffers. + * Workaround by doing 2 passes. */ + sub.state_set(DRW_STATE_WRITE_COLOR, DRW_STATE_BLEND_ADD_FULL); + sub.push_constant("isFirstPass", false); + sub.draw_procedural(GPU_PRIM_TRIS, 1, 3); + } +}; + +} // namespace blender::draw::greasepencil diff --git a/source/blender/draw/engines/gpencil/shaders/grease_pencil_depth_merge_vert.glsl b/source/blender/draw/engines/gpencil/shaders/grease_pencil_depth_merge_vert.glsl new file mode 100644 index 00000000000..64529a62424 --- /dev/null +++ b/source/blender/draw/engines/gpencil/shaders/grease_pencil_depth_merge_vert.glsl @@ -0,0 +1,9 @@ +/* SPDX-FileCopyrightText: 2020-2022 Blender Authors + * + * SPDX-License-Identifier: GPL-2.0-or-later */ +#pragma BLENDER_REQUIRE(draw_model_lib.glsl) + +void main() +{ + gl_Position = drw_point_object_to_homogenous(pos); +} diff --git a/source/blender/draw/engines/gpencil/shaders/grease_pencil_frag.glsl b/source/blender/draw/engines/gpencil/shaders/grease_pencil_frag.glsl new file mode 100644 index 00000000000..2e12e7d549e --- /dev/null +++ b/source/blender/draw/engines/gpencil/shaders/grease_pencil_frag.glsl @@ -0,0 +1,153 @@ +/* SPDX-FileCopyrightText: 2020-2023 Blender Authors + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +#pragma BLENDER_REQUIRE(common_grease_pencil_lib.glsl) +#pragma BLENDER_REQUIRE(common_colormanagement_lib.glsl) + +float length_squared(vec2 v) +{ + return dot(v, v); +} +float length_squared(vec3 v) +{ + return dot(v, v); +} + +vec3 gpencil_lighting(void) +{ + vec3 light_accum = vec3(0.0); + for (int i = 0; i < GPENCIL_LIGHT_BUFFER_LEN; i++) { + if (gp_lights[i]._color.x == -1.0) { + break; + } + vec3 L = gp_lights[i]._position - gp_interp.pos; + float vis = 1.0; + gpLightType type = floatBitsToUint(gp_lights[i]._type); + /* Spot Attenuation. */ + if (type == GP_LIGHT_TYPE_SPOT) { + mat3 rot_scale = mat3(gp_lights[i]._right, gp_lights[i]._up, gp_lights[i]._forward); + vec3 local_L = rot_scale * L; + local_L /= abs(local_L.z); + float ellipse = inversesqrt(length_squared(local_L)); + vis *= smoothstep(0.0, 1.0, (ellipse - gp_lights[i]._spot_size) / gp_lights[i]._spot_blend); + /* Also mask +Z cone. */ + vis *= step(0.0, local_L.z); + } + /* Inverse square decay. Skip for suns. */ + float L_len_sqr = length_squared(L); + if (type < GP_LIGHT_TYPE_SUN) { + vis /= L_len_sqr; + } + else { + L = gp_lights[i]._forward; + L_len_sqr = 1.0; + } + /* Lambertian falloff */ + if (type != GP_LIGHT_TYPE_AMBIENT) { + L /= sqrt(L_len_sqr); + vis *= clamp(dot(gpNormal, L), 0.0, 1.0); + } + light_accum += vis * gp_lights[i]._color; + } + /* Clamp to avoid NaNs. */ + return clamp(light_accum, 0.0, 1e10); +} + +/* TODO: Remove this once we can render textures. */ +vec4 debug_texture(vec2 uv) +{ + vec4 col = vec4(mod(uv.xy, 1.0), 0.0, 1.0); + return col * min(length(uv.xy * 2.0 - 1.0), 1.0); +} + +void main() +{ + vec4 col; + if (flag_test(gp_interp_flat.mat_flag, GP_STROKE_TEXTURE_USE)) { + bool premul = flag_test(gp_interp_flat.mat_flag, GP_STROKE_TEXTURE_PREMUL); + col = texture_read_as_linearrgb(gpStrokeTexture, premul, gp_interp.uv); + + /* TODO: Remove this once we can render textures. */ + /* Debug color. (Because textures are not yet implemented) */ + col = debug_texture(gp_interp.uv); + } + else if (flag_test(gp_interp_flat.mat_flag, GP_FILL_TEXTURE_USE)) { + bool use_clip = flag_test(gp_interp_flat.mat_flag, GP_FILL_TEXTURE_CLIP); + vec2 uvs = (use_clip) ? clamp(gp_interp.uv, 0.0, 1.0) : gp_interp.uv; + bool premul = flag_test(gp_interp_flat.mat_flag, GP_FILL_TEXTURE_PREMUL); + col = texture_read_as_linearrgb(gpFillTexture, premul, uvs); + } + else if (flag_test(gp_interp_flat.mat_flag, GP_FILL_GRADIENT_USE)) { + bool radial = flag_test(gp_interp_flat.mat_flag, GP_FILL_GRADIENT_RADIAL); + float fac = clamp(radial ? length(gp_interp.uv * 2.0 - 1.0) : gp_interp.uv.x, 0.0, 1.0); + uint matid = gp_interp_flat.mat_flag >> GPENCIl_MATID_SHIFT; + col = mix(gp_materials[matid].fill_color, gp_materials[matid].fill_mix_color, fac); + } + else /* SOLID */ { + col = vec4(1.0); + } + col.rgb *= col.a; + + /* Composite all other colors on top of texture color. + * Everything is pre-multiply by `col.a` to have the stencil effect. */ + fragColor = col * gp_interp.color_mul + col.a * gp_interp.color_add; + + fragColor.rgb *= gpencil_lighting(); + + fragColor *= gpencil_stroke_round_cap_mask(gp_interp_flat.sspos.xy, + gp_interp_flat.sspos.zw, + gp_interp_flat.aspect, + gp_interp_noperspective.thickness.x, + gp_interp_noperspective.hardness); + + /* To avoid aliasing artifacts, we reduce the opacity of small strokes. */ + fragColor *= smoothstep(0.0, 1.0, gp_interp_noperspective.thickness.y); + + /* Holdout materials. */ + if (flag_test(gp_interp_flat.mat_flag, GP_STROKE_HOLDOUT | GP_FILL_HOLDOUT)) { + revealColor = fragColor.aaaa; + } + else { + /* NOT holdout materials. + * For compatibility with colored alpha buffer. + * Note that we are limited to mono-chromatic alpha blending here + * because of the blend equation and the limit of 1 color target + * when using custom color blending. */ + revealColor = vec4(0.0, 0.0, 0.0, fragColor.a); + + if (fragColor.a < 0.001) { + discard; + return; + } + } + + vec2 fb_size = max(vec2(textureSize(gpSceneDepthTexture, 0).xy), + vec2(textureSize(gpMaskTexture, 0).xy)); + vec2 uvs = gl_FragCoord.xy / fb_size; + /* Manual depth test */ + float scene_depth = texture(gpSceneDepthTexture, uvs).r; + if (gl_FragCoord.z > scene_depth) { + discard; + return; + } + + /* FIXME(@fclem): Alas. This is bad for performance but it's the easiest way to not get + * depth written where the mask obliterate the layer. */ + float mask = texture(gpMaskTexture, uvs).r; + if (mask < 0.001) { + discard; + return; + } + + /* We override the fragment depth using the fragment shader to ensure a constant value. + * This has a cost as the depth test cannot happen early. + * We could do this in the vertex shader but then perspective interpolation of uvs and + * fragment clipping gets really complicated. */ + if (gp_interp_flat.depth >= 0.0) { + gl_FragDepth = gp_interp_flat.depth; + } + else { + gl_FragDepth = gl_FragCoord.z; + } +} diff --git a/source/blender/draw/engines/gpencil/shaders/grease_pencil_vert.glsl b/source/blender/draw/engines/gpencil/shaders/grease_pencil_vert.glsl new file mode 100644 index 00000000000..f931c15092b --- /dev/null +++ b/source/blender/draw/engines/gpencil/shaders/grease_pencil_vert.glsl @@ -0,0 +1,139 @@ +/* SPDX-FileCopyrightText: 2020-2023 Blender Authors + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +#pragma BLENDER_REQUIRE(common_grease_pencil_lib.glsl) + +void gpencil_color_output(vec4 stroke_col, vec4 vert_col, float vert_strength, float mix_tex) +{ + /* Mix stroke with other colors. */ + vec4 mixed_col = stroke_col; + mixed_col.rgb = mix(mixed_col.rgb, vert_col.rgb, vert_col.a); + mixed_col.rgb = mix(mixed_col.rgb, gpLayerTint.rgb, gpLayerTint.a); + mixed_col.a *= vert_strength * gpLayerOpacity; + /** + * This is what the fragment shader looks like. + * out = col * gp_interp.color_mul + col.a * gp_interp.color_add. + * gp_interp.color_mul is how much of the texture color to keep. + * gp_interp.color_add is how much of the mixed color to add. + * Note that we never add alpha. This is to keep the texture act as a stencil. + * We do however, modulate the alpha (reduce it). + */ + /* We add the mixed color. This is 100% mix (no texture visible). */ + gp_interp.color_mul = vec4(mixed_col.aaa, mixed_col.a); + gp_interp.color_add = vec4(mixed_col.rgb * mixed_col.a, 0.0); + /* Then we blend according to the texture mix factor. + * Note that we keep the alpha modulation. */ + gp_interp.color_mul.rgb *= mix_tex; + gp_interp.color_add.rgb *= 1.0 - mix_tex; +} + +void main() +{ + PASS_RESOURCE_ID + + float vert_strength; + vec4 vert_color; + vec3 vert_N; + + ivec4 ma1 = floatBitsToInt(texelFetch(gp_pos_tx, gpencil_stroke_point_id() * 3 + 1)); + gpMaterial gp_mat = gp_materials[ma1.x + gpMaterialOffset]; + gpMaterialFlag gp_flag = floatBitsToUint(gp_mat._flag); + + gl_Position = gpencil_vertex(vec4(viewportSize, 1.0 / viewportSize), + gp_flag, + gp_mat._alignment_rot, + gp_interp.pos, + vert_N, + vert_color, + vert_strength, + gp_interp.uv, + gp_interp_flat.sspos, + gp_interp_flat.aspect, + gp_interp_noperspective.thickness, + gp_interp_noperspective.hardness); + + if (gpencil_is_stroke_vertex()) { + if (!flag_test(gp_flag, GP_STROKE_ALIGNMENT)) { + gp_interp.uv.x *= gp_mat._stroke_u_scale; + } + + /* Special case: We don't use vertex color if material Holdout. */ + if (flag_test(gp_flag, GP_STROKE_HOLDOUT)) { + vert_color = vec4(0.0); + } + + gpencil_color_output( + gp_mat.stroke_color, vert_color, vert_strength, gp_mat._stroke_texture_mix); + + gp_interp_flat.mat_flag = gp_flag & ~GP_FILL_FLAGS; + + if (gpStrokeOrder3d) { + /* Use the fragment depth (see fragment shader). */ + gp_interp_flat.depth = -1.0; + } + else if (flag_test(gp_flag, GP_STROKE_OVERLAP)) { + /* Use the index of the point as depth. + * This means the stroke can overlap itself. */ + float point_index = float(ma1.z); + gp_interp_flat.depth = (point_index + gpStrokeIndexOffset + 2.0) * 0.0000002; + } + else { + /* Use the index of first point of the stroke as depth. + * We render using a greater depth test this means the stroke + * cannot overlap itself. + * We offset by one so that the fill can be overlapped by its stroke. + * The offset is ok since we pad the strokes data because of adjacency infos. */ + float stroke_index = float(ma1.y); + gp_interp_flat.depth = (stroke_index + gpStrokeIndexOffset + 2.0) * 0.0000002; + } + } + else { + int stroke_point_id = gpencil_stroke_point_id(); + vec4 uv1 = texelFetch(gp_pos_tx, stroke_point_id * 3 + 2); + vec4 fcol1 = texelFetch(gp_col_tx, stroke_point_id * 2 + 1); + vec4 fill_col = gp_mat.fill_color; + + /* Special case: We don't modulate alpha in gradient mode. */ + if (flag_test(gp_flag, GP_FILL_GRADIENT_USE)) { + fill_col.a = 1.0; + } + + /* Decode fill opacity. */ + vec4 fcol_decode = vec4(fcol1.rgb, floor(fcol1.a / 10.0)); + float fill_opacity = fcol1.a - (fcol_decode.a * 10); + fcol_decode.a /= 10000.0; + + /* Special case: We don't use vertex color if material Holdout. */ + if (flag_test(gp_flag, GP_FILL_HOLDOUT)) { + fcol_decode = vec4(0.0); + } + + /* Apply opacity. */ + fill_col.a *= fill_opacity; + /* If factor is > 1 force opacity. */ + if (fill_opacity > 1.0) { + fill_col.a += fill_opacity - 1.0; + } + + fill_col.a = clamp(fill_col.a, 0.0, 1.0); + + gpencil_color_output(fill_col, fcol_decode, 1.0, gp_mat._fill_texture_mix); + + gp_interp_flat.mat_flag = gp_flag & GP_FILL_FLAGS; + gp_interp_flat.mat_flag |= uint(ma1.x + gpMaterialOffset) << GPENCIl_MATID_SHIFT; + + gp_interp.uv = mat2(gp_mat.fill_uv_rot_scale.xy, gp_mat.fill_uv_rot_scale.zw) * uv1.xy + + gp_mat._fill_uv_offset; + + if (gpStrokeOrder3d) { + /* Use the fragment depth (see fragment shader). */ + gp_interp_flat.depth = -1.0; + } + else { + /* Use the index of first point of the stroke as depth. */ + float stroke_index = float(ma1.y); + gp_interp_flat.depth = (stroke_index + gpStrokeIndexOffset + 1.0) * 0.0000002; + } + } +} diff --git a/source/blender/draw/engines/gpencil/shaders/infos/gpencil_info.hh b/source/blender/draw/engines/gpencil/shaders/infos/gpencil_info.hh index f3231e79e50..af893352351 100644 --- a/source/blender/draw/engines/gpencil/shaders/infos/gpencil_info.hh +++ b/source/blender/draw/engines/gpencil/shaders/infos/gpencil_info.hh @@ -54,6 +54,41 @@ GPU_SHADER_CREATE_INFO(gpencil_geometry) .depth_write(DepthWrite::ANY) .additional_info("draw_gpencil"); +GPU_SHADER_CREATE_INFO(gpencil_geometry_next) + .do_static_compilation(true) + .define("GP_LIGHT") + .typedef_source("gpencil_defines.h") + .sampler(GPENCIL_SCENE_DEPTH_TEX_SLOT, ImageType::DEPTH_2D, "gpSceneDepthTexture") + .sampler(GPENCIL_MASK_TEX_SLOT, ImageType::FLOAT_2D, "gpMaskTexture") + .sampler(GPENCIL_FILL_TEX_SLOT, ImageType::FLOAT_2D, "gpFillTexture") + .sampler(GPENCIL_STROKE_TEX_SLOT, ImageType::FLOAT_2D, "gpStrokeTexture") + .storage_buf(GPENCIL_OBJECT_SLOT, Qualifier::READ, "gpObject", "gp_object[]") + .storage_buf(GPENCIL_LAYER_SLOT, Qualifier::READ, "gpLayer", "gp_layer[]") + .storage_buf(GPENCIL_MATERIAL_SLOT, Qualifier::READ, "gpMaterial", "gp_materials[]") + .storage_buf(GPENCIL_LIGHT_SLOT, Qualifier::READ, "gpLight", "gp_lights[]") + .uniform_buf(GPENCIL_SCENE_SLOT, "gpScene", "gp_scene") + /* Per Scene */ + .define("viewportSize", "gp_scene.render_size") + /* Per Object */ + .define("gpNormal", "gp_object[resource_id].normal") + .define("gpStrokeOrder3d", "gp_object[resource_id].stroke_order3d") + .define("gpMaterialOffset", "gp_object[resource_id].material_offset") + /* Per Layer */ + .define("layer_id", "gp_object[resource_id].layer_offset") /* TODO */ + .define("gpVertexColorOpacity", "gp_layer[layer_id].vertex_color_opacity") + .define("gpLayerTint", "gp_layer[layer_id].tint") + .define("gpLayerOpacity", "gp_layer[layer_id].opacity") + .define("gpStrokeIndexOffset", "gp_layer[layer_id].stroke_index_offset") + .fragment_out(0, Type::VEC4, "fragColor") + .fragment_out(1, Type::VEC4, "revealColor") + .vertex_out(gpencil_geometry_iface) + .vertex_out(gpencil_geometry_flat_iface) + .vertex_out(gpencil_geometry_noperspective_iface) + .vertex_source("grease_pencil_vert.glsl") + .fragment_source("grease_pencil_frag.glsl") + .additional_info("draw_gpencil_new") + .depth_write(DepthWrite::ANY); + /** \} */ /* -------------------------------------------------------------------- */ @@ -91,6 +126,16 @@ GPU_SHADER_CREATE_INFO(gpencil_depth_merge) .depth_write(DepthWrite::ANY) .additional_info("draw_view"); +GPU_SHADER_CREATE_INFO(grease_pencil_depth_merge) + .do_static_compilation(true) + .define("strokeOrder3d", "false") + .sampler(0, ImageType::DEPTH_2D, "depthBuf") + .vertex_in(0, Type::VEC3, "pos") + .vertex_source("grease_pencil_depth_merge_vert.glsl") + .fragment_source("gpencil_depth_merge_frag.glsl") + .depth_write(DepthWrite::ANY) + .additional_info("draw_modelmat_new", "draw_view"); + /** \} */ /* -------------------------------------------------------------------- */ diff --git a/source/blender/draw/engines/image/image_shader_params.hh b/source/blender/draw/engines/image/image_shader_params.hh index 5b5cc23b933..7cf04acb9f8 100644 --- a/source/blender/draw/engines/image/image_shader_params.hh +++ b/source/blender/draw/engines/image/image_shader_params.hh @@ -36,7 +36,7 @@ struct ShaderParameters { use_premul_alpha = BKE_image_has_gpu_texture_premultiplied_alpha(image, image_buffer); if (scene->camera && scene->camera->type == OB_CAMERA) { - const Camera *camera = static_cast(scene->camera->data); + Camera *camera = static_cast(scene->camera->data); copy_v2_fl2(far_near, camera->clip_end, camera->clip_start); } space->get_shader_parameters(*this, image_buffer); diff --git a/source/blender/draw/engines/overlay/overlay_armature.cc b/source/blender/draw/engines/overlay/overlay_armature.cc index 00f313349ec..c1a3771f544 100644 --- a/source/blender/draw/engines/overlay/overlay_armature.cc +++ b/source/blender/draw/engines/overlay/overlay_armature.cc @@ -653,7 +653,7 @@ static void drw_shgroup_bone_octahedral(const ArmatureDrawContext *ctx, const float outline_color[4]) { BoneInstanceData inst_data; - mul_m4_m4m4(inst_data.mat, ctx->ob->object_to_world().ptr(), bone_mat); + mul_m4_m4m4(inst_data.mat, ctx->ob->object_to_world, bone_mat); if (ctx->solid) { OVERLAY_bone_instance_data_set_color(&inst_data, bone_color); OVERLAY_bone_instance_data_set_color_hint(&inst_data, hint_color); @@ -673,7 +673,7 @@ static void drw_shgroup_bone_box(const ArmatureDrawContext *ctx, const float outline_color[4]) { BoneInstanceData inst_data; - mul_m4_m4m4(inst_data.mat, ctx->ob->object_to_world().ptr(), bone_mat); + mul_m4_m4m4(inst_data.mat, ctx->ob->object_to_world, bone_mat); if (ctx->solid) { OVERLAY_bone_instance_data_set_color(&inst_data, bone_color); OVERLAY_bone_instance_data_set_color_hint(&inst_data, hint_color); @@ -691,9 +691,9 @@ static void drw_shgroup_bone_wire(const ArmatureDrawContext *ctx, const float color[4]) { float head[3], tail[3]; - mul_v3_m4v3(head, ctx->ob->object_to_world().ptr(), bone_mat[3]); + mul_v3_m4v3(head, ctx->ob->object_to_world, bone_mat[3]); add_v3_v3v3(tail, bone_mat[3], bone_mat[1]); - mul_m4_v3(ctx->ob->object_to_world().ptr(), tail); + mul_m4_v3(ctx->ob->object_to_world, tail); DRW_buffer_add_entry(ctx->wire, head, color); DRW_buffer_add_entry(ctx->wire, tail, color); @@ -708,9 +708,9 @@ static void drw_shgroup_bone_stick(const ArmatureDrawContext *ctx, const float col_tail[4]) { float head[3], tail[3]; - mul_v3_m4v3(head, ctx->ob->object_to_world().ptr(), bone_mat[3]); + mul_v3_m4v3(head, ctx->ob->object_to_world, bone_mat[3]); add_v3_v3v3(tail, bone_mat[3], bone_mat[1]); - mul_m4_v3(ctx->ob->object_to_world().ptr(), tail); + mul_m4_v3(ctx->ob->object_to_world, tail); DRW_buffer_add_entry(ctx->stick, head, tail, col_wire, col_bone, col_head, col_tail); } @@ -729,11 +729,11 @@ static void drw_shgroup_bone_envelope_distance(const ArmatureDrawContext *ctx, mul_m4_v4(bone_mat, head_sph); mul_m4_v4(bone_mat, tail_sph); mul_m4_v4(bone_mat, xaxis); - mul_m4_v4(ctx->ob->object_to_world().ptr(), head_sph); - mul_m4_v4(ctx->ob->object_to_world().ptr(), tail_sph); - mul_m4_v4(ctx->ob->object_to_world().ptr(), xaxis); + mul_m4_v4(ctx->ob->object_to_world, head_sph); + mul_m4_v4(ctx->ob->object_to_world, tail_sph); + mul_m4_v4(ctx->ob->object_to_world, xaxis); sub_v3_v3(xaxis, head_sph); - float obscale = mat4_to_scale(ctx->ob->object_to_world().ptr()); + float obscale = mat4_to_scale(ctx->ob->object_to_world); head_sph[3] = *radius_head * obscale; head_sph[3] += *distance * obscale; tail_sph[3] = *radius_tail * obscale; @@ -756,10 +756,10 @@ static void drw_shgroup_bone_envelope(const ArmatureDrawContext *ctx, mul_m4_v4(bone_mat, head_sph); mul_m4_v4(bone_mat, tail_sph); mul_m4_v4(bone_mat, xaxis); - mul_m4_v4(ctx->ob->object_to_world().ptr(), head_sph); - mul_m4_v4(ctx->ob->object_to_world().ptr(), tail_sph); - mul_m4_v4(ctx->ob->object_to_world().ptr(), xaxis); - float obscale = mat4_to_scale(ctx->ob->object_to_world().ptr()); + mul_m4_v4(ctx->ob->object_to_world, head_sph); + mul_m4_v4(ctx->ob->object_to_world, tail_sph); + mul_m4_v4(ctx->ob->object_to_world, xaxis); + float obscale = mat4_to_scale(ctx->ob->object_to_world); head_sph[3] = *radius_head * obscale; tail_sph[3] = *radius_tail * obscale; @@ -861,7 +861,7 @@ static void drw_shgroup_bone_custom_solid_mesh(const ArmatureDrawContext *ctx, DRWCallBuffer *buf; if (surf || edges || loose_edges) { - mul_m4_m4m4(inst_data.mat, ctx->ob->object_to_world().ptr(), bone_mat); + mul_m4_m4m4(inst_data.mat, ctx->ob->object_to_world, bone_mat); } if (surf && ctx->custom_solid) { @@ -903,7 +903,7 @@ static void drw_shgroup_bone_custom_mesh_wire(const ArmatureDrawContext *ctx, if (geom) { DRWCallBuffer *buf = custom_bone_instance_shgroup(ctx, ctx->custom_wire, geom); BoneInstanceData inst_data; - mul_m4_m4m4(inst_data.mat, ctx->ob->object_to_world().ptr(), bone_mat); + mul_m4_m4m4(inst_data.mat, ctx->ob->object_to_world, bone_mat); OVERLAY_bone_instance_data_set_color_hint(&inst_data, color); OVERLAY_bone_instance_data_set_color(&inst_data, color); DRW_buffer_add_entry_struct(buf, inst_data.mat); @@ -936,7 +936,7 @@ static void drw_shgroup_custom_bone_curve(const ArmatureDrawContext *ctx, if (loose_edges) { BoneInstanceData inst_data; - mul_m4_m4m4(inst_data.mat, ctx->ob->object_to_world().ptr(), bone_mat); + mul_m4_m4m4(inst_data.mat, ctx->ob->object_to_world, bone_mat); DRWCallBuffer *buf = custom_bone_instance_shgroup(ctx, ctx->custom_wire, loose_edges); OVERLAY_bone_instance_data_set_color_hint(&inst_data, outline_color); @@ -997,7 +997,7 @@ static void drw_shgroup_bone_custom_empty(const ArmatureDrawContext *ctx, { const float final_color[4] = {color[0], color[1], color[2], 1.0f}; float mat[4][4]; - mul_m4_m4m4(mat, ctx->ob->object_to_world().ptr(), bone_mat); + mul_m4_m4m4(mat, ctx->ob->object_to_world, bone_mat); switch (custom->empty_drawtype) { case OB_PLAINAXES: @@ -1023,7 +1023,7 @@ static void drw_shgroup_bone_point(const ArmatureDrawContext *ctx, const float outline_color[4]) { BoneInstanceData inst_data; - mul_m4_m4m4(inst_data.mat, ctx->ob->object_to_world().ptr(), bone_mat); + mul_m4_m4m4(inst_data.mat, ctx->ob->object_to_world, bone_mat); if (ctx->point_solid) { OVERLAY_bone_instance_data_set_color(&inst_data, bone_color); OVERLAY_bone_instance_data_set_color_hint(&inst_data, hint_color); @@ -1041,7 +1041,7 @@ static void drw_shgroup_bone_axes(const ArmatureDrawContext *ctx, const float color[4]) { float mat[4][4]; - mul_m4_m4m4(mat, ctx->ob->object_to_world().ptr(), bone_mat); + mul_m4_m4m4(mat, ctx->ob->object_to_world, bone_mat); /* Move to bone tail. */ add_v3_v3(mat[3], mat[1]); OVERLAY_empty_shape(ctx->extras, mat, 0.25f, OB_ARROWS, color); @@ -1054,8 +1054,8 @@ static void drw_shgroup_bone_relationship_lines_ex(const ArmatureDrawContext *ct const float color[4]) { float s[3], e[3]; - mul_v3_m4v3(s, ctx->ob->object_to_world().ptr(), start); - mul_v3_m4v3(e, ctx->ob->object_to_world().ptr(), end); + mul_v3_m4v3(s, ctx->ob->object_to_world, start); + mul_v3_m4v3(e, ctx->ob->object_to_world, end); /* reverse order to have less stipple overlap */ OVERLAY_extra_line_dashed(ctx->extras, s, e, color); } @@ -1754,7 +1754,7 @@ static void draw_bone_degrees_of_freedom(const ArmatureDrawContext *ctx, const b zero_v3(tmp[3]); mul_m4_m4m4(posetrans, posetrans, tmp); } - /* ... but its own rest-space. */ + /* ... but own rest-space. */ mul_m4_m4m3(posetrans, posetrans, pchan->bone->bone_mat); float scale = pchan->bone->length * pchan->size[1]; @@ -1763,7 +1763,7 @@ static void draw_bone_degrees_of_freedom(const ArmatureDrawContext *ctx, const b mul_m4_m4m4(posetrans, posetrans, tmp); /* into world space. */ - mul_m4_m4m4(inst_data.mat, ctx->ob->object_to_world().ptr(), posetrans); + mul_m4_m4m4(inst_data.mat, ctx->ob->object_to_world, posetrans); if ((pchan->ikflag & BONE_IK_XLIMIT) && (pchan->ikflag & BONE_IK_ZLIMIT)) { bone_instance_data_set_angle_minmax( @@ -1944,7 +1944,7 @@ static void draw_bone_name(const ArmatureDrawContext *ctx, const float *head = is_pose ? pchan->pose_head : eBone->head; const float *tail = is_pose ? pchan->pose_tail : eBone->tail; mid_v3_v3v3(vec, head, tail); - mul_m4_v3(ctx->ob->object_to_world().ptr(), vec); + mul_m4_v3(ctx->ob->object_to_world, vec); DRW_text_cache_add(dt, vec, @@ -2284,13 +2284,13 @@ class ArmatureBoneDrawStrategyBBone : public ArmatureBoneDrawStrategy { const bArmature *arm = static_cast(ob->data); BLI_assert(arm->drawtype == ARM_B_BONE); UNUSED_VARS_NDEBUG(arm); - const float ob_scale = mat4_to_size_max_axis(ob->object_to_world().ptr()); + const float ob_scale = mat4_to_size_max_axis(ob->object_to_world); const Mat4 *bbones_mat = (const Mat4 *)pchan->draw_data->bbone_matrix; for (int i = pchan->bone->segments; i--; bbones_mat++) { BoundSphere bsphere; float size[3]; mat4_to_size(size, bbones_mat->mat); - mul_v3_m4v3(bsphere.center, ob->object_to_world().ptr(), bbones_mat->mat[3]); + mul_v3_m4v3(bsphere.center, ob->object_to_world, bbones_mat->mat[3]); bsphere.radius = len_v3(size) * ob_scale; if (DRW_culling_sphere_test(view, &bsphere)) { return true; @@ -2365,7 +2365,7 @@ class ArmatureBoneDrawStrategyEnvelope : public ArmatureBoneDrawStrategy { BoundSphere bsphere; pchan_culling_calc_bsphere(ob, pchan, &bsphere); bsphere.radius += max_ff(pchan->bone->rad_head, pchan->bone->rad_tail) * - mat4_to_size_max_axis(ob->object_to_world().ptr()) * + mat4_to_size_max_axis(ob->object_to_world) * mat4_to_size_max_axis(pchan->disp_mat); return DRW_culling_sphere_test(view, &bsphere); } @@ -2547,7 +2547,7 @@ static void draw_armature_edit(ArmatureDrawContext *ctx) const bool show_text = DRW_state_show_text(); const Object *ob_orig = DEG_get_original_object(ob); - /* FIXME(@ideasman42): We should be able to use the evaluated object, + /* FIXME(@ideasman42): We should be able to use the CoW object, * however the active bone isn't updated. Long term solution is an 'EditArmature' struct. * for now we can draw from the original armature. See: #66773. */ // bArmature *arm = ob->data; diff --git a/source/blender/draw/engines/overlay/overlay_edit_text.cc b/source/blender/draw/engines/overlay/overlay_edit_text.cc index 8b83db20235..adc3478b1be 100644 --- a/source/blender/draw/engines/overlay/overlay_edit_text.cc +++ b/source/blender/draw/engines/overlay/overlay_edit_text.cc @@ -123,7 +123,7 @@ static void edit_text_cache_populate_select(OVERLAY_Data *vedata, Object *ob) add_v2_v2(box[3], &sb->x); } v2_quad_corners_to_mat4(box, final_mat); - mul_m4_m4m4(final_mat, ob->object_to_world().ptr(), final_mat); + mul_m4_m4m4(final_mat, ob->object_to_world, final_mat); DRW_shgroup_call_obmat(pd->edit_text_selection_grp, geom, final_mat); } @@ -138,7 +138,7 @@ static void edit_text_cache_populate_cursor(OVERLAY_Data *vedata, Object *ob) float mat[4][4]; v2_quad_corners_to_mat4(cursor, mat); - mul_m4_m4m4(mat, ob->object_to_world().ptr(), mat); + mul_m4_m4m4(mat, ob->object_to_world, mat); GPUBatch *geom = DRW_cache_quad_get(); DRW_shgroup_call_obmat(pd->edit_text_cursor_grp, geom, mat); @@ -166,7 +166,7 @@ static void edit_text_cache_populate_boxes(OVERLAY_Data *vedata, Object *ob) vecs[3][1] -= tb->h; for (int j = 0; j < 4; j++) { - mul_v3_m4v3(vecs[j], ob->object_to_world().ptr(), vecs[j]); + mul_v3_m4v3(vecs[j], ob->object_to_world, vecs[j]); } for (int j = 0; j < 4; j++) { OVERLAY_extra_line_dashed(cb, vecs[j], vecs[(j + 1) % 4], color); diff --git a/source/blender/draw/engines/overlay/overlay_edit_uv.cc b/source/blender/draw/engines/overlay/overlay_edit_uv.cc index 92965dcfb39..52adc006fcb 100644 --- a/source/blender/draw/engines/overlay/overlay_edit_uv.cc +++ b/source/blender/draw/engines/overlay/overlay_edit_uv.cc @@ -161,7 +161,6 @@ void OVERLAY_edit_uv_init(OVERLAY_Data *vedata) pd->edit_uv.do_uv_stretching_overlay = show_overlays && do_uvstretching_overlay; pd->edit_uv.uv_opacity = sima->uv_opacity; - pd->edit_uv.stretch_opacity = sima->stretch_opacity; pd->edit_uv.do_tiled_image_overlay = show_overlays && is_image_type && is_tiled_image; pd->edit_uv.do_tiled_image_border_overlay = is_image_type && is_tiled_image; pd->edit_uv.dash_length = 4.0f * UI_SCALE_FAC; @@ -285,8 +284,6 @@ void OVERLAY_edit_uv_cache_init(OVERLAY_Data *vedata) pd->edit_uv_stretching_grp = DRW_shgroup_create(sh, psl->edit_uv_stretching_ps); DRW_shgroup_uniform_block(pd->edit_uv_stretching_grp, "globalsBlock", G_draw.block_ubo); DRW_shgroup_uniform_vec2_copy(pd->edit_uv_stretching_grp, "aspect", pd->edit_uv.uv_aspect); - DRW_shgroup_uniform_float_copy( - pd->edit_uv_stretching_grp, "stretch_opacity", pd->edit_uv.stretch_opacity); } else /* SI_UVDT_STRETCH_AREA */ { GPUShader *sh = OVERLAY_shader_edit_uv_stretching_area_get(); @@ -294,8 +291,6 @@ void OVERLAY_edit_uv_cache_init(OVERLAY_Data *vedata) DRW_shgroup_uniform_block(pd->edit_uv_stretching_grp, "globalsBlock", G_draw.block_ubo); DRW_shgroup_uniform_float( pd->edit_uv_stretching_grp, "totalAreaRatio", &pd->edit_uv.total_area_ratio, 1); - DRW_shgroup_uniform_float_copy( - pd->edit_uv_stretching_grp, "stretch_opacity", pd->edit_uv.stretch_opacity); } } diff --git a/source/blender/draw/engines/overlay/overlay_engine.cc b/source/blender/draw/engines/overlay/overlay_engine.cc index fe180e3baa1..ae719cf97e1 100644 --- a/source/blender/draw/engines/overlay/overlay_engine.cc +++ b/source/blender/draw/engines/overlay/overlay_engine.cc @@ -17,7 +17,7 @@ #include "UI_interface.hh" -#include "BKE_duplilist.hh" +#include "BKE_duplilist.h" #include "BKE_object.hh" #include "BKE_paint.hh" @@ -444,7 +444,9 @@ static void OVERLAY_cache_populate(void *vedata, Object *ob) OVERLAY_edit_curves_cache_populate(data, ob); break; case OB_GREASE_PENCIL: - OVERLAY_edit_grease_pencil_cache_populate(data, ob); + if (U.experimental.use_grease_pencil_version3) { + OVERLAY_edit_grease_pencil_cache_populate(data, ob); + } break; } } diff --git a/source/blender/draw/engines/overlay/overlay_extra.cc b/source/blender/draw/engines/overlay/overlay_extra.cc index d2d4bee8764..02697587fb0 100644 --- a/source/blender/draw/engines/overlay/overlay_extra.cc +++ b/source/blender/draw/engines/overlay/overlay_extra.cc @@ -18,7 +18,7 @@ #include "BKE_camera.h" #include "BKE_constraint.h" #include "BKE_curve.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_mball.hh" #include "BKE_mesh.hh" #include "BKE_modifier.hh" @@ -342,8 +342,7 @@ void OVERLAY_empty_cache_populate(OVERLAY_Data *vedata, Object *ob) case OB_EMPTY_CONE: case OB_ARROWS: DRW_object_wire_theme_get(ob, view_layer, &color); - OVERLAY_empty_shape( - cb, ob->object_to_world().ptr(), ob->empty_drawsize, ob->empty_drawtype, color); + OVERLAY_empty_shape(cb, ob->object_to_world, ob->empty_drawsize, ob->empty_drawtype, color); break; case OB_EMPTY_IMAGE: OVERLAY_image_empty_cache_populate(vedata, ob); @@ -374,7 +373,7 @@ static void OVERLAY_bounds(OVERLAY_ExtraCallBuffers *cb, case OB_BOUND_BOX: size_to_mat4(tmp, size); copy_v3_v3(tmp[3], center); - mul_m4_m4m4(tmp, ob->object_to_world().ptr(), tmp); + mul_m4_m4m4(tmp, ob->object_to_world, tmp); DRW_buffer_add_entry(cb->empty_cube, color, tmp); break; case OB_BOUND_SPHERE: @@ -382,7 +381,7 @@ static void OVERLAY_bounds(OVERLAY_ExtraCallBuffers *cb, size[1] = size[2] = size[0]; size_to_mat4(tmp, size); copy_v3_v3(tmp[3], center); - mul_m4_m4m4(tmp, ob->object_to_world().ptr(), tmp); + mul_m4_m4m4(tmp, ob->object_to_world, tmp); DRW_buffer_add_entry(cb->empty_sphere, color, tmp); break; case OB_BOUND_CYLINDER: @@ -390,7 +389,7 @@ static void OVERLAY_bounds(OVERLAY_ExtraCallBuffers *cb, size[1] = size[0]; size_to_mat4(tmp, size); copy_v3_v3(tmp[3], center); - mul_m4_m4m4(tmp, ob->object_to_world().ptr(), tmp); + mul_m4_m4m4(tmp, ob->object_to_world, tmp); DRW_buffer_add_entry(cb->empty_cylinder, color, tmp); break; case OB_BOUND_CONE: @@ -401,7 +400,7 @@ static void OVERLAY_bounds(OVERLAY_ExtraCallBuffers *cb, /* Cone batch has base at 0 and is pointing towards +Y. */ swap_v3_v3(tmp[1], tmp[2]); tmp[3][2] -= size[2]; - mul_m4_m4m4(tmp, ob->object_to_world().ptr(), tmp); + mul_m4_m4m4(tmp, ob->object_to_world, tmp); DRW_buffer_add_entry(cb->empty_cone, color, tmp); break; case OB_BOUND_CAPSULE: @@ -410,14 +409,14 @@ static void OVERLAY_bounds(OVERLAY_ExtraCallBuffers *cb, scale_m4_fl(tmp, size[0]); copy_v2_v2(tmp[3], center); tmp[3][2] = center[2] + max_ff(0.0f, size[2] - size[0]); - mul_m4_m4m4(final_mat, ob->object_to_world().ptr(), tmp); + mul_m4_m4m4(final_mat, ob->object_to_world, tmp); DRW_buffer_add_entry(cb->empty_capsule_cap, color, final_mat); negate_v3(tmp[2]); tmp[3][2] = center[2] - max_ff(0.0f, size[2] - size[0]); - mul_m4_m4m4(final_mat, ob->object_to_world().ptr(), tmp); + mul_m4_m4m4(final_mat, ob->object_to_world, tmp); DRW_buffer_add_entry(cb->empty_capsule_cap, color, final_mat); tmp[2][2] = max_ff(0.0f, size[2] * 2.0f - size[0] * 2.0f); - mul_m4_m4m4(final_mat, ob->object_to_world().ptr(), tmp); + mul_m4_m4m4(final_mat, ob->object_to_world, tmp); DRW_buffer_add_entry(cb->empty_capsule_body, color, final_mat); break; } @@ -491,7 +490,7 @@ static void OVERLAY_texture_space(OVERLAY_ExtraCallBuffers *cb, Object *ob, cons unit_m4(mat); } - mul_m4_m4m4(mat, ob->object_to_world().ptr(), mat); + mul_m4_m4m4(mat, ob->object_to_world, mat); DRW_buffer_add_entry(cb->empty_cube, color, mat); } @@ -513,7 +512,7 @@ static void OVERLAY_forcefield(OVERLAY_ExtraCallBuffers *cb, Object *ob, ViewLay }; } instdata; - copy_m4_m4(instdata.mat, ob->object_to_world().ptr()); + copy_m4_m4(instdata.mat, ob->object_to_world); instdata.size_x = instdata.size_y = instdata.size_z = ob->empty_drawsize; switch (pd->forcefield) { @@ -533,16 +532,16 @@ static void OVERLAY_forcefield(OVERLAY_ExtraCallBuffers *cb, Object *ob, ViewLay instdata.size_x = instdata.size_y = instdata.size_z = pd->f_strength; float pos[4]; BKE_where_on_path(ob, 0.0f, pos, nullptr, nullptr, nullptr, nullptr); - copy_v3_v3(instdata.pos, ob->object_to_world().location()); + copy_v3_v3(instdata.pos, ob->object_to_world[3]); translate_m4(instdata.mat, pos[0], pos[1], pos[2]); DRW_buffer_add_entry(cb->field_curve, color, &instdata); BKE_where_on_path(ob, 1.0f, pos, nullptr, nullptr, nullptr, nullptr); - copy_v3_v3(instdata.pos, ob->object_to_world().location()); + copy_v3_v3(instdata.pos, ob->object_to_world[3]); translate_m4(instdata.mat, pos[0], pos[1], pos[2]); DRW_buffer_add_entry(cb->field_sphere_limit, color, &instdata); /* Restore */ - copy_v3_v3(instdata.pos, ob->object_to_world().location()); + copy_v3_v3(instdata.pos, ob->object_to_world[3]); } break; } @@ -628,7 +627,7 @@ void OVERLAY_light_cache_populate(OVERLAY_Data *vedata, Object *ob) }; } instdata; - copy_m4_m4(instdata.mat, ob->object_to_world().ptr()); + copy_m4_m4(instdata.mat, ob->object_to_world); /* FIXME / TODO: clip_end has no meaning nowadays. * In EEVEE, Only clip_sta is used shadow-mapping. * Clip end is computed automatically based on light power. @@ -727,7 +726,7 @@ void OVERLAY_lightprobe_cache_populate(OVERLAY_Data *vedata, Object *ob) }; } instdata; - copy_m4_m4(instdata.mat, ob->object_to_world().ptr()); + copy_m4_m4(instdata.mat, ob->object_to_world); switch (prb->type) { case LIGHTPROBE_TYPE_SPHERE: @@ -739,15 +738,15 @@ void OVERLAY_lightprobe_cache_populate(OVERLAY_Data *vedata, Object *ob) if (show_influence) { char shape = (prb->attenuation_type == LIGHTPROBE_SHAPE_BOX) ? OB_CUBE : OB_EMPTY_SPHERE; float f = 1.0f - prb->falloff; - OVERLAY_empty_shape(cb, ob->object_to_world().ptr(), prb->distinf, shape, color_p); - OVERLAY_empty_shape(cb, ob->object_to_world().ptr(), prb->distinf * f, shape, color_p); + OVERLAY_empty_shape(cb, ob->object_to_world, prb->distinf, shape, color_p); + OVERLAY_empty_shape(cb, ob->object_to_world, prb->distinf * f, shape, color_p); } if (show_parallax) { char shape = (prb->parallax_type == LIGHTPROBE_SHAPE_BOX) ? OB_CUBE : OB_EMPTY_SPHERE; float dist = ((prb->flag & LIGHTPROBE_FLAG_CUSTOM_PARALLAX) != 0) ? prb->distpar : prb->distinf; - OVERLAY_empty_shape(cb, ob->object_to_world().ptr(), dist, shape, color_p); + OVERLAY_empty_shape(cb, ob->object_to_world, dist, shape, color_p); } break; case LIGHTPROBE_TYPE_VOLUME: @@ -757,9 +756,8 @@ void OVERLAY_lightprobe_cache_populate(OVERLAY_Data *vedata, Object *ob) if (show_influence) { float f = 1.0f - prb->falloff; - OVERLAY_empty_shape(cb, ob->object_to_world().ptr(), 1.0 + prb->distinf, OB_CUBE, color_p); - OVERLAY_empty_shape( - cb, ob->object_to_world().ptr(), 1.0 + prb->distinf * f, OB_CUBE, color_p); + OVERLAY_empty_shape(cb, ob->object_to_world, 1.0 + prb->distinf, OB_CUBE, color_p); + OVERLAY_empty_shape(cb, ob->object_to_world, 1.0 + prb->distinf * f, OB_CUBE, color_p); } /* Data dots */ @@ -797,7 +795,7 @@ void OVERLAY_lightprobe_cache_populate(OVERLAY_Data *vedata, Object *ob) zero_v3(instdata.mat[2]); DRW_buffer_add_entry(cb->empty_cube, color_p, &instdata); - normalize_m4_m4(instdata.mat, ob->object_to_world().ptr()); + normalize_m4_m4(instdata.mat, ob->object_to_world); OVERLAY_empty_shape(cb, instdata.mat, ob->empty_drawsize, OB_SINGLE_ARROW, color_p); break; } @@ -817,7 +815,7 @@ void OVERLAY_speaker_cache_populate(OVERLAY_Data *vedata, Object *ob) float *color_p; DRW_object_wire_theme_get(ob, view_layer, &color_p); - DRW_buffer_add_entry(cb->speaker, color_p, ob->object_to_world().ptr()); + DRW_buffer_add_entry(cb->speaker, color_p, ob->object_to_world); } /** \} */ @@ -910,7 +908,7 @@ static void camera_view3d_reconstruction( float object_imat[4][4]; invert_m4_m4(object_imat, object_mat); - mul_m4_m4m4(tracking_object_mat, ob->object_to_world().ptr(), object_imat); + mul_m4_m4m4(tracking_object_mat, ob->object_to_world, object_imat); } LISTBASE_FOREACH (MovieTrackingTrack *, track, &tracking_object->tracks) { @@ -1008,7 +1006,7 @@ static float camera_offaxis_shiftx_get(Scene *scene, const OVERLAY_CameraInstanceData *instdata, bool right_eye) { - const Camera *cam = static_cast(ob->data); + Camera *cam = static_cast(ob->data); if (cam->stereo.convergence_mode == CAM_S3D_OFFAXIS) { const char *viewnames[2] = {STEREO_LEFT_NAME, STEREO_RIGHT_NAME}; const float shiftx = BKE_camera_multiview_shift_x(&scene->r, ob, viewnames[right_eye]); @@ -1030,7 +1028,7 @@ static void camera_stereoscopy_extra(OVERLAY_ExtraCallBuffers *cb, const OVERLAY_CameraInstanceData *instdata) { OVERLAY_CameraInstanceData stereodata = *instdata; - const Camera *cam = static_cast(ob->data); + Camera *cam = static_cast(ob->data); const bool is_select = DRW_state_is_select(); const char *viewnames[2] = {STEREO_LEFT_NAME, STEREO_RIGHT_NAME}; @@ -1134,8 +1132,8 @@ void OVERLAY_camera_cache_populate(OVERLAY_Data *vedata, Object *ob) Scene *scene = draw_ctx->scene; RegionView3D *rv3d = draw_ctx->rv3d; - const Camera *cam = static_cast(ob->data); - const Object *camera_object = DEG_get_evaluated_object(draw_ctx->depsgraph, v3d->camera); + Camera *cam = static_cast(ob->data); + Object *camera_object = DEG_get_evaluated_object(draw_ctx->depsgraph, v3d->camera); const bool is_select = DRW_state_is_select(); const bool is_active = (ob == camera_object); const bool look_through = (is_active && (rv3d->persp == RV3D_CAMOB)); @@ -1153,7 +1151,7 @@ void OVERLAY_camera_cache_populate(OVERLAY_Data *vedata, Object *ob) DRW_object_wire_theme_get(ob, view_layer, &color_p); copy_v4_v4(instdata.color, color_p); - normalize_m4_m4(instdata.mat, ob->object_to_world().ptr()); + normalize_m4_m4(instdata.mat, ob->object_to_world); /* BKE_camera_multiview_model_matrix already accounts for scale, don't do it here. */ if (is_selection_camera_stereo) { @@ -1161,9 +1159,9 @@ void OVERLAY_camera_cache_populate(OVERLAY_Data *vedata, Object *ob) } else { copy_v3_fl3(scale, - len_v3(ob->object_to_world().ptr()[0]), - len_v3(ob->object_to_world().ptr()[1]), - len_v3(ob->object_to_world().ptr()[2])); + len_v3(ob->object_to_world[0]), + len_v3(ob->object_to_world[1]), + len_v3(ob->object_to_world[2])); /* Avoid division by 0. */ if (ELEM(0.0f, scale[0], scale[1], scale[2])) { return; @@ -1279,7 +1277,7 @@ static void OVERLAY_relationship_lines(OVERLAY_ExtraCallBuffers *cb, if (ob->parent && (DRW_object_visibility_in_active_context(ob->parent) & OB_VISIBLE_SELF)) { float *parent_pos = ob->runtime->parent_display_origin; - OVERLAY_extra_line_dashed(cb, parent_pos, ob->object_to_world().location(), relation_color); + OVERLAY_extra_line_dashed(cb, parent_pos, ob->object_to_world[3], relation_color); } /* Drawing the hook lines. */ @@ -1287,10 +1285,9 @@ static void OVERLAY_relationship_lines(OVERLAY_ExtraCallBuffers *cb, if (md->type == eModifierType_Hook) { HookModifierData *hmd = (HookModifierData *)md; float center[3]; - mul_v3_m4v3(center, ob->object_to_world().ptr(), hmd->cent); + mul_v3_m4v3(center, ob->object_to_world, hmd->cent); if (hmd->object) { - OVERLAY_extra_line_dashed( - cb, hmd->object->object_to_world().location(), center, relation_color); + OVERLAY_extra_line_dashed(cb, hmd->object->object_to_world[3], center, relation_color); } OVERLAY_extra_point(cb, center, relation_color); } @@ -1299,10 +1296,9 @@ static void OVERLAY_relationship_lines(OVERLAY_ExtraCallBuffers *cb, if (md->type == eGpencilModifierType_Hook) { HookGpencilModifierData *hmd = (HookGpencilModifierData *)md; float center[3]; - mul_v3_m4v3(center, ob->object_to_world().ptr(), hmd->cent); + mul_v3_m4v3(center, ob->object_to_world, hmd->cent); if (hmd->object) { - OVERLAY_extra_line_dashed( - cb, hmd->object->object_to_world().location(), center, relation_color); + OVERLAY_extra_line_dashed(cb, hmd->object->object_to_world[3], center, relation_color); } OVERLAY_extra_point(cb, center, relation_color); } @@ -1312,16 +1308,12 @@ static void OVERLAY_relationship_lines(OVERLAY_ExtraCallBuffers *cb, Object *rbc_ob1 = ob->rigidbody_constraint->ob1; Object *rbc_ob2 = ob->rigidbody_constraint->ob2; if (rbc_ob1 && (DRW_object_visibility_in_active_context(rbc_ob1) & OB_VISIBLE_SELF)) { - OVERLAY_extra_line_dashed(cb, - rbc_ob1->object_to_world().location(), - ob->object_to_world().location(), - relation_color); + OVERLAY_extra_line_dashed( + cb, rbc_ob1->object_to_world[3], ob->object_to_world[3], relation_color); } if (rbc_ob2 && (DRW_object_visibility_in_active_context(rbc_ob2) & OB_VISIBLE_SELF)) { - OVERLAY_extra_line_dashed(cb, - rbc_ob2->object_to_world().location(), - ob->object_to_world().location(), - relation_color); + OVERLAY_extra_line_dashed( + cb, rbc_ob2->object_to_world[3], ob->object_to_world[3], relation_color); } } @@ -1348,10 +1340,8 @@ static void OVERLAY_relationship_lines(OVERLAY_ExtraCallBuffers *cb, } if (camob) { - OVERLAY_extra_line_dashed(cb, - camob->object_to_world().location(), - ob->object_to_world().location(), - constraint_color); + OVERLAY_extra_line_dashed( + cb, camob->object_to_world[3], ob->object_to_world[3], constraint_color); } } else { @@ -1372,8 +1362,7 @@ static void OVERLAY_relationship_lines(OVERLAY_ExtraCallBuffers *cb, else { unit_m4(ct->matrix); } - OVERLAY_extra_line_dashed( - cb, ct->matrix[3], ob->object_to_world().location(), constraint_color); + OVERLAY_extra_line_dashed(cb, ct->matrix[3], ob->object_to_world[3], constraint_color); } BKE_constraint_targets_flush(curcon, &targets, true); @@ -1430,7 +1419,7 @@ static void OVERLAY_volume_extra(OVERLAY_ExtraCallBuffers *cb, copy_v3_v3(voxel_cubemat[3], min); /* move small cube into the domain (otherwise its centered on vertex of domain object) */ translate_m4(voxel_cubemat, 1.0f, 1.0f, 1.0f); - mul_m4_m4m4(voxel_cubemat, ob->object_to_world().ptr(), voxel_cubemat); + mul_m4_m4m4(voxel_cubemat, ob->object_to_world, voxel_cubemat); DRW_buffer_add_entry(cb->empty_cube, color, voxel_cubemat); } @@ -1536,15 +1525,15 @@ static void OVERLAY_object_center(OVERLAY_ExtraCallBuffers *cb, const bool is_library = ID_REAL_USERS(&ob->id) > 1 || ID_IS_LINKED(ob); BKE_view_layer_synced_ensure(scene, view_layer); if (ob == BKE_view_layer_active_object_get(view_layer)) { - DRW_buffer_add_entry(cb->center_active, ob->object_to_world().location()); + DRW_buffer_add_entry(cb->center_active, ob->object_to_world[3]); } else if (ob->base_flag & BASE_SELECTED) { DRWCallBuffer *cbuf = (is_library) ? cb->center_selected_lib : cb->center_selected; - DRW_buffer_add_entry(cbuf, ob->object_to_world().location()); + DRW_buffer_add_entry(cbuf, ob->object_to_world[3]); } else if (pd->v3d_flag & V3D_DRAW_CENTERS) { DRWCallBuffer *cbuf = (is_library) ? cb->center_deselected_lib : cb->center_deselected; - DRW_buffer_add_entry(cbuf, ob->object_to_world().location()); + DRW_buffer_add_entry(cbuf, ob->object_to_world[3]); } } @@ -1556,7 +1545,7 @@ static void OVERLAY_object_name(Object *ob, int theme_id) UI_GetThemeColor4ubv(theme_id, color); DRW_text_cache_add(dt, - ob->object_to_world().location(), + ob->object_to_world[3], ob->id.name + 2, strlen(ob->id.name + 2), 10, @@ -1615,7 +1604,7 @@ void OVERLAY_extra_cache_populate(OVERLAY_Data *vedata, Object *ob) /* Helpers for when we're transforming origins. */ if (draw_xform) { const float color_xform[4] = {0.15f, 0.15f, 0.15f, 0.7f}; - DRW_buffer_add_entry(cb->origin_xform, color_xform, ob->object_to_world().ptr()); + DRW_buffer_add_entry(cb->origin_xform, color_xform, ob->object_to_world); } /* don't show object extras in set's */ if (!from_dupli) { @@ -1635,7 +1624,7 @@ void OVERLAY_extra_cache_populate(OVERLAY_Data *vedata, Object *ob) OVERLAY_collision(cb, ob, color); } if (ob->dtx & OB_AXIS) { - DRW_buffer_add_entry(cb->empty_axes, color, ob->object_to_world().ptr()); + DRW_buffer_add_entry(cb->empty_axes, color, ob->object_to_world); } if (draw_volume) { OVERLAY_volume_extra(cb, vedata, ob, md, scene, color); diff --git a/source/blender/draw/engines/overlay/overlay_gpencil_legacy.cc b/source/blender/draw/engines/overlay/overlay_gpencil_legacy.cc index d18c8731564..745b759285e 100644 --- a/source/blender/draw/engines/overlay/overlay_gpencil_legacy.cc +++ b/source/blender/draw/engines/overlay/overlay_gpencil_legacy.cc @@ -246,7 +246,7 @@ void OVERLAY_gpencil_legacy_cache_init(OVERLAY_Data *vedata) copy_v3_v3(col_grid, gpd->grid.color); col_grid[3] = max_ff(v3d->overlay.gpencil_grid_opacity, 0.01f); - copy_m4_m4(mat, ob->object_to_world().ptr()); + copy_m4_m4(mat, ob->object_to_world); /* Rotate and scale except align to cursor. */ bGPDlayer *gpl = BKE_gpencil_layer_active_get(gpd); @@ -289,7 +289,7 @@ void OVERLAY_gpencil_legacy_cache_init(OVERLAY_Data *vedata) copy_v3_v3(mat[3], cursor->location); } else if (ts->gpencil_v3d_align & GP_PROJECT_VIEWSPACE) { - copy_v3_v3(mat[3], ob->object_to_world().location()); + copy_v3_v3(mat[3], ob->object_to_world[3]); } translate_m4(mat, gpd->grid.offset[0], gpd->grid.offset[1], 0.0f); @@ -401,7 +401,7 @@ static void overlay_gpencil_draw_stroke_color_name(bGPDlayer * /*gpl*/, UI_GetThemeColor4ubv(theme_id, color); float fpt[3]; - mul_v3_m4v3(fpt, ob->object_to_world().ptr(), &pt->x); + mul_v3_m4v3(fpt, ob->object_to_world, &pt->x); DRWTextStore *dt = DRW_text_cache_ensure(); DRW_text_cache_add(dt, diff --git a/source/blender/draw/engines/overlay/overlay_image.cc b/source/blender/draw/engines/overlay/overlay_image.cc index f5c7a4c964b..60d14bdbb10 100644 --- a/source/blender/draw/engines/overlay/overlay_image.cc +++ b/source/blender/draw/engines/overlay/overlay_image.cc @@ -295,7 +295,7 @@ void OVERLAY_image_camera_cache_populate(OVERLAY_Data *vedata, Object *ob) const DRWContextState *draw_ctx = DRW_context_state_get(); const View3D *v3d = draw_ctx->v3d; const Scene *scene = draw_ctx->scene; - const Camera *cam = static_cast(ob->data); + Camera *cam = static_cast(ob->data); const bool show_frame = BKE_object_empty_image_frame_is_visible_in_view3d(ob, draw_ctx->rv3d); @@ -386,7 +386,7 @@ void OVERLAY_image_empty_cache_populate(OVERLAY_Data *vedata, Object *ob) float image_aspect[2]; overlay_image_calc_aspect(ima, size, image_aspect); - copy_m4_m4(mat, ob->object_to_world().ptr()); + copy_m4_m4(mat, ob->object_to_world); mul_v3_fl(mat[0], image_aspect[0] * 0.5f * ob->empty_drawsize); mul_v3_fl(mat[1], image_aspect[1] * 0.5f * ob->empty_drawsize); madd_v3_v3fl(mat[3], mat[0], ob->ima_ofs[0] * 2.0f + 1.0f); diff --git a/source/blender/draw/engines/overlay/overlay_lattice.cc b/source/blender/draw/engines/overlay/overlay_lattice.cc index c9c70cc20c2..7359bf9a955 100644 --- a/source/blender/draw/engines/overlay/overlay_lattice.cc +++ b/source/blender/draw/engines/overlay/overlay_lattice.cc @@ -53,7 +53,7 @@ void OVERLAY_lattice_cache_populate(OVERLAY_Data *vedata, Object *ob) DRW_object_wire_theme_get(ob, draw_ctx->view_layer, &color); GPUBatch *geom = DRW_cache_lattice_wire_get(ob, false); - OVERLAY_extra_wire(cb, geom, ob->object_to_world().ptr(), color); + OVERLAY_extra_wire(cb, geom, ob->object_to_world, color); } void OVERLAY_edit_lattice_draw(OVERLAY_Data *vedata) diff --git a/source/blender/draw/engines/overlay/overlay_metaball.cc b/source/blender/draw/engines/overlay/overlay_metaball.cc index bc6c5b64ce2..56ce3d5ec05 100644 --- a/source/blender/draw/engines/overlay/overlay_metaball.cc +++ b/source/blender/draw/engines/overlay/overlay_metaball.cc @@ -47,10 +47,10 @@ static void metaball_instance_data_set( BoneInstanceData *data, Object *ob, const float *pos, const float radius, const float color[4]) { /* Bone point radius is 0.05. Compensate for that. */ - mul_v3_v3fl(data->mat[0], ob->object_to_world().ptr()[0], radius / 0.05f); - mul_v3_v3fl(data->mat[1], ob->object_to_world().ptr()[1], radius / 0.05f); - mul_v3_v3fl(data->mat[2], ob->object_to_world().ptr()[2], radius / 0.05f); - mul_v3_m4v3(data->mat[3], ob->object_to_world().ptr(), pos); + mul_v3_v3fl(data->mat[0], ob->object_to_world[0], radius / 0.05f); + mul_v3_v3fl(data->mat[1], ob->object_to_world[1], radius / 0.05f); + mul_v3_v3fl(data->mat[2], ob->object_to_world[2], radius / 0.05f); + mul_v3_m4v3(data->mat[3], ob->object_to_world, pos); /* WATCH: Reminder, alpha is wire-size. */ OVERLAY_bone_instance_data_set_color(data, color); } diff --git a/source/blender/draw/engines/overlay/overlay_mode_transfer.cc b/source/blender/draw/engines/overlay/overlay_mode_transfer.cc index b8a38465892..710a19389d4 100644 --- a/source/blender/draw/engines/overlay/overlay_mode_transfer.cc +++ b/source/blender/draw/engines/overlay/overlay_mode_transfer.cc @@ -25,7 +25,7 @@ void OVERLAY_mode_transfer_cache_init(OVERLAY_Data *vedata) OVERLAY_PassList *psl = vedata->psl; OVERLAY_PrivateData *pd = vedata->stl->pd; - pd->mode_transfer.time = BLI_time_now_seconds(); + pd->mode_transfer.time = BLI_check_seconds_timer(); for (int i = 0; i < 2; i++) { /* Non Meshes Pass (Camera, empties, lights ...) */ diff --git a/source/blender/draw/engines/overlay/overlay_motion_path.cc b/source/blender/draw/engines/overlay/overlay_motion_path.cc index 67371f40235..f762326800d 100644 --- a/source/blender/draw/engines/overlay/overlay_motion_path.cc +++ b/source/blender/draw/engines/overlay/overlay_motion_path.cc @@ -158,7 +158,7 @@ static void motion_path_cache(OVERLAY_Data *vedata, Object *motion_path_camera = get_camera_for_motion_path( draw_ctx, eMotionPath_BakeFlag(avs->path_bakeflag)); if (motion_path_camera) { - copy_m4_m4(camera_matrix, motion_path_camera->object_to_world().ptr()); + copy_m4_m4(camera_matrix, motion_path_camera->object_to_world); } else { unit_m4(camera_matrix); @@ -213,8 +213,9 @@ static void motion_path_cache(OVERLAY_Data *vedata, float3 vert_coordinate; copy_v3_v3(vert_coordinate, mpv->co); if (cam_eval) { - /* Projecting the point into world space from the camera's POV. */ - vert_coordinate = math::transform_point(cam_eval->object_to_world(), vert_coordinate); + /* Projecting the point into world space from the cameras pov. */ + vert_coordinate = math::transform_point(float4x4(cam_eval->object_to_world), + vert_coordinate); } if ((show_keyframes && show_keyframes_no && is_keyframe) || (show_frame_no && (i == 0))) { diff --git a/source/blender/draw/engines/overlay/overlay_next_empty.hh b/source/blender/draw/engines/overlay/overlay_next_empty.hh index ab9f42c8d76..b97ba0025e2 100644 --- a/source/blender/draw/engines/overlay/overlay_next_empty.hh +++ b/source/blender/draw/engines/overlay/overlay_next_empty.hh @@ -55,7 +55,8 @@ class Empties { CallBuffers &call_bufs = call_buffers_[int((ob_ref.object->dtx & OB_DRAW_IN_FRONT) != 0)]; float4 color = res.object_wire_color(ob_ref, state); - ExtraInstanceData data(ob_ref.object->object_to_world(), color, ob_ref.object->empty_drawsize); + ExtraInstanceData data( + float4x4(ob_ref.object->object_to_world), color, ob_ref.object->empty_drawsize); const select::ID select_id = res.select_id(ob_ref); diff --git a/source/blender/draw/engines/overlay/overlay_next_engine.cc b/source/blender/draw/engines/overlay/overlay_next_engine.cc index 1e5325b1b43..9ac1c80bdc0 100644 --- a/source/blender/draw/engines/overlay/overlay_next_engine.cc +++ b/source/blender/draw/engines/overlay/overlay_next_engine.cc @@ -17,7 +17,7 @@ #include "UI_interface.hh" -#include "BKE_duplilist.hh" +#include "BKE_duplilist.h" #include "BKE_object.hh" #include "BKE_paint.hh" diff --git a/source/blender/draw/engines/overlay/overlay_next_instance.cc b/source/blender/draw/engines/overlay/overlay_next_instance.cc index e991978b352..ceefef9cb95 100644 --- a/source/blender/draw/engines/overlay/overlay_next_instance.cc +++ b/source/blender/draw/engines/overlay/overlay_next_instance.cc @@ -269,10 +269,10 @@ BoneInstanceData::BoneInstanceData(Object *ob, const float color[4]) { /* TODO(fclem): Use C++ math API. */ - mul_v3_v3fl(this->mat[0], ob->object_to_world().ptr()[0], radius); - mul_v3_v3fl(this->mat[1], ob->object_to_world().ptr()[1], radius); - mul_v3_v3fl(this->mat[2], ob->object_to_world().ptr()[2], radius); - mul_v3_m4v3(this->mat[3], ob->object_to_world().ptr(), pos); + mul_v3_v3fl(this->mat[0], ob->object_to_world[0], radius); + mul_v3_v3fl(this->mat[1], ob->object_to_world[1], radius); + mul_v3_v3fl(this->mat[2], ob->object_to_world[2], radius); + mul_v3_m4v3(this->mat[3], ob->object_to_world, pos); /* WATCH: Reminder, alpha is wire-size. */ OVERLAY_bone_instance_data_set_color(this, color); } diff --git a/source/blender/draw/engines/overlay/overlay_outline.cc b/source/blender/draw/engines/overlay/overlay_outline.cc index 73969b8d94e..4e411dc8c76 100644 --- a/source/blender/draw/engines/overlay/overlay_outline.cc +++ b/source/blender/draw/engines/overlay/overlay_outline.cc @@ -10,17 +10,13 @@ #include "DRW_render.hh" -#include "BKE_curves.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_gpencil_legacy.h" -#include "BKE_grease_pencil.hh" #include "BKE_object.hh" #include "DNA_gpencil_legacy_types.h" -#include "ED_grease_pencil.hh" - #include "UI_resources.hh" #include "overlay_private.hh" @@ -52,7 +48,7 @@ static void gpencil_depth_plane(Object *ob, float r_plane[4]) add_v3_fl(size, 1e-8f); rescale_m4(mat, size); /* BBox space to World. */ - mul_m4_m4m4(mat, ob->object_to_world().ptr(), mat); + mul_m4_m4m4(mat, ob->object_to_world, mat); /* BBox center in world space. */ copy_v3_v3(center, mat[3]); /* View Vector. */ @@ -198,7 +194,7 @@ static void gpencil_layer_cache_populate(bGPDlayer *gpl, const bool is_screenspace = (gpd->flag & GP_DATA_STROKE_KEEPTHICKNESS) != 0; const bool is_stroke_order_3d = (gpd->draw_mode == GP_DRAWMODE_3D); - float object_scale = mat4_to_scale(iter->ob->object_to_world().ptr()); + float object_scale = mat4_to_scale(iter->ob->object_to_world); /* Negate thickness sign to tag that strokes are in screen space. * Convert to world units (by default, 1 meter = 2000 pixels). */ float thickness_scale = (is_screenspace) ? -1.0f : (gpd->pixfactor / 2000.0f); @@ -277,92 +273,6 @@ static void OVERLAY_outline_gpencil(OVERLAY_PrivateData *pd, Object *ob) pd->cfra); } -static void OVERLAY_outline_grease_pencil(OVERLAY_PrivateData *pd, Scene *scene, Object *ob) -{ - using namespace blender; - using namespace blender::ed::greasepencil; - GreasePencil &grease_pencil = *static_cast(ob->data); - /* Outlines only in object mode. */ - if (ob->mode != OB_MODE_OBJECT) { - return; - } - - float plane[4] = {0.0f, 0.0f, 0.0f, 0.0f}; - if ((grease_pencil.flag & GREASE_PENCIL_STROKE_ORDER_3D) == 0) { - gpencil_depth_plane(ob, plane); - } - - int t_offset = 0; - const Vector drawings = retrieve_visible_drawings(*scene, grease_pencil); - for (const DrawingInfo info : drawings) { - const bool is_screenspace = false; - const bool is_stroke_order_3d = (grease_pencil.flag & GREASE_PENCIL_STROKE_ORDER_3D) != 0; - - float object_scale = mat4_to_scale(ob->object_to_world().ptr()); - /* Negate thickness sign to tag that strokes are in screen space. - * Convert to world units (by default, 1 meter = 1000 pixels). */ - float thickness_scale = (is_screenspace) ? -1.0f : 1.0f / 1000.0f; - - GPUVertBuf *position_tx = draw::DRW_cache_grease_pencil_position_buffer_get(scene, ob); - GPUVertBuf *color_tx = draw::DRW_cache_grease_pencil_color_buffer_get(scene, ob); - - DRWShadingGroup *grp = DRW_shgroup_create_sub(pd->outlines_gpencil_grp); - DRW_shgroup_uniform_bool_copy(grp, "gpStrokeOrder3d", is_stroke_order_3d); - DRW_shgroup_uniform_float_copy(grp, "gpThicknessScale", object_scale); - DRW_shgroup_uniform_float_copy(grp, "gpThicknessOffset", 0.0f); - DRW_shgroup_uniform_float_copy(grp, "gpThicknessWorldScale", thickness_scale); - DRW_shgroup_uniform_vec4_copy(grp, "gpDepthPlane", plane); - DRW_shgroup_buffer_texture(grp, "gp_pos_tx", position_tx); - DRW_shgroup_buffer_texture(grp, "gp_col_tx", color_tx); - - const bke::CurvesGeometry &curves = info.drawing.strokes(); - const OffsetIndices points_by_curve = curves.points_by_curve(); - const bke::AttributeAccessor attributes = curves.attributes(); - const VArray stroke_materials = *attributes.lookup_or_default( - "material_index", bke::AttrDomain::Curve, 0); - const VArray cyclic = *attributes.lookup_or_default( - "cyclic", bke::AttrDomain::Curve, false); - - IndexMaskMemory memory; - const IndexMask visible_strokes = ed::greasepencil::retrieve_visible_strokes( - *ob, info.drawing, memory); - - visible_strokes.foreach_index([&](const int stroke_i) { - const IndexRange points = points_by_curve[stroke_i]; - const int material_index = stroke_materials[stroke_i]; - MaterialGPencilStyle *gp_style = BKE_object_material_get(ob, material_index + 1)->gp_style; - - const bool hide_material = (gp_style->flag & GP_MATERIAL_HIDE) != 0; - if (hide_material) { - return; - } - - GPUBatch *geom = draw::DRW_cache_grease_pencil_get(scene, ob); - - const bool show_stroke = (gp_style->flag & GP_MATERIAL_STROKE_SHOW) != 0; - const bool show_fill = (points.size() >= 3) && (gp_style->flag & GP_MATERIAL_FILL_SHOW) != 0; - const bool is_cyclic = cyclic[stroke_i] && (points.size() > 2); - const int num_stroke_triangles = points.size() - 2; - const int num_stroke_vertices = (points.size() + int(is_cyclic)); - - if (show_fill) { - int vfirst = t_offset * 3; - int vcount = num_stroke_triangles * 3; - DRW_shgroup_call_range(grp, ob, geom, vfirst, vcount); - } - - t_offset += num_stroke_triangles; - - if (show_stroke) { - int vfirst = t_offset * 3; - int vcount = num_stroke_vertices * 2 * 3; - DRW_shgroup_call_range(grp, ob, geom, vfirst, vcount); - } - t_offset += num_stroke_vertices * 2; - }); - } -} - static void OVERLAY_outline_volume(OVERLAY_PrivateData *pd, Object *ob) { using namespace blender::draw; @@ -416,11 +326,6 @@ void OVERLAY_outline_cache_populate(OVERLAY_Data *vedata, return; } - if (ob->type == OB_GREASE_PENCIL) { - OVERLAY_outline_grease_pencil(pd, draw_ctx->scene, ob); - return; - } - if (ob->type == OB_VOLUME) { OVERLAY_outline_volume(pd, ob); return; diff --git a/source/blender/draw/engines/overlay/overlay_paint.cc b/source/blender/draw/engines/overlay/overlay_paint.cc index eb9fed3562e..da5168862ca 100644 --- a/source/blender/draw/engines/overlay/overlay_paint.cc +++ b/source/blender/draw/engines/overlay/overlay_paint.cc @@ -249,16 +249,7 @@ void OVERLAY_paint_vertex_cache_populate(OVERLAY_Data *vedata, Object *ob) void OVERLAY_paint_weight_cache_populate(OVERLAY_Data *vedata, Object *ob) { - switch (ob->type) { - case OB_MESH: - OVERLAY_paint_vertex_cache_populate(vedata, ob); - break; - case OB_GREASE_PENCIL: - /* TODO */ - break; - default: - BLI_assert_unreachable(); - } + OVERLAY_paint_vertex_cache_populate(vedata, ob); } void OVERLAY_paint_draw(OVERLAY_Data *vedata) diff --git a/source/blender/draw/engines/overlay/overlay_private.hh b/source/blender/draw/engines/overlay/overlay_private.hh index ce3bbb8c834..e528b779211 100644 --- a/source/blender/draw/engines/overlay/overlay_private.hh +++ b/source/blender/draw/engines/overlay/overlay_private.hh @@ -8,7 +8,7 @@ #pragma once -#include "BKE_global.hh" +#include "BKE_global.h" #include "DRW_gpu_wrapper.hh" #include "DRW_render.hh" @@ -395,8 +395,6 @@ struct OVERLAY_PrivateData { float uv_opacity; - float stretch_opacity; - int image_size[2]; float image_aspect[2]; diff --git a/source/blender/draw/engines/overlay/overlay_viewer_attribute.cc b/source/blender/draw/engines/overlay/overlay_viewer_attribute.cc index 9e67441d297..04d0394b020 100644 --- a/source/blender/draw/engines/overlay/overlay_viewer_attribute.cc +++ b/source/blender/draw/engines/overlay/overlay_viewer_attribute.cc @@ -19,7 +19,7 @@ #include "BKE_attribute.hh" #include "BKE_curves.hh" #include "BKE_customdata.hh" -#include "BKE_duplilist.hh" +#include "BKE_duplilist.h" #include "BKE_geometry_set.hh" #include "draw_cache_extract.hh" @@ -93,7 +93,7 @@ static void populate_cache_for_instance(Object &object, DRWShadingGroup *sub_grp = DRW_shgroup_create_sub(pd.viewer_attribute_instance_grp); DRW_shgroup_uniform_vec4_copy(sub_grp, "ucolor", color); GPUBatch *batch = DRW_cache_curve_edge_wire_get(&object); - DRW_shgroup_call_obmat(sub_grp, batch, object.object_to_world().ptr()); + DRW_shgroup_call_obmat(sub_grp, batch, object.object_to_world); break; } case OB_CURVES: { @@ -156,8 +156,7 @@ static void populate_cache_for_geometry(Object &object, if (attribute_type_supports_viewer_overlay(meta_data->data_type)) { GPUBatch *batch = DRW_cache_curve_edge_wire_viewer_attribute_get(&object); DRW_shgroup_uniform_float_copy(pd.viewer_attribute_curve_grp, "opacity", opacity); - DRW_shgroup_call_obmat( - pd.viewer_attribute_curve_grp, batch, object.object_to_world().ptr()); + DRW_shgroup_call_obmat(pd.viewer_attribute_curve_grp, batch, object.object_to_world); } } } diff --git a/source/blender/draw/engines/overlay/overlay_viewer_text.cc b/source/blender/draw/engines/overlay/overlay_viewer_text.cc index 8889ab934c5..75a50b93dad 100644 --- a/source/blender/draw/engines/overlay/overlay_viewer_text.cc +++ b/source/blender/draw/engines/overlay/overlay_viewer_text.cc @@ -12,7 +12,7 @@ #include "BKE_attribute.hh" #include "BKE_curves.hh" -#include "BKE_duplilist.hh" +#include "BKE_duplilist.h" #include "BKE_geometry_set.hh" #include "BKE_instances.hh" #include "BKE_mesh.hh" @@ -122,7 +122,7 @@ void OVERLAY_viewer_attribute_text(const Object &object) { using namespace blender; using namespace blender::draw::overlay; - const float4x4 &object_to_world = object.object_to_world(); + const float4x4 object_to_world = float4x4(object.object_to_world); DupliObject *dupli_object = DRW_object_get_dupli(&object); if (dupli_object->preview_instance_index >= 0) { diff --git a/source/blender/draw/engines/overlay/overlay_wireframe.cc b/source/blender/draw/engines/overlay/overlay_wireframe.cc index e77e319bb99..68198091baf 100644 --- a/source/blender/draw/engines/overlay/overlay_wireframe.cc +++ b/source/blender/draw/engines/overlay/overlay_wireframe.cc @@ -14,9 +14,9 @@ #include "BKE_curve.hh" #include "BKE_displist.h" -#include "BKE_duplilist.hh" +#include "BKE_duplilist.h" #include "BKE_editmesh.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_object.hh" #include "BKE_paint.hh" #include "BKE_particle.h" @@ -141,12 +141,12 @@ static void wireframe_hair_cache_populate(OVERLAY_Data *vedata, Object *ob, Part if (collection != nullptr) { sub_v3_v3(dupli_mat[3], collection->instance_offset); } - mul_m4_m4m4(dupli_mat, dupli_parent->object_to_world().ptr(), dupli_mat); + mul_m4_m4m4(dupli_mat, dupli_parent->object_to_world, dupli_mat); } else { - copy_m4_m4(dupli_mat, dupli_object->ob->object_to_world().ptr()); + copy_m4_m4(dupli_mat, dupli_object->ob->object_to_world); invert_m4(dupli_mat); - mul_m4_m4m4(dupli_mat, ob->object_to_world().ptr(), dupli_mat); + mul_m4_m4m4(dupli_mat, ob->object_to_world, dupli_mat); } } else { @@ -227,7 +227,7 @@ void OVERLAY_wireframe_cache_populate(OVERLAY_Data *vedata, } if (geom) { - OVERLAY_extra_wire(cb, geom, ob->object_to_world().ptr(), color); + OVERLAY_extra_wire(cb, geom, ob->object_to_world, color); } } @@ -240,12 +240,12 @@ void OVERLAY_wireframe_cache_populate(OVERLAY_Data *vedata, if (dupli->wire_shgrp == cb->extra_loose_points) { float *color; DRW_object_wire_theme_get(ob, draw_ctx->view_layer, &color); - OVERLAY_extra_loose_points(cb, dupli->wire_geom, ob->object_to_world().ptr(), color); + OVERLAY_extra_loose_points(cb, dupli->wire_geom, ob->object_to_world, color); } else if (dupli->wire_shgrp == cb->extra_wire) { float *color; DRW_object_wire_theme_get(ob, draw_ctx->view_layer, &color); - OVERLAY_extra_wire(cb, dupli->wire_geom, ob->object_to_world().ptr(), color); + OVERLAY_extra_wire(cb, dupli->wire_geom, ob->object_to_world, color); } else { DRW_shgroup_call(dupli->wire_shgrp, dupli->wire_geom, ob); @@ -274,7 +274,7 @@ void OVERLAY_wireframe_cache_populate(OVERLAY_Data *vedata, GPUBatch *geom = DRW_cache_object_face_wireframe_get(ob); if (geom) { - OVERLAY_extra_loose_points(cb, geom, ob->object_to_world().ptr(), color); + OVERLAY_extra_loose_points(cb, geom, ob->object_to_world, color); } return; } @@ -328,14 +328,14 @@ void OVERLAY_wireframe_cache_populate(OVERLAY_Data *vedata, if (is_mesh_verts_only) { geom = DRW_cache_mesh_all_verts_get(ob); if (geom) { - OVERLAY_extra_loose_points(cb, geom, ob->object_to_world().ptr(), color); + OVERLAY_extra_loose_points(cb, geom, ob->object_to_world, color); shgrp = cb->extra_loose_points; } } else { geom = DRW_cache_mesh_loose_edges_get(ob); if (geom) { - OVERLAY_extra_wire(cb, geom, ob->object_to_world().ptr(), color); + OVERLAY_extra_wire(cb, geom, ob->object_to_world, color); shgrp = cb->extra_wire; } } diff --git a/source/blender/draw/engines/overlay/shaders/infos/overlay_edit_mode_info.hh b/source/blender/draw/engines/overlay/shaders/infos/overlay_edit_mode_info.hh index a997930dec1..cbedf7fab25 100644 --- a/source/blender/draw/engines/overlay/shaders/infos/overlay_edit_mode_info.hh +++ b/source/blender/draw/engines/overlay/shaders/infos/overlay_edit_mode_info.hh @@ -379,7 +379,6 @@ GPU_SHADER_CREATE_INFO(overlay_edit_uv_mask_image) GPU_SHADER_CREATE_INFO(overlay_edit_uv_stretching) .vertex_in(0, Type::VEC2, "pos") .push_constant(Type::VEC2, "aspect") - .push_constant(Type::FLOAT, "stretch_opacity") .vertex_out(overlay_edit_nopersp_color_iface) .fragment_out(0, Type::VEC4, "fragColor") .vertex_source("overlay_edit_uv_stretching_vert.glsl") diff --git a/source/blender/draw/engines/overlay/shaders/overlay_edit_uv_stretching_vert.glsl b/source/blender/draw/engines/overlay/shaders/overlay_edit_uv_stretching_vert.glsl index b3f9880b1fe..2e3a4c2e597 100644 --- a/source/blender/draw/engines/overlay/shaders/overlay_edit_uv_stretching_vert.glsl +++ b/source/blender/draw/engines/overlay/shaders/overlay_edit_uv_stretching_vert.glsl @@ -82,5 +82,5 @@ void main() #endif - finalColor = vec4(weight_to_rgb(stretch), stretch_opacity); + finalColor = vec4(weight_to_rgb(stretch), 1.0); } diff --git a/source/blender/draw/engines/overlay/shaders/overlay_motion_path_point_vert.glsl b/source/blender/draw/engines/overlay/shaders/overlay_motion_path_point_vert.glsl index 00a7f1b49bf..301d7bd15b5 100644 --- a/source/blender/draw/engines/overlay/shaders/overlay_motion_path_point_vert.glsl +++ b/source/blender/draw/engines/overlay/shaders/overlay_motion_path_point_vert.glsl @@ -17,7 +17,7 @@ void main() int frame = gl_VertexID + cacheStart; bool use_custom_color = customColor.x >= 0.0; - finalColor = (use_custom_color) ? vec4(customColor, 1.0) : colorVertex; + finalColor = (use_custom_color) ? vec4(customColor, 1.0) : vec4(1.0); /* Bias to reduce z fighting with the path */ gl_Position.z -= 1e-4; diff --git a/source/blender/draw/engines/select/select_engine.cc b/source/blender/draw/engines/select/select_engine.cc index 3a3900f8c88..ce497a7fa92 100644 --- a/source/blender/draw/engines/select/select_engine.cc +++ b/source/blender/draw/engines/select/select_engine.cc @@ -217,7 +217,7 @@ static void select_cache_populate(void *vedata, Object *ob) /* This object is not in the array. It is here to participate in the depth buffer. */ if (ob->dt >= OB_SOLID) { GPUBatch *geom_faces = DRW_mesh_batch_cache_get_surface(static_cast(ob->data)); - DRW_shgroup_call_obmat(stl->g_data->shgrp_occlude, geom_faces, ob->object_to_world().ptr()); + DRW_shgroup_call_obmat(stl->g_data->shgrp_occlude, geom_faces, ob->object_to_world); } } else if (!sel_data->in_pass) { diff --git a/source/blender/draw/engines/select/select_engine.hh b/source/blender/draw/engines/select/select_engine.hh index 92a445e0f9b..c2a80c25bae 100644 --- a/source/blender/draw/engines/select/select_engine.hh +++ b/source/blender/draw/engines/select/select_engine.hh @@ -19,9 +19,9 @@ extern RenderEngineType DRW_engine_viewport_select_type; extern DrawEngineType draw_engine_debug_select_type; #endif -struct SELECTID_Context *DRW_select_engine_context_get(); -struct GPUFrameBuffer *DRW_engine_select_framebuffer_get(); -struct GPUTexture *DRW_engine_select_texture_get(); +struct SELECTID_Context *DRW_select_engine_context_get(void); +struct GPUFrameBuffer *DRW_engine_select_framebuffer_get(void); +struct GPUTexture *DRW_engine_select_texture_get(void); /* select_instance.cc */ diff --git a/source/blender/draw/engines/select/select_instance.hh b/source/blender/draw/engines/select/select_instance.hh index d5041f65663..61cbd1c3abb 100644 --- a/source/blender/draw/engines/select/select_instance.hh +++ b/source/blender/draw/engines/select/select_instance.hh @@ -158,7 +158,7 @@ struct SelectMap { #endif } - /** IMPORTANT: Changes the draw state. Need to be called after the pass's own state_set. */ + /** IMPORTANT: Changes the draw state. Need to be called after the pass own state_set. */ void select_bind(PassSimple &pass) { if (selection_type == SelectionType::DISABLED) { @@ -173,7 +173,7 @@ struct SelectMap { pass.bind_ssbo(SELECT_ID_OUT, &select_output_buf); } - /** IMPORTANT: Changes the draw state. Need to be called after the pass's own state_set. */ + /** IMPORTANT: Changes the draw state. Need to be called after the pass own state_set. */ void select_bind(PassMain &pass) { if (selection_type == SelectionType::DISABLED) { diff --git a/source/blender/draw/engines/workbench/shaders/workbench_world_light_lib.glsl b/source/blender/draw/engines/workbench/shaders/workbench_world_light_lib.glsl index 8305e53e2a8..6d32e5cf577 100644 --- a/source/blender/draw/engines/workbench/shaders/workbench_world_light_lib.glsl +++ b/source/blender/draw/engines/workbench/shaders/workbench_world_light_lib.glsl @@ -10,7 +10,7 @@ vec4 fast_rcp(vec4 v) vec3 brdf_approx(vec3 spec_color, float roughness, float NV) { - /* Very rough approximation. We don't need it to be correct, just fast. + /* Very rough own approx. We don't need it to be correct, just fast. * Just simulate fresnel effect with roughness attenuation. */ float fresnel = exp2(-8.35 * NV) * (1.0 - roughness); return mix(spec_color, vec3(1.0), fresnel); diff --git a/source/blender/draw/engines/workbench/workbench_effect_antialiasing.cc b/source/blender/draw/engines/workbench/workbench_effect_antialiasing.cc index 7650cafd02c..c8e01c58261 100644 --- a/source/blender/draw/engines/workbench/workbench_effect_antialiasing.cc +++ b/source/blender/draw/engines/workbench/workbench_effect_antialiasing.cc @@ -111,6 +111,12 @@ static void setup_taa_weights(const float2 offset, float r_weights[9], float &r_ AntiAliasingPass::AntiAliasingPass() { + taa_accumulation_sh_ = GPU_shader_create_from_info_name("workbench_taa"); + smaa_edge_detect_sh_ = GPU_shader_create_from_info_name("workbench_smaa_stage_0"); + smaa_aa_weight_sh_ = GPU_shader_create_from_info_name("workbench_smaa_stage_1"); + smaa_resolve_sh_ = GPU_shader_create_from_info_name("workbench_smaa_stage_2"); + overlay_depth_sh_ = GPU_shader_create_from_info_name("workbench_overlay_depth"); + smaa_search_tx_.ensure_2d( GPU_R8, {SEARCHTEX_WIDTH, SEARCHTEX_HEIGHT}, GPU_TEXTURE_USAGE_SHADER_READ); GPU_texture_update(smaa_search_tx_, GPU_DATA_UBYTE, searchTexBytes); @@ -121,6 +127,15 @@ AntiAliasingPass::AntiAliasingPass() GPU_texture_filter_mode(smaa_area_tx_, true); } +AntiAliasingPass::~AntiAliasingPass() +{ + DRW_SHADER_FREE_SAFE(taa_accumulation_sh_); + DRW_SHADER_FREE_SAFE(smaa_edge_detect_sh_); + DRW_SHADER_FREE_SAFE(smaa_aa_weight_sh_); + DRW_SHADER_FREE_SAFE(smaa_resolve_sh_); + DRW_SHADER_FREE_SAFE(overlay_depth_sh_); +} + void AntiAliasingPass::init(const SceneState &scene_state) { enabled_ = scene_state.draw_aa; @@ -132,7 +147,7 @@ void AntiAliasingPass::sync(const SceneState &scene_state, SceneResources &resou overlay_depth_ps_.state_set(DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_ALWAYS | DRW_STATE_STENCIL_EQUAL); overlay_depth_ps_.state_stencil(0x00, 0xFF, uint8_t(StencilBits::OBJECT_IN_FRONT)); - overlay_depth_ps_.shader_set(ShaderCache::get().overlay_depth.get()); + overlay_depth_ps_.shader_set(overlay_depth_sh_); overlay_depth_ps_.draw_procedural(GPU_PRIM_TRIS, 1, 3); if (!enabled_) { @@ -156,14 +171,14 @@ void AntiAliasingPass::sync(const SceneState &scene_state, SceneResources &resou taa_accumulation_ps_.state_set(scene_state.sample == 0 ? DRW_STATE_WRITE_COLOR : DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND_ADD_FULL); - taa_accumulation_ps_.shader_set(ShaderCache::get().taa_accumulation.get()); + taa_accumulation_ps_.shader_set(taa_accumulation_sh_); taa_accumulation_ps_.bind_texture("colorBuffer", &resources.color_tx); taa_accumulation_ps_.push_constant("samplesWeights", weights_, 9); taa_accumulation_ps_.draw_procedural(GPU_PRIM_TRIS, 1, 3); smaa_edge_detect_ps_.init(); smaa_edge_detect_ps_.state_set(DRW_STATE_WRITE_COLOR); - smaa_edge_detect_ps_.shader_set(ShaderCache::get().smaa_edge_detect.get()); + smaa_edge_detect_ps_.shader_set(smaa_edge_detect_sh_); smaa_edge_detect_ps_.bind_texture("colorTex", &taa_accumulation_tx_); smaa_edge_detect_ps_.push_constant("viewportMetrics", &smaa_viewport_metrics_, 1); smaa_edge_detect_ps_.clear_color(float4(0.0f)); @@ -171,7 +186,7 @@ void AntiAliasingPass::sync(const SceneState &scene_state, SceneResources &resou smaa_aa_weight_ps_.init(); smaa_aa_weight_ps_.state_set(DRW_STATE_WRITE_COLOR); - smaa_aa_weight_ps_.shader_set(ShaderCache::get().smaa_aa_weight.get()); + smaa_aa_weight_ps_.shader_set(smaa_aa_weight_sh_); smaa_aa_weight_ps_.bind_texture("edgesTex", &smaa_edge_tx_); smaa_aa_weight_ps_.bind_texture("areaTex", smaa_area_tx_); smaa_aa_weight_ps_.bind_texture("searchTex", smaa_search_tx_); @@ -181,7 +196,7 @@ void AntiAliasingPass::sync(const SceneState &scene_state, SceneResources &resou smaa_resolve_ps_.init(); smaa_resolve_ps_.state_set(DRW_STATE_WRITE_COLOR); - smaa_resolve_ps_.shader_set(ShaderCache::get().smaa_resolve.get()); + smaa_resolve_ps_.shader_set(smaa_resolve_sh_); smaa_resolve_ps_.bind_texture("blendTex", &smaa_weight_tx_); smaa_resolve_ps_.bind_texture("colorTex", &taa_accumulation_tx_); smaa_resolve_ps_.push_constant("viewportMetrics", &smaa_viewport_metrics_, 1); diff --git a/source/blender/draw/engines/workbench/workbench_effect_dof.cc b/source/blender/draw/engines/workbench/workbench_effect_dof.cc index 4de4bfff9e2..d0960e02c91 100644 --- a/source/blender/draw/engines/workbench/workbench_effect_dof.cc +++ b/source/blender/draw/engines/workbench/workbench_effect_dof.cc @@ -55,6 +55,15 @@ static void square_to_circle(float x, float y, float &r, float &T) } } +DofPass::~DofPass() +{ + DRW_SHADER_FREE_SAFE(prepare_sh_); + DRW_SHADER_FREE_SAFE(downsample_sh_); + DRW_SHADER_FREE_SAFE(blur1_sh_); + DRW_SHADER_FREE_SAFE(blur2_sh_); + DRW_SHADER_FREE_SAFE(resolve_sh_); +} + void DofPass::setup_samples() { float4 *sample = samples_buf_.begin(); @@ -102,6 +111,14 @@ void DofPass::init(const SceneState &scene_state) return; } + if (prepare_sh_ == nullptr) { + prepare_sh_ = GPU_shader_create_from_info_name("workbench_effect_dof_prepare"); + downsample_sh_ = GPU_shader_create_from_info_name("workbench_effect_dof_downsample"); + blur1_sh_ = GPU_shader_create_from_info_name("workbench_effect_dof_blur1"); + blur2_sh_ = GPU_shader_create_from_info_name("workbench_effect_dof_blur2"); + resolve_sh_ = GPU_shader_create_from_info_name("workbench_effect_dof_resolve"); + } + offset_ = scene_state.sample / float(scene_state.samples_len); int2 half_res = scene_state.resolution / 2; @@ -115,7 +132,7 @@ void DofPass::init(const SceneState &scene_state) coc_halfres_tx_.ensure_mip_views(); coc_halfres_tx_.filter_mode(true); - const Camera *camera = scene_state.camera; + Camera *camera = scene_state.camera; /* Parameters */ float fstop = camera->dof.aperture_fstop; @@ -163,7 +180,7 @@ void DofPass::sync(SceneResources &resources) down_ps_.init(); down_ps_.state_set(DRW_STATE_WRITE_COLOR); - down_ps_.shader_set(ShaderCache::get().dof_prepare.get()); + down_ps_.shader_set(prepare_sh_); down_ps_.bind_texture("sceneColorTex", &resources.color_tx); down_ps_.bind_texture("sceneDepthTex", &resources.depth_tx); down_ps_.push_constant("invertedViewportSize", float2(DRW_viewport_invert_size_get())); @@ -173,14 +190,14 @@ void DofPass::sync(SceneResources &resources) down2_ps_.init(); down2_ps_.state_set(DRW_STATE_WRITE_COLOR); - down2_ps_.shader_set(ShaderCache::get().dof_downsample.get()); + down2_ps_.shader_set(downsample_sh_); down2_ps_.bind_texture("sceneColorTex", &source_tx_, sampler_state); down2_ps_.bind_texture("inputCocTex", &coc_halfres_tx_, sampler_state); down2_ps_.draw_procedural(GPU_PRIM_TRIS, 1, 3); blur_ps_.init(); blur_ps_.state_set(DRW_STATE_WRITE_COLOR); - blur_ps_.shader_set(ShaderCache::get().dof_blur1.get()); + blur_ps_.shader_set(blur1_sh_); blur_ps_.bind_ubo("samples", samples_buf_); blur_ps_.bind_texture("noiseTex", resources.jitter_tx); blur_ps_.bind_texture("inputCocTex", &coc_halfres_tx_, sampler_state); @@ -191,7 +208,7 @@ void DofPass::sync(SceneResources &resources) blur2_ps_.init(); blur2_ps_.state_set(DRW_STATE_WRITE_COLOR); - blur2_ps_.shader_set(ShaderCache::get().dof_blur2.get()); + blur2_ps_.shader_set(blur2_sh_); blur2_ps_.bind_texture("inputCocTex", &coc_halfres_tx_, sampler_state); blur2_ps_.bind_texture("blurTex", &blur_tx_); blur2_ps_.push_constant("invertedViewportSize", float2(DRW_viewport_invert_size_get())); @@ -199,7 +216,7 @@ void DofPass::sync(SceneResources &resources) resolve_ps_.init(); resolve_ps_.state_set(DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND_CUSTOM); - resolve_ps_.shader_set(ShaderCache::get().dof_resolve.get()); + resolve_ps_.shader_set(resolve_sh_); resolve_ps_.bind_texture("halfResColorTex", &source_tx_, sampler_state); resolve_ps_.bind_texture("sceneDepthTex", &resources.depth_tx); resolve_ps_.push_constant("invertedViewportSize", float2(DRW_viewport_invert_size_get())); diff --git a/source/blender/draw/engines/workbench/workbench_effect_outline.cc b/source/blender/draw/engines/workbench/workbench_effect_outline.cc index 16f85513f85..88e70050078 100644 --- a/source/blender/draw/engines/workbench/workbench_effect_outline.cc +++ b/source/blender/draw/engines/workbench/workbench_effect_outline.cc @@ -14,12 +14,21 @@ namespace blender::workbench { +OutlinePass::~OutlinePass() +{ + DRW_SHADER_FREE_SAFE(sh_); +} + void OutlinePass::init(const SceneState &scene_state) { enabled_ = scene_state.draw_outline; if (!enabled_) { return; } + + if (sh_ == nullptr) { + sh_ = GPU_shader_create_from_info_name("workbench_effect_outline"); + } } void OutlinePass::sync(SceneResources &resources) @@ -30,7 +39,7 @@ void OutlinePass::sync(SceneResources &resources) ps_.init(); ps_.state_set(DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND_ALPHA_PREMUL); - ps_.shader_set(ShaderCache::get().outline.get()); + ps_.shader_set(sh_); ps_.bind_ubo("world_data", resources.world_buf); ps_.bind_texture("objectIdBuffer", &resources.object_id_tx); ps_.draw_procedural(GPU_PRIM_TRIS, 1, 3); diff --git a/source/blender/draw/engines/workbench/workbench_engine.cc b/source/blender/draw/engines/workbench/workbench_engine.cc index 17accf49052..2df5e5f0b0b 100644 --- a/source/blender/draw/engines/workbench/workbench_engine.cc +++ b/source/blender/draw/engines/workbench/workbench_engine.cc @@ -8,7 +8,7 @@ #include "BKE_paint.hh" #include "BKE_particle.h" #include "BKE_pbvh_api.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "DEG_depsgraph_query.hh" #include "DNA_fluid_types.h" #include "ED_paint.hh" @@ -157,7 +157,7 @@ class Instance { if (object_state.sculpt_pbvh) { /* Disable frustum culling for sculpt meshes. */ /* TODO(@pragma37): Implement a cleaner way to disable frustum culling. */ - ResourceHandle handle = manager.resource_handle(ob_ref.object->object_to_world()); + ResourceHandle handle = manager.resource_handle(float4x4(ob_ref.object->object_to_world)); handle = ResourceHandle(handle.resource_index(), ob_ref.object->transflag & OB_NEG_SCALE); sculpt_sync(ob_ref, handle, object_state); emitter_handle = handle; @@ -385,7 +385,7 @@ class Instance { ModifierData *md) { /* Skip frustum culling. */ - ResourceHandle handle = manager.resource_handle(ob_ref.object->object_to_world()); + ResourceHandle handle = manager.resource_handle(float4x4(ob_ref.object->object_to_world)); Material mat = get_material(ob_ref, object_state.color_type, psys->part->omat - 1); ::Image *image = nullptr; @@ -410,7 +410,7 @@ class Instance { void curves_sync(Manager &manager, ObjectRef &ob_ref, const ObjectState &object_state) { /* Skip frustum culling. */ - ResourceHandle handle = manager.resource_handle(ob_ref.object->object_to_world()); + ResourceHandle handle = manager.resource_handle(float4x4(ob_ref.object->object_to_world)); Material mat = get_material(ob_ref, object_state.color_type); resources.material_buf.append(mat); @@ -495,17 +495,13 @@ class Instance { } } - void draw_image_render(Manager &manager, - GPUTexture *depth_tx, - GPUTexture *depth_in_front_tx, - GPUTexture *color_tx, - RenderEngine *engine = nullptr) + void draw_viewport_image_render(Manager &manager, + GPUTexture *depth_tx, + GPUTexture *depth_in_front_tx, + GPUTexture *color_tx) { BLI_assert(scene_state.sample == 0); for (auto i : IndexRange(scene_state.samples_len)) { - if (engine && RE_engine_test_break(engine)) { - break; - } if (i != 0) { scene_state.sample = i; /* Re-sync anything dependent on scene_state.sample. */ @@ -514,12 +510,6 @@ class Instance { anti_aliasing_ps.sync(scene_state, resources); } this->draw(manager, depth_tx, depth_in_front_tx, color_tx); - /* Perform render step between samples to allow - * flushing of freed GPUBackend resources. */ - if (GPU_backend_get_type() == GPU_BACKEND_METAL) { - GPU_flush(); - } - GPU_render_step(); } } }; @@ -581,7 +571,8 @@ static void workbench_draw_scene(void *vedata) DefaultTextureList *dtxl = DRW_viewport_texture_list_get(); draw::Manager *manager = DRW_manager_get(); if (DRW_state_is_viewport_image_render()) { - ved->instance->draw_image_render(*manager, dtxl->depth, dtxl->depth_in_front, dtxl->color); + ved->instance->draw_viewport_image_render( + *manager, dtxl->depth, dtxl->depth_in_front, dtxl->color); } else { ved->instance->draw_viewport(*manager, dtxl->depth, dtxl->depth_in_front, dtxl->color); @@ -593,11 +584,6 @@ static void workbench_instance_free(void *instance) delete reinterpret_cast(instance); } -static void workbench_engine_free() -{ - workbench::ShaderCache::release(); -} - static void workbench_view_update(void *vedata) { WORKBENCH_Data *ved = reinterpret_cast(vedata); @@ -655,6 +641,13 @@ static bool workbench_render_framebuffers_init() GPU_framebuffer_check_valid(dfbl->depth_only_fb, nullptr); } +#ifdef _DEBUG +/* This is just to ease GPU debugging when the frame delimiter is set to Finish */ +# define GPU_FINISH_DELIMITER() GPU_finish() +#else +# define GPU_FINISH_DELIMITER() +#endif + static void write_render_color_output(RenderLayer *layer, const char *viewname, GPUFrameBuffer *fb, @@ -679,7 +672,7 @@ static void write_render_z_output(RenderLayer *layer, const char *viewname, GPUFrameBuffer *fb, const rcti *rect, - const float4x4 &winmat) + float4x4 winmat) { RenderPass *rp = RE_pass_find_by_name(layer, RE_PASSNAME_Z, viewname); if (rp) { @@ -735,7 +728,10 @@ static void workbench_render_to_image(void *vedata, return; } + GPU_FINISH_DELIMITER(); + /* Setup */ + DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get(); const DRWContextState *draw_ctx = DRW_context_state_get(); Depsgraph *depsgraph = draw_ctx->depsgraph; @@ -755,35 +751,46 @@ static void workbench_render_to_image(void *vedata, viewmat = math::invert(viewinv); /* Render */ - /* TODO: Remove old draw manager calls. */ - DRW_cache_restart(); - DRWView *view = DRW_view_create(viewmat.ptr(), winmat.ptr(), nullptr, nullptr, nullptr); - DRW_view_default_set(view); - DRW_view_set_active(view); + do { + if (RE_engine_test_break(engine)) { + break; + } - ved->instance->init(camera_ob); + /* TODO: Remove old draw manager calls. */ + DRW_cache_restart(); + DRWView *view = DRW_view_create(viewmat.ptr(), winmat.ptr(), nullptr, nullptr, nullptr); + DRW_view_default_set(view); + DRW_view_set_active(view); - draw::Manager &manager = *DRW_manager_get(); - manager.begin_sync(); + ved->instance->init(camera_ob); - workbench_cache_init(vedata); - auto workbench_render_cache = - [](void *vedata, Object *ob, RenderEngine * /*engine*/, Depsgraph * /*depsgraph*/) { - workbench_cache_populate(vedata, ob); - }; - DRW_render_object_iter(vedata, engine, depsgraph, workbench_render_cache); - workbench_cache_finish(vedata); + DRW_manager_get()->begin_sync(); - manager.end_sync(); + workbench_cache_init(vedata); + auto workbench_render_cache = + [](void *vedata, Object *ob, RenderEngine * /*engine*/, Depsgraph * /*depsgraph*/) { + workbench_cache_populate(vedata, ob); + }; + DRW_render_object_iter(vedata, engine, depsgraph, workbench_render_cache); + workbench_cache_finish(vedata); - /* TODO: Remove old draw manager calls. */ - DRW_render_instance_buffer_finish(); - DRW_curves_update(); + DRW_manager_get()->end_sync(); - DefaultTextureList &dtxl = *DRW_viewport_texture_list_get(); - ved->instance->draw_image_render(manager, dtxl.depth, dtxl.depth_in_front, dtxl.color, engine); + /* TODO: Remove old draw manager calls. */ + DRW_render_instance_buffer_finish(); + DRW_curves_update(); + + workbench_draw_scene(vedata); + + /* Perform render step between samples to allow + * flushing of freed GPUBackend resources. */ + if (GPU_backend_get_type() == GPU_BACKEND_METAL) { + GPU_flush(); + } + GPU_render_step(); + GPU_FINISH_DELIMITER(); + } while (ved->instance->scene_state.sample + 1 < ved->instance->scene_state.samples_len); - /* Write image */ const char *viewname = RE_GetActiveRenderView(engine->re); write_render_color_output(layer, viewname, dfbl->default_fb, rect); write_render_z_output(layer, viewname, dfbl->default_fb, rect, winmat); @@ -811,7 +818,7 @@ DrawEngineType draw_engine_workbench = { /*idname*/ N_("Workbench"), /*vedata_size*/ &workbench_data_size, /*engine_init*/ &workbench_engine_init, - /*engine_free*/ &workbench_engine_free, + /*engine_free*/ nullptr, /*instance_free*/ &workbench_instance_free, /*cache_init*/ &workbench_cache_init, /*cache_populate*/ &workbench_cache_populate, diff --git a/source/blender/draw/engines/workbench/workbench_enums.hh b/source/blender/draw/engines/workbench/workbench_enums.hh index 379f3378a58..63ba54b4b3b 100644 --- a/source/blender/draw/engines/workbench/workbench_enums.hh +++ b/source/blender/draw/engines/workbench/workbench_enums.hh @@ -45,8 +45,9 @@ static inline eGeometryType geometry_type_from_object(Object *ob) enum class ePipelineType { OPAQUE = 0, TRANSPARENT, + SHADOW, }; -static constexpr int pipeline_type_len = static_cast(ePipelineType::TRANSPARENT) + 1; +static constexpr int pipeline_type_len = static_cast(ePipelineType::SHADOW) + 1; enum class eLightingType { FLAT = 0, diff --git a/source/blender/draw/engines/workbench/workbench_mesh_passes.cc b/source/blender/draw/engines/workbench/workbench_mesh_passes.cc index 750e491e116..71ce659385a 100644 --- a/source/blender/draw/engines/workbench/workbench_mesh_passes.cc +++ b/source/blender/draw/engines/workbench/workbench_mesh_passes.cc @@ -32,7 +32,10 @@ void MeshPass::init_pass(SceneResources &resources, DRWState state, int clip_pla } } -void MeshPass::init_subpasses(ePipelineType pipeline, eLightingType lighting, bool clip) +void MeshPass::init_subpasses(ePipelineType pipeline, + eLightingType lighting, + bool clip, + ShaderCache &shaders) { texture_subpass_map_.clear(); @@ -46,9 +49,9 @@ void MeshPass::init_subpasses(ePipelineType pipeline, eLightingType lighting, bo pass_names[geom][shader] = std::string(get_name(geom_type)) + std::string(get_name(shader_type)); } + GPUShader *sh = shaders.prepass_shader_get(pipeline, geom_type, shader_type, lighting, clip); PassMain::Sub *pass = &sub(pass_names[geom][shader].c_str()); - pass->shader_set( - ShaderCache::get().prepass_get(geom_type, pipeline, lighting, shader_type, clip)); + pass->shader_set(sh); passes_[geom][shader] = pass; } } @@ -112,20 +115,23 @@ void OpaquePass::sync(const SceneState &scene_state, SceneResources &resources) DRWState in_front_state = state | DRW_STATE_STENCIL_ALWAYS; gbuffer_in_front_ps_.init_pass(resources, in_front_state, scene_state.clip_planes.size()); gbuffer_in_front_ps_.state_stencil(uint8_t(StencilBits::OBJECT_IN_FRONT), 0xFF, 0x00); - gbuffer_in_front_ps_.init_subpasses(ePipelineType::OPAQUE, scene_state.lighting_type, clip); + gbuffer_in_front_ps_.init_subpasses( + ePipelineType::OPAQUE, scene_state.lighting_type, clip, resources.shader_cache); state |= DRW_STATE_STENCIL_NEQUAL; gbuffer_ps_.init_pass(resources, state, scene_state.clip_planes.size()); gbuffer_ps_.state_stencil( uint8_t(StencilBits::OBJECT), 0xFF, uint8_t(StencilBits::OBJECT_IN_FRONT)); - gbuffer_ps_.init_subpasses(ePipelineType::OPAQUE, scene_state.lighting_type, clip); + gbuffer_ps_.init_subpasses( + ePipelineType::OPAQUE, scene_state.lighting_type, clip, resources.shader_cache); deferred_ps_.init(); deferred_ps_.state_set(DRW_STATE_WRITE_COLOR); - deferred_ps_.shader_set(ShaderCache::get().resolve_get(scene_state.lighting_type, - scene_state.draw_cavity, - scene_state.draw_curvature, - scene_state.draw_shadows)); + deferred_ps_.shader_set(resources.shader_cache.resolve_shader_get(ePipelineType::OPAQUE, + scene_state.lighting_type, + scene_state.draw_cavity, + scene_state.draw_curvature, + scene_state.draw_shadows)); deferred_ps_.push_constant("forceShadowing", false); deferred_ps_.bind_ubo(WB_WORLD_SLOT, resources.world_buf); deferred_ps_.bind_texture(WB_MATCAP_SLOT, resources.matcap_tx); @@ -223,6 +229,11 @@ bool OpaquePass::is_empty() const /** \name TransparentPass * \{ */ +TransparentPass::~TransparentPass() +{ + DRW_SHADER_FREE_SAFE(resolve_sh_); +} + void TransparentPass::sync(const SceneState &scene_state, SceneResources &resources) { DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_LESS_EQUAL | DRW_STATE_BLEND_OIT | @@ -235,16 +246,20 @@ void TransparentPass::sync(const SceneState &scene_state, SceneResources &resour accumulation_ps_.state_stencil( uint8_t(StencilBits::OBJECT), 0xFF, uint8_t(StencilBits::OBJECT_IN_FRONT)); accumulation_ps_.clear_color(float4(0.0f, 0.0f, 0.0f, 1.0f)); - accumulation_ps_.init_subpasses(ePipelineType::TRANSPARENT, scene_state.lighting_type, clip); + accumulation_ps_.init_subpasses( + ePipelineType::TRANSPARENT, scene_state.lighting_type, clip, resources.shader_cache); accumulation_in_front_ps_.init_pass(resources, state, scene_state.clip_planes.size()); accumulation_in_front_ps_.clear_color(float4(0.0f, 0.0f, 0.0f, 1.0f)); accumulation_in_front_ps_.init_subpasses( - ePipelineType::TRANSPARENT, scene_state.lighting_type, clip); + ePipelineType::TRANSPARENT, scene_state.lighting_type, clip, resources.shader_cache); + if (resolve_sh_ == nullptr) { + resolve_sh_ = GPU_shader_create_from_info_name("workbench_transparent_resolve"); + } resolve_ps_.init(); resolve_ps_.state_set(DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND_ALPHA); - resolve_ps_.shader_set(ShaderCache::get().transparent_resolve.get()); + resolve_ps_.shader_set(resolve_sh_); resolve_ps_.bind_texture("transparentAccum", &accumulation_tx); resolve_ps_.bind_texture("transparentRevealage", &reveal_tx); resolve_ps_.draw_procedural(GPU_PRIM_TRIS, 1, 3); @@ -299,6 +314,11 @@ bool TransparentPass::is_empty() const /** \name TransparentDepthPass * \{ */ +TransparentDepthPass::~TransparentDepthPass() +{ + DRW_SHADER_FREE_SAFE(merge_sh_); +} + void TransparentDepthPass::sync(const SceneState &scene_state, SceneResources &resources) { DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS_EQUAL | @@ -309,10 +329,14 @@ void TransparentDepthPass::sync(const SceneState &scene_state, SceneResources &r DRWState in_front_state = state | DRW_STATE_STENCIL_ALWAYS; in_front_ps_.init_pass(resources, in_front_state, scene_state.clip_planes.size()); in_front_ps_.state_stencil(uint8_t(StencilBits::OBJECT_IN_FRONT), 0xFF, 0x00); - in_front_ps_.init_subpasses(ePipelineType::OPAQUE, eLightingType::FLAT, clip); + in_front_ps_.init_subpasses( + ePipelineType::OPAQUE, eLightingType::FLAT, clip, resources.shader_cache); + if (merge_sh_ == nullptr) { + merge_sh_ = GPU_shader_create_from_info_name("workbench_merge_depth"); + } merge_ps_.init(); - merge_ps_.shader_set(ShaderCache::get().merge_depth.get()); + merge_ps_.shader_set(merge_sh_); merge_ps_.state_set(DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS | DRW_STATE_WRITE_STENCIL | DRW_STATE_STENCIL_EQUAL); merge_ps_.state_stencil( @@ -324,7 +348,8 @@ void TransparentDepthPass::sync(const SceneState &scene_state, SceneResources &r main_ps_.init_pass(resources, state, scene_state.clip_planes.size()); main_ps_.state_stencil( uint8_t(StencilBits::OBJECT), 0xFF, uint8_t(StencilBits::OBJECT_IN_FRONT)); - main_ps_.init_subpasses(ePipelineType::OPAQUE, eLightingType::FLAT, clip); + main_ps_.init_subpasses( + ePipelineType::OPAQUE, eLightingType::FLAT, clip, resources.shader_cache); } void TransparentDepthPass::draw(Manager &manager, View &view, SceneResources &resources) diff --git a/source/blender/draw/engines/workbench/workbench_private.hh b/source/blender/draw/engines/workbench/workbench_private.hh index 66b82046896..732834c459e 100644 --- a/source/blender/draw/engines/workbench/workbench_private.hh +++ b/source/blender/draw/engines/workbench/workbench_private.hh @@ -19,107 +19,28 @@ namespace blender::workbench { using namespace draw; -class StaticShader : NonCopyable { - private: - std::string info_name_; - GPUShader *shader_ = nullptr; - - public: - StaticShader(std::string info_name) : info_name_(info_name) {} - - StaticShader() = default; - StaticShader(StaticShader &&other) = default; - StaticShader &operator=(StaticShader &&other) = default; - - ~StaticShader() - { - DRW_SHADER_FREE_SAFE(shader_); - } - - GPUShader *get() - { - if (!shader_) { - BLI_assert(!info_name_.empty()); - shader_ = GPU_shader_create_from_info_name(info_name_.c_str()); - } - return shader_; - } -}; - class ShaderCache { - private: - static ShaderCache *static_cache; - - StaticShader prepass_[geometry_type_len][pipeline_type_len][lighting_type_len][shader_type_len] - [2 /*clip*/]; - StaticShader resolve_[lighting_type_len][2 /*cavity*/][2 /*curvature*/][2 /*shadow*/]; - - StaticShader shadow_[2 /*depth_pass*/][2 /*manifold*/][2 /*cap*/]; - - StaticShader volume_[2 /*smoke*/][3 /*interpolation*/][2 /*coba*/][2 /*slice*/]; - public: - static ShaderCache &get(); - static void release(); + ~ShaderCache(); - ShaderCache(); + GPUShader *prepass_shader_get(ePipelineType pipeline_type, + eGeometryType geometry_type, + eShaderType shader_type, + eLightingType lighting_type, + bool clip); - GPUShader *prepass_get(eGeometryType geometry_type, - ePipelineType pipeline_type, - eLightingType lighting_type, - eShaderType shader_type, - bool clip) - { - return prepass_[int(geometry_type)][int(pipeline_type)][int(lighting_type)][int(shader_type)] - [clip] - .get(); - } + GPUShader *resolve_shader_get(ePipelineType pipeline_type, + eLightingType lighting_type, + bool cavity = false, + bool curvature = false, + bool shadow = false); - GPUShader *resolve_get(eLightingType lighting_type, - bool cavity = false, - bool curvature = false, - bool shadow = false) - { - return resolve_[int(lighting_type)][cavity][curvature][shadow].get(); - } - - GPUShader *shadow_get(bool depth_pass, bool manifold, bool cap = false) - { - return shadow_[depth_pass][manifold][cap].get(); - } - - GPUShader *volume_get(bool smoke, int interpolation, bool coba, bool slice) - { - return volume_[smoke][interpolation][coba][slice].get(); - } - - StaticShader extract_stencil = {"workbench_extract_stencil"}; - - /* Transparency */ - StaticShader transparent_resolve = {"workbench_transparent_resolve"}; - StaticShader merge_depth = {"workbench_merge_depth"}; - - /* ShadowView */ - StaticShader shadow_visibility_dynamic = { - "workbench_shadow_visibility_compute_dynamic_pass_type"}; - StaticShader shadow_visibility_static = {"workbench_shadow_visibility_compute_static_pass_type"}; - - /* Outline */ - StaticShader outline = {"workbench_effect_outline"}; - - /* Dof */ - StaticShader dof_prepare = {"workbench_effect_dof_prepare"}; - StaticShader dof_downsample = {"workbench_effect_dof_downsample"}; - StaticShader dof_blur1 = {"workbench_effect_dof_blur1"}; - StaticShader dof_blur2 = {"workbench_effect_dof_blur2"}; - StaticShader dof_resolve = {"workbench_effect_dof_resolve"}; - - /* AA */ - StaticShader taa_accumulation = {"workbench_taa"}; - StaticShader smaa_edge_detect = {"workbench_smaa_stage_0"}; - StaticShader smaa_aa_weight = {"workbench_smaa_stage_1"}; - StaticShader smaa_resolve = {"workbench_smaa_stage_2"}; - StaticShader overlay_depth = {"workbench_overlay_depth"}; + private: + /* TODO(fclem): We might want to change to a Map since most shader will never be compiled. */ + GPUShader *prepass_shader_cache_[pipeline_type_len][geometry_type_len][shader_type_len] + [lighting_type_len][2 /*clip*/] = {{{{{nullptr}}}}}; + GPUShader *resolve_shader_cache_[pipeline_type_len][lighting_type_len][2 /*cavity*/] + [2 /*curvature*/][2 /*shadow*/] = {{{{{nullptr}}}}}; }; struct Material { @@ -158,7 +79,7 @@ struct SceneState { bool xray_mode = false; DRWState cull_state = DRW_STATE_NO_DRAW; - Vector clip_planes; + Vector clip_planes = {}; float4 background_color = float4(0); @@ -224,8 +145,18 @@ class CavityEffect { class StencilViewWorkaround { private: Texture stencil_copy_tx_ = "stencil_copy_tx"; + GPUShader *stencil_copy_sh_ = nullptr; public: + StencilViewWorkaround() + { + stencil_copy_sh_ = GPU_shader_create_from_info_name("workbench_extract_stencil"); + } + ~StencilViewWorkaround() + { + DRW_SHADER_FREE_SAFE(stencil_copy_sh_); + } + /** WARNING: Should only be called at render time. * When the workaround path is active, * the returned texture won't stay in sync with the stencil_src, @@ -247,7 +178,7 @@ class StencilViewWorkaround { ps.clear_color(float4(0)); ps.state_set(DRW_STATE_WRITE_COLOR | DRW_STATE_STENCIL_NEQUAL); ps.state_stencil(0x00, 0x00, 0xFF); - ps.shader_set(ShaderCache::get().extract_stencil.get()); + ps.shader_set(stencil_copy_sh_); ps.draw_procedural(GPU_PRIM_TRIS, 1, 3); Framebuffer fb; @@ -263,6 +194,8 @@ class StencilViewWorkaround { struct SceneResources { static const int jitter_tx_size = 64; + ShaderCache shader_cache = {}; + StringRefNull current_matcap = {}; Texture matcap_tx = "matcap_tx"; @@ -293,7 +226,7 @@ class MeshPass : public PassMain { private: using TextureSubPassKey = std::pair; - Map texture_subpass_map_; + Map texture_subpass_map_ = {}; PassMain::Sub *passes_[geometry_type_len][shader_type_len] = {{nullptr}}; @@ -306,7 +239,10 @@ class MeshPass : public PassMain { bool is_empty() const; void init_pass(SceneResources &resources, DRWState state, int clip_planes); - void init_subpasses(ePipelineType pipeline, eLightingType lighting, bool clip); + void init_subpasses(ePipelineType pipeline, + eLightingType lighting, + bool clip, + ShaderCache &shaders); PassMain::Sub &get_subpass(eGeometryType geometry_type, ::Image *image = nullptr, @@ -347,6 +283,9 @@ class OpaquePass { }; class TransparentPass { + private: + GPUShader *resolve_sh_ = nullptr; + public: TextureFromPool accumulation_tx = {"accumulation_accumulation_tx"}; TextureFromPool reveal_tx = {"accumulation_reveal_tx"}; @@ -357,12 +296,17 @@ class TransparentPass { PassSimple resolve_ps_ = {"Transparent.Resolve"}; Framebuffer resolve_fb = {}; + ~TransparentPass(); + void sync(const SceneState &scene_state, SceneResources &resources); void draw(Manager &manager, View &view, SceneResources &resources, int2 resolution); bool is_empty() const; }; class TransparentDepthPass { + private: + GPUShader *merge_sh_ = nullptr; + public: MeshPass main_ps_ = {"TransparentDepth.Main"}; Framebuffer main_fb = {"TransparentDepth.Main"}; @@ -371,13 +315,13 @@ class TransparentDepthPass { PassSimple merge_ps_ = {"TransparentDepth.Merge"}; Framebuffer merge_fb = {"TransparentDepth.Merge"}; + ~TransparentDepthPass(); + void sync(const SceneState &scene_state, SceneResources &resources); void draw(Manager &manager, View &view, SceneResources &resources); bool is_empty() const; }; -#define DEBUG_SHADOW_VOLUME 0 - class ShadowPass { private: enum PassType { PASS = 0, FAIL, FORCED_FAIL, MAX }; @@ -391,8 +335,12 @@ class ShadowPass { VisibilityBuf pass_visibility_buf_ = {}; VisibilityBuf fail_visibility_buf_ = {}; + GPUShader *dynamic_pass_type_shader_; + GPUShader *static_pass_type_shader_; + public: - ShadowView() : View("ShadowPass.View"){}; + ShadowView(); + ~ShadowView(); void setup(View &view, float3 light_direction, bool force_fail_method); bool debug_object_culling(Object *ob); @@ -420,10 +368,16 @@ class ShadowPass { PassMain::Sub *passes_[PassType::MAX][2][2] = {{{nullptr}}}; PassMain::Sub *&get_pass_ptr(PassType type, bool manifold, bool cap = false); + /* [Is Pass Technique][Is Manifold][Is Cap] */ + GPUShader *shaders_[2][2][2] = {{{nullptr}}}; + GPUShader *get_shader(bool depth_pass, bool manifold, bool cap = false); + TextureFromPool depth_tx_ = {}; Framebuffer fb_ = {}; public: + ~ShadowPass(); + void init(const SceneState &scene_state, SceneResources &resources); void update(); void sync(); @@ -453,7 +407,11 @@ class VolumePass { GPUTexture *stencil_tx_ = nullptr; + GPUShader *shaders_[2 /*slice*/][2 /*coba*/][3 /*interpolation*/][2 /*smoke*/]; + public: + ~VolumePass(); + void sync(SceneResources &resources); void object_sync_volume(Manager &manager, @@ -471,6 +429,8 @@ class VolumePass { void draw(Manager &manager, View &view, SceneResources &resources); private: + GPUShader *get_shader(bool slice, bool coba, int interpolation, bool smoke); + void draw_slice_ps(Manager &manager, PassMain::Sub &ps, ObjectRef &ob_ref, @@ -490,9 +450,12 @@ class OutlinePass { bool enabled_ = false; PassSimple ps_ = PassSimple("Workbench.Outline"); + GPUShader *sh_ = nullptr; Framebuffer fb_ = Framebuffer("Workbench.Outline"); public: + ~OutlinePass(); + void init(const SceneState &scene_state); void sync(SceneResources &resources); void draw(Manager &manager, SceneResources &resources); @@ -518,6 +481,12 @@ class DofPass { Framebuffer blur2_fb_ = {}; Framebuffer resolve_fb_ = {}; + GPUShader *prepare_sh_ = nullptr; + GPUShader *downsample_sh_ = nullptr; + GPUShader *blur1_sh_ = nullptr; + GPUShader *blur2_sh_ = nullptr; + GPUShader *resolve_sh_ = nullptr; + PassSimple down_ps_ = {"Workbench.DoF.DownSample"}; PassSimple down2_ps_ = {"Workbench.DoF.DownSample2"}; PassSimple blur_ps_ = {"Workbench.DoF.Blur"}; @@ -534,6 +503,8 @@ class DofPass { float ratio_ = 0; public: + ~DofPass(); + void init(const SceneState &scene_state); void sync(SceneResources &resources); void draw(Manager &manager, View &view, SceneResources &resources, int2 resolution); @@ -571,6 +542,12 @@ class AntiAliasingPass { float4 smaa_viewport_metrics_ = float4(0); float smaa_mix_factor_ = 0; + GPUShader *taa_accumulation_sh_ = nullptr; + GPUShader *smaa_edge_detect_sh_ = nullptr; + GPUShader *smaa_aa_weight_sh_ = nullptr; + GPUShader *smaa_resolve_sh_ = nullptr; + GPUShader *overlay_depth_sh_ = nullptr; + PassSimple taa_accumulation_ps_ = {"TAA.Accumulation"}; PassSimple smaa_edge_detect_ps_ = {"SMAA.EdgeDetect"}; PassSimple smaa_aa_weight_ps_ = {"SMAA.BlendWeights"}; @@ -579,6 +556,7 @@ class AntiAliasingPass { public: AntiAliasingPass(); + ~AntiAliasingPass(); void init(const SceneState &scene_state); void sync(const SceneState &scene_state, SceneResources &resources); diff --git a/source/blender/draw/engines/workbench/workbench_resources.cc b/source/blender/draw/engines/workbench/workbench_resources.cc index d423776a2bc..2e549d77777 100644 --- a/source/blender/draw/engines/workbench/workbench_resources.cc +++ b/source/blender/draw/engines/workbench/workbench_resources.cc @@ -21,7 +21,7 @@ static bool get_matcap_tx(Texture &matcap_tx, StudioLight &studio_light) if (matcap_diffuse && matcap_diffuse->float_buffer.data) { int layers = 1; float *buffer = matcap_diffuse->float_buffer.data; - Vector combined_buffer; + Vector combined_buffer = {}; if (matcap_specular && matcap_specular->float_buffer.data) { int size = matcap_diffuse->x * matcap_diffuse->y * 4; @@ -55,7 +55,7 @@ static float4x4 get_world_shading_rotation_matrix(float studiolight_rot_z) } static LightData get_light_data_from_studio_solidlight(const SolidLight *sl, - const float4x4 &world_shading_rotation) + float4x4 world_shading_rotation) { LightData light = {}; if (sl && sl->flag) { diff --git a/source/blender/draw/engines/workbench/workbench_shader_cache.cc b/source/blender/draw/engines/workbench/workbench_shader_cache.cc index 003e4931339..d814323a2bb 100644 --- a/source/blender/draw/engines/workbench/workbench_shader_cache.cc +++ b/source/blender/draw/engines/workbench/workbench_shader_cache.cc @@ -6,92 +6,132 @@ namespace blender::workbench { -ShaderCache *ShaderCache::static_cache = nullptr; - -ShaderCache &ShaderCache::get() +ShaderCache::~ShaderCache() { - if (!ShaderCache::static_cache) { - ShaderCache::static_cache = new ShaderCache(); - } - return *ShaderCache::static_cache; -} - -void ShaderCache::release() -{ - if (ShaderCache::static_cache) { - delete ShaderCache::static_cache; - ShaderCache::static_cache = nullptr; - } -} - -ShaderCache::ShaderCache() -{ - std::string geometries[] = {"_mesh", "_curves", "_ptcloud"}; - std::string pipelines[] = {"_opaque", "_transparent"}; - std::string lightings[] = {"_flat", "_studio", "_matcap"}; - std::string shaders[] = {"_material", "_texture"}; - std::string clip[] = {"_no_clip", "_clip"}; - static_assert(std::size(geometries) == geometry_type_len); - static_assert(std::size(pipelines) == pipeline_type_len); - static_assert(std::size(lightings) == lighting_type_len); - static_assert(std::size(shaders) == shader_type_len); - - for (auto g : IndexRange(geometry_type_len)) { - for (auto p : IndexRange(pipeline_type_len)) { - for (auto l : IndexRange(lighting_type_len)) { - for (auto s : IndexRange(shader_type_len)) { - for (auto c : IndexRange(2) /*clip*/) { - prepass_[g][p][l][s][c] = {"workbench_prepass" + geometries[g] + pipelines[p] + - lightings[l] + shaders[s] + clip[c]}; + for (auto i : IndexRange(pipeline_type_len)) { + for (auto j : IndexRange(geometry_type_len)) { + for (auto k : IndexRange(shader_type_len)) { + for (auto l : IndexRange(lighting_type_len)) { + for (auto m : IndexRange(2) /*clip*/) { + DRW_SHADER_FREE_SAFE(prepass_shader_cache_[i][j][k][l][m]); } } } } } - - std::string cavity[] = {"_no_cavity", "_cavity"}; - std::string curvature[] = {"_no_curvature", "_curvature"}; - std::string shadow[] = {"_no_shadow", "_shadow"}; - - for (auto l : IndexRange(lighting_type_len)) { - for (auto ca : IndexRange(2) /*cavity*/) { - for (auto cu : IndexRange(2) /*curvature*/) { - for (auto s : IndexRange(2) /*shadow*/) { - resolve_[l][ca][cu][s] = {"workbench_resolve_opaque" + lightings[l] + cavity[ca] + - curvature[cu] + shadow[s]}; - } - } - } - } - - std::string pass[] = {"_fail", "_pass"}; - std::string manifold[] = {"_no_manifold", "_manifold"}; - std::string caps[] = {"_no_caps", "_caps"}; - - for (auto p : IndexRange(2) /*pass*/) { - for (auto m : IndexRange(2) /*manifold*/) { - for (auto c : IndexRange(2) /*caps*/) { - shadow_[p][m][c] = {"workbench_shadow" + pass[p] + manifold[m] + caps[c] + - (DEBUG_SHADOW_VOLUME ? "_debug" : "")}; - } - } - } - - std::string smoke[] = {"_object", "_smoke"}; - std::string interpolation[] = {"_linear", "_cubic", "_closest"}; - std::string coba[] = {"_no_coba", "_coba"}; - std::string slice[] = {"_no_slice", "_slice"}; - - for (auto sm : IndexRange(2) /*smoke*/) { - for (auto i : IndexRange(3) /*interpolation*/) { - for (auto c : IndexRange(2) /*coba*/) { - for (auto sl : IndexRange(2) /*slice*/) { - volume_[sm][i][c][sl] = {"workbench_volume" + smoke[sm] + interpolation[i] + coba[c] + - slice[sl]}; + for (auto i : IndexRange(pipeline_type_len)) { + for (auto j : IndexRange(lighting_type_len)) { + for (auto k : IndexRange(2) /*cavity*/) { + for (auto l : IndexRange(2) /*curvature*/) { + for (auto m : IndexRange(2) /*shadow*/) { + DRW_SHADER_FREE_SAFE(resolve_shader_cache_[i][j][k][l][m]); + } } } } } } +GPUShader *ShaderCache::prepass_shader_get(ePipelineType pipeline_type, + eGeometryType geometry_type, + eShaderType shader_type, + eLightingType lighting_type, + bool clip) +{ + GPUShader *&shader_ptr = prepass_shader_cache_[int(pipeline_type)][int(geometry_type)][int( + shader_type)][int(lighting_type)][clip ? 1 : 0]; + + if (shader_ptr != nullptr) { + return shader_ptr; + } + std::string info_name = "workbench_prepass_"; + switch (geometry_type) { + case eGeometryType::MESH: + info_name += "mesh_"; + break; + case eGeometryType::CURVES: + info_name += "curves_"; + break; + case eGeometryType::POINTCLOUD: + info_name += "ptcloud_"; + break; + } + switch (pipeline_type) { + case ePipelineType::OPAQUE: + info_name += "opaque_"; + break; + case ePipelineType::TRANSPARENT: + info_name += "transparent_"; + break; + case ePipelineType::SHADOW: + info_name += "shadow_"; + break; + } + switch (lighting_type) { + case eLightingType::FLAT: + info_name += "flat_"; + break; + case eLightingType::STUDIO: + info_name += "studio_"; + break; + case eLightingType::MATCAP: + info_name += "matcap_"; + break; + } + switch (shader_type) { + case eShaderType::MATERIAL: + info_name += "material"; + break; + case eShaderType::TEXTURE: + info_name += "texture"; + break; + } + info_name += clip ? "_clip" : "_no_clip"; + shader_ptr = GPU_shader_create_from_info_name(info_name.c_str()); + return shader_ptr; +} + +GPUShader *ShaderCache::resolve_shader_get(ePipelineType pipeline_type, + eLightingType lighting_type, + bool cavity, + bool curvature, + bool shadow) +{ + GPUShader *&shader_ptr = + resolve_shader_cache_[int(pipeline_type)][int(lighting_type)][cavity][curvature][shadow]; + + if (shader_ptr != nullptr) { + return shader_ptr; + } + std::string info_name = "workbench_resolve_"; + switch (pipeline_type) { + case ePipelineType::OPAQUE: + info_name += "opaque_"; + break; + case ePipelineType::TRANSPARENT: + info_name += "transparent_"; + break; + case ePipelineType::SHADOW: + BLI_assert_unreachable(); + break; + } + switch (lighting_type) { + case eLightingType::FLAT: + info_name += "flat"; + break; + case eLightingType::STUDIO: + info_name += "studio"; + break; + case eLightingType::MATCAP: + info_name += "matcap"; + break; + } + info_name += cavity ? "_cavity" : "_no_cavity"; + info_name += curvature ? "_curvature" : "_no_curvature"; + info_name += shadow ? "_shadow" : "_no_shadow"; + + shader_ptr = GPU_shader_create_from_info_name(info_name.c_str()); + return shader_ptr; +} + } // namespace blender::workbench diff --git a/source/blender/draw/engines/workbench/workbench_shadow.cc b/source/blender/draw/engines/workbench/workbench_shadow.cc index a46d1f697e7..96651b1da8b 100644 --- a/source/blender/draw/engines/workbench/workbench_shadow.cc +++ b/source/blender/draw/engines/workbench/workbench_shadow.cc @@ -21,8 +21,17 @@ #include "workbench_private.hh" +#define DEBUG_SHADOW_VOLUME 0 + namespace blender::workbench { +ShadowPass::ShadowView::ShadowView() : View("ShadowPass.View"){}; +ShadowPass::ShadowView::~ShadowView() +{ + DRW_SHADER_FREE_SAFE(dynamic_pass_type_shader_); + DRW_SHADER_FREE_SAFE(static_pass_type_shader_); +} + void ShadowPass::ShadowView::setup(View &view, float3 light_direction, bool force_fail_method) { force_fail_method_ = force_fail_method; @@ -96,8 +105,8 @@ void ShadowPass::ShadowView::setup(View &view, float3 light_direction, bool forc float4 frustum_planes[6]; DRW_culling_frustum_planes_get(nullptr, (float(*)[4])frustum_planes); - Vector faces_result; - Vector corners_result; + Vector faces_result = {}; + Vector corners_result = {}; /* "Unlit" frustum faces are left "as-is" */ @@ -181,7 +190,7 @@ bool ShadowPass::ShadowView::debug_object_culling(Object *ob) float4 plane = extruded_frustum_.planes[p]; bool separating_axis = true; for (float3 corner : bb.vec) { - corner = math::transform_point(ob->object_to_world(), corner); + corner = math::transform_point(float4x4(ob->object_to_world), corner); float signed_distance = math::dot(corner, float3(plane)) - plane.w; if (signed_distance <= 0) { separating_axis = false; @@ -235,9 +244,18 @@ void ShadowPass::ShadowView::compute_visibility(ObjectBoundsBuf &bounds, if (do_visibility_) { /* TODO(@pragma37): Use regular culling for the caps pass. */ - GPUShader *shader = current_pass_type_ == ShadowPass::FORCED_FAIL ? - ShaderCache::get().shadow_visibility_static.get() : - ShaderCache::get().shadow_visibility_dynamic.get(); + + if (dynamic_pass_type_shader_ == nullptr) { + dynamic_pass_type_shader_ = GPU_shader_create_from_info_name( + "workbench_shadow_visibility_compute_dynamic_pass_type"); + } + if (static_pass_type_shader_ == nullptr) { + static_pass_type_shader_ = GPU_shader_create_from_info_name( + "workbench_shadow_visibility_compute_static_pass_type"); + } + + GPUShader *shader = current_pass_type_ == ShadowPass::FORCED_FAIL ? static_pass_type_shader_ : + dynamic_pass_type_shader_; GPU_shader_bind(shader); GPU_shader_uniform_1i(shader, "resource_len", resource_len); GPU_shader_uniform_1i(shader, "view_len", view_len_); @@ -278,11 +296,39 @@ VisibilityBuf &ShadowPass::ShadowView::get_visibility_buffer() return visibility_buf_; } +ShadowPass::~ShadowPass() +{ + for (int depth_pass : IndexRange(2)) { + for (int manifold : IndexRange(2)) { + for (int cap : IndexRange(2)) { + DRW_SHADER_FREE_SAFE(shaders_[depth_pass][manifold][cap]); + } + } + } +} + PassMain::Sub *&ShadowPass::get_pass_ptr(PassType type, bool manifold, bool cap /*=false*/) { return passes_[type][manifold][cap]; } +GPUShader *ShadowPass::get_shader(bool depth_pass, bool manifold, bool cap /*=false*/) +{ + GPUShader *&shader = shaders_[depth_pass][manifold][cap]; + + if (shader == nullptr) { + std::string create_info_name = "workbench_shadow"; + create_info_name += (depth_pass) ? "_pass" : "_fail"; + create_info_name += (manifold) ? "_manifold" : "_no_manifold"; + create_info_name += (cap) ? "_caps" : "_no_caps"; +#if DEBUG_SHADOW_VOLUME + create_info_name += "_debug"; +#endif + shader = GPU_shader_create_from_info_name(create_info_name.c_str()); + } + return shader; +} + void ShadowPass::init(const SceneState &scene_state, SceneResources &resources) { enabled_ = scene_state.draw_shadows; @@ -351,7 +397,7 @@ void ShadowPass::sync() for (bool manifold : {false, true}) { PassMain::Sub *&ps = get_pass_ptr(PASS, manifold); ps = &pass_ps_.sub(manifold ? "manifold" : "non_manifold"); - ps->shader_set(ShaderCache::get().shadow_get(true, manifold)); + ps->shader_set(get_shader(true, manifold)); ps->bind_ubo("pass_data", pass_data_); for (PassType fail_type : {FAIL, FORCED_FAIL}) { @@ -359,12 +405,12 @@ void ShadowPass::sync() PassMain::Sub *&ps = get_pass_ptr(fail_type, manifold, false); ps = &ps_main.sub(manifold ? "NoCaps.manifold" : "NoCaps.non_manifold"); - ps->shader_set(ShaderCache::get().shadow_get(false, manifold, false)); + ps->shader_set(get_shader(false, manifold, false)); ps->bind_ubo("pass_data", pass_data_); PassMain::Sub *&caps_ps = get_pass_ptr(fail_type, manifold, true); caps_ps = &ps_main.sub(manifold ? "Caps.manifold" : "Caps.non_manifold"); - caps_ps->shader_set(ShaderCache::get().shadow_get(false, manifold, true)); + caps_ps->shader_set(get_shader(false, manifold, true)); caps_ps->bind_ubo("pass_data", pass_data_); } } diff --git a/source/blender/draw/engines/workbench/workbench_volume.cc b/source/blender/draw/engines/workbench/workbench_volume.cc index b05173a984b..5b66fdeb203 100644 --- a/source/blender/draw/engines/workbench/workbench_volume.cc +++ b/source/blender/draw/engines/workbench/workbench_volume.cc @@ -12,6 +12,18 @@ namespace blender::workbench { +VolumePass::~VolumePass() +{ + GPUShader **sh_p = &shaders_[0][0][0][0]; + const int n = ARRAY_SIZE(shaders_); + for (int i = 0; i < n; i++, sh_p++) { + GPUShader *sh = *sh_p; + if (sh) { + GPU_shader_free(sh); + } + } +} + void VolumePass::sync(SceneResources &resources) { active_ = false; @@ -49,12 +61,11 @@ void VolumePass::object_sync_volume(Manager &manager, const bool use_slice = (volume->display.axis_slice_method == AXIS_SLICE_SINGLE); - sub_ps.shader_set(ShaderCache::get().volume_get( - false, volume->display.interpolation_method, false, use_slice)); + sub_ps.shader_set(get_shader(use_slice, false, volume->display.interpolation_method, false)); sub_ps.push_constant("do_depth_test", scene_state.shading.type >= OB_SOLID); const float density_scale = volume->display.density * - BKE_volume_density_scale(volume, ob->object_to_world().ptr()); + BKE_volume_density_scale(volume, ob->object_to_world); sub_ps.bind_texture("depthBuffer", &resources.depth_tx); sub_ps.bind_texture("stencil_tx", &stencil_tx_); @@ -71,7 +82,7 @@ void VolumePass::object_sync_volume(Manager &manager, manager, sub_ps, ob_ref, volume->display.slice_axis, volume->display.slice_depth); } else { - float4x4 texture_to_world = ob->object_to_world() * float4x4(grid->texture_to_object); + float4x4 texture_to_world = float4x4(ob->object_to_world) * float4x4(grid->texture_to_object); float3 world_size = math::to_scale(texture_to_world); int3 resolution; @@ -117,8 +128,7 @@ void VolumePass::object_sync_modifier(Manager &manager, const bool use_slice = settings.axis_slice_method == AXIS_SLICE_SINGLE; - sub_ps.shader_set( - ShaderCache::get().volume_get(true, settings.interp_method, settings.use_coba, use_slice)); + sub_ps.shader_set(get_shader(use_slice, settings.use_coba, settings.interp_method, true)); sub_ps.push_constant("do_depth_test", scene_state.shading.type >= OB_SOLID); if (settings.use_coba) { @@ -192,6 +202,33 @@ void VolumePass::draw(Manager &manager, View &view, SceneResources &resources) manager.submit(ps_, view); } +GPUShader *VolumePass::get_shader(bool slice, bool coba, int interpolation, bool smoke) +{ + GPUShader *&shader = shaders_[slice][coba][interpolation][smoke]; + + if (shader == nullptr) { + std::string create_info_name = "workbench_volume"; + create_info_name += (smoke) ? "_smoke" : "_object"; + switch (interpolation) { + case VOLUME_DISPLAY_INTERP_LINEAR: + create_info_name += "_linear"; + break; + case VOLUME_DISPLAY_INTERP_CUBIC: + create_info_name += "_cubic"; + break; + case VOLUME_DISPLAY_INTERP_CLOSEST: + create_info_name += "_closest"; + break; + default: + BLI_assert_unreachable(); + } + create_info_name += (coba) ? "_coba" : "_no_coba"; + create_info_name += (slice) ? "_slice" : "_no_slice"; + shader = GPU_shader_create_from_info_name(create_info_name.c_str()); + } + return shader; +} + void VolumePass::draw_slice_ps( Manager &manager, PassMain::Sub &ps, ObjectRef &ob_ref, int slice_axis_enum, float slice_depth) { diff --git a/source/blender/draw/intern/DRW_gpu_wrapper.hh b/source/blender/draw/intern/DRW_gpu_wrapper.hh index e6c20e49e53..2947eb60dac 100644 --- a/source/blender/draw/intern/DRW_gpu_wrapper.hh +++ b/source/blender/draw/intern/DRW_gpu_wrapper.hh @@ -64,7 +64,7 @@ #include "draw_manager.h" #include "draw_texture_pool.h" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BLI_math_vector_types.hh" #include "BLI_span.hh" @@ -75,7 +75,7 @@ #include "GPU_framebuffer.h" #include "GPU_storage_buffer.h" #include "GPU_texture.h" -#include "GPU_uniform_buffer.hh" +#include "GPU_uniform_buffer.h" namespace blender::draw { @@ -462,7 +462,7 @@ class StorageVectorBuffer : public StorageArrayBuffer { new (ptr) T(std::forward(value)...); } - void extend(const Span values) + void extend(const Span &values) { /* TODO(fclem): Optimize to a single memcpy. */ for (auto v : values) { diff --git a/source/blender/draw/intern/DRW_render.hh b/source/blender/draw/intern/DRW_render.hh index 48ba694fdf4..6ac95de8866 100644 --- a/source/blender/draw/intern/DRW_render.hh +++ b/source/blender/draw/intern/DRW_render.hh @@ -19,9 +19,9 @@ #include "BKE_layer.hh" #include "BKE_material.h" #include "BKE_pbvh.hh" -#include "BKE_scene.hh" +#include "BKE_scene.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_light_types.h" #include "DNA_material_types.h" @@ -35,7 +35,7 @@ #include "GPU_shader.h" #include "GPU_storage_buffer.h" #include "GPU_texture.h" -#include "GPU_uniform_buffer.hh" +#include "GPU_uniform_buffer.h" #include "draw_cache.hh" #include "draw_common.h" diff --git a/source/blender/draw/intern/attribute_convert.cc b/source/blender/draw/intern/attribute_convert.cc index b6adb38a9c5..45e4e2cf4af 100644 --- a/source/blender/draw/intern/attribute_convert.cc +++ b/source/blender/draw/intern/attribute_convert.cc @@ -23,13 +23,11 @@ GPUVertFormat init_format_for_attribute(const eCustomDataType data_type, bke::attribute_math::convert_to_static_type(data_type, [&](auto dummy) { using T = decltype(dummy); using Converter = AttributeConverter; - if constexpr (!std::is_void_v) { - GPU_vertformat_attr_add(&format, - vbo_name.c_str(), - Converter::gpu_component_type, - Converter::gpu_component_len, - Converter::gpu_fetch_mode); - } + GPU_vertformat_attr_add(&format, + vbo_name.c_str(), + Converter::gpu_component_type, + Converter::gpu_component_len, + Converter::gpu_fetch_mode); }); return format; } @@ -40,20 +38,18 @@ void vertbuf_data_extract_direct(const GSpan attribute, GPUVertBuf &vbo) using T = decltype(dummy); using Converter = AttributeConverter; using VBOType = typename Converter::VBOType; - if constexpr (!std::is_void_v) { - const Span src = attribute.typed(); - MutableSpan data(static_cast(GPU_vertbuf_get_data(&vbo)), - attribute.size()); - if constexpr (std::is_same_v) { - array_utils::copy(src, data); - } - else { - threading::parallel_for(src.index_range(), 8192, [&](const IndexRange range) { - for (const int i : range) { - data[i] = Converter::convert(src[i]); - } - }); - } + const Span src = attribute.typed(); + MutableSpan data(static_cast(GPU_vertbuf_get_data(&vbo)), + attribute.size()); + if constexpr (std::is_same_v) { + array_utils::copy(src, data); + } + else { + threading::parallel_for(src.index_range(), 8192, [&](const IndexRange range) { + for (const int i : range) { + data[i] = Converter::convert(src[i]); + } + }); } }); } diff --git a/source/blender/draw/intern/draw_cache.hh b/source/blender/draw/intern/draw_cache.hh index 65b21b752ba..920dbbe886e 100644 --- a/source/blender/draw/intern/draw_cache.hh +++ b/source/blender/draw/intern/draw_cache.hh @@ -25,13 +25,13 @@ struct Scene; /** * Shape resolution level of detail. */ -enum eDRWLevelOfDetail { +typedef enum eDRWLevelOfDetail { DRW_LOD_LOW = 0, DRW_LOD_MEDIUM = 1, DRW_LOD_HIGH = 2, DRW_LOD_MAX, /* Max number of level of detail */ -}; +} eDRWLevelOfDetail; void DRW_shape_cache_free(); diff --git a/source/blender/draw/intern/draw_cache_extract.hh b/source/blender/draw/intern/draw_cache_extract.hh index 287483628f7..12661be7d00 100644 --- a/source/blender/draw/intern/draw_cache_extract.hh +++ b/source/blender/draw/intern/draw_cache_extract.hh @@ -8,7 +8,6 @@ #pragma once -#include "BLI_math_matrix_types.hh" #include "BLI_utildefines.h" #include "GPU_shader.h" @@ -75,8 +74,8 @@ struct MeshBufferList { * (except fdots and skin roots). For some VBOs, it extends to (in this exact order) : * loops + loose_edges * 2 + loose_verts */ struct { - GPUVertBuf *pos; /* extend */ - GPUVertBuf *nor; /* extend */ + GPUVertBuf *pos_nor; /* extend */ + GPUVertBuf *lnor; /* extend */ GPUVertBuf *edge_fac; /* extend */ GPUVertBuf *weights; /* extend */ GPUVertBuf *uv; @@ -102,7 +101,6 @@ struct MeshBufferList { GPUVertBuf *fdot_idx; GPUVertBuf *attr[GPU_MAX_ATTR]; GPUVertBuf *attr_viewer; - GPUVertBuf *vnor; } vbo; /* Index Buffers: * Only need to be updated when topology changes. */ @@ -119,7 +117,7 @@ struct MeshBufferList { /* no loose edges. */ GPUIndexBuf *lines_paint_mask; GPUIndexBuf *lines_adjacency; - /** UV overlays. (visibility can differ from 3D view). */ + /* Uv overlays. (visibility can differ from 3D view) */ GPUIndexBuf *edituv_tris; GPUIndexBuf *edituv_lines; GPUIndexBuf *edituv_points; @@ -306,7 +304,7 @@ void mesh_buffer_cache_create_requested(TaskGraph *task_graph, bool is_editmode, bool is_paint_mode, bool is_mode_active, - const float4x4 &object_to_world, + const float obmat[4][4], bool do_final, bool do_uvedit, const Scene *scene, diff --git a/source/blender/draw/intern/draw_cache_extract_mesh.cc b/source/blender/draw/intern/draw_cache_extract_mesh.cc index ddcedf5a79a..986801fbc92 100644 --- a/source/blender/draw/intern/draw_cache_extract_mesh.cc +++ b/source/blender/draw/intern/draw_cache_extract_mesh.cc @@ -572,7 +572,7 @@ void mesh_buffer_cache_create_requested(TaskGraph *task_graph, const bool is_editmode, const bool is_paint_mode, const bool is_mode_active, - const float4x4 &object_to_world, + const float obmat[4][4], const bool do_final, const bool do_uvedit, const Scene *scene, @@ -627,8 +627,8 @@ void mesh_buffer_cache_create_requested(TaskGraph *task_graph, } \ } while (0) - EXTRACT_ADD_REQUESTED(vbo, pos); - EXTRACT_ADD_REQUESTED(vbo, nor); + EXTRACT_ADD_REQUESTED(vbo, pos_nor); + EXTRACT_ADD_REQUESTED(vbo, lnor); EXTRACT_ADD_REQUESTED(vbo, uv); EXTRACT_ADD_REQUESTED(vbo, tan); EXTRACT_ADD_REQUESTED(vbo, sculpt_data); @@ -653,7 +653,6 @@ void mesh_buffer_cache_create_requested(TaskGraph *task_graph, EXTRACT_ADD_REQUESTED(vbo, attr[i]); } EXTRACT_ADD_REQUESTED(vbo, attr_viewer); - EXTRACT_ADD_REQUESTED(vbo, vnor); EXTRACT_ADD_REQUESTED(ibo, tris); if (DRW_ibo_requested(mbuflist->ibo.lines_loose)) { @@ -693,25 +692,18 @@ void mesh_buffer_cache_create_requested(TaskGraph *task_graph, } #ifdef DEBUG_TIME - double rdata_start = BLI_time_now_seconds(); + double rdata_start = BLI_check_seconds_timer(); #endif - MeshRenderData *mr = mesh_render_data_create(object, - mesh, - is_editmode, - is_paint_mode, - is_mode_active, - object_to_world, - do_final, - do_uvedit, - use_hide, - ts); + MeshRenderData *mr = mesh_render_data_create( + object, mesh, is_editmode, is_paint_mode, is_mode_active, obmat, do_final, do_uvedit, ts); + mr->use_hide = use_hide; mr->use_subsurf_fdots = mr->mesh && !mr->mesh->runtime->subsurf_face_dot_tags.is_empty(); mr->use_final_mesh = do_final; mr->use_simplify_normals = (scene->r.mode & R_SIMPLIFY) && (scene->r.mode & R_SIMPLIFY_NORMALS); #ifdef DEBUG_TIME - double rdata_end = BLI_time_now_seconds(); + double rdata_end = BLI_check_seconds_timer(); #endif eMRIterType iter_type = extractors.iter_types(); @@ -765,7 +757,7 @@ void mesh_buffer_cache_create_requested(TaskGraph *task_graph, #ifdef DEBUG_TIME BLI_task_graph_work_and_wait(task_graph); - double end = BLI_time_now_seconds(); + double end = BLI_check_seconds_timer(); static double avg = 0; static double avg_fps = 0; @@ -816,11 +808,11 @@ void mesh_buffer_cache_create_requested_subdiv(MeshBatchCache &cache, EXTRACT_ADD_REQUESTED(ibo, tris); /* Orcos are extracted at the same time as positions. */ - if (DRW_vbo_requested(mbuflist->vbo.pos) || DRW_vbo_requested(mbuflist->vbo.orco)) { - extractors.append(&extract_pos); + if (DRW_vbo_requested(mbuflist->vbo.pos_nor) || DRW_vbo_requested(mbuflist->vbo.orco)) { + extractors.append(&extract_pos_nor); } - EXTRACT_ADD_REQUESTED(vbo, nor); + EXTRACT_ADD_REQUESTED(vbo, lnor); for (int i = 0; i < GPU_MAX_ATTR; i++) { EXTRACT_ADD_REQUESTED(vbo, attr[i]); } diff --git a/source/blender/draw/intern/draw_cache_extract_mesh_render_data.cc b/source/blender/draw/intern/draw_cache_extract_mesh_render_data.cc index be7cf801373..98933093a9f 100644 --- a/source/blender/draw/intern/draw_cache_extract_mesh_render_data.cc +++ b/source/blender/draw/intern/draw_cache_extract_mesh_render_data.cc @@ -544,19 +544,16 @@ MeshRenderData *mesh_render_data_create(Object *object, const bool is_editmode, const bool is_paint_mode, const bool is_mode_active, - const float4x4 &object_to_world, + const float obmat[4][4], const bool do_final, const bool do_uvedit, - const bool use_hide, const ToolSettings *ts) { MeshRenderData *mr = MEM_new(__func__); mr->toolsettings = ts; mr->mat_len = mesh_render_mat_len_get(object, mesh); - mr->object_to_world = object_to_world; - - mr->use_hide = use_hide; + copy_m4_m4(mr->obmat, obmat); if (is_editmode) { Mesh *editmesh_eval_final = BKE_object_get_editmesh_eval_final(object); @@ -681,17 +678,13 @@ MeshRenderData *mesh_render_data_create(Object *object, mr->material_indices = *attributes.lookup("material_index", bke::AttrDomain::Face); - if (is_mode_active || is_paint_mode) { - if (use_hide) { - mr->hide_vert = *attributes.lookup(".hide_vert", bke::AttrDomain::Point); - mr->hide_edge = *attributes.lookup(".hide_edge", bke::AttrDomain::Edge); - mr->hide_poly = *attributes.lookup(".hide_poly", bke::AttrDomain::Face); - } + mr->hide_vert = *attributes.lookup(".hide_vert", bke::AttrDomain::Point); + mr->hide_edge = *attributes.lookup(".hide_edge", bke::AttrDomain::Edge); + mr->hide_poly = *attributes.lookup(".hide_poly", bke::AttrDomain::Face); - mr->select_vert = *attributes.lookup(".select_vert", bke::AttrDomain::Point); - mr->select_edge = *attributes.lookup(".select_edge", bke::AttrDomain::Edge); - mr->select_poly = *attributes.lookup(".select_poly", bke::AttrDomain::Face); - } + mr->select_vert = *attributes.lookup(".select_vert", bke::AttrDomain::Point); + mr->select_edge = *attributes.lookup(".select_edge", bke::AttrDomain::Edge); + mr->select_poly = *attributes.lookup(".select_poly", bke::AttrDomain::Face); mr->sharp_faces = *attributes.lookup("sharp_face", bke::AttrDomain::Face); } diff --git a/source/blender/draw/intern/draw_cache_impl_curves.cc b/source/blender/draw/intern/draw_cache_impl_curves.cc index f1d1ac4b1e3..a6c8deb1024 100644 --- a/source/blender/draw/intern/draw_cache_impl_curves.cc +++ b/source/blender/draw/intern/draw_cache_impl_curves.cc @@ -42,6 +42,7 @@ #include "draw_cache_impl.hh" /* own include */ #include "draw_cache_inline.hh" #include "draw_curves_private.hh" /* own include */ +#include "draw_shader.hh" namespace blender::draw { @@ -416,6 +417,57 @@ static void curves_batch_cache_ensure_procedural_final_points(CurvesEvalCache &c cache.final[subdiv].strands_res * cache.strands_len); } +static void curves_batch_cache_fill_segments_indices(GPUPrimType prim_type, + const bke::CurvesGeometry &curves, + const int res, + GPUIndexBufBuilder &elb) +{ + switch (prim_type) { + /* Populate curves using compressed restart-compatible types. */ + case GPU_PRIM_LINE_STRIP: + case GPU_PRIM_TRI_STRIP: { + uint curr_point = 0; + for ([[maybe_unused]] const int i : IndexRange(curves.curves_num())) { + for (int k = 0; k < res; k++) { + GPU_indexbuf_add_generic_vert(&elb, curr_point++); + } + GPU_indexbuf_add_primitive_restart(&elb); + } + break; + } + /* Generate curves using independent line segments. */ + case GPU_PRIM_LINES: { + uint curr_point = 0; + for ([[maybe_unused]] const int i : IndexRange(curves.curves_num())) { + for (int k = 0; k < res / 2; k++) { + GPU_indexbuf_add_line_verts(&elb, curr_point, curr_point + 1); + curr_point++; + } + /* Skip to next primitive base index. */ + curr_point++; + } + break; + } + /* Generate curves using independent two-triangle segments. */ + case GPU_PRIM_TRIS: { + uint curr_point = 0; + for ([[maybe_unused]] const int i : IndexRange(curves.curves_num())) { + for (int k = 0; k < res / 6; k++) { + GPU_indexbuf_add_tri_verts(&elb, curr_point, curr_point + 1, curr_point + 2); + GPU_indexbuf_add_tri_verts(&elb, curr_point + 1, curr_point + 3, curr_point + 2); + curr_point += 2; + } + /* Skip to next primitive base index. */ + curr_point += 2; + } + break; + } + default: + BLI_assert_unreachable(); + break; + } +} + static void curves_batch_cache_ensure_procedural_indices(const bke::CurvesGeometry &curves, CurvesEvalCache &cache, const int thickness_res, @@ -431,11 +483,13 @@ static void curves_batch_cache_ensure_procedural_indices(const bke::CurvesGeomet * NOTE: Metal backend uses non-restart prim types for optimal HW performance. */ bool use_strip_prims = (GPU_backend_get_type() != GPU_BACKEND_METAL); int verts_per_curve; + int element_count; GPUPrimType prim_type; if (use_strip_prims) { /* +1 for primitive restart */ verts_per_curve = cache.final[subdiv].strands_res * thickness_res; + element_count = (verts_per_curve + 1) * cache.strands_len; prim_type = (thickness_res == 1) ? GPU_PRIM_LINE_STRIP : GPU_PRIM_TRI_STRIP; } else { @@ -443,6 +497,7 @@ static void curves_batch_cache_ensure_procedural_indices(const bke::CurvesGeomet prim_type = (thickness_res == 1) ? GPU_PRIM_LINES : GPU_PRIM_TRIS; int verts_per_segment = ((prim_type == GPU_PRIM_LINES) ? 2 : 6); verts_per_curve = (cache.final[subdiv].strands_res - 1) * verts_per_segment; + element_count = verts_per_curve * cache.strands_len; } static GPUVertFormat format = {0}; @@ -454,14 +509,13 @@ static void curves_batch_cache_ensure_procedural_indices(const bke::CurvesGeomet GPUVertBuf *vbo = GPU_vertbuf_create_with_format(&format); GPU_vertbuf_data_alloc(vbo, 1); - GPUIndexBuf *ibo = nullptr; - eGPUBatchFlag owns_flag = GPU_BATCH_OWNS_VBO; - if (curves.curves_num()) { - ibo = GPU_indexbuf_build_curves_on_device(prim_type, curves.curves_num(), verts_per_curve); - owns_flag |= GPU_BATCH_OWNS_INDEX; - } + GPUIndexBufBuilder elb; + GPU_indexbuf_init_ex(&elb, prim_type, element_count, element_count); + + curves_batch_cache_fill_segments_indices(prim_type, curves, verts_per_curve, elb); + cache.final[subdiv].proc_hairs[thickness_res - 1] = GPU_batch_create_ex( - prim_type, vbo, ibo, owns_flag); + prim_type, vbo, GPU_indexbuf_build(&elb), GPU_BATCH_OWNS_VBO | GPU_BATCH_OWNS_INDEX); } static bool curves_ensure_attributes(const Curves &curves, diff --git a/source/blender/draw/intern/draw_cache_impl_gpencil_legacy.cc b/source/blender/draw/intern/draw_cache_impl_gpencil_legacy.cc index 01b9bf378a7..a7a89d7aed1 100644 --- a/source/blender/draw/intern/draw_cache_impl_gpencil_legacy.cc +++ b/source/blender/draw/intern/draw_cache_impl_gpencil_legacy.cc @@ -615,7 +615,7 @@ static void gpencil_sbuffer_stroke_ensure(bGPdata *gpd, bool do_fill) for (int i = 0; i < vert_len; i++) { ED_gpencil_tpoint_to_point(region, origin, &tpoints[i], &gps->points[i]); - mul_m4_v3(ob->world_to_object().ptr(), &gps->points[i].x); + mul_m4_v3(ob->world_to_object, &gps->points[i].x); bGPDspoint *pt = &gps->points[i]; copy_v4_v4(pt->vert_color, tpoints[i].vert_color); } diff --git a/source/blender/draw/intern/draw_cache_impl_grease_pencil.cc b/source/blender/draw/intern/draw_cache_impl_grease_pencil.cc index eaf1e8c63f4..b1a4f056f30 100644 --- a/source/blender/draw/intern/draw_cache_impl_grease_pencil.cc +++ b/source/blender/draw/intern/draw_cache_impl_grease_pencil.cc @@ -199,16 +199,6 @@ BLI_INLINE int32_t pack_rotation_aspect_hardness(float rot, float asp, float har return packed; } -static void copy_transformed_positions(const Span src_positions, - const IndexRange range, - const float4x4 &transform, - MutableSpan dst_positions) -{ - for (const int point_i : range) { - dst_positions[point_i] = math::transform_point(transform, src_positions[point_i]); - } -} - static void grease_pencil_edit_batch_ensure(Object &object, const GreasePencil &grease_pencil, const Scene &scene) @@ -228,7 +218,7 @@ static void grease_pencil_edit_batch_ensure(Object &object, BLI_assert(cache->edit_points == nullptr && cache->edit_lines == nullptr); /* Get the visible drawings. */ - const Vector drawings = + const Array drawings = ed::greasepencil::retrieve_visible_drawings(scene, grease_pencil); const Span layers = grease_pencil.layers(); @@ -269,8 +259,7 @@ static void grease_pencil_edit_batch_ensure(Object &object, int total_line_ids_num = 0; int drawing_start_offset = 0; for (const ed::greasepencil::DrawingInfo &info : drawings) { - const Layer &layer = *layers[info.layer_index]; - const float4x4 layer_space_to_object_space = layer.to_object_space(object); + const Layer *layer = layers[info.layer_index]; const bke::CurvesGeometry &curves = info.drawing.strokes(); const bke::AttributeAccessor attributes = curves.attributes(); const OffsetIndices points_by_curve = curves.points_by_curve(); @@ -283,15 +272,11 @@ static void grease_pencil_edit_batch_ensure(Object &object, const VArray selection_float = *attributes.lookup_or_default( ".selection", bke::AttrDomain::Point, true); - const IndexRange points(drawing_start_offset, curves.points_num()); - const Span positions = curves.positions(); - MutableSpan positions_slice = edit_points.slice(points); - threading::parallel_for(curves.points_range(), 1024, [&](const IndexRange range) { - copy_transformed_positions(positions, range, layer_space_to_object_space, positions_slice); - }); - MutableSpan selection_slice = edit_points_selection.slice(points); + edit_points.slice(drawing_start_offset, curves.points_num()).copy_from(curves.positions()); + MutableSpan selection_slice = edit_points_selection.slice(drawing_start_offset, + curves.points_num()); /* Do not show selection for locked layers. */ - if (layer.is_locked()) { + if (layer->is_locked()) { selection_slice.fill(0.0f); } else { @@ -311,7 +296,7 @@ static void grease_pencil_edit_batch_ensure(Object &object, total_line_ids_num += array_utils::count_booleans(curves.cyclic(), editable_strokes); /* Do not show points for locked layers. */ - if (layer.is_locked()) { + if (layer->is_locked()) { continue; } @@ -422,7 +407,7 @@ static void grease_pencil_geom_batch_ensure(Object &object, BLI_assert(cache->geom_batch == nullptr); /* Get the visible drawings. */ - const Vector drawings = + const Array drawings = ed::greasepencil::retrieve_visible_drawings(scene, grease_pencil); /* First, count how many vertices and triangles are needed for the whole object. Also record the @@ -508,8 +493,6 @@ static void grease_pencil_geom_batch_ensure(Object &object, /* Fill buffers with data. */ for (const int drawing_i : drawings.index_range()) { const ed::greasepencil::DrawingInfo &info = drawings[drawing_i]; - const Layer &layer = *grease_pencil.layers()[info.layer_index]; - const float4x4 layer_space_to_object_space = layer.to_object_space(object); const bke::CurvesGeometry &curves = info.drawing.strokes(); const bke::AttributeAccessor attributes = curves.attributes(); const OffsetIndices points_by_curve = curves.points_by_curve(); @@ -555,12 +538,8 @@ static void grease_pencil_geom_batch_ensure(Object &object, float length, GreasePencilStrokeVert &s_vert, GreasePencilColorVert &c_vert) { - copy_v3_v3(s_vert.pos, - math::transform_point(layer_space_to_object_space, positions[point_i])); + copy_v3_v3(s_vert.pos, positions[point_i]); s_vert.radius = radii[point_i] * ((end_cap == GP_STROKE_CAP_TYPE_ROUND) ? 1.0f : -1.0f); - /* Convert to legacy "pixel" space. The shader expects the values to be in this space. - * Otherwise the values will get clamped. */ - s_vert.radius *= 1000.0f; s_vert.opacity = opacities[point_i] * ((start_cap == GP_STROKE_CAP_TYPE_ROUND) ? 1.0f : -1.0f); s_vert.point_id = verts_range[idx]; @@ -623,7 +602,7 @@ static void grease_pencil_geom_batch_ensure(Object &object, cols_slice[idx]); } - if (is_cyclic && points.size() >= 3) { + if (is_cyclic) { const int idx = points.size() + 1; const float length = points.size() > 1 ? lengths[points.size() - 1] : 0.0f; populate_point(verts_range, diff --git a/source/blender/draw/intern/draw_cache_impl_mesh.cc b/source/blender/draw/intern/draw_cache_impl_mesh.cc index 529b710888e..d78916dc14e 100644 --- a/source/blender/draw/intern/draw_cache_impl_mesh.cc +++ b/source/blender/draw/intern/draw_cache_impl_mesh.cc @@ -97,14 +97,14 @@ namespace blender::draw { static constexpr DRWBatchFlag batches_that_use_buffer(const int buffer_index) { switch (buffer_index) { - case BUFFER_INDEX(vbo.pos): + case BUFFER_INDEX(vbo.pos_nor): return MBC_SURFACE | MBC_SURFACE_WEIGHTS | MBC_EDIT_TRIANGLES | MBC_EDIT_VERTICES | MBC_EDIT_EDGES | MBC_EDIT_VNOR | MBC_EDIT_LNOR | MBC_EDIT_MESH_ANALYSIS | MBC_EDIT_SELECTION_VERTS | MBC_EDIT_SELECTION_EDGES | MBC_EDIT_SELECTION_FACES | MBC_ALL_VERTS | MBC_ALL_EDGES | MBC_LOOSE_EDGES | MBC_EDGE_DETECTION | MBC_WIRE_EDGES | MBC_WIRE_LOOPS | MBC_SCULPT_OVERLAYS | MBC_VIEWER_ATTRIBUTE_OVERLAY | MBC_SURFACE_PER_MAT; - case BUFFER_INDEX(vbo.nor): + case BUFFER_INDEX(vbo.lnor): return MBC_SURFACE | MBC_EDIT_LNOR | MBC_WIRE_LOOPS | MBC_SURFACE_PER_MAT; case BUFFER_INDEX(vbo.edge_fac): return MBC_WIRE_EDGES; @@ -167,8 +167,6 @@ static constexpr DRWBatchFlag batches_that_use_buffer(const int buffer_index) return MBC_SURFACE | MBC_SURFACE_PER_MAT; case BUFFER_INDEX(vbo.attr_viewer): return MBC_VIEWER_ATTRIBUTE_OVERLAY; - case BUFFER_INDEX(vbo.vnor): - return MBC_EDIT_VNOR; case BUFFER_INDEX(ibo.tris): return MBC_SURFACE | MBC_SURFACE_WEIGHTS | MBC_EDIT_TRIANGLES | MBC_EDIT_LNOR | MBC_EDIT_MESH_ANALYSIS | MBC_EDIT_SELECTION_FACES | MBC_SCULPT_OVERLAYS | @@ -750,10 +748,10 @@ void DRW_mesh_batch_cache_dirty_tag(Mesh *mesh, eMeshBatchDirtyMode mode) * Note that it can be slow if auto smooth is enabled. (see #63946) */ FOREACH_MESH_BUFFER_CACHE (cache, mbc) { GPU_INDEXBUF_DISCARD_SAFE(mbc->buff.ibo.lines_paint_mask); - GPU_VERTBUF_DISCARD_SAFE(mbc->buff.vbo.pos); - GPU_VERTBUF_DISCARD_SAFE(mbc->buff.vbo.nor); + GPU_VERTBUF_DISCARD_SAFE(mbc->buff.vbo.pos_nor); + GPU_VERTBUF_DISCARD_SAFE(mbc->buff.vbo.lnor); } - batch_map = BATCH_MAP(ibo.lines_paint_mask, vbo.pos, vbo.nor); + batch_map = BATCH_MAP(ibo.lines_paint_mask, vbo.pos_nor, vbo.lnor); mesh_batch_cache_discard_batch(cache, batch_map); break; case BKE_MESH_BATCH_DIRTY_ALL: @@ -1072,8 +1070,8 @@ GPUVertBuf *DRW_mesh_batch_cache_pos_vertbuf_get(Mesh *mesh) /* Request surface to trigger the vbo filling. Otherwise it may do nothing. */ mesh_batch_cache_request_surface_batches(cache); - DRW_vbo_request(nullptr, &cache.final.buff.vbo.pos); - return cache.final.buff.vbo.pos; + DRW_vbo_request(nullptr, &cache.final.buff.vbo.pos_nor); + return cache.final.buff.vbo.pos_nor; } /** \} */ @@ -1527,8 +1525,8 @@ void DRW_mesh_batch_cache_create_requested(TaskGraph *task_graph, /* Initialize batches and request VBO's & IBO's. */ assert_deps_valid(MBC_SURFACE, {BUFFER_INDEX(ibo.tris), - BUFFER_INDEX(vbo.nor), - BUFFER_INDEX(vbo.pos), + BUFFER_INDEX(vbo.lnor), + BUFFER_INDEX(vbo.pos_nor), BUFFER_INDEX(vbo.uv), BUFFER_INDEX(vbo.attr[0]), BUFFER_INDEX(vbo.attr[1]), @@ -1548,64 +1546,65 @@ void DRW_mesh_batch_cache_create_requested(TaskGraph *task_graph, if (DRW_batch_requested(cache.batch.surface, GPU_PRIM_TRIS)) { DRW_ibo_request(cache.batch.surface, &mbuflist->ibo.tris); /* Order matters. First ones override latest VBO's attributes. */ - DRW_vbo_request(cache.batch.surface, &mbuflist->vbo.nor); - DRW_vbo_request(cache.batch.surface, &mbuflist->vbo.pos); + DRW_vbo_request(cache.batch.surface, &mbuflist->vbo.lnor); + DRW_vbo_request(cache.batch.surface, &mbuflist->vbo.pos_nor); if (cache.cd_used.uv != 0) { DRW_vbo_request(cache.batch.surface, &mbuflist->vbo.uv); } drw_add_attributes_vbo(cache.batch.surface, mbuflist, &cache.attr_used); } - assert_deps_valid(MBC_ALL_VERTS, {BUFFER_INDEX(vbo.pos)}); + assert_deps_valid(MBC_ALL_VERTS, {BUFFER_INDEX(vbo.pos_nor)}); if (DRW_batch_requested(cache.batch.all_verts, GPU_PRIM_POINTS)) { - DRW_vbo_request(cache.batch.all_verts, &mbuflist->vbo.pos); + DRW_vbo_request(cache.batch.all_verts, &mbuflist->vbo.pos_nor); } assert_deps_valid( MBC_SCULPT_OVERLAYS, - {BUFFER_INDEX(ibo.tris), BUFFER_INDEX(vbo.pos), BUFFER_INDEX(vbo.sculpt_data)}); + {BUFFER_INDEX(ibo.tris), BUFFER_INDEX(vbo.pos_nor), BUFFER_INDEX(vbo.sculpt_data)}); if (DRW_batch_requested(cache.batch.sculpt_overlays, GPU_PRIM_TRIS)) { DRW_ibo_request(cache.batch.sculpt_overlays, &mbuflist->ibo.tris); - DRW_vbo_request(cache.batch.sculpt_overlays, &mbuflist->vbo.pos); + DRW_vbo_request(cache.batch.sculpt_overlays, &mbuflist->vbo.pos_nor); DRW_vbo_request(cache.batch.sculpt_overlays, &mbuflist->vbo.sculpt_data); } - assert_deps_valid(MBC_ALL_EDGES, {BUFFER_INDEX(ibo.lines), BUFFER_INDEX(vbo.pos)}); + assert_deps_valid(MBC_ALL_EDGES, {BUFFER_INDEX(ibo.lines), BUFFER_INDEX(vbo.pos_nor)}); if (DRW_batch_requested(cache.batch.all_edges, GPU_PRIM_LINES)) { DRW_ibo_request(cache.batch.all_edges, &mbuflist->ibo.lines); - DRW_vbo_request(cache.batch.all_edges, &mbuflist->vbo.pos); + DRW_vbo_request(cache.batch.all_edges, &mbuflist->vbo.pos_nor); } - assert_deps_valid(MBC_LOOSE_EDGES, {BUFFER_INDEX(ibo.lines_loose), BUFFER_INDEX(vbo.pos)}); + assert_deps_valid(MBC_LOOSE_EDGES, {BUFFER_INDEX(ibo.lines_loose), BUFFER_INDEX(vbo.pos_nor)}); if (DRW_batch_requested(cache.batch.loose_edges, GPU_PRIM_LINES)) { DRW_ibo_request(nullptr, &mbuflist->ibo.lines); DRW_ibo_request(cache.batch.loose_edges, &mbuflist->ibo.lines_loose); - DRW_vbo_request(cache.batch.loose_edges, &mbuflist->vbo.pos); + DRW_vbo_request(cache.batch.loose_edges, &mbuflist->vbo.pos_nor); } assert_deps_valid(MBC_EDGE_DETECTION, - {BUFFER_INDEX(ibo.lines_adjacency), BUFFER_INDEX(vbo.pos)}); + {BUFFER_INDEX(ibo.lines_adjacency), BUFFER_INDEX(vbo.pos_nor)}); if (DRW_batch_requested(cache.batch.edge_detection, GPU_PRIM_LINES_ADJ)) { DRW_ibo_request(cache.batch.edge_detection, &mbuflist->ibo.lines_adjacency); - DRW_vbo_request(cache.batch.edge_detection, &mbuflist->vbo.pos); + DRW_vbo_request(cache.batch.edge_detection, &mbuflist->vbo.pos_nor); } - assert_deps_valid(MBC_SURFACE_WEIGHTS, - {BUFFER_INDEX(ibo.tris), BUFFER_INDEX(vbo.pos), BUFFER_INDEX(vbo.weights)}); + assert_deps_valid( + MBC_SURFACE_WEIGHTS, + {BUFFER_INDEX(ibo.tris), BUFFER_INDEX(vbo.pos_nor), BUFFER_INDEX(vbo.weights)}); if (DRW_batch_requested(cache.batch.surface_weights, GPU_PRIM_TRIS)) { DRW_ibo_request(cache.batch.surface_weights, &mbuflist->ibo.tris); - DRW_vbo_request(cache.batch.surface_weights, &mbuflist->vbo.pos); - DRW_vbo_request(cache.batch.surface_weights, &mbuflist->vbo.nor); + DRW_vbo_request(cache.batch.surface_weights, &mbuflist->vbo.pos_nor); DRW_vbo_request(cache.batch.surface_weights, &mbuflist->vbo.weights); } assert_deps_valid( MBC_WIRE_LOOPS, - {BUFFER_INDEX(ibo.lines_paint_mask), BUFFER_INDEX(vbo.nor), BUFFER_INDEX(vbo.pos)}); + {BUFFER_INDEX(ibo.lines_paint_mask), BUFFER_INDEX(vbo.lnor), BUFFER_INDEX(vbo.pos_nor)}); if (DRW_batch_requested(cache.batch.wire_loops, GPU_PRIM_LINES)) { DRW_ibo_request(cache.batch.wire_loops, &mbuflist->ibo.lines_paint_mask); /* Order matters. First ones override latest VBO's attributes. */ - DRW_vbo_request(cache.batch.wire_loops, &mbuflist->vbo.nor); - DRW_vbo_request(cache.batch.wire_loops, &mbuflist->vbo.pos); + DRW_vbo_request(cache.batch.wire_loops, &mbuflist->vbo.lnor); + DRW_vbo_request(cache.batch.wire_loops, &mbuflist->vbo.pos_nor); } - assert_deps_valid(MBC_WIRE_EDGES, - {BUFFER_INDEX(ibo.lines), BUFFER_INDEX(vbo.pos), BUFFER_INDEX(vbo.edge_fac)}); + assert_deps_valid( + MBC_WIRE_EDGES, + {BUFFER_INDEX(ibo.lines), BUFFER_INDEX(vbo.pos_nor), BUFFER_INDEX(vbo.edge_fac)}); if (DRW_batch_requested(cache.batch.wire_edges, GPU_PRIM_LINES)) { DRW_ibo_request(cache.batch.wire_edges, &mbuflist->ibo.lines); - DRW_vbo_request(cache.batch.wire_edges, &mbuflist->vbo.pos); + DRW_vbo_request(cache.batch.wire_edges, &mbuflist->vbo.pos_nor); DRW_vbo_request(cache.batch.wire_edges, &mbuflist->vbo.edge_fac); } assert_deps_valid(MBC_WIRE_LOOPS_UVS, {BUFFER_INDEX(ibo.edituv_lines), BUFFER_INDEX(vbo.uv)}); @@ -1618,17 +1617,17 @@ void DRW_mesh_batch_cache_create_requested(TaskGraph *task_graph, } assert_deps_valid( MBC_EDIT_MESH_ANALYSIS, - {BUFFER_INDEX(ibo.tris), BUFFER_INDEX(vbo.pos), BUFFER_INDEX(vbo.mesh_analysis)}); + {BUFFER_INDEX(ibo.tris), BUFFER_INDEX(vbo.pos_nor), BUFFER_INDEX(vbo.mesh_analysis)}); if (DRW_batch_requested(cache.batch.edit_mesh_analysis, GPU_PRIM_TRIS)) { DRW_ibo_request(cache.batch.edit_mesh_analysis, &mbuflist->ibo.tris); - DRW_vbo_request(cache.batch.edit_mesh_analysis, &mbuflist->vbo.pos); + DRW_vbo_request(cache.batch.edit_mesh_analysis, &mbuflist->vbo.pos_nor); DRW_vbo_request(cache.batch.edit_mesh_analysis, &mbuflist->vbo.mesh_analysis); } /* Per Material */ assert_deps_valid( MBC_SURFACE_PER_MAT, - {BUFFER_INDEX(vbo.nor), BUFFER_INDEX(vbo.pos), BUFFER_INDEX(vbo.uv), + {BUFFER_INDEX(vbo.lnor), BUFFER_INDEX(vbo.pos_nor), BUFFER_INDEX(vbo.uv), BUFFER_INDEX(vbo.tan), BUFFER_INDEX(vbo.orco), BUFFER_INDEX(vbo.attr[0]), BUFFER_INDEX(vbo.attr[1]), BUFFER_INDEX(vbo.attr[2]), BUFFER_INDEX(vbo.attr[3]), BUFFER_INDEX(vbo.attr[4]), BUFFER_INDEX(vbo.attr[5]), BUFFER_INDEX(vbo.attr[6]), @@ -1640,8 +1639,8 @@ void DRW_mesh_batch_cache_create_requested(TaskGraph *task_graph, if (DRW_batch_requested(cache.surface_per_mat[i], GPU_PRIM_TRIS)) { DRW_ibo_request(cache.surface_per_mat[i], &cache.tris_per_mat[i]); /* Order matters. First ones override latest VBO's attributes. */ - DRW_vbo_request(cache.surface_per_mat[i], &mbuflist->vbo.nor); - DRW_vbo_request(cache.surface_per_mat[i], &mbuflist->vbo.pos); + DRW_vbo_request(cache.surface_per_mat[i], &mbuflist->vbo.lnor); + DRW_vbo_request(cache.surface_per_mat[i], &mbuflist->vbo.pos_nor); if (cache.cd_used.uv != 0) { DRW_vbo_request(cache.surface_per_mat[i], &mbuflist->vbo.uv); } @@ -1658,44 +1657,41 @@ void DRW_mesh_batch_cache_create_requested(TaskGraph *task_graph, mbuflist = (do_cage) ? &cache.cage.buff : &cache.final.buff; /* Edit Mesh */ - assert_deps_valid(MBC_EDIT_TRIANGLES, - {BUFFER_INDEX(ibo.tris), BUFFER_INDEX(vbo.pos), BUFFER_INDEX(vbo.edit_data)}); + assert_deps_valid( + MBC_EDIT_TRIANGLES, + {BUFFER_INDEX(ibo.tris), BUFFER_INDEX(vbo.pos_nor), BUFFER_INDEX(vbo.edit_data)}); if (DRW_batch_requested(cache.batch.edit_triangles, GPU_PRIM_TRIS)) { DRW_ibo_request(cache.batch.edit_triangles, &mbuflist->ibo.tris); - DRW_vbo_request(cache.batch.edit_triangles, &mbuflist->vbo.pos); + DRW_vbo_request(cache.batch.edit_triangles, &mbuflist->vbo.pos_nor); DRW_vbo_request(cache.batch.edit_triangles, &mbuflist->vbo.edit_data); } assert_deps_valid( MBC_EDIT_VERTICES, - {BUFFER_INDEX(ibo.points), BUFFER_INDEX(vbo.pos), BUFFER_INDEX(vbo.edit_data)}); + {BUFFER_INDEX(ibo.points), BUFFER_INDEX(vbo.pos_nor), BUFFER_INDEX(vbo.edit_data)}); if (DRW_batch_requested(cache.batch.edit_vertices, GPU_PRIM_POINTS)) { DRW_ibo_request(cache.batch.edit_vertices, &mbuflist->ibo.points); - DRW_vbo_request(cache.batch.edit_vertices, &mbuflist->vbo.pos); + DRW_vbo_request(cache.batch.edit_vertices, &mbuflist->vbo.pos_nor); DRW_vbo_request(cache.batch.edit_vertices, &mbuflist->vbo.edit_data); } - assert_deps_valid(MBC_EDIT_EDGES, - {BUFFER_INDEX(ibo.lines), BUFFER_INDEX(vbo.pos), BUFFER_INDEX(vbo.edit_data)}); + assert_deps_valid( + MBC_EDIT_EDGES, + {BUFFER_INDEX(ibo.lines), BUFFER_INDEX(vbo.pos_nor), BUFFER_INDEX(vbo.edit_data)}); if (DRW_batch_requested(cache.batch.edit_edges, GPU_PRIM_LINES)) { DRW_ibo_request(cache.batch.edit_edges, &mbuflist->ibo.lines); - DRW_vbo_request(cache.batch.edit_edges, &mbuflist->vbo.pos); + DRW_vbo_request(cache.batch.edit_edges, &mbuflist->vbo.pos_nor); DRW_vbo_request(cache.batch.edit_edges, &mbuflist->vbo.edit_data); } - assert_deps_valid(MBC_EDIT_VNOR, - {BUFFER_INDEX(ibo.points), BUFFER_INDEX(vbo.pos), BUFFER_INDEX(vbo.vnor)}); + assert_deps_valid(MBC_EDIT_VNOR, {BUFFER_INDEX(ibo.points), BUFFER_INDEX(vbo.pos_nor)}); if (DRW_batch_requested(cache.batch.edit_vnor, GPU_PRIM_POINTS)) { DRW_ibo_request(cache.batch.edit_vnor, &mbuflist->ibo.points); - DRW_vbo_request(cache.batch.edit_vnor, &mbuflist->vbo.pos); - if (!do_subdivision) { - /* For GPU subdivision, vertex normals are included in the `pos` VBO. */ - DRW_vbo_request(cache.batch.edit_vnor, &mbuflist->vbo.vnor); - } + DRW_vbo_request(cache.batch.edit_vnor, &mbuflist->vbo.pos_nor); } assert_deps_valid(MBC_EDIT_LNOR, - {BUFFER_INDEX(ibo.tris), BUFFER_INDEX(vbo.pos), BUFFER_INDEX(vbo.nor)}); + {BUFFER_INDEX(ibo.tris), BUFFER_INDEX(vbo.pos_nor), BUFFER_INDEX(vbo.lnor)}); if (DRW_batch_requested(cache.batch.edit_lnor, GPU_PRIM_POINTS)) { DRW_ibo_request(cache.batch.edit_lnor, &mbuflist->ibo.tris); - DRW_vbo_request(cache.batch.edit_lnor, &mbuflist->vbo.pos); - DRW_vbo_request(cache.batch.edit_lnor, &mbuflist->vbo.nor); + DRW_vbo_request(cache.batch.edit_lnor, &mbuflist->vbo.pos_nor); + DRW_vbo_request(cache.batch.edit_lnor, &mbuflist->vbo.lnor); } assert_deps_valid( MBC_EDIT_FACEDOTS, @@ -1711,25 +1707,28 @@ void DRW_mesh_batch_cache_create_requested(TaskGraph *task_graph, } /* Selection */ - assert_deps_valid(MBC_EDIT_SELECTION_VERTS, - {BUFFER_INDEX(ibo.points), BUFFER_INDEX(vbo.pos), BUFFER_INDEX(vbo.vert_idx)}); + assert_deps_valid( + MBC_EDIT_SELECTION_VERTS, + {BUFFER_INDEX(ibo.points), BUFFER_INDEX(vbo.pos_nor), BUFFER_INDEX(vbo.vert_idx)}); if (DRW_batch_requested(cache.batch.edit_selection_verts, GPU_PRIM_POINTS)) { DRW_ibo_request(cache.batch.edit_selection_verts, &mbuflist->ibo.points); - DRW_vbo_request(cache.batch.edit_selection_verts, &mbuflist->vbo.pos); + DRW_vbo_request(cache.batch.edit_selection_verts, &mbuflist->vbo.pos_nor); DRW_vbo_request(cache.batch.edit_selection_verts, &mbuflist->vbo.vert_idx); } - assert_deps_valid(MBC_EDIT_SELECTION_EDGES, - {BUFFER_INDEX(ibo.lines), BUFFER_INDEX(vbo.pos), BUFFER_INDEX(vbo.edge_idx)}); + assert_deps_valid( + MBC_EDIT_SELECTION_EDGES, + {BUFFER_INDEX(ibo.lines), BUFFER_INDEX(vbo.pos_nor), BUFFER_INDEX(vbo.edge_idx)}); if (DRW_batch_requested(cache.batch.edit_selection_edges, GPU_PRIM_LINES)) { DRW_ibo_request(cache.batch.edit_selection_edges, &mbuflist->ibo.lines); - DRW_vbo_request(cache.batch.edit_selection_edges, &mbuflist->vbo.pos); + DRW_vbo_request(cache.batch.edit_selection_edges, &mbuflist->vbo.pos_nor); DRW_vbo_request(cache.batch.edit_selection_edges, &mbuflist->vbo.edge_idx); } - assert_deps_valid(MBC_EDIT_SELECTION_FACES, - {BUFFER_INDEX(ibo.tris), BUFFER_INDEX(vbo.pos), BUFFER_INDEX(vbo.face_idx)}); + assert_deps_valid( + MBC_EDIT_SELECTION_FACES, + {BUFFER_INDEX(ibo.tris), BUFFER_INDEX(vbo.pos_nor), BUFFER_INDEX(vbo.face_idx)}); if (DRW_batch_requested(cache.batch.edit_selection_faces, GPU_PRIM_TRIS)) { DRW_ibo_request(cache.batch.edit_selection_faces, &mbuflist->ibo.tris); - DRW_vbo_request(cache.batch.edit_selection_faces, &mbuflist->vbo.pos); + DRW_vbo_request(cache.batch.edit_selection_faces, &mbuflist->vbo.pos_nor); DRW_vbo_request(cache.batch.edit_selection_faces, &mbuflist->vbo.face_idx); } assert_deps_valid( @@ -1806,10 +1805,10 @@ void DRW_mesh_batch_cache_create_requested(TaskGraph *task_graph, } assert_deps_valid( MBC_VIEWER_ATTRIBUTE_OVERLAY, - {BUFFER_INDEX(ibo.tris), BUFFER_INDEX(vbo.pos), BUFFER_INDEX(vbo.attr_viewer)}); + {BUFFER_INDEX(ibo.tris), BUFFER_INDEX(vbo.pos_nor), BUFFER_INDEX(vbo.attr_viewer)}); if (DRW_batch_requested(cache.batch.surface_viewer_attribute, GPU_PRIM_TRIS)) { DRW_ibo_request(cache.batch.surface_viewer_attribute, &mbuflist->ibo.tris); - DRW_vbo_request(cache.batch.surface_viewer_attribute, &mbuflist->vbo.pos); + DRW_vbo_request(cache.batch.surface_viewer_attribute, &mbuflist->vbo.pos_nor); DRW_vbo_request(cache.batch.surface_viewer_attribute, &mbuflist->vbo.attr_viewer); } @@ -1818,8 +1817,8 @@ void DRW_mesh_batch_cache_create_requested(TaskGraph *task_graph, BLI_assert(batches_that_use_buffer(buffer_index) == batches_that_use_buffer_local.lookup(buffer_index)); }; - assert_final_deps_valid(BUFFER_INDEX(vbo.nor)); - assert_final_deps_valid(BUFFER_INDEX(vbo.pos)); + assert_final_deps_valid(BUFFER_INDEX(vbo.lnor)); + assert_final_deps_valid(BUFFER_INDEX(vbo.pos_nor)); assert_final_deps_valid(BUFFER_INDEX(vbo.uv)); assert_final_deps_valid(BUFFER_INDEX(vbo.sculpt_data)); assert_final_deps_valid(BUFFER_INDEX(vbo.weights)); @@ -1844,7 +1843,6 @@ void DRW_mesh_batch_cache_create_requested(TaskGraph *task_graph, assert_final_deps_valid(BUFFER_INDEX(vbo.attr[i])); } assert_final_deps_valid(BUFFER_INDEX(vbo.attr_viewer)); - assert_final_deps_valid(BUFFER_INDEX(vbo.vnor)); assert_final_deps_valid(BUFFER_INDEX(ibo.tris)); assert_final_deps_valid(BUFFER_INDEX(ibo.lines)); @@ -1870,7 +1868,7 @@ void DRW_mesh_batch_cache_create_requested(TaskGraph *task_graph, is_editmode, is_paint_mode, is_mode_active, - ob->object_to_world(), + ob->object_to_world, false, true, scene, @@ -1887,7 +1885,7 @@ void DRW_mesh_batch_cache_create_requested(TaskGraph *task_graph, is_editmode, is_paint_mode, is_mode_active, - ob->object_to_world(), + ob->object_to_world, false, false, scene, @@ -1903,7 +1901,7 @@ void DRW_mesh_batch_cache_create_requested(TaskGraph *task_graph, is_editmode, is_paint_mode, is_mode_active, - ob->object_to_world(), + ob->object_to_world, true, false, do_cage, @@ -1924,7 +1922,7 @@ void DRW_mesh_batch_cache_create_requested(TaskGraph *task_graph, is_editmode, is_paint_mode, is_mode_active, - ob->object_to_world(), + ob->object_to_world, true, false, scene, diff --git a/source/blender/draw/intern/draw_cache_impl_subdivision.cc b/source/blender/draw/intern/draw_cache_impl_subdivision.cc index 2a738703084..9549c2679fb 100644 --- a/source/blender/draw/intern/draw_cache_impl_subdivision.cc +++ b/source/blender/draw/intern/draw_cache_impl_subdivision.cc @@ -14,7 +14,7 @@ #include "BKE_mesh_mapping.hh" #include "BKE_modifier.hh" #include "BKE_object.hh" -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "BKE_subdiv.hh" #include "BKE_subdiv_eval.hh" #include "BKE_subdiv_foreach.hh" @@ -2092,7 +2092,7 @@ static bool draw_subdiv_create_requested_buffers(Object *ob, const bool is_editmode, const bool is_paint_mode, const bool is_mode_active, - const float4x4 &object_to_world, + const float obmat[4][4], const bool do_final, const bool do_uvedit, const bool do_cage, @@ -2164,16 +2164,9 @@ static bool draw_subdiv_create_requested_buffers(Object *ob, draw_subdiv_cache_ensure_mat_offsets(draw_cache, mesh_eval, batch_cache.mat_len); } - MeshRenderData *mr = mesh_render_data_create(ob, - mesh, - is_editmode, - is_paint_mode, - is_mode_active, - object_to_world, - do_final, - do_uvedit, - use_hide, - ts); + MeshRenderData *mr = mesh_render_data_create( + ob, mesh, is_editmode, is_paint_mode, is_mode_active, obmat, do_final, do_uvedit, ts); + mr->use_hide = use_hide; draw_cache.use_hide = use_hide; /* Used for setting loop normals flags. Mapped extraction is only used during edit mode. @@ -2316,7 +2309,7 @@ void DRW_create_subdivision(Object *ob, const bool is_editmode, const bool is_paint_mode, const bool is_mode_active, - const float4x4 &object_to_world, + const float obmat[4][4], const bool do_final, const bool do_uvedit, const bool do_cage, @@ -2330,7 +2323,7 @@ void DRW_create_subdivision(Object *ob, #undef TIME_SUBDIV #ifdef TIME_SUBDIV - const double begin_time = BLI_time_now_seconds(); + const double begin_time = BLI_check_seconds_timer(); #endif if (!draw_subdiv_create_requested_buffers(ob, @@ -2340,7 +2333,7 @@ void DRW_create_subdivision(Object *ob, is_editmode, is_paint_mode, is_mode_active, - object_to_world, + obmat, do_final, do_uvedit, do_cage, @@ -2352,7 +2345,7 @@ void DRW_create_subdivision(Object *ob, } #ifdef TIME_SUBDIV - const double end_time = BLI_time_now_seconds(); + const double end_time = BLI_check_seconds_timer(); fprintf(stderr, "Time to update subdivision: %f\n", end_time - begin_time); fprintf(stderr, "Maximum FPS: %f\n", 1.0 / (end_time - begin_time)); #endif diff --git a/source/blender/draw/intern/draw_cache_impl_volume.cc b/source/blender/draw/intern/draw_cache_impl_volume.cc index b6f937e4756..42126cf48b9 100644 --- a/source/blender/draw/intern/draw_cache_impl_volume.cc +++ b/source/blender/draw/intern/draw_cache_impl_volume.cc @@ -20,7 +20,7 @@ #include "DNA_object_types.h" #include "DNA_volume_types.h" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_volume.hh" #include "BKE_volume_grid_fwd.hh" #include "BKE_volume_render.hh" diff --git a/source/blender/draw/intern/draw_command.hh b/source/blender/draw/intern/draw_command.hh index 5bb4ff35447..ea23b5726d9 100644 --- a/source/blender/draw/intern/draw_command.hh +++ b/source/blender/draw/intern/draw_command.hh @@ -13,7 +13,7 @@ * `DrawMultiBuf`. See implementation details at their definition. */ -#include "BKE_global.hh" +#include "BKE_global.h" #include "BLI_map.hh" #include "DRW_gpu_wrapper.hh" @@ -303,11 +303,11 @@ struct SpecializeConstant { /* Value of the constant or a reference to it. */ union { int int_value; - uint uint_value; + int uint_value; float float_value; bool bool_value; const int *int_ref; - const uint *uint_ref; + const int *uint_ref; const float *float_ref; const bool *bool_ref; }; @@ -331,16 +331,12 @@ struct SpecializeConstant { : shader(sh), float_value(val), location(loc), type(Type::FloatValue){}; SpecializeConstant(GPUShader *sh, int loc, const int &val) : shader(sh), int_value(val), location(loc), type(Type::IntValue){}; - SpecializeConstant(GPUShader *sh, int loc, const uint &val) - : shader(sh), uint_value(val), location(loc), type(Type::UintValue){}; SpecializeConstant(GPUShader *sh, int loc, const bool &val) : shader(sh), bool_value(val), location(loc), type(Type::BoolValue){}; SpecializeConstant(GPUShader *sh, int loc, const float *val) : shader(sh), float_ref(val), location(loc), type(Type::FloatReference){}; SpecializeConstant(GPUShader *sh, int loc, const int *val) : shader(sh), int_ref(val), location(loc), type(Type::IntReference){}; - SpecializeConstant(GPUShader *sh, int loc, const uint *val) - : shader(sh), uint_ref(val), location(loc), type(Type::UintReference){}; SpecializeConstant(GPUShader *sh, int loc, const bool *val) : shader(sh), bool_ref(val), location(loc), type(Type::BoolReference){}; diff --git a/source/blender/draw/intern/draw_common.cc b/source/blender/draw/intern/draw_common.cc index c0b5374af38..bc58015016d 100644 --- a/source/blender/draw/intern/draw_common.cc +++ b/source/blender/draw/intern/draw_common.cc @@ -17,7 +17,7 @@ #include "BLI_math_color.h" #include "BKE_colorband.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_object.hh" #include "draw_common.h" diff --git a/source/blender/draw/intern/draw_curves.cc b/source/blender/draw/intern/draw_curves.cc index c05a8373078..f9182ff215f 100644 --- a/source/blender/draw/intern/draw_curves.cc +++ b/source/blender/draw/intern/draw_curves.cc @@ -314,7 +314,7 @@ DRWShadingGroup *DRW_shgroup_curves_create_sub(Object *object, DRW_shgroup_uniform_int(shgrp, "hairStrandsRes", &curves_cache->final[subdiv].strands_res, 1); DRW_shgroup_uniform_int_copy(shgrp, "hairThicknessRes", thickness_res); DRW_shgroup_uniform_float_copy(shgrp, "hairRadShape", hair_rad_shape); - DRW_shgroup_uniform_mat4_copy(shgrp, "hairDupliMatrix", object->object_to_world().ptr()); + DRW_shgroup_uniform_mat4_copy(shgrp, "hairDupliMatrix", object->object_to_world); DRW_shgroup_uniform_float_copy(shgrp, "hairRadRoot", hair_rad_root); DRW_shgroup_uniform_float_copy(shgrp, "hairRadTip", hair_rad_tip); DRW_shgroup_uniform_bool_copy(shgrp, "hairCloseTip", hair_close_tip); @@ -540,7 +540,7 @@ GPUBatch *curves_sub_pass_setup_implementation(PassT &sub_ps, sub_ps.push_constant("hairStrandsRes", &curves_cache->final[subdiv].strands_res, 1); sub_ps.push_constant("hairThicknessRes", thickness_res); sub_ps.push_constant("hairRadShape", hair_rad_shape); - sub_ps.push_constant("hairDupliMatrix", ob->object_to_world()); + sub_ps.push_constant("hairDupliMatrix", float4x4(ob->object_to_world)); sub_ps.push_constant("hairRadRoot", hair_rad_root); sub_ps.push_constant("hairRadTip", hair_rad_tip); sub_ps.push_constant("hairCloseTip", hair_close_tip); diff --git a/source/blender/draw/intern/draw_debug.cc b/source/blender/draw/intern/draw_debug.cc index d8de62f606f..860ee820913 100644 --- a/source/blender/draw/intern/draw_debug.cc +++ b/source/blender/draw/intern/draw_debug.cc @@ -146,7 +146,7 @@ void DebugDraw::draw_polygon(Span face_verts, float4 color) } } -void DebugDraw::draw_matrix(const float4x4 &m4) +void DebugDraw::draw_matrix(const float4x4 m4) { float3 v0 = float3(0.0f, 0.0f, 0.0f); float3 v1 = float3(1.0f, 0.0f, 0.0f); @@ -182,7 +182,7 @@ void DebugDraw::draw_bbox(const BoundBox &bbox, const float4 color) draw_line(bbox.vec[3], bbox.vec[7], col); } -void DebugDraw::draw_matrix_as_bbox(const float4x4 &mat, const float4 color) +void DebugDraw::draw_matrix_as_bbox(float4x4 mat, const float4 color) { BoundBox bb; const float min[3] = {-1.0f, -1.0f, -1.0f}, max[3] = {1.0f, 1.0f, 1.0f}; diff --git a/source/blender/draw/intern/draw_debug.hh b/source/blender/draw/intern/draw_debug.hh index f0f7da678c3..2b2f3d99d63 100644 --- a/source/blender/draw/intern/draw_debug.hh +++ b/source/blender/draw/intern/draw_debug.hh @@ -92,11 +92,11 @@ class DebugDraw { /** * Draw a matrix transformation as 3 colored axes. */ - void draw_matrix(const float4x4 &m4); + void draw_matrix(const float4x4 m4); /** * Draw a matrix as a 2 units length bounding box, centered on origin. */ - void draw_matrix_as_bbox(const float4x4 &mat, const float4 color = {1, 0, 0, 1}); + void draw_matrix_as_bbox(float4x4 mat, const float4 color = {1, 0, 0, 1}); /** * Will draw all debug shapes and text cached up until now to the current view / frame-buffer. diff --git a/source/blender/draw/intern/draw_hair.cc b/source/blender/draw/intern/draw_hair.cc index 71870adad11..5c0539c75cb 100644 --- a/source/blender/draw/intern/draw_hair.cc +++ b/source/blender/draw/intern/draw_hair.cc @@ -18,7 +18,7 @@ #include "DNA_modifier_types.h" #include "DNA_particle_types.h" -#include "BKE_duplilist.hh" +#include "BKE_duplilist.h" #include "GPU_batch.h" #include "GPU_capabilities.h" @@ -161,12 +161,12 @@ void DRW_hair_duplimat_get(Object *object, if (collection != nullptr) { sub_v3_v3(dupli_mat[3], collection->instance_offset); } - mul_m4_m4m4(dupli_mat, dupli_parent->object_to_world().ptr(), dupli_mat); + mul_m4_m4m4(dupli_mat, dupli_parent->object_to_world, dupli_mat); } else { - copy_m4_m4(dupli_mat, dupli_object->ob->object_to_world().ptr()); + copy_m4_m4(dupli_mat, dupli_object->ob->object_to_world); invert_m4(dupli_mat); - mul_m4_m4m4(dupli_mat, object->object_to_world().ptr(), dupli_mat); + mul_m4_m4m4(dupli_mat, object->object_to_world, dupli_mat); } } else { diff --git a/source/blender/draw/intern/draw_instance_data.cc b/source/blender/draw/intern/draw_instance_data.cc index d4c7ac6f855..7e94622de17 100644 --- a/source/blender/draw/intern/draw_instance_data.cc +++ b/source/blender/draw/intern/draw_instance_data.cc @@ -25,7 +25,7 @@ #include "DNA_particle_types.h" -#include "BKE_duplilist.hh" +#include "BKE_duplilist.h" #include "RNA_access.hh" #include "RNA_path.hh" diff --git a/source/blender/draw/intern/draw_manager.cc b/source/blender/draw/intern/draw_manager.cc index d5868a39b1d..3b9e3d51e1c 100644 --- a/source/blender/draw/intern/draw_manager.cc +++ b/source/blender/draw/intern/draw_manager.cc @@ -6,7 +6,7 @@ * \ingroup draw */ -#include "BKE_global.hh" +#include "BKE_global.h" #include "GPU_compute.h" #include "draw_debug.hh" @@ -47,9 +47,7 @@ void Manager::begin_sync() acquired_textures.clear(); layer_attributes.clear(); -// For some reason, if this uninitialised data pattern was enabled (ie release asserts enabled), -// The viewport just gives up rendering objects on ARM64 devices. Possibly Mesa GLOn12-related. -#if !defined(NDEBUG) && !defined(_M_ARM64) +#ifndef NDEBUG /* Detect uninitialized data. */ memset(matrix_buf.current().data(), 0xF0, diff --git a/source/blender/draw/intern/draw_manager.h b/source/blender/draw/intern/draw_manager.h index 53958b3f1b7..ab92e742123 100644 --- a/source/blender/draw/intern/draw_manager.h +++ b/source/blender/draw/intern/draw_manager.h @@ -24,7 +24,7 @@ #include "GPU_drawlist.h" #include "GPU_framebuffer.h" #include "GPU_shader.h" -#include "GPU_uniform_buffer.hh" +#include "GPU_uniform_buffer.h" #include "GPU_viewport.h" #include "draw_instance_data.h" @@ -58,19 +58,19 @@ struct CurvesUniformBufPool; # define PROFILE_TIMER_FALLOFF 0.04 # define PROFILE_START(time_start) \ - double time_start = BLI_time_now_seconds(); \ + double time_start = BLI_check_seconds_timer(); \ ((void)0) # define PROFILE_END_ACCUM(time_accum, time_start) \ { \ - time_accum += (BLI_time_now_seconds() - time_start) * 1e3; \ + time_accum += (BLI_check_seconds_timer() - time_start) * 1e3; \ } \ ((void)0) /* exp average */ # define PROFILE_END_UPDATE(time_update, time_start) \ { \ - double _time_delta = (BLI_time_now_seconds() - time_start) * 1e3; \ + double _time_delta = (BLI_check_seconds_timer() - time_start) * 1e3; \ time_update = (time_update * (1.0 - PROFILE_TIMER_FALLOFF)) + \ (_time_delta * PROFILE_TIMER_FALLOFF); \ } \ diff --git a/source/blender/draw/intern/draw_manager_c.cc b/source/blender/draw/intern/draw_manager_c.cc index 1b1f630e31d..781e0bfaa07 100644 --- a/source/blender/draw/intern/draw_manager_c.cc +++ b/source/blender/draw/intern/draw_manager_c.cc @@ -18,14 +18,14 @@ #include "BLF_api.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_context.hh" #include "BKE_curve.hh" #include "BKE_curves.h" -#include "BKE_duplilist.hh" +#include "BKE_duplilist.h" #include "BKE_editmesh.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_gpencil_legacy.h" #include "BKE_grease_pencil.h" #include "BKE_lattice.hh" @@ -62,7 +62,7 @@ #include "GPU_platform.h" #include "GPU_shader_shared.h" #include "GPU_state.h" -#include "GPU_uniform_buffer.hh" +#include "GPU_uniform_buffer.h" #include "GPU_viewport.h" #include "RE_engine.h" @@ -979,7 +979,7 @@ void DRW_cache_free_old_batches(Main *bmain) using namespace blender::draw; Scene *scene; static int lasttime = 0; - int ctime = int(BLI_time_now_seconds()); + int ctime = int(BLI_check_seconds_timer()); if (U.vbotimeout == 0 || (ctime - lasttime) < U.vbocollectrate || ctime == lasttime) { return; @@ -1067,7 +1067,7 @@ static void drw_engines_cache_populate(Object *ob) { DST.ob_handle = 0; - /* HACK: DrawData is copied by copy-on-eval from the duplicated object. + /* HACK: DrawData is copied by COW from the duplicated object. * This is valid for IDs that cannot be instantiated but this * is not what we want in this case so we clear the pointer * ourselves here. */ @@ -1271,7 +1271,8 @@ static void drw_engines_enable(ViewLayer * /*view_layer*/, drw_engines_enable_from_engine(engine_type, drawtype); if (gpencil_engine_needed && ((drawtype >= OB_SOLID) || !use_xray)) { - use_drw_engine(&draw_engine_gpencil_type); + use_drw_engine(U.experimental.use_grease_pencil_version3 ? &draw_engine_gpencil_next_type : + &draw_engine_gpencil_type); } if (is_compositor_enabled()) { @@ -1301,12 +1302,16 @@ static void drw_engines_data_validate() * For slow exact check use `DRW_render_check_grease_pencil` */ static bool drw_gpencil_engine_needed(Depsgraph *depsgraph, View3D *v3d) { - const bool exclude_gpencil_rendering = - v3d ? ((v3d->object_type_exclude_viewport & (1 << OB_GPENCIL_LEGACY)) != 0) || - ((v3d->object_type_exclude_viewport & (1 << OB_GREASE_PENCIL)) != 0) : - false; - return (!exclude_gpencil_rendering) && (DEG_id_type_any_exists(depsgraph, ID_GD_LEGACY) || - DEG_id_type_any_exists(depsgraph, ID_GP)); + if (U.experimental.use_grease_pencil_version3) { + const bool exclude_gpencil_rendering = v3d ? (v3d->object_type_exclude_viewport & + (1 << OB_GREASE_PENCIL)) != 0 : + false; + return (!exclude_gpencil_rendering) && DEG_id_type_any_exists(depsgraph, ID_GP); + } + const bool exclude_gpencil_rendering = v3d ? (v3d->object_type_exclude_viewport & + (1 << OB_GPENCIL_LEGACY)) != 0 : + false; + return (!exclude_gpencil_rendering) && DEG_id_type_any_exists(depsgraph, ID_GD_LEGACY); } /* -------------------------------------------------------------------- */ @@ -1467,7 +1472,7 @@ void DRW_draw_callbacks_post_scene() /* XXX: Or should we use a proper draw/overlay engine for this case? */ if (do_annotations) { GPU_depth_test(GPU_DEPTH_NONE); - /* XXX: as `scene->gpd` is not copied for copy-on-eval yet. */ + /* XXX: as `scene->gpd` is not copied for COW yet. */ ED_annotation_draw_view3d(DEG_get_input_scene(depsgraph), depsgraph, v3d, region, true); GPU_depth_test(GPU_DEPTH_LESS_EQUAL); } @@ -1520,7 +1525,7 @@ void DRW_draw_callbacks_post_scene() /* XXX: Or should we use a proper draw/overlay engine for this case? */ if (((v3d->flag2 & V3D_HIDE_OVERLAYS) == 0) && (do_annotations)) { GPU_depth_test(GPU_DEPTH_NONE); - /* XXX: as `scene->gpd` is not copied for copy-on-eval yet */ + /* XXX: as `scene->gpd` is not copied for COW yet */ ED_annotation_draw_view3d(DEG_get_input_scene(depsgraph), depsgraph, v3d, region, false); } @@ -1543,7 +1548,7 @@ void DRW_draw_callbacks_post_scene() else { if (v3d && ((v3d->flag2 & V3D_SHOW_ANNOTATION) != 0)) { GPU_depth_test(GPU_DEPTH_NONE); - /* XXX: as `scene->gpd` is not copied for copy-on-eval yet */ + /* XXX: as `scene->gpd` is not copied for COW yet */ ED_annotation_draw_view3d(DEG_get_input_scene(depsgraph), depsgraph, v3d, region, true); GPU_depth_test(GPU_DEPTH_LESS_EQUAL); } @@ -1865,7 +1870,9 @@ bool DRW_render_check_grease_pencil(Depsgraph *depsgraph) deg_iter_settings.depsgraph = depsgraph; deg_iter_settings.flags = DEG_OBJECT_ITER_FOR_RENDER_ENGINE_FLAGS; DEG_OBJECT_ITER_BEGIN (°_iter_settings, ob) { - if (ob->type == OB_GPENCIL_LEGACY || ob->type == OB_GREASE_PENCIL) { + if (ob->type == OB_GPENCIL_LEGACY || + (U.experimental.use_grease_pencil_version3 && ob->type == OB_GREASE_PENCIL)) + { if (DRW_object_visibility_in_active_context(ob) & OB_VISIBLE_SELF) { return true; } @@ -1880,7 +1887,9 @@ static void DRW_render_gpencil_to_image(RenderEngine *engine, RenderLayer *render_layer, const rcti *rect) { - DrawEngineType *draw_engine = &draw_engine_gpencil_type; + DrawEngineType *draw_engine = U.experimental.use_grease_pencil_version3 ? + &draw_engine_gpencil_next_type : + &draw_engine_gpencil_type; if (draw_engine->render_to_image) { ViewportEngineData *gpdata = DRW_view_data_engine_data_get_ensure(DST.view_data_active, draw_engine); @@ -2477,7 +2486,8 @@ void DRW_draw_select_loop(Depsgraph *depsgraph, else if (!draw_surface) { /* grease pencil selection */ if (drw_gpencil_engine_needed(depsgraph, v3d)) { - use_drw_engine(&draw_engine_gpencil_type); + use_drw_engine(U.experimental.use_grease_pencil_version3 ? &draw_engine_gpencil_next_type : + &draw_engine_gpencil_type); } drw_engines_enable_overlays(); @@ -2487,7 +2497,8 @@ void DRW_draw_select_loop(Depsgraph *depsgraph, drw_engines_enable_basic(); /* grease pencil selection */ if (drw_gpencil_engine_needed(depsgraph, v3d)) { - use_drw_engine(&draw_engine_gpencil_type); + use_drw_engine(U.experimental.use_grease_pencil_version3 ? &draw_engine_gpencil_next_type : + &draw_engine_gpencil_type); } drw_engines_enable_overlays(); @@ -2660,7 +2671,8 @@ void DRW_draw_depth_loop(Depsgraph *depsgraph, drw_manager_init(&DST, viewport, nullptr); if (use_gpencil) { - use_drw_engine(&draw_engine_gpencil_type); + use_drw_engine(U.experimental.use_grease_pencil_version3 ? &draw_engine_gpencil_next_type : + &draw_engine_gpencil_type); } if (use_basic) { drw_engines_enable_basic(); @@ -2849,7 +2861,7 @@ void DRW_draw_depth_object( GPU_matrix_projection_set(rv3d->winmat); GPU_matrix_set(rv3d->viewmat); - GPU_matrix_mul(object->object_to_world().ptr()); + GPU_matrix_mul(object->object_to_world); /* Setup frame-buffer. */ GPUTexture *depth_tx = GPU_viewport_depth_texture(viewport); @@ -2869,11 +2881,11 @@ void DRW_draw_depth_object( const bool use_clipping_planes = RV3D_CLIPPING_ENABLED(v3d, rv3d); if (use_clipping_planes) { GPU_clip_distances(6); - ED_view3d_clipping_local(rv3d, object->object_to_world().ptr()); + ED_view3d_clipping_local(rv3d, object->object_to_world); for (int i = 0; i < 6; i++) { copy_v4_v4(planes.world[i], rv3d->clip_local[i]); } - copy_m4_m4(planes.ClipModelMatrix.ptr(), object->object_to_world().ptr()); + copy_m4_m4(planes.ClipModelMatrix.ptr(), object->object_to_world); } drw_batch_cache_validate(object); @@ -3045,11 +3057,12 @@ void DRW_engines_register() RE_engines_register(&DRW_engine_viewport_eevee_type); /* Always register EEVEE Next so it can be used in background mode with `--factory-startup`. * (Needed for tests). */ - RE_engines_register(&DRW_engine_viewport_eevee_next_type); + // RE_engines_register(&DRW_engine_viewport_eevee_next_type); RE_engines_register(&DRW_engine_viewport_workbench_type); DRW_engine_register(&draw_engine_gpencil_type); + DRW_engine_register(&draw_engine_gpencil_next_type); DRW_engine_register(&draw_engine_overlay_type); DRW_engine_register(&draw_engine_overlay_next_type); diff --git a/source/blender/draw/intern/draw_manager_data.cc b/source/blender/draw/intern/draw_manager_data.cc index 0266d1fe3d5..e18af1b917f 100644 --- a/source/blender/draw/intern/draw_manager_data.cc +++ b/source/blender/draw/intern/draw_manager_data.cc @@ -14,8 +14,8 @@ #include "BKE_attribute.hh" #include "BKE_curve.hh" -#include "BKE_duplilist.hh" -#include "BKE_global.hh" +#include "BKE_duplilist.h" +#include "BKE_global.h" #include "BKE_image.h" #include "BKE_mesh.hh" #include "BKE_object.hh" @@ -46,7 +46,7 @@ #include "GPU_capabilities.h" #include "GPU_material.hh" -#include "GPU_uniform_buffer.hh" +#include "GPU_uniform_buffer.h" #include "intern/gpu_codegen.h" @@ -698,7 +698,7 @@ BLI_INLINE void drw_call_matrix_init(DRWObjectMatrix *ob_mats, { copy_m4_m4(ob_mats->model, obmat); if (ob) { - copy_m4_m4(ob_mats->modelinverse, ob->world_to_object().ptr()); + copy_m4_m4(ob_mats->modelinverse, ob->world_to_object); } else { /* WATCH: Can be costly. */ @@ -745,8 +745,8 @@ static void drw_call_culling_init(DRWCullingState *cull, const Object *ob) float corner[3]; /* Get BoundSphere center and radius from the BoundBox. */ mid_v3_v3v3(cull->bsphere.center, bounds->max, bounds->min); - mul_v3_m4v3(corner, ob->object_to_world().ptr(), bounds->max); - mul_m4_v3(ob->object_to_world().ptr(), cull->bsphere.center); + mul_v3_m4v3(corner, ob->object_to_world, bounds->max); + mul_m4_v3(ob->object_to_world, cull->bsphere.center); cull->bsphere.radius = len_v3v3(cull->bsphere.center, corner); /* Bypass test for very large objects (see #67319). */ @@ -1038,8 +1038,7 @@ void DRW_shgroup_call_ex(DRWShadingGroup *shgroup, if (G.f & G_FLAG_PICKSEL) { drw_command_set_select_id(shgroup, nullptr, DST.select_id); } - DRWResourceHandle handle = drw_resource_handle( - shgroup, ob ? ob->object_to_world().ptr() : obmat, ob); + DRWResourceHandle handle = drw_resource_handle(shgroup, ob ? ob->object_to_world : obmat, ob); drw_command_draw(shgroup, geom, handle); /* Culling data. */ @@ -1064,8 +1063,7 @@ void DRW_shgroup_call_range( if (G.f & G_FLAG_PICKSEL) { drw_command_set_select_id(shgroup, nullptr, DST.select_id); } - DRWResourceHandle handle = drw_resource_handle( - shgroup, ob ? ob->object_to_world().ptr() : nullptr, ob); + DRWResourceHandle handle = drw_resource_handle(shgroup, ob ? ob->object_to_world : nullptr, ob); drw_command_draw_range(shgroup, geom, handle, v_sta, v_num); } @@ -1076,8 +1074,7 @@ void DRW_shgroup_call_instance_range( if (G.f & G_FLAG_PICKSEL) { drw_command_set_select_id(shgroup, nullptr, DST.select_id); } - DRWResourceHandle handle = drw_resource_handle( - shgroup, ob ? ob->object_to_world().ptr() : nullptr, ob); + DRWResourceHandle handle = drw_resource_handle(shgroup, ob ? ob->object_to_world : nullptr, ob); drw_command_draw_intance_range(shgroup, geom, handle, i_sta, i_num); } @@ -1123,8 +1120,7 @@ static void drw_shgroup_call_procedural_add_ex(DRWShadingGroup *shgroup, if (G.f & G_FLAG_PICKSEL) { drw_command_set_select_id(shgroup, nullptr, DST.select_id); } - DRWResourceHandle handle = drw_resource_handle( - shgroup, ob ? ob->object_to_world().ptr() : nullptr, ob); + DRWResourceHandle handle = drw_resource_handle(shgroup, ob ? ob->object_to_world : nullptr, ob); drw_command_draw_procedural(shgroup, geom, handle, vert_count); } @@ -1178,8 +1174,7 @@ void DRW_shgroup_call_procedural_indirect(DRWShadingGroup *shgroup, if (G.f & G_FLAG_PICKSEL) { drw_command_set_select_id(shgroup, nullptr, DST.select_id); } - DRWResourceHandle handle = drw_resource_handle( - shgroup, ob ? ob->object_to_world().ptr() : nullptr, ob); + DRWResourceHandle handle = drw_resource_handle(shgroup, ob ? ob->object_to_world : nullptr, ob); drw_command_draw_indirect(shgroup, geom, handle, indirect_buf); } @@ -1192,8 +1187,7 @@ void DRW_shgroup_call_instances(DRWShadingGroup *shgroup, if (G.f & G_FLAG_PICKSEL) { drw_command_set_select_id(shgroup, nullptr, DST.select_id); } - DRWResourceHandle handle = drw_resource_handle( - shgroup, ob ? ob->object_to_world().ptr() : nullptr, ob); + DRWResourceHandle handle = drw_resource_handle(shgroup, ob ? ob->object_to_world : nullptr, ob); drw_command_draw_instance(shgroup, geom, handle, count, false); } @@ -1207,8 +1201,7 @@ void DRW_shgroup_call_instances_with_attrs(DRWShadingGroup *shgroup, if (G.f & G_FLAG_PICKSEL) { drw_command_set_select_id(shgroup, nullptr, DST.select_id); } - DRWResourceHandle handle = drw_resource_handle( - shgroup, ob ? ob->object_to_world().ptr() : nullptr, ob); + DRWResourceHandle handle = drw_resource_handle(shgroup, ob ? ob->object_to_world : nullptr, ob); GPUBatch *batch = DRW_temp_batch_instance_request( DST.vmempool->idatalist, nullptr, inst_attributes, geom); drw_command_draw_instance(shgroup, batch, handle, 0, true); @@ -1312,7 +1305,7 @@ static void drw_sculpt_get_frustum_planes(const Object *ob, float planes[6][4]) * 4x4 matrix is done by multiplying with the transpose inverse. * The inverse cancels out here since we transform by inverse(obmat). */ float tmat[4][4]; - transpose_m4_m4(tmat, ob->object_to_world().ptr()); + transpose_m4_m4(tmat, ob->object_to_world); for (int i = 0; i < 6; i++) { mul_m4_v4(tmat, planes[i]); } @@ -1390,7 +1383,7 @@ static void drw_sculpt_generate_calls(DRWSculptCallbackData *scd) if (SCULPT_DEBUG_BUFFERS) { int debug_node_nr = 0; - DRW_debug_modelmat(scd->ob->object_to_world().ptr()); + DRW_debug_modelmat(scd->ob->object_to_world); BKE_pbvh_draw_debug_cb( pbvh, (void (*)(PBVHNode *n, void *d, const float min[3], const float max[3], PBVHNodeFlags f)) diff --git a/source/blender/draw/intern/draw_manager_exec.cc b/source/blender/draw/intern/draw_manager_exec.cc index aa8dc9c835d..491a864a18c 100644 --- a/source/blender/draw/intern/draw_manager_exec.cc +++ b/source/blender/draw/intern/draw_manager_exec.cc @@ -12,7 +12,7 @@ #include "BLI_math_bits.h" #include "BLI_memblock.h" -#include "BKE_global.hh" +#include "BKE_global.h" #include "GPU_compute.h" #include "GPU_platform.h" diff --git a/source/blender/draw/intern/draw_manager_profiling.cc b/source/blender/draw/intern/draw_manager_profiling.cc index 54d560610a4..c0f7b9600c2 100644 --- a/source/blender/draw/intern/draw_manager_profiling.cc +++ b/source/blender/draw/intern/draw_manager_profiling.cc @@ -12,7 +12,7 @@ #include "BLI_rect.h" #include "BLI_string.h" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BLF_api.hh" diff --git a/source/blender/draw/intern/draw_manager_shader.cc b/source/blender/draw/intern/draw_manager_shader.cc index a7a53498c6d..caa2ca085aa 100644 --- a/source/blender/draw/intern/draw_manager_shader.cc +++ b/source/blender/draw/intern/draw_manager_shader.cc @@ -17,7 +17,7 @@ #include "BLI_time.h" #include "BKE_context.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_main.hh" #include "DEG_depsgraph_query.hh" @@ -275,7 +275,7 @@ static void drw_deferred_shader_add(GPUMaterial *mat, bool deferred) DRW_deferred_shader_remove(mat); /* Shaders could already be compiling. Have to wait for compilation to finish. */ while (GPU_material_status(mat) == GPU_MAT_QUEUED) { - BLI_time_sleep_ms(20); + BLI_sleep_ms(20); } if (GPU_material_status(mat) == GPU_MAT_CREATED) { GPU_material_compile(mat); @@ -573,7 +573,7 @@ void DRW_shader_queue_optimize_material(GPUMaterial *mat) DRW_deferred_shader_optimize_remove(mat); /* If optimization job had already started, wait for it to complete. */ while (GPU_material_optimization_status(mat) == GPU_MAT_OPTIMIZATION_QUEUED) { - BLI_time_sleep_ms(20); + BLI_sleep_ms(20); } } return; diff --git a/source/blender/draw/intern/draw_manager_text.cc b/source/blender/draw/intern/draw_manager_text.cc index 234c82972da..b02dda327a0 100644 --- a/source/blender/draw/intern/draw_manager_text.cc +++ b/source/blender/draw/intern/draw_manager_text.cc @@ -18,7 +18,7 @@ #include "BKE_editmesh.hh" #include "BKE_editmesh_cache.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_mesh.hh" #include "BKE_mesh_wrapper.hh" #include "BKE_object.hh" @@ -340,11 +340,11 @@ void DRW_text_edit_mesh_measure_stats(ARegion *region, if (clip_segment_v3_plane_n(v1, v2, clip_planes, 4, v1_clip, v2_clip)) { mid_v3_v3v3(vmid, v1_clip, v2_clip); - mul_m4_v3(ob->object_to_world().ptr(), vmid); + mul_m4_v3(ob->object_to_world, vmid); if (do_global) { - mul_mat3_m4_v3(ob->object_to_world().ptr(), v1); - mul_mat3_m4_v3(ob->object_to_world().ptr(), v2); + mul_mat3_m4_v3(ob->object_to_world, v1); + mul_mat3_m4_v3(ob->object_to_world, v2); } if (unit->system) { @@ -408,7 +408,7 @@ void DRW_text_edit_mesh_measure_stats(ARegion *region, float angle; mid_v3_v3v3(vmid, v1_clip, v2_clip); - mul_m4_v3(ob->object_to_world().ptr(), vmid); + mul_m4_v3(ob->object_to_world, vmid); if (use_coords) { copy_v3_v3(no_a, face_normals[BM_elem_index_get(l_a->f)]); @@ -420,8 +420,8 @@ void DRW_text_edit_mesh_measure_stats(ARegion *region, } if (do_global) { - mul_mat3_m4_v3(ob->world_to_object().ptr(), no_a); - mul_mat3_m4_v3(ob->world_to_object().ptr(), no_b); + mul_mat3_m4_v3(ob->world_to_object, no_a); + mul_mat3_m4_v3(ob->world_to_object, no_b); normalize_v3(no_a); normalize_v3(no_b); } @@ -477,16 +477,16 @@ void DRW_text_edit_mesh_measure_stats(ARegion *region, n += 3; if (do_global) { - mul_mat3_m4_v3(ob->object_to_world().ptr(), v1); - mul_mat3_m4_v3(ob->object_to_world().ptr(), v2); - mul_mat3_m4_v3(ob->object_to_world().ptr(), v3); + mul_mat3_m4_v3(ob->object_to_world, v1); + mul_mat3_m4_v3(ob->object_to_world, v2); + mul_mat3_m4_v3(ob->object_to_world, v3); } area += area_tri_v3(v1, v2, v3); } mul_v3_fl(vmid, 1.0f / float(n)); - mul_m4_v3(ob->object_to_world().ptr(), vmid); + mul_m4_v3(ob->object_to_world, vmid); if (unit->system) { numstr_len = BKE_unit_value_as_string( @@ -557,9 +557,9 @@ void DRW_text_edit_mesh_measure_stats(ARegion *region, copy_v3_v3(v2_local, v2); if (do_global) { - mul_mat3_m4_v3(ob->object_to_world().ptr(), v1); - mul_mat3_m4_v3(ob->object_to_world().ptr(), v2); - mul_mat3_m4_v3(ob->object_to_world().ptr(), v3); + mul_mat3_m4_v3(ob->object_to_world, v1); + mul_mat3_m4_v3(ob->object_to_world, v2); + mul_mat3_m4_v3(ob->object_to_world, v3); } float angle = angle_v3v3v3(v1, v2, v3); @@ -569,7 +569,7 @@ void DRW_text_edit_mesh_measure_stats(ARegion *region, (is_rad) ? angle : RAD2DEGF(angle), (is_rad) ? "r" : BLI_STR_UTF8_DEGREE_SIGN); interp_v3_v3v3(fvec, vmid, v2_local, 0.8f); - mul_m4_v3(ob->object_to_world().ptr(), fvec); + mul_m4_v3(ob->object_to_world, fvec); DRW_text_cache_add(dt, fvec, numstr, numstr_len, 0, 0, txt_flag, col); } } @@ -600,7 +600,7 @@ void DRW_text_edit_mesh_measure_stats(ARegion *region, copy_v3_v3(v1, v->co); } - mul_m4_v3(ob->object_to_world().ptr(), v1); + mul_m4_v3(ob->object_to_world, v1); numstr_len = SNPRINTF_RLEN(numstr, "%d", i); DRW_text_cache_add(dt, v1, numstr, numstr_len, 0, 0, txt_flag, col); @@ -629,7 +629,7 @@ void DRW_text_edit_mesh_measure_stats(ARegion *region, if (clip_segment_v3_plane_n(v1, v2, clip_planes, 4, v1_clip, v2_clip)) { mid_v3_v3v3(vmid, v1_clip, v2_clip); - mul_m4_v3(ob->object_to_world().ptr(), vmid); + mul_m4_v3(ob->object_to_world, vmid); numstr_len = SNPRINTF_RLEN(numstr, "%d", i); DRW_text_cache_add( @@ -663,7 +663,7 @@ void DRW_text_edit_mesh_measure_stats(ARegion *region, BM_face_calc_center_median(f, v1); } - mul_m4_v3(ob->object_to_world().ptr(), v1); + mul_m4_v3(ob->object_to_world, v1); numstr_len = SNPRINTF_RLEN(numstr, "%d", i); DRW_text_cache_add(dt, v1, numstr, numstr_len, 0, 0, txt_flag, col); diff --git a/source/blender/draw/intern/draw_pass.hh b/source/blender/draw/intern/draw_pass.hh index 3a7141274b7..0ca3fe9271e 100644 --- a/source/blender/draw/intern/draw_pass.hh +++ b/source/blender/draw/intern/draw_pass.hh @@ -340,7 +340,7 @@ class PassBase { * IMPORTANT: Will keep a reference to the data and dereference it upon drawing. Make sure data * still alive until pass submission. * - * \note bool reference version is expected to take bool32_t reference which is aliased to int. + * \note bool reference version is expected to take bool1 reference which is aliased to int. */ void push_constant(const char *name, const float &data); void push_constant(const char *name, const float2 &data); diff --git a/source/blender/draw/intern/draw_pbvh.cc b/source/blender/draw/intern/draw_pbvh.cc index 138ca2cf50b..1eb9d1eed12 100644 --- a/source/blender/draw/intern/draw_pbvh.cc +++ b/source/blender/draw/intern/draw_pbvh.cc @@ -597,11 +597,9 @@ struct PBVHBatches { using T = decltype(dummy); using Converter = AttributeConverter; using VBOType = typename Converter::VBOType; - if constexpr (!std::is_void_v) { - std::fill_n(static_cast(GPU_vertbuf_get_data(vbo.vert_buf)), - GPU_vertbuf_get_vertex_len(vbo.vert_buf), - Converter::convert(fallback_value_for_fill())); - } + std::fill_n(static_cast(GPU_vertbuf_get_data(vbo.vert_buf)), + GPU_vertbuf_get_vertex_len(vbo.vert_buf), + Converter::convert(fallback_value_for_fill())); }); } } @@ -771,20 +769,18 @@ struct PBVHBatches { const GVArraySpan attribute = *attributes.lookup_or_default(name, domain, data_type); bke::attribute_math::convert_to_static_type(data_type, [&](auto dummy) { using T = decltype(dummy); - if constexpr (!std::is_void_v::VBOType>) { - switch (domain) { - case bke::AttrDomain::Point: - extract_data_vert_faces(args, attribute.typed(), vert_buf); - break; - case bke::AttrDomain::Face: - extract_data_face_faces(args, attribute.typed(), vert_buf); - break; - case bke::AttrDomain::Corner: - extract_data_corner_faces(args, attribute.typed(), vert_buf); - break; - default: - BLI_assert_unreachable(); - } + switch (domain) { + case bke::AttrDomain::Point: + extract_data_vert_faces(args, attribute.typed(), vert_buf); + break; + case bke::AttrDomain::Face: + extract_data_face_faces(args, attribute.typed(), vert_buf); + break; + case bke::AttrDomain::Corner: + extract_data_corner_faces(args, attribute.typed(), vert_buf); + break; + default: + BLI_assert_unreachable(); } }); } @@ -933,26 +929,25 @@ struct PBVHBatches { } else { const GenericRequest &request = std::get(vbo.request); + const StringRefNull name = request.name; const bke::AttrDomain domain = request.domain; const eCustomDataType data_type = request.type; const CustomData &custom_data = *get_cdata(domain, args); - const int cd_offset = CustomData_get_offset_named(&custom_data, data_type, request.name); + const int cd_offset = CustomData_get_offset_named(&custom_data, data_type, name.c_str()); bke::attribute_math::convert_to_static_type(data_type, [&](auto dummy) { using T = decltype(dummy); - if constexpr (!std::is_void_v::VBOType>) { - switch (domain) { - case bke::AttrDomain::Point: - extract_data_vert_bmesh(args, cd_offset, *vbo.vert_buf); - break; - case bke::AttrDomain::Face: - extract_data_face_bmesh(args, cd_offset, *vbo.vert_buf); - break; - case bke::AttrDomain::Corner: - extract_data_corner_bmesh(args, cd_offset, *vbo.vert_buf); - break; - default: - BLI_assert_unreachable(); - } + switch (domain) { + case bke::AttrDomain::Point: + extract_data_vert_bmesh(args, cd_offset, *vbo.vert_buf); + break; + case bke::AttrDomain::Face: + extract_data_face_bmesh(args, cd_offset, *vbo.vert_buf); + break; + case bke::AttrDomain::Corner: + extract_data_corner_bmesh(args, cd_offset, *vbo.vert_buf); + break; + default: + BLI_assert_unreachable(); } }); } diff --git a/source/blender/draw/intern/draw_resource.hh b/source/blender/draw/intern/draw_resource.hh index 64a4603d909..56520094adc 100644 --- a/source/blender/draw/intern/draw_resource.hh +++ b/source/blender/draw/intern/draw_resource.hh @@ -14,7 +14,7 @@ #include "BLI_math_matrix.hh" #include "BKE_curve.hh" -#include "BKE_duplilist.hh" +#include "BKE_duplilist.h" #include "BKE_mesh.h" #include "BKE_object.hh" #include "BKE_volume.hh" @@ -34,8 +34,8 @@ inline void ObjectMatrices::sync(const Object &object) { - model = object.object_to_world(); - model_inverse = object.world_to_object(); + model.view() = blender::float4x4_view(object.object_to_world); + model_inverse.view() = blender::float4x4_view(object.world_to_object); } inline void ObjectMatrices::sync(const float4x4 &model_matrix) diff --git a/source/blender/draw/intern/draw_sculpt.cc b/source/blender/draw/intern/draw_sculpt.cc index 869eefd77a1..0559879dab4 100644 --- a/source/blender/draw/intern/draw_sculpt.cc +++ b/source/blender/draw/intern/draw_sculpt.cc @@ -68,7 +68,7 @@ static Vector sculpt_batches_get_ex(const Object *ob, /* Transform clipping planes to object space. Transforming a plane with a * 4x4 matrix is done by multiplying with the transpose inverse. * The inverse cancels out here since we transform by inverse(obmat). */ - float4x4 tmat = math::transpose(ob->object_to_world()); + float4x4 tmat = math::transpose(float4x4(ob->object_to_world)); for (int i : IndexRange(6)) { draw_planes[i] = tmat * draw_planes[i]; update_planes[i] = draw_planes[i]; diff --git a/source/blender/draw/intern/draw_select_buffer.cc b/source/blender/draw/intern/draw_select_buffer.cc index c74eabebff4..7e42d22c611 100644 --- a/source/blender/draw/intern/draw_select_buffer.cc +++ b/source/blender/draw/intern/draw_select_buffer.cc @@ -29,9 +29,6 @@ #include "../engines/select/select_engine.hh" -using blender::int2; -using blender::Span; - bool SELECTID_Context::is_dirty(RegionView3D *rv3d) { /* Check if the viewport has changed. */ @@ -232,7 +229,8 @@ static void drw_select_mask_px_cb(int x, int x_end, int y, void *user_data) uint *DRW_select_buffer_bitmap_from_poly(Depsgraph *depsgraph, ARegion *region, View3D *v3d, - const Span poly, + const int poly[][2], + const int face_len, const rcti *rect, uint *r_bitmap_len) { @@ -259,6 +257,7 @@ uint *DRW_select_buffer_bitmap_from_poly(Depsgraph *depsgraph, rect_px.xmax, rect_px.ymax, poly, + face_len, drw_select_mask_px_cb, &poly_mask_data); diff --git a/source/blender/draw/intern/draw_shader.hh b/source/blender/draw/intern/draw_shader.hh index 6d4c6c010b7..fb9349680b8 100644 --- a/source/blender/draw/intern/draw_shader.hh +++ b/source/blender/draw/intern/draw_shader.hh @@ -26,4 +26,4 @@ GPUShader *DRW_shader_draw_view_finalize_get(); GPUShader *DRW_shader_draw_resource_finalize_get(); GPUShader *DRW_shader_draw_command_generate_get(); -void DRW_shaders_free(); +void DRW_shaders_free(void); diff --git a/source/blender/draw/intern/draw_subdivision.hh b/source/blender/draw/intern/draw_subdivision.hh index a2924613144..a82beef848b 100644 --- a/source/blender/draw/intern/draw_subdivision.hh +++ b/source/blender/draw/intern/draw_subdivision.hh @@ -4,7 +4,6 @@ #pragma once -#include "BLI_math_matrix_types.hh" #include "BLI_span.hh" #include "BLI_sys_types.h" @@ -200,7 +199,7 @@ void DRW_create_subdivision(Object *ob, bool is_editmode, bool is_paint_mode, bool is_mode_active, - const float4x4 &object_to_world, + const float obmat[4][4], bool do_final, bool do_uvedit, bool do_cage, diff --git a/source/blender/draw/intern/draw_texture_pool.cc b/source/blender/draw/intern/draw_texture_pool.cc index 29638a8644f..7254b15a425 100644 --- a/source/blender/draw/intern/draw_texture_pool.cc +++ b/source/blender/draw/intern/draw_texture_pool.cc @@ -6,7 +6,7 @@ * \ingroup draw */ -#include "BKE_global.hh" +#include "BKE_global.h" #include "BLI_string.h" #include "BLI_vector.hh" diff --git a/source/blender/draw/intern/draw_view_c.cc b/source/blender/draw/intern/draw_view_c.cc index a982282c5d4..8200dca4e63 100644 --- a/source/blender/draw/intern/draw_view_c.cc +++ b/source/blender/draw/intern/draw_view_c.cc @@ -29,7 +29,7 @@ #include "BLI_math_rotation.h" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_object.hh" #include "BKE_paint.hh" diff --git a/source/blender/draw/intern/draw_volume.cc b/source/blender/draw/intern/draw_volume.cc index efb6ddf1365..e9a18aa4faf 100644 --- a/source/blender/draw/intern/draw_volume.cc +++ b/source/blender/draw/intern/draw_volume.cc @@ -15,7 +15,7 @@ #include "DNA_volume_types.h" #include "BKE_fluid.h" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_mesh.hh" #include "BKE_modifier.hh" #include "BKE_volume.hh" @@ -129,7 +129,7 @@ static DRWShadingGroup *drw_volume_object_grids_init(Object *ob, grp = DRW_shgroup_create_sub(grp); - volume_infos.density_scale = BKE_volume_density_scale(volume, ob->object_to_world().ptr()); + volume_infos.density_scale = BKE_volume_density_scale(volume, ob->object_to_world); volume_infos.color_mul = float4(1.0f); volume_infos.temperature_mul = 1.0f; volume_infos.temperature_bias = 0.0f; @@ -305,7 +305,7 @@ PassType *volume_object_grids_init(PassType &ps, Volume *volume = (Volume *)ob->data; BKE_volume_load(volume, G.main); - volume_infos.density_scale = BKE_volume_density_scale(volume, ob->object_to_world().ptr()); + volume_infos.density_scale = BKE_volume_density_scale(volume, ob->object_to_world); volume_infos.color_mul = float4(1.0f); volume_infos.temperature_mul = 1.0f; volume_infos.temperature_bias = 0.0f; diff --git a/source/blender/draw/intern/mesh_extractors/extract_mesh.cc b/source/blender/draw/intern/mesh_extractors/extract_mesh.cc index 2f649ee25b3..c715cbcb068 100644 --- a/source/blender/draw/intern/mesh_extractors/extract_mesh.cc +++ b/source/blender/draw/intern/mesh_extractors/extract_mesh.cc @@ -52,8 +52,11 @@ eMRIterType mesh_extract_iter_type(const MeshExtract *ext) static const MeshExtract *mesh_extract_override_hq_normals(const MeshExtract *extractor) { - if (extractor == &extract_nor) { - return &extract_nor_hq; + if (extractor == &extract_pos_nor) { + return &extract_pos_nor_hq; + } + if (extractor == &extract_lnor) { + return &extract_lnor_hq; } if (extractor == &extract_tan) { return &extract_tan_hq; diff --git a/source/blender/draw/intern/mesh_extractors/extract_mesh.hh b/source/blender/draw/intern/mesh_extractors/extract_mesh.hh index cdd7fc70fc0..9f4437ea98e 100644 --- a/source/blender/draw/intern/mesh_extractors/extract_mesh.hh +++ b/source/blender/draw/intern/mesh_extractors/extract_mesh.hh @@ -10,7 +10,6 @@ #pragma once -#include "BLI_math_matrix_types.hh" #include "BLI_math_vector_types.hh" #include "BLI_virtual_array.hh" @@ -62,7 +61,7 @@ struct MeshRenderData { bool use_simplify_normals; /** Use for #MeshStatVis calculation which use world-space coords. */ - float4x4 object_to_world; + float obmat[4][4]; const ToolSettings *toolsettings; /** Edit Mesh */ @@ -281,10 +280,9 @@ MeshRenderData *mesh_render_data_create(Object *object, bool is_editmode, bool is_paint_mode, bool is_mode_active, - const float4x4 &object_to_world, + const float obmat[4][4], bool do_final, bool do_uvedit, - bool use_hide, const ToolSettings *ts); void mesh_render_data_free(MeshRenderData *mr); void mesh_render_data_update_normals(MeshRenderData &mr, eMRDataType data_flag); @@ -331,9 +329,6 @@ void mesh_render_data_loop_edge_flag(const MeshRenderData &mr, BMUVOffsets offsets, EditLoopData *eattr); -template -void extract_vert_normals(const MeshRenderData &mr, MutableSpan normals); - extern const MeshExtract extract_tris; extern const MeshExtract extract_tris_single_mat; extern const MeshExtract extract_lines; @@ -347,9 +342,10 @@ extern const MeshExtract extract_edituv_tris; extern const MeshExtract extract_edituv_lines; extern const MeshExtract extract_edituv_points; extern const MeshExtract extract_edituv_fdots; -extern const MeshExtract extract_pos; -extern const MeshExtract extract_nor_hq; -extern const MeshExtract extract_nor; +extern const MeshExtract extract_pos_nor; +extern const MeshExtract extract_pos_nor_hq; +extern const MeshExtract extract_lnor_hq; +extern const MeshExtract extract_lnor; extern const MeshExtract extract_uv; extern const MeshExtract extract_tan; extern const MeshExtract extract_tan_hq; @@ -375,6 +371,5 @@ extern const MeshExtract extract_vert_idx; extern const MeshExtract extract_fdot_idx; extern const MeshExtract extract_attr[GPU_MAX_ATTR]; extern const MeshExtract extract_attr_viewer; -extern const MeshExtract extract_vnor; } // namespace blender::draw diff --git a/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_attributes.cc b/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_attributes.cc index ebf4eb90796..3273aee43a7 100644 --- a/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_attributes.cc +++ b/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_attributes.cc @@ -199,23 +199,21 @@ static void extract_attribute(const MeshRenderData &mr, bke::attribute_math::convert_to_static_type(request.cd_type, [&](auto dummy) { using T = decltype(dummy); - if constexpr (!std::is_void_v::VBOType>) { - switch (request.domain) { - case bke::AttrDomain::Point: - extract_data_bmesh_vert(*mr.bm, cd_offset, vbo); - break; - case bke::AttrDomain::Edge: - extract_data_bmesh_edge(*mr.bm, cd_offset, vbo); - break; - case bke::AttrDomain::Face: - extract_data_bmesh_face(*mr.bm, cd_offset, vbo); - break; - case bke::AttrDomain::Corner: - extract_data_bmesh_loop(*mr.bm, cd_offset, vbo); - break; - default: - BLI_assert_unreachable(); - } + switch (request.domain) { + case bke::AttrDomain::Point: + extract_data_bmesh_vert(*mr.bm, cd_offset, vbo); + break; + case bke::AttrDomain::Edge: + extract_data_bmesh_edge(*mr.bm, cd_offset, vbo); + break; + case bke::AttrDomain::Face: + extract_data_bmesh_face(*mr.bm, cd_offset, vbo); + break; + case bke::AttrDomain::Corner: + extract_data_bmesh_loop(*mr.bm, cd_offset, vbo); + break; + default: + BLI_assert_unreachable(); } }); } @@ -227,23 +225,21 @@ static void extract_attribute(const MeshRenderData &mr, bke::attribute_math::convert_to_static_type(request.cd_type, [&](auto dummy) { using T = decltype(dummy); - if constexpr (!std::is_void_v::VBOType>) { - switch (request.domain) { - case bke::AttrDomain::Point: - extract_data_mesh_mapped_corner(attribute.typed(), mr.corner_verts, vbo); - break; - case bke::AttrDomain::Edge: - extract_data_mesh_mapped_corner(attribute.typed(), mr.corner_edges, vbo); - break; - case bke::AttrDomain::Face: - extract_data_mesh_face(mr.faces, attribute.typed(), vbo); - break; - case bke::AttrDomain::Corner: - vertbuf_data_extract_direct(attribute.typed(), vbo); - break; - default: - BLI_assert_unreachable(); - } + switch (request.domain) { + case bke::AttrDomain::Point: + extract_data_mesh_mapped_corner(attribute.typed(), mr.corner_verts, vbo); + break; + case bke::AttrDomain::Edge: + extract_data_mesh_mapped_corner(attribute.typed(), mr.corner_edges, vbo); + break; + case bke::AttrDomain::Face: + extract_data_mesh_face(mr.faces, attribute.typed(), vbo); + break; + case bke::AttrDomain::Corner: + vertbuf_data_extract_direct(attribute.typed(), vbo); + break; + default: + BLI_assert_unreachable(); } }); } @@ -286,14 +282,12 @@ static void extract_attr_init_subdiv(const DRWSubdivCache &subdiv_cache, bke::attribute_math::convert_to_static_type(request.cd_type, [&](auto dummy) { using T = decltype(dummy); using Converter = AttributeConverter; - if constexpr (!std::is_void_v) { - draw_subdiv_interp_custom_data(subdiv_cache, - src_data, - dst_buffer, - Converter::gpu_component_type, - Converter::gpu_component_len, - 0); - } + draw_subdiv_interp_custom_data(subdiv_cache, + src_data, + dst_buffer, + Converter::gpu_component_type, + Converter::gpu_component_len, + 0); }); GPU_vertbuf_discard(src_data); diff --git a/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_edge_fac.cc b/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_edge_fac.cc index c41d645e347..e270107442e 100644 --- a/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_edge_fac.cc +++ b/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_edge_fac.cc @@ -291,7 +291,7 @@ static void extract_edge_fac_init_subdiv(const DRWSubdivCache &subdiv_cache, GPU_vertbuf_init_build_on_device( vbo, get_subdiv_edge_fac_format(), subdiv_cache.num_subdiv_loops + loose_geom.loop_len); - GPUVertBuf *pos_nor = cache.final.buff.vbo.pos; + GPUVertBuf *pos_nor = cache.final.buff.vbo.pos_nor; GPUVertBuf *poly_other_map = build_poly_other_map_vbo(subdiv_cache); draw_subdiv_build_edge_fac_buffer( diff --git a/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_edituv_stretch_angle.cc b/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_edituv_stretch_angle.cc index e8c4a75d941..813c197e780 100644 --- a/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_edituv_stretch_angle.cc +++ b/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_edituv_stretch_angle.cc @@ -233,7 +233,7 @@ static void extract_edituv_stretch_angle_init_subdiv(const DRWSubdivCache &subdi GPU_vertbuf_init_build_on_device( refined_vbo, get_edituv_stretch_angle_format_subdiv(), subdiv_cache.num_subdiv_loops); - GPUVertBuf *pos_nor = cache.final.buff.vbo.pos; + GPUVertBuf *pos_nor = cache.final.buff.vbo.pos_nor; GPUVertBuf *uvs = cache.final.buff.vbo.uv; /* It may happen that the data for the UV editor is requested before (as a separate draw update) @@ -282,7 +282,7 @@ static void extract_edituv_stretch_angle_init_subdiv(const DRWSubdivCache &subdi draw_subdiv_build_edituv_stretch_angle_buffer( subdiv_cache, pos_nor, uvs, uvs_offset, refined_vbo); - if (!cache.final.buff.vbo.pos) { + if (!cache.final.buff.vbo.pos_nor) { GPU_vertbuf_discard(pos_nor); } } diff --git a/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_lnor.cc b/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_lnor.cc index f0c4291ac7b..777427037fb 100644 --- a/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_lnor.cc +++ b/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_lnor.cc @@ -6,8 +6,6 @@ * \ingroup draw */ -#include "BLI_array_utils.hh" - #include "extract_mesh.hh" #include "draw_subdivision.hh" @@ -18,139 +16,6 @@ namespace blender::draw { /** \name Extract Loop Normal * \{ */ -template inline GPUType convert_normal(const float3 &src); - -template<> inline GPUPackedNormal convert_normal(const float3 &src) -{ - return GPU_normal_convert_i10_v3(src); -} - -template<> inline short4 convert_normal(const float3 &src) -{ - short4 dst; - normal_float_to_short_v3(dst, src); - return dst; -} - -template -static void extract_normals(const Span src, MutableSpan dst) -{ - threading::parallel_for(src.index_range(), 2048, [&](const IndexRange range) { - for (const int i : range) { - dst[i] = convert_normal(src[i]); - } - }); -} - -template -static void extract_vert_normals_impl(const MeshRenderData &mr, MutableSpan normals) -{ - Array vert_normals_converted(mr.vert_normals.size()); - extract_normals(mr.vert_normals, vert_normals_converted.as_mutable_span()); - array_utils::gather(vert_normals_converted.as_span(), mr.corner_verts, normals); -} - -template<> -void extract_vert_normals(const MeshRenderData &mr, MutableSpan normals) -{ - extract_vert_normals_impl(mr, normals); -} -template<> void extract_vert_normals(const MeshRenderData &mr, MutableSpan normals) -{ - extract_vert_normals_impl(mr, normals); -} - -template -static void extract_face_normals(const MeshRenderData &mr, MutableSpan normals) -{ - const OffsetIndices faces = mr.faces; - const Span face_normals = mr.face_normals; - threading::parallel_for(faces.index_range(), 4096, [&](const IndexRange range) { - for (const int face : range) { - normals.slice(faces[face]).fill(convert_normal(face_normals[face])); - } - }); -} - -template -static void extract_normals_mesh(const MeshRenderData &mr, MutableSpan normals) -{ - if (mr.normals_domain == bke::MeshNormalDomain::Face) { - extract_face_normals(mr, normals); - } - else if (mr.normals_domain == bke::MeshNormalDomain::Point) { - extract_vert_normals(mr, normals); - } - else if (!mr.corner_normals.is_empty()) { - extract_normals(mr.corner_normals, normals); - } - else if (mr.sharp_faces.is_empty()) { - extract_vert_normals(mr, normals); - } - else { - const OffsetIndices faces = mr.faces; - const Span corner_verts = mr.corner_verts; - const Span sharp_faces = mr.sharp_faces; - const Span vert_normals = mr.vert_normals; - const Span face_normals = mr.face_normals; - threading::parallel_for(faces.index_range(), 2048, [&](const IndexRange range) { - for (const int face : range) { - if (sharp_faces[face]) { - normals.slice(faces[face]).fill(convert_normal(face_normals[face])); - } - else { - for (const int corner : faces[face]) { - normals[corner] = convert_normal(vert_normals[corner_verts[corner]]); - } - } - } - }); - } -} - -template -static void extract_paint_overlay_flags(const MeshRenderData &mr, MutableSpan normals) -{ - if (mr.select_poly.is_empty() && mr.hide_poly.is_empty() && (!mr.edit_bmesh || !mr.v_origindex)) - { - return; - } - const OffsetIndices faces = mr.faces; - threading::parallel_for(faces.index_range(), 1024, [&](const IndexRange range) { - if (!mr.select_poly.is_empty()) { - const Span select_poly = mr.select_poly; - for (const int face : range) { - if (select_poly[face]) { - for (const int corner : faces[face]) { - normals[corner].w = 1; - } - } - } - } - if (!mr.hide_poly.is_empty()) { - const Span hide_poly = mr.hide_poly; - for (const int face : range) { - if (hide_poly[face]) { - for (const int corner : faces[face]) { - normals[corner].w = -1; - } - } - } - } - if (mr.edit_bmesh && mr.v_origindex) { - const Span corner_verts = mr.corner_verts; - const Span orig_indices(mr.v_origindex, mr.vert_len); - for (const int face : range) { - for (const int corner : faces[face]) { - if (orig_indices[corner_verts[corner]] == ORIGINDEX_NONE) { - normals[corner].w = -1; - } - } - } - } - }); -} - static void extract_lnor_init(const MeshRenderData &mr, MeshBatchCache & /*cache*/, void *buf, @@ -165,51 +30,76 @@ static void extract_lnor_init(const MeshRenderData &mr, GPU_vertbuf_init_with_format(vbo, &format); GPU_vertbuf_data_alloc(vbo, mr.loop_len); - if (mr.extract_type == MR_EXTRACT_MESH) { - MutableSpan vbo_data(static_cast(GPU_vertbuf_get_data(vbo)), mr.loop_len); - extract_normals_mesh(mr, vbo_data); - extract_paint_overlay_flags(mr, vbo_data); - } - else { - *static_cast(tls_data) = static_cast( - GPU_vertbuf_get_data(vbo)); - } + *(GPUPackedNormal **)tls_data = static_cast(GPU_vertbuf_get_data(vbo)); } static void extract_lnor_iter_face_bm(const MeshRenderData &mr, const BMFace *f, const int /*f_index*/, - void *data_v) + void *data) { - GPUPackedNormal *data = *(GPUPackedNormal **)data_v; BMLoop *l_iter, *l_first; l_iter = l_first = BM_FACE_FIRST_LOOP(f); do { const int l_index = BM_elem_index_get(l_iter); + GPUPackedNormal *lnor_data = &(*(GPUPackedNormal **)data)[l_index]; if (!mr.corner_normals.is_empty()) { - data[l_index] = GPU_normal_convert_i10_v3(mr.corner_normals[l_index]); + *lnor_data = GPU_normal_convert_i10_v3(mr.corner_normals[l_index]); } else { if (mr.normals_domain == bke::MeshNormalDomain::Face || !BM_elem_flag_test(f, BM_ELEM_SMOOTH)) { - data[l_index] = GPU_normal_convert_i10_v3(bm_face_no_get(mr, f)); + *lnor_data = GPU_normal_convert_i10_v3(bm_face_no_get(mr, f)); } else { - data[l_index] = GPU_normal_convert_i10_v3(bm_vert_no_get(mr, l_iter->v)); + *lnor_data = GPU_normal_convert_i10_v3(bm_vert_no_get(mr, l_iter->v)); } } - data[l_index].w = BM_elem_flag_test(f, BM_ELEM_HIDDEN) ? -1 : 0; + lnor_data->w = BM_elem_flag_test(f, BM_ELEM_HIDDEN) ? -1 : 0; } while ((l_iter = l_iter->next) != l_first); } +static void extract_lnor_iter_face_mesh(const MeshRenderData &mr, const int face_index, void *data) +{ + const bool hidden = !mr.hide_poly.is_empty() && mr.hide_poly[face_index]; + + for (const int corner : mr.faces[face_index]) { + const int vert = mr.corner_verts[corner]; + GPUPackedNormal *lnor_data = &(*(GPUPackedNormal **)data)[corner]; + if (!mr.corner_normals.is_empty()) { + *lnor_data = GPU_normal_convert_i10_v3(mr.corner_normals[corner]); + } + else if (mr.normals_domain == bke::MeshNormalDomain::Face || + (!mr.sharp_faces.is_empty() && mr.sharp_faces[face_index])) + { + *lnor_data = GPU_normal_convert_i10_v3(mr.face_normals[face_index]); + } + else { + *lnor_data = GPU_normal_convert_i10_v3(mr.vert_normals[vert]); + } + + /* Flag for paint mode overlay. + * Only use origindex in edit mode where it is used to display the edge-normals. + * In paint mode it will use the un-mapped data to draw the wire-frame. */ + if (hidden || (mr.edit_bmesh && (mr.v_origindex) && mr.v_origindex[vert] == ORIGINDEX_NONE)) { + lnor_data->w = -1; + } + else if (!mr.select_poly.is_empty() && mr.select_poly[face_index]) { + lnor_data->w = 1; + } + else { + lnor_data->w = 0; + } + } +} + static GPUVertFormat *get_subdiv_lnor_format() { static GPUVertFormat format = {0}; if (format.attr_len == 0) { GPU_vertformat_attr_add(&format, "nor", GPU_COMP_F32, 4, GPU_FETCH_FLOAT); GPU_vertformat_alias_add(&format, "lnor"); - GPU_vertformat_alias_add(&format, "vnor"); } return &format; } @@ -221,7 +111,7 @@ static void extract_lnor_init_subdiv(const DRWSubdivCache &subdiv_cache, void * /*data*/) { GPUVertBuf *vbo = static_cast(buffer); - GPUVertBuf *pos_nor = cache.final.buff.vbo.pos; + GPUVertBuf *pos_nor = cache.final.buff.vbo.pos_nor; BLI_assert(pos_nor); GPU_vertbuf_init_build_on_device(vbo, get_subdiv_lnor_format(), subdiv_cache.num_subdiv_loops); draw_subdiv_build_lnor_buffer(subdiv_cache, pos_nor, vbo); @@ -233,10 +123,11 @@ constexpr MeshExtract create_extractor_lnor() extractor.init = extract_lnor_init; extractor.init_subdiv = extract_lnor_init_subdiv; extractor.iter_face_bm = extract_lnor_iter_face_bm; + extractor.iter_face_mesh = extract_lnor_iter_face_mesh; extractor.data_type = MR_DATA_LOOP_NOR; extractor.data_size = sizeof(GPUPackedNormal *); extractor.use_threading = true; - extractor.mesh_buffer_offset = offsetof(MeshBufferList, vbo.nor); + extractor.mesh_buffer_offset = offsetof(MeshBufferList, vbo.lnor); return extractor; } @@ -246,6 +137,10 @@ constexpr MeshExtract create_extractor_lnor() /** \name Extract HQ Loop Normal * \{ */ +struct gpuHQNor { + short x, y, z, w; +}; + static void extract_lnor_hq_init(const MeshRenderData &mr, MeshBatchCache & /*cache*/, void *buf, @@ -260,14 +155,7 @@ static void extract_lnor_hq_init(const MeshRenderData &mr, GPU_vertbuf_init_with_format(vbo, &format); GPU_vertbuf_data_alloc(vbo, mr.loop_len); - if (mr.extract_type == MR_EXTRACT_MESH) { - MutableSpan vbo_data(static_cast(GPU_vertbuf_get_data(vbo)), mr.loop_len); - extract_normals_mesh(mr, vbo_data); - extract_paint_overlay_flags(mr, vbo_data); - } - else { - *(short4 **)tls_data = static_cast(GPU_vertbuf_get_data(vbo)); - } + *(gpuHQNor **)tls_data = static_cast(GPU_vertbuf_get_data(vbo)); } static void extract_lnor_hq_iter_face_bm(const MeshRenderData &mr, @@ -280,35 +168,72 @@ static void extract_lnor_hq_iter_face_bm(const MeshRenderData &mr, do { const int l_index = BM_elem_index_get(l_iter); if (!mr.corner_normals.is_empty()) { - normal_float_to_short_v3(&(*(short4 **)data)[l_index].x, mr.corner_normals[l_index]); + normal_float_to_short_v3(&(*(gpuHQNor **)data)[l_index].x, mr.corner_normals[l_index]); } else { if (BM_elem_flag_test(f, BM_ELEM_SMOOTH)) { - normal_float_to_short_v3(&(*(short4 **)data)[l_index].x, bm_vert_no_get(mr, l_iter->v)); + normal_float_to_short_v3(&(*(gpuHQNor **)data)[l_index].x, bm_vert_no_get(mr, l_iter->v)); } else { - normal_float_to_short_v3(&(*(short4 **)data)[l_index].x, bm_face_no_get(mr, f)); + normal_float_to_short_v3(&(*(gpuHQNor **)data)[l_index].x, bm_face_no_get(mr, f)); } } } while ((l_iter = l_iter->next) != l_first); } +static void extract_lnor_hq_iter_face_mesh(const MeshRenderData &mr, + const int face_index, + void *data) +{ + const bool hidden = !mr.hide_poly.is_empty() && mr.hide_poly[face_index]; + + for (const int corner : mr.faces[face_index]) { + const int vert = mr.corner_verts[corner]; + gpuHQNor *lnor_data = &(*(gpuHQNor **)data)[corner]; + if (!mr.corner_normals.is_empty()) { + normal_float_to_short_v3(&lnor_data->x, mr.corner_normals[corner]); + } + else if (mr.normals_domain == bke::MeshNormalDomain::Face || + (!mr.sharp_faces.is_empty() && mr.sharp_faces[face_index])) + { + normal_float_to_short_v3(&lnor_data->x, mr.face_normals[face_index]); + } + else { + normal_float_to_short_v3(&lnor_data->x, mr.vert_normals[vert]); + } + + /* Flag for paint mode overlay. + * Only use origindex in edit mode where it is used to display the edge-normals. + * In paint mode it will use the un-mapped data to draw the wire-frame. */ + if (hidden || (mr.edit_bmesh && (mr.v_origindex) && mr.v_origindex[vert] == ORIGINDEX_NONE)) { + lnor_data->w = -1; + } + else if (!mr.select_poly.is_empty() && mr.select_poly[face_index]) { + lnor_data->w = 1; + } + else { + lnor_data->w = 0; + } + } +} + constexpr MeshExtract create_extractor_lnor_hq() { MeshExtract extractor = {nullptr}; extractor.init = extract_lnor_hq_init; extractor.init_subdiv = extract_lnor_init_subdiv; extractor.iter_face_bm = extract_lnor_hq_iter_face_bm; + extractor.iter_face_mesh = extract_lnor_hq_iter_face_mesh; extractor.data_type = MR_DATA_LOOP_NOR; - extractor.data_size = sizeof(short4 *); + extractor.data_size = sizeof(gpuHQNor *); extractor.use_threading = true; - extractor.mesh_buffer_offset = offsetof(MeshBufferList, vbo.nor); + extractor.mesh_buffer_offset = offsetof(MeshBufferList, vbo.lnor); return extractor; } /** \} */ -const MeshExtract extract_nor = create_extractor_lnor(); -const MeshExtract extract_nor_hq = create_extractor_lnor_hq(); +const MeshExtract extract_lnor = create_extractor_lnor(); +const MeshExtract extract_lnor_hq = create_extractor_lnor_hq(); } // namespace blender::draw diff --git a/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_mesh_analysis.cc b/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_mesh_analysis.cc index 37e0338c0f5..8c971a72c34 100644 --- a/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_mesh_analysis.cc +++ b/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_mesh_analysis.cc @@ -86,7 +86,7 @@ static void statvis_calc_overhang(const MeshRenderData &mr, float *r_overhang) axis_from_enum_v3(dir, axis); /* now convert into global space */ - mul_transposed_mat3_m4_v3(mr.object_to_world.ptr(), dir); + mul_transposed_mat3_m4_v3(mr.obmat, dir); normalize_v3(dir); if (mr.extract_type == MR_EXTRACT_BMESH) { @@ -145,7 +145,7 @@ static void statvis_calc_thickness(const MeshRenderData &mr, float *r_thickness) /* cheating to avoid another allocation */ float *face_dists = r_thickness + (mr.loop_len - mr.face_len); BMEditMesh *em = mr.edit_bmesh; - const float scale = 1.0f / mat4_to_scale(mr.object_to_world.ptr()); + const float scale = 1.0f / mat4_to_scale(mr.obmat); const MeshStatVis *statvis = &mr.toolsettings->statvis; const float min = statvis->thickness_min * scale; const float max = statvis->thickness_max * scale; @@ -456,13 +456,14 @@ static void statvis_calc_distort(const MeshRenderData &mr, float *r_distort) const float *f_no = mr.face_normals[face_index]; fac = 0.0f; - for (const int corner : face.drop_front(1)) { - const int corner_prev = bke::mesh::face_corner_prev(face, corner); - const int corner_next = bke::mesh::face_corner_next(face, corner); + for (int i = 1; i <= face.size(); i++) { + const int corner_prev = face.start() + (i - 1) % face.size(); + const int corner_curr = face.start() + (i + 0) % face.size(); + const int corner_next = face.start() + (i + 1) % face.size(); float no_corner[3]; normal_tri_v3(no_corner, mr.vert_positions[mr.corner_verts[corner_prev]], - mr.vert_positions[mr.corner_verts[corner]], + mr.vert_positions[mr.corner_verts[corner_curr]], mr.vert_positions[mr.corner_verts[corner_next]]); /* simple way to detect (what is most likely) concave */ if (dot_v3v3(f_no, no_corner) < 0.0f) { @@ -539,9 +540,9 @@ static void statvis_calc_sharp(const MeshRenderData &mr, float *r_sharp) for (int face_index = 0; face_index < mr.face_len; face_index++) { const IndexRange face = mr.faces[face_index]; - for (const int corner : face) { - const int vert_curr = mr.corner_verts[corner]; - const int vert_next = mr.corner_verts[bke::mesh::face_corner_next(face, corner)]; + for (int i = 0; i < face.size(); i++) { + const int vert_curr = mr.corner_verts[face.start() + (i + 0) % face.size()]; + const int vert_next = mr.corner_verts[face.start() + (i + 1) % face.size()]; float angle; eh.add_or_modify( {vert_curr, vert_next}, diff --git a/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_pos.cc b/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_pos.cc deleted file mode 100644 index e4042e88888..00000000000 --- a/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_pos.cc +++ /dev/null @@ -1,306 +0,0 @@ -/* SPDX-FileCopyrightText: 2021 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup draw - */ - -#include "BLI_array_utils.hh" - -#include "extract_mesh.hh" - -#include "draw_subdivision.hh" - -namespace blender::draw { - -/* ---------------------------------------------------------------------- */ -/** \name Extract Position and Vertex Normal - * \{ */ - -static void extract_mesh_loose_edge_positions(const Span vert_positions, - const Span edges, - const Span loose_edge_indices, - MutableSpan positions) -{ - threading::parallel_for(loose_edge_indices.index_range(), 4096, [&](const IndexRange range) { - for (const int i : range) { - const int2 edge = edges[loose_edge_indices[i]]; - positions[i * 2 + 0] = vert_positions[edge[0]]; - positions[i * 2 + 1] = vert_positions[edge[1]]; - } - }); -} - -static void extract_pos_init(const MeshRenderData &mr, - MeshBatchCache & /*cache*/, - void *buf, - void *tls_data) -{ - GPUVertBuf *vbo = static_cast(buf); - static GPUVertFormat format = {0}; - if (format.attr_len == 0) { - GPU_vertformat_attr_add(&format, "pos", GPU_COMP_F32, 3, GPU_FETCH_FLOAT); - } - GPU_vertbuf_init_with_format(vbo, &format); - GPU_vertbuf_data_alloc(vbo, mr.loop_len + mr.loop_loose_len); - - MutableSpan vbo_data(static_cast(GPU_vertbuf_get_data(vbo)), - GPU_vertbuf_get_vertex_len(vbo)); - if (mr.extract_type == MR_EXTRACT_MESH) { - array_utils::gather( - mr.vert_positions, mr.corner_verts, vbo_data.take_front(mr.corner_verts.size())); - extract_mesh_loose_edge_positions(mr.vert_positions, - mr.edges, - mr.loose_edges, - vbo_data.slice(mr.loop_len, mr.loose_edges.size() * 2)); - array_utils::gather( - mr.vert_positions, mr.loose_verts, vbo_data.take_back(mr.loose_verts.size())); - } - else { - *static_cast(tls_data) = vbo_data.data(); - } -} - -static void extract_pos_iter_face_bm(const MeshRenderData &mr, - const BMFace *f, - const int /*f_index*/, - void *_data) -{ - float3 *data = *static_cast(_data); - BMLoop *l_iter, *l_first; - l_iter = l_first = BM_FACE_FIRST_LOOP(f); - do { - const int l_index = BM_elem_index_get(l_iter); - data[l_index] = bm_vert_co_get(mr, l_iter->v); - } while ((l_iter = l_iter->next) != l_first); -} - -static void extract_pos_iter_loose_edge_bm(const MeshRenderData &mr, - const BMEdge *eed, - const int loose_edge_i, - void *_data) -{ - float3 *data = *static_cast(_data); - int index = mr.loop_len + loose_edge_i * 2; - data[index + 0] = bm_vert_co_get(mr, eed->v1); - data[index + 1] = bm_vert_co_get(mr, eed->v2); -} - -static void extract_pos_iter_loose_vert_bm(const MeshRenderData &mr, - const BMVert *eve, - const int loose_vert_i, - void *_data) -{ - float3 *data = *static_cast(_data); - const int offset = mr.loop_len + (mr.edge_loose_len * 2); - const int index = offset + loose_vert_i; - data[index] = bm_vert_co_get(mr, eve); -} - -static GPUVertFormat *get_normals_format() -{ - static GPUVertFormat format = {0}; - if (format.attr_len == 0) { - GPU_vertformat_attr_add(&format, "nor", GPU_COMP_F32, 4, GPU_FETCH_FLOAT); - GPU_vertformat_alias_add(&format, "lnor"); - } - return &format; -} - -static GPUVertFormat *get_custom_normals_format() -{ - static GPUVertFormat format = {0}; - if (format.attr_len == 0) { - GPU_vertformat_attr_add(&format, "nor", GPU_COMP_F32, 3, GPU_FETCH_FLOAT); - GPU_vertformat_alias_add(&format, "lnor"); - } - return &format; -} - -static void extract_vertex_flags(const MeshRenderData &mr, char *flags) -{ - for (int i = 0; i < mr.vert_len; i++) { - char *flag = &flags[i]; - const bool vert_hidden = !mr.hide_vert.is_empty() && mr.hide_vert[i]; - /* Flag for paint mode overlay. */ - if (vert_hidden || ((mr.v_origindex) && (mr.v_origindex[i] == ORIGINDEX_NONE))) { - *flag = -1; - } - else if (!mr.select_vert.is_empty() && mr.select_vert[i]) { - *flag = 1; - } - else { - *flag = 0; - } - } -} - -static void extract_pos_init_subdiv(const DRWSubdivCache &subdiv_cache, - const MeshRenderData &mr, - MeshBatchCache &cache, - void *buffer, - void * /*data*/) -{ - GPUVertBuf *vbo = static_cast(buffer); - const DRWSubdivLooseGeom &loose_geom = subdiv_cache.loose_geom; - - /* Initialize the vertex buffer, it was already allocated. */ - GPU_vertbuf_init_build_on_device( - vbo, draw_subdiv_get_pos_nor_format(), subdiv_cache.num_subdiv_loops + loose_geom.loop_len); - - if (subdiv_cache.num_subdiv_loops == 0) { - return; - } - - GPUVertBuf *flags_buffer = GPU_vertbuf_calloc(); - static GPUVertFormat flag_format = {0}; - if (flag_format.attr_len == 0) { - GPU_vertformat_attr_add(&flag_format, "flag", GPU_COMP_I32, 1, GPU_FETCH_INT); - } - GPU_vertbuf_init_with_format(flags_buffer, &flag_format); - GPU_vertbuf_data_alloc(flags_buffer, divide_ceil_u(mr.vert_len, 4)); - char *flags = static_cast(GPU_vertbuf_get_data(flags_buffer)); - extract_vertex_flags(mr, flags); - GPU_vertbuf_tag_dirty(flags_buffer); - - GPUVertBuf *orco_vbo = cache.final.buff.vbo.orco; - - if (orco_vbo) { - static GPUVertFormat format = {0}; - if (format.attr_len == 0) { - /* FIXME(fclem): We use the last component as a way to differentiate from generic vertex - * attributes. This is a substantial waste of video-ram and should be done another way. - * Unfortunately, at the time of writing, I did not found any other "non disruptive" - * alternative. */ - GPU_vertformat_attr_add(&format, "orco", GPU_COMP_F32, 4, GPU_FETCH_FLOAT); - } - GPU_vertbuf_init_build_on_device(orco_vbo, &format, subdiv_cache.num_subdiv_loops); - } - - draw_subdiv_extract_pos_nor(subdiv_cache, flags_buffer, vbo, orco_vbo); - - if (subdiv_cache.use_custom_loop_normals) { - const Mesh *coarse_mesh = subdiv_cache.mesh; - const Span corner_normals = coarse_mesh->corner_normals(); - - GPUVertBuf *src_custom_normals = GPU_vertbuf_calloc(); - GPU_vertbuf_init_with_format(src_custom_normals, get_custom_normals_format()); - GPU_vertbuf_data_alloc(src_custom_normals, coarse_mesh->corners_num); - - memcpy(GPU_vertbuf_get_data(src_custom_normals), - corner_normals.data(), - corner_normals.size_in_bytes()); - - GPUVertBuf *dst_custom_normals = GPU_vertbuf_calloc(); - GPU_vertbuf_init_build_on_device( - dst_custom_normals, get_custom_normals_format(), subdiv_cache.num_subdiv_loops); - - draw_subdiv_interp_custom_data( - subdiv_cache, src_custom_normals, dst_custom_normals, GPU_COMP_F32, 3, 0); - - draw_subdiv_finalize_custom_normals(subdiv_cache, dst_custom_normals, vbo); - - GPU_vertbuf_discard(src_custom_normals); - GPU_vertbuf_discard(dst_custom_normals); - } - else { - /* We cannot evaluate vertex normals using the limit surface, so compute them manually. */ - GPUVertBuf *subdiv_loop_subdiv_vert_index = draw_subdiv_build_origindex_buffer( - subdiv_cache.subdiv_loop_subdiv_vert_index, subdiv_cache.num_subdiv_loops); - - GPUVertBuf *vert_normals = GPU_vertbuf_calloc(); - GPU_vertbuf_init_build_on_device( - vert_normals, get_normals_format(), subdiv_cache.num_subdiv_verts); - - draw_subdiv_accumulate_normals(subdiv_cache, - vbo, - subdiv_cache.subdiv_vertex_face_adjacency_offsets, - subdiv_cache.subdiv_vertex_face_adjacency, - subdiv_loop_subdiv_vert_index, - vert_normals); - - draw_subdiv_finalize_normals(subdiv_cache, vert_normals, subdiv_loop_subdiv_vert_index, vbo); - - GPU_vertbuf_discard(vert_normals); - GPU_vertbuf_discard(subdiv_loop_subdiv_vert_index); - } - - GPU_vertbuf_discard(flags_buffer); -} - -static void extract_pos_loose_geom_subdiv(const DRWSubdivCache &subdiv_cache, - const MeshRenderData & /*mr*/, - void *buffer, - void * /*data*/) -{ - const DRWSubdivLooseGeom &loose_geom = subdiv_cache.loose_geom; - if (loose_geom.loop_len == 0) { - return; - } - - GPUVertBuf *vbo = static_cast(buffer); - uint offset = subdiv_cache.num_subdiv_loops; - - /* TODO(@kevindietrich): replace this when compressed normals are supported. */ - struct SubdivPosNorLoop { - float pos[3]; - float nor[3]; - float flag; - }; - - /* Make sure buffer is active for sending loose data. */ - GPU_vertbuf_use(vbo); - - Span loose_edges = draw_subdiv_cache_get_loose_edges(subdiv_cache); - - SubdivPosNorLoop edge_data[2]; - memset(edge_data, 0, sizeof(SubdivPosNorLoop) * 2); - for (const DRWSubdivLooseEdge &loose_edge : loose_edges) { - const DRWSubdivLooseVertex &v1 = loose_geom.verts[loose_edge.loose_subdiv_v1_index]; - const DRWSubdivLooseVertex &v2 = loose_geom.verts[loose_edge.loose_subdiv_v2_index]; - - copy_v3_v3(edge_data[0].pos, v1.co); - copy_v3_v3(edge_data[1].pos, v2.co); - - GPU_vertbuf_update_sub( - vbo, offset * sizeof(SubdivPosNorLoop), sizeof(SubdivPosNorLoop) * 2, &edge_data); - - offset += 2; - } - - SubdivPosNorLoop vert_data; - memset(&vert_data, 0, sizeof(SubdivPosNorLoop)); - Span loose_verts = draw_subdiv_cache_get_loose_verts(subdiv_cache); - - for (const DRWSubdivLooseVertex &loose_vert : loose_verts) { - copy_v3_v3(vert_data.pos, loose_vert.co); - - GPU_vertbuf_update_sub( - vbo, offset * sizeof(SubdivPosNorLoop), sizeof(SubdivPosNorLoop), &vert_data); - - offset += 1; - } -} - -constexpr MeshExtract create_extractor_pos() -{ - MeshExtract extractor = {nullptr}; - extractor.init = extract_pos_init; - extractor.iter_face_bm = extract_pos_iter_face_bm; - extractor.iter_loose_edge_bm = extract_pos_iter_loose_edge_bm; - extractor.iter_loose_vert_bm = extract_pos_iter_loose_vert_bm; - extractor.init_subdiv = extract_pos_init_subdiv; - extractor.iter_loose_geom_subdiv = extract_pos_loose_geom_subdiv; - extractor.data_type = MR_DATA_NONE; - extractor.data_size = sizeof(float3 *); - extractor.use_threading = true; - extractor.mesh_buffer_offset = offsetof(MeshBufferList, vbo.pos); - return extractor; -} - -/** \} */ - -const MeshExtract extract_pos = create_extractor_pos(); - -} // namespace blender::draw diff --git a/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_pos_nor.cc b/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_pos_nor.cc new file mode 100644 index 00000000000..bc4addec2ac --- /dev/null +++ b/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_pos_nor.cc @@ -0,0 +1,580 @@ +/* SPDX-FileCopyrightText: 2021 Blender Authors + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +/** \file + * \ingroup draw + */ + +#include "MEM_guardedalloc.h" + +#include "extract_mesh.hh" + +#include "draw_subdivision.hh" + +namespace blender::draw { + +/* ---------------------------------------------------------------------- */ +/** \name Extract Position and Vertex Normal + * \{ */ + +struct PosNorLoop { + float pos[3]; + GPUPackedNormal nor; +}; + +struct MeshExtract_PosNor_Data { + PosNorLoop *vbo_data; + GPUNormal *normals; +}; + +static void extract_pos_nor_init(const MeshRenderData &mr, + MeshBatchCache & /*cache*/, + void *buf, + void *tls_data) +{ + GPUVertBuf *vbo = static_cast(buf); + static GPUVertFormat format = {0}; + if (format.attr_len == 0) { + /* WARNING Adjust #PosNorLoop struct accordingly. */ + GPU_vertformat_attr_add(&format, "pos", GPU_COMP_F32, 3, GPU_FETCH_FLOAT); + GPU_vertformat_attr_add(&format, "nor", GPU_COMP_I10, 4, GPU_FETCH_INT_TO_FLOAT_UNIT); + GPU_vertformat_alias_add(&format, "vnor"); + } + GPU_vertbuf_init_with_format(vbo, &format); + GPU_vertbuf_data_alloc(vbo, mr.loop_len + mr.loop_loose_len); + + /* Pack normals per vert, reduce amount of computation. */ + MeshExtract_PosNor_Data *data = static_cast(tls_data); + data->vbo_data = static_cast(GPU_vertbuf_get_data(vbo)); + data->normals = (GPUNormal *)MEM_mallocN(sizeof(GPUNormal) * mr.vert_len, __func__); + + /* Quicker than doing it for each loop. */ + if (mr.extract_type == MR_EXTRACT_BMESH) { + BMIter iter; + BMVert *eve; + int v; + BM_ITER_MESH_INDEX (eve, &iter, mr.bm, BM_VERTS_OF_MESH, v) { + data->normals[v].low = GPU_normal_convert_i10_v3(bm_vert_no_get(mr, eve)); + } + } + else { + for (int v = 0; v < mr.vert_len; v++) { + data->normals[v].low = GPU_normal_convert_i10_v3(mr.vert_normals[v]); + } + } +} + +static void extract_pos_nor_iter_face_bm(const MeshRenderData &mr, + const BMFace *f, + const int /*f_index*/, + void *_data) +{ + MeshExtract_PosNor_Data *data = static_cast(_data); + BMLoop *l_iter, *l_first; + l_iter = l_first = BM_FACE_FIRST_LOOP(f); + do { + const int l_index = BM_elem_index_get(l_iter); + PosNorLoop *vert = &data->vbo_data[l_index]; + copy_v3_v3(vert->pos, bm_vert_co_get(mr, l_iter->v)); + vert->nor = data->normals[BM_elem_index_get(l_iter->v)].low; + vert->nor.w = BM_elem_flag_test(f, BM_ELEM_HIDDEN) ? -1 : 0; + } while ((l_iter = l_iter->next) != l_first); +} + +static void extract_pos_nor_iter_face_mesh(const MeshRenderData &mr, + const int face_index, + void *_data) +{ + MeshExtract_PosNor_Data *data = static_cast(_data); + const bool poly_hidden = !mr.hide_poly.is_empty() && mr.hide_poly[face_index]; + + for (const int corner : mr.faces[face_index]) { + const int vert_i = mr.corner_verts[corner]; + PosNorLoop *vert = &data->vbo_data[corner]; + const bool vert_hidden = !mr.hide_vert.is_empty() && mr.hide_vert[vert_i]; + copy_v3_v3(vert->pos, mr.vert_positions[vert_i]); + vert->nor = data->normals[vert_i].low; + /* Flag for paint mode overlay. */ + if (poly_hidden || vert_hidden || + ((mr.v_origindex) && (mr.v_origindex[vert_i] == ORIGINDEX_NONE))) + { + vert->nor.w = -1; + } + else if (!mr.select_vert.is_empty() && mr.select_vert[vert_i]) { + vert->nor.w = 1; + } + else { + vert->nor.w = 0; + } + } +} + +static void extract_pos_nor_iter_loose_edge_bm(const MeshRenderData &mr, + const BMEdge *eed, + const int loose_edge_i, + void *_data) +{ + MeshExtract_PosNor_Data *data = static_cast(_data); + + int l_index = mr.loop_len + loose_edge_i * 2; + PosNorLoop *vert = &data->vbo_data[l_index]; + copy_v3_v3(vert[0].pos, bm_vert_co_get(mr, eed->v1)); + copy_v3_v3(vert[1].pos, bm_vert_co_get(mr, eed->v2)); + vert[0].nor = data->normals[BM_elem_index_get(eed->v1)].low; + vert[1].nor = data->normals[BM_elem_index_get(eed->v2)].low; +} + +static void extract_pos_nor_iter_loose_edge_mesh(const MeshRenderData &mr, + const int2 edge, + const int loose_edge_i, + void *_data) +{ + MeshExtract_PosNor_Data *data = static_cast(_data); + const int index = mr.loop_len + loose_edge_i * 2; + PosNorLoop *vert = &data->vbo_data[index]; + copy_v3_v3(vert[0].pos, mr.vert_positions[edge[0]]); + copy_v3_v3(vert[1].pos, mr.vert_positions[edge[1]]); + vert[0].nor = data->normals[edge[0]].low; + vert[1].nor = data->normals[edge[1]].low; +} + +static void extract_pos_nor_iter_loose_vert_bm(const MeshRenderData &mr, + const BMVert *eve, + const int loose_vert_i, + void *_data) +{ + MeshExtract_PosNor_Data *data = static_cast(_data); + const int offset = mr.loop_len + (mr.edge_loose_len * 2); + + const int l_index = offset + loose_vert_i; + PosNorLoop *vert = &data->vbo_data[l_index]; + copy_v3_v3(vert->pos, bm_vert_co_get(mr, eve)); + vert->nor = data->normals[BM_elem_index_get(eve)].low; +} + +static void extract_pos_nor_iter_loose_vert_mesh(const MeshRenderData &mr, + const int loose_vert_i, + void *_data) +{ + MeshExtract_PosNor_Data *data = static_cast(_data); + const int offset = mr.loop_len + (mr.edge_loose_len * 2); + + const int index = offset + loose_vert_i; + const int v_index = mr.loose_verts[loose_vert_i]; + PosNorLoop *vert = &data->vbo_data[index]; + copy_v3_v3(vert->pos, mr.vert_positions[v_index]); + vert->nor = data->normals[v_index].low; +} + +static void extract_pos_nor_finish(const MeshRenderData & /*mr*/, + MeshBatchCache & /*cache*/, + void * /*buf*/, + void *_data) +{ + MeshExtract_PosNor_Data *data = static_cast(_data); + MEM_freeN(data->normals); +} + +static GPUVertFormat *get_normals_format() +{ + static GPUVertFormat format = {0}; + if (format.attr_len == 0) { + GPU_vertformat_attr_add(&format, "nor", GPU_COMP_F32, 4, GPU_FETCH_FLOAT); + GPU_vertformat_alias_add(&format, "lnor"); + } + return &format; +} + +static GPUVertFormat *get_custom_normals_format() +{ + static GPUVertFormat format = {0}; + if (format.attr_len == 0) { + GPU_vertformat_attr_add(&format, "nor", GPU_COMP_F32, 3, GPU_FETCH_FLOAT); + GPU_vertformat_alias_add(&format, "lnor"); + } + return &format; +} + +static void extract_vertex_flags(const MeshRenderData &mr, char *flags) +{ + for (int i = 0; i < mr.vert_len; i++) { + char *flag = &flags[i]; + const bool vert_hidden = !mr.hide_vert.is_empty() && mr.hide_vert[i]; + /* Flag for paint mode overlay. */ + if (vert_hidden || ((mr.v_origindex) && (mr.v_origindex[i] == ORIGINDEX_NONE))) { + *flag = -1; + } + else if (!mr.select_vert.is_empty() && mr.select_vert[i]) { + *flag = 1; + } + else { + *flag = 0; + } + } +} + +static void extract_pos_nor_init_subdiv(const DRWSubdivCache &subdiv_cache, + const MeshRenderData &mr, + MeshBatchCache &cache, + void *buffer, + void * /*data*/) +{ + GPUVertBuf *vbo = static_cast(buffer); + const DRWSubdivLooseGeom &loose_geom = subdiv_cache.loose_geom; + + /* Initialize the vertex buffer, it was already allocated. */ + GPU_vertbuf_init_build_on_device( + vbo, draw_subdiv_get_pos_nor_format(), subdiv_cache.num_subdiv_loops + loose_geom.loop_len); + + if (subdiv_cache.num_subdiv_loops == 0) { + return; + } + + GPUVertBuf *flags_buffer = GPU_vertbuf_calloc(); + static GPUVertFormat flag_format = {0}; + if (flag_format.attr_len == 0) { + GPU_vertformat_attr_add(&flag_format, "flag", GPU_COMP_I32, 1, GPU_FETCH_INT); + } + GPU_vertbuf_init_with_format(flags_buffer, &flag_format); + GPU_vertbuf_data_alloc(flags_buffer, divide_ceil_u(mr.vert_len, 4)); + char *flags = static_cast(GPU_vertbuf_get_data(flags_buffer)); + extract_vertex_flags(mr, flags); + GPU_vertbuf_tag_dirty(flags_buffer); + + GPUVertBuf *orco_vbo = cache.final.buff.vbo.orco; + + if (orco_vbo) { + static GPUVertFormat format = {0}; + if (format.attr_len == 0) { + /* FIXME(fclem): We use the last component as a way to differentiate from generic vertex + * attributes. This is a substantial waste of video-ram and should be done another way. + * Unfortunately, at the time of writing, I did not found any other "non disruptive" + * alternative. */ + GPU_vertformat_attr_add(&format, "orco", GPU_COMP_F32, 4, GPU_FETCH_FLOAT); + } + GPU_vertbuf_init_build_on_device(orco_vbo, &format, subdiv_cache.num_subdiv_loops); + } + + draw_subdiv_extract_pos_nor(subdiv_cache, flags_buffer, vbo, orco_vbo); + + if (subdiv_cache.use_custom_loop_normals) { + const Mesh *coarse_mesh = subdiv_cache.mesh; + const Span corner_normals = coarse_mesh->corner_normals(); + + GPUVertBuf *src_custom_normals = GPU_vertbuf_calloc(); + GPU_vertbuf_init_with_format(src_custom_normals, get_custom_normals_format()); + GPU_vertbuf_data_alloc(src_custom_normals, coarse_mesh->corners_num); + + memcpy(GPU_vertbuf_get_data(src_custom_normals), + corner_normals.data(), + corner_normals.size_in_bytes()); + + GPUVertBuf *dst_custom_normals = GPU_vertbuf_calloc(); + GPU_vertbuf_init_build_on_device( + dst_custom_normals, get_custom_normals_format(), subdiv_cache.num_subdiv_loops); + + draw_subdiv_interp_custom_data( + subdiv_cache, src_custom_normals, dst_custom_normals, GPU_COMP_F32, 3, 0); + + draw_subdiv_finalize_custom_normals(subdiv_cache, dst_custom_normals, vbo); + + GPU_vertbuf_discard(src_custom_normals); + GPU_vertbuf_discard(dst_custom_normals); + } + else { + /* We cannot evaluate vertex normals using the limit surface, so compute them manually. */ + GPUVertBuf *subdiv_loop_subdiv_vert_index = draw_subdiv_build_origindex_buffer( + subdiv_cache.subdiv_loop_subdiv_vert_index, subdiv_cache.num_subdiv_loops); + + GPUVertBuf *vert_normals = GPU_vertbuf_calloc(); + GPU_vertbuf_init_build_on_device( + vert_normals, get_normals_format(), subdiv_cache.num_subdiv_verts); + + draw_subdiv_accumulate_normals(subdiv_cache, + vbo, + subdiv_cache.subdiv_vertex_face_adjacency_offsets, + subdiv_cache.subdiv_vertex_face_adjacency, + subdiv_loop_subdiv_vert_index, + vert_normals); + + draw_subdiv_finalize_normals(subdiv_cache, vert_normals, subdiv_loop_subdiv_vert_index, vbo); + + GPU_vertbuf_discard(vert_normals); + GPU_vertbuf_discard(subdiv_loop_subdiv_vert_index); + } + + GPU_vertbuf_discard(flags_buffer); +} + +static void extract_pos_nor_loose_geom_subdiv(const DRWSubdivCache &subdiv_cache, + const MeshRenderData & /*mr*/, + void *buffer, + void * /*data*/) +{ + const DRWSubdivLooseGeom &loose_geom = subdiv_cache.loose_geom; + if (loose_geom.loop_len == 0) { + return; + } + + GPUVertBuf *vbo = static_cast(buffer); + uint offset = subdiv_cache.num_subdiv_loops; + + /* TODO(@kevindietrich): replace this when compressed normals are supported. */ + struct SubdivPosNorLoop { + float pos[3]; + float nor[3]; + float flag; + }; + + /* Make sure buffer is active for sending loose data. */ + GPU_vertbuf_use(vbo); + + Span loose_edges = draw_subdiv_cache_get_loose_edges(subdiv_cache); + + SubdivPosNorLoop edge_data[2]; + memset(edge_data, 0, sizeof(SubdivPosNorLoop) * 2); + for (const DRWSubdivLooseEdge &loose_edge : loose_edges) { + const DRWSubdivLooseVertex &v1 = loose_geom.verts[loose_edge.loose_subdiv_v1_index]; + const DRWSubdivLooseVertex &v2 = loose_geom.verts[loose_edge.loose_subdiv_v2_index]; + + copy_v3_v3(edge_data[0].pos, v1.co); + copy_v3_v3(edge_data[1].pos, v2.co); + + GPU_vertbuf_update_sub( + vbo, offset * sizeof(SubdivPosNorLoop), sizeof(SubdivPosNorLoop) * 2, &edge_data); + + offset += 2; + } + + SubdivPosNorLoop vert_data; + memset(&vert_data, 0, sizeof(SubdivPosNorLoop)); + Span loose_verts = draw_subdiv_cache_get_loose_verts(subdiv_cache); + + for (const DRWSubdivLooseVertex &loose_vert : loose_verts) { + copy_v3_v3(vert_data.pos, loose_vert.co); + + GPU_vertbuf_update_sub( + vbo, offset * sizeof(SubdivPosNorLoop), sizeof(SubdivPosNorLoop), &vert_data); + + offset += 1; + } +} + +constexpr MeshExtract create_extractor_pos_nor() +{ + MeshExtract extractor = {nullptr}; + extractor.init = extract_pos_nor_init; + extractor.iter_face_bm = extract_pos_nor_iter_face_bm; + extractor.iter_face_mesh = extract_pos_nor_iter_face_mesh; + extractor.iter_loose_edge_bm = extract_pos_nor_iter_loose_edge_bm; + extractor.iter_loose_edge_mesh = extract_pos_nor_iter_loose_edge_mesh; + extractor.iter_loose_vert_bm = extract_pos_nor_iter_loose_vert_bm; + extractor.iter_loose_vert_mesh = extract_pos_nor_iter_loose_vert_mesh; + extractor.finish = extract_pos_nor_finish; + extractor.init_subdiv = extract_pos_nor_init_subdiv; + extractor.iter_loose_geom_subdiv = extract_pos_nor_loose_geom_subdiv; + extractor.data_type = MR_DATA_NONE; + extractor.data_size = sizeof(MeshExtract_PosNor_Data); + extractor.use_threading = true; + extractor.mesh_buffer_offset = offsetof(MeshBufferList, vbo.pos_nor); + return extractor; +} + +/** \} */ + +/* ---------------------------------------------------------------------- */ +/** \name Extract Position and High Quality Vertex Normal + * \{ */ + +struct PosNorHQLoop { + float pos[3]; + short nor[4]; +}; + +struct MeshExtract_PosNorHQ_Data { + PosNorHQLoop *vbo_data; + GPUNormal *normals; +}; + +static void extract_pos_nor_hq_init(const MeshRenderData &mr, + MeshBatchCache & /*cache*/, + void *buf, + void *tls_data) +{ + GPUVertBuf *vbo = static_cast(buf); + static GPUVertFormat format = {0}; + if (format.attr_len == 0) { + /* WARNING Adjust #PosNorHQLoop struct accordingly. */ + GPU_vertformat_attr_add(&format, "pos", GPU_COMP_F32, 3, GPU_FETCH_FLOAT); + GPU_vertformat_attr_add(&format, "nor", GPU_COMP_I16, 4, GPU_FETCH_INT_TO_FLOAT_UNIT); + GPU_vertformat_alias_add(&format, "vnor"); + } + GPU_vertbuf_init_with_format(vbo, &format); + GPU_vertbuf_data_alloc(vbo, mr.loop_len + mr.loop_loose_len); + + /* Pack normals per vert, reduce amount of computation. */ + MeshExtract_PosNorHQ_Data *data = static_cast(tls_data); + data->vbo_data = static_cast(GPU_vertbuf_get_data(vbo)); + data->normals = (GPUNormal *)MEM_mallocN(sizeof(GPUNormal) * mr.vert_len, __func__); + + /* Quicker than doing it for each loop. */ + if (mr.extract_type == MR_EXTRACT_BMESH) { + BMIter iter; + BMVert *eve; + int v; + BM_ITER_MESH_INDEX (eve, &iter, mr.bm, BM_VERTS_OF_MESH, v) { + normal_float_to_short_v3(data->normals[v].high, bm_vert_no_get(mr, eve)); + } + } + else { + for (int v = 0; v < mr.vert_len; v++) { + normal_float_to_short_v3(data->normals[v].high, mr.vert_normals[v]); + } + } +} + +static void extract_pos_nor_hq_iter_face_bm(const MeshRenderData &mr, + const BMFace *f, + const int /*f_index*/, + void *_data) +{ + MeshExtract_PosNorHQ_Data *data = static_cast(_data); + BMLoop *l_iter, *l_first; + l_iter = l_first = BM_FACE_FIRST_LOOP(f); + do { + const int l_index = BM_elem_index_get(l_iter); + PosNorHQLoop *vert = &data->vbo_data[l_index]; + copy_v3_v3(vert->pos, bm_vert_co_get(mr, l_iter->v)); + copy_v3_v3_short(vert->nor, data->normals[BM_elem_index_get(l_iter->v)].high); + + vert->nor[3] = BM_elem_flag_test(f, BM_ELEM_HIDDEN) ? -1 : 0; + } while ((l_iter = l_iter->next) != l_first); +} + +static void extract_pos_nor_hq_iter_face_mesh(const MeshRenderData &mr, + const int face_index, + void *_data) +{ + MeshExtract_PosNorHQ_Data *data = static_cast(_data); + const bool poly_hidden = !mr.hide_poly.is_empty() && mr.hide_poly[face_index]; + + for (const int corner : mr.faces[face_index]) { + const int vert_i = mr.corner_verts[corner]; + + const bool vert_hidden = !mr.hide_vert.is_empty() && mr.hide_vert[vert_i]; + PosNorHQLoop *vert = &data->vbo_data[corner]; + copy_v3_v3(vert->pos, mr.vert_positions[vert_i]); + copy_v3_v3_short(vert->nor, data->normals[vert_i].high); + + /* Flag for paint mode overlay. */ + if (poly_hidden || vert_hidden || + ((mr.v_origindex) && (mr.v_origindex[vert_i] == ORIGINDEX_NONE))) + { + vert->nor[3] = -1; + } + else if (!mr.select_vert.is_empty() && mr.select_vert[vert_i]) { + vert->nor[3] = 1; + } + else { + vert->nor[3] = 0; + } + } +} + +static void extract_pos_nor_hq_iter_loose_edge_bm(const MeshRenderData &mr, + const BMEdge *eed, + const int loose_edge_i, + void *_data) +{ + MeshExtract_PosNorHQ_Data *data = static_cast(_data); + int l_index = mr.loop_len + loose_edge_i * 2; + PosNorHQLoop *vert = &data->vbo_data[l_index]; + copy_v3_v3(vert[0].pos, bm_vert_co_get(mr, eed->v1)); + copy_v3_v3(vert[1].pos, bm_vert_co_get(mr, eed->v2)); + copy_v3_v3_short(vert[0].nor, data->normals[BM_elem_index_get(eed->v1)].high); + vert[0].nor[3] = 0; + copy_v3_v3_short(vert[1].nor, data->normals[BM_elem_index_get(eed->v2)].high); + vert[1].nor[3] = 0; +} + +static void extract_pos_nor_hq_iter_loose_edge_mesh(const MeshRenderData &mr, + const int2 edge, + const int loose_edge_i, + void *_data) +{ + MeshExtract_PosNorHQ_Data *data = static_cast(_data); + const int index = mr.loop_len + loose_edge_i * 2; + PosNorHQLoop *vert = &data->vbo_data[index]; + copy_v3_v3(vert[0].pos, mr.vert_positions[edge[0]]); + copy_v3_v3(vert[1].pos, mr.vert_positions[edge[1]]); + copy_v3_v3_short(vert[0].nor, data->normals[edge[0]].high); + vert[0].nor[3] = 0; + copy_v3_v3_short(vert[1].nor, data->normals[edge[1]].high); + vert[1].nor[3] = 0; +} + +static void extract_pos_nor_hq_iter_loose_vert_bm(const MeshRenderData &mr, + const BMVert *eve, + const int loose_vert_i, + void *_data) +{ + MeshExtract_PosNorHQ_Data *data = static_cast(_data); + const int offset = mr.loop_len + (mr.edge_loose_len * 2); + + const int l_index = offset + loose_vert_i; + PosNorHQLoop *vert = &data->vbo_data[l_index]; + copy_v3_v3(vert->pos, bm_vert_co_get(mr, eve)); + copy_v3_v3_short(vert->nor, data->normals[BM_elem_index_get(eve)].high); + vert->nor[3] = 0; +} + +static void extract_pos_nor_hq_iter_loose_vert_mesh(const MeshRenderData &mr, + const int loose_vert_i, + void *_data) +{ + MeshExtract_PosNorHQ_Data *data = static_cast(_data); + const int offset = mr.loop_len + (mr.edge_loose_len * 2); + + const int index = offset + loose_vert_i; + const int v_index = mr.loose_verts[loose_vert_i]; + PosNorHQLoop *vert = &data->vbo_data[index]; + copy_v3_v3(vert->pos, mr.vert_positions[v_index]); + copy_v3_v3_short(vert->nor, data->normals[v_index].high); + vert->nor[3] = 0; +} + +static void extract_pos_nor_hq_finish(const MeshRenderData & /*mr*/, + MeshBatchCache & /*cache*/, + void * /*buf*/, + void *_data) +{ + MeshExtract_PosNorHQ_Data *data = static_cast(_data); + MEM_freeN(data->normals); +} + +constexpr MeshExtract create_extractor_pos_nor_hq() +{ + MeshExtract extractor = {nullptr}; + extractor.init = extract_pos_nor_hq_init; + extractor.init_subdiv = extract_pos_nor_init_subdiv; + extractor.iter_face_bm = extract_pos_nor_hq_iter_face_bm; + extractor.iter_face_mesh = extract_pos_nor_hq_iter_face_mesh; + extractor.iter_loose_edge_bm = extract_pos_nor_hq_iter_loose_edge_bm; + extractor.iter_loose_edge_mesh = extract_pos_nor_hq_iter_loose_edge_mesh; + extractor.iter_loose_vert_bm = extract_pos_nor_hq_iter_loose_vert_bm; + extractor.iter_loose_vert_mesh = extract_pos_nor_hq_iter_loose_vert_mesh; + extractor.finish = extract_pos_nor_hq_finish; + extractor.data_type = MR_DATA_NONE; + extractor.data_size = sizeof(MeshExtract_PosNorHQ_Data); + extractor.use_threading = true; + extractor.mesh_buffer_offset = offsetof(MeshBufferList, vbo.pos_nor); + return extractor; +} + +/** \} */ + +const MeshExtract extract_pos_nor = create_extractor_pos_nor(); +const MeshExtract extract_pos_nor_hq = create_extractor_pos_nor_hq(); + +} // namespace blender::draw diff --git a/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_vnor.cc b/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_vnor.cc deleted file mode 100644 index 27a60946643..00000000000 --- a/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_vnor.cc +++ /dev/null @@ -1,72 +0,0 @@ -/* SPDX-FileCopyrightText: 2021 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup draw - */ - -#include "extract_mesh.hh" - -#include "draw_subdivision.hh" - -namespace blender::draw { - -/* ---------------------------------------------------------------------- */ -/** \name Extract Vertex Normal - * \{ */ - -static void extract_vnor_init(const MeshRenderData &mr, - MeshBatchCache & /*cache*/, - void *buf, - void *tls_data) -{ - GPUVertBuf *vbo = static_cast(buf); - static GPUVertFormat format = {0}; - if (format.attr_len == 0) { - GPU_vertformat_attr_add(&format, "vnor", GPU_COMP_I10, 4, GPU_FETCH_INT_TO_FLOAT_UNIT); - } - GPU_vertbuf_init_with_format(vbo, &format); - GPU_vertbuf_data_alloc(vbo, mr.loop_len); - - if (mr.extract_type == MR_EXTRACT_MESH) { - MutableSpan vbo_data(static_cast(GPU_vertbuf_get_data(vbo)), mr.loop_len); - extract_vert_normals(mr, vbo_data); - } - else { - *static_cast(tls_data) = static_cast( - GPU_vertbuf_get_data(vbo)); - } -} - -static void extract_vnor_iter_face_bm(const MeshRenderData &mr, - const BMFace *face, - const int /*f_index*/, - void *data_v) -{ - GPUPackedNormal *data = *static_cast(data_v); - const BMLoop *loop = BM_FACE_FIRST_LOOP(face); - for ([[maybe_unused]] const int i : IndexRange(face->len)) { - const int index = BM_elem_index_get(loop); - data[index] = GPU_normal_convert_i10_v3(bm_vert_no_get(mr, loop->v)); - loop = loop->next; - } -} - -constexpr MeshExtract create_extractor_vnor() -{ - MeshExtract extractor = {nullptr}; - extractor.init = extract_vnor_init; - extractor.iter_face_bm = extract_vnor_iter_face_bm; - extractor.data_type = MR_DATA_LOOP_NOR; - extractor.data_size = sizeof(GPUPackedNormal *); - extractor.use_threading = true; - extractor.mesh_buffer_offset = offsetof(MeshBufferList, vbo.vnor); - return extractor; -} - -/** \} */ - -const MeshExtract extract_vnor = create_extractor_vnor(); - -} // namespace blender::draw diff --git a/source/blender/draw/intern/shaders/common_debug_print_lib.glsl b/source/blender/draw/intern/shaders/common_debug_print_lib.glsl index 542a5de1a28..6eca110bda0 100644 --- a/source/blender/draw/intern/shaders/common_debug_print_lib.glsl +++ b/source/blender/draw/intern/shaders/common_debug_print_lib.glsl @@ -100,22 +100,22 @@ void drw_print_char4(uint data) * was observed on both MESA & AMDGPU-PRO. */ /* Using ascii char code. Expect char1 to be less or equal to 0xFF. Appends chars to the right. */ -void drw_print_append_char(uint char_1, inout uint char_4) +void drw_print_append_char(uint char1, inout uint char4) { - char_4 = (char_4 << 8u) | char_1; + char4 = (char4 << 8u) | char1; } -void drw_print_append_digit(uint digit, inout uint char_4) +void drw_print_append_digit(uint digit, inout uint char4) { const uint char_A = 0x41u; const uint char_0 = 0x30u; bool is_hexadecimal = digit > 9u; - char_4 = (char_4 << 8u) | (is_hexadecimal ? (char_A + digit - 10u) : (char_0 + digit)); + char4 = (char4 << 8u) | (is_hexadecimal ? (char_A + digit - 10u) : (char_0 + digit)); } -void drw_print_append_space(inout uint char_4) +void drw_print_append_space(inout uint char4) { - char_4 = (char_4 << 8u) | 0x20u; + char4 = (char4 << 8u) | 0x20u; } void drw_print_value_binary(uint value) diff --git a/source/blender/draw/intern/shaders/common_gpencil_lib.glsl b/source/blender/draw/intern/shaders/common_gpencil_lib.glsl index 5d3d4765856..795f83e99fd 100644 --- a/source/blender/draw/intern/shaders/common_gpencil_lib.glsl +++ b/source/blender/draw/intern/shaders/common_gpencil_lib.glsl @@ -247,18 +247,18 @@ vec4 gpencil_vertex(vec4 viewport_size, out_hardness = gpencil_decode_hardness(use_curr ? hardness1 : hardness2); if (is_dot) { - uint alignment_mode = material_flags & GP_STROKE_ALIGNMENT; + uint alignement_mode = material_flags & GP_STROKE_ALIGNMENT; /* For one point strokes use object alignment. */ - if (alignment_mode == GP_STROKE_ALIGNMENT_STROKE && ma.x == -1 && ma2.x == -1) { - alignment_mode = GP_STROKE_ALIGNMENT_OBJECT; + if (alignement_mode == GP_STROKE_ALIGNMENT_STROKE && ma.x == -1 && ma2.x == -1) { + alignement_mode = GP_STROKE_ALIGNMENT_OBJECT; } vec2 x_axis; - if (alignment_mode == GP_STROKE_ALIGNMENT_STROKE) { + if (alignement_mode == GP_STROKE_ALIGNMENT_STROKE) { x_axis = (ma2.x == -1) ? line_adj : line; } - else if (alignment_mode == GP_STROKE_ALIGNMENT_FIXED) { + else if (alignement_mode == GP_STROKE_ALIGNMENT_FIXED) { /* Default for no-material drawing. */ x_axis = vec2(1.0, 0.0); } diff --git a/source/blender/draw/intern/shaders/common_grease_pencil_lib.glsl b/source/blender/draw/intern/shaders/common_grease_pencil_lib.glsl index c63737d4c74..937cbb706c1 100644 --- a/source/blender/draw/intern/shaders/common_grease_pencil_lib.glsl +++ b/source/blender/draw/intern/shaders/common_grease_pencil_lib.glsl @@ -244,18 +244,18 @@ vec4 gpencil_vertex(vec4 viewport_size, out_hardness = gpencil_decode_hardness(use_curr ? hardness1 : hardness2); if (is_dot) { - uint alignment_mode = material_flags & GP_STROKE_ALIGNMENT; + uint alignement_mode = material_flags & GP_STROKE_ALIGNMENT; /* For one point strokes use object alignment. */ - if (alignment_mode == GP_STROKE_ALIGNMENT_STROKE && ma.x == -1 && ma2.x == -1) { - alignment_mode = GP_STROKE_ALIGNMENT_OBJECT; + if (alignement_mode == GP_STROKE_ALIGNMENT_STROKE && ma.x == -1 && ma2.x == -1) { + alignement_mode = GP_STROKE_ALIGNMENT_OBJECT; } vec2 x_axis; - if (alignment_mode == GP_STROKE_ALIGNMENT_STROKE) { + if (alignement_mode == GP_STROKE_ALIGNMENT_STROKE) { x_axis = (ma2.x == -1) ? line_adj : line; } - else if (alignment_mode == GP_STROKE_ALIGNMENT_FIXED) { + else if (alignement_mode == GP_STROKE_ALIGNMENT_FIXED) { /* Default for no-material drawing. */ x_axis = vec2(1.0, 0.0); } diff --git a/source/blender/draw/intern/shaders/common_subdiv_patch_evaluation_comp.glsl b/source/blender/draw/intern/shaders/common_subdiv_patch_evaluation_comp.glsl index efdea49aee1..e8ebe40eb9c 100644 --- a/source/blender/draw/intern/shaders/common_subdiv_patch_evaluation_comp.glsl +++ b/source/blender/draw/intern/shaders/common_subdiv_patch_evaluation_comp.glsl @@ -96,8 +96,8 @@ layout(std430, binding = 8) readonly buffer inputFlagsBuffer }; float get_flag(int vertex) { - int char_4 = flags_buffer[vertex / 4]; - int flag = (char_4 >> ((vertex % 4) * 8)) & 0xFF; + int char4 = flags_buffer[vertex / 4]; + int flag = (char4 >> ((vertex % 4) * 8)) & 0xFF; if (flag >= 128) { flag = -128 + (flag - 128); } diff --git a/source/blender/editors/animation/anim_channels_defines.cc b/source/blender/editors/animation/anim_channels_defines.cc index 98b0ff323bb..e51c1cc78f4 100644 --- a/source/blender/editors/animation/anim_channels_defines.cc +++ b/source/blender/editors/animation/anim_channels_defines.cc @@ -18,7 +18,7 @@ #include "BLI_math_color.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_anim_types.h" #include "DNA_armature_types.h" @@ -51,13 +51,15 @@ #include "RNA_path.hh" #include "RNA_prototypes.h" -#include "BKE_anim_data.hh" +#include "BKE_anim_data.h" #include "BKE_animsys.h" #include "BKE_context.hh" #include "BKE_curve.hh" +#include "BKE_gpencil_legacy.h" #include "BKE_grease_pencil.hh" #include "BKE_key.hh" #include "BKE_lib_id.hh" +#include "BKE_main.hh" #include "BKE_nla.h" #include "GPU_immediate.h" @@ -5348,6 +5350,8 @@ static void draw_setting_widget(bAnimContext *ac, static_cast(ptr), 0, 0, + 0, + 0, tooltip); break; @@ -5364,6 +5368,8 @@ static void draw_setting_widget(bAnimContext *ac, static_cast(ptr), 0, 0, + 0, + 0, tooltip); break; @@ -5380,6 +5386,8 @@ static void draw_setting_widget(bAnimContext *ac, static_cast(ptr), 0, 0, + 0, + 0, tooltip); break; } diff --git a/source/blender/editors/animation/anim_channels_edit.cc b/source/blender/editors/animation/anim_channels_edit.cc index 68536b03dfb..4cc9dedf9bc 100644 --- a/source/blender/editors/animation/anim_channels_edit.cc +++ b/source/blender/editors/animation/anim_channels_edit.cc @@ -29,16 +29,17 @@ #include "RNA_path.hh" #include "BKE_action.h" -#include "BKE_anim_data.hh" +#include "BKE_anim_data.h" #include "BKE_context.hh" -#include "BKE_fcurve.hh" -#include "BKE_global.hh" +#include "BKE_fcurve.h" +#include "BKE_global.h" #include "BKE_gpencil_legacy.h" #include "BKE_grease_pencil.hh" #include "BKE_layer.hh" #include "BKE_lib_id.hh" #include "BKE_mask.h" #include "BKE_nla.h" +#include "BKE_scene.h" #include "BKE_screen.hh" #include "BKE_workspace.h" diff --git a/source/blender/editors/animation/anim_deps.cc b/source/blender/editors/animation/anim_deps.cc index 23a6fea7970..0c5ac66592e 100644 --- a/source/blender/editors/animation/anim_deps.cc +++ b/source/blender/editors/animation/anim_deps.cc @@ -15,6 +15,7 @@ #include "DNA_gpencil_legacy_types.h" #include "DNA_grease_pencil_types.h" #include "DNA_mask_types.h" +#include "DNA_node_types.h" #include "DNA_object_types.h" #include "DNA_scene_types.h" #include "DNA_sequence_types.h" @@ -23,10 +24,13 @@ #include "BLI_utildefines.h" #include "BKE_action.h" -#include "BKE_anim_data.hh" -#include "BKE_fcurve.hh" +#include "BKE_anim_data.h" +#include "BKE_context.hh" +#include "BKE_fcurve.h" #include "BKE_gpencil_legacy.h" #include "BKE_grease_pencil.hh" +#include "BKE_main.hh" +#include "BKE_node.h" #include "DEG_depsgraph.hh" diff --git a/source/blender/editors/animation/anim_draw.cc b/source/blender/editors/animation/anim_draw.cc index e6ffd637fbe..8c6e1ddd608 100644 --- a/source/blender/editors/animation/anim_draw.cc +++ b/source/blender/editors/animation/anim_draw.cc @@ -9,34 +9,41 @@ #include "BLI_sys_types.h" #include "DNA_anim_types.h" +#include "DNA_gpencil_legacy_types.h" +#include "DNA_mask_types.h" #include "DNA_object_types.h" #include "DNA_scene_types.h" #include "DNA_screen_types.h" #include "DNA_space_types.h" #include "DNA_userdef_types.h" +#include "BLI_dlrbTree.h" #include "BLI_math_rotation.h" #include "BLI_rect.h" +#include "BLI_timecode.h" #include "BLI_utildefines.h" #include "BKE_context.hh" #include "BKE_curve.hh" -#include "BKE_fcurve.hh" -#include "BKE_global.hh" +#include "BKE_fcurve.h" +#include "BKE_global.h" #include "BKE_mask.h" #include "BKE_nla.h" #include "ED_anim_api.hh" +#include "ED_keyframes_draw.hh" #include "ED_keyframes_edit.hh" #include "ED_keyframes_keylist.hh" #include "RNA_access.hh" #include "RNA_path.hh" +#include "UI_interface.hh" #include "UI_resources.hh" #include "UI_view2d.hh" #include "GPU_immediate.h" +#include "GPU_matrix.h" #include "GPU_state.h" /* *************************************************** */ @@ -221,30 +228,27 @@ AnimData *ANIM_nla_mapping_get(bAnimContext *ac, bAnimListElem *ale) /* apart from strictly keyframe-related contexts, this shouldn't even happen */ /* XXX: nla and channel here may not be necessary... */ - if (!ELEM(ac->datatype, - ANIMCONT_ACTION, - ANIMCONT_SHAPEKEY, - ANIMCONT_DOPESHEET, - ANIMCONT_FCURVES, - ANIMCONT_NLA, - ANIMCONT_CHANNEL, - ANIMCONT_TIMELINE)) + if (ELEM(ac->datatype, + ANIMCONT_ACTION, + ANIMCONT_SHAPEKEY, + ANIMCONT_DOPESHEET, + ANIMCONT_FCURVES, + ANIMCONT_NLA, + ANIMCONT_CHANNEL, + ANIMCONT_TIMELINE)) { - return nullptr; + /* handling depends on the type of animation-context we've got */ + if (ale) { + /* NLA Control Curves occur on NLA strips, + * and shouldn't be subjected to this kind of mapping. */ + if (ale->type != ANIMTYPE_NLACURVE) { + return ale->adt; + } + } } - /* handling depends on the type of animation-context we've got */ - if (!ale) { - return nullptr; - } - - /* NLA Control Curves occur on NLA strips, - * and shouldn't be subjected to this kind of mapping. */ - if (ale->type == ANIMTYPE_NLACURVE) { - return nullptr; - } - - return ale->adt; + /* cannot handle... */ + return nullptr; } /* ------------------- */ diff --git a/source/blender/editors/animation/anim_filter.cc b/source/blender/editors/animation/anim_filter.cc index 9c8d4699c7d..46c6c653183 100644 --- a/source/blender/editors/animation/anim_filter.cc +++ b/source/blender/editors/animation/anim_filter.cc @@ -62,17 +62,18 @@ #include "MEM_guardedalloc.h" #include "BLI_alloca.h" +#include "BLI_blenlib.h" #include "BLI_ghash.h" #include "BLI_string.h" #include "BLI_utildefines.h" #include "BKE_action.h" -#include "BKE_anim_data.hh" -#include "BKE_collection.hh" +#include "BKE_anim_data.h" +#include "BKE_collection.h" #include "BKE_context.hh" -#include "BKE_fcurve.hh" +#include "BKE_fcurve.h" #include "BKE_fcurve_driver.h" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_grease_pencil.hh" #include "BKE_key.hh" #include "BKE_layer.hh" @@ -80,7 +81,7 @@ #include "BKE_mask.h" #include "BKE_material.h" #include "BKE_modifier.hh" -#include "BKE_node.hh" +#include "BKE_node.h" #include "ED_anim_api.hh" #include "ED_markers.hh" @@ -90,6 +91,8 @@ #include "ANIM_bone_collections.hh" +#include "UI_resources.hh" /* for TH_KEYFRAME_SCALE lookup */ + /* ************************************************************ */ /* Blender Context <-> Animation Context mapping */ diff --git a/source/blender/editors/animation/anim_ipo_utils.cc b/source/blender/editors/animation/anim_ipo_utils.cc index 1212870f192..c2da8147791 100644 --- a/source/blender/editors/animation/anim_ipo_utils.cc +++ b/source/blender/editors/animation/anim_ipo_utils.cc @@ -18,7 +18,7 @@ #include "BLI_math_color.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_anim_types.h" diff --git a/source/blender/editors/animation/anim_markers.cc b/source/blender/editors/animation/anim_markers.cc index 5be085743bc..b05667494f6 100644 --- a/source/blender/editors/animation/anim_markers.cc +++ b/source/blender/editors/animation/anim_markers.cc @@ -16,14 +16,15 @@ #include "BLI_blenlib.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_context.hh" +#include "BKE_fcurve.h" #include "BKE_idprop.h" #include "BKE_layer.hh" #include "BKE_main.hh" -#include "BKE_report.hh" -#include "BKE_scene.hh" +#include "BKE_report.h" +#include "BKE_scene.h" #include "BKE_screen.hh" #include "BKE_unit.hh" @@ -1680,20 +1681,6 @@ static int ed_marker_delete_exec(bContext *C, wmOperator * /*op*/) return OPERATOR_FINISHED; } -static int ed_marker_delete_invoke(bContext *C, wmOperator *op, const wmEvent * /*event*/) -{ - if (RNA_boolean_get(op->ptr, "confirm")) { - return WM_operator_confirm_ex(C, - op, - IFACE_("Delete selected markers?"), - nullptr, - IFACE_("Delete"), - ALERT_ICON_NONE, - false); - } - return ed_marker_delete_exec(C, op); -} - static void MARKER_OT_delete(wmOperatorType *ot) { /* identifiers */ @@ -1702,7 +1689,7 @@ static void MARKER_OT_delete(wmOperatorType *ot) ot->idname = "MARKER_OT_delete"; /* api callbacks */ - ot->invoke = ed_marker_delete_invoke; + ot->invoke = WM_operator_confirm_or_exec; ot->exec = ed_marker_delete_exec; ot->poll = ed_markers_poll_selected_no_locked_markers; diff --git a/source/blender/editors/animation/anim_motion_paths.cc b/source/blender/editors/animation/anim_motion_paths.cc index 9cf8a4f65fb..7d0c365a57a 100644 --- a/source/blender/editors/animation/anim_motion_paths.cc +++ b/source/blender/editors/animation/anim_motion_paths.cc @@ -20,9 +20,9 @@ #include "DNA_scene_types.h" #include "BKE_action.h" -#include "BKE_anim_data.hh" +#include "BKE_anim_data.h" #include "BKE_main.hh" -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "DEG_depsgraph.hh" #include "DEG_depsgraph_build.hh" @@ -52,7 +52,7 @@ struct MPathTarget { Object *ob; /* source object */ bPoseChannel *pchan; /* source posechannel (if applicable) */ - /* "Evaluated" Copies (these come from the background evaluated copy + /* "Evaluated" Copies (these come from the background COW copy * that provide all the coordinates we want to save off). */ Object *ob_eval; /* evaluated object */ }; @@ -168,17 +168,18 @@ static void motionpaths_calc_bake_targets(ListBase *targets, } /* Result must be in world-space. */ - mul_m4_v3(ob_eval->object_to_world().ptr(), mpv->co); + mul_m4_v3(ob_eval->object_to_world, mpv->co); } else { /* World-space object location. */ - copy_v3_v3(mpv->co, ob_eval->object_to_world().location()); + copy_v3_v3(mpv->co, ob_eval->object_to_world[3]); } if (mpath->flag & MOTIONPATH_FLAG_BAKE_CAMERA && camera) { Object *cam_eval = DEG_get_evaluated_object(depsgraph, camera); /* Convert point to camera space. */ - float3 co_camera_space = math::transform_point(cam_eval->world_to_object(), float3(mpv->co)); + float3 co_camera_space = math::transform_point(float4x4(cam_eval->world_to_object), + float3(mpv->co)); copy_v3_v3(mpv->co, co_camera_space); } @@ -435,7 +436,7 @@ void animviz_calc_motionpaths(Depsgraph *depsgraph, } /* get copies of objects/bones to get the calculated results from - * (for copy-on-evaluation), so that we actually get some results + * (for copy-on-write evaluation), so that we actually get some results */ /* TODO: Create a copy of background depsgraph that only contain these entities, diff --git a/source/blender/editors/animation/anim_ops.cc b/source/blender/editors/animation/anim_ops.cc index c6d13a9e1fb..6d673e8090a 100644 --- a/source/blender/editors/animation/anim_ops.cc +++ b/source/blender/editors/animation/anim_ops.cc @@ -17,9 +17,9 @@ #include "DNA_scene_types.h" #include "BKE_context.hh" -#include "BKE_global.hh" -#include "BKE_report.hh" -#include "BKE_scene.hh" +#include "BKE_global.h" +#include "BKE_report.h" +#include "BKE_scene.h" #include "UI_view2d.hh" diff --git a/source/blender/editors/animation/drivers.cc b/source/blender/editors/animation/drivers.cc index 6f9c69a5668..5bb9e4fe0f8 100644 --- a/source/blender/editors/animation/drivers.cc +++ b/source/blender/editors/animation/drivers.cc @@ -12,17 +12,20 @@ #include "MEM_guardedalloc.h" +#include "BLI_blenlib.h" #include "BLI_string.h" #include "BLI_utildefines.h" #include "DNA_anim_types.h" +#include "DNA_object_types.h" #include "DNA_texture_types.h" -#include "BKE_anim_data.hh" +#include "BKE_anim_data.h" +#include "BKE_animsys.h" #include "BKE_context.hh" -#include "BKE_fcurve.hh" +#include "BKE_fcurve.h" #include "BKE_fcurve_driver.h" -#include "BKE_report.hh" +#include "BKE_report.h" #include "DEG_depsgraph.hh" #include "DEG_depsgraph_build.hh" @@ -1054,7 +1057,7 @@ static int add_driver_button_invoke(bContext *C, wmOperator *op, const wmEvent * if (changed) { /* send updates */ UI_context_update_anim_flag(C); - DEG_id_tag_update(ptr.owner_id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(ptr.owner_id, ID_RECALC_COPY_ON_WRITE); DEG_relations_tag_update(CTX_data_main(C)); WM_event_add_notifier(C, NC_ANIMATION | ND_FCURVES_ORDER, nullptr); } diff --git a/source/blender/editors/animation/fmodifier_ui.cc b/source/blender/editors/animation/fmodifier_ui.cc index e0b212d081f..f7826409744 100644 --- a/source/blender/editors/animation/fmodifier_ui.cc +++ b/source/blender/editors/animation/fmodifier_ui.cc @@ -21,13 +21,13 @@ #include "MEM_guardedalloc.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BLI_blenlib.h" #include "BLI_utildefines.h" #include "BKE_context.hh" -#include "BKE_fcurve.hh" +#include "BKE_fcurve.h" #include "BKE_screen.hh" #include "WM_api.hh" @@ -335,6 +335,8 @@ static void fmodifier_panel_header(const bContext *C, Panel *panel) nullptr, 0.0, 0.0, + 0.0, + 0.0, TIP_("Delete Modifier")); FModifierDeleteContext *ctx = static_cast( MEM_mallocN(sizeof(FModifierDeleteContext), __func__)); @@ -693,6 +695,8 @@ static void envelope_panel_draw(const bContext *C, Panel *panel) nullptr, 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, nullptr); @@ -722,6 +726,8 @@ static void envelope_panel_draw(const bContext *C, Panel *panel) nullptr, 0.0, 0.0, + 0.0, + 0.0, TIP_("Delete envelope control point")); UI_but_func_set(but, fmod_envelope_deletepoint_cb, env, POINTER_FROM_INT(i)); UI_block_align_begin(block); diff --git a/source/blender/editors/animation/keyframes_draw.cc b/source/blender/editors/animation/keyframes_draw.cc index 38a8ad8dbc6..1f7e1c9af9d 100644 --- a/source/blender/editors/animation/keyframes_draw.cc +++ b/source/blender/editors/animation/keyframes_draw.cc @@ -14,6 +14,7 @@ #include "BKE_grease_pencil.hh" +#include "BLI_dlrbTree.h" #include "BLI_listbase.h" #include "BLI_rect.h" @@ -21,6 +22,8 @@ #include "DNA_gpencil_legacy_types.h" #include "DNA_grease_pencil_types.h" #include "DNA_mask_types.h" +#include "DNA_object_types.h" +#include "DNA_scene_types.h" #include "GPU_immediate.h" #include "GPU_shader_shared.h" @@ -30,6 +33,7 @@ #include "UI_resources.hh" #include "UI_view2d.hh" +#include "ED_anim_api.hh" #include "ED_keyframes_draw.hh" #include "ED_keyframes_keylist.hh" diff --git a/source/blender/editors/animation/keyframes_edit.cc b/source/blender/editors/animation/keyframes_edit.cc index 8a48afb4b6b..edcb8354400 100644 --- a/source/blender/editors/animation/keyframes_edit.cc +++ b/source/blender/editors/animation/keyframes_edit.cc @@ -14,8 +14,7 @@ #include "MEM_guardedalloc.h" #include "BLI_blenlib.h" -#include "BLI_function_ref.hh" -#include "BLI_lasso_2d.hh" +#include "BLI_lasso_2d.h" #include "BLI_math_vector.h" #include "BLI_utildefines.h" @@ -23,7 +22,7 @@ #include "DNA_object_types.h" #include "DNA_scene_types.h" -#include "BKE_fcurve.hh" +#include "BKE_fcurve.h" #include "BKE_nla.h" #include "ED_anim_api.hh" @@ -487,53 +486,62 @@ void ANIM_editkeyframes_refresh(bAnimContext *ac) /* BezTriple Validation Callbacks */ /* ------------------------ */ +/* Some macros to make this easier... */ -static short keyframe_ok_checks( - KeyframeEditData *ked, - BezTriple *bezt, - blender::FunctionRef check) -{ - short ok = 0; - if (check(ked, bezt, 1)) { - ok |= KEYFRAME_OK_KEY; - } - if (ked && (ked->iterflags & KEYFRAME_ITER_INCL_HANDLES)) - { /* Only act on visible items, so check handle visibility state. */ - const bool handles_visible = ((ked->iterflags & KEYFRAME_ITER_HANDLES_DEFAULT_INVISIBLE) ? - BEZT_ISSEL_ANY(bezt) : - true); - if (handles_visible) { - if (check(ked, bezt, 0)) { - ok |= KEYFRAME_OK_H1; - } - if (check(ked, bezt, 2)) { - ok |= KEYFRAME_OK_H2; - } - } - } - return ok; -} +/* run the given check on the 3 handles: + * - Check should be a macro, which takes the handle index as its single arg, + * which it substitutes later. + * - Requires that a var, of type short, is named 'ok', + * and has been initialized to 0. + */ +#define KEYFRAME_OK_CHECKS(check) \ + { \ + CHECK_TYPE(ok, short); \ + if (check(1)) { \ + ok |= KEYFRAME_OK_KEY; \ + } \ + if (ked && (ked->iterflags & KEYFRAME_ITER_INCL_HANDLES)) { \ + /* Only act on visible items, so check handle visibility state. */ \ + const bool handles_visible = ((ked->iterflags & KEYFRAME_ITER_HANDLES_DEFAULT_INVISIBLE) ? \ + BEZT_ISSEL_ANY(bezt) : \ + true); \ + if (handles_visible) { \ + if (check(0)) { \ + ok |= KEYFRAME_OK_H1; \ + } \ + if (check(2)) { \ + ok |= KEYFRAME_OK_H2; \ + } \ + } \ + } \ + } \ + (void)0 /* ------------------------ */ static short ok_bezier_frame(KeyframeEditData *ked, BezTriple *bezt) { - /* frame is stored in f1 property (this float accuracy check may need to be dropped?) */ - const short ok = keyframe_ok_checks( - ked, bezt, [](KeyframeEditData *ked, BezTriple *bezt, int index) -> bool { - return IS_EQF(bezt->vec[index][0], ked->f1); - }); + short ok = 0; + /* frame is stored in f1 property (this float accuracy check may need to be dropped?) */ +#define KEY_CHECK_OK(_index) IS_EQF(bezt->vec[_index][0], ked->f1) + KEYFRAME_OK_CHECKS(KEY_CHECK_OK); +#undef KEY_CHECK_OK + + /* return ok flags */ return ok; } static short ok_bezier_framerange(KeyframeEditData *ked, BezTriple *bezt) { - const short ok = keyframe_ok_checks( - ked, bezt, [](KeyframeEditData *ked, BezTriple *bezt, int index) -> bool { - return (bezt->vec[index][0] > ked->f1) && (bezt->vec[index][0] < ked->f2); - }); + short ok = 0; + /* frame range is stored in float properties */ +#define KEY_CHECK_OK(_index) ((bezt->vec[_index][0] > ked->f1) && (bezt->vec[_index][0] < ked->f2)) + KEYFRAME_OK_CHECKS(KEY_CHECK_OK); +#undef KEY_CHECK_OK + + /* return ok flags */ return ok; } @@ -550,43 +558,48 @@ static short ok_bezier_selected(KeyframeEditData * /*ked*/, BezTriple *bezt) static short ok_bezier_value(KeyframeEditData *ked, BezTriple *bezt) { + short ok = 0; + /* Value is stored in f1 property: * - This float accuracy check may need to be dropped? * - Should value be stored in f2 instead * so that we won't have conflicts when using f1 for frames too? */ - const short ok = keyframe_ok_checks( - ked, bezt, [](KeyframeEditData *ked, BezTriple *bezt, int index) -> bool { - return IS_EQF(bezt->vec[index][1], ked->f1); - }); +#define KEY_CHECK_OK(_index) IS_EQF(bezt->vec[_index][1], ked->f1) + KEYFRAME_OK_CHECKS(KEY_CHECK_OK); +#undef KEY_CHECK_OK + /* return ok flags */ return ok; } static short ok_bezier_valuerange(KeyframeEditData *ked, BezTriple *bezt) { - /* value range is stored in float properties */ - const short ok = keyframe_ok_checks( - ked, bezt, [](KeyframeEditData *ked, BezTriple *bezt, int index) -> bool { - return (bezt->vec[index][1] > ked->f1) && (bezt->vec[index][1] < ked->f2); - }); + short ok = 0; + /* value range is stored in float properties */ +#define KEY_CHECK_OK(_index) ((bezt->vec[_index][1] > ked->f1) && (bezt->vec[_index][1] < ked->f2)) + KEYFRAME_OK_CHECKS(KEY_CHECK_OK); +#undef KEY_CHECK_OK + + /* return ok flags */ return ok; } static short ok_bezier_region(KeyframeEditData *ked, BezTriple *bezt) { /* rect is stored in data property (it's of type rectf, but may not be set) */ - if (!ked->data) { - return 0; + if (ked->data) { + short ok = 0; + +#define KEY_CHECK_OK(_index) BLI_rctf_isect_pt_v(static_cast(ked->data), bezt->vec[_index]) + KEYFRAME_OK_CHECKS(KEY_CHECK_OK); +#undef KEY_CHECK_OK + + /* return ok flags */ + return ok; } - - const short ok = keyframe_ok_checks( - ked, bezt, [](KeyframeEditData *ked, BezTriple *bezt, int index) -> bool { - return BLI_rctf_isect_pt_v(static_cast(ked->data), bezt->vec[index]); - }); - - return ok; + return 0; } bool keyframe_region_lasso_test(const KeyframeEdit_LassoData *data_lasso, const float xy[2]) @@ -596,7 +609,9 @@ bool keyframe_region_lasso_test(const KeyframeEdit_LassoData *data_lasso, const BLI_rctf_transform_pt_v(data_lasso->rectf_view, data_lasso->rectf_scaled, xy_view, xy); - if (BLI_lasso_is_point_inside(data_lasso->mcoords, xy_view[0], xy_view[1], INT_MAX)) { + if (BLI_lasso_is_point_inside( + data_lasso->mcoords, data_lasso->mcoords_len, xy_view[0], xy_view[1], INT_MAX)) + { return true; } } @@ -607,17 +622,18 @@ bool keyframe_region_lasso_test(const KeyframeEdit_LassoData *data_lasso, const static short ok_bezier_region_lasso(KeyframeEditData *ked, BezTriple *bezt) { /* check for lasso customdata (KeyframeEdit_LassoData) */ - if (!ked->data) { - return 0; + if (ked->data) { + short ok = 0; + +#define KEY_CHECK_OK(_index) \ + keyframe_region_lasso_test(static_cast(ked->data), bezt->vec[_index]) + KEYFRAME_OK_CHECKS(KEY_CHECK_OK); +#undef KEY_CHECK_OK + + /* return ok flags */ + return ok; } - - const short ok = keyframe_ok_checks( - ked, bezt, [](KeyframeEditData *ked, BezTriple *bezt, int index) -> bool { - return keyframe_region_lasso_test(static_cast(ked->data), - bezt->vec[index]); - }); - - return ok; + return 0; } static short ok_bezier_channel_lasso(KeyframeEditData *ked, BezTriple *bezt) @@ -666,17 +682,18 @@ bool keyframe_region_circle_test(const KeyframeEdit_CircleData *data_circle, con static short ok_bezier_region_circle(KeyframeEditData *ked, BezTriple *bezt) { /* check for circle select customdata (KeyframeEdit_CircleData) */ - if (!ked->data) { - return 0; + if (ked->data) { + short ok = 0; + +#define KEY_CHECK_OK(_index) \ + keyframe_region_circle_test(static_cast(ked->data), bezt->vec[_index]) + KEYFRAME_OK_CHECKS(KEY_CHECK_OK); +#undef KEY_CHECK_OK + + /* return ok flags */ + return ok; } - - const short ok = keyframe_ok_checks( - ked, bezt, [](KeyframeEditData *ked, BezTriple *bezt, int index) -> bool { - return keyframe_region_circle_test(static_cast(ked->data), - bezt->vec[index]); - }); - - return ok; + return 0; } static short ok_bezier_channel_circle(KeyframeEditData *ked, BezTriple *bezt) diff --git a/source/blender/editors/animation/keyframes_general.cc b/source/blender/editors/animation/keyframes_general.cc index 279a1ef8292..afebe744b3e 100644 --- a/source/blender/editors/animation/keyframes_general.cc +++ b/source/blender/editors/animation/keyframes_general.cc @@ -26,9 +26,10 @@ #include "BKE_action.h" #include "BKE_curve.hh" -#include "BKE_fcurve.hh" +#include "BKE_fcurve.h" #include "BKE_main.hh" -#include "BKE_scene.hh" +#include "BKE_report.h" +#include "BKE_scene.h" #include "RNA_access.hh" #include "RNA_enum_types.hh" diff --git a/source/blender/editors/animation/keyframes_keylist.cc b/source/blender/editors/animation/keyframes_keylist.cc index 7ba26939ef3..089ed42b567 100644 --- a/source/blender/editors/animation/keyframes_keylist.cc +++ b/source/blender/editors/animation/keyframes_keylist.cc @@ -19,6 +19,7 @@ #include "MEM_guardedalloc.h" #include "BLI_array.hh" +#include "BLI_dlrbTree.h" #include "BLI_listbase.h" #include "BLI_range.h" #include "BLI_utildefines.h" @@ -30,7 +31,7 @@ #include "DNA_object_types.h" #include "DNA_scene_types.h" -#include "BKE_fcurve.hh" +#include "BKE_fcurve.h" #include "BKE_grease_pencil.hh" #include "ED_anim_api.hh" diff --git a/source/blender/editors/animation/keyframes_keylist_test.cc b/source/blender/editors/animation/keyframes_keylist_test.cc index dfdd5812c79..12225529856 100644 --- a/source/blender/editors/animation/keyframes_keylist_test.cc +++ b/source/blender/editors/animation/keyframes_keylist_test.cc @@ -13,7 +13,7 @@ #include "MEM_guardedalloc.h" -#include "BKE_fcurve.hh" +#include "BKE_fcurve.h" #include #include diff --git a/source/blender/editors/animation/keyframing.cc b/source/blender/editors/animation/keyframing.cc index d6c7b47b762..809df7a8b01 100644 --- a/source/blender/editors/animation/keyframing.cc +++ b/source/blender/editors/animation/keyframing.cc @@ -13,29 +13,33 @@ #include "BLI_blenlib.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_ID.h" #include "DNA_action_types.h" #include "DNA_anim_types.h" #include "DNA_armature_types.h" +#include "DNA_constraint_types.h" +#include "DNA_key_types.h" +#include "DNA_material_types.h" #include "DNA_object_types.h" #include "DNA_scene_types.h" #include "BKE_action.h" -#include "BKE_anim_data.hh" +#include "BKE_anim_data.h" #include "BKE_animsys.h" #include "BKE_armature.hh" #include "BKE_context.hh" -#include "BKE_fcurve.hh" -#include "BKE_global.hh" +#include "BKE_fcurve.h" +#include "BKE_global.h" #include "BKE_idtype.hh" #include "BKE_lib_id.hh" #include "BKE_nla.h" -#include "BKE_report.hh" -#include "BKE_scene.hh" +#include "BKE_report.h" +#include "BKE_scene.h" #include "DEG_depsgraph.hh" +#include "DEG_depsgraph_build.hh" #include "ED_keyframing.hh" #include "ED_object.hh" @@ -47,6 +51,7 @@ #include "ANIM_fcurve.hh" #include "ANIM_keyframing.hh" #include "ANIM_rna.hh" +#include "ANIM_visualkey.hh" #include "UI_interface.hh" #include "UI_resources.hh" @@ -713,20 +718,6 @@ static int clear_anim_v3d_exec(bContext *C, wmOperator * /*op*/) return OPERATOR_FINISHED; } -static int clear_anim_v3d_invoke(bContext *C, wmOperator *op, const wmEvent * /*event*/) -{ - if (RNA_boolean_get(op->ptr, "confirm")) { - return WM_operator_confirm_ex(C, - op, - IFACE_("Remove animation from selected objects?"), - nullptr, - IFACE_("Remove"), - ALERT_ICON_NONE, - false); - } - return clear_anim_v3d_exec(C, op); -} - void ANIM_OT_keyframe_clear_v3d(wmOperatorType *ot) { /* identifiers */ @@ -735,7 +726,7 @@ void ANIM_OT_keyframe_clear_v3d(wmOperatorType *ot) ot->idname = "ANIM_OT_keyframe_clear_v3d"; /* callbacks */ - ot->invoke = clear_anim_v3d_invoke; + ot->invoke = WM_operator_confirm_or_exec; ot->exec = clear_anim_v3d_exec; ot->poll = ED_operator_areaactive; @@ -869,20 +860,6 @@ static int delete_key_v3d_exec(bContext *C, wmOperator *op) return delete_key_using_keying_set(C, op, ks); } -static int delete_key_v3d_invoke(bContext *C, wmOperator *op, const wmEvent * /*event*/) -{ - if (RNA_boolean_get(op->ptr, "confirm")) { - return WM_operator_confirm_ex(C, - op, - IFACE_("Delete keyframes from selected objects?"), - nullptr, - IFACE_("Delete"), - ALERT_ICON_NONE, - false); - } - return delete_key_v3d_exec(C, op); -} - void ANIM_OT_keyframe_delete_v3d(wmOperatorType *ot) { /* identifiers */ @@ -891,7 +868,7 @@ void ANIM_OT_keyframe_delete_v3d(wmOperatorType *ot) ot->idname = "ANIM_OT_keyframe_delete_v3d"; /* callbacks */ - ot->invoke = delete_key_v3d_invoke; + ot->invoke = WM_operator_confirm_or_exec; ot->exec = delete_key_v3d_exec; ot->poll = ED_operator_areaactive; @@ -1342,7 +1319,7 @@ static bool object_frame_has_keyframe(Object *ob, float frame) return false; } - /* check its own animation data - specifically, the action it contains */ + /* check own animation data - specifically, the action it contains */ if ((ob->adt) && (ob->adt->action)) { /* #41525 - When the active action is a NLA strip being edited, * we need to correct the frame number to "look inside" the diff --git a/source/blender/editors/animation/keyingsets.cc b/source/blender/editors/animation/keyingsets.cc index 39cf92eb863..eff6523b15d 100644 --- a/source/blender/editors/animation/keyingsets.cc +++ b/source/blender/editors/animation/keyingsets.cc @@ -24,7 +24,7 @@ #include "BKE_animsys.h" #include "BKE_context.hh" #include "BKE_main.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "DEG_depsgraph.hh" @@ -744,10 +744,10 @@ KeyingSet *ANIM_get_keyingset_for_autokeying(const Scene *scene, const char *tra return ANIM_builtin_keyingset_get_named(transformKSName); } -static void anim_keyingset_visit_for_search_impl( - const bContext *C, - blender::FunctionRef visit_fn, - const bool use_poll) +static void anim_keyingset_visit_for_search_impl(const bContext *C, + StringPropertySearchVisitFunc visit_fn, + void *visit_user_data, + const bool use_poll) { /* Poll requires context. */ if (use_poll && (C == nullptr)) { @@ -758,10 +758,10 @@ static void anim_keyingset_visit_for_search_impl( /* Active Keying Set. */ if (!use_poll || (scene && scene->active_keyingset)) { - StringPropertySearchVisitParams visit_params{}; + StringPropertySearchVisitParams visit_params = {nullptr}; visit_params.text = "__ACTIVE__"; visit_params.info = "Active Keying Set"; - visit_fn(visit_params); + visit_fn(visit_user_data, &visit_params); } /* User-defined Keying Sets. */ @@ -770,10 +770,10 @@ static void anim_keyingset_visit_for_search_impl( if (use_poll && !ANIM_keyingset_context_ok_poll((bContext *)C, keyingset)) { continue; } - StringPropertySearchVisitParams visit_params{}; + StringPropertySearchVisitParams visit_params = {nullptr}; visit_params.text = keyingset->idname; visit_params.info = keyingset->name; - visit_fn(visit_params); + visit_fn(visit_user_data, &visit_params); } } @@ -782,31 +782,31 @@ static void anim_keyingset_visit_for_search_impl( if (use_poll && !ANIM_keyingset_context_ok_poll((bContext *)C, keyingset)) { continue; } - StringPropertySearchVisitParams visit_params{}; + StringPropertySearchVisitParams visit_params = {nullptr}; visit_params.text = keyingset->idname; visit_params.info = keyingset->name; - visit_fn(visit_params); + visit_fn(visit_user_data, &visit_params); } } -void ANIM_keyingset_visit_for_search( - const bContext *C, - PointerRNA * /*ptr*/, - PropertyRNA * /*prop*/, - const char * /*edit_text*/, - blender::FunctionRef visit_fn) +void ANIM_keyingset_visit_for_search(const bContext *C, + PointerRNA * /*ptr*/, + PropertyRNA * /*prop*/, + const char * /*edit_text*/, + StringPropertySearchVisitFunc visit_fn, + void *visit_user_data) { - anim_keyingset_visit_for_search_impl(C, visit_fn, false); + anim_keyingset_visit_for_search_impl(C, visit_fn, visit_user_data, false); } -void ANIM_keyingset_visit_for_search_no_poll( - const bContext *C, - PointerRNA * /*ptr*/, - PropertyRNA * /*prop*/, - const char * /*edit_text*/, - blender::FunctionRef visit_fn) +void ANIM_keyingset_visit_for_search_no_poll(const bContext *C, + PointerRNA * /*ptr*/, + PropertyRNA * /*prop*/, + const char * /*edit_text*/, + StringPropertySearchVisitFunc visit_fn, + void *visit_user_data) { - anim_keyingset_visit_for_search_impl(C, visit_fn, true); + anim_keyingset_visit_for_search_impl(C, visit_fn, visit_user_data, true); } /* Menu of All Keying Sets ----------------------------- */ diff --git a/source/blender/editors/animation/time_scrub_ui.cc b/source/blender/editors/animation/time_scrub_ui.cc index 9e78feda81a..bffcd738167 100644 --- a/source/blender/editors/animation/time_scrub_ui.cc +++ b/source/blender/editors/animation/time_scrub_ui.cc @@ -7,7 +7,7 @@ */ #include "BKE_context.hh" -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "GPU_immediate.h" #include "GPU_matrix.h" @@ -132,11 +132,11 @@ static void draw_current_frame(const Scene *scene, uchar text_color[4]; UI_GetThemeColor4ubv(TH_HEADER_TEXT_HI, text_color); - - const int y = BLI_rcti_cent_y(scrub_region_rect) - int((fstyle->points * UI_SCALE_FAC * 0.35f)); - - UI_fontstyle_draw_simple( - +fstyle, frame_x - text_width / 2 + U.pixelsize / 2, y, frame_str, text_color); + UI_fontstyle_draw_simple(fstyle, + frame_x - text_width / 2 + U.pixelsize / 2, + get_centered_text_y(scrub_region_rect), + frame_str, + text_color); } void ED_time_scrub_draw_current_frame(const ARegion *region, diff --git a/source/blender/editors/armature/armature_add.cc b/source/blender/editors/armature/armature_add.cc index 1da2697e246..a5041effe01 100644 --- a/source/blender/editors/armature/armature_add.cc +++ b/source/blender/editors/armature/armature_add.cc @@ -22,17 +22,19 @@ #include "BLI_math_vector.h" #include "BLI_string_utils.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_action.h" #include "BKE_armature.hh" #include "BKE_constraint.h" #include "BKE_context.hh" -#include "BKE_fcurve.hh" +#include "BKE_deform.hh" +#include "BKE_fcurve.h" #include "BKE_idprop.h" #include "BKE_layer.hh" #include "BKE_lib_id.hh" -#include "BKE_object_types.hh" +#include "BKE_library.hh" +#include "BKE_main.hh" #include "RNA_access.hh" #include "RNA_define.hh" @@ -197,13 +199,13 @@ static int armature_click_extrude_exec(bContext *C, wmOperator * /*op*/) const View3DCursor *curs = &scene->cursor; copy_v3_v3(newbone->tail, curs->location); - sub_v3_v3v3(newbone->tail, newbone->tail, obedit->object_to_world().location()); + sub_v3_v3v3(newbone->tail, newbone->tail, obedit->object_to_world[3]); if (a == 1) { newbone->tail[0] = -newbone->tail[0]; } - copy_m3_m4(mat, obedit->object_to_world().ptr()); + copy_m3_m4(mat, obedit->object_to_world); invert_m3_m3(imat, mat); mul_m3_v3(imat, newbone->tail); @@ -1639,8 +1641,8 @@ static int armature_bone_primitive_add_exec(bContext *C, wmOperator *op) copy_v3_v3(curs, CTX_data_scene(C)->cursor.location); /* Get inverse point for head and orientation for tail */ - invert_m4_m4(obedit->runtime->world_to_object.ptr(), obedit->object_to_world().ptr()); - mul_m4_v3(obedit->world_to_object().ptr(), curs); + invert_m4_m4(obedit->world_to_object, obedit->object_to_world); + mul_m4_v3(obedit->world_to_object, curs); if (rv3d && (U.flag & USER_ADD_VIEWALIGNED)) { copy_m3_m4(obmat, rv3d->viewmat); @@ -1649,7 +1651,7 @@ static int armature_bone_primitive_add_exec(bContext *C, wmOperator *op) unit_m3(obmat); } - copy_m3_m4(viewmat, obedit->object_to_world().ptr()); + copy_m3_m4(viewmat, obedit->object_to_world); mul_m3_m3m3(totmat, obmat, viewmat); invert_m3_m3(imat, totmat); diff --git a/source/blender/editors/armature/armature_edit.cc b/source/blender/editors/armature/armature_edit.cc index 1469f09a8fc..984f47d171f 100644 --- a/source/blender/editors/armature/armature_edit.cc +++ b/source/blender/editors/armature/armature_edit.cc @@ -14,7 +14,7 @@ #include "MEM_guardedalloc.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BLI_blenlib.h" #include "BLI_ghash.h" @@ -26,18 +26,15 @@ #include "BKE_armature.hh" #include "BKE_constraint.h" #include "BKE_context.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_layer.hh" #include "BKE_main.hh" #include "BKE_object.hh" -#include "BKE_object_types.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "RNA_access.hh" #include "RNA_define.hh" -#include "UI_interface_icons.hh" - #include "WM_api.hh" #include "WM_types.hh" @@ -121,8 +118,8 @@ void ED_armature_origin_set( /* Find the center-point. */ if (centermode == 2) { copy_v3_v3(cent, cursor); - invert_m4_m4(ob->runtime->world_to_object.ptr(), ob->object_to_world().ptr()); - mul_m4_v3(ob->world_to_object().ptr(), cent); + invert_m4_m4(ob->world_to_object, ob->object_to_world); + mul_m4_v3(ob->world_to_object, cent); } else { if (around == V3D_AROUND_CENTER_BOUNDS) { @@ -162,7 +159,7 @@ void ED_armature_origin_set( /* Adjust object location for new center-point. */ if (centermode && (is_editmode == false)) { - mul_mat3_m4_v3(ob->object_to_world().ptr(), cent); /* omit translation part */ + mul_mat3_m4_v3(ob->object_to_world, cent); /* omit translation part */ add_v3_v3(ob->loc, cent); } } @@ -288,16 +285,16 @@ static int armature_calc_roll_exec(bContext *C, wmOperator *op) axis_flip = true; } - copy_m3_m4(imat, ob->object_to_world().ptr()); + copy_m3_m4(imat, ob->object_to_world); invert_m3(imat); if (type == CALC_ROLL_CURSOR) { /* Cursor */ float cursor_local[3]; const View3DCursor *cursor = &scene->cursor; - invert_m4_m4(ob->runtime->world_to_object.ptr(), ob->object_to_world().ptr()); + invert_m4_m4(ob->world_to_object, ob->object_to_world); copy_v3_v3(cursor_local, cursor->location); - mul_m4_v3(ob->world_to_object().ptr(), cursor_local); + mul_m4_v3(ob->world_to_object, cursor_local); /* cursor */ LISTBASE_FOREACH (EditBone *, ebone, arm->edbo) { @@ -733,8 +730,8 @@ static int armature_fill_bones_exec(bContext *C, wmOperator *op) ebp = static_cast(points.first); /* Get points - cursor (tail) */ - invert_m4_m4(obedit->runtime->world_to_object.ptr(), obedit->object_to_world().ptr()); - mul_v3_m4v3(curs, obedit->world_to_object().ptr(), scene->cursor.location); + invert_m4_m4(obedit->world_to_object, obedit->object_to_world); + mul_v3_m4v3(curs, obedit->world_to_object, scene->cursor.location); /* Create a bone */ newbone = add_points_bone(obedit, ebp->vec, curs); @@ -771,8 +768,8 @@ static int armature_fill_bones_exec(bContext *C, wmOperator *op) float dist_sq_a, dist_sq_b; /* get cursor location */ - invert_m4_m4(obedit->runtime->world_to_object.ptr(), obedit->object_to_world().ptr()); - mul_v3_m4v3(curs, obedit->world_to_object().ptr(), scene->cursor.location); + invert_m4_m4(obedit->world_to_object, obedit->object_to_world); + mul_v3_m4v3(curs, obedit->world_to_object, scene->cursor.location); /* get distances */ dist_sq_a = len_squared_v3v3(ebp_a->vec, curs); @@ -843,7 +840,7 @@ static int armature_fill_bones_exec(bContext *C, wmOperator *op) /* updates */ WM_event_add_notifier(C, NC_OBJECT | ND_POSE, obedit); - DEG_id_tag_update(&arm->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&arm->id, ID_RECALC_COPY_ON_WRITE); /* free points */ BLI_freelistN(&points); @@ -1265,20 +1262,6 @@ static int armature_delete_selected_exec(bContext *C, wmOperator * /*op*/) return OPERATOR_FINISHED; } -static int armature_delete_selected_invoke(bContext *C, wmOperator *op, const wmEvent * /*event*/) -{ - if (RNA_boolean_get(op->ptr, "confirm")) { - return WM_operator_confirm_ex(C, - op, - IFACE_("Delete selected bones?"), - nullptr, - IFACE_("Delete"), - ALERT_ICON_NONE, - false); - } - return armature_delete_selected_exec(C, op); -} - void ARMATURE_OT_delete(wmOperatorType *ot) { /* identifiers */ @@ -1287,7 +1270,7 @@ void ARMATURE_OT_delete(wmOperatorType *ot) ot->description = "Remove selected bones from the armature"; /* api callbacks */ - ot->invoke = armature_delete_selected_invoke; + ot->invoke = WM_operator_confirm_or_exec; ot->exec = armature_delete_selected_exec; ot->poll = ED_operator_editarmature; diff --git a/source/blender/editors/armature/armature_naming.cc b/source/blender/editors/armature/armature_naming.cc index 7c4f77944c8..6ff758f7add 100644 --- a/source/blender/editors/armature/armature_naming.cc +++ b/source/blender/editors/armature/armature_naming.cc @@ -25,7 +25,7 @@ #include "BLI_string_utils.hh" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_action.h" #include "BKE_animsys.h" @@ -33,7 +33,7 @@ #include "BKE_constraint.h" #include "BKE_context.hh" #include "BKE_deform.hh" -#include "BKE_grease_pencil.hh" +#include "BKE_gpencil_modifier_legacy.h" #include "BKE_layer.hh" #include "BKE_main.hh" #include "BKE_modifier.hh" @@ -186,8 +186,8 @@ void ED_armature_bone_rename(Main *bmain, } } - /* force evaluation copy to update database */ - DEG_id_tag_update(&arm->id, ID_RECALC_SYNC_TO_EVAL); + /* force copy on write to update database */ + DEG_id_tag_update(&arm->id, ID_RECALC_COPY_ON_WRITE); /* do entire dbase - objects */ for (ob = static_cast(bmain->objects.first); ob; @@ -292,7 +292,7 @@ void ED_armature_bone_rename(Main *bmain, if ((cam->dof.focus_object != nullptr) && (cam->dof.focus_object->data == arm)) { if (STREQ(cam->dof.focus_subtarget, oldname)) { STRNCPY(cam->dof.focus_subtarget, newname); - DEG_id_tag_update(&cam->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&cam->id, ID_RECALC_COPY_ON_WRITE); } } } @@ -336,23 +336,7 @@ void ED_armature_bone_rename(Main *bmain, } } } - - if (ob->type == OB_GREASE_PENCIL) { - using namespace blender; - GreasePencil &grease_pencil = *static_cast(ob->data); - for (bke::greasepencil::Layer *layer : grease_pencil.layers_for_write()) { - Object *parent = layer->parent; - if (parent == nullptr) { - continue; - } - StringRefNull bone_name = layer->parent_bone_name(); - if (!bone_name.is_empty() && bone_name == StringRef(oldname)) { - layer->set_parent_bone_name(newname); - } - } - } - - DEG_id_tag_update(&ob->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&ob->id, ID_RECALC_COPY_ON_WRITE); } /* Fix all animdata that may refer to this bone - diff --git a/source/blender/editors/armature/armature_relations.cc b/source/blender/editors/armature/armature_relations.cc index 409fa009c28..86b98d54802 100644 --- a/source/blender/editors/armature/armature_relations.cc +++ b/source/blender/editors/armature/armature_relations.cc @@ -21,10 +21,10 @@ #include "BLI_math_matrix.h" #include "BLI_math_vector.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_action.h" -#include "BKE_anim_data.hh" +#include "BKE_anim_data.h" #include "BKE_animsys.h" #include "BKE_armature.hh" #include "BKE_constraint.h" @@ -33,7 +33,7 @@ #include "BKE_idprop.h" #include "BKE_layer.hh" #include "BKE_main.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "DEG_depsgraph.hh" #include "DEG_depsgraph_build.hh" @@ -104,13 +104,13 @@ static void joined_armature_fix_links_constraints(Main *bmain, BKE_action_fix_paths_rename( &tarArm->id, data->act, "pose.bones[", pchan->name, curbone->name, 0, 0, false); - DEG_id_tag_update_ex(bmain, &data->act->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update_ex(bmain, &data->act->id, ID_RECALC_COPY_ON_WRITE); } } } if (changed) { - DEG_id_tag_update_ex(bmain, &ob->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update_ex(bmain, &ob->id, ID_RECALC_COPY_ON_WRITE); } } @@ -212,7 +212,7 @@ static void joined_armature_fix_animdata_cb(ID *id, FCurve *fcu, void *user_data } if (changed) { - DEG_id_tag_update_ex(afd->bmain, id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update_ex(afd->bmain, id, ID_RECALC_COPY_ON_WRITE); } } @@ -255,7 +255,7 @@ static void joined_armature_fix_links( /* make tar armature be new parent */ ob->parent = tarArm; - DEG_id_tag_update_ex(bmain, &ob->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update_ex(bmain, &ob->id, ID_RECALC_COPY_ON_WRITE); } } } @@ -340,7 +340,7 @@ int ED_armature_join_objects_exec(bContext *C, wmOperator *op) /* Inverse transform for all selected armatures in this object, * See #object_join_exec for detailed comment on why the safe version is used. */ - invert_m4_m4_safe_ortho(oimat, ob_active->object_to_world().ptr()); + invert_m4_m4_safe_ortho(oimat, ob_active->object_to_world); /* Index bone collections by name. This is also used later to keep track * of collections added from other armatures. */ @@ -391,7 +391,7 @@ int ED_armature_join_objects_exec(bContext *C, wmOperator *op) // BASACT->flag &= ~OB_MODE_POSE; /* Find the difference matrix */ - mul_m4_m4m4(mat, oimat, ob_iter->object_to_world().ptr()); + mul_m4_m4m4(mat, oimat, ob_iter->object_to_world); /* Copy bones and posechannels from the object to the edit armature */ for (pchan = static_cast(opose->chanbase.first); pchan; pchan = pchann) { @@ -774,20 +774,6 @@ static int separate_armature_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } -static int separate_armature_invoke(bContext *C, wmOperator *op, const wmEvent * /*event*/) -{ - if (RNA_boolean_get(op->ptr, "confirm")) { - return WM_operator_confirm_ex(C, - op, - IFACE_("Move selected bones to a separate armature?"), - nullptr, - IFACE_("Separate"), - ALERT_ICON_NONE, - false); - } - return separate_armature_exec(C, op); -} - void ARMATURE_OT_separate(wmOperatorType *ot) { /* identifiers */ @@ -796,7 +782,7 @@ void ARMATURE_OT_separate(wmOperatorType *ot) ot->description = "Isolate selected bones into a separate armature"; /* callbacks */ - ot->invoke = separate_armature_invoke; + ot->invoke = WM_operator_confirm_or_exec; ot->exec = separate_armature_exec; ot->poll = ED_operator_editarmature; diff --git a/source/blender/editors/armature/armature_select.cc b/source/blender/editors/armature/armature_select.cc index 760717def30..c9f7a40d4b6 100644 --- a/source/blender/editors/armature/armature_select.cc +++ b/source/blender/editors/armature/armature_select.cc @@ -25,7 +25,7 @@ #include "BKE_layer.hh" #include "BKE_object.hh" #include "BKE_object_types.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "RNA_access.hh" #include "RNA_define.hh" @@ -473,7 +473,7 @@ static bool armature_select_linked_impl(Object *ob, const bool select, const boo if (changed) { ED_armature_edit_sync_selection(arm->edbo); - DEG_id_tag_update(&arm->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&arm->id, ID_RECALC_COPY_ON_WRITE); WM_main_add_notifier(NC_GPENCIL | ND_DATA | NA_EDITED, ob); } @@ -1096,7 +1096,7 @@ bool ED_armature_edit_select_pick_bone( } WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, basact->object); - DEG_id_tag_update(&arm->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&arm->id, ID_RECALC_COPY_ON_WRITE); changed = true; } @@ -1485,7 +1485,7 @@ static int armature_de_select_more_exec(bContext *C, wmOperator * /*op*/) for (Object *ob : objects) { armature_select_more_less(ob, true); WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, ob); - DEG_id_tag_update(&ob->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&ob->id, ID_RECALC_COPY_ON_WRITE); } ED_outliner_select_sync_from_edit_bone_tag(C); @@ -1522,7 +1522,7 @@ static int armature_de_select_less_exec(bContext *C, wmOperator * /*op*/) for (Object *ob : objects) { armature_select_more_less(ob, false); WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, ob); - DEG_id_tag_update(&ob->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&ob->id, ID_RECALC_COPY_ON_WRITE); } ED_outliner_select_sync_from_edit_bone_tag(C); @@ -1580,8 +1580,8 @@ static const EnumPropertyItem prop_similar_types[] = { static float bone_length_squared_worldspace_get(Object *ob, EditBone *ebone) { float v1[3], v2[3]; - mul_v3_mat3_m4v3(v1, ob->object_to_world().ptr(), ebone->head); - mul_v3_mat3_m4v3(v2, ob->object_to_world().ptr(), ebone->tail); + mul_v3_mat3_m4v3(v1, ob->object_to_world, ebone->head); + mul_v3_mat3_m4v3(v2, ob->object_to_world, ebone->tail); return len_squared_v3v3(v1, v2); } @@ -1615,7 +1615,7 @@ static void select_similar_length(bContext *C, const float thresh) if (changed) { WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, ob); - DEG_id_tag_update(&ob->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&ob->id, ID_RECALC_COPY_ON_WRITE); } } } @@ -1626,8 +1626,8 @@ static void bone_direction_worldspace_get(Object *ob, EditBone *ebone, float *r_ copy_v3_v3(v1, ebone->head); copy_v3_v3(v2, ebone->tail); - mul_m4_v3(ob->object_to_world().ptr(), v1); - mul_m4_v3(ob->object_to_world().ptr(), v2); + mul_m4_v3(ob->object_to_world, v1); + mul_m4_v3(ob->object_to_world, v2); sub_v3_v3v3(r_dir, v1, v2); normalize_v3(r_dir); @@ -1663,8 +1663,8 @@ static void select_similar_direction(bContext *C, const float thresh) if (changed) { WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, ob); - DEG_id_tag_update(&ob->id, ID_RECALC_SYNC_TO_EVAL); - DEG_id_tag_update(&ob->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&ob->id, ID_RECALC_COPY_ON_WRITE); + DEG_id_tag_update(&ob->id, ID_RECALC_COPY_ON_WRITE); } } } @@ -1705,7 +1705,7 @@ static void select_similar_bone_collection(bContext *C) if (changed) { WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, ob); - DEG_id_tag_update(&ob->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&ob->id, ID_RECALC_COPY_ON_WRITE); } } } @@ -1739,7 +1739,7 @@ static void select_similar_bone_color(bContext *C) if (changed) { WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, ob); - DEG_id_tag_update(&ob->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&ob->id, ID_RECALC_COPY_ON_WRITE); } } } @@ -1779,7 +1779,7 @@ static void select_similar_prefix(bContext *C) if (changed) { WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, ob); - DEG_id_tag_update(&ob->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&ob->id, ID_RECALC_COPY_ON_WRITE); } } } @@ -1819,7 +1819,7 @@ static void select_similar_suffix(bContext *C) if (changed) { WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, ob); - DEG_id_tag_update(&ob->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&ob->id, ID_RECALC_COPY_ON_WRITE); } } } @@ -1853,7 +1853,7 @@ static void select_similar_data_pchan(bContext *C, const size_t bytes_size, cons } WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, obedit); - DEG_id_tag_update(&obedit->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&obedit->id, ID_RECALC_COPY_ON_WRITE); } static void is_ancestor(EditBone *bone, EditBone *ancestor) @@ -1888,7 +1888,7 @@ static void select_similar_children(bContext *C) } WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, obedit); - DEG_id_tag_update(&obedit->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&obedit->id, ID_RECALC_COPY_ON_WRITE); } static void select_similar_children_immediate(bContext *C) @@ -1904,7 +1904,7 @@ static void select_similar_children_immediate(bContext *C) } WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, obedit); - DEG_id_tag_update(&obedit->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&obedit->id, ID_RECALC_COPY_ON_WRITE); } static void select_similar_siblings(bContext *C) @@ -1924,7 +1924,7 @@ static void select_similar_siblings(bContext *C) } WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, obedit); - DEG_id_tag_update(&obedit->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&obedit->id, ID_RECALC_COPY_ON_WRITE); } static int armature_select_similar_exec(bContext *C, wmOperator *op) @@ -2082,7 +2082,7 @@ static int armature_select_hierarchy_exec(bContext *C, wmOperator *op) ED_armature_edit_sync_selection(arm->edbo); WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, ob); - DEG_id_tag_update(&ob->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&ob->id, ID_RECALC_COPY_ON_WRITE); return OPERATOR_FINISHED; } @@ -2174,7 +2174,7 @@ static int armature_select_mirror_exec(bContext *C, wmOperator *op) ED_armature_edit_sync_selection(arm->edbo); WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, ob); - DEG_id_tag_update(&ob->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&ob->id, ID_RECALC_COPY_ON_WRITE); } return OPERATOR_FINISHED; @@ -2307,7 +2307,7 @@ static int armature_shortest_path_pick_invoke(bContext *C, wmOperator *op, const ED_outliner_select_sync_from_edit_bone_tag(C); ED_armature_edit_sync_selection(arm->edbo); WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, obedit); - DEG_id_tag_update(&obedit->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&obedit->id, ID_RECALC_COPY_ON_WRITE); return OPERATOR_FINISHED; } diff --git a/source/blender/editors/armature/armature_skinning.cc b/source/blender/editors/armature/armature_skinning.cc index 348460813a4..de2b825022b 100644 --- a/source/blender/editors/armature/armature_skinning.cc +++ b/source/blender/editors/armature/armature_skinning.cc @@ -10,7 +10,9 @@ #include "DNA_armature_types.h" #include "DNA_mesh_types.h" +#include "DNA_meshdata_types.h" #include "DNA_object_types.h" +#include "DNA_scene_types.h" #include "MEM_guardedalloc.h" @@ -22,11 +24,13 @@ #include "BKE_armature.hh" #include "BKE_attribute.hh" #include "BKE_deform.hh" +#include "BKE_mesh.hh" #include "BKE_mesh_iterators.hh" +#include "BKE_mesh_runtime.hh" #include "BKE_modifier.hh" #include "BKE_object.hh" #include "BKE_object_deform.h" -#include "BKE_report.hh" +#include "BKE_report.h" #include "BKE_subsurf.hh" #include "DEG_depsgraph.hh" @@ -376,8 +380,8 @@ static void add_verts_to_dgroups(ReportList *reports, copy_v3_v3(tip[j], bone->arm_tail); } - mul_m4_v3(par->object_to_world().ptr(), root[j]); - mul_m4_v3(par->object_to_world().ptr(), tip[j]); + mul_m4_v3(par->object_to_world, root[j]); + mul_m4_v3(par->object_to_world, tip[j]); /* set selected */ if (wpmode) { @@ -406,9 +410,9 @@ static void add_verts_to_dgroups(ReportList *reports, if (wpmode) { /* if in weight paint mode, use final verts from evaluated mesh */ const Object *ob_eval = DEG_get_evaluated_object(depsgraph, ob); - const Mesh *mesh_eval = BKE_object_get_evaluated_mesh(ob_eval); - if (mesh_eval) { - BKE_mesh_foreach_mapped_vert_coords_get(mesh_eval, verts, mesh->verts_num); + const Mesh *me_eval = BKE_object_get_evaluated_mesh(ob_eval); + if (me_eval) { + BKE_mesh_foreach_mapped_vert_coords_get(me_eval, verts, mesh->verts_num); vertsfilled = 1; } } @@ -426,7 +430,7 @@ static void add_verts_to_dgroups(ReportList *reports, if (!vertsfilled) { copy_v3_v3(verts[i], positions[i]); } - mul_m4_v3(ob->object_to_world().ptr(), verts[i]); + mul_m4_v3(ob->object_to_world, verts[i]); } /* compute the weights based on gathered vertices and bones */ @@ -450,7 +454,7 @@ static void add_verts_to_dgroups(ReportList *reports, root, tip, selected, - mat4_to_scale(par->object_to_world().ptr())); + mat4_to_scale(par->object_to_world)); } /* only generated in some cases but can call anyway */ diff --git a/source/blender/editors/armature/armature_utils.cc b/source/blender/editors/armature/armature_utils.cc index a6722e092aa..9e52097e3e9 100644 --- a/source/blender/editors/armature/armature_utils.cc +++ b/source/blender/editors/armature/armature_utils.cc @@ -17,7 +17,9 @@ #include "BLI_string_utils.hh" #include "BKE_armature.hh" -#include "BKE_global.hh" +#include "BKE_context.hh" +#include "BKE_deform.hh" +#include "BKE_global.h" #include "BKE_idprop.h" #include "BKE_lib_id.hh" #include "BKE_main.hh" @@ -25,6 +27,7 @@ #include "DEG_depsgraph.hh" #include "ED_armature.hh" +#include "ED_util.hh" #include "ANIM_bone_collections.hh" diff --git a/source/blender/editors/armature/bone_collections.cc b/source/blender/editors/armature/bone_collections.cc index 761eca63af3..41a7407d388 100644 --- a/source/blender/editors/armature/bone_collections.cc +++ b/source/blender/editors/armature/bone_collections.cc @@ -9,6 +9,8 @@ #include +#include "BLI_string.h" + #include "ANIM_bone_collections.hh" #include "DNA_ID.h" @@ -16,15 +18,17 @@ #include "BKE_action.h" #include "BKE_context.hh" +#include "BKE_layer.hh" #include "BKE_lib_override.hh" -#include "BKE_report.hh" +#include "BKE_report.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DEG_depsgraph.hh" #include "RNA_access.hh" #include "RNA_define.hh" +#include "RNA_enum_types.hh" #include "WM_api.hh" #include "WM_types.hh" @@ -32,6 +36,7 @@ #include "ED_armature.hh" #include "ED_object.hh" #include "ED_outliner.hh" +#include "ED_screen.hh" #include "UI_interface.hh" #include "UI_resources.hh" @@ -301,7 +306,7 @@ static void bone_collection_assign_editbones(bContext *C, ED_armature_edit_sync_selection(arm->edbo); WM_event_add_notifier(C, NC_OBJECT | ND_BONE_COLLECTION, ob); - DEG_id_tag_update(&ob->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&ob->id, ID_RECALC_COPY_ON_WRITE); } /** @@ -380,7 +385,7 @@ static bool bone_collection_assign_named_mode_specific(bContext *C, ED_armature_edit_sync_selection(arm->edbo); WM_event_add_notifier(C, NC_OBJECT | ND_BONE_COLLECTION, ob); - DEG_id_tag_update(&ob->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&ob->id, ID_RECALC_COPY_ON_WRITE); return true; } @@ -1166,9 +1171,8 @@ static int move_to_collection_regular_invoke(bContext *C, wmOperator *op) static int move_to_new_collection_invoke(bContext *C, wmOperator *op) { - RNA_string_set(op->ptr, "new_collection_name", IFACE_("Bones")); return WM_operator_props_dialog_popup( - C, op, 200, IFACE_("Move to New Bone Collection"), IFACE_("Move")); + C, op, 200, IFACE_("Move to New Collection"), IFACE_("Move")); } static int move_to_collection_invoke(bContext *C, wmOperator *op, const wmEvent * /*event*/) diff --git a/source/blender/editors/armature/meshlaplacian.cc b/source/blender/editors/armature/meshlaplacian.cc index cfb777e833d..11368cff1ea 100644 --- a/source/blender/editors/armature/meshlaplacian.cc +++ b/source/blender/editors/armature/meshlaplacian.cc @@ -10,7 +10,9 @@ #include "MEM_guardedalloc.h" #include "DNA_mesh_types.h" +#include "DNA_meshdata_types.h" #include "DNA_object_types.h" +#include "DNA_scene_types.h" #include "BLI_map.hh" #include "BLI_math_geom.h" @@ -21,17 +23,20 @@ #include "BLI_ordered_edge.hh" #include "BLI_string.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_attribute.hh" #include "BKE_bvhutils.hh" #include "BKE_mesh.hh" +#include "BKE_mesh_runtime.hh" #include "BKE_mesh_wrapper.hh" #include "BKE_modifier.hh" #include "ED_armature.hh" #include "ED_mesh.hh" +#include "DEG_depsgraph.hh" + #include "eigen_capi.h" #include "meshlaplacian.h" @@ -1795,11 +1800,11 @@ void ED_mesh_deform_bind_callback(Object *object, mmd_orig->bindcagecos = (float *)mdb.cagecos; mmd_orig->verts_num = mdb.verts_num; mmd_orig->cage_verts_num = mdb.cage_verts_num; - copy_m4_m4(mmd_orig->bindmat, mmd_orig->object->object_to_world().ptr()); + copy_m4_m4(mmd_orig->bindmat, mmd_orig->object->object_to_world); /* transform bindcagecos to world space */ for (a = 0; a < mdb.cage_verts_num; a++) { - mul_m4_v3(mmd_orig->object->object_to_world().ptr(), mmd_orig->bindcagecos + a * 3); + mul_m4_v3(mmd_orig->object->object_to_world, mmd_orig->bindcagecos + a * 3); } /* free */ diff --git a/source/blender/editors/armature/pose_edit.cc b/source/blender/editors/armature/pose_edit.cc index 4275b488c6e..b65e95c1edd 100644 --- a/source/blender/editors/armature/pose_edit.cc +++ b/source/blender/editors/armature/pose_edit.cc @@ -12,22 +12,28 @@ #include "BLI_blenlib.h" #include "BLI_math_vector.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_anim_types.h" #include "DNA_armature_types.h" #include "DNA_object_types.h" #include "DNA_scene_types.h" +#include "BKE_action.h" #include "BKE_anim_visualization.h" #include "BKE_armature.hh" #include "BKE_context.hh" +#include "BKE_deform.hh" +#include "BKE_global.h" #include "BKE_layer.hh" #include "BKE_lib_id.hh" +#include "BKE_main.hh" #include "BKE_object.hh" -#include "BKE_report.hh" +#include "BKE_report.h" +#include "BKE_scene.h" #include "DEG_depsgraph.hh" +#include "DEG_depsgraph_query.hh" #include "RNA_access.hh" #include "RNA_define.hh" @@ -42,14 +48,18 @@ #include "ED_keyframing.hh" #include "ED_object.hh" #include "ED_screen.hh" +#include "ED_view3d.hh" #include "ANIM_bone_collections.hh" #include "ANIM_keyframing.hh" +#include "UI_interface.hh" + #include "armature_intern.hh" #undef DEBUG_TIME +#include "BLI_time.h" #ifdef DEBUG_TIME # include "BLI_time_utildefines.h" #endif @@ -84,8 +94,8 @@ bool ED_object_posemode_enter_ex(Main *bmain, Object *ob) case OB_ARMATURE: ob->restore_mode = ob->mode; ob->mode |= OB_MODE_POSE; - /* Inform all evaluated versions that we changed the mode. */ - DEG_id_tag_update_ex(bmain, &ob->id, ID_RECALC_SYNC_TO_EVAL); + /* Inform all CoW versions that we changed the mode. */ + DEG_id_tag_update_ex(bmain, &ob->id, ID_RECALC_COPY_ON_WRITE); ok = true; break; @@ -117,8 +127,8 @@ bool ED_object_posemode_exit_ex(Main *bmain, Object *ob) ob->restore_mode = ob->mode; ob->mode &= ~OB_MODE_POSE; - /* Inform all evaluated versions that we changed the mode. */ - DEG_id_tag_update_ex(bmain, &ob->id, ID_RECALC_SYNC_TO_EVAL); + /* Inform all CoW versions that we changed the mode. */ + DEG_id_tag_update_ex(bmain, &ob->id, ID_RECALC_COPY_ON_WRITE); ok = true; } return ok; @@ -195,9 +205,9 @@ void ED_pose_recalculate_paths(bContext *C, Scene *scene, Object *ob, ePosePathC BLI_freelistN(&targets); if (range != POSE_PATH_CALC_RANGE_CURRENT_FRAME) { - /* Tag armature object for copy-on-eval - so paths will draw/redraw. + /* Tag armature object for copy on write - so paths will draw/redraw. * For currently frame only we update evaluated object directly. */ - DEG_id_tag_update(&ob->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&ob->id, ID_RECALC_COPY_ON_WRITE); } /* Free temporary depsgraph. */ @@ -400,8 +410,8 @@ static void ED_pose_clear_paths(Object *ob, bool only_selected) ob->pose->avs.path_bakeflag &= ~MOTIONPATH_BAKE_HAS_PATHS; } - /* tag armature object for copy-on-eval - so removed paths don't still show */ - DEG_id_tag_update(&ob->id, ID_RECALC_SYNC_TO_EVAL); + /* tag armature object for copy on write - so removed paths don't still show */ + DEG_id_tag_update(&ob->id, ID_RECALC_COPY_ON_WRITE); } /* Operator callback - wrapper for the back-end function. */ @@ -474,7 +484,7 @@ static int pose_update_paths_range_exec(bContext *C, wmOperator * /*op*/) ob->pose->avs.path_ef = PEFRA; /* tag for updates */ - DEG_id_tag_update(&ob->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&ob->id, ID_RECALC_COPY_ON_WRITE); WM_event_add_notifier(C, NC_OBJECT | ND_POSE, ob); return OPERATOR_FINISHED; @@ -702,7 +712,7 @@ static int pose_hide_exec(bContext *C, wmOperator *op) if (changed) { changed_multi = true; WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, ob_iter); - DEG_id_tag_update(&arm->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&arm->id, ID_RECALC_COPY_ON_WRITE); } } @@ -764,7 +774,7 @@ static int pose_reveal_exec(bContext *C, wmOperator *op) if (changed) { changed_multi = true; WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, ob_iter); - DEG_id_tag_update(&arm->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&arm->id, ID_RECALC_COPY_ON_WRITE); } } diff --git a/source/blender/editors/armature/pose_lib_2.cc b/source/blender/editors/armature/pose_lib_2.cc index d8fc119a201..96d6dd5981c 100644 --- a/source/blender/editors/armature/pose_lib_2.cc +++ b/source/blender/editors/armature/pose_lib_2.cc @@ -15,19 +15,19 @@ #include "BLI_string.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_armature_types.h" #include "BKE_action.h" -#include "BKE_anim_data.hh" +#include "BKE_anim_data.h" #include "BKE_animsys.h" #include "BKE_armature.hh" #include "BKE_context.hh" #include "BKE_lib_id.hh" #include "BKE_object.hh" #include "BKE_pose_backup.h" -#include "BKE_report.hh" +#include "BKE_report.h" #include "DEG_depsgraph.hh" diff --git a/source/blender/editors/armature/pose_select.cc b/source/blender/editors/armature/pose_select.cc index fc65517824c..94cc576d72d 100644 --- a/source/blender/editors/armature/pose_select.cc +++ b/source/blender/editors/armature/pose_select.cc @@ -27,7 +27,7 @@ #include "BKE_layer.hh" #include "BKE_modifier.hh" #include "BKE_object.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "DEG_depsgraph.hh" @@ -247,8 +247,8 @@ bool ED_armature_pose_select_pick_bone(const Scene *scene, DEG_id_tag_update(&ob->id, ID_RECALC_GEOMETRY); } - /* Tag armature for copy-on-evaluation update (since act_bone is in armature not object). */ - DEG_id_tag_update(&arm->id, ID_RECALC_SYNC_TO_EVAL); + /* Tag armature for copy-on-write update (since act_bone is in armature not object). */ + DEG_id_tag_update(&arm->id, ID_RECALC_COPY_ON_WRITE); } changed = true; @@ -605,7 +605,7 @@ static int pose_de_select_all_exec(bContext *C, wmOperator *op) DEG_id_tag_update(&ob->id, ID_RECALC_GEOMETRY); } /* need to tag armature for cow updates, or else selection doesn't update */ - DEG_id_tag_update(&arm->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&arm->id, ID_RECALC_COPY_ON_WRITE); ob_prev = ob; } } @@ -1188,7 +1188,7 @@ static int pose_select_mirror_exec(bContext *C, wmOperator *op) WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, ob); /* Need to tag armature for cow updates, or else selection doesn't update. */ - DEG_id_tag_update(&arm->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&arm->id, ID_RECALC_COPY_ON_WRITE); } ED_outliner_select_sync_from_pose_bone_tag(C); diff --git a/source/blender/editors/armature/pose_slide.cc b/source/blender/editors/armature/pose_slide.cc index d356918a00a..d2c80ba0bef 100644 --- a/source/blender/editors/armature/pose_slide.cc +++ b/source/blender/editors/armature/pose_slide.cc @@ -32,9 +32,10 @@ #include "BLI_array.hh" #include "BLI_blenlib.h" +#include "BLI_dlrbTree.h" #include "BLI_math_rotation.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_anim_types.h" #include "DNA_armature_types.h" @@ -42,17 +43,20 @@ #include "DNA_scene_types.h" #include "DNA_vec_types.h" -#include "BKE_fcurve.hh" +#include "BKE_fcurve.h" #include "BKE_nla.h" #include "BKE_context.hh" #include "BKE_layer.hh" -#include "BKE_report.hh" -#include "BKE_scene.hh" +#include "BKE_object.hh" +#include "BKE_report.h" +#include "BKE_scene.h" +#include "BKE_screen.hh" #include "BKE_unit.hh" #include "RNA_access.hh" #include "RNA_define.hh" +#include "RNA_path.hh" #include "RNA_prototypes.h" #include "WM_api.hh" @@ -61,17 +65,26 @@ #include "UI_interface.hh" #include "UI_resources.hh" +#include "ED_armature.hh" #include "ED_keyframes_edit.hh" #include "ED_keyframes_keylist.hh" #include "ED_markers.hh" #include "ED_numinput.hh" #include "ED_screen.hh" +#include "ED_space_api.hh" #include "ED_util.hh" #include "ANIM_fcurve.hh" +#include "GPU_immediate.h" +#include "GPU_immediate_util.h" +#include "GPU_matrix.h" +#include "GPU_state.h" + #include "armature_intern.hh" +#include "BLF_api.hh" + using blender::Vector; /* Pixel distance from 0% to 100%. */ diff --git a/source/blender/editors/armature/pose_transform.cc b/source/blender/editors/armature/pose_transform.cc index a2b3fe8e4bd..fb1ad0f021e 100644 --- a/source/blender/editors/armature/pose_transform.cc +++ b/source/blender/editors/armature/pose_transform.cc @@ -26,11 +26,12 @@ #include "BKE_armature.hh" #include "BKE_blender_copybuffer.hh" #include "BKE_context.hh" +#include "BKE_deform.hh" #include "BKE_idprop.h" #include "BKE_layer.hh" #include "BKE_main.hh" #include "BKE_object.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "DEG_depsgraph.hh" #include "DEG_depsgraph_query.hh" @@ -45,6 +46,7 @@ #include "ED_armature.hh" #include "ED_keyframing.hh" #include "ED_screen.hh" +#include "ED_util.hh" #include "ANIM_bone_collections.hh" #include "ANIM_keyframing.hh" @@ -83,9 +85,10 @@ static void applyarmature_fix_boneparents(const bContext *C, Scene *scene, Objec * in this function. */ Depsgraph *depsgraph = CTX_data_depsgraph_pointer(C); Main *bmain = CTX_data_main(C); + Object workob, *ob; /* go through all objects in database */ - for (Object *ob = static_cast(bmain->objects.first); ob; + for (ob = static_cast(bmain->objects.first); ob; ob = static_cast(ob->id.next)) { /* if parent is bone in this armature, apply corrections */ @@ -93,9 +96,10 @@ static void applyarmature_fix_boneparents(const bContext *C, Scene *scene, Objec /* apply current transform from parent (not yet destroyed), * then calculate new parent inverse matrix */ - BKE_object_apply_mat4(ob, ob->object_to_world().ptr(), false, false); + BKE_object_apply_mat4(ob, ob->object_to_world, false, false); - invert_m4_m4(ob->parentinv, BKE_object_calc_parent(depsgraph, scene, ob).ptr()); + BKE_object_workob_calc_parent(depsgraph, scene, ob, &workob); + invert_m4_m4(ob->parentinv, workob.object_to_world); } } } @@ -460,7 +464,7 @@ static int apply_armature_pose2bones_exec(bContext *C, wmOperator *op) /* NOTE: notifier might evolve. */ WM_event_add_notifier(C, NC_OBJECT | ND_POSE, ob); - DEG_id_tag_update(&ob->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&ob->id, ID_RECALC_COPY_ON_WRITE); return OPERATOR_FINISHED; } diff --git a/source/blender/editors/armature/pose_utils.cc b/source/blender/editors/armature/pose_utils.cc index 8183bd37a7d..c4fe0d4c50e 100644 --- a/source/blender/editors/armature/pose_utils.cc +++ b/source/blender/editors/armature/pose_utils.cc @@ -15,9 +15,10 @@ #include "DNA_anim_types.h" #include "DNA_armature_types.h" #include "DNA_object_types.h" +#include "DNA_scene_types.h" #include "BKE_action.h" -#include "BKE_anim_data.hh" +#include "BKE_anim_data.h" #include "BKE_idprop.h" #include "BKE_layer.hh" #include "BKE_object.hh" diff --git a/source/blender/editors/asset/CMakeLists.txt b/source/blender/editors/asset/CMakeLists.txt index 1ad84a1c0d2..9c2809b2f76 100644 --- a/source/blender/editors/asset/CMakeLists.txt +++ b/source/blender/editors/asset/CMakeLists.txt @@ -26,6 +26,7 @@ set(SRC intern/asset_handle.cc intern/asset_import.cc intern/asset_indexer.cc + intern/asset_library_reference.cc intern/asset_library_reference_enum.cc intern/asset_list.cc intern/asset_mark_clear.cc diff --git a/source/blender/editors/asset/ED_asset_catalog.hh b/source/blender/editors/asset/ED_asset_catalog.hh index 97eb7dc6a5f..6a0312024ba 100644 --- a/source/blender/editors/asset/ED_asset_catalog.hh +++ b/source/blender/editors/asset/ED_asset_catalog.hh @@ -34,7 +34,7 @@ void catalogs_save_from_main_path(asset_system::AssetLibrary *library, const Mai * and as such ignores the per asset library #catalogs_read_only(). */ void catalogs_set_save_catalogs_when_file_is_saved(bool should_save); -bool catalogs_get_save_catalogs_when_file_is_saved(); +bool catalogs_get_save_catalogs_when_file_is_saved(void); /** * Returns if the catalogs of \a library are allowed to be editable, or if the UI should forbid diff --git a/source/blender/editors/asset/ED_asset_filter.hh b/source/blender/editors/asset/ED_asset_filter.hh index 1fc52703331..361ba1d6b67 100644 --- a/source/blender/editors/asset/ED_asset_filter.hh +++ b/source/blender/editors/asset/ED_asset_filter.hh @@ -17,6 +17,7 @@ #include "AS_asset_catalog_path.hh" #include "AS_asset_catalog_tree.hh" +struct AssetFilterSettings; struct AssetLibraryReference; struct bContext; @@ -27,13 +28,6 @@ class AssetRepresentation; namespace blender::ed::asset { -struct AssetFilterSettings { - /** Tags to match against. These are newly allocated, and compared against the - * #AssetMetaData.tags. */ - ListBase tags; /* AssetTag */ - uint64_t id_types; /* rna_enum_id_type_filter_items */ -}; - /** * Compare \a asset against the settings of \a filter. * diff --git a/source/blender/editors/asset/ED_asset_shelf.hh b/source/blender/editors/asset/ED_asset_shelf.hh index 5906efdf2ee..4287614b7cb 100644 --- a/source/blender/editors/asset/ED_asset_shelf.hh +++ b/source/blender/editors/asset/ED_asset_shelf.hh @@ -47,12 +47,12 @@ void region_layout(const bContext *C, ARegion *region); void region_draw(const bContext *C, ARegion *region); void region_blend_read_data(BlendDataReader *reader, ARegion *region); void region_blend_write(BlendWriter *writer, ARegion *region); -int region_prefsizey(); +int region_prefsizey(void); void header_region_init(wmWindowManager *wm, ARegion *region); void header_region(const bContext *C, ARegion *region); void header_region_listen(const wmRegionListenerParams *params); -int header_region_size(); +int header_region_size(void); void header_regiontype_register(ARegionType *region_type, const int space_type); /** \} */ diff --git a/source/blender/editors/asset/intern/asset_catalog.cc b/source/blender/editors/asset/intern/asset_catalog.cc index 5c2e932c627..0e1aae38920 100644 --- a/source/blender/editors/asset/intern/asset_catalog.cc +++ b/source/blender/editors/asset/intern/asset_catalog.cc @@ -28,8 +28,9 @@ using namespace blender::asset_system; bool catalogs_read_only(const AssetLibrary &library) { - const asset_system::AssetCatalogService &catalog_service = library.catalog_service(); - return catalog_service.is_read_only(); + asset_system::AssetCatalogService *catalog_service = AS_asset_library_get_catalog_service( + &library); + return catalog_service->is_read_only(); } struct CatalogUniqueNameFnData { @@ -61,20 +62,24 @@ asset_system::AssetCatalog *catalog_add(AssetLibrary *library, StringRefNull name, StringRef parent_path) { - asset_system::AssetCatalogService &catalog_service = library->catalog_service(); - if (catalog_service.is_read_only()) { + asset_system::AssetCatalogService *catalog_service = AS_asset_library_get_catalog_service( + library); + if (!catalog_service) { + return nullptr; + } + if (catalogs_read_only(*library)) { return nullptr; } - std::string unique_name = catalog_name_ensure_unique(catalog_service, name, parent_path); + std::string unique_name = catalog_name_ensure_unique(*catalog_service, name, parent_path); AssetCatalogPath fullpath = AssetCatalogPath(parent_path) / unique_name; - catalog_service.undo_push(); - asset_system::AssetCatalog *new_catalog = catalog_service.create_catalog(fullpath); + catalog_service->undo_push(); + asset_system::AssetCatalog *new_catalog = catalog_service->create_catalog(fullpath); if (!new_catalog) { return nullptr; } - catalog_service.tag_has_unsaved_changes(new_catalog); + catalog_service->tag_has_unsaved_changes(new_catalog); WM_main_add_notifier(NC_SPACE | ND_SPACE_ASSET_PARAMS, nullptr); return new_catalog; @@ -82,14 +87,19 @@ asset_system::AssetCatalog *catalog_add(AssetLibrary *library, void catalog_remove(AssetLibrary *library, const CatalogID &catalog_id) { - asset_system::AssetCatalogService &catalog_service = library->catalog_service(); - if (catalog_service.is_read_only()) { + asset_system::AssetCatalogService *catalog_service = AS_asset_library_get_catalog_service( + library); + if (!catalog_service) { + BLI_assert_unreachable(); + return; + } + if (catalogs_read_only(*library)) { return; } - catalog_service.undo_push(); - catalog_service.tag_has_unsaved_changes(nullptr); - catalog_service.prune_catalogs_by_id(catalog_id); + catalog_service->undo_push(); + catalog_service->tag_has_unsaved_changes(nullptr); + catalog_service->prune_catalogs_by_id(catalog_id); WM_main_add_notifier(NC_SPACE | ND_SPACE_ASSET_PARAMS, nullptr); } @@ -97,12 +107,17 @@ void catalog_rename(AssetLibrary *library, const CatalogID catalog_id, const StringRefNull new_name) { - asset_system::AssetCatalogService &catalog_service = library->catalog_service(); - if (catalog_service.is_read_only()) { + asset_system::AssetCatalogService *catalog_service = AS_asset_library_get_catalog_service( + library); + if (!catalog_service) { + BLI_assert_unreachable(); + return; + } + if (catalogs_read_only(*library)) { return; } - AssetCatalog *catalog = catalog_service.find_catalog(catalog_id); + AssetCatalog *catalog = catalog_service->find_catalog(catalog_id); const AssetCatalogPath new_path = catalog->path.parent() / StringRef(new_name); const AssetCatalogPath clean_new_path = new_path.cleanup(); @@ -112,9 +127,9 @@ void catalog_rename(AssetLibrary *library, return; } - catalog_service.undo_push(); - catalog_service.tag_has_unsaved_changes(catalog); - catalog_service.update_catalog_path(catalog_id, clean_new_path); + catalog_service->undo_push(); + catalog_service->tag_has_unsaved_changes(catalog); + catalog_service->update_catalog_path(catalog_id, clean_new_path); WM_main_add_notifier(NC_SPACE | ND_SPACE_ASSET_PARAMS, nullptr); } @@ -122,18 +137,23 @@ void catalog_move(AssetLibrary *library, const CatalogID src_catalog_id, const std::optional dst_parent_catalog_id) { - asset_system::AssetCatalogService &catalog_service = library->catalog_service(); - if (catalog_service.is_read_only()) { + asset_system::AssetCatalogService *catalog_service = AS_asset_library_get_catalog_service( + library); + if (!catalog_service) { + BLI_assert_unreachable(); + return; + } + if (catalogs_read_only(*library)) { return; } - AssetCatalog *src_catalog = catalog_service.find_catalog(src_catalog_id); + AssetCatalog *src_catalog = catalog_service->find_catalog(src_catalog_id); if (!src_catalog) { BLI_assert_unreachable(); return; } AssetCatalog *dst_catalog = dst_parent_catalog_id ? - catalog_service.find_catalog(*dst_parent_catalog_id) : + catalog_service->find_catalog(*dst_parent_catalog_id) : nullptr; if (!dst_catalog && dst_parent_catalog_id) { BLI_assert_unreachable(); @@ -141,7 +161,7 @@ void catalog_move(AssetLibrary *library, } std::string unique_name = catalog_name_ensure_unique( - catalog_service, src_catalog->path.name(), dst_catalog ? dst_catalog->path.c_str() : ""); + *catalog_service, src_catalog->path.name(), dst_catalog ? dst_catalog->path.c_str() : ""); /* If a destination catalog was given, construct the path using that. Otherwise, the path is just * the name of the catalog to be moved, which means it ends up at the root level. */ const AssetCatalogPath new_path = dst_catalog ? (dst_catalog->path / unique_name) : @@ -153,23 +173,28 @@ void catalog_move(AssetLibrary *library, return; } - catalog_service.undo_push(); - catalog_service.tag_has_unsaved_changes(src_catalog); - catalog_service.update_catalog_path(src_catalog_id, clean_new_path); + catalog_service->undo_push(); + catalog_service->tag_has_unsaved_changes(src_catalog); + catalog_service->update_catalog_path(src_catalog_id, clean_new_path); WM_main_add_notifier(NC_SPACE | ND_SPACE_ASSET_PARAMS, nullptr); } void catalogs_save_from_main_path(AssetLibrary *library, const Main *bmain) { - asset_system::AssetCatalogService &catalog_service = library->catalog_service(); - if (catalog_service.is_read_only()) { + asset_system::AssetCatalogService *catalog_service = AS_asset_library_get_catalog_service( + library); + if (!catalog_service) { + BLI_assert_unreachable(); + return; + } + if (catalogs_read_only(*library)) { return; } /* Since writing to disk also means loading any on-disk changes, it may be a good idea to store * an undo step. */ - catalog_service.undo_push(); - catalog_service.write_to_disk(bmain->filepath); + catalog_service->undo_push(); + catalog_service->write_to_disk(bmain->filepath); } void catalogs_set_save_catalogs_when_file_is_saved(const bool should_save) diff --git a/source/blender/editors/asset/intern/asset_filter.cc b/source/blender/editors/asset/intern/asset_filter.cc index 92450986c80..3cd1183680b 100644 --- a/source/blender/editors/asset/intern/asset_filter.cc +++ b/source/blender/editors/asset/intern/asset_filter.cc @@ -8,6 +8,7 @@ #include "AS_asset_representation.hh" +#include "BKE_asset.hh" #include "BKE_idtype.hh" #include "BLI_listbase.h" @@ -18,6 +19,8 @@ #include "AS_asset_library.hh" #include "ED_asset_filter.hh" +#include "ED_asset_handle.hh" +#include "ED_asset_library.hh" #include "ED_asset_list.hh" namespace blender::ed::asset { @@ -64,7 +67,7 @@ asset_system::AssetCatalogTree build_filtered_catalog_tree( return true; } - const asset_system::AssetCatalog *catalog = library.catalog_service().find_catalog( + const asset_system::AssetCatalog *catalog = library.catalog_service->find_catalog( meta_data.catalog_id); if (catalog == nullptr) { return true; @@ -75,13 +78,13 @@ asset_system::AssetCatalogTree build_filtered_catalog_tree( /* Build catalog tree. */ asset_system::AssetCatalogTree filtered_tree; - const asset_system::AssetCatalogTree &full_tree = library.catalog_service().catalog_tree(); - full_tree.foreach_item([&](const asset_system::AssetCatalogTreeItem &item) { + asset_system::AssetCatalogTree &full_tree = *library.catalog_service->get_catalog_tree(); + full_tree.foreach_item([&](asset_system::AssetCatalogTreeItem &item) { if (!known_paths.contains(item.catalog_path().str())) { return; } - asset_system::AssetCatalog *catalog = library.catalog_service().find_catalog( + asset_system::AssetCatalog *catalog = library.catalog_service->find_catalog( item.get_catalog_id()); if (catalog == nullptr) { return; @@ -122,7 +125,7 @@ AssetItemTree build_filtered_all_catalog_tree( return true; } - const asset_system::AssetCatalog *catalog = library->catalog_service().find_catalog( + const asset_system::AssetCatalog *catalog = library->catalog_service->find_catalog( meta_data.catalog_id); if (catalog == nullptr) { /* Also include assets with catalogs we're unable to find (e.g. the catalog was deleted) in @@ -135,12 +138,12 @@ AssetItemTree build_filtered_all_catalog_tree( }); asset_system::AssetCatalogTree catalogs_with_node_assets; - const asset_system::AssetCatalogTree &catalog_tree = library->catalog_service().catalog_tree(); - catalog_tree.foreach_item([&](const asset_system::AssetCatalogTreeItem &item) { + asset_system::AssetCatalogTree &catalog_tree = *library->catalog_service->get_catalog_tree(); + catalog_tree.foreach_item([&](asset_system::AssetCatalogTreeItem &item) { if (assets_per_path.lookup(item.catalog_path()).is_empty()) { return; } - asset_system::AssetCatalog *catalog = library->catalog_service().find_catalog( + asset_system::AssetCatalog *catalog = library->catalog_service->find_catalog( item.get_catalog_id()); if (catalog == nullptr) { return; diff --git a/source/blender/editors/asset/intern/asset_handle.cc b/source/blender/editors/asset/intern/asset_handle.cc index 32a030466f5..3b0e0a6a1d7 100644 --- a/source/blender/editors/asset/intern/asset_handle.cc +++ b/source/blender/editors/asset/intern/asset_handle.cc @@ -8,12 +8,20 @@ #include +#include "AS_asset_representation.hh" + +#include "BKE_blendfile.hh" + +#include "BLI_string.h" + #include "DNA_space_types.h" #include "DNA_space_types.h" #include "ED_fileselect.hh" +#include "RNA_prototypes.h" + #include "ED_asset_handle.hh" namespace blender::ed::asset { diff --git a/source/blender/editors/asset/intern/asset_import.cc b/source/blender/editors/asset/intern/asset_import.cc index 44802848222..25258c0cb6f 100644 --- a/source/blender/editors/asset/intern/asset_import.cc +++ b/source/blender/editors/asset/intern/asset_import.cc @@ -10,7 +10,7 @@ #include "DNA_space_types.h" -#include "BLO_readfile.hh" +#include "BLO_readfile.h" #include "WM_api.hh" diff --git a/source/blender/editors/asset/intern/asset_indexer.cc b/source/blender/editors/asset/intern/asset_indexer.cc index 664e86afdd4..117c5aa544d 100644 --- a/source/blender/editors/asset/intern/asset_indexer.cc +++ b/source/blender/editors/asset/intern/asset_indexer.cc @@ -98,12 +98,12 @@ class AbstractFile { bool exists() const { - return BLI_exists(this->get_file_path()); + return BLI_exists(get_file_path()); } size_t get_file_size() const { - return BLI_file_size(this->get_file_path()); + return BLI_file_size(get_file_path()); } }; @@ -125,7 +125,7 @@ class BlendFile : public AbstractFile { std::string get_filename() const { char filename[FILE_MAX]; - BLI_path_split_file_part(this->get_file_path(), filename, sizeof(filename)); + BLI_path_split_file_part(get_file_path(), filename, sizeof(filename)); return std::string(filename); } @@ -136,62 +136,233 @@ class BlendFile : public AbstractFile { }; /** - * \brief add id + name to the attributes. - * - * NOTE: id and name are encoded like #ID.name + * \brief Single entry inside a #AssetIndexFile for reading. */ -static void add_id_name(DictionaryValue &result, const short idcode, const StringRefNull name) -{ - char idcode_prefix[2]; - /* Similar to `BKE_libblock_alloc`. */ - *((short *)idcode_prefix) = idcode; - std::string name_with_idcode = std::string(idcode_prefix, sizeof(idcode_prefix)) + name; +struct AssetEntryReader { + private: + /** + * \brief Lookup table containing the elements of the entry. + */ + DictionaryValue::Lookup lookup; - result.append_str(ATTRIBUTE_ENTRIES_NAME, name_with_idcode); -} + StringRefNull get_name_with_idcode() const + { + return lookup.lookup(ATTRIBUTE_ENTRIES_NAME)->as_string_value()->value(); + } -static void init_value_from_file_indexer_entry(DictionaryValue &result, + public: + AssetEntryReader(const DictionaryValue &entry) : lookup(entry.create_lookup()) {} + + ID_Type get_idcode() const + { + const StringRefNull name_with_idcode = get_name_with_idcode(); + return GS(name_with_idcode.c_str()); + } + + StringRef get_name() const + { + const StringRefNull name_with_idcode = get_name_with_idcode(); + return name_with_idcode.substr(2); + } + + bool has_description() const + { + return lookup.contains(ATTRIBUTE_ENTRIES_DESCRIPTION); + } + + StringRefNull get_description() const + { + return lookup.lookup(ATTRIBUTE_ENTRIES_DESCRIPTION)->as_string_value()->value(); + } + + bool has_author() const + { + return lookup.contains(ATTRIBUTE_ENTRIES_AUTHOR); + } + + StringRefNull get_author() const + { + return lookup.lookup(ATTRIBUTE_ENTRIES_AUTHOR)->as_string_value()->value(); + } + + bool has_copyright() const + { + return lookup.contains(ATTRIBUTE_ENTRIES_COPYRIGHT); + } + + StringRefNull get_copyright() const + { + return lookup.lookup(ATTRIBUTE_ENTRIES_COPYRIGHT)->as_string_value()->value(); + } + + bool has_license() const + { + return lookup.contains(ATTRIBUTE_ENTRIES_LICENSE); + } + + StringRefNull get_license() const + { + return lookup.lookup(ATTRIBUTE_ENTRIES_LICENSE)->as_string_value()->value(); + } + + StringRefNull get_catalog_name() const + { + return lookup.lookup(ATTRIBUTE_ENTRIES_CATALOG_NAME)->as_string_value()->value(); + } + + CatalogID get_catalog_id() const + { + const std::string &catalog_id = + lookup.lookup(ATTRIBUTE_ENTRIES_CATALOG_ID)->as_string_value()->value(); + CatalogID catalog_uuid(catalog_id); + return catalog_uuid; + } + + void add_tags_to_meta_data(AssetMetaData *asset_data) const + { + const DictionaryValue::LookupValue *value_ptr = lookup.lookup_ptr(ATTRIBUTE_ENTRIES_TAGS); + if (value_ptr == nullptr) { + return; + } + + const ArrayValue *array_value = (*value_ptr)->as_array_value(); + const ArrayValue::Items &elements = array_value->elements(); + for (const ArrayValue::Item &item : elements) { + const StringRefNull tag_name = item->as_string_value()->value(); + BKE_asset_metadata_tag_add(asset_data, tag_name.c_str()); + } + } + + void add_properties_to_meta_data(AssetMetaData *asset_data) const + { + BLI_assert(asset_data->properties == nullptr); + const DictionaryValue::LookupValue *value_ptr = lookup.lookup_ptr( + ATTRIBUTE_ENTRIES_PROPERTIES); + if (value_ptr == nullptr) { + return; + } + + const Value &value = *(value_ptr->get()); + IDProperty *properties = convert_from_serialize_value(value); + asset_data->properties = properties; + } +}; + +struct AssetEntryWriter { + private: + DictionaryValue::Items &attributes; + + public: + AssetEntryWriter(DictionaryValue &entry) : attributes(entry.elements()) {} + + /** + * \brief add id + name to the attributes. + * + * NOTE: id and name are encoded like #ID.name + */ + void add_id_name(const short idcode, const StringRefNull name) + { + char idcode_prefix[2]; + /* Similar to `BKE_libblock_alloc`. */ + *((short *)idcode_prefix) = idcode; + std::string name_with_idcode = std::string(idcode_prefix, sizeof(idcode_prefix)) + name; + + attributes.append_as(std::pair(ATTRIBUTE_ENTRIES_NAME, new StringValue(name_with_idcode))); + } + + void add_catalog_id(const CatalogID &catalog_id) + { + char catalog_id_str[UUID_STRING_SIZE]; + BLI_uuid_format(catalog_id_str, catalog_id); + attributes.append_as(std::pair(ATTRIBUTE_ENTRIES_CATALOG_ID, new StringValue(catalog_id_str))); + } + + void add_catalog_name(const StringRefNull catalog_name) + { + attributes.append_as(std::pair(ATTRIBUTE_ENTRIES_CATALOG_NAME, new StringValue(catalog_name))); + } + + void add_description(const StringRefNull description) + { + attributes.append_as(std::pair(ATTRIBUTE_ENTRIES_DESCRIPTION, new StringValue(description))); + } + + void add_author(const StringRefNull author) + { + attributes.append_as(std::pair(ATTRIBUTE_ENTRIES_AUTHOR, new StringValue(author))); + } + + void add_copyright(const StringRefNull copyright) + { + attributes.append_as(std::pair(ATTRIBUTE_ENTRIES_COPYRIGHT, new StringValue(copyright))); + } + + void add_license(const StringRefNull license) + { + attributes.append_as(std::pair(ATTRIBUTE_ENTRIES_LICENSE, new StringValue(license))); + } + + void add_tags(const ListBase /* AssetTag */ *asset_tags) + { + ArrayValue *tags = new ArrayValue(); + attributes.append_as(std::pair(ATTRIBUTE_ENTRIES_TAGS, tags)); + ArrayValue::Items &tag_items = tags->elements(); + + LISTBASE_FOREACH (AssetTag *, tag, asset_tags) { + tag_items.append_as(new StringValue(tag->name)); + } + } + + void add_properties(const IDProperty *properties) + { + std::unique_ptr value = convert_to_serialize_values(properties); + if (value == nullptr) { + return; + } + attributes.append_as(std::pair(ATTRIBUTE_ENTRIES_PROPERTIES, value.release())); + } +}; + +static void init_value_from_file_indexer_entry(AssetEntryWriter &result, const FileIndexerEntry *indexer_entry) { const BLODataBlockInfo &datablock_info = indexer_entry->datablock_info; - add_id_name(result, indexer_entry->idcode, datablock_info.name); + result.add_id_name(indexer_entry->idcode, datablock_info.name); const AssetMetaData &asset_data = *datablock_info.asset_data; - result.append_str(ATTRIBUTE_ENTRIES_CATALOG_ID, CatalogID(asset_data.catalog_id).str()); - result.append_str(ATTRIBUTE_ENTRIES_CATALOG_NAME, asset_data.catalog_simple_name); + result.add_catalog_id(asset_data.catalog_id); + result.add_catalog_name(asset_data.catalog_simple_name); - if (const char *description = asset_data.description) { - result.append_str(ATTRIBUTE_ENTRIES_DESCRIPTION, description); + if (asset_data.description != nullptr) { + result.add_description(asset_data.description); } - if (const char *author = asset_data.author) { - result.append_str(ATTRIBUTE_ENTRIES_AUTHOR, author); + if (asset_data.author != nullptr) { + result.add_author(asset_data.author); } - if (const char *copyright = asset_data.copyright) { - result.append_str(ATTRIBUTE_ENTRIES_COPYRIGHT, copyright); + if (asset_data.copyright != nullptr) { + result.add_copyright(asset_data.copyright); } - if (const char *license = asset_data.license) { - result.append_str(ATTRIBUTE_ENTRIES_LICENSE, license); + if (asset_data.license != nullptr) { + result.add_license(asset_data.license); } if (!BLI_listbase_is_empty(&asset_data.tags)) { - ArrayValue &tags = *result.append_array(ATTRIBUTE_ENTRIES_TAGS); - LISTBASE_FOREACH (AssetTag *, tag, &asset_data.tags) { - tags.append_str(tag->name); - } + result.add_tags(&asset_data.tags); } - if (const IDProperty *properties = asset_data.properties) { - if (std::unique_ptr value = convert_to_serialize_values(properties)) { - result.append(ATTRIBUTE_ENTRIES_PROPERTIES, std::move(value)); - } + if (asset_data.properties != nullptr) { + result.add_properties(asset_data.properties); } + + /* TODO: asset_data.IDProperties */ } static void init_value_from_file_indexer_entries(DictionaryValue &result, const FileIndexerEntries &indexer_entries) { - auto entries = std::make_shared(); + ArrayValue *entries = new ArrayValue(); + ArrayValue::Items &items = entries->elements(); for (LinkNode *ln = indexer_entries.entries; ln; ln = ln->next) { const FileIndexerEntry *indexer_entry = static_cast(ln->link); @@ -200,75 +371,92 @@ static void init_value_from_file_indexer_entries(DictionaryValue &result, if (indexer_entry->datablock_info.asset_data == nullptr) { continue; } - init_value_from_file_indexer_entry(*entries->append_dict(), indexer_entry); + DictionaryValue *entry_value = new DictionaryValue(); + AssetEntryWriter entry(*entry_value); + init_value_from_file_indexer_entry(entry, indexer_entry); + items.append_as(entry_value); } /* When no entries to index, we should not store the entries attribute as this would make the * size bigger than the #MIN_FILE_SIZE_WITH_ENTRIES. */ - if (entries->elements().is_empty()) { + if (items.is_empty()) { + delete entries; return; } - result.append(ATTRIBUTE_ENTRIES, entries); + DictionaryValue::Items &attributes = result.elements(); + attributes.append_as(std::pair(ATTRIBUTE_ENTRIES, entries)); } static void init_indexer_entry_from_value(FileIndexerEntry &indexer_entry, - const DictionaryValue &entry) + const AssetEntryReader &entry) { - const StringRef idcode_name = *entry.lookup_str(ATTRIBUTE_ENTRIES_NAME); + indexer_entry.idcode = entry.get_idcode(); - indexer_entry.idcode = GS(idcode_name.data()); - - idcode_name.substr(2).copy(indexer_entry.datablock_info.name); + const std::string name = entry.get_name(); + STRNCPY(indexer_entry.datablock_info.name, name.c_str()); AssetMetaData *asset_data = BKE_asset_metadata_create(); indexer_entry.datablock_info.asset_data = asset_data; indexer_entry.datablock_info.free_asset_data = true; - if (const std::optional value = entry.lookup_str(ATTRIBUTE_ENTRIES_DESCRIPTION)) { - asset_data->description = BLI_strdupn(value->data(), value->size()); + if (entry.has_description()) { + const StringRefNull description = entry.get_description(); + const size_t c_str_size = description.size() + 1; + char *description_c_str = static_cast(MEM_mallocN(c_str_size, __func__)); + memcpy(description_c_str, description.c_str(), c_str_size); + asset_data->description = description_c_str; } - if (const std::optional value = entry.lookup_str(ATTRIBUTE_ENTRIES_AUTHOR)) { - asset_data->author = BLI_strdupn(value->data(), value->size()); + if (entry.has_author()) { + const StringRefNull author = entry.get_author(); + const size_t c_str_size = author.size() + 1; + char *author_c_str = static_cast(MEM_mallocN(c_str_size, __func__)); + memcpy(author_c_str, author.c_str(), c_str_size); + asset_data->author = author_c_str; } - if (const std::optional value = entry.lookup_str(ATTRIBUTE_ENTRIES_COPYRIGHT)) { - asset_data->copyright = BLI_strdupn(value->data(), value->size()); + if (entry.has_copyright()) { + const StringRefNull copyright = entry.get_copyright(); + const size_t c_str_size = copyright.size() + 1; + char *copyright_c_str = static_cast(MEM_mallocN(c_str_size, __func__)); + memcpy(copyright_c_str, copyright.c_str(), c_str_size); + asset_data->copyright = copyright_c_str; } - if (const std::optional value = entry.lookup_str(ATTRIBUTE_ENTRIES_LICENSE)) { - asset_data->license = BLI_strdupn(value->data(), value->size()); + if (entry.has_license()) { + const StringRefNull license = entry.get_license(); + const size_t c_str_size = license.size() + 1; + char *license_c_str = static_cast(MEM_mallocN(c_str_size, __func__)); + memcpy(license_c_str, license.c_str(), c_str_size); + asset_data->license = license_c_str; } - const StringRefNull catalog_name = *entry.lookup_str(ATTRIBUTE_ENTRIES_CATALOG_NAME); + const StringRefNull catalog_name = entry.get_catalog_name(); STRNCPY_UTF8(asset_data->catalog_simple_name, catalog_name.c_str()); - const StringRefNull catalog_id = *entry.lookup_str(ATTRIBUTE_ENTRIES_CATALOG_ID); - asset_data->catalog_id = CatalogID(catalog_id); + asset_data->catalog_id = entry.get_catalog_id(); - if (const ArrayValue *array_value = entry.lookup_array(ATTRIBUTE_ENTRIES_TAGS)) { - for (const std::shared_ptr &item : array_value->elements()) { - BKE_asset_metadata_tag_add(asset_data, item->as_string_value()->value().c_str()); - } - } - - if (const std::shared_ptr *value = entry.lookup(ATTRIBUTE_ENTRIES_PROPERTIES)) { - asset_data->properties = convert_from_serialize_value(*value->get()); - } + entry.add_tags_to_meta_data(asset_data); + entry.add_properties_to_meta_data(asset_data); } static int init_indexer_entries_from_value(FileIndexerEntries &indexer_entries, const DictionaryValue &value) { - const ArrayValue *entries = value.lookup_array(ATTRIBUTE_ENTRIES); - BLI_assert(entries != nullptr); - if (entries == nullptr) { + const DictionaryValue::Lookup attributes = value.create_lookup(); + const DictionaryValue::LookupValue *entries_value = attributes.lookup_ptr(ATTRIBUTE_ENTRIES); + BLI_assert(entries_value != nullptr); + + if (entries_value == nullptr) { return 0; } int num_entries_read = 0; - for (const std::shared_ptr &element : entries->elements()) { + const ArrayValue::Items elements = (*entries_value)->as_array_value()->elements(); + for (ArrayValue::Item element : elements) { + const AssetEntryReader asset_entry(*element->as_dictionary_value()); + FileIndexerEntry *entry = static_cast( MEM_callocN(sizeof(FileIndexerEntry), __func__)); - init_indexer_entry_from_value(*entry, *element->as_dictionary_value()); + init_indexer_entry_from_value(*entry, asset_entry); BLI_linklist_prepend(&indexer_entries.entries, entry); num_entries_read += 1; @@ -308,19 +496,21 @@ struct AssetLibraryIndex { std::string library_path; + public: AssetLibraryIndex(const StringRef library_path) : library_path(library_path) { - this->init_indices_base_path(); + init_indices_base_path(); } uint64_t hash() const { - return get_default_hash(this->library_path); + DefaultHash hasher; + return hasher(get_library_file_path()); } StringRefNull get_library_file_path() const { - return this->library_path; + return library_path; } /** @@ -339,7 +529,7 @@ struct AssetLibraryIndex { ss << std::setfill('0') << std::setw(16) << std::hex << hash() << SEP_STR; BLI_path_append(index_path, sizeof(index_path), ss.str().c_str()); - this->indices_base_path = std::string(index_path); + indices_base_path = std::string(index_path); } /** @@ -350,7 +540,7 @@ struct AssetLibraryIndex { std::string index_file_path(const BlendFile &asset_file) const { std::stringstream ss; - ss << this->indices_base_path; + ss << indices_base_path; ss << std::setfill('0') << std::setw(16) << std::hex << asset_file.hash() << "_" << asset_file.get_filename() << ".index.json"; return ss.str(); @@ -362,7 +552,7 @@ struct AssetLibraryIndex { */ void collect_preexisting_file_indices() { - const char *index_path = this->indices_base_path.c_str(); + const char *index_path = indices_base_path.c_str(); if (!BLI_is_dir(index_path)) { return; } @@ -371,7 +561,7 @@ struct AssetLibraryIndex { for (int i = 0; i < dir_entries_num; i++) { direntry *entry = &dir_entries[i]; if (BLI_str_endswith(entry->relname, ".index.json")) { - this->preexisting_file_indices.add_as(std::string(entry->path)); + preexisting_file_indices.add_as(std::string(entry->path)); } } @@ -380,7 +570,7 @@ struct AssetLibraryIndex { void mark_as_used(const std::string &filename) { - PreexistingFileIndexInfo *preexisting = this->preexisting_file_indices.lookup_ptr(filename); + PreexistingFileIndexInfo *preexisting = preexisting_file_indices.lookup_ptr(filename); if (preexisting) { preexisting->is_used = true; } @@ -394,7 +584,7 @@ struct AssetLibraryIndex { bool delete_file_index(const std::string &filename) { if (BLI_delete(filename.c_str(), false, false) == 0) { - this->preexisting_file_indices.remove(filename); + preexisting_file_indices.remove(filename); return true; } return false; @@ -413,7 +603,7 @@ struct AssetLibraryIndex { Set files_to_remove; - for (auto preexisting_index : this->preexisting_file_indices.items()) { + for (auto preexisting_index : preexisting_file_indices.items()) { if (preexisting_index.value.is_used) { continue; } @@ -477,7 +667,7 @@ struct AssetIndex { root->append_int(ATTRIBUTE_VERSION, CURRENT_VERSION); init_value_from_file_indexer_entries(*root, indexer_entries); - this->contents = std::move(root); + contents = std::move(root); } /** @@ -488,12 +678,16 @@ struct AssetIndex { int get_version() const { - const DictionaryValue *root = this->contents->as_dictionary_value(); + const DictionaryValue *root = contents->as_dictionary_value(); if (root == nullptr) { return UNKNOWN_VERSION; } - const std::optional version_value = root->lookup_int(ATTRIBUTE_VERSION); - return version_value.value_or(UNKNOWN_VERSION); + const DictionaryValue::Lookup attributes = root->create_lookup(); + const DictionaryValue::LookupValue *version_value = attributes.lookup_ptr(ATTRIBUTE_VERSION); + if (version_value == nullptr) { + return UNKNOWN_VERSION; + } + return (*version_value)->as_int_value()->value(); } bool is_latest_version() const @@ -508,7 +702,7 @@ struct AssetIndex { */ int extract_into(FileIndexerEntries &indexer_entries) const { - const DictionaryValue *root = this->contents->as_dictionary_value(); + const DictionaryValue *root = contents->as_dictionary_value(); const int num_entries_read = init_indexer_entries_from_value(indexer_entries, *root); return num_entries_read; } @@ -536,7 +730,7 @@ class AssetIndexFile : public AbstractFile { void mark_as_used() { - this->library_index.mark_as_used(this->filename); + library_index.mark_as_used(filename); } const char *get_file_path() const override @@ -549,7 +743,7 @@ class AssetIndexFile : public AbstractFile { */ bool is_older_than(BlendFile &asset_file) const { - return BLI_file_older(this->get_file_path(), asset_file.get_file_path()); + return BLI_file_older(get_file_path(), asset_file.get_file_path()); } /** @@ -565,7 +759,7 @@ class AssetIndexFile : public AbstractFile { { JsonFormatter formatter; std::ifstream is; - is.open(this->filename); + is.open(filename); std::unique_ptr read_data = formatter.deserialize(is); is.close(); @@ -574,19 +768,19 @@ class AssetIndexFile : public AbstractFile { bool ensure_parent_path_exists() const { - return BLI_file_ensure_parent_dir_exists(this->get_file_path()); + return BLI_file_ensure_parent_dir_exists(get_file_path()); } void write_contents(AssetIndex &content) { JsonFormatter formatter; if (!ensure_parent_path_exists()) { - CLOG_ERROR(&LOG, "Index not created: couldn't create folder [%s].", this->get_file_path()); + CLOG_ERROR(&LOG, "Index not created: couldn't create folder [%s].", get_file_path()); return; } std::ofstream os; - os.open(this->filename, std::ios::out | std::ios::trunc); + os.open(filename, std::ios::out | std::ios::trunc); formatter.serialize(os, *content.contents); os.close(); } @@ -598,38 +792,39 @@ int AssetLibraryIndex::remove_broken_index_files() { Set files_to_remove; - for (const std::string &index_path : this->preexisting_file_indices.keys()) { - AssetIndexFile index_file(*this, index_path); + preexisting_file_indices.foreach_item( + [&](const std::string &index_path, const PreexistingFileIndexInfo &) { + AssetIndexFile index_file(*this, index_path); - /* Bug was causing empty index files, so non-empty ones can be skipped. */ - if (index_file.constains_entries()) { - continue; - } + /* Bug was causing empty index files, so non-empty ones can be skipped. */ + if (index_file.constains_entries()) { + return; + } - /* Use the file modification time stamp to attempt to remove empty index files from a - * certain period (when the bug was in there). Starting from a day before the bug was - * introduced until a day after the fix should be enough to mitigate possible local time - * zone issues. */ + /* Use the file modification time stamp to attempt to remove empty index files from a + * certain period (when the bug was in there). Starting from a day before the bug was + * introduced until a day after the fix should be enough to mitigate possible local time + * zone issues. */ - std::tm tm_from{}; - tm_from.tm_year = 2022 - 1900; /* 2022 */ - tm_from.tm_mon = 11 - 1; /* November */ - tm_from.tm_mday = 8; /* Day before bug was introduced. */ - std::tm tm_to{}; - tm_from.tm_year = 2022 - 1900; /* 2022 */ - tm_from.tm_mon = 12 - 1; /* December */ - tm_from.tm_mday = 3; /* Day after fix. */ - std::time_t timestamp_from = std::mktime(&tm_from); - std::time_t timestamp_to = std::mktime(&tm_to); - BLI_stat_t stat = {}; - if (BLI_stat(index_file.get_file_path(), &stat) == -1) { - continue; - } - if (IN_RANGE(stat.st_mtime, timestamp_from, timestamp_to)) { - CLOG_INFO(&LOG, 2, "Remove potentially broken index file [%s].", index_path.c_str()); - files_to_remove.add(index_path); - } - } + std::tm tm_from{}; + tm_from.tm_year = 2022 - 1900; /* 2022 */ + tm_from.tm_mon = 11 - 1; /* November */ + tm_from.tm_mday = 8; /* Day before bug was introduced. */ + std::tm tm_to{}; + tm_from.tm_year = 2022 - 1900; /* 2022 */ + tm_from.tm_mon = 12 - 1; /* December */ + tm_from.tm_mday = 3; /* Day after fix. */ + std::time_t timestamp_from = std::mktime(&tm_from); + std::time_t timestamp_to = std::mktime(&tm_to); + BLI_stat_t stat = {}; + if (BLI_stat(index_file.get_file_path(), &stat) == -1) { + return; + } + if (IN_RANGE(stat.st_mtime, timestamp_from, timestamp_to)) { + CLOG_INFO(&LOG, 2, "Remove potentially broken index file [%s].", index_path.c_str()); + files_to_remove.add(index_path); + } + }); int num_files_deleted = 0; for (StringRef files_to_remove : files_to_remove) { diff --git a/source/blender/editors/asset/intern/asset_library_reference.cc b/source/blender/editors/asset/intern/asset_library_reference.cc new file mode 100644 index 00000000000..581d21cb9f0 --- /dev/null +++ b/source/blender/editors/asset/intern/asset_library_reference.cc @@ -0,0 +1,38 @@ +/* SPDX-FileCopyrightText: 2023 Blender Authors + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +/** \file + * \ingroup edasset + */ + +#include "BLI_hash.hh" + +#include "asset_library_reference.hh" + +namespace blender::ed::asset { + +AssetLibraryReferenceWrapper::AssetLibraryReferenceWrapper(const AssetLibraryReference &reference) + : AssetLibraryReference(reference) +{ +} + +bool operator==(const AssetLibraryReferenceWrapper &a, const AssetLibraryReferenceWrapper &b) +{ + return (a.type == b.type) && + ((a.type == ASSET_LIBRARY_CUSTOM) ? (a.custom_library_index == b.custom_library_index) : + true); +} + +uint64_t AssetLibraryReferenceWrapper::hash() const +{ + uint64_t hash1 = DefaultHash{}(type); + if (type != ASSET_LIBRARY_CUSTOM) { + return hash1; + } + + uint64_t hash2 = DefaultHash{}(custom_library_index); + return hash1 ^ (hash2 * 33); /* Copied from DefaultHash for std::pair. */ +} + +} // namespace blender::ed::asset diff --git a/source/blender/editors/asset/intern/asset_library_reference.hh b/source/blender/editors/asset/intern/asset_library_reference.hh index 0999d368a04..158f6f2540e 100644 --- a/source/blender/editors/asset/intern/asset_library_reference.hh +++ b/source/blender/editors/asset/intern/asset_library_reference.hh @@ -10,24 +10,25 @@ #pragma once -#include "BLI_hash.hh" +#include #include "DNA_asset_types.h" -inline bool operator==(const AssetLibraryReference &a, const AssetLibraryReference &b) -{ - return (a.type == b.type) && - ((a.type == ASSET_LIBRARY_CUSTOM) ? (a.custom_library_index == b.custom_library_index) : - true); -} +namespace blender::ed::asset { -namespace blender { +/** + * Wrapper to add logic to the AssetLibraryReference DNA struct. + */ +class AssetLibraryReferenceWrapper : public AssetLibraryReference { + public: + /* Intentionally not `explicit`, allow implicit conversion for convenience. Might have to be + * NOLINT */ + AssetLibraryReferenceWrapper(const AssetLibraryReference &reference); + ~AssetLibraryReferenceWrapper() = default; -template<> struct DefaultHash { - uint64_t operator()(const AssetLibraryReference &value) const - { - return get_default_hash(value.type, value.custom_library_index); - } + friend bool operator==(const AssetLibraryReferenceWrapper &a, + const AssetLibraryReferenceWrapper &b); + uint64_t hash() const; }; -} // namespace blender +} // namespace blender::ed::asset diff --git a/source/blender/editors/asset/intern/asset_library_reference_enum.cc b/source/blender/editors/asset/intern/asset_library_reference_enum.cc index 1bdd61d618e..8c1fccb71f3 100644 --- a/source/blender/editors/asset/intern/asset_library_reference_enum.cc +++ b/source/blender/editors/asset/intern/asset_library_reference_enum.cc @@ -21,6 +21,7 @@ #include "RNA_define.hh" #include "RNA_enum_types.hh" +#include "RNA_prototypes.h" #include "ED_asset_library.hh" diff --git a/source/blender/editors/asset/intern/asset_list.cc b/source/blender/editors/asset/intern/asset_list.cc index c227d72f527..00e7dbd2e0f 100644 --- a/source/blender/editors/asset/intern/asset_list.cc +++ b/source/blender/editors/asset/intern/asset_list.cc @@ -26,6 +26,8 @@ #include "DNA_space_types.h" +#include "BKE_preferences.h" + #include "WM_api.hh" /* XXX uses private header of file-space. */ @@ -81,7 +83,7 @@ class PreviewTimer { wmTimer *timer_ = nullptr; public: - void ensure_running(const bContext *C) + void ensureRunning(const bContext *C) { if (!timer_) { timer_ = WM_event_timer_add_notifier( @@ -113,20 +115,20 @@ class AssetList : NonCopyable { void setup(); void fetch(const bContext &C); - void ensure_previews_job(const bContext *C); + void ensurePreviewsJob(const bContext *C); void clear(const bContext *C); AssetHandle asset_get_by_index(int index) const; - bool needs_refetch() const; - bool is_loaded() const; - bool is_asset_preview_loading(const AssetHandle &asset) const; + bool needsRefetch() const; + bool isLoaded() const; + bool isAssetPreviewLoading(const AssetHandle &asset) const; asset_system::AssetLibrary *asset_library() const; void iterate(AssetListHandleIterFn fn) const; void iterate(AssetListIterFn fn) const; int size() const; - void tag_main_data_dirty() const; - void remap_id(ID *id_old, ID *id_new) const; + void tagMainDataDirty() const; + void remapID(ID *id_old, ID *id_new) const; }; AssetList::AssetList(eFileSelectType filesel_type, const AssetLibraryReference &asset_library_ref) @@ -183,17 +185,17 @@ void AssetList::fetch(const bContext &C) filelist_filter(files); } -bool AssetList::needs_refetch() const +bool AssetList::needsRefetch() const { return filelist_needs_force_reset(filelist_) || filelist_needs_reading(filelist_); } -bool AssetList::is_loaded() const +bool AssetList::isLoaded() const { return filelist_is_ready(filelist_); } -bool AssetList::is_asset_preview_loading(const AssetHandle &asset) const +bool AssetList::isAssetPreviewLoading(const AssetHandle &asset) const { return filelist_file_is_preview_pending(filelist_, asset.file_data); } @@ -224,13 +226,13 @@ void AssetList::iterate(AssetListHandleIterFn fn) const void AssetList::iterate(AssetListIterFn fn) const { - this->iterate([&fn](AssetHandle handle) { + iterate([&fn](AssetHandle handle) { auto &asset = reinterpret_cast(*handle.file_data->asset); return fn(asset); }); } -void AssetList::ensure_previews_job(const bContext *C) +void AssetList::ensurePreviewsJob(const bContext *C) { FileList *files = filelist_; int numfiles = filelist_files_ensure(files); @@ -246,7 +248,7 @@ void AssetList::ensure_previews_job(const bContext *C) const bool previews_running = filelist_cache_previews_running(files) && !filelist_cache_previews_done(files); if (previews_running) { - previews_timer_.ensure_running(C); + previews_timer_.ensureRunning(C); } else { /* Preview is not running, no need to keep generating update events! */ @@ -305,19 +307,19 @@ int AssetList::size() const return filelist_files_ensure(filelist_); } -void AssetList::tag_main_data_dirty() const +void AssetList::tagMainDataDirty() const { if (filelist_needs_reset_on_main_changes(filelist_)) { filelist_tag_force_reset_mainfiles(filelist_); } } -void AssetList::remap_id(ID * /*id_old*/, ID * /*id_new*/) const +void AssetList::remapID(ID * /*id_old*/, ID * /*id_new*/) const { /* Trigger full re-fetch of the file list if main data was changed, don't even attempt remap * pointers. We could give file list types a id-remap callback, but it's probably not worth it. * Refreshing local file lists is relatively cheap. */ - this->tag_main_data_dirty(); + tagMainDataDirty(); } /** \} */ @@ -327,39 +329,72 @@ void AssetList::remap_id(ID * /*id_old*/, ID * /*id_new*/) const * \{ */ /** - * A global asset list map, each entry being a list for a specific asset library. + * Class managing a global asset list map, each entry being a list for a specific asset library. */ -using AssetListMap = Map; +class AssetListStorage { + using AssetListMap = Map; -/** - * Wrapper for Construct on First Use idiom, to avoid the Static Initialization Fiasco. - */ -static AssetListMap &global_storage() + public: + /* Purely static class, can't instantiate this. */ + AssetListStorage() = delete; + + static void fetch_library(const AssetLibraryReference &library_reference, const bContext &C); + static void destruct(); + static AssetList *lookup_list(const AssetLibraryReference &library_ref); + static void tagMainDataDirty(); + static void remapID(ID *id_new, ID *id_old); + + private: + static std::optional asset_library_reference_to_fileselect_type( + const AssetLibraryReference &library_reference); + + using is_new_t = bool; + static std::tuple ensure_list_storage( + const AssetLibraryReference &library_reference, eFileSelectType filesel_type); + + static AssetListMap &global_storage(); +}; + +void AssetListStorage::fetch_library(const AssetLibraryReference &library_reference, + const bContext &C) { - static AssetListMap global_storage; - return global_storage; + std::optional filesel_type = asset_library_reference_to_fileselect_type(library_reference); + if (!filesel_type) { + return; + } + + auto [list, is_new] = ensure_list_storage(library_reference, *filesel_type); + if (is_new || list.needsRefetch()) { + list.setup(); + list.fetch(C); + } } -static AssetList *lookup_list(const AssetLibraryReference &library_ref) +void AssetListStorage::destruct() +{ + global_storage().clear(); +} + +AssetList *AssetListStorage::lookup_list(const AssetLibraryReference &library_ref) { return global_storage().lookup_ptr(library_ref); } -void storage_tag_main_data_dirty() +void AssetListStorage::tagMainDataDirty() { for (AssetList &list : global_storage().values()) { - list.tag_main_data_dirty(); + list.tagMainDataDirty(); } } -void storage_id_remap(ID *id_new, ID *id_old) +void AssetListStorage::remapID(ID *id_new, ID *id_old) { for (AssetList &list : global_storage().values()) { - list.remap_id(id_new, id_old); + list.remapID(id_new, id_old); } } -static std::optional asset_library_reference_to_fileselect_type( +std::optional AssetListStorage::asset_library_reference_to_fileselect_type( const AssetLibraryReference &library_reference) { switch (eAssetLibraryType(library_reference.type)) { @@ -375,8 +410,7 @@ static std::optional asset_library_reference_to_fileselect_type return std::nullopt; } -using is_new_t = bool; -static std::tuple ensure_list_storage( +std::tuple AssetListStorage::ensure_list_storage( const AssetLibraryReference &library_reference, eFileSelectType filesel_type) { AssetListMap &storage = global_storage(); @@ -388,6 +422,15 @@ static std::tuple ensure_list_storage( return {storage.lookup(library_reference), true}; } +/** + * Wrapper for Construct on First Use idiom, to avoid the Static Initialization Fiasco. + */ +AssetListStorage::AssetListMap &AssetListStorage::global_storage() +{ + static AssetListMap global_storage_; + return global_storage_; +} + /** \} */ void asset_reading_region_listen_fn(const wmRegionListenerParams *params) @@ -410,41 +453,33 @@ void asset_reading_region_listen_fn(const wmRegionListenerParams *params) void storage_fetch(const AssetLibraryReference *library_reference, const bContext *C) { - std::optional filesel_type = asset_library_reference_to_fileselect_type(*library_reference); - if (!filesel_type) { - return; - } - - auto [list, is_new] = ensure_list_storage(*library_reference, *filesel_type); - if (is_new || list.needs_refetch()) { - list.setup(); - list.fetch(*C); - } + AssetListStorage::fetch_library(*library_reference, *C); } bool is_loaded(const AssetLibraryReference *library_reference) { - AssetList *list = lookup_list(*library_reference); + AssetList *list = AssetListStorage::lookup_list(*library_reference); if (!list) { return false; } - if (list->needs_refetch()) { + if (list->needsRefetch()) { return false; } - return list->is_loaded(); + return list->isLoaded(); } void ensure_previews_job(const AssetLibraryReference *library_reference, const bContext *C) { - AssetList *list = lookup_list(*library_reference); + + AssetList *list = AssetListStorage::lookup_list(*library_reference); if (list) { - list->ensure_previews_job(C); + list->ensurePreviewsJob(C); } } void clear(const AssetLibraryReference *library_reference, const bContext *C) { - AssetList *list = lookup_list(*library_reference); + AssetList *list = AssetListStorage::lookup_list(*library_reference); if (list) { list->clear(C); } @@ -452,12 +487,12 @@ void clear(const AssetLibraryReference *library_reference, const bContext *C) bool storage_has_list_for_library(const AssetLibraryReference *library_reference) { - return lookup_list(*library_reference) != nullptr; + return AssetListStorage::lookup_list(*library_reference) != nullptr; } void iterate(const AssetLibraryReference &library_reference, AssetListHandleIterFn fn) { - AssetList *list = lookup_list(library_reference); + AssetList *list = AssetListStorage::lookup_list(library_reference); if (list) { list->iterate(fn); } @@ -465,7 +500,7 @@ void iterate(const AssetLibraryReference &library_reference, AssetListHandleIter void iterate(const AssetLibraryReference &library_reference, AssetListIterFn fn) { - AssetList *list = lookup_list(library_reference); + AssetList *list = AssetListStorage::lookup_list(library_reference); if (list) { list->iterate(fn); } @@ -474,7 +509,7 @@ void iterate(const AssetLibraryReference &library_reference, AssetListIterFn fn) asset_system::AssetLibrary *library_get_once_available( const AssetLibraryReference &library_reference) { - const AssetList *list = lookup_list(library_reference); + const AssetList *list = AssetListStorage::lookup_list(library_reference); if (!list) { return nullptr; } @@ -484,7 +519,7 @@ asset_system::AssetLibrary *library_get_once_available( AssetHandle asset_handle_get_by_index(const AssetLibraryReference *library_reference, int asset_index) { - const AssetList *list = lookup_list(*library_reference); + const AssetList *list = AssetListStorage::lookup_list(*library_reference); return list->asset_get_by_index(asset_index); } @@ -498,8 +533,8 @@ asset_system::AssetRepresentation *asset_get_by_index( bool asset_image_is_loading(const AssetLibraryReference *library_reference, const AssetHandle *asset_handle) { - const AssetList *list = lookup_list(*library_reference); - return list->is_asset_preview_loading(*asset_handle); + const AssetList *list = AssetListStorage::lookup_list(*library_reference); + return list->isAssetPreviewLoading(*asset_handle); } ImBuf *asset_image_get(const AssetHandle *asset_handle) @@ -519,16 +554,26 @@ bool listen(const wmNotifier *notifier) int size(const AssetLibraryReference *library_reference) { - AssetList *list = lookup_list(*library_reference); + AssetList *list = AssetListStorage::lookup_list(*library_reference); if (list) { return list->size(); } return -1; } +void storage_tag_main_data_dirty() +{ + AssetListStorage::tagMainDataDirty(); +} + +void storage_id_remap(ID *id_old, ID *id_new) +{ + AssetListStorage::remapID(id_old, id_new); +} + void storage_exit() { - global_storage().clear_and_shrink(); + AssetListStorage::destruct(); } /** \} */ diff --git a/source/blender/editors/asset/intern/asset_mark_clear.cc b/source/blender/editors/asset/intern/asset_mark_clear.cc index 9fcfc8e7a5e..3ae7b9a8caf 100644 --- a/source/blender/editors/asset/intern/asset_mark_clear.cc +++ b/source/blender/editors/asset/intern/asset_mark_clear.cc @@ -12,7 +12,7 @@ #include "BKE_asset.hh" #include "BKE_context.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_idtype.hh" #include "BKE_lib_id.hh" #include "BKE_main.hh" @@ -20,12 +20,14 @@ #include "UI_interface_icons.hh" +#include "RNA_access.hh" #include "RNA_prototypes.h" #include "ED_asset_list.hh" #include "ED_asset_mark_clear.hh" #include "ED_asset_type.hh" +#include "WM_api.hh" #include "WM_types.hh" namespace blender::ed::asset { diff --git a/source/blender/editors/asset/intern/asset_menu_utils.cc b/source/blender/editors/asset/intern/asset_menu_utils.cc index 9fa14d12e3f..6c24be87d7c 100644 --- a/source/blender/editors/asset/intern/asset_menu_utils.cc +++ b/source/blender/editors/asset/intern/asset_menu_utils.cc @@ -14,9 +14,11 @@ #include "DNA_screen_types.h" #include "BKE_asset.hh" -#include "BKE_report.hh" +#include "BKE_report.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" + +#include "WM_api.hh" #include "RNA_access.hh" #include "RNA_define.hh" @@ -51,10 +53,11 @@ void operator_asset_reference_props_register(StructRNA &srna) void operator_asset_reference_props_set(const asset_system::AssetRepresentation &asset, PointerRNA &ptr) { - const AssetWeakReference weak_ref = asset.make_weak_reference(); - RNA_enum_set(&ptr, "asset_library_type", weak_ref.asset_library_type); - RNA_string_set(&ptr, "asset_library_identifier", weak_ref.asset_library_identifier); - RNA_string_set(&ptr, "relative_asset_identifier", weak_ref.relative_asset_identifier); + AssetWeakReference *weak_ref = asset.make_weak_reference(); + RNA_enum_set(&ptr, "asset_library_type", weak_ref->asset_library_type); + RNA_string_set(&ptr, "asset_library_identifier", weak_ref->asset_library_identifier); + RNA_string_set(&ptr, "relative_asset_identifier", weak_ref->relative_asset_identifier); + BKE_asset_weak_reference_free(&weak_ref); } /** @@ -140,7 +143,7 @@ PointerRNA persistent_catalog_path_rna_pointer(const bScreen &owner_screen, const asset_system::AssetLibrary &library, const asset_system::AssetCatalogTreeItem &item) { - const asset_system::AssetCatalog *catalog = library.catalog_service().find_catalog_by_path( + const asset_system::AssetCatalog *catalog = library.catalog_service->find_catalog_by_path( item.catalog_path()); if (!catalog) { return PointerRNA_NULL; diff --git a/source/blender/editors/asset/intern/asset_ops.cc b/source/blender/editors/asset/intern/asset_ops.cc index 99150ad06ef..6a1ce9b7789 100644 --- a/source/blender/editors/asset/intern/asset_ops.cc +++ b/source/blender/editors/asset/intern/asset_ops.cc @@ -9,26 +9,30 @@ #include "AS_asset_library.hh" #include "AS_asset_representation.hh" -#include "BKE_bpath.hh" +#include "BKE_asset.hh" +#include "BKE_bpath.h" #include "BKE_context.hh" #include "BKE_lib_id.hh" #include "BKE_main.hh" #include "BKE_preferences.h" -#include "BKE_report.hh" +#include "BKE_report.h" +#include "BLI_fileops.h" /* MSVC needs this for `PATH_MAX` */ #include "BLI_fnmatch.h" #include "BLI_path_util.h" #include "BLI_set.hh" #include "ED_asset.hh" #include "ED_screen.hh" +#include "ED_util.hh" /* XXX needs access to the file list, should all be done via the asset system in future. */ #include "ED_fileselect.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "RNA_access.hh" #include "RNA_define.hh" +#include "RNA_enum_types.hh" #include "RNA_prototypes.h" #include "WM_api.hh" @@ -89,7 +93,7 @@ struct IDVecStats { * Helper to report stats about the IDs in context. Operator polls use this, also to report a * helpful disabled hint to the user. */ -static IDVecStats asset_operation_get_id_vec_stats_from_ids(const Span id_pointers) +static IDVecStats asset_operation_get_id_vec_stats_from_ids(const Vector &id_pointers) { IDVecStats stats; @@ -125,7 +129,7 @@ static const char *asset_operation_unsupported_type_msg(const bool is_single) class AssetMarkHelper { public: - void operator()(const bContext &C, Span ids); + void operator()(const bContext &C, const Vector &ids); void reportResults(ReportList &reports) const; bool wasSuccessful() const; @@ -140,7 +144,7 @@ class AssetMarkHelper { Stats stats; }; -void AssetMarkHelper::operator()(const bContext &C, const Span ids) +void AssetMarkHelper::operator()(const bContext &C, const Vector &ids) { for (const PointerRNA &ptr : ids) { BLI_assert(RNA_struct_is_ID(ptr.type)); @@ -190,7 +194,7 @@ void AssetMarkHelper::reportResults(ReportList &reports) const } } -static int asset_mark_exec(const bContext *C, const wmOperator *op, const Span ids) +static int asset_mark_exec(const bContext *C, const wmOperator *op, const Vector &ids) { AssetMarkHelper mark_helper; mark_helper(*C, ids); @@ -206,7 +210,7 @@ static int asset_mark_exec(const bContext *C, const wmOperator *op, const Span

ids) +static bool asset_mark_poll(bContext *C, const Vector &ids) { IDVecStats ctx_stats = asset_operation_get_id_vec_stats_from_ids(ids); @@ -265,7 +269,7 @@ class AssetClearHelper { public: AssetClearHelper(const bool set_fake_user) : set_fake_user_(set_fake_user) {} - void operator()(Span ids); + void operator()(const Vector &ids); void reportResults(const bContext *C, ReportList &reports) const; bool wasSuccessful() const; @@ -279,7 +283,7 @@ class AssetClearHelper { Stats stats; }; -void AssetClearHelper::operator()(const Span ids) +void AssetClearHelper::operator()(const Vector &ids) { for (const PointerRNA &ptr : ids) { BLI_assert(RNA_struct_is_ID(ptr.type)); @@ -332,7 +336,7 @@ bool AssetClearHelper::wasSuccessful() const return stats.tot_cleared > 0; } -static int asset_clear_exec(const bContext *C, const wmOperator *op, const Span ids) +static int asset_clear_exec(const bContext *C, const wmOperator *op, const Vector &ids) { const bool set_fake_user = RNA_boolean_get(op->ptr, "set_fake_user"); AssetClearHelper clear_helper(set_fake_user); @@ -349,7 +353,7 @@ static int asset_clear_exec(const bContext *C, const wmOperator *op, const Span< return OPERATOR_FINISHED; } -static bool asset_clear_poll(bContext *C, const Span ids) +static bool asset_clear_poll(bContext *C, const Vector &ids) { IDVecStats ctx_stats = asset_operation_get_id_vec_stats_from_ids(ids); @@ -587,7 +591,7 @@ static asset_system::AssetCatalogService *get_catalog_service(bContext *C) } asset_system::AssetLibrary *asset_lib = ED_fileselect_active_asset_library_get(sfile); - return &asset_lib->catalog_service(); + return AS_asset_library_get_catalog_service(asset_lib); } static int asset_catalog_undo_exec(bContext *C, wmOperator * /*op*/) @@ -789,7 +793,7 @@ static int asset_bundle_install_exec(bContext *C, wmOperator *op) } /* Check file path, copied from #wm_file_write(). */ - char filepath[FILE_MAX]; + char filepath[PATH_MAX]; RNA_string_get(op->ptr, "filepath", filepath); const size_t len = strlen(filepath); @@ -921,7 +925,7 @@ static bool set_filepath_for_asset_lib(const Main *bmain, wmOperator *op) return false; } - char file_path[FILE_MAX]; + char file_path[PATH_MAX]; BLI_path_join(file_path, sizeof(file_path), lib->dirpath, blend_filename); RNA_string_set(op->ptr, "filepath", file_path); diff --git a/source/blender/editors/asset/intern/asset_shelf.cc b/source/blender/editors/asset/intern/asset_shelf.cc index c1c91766a81..2f38901ca51 100644 --- a/source/blender/editors/asset/intern/asset_shelf.cc +++ b/source/blender/editors/asset/intern/asset_shelf.cc @@ -19,7 +19,7 @@ #include "BKE_main.hh" #include "BKE_screen.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_screen_types.h" @@ -660,6 +660,8 @@ static uiBut *add_tab_button(uiBlock &block, StringRefNull name) nullptr, 0, 0, + 0, + 0, TIP_("Enable catalog, making contained assets visible in the asset shelf")); UI_but_drawflag_enable(but, UI_BUT_ALIGN_DOWN); @@ -688,7 +690,7 @@ static void add_catalog_tabs(AssetShelfSettings &shelf_settings, uiLayout &layou /* Regular catalog tabs. */ settings_foreach_enabled_catalog_path( - shelf_settings, [&](const asset_system::AssetCatalogPath &path) { + shelf_settings, [&shelf_settings, block](const asset_system::AssetCatalogPath &path) { uiBut *but = add_tab_button(*block, path.name()); UI_but_func_set(but, [&shelf_settings, path](bContext &C) { diff --git a/source/blender/editors/asset/intern/asset_shelf_asset_view.cc b/source/blender/editors/asset/intern/asset_shelf_asset_view.cc index dea8b7a09b8..9d958d62896 100644 --- a/source/blender/editors/asset/intern/asset_shelf_asset_view.cc +++ b/source/blender/editors/asset/intern/asset_shelf_asset_view.cc @@ -18,6 +18,7 @@ #include "DNA_asset_types.h" #include "DNA_screen_types.h" +#include "DNA_space_types.h" #include "ED_asset_handle.hh" #include "ED_asset_list.hh" @@ -25,6 +26,7 @@ #include "UI_grid_view.hh" #include "UI_interface.hh" +#include "UI_view2d.hh" #include "RNA_access.hh" #include "RNA_prototypes.h" @@ -166,13 +168,13 @@ static std::optional catalog_filter_from_shelf return {}; } - asset_system::AssetCatalog *active_catalog = library.catalog_service().find_catalog_by_path( + asset_system::AssetCatalog *active_catalog = library.catalog_service->find_catalog_by_path( shelf_settings.active_catalog_path); if (!active_catalog) { return {}; } - return library.catalog_service().create_catalog_filter(active_catalog->catalog_id); + return library.catalog_service->create_catalog_filter(active_catalog->catalog_id); } /* ---------------------------------------------------------------------- */ diff --git a/source/blender/editors/asset/intern/asset_shelf_catalog_selector.cc b/source/blender/editors/asset/intern/asset_shelf_catalog_selector.cc index c874f955336..4011de16e54 100644 --- a/source/blender/editors/asset/intern/asset_shelf_catalog_selector.cc +++ b/source/blender/editors/asset/intern/asset_shelf_catalog_selector.cc @@ -10,6 +10,7 @@ #include "AS_asset_catalog.hh" #include "AS_asset_catalog_tree.hh" +#include "AS_asset_library.hh" #include "BLI_string.h" @@ -18,7 +19,7 @@ #include "BKE_context.hh" #include "BKE_screen.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "ED_asset_filter.hh" #include "ED_asset_list.hh" @@ -63,23 +64,21 @@ class AssetCatalogSelectorTree : public ui::AbstractTreeView { return; } - catalog_tree_.foreach_root_item( - [this](const asset_system::AssetCatalogTreeItem &catalog_item) { - Item &item = build_catalog_items_recursive(*this, catalog_item); - /* Uncollapse root items by default (user edits will override this just fine). */ - item.set_collapsed(false); - }); + catalog_tree_.foreach_root_item([this](asset_system::AssetCatalogTreeItem &catalog_item) { + Item &item = build_catalog_items_recursive(*this, catalog_item); + /* Uncollapse root items by default (user edits will override this just fine). */ + item.set_collapsed(false); + }); } Item &build_catalog_items_recursive(ui::TreeViewOrItem &parent_view_item, - const asset_system::AssetCatalogTreeItem &catalog_item) const + asset_system::AssetCatalogTreeItem &catalog_item) const { Item &view_item = parent_view_item.add_tree_item(catalog_item, shelf_settings_); - catalog_item.foreach_child( - [&view_item, this](const asset_system::AssetCatalogTreeItem &child) { - build_catalog_items_recursive(view_item, child); - }); + catalog_item.foreach_child([&view_item, this](asset_system::AssetCatalogTreeItem &child) { + build_catalog_items_recursive(view_item, child); + }); return view_item; } @@ -87,14 +86,13 @@ class AssetCatalogSelectorTree : public ui::AbstractTreeView { void update_shelf_settings_from_enabled_catalogs(); class Item : public ui::BasicTreeViewItem { - const asset_system::AssetCatalogTreeItem &catalog_item_; + asset_system::AssetCatalogTreeItem catalog_item_; /* Is the catalog path enabled in this redraw? Set on construction, updated by the UI (which * gets a pointer to it). The UI needs it as char. */ char catalog_path_enabled_ = false; public: - Item(const asset_system::AssetCatalogTreeItem &catalog_item, - AssetShelfSettings &shelf_settings) + Item(asset_system::AssetCatalogTreeItem &catalog_item, AssetShelfSettings &shelf_settings) : ui::BasicTreeViewItem(catalog_item.get_name()), catalog_item_(catalog_item), catalog_path_enabled_( @@ -136,6 +134,10 @@ class AssetCatalogSelectorTree : public ui::AbstractTreeView { uiLayoutSetEmboss(&row, UI_EMBOSS); + if (!is_collapsible()) { + uiItemL(&row, nullptr, ICON_BLANK1); + } + uiLayout *subrow = uiLayoutRow(&row, false); uiLayoutSetActive(subrow, catalog_path_enabled_); uiItemL(subrow, catalog_item_.get_name().c_str(), ICON_NONE); diff --git a/source/blender/editors/asset/intern/asset_temp_id_consumer.cc b/source/blender/editors/asset/intern/asset_temp_id_consumer.cc index 51f4a16bcf8..51f2833be90 100644 --- a/source/blender/editors/asset/intern/asset_temp_id_consumer.cc +++ b/source/blender/editors/asset/intern/asset_temp_id_consumer.cc @@ -14,11 +14,11 @@ #include "AS_asset_representation.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "BLI_utility_mixins.hh" -#include "BLO_readfile.hh" +#include "BLO_readfile.h" #include "MEM_guardedalloc.h" diff --git a/source/blender/editors/curve/curve_ops.cc b/source/blender/editors/curve/curve_ops.cc index ae5d5b03209..0a9993ccd37 100644 --- a/source/blender/editors/curve/curve_ops.cc +++ b/source/blender/editors/curve/curve_ops.cc @@ -9,6 +9,7 @@ #include #include +#include "DNA_curve_types.h" #include "DNA_scene_types.h" #include "RNA_access.hh" diff --git a/source/blender/editors/curve/editcurve.cc b/source/blender/editors/curve/editcurve.cc index ba0f5d623e0..ca9136712d4 100644 --- a/source/blender/editors/curve/editcurve.cc +++ b/source/blender/editors/curve/editcurve.cc @@ -21,22 +21,22 @@ #include "BLI_math_rotation.h" #include "BLI_math_vector.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_action.h" -#include "BKE_anim_data.hh" +#include "BKE_anim_data.h" #include "BKE_context.hh" #include "BKE_curve.hh" #include "BKE_displist.h" -#include "BKE_fcurve.hh" -#include "BKE_global.hh" +#include "BKE_fcurve.h" +#include "BKE_global.h" #include "BKE_key.hh" #include "BKE_layer.hh" #include "BKE_lib_id.hh" #include "BKE_main.hh" #include "BKE_modifier.hh" #include "BKE_object_types.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "DEG_depsgraph.hh" #include "DEG_depsgraph_build.hh" @@ -1087,11 +1087,11 @@ int ED_curve_updateAnimPaths(Main *bmain, Curve *cu) if (adt->action != nullptr) { curve_rename_fcurves(cu, &adt->action->curves); - DEG_id_tag_update(&adt->action->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&adt->action->id, ID_RECALC_COPY_ON_WRITE); } curve_rename_fcurves(cu, &adt->drivers); - DEG_id_tag_update(&cu->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&cu->id, ID_RECALC_COPY_ON_WRITE); /* TODO(sergey): Only update if something actually changed. */ DEG_relations_tag_update(bmain); @@ -1455,20 +1455,6 @@ static int separate_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } -static int separate_invoke(bContext *C, wmOperator *op, const wmEvent * /*event*/) -{ - if (RNA_boolean_get(op->ptr, "confirm")) { - return WM_operator_confirm_ex(C, - op, - IFACE_("Move selected points to a new object?"), - nullptr, - IFACE_("Separate"), - ALERT_ICON_NONE, - false); - } - return separate_exec(C, op); -} - void CURVE_OT_separate(wmOperatorType *ot) { /* identifiers */ @@ -1477,7 +1463,7 @@ void CURVE_OT_separate(wmOperatorType *ot) ot->description = "Separate selected points from connected unselected points into a new object"; /* api callbacks */ - ot->invoke = separate_invoke; + ot->invoke = WM_operator_confirm_or_exec; ot->exec = separate_exec; ot->poll = ED_operator_editsurfcurve; @@ -3408,7 +3394,7 @@ static int reveal_exec(bContext *C, wmOperator *op) if (changed) { DEG_id_tag_update(static_cast(obedit->data), - ID_RECALC_SYNC_TO_EVAL | ID_RECALC_SELECT | ID_RECALC_GEOMETRY); + ID_RECALC_COPY_ON_WRITE | ID_RECALC_SELECT | ID_RECALC_GEOMETRY); WM_event_add_notifier(C, NC_GEOM | ND_SELECT, obedit->data); changed_multi = true; } @@ -4836,7 +4822,7 @@ bool ED_curve_editnurb_select_pick(bContext *C, for (Object *ob_iter : objects) { ED_curve_deselect_all(((Curve *)ob_iter->data)->editnurb); DEG_id_tag_update(static_cast(ob_iter->data), - ID_RECALC_SELECT | ID_RECALC_SYNC_TO_EVAL); + ID_RECALC_SELECT | ID_RECALC_COPY_ON_WRITE); WM_event_add_notifier(C, NC_GEOM | ND_SELECT, ob_iter->data); } changed = true; @@ -5000,7 +4986,7 @@ bool ED_curve_editnurb_select_pick(bContext *C, ED_object_base_activate(C, basact); } - DEG_id_tag_update(static_cast(obedit->data), ID_RECALC_SELECT | ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(static_cast(obedit->data), ID_RECALC_SELECT | ID_RECALC_COPY_ON_WRITE); WM_event_add_notifier(C, NC_GEOM | ND_SELECT, obedit->data); changed = true; @@ -5030,7 +5016,7 @@ bool ed_editnurb_spin( invert_m3_m3(persinv, persmat); /* imat and center and size */ - copy_m3_m4(bmat, obedit->object_to_world().ptr()); + copy_m3_m4(bmat, obedit->object_to_world); invert_m3_m3(imat, bmat); axis_angle_to_mat3(cmat, axis, M_PI_4); @@ -5124,8 +5110,8 @@ static int spin_exec(bContext *C, wmOperator *op) continue; } - invert_m4_m4(obedit->runtime->world_to_object.ptr(), obedit->object_to_world().ptr()); - mul_m4_v3(obedit->world_to_object().ptr(), cent); + invert_m4_m4(obedit->world_to_object, obedit->object_to_world); + mul_m4_v3(obedit->world_to_object, cent); if (!ed_editnurb_spin(viewmat, v3d, obedit, axis, cent)) { count_failed += 1; @@ -5603,7 +5589,7 @@ static int add_vertex_exec(bContext *C, wmOperator *op) RNA_float_get_array(op->ptr, "location", location); - invert_m4_m4(imat, obedit->object_to_world().ptr()); + invert_m4_m4(imat, obedit->object_to_world); mul_m4_v3(imat, location); if (ed_editcurve_addvert(cu, editnurb, v3d, location)) { @@ -5642,10 +5628,10 @@ static int add_vertex_invoke(bContext *C, wmOperator *op, const wmEvent *event) ED_curve_nurb_vert_selected_find(cu, vc.v3d, &nu, &bezt, &bp); if (bezt) { - mul_v3_m4v3(location, vc.obedit->object_to_world().ptr(), bezt->vec[1]); + mul_v3_m4v3(location, vc.obedit->object_to_world, bezt->vec[1]); } else if (bp) { - mul_v3_m4v3(location, vc.obedit->object_to_world().ptr(), bp->vec); + mul_v3_m4v3(location, vc.obedit->object_to_world, bp->vec); } else { copy_v3_v3(location, vc.scene->cursor.location); @@ -5686,17 +5672,17 @@ static int add_vertex_invoke(bContext *C, wmOperator *op, const wmEvent *event) ED_view3d_global_to_vector(vc.rv3d, location, view_dir); /* get the plane */ - const float *plane_co = vc.obedit->object_to_world().location(); - float plane_no[3]; + float plane[4]; /* only normalize to avoid precision errors */ - normalize_v3_v3(plane_no, vc.obedit->object_to_world()[2]); + normalize_v3_v3(plane, vc.obedit->object_to_world[2]); + plane[3] = -dot_v3v3(plane, vc.obedit->object_to_world[3]); - if (fabsf(dot_v3v3(view_dir, plane_no)) < eps) { + if (fabsf(dot_v3v3(view_dir, plane)) < eps) { /* can't project on an aligned plane. */ } else { float lambda; - if (isect_ray_plane_v3_factor(location, view_dir, plane_co, plane_no, &lambda)) { + if (isect_ray_plane_v3(location, view_dir, plane, &lambda, false)) { /* check if we're behind the viewport */ float location_test[3]; madd_v3_v3v3fl(location_test, location, view_dir, lambda); @@ -6936,7 +6922,7 @@ int ED_curve_join_objects_exec(bContext *C, wmOperator *op) /* Inverse transform for all selected curves in this object, * See object_join_exec for detailed comment on why the safe version is used. */ - invert_m4_m4_safe_ortho(imat, ob_active->object_to_world().ptr()); + invert_m4_m4_safe_ortho(imat, ob_active->object_to_world); Curve *cu_active = static_cast(ob_active->data); @@ -6948,7 +6934,7 @@ int ED_curve_join_objects_exec(bContext *C, wmOperator *op) if (cu->nurb.first) { /* watch it: switch order here really goes wrong */ - mul_m4_m4m4(cmat, imat, ob_iter->object_to_world().ptr()); + mul_m4_m4m4(cmat, imat, ob_iter->object_to_world); /* Compensate for different bevel depth. */ bool do_radius = false; diff --git a/source/blender/editors/curve/editcurve_add.cc b/source/blender/editors/curve/editcurve_add.cc index b9c78fa0cdd..e18710c5135 100644 --- a/source/blender/editors/curve/editcurve_add.cc +++ b/source/blender/editors/curve/editcurve_add.cc @@ -12,10 +12,11 @@ #include "MEM_guardedalloc.h" +#include "BLI_blenlib.h" #include "BLI_math_matrix.h" #include "BLI_math_vector.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_context.hh" #include "BKE_curve.hh" diff --git a/source/blender/editors/curve/editcurve_paint.cc b/source/blender/editors/curve/editcurve_paint.cc index deedeaeb1a6..a942c83ec34 100644 --- a/source/blender/editors/curve/editcurve_paint.cc +++ b/source/blender/editors/curve/editcurve_paint.cc @@ -11,15 +11,15 @@ #include "MEM_guardedalloc.h" +#include "BLI_blenlib.h" #include "BLI_math_matrix.h" #include "BLI_math_rotation.h" #include "BLI_mempool.h" #include "BKE_context.hh" #include "BKE_curve.hh" -#include "BKE_fcurve.hh" -#include "BKE_object_types.hh" -#include "BKE_report.hh" +#include "BKE_fcurve.h" +#include "BKE_report.h" #include "DEG_depsgraph.hh" @@ -153,8 +153,7 @@ static void stroke_elem_pressure_set(const CurveDrawData *cdd, StrokeElem *selem const float adjust = stroke_elem_radius_from_pressure(cdd, pressure) - stroke_elem_radius_from_pressure(cdd, selem->pressure); madd_v3_v3fl(selem->location_local, selem->normal_local, adjust); - mul_v3_m4v3( - selem->location_world, cdd->vc.obedit->object_to_world().ptr(), selem->location_local); + mul_v3_m4v3(selem->location_world, cdd->vc.obedit->object_to_world, selem->location_local); } selem->pressure = pressure; } @@ -251,11 +250,11 @@ static bool stroke_elem_project_fallback(const CurveDrawData *cdd, cdd->vc.v3d, cdd->vc.region, location_fallback_depth, mval_fl, r_location_world); zero_v3(r_normal_local); } - mul_v3_m4v3(r_location_local, cdd->vc.obedit->world_to_object().ptr(), r_location_world); + mul_v3_m4v3(r_location_local, cdd->vc.obedit->world_to_object, r_location_world); if (!is_zero_v3(r_normal_world)) { copy_v3_v3(r_normal_local, r_normal_world); - mul_transposed_mat3_m4_v3(cdd->vc.obedit->object_to_world().ptr(), r_normal_local); + mul_transposed_mat3_m4_v3(cdd->vc.obedit->object_to_world, r_normal_local); normalize_v3(r_normal_local); } else { @@ -310,8 +309,7 @@ static void curve_draw_stroke_from_operator_elem(wmOperator *op, PointerRNA *ite RNA_float_get_array(itemptr, "mouse", selem->mval); RNA_float_get_array(itemptr, "location", selem->location_world); - mul_v3_m4v3( - selem->location_local, cdd->vc.obedit->world_to_object().ptr(), selem->location_world); + mul_v3_m4v3(selem->location_local, cdd->vc.obedit->world_to_object, selem->location_world); selem->pressure = RNA_float_get(itemptr, "pressure"); } @@ -374,7 +372,7 @@ static void curve_draw_stroke_3d(const bContext * /*C*/, ARegion * /*region*/, v /* scale to edit-mode space */ GPU_matrix_push(); - GPU_matrix_mul(obedit->object_to_world().ptr()); + GPU_matrix_mul(obedit->object_to_world); BLI_mempool_iternew(cdd->stroke_elem_pool, &iter); for (selem = static_cast(BLI_mempool_iterstep(&iter)); selem; @@ -456,7 +454,7 @@ static void curve_draw_event_add(wmOperator *op, const wmEvent *event) CurveDrawData *cdd = static_cast(op->customdata); Object *obedit = cdd->vc.obedit; - invert_m4_m4(obedit->runtime->world_to_object.ptr(), obedit->object_to_world().ptr()); + invert_m4_m4(obedit->world_to_object, obedit->object_to_world); StrokeElem *selem = static_cast(BLI_mempool_calloc(cdd->stroke_elem_pool)); @@ -779,7 +777,7 @@ static int curve_draw_exec(bContext *C, wmOperator *op) int stroke_len = BLI_mempool_len(cdd->stroke_elem_pool); const bool is_3d = (cu->flag & CU_3D) != 0; - invert_m4_m4(obedit->runtime->world_to_object.ptr(), obedit->object_to_world().ptr()); + invert_m4_m4(obedit->world_to_object, obedit->object_to_world); if (BLI_mempool_len(cdd->stroke_elem_pool) == 0) { curve_draw_stroke_from_operator(op); @@ -1098,8 +1096,8 @@ static int curve_draw_invoke(bContext *C, wmOperator *op, const wmEvent *event) if (CU_IS_2D(cu)) { /* 2D overrides other options */ - plane_co = obedit->object_to_world().location(); - plane_no = obedit->object_to_world().ptr()[2]; + plane_co = obedit->object_to_world[3]; + plane_no = obedit->object_to_world[2]; cdd->project.use_plane = true; } else { diff --git a/source/blender/editors/curve/editcurve_pen.cc b/source/blender/editors/curve/editcurve_pen.cc index cb1d2b72982..b10ccb31260 100644 --- a/source/blender/editors/curve/editcurve_pen.cc +++ b/source/blender/editors/curve/editcurve_pen.cc @@ -28,6 +28,8 @@ #include "ED_select_utils.hh" #include "ED_view3d.hh" +#include "BKE_object.hh" + #include "curve_intern.h" #include "RNA_access.hh" @@ -151,17 +153,17 @@ static void update_location_for_2d_curve(const ViewContext *vc, float location[3 ED_view3d_global_to_vector(vc->rv3d, location, view_dir); /* Get the plane. */ - const float *plane_co = vc->obedit->object_to_world().location(); - float plane_no[3]; + float plane[4]; /* Only normalize to avoid precision errors. */ - normalize_v3_v3(plane_no, vc->obedit->object_to_world()[2]); + normalize_v3_v3(plane, vc->obedit->object_to_world[2]); + plane[3] = -dot_v3v3(plane, vc->obedit->object_to_world[3]); - if (fabsf(dot_v3v3(view_dir, plane_no)) < eps) { + if (fabsf(dot_v3v3(view_dir, plane)) < eps) { /* Can't project on an aligned plane. */ } else { float lambda; - if (isect_ray_plane_v3_factor(location, view_dir, plane_co, plane_no, &lambda)) { + if (isect_ray_plane_v3(location, view_dir, plane, &lambda, false)) { /* Check if we're behind the viewport */ float location_test[3]; madd_v3_v3v3fl(location_test, location, view_dir, lambda); @@ -175,7 +177,7 @@ static void update_location_for_2d_curve(const ViewContext *vc, float location[3 } float imat[4][4]; - invert_m4_m4(imat, vc->obedit->object_to_world().ptr()); + invert_m4_m4(imat, vc->obedit->object_to_world); mul_m4_v3(imat, location); if (CU_IS_2D(cu)) { @@ -188,7 +190,7 @@ static void screenspace_to_worldspace(const ViewContext *vc, const float depth[3], float r_pos_3d[3]) { - mul_v3_m4v3(r_pos_3d, vc->obedit->object_to_world().ptr(), depth); + mul_v3_m4v3(r_pos_3d, vc->obedit->object_to_world, depth); ED_view3d_win_to_3d(vc->v3d, vc->region, r_pos_3d, pos_2d, r_pos_3d); update_location_for_2d_curve(vc, r_pos_3d); } @@ -1102,7 +1104,7 @@ static void extrude_points_from_selected_vertices(const ViewContext *vc, float location[3]; if (sel_exists) { - mul_v3_m4v3(location, vc->obedit->object_to_world().ptr(), center); + mul_v3_m4v3(location, vc->obedit->object_to_world, center); } else { copy_v3_v3(location, vc->scene->cursor.location); diff --git a/source/blender/editors/curve/editcurve_query.cc b/source/blender/editors/curve/editcurve_query.cc index 0897999823d..b604cf275c2 100644 --- a/source/blender/editors/curve/editcurve_query.cc +++ b/source/blender/editors/curve/editcurve_query.cc @@ -15,9 +15,12 @@ #include "BLI_math_vector.h" #include "BKE_curve.hh" -#include "BKE_fcurve.hh" +#include "BKE_fcurve.h" #include "BKE_layer.hh" +#include "DEG_depsgraph.hh" +#include "DEG_depsgraph_build.hh" + #include "ED_curve.hh" #include "ED_view3d.hh" diff --git a/source/blender/editors/curve/editcurve_select.cc b/source/blender/editors/curve/editcurve_select.cc index ddc2f4b3a36..5061500d3b1 100644 --- a/source/blender/editors/curve/editcurve_select.cc +++ b/source/blender/editors/curve/editcurve_select.cc @@ -21,9 +21,9 @@ #include "BKE_context.hh" #include "BKE_curve.hh" -#include "BKE_fcurve.hh" +#include "BKE_fcurve.h" #include "BKE_layer.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "WM_api.hh" #include "WM_types.hh" @@ -1508,7 +1508,7 @@ static void nurb_bezt_direction_worldspace_get(Object *ob, { float rsmat[3][3]; BKE_nurb_bezt_calc_normal(nu, bezt, r_dir); - copy_m3_m4(rsmat, ob->object_to_world().ptr()); + copy_m3_m4(rsmat, ob->object_to_world); mul_m3_v3(rsmat, r_dir); normalize_v3(r_dir); } @@ -1517,7 +1517,7 @@ static void nurb_bpoint_direction_worldspace_get(Object *ob, Nurb *nu, BPoint *b { float rsmat[3][3]; BKE_nurb_bpoint_calc_normal(nu, bp, r_dir); - copy_m3_m4(rsmat, ob->object_to_world().ptr()); + copy_m3_m4(rsmat, ob->object_to_world); mul_m3_v3(rsmat, r_dir); normalize_v3(r_dir); } @@ -2046,7 +2046,7 @@ static int edcu_shortest_path_pick_invoke(bContext *C, wmOperator *op, const wmE ED_object_base_activate(C, basact); } - DEG_id_tag_update(static_cast(obedit->data), ID_RECALC_SELECT | ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(static_cast(obedit->data), ID_RECALC_SELECT | ID_RECALC_COPY_ON_WRITE); WM_event_add_notifier(C, NC_GEOM | ND_SELECT, obedit->data); return OPERATOR_FINISHED; } diff --git a/source/blender/editors/curve/editcurve_undo.cc b/source/blender/editors/curve/editcurve_undo.cc index 46fde85b448..93be252e653 100644 --- a/source/blender/editors/curve/editcurve_undo.cc +++ b/source/blender/editors/curve/editcurve_undo.cc @@ -18,10 +18,10 @@ #include "BLI_blenlib.h" #include "BLI_ghash.h" -#include "BKE_anim_data.hh" +#include "BKE_anim_data.h" #include "BKE_context.hh" #include "BKE_curve.hh" -#include "BKE_fcurve.hh" +#include "BKE_fcurve.h" #include "BKE_layer.hh" #include "BKE_main.hh" #include "BKE_object.hh" diff --git a/source/blender/editors/curve/editfont.cc b/source/blender/editors/curve/editfont.cc index fbd3798811e..c08f66eafa1 100644 --- a/source/blender/editors/curve/editfont.cc +++ b/source/blender/editors/curve/editfont.cc @@ -33,12 +33,12 @@ #include "BKE_lib_id.hh" #include "BKE_main.hh" #include "BKE_object.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "BKE_vfont.hh" #include "BLI_string_utf8.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DEG_depsgraph.hh" #include "DEG_depsgraph_query.hh" @@ -707,6 +707,8 @@ static uiBlock *wm_block_insert_unicode_create(bContext *C, ARegion *region, voi edit_string, 0, 7, + 0, + 0, TIP_("Unicode codepoint hex value")); UI_but_flag_enable(text_but, UI_BUT_ACTIVATE_ON_INIT); /* Hitting Enter in the text input is treated the same as clicking the Confirm button. */ @@ -729,17 +731,17 @@ static uiBlock *wm_block_insert_unicode_create(bContext *C, ARegion *region, voi if (windows_layout) { confirm = uiDefIconTextBut( - block, UI_BTYPE_BUT, 0, 0, "Insert", 0, 0, 0, UI_UNIT_Y, nullptr, 0, 0, nullptr); + block, UI_BTYPE_BUT, 0, 0, "Insert", 0, 0, 0, UI_UNIT_Y, nullptr, 0, 0, 0, 0, nullptr); uiLayoutColumn(split, false); } cancel = uiDefIconTextBut( - block, UI_BTYPE_BUT, 0, 0, "Cancel", 0, 0, 0, UI_UNIT_Y, nullptr, 0, 0, nullptr); + block, UI_BTYPE_BUT, 0, 0, "Cancel", 0, 0, 0, UI_UNIT_Y, nullptr, 0, 0, 0, 0, nullptr); if (!windows_layout) { uiLayoutColumn(split, false); confirm = uiDefIconTextBut( - block, UI_BTYPE_BUT, 0, 0, "Insert", 0, 0, 0, UI_UNIT_Y, nullptr, 0, 0, nullptr); + block, UI_BTYPE_BUT, 0, 0, "Insert", 0, 0, 0, UI_UNIT_Y, nullptr, 0, 0, 0, 0, nullptr); } UI_block_func_set(block, nullptr, nullptr, nullptr); @@ -1954,8 +1956,7 @@ static int font_cursor_text_index_from_event(bContext *C, Object *obedit, const { /* Calculate a plane from the text object's orientation. */ float plane[4]; - plane_from_point_normal_v3( - plane, obedit->object_to_world().location(), obedit->object_to_world().ptr()[2]); + plane_from_point_normal_v3(plane, obedit->object_to_world[3], obedit->object_to_world[2]); /* Convert Mouse location in region to 3D location in world space. */ float mal_fl[2] = {float(event->mval[0]), float(event->mval[1])}; @@ -1963,7 +1964,7 @@ static int font_cursor_text_index_from_event(bContext *C, Object *obedit, const ED_view3d_win_to_3d_on_plane(CTX_wm_region(C), plane, mal_fl, true, mouse_loc); /* Convert to object space and scale by font size. */ - mul_m4_v3(obedit->world_to_object().ptr(), mouse_loc); + mul_m4_v3(obedit->world_to_object, mouse_loc); float curs_loc[2] = {mouse_loc[0], mouse_loc[1]}; return BKE_vfont_cursor_to_text_index(obedit, curs_loc); @@ -2591,7 +2592,7 @@ bool ED_curve_editfont_select_pick( cu->actbox = actbox_select; WM_event_add_notifier(C, NC_GEOM | ND_DATA, obedit->data); /* TODO: support #ID_RECALC_SELECT. */ - DEG_id_tag_update(static_cast(obedit->data), ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(static_cast(obedit->data), ID_RECALC_COPY_ON_WRITE); } return true; } diff --git a/source/blender/editors/curve/editfont_undo.cc b/source/blender/editors/curve/editfont_undo.cc index 68954f8e1c5..bc8ed2a85b3 100644 --- a/source/blender/editors/curve/editfont_undo.cc +++ b/source/blender/editors/curve/editfont_undo.cc @@ -13,11 +13,12 @@ #include "CLG_log.h" -#include "BLI_array_utils.h" /* For `BLI_array_is_zeroed`. */ +#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.hh" #include "BKE_layer.hh" @@ -28,6 +29,7 @@ #include "DEG_depsgraph.hh" #include "ED_curve.hh" +#include "ED_object.hh" #include "ED_undo.hh" #include "WM_api.hh" diff --git a/source/blender/editors/curves/intern/curves_add.cc b/source/blender/editors/curves/intern/curves_add.cc index 027a0faa126..980ec5765f3 100644 --- a/source/blender/editors/curves/intern/curves_add.cc +++ b/source/blender/editors/curves/intern/curves_add.cc @@ -12,9 +12,10 @@ #include "BKE_attribute.hh" #include "BKE_context.hh" #include "BKE_curves.hh" +#include "BKE_node.hh" #include "BKE_node_runtime.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "ED_curves.hh" #include "ED_node.hh" diff --git a/source/blender/editors/curves/intern/curves_attribute_set.cc b/source/blender/editors/curves/intern/curves_attribute_set.cc index ea31169b749..5e35b12b6e8 100644 --- a/source/blender/editors/curves/intern/curves_attribute_set.cc +++ b/source/blender/editors/curves/intern/curves_attribute_set.cc @@ -11,7 +11,7 @@ #include "BKE_attribute.hh" #include "BKE_attribute_math.hh" #include "BKE_context.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "BKE_type_conversions.hh" #include "WM_api.hh" @@ -26,7 +26,7 @@ #include "RNA_access.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "UI_interface.hh" #include "UI_resources.hh" diff --git a/source/blender/editors/curves/intern/curves_draw.cc b/source/blender/editors/curves/intern/curves_draw.cc index db010aecd55..593e94d7717 100644 --- a/source/blender/editors/curves/intern/curves_draw.cc +++ b/source/blender/editors/curves/intern/curves_draw.cc @@ -12,8 +12,7 @@ #include "BKE_attribute.hh" #include "BKE_context.hh" #include "BKE_curves.hh" -#include "BKE_object_types.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "DEG_depsgraph.hh" @@ -141,8 +140,7 @@ static void stroke_elem_pressure_set(const CurveDrawData *cdd, StrokeElem *selem const float adjust = stroke_elem_radius_from_pressure(cdd, pressure) - stroke_elem_radius_from_pressure(cdd, selem->pressure); madd_v3_v3fl(selem->location_local, selem->normal_local, adjust); - mul_v3_m4v3( - selem->location_world, cdd->vc.obedit->object_to_world().ptr(), selem->location_local); + mul_v3_m4v3(selem->location_world, cdd->vc.obedit->object_to_world, selem->location_local); } selem->pressure = pressure; } @@ -239,11 +237,11 @@ static bool stroke_elem_project_fallback(const CurveDrawData *cdd, cdd->vc.v3d, cdd->vc.region, location_fallback_depth, mval_fl, r_location_world); zero_v3(r_normal_local); } - mul_v3_m4v3(r_location_local, cdd->vc.obedit->world_to_object().ptr(), r_location_world); + mul_v3_m4v3(r_location_local, cdd->vc.obedit->world_to_object, r_location_world); if (!is_zero_v3(r_normal_world)) { copy_v3_v3(r_normal_local, r_normal_world); - mul_transposed_mat3_m4_v3(cdd->vc.obedit->object_to_world().ptr(), r_normal_local); + mul_transposed_mat3_m4_v3(cdd->vc.obedit->object_to_world, r_normal_local); normalize_v3(r_normal_local); } else { @@ -298,8 +296,7 @@ static void curve_draw_stroke_from_operator_elem(wmOperator *op, PointerRNA *ite RNA_float_get_array(itemptr, "mouse", selem->mval); RNA_float_get_array(itemptr, "location", selem->location_world); - mul_v3_m4v3( - selem->location_local, cdd->vc.obedit->world_to_object().ptr(), selem->location_world); + mul_v3_m4v3(selem->location_local, cdd->vc.obedit->world_to_object, selem->location_world); selem->pressure = RNA_float_get(itemptr, "pressure"); } @@ -341,9 +338,7 @@ static void curve_draw_stroke_3d(const bContext * /*C*/, ARegion * /*region*/, v Object *obedit = cdd->vc.obedit; - /* Disabled: not representative in enough cases, and curves draw shape is not per object yet. - * In the future this could be enabled when the object's draw shape is "strand" or "3D".*/ - if (false && cdd->bevel_radius > 0.0f) { + if (cdd->bevel_radius > 0.0f) { BLI_mempool_iter iter; const StrokeElem *selem; @@ -359,7 +354,7 @@ static void curve_draw_stroke_3d(const bContext * /*C*/, ARegion * /*region*/, v /* scale to edit-mode space */ GPU_matrix_push(); - GPU_matrix_mul(obedit->object_to_world().ptr()); + GPU_matrix_mul(obedit->object_to_world); BLI_mempool_iternew(cdd->stroke_elem_pool, &iter); for (selem = static_cast(BLI_mempool_iterstep(&iter)); selem; @@ -441,7 +436,7 @@ static void curve_draw_event_add(wmOperator *op, const wmEvent *event) CurveDrawData *cdd = static_cast(op->customdata); Object *obedit = cdd->vc.obedit; - invert_m4_m4(obedit->runtime->world_to_object.ptr(), obedit->object_to_world().ptr()); + invert_m4_m4(obedit->world_to_object, obedit->object_to_world); StrokeElem *selem = static_cast(BLI_mempool_calloc(cdd->stroke_elem_pool)); @@ -745,7 +740,7 @@ static int curves_draw_exec(bContext *C, wmOperator *op) int stroke_len = BLI_mempool_len(cdd->stroke_elem_pool); - invert_m4_m4(obedit->runtime->world_to_object.ptr(), obedit->object_to_world().ptr()); + invert_m4_m4(obedit->world_to_object, obedit->object_to_world); if (BLI_mempool_len(cdd->stroke_elem_pool) == 0) { curve_draw_stroke_from_operator(op); @@ -1045,8 +1040,8 @@ static int curves_draw_invoke(bContext *C, wmOperator *op, const wmEvent *event) if (cdd->is_curve_2d) { /* 2D overrides other options */ - plane_co = obedit->object_to_world().location(); - plane_no = obedit->object_to_world().ptr()[2]; + plane_co = obedit->object_to_world[3]; + plane_no = obedit->object_to_world[2]; cdd->project.use_plane = true; } else { diff --git a/source/blender/editors/curves/intern/curves_extrude.cc b/source/blender/editors/curves/intern/curves_extrude.cc index acf32fbc43d..1ad9896b2e3 100644 --- a/source/blender/editors/curves/intern/curves_extrude.cc +++ b/source/blender/editors/curves/intern/curves_extrude.cc @@ -3,6 +3,7 @@ * SPDX-License-Identifier: GPL-2.0-or-later */ #include "BKE_attribute.hh" +#include "BKE_context.hh" #include "BKE_curves_utils.hh" #include "WM_api.hh" diff --git a/source/blender/editors/curves/intern/curves_ops.cc b/source/blender/editors/curves/intern/curves_ops.cc index e554a685e3e..c685ee546b2 100644 --- a/source/blender/editors/curves/intern/curves_ops.cc +++ b/source/blender/editors/curves/intern/curves_ops.cc @@ -18,7 +18,7 @@ #include "BLI_utildefines.h" #include "BLI_vector_set.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "ED_curves.hh" #include "ED_object.hh" @@ -43,7 +43,7 @@ #include "BKE_object.hh" #include "BKE_paint.hh" #include "BKE_particle.h" -#include "BKE_report.hh" +#include "BKE_report.h" #include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" @@ -396,7 +396,7 @@ static void try_convert_single_object(Object &curves_ob, particle_system->recalc |= ID_RECALC_PSYS_RESET; DEG_id_tag_update(&surface_ob.id, ID_RECALC_GEOMETRY); - DEG_id_tag_update(&settings.id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&settings.id, ID_RECALC_COPY_ON_WRITE); } static int curves_convert_to_particle_system_exec(bContext *C, wmOperator *op) @@ -485,7 +485,7 @@ static bke::CurvesGeometry particles_to_curves(Object &object, ParticleSystem &p bke::CurvesGeometry curves(points_num, curves_num); curves.offsets_for_write().copy_from(curve_offsets); - const float4x4 &object_to_world_mat = object.object_to_world(); + const float4x4 object_to_world_mat(object.object_to_world); const float4x4 world_to_object_mat = math::invert(object_to_world_mat); MutableSpan positions = curves.positions_for_write(); @@ -548,7 +548,7 @@ static int curves_convert_from_particle_system_exec(bContext *C, wmOperator * /* Object *ob_new = BKE_object_add(&bmain, &scene, &view_layer, OB_CURVES, psys_eval->name); Curves *curves_id = static_cast(ob_new->data); - BKE_object_apply_mat4(ob_new, ob_from_orig->object_to_world().ptr(), true, false); + BKE_object_apply_mat4(ob_new, ob_from_orig->object_to_world, true, false); curves_id->geometry.wrap() = particles_to_curves(*ob_from_eval, *psys_eval); DEG_relations_tag_update(&bmain); diff --git a/source/blender/editors/curves/intern/curves_selection.cc b/source/blender/editors/curves/intern/curves_selection.cc index 4085d2d4e26..8844b0bc30f 100644 --- a/source/blender/editors/curves/intern/curves_selection.cc +++ b/source/blender/editors/curves/intern/curves_selection.cc @@ -7,7 +7,7 @@ */ #include "BLI_array_utils.hh" -#include "BLI_lasso_2d.hh" +#include "BLI_lasso_2d.h" #include "BLI_math_geom.h" #include "BLI_rand.hh" #include "BLI_rect.h" @@ -525,13 +525,16 @@ void apply_selection_operation_at_index(GMutableSpan selection, static std::optional find_closest_point_to_screen_co( const ARegion *region, + const RegionView3D *rv3d, + const Object &object, const Span positions, - const float4x4 &projection, const IndexMask &points_mask, const float2 mouse_pos, float radius, const FindClosestData &initial_closest) { + const float4x4 projection = ED_view3d_ob_project_mat_get(rv3d, &object); + const float radius_sq = pow2f(radius); const FindClosestData new_closest_data = threading::parallel_reduce( points_mask.index_range(), @@ -578,14 +581,17 @@ static std::optional find_closest_point_to_screen_co( static std::optional find_closest_curve_to_screen_co( const ARegion *region, + const RegionView3D *rv3d, + const Object &object, const OffsetIndices points_by_curve, const Span positions, - const float4x4 &projection, const IndexMask &curves_mask, const float2 mouse_pos, float radius, const FindClosestData &initial_closest) { + const float4x4 projection = ED_view3d_ob_project_mat_get(rv3d, &object); + const float radius_sq = pow2f(radius); const FindClosestData new_closest_data = threading::parallel_reduce( @@ -661,9 +667,9 @@ static std::optional find_closest_curve_to_screen_co( std::optional closest_elem_find_screen_space( const ViewContext &vc, + const Object &object, const OffsetIndices points_by_curve, const Span positions, - const float4x4 &projection, const IndexMask &mask, const bke::AttrDomain domain, const int2 coord, @@ -672,17 +678,19 @@ std::optional closest_elem_find_screen_space( switch (domain) { case bke::AttrDomain::Point: return find_closest_point_to_screen_co(vc.region, + vc.rv3d, + object, positions, - projection, mask, float2(coord), ED_view3d_select_dist_px(), initial_closest); case bke::AttrDomain::Curve: return find_closest_curve_to_screen_co(vc.region, + vc.rv3d, + object, points_by_curve, positions, - projection, mask, float2(coord), ED_view3d_select_dist_px(), @@ -696,7 +704,6 @@ std::optional closest_elem_find_screen_space( bool select_box(const ViewContext &vc, bke::CurvesGeometry &curves, const Span positions, - const float4x4 &projection, const IndexMask &mask, const bke::AttrDomain selection_domain, const rcti &rect, @@ -711,6 +718,8 @@ bool select_box(const ViewContext &vc, changed = true; } + const float4x4 projection = ED_view3d_ob_project_mat_get(vc.rv3d, vc.obact); + const OffsetIndices points_by_curve = curves.points_by_curve(); if (selection_domain == bke::AttrDomain::Point) { mask.foreach_index(GrainSize(1024), [&](const int point_i) { @@ -757,14 +766,14 @@ bool select_box(const ViewContext &vc, bool select_lasso(const ViewContext &vc, bke::CurvesGeometry &curves, const Span positions, - const float4x4 &projection_matrix, const IndexMask &mask, const bke::AttrDomain selection_domain, - const Span lasso_coords, + const Span coords, const eSelectOp sel_op) { rcti bbox; - BLI_lasso_boundbox(&bbox, lasso_coords); + const int(*coord_array)[2] = reinterpret_cast(coords.data()); + BLI_lasso_boundbox(&bbox, coord_array, coords.size()); bke::GSpanAttributeWriter selection = ensure_selection_attribute( curves, selection_domain, CD_PROP_BOOL); @@ -775,14 +784,17 @@ bool select_lasso(const ViewContext &vc, changed = true; } + const float4x4 projection = ED_view3d_ob_project_mat_get(vc.rv3d, vc.obact); + const OffsetIndices points_by_curve = curves.points_by_curve(); if (selection_domain == bke::AttrDomain::Point) { mask.foreach_index(GrainSize(1024), [&](const int point_i) { const float2 pos_proj = ED_view3d_project_float_v2_m4( - vc.region, positions[point_i], projection_matrix); + vc.region, positions[point_i], projection); /* Check the lasso bounding box first as an optimization. */ if (BLI_rcti_isect_pt_v(&bbox, int2(pos_proj)) && - BLI_lasso_is_point_inside(lasso_coords, int(pos_proj.x), int(pos_proj.y), IS_CLIPPED)) + BLI_lasso_is_point_inside( + coord_array, coords.size(), int(pos_proj.x), int(pos_proj.y), IS_CLIPPED)) { apply_selection_operation_at_index(selection.span, point_i, sel_op); changed = true; @@ -794,10 +806,11 @@ bool select_lasso(const ViewContext &vc, const IndexRange points = points_by_curve[curve_i]; if (points.size() == 1) { const float2 pos_proj = ED_view3d_project_float_v2_m4( - vc.region, positions[points.first()], projection_matrix); + vc.region, positions[points.first()], projection); /* Check the lasso bounding box first as an optimization. */ if (BLI_rcti_isect_pt_v(&bbox, int2(pos_proj)) && - BLI_lasso_is_point_inside(lasso_coords, int(pos_proj.x), int(pos_proj.y), IS_CLIPPED)) + BLI_lasso_is_point_inside( + coord_array, coords.size(), int(pos_proj.x), int(pos_proj.y), IS_CLIPPED)) { apply_selection_operation_at_index(selection.span, curve_i, sel_op); changed = true; @@ -808,12 +821,13 @@ bool select_lasso(const ViewContext &vc, const float3 pos1 = positions[segment_i]; const float3 pos2 = positions[segment_i + 1]; - const float2 pos1_proj = ED_view3d_project_float_v2_m4(vc.region, pos1, projection_matrix); - const float2 pos2_proj = ED_view3d_project_float_v2_m4(vc.region, pos2, projection_matrix); + const float2 pos1_proj = ED_view3d_project_float_v2_m4(vc.region, pos1, projection); + const float2 pos2_proj = ED_view3d_project_float_v2_m4(vc.region, pos2, projection); /* Check the lasso bounding box first as an optimization. */ if (BLI_rcti_isect_segment(&bbox, int2(pos1_proj), int2(pos2_proj)) && - BLI_lasso_is_edge_inside(lasso_coords, + BLI_lasso_is_edge_inside(coord_array, + coords.size(), int(pos1_proj.x), int(pos1_proj.y), int(pos2_proj.x), @@ -835,7 +849,6 @@ bool select_lasso(const ViewContext &vc, bool select_circle(const ViewContext &vc, bke::CurvesGeometry &curves, const Span positions, - const float4x4 &projection, const IndexMask &mask, const bke::AttrDomain selection_domain, const int2 coord, @@ -852,6 +865,8 @@ bool select_circle(const ViewContext &vc, changed = true; } + const float4x4 projection = ED_view3d_ob_project_mat_get(vc.rv3d, vc.obact); + const OffsetIndices points_by_curve = curves.points_by_curve(); if (selection_domain == bke::AttrDomain::Point) { mask.foreach_index(GrainSize(1024), [&](const int point_i) { diff --git a/source/blender/editors/datafiles/CMakeLists.txt b/source/blender/editors/datafiles/CMakeLists.txt index 837e4968685..6846dbb07f2 100644 --- a/source/blender/editors/datafiles/CMakeLists.txt +++ b/source/blender/editors/datafiles/CMakeLists.txt @@ -613,7 +613,6 @@ set(ICON_NAMES outliner_data_volume volume_data pointcloud_point - internet current_file home documents @@ -875,7 +874,6 @@ set_property(GLOBAL PROPERTY ICON_GEOM_NAMES ops.sculpt.color_filter ops.sculpt.face_set_edit ops.sculpt.lasso_face_set - ops.sculpt.lasso_hide ops.sculpt.lasso_mask ops.sculpt.lasso_trim ops.sculpt.line_mask diff --git a/source/blender/editors/geometry/geometry_attributes.cc b/source/blender/editors/geometry/geometry_attributes.cc index 5244da22353..33b2128cfc3 100644 --- a/source/blender/editors/geometry/geometry_attributes.cc +++ b/source/blender/editors/geometry/geometry_attributes.cc @@ -23,11 +23,11 @@ #include "BKE_mesh.hh" #include "BKE_object_deform.h" #include "BKE_paint.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "BLI_string.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "RNA_access.hh" #include "RNA_define.hh" @@ -687,8 +687,7 @@ static int geometry_attribute_convert_invoke(bContext *C, RNA_property_enum_set(op->ptr, prop, meta_data.data_type); } - return WM_operator_props_dialog_popup( - C, op, 300, IFACE_("Convert Attribute Domain"), IFACE_("Convert")); + return WM_operator_props_dialog_popup(C, op, 300); } static void geometry_attribute_convert_ui(bContext * /*C*/, wmOperator *op) @@ -771,8 +770,7 @@ static int geometry_color_attribute_convert_invoke(bContext *C, RNA_property_enum_set(op->ptr, prop, meta_data.data_type); } - return WM_operator_props_dialog_popup( - C, op, 300, IFACE_("Convert Color Attribute Domain"), IFACE_("Convert")); + return WM_operator_props_dialog_popup(C, op, 300); } static void geometry_color_attribute_convert_ui(bContext * /*C*/, wmOperator *op) diff --git a/source/blender/editors/geometry/geometry_randomization.cc b/source/blender/editors/geometry/geometry_randomization.cc index a67e5db341f..050ea5c6cc1 100644 --- a/source/blender/editors/geometry/geometry_randomization.cc +++ b/source/blender/editors/geometry/geometry_randomization.cc @@ -5,7 +5,7 @@ #include "WM_api.hh" #include "BKE_context.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_main.hh" #include "DEG_depsgraph.hh" diff --git a/source/blender/editors/geometry/node_group_operator.cc b/source/blender/editors/geometry/node_group_operator.cc index d5fc6b73a28..4b00bdba644 100644 --- a/source/blender/editors/geometry/node_group_operator.cc +++ b/source/blender/editors/geometry/node_group_operator.cc @@ -34,7 +34,7 @@ #include "BKE_node_runtime.hh" #include "BKE_object.hh" #include "BKE_pointcloud.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "BKE_screen.hh" #include "DNA_object_types.h" @@ -56,7 +56,7 @@ #include "ED_mesh.hh" #include "ED_sculpt.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "FN_lazy_function_execute.hh" @@ -459,7 +459,7 @@ static int run_node_group_invoke(bContext *C, wmOperator *op, const wmEvent * /* return OPERATOR_CANCELLED; } - nodes::update_input_properties_from_node_tree(*node_tree, op->properties, *op->properties); + nodes::update_input_properties_from_node_tree(*node_tree, op->properties, true, *op->properties); nodes::update_output_properties_from_node_tree(*node_tree, op->properties, *op->properties); return run_node_group_exec(C, op); @@ -803,7 +803,7 @@ void clear_operator_asset_trees() static asset::AssetItemTree build_catalog_tree(const bContext &C, const Object &active_object) { - asset::AssetFilterSettings type_filter{}; + AssetFilterSettings type_filter{}; type_filter.id_types = FILTER_ID_NT; const GeometryNodeAssetTraitFlag flag = asset_flag_for_context(active_object); auto meta_data_filter = [&](const AssetMetaData &meta_data) { @@ -819,7 +819,6 @@ static asset::AssetItemTree build_catalog_tree(const bContext &C, const Object & return true; }; const AssetLibraryReference library = asset_system::all_library_reference(); - asset_system::all_library_reload_catalogs_if_dirty(); return asset::build_filtered_all_catalog_tree(library, C, type_filter, meta_data_filter); } @@ -912,7 +911,7 @@ static void catalog_assets_draw(const bContext *C, Menu *menu) } const auto &menu_path = *static_cast(menu_path_ptr.data); const Span assets = tree->assets_per_path.lookup(menu_path); - const asset_system::AssetCatalogTreeItem *catalog_item = tree->catalogs.find_item(menu_path); + asset_system::AssetCatalogTreeItem *catalog_item = tree->catalogs.find_item(menu_path); BLI_assert(catalog_item != nullptr); uiLayout *layout = menu->layout; @@ -945,7 +944,7 @@ static void catalog_assets_draw(const bContext *C, Menu *menu) return; } - catalog_item->foreach_child([&](const asset_system::AssetCatalogTreeItem &item) { + catalog_item->foreach_child([&](asset_system::AssetCatalogTreeItem &item) { if (builtin_menus.contains_as(item.catalog_path().str())) { return; } @@ -1126,7 +1125,7 @@ void ui_template_node_operator_asset_root_items(uiLayout &layout, const bContext const Set builtin_menus = get_builtin_menus(ObjectType(active_object->type), eObjectMode(active_object->mode)); - tree->catalogs.foreach_root_item([&](const asset_system::AssetCatalogTreeItem &item) { + tree->catalogs.foreach_root_item([&](asset_system::AssetCatalogTreeItem &item) { if (!builtin_menus.contains_as(item.catalog_path().str())) { asset::draw_menu_for_catalog( screen, *all_library, item, "GEO_MT_node_operator_catalog_assets", layout); diff --git a/source/blender/editors/gizmo_library/gizmo_draw_utils.cc b/source/blender/editors/gizmo_library/gizmo_draw_utils.cc index 09b0d89b679..019d2431a97 100644 --- a/source/blender/editors/gizmo_library/gizmo_draw_utils.cc +++ b/source/blender/editors/gizmo_library/gizmo_draw_utils.cc @@ -6,14 +6,25 @@ * \ingroup edgizmolib */ +#include "BLI_listbase.h" + +#include "BKE_context.hh" + +#include "ED_screen.hh" +#include "ED_view3d.hh" + #include "GPU_batch.h" #include "GPU_immediate.h" #include "MEM_guardedalloc.h" +#include "RNA_access.hh" + +#include "WM_api.hh" #include "WM_types.hh" -/* only for separate init/exit calls (wm_gizmotype_init/wm_gizmotype_free) */ +/* only for own init/exit calls (wm_gizmotype_init/wm_gizmotype_free) */ +#include "wm.hh" /* own includes */ #include "gizmo_library_intern.h" diff --git a/source/blender/editors/gizmo_library/gizmo_library_presets.cc b/source/blender/editors/gizmo_library/gizmo_library_presets.cc index 22953a49ce2..0ab4879537e 100644 --- a/source/blender/editors/gizmo_library/gizmo_library_presets.cc +++ b/source/blender/editors/gizmo_library/gizmo_library_presets.cc @@ -14,12 +14,19 @@ #include "BLI_math_matrix.h" #include "BLI_math_rotation.h" +#include "BLI_math_vector.h" + +#include "BKE_context.hh" #include "GPU_matrix.h" #include "GPU_select.hh" +#include "DEG_depsgraph.hh" + #include "WM_types.hh" +#include "ED_view3d.hh" + /* own includes */ #include "ED_gizmo_library.hh" /* own include */ #include "gizmo_library_intern.h" /* own include */ diff --git a/source/blender/editors/gizmo_library/gizmo_library_utils.cc b/source/blender/editors/gizmo_library/gizmo_library_utils.cc index aa4b73bb55c..6cc2f4562ab 100644 --- a/source/blender/editors/gizmo_library/gizmo_library_utils.cc +++ b/source/blender/editors/gizmo_library/gizmo_library_utils.cc @@ -14,7 +14,7 @@ #include "DNA_view3d_types.h" #include "BKE_context.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_main.hh" #include "BLI_math_geom.h" diff --git a/source/blender/editors/gizmo_library/gizmo_types/arrow3d_gizmo.cc b/source/blender/editors/gizmo_library/gizmo_types/arrow3d_gizmo.cc index c5f244ed45d..47226d16863 100644 --- a/source/blender/editors/gizmo_library/gizmo_types/arrow3d_gizmo.cc +++ b/source/blender/editors/gizmo_library/gizmo_types/arrow3d_gizmo.cc @@ -44,6 +44,8 @@ #include "ED_screen.hh" #include "ED_view3d.hh" +#include "UI_interface.hh" + /* own includes */ #include "../gizmo_geometry.h" #include "../gizmo_library_intern.h" @@ -363,11 +365,14 @@ static int gizmo_arrow_modal(bContext *C, float arrow_no_proj[3]; project_plane_v3_v3v3(arrow_no_proj, arrow_no, proj[j].ray_direction); + normalize_v3(arrow_no_proj); + float plane[4]; + plane_from_point_normal_v3(plane, proj[j].ray_origin, arrow_no_proj); + float lambda; - if (isect_ray_plane_v3_factor(arrow_co, arrow_no, proj[j].ray_origin, arrow_no_proj, &lambda)) - { + if (isect_ray_plane_v3(arrow_co, arrow_no, plane, &lambda, false)) { madd_v3_v3v3fl(proj[j].location, arrow_co, arrow_no, lambda); ok++; } diff --git a/source/blender/editors/gizmo_library/gizmo_types/blank3d_gizmo.cc b/source/blender/editors/gizmo_library/gizmo_types/blank3d_gizmo.cc index e0b7bf775b6..b9866614cc2 100644 --- a/source/blender/editors/gizmo_library/gizmo_types/blank3d_gizmo.cc +++ b/source/blender/editors/gizmo_library/gizmo_types/blank3d_gizmo.cc @@ -10,6 +10,8 @@ * \brief Gizmo to use as a fallback (catch events). */ +#include "BKE_context.hh" + #include "ED_gizmo_library.hh" #include "WM_api.hh" diff --git a/source/blender/editors/gizmo_library/gizmo_types/button2d_gizmo.cc b/source/blender/editors/gizmo_library/gizmo_types/button2d_gizmo.cc index 99f9e258a07..1f46fc38ee7 100644 --- a/source/blender/editors/gizmo_library/gizmo_types/button2d_gizmo.cc +++ b/source/blender/editors/gizmo_library/gizmo_types/button2d_gizmo.cc @@ -38,11 +38,15 @@ #include "WM_types.hh" #include "ED_gizmo_library.hh" +#include "ED_screen.hh" #include "ED_view3d.hh" +#include "UI_interface.hh" #include "UI_interface_icons.hh" +#include "UI_resources.hh" /* own includes */ +#include "../gizmo_geometry.h" #include "../gizmo_library_intern.h" /* -------------------------------------------------------------------- */ diff --git a/source/blender/editors/gizmo_library/gizmo_types/cage2d_gizmo.cc b/source/blender/editors/gizmo_library/gizmo_types/cage2d_gizmo.cc index 544cb92296e..d6a68547db8 100644 --- a/source/blender/editors/gizmo_library/gizmo_types/cage2d_gizmo.cc +++ b/source/blender/editors/gizmo_library/gizmo_types/cage2d_gizmo.cc @@ -38,6 +38,7 @@ #include "ED_gizmo_library.hh" #include "ED_screen.hh" +#include "ED_view3d.hh" /* own includes */ #include "../gizmo_library_intern.h" diff --git a/source/blender/editors/gizmo_library/gizmo_types/dial3d_gizmo.cc b/source/blender/editors/gizmo_library/gizmo_types/dial3d_gizmo.cc index 94b360e517e..af562be8fee 100644 --- a/source/blender/editors/gizmo_library/gizmo_types/dial3d_gizmo.cc +++ b/source/blender/editors/gizmo_library/gizmo_types/dial3d_gizmo.cc @@ -10,7 +10,7 @@ * 3D Gizmo * * \brief Circle shaped gizmo for circular interaction. - * Currently no separate handling, use with operator only. + * Currently no own handling, use with operator only. * * - `matrix[0]` is derived from Y and Z. * - `matrix[1]` is 'up' when DialGizmo.use_start_y_axis is set. @@ -42,6 +42,7 @@ #include "ED_view3d.hh" /* own includes */ +#include "../gizmo_geometry.h" #include "../gizmo_library_intern.h" // /** To use custom dials exported to `geom_dial_gizmo.cc`. */ @@ -214,10 +215,9 @@ static void dial_ghostarc_draw_helpline(const float angle, /** * Draws segments to indicate the position of each increment. */ -static void dial_ghostarc_draw_incremental_angle(const float incremental_angle, - const float offset, - const float angle_delta) +static void dial_ghostarc_draw_incremental_angle(const float incremental_angle, const float offset) { + const int tot_incr = (2 * M_PI) / incremental_angle; uint pos = GPU_vertformat_attr_add(immVertexFormat(), "pos", GPU_COMP_F32, 3, GPU_FETCH_FLOAT); immBindBuiltinProgram(GPU_SHADER_3D_POLYLINE_UNIFORM_COLOR); @@ -229,21 +229,12 @@ static void dial_ghostarc_draw_incremental_angle(const float incremental_angle, immUniform2fv("viewportSize", &viewport[2]); immUniform1f("lineWidth", U.pixelsize); - const int current_increment = roundf(angle_delta / incremental_angle); - const int total_increment = roundf((M_PI * 2.0f) / incremental_angle); - - immBegin(GPU_PRIM_LINES, total_increment * 2); - - /* Chop off excess full circles, draw an arc of ticks centered at current increment; - * if there's no even division of circle by increment, - * ends of the arc will move with the rotation. */ - const float start_offset = fmodf( - offset + incremental_angle * (current_increment - total_increment / 2), M_PI * 2.0f); + immBegin(GPU_PRIM_LINES, tot_incr * 2); float v[3] = {0}; - for (int i = 0; i < total_increment; i++) { - v[0] = sinf(start_offset + incremental_angle * i); - v[1] = cosf(start_offset + incremental_angle * i); + for (int i = 0; i < tot_incr; i++) { + v[0] = sinf(offset + incremental_angle * i); + v[1] = cosf(offset + incremental_angle * i); mul_v2_fl(v, DIAL_WIDTH * 1.1f); immVertex3fv(pos, v); @@ -649,8 +640,7 @@ static void dial_3d_draw_util(const float matrix_final[4][4], } if (params->angle_increment) { - dial_ghostarc_draw_incremental_angle( - params->angle_increment, params->angle_ofs, params->angle_delta); + dial_ghostarc_draw_incremental_angle(params->angle_increment, params->angle_ofs); } /* Draw actual dial gizmo. */ diff --git a/source/blender/editors/gizmo_library/gizmo_types/move3d_gizmo.cc b/source/blender/editors/gizmo_library/gizmo_types/move3d_gizmo.cc index 61ea403cd70..fb1c25bdeb2 100644 --- a/source/blender/editors/gizmo_library/gizmo_types/move3d_gizmo.cc +++ b/source/blender/editors/gizmo_library/gizmo_types/move3d_gizmo.cc @@ -41,6 +41,7 @@ #include "ED_view3d.hh" /* own includes */ +#include "../gizmo_geometry.h" #include "../gizmo_library_intern.h" #define MVAL_MAX_PX_DIST 12.0f diff --git a/source/blender/editors/gizmo_library/gizmo_types/primitive3d_gizmo.cc b/source/blender/editors/gizmo_library/gizmo_types/primitive3d_gizmo.cc index dc710623b60..d352b851caf 100644 --- a/source/blender/editors/gizmo_library/gizmo_types/primitive3d_gizmo.cc +++ b/source/blender/editors/gizmo_library/gizmo_types/primitive3d_gizmo.cc @@ -10,7 +10,7 @@ * 3D Gizmo * * \brief Gizmo with primitive drawing type (plane, cube, etc.). - * Currently only plane primitive supported without its own handling, use with operator only. + * Currently only plane primitive supported without own handling, use with operator only. */ #include "MEM_guardedalloc.h" @@ -19,11 +19,14 @@ #include "DNA_space_types.h" #include "DNA_view3d_types.h" +#include "BKE_context.hh" + #include "GPU_immediate.h" #include "GPU_matrix.h" #include "GPU_select.hh" #include "GPU_state.h" +#include "RNA_access.hh" #include "RNA_define.hh" #include "WM_api.hh" diff --git a/source/blender/editors/gizmo_library/gizmo_types/snap3d_gizmo.cc b/source/blender/editors/gizmo_library/gizmo_types/snap3d_gizmo.cc index 659ba821ee4..30b294326cf 100644 --- a/source/blender/editors/gizmo_library/gizmo_types/snap3d_gizmo.cc +++ b/source/blender/editors/gizmo_library/gizmo_types/snap3d_gizmo.cc @@ -14,15 +14,21 @@ #include "MEM_guardedalloc.h" +#include "BLI_listbase.h" #include "BLI_math_color.h" #include "BLI_math_vector.h" #include "BKE_context.hh" +#include "BKE_global.h" +#include "BKE_main.hh" #include "ED_gizmo_library.hh" #include "ED_screen.hh" +#include "ED_transform_snap_object_context.hh" #include "ED_view3d.hh" +#include "UI_resources.hh" + #include "RNA_access.hh" #include "RNA_define.hh" #include "RNA_prototypes.h" @@ -35,7 +41,6 @@ struct SnapGizmo3D { wmGizmo gizmo; V3DSnapCursorState *snap_state; - V3DSnapCursorState snap_state_stored; }; /* -------------------------------------------------------------------- */ @@ -189,7 +194,6 @@ static void gizmo_snap_rna_snap_srouce_type_set_fn(PointerRNA * /*ptr*/, static void snap_cursor_free(SnapGizmo3D *snap_gizmo) { if (snap_gizmo->snap_state) { - snap_gizmo->snap_state_stored = *snap_gizmo->snap_state; ED_view3d_cursor_snap_state_free(snap_gizmo->snap_state); snap_gizmo->snap_state = nullptr; } @@ -218,6 +222,18 @@ static bool snap_cursor_poll(ARegion *region, void *data) return true; } +static void snap_cursor_init(SnapGizmo3D *snap_gizmo) +{ + snap_gizmo->snap_state = ED_view3d_cursor_snap_state_create(); + snap_gizmo->snap_state->draw_point = true; + snap_gizmo->snap_state->draw_plane = false; + + rgba_float_to_uchar(snap_gizmo->snap_state->target_color, snap_gizmo->gizmo.color); + + snap_gizmo->snap_state->poll = snap_cursor_poll; + snap_gizmo->snap_state->poll_data = snap_gizmo; +} + /** \} */ /* -------------------------------------------------------------------- */ @@ -227,23 +243,14 @@ static bool snap_cursor_poll(ARegion *region, void *data) static void snap_gizmo_setup(wmGizmo *gz) { gz->flag |= WM_GIZMO_NO_TOOLTIP; - - SnapGizmo3D *snap_gizmo = (SnapGizmo3D *)gz; - snap_gizmo->snap_state = ED_view3d_cursor_snap_state_create(); - snap_gizmo->snap_state->draw_point = true; - snap_gizmo->snap_state->draw_plane = false; - snap_gizmo->snap_state->poll = snap_cursor_poll; - snap_gizmo->snap_state->poll_data = snap_gizmo; - - snap_gizmo->snap_state_stored = *snap_gizmo->snap_state; + snap_cursor_init((SnapGizmo3D *)gz); } static void snap_gizmo_draw(const bContext * /*C*/, wmGizmo *gz) { SnapGizmo3D *snap_gizmo = (SnapGizmo3D *)gz; if (snap_gizmo->snap_state == nullptr) { - snap_gizmo->snap_state = ED_view3d_cursor_snap_state_create(); - *snap_gizmo->snap_state = snap_gizmo->snap_state_stored; + snap_cursor_init(snap_gizmo); } /* All drawing is handled at the paint cursor. diff --git a/source/blender/editors/gpencil_legacy/annotate_draw.cc b/source/blender/editors/gpencil_legacy/annotate_draw.cc index 700a1c80edd..67fb51dc7ad 100644 --- a/source/blender/editors/gpencil_legacy/annotate_draw.cc +++ b/source/blender/editors/gpencil_legacy/annotate_draw.cc @@ -20,7 +20,11 @@ #include "BLI_listbase.h" #include "BLI_utildefines.h" +#include "BLF_api.hh" +#include "BLT_translation.h" + #include "DNA_gpencil_legacy_types.h" +#include "DNA_object_types.h" #include "DNA_scene_types.h" #include "DNA_screen_types.h" #include "DNA_space_types.h" @@ -28,7 +32,7 @@ #include "DNA_view3d_types.h" #include "BKE_context.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_gpencil_legacy.h" #include "WM_api.hh" @@ -39,8 +43,12 @@ #include "ED_gpencil_legacy.hh" #include "ED_screen.hh" +#include "ED_space_api.hh" #include "ED_view3d.hh" +#include "UI_interface_icons.hh" +#include "UI_resources.hh" + /* ************************************************** */ /* GREASE PENCIL DRAWING */ diff --git a/source/blender/editors/gpencil_legacy/annotate_paint.cc b/source/blender/editors/gpencil_legacy/annotate_paint.cc index 8831ed7608f..f5701212b6f 100644 --- a/source/blender/editors/gpencil_legacy/annotate_paint.cc +++ b/source/blender/editors/gpencil_legacy/annotate_paint.cc @@ -18,13 +18,16 @@ #include "BLI_time.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" -#include "BKE_callbacks.hh" +#include "BKE_callbacks.h" #include "BKE_context.hh" +#include "BKE_global.h" #include "BKE_gpencil_geom_legacy.h" #include "BKE_gpencil_legacy.h" -#include "BKE_report.hh" +#include "BKE_layer.hh" +#include "BKE_main.hh" +#include "BKE_report.h" #include "BKE_screen.hh" #include "BKE_tracking.h" @@ -51,6 +54,8 @@ #include "WM_api.hh" #include "WM_types.hh" +#include "DEG_depsgraph.hh" + #include "gpencil_intern.h" /* ******************************************* */ @@ -2146,7 +2151,7 @@ static void annotation_draw_apply_event( } } - p->curtime = BLI_time_now_seconds(); + p->curtime = BLI_check_seconds_timer(); /* handle pressure sensitivity (which is supplied by tablets or otherwise 1.0) */ p->pressure = event->tablet.pressure; diff --git a/source/blender/editors/gpencil_legacy/drawgpencil.cc b/source/blender/editors/gpencil_legacy/drawgpencil.cc index dceab19d750..efcfde326c3 100644 --- a/source/blender/editors/gpencil_legacy/drawgpencil.cc +++ b/source/blender/editors/gpencil_legacy/drawgpencil.cc @@ -18,26 +18,50 @@ #include "BLI_sys_types.h" #include "BLI_math_matrix.h" +#include "BLI_polyfill_2d.h" #include "BLI_utildefines.h" +#include "BLF_api.hh" +#include "BLT_translation.h" + #include "DNA_brush_types.h" #include "DNA_gpencil_legacy_types.h" #include "DNA_material_types.h" #include "DNA_object_types.h" +#include "DNA_scene_types.h" +#include "DNA_screen_types.h" +#include "DNA_space_types.h" #include "DNA_userdef_types.h" #include "DNA_view3d_types.h" +#include "BKE_brush.hh" +#include "BKE_context.hh" +#include "BKE_global.h" #include "BKE_gpencil_legacy.h" +#include "BKE_image.h" #include "BKE_material.h" +#include "BKE_paint.hh" + +#include "DEG_depsgraph.hh" + +#include "WM_api.hh" #include "GPU_batch.h" #include "GPU_immediate.h" #include "GPU_matrix.h" #include "GPU_shader_shared.h" #include "GPU_state.h" -#include "GPU_uniform_buffer.hh" +#include "GPU_uniform_buffer.h" #include "ED_gpencil_legacy.hh" +#include "ED_screen.hh" +#include "ED_space_api.hh" +#include "ED_view3d.hh" + +#include "UI_interface_icons.hh" +#include "UI_resources.hh" + +#include "IMB_imbuf_types.hh" #include "gpencil_intern.h" diff --git a/source/blender/editors/gpencil_legacy/editaction_gpencil.cc b/source/blender/editors/gpencil_legacy/editaction_gpencil.cc index e3960e77d34..5c022634aa2 100644 --- a/source/blender/editors/gpencil_legacy/editaction_gpencil.cc +++ b/source/blender/editors/gpencil_legacy/editaction_gpencil.cc @@ -20,7 +20,9 @@ #include "DNA_gpencil_legacy_types.h" #include "DNA_scene_types.h" +#include "BKE_fcurve.h" #include "BKE_gpencil_legacy.h" +#include "BKE_report.h" #include "ED_anim_api.hh" #include "ED_gpencil_legacy.hh" diff --git a/source/blender/editors/gpencil_legacy/gpencil_add_blank.cc b/source/blender/editors/gpencil_legacy/gpencil_add_blank.cc index 045f0f8cf28..8d6a7ffa9ff 100644 --- a/source/blender/editors/gpencil_legacy/gpencil_add_blank.cc +++ b/source/blender/editors/gpencil_legacy/gpencil_add_blank.cc @@ -16,9 +16,12 @@ #include "DNA_scene_types.h" #include "BKE_context.hh" +#include "BKE_gpencil_geom_legacy.h" #include "BKE_gpencil_legacy.h" +#include "BKE_main.hh" +#include "BKE_material.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DEG_depsgraph.hh" diff --git a/source/blender/editors/gpencil_legacy/gpencil_add_lineart.cc b/source/blender/editors/gpencil_legacy/gpencil_add_lineart.cc index b4477c79d46..25e3dee5de9 100644 --- a/source/blender/editors/gpencil_legacy/gpencil_add_lineart.cc +++ b/source/blender/editors/gpencil_legacy/gpencil_add_lineart.cc @@ -11,16 +11,23 @@ #include "DNA_gpencil_legacy_types.h" #include "DNA_material_types.h" #include "DNA_object_types.h" +#include "DNA_scene_types.h" +#include "BKE_brush.hh" #include "BKE_context.hh" +#include "BKE_gpencil_geom_legacy.h" #include "BKE_gpencil_legacy.h" +#include "BKE_lib_id.hh" +#include "BKE_main.hh" +#include "BKE_material.h" #include "BLI_math_color.h" #include "BLI_math_vector.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DEG_depsgraph.hh" +#include "DEG_depsgraph_query.hh" #include "ED_gpencil_legacy.hh" diff --git a/source/blender/editors/gpencil_legacy/gpencil_add_monkey.cc b/source/blender/editors/gpencil_legacy/gpencil_add_monkey.cc index 152ea8adbe7..2a99e53bb1c 100644 --- a/source/blender/editors/gpencil_legacy/gpencil_add_monkey.cc +++ b/source/blender/editors/gpencil_legacy/gpencil_add_monkey.cc @@ -19,8 +19,10 @@ #include "BKE_context.hh" #include "BKE_gpencil_geom_legacy.h" #include "BKE_gpencil_legacy.h" +#include "BKE_main.hh" +#include "BKE_material.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DEG_depsgraph.hh" diff --git a/source/blender/editors/gpencil_legacy/gpencil_add_stroke.cc b/source/blender/editors/gpencil_legacy/gpencil_add_stroke.cc index 1ce5a2f51fd..57c9fb85a49 100644 --- a/source/blender/editors/gpencil_legacy/gpencil_add_stroke.cc +++ b/source/blender/editors/gpencil_legacy/gpencil_add_stroke.cc @@ -18,8 +18,10 @@ #include "BKE_context.hh" #include "BKE_gpencil_geom_legacy.h" #include "BKE_gpencil_legacy.h" +#include "BKE_main.hh" +#include "BKE_material.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DEG_depsgraph.hh" diff --git a/source/blender/editors/gpencil_legacy/gpencil_armature.cc b/source/blender/editors/gpencil_legacy/gpencil_armature.cc index 3d818b9416f..0c979105485 100644 --- a/source/blender/editors/gpencil_legacy/gpencil_armature.cc +++ b/source/blender/editors/gpencil_legacy/gpencil_armature.cc @@ -24,6 +24,7 @@ #include "DNA_armature_types.h" #include "DNA_gpencil_legacy_types.h" #include "DNA_meshdata_types.h" +#include "DNA_scene_types.h" #include "BKE_action.h" #include "BKE_armature.hh" @@ -32,8 +33,9 @@ #include "BKE_gpencil_legacy.h" #include "BKE_gpencil_modifier_legacy.h" #include "BKE_layer.hh" +#include "BKE_main.hh" #include "BKE_object_deform.h" -#include "BKE_report.hh" +#include "BKE_report.h" #include "WM_api.hh" #include "WM_types.hh" @@ -338,8 +340,8 @@ static void gpencil_add_verts_to_dgroups( copy_v3_v3(tip[j], bone->arm_tail); } - mul_m4_v3(ob_arm->object_to_world().ptr(), root[j]); - mul_m4_v3(ob_arm->object_to_world().ptr(), tip[j]); + mul_m4_v3(ob_arm->object_to_world, root[j]); + mul_m4_v3(ob_arm->object_to_world, tip[j]); selected[j] = 1; @@ -374,7 +376,7 @@ static void gpencil_add_verts_to_dgroups( /* transform stroke points to global space */ for (i = 0, pt = gps->points; i < gps->totpoints; i++, pt++) { copy_v3_v3(verts[i], &pt->x); - mul_m4_v3(ob->object_to_world().ptr(), verts[i]); + mul_m4_v3(ob->object_to_world, verts[i]); } /* loop groups and assign weight */ diff --git a/source/blender/editors/gpencil_legacy/gpencil_bake_animation.cc b/source/blender/editors/gpencil_legacy/gpencil_bake_animation.cc index 2f3e219da2e..353b230c552 100644 --- a/source/blender/editors/gpencil_legacy/gpencil_bake_animation.cc +++ b/source/blender/editors/gpencil_legacy/gpencil_bake_animation.cc @@ -11,22 +11,26 @@ #include "BLI_blenlib.h" #include "BLI_ghash.h" #include "BLI_math_matrix.h" +#include "BLI_math_vector.h" #include "DNA_anim_types.h" #include "DNA_gpencil_legacy_types.h" +#include "DNA_material_types.h" #include "DNA_scene_types.h" #include "DNA_screen_types.h" -#include "BKE_anim_data.hh" +#include "BKE_anim_data.h" #include "BKE_context.hh" -#include "BKE_duplilist.hh" +#include "BKE_duplilist.h" #include "BKE_gpencil_geom_legacy.h" #include "BKE_gpencil_legacy.h" #include "BKE_gpencil_modifier_legacy.h" +#include "BKE_layer.hh" +#include "BKE_main.hh" #include "BKE_material.h" -#include "BKE_scene.hh" - -#include "BLT_translation.hh" +#include "BKE_object.hh" +#include "BKE_report.h" +#include "BKE_scene.h" #include "DEG_depsgraph.hh" #include "DEG_depsgraph_query.hh" @@ -218,7 +222,7 @@ static int gpencil_bake_grease_pencil_animation_exec(bContext *C, wmOperator *op ushort local_view_bits = (v3d && v3d->localvd) ? v3d->local_view_uid : 0; ob_gpencil = ED_gpencil_add_object(C, scene->cursor.location, local_view_bits); float invmat[4][4]; - invert_m4_m4(invmat, ob_gpencil->object_to_world().ptr()); + invert_m4_m4(invmat, ob_gpencil->object_to_world); bGPdata *gpd_dst = (bGPdata *)ob_gpencil->data; gpd_dst->draw_mode = GP_DRAWMODE_2D; @@ -319,7 +323,7 @@ static int gpencil_bake_grease_pencil_animation_exec(bContext *C, wmOperator *op bGPDspoint *pt = &gps->points[j]; pt->runtime.idx_orig = 0; pt->runtime.pt_orig = nullptr; - mul_m4_v3(ob_eval->object_to_world().ptr(), &pt->x); + mul_m4_v3(ob_eval->object_to_world, &pt->x); mul_m4_v3(invmat, &pt->x); } @@ -352,7 +356,7 @@ static int gpencil_bake_grease_pencil_animation_exec(bContext *C, wmOperator *op /* Notifiers. */ DEG_relations_tag_update(bmain); DEG_id_tag_update(&scene->id, ID_RECALC_SELECT); - DEG_id_tag_update(&gpd_dst->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&gpd_dst->id, ID_RECALC_COPY_ON_WRITE); WM_event_add_notifier(C, NC_OBJECT | NA_ADDED, nullptr); WM_event_add_notifier(C, NC_SCENE | ND_OB_ACTIVE, scene); @@ -387,8 +391,7 @@ static int gpencil_bake_grease_pencil_animation_invoke(bContext *C, } /* Show popup dialog to allow editing. */ - return WM_operator_props_dialog_popup( - C, op, 250, IFACE_("Bake Object Transform to Grease Pencil"), IFACE_("Bake")); + return WM_operator_props_dialog_popup(C, op, 250); } void GPENCIL_OT_bake_grease_pencil_animation(wmOperatorType *ot) diff --git a/source/blender/editors/gpencil_legacy/gpencil_convert.cc b/source/blender/editors/gpencil_legacy/gpencil_convert.cc index 8617ac13bdf..bf5704057b6 100644 --- a/source/blender/editors/gpencil_legacy/gpencil_convert.cc +++ b/source/blender/editors/gpencil_legacy/gpencil_convert.cc @@ -21,7 +21,10 @@ #include "BLI_rand.h" #include "BLI_utildefines.h" +#include "BLT_translation.h" + #include "DNA_anim_types.h" +#include "DNA_collection_types.h" #include "DNA_curve_types.h" #include "DNA_gpencil_legacy_types.h" #include "DNA_material_types.h" @@ -33,21 +36,27 @@ #include "DNA_view3d_types.h" #include "BKE_animsys.h" -#include "BKE_collection.hh" +#include "BKE_collection.h" #include "BKE_context.hh" #include "BKE_curve.hh" -#include "BKE_fcurve.hh" -#include "BKE_global.hh" +#include "BKE_fcurve.h" +#include "BKE_global.h" #include "BKE_gpencil_geom_legacy.h" #include "BKE_gpencil_legacy.h" #include "BKE_image.h" #include "BKE_layer.hh" +#include "BKE_main.hh" +#include "BKE_material.h" #include "BKE_object.hh" -#include "BKE_report.hh" +#include "BKE_report.h" +#include "BKE_scene.h" +#include "BKE_tracking.h" #include "DEG_depsgraph.hh" #include "DEG_depsgraph_query.hh" +#include "UI_interface.hh" + #include "WM_api.hh" #include "WM_types.hh" @@ -61,7 +70,9 @@ #include "ANIM_animdata.hh" #include "ANIM_keyframing.hh" +#include "ED_clip.hh" #include "ED_gpencil_legacy.hh" +#include "ED_keyframing.hh" #include "ED_object.hh" #include "ED_view3d.hh" diff --git a/source/blender/editors/gpencil_legacy/gpencil_data.cc b/source/blender/editors/gpencil_legacy/gpencil_data.cc index aee22c46ee2..5aee0c140bf 100644 --- a/source/blender/editors/gpencil_legacy/gpencil_data.cc +++ b/source/blender/editors/gpencil_legacy/gpencil_data.cc @@ -25,19 +25,21 @@ #include "BLI_string_utils.hh" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_anim_types.h" #include "DNA_brush_types.h" #include "DNA_gpencil_legacy_types.h" #include "DNA_material_types.h" #include "DNA_meshdata_types.h" +#include "DNA_modifier_types.h" #include "DNA_object_types.h" #include "DNA_scene_types.h" #include "DNA_screen_types.h" +#include "DNA_space_types.h" #include "DNA_view3d_types.h" -#include "BKE_anim_data.hh" +#include "BKE_anim_data.h" #include "BKE_animsys.h" #include "BKE_brush.hh" #include "BKE_context.hh" @@ -48,8 +50,11 @@ #include "BKE_lib_id.hh" #include "BKE_main.hh" #include "BKE_material.h" +#include "BKE_modifier.hh" +#include "BKE_object.hh" #include "BKE_paint.hh" -#include "BKE_report.hh" +#include "BKE_report.h" +#include "BKE_scene.h" #include "UI_interface.hh" #include "UI_resources.hh" @@ -66,6 +71,7 @@ #include "DEG_depsgraph.hh" #include "DEG_depsgraph_build.hh" +#include "DEG_depsgraph_query.hh" #include "gpencil_intern.h" @@ -241,7 +247,8 @@ static int gpencil_layer_add_exec(bContext *C, wmOperator *op) /* notifiers */ if (gpd) { - DEG_id_tag_update(&gpd->id, ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY | ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&gpd->id, + ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY | ID_RECALC_COPY_ON_WRITE); } WM_event_add_notifier(C, NC_GPENCIL | ND_DATA | NA_EDITED, nullptr); WM_event_add_notifier(C, NC_GPENCIL | ND_DATA | NA_SELECTED, nullptr); @@ -619,8 +626,8 @@ static int gpencil_layer_duplicate_object_exec(bContext *C, wmOperator *op) } /* notifiers */ DEG_id_tag_update(&gpd_dst->id, - ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY | ID_RECALC_SYNC_TO_EVAL); - DEG_id_tag_update(&ob->id, ID_RECALC_SYNC_TO_EVAL); + ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY | ID_RECALC_COPY_ON_WRITE); + DEG_id_tag_update(&ob->id, ID_RECALC_COPY_ON_WRITE); } CTX_DATA_END; @@ -1893,7 +1900,7 @@ static int gpencil_material_lock_unsused_exec(bContext *C, wmOperator * /*op*/) Material *tmp_ma = BKE_object_material_get(ob, i + 1); if (tmp_ma) { tmp_ma->gp_style->flag |= GP_MATERIAL_LOCKED; - DEG_id_tag_update(&tmp_ma->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&tmp_ma->id, ID_RECALC_COPY_ON_WRITE); } } @@ -1913,7 +1920,7 @@ static int gpencil_material_lock_unsused_exec(bContext *C, wmOperator * /*op*/) Material *tmp_ma = BKE_object_material_get(ob, gps->mat_nr + 1); if (tmp_ma) { tmp_ma->gp_style->flag &= ~GP_MATERIAL_LOCKED; - DEG_id_tag_update(&tmp_ma->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&tmp_ma->id, ID_RECALC_COPY_ON_WRITE); } changed = true; @@ -1926,8 +1933,8 @@ static int gpencil_material_lock_unsused_exec(bContext *C, wmOperator * /*op*/) /* updates */ DEG_id_tag_update(&gpd->id, ID_RECALC_GEOMETRY); - /* Copy-on-eval tag is needed, or else no refresh happens */ - DEG_id_tag_update(&gpd->id, ID_RECALC_SYNC_TO_EVAL); + /* copy on write tag is needed, or else no refresh happens */ + DEG_id_tag_update(&gpd->id, ID_RECALC_COPY_ON_WRITE); /* notifiers */ DEG_id_tag_update(&gpd->id, ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY); @@ -2971,8 +2978,8 @@ int ED_gpencil_join_objects_exec(bContext *C, wmOperator *op) float offset_global[3]; float offset_local[3]; - sub_v3_v3v3(offset_global, ob_active->loc, ob_iter->object_to_world().location()); - copy_m3_m4(bmat, ob_active->object_to_world().ptr()); + sub_v3_v3v3(offset_global, ob_active->loc, ob_iter->object_to_world[3]); + copy_m3_m4(bmat, ob_active->object_to_world); /* Inverse transform for all selected curves in this object, * See #object_join_exec for detailed comment on why the safe version is used. */ @@ -3053,7 +3060,7 @@ int ED_gpencil_join_objects_exec(bContext *C, wmOperator *op) } } DEG_id_tag_update(&gpd_src->id, - ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY | ID_RECALC_SYNC_TO_EVAL); + ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY | ID_RECALC_COPY_ON_WRITE); } /* Free the old object */ @@ -3063,7 +3070,7 @@ int ED_gpencil_join_objects_exec(bContext *C, wmOperator *op) CTX_DATA_END; DEG_id_tag_update(&gpd_dst->id, - ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY | ID_RECALC_SYNC_TO_EVAL); + ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY | ID_RECALC_COPY_ON_WRITE); DEG_relations_tag_update(bmain); /* because we removed object(s) */ WM_event_add_notifier(C, NC_SCENE | ND_OB_ACTIVE, scene); @@ -3109,7 +3116,7 @@ static int gpencil_lock_layer_exec(bContext *C, wmOperator * /*op*/) gp_style = ma->gp_style; gp_style->flag |= GP_MATERIAL_LOCKED; gp_style->flag |= GP_MATERIAL_HIDE; - DEG_id_tag_update(&ma->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&ma->id, ID_RECALC_COPY_ON_WRITE); } } @@ -3126,7 +3133,7 @@ static int gpencil_lock_layer_exec(bContext *C, wmOperator * /*op*/) } ma = BKE_gpencil_material(ob, gps->mat_nr + 1); - DEG_id_tag_update(&ma->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&ma->id, ID_RECALC_COPY_ON_WRITE); gp_style = ma->gp_style; /* unlock/unhide color if not unlocked before */ @@ -3140,8 +3147,8 @@ static int gpencil_lock_layer_exec(bContext *C, wmOperator * /*op*/) /* updates */ DEG_id_tag_update(&gpd->id, ID_RECALC_GEOMETRY); - /* Copy-on-eval tag is needed, or else no refresh happens */ - DEG_id_tag_update(&gpd->id, ID_RECALC_SYNC_TO_EVAL); + /* copy on write tag is needed, or else no refresh happens */ + DEG_id_tag_update(&gpd->id, ID_RECALC_COPY_ON_WRITE); /* notifiers */ DEG_id_tag_update(&gpd->id, ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY); @@ -3217,7 +3224,7 @@ static int gpencil_material_isolate_exec(bContext *C, wmOperator *op) continue; } gp_style->flag |= flags; - DEG_id_tag_update(&ma->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&ma->id, ID_RECALC_COPY_ON_WRITE); } } else { @@ -3229,15 +3236,15 @@ static int gpencil_material_isolate_exec(bContext *C, wmOperator *op) } gp_style = ma->gp_style; gp_style->flag &= ~flags; - DEG_id_tag_update(&ma->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&ma->id, ID_RECALC_COPY_ON_WRITE); } } /* notifiers */ DEG_id_tag_update(&gpd->id, ID_RECALC_GEOMETRY); - /* Copy-on-eval tag is needed, or else no refresh happens */ - DEG_id_tag_update(&gpd->id, ID_RECALC_SYNC_TO_EVAL); + /* copy on write tag is needed, or else no refresh happens */ + DEG_id_tag_update(&gpd->id, ID_RECALC_COPY_ON_WRITE); WM_event_add_notifier(C, NC_GPENCIL | ND_DATA | NA_EDITED, nullptr); @@ -3293,7 +3300,7 @@ static int gpencil_material_hide_exec(bContext *C, wmOperator *op) color = ma->gp_style; if (active_color != color) { color->flag |= GP_MATERIAL_HIDE; - DEG_id_tag_update(&ma->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&ma->id, ID_RECALC_COPY_ON_WRITE); } } } @@ -3306,8 +3313,8 @@ static int gpencil_material_hide_exec(bContext *C, wmOperator *op) /* updates */ DEG_id_tag_update(&gpd->id, ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY); - /* Copy-on-eval tag is needed, or else no refresh happens */ - DEG_id_tag_update(&gpd->id, ID_RECALC_SYNC_TO_EVAL); + /* copy on write tag is needed, or else no refresh happens */ + DEG_id_tag_update(&gpd->id, ID_RECALC_COPY_ON_WRITE); /* notifiers */ WM_event_add_notifier(C, NC_GPENCIL | ND_DATA | NA_EDITED, nullptr); @@ -3355,15 +3362,15 @@ static int gpencil_material_reveal_exec(bContext *C, wmOperator * /*op*/) if (ma) { gp_style = ma->gp_style; gp_style->flag &= ~GP_MATERIAL_HIDE; - DEG_id_tag_update(&ma->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&ma->id, ID_RECALC_COPY_ON_WRITE); } } /* updates */ DEG_id_tag_update(&gpd->id, ID_RECALC_GEOMETRY); - /* Copy-on-eval tag is needed, or else no refresh happens */ - DEG_id_tag_update(&gpd->id, ID_RECALC_SYNC_TO_EVAL); + /* copy on write tag is needed, or else no refresh happens */ + DEG_id_tag_update(&gpd->id, ID_RECALC_COPY_ON_WRITE); /* notifiers */ WM_event_add_notifier(C, NC_GPENCIL | ND_DATA | NA_EDITED, nullptr); @@ -3408,15 +3415,15 @@ static int gpencil_material_lock_all_exec(bContext *C, wmOperator * /*op*/) if (ma) { gp_style = ma->gp_style; gp_style->flag |= GP_MATERIAL_LOCKED; - DEG_id_tag_update(&ma->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&ma->id, ID_RECALC_COPY_ON_WRITE); } } /* updates */ DEG_id_tag_update(&gpd->id, ID_RECALC_GEOMETRY); - /* Copy-on-eval tag is needed, or else no refresh happens */ - DEG_id_tag_update(&gpd->id, ID_RECALC_SYNC_TO_EVAL); + /* copy on write tag is needed, or else no refresh happens */ + DEG_id_tag_update(&gpd->id, ID_RECALC_COPY_ON_WRITE); /* notifiers */ WM_event_add_notifier(C, NC_GPENCIL | ND_DATA | NA_EDITED, nullptr); @@ -3461,15 +3468,15 @@ static int gpencil_material_unlock_all_exec(bContext *C, wmOperator * /*op*/) if (ma) { gp_style = ma->gp_style; gp_style->flag &= ~GP_MATERIAL_LOCKED; - DEG_id_tag_update(&ma->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&ma->id, ID_RECALC_COPY_ON_WRITE); } } /* updates */ DEG_id_tag_update(&gpd->id, ID_RECALC_GEOMETRY); - /* Copy-on-eval tag is needed, or else no refresh happens */ - DEG_id_tag_update(&gpd->id, ID_RECALC_SYNC_TO_EVAL); + /* copy on write tag is needed, or else no refresh happens */ + DEG_id_tag_update(&gpd->id, ID_RECALC_COPY_ON_WRITE); /* notifiers */ WM_event_add_notifier(C, NC_GPENCIL | ND_DATA | NA_EDITED, nullptr); @@ -3558,8 +3565,8 @@ static int gpencil_material_select_exec(bContext *C, wmOperator *op) } CTX_DATA_END; - /* Copy-on-eval tag is needed, or else no refresh happens */ - DEG_id_tag_update(&gpd->id, ID_RECALC_GEOMETRY | ID_RECALC_SYNC_TO_EVAL); + /* copy on write tag is needed, or else no refresh happens */ + DEG_id_tag_update(&gpd->id, ID_RECALC_GEOMETRY | ID_RECALC_COPY_ON_WRITE); /* notifiers */ WM_event_add_notifier(C, NC_GPENCIL | ND_DATA | NA_EDITED, nullptr); @@ -3715,7 +3722,7 @@ static int gpencil_materials_copy_to_object_exec(bContext *C, wmOperator *op) } /* notifiers */ - DEG_id_tag_update(&ob->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&ob->id, ID_RECALC_COPY_ON_WRITE); } CTX_DATA_END; @@ -3835,7 +3842,8 @@ static int gpencil_layer_mask_add_exec(bContext *C, wmOperator *op) /* notifiers */ if (gpd) { - DEG_id_tag_update(&gpd->id, ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY | ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&gpd->id, + ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY | ID_RECALC_COPY_ON_WRITE); } WM_event_add_notifier(C, NC_GPENCIL | ND_DATA | NA_EDITED, nullptr); diff --git a/source/blender/editors/gpencil_legacy/gpencil_edit.cc b/source/blender/editors/gpencil_legacy/gpencil_edit.cc index 90747717082..d2bb28d8088 100644 --- a/source/blender/editors/gpencil_legacy/gpencil_edit.cc +++ b/source/blender/editors/gpencil_legacy/gpencil_edit.cc @@ -15,16 +15,18 @@ #include "MEM_guardedalloc.h" +#include "BLI_blenlib.h" #include "BLI_ghash.h" -#include "BLI_lasso_2d.hh" +#include "BLI_lasso_2d.h" #include "BLI_math_matrix.h" #include "BLI_math_vector.h" #include "BLI_string.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_gpencil_legacy_types.h" +#include "DNA_gpencil_modifier_types.h" #include "DNA_material_types.h" #include "DNA_meshdata_types.h" #include "DNA_object_types.h" @@ -36,16 +38,20 @@ #include "BKE_brush.hh" #include "BKE_context.hh" #include "BKE_deform.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_gpencil_curve_legacy.h" #include "BKE_gpencil_geom_legacy.h" #include "BKE_gpencil_legacy.h" +#include "BKE_layer.hh" #include "BKE_lib_id.hh" +#include "BKE_library.hh" #include "BKE_main.hh" #include "BKE_material.h" +#include "BKE_object.hh" #include "BKE_paint.hh" -#include "BKE_report.hh" -#include "BKE_scene.hh" +#include "BKE_report.h" +#include "BKE_scene.h" +#include "BKE_workspace.h" #include "UI_interface.hh" #include "UI_resources.hh" @@ -57,13 +63,17 @@ #include "RNA_access.hh" #include "RNA_define.hh" +#include "RNA_enum_types.hh" #include "UI_view2d.hh" +#include "ED_armature.hh" #include "ED_gpencil_legacy.hh" #include "ED_object.hh" #include "ED_outliner.hh" #include "ED_screen.hh" +#include "ED_select_utils.hh" +#include "ED_space_api.hh" #include "ED_transform_snap_object_context.hh" #include "ED_view3d.hh" @@ -300,7 +310,7 @@ static int gpencil_selectmode_toggle_exec(bContext *C, wmOperator *op) WM_event_add_notifier(C, NC_GPENCIL | NA_SELECTED, nullptr); WM_main_add_notifier(NC_SCENE | ND_TOOLSETTINGS, nullptr); - DEG_id_tag_update(&scene->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&scene->id, ID_RECALC_COPY_ON_WRITE); return OPERATOR_FINISHED; } @@ -1326,8 +1336,9 @@ static int gpencil_extrude_exec(bContext *C, wmOperator *op) if (changed) { /* updates */ - DEG_id_tag_update(&gpd->id, ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY | ID_RECALC_SYNC_TO_EVAL); - DEG_id_tag_update(&obact->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&gpd->id, + ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY | ID_RECALC_COPY_ON_WRITE); + DEG_id_tag_update(&obact->id, ID_RECALC_COPY_ON_WRITE); WM_event_add_notifier(C, NC_GPENCIL | ND_DATA | NA_EDITED, nullptr); } @@ -2940,7 +2951,7 @@ static int gpencil_snap_to_grid_exec(bContext *C, wmOperator * /*op*/) if (changed) { DEG_id_tag_update(&gpd->id, ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY); - DEG_id_tag_update(&obact->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&obact->id, ID_RECALC_COPY_ON_WRITE); WM_event_add_notifier(C, NC_GPENCIL | ND_DATA | NA_EDITED, nullptr); } @@ -3042,7 +3053,7 @@ static int gpencil_snap_to_cursor_exec(bContext *C, wmOperator *op) if (changed) { DEG_id_tag_update(&gpd->id, ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY); - DEG_id_tag_update(&obact->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&obact->id, ID_RECALC_COPY_ON_WRITE); WM_event_add_notifier(C, NC_GPENCIL | ND_DATA | NA_EDITED, nullptr); } @@ -3171,7 +3182,7 @@ static int gpencil_snap_cursor_to_sel_exec(bContext *C, wmOperator *op) } } - DEG_id_tag_update(&scene->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&scene->id, ID_RECALC_COPY_ON_WRITE); WM_event_add_notifier(C, NC_SPACE | ND_SPACE_VIEW3D, nullptr); } @@ -4183,7 +4194,7 @@ static int gpencil_stroke_outline_exec(bContext *C, wmOperator *op) Scene *scene = CTX_data_scene(C); Object *cam_ob = scene->camera; if (cam_ob != nullptr) { - invert_m4_m4(viewmat, cam_ob->object_to_world().ptr()); + invert_m4_m4(viewmat, cam_ob->object_to_world); } break; } @@ -4251,7 +4262,7 @@ static int gpencil_stroke_outline_exec(bContext *C, wmOperator *op) /* Apply layer thickness change. */ gps_duplicate->thickness += gpl->line_change; /* Apply object scale to thickness. */ - gps_duplicate->thickness *= mat4_to_scale(ob->object_to_world().ptr()); + gps_duplicate->thickness *= mat4_to_scale(ob->object_to_world); CLAMP_MIN(gps_duplicate->thickness, 1.0f); /* Stroke. */ @@ -5482,7 +5493,8 @@ void GPENCIL_OT_stroke_smooth(wmOperatorType *ot) /* smart stroke cutter for trimming stroke ends */ struct GP_SelectLassoUserData { rcti rect; - blender::Array mcoords; + const int (*mcoords)[2]; + int mcoords_len; }; static bool gpencil_test_lasso(bGPDstroke *gps, @@ -5498,7 +5510,7 @@ static bool gpencil_test_lasso(bGPDstroke *gps, gpencil_point_to_xy(gsc, gps, &pt2, &x0, &y0); /* test if in lasso */ return (!ELEM(V2D_IS_CLIPPED, x0, y0) && BLI_rcti_isect_pt(&data->rect, x0, y0) && - BLI_lasso_is_point_inside(data->mcoords, x0, y0, INT_MAX)); + BLI_lasso_is_point_inside(data->mcoords, data->mcoords_len, x0, y0, INT_MAX)); } typedef bool (*GPencilTestFn)(bGPDstroke *gps, @@ -5709,7 +5721,7 @@ static int gpencil_cutter_lasso_select(bContext *C, /* updates */ if (changed) { - DEG_id_tag_update(&gpd->id, ID_RECALC_GEOMETRY | ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&gpd->id, ID_RECALC_GEOMETRY | ID_RECALC_COPY_ON_WRITE); WM_event_add_notifier(C, NC_GPENCIL | NA_SELECTED, nullptr); WM_event_add_notifier(C, NC_GEOM | ND_SELECT, nullptr); } @@ -5740,16 +5752,20 @@ static int gpencil_cutter_exec(bContext *C, wmOperator *op) } GP_SelectLassoUserData data{}; - data.mcoords = WM_gesture_lasso_path_to_array(C, op); - if (data.mcoords.is_empty()) { + data.mcoords = WM_gesture_lasso_path_to_array(C, op, &data.mcoords_len); + + /* Sanity check. */ + if (data.mcoords == nullptr) { return OPERATOR_PASS_THROUGH; } /* Compute boundbox of lasso (for faster testing later). */ - BLI_lasso_boundbox(&data.rect, data.mcoords); + BLI_lasso_boundbox(&data.rect, data.mcoords, data.mcoords_len); gpencil_cutter_lasso_select(C, op, gpencil_test_lasso, &data); + MEM_freeN((void *)data.mcoords); + return OPERATOR_FINISHED; } @@ -5790,8 +5806,8 @@ bool ED_object_gpencil_exit(Main *bmain, Object *ob) OB_MODE_SCULPT_GPENCIL_LEGACY | OB_MODE_WEIGHT_GPENCIL_LEGACY | OB_MODE_VERTEX_GPENCIL_LEGACY); - /* Inform all evaluated versions that we changed the mode. */ - DEG_id_tag_update_ex(bmain, &ob->id, ID_RECALC_SYNC_TO_EVAL); + /* Inform all CoW versions that we changed the mode. */ + DEG_id_tag_update_ex(bmain, &ob->id, ID_RECALC_COPY_ON_WRITE); ok = true; } return ok; diff --git a/source/blender/editors/gpencil_legacy/gpencil_edit_curve.cc b/source/blender/editors/gpencil_legacy/gpencil_edit_curve.cc index 3211aa5112c..34ae4cb554e 100644 --- a/source/blender/editors/gpencil_legacy/gpencil_edit_curve.cc +++ b/source/blender/editors/gpencil_legacy/gpencil_edit_curve.cc @@ -23,6 +23,7 @@ #include "BLI_listbase.h" #include "BLI_math_matrix.h" +#include "BLI_math_vector.h" #include "RNA_access.hh" #include "RNA_define.hh" diff --git a/source/blender/editors/gpencil_legacy/gpencil_fill.cc b/source/blender/editors/gpencil_legacy/gpencil_fill.cc index ca8d6fcd961..9a8e3f5e1fc 100644 --- a/source/blender/editors/gpencil_legacy/gpencil_fill.cc +++ b/source/blender/editors/gpencil_legacy/gpencil_fill.cc @@ -16,7 +16,7 @@ #include "BLI_stack.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_brush_types.h" #include "DNA_gpencil_legacy_types.h" @@ -26,15 +26,17 @@ #include "DNA_object_types.h" #include "DNA_windowmanager_types.h" +#include "BKE_brush.hh" #include "BKE_context.hh" #include "BKE_deform.hh" #include "BKE_gpencil_geom_legacy.h" #include "BKE_gpencil_legacy.h" #include "BKE_image.h" #include "BKE_lib_id.hh" +#include "BKE_main.hh" #include "BKE_material.h" #include "BKE_paint.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "BKE_screen.hh" #include "ED_gpencil_legacy.hh" @@ -61,6 +63,7 @@ #include "WM_types.hh" #include "DEG_depsgraph.hh" +#include "DEG_depsgraph_query.hh" #include "gpencil_intern.h" diff --git a/source/blender/editors/gpencil_legacy/gpencil_interpolate.cc b/source/blender/editors/gpencil_legacy/gpencil_interpolate.cc index 0c0661de1ef..7bc0cea1134 100644 --- a/source/blender/editors/gpencil_legacy/gpencil_interpolate.cc +++ b/source/blender/editors/gpencil_legacy/gpencil_interpolate.cc @@ -23,10 +23,11 @@ #include "BLI_math_vector.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_color_types.h" #include "DNA_gpencil_legacy_types.h" +#include "DNA_meshdata_types.h" #include "DNA_object_types.h" #include "DNA_scene_types.h" #include "DNA_screen_types.h" @@ -37,7 +38,7 @@ #include "BKE_context.hh" #include "BKE_gpencil_geom_legacy.h" #include "BKE_gpencil_legacy.h" -#include "BKE_report.hh" +#include "BKE_report.h" #include "UI_interface.hh" #include "UI_resources.hh" diff --git a/source/blender/editors/gpencil_legacy/gpencil_merge.cc b/source/blender/editors/gpencil_legacy/gpencil_merge.cc index be5403af4aa..99c4e6b1bf6 100644 --- a/source/blender/editors/gpencil_legacy/gpencil_merge.cc +++ b/source/blender/editors/gpencil_legacy/gpencil_merge.cc @@ -11,6 +11,7 @@ #include "MEM_guardedalloc.h" +#include "BLI_blenlib.h" #include "BLI_ghash.h" #include "BLI_math_vector.h" @@ -21,8 +22,9 @@ #include "BKE_context.hh" #include "BKE_gpencil_geom_legacy.h" #include "BKE_gpencil_legacy.h" +#include "BKE_main.hh" #include "BKE_material.h" -#include "BKE_report.hh" +#include "BKE_report.h" #include "WM_api.hh" #include "WM_types.hh" @@ -30,6 +32,7 @@ #include "RNA_access.hh" #include "RNA_define.hh" +#include "ED_gpencil_legacy.hh" #include "ED_screen.hh" #include "DEG_depsgraph.hh" diff --git a/source/blender/editors/gpencil_legacy/gpencil_mesh.cc b/source/blender/editors/gpencil_legacy/gpencil_mesh.cc index a029f0e4aea..976c4c8786d 100644 --- a/source/blender/editors/gpencil_legacy/gpencil_mesh.cc +++ b/source/blender/editors/gpencil_legacy/gpencil_mesh.cc @@ -9,25 +9,25 @@ #include "MEM_guardedalloc.h" +#include "BLI_blenlib.h" #include "BLI_ghash.h" #include "BLI_math_rotation.h" -#include "BLT_translation.hh" - #include "DNA_anim_types.h" #include "DNA_gpencil_legacy_types.h" #include "DNA_scene_types.h" #include "DNA_screen_types.h" -#include "BKE_anim_data.hh" +#include "BKE_anim_data.h" #include "BKE_context.hh" -#include "BKE_duplilist.hh" +#include "BKE_duplilist.h" #include "BKE_gpencil_geom_legacy.h" #include "BKE_layer.hh" +#include "BKE_main.hh" #include "BKE_material.h" #include "BKE_object.hh" -#include "BKE_report.hh" -#include "BKE_scene.hh" +#include "BKE_report.h" +#include "BKE_scene.h" #include "DEG_depsgraph.hh" #include "DEG_depsgraph_query.hh" @@ -298,7 +298,7 @@ static int gpencil_bake_mesh_animation_exec(bContext *C, wmOperator *op) angle, thickness, offset, - ob_eval->object_to_world().ptr(), + ob_eval->object_to_world, frame_offset, use_seams, use_faces, @@ -383,8 +383,7 @@ static int gpencil_bake_mesh_animation_invoke(bContext *C, { /* Show popup dialog to allow editing. */ /* FIXME: hard-coded dimensions here are just arbitrary. */ - return WM_operator_props_dialog_popup( - C, op, 250, IFACE_("Bake Mesh Animation to Grease Pencil"), IFACE_("Bake")); + return WM_operator_props_dialog_popup(C, op, 250); } void GPENCIL_OT_bake_mesh_animation(wmOperatorType *ot) diff --git a/source/blender/editors/gpencil_legacy/gpencil_ops_versioning.cc b/source/blender/editors/gpencil_legacy/gpencil_ops_versioning.cc index e056880d93f..b8a891f9a25 100644 --- a/source/blender/editors/gpencil_legacy/gpencil_ops_versioning.cc +++ b/source/blender/editors/gpencil_legacy/gpencil_ops_versioning.cc @@ -24,6 +24,7 @@ #include "BKE_context.hh" #include "BKE_gpencil_legacy.h" +#include "BKE_main.hh" #include "BKE_object.hh" #include "WM_api.hh" diff --git a/source/blender/editors/gpencil_legacy/gpencil_paint.cc b/source/blender/editors/gpencil_legacy/gpencil_paint.cc index 65470565146..cc9bf609adb 100644 --- a/source/blender/editors/gpencil_legacy/gpencil_paint.cc +++ b/source/blender/editors/gpencil_legacy/gpencil_paint.cc @@ -14,6 +14,7 @@ #include "MEM_guardedalloc.h" +#include "BLI_blenlib.h" #include "BLI_hash.h" #include "BLI_math_geom.h" #include "BLI_math_matrix.h" @@ -22,7 +23,7 @@ #include "BLI_time.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_brush_types.h" #include "DNA_gpencil_legacy_types.h" @@ -36,19 +37,24 @@ #include "BKE_colortools.hh" #include "BKE_context.hh" #include "BKE_deform.hh" +#include "BKE_global.h" #include "BKE_gpencil_curve_legacy.h" #include "BKE_gpencil_geom_legacy.h" #include "BKE_gpencil_legacy.h" #include "BKE_gpencil_update_cache_legacy.h" +#include "BKE_layer.hh" #include "BKE_main.hh" #include "BKE_material.h" #include "BKE_paint.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "BKE_screen.hh" +#include "BKE_tracking.h" #include "UI_view2d.hh" +#include "ED_clip.hh" #include "ED_gpencil_legacy.hh" +#include "ED_object.hh" #include "ED_screen.hh" #include "ED_view3d.hh" @@ -937,7 +943,7 @@ static bGPDstroke *gpencil_stroke_to_outline(tGPsdata *p, bGPDstroke *gps) /* Apply layer thickness change. */ gps_duplicate->thickness += gpl->line_change; /* Apply object scale to thickness. */ - gps_duplicate->thickness *= mat4_to_scale(p->ob->object_to_world().ptr()); + gps_duplicate->thickness *= mat4_to_scale(p->ob->object_to_world); CLAMP_MIN(gps_duplicate->thickness, 1.0f); /* Stroke. */ @@ -2022,7 +2028,7 @@ static void gpencil_init_drawing_brush(bContext *C, tGPsdata *p) /* Need this update to synchronize brush with draw manager. */ if (changed) { - DEG_id_tag_update(&scene->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&scene->id, ID_RECALC_COPY_ON_WRITE); } } @@ -2159,7 +2165,7 @@ static tGPsdata *gpencil_session_initpaint(bContext *C, wmOperator *op) } /* Random generator, only init once. */ - uint rng_seed = uint(BLI_time_now_seconds_i() & UINT_MAX); + uint rng_seed = uint(BLI_check_seconds_timer_i() & UINT_MAX); rng_seed ^= POINTER_AS_UINT(p); p->rng = BLI_rng_new(rng_seed); @@ -2188,7 +2194,7 @@ static void gpencil_session_cleanup(tGPsdata *p) gpd->runtime.sbuffer_size = 0; gpd->runtime.sbuffer_sflag = 0; /* This update is required for update-on-write because the sbuffer data is not longer overwritten - * by a copy-on-evaluation. */ + * by a copy-on-write. */ ED_gpencil_sbuffer_update_eval(gpd, p->ob_eval); p->inittime = 0.0; } @@ -2961,7 +2967,7 @@ static void gpencil_draw_apply_event(bContext *C, } } - p->curtime = BLI_time_now_seconds(); + p->curtime = BLI_check_seconds_timer(); /* handle pressure sensitivity (which is supplied by tablets or otherwise 1.0) */ p->pressure = event->tablet.pressure; @@ -3719,7 +3725,7 @@ static int gpencil_draw_modal(bContext *C, wmOperator *op, const wmEvent *event) p->paintmode = GP_PAINTMODE_DRAW; WM_cursor_modal_restore(p->win); ED_gpencil_toggle_brush_cursor(C, true, nullptr); - DEG_id_tag_update(&p->scene->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&p->scene->id, ID_RECALC_COPY_ON_WRITE); } else { return OPERATOR_RUNNING_MODAL; diff --git a/source/blender/editors/gpencil_legacy/gpencil_primitive.cc b/source/blender/editors/gpencil_legacy/gpencil_primitive.cc index 77bf6e6a4dd..3ade731e97f 100644 --- a/source/blender/editors/gpencil_legacy/gpencil_primitive.cc +++ b/source/blender/editors/gpencil_legacy/gpencil_primitive.cc @@ -23,7 +23,7 @@ #include "BLI_time.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_brush_types.h" #include "DNA_gpencil_legacy_types.h" @@ -38,11 +38,13 @@ #include "BKE_colortools.hh" #include "BKE_context.hh" #include "BKE_deform.hh" +#include "BKE_global.h" #include "BKE_gpencil_geom_legacy.h" #include "BKE_gpencil_legacy.h" +#include "BKE_main.hh" #include "BKE_material.h" #include "BKE_paint.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "UI_interface.hh" #include "UI_resources.hh" @@ -52,9 +54,12 @@ #include "RNA_access.hh" #include "RNA_define.hh" +#include "RNA_enum_types.hh" #include "ED_gpencil_legacy.hh" +#include "ED_object.hh" #include "ED_screen.hh" +#include "ED_space_api.hh" #include "ED_view3d.hh" #include "ANIM_keyframing.hh" @@ -363,10 +368,10 @@ static void gpencil_primitive_set_initdata(bContext *C, tGPDprimitive *tgpi) gpencil_primitive_allocate_memory(tgpi); /* Random generator, only init once. */ - uint rng_seed = uint(BLI_time_now_seconds_i() & UINT_MAX); + uint rng_seed = uint(BLI_check_seconds_timer_i() & UINT_MAX); tgpi->rng = BLI_rng_new(rng_seed); - DEG_id_tag_update(&tgpi->gpd->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&tgpi->gpd->id, ID_RECALC_COPY_ON_WRITE); } /* add new segment to curve */ @@ -1093,7 +1098,7 @@ static void gpencil_primitive_update_strokes(bContext *C, tGPDprimitive *tgpi) MEM_SAFE_FREE(depth_arr); - DEG_id_tag_update(&gpd->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&gpd->id, ID_RECALC_COPY_ON_WRITE); DEG_id_tag_update(&gpd->id, ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY); WM_event_add_notifier(C, NC_GPENCIL | NA_EDITED, nullptr); } @@ -1163,7 +1168,7 @@ static void gpencil_primitive_exit(bContext *C, wmOperator *op) gpd->runtime.sbuffer_sflag = 0; } - DEG_id_tag_update(&gpd->id, ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY | ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&gpd->id, ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY | ID_RECALC_COPY_ON_WRITE); WM_event_add_notifier(C, NC_GPENCIL | NA_EDITED, nullptr); /* clear pointer */ @@ -1414,7 +1419,7 @@ static void gpencil_primitive_interaction_end(bContext *C, BKE_gpencil_stroke_copy_to_keyframes(tgpi->gpd, tgpi->gpl, gpf, gps, tail); } - DEG_id_tag_update(&tgpi->gpd->id, ID_RECALC_SYNC_TO_EVAL); + 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); /* clean up temp data */ diff --git a/source/blender/editors/gpencil_legacy/gpencil_sculpt_paint.cc b/source/blender/editors/gpencil_legacy/gpencil_sculpt_paint.cc index 72de7515477..cc061d8a1b5 100644 --- a/source/blender/editors/gpencil_legacy/gpencil_sculpt_paint.cc +++ b/source/blender/editors/gpencil_legacy/gpencil_sculpt_paint.cc @@ -25,10 +25,11 @@ #include "BLI_time.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_gpencil_legacy_types.h" #include "DNA_material_types.h" +#include "DNA_meshdata_types.h" #include "DNA_object_types.h" #include "DNA_scene_types.h" #include "DNA_screen_types.h" @@ -38,12 +39,15 @@ #include "BKE_brush.hh" #include "BKE_colortools.hh" #include "BKE_context.hh" +#include "BKE_deform.hh" #include "BKE_gpencil_geom_legacy.h" #include "BKE_gpencil_legacy.h" #include "BKE_gpencil_modifier_legacy.h" +#include "BKE_gpencil_update_cache_legacy.h" #include "BKE_main.hh" #include "BKE_material.h" -#include "BKE_report.hh" +#include "BKE_object_deform.h" +#include "BKE_report.h" #include "UI_interface.hh" @@ -52,6 +56,7 @@ #include "RNA_access.hh" #include "RNA_define.hh" +#include "RNA_enum_types.hh" #include "RNA_prototypes.h" #include "UI_view2d.hh" @@ -677,7 +682,7 @@ static bool gpencil_brush_pinch_apply(tGP_BrushEditData *gso, /* 1) Make this point relative to the cursor/midpoint (dvec) */ float fpt[3]; - mul_v3_m4v3(fpt, gso->object->object_to_world().ptr(), &pt->x); + mul_v3_m4v3(fpt, gso->object->object_to_world, &pt->x); sub_v3_v3v3(vec, fpt, gso->dvec); /* 2) Shrink the distance by pulling the point towards the midpoint @@ -697,7 +702,7 @@ static bool gpencil_brush_pinch_apply(tGP_BrushEditData *gso, /* 3) Translate back to original space, with the shrinkage applied */ add_v3_v3v3(fpt, gso->dvec, vec); - mul_v3_m4v3(&pt->x, gso->object->world_to_object().ptr(), fpt); + mul_v3_m4v3(&pt->x, gso->object->world_to_object, fpt); /* compute lock axis */ gpencil_sculpt_compute_lock_axis(gso, pt, save_pt); @@ -749,12 +754,12 @@ static bool gpencil_brush_twist_apply(tGP_BrushEditData *gso, /* Rotate point */ float fpt[3]; - mul_v3_m4v3(fpt, gso->object->object_to_world().ptr(), &pt->x); + mul_v3_m4v3(fpt, gso->object->object_to_world, &pt->x); sub_v3_v3v3(vec, fpt, gso->dvec); /* make relative to center * (center is stored in dvec) */ mul_m3_v3(rmat, vec); add_v3_v3v3(fpt, vec, gso->dvec); /* restore */ - mul_v3_m4v3(&pt->x, gso->object->world_to_object().ptr(), fpt); + mul_v3_m4v3(&pt->x, gso->object->world_to_object, fpt); /* compute lock axis */ gpencil_sculpt_compute_lock_axis(gso, pt, save_pt); @@ -1045,11 +1050,11 @@ static void gpencil_brush_clone_add(bContext *C, tGP_BrushEditData *gso) */ for (i = 0, pt = new_stroke->points; i < new_stroke->totpoints; i++, pt++) { /* Rotate around center new position */ - mul_mat3_m4_v3(gso->object->object_to_world().ptr(), &pt->x); /* only rotation component */ + mul_mat3_m4_v3(gso->object->object_to_world, &pt->x); /* only rotation component */ /* assume that the delta can just be applied, and then everything works */ add_v3_v3(&pt->x, delta); - mul_m4_v3(gso->object->world_to_object().ptr(), &pt->x); + mul_m4_v3(gso->object->world_to_object, &pt->x); } /* Store ref for later */ @@ -1165,7 +1170,7 @@ static bool gpencil_sculpt_brush_init(bContext *C, wmOperator *op) gso->settings = gpencil_sculpt_get_settings(scene); /* Random generator, only init once. */ - uint rng_seed = uint(BLI_time_now_seconds_i() & UINT_MAX); + uint rng_seed = uint(BLI_check_seconds_timer_i() & UINT_MAX); rng_seed ^= POINTER_AS_UINT(gso); gso->rng = BLI_rng_new(rng_seed); @@ -1180,7 +1185,7 @@ static bool gpencil_sculpt_brush_init(bContext *C, wmOperator *op) gso->object = ob; if (ob) { float matrix[4][4]; - copy_m4_m4(matrix, ob->object_to_world().ptr()); + copy_m4_m4(matrix, ob->object_to_world); zero_axis_bias_m4(matrix); invert_m4_m4(gso->inv_mat, matrix); gso->vrgroup = gso->gpd->vertex_group_active_index - 1; diff --git a/source/blender/editors/gpencil_legacy/gpencil_select.cc b/source/blender/editors/gpencil_legacy/gpencil_select.cc index 47c2cdbf8e5..2f13a9a0859 100644 --- a/source/blender/editors/gpencil_legacy/gpencil_select.cc +++ b/source/blender/editors/gpencil_legacy/gpencil_select.cc @@ -14,8 +14,9 @@ #include "MEM_guardedalloc.h" +#include "BLI_blenlib.h" #include "BLI_ghash.h" -#include "BLI_lasso_2d.hh" +#include "BLI_lasso_2d.h" #include "BLI_math_color.h" #include "BLI_math_matrix.h" #include "BLI_math_vector.h" @@ -27,13 +28,17 @@ #include "DNA_object_types.h" #include "DNA_scene_types.h" #include "DNA_screen_types.h" +#include "DNA_space_types.h" #include "BKE_context.hh" #include "BKE_gpencil_curve_legacy.h" #include "BKE_gpencil_geom_legacy.h" #include "BKE_gpencil_legacy.h" #include "BKE_material.h" -#include "BKE_report.hh" +#include "BKE_report.h" + +#include "UI_interface.hh" +#include "UI_resources.hh" #include "WM_api.hh" #include "WM_types.hh" @@ -281,8 +286,8 @@ static int gpencil_select_all_exec(bContext *C, wmOperator *op) /* updates */ DEG_id_tag_update(&gpd->id, ID_RECALC_GEOMETRY); - /* Copy-on-eval tag is needed, or else no refresh happens */ - DEG_id_tag_update(&gpd->id, ID_RECALC_SYNC_TO_EVAL); + /* copy on write tag is needed, or else no refresh happens */ + DEG_id_tag_update(&gpd->id, ID_RECALC_COPY_ON_WRITE); WM_event_add_notifier(C, NC_GPENCIL | NA_SELECTED, nullptr); WM_event_add_notifier(C, NC_GEOM | ND_SELECT, nullptr); @@ -359,8 +364,8 @@ static int gpencil_select_linked_exec(bContext *C, wmOperator *op) /* updates */ DEG_id_tag_update(&gpd->id, ID_RECALC_GEOMETRY); - /* Copy-on-eval tag is needed, or else no refresh happens */ - DEG_id_tag_update(&gpd->id, ID_RECALC_SYNC_TO_EVAL); + /* copy on write tag is needed, or else no refresh happens */ + DEG_id_tag_update(&gpd->id, ID_RECALC_COPY_ON_WRITE); WM_event_add_notifier(C, NC_GPENCIL | NA_SELECTED, nullptr); WM_event_add_notifier(C, NC_GEOM | ND_SELECT, nullptr); @@ -485,8 +490,8 @@ static int gpencil_select_alternate_exec(bContext *C, wmOperator *op) /* updates */ DEG_id_tag_update(&gpd->id, ID_RECALC_GEOMETRY); - /* Copy-on-eval tag is needed, or else no refresh happens */ - DEG_id_tag_update(&gpd->id, ID_RECALC_SYNC_TO_EVAL); + /* copy on write tag is needed, or else no refresh happens */ + DEG_id_tag_update(&gpd->id, ID_RECALC_COPY_ON_WRITE); WM_event_add_notifier(C, NC_GPENCIL | NA_SELECTED, nullptr); WM_event_add_notifier(C, NC_GEOM | ND_SELECT, nullptr); @@ -699,8 +704,8 @@ static int gpencil_select_random_exec(bContext *C, wmOperator *op) /* updates */ DEG_id_tag_update(&gpd->id, ID_RECALC_GEOMETRY); - /* Copy-on-eval tag is needed, or else no refresh happens */ - DEG_id_tag_update(&gpd->id, ID_RECALC_SYNC_TO_EVAL); + /* copy on write tag is needed, or else no refresh happens */ + DEG_id_tag_update(&gpd->id, ID_RECALC_COPY_ON_WRITE); WM_event_add_notifier(C, NC_GPENCIL | NA_SELECTED, nullptr); WM_event_add_notifier(C, NC_GEOM | ND_SELECT, nullptr); @@ -920,8 +925,8 @@ static int gpencil_select_grouped_exec(bContext *C, wmOperator *op) /* updates */ DEG_id_tag_update(&gpd->id, ID_RECALC_GEOMETRY); - /* Copy-on-eval tag is needed, or else no refresh happens */ - DEG_id_tag_update(&gpd->id, ID_RECALC_SYNC_TO_EVAL); + /* copy on write tag is needed, or else no refresh happens */ + DEG_id_tag_update(&gpd->id, ID_RECALC_COPY_ON_WRITE); WM_event_add_notifier(C, NC_GPENCIL | NA_SELECTED, nullptr); WM_event_add_notifier(C, NC_GEOM | ND_SELECT, nullptr); @@ -1027,8 +1032,8 @@ static int gpencil_select_first_exec(bContext *C, wmOperator *op) /* updates */ DEG_id_tag_update(&gpd->id, ID_RECALC_GEOMETRY); - /* Copy-on-eval tag is needed, or else no refresh happens */ - DEG_id_tag_update(&gpd->id, ID_RECALC_SYNC_TO_EVAL); + /* copy on write tag is needed, or else no refresh happens */ + DEG_id_tag_update(&gpd->id, ID_RECALC_COPY_ON_WRITE); WM_event_add_notifier(C, NC_GPENCIL | NA_SELECTED, nullptr); WM_event_add_notifier(C, NC_GEOM | ND_SELECT, nullptr); @@ -1137,8 +1142,8 @@ static int gpencil_select_last_exec(bContext *C, wmOperator *op) /* updates */ DEG_id_tag_update(&gpd->id, ID_RECALC_GEOMETRY); - /* Copy-on-eval tag is needed, or else no refresh happens */ - DEG_id_tag_update(&gpd->id, ID_RECALC_SYNC_TO_EVAL); + /* copy on write tag is needed, or else no refresh happens */ + DEG_id_tag_update(&gpd->id, ID_RECALC_COPY_ON_WRITE); WM_event_add_notifier(C, NC_GPENCIL | NA_SELECTED, nullptr); WM_event_add_notifier(C, NC_GEOM | ND_SELECT, nullptr); @@ -1289,8 +1294,8 @@ static int gpencil_select_more_exec(bContext *C, wmOperator * /*op*/) /* updates */ DEG_id_tag_update(&gpd->id, ID_RECALC_GEOMETRY); - /* Copy-on-eval tag is needed, or else no refresh happens */ - DEG_id_tag_update(&gpd->id, ID_RECALC_SYNC_TO_EVAL); + /* copy on write tag is needed, or else no refresh happens */ + DEG_id_tag_update(&gpd->id, ID_RECALC_COPY_ON_WRITE); WM_event_add_notifier(C, NC_GPENCIL | NA_SELECTED, nullptr); WM_event_add_notifier(C, NC_GEOM | ND_SELECT, nullptr); @@ -1435,8 +1440,8 @@ static int gpencil_select_less_exec(bContext *C, wmOperator * /*op*/) /* updates */ DEG_id_tag_update(&gpd->id, ID_RECALC_GEOMETRY); - /* Copy-on-eval tag is needed, or else no refresh happens */ - DEG_id_tag_update(&gpd->id, ID_RECALC_SYNC_TO_EVAL); + /* copy on write tag is needed, or else no refresh happens */ + DEG_id_tag_update(&gpd->id, ID_RECALC_COPY_ON_WRITE); WM_event_add_notifier(C, NC_GPENCIL | NA_SELECTED, nullptr); WM_event_add_notifier(C, NC_GEOM | ND_SELECT, nullptr); @@ -1762,8 +1767,8 @@ static int gpencil_circle_select_exec(bContext *C, wmOperator *op) if (changed) { DEG_id_tag_update(&gpd->id, ID_RECALC_GEOMETRY); - /* Copy-on-eval tag is needed, or else no refresh happens */ - DEG_id_tag_update(&gpd->id, ID_RECALC_SYNC_TO_EVAL); + /* copy on write tag is needed, or else no refresh happens */ + DEG_id_tag_update(&gpd->id, ID_RECALC_COPY_ON_WRITE); WM_event_add_notifier(C, NC_GPENCIL | NA_SELECTED, nullptr); WM_event_add_notifier(C, NC_GEOM | ND_SELECT, nullptr); @@ -1807,7 +1812,8 @@ struct GP_SelectUserData { int mx, my, radius; /* Bounding box rect */ rcti rect; - blender::Array lasso_coords; + const int (*lasso_coords)[2]; + int lasso_coords_len; }; typedef bool (*GPencilTestFn)(ARegion *region, @@ -2051,7 +2057,7 @@ static bool gpencil_generic_stroke_select(bContext *C, Depsgraph *depsgraph = CTX_data_ensure_evaluated_depsgraph(C); Object *ob_eval = depsgraph != nullptr ? DEG_get_evaluated_object(depsgraph, ob) : ob; float select_mat[4][4]; - copy_m4_m4(select_mat, ob_eval->object_to_world().ptr()); + copy_m4_m4(select_mat, ob_eval->object_to_world); /* deselect all strokes first? */ if (SEL_OP_USE_PRE_DESELECT(sel_op)) { @@ -2222,8 +2228,8 @@ static int gpencil_generic_select_exec(bContext *C, if (changed) { DEG_id_tag_update(&gpd->id, ID_RECALC_GEOMETRY); - /* Copy-on-eval tag is needed, or else no refresh happens */ - DEG_id_tag_update(&gpd->id, ID_RECALC_SYNC_TO_EVAL); + /* copy on write tag is needed, or else no refresh happens */ + DEG_id_tag_update(&gpd->id, ID_RECALC_COPY_ON_WRITE); WM_event_add_notifier(C, NC_GPENCIL | NA_SELECTED, nullptr); WM_event_add_notifier(C, NC_GEOM | ND_SELECT, nullptr); @@ -2295,25 +2301,30 @@ static bool gpencil_test_lasso(ARegion *region, if (gpencil_3d_point_to_screen_space(region, diff_mat, pt, co)) { /* test if in lasso boundbox + within the lasso noose */ return (BLI_rcti_isect_pt(&user_data->rect, co[0], co[1]) && - BLI_lasso_is_point_inside(user_data->lasso_coords, co[0], co[1], INT_MAX)); + BLI_lasso_is_point_inside( + user_data->lasso_coords, user_data->lasso_coords_len, co[0], co[1], INT_MAX)); } return false; } static int gpencil_lasso_select_exec(bContext *C, wmOperator *op) { - GP_SelectUserData data{}; - data.lasso_coords = WM_gesture_lasso_path_to_array(C, op); - if (data.lasso_coords.is_empty()) { + GP_SelectUserData data = {0}; + data.lasso_coords = WM_gesture_lasso_path_to_array(C, op, &data.lasso_coords_len); + + /* Sanity check. */ + if (data.lasso_coords == nullptr) { return OPERATOR_PASS_THROUGH; } /* Compute boundbox of lasso (for faster testing later). */ - BLI_lasso_boundbox(&data.rect, data.lasso_coords); + BLI_lasso_boundbox(&data.rect, data.lasso_coords, data.lasso_coords_len); rcti rect = data.rect; int ret = gpencil_generic_select_exec(C, op, gpencil_test_lasso, rect, &data); + MEM_freeN((void *)data.lasso_coords); + return ret; } @@ -2504,9 +2515,9 @@ static int gpencil_select_exec(bContext *C, wmOperator *op) /* since left mouse select change, deselect all if click outside any hit */ deselect_all_selected(C); - /* Copy-on-eval tag is needed, or else no refresh happens */ + /* copy on write tag is needed, or else no refresh happens */ DEG_id_tag_update(&gpd->id, ID_RECALC_GEOMETRY); - DEG_id_tag_update(&gpd->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&gpd->id, ID_RECALC_COPY_ON_WRITE); WM_event_add_notifier(C, NC_GPENCIL | NA_SELECTED, nullptr); WM_event_add_notifier(C, NC_GEOM | ND_SELECT, nullptr); @@ -2644,8 +2655,8 @@ static int gpencil_select_exec(bContext *C, wmOperator *op) if (hit_curve_point != nullptr || hit_point != nullptr) { DEG_id_tag_update(&gpd->id, ID_RECALC_GEOMETRY); - /* Copy-on-eval tag is needed, or else no refresh happens */ - DEG_id_tag_update(&gpd->id, ID_RECALC_SYNC_TO_EVAL); + /* copy on write tag is needed, or else no refresh happens */ + DEG_id_tag_update(&gpd->id, ID_RECALC_COPY_ON_WRITE); WM_event_add_notifier(C, NC_GPENCIL | NA_SELECTED, nullptr); WM_event_add_notifier(C, NC_GEOM | ND_SELECT, nullptr); @@ -2844,8 +2855,8 @@ static int gpencil_select_vertex_color_exec(bContext *C, wmOperator *op) /* updates */ DEG_id_tag_update(&gpd->id, ID_RECALC_GEOMETRY); - /* Copy-on-eval tag is needed, or else no refresh happens */ - DEG_id_tag_update(&gpd->id, ID_RECALC_SYNC_TO_EVAL); + /* copy on write tag is needed, or else no refresh happens */ + DEG_id_tag_update(&gpd->id, ID_RECALC_COPY_ON_WRITE); WM_event_add_notifier(C, NC_GPENCIL | NA_SELECTED, nullptr); WM_event_add_notifier(C, NC_GEOM | ND_SELECT, nullptr); diff --git a/source/blender/editors/gpencil_legacy/gpencil_trace_ops.cc b/source/blender/editors/gpencil_legacy/gpencil_trace_ops.cc index ad101d70cd9..aa9269db787 100644 --- a/source/blender/editors/gpencil_legacy/gpencil_trace_ops.cc +++ b/source/blender/editors/gpencil_legacy/gpencil_trace_ops.cc @@ -11,20 +11,21 @@ #include "BLI_math_rotation.h" #include "BLI_math_vector.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_gpencil_legacy_types.h" #include "DNA_scene_types.h" #include "DNA_screen_types.h" #include "BKE_context.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_gpencil_legacy.h" #include "BKE_image.h" #include "BKE_layer.hh" #include "BKE_lib_id.hh" +#include "BKE_main.hh" #include "BKE_object.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "DEG_depsgraph.hh" #include "DEG_depsgraph_query.hh" @@ -276,7 +277,7 @@ static void trace_end_job(void *customdata) DEG_relations_tag_update(trace_job->bmain); DEG_id_tag_update(&trace_job->scene->id, ID_RECALC_SELECT); - DEG_id_tag_update(&trace_job->gpd->id, ID_RECALC_GEOMETRY | ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&trace_job->gpd->id, ID_RECALC_GEOMETRY | ID_RECALC_COPY_ON_WRITE); WM_main_add_notifier(NC_OBJECT | NA_ADDED, nullptr); WM_main_add_notifier(NC_SCENE | ND_OB_ACTIVE, trace_job->scene); diff --git a/source/blender/editors/gpencil_legacy/gpencil_trace_utils.cc b/source/blender/editors/gpencil_legacy/gpencil_trace_utils.cc index b3382603f92..d60b0a0a28d 100644 --- a/source/blender/editors/gpencil_legacy/gpencil_trace_utils.cc +++ b/source/blender/editors/gpencil_legacy/gpencil_trace_utils.cc @@ -17,12 +17,16 @@ #include "BKE_gpencil_geom_legacy.h" #include "BKE_gpencil_legacy.h" +#include "BKE_image.h" +#include "BKE_main.hh" +#include "BKE_material.h" #include "DNA_gpencil_legacy_types.h" #include "DNA_image_types.h" #include "DNA_material_types.h" #include "DNA_object_types.h" +#include "IMB_imbuf.hh" #include "IMB_imbuf_types.hh" #include "gpencil_trace.h" diff --git a/source/blender/editors/gpencil_legacy/gpencil_undo.cc b/source/blender/editors/gpencil_legacy/gpencil_undo.cc index de8efb20ec7..0fd0ad2186b 100644 --- a/source/blender/editors/gpencil_legacy/gpencil_undo.cc +++ b/source/blender/editors/gpencil_legacy/gpencil_undo.cc @@ -19,6 +19,7 @@ #include "BLI_listbase.h" #include "BKE_blender_undo.hh" +#include "BKE_context.hh" #include "BKE_gpencil_legacy.h" #include "BKE_undo_system.hh" diff --git a/source/blender/editors/gpencil_legacy/gpencil_utils.cc b/source/blender/editors/gpencil_legacy/gpencil_utils.cc index 7eb6137f802..770054da0f8 100644 --- a/source/blender/editors/gpencil_legacy/gpencil_utils.cc +++ b/source/blender/editors/gpencil_legacy/gpencil_utils.cc @@ -18,16 +18,18 @@ #include "BLI_blenlib.h" #include "BLI_ghash.h" #include "BLI_hash.h" -#include "BLI_lasso_2d.hh" +#include "BLI_lasso_2d.h" #include "BLI_math_color.h" #include "BLI_math_matrix.h" #include "BLI_math_vector.hh" +#include "BLI_rand.h" #include "BLI_time.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_brush_types.h" +#include "DNA_collection_types.h" #include "DNA_gpencil_legacy_types.h" #include "DNA_material_types.h" #include "DNA_meshdata_types.h" @@ -39,7 +41,7 @@ #include "BKE_action.h" #include "BKE_brush.hh" -#include "BKE_collection.hh" +#include "BKE_collection.h" #include "BKE_colortools.hh" #include "BKE_context.hh" #include "BKE_deform.hh" @@ -67,6 +69,7 @@ #include "ED_clip.hh" #include "ED_gpencil_legacy.hh" #include "ED_object.hh" +#include "ED_screen.hh" #include "ED_select_utils.hh" #include "ED_transform_snap_object_context.hh" #include "ED_view3d.hh" @@ -908,7 +911,7 @@ void ED_gpencil_drawing_reference_get(const Scene *scene, } else { /* use object location */ - copy_v3_v3(r_vec, ob->object_to_world().location()); + copy_v3_v3(r_vec, ob->object_to_world[3]); /* Apply layer offset. */ bGPdata *gpd = static_cast(ob->data); bGPDlayer *gpl = BKE_gpencil_layer_active_get(gpd); @@ -992,7 +995,7 @@ void ED_gpencil_project_stroke_to_plane(const Scene *scene, /* if object, apply object rotation */ if (ob && (ob->type == OB_GPENCIL_LEGACY)) { float mat[4][4]; - copy_m4_m4(mat, ob->object_to_world().ptr()); + copy_m4_m4(mat, ob->object_to_world); /* move origin to cursor */ if ((ts->gpencil_v3d_align & GP_PROJECT_CURSOR) == 0) { @@ -1215,7 +1218,7 @@ void ED_gpencil_project_point_to_plane(const Scene *scene, /* if object, apply object rotation */ if (ob && (ob->type == OB_GPENCIL_LEGACY)) { float mat[4][4]; - copy_m4_m4(mat, ob->object_to_world().ptr()); + copy_m4_m4(mat, ob->object_to_world); if ((ts->gpencil_v3d_align & GP_PROJECT_CURSOR) == 0) { if (gpl != nullptr) { add_v3_v3(mat[3], gpl->location); @@ -1242,7 +1245,7 @@ void ED_gpencil_project_point_to_plane(const Scene *scene, /* move origin to object */ if ((ts->gpencil_v3d_align & GP_PROJECT_CURSOR) == 0) { - copy_v3_v3(mat[3], ob->object_to_world().location()); + copy_v3_v3(mat[3], ob->object_to_world[3]); } mul_mat3_m4_v3(mat, plane_normal); @@ -1376,16 +1379,16 @@ void ED_gpencil_reset_layers_parent(Depsgraph *depsgraph, Object *obact, bGPdata if (gpl->parent != nullptr) { /* calculate new matrix */ if (ELEM(gpl->partype, PAROBJECT, PARSKEL)) { - invert_m4_m4(cur_mat, gpl->parent->object_to_world().ptr()); - copy_v3_v3(gpl_loc, obact->object_to_world().location()); + invert_m4_m4(cur_mat, gpl->parent->object_to_world); + copy_v3_v3(gpl_loc, obact->object_to_world[3]); } else if (gpl->partype == PARBONE) { bPoseChannel *pchan = BKE_pose_channel_find_name(gpl->parent->pose, gpl->parsubstr); if (pchan) { float tmp_mat[4][4]; - mul_m4_m4m4(tmp_mat, gpl->parent->object_to_world().ptr(), pchan->pose_mat); + mul_m4_m4m4(tmp_mat, gpl->parent->object_to_world, pchan->pose_mat); invert_m4_m4(cur_mat, tmp_mat); - copy_v3_v3(gpl_loc, obact->object_to_world().location()); + copy_v3_v3(gpl_loc, obact->object_to_world[3]); } } @@ -2789,7 +2792,7 @@ void ED_gpencil_tag_scene_gpencil(Scene *scene) } FOREACH_SCENE_COLLECTION_END; - DEG_id_tag_update(&scene->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&scene->id, ID_RECALC_COPY_ON_WRITE); WM_main_add_notifier(NC_GPENCIL | NA_EDITED, nullptr); } @@ -2840,7 +2843,7 @@ void ED_gpencil_init_random_settings(Brush *brush, const int mval[2], GpRandomSettings *random_settings) { - int seed = (uint(ceil(BLI_time_now_seconds())) + 1) % 128; + int seed = (uint(ceil(BLI_check_seconds_timer())) + 1) % 128; /* Use mouse position to get randomness. */ int ix = mval[0] * seed; int iy = mval[1] * seed; @@ -2886,7 +2889,7 @@ static void gpencil_sbuffer_vertex_color_random( { BrushGpencilSettings *brush_settings = brush->gpencil_settings; if (brush_settings->flag & GP_BRUSH_GROUP_RANDOM) { - int seed = (uint(ceil(BLI_time_now_seconds())) + 1) % 128; + int seed = (uint(ceil(BLI_check_seconds_timer())) + 1) % 128; int ix = int(tpt->m_xy[0] * seed); int iy = int(tpt->m_xy[1] * seed); @@ -3093,8 +3096,9 @@ bool ED_gpencil_stroke_point_is_inside(const bGPDstroke *gps, return hit; } + int(*mcoords)[2] = nullptr; int len = gps->totpoints; - blender::Array mcoords(len); + mcoords = static_cast(MEM_mallocN(sizeof(int[2]) * len, __func__)); /* Convert stroke to 2D array of points. */ const bGPDspoint *pt; @@ -3107,11 +3111,14 @@ bool ED_gpencil_stroke_point_is_inside(const bGPDstroke *gps, /* Compute bound-box of lasso (for faster testing later). */ rcti rect; - BLI_lasso_boundbox(&rect, mcoords); + BLI_lasso_boundbox(&rect, mcoords, len); /* Test if point inside stroke. */ hit = (!ELEM(V2D_IS_CLIPPED, mval[0], mval[1]) && BLI_rcti_isect_pt(&rect, mval[0], mval[1]) && - BLI_lasso_is_point_inside(mcoords, mval[0], mval[1], INT_MAX)); + BLI_lasso_is_point_inside(mcoords, len, mval[0], mval[1], INT_MAX)); + + /* Free memory. */ + MEM_SAFE_FREE(mcoords); return hit; } @@ -3428,7 +3435,7 @@ int ED_gpencil_new_layer_dialog(bContext *C, wmOperator *op) bGPdata *gpd = static_cast(ob->data); gpencil_layer_new_name_get(gpd, name, sizeof(name)); RNA_property_string_set(op->ptr, prop, name); - return WM_operator_props_dialog_popup(C, op, 200, IFACE_("Add New Layer"), IFACE_("Add")); + return WM_operator_props_dialog_popup(C, op, 200); } } return 0; diff --git a/source/blender/editors/gpencil_legacy/gpencil_uv.cc b/source/blender/editors/gpencil_legacy/gpencil_uv.cc index 527d7133452..bd8fd7ec82f 100644 --- a/source/blender/editors/gpencil_legacy/gpencil_uv.cc +++ b/source/blender/editors/gpencil_legacy/gpencil_uv.cc @@ -10,12 +10,13 @@ #include "DNA_gpencil_legacy_types.h" +#include "BLI_blenlib.h" #include "BLI_math_matrix.h" #include "BLI_math_rotation.h" #include "BLI_math_vector.h" #include "BLI_string.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_context.hh" #include "BKE_gpencil_geom_legacy.h" @@ -143,7 +144,7 @@ static bool gpencil_uv_transform_init(bContext *C, wmOperator *op) opdata->array_loc = nullptr; opdata->array_rot = nullptr; opdata->array_scale = nullptr; - opdata->ob_scale = mat4_to_scale(opdata->ob->object_to_world().ptr()); + opdata->ob_scale = mat4_to_scale(opdata->ob->object_to_world); opdata->vinit_rotation[0] = 1.0f; opdata->vinit_rotation[1] = 0.0f; @@ -163,7 +164,7 @@ static bool gpencil_uv_transform_init(bContext *C, wmOperator *op) float r_center[3]; gpencil_stroke_center(gps, r_center); /* Add object location. */ - add_v3_v3(r_center, opdata->ob->object_to_world().location()); + add_v3_v3(r_center, opdata->ob->object_to_world[3]); add_v3_v3(center, r_center); i++; } diff --git a/source/blender/editors/gpencil_legacy/gpencil_vertex_ops.cc b/source/blender/editors/gpencil_legacy/gpencil_vertex_ops.cc index b74b0b33acf..6648cab4f49 100644 --- a/source/blender/editors/gpencil_legacy/gpencil_vertex_ops.cc +++ b/source/blender/editors/gpencil_legacy/gpencil_vertex_ops.cc @@ -19,9 +19,10 @@ #include "DNA_material_types.h" #include "BKE_context.hh" +#include "BKE_main.hh" #include "BKE_material.h" #include "BKE_paint.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "WM_api.hh" #include "WM_types.hh" @@ -1128,8 +1129,9 @@ static int gpencil_stroke_reset_vertex_color_exec(bContext *C, wmOperator *op) if (changed) { /* updates */ - DEG_id_tag_update(&gpd->id, ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY | ID_RECALC_SYNC_TO_EVAL); - DEG_id_tag_update(&obact->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&gpd->id, + ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY | ID_RECALC_COPY_ON_WRITE); + DEG_id_tag_update(&obact->id, ID_RECALC_COPY_ON_WRITE); WM_event_add_notifier(C, NC_GPENCIL | ND_DATA | NA_EDITED, nullptr); } diff --git a/source/blender/editors/gpencil_legacy/gpencil_vertex_paint.cc b/source/blender/editors/gpencil_legacy/gpencil_vertex_paint.cc index 69e4433a2ff..a6d73a2a5ca 100644 --- a/source/blender/editors/gpencil_legacy/gpencil_vertex_paint.cc +++ b/source/blender/editors/gpencil_legacy/gpencil_vertex_paint.cc @@ -9,11 +9,12 @@ #include "MEM_guardedalloc.h" +#include "BLI_blenlib.h" #include "BLI_math_color.h" #include "BLI_math_matrix.h" #include "BLI_math_vector.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_brush_types.h" #include "DNA_gpencil_legacy_types.h" @@ -24,7 +25,7 @@ #include "BKE_context.hh" #include "BKE_gpencil_legacy.h" #include "BKE_material.h" -#include "BKE_report.hh" +#include "BKE_report.h" #include "WM_api.hh" #include "WM_types.hh" @@ -37,6 +38,7 @@ #include "ED_gpencil_legacy.hh" #include "ED_screen.hh" +#include "ED_view3d.hh" #include "DEG_depsgraph.hh" #include "DEG_depsgraph_query.hh" diff --git a/source/blender/editors/gpencil_legacy/gpencil_weight_paint.cc b/source/blender/editors/gpencil_legacy/gpencil_weight_paint.cc index 88557c221b0..25e1ca181af 100644 --- a/source/blender/editors/gpencil_legacy/gpencil_weight_paint.cc +++ b/source/blender/editors/gpencil_legacy/gpencil_weight_paint.cc @@ -9,13 +9,14 @@ #include "MEM_guardedalloc.h" +#include "BLI_blenlib.h" #include "BLI_ghash.h" #include "BLI_kdtree.h" #include "BLI_listbase.h" #include "BLI_math_matrix.h" #include "BLI_math_vector.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_armature_types.h" #include "DNA_brush_types.h" @@ -28,9 +29,10 @@ #include "BKE_context.hh" #include "BKE_deform.hh" #include "BKE_gpencil_legacy.h" +#include "BKE_main.hh" #include "BKE_modifier.hh" #include "BKE_object_deform.h" -#include "BKE_report.hh" +#include "BKE_report.h" #include "DNA_meshdata_types.h" #include "WM_api.hh" @@ -44,6 +46,7 @@ #include "ED_gpencil_legacy.hh" #include "ED_screen.hh" +#include "ED_view3d.hh" #include "DEG_depsgraph.hh" #include "DEG_depsgraph_query.hh" diff --git a/source/blender/editors/grease_pencil/CMakeLists.txt b/source/blender/editors/grease_pencil/CMakeLists.txt index 2c15a93d16b..4da4d090537 100644 --- a/source/blender/editors/grease_pencil/CMakeLists.txt +++ b/source/blender/editors/grease_pencil/CMakeLists.txt @@ -29,18 +29,15 @@ set(SRC intern/grease_pencil_material.cc intern/grease_pencil_ops.cc intern/grease_pencil_select.cc - intern/grease_pencil_undo.cc intern/grease_pencil_utils.cc ) set(LIB bf_blenkernel - PRIVATE bf::animrig PRIVATE bf::blenlib PRIVATE bf::depsgraph PRIVATE bf::dna PRIVATE bf::intern::guardedalloc - PRIVATE bf::intern::clog extern_curve_fit_nd ) diff --git a/source/blender/editors/grease_pencil/intern/grease_pencil_add.cc b/source/blender/editors/grease_pencil/intern/grease_pencil_add.cc index cd126d5857f..03da46592e0 100644 --- a/source/blender/editors/grease_pencil/intern/grease_pencil_add.cc +++ b/source/blender/editors/grease_pencil/intern/grease_pencil_add.cc @@ -15,9 +15,10 @@ #include "BLI_math_matrix.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_material_types.h" +#include "DNA_scene_types.h" #include "ED_grease_pencil.hh" @@ -1185,7 +1186,7 @@ void create_blank(Main &bmain, Object &object, const int frame_number) grease_pencil.insert_blank_frame(new_layer, frame_number, 0, BEZT_KEYTYPE_KEYFRAME); } -void create_stroke(Main &bmain, Object &object, const float4x4 &matrix, const int frame_number) +void create_stroke(Main &bmain, Object &object, float4x4 matrix, const int frame_number) { using namespace blender::bke::greasepencil; GreasePencil &grease_pencil = *static_cast(object.data); @@ -1213,7 +1214,7 @@ void create_stroke(Main &bmain, Object &object, const float4x4 &matrix, const in drawing_lines.tag_topology_changed(); } -void create_suzanne(Main &bmain, Object &object, const float4x4 &matrix, const int frame_number) +void create_suzanne(Main &bmain, Object &object, float4x4 matrix, const int frame_number) { /* Original model created by Matias Mendiola. */ using namespace blender::bke::greasepencil; diff --git a/source/blender/editors/grease_pencil/intern/grease_pencil_edit.cc b/source/blender/editors/grease_pencil/intern/grease_pencil_edit.cc index 57f1e1696d8..11daacf6388 100644 --- a/source/blender/editors/grease_pencil/intern/grease_pencil_edit.cc +++ b/source/blender/editors/grease_pencil/intern/grease_pencil_edit.cc @@ -12,7 +12,9 @@ #include "BLI_math_geom.h" #include "BLI_math_vector_types.hh" #include "BLI_span.hh" -#include "BLT_translation.hh" +#include "BLI_stack.hh" +#include "BLI_string.h" +#include "BLT_translation.h" #include "DNA_material_types.h" #include "DNA_scene_types.h" @@ -20,12 +22,10 @@ #include "BKE_attribute.hh" #include "BKE_context.hh" #include "BKE_curves_utils.hh" -#include "BKE_deform.hh" #include "BKE_grease_pencil.hh" #include "BKE_lib_id.hh" -#include "BKE_main.hh" #include "BKE_material.h" -#include "BKE_report.hh" +#include "BKE_report.h" #include "RNA_access.hh" #include "RNA_define.hh" @@ -36,6 +36,7 @@ #include "ED_curves.hh" #include "ED_grease_pencil.hh" #include "ED_object.hh" +#include "ED_screen.hh" #include "GEO_join_geometries.hh" #include "GEO_reorder.hh" @@ -71,7 +72,7 @@ static int grease_pencil_stroke_smooth_exec(bContext *C, wmOperator *op) } bool changed = false; - const Vector drawings = retrieve_editable_drawings(*scene, grease_pencil); + const Array drawings = retrieve_editable_drawings(*scene, grease_pencil); threading::parallel_for_each(drawings, [&](const MutableDrawingInfo &info) { bke::CurvesGeometry &curves = info.drawing.strokes_for_write(); if (curves.points_num() == 0) { @@ -233,7 +234,7 @@ static int grease_pencil_stroke_simplify_exec(bContext *C, wmOperator *op) const float epsilon = RNA_float_get(op->ptr, "factor"); bool changed = false; - const Vector drawings = retrieve_editable_drawings(*scene, grease_pencil); + const Array drawings = retrieve_editable_drawings(*scene, grease_pencil); threading::parallel_for_each(drawings, [&](const MutableDrawingInfo &info) { bke::CurvesGeometry &curves = info.drawing.strokes_for_write(); if (curves.points_num() == 0) { @@ -414,8 +415,6 @@ static bke::CurvesGeometry remove_points_and_split(const bke::CurvesGeometry &cu bke::CurvesGeometry dst_curves(total_points, total_curves); - BKE_defgroup_copy_list(&dst_curves.vertex_group_names, &curves.vertex_group_names); - MutableSpan new_curve_offsets = dst_curves.offsets_for_write(); array_utils::copy(dst_curve_counts.as_span(), new_curve_offsets.drop_back(1)); offset_indices::accumulate_counts_to_offsets(new_curve_offsets); @@ -448,7 +447,7 @@ static int grease_pencil_delete_exec(bContext *C, wmOperator * /*op*/) scene->toolsettings); bool changed = false; - const Vector drawings = retrieve_editable_drawings(*scene, grease_pencil); + const Array drawings = retrieve_editable_drawings(*scene, grease_pencil); threading::parallel_for_each(drawings, [&](const MutableDrawingInfo &info) { IndexMaskMemory memory; const IndexMask elements = ed::greasepencil::retrieve_editable_and_selected_elements( @@ -591,7 +590,7 @@ static int grease_pencil_dissolve_exec(bContext *C, wmOperator *op) const DissolveMode mode = DissolveMode(RNA_enum_get(op->ptr, "type")); bool changed = false; - const Vector drawings = retrieve_editable_drawings(*scene, grease_pencil); + const Array drawings = retrieve_editable_drawings(*scene, grease_pencil); threading::parallel_for_each(drawings, [&](const MutableDrawingInfo &info) { bke::CurvesGeometry &curves = info.drawing.strokes_for_write(); if (curves.points_num() == 0) { @@ -764,7 +763,7 @@ static int grease_pencil_stroke_material_set_exec(bContext *C, wmOperator *op) return OPERATOR_CANCELLED; } - const Vector drawings = retrieve_editable_drawings(*scene, grease_pencil); + const Array drawings = retrieve_editable_drawings(*scene, grease_pencil); threading::parallel_for_each(drawings, [&](const MutableDrawingInfo &info) { IndexMaskMemory memory; IndexMask strokes = ed::greasepencil::retrieve_editable_and_selected_strokes( @@ -833,7 +832,7 @@ static int grease_pencil_cyclical_set_exec(bContext *C, wmOperator *op) const CyclicalMode mode = CyclicalMode(RNA_enum_get(op->ptr, "type")); bool changed = false; - const Vector drawings = retrieve_editable_drawings(*scene, grease_pencil); + const Array drawings = retrieve_editable_drawings(*scene, grease_pencil); threading::parallel_for_each(drawings, [&](const MutableDrawingInfo &info) { bke::CurvesGeometry &curves = info.drawing.strokes_for_write(); if (mode == CyclicalMode::OPEN && !curves.attributes().contains("cyclic")) { @@ -914,7 +913,7 @@ static int grease_pencil_set_active_material_exec(bContext *C, wmOperator * /*op return OPERATOR_CANCELLED; } - const Vector drawings = retrieve_editable_drawings(*scene, grease_pencil); + const Array drawings = retrieve_editable_drawings(*scene, grease_pencil); for (const MutableDrawingInfo &info : drawings) { IndexMaskMemory memory; const IndexMask strokes = ed::greasepencil::retrieve_editable_and_selected_strokes( @@ -962,7 +961,7 @@ static int grease_pencil_set_uniform_thickness_exec(bContext *C, wmOperator *op) const float radius = RNA_float_get(op->ptr, "thickness") * 0.5f; bool changed = false; - const Vector drawings = retrieve_editable_drawings(*scene, grease_pencil); + const Array drawings = retrieve_editable_drawings(*scene, grease_pencil); threading::parallel_for_each(drawings, [&](const MutableDrawingInfo &info) { IndexMaskMemory memory; const IndexMask strokes = ed::greasepencil::retrieve_editable_and_selected_strokes( @@ -1019,7 +1018,7 @@ static int grease_pencil_set_uniform_opacity_exec(bContext *C, wmOperator *op) const float opacity = RNA_float_get(op->ptr, "opacity"); bool changed = false; - const Vector drawings = retrieve_editable_drawings(*scene, grease_pencil); + const Array drawings = retrieve_editable_drawings(*scene, grease_pencil); threading::parallel_for_each(drawings, [&](const MutableDrawingInfo &info) { IndexMaskMemory memory; const IndexMask strokes = ed::greasepencil::retrieve_editable_and_selected_strokes( @@ -1074,7 +1073,7 @@ static int grease_pencil_stroke_switch_direction_exec(bContext *C, wmOperator * GreasePencil &grease_pencil = *static_cast(object->data); bool changed = false; - const Vector drawings = retrieve_editable_drawings(*scene, grease_pencil); + const Array drawings = retrieve_editable_drawings(*scene, grease_pencil); threading::parallel_for_each(drawings, [&](const MutableDrawingInfo &info) { IndexMaskMemory memory; const IndexMask strokes = ed::greasepencil::retrieve_editable_and_selected_strokes( @@ -1150,7 +1149,7 @@ static int grease_pencil_caps_set_exec(bContext *C, wmOperator *op) const CapsMode mode = CapsMode(RNA_enum_get(op->ptr, "type")); bool changed = false; - const Vector drawings = retrieve_editable_drawings(*scene, grease_pencil); + const Array drawings = retrieve_editable_drawings(*scene, grease_pencil); threading::parallel_for_each(drawings, [&](const MutableDrawingInfo &info) { bke::CurvesGeometry &curves = info.drawing.strokes_for_write(); IndexMaskMemory memory; @@ -1326,7 +1325,7 @@ static int grease_pencil_duplicate_exec(bContext *C, wmOperator * /*op*/) scene->toolsettings); std::atomic changed = false; - const Vector drawings = retrieve_editable_drawings(*scene, grease_pencil); + const Array drawings = retrieve_editable_drawings(*scene, grease_pencil); threading::parallel_for_each(drawings, [&](const MutableDrawingInfo &info) { IndexMaskMemory memory; const IndexMask elements = retrieve_editable_and_selected_elements( @@ -1374,9 +1373,9 @@ static int grease_pencil_clean_loose_exec(bContext *C, wmOperator *op) const int limit = RNA_int_get(op->ptr, "limit"); GreasePencil &grease_pencil = *static_cast(object->data); - const Vector drawings = retrieve_editable_drawings(scene, grease_pencil); + Array drawings = retrieve_editable_drawings(scene, grease_pencil); - threading::parallel_for_each(drawings, [&](const MutableDrawingInfo &info) { + threading::parallel_for_each(drawings, [&](MutableDrawingInfo &info) { bke::CurvesGeometry &curves = info.drawing.strokes_for_write(); const OffsetIndices points_by_curve = curves.points_by_curve(); @@ -1440,7 +1439,7 @@ static int gpencil_stroke_subdivide_exec(bContext *C, wmOperator *op) const bke::AttrDomain selection_domain = ED_grease_pencil_selection_domain_get( scene->toolsettings); - const Vector drawings = retrieve_editable_drawings(*scene, grease_pencil); + const Array drawings = retrieve_editable_drawings(*scene, grease_pencil); threading::parallel_for_each(drawings, [&](const MutableDrawingInfo &info) { IndexMaskMemory memory; @@ -1637,7 +1636,7 @@ static int grease_pencil_stroke_reorder_exec(bContext *C, wmOperator *op) const ReorderDirection direction = ReorderDirection(RNA_enum_get(op->ptr, "direction")); std::atomic changed = false; - const Vector drawings = retrieve_editable_drawings(*scene, grease_pencil); + const Array drawings = retrieve_editable_drawings(*scene, grease_pencil); threading::parallel_for_each(drawings, [&](const MutableDrawingInfo &info) { IndexMaskMemory memory; const IndexMask strokes = ed::greasepencil::retrieve_editable_and_selected_strokes( @@ -1700,6 +1699,15 @@ static void GREASE_PENCIL_OT_stroke_reorder(wmOperatorType *ot) /** \name Move To Layer Operator * \{ */ +static int grease_pencil_move_to_layer_invoke(bContext *C, wmOperator *op, const wmEvent *event) +{ + const bool add_new_layer = RNA_boolean_get(op->ptr, "add_new_layer"); + if (add_new_layer) { + return WM_operator_props_popup_confirm(C, op, event); + } + return OPERATOR_RUNNING_MODAL; +} + static int grease_pencil_move_to_layer_exec(bContext *C, wmOperator *op) { using namespace bke::greasepencil; @@ -1731,8 +1739,7 @@ static int grease_pencil_move_to_layer_exec(bContext *C, wmOperator *op) } /* Iterate through all the drawings at current scene frame. */ - const Vector drawings_src = retrieve_editable_drawings(*scene, - grease_pencil); + const Array drawings_src = retrieve_editable_drawings(*scene, grease_pencil); for (const MutableDrawingInfo &info : drawings_src) { bke::CurvesGeometry &curves_src = info.drawing.strokes_for_write(); IndexMaskMemory memory; @@ -1783,15 +1790,6 @@ static int grease_pencil_move_to_layer_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } -static int grease_pencil_move_to_layer_invoke(bContext *C, wmOperator *op, const wmEvent *event) -{ - const bool add_new_layer = RNA_boolean_get(op->ptr, "add_new_layer"); - if (add_new_layer) { - return WM_operator_props_popup_confirm(C, op, event); - } - return grease_pencil_move_to_layer_exec(C, op); -} - static void GREASE_PENCIL_OT_move_to_layer(wmOperatorType *ot) { PropertyRNA *prop; @@ -1845,10 +1843,7 @@ static void remove_unused_materials(Main *bmain, Object *object) for (int slot = 1; slot <= object->totcol; slot++) { while (slot <= object->totcol && !BKE_object_material_slot_used(object, slot)) { object->actcol = slot; - if (!BKE_object_material_slot_remove(bmain, object)) { - break; - } - + BKE_object_material_slot_remove(bmain, object); if (actcol >= slot) { actcol--; } @@ -1911,8 +1906,8 @@ static bool grease_pencil_separate_selected(bContext &C, GreasePencil &grease_pencil_dst = *static_cast(object_dst->data); /* Iterate through all the drawings at current scene frame. */ - const Vector drawings_src = retrieve_editable_drawings(scene, - grease_pencil_src); + const Array drawings_src = retrieve_editable_drawings(scene, + grease_pencil_src); for (const MutableDrawingInfo &info : drawings_src) { bke::CurvesGeometry &curves_src = info.drawing.strokes_for_write(); IndexMaskMemory memory; @@ -1981,7 +1976,7 @@ static bool grease_pencil_separate_layer(bContext &C, grease_pencil_src.layers().first_index(layer_src), grease_pencil_src, grease_pencil_dst); /* Iterate through all the drawings at current frame. */ - const Vector drawings_src = retrieve_editable_drawings_from_layer( + const Array drawings_src = retrieve_editable_drawings_from_layer( scene, grease_pencil_src, *layer_src); for (const MutableDrawingInfo &info : drawings_src) { bke::CurvesGeometry &curves_src = info.drawing.strokes_for_write(); @@ -2038,10 +2033,6 @@ static bool grease_pencil_separate_material(bContext &C, /* Create a new object for each material. */ for (const int mat_i : IndexRange(object_src.totcol).drop_front(1)) { - if (!BKE_object_material_slot_used(&object_src, mat_i + 1)) { - continue; - } - Object *object_dst = duplicate_grease_pencil_object( &bmain, &scene, &view_layer, &base_prev, grease_pencil_src); @@ -2053,8 +2044,8 @@ static bool grease_pencil_separate_material(bContext &C, false); /* Iterate through all the drawings at current scene frame. */ - const Vector drawings_src = retrieve_editable_drawings(scene, - grease_pencil_src); + const Array drawings_src = retrieve_editable_drawings(scene, + grease_pencil_src); for (const MutableDrawingInfo &info : drawings_src) { bke::CurvesGeometry &curves_src = info.drawing.strokes_for_write(); IndexMaskMemory memory; @@ -2113,8 +2104,8 @@ static int grease_pencil_separate_exec(bContext *C, wmOperator *op) switch (mode) { case SeparateMode::SELECTED: { /* Cancel if nothing selected. */ - const Vector drawings = retrieve_editable_drawings(*scene, - grease_pencil_src); + const Array drawings = retrieve_editable_drawings(*scene, + grease_pencil_src); const bool has_selection = std::any_of( drawings.begin(), drawings.end(), [&](const MutableDrawingInfo &info) { return ed::curves::has_anything_selected(info.drawing.strokes()); @@ -2186,253 +2177,6 @@ static void GREASE_PENCIL_OT_separate(wmOperatorType *ot) /** \} */ -/* -------------------------------------------------------------------- */ -/** \name Copy and Paste Operator - * \{ */ - -/* Global clipboard for Grease Pencil curves. */ -struct Clipboard { - bke::CurvesGeometry curves; - /* We store the material uid's of the copied curves, so we can match those when pasting the - * clipboard into another object. */ - Vector> materials; - int materials_in_source_num; -}; - -static Clipboard &get_grease_pencil_clipboard() -{ - static Clipboard clipboard; - return clipboard; -} - -static int grease_pencil_paste_strokes_exec(bContext *C, wmOperator *op) -{ - Main *bmain = CTX_data_main(C); - const Scene &scene = *CTX_data_scene(C); - Object *object = CTX_data_active_object(C); - const bke::AttrDomain selection_domain = ED_grease_pencil_selection_domain_get( - scene.toolsettings); - GreasePencil &grease_pencil = *static_cast(object->data); - const bool paste_on_back = RNA_boolean_get(op->ptr, "paste_back"); - - Clipboard &clipboard = get_grease_pencil_clipboard(); - - /* Get active layer in the target object. */ - if (!grease_pencil.has_active_layer()) { - BKE_report(op->reports, RPT_ERROR, "No active Grease Pencil layer"); - return OPERATOR_CANCELLED; - } - const bke::greasepencil::Layer &active_layer = *grease_pencil.get_active_layer(); - if (!active_layer.is_editable()) { - BKE_report(op->reports, RPT_ERROR, "Active layer is locked or hidden"); - return OPERATOR_CANCELLED; - } - - /* Ensure active keyframe. */ - if (!ensure_active_keyframe(scene, grease_pencil)) { - BKE_report(op->reports, RPT_ERROR, "No Grease Pencil frame to draw on"); - return OPERATOR_CANCELLED; - } - bke::greasepencil::Drawing *target_drawing = grease_pencil.get_editable_drawing_at(active_layer, - scene.r.cfra); - if (target_drawing == nullptr) { - return OPERATOR_CANCELLED; - } - - /* Deselect everything in the target layer. The pasted strokes are the only ones then after the - * paste. That's convenient for the user. */ - bke::GSpanAttributeWriter selection_in_target = ed::curves::ensure_selection_attribute( - target_drawing->strokes_for_write(), selection_domain, CD_PROP_BOOL); - ed::curves::fill_selection_false(selection_in_target.span); - selection_in_target.finish(); - - /* Get a list of all materials in the scene. */ - Map scene_materials; - LISTBASE_FOREACH (Material *, material, &bmain->materials) { - scene_materials.add(material->id.session_uid, material); - } - - /* Map the materials used in the clipboard curves to the materials in the target object. */ - Array clipboard_material_remap(clipboard.materials_in_source_num, 0); - for (const int i : clipboard.materials.index_range()) { - /* Check if the material name exists in the scene. */ - int target_index; - uint material_id = clipboard.materials[i].first; - Material *material = scene_materials.lookup_default(material_id, nullptr); - if (!material) { - /* Material is removed, so create a new material. */ - BKE_grease_pencil_object_material_new(bmain, object, nullptr, &target_index); - clipboard_material_remap[clipboard.materials[i].second] = target_index; - continue; - } - - /* Find or add the material to the target object. */ - target_index = BKE_object_material_ensure(bmain, object, material); - clipboard_material_remap[clipboard.materials[i].second] = target_index; - } - - /* Get the index range of the pasted curves in the target layer. */ - IndexRange pasted_curves_range = paste_on_back ? - IndexRange(0, clipboard.curves.curves_num()) : - IndexRange(target_drawing->strokes().curves_num(), - clipboard.curves.curves_num()); - - /* Append the geometry from the clipboard to the target layer. */ - Curves *clipboard_curves = curves_new_nomain(clipboard.curves); - Curves *target_curves = curves_new_nomain(std::move(target_drawing->strokes_for_write())); - Array geometry_sets = { - bke::GeometrySet::from_curves(paste_on_back ? clipboard_curves : target_curves), - bke::GeometrySet::from_curves(paste_on_back ? target_curves : clipboard_curves)}; - bke::GeometrySet joined_curves = geometry::join_geometries(geometry_sets, {}); - target_drawing->strokes_for_write() = std::move( - joined_curves.get_curves_for_write()->geometry.wrap()); - - /* Remap the material indices of the pasted curves to the target object material indices. */ - bke::MutableAttributeAccessor attributes = - target_drawing->strokes_for_write().attributes_for_write(); - bke::SpanAttributeWriter material_indices = attributes.lookup_or_add_for_write_span( - "material_index", bke::AttrDomain::Curve); - if (material_indices) { - for (const int i : pasted_curves_range) { - material_indices.span[i] = clipboard_material_remap[material_indices.span[i]]; - } - material_indices.finish(); - } - - target_drawing->tag_topology_changed(); - DEG_id_tag_update(&grease_pencil.id, ID_RECALC_GEOMETRY); - WM_event_add_notifier(C, NC_GEOM | ND_DATA, &grease_pencil); - - return OPERATOR_FINISHED; -} - -static int grease_pencil_copy_strokes_exec(bContext *C, wmOperator *op) -{ - const Scene *scene = CTX_data_scene(C); - const Object *object = CTX_data_active_object(C); - GreasePencil &grease_pencil = *static_cast(object->data); - const bke::AttrDomain selection_domain = ED_grease_pencil_selection_domain_get( - scene->toolsettings); - - Clipboard &clipboard = get_grease_pencil_clipboard(); - - bool anything_copied = false; - int num_copied = 0; - Vector set_of_copied_curves; - - /* Collect all selected strokes/points on all editable layers. */ - const Vector drawings = retrieve_editable_drawings(*scene, grease_pencil); - for (const MutableDrawingInfo &drawing_info : drawings) { - const bke::CurvesGeometry &curves = drawing_info.drawing.strokes(); - - if (curves.curves_num() == 0) { - continue; - } - if (!ed::curves::has_anything_selected(curves)) { - continue; - } - - /* Get a copy of the selected geometry on this layer. */ - IndexMaskMemory memory; - bke::CurvesGeometry copied_curves; - - if (selection_domain == bke::AttrDomain::Curve) { - const IndexMask selected_curves = ed::curves::retrieve_selected_curves(curves, memory); - copied_curves = curves_copy_curve_selection(curves, selected_curves, {}); - num_copied += copied_curves.curves_num(); - } - else if (selection_domain == bke::AttrDomain::Point) { - const IndexMask selected_points = ed::curves::retrieve_selected_points(curves, memory); - copied_curves = curves_copy_point_selection(curves, selected_points, {}); - num_copied += copied_curves.points_num(); - } - - /* Add the layer selection to the set of copied curves. */ - Curves *layer_curves = curves_new_nomain(std::move(copied_curves)); - set_of_copied_curves.append(bke::GeometrySet::from_curves(layer_curves)); - anything_copied = true; - } - - if (!anything_copied) { - return OPERATOR_CANCELLED; - } - - /* Merge all copied curves into one CurvesGeometry object and assign it to the clipboard. */ - bke::GeometrySet joined_copied_curves = geometry::join_geometries(set_of_copied_curves, {}); - clipboard.curves = std::move(joined_copied_curves.get_curves_for_write()->geometry.wrap()); - - /* Store the session uid of the materials used by the curves in the clipboard. We use the uid to - * remap the material indices when pasting. */ - clipboard.materials.clear(); - clipboard.materials_in_source_num = grease_pencil.material_array_num; - const bke::AttributeAccessor attributes = clipboard.curves.attributes(); - const VArraySpan material_indices = *attributes.lookup_or_default( - "material_index", bke::AttrDomain::Curve, 0); - for (const int material_index : IndexRange(grease_pencil.material_array_num)) { - if (!material_indices.contains(material_index)) { - continue; - } - const Material *material = grease_pencil.material_array[material_index]; - clipboard.materials.append({material->id.session_uid, material_index}); - } - - /* Report the numbers. */ - if (selection_domain == bke::AttrDomain::Curve) { - BKE_reportf(op->reports, RPT_INFO, "Copied %d selected curve(s)", num_copied); - } - else if (selection_domain == bke::AttrDomain::Point) { - BKE_reportf(op->reports, RPT_INFO, "Copied %d selected point(s)", num_copied); - } - - return OPERATOR_FINISHED; -} - -static bool grease_pencil_paste_strokes_poll(bContext *C) -{ - if (!editable_grease_pencil_poll(C)) { - return false; - } - - /* Check for curves in the Grease Pencil clipboard. */ - Clipboard &clipboard = get_grease_pencil_clipboard(); - return (clipboard.curves.curves_num() > 0); -} - -static void GREASE_PENCIL_OT_paste(wmOperatorType *ot) -{ - /* Identifiers. */ - ot->name = "Paste Strokes"; - ot->idname = "GREASE_PENCIL_OT_paste"; - ot->description = - "Paste Grease Pencil points or strokes from the internal clipboard to the active layer"; - - /* Callbacks. */ - ot->exec = grease_pencil_paste_strokes_exec; - ot->poll = grease_pencil_paste_strokes_poll; - - ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; - - ot->prop = RNA_def_boolean( - ot->srna, "paste_back", false, "Paste on Back", "Add pasted strokes behind all strokes"); - RNA_def_property_flag(ot->prop, PROP_SKIP_SAVE); -} - -static void GREASE_PENCIL_OT_copy(wmOperatorType *ot) -{ - /* Identifiers. */ - ot->name = "Copy Strokes"; - ot->idname = "GREASE_PENCIL_OT_copy"; - ot->description = "Copy the selected Grease Pencil points or strokes to the internal clipboard"; - - /* Callbacks. */ - ot->exec = grease_pencil_copy_strokes_exec; - ot->poll = editable_grease_pencil_poll; - - ot->flag = OPTYPE_REGISTER; -} - -/** \} */ - } // namespace blender::ed::greasepencil void ED_operatortypes_grease_pencil_edit() @@ -2457,6 +2201,4 @@ void ED_operatortypes_grease_pencil_edit() WM_operatortype_append(GREASE_PENCIL_OT_stroke_subdivide); WM_operatortype_append(GREASE_PENCIL_OT_stroke_reorder); WM_operatortype_append(GREASE_PENCIL_OT_move_to_layer); - WM_operatortype_append(GREASE_PENCIL_OT_copy); - WM_operatortype_append(GREASE_PENCIL_OT_paste); } diff --git a/source/blender/editors/grease_pencil/intern/grease_pencil_frames.cc b/source/blender/editors/grease_pencil/intern/grease_pencil_frames.cc index 48288d7fc71..87bd4c27d10 100644 --- a/source/blender/editors/grease_pencil/intern/grease_pencil_frames.cc +++ b/source/blender/editors/grease_pencil/intern/grease_pencil_frames.cc @@ -12,14 +12,11 @@ #include "BKE_context.hh" #include "BKE_grease_pencil.hh" -#include "BKE_report.hh" #include "DEG_depsgraph.hh" #include "DNA_scene_types.h" -#include "ANIM_keyframing.hh" - #include "ED_grease_pencil.hh" #include "ED_keyframes_edit.hh" #include "ED_markers.hh" @@ -37,7 +34,6 @@ void set_selected_frames_type(bke::greasepencil::Layer &layer, for (GreasePencilFrame &frame : layer.frames_for_write().values()) { if (frame.is_selected()) { frame.type = key_type; - layer.tag_frames_map_changed(); } } } @@ -174,10 +170,6 @@ bool duplicate_selected_frames(GreasePencil &grease_pencil, bke::greasepencil::L changed = true; } - if (changed) { - layer.tag_frames_map_changed(); - } - return changed; } @@ -218,7 +210,6 @@ bool select_frame_at(bke::greasepencil::Layer &layer, return false; } select_frame(*frame, select_mode); - layer.tag_frames_map_changed(); return true; } @@ -241,7 +232,6 @@ void select_all_frames(bke::greasepencil::Layer &layer, const short select_mode) { for (auto item : layer.frames_for_write().items()) { select_frame(item.value, select_mode); - layer.tag_frames_map_changed(); } } @@ -279,8 +269,6 @@ void select_frames_region(KeyframeEditData *ked, select_frame(frame, select_mode); } } - - node.as_layer().tag_frames_map_changed(); } } else if (node.is_group()) { @@ -300,7 +288,6 @@ void select_frames_range(bke::greasepencil::TreeNode &node, for (auto [frame_number, frame] : node.as_layer().frames_for_write().items()) { if (IN_RANGE(float(frame_number), min, max)) { select_frame(frame, select_mode); - node.as_layer().tag_frames_map_changed(); } } } @@ -333,44 +320,6 @@ void create_keyframe_edit_data_selected_frames_list(KeyframeEditData *ked, } } -bool ensure_active_keyframe(const Scene &scene, GreasePencil &grease_pencil) -{ - const int current_frame = scene.r.cfra; - bke::greasepencil::Layer &active_layer = *grease_pencil.get_active_layer(); - - if (!active_layer.has_drawing_at(current_frame) && !blender::animrig::is_autokey_on(&scene)) { - return false; - } - - /* If auto-key is on and the drawing at the current frame starts before the current frame a new - * keyframe needs to be inserted. */ - const bool is_first = active_layer.sorted_keys().is_empty() || - (active_layer.sorted_keys().first() > current_frame); - const bool needs_new_drawing = is_first || - (*active_layer.frame_key_at(current_frame) < current_frame); - - if (blender::animrig::is_autokey_on(&scene) && needs_new_drawing) { - const Brush *brush = scene.toolsettings->gp_paint->paint.brush; - if (((scene.toolsettings->gpencil_flags & GP_TOOL_FLAG_RETAIN_LAST) != 0) || - (brush->gpencil_tool == GPAINT_TOOL_ERASE)) - { - /* For additive drawing, we duplicate the frame that's currently visible and insert it at the - * current frame. Also duplicate the frame when erasing, Otherwise empty drawing is added, - * see !119051 */ - grease_pencil.insert_duplicate_frame( - active_layer, *active_layer.frame_key_at(current_frame), current_frame, false); - } - else { - /* Otherwise we just insert a blank keyframe at the current frame. */ - grease_pencil.insert_blank_frame(active_layer, current_frame, 0, BEZT_KEYTYPE_KEYFRAME); - } - } - /* There should now always be a drawing at the current frame. */ - BLI_assert(active_layer.has_drawing_at(current_frame)); - - return true; -} - static int insert_blank_frame_exec(bContext *C, wmOperator *op) { using namespace blender::bke::greasepencil; diff --git a/source/blender/editors/grease_pencil/intern/grease_pencil_layers.cc b/source/blender/editors/grease_pencil/intern/grease_pencil_layers.cc index aefe1b71dd4..658b50e04ad 100644 --- a/source/blender/editors/grease_pencil/intern/grease_pencil_layers.cc +++ b/source/blender/editors/grease_pencil/intern/grease_pencil_layers.cc @@ -8,7 +8,6 @@ #include "BKE_context.hh" #include "BKE_grease_pencil.hh" -#include "BKE_report.hh" #include "DEG_depsgraph.hh" @@ -114,7 +113,7 @@ static void GREASE_PENCIL_OT_layer_remove(wmOperatorType *ot) /* callbacks */ ot->exec = grease_pencil_layer_remove_exec; - ot->poll = active_grease_pencil_layer_poll; + ot->poll = active_grease_pencil_poll; ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } @@ -308,7 +307,6 @@ static int grease_pencil_layer_hide_exec(bContext *C, wmOperator *op) /* notifiers */ DEG_id_tag_update(&grease_pencil.id, ID_RECALC_GEOMETRY); WM_event_add_notifier(C, NC_GEOM | ND_DATA, &grease_pencil); - WM_event_add_notifier(C, NC_GPENCIL | NA_EDITED, nullptr); return OPERATOR_FINISHED; } @@ -351,7 +349,6 @@ static int grease_pencil_layer_reveal_exec(bContext *C, wmOperator * /*op*/) /* notifiers */ DEG_id_tag_update(&grease_pencil.id, ID_RECALC_GEOMETRY); WM_event_add_notifier(C, NC_GEOM | ND_DATA, &grease_pencil); - WM_event_add_notifier(C, NC_GPENCIL | NA_EDITED, nullptr); return OPERATOR_FINISHED; } @@ -373,7 +370,7 @@ static void GREASE_PENCIL_OT_layer_reveal(wmOperatorType *ot) static int grease_pencil_layer_isolate_exec(bContext *C, wmOperator *op) { - using namespace blender::bke::greasepencil; + using namespace ::blender::bke::greasepencil; Object *object = CTX_data_active_object(C); GreasePencil &grease_pencil = *static_cast(object->data); const int affect_visibility = RNA_boolean_get(op->ptr, "affect_visibility"); @@ -420,7 +417,7 @@ static void GREASE_PENCIL_OT_layer_isolate(wmOperatorType *ot) /* callbacks */ ot->exec = grease_pencil_layer_isolate_exec; - ot->poll = active_grease_pencil_layer_poll; + ot->poll = active_grease_pencil_poll; /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; @@ -429,264 +426,6 @@ static void GREASE_PENCIL_OT_layer_isolate(wmOperatorType *ot) RNA_def_boolean( ot->srna, "affect_visibility", false, "Affect Visibility", "Also affect the visibility"); } - -static int grease_pencil_layer_lock_all_exec(bContext *C, wmOperator *op) -{ - using namespace blender::bke::greasepencil; - Object *object = CTX_data_active_object(C); - GreasePencil &grease_pencil = *static_cast(object->data); - const bool lock_value = RNA_boolean_get(op->ptr, "lock"); - - if (grease_pencil.layers().is_empty()) { - return OPERATOR_CANCELLED; - } - - for (Layer *layer : grease_pencil.layers_for_write()) { - layer->set_locked(lock_value); - } - - DEG_id_tag_update(&grease_pencil.id, ID_RECALC_GEOMETRY); - WM_event_add_notifier(C, NC_GEOM | ND_DATA, &grease_pencil); - WM_event_add_notifier(C, NC_GPENCIL | NA_EDITED, nullptr); - - return OPERATOR_FINISHED; -} - -static void GREASE_PENCIL_OT_layer_lock_all(wmOperatorType *ot) -{ - /* identifiers */ - ot->name = "Lock All Layers"; - ot->idname = "GREASE_PENCIL_OT_layer_lock_all"; - ot->description = - "Lock all Grease Pencil layers to prevent them from being accidentally modified"; - - /* callbacks */ - ot->exec = grease_pencil_layer_lock_all_exec; - ot->poll = active_grease_pencil_layer_poll; - - /* flags */ - ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; - - /* properties */ - RNA_def_boolean(ot->srna, "lock", true, "Lock Value", "Lock/Unlock all layers"); -} - -static int grease_pencil_layer_duplicate_exec(bContext *C, wmOperator *op) -{ - using namespace ::blender::bke::greasepencil; - Object *object = CTX_data_active_object(C); - GreasePencil &grease_pencil = *static_cast(object->data); - const bool empty_keyframes = RNA_boolean_get(op->ptr, "empty_keyframes"); - - if (!grease_pencil.has_active_layer()) { - BKE_reportf(op->reports, RPT_ERROR, "No active layer to duplicate"); - return OPERATOR_CANCELLED; - } - - Layer &active_layer = *grease_pencil.get_active_layer(); - Layer &new_layer = grease_pencil.add_layer(active_layer.name()); - - for (auto [key, frame] : active_layer.frames().items()) { - const int duration = frame.is_implicit_hold() ? 0 : active_layer.get_frame_duration_at(key); - const int drawing_index = grease_pencil.drawings().size(); - GreasePencilFrame *new_frame = new_layer.add_frame(key, drawing_index, duration); - new_frame->type = frame.type; - if (empty_keyframes) { - grease_pencil.add_empty_drawings(1); - } - else { - const Drawing &drawing = *grease_pencil.get_drawing_at(active_layer, key); - grease_pencil.add_duplicate_drawings(1, drawing); - } - } - - grease_pencil.move_node_after(new_layer.as_node(), active_layer.as_node()); - grease_pencil.set_active_layer(&new_layer); - DEG_id_tag_update(&grease_pencil.id, ID_RECALC_GEOMETRY); - WM_event_add_notifier(C, NC_GPENCIL | ND_DATA | NA_SELECTED, nullptr); - return OPERATOR_FINISHED; -} - -static void GREASE_PENCIL_OT_layer_duplicate(wmOperatorType *ot) -{ - /* identifiers */ - ot->name = "Duplicate Layer"; - ot->idname = "GREASE_PENCIL_OT_layer_duplicate"; - ot->description = "Make a copy of the active Grease Pencil layer"; - - /* callbacks */ - ot->exec = grease_pencil_layer_duplicate_exec; - ot->poll = active_grease_pencil_layer_poll; - - /* flags */ - ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; - - /* properties */ - RNA_def_boolean(ot->srna, "empty_keyframes", false, "Empty Keyframes", "Add Empty Keyframes"); -} - -static int grease_pencil_layer_mask_add_exec(bContext *C, wmOperator *op) -{ - using namespace ::blender::bke::greasepencil; - Object *object = CTX_data_active_object(C); - GreasePencil &grease_pencil = *static_cast(object->data); - - if (!grease_pencil.has_active_layer()) { - return OPERATOR_CANCELLED; - } - Layer &active_layer = *grease_pencil.get_active_layer(); - - int mask_name_length; - char *mask_name = RNA_string_get_alloc(op->ptr, "name", nullptr, 0, &mask_name_length); - BLI_SCOPED_DEFER([&] { MEM_SAFE_FREE(mask_name); }); - - if (TreeNode *node = grease_pencil.find_node_by_name(mask_name)) { - if (grease_pencil.is_layer_active(&node->as_layer())) { - BKE_report(op->reports, RPT_ERROR, "Cannot add active layer as mask"); - return OPERATOR_CANCELLED; - } - - if (BLI_findstring(&active_layer.masks, - mask_name, - offsetof(GreasePencilLayerMask, layer_name)) != nullptr) - { - BKE_report(op->reports, RPT_ERROR, "Layer already added"); - return OPERATOR_CANCELLED; - } - - LayerMask *new_mask = MEM_new(__func__, mask_name); - BLI_addtail(&active_layer.masks, reinterpret_cast(new_mask)); - /* Make the newly added mask active. */ - active_layer.active_mask_index = BLI_listbase_count(&active_layer.masks) - 1; - } - else { - BKE_report(op->reports, RPT_ERROR, "Unable to find layer to add"); - return OPERATOR_CANCELLED; - } - - DEG_id_tag_update(&grease_pencil.id, ID_RECALC_GEOMETRY); - WM_event_add_notifier(C, NC_GPENCIL | ND_DATA | NA_SELECTED, &grease_pencil); - - return OPERATOR_FINISHED; -} - -static void GREASE_PENCIL_OT_layer_mask_add(wmOperatorType *ot) -{ - /* identifiers */ - ot->name = "Add New Mask Layer"; - ot->idname = "GREASE_PENCIL_OT_layer_mask_add"; - ot->description = "Add new layer as masking"; - - ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; - - /* callbacks */ - ot->exec = grease_pencil_layer_mask_add_exec; - ot->poll = active_grease_pencil_layer_poll; - - /* properties */ - RNA_def_string(ot->srna, "name", nullptr, 0, "Layer", "Name of the layer"); -} - -static int grease_pencil_layer_mask_remove_exec(bContext *C, wmOperator * /*op*/) -{ - using namespace ::blender::bke::greasepencil; - Object *object = CTX_data_active_object(C); - GreasePencil &grease_pencil = *static_cast(object->data); - - if (!grease_pencil.has_active_layer()) { - return OPERATOR_CANCELLED; - } - - Layer &active_layer = *grease_pencil.get_active_layer(); - if (GreasePencilLayerMask *mask = reinterpret_cast( - BLI_findlink(&active_layer.masks, active_layer.active_mask_index))) - { - BLI_remlink(&active_layer.masks, mask); - MEM_delete(reinterpret_cast(mask)); - active_layer.active_mask_index = std::max(active_layer.active_mask_index - 1, 0); - } - else { - return OPERATOR_CANCELLED; - } - - DEG_id_tag_update(&grease_pencil.id, ID_RECALC_GEOMETRY); - WM_event_add_notifier(C, NC_GPENCIL | ND_DATA | NA_SELECTED, &grease_pencil); - - return OPERATOR_FINISHED; -} - -static void GREASE_PENCIL_OT_layer_mask_remove(wmOperatorType *ot) -{ - /* identifiers */ - ot->name = "Remove Mask Layer"; - ot->idname = "GREASE_PENCIL_OT_layer_mask_remove"; - ot->description = "Remove Layer Mask"; - - ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; - - /* callbacks */ - ot->exec = grease_pencil_layer_mask_remove_exec; - ot->poll = active_grease_pencil_layer_poll; -} - -enum class LayerMaskMoveDirection : int8_t { Up = -1, Down = 1 }; - -static int grease_pencil_layer_mask_reorder_exec(bContext *C, wmOperator *op) -{ - using namespace ::blender::bke::greasepencil; - Object *object = CTX_data_active_object(C); - GreasePencil &grease_pencil = *static_cast(object->data); - - if (!grease_pencil.has_active_layer()) { - return OPERATOR_CANCELLED; - } - Layer &active_layer = *grease_pencil.get_active_layer(); - const int direction = RNA_enum_get(op->ptr, "direction"); - - bool changed = false; - if (GreasePencilLayerMask *mask = reinterpret_cast( - BLI_findlink(&active_layer.masks, active_layer.active_mask_index))) - { - if (BLI_listbase_link_move(&active_layer.masks, mask, direction)) { - active_layer.active_mask_index = std::max(active_layer.active_mask_index + direction, 0); - changed = true; - } - } - else { - return OPERATOR_CANCELLED; - } - - if (changed) { - DEG_id_tag_update(&grease_pencil.id, ID_RECALC_GEOMETRY); - WM_event_add_notifier(C, NC_GPENCIL | ND_DATA | NA_SELECTED, &grease_pencil); - } - - return OPERATOR_FINISHED; -} - -static void GREASE_PENCIL_OT_layer_mask_reorder(wmOperatorType *ot) -{ - static const EnumPropertyItem enum_direction[] = { - {int(LayerMaskMoveDirection::Up), "UP", 0, "Up", ""}, - {int(LayerMaskMoveDirection::Down), "DOWN", 0, "Down", ""}, - {0, nullptr, 0, nullptr, nullptr}, - }; - - /* identifiers */ - ot->name = "Reorder Grease Pencil Layer Mask"; - ot->idname = "GREASE_PENCIL_OT_layer_mask_reorder"; - ot->description = "Reorder the active Grease Pencil mask layer up/down in the list"; - - /* api callbacks */ - ot->exec = grease_pencil_layer_mask_reorder_exec; - ot->poll = active_grease_pencil_layer_poll; - - /* flags */ - ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; - - ot->prop = RNA_def_enum(ot->srna, "direction", enum_direction, 0, "Direction", ""); -} - } // namespace blender::ed::greasepencil void ED_operatortypes_grease_pencil_layers() @@ -699,12 +438,6 @@ void ED_operatortypes_grease_pencil_layers() WM_operatortype_append(GREASE_PENCIL_OT_layer_hide); WM_operatortype_append(GREASE_PENCIL_OT_layer_reveal); WM_operatortype_append(GREASE_PENCIL_OT_layer_isolate); - WM_operatortype_append(GREASE_PENCIL_OT_layer_lock_all); - WM_operatortype_append(GREASE_PENCIL_OT_layer_duplicate); WM_operatortype_append(GREASE_PENCIL_OT_layer_group_add); - - WM_operatortype_append(GREASE_PENCIL_OT_layer_mask_add); - WM_operatortype_append(GREASE_PENCIL_OT_layer_mask_remove); - WM_operatortype_append(GREASE_PENCIL_OT_layer_mask_reorder); } diff --git a/source/blender/editors/grease_pencil/intern/grease_pencil_material.cc b/source/blender/editors/grease_pencil/intern/grease_pencil_material.cc index 74529d95aba..7b1214ee25b 100644 --- a/source/blender/editors/grease_pencil/intern/grease_pencil_material.cc +++ b/source/blender/editors/grease_pencil/intern/grease_pencil_material.cc @@ -15,6 +15,7 @@ #include "BKE_material.h" #include "BLI_vector.hh" +#include "BLI_vector_set.hh" #include "DEG_depsgraph.hh" @@ -41,7 +42,7 @@ static int grease_pencil_material_reveal_exec(bContext *C, wmOperator * /*op*/) if (Material *ma = BKE_gpencil_material(object, i + 1)) { MaterialGPencilStyle &gp_style = *ma->gp_style; gp_style.flag &= ~GP_MATERIAL_HIDE; - DEG_id_tag_update(&ma->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&ma->id, ID_RECALC_COPY_ON_WRITE); changed = true; } } @@ -93,7 +94,7 @@ static int grease_pencil_material_hide_exec(bContext *C, wmOperator *op) if (Material *ma = BKE_object_material_get(object, i + 1)) { MaterialGPencilStyle &gp_style = *ma->gp_style; gp_style.flag |= GP_MATERIAL_HIDE; - DEG_id_tag_update(&ma->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&ma->id, ID_RECALC_COPY_ON_WRITE); changed = true; } } @@ -140,7 +141,7 @@ static int grease_pencil_material_lock_all_exec(bContext *C, wmOperator * /*op*/ if (Material *ma = BKE_object_material_get(object, i + 1)) { MaterialGPencilStyle &gp_style = *ma->gp_style; gp_style.flag |= GP_MATERIAL_LOCKED; - DEG_id_tag_update(&ma->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&ma->id, ID_RECALC_COPY_ON_WRITE); changed = true; } } @@ -184,7 +185,7 @@ static int grease_pencil_material_unlock_all_exec(bContext *C, wmOperator * /*op if (Material *ma = BKE_object_material_get(object, i + 1)) { MaterialGPencilStyle &gp_style = *ma->gp_style; gp_style.flag &= ~GP_MATERIAL_LOCKED; - DEG_id_tag_update(&ma->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&ma->id, ID_RECALC_COPY_ON_WRITE); changed = true; } } @@ -228,7 +229,7 @@ static int grease_pencil_material_lock_unused_exec(bContext *C, wmOperator * /*o if (Material *ma = BKE_object_material_get(object, material_index + 1)) { MaterialGPencilStyle &gp_style = *ma->gp_style; gp_style.flag |= GP_MATERIAL_HIDE | GP_MATERIAL_LOCKED; - DEG_id_tag_update(&ma->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&ma->id, ID_RECALC_COPY_ON_WRITE); changed = true; } } @@ -271,7 +272,7 @@ static int grease_pencil_material_lock_unselected_exec(bContext *C, wmOperator * GreasePencil &grease_pencil = *static_cast(object->data); bool changed = false; - const Vector drawings = retrieve_editable_drawings(*scene, grease_pencil); + const Array drawings = retrieve_editable_drawings(*scene, grease_pencil); Set materials_used; @@ -303,7 +304,7 @@ static int grease_pencil_material_lock_unselected_exec(bContext *C, wmOperator * if (Material *ma = BKE_object_material_get(object, i + 1)) { MaterialGPencilStyle &gp_style = *ma->gp_style; gp_style.flag |= GP_MATERIAL_LOCKED; - DEG_id_tag_update(&ma->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&ma->id, ID_RECALC_COPY_ON_WRITE); changed = true; } } @@ -368,7 +369,7 @@ static int grease_pencil_material_copy_to_object_exec(bContext *C, wmOperator *o BKE_object_material_ensure(bmain, ob, ma_src); } - DEG_id_tag_update(&ob->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&ob->id, ID_RECALC_COPY_ON_WRITE); } CTX_DATA_END; diff --git a/source/blender/editors/grease_pencil/intern/grease_pencil_ops.cc b/source/blender/editors/grease_pencil/intern/grease_pencil_ops.cc index b683d686317..32e6aeccb33 100644 --- a/source/blender/editors/grease_pencil/intern/grease_pencil_ops.cc +++ b/source/blender/editors/grease_pencil/intern/grease_pencil_ops.cc @@ -44,16 +44,6 @@ bool editable_grease_pencil_poll(bContext *C) return true; } -bool active_grease_pencil_layer_poll(bContext *C) -{ - Object *object = CTX_data_active_object(C); - if (object == nullptr || object->type != OB_GREASE_PENCIL) { - return false; - } - const GreasePencil *grease_pencil = static_cast(object->data); - return grease_pencil->has_active_layer(); -} - bool editable_grease_pencil_point_selection_poll(bContext *C) { if (!editable_grease_pencil_poll(C)) { diff --git a/source/blender/editors/grease_pencil/intern/grease_pencil_select.cc b/source/blender/editors/grease_pencil/intern/grease_pencil_select.cc index 0cd63427e17..70e9cc41137 100644 --- a/source/blender/editors/grease_pencil/intern/grease_pencil_select.cc +++ b/source/blender/editors/grease_pencil/intern/grease_pencil_select.cc @@ -19,6 +19,7 @@ #include "ED_curves.hh" #include "ED_grease_pencil.hh" #include "ED_screen.hh" +#include "ED_view3d.hh" #include "RNA_access.hh" #include "RNA_define.hh" @@ -36,7 +37,7 @@ static int select_all_exec(bContext *C, wmOperator *op) GreasePencil &grease_pencil = *static_cast(object->data); bke::AttrDomain selection_domain = ED_grease_pencil_selection_domain_get(scene->toolsettings); - const Vector drawings = retrieve_editable_drawings(*scene, grease_pencil); + const Array drawings = retrieve_editable_drawings(*scene, grease_pencil); threading::parallel_for_each(drawings, [&](const MutableDrawingInfo &info) { IndexMaskMemory memory; const IndexMask selectable_elements = retrieve_editable_elements( @@ -76,7 +77,7 @@ static int select_more_exec(bContext *C, wmOperator * /*op*/) Object *object = CTX_data_active_object(C); GreasePencil &grease_pencil = *static_cast(object->data); - const Vector drawings = retrieve_editable_drawings(*scene, grease_pencil); + const Array drawings = retrieve_editable_drawings(*scene, grease_pencil); threading::parallel_for_each(drawings, [&](const MutableDrawingInfo &info) { IndexMaskMemory memory; const IndexMask selectable_strokes = ed::greasepencil::retrieve_editable_strokes( @@ -114,7 +115,7 @@ static int select_less_exec(bContext *C, wmOperator * /*op*/) Object *object = CTX_data_active_object(C); GreasePencil &grease_pencil = *static_cast(object->data); - const Vector drawings = retrieve_editable_drawings(*scene, grease_pencil); + const Array drawings = retrieve_editable_drawings(*scene, grease_pencil); threading::parallel_for_each(drawings, [&](const MutableDrawingInfo &info) { IndexMaskMemory memory; const IndexMask selectable_strokes = ed::greasepencil::retrieve_editable_strokes( @@ -152,7 +153,7 @@ static int select_linked_exec(bContext *C, wmOperator * /*op*/) Object *object = CTX_data_active_object(C); GreasePencil &grease_pencil = *static_cast(object->data); - const Vector drawings = retrieve_editable_drawings(*scene, grease_pencil); + const Array drawings = retrieve_editable_drawings(*scene, grease_pencil); threading::parallel_for_each(drawings, [&](const MutableDrawingInfo &info) { IndexMaskMemory memory; const IndexMask selectable_strokes = ed::greasepencil::retrieve_editable_strokes( @@ -193,7 +194,7 @@ static int select_random_exec(bContext *C, wmOperator *op) GreasePencil &grease_pencil = *static_cast(object->data); bke::AttrDomain selection_domain = ED_grease_pencil_selection_domain_get(scene->toolsettings); - const Vector drawings = retrieve_editable_drawings(*scene, grease_pencil); + const Array drawings = retrieve_editable_drawings(*scene, grease_pencil); threading::parallel_for_each(drawings, [&](const MutableDrawingInfo &info) { bke::CurvesGeometry &curves = info.drawing.strokes_for_write(); @@ -253,7 +254,7 @@ static int select_alternate_exec(bContext *C, wmOperator *op) Object *object = CTX_data_active_object(C); GreasePencil &grease_pencil = *static_cast(object->data); - const Vector drawings = retrieve_editable_drawings(*scene, grease_pencil); + const Array drawings = retrieve_editable_drawings(*scene, grease_pencil); threading::parallel_for_each(drawings, [&](const MutableDrawingInfo &info) { blender::ed::curves::select_alternate(info.drawing.strokes_for_write(), deselect_ends); }); @@ -292,7 +293,7 @@ static int select_ends_exec(bContext *C, wmOperator *op) Object *object = CTX_data_active_object(C); GreasePencil &grease_pencil = *static_cast(object->data); - const Vector drawings = retrieve_editable_drawings(*scene, grease_pencil); + const Array drawings = retrieve_editable_drawings(*scene, grease_pencil); threading::parallel_for_each(drawings, [&](const MutableDrawingInfo &info) { bke::CurvesGeometry &curves = info.drawing.strokes_for_write(); @@ -459,59 +460,6 @@ static void GREASE_PENCIL_OT_set_selection_mode(wmOperatorType *ot) RNA_def_property_flag(prop, (PropertyFlag)(PROP_HIDDEN | PROP_SKIP_SAVE)); } -static int grease_pencil_material_select_exec(bContext *C, wmOperator *op) -{ - const Scene *scene = CTX_data_scene(C); - Object *object = CTX_data_active_object(C); - GreasePencil &grease_pencil = *static_cast(object->data); - const bool select = !RNA_boolean_get(op->ptr, "deselect"); - const int material_index = object->actcol - 1; - - if (material_index == -1) { - return OPERATOR_CANCELLED; - } - - const Vector drawings = retrieve_editable_drawings(*scene, grease_pencil); - threading::parallel_for_each(drawings, [&](const MutableDrawingInfo &info) { - bke::CurvesGeometry &curves = info.drawing.strokes_for_write(); - - IndexMaskMemory memory; - const IndexMask strokes = retrieve_editable_strokes_by_material( - *object, info.drawing, material_index, memory); - if (strokes.is_empty()) { - return; - } - bke::GSpanAttributeWriter selection = ed::curves::ensure_selection_attribute( - curves, bke::AttrDomain::Curve, CD_PROP_BOOL); - index_mask::masked_fill(selection.span.typed(), select, strokes); - selection.finish(); - }); - - DEG_id_tag_update(&grease_pencil.id, ID_RECALC_GEOMETRY); - WM_event_add_notifier(C, NC_GEOM | ND_DATA | NA_EDITED, &grease_pencil); - - return OPERATOR_FINISHED; -} - -static void GREASE_PENCIL_OT_material_select(wmOperatorType *ot) -{ - /* identifiers */ - ot->name = "Select Material"; - ot->idname = "GREASE_PENCIL_OT_material_select"; - ot->description = "Select/Deselect all Grease Pencil strokes using current material"; - - /* callbacks. */ - ot->exec = grease_pencil_material_select_exec; - ot->poll = editable_grease_pencil_poll; - - /* flags. */ - ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; - - /* props */ - ot->prop = RNA_def_boolean(ot->srna, "deselect", false, "Deselect", "Unselect strokes"); - RNA_def_property_flag(ot->prop, PROP_HIDDEN | PROP_SKIP_SAVE); -} - } // namespace blender::ed::greasepencil blender::bke::AttrDomain ED_grease_pencil_selection_domain_get(const ToolSettings *tool_settings) @@ -538,5 +486,4 @@ void ED_operatortypes_grease_pencil_select() WM_operatortype_append(GREASE_PENCIL_OT_select_alternate); WM_operatortype_append(GREASE_PENCIL_OT_select_ends); WM_operatortype_append(GREASE_PENCIL_OT_set_selection_mode); - WM_operatortype_append(GREASE_PENCIL_OT_material_select); } diff --git a/source/blender/editors/grease_pencil/intern/grease_pencil_undo.cc b/source/blender/editors/grease_pencil/intern/grease_pencil_undo.cc deleted file mode 100644 index dbe9c83ec05..00000000000 --- a/source/blender/editors/grease_pencil/intern/grease_pencil_undo.cc +++ /dev/null @@ -1,431 +0,0 @@ -/* SPDX-FileCopyrightText: 2023 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup edgrease_pencil - */ - -#include "BLI_string.h" -#include "BLI_task.hh" - -#include "BKE_context.hh" -#include "BKE_curves.hh" -#include "BKE_customdata.hh" -#include "BKE_grease_pencil.hh" -#include "BKE_lib_id.hh" -#include "BKE_main.hh" -#include "BKE_object.hh" -#include "BKE_undo_system.hh" - -#include "CLG_log.h" - -#include "DEG_depsgraph.hh" -#include "DEG_depsgraph_build.hh" - -#include "ED_grease_pencil.hh" -#include "ED_undo.hh" - -#include "MEM_guardedalloc.h" - -#include "WM_api.hh" -#include "WM_types.hh" - -#include -#include - -static CLG_LogRef LOG = {"ed.undo.greasepencil"}; - -namespace blender::ed::greasepencil::undo { - -/* -------------------------------------------------------------------- */ -/** \name Implements ED Undo System - * - * \note This is similar for all edit-mode types. - * \{ */ - -/** - * Store all drawings, layers and layers data, in each undo step. - * - * Each drawing type has its own array in the undo #StepObject data. - * - * NOTE: Storing Reference drawings is also needed, since drawings can be added or removed, data - * from Reference ones also needs to be stored. - */ - -/* Store contextual data and status info during undo step encoding or decoding. */ -struct StepEncodeStatus {}; - -struct StepDecodeStatus { - /** - * In case some reference drawing needs to be re-created, the GreasePencil ID gets a new - * relation to another GreasePencil ID. - */ - bool needs_relationships_update = false; -}; - -class StepDrawingGeometryBase { - protected: - /* Index of this drawing in the original combined array of all drawings in GreasePencil ID. */ - int index_; - - /* Data from #GreasePencilDrawingBase that needs to be saved in undo steps. */ - uint32_t flag_; - - protected: - /** - * Ensures that the drawing from the given array at the current index exists, - * and has the proposer type. - * - * Non-existing drawings can happen after extending the drawings array. - * - * Mismatch in drawing types can happen when some drawings have been deleted between the undo - * step storage, and the current state of the GreasePencil data. - */ - void decode_valid_drawingtype_at_index_ensure(MutableSpan drawings, - const GreasePencilDrawingType drawing_type) const - { - /* TODO: Maybe that code should rather be part of GreasePencil:: API, together with - * `add_empty_drawings` and such? */ - GreasePencilDrawingBase *drawing = drawings[index_]; - if (drawing != nullptr) { - if (drawing->type == drawing_type) { - return; - } - switch (drawing->type) { - case GP_DRAWING: - MEM_delete(&reinterpret_cast(drawing)->wrap()); - break; - case GP_DRAWING_REFERENCE: - MEM_delete(&reinterpret_cast(drawing)->wrap()); - break; - } - drawing = nullptr; - } - if (drawing == nullptr) { - switch (drawing_type) { - case GP_DRAWING: - drawings[index_] = reinterpret_cast( - MEM_new(__func__)); - break; - case GP_DRAWING_REFERENCE: - drawings[index_] = reinterpret_cast( - MEM_new(__func__)); - break; - } - } - } -}; - -class StepDrawingGeometry : public StepDrawingGeometryBase { - bke::CurvesGeometry geometry_; - - public: - void encode(const GreasePencilDrawing &drawing_geometry, - const int64_t drawing_index, - StepEncodeStatus & /* encode_status */) - { - BLI_assert(drawing_index >= 0 && drawing_index < INT32_MAX); - index_ = int(drawing_index); - - flag_ = drawing_geometry.base.flag; - geometry_ = drawing_geometry.geometry.wrap(); - } - - void decode(GreasePencil &grease_pencil, StepDecodeStatus & /*decode_status*/) const - { - MutableSpan drawings = grease_pencil.drawings(); - this->decode_valid_drawingtype_at_index_ensure(drawings, GP_DRAWING); - BLI_assert(drawings[index_]->type == GP_DRAWING); - - GreasePencilDrawing &drawing_geometry = *reinterpret_cast( - drawings[index_]); - - drawing_geometry.base.flag = flag_; - drawing_geometry.geometry.wrap() = geometry_; - - /* TODO: Check if there is a way to tell if both stored and current geometry are still the - * same, to avoid recomputing the cache all the time for all drawings? */ - drawing_geometry.runtime->triangles_cache.tag_dirty(); - } -}; - -class StepDrawingReference : public StepDrawingGeometryBase { - UndoRefID_GreasePencil grease_pencil_ref_ = {}; - - public: - void encode(const GreasePencilDrawingReference &drawing_reference, - const int64_t drawing_index, - StepEncodeStatus & /* encode_status */) - { - BLI_assert(drawing_index >= 0 && drawing_index < INT32_MAX); - index_ = int(drawing_index); - - flag_ = drawing_reference.base.flag; - grease_pencil_ref_.ptr = drawing_reference.id_reference; - } - - void decode(GreasePencil &grease_pencil, StepDecodeStatus &decode_status) const - { - MutableSpan drawings = grease_pencil.drawings(); - this->decode_valid_drawingtype_at_index_ensure(drawings, GP_DRAWING_REFERENCE); - BLI_assert(drawings[index_]->type == GP_DRAWING_REFERENCE); - - GreasePencilDrawingReference &drawing_reference = - *reinterpret_cast(drawings[index_]); - drawing_reference.base.flag = flag_; - - if (drawing_reference.id_reference != grease_pencil_ref_.ptr) { - id_us_min(reinterpret_cast(drawing_reference.id_reference)); - drawing_reference.id_reference = grease_pencil_ref_.ptr; - id_us_plus(reinterpret_cast(drawing_reference.id_reference)); - decode_status.needs_relationships_update = true; - } - } - - void foreach_id_ref(UndoTypeForEachIDRefFn foreach_ID_ref_fn, void *user_data) - { - foreach_ID_ref_fn(user_data, reinterpret_cast(&grease_pencil_ref_)); - } -}; - -class StepObject { - public: - UndoRefID_Object obedit_ref = {}; - - private: - Array drawings_geometry_; - Array drawings_reference_; - - int layers_num_ = 0; - bke::greasepencil::LayerGroup root_group_; - std::string active_layer_name_; - CustomData layers_data_ = {}; - - private: - void encode_drawings(const GreasePencil &grease_pencil, StepEncodeStatus &encode_status) - { - const Span drawings = grease_pencil.drawings(); - - int64_t drawings_geometry_num = 0; - int64_t drawings_reference_num = 0; - for (const int64_t idx : drawings.index_range()) { - const GreasePencilDrawingBase &drawing = *drawings[idx]; - switch (drawing.type) { - case GP_DRAWING: - drawings_geometry_num++; - break; - case GP_DRAWING_REFERENCE: - drawings_reference_num++; - break; - } - } - - drawings_geometry_.reinitialize(drawings_geometry_num); - drawings_reference_.reinitialize(drawings_reference_num); - - int drawings_geometry_idx = 0; - int drawings_reference_idx = 0; - for (const int64_t idx : drawings.index_range()) { - const GreasePencilDrawingBase &drawing = *drawings[idx]; - switch (drawing.type) { - case GP_DRAWING: - drawings_geometry_[drawings_geometry_idx++].encode( - reinterpret_cast(drawing), idx, encode_status); - break; - case GP_DRAWING_REFERENCE: - drawings_reference_[drawings_reference_idx++].encode( - reinterpret_cast(drawing), idx, encode_status); - break; - } - } - } - - void decode_drawings(GreasePencil &grease_pencil, StepDecodeStatus &decode_status) const - { - const int drawing_array_num = int(drawings_geometry_.size() + drawings_reference_.size()); - grease_pencil.resize_drawings(drawing_array_num); - - for (const StepDrawingGeometry &drawing : drawings_geometry_) { - drawing.decode(grease_pencil, decode_status); - } - for (const StepDrawingReference &drawing : drawings_reference_) { - drawing.decode(grease_pencil, decode_status); - } - } - - void encode_layers(const GreasePencil &grease_pencil, StepEncodeStatus & /*encode_status*/) - { - layers_num_ = int(grease_pencil.layers().size()); - - CustomData_copy( - &grease_pencil.layers_data, &layers_data_, eCustomDataMask(CD_MASK_ALL), layers_num_); - - if (grease_pencil.has_active_layer()) { - active_layer_name_ = grease_pencil.get_active_layer()->name(); - } - - root_group_ = grease_pencil.root_group(); - } - - void decode_layers(GreasePencil &grease_pencil, StepDecodeStatus & /*decode_status*/) const - { - if (grease_pencil.root_group_ptr) { - MEM_delete(&grease_pencil.root_group()); - } - - grease_pencil.root_group_ptr = MEM_new(__func__, root_group_); - BLI_assert(layers_num_ == grease_pencil.layers().size()); - - if (!active_layer_name_.empty()) { - const bke::greasepencil::TreeNode *active_node = - grease_pencil.root_group().find_node_by_name(active_layer_name_); - if (active_node && active_node->is_layer()) { - grease_pencil.set_active_layer(&active_node->as_layer()); - } - } - - CustomData_copy( - &layers_data_, &grease_pencil.layers_data, eCustomDataMask(CD_MASK_ALL), layers_num_); - } - - public: - ~StepObject() - { - CustomData_free(&layers_data_, layers_num_); - } - - void encode(Object *ob, StepEncodeStatus &encode_status) - { - const GreasePencil &grease_pencil = *static_cast(ob->data); - this->obedit_ref.ptr = ob; - - this->encode_drawings(grease_pencil, encode_status); - this->encode_layers(grease_pencil, encode_status); - } - - void decode(StepDecodeStatus &decode_status) const - { - GreasePencil &grease_pencil = *static_cast(this->obedit_ref.ptr->data); - - this->decode_drawings(grease_pencil, decode_status); - this->decode_layers(grease_pencil, decode_status); - - DEG_id_tag_update(&grease_pencil.id, ID_RECALC_GEOMETRY); - } - - void foreach_id_ref(UndoTypeForEachIDRefFn foreach_ID_ref_fn, void *user_data) - { - foreach_ID_ref_fn(user_data, reinterpret_cast(&this->obedit_ref)); - for (StepDrawingReference &drawing_ref : drawings_reference_) { - drawing_ref.foreach_id_ref(foreach_ID_ref_fn, user_data); - } - } -}; - -struct GreasePencilUndoStep { - UndoStep step; - /** See #ED_undo_object_editmode_validate_scene_from_windows code comment for details. */ - UndoRefID_Scene scene_ref = {}; - Array objects; -}; - -static bool step_encode(bContext *C, Main *bmain, UndoStep *us_p) -{ - GreasePencilUndoStep *us = reinterpret_cast(us_p); - StepEncodeStatus encode_status; - - Scene *scene = CTX_data_scene(C); - ViewLayer *view_layer = CTX_data_view_layer(C); - uint objects_num = 0; - Object **objects = ED_undo_editmode_objects_from_view_layer(scene, view_layer, &objects_num); - BLI_SCOPED_DEFER([&]() { MEM_SAFE_FREE(objects); }) - - us->scene_ref.ptr = scene; - new (&us->objects) Array(objects_num); - - threading::parallel_for(us->objects.index_range(), 8, [&](const IndexRange range) { - for (const int64_t i : range) { - Object *ob = objects[i]; - us->objects[i].encode(ob, encode_status); - } - }); - - bmain->is_memfile_undo_flush_needed = true; - - return true; -} - -static void step_decode( - bContext *C, Main *bmain, UndoStep *us_p, const eUndoStepDir /*dir*/, bool /*is_final*/) -{ - GreasePencilUndoStep *us = reinterpret_cast(us_p); - StepDecodeStatus decode_status; - - Scene *scene = CTX_data_scene(C); - ViewLayer *view_layer = CTX_data_view_layer(C); - - ED_undo_object_editmode_validate_scene_from_windows( - CTX_wm_manager(C), us->scene_ref.ptr, &scene, &view_layer); - ED_undo_object_editmode_restore_helper(scene, - view_layer, - &us->objects.first().obedit_ref.ptr, - uint(us->objects.size()), - sizeof(decltype(us->objects)::value_type)); - - BLI_assert(BKE_object_is_in_editmode(us->objects.first().obedit_ref.ptr)); - - for (const StepObject &step_object : us->objects) { - step_object.decode(decode_status); - } - - if (decode_status.needs_relationships_update) { - DEG_relations_tag_update(bmain); - } - - ED_undo_object_set_active_or_warn( - scene, view_layer, us->objects.first().obedit_ref.ptr, us_p->name, &LOG); - - bmain->is_memfile_undo_flush_needed = true; - - WM_event_add_notifier(C, NC_GEOM | ND_DATA, nullptr); -} - -static void step_free(UndoStep *us_p) -{ - GreasePencilUndoStep *us = reinterpret_cast(us_p); - us->objects.~Array(); -} - -static void foreach_ID_ref(UndoStep *us_p, - UndoTypeForEachIDRefFn foreach_ID_ref_fn, - void *user_data) -{ - GreasePencilUndoStep *us = reinterpret_cast(us_p); - - foreach_ID_ref_fn(user_data, reinterpret_cast(&us->scene_ref)); - for (StepObject &object : us->objects) { - object.foreach_id_ref(foreach_ID_ref_fn, user_data); - } -} - -/** \} */ - -} // namespace blender::ed::greasepencil::undo - -void ED_undosys_type_grease_pencil(UndoType *ut) -{ - using namespace blender::ed; - - ut->name = "Edit GreasePencil"; - ut->poll = greasepencil::editable_grease_pencil_poll; - ut->step_encode = greasepencil::undo::step_encode; - ut->step_decode = greasepencil::undo::step_decode; - ut->step_free = greasepencil::undo::step_free; - - ut->step_foreach_ID_ref = greasepencil::undo::foreach_ID_ref; - - ut->flags = UNDOTYPE_FLAG_NEED_CONTEXT_FOR_ENCODE; - - ut->step_size = sizeof(greasepencil::undo::GreasePencilUndoStep); -} diff --git a/source/blender/editors/grease_pencil/intern/grease_pencil_utils.cc b/source/blender/editors/grease_pencil/intern/grease_pencil_utils.cc index 310ffa5afa9..4e93799c1cd 100644 --- a/source/blender/editors/grease_pencil/intern/grease_pencil_utils.cc +++ b/source/blender/editors/grease_pencil/intern/grease_pencil_utils.cc @@ -7,10 +7,11 @@ */ #include "BKE_attribute.hh" -#include "BKE_colortools.hh" +#include "BKE_brush.hh" +#include "BKE_context.hh" #include "BKE_grease_pencil.hh" #include "BKE_material.h" -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "BLI_bit_span_ops.hh" #include "BLI_bit_vector.hh" @@ -33,12 +34,9 @@ namespace blender::ed::greasepencil { DrawingPlacement::DrawingPlacement(const Scene &scene, const ARegion ®ion, const View3D &view3d, - const Object &eval_object, - const bke::greasepencil::Layer &layer) - : region_(®ion), view3d_(&view3d) + const Object &object) + : region_(®ion), view3d_(&view3d), transforms_(object) { - layer_space_to_world_space_ = layer.to_world_space(eval_object); - world_space_to_layer_space_ = math::invert(layer_space_to_world_space_); /* Initialize DrawingPlacementPlane from toolsettings. */ switch (scene.toolsettings->gp_sculpt.lock_axis) { case GP_LOCKAXIS_VIEW: @@ -68,7 +66,7 @@ DrawingPlacement::DrawingPlacement(const Scene &scene, switch (scene.toolsettings->gpencil_v3d_align) { case GP_PROJECT_VIEWSPACE: depth_ = DrawingPlacementDepth::ObjectOrigin; - placement_loc_ = layer_space_to_world_space_.location(); + placement_loc_ = transforms_.layer_space_to_world_space.location(); break; case (GP_PROJECT_VIEWSPACE | GP_PROJECT_CURSOR): depth_ = DrawingPlacementDepth::Cursor; @@ -78,12 +76,12 @@ DrawingPlacement::DrawingPlacement(const Scene &scene, depth_ = DrawingPlacementDepth::Surface; surface_offset_ = scene.toolsettings->gpencil_surface_offset; /* Default to view placement with the object origin if we don't hit a surface. */ - placement_loc_ = layer_space_to_world_space_.location(); + placement_loc_ = transforms_.layer_space_to_world_space.location(); break; case (GP_PROJECT_VIEWSPACE | GP_PROJECT_DEPTH_STROKE): depth_ = DrawingPlacementDepth::NearestStroke; /* Default to view placement with the object origin if we don't hit a stroke. */ - placement_loc_ = layer_space_to_world_space_.location(); + placement_loc_ = transforms_.layer_space_to_world_space.location(); break; } @@ -135,7 +133,7 @@ void DrawingPlacement::set_origin_to_nearest_stroke(const float2 co) } else { /* If nothing was hit, use origin. */ - placement_loc_ = layer_space_to_world_space_.location(); + placement_loc_ = transforms_.layer_space_to_world_space.location(); } plane_from_point_normal_v3(placement_plane_, placement_loc_, placement_normal_); } @@ -171,7 +169,7 @@ float3 DrawingPlacement::project(const float2 co) const ED_view3d_win_to_3d(view3d_, region_, placement_loc_, co, proj_point); } } - return math::transform_point(world_space_to_layer_space_, proj_point); + return math::transform_point(transforms_.world_space_to_layer_space, proj_point); } void DrawingPlacement::project(const Span src, MutableSpan dst) const @@ -183,80 +181,23 @@ void DrawingPlacement::project(const Span src, MutableSpan dst) }); } -static float get_multi_frame_falloff(const int frame_number, - const int center_frame, - const int min_frame, - const int max_frame, - const CurveMapping *falloff_curve) -{ - if (falloff_curve == nullptr) { - return 1.0f; - } - - /* Frame right of the center frame. */ - if (frame_number > center_frame) { - const float frame_factor = 0.5f * float(center_frame - min_frame) / (frame_number - min_frame); - return BKE_curvemapping_evaluateF(falloff_curve, 0, frame_factor); - } - /* Frame left of the center frame. */ - if (frame_number < center_frame) { - const float frame_factor = 0.5f * float(center_frame - frame_number) / - (max_frame - frame_number); - return BKE_curvemapping_evaluateF(falloff_curve, 0, frame_factor + 0.5f); - } - /* Frame at center. */ - return BKE_curvemapping_evaluateF(falloff_curve, 0, 0.5f); -} - -static std::pair get_minmax_selected_frame_numbers(const GreasePencil &grease_pencil, - const int current_frame) -{ - using namespace blender::bke::greasepencil; - int frame_min = current_frame; - int frame_max = current_frame; - Span layers = grease_pencil.layers(); - for (const int layer_i : layers.index_range()) { - const Layer &layer = *layers[layer_i]; - if (!layer.is_editable()) { - continue; - } - for (const auto [frame_number, frame] : layer.frames().items()) { - if (frame_number != current_frame && frame.is_selected()) { - frame_min = math::min(frame_min, frame_number); - frame_max = math::min(frame_max, frame_number); - } - } - } - return std::pair(frame_min, frame_max); -} - static Array get_frame_numbers_for_layer(const bke::greasepencil::Layer &layer, const int current_frame, const bool use_multi_frame_editing) { - Vector frame_numbers; + Vector frame_numbers({current_frame}); if (use_multi_frame_editing) { - bool current_frame_is_covered = false; - const int drawing_index_at_current_frame = layer.drawing_index_at(current_frame); for (const auto [frame_number, frame] : layer.frames().items()) { - if (!frame.is_selected()) { - continue; + if (frame_number != current_frame && frame.is_selected()) { + frame_numbers.append_unchecked(frame_number); } - frame_numbers.append(frame_number); - current_frame_is_covered |= (frame.drawing_index == drawing_index_at_current_frame); - } - if (current_frame_is_covered) { - return frame_numbers.as_span(); } } - - frame_numbers.append(current_frame); - return frame_numbers.as_span(); } -Vector retrieve_editable_drawings(const Scene &scene, - GreasePencil &grease_pencil) +Array retrieve_editable_drawings(const Scene &scene, + GreasePencil &grease_pencil) { using namespace blender::bke::greasepencil; const int current_frame = scene.r.cfra; @@ -275,60 +216,15 @@ Vector retrieve_editable_drawings(const Scene &scene, layer, current_frame, use_multi_frame_editing); for (const int frame_number : frame_numbers) { if (Drawing *drawing = grease_pencil.get_editable_drawing_at(layer, frame_number)) { - editable_drawings.append({*drawing, layer_i, frame_number, 1.0f}); + editable_drawings.append({*drawing, layer_i, frame_number}); } } } - return editable_drawings; + return editable_drawings.as_span(); } -Vector retrieve_editable_drawings_with_falloff(const Scene &scene, - GreasePencil &grease_pencil) -{ - using namespace blender::bke::greasepencil; - const int current_frame = scene.r.cfra; - const ToolSettings *toolsettings = scene.toolsettings; - const bool use_multi_frame_editing = (toolsettings->gpencil_flags & - GP_USE_MULTI_FRAME_EDITING) != 0; - const bool use_multi_frame_falloff = use_multi_frame_editing && - (toolsettings->gp_sculpt.flag & - GP_SCULPT_SETT_FLAG_FRAME_FALLOFF) != 0; - int center_frame; - std::pair minmax_frame; - if (use_multi_frame_falloff) { - BKE_curvemapping_init(toolsettings->gp_sculpt.cur_falloff); - minmax_frame = get_minmax_selected_frame_numbers(grease_pencil, current_frame); - center_frame = math::clamp(current_frame, minmax_frame.first, minmax_frame.second); - } - - Vector editable_drawings; - Span layers = grease_pencil.layers(); - for (const int layer_i : layers.index_range()) { - const Layer &layer = *layers[layer_i]; - if (!layer.is_editable()) { - continue; - } - const Array frame_numbers = get_frame_numbers_for_layer( - layer, current_frame, use_multi_frame_editing); - for (const int frame_number : frame_numbers) { - if (Drawing *drawing = grease_pencil.get_editable_drawing_at(layer, frame_number)) { - const float falloff = use_multi_frame_falloff ? - get_multi_frame_falloff(frame_number, - center_frame, - minmax_frame.first, - minmax_frame.second, - toolsettings->gp_sculpt.cur_falloff) : - 1.0f; - editable_drawings.append({*drawing, layer_i, frame_number, falloff}); - } - } - } - - return editable_drawings; -} - -Vector retrieve_editable_drawings_from_layer( +Array retrieve_editable_drawings_from_layer( const Scene &scene, GreasePencil &grease_pencil, const blender::bke::greasepencil::Layer &layer) @@ -344,16 +240,14 @@ Vector retrieve_editable_drawings_from_layer( layer, current_frame, use_multi_frame_editing); for (const int frame_number : frame_numbers) { if (Drawing *drawing = grease_pencil.get_editable_drawing_at(layer, frame_number)) { - editable_drawings.append( - {*drawing, layer.drawing_index_at(frame_number), frame_number, 1.0f}); + editable_drawings.append({*drawing, layer.drawing_index_at(frame_number), frame_number}); } } - return editable_drawings; + return editable_drawings.as_span(); } -Vector retrieve_visible_drawings(const Scene &scene, - const GreasePencil &grease_pencil) +Array retrieve_visible_drawings(const Scene &scene, const GreasePencil &grease_pencil) { using namespace blender::bke::greasepencil; const int current_frame = scene.r.cfra; @@ -377,7 +271,7 @@ Vector retrieve_visible_drawings(const Scene &scene, } } - return visible_drawings; + return visible_drawings.as_span(); } static VectorSet get_editable_material_indices(Object &object) diff --git a/source/blender/editors/include/ED_anim_api.hh b/source/blender/editors/include/ED_anim_api.hh index eab8461290b..1e827abe5d1 100644 --- a/source/blender/editors/include/ED_anim_api.hh +++ b/source/blender/editors/include/ED_anim_api.hh @@ -489,9 +489,6 @@ bool ANIM_animdata_get_context(const bContext *C, bAnimContext *ac); * - AnimContext to write to is provided as pointer to var on stack so that we don't have * allocation/freeing costs (which are not that avoidable with channels). * \return whether the operation was successful. - * - * \note This may also update the space data. For example, `SpaceAction::action` - * is set to the currently active object's Action. */ bool ANIM_animdata_context_getdata(bAnimContext *ac); diff --git a/source/blender/editors/include/ED_curves.hh b/source/blender/editors/include/ED_curves.hh index 696cb6ae6c1..5fc662160d8 100644 --- a/source/blender/editors/include/ED_curves.hh +++ b/source/blender/editors/include/ED_curves.hh @@ -239,9 +239,9 @@ struct FindClosestData { * \return A new point or curve closer than the \a initial input, if one exists. */ std::optional closest_elem_find_screen_space(const ViewContext &vc, + const Object &object, OffsetIndices points_by_curve, Span deformed_positions, - const float4x4 &projection, const IndexMask &mask, bke::AttrDomain domain, int2 coord, @@ -253,7 +253,6 @@ std::optional closest_elem_find_screen_space(const ViewContext bool select_box(const ViewContext &vc, bke::CurvesGeometry &curves, Span deformed_positions, - const float4x4 &projection, const IndexMask &mask, bke::AttrDomain selection_domain, const rcti &rect, @@ -265,10 +264,9 @@ bool select_box(const ViewContext &vc, bool select_lasso(const ViewContext &vc, bke::CurvesGeometry &curves, Span deformed_positions, - const float4x4 &projection_matrix, const IndexMask &mask, bke::AttrDomain selection_domain, - Span lasso_coords, + Span coords, eSelectOp sel_op); /** @@ -277,7 +275,6 @@ bool select_lasso(const ViewContext &vc, bool select_circle(const ViewContext &vc, bke::CurvesGeometry &curves, Span deformed_positions, - const float4x4 &projection, const IndexMask &mask, bke::AttrDomain selection_domain, int2 coord, diff --git a/source/blender/editors/include/ED_file_indexer.hh b/source/blender/editors/include/ED_file_indexer.hh index 35bb877f4cd..1944aefbd52 100644 --- a/source/blender/editors/include/ED_file_indexer.hh +++ b/source/blender/editors/include/ED_file_indexer.hh @@ -8,7 +8,7 @@ #pragma once -#include "BLO_readfile.hh" +#include "BLO_readfile.h" /** * File indexing for the file/asset browser. diff --git a/source/blender/editors/include/ED_fileselect.hh b/source/blender/editors/include/ED_fileselect.hh index b52b2d254c1..e944dd15476 100644 --- a/source/blender/editors/include/ED_fileselect.hh +++ b/source/blender/editors/include/ED_fileselect.hh @@ -56,7 +56,7 @@ struct FileAttributeColumn { }; struct FileLayout { - /* view settings - XXX: move into its own struct. */ + /* view settings - XXX: move into own struct. */ int offset_top; /* Height of the header for the different FileAttributeColumn's. */ int attribute_column_header_h; diff --git a/source/blender/editors/include/ED_gpencil_legacy.hh b/source/blender/editors/include/ED_gpencil_legacy.hh index 9e8d42117b9..2a71bb0f155 100644 --- a/source/blender/editors/include/ED_gpencil_legacy.hh +++ b/source/blender/editors/include/ED_gpencil_legacy.hh @@ -494,7 +494,7 @@ void ED_gpencil_update_color_uv(Main *bmain, Material *mat); /** * Extend selection to stroke intersections: - * \return The result of selecting: + * \returns: * 0 - No hit * 1 - Hit in point A * 2 - Hit in point B diff --git a/source/blender/editors/include/ED_grease_pencil.hh b/source/blender/editors/include/ED_grease_pencil.hh index db2e62493e2..046d911cc69 100644 --- a/source/blender/editors/include/ED_grease_pencil.hh +++ b/source/blender/editors/include/ED_grease_pencil.hh @@ -23,10 +23,8 @@ struct Main; struct Object; struct KeyframeEditData; struct wmKeyConfig; -struct wmOperator; struct ToolSettings; struct Scene; -struct UndoType; struct ViewDepths; struct View3D; namespace blender { @@ -53,8 +51,6 @@ void ED_operatortypes_grease_pencil_edit(); void ED_operatortypes_grease_pencil_material(); void ED_operatormacros_grease_pencil(); void ED_keymap_grease_pencil(wmKeyConfig *keyconf); - -void ED_undosys_type_grease_pencil(UndoType *undo_type); /** * Get the selection mode for Grease Pencil selection operators: point, stroke, segment. */ @@ -74,6 +70,7 @@ class DrawingPlacement { DrawingPlacementDepth depth_; DrawingPlacementPlane plane_; + bke::greasepencil::DrawingTransforms transforms_; ViewDepths *depth_cache_ = nullptr; float surface_offset_; @@ -81,16 +78,12 @@ class DrawingPlacement { float3 placement_normal_; float4 placement_plane_; - float4x4 layer_space_to_world_space_; - float4x4 world_space_to_layer_space_; - public: DrawingPlacement() = default; DrawingPlacement(const Scene &scene, const ARegion ®ion, const View3D &view3d, - const Object &eval_object, - const bke::greasepencil::Layer &layer); + const Object &object); ~DrawingPlacement(); public: @@ -158,19 +151,11 @@ void select_frames_range(bke::greasepencil::TreeNode &node, */ bool has_any_frame_selected(const bke::greasepencil::Layer &layer); -/** - * Check for an active keyframe at the current scene time. When there is not, - * create one when auto-key is on (taking additive drawing setting into account). - * \return false when no keyframe could be found or created. - */ -bool ensure_active_keyframe(const Scene &scene, GreasePencil &grease_pencil); - void create_keyframe_edit_data_selected_frames_list(KeyframeEditData *ked, const bke::greasepencil::Layer &layer); bool active_grease_pencil_poll(bContext *C); bool editable_grease_pencil_poll(bContext *C); -bool active_grease_pencil_layer_poll(bContext *C); bool editable_grease_pencil_point_selection_poll(bContext *C); bool grease_pencil_painting_poll(bContext *C); @@ -183,16 +168,13 @@ struct MutableDrawingInfo { bke::greasepencil::Drawing &drawing; const int layer_index; const int frame_number; - const float multi_frame_falloff; }; -Vector retrieve_editable_drawings(const Scene &scene, - GreasePencil &grease_pencil); -Vector retrieve_editable_drawings_with_falloff(const Scene &scene, - GreasePencil &grease_pencil); -Vector retrieve_editable_drawings_from_layer( +Array retrieve_editable_drawings(const Scene &scene, + GreasePencil &grease_pencil); +Array retrieve_editable_drawings_from_layer( const Scene &scene, GreasePencil &grease_pencil, const bke::greasepencil::Layer &layer); -Vector retrieve_visible_drawings(const Scene &scene, - const GreasePencil &grease_pencil); +Array retrieve_visible_drawings(const Scene &scene, + const GreasePencil &grease_pencil); IndexMask retrieve_editable_strokes(Object &grease_pencil_object, const bke::greasepencil::Drawing &drawing, @@ -225,8 +207,8 @@ IndexMask retrieve_editable_and_selected_elements(Object &object, IndexMaskMemory &memory); void create_blank(Main &bmain, Object &object, int frame_number); -void create_stroke(Main &bmain, Object &object, const float4x4 &matrix, int frame_number); -void create_suzanne(Main &bmain, Object &object, const float4x4 &matrix, int frame_number); +void create_stroke(Main &bmain, Object &object, float4x4 matrix, int frame_number); +void create_suzanne(Main &bmain, Object &object, float4x4 matrix, int frame_number); int64_t ramer_douglas_peucker_simplify(IndexRange range, float epsilon, diff --git a/source/blender/editors/include/ED_keyframes_edit.hh b/source/blender/editors/include/ED_keyframes_edit.hh index 1ee2e524674..8fa1f1b0135 100644 --- a/source/blender/editors/include/ED_keyframes_edit.hh +++ b/source/blender/editors/include/ED_keyframes_edit.hh @@ -8,9 +8,7 @@ #pragma once -#include "BLI_array.hh" #include "BLI_math_vector_types.hh" - #include "ED_anim_api.hh" /* for enum eAnimFilter_Flags */ struct BezTriple; @@ -100,7 +98,8 @@ enum eEditKeyframes_Mirror { struct KeyframeEdit_LassoData { rctf *rectf_scaled; const rctf *rectf_view; - blender::Array mcoords; + const int (*mcoords)[2]; + int mcoords_len; }; /* use with BEZT_OK_REGION_CIRCLE */ diff --git a/source/blender/editors/include/ED_keyframing.hh b/source/blender/editors/include/ED_keyframing.hh index 713393dd06a..765c7cd121f 100644 --- a/source/blender/editors/include/ED_keyframing.hh +++ b/source/blender/editors/include/ED_keyframing.hh @@ -225,19 +225,19 @@ int ANIM_scene_get_keyingset_index(Scene *scene, KeyingSet *ks); */ KeyingSet *ANIM_get_keyingset_for_autokeying(const Scene *scene, const char *transformKSName); -void ANIM_keyingset_visit_for_search( - const bContext *C, - PointerRNA *ptr, - PropertyRNA *prop, - const char *edit_text, - blender::FunctionRef visit_fn); +void ANIM_keyingset_visit_for_search(const bContext *C, + PointerRNA *ptr, + PropertyRNA *prop, + const char *edit_text, + StringPropertySearchVisitFunc visit_fn, + void *visit_user_data); -void ANIM_keyingset_visit_for_search_no_poll( - const bContext *C, - PointerRNA *ptr, - PropertyRNA *prop, - const char *edit_text, - blender::FunctionRef visit_fn); +void ANIM_keyingset_visit_for_search_no_poll(const bContext *C, + PointerRNA *ptr, + PropertyRNA *prop, + const char *edit_text, + StringPropertySearchVisitFunc visit_fn, + void *visit_user_data); /** * Dynamically populate an enum of Keying Sets. */ diff --git a/source/blender/editors/include/ED_mesh.hh b/source/blender/editors/include/ED_mesh.hh index 43ca2864715..0de58280dec 100644 --- a/source/blender/editors/include/ED_mesh.hh +++ b/source/blender/editors/include/ED_mesh.hh @@ -593,11 +593,11 @@ int ED_mesh_shapes_join_objects_exec(bContext *C, wmOperator *op); /* mirror lookup api */ /* Spatial Mirror */ -void ED_mesh_mirror_spatial_table_begin(Object *ob, BMEditMesh *em, Mesh *mesh_eval); +void ED_mesh_mirror_spatial_table_begin(Object *ob, BMEditMesh *em, Mesh *me_eval); void ED_mesh_mirror_spatial_table_end(Object *ob); int ED_mesh_mirror_spatial_table_lookup(Object *ob, BMEditMesh *em, - Mesh *mesh_eval, + Mesh *me_eval, const float co[3]); /* Topology Mirror */ @@ -607,20 +607,20 @@ int ED_mesh_mirror_spatial_table_lookup(Object *ob, * \note This is supposed return -1 on error, * which callers are currently checking for, but is not used so far. */ -void ED_mesh_mirror_topo_table_begin(Object *ob, Mesh *mesh_eval); +void ED_mesh_mirror_topo_table_begin(Object *ob, Mesh *me_eval); void ED_mesh_mirror_topo_table_end(Object *ob); /** * Retrieves mirrored cache vert, or NULL if there isn't one. * \note calling this without ensuring the mirror cache state is bad. */ -int mesh_get_x_mirror_vert(Object *ob, Mesh *mesh_eval, int index, bool use_topology); +int mesh_get_x_mirror_vert(Object *ob, Mesh *me_eval, int index, bool use_topology); BMVert *editbmesh_get_x_mirror_vert( Object *ob, BMEditMesh *em, BMVert *eve, const float co[3], int index, bool use_topology); /** * This is a Mesh-based copy of #mesh_get_x_mirror_faces(). */ -int *mesh_get_x_mirror_faces(Object *ob, BMEditMesh *em, Mesh *mesh_eval); +int *mesh_get_x_mirror_faces(Object *ob, BMEditMesh *em, Mesh *me_eval); /** * Wrapper for object-mode/edit-mode. diff --git a/source/blender/editors/include/ED_scene.hh b/source/blender/editors/include/ED_scene.hh index 94c627ea248..208743e794f 100644 --- a/source/blender/editors/include/ED_scene.hh +++ b/source/blender/editors/include/ED_scene.hh @@ -10,7 +10,7 @@ #include "BLI_compiler_attrs.h" -#include "BKE_scene.hh" +#include "BKE_scene.h" struct ReportList; struct bContext; @@ -54,7 +54,7 @@ struct SceneFPS_State { /** * Update frame rate info for viewport drawing. * \param ltime: Time since the last update, - * compatible with the result of #BLI_time_now_seconds. + * compatible with the result of #BLI_check_seconds_timer. */ void ED_scene_fps_average_accumulate(Scene *scene, short fps_samples, double ltime) ATTR_NONNULL(1); diff --git a/source/blender/editors/include/ED_undo.hh b/source/blender/editors/include/ED_undo.hh index fc28d9286dd..26ac9dbed01 100644 --- a/source/blender/editors/include/ED_undo.hh +++ b/source/blender/editors/include/ED_undo.hh @@ -113,7 +113,7 @@ Base **ED_undo_editmode_bases_from_view_layer(const Scene *scene, * this is needed for modes which handle undo themselves (bypassing #ED_undo_push). * * Using global isn't great, this just avoids doing inline, - * causing 'BKE_global.hh' & 'BKE_main.hh' includes. + * causing 'BKE_global.h' & 'BKE_main.hh' includes. */ UndoStack *ED_undo_stack_get(); @@ -129,7 +129,7 @@ void ED_undosys_type_free(); /* `memfile_undo.cc` */ -MemFile *ED_undosys_stack_memfile_get_if_active(UndoStack *ustack); +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". diff --git a/source/blender/editors/include/ED_util.hh b/source/blender/editors/include/ED_util.hh index 087bc87766f..8450cc3d72e 100644 --- a/source/blender/editors/include/ED_util.hh +++ b/source/blender/editors/include/ED_util.hh @@ -11,13 +11,10 @@ #include "BLI_compiler_attrs.h" #include "WM_types.hh" +struct IDRemapper; struct Main; struct bContext; -namespace blender::bke::id { -class IDRemapper; -} - /* ed_util.cc */ void ED_editors_init_for_undo(Main *bmain); @@ -45,9 +42,7 @@ bool ED_editors_flush_edits(Main *bmain); * \param new_id: may be NULL to unlink \a old_id. */ void ED_spacedata_id_remap_single(ScrArea *area, SpaceLink *sl, ID *old_id, ID *new_id); -void ED_spacedata_id_remap(ScrArea *area, - SpaceLink *sl, - const blender::bke::id::IDRemapper &mappings); +void ED_spacedata_id_remap(ScrArea *area, SpaceLink *sl, const IDRemapper *mappings); void ED_operatortypes_edutils(); diff --git a/source/blender/editors/include/ED_view3d.hh b/source/blender/editors/include/ED_view3d.hh index 1be2ab5188d..d3cd26de431 100644 --- a/source/blender/editors/include/ED_view3d.hh +++ b/source/blender/editors/include/ED_view3d.hh @@ -188,8 +188,6 @@ enum eV3DDepthOverrideMode { }; /** * Redraw the viewport depth buffer. - * Call #ED_view3d_has_depth_buffer_updated if you want to check if the viewport already has depth - * buffer updated. */ void ED_view3d_depth_override(Depsgraph *depsgraph, ARegion *region, @@ -211,8 +209,6 @@ bool ED_view3d_depth_unproject_v3(const ARegion *region, double depth, float r_location_world[3]); -bool ED_view3d_has_depth_buffer_updated(const Depsgraph *depsgraph, const View3D *v3d); - /** * Utilities to perform navigation. * Call `ED_view3d_navigation_init` to create a context and `ED_view3d_navigation_do` to perform @@ -361,18 +357,18 @@ void ED_view3d_cursor_snap_draw_util(RegionView3D *rv3d, /* foreach iterators */ -void meshobject_foreachScreenVert(const ViewContext *vc, +void meshobject_foreachScreenVert(ViewContext *vc, void (*func)(void *user_data, const float screen_co[2], int index), void *user_data, eV3DProjTest clip_flag); void mesh_foreachScreenVert( - const ViewContext *vc, + ViewContext *vc, void (*func)(void *user_data, BMVert *eve, const float screen_co[2], int index), void *user_data, eV3DProjTest clip_flag); -void mesh_foreachScreenEdge(const ViewContext *vc, +void mesh_foreachScreenEdge(ViewContext *vc, void (*func)(void *user_data, BMEdge *eed, const float screen_co_a[2], @@ -385,7 +381,7 @@ void mesh_foreachScreenEdge(const ViewContext *vc, * A version of #mesh_foreachScreenEdge that clips the segment when * there is a clipping bounding box. */ -void mesh_foreachScreenEdge_clip_bb_segment(const ViewContext *vc, +void mesh_foreachScreenEdge_clip_bb_segment(ViewContext *vc, void (*func)(void *user_data, BMEdge *eed, const float screen_co_a[2], @@ -395,11 +391,11 @@ void mesh_foreachScreenEdge_clip_bb_segment(const ViewContext *vc, eV3DProjTest clip_flag); void mesh_foreachScreenFace( - const ViewContext *vc, + ViewContext *vc, void (*func)(void *user_data, BMFace *efa, const float screen_co[2], int index), void *user_data, eV3DProjTest clip_flag); -void nurbs_foreachScreenVert(const ViewContext *vc, +void nurbs_foreachScreenVert(ViewContext *vc, void (*func)(void *user_data, Nurb *nu, BPoint *bp, @@ -412,18 +408,18 @@ void nurbs_foreachScreenVert(const ViewContext *vc, /** * #ED_view3d_init_mats_rv3d must be called first. */ -void mball_foreachScreenElem(const ViewContext *vc, +void mball_foreachScreenElem(ViewContext *vc, void (*func)(void *user_data, MetaElem *ml, const float screen_co[2]), void *user_data, eV3DProjTest clip_flag); -void lattice_foreachScreenVert(const ViewContext *vc, +void lattice_foreachScreenVert(ViewContext *vc, void (*func)(void *user_data, BPoint *bp, const float screen_co[2]), void *user_data, eV3DProjTest clip_flag); /** * #ED_view3d_init_mats_rv3d must be called first. */ -void armature_foreachScreenBone(const ViewContext *vc, +void armature_foreachScreenBone(ViewContext *vc, void (*func)(void *user_data, EditBone *ebone, const float screen_co_a[2], @@ -434,7 +430,7 @@ void armature_foreachScreenBone(const ViewContext *vc, /** * ED_view3d_init_mats_rv3d must be called first. */ -void pose_foreachScreenBone(const ViewContext *vc, +void pose_foreachScreenBone(ViewContext *vc, void (*func)(void *user_data, bPoseChannel *pchan, const float screen_co_a[2], @@ -712,8 +708,9 @@ bool ED_view3d_win_to_segment_clipped(const Depsgraph *depsgraph, float r_ray_end[3], bool do_clip_planes); blender::float4x4 ED_view3d_ob_project_mat_get(const RegionView3D *rv3d, const Object *ob); -blender::float4x4 ED_view3d_ob_project_mat_get_from_obmat(const RegionView3D *rv3d, - const blender::float4x4 &obmat); +void ED_view3d_ob_project_mat_get_from_obmat(const RegionView3D *rv3d, + const float obmat[4][4], + float r_pmat[4][4]); /** * Convert between region relative coordinates (x,y) and depth component z and @@ -830,13 +827,17 @@ float ED_view3d_radius_to_dist(const View3D *v3d, bool use_aspect, float radius); +/** + * Back-buffer select and draw support. + */ +void ED_view3d_backbuf_depth_validate(ViewContext *vc); /** * allow for small values [0.5 - 2.5], * and large values, FLT_MAX by clamping by the area size */ int ED_view3d_backbuf_sample_size_clamp(ARegion *region, float dist); -void ED_view3d_select_id_validate(const ViewContext *vc); +void ED_view3d_select_id_validate(ViewContext *vc); /** Check if the last auto-dist can be used. */ bool ED_view3d_autodist_last_check(wmWindow *win, const wmEvent *event); @@ -854,16 +855,18 @@ void ED_view3d_autodist_last_clear(wmWindow *win); /** * Get the world-space 3d location from a screen-space 2d point. - * It may be useful to call #ED_view3d_depth_override before. + * TODO: Implement #alphaoverride. We don't want to zoom into billboards. * * \param mval: Input screen-space pixel location. * \param mouse_worldloc: Output world-space location. * \param fallback_depth_pt: Use this points depth when no depth can be found. */ -bool ED_view3d_autodist(ARegion *region, +bool ED_view3d_autodist(Depsgraph *depsgraph, + ARegion *region, View3D *v3d, const int mval[2], float mouse_worldloc[3], + bool alphaoverride, const float fallback_depth_pt[3]); /** @@ -908,18 +911,18 @@ void view3d_opengl_select_cache_end(); /** * \note (vc->obedit == NULL) can be set to explicitly skip edit-object selection. */ -int view3d_opengl_select_ex(const ViewContext *vc, +int view3d_opengl_select_ex(ViewContext *vc, GPUSelectBuffer *buffer, const rcti *input, eV3DSelectMode select_mode, eV3DSelectObjectFilter select_filter, bool do_material_slot_selection); -int view3d_opengl_select(const ViewContext *vc, +int view3d_opengl_select(ViewContext *vc, GPUSelectBuffer *buffer, const rcti *input, eV3DSelectMode select_mode, eV3DSelectObjectFilter select_filter); -int view3d_opengl_select_with_id_filter(const ViewContext *vc, +int view3d_opengl_select_with_id_filter(ViewContext *vc, GPUSelectBuffer *buffer, const rcti *input, eV3DSelectMode select_mode, diff --git a/source/blender/editors/include/ED_view3d_offscreen.hh b/source/blender/editors/include/ED_view3d_offscreen.hh index f46943c6bd3..124ff0b69c4 100644 --- a/source/blender/editors/include/ED_view3d_offscreen.hh +++ b/source/blender/editors/include/ED_view3d_offscreen.hh @@ -39,7 +39,7 @@ void ED_view3d_draw_offscreen(Depsgraph *depsgraph, GPUOffScreen *ofs, GPUViewport *viewport); /** - * Creates separate fake 3d views (wrapping #ED_view3d_draw_offscreen). Similar too + * Creates own fake 3d views (wrapping #ED_view3d_draw_offscreen). Similar too * #ED_view_draw_offscreen_imbuf_simple, but takes view/projection matrices as arguments. */ void ED_view3d_draw_offscreen_simple(Depsgraph *depsgraph, @@ -87,7 +87,7 @@ ImBuf *ED_view3d_draw_offscreen_imbuf(Depsgraph *depsgraph, GPUViewport *viewport, char err_out[256]); /** - * Creates separate fake 3d views (wrapping #ED_view3d_draw_offscreen_imbuf) + * Creates own fake 3d views (wrapping #ED_view3d_draw_offscreen_imbuf) * * \param ofs: Optional off-screen buffer can be NULL. * (avoids re-creating when doing multiple GL renders). diff --git a/source/blender/editors/include/UI_abstract_view.hh b/source/blender/editors/include/UI_abstract_view.hh index aebd849f785..aa708723531 100644 --- a/source/blender/editors/include/UI_abstract_view.hh +++ b/source/blender/editors/include/UI_abstract_view.hh @@ -37,6 +37,7 @@ struct bContext; struct uiBlock; struct uiButViewItem; struct uiLayout; +struct uiViewItemHandle; struct ViewLink; struct wmDrag; struct wmNotifier; @@ -52,7 +53,7 @@ class AbstractView { bool is_reconstructed_ = false; /** - * Only one item can be renamed at a time. So rather than giving each item its own rename buffer + * Only one item can be renamed at a time. So rather than giving each item an own rename buffer * (which just adds unused memory in most cases), have one here that is managed by the view. * * This fixed-size buffer is needed because that's what the rename button requires. In future we @@ -250,6 +251,9 @@ class AbstractViewItem { void end_renaming(); void rename_apply(const bContext &C); + template + static ToType *from_item_handle(uiViewItemHandle *handle); + protected: AbstractViewItem() = default; @@ -299,6 +303,14 @@ class AbstractViewItem { void add_rename_button(uiBlock &block); }; +template ToType *AbstractViewItem::from_item_handle(uiViewItemHandle *handle) +{ + static_assert(std::is_base_of::value, + "Type must derive from and implement the AbstractViewItem interface"); + + return dynamic_cast(reinterpret_cast(handle)); +} + /* ---------------------------------------------------------------------- */ /** \name Drag 'n Drop * \{ */ diff --git a/source/blender/editors/include/UI_icons.hh b/source/blender/editors/include/UI_icons.hh index 8c94ed9c632..49a7e34acef 100644 --- a/source/blender/editors/include/UI_icons.hh +++ b/source/blender/editors/include/UI_icons.hh @@ -758,7 +758,7 @@ DEF_ICON_BLANK(275) DEF_ICON_BLANK(276) DEF_ICON_BLANK(277) DEF_ICON_BLANK(772) -DEF_ICON(INTERNET) +DEF_ICON_BLANK(773) DEF_ICON(CURRENT_FILE) DEF_ICON(HOME) DEF_ICON(DOCUMENTS) diff --git a/source/blender/editors/include/UI_interface.hh b/source/blender/editors/include/UI_interface.hh index a6a67f563bc..2da1889a228 100644 --- a/source/blender/editors/include/UI_interface.hh +++ b/source/blender/editors/include/UI_interface.hh @@ -32,12 +32,10 @@ struct uiBut; struct uiLayout; struct uiList; struct uiSearchItems; +struct uiViewHandle; +struct uiViewItemHandle; struct wmDrag; struct wmEvent; -namespace blender::ui { -class AbstractView; -class AbstractViewItem; -} // namespace blender::ui void UI_but_func_set(uiBut *but, std::function func); void UI_but_func_pushed_state_set(uiBut *but, std::function func); @@ -186,6 +184,8 @@ std::string drop_target_tooltip(const ARegion ®ion, const wmDrag &drag, const wmEvent &event); +std::unique_ptr view_drop_target(uiViewHandle *view_handle); +std::unique_ptr view_item_drop_target(uiViewItemHandle *item_handle); /** * Try to find a view item with a drop target under the mouse cursor, or if not found, a view * with a drop target. diff --git a/source/blender/editors/include/UI_interface_c.hh b/source/blender/editors/include/UI_interface_c.hh index 3bdf931048d..a57b32f6e6d 100644 --- a/source/blender/editors/include/UI_interface_c.hh +++ b/source/blender/editors/include/UI_interface_c.hh @@ -23,6 +23,7 @@ /* Struct Declarations */ struct ARegion; +struct AssetFilterSettings; struct AutoComplete; struct EnumPropertyItem; struct FileSelectParams; @@ -67,13 +68,6 @@ struct wmOperator; struct wmOperatorType; struct wmRegionListenerParams; struct wmWindow; -namespace blender::ed::asset { -struct AssetFilterSettings; -} -namespace blender::ui { -class AbstractView; -class AbstractViewItem; -} // namespace blender::ui struct uiBlock; struct uiBut; @@ -81,6 +75,10 @@ struct uiButExtraOpIcon; struct uiLayout; struct uiPopupBlockHandle; struct uiTooltipData; +/* C handle for C++ #ui::AbstractView type. */ +struct uiViewHandle; +/* C handle for C++ #ui::AbstractViewItem type. */ +struct uiViewItemHandle; /* Defines */ @@ -763,7 +761,7 @@ uiLayout *UI_pie_menu_layout(uiPieMenu *pie); /* Popup Blocks * * Functions used to create popup blocks. These are like popup menus - * but allow using all button types and creating their own layout. */ + * but allow using all button types and creating an own layout. */ using uiBlockCreateFunc = uiBlock *(*)(bContext *C, ARegion *region, void *arg1); using uiBlockCancelFunc = void (*)(bContext *C, void *arg1); @@ -969,9 +967,12 @@ bool UI_block_active_only_flagged_buttons(const bContext *C, ARegion *region, ui */ void UI_but_execute(const bContext *C, ARegion *region, uiBut *but); -std::optional UI_but_online_manual_id(const uiBut *but) ATTR_WARN_UNUSED_RESULT; -std::optional UI_but_online_manual_id_from_active(const bContext *C) - ATTR_WARN_UNUSED_RESULT; +bool UI_but_online_manual_id(const uiBut *but, + char *r_str, + size_t str_maxncpy) ATTR_WARN_UNUSED_RESULT; +bool UI_but_online_manual_id_from_active(const bContext *C, + char *r_str, + size_t str_maxncpy) ATTR_WARN_UNUSED_RESULT; bool UI_but_is_userdef(const uiBut *but); /* Buttons @@ -995,6 +996,8 @@ uiBut *uiDefBut(uiBlock *block, void *poin, float min, float max, + float a1, + float a2, const char *tip); uiBut *uiDefButF(uiBlock *block, int type, @@ -1019,6 +1022,8 @@ uiBut *uiDefButI(uiBlock *block, int *poin, float min, float max, + float a1, + float a2, const char *tip); uiBut *uiDefButBitI(uiBlock *block, int type, @@ -1044,6 +1049,8 @@ uiBut *uiDefButS(uiBlock *block, short *poin, float min, float max, + float a1, + float a2, const char *tip); uiBut *uiDefButBitS(uiBlock *block, int type, @@ -1132,6 +1139,9 @@ uiBut *uiDefButO_ptr(uiBlock *block, short height, const char *tip); +/** + * If a1==1.0 then a2 is an extra icon blending factor (alpha 0.0 - 1.0). + */ uiBut *uiDefIconBut(uiBlock *block, int type, int retval, @@ -1143,6 +1153,8 @@ uiBut *uiDefIconBut(uiBlock *block, void *poin, float min, float max, + float a1, + float a2, const char *tip); uiBut *uiDefIconButI(uiBlock *block, int type, @@ -1155,6 +1167,8 @@ uiBut *uiDefIconButI(uiBlock *block, int *poin, float min, float max, + float a1, + float a2, const char *tip); uiBut *uiDefIconButBitI(uiBlock *block, int type, @@ -1168,6 +1182,8 @@ uiBut *uiDefIconButBitI(uiBlock *block, int *poin, float min, float max, + float a1, + float a2, const char *tip); uiBut *uiDefIconButS(uiBlock *block, int type, @@ -1180,6 +1196,8 @@ uiBut *uiDefIconButS(uiBlock *block, short *poin, float min, float max, + float a1, + float a2, const char *tip); uiBut *uiDefIconButBitS(uiBlock *block, int type, @@ -1193,6 +1211,8 @@ uiBut *uiDefIconButBitS(uiBlock *block, short *poin, float min, float max, + float a1, + float a2, const char *tip); uiBut *uiDefIconButBitC(uiBlock *block, int type, @@ -1206,6 +1226,8 @@ uiBut *uiDefIconButBitC(uiBlock *block, char *poin, float min, float max, + float a1, + float a2, const char *tip); uiBut *uiDefIconButR(uiBlock *block, int type, @@ -1271,7 +1293,24 @@ uiBut *uiDefIconTextBut(uiBlock *block, void *poin, float min, float max, + float a1, + float a2, const char *tip); +uiBut *uiDefIconTextButF(uiBlock *block, + int type, + int retval, + int icon, + blender::StringRef str, + int x, + int y, + short width, + short height, + float *poin, + float min, + float max, + float a1, + float a2, + const char *tip); uiBut *uiDefIconTextButI(uiBlock *block, int type, int retval, @@ -1284,6 +1323,8 @@ uiBut *uiDefIconTextButI(uiBlock *block, int *poin, float min, float max, + float a1, + float a2, const char *tip); uiBut *uiDefIconTextButR(uiBlock *block, int type, @@ -1422,12 +1463,6 @@ enum eButProgressType { UI_BUT_PROGRESS_TYPE_RING = 1, }; -enum class LayoutSeparatorType : int8_t { - Auto, - Space, - Line, -}; - /***************************** ID Utilities *******************************/ int UI_icon_from_id(const ID *id); @@ -1503,6 +1538,7 @@ uiBut *uiDefIconBlockBut(uiBlock *block, /** * \param arg: A pointer to string/name, use #UI_but_func_search_set() below to make this work. + * here `a1` and `a2`, if set, control thumbnail preview rows/cols. */ uiBut *uiDefSearchBut(uiBlock *block, void *arg, @@ -1513,6 +1549,8 @@ uiBut *uiDefSearchBut(uiBlock *block, int y, short width, short height, + float a1, + float a2, const char *tip); /** * Same parameters as for #uiDefSearchBut, with additional operator type and properties, @@ -1529,6 +1567,8 @@ uiBut *uiDefSearchButO_ptr(uiBlock *block, int y, short width, short height, + float a1, + float a2, const char *tip); /** For #uiDefAutoButsRNA. */ @@ -1675,11 +1715,8 @@ void UI_but_number_precision_set(uiBut *but, float precision); void UI_but_number_slider_step_size_set(uiBut *but, float step_size); void UI_but_number_slider_precision_set(uiBut *but, float precision); -void UI_but_label_alpha_factor_set(uiBut *but, float alpha_factor); - -void UI_but_search_preview_grid_size_set(uiBut *but, int rows, int cols); - void UI_block_func_handle_set(uiBlock *block, uiBlockHandleFunc func, void *arg); +void UI_block_func_butmenu_set(uiBlock *block, uiMenuHandleFunc func, void *arg); void UI_block_func_set(uiBlock *block, uiButHandleFunc func, void *arg1, void *arg2); void UI_block_funcN_set(uiBlock *block, uiButHandleNFunc funcN, void *argN, void *arg2); @@ -1832,6 +1869,10 @@ void UI_but_drag_set_rna(uiBut *but, PointerRNA *ptr); */ void UI_but_drag_set_path(uiBut *but, const char *path); void UI_but_drag_set_name(uiBut *but, const char *name); +/** + * Value from button itself. + */ +void UI_but_drag_set_value(uiBut *but); /** * Sets #UI_BUT_DRAG_FULL_BUT so the full button can be dragged. @@ -2650,7 +2691,7 @@ void uiTemplateAssetView(uiLayout *layout, const char *assets_propname, PointerRNA *active_dataptr, const char *active_propname, - const blender::ed::asset::AssetFilterSettings *filter_settings, + const AssetFilterSettings *filter_settings, int display_flags, const char *activate_opname, PointerRNA *r_activate_op_properties, @@ -2675,13 +2716,13 @@ void uiTemplateNodeTreeInterface(uiLayout *layout, PointerRNA *ptr); void uiTemplateNodeInputs(uiLayout *layout, bContext *C, PointerRNA *ptr); /** - * \return An RNA pointer for the operator properties. + * \return: A RNA pointer for the operator properties. */ PointerRNA *UI_list_custom_activate_operator_set(uiList *ui_list, const char *opname, bool create_properties); /** - * \return An RNA pointer for the operator properties. + * \return: A RNA pointer for the operator properties. */ PointerRNA *UI_list_custom_drag_operator_set(uiList *ui_list, const char *opname, @@ -2915,12 +2956,12 @@ void uiItemDecoratorR_prop(uiLayout *layout, PointerRNA *ptr, PropertyRNA *prop, * To force inserting a blank dummy element, NULL can be passed for \a ptr and \a propname. */ void uiItemDecoratorR(uiLayout *layout, PointerRNA *ptr, const char *propname, int index); +/** Value item */ +void uiItemV(uiLayout *layout, const char *name, int icon, int argval); /** Separator item */ void uiItemS(uiLayout *layout); /** Separator item */ -void uiItemS_ex(uiLayout *layout, - float factor, - LayoutSeparatorType type = LayoutSeparatorType::Auto); +void uiItemS_ex(uiLayout *layout, float factor); /** Flexible spacing. */ void uiItemSpacer(uiLayout *layout); @@ -3176,6 +3217,9 @@ const uiStyle *UI_style_get(); /* use for fonts etc */ */ const uiStyle *UI_style_get_dpi(); +/* linker workaround ack! */ +void UI_template_fix_linking(); + /* UI_OT_editsource helpers */ bool UI_editsource_enable_check(); void UI_editsource_active_but_test(uiBut *but); @@ -3230,10 +3274,12 @@ void UI_butstore_unregister(uiButStore *bs_handle, uiBut **but_p); * for actions that can also be activated using shortcuts while the cursor is over the button. * Without this those shortcuts aren't discoverable for users. */ -std::optional UI_key_event_operator_string(const bContext *C, - const char *opname, - IDProperty *properties, - bool is_strict); +const char *UI_key_event_operator_string(const bContext *C, + const char *opname, + IDProperty *properties, + const bool is_strict, + char *result, + const int result_maxncpy); /* ui_interface_region_tooltip.c */ @@ -3275,7 +3321,7 @@ ARegion *UI_tooltip_create_from_search_item_generic( /* Float precision helpers */ #define UI_PRECISION_FLOAT_MAX 6 -/* For float buttons the 'step', is scaled */ +/* For float buttons the 'step' (or a1), is scaled */ #define UI_PRECISION_FLOAT_SCALE 0.01f /* Typical UI text */ @@ -3311,33 +3357,45 @@ void UI_interface_tag_script_reload(); /** Support click-drag motion which presses the button and closes a popover (like a menu). */ #define USE_UI_POPOVER_ONCE -bool UI_view_item_matches(const blender::ui::AbstractViewItem &a, - const blender::ui::AbstractViewItem &b); /** - * Can \a item be renamed right now? Note that this isn't just a mere wrapper around + * Call the #ui::AbstractView::begin_filtering() function of the view to enable filtering. + * Typically used to enable a filter text button. Triggered on Ctrl+F by default. + * \return True when filtering was enabled successfully. + */ +bool UI_view_begin_filtering(const bContext *C, const uiViewHandle *view_handle); + +bool UI_view_item_is_interactive(const uiViewItemHandle *item_handle); +bool UI_view_item_is_active(const uiViewItemHandle *item_handle); +bool UI_view_item_matches(const uiViewItemHandle *a_handle, const uiViewItemHandle *b_handle); +/** + * Can \a item_handle be renamed right now? Note that this isn't just a mere wrapper around * #AbstractViewItem::supports_renaming(). This also checks if there is another item being renamed, * and returns false if so. */ -bool UI_view_item_can_rename(const blender::ui::AbstractViewItem &item); -void UI_view_item_begin_rename(blender::ui::AbstractViewItem &item); +bool UI_view_item_can_rename(const uiViewItemHandle *item_handle); +void UI_view_item_begin_rename(uiViewItemHandle *item_handle); -bool UI_view_item_supports_drag(const blender::ui::AbstractViewItem &item); +void UI_view_item_context_menu_build(bContext *C, + const uiViewItemHandle *item_handle, + uiLayout *column); + +bool UI_view_item_supports_drag(const uiViewItemHandle *item_); /** * Attempt to start dragging \a item_. This will not work if the view item doesn't * support dragging, i.e. if it won't create a drag-controller upon request. * \return True if dragging started successfully, otherwise false. */ -bool UI_view_item_drag_start(bContext &C, const blender::ui::AbstractViewItem &item); +bool UI_view_item_drag_start(bContext *C, const uiViewItemHandle *item_); /** * \param xy: Coordinate to find a view item at, in window space. * \param pad: Extra padding added to the bounding box of the view. */ -blender::ui::AbstractView *UI_region_view_find_at(const ARegion *region, const int xy[2], int pad); +uiViewHandle *UI_region_view_find_at(const ARegion *region, const int xy[2], int pad); /** * \param xy: Coordinate to find a view item at, in window space. */ -blender::ui::AbstractViewItem *UI_region_views_find_item_at(const ARegion ®ion, - const int xy[2]); -blender::ui::AbstractViewItem *UI_region_views_find_active_item(const ARegion *region); +uiViewItemHandle *UI_region_views_find_item_at(const ARegion *region, const int xy[2]) + ATTR_NONNULL(); +uiViewItemHandle *UI_region_views_find_active_item(const ARegion *region); uiBut *UI_region_views_find_active_item_but(const ARegion *region); diff --git a/source/blender/editors/interface/eyedroppers/eyedropper_color.cc b/source/blender/editors/interface/eyedroppers/eyedropper_color.cc index 4bf40f8d7b6..84a61579ae7 100644 --- a/source/blender/editors/interface/eyedroppers/eyedropper_color.cc +++ b/source/blender/editors/interface/eyedroppers/eyedropper_color.cc @@ -23,6 +23,8 @@ #include "BKE_context.hh" #include "BKE_cryptomatte.h" #include "BKE_image.h" +#include "BKE_main.hh" +#include "BKE_node.hh" #include "BKE_screen.hh" #include "NOD_composite.hh" @@ -38,6 +40,8 @@ #include "WM_api.hh" #include "WM_types.hh" +#include "RNA_define.hh" + #include "interface_intern.hh" #include "ED_clip.hh" diff --git a/source/blender/editors/interface/eyedroppers/eyedropper_datablock.cc b/source/blender/editors/interface/eyedroppers/eyedropper_datablock.cc index 78a6b0d1b86..ae79f25fd4e 100644 --- a/source/blender/editors/interface/eyedroppers/eyedropper_datablock.cc +++ b/source/blender/editors/interface/eyedroppers/eyedropper_datablock.cc @@ -20,11 +20,11 @@ #include "BLI_math_vector.h" #include "BLI_string.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_context.hh" #include "BKE_idtype.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "BKE_screen.hh" #include "RNA_access.hh" diff --git a/source/blender/editors/interface/eyedroppers/eyedropper_depth.cc b/source/blender/editors/interface/eyedroppers/eyedropper_depth.cc index 653b9c43339..face51ccd0a 100644 --- a/source/blender/editors/interface/eyedroppers/eyedropper_depth.cc +++ b/source/blender/editors/interface/eyedroppers/eyedropper_depth.cc @@ -163,9 +163,7 @@ static void depthdropper_depth_sample_pt(bContext *C, View3D *v3d = static_cast(area->spacedata.first); RegionView3D *rv3d = static_cast(region->regiondata); /* weak, we could pass in some reference point */ - const blender::float3 &view_co = v3d->camera ? v3d->camera->object_to_world().location() : - rv3d->viewinv[3]; - + const float *view_co = v3d->camera ? v3d->camera->object_to_world[3] : rv3d->viewinv[3]; const int mval[2] = {m_xy[0] - region->winrct.xmin, m_xy[1] - region->winrct.ymin}; copy_v2_v2_int(ddr->name_pos, mval); @@ -179,10 +177,7 @@ static void depthdropper_depth_sample_pt(bContext *C, view3d_operator_needs_opengl(C); - /* Ensure the depth buffer is updated for #ED_view3d_autodist. */ - ED_view3d_depth_override(depsgraph, region, v3d, nullptr, V3D_DEPTH_NO_GPENCIL, nullptr); - - if (ED_view3d_autodist(region, v3d, mval, co, nullptr)) { + if (ED_view3d_autodist(depsgraph, region, v3d, mval, co, true, nullptr)) { const float mval_center_fl[2] = {float(region->winx) / 2, float(region->winy) / 2}; float co_align[3]; diff --git a/source/blender/editors/interface/eyedroppers/eyedropper_driver.cc b/source/blender/editors/interface/eyedroppers/eyedropper_driver.cc index 78cab6a0d72..87d98cba734 100644 --- a/source/blender/editors/interface/eyedroppers/eyedropper_driver.cc +++ b/source/blender/editors/interface/eyedroppers/eyedropper_driver.cc @@ -14,8 +14,10 @@ #include "MEM_guardedalloc.h" #include "DNA_anim_types.h" +#include "DNA_object_types.h" #include "DNA_screen_types.h" +#include "BKE_animsys.h" #include "BKE_context.hh" #include "DEG_depsgraph.hh" diff --git a/source/blender/editors/interface/eyedroppers/eyedropper_gpencil_color.cc b/source/blender/editors/interface/eyedroppers/eyedropper_gpencil_color.cc index ac75464fcc9..1e7f0aaf8d2 100644 --- a/source/blender/editors/interface/eyedroppers/eyedropper_gpencil_color.cc +++ b/source/blender/editors/interface/eyedroppers/eyedropper_gpencil_color.cc @@ -16,7 +16,7 @@ #include "BLI_listbase.h" #include "BLI_string.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_gpencil_legacy_types.h" #include "DNA_material_types.h" @@ -25,8 +25,10 @@ #include "BKE_context.hh" #include "BKE_gpencil_legacy.h" #include "BKE_lib_id.hh" +#include "BKE_main.hh" #include "BKE_material.h" #include "BKE_paint.hh" +#include "BKE_report.h" #include "UI_interface.hh" @@ -38,9 +40,11 @@ #include "RNA_access.hh" #include "RNA_define.hh" +#include "ED_gpencil_legacy.hh" #include "ED_screen.hh" #include "ED_undo.hh" +#include "DEG_depsgraph.hh" #include "DEG_depsgraph_build.hh" #include "eyedropper_intern.hh" diff --git a/source/blender/editors/interface/interface.cc b/source/blender/editors/interface/interface.cc index 6fba3c68e77..716c92ecad4 100644 --- a/source/blender/editors/interface/interface.cc +++ b/source/blender/editors/interface/interface.cc @@ -21,6 +21,7 @@ #include "DNA_scene_types.h" #include "DNA_screen_types.h" #include "DNA_userdef_types.h" +#include "DNA_workspace_types.h" #include "BLI_ghash.h" #include "BLI_listbase.h" @@ -31,21 +32,25 @@ #include "BLI_utildefines.h" +#include "BLO_readfile.h" + #include "BKE_animsys.h" #include "BKE_context.hh" #include "BKE_idprop.h" -#include "BKE_report.hh" -#include "BKE_scene.hh" +#include "BKE_main.hh" +#include "BKE_report.h" +#include "BKE_scene.h" #include "BKE_screen.hh" #include "BKE_unit.hh" +#include "ED_asset.hh" + #include "GPU_matrix.h" #include "GPU_state.h" #include "BLF_api.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" -#include "UI_abstract_view.hh" #include "UI_interface.hh" #include "UI_interface_icons.hh" #include "UI_string_search.hh" @@ -69,6 +74,8 @@ #include "IMB_colormanagement.hh" +#include "DEG_depsgraph_query.hh" + #include "interface_intern.hh" using blender::StringRef; @@ -637,8 +644,8 @@ static float ui_but_get_float_precision(uiBut *but) if (but->type == UI_BTYPE_NUM_SLIDER) { return ((uiButNumberSlider *)but)->precision; } - BLI_assert_unreachable(); - return 1.0f; + + return but->a2; } static float ui_but_get_float_step_size(uiBut *but) @@ -649,8 +656,8 @@ static float ui_but_get_float_step_size(uiBut *but) if (but->type == UI_BTYPE_NUM_SLIDER) { return ((uiButNumberSlider *)but)->step_size; } - BLI_assert_unreachable(); - return 1.0f; + + return but->a1; } static bool ui_but_hide_fraction(uiBut *but, double value) @@ -725,7 +732,7 @@ bool ui_but_rna_equals_ex(const uiBut *but, static bool ui_but_equals_old(const uiBut *but, const uiBut *oldbut) { if (but->identity_cmp_func) { - /* If the buttons have their own identity comparator callbacks (and they match), use this to + /* If the buttons have own identity comparator callbacks (and they match), use this to * determine equality. */ if (but->identity_cmp_func && (but->type == oldbut->type) && (but->identity_cmp_func == oldbut->identity_cmp_func)) @@ -780,7 +787,7 @@ static bool ui_but_equals_old(const uiBut *but, const uiBut *oldbut) uiButViewItem *but_item = (uiButViewItem *)but; uiButViewItem *oldbut_item = (uiButViewItem *)oldbut; if (!but_item->view_item || !oldbut_item->view_item || - !UI_view_item_matches(*but_item->view_item, *oldbut_item->view_item)) + !UI_view_item_matches(but_item->view_item, oldbut_item->view_item)) { return false; } @@ -907,29 +914,10 @@ static void ui_but_update_old_active_from_new(uiBut *oldbut, uiBut *but) progress_oldbut->progress_factor = progress_but->progress_factor; break; } - case UI_BTYPE_SEPR_LINE: { - uiButSeparatorLine *line_oldbut = (uiButSeparatorLine *)oldbut; - uiButSeparatorLine *line_but = (uiButSeparatorLine *)but; - line_oldbut->is_vertical = line_but->is_vertical; - break; - } - case UI_BTYPE_LABEL: { - uiButLabel *label_oldbut = (uiButLabel *)oldbut; - uiButLabel *label_but = (uiButLabel *)but; - label_oldbut->alpha_factor = label_but->alpha_factor; - break; - } - case UI_BTYPE_SCROLL: { - uiButScrollBar *scroll_oldbut = (uiButScrollBar *)oldbut; - uiButScrollBar *scroll_but = (uiButScrollBar *)but; - scroll_oldbut->visual_height = scroll_but->visual_height; - break; - } case UI_BTYPE_VIEW_ITEM: { uiButViewItem *view_item_oldbut = (uiButViewItem *)oldbut; uiButViewItem *view_item_newbut = (uiButViewItem *)but; - ui_view_item_swap_button_pointers(*view_item_newbut->view_item, - *view_item_oldbut->view_item); + ui_view_item_swap_button_pointers(view_item_newbut->view_item, view_item_oldbut->view_item); std::swap(view_item_newbut->view_item, view_item_oldbut->view_item); break; } @@ -1116,17 +1104,21 @@ void UI_but_execute(const bContext *C, ARegion *region, uiBut *but) * returns false if undo needs to be disabled. */ static bool ui_but_is_rna_undo(const uiBut *but) { - if (but->rnaprop == nullptr) { - return true; + if (but->rnapoin.owner_id) { + /* avoid undo push for buttons who's ID are screen or wm level + * we could disable undo for buttons with no ID too but may have + * unforeseen consequences, so best check for ID's we _know_ are not + * handled by undo - campbell */ + ID *id = but->rnapoin.owner_id; + if (ID_CHECK_UNDO(id) == false) { + return false; + } } - - /* No owner or type known. Assume we do not undo push as it may be a property from - * the preferences stored outside datablocks. */ - if (but->rnapoin.owner_id == nullptr || but->rnapoin.type == nullptr) { + if (but->rnapoin.type && !RNA_struct_undo_check(but->rnapoin.type)) { return false; } - return ID_CHECK_UNDO(but->rnapoin.owner_id) && RNA_struct_undo_check(but->rnapoin.type); + return true; } /* assigns automatic keybindings to menu items for fast access @@ -1240,43 +1232,66 @@ void ui_but_add_shortcut(uiBut *but, const char *shortcut_str, const bool do_str * - #ui_but_event_property_operator_string * \{ */ -static std::optional ui_but_event_operator_string_from_operator( - const bContext *C, wmOperatorCallParams *op_call_params) +static bool ui_but_event_operator_string_from_operator(const bContext *C, + wmOperatorCallParams *op_call_params, + char *buf, + const size_t buf_maxncpy) { BLI_assert(op_call_params->optype != nullptr); + bool found = false; IDProperty *prop = reinterpret_cast(op_call_params->opptr) ? static_cast(op_call_params->opptr->data) : nullptr; - return WM_key_event_operator_string( - C, op_call_params->optype->idname, op_call_params->opcontext, prop, true); + if (WM_key_event_operator_string(C, + op_call_params->optype->idname, + op_call_params->opcontext, + prop, + true, + buf, + buf_maxncpy)) + { + found = true; + } + return found; } -static std::optional ui_but_event_operator_string_from_menu(const bContext *C, - uiBut *but) +static bool ui_but_event_operator_string_from_menu(const bContext *C, + uiBut *but, + char *buf, + const size_t buf_maxncpy) { MenuType *mt = UI_but_menutype_get(but); BLI_assert(mt != nullptr); + bool found = false; + /* annoying, create a property */ const IDPropertyTemplate val = {0}; IDProperty *prop_menu = IDP_New(IDP_GROUP, &val, __func__); /* Dummy, name is unimportant. */ IDP_AddToGroup(prop_menu, IDP_NewStringMaxSize(mt->idname, sizeof(mt->idname), "name")); - const std::optional result = WM_key_event_operator_string( - C, "WM_OT_call_menu", WM_OP_INVOKE_REGION_WIN, prop_menu, true); + if (WM_key_event_operator_string( + C, "WM_OT_call_menu", WM_OP_INVOKE_REGION_WIN, prop_menu, true, buf, buf_maxncpy)) + { + found = true; + } IDP_FreeProperty(prop_menu); - return result; + return found; } -static std::optional ui_but_event_operator_string_from_panel(const bContext *C, - uiBut *but) +static bool ui_but_event_operator_string_from_panel(const bContext *C, + uiBut *but, + char *buf, + const size_t buf_maxncpy) { /** Nearly exact copy of #ui_but_event_operator_string_from_menu */ PanelType *pt = UI_but_paneltype_get(but); BLI_assert(pt != nullptr); + bool found = false; + /* annoying, create a property */ const IDPropertyTemplate group_val = {0}; IDProperty *prop_panel = IDP_New( @@ -1288,7 +1303,6 @@ static std::optional ui_but_event_operator_string_from_panel(const IDPropertyTemplate region_type_val = {0}; region_type_val.i = pt->region_type; IDP_AddToGroup(prop_panel, IDP_New(IDP_INT, ®ion_type_val, "region_type")); - BLI_SCOPED_DEFER([&]() { IDP_FreeProperty(prop_panel); }); for (int i = 0; i < 2; i++) { /* FIXME(@ideasman42): We can't reasonably search all configurations - long term. */ @@ -1296,49 +1310,61 @@ static std::optional ui_but_event_operator_string_from_panel(const val.i = i; IDP_ReplaceInGroup(prop_panel, IDP_New(IDP_INT, &val, "keep_open")); - if (std::optional result = WM_key_event_operator_string( - C, "WM_OT_call_panel", WM_OP_INVOKE_REGION_WIN, prop_panel, true)) + if (WM_key_event_operator_string( + C, "WM_OT_call_panel", WM_OP_INVOKE_REGION_WIN, prop_panel, true, buf, buf_maxncpy)) { - return result; + found = true; + break; } } - return std::nullopt; + IDP_FreeProperty(prop_panel); + return found; } -static std::optional ui_but_event_operator_string(const bContext *C, uiBut *but) +static bool ui_but_event_operator_string(const bContext *C, + uiBut *but, + char *buf, + const size_t buf_maxncpy) { + bool found = false; + if (but->optype != nullptr) { wmOperatorCallParams params = {}; params.optype = but->optype; params.opptr = but->opptr; params.opcontext = but->opcontext; - return ui_but_event_operator_string_from_operator(C, ¶ms); + found = ui_but_event_operator_string_from_operator(C, ¶ms, buf, buf_maxncpy); } - if (UI_but_menutype_get(but) != nullptr) { - return ui_but_event_operator_string_from_menu(C, but); + else if (UI_but_menutype_get(but) != nullptr) { + found = ui_but_event_operator_string_from_menu(C, but, buf, buf_maxncpy); } - if (UI_but_paneltype_get(but) != nullptr) { - return ui_but_event_operator_string_from_panel(C, but); + else if (UI_but_paneltype_get(but) != nullptr) { + found = ui_but_event_operator_string_from_panel(C, but, buf, buf_maxncpy); } - return std::nullopt; + return found; } -static std::optional ui_but_extra_icon_event_operator_string( - const bContext *C, const uiButExtraOpIcon *extra_icon) +static bool ui_but_extra_icon_event_operator_string(const bContext *C, + const uiButExtraOpIcon *extra_icon, + char *buf, + const size_t buf_maxncpy) { wmOperatorType *extra_icon_optype = UI_but_extra_operator_icon_optype_get(extra_icon); if (extra_icon_optype) { - return ui_but_event_operator_string_from_operator(C, extra_icon->optype_params); + return ui_but_event_operator_string_from_operator( + C, extra_icon->optype_params, buf, buf_maxncpy); } - return std::nullopt; + return false; } -static std::optional ui_but_event_property_operator_string(const bContext *C, - uiBut *but) +static bool ui_but_event_property_operator_string(const bContext *C, + uiBut *but, + char *buf, + const size_t buf_maxncpy) { using namespace blender; /* Context toggle operator names to check. */ @@ -1397,7 +1423,7 @@ static std::optional ui_but_event_property_operator_string(const bC but = nullptr; if (prop == nullptr) { - return std::nullopt; + return false; } /* This version is only for finding hotkeys for properties. @@ -1437,7 +1463,7 @@ static std::optional ui_but_event_property_operator_string(const bC C, ptr, prop, prop_index); /* Always iterate once, even if data-path isn't set. */ - data_path_variations.append(data_path.value_or("")); + data_path_variations.append(data_path.has_value() ? data_path.value() : ""); if (data_path.has_value()) { StringRef data_path_ref = StringRef(data_path.value()); @@ -1460,7 +1486,6 @@ static std::optional ui_but_event_property_operator_string(const bC const IDPropertyTemplate group_val = {0}; prop_path = IDP_New(IDP_GROUP, &group_val, __func__); - BLI_SCOPED_DEFER([&]() { IDP_FreeProperty(prop_path); }); if (!data_path.is_empty()) { IDP_AddToGroup(prop_path, IDP_NewString(data_path.c_str(), "data_path")); } @@ -1494,16 +1519,19 @@ static std::optional ui_but_event_property_operator_string(const bC /* check each until one works... */ for (int i = 0; (i < opnames_len) && (opnames[i]); i++) { - if (const std::optional str = WM_key_event_operator_string( - C, opnames[i], WM_OP_INVOKE_REGION_WIN, prop_path, false)) + if (WM_key_event_operator_string( + C, opnames[i], WM_OP_INVOKE_REGION_WIN, prop_path, false, buf, buf_maxncpy)) { - return str; + found = true; + break; } } + /* cleanup */ + IDP_FreeProperty(prop_path); } } - return std::nullopt; + return found; } /** \} */ @@ -1550,16 +1578,18 @@ const char ui_radial_dir_order[8] = { const char ui_radial_dir_to_numpad[8] = {8, 9, 6, 3, 2, 1, 4, 7}; const short ui_radial_dir_to_angle[8] = {90, 45, 0, 315, 270, 225, 180, 135}; -static std::string ui_but_pie_direction_string(const uiBut *but) +static void ui_but_pie_direction_string(uiBut *but, char *buf, int size) { BLI_assert(but->pie_dir < ARRAY_SIZE(ui_radial_dir_to_numpad)); - return fmt::to_string(int(ui_radial_dir_to_numpad[but->pie_dir])); + BLI_snprintf(buf, size, "%d", ui_radial_dir_to_numpad[but->pie_dir]); } /** \} */ static void ui_menu_block_set_keymaps(const bContext *C, uiBlock *block) { + char buf[128]; + BLI_assert(block->flag & (UI_BLOCK_LOOP | UI_BLOCK_SHOW_SHORTCUT_ALWAYS)); /* only do it before bounding */ @@ -1573,8 +1603,8 @@ static void ui_menu_block_set_keymaps(const bContext *C, uiBlock *block) if (block->flag & UI_BLOCK_RADIAL) { LISTBASE_FOREACH (uiBut *, but, &block->buttons) { if (but->pie_dir != UI_RADIAL_NONE) { - const std::string str = ui_but_pie_direction_string(but); - ui_but_add_shortcut(but, str.c_str(), false); + ui_but_pie_direction_string(but, buf, sizeof(buf)); + ui_but_add_shortcut(but, buf, false); } } } @@ -1595,13 +1625,11 @@ static void ui_menu_block_set_keymaps(const bContext *C, uiBlock *block) continue; } - if (const std::optional str = ui_but_event_operator_string(C, but)) { - ui_but_add_shortcut(but, str->c_str(), false); + if (ui_but_event_operator_string(C, but, buf, sizeof(buf))) { + ui_but_add_shortcut(but, buf, false); } - else if (const std::optional str = ui_but_event_property_operator_string(C, - but)) - { - ui_but_add_shortcut(but, str->c_str(), false); + else if (ui_but_event_property_operator_string(C, but, buf, sizeof(buf))) { + ui_but_add_shortcut(but, buf, false); } } } @@ -2246,7 +2274,7 @@ int ui_but_is_pushed_ex(uiBut *but, double *value) is_push = -1; if (view_item_but->view_item) { - is_push = view_item_but->view_item->is_active(); + is_push = UI_view_item_is_active(view_item_but->view_item); } break; } @@ -3861,7 +3889,9 @@ static void ui_but_update_ex(uiBut *but, const bool validate) kmi_dummy.alt = (hotkey_but->modifier_key & KM_ALT) ? KM_PRESS : KM_NOTHING; kmi_dummy.oskey = (hotkey_but->modifier_key & KM_OSKEY) ? KM_PRESS : KM_NOTHING; - but->drawstr = WM_keymap_item_to_string(&kmi_dummy, true).value_or(""); + char kmi_str[128]; + WM_keymap_item_to_string(&kmi_dummy, true, kmi_str, sizeof(kmi_str)); + but->drawstr = kmi_str; } else { but->drawstr = IFACE_("Press a key"); @@ -3958,9 +3988,6 @@ static uiBut *ui_but_new(const eButType type) case UI_BTYPE_PROGRESS: but = MEM_new("uiButProgress"); break; - case UI_BTYPE_SEPR_LINE: - but = MEM_new("uiButSeparatorLine"); - break; case UI_BTYPE_HSVCUBE: but = MEM_new("uiButHSVCube"); break; @@ -3979,12 +4006,6 @@ static uiBut *ui_but_new(const eButType type) case UI_BTYPE_VIEW_ITEM: but = MEM_new("uiButViewItem"); break; - case UI_BTYPE_LABEL: - but = MEM_new("uiButLabel"); - break; - case UI_BTYPE_SCROLL: - but = MEM_new("uiButScrollBar"); - break; default: but = MEM_new("uiBut"); break; @@ -4041,6 +4062,11 @@ uiBut *ui_but_change_type(uiBut *but, eButType new_type) /** * \param x, y: The lower left hand corner of the button (X axis) * \param width, height: The size of the button. + * + * for float buttons: + * \param a1: Click Step (how much to change the value each click) + * \param a2: Number of decimal point values to display. 0 defaults to 3 (0.000) + * 1,2,3, and a maximum of 4, all greater values will be clamped to 4. */ static uiBut *ui_def_but(uiBlock *block, int type, @@ -4053,10 +4079,18 @@ static uiBut *ui_def_but(uiBlock *block, void *poin, float min, float max, + float a1, + float a2, const char *tip) { BLI_assert(width >= 0 && height >= 0); + /* we could do some more error checks here */ + if ((type & BUTTYPE) == UI_BTYPE_LABEL) { + BLI_assert((poin != nullptr || min != 0.0f || max != 0.0f || (a1 == 0.0f && a2 != 0.0f) || + (a1 != 0.0f && a1 != 1.0f)) == false); + } + if (type & UI_BUT_POIN_TYPES) { /* a pointer is required */ if (poin == nullptr) { BLI_assert(0); @@ -4082,6 +4116,8 @@ static uiBut *ui_def_but(uiBlock *block, but->poin = (char *)poin; but->hardmin = but->softmin = min; but->hardmax = but->softmax = max; + but->a1 = a1; + but->a2 = a2; but->tip = tip; but->disabled_info = block->lockstr; @@ -4300,8 +4336,20 @@ static void ui_def_but_rna__menu(bContext *C, uiLayout *layout, void *but_p) if (title && title[0] && (categories == 0) && (!but->str[0] || !prior_label)) { /* Show title when no categories and calling button has no text or prior label. */ - uiDefBut( - block, UI_BTYPE_LABEL, 0, title, 0, 0, UI_UNIT_X * 5, UI_UNIT_Y, nullptr, 0.0, 0.0, ""); + uiDefBut(block, + UI_BTYPE_LABEL, + 0, + title, + 0, + 0, + UI_UNIT_X * 5, + UI_UNIT_Y, + nullptr, + 0.0, + 0.0, + 0, + 0, + ""); uiItemS(layout); } @@ -4360,6 +4408,8 @@ static void ui_def_but_rna__menu(bContext *C, uiLayout *layout, void *but_p) nullptr, 0.0, 0.0, + 0, + 0, ""); } } @@ -4387,6 +4437,8 @@ static void ui_def_but_rna__menu(bContext *C, uiLayout *layout, void *but_p) &handle->retvalue, item->value, 0.0, + 0, + -1, item->description); } else { @@ -4401,6 +4453,8 @@ static void ui_def_but_rna__menu(bContext *C, uiLayout *layout, void *but_p) &handle->retvalue, item->value, 0.0, + 0, + -1, item->description); } if (item->value == current_value) { @@ -4593,7 +4647,8 @@ static uiBut *ui_def_but_rna(uiBlock *block, } /* now create button */ - uiBut *but = ui_def_but(block, type, retval, str, x, y, width, height, nullptr, min, max, tip); + uiBut *but = ui_def_but( + block, type, retval, str, x, y, width, height, nullptr, min, max, step, precision, tip); if (but->type == UI_BTYPE_NUM) { /* Set default values, can be overridden later. */ @@ -4660,6 +4715,9 @@ static uiBut *ui_def_but_rna(uiBlock *block, uiButNumberSlider *number_but = (uiButNumberSlider *)but; number_but->step_size = ui_get_but_step_unit(but, number_but->step_size); } + else { + but->a1 = ui_get_but_step_unit(but, but->a1); + } } if (func) { @@ -4693,7 +4751,8 @@ static uiBut *ui_def_but_rna_propname(uiBlock *block, block, type, retval, str, x, y, width, height, ptr, prop, index, min, max, tip); } else { - but = ui_def_but(block, type, retval, propname, x, y, width, height, nullptr, min, max, tip); + but = ui_def_but( + block, type, retval, propname, x, y, width, height, nullptr, min, max, -1.0f, -1.0f, tip); UI_but_disable(but, N_("Unknown Property")); } @@ -4716,7 +4775,7 @@ static uiBut *ui_def_but_operator_ptr(uiBlock *block, tip = RNA_struct_ui_description(ot->srna); } - uiBut *but = ui_def_but(block, type, -1, str, x, y, width, height, nullptr, 0, 0, tip); + uiBut *but = ui_def_but(block, type, -1, str, x, y, width, height, nullptr, 0, 0, 0, 0, tip); but->optype = ot; but->opcontext = opcontext; but->flag &= ~UI_BUT_UNDO; /* no need for ui_but_is_rna_undo(), we never need undo here */ @@ -4744,9 +4803,12 @@ uiBut *uiDefBut(uiBlock *block, void *poin, float min, float max, + float a1, + float a2, const char *tip) { - uiBut *but = ui_def_but(block, type, retval, str, x, y, width, height, poin, min, max, tip); + uiBut *but = ui_def_but( + block, type, retval, str, x, y, width, height, poin, min, max, a1, a2, tip); ui_but_update(but); @@ -4756,7 +4818,8 @@ uiBut *uiDefBut(uiBlock *block, uiBut *uiDefButImage( uiBlock *block, void *imbuf, int x, int y, short width, short height, const uchar color[4]) { - uiBut *but = ui_def_but(block, UI_BTYPE_IMAGE, 0, "", x, y, width, height, imbuf, 0, 0, ""); + uiBut *but = ui_def_but( + block, UI_BTYPE_IMAGE, 0, "", x, y, width, height, imbuf, 0, 0, 0, 0, ""); if (color) { copy_v4_v4_uchar(but->col, color); } @@ -4943,6 +5006,8 @@ static uiBut *uiDefButBit(uiBlock *block, void *poin, float min, float max, + float a1, + float a2, const char *tip) { const int bitIdx = findBitIndex(bit); @@ -4960,6 +5025,8 @@ static uiBut *uiDefButBit(uiBlock *block, poin, min, max, + a1, + a2, tip); } uiBut *uiDefButF(uiBlock *block, @@ -4986,6 +5053,8 @@ uiBut *uiDefButF(uiBlock *block, (void *)poin, min, max, + 0.0f, + 0.0f, tip); } uiBut *uiDefButI(uiBlock *block, @@ -4999,6 +5068,8 @@ uiBut *uiDefButI(uiBlock *block, int *poin, float min, float max, + float a1, + float a2, const char *tip) { return uiDefBut(block, @@ -5012,6 +5083,8 @@ uiBut *uiDefButI(uiBlock *block, (void *)poin, min, max, + a1, + a2, tip); } uiBut *uiDefButBitI(uiBlock *block, @@ -5040,6 +5113,8 @@ uiBut *uiDefButBitI(uiBlock *block, (void *)poin, min, max, + 0.0f, + 0.0f, tip); } uiBut *uiDefButS(uiBlock *block, @@ -5053,6 +5128,8 @@ uiBut *uiDefButS(uiBlock *block, short *poin, float min, float max, + float a1, + float a2, const char *tip) { return uiDefBut(block, @@ -5066,6 +5143,8 @@ uiBut *uiDefButS(uiBlock *block, (void *)poin, min, max, + a1, + a2, tip); } uiBut *uiDefButBitS(uiBlock *block, @@ -5094,6 +5173,8 @@ uiBut *uiDefButBitS(uiBlock *block, (void *)poin, min, max, + 0.0f, + 0.0f, tip); } uiBut *uiDefButC(uiBlock *block, @@ -5120,6 +5201,8 @@ uiBut *uiDefButC(uiBlock *block, (void *)poin, min, max, + 0.0f, + 0.0f, tip); } uiBut *uiDefButBitC(uiBlock *block, @@ -5148,6 +5231,8 @@ uiBut *uiDefButBitC(uiBlock *block, (void *)poin, min, max, + 0, + 0, tip); } uiBut *uiDefButR(uiBlock *block, @@ -5235,9 +5320,12 @@ uiBut *uiDefIconBut(uiBlock *block, void *poin, float min, float max, + float a1, + float a2, const char *tip) { - uiBut *but = ui_def_but(block, type, retval, "", x, y, width, height, poin, min, max, tip); + uiBut *but = ui_def_but( + block, type, retval, "", x, y, width, height, poin, min, max, a1, a2, tip); ui_but_update_and_icon_set(but, icon); return but; } @@ -5253,6 +5341,8 @@ static uiBut *uiDefIconButBit(uiBlock *block, void *poin, float min, float max, + float a1, + float a2, const char *tip) { const int bitIdx = findBitIndex(bit); @@ -5270,6 +5360,8 @@ static uiBut *uiDefIconButBit(uiBlock *block, poin, min, max, + a1, + a2, tip); } @@ -5284,6 +5376,8 @@ uiBut *uiDefIconButI(uiBlock *block, int *poin, float min, float max, + float a1, + float a2, const char *tip) { return uiDefIconBut(block, @@ -5297,6 +5391,8 @@ uiBut *uiDefIconButI(uiBlock *block, (void *)poin, min, max, + a1, + a2, tip); } uiBut *uiDefIconButBitI(uiBlock *block, @@ -5311,6 +5407,8 @@ uiBut *uiDefIconButBitI(uiBlock *block, int *poin, float min, float max, + float a1, + float a2, const char *tip) { return uiDefIconButBit(block, @@ -5325,6 +5423,8 @@ uiBut *uiDefIconButBitI(uiBlock *block, (void *)poin, min, max, + a1, + a2, tip); } uiBut *uiDefIconButS(uiBlock *block, @@ -5338,6 +5438,8 @@ uiBut *uiDefIconButS(uiBlock *block, short *poin, float min, float max, + float a1, + float a2, const char *tip) { return uiDefIconBut(block, @@ -5351,6 +5453,8 @@ uiBut *uiDefIconButS(uiBlock *block, (void *)poin, min, max, + a1, + a2, tip); } uiBut *uiDefIconButBitS(uiBlock *block, @@ -5365,6 +5469,8 @@ uiBut *uiDefIconButBitS(uiBlock *block, short *poin, float min, float max, + float a1, + float a2, const char *tip) { return uiDefIconButBit(block, @@ -5379,6 +5485,8 @@ uiBut *uiDefIconButBitS(uiBlock *block, (void *)poin, min, max, + a1, + a2, tip); } uiBut *uiDefIconButBitC(uiBlock *block, @@ -5393,6 +5501,8 @@ uiBut *uiDefIconButBitC(uiBlock *block, char *poin, float min, float max, + float a1, + float a2, const char *tip) { return uiDefIconButBit(block, @@ -5407,6 +5517,8 @@ uiBut *uiDefIconButBitC(uiBlock *block, (void *)poin, min, max, + a1, + a2, tip); } uiBut *uiDefIconButR(uiBlock *block, @@ -5492,13 +5604,48 @@ uiBut *uiDefIconTextBut(uiBlock *block, void *poin, float min, float max, + float a1, + float a2, const char *tip) { - uiBut *but = ui_def_but(block, type, retval, str, x, y, width, height, poin, min, max, tip); + uiBut *but = ui_def_but( + block, type, retval, str, x, y, width, height, poin, min, max, a1, a2, tip); ui_but_update_and_icon_set(but, icon); but->drawflag |= UI_BUT_ICON_LEFT; return but; } +uiBut *uiDefIconTextButF(uiBlock *block, + int type, + int retval, + int icon, + const StringRef str, + int x, + int y, + short width, + short height, + float *poin, + float min, + float max, + float a1, + float a2, + const char *tip) +{ + return uiDefIconTextBut(block, + type | UI_BUT_POIN_FLOAT, + retval, + icon, + str, + x, + y, + width, + height, + (void *)poin, + min, + max, + a1, + a2, + tip); +} uiBut *uiDefIconTextButI(uiBlock *block, int type, int retval, @@ -5511,6 +5658,8 @@ uiBut *uiDefIconTextButI(uiBlock *block, int *poin, float min, float max, + float a1, + float a2, const char *tip) { return uiDefIconTextBut(block, @@ -5525,6 +5674,8 @@ uiBut *uiDefIconTextButI(uiBlock *block, (void *)poin, min, max, + a1, + a2, tip); } uiBut *uiDefIconTextButR(uiBlock *block, @@ -5786,6 +5937,12 @@ void UI_block_func_handle_set(uiBlock *block, uiBlockHandleFunc func, void *arg) block->handle_func_arg = arg; } +void UI_block_func_butmenu_set(uiBlock *block, uiMenuHandleFunc func, void *arg) +{ + block->butm_func = func; + block->butm_func_arg = arg; +} + void UI_block_func_set(uiBlock *block, uiButHandleFunc func, void *arg1, void *arg2) { block->func = func; @@ -5900,7 +6057,8 @@ uiBut *uiDefBlockBut(uiBlock *block, short height, const char *tip) { - uiBut *but = ui_def_but(block, UI_BTYPE_BLOCK, 0, str, x, y, width, height, arg, 0.0, 0.0, tip); + uiBut *but = ui_def_but( + block, UI_BTYPE_BLOCK, 0, str, x, y, width, height, arg, 0.0, 0.0, 0.0, 0.0, tip); but->block_create_func = func; ui_but_update(but); return but; @@ -5917,7 +6075,7 @@ uiBut *uiDefBlockButN(uiBlock *block, const char *tip) { uiBut *but = ui_def_but( - block, UI_BTYPE_BLOCK, 0, str, x, y, width, height, nullptr, 0.0, 0.0, tip); + block, UI_BTYPE_BLOCK, 0, str, x, y, width, height, nullptr, 0.0, 0.0, 0.0, 0.0, tip); but->block_create_func = func; if (but->func_argN) { MEM_freeN(but->func_argN); @@ -5938,7 +6096,7 @@ uiBut *uiDefMenuBut(uiBlock *block, const char *tip) { uiBut *but = ui_def_but( - block, UI_BTYPE_PULLDOWN, 0, str, x, y, width, height, arg, 0.0, 0.0, tip); + block, UI_BTYPE_PULLDOWN, 0, str, x, y, width, height, arg, 0.0, 0.0, 0.0, 0.0, tip); but->menu_create_func = func; ui_but_update(but); return but; @@ -5956,7 +6114,7 @@ uiBut *uiDefIconTextMenuBut(uiBlock *block, const char *tip) { uiBut *but = ui_def_but( - block, UI_BTYPE_PULLDOWN, 0, str, x, y, width, height, arg, 0.0, 0.0, tip); + block, UI_BTYPE_PULLDOWN, 0, str, x, y, width, height, arg, 0.0, 0.0, 0.0, 0.0, tip); ui_def_but_icon(but, icon, UI_HAS_ICON); @@ -5980,7 +6138,7 @@ uiBut *uiDefIconMenuBut(uiBlock *block, const char *tip) { uiBut *but = ui_def_but( - block, UI_BTYPE_PULLDOWN, 0, "", x, y, width, height, arg, 0.0, 0.0, tip); + block, UI_BTYPE_PULLDOWN, 0, "", x, y, width, height, arg, 0.0, 0.0, 0.0, 0.0, tip); ui_def_but_icon(but, icon, UI_HAS_ICON); but->drawflag &= ~UI_BUT_ICON_LEFT; @@ -6003,7 +6161,7 @@ uiBut *uiDefIconBlockBut(uiBlock *block, const char *tip) { uiBut *but = ui_def_but( - block, UI_BTYPE_BLOCK, retval, "", x, y, width, height, arg, 0.0, 0.0, tip); + block, UI_BTYPE_BLOCK, retval, "", x, y, width, height, arg, 0.0, 0.0, 0.0, 0.0, tip); ui_def_but_icon(but, icon, UI_HAS_ICON); @@ -6024,10 +6182,24 @@ uiBut *uiDefSearchBut(uiBlock *block, int y, short width, short height, + float a1, + float a2, const char *tip) { - uiBut *but = ui_def_but( - block, UI_BTYPE_SEARCH_MENU, retval, "", x, y, width, height, arg, 0.0, maxncpy, tip); + uiBut *but = ui_def_but(block, + UI_BTYPE_SEARCH_MENU, + retval, + "", + x, + y, + width, + height, + arg, + 0.0, + maxncpy, + a1, + a2, + tip); ui_def_but_icon(but, icon, UI_HAS_ICON); @@ -6212,9 +6384,11 @@ uiBut *uiDefSearchButO_ptr(uiBlock *block, int y, short width, short height, + float a1, + float a2, const char *tip) { - uiBut *but = uiDefSearchBut(block, arg, retval, icon, maxncpy, x, y, width, height, tip); + uiBut *but = uiDefSearchBut(block, arg, retval, icon, maxncpy, x, y, width, height, a1, a2, tip); UI_but_func_search_set(but, ui_searchbox_create_generic, operator_enum_search_update_fn, @@ -6291,21 +6465,6 @@ void UI_but_number_slider_precision_set(uiBut *but, float precision) BLI_assert(precision > -2); } -void UI_but_label_alpha_factor_set(uiBut *but, const float alpha_factor) -{ - uiButLabel *but_label = reinterpret_cast(but); - BLI_assert(but->type == UI_BTYPE_LABEL); - but_label->alpha_factor = alpha_factor; -} - -void UI_but_search_preview_grid_size_set(uiBut *but, int rows, int cols) -{ - BLI_assert(but->type == UI_BTYPE_SEARCH_MENU); - uiButSearch *but_search = reinterpret_cast(but); - but_search->preview_rows = rows; - but_search->preview_cols = cols; -} - void UI_but_focus_on_enter_event(wmWindow *win, uiBut *but) { wmEvent event; @@ -6509,12 +6668,20 @@ std::string UI_but_string_get_rna_tooltip(bContext &C, uiBut &but) std::string UI_but_string_get_operator_keymap(bContext &C, uiBut &but) { - return ui_but_event_operator_string(&C, &but).value_or(""); + char buf[128]; + if (!ui_but_event_operator_string(&C, &but, buf, sizeof(buf))) { + return {}; + } + return buf; } std::string UI_but_string_get_property_keymap(bContext &C, uiBut &but) { - return ui_but_event_property_operator_string(&C, &but).value_or(""); + char buf[128]; + if (!ui_but_event_property_operator_string(&C, &but, buf, sizeof(buf))) { + return {}; + } + return buf; } std::string UI_but_extra_icon_string_get_label(const uiButExtraOpIcon &extra_icon) @@ -6534,7 +6701,11 @@ std::string UI_but_extra_icon_string_get_tooltip(bContext &C, const uiButExtraOp std::string UI_but_extra_icon_string_get_operator_keymap(const bContext &C, const uiButExtraOpIcon &extra_icon) { - return ui_but_extra_icon_event_operator_string(&C, &extra_icon).value_or(""); + char buf[128]; + if (!ui_but_extra_icon_event_operator_string(&C, &extra_icon, buf, sizeof(buf))) { + return {}; + } + return buf; } /* Program Init/Exit */ diff --git a/source/blender/editors/interface/interface_anim.cc b/source/blender/editors/interface/interface_anim.cc index c3de1bf8456..1c8eb8b0fb7 100644 --- a/source/blender/editors/interface/interface_anim.cc +++ b/source/blender/editors/interface/interface_anim.cc @@ -13,6 +13,7 @@ #include "MEM_guardedalloc.h" #include "DNA_anim_types.h" +#include "DNA_scene_types.h" #include "DNA_screen_types.h" #include "BLI_listbase.h" @@ -22,11 +23,13 @@ #include "BKE_animsys.h" #include "BKE_context.hh" -#include "BKE_fcurve.hh" +#include "BKE_fcurve.h" #include "BKE_fcurve_driver.h" -#include "BKE_global.hh" +#include "BKE_global.h" +#include "BKE_main.hh" #include "BKE_nla.h" +#include "DEG_depsgraph.hh" #include "DEG_depsgraph_build.hh" #include "ED_keyframing.hh" diff --git a/source/blender/editors/interface/interface_button_group.cc b/source/blender/editors/interface/interface_button_group.cc index e0c55808d0e..79c44240e02 100644 --- a/source/blender/editors/interface/interface_button_group.cc +++ b/source/blender/editors/interface/interface_button_group.cc @@ -6,6 +6,8 @@ * \ingroup edinterface */ +#include "BLI_listbase.h" + #include "MEM_guardedalloc.h" #include "interface_intern.hh" diff --git a/source/blender/editors/interface/interface_context_menu.cc b/source/blender/editors/interface/interface_context_menu.cc index fe0fc1b73c8..eac0fb63619 100644 --- a/source/blender/editors/interface/interface_context_menu.cc +++ b/source/blender/editors/interface/interface_context_menu.cc @@ -20,7 +20,7 @@ #include "BLI_string.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_addon.h" #include "BKE_context.hh" @@ -31,7 +31,6 @@ #include "ED_keyframing.hh" #include "ED_screen.hh" -#include "UI_abstract_view.hh" #include "UI_interface.hh" #include "interface_intern.hh" @@ -137,6 +136,7 @@ static void shortcut_free_operator_property(IDProperty *prop) static void but_shortcut_name_func(bContext *C, void *arg1, int /*event*/) { uiBut *but = (uiBut *)arg1; + char shortcut_str[128]; IDProperty *prop; const char *idname = shortcut_get_operator_property(C, but, &prop); @@ -145,10 +145,10 @@ static void but_shortcut_name_func(bContext *C, void *arg1, int /*event*/) } /* complex code to change name of button */ - if (std::optional shortcut_str = WM_key_event_operator_string( - C, idname, but->opcontext, prop, true)) + if (WM_key_event_operator_string( + C, idname, but->opcontext, prop, true, shortcut_str, sizeof(shortcut_str))) { - ui_but_add_shortcut(but, shortcut_str->c_str(), true); + ui_but_add_shortcut(but, shortcut_str, true); } else { /* simply strip the shortcut */ @@ -1026,7 +1026,7 @@ bool ui_popup_context_menu_for_button(bContext *C, uiBut *but, const wmEvent *ev /* Sub-layout for context override. */ uiLayout *sub = uiLayoutColumn(layout, false); set_layout_context_from_button(C, sub, view_item_but); - view_item_but->view_item->build_context_menu(*C, *sub); + UI_view_item_context_menu_build(C, view_item_but->view_item, sub); /* Reset context. */ CTX_store_set(C, prev_ctx); @@ -1108,6 +1108,8 @@ bool ui_popup_context_menu_for_button(bContext *C, uiBut *but, const wmEvent *ev nullptr, 0, 0, + 0, + 0, ""); item_found = true; UI_but_func_set(but2, [um, umi](bContext &) { @@ -1134,6 +1136,8 @@ bool ui_popup_context_menu_for_button(bContext *C, uiBut *but, const wmEvent *ev nullptr, 0, 0, + 0, + 0, "Add to a user defined context menu (stored in the user preferences)"); UI_but_func_set(but2, [but](bContext &C) { bUserMenu *um = ED_screen_user_menu_ensure(&C); @@ -1185,6 +1189,8 @@ bool ui_popup_context_menu_for_button(bContext *C, uiBut *but, const wmEvent *ev nullptr, 0, 0, + 0, + 0, ""); UI_but_func_set(but2, [but](bContext &C) { UI_popup_block_invoke(&C, menu_change_shortcut, but, nullptr); @@ -1203,6 +1209,8 @@ bool ui_popup_context_menu_for_button(bContext *C, uiBut *but, const wmEvent *ev nullptr, 0, 0, + 0, + 0, TIP_("Only keyboard shortcuts can be edited that way, " "please use User Preferences otherwise")); UI_but_flag_enable(but2, UI_BUT_DISABLED); @@ -1221,6 +1229,8 @@ bool ui_popup_context_menu_for_button(bContext *C, uiBut *but, const wmEvent *ev nullptr, 0, 0, + 0, + 0, ""); UI_but_func_set(but2, [but](bContext &C) { remove_shortcut_func(&C, but); }); } @@ -1239,6 +1249,8 @@ bool ui_popup_context_menu_for_button(bContext *C, uiBut *but, const wmEvent *ev nullptr, 0, 0, + 0, + 0, ""); UI_but_func_set(but2, [but](bContext &C) { UI_popup_block_ex(&C, menu_add_shortcut, nullptr, menu_add_shortcut_cancel, but, nullptr); @@ -1254,7 +1266,9 @@ bool ui_popup_context_menu_for_button(bContext *C, uiBut *but, const wmEvent *ev } { /* Docs */ - if (std::optional manual_id = UI_but_online_manual_id(but)) { + char buf[512]; + + if (UI_but_online_manual_id(but, buf, sizeof(buf))) { PointerRNA ptr_props; uiItemO(layout, CTX_IFACE_(BLT_I18NCONTEXT_OPERATOR_DEFAULT, "Online Manual"), @@ -1270,7 +1284,7 @@ bool ui_popup_context_menu_for_button(bContext *C, uiBut *but, const wmEvent *ev WM_OP_EXEC_DEFAULT, UI_ITEM_NONE, &ptr_props); - RNA_string_set(&ptr_props, "doc_id", manual_id.value().c_str()); + RNA_string_set(&ptr_props, "doc_id", buf); } } } diff --git a/source/blender/editors/interface/interface_context_path.cc b/source/blender/editors/interface/interface_context_path.cc index 3238b0fdb9a..5d319284db9 100644 --- a/source/blender/editors/interface/interface_context_path.cc +++ b/source/blender/editors/interface/interface_context_path.cc @@ -8,13 +8,19 @@ #include "BLI_vector.hh" +#include "BKE_screen.hh" + #include "RNA_access.hh" +#include "ED_screen.hh" + #include "UI_interface.hh" #include "UI_resources.hh" #include "RNA_prototypes.h" +#include "WM_api.hh" + namespace blender::ui { void context_path_add_generic(Vector &path, diff --git a/source/blender/editors/interface/interface_drag.cc b/source/blender/editors/interface/interface_drag.cc index 425cc49163c..10800a2b34d 100644 --- a/source/blender/editors/interface/interface_drag.cc +++ b/source/blender/editors/interface/interface_drag.cc @@ -78,6 +78,11 @@ void UI_but_drag_set_name(uiBut *but, const char *name) but->dragpoin = (void *)name; } +void UI_but_drag_set_value(uiBut *but) +{ + but->dragtype = WM_DRAG_VALUE; +} + void UI_but_drag_set_image(uiBut *but, const char *path, int icon, const ImBuf *imb, float scale) { ui_def_but_icon(but, icon, 0); /* no flag UI_HAS_ICON, so icon doesn't draw in button */ @@ -103,6 +108,7 @@ void ui_but_drag_start(bContext *C, uiBut *but) but->icon, but->dragtype, but->dragpoin, + ui_but_value_get(but), (but->dragflag & UI_BUT_DRAGPOIN_FREE) ? WM_DRAG_FREE_DATA : WM_DRAG_NOP); /* wmDrag has ownership over dragpoin now, stop messing with it. */ @@ -117,6 +123,6 @@ void ui_but_drag_start(bContext *C, uiBut *but) /* Special feature for assets: We add another drag item that supports multiple assets. It * gets the assets from context. */ if (ELEM(but->dragtype, WM_DRAG_ASSET, WM_DRAG_ID)) { - WM_event_start_drag(C, ICON_NONE, WM_DRAG_ASSET_LIST, nullptr, WM_DRAG_NOP); + WM_event_start_drag(C, ICON_NONE, WM_DRAG_ASSET_LIST, nullptr, 0, WM_DRAG_NOP); } } diff --git a/source/blender/editors/interface/interface_draw.cc b/source/blender/editors/interface/interface_draw.cc index 864d4e1bde0..8682723c1e3 100644 --- a/source/blender/editors/interface/interface_draw.cc +++ b/source/blender/editors/interface/interface_draw.cc @@ -26,6 +26,7 @@ #include "BKE_colorband.hh" #include "BKE_colortools.hh" #include "BKE_curveprofile.h" +#include "BKE_node.hh" #include "BKE_tracking.h" #include "IMB_colormanagement.hh" @@ -38,6 +39,7 @@ #include "GPU_batch.h" #include "GPU_batch_presets.h" +#include "GPU_context.h" #include "GPU_immediate.h" #include "GPU_immediate_util.h" #include "GPU_matrix.h" diff --git a/source/blender/editors/interface/interface_drop.cc b/source/blender/editors/interface/interface_drop.cc index b1d9fce9fdc..4d539fb4b13 100644 --- a/source/blender/editors/interface/interface_drop.cc +++ b/source/blender/editors/interface/interface_drop.cc @@ -8,6 +8,8 @@ #include "UI_interface.hh" +#include "BLI_string.h" + namespace blender::ui { DragInfo::DragInfo(const wmDrag &drag, const wmEvent &event, const DropLocation drop_location) diff --git a/source/blender/editors/interface/interface_dropboxes.cc b/source/blender/editors/interface/interface_dropboxes.cc index 9eeacfe27fd..d43522cb392 100644 --- a/source/blender/editors/interface/interface_dropboxes.cc +++ b/source/blender/editors/interface/interface_dropboxes.cc @@ -10,7 +10,8 @@ #include "BKE_context.hh" -#include "BLT_translation.hh" +#include "BLI_string.h" +#include "BLT_translation.h" #include "DNA_material_types.h" #include "DNA_space_types.h" diff --git a/source/blender/editors/interface/interface_handlers.cc b/source/blender/editors/interface/interface_handlers.cc index b5e98d73d6d..493c73479c1 100644 --- a/source/blender/editors/interface/interface_handlers.cc +++ b/source/blender/editors/interface/interface_handlers.cc @@ -42,7 +42,7 @@ #include "BKE_curveprofile.h" #include "BKE_movieclip.h" #include "BKE_paint.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "BKE_screen.hh" #include "BKE_tracking.h" #include "BKE_unit.hh" @@ -56,6 +56,7 @@ #include "UI_interface.hh" #include "UI_string_search.hh" +#include "UI_view2d.hh" #include "BLF_api.hh" @@ -69,6 +70,8 @@ #include "wm_event_system.hh" #ifdef WITH_INPUT_IME +# include "BLT_lang.h" +# include "BLT_translation.h" # include "wm_window.hh" #endif @@ -414,6 +417,8 @@ struct uiHandleButtonData { /* coords are Window/uiBlock relative (depends on the button) */ int draglastx, draglasty; int dragstartx, dragstarty; + int draglastvalue; + int dragstartvalue; bool dragchange, draglock; int dragsel; float dragf, dragfstart; @@ -433,6 +438,7 @@ struct uiHandleButtonData { /* Menu open, see: #UI_screen_free_active_but_highlight. */ uiPopupBlockHandle *menu; + int menuretval; /* Search box see: #UI_screen_free_active_but_highlight. */ ARegion *searchbox; @@ -479,6 +485,10 @@ struct uiAfterFunc { void *handle_func_arg; int retval; + uiMenuHandleFunc butm_func; + void *butm_func_arg; + int a2; + wmOperator *popup_op; wmOperatorType *optype; wmOperatorCallContext opcontext; @@ -806,7 +816,9 @@ static void popup_check(bContext *C, wmOperator *op) static bool ui_afterfunc_check(const uiBlock *block, const uiBut *but) { return (but->func || but->apply_func || but->funcN || but->rename_func || but->optype || - but->rnaprop || block->handle_func || (block->handle && block->handle->popup_op)); + but->rnaprop || block->handle_func || + (but->type == UI_BTYPE_BUT_MENU && block->butm_func) || + (block->handle && block->handle->popup_op)); } /** @@ -847,6 +859,12 @@ static void ui_apply_but_func(bContext *C, uiBut *but) after->handle_func_arg = block->handle_func_arg; after->retval = but->retval; + if (but->type == UI_BTYPE_BUT_MENU) { + after->butm_func = block->butm_func; + after->butm_func_arg = block->butm_func_arg; + after->a2 = but->a2; + } + if (block->handle) { after->popup_op = block->handle->popup_op; } @@ -1055,6 +1073,9 @@ static void ui_apply_but_funcs_after(bContext *C) if (after.handle_func) { after.handle_func(C, after.handle_func_arg, after.retval); } + if (after.butm_func) { + after.butm_func(C, after.butm_func_arg, after.a2); + } if (after.rename_func) { after.rename_func(C, after.rename_arg1, static_cast(after.rename_orig)); @@ -2156,7 +2177,7 @@ static bool ui_but_drag_init(bContext *C, } if (valid) { - WM_event_start_drag(C, ICON_COLOR, WM_DRAG_COLOR, drag_info, WM_DRAG_FREE_DATA); + WM_event_start_drag(C, ICON_COLOR, WM_DRAG_COLOR, drag_info, 0.0, WM_DRAG_FREE_DATA); } else { MEM_freeN(drag_info); @@ -2166,7 +2187,7 @@ static bool ui_but_drag_init(bContext *C, else if (but->type == UI_BTYPE_VIEW_ITEM) { const uiButViewItem *view_item_but = (uiButViewItem *)but; if (view_item_but->view_item) { - return UI_view_item_drag_start(*C, *view_item_but->view_item); + return UI_view_item_drag_start(C, view_item_but->view_item); } } else { @@ -4379,7 +4400,7 @@ static void ui_block_open_end(bContext *C, uiBut *but, uiHandleButtonData *data) but->editval = nullptr; but->editvec = nullptr; - but->block->auto_open_last = BLI_time_now_seconds(); + but->block->auto_open_last = BLI_check_seconds_timer(); } if (data->menu) { @@ -4879,7 +4900,7 @@ static int ui_do_but_VIEW_ITEM(bContext *C, return WM_UI_HANDLER_BREAK; } - if (UI_view_item_supports_drag(*view_item_but->view_item)) { + if (UI_view_item_supports_drag(view_item_but->view_item)) { button_activate_state(C, but, BUTTON_STATE_WAIT_DRAG); data->dragstartx = event->xy[0]; data->dragstarty = event->xy[1]; @@ -4891,7 +4912,7 @@ static int ui_do_but_VIEW_ITEM(bContext *C, return WM_UI_HANDLER_CONTINUE; case KM_DBL_CLICK: data->cancel = true; - UI_view_item_begin_rename(*view_item_but->view_item); + UI_view_item_begin_rename(view_item_but->view_item); ED_region_tag_redraw(CTX_wm_region(C)); return WM_UI_HANDLER_BREAK; } @@ -5440,11 +5461,6 @@ static int ui_do_but_NUM( else if (ELEM(event->type, EVT_PADENTER, EVT_RETKEY) && event->val == KM_PRESS) { click = 1; } - else if (event->type == EVT_BUT_OPEN) { - /* Handle UI_but_focus_on_enter_event. */ - button_activate_state(C, but, BUTTON_STATE_TEXT_EDITING); - retval = WM_UI_HANDLER_BREAK; - } else if (event->type == EVT_MINUSKEY && event->val == KM_PRESS) { button_activate_state(C, but, BUTTON_STATE_NUM_EDITING); data->value = -data->value; @@ -8636,7 +8652,7 @@ static void button_activate_init(bContext *C, * want to allow auto opening adjacent menus even if no button is activated * in between going over to the other button, but only for a short while */ if (type == BUTTON_ACTIVATE_OVER && but->block->auto_open == true) { - if (but->block->auto_open_last + BUTTON_AUTO_OPEN_THRESH < BLI_time_now_seconds()) { + if (but->block->auto_open_last + BUTTON_AUTO_OPEN_THRESH < BLI_check_seconds_timer()) { but->block->auto_open = false; } } @@ -8682,7 +8698,7 @@ static void button_activate_init(bContext *C, if (UI_but_has_tooltip_label(but)) { /* Show a label for this button. */ bScreen *screen = WM_window_get_active_screen(data->window); - if ((BLI_time_now_seconds() - WM_tooltip_time_closed()) < 0.1) { + if ((BLI_check_seconds_timer() - WM_tooltip_time_closed()) < 0.1) { WM_tooltip_immediate_init(C, CTX_wm_window(C), data->area, region, ui_but_tooltip_init); if (screen->tool_tip) { screen->tool_tip->pass = 1; @@ -9963,7 +9979,7 @@ static void ui_mouse_motion_towards_init_ex(uiPopupBlockHandle *menu, menu->towardstime = DBL_MAX; /* unlimited time */ } else { - menu->towardstime = BLI_time_now_seconds(); + menu->towardstime = BLI_check_seconds_timer(); } } } @@ -10043,7 +10059,7 @@ static bool ui_mouse_motion_towards_check(uiBlock *block, } /* 1 second timer */ - if (BLI_time_now_seconds() - menu->towardstime > BUTTON_MOUSE_TOWARDS_THRESH) { + if (BLI_check_seconds_timer() - menu->towardstime > BUTTON_MOUSE_TOWARDS_THRESH) { menu->dotowards = false; } diff --git a/source/blender/editors/interface/interface_icons.cc b/source/blender/editors/interface/interface_icons.cc index 64cad98d53b..7b1fd247e1b 100644 --- a/source/blender/editors/interface/interface_icons.cc +++ b/source/blender/editors/interface/interface_icons.cc @@ -42,7 +42,7 @@ #include "BKE_appdir.hh" #include "BKE_context.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_icons.h" #include "BKE_paint.hh" #include "BKE_preview_image.hh" @@ -2392,8 +2392,6 @@ int UI_icon_from_idcode(const int idcode) switch ((ID_Type)idcode) { case ID_AC: return ICON_ACTION; - case ID_AN: - return ICON_ACTION; /* TODO: give Animation its own icon. */ case ID_AR: return ICON_ARMATURE_DATA; case ID_BR: diff --git a/source/blender/editors/interface/interface_icons_event.cc b/source/blender/editors/interface/interface_icons_event.cc index 90769a8cf2c..99d4611d53f 100644 --- a/source/blender/editors/interface/interface_icons_event.cc +++ b/source/blender/editors/interface/interface_icons_event.cc @@ -11,6 +11,7 @@ * Event codes are used as identifiers. */ +#include "GPU_batch.h" #include "GPU_state.h" #include "BLI_string.h" diff --git a/source/blender/editors/interface/interface_intern.hh b/source/blender/editors/interface/interface_intern.hh index 72f9ee05eb7..914b6a51a86 100644 --- a/source/blender/editors/interface/interface_intern.hh +++ b/source/blender/editors/interface/interface_intern.hh @@ -190,6 +190,25 @@ struct uiBut { char *poin = nullptr; float hardmin = 0, hardmax = 0, softmin = 0, softmax = 0; + /* both these values use depends on the button type + * (polymorphic struct or union would be nicer for this stuff) */ + + /** + * For #uiBut.type: + * - UI_BTYPE_LABEL: Use `(a1 == 1.0f)` to use a2 as a blending factor (imaginative!). + * - UI_BTYPE_SCROLL: Use as scroll size. + * - UI_BTYPE_SEARCH_MENU: Use as number or rows. + */ + float a1 = 0; + + /** + * For #uiBut.type: + * - UI_BTYPE_HSVCIRCLE: Use to store the luminosity. + * - UI_BTYPE_LABEL: If `(a1 == 1.0f)` use a2 as a blending factor. + * - UI_BTYPE_SEARCH_MENU: Use as number or columns. + */ + float a2 = 0; + uchar col[4] = {0}; /** See \ref UI_but_func_identity_compare_set(). */ @@ -343,9 +362,6 @@ struct uiButSearch : public uiBut { PointerRNA rnasearchpoin = {}; PropertyRNA *rnasearchprop = nullptr; - int preview_rows = 0; - int preview_cols = 0; - /** * The search box only provides suggestions, it does not force * the string to match one of the search items when applying. @@ -355,7 +371,7 @@ struct uiButSearch : public uiBut { /** * Derived struct for #UI_BTYPE_DECORATOR - * Decorators have their own RNA data, using the normal #uiBut RNA members has many side-effects. + * Decorators have own RNA data, using the normal #uiBut RNA members has many side-effects. */ struct uiButDecorator : public uiBut { struct PointerRNA decorated_rnapoin = {}; @@ -371,25 +387,9 @@ struct uiButProgress : public uiBut { eButProgressType progress_type = UI_BUT_PROGRESS_TYPE_BAR; }; -/** Derived struct for #UI_BTYPE_SEPR_LINE. */ -struct uiButSeparatorLine : public uiBut { - bool is_vertical; -}; - -/** Derived struct for #UI_BTYPE_LABEL. */ -struct uiButLabel : public uiBut { - float alpha_factor = 1.0f; -}; - -/** Derived struct for #UI_BTYPE_SCROLL. */ -struct uiButScrollBar : public uiBut { - /** Actual visual height of UI list (in rows). */ - float visual_height = -1.0f; -}; - struct uiButViewItem : public uiBut { - /* The view item this button was created for. */ - blender::ui::AbstractViewItem *view_item = nullptr; + /* C-Handle to the view item this button was created for. */ + uiViewItemHandle *view_item = nullptr; /* Some items want to have a fixed size for drawing, differing from the interaction rectangle * (e.g. so highlights are drawn smaller). */ int draw_width = 0; @@ -554,6 +554,9 @@ struct uiBlock { uiButHandleNFunc funcN; void *func_argN; + uiMenuHandleFunc butm_func; + void *butm_func_arg; + uiBlockHandleFunc handle_func; void *handle_func_arg; @@ -1538,16 +1541,15 @@ void ui_block_free_views(uiBlock *block); void ui_block_views_bounds_calc(const uiBlock *block); void ui_block_views_listen(const uiBlock *block, const wmRegionListenerParams *listener_params); void ui_block_views_draw_overlays(const ARegion *region, const uiBlock *block); -blender::ui::AbstractView *ui_block_view_find_matching_in_old_block( - const uiBlock &new_block, const blender::ui::AbstractView &new_view); +uiViewHandle *ui_block_view_find_matching_in_old_block(const uiBlock *new_block, + const uiViewHandle *new_view); uiButViewItem *ui_block_view_find_matching_view_item_but_in_old_block( - const uiBlock &new_block, const blender::ui::AbstractViewItem &new_item); + const uiBlock *new_block, const uiViewItemHandle *new_item_handle); /* abstract_view_item.cc */ -void ui_view_item_swap_button_pointers(blender::ui::AbstractViewItem &a, - blender::ui::AbstractViewItem &b); +void ui_view_item_swap_button_pointers(uiViewItemHandle *a_handle, uiViewItemHandle *b_handle); /* interface_templates.cc */ diff --git a/source/blender/editors/interface/interface_layout.cc b/source/blender/editors/interface/interface_layout.cc index 424cc6f8c4e..6300cf1d6f8 100644 --- a/source/blender/editors/interface/interface_layout.cc +++ b/source/blender/editors/interface/interface_layout.cc @@ -27,10 +27,12 @@ #include "BLI_string.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" +#include "BKE_anim_data.h" +#include "BKE_armature.hh" #include "BKE_context.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_idprop.h" #include "BKE_screen.hh" @@ -555,7 +557,7 @@ static void ui_item_array(uiLayout *layout, /* create label */ if (name[0] && show_text) { - uiDefBut(block, UI_BTYPE_LABEL, 0, name, 0, 0, w, UI_UNIT_Y, nullptr, 0.0, 0.0, ""); + uiDefBut(block, UI_BTYPE_LABEL, 0, name, 0, 0, w, UI_UNIT_Y, nullptr, 0.0, 0.0, 0, 0, ""); } /* create buttons */ @@ -1052,7 +1054,7 @@ static uiBut *ui_item_with_label(uiLayout *layout, else { w_label = w_hint / 3; } - uiDefBut(block, UI_BTYPE_LABEL, 0, name, x, y, w_label, h, nullptr, 0.0, 0.0, ""); + uiDefBut(block, UI_BTYPE_LABEL, 0, name, x, y, w_label, h, nullptr, 0.0, 0.0, 0, 0, ""); } } @@ -1094,13 +1096,15 @@ static uiBut *ui_item_with_label(uiLayout *layout, nullptr); } else if ((flag & UI_ITEM_R_FULL_EVENT) && is_keymapitem_ptr) { - std::string kmi_str = - WM_keymap_item_to_string(static_cast(ptr->data), false).value_or(""); + char buf[128]; + + WM_keymap_item_to_string( + static_cast(ptr->data), false, buf, sizeof(buf)); but = uiDefButR_prop(block, UI_BTYPE_HOTKEY_EVENT, 0, - kmi_str.c_str(), + buf, x, y, prop_but_width, @@ -1112,16 +1116,15 @@ static uiBut *ui_item_with_label(uiLayout *layout, 0, nullptr); UI_but_func_set(but, ui_keymap_but_cb, but, nullptr); + if (flag & UI_ITEM_R_IMMEDIATE) { + UI_but_flag_enable(but, UI_BUT_ACTIVATE_ON_INIT); + } } else { const char *str = (type == PROP_ENUM && !(flag & UI_ITEM_R_ICON_ONLY)) ? nullptr : ""; but = uiDefAutoButR(block, ptr, prop, index, str, icon, x, y, prop_but_width, h); } - if (flag & UI_ITEM_R_IMMEDIATE) { - UI_but_flag_enable(but, UI_BUT_ACTIVATE_ON_INIT); - } - #ifdef UI_PROP_DECORATE /* Only for alignment. */ if (use_prop_decorate) { /* Note that sep flag may have been unset meanwhile. */ @@ -1204,7 +1207,8 @@ static void ui_item_disabled(uiLayout *layout, const char *name) const int w = ui_text_icon_width(layout, name, 0, false); - uiBut *but = uiDefBut(block, UI_BTYPE_LABEL, 0, name, 0, 0, w, UI_UNIT_Y, nullptr, 0.0, 0.0, ""); + uiBut *but = uiDefBut( + block, UI_BTYPE_LABEL, 0, name, 0, 0, w, UI_UNIT_Y, nullptr, 0.0, 0.0, 0, 0, ""); UI_but_disable(but, ""); } @@ -1513,6 +1517,8 @@ void uiItemsFullEnumO_items(uiLayout *layout, nullptr, 0, 0, + 0, + 0, nullptr); } else { @@ -1603,6 +1609,8 @@ void uiItemsFullEnumO_items(uiLayout *layout, nullptr, 0.0, 0.0, + 0, + 0, ""); uiItemS(target); } @@ -2295,6 +2303,8 @@ void uiItemFullR(uiLayout *layout, nullptr, 0.0, 0.0, + 0, + 0, ""); but->drawflag |= UI_BUT_TEXT_RIGHT; but->drawflag &= ~UI_BUT_TEXT_LEFT; @@ -2305,7 +2315,7 @@ void uiItemFullR(uiLayout *layout, else { if (name) { but = uiDefBut( - block, UI_BTYPE_LABEL, 0, name, 0, 0, w, UI_UNIT_Y, nullptr, 0.0, 0.0, ""); + block, UI_BTYPE_LABEL, 0, name, 0, 0, w, UI_UNIT_Y, nullptr, 0.0, 0.0, 0, 0, ""); but->drawflag |= UI_BUT_TEXT_RIGHT; but->drawflag &= ~UI_BUT_TEXT_LEFT; @@ -3126,6 +3136,8 @@ void uiItemDecoratorR_prop(uiLayout *layout, PointerRNA *ptr, PropertyRNA *prop, nullptr, 0.0, 0.0, + 0.0, + 0.0, ""); but->flag |= UI_BUT_DISABLED; return; @@ -3147,12 +3159,13 @@ void uiItemDecoratorR_prop(uiLayout *layout, PointerRNA *ptr, PropertyRNA *prop, nullptr, 0.0, 0.0, + 0.0, + 0.0, TIP_("Animate property")); UI_but_func_set(but, ui_but_anim_decorate_cb, but, nullptr); but->flag |= UI_BUT_UNDO | UI_BUT_DRAG_LOCK; - /* Decorators have their own RNA data, using the normal #uiBut RNA members has many - * side-effects. */ + /* Decorators have own RNA data, using the normal #uiBut RNA members has many side-effects. */ but->decorated_rnapoin = *ptr; but->decorated_rnaprop = prop; /* ui_def_but_rna() sets non-array buttons to have a RNA index of 0. */ @@ -3270,15 +3283,29 @@ static uiBut *uiItemL_(uiLayout *layout, const char *name, int icon) layout, name, icon, ui_text_pad_none, UI_FSTYLE_WIDGET_LABEL); uiBut *but; if (icon && name[0]) { - but = uiDefIconTextBut( - block, UI_BTYPE_LABEL, 0, icon, name, 0, 0, w, UI_UNIT_Y, nullptr, 0.0, 0.0, nullptr); + but = uiDefIconTextBut(block, + UI_BTYPE_LABEL, + 0, + icon, + name, + 0, + 0, + w, + UI_UNIT_Y, + nullptr, + 0.0, + 0.0, + 0, + 0, + nullptr); } else if (icon) { but = uiDefIconBut( - block, UI_BTYPE_LABEL, 0, icon, 0, 0, w, UI_UNIT_Y, nullptr, 0.0, 0.0, nullptr); + block, UI_BTYPE_LABEL, 0, icon, 0, 0, w, UI_UNIT_Y, nullptr, 0.0, 0.0, 0, 0, nullptr); } else { - but = uiDefBut(block, UI_BTYPE_LABEL, 0, name, 0, 0, w, UI_UNIT_Y, nullptr, 0.0, 0.0, nullptr); + but = uiDefBut( + block, UI_BTYPE_LABEL, 0, name, 0, 0, w, UI_UNIT_Y, nullptr, 0.0, 0.0, 0, 0, nullptr); } /* to compensate for string size padding in ui_text_icon_width, @@ -3371,50 +3398,75 @@ void uiItemLDrag(uiLayout *layout, PointerRNA *ptr, const char *name, int icon) } } -void uiItemS_ex(uiLayout *layout, float factor, const LayoutSeparatorType type) +void uiItemV(uiLayout *layout, const char *name, int icon, int argval) +{ + /* label */ + uiBlock *block = layout->root->block; + int *retvalue = (block->handle) ? &block->handle->retvalue : nullptr; + + UI_block_layout_set_current(block, layout); + + if (!name) { + name = ""; + } + if (layout->root->type == UI_LAYOUT_MENU && !icon) { + icon = ICON_BLANK1; + } + + const int w = ui_text_icon_width(layout, name, icon, false); + + if (icon && name[0]) { + uiDefIconTextButI(block, + UI_BTYPE_BUT, + argval, + icon, + name, + 0, + 0, + w, + UI_UNIT_Y, + retvalue, + 0.0, + 0.0, + 0, + -1, + ""); + } + else if (icon) { + uiDefIconButI( + block, UI_BTYPE_BUT, argval, icon, 0, 0, w, UI_UNIT_Y, retvalue, 0.0, 0.0, 0, -1, ""); + } + else { + uiDefButI( + block, UI_BTYPE_BUT, argval, name, 0, 0, w, UI_UNIT_Y, retvalue, 0.0, 0.0, 0, -1, ""); + } +} + +void uiItemS_ex(uiLayout *layout, float factor) { uiBlock *block = layout->root->block; const bool is_menu = ui_block_is_menu(block); if (is_menu && !UI_block_can_add_separator(block)) { return; } - int space = (is_menu) ? int(0.35f * UI_UNIT_X) : int(0.3f * UI_UNIT_X); space *= factor; - eButType but_type; - - switch (type) { - case LayoutSeparatorType::Line: - but_type = UI_BTYPE_SEPR_LINE; - break; - case LayoutSeparatorType::Auto: - but_type = is_menu ? UI_BTYPE_SEPR_LINE : UI_BTYPE_SEPR; - break; - default: - but_type = UI_BTYPE_SEPR; - } - - bool is_vertical_bar = (layout->w == 0) && but_type == UI_BTYPE_SEPR_LINE; - UI_block_layout_set_current(block, layout); - uiBut *but = uiDefBut(block, - but_type, - 0, - "", - 0, - 0, - space, - is_vertical_bar ? UI_UNIT_Y : space, - nullptr, - 0.0, - 0.0, - ""); - - if (but_type == UI_BTYPE_SEPR_LINE) { - uiButSeparatorLine *but_line = static_cast(but); - but_line->is_vertical = is_vertical_bar; - } + uiDefBut(block, + (is_menu) ? UI_BTYPE_SEPR_LINE : UI_BTYPE_SEPR, + 0, + "", + 0, + 0, + space, + space, + nullptr, + 0.0, + 0.0, + 0, + 0, + ""); } void uiItemS(uiLayout *layout) @@ -3453,6 +3505,8 @@ void uiItemProgressIndicator(uiLayout *layout, nullptr, 0.0, 0.0, + 0, + 0, ""); if (has_text && (progress_type == UI_BUT_PROGRESS_TYPE_RING)) { @@ -3492,6 +3546,8 @@ void uiItemSpacer(uiLayout *layout) nullptr, 0.0, 0.0, + 0, + 0, ""); } @@ -3611,10 +3667,11 @@ void uiItemMenuEnumFullO_ptr(uiLayout *layout, /* add hotkey here, lower UI code can't detect it */ if ((layout->root->block->flag & UI_BLOCK_LOOP) && (ot->prop && ot->invoke)) { - if (std::optional shortcut_str = WM_key_event_operator_string( - C, ot->idname, layout->root->opcontext, nullptr, false)) + char keybuf[128]; + if (WM_key_event_operator_string( + C, ot->idname, layout->root->opcontext, nullptr, false, keybuf, sizeof(keybuf))) { - ui_but_add_shortcut(but, shortcut_str->c_str(), false); + ui_but_add_shortcut(but, keybuf, false); } } } @@ -4941,8 +4998,21 @@ PanelLayout uiLayoutPanelProp(const bContext *C, uiBlock *block = uiLayoutGetBlock(row); const int icon = is_open ? ICON_DOWNARROW_HLT : ICON_RIGHTARROW; const int width = ui_text_icon_width(layout, "", icon, false); - uiDefIconTextBut( - block, UI_BTYPE_LABEL, 0, icon, "", 0, 0, width, UI_UNIT_Y, nullptr, 0.0f, 0.0f, ""); + uiDefIconTextBut(block, + UI_BTYPE_LABEL, + 0, + icon, + "", + 0, + 0, + width, + UI_UNIT_Y, + nullptr, + 0.0f, + 0.0f, + 0.0f, + 0.0f, + ""); panel_layout.header = row; } @@ -5082,7 +5152,8 @@ static uiLayoutItemBx *ui_layout_box(uiLayout *layout, int type) UI_block_layout_set_current(layout->root->block, &box->litem); - box->roundbox = uiDefBut(layout->root->block, type, 0, "", 0, 0, 0, 0, nullptr, 0.0, 0.0, ""); + box->roundbox = uiDefBut( + layout->root->block, type, 0, "", 0, 0, 0, 0, nullptr, 0.0, 0.0, 0, 0, ""); return box; } @@ -5764,8 +5835,20 @@ static void ui_layout_add_padding_button(uiLayoutRoot *root) uiLayout *prev_layout = block->curlayout; block->curlayout = root->layout; - uiDefBut( - block, UI_BTYPE_SEPR, 0, "", 0, 0, root->padding, root->padding, nullptr, 0.0, 0.0, ""); + uiDefBut(block, + UI_BTYPE_SEPR, + 0, + "", + 0, + 0, + root->padding, + root->padding, + nullptr, + 0.0, + 0.0, + 0, + 0, + ""); block->curlayout = prev_layout; } } @@ -5976,6 +6059,12 @@ void UI_block_layout_resolve(uiBlock *block, int *r_x, int *r_y) } BLI_listbase_clear(&block->layouts); + + /* XXX silly trick, `interface_templates.cc` doesn't get linked + * because it's not used by other files in this module? */ + { + UI_template_fix_linking(); + } } bool UI_block_layout_needs_resolving(const uiBlock *block) diff --git a/source/blender/editors/interface/interface_ops.cc b/source/blender/editors/interface/interface_ops.cc index 11ffc9eda37..f7073c30e8e 100644 --- a/source/blender/editors/interface/interface_ops.cc +++ b/source/blender/editors/interface/interface_ops.cc @@ -17,15 +17,18 @@ #include "DNA_modifier_types.h" /* for handling geometry nodes properties */ #include "DNA_object_types.h" /* for OB_DATA_SUPPORT_ID */ #include "DNA_screen_types.h" +#include "DNA_text_types.h" #include "BLI_blenlib.h" #include "BLI_math_color.h" #include "BLF_api.hh" -#include "BLT_lang.hh" -#include "BLT_translation.hh" +#include "BLT_lang.h" +#include "BLT_translation.h" #include "BKE_context.hh" +#include "BKE_global.h" +#include "BKE_idprop.h" #include "BKE_idtype.hh" #include "BKE_layer.hh" #include "BKE_lib_id.hh" @@ -33,8 +36,9 @@ #include "BKE_lib_remap.hh" #include "BKE_material.h" #include "BKE_node.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "BKE_screen.hh" +#include "BKE_text.h" #include "IMB_colormanagement.hh" @@ -42,10 +46,11 @@ #include "RNA_access.hh" #include "RNA_define.hh" +#include "RNA_enum_types.hh" #include "RNA_path.hh" #include "RNA_prototypes.h" +#include "RNA_types.hh" -#include "UI_abstract_view.hh" #include "UI_interface.hh" #include "interface_intern.hh" @@ -61,8 +66,10 @@ #include "ED_keyframing.hh" /* only for UI_OT_editsource */ +#include "BKE_main.hh" #include "BLI_ghash.h" #include "ED_screen.hh" +#include "ED_text.hh" using namespace blender::ui; @@ -818,7 +825,7 @@ static int override_idtemplate_make_exec(bContext *C, wmOperator * /*op*/) /* 'Security' extra tagging, since this process may also affect the owner ID and not only the * used ID, relying on the property update code only is not always enough. */ - DEG_id_tag_update(&CTX_data_scene(C)->id, ID_RECALC_BASE_FLAGS | ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&CTX_data_scene(C)->id, ID_RECALC_BASE_FLAGS | ID_RECALC_COPY_ON_WRITE); WM_event_add_notifier(C, NC_WINDOW, nullptr); WM_event_add_notifier(C, NC_WM | ND_LIB_OVERRIDE_CHANGED, nullptr); WM_event_add_notifier(C, NC_SPACE | ND_SPACE_VIEW3D, nullptr); @@ -945,7 +952,7 @@ static int override_idtemplate_clear_exec(bContext *C, wmOperator * /*op*/) /* 'Security' extra tagging, since this process may also affect the owner ID and not only the * used ID, relying on the property update code only is not always enough. */ - DEG_id_tag_update(&scene->id, ID_RECALC_BASE_FLAGS | ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&scene->id, ID_RECALC_BASE_FLAGS | ID_RECALC_COPY_ON_WRITE); WM_event_add_notifier(C, NC_WINDOW, nullptr); WM_event_add_notifier(C, NC_WM | ND_LIB_OVERRIDE_CHANGED, nullptr); WM_event_add_notifier(C, NC_SPACE | ND_SPACE_VIEW3D, nullptr); @@ -2406,16 +2413,16 @@ static bool ui_view_focused_poll(bContext *C) if (!region) { return false; } - const blender::ui::AbstractView *view = UI_region_view_find_at(region, win->eventstate->xy, 0); + const uiViewHandle *view = UI_region_view_find_at(region, win->eventstate->xy, 0); return view != nullptr; } static int ui_view_start_filter_invoke(bContext *C, wmOperator * /*op*/, const wmEvent *event) { const ARegion *region = CTX_wm_region(C); - const blender::ui::AbstractView *hovered_view = UI_region_view_find_at(region, event->xy, 0); + const uiViewHandle *hovered_view = UI_region_view_find_at(region, event->xy, 0); - if (!hovered_view->begin_filtering(*C)) { + if (!UI_view_begin_filtering(C, hovered_view)) { return OPERATOR_CANCELLED | OPERATOR_PASS_THROUGH; } @@ -2502,16 +2509,16 @@ static bool ui_view_item_rename_poll(bContext *C) if (region == nullptr) { return false; } - const blender::ui::AbstractViewItem *active_item = UI_region_views_find_active_item(region); - return active_item != nullptr && UI_view_item_can_rename(*active_item); + const uiViewItemHandle *active_item = UI_region_views_find_active_item(region); + return active_item != nullptr && UI_view_item_can_rename(active_item); } static int ui_view_item_rename_exec(bContext *C, wmOperator * /*op*/) { ARegion *region = CTX_wm_region(C); - blender::ui::AbstractViewItem *active_item = UI_region_views_find_active_item(region); + uiViewItemHandle *active_item = UI_region_views_find_active_item(region); - UI_view_item_begin_rename(*active_item); + UI_view_item_begin_rename(active_item); ED_region_tag_redraw(region); return OPERATOR_FINISHED; diff --git a/source/blender/editors/interface/interface_panel.cc b/source/blender/editors/interface/interface_panel.cc index cb83a3a5673..72c73fc6124 100644 --- a/source/blender/editors/interface/interface_panel.cc +++ b/source/blender/editors/interface/interface_panel.cc @@ -20,7 +20,7 @@ #include "BLI_time.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_screen_types.h" #include "DNA_userdef_types.h" @@ -1342,6 +1342,8 @@ void UI_panel_category_draw_all(ARegion *region, const char *category_id_active) /* Intentionally don't scale by 'px'. */ const int rct_xmin = is_left ? v2d->mask.xmin + 3 : (v2d->mask.xmax - category_tabs_width); const int rct_xmax = is_left ? v2d->mask.xmin + category_tabs_width : (v2d->mask.xmax - 3); + const int text_v_ofs = (rct_xmax - rct_xmin) * 0.3f; + int y_ofs = tab_v_pad; /* Primary theme colors. */ @@ -1502,14 +1504,8 @@ void UI_panel_category_draw_all(ARegion *region, const char *category_id_active) /* Tab titles. */ - /* Offset toward the middle of the rect. */ - const int text_v_ofs = (rct_xmax - rct_xmin) * 0.5f; - /* Offset down as the font size increases. */ - const int text_size_offset = int(fstyle_points * UI_SCALE_FAC * 0.35f); - BLF_position(fontid, - is_left ? rct->xmax - text_v_ofs + text_size_offset : - rct->xmin + text_v_ofs - text_size_offset, + is_left ? rct->xmax - text_v_ofs : rct->xmin + text_v_ofs, is_left ? rct->ymin + tab_v_pad_text : rct->ymax - tab_v_pad_text, 0.0f); BLF_color3ubv(fontid, is_active ? theme_col_text_hi : theme_col_text); @@ -1801,7 +1797,7 @@ static void ui_do_animate(bContext *C, Panel *panel) uiHandlePanelData *data = static_cast(panel->activedata); ARegion *region = CTX_wm_region(C); - float fac = (BLI_time_now_seconds() - data->starttime) / ANIMATION_TIME; + float fac = (BLI_check_seconds_timer() - data->starttime) / ANIMATION_TIME; fac = min_ff(sqrtf(fac), 1.0f); if (uiAlignPanelStep(region, fac, false)) { @@ -2659,7 +2655,7 @@ static void panel_handle_data_ensure(const bContext *C, data->startofsy = panel->ofsy; data->start_cur_xmin = region->v2d.cur.xmin; data->start_cur_ymin = region->v2d.cur.ymin; - data->starttime = BLI_time_now_seconds(); + data->starttime = BLI_check_seconds_timer(); } /** diff --git a/source/blender/editors/interface/interface_query.cc b/source/blender/editors/interface/interface_query.cc index b4a0be021b7..ee97a197adc 100644 --- a/source/blender/editors/interface/interface_query.cc +++ b/source/blender/editors/interface/interface_query.cc @@ -24,8 +24,6 @@ #include "interface_intern.hh" -#include "UI_abstract_view.hh" - #include "WM_api.hh" #include "WM_types.hh" @@ -98,7 +96,7 @@ bool ui_but_is_interactive_ex(const uiBut *but, const bool labeledit, const bool } if (but->type == UI_BTYPE_VIEW_ITEM) { const uiButViewItem *but_item = static_cast(but); - return but_item->view_item->is_interactive(); + return UI_view_item_is_interactive(but_item->view_item); } return true; @@ -501,7 +499,7 @@ static bool ui_but_is_active_view_item(const uiBut *but, const void * /*customda } const uiButViewItem *view_item_but = (const uiButViewItem *)but; - return view_item_but->view_item->is_active(); + return UI_view_item_is_active(view_item_but->view_item); } uiBut *ui_view_item_find_active(const ARegion *region) diff --git a/source/blender/editors/interface/interface_region_color_picker.cc b/source/blender/editors/interface/interface_region_color_picker.cc index 9e7dee9db33..cda1f33427c 100644 --- a/source/blender/editors/interface/interface_region_color_picker.cc +++ b/source/blender/editors/interface/interface_region_color_picker.cc @@ -20,13 +20,17 @@ #include "BLI_string.h" #include "BLI_utildefines.h" +#include "BKE_context.hh" + #include "WM_types.hh" #include "RNA_access.hh" #include "UI_interface.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" + +#include "ED_screen.hh" #include "IMB_colormanagement.hh" @@ -776,6 +780,8 @@ static void ui_block_colorpicker(uiBlock *block, hexcol, 0, 8, + 0, + 0, TIP_("Hex triplet for color (#RRGGBB)")); UI_but_flag_disable(bt, UI_BUT_UNDO); UI_but_func_set(bt, ui_colorpicker_hex_rna_cb, bt, hexcol); @@ -791,6 +797,8 @@ static void ui_block_colorpicker(uiBlock *block, nullptr, 0.0, 0.0, + 0, + 0, ""); ui_colorpicker_hide_reveal(block, (ePickerType)colormode); diff --git a/source/blender/editors/interface/interface_region_hud.cc b/source/blender/editors/interface/interface_region_hud.cc index 5a2978263fd..6f4e4afee63 100644 --- a/source/blender/editors/interface/interface_region_hud.cc +++ b/source/blender/editors/interface/interface_region_hud.cc @@ -26,12 +26,15 @@ #include "WM_api.hh" #include "WM_types.hh" +#include "RNA_access.hh" + #include "UI_interface.hh" #include "UI_view2d.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "ED_screen.hh" +#include "ED_undo.hh" #include "GPU_framebuffer.h" #include "interface_intern.hh" diff --git a/source/blender/editors/interface/interface_region_menu_pie.cc b/source/blender/editors/interface/interface_region_menu_pie.cc index d2f815ab1f2..9d30ef3a4af 100644 --- a/source/blender/editors/interface/interface_region_menu_pie.cc +++ b/source/blender/editors/interface/interface_region_menu_pie.cc @@ -32,7 +32,9 @@ #include "UI_interface.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" + +#include "ED_screen.hh" #include "interface_intern.hh" #include "interface_regions_intern.hh" @@ -154,12 +156,26 @@ uiPieMenu *UI_pie_menu_begin(bContext *C, const char *title, int icon, const wmE nullptr, 0.0, 0.0, + 0, + 0, ""); } else { w = ui_pie_menu_title_width(title, 0); - but = uiDefBut( - pie->block_radial, UI_BTYPE_LABEL, 0, title, 0, 0, w, UI_UNIT_Y, nullptr, 0.0, 0.0, ""); + but = uiDefBut(pie->block_radial, + UI_BTYPE_LABEL, + 0, + title, + 0, + 0, + w, + UI_UNIT_Y, + nullptr, + 0.0, + 0.0, + 0, + 0, + ""); } /* do not align left */ but->drawflag &= ~UI_BUT_TEXT_LEFT; @@ -177,7 +193,7 @@ void UI_pie_menu_end(bContext *C, uiPieMenu *pie) menu = ui_popup_block_create(C, nullptr, nullptr, nullptr, ui_block_func_PIE, pie, nullptr); menu->popup = true; - menu->towardstime = BLI_time_now_seconds(); + menu->towardstime = BLI_check_seconds_timer(); UI_popup_handlers_add(C, &window->modalhandlers, menu, WM_HANDLER_ACCEPT_DBL_CLICK); WM_event_add_mousemove(window); @@ -379,6 +395,8 @@ void ui_pie_menu_level_create(uiBlock *block, nullptr, 0.0f, 0.0f, + 0.0f, + 0.0f, "Show more items of this menu"); UI_but_funcN_set(but, ui_pie_menu_level_invoke, remaining, &lvl); } diff --git a/source/blender/editors/interface/interface_region_menu_popup.cc b/source/blender/editors/interface/interface_region_menu_popup.cc index b1ca5e76c10..223703f904b 100644 --- a/source/blender/editors/interface/interface_region_menu_popup.cc +++ b/source/blender/editors/interface/interface_region_menu_popup.cc @@ -18,6 +18,7 @@ #include "DNA_userdef_types.h" +#include "BLI_ghash.h" #include "BLI_hash.hh" #include "BLI_listbase.h" #include "BLI_math_vector.h" @@ -26,7 +27,7 @@ #include "BLI_utildefines.h" #include "BKE_context.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "BKE_screen.hh" #include "WM_api.hh" @@ -36,7 +37,7 @@ #include "UI_interface.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "ED_screen.hh" @@ -448,12 +449,25 @@ static void create_title_button(uiLayout *layout, const char *title, int icon) if (icon) { SNPRINTF(titlestr, " %s", title); - uiDefIconTextBut( - block, UI_BTYPE_LABEL, 0, icon, titlestr, 0, 0, 200, UI_UNIT_Y, nullptr, 0.0, 0.0, ""); + uiDefIconTextBut(block, + UI_BTYPE_LABEL, + 0, + icon, + titlestr, + 0, + 0, + 200, + UI_UNIT_Y, + nullptr, + 0.0, + 0.0, + 0, + 0, + ""); } else { uiBut *but = uiDefBut( - block, UI_BTYPE_LABEL, 0, title, 0, 0, 200, UI_UNIT_Y, nullptr, 0.0, 0.0, ""); + block, UI_BTYPE_LABEL, 0, title, 0, 0, 200, UI_UNIT_Y, nullptr, 0.0, 0.0, 0, 0, ""); but->drawflag = UI_BUT_TEXT_LEFT; } diff --git a/source/blender/editors/interface/interface_region_popover.cc b/source/blender/editors/interface/interface_region_popover.cc index ab9c0baf2bf..73f85e8776c 100644 --- a/source/blender/editors/interface/interface_region_popover.cc +++ b/source/blender/editors/interface/interface_region_popover.cc @@ -36,15 +36,18 @@ #include "BLI_utildefines.h" #include "BKE_context.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "BKE_screen.hh" +#include "ED_screen.hh" + #include "WM_api.hh" #include "WM_types.hh" #include "UI_interface.hh" #include "interface_intern.hh" +#include "interface_regions_intern.hh" /* -------------------------------------------------------------------- */ /** \name Popup Menu with Callback or String diff --git a/source/blender/editors/interface/interface_region_search.cc b/source/blender/editors/interface/interface_region_search.cc index c6393f87cc6..8aaf3fdbb49 100644 --- a/source/blender/editors/interface/interface_region_search.cc +++ b/source/blender/editors/interface/interface_region_search.cc @@ -35,7 +35,7 @@ #include "UI_interface_icons.hh" #include "UI_view2d.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "ED_screen.hh" @@ -891,10 +891,10 @@ static ARegion *ui_searchbox_create_generic_ex(bContext *C, data->noback = true; } - if (but->preview_rows > 0 && but->preview_cols > 0) { + if (but->a1 > 0 && but->a2 > 0) { data->preview = true; - data->prv_rows = but->preview_rows; - data->prv_cols = but->preview_cols; + data->prv_rows = but->a1; + data->prv_cols = but->a2; } if (but->optype != nullptr || use_shortcut_sep) { diff --git a/source/blender/editors/interface/interface_region_tooltip.cc b/source/blender/editors/interface/interface_region_tooltip.cc index ba3d028b526..24df87b22a7 100644 --- a/source/blender/editors/interface/interface_region_tooltip.cc +++ b/source/blender/editors/interface/interface_region_tooltip.cc @@ -26,6 +26,7 @@ #include "MEM_guardedalloc.h" +#include "DNA_brush_types.h" #include "DNA_userdef_types.h" #include "BLI_listbase.h" @@ -57,7 +58,7 @@ #include "UI_interface.hh" #include "BLF_api.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #ifdef WITH_PYTHON # include "BPY_extern_run.h" @@ -367,6 +368,7 @@ static std::string ui_tooltip_text_python_from_op(bContext *C, static bool ui_tooltip_data_append_from_keymap(bContext *C, uiTooltipData *data, wmKeyMap *keymap) { const int fields_len_init = data->fields.size(); + char buf[512]; LISTBASE_FOREACH (wmKeyMapItem *, kmi, &keymap->items) { wmOperatorType *ot = WM_operatortype_find(kmi->idname, true); @@ -382,9 +384,12 @@ static bool ui_tooltip_data_append_from_keymap(bContext *C, uiTooltipData *data, true); /* Shortcut. */ - const std::string kmi_str = WM_keymap_item_to_string(kmi, false).value_or("None"); + bool found = false; + if (WM_keymap_item_to_string(kmi, false, buf, sizeof(buf))) { + found = true; + } UI_tooltip_text_field_add(data, - fmt::format(TIP_("Shortcut: {}"), kmi_str), + fmt::format(TIP_("Shortcut: {}"), found ? buf : "None"), {}, UI_TIP_STYLE_NORMAL, UI_TIP_LC_NORMAL); @@ -583,14 +588,16 @@ static uiTooltipData *ui_tooltip_data_from_tool(bContext *C, uiBut *but, bool is RNA_enum_set(&op_props, tool_attr, items[i].value); /* Check for direct access to the tool. */ - if (std::optional shortcut_brush = WM_key_event_operator_string( - C, - ot->idname, - WM_OP_INVOKE_REGION_WIN, - static_cast(op_props.data), - true)) + char shortcut_brush[128] = ""; + if (WM_key_event_operator_string(C, + ot->idname, + WM_OP_INVOKE_REGION_WIN, + static_cast(op_props.data), + true, + shortcut_brush, + ARRAY_SIZE(shortcut_brush))) { - shortcut = *shortcut_brush; + shortcut = shortcut_brush; } WM_operator_properties_free(&op_props); } @@ -599,8 +606,14 @@ static uiTooltipData *ui_tooltip_data_from_tool(bContext *C, uiBut *but, bool is if (shortcut.empty()) { /* Check for direct access to the tool. */ - if (std::optional shortcut_toolbar = WM_key_event_operator_string( - C, "WM_OT_toolbar", WM_OP_INVOKE_REGION_WIN, nullptr, true)) + char shortcut_toolbar[128] = ""; + if (WM_key_event_operator_string(C, + "WM_OT_toolbar", + WM_OP_INVOKE_REGION_WIN, + nullptr, + true, + shortcut_toolbar, + ARRAY_SIZE(shortcut_toolbar))) { /* Generate keymap in order to inspect it. * NOTE: we could make a utility to avoid the keymap generation part of this. */ @@ -626,8 +639,9 @@ static uiTooltipData *ui_tooltip_data_from_tool(bContext *C, uiBut *but, bool is char tool_id_test[MAX_NAME]; RNA_string_get(kmi->ptr, "name", tool_id_test); if (STREQ(tool_id, tool_id_test)) { - std::string kmi_str = WM_keymap_item_to_string(kmi, false).value_or(""); - shortcut = fmt::format("{}, {}", *shortcut_toolbar, kmi_str); + char buf[128]; + WM_keymap_item_to_string(kmi, false, buf, sizeof(buf)); + shortcut = fmt::format("{}, {}", shortcut_toolbar, buf); break; } } @@ -691,19 +705,21 @@ static uiTooltipData *ui_tooltip_data_from_tool(bContext *C, uiBut *but, bool is WM_operator_properties_create_ptr(&op_props, but->optype); RNA_boolean_set(&op_props, "cycle", true); - std::optional shortcut; + char shortcut[128] = ""; const char *item_end = expr_result + expr_result_len; const char *item_step = expr_result; while (item_step < item_end) { RNA_string_set(&op_props, "name", item_step); - shortcut = WM_key_event_operator_string(C, - but->optype->idname, - WM_OP_INVOKE_REGION_WIN, - static_cast(op_props.data), - true); - if (shortcut) { + if (WM_key_event_operator_string(C, + but->optype->idname, + WM_OP_INVOKE_REGION_WIN, + static_cast(op_props.data), + true, + shortcut, + ARRAY_SIZE(shortcut))) + { break; } item_step += strlen(item_step) + 1; @@ -712,9 +728,9 @@ static uiTooltipData *ui_tooltip_data_from_tool(bContext *C, uiBut *but, bool is WM_operator_properties_free(&op_props); MEM_freeN(expr_result); - if (shortcut) { + if (shortcut[0] != '\0') { UI_tooltip_text_field_add(data, - fmt::format(TIP_("Shortcut Cycle: {}"), *shortcut), + fmt::format(TIP_("Shortcut Cycle: {}"), shortcut), {}, UI_TIP_STYLE_NORMAL, UI_TIP_LC_VALUE, @@ -1083,11 +1099,12 @@ static uiTooltipData *ui_tooltip_data_from_gizmo(bContext *C, wmGizmo *gz) /* Shortcut */ { IDProperty *prop = static_cast(gzop->ptr.data); - if (std::optional shortcut_str = WM_key_event_operator_string( - C, gzop->type->idname, WM_OP_INVOKE_DEFAULT, prop, true)) + char buf[128]; + if (WM_key_event_operator_string( + C, gzop->type->idname, WM_OP_INVOKE_DEFAULT, prop, true, buf, ARRAY_SIZE(buf))) { UI_tooltip_text_field_add(data, - fmt::format(TIP_("Shortcut: {}"), *shortcut_str), + fmt::format(TIP_("Shortcut: {}"), buf), {}, UI_TIP_STYLE_NORMAL, UI_TIP_LC_VALUE, @@ -1441,10 +1458,6 @@ ARegion *UI_tooltip_create_from_button_or_extra_icon( } BLI_rcti_rctf_copy_round(&init_rect, &overlap_rect_fl); } - else if (but->type == UI_BTYPE_LABEL && BLI_rctf_size_y(&but->rect) > UI_UNIT_Y) { - init_position[0] = win->eventstate->xy[0]; - init_position[1] = win->eventstate->xy[1] - (UI_POPUP_MARGIN / 2); - } else { init_position[0] = BLI_rctf_cent_x(&but->rect); init_position[1] = but->rect.ymin; diff --git a/source/blender/editors/interface/interface_regions.cc b/source/blender/editors/interface/interface_regions.cc index 2c75e6d6740..cf099a1a04b 100644 --- a/source/blender/editors/interface/interface_regions.cc +++ b/source/blender/editors/interface/interface_regions.cc @@ -17,6 +17,7 @@ #include "BKE_context.hh" #include "BKE_screen.hh" +#include "WM_api.hh" #include "wm_draw.hh" #include "ED_screen.hh" diff --git a/source/blender/editors/interface/interface_style.cc b/source/blender/editors/interface/interface_style.cc index e3fc95ba12c..dac14248452 100644 --- a/source/blender/editors/interface/interface_style.cc +++ b/source/blender/editors/interface/interface_style.cc @@ -21,12 +21,16 @@ #include "BLI_string.h" #include "BLI_utildefines.h" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BLF_api.hh" +#include "BLT_translation.h" + #include "UI_interface.hh" +#include "ED_datafiles.h" + #include "interface_intern.hh" #ifdef WIN32 diff --git a/source/blender/editors/interface/interface_template_asset_view.cc b/source/blender/editors/interface/interface_template_asset_view.cc index a3cc67c8f89..d7a564b51b5 100644 --- a/source/blender/editors/interface/interface_template_asset_view.cc +++ b/source/blender/editors/interface/interface_template_asset_view.cc @@ -13,9 +13,12 @@ #include "BKE_screen.hh" +#include "BLI_path_util.h" #include "BLI_string.h" #include "BLI_string_ref.hh" +#include "BLO_readfile.h" + #include "ED_asset.hh" #include "ED_screen.hh" @@ -26,6 +29,7 @@ #include "UI_interface.hh" +#include "WM_api.hh" #include "WM_types.hh" #include "interface_intern.hh" @@ -35,7 +39,7 @@ using namespace blender::ed; struct AssetViewListData { AssetLibraryReference asset_library_ref; - asset::AssetFilterSettings filter_settings; + AssetFilterSettings filter_settings; bScreen *screen; bool show_names; }; @@ -99,6 +103,8 @@ static void asset_view_draw_item(uiList *ui_list, nullptr, 0, 0, + 0, + 0, ""); ui_def_but_icon(but, asset::handle_get_preview_icon_id(&asset_handle), @@ -116,7 +122,7 @@ static void asset_view_filter_items(uiList *ui_list, const char *propname) { AssetViewListData *list_data = (AssetViewListData *)ui_list->dyn_data->customdata; - asset::AssetFilterSettings &filter_settings = list_data->filter_settings; + AssetFilterSettings &filter_settings = list_data->filter_settings; uiListNameFilter name_filter(*ui_list); @@ -217,7 +223,7 @@ void uiTemplateAssetView(uiLayout *layout, const char *assets_propname, PointerRNA *active_dataptr, const char *active_propname, - const asset::AssetFilterSettings *filter_settings, + const AssetFilterSettings *filter_settings, const int display_flags, const char *activate_opname, PointerRNA *r_activate_op_properties, diff --git a/source/blender/editors/interface/interface_template_attribute_search.cc b/source/blender/editors/interface/interface_template_attribute_search.cc index a9675b64089..434f9c53bb0 100644 --- a/source/blender/editors/interface/interface_template_attribute_search.cc +++ b/source/blender/editors/interface/interface_template_attribute_search.cc @@ -13,7 +13,7 @@ #include "RNA_access.hh" #include "RNA_enum_types.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_attribute.hh" diff --git a/source/blender/editors/interface/interface_template_bone_collection_tree.cc b/source/blender/editors/interface/interface_template_bone_collection_tree.cc index 4e168e1a4c4..93a73485445 100644 --- a/source/blender/editors/interface/interface_template_bone_collection_tree.cc +++ b/source/blender/editors/interface/interface_template_bone_collection_tree.cc @@ -8,7 +8,7 @@ #include "BKE_context.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "ANIM_armature_iter.hh" #include "ANIM_bone_collections.hh" diff --git a/source/blender/editors/interface/interface_template_grease_pencil_layer_tree.cc b/source/blender/editors/interface/interface_template_grease_pencil_layer_tree.cc index 253e3519dee..79c96601185 100644 --- a/source/blender/editors/interface/interface_template_grease_pencil_layer_tree.cc +++ b/source/blender/editors/interface/interface_template_grease_pencil_layer_tree.cc @@ -9,7 +9,7 @@ #include "BKE_context.hh" #include "BKE_grease_pencil.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DEG_depsgraph.hh" @@ -255,27 +255,6 @@ class LayerViewItem : public AbstractTreeViewItem { PointerRNA layer_ptr = RNA_pointer_create(&grease_pencil_.id, &RNA_GreasePencilLayer, &layer_); uiBlock *block = uiLayoutGetBlock(&row); - - const int icon = (layer_.base.flag & GP_LAYER_TREE_NODE_HIDE_MASKS) == 0 ? ICON_CLIPUV_DEHLT : - ICON_CLIPUV_HLT; - but = uiDefIconButR(block, - UI_BTYPE_ICON_TOGGLE, - 0, - icon, - 0, - 0, - UI_UNIT_X, - UI_UNIT_Y, - &layer_ptr, - "use_masks", - 0, - 0.0f, - 0.0f, - nullptr); - if (layer_.parent_group().use_masks()) { - UI_but_flag_enable(but, UI_BUT_INACTIVE); - } - but = uiDefIconButR(block, UI_BTYPE_ICON_TOGGLE, 0, @@ -380,9 +359,6 @@ class LayerGroupViewItem : public AbstractTreeViewItem { PointerRNA group_ptr = RNA_pointer_create( &grease_pencil_.id, &RNA_GreasePencilLayerGroup, &group_); - const int icon = (group_.base.flag & GP_LAYER_TREE_NODE_HIDE_MASKS) == 0 ? ICON_CLIPUV_DEHLT : - ICON_CLIPUV_HLT; - uiItemR(&row, &group_ptr, "use_masks", UI_ITEM_R_ICON_ONLY, nullptr, icon); uiItemR(&row, &group_ptr, "hide", UI_ITEM_R_ICON_ONLY, nullptr, ICON_NONE); uiItemR(&row, &group_ptr, "lock", UI_ITEM_R_ICON_ONLY, nullptr, ICON_NONE); } diff --git a/source/blender/editors/interface/interface_template_light_linking.cc b/source/blender/editors/interface/interface_template_light_linking.cc index 77bda54c236..e7b773676c8 100644 --- a/source/blender/editors/interface/interface_template_light_linking.cc +++ b/source/blender/editors/interface/interface_template_light_linking.cc @@ -13,7 +13,7 @@ #include -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_collection_types.h" #include "DNA_object_types.h" diff --git a/source/blender/editors/interface/interface_template_list.cc b/source/blender/editors/interface/interface_template_list.cc index 04721d7cbe7..af6c7f7a577 100644 --- a/source/blender/editors/interface/interface_template_list.cc +++ b/source/blender/editors/interface/interface_template_list.cc @@ -20,8 +20,9 @@ #include "BKE_screen.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" +#include "ED_asset.hh" #include "ED_screen.hh" #include "MEM_guardedalloc.h" @@ -824,20 +825,20 @@ static void ui_template_list_layout_draw(const bContext *C, /* Add scroll-bar. */ if (items->tot_items > visual_info.visual_items) { uiLayoutColumn(row, false); - but = uiDefButI(block, - UI_BTYPE_SCROLL, - 0, - "", - 0, - 0, - V2D_SCROLL_WIDTH, - UI_UNIT_Y * dyn_data->visual_height, - &ui_list->list_scroll, - 0, - dyn_data->height - dyn_data->visual_height, - ""); - uiButScrollBar *but_scroll = reinterpret_cast(but); - but_scroll->visual_height = dyn_data->visual_height; + uiDefButI(block, + UI_BTYPE_SCROLL, + 0, + "", + 0, + 0, + V2D_SCROLL_WIDTH, + UI_UNIT_Y * dyn_data->visual_height, + &ui_list->list_scroll, + 0, + dyn_data->height - dyn_data->visual_height, + dyn_data->visual_height, + 0, + ""); } break; } @@ -971,20 +972,20 @@ static void ui_template_list_layout_draw(const bContext *C, /* Add scroll-bar. */ if (items->tot_items > visual_info.visual_items) { /* col = */ uiLayoutColumn(row, false); - but = uiDefButI(block, - UI_BTYPE_SCROLL, - 0, - "", - 0, - 0, - V2D_SCROLL_WIDTH, - UI_UNIT_Y * dyn_data->visual_height, - &ui_list->list_scroll, - 0, - dyn_data->height - dyn_data->visual_height, - ""); - uiButScrollBar *but_scroll = reinterpret_cast(but); - but_scroll->visual_height = dyn_data->visual_height; + uiDefButI(block, + UI_BTYPE_SCROLL, + 0, + "", + 0, + 0, + V2D_SCROLL_WIDTH, + UI_UNIT_Y * dyn_data->visual_height, + &ui_list->list_scroll, + 0, + dyn_data->height - dyn_data->visual_height, + dyn_data->visual_height, + 0, + ""); } break; } @@ -1066,20 +1067,20 @@ static void ui_template_list_layout_draw(const bContext *C, if (items->tot_items > visual_info.visual_items) { /* col = */ uiLayoutColumn(row, false); - but = uiDefButI(block, - UI_BTYPE_SCROLL, - 0, - "", - 0, - 0, - V2D_SCROLL_WIDTH, - size_y * dyn_data->visual_height, - &ui_list->list_scroll, - 0, - dyn_data->height - dyn_data->visual_height, - ""); - uiButScrollBar *but_scroll = reinterpret_cast(but); - but_scroll->visual_height = dyn_data->visual_height; + uiDefButI(block, + UI_BTYPE_SCROLL, + 0, + "", + 0, + 0, + V2D_SCROLL_WIDTH, + size_y * dyn_data->visual_height, + &ui_list->list_scroll, + 0, + dyn_data->height - dyn_data->visual_height, + dyn_data->visual_height, + 0, + ""); } break; } @@ -1121,6 +1122,8 @@ static void ui_template_list_layout_draw(const bContext *C, &(ui_list->filter_flag), 0, 0, + 0, + 0, TIP_("Hide filtering options")); UI_but_flag_disable(but, UI_BUT_UNDO); /* skip undo on screen buttons */ @@ -1136,6 +1139,8 @@ static void ui_template_list_layout_draw(const bContext *C, &dyn_data->resize, 0.0, 0.0, + 0, + 0, ""); UI_but_func_set(but, [ui_list](bContext &C) { uilist_resize_update(&C, ui_list); }); } @@ -1155,6 +1160,8 @@ static void ui_template_list_layout_draw(const bContext *C, nullptr, 0.0, 0.0, + 0, + 0, ""); layout_data->draw_filter(ui_list, C, col); @@ -1172,6 +1179,8 @@ static void ui_template_list_layout_draw(const bContext *C, &(ui_list->filter_flag), 0, 0, + 0, + 0, TIP_("Show filtering options")); UI_but_flag_disable(but, UI_BUT_UNDO); /* skip undo on screen buttons */ @@ -1187,6 +1196,8 @@ static void ui_template_list_layout_draw(const bContext *C, &dyn_data->resize, 0.0, 0.0, + 0, + 0, ""); UI_but_func_set(but, [ui_list](bContext &C) { uilist_resize_update(&C, ui_list); }); } diff --git a/source/blender/editors/interface/interface_template_node_inputs.cc b/source/blender/editors/interface/interface_template_node_inputs.cc index 8a3b187b189..d93c5385043 100644 --- a/source/blender/editors/interface/interface_template_node_inputs.cc +++ b/source/blender/editors/interface/interface_template_node_inputs.cc @@ -13,7 +13,7 @@ #include "BKE_node_runtime.hh" #include "BKE_screen.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "NOD_node_declaration.hh" @@ -43,9 +43,7 @@ static void draw_node_input(bContext *C, { BLI_assert(socket.typeinfo != nullptr); /* Ignore disabled sockets and linked sockets and sockets without a `draw` callback. */ - if (!socket.is_available() || (socket.flag & (SOCK_IS_LINKED | SOCK_HIDE_VALUE)) || - socket.typeinfo->draw == nullptr || - ELEM(socket.type, SOCK_GEOMETRY, SOCK_MATRIX, SOCK_SHADER)) + if (!socket.is_available() || (socket.flag & SOCK_IS_LINKED) || socket.typeinfo->draw == nullptr) { return; } diff --git a/source/blender/editors/interface/interface_template_node_tree_interface.cc b/source/blender/editors/interface/interface_template_node_tree_interface.cc index 5d0b2c4e00a..6a2112b6e76 100644 --- a/source/blender/editors/interface/interface_template_node_tree_interface.cc +++ b/source/blender/editors/interface/interface_template_node_tree_interface.cc @@ -13,7 +13,7 @@ #include "BLI_color.hh" #include "BLI_string.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_node_tree_interface_types.h" diff --git a/source/blender/editors/interface/interface_template_search_menu.cc b/source/blender/editors/interface/interface_template_search_menu.cc index 778dd329f4e..c7c407f303b 100644 --- a/source/blender/editors/interface/interface_template_search_menu.cc +++ b/source/blender/editors/interface/interface_template_search_menu.cc @@ -15,8 +15,11 @@ #include "MEM_guardedalloc.h" #include "DNA_action_types.h" +#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_dynstr.h" @@ -28,12 +31,13 @@ #include "BLI_set.hh" #include "BLI_stack.hh" #include "BLI_string.h" +#include "BLI_string_utils.hh" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_context.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_screen.hh" #include "ED_screen.hh" @@ -861,8 +865,9 @@ static MenuSearch_Data *menu_items_from_ui_create(bContext *C, wmKeyMapItem *kmi = menu_to_kmi.lookup_default(item->mt, nullptr); if (kmi != nullptr) { - std::string kmi_str = WM_keymap_item_to_string(kmi, false).value_or(""); - BLI_dynstr_appendf(dyn_str, " (%s)", kmi_str.c_str()); + char kmi_str[128]; + WM_keymap_item_to_string(kmi, false, kmi_str, sizeof(kmi_str)); + BLI_dynstr_appendf(dyn_str, " (%s)", kmi_str); } BLI_dynstr_append(dyn_str, " " UI_MENU_ARROW_SEP " "); @@ -1163,7 +1168,7 @@ void uiTemplateMenuSearch(uiLayout *layout) UI_block_layout_set_current(block, layout); but = uiDefSearchBut( - block, search, 0, ICON_VIEWZOOM, sizeof(search), 0, 0, UI_UNIT_X * 6, UI_UNIT_Y, ""); + block, search, 0, ICON_VIEWZOOM, sizeof(search), 0, 0, UI_UNIT_X * 6, UI_UNIT_Y, 0, 0, ""); UI_but_func_menu_search(but); } diff --git a/source/blender/editors/interface/interface_template_search_operator.cc b/source/blender/editors/interface/interface_template_search_operator.cc index 7832293fb7c..7568ee0eb75 100644 --- a/source/blender/editors/interface/interface_template_search_operator.cc +++ b/source/blender/editors/interface/interface_template_search_operator.cc @@ -10,9 +10,9 @@ */ #include -#include #include "DNA_object_types.h" +#include "DNA_scene_types.h" #include "DNA_texture_types.h" #include "BLI_array.hh" @@ -21,9 +21,10 @@ #include "BLI_string.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" -#include "BKE_global.hh" +#include "BKE_context.hh" +#include "BKE_global.h" #include "WM_api.hh" #include "WM_types.hh" @@ -70,15 +71,27 @@ static void operator_search_update_fn(const bContext *C, if (BLI_string_all_words_matched(ot_ui_name, str, (int(*)[2])words.data(), words_len)) { if (WM_operator_poll((bContext *)C, ot)) { - std::string name = ot_ui_name; - if (const std::optional kmi_str = WM_key_event_operator_string( - C, ot->idname, WM_OP_EXEC_DEFAULT, nullptr, true)) - { - name += UI_SEP_CHAR; - name += *kmi_str; + char name[256]; + const int len = strlen(ot_ui_name); + + /* display name for menu, can hold hotkey */ + STRNCPY(name, ot_ui_name); + + /* check for hotkey */ + if (len < sizeof(name) - 6) { + if (WM_key_event_operator_string(C, + ot->idname, + WM_OP_EXEC_DEFAULT, + nullptr, + true, + &name[len + 1], + sizeof(name) - len - 1)) + { + name[len] = UI_SEP_CHAR; + } } - if (!UI_search_item_add(items, name.c_str(), ot, ICON_NONE, 0, 0)) { + if (!UI_search_item_add(items, name, ot, ICON_NONE, 0, 0)) { break; } } @@ -114,7 +127,7 @@ void uiTemplateOperatorSearch(uiLayout *layout) UI_block_layout_set_current(block, layout); but = uiDefSearchBut( - block, search, 0, ICON_VIEWZOOM, sizeof(search), 0, 0, UI_UNIT_X * 6, UI_UNIT_Y, ""); + block, search, 0, ICON_VIEWZOOM, sizeof(search), 0, 0, UI_UNIT_X * 6, UI_UNIT_Y, 0, 0, ""); UI_but_func_operator_search(but); } diff --git a/source/blender/editors/interface/interface_templates.cc b/source/blender/editors/interface/interface_templates.cc index eaeda41c8a6..c0a0f124189 100644 --- a/source/blender/editors/interface/interface_templates.cc +++ b/source/blender/editors/interface/interface_templates.cc @@ -23,12 +23,15 @@ #include "DNA_curveprofile_types.h" #include "DNA_gpencil_modifier_types.h" #include "DNA_node_types.h" +#include "DNA_object_force_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" #include "BLI_fileops.h" +#include "BLI_fnmatch.h" #include "BLI_listbase.h" #include "BLI_math_color.h" #include "BLI_math_vector.h" @@ -41,16 +44,18 @@ #include "BLI_utildefines.h" #include "BLF_api.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" +#include "BKE_action.h" #include "BKE_blender_version.h" #include "BKE_blendfile.hh" +#include "BKE_cachefile.h" #include "BKE_colorband.hh" #include "BKE_colortools.hh" #include "BKE_constraint.h" #include "BKE_context.hh" #include "BKE_curveprofile.h" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_gpencil_modifier_legacy.h" #include "BKE_idprop.h" #include "BKE_idtype.hh" @@ -60,13 +65,15 @@ #include "BKE_linestyle.h" #include "BKE_main.hh" #include "BKE_modifier.hh" +#include "BKE_object.hh" #include "BKE_packedFile.h" -#include "BKE_report.hh" -#include "BKE_scene.hh" +#include "BKE_particle.h" +#include "BKE_report.h" +#include "BKE_scene.h" #include "BKE_screen.hh" #include "BKE_shader_fx.h" -#include "BLO_readfile.hh" +#include "BLO_readfile.h" #include "DEG_depsgraph.hh" #include "DEG_depsgraph_build.hh" @@ -95,18 +102,18 @@ #include "UI_interface.hh" #include "UI_interface_icons.hh" #include "UI_string_search.hh" +#include "UI_view2d.hh" #include "interface_intern.hh" -using blender::StringRef; -using blender::Vector; - /* we may want to make this optional, disable for now. */ // #define USE_OP_RESET_BUT /* defines for templateID/TemplateSearch */ -#define TEMPLATE_SEARCH_TEXTBUT_MIN_WIDTH (UI_UNIT_X * 4) +#define TEMPLATE_SEARCH_TEXTBUT_MIN_WIDTH (UI_UNIT_X * 6) #define TEMPLATE_SEARCH_TEXTBUT_HEIGHT UI_UNIT_Y +void UI_template_fix_linking() {} + /* -------------------------------------------------------------------- */ /** \name Header Template * \{ */ @@ -142,7 +149,7 @@ static int template_search_textbut_width(PointerRNA *ptr, PropertyRNA *name_prop /* Clamp to some min/max width. */ return std::clamp( - estimated_width, TEMPLATE_SEARCH_TEXTBUT_MIN_WIDTH, TEMPLATE_SEARCH_TEXTBUT_MIN_WIDTH * 4); + estimated_width, TEMPLATE_SEARCH_TEXTBUT_MIN_WIDTH, TEMPLATE_SEARCH_TEXTBUT_MIN_WIDTH * 3); } static int template_search_textbut_height() @@ -257,10 +264,20 @@ static uiBlock *template_common_search_menu(const bContext *C, const int h = 5 * U.widget_unit * preview_rows * scale; /* fake button, it holds space for search items */ - uiDefBut(block, UI_BTYPE_LABEL, 0, "", 10, 26, w, h, nullptr, 0, 0, nullptr); + uiDefBut(block, UI_BTYPE_LABEL, 0, "", 10, 26, w, h, nullptr, 0, 0, 0, 0, nullptr); - but = uiDefSearchBut(block, search, 0, ICON_VIEWZOOM, sizeof(search), 10, 0, w, UI_UNIT_Y, ""); - UI_but_search_preview_grid_size_set(but, preview_rows, preview_cols); + but = uiDefSearchBut(block, + search, + 0, + ICON_VIEWZOOM, + sizeof(search), + 10, + 0, + w, + UI_UNIT_Y, + preview_rows, + preview_cols, + ""); } /* list view */ else { @@ -279,6 +296,8 @@ static uiBlock *template_common_search_menu(const bContext *C, nullptr, 0, 0, + 0, + 0, nullptr); but = uiDefSearchBut(block, search, @@ -289,6 +308,8 @@ static uiBlock *template_common_search_menu(const bContext *C, 0, searchbox_width, UI_UNIT_Y - 1, + 0, + 0, ""); } UI_but_func_search_set(but, @@ -883,7 +904,7 @@ ID *ui_template_id_liboverride_hierarchy_make( if (id_override != nullptr) { id_override->override_library->flag &= ~LIBOVERRIDE_FLAG_SYSTEM_DEFINED; - /* Ensure that the hierarchy root of the newly overridden data is instantiated in the scene, in + /* Ensure that the hierarchy root of the newly overridden data is instanciated in the scene, in * case it's a collection or object. */ ID *hierarchy_root = id_override->override_library->hierarchy_root; if (GS(hierarchy_root->name) == ID_OB) { @@ -1118,8 +1139,6 @@ static const char *template_id_browse_tip(const StructRNA *type) return N_("Browse Armature data to be linked"); case ID_AC: return N_("Browse Action to be linked"); - case ID_AN: - return N_("Browse Animation to be linked"); case ID_NT: return N_("Browse Node Tree to be linked"); case ID_BR: @@ -1212,6 +1231,7 @@ static uiBut *template_id_def_new_but(uiBlock *block, { ID *idfrom = template_ui->ptr.owner_id; uiBut *but; + const int w = id ? UI_UNIT_X : id_open ? UI_UNIT_X * 3 : UI_UNIT_X * 6; const int but_type = use_tab_but ? UI_BTYPE_TAB : UI_BTYPE_BUT; /* i18n markup, does nothing! */ @@ -1251,22 +1271,13 @@ static uiBut *template_id_def_new_but(uiBlock *block, * check the definition to see if a new call must be added when the limit * is exceeded. */ - const char *button_text = (id) ? "" : CTX_IFACE_(template_id_context(type), "New"); - const int icon = (id && !use_tab_but) ? ICON_DUPLICATE : ICON_ADD; - const uiFontStyle *fstyle = UI_FSTYLE_WIDGET; - - int w = id ? UI_UNIT_X : id_open ? UI_UNIT_X * 3 : UI_UNIT_X * 6; - if (!id) { - w = std::max(UI_fontstyle_string_width(fstyle, button_text) + int((UI_UNIT_X * 1.5f)), w); - } - if (newop) { but = uiDefIconTextButO(block, but_type, newop, WM_OP_INVOKE_DEFAULT, - icon, - button_text, + (id && !use_tab_but) ? ICON_DUPLICATE : ICON_ADD, + (id) ? "" : CTX_IFACE_(template_id_context(type), "New"), 0, 0, w, @@ -1276,8 +1287,21 @@ static uiBut *template_id_def_new_but(uiBlock *block, but, template_id_cb, MEM_dupallocN(template_ui), POINTER_FROM_INT(UI_ID_ADD_NEW)); } else { - but = uiDefIconTextBut( - block, but_type, 0, icon, button_text, 0, 0, w, but_height, nullptr, 0, 0, nullptr); + but = uiDefIconTextBut(block, + but_type, + 0, + (id && !use_tab_but) ? ICON_DUPLICATE : ICON_ADD, + (id) ? "" : CTX_IFACE_(template_id_context(type), "New"), + 0, + 0, + w, + but_height, + nullptr, + 0, + 0, + 0, + 0, + nullptr); UI_but_funcN_set( but, template_id_cb, MEM_dupallocN(template_ui), POINTER_FROM_INT(UI_ID_ADD_NEW)); } @@ -1348,13 +1372,8 @@ static void template_ID(const bContext *C, char name[UI_MAX_NAME_STR]; const bool user_alert = (id->us <= 0); - int width = template_search_textbut_width(&idptr, RNA_struct_find_property(&idptr, "name")); - - if ((template_ui->idcode == ID_SCE) && (template_ui->ptr.type == &RNA_Window)) { - /* More room needed for "pin" icon. */ - width += UI_UNIT_X; - } - + const int width = template_search_textbut_width(&idptr, + RNA_struct_find_property(&idptr, "name")); const int height = template_search_textbut_height(); // text_idbutton(id, name); @@ -1396,6 +1415,8 @@ static void template_ID(const bContext *C, nullptr, 0, 0, + 0, + 0, TIP_("Indirect library data-block, cannot be made local, " "Shift + Click to create a library override hierarchy")); } @@ -1411,6 +1432,8 @@ static void template_ID(const bContext *C, nullptr, 0, 0, + 0, + 0, TIP_("Direct linked library data-block, click to make local, " "Shift + Click to create a library override")); } @@ -1435,6 +1458,8 @@ static void template_ID(const bContext *C, nullptr, 0, 0, + 0, + 0, TIP_("Library override of linked data-block, click to make fully local, " "Shift + Click to clear the library override and toggle if it can be edited")); UI_but_funcN_set( @@ -1460,6 +1485,8 @@ static void template_ID(const bContext *C, nullptr, 0, 0, + 0, + 0, TIP_("Display number of users of this data (click to make a single-user copy)")); but->flag |= UI_BUT_UNDO; @@ -1537,13 +1564,7 @@ static void template_ID(const bContext *C, RNA_int_set(but->opptr, "id_type", GS(id->name)); } else if (flag & UI_ID_OPEN) { - const char *button_text = (id) ? "" : IFACE_("Open"); - const uiFontStyle *fstyle = UI_FSTYLE_WIDGET; - - int w = id ? UI_UNIT_X : (flag & UI_ID_ADD_NEW) ? UI_UNIT_X * 3 : UI_UNIT_X * 6; - if (!id) { - w = std::max(UI_fontstyle_string_width(fstyle, button_text) + int((UI_UNIT_X * 1.5f)), w); - } + const int w = id ? UI_UNIT_X : (flag & UI_ID_ADD_NEW) ? UI_UNIT_X * 3 : UI_UNIT_X * 6; if (openop) { but = uiDefIconTextButO(block, @@ -1573,6 +1594,8 @@ static void template_ID(const bContext *C, nullptr, 0, 0, + 0, + 0, nullptr); UI_but_funcN_set( but, template_id_cb, MEM_dupallocN(template_ui), POINTER_FROM_INT(UI_ID_OPEN)); @@ -1618,6 +1641,8 @@ static void template_ID(const bContext *C, nullptr, 0, 0, + 0, + 0, TIP_("Unlink data-block " "(Shift + Click to set users to zero, data will then not be saved)")); UI_but_funcN_set( @@ -1670,7 +1695,11 @@ static void template_ID_tabs(const bContext *C, uiBlock *block = uiLayoutGetBlock(layout); const uiStyle *style = UI_style_get_dpi(); - for (ID *id : BKE_id_ordered_list(template_id->idlb)) { + ListBase ordered; + BKE_id_ordered_list(&ordered, template_id->idlb); + + LISTBASE_FOREACH (LinkData *, link, &ordered) { + ID *id = static_cast(link->data); const int name_width = UI_fontstyle_string_width(&style->widget, id->name + 2); const int but_width = name_width + UI_UNIT_X; @@ -1696,6 +1725,8 @@ static void template_ID_tabs(const bContext *C, UI_but_drawflag_enable(tab, but_align); } + BLI_freelistN(&ordered); + if (flag & UI_ID_ADD_NEW) { const bool editable = RNA_property_editable(&template_id->ptr, template_id->prop); uiBut *but; @@ -2826,7 +2857,7 @@ static eAutoPropButsReturn template_operator_property_buts_draw_single( * - this is used for allowing operators with popups to rename stuff with fewer clicks */ if (is_popup) { - if ((but->rnaprop == op->type->prop) && (ELEM(but->type, UI_BTYPE_TEXT, UI_BTYPE_NUM))) { + if ((but->rnaprop == op->type->prop) && (but->type == UI_BTYPE_TEXT)) { UI_but_focus_on_enter_event(CTX_wm_window(C), but); } } @@ -3043,7 +3074,7 @@ static void constraint_ops_extra_draw(bContext *C, uiLayout *layout, void *con_v static void draw_constraint_header(uiLayout *layout, Object *ob, bConstraint *con) { - /* unless button has its own callback, it adds this callback to button */ + /* unless button has own callback, it adds this callback to button */ uiBlock *block = uiLayoutGetBlock(layout); UI_block_func_set(block, constraint_active_func, ob, con); @@ -3208,8 +3239,20 @@ void uiTemplatePreview(uiLayout *layout, uiLayoutSetKeepAspect(col, true); /* add preview */ - uiDefBut( - block, UI_BTYPE_EXTRA, 0, "", 0, 0, UI_UNIT_X * 10, ui_preview->height, pid, 0.0, 0.0, ""); + uiDefBut(block, + UI_BTYPE_EXTRA, + 0, + "", + 0, + 0, + UI_UNIT_X * 10, + ui_preview->height, + pid, + 0.0, + 0.0, + 0, + 0, + ""); UI_but_func_drawextra_set(block, ED_preview_draw, pparent, slot); UI_block_func_handle_set(block, do_preview_buttons, nullptr); @@ -3224,6 +3267,8 @@ void uiTemplatePreview(uiLayout *layout, &ui_preview->height, UI_UNIT_Y, UI_UNIT_Y * 50.0f, + 0.0f, + 0.0f, ""); /* add buttons */ @@ -3267,6 +3312,8 @@ void uiTemplatePreview(uiLayout *layout, pr_texture, 10, TEX_PR_TEXTURE, + 0, + 0, ""); if (GS(parent->name) == ID_MA) { uiDefButS(block, @@ -3280,6 +3327,8 @@ void uiTemplatePreview(uiLayout *layout, pr_texture, 10, TEX_PR_OTHER, + 0, + 0, ""); } else if (GS(parent->name) == ID_LA) { @@ -3294,6 +3343,8 @@ void uiTemplatePreview(uiLayout *layout, pr_texture, 10, TEX_PR_OTHER, + 0, + 0, ""); } else if (GS(parent->name) == ID_WO) { @@ -3308,6 +3359,8 @@ void uiTemplatePreview(uiLayout *layout, pr_texture, 10, TEX_PR_OTHER, + 0, + 0, ""); } else if (GS(parent->name) == ID_LS) { @@ -3322,6 +3375,8 @@ void uiTemplatePreview(uiLayout *layout, pr_texture, 10, TEX_PR_OTHER, + 0, + 0, ""); } uiDefButS(block, @@ -3335,6 +3390,8 @@ void uiTemplatePreview(uiLayout *layout, pr_texture, 10, TEX_PR_BOTH, + 0, + 0, ""); /* Alpha button for texture preview */ @@ -3357,21 +3414,24 @@ struct RNAUpdateCb { PropertyRNA *prop; }; -static void rna_update_cb(bContext &C, const RNAUpdateCb &cb) -{ - /* we call update here on the pointer property, this way the - * owner of the curve mapping can still define its own update - * and notifier, even if the CurveMapping struct is shared. */ - RNA_property_update(&C, &const_cast(cb.ptr), cb.prop); -} - static void rna_update_cb(bContext *C, void *arg_cb, void * /*arg*/) { RNAUpdateCb *cb = (RNAUpdateCb *)arg_cb; - rna_update_cb(*C, *cb); + + /* we call update here on the pointer property, this way the + * owner of the curve mapping can still define its own update + * and notifier, even if the CurveMapping struct is shared. */ + RNA_property_update(C, &cb->ptr, cb->prop); } -static void colorband_flip(bContext *C, ColorBand *coba) +enum { + CB_FUNC_FLIP, + CB_FUNC_DISTRIBUTE_LR, + CB_FUNC_DISTRIBUTE_EVENLY, + CB_FUNC_RESET, +}; + +static void colorband_flip_cb(bContext *C, ColorBand *coba) { CBData data_tmp[MAXCOLORBAND]; @@ -3389,7 +3449,7 @@ static void colorband_flip(bContext *C, ColorBand *coba) ED_undo_push(C, "Flip Color Ramp"); } -static void colorband_distribute(bContext *C, ColorBand *coba, bool evenly) +static void colorband_distribute_cb(bContext *C, ColorBand *coba, bool evenly) { if (coba->tot > 1) { const int tot = evenly ? coba->tot - 1 : coba->tot; @@ -3403,16 +3463,39 @@ static void colorband_distribute(bContext *C, ColorBand *coba, bool evenly) } } -static uiBlock *colorband_tools_fn(bContext *C, ARegion *region, void *cb_v) +static void colorband_tools_dofunc(bContext *C, void *coba_v, int event) { - RNAUpdateCb &cb = *static_cast(cb_v); + ColorBand *coba = static_cast(coba_v); + + switch (event) { + case CB_FUNC_FLIP: + colorband_flip_cb(C, coba); + break; + case CB_FUNC_DISTRIBUTE_LR: + colorband_distribute_cb(C, coba, false); + break; + case CB_FUNC_DISTRIBUTE_EVENLY: + colorband_distribute_cb(C, coba, true); + break; + case CB_FUNC_RESET: + BKE_colorband_init(coba, true); + ED_undo_push(C, "Reset Color Ramp"); + break; + } + ED_region_tag_redraw(CTX_wm_region(C)); +} + +static uiBlock *colorband_tools_func(bContext *C, ARegion *region, void *arg_cb) +{ + RNAUpdateCb *cb = (RNAUpdateCb *)arg_cb; const uiStyle *style = UI_style_get_dpi(); - PointerRNA coba_ptr = RNA_property_pointer_get(&cb.ptr, cb.prop); + PointerRNA coba_ptr = RNA_property_pointer_get(&cb->ptr, cb->prop); ColorBand *coba = static_cast(coba_ptr.data); short yco = 0; const short menuwidth = 10 * UI_UNIT_X; uiBlock *block = UI_block_begin(C, region, __func__, UI_EMBOSS_PULLDOWN); + UI_block_func_butmenu_set(block, colorband_tools_dofunc, coba); uiLayout *layout = UI_block_layout(block, UI_LAYOUT_VERTICAL, @@ -3431,92 +3514,73 @@ static uiBlock *colorband_tools_fn(bContext *C, ARegion *region, void *cb_v) /* We could move these to operators, * although this isn't important unless we want to assign key shortcuts to them. */ { - uiBut *but = uiDefIconTextBut(block, - UI_BTYPE_BUT_MENU, - 1, - ICON_ARROW_LEFTRIGHT, - IFACE_("Flip Color Ramp"), - 0, - yco -= UI_UNIT_Y, - menuwidth, - UI_UNIT_Y, - nullptr, - 0.0, - 0.0, - ""); - UI_but_func_set(but, [coba, cb](bContext &C) { - colorband_flip(&C, coba); - ED_region_tag_redraw(CTX_wm_region(&C)); - rna_update_cb(C, cb); - }); - } - { - uiBut *but = uiDefIconTextBut(block, - UI_BTYPE_BUT_MENU, - 1, - ICON_BLANK1, - IFACE_("Distribute Stops from Left"), - 0, - yco -= UI_UNIT_Y, - menuwidth, - UI_UNIT_Y, - nullptr, - 0.0, - 0.0, - ""); - UI_but_func_set(but, [coba, cb](bContext &C) { - colorband_distribute(&C, coba, false); - ED_region_tag_redraw(CTX_wm_region(&C)); - rna_update_cb(C, cb); - }); - } - { - uiBut *but = uiDefIconTextBut(block, - UI_BTYPE_BUT_MENU, - 1, - ICON_BLANK1, - IFACE_("Distribute Stops Evenly"), - 0, - yco -= UI_UNIT_Y, - menuwidth, - UI_UNIT_Y, - nullptr, - 0.0, - 0.0, - ""); - UI_but_func_set(but, [coba, cb](bContext &C) { - colorband_distribute(&C, coba, true); - ED_region_tag_redraw(CTX_wm_region(&C)); - rna_update_cb(C, cb); - }); - } + uiDefIconTextBut(block, + UI_BTYPE_BUT_MENU, + 1, + ICON_ARROW_LEFTRIGHT, + IFACE_("Flip Color Ramp"), + 0, + yco -= UI_UNIT_Y, + menuwidth, + UI_UNIT_Y, + nullptr, + 0.0, + 0.0, + 0, + CB_FUNC_FLIP, + ""); + uiDefIconTextBut(block, + UI_BTYPE_BUT_MENU, + 1, + ICON_BLANK1, + IFACE_("Distribute Stops from Left"), + 0, + yco -= UI_UNIT_Y, + menuwidth, + UI_UNIT_Y, + nullptr, + 0.0, + 0.0, + 0, + CB_FUNC_DISTRIBUTE_LR, + ""); + uiDefIconTextBut(block, + UI_BTYPE_BUT_MENU, + 1, + ICON_BLANK1, + IFACE_("Distribute Stops Evenly"), + 0, + yco -= UI_UNIT_Y, + menuwidth, + UI_UNIT_Y, + nullptr, + 0.0, + 0.0, + 0, + CB_FUNC_DISTRIBUTE_EVENLY, + ""); - uiItemS(layout); + uiItemS(layout); - uiItemO(layout, IFACE_("Eyedropper"), ICON_EYEDROPPER, "UI_OT_eyedropper_colorramp"); + uiItemO(layout, IFACE_("Eyedropper"), ICON_EYEDROPPER, "UI_OT_eyedropper_colorramp"); - uiItemS(layout); + uiItemS(layout); - { - uiBut *but = uiDefIconTextBut(block, - UI_BTYPE_BUT_MENU, - 1, - ICON_LOOP_BACK, - IFACE_("Reset Color Ramp"), - 0, - yco -= UI_UNIT_Y, - menuwidth, - UI_UNIT_Y, - nullptr, - 0.0, - 0.0, - ""); - UI_but_func_set(but, [coba, cb](bContext &C) { - BKE_colorband_init(coba, true); - ED_undo_push(&C, "Reset Color Ramp"); - ED_region_tag_redraw(CTX_wm_region(&C)); - rna_update_cb(C, cb); - }); + uiDefIconTextBut(block, + UI_BTYPE_BUT_MENU, + 1, + ICON_LOOP_BACK, + IFACE_("Reset Color Ramp"), + 0, + yco -= UI_UNIT_Y, + menuwidth, + UI_UNIT_Y, + nullptr, + 0.0, + 0.0, + 0, + CB_FUNC_RESET, + ""); } UI_block_direction_set(block, UI_DIR_DOWN); @@ -3525,22 +3589,33 @@ static uiBlock *colorband_tools_fn(bContext *C, ARegion *region, void *cb_v) return block; } -static void colorband_add(bContext &C, const RNAUpdateCb &cb, ColorBand &coba) +static void colorband_add_cb(bContext *C, void *cb_v, void *coba_v) { + ColorBand *coba = static_cast(coba_v); float pos = 0.5f; - if (coba.tot > 1) { - if (coba.cur > 0) { - pos = (coba.data[coba.cur - 1].pos + coba.data[coba.cur].pos) * 0.5f; + if (coba->tot > 1) { + if (coba->cur > 0) { + pos = (coba->data[coba->cur - 1].pos + coba->data[coba->cur].pos) * 0.5f; } else { - pos = (coba.data[coba.cur + 1].pos + coba.data[coba.cur].pos) * 0.5f; + pos = (coba->data[coba->cur + 1].pos + coba->data[coba->cur].pos) * 0.5f; } } - if (BKE_colorband_element_add(&coba, pos)) { - rna_update_cb(C, cb); - ED_undo_push(&C, "Add Color Ramp Stop"); + if (BKE_colorband_element_add(coba, pos)) { + rna_update_cb(C, cb_v, nullptr); + ED_undo_push(C, "Add Color Ramp Stop"); + } +} + +static void colorband_del_cb(bContext *C, void *cb_v, void *coba_v) +{ + ColorBand *coba = static_cast(coba_v); + + if (BKE_colorband_element_remove(coba, coba->cur)) { + ED_undo_push(C, "Delete Color Ramp Stop"); + rna_update_cb(C, cb_v, nullptr); } } @@ -3559,7 +3634,7 @@ static void colorband_buttons_layout(uiLayout *layout, uiBlock *block, ColorBand *coba, const rctf *butr, - const RNAUpdateCb &cb, + RNAUpdateCb *cb, int expand) { uiBut *bt; @@ -3567,7 +3642,7 @@ static void colorband_buttons_layout(uiLayout *layout, const float xs = butr->xmin; const float ys = butr->ymin; - PointerRNA ptr = RNA_pointer_create(cb.ptr.owner_id, &RNA_ColorRamp, coba); + PointerRNA ptr = RNA_pointer_create(cb->ptr.owner_id, &RNA_ColorRamp, coba); uiLayout *split = uiLayoutSplit(layout, 0.4f, false); @@ -3587,8 +3662,10 @@ static void colorband_buttons_layout(uiLayout *layout, nullptr, 0, 0, + 0, + 0, TIP_("Add a new color stop to the color ramp")); - UI_but_func_set(bt, [coba, cb](bContext &C) { colorband_add(C, cb, *coba); }); + UI_but_funcN_set(bt, colorband_add_cb, MEM_dupallocN(cb), coba); bt = uiDefIconTextBut(block, UI_BTYPE_BUT, @@ -3602,17 +3679,14 @@ static void colorband_buttons_layout(uiLayout *layout, nullptr, 0, 0, + 0, + 0, TIP_("Delete the active position")); - UI_but_func_set(bt, [coba, cb](bContext &C) { - if (BKE_colorband_element_remove(coba, coba->cur)) { - rna_update_cb(C, cb); - ED_undo_push(&C, "Delete Color Ramp Stop"); - } - }); + UI_but_funcN_set(bt, colorband_del_cb, MEM_dupallocN(cb), coba); - RNAUpdateCb *tools_cb = MEM_new(__func__, cb); + RNAUpdateCb *tools_cb = static_cast(MEM_dupallocN(cb)); bt = uiDefIconBlockBut(block, - colorband_tools_fn, + colorband_tools_func, tools_cb, 0, ICON_DOWNARROW_HLT, @@ -3621,9 +3695,7 @@ static void colorband_buttons_layout(uiLayout *layout, 2.0f * unit, UI_UNIT_Y, TIP_("Tools")); - /* Pass ownership of `tools_cb` to the button. */ - UI_but_funcN_set( - bt, [](bContext *, void *, void *) {}, tools_cb, nullptr); + UI_but_funcN_set(bt, rna_update_cb, tools_cb, coba); UI_block_align_end(block); UI_block_emboss_set(block, UI_EMBOSS); @@ -3642,16 +3714,28 @@ static void colorband_buttons_layout(uiLayout *layout, row = uiLayoutRow(layout, false); - bt = uiDefBut( - block, UI_BTYPE_COLORBAND, 0, "", xs, ys, BLI_rctf_size_x(butr), UI_UNIT_Y, coba, 0, 0, ""); - UI_but_func_set(bt, [cb](bContext &C) { rna_update_cb(C, cb); }); + bt = uiDefBut(block, + UI_BTYPE_COLORBAND, + 0, + "", + xs, + ys, + BLI_rctf_size_x(butr), + UI_UNIT_Y, + coba, + 0, + 0, + 0, + 0, + ""); + UI_but_funcN_set(bt, rna_update_cb, MEM_dupallocN(cb), nullptr); row = uiLayoutRow(layout, false); if (coba->tot) { CBData *cbd = coba->data + coba->cur; - ptr = RNA_pointer_create(cb.ptr.owner_id, &RNA_ColorRampElement, cbd); + ptr = RNA_pointer_create(cb->ptr.owner_id, &RNA_ColorRampElement, cbd); if (!expand) { split = uiLayoutSplit(layout, 0.3f, false); @@ -3668,6 +3752,8 @@ static void colorband_buttons_layout(uiLayout *layout, &coba->cur, 0.0, float(std::max(0, coba->tot - 1)), + 0, + 0, TIP_("Choose active color stop")); UI_but_number_step_size_set(bt, 1); @@ -3693,6 +3779,8 @@ static void colorband_buttons_layout(uiLayout *layout, &coba->cur, 0.0, float(std::max(0, coba->tot - 1)), + 0, + 0, TIP_("Choose active color stop")); UI_but_number_step_size_set(bt, 1); @@ -3718,7 +3806,7 @@ static void colorband_buttons_layout(uiLayout *layout, } if (STREQ(prop_identifier, "color")) { - UI_but_func_set(bt, [cb](bContext &C) { rna_update_cb(C, cb); }); + UI_but_funcN_set(but, rna_update_cb, MEM_dupallocN(cb), nullptr); } } } @@ -3737,6 +3825,10 @@ void uiTemplateColorRamp(uiLayout *layout, PointerRNA *ptr, const char *propname return; } + RNAUpdateCb *cb = MEM_cnew("RNAUpdateCb"); + cb->ptr = *ptr; + cb->prop = prop; + rctf rect; rect.xmin = 0; rect.xmax = 10.0f * UI_UNIT_X; @@ -3748,10 +3840,11 @@ void uiTemplateColorRamp(uiLayout *layout, PointerRNA *ptr, const char *propname ID *id = cptr.owner_id; UI_block_lock_set(block, (id && ID_IS_LINKED(id)), ERROR_LIBDATA_MESSAGE); - colorband_buttons_layout( - layout, block, static_cast(cptr.data), &rect, RNAUpdateCb{*ptr, prop}, expand); + colorband_buttons_layout(layout, block, static_cast(cptr.data), &rect, cb, expand); UI_block_lock_clear(block); + + MEM_freeN(cb); } /** \} */ @@ -3774,6 +3867,8 @@ void uiTemplateIcon(uiLayout *layout, int icon_value, float icon_scale) nullptr, 0.0, 0.0, + 0.0, + 0.0, ""); ui_def_but_icon(but, icon_value, UI_HAS_ICON | UI_BUT_ICON_PREVIEW); } @@ -3906,6 +4001,8 @@ void uiTemplateIconView(uiLayout *layout, nullptr, 0.0, 0.0, + 0.0, + 0.0, ""); } @@ -3946,7 +4043,8 @@ void uiTemplateHistogram(uiLayout *layout, PointerRNA *ptr, const char *propname uiLayout *col = uiLayoutColumn(layout, true); uiBlock *block = uiLayoutGetBlock(col); - uiDefBut(block, UI_BTYPE_HISTOGRAM, 0, "", 0, 0, UI_UNIT_X * 10, hist->height, hist, 0, 0, ""); + uiDefBut( + block, UI_BTYPE_HISTOGRAM, 0, "", 0, 0, UI_UNIT_X * 10, hist->height, hist, 0, 0, 0, 0, ""); /* Resize grip. */ uiDefIconButI(block, @@ -3960,6 +4058,8 @@ void uiTemplateHistogram(uiLayout *layout, PointerRNA *ptr, const char *propname &hist->height, UI_UNIT_Y, UI_UNIT_Y * 20.0f, + 0.0f, + 0.0f, ""); } @@ -4004,6 +4104,8 @@ void uiTemplateWaveform(uiLayout *layout, PointerRNA *ptr, const char *propname) scopes, 0, 0, + 0, + 0, ""); /* Resize grip. */ @@ -4018,6 +4120,8 @@ void uiTemplateWaveform(uiLayout *layout, PointerRNA *ptr, const char *propname) &scopes->wavefrm_height, UI_UNIT_Y, UI_UNIT_Y * 20.0f, + 0.0f, + 0.0f, ""); } @@ -4062,6 +4166,8 @@ void uiTemplateVectorscope(uiLayout *layout, PointerRNA *ptr, const char *propna scopes, 0, 0, + 0, + 0, ""); /* Resize grip. */ @@ -4076,6 +4182,8 @@ void uiTemplateVectorscope(uiLayout *layout, PointerRNA *ptr, const char *propna &scopes->vecscope_height, UI_UNIT_Y, UI_UNIT_Y * 20.0f, + 0.0f, + 0.0f, ""); } @@ -4097,8 +4205,10 @@ static bool curvemap_can_zoom_in(CurveMapping *cumap) return BLI_rctf_size_x(&cumap->curr) > CURVE_ZOOM_MAX * BLI_rctf_size_x(&cumap->clipr); } -static void curvemap_buttons_zoom_in(bContext *C, CurveMapping *cumap) +static void curvemap_buttons_zoom_in(bContext *C, void *cumap_v, void * /*arg*/) { + CurveMapping *cumap = static_cast(cumap_v); + if (curvemap_can_zoom_in(cumap)) { const float dx = 0.1154f * BLI_rctf_size_x(&cumap->curr); cumap->curr.xmin += dx; @@ -4111,8 +4221,9 @@ static void curvemap_buttons_zoom_in(bContext *C, CurveMapping *cumap) ED_region_tag_redraw(CTX_wm_region(C)); } -static void curvemap_buttons_zoom_out(bContext *C, CurveMapping *cumap) +static void curvemap_buttons_zoom_out(bContext *C, void *cumap_v, void * /*unused*/) { + CurveMapping *cumap = static_cast(cumap_v); float d, d1; if (curvemap_can_zoom_out(cumap)) { @@ -4154,6 +4265,23 @@ static void curvemap_buttons_zoom_out(bContext *C, CurveMapping *cumap) ED_region_tag_redraw(CTX_wm_region(C)); } +static void curvemap_buttons_setclip(bContext * /*C*/, void *cumap_v, void * /*arg*/) +{ + CurveMapping *cumap = static_cast(cumap_v); + + BKE_curvemapping_changed(cumap, false); +} + +static void curvemap_buttons_delete(bContext *C, void *cb_v, void *cumap_v) +{ + CurveMapping *cumap = static_cast(cumap_v); + + BKE_curvemap_remove(cumap->cm + cumap->cur, SELECT); + BKE_curvemapping_changed(cumap, false); + + rna_update_cb(C, cb_v, nullptr); +} + /* NOTE: this is a block-menu, needs 0 events, otherwise the menu closes */ static uiBlock *curvemap_clipping_func(bContext *C, ARegion *region, void *cumap_v) { @@ -4178,7 +4306,7 @@ static uiBlock *curvemap_clipping_func(bContext *C, ARegion *region, void *cumap 0.0, 0.0, ""); - UI_but_func_set(bt, [cumap](bContext & /*C*/) { BKE_curvemapping_changed(cumap, false); }); + UI_but_func_set(bt, curvemap_buttons_setclip, cumap, nullptr); UI_block_align_begin(block); bt = uiDefButF(block, @@ -4244,106 +4372,137 @@ static uiBlock *curvemap_clipping_func(bContext *C, ARegion *region, void *cumap return block; } -static uiBlock *curvemap_tools_func( - bContext *C, ARegion *region, RNAUpdateCb &cb, bool show_extend, int reset_mode) -{ - PointerRNA cumap_ptr = RNA_property_pointer_get(&cb.ptr, cb.prop); - CurveMapping *cumap = static_cast(cumap_ptr.data); +/* only for BKE_curvemap_tools_dofunc */ +enum { + UICURVE_FUNC_RESET_NEG, + UICURVE_FUNC_RESET_POS, + UICURVE_FUNC_RESET_VIEW, + UICURVE_FUNC_HANDLE_VECTOR, + UICURVE_FUNC_HANDLE_AUTO, + UICURVE_FUNC_HANDLE_AUTO_ANIM, + UICURVE_FUNC_EXTEND_HOZ, + UICURVE_FUNC_EXTEND_EXP, +}; +static void curvemap_tools_dofunc(bContext *C, void *cumap_v, int event) +{ + CurveMapping *cumap = static_cast(cumap_v); + CurveMap *cuma = cumap->cm + cumap->cur; + + switch (event) { + case UICURVE_FUNC_RESET_NEG: + case UICURVE_FUNC_RESET_POS: /* reset */ + BKE_curvemap_reset(cuma, + &cumap->clipr, + cumap->preset, + (event == UICURVE_FUNC_RESET_NEG) ? CURVEMAP_SLOPE_NEGATIVE : + CURVEMAP_SLOPE_POSITIVE); + BKE_curvemapping_changed(cumap, false); + break; + case UICURVE_FUNC_RESET_VIEW: + BKE_curvemapping_reset_view(cumap); + break; + case UICURVE_FUNC_HANDLE_VECTOR: /* Set vector. */ + BKE_curvemap_handle_set(cuma, HD_VECT); + BKE_curvemapping_changed(cumap, false); + break; + case UICURVE_FUNC_HANDLE_AUTO: /* Set auto. */ + BKE_curvemap_handle_set(cuma, HD_AUTO); + BKE_curvemapping_changed(cumap, false); + break; + case UICURVE_FUNC_HANDLE_AUTO_ANIM: /* Set auto-clamped. */ + BKE_curvemap_handle_set(cuma, HD_AUTO_ANIM); + BKE_curvemapping_changed(cumap, false); + break; + case UICURVE_FUNC_EXTEND_HOZ: /* Extend horizontal. */ + cumap->flag &= ~CUMA_EXTEND_EXTRAPOLATE; + BKE_curvemapping_changed(cumap, false); + break; + case UICURVE_FUNC_EXTEND_EXP: /* Extend extrapolate. */ + cumap->flag |= CUMA_EXTEND_EXTRAPOLATE; + BKE_curvemapping_changed(cumap, false); + break; + } + ED_undo_push(C, "CurveMap tools"); + ED_region_tag_redraw(CTX_wm_region(C)); +} + +static uiBlock *curvemap_tools_func( + bContext *C, ARegion *region, CurveMapping *cumap, bool show_extend, int reset_mode) +{ short yco = 0; const short menuwidth = 10 * UI_UNIT_X; uiBlock *block = UI_block_begin(C, region, __func__, UI_EMBOSS); + UI_block_func_butmenu_set(block, curvemap_tools_dofunc, cumap); { - uiBut *but = uiDefIconTextBut(block, - UI_BTYPE_BUT_MENU, - 1, - ICON_BLANK1, - IFACE_("Reset View"), - 0, - yco -= UI_UNIT_Y, - menuwidth, - UI_UNIT_Y, - nullptr, - 0.0, - 0.0, - ""); - UI_but_func_set(but, [cumap](bContext &C) { - BKE_curvemapping_reset_view(cumap); - ED_region_tag_redraw(CTX_wm_region(&C)); - }); + uiDefIconTextBut(block, + UI_BTYPE_BUT_MENU, + 1, + ICON_BLANK1, + IFACE_("Reset View"), + 0, + yco -= UI_UNIT_Y, + menuwidth, + UI_UNIT_Y, + nullptr, + 0.0, + 0.0, + 0, + UICURVE_FUNC_RESET_VIEW, + ""); } if (show_extend) { - { - uiBut *but = uiDefIconTextBut(block, - UI_BTYPE_BUT_MENU, - 1, - ICON_BLANK1, - IFACE_("Extend Horizontal"), - 0, - yco -= UI_UNIT_Y, - menuwidth, - UI_UNIT_Y, - nullptr, - 0.0, - 0.0, - ""); - UI_but_func_set(but, [cumap, cb](bContext &C) { - cumap->flag &= ~CUMA_EXTEND_EXTRAPOLATE; - BKE_curvemapping_changed(cumap, false); - rna_update_cb(C, cb); - ED_undo_push(&C, "CurveMap tools"); - ED_region_tag_redraw(CTX_wm_region(&C)); - }); - } - { - uiBut *but = uiDefIconTextBut(block, - UI_BTYPE_BUT_MENU, - 1, - ICON_BLANK1, - IFACE_("Extend Extrapolated"), - 0, - yco -= UI_UNIT_Y, - menuwidth, - UI_UNIT_Y, - nullptr, - 0.0, - 0.0, - ""); - UI_but_func_set(but, [cumap, cb](bContext &C) { - cumap->flag |= CUMA_EXTEND_EXTRAPOLATE; - BKE_curvemapping_changed(cumap, false); - rna_update_cb(C, cb); - ED_undo_push(&C, "CurveMap tools"); - ED_region_tag_redraw(CTX_wm_region(&C)); - }); - } + uiDefIconTextBut(block, + UI_BTYPE_BUT_MENU, + 1, + ICON_BLANK1, + IFACE_("Extend Horizontal"), + 0, + yco -= UI_UNIT_Y, + menuwidth, + UI_UNIT_Y, + nullptr, + 0.0, + 0.0, + 0, + UICURVE_FUNC_EXTEND_HOZ, + ""); + uiDefIconTextBut(block, + UI_BTYPE_BUT_MENU, + 1, + ICON_BLANK1, + IFACE_("Extend Extrapolated"), + 0, + yco -= UI_UNIT_Y, + menuwidth, + UI_UNIT_Y, + nullptr, + 0.0, + 0.0, + 0, + UICURVE_FUNC_EXTEND_EXP, + ""); } { - uiBut *but = uiDefIconTextBut(block, - UI_BTYPE_BUT_MENU, - 1, - ICON_BLANK1, - IFACE_("Reset Curve"), - 0, - yco -= UI_UNIT_Y, - menuwidth, - UI_UNIT_Y, - nullptr, - 0.0, - 0.0, - ""); - UI_but_func_set(but, [cumap, cb, reset_mode](bContext &C) { - CurveMap *cuma = cumap->cm + cumap->cur; - BKE_curvemap_reset(cuma, &cumap->clipr, cumap->preset, reset_mode); - BKE_curvemapping_changed(cumap, false); - rna_update_cb(C, cb); - ED_undo_push(&C, "CurveMap tools"); - ED_region_tag_redraw(CTX_wm_region(&C)); - }); + uiDefIconTextBut(block, + UI_BTYPE_BUT_MENU, + 1, + ICON_BLANK1, + IFACE_("Reset Curve"), + 0, + yco -= UI_UNIT_Y, + menuwidth, + UI_UNIT_Y, + nullptr, + 0.0, + 0.0, + 0, + reset_mode, + ""); } UI_block_direction_set(block, UI_DIR_DOWN); @@ -4352,33 +4511,72 @@ static uiBlock *curvemap_tools_func( return block; } -static uiBlock *curvemap_tools_posslope_func(bContext *C, ARegion *region, void *cb_v) +static uiBlock *curvemap_tools_posslope_func(bContext *C, ARegion *region, void *cumap_v) { return curvemap_tools_func( - C, region, *static_cast(cb_v), true, CURVEMAP_SLOPE_POSITIVE); + C, region, static_cast(cumap_v), true, UICURVE_FUNC_RESET_POS); } -static uiBlock *curvemap_tools_negslope_func(bContext *C, ARegion *region, void *cb_v) +static uiBlock *curvemap_tools_negslope_func(bContext *C, ARegion *region, void *cumap_v) { return curvemap_tools_func( - C, region, *static_cast(cb_v), true, CURVEMAP_SLOPE_NEGATIVE); + C, region, static_cast(cumap_v), true, UICURVE_FUNC_RESET_NEG); } -static uiBlock *curvemap_brush_tools_func(bContext *C, ARegion *region, void *cb_v) +static uiBlock *curvemap_brush_tools_func(bContext *C, ARegion *region, void *cumap_v) { return curvemap_tools_func( - C, region, *static_cast(cb_v), false, CURVEMAP_SLOPE_POSITIVE); + C, region, static_cast(cumap_v), false, UICURVE_FUNC_RESET_NEG); } -static uiBlock *curvemap_brush_tools_negslope_func(bContext *C, ARegion *region, void *cb_v) +static uiBlock *curvemap_brush_tools_negslope_func(bContext *C, ARegion *region, void *cumap_v) { return curvemap_tools_func( - C, region, *static_cast(cb_v), false, CURVEMAP_SLOPE_POSITIVE); + C, region, static_cast(cumap_v), false, UICURVE_FUNC_RESET_POS); } -static void curvemap_buttons_redraw(bContext &C) +static void curvemap_tools_handle_vector(bContext *C, void *cumap_v, void * /*arg*/) { - ED_region_tag_redraw(CTX_wm_region(&C)); + curvemap_tools_dofunc(C, cumap_v, UICURVE_FUNC_HANDLE_VECTOR); +} + +static void curvemap_tools_handle_auto(bContext *C, void *cumap_v, void * /*arg*/) +{ + curvemap_tools_dofunc(C, cumap_v, UICURVE_FUNC_HANDLE_AUTO); +} + +static void curvemap_tools_handle_auto_clamped(bContext *C, void *cumap_v, void * /*arg*/) +{ + curvemap_tools_dofunc(C, cumap_v, UICURVE_FUNC_HANDLE_AUTO_ANIM); +} + +static void curvemap_buttons_redraw(bContext *C, void * /*arg1*/, void * /*arg2*/) +{ + ED_region_tag_redraw(CTX_wm_region(C)); +} + +static void curvemap_buttons_update(bContext *C, void *arg1_v, void *cumap_v) +{ + CurveMapping *cumap = static_cast(cumap_v); + BKE_curvemapping_changed(cumap, true); + rna_update_cb(C, arg1_v, nullptr); +} + +static void curvemap_buttons_reset(bContext *C, void *cb_v, void *cumap_v) +{ + CurveMapping *cumap = static_cast(cumap_v); + cumap->preset = CURVE_PRESET_LINE; + for (int a = 0; a < CM_TOT; a++) { + BKE_curvemap_reset(cumap->cm + a, &cumap->clipr, cumap->preset, CURVEMAP_SLOPE_POSITIVE); + } + + cumap->black[0] = cumap->black[1] = cumap->black[2] = 0.0f; + cumap->white[0] = cumap->white[1] = cumap->white[2] = 1.0f; + BKE_curvemapping_set_black_white(cumap, nullptr, nullptr); + + BKE_curvemapping_changed(cumap, false); + + rna_update_cb(C, cb_v, nullptr); } /** @@ -4393,7 +4591,7 @@ static void curvemap_buttons_layout(uiLayout *layout, bool brush, bool neg_slope, bool tone, - const RNAUpdateCb &cb) + RNAUpdateCb *cb) { CurveMapping *cumap = static_cast(ptr->data); CurveMap *cm = &cumap->cm[cumap->cur]; @@ -4419,16 +4617,19 @@ static void curvemap_buttons_layout(uiLayout *layout, uiLayoutSetAlignment(sub, UI_LAYOUT_ALIGN_LEFT); if (cumap->cm[0].curve) { - bt = uiDefButI(block, UI_BTYPE_ROW, 0, "X", 0, 0, dx, dx, &cumap->cur, 0.0, 0.0, ""); - UI_but_func_set(bt, curvemap_buttons_redraw); + bt = uiDefButI( + block, UI_BTYPE_ROW, 0, "X", 0, 0, dx, dx, &cumap->cur, 0.0, 0.0, 0.0, 0.0, ""); + UI_but_func_set(bt, curvemap_buttons_redraw, nullptr, nullptr); } if (cumap->cm[1].curve) { - bt = uiDefButI(block, UI_BTYPE_ROW, 0, "Y", 0, 0, dx, dx, &cumap->cur, 0.0, 1.0, ""); - UI_but_func_set(bt, curvemap_buttons_redraw); + bt = uiDefButI( + block, UI_BTYPE_ROW, 0, "Y", 0, 0, dx, dx, &cumap->cur, 0.0, 1.0, 0.0, 0.0, ""); + UI_but_func_set(bt, curvemap_buttons_redraw, nullptr, nullptr); } if (cumap->cm[2].curve) { - bt = uiDefButI(block, UI_BTYPE_ROW, 0, "Z", 0, 0, dx, dx, &cumap->cur, 0.0, 2.0, ""); - UI_but_func_set(bt, curvemap_buttons_redraw); + bt = uiDefButI( + block, UI_BTYPE_ROW, 0, "Z", 0, 0, dx, dx, &cumap->cur, 0.0, 2.0, 0.0, 0.0, ""); + UI_but_func_set(bt, curvemap_buttons_redraw, nullptr, nullptr); } } else if (labeltype == 'c') { @@ -4448,20 +4649,25 @@ static void curvemap_buttons_layout(uiLayout *layout, &cumap->cur, 0.0, 3.0, + 0.0, + 0.0, ""); - UI_but_func_set(bt, curvemap_buttons_redraw); + UI_but_func_set(bt, curvemap_buttons_redraw, nullptr, nullptr); } if (cumap->cm[0].curve) { - bt = uiDefButI(block, UI_BTYPE_ROW, 0, IFACE_("R"), 0, 0, dx, dx, &cumap->cur, 0.0, 0.0, ""); - UI_but_func_set(bt, curvemap_buttons_redraw); + bt = uiDefButI( + block, UI_BTYPE_ROW, 0, IFACE_("R"), 0, 0, dx, dx, &cumap->cur, 0.0, 0.0, 0.0, 0.0, ""); + UI_but_func_set(bt, curvemap_buttons_redraw, nullptr, nullptr); } if (cumap->cm[1].curve) { - bt = uiDefButI(block, UI_BTYPE_ROW, 0, IFACE_("G"), 0, 0, dx, dx, &cumap->cur, 0.0, 1.0, ""); - UI_but_func_set(bt, curvemap_buttons_redraw); + bt = uiDefButI( + block, UI_BTYPE_ROW, 0, IFACE_("G"), 0, 0, dx, dx, &cumap->cur, 0.0, 1.0, 0.0, 0.0, ""); + UI_but_func_set(bt, curvemap_buttons_redraw, nullptr, nullptr); } if (cumap->cm[2].curve) { - bt = uiDefButI(block, UI_BTYPE_ROW, 0, IFACE_("B"), 0, 0, dx, dx, &cumap->cur, 0.0, 2.0, ""); - UI_but_func_set(bt, curvemap_buttons_redraw); + bt = uiDefButI( + block, UI_BTYPE_ROW, 0, IFACE_("B"), 0, 0, dx, dx, &cumap->cur, 0.0, 2.0, 0.0, 0.0, ""); + UI_but_func_set(bt, curvemap_buttons_redraw, nullptr, nullptr); } } else if (labeltype == 'h') { @@ -4470,16 +4676,19 @@ static void curvemap_buttons_layout(uiLayout *layout, uiLayoutSetAlignment(sub, UI_LAYOUT_ALIGN_LEFT); if (cumap->cm[0].curve) { - bt = uiDefButI(block, UI_BTYPE_ROW, 0, IFACE_("H"), 0, 0, dx, dx, &cumap->cur, 0.0, 0.0, ""); - UI_but_func_set(bt, curvemap_buttons_redraw); + bt = uiDefButI( + block, UI_BTYPE_ROW, 0, IFACE_("H"), 0, 0, dx, dx, &cumap->cur, 0.0, 0.0, 0.0, 0.0, ""); + UI_but_func_set(bt, curvemap_buttons_redraw, nullptr, nullptr); } if (cumap->cm[1].curve) { - bt = uiDefButI(block, UI_BTYPE_ROW, 0, IFACE_("S"), 0, 0, dx, dx, &cumap->cur, 0.0, 1.0, ""); - UI_but_func_set(bt, curvemap_buttons_redraw); + bt = uiDefButI( + block, UI_BTYPE_ROW, 0, IFACE_("S"), 0, 0, dx, dx, &cumap->cur, 0.0, 1.0, 0.0, 0.0, ""); + UI_but_func_set(bt, curvemap_buttons_redraw, nullptr, nullptr); } if (cumap->cm[2].curve) { - bt = uiDefButI(block, UI_BTYPE_ROW, 0, IFACE_("V"), 0, 0, dx, dx, &cumap->cur, 0.0, 2.0, ""); - UI_but_func_set(bt, curvemap_buttons_redraw); + bt = uiDefButI( + block, UI_BTYPE_ROW, 0, IFACE_("V"), 0, 0, dx, dx, &cumap->cur, 0.0, 2.0, 0.0, 0.0, ""); + UI_but_func_set(bt, curvemap_buttons_redraw, nullptr, nullptr); } } else { @@ -4496,17 +4705,41 @@ static void curvemap_buttons_layout(uiLayout *layout, uiLayoutSetAlignment(sub, UI_LAYOUT_ALIGN_RIGHT); /* Zoom in */ - bt = uiDefIconBut( - block, UI_BTYPE_BUT, 0, ICON_ZOOM_IN, 0, 0, dx, dx, nullptr, 0.0, 0.0, TIP_("Zoom in")); - UI_but_func_set(bt, [cumap](bContext &C) { curvemap_buttons_zoom_in(&C, cumap); }); + bt = uiDefIconBut(block, + UI_BTYPE_BUT, + 0, + ICON_ZOOM_IN, + 0, + 0, + dx, + dx, + nullptr, + 0.0, + 0.0, + 0.0, + 0.0, + TIP_("Zoom in")); + UI_but_func_set(bt, curvemap_buttons_zoom_in, cumap, nullptr); if (!curvemap_can_zoom_in(cumap)) { UI_but_disable(bt, ""); } /* Zoom out */ - bt = uiDefIconBut( - block, UI_BTYPE_BUT, 0, ICON_ZOOM_OUT, 0, 0, dx, dx, nullptr, 0.0, 0.0, TIP_("Zoom out")); - UI_but_func_set(bt, [cumap](bContext &C) { curvemap_buttons_zoom_out(&C, cumap); }); + bt = uiDefIconBut(block, + UI_BTYPE_BUT, + 0, + ICON_ZOOM_OUT, + 0, + 0, + dx, + dx, + nullptr, + 0.0, + 0.0, + 0.0, + 0.0, + TIP_("Zoom out")); + UI_but_func_set(bt, curvemap_buttons_zoom_out, cumap, nullptr); if (!curvemap_can_zoom_out(cumap)) { UI_but_disable(bt, ""); } @@ -4516,13 +4749,12 @@ static void curvemap_buttons_layout(uiLayout *layout, bt = uiDefIconBlockBut( block, curvemap_clipping_func, cumap, 0, icon, 0, 0, dx, dx, TIP_("Clipping Options")); bt->drawflag &= ~UI_BUT_ICON_LEFT; - UI_but_func_set(bt, [cb](bContext &C) { rna_update_cb(C, cb); }); + UI_but_funcN_set(bt, rna_update_cb, MEM_dupallocN(cb), nullptr); - RNAUpdateCb *tools_cb = MEM_new(__func__, cb); if (brush && neg_slope) { bt = uiDefIconBlockBut(block, curvemap_brush_tools_negslope_func, - tools_cb, + cumap, 0, ICON_NONE, 0, @@ -4533,27 +4765,25 @@ static void curvemap_buttons_layout(uiLayout *layout, } else if (brush) { bt = uiDefIconBlockBut( - block, curvemap_brush_tools_func, tools_cb, 0, ICON_NONE, 0, 0, dx, dx, TIP_("Tools")); + block, curvemap_brush_tools_func, cumap, 0, ICON_NONE, 0, 0, dx, dx, TIP_("Tools")); } else if (neg_slope) { bt = uiDefIconBlockBut( - block, curvemap_tools_negslope_func, tools_cb, 0, ICON_NONE, 0, 0, dx, dx, TIP_("Tools")); + block, curvemap_tools_negslope_func, cumap, 0, ICON_NONE, 0, 0, dx, dx, TIP_("Tools")); } else { bt = uiDefIconBlockBut( - block, curvemap_tools_posslope_func, tools_cb, 0, ICON_NONE, 0, 0, dx, dx, TIP_("Tools")); + block, curvemap_tools_posslope_func, cumap, 0, ICON_NONE, 0, 0, dx, dx, TIP_("Tools")); } - /* Pass ownership of `tools_cb` to the button. */ - UI_but_funcN_set( - bt, [](bContext *, void *, void *) {}, tools_cb, nullptr); + UI_but_funcN_set(bt, rna_update_cb, MEM_dupallocN(cb), nullptr); - UI_block_funcN_set(block, rna_update_cb, MEM_new(__func__, cb), nullptr); + UI_block_funcN_set(block, rna_update_cb, MEM_dupallocN(cb), nullptr); /* Curve itself. */ const int size = max_ii(uiLayoutGetWidth(layout), UI_UNIT_X); row = uiLayoutRow(layout, false); uiButCurveMapping *curve_but = (uiButCurveMapping *)uiDefBut( - block, UI_BTYPE_CURVE, 0, "", 0, 0, size, 8.0f * UI_UNIT_X, cumap, 0.0f, 1.0f, ""); + block, UI_BTYPE_CURVE, 0, "", 0, 0, size, 8.0f * UI_UNIT_X, cumap, 0.0f, 1.0f, -1, 0, ""); curve_but->gradient_type = bg; /* Sliders for selected curve point. */ @@ -4596,13 +4826,10 @@ static void curvemap_buttons_layout(uiLayout *layout, nullptr, 0.0, 0.0, + 0.0, + 0.0, TIP_("Auto Handle")); - UI_but_func_set(bt, [cumap, cb](bContext &C) { - CurveMap *cuma = cumap->cm + cumap->cur; - BKE_curvemap_handle_set(cuma, HD_AUTO); - BKE_curvemapping_changed(cumap, false); - rna_update_cb(C, cb); - }); + UI_but_func_set(bt, curvemap_tools_handle_auto, cumap, nullptr); if (((cmp->flag & CUMA_HANDLE_AUTO_ANIM) == false) && ((cmp->flag & CUMA_HANDLE_VECTOR) == false)) { @@ -4620,13 +4847,10 @@ static void curvemap_buttons_layout(uiLayout *layout, nullptr, 0.0, 0.0, + 0.0, + 0.0, TIP_("Vector Handle")); - UI_but_func_set(bt, [cumap, cb](bContext &C) { - CurveMap *cuma = cumap->cm + cumap->cur; - BKE_curvemap_handle_set(cuma, HD_VECT); - BKE_curvemapping_changed(cumap, false); - rna_update_cb(C, cb); - }); + UI_but_func_set(bt, curvemap_tools_handle_vector, cumap, nullptr); if (cmp->flag & CUMA_HANDLE_VECTOR) { bt->flag |= UI_SELECT_DRAW; } @@ -4642,18 +4866,16 @@ static void curvemap_buttons_layout(uiLayout *layout, nullptr, 0.0, 0.0, + 0.0, + 0.0, TIP_("Auto Clamped")); - UI_but_func_set(bt, [cumap, cb](bContext &C) { - CurveMap *cuma = cumap->cm + cumap->cur; - BKE_curvemap_handle_set(cuma, HD_AUTO_ANIM); - BKE_curvemapping_changed(cumap, false); - rna_update_cb(C, cb); - }); + UI_but_func_set(bt, curvemap_tools_handle_auto_clamped, cumap, nullptr); if (cmp->flag & CUMA_HANDLE_AUTO_ANIM) { bt->flag |= UI_SELECT_DRAW; } /* Curve handle position */ + UI_block_funcN_set(block, curvemap_buttons_update, MEM_dupallocN(cb), cumap); bt = uiDefButF(block, UI_BTYPE_NUM, 0, @@ -4668,11 +4890,6 @@ static void curvemap_buttons_layout(uiLayout *layout, ""); UI_but_number_step_size_set(bt, 1); UI_but_number_precision_set(bt, 5); - UI_but_func_set(bt, [cumap, cb](bContext &C) { - BKE_curvemapping_changed(cumap, true); - rna_update_cb(C, cb); - }); - bt = uiDefButF(block, UI_BTYPE_NUM, 0, @@ -4687,19 +4904,23 @@ static void curvemap_buttons_layout(uiLayout *layout, ""); UI_but_number_step_size_set(bt, 1); UI_but_number_precision_set(bt, 5); - UI_but_func_set(bt, [cumap, cb](bContext &C) { - BKE_curvemapping_changed(cumap, true); - rna_update_cb(C, cb); - }); /* Curve handle delete point */ - bt = uiDefIconBut( - block, UI_BTYPE_BUT, 0, ICON_X, 0, 0, dx, dx, nullptr, 0.0, 0.0, TIP_("Delete points")); - UI_but_func_set(bt, [cumap, cb](bContext &C) { - BKE_curvemap_remove(cumap->cm + cumap->cur, SELECT); - BKE_curvemapping_changed(cumap, false); - rna_update_cb(C, cb); - }); + bt = uiDefIconBut(block, + UI_BTYPE_BUT, + 0, + ICON_X, + 0, + 0, + dx, + dx, + nullptr, + 0.0, + 0.0, + 0.0, + 0.0, + TIP_("Delete points")); + UI_but_funcN_set(bt, curvemap_buttons_delete, MEM_dupallocN(cb), cumap); if (point_last_or_first) { UI_but_flag_enable(bt, UI_BUT_DISABLED); } @@ -4725,20 +4946,10 @@ static void curvemap_buttons_layout(uiLayout *layout, nullptr, 0.0f, 0.0f, + 0, + 0, TIP_("Reset Black/White point and curves")); - UI_but_func_set(bt, [cumap, cb](bContext &C) { - cumap->preset = CURVE_PRESET_LINE; - for (int a = 0; a < CM_TOT; a++) { - BKE_curvemap_reset(cumap->cm + a, &cumap->clipr, cumap->preset, CURVEMAP_SLOPE_POSITIVE); - } - - cumap->black[0] = cumap->black[1] = cumap->black[2] = 0.0f; - cumap->white[0] = cumap->white[1] = cumap->white[2] = 1.0f; - BKE_curvemapping_set_black_white(cumap, nullptr, nullptr); - - BKE_curvemapping_changed(cumap, false); - rna_update_cb(C, cb); - }); + UI_but_funcN_set(bt, curvemap_buttons_reset, MEM_dupallocN(cb), cumap); } UI_block_funcN_set(block, nullptr, nullptr, nullptr); @@ -4771,13 +4982,18 @@ void uiTemplateCurveMapping(uiLayout *layout, return; } + RNAUpdateCb *cb = MEM_cnew("RNAUpdateCb"); + cb->ptr = *ptr; + cb->prop = prop; + ID *id = cptr.owner_id; UI_block_lock_set(block, (id && ID_IS_LINKED(id)), ERROR_LIBDATA_MESSAGE); - curvemap_buttons_layout( - layout, &cptr, type, levels, brush, neg_slope, tone, RNAUpdateCb{*ptr, prop}); + curvemap_buttons_layout(layout, &cptr, type, levels, brush, neg_slope, tone, cb); UI_block_lock_clear(block); + + MEM_freeN(cb); } /** \} */ @@ -4786,45 +5002,100 @@ void uiTemplateCurveMapping(uiLayout *layout, /** \name Curve Profile Template * \{ */ -static uiBlock *curve_profile_presets_fn(bContext *C, ARegion *region, void *cb_v) +static void CurveProfile_presets_dofunc(bContext *C, void *profile_v, int event) +{ + CurveProfile *profile = static_cast(profile_v); + + profile->preset = event; + BKE_curveprofile_reset(profile); + BKE_curveprofile_update(profile, PROF_UPDATE_NONE); + + ED_undo_push(C, "CurveProfile tools"); + ED_region_tag_redraw(CTX_wm_region(C)); +} + +static uiBlock *CurveProfile_presets_func(bContext *C, ARegion *region, CurveProfile *profile) { - RNAUpdateCb &cb = *static_cast(cb_v); - PointerRNA profile_ptr = RNA_property_pointer_get(&cb.ptr, cb.prop); - CurveProfile *profile = static_cast(profile_ptr.data); short yco = 0; uiBlock *block = UI_block_begin(C, region, __func__, UI_EMBOSS); + UI_block_func_butmenu_set(block, CurveProfile_presets_dofunc, profile); - for (const auto &item : - {std::pair(IFACE_("Default"), PROF_PRESET_LINE), - std::pair(IFACE_("Support Loops"), PROF_PRESET_SUPPORTS), - std::pair(IFACE_("Cornice Molding"), PROF_PRESET_CORNICE), - std::pair(IFACE_("Crown Molding"), PROF_PRESET_CROWN), - std::pair(IFACE_("Steps"), PROF_PRESET_STEPS)}) - { - uiBut *but = uiDefIconTextBut(block, - UI_BTYPE_BUT_MENU, - 1, - ICON_BLANK1, - item.first, - 0, - yco -= UI_UNIT_Y, - 0, - UI_UNIT_Y, - nullptr, - 0.0, - 0.0, - ""); - const eCurveProfilePresets preset = item.second; - UI_but_func_set(but, [profile, cb, preset](bContext &C) { - profile->preset = preset; - BKE_curveprofile_reset(profile); - BKE_curveprofile_update(profile, PROF_UPDATE_NONE); - ED_undo_push(&C, "Reset Curve Profile"); - ED_region_tag_redraw(CTX_wm_region(&C)); - rna_update_cb(C, cb); - }); - } + uiDefIconTextBut(block, + UI_BTYPE_BUT_MENU, + 1, + ICON_BLANK1, + IFACE_("Default"), + 0, + yco -= UI_UNIT_Y, + 0, + UI_UNIT_Y, + nullptr, + 0.0, + 0.0, + 0, + PROF_PRESET_LINE, + ""); + uiDefIconTextBut(block, + UI_BTYPE_BUT_MENU, + 1, + ICON_BLANK1, + IFACE_("Support Loops"), + 0, + yco -= UI_UNIT_Y, + 0, + UI_UNIT_Y, + nullptr, + 0.0, + 0.0, + 0, + PROF_PRESET_SUPPORTS, + ""); + uiDefIconTextBut(block, + UI_BTYPE_BUT_MENU, + 1, + ICON_BLANK1, + IFACE_("Cornice Molding"), + 0, + yco -= UI_UNIT_Y, + 0, + UI_UNIT_Y, + nullptr, + 0.0, + 0.0, + 0, + PROF_PRESET_CORNICE, + ""); + uiDefIconTextBut(block, + UI_BTYPE_BUT_MENU, + 1, + ICON_BLANK1, + IFACE_("Crown Molding"), + 0, + yco -= UI_UNIT_Y, + 0, + UI_UNIT_Y, + nullptr, + 0.0, + 0.0, + 0, + PROF_PRESET_CROWN, + ""); + uiDefIconTextBut(block, + UI_BTYPE_BUT_MENU, + 1, + ICON_BLANK1, + IFACE_("Steps"), + 0, + yco -= UI_UNIT_Y, + 0, + UI_UNIT_Y, + nullptr, + 0.0, + 0.0, + 0, + PROF_PRESET_STEPS, + ""); UI_block_direction_set(block, UI_DIR_DOWN); UI_block_bounds_set_text(block, int(3.0f * UI_UNIT_X)); @@ -4832,56 +5103,71 @@ static uiBlock *curve_profile_presets_fn(bContext *C, ARegion *region, void *cb_ return block; } -static uiBlock *curve_profile_tools_fn(bContext *C, ARegion *region, void *cb_v) +static uiBlock *CurveProfile_buttons_presets(bContext *C, ARegion *region, void *profile_v) { - RNAUpdateCb &cb = *static_cast(cb_v); - PointerRNA profile_ptr = RNA_property_pointer_get(&cb.ptr, cb.prop); - CurveProfile *profile = static_cast(profile_ptr.data); - short yco = 0; + return CurveProfile_presets_func(C, region, (CurveProfile *)profile_v); +} - uiBlock *block = UI_block_begin(C, region, __func__, UI_EMBOSS); +/* Only for CurveProfile tools block */ +enum { + UIPROFILE_FUNC_RESET, + UIPROFILE_FUNC_RESET_VIEW, +}; - { - uiBut *but = uiDefIconTextBut(block, - UI_BTYPE_BUT_MENU, - 1, - ICON_BLANK1, - IFACE_("Reset View"), - 0, - yco -= UI_UNIT_Y, - 0, - UI_UNIT_Y, - nullptr, - 0.0, - 0.0, - ""); - UI_but_func_set(but, [profile](bContext &C) { +static void CurveProfile_tools_dofunc(bContext *C, void *profile_v, int event) +{ + CurveProfile *profile = static_cast(profile_v); + + switch (event) { + case UIPROFILE_FUNC_RESET: /* reset */ + BKE_curveprofile_reset(profile); + BKE_curveprofile_update(profile, PROF_UPDATE_NONE); + break; + case UIPROFILE_FUNC_RESET_VIEW: /* reset view to clipping rect */ BKE_curveprofile_reset_view(profile); - ED_region_tag_redraw(CTX_wm_region(&C)); - }); - } - { - uiBut *but = uiDefIconTextBut(block, - UI_BTYPE_BUT_MENU, - 1, - ICON_BLANK1, - IFACE_("Reset Curve"), - 0, - yco -= UI_UNIT_Y, - 0, - UI_UNIT_Y, - nullptr, - 0.0, - 0.0, - ""); - UI_but_func_set(but, [profile, cb](bContext &C) { - BKE_curveprofile_reset(profile); - BKE_curveprofile_update(profile, PROF_UPDATE_NONE); - ED_undo_push(&C, "Reset Profile"); - ED_region_tag_redraw(CTX_wm_region(&C)); - rna_update_cb(C, cb); - }); + break; } + ED_undo_push(C, "CurveProfile tools"); + ED_region_tag_redraw(CTX_wm_region(C)); +} + +static uiBlock *CurveProfile_tools_func(bContext *C, ARegion *region, CurveProfile *profile) +{ + short yco = 0; + + uiBlock *block = UI_block_begin(C, region, __func__, UI_EMBOSS); + UI_block_func_butmenu_set(block, CurveProfile_tools_dofunc, profile); + + uiDefIconTextBut(block, + UI_BTYPE_BUT_MENU, + 1, + ICON_BLANK1, + IFACE_("Reset View"), + 0, + yco -= UI_UNIT_Y, + 0, + UI_UNIT_Y, + nullptr, + 0.0, + 0.0, + 0, + UIPROFILE_FUNC_RESET_VIEW, + ""); + uiDefIconTextBut(block, + UI_BTYPE_BUT_MENU, + 1, + ICON_BLANK1, + IFACE_("Reset Curve"), + 0, + yco -= UI_UNIT_Y, + 0, + UI_UNIT_Y, + nullptr, + 0.0, + 0.0, + 0, + UIPROFILE_FUNC_RESET, + ""); UI_block_direction_set(block, UI_DIR_DOWN); UI_block_bounds_set_text(block, int(3.0f * UI_UNIT_X)); @@ -4889,20 +5175,27 @@ static uiBlock *curve_profile_tools_fn(bContext *C, ARegion *region, void *cb_v) return block; } -static bool curve_profile_can_zoom_in(CurveProfile *profile) +static uiBlock *CurveProfile_buttons_tools(bContext *C, ARegion *region, void *profile_v) +{ + return CurveProfile_tools_func(C, region, (CurveProfile *)profile_v); +} + +static bool CurveProfile_can_zoom_in(CurveProfile *profile) { return BLI_rctf_size_x(&profile->view_rect) > CURVE_ZOOM_MAX * BLI_rctf_size_x(&profile->clip_rect); } -static bool curve_profile_can_zoom_out(CurveProfile *profile) +static bool CurveProfile_can_zoom_out(CurveProfile *profile) { return BLI_rctf_size_x(&profile->view_rect) < BLI_rctf_size_x(&profile->clip_rect); } -static void curve_profile_zoom_in(bContext *C, CurveProfile *profile) +static void CurveProfile_buttons_zoom_in(bContext *C, void *profile_v, void * /*arg*/) { - if (curve_profile_can_zoom_in(profile)) { + CurveProfile *profile = static_cast(profile_v); + + if (CurveProfile_can_zoom_in(profile)) { const float dx = 0.1154f * BLI_rctf_size_x(&profile->view_rect); profile->view_rect.xmin += dx; profile->view_rect.xmax -= dx; @@ -4914,9 +5207,11 @@ static void curve_profile_zoom_in(bContext *C, CurveProfile *profile) ED_region_tag_redraw(CTX_wm_region(C)); } -static void curve_profile_zoom_out(bContext *C, CurveProfile *profile) +static void CurveProfile_buttons_zoom_out(bContext *C, void *profile_v, void * /*arg*/) { - if (curve_profile_can_zoom_out(profile)) { + CurveProfile *profile = static_cast(profile_v); + + if (CurveProfile_can_zoom_out(profile)) { float d = 0.15f * BLI_rctf_size_x(&profile->view_rect); float d1 = d; @@ -4956,7 +5251,51 @@ static void curve_profile_zoom_out(bContext *C, CurveProfile *profile) ED_region_tag_redraw(CTX_wm_region(C)); } -static void CurveProfile_buttons_layout(uiLayout *layout, PointerRNA *ptr, const RNAUpdateCb &cb) +static void CurveProfile_clipping_toggle(bContext *C, void *cb_v, void *profile_v) +{ + CurveProfile *profile = static_cast(profile_v); + + profile->flag ^= PROF_USE_CLIP; + + BKE_curveprofile_update(profile, PROF_UPDATE_NONE); + rna_update_cb(C, cb_v, nullptr); +} + +static void CurveProfile_buttons_reverse(bContext *C, void *cb_v, void *profile_v) +{ + CurveProfile *profile = static_cast(profile_v); + + BKE_curveprofile_reverse(profile); + BKE_curveprofile_update(profile, PROF_UPDATE_NONE); + rna_update_cb(C, cb_v, nullptr); +} + +static void CurveProfile_buttons_delete(bContext *C, void *cb_v, void *profile_v) +{ + CurveProfile *profile = static_cast(profile_v); + + BKE_curveprofile_remove_by_flag(profile, SELECT); + BKE_curveprofile_update(profile, PROF_UPDATE_NONE); + + rna_update_cb(C, cb_v, nullptr); +} + +static void CurveProfile_buttons_update(bContext *C, void *arg1_v, void *profile_v) +{ + CurveProfile *profile = static_cast(profile_v); + BKE_curveprofile_update(profile, PROF_UPDATE_REMOVE_DOUBLES | PROF_UPDATE_CLIP); + rna_update_cb(C, arg1_v, nullptr); +} + +static void CurveProfile_buttons_reset(bContext *C, void *arg1_v, void *profile_v) +{ + CurveProfile *profile = static_cast(profile_v); + BKE_curveprofile_reset(profile); + BKE_curveprofile_update(profile, PROF_UPDATE_NONE); + rna_update_cb(C, arg1_v, nullptr); +} + +static void CurveProfile_buttons_layout(uiLayout *layout, PointerRNA *ptr, RNAUpdateCb *cb) { CurveProfile *profile = static_cast(ptr->data); uiBut *bt; @@ -4971,19 +5310,16 @@ static void CurveProfile_buttons_layout(uiLayout *layout, PointerRNA *ptr, const /* There is probably potential to use simpler "uiItemR" functions here, but automatic updating * after a preset is selected would be more complicated. */ uiLayout *row = uiLayoutRow(layout, true); - RNAUpdateCb *presets_cb = MEM_new(__func__, cb); bt = uiDefBlockBut(block, - curve_profile_presets_fn, - presets_cb, + CurveProfile_buttons_presets, + profile, IFACE_("Preset"), 0, 0, UI_UNIT_X, UI_UNIT_X, ""); - /* Pass ownership of `presets_cb` to the button. */ - UI_but_funcN_set( - bt, [](bContext *, void *, void *) {}, presets_cb, nullptr); + UI_but_funcN_set(bt, rna_update_cb, MEM_dupallocN(cb), nullptr); /* Show a "re-apply" preset button when it has been changed from the preset. */ if (profile->flag & PROF_DIRTY_PRESET) { @@ -5001,12 +5337,10 @@ static void CurveProfile_buttons_layout(uiLayout *layout, PointerRNA *ptr, const nullptr, 0.0, 0.0, + 0.0, + 0.0, TIP_("Reapply and update the preset, removing changes")); - UI_but_func_set(bt, [profile, cb](bContext &C) { - BKE_curveprofile_reset(profile); - BKE_curveprofile_update(profile, PROF_UPDATE_NONE); - rna_update_cb(C, cb); - }); + UI_but_funcN_set(bt, CurveProfile_buttons_reset, MEM_dupallocN(cb), profile); } } @@ -5028,9 +5362,11 @@ static void CurveProfile_buttons_layout(uiLayout *layout, PointerRNA *ptr, const nullptr, 0.0, 0.0, + 0.0, + 0.0, TIP_("Zoom in")); - UI_but_func_set(bt, [profile](bContext &C) { curve_profile_zoom_in(&C, profile); }); - if (!curve_profile_can_zoom_in(profile)) { + UI_but_func_set(bt, CurveProfile_buttons_zoom_in, profile, nullptr); + if (!CurveProfile_can_zoom_in(profile)) { UI_but_disable(bt, ""); } @@ -5046,9 +5382,11 @@ static void CurveProfile_buttons_layout(uiLayout *layout, PointerRNA *ptr, const nullptr, 0.0, 0.0, + 0.0, + 0.0, TIP_("Zoom out")); - UI_but_func_set(bt, [profile](bContext &C) { curve_profile_zoom_out(&C, profile); }); - if (!curve_profile_can_zoom_out(profile)) { + UI_but_func_set(bt, CurveProfile_buttons_zoom_out, profile, nullptr); + if (!CurveProfile_can_zoom_out(profile)) { UI_but_disable(bt, ""); } @@ -5068,12 +5406,10 @@ static void CurveProfile_buttons_layout(uiLayout *layout, PointerRNA *ptr, const nullptr, 0.0, 0.0, + 0.0, + 0.0, TIP_("Reverse Path")); - UI_but_func_set(bt, [profile, cb](bContext &C) { - BKE_curveprofile_reverse(profile); - BKE_curveprofile_update(profile, PROF_UPDATE_NONE); - rna_update_cb(C, cb); - }); + UI_but_funcN_set(bt, CurveProfile_buttons_reverse, MEM_dupallocN(cb), profile); /* Clipping toggle */ const int icon = (profile->flag & PROF_USE_CLIP) ? ICON_CLIPUV_HLT : ICON_CLIPUV_DEHLT; @@ -5088,18 +5424,15 @@ static void CurveProfile_buttons_layout(uiLayout *layout, PointerRNA *ptr, const nullptr, 0.0, 0.0, + 0.0, + 0.0, TIP_("Toggle Profile Clipping")); - UI_but_func_set(bt, [profile, cb](bContext &C) { - profile->flag ^= PROF_USE_CLIP; - BKE_curveprofile_update(profile, PROF_UPDATE_NONE); - rna_update_cb(C, cb); - }); + UI_but_funcN_set(bt, CurveProfile_clipping_toggle, MEM_dupallocN(cb), profile); /* Reset view, reset curve */ - RNAUpdateCb *tools_cb = MEM_new(__func__, cb); bt = uiDefIconBlockBut(block, - curve_profile_tools_fn, - tools_cb, + CurveProfile_buttons_tools, + profile, 0, ICON_NONE, 0, @@ -5107,11 +5440,9 @@ static void CurveProfile_buttons_layout(uiLayout *layout, PointerRNA *ptr, const UI_UNIT_X, UI_UNIT_X, TIP_("Tools")); - /* Pass ownership of `presets_cb` to the button. */ - UI_but_funcN_set( - bt, [](bContext *, void *, void *) {}, tools_cb, nullptr); + UI_but_funcN_set(bt, rna_update_cb, MEM_dupallocN(cb), nullptr); - UI_block_funcN_set(block, rna_update_cb, MEM_new(__func__, cb), nullptr); + UI_block_funcN_set(block, rna_update_cb, MEM_dupallocN(cb), nullptr); /* The path itself */ int path_width = max_ii(uiLayoutGetWidth(layout), UI_UNIT_X); @@ -5129,6 +5460,8 @@ static void CurveProfile_buttons_layout(uiLayout *layout, PointerRNA *ptr, const profile, 0.0f, 1.0f, + -1, + 0, ""); /* Position sliders for (first) selected point */ @@ -5197,10 +5530,7 @@ static void CurveProfile_buttons_layout(uiLayout *layout, PointerRNA *ptr, const ""); UI_but_number_step_size_set(bt, 1); UI_but_number_precision_set(bt, 5); - UI_but_func_set(bt, [profile, cb](bContext &C) { - BKE_curveprofile_update(profile, PROF_UPDATE_REMOVE_DOUBLES | PROF_UPDATE_CLIP); - rna_update_cb(C, cb); - }); + UI_but_funcN_set(bt, CurveProfile_buttons_update, MEM_dupallocN(cb), profile); if (point_last_or_first) { UI_but_flag_enable(bt, UI_BUT_DISABLED); } @@ -5218,10 +5548,7 @@ static void CurveProfile_buttons_layout(uiLayout *layout, PointerRNA *ptr, const ""); UI_but_number_step_size_set(bt, 1); UI_but_number_precision_set(bt, 5); - UI_but_func_set(bt, [profile, cb](bContext &C) { - BKE_curveprofile_update(profile, PROF_UPDATE_REMOVE_DOUBLES | PROF_UPDATE_CLIP); - rna_update_cb(C, cb); - }); + UI_but_funcN_set(bt, CurveProfile_buttons_update, MEM_dupallocN(cb), profile); if (point_last_or_first) { UI_but_flag_enable(bt, UI_BUT_DISABLED); } @@ -5238,12 +5565,10 @@ static void CurveProfile_buttons_layout(uiLayout *layout, PointerRNA *ptr, const nullptr, 0.0, 0.0, + 0.0, + 0.0, TIP_("Delete points")); - UI_but_func_set(bt, [profile, cb](bContext &C) { - BKE_curveprofile_remove_by_flag(profile, SELECT); - BKE_curveprofile_update(profile, PROF_UPDATE_NONE); - rna_update_cb(C, cb); - }); + UI_but_funcN_set(bt, CurveProfile_buttons_delete, MEM_dupallocN(cb), profile); if (point_last_or_first) { UI_but_flag_enable(bt, UI_BUT_DISABLED); } @@ -5278,12 +5603,19 @@ void uiTemplateCurveProfile(uiLayout *layout, PointerRNA *ptr, const char *propn return; } + /* Share update functionality with the CurveMapping widget template. */ + RNAUpdateCb *cb = MEM_cnew("RNAUpdateCb"); + cb->ptr = *ptr; + cb->prop = prop; + ID *id = cptr.owner_id; UI_block_lock_set(block, (id && ID_IS_LINKED(id)), ERROR_LIBDATA_MESSAGE); - CurveProfile_buttons_layout(layout, &cptr, RNAUpdateCb{*ptr, prop}); + CurveProfile_buttons_layout(layout, &cptr, cb); UI_block_lock_clear(block); + + MEM_freeN(cb); } /** \} */ @@ -5381,6 +5713,7 @@ void uiTemplateColorPicker(uiLayout *layout, if (lock_luminosity) { float color[4]; /* in case of alpha */ RNA_property_float_get_array(ptr, prop, color); + but->a2 = len_v3(color); cpicker->luminosity_lock_value = len_v3(color); } @@ -5794,7 +6127,7 @@ static std::string progress_tooltip_func(bContext * /*C*/, void *argN, const cha /* create tooltip text and associate it with the job */ char elapsed_str[32]; char remaining_str[32] = "Unknown"; - const double elapsed = BLI_time_now_seconds() - WM_jobs_starttime(wm, owner); + const double elapsed = BLI_check_seconds_timer() - WM_jobs_starttime(wm, owner); BLI_timecode_string_from_time_simple(elapsed_str, sizeof(elapsed_str), elapsed); if (progress) { @@ -5968,6 +6301,8 @@ void uiTemplateRunningJobs(uiLayout *layout, bContext *C) nullptr, 0.0f, 0.0f, + 0.0f, + 0.0f, ""); /* stick progress bar and cancel button together */ @@ -5992,13 +6327,15 @@ void uiTemplateRunningJobs(uiLayout *layout, bContext *C) nullptr, 0.0f, 0.0f, + 0.0f, + 0, nullptr); but_progress->progress_factor = progress; UI_but_func_tooltip_set(but_progress, progress_tooltip_func, tip_arg, MEM_freeN); } - if (!wm->runtime->is_interface_locked) { + if (!wm->is_interface_locked) { uiDefIconTextBut(block, UI_BTYPE_BUT, handle_event, @@ -6011,6 +6348,8 @@ void uiTemplateRunningJobs(uiLayout *layout, bContext *C) nullptr, 0.0f, 0.0f, + 0, + 0, TIP_("Stop this job")); } } @@ -6028,6 +6367,8 @@ void uiTemplateRunningJobs(uiLayout *layout, bContext *C) nullptr, 0.0f, 0.0f, + 0, + 0, TIP_("Stop animation playback")); } } @@ -6095,6 +6436,8 @@ void uiTemplateReportsBanner(uiLayout *layout, bContext *C) nullptr, 0.0f, 0.0f, + 0, + 0, ""); /* UI_BTYPE_ROUNDBOX's bg color is set in but->col. */ copy_v4_v4_uchar(but->col, report_icon_color); @@ -6111,6 +6454,8 @@ void uiTemplateReportsBanner(uiLayout *layout, bContext *C) nullptr, 0.0f, 0.0f, + 0, + 0, ""); /* Use icon background at low opacity to highlight, but still contrasting with area TH_TEXT. */ copy_v3_v3_uchar(but->col, report_icon_color); @@ -6235,6 +6580,8 @@ void uiTemplateStatusInfo(uiLayout *layout, bContext *C) nullptr, 0.0f, 0.0f, + 0, + 0, ""); /* UI_BTYPE_ROUNDBOX's bg color is set in but->col. */ UI_GetThemeColorType4ubv(TH_INFO_WARNING, SPACE_INFO, but->col); @@ -6251,6 +6598,8 @@ void uiTemplateStatusInfo(uiLayout *layout, bContext *C) nullptr, 0.0f, 0.0f, + 0, + 0, ""); /* Use icon background at low opacity to highlight, but still contrasting with area TH_TEXT. */ @@ -6279,6 +6628,8 @@ void uiTemplateStatusInfo(uiLayout *layout, bContext *C) nullptr, 0.0f, 0.0f, + 0.0f, + 0.0f, compat_error_msg); UI_GetThemeColorType4ubv(TH_INFO_WARNING_TEXT, SPACE_INFO, but->col); but->col[3] = 255; /* This theme color is RBG only, so have to set alpha here. */ @@ -6295,6 +6646,8 @@ void uiTemplateStatusInfo(uiLayout *layout, bContext *C) nullptr, 0.0f, 0.0f, + 0.0f, + 0.0f, compat_error_msg); UI_block_emboss_set(block, previous_emboss); @@ -6555,7 +6908,7 @@ void uiTemplateNodeSocket(uiLayout *layout, bContext * /*C*/, const float color[ * Eventually it should be possible to use theme colors for this purpose, * but this requires a better design for extendable color palettes in user preferences. */ uiBut *but = uiDefBut( - block, UI_BTYPE_NODE_SOCKET, 0, "", 0, 0, UI_UNIT_X, UI_UNIT_Y, nullptr, 0, 0, ""); + block, UI_BTYPE_NODE_SOCKET, 0, "", 0, 0, UI_UNIT_X, UI_UNIT_Y, nullptr, 0, 0, 0, 0, ""); rgba_float_to_uchar(but->col, color); UI_block_align_end(block); diff --git a/source/blender/editors/interface/interface_utils.cc b/source/blender/editors/interface/interface_utils.cc index 026c5e714d1..3d5aaac5fdd 100644 --- a/source/blender/editors/interface/interface_utils.cc +++ b/source/blender/editors/interface/interface_utils.cc @@ -10,7 +10,6 @@ #include #include #include -#include #include "DNA_object_types.h" #include "DNA_screen_types.h" @@ -21,12 +20,13 @@ #include "BLI_string.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_context.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_idprop.h" #include "BKE_lib_id.hh" +#include "BKE_report.h" #include "BKE_screen.hh" #include "MEM_guardedalloc.h" @@ -245,7 +245,8 @@ uiBut *uiDefAutoButR(uiBlock *block, case PROP_COLLECTION: { char text[256]; SNPRINTF(text, IFACE_("%d items"), RNA_property_collection_length(ptr, prop)); - but = uiDefBut(block, UI_BTYPE_LABEL, 0, text, x, y, width, height, nullptr, 0, 0, nullptr); + but = uiDefBut( + block, UI_BTYPE_LABEL, 0, text, x, y, width, height, nullptr, 0, 0, 0, 0, nullptr); UI_but_flag_enable(but, UI_BUT_DISABLED); break; } @@ -365,46 +366,51 @@ void UI_but_func_identity_compare_set(uiBut *but, uiButIdentityCompareFunc cmp_f /* *** RNA collection search menu *** */ struct CollItemSearch { + CollItemSearch *next, *prev; void *data; - std::string name; + char *name; int index; int iconid; - int name_prefix_offset; bool is_id; - bool has_sep_char; + int name_prefix_offset; + uint has_sep_char : 1; }; -static bool add_collection_search_item(CollItemSearch &cis, +static bool add_collection_search_item(CollItemSearch *cis, const bool requires_exact_data_name, const bool has_id_icon, uiSearchItems *items) { + char name_buf[UI_MAX_DRAW_STR]; - /* If no item has its own icon to display, libraries can use the library icons rather than the + /* 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(static_cast(cis.data)); - char name_buf[UI_MAX_DRAW_STR]; + 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(static_cast(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, static_cast(cis.data), false, UI_SEP_CHAR, &name_prefix_offset); - cis.name = name_buf; + name_buf, static_cast(cis->data), false, UI_SEP_CHAR, &name_prefix_offset); + const int name_buf_len = strlen(name_buf); + BLI_assert(name_buf_len <= strlen(cis->name)); + memcpy(cis->name, name_buf, name_buf_len + 1); } return UI_search_item_add(items, - cis.name.c_str(), - cis.data, - cis.iconid, - cis.has_sep_char ? int(UI_BUT_HAS_SEP_CHAR) : 0, + cis->name, + cis->data, + cis->iconid, + cis->has_sep_char ? int(UI_BUT_HAS_SEP_CHAR) : 0, name_prefix_offset); } void ui_rna_collection_search_update_fn( const bContext *C, void *arg, const char *str, uiSearchItems *items, const bool is_first) { - using namespace blender; uiRNACollectionSearch *data = static_cast(arg); const int flag = RNA_property_flag(data->target_prop); + ListBase *items_list = MEM_cnew("items_list"); 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 @@ -412,14 +418,16 @@ void ui_rna_collection_search_update_fn( const bool requires_exact_data_name = !is_ptr_target; const bool skip_filter = is_first; char name_buf[UI_MAX_DRAW_STR]; + char *name; bool has_id_icon = false; - /* The string search API requires pointer stability. */ - Vector> items_list; + blender::ui::string_search::StringSearch search; if (data->search_prop != nullptr) { /* 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) { if (itemptr.data == data->target_ptr.owner_id) { continue; @@ -438,7 +446,6 @@ void ui_rna_collection_search_update_fn( bool has_sep_char = false; const bool is_id = itemptr.type && RNA_struct_is_ID(itemptr.type); - char *name; if (is_id) { iconid = ui_id_icon_get(C, static_cast(itemptr.data), false); if (!ELEM(iconid, 0, ICON_BLANK1)) { @@ -462,19 +469,24 @@ void ui_rna_collection_search_update_fn( } if (name) { - auto cis = std::make_unique(); + CollItemSearch *cis = MEM_cnew(__func__); cis->data = itemptr.data; - cis->name = name; - cis->index = items_list.size(); + 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; - items_list.append(std::move(cis)); + if (!skip_filter) { + search.add(name, cis); + } + BLI_addtail(items_list, cis); if (name != name_buf) { MEM_freeN(name); } } + + item_index++; } RNA_PROP_END; } @@ -484,66 +496,85 @@ void ui_rna_collection_search_update_fn( data->target_prop); BLI_assert(search_flag & PROP_STRING_SEARCH_SUPPORTED); - const bool show_extra_info = (G.debug_value == 102); + struct SearchVisitUserData { + blender::string_search::StringSearch *search; + bool skip_filter; + int item_index; + ListBase *items_list; + const char *func_id; + } user_data = {nullptr}; - RNA_property_string_search(C, - &data->target_ptr, - data->target_prop, - str, - [&](StringPropertySearchVisitParams visit_params) { - auto cis = std::make_unique(); + user_data.search = &search; + user_data.skip_filter = skip_filter; + user_data.items_list = items_list; + user_data.func_id = __func__; - cis->data = nullptr; - if (visit_params.info && show_extra_info) { - cis->name = fmt::format("{}" UI_SEP_CHAR_S "{}", - visit_params.text, - *visit_params.info); - } - else { - cis->name = std::move(visit_params.text); - } + RNA_property_string_search( + C, + &data->target_ptr, + data->target_prop, + str, + [](void *user_data, const StringPropertySearchVisitParams *visit_params) { + const bool show_extra_info = (G.debug_value == 102); - cis->index = items_list.size(); - cis->iconid = ICON_NONE; - cis->is_id = false; - cis->name_prefix_offset = 0; - cis->has_sep_char = visit_params.info.has_value(); - items_list.append(std::move(cis)); - }); + SearchVisitUserData *search_data = (SearchVisitUserData *)user_data; + CollItemSearch *cis = MEM_cnew(search_data->func_id); + cis->data = nullptr; + if (visit_params->info && show_extra_info) { + cis->name = BLI_sprintfN( + "%s" UI_SEP_CHAR_S "%s", visit_params->text, visit_params->info); + } + else { + cis->name = BLI_strdup(visit_params->text); + } + cis->index = search_data->item_index; + cis->iconid = ICON_NONE; + cis->is_id = false; + cis->name_prefix_offset = 0; + cis->has_sep_char = visit_params->info != nullptr; + if (!search_data->skip_filter) { + search_data->search->add(visit_params->text, cis); + } + BLI_addtail(search_data->items_list, cis); + search_data->item_index++; + }, + (void *)&user_data); if (search_flag & PROP_STRING_SEARCH_SORT) { - std::sort( - items_list.begin(), - items_list.end(), - [](const std::unique_ptr &a, const std::unique_ptr &b) { - return BLI_strcasecmp_natural(a->name.c_str(), b->name.c_str()) < 0; - }); - for (const int i : items_list.index_range()) { - items_list[i]->index = i; + BLI_listbase_sort(items_list, [](const void *a_, const void *b_) -> int { + const CollItemSearch *cis_a = (const CollItemSearch *)a_; + const CollItemSearch *cis_b = (const CollItemSearch *)b_; + return BLI_strcasecmp_natural(cis_a->name, cis_b->name); + }); + int i = 0; + LISTBASE_FOREACH (CollItemSearch *, cis, items_list) { + cis->index = i; + i++; } } } if (skip_filter) { - for (std::unique_ptr &cis : items_list) { - if (!add_collection_search_item(*cis, requires_exact_data_name, has_id_icon, items)) { + LISTBASE_FOREACH (CollItemSearch *, cis, items_list) { + if (!add_collection_search_item(cis, requires_exact_data_name, has_id_icon, items)) { break; } } } else { - ui::string_search::StringSearch search; - for (std::unique_ptr &cis : items_list) { - search.add(cis->name, cis.get()); - } - - const Vector filtered_items = search.query(str); + const blender::Vector filtered_items = search.query(str); for (CollItemSearch *cis : filtered_items) { - if (!add_collection_search_item(*cis, requires_exact_data_name, has_id_icon, items)) { + if (!add_collection_search_item(cis, requires_exact_data_name, has_id_icon, items)) { break; } } } + + LISTBASE_FOREACH (CollItemSearch *, cis, items_list) { + MEM_freeN(cis->name); + } + BLI_freelistN(items_list); + MEM_freeN(items_list); } int UI_icon_from_id(const ID *id) @@ -692,27 +723,35 @@ int UI_calc_float_precision(int prec, double value) return prec; } -std::optional UI_but_online_manual_id(const uiBut *but) +bool UI_but_online_manual_id(const uiBut *but, char *r_str, size_t str_maxncpy) { if (but->rnapoin.data && but->rnaprop) { - return fmt::format( - "{}.{}", RNA_struct_identifier(but->rnapoin.type), RNA_property_identifier(but->rnaprop)); + BLI_snprintf(r_str, + str_maxncpy, + "%s.%s", + RNA_struct_identifier(but->rnapoin.type), + RNA_property_identifier(but->rnaprop)); + return true; } if (but->optype) { - char idname[OP_MAX_TYPENAME]; - const size_t idname_len = WM_operator_py_idname(idname, but->optype->idname); - return std::string(idname, idname_len); + WM_operator_py_idname(r_str, but->optype->idname); + return true; } - return std::nullopt; + *r_str = '\0'; + return false; } -std::optional UI_but_online_manual_id_from_active(const bContext *C) +bool UI_but_online_manual_id_from_active(const bContext *C, char *r_str, size_t str_maxncpy) { - if (uiBut *but = UI_context_active_but_get(C)) { - return UI_but_online_manual_id(but); + uiBut *but = UI_context_active_but_get(C); + + if (but) { + return UI_but_online_manual_id(but, r_str, str_maxncpy); } - return std::nullopt; + + *r_str = '\0'; + return false; } /* -------------------------------------------------------------------- */ @@ -985,31 +1024,33 @@ static bool ui_key_event_property_match(const char *opname, return match; } -std::optional UI_key_event_operator_string(const bContext *C, - const char *opname, - IDProperty *properties, - const bool is_strict) +const char *UI_key_event_operator_string(const bContext *C, + const char *opname, + IDProperty *properties, + const bool is_strict, + char *result, + const int result_maxncpy) { /* NOTE: currently only actions on UI Lists are supported (for the asset manager). * Other kinds of events can be supported as needed. */ ARegion *region = CTX_wm_region(C); if (region == nullptr) { - return std::nullopt; + return nullptr; } /* Early exit regions which don't have UI-Lists. */ if ((region->type->keymapflag & ED_KEYMAP_UI) == 0) { - return std::nullopt; + return nullptr; } uiBut *but = UI_region_active_but_get(region); if (but == nullptr) { - return std::nullopt; + return nullptr; } if (but->type != UI_BTYPE_PREVIEW_TILE) { - return std::nullopt; + return nullptr; } short event_val = KM_NOTHING; @@ -1049,11 +1090,12 @@ std::optional UI_key_event_operator_string(const bContext *C, } if ((event_val != KM_NOTHING) && (event_type != KM_NOTHING)) { - return WM_keymap_item_raw_to_string( - false, false, false, false, 0, event_val, event_type, false); + WM_keymap_item_raw_to_string( + false, false, false, false, 0, event_val, event_type, false, result, result_maxncpy); + return result; } - return std::nullopt; + return nullptr; } /** \} */ diff --git a/source/blender/editors/interface/interface_widgets.cc b/source/blender/editors/interface/interface_widgets.cc index 439dc89ab2f..3e775ccbb99 100644 --- a/source/blender/editors/interface/interface_widgets.cc +++ b/source/blender/editors/interface/interface_widgets.cc @@ -1323,8 +1323,9 @@ static void widget_draw_icon( } else if (but->type == UI_BTYPE_LABEL) { /* extra feature allows more alpha blending */ - const uiButLabel *but_label = reinterpret_cast(but); - alpha *= but_label->alpha_factor; + if (but->a1 == 1.0f) { + alpha *= but->a2; + } } else if (ELEM(but->type, UI_BTYPE_BUT, UI_BTYPE_DECORATOR)) { uiWidgetStateInfo state = {0}; @@ -3385,12 +3386,10 @@ static void ui_draw_but_HSV_v(uiBut *but, const rcti *rect) UI_draw_roundbox_4fv_ex(&rectf, col2, nullptr, 0.0f, inner1, U.pixelsize, 0.0f); } -/** Separator line. */ -static void ui_draw_separator(const uiWidgetColors *wcol, uiBut *but, const rcti *rect) +/** Separator for menus. */ +static void ui_draw_separator(const rcti *rect, const uiWidgetColors *wcol) { - const uiButSeparatorLine *but_line = static_cast(but); - const bool vertical = but_line->is_vertical; - const int mid = vertical ? BLI_rcti_cent_x(rect) : BLI_rcti_cent_y(rect); + const int y = rect->ymin + BLI_rcti_size_y(rect) / 2; const uchar col[4] = { wcol->text[0], wcol->text[1], @@ -3407,16 +3406,8 @@ static void ui_draw_separator(const uiWidgetColors *wcol, uiBut *but, const rcti GPU_line_width(1.0f); immBegin(GPU_PRIM_LINES, 2); - - if (vertical) { - immVertex2f(pos, mid, rect->ymin); - immVertex2f(pos, mid, rect->ymax); - } - else { - immVertex2f(pos, rect->xmin, mid); - immVertex2f(pos, rect->xmax, mid); - } - + immVertex2f(pos, rect->xmin, y); + immVertex2f(pos, rect->xmax, y); immEnd(); GPU_blend(GPU_BLEND_NONE); @@ -3692,13 +3683,10 @@ static void widget_scroll(uiBut *but, int /*roundboxalign*/, const float /*zoom*/) { - const uiButScrollBar *but_scroll = reinterpret_cast(but); - const float height = but_scroll->visual_height; - /* calculate slider part */ const float value = float(ui_but_value_get(but)); - const float size = max_ff((but->softmax + height - but->softmin), 2.0f); + const float size = max_ff((but->softmax + but->a1 - but->softmin), 2.0f); /* position */ rcti rect1 = *rect; @@ -3709,7 +3697,7 @@ static void widget_scroll(uiBut *but, if (horizontal) { const float fac = BLI_rcti_size_x(rect) / size; rect1.xmin = rect1.xmin + ceilf(fac * (value - but->softmin)); - rect1.xmax = rect1.xmin + ceilf(fac * (height - but->softmin)); + rect1.xmax = rect1.xmin + ceilf(fac * (but->a1 - but->softmin)); /* Ensure minimum size. */ const float min = BLI_rcti_size_y(rect); @@ -3726,7 +3714,7 @@ static void widget_scroll(uiBut *but, else { const float fac = BLI_rcti_size_y(rect) / size; rect1.ymax = rect1.ymax - ceilf(fac * (value - but->softmin)); - rect1.ymin = rect1.ymax - ceilf(fac * (height - but->softmin)); + rect1.ymin = rect1.ymax - ceilf(fac * (but->a1 - but->softmin)); /* Ensure minimum size. */ const float min = BLI_rcti_size_x(rect); @@ -4881,9 +4869,7 @@ void ui_draw_but(const bContext *C, ARegion *region, uiStyle *style, uiBut *but, case UI_BTYPE_SEPR: break; case UI_BTYPE_SEPR_LINE: - /* Add horizontal padding between the line and menu sides. */ - BLI_rcti_pad(rect, int(-7.0f * UI_SCALE_FAC), 0); - ui_draw_separator(&tui->wcol_menu_item, but, rect); + ui_draw_separator(rect, &tui->wcol_menu_item); break; default: { const bool use_unpadded = (but->flag & UI_BUT_ICON_PREVIEW) || @@ -4935,10 +4921,8 @@ void ui_draw_but(const bContext *C, ARegion *region, uiStyle *style, uiBut *but, break; case UI_BTYPE_SEPR: - case UI_BTYPE_SEPR_SPACER: - break; case UI_BTYPE_SEPR_LINE: - ui_draw_separator(&tui->wcol_menu_item, but, rect); + case UI_BTYPE_SEPR_SPACER: break; case UI_BTYPE_BUT: @@ -5336,10 +5320,17 @@ void ui_draw_popover_back(ARegion *region, uiStyle * /*style*/, uiBlock *block, { uiWidgetType *wt = widget_type(UI_WTYPE_MENU_BACK); - float mval_origin[2] = {float(block->bounds_offset[0]), float(block->bounds_offset[1])}; - ui_window_to_block_fl(region, block, &mval_origin[0], &mval_origin[1]); - ui_draw_popover_back_impl( - wt->wcol_theme, rect, block->direction, U.widget_unit / block->aspect, mval_origin); + if (block) { + float mval_origin[2] = {float(block->bounds_offset[0]), float(block->bounds_offset[1])}; + ui_window_to_block_fl(region, block, &mval_origin[0], &mval_origin[1]); + ui_draw_popover_back_impl( + wt->wcol_theme, rect, block->direction, U.widget_unit / block->aspect, mval_origin); + } + else { + const float zoom = 1.0f / block->aspect; + wt->state(wt, &STATE_INFO_NULL, UI_EMBOSS_UNDEFINED); + wt->draw_block(&wt->wcol, rect, 0, 0, zoom); + } ui_draw_clip_tri(block, rect, wt); } diff --git a/source/blender/editors/interface/resources.cc b/source/blender/editors/interface/resources.cc index 390eff0c935..66eb3b8a3dd 100644 --- a/source/blender/editors/interface/resources.cc +++ b/source/blender/editors/interface/resources.cc @@ -25,7 +25,7 @@ #include "BKE_main.hh" #include "BKE_mesh_runtime.hh" -#include "BLO_userdef_default.h" +#include "BLO_readfile.h" /* for UserDef version patching. */ #include "BLF_api.hh" diff --git a/source/blender/editors/interface/view2d.cc b/source/blender/editors/interface/view2d.cc index b86907b685d..5251388bde5 100644 --- a/source/blender/editors/interface/view2d.cc +++ b/source/blender/editors/interface/view2d.cc @@ -16,15 +16,18 @@ #include "DNA_scene_types.h" #include "DNA_userdef_types.h" +#include "BLI_easing.h" #include "BLI_link_utils.h" #include "BLI_listbase.h" #include "BLI_math_matrix.h" #include "BLI_memarena.h" #include "BLI_rect.h" +#include "BLI_string.h" +#include "BLI_timecode.h" #include "BLI_utildefines.h" #include "BKE_context.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_screen.hh" #include "GPU_immediate.h" @@ -40,6 +43,7 @@ #include "UI_interface.hh" #include "UI_view2d.hh" +#include "interface_intern.hh" #include "view2d_intern.hh" static void ui_view2d_curRect_validate_resize(View2D *v2d, bool resize); diff --git a/source/blender/editors/interface/view2d_draw.cc b/source/blender/editors/interface/view2d_draw.cc index 1d4e730ab5b..d44972456f1 100644 --- a/source/blender/editors/interface/view2d_draw.cc +++ b/source/blender/editors/interface/view2d_draw.cc @@ -34,6 +34,8 @@ #include "UI_interface.hh" #include "UI_view2d.hh" +#include "interface_intern.hh" + /* Compute display grid resolution ********************************************************/ diff --git a/source/blender/editors/interface/view2d_edge_pan.cc b/source/blender/editors/interface/view2d_edge_pan.cc index f9aa4e39c65..7fd47133647 100644 --- a/source/blender/editors/interface/view2d_edge_pan.cc +++ b/source/blender/editors/interface/view2d_edge_pan.cc @@ -18,6 +18,7 @@ #include "RNA_access.hh" #include "RNA_define.hh" +#include "UI_interface.hh" #include "UI_view2d.hh" #include "WM_api.hh" @@ -98,7 +99,7 @@ void UI_view2d_edge_pan_reset(View2DEdgePanData *vpd) { vpd->edge_pan_start_time_x = 0.0; vpd->edge_pan_start_time_y = 0.0; - vpd->edge_pan_last_time = BLI_time_now_seconds(); + vpd->edge_pan_last_time = BLI_check_seconds_timer(); vpd->initial_rect = vpd->region->v2d.cur; } @@ -250,7 +251,7 @@ void UI_view2d_edge_pan_apply(bContext *C, View2DEdgePanData *vpd, const int xy[ } } - const double current_time = BLI_time_now_seconds(); + const double current_time = BLI_check_seconds_timer(); edge_pan_manage_delay_timers(vpd, pan_dir_x, pan_dir_y, current_time); /* Calculate the delta since the last time the operator was called. */ diff --git a/source/blender/editors/interface/view2d_gizmo_navigate.cc b/source/blender/editors/interface/view2d_gizmo_navigate.cc index 3a13616a0e2..c94f316df58 100644 --- a/source/blender/editors/interface/view2d_gizmo_navigate.cc +++ b/source/blender/editors/interface/view2d_gizmo_navigate.cc @@ -13,6 +13,7 @@ #include "ED_gizmo_library.hh" #include "ED_screen.hh" +#include "UI_interface.hh" #include "UI_resources.hh" #include "MEM_guardedalloc.h" diff --git a/source/blender/editors/interface/view2d_ops.cc b/source/blender/editors/interface/view2d_ops.cc index 907d8caa265..f63e8c480ac 100644 --- a/source/blender/editors/interface/view2d_ops.cc +++ b/source/blender/editors/interface/view2d_ops.cc @@ -13,6 +13,7 @@ #include "DNA_userdef_types.h" #include "DNA_windowmanager_types.h" +#include "BLI_blenlib.h" #include "BLI_math_base.h" #include "BLI_math_vector.h" #include "BLI_time.h" /* USER_ZOOM_CONTINUE */ @@ -1031,7 +1032,7 @@ static void view_zoomdrag_apply(bContext *C, wmOperator *op) /* Check if the 'timer' is initialized, as zooming with the trackpad * never uses the "Continuous" zoom method, and the 'timer' is not initialized. */ if ((U.viewzoom == USER_ZOOM_CONTINUE) && vzd->timer) { /* XXX store this setting as RNA prop? */ - const double time = BLI_time_now_seconds(); + const double time = BLI_check_seconds_timer(); const float time_step = float(time - vzd->timer_lastdraw); dx *= time_step * 5.0f; @@ -1231,7 +1232,7 @@ static int view_zoomdrag_invoke(bContext *C, wmOperator *op, const wmEvent *even if (U.viewzoom == USER_ZOOM_CONTINUE) { /* needs a timer to continue redrawing */ vzd->timer = WM_event_timer_add(CTX_wm_manager(C), window, TIMER, 0.01f); - vzd->timer_lastdraw = BLI_time_now_seconds(); + vzd->timer_lastdraw = BLI_check_seconds_timer(); } return OPERATOR_RUNNING_MODAL; diff --git a/source/blender/editors/interface/views/abstract_view.cc b/source/blender/editors/interface/views/abstract_view.cc index ed2cedb8d39..c218de8b127 100644 --- a/source/blender/editors/interface/views/abstract_view.cc +++ b/source/blender/editors/interface/views/abstract_view.cc @@ -38,20 +38,23 @@ void AbstractView::update_from_old(uiBlock &new_block) return; } - AbstractView *old_view = ui_block_view_find_matching_in_old_block(new_block, *this); - if (old_view == nullptr) { + uiViewHandle *old_view_handle = ui_block_view_find_matching_in_old_block( + &new_block, reinterpret_cast(this)); + if (old_view_handle == nullptr) { /* Initial construction, nothing to update. */ is_reconstructed_ = true; return; } + AbstractView &old_view = reinterpret_cast(*old_view_handle); + /* Update own persistent data. */ /* Keep the rename buffer persistent while renaming! The rename button uses the buffer's * pointer to identify itself over redraws. */ - rename_buffer_ = std::move(old_view->rename_buffer_); - old_view->rename_buffer_ = nullptr; + rename_buffer_ = std::move(old_view.rename_buffer_); + old_view.rename_buffer_ = nullptr; - this->update_children_from_old(*old_view); + update_children_from_old(old_view); /* Finished (re-)constructing the tree. */ is_reconstructed_ = true; @@ -66,7 +69,7 @@ void AbstractView::update_from_old(uiBlock &new_block) void AbstractView::change_state_delayed() { BLI_assert_msg( - this->is_reconstructed(), + is_reconstructed(), "These state changes are supposed to be delayed until reconstruction is completed"); /* Debug-only sanity check: Ensure only one item requests to be active. */ @@ -82,7 +85,7 @@ void AbstractView::change_state_delayed() }); #endif - this->foreach_view_item([](AbstractViewItem &item) { item.change_state_delayed(); }); + foreach_view_item([](AbstractViewItem &item) { item.change_state_delayed(); }); } /** \} */ @@ -126,7 +129,7 @@ bool AbstractView::is_renaming() const bool AbstractView::begin_renaming() { - if (this->is_renaming()) { + if (is_renaming()) { return false; } @@ -157,3 +160,25 @@ std::optional AbstractView::get_bounds() const /** \} */ } // namespace blender::ui + +/* ---------------------------------------------------------------------- */ +/** \name General API functions + * \{ */ + +namespace blender::ui { + +std::unique_ptr view_drop_target(uiViewHandle *view_handle) +{ + AbstractView &view = reinterpret_cast(*view_handle); + return view.create_drop_target(); +} + +} // namespace blender::ui + +bool UI_view_begin_filtering(const bContext *C, const uiViewHandle *view_handle) +{ + const ui::AbstractView &view = reinterpret_cast(*view_handle); + return view.begin_filtering(*C); +} + +/** \} */ diff --git a/source/blender/editors/interface/views/abstract_view_item.cc b/source/blender/editors/interface/views/abstract_view_item.cc index 62484c5ea4d..3dcbe3bc748 100644 --- a/source/blender/editors/interface/views/abstract_view_item.cc +++ b/source/blender/editors/interface/views/abstract_view_item.cc @@ -9,6 +9,7 @@ #include "BKE_context.hh" #include "BLI_listbase.h" +#include "BLI_string.h" #include "WM_api.hh" @@ -200,6 +201,8 @@ void AbstractViewItem::add_rename_button(uiBlock &block) view.get_rename_buffer().data(), 1.0f, view.get_rename_buffer().size(), + 0, + 0, ""); /* Gotta be careful with what's passed to the `arg1` here. Any view data will be freed once the @@ -316,6 +319,18 @@ bool AbstractViewItem::is_active() const /** \} */ +/* ---------------------------------------------------------------------- */ +/** \name General API functions + * \{ */ + +std::unique_ptr view_item_drop_target(uiViewItemHandle *item_handle) +{ + AbstractViewItem &item = reinterpret_cast(*item_handle); + return item.create_item_drop_target(); +} + +/** \} */ + } // namespace blender::ui /* ---------------------------------------------------------------------- */ @@ -343,54 +358,101 @@ class ViewItemAPIWrapper { { std::swap(a.view_item_but_, b.view_item_but_); } + + static bool can_rename(const AbstractViewItem &item) + { + const AbstractView &view = item.get_view(); + return !view.is_renaming() && item.supports_renaming(); + } + + static bool supports_drag(const AbstractViewItem &item) + { + return item.create_drag_controller() != nullptr; + } + + static bool drag_start(bContext &C, const AbstractViewItem &item) + { + const std::unique_ptr drag_controller = + item.create_drag_controller(); + if (!drag_controller) { + return false; + } + + WM_event_start_drag(&C, + ICON_NONE, + drag_controller->get_drag_type(), + drag_controller->create_drag_data(), + 0, + WM_DRAG_FREE_DATA); + drag_controller->on_drag_start(); + + return true; + } }; } // namespace blender::ui using namespace blender::ui; -bool UI_view_item_matches(const AbstractViewItem &a, const AbstractViewItem &b) +bool UI_view_item_is_interactive(const uiViewItemHandle *item_handle) { + const AbstractViewItem &item = reinterpret_cast(*item_handle); + return item.is_interactive(); +} + +bool UI_view_item_is_active(const uiViewItemHandle *item_handle) +{ + const AbstractViewItem &item = reinterpret_cast(*item_handle); + return item.is_active(); +} + +bool UI_view_item_matches(const uiViewItemHandle *a_handle, const uiViewItemHandle *b_handle) +{ + const AbstractViewItem &a = reinterpret_cast(*a_handle); + const AbstractViewItem &b = reinterpret_cast(*b_handle); return ViewItemAPIWrapper::matches(a, b); } -void ui_view_item_swap_button_pointers(AbstractViewItem &a, AbstractViewItem &b) +void ui_view_item_swap_button_pointers(uiViewItemHandle *a_handle, uiViewItemHandle *b_handle) { + if (!a_handle || !b_handle) { + return; + } + AbstractViewItem &a = reinterpret_cast(*a_handle); + AbstractViewItem &b = reinterpret_cast(*b_handle); ViewItemAPIWrapper::swap_button_pointers(a, b); } -bool UI_view_item_can_rename(const AbstractViewItem &item) +bool UI_view_item_can_rename(const uiViewItemHandle *item_handle) { - const AbstractView &view = item.get_view(); - return !view.is_renaming() && item.supports_renaming(); + const AbstractViewItem &item = reinterpret_cast(*item_handle); + return ViewItemAPIWrapper::can_rename(item); } -void UI_view_item_begin_rename(AbstractViewItem &item) +void UI_view_item_begin_rename(uiViewItemHandle *item_handle) { + AbstractViewItem &item = reinterpret_cast(*item_handle); item.begin_renaming(); } -bool UI_view_item_supports_drag(const AbstractViewItem &item) +void UI_view_item_context_menu_build(bContext *C, + const uiViewItemHandle *item_handle, + uiLayout *column) { - return item.create_drag_controller() != nullptr; + const AbstractViewItem &item = reinterpret_cast(*item_handle); + item.build_context_menu(*C, *column); } -bool UI_view_item_drag_start(bContext &C, const AbstractViewItem &item) +bool UI_view_item_supports_drag(const uiViewItemHandle *item_) { - const std::unique_ptr drag_controller = - item.create_drag_controller(); - if (!drag_controller) { - return false; - } + const AbstractViewItem &item = reinterpret_cast(*item_); + return ViewItemAPIWrapper::supports_drag(item); +} - WM_event_start_drag(&C, - ICON_NONE, - drag_controller->get_drag_type(), - drag_controller->create_drag_data(), - WM_DRAG_FREE_DATA); - drag_controller->on_drag_start(); - - return true; +bool UI_view_item_drag_start(bContext *C, const uiViewItemHandle *item_) +{ + const AbstractViewItem &item = reinterpret_cast(*item_); + return ViewItemAPIWrapper::drag_start(*C, item); } /** \} */ diff --git a/source/blender/editors/interface/views/grid_view.cc b/source/blender/editors/interface/views/grid_view.cc index 272a41b2dc1..a92d3ff875f 100644 --- a/source/blender/editors/interface/views/grid_view.cc +++ b/source/blender/editors/interface/views/grid_view.cc @@ -79,7 +79,7 @@ void AbstractGridView::update_children_from_old(const AbstractView &old_view) { const AbstractGridView &old_grid_view = dynamic_cast(old_view); - this->foreach_item([this, &old_grid_view](AbstractGridViewItem &new_item) { + foreach_item([this, &old_grid_view](AbstractGridViewItem &new_item) { const AbstractGridViewItem *matching_old_item = find_matching_item(new_item, old_grid_view); if (!matching_old_item) { return; @@ -154,9 +154,11 @@ void AbstractGridViewItem::add_grid_tile_button(uiBlock &block) nullptr, 0, 0, + 0, + 0, ""); - view_item_but_->view_item = this; + view_item_but_->view_item = reinterpret_cast(this); UI_but_func_set(view_item_but_, grid_tile_click_fn, view_item_but_, nullptr); } @@ -298,6 +300,8 @@ void BuildOnlyVisibleButtonsHelper::add_spacer_button(uiBlock &block, const int nullptr, 0, 0, + 0, + 0, ""); remaining_rows -= row_count_this_iter; } @@ -413,7 +417,7 @@ void PreviewGridItem::build_grid_tile(uiLayout &layout) const uiBut *but = uiDefBut(block, UI_BTYPE_PREVIEW_TILE, 0, - hide_label_ ? "" : label, + hide_label_ ? "" : label.c_str(), 0, 0, style.tile_width, @@ -421,6 +425,8 @@ void PreviewGridItem::build_grid_tile(uiLayout &layout) const nullptr, 0, 0, + 0, + 0, ""); /* Draw icons that are not previews or images as normal icons with a fixed icon size. Otherwise * they will be upscaled to the button size. Should probably be done by the widget code. */ diff --git a/source/blender/editors/interface/views/interface_view.cc b/source/blender/editors/interface/views/interface_view.cc index deebd64b509..c25560a9e14 100644 --- a/source/blender/editors/interface/views/interface_view.cc +++ b/source/blender/editors/interface/views/interface_view.cc @@ -149,9 +149,7 @@ void ui_block_views_draw_overlays(const ARegion *region, const uiBlock *block) } } -blender::ui::AbstractView *UI_region_view_find_at(const ARegion *region, - const int xy[2], - const int pad) +uiViewHandle *UI_region_view_find_at(const ARegion *region, const int xy[2], const int pad) { /* NOTE: Similar to #ui_but_find_mouse_over_ex(). */ @@ -173,7 +171,7 @@ blender::ui::AbstractView *UI_region_view_find_at(const ARegion *region, BLI_rcti_pad(&padded_bounds, pad, pad); } if (BLI_rcti_isect_pt(&padded_bounds, mx, my)) { - return view_link->view.get(); + return reinterpret_cast(view_link->view.get()); } } } @@ -181,9 +179,9 @@ blender::ui::AbstractView *UI_region_view_find_at(const ARegion *region, return nullptr; } -ui::AbstractViewItem *UI_region_views_find_item_at(const ARegion ®ion, const int xy[2]) +uiViewItemHandle *UI_region_views_find_item_at(const ARegion *region, const int xy[2]) { - uiButViewItem *item_but = (uiButViewItem *)ui_view_item_find_mouse_over(®ion, xy); + uiButViewItem *item_but = (uiButViewItem *)ui_view_item_find_mouse_over(region, xy); if (!item_but) { return nullptr; } @@ -191,7 +189,7 @@ ui::AbstractViewItem *UI_region_views_find_item_at(const ARegion ®ion, const return item_but->view_item; } -ui::AbstractViewItem *UI_region_views_find_active_item(const ARegion *region) +uiViewItemHandle *UI_region_views_find_active_item(const ARegion *region) { uiButViewItem *item_but = (uiButViewItem *)ui_view_item_find_active(region); if (!item_but) { @@ -211,17 +209,21 @@ namespace blender::ui { std::unique_ptr region_views_find_drop_target_at(const ARegion *region, const int xy[2]) { - if (ui::AbstractViewItem *item = UI_region_views_find_item_at(*region, xy)) { - if (std::unique_ptr target = item->create_item_drop_target()) { - return target; + uiViewItemHandle *hovered_view_item = UI_region_views_find_item_at(region, xy); + if (hovered_view_item) { + std::unique_ptr drop_target = view_item_drop_target(hovered_view_item); + if (drop_target) { + return drop_target; } } /* Get style for some sensible padding around the view items. */ const uiStyle *style = UI_style_get_dpi(); - if (AbstractView *view = UI_region_view_find_at(region, xy, style->buttonspacex)) { - if (std::unique_ptr target = view->create_drop_target()) { - return target; + uiViewHandle *hovered_view = UI_region_view_find_at(region, xy, style->buttonspacex); + if (hovered_view) { + std::unique_ptr drop_target = view_drop_target(hovered_view); + if (drop_target) { + return drop_target; } } @@ -265,22 +267,27 @@ static T *ui_block_view_find_matching_in_old_block_impl(const uiBlock &new_block return nullptr; } -blender::ui::AbstractView *ui_block_view_find_matching_in_old_block( - const uiBlock &new_block, const blender::ui::AbstractView &new_view) +uiViewHandle *ui_block_view_find_matching_in_old_block(const uiBlock *new_block, + const uiViewHandle *new_view_handle) { - return ui_block_view_find_matching_in_old_block_impl(new_block, new_view); + BLI_assert(new_block && new_view_handle); + const AbstractView &new_view = reinterpret_cast(*new_view_handle); + + AbstractView *old_view = ui_block_view_find_matching_in_old_block_impl(*new_block, new_view); + return reinterpret_cast(old_view); } uiButViewItem *ui_block_view_find_matching_view_item_but_in_old_block( - const uiBlock &new_block, const ui::AbstractViewItem &new_item) + const uiBlock *new_block, const uiViewItemHandle *new_item_handle) { - uiBlock *old_block = new_block.oldblock; + uiBlock *old_block = new_block->oldblock; if (!old_block) { return nullptr; } + const AbstractViewItem &new_item = *reinterpret_cast(new_item_handle); const AbstractView *old_view = ui_block_view_find_matching_in_old_block_impl( - new_block, new_item.get_view()); + *new_block, new_item.get_view()); if (!old_view) { return nullptr; } @@ -299,7 +306,9 @@ uiButViewItem *ui_block_view_find_matching_view_item_but_in_old_block( continue; } - if (UI_view_item_matches(new_item, old_item)) { + if (UI_view_item_matches(reinterpret_cast(&new_item), + reinterpret_cast(&old_item))) + { return old_item_but; } } diff --git a/source/blender/editors/interface/views/tree_view.cc b/source/blender/editors/interface/views/tree_view.cc index 811507ef727..7093c129584 100644 --- a/source/blender/editors/interface/views/tree_view.cc +++ b/source/blender/editors/interface/views/tree_view.cc @@ -11,7 +11,7 @@ #include "BKE_context.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "GPU_immediate.h" @@ -88,18 +88,18 @@ void TreeViewItemContainer::foreach_item_recursive(ItemIterFn iter_fn, IterOptio /* Implementation for the base class virtual function. More specialized iterators below. */ void AbstractTreeView::foreach_view_item(FunctionRef iter_fn) const { - this->foreach_item_recursive(iter_fn); + foreach_item_recursive(iter_fn); } void AbstractTreeView::foreach_item(ItemIterFn iter_fn, IterOptions options) const { - this->foreach_item_recursive(iter_fn, options); + foreach_item_recursive(iter_fn, options); } AbstractTreeViewItem *AbstractTreeView::find_hovered(const ARegion ®ion, const int2 &xy) { AbstractTreeViewItem *hovered_item = nullptr; - this->foreach_item_recursive( + foreach_item_recursive( [&](AbstractTreeViewItem &item) { if (hovered_item) { return; @@ -145,7 +145,7 @@ void AbstractTreeView::draw_hierarchy_lines_recursive(const ARegion ®ion, continue; } - this->draw_hierarchy_lines_recursive(region, *item, pos, aspect); + draw_hierarchy_lines_recursive(region, *item, pos, aspect); const AbstractTreeViewItem *first_descendant = item->children_.first().get(); const AbstractTreeViewItem *last_descendant = find_last_visible_descendant(*item); @@ -198,14 +198,14 @@ void AbstractTreeView::draw_hierarchy_lines(const ARegion ®ion) const void AbstractTreeView::draw_overlays(const ARegion ®ion) const { - this->draw_hierarchy_lines(region); + draw_hierarchy_lines(region); } void AbstractTreeView::update_children_from_old(const AbstractView &old_view) { const AbstractTreeView &old_tree_view = dynamic_cast(old_view); - this->update_children_from_old_recursive(*this, old_tree_view); + update_children_from_old_recursive(*this, old_tree_view); } void AbstractTreeView::update_children_from_old_recursive(const TreeViewOrItem &new_items, @@ -300,17 +300,17 @@ void AbstractTreeViewItem::tree_row_click_fn(bContext *C, void *but_arg1, void * void AbstractTreeViewItem::add_treerow_button(uiBlock &block) { /* For some reason a width > (UI_UNIT_X * 2) make the layout system use all available width. */ - view_item_but_ = reinterpret_cast(uiDefBut( - &block, UI_BTYPE_VIEW_ITEM, 0, "", 0, 0, UI_UNIT_X * 10, UI_UNIT_Y, nullptr, 0, 0, "")); + view_item_but_ = (uiButViewItem *)uiDefBut( + &block, UI_BTYPE_VIEW_ITEM, 0, "", 0, 0, UI_UNIT_X * 10, UI_UNIT_Y, nullptr, 0, 0, 0, 0, ""); - view_item_but_->view_item = this; + view_item_but_->view_item = reinterpret_cast(this); view_item_but_->draw_height = unpadded_item_height(); UI_but_func_set(view_item_but_, tree_row_click_fn, view_item_but_, nullptr); } int AbstractTreeViewItem::indent_width() const { - return this->count_parents() * UI_TREEVIEW_INDENT; + return count_parents() * UI_TREEVIEW_INDENT; } void AbstractTreeViewItem::add_indent(uiLayout &row) const @@ -319,12 +319,13 @@ void AbstractTreeViewItem::add_indent(uiLayout &row) const uiLayout *subrow = uiLayoutRow(&row, true); uiLayoutSetFixedSize(subrow, true); - uiDefBut(block, UI_BTYPE_SEPR, 0, "", 0, 0, this->indent_width(), 0, nullptr, 0.0, 0.0, ""); + uiDefBut(block, UI_BTYPE_SEPR, 0, "", 0, 0, indent_width(), 0, nullptr, 0.0, 0.0, 0, 0, ""); /* Indent items without collapsing icon some more within their parent. Makes it clear that they * are actually nested and not just a row at the same level without a chevron. */ - if (!this->is_collapsible()) { - uiDefBut(block, UI_BTYPE_SEPR, 0, "", 0, 0, UI_TREEVIEW_INDENT, 0, nullptr, 0.0, 0.0, ""); + if (!is_collapsible()) { + uiDefBut( + block, UI_BTYPE_SEPR, 0, "", 0, 0, UI_TREEVIEW_INDENT, 0, nullptr, 0.0, 0.0, 0, 0, ""); } /* Restore. */ @@ -341,10 +342,10 @@ void AbstractTreeViewItem::collapse_chevron_click_fn(bContext *C, const wmWindow *win = CTX_wm_window(C); const ARegion *region = CTX_wm_menu(C) ? CTX_wm_menu(C) : CTX_wm_region(C); - AbstractViewItem *hovered_abstract_item = UI_region_views_find_item_at(*region, - win->eventstate->xy); + uiViewItemHandle *hovered_item_handle = UI_region_views_find_item_at(region, + win->eventstate->xy); - auto *hovered_item = reinterpret_cast(hovered_abstract_item); + AbstractTreeViewItem *hovered_item = from_item_handle(hovered_item_handle); BLI_assert(hovered_item != nullptr); hovered_item->toggle_collapsed_from_view(*C); @@ -357,11 +358,11 @@ void AbstractTreeViewItem::collapse_chevron_click_fn(bContext *C, void AbstractTreeViewItem::add_collapse_chevron(uiBlock &block) const { - if (!this->is_collapsible()) { + if (!is_collapsible()) { return; } - const BIFIconID icon = this->is_collapsed() ? ICON_RIGHTARROW : ICON_DOWNARROW_HLT; + const BIFIconID icon = is_collapsed() ? ICON_RIGHTARROW : ICON_DOWNARROW_HLT; uiBut *but = uiDefIconBut(&block, UI_BTYPE_BUT_TOGGLE, 0, @@ -373,6 +374,8 @@ void AbstractTreeViewItem::add_collapse_chevron(uiBlock &block) const nullptr, 0, 0, + 0, + 0, ""); UI_but_func_set(but, collapse_chevron_click_fn, nullptr, nullptr); UI_but_flag_disable(but, UI_BUT_UNDO); @@ -438,7 +441,7 @@ bool AbstractTreeViewItem::matches_single(const AbstractTreeViewItem &other) con std::unique_ptr AbstractTreeViewItem::create_item_drop_target() { - return this->create_drop_target(); + return create_drop_target(); } std::unique_ptr AbstractTreeViewItem::create_drop_target() @@ -491,10 +494,11 @@ bool AbstractTreeViewItem::is_hovered() const BLI_assert_msg(view_item_but_ != nullptr, "Hovered state can't be queried before the tree row is being built"); + const uiViewItemHandle *this_item_handle = reinterpret_cast(this); /* The new layout hasn't finished construction yet, so the final state of the button is unknown. * Get the matching button from the previous redraw instead. */ uiButViewItem *old_item_but = ui_block_view_find_matching_view_item_but_in_old_block( - *view_item_but_->block, *this); + view_item_but_->block, this_item_handle); return old_item_but && (old_item_but->flag & UI_HOVER); } @@ -502,17 +506,17 @@ bool AbstractTreeViewItem::is_collapsed() const { BLI_assert_msg(get_tree_view().is_reconstructed(), "State can't be queried until reconstruction is completed"); - return this->is_collapsible() && !is_open_; + return is_collapsible() && !is_open_; } bool AbstractTreeViewItem::toggle_collapsed() { - return this->set_collapsed(is_open_); + return set_collapsed(is_open_); } bool AbstractTreeViewItem::set_collapsed(const bool collapsed) { - if (!this->is_collapsible()) { + if (!is_collapsible()) { return false; } if (collapsed == !is_open_) { @@ -545,8 +549,8 @@ std::optional AbstractTreeViewItem::should_be_collapsed() const void AbstractTreeViewItem::toggle_collapsed_from_view(bContext &C) { - if (this->toggle_collapsed()) { - this->on_collapse_change(C, this->is_collapsed()); + if (toggle_collapsed()) { + on_collapse_change(C, is_collapsed()); } } @@ -558,7 +562,7 @@ void AbstractTreeViewItem::change_state_delayed() if (should_be_collapsed.has_value()) { /* This reflects an external state change and therefore shouldn't call #on_collapse_change(). */ - this->set_collapsed(*should_be_collapsed); + set_collapsed(*should_be_collapsed); } } @@ -573,10 +577,10 @@ bool AbstractTreeViewItem::matches(const AbstractViewItem &other) const { const AbstractTreeViewItem &other_tree_item = dynamic_cast(other); - if (!this->matches_single(other_tree_item)) { + if (!matches_single(other_tree_item)) { return false; } - if (this->count_parents() != other_tree_item.count_parents()) { + if (count_parents() != other_tree_item.count_parents()) { return false; } @@ -617,7 +621,7 @@ TreeViewLayoutBuilder::TreeViewLayoutBuilder(uiLayout &layout) : block_(*uiLayou void TreeViewLayoutBuilder::build_from_tree(const AbstractTreeView &tree_view) { - uiLayout &parent_layout = this->current_layout(); + uiLayout &parent_layout = current_layout(); uiLayout *box = uiLayoutBox(&parent_layout); uiLayoutColumn(box, true); @@ -723,7 +727,7 @@ BasicTreeViewItem::BasicTreeViewItem(StringRef label, BIFIconID icon_) : icon(ic void BasicTreeViewItem::build_row(uiLayout &row) { - this->add_label(row); + add_label(row); } void BasicTreeViewItem::add_label(uiLayout &layout, StringRefNull label_override) diff --git a/source/blender/editors/io/io_alembic.cc b/source/blender/editors/io/io_alembic.cc index 4f1b45d88d9..ab77075e48f 100644 --- a/source/blender/editors/io/io_alembic.cc +++ b/source/blender/editors/io/io_alembic.cc @@ -28,14 +28,14 @@ # include "BKE_context.hh" # include "BKE_file_handler.hh" # include "BKE_main.hh" -# include "BKE_report.hh" +# include "BKE_report.h" # include "BLI_path_util.h" # include "BLI_string.h" # include "BLI_utildefines.h" # include "BLI_vector.hh" -# include "BLT_translation.hh" +# include "BLT_translation.h" # include "RNA_access.hh" # include "RNA_define.hh" diff --git a/source/blender/editors/io/io_cache.cc b/source/blender/editors/io/io_cache.cc index 49ac8f29383..824b403657a 100644 --- a/source/blender/editors/io/io_cache.cc +++ b/source/blender/editors/io/io_cache.cc @@ -15,11 +15,11 @@ #include "BLI_path_util.h" #include "BLI_string.h" -#include "BKE_cachefile.hh" +#include "BKE_cachefile.h" #include "BKE_context.hh" #include "BKE_lib_id.hh" #include "BKE_main.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "RNA_access.hh" #include "RNA_define.hh" @@ -86,7 +86,7 @@ static int cachefile_open_exec(bContext *C, wmOperator *op) CacheFile *cache_file = static_cast( BKE_libblock_alloc(bmain, ID_CF, BLI_path_basename(filepath), 0)); STRNCPY(cache_file->filepath, filepath); - DEG_id_tag_update(&cache_file->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&cache_file->id, ID_RECALC_COPY_ON_WRITE); /* Will be set when running invoke, not exec directly. */ if (op->customdata != nullptr) { diff --git a/source/blender/editors/io/io_collada.cc b/source/blender/editors/io/io_collada.cc index cdb62504cf2..6a2aee68c25 100644 --- a/source/blender/editors/io/io_collada.cc +++ b/source/blender/editors/io/io_collada.cc @@ -8,7 +8,7 @@ #ifdef WITH_COLLADA # include "DNA_space_types.h" -# include "BLT_translation.hh" +# include "BLT_translation.h" # include "BLI_blenlib.h" # include "BLI_string.h" @@ -16,7 +16,9 @@ # include "BKE_context.hh" # include "BKE_file_handler.hh" -# include "BKE_report.hh" +# include "BKE_main.hh" +# include "BKE_object.hh" +# include "BKE_report.h" # include "DEG_depsgraph.hh" diff --git a/source/blender/editors/io/io_drop_import_file.cc b/source/blender/editors/io/io_drop_import_file.cc index 923d6fe654b..b5480bf2cfc 100644 --- a/source/blender/editors/io/io_drop_import_file.cc +++ b/source/blender/editors/io/io_drop_import_file.cc @@ -5,7 +5,7 @@ #include "BLI_path_util.h" #include "BLI_string.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_file_handler.hh" diff --git a/source/blender/editors/io/io_gpencil_export.cc b/source/blender/editors/io/io_gpencil_export.cc index eb4956b401b..79e8b9800c5 100644 --- a/source/blender/editors/io/io_gpencil_export.cc +++ b/source/blender/editors/io/io_gpencil_export.cc @@ -9,13 +9,17 @@ #ifdef WITH_IO_GPENCIL # include "BLI_path_util.h" +# include "BLI_string.h" +# include "DNA_gpencil_legacy_types.h" # include "DNA_space_types.h" -# include "BKE_report.hh" +# include "BKE_gpencil_legacy.h" +# include "BKE_main.hh" +# include "BKE_report.h" # include "BKE_screen.hh" -# include "BLT_translation.hh" +# include "BLT_translation.h" # include "ED_fileselect.hh" @@ -28,6 +32,9 @@ # include "WM_api.hh" # include "WM_types.hh" +# include "DEG_depsgraph.hh" +# include "DEG_depsgraph_query.hh" + # include "io_gpencil.hh" # include "gpencil_io.h" diff --git a/source/blender/editors/io/io_gpencil_import.cc b/source/blender/editors/io/io_gpencil_import.cc index 6bc8537a669..a5bd481f0f5 100644 --- a/source/blender/editors/io/io_gpencil_import.cc +++ b/source/blender/editors/io/io_gpencil_import.cc @@ -13,11 +13,15 @@ # include "MEM_guardedalloc.h" +# include "DNA_gpencil_legacy_types.h" # include "DNA_space_types.h" # include "BKE_context.hh" # include "BKE_file_handler.hh" -# include "BKE_report.hh" +# include "BKE_gpencil_legacy.h" +# include "BKE_report.h" + +# include "BLT_translation.h" # include "RNA_access.hh" # include "RNA_define.hh" @@ -28,6 +32,11 @@ # include "WM_api.hh" # include "WM_types.hh" +# include "DEG_depsgraph.hh" +# include "DEG_depsgraph_query.hh" + +# include "ED_gpencil_legacy.hh" + # include "io_gpencil.hh" # include "io_utils.hh" diff --git a/source/blender/editors/io/io_obj.cc b/source/blender/editors/io/io_obj.cc index 5c211c6d53d..d72a1c92eb7 100644 --- a/source/blender/editors/io/io_obj.cc +++ b/source/blender/editors/io/io_obj.cc @@ -13,13 +13,13 @@ # include "BKE_context.hh" # include "BKE_file_handler.hh" # include "BKE_main.hh" -# include "BKE_report.hh" +# include "BKE_report.h" # include "BLI_path_util.h" # include "BLI_string.h" # include "BLI_utildefines.h" -# include "BLT_translation.hh" +# include "BLT_translation.h" # include "ED_fileselect.hh" # include "ED_outliner.hh" diff --git a/source/blender/editors/io/io_ply_ops.cc b/source/blender/editors/io/io_ply_ops.cc index 2d71586f0a0..17e582c507b 100644 --- a/source/blender/editors/io/io_ply_ops.cc +++ b/source/blender/editors/io/io_ply_ops.cc @@ -11,7 +11,7 @@ # include "BKE_context.hh" # include "BKE_file_handler.hh" # include "BKE_main.hh" -# include "BKE_report.hh" +# include "BKE_report.h" # include "BLI_string.h" @@ -26,14 +26,17 @@ # include "RNA_access.hh" # include "RNA_define.hh" -# include "BLT_translation.hh" +# include "BLT_translation.h" # include "MEM_guardedalloc.h" # include "UI_interface.hh" # include "UI_resources.hh" +# include "DEG_depsgraph.hh" + # include "IO_orientation.hh" +# include "IO_path_util_types.hh" # include "IO_ply.hh" # include "io_ply_ops.hh" diff --git a/source/blender/editors/io/io_stl_ops.cc b/source/blender/editors/io/io_stl_ops.cc index 9cf7adeb00e..dbb90599958 100644 --- a/source/blender/editors/io/io_stl_ops.cc +++ b/source/blender/editors/io/io_stl_ops.cc @@ -10,7 +10,7 @@ # include "BKE_context.hh" # include "BKE_file_handler.hh" -# include "BKE_report.hh" +# include "BKE_report.h" # include "BLI_string.h" @@ -25,7 +25,7 @@ # include "RNA_access.hh" # include "RNA_define.hh" -# include "BLT_translation.hh" +# include "BLT_translation.h" # include "UI_interface.hh" # include "UI_resources.hh" diff --git a/source/blender/editors/io/io_usd.cc b/source/blender/editors/io/io_usd.cc index 2c9eb914243..7f1d3aa55d2 100644 --- a/source/blender/editors/io/io_usd.cc +++ b/source/blender/editors/io/io_usd.cc @@ -14,13 +14,15 @@ # include "BKE_context.hh" # include "BKE_file_handler.hh" -# include "BKE_report.hh" +# include "BKE_main.hh" +# include "BKE_report.h" +# include "BLI_blenlib.h" # include "BLI_path_util.h" # include "BLI_string.h" # include "BLI_utildefines.h" -# include "BLT_translation.hh" +# include "BLT_translation.h" # include "ED_fileselect.hh" # include "ED_object.hh" @@ -30,6 +32,8 @@ # include "RNA_access.hh" # include "RNA_define.hh" +# include "RNA_enum_types.hh" + # include "UI_interface.hh" # include "UI_resources.hh" diff --git a/source/blender/editors/io/io_utils.cc b/source/blender/editors/io/io_utils.cc index f0124edbf90..c494b64c92d 100644 --- a/source/blender/editors/io/io_utils.cc +++ b/source/blender/editors/io/io_utils.cc @@ -6,12 +6,14 @@ #include "BLI_path_util.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_context.hh" #include "DNA_space_types.h" +#include "ED_fileselect.hh" + #include "RNA_access.hh" #include "RNA_prototypes.h" @@ -45,8 +47,8 @@ int filesel_drop_import_invoke(bContext *C, wmOperator *op, const wmEvent * /* e RNA_string_get(op->ptr, "filepath", filepath); title = filepath; } - return WM_operator_props_dialog_popup( - C, op, 350, std::move(title), WM_operatortype_name(op->type, op->ptr)); + const std::string operator_name = WM_operatortype_name(op->type, op->ptr); + return WM_operator_props_dialog_popup(C, op, 350, title.c_str(), operator_name.c_str()); } WM_event_add_fileselect(C, op); diff --git a/source/blender/editors/lattice/editlattice_select.cc b/source/blender/editors/lattice/editlattice_select.cc index aefc285b796..48caa5689a5 100644 --- a/source/blender/editors/lattice/editlattice_select.cc +++ b/source/blender/editors/lattice/editlattice_select.cc @@ -29,7 +29,7 @@ #include "BKE_context.hh" #include "BKE_lattice.hh" #include "BKE_layer.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "ED_lattice.hh" #include "ED_object.hh" diff --git a/source/blender/editors/mask/CMakeLists.txt b/source/blender/editors/mask/CMakeLists.txt index 84b53bd8bf6..0853b07ddbc 100644 --- a/source/blender/editors/mask/CMakeLists.txt +++ b/source/blender/editors/mask/CMakeLists.txt @@ -5,7 +5,6 @@ set(INC ../include ../../blenkernel - ../../blentranslation ../../gpu ../../makesrna ../../windowmanager diff --git a/source/blender/editors/mask/mask_add.cc b/source/blender/editors/mask/mask_add.cc index 0f9fa3649ec..e731303aa0d 100644 --- a/source/blender/editors/mask/mask_add.cc +++ b/source/blender/editors/mask/mask_add.cc @@ -27,6 +27,7 @@ #include "WM_types.hh" #include "ED_mask.hh" /* own include */ +#include "ED_screen.hh" #include "ED_select_utils.hh" #include "RNA_access.hh" diff --git a/source/blender/editors/mask/mask_draw.cc b/source/blender/editors/mask/mask_draw.cc index 136d62c786b..e058c81111d 100644 --- a/source/blender/editors/mask/mask_draw.cc +++ b/source/blender/editors/mask/mask_draw.cc @@ -33,6 +33,7 @@ #include "GPU_shader.h" #include "GPU_state.h" +#include "UI_interface.hh" #include "UI_resources.hh" #include "UI_view2d.hh" diff --git a/source/blender/editors/mask/mask_editaction.cc b/source/blender/editors/mask/mask_editaction.cc index 054636e8f6d..ec240ffb9f8 100644 --- a/source/blender/editors/mask/mask_editaction.cc +++ b/source/blender/editors/mask/mask_editaction.cc @@ -14,11 +14,13 @@ #include "MEM_guardedalloc.h" +#include "BLI_blenlib.h" #include "BLI_utildefines.h" #include "DNA_mask_types.h" #include "DNA_scene_types.h" +#include "BKE_fcurve.h" #include "BKE_mask.h" #include "ED_anim_api.hh" diff --git a/source/blender/editors/mask/mask_ops.cc b/source/blender/editors/mask/mask_ops.cc index 87a95961991..d0b8561f233 100644 --- a/source/blender/editors/mask/mask_ops.cc +++ b/source/blender/editors/mask/mask_ops.cc @@ -13,10 +13,9 @@ #include "BLI_math_vector.h" #include "BKE_context.hh" +#include "BKE_main.hh" #include "BKE_mask.h" -#include "BLT_translation.hh" - #include "DEG_depsgraph.hh" #include "DEG_depsgraph_query.hh" @@ -30,12 +29,11 @@ #include "ED_clip.hh" #include "ED_image.hh" #include "ED_mask.hh" +#include "ED_screen.hh" #include "ED_select_utils.hh" #include "ANIM_keyframing.hh" -#include "UI_interface_icons.hh" - #include "RNA_access.hh" #include "RNA_define.hh" @@ -137,7 +135,7 @@ static int mask_layer_new_exec(bContext *C, wmOperator *op) mask->masklay_act = mask->masklay_tot - 1; WM_event_add_notifier(C, NC_MASK | NA_EDITED, mask); - DEG_id_tag_update(&mask->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&mask->id, ID_RECALC_COPY_ON_WRITE); return OPERATOR_FINISHED; } @@ -171,7 +169,7 @@ static int mask_layer_remove_exec(bContext *C, wmOperator * /*op*/) BKE_mask_layer_remove(mask, mask_layer); WM_event_add_notifier(C, NC_MASK | NA_EDITED, mask); - DEG_id_tag_update(&mask->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&mask->id, ID_RECALC_COPY_ON_WRITE); } return OPERATOR_FINISHED; @@ -1502,20 +1500,6 @@ static int delete_exec(bContext *C, wmOperator * /*op*/) return OPERATOR_FINISHED; } -static int delete_invoke(bContext *C, wmOperator *op, const wmEvent * /*event*/) -{ - if (RNA_boolean_get(op->ptr, "confirm")) { - return WM_operator_confirm_ex(C, - op, - IFACE_("Delete selected control points and splines?"), - nullptr, - IFACE_("Delete"), - ALERT_ICON_NONE, - false); - } - return delete_exec(C, op); -} - void MASK_OT_delete(wmOperatorType *ot) { /* identifiers */ @@ -1524,7 +1508,7 @@ void MASK_OT_delete(wmOperatorType *ot) ot->idname = "MASK_OT_delete"; /* api callbacks */ - ot->invoke = delete_invoke; + ot->invoke = WM_operator_confirm_or_exec; ot->exec = delete_exec; ot->poll = ED_maskedit_mask_visible_splines_poll; @@ -1938,7 +1922,7 @@ static int mask_layer_move_exec(bContext *C, wmOperator *op) } WM_event_add_notifier(C, NC_MASK | NA_EDITED, mask); - DEG_id_tag_update(&mask->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&mask->id, ID_RECALC_COPY_ON_WRITE); return OPERATOR_FINISHED; } diff --git a/source/blender/editors/mask/mask_select.cc b/source/blender/editors/mask/mask_select.cc index 1ec5d5b34c4..d9a564b449f 100644 --- a/source/blender/editors/mask/mask_select.cc +++ b/source/blender/editors/mask/mask_select.cc @@ -8,10 +8,9 @@ #include "MEM_guardedalloc.h" -#include "BLI_lasso_2d.hh" +#include "BLI_lasso_2d.h" #include "BLI_listbase.h" #include "BLI_math_base.h" -#include "BLI_math_vector_types.hh" #include "BLI_rect.h" #include "BLI_utildefines.h" @@ -35,10 +34,6 @@ #include "mask_intern.h" /* own include */ -using blender::Array; -using blender::int2; -using blender::Span; - /* -------------------------------------------------------------------- */ /** \name Public Mask Selection API * \{ */ @@ -527,7 +522,10 @@ void MASK_OT_select_box(wmOperatorType *ot) /** \name Lasso Select Operator * \{ */ -static bool do_lasso_select_mask(bContext *C, const Span mcoords, const eSelectOp sel_op) +static bool do_lasso_select_mask(bContext *C, + const int mcoords[][2], + const int mcoords_len, + const eSelectOp sel_op) { ScrArea *area = CTX_wm_area(C); ARegion *region = CTX_wm_region(C); @@ -546,7 +544,7 @@ static bool do_lasso_select_mask(bContext *C, const Span mcoords, const eS } /* get rectangle from operator */ - BLI_lasso_boundbox(&rect, mcoords); + BLI_lasso_boundbox(&rect, mcoords, mcoords_len); /* do actual selection */ for (MaskLayer *mask_layer_orig = static_cast(mask_orig->masklayers.first), @@ -587,7 +585,7 @@ static bool do_lasso_select_mask(bContext *C, const Span mcoords, const eS &screen_co[1]); if (BLI_rcti_isect_pt(&rect, screen_co[0], screen_co[1]) && - BLI_lasso_is_point_inside(mcoords, screen_co[0], screen_co[1], INT_MAX)) + BLI_lasso_is_point_inside(mcoords, mcoords_len, screen_co[0], screen_co[1], INT_MAX)) { BKE_mask_point_select_set(point, select); BKE_mask_point_select_set_handle(point, MASK_WHICH_HANDLE_BOTH, select); @@ -609,15 +607,18 @@ static bool do_lasso_select_mask(bContext *C, const Span mcoords, const eS static int clip_lasso_select_exec(bContext *C, wmOperator *op) { - const Array mcoords = WM_gesture_lasso_path_to_array(C, op); - if (mcoords.is_empty()) { - return OPERATOR_PASS_THROUGH; + int mcoords_len; + const int(*mcoords)[2] = WM_gesture_lasso_path_to_array(C, op, &mcoords_len); + + if (mcoords) { + const eSelectOp sel_op = eSelectOp(RNA_enum_get(op->ptr, "mode")); + do_lasso_select_mask(C, mcoords, mcoords_len, sel_op); + + MEM_freeN((void *)mcoords); + + return OPERATOR_FINISHED; } - - const eSelectOp sel_op = eSelectOp(RNA_enum_get(op->ptr, "mode")); - do_lasso_select_mask(C, mcoords, sel_op); - - return OPERATOR_FINISHED; + return OPERATOR_PASS_THROUGH; } void MASK_OT_select_lasso(wmOperatorType *ot) diff --git a/source/blender/editors/mesh/CMakeLists.txt b/source/blender/editors/mesh/CMakeLists.txt index 12efd559990..94dd500377d 100644 --- a/source/blender/editors/mesh/CMakeLists.txt +++ b/source/blender/editors/mesh/CMakeLists.txt @@ -67,7 +67,6 @@ set(LIB PRIVATE bf::blenlib PRIVATE bf::depsgraph PRIVATE bf::dna - PRIVATE bf::extern::fmtlib PRIVATE bf::intern::clog PRIVATE bf::intern::guardedalloc bf_windowmanager diff --git a/source/blender/editors/mesh/editface.cc b/source/blender/editors/mesh/editface.cc index 0ebeec01d34..ffcb8e96426 100644 --- a/source/blender/editors/mesh/editface.cc +++ b/source/blender/editors/mesh/editface.cc @@ -27,7 +27,7 @@ #include "BKE_attribute.hh" #include "BKE_context.hh" #include "BKE_customdata.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_mesh.hh" #include "BKE_mesh_mapping.hh" #include "BKE_object.hh" @@ -79,12 +79,12 @@ void paintface_flush_flags(bContext *C, bke::AttributeAccessor attributes_me = mesh->attributes(); Mesh *me_orig = (Mesh *)ob_eval->runtime->data_orig; bke::MutableAttributeAccessor attributes_orig = me_orig->attributes_for_write(); - Mesh *mesh_eval = (Mesh *)ob_eval->runtime->data_eval; - bke::MutableAttributeAccessor attributes_eval = mesh_eval->attributes_for_write(); + Mesh *me_eval = (Mesh *)ob_eval->runtime->data_eval; + bke::MutableAttributeAccessor attributes_eval = me_eval->attributes_for_write(); bool updated = false; - if (me_orig != nullptr && mesh_eval != nullptr && me_orig->faces_num == mesh->faces_num) { - /* Update the evaluated copy of the mesh. */ + if (me_orig != nullptr && me_eval != nullptr && me_orig->faces_num == mesh->faces_num) { + /* Update the COW copy of the mesh. */ if (flush_hidden) { const VArray hide_poly_me = *attributes_me.lookup_or_default( ".hide_poly", bke::AttrDomain::Face, false); @@ -105,14 +105,14 @@ void paintface_flush_flags(bContext *C, } /* Mesh faces => Final derived faces */ - if ((index_array = (const int *)CustomData_get_layer(&mesh_eval->face_data, CD_ORIGINDEX))) { + if ((index_array = (const int *)CustomData_get_layer(&me_eval->face_data, CD_ORIGINDEX))) { if (flush_hidden) { const VArray hide_poly_orig = *attributes_orig.lookup_or_default( ".hide_poly", bke::AttrDomain::Face, false); bke::SpanAttributeWriter hide_poly_eval = attributes_eval.lookup_or_add_for_write_only_span(".hide_poly", bke::AttrDomain::Face); - for (const int i : IndexRange(mesh_eval->faces_num)) { + for (const int i : IndexRange(me_eval->faces_num)) { const int orig_face_index = index_array[i]; if (orig_face_index != ORIGINDEX_NONE) { hide_poly_eval.span[i] = hide_poly_orig[orig_face_index]; @@ -126,7 +126,7 @@ void paintface_flush_flags(bContext *C, bke::SpanAttributeWriter select_poly_eval = attributes_eval.lookup_or_add_for_write_only_span(".select_poly", bke::AttrDomain::Face); - for (const int i : IndexRange(mesh_eval->faces_num)) { + for (const int i : IndexRange(me_eval->faces_num)) { const int orig_face_index = index_array[i]; if (orig_face_index != ORIGINDEX_NONE) { select_poly_eval.span[i] = select_poly_orig[orig_face_index]; @@ -141,16 +141,16 @@ void paintface_flush_flags(bContext *C, if (updated) { if (flush_hidden) { - BKE_mesh_batch_cache_dirty_tag(mesh_eval, BKE_MESH_BATCH_DIRTY_ALL); + BKE_mesh_batch_cache_dirty_tag(me_eval, BKE_MESH_BATCH_DIRTY_ALL); } else { - BKE_mesh_batch_cache_dirty_tag(mesh_eval, BKE_MESH_BATCH_DIRTY_SELECT_PAINT); + BKE_mesh_batch_cache_dirty_tag(me_eval, BKE_MESH_BATCH_DIRTY_SELECT_PAINT); } DEG_id_tag_update(static_cast(ob->data), ID_RECALC_SELECT); } else { - DEG_id_tag_update(static_cast(ob->data), ID_RECALC_SYNC_TO_EVAL | ID_RECALC_SELECT); + DEG_id_tag_update(static_cast(ob->data), ID_RECALC_COPY_ON_WRITE | ID_RECALC_SELECT); } WM_event_add_notifier(C, NC_GEOM | ND_SELECT, ob->data); @@ -725,7 +725,7 @@ bool paintface_minmax(Object *ob, float r_min[3], float r_max[3]) return ok; } - copy_m3_m4(bmat, ob->object_to_world().ptr()); + copy_m3_m4(bmat, ob->object_to_world); const Span positions = mesh->vert_positions(); const OffsetIndices faces = mesh->faces(); @@ -743,7 +743,7 @@ bool paintface_minmax(Object *ob, float r_min[3], float r_max[3]) for (const int vert : corner_verts.slice(faces[i])) { mul_v3_m3v3(vec, bmat, positions[vert]); - add_v3_v3v3(vec, vec, ob->object_to_world().location()); + add_v3_v3v3(vec, vec, ob->object_to_world[3]); minmax_v3v3_v3(r_min, r_max, vec); } @@ -823,7 +823,7 @@ void paintvert_flush_flags(Object *ob) { using namespace blender; Mesh *mesh = BKE_mesh_from_object(ob); - Mesh *mesh_eval = BKE_object_get_evaluated_mesh(ob); + Mesh *me_eval = BKE_object_get_evaluated_mesh(ob); if (mesh == nullptr) { return; } @@ -832,14 +832,14 @@ void paintvert_flush_flags(Object *ob) * since this could become slow for realtime updates (circle-select for eg) */ bke::mesh_select_vert_flush(*mesh); - if (mesh_eval == nullptr) { + if (me_eval == nullptr) { return; } const bke::AttributeAccessor attributes_orig = mesh->attributes(); - bke::MutableAttributeAccessor attributes_eval = mesh_eval->attributes_for_write(); + bke::MutableAttributeAccessor attributes_eval = me_eval->attributes_for_write(); - const int *orig_indices = (const int *)CustomData_get_layer(&mesh_eval->vert_data, CD_ORIGINDEX); + const int *orig_indices = (const int *)CustomData_get_layer(&me_eval->vert_data, CD_ORIGINDEX); const VArray hide_vert_orig = *attributes_orig.lookup_or_default( ".hide_vert", bke::AttrDomain::Point, false); @@ -1080,7 +1080,7 @@ void paintvert_select_less(Mesh *mesh, const bool face_step) void paintvert_tag_select_update(bContext *C, Object *ob) { - DEG_id_tag_update(static_cast(ob->data), ID_RECALC_SYNC_TO_EVAL | ID_RECALC_SELECT); + DEG_id_tag_update(static_cast(ob->data), ID_RECALC_COPY_ON_WRITE | ID_RECALC_SELECT); WM_event_add_notifier(C, NC_GEOM | ND_SELECT, ob->data); } diff --git a/source/blender/editors/mesh/editmesh_add.cc b/source/blender/editors/mesh/editmesh_add.cc index 2c8bd97de0f..f6d90a15664 100644 --- a/source/blender/editors/mesh/editmesh_add.cc +++ b/source/blender/editors/mesh/editmesh_add.cc @@ -7,12 +7,13 @@ */ #include "BLI_math_matrix.h" +#include "BLI_math_vector.h" #include "BLI_sys_types.h" #include "DNA_object_types.h" #include "DNA_scene_types.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_context.hh" #include "BKE_editmesh.hh" diff --git a/source/blender/editors/mesh/editmesh_add_gizmo.cc b/source/blender/editors/mesh/editmesh_add_gizmo.cc index 0b13e4d090b..1fb203b77cd 100644 --- a/source/blender/editors/mesh/editmesh_add_gizmo.cc +++ b/source/blender/editors/mesh/editmesh_add_gizmo.cc @@ -15,8 +15,7 @@ #include "BKE_context.hh" #include "BKE_editmesh.hh" -#include "BKE_object_types.hh" -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "BLI_math_geom.h" #include "BLI_math_matrix.h" @@ -38,6 +37,8 @@ #include "UI_resources.hh" +#include "BLT_translation.h" + #include "mesh_intern.hh" /* own include */ /* -------------------------------------------------------------------- */ @@ -317,8 +318,8 @@ static int add_primitive_cube_gizmo_exec(bContext *C, wmOperator *op) PropertyRNA *prop_matrix = RNA_struct_find_property(op->ptr, "matrix"); if (RNA_property_is_set(op->ptr, prop_matrix)) { RNA_property_float_get_array(op->ptr, prop_matrix, &matrix[0][0]); - invert_m4_m4(obedit->runtime->world_to_object.ptr(), obedit->object_to_world().ptr()); - mul_m4_m4m4(matrix, obedit->world_to_object().ptr(), matrix); + invert_m4_m4(obedit->world_to_object, obedit->object_to_world); + mul_m4_m4m4(matrix, obedit->world_to_object, matrix); } else { /* For the first update the widget may not set the matrix. */ diff --git a/source/blender/editors/mesh/editmesh_attribute.cc b/source/blender/editors/mesh/editmesh_attribute.cc index c31fd640c9a..7e3f464bf97 100644 --- a/source/blender/editors/mesh/editmesh_attribute.cc +++ b/source/blender/editors/mesh/editmesh_attribute.cc @@ -15,7 +15,7 @@ #include "BKE_editmesh.hh" #include "BKE_layer.hh" #include "BKE_mesh.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "BKE_type_conversions.hh" #include "WM_api.hh" @@ -32,7 +32,7 @@ #include "ED_transform.hh" #include "ED_view3d.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_object_types.h" diff --git a/source/blender/editors/mesh/editmesh_automerge.cc b/source/blender/editors/mesh/editmesh_automerge.cc index 93ca967ab92..c71bae4e9b9 100644 --- a/source/blender/editors/mesh/editmesh_automerge.cc +++ b/source/blender/editors/mesh/editmesh_automerge.cc @@ -92,13 +92,13 @@ void EDBM_automerge_and_split(Object *obedit, #ifdef DEBUG_TIME em->bm = BM_mesh_copy(bm); - double t1 = BLI_time_now_seconds(); + double t1 = BLI_check_seconds_timer(); EDBM_automerge(obedit, false, hflag, dist); - t1 = BLI_time_now_seconds() - t1; + t1 = BLI_check_seconds_timer() - t1; BM_mesh_free(em->bm); em->bm = bm; - double t2 = BLI_time_now_seconds(); + double t2 = BLI_check_seconds_timer(); #endif BMOperator weldop; @@ -118,7 +118,7 @@ void EDBM_automerge_and_split(Object *obedit, BMO_op_finish(bm, &weldop); #ifdef DEBUG_TIME - t2 = BLI_time_now_seconds() - t2; + t2 = BLI_check_seconds_timer() - t2; printf("t1: %lf; t2: %lf; fac: %lf\n", t1, t2, t1 / t2); #endif diff --git a/source/blender/editors/mesh/editmesh_bevel.cc b/source/blender/editors/mesh/editmesh_bevel.cc index 85624c9aab5..f024e0751b8 100644 --- a/source/blender/editors/mesh/editmesh_bevel.cc +++ b/source/blender/editors/mesh/editmesh_bevel.cc @@ -6,8 +6,6 @@ * \ingroup edmesh */ -#include - #include "MEM_guardedalloc.h" #include "DNA_object_types.h" @@ -16,14 +14,17 @@ #include "BLI_math_vector.h" #include "BLI_string.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_context.hh" #include "BKE_editmesh.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_layer.hh" #include "BKE_unit.hh" +#include "DNA_curveprofile_types.h" +#include "DNA_mesh_types.h" + #include "RNA_access.hh" #include "RNA_define.hh" #include "RNA_prototypes.h" @@ -123,11 +124,15 @@ static float get_bevel_offset(wmOperator *op) static void edbm_bevel_update_status_text(bContext *C, wmOperator *op) { + char status_text[UI_MAX_DRAW_STR]; + char buf[UI_MAX_DRAW_STR]; + char *p = buf; + int available_len = sizeof(buf); Scene *sce = CTX_data_scene(C); - auto get_modal_key_str = [&](int id) { - return WM_modalkeymap_operator_items_to_string(op->type, id, true).value_or(""); - }; +#define WM_MODALKEY(_id) \ + WM_modalkeymap_operator_items_to_string_buf( \ + op->type, (_id), true, UI_MAX_SHORTCUT_STR, &available_len, &p) char offset_str[NUM_STR_REP_LEN]; if (RNA_enum_get(op->ptr, "offset_type") == BEVEL_AMT_PERCENT) { @@ -165,52 +170,54 @@ static void edbm_bevel_update_status_text(bContext *C, wmOperator *op) RNA_property_enum_name_gettexted( C, op->ptr, prop, RNA_property_enum_get(op->ptr, prop), &affect_str); - const std::string status_text = fmt::format( - IFACE_("{}: Confirm, " - "{}: Cancel, " - "{}: Width Type ({}), " - "{}: Width ({}), " - "{}: Segments ({}), " - "{}: Profile ({:.3f}), " - "{}: Clamp Overlap ({}), " - "{}: Affect ({}), " - "{}: Outer Miter ({}), " - "{}: Inner Miter ({}), " - "{}: Harden Normals ({}), " - "{}: Mark Seam ({}), " - "{}: Mark Sharp ({}), " - "{}: Profile Type ({}), " - "{}: Intersection ({})"), - get_modal_key_str(BEV_MODAL_CONFIRM), - get_modal_key_str(BEV_MODAL_CANCEL), - get_modal_key_str(BEV_MODAL_OFFSET_MODE_CHANGE), - mode_str, - get_modal_key_str(BEV_MODAL_VALUE_OFFSET), - offset_str, - get_modal_key_str(BEV_MODAL_VALUE_SEGMENTS), - RNA_int_get(op->ptr, "segments"), - get_modal_key_str(BEV_MODAL_VALUE_PROFILE), - RNA_float_get(op->ptr, "profile"), - get_modal_key_str(BEV_MODAL_CLAMP_OVERLAP_TOGGLE), - WM_bool_as_string(RNA_boolean_get(op->ptr, "clamp_overlap")), - get_modal_key_str(BEV_MODAL_AFFECT_CHANGE), - affect_str, - get_modal_key_str(BEV_MODAL_OUTER_MITER_CHANGE), - omiter_str, - get_modal_key_str(BEV_MODAL_INNER_MITER_CHANGE), - imiter_str, - get_modal_key_str(BEV_MODAL_HARDEN_NORMALS_TOGGLE), - WM_bool_as_string(RNA_boolean_get(op->ptr, "harden_normals")), - get_modal_key_str(BEV_MODAL_MARK_SEAM_TOGGLE), - WM_bool_as_string(RNA_boolean_get(op->ptr, "mark_seam")), - get_modal_key_str(BEV_MODAL_MARK_SHARP_TOGGLE), - WM_bool_as_string(RNA_boolean_get(op->ptr, "mark_sharp")), - get_modal_key_str(BEV_MODAL_PROFILE_TYPE_CHANGE), - profile_type_str, - get_modal_key_str(BEV_MODAL_VERTEX_MESH_CHANGE), - vmesh_str); + SNPRINTF(status_text, + IFACE_("%s: Confirm, " + "%s: Cancel, " + "%s: Width Type (%s), " + "%s: Width (%s), " + "%s: Segments (%d), " + "%s: Profile (%.3f), " + "%s: Clamp Overlap (%s), " + "%s: Affect (%s), " + "%s: Outer Miter (%s), " + "%s: Inner Miter (%s), " + "%s: Harden Normals (%s), " + "%s: Mark Seam (%s), " + "%s: Mark Sharp (%s), " + "%s: Profile Type (%s), " + "%s: Intersection (%s)"), + WM_MODALKEY(BEV_MODAL_CONFIRM), + WM_MODALKEY(BEV_MODAL_CANCEL), + WM_MODALKEY(BEV_MODAL_OFFSET_MODE_CHANGE), + mode_str, + WM_MODALKEY(BEV_MODAL_VALUE_OFFSET), + offset_str, + WM_MODALKEY(BEV_MODAL_VALUE_SEGMENTS), + RNA_int_get(op->ptr, "segments"), + WM_MODALKEY(BEV_MODAL_VALUE_PROFILE), + RNA_float_get(op->ptr, "profile"), + WM_MODALKEY(BEV_MODAL_CLAMP_OVERLAP_TOGGLE), + WM_bool_as_string(RNA_boolean_get(op->ptr, "clamp_overlap")), + WM_MODALKEY(BEV_MODAL_AFFECT_CHANGE), + affect_str, + WM_MODALKEY(BEV_MODAL_OUTER_MITER_CHANGE), + omiter_str, + WM_MODALKEY(BEV_MODAL_INNER_MITER_CHANGE), + imiter_str, + WM_MODALKEY(BEV_MODAL_HARDEN_NORMALS_TOGGLE), + WM_bool_as_string(RNA_boolean_get(op->ptr, "harden_normals")), + WM_MODALKEY(BEV_MODAL_MARK_SEAM_TOGGLE), + WM_bool_as_string(RNA_boolean_get(op->ptr, "mark_seam")), + WM_MODALKEY(BEV_MODAL_MARK_SHARP_TOGGLE), + WM_bool_as_string(RNA_boolean_get(op->ptr, "mark_sharp")), + WM_MODALKEY(BEV_MODAL_PROFILE_TYPE_CHANGE), + profile_type_str, + WM_MODALKEY(BEV_MODAL_VERTEX_MESH_CHANGE), + vmesh_str); - ED_workspace_status_text(C, status_text.c_str()); +#undef WM_MODALKEY + + ED_workspace_status_text(C, status_text); } static bool edbm_bevel_init(bContext *C, wmOperator *op, const bool is_modal) @@ -236,7 +243,7 @@ static bool edbm_bevel_init(bContext *C, wmOperator *op, const bool is_modal) const Vector objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data( scene, view_layer, v3d); for (Object *obedit : objects) { - float scale = mat4_to_scale(obedit->object_to_world().ptr()); + float scale = mat4_to_scale(obedit->object_to_world); opdata->max_obj_scale = max_ff(opdata->max_obj_scale, scale); BMEditMesh *em = BKE_editmesh_from_object(obedit); if (em->bm->totvertsel > 0) { diff --git a/source/blender/editors/mesh/editmesh_bisect.cc b/source/blender/editors/mesh/editmesh_bisect.cc index 410227a0514..4c25f9ec506 100644 --- a/source/blender/editors/mesh/editmesh_bisect.cc +++ b/source/blender/editors/mesh/editmesh_bisect.cc @@ -10,13 +10,13 @@ #include "DNA_object_types.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_context.hh" #include "BKE_editmesh.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_layer.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "BLI_math_geom.h" #include "BLI_math_matrix.h" @@ -320,9 +320,9 @@ static int mesh_bisect_exec(bContext *C, wmOperator *op) copy_v3_v3(plane_co_local, plane_co); copy_v3_v3(plane_no_local, plane_no); - invert_m4_m4(imat, obedit->object_to_world().ptr()); + invert_m4_m4(imat, obedit->object_to_world); mul_m4_v3(imat, plane_co_local); - mul_transposed_mat3_m4_v3(obedit->object_to_world().ptr(), plane_no_local); + mul_transposed_mat3_m4_v3(obedit->object_to_world, plane_no_local); BMOperator bmop; EDBM_op_init( diff --git a/source/blender/editors/mesh/editmesh_extrude.cc b/source/blender/editors/mesh/editmesh_extrude.cc index f58ff0c0699..69f81fa7c2b 100644 --- a/source/blender/editors/mesh/editmesh_extrude.cc +++ b/source/blender/editors/mesh/editmesh_extrude.cc @@ -17,8 +17,7 @@ #include "BKE_context.hh" #include "BKE_editmesh.hh" #include "BKE_layer.hh" -#include "BKE_object_types.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "RNA_access.hh" #include "RNA_define.hh" @@ -60,8 +59,8 @@ static void edbm_extrude_edge_exclude_mirror( float mtx[4][4]; if (mmd->mirror_ob) { float imtx[4][4]; - invert_m4_m4(imtx, mmd->mirror_ob->object_to_world().ptr()); - mul_m4_m4m4(mtx, imtx, obedit->object_to_world().ptr()); + invert_m4_m4(imtx, mmd->mirror_ob->object_to_world); + mul_m4_m4m4(mtx, imtx, obedit->object_to_world); } BM_ITER_MESH (edge, &iter, bm, BM_EDGES_OF_MESH) { @@ -298,7 +297,7 @@ static int edbm_extrude_repeat_exec(bContext *C, wmOperator *op) BMEditMesh *em = BKE_editmesh_from_object(obedit); - copy_m3_m4(tmat, obedit->object_to_world().ptr()); + copy_m3_m4(tmat, obedit->object_to_world); invert_m3(tmat); mul_v3_m3v3(offset_local, tmat, offset); @@ -724,7 +723,7 @@ static int edbm_dupli_extrude_cursor_invoke(bContext *C, wmOperator *op, const w } mul_v3_fl(local_center, 1.0f / float(local_verts_len)); - mul_m4_v3(vc.obedit->object_to_world().ptr(), local_center); + mul_m4_v3(vc.obedit->object_to_world, local_center); mul_v3_fl(local_center, float(local_verts_len)); add_v3_v3(center, local_center); @@ -748,11 +747,11 @@ static int edbm_dupli_extrude_cursor_invoke(bContext *C, wmOperator *op, const w continue; } - invert_m4_m4(vc.obedit->runtime->world_to_object.ptr(), vc.obedit->object_to_world().ptr()); + invert_m4_m4(vc.obedit->world_to_object, vc.obedit->object_to_world); ED_view3d_init_mats_rv3d(vc.obedit, vc.rv3d); float local_center[3]; - mul_v3_m4v3(local_center, vc.obedit->world_to_object().ptr(), center); + mul_v3_m4v3(local_center, vc.obedit->world_to_object, center); /* call extrude? */ if (verts_len != 0) { @@ -798,11 +797,11 @@ static int edbm_dupli_extrude_cursor_invoke(bContext *C, wmOperator *op, const w float view_vec[3], cross[3]; /* convert the 2D normal into 3D */ - mul_mat3_m4_v3(vc.rv3d->viewinv, nor); /* World-space. */ - mul_mat3_m4_v3(vc.obedit->world_to_object().ptr(), nor); /* Local-space. */ + mul_mat3_m4_v3(vc.rv3d->viewinv, nor); /* World-space. */ + mul_mat3_m4_v3(vc.obedit->world_to_object, nor); /* Local-space. */ /* correct the normal to be aligned on the view plane */ - mul_v3_mat3_m4v3(view_vec, vc.obedit->world_to_object().ptr(), vc.rv3d->viewinv[2]); + mul_v3_mat3_m4v3(view_vec, vc.obedit->world_to_object, vc.rv3d->viewinv[2]); cross_v3_v3v3(cross, nor, view_vec); cross_v3_v3v3(nor, view_vec, cross); normalize_v3(nor); @@ -811,9 +810,9 @@ static int edbm_dupli_extrude_cursor_invoke(bContext *C, wmOperator *op, const w /* center */ copy_v3_v3(ofs, local_center); - mul_m4_v3(vc.obedit->object_to_world().ptr(), ofs); /* view space */ + mul_m4_v3(vc.obedit->object_to_world, ofs); /* view space */ ED_view3d_win_to_3d_int(vc.v3d, vc.region, ofs, event->mval, ofs); - mul_m4_v3(vc.obedit->world_to_object().ptr(), ofs); /* back in object space */ + mul_m4_v3(vc.obedit->world_to_object, ofs); /* back in object space */ sub_v3_v3(ofs, local_center); @@ -864,7 +863,7 @@ static int edbm_dupli_extrude_cursor_invoke(bContext *C, wmOperator *op, const w copy_v3_v3(local_center, cursor); ED_view3d_win_to_3d_int(vc.v3d, vc.region, local_center, event->mval, local_center); - mul_m4_v3(vc.obedit->world_to_object().ptr(), local_center); /* back in object space */ + mul_m4_v3(vc.obedit->world_to_object, local_center); /* back in object space */ EDBM_op_init(vc.em, &bmop, op, "create_vert co=%v", local_center); BMO_op_exec(vc.em->bm, &bmop); diff --git a/source/blender/editors/mesh/editmesh_extrude_screw.cc b/source/blender/editors/mesh/editmesh_extrude_screw.cc index eb3dbff238e..5fcc36570db 100644 --- a/source/blender/editors/mesh/editmesh_extrude_screw.cc +++ b/source/blender/editors/mesh/editmesh_extrude_screw.cc @@ -13,7 +13,7 @@ #include "BKE_context.hh" #include "BKE_editmesh.hh" #include "BKE_layer.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "BLI_math_matrix.h" #include "BLI_math_rotation.h" @@ -105,11 +105,11 @@ static int edbm_screw_exec(bContext *C, wmOperator *op) continue; } - copy_v3_v3(nor, obedit->object_to_world().ptr()[2]); + copy_v3_v3(nor, obedit->object_to_world[2]); /* calculate dvec */ - mul_v3_m4v3(v1_co_global, obedit->object_to_world().ptr(), v1->co); - mul_v3_m4v3(v2_co_global, obedit->object_to_world().ptr(), v2->co); + mul_v3_m4v3(v1_co_global, obedit->object_to_world, v1->co); + mul_v3_m4v3(v2_co_global, obedit->object_to_world, v2->co); sub_v3_v3v3(dvec, v1_co_global, v2_co_global); mul_v3_fl(dvec, 1.0f / steps); @@ -129,7 +129,7 @@ static int edbm_screw_exec(bContext *C, wmOperator *op) dvec, turns * steps, DEG2RADF(360.0f * turns), - obedit->object_to_world().ptr(), + obedit->object_to_world, false)) { continue; diff --git a/source/blender/editors/mesh/editmesh_extrude_spin.cc b/source/blender/editors/mesh/editmesh_extrude_spin.cc index 03e92109dca..c0c3f92bbca 100644 --- a/source/blender/editors/mesh/editmesh_extrude_spin.cc +++ b/source/blender/editors/mesh/editmesh_extrude_spin.cc @@ -15,7 +15,7 @@ #include "BKE_context.hh" #include "BKE_editmesh.hh" #include "BKE_layer.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "RNA_access.hh" #include "RNA_define.hh" @@ -79,7 +79,7 @@ static int edbm_spin_exec(bContext *C, wmOperator *op) d, steps, -angle, - obedit->object_to_world().ptr(), + obedit->object_to_world, use_normal_flip, dupli, use_auto_merge)) diff --git a/source/blender/editors/mesh/editmesh_extrude_spin_gizmo.cc b/source/blender/editors/mesh/editmesh_extrude_spin_gizmo.cc index d5eb42a608a..f9bf3b1d2d3 100644 --- a/source/blender/editors/mesh/editmesh_extrude_spin_gizmo.cc +++ b/source/blender/editors/mesh/editmesh_extrude_spin_gizmo.cc @@ -13,7 +13,7 @@ #include "BLI_math_vector.h" #include "BKE_context.hh" -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "RNA_access.hh" #include "RNA_define.hh" @@ -367,7 +367,7 @@ static void gizmo_mesh_spin_init_refresh(const bContext *C, wmGizmoGroup *gzgrou } if (totsel) { mul_v3_fl(select_center, 1.0f / totsel); - mul_m4_v3(obedit->object_to_world().ptr(), select_center); + mul_m4_v3(obedit->object_to_world, select_center); copy_v3_v3(ggd->data.select_center, select_center); ggd->data.use_select_center = true; } diff --git a/source/blender/editors/mesh/editmesh_inset.cc b/source/blender/editors/mesh/editmesh_inset.cc index ded43533212..0b6d9f9ae62 100644 --- a/source/blender/editors/mesh/editmesh_inset.cc +++ b/source/blender/editors/mesh/editmesh_inset.cc @@ -14,11 +14,11 @@ #include "BLI_math_vector.h" #include "BLI_string.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_context.hh" #include "BKE_editmesh.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_layer.hh" #include "BKE_unit.hh" @@ -141,7 +141,7 @@ static bool edbm_inset_init(bContext *C, wmOperator *op, const bool is_modal) MEM_malloc_arrayN(objects.size(), sizeof(*opdata->ob_store), __func__)); for (uint ob_index = 0; ob_index < objects.size(); ob_index++) { Object *obedit = objects[ob_index]; - float scale = mat4_to_scale(obedit->object_to_world().ptr()); + float scale = mat4_to_scale(obedit->object_to_world); opdata->max_obj_scale = max_ff(opdata->max_obj_scale, scale); BMEditMesh *em = BKE_editmesh_from_object(obedit); if (em->bm->totvertsel > 0) { diff --git a/source/blender/editors/mesh/editmesh_intersect.cc b/source/blender/editors/mesh/editmesh_intersect.cc index af7ceef1e76..eeb7342430f 100644 --- a/source/blender/editors/mesh/editmesh_intersect.cc +++ b/source/blender/editors/mesh/editmesh_intersect.cc @@ -21,7 +21,7 @@ #include "BKE_editmesh.hh" #include "BKE_editmesh_bvh.h" #include "BKE_layer.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "RNA_access.hh" #include "RNA_define.hh" @@ -34,6 +34,8 @@ #include "ED_mesh.hh" #include "ED_screen.hh" +#include "intern/bmesh_private.hh" + #include "mesh_intern.hh" /* own include */ #include "tools/bmesh_boolean.hh" diff --git a/source/blender/editors/mesh/editmesh_knife.cc b/source/blender/editors/mesh/editmesh_knife.cc index 0d57afeee22..f5b06979af3 100644 --- a/source/blender/editors/mesh/editmesh_knife.cc +++ b/source/blender/editors/mesh/editmesh_knife.cc @@ -12,8 +12,6 @@ # define _USE_MATH_DEFINES #endif -#include - #include "MEM_guardedalloc.h" #include "BLF_api.hh" @@ -32,14 +30,15 @@ #include "BLI_stack.h" #include "BLI_string.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_bvhutils.hh" #include "BKE_context.hh" #include "BKE_editmesh.hh" +#include "BKE_editmesh_bvh.h" #include "BKE_layer.hh" -#include "BKE_report.hh" -#include "BKE_scene.hh" +#include "BKE_report.h" +#include "BKE_scene.h" #include "BKE_unit.hh" #include "GPU_immediate.h" @@ -107,20 +106,24 @@ struct KnifeColors { /* Knife-tool Operator. */ struct KnifeVert { + Object *ob; + uint ob_index; BMVert *v; /* Non-null if this is an original vert. */ ListBase edges; ListBase faces; - /* Index of the associated object. - * -1 represents the absence of an object. */ - int ob_index; - float co[3], cageco[3]; + bool is_face, in_space; bool is_cut; /* Along a cut created by user input (will draw too). */ bool is_invalid; bool is_splitting; /* Created when an edge was split. */ }; +struct Ref { + Ref *next, *prev; + void *ref; +}; + struct KnifeEdge { KnifeVert *v1, *v2; BMFace *basef; /* Face to restrict face fill to. */ @@ -136,6 +139,7 @@ struct KnifeLineHit { float hit[3], cagehit[3]; float schit[2]; /* Screen coordinates for cagehit. */ float l; /* Lambda along cut line. */ + float perc; /* Lambda along hit line. */ float m; /* Depth front-to-back. */ /* Exactly one of kfe, v, or f should be non-null, @@ -144,13 +148,12 @@ struct KnifeLineHit { KnifeEdge *kfe; KnifeVert *v; BMFace *f; - - /* Index of the associated object. - * -1 represents the absence of an object. */ - int ob_index; + Object *ob; + uint ob_index; }; struct KnifePosData { + float3 co; float3 cage; /* At most one of vert, edge, or bmface should be non-null, @@ -159,17 +162,13 @@ struct KnifePosData { KnifeVert *vert; KnifeEdge *edge; BMFace *bmface; + Object *ob; /* Object of the vert, edge or bmface. */ + uint ob_index; - /* Index of the associated object. - * -1 represents the absence of an object. */ - int ob_index; + /* When true, the cursor isn't over a face. */ + bool is_space; - float2 mval; /* Mouse screen position (may be non-integral if snapped to something). */ - - bool is_space() const - { - return this->ob_index == -1; - } + float mval[2]; /* Mouse screen position (may be non-integral if snapped to something). */ }; struct KnifeMeasureData { @@ -188,7 +187,8 @@ struct KnifeUndoFrame { struct KnifeBVH { BVHTree *tree; /* Knife Custom BVH Tree. */ BMLoop *(*looptris)[3]; /* Used by #knife_bvh_raycast_cb to store the intersecting triangles. */ - int ob_index; + float uv[2]; /* Used by #knife_bvh_raycast_cb to store the intersecting uv. */ + uint ob_index; /* Use #bm_ray_cast_cb_elem_not_in_face_check. */ bool (*filter_cb)(BMFace *f, void *userdata); @@ -591,10 +591,9 @@ static void knifetool_draw_angle(const KnifeTool_OpData *kcd, float axis[3]; float arc_angle; - Object *ob = kcd->objects[kcd->curr.ob_index]; - const float inverse_average_scale = 1 / (ob->object_to_world().ptr()[0][0] + - ob->object_to_world().ptr()[1][1] + - ob->object_to_world().ptr()[2][2]); + const float inverse_average_scale = 1 / (kcd->curr.ob->object_to_world[0][0] + + kcd->curr.ob->object_to_world[1][1] + + kcd->curr.ob->object_to_world[2][2]); const float px_scale = 3.0f * inverse_average_scale * @@ -703,9 +702,9 @@ static void knifetool_draw_visible_angles(const KnifeTool_OpData *kcd) float angle = 0.0f; float *end; - kfe = static_cast(((LinkData *)kfv->edges.first)->data); - LISTBASE_FOREACH (LinkData *, ref, &kfv->edges) { - tempkfe = static_cast(ref->data); + kfe = static_cast(((Ref *)kfv->edges.first)->ref); + LISTBASE_FOREACH (Ref *, ref, &kfv->edges) { + tempkfe = static_cast(ref->ref); if (tempkfe->v1 != kfv) { tempkfv = tempkfe->v1; } @@ -786,9 +785,9 @@ static void knifetool_draw_visible_angles(const KnifeTool_OpData *kcd) } else { /* Choose minimum angle edge. */ - kfe = static_cast(((LinkData *)kfv->edges.first)->data); - LISTBASE_FOREACH (LinkData *, ref, &kfv->edges) { - tempkfe = static_cast(ref->data); + kfe = static_cast(((Ref *)kfv->edges.first)->ref); + LISTBASE_FOREACH (Ref *, ref, &kfv->edges) { + tempkfe = static_cast(ref->ref); if (tempkfe->v1 != kfv) { tempkfv = tempkfe->v1; } @@ -855,7 +854,7 @@ static void knifetool_draw_visible_angles(const KnifeTool_OpData *kcd) knifetool_draw_angle( kcd, kcd->curr.cage, kcd->prev.cage, end, kcd->curr.mval, kcd->prev.mval, end_ss, angle); } - else if (kcd->mdata.is_stored && !kcd->prev.is_space()) { + else if (kcd->mdata.is_stored && !kcd->prev.is_space) { float angle = angle_v3v3v3(kcd->curr.cage, kcd->prev.cage, kcd->mdata.cage); knifetool_draw_angle(kcd, kcd->curr.cage, @@ -1099,29 +1098,37 @@ static void knifetool_draw(const bContext * /*C*/, ARegion * /*region*/, void *a static void knife_update_header(bContext *C, wmOperator *op, KnifeTool_OpData *kcd) { - auto get_modal_key_str = [&](int id) { - return WM_modalkeymap_operator_items_to_string(op->type, id, true).value_or(""); - }; + char header[UI_MAX_DRAW_STR]; + char buf[UI_MAX_DRAW_STR]; - const std::string header = fmt::format( - IFACE_("{}: confirm, {}: cancel, {}: undo, " - "{}: start/define cut, {}: close cut, {}: new cut, " - "{}: midpoint snap ({}), {}: ignore snap ({}), " - "{}: angle constraint {:.2f}({:.2f}) ({}{}{}{}), {}: cut through ({}), " - "{}: panning, {}{}{}: orientation lock ({}), " - "{}: distance/angle measurements ({}), " - "{}: x-ray ({})"), - get_modal_key_str(KNF_MODAL_CONFIRM), - get_modal_key_str(KNF_MODAL_CANCEL), - get_modal_key_str(KNF_MODAL_UNDO), - get_modal_key_str(KNF_MODAL_ADD_CUT), - get_modal_key_str(KNF_MODAL_ADD_CUT_CLOSED), - get_modal_key_str(KNF_MODAL_NEW_CUT), - get_modal_key_str(KNF_MODAL_MIDPOINT_ON), + char *p = buf; + int available_len = sizeof(buf); + +#define WM_MODALKEY(_id) \ +\ + WM_modalkeymap_operator_items_to_string_buf( \ + op->type, (_id), true, UI_MAX_SHORTCUT_STR, &available_len, &p) + + SNPRINTF( + header, + IFACE_("%s: confirm, %s: cancel, %s: undo, " + "%s: start/define cut, %s: close cut, %s: new cut, " + "%s: midpoint snap (%s), %s: ignore snap (%s), " + "%s: angle constraint %.2f(%.2f) (%s%s%s%s), %s: cut through (%s), " + "%s: panning, %s%s%s: orientation lock (%s), " + "%s: distance/angle measurements (%s), " + "%s: x-ray (%s)"), + WM_MODALKEY(KNF_MODAL_CONFIRM), + WM_MODALKEY(KNF_MODAL_CANCEL), + WM_MODALKEY(KNF_MODAL_UNDO), + WM_MODALKEY(KNF_MODAL_ADD_CUT), + WM_MODALKEY(KNF_MODAL_ADD_CUT_CLOSED), + WM_MODALKEY(KNF_MODAL_NEW_CUT), + WM_MODALKEY(KNF_MODAL_MIDPOINT_ON), WM_bool_as_string(kcd->snap_midpoints), - get_modal_key_str(KNF_MODAL_IGNORE_SNAP_ON), + WM_MODALKEY(KNF_MODAL_IGNORE_SNAP_ON), WM_bool_as_string(kcd->ignore_edge_snapping), - get_modal_key_str(KNF_MODAL_ANGLE_SNAP_TOGGLE), + WM_MODALKEY(KNF_MODAL_ANGLE_SNAP_TOGGLE), (kcd->angle >= 0.0f) ? RAD2DEGF(kcd->angle) : 360.0f + RAD2DEGF(kcd->angle), (kcd->angle_snapping_increment > KNIFE_MIN_ANGLE_SNAPPING_INCREMENT && kcd->angle_snapping_increment <= KNIFE_MAX_ANGLE_SNAPPING_INCREMENT) ? @@ -1132,22 +1139,24 @@ static void knife_update_header(bContext *C, wmOperator *op, KnifeTool_OpData *k "OFF", /* TODO: Can this be simplified? */ (kcd->angle_snapping_mode == KNF_CONSTRAIN_ANGLE_MODE_RELATIVE) ? " - " : "", (kcd->angle_snapping_mode == KNF_CONSTRAIN_ANGLE_MODE_RELATIVE) ? - get_modal_key_str(KNF_MODAL_CYCLE_ANGLE_SNAP_EDGE) : + WM_MODALKEY(KNF_MODAL_CYCLE_ANGLE_SNAP_EDGE) : "", (kcd->angle_snapping_mode == KNF_CONSTRAIN_ANGLE_MODE_RELATIVE) ? ": cycle edge" : "", /**/ - get_modal_key_str(KNF_MODAL_CUT_THROUGH_TOGGLE), + WM_MODALKEY(KNF_MODAL_CUT_THROUGH_TOGGLE), WM_bool_as_string(kcd->cut_through), - get_modal_key_str(KNF_MODAL_PANNING), - get_modal_key_str(KNF_MODAL_X_AXIS), - get_modal_key_str(KNF_MODAL_Y_AXIS), - get_modal_key_str(KNF_MODAL_Z_AXIS), + WM_MODALKEY(KNF_MODAL_PANNING), + WM_MODALKEY(KNF_MODAL_X_AXIS), + WM_MODALKEY(KNF_MODAL_Y_AXIS), + WM_MODALKEY(KNF_MODAL_Z_AXIS), (kcd->axis_constrained ? kcd->axis_string : WM_bool_as_string(kcd->axis_constrained)), - get_modal_key_str(KNF_MODAL_SHOW_DISTANCE_ANGLE_TOGGLE), + WM_MODALKEY(KNF_MODAL_SHOW_DISTANCE_ANGLE_TOGGLE), WM_bool_as_string(kcd->show_dist_angle), - get_modal_key_str(KNF_MODAL_DEPTH_TEST_TOGGLE), + WM_MODALKEY(KNF_MODAL_DEPTH_TEST_TOGGLE), WM_bool_as_string(!kcd->depth_test)); - ED_workspace_status_text(C, header.c_str()); +#undef WM_MODALKEY + + ED_workspace_status_text(C, header); } /** \} */ @@ -1192,7 +1201,7 @@ static void knife_bm_tri_cagecos_get_worldspace(const KnifeTool_OpData *kcd, knife_bm_tri_cagecos_get(kcd, ob_index, tri_index, cos); const Object *ob = kcd->objects[ob_index]; for (int i = 0; i < 3; i++) { - mul_m4_v3(ob->object_to_world().ptr(), cos[i]); + mul_m4_v3(ob->object_to_world, cos[i]); } } @@ -1316,12 +1325,12 @@ static void knife_bvh_raycast_cb(void *userdata, Object *ob; BMEditMesh *em; - float dist; + float dist, uv[2]; bool isect; int tottri; tottri = 0; - int ob_index = 0; + uint ob_index = 0; for (; ob_index < kcd->objects.size(); ob_index++) { index -= tottri; ob = kcd->objects[ob_index]; @@ -1343,12 +1352,12 @@ static void knife_bvh_raycast_cb(void *userdata, knife_bm_tri_cagecos_get_worldspace(kcd, ob_index, index, tri_cos); isect = (ray->radius > 0.0f ? isect_ray_tri_epsilon_v3( - ray->origin, ray->direction, UNPACK3(tri_cos), &dist, nullptr, ray->radius) : + ray->origin, ray->direction, UNPACK3(tri_cos), &dist, uv, ray->radius) : #ifdef USE_KDOPBVH_WATERTIGHT isect_ray_tri_watertight_v3( - ray->origin, ray->isect_precalc, UNPACK3(tri_cos), &dist, nullptr)); + ray->origin, ray->isect_precalc, UNPACK3(tri_cos), &dist, uv)); #else -isect_ray_tri_v3(ray->origin, ray->direction, UNPACK3(tri_cos), &dist, nullptr); +isect_ray_tri_v3(ray->origin, ray->direction, UNPACK3(tri_cos), &dist, uv); #endif if (isect && dist < hit->dist) { @@ -1367,6 +1376,7 @@ isect_ray_tri_v3(ray->origin, ray->direction, UNPACK3(tri_cos), &dist, nullptr); copy_v3_v3(hit->no, ltri[0]->f->no); kcd->bvh.looptris = em->looptris; + copy_v2_v2(kcd->bvh.uv, uv); kcd->bvh.ob_index = ob_index; } } @@ -1377,8 +1387,9 @@ static BMFace *knife_bvh_raycast(KnifeTool_OpData *kcd, const float dir[3], const float radius, float *r_dist, + float r_hitout[3], float r_cagehit[3], - int *r_ob_index) + uint *r_ob_index) { BMFace *face; BVHTreeRayHit hit; @@ -1392,8 +1403,15 @@ static BMFace *knife_bvh_raycast(KnifeTool_OpData *kcd, if (hit.index != -1 && hit.dist != dist) { face = kcd->bvh.looptris[hit.index][0]->f; - if (r_cagehit) { - copy_v3_v3(r_cagehit, hit.co); + /* Hits returned in world space. */ + if (r_hitout) { + float tri_cos[3][3]; + knife_bm_tri_cagecos_get_worldspace(kcd, kcd->bvh.ob_index, hit.index, tri_cos); + interp_v3_v3v3v3_uv(r_hitout, UNPACK3(tri_cos), kcd->bvh.uv); + + if (r_cagehit) { + copy_v3_v3(r_cagehit, hit.co); + } } if (r_dist) { @@ -1415,20 +1433,52 @@ static BMFace *knife_bvh_raycast_filter(KnifeTool_OpData *kcd, const float dir[3], const float radius, float *r_dist, + float r_hitout[3], float r_cagehit[3], - int *r_ob_index, + uint *r_ob_index, bool (*filter_cb)(BMFace *f, void *userdata), void *filter_userdata) { kcd->bvh.filter_cb = filter_cb; kcd->bvh.filter_data = filter_userdata; - BMFace *face = knife_bvh_raycast(kcd, co, dir, radius, r_dist, r_cagehit, r_ob_index); + BMFace *face; + BVHTreeRayHit hit; + const float dist = r_dist ? *r_dist : FLT_MAX; + hit.dist = dist; + hit.index = -1; + + BLI_bvhtree_ray_cast(kcd->bvh.tree, co, dir, radius, &hit, knife_bvh_raycast_cb, kcd); kcd->bvh.filter_cb = nullptr; kcd->bvh.filter_data = nullptr; - return face; + /* Handle Hit */ + if (hit.index != -1 && hit.dist != dist) { + face = kcd->bvh.looptris[hit.index][0]->f; + + /* Hits returned in world space. */ + if (r_hitout) { + float tri_cos[3][3]; + knife_bm_tri_cagecos_get_worldspace(kcd, kcd->bvh.ob_index, hit.index, tri_cos); + interp_v3_v3v3v3_uv(r_hitout, UNPACK3(tri_cos), kcd->bvh.uv); + + if (r_cagehit) { + copy_v3_v3(r_cagehit, hit.co); + } + } + + if (r_dist) { + *r_dist = hit.dist; + } + + if (r_ob_index) { + *r_ob_index = kcd->bvh.ob_index; + } + + return face; + } + return nullptr; } /** \} */ @@ -1461,13 +1511,14 @@ static void UNUSED_FUNCTION(knifetool_recast_cageco)(KnifeTool_OpData *kcd, float origin[3]; float origin_ofs[3]; float ray[3], ray_normal[3]; + float co[3]; /* Unused. */ knife_input_ray_segment(kcd, mval, origin, origin_ofs); sub_v3_v3v3(ray, origin_ofs, origin); normalize_v3_v3(ray_normal, ray); - knife_bvh_raycast(kcd, origin, ray_normal, 0.0f, nullptr, r_cage, nullptr); + knife_bvh_raycast(kcd, origin, ray_normal, 0.0f, nullptr, co, r_cage, nullptr); } static bool knife_verts_edge_in_face(KnifeVert *v1, KnifeVert *v2, BMFace *f) @@ -1535,8 +1586,8 @@ static BMElem *bm_elem_from_knife_vert(KnifeVert *kfv, KnifeEdge **r_kfe) if (r_kfe || ele_test == nullptr) { if (kfv->v == nullptr) { - LISTBASE_FOREACH (LinkData *, ref, &kfv->edges) { - kfe = static_cast(ref->data); + LISTBASE_FOREACH (Ref *, ref, &kfv->edges) { + kfe = static_cast(ref->ref); if (kfe->e) { if (r_kfe) { *r_kfe = kfe; @@ -1557,7 +1608,7 @@ static BMElem *bm_elem_from_knife_vert(KnifeVert *kfv, KnifeEdge **r_kfe) /* face? */ if (ele_test == nullptr) { if (BLI_listbase_is_single(&kfe->faces)) { - ele_test = static_cast(((LinkData *)kfe->faces.first)->data); + ele_test = static_cast(((Ref *)kfe->faces.first)->ref); } } @@ -1594,17 +1645,17 @@ static ListBase *knife_empty_list(KnifeTool_OpData *kcd) static void knife_append_list(KnifeTool_OpData *kcd, ListBase *lst, void *elem) { - LinkData *ref; + Ref *ref; - ref = static_cast(BLI_mempool_calloc(kcd->refs)); - ref->data = elem; + ref = static_cast(BLI_mempool_calloc(kcd->refs)); + ref->ref = elem; BLI_addtail(lst, ref); } -static LinkData *find_ref(ListBase *lb, void *ref) +static Ref *find_ref(ListBase *lb, void *ref) { - LISTBASE_FOREACH (LinkData *, ref1, lb) { - if (ref1->data == ref) { + LISTBASE_FOREACH (Ref *, ref1, lb) { + if (ref1->ref == ref) { return ref1; } } @@ -1640,10 +1691,10 @@ static void knife_add_edge_faces_to_vert(KnifeTool_OpData *kcd, KnifeVert *kfv, * If more than one, return the first; if none, return nullptr. */ static BMFace *knife_find_common_face(ListBase *faces1, ListBase *faces2) { - LISTBASE_FOREACH (LinkData *, ref1, faces1) { - LISTBASE_FOREACH (LinkData *, ref2, faces2) { - if (ref1->data == ref2->data) { - return (BMFace *)(ref1->data); + LISTBASE_FOREACH (Ref *, ref1, faces1) { + LISTBASE_FOREACH (Ref *, ref2, faces2) { + if (ref1->ref == ref2->ref) { + return (BMFace *)(ref1->ref); } } } @@ -1676,7 +1727,7 @@ static KnifeEdge *new_knife_edge(KnifeTool_OpData *kcd) } /* Get a KnifeVert wrapper for an existing BMVert. */ -static KnifeVert *get_bm_knife_vert(KnifeTool_OpData *kcd, BMVert *v, int ob_index) +static KnifeVert *get_bm_knife_vert(KnifeTool_OpData *kcd, BMVert *v, Object *ob, uint ob_index) { KnifeVert *kfv = static_cast(BLI_ghash_lookup(kcd->origvertmap, v)); const float *cageco; @@ -1693,11 +1744,11 @@ static KnifeVert *get_bm_knife_vert(KnifeTool_OpData *kcd, BMVert *v, int ob_ind } float cageco_ws[3]; - Object *ob = kcd->objects[ob_index]; - mul_v3_m4v3(cageco_ws, ob->object_to_world().ptr(), cageco); + mul_v3_m4v3(cageco_ws, ob->object_to_world, cageco); kfv = new_knife_vert(kcd, v->co, cageco_ws); kfv->v = v; + kfv->ob = ob; kfv->ob_index = ob_index; BLI_ghash_insert(kcd->origvertmap, v, kfv); @@ -1710,7 +1761,7 @@ static KnifeVert *get_bm_knife_vert(KnifeTool_OpData *kcd, BMVert *v, int ob_ind } /* Get a KnifeEdge wrapper for an existing BMEdge. */ -static KnifeEdge *get_bm_knife_edge(KnifeTool_OpData *kcd, BMEdge *e, int ob_index) +static KnifeEdge *get_bm_knife_edge(KnifeTool_OpData *kcd, BMEdge *e, Object *ob, uint ob_index) { KnifeEdge *kfe = static_cast(BLI_ghash_lookup(kcd->origedgemap, e)); if (!kfe) { @@ -1719,8 +1770,8 @@ static KnifeEdge *get_bm_knife_edge(KnifeTool_OpData *kcd, BMEdge *e, int ob_ind kfe = new_knife_edge(kcd); kfe->e = e; - kfe->v1 = get_bm_knife_vert(kcd, e->v1, ob_index); - kfe->v2 = get_bm_knife_vert(kcd, e->v2, ob_index); + kfe->v1 = get_bm_knife_vert(kcd, e->v1, ob, ob_index); + kfe->v2 = get_bm_knife_vert(kcd, e->v2, ob, ob_index); knife_add_to_vert_edges(kcd, kfe); @@ -1734,7 +1785,7 @@ static KnifeEdge *get_bm_knife_edge(KnifeTool_OpData *kcd, BMEdge *e, int ob_ind return kfe; } -static ListBase *knife_get_face_kedges(KnifeTool_OpData *kcd, int ob_index, BMFace *f) +static ListBase *knife_get_face_kedges(KnifeTool_OpData *kcd, Object *ob, uint ob_index, BMFace *f) { ListBase *list = static_cast(BLI_ghash_lookup(kcd->kedgefacemap, f)); @@ -1745,7 +1796,7 @@ static ListBase *knife_get_face_kedges(KnifeTool_OpData *kcd, int ob_index, BMFa list = knife_empty_list(kcd); BM_ITER_ELEM (e, &bmiter, f, BM_EDGES_OF_FACE) { - knife_append_list(kcd, list, get_bm_knife_edge(kcd, e, ob_index)); + knife_append_list(kcd, list, get_bm_knife_edge(kcd, e, ob, ob_index)); } BLI_ghash_insert(kcd->kedgefacemap, f, list); @@ -1756,7 +1807,7 @@ static ListBase *knife_get_face_kedges(KnifeTool_OpData *kcd, int ob_index, BMFa static void knife_edge_append_face(KnifeTool_OpData *kcd, KnifeEdge *kfe, BMFace *f) { - knife_append_list(kcd, knife_get_face_kedges(kcd, kfe->v1->ob_index, f), kfe); + knife_append_list(kcd, knife_get_face_kedges(kcd, kfe->v1->ob, kfe->v1->ob_index, f), kfe); knife_append_list(kcd, &kfe->faces, f); } @@ -1767,11 +1818,12 @@ static KnifeVert *knife_split_edge(KnifeTool_OpData *kcd, KnifeEdge **r_kfe) { KnifeEdge *newkfe = new_knife_edge(kcd); - LinkData *ref; + Ref *ref; BMFace *f; newkfe->v1 = kfe->v1; newkfe->v2 = new_knife_vert(kcd, co, cageco); + newkfe->v2->ob = kfe->v1->ob; newkfe->v2->ob_index = kfe->v1->ob_index; newkfe->v2->is_cut = true; if (kfe->e) { @@ -1795,8 +1847,8 @@ static KnifeVert *knife_split_edge(KnifeTool_OpData *kcd, kfe->v1->is_splitting = true; BLI_addtail(&kfe->v1->edges, ref); - LISTBASE_FOREACH (LinkData *, ref, &kfe->faces) { - knife_edge_append_face(kcd, newkfe, static_cast(ref->data)); + LISTBASE_FOREACH (Ref *, ref, &kfe->faces) { + knife_edge_append_face(kcd, newkfe, static_cast(ref->ref)); } knife_add_to_vert_edges(kcd, newkfe); @@ -1836,15 +1888,23 @@ static void knife_join_edge(KnifeEdge *newkfe, KnifeEdge *kfe) /** \name Cut/Hit Utils * \{ */ -static void knife_snap_curr(KnifeTool_OpData *kcd, const float2 &mval); - /* User has just clicked for first time or first time after a restart (E key). * Copy the current position data into prev. */ -static void knife_start_cut(KnifeTool_OpData *kcd, const float2 &mval) +static void knife_start_cut(KnifeTool_OpData *kcd) { - knife_snap_curr(kcd, mval); kcd->prev = kcd->curr; + kcd->curr.is_space = false; /* TODO: Why do we do this? */ kcd->mdata.is_stored = false; + + if (kcd->prev.vert == nullptr && kcd->prev.edge == nullptr) { + float ofs_local[3]; + negate_v3_v3(ofs_local, kcd->vc.rv3d->ofs); + ED_view3d_win_to_3d(kcd->vc.v3d, kcd->region, ofs_local, kcd->curr.mval, kcd->prev.cage); + + copy_v3_v3(kcd->prev.co, kcd->prev.cage); /* TODO: do we need this? */ + copy_v3_v3(kcd->curr.cage, kcd->prev.cage); + copy_v3_v3(kcd->curr.co, kcd->prev.co); + } } static void linehit_to_knifepos(KnifePosData *kpos, KnifeLineHit *lh) @@ -1853,6 +1913,7 @@ static void linehit_to_knifepos(KnifePosData *kpos, KnifeLineHit *lh) kpos->vert = lh->v; kpos->edge = lh->kfe; copy_v3_v3(kpos->cage, lh->cagehit); + copy_v3_v3(kpos->co, lh->hit); copy_v2_v2(kpos->mval, lh->schit); } @@ -2056,8 +2117,10 @@ static void knife_add_single_cut(KnifeTool_OpData *kcd, else { BLI_assert(lh1->f); kfe->v1 = new_knife_vert(kcd, lh1->hit, lh1->cagehit); + kfe->v1->ob = lh1->ob; kfe->v1->ob_index = lh1->ob_index; kfe->v1->is_cut = true; + kfe->v1->is_face = true; knife_append_list(kcd, &kfe->v1->faces, lh1->f); lh1->v = kfe->v1; /* Record the #KnifeVert for this hit. */ } @@ -2072,8 +2135,10 @@ static void knife_add_single_cut(KnifeTool_OpData *kcd, else { BLI_assert(lh2->f); kfe->v2 = new_knife_vert(kcd, lh2->hit, lh2->cagehit); + kfe->v2->ob = lh2->ob; kfe->v2->ob_index = lh2->ob_index; kfe->v2->is_cut = true; + kfe->v2->is_face = true; knife_append_list(kcd, &kfe->v2->faces, lh2->f); lh2->v = kfe->v2; /* Record the KnifeVert for this hit. */ } @@ -2094,15 +2159,15 @@ static void knife_add_single_cut(KnifeTool_OpData *kcd, */ static void knife_cut_face(KnifeTool_OpData *kcd, BMFace *f, ListBase *hits) { - LinkData *r; + Ref *r; if (BLI_listbase_count_at_most(hits, 2) != 2) { return; } - for (r = static_cast(hits->first); r->next; r = r->next) { + for (r = static_cast(hits->first); r->next; r = r->next) { knife_add_single_cut( - kcd, static_cast(r->data), static_cast(r->next->data), f); + kcd, static_cast(r->ref), static_cast(r->next->ref), f); } } @@ -2120,9 +2185,9 @@ static void knife_make_face_cuts(KnifeTool_OpData *kcd, BMesh *bm, BMFace *f, Li BLI_assert(BLI_gset_len(kcd->edgenet.edge_visit) == 0); i = 0; - LISTBASE_FOREACH (LinkData *, ref, kfedges) { + LISTBASE_FOREACH (Ref *, ref, kfedges) { bool is_new_edge = false; - kfe = static_cast(ref->data); + kfe = static_cast(ref->ref); if (kfe->is_invalid) { continue; @@ -2225,8 +2290,8 @@ static void knife_make_face_cuts(KnifeTool_OpData *kcd, BMesh *bm, BMFace *f, Li static int sort_verts_by_dist_cb(void *co_p, const void *cur_a_p, const void *cur_b_p) { - const KnifeVert *cur_a = static_cast(((const LinkData *)cur_a_p)->data); - const KnifeVert *cur_b = static_cast(((const LinkData *)cur_b_p)->data); + const KnifeVert *cur_a = static_cast(((const Ref *)cur_a_p)->ref); + const KnifeVert *cur_b = static_cast(((const Ref *)cur_b_p)->ref); const float *co = static_cast(co_p); const float a_sq = len_squared_v3v3(co, cur_a->co); const float b_sq = len_squared_v3v3(co, cur_b->co); @@ -2241,9 +2306,8 @@ static int sort_verts_by_dist_cb(void *co_p, const void *cur_a_p, const void *cu } /* Use the network of KnifeEdges and KnifeVerts accumulated to make real BMVerts and BMEdedges. */ -static void knife_make_cuts(KnifeTool_OpData *kcd, int ob_index) +static void knife_make_cuts(KnifeTool_OpData *kcd, Object *ob) { - Object *ob = kcd->objects[ob_index]; BMEditMesh *em = BKE_editmesh_from_object(ob); BMesh *bm = em->bm; KnifeEdge *kfe; @@ -2260,7 +2324,7 @@ static void knife_make_cuts(KnifeTool_OpData *kcd, int ob_index) for (kfe = static_cast(BLI_mempool_iterstep(&iter)); kfe; kfe = static_cast(BLI_mempool_iterstep(&iter))) { - if (kfe->is_invalid || kfe->v1->ob_index != ob_index) { + if (kfe->is_invalid || kfe->v1->ob != ob) { continue; } @@ -2288,11 +2352,11 @@ static void knife_make_cuts(KnifeTool_OpData *kcd, int ob_index) for (kfv = static_cast(BLI_mempool_iterstep(&iter)); kfv; kfv = static_cast(BLI_mempool_iterstep(&iter))) { - if (kfv->v || kfv->is_invalid || kfv->ob_index != ob_index) { + if (kfv->v || kfv->is_invalid || kfv->ob != ob) { continue; /* Already have a BMVert. */ } - LISTBASE_FOREACH (LinkData *, ref, &kfv->edges) { - kfe = static_cast(ref->data); + LISTBASE_FOREACH (Ref *, ref, &kfv->edges) { + kfe = static_cast(ref->ref); BMEdge *e = kfe->e; if (!e) { continue; @@ -2313,8 +2377,8 @@ static void knife_make_cuts(KnifeTool_OpData *kcd, int ob_index) for (auto [e, list] : ehash.items()) { BLI_listbase_sort_r(list, sort_verts_by_dist_cb, e->v1->co); - LISTBASE_FOREACH (LinkData *, ref, list) { - kfv = static_cast(ref->data); + LISTBASE_FOREACH (Ref *, ref, list) { + kfv = static_cast(ref->ref); pct = line_point_factor_v3(kfv->co, e->v1->co, e->v2->co); kfv->v = BM_edge_split(bm, e, e->v1, &enew, pct); } @@ -2379,13 +2443,13 @@ static void knife_add_cut(KnifeTool_OpData *kcd) add_hit_to_facehits(kcd, facehits, lh->f, lh); } if (lh->v) { - LISTBASE_FOREACH (LinkData *, r, &lh->v->faces) { - add_hit_to_facehits(kcd, facehits, static_cast(r->data), lh); + LISTBASE_FOREACH (Ref *, r, &lh->v->faces) { + add_hit_to_facehits(kcd, facehits, static_cast(r->ref), lh); } } if (lh->kfe) { - LISTBASE_FOREACH (LinkData *, r, &lh->kfe->faces) { - add_hit_to_facehits(kcd, facehits, static_cast(r->data), lh); + LISTBASE_FOREACH (Ref *, r, &lh->kfe->faces) { + add_hit_to_facehits(kcd, facehits, static_cast(r->ref), lh); } } } @@ -2490,13 +2554,13 @@ static bool knife_ray_intersect_face(KnifeTool_OpData *kcd, const float s[2], const float v1[3], const float v2[3], - int ob_index, + Object *ob, + uint ob_index, BMFace *f, const float face_tol_sq, float hit_co[3], float hit_cageco[3]) { - Object *ob = kcd->objects[ob_index]; BMEditMesh *em = BKE_editmesh_from_object(ob); int tottri, tri_i; @@ -2541,9 +2605,9 @@ static bool knife_ray_intersect_face(KnifeTool_OpData *kcd, } interp_v3_v3v3v3_uv(hit_cageco, UNPACK3(tri_cos), ray_tri_uv); /* Now check that far enough away from verts and edges. */ - list = knife_get_face_kedges(kcd, ob_index, f); - LISTBASE_FOREACH (LinkData *, ref, list) { - kfe = static_cast(ref->data); + list = knife_get_face_kedges(kcd, ob, ob_index, f); + LISTBASE_FOREACH (Ref *, ref, list) { + kfe = static_cast(ref->ref); if (kfe->is_invalid) { continue; } @@ -2575,7 +2639,7 @@ static void calc_ortho_extent(KnifeTool_OpData *kcd) float ws[3]; INIT_MINMAX(min, max); - for (int ob_index = 0; ob_index < kcd->objects.size(); ob_index++) { + for (uint ob_index = 0; ob_index < kcd->objects.size(); ob_index++) { ob = kcd->objects[ob_index]; em = BKE_editmesh_from_object(ob); @@ -2583,14 +2647,14 @@ static void calc_ortho_extent(KnifeTool_OpData *kcd) if (cagecos) { for (int i = 0; i < em->bm->totvert; i++) { copy_v3_v3(ws, cagecos[i]); - mul_m4_v3(ob->object_to_world().ptr(), ws); + mul_m4_v3(ob->object_to_world, ws); minmax_v3v3_v3(min, max, ws); } } else { BM_ITER_MESH (v, &iter, em->bm, BM_VERTS_OF_MESH) { copy_v3_v3(ws, v->co); - mul_m4_v3(ob->object_to_world().ptr(), ws); + mul_m4_v3(ob->object_to_world, ws); minmax_v3v3_v3(min, max, ws); } } @@ -2718,11 +2782,12 @@ static bool point_is_visible(KnifeTool_OpData *kcd, &dist, nullptr, nullptr, + nullptr, bm_ray_cast_cb_elem_not_in_face_check, ele_test); } else { - f_hit = knife_bvh_raycast(kcd, p_ofs, view, KNIFE_FLT_EPS, &dist, nullptr, nullptr); + f_hit = knife_bvh_raycast(kcd, p_ofs, view, KNIFE_FLT_EPS, &dist, nullptr, nullptr, nullptr); } if (f_hit) { @@ -2751,64 +2816,9 @@ static void clip_to_ortho_planes(float v1[3], float v2[3], const float center[3] madd_v3_v3v3fl(v2, closest, dir, -d); } -static void knife_linehit_set(KnifeTool_OpData *kcd, - float s1[2], - float s2[2], - float sco[2], - float cage[3], - int ob_index, - KnifeVert *v, - KnifeEdge *kfe, - KnifeLineHit *r_hit) +static void set_linehit_depth(KnifeTool_OpData *kcd, KnifeLineHit *lh) { - memset(r_hit, 0, sizeof(*r_hit)); - copy_v3_v3(r_hit->cagehit, cage); - copy_v2_v2(r_hit->schit, sco); - r_hit->ob_index = ob_index; - - /* Find position along screen line, used for sorting. */ - r_hit->l = len_v2v2(sco, s1) / len_v2v2(s2, s1); - - r_hit->m = dot_m4_v3_row_z(kcd->vc.rv3d->persmatob, cage); - - r_hit->v = v; - - /* If this isn't from an existing BMVert, it may have been added to a BMEdge originally. - * Knowing if the hit comes from an edge is important for edge-in-face checks later on. - * See: #knife_add_single_cut -> #knife_verts_edge_in_face, #42611. */ - r_hit->kfe = kfe; - - if (v) { - copy_v3_v3(r_hit->hit, v->co); - } - else if (kfe) { - transform_point_by_seg_v3( - r_hit->hit, cage, kfe->v1->co, kfe->v2->co, kfe->v1->cageco, kfe->v2->cageco); - } -} - -static bool knife_linehit_face_test(KnifeTool_OpData *kcd, - float s1[2], - float s2[2], - float sco[2], - float ray_start[3], - float ray_end[3], - int ob_index, - BMFace *f, - float face_tol_sq, - KnifeLineHit *r_hit) -{ - float3 p, cage; - if (!knife_ray_intersect_face(kcd, sco, ray_start, ray_end, ob_index, f, face_tol_sq, p, cage)) { - return false; - } - if (!point_is_visible(kcd, cage, sco, (BMElem *)f)) { - return false; - } - knife_linehit_set(kcd, s1, s2, sco, cage, ob_index, nullptr, nullptr, r_hit); - copy_v3_v3(r_hit->hit, p); - r_hit->f = f; - return true; + lh->m = dot_m4_v3_row_z(kcd->vc.rv3d->persmatob, lh->cagehit); } /* Finds visible (or all, if cutting through) edges that intersects the current screen drag line. @@ -2822,8 +2832,8 @@ static void knife_find_line_hits(KnifeTool_OpData *kcd) KnifeLineHit *linehits = nullptr; BLI_array_declare(linehits); KnifeLineHit hit; - float s[2], se1[2], se2[2]; - float d1, d2; + float s[2], se1[2], se2[2], sint[2]; + float d1, d2, lambda; float vert_tol, vert_tol_sq; float line_tol, line_tol_sq; float face_tol, face_tol_sq; @@ -2926,9 +2936,9 @@ static void knife_find_line_hits(KnifeTool_OpData *kcd) faces.add(f); fobs.add(f, ob_index); - list = knife_get_face_kedges(kcd, ob_index, f); - LISTBASE_FOREACH (LinkData *, ref, list) { - KnifeEdge *kfe = static_cast(ref->data); + list = knife_get_face_kedges(kcd, ob, ob_index, f); + LISTBASE_FOREACH (Ref *, ref, list) { + KnifeEdge *kfe = static_cast(ref->ref); if (kfe->is_invalid) { continue; } @@ -2988,7 +2998,22 @@ static void knife_find_line_hits(KnifeTool_OpData *kcd) } if (kfv_is_in_cut) { - knife_linehit_set(kcd, s1, s2, s, v->cageco, v->ob_index, v, kfe_hit, &hit); + memset(&hit, 0, sizeof(hit)); + hit.v = v; + + /* If this isn't from an existing BMVert, it may have been added to a BMEdge originally. + * Knowing if the hit comes from an edge is important for edge-in-face checks later on. + * See: #knife_add_single_cut -> #knife_verts_edge_in_face, #42611. */ + if (kfe_hit) { + hit.kfe = kfe_hit; + } + + hit.ob = v->ob; + hit.ob_index = v->ob_index; + copy_v3_v3(hit.hit, v->co); + copy_v3_v3(hit.cagehit, v->cageco); + copy_v2_v2(hit.schit, s); + set_linehit_depth(kcd, &hit); BLI_array_append(linehits, hit); } else { @@ -3008,66 +3033,66 @@ static void knife_find_line_hits(KnifeTool_OpData *kcd) knife_project_v2(kcd, kfe->v1->cageco, se1); knife_project_v2(kcd, kfe->v2->cageco, se2); - float3 p_cage; - float2 p_cage_ss; - bool kfe_is_in_cut = false; + int isect_kind = 1; if (kfe == kcd->prev.edge) { /* This KnifeEdge was captured by the snap system. */ - p_cage = kcd->prev.cage; - p_cage_ss = kcd->prev.mval; - kfe_is_in_cut = true; + copy_v2_v2(sint, kcd->prev.mval); } else if (kfe == kcd->curr.edge) { /* This KnifeEdge was captured by the snap system. */ - p_cage = kcd->curr.cage; - p_cage_ss = kcd->curr.mval; - kfe_is_in_cut = true; + copy_v2_v2(sint, kcd->curr.mval); } else { - int isect_kind = isect_seg_seg_v2_point_ex(s1, s2, se1, se2, 0.0f, p_cage_ss); + isect_kind = isect_seg_seg_v2_point_ex(s1, s2, se1, se2, 0.0f, sint); if (isect_kind == -1) { /* isect_seg_seg_v2_point doesn't do tolerance test around ends of s1-s2. */ - closest_to_line_segment_v2(p_cage_ss, s1, se1, se2); - if (len_squared_v2v2(p_cage_ss, s1) <= line_tol_sq) { + closest_to_line_segment_v2(sint, s1, se1, se2); + if (len_squared_v2v2(sint, s1) <= line_tol_sq) { isect_kind = 1; } else { - closest_to_line_segment_v2(p_cage_ss, s2, se1, se2); - if (len_squared_v2v2(p_cage_ss, s2) <= line_tol_sq) { + closest_to_line_segment_v2(sint, s2, se1, se2); + if (len_squared_v2v2(sint, s2) <= line_tol_sq) { isect_kind = 1; } } } - if (isect_kind == 1) { - d1 = len_v2v2(p_cage_ss, se1); - d2 = len_v2v2(se2, se1); - if (!(d1 <= line_tol || d2 <= line_tol || fabsf(d1 - d2) <= line_tol)) { - float3 r1, r2; - float3 p_cage_dummy; - /* Can't just interpolate between ends of `kfe` because - * that doesn't work with perspective transformation. - * Need to find 3d intersection of ray through `p_cage_ss`. */ - knife_input_ray_segment(kcd, p_cage_ss, r1, r2); + } + if (isect_kind == 1) { + d1 = len_v2v2(sint, se1); + d2 = len_v2v2(se2, se1); + if (!(d1 <= line_tol || d2 <= line_tol || fabsf(d1 - d2) <= line_tol)) { + float3 r1, r2; + float p_cage[3], p_cage_tmp[3]; + lambda = d1 / d2; + /* Can't just interpolate between ends of kfe because + * that doesn't work with perspective transformation. + * Need to find 3d intersection of ray through sint. */ + knife_input_ray_segment(kcd, sint, r1, r2); - isect_kind = isect_line_line_v3( - kfe->v1->cageco, kfe->v2->cageco, r1, r2, p_cage, p_cage_dummy); - if (isect_kind >= 1 && - point_is_visible(kcd, p_cage, p_cage_ss, bm_elem_from_knife_edge(kfe))) - { - if (kcd->snap_midpoints) { - /* Choose intermediate point snap too. */ - mid_v3_v3v3(p_cage, kfe->v1->cageco, kfe->v2->cageco); - mid_v2_v2v2(p_cage_ss, se1, se2); - } - kfe_is_in_cut = true; + isect_kind = isect_line_line_v3( + kfe->v1->cageco, kfe->v2->cageco, r1, r2, p_cage, p_cage_tmp); + if (isect_kind >= 1 && point_is_visible(kcd, p_cage, sint, bm_elem_from_knife_edge(kfe))) { + memset(&hit, 0, sizeof(hit)); + if (kcd->snap_midpoints) { + /* Choose intermediate point snap too. */ + mid_v3_v3v3(p_cage, kfe->v1->cageco, kfe->v2->cageco); + mid_v2_v2v2(sint, se1, se2); + lambda = 0.5f; } + hit.kfe = kfe; + transform_point_by_seg_v3( + hit.hit, p_cage, kfe->v1->co, kfe->v2->co, kfe->v1->cageco, kfe->v2->cageco); + hit.ob = kfe->v1->ob; + hit.ob_index = kfe->v1->ob_index; + copy_v3_v3(hit.cagehit, p_cage); + copy_v2_v2(hit.schit, sint); + hit.perc = lambda; + set_linehit_depth(kcd, &hit); + BLI_array_append(linehits, hit); } } } - if (kfe_is_in_cut) { - knife_linehit_set(kcd, s1, s2, p_cage_ss, p_cage, kfe->v1->ob_index, nullptr, kfe, &hit); - BLI_array_append(linehits, hit); - } } /* Now face hits; don't add if a vertex or edge in face should have hit. */ @@ -3076,17 +3101,41 @@ static void knife_find_line_hits(KnifeTool_OpData *kcd) !kcd->is_drag_hold; if (use_hit_prev || use_hit_curr) { for (BMFace *f : faces) { - int ob_index = fobs.lookup(f); + float p[3], p_cage[3]; + + uint ob_index = fobs.lookup(f); + ob = kcd->objects[ob_index]; + if (use_hit_prev && - knife_linehit_face_test(kcd, s1, s2, s1, v1, v3, ob_index, f, face_tol_sq, &hit)) + knife_ray_intersect_face(kcd, s1, v1, v3, ob, ob_index, f, face_tol_sq, p, p_cage)) { - BLI_array_append(linehits, hit); + if (point_is_visible(kcd, p_cage, s1, (BMElem *)f)) { + memset(&hit, 0, sizeof(hit)); + hit.f = f; + hit.ob = ob; + hit.ob_index = ob_index; + copy_v3_v3(hit.hit, p); + copy_v3_v3(hit.cagehit, p_cage); + copy_v2_v2(hit.schit, s1); + set_linehit_depth(kcd, &hit); + BLI_array_append(linehits, hit); + } } if (use_hit_curr && - knife_linehit_face_test(kcd, s1, s2, s2, v2, v4, ob_index, f, face_tol_sq, &hit)) + knife_ray_intersect_face(kcd, s2, v2, v4, ob, ob_index, f, face_tol_sq, p, p_cage)) { - BLI_array_append(linehits, hit); + if (point_is_visible(kcd, p_cage, s2, (BMElem *)f)) { + memset(&hit, 0, sizeof(hit)); + hit.f = f; + hit.ob = ob; + hit.ob_index = ob_index; + copy_v3_v3(hit.hit, p); + copy_v3_v3(hit.cagehit, p_cage); + copy_v2_v2(hit.schit, s2); + set_linehit_depth(kcd, &hit); + BLI_array_append(linehits, hit); + } } } } @@ -3094,6 +3143,13 @@ static void knife_find_line_hits(KnifeTool_OpData *kcd) kcd->linehits = linehits; kcd->totlinehit = BLI_array_len(linehits); + /* Find position along screen line, used for sorting. */ + for (i = 0; i < kcd->totlinehit; i++) { + KnifeLineHit *lh = kcd->linehits + i; + + lh->l = len_v2v2(lh->schit, s1) / len_v2v2(s2, s1); + } + MEM_freeN(results); } @@ -3105,11 +3161,11 @@ static void knife_find_line_hits(KnifeTool_OpData *kcd) static void knife_pos_data_clear(KnifePosData *kpd) { + zero_v3(kpd->co); zero_v3(kpd->cage); kpd->vert = nullptr; kpd->edge = nullptr; kpd->bmface = nullptr; - kpd->ob_index = -1; zero_v2(kpd->mval); } @@ -3119,60 +3175,58 @@ static void knife_pos_data_clear(KnifePosData *kpd) /** \name Snapping (#knife_snap_update_from_mval) * \{ */ -static bool knife_find_closest_face(KnifeTool_OpData *kcd, const float2 &mval, KnifePosData *r_kpd) +static BMFace *knife_find_closest_face(KnifeTool_OpData *kcd, + Object **r_ob, + uint *r_ob_index, + bool *is_space, + float3 &r_co, + float3 &r_cageco) { - float3 cage; - int ob_index; BMFace *f; float dist = KMAXDIST; float3 origin; float3 ray_normal; ED_view3d_win_to_ray_clipped( - kcd->vc.depsgraph, kcd->region, kcd->vc.v3d, mval, origin, ray_normal, false); + kcd->vc.depsgraph, kcd->region, kcd->vc.v3d, kcd->curr.mval, origin, ray_normal, false); - f = knife_bvh_raycast(kcd, origin, ray_normal, 0.0f, nullptr, cage, &ob_index); + f = knife_bvh_raycast(kcd, origin, ray_normal, 0.0f, nullptr, r_co, r_cageco, r_ob_index); if (f && kcd->only_select && BM_elem_flag_test(f, BM_ELEM_SELECT) == 0) { f = nullptr; - ob_index = -1; } - if (f == nullptr) { + if (is_space) { + *is_space = !f; + } + + if (f) { + *r_ob = kcd->objects[*r_ob_index]; + } + else { if (kcd->is_interactive) { /* Try to use back-buffer selection method if ray casting failed. * * Apply the mouse coordinates to a copy of the view-context * since we don't want to rely on this being set elsewhere. */ ViewContext vc = kcd->vc; - vc.mval[0] = int(mval[0]); - vc.mval[1] = int(mval[1]); + vc.mval[0] = int(kcd->curr.mval[0]); + vc.mval[1] = int(kcd->curr.mval[1]); if (BKE_object_is_visible_in_viewport(vc.v3d, vc.obact)) { f = EDBM_face_find_nearest(&vc, &dist); } - if (f) { - /* Cheat for now; just put in the origin instead - * of a true coordinate on the face. - * This just puts a point 1.0f in front of the view. */ - cage = origin + ray_normal; - - ob_index = 0; - BLI_assert(ob_index == kcd->objects.first_index_of_try(vc.obact)); - } + /* Cheat for now; just put in the origin instead + * of a true coordinate on the face. + * This just puts a point 1.0f in front of the view. */ + r_co = origin + ray_normal; + /* Use this value for the cage location too as it's used to find near edges/vertices. */ + r_cageco = r_co; } } - if (f) { - r_kpd->cage = cage; - r_kpd->bmface = f; - r_kpd->ob_index = ob_index; - r_kpd->mval = mval; - - return true; - } - return false; + return f; } /** @@ -3181,8 +3235,12 @@ static bool knife_find_closest_face(KnifeTool_OpData *kcd, const float2 &mval, K * * Arguments `f` and `cageco` should be the result of a call to #knife_find_closest_face. */ -static int knife_sample_screen_density_from_closest_face( - KnifeTool_OpData *kcd, const float radius, int ob_index, BMFace *f, const float cageco[3]) +static int knife_sample_screen_density_from_closest_face(KnifeTool_OpData *kcd, + const float radius, + Object *ob, + uint ob_index, + BMFace *f, + const float cageco[3]) { const float radius_sq = radius * radius; ListBase *list; @@ -3192,9 +3250,9 @@ static int knife_sample_screen_density_from_closest_face( knife_project_v2(kcd, cageco, sco); - list = knife_get_face_kedges(kcd, ob_index, f); - LISTBASE_FOREACH (LinkData *, ref, list) { - KnifeEdge *kfe = static_cast(ref->data); + list = knife_get_face_kedges(kcd, ob, ob_index, f); + LISTBASE_FOREACH (Ref *, ref, list) { + KnifeEdge *kfe = static_cast(ref->ref); int i; if (kfe->is_invalid) { @@ -3239,9 +3297,9 @@ static float knife_snap_size(KnifeTool_OpData *kcd, float maxsize) BLI_assert(kcd->is_interactive == true); int density = 0; - if (!kcd->curr.is_space()) { + if (!kcd->curr.is_space) { density = float(knife_sample_screen_density_from_closest_face( - kcd, maxsize * 2.0f, kcd->curr.ob_index, kcd->curr.bmface, kcd->curr.cage)); + kcd, maxsize * 2.0f, kcd->curr.ob, kcd->curr.ob_index, kcd->curr.bmface, kcd->curr.cage)); } return density ? min_ff(maxsize / (float(density) * 0.5f), maxsize) : maxsize; @@ -3254,19 +3312,19 @@ static bool knife_snap_edge_constrained(KnifeTool_OpData *kcd, const float kfv1_sco[2], const float kfv2_sco[2], float *r_dist_sq, - float *r_lambda, - float2 &r_sco) + float *r_lambda) { /* If snapping, check we're in bounds. */ - isect_line_line_v2_point(kfv1_sco, kfv2_sco, kcd->prev.mval, kcd->curr.mval, r_sco); - float lambda = line_point_factor_v2(r_sco, kfv1_sco, kfv2_sco); + float sco_snap[2]; + isect_line_line_v2_point(kfv1_sco, kfv2_sco, kcd->prev.mval, kcd->curr.mval, sco_snap); + float lambda = line_point_factor_v2(sco_snap, kfv1_sco, kfv2_sco); /* Be strict when constrained within edge. */ if ((lambda < 0.0f - KNIFE_FLT_EPSBIG) || (lambda > 1.0f + KNIFE_FLT_EPSBIG)) { return false; } - float dis_sq = len_squared_v2v2(sco, r_sco); + float dis_sq = len_squared_v2v2(sco, sco_snap); if (dis_sq < *r_dist_sq) { *r_dist_sq = dis_sq; *r_lambda = lambda; @@ -3299,9 +3357,10 @@ static void knife_interp_v3_v3v3(const KnifeTool_OpData *kcd, } /* p is closest point on edge to the mouse cursor. */ -static bool knife_find_closest_edge_of_face( - KnifeTool_OpData *kcd, int ob_index, BMFace *f, const float2 &cage_ss, KnifePosData *r_kpd) +static KnifeEdge *knife_find_closest_edge_of_face( + KnifeTool_OpData *kcd, Object *ob, uint ob_index, BMFace *f, float p[3], float cagep[3]) { + float sco[2]; float maxdist; if (kcd->is_interactive) { @@ -3316,13 +3375,17 @@ static bool knife_find_closest_edge_of_face( } const float maxdist_sq = maxdist * maxdist; - float cur_dist_sq = maxdist_sq; - bool has_hit = false; + KnifeEdge *cure = nullptr; + float cur_cagep[3]; + ListBase *list; + float dis_sq, curdis_sq = maxdist_sq; + + knife_project_v2(kcd, cagep, sco); /* Look through all edges associated with this face. */ - ListBase *list = knife_get_face_kedges(kcd, ob_index, f); - LISTBASE_FOREACH (LinkData *, ref, list) { - KnifeEdge *kfe = static_cast(ref->data); + list = knife_get_face_kedges(kcd, ob, ob_index, f); + LISTBASE_FOREACH (Ref *, ref, list) { + KnifeEdge *kfe = static_cast(ref->ref); float kfv1_sco[2], kfv2_sco[2], test_cagep[3]; float lambda; @@ -3336,23 +3399,18 @@ static bool knife_find_closest_edge_of_face( /* Check if we're close enough and calculate 'lambda'. */ /* In constrained mode calculate lambda differently, unless constrained along kcd->prev.edge */ - float2 closest_ss; - float dis_sq; if ((kcd->is_angle_snapping || kcd->axis_constrained) && (kfe != kcd->prev.edge) && (kcd->mode == MODE_DRAGGING)) { - dis_sq = cur_dist_sq; - if (!knife_snap_edge_constrained( - kcd, cage_ss, kfv1_sco, kfv2_sco, &dis_sq, &lambda, closest_ss)) - { + dis_sq = curdis_sq; + if (!knife_snap_edge_constrained(kcd, sco, kfv1_sco, kfv2_sco, &dis_sq, &lambda)) { continue; } } else { - closest_to_line_segment_v2(closest_ss, cage_ss, kfv1_sco, kfv2_sco); - dis_sq = len_squared_v2v2(closest_ss, cage_ss); - if (dis_sq < cur_dist_sq) { - lambda = line_point_factor_v2(cage_ss, kfv1_sco, kfv2_sco); + dis_sq = dist_squared_to_line_segment_v2(sco, kfv1_sco, kfv2_sco); + if (dis_sq < curdis_sq) { + lambda = line_point_factor_v2(sco, kfv1_sco, kfv2_sco); } else { continue; @@ -3369,30 +3427,42 @@ static bool knife_find_closest_edge_of_face( } } - cur_dist_sq = dis_sq; - - r_kpd->edge = kfe; - if (kcd->snap_midpoints) { - mid_v3_v3v3(r_kpd->cage, kfe->v1->cageco, kfe->v2->cageco); - mid_v2_v2v2(r_kpd->mval, kfv1_sco, kfv2_sco); - } - else { - copy_v3_v3(r_kpd->cage, test_cagep); - r_kpd->mval = closest_ss; - } - - has_hit = true; + cure = kfe; + curdis_sq = dis_sq; + copy_v3_v3(cur_cagep, test_cagep); } - return has_hit; + if (cure && !kcd->ignore_edge_snapping) { + KnifeVert *edgesnap = nullptr; + + if (kcd->snap_midpoints) { + mid_v3_v3v3(p, cure->v1->co, cure->v2->co); + mid_v3_v3v3(cagep, cure->v1->cageco, cure->v2->cageco); + } + else { + float lambda = line_point_factor_v3(cur_cagep, cure->v1->cageco, cure->v2->cageco); + copy_v3_v3(cagep, cur_cagep); + interp_v3_v3v3(p, cure->v1->co, cure->v2->co, lambda); + } + + /* Update mouse coordinates to the snapped-to edge's screen coordinates + * this is important for angle snap, which uses the previous mouse position. */ + edgesnap = new_knife_vert(kcd, p, cagep); + edgesnap->ob = ob; + edgesnap->ob_index = ob_index; + knife_project_v2(kcd, edgesnap->cageco, kcd->curr.mval); + } + + return cure; } /* Find a vertex near the mouse cursor, if it exists. */ -static bool knife_find_closest_vert_of_edge(KnifeTool_OpData *kcd, - const KnifeEdge *kfe, - const float2 &cage_ss, - KnifePosData *r_kpd) +static KnifeVert *knife_find_closest_vert_of_edge(KnifeTool_OpData *kcd, + KnifeEdge *kfe, + float p[3], + float cagep[3]) { + float sco[2]; float maxdist; if (kcd->is_interactive) { @@ -3410,6 +3480,8 @@ static bool knife_find_closest_vert_of_edge(KnifeTool_OpData *kcd, float cur_kfv_sco[2]; float dis_sq, curdis_sq = FLT_MAX; + knife_project_v2(kcd, cagep, sco); + for (int i = 0; i < 2; i++) { KnifeVert *kfv = i ? kfe->v2 : kfe->v1; float kfv_sco[2]; @@ -3426,7 +3498,7 @@ static bool knife_find_closest_vert_of_edge(KnifeTool_OpData *kcd, } } - dis_sq = len_squared_v2v2(kfv_sco, cage_ss); + dis_sq = len_squared_v2v2(kfv_sco, sco); if (dis_sq < curdis_sq && dis_sq < maxdist_sq) { if (!RV3D_CLIPPING_ENABLED(kcd->vc.v3d, kcd->vc.rv3d) || !ED_view3d_clipping_test(kcd->vc.rv3d, kfv->cageco, false)) @@ -3438,17 +3510,16 @@ static bool knife_find_closest_vert_of_edge(KnifeTool_OpData *kcd, } } - if (curv) { - r_kpd->cage = curv->cageco; + if (curv && !kcd->ignore_vert_snapping) { + copy_v3_v3(p, curv->co); + copy_v3_v3(cagep, curv->cageco); /* Update mouse coordinates to the snapped-to vertex's screen coordinates * this is important for angle snap, which uses the previous mouse position. */ - r_kpd->mval = cur_kfv_sco; - - return true; + copy_v2_v2(kcd->curr.mval, cur_kfv_sco); } - return false; + return curv; } /** @@ -3531,8 +3602,9 @@ static bool knife_snap_angle_relative(KnifeTool_OpData *kcd) float curr_origin[3]; float curr_origin_ofs[3]; float curr_ray[3], curr_ray_normal[3]; - float curr_cage[3]; /* Unused. */ + float curr_co[3], curr_cage[3]; /* Unused. */ + float plane[4]; float ray_hit[3]; float lambda; @@ -3541,7 +3613,7 @@ static bool knife_snap_angle_relative(KnifeTool_OpData *kcd) normalize_v3_v3(curr_ray_normal, curr_ray); BMFace *fcurr = knife_bvh_raycast( - kcd, curr_origin, curr_ray_normal, 0.0f, nullptr, curr_cage, nullptr); + kcd, curr_origin, curr_ray_normal, 0.0f, nullptr, curr_co, curr_cage, nullptr); if (!fcurr) { return false; @@ -3551,8 +3623,8 @@ static bool knife_snap_angle_relative(KnifeTool_OpData *kcd) * If none exists then exit. */ if (kcd->prev.vert) { int count = 0; - LISTBASE_FOREACH (LinkData *, ref, &kcd->prev.vert->edges) { - kfe = ((KnifeEdge *)(ref->data)); + LISTBASE_FOREACH (Ref *, ref, &kcd->prev.vert->edges) { + kfe = ((KnifeEdge *)(ref->ref)); if (kfe->is_invalid) { continue; } @@ -3584,16 +3656,16 @@ static bool knife_snap_angle_relative(KnifeTool_OpData *kcd) /* Choose best face for plane. */ BMFace *fprev = nullptr; if (kcd->prev.vert && kcd->prev.vert->v) { - LISTBASE_FOREACH (LinkData *, ref, &kcd->prev.vert->faces) { - f = ((BMFace *)(ref->data)); + LISTBASE_FOREACH (Ref *, ref, &kcd->prev.vert->faces) { + f = ((BMFace *)(ref->ref)); if (f == fcurr) { fprev = f; } } } else if (kcd->prev.edge) { - LISTBASE_FOREACH (LinkData *, ref, &kcd->prev.edge->faces) { - f = ((BMFace *)(ref->data)); + LISTBASE_FOREACH (Ref *, ref, &kcd->prev.edge->faces) { + f = ((BMFace *)(ref->ref)); if (f == fcurr) { fprev = f; } @@ -3604,7 +3676,7 @@ static bool knife_snap_angle_relative(KnifeTool_OpData *kcd) float prev_origin[3]; float prev_origin_ofs[3]; float prev_ray[3], prev_ray_normal[3]; - float prev_cage[3]; /* Unused. */ + float prev_co[3], prev_cage[3]; /* Unused. */ knife_input_ray_segment(kcd, kcd->prev.mval, prev_origin, prev_origin_ofs); @@ -3613,7 +3685,7 @@ static bool knife_snap_angle_relative(KnifeTool_OpData *kcd) /* kcd->prev.face is usually not set. */ fprev = knife_bvh_raycast( - kcd, prev_origin, prev_ray_normal, 0.0f, nullptr, prev_cage, nullptr); + kcd, prev_origin, prev_ray_normal, 0.0f, nullptr, prev_co, prev_cage, nullptr); } if (!fprev || fprev != fcurr) { @@ -3621,14 +3693,14 @@ static bool knife_snap_angle_relative(KnifeTool_OpData *kcd) } /* Use normal global direction. */ - Object *ob = kcd->objects[kcd->curr.ob_index]; float no_global[3]; copy_v3_v3(no_global, fprev->no); - mul_transposed_mat3_m4_v3(ob->world_to_object().ptr(), no_global); + mul_transposed_mat3_m4_v3(kcd->curr.ob->world_to_object, no_global); normalize_v3(no_global); - if (isect_ray_plane_v3_factor(curr_origin, curr_ray_normal, kcd->prev.cage, no_global, &lambda)) - { + plane_from_point_normal_v3(plane, kcd->prev.cage, no_global); + + if (isect_ray_plane_v3(curr_origin, curr_ray_normal, plane, &lambda, false)) { madd_v3_v3v3fl(ray_hit, curr_origin, curr_ray_normal, lambda); /* Calculate snap step. */ @@ -3666,14 +3738,14 @@ static int knife_calculate_snap_ref_edges(KnifeTool_OpData *kcd) float curr_origin[3]; float curr_origin_ofs[3]; float curr_ray[3], curr_ray_normal[3]; - float curr_cage[3]; /* Unused. */ + float curr_co[3], curr_cage[3]; /* Unused. */ knife_input_ray_segment(kcd, kcd->curr.mval, curr_origin, curr_origin_ofs); sub_v3_v3v3(curr_ray, curr_origin_ofs, curr_origin); normalize_v3_v3(curr_ray_normal, curr_ray); BMFace *fcurr = knife_bvh_raycast( - kcd, curr_origin, curr_ray_normal, 0.0f, nullptr, curr_cage, nullptr); + kcd, curr_origin, curr_ray_normal, 0.0f, nullptr, curr_co, curr_cage, nullptr); int count = 0; @@ -3682,8 +3754,8 @@ static int knife_calculate_snap_ref_edges(KnifeTool_OpData *kcd) } if (kcd->prev.vert) { - LISTBASE_FOREACH (LinkData *, ref, &kcd->prev.vert->edges) { - kfe = ((KnifeEdge *)(ref->data)); + LISTBASE_FOREACH (Ref *, ref, &kcd->prev.vert->edges) { + kfe = ((KnifeEdge *)(ref->ref)); if (kfe->is_invalid) { continue; } @@ -3725,7 +3797,7 @@ static void knife_constrain_axis(KnifeTool_OpData *kcd) /* Constrain axes. */ Scene *scene = kcd->scene; ViewLayer *view_layer = kcd->vc.view_layer; - Object *obedit = (kcd->prev.ob_index != -1) ? kcd->objects[kcd->prev.ob_index] : kcd->vc.obedit; + Object *obedit = (kcd->prev.ob) ? kcd->prev.ob : kcd->vc.obedit; RegionView3D *rv3d = static_cast(kcd->region->regiondata); const short scene_orientation = BKE_scene_orientation_get_index(scene, SCE_ORIENT_DEFAULT); /* Scene orientation takes priority. */ @@ -3768,51 +3840,6 @@ static void knife_constrain_axis(KnifeTool_OpData *kcd) copy_v2_v2(kcd->mval, kcd->curr.mval); } -static void knife_snap_curr(KnifeTool_OpData *kcd, const float2 &mval) -{ - knife_pos_data_clear(&kcd->curr); - - if (knife_find_closest_face(kcd, mval, &kcd->curr)) { - if (!kcd->ignore_edge_snapping || !kcd->ignore_vert_snapping) { - KnifePosData kpos_tmp = kcd->curr; - if (knife_find_closest_edge_of_face( - kcd, kpos_tmp.ob_index, kpos_tmp.bmface, kpos_tmp.mval, &kpos_tmp)) - { - if (!kcd->ignore_edge_snapping) { - kcd->curr = kpos_tmp; - } - if (!kcd->ignore_vert_snapping) { - knife_find_closest_vert_of_edge(kcd, kpos_tmp.edge, kpos_tmp.mval, &kcd->curr); - } - } - } - } - - if (kcd->curr.vert || kcd->curr.edge || kcd->curr.bmface) { - return; - } - - /* If no hits are found this would normally default to (0, 0, 0) so instead - * get a point at the mouse ray closest to the previous point. - * Note that drawing lines in `free-space` isn't properly supported - * but there's no guarantee (0, 0, 0) has any geometry either - campbell */ - - float origin[3]; - float origin_ofs[3]; - - copy_v2_v2(kcd->curr.mval, mval); - knife_input_ray_segment(kcd, kcd->curr.mval, origin, origin_ofs); - - if (!isect_line_plane_v3( - kcd->curr.cage, origin, origin_ofs, kcd->prev.cage, kcd->vc.rv3d->viewinv[2])) - { - copy_v3_v3(kcd->curr.cage, kcd->prev.cage); - - /* Should never fail! */ - BLI_assert(0); - } -} - /** * \return true when `kcd->curr.co` & `kcd->curr.cage` are set. * @@ -3821,7 +3848,7 @@ static void knife_snap_curr(KnifeTool_OpData *kcd, const float2 &mval) * In this case the selection-buffer is used to select the face, * then the closest `vert` or `edge` is set, and those will enable `is_co_set`. */ -static void knife_snap_update_from_mval(KnifeTool_OpData *kcd, const float mval[2]) +static bool knife_snap_update_from_mval(KnifeTool_OpData *kcd, const float mval[2]) { knife_pos_data_clear(&kcd->curr); copy_v2_v2(kcd->curr.mval, mval); @@ -3848,7 +3875,31 @@ static void knife_snap_update_from_mval(KnifeTool_OpData *kcd, const float mval[ } } - knife_snap_curr(kcd, mval); + { + kcd->curr.ob = kcd->vc.obedit; + kcd->curr.bmface = knife_find_closest_face(kcd, + &kcd->curr.ob, + &kcd->curr.ob_index, + &kcd->curr.is_space, + kcd->curr.co, + kcd->curr.cage); + + if (kcd->curr.bmface) { + kcd->curr.edge = knife_find_closest_edge_of_face( + kcd, kcd->curr.ob, kcd->curr.ob_index, kcd->curr.bmface, kcd->curr.co, kcd->curr.cage); + } + + if (kcd->curr.edge) { + kcd->curr.vert = knife_find_closest_vert_of_edge( + kcd, kcd->curr.edge, kcd->curr.co, kcd->curr.cage); + + if (kcd->ignore_edge_snapping) { + kcd->curr.edge = nullptr; + } + } + } + + return kcd->curr.vert || kcd->curr.edge || (kcd->curr.bmface && !kcd->curr.is_space); } /** @@ -3897,8 +3948,8 @@ static void knifetool_undo(KnifeTool_OpData *kcd) if (!v1->is_invalid && !v1->is_splitting) { v1->is_invalid = true; /* If the first vertex is touching any other cut edges don't remove it. */ - LISTBASE_FOREACH (LinkData *, ref, &v1->edges) { - kfe = static_cast(ref->data); + LISTBASE_FOREACH (Ref *, ref, &v1->edges) { + kfe = static_cast(ref->ref); if (kfe->is_cut && !kfe->is_invalid) { v1->is_invalid = false; break; @@ -3910,8 +3961,8 @@ static void knifetool_undo(KnifeTool_OpData *kcd) if (!v2->is_invalid && !v2->is_splitting) { v2->is_invalid = true; /* If the second vertex is touching any other cut edges don't remove it. */ - LISTBASE_FOREACH (LinkData *, ref, &v2->edges) { - kfe = static_cast(ref->data); + LISTBASE_FOREACH (Ref *, ref, &v2->edges) { + kfe = static_cast(ref->ref); if (kfe->is_cut && !kfe->is_invalid) { v2->is_invalid = false; break; @@ -3940,7 +3991,7 @@ static void knifetool_undo(KnifeTool_OpData *kcd) static void knifetool_init_obinfo(KnifeTool_OpData *kcd, Object *ob, - int ob_index, + uint ob_index, bool use_tri_indices) { @@ -3969,7 +4020,7 @@ static void knifetool_init_obinfo(KnifeTool_OpData *kcd, } } -static void knifetool_free_obinfo(KnifeTool_OpData *kcd, int ob_index) +static void knifetool_free_obinfo(KnifeTool_OpData *kcd, uint ob_index) { MEM_SAFE_FREE(kcd->objects_info[ob_index].cagecos); MEM_SAFE_FREE(kcd->objects_info[ob_index].tri_indices); @@ -4032,7 +4083,7 @@ static void knifetool_init(ViewContext *vc, BMEditMesh *em; kcd->objects_info = static_cast( MEM_callocN(sizeof(*kcd->objects_info) * kcd->objects.size(), "knife cagecos")); - for (int ob_index = 0; ob_index < kcd->objects.size(); ob_index++) { + for (uint ob_index = 0; ob_index < kcd->objects.size(); ob_index++) { ob = kcd->objects[ob_index]; em = BKE_editmesh_from_object(ob); knifetool_init_obinfo(kcd, ob, ob_index, use_tri_indices); @@ -4066,7 +4117,7 @@ static void knifetool_init(ViewContext *vc, ED_region_tag_redraw(kcd->region); - kcd->refs = BLI_mempool_create(sizeof(LinkData), 0, 2048, 0); + kcd->refs = BLI_mempool_create(sizeof(Ref), 0, 2048, 0); kcd->kverts = BLI_mempool_create(sizeof(KnifeVert), 0, 512, BLI_MEMPOOL_ALLOW_ITER); kcd->kedges = BLI_mempool_create(sizeof(KnifeEdge), 0, 512, BLI_MEMPOOL_ALLOW_ITER); @@ -4169,7 +4220,25 @@ static void knifetool_exit(wmOperator *op) /** Update active knife edge/vert pointers. */ static int knife_update_active(KnifeTool_OpData *kcd) { - knife_snap_update_from_mval(kcd, kcd->mval); + /* If no hits are found this would normally default to (0, 0, 0) so instead + * get a point at the mouse ray closest to the previous point. + * Note that drawing lines in `free-space` isn't properly supported + * but there's no guarantee (0, 0, 0) has any geometry either - campbell */ + if (!knife_snap_update_from_mval(kcd, kcd->mval)) { + float origin[3]; + float origin_ofs[3]; + + knife_input_ray_segment(kcd, kcd->curr.mval, origin, origin_ofs); + + if (!isect_line_plane_v3( + kcd->curr.cage, origin, origin_ofs, kcd->prev.cage, kcd->vc.rv3d->viewinv[2])) + { + copy_v3_v3(kcd->curr.cage, kcd->prev.cage); + + /* Should never fail! */ + BLI_assert(0); + } + } if (kcd->mode == MODE_DRAGGING) { knife_find_line_hits(kcd); @@ -4199,9 +4268,9 @@ static void knifetool_update_mval_i(KnifeTool_OpData *kcd, const int mval_i[2]) /** \name Finalization * \{ */ -static void knifetool_finish_single_pre(KnifeTool_OpData *kcd, int ob_index) +static void knifetool_finish_single_pre(KnifeTool_OpData *kcd, Object *ob) { - knife_make_cuts(kcd, ob_index); + knife_make_cuts(kcd, ob); } /** @@ -4225,8 +4294,8 @@ static void knifetool_finish_ex(KnifeTool_OpData *kcd) /* Separate pre/post passes are needed because `em->looptris` recalculation from the 'post' pass * causes triangle indices in #KnifeTool_OpData.bvh to get out of sync. * So perform all the cuts before doing any mesh recalculation, see: #101721. */ - for (int ob_index : kcd->objects.index_range()) { - knifetool_finish_single_pre(kcd, ob_index); + for (Object *ob : kcd->objects) { + knifetool_finish_single_pre(kcd, ob); } for (Object *ob : kcd->objects) { knifetool_finish_single_post(kcd, ob); @@ -4319,8 +4388,7 @@ static int knifetool_modal(bContext *C, wmOperator *op, const wmEvent *event) KnifeTool_OpData *kcd = static_cast(op->customdata); bool do_refresh = false; - Object *ob = (kcd->curr.ob_index != -1) ? kcd->objects[kcd->curr.ob_index] : kcd->vc.obedit; - if (!ob || ob->type != OB_MESH) { + if (!kcd->curr.ob || kcd->curr.ob->type != OB_MESH) { knifetool_exit(op); ED_workspace_status_text(C, nullptr); return OPERATOR_FINISHED; @@ -4328,7 +4396,7 @@ static int knifetool_modal(bContext *C, wmOperator *op, const wmEvent *event) kcd->region = kcd->vc.region; - ED_view3d_init_mats_rv3d(ob, kcd->vc.rv3d); /* Needed to initialize clipping. */ + ED_view3d_init_mats_rv3d(kcd->curr.ob, kcd->vc.rv3d); /* Needed to initialize clipping. */ if (kcd->mode == MODE_PANNING) { kcd->mode = KnifeMode(kcd->prevmode); @@ -4514,7 +4582,7 @@ static int knifetool_modal(bContext *C, wmOperator *op, const wmEvent *event) knife_add_cut(kcd); } else if (kcd->mode != MODE_PANNING) { - knife_start_cut(kcd, float2(event->mval)); + knife_start_cut(kcd); kcd->mode = MODE_DRAGGING; kcd->init = kcd->curr; } @@ -4731,6 +4799,8 @@ static int knifetool_invoke(bContext *C, wmOperator *op, const wmEvent *event) WM_cursor_modal_set(CTX_wm_window(C), WM_CURSOR_KNIFE); WM_event_add_modal_handler(C, op); + knifetool_update_mval_i(kcd, event->mval); + if (wait_for_input == false) { /* Avoid copy-paste logic. */ wmEvent event_modal{}; @@ -4738,8 +4808,6 @@ static int knifetool_invoke(bContext *C, wmOperator *op, const wmEvent *event) event_modal.type = EVT_MODAL_MAP; event_modal.val = KNF_MODAL_ADD_CUT; - copy_v2_v2_int(event_modal.mval, event->mval); - int ret = knifetool_modal(C, op, &event_modal); BLI_assert(ret == OPERATOR_RUNNING_MODAL); UNUSED_VARS_NDEBUG(ret); @@ -4892,14 +4960,16 @@ void EDBM_mesh_knife( const int mval_tot = MEM_allocN_len(mval_fl) / sizeof(*mval_fl); int i; - knife_start_cut(kcd, mval_fl[0]); - kcd->mode = MODE_DRAGGING; - - for (i = 1; i < mval_tot; i++) { + for (i = 0; i < mval_tot; i++) { knifetool_update_mval(kcd, mval_fl[i]); - knife_add_cut(kcd); + if (i == 0) { + knife_start_cut(kcd); + kcd->mode = MODE_DRAGGING; + } + else { + knife_add_cut(kcd); + } } - knife_finish_cut(kcd); kcd->mode = MODE_IDLE; p = p->next; @@ -4909,15 +4979,14 @@ void EDBM_mesh_knife( /* Finish. */ { /* See #knifetool_finish_ex for why multiple passes are needed. */ - for (int ob_index : kcd->objects.index_range()) { - Object *ob = kcd->objects[ob_index]; + for (Object *ob : kcd->objects) { BMEditMesh *em = BKE_editmesh_from_object(ob); if (use_tag) { BM_mesh_elem_hflag_enable_all(em->bm, BM_EDGE, BM_ELEM_TAG, false); } - knifetool_finish_single_pre(kcd, ob_index); + knifetool_finish_single_pre(kcd, ob); } for (Object *ob : kcd->objects) { @@ -4954,7 +5023,7 @@ void EDBM_mesh_knife( BM_ITER_ELEM (f, &fiter, e, BM_FACES_OF_EDGE) { float cent[3], cent_ss[2]; BM_face_calc_point_in_face(f, cent); - mul_m4_v3(ob->object_to_world().ptr(), cent); + mul_m4_v3(ob->object_to_world, cent); knife_project_v2(kcd, cent, cent_ss); if (edbm_mesh_knife_point_isect(polys, cent_ss)) { BM_elem_flag_enable(f, BM_ELEM_TAG); @@ -4995,7 +5064,7 @@ void EDBM_mesh_knife( if (found) { float cent[3], cent_ss[2]; BM_face_calc_point_in_face(f, cent); - mul_m4_v3(ob->object_to_world().ptr(), cent); + mul_m4_v3(ob->object_to_world, cent); knife_project_v2(kcd, cent, cent_ss); if ((kcd->cut_through || point_is_visible(kcd, cent, cent_ss, (BMElem *)f)) && edbm_mesh_knife_point_isect(polys, cent_ss)) diff --git a/source/blender/editors/mesh/editmesh_knife_project.cc b/source/blender/editors/mesh/editmesh_knife_project.cc index 82b8dc078ea..75c34e4bc93 100644 --- a/source/blender/editors/mesh/editmesh_knife_project.cc +++ b/source/blender/editors/mesh/editmesh_knife_project.cc @@ -20,9 +20,10 @@ #include "BKE_layer.hh" #include "BKE_lib_id.hh" #include "BKE_mesh.hh" +#include "BKE_mesh_runtime.hh" #include "BKE_object.hh" #include "BKE_object_types.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "DEG_depsgraph.hh" #include "DEG_depsgraph_query.hh" @@ -46,28 +47,28 @@ static LinkNode *knifeproject_poly_from_object(const bContext *C, Object *ob, Li { Depsgraph *depsgraph = CTX_data_ensure_evaluated_depsgraph(C); ARegion *region = CTX_wm_region(C); - const Mesh *mesh_eval; - bool mesh_eval_needs_free; + const Mesh *me_eval; + bool me_eval_needs_free; if (ob->type == OB_MESH || ob->runtime->data_eval) { const Object *ob_eval = DEG_get_evaluated_object(depsgraph, ob); - mesh_eval = BKE_object_get_evaluated_mesh(ob_eval); - mesh_eval_needs_free = false; + me_eval = BKE_object_get_evaluated_mesh(ob_eval); + me_eval_needs_free = false; } else if (ELEM(ob->type, OB_FONT, OB_CURVES_LEGACY, OB_SURF)) { const Object *ob_eval = DEG_get_evaluated_object(depsgraph, ob); - mesh_eval = BKE_mesh_new_nomain_from_curve(ob_eval); - mesh_eval_needs_free = true; + me_eval = BKE_mesh_new_nomain_from_curve(ob_eval); + me_eval_needs_free = true; } else { - mesh_eval = nullptr; + me_eval = nullptr; } - if (mesh_eval) { + if (me_eval) { ListBase nurbslist = {nullptr, nullptr}; - BKE_mesh_to_curve_nurblist(mesh_eval, &nurbslist, 0); /* wire */ - BKE_mesh_to_curve_nurblist(mesh_eval, &nurbslist, 1); /* boundary */ + BKE_mesh_to_curve_nurblist(me_eval, &nurbslist, 0); /* wire */ + BKE_mesh_to_curve_nurblist(me_eval, &nurbslist, 1); /* boundary */ const blender::float4x4 projmat = ED_view3d_ob_project_mat_get( static_cast(region->regiondata), ob); @@ -95,8 +96,8 @@ static LinkNode *knifeproject_poly_from_object(const bContext *C, Object *ob, Li BKE_nurbList_free(&nurbslist); - if (mesh_eval_needs_free) { - BKE_id_free(nullptr, (ID *)mesh_eval); + if (me_eval_needs_free) { + BKE_id_free(nullptr, (ID *)me_eval); } } diff --git a/source/blender/editors/mesh/editmesh_loopcut.cc b/source/blender/editors/mesh/editmesh_loopcut.cc index ea74605c8ad..9c86d97622b 100644 --- a/source/blender/editors/mesh/editmesh_loopcut.cc +++ b/source/blender/editors/mesh/editmesh_loopcut.cc @@ -13,13 +13,15 @@ #include "BLI_math_vector.h" #include "BLI_string.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" + +#include "DNA_mesh_types.h" #include "BKE_context.hh" #include "BKE_editmesh.hh" #include "BKE_layer.hh" #include "BKE_modifier.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "BKE_unit.hh" #include "UI_interface.hh" @@ -88,9 +90,7 @@ struct RingSelOpData { static void ringsel_draw(const bContext * /*C*/, ARegion * /*region*/, void *arg) { RingSelOpData *lcd = static_cast(arg); - if (lcd->ob != nullptr) { - EDBM_preselect_edgering_draw(lcd->presel_edgering, lcd->ob->object_to_world().ptr()); - } + EDBM_preselect_edgering_draw(lcd->presel_edgering, lcd->ob->object_to_world); } static void edgering_select(RingSelOpData *lcd) diff --git a/source/blender/editors/mesh/editmesh_mask_extract.cc b/source/blender/editors/mesh/editmesh_mask_extract.cc index 0e284409f74..3ed641e608f 100644 --- a/source/blender/editors/mesh/editmesh_mask_extract.cc +++ b/source/blender/editors/mesh/editmesh_mask_extract.cc @@ -10,14 +10,19 @@ #include "DNA_modifier_types.h" #include "DNA_object_types.h" +#include "BLT_translation.h" + #include "BKE_attribute.hh" #include "BKE_context.hh" #include "BKE_customdata.hh" #include "BKE_editmesh.hh" +#include "BKE_layer.hh" #include "BKE_lib_id.hh" #include "BKE_mesh.hh" #include "BKE_modifier.hh" #include "BKE_paint.hh" +#include "BKE_report.h" +#include "BKE_screen.hh" #include "BKE_shrinkwrap.hh" #include "BLI_math_vector.h" @@ -31,10 +36,12 @@ #include "WM_api.hh" #include "WM_types.hh" +#include "ED_mesh.hh" #include "ED_object.hh" #include "ED_screen.hh" #include "ED_sculpt.hh" #include "ED_undo.hh" +#include "ED_view3d.hh" #include "bmesh_tools.hh" diff --git a/source/blender/editors/mesh/editmesh_path.cc b/source/blender/editors/mesh/editmesh_path.cc index 6c8df7aac8c..e48e106e3e8 100644 --- a/source/blender/editors/mesh/editmesh_path.cc +++ b/source/blender/editors/mesh/editmesh_path.cc @@ -24,7 +24,7 @@ #include "BKE_customdata.hh" #include "BKE_editmesh.hh" #include "BKE_layer.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "ED_mesh.hh" #include "ED_object.hh" diff --git a/source/blender/editors/mesh/editmesh_polybuild.cc b/source/blender/editors/mesh/editmesh_polybuild.cc index 76592ff17fc..e84bd7b34d9 100644 --- a/source/blender/editors/mesh/editmesh_polybuild.cc +++ b/source/blender/editors/mesh/editmesh_polybuild.cc @@ -18,7 +18,8 @@ #include "BKE_context.hh" #include "BKE_editmesh.hh" #include "BKE_layer.hh" -#include "BKE_object_types.hh" +#include "BKE_mesh.hh" +#include "BKE_report.h" #include "BLI_math_geom.h" #include "BLI_math_matrix.h" @@ -28,6 +29,8 @@ #include "ED_mesh.hh" #include "ED_object.hh" +#include "ED_scene.hh" +#include "ED_screen.hh" #include "ED_transform.hh" #include "ED_view3d.hh" @@ -124,7 +127,7 @@ static int edbm_polybuild_transform_at_cursor_invoke(bContext *C, BMEditMesh *em = vc.em; BMesh *bm = em->bm; - invert_m4_m4(vc.obedit->runtime->world_to_object.ptr(), vc.obedit->object_to_world().ptr()); + invert_m4_m4(vc.obedit->world_to_object, vc.obedit->object_to_world); ED_view3d_init_mats_rv3d(vc.obedit, vc.rv3d); if (!ele_act) { @@ -189,7 +192,7 @@ static int edbm_polybuild_delete_at_cursor_invoke(bContext *C, BMEditMesh *em = vc.em; BMesh *bm = em->bm; - invert_m4_m4(vc.obedit->runtime->world_to_object.ptr(), vc.obedit->object_to_world().ptr()); + invert_m4_m4(vc.obedit->world_to_object, vc.obedit->object_to_world); ED_view3d_init_mats_rv3d(vc.obedit, vc.rv3d); if (!ele_act) { @@ -282,7 +285,7 @@ static int edbm_polybuild_face_at_cursor_invoke(bContext *C, wmOperator *op, con BMEditMesh *em = vc.em; BMesh *bm = em->bm; - invert_m4_m4(vc.obedit->runtime->world_to_object.ptr(), vc.obedit->object_to_world().ptr()); + invert_m4_m4(vc.obedit->world_to_object, vc.obedit->object_to_world); ED_view3d_init_mats_rv3d(vc.obedit, vc.rv3d); edbm_selectmode_ensure(vc.scene, vc.em, SCE_SELECT_VERTEX); @@ -290,9 +293,9 @@ static int edbm_polybuild_face_at_cursor_invoke(bContext *C, wmOperator *op, con if (ele_act == nullptr || ele_act->head.htype == BM_FACE) { /* Just add vert */ copy_v3_v3(center, vc.scene->cursor.location); - mul_v3_m4v3(center, vc.obedit->object_to_world().ptr(), center); + mul_v3_m4v3(center, vc.obedit->object_to_world, center); ED_view3d_win_to_3d_int(vc.v3d, vc.region, center, event->mval, center); - mul_m4_v3(vc.obedit->world_to_object().ptr(), center); + mul_m4_v3(vc.obedit->world_to_object, center); BMVert *v_new = BM_vert_create(bm, center, nullptr, BM_CREATE_NOP); edbm_flag_disable_all_multi(vc.scene, vc.view_layer, vc.v3d, BM_ELEM_SELECT); @@ -305,9 +308,9 @@ static int edbm_polybuild_face_at_cursor_invoke(bContext *C, wmOperator *op, con BMFace *f_reference = e_act->l ? e_act->l->f : nullptr; mid_v3_v3v3(center, e_act->v1->co, e_act->v2->co); - mul_m4_v3(vc.obedit->object_to_world().ptr(), center); + mul_m4_v3(vc.obedit->object_to_world, center); ED_view3d_win_to_3d_int(vc.v3d, vc.region, center, event->mval, center); - mul_m4_v3(vc.obedit->world_to_object().ptr(), center); + mul_m4_v3(vc.obedit->world_to_object, center); if (f_reference->len == 3 && RNA_boolean_get(op->ptr, "create_quads")) { const float fac = line_point_factor_v3(center, e_act->v1->co, e_act->v2->co); BMVert *v_new = BM_edge_split(bm, e_act, e_act->v1, nullptr, std::clamp(fac, 0.0f, 1.0f)); @@ -361,9 +364,9 @@ static int edbm_polybuild_face_at_cursor_invoke(bContext *C, wmOperator *op, con BMFace *f_reference = e_pair[0]->l ? e_pair[0]->l->f : nullptr; - mul_v3_m4v3(center, vc.obedit->object_to_world().ptr(), v_act->co); + mul_v3_m4v3(center, vc.obedit->object_to_world, v_act->co); ED_view3d_win_to_3d_int(vc.v3d, vc.region, center, event->mval, center); - mul_m4_v3(vc.obedit->world_to_object().ptr(), center); + mul_m4_v3(vc.obedit->world_to_object, center); BMVert *v_quad[4]; v_quad[0] = v_act; @@ -383,9 +386,9 @@ static int edbm_polybuild_face_at_cursor_invoke(bContext *C, wmOperator *op, con } else { /* Just add edge */ - mul_m4_v3(vc.obedit->object_to_world().ptr(), center); + mul_m4_v3(vc.obedit->object_to_world, center); ED_view3d_win_to_3d_int(vc.v3d, vc.region, v_act->co, event->mval, center); - mul_m4_v3(vc.obedit->world_to_object().ptr(), center); + mul_m4_v3(vc.obedit->world_to_object, center); BMVert *v_new = BM_vert_create(bm, center, nullptr, BM_CREATE_NOP); @@ -459,7 +462,7 @@ static int edbm_polybuild_split_at_cursor_invoke(bContext *C, BMEditMesh *em = vc.em; BMesh *bm = em->bm; - invert_m4_m4(vc.obedit->runtime->world_to_object.ptr(), vc.obedit->object_to_world().ptr()); + invert_m4_m4(vc.obedit->world_to_object, vc.obedit->object_to_world); ED_view3d_init_mats_rv3d(vc.obedit, vc.rv3d); edbm_selectmode_ensure(vc.scene, vc.em, SCE_SELECT_VERTEX); @@ -470,9 +473,9 @@ static int edbm_polybuild_split_at_cursor_invoke(bContext *C, if (ele_act->head.htype == BM_EDGE) { BMEdge *e_act = (BMEdge *)ele_act; mid_v3_v3v3(center, e_act->v1->co, e_act->v2->co); - mul_m4_v3(vc.obedit->object_to_world().ptr(), center); + mul_m4_v3(vc.obedit->object_to_world, center); ED_view3d_win_to_3d_int(vc.v3d, vc.region, center, event->mval, center); - mul_m4_v3(vc.obedit->world_to_object().ptr(), center); + mul_m4_v3(vc.obedit->world_to_object, center); const float fac = line_point_factor_v3(center, e_act->v1->co, e_act->v2->co); BMVert *v_new = BM_edge_split(bm, e_act, e_act->v1, nullptr, std::clamp(fac, 0.0f, 1.0f)); diff --git a/source/blender/editors/mesh/editmesh_preselect_elem.cc b/source/blender/editors/mesh/editmesh_preselect_elem.cc index 651c2052f2a..b09c5611807 100644 --- a/source/blender/editors/mesh/editmesh_preselect_elem.cc +++ b/source/blender/editors/mesh/editmesh_preselect_elem.cc @@ -243,9 +243,9 @@ static void view3d_preselect_update_preview_triangle_from_vert( } if (e_pair[1] != nullptr) { - mul_v3_m4v3(center, vc->obedit->object_to_world().ptr(), v_act->co); + mul_v3_m4v3(center, vc->obedit->object_to_world, v_act->co); ED_view3d_win_to_3d_int(vc->v3d, vc->region, center, mval, center); - mul_m4_v3(vc->obedit->world_to_object().ptr(), center); + mul_m4_v3(vc->obedit->world_to_object, center); psel->preview_tris = static_cast( MEM_mallocN(sizeof(*psel->preview_tris) * 2, __func__)); @@ -313,9 +313,9 @@ static void view3d_preselect_update_preview_triangle_from_edge( psel->preview_lines = static_cast( MEM_mallocN(sizeof(*psel->preview_lines) * 3, __func__)); mid_v3_v3v3(center, eed->v1->co, eed->v2->co); - mul_m4_v3(vc->obedit->object_to_world().ptr(), center); + mul_m4_v3(vc->obedit->object_to_world, center); ED_view3d_win_to_3d_int(vc->v3d, vc->region, center, mval, center); - mul_m4_v3(vc->obedit->world_to_object().ptr(), center); + mul_m4_v3(vc->obedit->world_to_object, center); copy_v3_v3(psel->preview_tris[0][0], eed->v1->co); copy_v3_v3(psel->preview_tris[0][1], eed->v2->co); diff --git a/source/blender/editors/mesh/editmesh_rip.cc b/source/blender/editors/mesh/editmesh_rip.cc index 707949a618f..efefd2a90a7 100644 --- a/source/blender/editors/mesh/editmesh_rip.cc +++ b/source/blender/editors/mesh/editmesh_rip.cc @@ -19,9 +19,9 @@ #include "BKE_context.hh" #include "BKE_editmesh.hh" #include "BKE_layer.hh" -#include "BKE_report.hh" +#include "BKE_report.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "RNA_access.hh" #include "RNA_define.hh" @@ -29,6 +29,7 @@ #include "WM_types.hh" #include "ED_mesh.hh" +#include "ED_screen.hh" #include "ED_transform.hh" #include "ED_view3d.hh" diff --git a/source/blender/editors/mesh/editmesh_rip_edge.cc b/source/blender/editors/mesh/editmesh_rip_edge.cc index 87f1f60c0b3..5c06465b108 100644 --- a/source/blender/editors/mesh/editmesh_rip_edge.cc +++ b/source/blender/editors/mesh/editmesh_rip_edge.cc @@ -15,7 +15,7 @@ #include "BKE_context.hh" #include "BKE_editmesh.hh" #include "BKE_layer.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "BLI_math_geom.h" #include "BLI_math_vector.h" @@ -24,6 +24,7 @@ #include "WM_types.hh" #include "ED_mesh.hh" +#include "ED_screen.hh" #include "ED_transform.hh" #include "ED_view3d.hh" diff --git a/source/blender/editors/mesh/editmesh_select.cc b/source/blender/editors/mesh/editmesh_select.cc index 4b6b79ab179..5b84b92b22f 100644 --- a/source/blender/editors/mesh/editmesh_select.cc +++ b/source/blender/editors/mesh/editmesh_select.cc @@ -33,7 +33,7 @@ #include "BKE_mesh.hh" #include "BKE_mesh_wrapper.hh" #include "BKE_object.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "WM_api.hh" #include "WM_types.hh" @@ -49,7 +49,7 @@ #include "ED_transform.hh" #include "ED_view3d.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" @@ -1076,15 +1076,15 @@ bool EDBM_unified_findnearest_from_raycast(ViewContext *vc, float imat3[3][3]; ED_view3d_viewcontext_init_object(vc, obedit); - copy_m3_m4(imat3, obedit->object_to_world().ptr()); + copy_m3_m4(imat3, obedit->object_to_world); invert_m3(imat3); const float(*coords)[3] = nullptr; { Object *obedit_eval = DEG_get_evaluated_object(vc->depsgraph, obedit); - Mesh *mesh_eval = BKE_object_get_editmesh_eval_cage(obedit_eval); - if (BKE_mesh_wrapper_vert_len(mesh_eval) == bm->totvert) { - coords = BKE_mesh_wrapper_vert_coords(mesh_eval); + Mesh *me_eval = BKE_object_get_editmesh_eval_cage(obedit_eval); + if (BKE_mesh_wrapper_vert_len(me_eval) == bm->totvert) { + coords = BKE_mesh_wrapper_vert_coords(me_eval); } } @@ -1101,9 +1101,8 @@ bool EDBM_unified_findnearest_from_raycast(ViewContext *vc, for (uint j = 0; j < 2; j++) { BMVert *v = *((&e->v1) + j); float point[3]; - mul_v3_m4v3(point, - obedit->object_to_world().ptr(), - coords ? coords[BM_elem_index_get(v)] : v->co); + mul_v3_m4v3( + point, obedit->object_to_world, coords ? coords[BM_elem_index_get(v)] : v->co); const float dist_sq_test = dist_squared_to_ray_v3_normalized( ray_origin, ray_direction, point); if (dist_sq_test < dist_sq_best_vert) { @@ -1132,7 +1131,7 @@ bool EDBM_unified_findnearest_from_raycast(ViewContext *vc, else { mid_v3_v3v3(point, e->v1->co, e->v2->co); } - mul_m4_v3(obedit->object_to_world().ptr(), point); + mul_m4_v3(obedit->object_to_world, point); const float dist_sq_test = dist_squared_to_ray_v3_normalized( ray_origin, ray_direction, point); if (dist_sq_test < dist_sq_best_edge) { @@ -1157,9 +1156,8 @@ bool EDBM_unified_findnearest_from_raycast(ViewContext *vc, BM_ITER_MESH (v, &viter, bm, BM_VERTS_OF_MESH) { if (BM_elem_flag_test(v, BM_ELEM_HIDDEN) == false) { float point[3]; - mul_v3_m4v3(point, - obedit->object_to_world().ptr(), - coords ? coords[BM_elem_index_get(v)] : v->co); + mul_v3_m4v3( + point, obedit->object_to_world, coords ? coords[BM_elem_index_get(v)] : v->co); const float dist_sq_test = dist_squared_to_ray_v3_normalized( ray_origin, ray_direction, point); if (dist_sq_test < dist_sq_best_vert) { @@ -1189,7 +1187,7 @@ bool EDBM_unified_findnearest_from_raycast(ViewContext *vc, else { mid_v3_v3v3(point, e->v1->co, e->v2->co); } - mul_m4_v3(obedit->object_to_world().ptr(), point); + mul_m4_v3(obedit->object_to_world, point); const float dist_sq_test = dist_squared_to_ray_v3_normalized( ray_origin, ray_direction, point); if (dist_sq_test < dist_sq_best_edge) { @@ -1218,7 +1216,7 @@ bool EDBM_unified_findnearest_from_raycast(ViewContext *vc, else { BM_face_calc_center_median(f, point); } - mul_m4_v3(obedit->object_to_world().ptr(), point); + mul_m4_v3(obedit->object_to_world, point); const float dist_sq_test = dist_squared_to_ray_v3_normalized( ray_origin, ray_direction, point); if (dist_sq_test < dist_sq_best_face) { @@ -2539,11 +2537,11 @@ bool EDBM_selectmode_toggle_multi(bContext *C, em_iter->selectmode = ts->selectmode; EDBM_selectmode_set(em_iter); DEG_id_tag_update(static_cast(ob_iter->data), - ID_RECALC_SYNC_TO_EVAL | ID_RECALC_SELECT); + ID_RECALC_COPY_ON_WRITE | ID_RECALC_SELECT); WM_event_add_notifier(C, NC_GEOM | ND_SELECT, ob_iter->data); } WM_main_add_notifier(NC_SCENE | ND_TOOLSETTINGS, nullptr); - DEG_id_tag_update(&scene->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&scene->id, ID_RECALC_COPY_ON_WRITE); } return ret; @@ -2583,7 +2581,7 @@ bool EDBM_selectmode_set_multi(bContext *C, const short selectmode) em_iter->selectmode = ts->selectmode; EDBM_selectmode_set(em_iter); DEG_id_tag_update(static_cast(ob_iter->data), - ID_RECALC_SYNC_TO_EVAL | ID_RECALC_SELECT); + ID_RECALC_COPY_ON_WRITE | ID_RECALC_SELECT); WM_event_add_notifier(C, NC_GEOM | ND_SELECT, ob_iter->data); changed = true; } @@ -2591,7 +2589,7 @@ bool EDBM_selectmode_set_multi(bContext *C, const short selectmode) if (changed) { WM_main_add_notifier(NC_SCENE | ND_TOOLSETTINGS, nullptr); - DEG_id_tag_update(&scene->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&scene->id, ID_RECALC_COPY_ON_WRITE); } return changed; } @@ -4871,7 +4869,7 @@ static int edbm_select_axis_exec(bContext *C, wmOperator *op) { float vertex_world[3]; - mul_v3_m4v3(vertex_world, obedit->object_to_world().ptr(), v_act->co); + mul_v3_m4v3(vertex_world, obedit->object_to_world, v_act->co); value = dot_v3v3(axis_vector, vertex_world); } @@ -4899,7 +4897,7 @@ static int edbm_select_axis_exec(bContext *C, wmOperator *op) BM_ITER_MESH (v, &iter, bm, BM_VERTS_OF_MESH) { if (!BM_elem_flag_test(v, BM_ELEM_HIDDEN | BM_ELEM_SELECT)) { float v_iter_world[3]; - mul_v3_m4v3(v_iter_world, obedit_iter->object_to_world().ptr(), v->co); + mul_v3_m4v3(v_iter_world, obedit_iter->object_to_world, v->co); const float value_iter = dot_v3v3(axis_vector, v_iter_world); switch (sign) { case SELECT_AXIS_ALIGN: diff --git a/source/blender/editors/mesh/editmesh_select_similar.cc b/source/blender/editors/mesh/editmesh_select_similar.cc index ab7b64a2755..222e4c9b9dd 100644 --- a/source/blender/editors/mesh/editmesh_select_similar.cc +++ b/source/blender/editors/mesh/editmesh_select_similar.cc @@ -15,7 +15,7 @@ #include "BLI_math_matrix.h" #include "BLI_math_vector.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_context.hh" #include "BKE_customdata.hh" @@ -23,9 +23,9 @@ #include "BKE_editmesh.hh" #include "BKE_layer.hh" #include "BKE_material.h" -#include "BKE_object_types.hh" -#include "BKE_report.hh" +#include "BKE_report.h" +#include "DNA_material_types.h" #include "DNA_meshdata_types.h" #include "WM_api.hh" @@ -138,9 +138,9 @@ static void face_to_plane(const Object *ob, BMFace *face, float r_plane[4]) { float normal[3], co[3]; copy_v3_v3(normal, face->no); - mul_transposed_mat3_m4_v3(ob->world_to_object().ptr(), normal); + mul_transposed_mat3_m4_v3(ob->world_to_object, normal); normalize_v3(normal); - mul_v3_m4v3(co, ob->object_to_world().ptr(), BM_FACE_FIRST_LOOP(face)->v->co); + mul_v3_m4v3(co, ob->object_to_world, BM_FACE_FIRST_LOOP(face)->v->co); plane_from_point_normal_v3(r_plane, co, normal); } @@ -200,14 +200,14 @@ static int similar_face_select_exec(bContext *C, wmOperator *op) BMEditMesh *em = BKE_editmesh_from_object(ob); BMesh *bm = em->bm; Material ***material_array = nullptr; - invert_m4_m4(ob->runtime->world_to_object.ptr(), ob->object_to_world().ptr()); + invert_m4_m4(ob->world_to_object, ob->object_to_world); if (bm->totfacesel == 0) { continue; } float ob_m3[3][3]; - copy_m3_m4(ob_m3, ob->object_to_world().ptr()); + copy_m3_m4(ob_m3, ob->object_to_world); switch (type) { case SIMFACE_MATERIAL: { @@ -255,7 +255,7 @@ static int similar_face_select_exec(bContext *C, wmOperator *op) case SIMFACE_NORMAL: { float normal[3]; copy_v3_v3(normal, face->no); - mul_transposed_mat3_m4_v3(ob->world_to_object().ptr(), normal); + mul_transposed_mat3_m4_v3(ob->world_to_object, normal); normalize_v3(normal); BLI_kdtree_3d_insert(tree_3d, tree_index++, normal); break; @@ -314,7 +314,7 @@ static int similar_face_select_exec(bContext *C, wmOperator *op) Material ***material_array = nullptr; float ob_m3[3][3]; - copy_m3_m4(ob_m3, ob->object_to_world().ptr()); + copy_m3_m4(ob_m3, ob->object_to_world); bool has_custom_data_layer = false; switch (type) { @@ -391,7 +391,7 @@ static int similar_face_select_exec(bContext *C, wmOperator *op) case SIMFACE_NORMAL: { float normal[3]; copy_v3_v3(normal, face->no); - mul_transposed_mat3_m4_v3(ob->world_to_object().ptr(), normal); + mul_transposed_mat3_m4_v3(ob->world_to_object, normal); normalize_v3(normal); /* We are treating the normals as coordinates, the "nearest" one will @@ -511,8 +511,8 @@ static void edge_pos_direction_worldspace_get(Object *ob, BMEdge *edge, float *r copy_v3_v3(v1, edge->v1->co); copy_v3_v3(v2, edge->v2->co); - mul_m4_v3(ob->object_to_world().ptr(), v1); - mul_m4_v3(ob->object_to_world().ptr(), v2); + mul_m4_v3(ob->object_to_world, v1); + mul_m4_v3(ob->object_to_world, v2); sub_v3_v3v3(r_dir, v1, v2); normalize_v3(r_dir); @@ -522,8 +522,8 @@ static float edge_length_squared_worldspace_get(Object *ob, BMEdge *edge) { float v1[3], v2[3]; - mul_v3_mat3_m4v3(v1, ob->object_to_world().ptr(), edge->v1->co); - mul_v3_mat3_m4v3(v2, ob->object_to_world().ptr(), edge->v2->co); + mul_v3_mat3_m4v3(v1, ob->object_to_world, edge->v1->co); + mul_v3_mat3_m4v3(v2, ob->object_to_world, edge->v2->co); return len_squared_v3v3(v1, v2); } @@ -646,7 +646,7 @@ static int similar_edge_select_exec(bContext *C, wmOperator *op) } float ob_m3[3][3], ob_m3_inv[3][3]; - copy_m3_m4(ob_m3, ob->object_to_world().ptr()); + copy_m3_m4(ob_m3, ob->object_to_world); invert_m3_m3(ob_m3_inv, ob_m3); BMEdge *edge; /* Mesh edge. */ @@ -770,7 +770,7 @@ static int similar_edge_select_exec(bContext *C, wmOperator *op) } float ob_m3[3][3], ob_m3_inv[3][3]; - copy_m3_m4(ob_m3, ob->object_to_world().ptr()); + copy_m3_m4(ob_m3, ob->object_to_world); invert_m3_m3(ob_m3_inv, ob_m3); int custom_data_offset; @@ -997,7 +997,7 @@ static int similar_vert_select_exec(bContext *C, wmOperator *op) BLI_bitmap *defbase_selected = nullptr; int defbase_len = 0; - invert_m4_m4(ob->runtime->world_to_object.ptr(), ob->object_to_world().ptr()); + invert_m4_m4(ob->world_to_object, ob->object_to_world); if (bm->totvertsel == 0) { continue; @@ -1038,7 +1038,7 @@ static int similar_vert_select_exec(bContext *C, wmOperator *op) case SIMVERT_NORMAL: { float normal[3]; copy_v3_v3(normal, vert->no); - mul_transposed_mat3_m4_v3(ob->world_to_object().ptr(), normal); + mul_transposed_mat3_m4_v3(ob->world_to_object, normal); normalize_v3(normal); BLI_kdtree_3d_insert(tree_3d, normal_tree_index++, normal); @@ -1190,7 +1190,7 @@ static int similar_vert_select_exec(bContext *C, wmOperator *op) case SIMVERT_NORMAL: { float normal[3]; copy_v3_v3(normal, vert->no); - mul_transposed_mat3_m4_v3(ob->world_to_object().ptr(), normal); + mul_transposed_mat3_m4_v3(ob->world_to_object, normal); normalize_v3(normal); /* We are treating the normals as coordinates, the "nearest" one will diff --git a/source/blender/editors/mesh/editmesh_set_sharpness_by_angle.cc b/source/blender/editors/mesh/editmesh_set_sharpness_by_angle.cc index 3128ffbcd3a..9814534f7ec 100644 --- a/source/blender/editors/mesh/editmesh_set_sharpness_by_angle.cc +++ b/source/blender/editors/mesh/editmesh_set_sharpness_by_angle.cc @@ -23,6 +23,7 @@ #include "WM_api.hh" +#include "ED_mesh.hh" #include "ED_screen.hh" #include "mesh_intern.hh" diff --git a/source/blender/editors/mesh/editmesh_tools.cc b/source/blender/editors/mesh/editmesh_tools.cc index f557b2f9966..d75622a8bc5 100644 --- a/source/blender/editors/mesh/editmesh_tools.cc +++ b/source/blender/editors/mesh/editmesh_tools.cc @@ -7,7 +7,6 @@ */ #include -#include #include "MEM_guardedalloc.h" @@ -31,6 +30,7 @@ #include "BLI_math_vector.h" #include "BLI_rand.h" #include "BLI_sort_utils.h" +#include "BLI_string.h" #include "BKE_attribute.hh" #include "BKE_context.hh" @@ -40,16 +40,17 @@ #include "BKE_key.hh" #include "BKE_layer.hh" #include "BKE_lib_id.hh" +#include "BKE_main.hh" #include "BKE_material.h" #include "BKE_mesh.hh" #include "BKE_object.hh" -#include "BKE_object_types.hh" -#include "BKE_report.hh" +#include "BKE_report.h" +#include "BKE_texture.h" #include "DEG_depsgraph.hh" #include "DEG_depsgraph_build.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "RNA_access.hh" #include "RNA_define.hh" @@ -68,6 +69,8 @@ #include "ED_uvedit.hh" #include "ED_view3d.hh" +#include "RE_texture.h" + #include "UI_interface.hh" #include "UI_resources.hh" @@ -3305,8 +3308,8 @@ static bool merge_target(BMEditMesh *em, if (use_cursor) { vco = scene->cursor.location; copy_v3_v3(co, vco); - invert_m4_m4(ob->runtime->world_to_object.ptr(), ob->object_to_world().ptr()); - mul_m4_v3(ob->world_to_object().ptr(), co); + invert_m4_m4(ob->world_to_object, ob->object_to_world); + mul_m4_v3(ob->world_to_object, co); } else { float fac; @@ -3442,8 +3445,8 @@ static const EnumPropertyItem *merge_type_itemf(bContext *C, /* 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 a separate code-path for these but it's a - * hassle for now just apply to the active (first) object. */ + * since selecting will activate - we could have own code-path for these but it's a hassle + * for now just apply to the active (first) object. */ if (em->selectmode & SCE_SELECT_VERTEX) { if (em->bm->selected.first && em->bm->selected.last && ((BMEditSelection *)em->bm->selected.first)->htype == BM_VERT && @@ -6605,7 +6608,7 @@ static void sort_bmelem_flag(bContext *C, int coidx = (action == SRT_VIEW_ZAXIS) ? 2 : 0; /* Apply the view matrix to the object matrix. */ - mul_m4_m4m4(mat, rv3d->viewmat, ob->object_to_world().ptr()); + mul_m4_m4m4(mat, rv3d->viewmat, ob->object_to_world); if (totelem[0]) { pb = pblock[0] = static_cast(MEM_callocN(sizeof(char) * totelem[0], __func__)); @@ -6677,7 +6680,7 @@ static void sort_bmelem_flag(bContext *C, copy_v3_v3(cur, scene->cursor.location); - invert_m4_m4(mat, ob->object_to_world().ptr()); + invert_m4_m4(mat, ob->object_to_world); mul_m4_v3(mat, cur); if (totelem[0]) { @@ -8349,33 +8352,41 @@ static void point_normals_cancel(bContext *C, wmOperator *op) static void point_normals_update_header(bContext *C, wmOperator *op) { - auto get_modal_key_str = [&](int id) { - return WM_modalkeymap_operator_items_to_string(op->type, id, true).value_or(""); - }; + char header[UI_MAX_DRAW_STR]; + char buf[UI_MAX_DRAW_STR]; - const std::string header = fmt::format( - IFACE_("{}: confirm, {}: cancel, " - "{}: point to mouse ({}), {}: point to Pivot, " - "{}: point to object origin, {}: reset normals, " - "{}: set & point to 3D cursor, {}: select & point to mesh item, " - "{}: invert normals ({}), {}: spherize ({}), {}: align ({})"), - get_modal_key_str(EDBM_CLNOR_MODAL_CONFIRM), - get_modal_key_str(EDBM_CLNOR_MODAL_CANCEL), - get_modal_key_str(EDBM_CLNOR_MODAL_POINTTO_USE_MOUSE), - WM_bool_as_string(RNA_enum_get(op->ptr, "mode") == EDBM_CLNOR_POINTTO_MODE_MOUSE), - get_modal_key_str(EDBM_CLNOR_MODAL_POINTTO_USE_PIVOT), - get_modal_key_str(EDBM_CLNOR_MODAL_POINTTO_USE_OBJECT), - get_modal_key_str(EDBM_CLNOR_MODAL_POINTTO_RESET), - get_modal_key_str(EDBM_CLNOR_MODAL_POINTTO_SET_USE_3DCURSOR), - get_modal_key_str(EDBM_CLNOR_MODAL_POINTTO_SET_USE_SELECTED), - get_modal_key_str(EDBM_CLNOR_MODAL_POINTTO_INVERT), - WM_bool_as_string(RNA_boolean_get(op->ptr, "invert")), - get_modal_key_str(EDBM_CLNOR_MODAL_POINTTO_SPHERIZE), - WM_bool_as_string(RNA_boolean_get(op->ptr, "spherize")), - get_modal_key_str(EDBM_CLNOR_MODAL_POINTTO_ALIGN), - WM_bool_as_string(RNA_boolean_get(op->ptr, "align"))); + char *p = buf; + int available_len = sizeof(buf); - ED_area_status_text(CTX_wm_area(C), header.c_str()); +#define WM_MODALKEY(_id) \ + WM_modalkeymap_operator_items_to_string_buf( \ + op->type, (_id), true, UI_MAX_SHORTCUT_STR, &available_len, &p) + + SNPRINTF(header, + IFACE_("%s: confirm, %s: cancel, " + "%s: point to mouse (%s), %s: point to Pivot, " + "%s: point to object origin, %s: reset normals, " + "%s: set & point to 3D cursor, %s: select & point to mesh item, " + "%s: invert normals (%s), %s: spherize (%s), %s: align (%s)"), + WM_MODALKEY(EDBM_CLNOR_MODAL_CONFIRM), + WM_MODALKEY(EDBM_CLNOR_MODAL_CANCEL), + WM_MODALKEY(EDBM_CLNOR_MODAL_POINTTO_USE_MOUSE), + WM_bool_as_string(RNA_enum_get(op->ptr, "mode") == EDBM_CLNOR_POINTTO_MODE_MOUSE), + WM_MODALKEY(EDBM_CLNOR_MODAL_POINTTO_USE_PIVOT), + WM_MODALKEY(EDBM_CLNOR_MODAL_POINTTO_USE_OBJECT), + WM_MODALKEY(EDBM_CLNOR_MODAL_POINTTO_RESET), + WM_MODALKEY(EDBM_CLNOR_MODAL_POINTTO_SET_USE_3DCURSOR), + WM_MODALKEY(EDBM_CLNOR_MODAL_POINTTO_SET_USE_SELECTED), + WM_MODALKEY(EDBM_CLNOR_MODAL_POINTTO_INVERT), + WM_bool_as_string(RNA_boolean_get(op->ptr, "invert")), + WM_MODALKEY(EDBM_CLNOR_MODAL_POINTTO_SPHERIZE), + WM_bool_as_string(RNA_boolean_get(op->ptr, "spherize")), + WM_MODALKEY(EDBM_CLNOR_MODAL_POINTTO_ALIGN), + WM_bool_as_string(RNA_boolean_get(op->ptr, "align"))); + +#undef WM_MODALKEY + + ED_area_status_text(CTX_wm_area(C), header); } /* TODO: move that to generic function in BMesh? */ diff --git a/source/blender/editors/mesh/editmesh_utils.cc b/source/blender/editors/mesh/editmesh_utils.cc index d0c95460ed8..40fe380e3ca 100644 --- a/source/blender/editors/mesh/editmesh_utils.cc +++ b/source/blender/editors/mesh/editmesh_utils.cc @@ -13,19 +13,23 @@ #include "DNA_object_types.h" #include "BLI_array.hh" +#include "BLI_buffer.h" #include "BLI_kdtree.h" #include "BLI_listbase.h" #include "BLI_math_matrix.h" #include "BLI_math_vector.h" +#include "BKE_DerivedMesh.hh" #include "BKE_context.hh" #include "BKE_customdata.hh" #include "BKE_editmesh.hh" #include "BKE_editmesh_bvh.h" +#include "BKE_global.h" #include "BKE_layer.hh" +#include "BKE_main.hh" #include "BKE_mesh.hh" #include "BKE_mesh_mapping.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "DEG_depsgraph.hh" @@ -1867,7 +1871,7 @@ bool BMBVH_EdgeVisible( ED_view3d_win_to_segment_clipped(depsgraph, region, v3d, mval_f, origin, end, false); - invert_m4_m4(invmat, obedit->object_to_world().ptr()); + invert_m4_m4(invmat, obedit->object_to_world); mul_m4_v3(invmat, origin); copy_v3_v3(co1, e->v1->co); @@ -1962,7 +1966,7 @@ void EDBM_project_snap_verts( co_proj, nullptr)) { - mul_v3_m4v3(eve->co, obedit->world_to_object().ptr(), co_proj); + mul_v3_m4v3(eve->co, obedit->world_to_object, co_proj); } } } diff --git a/source/blender/editors/mesh/mesh_data.cc b/source/blender/editors/mesh/mesh_data.cc index a359a80d026..38741dc4493 100644 --- a/source/blender/editors/mesh/mesh_data.cc +++ b/source/blender/editors/mesh/mesh_data.cc @@ -22,21 +22,25 @@ #include "BKE_key.hh" #include "BKE_mesh.hh" #include "BKE_mesh_runtime.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "DEG_depsgraph.hh" +#include "RNA_access.hh" +#include "RNA_define.hh" #include "RNA_prototypes.h" #include "WM_api.hh" #include "WM_types.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "ED_mesh.hh" #include "ED_object.hh" #include "ED_paint.hh" #include "ED_screen.hh" +#include "ED_uvedit.hh" +#include "ED_view3d.hh" #include "GEO_mesh_split_edges.hh" @@ -270,14 +274,17 @@ int ED_mesh_uv_add( CD_PROP_FLOAT2, MEM_dupallocN(CustomData_get_layer(&mesh->corner_data, CD_PROP_FLOAT2)), mesh->corners_num, - unique_name, + unique_name.c_str(), nullptr); is_init = true; } else { - CustomData_add_layer_named( - &mesh->corner_data, CD_PROP_FLOAT2, CD_SET_DEFAULT, mesh->corners_num, unique_name); + CustomData_add_layer_named(&mesh->corner_data, + CD_PROP_FLOAT2, + CD_SET_DEFAULT, + mesh->corners_num, + unique_name.c_str()); } if (active_set || layernum_dst == 0) { @@ -334,10 +341,10 @@ const bool *ED_mesh_uv_map_pin_layer_get(const Mesh *mesh, const int uv_index) static bool *ensure_corner_boolean_attribute(Mesh &mesh, const blender::StringRefNull name) { bool *data = static_cast(CustomData_get_layer_named_for_write( - &mesh.corner_data, CD_PROP_BOOL, name, mesh.corners_num)); + &mesh.corner_data, CD_PROP_BOOL, name.c_str(), mesh.corners_num)); if (!data) { data = static_cast(CustomData_add_layer_named( - &mesh.corner_data, CD_PROP_BOOL, CD_SET_DEFAULT, mesh.faces_num, name)); + &mesh.corner_data, CD_PROP_BOOL, CD_SET_DEFAULT, mesh.faces_num, name.c_str())); } return data; } diff --git a/source/blender/editors/mesh/mesh_mirror.cc b/source/blender/editors/mesh/mesh_mirror.cc index 0ce069777e4..8a494593cec 100644 --- a/source/blender/editors/mesh/mesh_mirror.cc +++ b/source/blender/editors/mesh/mesh_mirror.cc @@ -28,13 +28,11 @@ static struct { KDTree_3d *tree; } MirrKdStore = {nullptr}; -void ED_mesh_mirror_spatial_table_begin(Object *ob, BMEditMesh *em, Mesh *mesh_eval) +void ED_mesh_mirror_spatial_table_begin(Object *ob, BMEditMesh *em, Mesh *me_eval) { Mesh *mesh = static_cast(ob->data); - const bool use_em = (!mesh_eval && em && mesh->edit_mesh == em); - const int totvert = use_em ? em->bm->totvert : - mesh_eval ? mesh_eval->verts_num : - mesh->verts_num; + const bool use_em = (!me_eval && em && mesh->edit_mesh == em); + const int totvert = use_em ? em->bm->totvert : me_eval ? me_eval->verts_num : mesh->verts_num; if (MirrKdStore.tree) { /* happens when entering this call without ending it */ ED_mesh_mirror_spatial_table_end(ob); @@ -55,8 +53,8 @@ void ED_mesh_mirror_spatial_table_begin(Object *ob, BMEditMesh *em, Mesh *mesh_e } } else { - const blender::Span positions = mesh_eval ? mesh_eval->vert_positions() : - mesh->vert_positions(); + const blender::Span positions = me_eval ? me_eval->vert_positions() : + mesh->vert_positions(); for (int i = 0; i < totvert; i++) { BLI_kdtree_3d_insert(MirrKdStore.tree, i, positions[i]); } @@ -67,11 +65,11 @@ void ED_mesh_mirror_spatial_table_begin(Object *ob, BMEditMesh *em, Mesh *mesh_e int ED_mesh_mirror_spatial_table_lookup(Object *ob, BMEditMesh *em, - Mesh *mesh_eval, + Mesh *me_eval, const float co[3]) { if (MirrKdStore.tree == nullptr) { - ED_mesh_mirror_spatial_table_begin(ob, em, mesh_eval); + ED_mesh_mirror_spatial_table_begin(ob, em, me_eval); } if (MirrKdStore.tree) { diff --git a/source/blender/editors/mesh/meshtools.cc b/source/blender/editors/mesh/meshtools.cc index 1adc3f50061..3fea0b1f0c0 100644 --- a/source/blender/editors/mesh/meshtools.cc +++ b/source/blender/editors/mesh/meshtools.cc @@ -25,6 +25,7 @@ #include "DNA_scene_types.h" #include "DNA_screen_types.h" #include "DNA_view3d_types.h" +#include "DNA_workspace_types.h" #include "BKE_attribute.hh" #include "BKE_context.hh" @@ -32,7 +33,9 @@ #include "BKE_deform.hh" #include "BKE_editmesh.hh" #include "BKE_key.hh" +#include "BKE_layer.hh" #include "BKE_lib_id.hh" +#include "BKE_main.hh" #include "BKE_material.h" #include "BKE_mesh.hh" #include "BKE_mesh_iterators.hh" @@ -40,7 +43,7 @@ #include "BKE_multires.hh" #include "BKE_object.hh" #include "BKE_object_deform.h" -#include "BKE_report.hh" +#include "BKE_report.h" #include "DEG_depsgraph.hh" #include "DEG_depsgraph_build.hh" @@ -137,7 +140,7 @@ static void join_mesh_single(Depsgraph *depsgraph, float cmat[4][4]; /* Watch this: switch matrix multiplication order really goes wrong. */ - mul_m4_m4m4(cmat, imat, ob_src->object_to_world().ptr()); + mul_m4_m4m4(cmat, imat, ob_src->object_to_world); /* transform vertex coordinates into new space */ for (a = 0; a < mesh->verts_num; a++) { @@ -147,7 +150,7 @@ static void join_mesh_single(Depsgraph *depsgraph, /* For each shape-key in destination mesh: * - if there's a matching one, copy it across * (will need to transform vertices into new space...). - * - otherwise, just copy its own coordinates of mesh + * - otherwise, just copy own coordinates of mesh * (no need to transform vertex coordinates into new space). */ if (key) { @@ -374,7 +377,7 @@ int ED_mesh_join_objects_exec(bContext *C, wmOperator *op) * NOTE: This doesn't apply recursive parenting. */ if (join_parent) { ob->parent = nullptr; - BKE_object_apply_mat4_ex(ob, ob->object_to_world().ptr(), ob->parent, ob->parentinv, false); + BKE_object_apply_mat4_ex(ob, ob->object_to_world, ob->parent, ob->parentinv, false); } /* that way the active object is always selected */ @@ -567,7 +570,7 @@ int ED_mesh_join_objects_exec(bContext *C, wmOperator *op) /* Inverse transform for all selected meshes in this object, * See #object_join_exec for detailed comment on why the safe version is used. */ - invert_m4_m4_safe_ortho(imat, ob->object_to_world().ptr()); + invert_m4_m4_safe_ortho(imat, ob->object_to_world); /* Add back active mesh first. * This allows to keep things similar as they were, as much as possible @@ -821,35 +824,35 @@ int ED_mesh_shapes_join_objects_exec(bContext *C, wmOperator *op) static MirrTopoStore_t mesh_topo_store = {nullptr, -1, -1, false}; BLI_INLINE void mesh_mirror_topo_table_get_meshes(Object *ob, - Mesh *mesh_eval, - Mesh **r_mesh_mirror, + Mesh *me_eval, + Mesh **r_me_mirror, BMEditMesh **r_em_mirror) { - Mesh *mesh_mirror = nullptr; + Mesh *me_mirror = nullptr; BMEditMesh *em_mirror = nullptr; Mesh *mesh = static_cast(ob->data); - if (mesh_eval != nullptr) { - mesh_mirror = mesh_eval; + if (me_eval != nullptr) { + me_mirror = me_eval; } else if (mesh->edit_mesh != nullptr) { em_mirror = mesh->edit_mesh; } else { - mesh_mirror = mesh; + me_mirror = mesh; } - *r_mesh_mirror = mesh_mirror; + *r_me_mirror = me_mirror; *r_em_mirror = em_mirror; } -void ED_mesh_mirror_topo_table_begin(Object *ob, Mesh *mesh_eval) +void ED_mesh_mirror_topo_table_begin(Object *ob, Mesh *me_eval) { - Mesh *mesh_mirror; + Mesh *me_mirror; BMEditMesh *em_mirror; - mesh_mirror_topo_table_get_meshes(ob, mesh_eval, &mesh_mirror, &em_mirror); + mesh_mirror_topo_table_get_meshes(ob, me_eval, &me_mirror, &em_mirror); - ED_mesh_mirrtopo_init(em_mirror, mesh_mirror, &mesh_topo_store, false); + ED_mesh_mirrtopo_init(em_mirror, me_mirror, &mesh_topo_store, false); } void ED_mesh_mirror_topo_table_end(Object * /*ob*/) @@ -859,24 +862,24 @@ void ED_mesh_mirror_topo_table_end(Object * /*ob*/) } /* Returns true on success. */ -static bool ed_mesh_mirror_topo_table_update(Object *ob, Mesh *mesh_eval) +static bool ed_mesh_mirror_topo_table_update(Object *ob, Mesh *me_eval) { - Mesh *mesh_mirror; + Mesh *me_mirror; BMEditMesh *em_mirror; - mesh_mirror_topo_table_get_meshes(ob, mesh_eval, &mesh_mirror, &em_mirror); + mesh_mirror_topo_table_get_meshes(ob, me_eval, &me_mirror, &em_mirror); - if (ED_mesh_mirrtopo_recalc_check(em_mirror, mesh_mirror, &mesh_topo_store)) { - ED_mesh_mirror_topo_table_begin(ob, mesh_eval); + if (ED_mesh_mirrtopo_recalc_check(em_mirror, me_mirror, &mesh_topo_store)) { + ED_mesh_mirror_topo_table_begin(ob, me_eval); } return true; } /** \} */ -static int mesh_get_x_mirror_vert_spatial(Object *ob, Mesh *mesh_eval, int index) +static int mesh_get_x_mirror_vert_spatial(Object *ob, Mesh *me_eval, int index) { Mesh *mesh = static_cast(ob->data); - const Span positions = mesh_eval ? mesh_eval->vert_positions() : mesh->vert_positions(); + const Span positions = me_eval ? me_eval->vert_positions() : mesh->vert_positions(); float vec[3]; @@ -884,7 +887,7 @@ static int mesh_get_x_mirror_vert_spatial(Object *ob, Mesh *mesh_eval, int index vec[1] = positions[index][1]; vec[2] = positions[index][2]; - return ED_mesh_mirror_spatial_table_lookup(ob, nullptr, mesh_eval, vec); + return ED_mesh_mirror_spatial_table_lookup(ob, nullptr, me_eval, vec); } static int mesh_get_x_mirror_vert_topo(Object *ob, Mesh *mesh, int index) @@ -896,12 +899,12 @@ static int mesh_get_x_mirror_vert_topo(Object *ob, Mesh *mesh, int index) return mesh_topo_store.index_lookup[index]; } -int mesh_get_x_mirror_vert(Object *ob, Mesh *mesh_eval, int index, const bool use_topology) +int mesh_get_x_mirror_vert(Object *ob, Mesh *me_eval, int index, const bool use_topology) { if (use_topology) { - return mesh_get_x_mirror_vert_topo(ob, mesh_eval, index); + return mesh_get_x_mirror_vert_topo(ob, me_eval, index); } - return mesh_get_x_mirror_vert_spatial(ob, mesh_eval, index); + return mesh_get_x_mirror_vert_spatial(ob, me_eval, index); } static BMVert *editbmesh_get_x_mirror_vert_spatial(Object *ob, BMEditMesh *em, const float co[3]) @@ -1095,7 +1098,7 @@ static bool mirror_facecmp(const void *a, const void *b) return (mirror_facerotation((MFace *)a, (MFace *)b) == -1); } -int *mesh_get_x_mirror_faces(Object *ob, BMEditMesh *em, Mesh *mesh_eval) +int *mesh_get_x_mirror_faces(Object *ob, BMEditMesh *em, Mesh *me_eval) { Mesh *mesh = static_cast(ob->data); MFace mirrormf; @@ -1106,22 +1109,21 @@ int *mesh_get_x_mirror_faces(Object *ob, BMEditMesh *em, Mesh *mesh_eval) BLI_assert(em == nullptr); /* Does not work otherwise, currently... */ const bool use_topology = (mesh->editflag & ME_EDIT_MIRROR_TOPO) != 0; - const int totvert = mesh_eval ? mesh_eval->verts_num : mesh->verts_num; - const int totface = mesh_eval ? mesh_eval->totface_legacy : mesh->totface_legacy; + const int totvert = me_eval ? me_eval->verts_num : mesh->verts_num; + const int totface = me_eval ? me_eval->totface_legacy : mesh->totface_legacy; int a; mirrorverts = static_cast(MEM_callocN(sizeof(int) * totvert, "MirrorVerts")); mirrorfaces = static_cast(MEM_callocN(sizeof(int[2]) * totface, "MirrorFaces")); - const Span vert_positions = mesh_eval ? mesh_eval->vert_positions() : - mesh->vert_positions(); + const Span vert_positions = me_eval ? me_eval->vert_positions() : mesh->vert_positions(); const MFace *mface = (const MFace *)CustomData_get_layer( - &(mesh_eval ? mesh_eval : mesh)->fdata_legacy, CD_MFACE); + &(me_eval ? me_eval : mesh)->fdata_legacy, CD_MFACE); - ED_mesh_mirror_spatial_table_begin(ob, em, mesh_eval); + ED_mesh_mirror_spatial_table_begin(ob, em, me_eval); for (const int i : vert_positions.index_range()) { - mirrorverts[i] = mesh_get_x_mirror_vert(ob, mesh_eval, i, use_topology); + mirrorverts[i] = mesh_get_x_mirror_vert(ob, me_eval, i, use_topology); } ED_mesh_mirror_spatial_table_end(ob); @@ -1233,8 +1235,8 @@ bool ED_mesh_pick_face_vert( if (ED_mesh_pick_face(C, ob, mval, dist_px, &face_index)) { const Object *ob_eval = DEG_get_evaluated_object(depsgraph, ob); - const Mesh *mesh_eval = BKE_object_get_evaluated_mesh(ob_eval); - if (!mesh_eval) { + const Mesh *me_eval = BKE_object_get_evaluated_mesh(ob_eval); + if (!me_eval) { return false; } ARegion *region = CTX_wm_region(C); @@ -1245,11 +1247,11 @@ bool ED_mesh_pick_face_vert( const float mval_f[2] = {float(mval[0]), float(mval[1])}; float len_best = FLT_MAX; - const Span vert_positions = mesh_eval->vert_positions(); - const blender::OffsetIndices faces = mesh_eval->faces(); - const Span corner_verts = mesh_eval->corner_verts(); + const Span vert_positions = me_eval->vert_positions(); + const blender::OffsetIndices faces = me_eval->faces(); + const Span corner_verts = me_eval->corner_verts(); - const int *index_mp_to_orig = (const int *)CustomData_get_layer(&mesh_eval->face_data, + const int *index_mp_to_orig = (const int *)CustomData_get_layer(&me_eval->face_data, CD_ORIGINDEX); /* tag all verts using this face */ @@ -1280,7 +1282,7 @@ bool ED_mesh_pick_face_vert( /* map 'dm -> mesh' r_index if possible */ if (v_idx_best != ORIGINDEX_NONE) { - const int *index_mv_to_orig = (const int *)CustomData_get_layer(&mesh_eval->vert_data, + const int *index_mv_to_orig = (const int *)CustomData_get_layer(&me_eval->vert_data, CD_ORIGINDEX); if (index_mv_to_orig) { v_idx_best = index_mv_to_orig[v_idx_best]; @@ -1368,7 +1370,7 @@ bool ED_mesh_pick_vert( } else { const Object *ob_eval = DEG_get_evaluated_object(vc.depsgraph, ob); - const Mesh *mesh_eval = BKE_object_get_evaluated_mesh(ob_eval); + const Mesh *me_eval = BKE_object_get_evaluated_mesh(ob_eval); ARegion *region = vc.region; RegionView3D *rv3d = static_cast(region->regiondata); @@ -1379,7 +1381,7 @@ bool ED_mesh_pick_vert( ED_view3d_init_mats_rv3d(ob, rv3d); - if (mesh_eval == nullptr) { + if (me_eval == nullptr) { return false; } @@ -1392,7 +1394,7 @@ bool ED_mesh_pick_vert( data.v_idx_best = -1; data.hide_vert = *attributes.lookup(".hide_vert", bke::AttrDomain::Point); - BKE_mesh_foreach_mapped_vert(mesh_eval, ed_mesh_pick_vert__mapFunc, &data, MESH_FOREACH_NOP); + BKE_mesh_foreach_mapped_vert(me_eval, ed_mesh_pick_vert__mapFunc, &data, MESH_FOREACH_NOP); if (data.v_idx_best == -1) { return false; diff --git a/source/blender/editors/metaball/CMakeLists.txt b/source/blender/editors/metaball/CMakeLists.txt index a0653d947f9..a709b70328c 100644 --- a/source/blender/editors/metaball/CMakeLists.txt +++ b/source/blender/editors/metaball/CMakeLists.txt @@ -5,7 +5,6 @@ set(INC ../include ../../blenkernel - ../../blentranslation ../../gpu ../../makesrna ../../render diff --git a/source/blender/editors/metaball/mball_edit.cc b/source/blender/editors/metaball/mball_edit.cc index b2735484e3c..11e7d5e3c3d 100644 --- a/source/blender/editors/metaball/mball_edit.cc +++ b/source/blender/editors/metaball/mball_edit.cc @@ -33,8 +33,6 @@ #include "BKE_object.hh" #include "BKE_object_types.hh" -#include "BLT_translation.hh" - #include "DEG_depsgraph.hh" #include "GPU_select.hh" @@ -48,8 +46,6 @@ #include "WM_api.hh" #include "WM_types.hh" -#include "UI_interface_icons.hh" - #include "mball_intern.h" using blender::Span; @@ -613,20 +609,6 @@ static int delete_metaelems_exec(bContext *C, wmOperator * /*op*/) return OPERATOR_FINISHED; } -static int delete_metaelems_invoke(bContext *C, wmOperator *op, const wmEvent * /*event*/) -{ - if (RNA_boolean_get(op->ptr, "confirm")) { - return WM_operator_confirm_ex(C, - op, - IFACE_("Delete selected metaball elements?"), - nullptr, - IFACE_("Delete"), - ALERT_ICON_NONE, - false); - } - return delete_metaelems_exec(C, op); -} - void MBALL_OT_delete_metaelems(wmOperatorType *ot) { /* identifiers */ @@ -635,7 +617,7 @@ void MBALL_OT_delete_metaelems(wmOperatorType *ot) ot->idname = "MBALL_OT_delete_metaelems"; /* callback functions */ - ot->invoke = delete_metaelems_invoke; + ot->invoke = WM_operator_confirm_or_exec; ot->exec = delete_metaelems_exec; ot->poll = ED_operator_editmball; diff --git a/source/blender/editors/object/add_modifier_assets.cc b/source/blender/editors/object/add_modifier_assets.cc index 1c1af4f2ff8..9d578975581 100644 --- a/source/blender/editors/object/add_modifier_assets.cc +++ b/source/blender/editors/object/add_modifier_assets.cc @@ -20,10 +20,10 @@ #include "BKE_lib_id.hh" #include "BKE_main.hh" #include "BKE_modifier.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "BKE_screen.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "RNA_access.hh" @@ -50,7 +50,7 @@ static bool all_loading_finished() static asset::AssetItemTree build_catalog_tree(const bContext &C) { - asset::AssetFilterSettings type_filter{}; + AssetFilterSettings type_filter{}; type_filter.id_types = FILTER_ID_NT; auto meta_data_filter = [&](const AssetMetaData &meta_data) { const IDProperty *tree_type = BKE_asset_metadata_idprop_find(&meta_data, "type"); @@ -65,7 +65,6 @@ static asset::AssetItemTree build_catalog_tree(const bContext &C) return true; }; const AssetLibraryReference library = asset_system::all_library_reference(); - asset_system::all_library_reload_catalogs_if_dirty(); return asset::build_filtered_all_catalog_tree(library, C, type_filter, meta_data_filter); } @@ -88,7 +87,7 @@ static void catalog_assets_draw(const bContext *C, Menu *menu) *static_cast(menu_path_ptr.data); const Span assets = tree.assets_per_path.lookup(menu_path); - const asset_system::AssetCatalogTreeItem *catalog_item = tree.catalogs.find_item(menu_path); + asset_system::AssetCatalogTreeItem *catalog_item = tree.catalogs.find_item(menu_path); BLI_assert(catalog_item != nullptr); if (assets.is_empty() && !catalog_item->has_children()) { @@ -118,7 +117,7 @@ static void catalog_assets_draw(const bContext *C, Menu *menu) return; } - catalog_item->foreach_child([&](const asset_system::AssetCatalogTreeItem &item) { + catalog_item->foreach_child([&](asset_system::AssetCatalogTreeItem &item) { asset::draw_menu_for_catalog( screen, *all_library, item, "OBJECT_MT_add_modifier_catalog_assets", *layout); }); @@ -241,7 +240,7 @@ static void root_catalogs_draw(const bContext *C, Menu *menu) return; } - tree.catalogs.foreach_root_item([&](const asset_system::AssetCatalogTreeItem &item) { + tree.catalogs.foreach_root_item([&](asset_system::AssetCatalogTreeItem &item) { if (!all_builtin_menus.contains(item.get_name())) { asset::draw_menu_for_catalog( screen, *all_library, item, "OBJECT_MT_add_modifier_catalog_assets", *layout); diff --git a/source/blender/editors/object/object_add.cc b/source/blender/editors/object/object_add.cc index 425529b215e..8deb8b1e1a5 100644 --- a/source/blender/editors/object/object_add.cc +++ b/source/blender/editors/object/object_add.cc @@ -42,13 +42,13 @@ #include "BLI_utildefines.h" #include "BLI_vector.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_action.h" -#include "BKE_anim_data.hh" +#include "BKE_anim_data.h" #include "BKE_armature.hh" #include "BKE_camera.h" -#include "BKE_collection.hh" +#include "BKE_collection.h" #include "BKE_constraint.h" #include "BKE_context.hh" #include "BKE_curve.hh" @@ -56,7 +56,7 @@ #include "BKE_curves.h" #include "BKE_customdata.hh" #include "BKE_displist.h" -#include "BKE_duplilist.hh" +#include "BKE_duplilist.h" #include "BKE_effect.h" #include "BKE_geometry_set.hh" #include "BKE_geometry_set_instances.hh" @@ -65,7 +65,6 @@ #include "BKE_gpencil_legacy.h" #include "BKE_gpencil_modifier_legacy.h" #include "BKE_grease_pencil.hh" -#include "BKE_grease_pencil_legacy_convert.hh" #include "BKE_key.hh" #include "BKE_lattice.hh" #include "BKE_layer.hh" @@ -80,15 +79,14 @@ #include "BKE_mball.hh" #include "BKE_mesh.hh" #include "BKE_mesh_runtime.hh" -#include "BKE_modifier.hh" #include "BKE_nla.h" #include "BKE_node.hh" #include "BKE_object.hh" #include "BKE_object_types.hh" #include "BKE_particle.h" #include "BKE_pointcloud.hh" -#include "BKE_report.hh" -#include "BKE_scene.hh" +#include "BKE_report.h" +#include "BKE_scene.h" #include "BKE_speaker.h" #include "BKE_vfont.hh" #include "BKE_volume.hh" @@ -222,7 +220,7 @@ static void object_add_drop_xy_props(wmOperatorType *ot) "X-coordinate (screen space) to place the new object under", INT_MIN, INT_MAX); - RNA_def_property_flag(prop, PropertyFlag(PROP_HIDDEN | PROP_SKIP_SAVE)); + RNA_def_property_flag(prop, (PropertyFlag)(PROP_HIDDEN | PROP_SKIP_SAVE)); prop = RNA_def_int(ot->srna, "drop_y", 0, @@ -232,7 +230,7 @@ static void object_add_drop_xy_props(wmOperatorType *ot) "Y-coordinate (screen space) to place the new object under", INT_MIN, INT_MAX); - RNA_def_property_flag(prop, PropertyFlag(PROP_HIDDEN | PROP_SKIP_SAVE)); + RNA_def_property_flag(prop, (PropertyFlag)(PROP_HIDDEN | PROP_SKIP_SAVE)); } static bool object_add_drop_xy_is_set(const wmOperator *op) @@ -336,7 +334,7 @@ void ED_object_base_init_transform_on_add(Object *object, const float loc[3], co copy_v3_v3(object->rot, rot); } - BKE_object_to_mat4(object, object->runtime->object_to_world.ptr()); + BKE_object_to_mat4(object, object->object_to_world); } float ED_object_new_primitive_matrix(bContext *C, @@ -356,14 +354,14 @@ float ED_object_new_primitive_matrix(bContext *C, invert_m3(rmat); /* inverse transform for initial rotation and object */ - copy_m3_m4(mat, obedit->object_to_world().ptr()); + copy_m3_m4(mat, obedit->object_to_world); mul_m3_m3m3(cmat, rmat, mat); invert_m3_m3(imat, cmat); copy_m4_m3(r_primmat, imat); /* center */ copy_v3_v3(r_primmat[3], loc); - sub_v3_v3v3(r_primmat[3], r_primmat[3], obedit->object_to_world().location()); + sub_v3_v3v3(r_primmat[3], r_primmat[3], obedit->object_to_world[3]); invert_m3_m3(imat, mat); mul_m3_v3(imat, r_primmat[3]); @@ -418,7 +416,7 @@ void ED_object_add_generic_props(wmOperatorType *ot, bool do_editmode) false, "Enter Edit Mode", "Enter edit mode when adding this object"); - RNA_def_property_flag(prop, PropertyFlag(PROP_HIDDEN | PROP_SKIP_SAVE)); + RNA_def_property_flag(prop, (PropertyFlag)(PROP_HIDDEN | PROP_SKIP_SAVE)); } /* NOTE: this property gets hidden for add-camera operator. */ prop = RNA_def_enum( @@ -458,7 +456,7 @@ void ED_object_add_generic_props(wmOperatorType *ot, bool do_editmode) "Scale for the newly added object", -1000.0f, 1000.0f); - RNA_def_property_flag(prop, PropertyFlag(PROP_HIDDEN | PROP_SKIP_SAVE)); + RNA_def_property_flag(prop, (PropertyFlag)(PROP_HIDDEN | PROP_SKIP_SAVE)); } void ED_object_add_mesh_props(wmOperatorType *ot) @@ -1234,82 +1232,10 @@ void OBJECT_OT_empty_add(wmOperatorType *ot) ED_object_add_generic_props(ot, false); } -static int object_image_add_exec(bContext *C, wmOperator *op) +static int empty_drop_named_image_invoke(bContext *C, wmOperator *op, const wmEvent *event) { - Image *ima = nullptr; + Scene *scene = CTX_data_scene(C); - ima = (Image *)WM_operator_drop_load_path(C, op, ID_IM); - if (!ima) { - return OPERATOR_CANCELLED; - } - - /* add new empty */ - ushort local_view_bits; - float loc[3], rot[3]; - - if (!ED_object_add_generic_get_opts( - C, op, 'Z', loc, rot, nullptr, nullptr, &local_view_bits, nullptr)) - { - return OPERATOR_CANCELLED; - } - Object *ob = ED_object_add_type(C, OB_EMPTY, nullptr, loc, rot, false, local_view_bits); - ob->empty_drawsize = 5.0f; - - if (RNA_boolean_get(op->ptr, "background")) { - /* "background" has been set to "true", set image to render in the background. */ - ob->empty_image_depth = OB_EMPTY_IMAGE_DEPTH_BACK; - ob->empty_image_visibility_flag = OB_EMPTY_IMAGE_HIDE_BACK; - - RegionView3D *rv3d = CTX_wm_region_view3d(C); - if (rv3d->persp != RV3D_PERSP) { - ob->empty_image_visibility_flag |= OB_EMPTY_IMAGE_HIDE_PERSPECTIVE; - } - } - - BKE_object_empty_draw_type_set(ob, OB_EMPTY_IMAGE); - - ob->data = ima; - - return OPERATOR_FINISHED; -} - -static int object_image_add_invoke(bContext *C, wmOperator *op, const wmEvent *event) -{ - if (!RNA_struct_property_is_set(op->ptr, "align")) { - /* Default to Aligned unless something else was explicitly passed */ - RNA_enum_set(op->ptr, "align", ALIGN_VIEW); - } - - /* Check if the user has not specified the image to load. - * If they have not, assume this is a drag an drop operation. - */ - if (!RNA_struct_property_is_set(op->ptr, "filepath") && - !WM_operator_properties_id_lookup_is_set(op->ptr)) - { - WM_event_add_fileselect(C, op); - return OPERATOR_RUNNING_MODAL; - } - - if (!RNA_struct_property_is_set(op->ptr, "background")) { - /* Check if we should switch to "background" mode. */ - RegionView3D *rv3d = CTX_wm_region_view3d(C); - if (rv3d->persp != RV3D_PERSP) { - RNA_boolean_set(op->ptr, "background", true); - } - } - - float loc[3]; - ED_object_location_from_view(C, loc); - ED_view3d_cursor3d_position(C, event->mval, false, loc); - RNA_float_set_array(op->ptr, "location", loc); - - Object *ob_cursor = ED_view3d_give_object_under_cursor(C, event->mval); - - /* Either change empty under cursor or create a new empty */ - if (!ob_cursor || ob_cursor->type != OB_EMPTY) { - return object_image_add_exec(C, op); - } - /* User dropped an image on an existing image */ Image *ima = nullptr; ima = (Image *)WM_operator_drop_load_path(C, op, ID_IM); @@ -1319,56 +1245,71 @@ static int object_image_add_invoke(bContext *C, wmOperator *op, const wmEvent *e /* handled below */ id_us_min(&ima->id); - Scene *scene = CTX_data_scene(C); - WM_event_add_notifier(C, NC_SCENE | ND_OB_ACTIVE, scene); - DEG_id_tag_update((ID *)ob_cursor, ID_RECALC_TRANSFORM); + Object *ob = nullptr; + Object *ob_cursor = ED_view3d_give_object_under_cursor(C, event->mval); - BKE_object_empty_draw_type_set(ob_cursor, OB_EMPTY_IMAGE); + /* either change empty under cursor or create a new empty */ + if (ob_cursor && ob_cursor->type == OB_EMPTY) { + WM_event_add_notifier(C, NC_SCENE | ND_OB_ACTIVE, scene); + DEG_id_tag_update((ID *)ob_cursor, ID_RECALC_TRANSFORM); + ob = ob_cursor; + } + else { + /* add new empty */ + ushort local_view_bits; + float rot[3]; + + if (!ED_object_add_generic_get_opts( + C, op, 'Z', nullptr, rot, nullptr, nullptr, &local_view_bits, nullptr)) + { + return OPERATOR_CANCELLED; + } + ob = ED_object_add_type(C, OB_EMPTY, nullptr, nullptr, rot, false, local_view_bits); + + ED_object_location_from_view(C, ob->loc); + ED_view3d_cursor3d_position(C, event->mval, false, ob->loc); + ED_object_rotation_from_view(C, ob->rot, 'Z'); + ob->empty_drawsize = 5.0f; + } + + BKE_object_empty_draw_type_set(ob, OB_EMPTY_IMAGE); + + id_us_min(static_cast(ob->data)); + ob->data = ima; + id_us_plus(static_cast(ob->data)); - id_us_min(static_cast(ob_cursor->data)); - ob_cursor->data = ima; - id_us_plus(static_cast(ob_cursor->data)); return OPERATOR_FINISHED; } -void OBJECT_OT_empty_image_add(wmOperatorType *ot) +void OBJECT_OT_drop_named_image(wmOperatorType *ot) { + PropertyRNA *prop; + /* identifiers */ ot->name = "Add Empty Image/Drop Image to Empty"; ot->description = "Add an empty image type to scene with data"; - ot->idname = "OBJECT_OT_empty_image_add"; + ot->idname = "OBJECT_OT_drop_named_image"; /* api callbacks */ - ot->invoke = object_image_add_invoke; - ot->exec = object_image_add_exec; + ot->invoke = empty_drop_named_image_invoke; ot->poll = ED_operator_objectmode; /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; /* properties */ - WM_operator_properties_filesel(ot, - FILE_TYPE_FOLDER | FILE_TYPE_IMAGE | FILE_TYPE_MOVIE, - FILE_SPECIAL, - FILE_OPENFILE, - WM_FILESEL_FILEPATH | WM_FILESEL_RELPATH, - FILE_DEFAULTDISPLAY, - FILE_SORT_DEFAULT); + prop = RNA_def_string(ot->srna, "filepath", nullptr, FILE_MAX, "Filepath", "Path to image file"); + RNA_def_property_flag(prop, (PropertyFlag)(PROP_HIDDEN | PROP_SKIP_SAVE)); + RNA_def_boolean(ot->srna, + "relative_path", + true, + "Relative Path", + "Select the file relative to the blend file"); + RNA_def_property_flag(prop, (PropertyFlag)(PROP_HIDDEN | PROP_SKIP_SAVE)); WM_operator_properties_id_lookup(ot, true); + ED_object_add_generic_props(ot, false); - PropertyRNA *prop; - prop = RNA_def_boolean(ot->srna, - "background", - false, - "Put in Background", - "Make the image render behind all objects"); - RNA_def_property_flag(prop, PropertyFlag(PROP_SKIP_SAVE)); - /* Hide the filepath and relative path prop */ - prop = RNA_struct_type_find_property(ot->srna, "filepath"); - RNA_def_property_flag(prop, PropertyFlag(PROP_HIDDEN | PROP_SKIP_PRESET)); - prop = RNA_struct_type_find_property(ot->srna, "relative_path"); - RNA_def_property_flag(prop, PropertyFlag(PROP_HIDDEN)); } /** \} */ @@ -1434,9 +1375,9 @@ static int object_gpencil_add_exec(bContext *C, wmOperator *op) ob_name = CTX_DATA_(BLT_I18NCONTEXT_ID_GPENCIL, "Stroke"); break; } - case GREASE_PENCIL_LINEART_OBJECT: - case GREASE_PENCIL_LINEART_SCENE: - case GREASE_PENCIL_LINEART_COLLECTION: { + case GP_LRT_OBJECT: + case GP_LRT_SCENE: + case GP_LRT_COLLECTION: { ob_name = CTX_DATA_(BLT_I18NCONTEXT_ID_GPENCIL, "LineArt"); break; } @@ -1485,9 +1426,9 @@ static int object_gpencil_add_exec(bContext *C, wmOperator *op) ED_gpencil_create_monkey(C, ob, mat); break; } - case GREASE_PENCIL_LINEART_SCENE: - case GREASE_PENCIL_LINEART_COLLECTION: - case GREASE_PENCIL_LINEART_OBJECT: { + case GP_LRT_SCENE: + case GP_LRT_COLLECTION: + case GP_LRT_OBJECT: { float radius = RNA_float_get(op->ptr, "radius"); float scale[3]; copy_v3_fl(scale, radius); @@ -1505,17 +1446,17 @@ static int object_gpencil_add_exec(bContext *C, wmOperator *op) BLI_addtail(&ob->greasepencil_modifiers, md); BKE_gpencil_modifier_unique_name(&ob->greasepencil_modifiers, (GpencilModifierData *)md); - if (type == GREASE_PENCIL_LINEART_COLLECTION) { - md->source_type = LINEART_SOURCE_COLLECTION; + if (type == GP_LRT_COLLECTION) { + md->source_type = LRT_SOURCE_COLLECTION; md->source_collection = CTX_data_collection(C); } - else if (type == GREASE_PENCIL_LINEART_OBJECT) { - md->source_type = LINEART_SOURCE_OBJECT; + else if (type == GP_LRT_OBJECT) { + md->source_type = LRT_SOURCE_OBJECT; md->source_object = ob_orig; } else { /* Whole scene. */ - md->source_type = LINEART_SOURCE_SCENE; + md->source_type = LRT_SOURCE_SCENE; } /* Only created one layer and one material. */ STRNCPY(md->target_layer, ((bGPDlayer *)gpd->layers.first)->info); @@ -1573,11 +1514,7 @@ static void object_add_ui(bContext * /*C*/, wmOperator *op) uiItemR(layout, op->ptr, "type", UI_ITEM_NONE, nullptr, ICON_NONE); int type = RNA_enum_get(op->ptr, "type"); - if (ELEM(type, - GREASE_PENCIL_LINEART_COLLECTION, - GREASE_PENCIL_LINEART_OBJECT, - GREASE_PENCIL_LINEART_SCENE)) - { + if (ELEM(type, GP_LRT_COLLECTION, GP_LRT_OBJECT, GP_LRT_SCENE)) { uiItemR(layout, op->ptr, "use_lights", UI_ITEM_NONE, nullptr, ICON_NONE); uiItemR(layout, op->ptr, "use_in_front", UI_ITEM_NONE, nullptr, ICON_NONE); bool in_front = RNA_boolean_get(op->ptr, "use_in_front"); @@ -1685,9 +1622,9 @@ static int object_grease_pencil_add_exec(bContext *C, wmOperator *op) ob_name = CTX_DATA_(BLT_I18NCONTEXT_ID_GPENCIL, "Suzanne"); break; } - case GREASE_PENCIL_LINEART_OBJECT: - case GREASE_PENCIL_LINEART_SCENE: - case GREASE_PENCIL_LINEART_COLLECTION: { + case GP_LRT_OBJECT: + case GP_LRT_SCENE: + case GP_LRT_COLLECTION: { ob_name = CTX_DATA_(BLT_I18NCONTEXT_ID_GPENCIL, "LineArt"); break; } @@ -1724,65 +1661,10 @@ static int object_grease_pencil_add_exec(bContext *C, wmOperator *op) greasepencil::create_suzanne(*bmain, *object, mat, scene->r.cfra); break; } - case GREASE_PENCIL_LINEART_OBJECT: - case GREASE_PENCIL_LINEART_SCENE: - case GREASE_PENCIL_LINEART_COLLECTION: { - Object *original_active_object = CTX_data_active_object(C); - - const int type = RNA_enum_get(op->ptr, "type"); - const bool use_in_front = RNA_boolean_get(op->ptr, "use_in_front"); - const bool use_lights = RNA_boolean_get(op->ptr, "use_lights"); - const int stroke_depth_order = RNA_enum_get(op->ptr, "stroke_depth_order"); - const float stroke_depth_offset = RNA_float_get(op->ptr, "stroke_depth_offset"); - - greasepencil::create_blank(*bmain, *object, scene->r.cfra); - - auto *grease_pencil = reinterpret_cast(object->data); - auto *new_md = reinterpret_cast( - BKE_modifier_new(eModifierType_GreasePencilLineart)); - auto *md = reinterpret_cast(new_md); - - BLI_addtail(&object->modifiers, md); - BKE_modifier_unique_name(&object->modifiers, new_md); - BKE_modifiers_persistent_uid_init(*object, *new_md); - - if (type == GREASE_PENCIL_LINEART_COLLECTION) { - md->source_type = LINEART_SOURCE_COLLECTION; - md->source_collection = CTX_data_collection(C); - } - else if (type == GREASE_PENCIL_LINEART_OBJECT) { - md->source_type = LINEART_SOURCE_OBJECT; - md->source_object = original_active_object; - } - else { - /* Whole scene. */ - md->source_type = LINEART_SOURCE_SCENE; - } - /* Only created one layer and one material. */ - STRNCPY(md->target_layer, grease_pencil->get_active_layer()->name().c_str()); - md->target_material = BKE_object_material_get(object, 0); - if (md->target_material) { - id_us_plus(&md->target_material->id); - } - - if (use_lights) { - object->dtx |= OB_USE_GPENCIL_LIGHTS; - } - else { - object->dtx &= ~OB_USE_GPENCIL_LIGHTS; - } - - /* Stroke object is drawn in front of meshes by default. */ - if (use_in_front) { - object->dtx |= OB_DRAW_IN_FRONT; - } - else { - if (stroke_depth_order == GP_DRAWMODE_3D) { - grease_pencil->flag |= GREASE_PENCIL_STROKE_ORDER_3D; - } - md->stroke_depth_offset = stroke_depth_offset; - } - + case GP_LRT_OBJECT: + case GP_LRT_SCENE: + case GP_LRT_COLLECTION: { + /* TODO. */ break; } } @@ -1808,29 +1690,6 @@ void OBJECT_OT_grease_pencil_add(wmOperatorType *ot) ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; ot->prop = RNA_def_enum(ot->srna, "type", rna_enum_object_gpencil_type_items, 0, "Type", ""); - RNA_def_boolean(ot->srna, - "use_in_front", - true, - "Show In Front", - "Show line art grease pencil in front of everything"); - RNA_def_float(ot->srna, - "stroke_depth_offset", - 0.05f, - 0.0f, - FLT_MAX, - "Stroke Offset", - "Stroke offset for the line art modifier", - 0.0f, - 0.5f); - RNA_def_boolean( - ot->srna, "use_lights", false, "Use Lights", "Use lights for this grease pencil object"); - RNA_def_enum( - ot->srna, - "stroke_depth_order", - rna_enum_gpencil_add_stroke_depth_order_items, - GP_DRAWMODE_3D, - "Stroke Depth Order", - "Defines how the strokes are ordered in 3D space (for objects not displayed 'In Front')"); ED_object_add_unit_props_radius(ot); ED_object_add_generic_props(ot, false); @@ -2096,7 +1955,7 @@ static int collection_drop_exec(bContext *C, wmOperator *op) if (RNA_boolean_get(op->ptr, "use_instance")) { BKE_collection_child_remove(bmain, active_collection->collection, add_info->collection); - DEG_id_tag_update(&active_collection->collection->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&active_collection->collection->id, ID_RECALC_COPY_ON_WRITE); DEG_relations_tag_update(bmain); Object *ob = ED_object_add_type(C, @@ -2169,7 +2028,8 @@ void OBJECT_OT_collection_external_asset_drop(wmOperatorType *ot) prop = RNA_def_enum(ot->srna, "collection", rna_enum_dummy_NULL_items, 0, "Collection", ""); RNA_def_enum_funcs(prop, RNA_collection_itemf); - RNA_def_property_flag(prop, PropertyFlag(PROP_SKIP_SAVE | PROP_HIDDEN | PROP_ENUM_NO_TRANSLATE)); + RNA_def_property_flag(prop, + (PropertyFlag)(PROP_SKIP_SAVE | PROP_HIDDEN | PROP_ENUM_NO_TRANSLATE)); ot->prop = prop; } @@ -2367,7 +2227,7 @@ static int object_curves_empty_hair_add_exec(bContext *C, wmOperator *op) Object *curves_ob = ED_object_add_type( C, OB_CURVES, nullptr, nullptr, nullptr, false, local_view_bits); - BKE_object_apply_mat4(curves_ob, surface_ob->object_to_world().ptr(), false, false); + BKE_object_apply_mat4(curves_ob, surface_ob->object_to_world, false, false); /* Set surface object. */ Curves *curves_id = static_cast(curves_ob->data); @@ -2612,20 +2472,6 @@ static int object_delete_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } -static int object_delete_invoke(bContext *C, wmOperator *op, const wmEvent * /*event*/) -{ - if (RNA_boolean_get(op->ptr, "confirm")) { - return WM_operator_confirm_ex(C, - op, - IFACE_("Delete selected objects?"), - nullptr, - IFACE_("Delete"), - ALERT_ICON_NONE, - false); - } - return object_delete_exec(C, op); -} - void OBJECT_OT_delete(wmOperatorType *ot) { /* identifiers */ @@ -2634,7 +2480,7 @@ void OBJECT_OT_delete(wmOperatorType *ot) ot->idname = "OBJECT_OT_delete"; /* api callbacks */ - ot->invoke = object_delete_invoke; + ot->invoke = WM_operator_confirm_or_exec; ot->exec = object_delete_exec; ot->poll = ED_operator_objectmode; @@ -2644,7 +2490,7 @@ void OBJECT_OT_delete(wmOperatorType *ot) PropertyRNA *prop; prop = RNA_def_boolean( ot->srna, "use_global", false, "Delete Globally", "Remove object from all scenes"); - RNA_def_property_flag(prop, PropertyFlag(PROP_HIDDEN | PROP_SKIP_SAVE)); + RNA_def_property_flag(prop, (PropertyFlag)(PROP_HIDDEN | PROP_SKIP_SAVE)); WM_operator_properties_confirm_or_exec(ot); } @@ -2865,8 +2711,8 @@ static void make_object_duplilist_real(bContext *C, id_us_min((ID *)ob_dst->instance_collection); ob_dst->instance_collection = nullptr; - copy_m4_m4(ob_dst->runtime->object_to_world.ptr(), dob->mat); - BKE_object_apply_mat4(ob_dst, ob_dst->object_to_world().ptr(), false, false); + copy_m4_m4(ob_dst->object_to_world, dob->mat); + BKE_object_apply_mat4(ob_dst, ob_dst->object_to_world, false, false); BLI_ghash_insert(dupli_gh, dob, ob_dst); if (parent_gh) { @@ -2988,7 +2834,7 @@ static void make_object_duplilist_real(bContext *C, BKE_main_id_newptr_and_tag_clear(bmain); base->object->transflag &= ~OB_DUPLI; - DEG_id_tag_update(&base->object->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&base->object->id, ID_RECALC_COPY_ON_WRITE); } static int object_duplicates_make_real_exec(bContext *C, wmOperator *op) @@ -3331,7 +3177,7 @@ static int object_convert_exec(bContext *C, wmOperator *op) ushort local_view_bits = (v3d && v3d->localvd) ? v3d->local_view_uid : 0; float loc[3], size[3], rot[3][3], eul[3]; float matrix[4][4]; - mat4_to_loc_rot_size(loc, rot, size, ob->object_to_world().ptr()); + mat4_to_loc_rot_size(loc, rot, size, ob->object_to_world); mat3_to_eul(eul, rot); Object *ob_gpencil = ED_gpencil_add_object(C, loc, local_view_bits); @@ -3376,6 +3222,8 @@ static int object_convert_exec(bContext *C, wmOperator *op) { ob->flag |= OB_DONE; + bGPdata *gpd = static_cast(ob->data); + if (keep_original) { BLI_assert_unreachable(); } @@ -3383,7 +3231,16 @@ static int object_convert_exec(bContext *C, wmOperator *op) newob = ob; } - bke::greasepencil::convert::legacy_gpencil_object(*bmain, *newob); + GreasePencil *new_grease_pencil = static_cast( + BKE_id_new(bmain, ID_GP, newob->id.name + 2)); + newob->data = new_grease_pencil; + newob->type = OB_GREASE_PENCIL; + + bke::greasepencil::convert::legacy_gpencil_to_grease_pencil( + *bmain, *new_grease_pencil, *gpd); + + BKE_object_free_derived_caches(newob); + BKE_object_free_modifiers(newob, 0); } else if (target == OB_CURVES) { ob->flag |= OB_DONE; @@ -4138,7 +3995,7 @@ static int duplicate_exec(bContext *C, wmOperator *op) ED_outliner_select_sync_from_object_tag(C); DEG_relations_tag_update(bmain); - DEG_id_tag_update(&scene->id, ID_RECALC_SYNC_TO_EVAL | ID_RECALC_SELECT); + DEG_id_tag_update(&scene->id, ID_RECALC_COPY_ON_WRITE | ID_RECALC_SELECT); WM_event_add_notifier(C, NC_SCENE | ND_OB_SELECT, scene); WM_event_add_notifier(C, NC_SCENE | ND_LAYER_CONTENT, scene); @@ -4245,9 +4102,8 @@ static int object_add_named_exec(bContext *C, wmOperator *op) PropertyRNA *prop_matrix = RNA_struct_find_property(op->ptr, "matrix"); if (RNA_property_is_set(op->ptr, prop_matrix)) { Object *ob_add = basen->object; - RNA_property_float_get_array( - op->ptr, prop_matrix, ob_add->runtime->object_to_world.base_ptr()); - BKE_object_apply_mat4(ob_add, ob_add->object_to_world().ptr(), true, true); + RNA_property_float_get_array(op->ptr, prop_matrix, &ob_add->object_to_world[0][0]); + BKE_object_apply_mat4(ob_add, ob_add->object_to_world, true, true); DEG_id_tag_update(&ob_add->id, ID_RECALC_TRANSFORM); } @@ -4288,7 +4144,7 @@ void OBJECT_OT_add_named(wmOperatorType *ot) prop = RNA_def_float_matrix( ot->srna, "matrix", 4, 4, nullptr, 0.0f, 0.0f, "Matrix", "", 0.0f, 0.0f); - RNA_def_property_flag(prop, PropertyFlag(PROP_HIDDEN | PROP_SKIP_SAVE)); + RNA_def_property_flag(prop, (PropertyFlag)(PROP_HIDDEN | PROP_SKIP_SAVE)); object_add_drop_xy_props(ot); } @@ -4343,7 +4199,7 @@ static int object_transform_to_mouse_exec(bContext *C, wmOperator *op) float mat_dst_unit[4][4]; float final_delta[4][4]; - normalize_m4_m4(mat_src_unit, ob->object_to_world().ptr()); + normalize_m4_m4(mat_src_unit, ob->object_to_world); normalize_m4_m4(mat_dst_unit, matrix); invert_m4(mat_src_unit); mul_m4_m4m4(final_delta, mat_dst_unit, mat_src_unit); @@ -4395,7 +4251,7 @@ void OBJECT_OT_transform_to_mouse(wmOperatorType *ot) MAX_ID_NAME - 2, "Name", "Object name to place (uses the active object when this and 'session_uid' are unset)"); - RNA_def_property_flag(prop, PropertyFlag(PROP_SKIP_SAVE | PROP_HIDDEN)); + RNA_def_property_flag(prop, (PropertyFlag)(PROP_SKIP_SAVE | PROP_HIDDEN)); prop = RNA_def_int(ot->srna, "session_uid", 0, @@ -4406,11 +4262,11 @@ void OBJECT_OT_transform_to_mouse(wmOperatorType *ot) "'name' are unset)", INT32_MIN, INT32_MAX); - RNA_def_property_flag(prop, PropertyFlag(PROP_SKIP_SAVE | PROP_HIDDEN)); + RNA_def_property_flag(prop, (PropertyFlag)(PROP_SKIP_SAVE | PROP_HIDDEN)); prop = RNA_def_float_matrix( ot->srna, "matrix", 4, 4, nullptr, 0.0f, 0.0f, "Matrix", "", 0.0f, 0.0f); - RNA_def_property_flag(prop, PropertyFlag(PROP_HIDDEN | PROP_SKIP_SAVE)); + RNA_def_property_flag(prop, (PropertyFlag)(PROP_HIDDEN | PROP_SKIP_SAVE)); object_add_drop_xy_props(ot); } @@ -4497,7 +4353,7 @@ static int object_join_exec(bContext *C, wmOperator *op) * If the zero scale is removed, the data on this axis remains un-scaled * (something that wouldn't work for #invert_m4_m4_safe). */ float imat_test[4][4]; - if (!invert_m4_m4(imat_test, ob->object_to_world().ptr())) { + if (!invert_m4_m4(imat_test, ob->object_to_world)) { BKE_report(op->reports, RPT_WARNING, "Active object final transform has one or more zero scaled axes"); diff --git a/source/blender/editors/object/object_bake.cc b/source/blender/editors/object/object_bake.cc index 4a991b889aa..0799caff487 100644 --- a/source/blender/editors/object/object_bake.cc +++ b/source/blender/editors/object/object_bake.cc @@ -10,28 +10,38 @@ #include "MEM_guardedalloc.h" +#include "DNA_material_types.h" #include "DNA_mesh_types.h" #include "DNA_object_types.h" #include "DNA_scene_types.h" #include "DNA_screen_types.h" #include "DNA_space_types.h" +#include "DNA_world_types.h" +#include "BLI_blenlib.h" +#include "BLI_time.h" #include "BLI_utildefines.h" #include "BKE_DerivedMesh.hh" #include "BKE_attribute.hh" +#include "BKE_blender.h" #include "BKE_cdderivedmesh.h" #include "BKE_context.hh" #include "BKE_customdata.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_image.h" +#include "BKE_material.h" +#include "BKE_mesh.hh" #include "BKE_modifier.hh" #include "BKE_multires.hh" -#include "BKE_report.hh" -#include "BKE_scene.hh" +#include "BKE_report.h" +#include "BKE_scene.h" + +#include "DEG_depsgraph.hh" #include "RE_multires_bake.h" #include "RE_pipeline.h" +#include "RE_texture.h" #include "IMB_imbuf.hh" #include "IMB_imbuf_types.hh" @@ -39,6 +49,7 @@ #include "WM_api.hh" #include "WM_types.hh" +#include "ED_object.hh" #include "ED_screen.hh" #include "ED_uvedit.hh" diff --git a/source/blender/editors/object/object_bake_api.cc b/source/blender/editors/object/object_bake_api.cc index 074d92a4a3d..0b7e1727244 100644 --- a/source/blender/editors/object/object_bake_api.cc +++ b/source/blender/editors/object/object_bake_api.cc @@ -24,10 +24,10 @@ #include "BLI_string.h" #include "BKE_attribute.hh" -#include "BKE_callbacks.hh" +#include "BKE_callbacks.h" #include "BKE_context.hh" #include "BKE_editmesh.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_image.h" #include "BKE_image_format.h" #include "BKE_layer.hh" @@ -35,11 +35,12 @@ #include "BKE_main.hh" #include "BKE_material.h" #include "BKE_mesh.hh" +#include "BKE_mesh_mapping.hh" #include "BKE_modifier.hh" #include "BKE_node.hh" #include "BKE_object.hh" -#include "BKE_report.hh" -#include "BKE_scene.hh" +#include "BKE_report.h" +#include "BKE_scene.h" #include "BKE_screen.hh" #include "DEG_depsgraph.hh" @@ -1053,7 +1054,7 @@ static int find_original_loop(const blender::OffsetIndices orig_faces, static void bake_targets_populate_pixels_color_attributes(BakeTargets *targets, Object *ob, - Mesh *mesh_eval, + Mesh *me_eval, BakePixel *pixel_array) { Mesh *mesh = static_cast(ob->data); @@ -1075,22 +1076,20 @@ static void bake_targets_populate_pixels_color_attributes(BakeTargets *targets, } /* Populate through adjacent triangles, first triangle wins. */ - const int corner_tris_num = poly_to_tri_count(mesh_eval->faces_num, mesh_eval->corners_num); + const int corner_tris_num = poly_to_tri_count(me_eval->faces_num, me_eval->corners_num); blender::int3 *corner_tris = static_cast( MEM_mallocN(sizeof(*corner_tris) * corner_tris_num, __func__)); - const blender::Span corner_verts = mesh_eval->corner_verts(); - blender::bke::mesh::corner_tris_calc(mesh_eval->vert_positions(), - mesh_eval->faces(), - corner_verts, - {corner_tris, corner_tris_num}); - const blender::Span tri_faces = mesh_eval->corner_tri_faces(); + const blender::Span corner_verts = me_eval->corner_verts(); + blender::bke::mesh::corner_tris_calc( + me_eval->vert_positions(), me_eval->faces(), corner_verts, {corner_tris, corner_tris_num}); + const blender::Span tri_faces = me_eval->corner_tri_faces(); /* For mapping back to original mesh in case there are modifiers. */ const int *vert_origindex = static_cast( - CustomData_get_layer(&mesh_eval->vert_data, CD_ORIGINDEX)); + CustomData_get_layer(&me_eval->vert_data, CD_ORIGINDEX)); const int *poly_origindex = static_cast( - CustomData_get_layer(&mesh_eval->face_data, CD_ORIGINDEX)); + CustomData_get_layer(&me_eval->face_data, CD_ORIGINDEX)); const blender::OffsetIndices orig_faces = mesh->faces(); const blender::Span orig_corner_verts = mesh->corner_verts(); @@ -1346,14 +1345,14 @@ static bool bake_targets_init(const BakeAPIRender *bkr, static void bake_targets_populate_pixels(const BakeAPIRender *bkr, BakeTargets *targets, Object *ob, - Mesh *mesh_eval, + Mesh *me_eval, BakePixel *pixel_array) { if (bkr->target == R_BAKE_TARGET_VERTEX_COLORS) { - bake_targets_populate_pixels_color_attributes(targets, ob, mesh_eval, pixel_array); + bake_targets_populate_pixels_color_attributes(targets, ob, me_eval, pixel_array); } else { - RE_bake_pixels_populate(mesh_eval, pixel_array, targets->pixels_num, targets, bkr->uv_layer); + RE_bake_pixels_populate(me_eval, pixel_array, targets->pixels_num, targets, bkr->uv_layer); } } @@ -1361,17 +1360,17 @@ static bool bake_targets_output(const BakeAPIRender *bkr, BakeTargets *targets, Object *ob, Object *ob_eval, - Mesh *mesh_eval, + Mesh *me_eval, BakePixel *pixel_array, ReportList *reports) { if (bkr->target == R_BAKE_TARGET_IMAGE_TEXTURES) { if (bkr->save_mode == R_BAKE_SAVE_INTERNAL) { - return bake_targets_output_internal(bkr, targets, ob, pixel_array, reports, mesh_eval); + return bake_targets_output_internal(bkr, targets, ob, pixel_array, reports, me_eval); } if (bkr->save_mode == R_BAKE_SAVE_EXTERNAL) { return bake_targets_output_external( - bkr, targets, ob, ob_eval, mesh_eval, pixel_array, reports); + bkr, targets, ob, ob_eval, me_eval, pixel_array, reports); } } else if (bkr->target == R_BAKE_TARGET_VERTEX_COLORS) { @@ -1580,10 +1579,10 @@ static int bake(const BakeAPIRender *bkr, highpoly[i].mesh = BKE_mesh_new_from_object(nullptr, highpoly[i].ob_eval, false, false); /* Low-poly to high-poly transformation matrix. */ - copy_m4_m4(highpoly[i].obmat, highpoly[i].ob->object_to_world().ptr()); + copy_m4_m4(highpoly[i].obmat, highpoly[i].ob->object_to_world); invert_m4_m4(highpoly[i].imat, highpoly[i].obmat); - highpoly[i].is_flip_object = is_negative_m4(highpoly[i].ob->object_to_world().ptr()); + highpoly[i].is_flip_object = is_negative_m4(highpoly[i].ob->object_to_world); i++; } @@ -1612,8 +1611,8 @@ static int bake(const BakeAPIRender *bkr, ob_cage != nullptr, bkr->cage_extrusion, bkr->max_ray_distance, - ob_low_eval->object_to_world().ptr(), - (ob_cage ? ob_cage->object_to_world().ptr() : ob_low_eval->object_to_world().ptr()), + ob_low_eval->object_to_world, + (ob_cage ? ob_cage->object_to_world : ob_low_eval->object_to_world), me_cage_eval)) { BKE_report(reports, RPT_ERROR, "Error handling selected objects"); @@ -1694,7 +1693,7 @@ static int bake(const BakeAPIRender *bkr, targets.result, me_low_eval, bkr->normal_swizzle, - ob_low_eval->object_to_world().ptr()); + ob_low_eval->object_to_world); } else { /* From multi-resolution. */ @@ -1720,7 +1719,7 @@ static int bake(const BakeAPIRender *bkr, targets.result, (me_nores) ? me_nores : me_low_eval, bkr->normal_swizzle, - ob_low_eval->object_to_world().ptr()); + ob_low_eval->object_to_world); if (md) { BKE_id_free(nullptr, &me_nores->id); diff --git a/source/blender/editors/object/object_bake_simulation.cc b/source/blender/editors/object/object_bake_simulation.cc index a8bba5f1912..8f858555643 100644 --- a/source/blender/editors/object/object_bake_simulation.cc +++ b/source/blender/editors/object/object_bake_simulation.cc @@ -6,14 +6,16 @@ #include #include +#include "BLI_endian_defines.h" +#include "BLI_endian_switch.h" #include "BLI_fileops.hh" #include "BLI_path_util.h" #include "BLI_serialize.hh" #include "BLI_string.h" +#include "BLI_string_utils.hh" +#include "BLI_time.h" #include "BLI_vector.hh" -#include "BLT_translation.hh" - #include "WM_api.hh" #include "WM_types.hh" @@ -21,23 +23,36 @@ #include "ED_screen.hh" #include "DNA_array_utils.hh" +#include "DNA_curves_types.h" +#include "DNA_material_types.h" +#include "DNA_mesh_types.h" #include "DNA_modifier_types.h" +#include "DNA_pointcloud_types.h" #include "DNA_windowmanager_types.h" #include "BKE_bake_geometry_nodes_modifier.hh" #include "BKE_context.hh" -#include "BKE_global.hh" +#include "BKE_curves.hh" +#include "BKE_global.h" +#include "BKE_instances.hh" #include "BKE_lib_id.hh" #include "BKE_main.hh" +#include "BKE_mesh.hh" #include "BKE_modifier.hh" #include "BKE_node_runtime.hh" -#include "BKE_report.hh" -#include "BKE_scene.hh" +#include "BKE_object.hh" +#include "BKE_pointcloud.hh" +#include "BKE_report.h" +#include "BKE_scene.h" + +#include "BLT_translation.h" #include "RNA_access.hh" #include "RNA_define.hh" +#include "RNA_enum_types.hh" #include "DEG_depsgraph.hh" +#include "DEG_depsgraph_build.hh" #include "MOD_nodes.hh" @@ -665,13 +680,7 @@ static int bake_simulation_invoke(bContext *C, wmOperator *op, const wmEvent * / return OPERATOR_CANCELLED; } if (has_existing_bake_data) { - return WM_operator_confirm_ex(C, - op, - IFACE_("Overwrite existing bake data?"), - nullptr, - IFACE_("Bake"), - ALERT_ICON_NONE, - false); + return WM_operator_confirm_message(C, op, "Overwrite existing bake data"); } Vector requests = bake_simulation_gather_requests(C, op); return start_bake_job(C, std::move(requests), op, BakeRequestsMode::Async); diff --git a/source/blender/editors/object/object_collection.cc b/source/blender/editors/object/object_collection.cc index f1c57fbc5eb..20f25a81eb5 100644 --- a/source/blender/editors/object/object_collection.cc +++ b/source/blender/editors/object/object_collection.cc @@ -8,19 +8,20 @@ #include +#include "BLI_blenlib.h" #include "BLI_utildefines.h" #include "DNA_collection_types.h" #include "DNA_object_types.h" #include "DNA_scene_types.h" -#include "BKE_collection.hh" +#include "BKE_collection.h" #include "BKE_context.hh" #include "BKE_layer.hh" #include "BKE_lib_id.hh" #include "BKE_main.hh" #include "BKE_object.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "DEG_depsgraph.hh" #include "DEG_depsgraph_build.hh" @@ -144,7 +145,7 @@ static int objects_add_active_exec(bContext *C, wmOperator *op) if (!BKE_collection_object_cyclic_check(bmain, base->object, collection)) { BKE_collection_object_add(bmain, collection, base->object); - DEG_id_tag_update(&collection->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&collection->id, ID_RECALC_COPY_ON_WRITE); updated = true; } else { @@ -225,7 +226,7 @@ static int objects_remove_active_exec(bContext *C, wmOperator *op) /* Remove collections from selected objects */ CTX_DATA_BEGIN (C, Base *, base, selected_editable_bases) { BKE_collection_object_remove(bmain, collection, base->object, false); - DEG_id_tag_update(&collection->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&collection->id, ID_RECALC_COPY_ON_WRITE); ok = true; } CTX_DATA_END; @@ -328,7 +329,7 @@ static int collection_objects_remove_exec(bContext *C, wmOperator *op) /* now remove all selected objects from the collection */ CTX_DATA_BEGIN (C, Base *, base, selected_editable_bases) { BKE_collection_object_remove(bmain, collection, base->object, false); - DEG_id_tag_update(&collection->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&collection->id, ID_RECALC_COPY_ON_WRITE); updated = true; } CTX_DATA_END; @@ -386,7 +387,7 @@ static int collection_create_exec(bContext *C, wmOperator *op) CTX_DATA_BEGIN (C, Base *, base, selected_bases) { BKE_collection_object_add(bmain, collection, base->object); - DEG_id_tag_update(&collection->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&collection->id, ID_RECALC_COPY_ON_WRITE); } CTX_DATA_END; @@ -429,7 +430,7 @@ static int collection_add_exec(bContext *C, wmOperator * /*op*/) id_fake_user_set(&collection->id); BKE_collection_object_add(bmain, collection, ob); - DEG_id_tag_update(&collection->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&collection->id, ID_RECALC_COPY_ON_WRITE); DEG_relations_tag_update(bmain); WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, ob); @@ -497,7 +498,7 @@ static int collection_link_exec(bContext *C, wmOperator *op) BKE_collection_object_add(bmain, collection, ob); - DEG_id_tag_update(&collection->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&collection->id, ID_RECALC_COPY_ON_WRITE); DEG_relations_tag_update(bmain); WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, ob); @@ -548,7 +549,7 @@ static int collection_remove_exec(bContext *C, wmOperator *op) BKE_collection_object_remove(bmain, collection, ob, false); - DEG_id_tag_update(&collection->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&collection->id, ID_RECALC_COPY_ON_WRITE); DEG_relations_tag_update(bmain); WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, ob); diff --git a/source/blender/editors/object/object_constraint.cc b/source/blender/editors/object/object_constraint.cc index 8d70d30bca4..9be32e10d69 100644 --- a/source/blender/editors/object/object_constraint.cc +++ b/source/blender/editors/object/object_constraint.cc @@ -17,7 +17,7 @@ #include "BLI_math_vector.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_anim_types.h" #include "DNA_armature_types.h" @@ -32,11 +32,11 @@ #include "BKE_armature.hh" #include "BKE_constraint.h" #include "BKE_context.hh" -#include "BKE_fcurve.hh" +#include "BKE_fcurve.h" #include "BKE_layer.hh" #include "BKE_main.hh" #include "BKE_object.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "BKE_tracking.h" #include "DEG_depsgraph.hh" @@ -56,6 +56,7 @@ #include "RNA_path.hh" #include "RNA_prototypes.h" +#include "ED_keyframing.hh" #include "ED_object.hh" #include "ED_screen.hh" @@ -1362,7 +1363,7 @@ void ED_object_constraint_tag_update(Main *bmain, Object *ob, bConstraint *con) /* Do Copy-on-Write tag here too, otherwise constraint * influence/mute buttons in UI have no effect */ - DEG_id_tag_update(&ob->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&ob->id, ID_RECALC_COPY_ON_WRITE); } void ED_object_constraint_dependency_tag_update(Main *bmain, Object *ob, bConstraint *con) @@ -2324,14 +2325,14 @@ static bool get_new_constraint_target( /* Since by default, IK targets the tip of the last bone, * use the tip of the active PoseChannel if adding a target for an IK Constraint. */ if (con_type == CONSTRAINT_TYPE_KINEMATIC) { - mul_v3_m4v3(obt->loc, obact->object_to_world().ptr(), pchanact->pose_tail); + mul_v3_m4v3(obt->loc, obact->object_to_world, pchanact->pose_tail); } else { - mul_v3_m4v3(obt->loc, obact->object_to_world().ptr(), pchanact->pose_head); + mul_v3_m4v3(obt->loc, obact->object_to_world, pchanact->pose_head); } } else { - copy_v3_v3(obt->loc, obact->object_to_world().location()); + copy_v3_v3(obt->loc, obact->object_to_world[3]); } /* restore, BKE_object_add sets active */ diff --git a/source/blender/editors/object/object_data_transfer.cc b/source/blender/editors/object/object_data_transfer.cc index 3234d64516d..50e1cfcf131 100644 --- a/source/blender/editors/object/object_data_transfer.cc +++ b/source/blender/editors/object/object_data_transfer.cc @@ -9,7 +9,9 @@ #include "DNA_mesh_types.h" #include "DNA_modifier_types.h" #include "DNA_object_types.h" +#include "DNA_scene_types.h" +#include "BLI_blenlib.h" #include "BLI_math_matrix.h" #include "BLI_string.h" #include "BLI_utildefines.h" @@ -20,13 +22,14 @@ #include "BKE_deform.hh" #include "BKE_mesh_mapping.hh" #include "BKE_mesh_remap.hh" +#include "BKE_mesh_runtime.hh" #include "BKE_object.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "DEG_depsgraph.hh" #include "DEG_depsgraph_query.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "RNA_access.hh" #include "RNA_define.hh" @@ -180,28 +183,28 @@ static const EnumPropertyItem *dt_layers_select_src_itemf(bContext *C, else if (data_type == DT_TYPE_UV) { const Depsgraph *depsgraph = CTX_data_ensure_evaluated_depsgraph(C); const Object *ob_src_eval = DEG_get_evaluated_object(depsgraph, ob_src); - const Mesh *mesh_eval = BKE_object_get_evaluated_mesh_no_subsurf(ob_src_eval); - if (!mesh_eval) { + const Mesh *me_eval = BKE_object_get_evaluated_mesh_no_subsurf(ob_src_eval); + if (!me_eval) { RNA_enum_item_end(&item, &totitem); *r_free = true; return item; } - int num_data = CustomData_number_of_layers(&mesh_eval->corner_data, CD_PROP_FLOAT2); + int num_data = CustomData_number_of_layers(&me_eval->corner_data, CD_PROP_FLOAT2); RNA_enum_item_add_separator(&item, &totitem); for (int i = 0; i < num_data; i++) { tmp_item.value = i; tmp_item.identifier = tmp_item.name = CustomData_get_layer_name( - &mesh_eval->corner_data, CD_PROP_FLOAT2, i); + &me_eval->corner_data, CD_PROP_FLOAT2, i); RNA_enum_item_add(&item, &totitem, &tmp_item); } } else if (data_type & DT_TYPE_VCOL_ALL) { const Depsgraph *depsgraph = CTX_data_ensure_evaluated_depsgraph(C); const Object *ob_src_eval = DEG_get_evaluated_object(depsgraph, ob_src); - const Mesh *mesh_eval = BKE_object_get_evaluated_mesh_no_subsurf(ob_src_eval); - if (!mesh_eval) { + const Mesh *me_eval = BKE_object_get_evaluated_mesh_no_subsurf(ob_src_eval); + if (!me_eval) { RNA_enum_item_end(&item, &totitem); *r_free = true; return item; @@ -223,10 +226,10 @@ static const EnumPropertyItem *dt_layers_select_src_itemf(bContext *C, } if (data_type & (DT_TYPE_MLOOPCOL_VERT | DT_TYPE_MPROPCOL_VERT)) { - dt_add_vcol_layers(&mesh_eval->vert_data, cddata_masks.vmask, &item, &totitem); + dt_add_vcol_layers(&me_eval->vert_data, cddata_masks.vmask, &item, &totitem); } if (data_type & (DT_TYPE_MLOOPCOL_LOOP | DT_TYPE_MPROPCOL_LOOP)) { - dt_add_vcol_layers(&mesh_eval->corner_data, cddata_masks.lmask, &item, &totitem); + dt_add_vcol_layers(&me_eval->corner_data, cddata_masks.lmask, &item, &totitem); } } diff --git a/source/blender/editors/object/object_data_transform.cc b/source/blender/editors/object/object_data_transform.cc index 57c94d736f5..0859871a54f 100644 --- a/source/blender/editors/object/object_data_transform.cc +++ b/source/blender/editors/object/object_data_transform.cc @@ -15,12 +15,15 @@ #include #include +#include "DNA_anim_types.h" #include "DNA_armature_types.h" +#include "DNA_collection_types.h" #include "DNA_gpencil_legacy_types.h" #include "DNA_lattice_types.h" #include "DNA_mesh_types.h" #include "DNA_meta_types.h" #include "DNA_object_types.h" +#include "DNA_scene_types.h" #include "BLI_listbase.h" #include "BLI_math_matrix.h" @@ -35,10 +38,15 @@ #include "BKE_key.hh" #include "BKE_lattice.hh" #include "BKE_mball.hh" +#include "BKE_mesh.hh" +#include "BKE_scene.h" #include "bmesh.hh" #include "DEG_depsgraph.hh" +#include "DEG_depsgraph_query.hh" + +#include "WM_types.hh" #include "ED_armature.hh" #include "ED_mesh.hh" @@ -779,13 +787,13 @@ void ED_object_data_xform_tag_update(XFormObjectData *xod_base) case ID_MB: { /* Generic update. */ MetaBall *mb = (MetaBall *)xod_base->id; - DEG_id_tag_update(&mb->id, ID_RECALC_GEOMETRY | ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&mb->id, ID_RECALC_GEOMETRY | ID_RECALC_COPY_ON_WRITE); break; } case ID_GD_LEGACY: { /* Generic update. */ bGPdata *gpd = (bGPdata *)xod_base->id; - DEG_id_tag_update(&gpd->id, ID_RECALC_GEOMETRY | ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&gpd->id, ID_RECALC_GEOMETRY | ID_RECALC_COPY_ON_WRITE); break; } diff --git a/source/blender/editors/object/object_edit.cc b/source/blender/editors/object/object_edit.cc index 4b45e205dc5..12b138bf505 100644 --- a/source/blender/editors/object/object_edit.cc +++ b/source/blender/editors/object/object_edit.cc @@ -21,7 +21,7 @@ #include "BLI_math_rotation.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_armature_types.h" #include "DNA_collection_types.h" @@ -41,14 +41,14 @@ #include "BKE_anim_visualization.h" #include "BKE_armature.hh" -#include "BKE_collection.hh" +#include "BKE_collection.h" #include "BKE_constraint.h" #include "BKE_context.hh" #include "BKE_curve.hh" #include "BKE_editlattice.h" #include "BKE_editmesh.hh" #include "BKE_effect.h" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_image.h" #include "BKE_lattice.hh" #include "BKE_layer.hh" @@ -62,8 +62,8 @@ #include "BKE_paint.hh" #include "BKE_particle.h" #include "BKE_pointcache.h" -#include "BKE_report.hh" -#include "BKE_scene.hh" +#include "BKE_report.h" +#include "BKE_scene.h" #include "BKE_softbody.h" #include "BKE_workspace.h" @@ -1263,13 +1263,13 @@ void ED_objects_recalculate_paths(bContext *C, BLI_freelistN(&targets); if (range != OBJECT_PATH_CALC_RANGE_CURRENT_FRAME) { - /* Tag objects for copy-on-eval - so paths will draw/redraw + /* Tag objects for copy on write - so paths will draw/redraw * For currently frame only we update evaluated object directly. */ LISTBASE_FOREACH (LinkData *, link, ld_objects) { Object *ob = static_cast(link->data); if (has_object_motion_paths(ob) || has_pose_motion_paths(ob)) { - DEG_id_tag_update(&ob->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&ob->id, ID_RECALC_COPY_ON_WRITE); } } } @@ -1298,8 +1298,7 @@ static int object_calculate_paths_invoke(bContext *C, wmOperator *op, const wmEv /* show popup dialog to allow editing of range... */ /* FIXME: hard-coded dimensions here are just arbitrary. */ - return WM_operator_props_dialog_popup( - C, op, 270, IFACE_("Calculate Object Motion Paths"), IFACE_("Calculate")); + return WM_operator_props_dialog_popup(C, op, 270); } /* Calculate/recalculate whole paths (avs.path_sf to avs.path_ef) */ @@ -1476,8 +1475,8 @@ static void object_clear_mpath(Object *ob) ob->mpath = nullptr; ob->avs.path_bakeflag &= ~MOTIONPATH_BAKE_HAS_PATHS; - /* tag object for copy-on-eval - so removed paths don't still show */ - DEG_id_tag_update(&ob->id, ID_RECALC_SYNC_TO_EVAL); + /* tag object for copy on write - so removed paths don't still show */ + DEG_id_tag_update(&ob->id, ID_RECALC_COPY_ON_WRITE); } } @@ -1862,13 +1861,6 @@ static int object_mode_set_exec(bContext *C, wmOperator *op) } } - wmWindowManager *wm = CTX_wm_manager(C); - if (wm) { - if (WM_autosave_is_scheduled(wm)) { - WM_autosave_write(wm, CTX_data_main(C)); - } - } - return OPERATOR_FINISHED; } @@ -2034,7 +2026,7 @@ static int move_to_collection_exec(bContext *C, wmOperator *op) } DEG_relations_tag_update(bmain); - DEG_id_tag_update(&scene->id, ID_RECALC_SYNC_TO_EVAL | ID_RECALC_SELECT); + DEG_id_tag_update(&scene->id, ID_RECALC_COPY_ON_WRITE | ID_RECALC_SELECT); WM_event_add_notifier(C, NC_SCENE | ND_LAYER, scene); WM_event_add_notifier(C, NC_SCENE | ND_OB_ACTIVE, scene); @@ -2166,8 +2158,7 @@ static int move_to_collection_invoke(bContext *C, wmOperator *op, const wmEvent BKE_collection_new_name_get(collection, name); RNA_property_string_set(op->ptr, prop, name); - return WM_operator_props_dialog_popup( - C, op, 200, IFACE_("Move to New Collection"), IFACE_("Create")); + return WM_operator_props_dialog_popup(C, op, 200); } } return move_to_collection_exec(C, op); diff --git a/source/blender/editors/object/object_gpencil_modifier.cc b/source/blender/editors/object/object_gpencil_modifier.cc index cdc610c5b73..efa37cfff2a 100644 --- a/source/blender/editors/object/object_gpencil_modifier.cc +++ b/source/blender/editors/object/object_gpencil_modifier.cc @@ -26,13 +26,16 @@ #include "BLI_utildefines.h" #include "BKE_context.hh" +#include "BKE_gpencil_legacy.h" #include "BKE_gpencil_modifier_legacy.h" #include "BKE_lib_id.hh" +#include "BKE_main.hh" #include "BKE_object.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "DEG_depsgraph.hh" #include "DEG_depsgraph_build.hh" +#include "DEG_depsgraph_query.hh" #include "RNA_access.hh" #include "RNA_define.hh" @@ -42,7 +45,7 @@ #include "ED_object.hh" #include "ED_screen.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "UI_interface.hh" @@ -987,7 +990,7 @@ static int time_segment_add_exec(bContext *C, wmOperator *op) gpmd->segments_len++; gpmd->segment_active_index++; - DEG_id_tag_update(&ob->id, ID_RECALC_GEOMETRY | ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&ob->id, ID_RECALC_GEOMETRY | ID_RECALC_COPY_ON_WRITE); WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, ob); return OPERATOR_FINISHED; @@ -1058,7 +1061,7 @@ static int time_segment_remove_exec(bContext *C, wmOperator *op) gpmd->segments_len--; - DEG_id_tag_update(&ob->id, ID_RECALC_GEOMETRY | ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&ob->id, ID_RECALC_GEOMETRY | ID_RECALC_COPY_ON_WRITE); WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, ob); return OPERATOR_FINISHED; @@ -1136,7 +1139,7 @@ static int time_segment_move_exec(bContext *C, wmOperator *op) return OPERATOR_CANCELLED; } - DEG_id_tag_update(&ob->id, ID_RECALC_GEOMETRY | ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&ob->id, ID_RECALC_GEOMETRY | ID_RECALC_COPY_ON_WRITE); WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, ob); return OPERATOR_FINISHED; @@ -1228,7 +1231,7 @@ static int dash_segment_add_exec(bContext *C, wmOperator *op) dmd->segments_len++; dmd->segment_active_index++; - DEG_id_tag_update(&ob->id, ID_RECALC_GEOMETRY | ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&ob->id, ID_RECALC_GEOMETRY | ID_RECALC_COPY_ON_WRITE); WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, ob); return OPERATOR_FINISHED; @@ -1300,7 +1303,7 @@ static int dash_segment_remove_exec(bContext *C, wmOperator *op) dmd->segments_len--; - DEG_id_tag_update(&ob->id, ID_RECALC_GEOMETRY | ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&ob->id, ID_RECALC_GEOMETRY | ID_RECALC_COPY_ON_WRITE); WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, ob); return OPERATOR_FINISHED; @@ -1379,7 +1382,7 @@ static int dash_segment_move_exec(bContext *C, wmOperator *op) return OPERATOR_CANCELLED; } - DEG_id_tag_update(&ob->id, ID_RECALC_GEOMETRY | ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&ob->id, ID_RECALC_GEOMETRY | ID_RECALC_COPY_ON_WRITE); WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, ob); return OPERATOR_FINISHED; diff --git a/source/blender/editors/object/object_hook.cc b/source/blender/editors/object/object_hook.cc index 6a13c3f77d9..13e40fd403e 100644 --- a/source/blender/editors/object/object_hook.cc +++ b/source/blender/editors/object/object_hook.cc @@ -21,6 +21,7 @@ #include "DNA_curve_types.h" #include "DNA_lattice_types.h" #include "DNA_mesh_types.h" +#include "DNA_meshdata_types.h" #include "DNA_object_types.h" #include "DNA_scene_types.h" @@ -29,9 +30,11 @@ #include "BKE_deform.hh" #include "BKE_editmesh.hh" #include "BKE_layer.hh" +#include "BKE_main.hh" #include "BKE_modifier.hh" #include "BKE_object.hh" -#include "BKE_report.hh" +#include "BKE_report.h" +#include "BKE_scene.h" #include "DEG_depsgraph.hh" #include "DEG_depsgraph_build.hh" @@ -535,7 +538,7 @@ static int add_hook_object(const bContext *C, ob = add_hook_object_new(bmain, scene, view_layer, v3d, obedit); /* transform cent to global coords for loc */ - mul_v3_m4v3(ob->loc, obedit->object_to_world().ptr(), cent); + mul_v3_m4v3(ob->loc, obedit->object_to_world, cent); } md = static_cast(obedit->modifiers.first); @@ -558,13 +561,13 @@ static int add_hook_object(const bContext *C, unit_m4(pose_mat); - invert_m4_m4(obedit->runtime->world_to_object.ptr(), obedit->object_to_world().ptr()); + invert_m4_m4(obedit->world_to_object, obedit->object_to_world); if (mode == OBJECT_ADDHOOK_NEWOB) { /* pass */ } else { /* may overwrite with pose-bone location, below */ - mul_v3_m4v3(cent, obedit->world_to_object().ptr(), ob->object_to_world().location()); + mul_v3_m4v3(cent, obedit->world_to_object, ob->object_to_world[3]); } if (mode == OBJECT_ADDHOOK_SELOB_BONE) { @@ -578,8 +581,8 @@ static int add_hook_object(const bContext *C, pchan_act = BKE_pose_channel_active_if_bonecoll_visible(ob); if (LIKELY(pchan_act)) { invert_m4_m4(pose_mat, pchan_act->pose_mat); - mul_v3_m4v3(cent, ob->object_to_world().ptr(), pchan_act->pose_mat[3]); - mul_v3_m4v3(cent, obedit->world_to_object().ptr(), cent); + mul_v3_m4v3(cent, ob->object_to_world, pchan_act->pose_mat[3]); + mul_v3_m4v3(cent, obedit->world_to_object, cent); } } else { @@ -590,20 +593,16 @@ static int add_hook_object(const bContext *C, copy_v3_v3(hmd->cent, cent); /* matrix calculus */ - /* vert x (obmat x hook->world_to_object) x hook->object_to_world().ptr() x ob->world_to_object - */ + /* vert x (obmat x hook->world_to_object) x hook->object_to_world x ob->world_to_object */ /* (parentinv) */ Scene *scene_eval = DEG_get_evaluated_scene(depsgraph); Object *object_eval = DEG_get_evaluated_object(depsgraph, ob); BKE_object_transform_copy(object_eval, ob); BKE_object_where_is_calc(depsgraph, scene_eval, object_eval); - invert_m4_m4(object_eval->runtime->world_to_object.ptr(), object_eval->object_to_world().ptr()); + invert_m4_m4(object_eval->world_to_object, object_eval->object_to_world); /* apparently this call goes from right to left... */ - mul_m4_series(hmd->parentinv, - pose_mat, - object_eval->world_to_object().ptr(), - obedit->object_to_world().ptr()); + mul_m4_series(hmd->parentinv, pose_mat, object_eval->world_to_object, obedit->object_to_world); DEG_id_tag_update(&obedit->id, ID_RECALC_GEOMETRY); DEG_relations_tag_update(bmain); @@ -846,10 +845,10 @@ static int object_hook_recenter_exec(bContext *C, wmOperator *op) } /* recenter functionality */ - copy_m3_m4(bmat, ob->object_to_world().ptr()); + copy_m3_m4(bmat, ob->object_to_world); invert_m3_m3(imat, bmat); - sub_v3_v3v3(hmd->cent, scene->cursor.location, ob->object_to_world().location()); + sub_v3_v3v3(hmd->cent, scene->cursor.location, ob->object_to_world[3]); mul_m3_v3(imat, hmd->cent); DEG_id_tag_update(&ob->id, ID_RECALC_GEOMETRY); diff --git a/source/blender/editors/object/object_intern.h b/source/blender/editors/object/object_intern.h index 1b9f49cf7f6..1d0c62c5300 100644 --- a/source/blender/editors/object/object_intern.h +++ b/source/blender/editors/object/object_intern.h @@ -118,7 +118,7 @@ void OBJECT_OT_text_add(struct wmOperatorType *ot); void OBJECT_OT_armature_add(struct wmOperatorType *ot); void OBJECT_OT_empty_add(struct wmOperatorType *ot); void OBJECT_OT_lightprobe_add(struct wmOperatorType *ot); -void OBJECT_OT_empty_image_add(struct wmOperatorType *ot); +void OBJECT_OT_drop_named_image(struct wmOperatorType *ot); void OBJECT_OT_gpencil_add(struct wmOperatorType *ot); void OBJECT_OT_grease_pencil_add(struct wmOperatorType *ot); void OBJECT_OT_light_add(struct wmOperatorType *ot); @@ -225,12 +225,6 @@ void OBJECT_OT_laplaciandeform_bind(struct wmOperatorType *ot); void OBJECT_OT_surfacedeform_bind(struct wmOperatorType *ot); void OBJECT_OT_geometry_nodes_input_attribute_toggle(struct wmOperatorType *ot); void OBJECT_OT_geometry_node_tree_copy_assign(struct wmOperatorType *ot); -void OBJECT_OT_grease_pencil_dash_modifier_segment_add(struct wmOperatorType *ot); -void OBJECT_OT_grease_pencil_dash_modifier_segment_remove(struct wmOperatorType *ot); -void OBJECT_OT_grease_pencil_dash_modifier_segment_move(struct wmOperatorType *ot); -void OBJECT_OT_grease_pencil_time_modifier_segment_add(struct wmOperatorType *ot); -void OBJECT_OT_grease_pencil_time_modifier_segment_remove(struct wmOperatorType *ot); -void OBJECT_OT_grease_pencil_time_modifier_segment_move(struct wmOperatorType *ot); /* object_gpencil_modifiers.c */ diff --git a/source/blender/editors/object/object_light_linking_ops.cc b/source/blender/editors/object/object_light_linking_ops.cc index 5f552733de2..3dfe1588975 100644 --- a/source/blender/editors/object/object_light_linking_ops.cc +++ b/source/blender/editors/object/object_light_linking_ops.cc @@ -25,6 +25,8 @@ #include "RNA_define.hh" #include "RNA_prototypes.h" +#include "DEG_depsgraph.hh" + /* -------------------------------------------------------------------- */ /** \name Create New Light Linking Receiver/Blocker Collection Operators * \{ */ diff --git a/source/blender/editors/object/object_modes.cc b/source/blender/editors/object/object_modes.cc index 49b72b6de01..d474bab1bf6 100644 --- a/source/blender/editors/object/object_modes.cc +++ b/source/blender/editors/object/object_modes.cc @@ -9,20 +9,28 @@ * actual mode switching logic is per-object type. */ +#include "DNA_gpencil_legacy_types.h" #include "DNA_object_types.h" #include "DNA_scene_types.h" +#include "DNA_workspace_types.h" +#include "BLI_kdopbvh.h" #include "BLI_time.h" #include "BLI_utildefines.h" +#include "BLT_translation.h" + #include "BKE_context.hh" #include "BKE_gpencil_modifier_legacy.h" #include "BKE_layer.hh" +#include "BKE_main.hh" #include "BKE_modifier.hh" #include "BKE_object.hh" #include "BKE_object_types.hh" #include "BKE_paint.hh" -#include "BKE_report.hh" +#include "BKE_report.h" +#include "BKE_scene.h" +#include "BKE_screen.hh" #include "BLI_math_vector.h" @@ -38,6 +46,8 @@ #include "ED_armature.hh" #include "ED_gpencil_legacy.hh" #include "ED_outliner.hh" +#include "ED_screen.hh" +#include "ED_transform_snap_object_context.hh" #include "ED_undo.hh" #include "ED_view3d.hh" @@ -142,7 +152,7 @@ bool ED_object_mode_compat_test(const Object *ob, eObjectMode mode) } break; case OB_GREASE_PENCIL: - if (mode & (OB_MODE_EDIT | OB_MODE_PAINT_GREASE_PENCIL | OB_MODE_WEIGHT_PAINT)) { + if (mode & (OB_MODE_EDIT | OB_MODE_PAINT_GREASE_PENCIL)) { return true; } break; @@ -301,7 +311,7 @@ static bool ed_object_mode_generic_exit_ex( } else if (ob->mode & OB_MODE_PAINT_GREASE_PENCIL) { ob->mode &= ~OB_MODE_PAINT_GREASE_PENCIL; - DEG_id_tag_update(&ob->id, ID_RECALC_GEOMETRY | ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&ob->id, ID_RECALC_GEOMETRY | ID_RECALC_COPY_ON_WRITE); WM_main_add_notifier(NC_SCENE | ND_MODE | NS_MODE_OBJECT, nullptr); } else { @@ -433,7 +443,7 @@ static void object_overlay_mode_transfer_animation_start(bContext *C, Object *ob { Depsgraph *depsgraph = CTX_data_depsgraph_pointer(C); Object *ob_dst_eval = DEG_get_evaluated_object(depsgraph, ob_dst); - ob_dst_eval->runtime->overlay_mode_transfer_start_time = BLI_time_now_seconds(); + ob_dst_eval->runtime->overlay_mode_transfer_start_time = BLI_check_seconds_timer(); } static bool object_transfer_mode_to_base(bContext *C, wmOperator *op, Base *base_dst) diff --git a/source/blender/editors/object/object_modifier.cc b/source/blender/editors/object/object_modifier.cc index 911a82b3a11..a68325aeb2f 100644 --- a/source/blender/editors/object/object_modifier.cc +++ b/source/blender/editors/object/object_modifier.cc @@ -18,7 +18,6 @@ #include "DNA_armature_types.h" #include "DNA_array_utils.hh" #include "DNA_curve_types.h" -#include "DNA_defaults.h" #include "DNA_dynamicpaint_types.h" #include "DNA_fluid_types.h" #include "DNA_key_types.h" @@ -35,7 +34,6 @@ #include "BLI_path_util.h" #include "BLI_string.h" #include "BLI_string_utf8.h" -#include "BLI_string_utils.hh" #include "BLI_utildefines.h" #include "BKE_DerivedMesh.hh" @@ -49,7 +47,7 @@ #include "BKE_editmesh.hh" #include "BKE_effect.h" #include "BKE_geometry_set.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_gpencil_modifier_legacy.h" #include "BKE_idprop.h" #include "BKE_key.hh" @@ -71,18 +69,16 @@ #include "BKE_paint.hh" #include "BKE_particle.h" #include "BKE_pointcloud.hh" -#include "BKE_report.hh" -#include "BKE_scene.hh" +#include "BKE_report.h" +#include "BKE_scene.h" #include "BKE_softbody.h" #include "BKE_volume.hh" -#include "BLT_translation.hh" - #include "DEG_depsgraph.hh" #include "DEG_depsgraph_build.hh" #include "DEG_depsgraph_query.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "RNA_access.hh" #include "RNA_define.hh" @@ -121,8 +117,8 @@ static void object_force_modifier_update_for_bind(Depsgraph *depsgraph, Object * Object *ob_eval = DEG_get_evaluated_object(depsgraph, ob); BKE_object_eval_reset(ob_eval); if (ob->type == OB_MESH) { - Mesh *mesh_eval = mesh_create_eval_final(depsgraph, scene_eval, ob_eval, &CD_MASK_DERIVEDMESH); - BKE_mesh_eval_delete(mesh_eval); + Mesh *me_eval = mesh_create_eval_final(depsgraph, scene_eval, ob_eval, &CD_MASK_DERIVEDMESH); + BKE_mesh_eval_delete(me_eval); } else if (ob->type == OB_LATTICE) { BKE_lattice_modifiers_calc(depsgraph, scene_eval, ob_eval); @@ -744,8 +740,8 @@ static void add_shapekey_layers(Mesh &mesh_dest, const Mesh &mesh_src) memcpy(array, kb->data, sizeof(float[3]) * size_t(mesh_src.verts_num)); } - CustomData_add_layer_with_data( - &mesh_dest.vert_data, CD_SHAPEKEY, array, mesh_dest.verts_num, nullptr); + CustomData_add_layer_named_with_data( + &mesh_dest.vert_data, CD_SHAPEKEY, array, mesh_dest.verts_num, kb->name, nullptr); const int ci = CustomData_get_layer_index_n(&mesh_dest.vert_data, CD_SHAPEKEY, i); mesh_dest.vert_data.layers[ci].uid = kb->uid; @@ -1814,14 +1810,8 @@ static int modifier_apply_invoke(bContext *C, wmOperator *op, const wmEvent *eve RNA_property_boolean_set(op->ptr, prop, true); } if (RNA_property_boolean_get(op->ptr, prop)) { - return WM_operator_confirm_ex( - C, - op, - IFACE_("Apply Modifier"), - IFACE_("Make data single-user, apply modifier, and remove it from the list."), - IFACE_("Apply"), - ALERT_ICON_WARNING, - false); + return WM_operator_confirm_message( + C, op, "Make object data single-user and apply modifier"); } } return modifier_apply_exec(C, op); @@ -3360,7 +3350,7 @@ static void oceanbake_endjob(void *customdata) oj->omd->cached = true; Object *ob = oj->owner; - DEG_id_tag_update(&ob->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&ob->id, ID_RECALC_COPY_ON_WRITE); } static int ocean_bake_exec(bContext *C, wmOperator *op) @@ -3738,499 +3728,3 @@ void OBJECT_OT_geometry_node_tree_copy_assign(wmOperatorType *ot) } /** \} */ - -/* ------------------------------------------------------------------- */ -/** \name Dash Modifier - * \{ */ - -namespace blender::ed::greasepencil { - -static bool dash_modifier_segment_poll(bContext *C) -{ - return edit_modifier_poll_generic(C, &RNA_GreasePencilDashModifierData, 0, false, false); -} - -static int dash_modifier_segment_add_exec(bContext *C, wmOperator *op) -{ - Object *ob = ED_object_active_context(C); - auto *dmd = reinterpret_cast( - edit_modifier_property_get(op, ob, eModifierType_GreasePencilDash)); - - if (dmd == nullptr) { - return OPERATOR_CANCELLED; - } - - GreasePencilDashModifierSegment *new_segments = static_cast( - MEM_malloc_arrayN(dmd->segments_num + 1, sizeof(GreasePencilDashModifierSegment), __func__)); - - const int new_active_index = std::clamp(dmd->segment_active_index + 1, 0, dmd->segments_num); - if (dmd->segments_num != 0) { - /* Copy the segments before the new segment. */ - memcpy(new_segments, - dmd->segments_array, - sizeof(GreasePencilDashModifierSegment) * new_active_index); - /* Copy the segments after the new segment. */ - memcpy(new_segments + new_active_index + 1, - dmd->segments_array + new_active_index, - sizeof(GreasePencilDashModifierSegment) * (dmd->segments_num - new_active_index)); - } - - /* Create the new segment. */ - GreasePencilDashModifierSegment *ds = &new_segments[new_active_index]; - memcpy(ds, - DNA_struct_default_get(GreasePencilDashModifierSegment), - sizeof(GreasePencilDashModifierSegment)); - BLI_uniquename_cb( - [&](const blender::StringRef name) { - for (const GreasePencilDashModifierSegment &ds : dmd->segments()) { - if (STREQ(ds.name, name.data())) { - return true; - } - } - return false; - }, - '.', - ds->name); - - MEM_SAFE_FREE(dmd->segments_array); - dmd->segments_array = new_segments; - dmd->segments_num++; - dmd->segment_active_index = new_active_index; - - DEG_id_tag_update(&ob->id, ID_RECALC_GEOMETRY | ID_RECALC_SYNC_TO_EVAL); - WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, ob); - - return OPERATOR_FINISHED; -} - -static int dash_modifier_segment_add_invoke(bContext *C, wmOperator *op, const wmEvent * /*event*/) -{ - if (edit_modifier_invoke_properties(C, op)) { - return dash_modifier_segment_add_exec(C, op); - } - return OPERATOR_CANCELLED; -} - -} // namespace blender::ed::greasepencil - -void OBJECT_OT_grease_pencil_dash_modifier_segment_add(wmOperatorType *ot) -{ - /* identifiers */ - ot->name = "Add Segment"; - ot->description = "Add a segment to the dash modifier"; - ot->idname = "OBJECT_OT_grease_pencil_dash_modifier_segment_add"; - - /* api callbacks */ - ot->poll = blender::ed::greasepencil::dash_modifier_segment_poll; - ot->invoke = blender::ed::greasepencil::dash_modifier_segment_add_invoke; - ot->exec = blender::ed::greasepencil::dash_modifier_segment_add_exec; - - /* flags */ - ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_INTERNAL; - edit_modifier_properties(ot); -} - -namespace blender::ed::greasepencil { - -static void dash_modifier_segment_free(GreasePencilDashModifierSegment * /*ds*/) {} - -static int dash_modifier_segment_remove_exec(bContext *C, wmOperator *op) -{ - Object *ob = ED_object_active_context(C); - auto *dmd = reinterpret_cast( - edit_modifier_property_get(op, ob, eModifierType_GreasePencilDash)); - - if (dmd == nullptr) { - return OPERATOR_CANCELLED; - } - - if (!dmd->segments().index_range().contains(dmd->segment_active_index)) { - return OPERATOR_CANCELLED; - } - - blender::dna::array::remove_index(&dmd->segments_array, - &dmd->segments_num, - &dmd->segment_active_index, - dmd->segment_active_index, - dash_modifier_segment_free); - - DEG_id_tag_update(&ob->id, ID_RECALC_GEOMETRY | ID_RECALC_SYNC_TO_EVAL); - WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, ob); - - return OPERATOR_FINISHED; -} - -static int dash_modifier_segment_remove_invoke(bContext *C, - wmOperator *op, - const wmEvent * /*event*/) -{ - if (edit_modifier_invoke_properties(C, op)) { - return dash_modifier_segment_remove_exec(C, op); - } - return OPERATOR_CANCELLED; -} - -} // namespace blender::ed::greasepencil - -void OBJECT_OT_grease_pencil_dash_modifier_segment_remove(wmOperatorType *ot) -{ - /* identifiers */ - ot->name = "Remove Dash Segment"; - ot->description = "Remove the active segment from the dash modifier"; - ot->idname = "OBJECT_OT_grease_pencil_dash_modifier_segment_remove"; - - /* api callbacks */ - ot->poll = blender::ed::greasepencil::dash_modifier_segment_poll; - ot->invoke = blender::ed::greasepencil::dash_modifier_segment_remove_invoke; - ot->exec = blender::ed::greasepencil::dash_modifier_segment_remove_exec; - - /* flags */ - ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_INTERNAL; - edit_modifier_properties(ot); - - RNA_def_int( - ot->srna, "index", 0, 0, INT_MAX, "Index", "Index of the segment to remove", 0, INT_MAX); -} - -namespace blender::ed::greasepencil { - -enum class DashSegmentMoveDirection { - Up = -1, - Down = 1, -}; - -static int dash_modifier_segment_move_exec(bContext *C, wmOperator *op) -{ - Object *ob = ED_object_active_context(C); - auto *dmd = reinterpret_cast( - edit_modifier_property_get(op, ob, eModifierType_GreasePencilDash)); - - if (dmd == nullptr) { - return OPERATOR_CANCELLED; - } - - if (dmd->segments_num < 2) { - return OPERATOR_CANCELLED; - } - - const DashSegmentMoveDirection direction = DashSegmentMoveDirection( - RNA_enum_get(op->ptr, "type")); - switch (direction) { - case DashSegmentMoveDirection::Up: - if (dmd->segment_active_index == 0) { - return OPERATOR_CANCELLED; - } - - std::swap(dmd->segments_array[dmd->segment_active_index], - dmd->segments_array[dmd->segment_active_index - 1]); - - dmd->segment_active_index--; - break; - case DashSegmentMoveDirection::Down: - if (dmd->segment_active_index == dmd->segments_num - 1) { - return OPERATOR_CANCELLED; - } - - std::swap(dmd->segments_array[dmd->segment_active_index], - dmd->segments_array[dmd->segment_active_index + 1]); - - dmd->segment_active_index++; - break; - default: - return OPERATOR_CANCELLED; - } - - DEG_id_tag_update(&ob->id, ID_RECALC_GEOMETRY | ID_RECALC_SYNC_TO_EVAL); - WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, ob); - - return OPERATOR_FINISHED; -} - -static int dash_modifier_segment_move_invoke(bContext *C, - wmOperator *op, - const wmEvent * /*event*/) -{ - if (edit_modifier_invoke_properties(C, op)) { - return dash_modifier_segment_move_exec(C, op); - } - return OPERATOR_CANCELLED; -} - -} // namespace blender::ed::greasepencil - -void OBJECT_OT_grease_pencil_dash_modifier_segment_move(wmOperatorType *ot) -{ - using blender::ed::greasepencil::DashSegmentMoveDirection; - - static const EnumPropertyItem segment_move[] = { - {int(DashSegmentMoveDirection::Up), "UP", 0, "Up", ""}, - {int(DashSegmentMoveDirection::Down), "DOWN", 0, "Down", ""}, - {0, nullptr, 0, nullptr, nullptr}, - }; - - /* identifiers */ - ot->name = "Move Dash Segment"; - ot->description = "Move the active dash segment up or down"; - ot->idname = "OBJECT_OT_grease_pencil_dash_modifier_segment_move"; - - /* api callbacks */ - ot->poll = blender::ed::greasepencil::dash_modifier_segment_poll; - ot->invoke = blender::ed::greasepencil::dash_modifier_segment_move_invoke; - ot->exec = blender::ed::greasepencil::dash_modifier_segment_move_exec; - - /* flags */ - ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_INTERNAL; - edit_modifier_properties(ot); - - ot->prop = RNA_def_enum(ot->srna, "type", segment_move, 0, "Type", ""); -} - -/** \} */ - -/* ------------------------------------------------------------------- */ -/** \name Time Modifier - * \{ */ - -namespace blender::ed::greasepencil { - -static bool time_modifier_segment_poll(bContext *C) -{ - return edit_modifier_poll_generic(C, &RNA_GreasePencilTimeModifier, 0, false, false); -} - -static int time_modifier_segment_add_exec(bContext *C, wmOperator *op) -{ - Object *ob = ED_object_active_context(C); - auto *tmd = reinterpret_cast( - edit_modifier_property_get(op, ob, eModifierType_GreasePencilTime)); - - if (tmd == nullptr) { - return OPERATOR_CANCELLED; - } - - GreasePencilTimeModifierSegment *new_segments = static_cast( - MEM_malloc_arrayN(tmd->segments_num + 1, sizeof(GreasePencilTimeModifierSegment), __func__)); - - const int new_active_index = std::clamp(tmd->segment_active_index + 1, 0, tmd->segments_num); - if (tmd->segments_num != 0) { - /* Copy the segments before the new segment. */ - memcpy(new_segments, - tmd->segments_array, - sizeof(GreasePencilTimeModifierSegment) * new_active_index); - /* Copy the segments after the new segment. */ - memcpy(new_segments + new_active_index + 1, - tmd->segments_array + new_active_index, - sizeof(GreasePencilTimeModifierSegment) * (tmd->segments_num - new_active_index)); - } - - /* Create the new segment. */ - GreasePencilTimeModifierSegment *segment = &new_segments[new_active_index]; - memcpy(segment, - DNA_struct_default_get(GreasePencilTimeModifierSegment), - sizeof(GreasePencilTimeModifierSegment)); - BLI_uniquename_cb( - [&](const blender::StringRef name) { - for (const GreasePencilTimeModifierSegment &segment : tmd->segments()) { - if (STREQ(segment.name, name.data())) { - return true; - } - } - return false; - }, - '.', - segment->name); - - MEM_SAFE_FREE(tmd->segments_array); - tmd->segments_array = new_segments; - tmd->segments_num++; - tmd->segment_active_index++; - - DEG_id_tag_update(&ob->id, ID_RECALC_GEOMETRY | ID_RECALC_SYNC_TO_EVAL); - WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, ob); - - return OPERATOR_FINISHED; -} - -static int time_modifier_segment_add_invoke(bContext *C, wmOperator *op, const wmEvent * /*event*/) -{ - if (edit_modifier_invoke_properties(C, op)) { - return time_modifier_segment_add_exec(C, op); - } - return OPERATOR_CANCELLED; -} - -} // namespace blender::ed::greasepencil - -void OBJECT_OT_grease_pencil_time_modifier_segment_add(wmOperatorType *ot) -{ - /* identifiers */ - ot->name = "Add Segment"; - ot->description = "Add a segment to the time modifier"; - ot->idname = "OBJECT_OT_grease_pencil_time_modifier_segment_add"; - - /* api callbacks */ - ot->poll = blender::ed::greasepencil::time_modifier_segment_poll; - ot->invoke = blender::ed::greasepencil::time_modifier_segment_add_invoke; - ot->exec = blender::ed::greasepencil::time_modifier_segment_add_exec; - - /* flags */ - ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_INTERNAL; - edit_modifier_properties(ot); -} - -namespace blender::ed::greasepencil { - -static void time_modifier_segment_free(GreasePencilTimeModifierSegment * /*ds*/) {} - -static int time_modifier_segment_remove_exec(bContext *C, wmOperator *op) -{ - Object *ob = ED_object_active_context(C); - auto *tmd = reinterpret_cast( - edit_modifier_property_get(op, ob, eModifierType_GreasePencilTime)); - - if (tmd == nullptr) { - return OPERATOR_CANCELLED; - } - - if (!tmd->segments().index_range().contains(tmd->segment_active_index)) { - return OPERATOR_CANCELLED; - } - - blender::dna::array::remove_index(&tmd->segments_array, - &tmd->segments_num, - &tmd->segment_active_index, - tmd->segment_active_index, - time_modifier_segment_free); - - DEG_id_tag_update(&ob->id, ID_RECALC_GEOMETRY | ID_RECALC_SYNC_TO_EVAL); - WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, ob); - - return OPERATOR_FINISHED; -} - -static int time_modifier_segment_remove_invoke(bContext *C, - wmOperator *op, - const wmEvent * /*event*/) -{ - if (edit_modifier_invoke_properties(C, op)) { - return time_modifier_segment_remove_exec(C, op); - } - return OPERATOR_CANCELLED; -} - -} // namespace blender::ed::greasepencil - -void OBJECT_OT_grease_pencil_time_modifier_segment_remove(wmOperatorType *ot) -{ - /* identifiers */ - ot->name = "Remove Segment"; - ot->description = "Remove the active segment from the time modifier"; - ot->idname = "OBJECT_OT_grease_pencil_time_modifier_segment_remove"; - - /* api callbacks */ - ot->poll = blender::ed::greasepencil::time_modifier_segment_poll; - ot->invoke = blender::ed::greasepencil::time_modifier_segment_remove_invoke; - ot->exec = blender::ed::greasepencil::time_modifier_segment_remove_exec; - - /* flags */ - ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_INTERNAL; - edit_modifier_properties(ot); - - RNA_def_int( - ot->srna, "index", 0, 0, INT_MAX, "Index", "Index of the segment to remove", 0, INT_MAX); -} - -namespace blender::ed::greasepencil { - -enum class TimeSegmentMoveDirection { - Up = -1, - Down = 1, -}; - -static int time_modifier_segment_move_exec(bContext *C, wmOperator *op) -{ - Object *ob = ED_object_active_context(C); - auto *tmd = reinterpret_cast( - edit_modifier_property_get(op, ob, eModifierType_GreasePencilTime)); - - if (tmd == nullptr) { - return OPERATOR_CANCELLED; - } - - if (tmd->segments_num < 2) { - return OPERATOR_CANCELLED; - } - - const TimeSegmentMoveDirection direction = TimeSegmentMoveDirection( - RNA_enum_get(op->ptr, "type")); - switch (direction) { - case TimeSegmentMoveDirection::Up: - if (tmd->segment_active_index == 0) { - return OPERATOR_CANCELLED; - } - - std::swap(tmd->segments_array[tmd->segment_active_index], - tmd->segments_array[tmd->segment_active_index - 1]); - - tmd->segment_active_index--; - break; - case TimeSegmentMoveDirection::Down: - if (tmd->segment_active_index == tmd->segments_num - 1) { - return OPERATOR_CANCELLED; - } - - std::swap(tmd->segments_array[tmd->segment_active_index], - tmd->segments_array[tmd->segment_active_index + 1]); - - tmd->segment_active_index++; - break; - default: - return OPERATOR_CANCELLED; - } - - DEG_id_tag_update(&ob->id, ID_RECALC_GEOMETRY | ID_RECALC_SYNC_TO_EVAL); - WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, ob); - - return OPERATOR_FINISHED; -} - -static int time_modifier_segment_move_invoke(bContext *C, - wmOperator *op, - const wmEvent * /*event*/) -{ - if (edit_modifier_invoke_properties(C, op)) { - return time_modifier_segment_move_exec(C, op); - } - return OPERATOR_CANCELLED; -} - -} // namespace blender::ed::greasepencil - -void OBJECT_OT_grease_pencil_time_modifier_segment_move(wmOperatorType *ot) -{ - using blender::ed::greasepencil::TimeSegmentMoveDirection; - - static const EnumPropertyItem segment_move[] = { - {int(TimeSegmentMoveDirection::Up), "UP", 0, "Up", ""}, - {int(TimeSegmentMoveDirection::Down), "DOWN", 0, "Down", ""}, - {0, nullptr, 0, nullptr, nullptr}, - }; - - /* identifiers */ - ot->name = "Move Segment"; - ot->description = "Move the active time segment up or down"; - ot->idname = "OBJECT_OT_grease_pencil_time_modifier_segment_move"; - - /* api callbacks */ - ot->poll = blender::ed::greasepencil::time_modifier_segment_poll; - ot->invoke = blender::ed::greasepencil::time_modifier_segment_move_invoke; - ot->exec = blender::ed::greasepencil::time_modifier_segment_move_exec; - - /* flags */ - ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_INTERNAL; - edit_modifier_properties(ot); - - ot->prop = RNA_def_enum(ot->srna, "type", segment_move, 0, "Type", ""); -} - -/** \} */ diff --git a/source/blender/editors/object/object_ops.cc b/source/blender/editors/object/object_ops.cc index 9396e652559..df916ed2f34 100644 --- a/source/blender/editors/object/object_ops.cc +++ b/source/blender/editors/object/object_ops.cc @@ -91,7 +91,7 @@ void ED_operatortypes_object() WM_operatortype_append(OBJECT_OT_armature_add); WM_operatortype_append(OBJECT_OT_empty_add); WM_operatortype_append(OBJECT_OT_lightprobe_add); - WM_operatortype_append(OBJECT_OT_empty_image_add); + WM_operatortype_append(OBJECT_OT_drop_named_image); WM_operatortype_append(OBJECT_OT_gpencil_add); WM_operatortype_append(OBJECT_OT_grease_pencil_add); WM_operatortype_append(OBJECT_OT_light_add); @@ -141,12 +141,6 @@ void ED_operatortypes_object() WM_operatortype_append(OBJECT_OT_skin_armature_create); WM_operatortype_append(OBJECT_OT_geometry_nodes_input_attribute_toggle); WM_operatortype_append(OBJECT_OT_geometry_node_tree_copy_assign); - WM_operatortype_append(OBJECT_OT_grease_pencil_dash_modifier_segment_add); - WM_operatortype_append(OBJECT_OT_grease_pencil_dash_modifier_segment_remove); - WM_operatortype_append(OBJECT_OT_grease_pencil_dash_modifier_segment_move); - WM_operatortype_append(OBJECT_OT_grease_pencil_time_modifier_segment_add); - WM_operatortype_append(OBJECT_OT_grease_pencil_time_modifier_segment_remove); - WM_operatortype_append(OBJECT_OT_grease_pencil_time_modifier_segment_move); /* grease pencil modifiers */ WM_operatortype_append(OBJECT_OT_gpencil_modifier_add); diff --git a/source/blender/editors/object/object_random.cc b/source/blender/editors/object/object_random.cc index e8f048e41aa..f5641e13e10 100644 --- a/source/blender/editors/object/object_random.cc +++ b/source/blender/editors/object/object_random.cc @@ -10,6 +10,7 @@ #include "DNA_layer_types.h" #include "DNA_object_types.h" +#include "DNA_scene_types.h" #include "BLI_math_vector.h" #include "BLI_rand.h" diff --git a/source/blender/editors/object/object_relations.cc b/source/blender/editors/object/object_relations.cc index eb7ae8a0e52..e44b79d4c7c 100644 --- a/source/blender/editors/object/object_relations.cc +++ b/source/blender/editors/object/object_relations.cc @@ -19,13 +19,18 @@ #include "DNA_camera_types.h" #include "DNA_collection_types.h" #include "DNA_constraint_types.h" +#include "DNA_gpencil_legacy_types.h" +#include "DNA_key_types.h" #include "DNA_lattice_types.h" +#include "DNA_light_types.h" #include "DNA_material_types.h" #include "DNA_mesh_types.h" +#include "DNA_meta_types.h" #include "DNA_object_types.h" #include "DNA_particle_types.h" #include "DNA_scene_types.h" #include "DNA_vfont_types.h" +#include "DNA_world_types.h" #include "BLI_kdtree.h" #include "BLI_linklist.h" @@ -36,34 +41,48 @@ #include "BLI_utildefines.h" #include "BLI_vector_set.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" +#include "BKE_DerivedMesh.hh" #include "BKE_action.h" -#include "BKE_anim_data.hh" +#include "BKE_anim_data.h" #include "BKE_armature.hh" -#include "BKE_collection.hh" +#include "BKE_camera.h" +#include "BKE_collection.h" #include "BKE_constraint.h" #include "BKE_context.hh" #include "BKE_curve.hh" +#include "BKE_curves.h" #include "BKE_displist.h" #include "BKE_editmesh.hh" -#include "BKE_fcurve.hh" +#include "BKE_fcurve.h" +#include "BKE_gpencil_legacy.h" +#include "BKE_idprop.h" #include "BKE_idtype.hh" +#include "BKE_lattice.hh" #include "BKE_layer.hh" #include "BKE_lib_id.hh" #include "BKE_lib_override.hh" #include "BKE_lib_query.hh" #include "BKE_lib_remap.hh" +#include "BKE_light.h" +#include "BKE_lightprobe.h" #include "BKE_main.hh" #include "BKE_material.h" +#include "BKE_mball.hh" +#include "BKE_mesh.hh" #include "BKE_modifier.hh" -#include "BKE_node.hh" +#include "BKE_node.h" #include "BKE_node_runtime.hh" #include "BKE_node_tree_interface.hh" #include "BKE_object.hh" #include "BKE_object_types.hh" -#include "BKE_report.hh" -#include "BKE_scene.hh" +#include "BKE_pointcloud.hh" +#include "BKE_report.h" +#include "BKE_scene.h" +#include "BKE_speaker.h" +#include "BKE_texture.h" +#include "BKE_volume.hh" #include "DEG_depsgraph.hh" #include "DEG_depsgraph_build.hh" @@ -82,6 +101,7 @@ #include "ED_armature.hh" #include "ED_curve.hh" #include "ED_gpencil_legacy.hh" +#include "ED_keyframing.hh" #include "ED_mesh.hh" #include "ED_object.hh" #include "ED_screen.hh" @@ -135,7 +155,7 @@ static int vertex_parent_set_exec(bContext *C, wmOperator *op) /* Make sure the evaluated mesh is updated. * * Most reliable way is to update the tagged objects, which will ensure - * proper copy-on-evaluation update, but also will make sure all dependent + * proper copy-on-write update, but also will make sure all dependent * objects are also up to date. */ BKE_scene_graph_update_tagged(depsgraph, bmain); @@ -254,6 +274,7 @@ static int vertex_parent_set_exec(bContext *C, wmOperator *op) BKE_report(op->reports, RPT_ERROR, "Loop in parents"); } else { + Object workob; BKE_view_layer_synced_ensure(scene, view_layer); ob->parent = BKE_view_layer_active_object_get(view_layer); if (par3 != INDEX_UNSET) { @@ -263,14 +284,16 @@ static int vertex_parent_set_exec(bContext *C, wmOperator *op) ob->par3 = par3; /* inverse parent matrix */ - invert_m4_m4(ob->parentinv, BKE_object_calc_parent(depsgraph, scene, ob).ptr()); + BKE_object_workob_calc_parent(depsgraph, scene, ob, &workob); + invert_m4_m4(ob->parentinv, workob.object_to_world); } else { ob->partype = PARVERT1; ob->par1 = par1; /* inverse parent matrix */ - invert_m4_m4(ob->parentinv, BKE_object_calc_parent(depsgraph, scene, ob).ptr()); + BKE_object_workob_calc_parent(depsgraph, scene, ob, &workob); + invert_m4_m4(ob->parentinv, workob.object_to_world); } } } @@ -286,20 +309,6 @@ static int vertex_parent_set_exec(bContext *C, wmOperator *op) #undef INDEX_UNSET } -static int vertex_parent_set_invoke(bContext *C, wmOperator *op, const wmEvent * /*event*/) -{ - if (RNA_boolean_get(op->ptr, "confirm")) { - return WM_operator_confirm_ex(C, - op, - IFACE_("Parent selected objects to the selected vertices?"), - nullptr, - IFACE_("Parent"), - ALERT_ICON_NONE, - false); - } - return vertex_parent_set_exec(C, op); -} - void OBJECT_OT_vertex_parent_set(wmOperatorType *ot) { /* identifiers */ @@ -308,7 +317,7 @@ void OBJECT_OT_vertex_parent_set(wmOperatorType *ot) ot->idname = "OBJECT_OT_vertex_parent_set"; /* api callbacks */ - ot->invoke = vertex_parent_set_invoke; + ot->invoke = WM_operator_confirm_or_exec; ot->poll = vertex_parent_set_poll; ot->exec = vertex_parent_set_exec; @@ -406,7 +415,7 @@ void ED_object_parent_clear(Object *ob, const int type) /* remove parent, and apply the parented transform * result as object's local transforms */ ob->parent = nullptr; - BKE_object_apply_mat4(ob, ob->object_to_world().ptr(), true, false); + BKE_object_apply_mat4(ob, ob->object_to_world, true, false); /* Don't recalculate the animation because it would change the transform * instead of keeping it. */ flags &= ~ID_RECALC_ANIMATION; @@ -586,11 +595,13 @@ bool ED_object_parent_set(ReportList *reports, } } + Object workob; + /* Apply transformation of previous parenting. */ if (keep_transform) { /* Was removed because of bug #23577, * but this can be handy in some cases too #32616, so * make optional. */ - BKE_object_apply_mat4(ob, ob->object_to_world().ptr(), false, false); + BKE_object_apply_mat4(ob, ob->object_to_world, false, false); } /* Set the parent (except for follow-path constraint option). */ @@ -715,7 +726,7 @@ bool ED_object_parent_set(ReportList *reports, BKE_constraint_target_matrix_get( depsgraph, scene, con, 0, CONSTRAINT_OBTYPE_OBJECT, nullptr, cmat, scene->r.cfra); - sub_v3_v3v3(vec, ob->object_to_world().location(), cmat[3]); + sub_v3_v3v3(vec, ob->object_to_world[3], cmat[3]); copy_v3_v3(ob->loc, vec); } @@ -736,8 +747,9 @@ bool ED_object_parent_set(ReportList *reports, } /* get corrected inverse */ ob->partype = PAROBJECT; + BKE_object_workob_calc_parent(depsgraph, scene, ob, &workob); - invert_m4_m4(ob->parentinv, BKE_object_calc_parent(depsgraph, scene, ob).ptr()); + invert_m4_m4(ob->parentinv, workob.object_to_world); } else if (is_armature_parent && (ob->type == OB_GPENCIL_LEGACY) && (par->type == OB_ARMATURE)) { if (partype == PAR_ARMATURE) { @@ -753,8 +765,9 @@ bool ED_object_parent_set(ReportList *reports, } /* get corrected inverse */ ob->partype = PAROBJECT; + BKE_object_workob_calc_parent(depsgraph, scene, ob, &workob); - invert_m4_m4(ob->parentinv, BKE_object_calc_parent(depsgraph, scene, ob).ptr()); + invert_m4_m4(ob->parentinv, workob.object_to_world); } else if ((ob->type == OB_GPENCIL_LEGACY) && (par->type == OB_LATTICE)) { /* Add Lattice modifier */ @@ -763,12 +776,14 @@ bool ED_object_parent_set(ReportList *reports, } /* get corrected inverse */ ob->partype = PAROBJECT; + BKE_object_workob_calc_parent(depsgraph, scene, ob, &workob); - invert_m4_m4(ob->parentinv, BKE_object_calc_parent(depsgraph, scene, ob).ptr()); + invert_m4_m4(ob->parentinv, workob.object_to_world); } else { /* calculate inverse parent matrix */ - invert_m4_m4(ob->parentinv, BKE_object_calc_parent(depsgraph, scene, ob).ptr()); + BKE_object_workob_calc_parent(depsgraph, scene, ob, &workob); + invert_m4_m4(ob->parentinv, workob.object_to_world); } DEG_id_tag_update(&ob->id, ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY); @@ -777,7 +792,7 @@ bool ED_object_parent_set(ReportList *reports, static void parent_set_vert_find(KDTree_3d *tree, Object *child, int vert_par[3], bool is_tri) { - const float *co_find = child->object_to_world().location(); + const float *co_find = child->object_to_world[3]; if (is_tri) { KDTreeNearest_3d nearest[3]; int tot; @@ -1121,20 +1136,6 @@ static int parent_noinv_set_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } -static int parent_noinv_set_invoke(bContext *C, wmOperator *op, const wmEvent * /*event*/) -{ - if (RNA_boolean_get(op->ptr, "confirm")) { - return WM_operator_confirm_ex(C, - op, - IFACE_("Make Parent without inverse correction?"), - nullptr, - IFACE_("Parent"), - ALERT_ICON_NONE, - false); - } - return parent_noinv_set_exec(C, op); -} - void OBJECT_OT_parent_no_inverse_set(wmOperatorType *ot) { /* identifiers */ @@ -1143,7 +1144,7 @@ void OBJECT_OT_parent_no_inverse_set(wmOperatorType *ot) ot->idname = "OBJECT_OT_parent_no_inverse_set"; /* api callbacks */ - ot->invoke = parent_noinv_set_invoke; + ot->invoke = WM_operator_confirm_or_exec; ot->exec = parent_noinv_set_exec; ot->poll = ED_operator_object_active_editable; @@ -1209,7 +1210,7 @@ static int object_track_clear_exec(bContext *C, wmOperator *op) } if (type == CLEAR_TRACK_KEEP_TRANSFORM) { - BKE_object_apply_mat4(ob, ob->object_to_world().ptr(), true, true); + BKE_object_apply_mat4(ob, ob->object_to_world, true, true); } } CTX_DATA_END; @@ -1578,7 +1579,7 @@ static int make_links_data_exec(bContext *C, wmOperator *op) id_us_plus(&ob_dst->instance_collection->id); ob_dst->transflag |= OB_DUPLICOLLECTION; } - DEG_id_tag_update(&ob_dst->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&ob_dst->id, ID_RECALC_COPY_ON_WRITE); break; case MAKE_LINKS_MODIFIERS: BKE_object_link_modifiers(ob_dst, ob_src); @@ -2413,7 +2414,7 @@ static int make_override_library_exec(bContext *C, wmOperator *op) if (ID_IS_OVERRIDE_LIBRARY_REAL(ob_iter) && !ID_IS_LINKED(ob_iter)) { ob_iter->id.override_library->flag &= ~LIBOVERRIDE_FLAG_SYSTEM_DEFINED; is_active_override = is_active_override || (&ob_iter->id == id_root); - DEG_id_tag_update(&ob_iter->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&ob_iter->id, ID_RECALC_COPY_ON_WRITE); } } FOREACH_SELECTED_OBJECT_END; @@ -2542,7 +2543,7 @@ static int make_override_library_exec(bContext *C, wmOperator *op) } } - DEG_id_tag_update(&CTX_data_scene(C)->id, ID_RECALC_BASE_FLAGS | ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&CTX_data_scene(C)->id, ID_RECALC_BASE_FLAGS | ID_RECALC_COPY_ON_WRITE); WM_event_add_notifier(C, NC_WINDOW, nullptr); WM_event_add_notifier(C, NC_WM | ND_LIB_OVERRIDE_CHANGED, nullptr); WM_event_add_notifier(C, NC_SPACE | ND_SPACE_VIEW3D, nullptr); @@ -2788,7 +2789,7 @@ static int clear_override_library_exec(bContext *C, wmOperator * /*op*/) } } - DEG_id_tag_update(&scene->id, ID_RECALC_BASE_FLAGS | ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&scene->id, ID_RECALC_BASE_FLAGS | ID_RECALC_COPY_ON_WRITE); WM_event_add_notifier(C, NC_WINDOW, nullptr); WM_event_add_notifier(C, NC_WM | ND_LIB_OVERRIDE_CHANGED, nullptr); WM_event_add_notifier(C, NC_SPACE | ND_SPACE_VIEW3D, nullptr); diff --git a/source/blender/editors/object/object_remesh.cc b/source/blender/editors/object/object_remesh.cc index be7a6488b0d..4b716f86986 100644 --- a/source/blender/editors/object/object_remesh.cc +++ b/source/blender/editors/object/object_remesh.cc @@ -15,45 +15,56 @@ #include "MEM_guardedalloc.h" #include "BLI_math_matrix.h" +#include "BLI_string.h" #include "BLI_string_utf8.h" #include "BLI_utildefines.h" #include "DNA_object_types.h" #include "DNA_userdef_types.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_attribute.hh" #include "BKE_context.hh" -#include "BKE_global.hh" +#include "BKE_customdata.hh" +#include "BKE_global.h" #include "BKE_lib_id.hh" #include "BKE_main.hh" #include "BKE_mesh.hh" #include "BKE_mesh_mirror.hh" #include "BKE_mesh_remesh_voxel.hh" +#include "BKE_mesh_runtime.hh" #include "BKE_modifier.hh" #include "BKE_object.hh" -#include "BKE_object_types.hh" #include "BKE_paint.hh" -#include "BKE_report.hh" +#include "BKE_report.h" +#include "BKE_scene.h" #include "BKE_shrinkwrap.hh" #include "BKE_unit.hh" #include "DEG_depsgraph.hh" +#include "DEG_depsgraph_build.hh" +#include "ED_mesh.hh" +#include "ED_object.hh" #include "ED_screen.hh" #include "ED_sculpt.hh" #include "ED_space_api.hh" +#include "ED_undo.hh" #include "ED_view3d.hh" #include "RNA_access.hh" #include "RNA_define.hh" +#include "RNA_enum_types.hh" #include "GPU_immediate.h" +#include "GPU_immediate_util.h" #include "GPU_matrix.h" #include "GPU_state.h" #include "WM_api.hh" +#include "WM_message.hh" +#include "WM_toolsystem.hh" #include "WM_types.hh" #include "UI_interface.hh" @@ -271,7 +282,7 @@ static void voxel_size_edit_draw(const bContext *C, ARegion * /*region*/, void * uint pos3d = GPU_vertformat_attr_add(immVertexFormat(), "pos", GPU_COMP_F32, 3, GPU_FETCH_FLOAT); immBindBuiltinProgram(GPU_SHADER_3D_UNIFORM_COLOR); GPU_matrix_push(); - GPU_matrix_mul(cd->active_object->object_to_world().ptr()); + GPU_matrix_mul(cd->active_object->object_to_world); /* Draw Rect */ immUniformColor4f(0.9f, 0.9f, 0.9f, 0.8f); @@ -473,11 +484,10 @@ static int voxel_size_edit_invoke(bContext *C, wmOperator *op, const wmEvent *ev float view_normal[3] = {0.0f, 0.0f, 1.0f}; /* Calculate the view normal. */ - invert_m4_m4(active_object->runtime->world_to_object.ptr(), - active_object->object_to_world().ptr()); + invert_m4_m4(active_object->world_to_object, active_object->object_to_world); copy_m3_m4(mat, rv3d->viewinv); mul_m3_v3(mat, view_normal); - copy_m3_m4(mat, active_object->world_to_object().ptr()); + copy_m3_m4(mat, active_object->world_to_object); mul_m3_v3(mat, view_normal); normalize_v3(view_normal); @@ -515,8 +525,7 @@ static int voxel_size_edit_invoke(bContext *C, wmOperator *op, const wmEvent *ev /* Project the selected face in the previous step of the Bounding Box. */ for (int i = 0; i < 4; i++) { float preview_plane_world_space[3]; - mul_v3_m4v3( - preview_plane_world_space, active_object->object_to_world().ptr(), cd->preview_plane[i]); + mul_v3_m4v3(preview_plane_world_space, active_object->object_to_world, cd->preview_plane[i]); ED_view3d_project_v2(region, preview_plane_world_space, preview_plane_proj[i]); } @@ -563,7 +572,7 @@ static int voxel_size_edit_invoke(bContext *C, wmOperator *op, const wmEvent *ev /* Invert object scale. */ float scale[3]; - mat4_to_size(scale, active_object->object_to_world().ptr()); + mat4_to_size(scale, active_object->object_to_world); invert_v3(scale); size_to_mat4(scale_mat, scale); @@ -574,7 +583,7 @@ static int voxel_size_edit_invoke(bContext *C, wmOperator *op, const wmEvent *ev /* Scale the text to constant viewport size. */ float text_pos_word_space[3]; - mul_v3_m4v3(text_pos_word_space, active_object->object_to_world().ptr(), text_pos); + mul_v3_m4v3(text_pos_word_space, active_object->object_to_world, text_pos); const float pixelsize = ED_view3d_pixel_size(rv3d, text_pos_word_space); scale_m4_fl(scale_mat, pixelsize * 0.5f); mul_m4_m4_post(cd->text_mat, scale_mat); diff --git a/source/blender/editors/object/object_select.cc b/source/blender/editors/object/object_select.cc index 454300357d7..dc6a6ed0e19 100644 --- a/source/blender/editors/object/object_select.cc +++ b/source/blender/editors/object/object_select.cc @@ -16,29 +16,37 @@ #include "DNA_anim_types.h" #include "DNA_armature_types.h" #include "DNA_collection_types.h" +#include "DNA_gpencil_legacy_types.h" #include "DNA_light_types.h" +#include "DNA_material_types.h" #include "DNA_modifier_types.h" #include "DNA_scene_types.h" +#include "DNA_workspace_types.h" #include "BLI_listbase.h" +#include "BLI_math_bits.h" #include "BLI_math_vector.h" #include "BLI_rand.h" #include "BLI_string_utils.hh" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_action.h" #include "BKE_armature.hh" -#include "BKE_collection.hh" +#include "BKE_collection.h" #include "BKE_context.hh" +#include "BKE_deform.hh" #include "BKE_layer.hh" #include "BKE_lib_id.hh" #include "BKE_main.hh" #include "BKE_material.h" +#include "BKE_object.hh" +#include "BKE_paint.hh" #include "BKE_particle.h" -#include "BKE_report.hh" -#include "BKE_scene.hh" +#include "BKE_report.h" +#include "BKE_scene.h" +#include "BKE_workspace.h" #include "DEG_depsgraph.hh" diff --git a/source/blender/editors/object/object_shader_fx.cc b/source/blender/editors/object/object_shader_fx.cc index d75a25aed20..48ae3b51038 100644 --- a/source/blender/editors/object/object_shader_fx.cc +++ b/source/blender/editors/object/object_shader_fx.cc @@ -23,16 +23,18 @@ #include "BLI_string_utf8.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_context.hh" #include "BKE_lib_id.hh" +#include "BKE_main.hh" #include "BKE_object.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "BKE_shader_fx.h" #include "DEG_depsgraph.hh" #include "DEG_depsgraph_build.hh" +#include "DEG_depsgraph_query.hh" #include "RNA_access.hh" #include "RNA_define.hh" diff --git a/source/blender/editors/object/object_shapekey.cc b/source/blender/editors/object/object_shapekey.cc index 733907de47f..0ac00bb05aa 100644 --- a/source/blender/editors/object/object_shapekey.cc +++ b/source/blender/editors/object/object_shapekey.cc @@ -17,10 +17,11 @@ #include "MEM_guardedalloc.h" +#include "BLI_blenlib.h" #include "BLI_math_vector.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_key_types.h" #include "DNA_lattice_types.h" @@ -28,13 +29,16 @@ #include "DNA_object_types.h" #include "BKE_context.hh" +#include "BKE_crazyspace.hh" #include "BKE_key.hh" #include "BKE_lattice.hh" +#include "BKE_main.hh" #include "BKE_object.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "DEG_depsgraph.hh" #include "DEG_depsgraph_build.hh" +#include "DEG_depsgraph_query.hh" #include "BLI_sys_types.h" /* for intptr_t support */ diff --git a/source/blender/editors/object/object_transform.cc b/source/blender/editors/object/object_transform.cc index da88edc3582..ec94cb4d1b0 100644 --- a/source/blender/editors/object/object_transform.cc +++ b/source/blender/editors/object/object_transform.cc @@ -50,26 +50,24 @@ #include "BKE_multires.hh" #include "BKE_object.hh" #include "BKE_object_types.hh" -#include "BKE_report.hh" -#include "BKE_scene.hh" +#include "BKE_pointcloud.hh" +#include "BKE_report.h" +#include "BKE_scene.h" #include "BKE_tracking.h" -#include "BLT_translation.hh" - #include "DEG_depsgraph.hh" #include "DEG_depsgraph_query.hh" #include "RNA_access.hh" #include "RNA_define.hh" -#include "UI_interface.hh" - #include "WM_api.hh" #include "WM_types.hh" #include "ANIM_keyframing.hh" #include "ED_armature.hh" +#include "ED_gpencil_legacy.hh" #include "ED_keyframing.hh" #include "ED_mesh.hh" #include "ED_object.hh" @@ -532,15 +530,17 @@ void OBJECT_OT_origin_clear(wmOperatorType *ot) * should stay in the same place, e.g. for apply-size-rot or object center */ static void ignore_parent_tx(Main *bmain, Depsgraph *depsgraph, Scene *scene, Object *ob) { + Object workob; + Scene *scene_eval = DEG_get_evaluated_scene(depsgraph); /* a change was made, adjust the children to compensate */ LISTBASE_FOREACH (Object *, ob_child, &bmain->objects) { if (ob_child->parent == ob) { Object *ob_child_eval = DEG_get_evaluated_object(depsgraph, ob_child); - BKE_object_apply_mat4(ob_child_eval, ob_child_eval->object_to_world().ptr(), true, false); - invert_m4_m4(ob_child->parentinv, - BKE_object_calc_parent(depsgraph, scene, ob_child_eval).ptr()); + BKE_object_apply_mat4(ob_child_eval, ob_child_eval->object_to_world, true, false); + BKE_object_workob_calc_parent(depsgraph, scene, ob_child_eval, &workob); + invert_m4_m4(ob_child->parentinv, workob.object_to_world); /* Copy result of BKE_object_apply_mat4(). */ BKE_object_transform_copy(ob_child, ob_child_eval); /* Make sure evaluated object is in a consistent state with the original one. @@ -683,9 +683,11 @@ static int apply_objects_internal(bContext *C, if (do_multi_user) { obact = CTX_data_active_object(C); - invert_m4_m4(obact_invmat, obact->object_to_world().ptr()); + invert_m4_m4(obact_invmat, obact->object_to_world); - copy_m4_m4(obact_parent, BKE_object_calc_parent(depsgraph, scene, obact).ptr()); + Object workob; + BKE_object_workob_calc_parent(depsgraph, scene, obact, &workob); + copy_m4_m4(obact_parent, workob.object_to_world); copy_m4_m4(obact_parentinv, obact->parentinv); if (apply_objects_internal_need_single_user(C)) { @@ -1019,7 +1021,7 @@ static int apply_objects_internal(bContext *C, float _obmat[4][4], _iobmat[4][4]; float _mat[4][4]; - copy_m4_m4(_obmat, ob->object_to_world().ptr()); + copy_m4_m4(_obmat, ob->object_to_world); invert_m4_m4(_iobmat, _obmat); copy_m4_m4(_mat, _obmat); @@ -1105,7 +1107,7 @@ static int visual_transform_apply_exec(bContext *C, wmOperator * /*op*/) CTX_DATA_BEGIN (C, Object *, ob, selected_editable_objects) { Object *ob_eval = DEG_get_evaluated_object(depsgraph, ob); BKE_object_where_is_calc(depsgraph, scene, ob_eval); - BKE_object_apply_mat4(ob_eval, ob_eval->object_to_world().ptr(), true, true); + BKE_object_apply_mat4(ob_eval, ob_eval->object_to_world, true, true); BKE_object_transform_copy(ob, ob_eval); /* update for any children that may get moved */ @@ -1166,14 +1168,8 @@ static int object_transform_apply_invoke(bContext *C, wmOperator *op, const wmEv RNA_property_boolean_set(op->ptr, prop, true); } if (RNA_property_boolean_get(op->ptr, prop)) { - return WM_operator_confirm_ex(C, - op, - IFACE_("Apply Object Transformations"), - IFACE_("Warning: Multiple objects share the same data.\nMake " - "single user and then apply transformations?"), - IFACE_("Apply"), - ALERT_ICON_WARNING, - false); + return WM_operator_confirm_message( + C, op, "Create new object-data users and apply transformation"); } } return object_transform_apply_exec(C, op); @@ -1331,8 +1327,8 @@ static int object_origin_set_exec(bContext *C, wmOperator *op) if (centermode == ORIGIN_TO_CURSOR) { copy_v3_v3(cent, cursor); - invert_m4_m4(obedit->runtime->world_to_object.ptr(), obedit->object_to_world().ptr()); - mul_m4_v3(obedit->world_to_object().ptr(), cent); + invert_m4_m4(obedit->world_to_object, obedit->object_to_world); + mul_m4_v3(obedit->world_to_object, cent); } else { if (around == V3D_AROUND_CENTER_BOUNDS) { @@ -1399,8 +1395,8 @@ static int object_origin_set_exec(bContext *C, wmOperator *op) if (centermode == ORIGIN_TO_CURSOR) { copy_v3_v3(cent, cursor); - invert_m4_m4(ob->runtime->world_to_object.ptr(), ob->object_to_world().ptr()); - mul_m4_v3(ob->world_to_object().ptr(), cent); + invert_m4_m4(ob->world_to_object, ob->object_to_world); + mul_m4_v3(ob->world_to_object, cent); } if (ob->data == nullptr) { @@ -1421,8 +1417,8 @@ static int object_origin_set_exec(bContext *C, wmOperator *op) INIT_MINMAX(min, max); BKE_object_minmax_dupli(depsgraph, scene, ob, min, max, true); mid_v3_v3v3(cent, min, max); - invert_m4_m4(ob->runtime->world_to_object.ptr(), ob->object_to_world().ptr()); - mul_m4_v3(ob->world_to_object().ptr(), cent); + invert_m4_m4(ob->world_to_object, ob->object_to_world); + mul_m4_v3(ob->world_to_object, cent); } add_v3_v3(ob->instance_collection->instance_offset, cent); @@ -1618,7 +1614,7 @@ static int object_origin_set_exec(bContext *C, wmOperator *op) if (centermode == ORIGIN_TO_GEOMETRY) { zero_v3(gpcenter); BKE_gpencil_centroid_3d(gpd, gpcenter); - add_v3_v3(gpcenter, ob->object_to_world().location()); + add_v3_v3(gpcenter, ob->object_to_world[3]); } if (centermode == ORIGIN_TO_CURSOR) { copy_v3_v3(gpcenter, cursor); @@ -1630,8 +1626,8 @@ static int object_origin_set_exec(bContext *C, wmOperator *op) float offset_local[3]; int i; - sub_v3_v3v3(offset_global, gpcenter, ob->object_to_world().location()); - copy_m3_m4(bmat, obact->object_to_world().ptr()); + sub_v3_v3v3(offset_global, gpcenter, ob->object_to_world[3]); + copy_m3_m4(bmat, obact->object_to_world); invert_m3_m3(imat, bmat); mul_m3_v3(imat, offset_global); mul_v3_m3v3(offset_local, imat, offset_global); @@ -1790,8 +1786,7 @@ static int object_origin_set_exec(bContext *C, wmOperator *op) ob_other->flag |= OB_DONE; DEG_id_tag_update(&ob_other->id, ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY); - mul_v3_mat3_m4v3( - centn, ob_other->object_to_world().ptr(), cent); /* omit translation part */ + mul_v3_mat3_m4v3(centn, ob_other->object_to_world, cent); /* omit translation part */ add_v3_v3(ob_other->loc, centn); Object *ob_other_eval = DEG_get_evaluated_object(depsgraph, ob_other); @@ -1818,7 +1813,7 @@ static int object_origin_set_exec(bContext *C, wmOperator *op) /* Special support for dupli-groups. */ else if (tob->instance_collection && tob->instance_collection->id.tag & LIB_TAG_DOIT) { DEG_id_tag_update(&tob->id, ID_RECALC_TRANSFORM); - DEG_id_tag_update(&tob->instance_collection->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&tob->instance_collection->id, ID_RECALC_COPY_ON_WRITE); } } @@ -1965,9 +1960,9 @@ static void object_transform_axis_target_calc_depth_init(XFormAxisData *xfd, con int center_tot = 0; for (XFormAxisItem &item : xfd->object_data) { const Object *ob = item.ob; - const float *ob_co_a = ob->object_to_world().location(); + const float *ob_co_a = ob->object_to_world[3]; float ob_co_b[3]; - add_v3_v3v3(ob_co_b, ob->object_to_world().location(), ob->object_to_world().ptr()[2]); + add_v3_v3v3(ob_co_b, ob->object_to_world[3], ob->object_to_world[2]); float view_isect[3], ob_isect[3]; if (isect_line_line_v3(view_co_a, view_co_b, ob_co_a, ob_co_b, view_isect, ob_isect)) { add_v3_v3(center, view_isect); @@ -2038,7 +2033,7 @@ static void object_apply_location(Object *ob, const float loc[3]) /* quick but weak */ Object ob_prev = blender::dna::shallow_copy(*ob); float mat[4][4]; - copy_m4_m4(mat, ob->object_to_world().ptr()); + copy_m4_m4(mat, ob->object_to_world); copy_v3_v3(mat[3], loc); BKE_object_apply_mat4(ob, mat, true, true); copy_v3_v3(mat[3], ob->loc); @@ -2053,7 +2048,7 @@ static bool object_orient_to_location(Object *ob, const bool z_flip) { float delta[3]; - sub_v3_v3v3(delta, ob->object_to_world().location(), location); + sub_v3_v3v3(delta, ob->object_to_world[3], location); if (normalize_v3(delta) != 0.0f) { if (z_flip) { negate_v3(delta); @@ -2230,7 +2225,7 @@ static int object_transform_axis_target_modal(bContext *C, wmOperator *op, const float xform_rot_offset_inv_first[3][3]; for (const int i : xfd->object_data.index_range()) { XFormAxisItem &item = xfd->object_data[i]; - copy_m3_m4(item.xform_rot_offset, item.ob->object_to_world().ptr()); + copy_m3_m4(item.xform_rot_offset, item.ob->object_to_world); normalize_m3(item.xform_rot_offset); if (i == 0) { @@ -2249,9 +2244,8 @@ static int object_transform_axis_target_modal(bContext *C, wmOperator *op, const XFormAxisItem &item = xfd->object_data[i]; if (is_translate_init) { float ob_axis[3]; - item.xform_dist = len_v3v3(item.ob->object_to_world().location(), - location_world); - normalize_v3_v3(ob_axis, item.ob->object_to_world().ptr()[2]); + item.xform_dist = len_v3v3(item.ob->object_to_world[3], location_world); + normalize_v3_v3(ob_axis, item.ob->object_to_world[2]); /* Scale to avoid adding distance when moving between surfaces. */ if (normal_found) { float scale = fabsf(dot_v3v3(ob_axis, normal)); @@ -2265,7 +2259,7 @@ static int object_transform_axis_target_modal(bContext *C, wmOperator *op, const copy_v3_v3(target_normal, normal); } else { - normalize_v3_v3(target_normal, item.ob->object_to_world().ptr()[2]); + normalize_v3_v3(target_normal, item.ob->object_to_world[2]); } #ifdef USE_RELATIVE_ROTATION @@ -2282,7 +2276,7 @@ static int object_transform_axis_target_modal(bContext *C, wmOperator *op, const madd_v3_v3fl(loc, target_normal, item.xform_dist); object_apply_location(item.ob, loc); /* so orient behaves as expected */ - copy_v3_v3(item.ob->runtime->object_to_world.location(), loc); + copy_v3_v3(item.ob->object_to_world[3], loc); } object_orient_to_location( diff --git a/source/blender/editors/object/object_utils.cc b/source/blender/editors/object/object_utils.cc index 998a6e3b133..dcaabc2c399 100644 --- a/source/blender/editors/object/object_utils.cc +++ b/source/blender/editors/object/object_utils.cc @@ -11,8 +11,10 @@ #include "DNA_anim_types.h" #include "DNA_armature_types.h" +#include "DNA_collection_types.h" #include "DNA_meta_types.h" #include "DNA_object_types.h" +#include "DNA_scene_types.h" #include "BLI_listbase.h" #include "BLI_math_matrix.h" @@ -25,10 +27,12 @@ #include "BKE_lattice.hh" #include "BKE_layer.hh" #include "BKE_object.hh" -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "DEG_depsgraph_query.hh" +#include "WM_types.hh" + #include "ED_curve.hh" #include "ED_object.hh" /* own include */ @@ -113,20 +117,20 @@ bool ED_object_calc_active_center(Object *ob, const bool select_only, float r_ce { if (ob->mode & OB_MODE_EDIT) { if (ED_object_calc_active_center_for_editmode(ob, select_only, r_center)) { - mul_m4_v3(ob->object_to_world().ptr(), r_center); + mul_m4_v3(ob->object_to_world, r_center); return true; } return false; } if (ob->mode & OB_MODE_POSE) { if (ED_object_calc_active_center_for_posemode(ob, select_only, r_center)) { - mul_m4_v3(ob->object_to_world().ptr(), r_center); + mul_m4_v3(ob->object_to_world, r_center); return true; } return false; } if (!select_only || (ob->base_flag & BASE_SELECTED)) { - copy_v3_v3(r_center, ob->object_to_world().location()); + copy_v3_v3(r_center, ob->object_to_world[3]); return true; } return false; @@ -246,11 +250,11 @@ void ED_object_xform_skip_child_container_item_ensure(XFormObjectSkipChild_Conta XFormObjectSkipChild *xf = static_cast( MEM_mallocN(sizeof(*xf), __func__)); copy_m4_m4(xf->parentinv_orig, ob->parentinv); - copy_m4_m4(xf->obmat_orig, ob->object_to_world().ptr()); - copy_m4_m4(xf->parent_obmat_orig, ob->parent->object_to_world().ptr()); - invert_m4_m4(xf->parent_obmat_inv_orig, ob->parent->object_to_world().ptr()); + copy_m4_m4(xf->obmat_orig, ob->object_to_world); + copy_m4_m4(xf->parent_obmat_orig, ob->parent->object_to_world); + invert_m4_m4(xf->parent_obmat_inv_orig, ob->parent->object_to_world); if (ob_parent_recurse) { - copy_m4_m4(xf->parent_recurse_obmat_orig, ob_parent_recurse->object_to_world().ptr()); + copy_m4_m4(xf->parent_recurse_obmat_orig, ob_parent_recurse->object_to_world); } xf->mode = mode; xf->ob_parent_recurse = ob_parent_recurse; @@ -276,14 +280,14 @@ void ED_object_xform_skip_child_container_update_all(XFormObjectSkipChild_Contai if (xf->mode == XFORM_OB_SKIP_CHILD_PARENT_IS_XFORM) { /* Parent is transformed, this isn't so compensate. */ Object *ob_parent_eval = DEG_get_evaluated_object(depsgraph, ob->parent); - mul_m4_m4m4(dmat, xf->parent_obmat_inv_orig, ob_parent_eval->object_to_world().ptr()); + mul_m4_m4m4(dmat, xf->parent_obmat_inv_orig, ob_parent_eval->object_to_world); invert_m4(dmat); } else if (xf->mode == XFORM_OB_SKIP_CHILD_PARENT_IS_XFORM_INDIRECT) { /* Calculate parent matrix (from the root transform). */ Object *ob_parent_recurse_eval = DEG_get_evaluated_object(depsgraph, xf->ob_parent_recurse); float parent_recurse_obmat_inv[4][4]; - invert_m4_m4(parent_recurse_obmat_inv, ob_parent_recurse_eval->object_to_world().ptr()); + invert_m4_m4(parent_recurse_obmat_inv, ob_parent_recurse_eval->object_to_world); mul_m4_m4m4(dmat, xf->parent_recurse_obmat_orig, parent_recurse_obmat_inv); invert_m4(dmat); float parent_obmat_calc[4][4]; @@ -298,7 +302,7 @@ void ED_object_xform_skip_child_container_update_all(XFormObjectSkipChild_Contai /* Transform this - without transform data. */ Object *ob_parent_recurse_eval = DEG_get_evaluated_object(depsgraph, xf->ob_parent_recurse); float parent_recurse_obmat_inv[4][4]; - invert_m4_m4(parent_recurse_obmat_inv, ob_parent_recurse_eval->object_to_world().ptr()); + invert_m4_m4(parent_recurse_obmat_inv, ob_parent_recurse_eval->object_to_world); mul_m4_m4m4(dmat, xf->parent_recurse_obmat_orig, parent_recurse_obmat_inv); invert_m4(dmat); float obmat_calc[4][4]; @@ -353,7 +357,7 @@ void ED_object_data_xform_container_item_ensure(XFormObjectData_Container *xds, if (!BLI_ghash_ensure_p(xds->obdata_in_obmode_map, ob->data, &xf_p)) { XFormObjectData_Extra *xf = static_cast( MEM_mallocN(sizeof(*xf), __func__)); - copy_m4_m4(xf->obmat_orig, ob->object_to_world().ptr()); + copy_m4_m4(xf->obmat_orig, ob->object_to_world); xf->ob = ob; /* Result may be nullptr, that's OK. */ xf->xod = ED_object_data_xform_create(static_cast(ob->data)); @@ -382,7 +386,7 @@ void ED_object_data_xform_container_update_all(XFormObjectData_Container *xds, Object *ob_eval = DEG_get_evaluated_object(depsgraph, xf->ob); float imat[4][4], dmat[4][4]; invert_m4_m4(imat, xf->obmat_orig); - mul_m4_m4m4(dmat, imat, ob_eval->object_to_world().ptr()); + mul_m4_m4m4(dmat, imat, ob_eval->object_to_world); invert_m4(dmat); ED_object_data_xform_by_mat4(xf->xod, dmat); diff --git a/source/blender/editors/object/object_vgroup.cc b/source/blender/editors/object/object_vgroup.cc index 720093777ed..1af599161f1 100644 --- a/source/blender/editors/object/object_vgroup.cc +++ b/source/blender/editors/object/object_vgroup.cc @@ -20,6 +20,7 @@ #include "DNA_modifier_types.h" #include "DNA_object_types.h" #include "DNA_scene_types.h" +#include "DNA_workspace_types.h" #include "BLI_array.hh" #include "BLI_bitmap.h" @@ -36,17 +37,20 @@ #include "BKE_editmesh.hh" #include "BKE_grease_pencil_vertex_groups.hh" #include "BKE_lattice.hh" +#include "BKE_layer.hh" #include "BKE_mesh.hh" #include "BKE_mesh_mapping.hh" +#include "BKE_mesh_runtime.hh" #include "BKE_modifier.hh" #include "BKE_object.hh" #include "BKE_object_deform.h" -#include "BKE_report.hh" +#include "BKE_report.h" #include "DEG_depsgraph.hh" #include "DEG_depsgraph_build.hh" +#include "DEG_depsgraph_query.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_armature_types.h" #include "RNA_access.hh" @@ -2715,7 +2719,7 @@ static int vertex_group_select_exec(bContext *C, wmOperator * /*op*/) } vgroup_select_verts(ob, 1); - DEG_id_tag_update(static_cast(ob->data), ID_RECALC_SYNC_TO_EVAL | ID_RECALC_SELECT); + DEG_id_tag_update(static_cast(ob->data), ID_RECALC_COPY_ON_WRITE | ID_RECALC_SELECT); WM_event_add_notifier(C, NC_GEOM | ND_SELECT, ob->data); return OPERATOR_FINISHED; @@ -2747,7 +2751,7 @@ static int vertex_group_deselect_exec(bContext *C, wmOperator * /*op*/) Object *ob = ED_object_context(C); vgroup_select_verts(ob, 0); - DEG_id_tag_update(static_cast(ob->data), ID_RECALC_SYNC_TO_EVAL | ID_RECALC_SELECT); + DEG_id_tag_update(static_cast(ob->data), ID_RECALC_COPY_ON_WRITE | ID_RECALC_SELECT); WM_event_add_notifier(C, NC_GEOM | ND_SELECT, ob->data); return OPERATOR_FINISHED; diff --git a/source/blender/editors/object/object_volume.cc b/source/blender/editors/object/object_volume.cc index 2f0cba7537a..94f1eab2fc6 100644 --- a/source/blender/editors/object/object_volume.cc +++ b/source/blender/editors/object/object_volume.cc @@ -22,7 +22,7 @@ #include "BKE_context.hh" #include "BKE_lib_id.hh" #include "BKE_main.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "BKE_volume.hh" #include "WM_api.hh" diff --git a/source/blender/editors/object/object_warp.cc b/source/blender/editors/object/object_warp.cc index 00cd0583cb8..dd70ad1993c 100644 --- a/source/blender/editors/object/object_warp.cc +++ b/source/blender/editors/object/object_warp.cc @@ -42,7 +42,7 @@ static void object_warp_calc_view_matrix(float r_mat_view[4][4], mul_m4_m4m4(viewmat_roll, mat_offset, viewmat); /* apply the view and the object matrix */ - mul_m4_m4m4(r_mat_view, viewmat_roll, obedit->object_to_world().ptr()); + mul_m4_m4m4(r_mat_view, viewmat_roll, obedit->object_to_world); /* get the view-space cursor */ mul_v3_m4v3(r_center_view, viewmat_roll, center); diff --git a/source/blender/editors/physics/dynamicpaint_ops.cc b/source/blender/editors/physics/dynamicpaint_ops.cc index e0e438cee31..94d2d721dd2 100644 --- a/source/blender/editors/physics/dynamicpaint_ops.cc +++ b/source/blender/editors/physics/dynamicpaint_ops.cc @@ -17,7 +17,7 @@ #include "BLI_time.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_dynamicpaint_types.h" #include "DNA_modifier_types.h" @@ -28,11 +28,11 @@ #include "BKE_context.hh" #include "BKE_deform.hh" #include "BKE_dynamicpaint.h" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_main.hh" #include "BKE_modifier.hh" #include "BKE_object_deform.h" -#include "BKE_report.hh" +#include "BKE_report.h" #include "BKE_screen.hh" #include "DEG_depsgraph.hh" @@ -327,7 +327,7 @@ static void dpaint_bake_endjob(void *customdata) if (job->success) { /* Show bake info */ WM_reportf( - RPT_INFO, "DynamicPaint: Bake complete! (%.2f)", BLI_time_now_seconds() - job->start); + RPT_INFO, "DynamicPaint: Bake complete! (%.2f)", BLI_check_seconds_timer() - job->start); } else { if (strlen(canvas->error)) { /* If an error occurred */ @@ -438,7 +438,7 @@ static void dpaint_bake_startjob(void *customdata, wmJobWorkerStatus *worker_sta job->stop = &worker_status->stop; job->do_update = &worker_status->do_update; job->progress = &worker_status->progress; - job->start = BLI_time_now_seconds(); + job->start = BLI_check_seconds_timer(); job->success = 1; G.is_break = false; diff --git a/source/blender/editors/physics/particle_boids.cc b/source/blender/editors/physics/particle_boids.cc index f0f7450ceb6..e978344eb88 100644 --- a/source/blender/editors/physics/particle_boids.cc +++ b/source/blender/editors/physics/particle_boids.cc @@ -17,6 +17,7 @@ #include "BKE_boids.h" #include "BKE_context.hh" +#include "BKE_main.hh" #include "DEG_depsgraph.hh" #include "DEG_depsgraph_build.hh" diff --git a/source/blender/editors/physics/particle_edit.cc b/source/blender/editors/physics/particle_edit.cc index d6b95248a61..85b44e1aa7e 100644 --- a/source/blender/editors/physics/particle_edit.cc +++ b/source/blender/editors/physics/particle_edit.cc @@ -21,7 +21,7 @@ #include "DNA_view3d_types.h" #include "BLI_kdtree.h" -#include "BLI_lasso_2d.hh" +#include "BLI_lasso_2d.h" #include "BLI_listbase.h" #include "BLI_math_matrix.h" #include "BLI_rand.h" @@ -33,7 +33,7 @@ #include "BKE_bvhutils.hh" #include "BKE_context.hh" #include "BKE_customdata.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_layer.hh" #include "BKE_main.hh" #include "BKE_mesh.hh" @@ -43,8 +43,8 @@ #include "BKE_object.hh" #include "BKE_particle.h" #include "BKE_pointcache.h" -#include "BKE_report.hh" -#include "BKE_scene.hh" +#include "BKE_report.h" +#include "BKE_scene.h" #include "DEG_depsgraph.hh" @@ -550,7 +550,7 @@ static void PE_free_shape_tree(PEData *data) static void PE_create_random_generator(PEData *data) { - uint rng_seed = uint(BLI_time_now_seconds_i() & UINT_MAX); + uint rng_seed = uint(BLI_check_seconds_timer_i() & UINT_MAX); rng_seed ^= POINTER_AS_UINT(data->ob); rng_seed ^= POINTER_AS_UINT(data->edit); data->rng = BLI_rng_new(rng_seed); @@ -2447,10 +2447,7 @@ int PE_lasso_select(bContext *C, const int mcoords[][2], const int mcoords_len, ((ED_view3d_project_int_global(region, co, screen_co, V3D_PROJ_TEST_CLIP_WIN) == V3D_PROJ_RET_OK) && BLI_lasso_is_point_inside( - {reinterpret_cast(mcoords), mcoords_len}, - screen_co[0], - screen_co[1], - IS_CLIPPED) && + mcoords, mcoords_len, screen_co[0], screen_co[1], IS_CLIPPED) && key_test_depth(&data, co, screen_co)); const int sel_op_result = ED_select_op_action_deselected( eSelectOp(sel_op), is_select, is_inside); @@ -2471,10 +2468,7 @@ int PE_lasso_select(bContext *C, const int mcoords[][2], const int mcoords_len, ((ED_view3d_project_int_global(region, co, screen_co, V3D_PROJ_TEST_CLIP_WIN) == V3D_PROJ_RET_OK) && BLI_lasso_is_point_inside( - {reinterpret_cast(mcoords), mcoords_len}, - screen_co[0], - screen_co[1], - IS_CLIPPED) && + mcoords, mcoords_len, screen_co[0], screen_co[1], IS_CLIPPED) && key_test_depth(&data, co, screen_co)); const int sel_op_result = ED_select_op_action_deselected( eSelectOp(sel_op), is_select, is_inside); @@ -3946,7 +3940,7 @@ static void brush_puff(PEData *data, int point_index, float mouse_distance) /* Use `kco` as the object space version of world-space `co`, * `ob->world_to_object` is set before calling. */ - mul_v3_m4v3(kco, data->ob->world_to_object().ptr(), co); + mul_v3_m4v3(kco, data->ob->world_to_object, co); point_index = BLI_kdtree_3d_find_nearest(edit->emitter_field, kco, nullptr); if (point_index == -1) { @@ -3955,7 +3949,7 @@ static void brush_puff(PEData *data, int point_index, float mouse_distance) copy_v3_v3(co_root, co); copy_v3_v3(no_root, &edit->emitter_cosnos[point_index * 6 + 3]); - mul_mat3_m4_v3(data->ob->object_to_world().ptr(), no_root); /* normal into global-space */ + mul_mat3_m4_v3(data->ob->object_to_world, no_root); /* normal into global-space */ normalize_v3(no_root); if (puff_volume) { @@ -4036,13 +4030,12 @@ static void brush_puff(PEData *data, int point_index, float mouse_distance) /* Use `kco` as the object space version of world-space `co`, * `ob->world_to_object` is set before calling. */ - mul_v3_m4v3(kco, data->ob->world_to_object().ptr(), oco); + mul_v3_m4v3(kco, data->ob->world_to_object, oco); point_index = BLI_kdtree_3d_find_nearest(edit->emitter_field, kco, nullptr); if (point_index != -1) { copy_v3_v3(onor, &edit->emitter_cosnos[point_index * 6 + 3]); - mul_mat3_m4_v3(data->ob->object_to_world().ptr(), - onor); /* Normal into world-space. */ + mul_mat3_m4_v3(data->ob->object_to_world, onor); /* Normal into world-space. */ mul_mat3_m4_v3(imat, onor); /* World-space into particle-space. */ normalize_v3(onor); } @@ -4438,7 +4431,7 @@ static int brush_add(const bContext *C, PEData *data, short number) short size = pset->brush[PE_BRUSH_ADD].size; RNG *rng; - invert_m4_m4(imat, ob->object_to_world().ptr()); + invert_m4_m4(imat, ob->object_to_world); if (psys->flag & PSYS_GLOBAL_HAIR) { return 0; @@ -4827,7 +4820,7 @@ static void brush_edit_apply(bContext *C, wmOperator *op, PointerRNA *itemptr) data.combfac = 1.0f - data.combfac; } - invert_m4_m4(ob->runtime->world_to_object.ptr(), ob->object_to_world().ptr()); + invert_m4_m4(ob->world_to_object, ob->object_to_world); ED_view3d_win_to_delta(region, xy_delta, bedit->zfac, vec); data.dvec = vec; @@ -4895,7 +4888,7 @@ static void brush_edit_apply(bContext *C, wmOperator *op, PointerRNA *itemptr) } data.invert = (brush->invert ^ flip); - invert_m4_m4(ob->runtime->world_to_object.ptr(), ob->object_to_world().ptr()); + invert_m4_m4(ob->world_to_object, ob->object_to_world); foreach_mouse_hit_point(&data, brush_puff, selected); } @@ -4925,7 +4918,7 @@ static void brush_edit_apply(bContext *C, wmOperator *op, PointerRNA *itemptr) data.smoothfac = brush->strength; - invert_m4_m4(ob->runtime->world_to_object.ptr(), ob->object_to_world().ptr()); + invert_m4_m4(ob->world_to_object, ob->object_to_world); foreach_mouse_hit_key(&data, brush_smooth_get, selected); @@ -5142,7 +5135,7 @@ static bool shape_cut_test_point(PEData *data, ParticleEditSettings *pset, Parti userdata.num_hits = 0; float co_shape[3]; - mul_v3_m4v3(co_shape, pset->shape_object->world_to_object().ptr(), key->co); + mul_v3_m4v3(co_shape, pset->shape_object->world_to_object, key->co); BLI_bvhtree_ray_cast_all( shape_bvh->tree, co_shape, dir, 0.0f, BVH_RAYCAST_DIST_MAX, point_inside_bvh_cb, &userdata); @@ -5183,8 +5176,8 @@ static void shape_cut(PEData *data, int pa_index) float dir_shape[3]; float len_shape; - mul_v3_m4v3(co_curr_shape, pset->shape_object->world_to_object().ptr(), key->co); - mul_v3_m4v3(co_next_shape, pset->shape_object->world_to_object().ptr(), (key + 1)->co); + mul_v3_m4v3(co_curr_shape, pset->shape_object->world_to_object, key->co); + mul_v3_m4v3(co_next_shape, pset->shape_object->world_to_object, (key + 1)->co); sub_v3_v3v3(dir_shape, co_next_shape, co_curr_shape); len_shape = normalize_v3(dir_shape); @@ -5499,7 +5492,7 @@ void ED_object_particle_edit_mode_enter_ex(Depsgraph *depsgraph, Scene *scene, O } toggle_particle_cursor(scene, true); - DEG_id_tag_update(&ob->id, ID_RECALC_GEOMETRY | ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&ob->id, ID_RECALC_GEOMETRY | ID_RECALC_COPY_ON_WRITE); WM_main_add_notifier(NC_SCENE | ND_MODE | NS_MODE_PARTICLE, nullptr); } @@ -5517,7 +5510,7 @@ void ED_object_particle_edit_mode_exit_ex(Scene *scene, Object *ob) toggle_particle_cursor(scene, false); free_all_psys_edit(ob); - DEG_id_tag_update(&ob->id, ID_RECALC_GEOMETRY | ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&ob->id, ID_RECALC_GEOMETRY | ID_RECALC_COPY_ON_WRITE); WM_main_add_notifier(NC_SCENE | ND_MODE | NS_MODE_OBJECT, nullptr); } diff --git a/source/blender/editors/physics/particle_edit_undo.cc b/source/blender/editors/physics/particle_edit_undo.cc index d4baf944fd9..074a81248bd 100644 --- a/source/blender/editors/physics/particle_edit_undo.cc +++ b/source/blender/editors/physics/particle_edit_undo.cc @@ -14,6 +14,7 @@ #include "CLG_log.h" +#include "DNA_meshdata_types.h" #include "DNA_scene_types.h" #include "DNA_windowmanager_types.h" @@ -30,10 +31,13 @@ #include "ED_object.hh" #include "ED_particle.hh" +#include "ED_physics.hh" #include "ED_undo.hh" #include "particle_edit_utildefines.h" +#include "physics_intern.h" + /** Only needed this locally. */ static CLG_LogRef LOG = {"ed.undo.particle_edit"}; diff --git a/source/blender/editors/physics/particle_object.cc b/source/blender/editors/physics/particle_object.cc index 0b498b59cca..96ee99149fc 100644 --- a/source/blender/editors/physics/particle_object.cc +++ b/source/blender/editors/physics/particle_object.cc @@ -26,16 +26,18 @@ #include "BKE_bvhutils.hh" #include "BKE_context.hh" #include "BKE_customdata.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_layer.hh" #include "BKE_lib_id.hh" +#include "BKE_main.hh" #include "BKE_mesh.hh" #include "BKE_mesh_legacy_convert.hh" +#include "BKE_mesh_runtime.hh" #include "BKE_modifier.hh" #include "BKE_object.hh" #include "BKE_particle.h" #include "BKE_pointcache.h" -#include "BKE_report.hh" +#include "BKE_report.h" #include "DEG_depsgraph.hh" #include "DEG_depsgraph_build.hh" @@ -52,6 +54,8 @@ #include "ED_particle.hh" #include "ED_screen.hh" +#include "UI_resources.hh" + #include "particle_edit_utildefines.h" #include "physics_intern.h" @@ -702,7 +706,7 @@ static bool remap_hair_emitter(Depsgraph *depsgraph, PTCacheEditKey *ekey; BVHTreeFromMesh bvhtree = {nullptr}; const MFace *mface = nullptr, *mf; - const blender::int2 *edges = nullptr, *edge; + const vec2i *edges = nullptr, *edge; Mesh *mesh, *target_mesh; int numverts; int k; @@ -721,8 +725,8 @@ static bool remap_hair_emitter(Depsgraph *depsgraph, edit_point = target_edit ? target_edit->points : nullptr; - invert_m4_m4(from_ob_imat, ob->object_to_world().ptr()); - invert_m4_m4(to_ob_imat, target_ob->object_to_world().ptr()); + invert_m4_m4(from_ob_imat, ob->object_to_world); + invert_m4_m4(to_ob_imat, target_ob->object_to_world); invert_m4_m4(from_imat, from_mat); invert_m4_m4(to_imat, to_mat); @@ -759,7 +763,7 @@ static bool remap_hair_emitter(Depsgraph *depsgraph, BKE_bvhtree_from_mesh_get(&bvhtree, mesh, BVHTREE_FROM_FACES, 2); } else if (mesh->edges_num != 0) { - edges = static_cast( + edges = static_cast( CustomData_get_layer_named(&mesh->edge_data, CD_PROP_INT32_2D, ".edge_verts")); BKE_bvhtree_from_mesh_get(&bvhtree, mesh, BVHTREE_FROM_EDGES, 2); } @@ -840,7 +844,7 @@ static bool remap_hair_emitter(Depsgraph *depsgraph, float offset[3]; if (to_global) { - copy_m4_m4(imat, target_ob->object_to_world().ptr()); + copy_m4_m4(imat, target_ob->object_to_world); } else { /* NOTE: using target_dm here, which is in target_ob object space and has full modifiers. @@ -921,8 +925,8 @@ static bool connect_hair(Depsgraph *depsgraph, Scene *scene, Object *ob, Particl ob, psys, psys->edit, - ob->object_to_world().ptr(), - ob->object_to_world().ptr(), + ob->object_to_world, + ob->object_to_world, psys->flag & PSYS_GLOBAL_HAIR, false); if (ok) { @@ -1171,7 +1175,7 @@ static bool copy_particle_systems_to_object(const bContext *C, for (psys = psys_start, psys_from = PSYS_FROM_FIRST, i = 0; psys; psys = psys->next, psys_from = PSYS_FROM_NEXT(psys_from), i++) { - const float(*from_mat)[4], (*to_mat)[4]; + float(*from_mat)[4], (*to_mat)[4]; switch (space) { case PAR_COPY_SPACE_OBJECT: @@ -1179,8 +1183,8 @@ static bool copy_particle_systems_to_object(const bContext *C, to_mat = I; break; case PAR_COPY_SPACE_WORLD: - from_mat = ob_from->object_to_world().ptr(); - to_mat = ob_to->object_to_world().ptr(); + from_mat = ob_from->object_to_world; + to_mat = ob_to->object_to_world; break; default: /* should not happen */ diff --git a/source/blender/editors/physics/physics_fluid.cc b/source/blender/editors/physics/physics_fluid.cc index 780cd6693dc..79f181801f2 100644 --- a/source/blender/editors/physics/physics_fluid.cc +++ b/source/blender/editors/physics/physics_fluid.cc @@ -22,14 +22,14 @@ #include "BLI_time.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_context.hh" #include "BKE_fluid.h" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_main.hh" #include "BKE_modifier.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "BKE_screen.hh" #include "DEG_depsgraph.hh" @@ -338,7 +338,7 @@ static void fluid_bake_endjob(void *customdata) if (job->success) { /* Show bake info. */ WM_reportf( - RPT_INFO, "Fluid: %s complete! (%.2f)", job->name, BLI_time_now_seconds() - job->start); + RPT_INFO, "Fluid: %s complete! (%.2f)", job->name, BLI_check_seconds_timer() - job->start); } else { if (fds->error[0] != '\0') { @@ -361,7 +361,7 @@ static void fluid_bake_startjob(void *customdata, wmJobWorkerStatus *worker_stat job->stop = &worker_status->stop; job->do_update = &worker_status->do_update; job->progress = &worker_status->progress; - job->start = BLI_time_now_seconds(); + job->start = BLI_check_seconds_timer(); job->success = 1; G.is_break = false; @@ -446,7 +446,7 @@ static void fluid_free_endjob(void *customdata) if (job->success) { /* Show free job info */ WM_reportf( - RPT_INFO, "Fluid: %s complete! (%.2f)", job->name, BLI_time_now_seconds() - job->start); + RPT_INFO, "Fluid: %s complete! (%.2f)", job->name, BLI_check_seconds_timer() - job->start); } else { if (fds->error[0] != '\0') { @@ -466,7 +466,7 @@ static void fluid_free_startjob(void *customdata, wmJobWorkerStatus *worker_stat job->stop = &worker_status->stop; job->do_update = &worker_status->do_update; job->progress = &worker_status->progress; - job->start = BLI_time_now_seconds(); + job->start = BLI_check_seconds_timer(); job->success = 1; G.is_break = false; diff --git a/source/blender/editors/physics/physics_pointcache.cc b/source/blender/editors/physics/physics_pointcache.cc index 94d74dcf61c..a3bd9764b61 100644 --- a/source/blender/editors/physics/physics_pointcache.cc +++ b/source/blender/editors/physics/physics_pointcache.cc @@ -11,10 +11,13 @@ #include "MEM_guardedalloc.h" +#include "BLI_blenlib.h" #include "BLI_utildefines.h" +#include "DNA_scene_types.h" + #include "BKE_context.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_layer.hh" #include "BKE_pointcache.h" @@ -425,7 +428,7 @@ static int ptcache_remove_exec(bContext *C, wmOperator * /*op*/) BKE_ptcache_free(pid.cache); *(pid.cache_ptr) = static_cast(pid.ptcaches->first); - DEG_id_tag_update(&ob->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&ob->id, ID_RECALC_COPY_ON_WRITE); WM_event_add_notifier(C, NC_OBJECT | ND_POINTCACHE, ob); } diff --git a/source/blender/editors/physics/rigidbody_constraint.cc b/source/blender/editors/physics/rigidbody_constraint.cc index 09c880ae09a..dbad490c437 100644 --- a/source/blender/editors/physics/rigidbody_constraint.cc +++ b/source/blender/editors/physics/rigidbody_constraint.cc @@ -15,11 +15,12 @@ #include "DNA_rigidbody_types.h" #include "DNA_scene_types.h" -#include "BKE_collection.hh" +#include "BKE_collection.h" #include "BKE_context.hh" #include "BKE_layer.hh" #include "BKE_lib_id.hh" -#include "BKE_report.hh" +#include "BKE_main.hh" +#include "BKE_report.h" #include "BKE_rigidbody.h" #include "DEG_depsgraph.hh" @@ -100,7 +101,7 @@ bool ED_rigidbody_constraint_add( DEG_relations_tag_update(bmain); DEG_id_tag_update(&ob->id, ID_RECALC_TRANSFORM); - DEG_id_tag_update(&rbw->constraints->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&rbw->constraints->id, ID_RECALC_COPY_ON_WRITE); return true; } diff --git a/source/blender/editors/physics/rigidbody_object.cc b/source/blender/editors/physics/rigidbody_object.cc index 69a2eacb1d0..b44659dd9f2 100644 --- a/source/blender/editors/physics/rigidbody_object.cc +++ b/source/blender/editors/physics/rigidbody_object.cc @@ -10,14 +10,18 @@ #include #include +#include "DNA_collection_types.h" #include "DNA_object_types.h" #include "DNA_rigidbody_types.h" #include "DNA_scene_types.h" -#include "BLT_translation.hh" +#include "BLI_blenlib.h" + +#include "BLT_translation.h" #include "BKE_context.hh" -#include "BKE_report.hh" +#include "BKE_main.hh" +#include "BKE_report.h" #include "BKE_rigidbody.h" #include "DEG_depsgraph.hh" diff --git a/source/blender/editors/physics/rigidbody_world.cc b/source/blender/editors/physics/rigidbody_world.cc index 3317e373976..2536f8908a2 100644 --- a/source/blender/editors/physics/rigidbody_world.cc +++ b/source/blender/editors/physics/rigidbody_world.cc @@ -19,7 +19,8 @@ #endif #include "BKE_context.hh" -#include "BKE_report.hh" +#include "BKE_main.hh" +#include "BKE_report.h" #include "BKE_rigidbody.h" #include "DEG_depsgraph.hh" @@ -177,8 +178,7 @@ void RIGIDBODY_OT_world_export(wmOperatorType *ot) ot->idname = "RIGIDBODY_OT_world_export"; ot->name = "Export Rigid Body World"; ot->description = - "Export Rigid Body world to the simulator's own fileformat (i.e. '.bullet' for Bullet " - "Physics)"; + "Export Rigid Body world to simulator's own fileformat (i.e. '.bullet' for Bullet Physics)"; /* callbacks */ ot->invoke = rigidbody_world_export_invoke; diff --git a/source/blender/editors/render/render_internal.cc b/source/blender/editors/render/render_internal.cc index 68ea64cf5f6..63febd665e7 100644 --- a/source/blender/editors/render/render_internal.cc +++ b/source/blender/editors/render/render_internal.cc @@ -21,7 +21,7 @@ #include "BLI_timecode.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_object_types.h" #include "DNA_scene_types.h" @@ -30,16 +30,17 @@ #include "BKE_colortools.hh" #include "BKE_context.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_image.h" #include "BKE_image_format.h" #include "BKE_layer.hh" #include "BKE_lib_id.hh" #include "BKE_main.hh" +#include "BKE_node.hh" #include "BKE_node_tree_update.hh" #include "BKE_object.hh" -#include "BKE_report.hh" -#include "BKE_scene.hh" +#include "BKE_report.h" +#include "BKE_scene.h" #include "BKE_screen.hh" #include "NOD_composite.hh" @@ -459,7 +460,7 @@ static void make_renderinfo_string(const RenderStats *rs, info_time = info_buffers.time_elapsed; BLI_timecode_string_from_time_simple(info_buffers.time_elapsed, sizeof(info_buffers.time_elapsed), - BLI_time_now_seconds() - rs->starttime); + BLI_check_seconds_timer() - rs->starttime); } ret_array[i++] = RPT_("Time:"); diff --git a/source/blender/editors/render/render_opengl.cc b/source/blender/editors/render/render_opengl.cc index 7f635608f86..443a3530b90 100644 --- a/source/blender/editors/render/render_opengl.cc +++ b/source/blender/editors/render/render_opengl.cc @@ -19,6 +19,7 @@ #include "BLI_task.hh" #include "BLI_threads.h" #include "BLI_utildefines.h" +#include "DNA_camera_types.h" #include "DNA_action_types.h" #include "DNA_anim_types.h" @@ -27,20 +28,20 @@ #include "DNA_object_types.h" #include "DNA_scene_types.h" -#include "BKE_anim_data.hh" +#include "BKE_anim_data.h" #include "BKE_camera.h" #include "BKE_context.hh" #include "BKE_customdata.hh" -#include "BKE_fcurve.hh" -#include "BKE_global.hh" +#include "BKE_fcurve.h" +#include "BKE_global.h" #include "BKE_image.h" #include "BKE_image_format.h" #include "BKE_image_save.h" #include "BKE_lib_query.hh" #include "BKE_main.hh" -#include "BKE_report.hh" -#include "BKE_scene.hh" -#include "BKE_writemovie.hh" +#include "BKE_report.h" +#include "BKE_scene.h" +#include "BKE_writeavi.h" #include "DEG_depsgraph.hh" #include "DEG_depsgraph_query.hh" @@ -60,7 +61,7 @@ #include "RE_pipeline.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "RNA_access.hh" #include "RNA_define.hh" @@ -616,7 +617,6 @@ static int gather_frames_to_render_for_id(LibraryIDLinkCallbackData *cb_data) case ID_SCR: /* Screen */ case ID_GR: /* Group */ case ID_AC: /* bAction */ - case ID_AN: /* Animation */ case ID_BR: /* Brush */ case ID_WM: /* WindowManager */ case ID_LS: /* FreestyleLineStyle */ @@ -863,7 +863,7 @@ static bool screen_opengl_render_init(bContext *C, wmOperator *op) BLI_condition_init(&oglrender->task_condition); #ifdef DEBUG_TIME - oglrender->time_start = BLI_time_now_seconds(); + oglrender->time_start = BLI_check_seconds_timer(); #endif return true; @@ -899,7 +899,7 @@ static void screen_opengl_render_end(bContext *C, OGLRender *oglrender) BLI_condition_end(&oglrender->task_condition); #ifdef DEBUG_TIME - printf("Total render time: %f\n", BLI_time_now_seconds() - oglrender->time_start); + printf("Total render time: %f\n", BLI_check_seconds_timer() - oglrender->time_start); #endif MEM_SAFE_FREE(oglrender->render_frames); diff --git a/source/blender/editors/render/render_preview.cc b/source/blender/editors/render/render_preview.cc index aada0c80c49..007a284cde2 100644 --- a/source/blender/editors/render/render_preview.cc +++ b/source/blender/editors/render/render_preview.cc @@ -27,7 +27,7 @@ #include "BLI_time.h" #include "BLI_utildefines.h" -#include "BLO_readfile.hh" +#include "BLO_readfile.h" #include "DNA_brush_types.h" #include "DNA_camera_types.h" @@ -48,7 +48,7 @@ #include "BKE_brush.hh" #include "BKE_colortools.hh" #include "BKE_context.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_icons.h" #include "BKE_idprop.h" #include "BKE_image.h" @@ -61,7 +61,7 @@ #include "BKE_object.hh" #include "BKE_pose_backup.h" #include "BKE_preview_image.hh" -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "BKE_screen.hh" #include "BKE_texture.h" #include "BKE_world.h" @@ -793,7 +793,7 @@ static Object *object_preview_camera_create(Main *preview_main, float rotmat[3][3]; float dummy_scale[3]; - mat4_to_loc_rot_size(camera->loc, rotmat, dummy_scale, preview_object->object_to_world().ptr()); + mat4_to_loc_rot_size(camera->loc, rotmat, dummy_scale, preview_object->object_to_world); /* Camera is Y up, so needs additional rotations to obliquely face the front. */ float drotmat[3][3]; diff --git a/source/blender/editors/render/render_shading.cc b/source/blender/editors/render/render_shading.cc index e86fb9f318a..86303f94c2a 100644 --- a/source/blender/editors/render/render_shading.cc +++ b/source/blender/editors/render/render_shading.cc @@ -30,9 +30,9 @@ #include "BLI_string_utils.hh" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" -#include "BKE_anim_data.hh" +#include "BKE_anim_data.h" #include "BKE_animsys.h" #include "BKE_appdir.hh" #include "BKE_blender_copybuffer.hh" @@ -40,7 +40,7 @@ #include "BKE_context.hh" #include "BKE_curve.hh" #include "BKE_editmesh.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_image.h" #include "BKE_layer.hh" #include "BKE_lib_id.hh" @@ -52,8 +52,8 @@ #include "BKE_material.h" #include "BKE_node.hh" #include "BKE_object.hh" -#include "BKE_report.hh" -#include "BKE_scene.hh" +#include "BKE_report.h" +#include "BKE_scene.h" #include "BKE_texture.h" #include "BKE_vfont.hh" #include "BKE_workspace.h" @@ -1046,7 +1046,7 @@ static int view_layer_add_aov_exec(bContext *C, wmOperator * /*op*/) ntreeCompositUpdateRLayers(scene->nodetree); } - DEG_id_tag_update(&scene->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&scene->id, ID_RECALC_COPY_ON_WRITE); DEG_relations_tag_update(CTX_data_main(C)); WM_event_add_notifier(C, NC_SCENE | ND_LAYER, scene); @@ -1098,7 +1098,7 @@ static int view_layer_remove_aov_exec(bContext *C, wmOperator * /*op*/) ntreeCompositUpdateRLayers(scene->nodetree); } - DEG_id_tag_update(&scene->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&scene->id, ID_RECALC_COPY_ON_WRITE); DEG_relations_tag_update(CTX_data_main(C)); WM_event_add_notifier(C, NC_SCENE | ND_LAYER, scene); @@ -1150,7 +1150,7 @@ static int view_layer_add_lightgroup_exec(bContext *C, wmOperator *op) ntreeCompositUpdateRLayers(scene->nodetree); } - DEG_id_tag_update(&scene->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&scene->id, ID_RECALC_COPY_ON_WRITE); DEG_relations_tag_update(CTX_data_main(C)); WM_event_add_notifier(C, NC_SCENE | ND_LAYER, scene); @@ -1200,7 +1200,7 @@ static int view_layer_remove_lightgroup_exec(bContext *C, wmOperator * /*op*/) ntreeCompositUpdateRLayers(scene->nodetree); } - DEG_id_tag_update(&scene->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&scene->id, ID_RECALC_COPY_ON_WRITE); DEG_relations_tag_update(CTX_data_main(C)); WM_event_add_notifier(C, NC_SCENE | ND_LAYER, scene); @@ -1265,7 +1265,7 @@ static int view_layer_add_used_lightgroups_exec(bContext *C, wmOperator * /*op*/ ntreeCompositUpdateRLayers(scene->nodetree); } - DEG_id_tag_update(&scene->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&scene->id, ID_RECALC_COPY_ON_WRITE); DEG_relations_tag_update(CTX_data_main(C)); WM_event_add_notifier(C, NC_SCENE | ND_LAYER, scene); @@ -1309,7 +1309,7 @@ static int view_layer_remove_unused_lightgroups_exec(bContext *C, wmOperator * / ntreeCompositUpdateRLayers(scene->nodetree); } - DEG_id_tag_update(&scene->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&scene->id, ID_RECALC_COPY_ON_WRITE); DEG_relations_tag_update(CTX_data_main(C)); WM_event_add_notifier(C, NC_SCENE | ND_LAYER, scene); @@ -1525,7 +1525,7 @@ static blender::Vector lightprobe_cache_irradiance_volume_subset_get(b auto irradiance_volume_setup = [&](Object *ob) { BKE_lightprobe_cache_free(ob); BKE_lightprobe_cache_create(ob); - DEG_id_tag_update(&ob->id, ID_RECALC_SYNC_TO_EVAL | ID_RECALC_SHADING); + DEG_id_tag_update(&ob->id, ID_RECALC_COPY_ON_WRITE | ID_RECALC_SHADING); probes.append(ob); }; @@ -1642,8 +1642,6 @@ static int lightprobe_cache_bake_exec(bContext *C, wmOperator *op) Main *bmain = CTX_data_main(C); Scene *scene = CTX_data_scene(C); - G.is_break = false; - blender::Vector probes = lightprobe_cache_irradiance_volume_subset_get(C, op); /* TODO: abort if selected engine is not eevee. */ @@ -1651,8 +1649,7 @@ static int lightprobe_cache_bake_exec(bContext *C, wmOperator *op) /* Do the job. */ wmJobWorkerStatus worker_status = {}; EEVEE_NEXT_lightbake_job(rj, &worker_status); - /* Move baking data to original object and then free it. */ - EEVEE_NEXT_lightbake_update(rj); + /* Free baking data. Result is already stored in the scene data. */ EEVEE_NEXT_lightbake_job_data_free(rj); return OPERATOR_FINISHED; @@ -1732,7 +1729,7 @@ static int light_cache_free_exec(bContext *C, wmOperator * /*op*/) EEVEE_lightcache_info_update(&scene->eevee); - DEG_id_tag_update(&scene->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&scene->id, ID_RECALC_COPY_ON_WRITE); WM_event_add_notifier(C, NC_SCENE | ND_RENDER_OPTIONS, scene); @@ -1768,10 +1765,10 @@ static int lightprobe_cache_free_exec(bContext *C, wmOperator *op) continue; } BKE_lightprobe_cache_free(object); - DEG_id_tag_update(&object->id, ID_RECALC_SYNC_TO_EVAL | ID_RECALC_SHADING); + DEG_id_tag_update(&object->id, ID_RECALC_COPY_ON_WRITE | ID_RECALC_SHADING); } - WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, scene); + WM_event_add_notifier(C, NC_OBJECT | ND_OB_SHADING, scene); return OPERATOR_FINISHED; } @@ -1965,7 +1962,7 @@ static int freestyle_module_remove_exec(bContext *C, wmOperator * /*op*/) BKE_freestyle_module_delete(&view_layer->freestyle_config, module); - DEG_id_tag_update(&scene->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&scene->id, ID_RECALC_COPY_ON_WRITE); WM_event_add_notifier(C, NC_SCENE | ND_RENDER_OPTIONS, scene); return OPERATOR_FINISHED; @@ -1995,7 +1992,7 @@ static int freestyle_module_move_exec(bContext *C, wmOperator *op) int dir = RNA_enum_get(op->ptr, "direction"); if (BKE_freestyle_module_move(&view_layer->freestyle_config, module, dir)) { - DEG_id_tag_update(&scene->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&scene->id, ID_RECALC_COPY_ON_WRITE); WM_event_add_notifier(C, NC_SCENE | ND_RENDER_OPTIONS, scene); } @@ -2051,7 +2048,7 @@ static int freestyle_lineset_add_exec(bContext *C, wmOperator * /*op*/) BKE_freestyle_lineset_add(bmain, &view_layer->freestyle_config, nullptr); - DEG_id_tag_update(&scene->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&scene->id, ID_RECALC_COPY_ON_WRITE); WM_event_add_notifier(C, NC_SCENE | ND_RENDER_OPTIONS, scene); return OPERATOR_FINISHED; @@ -2125,7 +2122,7 @@ static int freestyle_lineset_paste_exec(bContext *C, wmOperator * /*op*/) FRS_paste_active_lineset(&view_layer->freestyle_config); - DEG_id_tag_update(&scene->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&scene->id, ID_RECALC_COPY_ON_WRITE); WM_event_add_notifier(C, NC_SCENE | ND_RENDER_OPTIONS, scene); return OPERATOR_FINISHED; @@ -2159,7 +2156,7 @@ static int freestyle_lineset_remove_exec(bContext *C, wmOperator * /*op*/) FRS_delete_active_lineset(&view_layer->freestyle_config); - DEG_id_tag_update(&scene->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&scene->id, ID_RECALC_COPY_ON_WRITE); WM_event_add_notifier(C, NC_SCENE | ND_RENDER_OPTIONS, scene); return OPERATOR_FINISHED; @@ -2193,7 +2190,7 @@ static int freestyle_lineset_move_exec(bContext *C, wmOperator *op) int dir = RNA_enum_get(op->ptr, "direction"); if (FRS_move_active_lineset(&view_layer->freestyle_config, dir)) { - DEG_id_tag_update(&scene->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&scene->id, ID_RECALC_COPY_ON_WRITE); WM_event_add_notifier(C, NC_SCENE | ND_RENDER_OPTIONS, scene); } @@ -3016,7 +3013,7 @@ static int paste_material_exec(bContext *C, wmOperator *op) * Always call instead of checking when it *might* be needed. */ DEG_relations_tag_update(bmain); - DEG_id_tag_update(&ma->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&ma->id, ID_RECALC_COPY_ON_WRITE); WM_event_add_notifier(C, NC_MATERIAL | ND_SHADING_LINKS, ma); return OPERATOR_FINISHED; diff --git a/source/blender/editors/render/render_update.cc b/source/blender/editors/render/render_update.cc index 8ee30285215..04f15595eeb 100644 --- a/source/blender/editors/render/render_update.cc +++ b/source/blender/editors/render/render_update.cc @@ -31,8 +31,9 @@ #include "BKE_icons.h" #include "BKE_main.hh" #include "BKE_material.h" +#include "BKE_node.hh" #include "BKE_paint.hh" -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "NOD_composite.hh" @@ -207,7 +208,7 @@ void ED_render_engine_changed(Main *bmain, const bool update_scene_data) * We do not use #BKE_cachefile_uses_render_procedural here as we need to update regardless of * the current engine or its settings. */ if (cachefile->use_render_procedural) { - DEG_id_tag_update(&cachefile->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&cachefile->id, ID_RECALC_COPY_ON_WRITE); /* Rebuild relations so that modifiers are reconnected to or disconnected from the * cache-file. */ DEG_relations_tag_update(bmain); diff --git a/source/blender/editors/render/render_view.cc b/source/blender/editors/render/render_view.cc index adb7f5c409a..6faf55763a6 100644 --- a/source/blender/editors/render/render_view.cc +++ b/source/blender/editors/render/render_view.cc @@ -16,18 +16,20 @@ #include "DNA_userdef_types.h" #include "BKE_context.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_image.h" -#include "BKE_report.hh" -#include "BKE_scene.hh" +#include "BKE_main.hh" +#include "BKE_report.h" +#include "BKE_scene.h" #include "BKE_screen.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "WM_api.hh" #include "WM_types.hh" #include "ED_screen.hh" +#include "UI_interface.hh" #include "wm_window.hh" diff --git a/source/blender/editors/scene/scene_edit.cc b/source/blender/editors/scene/scene_edit.cc index aefbad41b5c..100c8ada9fb 100644 --- a/source/blender/editors/scene/scene_edit.cc +++ b/source/blender/editors/scene/scene_edit.cc @@ -16,19 +16,20 @@ #include "DNA_sequence_types.h" #include "BKE_context.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_layer.hh" #include "BKE_lib_id.hh" #include "BKE_main.hh" -#include "BKE_node.hh" -#include "BKE_report.hh" -#include "BKE_scene.hh" +#include "BKE_node.h" +#include "BKE_report.h" +#include "BKE_scene.h" #include "DEG_depsgraph.hh" #include "DEG_depsgraph_build.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" +#include "ED_object.hh" #include "ED_render.hh" #include "ED_scene.hh" #include "ED_screen.hh" @@ -39,6 +40,7 @@ #include "RNA_access.hh" #include "RNA_define.hh" +#include "RNA_enum_types.hh" #include "WM_api.hh" #include "WM_types.hh" diff --git a/source/blender/editors/screen/area.cc b/source/blender/editors/screen/area.cc index 302d88d8df6..07e235e29e5 100644 --- a/source/blender/editors/screen/area.cc +++ b/source/blender/editors/screen/area.cc @@ -20,17 +20,20 @@ #include "BLI_utildefines.h" #include "BKE_context.hh" -#include "BKE_global.hh" +#include "BKE_global.h" +#include "BKE_image.h" #include "BKE_screen.hh" #include "BKE_workspace.h" #include "RNA_access.hh" +#include "RNA_types.hh" #include "WM_api.hh" #include "WM_message.hh" #include "WM_toolsystem.hh" #include "WM_types.hh" +#include "ED_asset.hh" #include "ED_asset_shelf.hh" #include "ED_buttons.hh" #include "ED_screen.hh" @@ -46,6 +49,7 @@ #include "BLF_api.hh" +#include "IMB_imbuf_types.hh" #include "IMB_metadata.hh" #include "UI_interface.hh" diff --git a/source/blender/editors/screen/area_query.cc b/source/blender/editors/screen/area_query.cc index 9d477fe706e..00e0447d37c 100644 --- a/source/blender/editors/screen/area_query.cc +++ b/source/blender/editors/screen/area_query.cc @@ -10,9 +10,12 @@ #include "DNA_userdef_types.h" +#include "BLI_blenlib.h" #include "BLI_math_base.h" #include "BLI_utildefines.h" +#include "RNA_types.hh" + #include "ED_screen.hh" #include "UI_interface.hh" diff --git a/source/blender/editors/screen/area_utils.cc b/source/blender/editors/screen/area_utils.cc index f512e090904..585192d76be 100644 --- a/source/blender/editors/screen/area_utils.cc +++ b/source/blender/editors/screen/area_utils.cc @@ -15,6 +15,9 @@ #include "BLI_blenlib.h" #include "BLI_utildefines.h" +#include "RNA_access.hh" +#include "RNA_types.hh" + #include "WM_message.hh" #include "ED_screen.hh" diff --git a/source/blender/editors/screen/glutil.cc b/source/blender/editors/screen/glutil.cc index 33e4aeee62a..d8624853096 100644 --- a/source/blender/editors/screen/glutil.cc +++ b/source/blender/editors/screen/glutil.cc @@ -14,6 +14,8 @@ #include "BLI_utildefines.h" +#include "BKE_context.hh" + #include "BIF_glutil.hh" #include "IMB_colormanagement.hh" @@ -21,12 +23,15 @@ #include "GPU_context.h" #include "GPU_immediate.h" +#include "GPU_matrix.h" #include "GPU_texture.h" #ifdef __APPLE__ # include "GPU_state.h" #endif +#include "UI_interface.hh" + /* ******************************************** */ static void immDrawPixelsTexSetupAttributes(IMMDrawPixelsTexState *state) diff --git a/source/blender/editors/screen/screen_context.cc b/source/blender/editors/screen/screen_context.cc index ad5bbd2d9a9..cdcf3b145d8 100644 --- a/source/blender/editors/screen/screen_context.cc +++ b/source/blender/editors/screen/screen_context.cc @@ -29,7 +29,7 @@ #include "BKE_action.h" #include "BKE_armature.hh" -#include "BKE_blender.hh" +#include "BKE_blender.h" #include "BKE_context.hh" #include "BKE_gpencil_legacy.h" #include "BKE_layer.hh" diff --git a/source/blender/editors/screen/screen_draw.cc b/source/blender/editors/screen/screen_draw.cc index 922914b67cb..e0d13a3a8a7 100644 --- a/source/blender/editors/screen/screen_draw.cc +++ b/source/blender/editors/screen/screen_draw.cc @@ -9,7 +9,9 @@ #include "ED_screen.hh" #include "GPU_batch_presets.h" +#include "GPU_framebuffer.h" #include "GPU_immediate.h" +#include "GPU_matrix.h" #include "GPU_platform.h" #include "GPU_state.h" diff --git a/source/blender/editors/screen/screen_edit.cc b/source/blender/editors/screen/screen_edit.cc index fe3da8d259d..5fb23b3386f 100644 --- a/source/blender/editors/screen/screen_edit.cc +++ b/source/blender/editors/screen/screen_edit.cc @@ -14,18 +14,19 @@ #include "DNA_object_types.h" #include "DNA_scene_types.h" #include "DNA_userdef_types.h" +#include "DNA_workspace_types.h" #include "BLI_blenlib.h" #include "BLI_utildefines.h" #include "BKE_context.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_icons.h" #include "BKE_image.h" #include "BKE_layer.hh" #include "BKE_lib_id.hh" #include "BKE_main.hh" -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "BKE_screen.hh" #include "BKE_sound.h" #include "BKE_workspace.h" @@ -1795,7 +1796,7 @@ void ED_update_for_newframe(Main *bmain, Depsgraph *depsgraph) LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) { BKE_screen_view3d_scene_sync(screen, scene); } - DEG_id_tag_update(&scene->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&scene->id, ID_RECALC_COPY_ON_WRITE); } #endif diff --git a/source/blender/editors/screen/screen_ops.cc b/source/blender/editors/screen/screen_ops.cc index 96bd0d7a9c4..332da569b0a 100644 --- a/source/blender/editors/screen/screen_ops.cc +++ b/source/blender/editors/screen/screen_ops.cc @@ -11,16 +11,20 @@ #include "MEM_guardedalloc.h" +#include "BLI_blenlib.h" +#include "BLI_dlrbTree.h" #include "BLI_math_rotation.h" #include "BLI_math_vector.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_anim_types.h" #include "DNA_armature_types.h" #include "DNA_curve_types.h" #include "DNA_lattice_types.h" +#include "DNA_mask_types.h" +#include "DNA_mesh_types.h" #include "DNA_meta_types.h" #include "DNA_node_types.h" #include "DNA_object_types.h" @@ -28,18 +32,18 @@ #include "DNA_userdef_types.h" #include "DNA_workspace_types.h" -#include "BKE_callbacks.hh" +#include "BKE_callbacks.h" #include "BKE_context.hh" #include "BKE_editmesh.hh" -#include "BKE_fcurve.hh" -#include "BKE_global.hh" +#include "BKE_fcurve.h" +#include "BKE_global.h" #include "BKE_icons.h" #include "BKE_lib_id.hh" #include "BKE_main.hh" #include "BKE_mask.h" #include "BKE_object.hh" -#include "BKE_report.hh" -#include "BKE_scene.hh" +#include "BKE_report.h" +#include "BKE_scene.h" #include "BKE_screen.hh" #include "BKE_sound.h" #include "BKE_workspace.h" @@ -52,6 +56,7 @@ #include "ED_anim_api.hh" #include "ED_armature.hh" +#include "ED_clip.hh" #include "ED_fileselect.hh" #include "ED_image.hh" #include "ED_keyframes_keylist.hh" @@ -61,6 +66,8 @@ #include "ED_screen.hh" #include "ED_screen_types.hh" #include "ED_sequencer.hh" +#include "ED_undo.hh" +#include "ED_util.hh" #include "ED_view3d.hh" #include "RNA_access.hh" @@ -76,8 +83,6 @@ #include "screen_intern.h" /* own module include */ -using blender::Vector; - #define KM_MODAL_CANCEL 1 #define KM_MODAL_APPLY 2 #define KM_MODAL_SNAP_ON 3 @@ -5790,24 +5795,32 @@ static int space_workspace_cycle_invoke(bContext *C, wmOperator *op, const wmEve Main *bmain = CTX_data_main(C); const eScreenCycle direction = eScreenCycle(RNA_enum_get(op->ptr, "direction")); WorkSpace *workspace_src = WM_window_get_active_workspace(win); + WorkSpace *workspace_dst = nullptr; - Vector ordered = BKE_id_ordered_list(&bmain->workspaces); - if (ordered.size() == 1) { - return OPERATOR_CANCELLED; + ListBase ordered; + BKE_id_ordered_list(&ordered, &bmain->workspaces); + + LISTBASE_FOREACH (LinkData *, link, &ordered) { + if (link->data == workspace_src) { + if (direction == SPACE_CONTEXT_CYCLE_PREV) { + workspace_dst = static_cast((link->prev) ? link->prev->data : nullptr); + } + else { + workspace_dst = static_cast((link->next) ? link->next->data : nullptr); + } + } } - const int index = ordered.first_index_of(&workspace_src->id); + if (workspace_dst == nullptr) { + LinkData *link = static_cast( + (direction == SPACE_CONTEXT_CYCLE_PREV) ? ordered.last : ordered.first); + workspace_dst = static_cast(link->data); + } - WorkSpace *workspace_dst = nullptr; - switch (direction) { - case SPACE_CONTEXT_CYCLE_PREV: - workspace_dst = reinterpret_cast(index == 0 ? ordered.last() : - ordered[index - 1]); - break; - case SPACE_CONTEXT_CYCLE_NEXT: - workspace_dst = reinterpret_cast( - index == ordered.index_range().last() ? ordered.first() : ordered[index + 1]); - break; + BLI_freelistN(&ordered); + + if (workspace_src == workspace_dst) { + return OPERATOR_CANCELLED; } win->workspace_hook->temp_workspace_store = workspace_dst; diff --git a/source/blender/editors/screen/screen_user_menu.cc b/source/blender/editors/screen/screen_user_menu.cc index f140ea75850..cee7d3fd146 100644 --- a/source/blender/editors/screen/screen_user_menu.cc +++ b/source/blender/editors/screen/screen_user_menu.cc @@ -19,7 +19,7 @@ #include "BLI_string.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_blender_user_menu.hh" #include "BKE_context.hh" diff --git a/source/blender/editors/screen/screendump.cc b/source/blender/editors/screen/screendump.cc index 9e3c2b37627..924d4a7e229 100644 --- a/source/blender/editors/screen/screendump.cc +++ b/source/blender/editors/screen/screendump.cc @@ -23,16 +23,17 @@ #include "DNA_space_types.h" #include "BKE_context.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_image.h" #include "BKE_image_format.h" #include "BKE_main.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "BKE_screen.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "RNA_access.hh" +#include "RNA_define.hh" #include "RNA_prototypes.h" #include "UI_interface.hh" diff --git a/source/blender/editors/screen/workspace_edit.cc b/source/blender/editors/screen/workspace_edit.cc index 766d762f4d5..c73b8f90e56 100644 --- a/source/blender/editors/screen/workspace_edit.cc +++ b/source/blender/editors/screen/workspace_edit.cc @@ -22,7 +22,7 @@ #include "BKE_screen.hh" #include "BKE_workspace.h" -#include "BLO_readfile.hh" +#include "BLO_readfile.h" #include "DNA_screen_types.h" #include "DNA_windowmanager_types.h" @@ -38,15 +38,13 @@ #include "UI_interface.hh" #include "UI_resources.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "WM_api.hh" #include "WM_types.hh" #include "screen_intern.h" -using blender::Vector; - /* -------------------------------------------------------------------- */ /** \name Workspace API * @@ -244,16 +242,23 @@ bool ED_workspace_delete(WorkSpace *workspace, Main *bmain, bContext *C, wmWindo return false; } - Vector ordered = BKE_id_ordered_list(&bmain->workspaces); - const int index = ordered.first_index_of(&workspace->id); - - WorkSpace *new_active = reinterpret_cast(index == 0 ? ordered[1] : - ordered[index - 1]); + ListBase ordered; + BKE_id_ordered_list(&ordered, &bmain->workspaces); + WorkSpace *prev = nullptr, *next = nullptr; + LISTBASE_FOREACH (LinkData *, link, &ordered) { + if (link->data == workspace) { + prev = static_cast(link->prev ? link->prev->data : nullptr); + next = static_cast(link->next ? link->next->data : nullptr); + break; + } + } + BLI_freelistN(&ordered); + BLI_assert((prev != nullptr) || (next != nullptr)); LISTBASE_FOREACH (wmWindow *, win, &wm->windows) { WorkSpace *workspace_active = WM_window_get_active_workspace(win); if (workspace_active == workspace) { - ED_workspace_change(new_active, C, wm, win); + ED_workspace_change((prev != nullptr) ? prev : next, C, wm, win); } } diff --git a/source/blender/editors/sculpt_paint/CMakeLists.txt b/source/blender/editors/sculpt_paint/CMakeLists.txt index 8977186e460..56c73553576 100644 --- a/source/blender/editors/sculpt_paint/CMakeLists.txt +++ b/source/blender/editors/sculpt_paint/CMakeLists.txt @@ -76,17 +76,14 @@ set(SRC sculpt_filter_mask.cc sculpt_filter_mesh.cc sculpt_geodesic.cc - sculpt_gesture.cc sculpt_mask_init.cc sculpt_multiplane_scrape.cc sculpt_ops.cc sculpt_paint_color.cc sculpt_paint_image.cc sculpt_pose.cc - sculpt_project.cc sculpt_smooth.cc sculpt_transform.cc - sculpt_trim.cc sculpt_undo.cc sculpt_uv.cc @@ -102,7 +99,6 @@ set(LIB PRIVATE bf::blenlib PRIVATE bf::depsgraph PRIVATE bf::dna - PRIVATE bf::extern::fmtlib PRIVATE bf::intern::atomic PRIVATE bf::intern::clog PRIVATE bf::intern::guardedalloc @@ -119,19 +115,6 @@ if(WIN32) add_definitions(-DNOMINMAX) endif() -if(WITH_GTESTS) - set(TEST_SRC - sculpt_detail_test.cc - ) - set(TEST_INC - ) - set(TEST_LIB - ${LIB} - bf_rna # RNA_prototypes.h - ) - blender_add_test_suite_lib(editor_sculpt_paint "${TEST_SRC}" "${INC};${TEST_INC}" "${INC_SYS}" "${TEST_LIB}") -endif() - blender_add_lib(bf_editor_sculpt_paint "${SRC}" "${INC}" "${INC_SYS}" "${LIB}") # RNA_prototypes.h diff --git a/source/blender/editors/sculpt_paint/curves_sculpt_add.cc b/source/blender/editors/sculpt_paint/curves_sculpt_add.cc index 6b231fcb33e..ce1a993b2b6 100644 --- a/source/blender/editors/sculpt_paint/curves_sculpt_add.cc +++ b/source/blender/editors/sculpt_paint/curves_sculpt_add.cc @@ -27,7 +27,7 @@ #include "BKE_modifier.hh" #include "BKE_object.hh" #include "BKE_paint.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "DNA_brush_enums.h" #include "DNA_brush_types.h" @@ -207,15 +207,12 @@ struct AddOperationExecutor { add_inputs.uvs = sampled_uvs; add_inputs.interpolate_length = brush_settings_->flag & BRUSH_CURVES_SCULPT_FLAG_INTERPOLATE_LENGTH; - add_inputs.interpolate_radius = brush_settings_->flag & - BRUSH_CURVES_SCULPT_FLAG_INTERPOLATE_RADIUS; add_inputs.interpolate_shape = brush_settings_->flag & BRUSH_CURVES_SCULPT_FLAG_INTERPOLATE_SHAPE; add_inputs.interpolate_point_count = brush_settings_->flag & BRUSH_CURVES_SCULPT_FLAG_INTERPOLATE_POINT_COUNT; add_inputs.interpolate_resolution = curves_orig_->attributes().contains("resolution"); add_inputs.fallback_curve_length = brush_settings_->curve_length; - add_inputs.fallback_curve_radius = brush_settings_->curve_radius; add_inputs.fallback_point_count = std::max(2, brush_settings_->points_per_curve); add_inputs.transforms = &transforms_; add_inputs.surface_corner_tris = surface_corner_tris_orig; @@ -223,9 +220,8 @@ struct AddOperationExecutor { add_inputs.surface = &surface_orig; add_inputs.corner_normals_su = corner_normals_su; - if (add_inputs.interpolate_length || add_inputs.interpolate_radius || - add_inputs.interpolate_shape || add_inputs.interpolate_point_count || - add_inputs.interpolate_resolution) + if (add_inputs.interpolate_length || add_inputs.interpolate_shape || + add_inputs.interpolate_point_count || add_inputs.interpolate_resolution) { this->ensure_curve_roots_kdtree(); add_inputs.old_roots_kdtree = self_->curve_roots_kdtree_; diff --git a/source/blender/editors/sculpt_paint/curves_sculpt_brush.cc b/source/blender/editors/sculpt_paint/curves_sculpt_brush.cc index 4c48da9ef1f..8a5ef3d9588 100644 --- a/source/blender/editors/sculpt_paint/curves_sculpt_brush.cc +++ b/source/blender/editors/sculpt_paint/curves_sculpt_brush.cc @@ -13,7 +13,7 @@ #include "BKE_context.hh" #include "BKE_curves.hh" #include "BKE_object.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "ED_view3d.hh" @@ -24,6 +24,8 @@ #include "DEG_depsgraph_query.hh" +#include "BLT_translation.h" + #include "GEO_curve_constraints.hh" /** @@ -186,7 +188,7 @@ std::optional sample_curves_3d_brush(const Depsgraph &depsgraph, /* Shorten ray when the surface object is hit. */ if (surface_object_eval != nullptr) { - const float4x4 surface_to_world_mat(surface_object->object_to_world().ptr()); + const float4x4 surface_to_world_mat(surface_object->object_to_world); const float4x4 world_to_surface_mat = math::invert(surface_to_world_mat); Mesh *surface_eval = BKE_object_get_evaluated_mesh(surface_object_eval); @@ -221,7 +223,7 @@ std::optional sample_curves_3d_brush(const Depsgraph &depsgraph, } } - const float4x4 &curves_to_world_mat = curves_object.object_to_world(); + const float4x4 curves_to_world_mat(curves_object.object_to_world); const float4x4 world_to_curves_mat = math::invert(curves_to_world_mat); const float3 center_ray_start_cu = math::transform_point(world_to_curves_mat, diff --git a/source/blender/editors/sculpt_paint/curves_sculpt_density.cc b/source/blender/editors/sculpt_paint/curves_sculpt_density.cc index a1e698a42dc..b6d1c851994 100644 --- a/source/blender/editors/sculpt_paint/curves_sculpt_density.cc +++ b/source/blender/editors/sculpt_paint/curves_sculpt_density.cc @@ -14,7 +14,7 @@ #include "BKE_mesh_sample.hh" #include "BKE_modifier.hh" #include "BKE_object.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "ED_screen.hh" #include "ED_view3d.hh" @@ -261,15 +261,12 @@ struct DensityAddOperationExecutor { add_inputs.uvs = new_uvs; add_inputs.interpolate_length = brush_settings_->flag & BRUSH_CURVES_SCULPT_FLAG_INTERPOLATE_LENGTH; - add_inputs.interpolate_radius = brush_settings_->flag & - BRUSH_CURVES_SCULPT_FLAG_INTERPOLATE_RADIUS; add_inputs.interpolate_shape = brush_settings_->flag & BRUSH_CURVES_SCULPT_FLAG_INTERPOLATE_SHAPE; add_inputs.interpolate_point_count = brush_settings_->flag & BRUSH_CURVES_SCULPT_FLAG_INTERPOLATE_POINT_COUNT; add_inputs.interpolate_resolution = curves_orig_->attributes().contains("resolution"); add_inputs.fallback_curve_length = brush_settings_->curve_length; - add_inputs.fallback_curve_radius = brush_settings_->curve_radius; add_inputs.fallback_point_count = std::max(2, brush_settings_->points_per_curve); add_inputs.transforms = &transforms_; add_inputs.surface = surface_orig_; diff --git a/source/blender/editors/sculpt_paint/curves_sculpt_grow_shrink.cc b/source/blender/editors/sculpt_paint/curves_sculpt_grow_shrink.cc index ad87d68bf92..ba40fe7b491 100644 --- a/source/blender/editors/sculpt_paint/curves_sculpt_grow_shrink.cc +++ b/source/blender/editors/sculpt_paint/curves_sculpt_grow_shrink.cc @@ -6,6 +6,7 @@ #include "BLI_math_vector.hh" +#include "BLI_enumerable_thread_specific.hh" #include "BLI_length_parameterize.hh" #include "BLI_math_geom.h" #include "BLI_math_matrix_types.hh" diff --git a/source/blender/editors/sculpt_paint/curves_sculpt_ops.cc b/source/blender/editors/sculpt_paint/curves_sculpt_ops.cc index bb10caaeb3e..b7aea67600d 100644 --- a/source/blender/editors/sculpt_paint/curves_sculpt_ops.cc +++ b/source/blender/editors/sculpt_paint/curves_sculpt_ops.cc @@ -296,7 +296,7 @@ static void curves_sculptmode_enter(bContext *C) paint_init_pivot(ob, scene); /* Necessary to change the object mode on the evaluated object. */ - DEG_id_tag_update(&ob->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&ob->id, ID_RECALC_COPY_ON_WRITE); WM_msg_publish_rna_prop(mbus, &ob->id, ob, Object, mode); WM_event_add_notifier(C, NC_SCENE | ND_MODE, nullptr); } @@ -330,7 +330,7 @@ static int curves_sculptmode_toggle_exec(bContext *C, wmOperator *op) WM_toolsystem_update_from_context_view3d(C); /* Necessary to change the object mode on the evaluated object. */ - DEG_id_tag_update(&ob->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&ob->id, ID_RECALC_COPY_ON_WRITE); WM_msg_publish_rna_prop(mbus, &ob->id, ob, Object, mode); WM_event_add_notifier(C, NC_SCENE | ND_MODE, nullptr); return OPERATOR_FINISHED; @@ -679,7 +679,7 @@ static void select_grow_invoke_per_curve(const Curves &curves_id, }); }); - const float4x4 &curves_to_world_mat = curves_ob.object_to_world(); + float4x4 curves_to_world_mat = float4x4(curves_ob.object_to_world); float4x4 world_to_curves_mat = math::invert(curves_to_world_mat); const float4x4 projection = ED_view3d_ob_project_mat_get(&rv3d, &curves_ob); @@ -1098,7 +1098,7 @@ static int min_distance_edit_modal(bContext *C, wmOperator *op, const wmEvent *e auto finish = [&]() { wmWindowManager *wm = CTX_wm_manager(C); - /* Remove cursor. */ + /* Remove own cursor. */ WM_paint_cursor_end(static_cast(op_data.cursor)); /* Restore original paint cursors. */ wm->paintcursors = op_data.orig_paintcursors; diff --git a/source/blender/editors/sculpt_paint/curves_sculpt_selection.cc b/source/blender/editors/sculpt_paint/curves_sculpt_selection.cc index 7be1c60d678..6bda4751388 100644 --- a/source/blender/editors/sculpt_paint/curves_sculpt_selection.cc +++ b/source/blender/editors/sculpt_paint/curves_sculpt_selection.cc @@ -6,6 +6,8 @@ #include "curves_sculpt_intern.hh" +#include "ED_curves_sculpt.hh" + namespace blender::ed::sculpt_paint { bke::SpanAttributeWriter float_selection_ensure(Curves &curves_id) diff --git a/source/blender/editors/sculpt_paint/curves_sculpt_slide.cc b/source/blender/editors/sculpt_paint/curves_sculpt_slide.cc index 3b415e7ad7c..302b317a502 100644 --- a/source/blender/editors/sculpt_paint/curves_sculpt_slide.cc +++ b/source/blender/editors/sculpt_paint/curves_sculpt_slide.cc @@ -21,7 +21,7 @@ #include "BKE_mesh_sample.hh" #include "BKE_object.hh" #include "BKE_paint.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "DNA_brush_enums.h" #include "DNA_curves_types.h" @@ -38,6 +38,8 @@ #include "GEO_add_curves_on_mesh.hh" #include "GEO_reverse_uv_sampler.hh" +#include "BLT_translation.h" + namespace blender::ed::sculpt_paint { using geometry::ReverseUVSampler; diff --git a/source/blender/editors/sculpt_paint/grease_pencil_draw_ops.cc b/source/blender/editors/sculpt_paint/grease_pencil_draw_ops.cc index 9526dd83bfd..e5bc90f7759 100644 --- a/source/blender/editors/sculpt_paint/grease_pencil_draw_ops.cc +++ b/source/blender/editors/sculpt_paint/grease_pencil_draw_ops.cc @@ -4,7 +4,7 @@ #include "BKE_context.hh" #include "BKE_grease_pencil.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "DEG_depsgraph_query.hh" @@ -19,6 +19,8 @@ #include "ANIM_keyframing.hh" #include "RNA_access.hh" +#include "RNA_define.hh" +#include "RNA_enum_types.hh" #include "WM_api.hh" #include "WM_message.hh" @@ -149,6 +151,7 @@ static int grease_pencil_brush_stroke_invoke(bContext *C, wmOperator *op, const return OPERATOR_CANCELLED; } + const int current_frame = scene->r.cfra; bke::greasepencil::Layer &active_layer = *grease_pencil.get_active_layer(); if (!active_layer.is_editable()) { @@ -156,12 +159,32 @@ static int grease_pencil_brush_stroke_invoke(bContext *C, wmOperator *op, const return OPERATOR_CANCELLED; } - /* Ensure a drawing at the current keyframe. */ - if (!ed::greasepencil::ensure_active_keyframe(*scene, grease_pencil)) { + /* If there is no drawing at the current frame and auto-key is off, then */ + if (!active_layer.has_drawing_at(current_frame) && !blender::animrig::is_autokey_on(scene)) { BKE_report(op->reports, RPT_ERROR, "No Grease Pencil frame to draw on"); return OPERATOR_CANCELLED; } + /* If auto-key is on and the drawing at the current frame starts before the current frame a new + * keyframe needs to be inserted. */ + if (blender::animrig::is_autokey_on(scene) && active_layer.frame_key_at(current_frame) && + *active_layer.frame_key_at(current_frame) < current_frame) + { + const ToolSettings *ts = CTX_data_tool_settings(C); + if ((ts->gpencil_flags & GP_TOOL_FLAG_RETAIN_LAST) != 0) { + /* For additive drawing, we duplicate the frame that's currently visible and insert it at the + * current frame. */ + grease_pencil.insert_duplicate_frame( + active_layer, *active_layer.frame_key_at(current_frame), current_frame, false); + } + else { + /* Otherwise we just insert a blank keyframe at the current frame. */ + grease_pencil.insert_blank_frame(active_layer, current_frame, 0, BEZT_KEYTYPE_KEYFRAME); + } + } + /* There should now always be a drawing at the current frame. */ + BLI_assert(active_layer.has_drawing_at(current_frame)); + op->customdata = paint_stroke_new(C, op, stroke_get_location, @@ -239,7 +262,7 @@ static void grease_pencil_draw_mode_enter(bContext *C) paint_init_pivot(ob, scene); /* Necessary to change the object mode on the evaluated object. */ - DEG_id_tag_update(&ob->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&ob->id, ID_RECALC_COPY_ON_WRITE); WM_msg_publish_rna_prop(mbus, &ob->id, ob, Object, mode); WM_event_add_notifier(C, NC_SCENE | ND_MODE, nullptr); } @@ -273,7 +296,7 @@ static int grease_pencil_draw_mode_toggle_exec(bContext *C, wmOperator *op) WM_toolsystem_update_from_context_view3d(C); /* Necessary to change the object mode on the evaluated object. */ - DEG_id_tag_update(&ob->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&ob->id, ID_RECALC_COPY_ON_WRITE); WM_msg_publish_rna_prop(mbus, &ob->id, ob, Object, mode); WM_event_add_notifier(C, NC_SCENE | ND_MODE, nullptr); return OPERATOR_FINISHED; diff --git a/source/blender/editors/sculpt_paint/grease_pencil_erase.cc b/source/blender/editors/sculpt_paint/grease_pencil_erase.cc index 5bbaa7c5c06..71f648f9ee3 100644 --- a/source/blender/editors/sculpt_paint/grease_pencil_erase.cc +++ b/source/blender/editors/sculpt_paint/grease_pencil_erase.cc @@ -16,7 +16,10 @@ #include "BKE_context.hh" #include "BKE_crazyspace.hh" #include "BKE_curves.hh" +#include "BKE_curves_utils.hh" +#include "BKE_grease_pencil.h" #include "BKE_grease_pencil.hh" +#include "BKE_scene.h" #include "DEG_depsgraph_query.hh" #include "DNA_brush_enums.h" @@ -58,7 +61,13 @@ struct EraseOperationExecutor { int2 mouse_position_pixels{}; int64_t eraser_squared_radius_pixels{}; - EraseOperationExecutor(const bContext & /*C*/) {} + bke::greasepencil::DrawingTransforms transforms_; + + EraseOperationExecutor(const bContext &C) + { + Object *object = CTX_data_active_object(&C); + transforms_ = bke::greasepencil::DrawingTransforms(*object); + } /** * Computes the intersections between a 2D line segment and a circle with integer values. @@ -382,17 +391,6 @@ struct EraseOperationExecutor { float factor; bool is_src_point; bool is_cut; - - /** - * Source point is the last of the curve. - */ - bool is_src_end_point() const - { - /* The src_next_point index increments for all points except the last, where it is set to the - * first point index. This can be used to detect the curve end from the source index alone. - */ - return is_src_point && src_point >= src_next_point; - } }; /** @@ -558,16 +556,18 @@ struct EraseOperationExecutor { threading::parallel_for(dst.curves_range(), 4096, [&](const IndexRange dst_curves) { for (const int dst_curve : dst_curves) { const IndexRange dst_curve_points = dst_points_by_curve[dst_curve]; - const PointTransferData &start_point_transfer = - dst_transfer_data[dst_curve_points.first()]; - const PointTransferData &end_point_transfer = dst_transfer_data[dst_curve_points.last()]; - - if (start_point_transfer.is_cut) { + if (dst_transfer_data[dst_curve_points.first()].is_cut) { dst_start_caps.span[dst_curve] = GP_STROKE_CAP_TYPE_FLAT; } - /* The is_cut flag does not work for end points, but any end point that isn't the source - * point must also be a cut. */ - if (!end_point_transfer.is_src_end_point()) { + + if (dst_curve == dst_curves.last()) { + continue; + } + + const PointTransferData &next_point_transfer = + dst_transfer_data[dst_points_by_curve[dst_curve + 1].first()]; + + if (next_point_transfer.is_cut) { dst_end_caps.span[dst_curve] = GP_STROKE_CAP_TYPE_FLAT; } } @@ -759,57 +759,53 @@ struct EraseOperationExecutor { GreasePencil &grease_pencil = *static_cast(obact->data); bool changed = false; - const auto execute_eraser_on_drawing = [&](const int layer_index, - const int frame_number, - Drawing &drawing) { - const Layer &layer = *grease_pencil.layers()[layer_index]; - const bke::CurvesGeometry &src = drawing.strokes(); + const auto execute_eraser_on_drawing = + [&](const int layer_index, const int frame_number, Drawing &drawing) { + const bke::CurvesGeometry &src = drawing.strokes(); - /* Evaluated geometry. */ - bke::crazyspace::GeometryDeformation deformation = - bke::crazyspace::get_evaluated_grease_pencil_drawing_deformation( - ob_eval, *obact, layer_index, frame_number); + /* Evaluated geometry. */ + bke::crazyspace::GeometryDeformation deformation = + bke::crazyspace::get_evaluated_grease_pencil_drawing_deformation( + ob_eval, *obact, layer_index, frame_number); - /* Compute screen space positions. */ - Array screen_space_positions(src.points_num()); - threading::parallel_for(src.points_range(), 4096, [&](const IndexRange src_points) { - for (const int src_point : src_points) { - ED_view3d_project_float_global(region, - math::transform_point(layer.to_world_space(*ob_eval), - deformation.positions[src_point]), - screen_space_positions[src_point], - V3D_PROJ_TEST_NOP); - } - }); + /* Compute screen space positions. */ + Array screen_space_positions(src.points_num()); + threading::parallel_for(src.points_range(), 4096, [&](const IndexRange src_points) { + for (const int src_point : src_points) { + ED_view3d_project_float_global( + region, + math::transform_point(transforms_.layer_space_to_world_space, + deformation.positions[src_point]), + screen_space_positions[src_point], + V3D_PROJ_TEST_NOP); + } + }); - /* Erasing operator. */ - bke::CurvesGeometry dst; - bool erased = false; - switch (self.eraser_mode) { - case GP_BRUSH_ERASER_STROKE: - erased = stroke_eraser(src, screen_space_positions, dst); - break; - case GP_BRUSH_ERASER_HARD: - erased = hard_eraser(src, screen_space_positions, dst, self.keep_caps); - break; - case GP_BRUSH_ERASER_SOFT: - // To be implemented - return; - } + /* Erasing operator. */ + bke::CurvesGeometry dst; + bool erased = false; + switch (self.eraser_mode) { + case GP_BRUSH_ERASER_STROKE: + erased = stroke_eraser(src, screen_space_positions, dst); + break; + case GP_BRUSH_ERASER_HARD: + erased = hard_eraser(src, screen_space_positions, dst, self.keep_caps); + break; + case GP_BRUSH_ERASER_SOFT: + // To be implemented + return; + } - if (erased) { - /* Set the new geometry. */ - drawing.geometry.wrap() = std::move(dst); - drawing.tag_topology_changed(); - changed = true; - } - }; + if (erased) { + /* Set the new geometry. */ + drawing.geometry.wrap() = std::move(dst); + drawing.tag_topology_changed(); + changed = true; + } + }; if (self.active_layer_only) { /* Erase only on the drawing at the current frame of the active layer. */ - if (!grease_pencil.has_active_layer()) { - return; - } const Layer &active_layer = *grease_pencil.get_active_layer(); Drawing *drawing = grease_pencil.get_editable_drawing_at(active_layer, scene->r.cfra); @@ -818,11 +814,11 @@ struct EraseOperationExecutor { } execute_eraser_on_drawing( - *grease_pencil.get_layer_index(active_layer), scene->r.cfra, *drawing); + active_layer.drawing_index_at(scene->r.cfra), scene->r.cfra, *drawing); } else { /* Erase on all editable drawings. */ - const Vector drawings = + const Array drawings = ed::greasepencil::retrieve_editable_drawings(*scene, grease_pencil); threading::parallel_for_each( drawings, [&](const ed::greasepencil::MutableDrawingInfo &info) { @@ -843,9 +839,6 @@ void EraseOperation::on_stroke_begin(const bContext &C, const InputSample & /*st Paint *paint = BKE_paint_get_active_from_context(&C); Brush *brush = BKE_paint_brush(paint); - if (brush->gpencil_settings == nullptr) { - BKE_brush_init_gpencil_settings(brush); - } BLI_assert(brush->gpencil_settings != nullptr); BKE_curvemapping_init(brush->gpencil_settings->curve_strength); diff --git a/source/blender/editors/sculpt_paint/grease_pencil_paint.cc b/source/blender/editors/sculpt_paint/grease_pencil_paint.cc index 68a83984a48..d3611e4a90b 100644 --- a/source/blender/editors/sculpt_paint/grease_pencil_paint.cc +++ b/source/blender/editors/sculpt_paint/grease_pencil_paint.cc @@ -7,8 +7,10 @@ #include "BKE_colortools.hh" #include "BKE_context.hh" #include "BKE_curves.hh" +#include "BKE_grease_pencil.h" #include "BKE_grease_pencil.hh" #include "BKE_material.h" +#include "BKE_scene.h" #include "BLI_length_parameterize.hh" #include "BLI_math_color.h" @@ -16,7 +18,6 @@ #include "DEG_depsgraph_query.hh" -#include "ED_curves.hh" #include "ED_grease_pencil.hh" #include "ED_view3d.hh" @@ -130,7 +131,7 @@ class PaintOperation : public GreasePencilStrokeOperation { private: void simplify_stroke(bke::greasepencil::Drawing &drawing, float epsilon_px); - void process_stroke_end(const bContext &C, bke::greasepencil::Drawing &drawing); + void process_stroke_end(bke::greasepencil::Drawing &drawing); }; /** @@ -145,7 +146,6 @@ struct PaintOperationExecutor { BrushGpencilSettings *settings_; float4 vertex_color_; - float hardness_; bke::greasepencil::Drawing *drawing_; @@ -170,8 +170,6 @@ struct PaintOperationExecutor { settings_->vertex_factor) : float4(0.0f); srgb_to_linearrgb_v4(vertex_color_, vertex_color_); - /* TODO: UI setting. */ - hardness_ = 1.0f; // const bool use_vertex_color_fill = use_vertex_color && ELEM( // brush->gpencil_settings->vertex_mode, GPPAINT_MODE_STROKE, GPPAINT_MODE_BOTH); @@ -235,32 +233,11 @@ struct PaintOperationExecutor { "material_index", bke::AttrDomain::Curve); bke::SpanAttributeWriter cyclic = attributes.lookup_or_add_for_write_span( "cyclic", bke::AttrDomain::Curve); - bke::SpanAttributeWriter hardnesses = attributes.lookup_or_add_for_write_span( - "hardness", - bke::AttrDomain::Curve, - bke::AttributeInitVArray(VArray::ForSingle(1.0f, curves.curves_num()))); cyclic.span.last() = false; materials.span.last() = material_index; - hardnesses.span.last() = hardness_; - - /* Only set the attribute if the type is not the default or if it already exists. */ - if (settings_->caps_type != GP_STROKE_CAP_TYPE_ROUND || attributes.contains("start_cap")) { - bke::SpanAttributeWriter start_caps = - attributes.lookup_or_add_for_write_span("start_cap", bke::AttrDomain::Curve); - start_caps.span.last() = settings_->caps_type; - start_caps.finish(); - } - - if (settings_->caps_type != GP_STROKE_CAP_TYPE_ROUND || attributes.contains("end_cap")) { - bke::SpanAttributeWriter end_caps = attributes.lookup_or_add_for_write_span( - "end_cap", bke::AttrDomain::Curve); - end_caps.span.last() = settings_->caps_type; - end_caps.finish(); - } cyclic.finish(); materials.finish(); - hardnesses.finish(); curves.curve_types_for_write().last() = CURVE_TYPE_POLY; curves.update_curve_types(); @@ -270,11 +247,10 @@ struct PaintOperationExecutor { bke::AttrDomain::Point, {"position", "radius", "opacity", "vertex_color"}, curves.points_range().take_back(1)); - bke::fill_attribute_range_default( - attributes, - bke::AttrDomain::Curve, - {"curve_type", "material_index", "cyclic", "hardness", "start_cap", "end_cap"}, - curves.curves_range().take_back(1)); + bke::fill_attribute_range_default(attributes, + bke::AttrDomain::Curve, + {"curve_type", "material_index", "cyclic"}, + curves.curves_range().take_back(1)); drawing_->tag_topology_changed(); } @@ -448,21 +424,15 @@ struct PaintOperationExecutor { void PaintOperation::on_stroke_begin(const bContext &C, const InputSample &start_sample) { - Depsgraph *depsgraph = CTX_data_depsgraph_pointer(&C); ARegion *region = CTX_wm_region(&C); View3D *view3d = CTX_wm_view3d(&C); Scene *scene = CTX_data_scene(&C); Object *object = CTX_data_active_object(&C); - Object *eval_object = DEG_get_evaluated_object(depsgraph, object); GreasePencil *grease_pencil = static_cast(object->data); Paint *paint = &scene->toolsettings->gp_paint->paint; Brush *brush = BKE_paint_brush(paint); - if (brush->gpencil_settings == nullptr) { - BKE_brush_init_gpencil_settings(brush); - } - BKE_curvemapping_init(brush->gpencil_settings->curve_sensitivity); BKE_curvemapping_init(brush->gpencil_settings->curve_strength); BKE_curvemapping_init(brush->gpencil_settings->curve_jitter); @@ -474,8 +444,7 @@ void PaintOperation::on_stroke_begin(const bContext &C, const InputSample &start BKE_curvemapping_init(brush->gpencil_settings->curve_rand_value); /* Initialize helper class for projecting screen space coordinates. */ - placement_ = ed::greasepencil::DrawingPlacement( - *scene, *region, *view3d, *eval_object, *grease_pencil->get_active_layer()); + placement_ = ed::greasepencil::DrawingPlacement(*scene, *region, *view3d, *object); if (placement_.use_project_to_surface()) { placement_.cache_viewport_depths(CTX_data_depsgraph_pointer(&C), region, view3d); } @@ -554,9 +523,8 @@ void PaintOperation::simplify_stroke(bke::greasepencil::Drawing &drawing, const } } -void PaintOperation::process_stroke_end(const bContext &C, bke::greasepencil::Drawing &drawing) +void PaintOperation::process_stroke_end(bke::greasepencil::Drawing &drawing) { - Scene *scene = CTX_data_scene(&C); const int stroke_index = drawing.strokes().curves_range().last(); const IndexRange points = drawing.strokes().points_by_curve()[stroke_index]; bke::CurvesGeometry &curves = drawing.strokes_for_write(); @@ -576,21 +544,6 @@ void PaintOperation::process_stroke_end(const bContext &C, bke::greasepencil::Dr curves.resize(curves.points_num() - points_to_remove, curves.curves_num()); curves.offsets_for_write().last() = curves.points_num(); } - - const bke::AttrDomain selection_domain = ED_grease_pencil_selection_domain_get( - scene->toolsettings); - - bke::GSpanAttributeWriter selection = ed::curves::ensure_selection_attribute( - curves, selection_domain, CD_PROP_BOOL); - - if (selection_domain == bke::AttrDomain::Curve) { - ed::curves::fill_selection_false(selection.span.slice(IndexRange(stroke_index, 1))); - } - else if (selection_domain == bke::AttrDomain::Point) { - ed::curves::fill_selection_false(selection.span.slice(points)); - } - - selection.finish(); } void PaintOperation::on_stroke_done(const bContext &C) @@ -612,7 +565,7 @@ void PaintOperation::on_stroke_done(const bContext &C) const float simplifiy_threshold_px = 0.5f; this->simplify_stroke(drawing, simplifiy_threshold_px); - this->process_stroke_end(C, drawing); + this->process_stroke_end(drawing); drawing.tag_topology_changed(); DEG_id_tag_update(&grease_pencil.id, ID_RECALC_GEOMETRY); diff --git a/source/blender/editors/sculpt_paint/paint_cursor.cc b/source/blender/editors/sculpt_paint/paint_cursor.cc index ca9db0a0c16..8c5a37aece4 100644 --- a/source/blender/editors/sculpt_paint/paint_cursor.cc +++ b/source/blender/editors/sculpt_paint/paint_cursor.cc @@ -1098,7 +1098,7 @@ static void cursor_draw_tiling_preview(const uint gpuattr, for (int dim = 0; dim < 3; dim++) { location[dim] = cur[dim] * step[dim] + orgLoc[dim]; } - cursor_draw_point_screen_space(gpuattr, region, location, ob->object_to_world().ptr(), 3); + cursor_draw_point_screen_space(gpuattr, region, location, ob->object_to_world, 3); } } } @@ -1120,7 +1120,7 @@ static void cursor_draw_point_with_symmetry(const uint gpuattr, /* Axis Symmetry. */ flip_v3_v3(location, true_location, ePaintSymmetryFlags(i)); - cursor_draw_point_screen_space(gpuattr, region, location, ob->object_to_world().ptr(), 3); + cursor_draw_point_screen_space(gpuattr, region, location, ob->object_to_world, 3); /* Tiling. */ cursor_draw_tiling_preview(gpuattr, region, location, sd, ob, radius); @@ -1135,8 +1135,7 @@ static void cursor_draw_point_with_symmetry(const uint gpuattr, mul_m4_v3(symm_rot_mat, location); cursor_draw_tiling_preview(gpuattr, region, location, sd, ob, radius); - cursor_draw_point_screen_space( - gpuattr, region, location, ob->object_to_world().ptr(), 3); + cursor_draw_point_screen_space(gpuattr, region, location, ob->object_to_world, 3); } } } @@ -1377,7 +1376,7 @@ static void paint_cursor_update_pixel_radius(PaintCursorContext *pcontext) } copy_v3_v3(pcontext->scene_space_location, pcontext->location); - mul_m4_v3(pcontext->vc.obact->object_to_world().ptr(), pcontext->scene_space_location); + mul_m4_v3(pcontext->vc.obact->object_to_world, pcontext->scene_space_location); } else { Sculpt *sd = CTX_data_tool_settings(pcontext->C)->sculpt; @@ -1658,7 +1657,7 @@ static void paint_cursor_drawing_setup_cursor_space(PaintCursorContext *pcontext float cursor_trans[4][4], cursor_rot[4][4]; const float z_axis[4] = {0.0f, 0.0f, 1.0f, 0.0f}; float quat[4]; - copy_m4_m4(cursor_trans, pcontext->vc.obact->object_to_world().ptr()); + copy_m4_m4(cursor_trans, pcontext->vc.obact->object_to_world); translate_m4(cursor_trans, pcontext->location[0], pcontext->location[1], pcontext->location[2]); rotation_between_vecs_to_quat(quat, z_axis, pcontext->normal); quat_to_mat4(cursor_rot, quat); @@ -1702,7 +1701,7 @@ static void paint_cursor_pose_brush_origins_draw(PaintCursorContext *pcontext) cursor_draw_point_screen_space(pcontext->pos, pcontext->region, ss->pose_ik_chain_preview->segments[i].initial_orig, - pcontext->vc.obact->object_to_world().ptr(), + pcontext->vc.obact->object_to_world, 3); } } @@ -1720,7 +1719,7 @@ static void paint_cursor_preview_boundary_data_pivot_draw(PaintCursorContext *pc pcontext->pos, pcontext->region, SCULPT_vertex_co_get(pcontext->ss, pcontext->ss->boundary_preview->pivot_vertex), - pcontext->vc.obact->object_to_world().ptr(), + pcontext->vc.obact->object_to_world, 3); } @@ -1829,7 +1828,7 @@ static void paint_cursor_draw_3d_view_brush_cursor_inactive(PaintCursorContext * pcontext->pos, pcontext->region, SCULPT_vertex_co_get(pcontext->ss, pcontext->ss->expand_cache->initial_active_vertex), - pcontext->vc.obact->object_to_world().ptr(), + pcontext->vc.obact->object_to_world, 2); } @@ -1851,7 +1850,7 @@ static void paint_cursor_draw_3d_view_brush_cursor_inactive(PaintCursorContext * nullptr); GPU_matrix_push(); - GPU_matrix_mul(pcontext->vc.obact->object_to_world().ptr()); + GPU_matrix_mul(pcontext->vc.obact->object_to_world); /* Drawing Cursor overlays in 3D object space. */ if (is_brush_tool && brush->sculpt_tool == SCULPT_TOOL_GRAB && @@ -1945,7 +1944,7 @@ static void paint_cursor_cursor_draw_3d_view_brush_cursor_active(PaintCursorCont nullptr, nullptr); GPU_matrix_push(); - GPU_matrix_mul(pcontext->vc.obact->object_to_world().ptr()); + GPU_matrix_mul(pcontext->vc.obact->object_to_world); /* Draw the special active cursors different tools may have. */ diff --git a/source/blender/editors/sculpt_paint/paint_curve.cc b/source/blender/editors/sculpt_paint/paint_curve.cc index 107ded2d8f0..7c5e0c34a6e 100644 --- a/source/blender/editors/sculpt_paint/paint_curve.cc +++ b/source/blender/editors/sculpt_paint/paint_curve.cc @@ -19,9 +19,10 @@ #include "BLI_math_vector.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_context.hh" +#include "BKE_main.hh" #include "BKE_paint.hh" #include "ED_paint.hh" diff --git a/source/blender/editors/sculpt_paint/paint_curve_undo.cc b/source/blender/editors/sculpt_paint/paint_curve_undo.cc index cf4fa3649d3..b33cfbee5e4 100644 --- a/source/blender/editors/sculpt_paint/paint_curve_undo.cc +++ b/source/blender/editors/sculpt_paint/paint_curve_undo.cc @@ -12,6 +12,7 @@ #include "DNA_brush_types.h" +#include "BKE_context.hh" #include "BKE_paint.hh" #include "BKE_undo_system.hh" diff --git a/source/blender/editors/sculpt_paint/paint_hide.cc b/source/blender/editors/sculpt_paint/paint_hide.cc index 7eeef2a4e43..95c913eaec6 100644 --- a/source/blender/editors/sculpt_paint/paint_hide.cc +++ b/source/blender/editors/sculpt_paint/paint_hide.cc @@ -123,10 +123,11 @@ enum class VisAction { Show = 1, }; -struct HideShowOperation { - gesture::Operation op; - - VisAction action; +enum VisArea { + Inside = 0, + Outside = 1, + All = 2, + Masked = 3, }; static bool action_to_hide(const VisAction action) @@ -134,6 +135,23 @@ static bool action_to_hide(const VisAction action) return action == VisAction::Hide; } +/* Return true if the element should be hidden/shown. */ +static bool is_effected(const VisArea area, + const float planes[4][4], + const float co[3], + const float mask) +{ + if (area == VisArea::All) { + return true; + } + if (area == VisArea::Masked) { + return mask > 0.5f; + } + + const bool inside = isect_point_planes_v3(planes, 4, co); + return ((inside && area == VisArea::Inside) || (!inside && area == VisArea::Outside)); +} + void mesh_show_all(Object &object, const Span nodes) { Mesh &mesh = *static_cast(object.data); @@ -197,10 +215,13 @@ static void vert_hide_update(Object &object, } } -static void partialvis_all_update_mesh(Object &object, - const VisAction action, - const Span nodes) +static void partialvis_update_mesh(Object &object, + const VisAction action, + const VisArea area, + const float planes[4][4], + const Span nodes) { + PBVH &pbvh = *object.sculpt->pbvh; Mesh &mesh = *static_cast(object.data); bke::MutableAttributeAccessor attributes = mesh.attributes_for_write(); if (action == VisAction::Show && !attributes.contains(".hide_vert")) { @@ -208,70 +229,50 @@ static void partialvis_all_update_mesh(Object &object, return; } - switch (action) { - case VisAction::Hide: - vert_hide_update(object, nodes, [&](const Span /*verts*/, MutableSpan hide) { - hide.fill(true); + const bool value = action_to_hide(action); + switch (area) { + case VisArea::Inside: + case VisArea::Outside: { + const Span positions = BKE_pbvh_get_vert_positions(&pbvh); + vert_hide_update(object, nodes, [&](const Span verts, MutableSpan hide) { + for (const int i : verts.index_range()) { + if (isect_point_planes_v3(planes, 4, positions[verts[i]]) == (area == VisArea::Inside)) { + hide[i] = value; + } + } }); break; - case VisAction::Show: - mesh_show_all(object, nodes); - break; - } -} - -static void partialvis_masked_update_mesh(Object &object, - const VisAction action, - const Span nodes) -{ - Mesh &mesh = *static_cast(object.data); - bke::MutableAttributeAccessor attributes = mesh.attributes_for_write(); - if (action == VisAction::Show && !attributes.contains(".hide_vert")) { - /* If everything is already visible, don't do anything. */ - return; - } - - const bool value = action_to_hide(action); - const VArraySpan mask = *attributes.lookup(".sculpt_mask", bke::AttrDomain::Point); - if (action == VisAction::Show && mask.is_empty()) { - mesh_show_all(object, nodes); - } - else if (!mask.is_empty()) { - vert_hide_update(object, nodes, [&](const Span verts, MutableSpan hide) { - for (const int i : verts.index_range()) { - if (mask[verts[i]] > 0.5f) { - hide[i] = value; - } - } - }); - } -} - -static void partialvis_gesture_update_mesh(gesture::GestureData &gesture_data) -{ - HideShowOperation *operation = reinterpret_cast(gesture_data.operation); - Object *object = gesture_data.vc.obact; - const VisAction action = operation->action; - const Span nodes = gesture_data.nodes; - - PBVH *pbvh = object->sculpt->pbvh; - Mesh *mesh = static_cast(object->data); - bke::MutableAttributeAccessor attributes = mesh->attributes_for_write(); - if (action == VisAction::Show && !attributes.contains(".hide_vert")) { - /* If everything is already visible, don't do anything. */ - return; - } - - const bool value = action_to_hide(action); - const Span positions = BKE_pbvh_get_vert_positions(pbvh); - const Span normals = BKE_pbvh_get_vert_normals(pbvh); - vert_hide_update(*object, nodes, [&](const Span verts, MutableSpan hide) { - for (const int i : verts.index_range()) { - if (gesture::is_affected(gesture_data, positions[verts[i]], normals[verts[i]])) { - hide[i] = value; - } } - }); + case VisArea::All: + switch (action) { + case VisAction::Hide: + vert_hide_update(object, nodes, [&](const Span /*verts*/, MutableSpan hide) { + hide.fill(true); + }); + break; + case VisAction::Show: + mesh_show_all(object, nodes); + break; + } + break; + case VisArea::Masked: { + const VArraySpan mask = *attributes.lookup(".sculpt_mask", + bke::AttrDomain::Point); + if (action == VisAction::Show && mask.is_empty()) { + mesh_show_all(object, nodes); + } + else if (!mask.is_empty()) { + vert_hide_update(object, nodes, [&](const Span verts, MutableSpan hide) { + for (const int i : verts.index_range()) { + if (mask[verts[i]] > 0.5f) { + hide[i] = value; + } + } + }); + } + break; + } + } } void grids_show_all(Depsgraph &depsgraph, Object &object, const Span nodes) @@ -355,94 +356,97 @@ static void grid_hide_update(Depsgraph &depsgraph, } } -static void partialvis_all_update_grids(Depsgraph &depsgraph, - Object &object, - const VisAction action, - const Span nodes) -{ - switch (action) { - case VisAction::Hide: - grid_hide_update(depsgraph, - object, - nodes, - [&](const int /*verts*/, MutableBoundedBitSpan hide) { hide.fill(true); }); - break; - case VisAction::Show: - grids_show_all(depsgraph, object, nodes); - break; - } -} - -static void partialvis_masked_update_grids(Depsgraph &depsgraph, - Object &object, - const VisAction action, - const Span nodes) +static void partialvis_update_grids(Depsgraph &depsgraph, + Object &object, + const VisAction action, + const VisArea area, + const float planes[4][4], + const Span nodes) { PBVH &pbvh = *object.sculpt->pbvh; SubdivCCG &subdiv_ccg = *object.sculpt->subdiv_ccg; + if (action == VisAction::Show && area == VisArea::All) { + grids_show_all(depsgraph, object, nodes); + return; + } const bool value = action_to_hide(action); - const CCGKey key = *BKE_pbvh_get_grid_key(&pbvh); - const Span grids = subdiv_ccg.grids; - if (!key.has_mask) { - grid_hide_update(depsgraph, - object, - nodes, - [&](const int /*verts*/, MutableBoundedBitSpan hide) { hide.fill(value); }); - } - else { - grid_hide_update( - depsgraph, object, nodes, [&](const int grid_index, MutableBoundedBitSpan hide) { - CCGElem *grid = grids[grid_index]; - for (const int y : IndexRange(key.grid_size)) { - for (const int x : IndexRange(key.grid_size)) { - CCGElem *elem = CCG_grid_elem(&key, grid, x, y); - if (*CCG_elem_mask(&key, elem) > 0.5f) { - hide[y * key.grid_size + x].set(value); + switch (area) { + case VisArea::Inside: + case VisArea::Outside: { + const CCGKey key = *BKE_pbvh_get_grid_key(&pbvh); + const Span grids = subdiv_ccg.grids; + grid_hide_update( + depsgraph, object, nodes, [&](const int grid_index, MutableBoundedBitSpan hide) { + CCGElem *grid = grids[grid_index]; + for (const int y : IndexRange(key.grid_size)) { + for (const int x : IndexRange(key.grid_size)) { + CCGElem *elem = CCG_grid_elem(&key, grid, x, y); + if (isect_point_planes_v3(planes, 4, CCG_elem_co(&key, elem)) == + (area == VisArea::Inside)) + { + hide[y * key.grid_size + x].set(value); + } } } - } - }); + }); + break; + } + case VisArea::All: + switch (action) { + case VisAction::Hide: + grid_hide_update( + depsgraph, object, nodes, [&](const int /*verts*/, MutableBoundedBitSpan hide) { + hide.fill(true); + }); + break; + case VisAction::Show: + grids_show_all(depsgraph, object, nodes); + break; + } + break; + case VisArea::Masked: { + const CCGKey key = *BKE_pbvh_get_grid_key(&pbvh); + const Span grids = subdiv_ccg.grids; + if (!key.has_mask) { + grid_hide_update( + depsgraph, object, nodes, [&](const int /*verts*/, MutableBoundedBitSpan hide) { + hide.fill(value); + }); + } + else { + grid_hide_update( + depsgraph, object, nodes, [&](const int grid_index, MutableBoundedBitSpan hide) { + CCGElem *grid = grids[grid_index]; + for (const int y : IndexRange(key.grid_size)) { + for (const int x : IndexRange(key.grid_size)) { + CCGElem *elem = CCG_grid_elem(&key, grid, x, y); + if (*CCG_elem_mask(&key, elem) > 0.5f) { + hide[y * key.grid_size + x].set(value); + } + } + } + }); + } + break; + } } } -static void partialvis_gesture_update_grids(Depsgraph &depsgraph, - gesture::GestureData &gesture_data) -{ - HideShowOperation *operation = reinterpret_cast(gesture_data.operation); - Object *object = gesture_data.vc.obact; - const VisAction action = operation->action; - const Span nodes = gesture_data.nodes; - - PBVH *pbvh = object->sculpt->pbvh; - SubdivCCG *subdiv_ccg = object->sculpt->subdiv_ccg; - - const bool value = action_to_hide(action); - const CCGKey key = *BKE_pbvh_get_grid_key(pbvh); - const Span grids = subdiv_ccg->grids; - grid_hide_update( - depsgraph, *object, nodes, [&](const int grid_index, MutableBoundedBitSpan hide) { - CCGElem *grid = grids[grid_index]; - for (const int y : IndexRange(key.grid_size)) { - for (const int x : IndexRange(key.grid_size)) { - CCGElem *elem = CCG_grid_elem(&key, grid, x, y); - if (gesture::is_affected( - gesture_data, CCG_elem_co(&key, elem), CCG_elem_no(&key, elem))) { - hide[y * key.grid_size + x].set(value); - } - } - } - }); -} - -static void partialvis_update_bmesh_verts(const Set &verts, +static void partialvis_update_bmesh_verts(BMesh *bm, + const Set &verts, const VisAction action, - const FunctionRef should_update, + const VisArea area, + const float planes[4][4], bool *any_changed, bool *any_visible) { + const int mask_offset = CustomData_get_offset_named(&bm->vdata, CD_PROP_FLOAT, ".sculpt_mask"); for (BMVert *v : verts) { - if (should_update(v)) { + const float vmask = BM_ELEM_CD_GET_FLOAT(v, mask_offset); + + /* Hide vertex if in the hide volume. */ + if (is_effected(area, planes, v->co, vmask)) { if (action == VisAction::Hide) { BM_elem_flag_enable(v, BM_ELEM_HIDDEN); } @@ -470,22 +474,35 @@ static void partialvis_update_bmesh_faces(const Set &faces) } } -static void partialvis_update_bmesh_nodes(Object *ob, - const Span nodes, - const VisAction action, - const FunctionRef vert_test_fn) +static void partialvis_update_bmesh(Object *ob, + PBVH *pbvh, + const VisAction action, + const VisArea area, + const float planes[4][4], + const Span nodes) { + BMesh *bm = BKE_pbvh_get_bmesh(pbvh); for (PBVHNode *node : nodes) { bool any_changed = false; bool any_visible = false; undo::push_node(ob, node, undo::Type::HideVert); - partialvis_update_bmesh_verts( - BKE_pbvh_bmesh_node_unique_verts(node), action, vert_test_fn, &any_changed, &any_visible); + partialvis_update_bmesh_verts(bm, + BKE_pbvh_bmesh_node_unique_verts(node), + action, + area, + planes, + &any_changed, + &any_visible); - partialvis_update_bmesh_verts( - BKE_pbvh_bmesh_node_other_verts(node), action, vert_test_fn, &any_changed, &any_visible); + partialvis_update_bmesh_verts(bm, + BKE_pbvh_bmesh_node_other_verts(node), + action, + area, + planes, + &any_changed, + &any_visible); /* Finally loop over node faces and tag the ones that are fully hidden. */ partialvis_update_bmesh_faces(BKE_pbvh_bmesh_node_faces(node)); @@ -497,97 +514,74 @@ static void partialvis_update_bmesh_nodes(Object *ob, } } -static void partialvis_masked_update_bmesh(Object *ob, - PBVH *pbvh, - const VisAction action, - const Span nodes) +static void rect_from_props(rcti *rect, PointerRNA *ptr) { - BMesh *bm = BKE_pbvh_get_bmesh(pbvh); - const int mask_offset = CustomData_get_offset_named(&bm->vdata, CD_PROP_FLOAT, ".sculpt_mask"); - const auto mask_test_fn = [&](const BMVert *v) { - const float vmask = BM_ELEM_CD_GET_FLOAT(v, mask_offset); - return vmask > 0.5f; - }; - - partialvis_update_bmesh_nodes(ob, nodes, action, mask_test_fn); + rect->xmin = RNA_int_get(ptr, "xmin"); + rect->ymin = RNA_int_get(ptr, "ymin"); + rect->xmax = RNA_int_get(ptr, "xmax"); + rect->ymax = RNA_int_get(ptr, "ymax"); } -static void partialvis_all_update_bmesh(Object *ob, - const VisAction action, - const Span nodes) +static void clip_planes_from_rect(bContext *C, + Depsgraph *depsgraph, + float clip_planes[4][4], + const rcti *rect) { - partialvis_update_bmesh_nodes(ob, nodes, action, [](const BMVert * /*vert*/) { return true; }); + view3d_operator_needs_opengl(C); + ViewContext vc = ED_view3d_viewcontext_init(C, depsgraph); + BoundBox bb; + ED_view3d_clipping_calc(&bb, clip_planes, vc.region, vc.obact, rect); } -static void partialvis_gesture_update_bmesh(gesture::GestureData &gesture_data) +/* If mode is inside, get all PBVH nodes that lie at least partially + * inside the clip_planes volume. If mode is outside, get all nodes + * that lie at least partially outside the volume. If showing all, get + * all nodes. */ +static Vector get_pbvh_nodes(PBVH *pbvh, + const float clip_planes[4][4], + const VisArea area) { - const auto selection_test_fn = [&](const BMVert *v) { - return gesture::is_affected(gesture_data, v->co, v->no); - }; - - HideShowOperation *operation = reinterpret_cast(gesture_data.operation); - - partialvis_update_bmesh_nodes( - gesture_data.vc.obact, gesture_data.nodes, operation->action, selection_test_fn); + PBVHFrustumPlanes frustum{}; + frustum.planes = const_cast(clip_planes); + frustum.num_planes = 4; + return bke::pbvh::search_gather(pbvh, [&](PBVHNode &node) { + switch (area) { + case VisArea::Inside: + return BKE_pbvh_node_frustum_contain_AABB(&node, &frustum); + case VisArea::Outside: + return BKE_pbvh_node_frustum_exclude_AABB(&node, &frustum); + case VisArea::All: + case VisArea::Masked: + return true; + } + BLI_assert_unreachable(); + return true; + }); } -static void hide_show_begin(bContext &C, gesture::GestureData & /*gesture_data*/) -{ - Object *ob = CTX_data_active_object(&C); - Depsgraph *depsgraph = CTX_data_ensure_evaluated_depsgraph(&C); - - BKE_sculpt_object_pbvh_ensure(depsgraph, ob); -} - -static void hide_show_apply_for_symmetry_pass(bContext &C, gesture::GestureData &gesture_data) -{ - Depsgraph *depsgraph = CTX_data_depsgraph_pointer(&C); - - switch (BKE_pbvh_type(gesture_data.ss->pbvh)) { - case PBVH_FACES: - partialvis_gesture_update_mesh(gesture_data); - break; - case PBVH_GRIDS: - partialvis_gesture_update_grids(*depsgraph, gesture_data); - break; - case PBVH_BMESH: - partialvis_gesture_update_bmesh(gesture_data); - break; - } -} -static void hide_show_end(bContext &C, gesture::GestureData &gesture_data) -{ - SCULPT_topology_islands_invalidate(gesture_data.vc.obact->sculpt); - tag_update_visibility(C); -} - -static void hide_show_init_properties(bContext & /*C*/, - gesture::GestureData &gesture_data, - wmOperator &op) -{ - gesture_data.operation = reinterpret_cast( - MEM_cnew(__func__)); - - HideShowOperation *operation = reinterpret_cast(gesture_data.operation); - - operation->op.begin = hide_show_begin; - operation->op.apply_for_symmetry_pass = hide_show_apply_for_symmetry_pass; - operation->op.end = hide_show_end; - - operation->action = VisAction(RNA_enum_get(op.ptr, "action")); - gesture_data.selection_type = gesture::SelectionType(RNA_enum_get(op.ptr, "area")); -} - -static int hide_show_all_exec(bContext *C, wmOperator *op) +static int hide_show_exec(bContext *C, wmOperator *op) { Object *ob = CTX_data_active_object(C); Depsgraph *depsgraph = CTX_data_ensure_evaluated_depsgraph(C); + /* Read operator properties. */ const VisAction action = VisAction(RNA_enum_get(op->ptr, "action")); + const VisArea area = VisArea(RNA_enum_get(op->ptr, "area")); + + rcti rect; + rect_from_props(&rect, op->ptr); + + float clip_planes[4][4]; + clip_planes_from_rect(C, depsgraph, clip_planes, &rect); PBVH *pbvh = BKE_sculpt_object_pbvh_ensure(depsgraph, ob); BLI_assert(BKE_object_sculpt_pbvh_get(ob) == pbvh); + Vector nodes = get_pbvh_nodes(pbvh, clip_planes, area); + const PBVHType pbvh_type = BKE_pbvh_type(pbvh); + + negate_m4(clip_planes); + /* Start undo. */ switch (action) { case VisAction::Hide: @@ -598,17 +592,15 @@ static int hide_show_all_exec(bContext *C, wmOperator *op) break; } - Vector nodes = bke::pbvh::search_gather(pbvh, {}); - - switch (BKE_pbvh_type(pbvh)) { + switch (pbvh_type) { case PBVH_FACES: - partialvis_all_update_mesh(*ob, action, nodes); + partialvis_update_mesh(*ob, action, area, clip_planes, nodes); break; case PBVH_GRIDS: - partialvis_all_update_grids(*depsgraph, *ob, action, nodes); + partialvis_update_grids(*depsgraph, *ob, action, area, clip_planes, nodes); break; case PBVH_BMESH: - partialvis_all_update_bmesh(ob, action, nodes); + partialvis_update_bmesh(ob, pbvh, action, area, clip_planes, nodes); break; } @@ -621,72 +613,16 @@ static int hide_show_all_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } -static int hide_show_masked_exec(bContext *C, wmOperator *op) +static int hide_show_invoke(bContext *C, wmOperator *op, const wmEvent *event) { - Object *ob = CTX_data_active_object(C); - Depsgraph *depsgraph = CTX_data_ensure_evaluated_depsgraph(C); - - const VisAction action = VisAction(RNA_enum_get(op->ptr, "action")); - - PBVH *pbvh = BKE_sculpt_object_pbvh_ensure(depsgraph, ob); - BLI_assert(BKE_object_sculpt_pbvh_get(ob) == pbvh); - - /* Start undo. */ - switch (action) { - case VisAction::Hide: - undo::push_begin_ex(ob, "Hide area"); - break; - case VisAction::Show: - undo::push_begin_ex(ob, "Show area"); - break; + const VisArea area = VisArea(RNA_enum_get(op->ptr, "area")); + if (!ELEM(area, VisArea::All, VisArea::Masked)) { + return WM_gesture_box_invoke(C, op, event); } - - Vector nodes = bke::pbvh::search_gather(pbvh, {}); - - switch (BKE_pbvh_type(pbvh)) { - case PBVH_FACES: - partialvis_masked_update_mesh(*ob, action, nodes); - break; - case PBVH_GRIDS: - partialvis_masked_update_grids(*depsgraph, *ob, action, nodes); - break; - case PBVH_BMESH: - partialvis_masked_update_bmesh(ob, pbvh, action, nodes); - break; - } - - /* End undo. */ - undo::push_end(ob); - - SCULPT_topology_islands_invalidate(ob->sculpt); - tag_update_visibility(*C); - - return OPERATOR_FINISHED; + return op->type->exec(C, op); } -static int hide_show_gesture_box_exec(bContext *C, wmOperator *op) -{ - std::unique_ptr gesture_data = gesture::init_from_box(C, op); - if (!gesture_data) { - return OPERATOR_CANCELLED; - } - hide_show_init_properties(*C, *gesture_data, *op); - gesture::apply(*C, *gesture_data, *op); - return OPERATOR_FINISHED; -} - -static int hide_show_gesture_lasso_exec(bContext *C, wmOperator *op) -{ - std::unique_ptr gesture_data = gesture::init_from_lasso(C, op); - if (!gesture_data) { - return OPERATOR_CANCELLED; - } - hide_show_init_properties(*C, *gesture_data, *op); - gesture::apply(*C, *gesture_data, *op); - return OPERATOR_FINISHED; -} - -static void hide_show_operator_properties(wmOperatorType *ot) +void PAINT_OT_hide_show(wmOperatorType *ot) { static const EnumPropertyItem action_items[] = { {int(VisAction::Hide), "HIDE", 0, "Hide", "Hide vertices"}, @@ -694,106 +630,47 @@ static void hide_show_operator_properties(wmOperatorType *ot) {0, nullptr, 0, nullptr, nullptr}, }; + static const EnumPropertyItem area_items[] = { + {int(VisArea::Outside), + "OUTSIDE", + 0, + "Outside", + "Hide or show vertices outside the selection"}, + {int(VisArea::Inside), "INSIDE", 0, "Inside", "Hide or show vertices inside the selection"}, + {int(VisArea::All), "ALL", 0, "All", "Hide or show all vertices"}, + {int(VisArea::Masked), + "MASKED", + 0, + "Masked", + "Hide or show vertices that are masked (minimum mask value of 0.5)"}, + {0, nullptr, 0, nullptr, nullptr}, + }; + + ot->name = "Hide/Show"; + ot->idname = "PAINT_OT_hide_show"; + ot->description = "Hide/show some vertices"; + + ot->invoke = hide_show_invoke; + ot->modal = WM_gesture_box_modal; + ot->exec = hide_show_exec; + /* Sculpt-only for now. */ + ot->poll = SCULPT_mode_poll_view3d; + + ot->flag = OPTYPE_REGISTER; + RNA_def_enum(ot->srna, "action", action_items, int(VisAction::Hide), "Visibility Action", "Whether to hide or show vertices"); -} - -static void hide_show_operator_gesture_properties(wmOperatorType *ot) -{ - static const EnumPropertyItem area_items[] = { - {int(gesture::SelectionType::Outside), - "OUTSIDE", - 0, - "Outside", - "Hide or show vertices outside the selection"}, - {int(gesture::SelectionType::Inside), - "Inside", - 0, - "Inside", - "Hide or show vertices inside the selection"}, - {0, nullptr, 0, nullptr, nullptr}, - }; - RNA_def_enum(ot->srna, "area", area_items, - int(gesture::SelectionType::Inside), + VisArea::Inside, "Visibility Area", "Which vertices to hide or show"); -} - -void PAINT_OT_hide_show_masked(wmOperatorType *ot) -{ - ot->name = "Hide/Show Masked"; - ot->idname = "PAINT_OT_hide_show_masked"; - ot->description = "Hide/show all masked vertices above a threshold"; - - ot->exec = hide_show_masked_exec; - /* Sculpt-only for now. */ - ot->poll = SCULPT_mode_poll_view3d; - - ot->flag = OPTYPE_REGISTER; - - hide_show_operator_properties(ot); -} - -void PAINT_OT_hide_show_all(wmOperatorType *ot) -{ - ot->name = "Hide/Show All"; - ot->idname = "PAINT_OT_hide_show_all"; - ot->description = "Hide/show all vertices"; - - ot->exec = hide_show_all_exec; - /* Sculpt-only for now. */ - ot->poll = SCULPT_mode_poll_view3d; - - ot->flag = OPTYPE_REGISTER; - - hide_show_operator_properties(ot); -} - -void PAINT_OT_hide_show(wmOperatorType *ot) -{ - ot->name = "Hide/Show"; - ot->idname = "PAINT_OT_hide_show"; - ot->description = "Hide/show some vertices"; - - ot->invoke = WM_gesture_box_invoke; - ot->modal = WM_gesture_box_modal; - ot->exec = hide_show_gesture_box_exec; - /* Sculpt-only for now. */ - ot->poll = SCULPT_mode_poll_view3d; - - ot->flag = OPTYPE_REGISTER; - WM_operator_properties_border(ot); - hide_show_operator_properties(ot); - hide_show_operator_gesture_properties(ot); - gesture::operator_properties(ot); -} - -void PAINT_OT_hide_show_lasso_gesture(wmOperatorType *ot) -{ - ot->name = "Hide/Show Lasso"; - ot->idname = "PAINT_OT_hide_show_lasso_gesture"; - ot->description = "Hide/show some vertices"; - - ot->invoke = WM_gesture_lasso_invoke; - ot->modal = WM_gesture_lasso_modal; - ot->exec = hide_show_gesture_lasso_exec; - /* Sculpt-only for now. */ - ot->poll = SCULPT_mode_poll_view3d; - - ot->flag = OPTYPE_REGISTER | OPTYPE_DEPENDS_ON_CURSOR; - - WM_operator_properties_gesture_lasso(ot); - hide_show_operator_properties(ot); - hide_show_operator_gesture_properties(ot); - gesture::operator_properties(ot); } static void invert_visibility_mesh(Object &object, const Span nodes) diff --git a/source/blender/editors/sculpt_paint/paint_image.cc b/source/blender/editors/sculpt_paint/paint_image.cc index 5c0cfe12099..472f9687958 100644 --- a/source/blender/editors/sculpt_paint/paint_image.cc +++ b/source/blender/editors/sculpt_paint/paint_image.cc @@ -18,7 +18,7 @@ #include "BLI_string.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "IMB_imbuf.hh" #include "IMB_imbuf_types.hh" @@ -42,7 +42,7 @@ #include "BKE_node_runtime.hh" #include "BKE_object.hh" #include "BKE_paint.hh" -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "NOD_texture.h" @@ -803,12 +803,12 @@ void PAINT_OT_sample_color(wmOperatorType *ot) static blender::float3 paint_init_pivot_mesh(Object *ob) { using namespace blender; - const Mesh *mesh_eval = BKE_object_get_evaluated_mesh(ob); - if (!mesh_eval) { - mesh_eval = (const Mesh *)ob->data; + const Mesh *me_eval = BKE_object_get_evaluated_mesh(ob); + if (!me_eval) { + me_eval = (const Mesh *)ob->data; } - const std::optional> bounds = mesh_eval->bounds_min_max(); + const std::optional> bounds = me_eval->bounds_min_max(); if (!bounds) { return float3(0.0f); } @@ -859,7 +859,7 @@ void paint_init_pivot(Object *ob, Scene *scene) return; } - mul_m4_v3(ob->object_to_world().ptr(), location); + mul_m4_v3(ob->object_to_world, location); ups->last_stroke_valid = true; ups->average_stroke_counter = 1; @@ -912,7 +912,7 @@ void ED_object_texture_paint_mode_enter_ex(Main *bmain, Mesh *mesh = BKE_mesh_from_object(ob); BLI_assert(mesh != nullptr); - DEG_id_tag_update(&mesh->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&mesh->id, ID_RECALC_COPY_ON_WRITE); /* Ensure we have evaluated data for bounding box. */ BKE_scene_graph_evaluated_ensure(depsgraph, bmain); @@ -946,7 +946,7 @@ void ED_object_texture_paint_mode_exit_ex(Main *bmain, Scene *scene, Object *ob) Mesh *mesh = BKE_mesh_from_object(ob); BLI_assert(mesh != nullptr); - DEG_id_tag_update(&mesh->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&mesh->id, ID_RECALC_COPY_ON_WRITE); WM_main_add_notifier(NC_SCENE | ND_MODE, scene); } diff --git a/source/blender/editors/sculpt_paint/paint_image_2d.cc b/source/blender/editors/sculpt_paint/paint_image_2d.cc index f8f2735aa5f..4ec5527136d 100644 --- a/source/blender/editors/sculpt_paint/paint_image_2d.cc +++ b/source/blender/editors/sculpt_paint/paint_image_2d.cc @@ -26,7 +26,7 @@ #include "BKE_context.hh" #include "BKE_image.h" #include "BKE_paint.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "DEG_depsgraph.hh" diff --git a/source/blender/editors/sculpt_paint/paint_image_proj.cc b/source/blender/editors/sculpt_paint/paint_image_proj.cc index 4dca4c5793d..17eee751a2a 100644 --- a/source/blender/editors/sculpt_paint/paint_image_proj.cc +++ b/source/blender/editors/sculpt_paint/paint_image_proj.cc @@ -35,7 +35,7 @@ #include "atomic_ops.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "IMB_imbuf.hh" #include "IMB_interp.hh" @@ -57,7 +57,7 @@ #include "BKE_colortools.hh" #include "BKE_context.hh" #include "BKE_customdata.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_idprop.h" #include "BKE_image.h" #include "BKE_layer.hh" @@ -71,8 +71,8 @@ #include "BKE_node_runtime.hh" #include "BKE_object.hh" #include "BKE_paint.hh" -#include "BKE_report.hh" -#include "BKE_scene.hh" +#include "BKE_report.h" +#include "BKE_scene.h" #include "BKE_screen.hh" #include "DNA_screen_types.h" #include "DNA_space_types.h" @@ -423,7 +423,7 @@ struct ProjPaintState { SpinLock *tile_lock; - Mesh *mesh_eval; + Mesh *me_eval; int totloop_eval; int faces_num_eval; int totvert_eval; @@ -3690,7 +3690,7 @@ static void proj_paint_state_viewport_init(ProjPaintState *ps, const char symmet ps->viewDir[1] = 0.0f; ps->viewDir[2] = 1.0f; - copy_m4_m4(ps->obmat, ps->ob->object_to_world().ptr()); + copy_m4_m4(ps->obmat, ps->ob->object_to_world); if (symmetry_flag) { int i; @@ -3712,9 +3712,7 @@ static void proj_paint_state_viewport_init(ProjPaintState *ps, const char symmet copy_m4_m4(viewmat, ps->rv3d->viewmat); copy_m4_m4(viewinv, ps->rv3d->viewinv); - blender::float4x4 projection = ED_view3d_ob_project_mat_get_from_obmat( - ps->rv3d, blender::float4x4(ps->obmat)); - copy_m4_m4(ps->projectMat, projection.ptr()); + ED_view3d_ob_project_mat_get_from_obmat(ps->rv3d, ps->obmat, ps->projectMat); ps->is_ortho = ED_view3d_clip_range_get( ps->depsgraph, ps->v3d, ps->rv3d, &ps->clip_start, &ps->clip_end, true); @@ -3750,7 +3748,7 @@ static void proj_paint_state_viewport_init(ProjPaintState *ps, const char symmet CameraParams params; /* viewmat & viewinv */ - copy_m4_m4(viewinv, cam_ob_eval->object_to_world().ptr()); + copy_m4_m4(viewinv, cam_ob_eval->object_to_world); normalize_m4(viewinv); invert_m4_m4(viewmat, viewinv); @@ -4034,13 +4032,13 @@ static bool proj_paint_state_mesh_eval_init(const bContext *C, ProjPaintState *p Object *ob = ps->ob; const Object *ob_eval = DEG_get_evaluated_object(depsgraph, ob); - ps->mesh_eval = BKE_object_get_evaluated_mesh(ob_eval); - if (!ps->mesh_eval) { + ps->me_eval = BKE_object_get_evaluated_mesh(ob_eval); + if (!ps->me_eval) { return false; } - if (!CustomData_has_layer(&ps->mesh_eval->corner_data, CD_PROP_FLOAT2)) { - ps->mesh_eval = nullptr; + if (!CustomData_has_layer(&ps->me_eval->corner_data, CD_PROP_FLOAT2)) { + ps->me_eval = nullptr; return false; } @@ -4057,26 +4055,26 @@ static bool proj_paint_state_mesh_eval_init(const bContext *C, ProjPaintState *p } ps->mat_array[totmat - 1] = nullptr; - ps->vert_positions_eval = ps->mesh_eval->vert_positions(); - ps->vert_normals = ps->mesh_eval->vert_normals(); - ps->edges_eval = ps->mesh_eval->edges(); - ps->faces_eval = ps->mesh_eval->faces(); - ps->corner_verts_eval = ps->mesh_eval->corner_verts(); + ps->vert_positions_eval = ps->me_eval->vert_positions(); + ps->vert_normals = ps->me_eval->vert_normals(); + ps->edges_eval = ps->me_eval->edges(); + ps->faces_eval = ps->me_eval->faces(); + ps->corner_verts_eval = ps->me_eval->corner_verts(); ps->select_poly_eval = (const bool *)CustomData_get_layer_named( - &ps->mesh_eval->face_data, CD_PROP_BOOL, ".select_poly"); + &ps->me_eval->face_data, CD_PROP_BOOL, ".select_poly"); ps->hide_poly_eval = (const bool *)CustomData_get_layer_named( - &ps->mesh_eval->face_data, CD_PROP_BOOL, ".hide_poly"); + &ps->me_eval->face_data, CD_PROP_BOOL, ".hide_poly"); ps->material_indices = (const int *)CustomData_get_layer_named( - &ps->mesh_eval->face_data, CD_PROP_INT32, "material_index"); + &ps->me_eval->face_data, CD_PROP_INT32, "material_index"); ps->sharp_faces_eval = static_cast( - CustomData_get_layer_named(&ps->mesh_eval->face_data, CD_PROP_BOOL, "sharp_face")); + CustomData_get_layer_named(&ps->me_eval->face_data, CD_PROP_BOOL, "sharp_face")); - ps->totvert_eval = ps->mesh_eval->verts_num; - ps->faces_num_eval = ps->mesh_eval->faces_num; - ps->totloop_eval = ps->mesh_eval->corners_num; + ps->totvert_eval = ps->me_eval->verts_num; + ps->faces_num_eval = ps->me_eval->faces_num; + ps->totloop_eval = ps->me_eval->corners_num; - ps->corner_tris_eval = ps->mesh_eval->corner_tris(); - ps->corner_tri_faces_eval = ps->mesh_eval->corner_tri_faces(); + ps->corner_tris_eval = ps->me_eval->corner_tris(); + ps->corner_tri_faces_eval = ps->me_eval->corner_tri_faces(); ps->poly_to_loop_uv = static_cast( MEM_mallocN(ps->faces_num_eval * sizeof(float(*)[2]), "proj_paint_mtfaces")); @@ -4104,13 +4102,13 @@ static void proj_paint_layer_clone_init(ProjPaintState *ps, ProjPaintLayerClone if (layer_num != -1) { mloopuv_clone_base = static_cast( - CustomData_get_layer_n(&ps->mesh_eval->corner_data, CD_PROP_FLOAT2, layer_num)); + CustomData_get_layer_n(&ps->me_eval->corner_data, CD_PROP_FLOAT2, layer_num)); } if (mloopuv_clone_base == nullptr) { /* get active instead */ mloopuv_clone_base = static_cast( - CustomData_get_layer(&ps->mesh_eval->corner_data, CD_PROP_FLOAT2)); + CustomData_get_layer(&ps->me_eval->corner_data, CD_PROP_FLOAT2)); } } @@ -4140,10 +4138,10 @@ static bool project_paint_clone_face_skip(ProjPaintState *ps, if (lc->slot_clone != lc->slot_last_clone) { if (!lc->slot_clone->uvname || !(lc->mloopuv_clone_base = static_cast(CustomData_get_layer_named( - &ps->mesh_eval->corner_data, CD_PROP_FLOAT2, lc->slot_clone->uvname)))) + &ps->me_eval->corner_data, CD_PROP_FLOAT2, lc->slot_clone->uvname)))) { lc->mloopuv_clone_base = static_cast( - CustomData_get_layer(&ps->mesh_eval->corner_data, CD_PROP_FLOAT2)); + CustomData_get_layer(&ps->me_eval->corner_data, CD_PROP_FLOAT2)); } lc->slot_last_clone = lc->slot_clone; } @@ -4166,7 +4164,7 @@ static void proj_paint_face_lookup_init(const ProjPaintState *ps, ProjPaintFaceL memset(face_lookup, 0, sizeof(*face_lookup)); Mesh *orig_mesh = (Mesh *)ps->ob->data; face_lookup->index_mp_to_orig = static_cast( - CustomData_get_layer(&ps->mesh_eval->face_data, CD_ORIGINDEX)); + CustomData_get_layer(&ps->me_eval->face_data, CD_ORIGINDEX)); if (ps->do_face_sel) { face_lookup->select_poly_orig = static_cast( CustomData_get_layer_named(&orig_mesh->face_data, CD_PROP_BOOL, ".select_poly")); @@ -4324,17 +4322,17 @@ static void project_paint_prepare_all_faces(ProjPaintState *ps, /* all faces should have a valid slot, reassert here */ if (slot == nullptr) { mloopuv_base = static_cast( - CustomData_get_layer(&ps->mesh_eval->corner_data, CD_PROP_FLOAT2)); + CustomData_get_layer(&ps->me_eval->corner_data, CD_PROP_FLOAT2)); tpage = ps->canvas_ima; } else { if (slot != slot_last) { if (!slot->uvname || !(mloopuv_base = static_cast(CustomData_get_layer_named( - &ps->mesh_eval->corner_data, CD_PROP_FLOAT2, slot->uvname)))) + &ps->me_eval->corner_data, CD_PROP_FLOAT2, slot->uvname)))) { mloopuv_base = static_cast( - CustomData_get_layer(&ps->mesh_eval->corner_data, CD_PROP_FLOAT2)); + CustomData_get_layer(&ps->me_eval->corner_data, CD_PROP_FLOAT2)); } slot_last = slot; } @@ -4495,7 +4493,7 @@ static void project_paint_begin(const bContext *C, if (ps->source == PROJ_SRC_VIEW) { /* faster clipping lookups */ - ED_view3d_clipping_local(ps->rv3d, ps->ob->object_to_world().ptr()); + ED_view3d_clipping_local(ps->rv3d, ps->ob->object_to_world); } ps->do_face_sel = ((((Mesh *)ps->ob->data)->editflag & ME_EDIT_PAINT_FACE_SEL) != 0); @@ -4512,18 +4510,18 @@ static void project_paint_begin(const bContext *C, proj_paint_layer_clone_init(ps, &layer_clone); if (ps->do_layer_stencil || ps->do_stencil_brush) { - // int layer_num = CustomData_get_stencil_layer(&ps->mesh_eval->ldata, CD_PROP_FLOAT2); + // int layer_num = CustomData_get_stencil_layer(&ps->me_eval->ldata, CD_PROP_FLOAT2); int layer_num = CustomData_get_stencil_layer(&((Mesh *)ps->ob->data)->corner_data, CD_PROP_FLOAT2); if (layer_num != -1) { ps->mloopuv_stencil_eval = static_cast( - CustomData_get_layer_n(&ps->mesh_eval->corner_data, CD_PROP_FLOAT2, layer_num)); + CustomData_get_layer_n(&ps->me_eval->corner_data, CD_PROP_FLOAT2, layer_num)); } if (ps->mloopuv_stencil_eval == nullptr) { /* get active instead */ ps->mloopuv_stencil_eval = static_cast( - CustomData_get_layer(&ps->mesh_eval->corner_data, CD_PROP_FLOAT2)); + CustomData_get_layer(&ps->me_eval->corner_data, CD_PROP_FLOAT2)); } if (ps->do_stencil_brush) { @@ -4658,7 +4656,7 @@ static void project_paint_end(ProjPaintState *ps) MEM_freeN(ps->cavities); } - ps->mesh_eval = nullptr; + ps->me_eval = nullptr; } if (ps->blurkernel) { @@ -5800,14 +5798,11 @@ void paint_proj_stroke(const bContext *C, view3d_operator_needs_opengl(C); - /* Ensure the depth buffer is updated for #ED_view3d_autodist. */ - ED_view3d_depth_override(depsgraph, region, v3d, nullptr, V3D_DEPTH_NO_GPENCIL, nullptr); - - if (!ED_view3d_autodist(region, v3d, mval_i, cursor, nullptr)) { + if (!ED_view3d_autodist(depsgraph, region, v3d, mval_i, cursor, false, nullptr)) { return; } - DEG_id_tag_update(&scene->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&scene->id, ID_RECALC_COPY_ON_WRITE); ED_region_tag_redraw(region); return; @@ -6010,7 +6005,7 @@ void *paint_proj_new_stroke(bContext *C, Object *ob, const float mouse[2], int m } project_paint_begin(C, ps, is_multi_view, symmetry_flag_views[i]); - if (ps->mesh_eval == nullptr) { + if (ps->me_eval == nullptr) { goto fail; } @@ -6163,7 +6158,7 @@ static int texture_paint_camera_project_exec(bContext *C, wmOperator *op) /* allocate and initialize spatial data structures */ project_paint_begin(C, &ps, false, 0); - if (ps.mesh_eval == nullptr) { + if (ps.me_eval == nullptr) { BKE_brush_size_set(scene, ps.brush, orig_brush_size); BKE_report(op->reports, RPT_ERROR, "Could not get valid evaluated mesh"); return OPERATOR_CANCELLED; @@ -6838,7 +6833,7 @@ static int texture_paint_add_texture_paint_slot_invoke(bContext *C, default_paint_slot_color_get(type, ma, color); RNA_float_set_array(op->ptr, "color", color); - return WM_operator_props_dialog_popup(C, op, 300, IFACE_("Add Paint Slot"), IFACE_("Add")); + return WM_operator_props_dialog_popup(C, op, 300); } static void texture_paint_add_texture_paint_slot_ui(bContext *C, wmOperator *op) diff --git a/source/blender/editors/sculpt_paint/paint_intern.hh b/source/blender/editors/sculpt_paint/paint_intern.hh index 04866b09974..a47ae2cad8a 100644 --- a/source/blender/editors/sculpt_paint/paint_intern.hh +++ b/source/blender/editors/sculpt_paint/paint_intern.hh @@ -467,11 +467,7 @@ void mesh_show_all(Object &object, Span nodes); void grids_show_all(Depsgraph &depsgraph, Object &object, Span nodes); void tag_update_visibility(const bContext &C); -void PAINT_OT_hide_show_masked(wmOperatorType *ot); -void PAINT_OT_hide_show_all(wmOperatorType *ot); void PAINT_OT_hide_show(wmOperatorType *ot); -void PAINT_OT_hide_show_lasso_gesture(wmOperatorType *ot); - void PAINT_OT_visibility_invert(wmOperatorType *ot); } // namespace blender::ed::sculpt_paint::hide diff --git a/source/blender/editors/sculpt_paint/paint_mask.cc b/source/blender/editors/sculpt_paint/paint_mask.cc index ad9db549ccd..aee3fa0154f 100644 --- a/source/blender/editors/sculpt_paint/paint_mask.cc +++ b/source/blender/editors/sculpt_paint/paint_mask.cc @@ -10,12 +10,20 @@ #include "MEM_guardedalloc.h" +#include "DNA_modifier_types.h" #include "DNA_object_types.h" +#include "DNA_vec_types.h" #include "BLI_array_utils.hh" #include "BLI_bit_span_ops.hh" +#include "BLI_bitmap_draw_2d.h" #include "BLI_enumerable_thread_specific.hh" +#include "BLI_lasso_2d.h" #include "BLI_math_base.hh" +#include "BLI_math_geom.h" +#include "BLI_math_matrix.h" +#include "BLI_polyfill_2d.h" +#include "BLI_rect.h" #include "BLI_span.hh" #include "BLI_utildefines.h" #include "BLI_vector.hh" @@ -25,13 +33,17 @@ #include "BKE_ccg.h" #include "BKE_context.hh" #include "BKE_layer.hh" +#include "BKE_lib_id.hh" #include "BKE_mesh.hh" #include "BKE_multires.hh" #include "BKE_paint.hh" #include "BKE_pbvh_api.hh" +#include "BKE_scene.h" #include "BKE_subdiv_ccg.hh" #include "BKE_subsurf.hh" +#include "DEG_depsgraph.hh" + #include "RNA_access.hh" #include "RNA_define.hh" @@ -39,13 +51,18 @@ #include "WM_types.hh" #include "ED_sculpt.hh" +#include "ED_view3d.hh" #include "bmesh.hh" +#include "tools/bmesh_boolean.hh" #include "paint_intern.hh" + +/* For undo push. */ #include "sculpt_intern.hh" namespace blender::ed::sculpt_paint::mask { + Array duplicate_mask(const Object &object) { const SculptSession &ss = *object.sculpt; @@ -545,41 +562,668 @@ void PAINT_OT_mask_flood_fill(wmOperatorType *ot) 1.0f); } +/* Sculpt Gesture Operators. */ + +enum eSculptGestureShapeType { + SCULPT_GESTURE_SHAPE_BOX, + SCULPT_GESTURE_SHAPE_LASSO, + SCULPT_GESTURE_SHAPE_LINE, +}; + +struct LassoGestureData { + float4x4 projviewobjmat; + + rcti boundbox; + int width; + + /* 2D bitmap to test if a vertex is affected by the lasso shape. */ + blender::BitVector<> mask_px; +}; + +struct LineGestureData { + /* Plane aligned to the gesture line. */ + float true_plane[4]; + float plane[4]; + + /* Planes to limit the action to the length of the gesture segment at both sides of the affected + * area. */ + float side_plane[2][4]; + float true_side_plane[2][4]; + bool use_side_planes; + + bool flip; +}; + +struct SculptGestureOperation; + +struct SculptGestureContext { + SculptSession *ss; + ViewContext vc; + + /* Enabled and currently active symmetry. */ + ePaintSymmetryFlags symm; + ePaintSymmetryFlags symmpass; + + /* Operation parameters. */ + eSculptGestureShapeType shape_type; + bool front_faces_only; + + SculptGestureOperation *operation; + + /* Gesture data. */ + /* Screen space points that represent the gesture shape. */ + float (*gesture_points)[2]; + int tot_gesture_points; + + /* View parameters. */ + float3 true_view_normal; + float3 view_normal; + + float3 true_view_origin; + float3 view_origin; + + float true_clip_planes[4][4]; + float clip_planes[4][4]; + + /* These store the view origin and normal in world space, which is used in some gestures to + * generate geometry aligned from the view directly in world space. */ + /* World space view origin and normal are not affected by object symmetry when doing symmetry + * passes, so there is no separate variables with the `true_` prefix to store their original + * values without symmetry modifications. */ + float3 world_space_view_origin; + float3 world_space_view_normal; + + /* Lasso Gesture. */ + LassoGestureData lasso; + + /* Line Gesture. */ + LineGestureData line; + + /* Task Callback Data. */ + Vector nodes; +}; + +struct SculptGestureOperation { + /* Initial setup (data updates, special undo push...). */ + void (*sculpt_gesture_begin)(bContext *, SculptGestureContext *); + + /* Apply the gesture action for each symmetry pass. */ + void (*sculpt_gesture_apply_for_symmetry_pass)(bContext *, SculptGestureContext *); + + /* Remaining actions after finishing the symmetry passes iterations + * (updating data-layers, tagging PBVH updates...). */ + void (*sculpt_gesture_end)(bContext *, SculptGestureContext *); +}; + +static void sculpt_gesture_operator_properties(wmOperatorType *ot) +{ + RNA_def_boolean(ot->srna, + "use_front_faces_only", + false, + "Front Faces Only", + "Affect only faces facing towards the view"); + + RNA_def_boolean(ot->srna, + "use_limit_to_segment", + false, + "Limit to Segment", + "Apply the gesture action only to the area that is contained within the " + "segment without extending its effect to the entire line"); +} + +static void sculpt_gesture_context_init_common(bContext *C, + wmOperator *op, + SculptGestureContext *sgcontext) +{ + Depsgraph *depsgraph = CTX_data_ensure_evaluated_depsgraph(C); + sgcontext->vc = ED_view3d_viewcontext_init(C, depsgraph); + Object *ob = sgcontext->vc.obact; + + /* Operator properties. */ + sgcontext->front_faces_only = RNA_boolean_get(op->ptr, "use_front_faces_only"); + sgcontext->line.use_side_planes = RNA_boolean_get(op->ptr, "use_limit_to_segment"); + + /* SculptSession */ + sgcontext->ss = ob->sculpt; + + /* Symmetry. */ + sgcontext->symm = ePaintSymmetryFlags(SCULPT_mesh_symmetry_xyz_get(ob)); + + /* View Normal. */ + float mat[3][3]; + float view_dir[3] = {0.0f, 0.0f, 1.0f}; + copy_m3_m4(mat, sgcontext->vc.rv3d->viewinv); + mul_m3_v3(mat, view_dir); + normalize_v3_v3(sgcontext->world_space_view_normal, view_dir); + copy_m3_m4(mat, ob->world_to_object); + mul_m3_v3(mat, view_dir); + normalize_v3_v3(sgcontext->true_view_normal, view_dir); + + /* View Origin. */ + copy_v3_v3(sgcontext->world_space_view_origin, sgcontext->vc.rv3d->viewinv[3]); + copy_v3_v3(sgcontext->true_view_origin, sgcontext->vc.rv3d->viewinv[3]); +} + +static void sculpt_gesture_lasso_px_cb(int x, int x_end, int y, void *user_data) +{ + SculptGestureContext *mcontext = static_cast(user_data); + LassoGestureData *lasso = &mcontext->lasso; + int index = (y * lasso->width) + x; + int index_end = (y * lasso->width) + x_end; + do { + lasso->mask_px[index].set(); + } while (++index != index_end); +} + +static SculptGestureContext *sculpt_gesture_init_from_lasso(bContext *C, wmOperator *op) +{ + int mcoords_len; + const int(*mcoords)[2] = WM_gesture_lasso_path_to_array(C, op, &mcoords_len); + + if (!mcoords) { + return nullptr; + } + + /* A single point is equally as invalid for a lasso gesture as no points. */ + if (mcoords_len == 1) { + MEM_freeN((void *)mcoords); + return nullptr; + } + + SculptGestureContext *sgcontext = MEM_new(__func__); + sgcontext->shape_type = SCULPT_GESTURE_SHAPE_LASSO; + + sculpt_gesture_context_init_common(C, op, sgcontext); + sgcontext->lasso.projviewobjmat = ED_view3d_ob_project_mat_get(sgcontext->vc.rv3d, + sgcontext->vc.obact); + BLI_lasso_boundbox(&sgcontext->lasso.boundbox, mcoords, mcoords_len); + const int lasso_width = 1 + sgcontext->lasso.boundbox.xmax - sgcontext->lasso.boundbox.xmin; + const int lasso_height = 1 + sgcontext->lasso.boundbox.ymax - sgcontext->lasso.boundbox.ymin; + sgcontext->lasso.width = lasso_width; + sgcontext->lasso.mask_px.resize(lasso_width * lasso_height); + + BLI_bitmap_draw_2d_poly_v2i_n(sgcontext->lasso.boundbox.xmin, + sgcontext->lasso.boundbox.ymin, + sgcontext->lasso.boundbox.xmax, + sgcontext->lasso.boundbox.ymax, + mcoords, + mcoords_len, + sculpt_gesture_lasso_px_cb, + sgcontext); + + BoundBox bb; + ED_view3d_clipping_calc(&bb, + sgcontext->true_clip_planes, + sgcontext->vc.region, + sgcontext->vc.obact, + &sgcontext->lasso.boundbox); + + sgcontext->gesture_points = static_cast( + MEM_malloc_arrayN(mcoords_len, sizeof(float[2]), "trim points")); + sgcontext->tot_gesture_points = mcoords_len; + for (int i = 0; i < mcoords_len; i++) { + sgcontext->gesture_points[i][0] = mcoords[i][0]; + sgcontext->gesture_points[i][1] = mcoords[i][1]; + } + + MEM_freeN((void *)mcoords); + + return sgcontext; +} + +static SculptGestureContext *sculpt_gesture_init_from_box(bContext *C, wmOperator *op) +{ + SculptGestureContext *sgcontext = MEM_new(__func__); + sgcontext->shape_type = SCULPT_GESTURE_SHAPE_BOX; + + sculpt_gesture_context_init_common(C, op, sgcontext); + + rcti rect; + WM_operator_properties_border_to_rcti(op, &rect); + + BoundBox bb; + ED_view3d_clipping_calc( + &bb, sgcontext->true_clip_planes, sgcontext->vc.region, sgcontext->vc.obact, &rect); + + sgcontext->gesture_points = static_cast( + MEM_calloc_arrayN(4, sizeof(float[2]), "trim points")); + sgcontext->tot_gesture_points = 4; + + sgcontext->gesture_points[0][0] = rect.xmax; + sgcontext->gesture_points[0][1] = rect.ymax; + + sgcontext->gesture_points[1][0] = rect.xmax; + sgcontext->gesture_points[1][1] = rect.ymin; + + sgcontext->gesture_points[2][0] = rect.xmin; + sgcontext->gesture_points[2][1] = rect.ymin; + + sgcontext->gesture_points[3][0] = rect.xmin; + sgcontext->gesture_points[3][1] = rect.ymax; + return sgcontext; +} + +static void sculpt_gesture_line_plane_from_tri(float *r_plane, + SculptGestureContext *sgcontext, + const bool flip, + const float p1[3], + const float p2[3], + const float p3[3]) +{ + float normal[3]; + normal_tri_v3(normal, p1, p2, p3); + mul_v3_mat3_m4v3(normal, sgcontext->vc.obact->world_to_object, normal); + if (flip) { + mul_v3_fl(normal, -1.0f); + } + float plane_point_object_space[3]; + mul_v3_m4v3(plane_point_object_space, sgcontext->vc.obact->world_to_object, p1); + plane_from_point_normal_v3(r_plane, plane_point_object_space, normal); +} + +/* Creates 4 points in the plane defined by the line and 2 extra points with an offset relative to + * this plane. */ +static void sculpt_gesture_line_calculate_plane_points(SculptGestureContext *sgcontext, + float line_points[2][2], + float r_plane_points[4][3], + float r_offset_plane_points[2][3]) +{ + float depth_point[3]; + add_v3_v3v3(depth_point, sgcontext->true_view_origin, sgcontext->true_view_normal); + ED_view3d_win_to_3d( + sgcontext->vc.v3d, sgcontext->vc.region, depth_point, line_points[0], r_plane_points[0]); + ED_view3d_win_to_3d( + sgcontext->vc.v3d, sgcontext->vc.region, depth_point, line_points[1], r_plane_points[3]); + + madd_v3_v3v3fl(depth_point, sgcontext->true_view_origin, sgcontext->true_view_normal, 10.0f); + ED_view3d_win_to_3d( + sgcontext->vc.v3d, sgcontext->vc.region, depth_point, line_points[0], r_plane_points[1]); + ED_view3d_win_to_3d( + sgcontext->vc.v3d, sgcontext->vc.region, depth_point, line_points[1], r_plane_points[2]); + + float normal[3]; + normal_tri_v3(normal, r_plane_points[0], r_plane_points[1], r_plane_points[2]); + add_v3_v3v3(r_offset_plane_points[0], r_plane_points[0], normal); + add_v3_v3v3(r_offset_plane_points[1], r_plane_points[3], normal); +} + +static SculptGestureContext *sculpt_gesture_init_from_line(bContext *C, wmOperator *op) +{ + SculptGestureContext *sgcontext = MEM_new(__func__); + sgcontext->shape_type = SCULPT_GESTURE_SHAPE_LINE; + + sculpt_gesture_context_init_common(C, op, sgcontext); + + float line_points[2][2]; + line_points[0][0] = RNA_int_get(op->ptr, "xstart"); + line_points[0][1] = RNA_int_get(op->ptr, "ystart"); + line_points[1][0] = RNA_int_get(op->ptr, "xend"); + line_points[1][1] = RNA_int_get(op->ptr, "yend"); + + sgcontext->line.flip = RNA_boolean_get(op->ptr, "flip"); + + float plane_points[4][3]; + float offset_plane_points[2][3]; + sculpt_gesture_line_calculate_plane_points( + sgcontext, line_points, plane_points, offset_plane_points); + + /* Calculate line plane and normal. */ + const bool flip = sgcontext->line.flip ^ (!sgcontext->vc.rv3d->is_persp); + sculpt_gesture_line_plane_from_tri(sgcontext->line.true_plane, + sgcontext, + flip, + plane_points[0], + plane_points[1], + plane_points[2]); + + /* Calculate the side planes. */ + sculpt_gesture_line_plane_from_tri(sgcontext->line.true_side_plane[0], + sgcontext, + false, + plane_points[1], + plane_points[0], + offset_plane_points[0]); + sculpt_gesture_line_plane_from_tri(sgcontext->line.true_side_plane[1], + sgcontext, + false, + plane_points[3], + plane_points[2], + offset_plane_points[1]); + + return sgcontext; +} + +static void sculpt_gesture_context_free(SculptGestureContext *sgcontext) +{ + MEM_SAFE_FREE(sgcontext->gesture_points); + MEM_SAFE_FREE(sgcontext->operation); + MEM_delete(sgcontext); +} + +static void flip_plane(float out[4], const float in[4], const char symm) +{ + if (symm & PAINT_SYMM_X) { + out[0] = -in[0]; + } + else { + out[0] = in[0]; + } + if (symm & PAINT_SYMM_Y) { + out[1] = -in[1]; + } + else { + out[1] = in[1]; + } + if (symm & PAINT_SYMM_Z) { + out[2] = -in[2]; + } + else { + out[2] = in[2]; + } + + out[3] = in[3]; +} + +static void sculpt_gesture_flip_for_symmetry_pass(SculptGestureContext *sgcontext, + const ePaintSymmetryFlags symmpass) +{ + sgcontext->symmpass = symmpass; + for (int j = 0; j < 4; j++) { + flip_plane(sgcontext->clip_planes[j], sgcontext->true_clip_planes[j], symmpass); + } + + negate_m4(sgcontext->clip_planes); + + flip_v3_v3(sgcontext->view_normal, sgcontext->true_view_normal, symmpass); + flip_v3_v3(sgcontext->view_origin, sgcontext->true_view_origin, symmpass); + flip_plane(sgcontext->line.plane, sgcontext->line.true_plane, symmpass); + flip_plane(sgcontext->line.side_plane[0], sgcontext->line.true_side_plane[0], symmpass); + flip_plane(sgcontext->line.side_plane[1], sgcontext->line.true_side_plane[1], symmpass); +} + +static Vector sculpt_gesture_update_effected_nodes_by_line_plane( + SculptGestureContext *sgcontext) +{ + SculptSession *ss = sgcontext->ss; + float clip_planes[3][4]; + copy_v4_v4(clip_planes[0], sgcontext->line.plane); + copy_v4_v4(clip_planes[1], sgcontext->line.side_plane[0]); + copy_v4_v4(clip_planes[2], sgcontext->line.side_plane[1]); + + PBVHFrustumPlanes frustum{}; + frustum.planes = clip_planes; + frustum.num_planes = sgcontext->line.use_side_planes ? 3 : 1; + + return sgcontext->nodes = bke::pbvh::search_gather(ss->pbvh, [&](PBVHNode &node) { + return BKE_pbvh_node_frustum_contain_AABB(&node, &frustum); + }); +} + +static void sculpt_gesture_update_effected_nodes_by_clip_planes(SculptGestureContext *sgcontext) +{ + SculptSession *ss = sgcontext->ss; + float clip_planes[4][4]; + copy_m4_m4(clip_planes, sgcontext->clip_planes); + negate_m4(clip_planes); + + PBVHFrustumPlanes frustum{}; + frustum.planes = clip_planes; + frustum.num_planes = 4; + + sgcontext->nodes = bke::pbvh::search_gather(ss->pbvh, [&](PBVHNode &node) { + return BKE_pbvh_node_frustum_contain_AABB(&node, &frustum); + }); +} + +static void sculpt_gesture_update_effected_nodes(SculptGestureContext *sgcontext) +{ + switch (sgcontext->shape_type) { + case SCULPT_GESTURE_SHAPE_BOX: + case SCULPT_GESTURE_SHAPE_LASSO: + sculpt_gesture_update_effected_nodes_by_clip_planes(sgcontext); + break; + case SCULPT_GESTURE_SHAPE_LINE: + sculpt_gesture_update_effected_nodes_by_line_plane(sgcontext); + break; + } +} + +static bool sculpt_gesture_is_effected_lasso(SculptGestureContext *sgcontext, const float co[3]) +{ + int scr_co_s[2]; + float co_final[3]; + + flip_v3_v3(co_final, co, sgcontext->symmpass); + + /* First project point to 2d space. */ + const float2 scr_co_f = ED_view3d_project_float_v2_m4( + sgcontext->vc.region, co_final, sgcontext->lasso.projviewobjmat); + + scr_co_s[0] = scr_co_f[0]; + scr_co_s[1] = scr_co_f[1]; + + /* Clip against lasso boundbox. */ + LassoGestureData *lasso = &sgcontext->lasso; + if (!BLI_rcti_isect_pt(&lasso->boundbox, scr_co_s[0], scr_co_s[1])) { + return false; + } + + scr_co_s[0] -= lasso->boundbox.xmin; + scr_co_s[1] -= lasso->boundbox.ymin; + + return lasso->mask_px[scr_co_s[1] * lasso->width + scr_co_s[0]].test(); +} + +static bool sculpt_gesture_is_effected(SculptGestureContext *sgcontext, + const float3 &co, + const float3 &vertex_normal) +{ + float dot = dot_v3v3(sgcontext->view_normal, vertex_normal); + const bool is_effected_front_face = !(sgcontext->front_faces_only && dot < 0.0f); + + if (!is_effected_front_face) { + return false; + } + + switch (sgcontext->shape_type) { + case SCULPT_GESTURE_SHAPE_BOX: + return isect_point_planes_v3(sgcontext->clip_planes, 4, co); + case SCULPT_GESTURE_SHAPE_LASSO: + return sculpt_gesture_is_effected_lasso(sgcontext, co); + case SCULPT_GESTURE_SHAPE_LINE: + if (sgcontext->line.use_side_planes) { + return plane_point_side_v3(sgcontext->line.plane, co) > 0.0f && + plane_point_side_v3(sgcontext->line.side_plane[0], co) > 0.0f && + plane_point_side_v3(sgcontext->line.side_plane[1], co) > 0.0f; + } + return plane_point_side_v3(sgcontext->line.plane, co) > 0.0f; + } + return false; +} + +static void sculpt_gesture_apply(bContext *C, SculptGestureContext *sgcontext, wmOperator *op) +{ + SculptGestureOperation *operation = sgcontext->operation; + undo::push_begin(CTX_data_active_object(C), op); + + operation->sculpt_gesture_begin(C, sgcontext); + + for (int symmpass = 0; symmpass <= sgcontext->symm; symmpass++) { + if (SCULPT_is_symmetry_iteration_valid(symmpass, sgcontext->symm)) { + sculpt_gesture_flip_for_symmetry_pass(sgcontext, ePaintSymmetryFlags(symmpass)); + sculpt_gesture_update_effected_nodes(sgcontext); + + operation->sculpt_gesture_apply_for_symmetry_pass(C, sgcontext); + } + } + + operation->sculpt_gesture_end(C, sgcontext); + + Object *ob = CTX_data_active_object(C); + undo::push_end(ob); + + SCULPT_tag_update_overlays(C); +} + +/* Face Set Gesture Operation. */ + +struct SculptGestureFaceSetOperation { + SculptGestureOperation op; + + int new_face_set_id; +}; + +static void sculpt_gesture_face_set_begin(bContext *C, SculptGestureContext *sgcontext) +{ + Depsgraph *depsgraph = CTX_data_depsgraph_pointer(C); + BKE_sculpt_update_object_for_edit(depsgraph, sgcontext->vc.obact, false); +} + +static void face_set_gesture_apply_mesh(SculptGestureContext *sgcontext, + const Span nodes) +{ + SculptGestureFaceSetOperation *face_set_operation = (SculptGestureFaceSetOperation *) + sgcontext->operation; + const int new_face_set = face_set_operation->new_face_set_id; + Object &object = *sgcontext->vc.obact; + SculptSession &ss = *sgcontext->ss; + const PBVH &pbvh = *sgcontext->ss->pbvh; + + const Span positions = ss.vert_positions; + const OffsetIndices faces = ss.faces; + const Span corner_verts = ss.corner_verts; + const bool *hide_poly = ss.hide_poly; + bke::SpanAttributeWriter face_sets = face_set::ensure_face_sets_mesh(object); + + threading::parallel_for(sgcontext->nodes.index_range(), 1, [&](const IndexRange range) { + for (PBVHNode *node : nodes.slice(range)) { + undo::push_node(sgcontext->vc.obact, node, undo::Type::FaceSet); + + bool any_updated = false; + for (const int face : BKE_pbvh_node_calc_face_indices(pbvh, *node)) { + if (hide_poly && hide_poly[face]) { + continue; + } + const Span face_verts = corner_verts.slice(faces[face]); + const float3 face_center = bke::mesh::face_center_calc(positions, face_verts); + const float3 face_normal = bke::mesh::face_normal_calc(positions, face_verts); + if (!sculpt_gesture_is_effected(sgcontext, face_center, face_normal)) { + continue; + } + face_sets.span[face] = new_face_set; + any_updated = true; + } + if (any_updated) { + BKE_pbvh_node_mark_update_face_sets(node); + } + } + }); + + face_sets.finish(); +} + +static void face_set_gesture_apply_bmesh(SculptGestureContext *sgcontext, + const Span nodes) +{ + SculptGestureFaceSetOperation *face_set_operation = (SculptGestureFaceSetOperation *) + sgcontext->operation; + const int new_face_set = face_set_operation->new_face_set_id; + SculptSession &ss = *sgcontext->ss; + BMesh *bm = ss.bm; + const int offset = CustomData_get_offset_named(&bm->pdata, CD_PROP_INT32, ".sculpt_face_set"); + + threading::parallel_for(sgcontext->nodes.index_range(), 1, [&](const IndexRange range) { + for (PBVHNode *node : nodes.slice(range)) { + undo::push_node(sgcontext->vc.obact, node, undo::Type::FaceSet); + + bool any_updated = false; + for (BMFace *face : BKE_pbvh_bmesh_node_faces(node)) { + if (BM_elem_flag_test(face, BM_ELEM_HIDDEN)) { + continue; + } + float3 center; + BM_face_calc_center_median(face, center); + if (!sculpt_gesture_is_effected(sgcontext, center, face->no)) { + continue; + } + BM_ELEM_CD_SET_INT(face, offset, new_face_set); + any_updated = true; + } + + if (any_updated) { + BKE_pbvh_node_mark_update_visibility(node); + } + } + }); +} + +static void sculpt_gesture_face_set_apply_for_symmetry_pass(bContext * /*C*/, + SculptGestureContext *sgcontext) +{ + switch (BKE_pbvh_type(sgcontext->ss->pbvh)) { + case PBVH_GRIDS: + case PBVH_FACES: + face_set_gesture_apply_mesh(sgcontext, sgcontext->nodes); + break; + case PBVH_BMESH: + face_set_gesture_apply_bmesh(sgcontext, sgcontext->nodes); + } +} + +static void sculpt_gesture_face_set_end(bContext * /*C*/, SculptGestureContext * /*sgcontext*/) {} + +static void sculpt_gesture_init_face_set_properties(SculptGestureContext *sgcontext, + wmOperator * /*op*/) +{ + Object &object = *sgcontext->vc.obact; + sgcontext->operation = reinterpret_cast( + MEM_cnew(__func__)); + + SculptGestureFaceSetOperation *face_set_operation = (SculptGestureFaceSetOperation *) + sgcontext->operation; + + face_set_operation->op.sculpt_gesture_begin = sculpt_gesture_face_set_begin; + face_set_operation->op.sculpt_gesture_apply_for_symmetry_pass = + sculpt_gesture_face_set_apply_for_symmetry_pass; + face_set_operation->op.sculpt_gesture_end = sculpt_gesture_face_set_end; + + face_set_operation->new_face_set_id = face_set::find_next_available_id(object); +} + /* Mask Gesture Operation. */ struct SculptGestureMaskOperation { - gesture::Operation op; + SculptGestureOperation op; PaintMaskFloodMode mode; float value; }; -static void sculpt_gesture_mask_begin(bContext &C, gesture::GestureData &gesture_data) +static void sculpt_gesture_mask_begin(bContext *C, SculptGestureContext *sgcontext) { - Depsgraph *depsgraph = CTX_data_depsgraph_pointer(&C); - BKE_sculpt_update_object_for_edit(depsgraph, gesture_data.vc.obact, false); + Depsgraph *depsgraph = CTX_data_depsgraph_pointer(C); + BKE_sculpt_update_object_for_edit(depsgraph, sgcontext->vc.obact, false); } -static void mask_gesture_apply_task(gesture::GestureData &gesture_data, +static void mask_gesture_apply_task(SculptGestureContext *sgcontext, const SculptMaskWriteInfo mask_write, PBVHNode *node) { - SculptGestureMaskOperation *mask_operation = (SculptGestureMaskOperation *) - gesture_data.operation; - Object *ob = gesture_data.vc.obact; + SculptGestureMaskOperation *mask_operation = (SculptGestureMaskOperation *)sgcontext->operation; + Object *ob = sgcontext->vc.obact; - const bool is_multires = BKE_pbvh_type(gesture_data.ss->pbvh) == PBVH_GRIDS; + const bool is_multires = BKE_pbvh_type(sgcontext->ss->pbvh) == PBVH_GRIDS; PBVHVertexIter vd; bool any_masked = false; bool redraw = false; - BKE_pbvh_vertex_iter_begin (gesture_data.ss->pbvh, node, vd, PBVH_ITER_UNIQUE) { + BKE_pbvh_vertex_iter_begin (sgcontext->ss->pbvh, node, vd, PBVH_ITER_UNIQUE) { float vertex_normal[3]; - const float *co = SCULPT_vertex_co_get(gesture_data.ss, vd.vertex); - SCULPT_vertex_normal_get(gesture_data.ss, vd.vertex, vertex_normal); + const float *co = SCULPT_vertex_co_get(sgcontext->ss, vd.vertex); + SCULPT_vertex_normal_get(sgcontext->ss, vd.vertex, vertex_normal); - if (gesture::is_affected(gesture_data, co, vertex_normal)) { + if (sculpt_gesture_is_effected(sgcontext, co, vertex_normal)) { float prevmask = vd.mask; if (!any_masked) { any_masked = true; @@ -605,47 +1249,47 @@ static void mask_gesture_apply_task(gesture::GestureData &gesture_data, } } -static void sculpt_gesture_mask_apply_for_symmetry_pass(bContext & /*C*/, - gesture::GestureData &gesture_data) +static void sculpt_gesture_mask_apply_for_symmetry_pass(bContext * /*C*/, + SculptGestureContext *sgcontext) { - const SculptMaskWriteInfo mask_write = SCULPT_mask_get_for_write(gesture_data.ss); - threading::parallel_for(gesture_data.nodes.index_range(), 1, [&](const IndexRange range) { + const SculptMaskWriteInfo mask_write = SCULPT_mask_get_for_write(sgcontext->ss); + threading::parallel_for(sgcontext->nodes.index_range(), 1, [&](const IndexRange range) { for (const int i : range) { - mask_gesture_apply_task(gesture_data, mask_write, gesture_data.nodes[i]); + mask_gesture_apply_task(sgcontext, mask_write, sgcontext->nodes[i]); } }); } -static void sculpt_gesture_mask_end(bContext &C, gesture::GestureData &gesture_data) +static void sculpt_gesture_mask_end(bContext *C, SculptGestureContext *sgcontext) { - Depsgraph *depsgraph = CTX_data_depsgraph_pointer(&C); - if (BKE_pbvh_type(gesture_data.ss->pbvh) == PBVH_GRIDS) { - multires_mark_as_modified(depsgraph, gesture_data.vc.obact, MULTIRES_COORDS_MODIFIED); + Depsgraph *depsgraph = CTX_data_depsgraph_pointer(C); + if (BKE_pbvh_type(sgcontext->ss->pbvh) == PBVH_GRIDS) { + multires_mark_as_modified(depsgraph, sgcontext->vc.obact, MULTIRES_COORDS_MODIFIED); } - blender::bke::pbvh::update_mask(*gesture_data.ss->pbvh); + blender::bke::pbvh::update_mask(*sgcontext->ss->pbvh); } -static void sculpt_gesture_init_mask_properties(bContext &C, - gesture::GestureData &gesture_data, - wmOperator &op) +static void sculpt_gesture_init_mask_properties(bContext *C, + SculptGestureContext *sgcontext, + wmOperator *op) { - gesture_data.operation = reinterpret_cast( + sgcontext->operation = reinterpret_cast( MEM_cnew(__func__)); - SculptGestureMaskOperation *mask_operation = (SculptGestureMaskOperation *) - gesture_data.operation; + SculptGestureMaskOperation *mask_operation = (SculptGestureMaskOperation *)sgcontext->operation; - Object *object = gesture_data.vc.obact; - MultiresModifierData *mmd = BKE_sculpt_multires_active(gesture_data.vc.scene, object); + Object *object = sgcontext->vc.obact; + MultiresModifierData *mmd = BKE_sculpt_multires_active(sgcontext->vc.scene, object); BKE_sculpt_mask_layers_ensure( - CTX_data_depsgraph_pointer(&C), CTX_data_main(&C), gesture_data.vc.obact, mmd); + CTX_data_depsgraph_pointer(C), CTX_data_main(C), sgcontext->vc.obact, mmd); - mask_operation->op.begin = sculpt_gesture_mask_begin; - mask_operation->op.apply_for_symmetry_pass = sculpt_gesture_mask_apply_for_symmetry_pass; - mask_operation->op.end = sculpt_gesture_mask_end; + mask_operation->op.sculpt_gesture_begin = sculpt_gesture_mask_begin; + mask_operation->op.sculpt_gesture_apply_for_symmetry_pass = + sculpt_gesture_mask_apply_for_symmetry_pass; + mask_operation->op.sculpt_gesture_end = sculpt_gesture_mask_end; - mask_operation->mode = PaintMaskFloodMode(RNA_enum_get(op.ptr, "mode")); - mask_operation->value = RNA_float_get(op.ptr, "value"); + mask_operation->mode = PaintMaskFloodMode(RNA_enum_get(op->ptr, "mode")); + mask_operation->value = RNA_float_get(op->ptr, "value"); } static void paint_mask_gesture_operator_properties(wmOperatorType *ot) @@ -663,36 +1307,892 @@ static void paint_mask_gesture_operator_properties(wmOperatorType *ot) 1.0f); } +/* Trim Gesture Operation. */ + +enum eSculptTrimOperationType { + SCULPT_GESTURE_TRIM_INTERSECT, + SCULPT_GESTURE_TRIM_DIFFERENCE, + SCULPT_GESTURE_TRIM_UNION, + SCULPT_GESTURE_TRIM_JOIN, +}; + +/* Intersect is not exposed in the UI because it does not work correctly with symmetry (it deletes + * the symmetrical part of the mesh in the first symmetry pass). */ +static EnumPropertyItem prop_trim_operation_types[] = { + {SCULPT_GESTURE_TRIM_DIFFERENCE, + "DIFFERENCE", + 0, + "Difference", + "Use a difference boolean operation"}, + {SCULPT_GESTURE_TRIM_UNION, "UNION", 0, "Union", "Use a union boolean operation"}, + {SCULPT_GESTURE_TRIM_JOIN, + "JOIN", + 0, + "Join", + "Join the new mesh as separate geometry, without performing any boolean operation"}, + {0, nullptr, 0, nullptr, nullptr}, +}; + +enum eSculptTrimOrientationType { + SCULPT_GESTURE_TRIM_ORIENTATION_VIEW, + SCULPT_GESTURE_TRIM_ORIENTATION_SURFACE, +}; +static EnumPropertyItem prop_trim_orientation_types[] = { + {SCULPT_GESTURE_TRIM_ORIENTATION_VIEW, + "VIEW", + 0, + "View", + "Use the view to orientate the trimming shape"}, + {SCULPT_GESTURE_TRIM_ORIENTATION_SURFACE, + "SURFACE", + 0, + "Surface", + "Use the surface normal to orientate the trimming shape"}, + {0, nullptr, 0, nullptr, nullptr}, +}; + +enum eSculptTrimExtrudeMode { + SCULPT_GESTURE_TRIM_EXTRUDE_PROJECT, + SCULPT_GESTURE_TRIM_EXTRUDE_FIXED +}; + +static EnumPropertyItem prop_trim_extrude_modes[] = { + {SCULPT_GESTURE_TRIM_EXTRUDE_PROJECT, + "PROJECT", + 0, + "Project", + "Project back faces when extruding"}, + {SCULPT_GESTURE_TRIM_EXTRUDE_FIXED, "FIXED", 0, "Fixed", "Extrude back faces by fixed amount"}, + {0, nullptr, 0, nullptr, nullptr}, +}; + +struct SculptGestureTrimOperation { + SculptGestureOperation op; + + Mesh *mesh; + float (*true_mesh_co)[3]; + + float depth_front; + float depth_back; + + bool use_cursor_depth; + + eSculptTrimOperationType mode; + eSculptTrimOrientationType orientation; + eSculptTrimExtrudeMode extrude_mode; +}; + +static void sculpt_gesture_trim_normals_update(SculptGestureContext *sgcontext) +{ + SculptGestureTrimOperation *trim_operation = (SculptGestureTrimOperation *)sgcontext->operation; + Mesh *trim_mesh = trim_operation->mesh; + + const BMAllocTemplate allocsize = BMALLOC_TEMPLATE_FROM_ME(trim_mesh); + + BMeshCreateParams bm_create_params{}; + bm_create_params.use_toolflags = true; + BMesh *bm = BM_mesh_create(&allocsize, &bm_create_params); + + BMeshFromMeshParams bm_from_me_params{}; + bm_from_me_params.calc_face_normal = true; + bm_from_me_params.calc_vert_normal = true; + BM_mesh_bm_from_me(bm, trim_mesh, &bm_from_me_params); + + BM_mesh_elem_hflag_enable_all(bm, BM_FACE, BM_ELEM_TAG, false); + BMO_op_callf(bm, + (BMO_FLAG_DEFAULTS & ~BMO_FLAG_RESPECT_HIDE), + "recalc_face_normals faces=%hf", + BM_ELEM_TAG); + BM_mesh_elem_hflag_disable_all(bm, BM_VERT | BM_EDGE | BM_FACE, BM_ELEM_TAG, false); + + BMeshToMeshParams convert_params{}; + convert_params.calc_object_remap = false; + Mesh *result = BKE_mesh_from_bmesh_nomain(bm, &convert_params, trim_mesh); + + BM_mesh_free(bm); + BKE_id_free(nullptr, trim_mesh); + trim_operation->mesh = result; +} + +/* Get the origin and normal that are going to be used for calculating the depth and position the + * trimming geometry. */ +static void sculpt_gesture_trim_shape_origin_normal_get(SculptGestureContext *sgcontext, + float *r_origin, + float *r_normal) +{ + SculptGestureTrimOperation *trim_operation = (SculptGestureTrimOperation *)sgcontext->operation; + /* Use the view origin and normal in world space. The trimming mesh coordinates are + * calculated in world space, aligned to the view, and then converted to object space to + * store them in the final trimming mesh which is going to be used in the boolean operation. + */ + switch (trim_operation->orientation) { + case SCULPT_GESTURE_TRIM_ORIENTATION_VIEW: + mul_v3_m4v3( + r_origin, sgcontext->vc.obact->object_to_world, sgcontext->ss->gesture_initial_location); + copy_v3_v3(r_normal, sgcontext->world_space_view_normal); + negate_v3(r_normal); + break; + case SCULPT_GESTURE_TRIM_ORIENTATION_SURFACE: + mul_v3_m4v3( + r_origin, sgcontext->vc.obact->object_to_world, sgcontext->ss->gesture_initial_location); + /* 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->object_to_world, r_normal); + break; + } +} + +static void sculpt_gesture_trim_calculate_depth(SculptGestureContext *sgcontext) +{ + SculptGestureTrimOperation *trim_operation = (SculptGestureTrimOperation *)sgcontext->operation; + + SculptSession *ss = sgcontext->ss; + ViewContext *vc = &sgcontext->vc; + + const int totvert = SCULPT_vertex_count_get(ss); + + float shape_plane[4]; + float shape_origin[3]; + float shape_normal[3]; + sculpt_gesture_trim_shape_origin_normal_get(sgcontext, shape_origin, shape_normal); + plane_from_point_normal_v3(shape_plane, shape_origin, shape_normal); + + trim_operation->depth_front = FLT_MAX; + trim_operation->depth_back = -FLT_MAX; + + for (int i = 0; i < totvert; i++) { + PBVHVertRef vertex = BKE_pbvh_index_to_vertex(ss->pbvh, i); + + const float *vco = SCULPT_vertex_co_get(ss, vertex); + /* Convert the coordinates to world space to calculate the depth. When generating the trimming + * mesh, coordinates are first calculated in world space, then converted to object space to + * store them. */ + float world_space_vco[3]; + mul_v3_m4v3(world_space_vco, vc->obact->object_to_world, vco); + const float dist = dist_signed_to_plane_v3(world_space_vco, shape_plane); + trim_operation->depth_front = min_ff(dist, trim_operation->depth_front); + trim_operation->depth_back = max_ff(dist, trim_operation->depth_back); + } + + if (trim_operation->use_cursor_depth) { + float world_space_gesture_initial_location[3]; + mul_v3_m4v3(world_space_gesture_initial_location, + vc->obact->object_to_world, + ss->gesture_initial_location); + + float mid_point_depth; + if (trim_operation->orientation == SCULPT_GESTURE_TRIM_ORIENTATION_VIEW) { + mid_point_depth = ss->gesture_initial_hit ? + dist_signed_to_plane_v3(world_space_gesture_initial_location, + shape_plane) : + (trim_operation->depth_back + trim_operation->depth_front) * 0.5f; + } + else { + /* When using normal orientation, if the stroke started over the mesh, position the mid point + * at 0 distance from the shape plane. This positions the trimming shape half inside of the + * surface. */ + mid_point_depth = ss->gesture_initial_hit ? + 0.0f : + (trim_operation->depth_back + trim_operation->depth_front) * 0.5f; + } + + float depth_radius; + + if (ss->gesture_initial_hit) { + depth_radius = ss->cursor_radius; + } + else { + /* ss->cursor_radius is only valid if the stroke started + * over the sculpt mesh. If it's not we must + * compute the radius ourselves. See #81452. + */ + + Sculpt *sd = CTX_data_tool_settings(vc->C)->sculpt; + Brush *brush = BKE_paint_brush(&sd->paint); + Scene *scene = CTX_data_scene(vc->C); + + if (!BKE_brush_use_locked_size(scene, brush)) { + depth_radius = paint_calc_object_space_radius( + vc, ss->gesture_initial_location, BKE_brush_size_get(scene, brush)); + } + else { + depth_radius = BKE_brush_unprojected_radius_get(scene, brush); + } + } + + trim_operation->depth_front = mid_point_depth - depth_radius; + trim_operation->depth_back = mid_point_depth + depth_radius; + } +} + +static void sculpt_gesture_trim_geometry_generate(SculptGestureContext *sgcontext) +{ + SculptGestureTrimOperation *trim_operation = (SculptGestureTrimOperation *)sgcontext->operation; + ViewContext *vc = &sgcontext->vc; + ARegion *region = vc->region; + + const int tot_screen_points = sgcontext->tot_gesture_points; + BLI_assert(tot_screen_points > 1); + float(*screen_points)[2] = sgcontext->gesture_points; + + const int trim_totverts = tot_screen_points * 2; + const int trim_faces_nums = (2 * (tot_screen_points - 2)) + (2 * tot_screen_points); + trim_operation->mesh = BKE_mesh_new_nomain( + trim_totverts, 0, trim_faces_nums, trim_faces_nums * 3); + trim_operation->true_mesh_co = static_cast( + MEM_malloc_arrayN(trim_totverts, sizeof(float[3]), "mesh orco")); + + float depth_front = trim_operation->depth_front; + float depth_back = trim_operation->depth_back; + float pad_factor = 0.0f; + + if (!trim_operation->use_cursor_depth) { + pad_factor = (depth_back - depth_front) * 0.01f + 0.001f; + + /* When using cursor depth, don't modify the depth set by the cursor radius. If full depth is + * used, adding a little padding to the trimming shape can help avoiding booleans with coplanar + * faces. */ + depth_front -= pad_factor; + depth_back += pad_factor; + } + + float shape_origin[3]; + float shape_normal[3]; + float shape_plane[4]; + sculpt_gesture_trim_shape_origin_normal_get(sgcontext, shape_origin, shape_normal); + plane_from_point_normal_v3(shape_plane, shape_origin, shape_normal); + + const float(*ob_imat)[4] = vc->obact->world_to_object; + + /* Write vertices coordinatesSCULPT_GESTURE_TRIM_DIFFERENCE for the front face. */ + MutableSpan positions = trim_operation->mesh->vert_positions_for_write(); + + float depth_point[3]; + + /* Get origin point for SCULPT_GESTURE_TRIM_ORIENTATION_VIEW. + * Note: for projection extrusion we add depth_front here + * instead of in the loop. + */ + if (trim_operation->extrude_mode == SCULPT_GESTURE_TRIM_EXTRUDE_FIXED) { + copy_v3_v3(depth_point, shape_origin); + } + else { + madd_v3_v3v3fl(depth_point, shape_origin, shape_normal, depth_front); + } + + for (int i = 0; i < tot_screen_points; i++) { + float new_point[3]; + if (trim_operation->orientation == SCULPT_GESTURE_TRIM_ORIENTATION_VIEW) { + ED_view3d_win_to_3d(vc->v3d, region, depth_point, screen_points[i], new_point); + + /* For fixed mode we add the shape normal here to avoid projection errors. */ + if (trim_operation->extrude_mode == SCULPT_GESTURE_TRIM_EXTRUDE_FIXED) { + madd_v3_v3fl(new_point, shape_normal, depth_front); + } + } + else { + ED_view3d_win_to_3d_on_plane(region, shape_plane, screen_points[i], false, new_point); + madd_v3_v3fl(new_point, shape_normal, depth_front); + } + + copy_v3_v3(positions[i], new_point); + } + + /* Write vertices coordinates for the back face. */ + madd_v3_v3v3fl(depth_point, shape_origin, shape_normal, depth_back); + for (int i = 0; i < tot_screen_points; i++) { + float new_point[3]; + + if (trim_operation->extrude_mode == SCULPT_GESTURE_TRIM_EXTRUDE_PROJECT) { + if (trim_operation->orientation == SCULPT_GESTURE_TRIM_ORIENTATION_VIEW) { + ED_view3d_win_to_3d(vc->v3d, region, depth_point, screen_points[i], new_point); + } + else { + ED_view3d_win_to_3d_on_plane(region, shape_plane, screen_points[i], false, new_point); + madd_v3_v3fl(new_point, shape_normal, depth_back); + } + } + else { + copy_v3_v3(new_point, positions[i]); + float dist = dist_signed_to_plane_v3(new_point, shape_plane); + + madd_v3_v3fl(new_point, shape_normal, depth_back - dist); + } + + copy_v3_v3(positions[i + tot_screen_points], new_point); + } + + /* Project to object space. */ + for (int i = 0; i < tot_screen_points * 2; i++) { + float new_point[3]; + + copy_v3_v3(new_point, positions[i]); + mul_v3_m4v3(positions[i], ob_imat, new_point); + mul_v3_m4v3(trim_operation->true_mesh_co[i], ob_imat, new_point); + } + + /* Get the triangulation for the front/back poly. */ + const int tot_tris_face = tot_screen_points - 2; + uint(*r_tris)[3] = static_cast( + MEM_malloc_arrayN(tot_tris_face, sizeof(uint[3]), "tris")); + BLI_polyfill_calc(screen_points, tot_screen_points, 0, r_tris); + + /* Write the front face triangle indices. */ + MutableSpan face_offsets = trim_operation->mesh->face_offsets_for_write(); + MutableSpan corner_verts = trim_operation->mesh->corner_verts_for_write(); + int face_index = 0; + int loop_index = 0; + for (int i = 0; i < tot_tris_face; i++) { + face_offsets[face_index] = loop_index; + corner_verts[loop_index + 0] = r_tris[i][0]; + corner_verts[loop_index + 1] = r_tris[i][1]; + corner_verts[loop_index + 2] = r_tris[i][2]; + face_index++; + loop_index += 3; + } + + /* Write the back face triangle indices. */ + for (int i = 0; i < tot_tris_face; i++) { + face_offsets[face_index] = loop_index; + corner_verts[loop_index + 0] = r_tris[i][0] + tot_screen_points; + corner_verts[loop_index + 1] = r_tris[i][1] + tot_screen_points; + corner_verts[loop_index + 2] = r_tris[i][2] + tot_screen_points; + face_index++; + loop_index += 3; + } + + MEM_freeN(r_tris); + + /* Write the indices for the lateral triangles. */ + for (int i = 0; i < tot_screen_points; i++) { + face_offsets[face_index] = loop_index; + int current_index = i; + int next_index = current_index + 1; + if (next_index >= tot_screen_points) { + next_index = 0; + } + corner_verts[loop_index + 0] = next_index + tot_screen_points; + corner_verts[loop_index + 1] = next_index; + corner_verts[loop_index + 2] = current_index; + face_index++; + loop_index += 3; + } + + for (int i = 0; i < tot_screen_points; i++) { + face_offsets[face_index] = loop_index; + int current_index = i; + int next_index = current_index + 1; + if (next_index >= tot_screen_points) { + next_index = 0; + } + corner_verts[loop_index + 0] = current_index; + corner_verts[loop_index + 1] = current_index + tot_screen_points; + corner_verts[loop_index + 2] = next_index + tot_screen_points; + face_index++; + loop_index += 3; + } + + bke::mesh_smooth_set(*trim_operation->mesh, false); + bke::mesh_calc_edges(*trim_operation->mesh, false, false); + sculpt_gesture_trim_normals_update(sgcontext); +} + +static void sculpt_gesture_trim_geometry_free(SculptGestureContext *sgcontext) +{ + SculptGestureTrimOperation *trim_operation = (SculptGestureTrimOperation *)sgcontext->operation; + BKE_id_free(nullptr, trim_operation->mesh); + MEM_freeN(trim_operation->true_mesh_co); +} + +static int bm_face_isect_pair(BMFace *f, void * /*user_data*/) +{ + return BM_elem_flag_test(f, BM_ELEM_DRAW) ? 1 : 0; +} + +static void sculpt_gesture_apply_trim(SculptGestureContext *sgcontext) +{ + SculptGestureTrimOperation *trim_operation = (SculptGestureTrimOperation *)sgcontext->operation; + Mesh *sculpt_mesh = BKE_mesh_from_object(sgcontext->vc.obact); + Mesh *trim_mesh = trim_operation->mesh; + + const BMAllocTemplate allocsize = BMALLOC_TEMPLATE_FROM_ME(sculpt_mesh, trim_mesh); + + BMeshCreateParams bm_create_params{}; + bm_create_params.use_toolflags = false; + BMesh *bm = BM_mesh_create(&allocsize, &bm_create_params); + + BMeshFromMeshParams bm_from_me_params{}; + bm_from_me_params.calc_face_normal = true; + bm_from_me_params.calc_vert_normal = true; + BM_mesh_bm_from_me(bm, trim_mesh, &bm_from_me_params); + BM_mesh_bm_from_me(bm, sculpt_mesh, &bm_from_me_params); + + const int corner_tris_tot = poly_to_tri_count(bm->totface, bm->totloop); + BMLoop *(*corner_tris)[3] = static_cast( + MEM_malloc_arrayN(corner_tris_tot, sizeof(*corner_tris), __func__)); + BM_mesh_calc_tessellation_beauty(bm, corner_tris); + + BMIter iter; + int i; + const int i_faces_end = trim_mesh->faces_num; + + /* We need face normals because of 'BM_face_split_edgenet' + * we could calculate on the fly too (before calling split). */ + + const short ob_src_totcol = trim_mesh->totcol; + Array material_remap(ob_src_totcol ? ob_src_totcol : 1); + + BMFace *efa; + i = 0; + BM_ITER_MESH (efa, &iter, bm, BM_FACES_OF_MESH) { + normalize_v3(efa->no); + + /* Temp tag to test which side split faces are from. */ + BM_elem_flag_enable(efa, BM_ELEM_DRAW); + + /* Remap material. */ + if (efa->mat_nr < ob_src_totcol) { + efa->mat_nr = material_remap[efa->mat_nr]; + } + + if (++i == i_faces_end) { + break; + } + } + + /* Join does not do a boolean operation, it just adds the geometry. */ + if (trim_operation->mode != SCULPT_GESTURE_TRIM_JOIN) { + int boolean_mode = 0; + switch (trim_operation->mode) { + case SCULPT_GESTURE_TRIM_INTERSECT: + boolean_mode = eBooleanModifierOp_Intersect; + break; + case SCULPT_GESTURE_TRIM_DIFFERENCE: + boolean_mode = eBooleanModifierOp_Difference; + break; + case SCULPT_GESTURE_TRIM_UNION: + boolean_mode = eBooleanModifierOp_Union; + break; + case SCULPT_GESTURE_TRIM_JOIN: + BLI_assert(false); + break; + } + BM_mesh_boolean(bm, + corner_tris, + corner_tris_tot, + bm_face_isect_pair, + nullptr, + 2, + true, + true, + false, + boolean_mode); + } + + MEM_freeN(corner_tris); + + BMeshToMeshParams convert_params{}; + convert_params.calc_object_remap = false; + Mesh *result = BKE_mesh_from_bmesh_nomain(bm, &convert_params, sculpt_mesh); + + BM_mesh_free(bm); + BKE_mesh_nomain_to_mesh( + result, static_cast(sgcontext->vc.obact->data), sgcontext->vc.obact); +} + +static void sculpt_gesture_trim_begin(bContext *C, SculptGestureContext *sgcontext) +{ + Object *object = sgcontext->vc.obact; + SculptSession *ss = object->sculpt; + + Depsgraph *depsgraph = CTX_data_ensure_evaluated_depsgraph(C); + sculpt_gesture_trim_calculate_depth(sgcontext); + sculpt_gesture_trim_geometry_generate(sgcontext); + SCULPT_topology_islands_invalidate(ss); + BKE_sculpt_update_object_for_edit(depsgraph, sgcontext->vc.obact, false); + undo::push_node(sgcontext->vc.obact, nullptr, undo::Type::Geometry); +} + +static void sculpt_gesture_trim_apply_for_symmetry_pass(bContext * /*C*/, + SculptGestureContext *sgcontext) +{ + SculptGestureTrimOperation *trim_operation = (SculptGestureTrimOperation *)sgcontext->operation; + Mesh *trim_mesh = trim_operation->mesh; + MutableSpan positions = trim_mesh->vert_positions_for_write(); + for (int i = 0; i < trim_mesh->verts_num; i++) { + flip_v3_v3(positions[i], trim_operation->true_mesh_co[i], sgcontext->symmpass); + } + sculpt_gesture_trim_normals_update(sgcontext); + sculpt_gesture_apply_trim(sgcontext); +} + +static void sculpt_gesture_trim_end(bContext * /*C*/, SculptGestureContext *sgcontext) +{ + Object *object = sgcontext->vc.obact; + Mesh *mesh = (Mesh *)object->data; + const bke::AttributeAccessor attributes = mesh->attributes_for_write(); + if (attributes.contains(".sculpt_face_set")) { + /* Assign a new Face Set ID to the new faces created by the trim operation. */ + const int next_face_set_id = face_set::find_next_available_id(*object); + face_set::initialize_none_to_id(mesh, next_face_set_id); + } + + sculpt_gesture_trim_geometry_free(sgcontext); + + undo::push_node(sgcontext->vc.obact, nullptr, undo::Type::Geometry); + BKE_mesh_batch_cache_dirty_tag(mesh, BKE_MESH_BATCH_DIRTY_ALL); + DEG_id_tag_update(&sgcontext->vc.obact->id, ID_RECALC_GEOMETRY); +} + +static void sculpt_gesture_init_trim_properties(SculptGestureContext *sgcontext, wmOperator *op) +{ + sgcontext->operation = reinterpret_cast( + MEM_cnew(__func__)); + + SculptGestureTrimOperation *trim_operation = (SculptGestureTrimOperation *)sgcontext->operation; + + trim_operation->op.sculpt_gesture_begin = sculpt_gesture_trim_begin; + trim_operation->op.sculpt_gesture_apply_for_symmetry_pass = + sculpt_gesture_trim_apply_for_symmetry_pass; + trim_operation->op.sculpt_gesture_end = sculpt_gesture_trim_end; + + trim_operation->mode = eSculptTrimOperationType(RNA_enum_get(op->ptr, "trim_mode")); + trim_operation->use_cursor_depth = RNA_boolean_get(op->ptr, "use_cursor_depth"); + trim_operation->orientation = eSculptTrimOrientationType( + RNA_enum_get(op->ptr, "trim_orientation")); + trim_operation->extrude_mode = eSculptTrimExtrudeMode( + RNA_enum_get(op->ptr, "trim_extrude_mode")); + + /* If the cursor was not over the mesh, force the orientation to view. */ + if (!sgcontext->ss->gesture_initial_hit) { + trim_operation->orientation = SCULPT_GESTURE_TRIM_ORIENTATION_VIEW; + } +} + +static void sculpt_trim_gesture_operator_properties(wmOperatorType *ot) +{ + RNA_def_enum(ot->srna, + "trim_mode", + prop_trim_operation_types, + SCULPT_GESTURE_TRIM_DIFFERENCE, + "Trim Mode", + nullptr); + RNA_def_boolean( + ot->srna, + "use_cursor_depth", + false, + "Use Cursor for Depth", + "Use cursor location and radius for the dimensions and position of the trimming shape"); + RNA_def_enum(ot->srna, + "trim_orientation", + prop_trim_orientation_types, + SCULPT_GESTURE_TRIM_ORIENTATION_VIEW, + "Shape Orientation", + nullptr); + RNA_def_enum(ot->srna, + "trim_extrude_mode", + prop_trim_extrude_modes, + SCULPT_GESTURE_TRIM_EXTRUDE_FIXED, + "Extrude Mode", + nullptr); +} + +/* Project Gesture Operation. */ + +struct SculptGestureProjectOperation { + SculptGestureOperation operation; +}; + +static void sculpt_gesture_project_begin(bContext *C, SculptGestureContext *sgcontext) +{ + Depsgraph *depsgraph = CTX_data_depsgraph_pointer(C); + BKE_sculpt_update_object_for_edit(depsgraph, sgcontext->vc.obact, false); +} + +static void project_line_gesture_apply_task(SculptGestureContext *sgcontext, PBVHNode *node) +{ + PBVHVertexIter vd; + bool any_updated = false; + + undo::push_node(sgcontext->vc.obact, node, undo::Type::Position); + + BKE_pbvh_vertex_iter_begin (sgcontext->ss->pbvh, node, vd, PBVH_ITER_UNIQUE) { + float vertex_normal[3]; + const float *co = SCULPT_vertex_co_get(sgcontext->ss, vd.vertex); + SCULPT_vertex_normal_get(sgcontext->ss, vd.vertex, vertex_normal); + + if (!sculpt_gesture_is_effected(sgcontext, co, vertex_normal)) { + continue; + } + + float projected_pos[3]; + closest_to_plane_v3(projected_pos, sgcontext->line.plane, vd.co); + + float disp[3]; + sub_v3_v3v3(disp, projected_pos, vd.co); + const float mask = vd.mask; + mul_v3_fl(disp, 1.0f - mask); + if (is_zero_v3(disp)) { + continue; + } + add_v3_v3(vd.co, disp); + any_updated = true; + } + BKE_pbvh_vertex_iter_end; + + if (any_updated) { + BKE_pbvh_node_mark_update(node); + } +} + +static void sculpt_gesture_project_apply_for_symmetry_pass(bContext * /*C*/, + SculptGestureContext *sgcontext) +{ + switch (sgcontext->shape_type) { + case SCULPT_GESTURE_SHAPE_LINE: + threading::parallel_for(sgcontext->nodes.index_range(), 1, [&](const IndexRange range) { + for (const int i : range) { + project_line_gesture_apply_task(sgcontext, sgcontext->nodes[i]); + } + }); + break; + case SCULPT_GESTURE_SHAPE_LASSO: + case SCULPT_GESTURE_SHAPE_BOX: + /* Gesture shape projection not implemented yet. */ + BLI_assert(false); + break; + } +} + +static void sculpt_gesture_project_end(bContext *C, SculptGestureContext *sgcontext) +{ + SculptSession *ss = sgcontext->ss; + Sculpt *sd = CTX_data_tool_settings(C)->sculpt; + if (ss->deform_modifiers_active || ss->shapekey_active) { + SCULPT_flush_stroke_deform(sd, sgcontext->vc.obact, true); + } + + SCULPT_flush_update_step(C, SCULPT_UPDATE_COORDS); + SCULPT_flush_update_done(C, sgcontext->vc.obact, SCULPT_UPDATE_COORDS); +} + +static void sculpt_gesture_init_project_properties(SculptGestureContext *sgcontext, + wmOperator * /*op*/) +{ + sgcontext->operation = reinterpret_cast( + MEM_cnew(__func__)); + + SculptGestureProjectOperation *project_operation = (SculptGestureProjectOperation *) + sgcontext->operation; + + project_operation->operation.sculpt_gesture_begin = sculpt_gesture_project_begin; + project_operation->operation.sculpt_gesture_apply_for_symmetry_pass = + sculpt_gesture_project_apply_for_symmetry_pass; + project_operation->operation.sculpt_gesture_end = sculpt_gesture_project_end; +} + static int paint_mask_gesture_box_exec(bContext *C, wmOperator *op) { - std::unique_ptr gesture_data = gesture::init_from_box(C, op); - if (!gesture_data) { + SculptGestureContext *sgcontext = sculpt_gesture_init_from_box(C, op); + if (!sgcontext) { return OPERATOR_CANCELLED; } - sculpt_gesture_init_mask_properties(*C, *gesture_data, *op); - gesture::apply(*C, *gesture_data, *op); + sculpt_gesture_init_mask_properties(C, sgcontext, op); + sculpt_gesture_apply(C, sgcontext, op); + sculpt_gesture_context_free(sgcontext); return OPERATOR_FINISHED; } static int paint_mask_gesture_lasso_exec(bContext *C, wmOperator *op) { - std::unique_ptr gesture_data = gesture::init_from_lasso(C, op); - if (!gesture_data) { + SculptGestureContext *sgcontext = sculpt_gesture_init_from_lasso(C, op); + if (!sgcontext) { return OPERATOR_CANCELLED; } - sculpt_gesture_init_mask_properties(*C, *gesture_data, *op); - gesture::apply(*C, *gesture_data, *op); + sculpt_gesture_init_mask_properties(C, sgcontext, op); + sculpt_gesture_apply(C, sgcontext, op); + sculpt_gesture_context_free(sgcontext); return OPERATOR_FINISHED; } static int paint_mask_gesture_line_exec(bContext *C, wmOperator *op) { - std::unique_ptr gesture_data = gesture::init_from_line(C, op); - if (!gesture_data) { + SculptGestureContext *sgcontext = sculpt_gesture_init_from_line(C, op); + if (!sgcontext) { return OPERATOR_CANCELLED; } - sculpt_gesture_init_mask_properties(*C, *gesture_data, *op); - gesture::apply(*C, *gesture_data, *op); + sculpt_gesture_init_mask_properties(C, sgcontext, op); + sculpt_gesture_apply(C, sgcontext, op); + sculpt_gesture_context_free(sgcontext); + return OPERATOR_FINISHED; +} + +static int face_set_gesture_box_invoke(bContext *C, wmOperator *op, const wmEvent *event) +{ + const View3D *v3d = CTX_wm_view3d(C); + const Base *base = CTX_data_active_base(C); + if (!BKE_base_is_visible(v3d, base)) { + return OPERATOR_CANCELLED; + } + + return WM_gesture_box_invoke(C, op, event); +} + +static int face_set_gesture_box_exec(bContext *C, wmOperator *op) +{ + SculptGestureContext *sgcontext = sculpt_gesture_init_from_box(C, op); + if (!sgcontext) { + return OPERATOR_CANCELLED; + } + sculpt_gesture_init_face_set_properties(sgcontext, op); + sculpt_gesture_apply(C, sgcontext, op); + sculpt_gesture_context_free(sgcontext); + return OPERATOR_FINISHED; +} + +static int face_set_gesture_lasso_invoke(bContext *C, wmOperator *op, const wmEvent *event) +{ + const View3D *v3d = CTX_wm_view3d(C); + const Base *base = CTX_data_active_base(C); + if (!BKE_base_is_visible(v3d, base)) { + return OPERATOR_CANCELLED; + } + + return WM_gesture_lasso_invoke(C, op, event); +} + +static int face_set_gesture_lasso_exec(bContext *C, wmOperator *op) +{ + SculptGestureContext *sgcontext = sculpt_gesture_init_from_lasso(C, op); + if (!sgcontext) { + return OPERATOR_CANCELLED; + } + sculpt_gesture_init_face_set_properties(sgcontext, op); + sculpt_gesture_apply(C, sgcontext, op); + sculpt_gesture_context_free(sgcontext); + return OPERATOR_FINISHED; +} + +static int sculpt_trim_gesture_box_exec(bContext *C, wmOperator *op) +{ + Object *object = CTX_data_active_object(C); + SculptSession *ss = object->sculpt; + if (BKE_pbvh_type(ss->pbvh) != PBVH_FACES) { + /* Not supported in Multires and Dyntopo. */ + return OPERATOR_CANCELLED; + } + + if (ss->totvert == 0) { + /* No geometry to trim or to detect a valid position for the trimming shape. */ + return OPERATOR_CANCELLED; + } + + SculptGestureContext *sgcontext = sculpt_gesture_init_from_box(C, op); + if (!sgcontext) { + return OPERATOR_CANCELLED; + } + + sculpt_gesture_init_trim_properties(sgcontext, op); + sculpt_gesture_apply(C, sgcontext, op); + sculpt_gesture_context_free(sgcontext); + return OPERATOR_FINISHED; +} + +static int sculpt_trim_gesture_box_invoke(bContext *C, wmOperator *op, const wmEvent *event) +{ + Object *ob = CTX_data_active_object(C); + SculptSession *ss = ob->sculpt; + + const View3D *v3d = CTX_wm_view3d(C); + const Base *base = CTX_data_active_base(C); + if (!BKE_base_is_visible(v3d, base)) { + return OPERATOR_CANCELLED; + } + + SculptCursorGeometryInfo sgi; + const float mval_fl[2] = {float(event->mval[0]), float(event->mval[1])}; + SCULPT_vertex_random_access_ensure(ss); + ss->gesture_initial_hit = SCULPT_cursor_geometry_info_update(C, &sgi, mval_fl, false); + if (ss->gesture_initial_hit) { + copy_v3_v3(ss->gesture_initial_location, sgi.location); + copy_v3_v3(ss->gesture_initial_normal, sgi.normal); + } + + return WM_gesture_box_invoke(C, op, event); +} + +static int sculpt_trim_gesture_lasso_exec(bContext *C, wmOperator *op) +{ + Depsgraph *depsgraph = CTX_data_ensure_evaluated_depsgraph(C); + Object *object = CTX_data_active_object(C); + + BKE_sculpt_update_object_for_edit(depsgraph, object, false); + + SculptSession *ss = object->sculpt; + if (BKE_pbvh_type(ss->pbvh) != PBVH_FACES) { + /* Not supported in Multires and Dyntopo. */ + return OPERATOR_CANCELLED; + } + + if (ss->totvert == 0) { + /* No geometry to trim or to detect a valid position for the trimming shape. */ + return OPERATOR_CANCELLED; + } + + SculptGestureContext *sgcontext = sculpt_gesture_init_from_lasso(C, op); + if (!sgcontext) { + return OPERATOR_CANCELLED; + } + sculpt_gesture_init_trim_properties(sgcontext, op); + sculpt_gesture_apply(C, sgcontext, op); + sculpt_gesture_context_free(sgcontext); + return OPERATOR_FINISHED; +} + +static int sculpt_trim_gesture_lasso_invoke(bContext *C, wmOperator *op, const wmEvent *event) +{ + Object *ob = CTX_data_active_object(C); + SculptSession *ss = ob->sculpt; + + const View3D *v3d = CTX_wm_view3d(C); + const Base *base = CTX_data_active_base(C); + if (!BKE_base_is_visible(v3d, base)) { + return OPERATOR_CANCELLED; + } + + SculptCursorGeometryInfo sgi; + const float mval_fl[2] = {float(event->mval[0]), float(event->mval[1])}; + SCULPT_vertex_random_access_ensure(ss); + ss->gesture_initial_hit = SCULPT_cursor_geometry_info_update(C, &sgi, mval_fl, false); + if (ss->gesture_initial_hit) { + copy_v3_v3(ss->gesture_initial_location, sgi.location); + copy_v3_v3(ss->gesture_initial_normal, sgi.normal); + } + + return WM_gesture_lasso_invoke(C, op, event); +} + +static int project_line_gesture_invoke(bContext *C, wmOperator *op, const wmEvent *event) +{ + const View3D *v3d = CTX_wm_view3d(C); + const Base *base = CTX_data_active_base(C); + if (!BKE_base_is_visible(v3d, base)) { + return OPERATOR_CANCELLED; + } + + return WM_gesture_straightline_active_side_invoke(C, op, event); +} + +static int project_gesture_line_exec(bContext *C, wmOperator *op) +{ + SculptGestureContext *sgcontext = sculpt_gesture_init_from_line(C, op); + if (!sgcontext) { + return OPERATOR_CANCELLED; + } + sculpt_gesture_init_project_properties(sgcontext, op); + sculpt_gesture_apply(C, sgcontext, op); + sculpt_gesture_context_free(sgcontext); return OPERATOR_FINISHED; } @@ -710,8 +2210,9 @@ void PAINT_OT_mask_lasso_gesture(wmOperatorType *ot) ot->flag = OPTYPE_REGISTER | OPTYPE_DEPENDS_ON_CURSOR; + /* Properties. */ WM_operator_properties_gesture_lasso(ot); - gesture::operator_properties(ot); + sculpt_gesture_operator_properties(ot); paint_mask_gesture_operator_properties(ot); } @@ -730,8 +2231,9 @@ void PAINT_OT_mask_box_gesture(wmOperatorType *ot) ot->flag = OPTYPE_REGISTER; + /* Properties. */ WM_operator_properties_border(ot); - gesture::operator_properties(ot); + sculpt_gesture_operator_properties(ot); paint_mask_gesture_operator_properties(ot); } @@ -750,10 +2252,110 @@ void PAINT_OT_mask_line_gesture(wmOperatorType *ot) ot->flag = OPTYPE_REGISTER; + /* Properties. */ WM_operator_properties_gesture_straightline(ot, WM_CURSOR_EDIT); - gesture::operator_properties(ot); + sculpt_gesture_operator_properties(ot); paint_mask_gesture_operator_properties(ot); } +void SCULPT_OT_face_set_lasso_gesture(wmOperatorType *ot) +{ + ot->name = "Face Set Lasso Gesture"; + ot->idname = "SCULPT_OT_face_set_lasso_gesture"; + ot->description = "Add face set within the lasso as you move the brush"; + + ot->invoke = face_set_gesture_lasso_invoke; + ot->modal = WM_gesture_lasso_modal; + ot->exec = face_set_gesture_lasso_exec; + + ot->poll = SCULPT_mode_poll_view3d; + + ot->flag = OPTYPE_DEPENDS_ON_CURSOR; + + /* Properties. */ + WM_operator_properties_gesture_lasso(ot); + sculpt_gesture_operator_properties(ot); +} + +void SCULPT_OT_face_set_box_gesture(wmOperatorType *ot) +{ + ot->name = "Face Set Box Gesture"; + ot->idname = "SCULPT_OT_face_set_box_gesture"; + ot->description = "Add face set within the box as you move the brush"; + + ot->invoke = face_set_gesture_box_invoke; + ot->modal = WM_gesture_box_modal; + ot->exec = face_set_gesture_box_exec; + + ot->poll = SCULPT_mode_poll_view3d; + + ot->flag = OPTYPE_REGISTER; + + /* Properties. */ + WM_operator_properties_border(ot); + sculpt_gesture_operator_properties(ot); +} + +void SCULPT_OT_trim_lasso_gesture(wmOperatorType *ot) +{ + ot->name = "Trim Lasso Gesture"; + ot->idname = "SCULPT_OT_trim_lasso_gesture"; + ot->description = "Trims the mesh within the lasso as you move the brush"; + + ot->invoke = sculpt_trim_gesture_lasso_invoke; + ot->modal = WM_gesture_lasso_modal; + ot->exec = sculpt_trim_gesture_lasso_exec; + + ot->poll = SCULPT_mode_poll_view3d; + + ot->flag = OPTYPE_REGISTER | OPTYPE_DEPENDS_ON_CURSOR; + + /* Properties. */ + WM_operator_properties_gesture_lasso(ot); + sculpt_gesture_operator_properties(ot); + + sculpt_trim_gesture_operator_properties(ot); +} + +void SCULPT_OT_trim_box_gesture(wmOperatorType *ot) +{ + ot->name = "Trim Box Gesture"; + ot->idname = "SCULPT_OT_trim_box_gesture"; + ot->description = "Trims the mesh within the box as you move the brush"; + + ot->invoke = sculpt_trim_gesture_box_invoke; + ot->modal = WM_gesture_box_modal; + ot->exec = sculpt_trim_gesture_box_exec; + + ot->poll = SCULPT_mode_poll_view3d; + + ot->flag = OPTYPE_REGISTER; + + /* Properties. */ + WM_operator_properties_border(ot); + sculpt_gesture_operator_properties(ot); + + sculpt_trim_gesture_operator_properties(ot); +} + +void SCULPT_OT_project_line_gesture(wmOperatorType *ot) +{ + ot->name = "Project Line Gesture"; + ot->idname = "SCULPT_OT_project_line_gesture"; + ot->description = "Project the geometry onto a plane defined by a line"; + + ot->invoke = project_line_gesture_invoke; + ot->modal = WM_gesture_straightline_oneshot_modal; + ot->exec = project_gesture_line_exec; + + ot->poll = SCULPT_mode_poll_view3d; + + ot->flag = OPTYPE_REGISTER; + + /* Properties. */ + WM_operator_properties_gesture_straightline(ot, WM_CURSOR_EDIT); + sculpt_gesture_operator_properties(ot); +} + } // namespace blender::ed::sculpt_paint::mask diff --git a/source/blender/editors/sculpt_paint/paint_ops.cc b/source/blender/editors/sculpt_paint/paint_ops.cc index 98e33d902cb..2a7028a2aab 100644 --- a/source/blender/editors/sculpt_paint/paint_ops.cc +++ b/source/blender/editors/sculpt_paint/paint_ops.cc @@ -17,6 +17,8 @@ #include "BLI_string.h" #include "BLI_utildefines.h" +#include "BLT_translation.h" + #include "IMB_interp.hh" #include "DNA_brush_types.h" @@ -30,7 +32,7 @@ #include "BKE_lib_id.hh" #include "BKE_main.hh" #include "BKE_paint.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "ED_image.hh" #include "ED_paint.hh" @@ -1547,10 +1549,7 @@ void ED_operatortypes_paint() WM_operatortype_append(PAINT_OT_face_vert_reveal); /* partial visibility */ - WM_operatortype_append(hide::PAINT_OT_hide_show_all); - WM_operatortype_append(hide::PAINT_OT_hide_show_masked); WM_operatortype_append(hide::PAINT_OT_hide_show); - WM_operatortype_append(hide::PAINT_OT_hide_show_lasso_gesture); WM_operatortype_append(hide::PAINT_OT_visibility_invert); /* paint masking */ diff --git a/source/blender/editors/sculpt_paint/paint_stroke.cc b/source/blender/editors/sculpt_paint/paint_stroke.cc index 6bde9707c8b..48ce84c1346 100644 --- a/source/blender/editors/sculpt_paint/paint_stroke.cc +++ b/source/blender/editors/sculpt_paint/paint_stroke.cc @@ -12,6 +12,7 @@ #include "MEM_guardedalloc.h" +#include "BLI_listbase.h" #include "BLI_math_matrix.h" #include "BLI_rand.hh" #include "BLI_utildefines.h" @@ -550,7 +551,7 @@ static void paint_brush_stroke_add_step( C, world_space_position, stroke->last_mouse_position, stroke->original)) { copy_v3_v3(stroke->last_world_space_position, world_space_position); - mul_m4_v3(stroke->vc.obact->object_to_world().ptr(), stroke->last_world_space_position); + mul_m4_v3(stroke->vc.obact->object_to_world, stroke->last_world_space_position); } else { add_v3_v3(stroke->last_world_space_position, stroke->last_scene_spacing_delta); @@ -668,7 +669,7 @@ static float paint_space_stroke_spacing(bContext *C, if (!BKE_brush_use_locked_size(scene, brush)) { float last_object_space_position[3]; mul_v3_m4v3(last_object_space_position, - stroke->vc.obact->world_to_object().ptr(), + stroke->vc.obact->world_to_object, stroke->last_world_space_position); size_clamp = paint_calc_object_space_radius(&stroke->vc, last_object_space_position, size); } @@ -818,7 +819,7 @@ static int paint_space_stroke(bContext *C, if (use_scene_spacing) { float world_space_position[3]; bool hit = SCULPT_stroke_get_location(C, world_space_position, final_mouse, stroke->original); - mul_m4_v3(stroke->vc.obact->object_to_world().ptr(), world_space_position); + mul_m4_v3(stroke->vc.obact->object_to_world, world_space_position); if (hit && stroke->stroke_over_mesh) { sub_v3_v3v3(d_world_space_position, world_space_position, stroke->last_world_space_position); length = len_v3(d_world_space_position); @@ -1224,8 +1225,8 @@ static void paint_line_strokes_spacing(bContext *C, C, world_space_position_old, old_pos, stroke->original); bool hit_new = SCULPT_stroke_get_location( C, world_space_position_new, new_pos, stroke->original); - mul_m4_v3(stroke->vc.obact->object_to_world().ptr(), world_space_position_old); - mul_m4_v3(stroke->vc.obact->object_to_world().ptr(), world_space_position_new); + mul_m4_v3(stroke->vc.obact->object_to_world, world_space_position_old); + mul_m4_v3(stroke->vc.obact->object_to_world, world_space_position_new); if (hit_old && hit_new && stroke->stroke_over_mesh) { sub_v3_v3v3(d_world_space_position, world_space_position_new, world_space_position_old); length = len_v3(d_world_space_position); @@ -1369,8 +1370,7 @@ static bool paint_stroke_curve_end(bContext *C, wmOperator *op, PaintStroke *str if (paint_stroke_use_scene_spacing(br, BKE_paintmode_get_active_from_context(C))) { stroke->stroke_over_mesh = SCULPT_stroke_get_location( C, stroke->last_world_space_position, data + 2 * j, stroke->original); - mul_m4_v3(stroke->vc.obact->object_to_world().ptr(), - stroke->last_world_space_position); + mul_m4_v3(stroke->vc.obact->object_to_world, stroke->last_world_space_position); } stroke->stroke_started = stroke->test_start(C, op, stroke->last_mouse_position); @@ -1504,7 +1504,7 @@ int paint_stroke_modal(bContext *C, wmOperator *op, const wmEvent *event, PaintS if (paint_stroke_use_scene_spacing(br, mode)) { stroke->stroke_over_mesh = SCULPT_stroke_get_location( C, stroke->last_world_space_position, sample_average.mouse, stroke->original); - mul_m4_v3(stroke->vc.obact->object_to_world().ptr(), stroke->last_world_space_position); + mul_m4_v3(stroke->vc.obact->object_to_world, stroke->last_world_space_position); } stroke->stroke_started = stroke->test_start(C, op, sample_average.mouse); diff --git a/source/blender/editors/sculpt_paint/paint_utils.cc b/source/blender/editors/sculpt_paint/paint_utils.cc index dfaac319397..e7980ea4a14 100644 --- a/source/blender/editors/sculpt_paint/paint_utils.cc +++ b/source/blender/editors/sculpt_paint/paint_utils.cc @@ -23,7 +23,7 @@ #include "BLI_rect.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_brush.hh" #include "BKE_colortools.hh" @@ -33,9 +33,10 @@ #include "BKE_layer.hh" #include "BKE_material.h" #include "BKE_mesh.hh" +#include "BKE_mesh_runtime.hh" #include "BKE_object.hh" #include "BKE_paint.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "DEG_depsgraph.hh" #include "DEG_depsgraph_query.hh" @@ -44,9 +45,12 @@ #include "RNA_define.hh" #include "RNA_prototypes.h" +#include "GPU_framebuffer.h" #include "GPU_matrix.h" #include "GPU_state.h" +#include "GPU_texture.h" +#include "IMB_imbuf.hh" #include "IMB_imbuf_types.hh" #include "IMB_interp.hh" @@ -133,12 +137,12 @@ float paint_calc_object_space_radius(ViewContext *vc, const float center[3], flo float delta[3], scale, loc[3]; const float xy_delta[2] = {pixel_radius, 0.0f}; - mul_v3_m4v3(loc, ob->object_to_world().ptr(), center); + mul_v3_m4v3(loc, ob->object_to_world, center); const float zfac = ED_view3d_calc_zfac(vc->rv3d, loc); ED_view3d_win_to_delta(vc->region, xy_delta, zfac, delta); - scale = fabsf(mat4_to_scale(ob->object_to_world().ptr())); + scale = fabsf(mat4_to_scale(ob->object_to_world)); scale = (scale == 0.0f) ? 1.0f : scale; return len_v3(delta) / scale; @@ -259,7 +263,7 @@ static void imapaint_tri_weights(float matrix[4][4], } /* compute uv coordinates of mouse in face */ -static void imapaint_pick_uv(const Mesh *mesh_eval, +static void imapaint_pick_uv(const Mesh *me_eval, Scene *scene, Object *ob_eval, uint faceindex, @@ -271,27 +275,27 @@ static void imapaint_pick_uv(const Mesh *mesh_eval, int view[4]; const ePaintCanvasSource mode = ePaintCanvasSource(scene->toolsettings->imapaint.mode); - const blender::Span tris = mesh_eval->corner_tris(); - const blender::Span tri_faces = mesh_eval->corner_tri_faces(); + const blender::Span tris = me_eval->corner_tris(); + const blender::Span tri_faces = me_eval->corner_tri_faces(); - const blender::Span positions = mesh_eval->vert_positions(); - const blender::Span corner_verts = mesh_eval->corner_verts(); + const blender::Span positions = me_eval->vert_positions(); + const blender::Span corner_verts = me_eval->corner_verts(); const int *index_mp_to_orig = static_cast( - CustomData_get_layer(&mesh_eval->face_data, CD_ORIGINDEX)); + CustomData_get_layer(&me_eval->face_data, CD_ORIGINDEX)); /* get the needed opengl matrices */ GPU_viewport_size_get_i(view); GPU_matrix_model_view_get(matrix); GPU_matrix_projection_get(proj); view[0] = view[1] = 0; - mul_m4_m4m4(matrix, matrix, ob_eval->object_to_world().ptr()); + mul_m4_m4m4(matrix, matrix, ob_eval->object_to_world); mul_m4_m4m4(matrix, proj, matrix); minabsw = 1e10; uv[0] = uv[1] = 0.0; const int *material_indices = (const int *)CustomData_get_layer_named( - &mesh_eval->face_data, CD_PROP_INT32, "material_index"); + &me_eval->face_data, CD_PROP_INT32, "material_index"); /* test all faces in the derivedmesh with the original index of the picked face */ /* face means poly here, not triangle, indeed */ @@ -318,15 +322,15 @@ static void imapaint_pick_uv(const Mesh *mesh_eval, if (!(slot && slot->uvname && (mloopuv = static_cast(CustomData_get_layer_named( - &mesh_eval->corner_data, CD_PROP_FLOAT2, slot->uvname))))) + &me_eval->corner_data, CD_PROP_FLOAT2, slot->uvname))))) { mloopuv = static_cast( - CustomData_get_layer(&mesh_eval->corner_data, CD_PROP_FLOAT2)); + CustomData_get_layer(&me_eval->corner_data, CD_PROP_FLOAT2)); } } else { mloopuv = static_cast( - CustomData_get_layer(&mesh_eval->corner_data, CD_PROP_FLOAT2)); + CustomData_get_layer(&me_eval->corner_data, CD_PROP_FLOAT2)); } tri_uv[0] = mloopuv[tris[i][0]]; @@ -407,15 +411,15 @@ void paint_sample_color( CustomData_MeshMasks cddata_masks = CD_MASK_BAREMESH; cddata_masks.pmask |= CD_MASK_ORIGINDEX; Mesh *mesh = (Mesh *)ob->data; - const Mesh *mesh_eval = BKE_object_get_evaluated_mesh(ob_eval); + const Mesh *me_eval = BKE_object_get_evaluated_mesh(ob_eval); const int *material_indices = (const int *)CustomData_get_layer_named( - &mesh_eval->face_data, CD_PROP_INT32, "material_index"); + &me_eval->face_data, CD_PROP_INT32, "material_index"); const int mval[2] = {x, y}; uint faceindex; uint faces_num = mesh->faces_num; - if (CustomData_has_layer(&mesh_eval->corner_data, CD_PROP_FLOAT2)) { + if (CustomData_has_layer(&me_eval->corner_data, CD_PROP_FLOAT2)) { ViewContext vc = ED_view3d_viewcontext_init(C, depsgraph); view3d_operator_needs_opengl(C); @@ -450,7 +454,7 @@ void paint_sample_color( iuser.framenr = image->lastframe; float uv[2]; - imapaint_pick_uv(mesh_eval, scene, ob_eval, faceindex, mval, uv); + imapaint_pick_uv(me_eval, scene, ob_eval, faceindex, mval, uv); if (image->source == IMA_SRC_TILED) { float new_uv[2]; diff --git a/source/blender/editors/sculpt_paint/paint_vertex.cc b/source/blender/editors/sculpt_paint/paint_vertex.cc index d274ed46922..ebccb4b6f21 100644 --- a/source/blender/editors/sculpt_paint/paint_vertex.cc +++ b/source/blender/editors/sculpt_paint/paint_vertex.cc @@ -47,9 +47,8 @@ #include "BKE_mesh_mapping.hh" #include "BKE_object.hh" #include "BKE_object_deform.h" -#include "BKE_object_types.hh" #include "BKE_paint.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "DEG_depsgraph.hh" @@ -351,7 +350,7 @@ void mode_enter_generic( vwpaint::init_session(depsgraph, scene, ob, mode_flag); /* Flush object mode. */ - DEG_id_tag_update(&ob->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&ob->id, ID_RECALC_COPY_ON_WRITE); } void mode_exit_generic(Object *ob, const eObjectMode mode_flag) @@ -399,13 +398,13 @@ void mode_exit_generic(Object *ob, const eObjectMode mode_flag) BKE_object_free_derived_caches(ob); /* Flush object mode. */ - DEG_id_tag_update(&ob->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&ob->id, ID_RECALC_COPY_ON_WRITE); } bool mode_toggle_poll_test(bContext *C) { Object *ob = CTX_data_active_object(C); - if (ob == nullptr || !ELEM(ob->type, OB_MESH, OB_GREASE_PENCIL)) { + if (ob == nullptr || ob->type != OB_MESH) { return false; } if (!ob->data || ID_IS_LINKED(ob->data)) { @@ -487,10 +486,10 @@ void update_cache_invariants( /* cache projection matrix */ cache->projection_mat = ED_view3d_ob_project_mat_get(cache->vc->rv3d, ob); - invert_m4_m4(ob->runtime->world_to_object.ptr(), ob->object_to_world().ptr()); + invert_m4_m4(ob->world_to_object, ob->object_to_world); copy_m3_m4(mat, cache->vc->rv3d->viewinv); mul_m3_v3(mat, view_dir); - copy_m3_m4(mat, ob->world_to_object().ptr()); + copy_m3_m4(mat, ob->world_to_object); mul_m3_v3(mat, view_dir); normalize_v3_v3(cache->true_view_normal, view_dir); @@ -1922,7 +1921,7 @@ static void vpaint_stroke_update_step(bContext *C, ED_view3d_init_mats_rv3d(ob, vc->rv3d); /* load projection matrix */ - mul_m4_m4m4(mat, vc->rv3d->persmat, ob->object_to_world().ptr()); + mul_m4_m4m4(mat, vc->rv3d->persmat, ob->object_to_world); swap_m4m4(vc->rv3d->persmat, mat); @@ -1939,7 +1938,7 @@ static void vpaint_stroke_update_step(bContext *C, /* Calculate pivot for rotation around selection if needed. * also needed for "Frame Selected" on last stroke. */ float loc_world[3]; - mul_v3_m4v3(loc_world, ob->object_to_world().ptr(), ss->cache->true_location); + mul_v3_m4v3(loc_world, ob->object_to_world, ss->cache->true_location); vwpaint::last_stroke_update(scene, loc_world); ED_region_tag_redraw(vc->region); @@ -2197,7 +2196,7 @@ static bool paint_object_attributes_active_color_fill_ex(Object *ob, fill_mesh_color( *mesh, fill_color, mesh->active_color_attribute, use_vert_sel, use_face_sel, affect_alpha); - DEG_id_tag_update(&mesh->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&mesh->id, ID_RECALC_COPY_ON_WRITE); /* NOTE: Original mesh is used for display, so tag it directly here. */ BKE_mesh_batch_cache_dirty_tag(mesh, BKE_MESH_BATCH_DIRTY_ALL); diff --git a/source/blender/editors/sculpt_paint/paint_vertex_color_ops.cc b/source/blender/editors/sculpt_paint/paint_vertex_color_ops.cc index d84e1532436..94f68a31a14 100644 --- a/source/blender/editors/sculpt_paint/paint_vertex_color_ops.cc +++ b/source/blender/editors/sculpt_paint/paint_vertex_color_ops.cc @@ -62,7 +62,7 @@ static void tag_object_after_update(Object *object) { BLI_assert(object->type == OB_MESH); Mesh *mesh = static_cast(object->data); - DEG_id_tag_update(&mesh->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&mesh->id, ID_RECALC_COPY_ON_WRITE); /* NOTE: Original mesh is used for display, so tag it directly here. */ BKE_mesh_batch_cache_dirty_tag(mesh, BKE_MESH_BATCH_DIRTY_ALL); } diff --git a/source/blender/editors/sculpt_paint/paint_vertex_proj.cc b/source/blender/editors/sculpt_paint/paint_vertex_proj.cc index 621bbca5a3f..40dff35e97c 100644 --- a/source/blender/editors/sculpt_paint/paint_vertex_proj.cc +++ b/source/blender/editors/sculpt_paint/paint_vertex_proj.cc @@ -14,7 +14,10 @@ #include "DNA_mesh_types.h" #include "DNA_object_types.h" +#include "BKE_context.hh" +#include "BKE_customdata.hh" #include "BKE_mesh_iterators.hh" +#include "BKE_mesh_runtime.hh" #include "BKE_object.hh" #include "BLI_math_vector.h" @@ -22,6 +25,7 @@ #include "DEG_depsgraph.hh" #include "DEG_depsgraph_query.hh" +#include "ED_screen.hh" #include "ED_view3d.hh" #include "paint_intern.hh" /* own include */ @@ -79,11 +83,11 @@ static void vpaint_proj_dm_map_cosnos_init(Depsgraph *depsgraph, { Mesh *mesh = static_cast(ob->data); const Object *ob_eval = DEG_get_evaluated_object(depsgraph, ob); - const Mesh *mesh_eval = BKE_object_get_evaluated_mesh(ob_eval); + const Mesh *me_eval = BKE_object_get_evaluated_mesh(ob_eval); memset(vp_handle->vcosnos, 0, sizeof(*vp_handle->vcosnos) * mesh->verts_num); BKE_mesh_foreach_mapped_vert( - mesh_eval, vpaint_proj_dm_map_cosnos_init__map_cb, vp_handle, MESH_FOREACH_USE_NORMAL); + me_eval, vpaint_proj_dm_map_cosnos_init__map_cb, vp_handle, MESH_FOREACH_USE_NORMAL); } /* -------------------------------------------------------------------- */ @@ -140,14 +144,14 @@ static void vpaint_proj_dm_map_cosnos_update(Depsgraph *depsgraph, Mesh *mesh = static_cast(ob->data); const Object *ob_eval = DEG_get_evaluated_object(depsgraph, ob); - const Mesh *mesh_eval = BKE_object_get_evaluated_mesh(ob_eval); + const Mesh *me_eval = BKE_object_get_evaluated_mesh(ob_eval); /* quick sanity check - we shouldn't have to run this if there are no modifiers */ BLI_assert(BLI_listbase_is_empty(&ob->modifiers) == false); copy_vn_fl(vp_handle->dists_sq, mesh->verts_num, FLT_MAX); BKE_mesh_foreach_mapped_vert( - mesh_eval, vpaint_proj_dm_map_cosnos_update__map_cb, &vp_update, MESH_FOREACH_USE_NORMAL); + me_eval, vpaint_proj_dm_map_cosnos_update__map_cb, &vp_update, MESH_FOREACH_USE_NORMAL); } /* -------------------------------------------------------------------- */ diff --git a/source/blender/editors/sculpt_paint/paint_vertex_weight_ops.cc b/source/blender/editors/sculpt_paint/paint_vertex_weight_ops.cc index aa54d6f4d1c..5fad5b07c6d 100644 --- a/source/blender/editors/sculpt_paint/paint_vertex_weight_ops.cc +++ b/source/blender/editors/sculpt_paint/paint_vertex_weight_ops.cc @@ -20,6 +20,7 @@ #include "RNA_access.hh" #include "RNA_define.hh" +#include "RNA_enum_types.hh" #include "BKE_attribute.hh" #include "BKE_brush.hh" @@ -28,11 +29,12 @@ #include "BKE_deform.hh" #include "BKE_mesh.hh" #include "BKE_mesh_iterators.hh" +#include "BKE_mesh_runtime.hh" #include "BKE_modifier.hh" #include "BKE_object.hh" #include "BKE_object_deform.h" #include "BKE_paint.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "DEG_depsgraph.hh" #include "DEG_depsgraph_query.hh" @@ -826,17 +828,17 @@ static int paint_weight_gradient_exec(bContext *C, wmOperator *op) ED_view3d_init_mats_rv3d(ob, static_cast(region->regiondata)); const Object *ob_eval = DEG_get_evaluated_object(depsgraph, ob); - const Mesh *mesh_eval = BKE_object_get_evaluated_mesh(ob_eval); + const Mesh *me_eval = BKE_object_get_evaluated_mesh(ob_eval); if (data.is_init) { data.vert_visit = BLI_BITMAP_NEW(mesh->verts_num, __func__); - BKE_mesh_foreach_mapped_vert(mesh_eval, gradientVertInit__mapFunc, &data, MESH_FOREACH_NOP); + BKE_mesh_foreach_mapped_vert(me_eval, gradientVertInit__mapFunc, &data, MESH_FOREACH_NOP); MEM_freeN(data.vert_visit); data.vert_visit = nullptr; } else { - BKE_mesh_foreach_mapped_vert(mesh_eval, gradientVertUpdate__mapFunc, &data, MESH_FOREACH_NOP); + BKE_mesh_foreach_mapped_vert(me_eval, gradientVertUpdate__mapFunc, &data, MESH_FOREACH_NOP); } DEG_id_tag_update(&ob->id, ID_RECALC_GEOMETRY); diff --git a/source/blender/editors/sculpt_paint/paint_vertex_weight_utils.cc b/source/blender/editors/sculpt_paint/paint_vertex_weight_utils.cc index 2524fc08f09..7c88776c45b 100644 --- a/source/blender/editors/sculpt_paint/paint_vertex_weight_utils.cc +++ b/source/blender/editors/sculpt_paint/paint_vertex_weight_utils.cc @@ -22,7 +22,7 @@ #include "BKE_modifier.hh" #include "BKE_object.hh" #include "BKE_object_deform.h" -#include "BKE_report.hh" +#include "BKE_report.h" #include "DEG_depsgraph_build.hh" diff --git a/source/blender/editors/sculpt_paint/paint_weight.cc b/source/blender/editors/sculpt_paint/paint_weight.cc index e37992fedda..3958c42fcc0 100644 --- a/source/blender/editors/sculpt_paint/paint_weight.cc +++ b/source/blender/editors/sculpt_paint/paint_weight.cc @@ -43,7 +43,7 @@ #include "BKE_object.hh" #include "BKE_object_deform.h" #include "BKE_paint.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "DEG_depsgraph.hh" @@ -1538,31 +1538,9 @@ static void wpaint_paint_leaves(bContext *C, /** \name Enter Weight Paint Mode * \{ */ -static void grease_pencil_wpaintmode_enter(Scene *scene, Object *ob) -{ - const PaintMode paint_mode = PaintMode::Weight; - Paint *weight_paint = BKE_paint_get_active_from_paintmode(scene, paint_mode); - BKE_paint_ensure(scene->toolsettings, &weight_paint); - - ob->mode |= OB_MODE_WEIGHT_PAINT; - - /* Flush object mode. */ - DEG_id_tag_update(&ob->id, ID_RECALC_SYNC_TO_EVAL); -} - void ED_object_wpaintmode_enter_ex(Main *bmain, Depsgraph *depsgraph, Scene *scene, Object *ob) { - switch (ob->type) { - case OB_MESH: - vwpaint::mode_enter_generic(bmain, depsgraph, scene, ob, OB_MODE_WEIGHT_PAINT); - break; - case OB_GREASE_PENCIL: - grease_pencil_wpaintmode_enter(scene, ob); - break; - default: - BLI_assert_unreachable(); - break; - } + vwpaint::mode_enter_generic(bmain, depsgraph, scene, ob, OB_MODE_WEIGHT_PAINT); } void ED_object_wpaintmode_enter(bContext *C, Depsgraph *depsgraph) { @@ -1579,18 +1557,7 @@ void ED_object_wpaintmode_enter(bContext *C, Depsgraph *depsgraph) void ED_object_wpaintmode_exit_ex(Object *ob) { - switch (ob->type) { - case OB_MESH: - vwpaint::mode_exit_generic(ob, OB_MODE_WEIGHT_PAINT); - break; - case OB_GREASE_PENCIL: { - ob->mode &= ~OB_MODE_WEIGHT_PAINT; - break; - } - default: - BLI_assert_unreachable(); - break; - } + vwpaint::mode_exit_generic(ob, OB_MODE_WEIGHT_PAINT); } void ED_object_wpaintmode_exit(bContext *C) { @@ -1663,6 +1630,8 @@ static int wpaint_mode_toggle_exec(bContext *C, wmOperator *op) } } + Mesh *mesh = BKE_mesh_from_object(ob); + if (is_mode_set) { ED_object_wpaintmode_exit_ex(ob); } @@ -1678,15 +1647,12 @@ static int wpaint_mode_toggle_exec(bContext *C, wmOperator *op) /* Prepare armature posemode. */ ED_object_posemode_set_for_weight_paint(C, bmain, ob, is_mode_set); - if (ob->type == OB_MESH) { - /* Weight-paint works by overriding colors in mesh, - * so need to make sure we recalculate on enter and - * exit (exit needs doing regardless because we - * should re-deform). - */ - Mesh *mesh = BKE_mesh_from_object(ob); - DEG_id_tag_update(&mesh->id, 0); - } + /* Weight-paint works by overriding colors in mesh, + * so need to make sure we recalculate on enter and + * exit (exit needs doing regardless because we + * should re-deform). + */ + DEG_id_tag_update(&mesh->id, 0); WM_event_add_notifier(C, NC_SCENE | ND_MODE, scene); @@ -1849,7 +1815,7 @@ static void wpaint_stroke_update_step(bContext *C, ED_view3d_init_mats_rv3d(ob, vc->rv3d); /* load projection matrix */ - mul_m4_m4m4(mat, vc->rv3d->persmat, ob->object_to_world().ptr()); + mul_m4_m4m4(mat, vc->rv3d->persmat, ob->object_to_world); Mesh *mesh = static_cast(ob->data); @@ -1887,7 +1853,7 @@ static void wpaint_stroke_update_step(bContext *C, /* Calculate pivot for rotation around selection if needed. * also needed for "Frame Selected" on last stroke. */ float loc_world[3]; - mul_v3_m4v3(loc_world, ob->object_to_world().ptr(), ss->cache->true_location); + mul_v3_m4v3(loc_world, ob->object_to_world, ss->cache->true_location); vwpaint::last_stroke_update(scene, loc_world); BKE_mesh_batch_cache_dirty_tag(mesh, BKE_MESH_BATCH_DIRTY_ALL); diff --git a/source/blender/editors/sculpt_paint/sculpt.cc b/source/blender/editors/sculpt_paint/sculpt.cc index a617aafe7c6..39ad6ea3d0e 100644 --- a/source/blender/editors/sculpt_paint/sculpt.cc +++ b/source/blender/editors/sculpt_paint/sculpt.cc @@ -57,8 +57,8 @@ #include "BKE_object_types.hh" #include "BKE_paint.hh" #include "BKE_pbvh_api.hh" -#include "BKE_report.hh" -#include "BKE_scene.hh" +#include "BKE_report.h" +#include "BKE_scene.h" #include "BKE_subdiv_ccg.hh" #include "BKE_subsurf.hh" #include "BLI_math_vector.hh" @@ -70,7 +70,6 @@ #include "WM_api.hh" #include "WM_types.hh" -#include "ED_gpencil_legacy.hh" #include "ED_paint.hh" #include "ED_screen.hh" #include "ED_sculpt.hh" @@ -92,11 +91,10 @@ using blender::Vector; static CLG_LogRef LOG = {"ed.sculpt_paint"}; -namespace blender::ed::sculpt_paint { -float sculpt_calc_radius(ViewContext *vc, - const Brush *brush, - const Scene *scene, - const float3 location) +static float sculpt_calc_radius(ViewContext *vc, + const Brush *brush, + const Scene *scene, + const float3 location) { if (!BKE_brush_use_locked_size(scene, brush)) { return paint_calc_object_space_radius(vc, location, BKE_brush_size_get(scene, brush)); @@ -105,7 +103,6 @@ float sculpt_calc_radius(ViewContext *vc, return BKE_brush_unprojected_radius_get(scene, brush); } } -} // namespace blender::ed::sculpt_paint bool ED_sculpt_report_if_shape_key_is_locked(const Object *ob, ReportList *reports) { @@ -2698,14 +2695,14 @@ static void calc_local_from_screen(ViewContext *vc, Object *ob = vc->obact; float loc[3]; - mul_v3_m4v3(loc, ob->object_to_world().ptr(), center); + mul_v3_m4v3(loc, ob->object_to_world, center); const float zfac = ED_view3d_calc_zfac(vc->rv3d, loc); ED_view3d_win_to_delta(vc->region, screen_dir, zfac, r_local_dir); normalize_v3(r_local_dir); add_v3_v3(r_local_dir, ob->loc); - mul_m4_v3(ob->world_to_object().ptr(), r_local_dir); + mul_m4_v3(ob->world_to_object, r_local_dir); } static void calc_brush_local_mat(const float rotation, @@ -2720,7 +2717,7 @@ static void calc_brush_local_mat(const float rotation, float angle, v[3]; /* Ensure `ob->world_to_object` is up to date. */ - invert_m4_m4(ob->runtime->world_to_object.ptr(), ob->object_to_world().ptr()); + invert_m4_m4(ob->world_to_object, ob->object_to_world); /* Initialize last column of matrix. */ mat[0][3] = 0.0f; @@ -2784,13 +2781,13 @@ void SCULPT_tilt_apply_to_normal(float r_normal[3], return; } const float rot_max = M_PI_2 * tilt_strength * SCULPT_TILT_SENSITIVITY; - mul_v3_mat3_m4v3(r_normal, cache->vc->obact->object_to_world().ptr(), r_normal); + mul_v3_mat3_m4v3(r_normal, cache->vc->obact->object_to_world, r_normal); float normal_tilt_y[3]; rotate_v3_v3v3fl(normal_tilt_y, r_normal, cache->vc->rv3d->viewinv[0], cache->y_tilt * rot_max); float normal_tilt_xy[3]; rotate_v3_v3v3fl( normal_tilt_xy, normal_tilt_y, cache->vc->rv3d->viewinv[1], cache->x_tilt * rot_max); - mul_v3_mat3_m4v3(r_normal, cache->vc->obact->world_to_object().ptr(), normal_tilt_xy); + mul_v3_mat3_m4v3(r_normal, cache->vc->obact->world_to_object, normal_tilt_xy); normalize_v3(r_normal); } @@ -3251,7 +3248,7 @@ static void sculpt_topology_update(Sculpt *sd, /* Update average stroke position. */ copy_v3_v3(location, ss->cache->true_location); - mul_m4_v3(ob->object_to_world().ptr(), location); + mul_m4_v3(ob->object_to_world, location); } static void do_brush_action_task(Object *ob, const Brush *brush, PBVHNode *node) @@ -3582,7 +3579,7 @@ static void do_brush_action(Sculpt *sd, /* Update average stroke position. */ copy_v3_v3(location, ss->cache->true_location); - mul_m4_v3(ob->object_to_world().ptr(), location); + mul_m4_v3(ob->object_to_world, location); add_v3_v3(ups->average_stroke_accum, location); ups->average_stroke_counter++; @@ -3970,7 +3967,7 @@ bool SCULPT_mode_poll(bContext *C) bool SCULPT_mode_poll_view3d(bContext *C) { - return (SCULPT_mode_poll(C) && CTX_wm_region_view3d(C) && !ED_gpencil_session_active()); + return (SCULPT_mode_poll(C) && CTX_wm_region_view3d(C)); } bool SCULPT_poll(bContext *C) @@ -4114,8 +4111,8 @@ static void sculpt_init_mirror_clipping(Object *ob, SculptSession *ss) /* Store matrix for mirror object clipping. */ if (mmd->mirror_ob) { float imtx_mirror_ob[4][4]; - invert_m4_m4(imtx_mirror_ob, mmd->mirror_ob->object_to_world().ptr()); - mul_m4_m4m4(ss->cache->clip_mirror_mtx.ptr(), imtx_mirror_ob, ob->object_to_world().ptr()); + invert_m4_m4(imtx_mirror_ob, mmd->mirror_ob->object_to_world); + mul_m4_m4m4(ss->cache->clip_mirror_mtx.ptr(), imtx_mirror_ob, ob->object_to_world); } } } @@ -4282,10 +4279,10 @@ static void sculpt_update_cache_invariants( /* Cache projection matrix. */ cache->projection_mat = ED_view3d_ob_project_mat_get(cache->vc->rv3d, ob); - invert_m4_m4(ob->runtime->world_to_object.ptr(), ob->object_to_world().ptr()); + invert_m4_m4(ob->world_to_object, ob->object_to_world); copy_m3_m4(mat, cache->vc->rv3d->viewinv); mul_m3_v3(mat, viewDir); - copy_m3_m4(mat, ob->world_to_object().ptr()); + copy_m3_m4(mat, ob->world_to_object); mul_m3_v3(mat, viewDir); normalize_v3_v3(cache->true_view_normal, viewDir); @@ -4301,7 +4298,7 @@ static void sculpt_update_cache_invariants( if (sd->gravity_object) { Object *gravity_object = sd->gravity_object; - copy_v3_v3(cache->true_gravity_direction, gravity_object->object_to_world().ptr()[2]); + copy_v3_v3(cache->true_gravity_direction, gravity_object->object_to_world[2]); } else { cache->true_gravity_direction[0] = cache->true_gravity_direction[1] = 0.0f; @@ -4461,27 +4458,27 @@ static void sculpt_update_brush_delta(UnifiedPaintSettings *ups, Object *ob, Bru } /* Compute 3d coordinate at same z from original location + mval. */ - mul_v3_m4v3(loc, ob->object_to_world().ptr(), cache->orig_grab_location); + mul_v3_m4v3(loc, ob->object_to_world, cache->orig_grab_location); ED_view3d_win_to_3d(cache->vc->v3d, cache->vc->region, loc, mval, 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->object_to_world().ptr()); + invert_m4_m4(imat, ob->object_to_world); 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->object_to_world().ptr(), cache->orig_grab_location); + mul_v3_m4v3(orig, ob->object_to_world, 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->object_to_world().ptr()); + invert_m4_m4(imat, ob->object_to_world); mul_mat3_m4_v3(imat, cache->grab_delta); } else { @@ -4526,7 +4523,7 @@ static void sculpt_update_brush_delta(UnifiedPaintSettings *ups, Object *ob, Bru /* Handle 'rake' */ cache->is_rake_rotation_valid = false; - invert_m4_m4(imat, ob->object_to_world().ptr()); + invert_m4_m4(imat, ob->object_to_world); mul_mat3_m4_v3(imat, grab_location); if (SCULPT_stroke_is_first_brush_step_of_symmetry_pass(ss->cache)) { @@ -4863,7 +4860,7 @@ float SCULPT_raycast_init(ViewContext *vc, ED_view3d_win_to_segment_clipped( vc->depsgraph, vc->region, vc->v3d, mval, ray_start, ray_end, true); - invert_m4_m4(obimat, ob->object_to_world().ptr()); + invert_m4_m4(obimat, ob->object_to_world); mul_m4_v3(obimat, ray_start); mul_m4_v3(obimat, ray_end); @@ -4988,10 +4985,10 @@ bool SCULPT_cursor_geometry_info_update(bContext *C, float radius; /* Update cursor data in SculptSession. */ - invert_m4_m4(ob->runtime->world_to_object.ptr(), ob->object_to_world().ptr()); + invert_m4_m4(ob->world_to_object, ob->object_to_world); copy_m3_m4(mat, vc.rv3d->viewinv); mul_m3_v3(mat, viewDir); - copy_m3_m4(mat, ob->world_to_object().ptr()); + copy_m3_m4(mat, ob->world_to_object); mul_m3_v3(mat, viewDir); normalize_v3_v3(ss->cursor_view_normal, viewDir); copy_v3_v3(ss->cursor_normal, srd.face_normal); @@ -5524,19 +5521,17 @@ static void sculpt_stroke_update_step(bContext *C, sculpt_restore_mesh(sd, ob); if (sd->flags & (SCULPT_DYNTOPO_DETAIL_CONSTANT | SCULPT_DYNTOPO_DETAIL_MANUAL)) { - BKE_pbvh_bmesh_detail_size_set( - ss->pbvh, dyntopo::detail_size::constant_to_detail_size(sd->constant_detail, ob)); + float object_space_constant_detail = 1.0f / (sd->constant_detail * + mat4_to_scale(ob->object_to_world)); + BKE_pbvh_bmesh_detail_size_set(ss->pbvh, object_space_constant_detail); } else if (sd->flags & SCULPT_DYNTOPO_DETAIL_BRUSH) { - BKE_pbvh_bmesh_detail_size_set( - ss->pbvh, - dyntopo::detail_size::brush_to_detail_size(sd->detail_percent, ss->cache->radius)); + BKE_pbvh_bmesh_detail_size_set(ss->pbvh, ss->cache->radius * sd->detail_percent / 100.0f); } else { - BKE_pbvh_bmesh_detail_size_set( - ss->pbvh, - dyntopo::detail_size::relative_to_detail_size( - sd->detail_size, ss->cache->radius, ss->cache->dyntopo_pixel_radius, U.pixelsize)); + BKE_pbvh_bmesh_detail_size_set(ss->pbvh, + (ss->cache->radius / ss->cache->dyntopo_pixel_radius) * + (sd->detail_size * U.pixelsize) / 0.4f); } if (dyntopo::stroke_is_dyntopo(ss, brush)) { @@ -5784,7 +5779,7 @@ void SCULPT_OT_brush_stroke(wmOperatorType *ot) ot->cancel = sculpt_brush_stroke_cancel; ot->ui = sculpt_redo_empty_ui; - /* Flags (sculpt does its own undo? (ton)). */ + /* Flags (sculpt does own undo? (ton)). */ ot->flag = OPTYPE_BLOCKING; /* Properties. */ diff --git a/source/blender/editors/sculpt_paint/sculpt_automasking.cc b/source/blender/editors/sculpt_paint/sculpt_automasking.cc index 78b2598c8cc..6ac743f0dbc 100644 --- a/source/blender/editors/sculpt_paint/sculpt_automasking.cc +++ b/source/blender/editors/sculpt_paint/sculpt_automasking.cc @@ -9,6 +9,7 @@ #include "MEM_guardedalloc.h" #include "BLI_array.hh" +#include "BLI_blenlib.h" #include "BLI_hash.h" #include "BLI_index_range.hh" #include "BLI_math_base_safe.h" @@ -18,13 +19,32 @@ #include "DNA_brush_types.h" +#include "BKE_brush.hh" #include "BKE_colortools.hh" +#include "BKE_context.hh" +#include "BKE_mesh.hh" +#include "BKE_mesh_mapping.hh" +#include "BKE_object.hh" #include "BKE_paint.hh" #include "BKE_pbvh_api.hh" +#include "BKE_scene.h" +#include "DEG_depsgraph.hh" + +#include "WM_api.hh" +#include "WM_message.hh" +#include "WM_toolsystem.hh" +#include "WM_types.hh" + +#include "ED_object.hh" +#include "ED_screen.hh" +#include "ED_sculpt.hh" #include "paint_intern.hh" #include "sculpt_intern.hh" +#include "RNA_access.hh" +#include "RNA_define.hh" + #include "bmesh.hh" #include diff --git a/source/blender/editors/sculpt_paint/sculpt_boundary.cc b/source/blender/editors/sculpt_paint/sculpt_boundary.cc index 161f8cc43f3..5f80fed3f46 100644 --- a/source/blender/editors/sculpt_paint/sculpt_boundary.cc +++ b/source/blender/editors/sculpt_paint/sculpt_boundary.cc @@ -16,6 +16,7 @@ #include "BKE_brush.hh" #include "BKE_ccg.h" #include "BKE_colortools.hh" +#include "BKE_context.hh" #include "BKE_paint.hh" #include "BKE_pbvh_api.hh" diff --git a/source/blender/editors/sculpt_paint/sculpt_brush_types.cc b/source/blender/editors/sculpt_paint/sculpt_brush_types.cc index ac4b955853d..4e58d7a45b9 100644 --- a/source/blender/editors/sculpt_paint/sculpt_brush_types.cc +++ b/source/blender/editors/sculpt_paint/sculpt_brush_types.cc @@ -20,12 +20,14 @@ #include "DNA_brush_types.h" #include "DNA_customdata_types.h" +#include "DNA_mesh_types.h" #include "DNA_object_types.h" #include "DNA_scene_types.h" #include "BKE_brush.hh" #include "BKE_ccg.h" #include "BKE_colortools.hh" +#include "BKE_context.hh" #include "BKE_kelvinlet.h" #include "BKE_paint.hh" #include "BKE_pbvh_api.hh" diff --git a/source/blender/editors/sculpt_paint/sculpt_cloth.cc b/source/blender/editors/sculpt_paint/sculpt_cloth.cc index 052319187fe..f693f655934 100644 --- a/source/blender/editors/sculpt_paint/sculpt_cloth.cc +++ b/source/blender/editors/sculpt_paint/sculpt_cloth.cc @@ -670,15 +670,14 @@ static void cloth_brush_solve_collision(Object *object, SimulationData *cloth_si BVHTreeRayHit hit; float obmat_inv[4][4]; - invert_m4_m4(obmat_inv, object->object_to_world().ptr()); + invert_m4_m4(obmat_inv, object->object_to_world); LISTBASE_FOREACH (ColliderCache *, collider_cache, cloth_sim->collider_list) { float ray_start[3], ray_normal[3]; float pos_world_space[3], prev_pos_world_space[3]; - mul_v3_m4v3(pos_world_space, object->object_to_world().ptr(), cloth_sim->pos[i]); - mul_v3_m4v3( - prev_pos_world_space, object->object_to_world().ptr(), cloth_sim->last_iteration_pos[i]); + mul_v3_m4v3(pos_world_space, object->object_to_world, cloth_sim->pos[i]); + mul_v3_m4v3(prev_pos_world_space, object->object_to_world, cloth_sim->last_iteration_pos[i]); sub_v3_v3v3(ray_normal, pos_world_space, prev_pos_world_space); copy_v3_v3(ray_start, prev_pos_world_space); hit.index = -1; @@ -1390,7 +1389,7 @@ static void cloth_filter_apply_forces_task(Object *ob, float sculpt_gravity[3] = {0.0f}; if (sd->gravity_object) { - copy_v3_v3(sculpt_gravity, sd->gravity_object->object_to_world().ptr()[2]); + copy_v3_v3(sculpt_gravity, sd->gravity_object->object_to_world[2]); } else { sculpt_gravity[2] = -1.0f; diff --git a/source/blender/editors/sculpt_paint/sculpt_detail.cc b/source/blender/editors/sculpt_paint/sculpt_detail.cc index bcdf6000bfc..b7c29e149b9 100644 --- a/source/blender/editors/sculpt_paint/sculpt_detail.cc +++ b/source/blender/editors/sculpt_paint/sculpt_detail.cc @@ -14,12 +14,11 @@ #include "BLI_math_vector.hh" #include "BLI_time.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_brush_types.h" #include "DNA_mesh_types.h" -#include "BKE_brush.hh" #include "BKE_context.hh" #include "BKE_layer.hh" #include "BKE_paint.hh" @@ -43,9 +42,6 @@ #include "RNA_access.hh" #include "RNA_define.hh" -#include "RNA_prototypes.h" - -#include "UI_interface.hh" #include "CLG_log.h" @@ -119,14 +115,14 @@ static int sculpt_detail_flood_fill_exec(bContext *C, wmOperator *op) const float size = math::reduce_max(dim); /* Update topology size. */ - float object_space_constant_detail = 1.0f / (sd->constant_detail * - mat4_to_scale(ob->object_to_world().ptr())); + float object_space_constant_detail = 1.0f / + (sd->constant_detail * mat4_to_scale(ob->object_to_world)); BKE_pbvh_bmesh_detail_size_set(ss->pbvh, object_space_constant_detail); undo::push_begin(ob, op); undo::push_node(ob, nullptr, undo::Type::Position); - const double start_time = BLI_time_now_seconds(); + const double start_time = BLI_check_seconds_timer(); while (bke::pbvh::bmesh_update_topology( ss->pbvh, PBVH_Collapse | PBVH_Subdivide, center, nullptr, size, false, false)) @@ -136,7 +132,7 @@ static int sculpt_detail_flood_fill_exec(bContext *C, wmOperator *op) } } - CLOG_INFO(&LOG, 2, "Detail flood fill took %f seconds.", BLI_time_now_seconds() - start_time); + CLOG_INFO(&LOG, 2, "Detail flood fill took %f seconds.", BLI_check_seconds_timer() - start_time); undo::push_end(ob); @@ -250,7 +246,7 @@ static void sample_detail_dyntopo(bContext *C, ViewContext *vc, const int mval[2 if (srd.hit && srd.edge_length > 0.0f) { /* Convert edge length to world space detail resolution. */ - sd->constant_detail = 1 / (srd.edge_length * mat4_to_scale(ob->object_to_world().ptr())); + sd->constant_detail = 1 / (srd.edge_length * mat4_to_scale(ob->object_to_world)); } } @@ -400,6 +396,75 @@ void SCULPT_OT_sample_detail_size(wmOperatorType *ot) /** \} */ +/* -------------------------------------------------------------------- */ +/** \name Dynamic-topology detail size + * + * Currently, there are two operators editing the detail size: + * - #SCULPT_OT_set_detail_size uses radial control for all methods + * - #SCULPT_OT_dyntopo_detail_size_edit shows a triangle grid representation of the detail + * resolution (for constant detail method, + * falls back to radial control for the remaining methods). + * \{ */ + +static void set_brush_rc_props(PointerRNA *ptr, const char *prop) +{ + char *path = BLI_sprintfN("tool_settings.sculpt.brush.%s", prop); + RNA_string_set(ptr, "data_path_primary", path); + MEM_freeN(path); +} + +static void sculpt_detail_size_set_radial_control(bContext *C) +{ + Sculpt *sd = CTX_data_tool_settings(C)->sculpt; + + PointerRNA props_ptr; + wmOperatorType *ot = WM_operatortype_find("WM_OT_radial_control", true); + + WM_operator_properties_create_ptr(&props_ptr, ot); + + if (sd->flags & (SCULPT_DYNTOPO_DETAIL_CONSTANT | SCULPT_DYNTOPO_DETAIL_MANUAL)) { + set_brush_rc_props(&props_ptr, "constant_detail_resolution"); + RNA_string_set( + &props_ptr, "data_path_primary", "tool_settings.sculpt.constant_detail_resolution"); + } + else if (sd->flags & SCULPT_DYNTOPO_DETAIL_BRUSH) { + set_brush_rc_props(&props_ptr, "constant_detail_resolution"); + RNA_string_set(&props_ptr, "data_path_primary", "tool_settings.sculpt.detail_percent"); + } + else { + set_brush_rc_props(&props_ptr, "detail_size"); + RNA_string_set(&props_ptr, "data_path_primary", "tool_settings.sculpt.detail_size"); + } + + WM_operator_name_call_ptr(C, ot, WM_OP_INVOKE_DEFAULT, &props_ptr, nullptr); + + WM_operator_properties_free(&props_ptr); +} + +static int sculpt_set_detail_size_exec(bContext *C, wmOperator * /*op*/) +{ + sculpt_detail_size_set_radial_control(C); + + return OPERATOR_FINISHED; +} + +void SCULPT_OT_set_detail_size(wmOperatorType *ot) +{ + /* Identifiers. */ + ot->name = "Set Detail Size"; + ot->idname = "SCULPT_OT_set_detail_size"; + ot->description = + "Set the mesh detail (either relative or constant one, depending on current dyntopo mode)"; + + /* API callbacks. */ + ot->exec = sculpt_set_detail_size_exec; + ot->poll = sculpt_and_dynamic_topology_poll; + + ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; +} + +/** \} */ + /* -------------------------------------------------------------------- */ /** \name Dyntopo Detail Size Edit Operator * \{ */ @@ -408,18 +473,10 @@ void SCULPT_OT_sample_detail_size(wmOperatorType *ot) #define DETAIL_SIZE_DELTA_SPEED 0.08f #define DETAIL_SIZE_DELTA_ACCURATE_SPEED 0.004f -enum eDyntopoDetailingMode { - DETAILING_MODE_RESOLUTION = 0, - DETAILING_MODE_BRUSH_PERCENT = 1, - DETAILING_MODE_DETAIL_SIZE = 2 -}; - struct DyntopoDetailSizeEditCustomData { void *draw_handle; Object *active_object; - eDyntopoDetailingMode mode; - float init_mval[2]; float accurate_mval[2]; @@ -428,19 +485,11 @@ struct DyntopoDetailSizeEditCustomData { bool accurate_mode; bool sample_mode; - /* The values stored here vary based on the detailing mode. */ - float init_value; - float accurate_value; - float current_value; - + float init_detail_size; + float accurate_detail_size; + float detail_size; float radius; - float brush_radius; - float pixel_radius; - - float min_value; - float max_value; - float preview_tri[3][3]; float gizmo_mat[4][4]; }; @@ -452,19 +501,8 @@ static void dyntopo_detail_size_parallel_lines_draw(uint pos3d, bool flip, const float angle) { - float object_space_constant_detail; - if (cd->mode == DETAILING_MODE_RESOLUTION) { - object_space_constant_detail = detail_size::constant_to_detail_size(cd->current_value, - cd->active_object); - } - else if (cd->mode == DETAILING_MODE_BRUSH_PERCENT) { - object_space_constant_detail = detail_size::brush_to_detail_size(cd->current_value, - cd->brush_radius); - } - else { - object_space_constant_detail = detail_size::relative_to_detail_size( - cd->current_value, cd->brush_radius, cd->pixel_radius, U.pixelsize); - } + float object_space_constant_detail = 1.0f / (cd->detail_size * + mat4_to_scale(cd->active_object->object_to_world)); /* The constant detail represents the maximum edge length allowed before subdividing it. If the * triangle grid preview is created with this value it will represent an ideal mesh density where @@ -560,26 +598,6 @@ static void dyntopo_detail_size_edit_cancel(bContext *C, wmOperator *op) ss->draw_faded_cursor = false; MEM_freeN(op->customdata); ED_workspace_status_text(C, nullptr); - - ScrArea *area = CTX_wm_area(C); - ED_area_status_text(area, nullptr); -} - -static void dyntopo_detail_size_bounds(DyntopoDetailSizeEditCustomData *cd) -{ - /* TODO: Get range from RNA for these values? */ - if (cd->mode == DETAILING_MODE_RESOLUTION) { - cd->min_value = 1.0f; - cd->max_value = 500.0f; - } - else if (cd->mode == DETAILING_MODE_BRUSH_PERCENT) { - cd->min_value = 0.5f; - cd->max_value = 100.0f; - } - else { - cd->min_value = 0.5f; - cd->max_value = 40.0f; - } } static void dyntopo_detail_size_sample_from_surface(Object *ob, @@ -601,21 +619,9 @@ static void dyntopo_detail_size_sample_from_surface(Object *ob, if (num_neighbors > 0) { const float avg_edge_len = len_accum / num_neighbors; /* Use 0.7 as the average of min and max dyntopo edge length. */ - const float detail_size = 0.7f / (avg_edge_len * - mat4_to_scale(cd->active_object->object_to_world().ptr())); - float sampled_value; - if (cd->mode == DETAILING_MODE_RESOLUTION) { - sampled_value = detail_size; - } - else if (cd->mode == DETAILING_MODE_BRUSH_PERCENT) { - sampled_value = detail_size::constant_to_brush_detail( - detail_size, cd->brush_radius, cd->active_object); - } - else { - sampled_value = detail_size::constant_to_relative_detail( - detail_size, cd->brush_radius, cd->pixel_radius, U.pixelsize, cd->active_object); - } - cd->current_value = clamp_f(sampled_value, cd->min_value, cd->max_value); + const float detail_size = 0.7f / + (avg_edge_len * mat4_to_scale(cd->active_object->object_to_world)); + cd->detail_size = clamp_f(detail_size, 1.0f, 500.0f); } } @@ -625,58 +631,27 @@ static void dyntopo_detail_size_update_from_mouse_delta(DyntopoDetailSizeEditCus const float mval[2] = {float(event->mval[0]), float(event->mval[1])}; float detail_size_delta; - float invert = cd->mode == DETAILING_MODE_RESOLUTION ? 1.0f : -1.0f; if (cd->accurate_mode) { detail_size_delta = mval[0] - cd->accurate_mval[0]; - cd->current_value = cd->accurate_value + - detail_size_delta * DETAIL_SIZE_DELTA_ACCURATE_SPEED * invert; + cd->detail_size = cd->accurate_detail_size + + detail_size_delta * DETAIL_SIZE_DELTA_ACCURATE_SPEED; } else { detail_size_delta = mval[0] - cd->init_mval[0]; - cd->current_value = cd->init_value + detail_size_delta * DETAIL_SIZE_DELTA_SPEED * invert; + cd->detail_size = cd->init_detail_size + detail_size_delta * DETAIL_SIZE_DELTA_SPEED; } if (event->type == EVT_LEFTSHIFTKEY && event->val == KM_PRESS) { cd->accurate_mode = true; copy_v2_v2(cd->accurate_mval, mval); - cd->accurate_value = cd->current_value; + cd->accurate_detail_size = cd->detail_size; } if (event->type == EVT_LEFTSHIFTKEY && event->val == KM_RELEASE) { cd->accurate_mode = false; - cd->accurate_value = 0.0f; + cd->accurate_detail_size = 0.0f; } - cd->current_value = clamp_f(cd->current_value, cd->min_value, cd->max_value); -} - -static void dyntopo_detail_size_update_header(bContext *C, - const DyntopoDetailSizeEditCustomData *cd) -{ - Scene *scene = CTX_data_scene(C); - - Sculpt *sd = scene->toolsettings->sculpt; - PointerRNA sculpt_ptr = RNA_pointer_create(&scene->id, &RNA_Sculpt, sd); - - char msg[UI_MAX_DRAW_STR]; - const char *format_string; - const char *property_name; - if (cd->mode == DETAILING_MODE_RESOLUTION) { - property_name = "constant_detail_resolution"; - format_string = "%s: %0.4f"; - } - else if (cd->mode == DETAILING_MODE_BRUSH_PERCENT) { - property_name = "detail_percent"; - format_string = "%s: %3.1f%%"; - } - else { - property_name = "detail_size"; - format_string = "%s: %0.4f"; - } - const PropertyRNA *prop = RNA_struct_find_property(&sculpt_ptr, property_name); - const char *ui_name = RNA_property_ui_name(prop); - SNPRINTF(msg, format_string, ui_name, cd->current_value); - ScrArea *area = CTX_wm_area(C); - ED_area_status_text(area, msg); + cd->detail_size = clamp_f(cd->detail_size, 1.0f, 500.0f); } static int dyntopo_detail_size_edit_modal(bContext *C, wmOperator *op, const wmEvent *event) @@ -703,23 +678,11 @@ static int dyntopo_detail_size_edit_modal(bContext *C, wmOperator *op, const wmE (event->type == EVT_PADENTER && event->val == KM_PRESS)) { ED_region_draw_cb_exit(region->type, cd->draw_handle); - if (cd->mode == DETAILING_MODE_RESOLUTION) { - sd->constant_detail = cd->current_value; - } - else if (cd->mode == DETAILING_MODE_BRUSH_PERCENT) { - sd->detail_percent = cd->current_value; - } - else { - sd->detail_size = cd->current_value; - } - + sd->constant_detail = cd->detail_size; ss->draw_faded_cursor = false; MEM_freeN(op->customdata); ED_region_tag_redraw(region); ED_workspace_status_text(C, nullptr); - - ScrArea *area = CTX_wm_area(C); - ED_area_status_text(area, nullptr); return OPERATOR_FINISHED; } @@ -741,29 +704,23 @@ static int dyntopo_detail_size_edit_modal(bContext *C, wmOperator *op, const wmE } /* Regular mode, changes the detail size by moving the cursor. */ dyntopo_detail_size_update_from_mouse_delta(cd, event); - dyntopo_detail_size_update_header(C, cd); return OPERATOR_RUNNING_MODAL; } -static float dyntopo_detail_size_initial_value(const Sculpt *sd, const eDyntopoDetailingMode mode) -{ - if (mode == DETAILING_MODE_RESOLUTION) { - return sd->constant_detail; - } - else if (mode == DETAILING_MODE_BRUSH_PERCENT) { - return sd->detail_percent; - } - else { - return sd->detail_size; - } -} - static int dyntopo_detail_size_edit_invoke(bContext *C, wmOperator *op, const wmEvent *event) { - const ToolSettings *tool_settings = CTX_data_tool_settings(C); - Sculpt *sd = tool_settings->sculpt; + Sculpt *sd = CTX_data_tool_settings(C)->sculpt; + /* Fallback to radial control for modes other than SCULPT_DYNTOPO_DETAIL_CONSTANT [same as in + * SCULPT_OT_set_detail_size]. */ + if (!(sd->flags & (SCULPT_DYNTOPO_DETAIL_CONSTANT | SCULPT_DYNTOPO_DETAIL_MANUAL))) { + sculpt_detail_size_set_radial_control(C); + + return OPERATOR_FINISHED; + } + + /* Special method for SCULPT_DYNTOPO_DETAIL_CONSTANT. */ ARegion *region = CTX_wm_region(C); Object *active_object = CTX_data_active_object(C); Brush *brush = BKE_paint_brush(&sd->paint); @@ -776,40 +733,20 @@ static int dyntopo_detail_size_edit_invoke(bContext *C, wmOperator *op, const wm cd->active_object = active_object; cd->init_mval[0] = event->mval[0]; cd->init_mval[1] = event->mval[1]; - if (sd->flags & (SCULPT_DYNTOPO_DETAIL_CONSTANT | SCULPT_DYNTOPO_DETAIL_MANUAL)) { - cd->mode = DETAILING_MODE_RESOLUTION; - } - else if (sd->flags & SCULPT_DYNTOPO_DETAIL_BRUSH) { - cd->mode = DETAILING_MODE_BRUSH_PERCENT; - } - else { - cd->mode = DETAILING_MODE_DETAIL_SIZE; - } - - const float initial_detail_size = dyntopo_detail_size_initial_value(sd, cd->mode); - cd->current_value = initial_detail_size; - cd->init_value = initial_detail_size; + cd->detail_size = sd->constant_detail; + cd->init_detail_size = sd->constant_detail; copy_v4_v4(cd->outline_col, brush->add_col); op->customdata = cd; SculptSession *ss = active_object->sculpt; - dyntopo_detail_size_bounds(cd); cd->radius = ss->cursor_radius; - Depsgraph *depsgraph = CTX_data_ensure_evaluated_depsgraph(C); - ViewContext vc = ED_view3d_viewcontext_init(C, depsgraph); - - const Scene *scene = CTX_data_scene(C); - cd->brush_radius = blender::ed::sculpt_paint::sculpt_calc_radius( - &vc, brush, scene, ss->cursor_location); - cd->pixel_radius = BKE_brush_size_get(scene, brush); - - /* Generates the matrix to position the gizmo in the surface of the mesh using the same - * location and orientation as the brush cursor. */ + /* Generates the matrix to position the gizmo in the surface of the mesh using the same location + * and orientation as the brush cursor. */ float cursor_trans[4][4], cursor_rot[4][4]; const float z_axis[4] = {0.0f, 0.0f, 1.0f, 0.0f}; float quat[4]; - copy_m4_m4(cursor_trans, active_object->object_to_world().ptr()); + copy_m4_m4(cursor_trans, active_object->object_to_world); translate_m4( cursor_trans, ss->cursor_location[0], ss->cursor_location[1], ss->cursor_location[2]); @@ -843,9 +780,7 @@ static int dyntopo_detail_size_edit_invoke(bContext *C, wmOperator *op, const wm const char *status_str = IFACE_( "Move the mouse to change the dyntopo detail size. LMB: confirm size, ESC/RMB: cancel, " "SHIFT: precision mode, CTRL: sample detail size"); - ED_workspace_status_text(C, status_str); - dyntopo_detail_size_update_header(C, cd); return OPERATOR_RUNNING_MODAL; } @@ -868,45 +803,4 @@ void SCULPT_OT_dyntopo_detail_size_edit(wmOperatorType *ot) } // namespace blender::ed::sculpt_paint::dyntopo -namespace blender::ed::sculpt_paint::dyntopo::detail_size { -float constant_to_detail_size(const float constant_detail, const Object *ob) -{ - return 1.0f / (constant_detail * mat4_to_scale(ob->object_to_world().ptr())); -} - -float brush_to_detail_size(const float brush_percent, const float brush_radius) -{ - return brush_radius * brush_percent / 100.0f; -} - -float relative_to_detail_size(const float relative_detail, - const float brush_radius, - const float pixel_radius, - const float pixel_size) -{ - return (brush_radius / pixel_radius) * (relative_detail * pixel_size) / RELATIVE_SCALE_FACTOR; -} - -float constant_to_brush_detail(const float constant_detail, - const float brush_radius, - const Object *ob) -{ - const float object_scale = mat4_to_scale(ob->object_to_world().ptr()); - - return 100.0f / (constant_detail * brush_radius * object_scale); -} - -float constant_to_relative_detail(const float constant_detail, - const float brush_radius, - const float pixel_radius, - const float pixel_size, - const Object *ob) -{ - const float object_scale = mat4_to_scale(ob->object_to_world().ptr()); - - return (pixel_radius / brush_radius) * (RELATIVE_SCALE_FACTOR / pixel_size) * - (1.0f / (constant_detail * object_scale)); -} -} // namespace blender::ed::sculpt_paint::dyntopo::detail_size - /** \} */ diff --git a/source/blender/editors/sculpt_paint/sculpt_detail_test.cc b/source/blender/editors/sculpt_paint/sculpt_detail_test.cc deleted file mode 100644 index 1b5d85c3e3c..00000000000 --- a/source/blender/editors/sculpt_paint/sculpt_detail_test.cc +++ /dev/null @@ -1,51 +0,0 @@ -/* SPDX-FileCopyrightText: 2024 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup edsculpt - */ - -#include "sculpt_intern.hh" - -#include "BKE_object_types.hh" - -#include "testing/testing.h" - -namespace blender::ed::sculpt_paint::dyntopo::detail_size::test { -constexpr float CONSTANT_DETAIL = 50.0f; -constexpr float BRUSH_RADIUS = 0.5f; -constexpr float PIXEL_RADIUS = 200; -constexpr float PIXEL_SIZE = 100; - -TEST(Conversion, ConstantToBrushDetail) -{ - blender::bke::ObjectRuntime runtime; - runtime.object_to_world = MatBase::identity(); - - Object ob; - ob.runtime = &runtime; - - const float brush_percent = constant_to_brush_detail(CONSTANT_DETAIL, BRUSH_RADIUS, &ob); - const float converted = brush_to_detail_size(brush_percent, BRUSH_RADIUS); - - const float expected = constant_to_detail_size(CONSTANT_DETAIL, &ob); - EXPECT_FLOAT_EQ(expected, converted); -} -TEST(Conversion, ConstantToRelativeDetail) -{ - blender::bke::ObjectRuntime runtime; - runtime.object_to_world = MatBase::identity(); - - Object ob; - ob.runtime = &runtime; - - const float relative_detail = constant_to_relative_detail( - CONSTANT_DETAIL, BRUSH_RADIUS, PIXEL_RADIUS, PIXEL_SIZE, &ob); - const float converted = relative_to_detail_size( - relative_detail, BRUSH_RADIUS, PIXEL_RADIUS, PIXEL_SIZE); - - const float expected = constant_to_detail_size(CONSTANT_DETAIL, &ob); - EXPECT_FLOAT_EQ(expected, converted); -} -} // namespace blender::ed::sculpt_paint::dyntopo::detail_size::test diff --git a/source/blender/editors/sculpt_paint/sculpt_dyntopo.cc b/source/blender/editors/sculpt_paint/sculpt_dyntopo.cc index 6b511aefdbb..e9a734b49a1 100644 --- a/source/blender/editors/sculpt_paint/sculpt_dyntopo.cc +++ b/source/blender/editors/sculpt_paint/sculpt_dyntopo.cc @@ -11,12 +11,13 @@ #include "MEM_guardedalloc.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_modifier_types.h" #include "BKE_context.hh" -#include "BKE_global.hh" +#include "BKE_global.h" +#include "BKE_main.hh" #include "BKE_mesh.hh" #include "BKE_modifier.hh" #include "BKE_object.hh" @@ -24,7 +25,7 @@ #include "BKE_particle.h" #include "BKE_pbvh_api.hh" #include "BKE_pointcache.h" -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "BLI_index_range.hh" diff --git a/source/blender/editors/sculpt_paint/sculpt_expand.cc b/source/blender/editors/sculpt_paint/sculpt_expand.cc index d86bd417ff7..e72f7ec97ca 100644 --- a/source/blender/editors/sculpt_paint/sculpt_expand.cc +++ b/source/blender/editors/sculpt_paint/sculpt_expand.cc @@ -16,6 +16,7 @@ #include "BLI_task.h" #include "DNA_brush_types.h" +#include "DNA_modifier_types.h" #include "DNA_object_types.h" #include "BKE_attribute.hh" @@ -26,11 +27,15 @@ #include "BKE_image.h" #include "BKE_layer.hh" #include "BKE_mesh.hh" +#include "BKE_mesh_mapping.hh" #include "BKE_paint.hh" #include "BKE_pbvh_api.hh" -#include "BKE_report.hh" +#include "BKE_report.h" +#include "BKE_scene.h" #include "BKE_subdiv_ccg.hh" +#include "DEG_depsgraph.hh" + #include "WM_api.hh" #include "WM_types.hh" diff --git a/source/blender/editors/sculpt_paint/sculpt_face_set.cc b/source/blender/editors/sculpt_paint/sculpt_face_set.cc index 960c3392ab8..267096a722e 100644 --- a/source/blender/editors/sculpt_paint/sculpt_face_set.cc +++ b/source/blender/editors/sculpt_paint/sculpt_face_set.cc @@ -539,7 +539,7 @@ static void clear_face_sets(Object &object, const Span nodes) Vector &face_indices = all_face_indices.local(); for (PBVHNode *node : nodes.slice(range)) { const Span faces = - BKE_pbvh_type(&pbvh) == PBVH_FACES ? + (BKE_pbvh_type(&pbvh) == PBVH_FACES) ? bke::pbvh::node_face_indices_calc_mesh(pbvh, *node, face_indices) : bke::pbvh::node_face_indices_calc_grids(pbvh, *node, face_indices); if (std::any_of(faces.begin(), faces.end(), [&](const int face) { @@ -1000,7 +1000,7 @@ static void face_hide_update(Object &object, TLS &tls = all_tls.local(); for (PBVHNode *node : nodes.slice(range)) { const Span faces = - BKE_pbvh_type(&pbvh) == PBVH_FACES ? + (BKE_pbvh_type(&pbvh) == PBVH_FACES) ? bke::pbvh::node_face_indices_calc_mesh(pbvh, *node, tls.face_indices) : bke::pbvh::node_face_indices_calc_grids(pbvh, *node, tls.face_indices); @@ -1119,7 +1119,7 @@ static int sculpt_face_set_change_visibility_exec(bContext *C, wmOperator *op) UnifiedPaintSettings *ups = &CTX_data_tool_settings(C)->unified_paint_settings; float location[3]; copy_v3_v3(location, SCULPT_active_vertex_co_get(ss)); - mul_m4_v3(object.object_to_world().ptr(), location); + mul_m4_v3(object.object_to_world, location); copy_v3_v3(ups->average_stroke_accum, location); ups->average_stroke_counter = 1; ups->last_stroke_valid = true; @@ -1652,225 +1652,4 @@ void SCULPT_OT_face_sets_edit(wmOperatorType *ot) "Apply the edit operation to hidden geometry"); } -/* -------------------------------------------------------------------- */ -/** \name Gesture Operators - * \{ */ - -struct SculptGestureFaceSetOperation { - gesture::Operation op; - - int new_face_set_id; -}; - -static void sculpt_gesture_face_set_begin(bContext &C, gesture::GestureData &gesture_data) -{ - Depsgraph *depsgraph = CTX_data_depsgraph_pointer(&C); - BKE_sculpt_update_object_for_edit(depsgraph, gesture_data.vc.obact, false); -} - -static void face_set_gesture_apply_mesh(gesture::GestureData &gesture_data, - const Span nodes) -{ - SculptGestureFaceSetOperation *face_set_operation = (SculptGestureFaceSetOperation *) - gesture_data.operation; - const int new_face_set = face_set_operation->new_face_set_id; - Object &object = *gesture_data.vc.obact; - Mesh &mesh = *static_cast(object.data); - bke::AttributeAccessor attributes = mesh.attributes(); - SculptSession &ss = *gesture_data.ss; - const PBVH &pbvh = *gesture_data.ss->pbvh; - - const Span positions = ss.vert_positions; - const OffsetIndices faces = mesh.faces(); - const Span corner_verts = mesh.corner_verts(); - const VArraySpan hide_poly = *attributes.lookup(".hide_poly", bke::AttrDomain::Face); - bke::SpanAttributeWriter face_sets = face_set::ensure_face_sets_mesh(object); - - struct TLS { - Vector face_indices; - }; - - threading::EnumerableThreadSpecific all_tls; - threading::parallel_for(gesture_data.nodes.index_range(), 1, [&](const IndexRange range) { - TLS &tls = all_tls.local(); - for (PBVHNode *node : nodes.slice(range)) { - undo::push_node(gesture_data.vc.obact, node, undo::Type::FaceSet); - const Span node_faces = - BKE_pbvh_type(&pbvh) == PBVH_FACES ? - bke::pbvh::node_face_indices_calc_mesh(pbvh, *node, tls.face_indices) : - bke::pbvh::node_face_indices_calc_grids(pbvh, *node, tls.face_indices); - - bool any_updated = false; - for (const int face : node_faces) { - if (!hide_poly.is_empty() && hide_poly[face]) { - continue; - } - const Span face_verts = corner_verts.slice(faces[face]); - const float3 face_center = bke::mesh::face_center_calc(positions, face_verts); - const float3 face_normal = bke::mesh::face_normal_calc(positions, face_verts); - if (!gesture::is_affected(gesture_data, face_center, face_normal)) { - continue; - } - face_sets.span[face] = new_face_set; - any_updated = true; - } - if (any_updated) { - BKE_pbvh_node_mark_update_face_sets(node); - } - } - }); - - face_sets.finish(); -} - -static void face_set_gesture_apply_bmesh(gesture::GestureData &gesture_data, - const Span nodes) -{ - SculptGestureFaceSetOperation *face_set_operation = (SculptGestureFaceSetOperation *) - gesture_data.operation; - const int new_face_set = face_set_operation->new_face_set_id; - SculptSession &ss = *gesture_data.ss; - BMesh *bm = ss.bm; - const int offset = CustomData_get_offset_named(&bm->pdata, CD_PROP_INT32, ".sculpt_face_set"); - - threading::parallel_for(gesture_data.nodes.index_range(), 1, [&](const IndexRange range) { - for (PBVHNode *node : nodes.slice(range)) { - undo::push_node(gesture_data.vc.obact, node, undo::Type::FaceSet); - - bool any_updated = false; - for (BMFace *face : BKE_pbvh_bmesh_node_faces(node)) { - if (BM_elem_flag_test(face, BM_ELEM_HIDDEN)) { - continue; - } - float3 center; - BM_face_calc_center_median(face, center); - if (!gesture::is_affected(gesture_data, center, face->no)) { - continue; - } - BM_ELEM_CD_SET_INT(face, offset, new_face_set); - any_updated = true; - } - - if (any_updated) { - BKE_pbvh_node_mark_update_visibility(node); - } - } - }); -} - -static void sculpt_gesture_face_set_apply_for_symmetry_pass(bContext & /*C*/, - gesture::GestureData &gesture_data) -{ - switch (BKE_pbvh_type(gesture_data.ss->pbvh)) { - case PBVH_GRIDS: - case PBVH_FACES: - face_set_gesture_apply_mesh(gesture_data, gesture_data.nodes); - break; - case PBVH_BMESH: - face_set_gesture_apply_bmesh(gesture_data, gesture_data.nodes); - } -} - -static void sculpt_gesture_face_set_end(bContext & /*C*/, gesture::GestureData & /*gesture_data*/) -{ -} - -static void sculpt_gesture_init_face_set_properties(gesture::GestureData &gesture_data, - wmOperator & /*op*/) -{ - Object &object = *gesture_data.vc.obact; - gesture_data.operation = reinterpret_cast( - MEM_cnew(__func__)); - - SculptGestureFaceSetOperation *face_set_operation = (SculptGestureFaceSetOperation *) - gesture_data.operation; - - face_set_operation->op.begin = sculpt_gesture_face_set_begin; - face_set_operation->op.apply_for_symmetry_pass = sculpt_gesture_face_set_apply_for_symmetry_pass; - face_set_operation->op.end = sculpt_gesture_face_set_end; - - face_set_operation->new_face_set_id = face_set::find_next_available_id(object); -} - -static int face_set_gesture_box_invoke(bContext *C, wmOperator *op, const wmEvent *event) -{ - const View3D *v3d = CTX_wm_view3d(C); - const Base *base = CTX_data_active_base(C); - if (!BKE_base_is_visible(v3d, base)) { - return OPERATOR_CANCELLED; - } - - return WM_gesture_box_invoke(C, op, event); -} - -static int face_set_gesture_box_exec(bContext *C, wmOperator *op) -{ - std::unique_ptr gesture_data = gesture::init_from_box(C, op); - if (!gesture_data) { - return OPERATOR_CANCELLED; - } - sculpt_gesture_init_face_set_properties(*gesture_data, *op); - gesture::apply(*C, *gesture_data, *op); - return OPERATOR_FINISHED; -} - -static int face_set_gesture_lasso_invoke(bContext *C, wmOperator *op, const wmEvent *event) -{ - const View3D *v3d = CTX_wm_view3d(C); - const Base *base = CTX_data_active_base(C); - if (!BKE_base_is_visible(v3d, base)) { - return OPERATOR_CANCELLED; - } - - return WM_gesture_lasso_invoke(C, op, event); -} - -static int face_set_gesture_lasso_exec(bContext *C, wmOperator *op) -{ - std::unique_ptr gesture_data = gesture::init_from_lasso(C, op); - if (!gesture_data) { - return OPERATOR_CANCELLED; - } - sculpt_gesture_init_face_set_properties(*gesture_data, *op); - gesture::apply(*C, *gesture_data, *op); - return OPERATOR_FINISHED; -} - -void SCULPT_OT_face_set_lasso_gesture(wmOperatorType *ot) -{ - ot->name = "Face Set Lasso Gesture"; - ot->idname = "SCULPT_OT_face_set_lasso_gesture"; - ot->description = "Add face set within the lasso as you move the brush"; - - ot->invoke = face_set_gesture_lasso_invoke; - ot->modal = WM_gesture_lasso_modal; - ot->exec = face_set_gesture_lasso_exec; - - ot->poll = SCULPT_mode_poll_view3d; - - ot->flag = OPTYPE_DEPENDS_ON_CURSOR; - - WM_operator_properties_gesture_lasso(ot); - gesture::operator_properties(ot); -} - -void SCULPT_OT_face_set_box_gesture(wmOperatorType *ot) -{ - ot->name = "Face Set Box Gesture"; - ot->idname = "SCULPT_OT_face_set_box_gesture"; - ot->description = "Add face set within the box as you move the brush"; - - ot->invoke = face_set_gesture_box_invoke; - ot->modal = WM_gesture_box_modal; - ot->exec = face_set_gesture_box_exec; - - ot->poll = SCULPT_mode_poll_view3d; - - ot->flag = OPTYPE_REGISTER; - - WM_operator_properties_border(ot); - gesture::operator_properties(ot); -} -/** \} */ - } // namespace blender::ed::sculpt_paint::face_set diff --git a/source/blender/editors/sculpt_paint/sculpt_filter_color.cc b/source/blender/editors/sculpt_paint/sculpt_filter_color.cc index 9876e011184..743658151f6 100644 --- a/source/blender/editors/sculpt_paint/sculpt_filter_color.cc +++ b/source/blender/editors/sculpt_paint/sculpt_filter_color.cc @@ -13,7 +13,7 @@ #include "BLI_math_vector.hh" #include "BLI_task.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_userdef_types.h" @@ -24,6 +24,8 @@ #include "IMB_colormanagement.hh" +#include "DEG_depsgraph.hh" + #include "WM_api.hh" #include "WM_types.hh" diff --git a/source/blender/editors/sculpt_paint/sculpt_filter_mask.cc b/source/blender/editors/sculpt_paint/sculpt_filter_mask.cc index a868f3ef92b..28be463b2a3 100644 --- a/source/blender/editors/sculpt_paint/sculpt_filter_mask.cc +++ b/source/blender/editors/sculpt_paint/sculpt_filter_mask.cc @@ -6,10 +6,20 @@ * \ingroup edsculpt */ +#include "MEM_guardedalloc.h" + +#include "BLI_task.h" + +#include "DNA_mesh_types.h" +#include "DNA_modifier_types.h" + #include "BKE_context.hh" #include "BKE_layer.hh" #include "BKE_paint.hh" #include "BKE_pbvh_api.hh" +#include "BKE_scene.h" + +#include "DEG_depsgraph.hh" #include "WM_api.hh" #include "WM_types.hh" @@ -27,27 +37,35 @@ namespace blender::ed::sculpt_paint::mask { -enum class FilterType { - Smooth = 0, - Sharpen = 1, - Grow = 2, - Shrink = 3, - ContrastIncrease = 5, - ContrastDecrease = 6, +enum eSculptMaskFilterTypes { + MASK_FILTER_SMOOTH = 0, + MASK_FILTER_SHARPEN = 1, + MASK_FILTER_GROW = 2, + MASK_FILTER_SHRINK = 3, + MASK_FILTER_CONTRAST_INCREASE = 5, + MASK_FILTER_CONTRAST_DECREASE = 6, }; static EnumPropertyItem prop_mask_filter_types[] = { - {int(FilterType::Smooth), "SMOOTH", 0, "Smooth Mask", ""}, - {int(FilterType::Sharpen), "SHARPEN", 0, "Sharpen Mask", ""}, - {int(FilterType::Grow), "GROW", 0, "Grow Mask", ""}, - {int(FilterType::Shrink), "SHRINK", 0, "Shrink Mask", ""}, - {int(FilterType::ContrastIncrease), "CONTRAST_INCREASE", 0, "Increase Contrast", ""}, - {int(FilterType::ContrastDecrease), "CONTRAST_DECREASE", 0, "Decrease Contrast", ""}, + {MASK_FILTER_SMOOTH, "SMOOTH", 0, "Smooth Mask", "Smooth mask"}, + {MASK_FILTER_SHARPEN, "SHARPEN", 0, "Sharpen Mask", "Sharpen mask"}, + {MASK_FILTER_GROW, "GROW", 0, "Grow Mask", "Grow mask"}, + {MASK_FILTER_SHRINK, "SHRINK", 0, "Shrink Mask", "Shrink mask"}, + {MASK_FILTER_CONTRAST_INCREASE, + "CONTRAST_INCREASE", + 0, + "Increase Contrast", + "Increase the contrast of the paint mask"}, + {MASK_FILTER_CONTRAST_DECREASE, + "CONTRAST_DECREASE", + 0, + "Decrease Contrast", + "Decrease the contrast of the paint mask"}, {0, nullptr, 0, nullptr, nullptr}, }; static void mask_filter_task(SculptSession *ss, - const FilterType mode, + const int mode, const Span prev_mask, const SculptMaskWriteInfo mask_write, PBVHNode *node) @@ -58,11 +76,11 @@ static void mask_filter_task(SculptSession *ss, PBVHVertexIter vd; - if (mode == FilterType::ContrastIncrease) { + if (mode == MASK_FILTER_CONTRAST_INCREASE) { contrast = 0.1f; } - if (mode == FilterType::ContrastDecrease) { + if (mode == MASK_FILTER_CONTRAST_DECREASE) { contrast = -0.1f; } @@ -72,16 +90,16 @@ static void mask_filter_task(SculptSession *ss, float mask = vd.mask; SculptVertexNeighborIter ni; switch (mode) { - case FilterType::Smooth: - case FilterType::Sharpen: { + case MASK_FILTER_SMOOTH: + case MASK_FILTER_SHARPEN: { float val = smooth::neighbor_mask_average(ss, mask_write, vd.vertex); val -= mask; - if (mode == FilterType::Smooth) { + if (mode == MASK_FILTER_SMOOTH) { mask += val; } - else if (mode == FilterType::Sharpen) { + else if (mode == MASK_FILTER_SHARPEN) { if (mask > 0.5f) { mask += 0.05f; } @@ -92,7 +110,7 @@ static void mask_filter_task(SculptSession *ss, } break; } - case FilterType::Grow: + case MASK_FILTER_GROW: max = 0.0f; SCULPT_VERTEX_NEIGHBORS_ITER_BEGIN (ss, vd.vertex, ni) { float vmask_f = prev_mask[ni.index]; @@ -103,7 +121,7 @@ static void mask_filter_task(SculptSession *ss, SCULPT_VERTEX_NEIGHBORS_ITER_END(ni); mask = max; break; - case FilterType::Shrink: + case MASK_FILTER_SHRINK: min = 1.0f; SCULPT_VERTEX_NEIGHBORS_ITER_BEGIN (ss, vd.vertex, ni) { float vmask_f = prev_mask[ni.index]; @@ -114,8 +132,8 @@ static void mask_filter_task(SculptSession *ss, SCULPT_VERTEX_NEIGHBORS_ITER_END(ni); mask = min; break; - case FilterType::ContrastIncrease: - case FilterType::ContrastDecrease: + case MASK_FILTER_CONTRAST_INCREASE: + case MASK_FILTER_CONTRAST_DECREASE: delta = contrast / 2.0f; gain = 1.0f - delta * 2.0f; if (contrast > 0) { @@ -147,7 +165,7 @@ static int sculpt_mask_filter_exec(bContext *C, wmOperator *op) Object *ob = CTX_data_active_object(C); Depsgraph *depsgraph = CTX_data_depsgraph_pointer(C); const Scene *scene = CTX_data_scene(C); - const FilterType filter_type = FilterType(RNA_enum_get(op->ptr, "filter_type")); + int filter_type = RNA_enum_get(op->ptr, "filter_type"); const View3D *v3d = CTX_wm_view3d(C); const Base *base = CTX_data_active_base(C); @@ -188,7 +206,7 @@ static int sculpt_mask_filter_exec(bContext *C, wmOperator *op) const SculptMaskWriteInfo mask_write = SCULPT_mask_get_for_write(ob->sculpt); for (int i = 0; i < iterations; i++) { - if (ELEM(filter_type, FilterType::Grow, FilterType::Shrink)) { + if (ELEM(filter_type, MASK_FILTER_GROW, MASK_FILTER_SHRINK)) { prev_mask = duplicate_mask(*ob); } @@ -208,19 +226,22 @@ static int sculpt_mask_filter_exec(bContext *C, wmOperator *op) void SCULPT_OT_mask_filter(wmOperatorType *ot) { + /* Identifiers. */ ot->name = "Mask Filter"; ot->idname = "SCULPT_OT_mask_filter"; ot->description = "Applies a filter to modify the current mask"; + /* API callbacks. */ ot->exec = sculpt_mask_filter_exec; ot->poll = SCULPT_mode_poll; ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; + /* RNA. */ RNA_def_enum(ot->srna, "filter_type", prop_mask_filter_types, - int(FilterType::Smooth), + MASK_FILTER_SMOOTH, "Type", "Filter that is going to be applied to the mask"); RNA_def_int(ot->srna, diff --git a/source/blender/editors/sculpt_paint/sculpt_filter_mesh.cc b/source/blender/editors/sculpt_paint/sculpt_filter_mesh.cc index a4d5e7308fc..614878d9be7 100644 --- a/source/blender/editors/sculpt_paint/sculpt_filter_mesh.cc +++ b/source/blender/editors/sculpt_paint/sculpt_filter_mesh.cc @@ -6,8 +6,7 @@ * \ingroup edsculpt */ -#include - +#include "DNA_modifier_types.h" #include "DNA_windowmanager_types.h" #include "MEM_guardedalloc.h" @@ -18,23 +17,26 @@ #include "BLI_math_matrix.h" #include "BLI_math_vector.h" #include "BLI_math_vector_types.hh" +#include "BLI_string.h" #include "BLI_task.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_brush.hh" #include "BKE_context.hh" #include "BKE_layer.hh" #include "BKE_modifier.hh" -#include "BKE_object_types.hh" #include "BKE_paint.hh" #include "BKE_pbvh_api.hh" +#include "DEG_depsgraph.hh" + #include "WM_api.hh" #include "WM_types.hh" #include "ED_screen.hh" #include "ED_sculpt.hh" +#include "ED_util.hh" #include "ED_view3d.hh" #include "paint_intern.hh" @@ -134,8 +136,8 @@ void cache_init(bContext *C, } /* Setup orientation matrices. */ - copy_m4_m4(ss->filter_cache->obmat.ptr(), ob->object_to_world().ptr()); - invert_m4_m4(ss->filter_cache->obmat_inv.ptr(), ob->object_to_world().ptr()); + copy_m4_m4(ss->filter_cache->obmat.ptr(), ob->object_to_world); + invert_m4_m4(ss->filter_cache->obmat_inv.ptr(), ob->object_to_world); Depsgraph *depsgraph = CTX_data_ensure_evaluated_depsgraph(C); ViewContext vc = ED_view3d_viewcontext_init(C, depsgraph); @@ -187,7 +189,7 @@ void cache_init(bContext *C, /* Update last stroke location */ - mul_m4_v3(ob->object_to_world().ptr(), co); + mul_m4_v3(ob->object_to_world, co); add_v3_v3(ups->average_stroke_accum, co); ups->average_stroke_counter++; @@ -202,10 +204,10 @@ void cache_init(bContext *C, float mat[3][3]; float viewDir[3] = {0.0f, 0.0f, 1.0f}; if (vc.rv3d) { - invert_m4_m4(ob->runtime->world_to_object.ptr(), ob->object_to_world().ptr()); + invert_m4_m4(ob->world_to_object, ob->object_to_world); copy_m3_m4(mat, vc.rv3d->viewinv); mul_m3_v3(mat, viewDir); - copy_m3_m4(mat, ob->world_to_object().ptr()); + copy_m3_m4(mat, ob->world_to_object); mul_m3_v3(mat, viewDir); normalize_v3_v3(ss->filter_cache->view_normal, viewDir); } @@ -693,15 +695,23 @@ wmKeyMap *modal_keymap(wmKeyConfig *keyconf) static void sculpt_mesh_update_status_bar(bContext *C, wmOperator *op) { - auto get_modal_key_str = [&](int id) { - return WM_modalkeymap_operator_items_to_string(op->type, id, true).value_or(""); - }; + char header[UI_MAX_DRAW_STR]; + char buf[UI_MAX_DRAW_STR]; + int available_len = sizeof(buf); - const std::string header = fmt::format(IFACE_("{}: Confirm, {}: Cancel"), - get_modal_key_str(FILTER_MESH_MODAL_CONFIRM), - get_modal_key_str(FILTER_MESH_MODAL_CANCEL)); + char *p = buf; +#define WM_MODALKEY(_id) \ + WM_modalkeymap_operator_items_to_string_buf( \ + op->type, (_id), true, UI_MAX_SHORTCUT_STR, &available_len, &p) - ED_workspace_status_text(C, header.c_str()); + SNPRINTF(header, + IFACE_("%s: Confirm, %s: Cancel"), + WM_MODALKEY(FILTER_MESH_MODAL_CONFIRM), + WM_MODALKEY(FILTER_MESH_MODAL_CANCEL)); + +#undef WM_MODALKEY + + ED_workspace_status_text(C, header); } static void sculpt_mesh_filter_apply(bContext *C, wmOperator *op) diff --git a/source/blender/editors/sculpt_paint/sculpt_gesture.cc b/source/blender/editors/sculpt_paint/sculpt_gesture.cc deleted file mode 100644 index f46328205f2..00000000000 --- a/source/blender/editors/sculpt_paint/sculpt_gesture.cc +++ /dev/null @@ -1,453 +0,0 @@ -/* SPDX-FileCopyrightText: 2024 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup edsculpt - * Common helper methods and structures for gesture operations. - */ -#include "MEM_guardedalloc.h" - -#include "DNA_vec_types.h" - -#include "BLI_bit_vector.hh" -#include "BLI_bitmap_draw_2d.h" -#include "BLI_lasso_2d.hh" -#include "BLI_math_geom.h" -#include "BLI_math_matrix.h" -#include "BLI_math_matrix_types.hh" -#include "BLI_math_vector.h" -#include "BLI_math_vector_types.hh" -#include "BLI_vector.hh" - -#include "BKE_context.hh" -#include "BKE_paint.hh" - -#include "ED_view3d.hh" - -#include "RNA_access.hh" -#include "RNA_define.hh" - -#include "WM_api.hh" -#include "WM_types.hh" - -#include "paint_intern.hh" -#include "sculpt_intern.hh" - -namespace blender::ed::sculpt_paint::gesture { - -void operator_properties(wmOperatorType *ot) -{ - RNA_def_boolean(ot->srna, - "use_front_faces_only", - false, - "Front Faces Only", - "Affect only faces facing towards the view"); - - RNA_def_boolean(ot->srna, - "use_limit_to_segment", - false, - "Limit to Segment", - "Apply the gesture action only to the area that is contained within the " - "segment without extending its effect to the entire line"); -} - -static void init_common(bContext *C, wmOperator *op, GestureData &gesture_data) -{ - Depsgraph *depsgraph = CTX_data_ensure_evaluated_depsgraph(C); - gesture_data.vc = ED_view3d_viewcontext_init(C, depsgraph); - Object *ob = gesture_data.vc.obact; - - /* Operator properties. */ - gesture_data.front_faces_only = RNA_boolean_get(op->ptr, "use_front_faces_only"); - gesture_data.line.use_side_planes = RNA_boolean_get(op->ptr, "use_limit_to_segment"); - gesture_data.selection_type = SelectionType::Inside; - - /* SculptSession */ - gesture_data.ss = ob->sculpt; - - /* Symmetry. */ - gesture_data.symm = ePaintSymmetryFlags(SCULPT_mesh_symmetry_xyz_get(ob)); - - /* View Normal. */ - float mat[3][3]; - float view_dir[3] = {0.0f, 0.0f, 1.0f}; - copy_m3_m4(mat, gesture_data.vc.rv3d->viewinv); - mul_m3_v3(mat, view_dir); - normalize_v3_v3(gesture_data.world_space_view_normal, view_dir); - copy_m3_m4(mat, ob->world_to_object().ptr()); - mul_m3_v3(mat, view_dir); - normalize_v3_v3(gesture_data.true_view_normal, view_dir); - - /* View Origin. */ - copy_v3_v3(gesture_data.world_space_view_origin, gesture_data.vc.rv3d->viewinv[3]); - copy_v3_v3(gesture_data.true_view_origin, gesture_data.vc.rv3d->viewinv[3]); -} - -static void lasso_px_cb(int x, int x_end, int y, void *user_data) -{ - GestureData *gesture_data = static_cast(user_data); - LassoData *lasso = &gesture_data->lasso; - int index = (y * lasso->width) + x; - int index_end = (y * lasso->width) + x_end; - do { - lasso->mask_px[index].set(); - } while (++index != index_end); -} - -std::unique_ptr init_from_lasso(bContext *C, wmOperator *op) -{ - const Array mcoords = WM_gesture_lasso_path_to_array(C, op); - if (mcoords.size() <= 1) { - return nullptr; - } - - std::unique_ptr gesture_data = std::make_unique(); - gesture_data->shape_type = ShapeType::Lasso; - - init_common(C, op, *gesture_data); - - gesture_data->lasso.projviewobjmat = ED_view3d_ob_project_mat_get(gesture_data->vc.rv3d, - gesture_data->vc.obact); - BLI_lasso_boundbox(&gesture_data->lasso.boundbox, mcoords); - const int lasso_width = 1 + gesture_data->lasso.boundbox.xmax - - gesture_data->lasso.boundbox.xmin; - const int lasso_height = 1 + gesture_data->lasso.boundbox.ymax - - gesture_data->lasso.boundbox.ymin; - gesture_data->lasso.width = lasso_width; - gesture_data->lasso.mask_px.resize(lasso_width * lasso_height); - - BLI_bitmap_draw_2d_poly_v2i_n(gesture_data->lasso.boundbox.xmin, - gesture_data->lasso.boundbox.ymin, - gesture_data->lasso.boundbox.xmax, - gesture_data->lasso.boundbox.ymax, - mcoords, - lasso_px_cb, - gesture_data.get()); - - BoundBox bb; - ED_view3d_clipping_calc(&bb, - gesture_data->true_clip_planes, - gesture_data->vc.region, - gesture_data->vc.obact, - &gesture_data->lasso.boundbox); - - gesture_data->gesture_points.reinitialize(mcoords.size()); - for (const int i : mcoords.index_range()) { - gesture_data->gesture_points[i][0] = mcoords[i][0]; - gesture_data->gesture_points[i][1] = mcoords[i][1]; - } - - return gesture_data; -} - -std::unique_ptr init_from_box(bContext *C, wmOperator *op) -{ - std::unique_ptr gesture_data = std::make_unique(); - gesture_data->shape_type = ShapeType::Box; - - init_common(C, op, *gesture_data); - - rcti rect; - WM_operator_properties_border_to_rcti(op, &rect); - - BoundBox bb; - ED_view3d_clipping_calc( - &bb, gesture_data->true_clip_planes, gesture_data->vc.region, gesture_data->vc.obact, &rect); - - gesture_data->gesture_points.reinitialize(4); - - gesture_data->gesture_points[0][0] = rect.xmax; - gesture_data->gesture_points[0][1] = rect.ymax; - - gesture_data->gesture_points[1][0] = rect.xmax; - gesture_data->gesture_points[1][1] = rect.ymin; - - gesture_data->gesture_points[2][0] = rect.xmin; - gesture_data->gesture_points[2][1] = rect.ymin; - - gesture_data->gesture_points[3][0] = rect.xmin; - gesture_data->gesture_points[3][1] = rect.ymax; - return gesture_data; -} - -static void line_plane_from_tri(float *r_plane, - GestureData &gesture_data, - const bool flip, - const float p1[3], - const float p2[3], - const float p3[3]) -{ - float normal[3]; - normal_tri_v3(normal, p1, p2, p3); - mul_v3_mat3_m4v3(normal, gesture_data.vc.obact->world_to_object().ptr(), normal); - if (flip) { - mul_v3_fl(normal, -1.0f); - } - float plane_point_object_space[3]; - mul_v3_m4v3(plane_point_object_space, gesture_data.vc.obact->world_to_object().ptr(), p1); - plane_from_point_normal_v3(r_plane, plane_point_object_space, normal); -} - -/* Creates 4 points in the plane defined by the line and 2 extra points with an offset relative to - * this plane. */ -static void line_calculate_plane_points(GestureData &gesture_data, - float line_points[2][2], - float r_plane_points[4][3], - float r_offset_plane_points[2][3]) -{ - float depth_point[3]; - add_v3_v3v3(depth_point, gesture_data.true_view_origin, gesture_data.true_view_normal); - ED_view3d_win_to_3d( - gesture_data.vc.v3d, gesture_data.vc.region, depth_point, line_points[0], r_plane_points[0]); - ED_view3d_win_to_3d( - gesture_data.vc.v3d, gesture_data.vc.region, depth_point, line_points[1], r_plane_points[3]); - - madd_v3_v3v3fl(depth_point, gesture_data.true_view_origin, gesture_data.true_view_normal, 10.0f); - ED_view3d_win_to_3d( - gesture_data.vc.v3d, gesture_data.vc.region, depth_point, line_points[0], r_plane_points[1]); - ED_view3d_win_to_3d( - gesture_data.vc.v3d, gesture_data.vc.region, depth_point, line_points[1], r_plane_points[2]); - - float normal[3]; - normal_tri_v3(normal, r_plane_points[0], r_plane_points[1], r_plane_points[2]); - add_v3_v3v3(r_offset_plane_points[0], r_plane_points[0], normal); - add_v3_v3v3(r_offset_plane_points[1], r_plane_points[3], normal); -} - -std::unique_ptr init_from_line(bContext *C, wmOperator *op) -{ - std::unique_ptr gesture_data = std::make_unique(); - gesture_data->shape_type = ShapeType::Line; - - init_common(C, op, *gesture_data); - - float line_points[2][2]; - line_points[0][0] = RNA_int_get(op->ptr, "xstart"); - line_points[0][1] = RNA_int_get(op->ptr, "ystart"); - line_points[1][0] = RNA_int_get(op->ptr, "xend"); - line_points[1][1] = RNA_int_get(op->ptr, "yend"); - - gesture_data->line.flip = RNA_boolean_get(op->ptr, "flip"); - - float plane_points[4][3]; - float offset_plane_points[2][3]; - line_calculate_plane_points(*gesture_data, line_points, plane_points, offset_plane_points); - - /* Calculate line plane and normal. */ - const bool flip = gesture_data->line.flip ^ (!gesture_data->vc.rv3d->is_persp); - line_plane_from_tri(gesture_data->line.true_plane, - *gesture_data, - flip, - plane_points[0], - plane_points[1], - plane_points[2]); - - /* Calculate the side planes. */ - line_plane_from_tri(gesture_data->line.true_side_plane[0], - *gesture_data, - false, - plane_points[1], - plane_points[0], - offset_plane_points[0]); - line_plane_from_tri(gesture_data->line.true_side_plane[1], - *gesture_data, - false, - plane_points[3], - plane_points[2], - offset_plane_points[1]); - - return gesture_data; -} - -GestureData::~GestureData() -{ - MEM_SAFE_FREE(this->operation); -} - -static void flip_plane(float out[4], const float in[4], const char symm) -{ - if (symm & PAINT_SYMM_X) { - out[0] = -in[0]; - } - else { - out[0] = in[0]; - } - if (symm & PAINT_SYMM_Y) { - out[1] = -in[1]; - } - else { - out[1] = in[1]; - } - if (symm & PAINT_SYMM_Z) { - out[2] = -in[2]; - } - else { - out[2] = in[2]; - } - - out[3] = in[3]; -} - -static void flip_for_symmetry_pass(GestureData &gesture_data, const ePaintSymmetryFlags symmpass) -{ - gesture_data.symmpass = symmpass; - for (int j = 0; j < 4; j++) { - flip_plane(gesture_data.clip_planes[j], gesture_data.true_clip_planes[j], symmpass); - } - - negate_m4(gesture_data.clip_planes); - - flip_v3_v3(gesture_data.view_normal, gesture_data.true_view_normal, symmpass); - flip_v3_v3(gesture_data.view_origin, gesture_data.true_view_origin, symmpass); - flip_plane(gesture_data.line.plane, gesture_data.line.true_plane, symmpass); - flip_plane(gesture_data.line.side_plane[0], gesture_data.line.true_side_plane[0], symmpass); - flip_plane(gesture_data.line.side_plane[1], gesture_data.line.true_side_plane[1], symmpass); -} - -static Vector update_affected_nodes_by_line_plane(GestureData &gesture_data) -{ - SculptSession *ss = gesture_data.ss; - float clip_planes[3][4]; - copy_v4_v4(clip_planes[0], gesture_data.line.plane); - copy_v4_v4(clip_planes[1], gesture_data.line.side_plane[0]); - copy_v4_v4(clip_planes[2], gesture_data.line.side_plane[1]); - - PBVHFrustumPlanes frustum{}; - frustum.planes = clip_planes; - frustum.num_planes = gesture_data.line.use_side_planes ? 3 : 1; - - return gesture_data.nodes = bke::pbvh::search_gather(ss->pbvh, [&](PBVHNode &node) { - return BKE_pbvh_node_frustum_contain_AABB(&node, &frustum); - }); -} - -static void update_affected_nodes_by_clip_planes(GestureData &gesture_data) -{ - SculptSession *ss = gesture_data.ss; - float clip_planes[4][4]; - copy_m4_m4(clip_planes, gesture_data.clip_planes); - negate_m4(clip_planes); - - PBVHFrustumPlanes frustum{}; - frustum.planes = clip_planes; - frustum.num_planes = 4; - - gesture_data.nodes = bke::pbvh::search_gather(ss->pbvh, [&](PBVHNode &node) { - switch (gesture_data.selection_type) { - case SelectionType::Inside: - return BKE_pbvh_node_frustum_contain_AABB(&node, &frustum); - case SelectionType::Outside: - /* Certain degenerate cases of a lasso shape can cause the resulting - * frustum planes to enclose a node's AABB, therefore we must submit it - * to be more throughly evaluated. */ - if (gesture_data.shape_type == ShapeType::Lasso) { - return true; - } - return BKE_pbvh_node_frustum_exclude_AABB(&node, &frustum); - default: - BLI_assert_unreachable(); - return true; - } - }); -} - -static void update_affected_nodes(GestureData &gesture_data) -{ - switch (gesture_data.shape_type) { - case ShapeType::Box: - case ShapeType::Lasso: - update_affected_nodes_by_clip_planes(gesture_data); - break; - case ShapeType::Line: - update_affected_nodes_by_line_plane(gesture_data); - break; - } -} - -static bool is_affected_lasso(GestureData &gesture_data, const float co[3]) -{ - int scr_co_s[2]; - float co_final[3]; - - flip_v3_v3(co_final, co, gesture_data.symmpass); - - /* First project point to 2d space. */ - const float2 scr_co_f = ED_view3d_project_float_v2_m4( - gesture_data.vc.region, co_final, gesture_data.lasso.projviewobjmat); - - scr_co_s[0] = scr_co_f[0]; - scr_co_s[1] = scr_co_f[1]; - - /* Clip against lasso boundbox. */ - LassoData *lasso = &gesture_data.lasso; - if (!BLI_rcti_isect_pt(&lasso->boundbox, scr_co_s[0], scr_co_s[1])) { - return gesture_data.selection_type == SelectionType::Outside; - } - - scr_co_s[0] -= lasso->boundbox.xmin; - scr_co_s[1] -= lasso->boundbox.ymin; - - const bool bitmap_result = lasso->mask_px[scr_co_s[1] * lasso->width + scr_co_s[0]].test(); - switch (gesture_data.selection_type) { - case SelectionType::Inside: - return bitmap_result; - case SelectionType::Outside: - return !bitmap_result; - } - BLI_assert_unreachable(); - return false; -} - -bool is_affected(GestureData &gesture_data, const float3 &co, const float3 &vertex_normal) -{ - float dot = dot_v3v3(gesture_data.view_normal, vertex_normal); - const bool is_effected_front_face = !(gesture_data.front_faces_only && dot < 0.0f); - - if (!is_effected_front_face) { - return false; - } - - switch (gesture_data.shape_type) { - case ShapeType::Box: { - const bool is_contained = isect_point_planes_v3(gesture_data.clip_planes, 4, co); - return ((is_contained && gesture_data.selection_type == SelectionType::Inside) || - (!is_contained && gesture_data.selection_type == SelectionType::Outside)); - } - case ShapeType::Lasso: - return is_affected_lasso(gesture_data, co); - case ShapeType::Line: - if (gesture_data.line.use_side_planes) { - return plane_point_side_v3(gesture_data.line.plane, co) > 0.0f && - plane_point_side_v3(gesture_data.line.side_plane[0], co) > 0.0f && - plane_point_side_v3(gesture_data.line.side_plane[1], co) > 0.0f; - } - return plane_point_side_v3(gesture_data.line.plane, co) > 0.0f; - } - return false; -} - -void apply(bContext &C, GestureData &gesture_data, wmOperator &op) -{ - Operation *operation = gesture_data.operation; - undo::push_begin(CTX_data_active_object(&C), &op); - - operation->begin(C, gesture_data); - - for (int symmpass = 0; symmpass <= gesture_data.symm; symmpass++) { - if (SCULPT_is_symmetry_iteration_valid(symmpass, gesture_data.symm)) { - flip_for_symmetry_pass(gesture_data, ePaintSymmetryFlags(symmpass)); - update_affected_nodes(gesture_data); - - operation->apply_for_symmetry_pass(C, gesture_data); - } - } - - operation->end(C, gesture_data); - - Object *ob = CTX_data_active_object(&C); - undo::push_end(ob); - - SCULPT_tag_update_overlays(&C); -} -} // namespace blender::ed::sculpt_paint::gesture diff --git a/source/blender/editors/sculpt_paint/sculpt_intern.hh b/source/blender/editors/sculpt_paint/sculpt_intern.hh index fc20a68bdb6..f4b3a5c6b23 100644 --- a/source/blender/editors/sculpt_paint/sculpt_intern.hh +++ b/source/blender/editors/sculpt_paint/sculpt_intern.hh @@ -56,6 +56,8 @@ struct wmKeyMap; struct wmOperator; struct wmOperatorType; +/* Updates */ + /* -------------------------------------------------------------------- */ /** \name Sculpt Types * \{ */ @@ -132,6 +134,8 @@ enum eBoundaryAutomaskMode { AUTOMASK_INIT_BOUNDARY_FACE_SETS = 2, }; +/* Undo */ + namespace blender::ed::sculpt_paint::undo { enum class Type { @@ -752,6 +756,8 @@ void SCULPT_tag_update_overlays(bContext *C); /** \name Stroke Functions * \{ */ +/* Stroke */ + /** * Do a ray-cast in the tree to find the 3d brush location * (This allows us to ignore the GL depth buffer) @@ -1223,51 +1229,6 @@ void triangulate(BMesh *bm); WarnFlag check_attribute_warning(Scene *scene, Object *ob); -namespace detail_size { - -/** - * Scaling factor to match the displayed size to the actual sculpted size - */ -constexpr float RELATIVE_SCALE_FACTOR = 0.4f; - -/** - * Converts from Sculpt#constant_detail to the PBVH max edge length. - */ -float constant_to_detail_size(const float constant_detail, const Object *ob); - -/** - * Converts from Sculpt#detail_percent to the PBVH max edge length. - */ -float brush_to_detail_size(const float brush_percent, const float brush_radius); - -/** - * Converts from Sculpt#detail_size to the PBVH max edge length. - */ -float relative_to_detail_size(const float relative_detail, - const float brush_radius, - const float pixel_radius, - const float pixel_size); - -/** - * Converts from Sculpt#constant_detail to equivalent Sculpt#detail_percent value. - * - * Corresponds to a change from Constant & Manual Detailing to Brush Detailing. - */ -float constant_to_brush_detail(const float constant_detail, - const float brush_radius, - const Object *ob); - -/** - * Converts from Sculpt#constant_detail to equivalent Sculpt#detail_size value. - * - * Corresponds to a change from Constant & Manual Detailing to Relative Detailing. - */ -float constant_to_relative_detail(const float constant_detail, - const float brush_radius, - const float pixel_radius, - const float pixel_size, - const Object *ob); -} } /** \} */ @@ -1658,130 +1619,16 @@ void modal_keymap(wmKeyConfig *keyconf); /** \name Gesture Operators * \{ */ -namespace blender::ed::sculpt_paint::gesture { -enum ShapeType { - Box = 0, - Lasso = 1, - Line = 2, -}; +namespace blender::ed::sculpt_paint::mask { -enum class SelectionType { - Inside = 0, - Outside = 1, -}; +void SCULPT_OT_face_set_lasso_gesture(wmOperatorType *ot); +void SCULPT_OT_face_set_box_gesture(wmOperatorType *ot); -struct LassoData { - float4x4 projviewobjmat; - - rcti boundbox; - int width; - - /* 2D bitmap to test if a vertex is affected by the lasso shape. */ - blender::BitVector<> mask_px; -}; - -struct LineData { - /* Plane aligned to the gesture line. */ - float true_plane[4]; - float plane[4]; - - /* Planes to limit the action to the length of the gesture segment at both sides of the affected - * area. */ - float side_plane[2][4]; - float true_side_plane[2][4]; - bool use_side_planes; - - bool flip; -}; - -struct Operation; - -/* Common data used for executing a gesture operation. */ -struct GestureData { - SculptSession *ss; - ViewContext vc; - - /* Enabled and currently active symmetry. */ - ePaintSymmetryFlags symm; - ePaintSymmetryFlags symmpass; - - /* Operation parameters. */ - ShapeType shape_type; - bool front_faces_only; - SelectionType selection_type; - - Operation *operation; - - /* Gesture data. */ - /* Screen space points that represent the gesture shape. */ - Array gesture_points; - - /* View parameters. */ - float3 true_view_normal; - float3 view_normal; - - float3 true_view_origin; - float3 view_origin; - - float true_clip_planes[4][4]; - float clip_planes[4][4]; - - /* These store the view origin and normal in world space, which is used in some gestures to - * generate geometry aligned from the view directly in world space. */ - /* World space view origin and normal are not affected by object symmetry when doing symmetry - * passes, so there is no separate variables with the `true_` prefix to store their original - * values without symmetry modifications. */ - float3 world_space_view_origin; - float3 world_space_view_normal; - - /* Lasso Gesture. */ - LassoData lasso; - - /* Line Gesture. */ - LineData line; - - /* Task Callback Data. */ - Vector nodes; - - ~GestureData(); -}; - -/* Common abstraction structure for gesture operations. */ -struct Operation { - /* Initial setup (data updates, special undo push...). */ - void (*begin)(bContext &, GestureData &); - - /* Apply the gesture action for each symmetry pass. */ - void (*apply_for_symmetry_pass)(bContext &, GestureData &); - - /* Remaining actions after finishing the symmetry passes iterations - * (updating data-layers, tagging PBVH updates...). */ - void (*end)(bContext &, GestureData &); -}; - -/* Determines whether or not a gesture action should be applied. */ -bool is_affected(GestureData &gesture_data, const float3 &co, const float3 &vertex_normal); - -/* Initialization functions. */ -std::unique_ptr init_from_box(bContext *C, wmOperator *op); -std::unique_ptr init_from_lasso(bContext *C, wmOperator *op); -std::unique_ptr init_from_line(bContext *C, wmOperator *op); - -/* Common gesture operator properties. */ -void operator_properties(wmOperatorType *ot); - -/* Apply the gesture action to the selected nodes. */ -void apply(bContext &C, GestureData &gesture_data, wmOperator &op); - -} - -namespace blender::ed::sculpt_paint::project { -void SCULPT_OT_project_line_gesture(wmOperatorType *ot); -} - -namespace blender::ed::sculpt_paint::trim { void SCULPT_OT_trim_lasso_gesture(wmOperatorType *ot); void SCULPT_OT_trim_box_gesture(wmOperatorType *ot); + +void SCULPT_OT_project_line_gesture(wmOperatorType *ot); + } /** \} */ @@ -1798,8 +1645,6 @@ void SCULPT_OT_face_sets_init(wmOperatorType *ot); void SCULPT_OT_face_sets_create(wmOperatorType *ot); void SCULPT_OT_face_sets_edit(wmOperatorType *ot); -void SCULPT_OT_face_set_lasso_gesture(wmOperatorType *ot); -void SCULPT_OT_face_set_box_gesture(wmOperatorType *ot); } /** \} */ @@ -1814,6 +1659,8 @@ void SCULPT_OT_set_pivot_position(wmOperatorType *ot); /** \name Filter Operators * \{ */ +/* Mesh Filter. */ + namespace blender::ed::sculpt_paint::filter { void SCULPT_OT_mesh_filter(wmOperatorType *ot); @@ -1825,6 +1672,8 @@ namespace blender::ed::sculpt_paint::cloth { void SCULPT_OT_cloth_filter(wmOperatorType *ot); } +/* Color Filter. */ + namespace blender::ed::sculpt_paint::color { void SCULPT_OT_color_filter(wmOperatorType *ot); } @@ -1854,6 +1703,7 @@ namespace blender::ed::sculpt_paint::dyntopo { void SCULPT_OT_detail_flood_fill(wmOperatorType *ot); void SCULPT_OT_sample_detail_size(wmOperatorType *ot); +void SCULPT_OT_set_detail_size(wmOperatorType *ot); void SCULPT_OT_dyntopo_detail_size_edit(wmOperatorType *ot); void SCULPT_OT_dynamic_topology_toggle(wmOperatorType *ot); @@ -1867,6 +1717,8 @@ void SCULPT_OT_dynamic_topology_toggle(wmOperatorType *ot); /** \name Brushes * \{ */ +/* Pose Brush. */ + namespace blender::ed::sculpt_paint::pose { /** @@ -1894,6 +1746,8 @@ void ik_chain_free(SculptPoseIKChain *ik_chain); } +/* Boundary Brush. */ + namespace blender::ed::sculpt_paint::boundary { /** @@ -2047,13 +1901,6 @@ int SCULPT_vertex_island_get(const SculptSession *ss, PBVHVertRef vertex); /** \} */ -namespace blender::ed::sculpt_paint { -float sculpt_calc_radius(ViewContext *vc, - const Brush *brush, - const Scene *scene, - const float3 location); -} - inline void *SCULPT_vertex_attr_get(const PBVHVertRef vertex, const SculptAttribute *attr) { if (attr->data) { diff --git a/source/blender/editors/sculpt_paint/sculpt_mask_init.cc b/source/blender/editors/sculpt_paint/sculpt_mask_init.cc index 0efd49e3877..6ed8b76a0b6 100644 --- a/source/blender/editors/sculpt_paint/sculpt_mask_init.cc +++ b/source/blender/editors/sculpt_paint/sculpt_mask_init.cc @@ -12,6 +12,9 @@ #include "BLI_task.h" #include "BLI_time.h" +#include "DNA_brush_types.h" +#include "DNA_mesh_types.h" +#include "DNA_modifier_types.h" #include "DNA_object_types.h" #include "BKE_ccg.h" @@ -21,6 +24,8 @@ #include "BKE_paint.hh" #include "BKE_pbvh_api.hh" +#include "DEG_depsgraph.hh" + #include "WM_api.hh" #include "WM_types.hh" @@ -107,7 +112,7 @@ static int sculpt_mask_init_exec(bContext *C, wmOperator *op) SCULPT_topology_islands_ensure(ob); } - const int mask_init_seed = BLI_time_now_seconds(); + const int mask_init_seed = BLI_check_seconds_timer(); const SculptMaskWriteInfo mask_write = SCULPT_mask_get_for_write(ss); threading::parallel_for(nodes.index_range(), 1, [&](const IndexRange range) { diff --git a/source/blender/editors/sculpt_paint/sculpt_multiplane_scrape.cc b/source/blender/editors/sculpt_paint/sculpt_multiplane_scrape.cc index cb198a77aa6..aae52719077 100644 --- a/source/blender/editors/sculpt_paint/sculpt_multiplane_scrape.cc +++ b/source/blender/editors/sculpt_paint/sculpt_multiplane_scrape.cc @@ -17,6 +17,7 @@ #include "DNA_object_types.h" #include "BKE_ccg.h" +#include "BKE_context.hh" #include "BKE_paint.hh" #include "BKE_pbvh_api.hh" diff --git a/source/blender/editors/sculpt_paint/sculpt_ops.cc b/source/blender/editors/sculpt_paint/sculpt_ops.cc index 96348b334d1..1967c09562b 100644 --- a/source/blender/editors/sculpt_paint/sculpt_ops.cc +++ b/source/blender/editors/sculpt_paint/sculpt_ops.cc @@ -15,11 +15,12 @@ #include "BLI_task.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_brush_types.h" #include "DNA_customdata_types.h" #include "DNA_listBase.h" +#include "DNA_modifier_types.h" #include "DNA_node_types.h" #include "DNA_object_types.h" #include "DNA_scene_types.h" @@ -32,12 +33,13 @@ #include "BKE_main.hh" #include "BKE_mesh.hh" #include "BKE_mesh_mirror.hh" +#include "BKE_modifier.hh" #include "BKE_multires.hh" #include "BKE_object.hh" #include "BKE_paint.hh" #include "BKE_pbvh_api.hh" -#include "BKE_report.hh" -#include "BKE_scene.hh" +#include "BKE_report.h" +#include "BKE_scene.h" #include "DEG_depsgraph.hh" @@ -331,7 +333,7 @@ void ensure_valid_pivot(const Object *ob, Scene *scene) if (ups->average_stroke_counter == 0 || !ups->last_stroke_valid) { const Bounds bounds = BKE_pbvh_bounding_box(ob->sculpt->pbvh); const float3 center = math::midpoint(bounds.min, bounds.max); - const float3 location = math::transform_point(ob->object_to_world(), center); + const float3 location = math::transform_point(float4x4(ob->object_to_world), center); copy_v3_v3(ups->average_stroke_accum, location); ups->average_stroke_counter = 1; @@ -364,7 +366,7 @@ void ED_object_sculptmode_enter_ex(Main *bmain, BKE_report( reports, RPT_WARNING, "Object has non-uniform scale, sculpting may be unpredictable"); } - else if (is_negative_m4(ob->object_to_world().ptr())) { + else if (is_negative_m4(ob->object_to_world)) { BKE_report(reports, RPT_WARNING, "Object has negative scale, sculpting may be unpredictable"); } @@ -431,7 +433,7 @@ void ED_object_sculptmode_enter_ex(Main *bmain, ensure_valid_pivot(ob, scene); /* Flush object mode. */ - DEG_id_tag_update(&ob->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&ob->id, ID_RECALC_COPY_ON_WRITE); } void ED_object_sculptmode_enter(bContext *C, Depsgraph *depsgraph, ReportList *reports) @@ -485,7 +487,7 @@ void ED_object_sculptmode_exit_ex(Main *bmain, Depsgraph *depsgraph, Scene *scen BKE_object_free_derived_caches(ob); /* Flush object mode. */ - DEG_id_tag_update(&ob->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&ob->id, ID_RECALC_COPY_ON_WRITE); } void ED_object_sculptmode_exit(bContext *C, Depsgraph *depsgraph) @@ -1306,6 +1308,7 @@ void ED_operatortypes_sculpt() WM_operatortype_append(SCULPT_OT_symmetrize); WM_operatortype_append(dyntopo::SCULPT_OT_detail_flood_fill); WM_operatortype_append(dyntopo::SCULPT_OT_sample_detail_size); + WM_operatortype_append(dyntopo::SCULPT_OT_set_detail_size); WM_operatortype_append(filter::SCULPT_OT_mesh_filter); WM_operatortype_append(mask::SCULPT_OT_mask_filter); WM_operatortype_append(SCULPT_OT_set_pivot_position); @@ -1315,11 +1318,11 @@ void ED_operatortypes_sculpt() WM_operatortype_append(face_set::SCULPT_OT_face_sets_init); WM_operatortype_append(face_set::SCULPT_OT_face_sets_edit); WM_operatortype_append(cloth::SCULPT_OT_cloth_filter); - WM_operatortype_append(face_set::SCULPT_OT_face_set_lasso_gesture); - WM_operatortype_append(face_set::SCULPT_OT_face_set_box_gesture); - WM_operatortype_append(trim::SCULPT_OT_trim_box_gesture); - WM_operatortype_append(trim::SCULPT_OT_trim_lasso_gesture); - WM_operatortype_append(project::SCULPT_OT_project_line_gesture); + WM_operatortype_append(mask::SCULPT_OT_face_set_lasso_gesture); + WM_operatortype_append(mask::SCULPT_OT_face_set_box_gesture); + WM_operatortype_append(mask::SCULPT_OT_trim_box_gesture); + WM_operatortype_append(mask::SCULPT_OT_trim_lasso_gesture); + WM_operatortype_append(mask::SCULPT_OT_project_line_gesture); WM_operatortype_append(SCULPT_OT_sample_color); WM_operatortype_append(color::SCULPT_OT_color_filter); diff --git a/source/blender/editors/sculpt_paint/sculpt_paint_color.cc b/source/blender/editors/sculpt_paint/sculpt_paint_color.cc index 62315b7e6b0..8975f454c3b 100644 --- a/source/blender/editors/sculpt_paint/sculpt_paint_color.cc +++ b/source/blender/editors/sculpt_paint/sculpt_paint_color.cc @@ -19,6 +19,7 @@ #include "BKE_brush.hh" #include "BKE_colorband.hh" #include "BKE_colortools.hh" +#include "BKE_context.hh" #include "BKE_paint.hh" #include "BKE_pbvh_api.hh" @@ -190,8 +191,7 @@ static void do_paint_brush_task(Object *ob, * at this point to avoid washing out non-binary masking modes like cavity masking. */ float automasking = auto_mask::factor_get( ss->cache->automasking.get(), ss, vd.vertex, &automask_data); - const float alpha = BKE_brush_alpha_get(ss->scene, brush); - mul_v4_v4fl(buffer_color, color_buffer->color[vd.i], alpha * automasking); + mul_v4_v4fl(buffer_color, color_buffer->color[vd.i], brush->alpha * automasking); float4 col; SCULPT_vertex_color_get(ss, vd.vertex, col); @@ -374,6 +374,8 @@ static void do_smear_brush_task(Object *ob, const Brush *brush, PBVHNode *node) 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 no[3]; SCULPT_vertex_normal_get(ss, vd.vertex, no); @@ -466,9 +468,11 @@ static void do_smear_brush_task(Object *ob, const Brush *brush, PBVHNode *node) mul_v4_fl(accum, 1.0f / totw); } + blend_color_mix_float(interp_color, interp_color, accum); + float col[4]; SCULPT_vertex_color_get(ss, vd.vertex, col); - blend_color_interpolate_float(col, ss->cache->prev_colors[vd.index], accum, fade); + blend_color_interpolate_float(col, ss->cache->prev_colors[vd.index], interp_color, fade); SCULPT_vertex_color_set(ss, vd.vertex, col); } BKE_pbvh_vertex_iter_end; diff --git a/source/blender/editors/sculpt_paint/sculpt_pose.cc b/source/blender/editors/sculpt_paint/sculpt_pose.cc index 3a4383f976e..5c0bb7406a4 100644 --- a/source/blender/editors/sculpt_paint/sculpt_pose.cc +++ b/source/blender/editors/sculpt_paint/sculpt_pose.cc @@ -19,6 +19,7 @@ #include "BKE_brush.hh" #include "BKE_ccg.h" #include "BKE_colortools.hh" +#include "BKE_context.hh" #include "BKE_paint.hh" #include "BKE_pbvh_api.hh" diff --git a/source/blender/editors/sculpt_paint/sculpt_project.cc b/source/blender/editors/sculpt_paint/sculpt_project.cc deleted file mode 100644 index 3d3bf580254..00000000000 --- a/source/blender/editors/sculpt_paint/sculpt_project.cc +++ /dev/null @@ -1,155 +0,0 @@ -/* SPDX-FileCopyrightText: 2024 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup edsculpt - */ - -#include "BLI_math_geom.h" -#include "BLI_math_matrix.h" -#include "BLI_math_vector.h" - -#include "BKE_context.hh" -#include "BKE_layer.hh" - -#include "WM_api.hh" -#include "WM_types.hh" - -#include "sculpt_intern.hh" - -namespace blender::ed::sculpt_paint::project { - -struct SculptGestureProjectOperation { - gesture::Operation operation; -}; - -static void sculpt_gesture_project_begin(bContext &C, gesture::GestureData &gesture_data) -{ - Depsgraph *depsgraph = CTX_data_depsgraph_pointer(&C); - BKE_sculpt_update_object_for_edit(depsgraph, gesture_data.vc.obact, false); -} - -static void project_line_gesture_apply_task(gesture::GestureData &gesture_data, PBVHNode *node) -{ - PBVHVertexIter vd; - bool any_updated = false; - - undo::push_node(gesture_data.vc.obact, node, undo::Type::Position); - - BKE_pbvh_vertex_iter_begin (gesture_data.ss->pbvh, node, vd, PBVH_ITER_UNIQUE) { - float vertex_normal[3]; - const float *co = SCULPT_vertex_co_get(gesture_data.ss, vd.vertex); - SCULPT_vertex_normal_get(gesture_data.ss, vd.vertex, vertex_normal); - - if (!gesture::is_affected(gesture_data, co, vertex_normal)) { - continue; - } - - float projected_pos[3]; - closest_to_plane_v3(projected_pos, gesture_data.line.plane, vd.co); - - float disp[3]; - sub_v3_v3v3(disp, projected_pos, vd.co); - const float mask = vd.mask; - mul_v3_fl(disp, 1.0f - mask); - if (is_zero_v3(disp)) { - continue; - } - add_v3_v3(vd.co, disp); - any_updated = true; - } - BKE_pbvh_vertex_iter_end; - - if (any_updated) { - BKE_pbvh_node_mark_update(node); - } -} - -static void sculpt_gesture_project_apply_for_symmetry_pass(bContext & /*C*/, - gesture::GestureData &gesture_data) -{ - switch (gesture_data.shape_type) { - case gesture::ShapeType::Line: - threading::parallel_for(gesture_data.nodes.index_range(), 1, [&](const IndexRange range) { - for (const int i : range) { - project_line_gesture_apply_task(gesture_data, gesture_data.nodes[i]); - } - }); - break; - case gesture::ShapeType::Lasso: - case gesture::ShapeType::Box: - /* Gesture shape projection not implemented yet. */ - BLI_assert(false); - break; - } -} - -static void sculpt_gesture_project_end(bContext &C, gesture::GestureData &gesture_data) -{ - SculptSession *ss = gesture_data.ss; - Sculpt *sd = CTX_data_tool_settings(&C)->sculpt; - if (ss->deform_modifiers_active || ss->shapekey_active) { - SCULPT_flush_stroke_deform(sd, gesture_data.vc.obact, true); - } - - SCULPT_flush_update_step(&C, SCULPT_UPDATE_COORDS); - SCULPT_flush_update_done(&C, gesture_data.vc.obact, SCULPT_UPDATE_COORDS); -} - -static void sculpt_gesture_init_project_properties(gesture::GestureData &gesture_data, - wmOperator & /*op*/) -{ - gesture_data.operation = reinterpret_cast( - MEM_cnew(__func__)); - - SculptGestureProjectOperation *project_operation = (SculptGestureProjectOperation *) - gesture_data.operation; - - project_operation->operation.begin = sculpt_gesture_project_begin; - project_operation->operation.apply_for_symmetry_pass = - sculpt_gesture_project_apply_for_symmetry_pass; - project_operation->operation.end = sculpt_gesture_project_end; -} - -static int project_line_gesture_invoke(bContext *C, wmOperator *op, const wmEvent *event) -{ - const View3D *v3d = CTX_wm_view3d(C); - const Base *base = CTX_data_active_base(C); - if (!BKE_base_is_visible(v3d, base)) { - return OPERATOR_CANCELLED; - } - - return WM_gesture_straightline_active_side_invoke(C, op, event); -} - -static int project_gesture_line_exec(bContext *C, wmOperator *op) -{ - std::unique_ptr gesture_data = gesture::init_from_line(C, op); - if (!gesture_data) { - return OPERATOR_CANCELLED; - } - sculpt_gesture_init_project_properties(*gesture_data, *op); - gesture::apply(*C, *gesture_data, *op); - return OPERATOR_FINISHED; -} - -void SCULPT_OT_project_line_gesture(wmOperatorType *ot) -{ - ot->name = "Project Line Gesture"; - ot->idname = "SCULPT_OT_project_line_gesture"; - ot->description = "Project the geometry onto a plane defined by a line"; - - ot->invoke = project_line_gesture_invoke; - ot->modal = WM_gesture_straightline_oneshot_modal; - ot->exec = project_gesture_line_exec; - - ot->poll = SCULPT_mode_poll_view3d; - - ot->flag = OPTYPE_REGISTER; - - WM_operator_properties_gesture_straightline(ot, WM_CURSOR_EDIT); - gesture::operator_properties(ot); -} - -} // namespace blender::ed::sculpt_paint::project diff --git a/source/blender/editors/sculpt_paint/sculpt_smooth.cc b/source/blender/editors/sculpt_paint/sculpt_smooth.cc index 9956c3c51e7..7844bec1796 100644 --- a/source/blender/editors/sculpt_paint/sculpt_smooth.cc +++ b/source/blender/editors/sculpt_paint/sculpt_smooth.cc @@ -13,6 +13,7 @@ #include "DNA_brush_types.h" +#include "BKE_context.hh" #include "BKE_paint.hh" #include "BKE_pbvh_api.hh" diff --git a/source/blender/editors/sculpt_paint/sculpt_transform.cc b/source/blender/editors/sculpt_paint/sculpt_transform.cc index c61eebcaf05..541577f85cf 100644 --- a/source/blender/editors/sculpt_paint/sculpt_transform.cc +++ b/source/blender/editors/sculpt_paint/sculpt_transform.cc @@ -20,6 +20,8 @@ #include "BKE_paint.hh" #include "BKE_pbvh_api.hh" +#include "DEG_depsgraph.hh" + #include "WM_api.hh" #include "WM_types.hh" diff --git a/source/blender/editors/sculpt_paint/sculpt_trim.cc b/source/blender/editors/sculpt_paint/sculpt_trim.cc deleted file mode 100644 index 3f5e3f75e80..00000000000 --- a/source/blender/editors/sculpt_paint/sculpt_trim.cc +++ /dev/null @@ -1,774 +0,0 @@ -/* SPDX-FileCopyrightText: 2024 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup edsculpt - */ -#include "DNA_mesh_types.h" - -#include "BLI_math_geom.h" -#include "BLI_math_matrix.h" -#include "BLI_math_vector.h" -#include "BLI_polyfill_2d.h" - -#include "BKE_brush.hh" -#include "BKE_context.hh" -#include "BKE_layer.hh" -#include "BKE_lib_id.hh" -#include "BKE_mesh.hh" - -#include "DNA_modifier_types.h" - -#include "DEG_depsgraph.hh" - -#include "ED_sculpt.hh" - -#include "RNA_access.hh" -#include "RNA_define.hh" - -#include "WM_api.hh" -#include "WM_types.hh" - -#include "bmesh.hh" -#include "tools/bmesh_boolean.hh" - -#include "paint_intern.hh" -#include "sculpt_intern.hh" - -namespace blender::ed::sculpt_paint::trim { -enum eSculptTrimOperationType { - SCULPT_GESTURE_TRIM_INTERSECT, - SCULPT_GESTURE_TRIM_DIFFERENCE, - SCULPT_GESTURE_TRIM_UNION, - SCULPT_GESTURE_TRIM_JOIN, -}; - -/* Intersect is not exposed in the UI because it does not work correctly with symmetry (it deletes - * the symmetrical part of the mesh in the first symmetry pass). */ -static EnumPropertyItem prop_trim_operation_types[] = { - {SCULPT_GESTURE_TRIM_DIFFERENCE, - "DIFFERENCE", - 0, - "Difference", - "Use a difference boolean operation"}, - {SCULPT_GESTURE_TRIM_UNION, "UNION", 0, "Union", "Use a union boolean operation"}, - {SCULPT_GESTURE_TRIM_JOIN, - "JOIN", - 0, - "Join", - "Join the new mesh as separate geometry, without performing any boolean operation"}, - {0, nullptr, 0, nullptr, nullptr}, -}; - -enum eSculptTrimOrientationType { - SCULPT_GESTURE_TRIM_ORIENTATION_VIEW, - SCULPT_GESTURE_TRIM_ORIENTATION_SURFACE, -}; -static EnumPropertyItem prop_trim_orientation_types[] = { - {SCULPT_GESTURE_TRIM_ORIENTATION_VIEW, - "VIEW", - 0, - "View", - "Use the view to orientate the trimming shape"}, - {SCULPT_GESTURE_TRIM_ORIENTATION_SURFACE, - "SURFACE", - 0, - "Surface", - "Use the surface normal to orientate the trimming shape"}, - {0, nullptr, 0, nullptr, nullptr}, -}; - -enum eSculptTrimExtrudeMode { - SCULPT_GESTURE_TRIM_EXTRUDE_PROJECT, - SCULPT_GESTURE_TRIM_EXTRUDE_FIXED -}; - -static EnumPropertyItem prop_trim_extrude_modes[] = { - {SCULPT_GESTURE_TRIM_EXTRUDE_PROJECT, - "PROJECT", - 0, - "Project", - "Project back faces when extruding"}, - {SCULPT_GESTURE_TRIM_EXTRUDE_FIXED, "FIXED", 0, "Fixed", "Extrude back faces by fixed amount"}, - {0, nullptr, 0, nullptr, nullptr}, -}; - -struct SculptGestureTrimOperation { - gesture::Operation op; - - Mesh *mesh; - float (*true_mesh_co)[3]; - - float depth_front; - float depth_back; - - bool use_cursor_depth; - - eSculptTrimOperationType mode; - eSculptTrimOrientationType orientation; - eSculptTrimExtrudeMode extrude_mode; -}; - -static void sculpt_gesture_trim_normals_update(gesture::GestureData &gesture_data) -{ - SculptGestureTrimOperation *trim_operation = (SculptGestureTrimOperation *) - gesture_data.operation; - Mesh *trim_mesh = trim_operation->mesh; - - const BMAllocTemplate allocsize = BMALLOC_TEMPLATE_FROM_ME(trim_mesh); - - BMeshCreateParams bm_create_params{}; - bm_create_params.use_toolflags = true; - BMesh *bm = BM_mesh_create(&allocsize, &bm_create_params); - - BMeshFromMeshParams bm_from_me_params{}; - bm_from_me_params.calc_face_normal = true; - bm_from_me_params.calc_vert_normal = true; - BM_mesh_bm_from_me(bm, trim_mesh, &bm_from_me_params); - - BM_mesh_elem_hflag_enable_all(bm, BM_FACE, BM_ELEM_TAG, false); - BMO_op_callf(bm, - (BMO_FLAG_DEFAULTS & ~BMO_FLAG_RESPECT_HIDE), - "recalc_face_normals faces=%hf", - BM_ELEM_TAG); - BM_mesh_elem_hflag_disable_all(bm, BM_VERT | BM_EDGE | BM_FACE, BM_ELEM_TAG, false); - - BMeshToMeshParams convert_params{}; - convert_params.calc_object_remap = false; - Mesh *result = BKE_mesh_from_bmesh_nomain(bm, &convert_params, trim_mesh); - - BM_mesh_free(bm); - BKE_id_free(nullptr, trim_mesh); - trim_operation->mesh = result; -} - -/* Get the origin and normal that are going to be used for calculating the depth and position the - * trimming geometry. */ -static void sculpt_gesture_trim_shape_origin_normal_get(gesture::GestureData &gesture_data, - float *r_origin, - float *r_normal) -{ - SculptGestureTrimOperation *trim_operation = (SculptGestureTrimOperation *) - gesture_data.operation; - /* Use the view origin and normal in world space. The trimming mesh coordinates are - * calculated in world space, aligned to the view, and then converted to object space to - * store them in the final trimming mesh which is going to be used in the boolean operation. - */ - switch (trim_operation->orientation) { - case SCULPT_GESTURE_TRIM_ORIENTATION_VIEW: - mul_v3_m4v3(r_origin, - gesture_data.vc.obact->object_to_world().ptr(), - gesture_data.ss->gesture_initial_location); - copy_v3_v3(r_normal, gesture_data.world_space_view_normal); - negate_v3(r_normal); - break; - case SCULPT_GESTURE_TRIM_ORIENTATION_SURFACE: - mul_v3_m4v3(r_origin, - gesture_data.vc.obact->object_to_world().ptr(), - gesture_data.ss->gesture_initial_location); - /* 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, gesture_data.ss->gesture_initial_normal); - mul_mat3_m4_v3(gesture_data.vc.obact->object_to_world().ptr(), r_normal); - break; - } -} - -static void sculpt_gesture_trim_calculate_depth(gesture::GestureData &gesture_data) -{ - SculptGestureTrimOperation *trim_operation = (SculptGestureTrimOperation *) - gesture_data.operation; - - SculptSession *ss = gesture_data.ss; - ViewContext *vc = &gesture_data.vc; - - const int totvert = SCULPT_vertex_count_get(ss); - - float shape_plane[4]; - float shape_origin[3]; - float shape_normal[3]; - sculpt_gesture_trim_shape_origin_normal_get(gesture_data, shape_origin, shape_normal); - plane_from_point_normal_v3(shape_plane, shape_origin, shape_normal); - - trim_operation->depth_front = FLT_MAX; - trim_operation->depth_back = -FLT_MAX; - - for (int i = 0; i < totvert; i++) { - PBVHVertRef vertex = BKE_pbvh_index_to_vertex(ss->pbvh, i); - - const float *vco = SCULPT_vertex_co_get(ss, vertex); - /* Convert the coordinates to world space to calculate the depth. When generating the trimming - * mesh, coordinates are first calculated in world space, then converted to object space to - * store them. */ - float world_space_vco[3]; - mul_v3_m4v3(world_space_vco, vc->obact->object_to_world().ptr(), vco); - const float dist = dist_signed_to_plane_v3(world_space_vco, shape_plane); - trim_operation->depth_front = min_ff(dist, trim_operation->depth_front); - trim_operation->depth_back = max_ff(dist, trim_operation->depth_back); - } - - if (trim_operation->use_cursor_depth) { - float world_space_gesture_initial_location[3]; - mul_v3_m4v3(world_space_gesture_initial_location, - vc->obact->object_to_world().ptr(), - ss->gesture_initial_location); - - float mid_point_depth; - if (trim_operation->orientation == SCULPT_GESTURE_TRIM_ORIENTATION_VIEW) { - mid_point_depth = ss->gesture_initial_hit ? - dist_signed_to_plane_v3(world_space_gesture_initial_location, - shape_plane) : - (trim_operation->depth_back + trim_operation->depth_front) * 0.5f; - } - else { - /* When using normal orientation, if the stroke started over the mesh, position the mid point - * at 0 distance from the shape plane. This positions the trimming shape half inside of the - * surface. */ - mid_point_depth = ss->gesture_initial_hit ? - 0.0f : - (trim_operation->depth_back + trim_operation->depth_front) * 0.5f; - } - - float depth_radius; - - if (ss->gesture_initial_hit) { - depth_radius = ss->cursor_radius; - } - else { - /* ss->cursor_radius is only valid if the stroke started - * over the sculpt mesh. If it's not we must - * compute the radius ourselves. See #81452. - */ - - Sculpt *sd = CTX_data_tool_settings(vc->C)->sculpt; - Brush *brush = BKE_paint_brush(&sd->paint); - Scene *scene = CTX_data_scene(vc->C); - - if (!BKE_brush_use_locked_size(scene, brush)) { - depth_radius = paint_calc_object_space_radius( - vc, ss->gesture_initial_location, BKE_brush_size_get(scene, brush)); - } - else { - depth_radius = BKE_brush_unprojected_radius_get(scene, brush); - } - } - - trim_operation->depth_front = mid_point_depth - depth_radius; - trim_operation->depth_back = mid_point_depth + depth_radius; - } -} - -static void sculpt_gesture_trim_geometry_generate(gesture::GestureData &gesture_data) -{ - SculptGestureTrimOperation *trim_operation = (SculptGestureTrimOperation *) - gesture_data.operation; - ViewContext *vc = &gesture_data.vc; - ARegion *region = vc->region; - - const Span screen_points = gesture_data.gesture_points; - BLI_assert(screen_points.size() > 1); - - const int trim_totverts = screen_points.size() * 2; - const int trim_faces_nums = (2 * (screen_points.size() - 2)) + (2 * screen_points.size()); - trim_operation->mesh = BKE_mesh_new_nomain( - trim_totverts, 0, trim_faces_nums, trim_faces_nums * 3); - trim_operation->true_mesh_co = static_cast( - MEM_malloc_arrayN(trim_totverts, sizeof(float[3]), "mesh orco")); - - float depth_front = trim_operation->depth_front; - float depth_back = trim_operation->depth_back; - float pad_factor = 0.0f; - - if (!trim_operation->use_cursor_depth) { - pad_factor = (depth_back - depth_front) * 0.01f + 0.001f; - - /* When using cursor depth, don't modify the depth set by the cursor radius. If full depth is - * used, adding a little padding to the trimming shape can help avoiding booleans with coplanar - * faces. */ - depth_front -= pad_factor; - depth_back += pad_factor; - } - - float shape_origin[3]; - float shape_normal[3]; - float shape_plane[4]; - sculpt_gesture_trim_shape_origin_normal_get(gesture_data, shape_origin, shape_normal); - plane_from_point_normal_v3(shape_plane, shape_origin, shape_normal); - - const float(*ob_imat)[4] = vc->obact->world_to_object().ptr(); - - /* Write vertices coordinatesSCULPT_GESTURE_TRIM_DIFFERENCE for the front face. */ - MutableSpan positions = trim_operation->mesh->vert_positions_for_write(); - - float depth_point[3]; - - /* Get origin point for SCULPT_GESTURE_TRIM_ORIENTATION_VIEW. - * Note: for projection extrusion we add depth_front here - * instead of in the loop. - */ - if (trim_operation->extrude_mode == SCULPT_GESTURE_TRIM_EXTRUDE_FIXED) { - copy_v3_v3(depth_point, shape_origin); - } - else { - madd_v3_v3v3fl(depth_point, shape_origin, shape_normal, depth_front); - } - - for (const int i : screen_points.index_range()) { - float new_point[3]; - if (trim_operation->orientation == SCULPT_GESTURE_TRIM_ORIENTATION_VIEW) { - ED_view3d_win_to_3d(vc->v3d, region, depth_point, screen_points[i], new_point); - - /* For fixed mode we add the shape normal here to avoid projection errors. */ - if (trim_operation->extrude_mode == SCULPT_GESTURE_TRIM_EXTRUDE_FIXED) { - madd_v3_v3fl(new_point, shape_normal, depth_front); - } - } - else { - ED_view3d_win_to_3d_on_plane(region, shape_plane, screen_points[i], false, new_point); - madd_v3_v3fl(new_point, shape_normal, depth_front); - } - - copy_v3_v3(positions[i], new_point); - } - - /* Write vertices coordinates for the back face. */ - madd_v3_v3v3fl(depth_point, shape_origin, shape_normal, depth_back); - for (const int i : screen_points.index_range()) { - float new_point[3]; - - if (trim_operation->extrude_mode == SCULPT_GESTURE_TRIM_EXTRUDE_PROJECT) { - if (trim_operation->orientation == SCULPT_GESTURE_TRIM_ORIENTATION_VIEW) { - ED_view3d_win_to_3d(vc->v3d, region, depth_point, screen_points[i], new_point); - } - else { - ED_view3d_win_to_3d_on_plane(region, shape_plane, screen_points[i], false, new_point); - madd_v3_v3fl(new_point, shape_normal, depth_back); - } - } - else { - copy_v3_v3(new_point, positions[i]); - float dist = dist_signed_to_plane_v3(new_point, shape_plane); - - madd_v3_v3fl(new_point, shape_normal, depth_back - dist); - } - - copy_v3_v3(positions[i + screen_points.size()], new_point); - } - - /* Project to object space. */ - for (int i = 0; i < screen_points.size() * 2; i++) { - float new_point[3]; - - copy_v3_v3(new_point, positions[i]); - mul_v3_m4v3(positions[i], ob_imat, new_point); - mul_v3_m4v3(trim_operation->true_mesh_co[i], ob_imat, new_point); - } - - /* Get the triangulation for the front/back poly. */ - const int face_tris_num = bke::mesh::face_triangles_num(screen_points.size()); - Array tris(face_tris_num); - BLI_polyfill_calc(reinterpret_cast(screen_points.data()), - screen_points.size(), - 0, - reinterpret_cast(tris.data())); - - /* Write the front face triangle indices. */ - MutableSpan face_offsets = trim_operation->mesh->face_offsets_for_write(); - MutableSpan corner_verts = trim_operation->mesh->corner_verts_for_write(); - int face_index = 0; - int loop_index = 0; - for (const int i : tris.index_range()) { - face_offsets[face_index] = loop_index; - corner_verts[loop_index + 0] = tris[i][0]; - corner_verts[loop_index + 1] = tris[i][1]; - corner_verts[loop_index + 2] = tris[i][2]; - face_index++; - loop_index += 3; - } - - /* Write the back face triangle indices. */ - for (const int i : tris.index_range()) { - face_offsets[face_index] = loop_index; - corner_verts[loop_index + 0] = tris[i][0] + screen_points.size(); - corner_verts[loop_index + 1] = tris[i][1] + screen_points.size(); - corner_verts[loop_index + 2] = tris[i][2] + screen_points.size(); - face_index++; - loop_index += 3; - } - - /* Write the indices for the lateral triangles. */ - for (const int i : screen_points.index_range()) { - face_offsets[face_index] = loop_index; - int current_index = i; - int next_index = current_index + 1; - if (next_index >= screen_points.size()) { - next_index = 0; - } - corner_verts[loop_index + 0] = next_index + screen_points.size(); - corner_verts[loop_index + 1] = next_index; - corner_verts[loop_index + 2] = current_index; - face_index++; - loop_index += 3; - } - - for (const int i : screen_points.index_range()) { - face_offsets[face_index] = loop_index; - int current_index = i; - int next_index = current_index + 1; - if (next_index >= screen_points.size()) { - next_index = 0; - } - corner_verts[loop_index + 0] = current_index; - corner_verts[loop_index + 1] = current_index + screen_points.size(); - corner_verts[loop_index + 2] = next_index + screen_points.size(); - face_index++; - loop_index += 3; - } - - bke::mesh_smooth_set(*trim_operation->mesh, false); - bke::mesh_calc_edges(*trim_operation->mesh, false, false); - sculpt_gesture_trim_normals_update(gesture_data); -} - -static void sculpt_gesture_trim_geometry_free(gesture::GestureData &gesture_data) -{ - SculptGestureTrimOperation *trim_operation = (SculptGestureTrimOperation *) - gesture_data.operation; - BKE_id_free(nullptr, trim_operation->mesh); - MEM_freeN(trim_operation->true_mesh_co); -} - -static int bm_face_isect_pair(BMFace *f, void * /*user_data*/) -{ - return BM_elem_flag_test(f, BM_ELEM_DRAW) ? 1 : 0; -} - -static void sculpt_gesture_apply_trim(gesture::GestureData &gesture_data) -{ - SculptGestureTrimOperation *trim_operation = (SculptGestureTrimOperation *) - gesture_data.operation; - Mesh *sculpt_mesh = BKE_mesh_from_object(gesture_data.vc.obact); - Mesh *trim_mesh = trim_operation->mesh; - - const BMAllocTemplate allocsize = BMALLOC_TEMPLATE_FROM_ME(sculpt_mesh, trim_mesh); - - BMeshCreateParams bm_create_params{}; - bm_create_params.use_toolflags = false; - BMesh *bm = BM_mesh_create(&allocsize, &bm_create_params); - - BMeshFromMeshParams bm_from_me_params{}; - bm_from_me_params.calc_face_normal = true; - bm_from_me_params.calc_vert_normal = true; - BM_mesh_bm_from_me(bm, trim_mesh, &bm_from_me_params); - BM_mesh_bm_from_me(bm, sculpt_mesh, &bm_from_me_params); - - const int corner_tris_tot = poly_to_tri_count(bm->totface, bm->totloop); - BMLoop *(*corner_tris)[3] = static_cast( - MEM_malloc_arrayN(corner_tris_tot, sizeof(*corner_tris), __func__)); - BM_mesh_calc_tessellation_beauty(bm, corner_tris); - - BMIter iter; - int i; - const int i_faces_end = trim_mesh->faces_num; - - /* We need face normals because of 'BM_face_split_edgenet' - * we could calculate on the fly too (before calling split). */ - - const short ob_src_totcol = trim_mesh->totcol; - Array material_remap(ob_src_totcol ? ob_src_totcol : 1); - - BMFace *efa; - i = 0; - BM_ITER_MESH (efa, &iter, bm, BM_FACES_OF_MESH) { - normalize_v3(efa->no); - - /* Temp tag to test which side split faces are from. */ - BM_elem_flag_enable(efa, BM_ELEM_DRAW); - - /* Remap material. */ - if (efa->mat_nr < ob_src_totcol) { - efa->mat_nr = material_remap[efa->mat_nr]; - } - - if (++i == i_faces_end) { - break; - } - } - - /* Join does not do a boolean operation, it just adds the geometry. */ - if (trim_operation->mode != SCULPT_GESTURE_TRIM_JOIN) { - int boolean_mode = 0; - switch (trim_operation->mode) { - case SCULPT_GESTURE_TRIM_INTERSECT: - boolean_mode = eBooleanModifierOp_Intersect; - break; - case SCULPT_GESTURE_TRIM_DIFFERENCE: - boolean_mode = eBooleanModifierOp_Difference; - break; - case SCULPT_GESTURE_TRIM_UNION: - boolean_mode = eBooleanModifierOp_Union; - break; - case SCULPT_GESTURE_TRIM_JOIN: - BLI_assert(false); - break; - } - BM_mesh_boolean(bm, - corner_tris, - corner_tris_tot, - bm_face_isect_pair, - nullptr, - 2, - true, - true, - false, - boolean_mode); - } - - MEM_freeN(corner_tris); - - BMeshToMeshParams convert_params{}; - convert_params.calc_object_remap = false; - Mesh *result = BKE_mesh_from_bmesh_nomain(bm, &convert_params, sculpt_mesh); - - BM_mesh_free(bm); - BKE_mesh_nomain_to_mesh( - result, static_cast(gesture_data.vc.obact->data), gesture_data.vc.obact); -} - -static void sculpt_gesture_trim_begin(bContext &C, gesture::GestureData &gesture_data) -{ - Object *object = gesture_data.vc.obact; - SculptSession *ss = object->sculpt; - - Depsgraph *depsgraph = CTX_data_ensure_evaluated_depsgraph(&C); - sculpt_gesture_trim_calculate_depth(gesture_data); - sculpt_gesture_trim_geometry_generate(gesture_data); - SCULPT_topology_islands_invalidate(ss); - BKE_sculpt_update_object_for_edit(depsgraph, gesture_data.vc.obact, false); - undo::push_node(gesture_data.vc.obact, nullptr, undo::Type::Geometry); -} - -static void sculpt_gesture_trim_apply_for_symmetry_pass(bContext & /*C*/, - gesture::GestureData &gesture_data) -{ - SculptGestureTrimOperation *trim_operation = (SculptGestureTrimOperation *) - gesture_data.operation; - Mesh *trim_mesh = trim_operation->mesh; - MutableSpan positions = trim_mesh->vert_positions_for_write(); - for (int i = 0; i < trim_mesh->verts_num; i++) { - flip_v3_v3(positions[i], trim_operation->true_mesh_co[i], gesture_data.symmpass); - } - sculpt_gesture_trim_normals_update(gesture_data); - sculpt_gesture_apply_trim(gesture_data); -} - -static void sculpt_gesture_trim_end(bContext & /*C*/, gesture::GestureData &gesture_data) -{ - Object *object = gesture_data.vc.obact; - Mesh *mesh = (Mesh *)object->data; - const bke::AttributeAccessor attributes = mesh->attributes_for_write(); - if (attributes.contains(".sculpt_face_set")) { - /* Assign a new Face Set ID to the new faces created by the trim operation. */ - const int next_face_set_id = face_set::find_next_available_id(*object); - face_set::initialize_none_to_id(mesh, next_face_set_id); - } - - sculpt_gesture_trim_geometry_free(gesture_data); - - undo::push_node(gesture_data.vc.obact, nullptr, undo::Type::Geometry); - BKE_mesh_batch_cache_dirty_tag(mesh, BKE_MESH_BATCH_DIRTY_ALL); - DEG_id_tag_update(&gesture_data.vc.obact->id, ID_RECALC_GEOMETRY); -} - -static void sculpt_gesture_init_trim_properties(gesture::GestureData &gesture_data, wmOperator &op) -{ - gesture_data.operation = reinterpret_cast( - MEM_cnew(__func__)); - - SculptGestureTrimOperation *trim_operation = (SculptGestureTrimOperation *) - gesture_data.operation; - - trim_operation->op.begin = sculpt_gesture_trim_begin; - trim_operation->op.apply_for_symmetry_pass = sculpt_gesture_trim_apply_for_symmetry_pass; - trim_operation->op.end = sculpt_gesture_trim_end; - - trim_operation->mode = eSculptTrimOperationType(RNA_enum_get(op.ptr, "trim_mode")); - trim_operation->use_cursor_depth = RNA_boolean_get(op.ptr, "use_cursor_depth"); - trim_operation->orientation = eSculptTrimOrientationType( - RNA_enum_get(op.ptr, "trim_orientation")); - trim_operation->extrude_mode = eSculptTrimExtrudeMode(RNA_enum_get(op.ptr, "trim_extrude_mode")); - - /* If the cursor was not over the mesh, force the orientation to view. */ - if (!gesture_data.ss->gesture_initial_hit) { - trim_operation->orientation = SCULPT_GESTURE_TRIM_ORIENTATION_VIEW; - } -} - -static void sculpt_trim_gesture_operator_properties(wmOperatorType *ot) -{ - RNA_def_enum(ot->srna, - "trim_mode", - prop_trim_operation_types, - SCULPT_GESTURE_TRIM_DIFFERENCE, - "Trim Mode", - nullptr); - RNA_def_boolean( - ot->srna, - "use_cursor_depth", - false, - "Use Cursor for Depth", - "Use cursor location and radius for the dimensions and position of the trimming shape"); - RNA_def_enum(ot->srna, - "trim_orientation", - prop_trim_orientation_types, - SCULPT_GESTURE_TRIM_ORIENTATION_VIEW, - "Shape Orientation", - nullptr); - RNA_def_enum(ot->srna, - "trim_extrude_mode", - prop_trim_extrude_modes, - SCULPT_GESTURE_TRIM_EXTRUDE_FIXED, - "Extrude Mode", - nullptr); -} - -static int sculpt_trim_gesture_box_exec(bContext *C, wmOperator *op) -{ - Object *object = CTX_data_active_object(C); - SculptSession *ss = object->sculpt; - if (BKE_pbvh_type(ss->pbvh) != PBVH_FACES) { - /* Not supported in Multires and Dyntopo. */ - return OPERATOR_CANCELLED; - } - - if (ss->totvert == 0) { - /* No geometry to trim or to detect a valid position for the trimming shape. */ - return OPERATOR_CANCELLED; - } - - std::unique_ptr gesture_data = gesture::init_from_box(C, op); - if (!gesture_data) { - return OPERATOR_CANCELLED; - } - - sculpt_gesture_init_trim_properties(*gesture_data, *op); - gesture::apply(*C, *gesture_data, *op); - return OPERATOR_FINISHED; -} - -static int sculpt_trim_gesture_box_invoke(bContext *C, wmOperator *op, const wmEvent *event) -{ - Object *ob = CTX_data_active_object(C); - SculptSession *ss = ob->sculpt; - - const View3D *v3d = CTX_wm_view3d(C); - const Base *base = CTX_data_active_base(C); - if (!BKE_base_is_visible(v3d, base)) { - return OPERATOR_CANCELLED; - } - - SculptCursorGeometryInfo sgi; - const float mval_fl[2] = {float(event->mval[0]), float(event->mval[1])}; - SCULPT_vertex_random_access_ensure(ss); - ss->gesture_initial_hit = SCULPT_cursor_geometry_info_update(C, &sgi, mval_fl, false); - if (ss->gesture_initial_hit) { - copy_v3_v3(ss->gesture_initial_location, sgi.location); - copy_v3_v3(ss->gesture_initial_normal, sgi.normal); - } - - return WM_gesture_box_invoke(C, op, event); -} - -static int sculpt_trim_gesture_lasso_exec(bContext *C, wmOperator *op) -{ - Depsgraph *depsgraph = CTX_data_ensure_evaluated_depsgraph(C); - Object *object = CTX_data_active_object(C); - - BKE_sculpt_update_object_for_edit(depsgraph, object, false); - - SculptSession *ss = object->sculpt; - if (BKE_pbvh_type(ss->pbvh) != PBVH_FACES) { - /* Not supported in Multires and Dyntopo. */ - return OPERATOR_CANCELLED; - } - - if (ss->totvert == 0) { - /* No geometry to trim or to detect a valid position for the trimming shape. */ - return OPERATOR_CANCELLED; - } - - std::unique_ptr gesture_data = gesture::init_from_lasso(C, op); - if (!gesture_data) { - return OPERATOR_CANCELLED; - } - sculpt_gesture_init_trim_properties(*gesture_data, *op); - gesture::apply(*C, *gesture_data, *op); - return OPERATOR_FINISHED; -} - -static int sculpt_trim_gesture_lasso_invoke(bContext *C, wmOperator *op, const wmEvent *event) -{ - Object *ob = CTX_data_active_object(C); - SculptSession *ss = ob->sculpt; - - const View3D *v3d = CTX_wm_view3d(C); - const Base *base = CTX_data_active_base(C); - if (!BKE_base_is_visible(v3d, base)) { - return OPERATOR_CANCELLED; - } - - SculptCursorGeometryInfo sgi; - const float mval_fl[2] = {float(event->mval[0]), float(event->mval[1])}; - SCULPT_vertex_random_access_ensure(ss); - ss->gesture_initial_hit = SCULPT_cursor_geometry_info_update(C, &sgi, mval_fl, false); - if (ss->gesture_initial_hit) { - copy_v3_v3(ss->gesture_initial_location, sgi.location); - copy_v3_v3(ss->gesture_initial_normal, sgi.normal); - } - - return WM_gesture_lasso_invoke(C, op, event); -} - -void SCULPT_OT_trim_lasso_gesture(wmOperatorType *ot) -{ - ot->name = "Trim Lasso Gesture"; - ot->idname = "SCULPT_OT_trim_lasso_gesture"; - ot->description = "Trims the mesh within the lasso as you move the brush"; - - ot->invoke = sculpt_trim_gesture_lasso_invoke; - ot->modal = WM_gesture_lasso_modal; - ot->exec = sculpt_trim_gesture_lasso_exec; - - ot->poll = SCULPT_mode_poll_view3d; - - ot->flag = OPTYPE_REGISTER | OPTYPE_DEPENDS_ON_CURSOR; - - /* Properties. */ - WM_operator_properties_gesture_lasso(ot); - gesture::operator_properties(ot); - - sculpt_trim_gesture_operator_properties(ot); -} - -void SCULPT_OT_trim_box_gesture(wmOperatorType *ot) -{ - ot->name = "Trim Box Gesture"; - ot->idname = "SCULPT_OT_trim_box_gesture"; - ot->description = "Trims the mesh within the box as you move the brush"; - - ot->invoke = sculpt_trim_gesture_box_invoke; - ot->modal = WM_gesture_box_modal; - ot->exec = sculpt_trim_gesture_box_exec; - - ot->poll = SCULPT_mode_poll_view3d; - - ot->flag = OPTYPE_REGISTER; - - /* Properties. */ - WM_operator_properties_border(ot); - gesture::operator_properties(ot); - - sculpt_trim_gesture_operator_properties(ot); -} -} // namespace blender::ed::sculpt_paint::trim diff --git a/source/blender/editors/sculpt_paint/sculpt_undo.cc b/source/blender/editors/sculpt_paint/sculpt_undo.cc index d6c097724a9..172b697cba9 100644 --- a/source/blender/editors/sculpt_paint/sculpt_undo.cc +++ b/source/blender/editors/sculpt_paint/sculpt_undo.cc @@ -49,7 +49,7 @@ #include "BKE_ccg.h" #include "BKE_context.hh" #include "BKE_customdata.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_key.hh" #include "BKE_layer.hh" #include "BKE_main.hh" @@ -57,7 +57,7 @@ #include "BKE_multires.hh" #include "BKE_object.hh" #include "BKE_paint.hh" -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "BKE_subdiv_ccg.hh" #include "BKE_subsurf.hh" #include "BKE_undo_system.hh" @@ -1206,19 +1206,14 @@ static Node *alloc_node(Object *ob, PBVHNode *node, Type type) const bool need_faces = ELEM(type, Type::FaceSet, Type::HideFace); if (need_loops) { - unode->corner_indices = BKE_pbvh_node_get_corner_indices(node); + unode->corner_indices = BKE_pbvh_node_get_loops(node); unode->mesh_corners_num = static_cast(ob->data)->corners_num; usculpt->undo_size += unode->corner_indices.as_span().size_in_bytes(); } if (need_faces) { - if (BKE_pbvh_type(ss->pbvh) == PBVH_FACES) { - bke::pbvh::node_face_indices_calc_mesh(*ss->pbvh, *node, unode->face_indices); - } - else { - bke::pbvh::node_face_indices_calc_grids(*ss->pbvh, *node, unode->face_indices); - } + unode->face_indices = BKE_pbvh_node_calc_face_indices(*ss->pbvh, *node); usculpt->undo_size += unode->face_indices.as_span().size_in_bytes(); } diff --git a/source/blender/editors/sound/sound_ops.cc b/source/blender/editors/sound/sound_ops.cc index d67bf355bb0..8d4cba9e658 100644 --- a/source/blender/editors/sound/sound_ops.cc +++ b/source/blender/editors/sound/sound_ops.cc @@ -23,13 +23,13 @@ #include "DNA_userdef_types.h" #include "BKE_context.hh" -#include "BKE_fcurve.hh" -#include "BKE_global.hh" +#include "BKE_fcurve.h" +#include "BKE_global.h" #include "BKE_lib_id.hh" #include "BKE_main.hh" #include "BKE_packedFile.h" -#include "BKE_report.hh" -#include "BKE_scene.hh" +#include "BKE_report.h" +#include "BKE_scene.h" #include "BKE_sound.h" #include "RNA_access.hh" @@ -38,6 +38,7 @@ #include "RNA_prototypes.h" #include "SEQ_iterator.hh" +#include "SEQ_utils.hh" #include "UI_interface.hh" @@ -370,7 +371,6 @@ static int sound_mixdown_exec(bContext *C, wmOperator *op) container, codec, bitrate, - AUD_RESAMPLE_QUALITY_MEDIUM, nullptr, nullptr, error_message, @@ -386,7 +386,6 @@ static int sound_mixdown_exec(bContext *C, wmOperator *op) container, codec, bitrate, - AUD_RESAMPLE_QUALITY_MEDIUM, nullptr, nullptr, error_message, diff --git a/source/blender/editors/space_action/action_data.cc b/source/blender/editors/space_action/action_data.cc index ffa7db5e4df..6464b6967d4 100644 --- a/source/blender/editors/space_action/action_data.cc +++ b/source/blender/editors/space_action/action_data.cc @@ -13,26 +13,37 @@ #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_anim_types.h" +#include "DNA_gpencil_legacy_types.h" #include "DNA_key_types.h" +#include "DNA_mask_types.h" #include "DNA_object_types.h" #include "DNA_scene_types.h" #include "RNA_access.hh" #include "RNA_define.hh" +#include "RNA_enum_types.hh" #include "RNA_prototypes.h" #include "BKE_action.h" #include "BKE_context.hh" +#include "BKE_fcurve.h" #include "BKE_key.hh" #include "BKE_lib_id.hh" #include "BKE_nla.h" -#include "BKE_report.hh" -#include "BKE_scene.hh" +#include "BKE_report.h" +#include "BKE_scene.h" + +#include "UI_view2d.hh" #include "ED_anim_api.hh" +#include "ED_gpencil_legacy.hh" +#include "ED_keyframes_edit.hh" +#include "ED_keyframing.hh" +#include "ED_markers.hh" +#include "ED_mask.hh" #include "ED_screen.hh" #include "DEG_depsgraph.hh" diff --git a/source/blender/editors/space_action/action_draw.cc b/source/blender/editors/space_action/action_draw.cc index e88deb4fafc..a65592a7692 100644 --- a/source/blender/editors/space_action/action_draw.cc +++ b/source/blender/editors/space_action/action_draw.cc @@ -13,18 +13,25 @@ #include #include +#include "BLI_blenlib.h" #include "BLI_math_color.h" #include "BLI_utildefines.h" /* Types --------------------------------------------------------------- */ +#include "DNA_anim_types.h" +#include "DNA_cachefile_types.h" +#include "DNA_gpencil_legacy_types.h" #include "DNA_modifier_types.h" #include "DNA_node_types.h" #include "DNA_object_types.h" #include "DNA_scene_types.h" #include "DNA_screen_types.h" +#include "BKE_action.h" #include "BKE_bake_geometry_nodes_modifier.hh" +#include "BKE_context.hh" +#include "BKE_node_runtime.hh" #include "BKE_pointcache.h" /* Everything from source (BIF, BDR, BSE) ------------------------------ */ diff --git a/source/blender/editors/space_action/action_edit.cc b/source/blender/editors/space_action/action_edit.cc index aba89f7d059..f5f1d76b160 100644 --- a/source/blender/editors/space_action/action_edit.cc +++ b/source/blender/editors/space_action/action_edit.cc @@ -15,29 +15,32 @@ #include "BLI_map.hh" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DEG_depsgraph.hh" #include "DNA_anim_types.h" #include "DNA_gpencil_legacy_types.h" +#include "DNA_key_types.h" #include "DNA_mask_types.h" +#include "DNA_object_types.h" #include "DNA_scene_types.h" #include "RNA_access.hh" #include "RNA_define.hh" #include "RNA_enum_types.hh" +#include "BKE_action.h" #include "BKE_animsys.h" #include "BKE_context.hh" -#include "BKE_fcurve.hh" -#include "BKE_global.hh" +#include "BKE_fcurve.h" +#include "BKE_global.h" #include "BKE_gpencil_legacy.h" #include "BKE_grease_pencil.hh" +#include "BKE_key.hh" #include "BKE_nla.h" -#include "BKE_report.hh" +#include "BKE_report.h" -#include "UI_interface_icons.hh" #include "UI_view2d.hh" #include "ANIM_animdata.hh" @@ -55,6 +58,8 @@ #include "WM_api.hh" #include "WM_types.hh" +#include "UI_interface.hh" + #include "action_intern.hh" /* -------------------------------------------------------------------- */ @@ -1148,20 +1153,6 @@ static int actkeys_delete_exec(bContext *C, wmOperator * /*op*/) return OPERATOR_FINISHED; } -static int actkeys_delete_invoke(bContext *C, wmOperator *op, const wmEvent * /*event*/) -{ - if (RNA_boolean_get(op->ptr, "confirm")) { - return WM_operator_confirm_ex(C, - op, - IFACE_("Delete selected keyframes?"), - nullptr, - IFACE_("Delete"), - ALERT_ICON_NONE, - false); - } - return actkeys_delete_exec(C, op); -} - void ACTION_OT_delete(wmOperatorType *ot) { /* identifiers */ @@ -1170,7 +1161,7 @@ void ACTION_OT_delete(wmOperatorType *ot) ot->description = "Remove all selected keyframes"; /* api callbacks */ - ot->invoke = actkeys_delete_invoke; + ot->invoke = WM_operator_confirm_or_exec; ot->exec = actkeys_delete_exec; ot->poll = ED_operator_action_active; diff --git a/source/blender/editors/space_action/action_select.cc b/source/blender/editors/space_action/action_select.cc index 0624da7b9a5..7770dedf39b 100644 --- a/source/blender/editors/space_action/action_select.cc +++ b/source/blender/editors/space_action/action_select.cc @@ -15,7 +15,7 @@ #include "BLI_blenlib.h" #include "BLI_dlrbTree.h" -#include "BLI_lasso_2d.hh" +#include "BLI_lasso_2d.h" #include "BLI_utildefines.h" #include "DNA_anim_types.h" @@ -28,7 +28,7 @@ #include "RNA_define.hh" #include "BKE_context.hh" -#include "BKE_fcurve.hh" +#include "BKE_fcurve.h" #include "BKE_gpencil_legacy.h" #include "BKE_grease_pencil.hh" #include "BKE_nla.h" @@ -902,8 +902,8 @@ static int actkeys_lassoselect_exec(bContext *C, wmOperator *op) } data_lasso.rectf_view = &rect_fl; - data_lasso.mcoords = WM_gesture_lasso_path_to_array(C, op); - if (data_lasso.mcoords.is_empty()) { + data_lasso.mcoords = WM_gesture_lasso_path_to_array(C, op, &data_lasso.mcoords_len); + if (data_lasso.mcoords == nullptr) { return OPERATOR_CANCELLED; } @@ -914,12 +914,14 @@ static int actkeys_lassoselect_exec(bContext *C, wmOperator *op) } /* get settings from operator */ - BLI_lasso_boundbox(&rect, data_lasso.mcoords); + BLI_lasso_boundbox(&rect, data_lasso.mcoords, data_lasso.mcoords_len); BLI_rctf_rcti_copy(&rect_fl, &rect); /* apply box_select action */ region_select_action_keys(&ac, &rect_fl, BEZT_OK_CHANNEL_LASSO, selectmode, &data_lasso); + MEM_freeN((void *)data_lasso.mcoords); + /* send notifier that keyframe selection has changed */ WM_event_add_notifier(C, NC_ANIMATION | ND_KEYFRAME | NA_SELECTED, nullptr); if (ANIM_animdata_can_have_greasepencil(eAnimCont_Types(ac.datatype))) { diff --git a/source/blender/editors/space_action/space_action.cc b/source/blender/editors/space_action/space_action.cc index 71ef995658a..8df31fcd1cd 100644 --- a/source/blender/editors/space_action/space_action.cc +++ b/source/blender/editors/space_action/space_action.cc @@ -10,7 +10,9 @@ #include #include "DNA_action_types.h" +#include "DNA_anim_types.h" #include "DNA_collection_types.h" +#include "DNA_object_types.h" #include "DNA_scene_types.h" #include "MEM_guardedalloc.h" @@ -21,6 +23,7 @@ #include "BKE_context.hh" #include "BKE_lib_query.hh" #include "BKE_lib_remap.hh" +#include "BKE_nla.h" #include "BKE_screen.hh" #include "RNA_access.hh" @@ -802,15 +805,13 @@ static void action_refresh(const bContext *C, ScrArea *area) /* XXX re-sizing y-extents of tot should go here? */ } -static void action_id_remap(ScrArea * /*area*/, - SpaceLink *slink, - const blender::bke::id::IDRemapper &mappings) +static void action_id_remap(ScrArea * /*area*/, SpaceLink *slink, const IDRemapper *mappings) { SpaceAction *sact = (SpaceAction *)slink; - mappings.apply(reinterpret_cast(&sact->action), ID_REMAP_APPLY_DEFAULT); - mappings.apply(reinterpret_cast(&sact->ads.filter_grp), ID_REMAP_APPLY_DEFAULT); - mappings.apply(&sact->ads.source, ID_REMAP_APPLY_DEFAULT); + BKE_id_remapper_apply(mappings, (ID **)&sact->action, ID_REMAP_APPLY_DEFAULT); + BKE_id_remapper_apply(mappings, (ID **)&sact->ads.filter_grp, ID_REMAP_APPLY_DEFAULT); + BKE_id_remapper_apply(mappings, &sact->ads.source, ID_REMAP_APPLY_DEFAULT); } static void action_foreach_id(SpaceLink *space_link, LibraryForeachIDData *data) diff --git a/source/blender/editors/space_api/spacetypes.cc b/source/blender/editors/space_api/spacetypes.cc index 5b8994b8c21..853aba26f6e 100644 --- a/source/blender/editors/space_api/spacetypes.cc +++ b/source/blender/editors/space_api/spacetypes.cc @@ -10,6 +10,7 @@ #include "MEM_guardedalloc.h" +#include "BLI_blenlib.h" #include "BLI_utildefines.h" #include "DNA_scene_types.h" diff --git a/source/blender/editors/space_buttons/buttons_context.cc b/source/blender/editors/space_buttons/buttons_context.cc index 741d09b26eb..afb4ca39136 100644 --- a/source/blender/editors/space_buttons/buttons_context.cc +++ b/source/blender/editors/space_buttons/buttons_context.cc @@ -15,9 +15,10 @@ #include "BLI_string.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_armature_types.h" +#include "DNA_brush_types.h" #include "DNA_collection_types.h" #include "DNA_linestyle_types.h" #include "DNA_material_types.h" @@ -27,6 +28,7 @@ #include "DNA_world_types.h" #include "BKE_action.h" +#include "BKE_armature.hh" #include "BKE_context.hh" #include "BKE_layer.hh" #include "BKE_linestyle.h" diff --git a/source/blender/editors/space_buttons/buttons_ops.cc b/source/blender/editors/space_buttons/buttons_ops.cc index 97d7060c6bb..56192022de0 100644 --- a/source/blender/editors/space_buttons/buttons_ops.cc +++ b/source/blender/editors/space_buttons/buttons_ops.cc @@ -18,12 +18,12 @@ #include "BLI_string.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_appdir.hh" #include "BKE_context.hh" #include "BKE_main.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "BKE_screen.hh" #include "WM_api.hh" @@ -301,20 +301,6 @@ static int file_browse_invoke(bContext *C, wmOperator *op, const wmEvent *event) return OPERATOR_CANCELLED; } - { - const char *info; - if (!RNA_property_editable_info(&ptr, prop, &info)) { - if (info[0]) { - BKE_reportf(op->reports, RPT_ERROR, "Property is not editable: %s", info); - } - else { - BKE_report(op->reports, RPT_ERROR, "Property is not editable"); - } - MEM_freeN(path); - return OPERATOR_CANCELLED; - } - } - PropertyRNA *prop_relpath; const char *path_prop = RNA_struct_find_property(op->ptr, "directory") ? "directory" : "filepath"; diff --git a/source/blender/editors/space_buttons/buttons_texture.cc b/source/blender/editors/space_buttons/buttons_texture.cc index 4a3f7bba611..afc0e35029b 100644 --- a/source/blender/editors/space_buttons/buttons_texture.cc +++ b/source/blender/editors/space_buttons/buttons_texture.cc @@ -15,7 +15,7 @@ #include "BLI_string.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_ID.h" #include "DNA_brush_types.h" @@ -34,6 +34,7 @@ #include "BKE_layer.hh" #include "BKE_linestyle.h" #include "BKE_modifier.hh" +#include "BKE_node.hh" #include "BKE_node_runtime.hh" #include "BKE_paint.hh" #include "BKE_particle.h" @@ -518,6 +519,8 @@ static void template_texture_user_menu(bContext *C, uiLayout *layout, void * /*a nullptr, 0.0, 0.0, + 0.0, + 0.0, ""); UI_but_funcN_set(but, template_texture_select, MEM_dupallocN(user), nullptr); @@ -687,6 +690,8 @@ void uiTemplateTextureShow(uiLayout *layout, const bContext *C, PointerRNA *ptr, nullptr, 0.0, 0.0, + 0.0, + 0.0, TIP_("Show texture in texture tab")); UI_but_func_set(but, template_texture_show, diff --git a/source/blender/editors/space_buttons/space_buttons.cc b/source/blender/editors/space_buttons/space_buttons.cc index da660144667..8c0442c2502 100644 --- a/source/blender/editors/space_buttons/space_buttons.cc +++ b/source/blender/editors/space_buttons/space_buttons.cc @@ -33,6 +33,8 @@ #include "WM_types.hh" #include "RNA_access.hh" +#include "RNA_define.hh" +#include "RNA_enum_types.hh" #include "UI_interface.hh" #include "UI_resources.hh" @@ -854,20 +856,20 @@ static void buttons_area_listener(const wmSpaceTypeListenerParams *params) } } -static void buttons_id_remap(ScrArea * /*area*/, - SpaceLink *slink, - const blender::bke::id::IDRemapper &mappings) +static void buttons_id_remap(ScrArea * /*area*/, SpaceLink *slink, const IDRemapper *mappings) { SpaceProperties *sbuts = (SpaceProperties *)slink; - if (mappings.apply(&sbuts->pinid, ID_REMAP_APPLY_DEFAULT) == ID_REMAP_RESULT_SOURCE_UNASSIGNED) { + if (BKE_id_remapper_apply(mappings, &sbuts->pinid, ID_REMAP_APPLY_DEFAULT) == + ID_REMAP_RESULT_SOURCE_UNASSIGNED) + { sbuts->flag &= ~SB_PIN_CONTEXT; } if (sbuts->path) { ButsContextPath *path = static_cast(sbuts->path); for (int i = 0; i < path->len; i++) { - switch (mappings.apply(&path->ptr[i].owner_id, ID_REMAP_APPLY_DEFAULT)) { + switch (BKE_id_remapper_apply(mappings, &path->ptr[i].owner_id, ID_REMAP_APPLY_DEFAULT)) { case ID_REMAP_RESULT_SOURCE_UNASSIGNED: { path->len = i; if (i != 0) { @@ -901,7 +903,7 @@ static void buttons_id_remap(ScrArea * /*area*/, if (sbuts->texuser) { ButsContextTexture *ct = static_cast(sbuts->texuser); - mappings.apply(reinterpret_cast(&ct->texture), ID_REMAP_APPLY_DEFAULT); + BKE_id_remapper_apply(mappings, (ID **)&ct->texture, ID_REMAP_APPLY_DEFAULT); BLI_freelistN(&ct->users); ct->user = nullptr; } diff --git a/source/blender/editors/space_clip/clip_buttons.cc b/source/blender/editors/space_clip/clip_buttons.cc index e7436100b55..dc305bcad23 100644 --- a/source/blender/editors/space_clip/clip_buttons.cc +++ b/source/blender/editors/space_clip/clip_buttons.cc @@ -21,7 +21,7 @@ #include "BLI_string.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_context.hh" #include "BKE_movieclip.h" @@ -128,7 +128,8 @@ void uiTemplateMovieClip( if (clip) { uiLayout *row = uiLayoutRow(layout, false); uiBlock *block = uiLayoutGetBlock(row); - uiDefBut(block, UI_BTYPE_LABEL, 0, IFACE_("File Path:"), 0, 19, 145, 19, nullptr, 0, 0, ""); + uiDefBut( + block, UI_BTYPE_LABEL, 0, IFACE_("File Path:"), 0, 19, 145, 19, nullptr, 0, 0, 0, 0, ""); row = uiLayoutRow(layout, false); uiLayout *split = uiLayoutSplit(row, 0.0f, false); @@ -189,6 +190,8 @@ void uiTemplateTrack(uiLayout *layout, PointerRNA *ptr, const char *propname) scopes, 0, 0, + 0, + 0, ""); /* Resize grip. */ @@ -203,6 +206,8 @@ void uiTemplateTrack(uiLayout *layout, PointerRNA *ptr, const char *propname) &scopes->track_preview_height, UI_UNIT_Y, UI_UNIT_Y * 20.0f, + 0.0f, + 0.0f, ""); } @@ -437,6 +442,8 @@ void uiTemplateMarker(uiLayout *layout, &cb->marker_flag, 0, 0, + 1, + 0, tip); UI_but_funcN_set(bt, marker_update_cb, cb, nullptr); UI_but_drawflag_enable(bt, UI_BUT_ICON_REVERSE); @@ -460,6 +467,8 @@ void uiTemplateMarker(uiLayout *layout, nullptr, 0, 0, + 0, + 0, ""); return; @@ -530,6 +539,8 @@ void uiTemplateMarker(uiLayout *layout, nullptr, 0, 0, + 0, + 0, ""); uiBut *bt = uiDefButF(block, UI_BTYPE_NUM, @@ -571,6 +582,8 @@ void uiTemplateMarker(uiLayout *layout, nullptr, 0, 0, + 0, + 0, ""); bt = uiDefButF(block, UI_BTYPE_NUM, @@ -612,6 +625,8 @@ void uiTemplateMarker(uiLayout *layout, nullptr, 0, 0, + 0, + 0, ""); bt = uiDefButF(block, UI_BTYPE_NUM, @@ -653,6 +668,8 @@ void uiTemplateMarker(uiLayout *layout, nullptr, 0, 0, + 0, + 0, ""); bt = uiDefButF(block, UI_BTYPE_NUM, diff --git a/source/blender/editors/space_clip/clip_dopesheet_ops.cc b/source/blender/editors/space_clip/clip_dopesheet_ops.cc index 2fb3488fbe9..d753e23e19e 100644 --- a/source/blender/editors/space_clip/clip_dopesheet_ops.cc +++ b/source/blender/editors/space_clip/clip_dopesheet_ops.cc @@ -20,6 +20,8 @@ #include "ED_clip.hh" #include "ED_screen.hh" +#include "UI_interface.hh" + #include "RNA_access.hh" #include "RNA_define.hh" diff --git a/source/blender/editors/space_clip/clip_draw.cc b/source/blender/editors/space_clip/clip_draw.cc index 7061c4136dd..36988c6cf3f 100644 --- a/source/blender/editors/space_clip/clip_draw.cc +++ b/source/blender/editors/space_clip/clip_draw.cc @@ -41,6 +41,7 @@ #include "WM_types.hh" +#include "UI_interface.hh" #include "UI_resources.hh" #include "UI_view2d.hh" diff --git a/source/blender/editors/space_clip/clip_editor.cc b/source/blender/editors/space_clip/clip_editor.cc index 44e00193e88..92c299133e1 100644 --- a/source/blender/editors/space_clip/clip_editor.cc +++ b/source/blender/editors/space_clip/clip_editor.cc @@ -26,12 +26,14 @@ #include "BLI_listbase.h" #include "BLI_rect.h" #include "BLI_task.h" +#include "BLI_time.h" #include "BLI_utildefines.h" #include "BKE_context.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_lib_id.hh" #include "BKE_main.hh" +#include "BKE_mask.h" #include "BKE_movieclip.h" #include "BKE_tracking.h" @@ -40,6 +42,8 @@ #include "IMB_imbuf_types.hh" #include "ED_clip.hh" +#include "ED_mask.hh" +#include "ED_screen.hh" #include "ED_select_utils.hh" #include "WM_api.hh" diff --git a/source/blender/editors/space_clip/clip_graph_draw.cc b/source/blender/editors/space_clip/clip_graph_draw.cc index 56e8c268ec4..06ec3cb732c 100644 --- a/source/blender/editors/space_clip/clip_graph_draw.cc +++ b/source/blender/editors/space_clip/clip_graph_draw.cc @@ -11,6 +11,7 @@ #include "BLI_utildefines.h" +#include "BKE_context.hh" #include "BKE_movieclip.h" #include "BKE_tracking.h" @@ -24,6 +25,7 @@ #include "WM_types.hh" +#include "UI_interface.hh" #include "UI_resources.hh" #include "UI_view2d.hh" diff --git a/source/blender/editors/space_clip/clip_graph_ops.cc b/source/blender/editors/space_clip/clip_graph_ops.cc index 93c02aba6ef..f03b28e23c9 100644 --- a/source/blender/editors/space_clip/clip_graph_ops.cc +++ b/source/blender/editors/space_clip/clip_graph_ops.cc @@ -13,15 +13,11 @@ #include "BLI_rect.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" - #include "BKE_context.hh" #include "BKE_tracking.h" #include "DEG_depsgraph.hh" -#include "UI_interface_icons.hh" - #include "WM_api.hh" #include "WM_types.hh" @@ -530,20 +526,6 @@ static int delete_curve_exec(bContext *C, wmOperator * /*op*/) return OPERATOR_FINISHED; } -static int delete_curve_invoke(bContext *C, wmOperator *op, const wmEvent * /*event*/) -{ - if (RNA_boolean_get(op->ptr, "confirm")) { - return WM_operator_confirm_ex(C, - op, - IFACE_("Delete track corresponding to the selected curve?"), - nullptr, - IFACE_("Delete"), - ALERT_ICON_NONE, - false); - } - return delete_curve_exec(C, op); -} - void CLIP_OT_graph_delete_curve(wmOperatorType *ot) { /* identifiers */ @@ -552,7 +534,7 @@ void CLIP_OT_graph_delete_curve(wmOperatorType *ot) ot->idname = "CLIP_OT_graph_delete_curve"; /* api callbacks */ - ot->invoke = delete_curve_invoke; + ot->invoke = WM_operator_confirm_or_exec; ot->exec = delete_curve_exec; ot->poll = clip_graph_knots_poll; diff --git a/source/blender/editors/space_clip/clip_ops.cc b/source/blender/editors/space_clip/clip_ops.cc index d0f08776662..6ed2441e89a 100644 --- a/source/blender/editors/space_clip/clip_ops.cc +++ b/source/blender/editors/space_clip/clip_ops.cc @@ -31,14 +31,14 @@ #include "BLI_time.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_context.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_lib_id.hh" #include "BKE_main.hh" #include "BKE_movieclip.h" -#include "BKE_report.hh" +#include "BKE_report.h" #include "BKE_tracking.h" #include "WM_api.hh" @@ -556,7 +556,7 @@ static void view_zoom_init(bContext *C, wmOperator *op, const wmEvent *event) if (U.viewzoom == USER_ZOOM_CONTINUE) { /* needs a timer to continue redrawing */ vpd->timer = WM_event_timer_add(CTX_wm_manager(C), CTX_wm_window(C), TIMER, 0.01f); - vpd->timer_lastdraw = BLI_time_now_seconds(); + vpd->timer_lastdraw = BLI_check_seconds_timer(); } vpd->x = event->xy[0]; @@ -648,7 +648,7 @@ static void view_zoom_apply( if (U.viewzoom == USER_ZOOM_CONTINUE) { SpaceClip *sclip = CTX_wm_space_clip(C); - double time = BLI_time_now_seconds(); + double time = BLI_check_seconds_timer(); float time_step = float(time - vpd->timer_lastdraw); float zfac; diff --git a/source/blender/editors/space_clip/clip_utils.cc b/source/blender/editors/space_clip/clip_utils.cc index 86ea1f7bd2f..eb1e89b3bbf 100644 --- a/source/blender/editors/space_clip/clip_utils.cc +++ b/source/blender/editors/space_clip/clip_utils.cc @@ -32,7 +32,9 @@ #include "ED_clip.hh" #include "ED_mask.hh" +#include "ED_screen.hh" +#include "UI_interface.hh" #include "UI_resources.hh" #include "UI_view2d.hh" diff --git a/source/blender/editors/space_clip/space_clip.cc b/source/blender/editors/space_clip/space_clip.cc index 340fad221e7..08ddd3c89d2 100644 --- a/source/blender/editors/space_clip/space_clip.cc +++ b/source/blender/editors/space_clip/space_clip.cc @@ -22,6 +22,7 @@ #include "BLI_utildefines.h" #include "BKE_context.hh" +#include "BKE_lib_id.hh" #include "BKE_lib_query.hh" #include "BKE_lib_remap.hh" #include "BKE_movieclip.h" @@ -657,7 +658,7 @@ static void clip_main_region_init(wmWindowManager *wm, ARegion *region) wmKeyMap *keymap; /* NOTE: don't use `UI_view2d_region_reinit(®ion->v2d, ...)` - * since the space clip manages its own v2d in #movieclip_main_area_set_view2d */ + * since the space clip manages own v2d in #movieclip_main_area_set_view2d */ /* mask polls mode */ keymap = WM_keymap_ensure(wm->defaultconf, "Mask Editing", SPACE_EMPTY, RGN_TYPE_WINDOW); @@ -1151,18 +1152,16 @@ static void clip_properties_region_listener(const wmRegionListenerParams *params /** \name IO Callbacks * \{ */ -static void clip_id_remap(ScrArea * /*area*/, - SpaceLink *slink, - const blender::bke::id::IDRemapper &mappings) +static void clip_id_remap(ScrArea * /*area*/, SpaceLink *slink, const IDRemapper *mappings) { SpaceClip *sclip = (SpaceClip *)slink; - if (!mappings.contains_mappings_for_any(FILTER_ID_MC | FILTER_ID_MSK)) { + if (!BKE_id_remapper_has_mapping_for(mappings, FILTER_ID_MC | FILTER_ID_MSK)) { return; } - mappings.apply(reinterpret_cast(&sclip->clip), ID_REMAP_APPLY_ENSURE_REAL); - mappings.apply(reinterpret_cast(&sclip->mask_info.mask), ID_REMAP_APPLY_ENSURE_REAL); + BKE_id_remapper_apply(mappings, (ID **)&sclip->clip, ID_REMAP_APPLY_ENSURE_REAL); + BKE_id_remapper_apply(mappings, (ID **)&sclip->mask_info.mask, ID_REMAP_APPLY_ENSURE_REAL); } static void clip_foreach_id(SpaceLink *space_link, LibraryForeachIDData *data) diff --git a/source/blender/editors/space_clip/tracking_ops.cc b/source/blender/editors/space_clip/tracking_ops.cc index 6a5a256bd5a..dc2d2334bb8 100644 --- a/source/blender/editors/space_clip/tracking_ops.cc +++ b/source/blender/editors/space_clip/tracking_ops.cc @@ -11,6 +11,7 @@ #include "DNA_screen_types.h" #include "DNA_space_types.h" +#include "BLI_blenlib.h" #include "BLI_ghash.h" #include "BLI_math_geom.h" #include "BLI_math_vector.h" @@ -19,13 +20,11 @@ #include "BKE_context.hh" #include "BKE_image.h" #include "BKE_movieclip.h" -#include "BKE_report.hh" +#include "BKE_report.h" #include "BKE_tracking.h" #include "DEG_depsgraph.hh" -#include "UI_interface_icons.hh" - #include "WM_api.hh" #include "WM_types.hh" @@ -35,7 +34,7 @@ #include "RNA_access.hh" #include "RNA_define.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "IMB_imbuf.hh" #include "IMB_imbuf_types.hh" @@ -245,20 +244,6 @@ static int delete_track_exec(bContext *C, wmOperator * /*op*/) return OPERATOR_FINISHED; } -static int delete_track_invoke(bContext *C, wmOperator *op, const wmEvent * /*event*/) -{ - if (RNA_boolean_get(op->ptr, "confirm")) { - return WM_operator_confirm_ex(C, - op, - IFACE_("Delete selected tracks?"), - nullptr, - IFACE_("Delete"), - ALERT_ICON_NONE, - false); - } - return delete_track_exec(C, op); -} - void CLIP_OT_delete_track(wmOperatorType *ot) { /* identifiers */ @@ -267,7 +252,7 @@ void CLIP_OT_delete_track(wmOperatorType *ot) ot->description = "Delete selected tracks"; /* api callbacks */ - ot->invoke = delete_track_invoke; + ot->invoke = WM_operator_confirm_or_exec; ot->exec = delete_track_exec; ot->poll = ED_space_clip_tracking_poll; @@ -325,20 +310,6 @@ static int delete_marker_exec(bContext *C, wmOperator * /*op*/) return OPERATOR_FINISHED; } -static int delete_marker_invoke(bContext *C, wmOperator *op, const wmEvent * /*event*/) -{ - if (RNA_boolean_get(op->ptr, "confirm")) { - return WM_operator_confirm_ex(C, - op, - IFACE_("Delete marker for current frame from selected tracks?"), - nullptr, - IFACE_("Delete"), - ALERT_ICON_NONE, - false); - } - return delete_marker_exec(C, op); -} - void CLIP_OT_delete_marker(wmOperatorType *ot) { /* identifiers */ @@ -347,7 +318,7 @@ void CLIP_OT_delete_marker(wmOperatorType *ot) ot->description = "Delete marker for current frame from selected tracks"; /* api callbacks */ - ot->invoke = delete_marker_invoke; + ot->invoke = WM_operator_confirm_or_exec; ot->exec = delete_marker_exec; ot->poll = ED_space_clip_tracking_poll; @@ -1821,7 +1792,7 @@ static int tracking_object_new_exec(bContext *C, wmOperator * /*op*/) BKE_tracking_object_add(tracking, "Object"); - DEG_id_tag_update(&clip->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&clip->id, ID_RECALC_COPY_ON_WRITE); WM_event_add_notifier(C, NC_MOVIECLIP | NA_EDITED, clip); return OPERATOR_FINISHED; @@ -1862,7 +1833,7 @@ static int tracking_object_remove_exec(bContext *C, wmOperator *op) BKE_tracking_object_delete(tracking, tracking_object); - DEG_id_tag_update(&clip->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&clip->id, ID_RECALC_COPY_ON_WRITE); WM_event_add_notifier(C, NC_MOVIECLIP | NA_EDITED, clip); return OPERATOR_FINISHED; diff --git a/source/blender/editors/space_clip/tracking_ops_detect.cc b/source/blender/editors/space_clip/tracking_ops_detect.cc index 1bda33d1cb3..b3fd318bb03 100644 --- a/source/blender/editors/space_clip/tracking_ops_detect.cc +++ b/source/blender/editors/space_clip/tracking_ops_detect.cc @@ -12,7 +12,7 @@ #include "BKE_context.hh" #include "BKE_movieclip.h" -#include "BKE_report.hh" +#include "BKE_report.h" #include "BKE_tracking.h" #include "WM_api.hh" diff --git a/source/blender/editors/space_clip/tracking_ops_orient.cc b/source/blender/editors/space_clip/tracking_ops_orient.cc index 04a4850a02c..d18b67bf0a2 100644 --- a/source/blender/editors/space_clip/tracking_ops_orient.cc +++ b/source/blender/editors/space_clip/tracking_ops_orient.cc @@ -21,7 +21,7 @@ #include "BKE_context.hh" #include "BKE_layer.hh" #include "BKE_object.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "BKE_tracking.h" #include "DEG_depsgraph.hh" diff --git a/source/blender/editors/space_clip/tracking_ops_plane.cc b/source/blender/editors/space_clip/tracking_ops_plane.cc index 4a1704bc0c2..d2a00c0d115 100644 --- a/source/blender/editors/space_clip/tracking_ops_plane.cc +++ b/source/blender/editors/space_clip/tracking_ops_plane.cc @@ -16,7 +16,7 @@ #include "BLI_utildefines.h" #include "BKE_context.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "BKE_tracking.h" #include "DEG_depsgraph.hh" @@ -59,7 +59,7 @@ static int create_plane_track_tracks_exec(bContext *C, wmOperator *op) */ BKE_tracking_track_plane_from_existing_motion(plane_track, framenr); - DEG_id_tag_update(&clip->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&clip->id, ID_RECALC_COPY_ON_WRITE); WM_event_add_notifier(C, NC_MOVIECLIP | NA_EDITED, clip); return OPERATOR_FINISHED; @@ -292,7 +292,7 @@ static int slide_plane_marker_modal(bContext *C, wmOperator *op, const wmEvent * data->previous_mval[1] = event->mval[1]; copy_v2_v2(data->previous_corner, data->corner); - DEG_id_tag_update(&clip->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&clip->id, ID_RECALC_COPY_ON_WRITE); WM_event_add_notifier(C, NC_MOVIECLIP | NA_EDITED, nullptr); break; @@ -309,7 +309,7 @@ static int slide_plane_marker_modal(bContext *C, wmOperator *op, const wmEvent * clip_tracking_show_cursor(C); - DEG_id_tag_update(&clip->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&clip->id, ID_RECALC_COPY_ON_WRITE); WM_event_add_notifier(C, NC_MOVIECLIP | NA_EDITED, clip); return OPERATOR_FINISHED; diff --git a/source/blender/editors/space_clip/tracking_ops_solve.cc b/source/blender/editors/space_clip/tracking_ops_solve.cc index b23c9a758be..27dc8a0b853 100644 --- a/source/blender/editors/space_clip/tracking_ops_solve.cc +++ b/source/blender/editors/space_clip/tracking_ops_solve.cc @@ -17,10 +17,10 @@ #include "BLI_utildefines.h" #include "BKE_context.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_lib_id.hh" #include "BKE_movieclip.h" -#include "BKE_report.hh" +#include "BKE_report.h" #include "BKE_tracking.h" #include "DEG_depsgraph.hh" @@ -157,7 +157,7 @@ static void solve_camera_freejob(void *scv) int width, height; BKE_movieclip_get_size(clip, &scj->user, &width, &height); BKE_tracking_camera_to_blender(tracking, scene, camera, width, height); - DEG_id_tag_update(&camera->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&camera->id, ID_RECALC_COPY_ON_WRITE); WM_main_add_notifier(NC_OBJECT, camera); } diff --git a/source/blender/editors/space_clip/tracking_ops_track.cc b/source/blender/editors/space_clip/tracking_ops_track.cc index 7e903f9afcd..91bed25ea3d 100644 --- a/source/blender/editors/space_clip/tracking_ops_track.cc +++ b/source/blender/editors/space_clip/tracking_ops_track.cc @@ -8,13 +8,14 @@ #include "MEM_guardedalloc.h" +#include "BLI_string.h" #include "BLI_time.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_context.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_main.hh" #include "BKE_movieclip.h" #include "BKE_tracking.h" @@ -23,6 +24,7 @@ #include "WM_types.hh" #include "ED_clip.hh" +#include "ED_screen.hh" #include "RNA_access.hh" #include "RNA_define.hh" @@ -216,15 +218,15 @@ static void track_markers_startjob(void *tmv, wmJobWorkerStatus *worker_status) * exec_time for "Fastest" tracking */ - double start_time = BLI_time_now_seconds(), exec_time; + double start_time = BLI_check_seconds_timer(), exec_time; if (!BKE_autotrack_context_step(tmj->context)) { break; } - exec_time = BLI_time_now_seconds() - start_time; + exec_time = BLI_check_seconds_timer() - start_time; if (tmj->delay > float(exec_time)) { - BLI_time_sleep_ms(tmj->delay - float(exec_time)); + BLI_sleep_ms(tmj->delay - float(exec_time)); } } else if (!BKE_autotrack_context_step(tmj->context)) { @@ -270,7 +272,7 @@ static void track_markers_endjob(void *tmv) BKE_autotrack_context_sync(tmj->context); BKE_autotrack_context_finish(tmj->context); - DEG_id_tag_update(&tmj->clip->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&tmj->clip->id, ID_RECALC_COPY_ON_WRITE); WM_main_add_notifier(NC_SCENE | ND_FRAME, tmj->scene); } @@ -446,7 +448,7 @@ static int refine_marker_exec(bContext *C, wmOperator *op) } } - DEG_id_tag_update(&clip->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&clip->id, ID_RECALC_COPY_ON_WRITE); WM_event_add_notifier(C, NC_MOVIECLIP | NA_EVALUATED, clip); return OPERATOR_FINISHED; diff --git a/source/blender/editors/space_clip/tracking_select.cc b/source/blender/editors/space_clip/tracking_select.cc index ee144102a17..d244d9b17a2 100644 --- a/source/blender/editors/space_clip/tracking_select.cc +++ b/source/blender/editors/space_clip/tracking_select.cc @@ -11,11 +11,10 @@ #include "DNA_movieclip_types.h" #include "DNA_scene_types.h" -#include "BLI_lasso_2d.hh" +#include "BLI_lasso_2d.h" #include "BLI_listbase.h" #include "BLI_math_geom.h" #include "BLI_math_vector.h" -#include "BLI_math_vector_types.hh" #include "BLI_rect.h" #include "BLI_utildefines.h" @@ -26,6 +25,8 @@ #include "WM_types.hh" #include "ED_clip.hh" +#include "ED_mask.hh" +#include "ED_screen.hh" #include "ED_select_utils.hh" #include "RNA_access.hh" @@ -38,10 +39,6 @@ #include "clip_intern.h" /* own include */ #include "tracking_ops_intern.h" /* own include */ -using blender::Array; -using blender::int2; -using blender::Span; - /* -------------------------------------------------------------------- */ /** \name Point track marker picking. * \{ */ @@ -840,7 +837,10 @@ void CLIP_OT_select_box(wmOperatorType *ot) /********************** lasso select operator *********************/ -static int do_lasso_select_marker(bContext *C, const Span mcoords, bool select) +static int do_lasso_select_marker(bContext *C, + const int mcoords[][2], + const int mcoords_len, + bool select) { SpaceClip *sc = CTX_wm_space_clip(C); ARegion *region = CTX_wm_region(C); @@ -852,7 +852,7 @@ static int do_lasso_select_marker(bContext *C, const Span mcoords, bool se const int framenr = ED_space_clip_get_clip_frame_number(sc); /* get rectangle from operator */ - BLI_lasso_boundbox(&rect, mcoords); + BLI_lasso_boundbox(&rect, mcoords, mcoords_len); /* do actual selection */ LISTBASE_FOREACH (MovieTrackingTrack *, track, &tracking_object->tracks) { @@ -869,7 +869,8 @@ static int do_lasso_select_marker(bContext *C, const Span mcoords, bool se ED_clip_point_stable_pos__reverse(sc, region, marker->pos, screen_co); if (BLI_rcti_isect_pt(&rect, screen_co[0], screen_co[1]) && - BLI_lasso_is_point_inside(mcoords, screen_co[0], screen_co[1], V2D_IS_CLIPPED)) + BLI_lasso_is_point_inside( + mcoords, mcoords_len, screen_co[0], screen_co[1], V2D_IS_CLIPPED)) { if (select) { BKE_tracking_track_flag_set(track, TRACK_AREA_ALL, SELECT); @@ -898,7 +899,8 @@ static int do_lasso_select_marker(bContext *C, const Span mcoords, bool se ED_clip_point_stable_pos__reverse(sc, region, plane_marker->corners[i], screen_co); if (BLI_rcti_isect_pt(&rect, screen_co[0], screen_co[1]) && - BLI_lasso_is_point_inside(mcoords, screen_co[0], screen_co[1], V2D_IS_CLIPPED)) + BLI_lasso_is_point_inside( + mcoords, mcoords_len, screen_co[0], screen_co[1], V2D_IS_CLIPPED)) { if (select) { plane_track->flag |= SELECT; @@ -924,22 +926,24 @@ static int do_lasso_select_marker(bContext *C, const Span mcoords, bool se static int clip_lasso_select_exec(bContext *C, wmOperator *op) { - const Array mcoords = WM_gesture_lasso_path_to_array(C, op); + int mcoords_len; + const int(*mcoords)[2] = WM_gesture_lasso_path_to_array(C, op, &mcoords_len); - if (mcoords.is_empty()) { - return OPERATOR_PASS_THROUGH; + if (mcoords) { + const eSelectOp sel_op = eSelectOp(RNA_enum_get(op->ptr, "mode")); + const bool select = (sel_op != SEL_OP_SUB); + if (SEL_OP_USE_PRE_DESELECT(sel_op)) { + SpaceClip *sc = CTX_wm_space_clip(C); + ED_clip_select_all(sc, SEL_DESELECT, nullptr); + } + + do_lasso_select_marker(C, mcoords, mcoords_len, select); + + MEM_freeN((void *)mcoords); + + return OPERATOR_FINISHED; } - - const eSelectOp sel_op = eSelectOp(RNA_enum_get(op->ptr, "mode")); - const bool select = (sel_op != SEL_OP_SUB); - if (SEL_OP_USE_PRE_DESELECT(sel_op)) { - SpaceClip *sc = CTX_wm_space_clip(C); - ED_clip_select_all(sc, SEL_DESELECT, nullptr); - } - - do_lasso_select_marker(C, mcoords, select); - - return OPERATOR_FINISHED; + return OPERATOR_PASS_THROUGH; } void CLIP_OT_select_lasso(wmOperatorType *ot) diff --git a/source/blender/editors/space_console/console_draw.cc b/source/blender/editors/space_console/console_draw.cc index 0c6a706eedc..1fef1b2c471 100644 --- a/source/blender/editors/space_console/console_draw.cc +++ b/source/blender/editors/space_console/console_draw.cc @@ -18,6 +18,7 @@ #include "GPU_immediate.h" +#include "UI_interface.hh" #include "UI_resources.hh" #include "UI_view2d.hh" diff --git a/source/blender/editors/space_console/console_ops.cc b/source/blender/editors/space_console/console_ops.cc index 6d54ab32453..6c53fa22f40 100644 --- a/source/blender/editors/space_console/console_ops.cc +++ b/source/blender/editors/space_console/console_ops.cc @@ -23,7 +23,7 @@ #include "BLI_utildefines.h" #include "BKE_context.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "BKE_screen.hh" #include "WM_api.hh" diff --git a/source/blender/editors/space_console/space_console.cc b/source/blender/editors/space_console/space_console.cc index ac40af94170..f4485f428ad 100644 --- a/source/blender/editors/space_console/space_console.cc +++ b/source/blender/editors/space_console/space_console.cc @@ -15,6 +15,7 @@ #include "BLI_utildefines.h" #include "BKE_context.hh" +#include "BKE_global.h" #include "BKE_screen.hh" #include "ED_screen.hh" @@ -150,12 +151,12 @@ static void console_cursor(wmWindow *win, ScrArea * /*area*/, ARegion *region) /* ************* dropboxes ************* */ -static bool console_drop_id_poll(bContext * /*C*/, wmDrag *drag, const wmEvent * /*event*/) +static bool id_drop_poll(bContext * /*C*/, wmDrag *drag, const wmEvent * /*event*/) { return WM_drag_get_local_ID(drag, 0) != nullptr; } -static void console_drop_id_copy(bContext * /*C*/, wmDrag *drag, wmDropBox *drop) +static void id_drop_copy(bContext * /*C*/, wmDrag *drag, wmDropBox *drop) { ID *id = WM_drag_get_local_ID(drag, 0); @@ -164,47 +165,25 @@ static void console_drop_id_copy(bContext * /*C*/, wmDrag *drag, wmDropBox *drop RNA_string_set(drop->ptr, "text", text.c_str()); } -static bool console_drop_path_poll(bContext * /*C*/, wmDrag *drag, const wmEvent * /*event*/) +static bool path_drop_poll(bContext * /*C*/, wmDrag *drag, const wmEvent * /*event*/) { return (drag->type == WM_DRAG_PATH); } -static void console_drop_path_copy(bContext * /*C*/, wmDrag *drag, wmDropBox *drop) +static void path_drop_copy(bContext * /*C*/, wmDrag *drag, wmDropBox *drop) { char pathname[FILE_MAX + 2]; SNPRINTF(pathname, "\"%s\"", WM_drag_get_single_path(drag)); RNA_string_set(drop->ptr, "text", pathname); } -static bool console_drop_string_poll(bContext * /*C*/, wmDrag *drag, const wmEvent * /*event*/) -{ - return (drag->type == WM_DRAG_STRING); -} - -static void console_drop_string_copy(bContext * /*C*/, wmDrag *drag, wmDropBox *drop) -{ - /* NOTE(@ideasman42): Only a single line is supported, multiple lines could be supported - * but this implies executing all lines except for the last. While we could consider that, - * there are some security implications for this, so just drop one line for now. */ - std::string str = WM_drag_get_string_firstline(drag); - RNA_string_set(drop->ptr, "text", str.c_str()); -} - /* this region dropbox definition */ static void console_dropboxes() { ListBase *lb = WM_dropboxmap_find("Console", SPACE_CONSOLE, RGN_TYPE_WINDOW); - WM_dropbox_add( - lb, "CONSOLE_OT_insert", console_drop_id_poll, console_drop_id_copy, nullptr, nullptr); - WM_dropbox_add( - lb, "CONSOLE_OT_insert", console_drop_path_poll, console_drop_path_copy, nullptr, nullptr); - WM_dropbox_add(lb, - "CONSOLE_OT_insert", - console_drop_string_poll, - console_drop_string_copy, - nullptr, - nullptr); + WM_dropbox_add(lb, "CONSOLE_OT_insert", id_drop_poll, id_drop_copy, nullptr, nullptr); + WM_dropbox_add(lb, "CONSOLE_OT_insert", path_drop_poll, path_drop_copy, nullptr, nullptr); } /* ************* end drop *********** */ diff --git a/source/blender/editors/space_file/asset_catalog_tree_view.cc b/source/blender/editors/space_file/asset_catalog_tree_view.cc index b6abbf9a627..555fe12b36f 100644 --- a/source/blender/editors/space_file/asset_catalog_tree_view.cc +++ b/source/blender/editors/space_file/asset_catalog_tree_view.cc @@ -16,7 +16,7 @@ #include "BLI_string_ref.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "ED_asset.hh" #include "ED_fileselect.hh" @@ -36,6 +36,7 @@ #include +using namespace blender; using namespace blender::asset_system; namespace blender::ed::asset_browser { @@ -45,7 +46,7 @@ class AssetCatalogTreeViewAllItem; class AssetCatalogTreeView : public ui::AbstractTreeView { asset_system::AssetLibrary *asset_library_; /** The asset catalog tree this tree-view represents. */ - const asset_system::AssetCatalogTree *catalog_tree_; + asset_system::AssetCatalogTree *catalog_tree_; FileAssetSelectParams *params_; SpaceFile &space_file_; @@ -64,7 +65,7 @@ class AssetCatalogTreeView : public ui::AbstractTreeView { private: ui::BasicTreeViewItem &build_catalog_items_recursive(ui::TreeViewOrItem &view_parent_item, - const AssetCatalogTreeItem &catalog); + AssetCatalogTreeItem &catalog); AssetCatalogTreeViewAllItem &add_all_item(); void add_unassigned_item(); @@ -75,10 +76,10 @@ class AssetCatalogTreeView : public ui::AbstractTreeView { class AssetCatalogTreeViewItem : public ui::BasicTreeViewItem { /** The catalog tree item this tree view item represents. */ - const AssetCatalogTreeItem &catalog_item_; + AssetCatalogTreeItem &catalog_item_; public: - AssetCatalogTreeViewItem(const AssetCatalogTreeItem &catalog_item); + AssetCatalogTreeViewItem(AssetCatalogTreeItem *catalog_item); void on_activate(bContext &C) override; @@ -95,11 +96,11 @@ class AssetCatalogTreeViewItem : public ui::BasicTreeViewItem { }; class AssetCatalogDragController : public ui::AbstractViewItemDragController { - const AssetCatalogTreeItem &catalog_item_; + AssetCatalogTreeItem &catalog_item_; public: explicit AssetCatalogDragController(AssetCatalogTreeView &tree_view, - const AssetCatalogTreeItem &catalog_item); + AssetCatalogTreeItem &catalog_item); eWM_DragDataType get_drag_type() const override; void *create_drag_data() const override; @@ -107,10 +108,10 @@ class AssetCatalogDragController : public ui::AbstractViewItemDragController { }; class AssetCatalogDropTarget : public ui::TreeViewItemDropTarget { - const AssetCatalogTreeItem &catalog_item_; + AssetCatalogTreeItem &catalog_item_; public: - AssetCatalogDropTarget(AssetCatalogTreeViewItem &item, const AssetCatalogTreeItem &catalog_item); + AssetCatalogDropTarget(AssetCatalogTreeViewItem &item, AssetCatalogTreeItem &catalog_item); bool can_drop(const wmDrag &drag, const char **r_disabled_hint) const override; std::string drop_tooltip(const ui::DragInfo &drag_info) const override; @@ -180,14 +181,11 @@ class AssetCatalogTreeViewUnassignedItem : public ui::BasicTreeViewItem { AssetCatalogTreeView::AssetCatalogTreeView(asset_system::AssetLibrary *library, FileAssetSelectParams *params, SpaceFile &space_file) - : asset_library_(library), params_(params), space_file_(space_file) + : asset_library_(library), + catalog_tree_(AS_asset_library_get_catalog_tree(library)), + params_(params), + space_file_(space_file) { - if (library) { - catalog_tree_ = &library->catalog_service().catalog_tree(); - } - else { - catalog_tree_ = nullptr; - } } void AssetCatalogTreeView::build_tree() @@ -197,7 +195,7 @@ void AssetCatalogTreeView::build_tree() if (catalog_tree_) { /* Pass the "All" item on as parent of the actual catalog items. */ - catalog_tree_->foreach_root_item([this, &all_item](const AssetCatalogTreeItem &item) { + catalog_tree_->foreach_root_item([this, &all_item](AssetCatalogTreeItem &item) { build_catalog_items_recursive(all_item, item); }); } @@ -206,14 +204,14 @@ void AssetCatalogTreeView::build_tree() } ui::BasicTreeViewItem &AssetCatalogTreeView::build_catalog_items_recursive( - ui::TreeViewOrItem &view_parent_item, const AssetCatalogTreeItem &catalog) + ui::TreeViewOrItem &view_parent_item, AssetCatalogTreeItem &catalog) { ui::BasicTreeViewItem &view_item = view_parent_item.add_tree_item( - catalog); + &catalog); view_item.set_is_active_fn( [this, &catalog]() { return is_active_catalog(catalog.get_catalog_id()); }); - catalog.foreach_child([&view_item, this](const AssetCatalogTreeItem &child) { + catalog.foreach_child([&view_item, this](AssetCatalogTreeItem &child) { build_catalog_items_recursive(view_item, child); }); return view_item; @@ -263,8 +261,8 @@ bool AssetCatalogTreeView::is_active_catalog(CatalogID catalog_id) const /* ---------------------------------------------------------------------- */ -AssetCatalogTreeViewItem::AssetCatalogTreeViewItem(const AssetCatalogTreeItem &catalog_item) - : BasicTreeViewItem(catalog_item.get_name()), catalog_item_(catalog_item) +AssetCatalogTreeViewItem::AssetCatalogTreeViewItem(AssetCatalogTreeItem *catalog_item) + : BasicTreeViewItem(catalog_item->get_name()), catalog_item_(*catalog_item) { } @@ -277,7 +275,7 @@ void AssetCatalogTreeViewItem::on_activate(bContext & /*C*/) void AssetCatalogTreeViewItem::build_row(uiLayout &row) { const std::string label_override = catalog_item_.has_unsaved_changes() ? (label_ + "*") : label_; - this->add_label(row, label_override); + add_label(row, label_override); if (!is_hovered()) { return; @@ -305,6 +303,8 @@ void AssetCatalogTreeViewItem::build_context_menu(bContext &C, uiLayout &column) &props); RNA_string_set(&props, "parent_path", catalog_item_.catalog_path().c_str()); + char catalog_id_str_buffer[UUID_STRING_SIZE] = ""; + BLI_uuid_format(catalog_id_str_buffer, catalog_item_.get_catalog_id()); uiItemFullO(&column, "ASSET_OT_catalog_delete", IFACE_("Delete Catalog"), @@ -313,7 +313,7 @@ void AssetCatalogTreeViewItem::build_context_menu(bContext &C, uiLayout &column) WM_OP_INVOKE_DEFAULT, UI_ITEM_NONE, &props); - RNA_string_set(&props, "catalog_id", catalog_item_.get_catalog_id().str().c_str()); + RNA_string_set(&props, "catalog_id", catalog_id_str_buffer); uiItemO(&column, IFACE_("Rename"), ICON_NONE, "UI_OT_view_item_rename"); /* Doesn't actually exist right now, but could be defined in Python. Reason that this isn't done @@ -329,7 +329,7 @@ void AssetCatalogTreeViewItem::build_context_menu(bContext &C, uiLayout &column) bool AssetCatalogTreeViewItem::supports_renaming() const { const AssetCatalogTreeView &tree_view = static_cast( - this->get_tree_view()); + get_tree_view()); return !asset::catalogs_read_only(*tree_view.asset_library_); } @@ -339,7 +339,7 @@ bool AssetCatalogTreeViewItem::rename(const bContext &C, StringRefNull new_name) BasicTreeViewItem::rename(C, new_name); const AssetCatalogTreeView &tree_view = static_cast( - this->get_tree_view()); + get_tree_view()); asset::catalog_rename(tree_view.asset_library_, catalog_item_.get_catalog_id(), new_name); return true; } @@ -353,13 +353,13 @@ std::unique_ptr AssetCatalogTreeViewItem:: create_drag_controller() const { return std::make_unique( - static_cast(this->get_tree_view()), catalog_item_); + static_cast(get_tree_view()), catalog_item_); } /* ---------------------------------------------------------------------- */ AssetCatalogDropTarget::AssetCatalogDropTarget(AssetCatalogTreeViewItem &item, - const AssetCatalogTreeItem &catalog_item) + AssetCatalogTreeItem &catalog_item) : ui::TreeViewItemDropTarget(item), catalog_item_(catalog_item) { } @@ -368,11 +368,11 @@ bool AssetCatalogDropTarget::can_drop(const wmDrag &drag, const char **r_disable { if (drag.type == WM_DRAG_ASSET_CATALOG) { const asset_system::AssetLibrary &library = get_asset_library(); - if (!this->can_modify_catalogs(library, r_disabled_hint)) { + if (!can_modify_catalogs(library, r_disabled_hint)) { return false; } - const AssetCatalog *drag_catalog = this->get_drag_catalog(drag, library); + const AssetCatalog *drag_catalog = get_drag_catalog(drag, library); /* NOTE: Technically it's not an issue to allow this (the catalog will just receive a new * path and the catalog system will generate missing parents from the path). But it does * appear broken to users, so disabling entirely. */ @@ -396,15 +396,15 @@ bool AssetCatalogDropTarget::can_drop(const wmDrag &drag, const char **r_disable std::string AssetCatalogDropTarget::drop_tooltip(const ui::DragInfo &drag_info) const { if (drag_info.drag_data.type == WM_DRAG_ASSET_CATALOG) { - return this->drop_tooltip_asset_catalog(drag_info.drag_data); + return drop_tooltip_asset_catalog(drag_info.drag_data); } - return this->drop_tooltip_asset_list(drag_info.drag_data); + return drop_tooltip_asset_list(drag_info.drag_data); } std::string AssetCatalogDropTarget::drop_tooltip_asset_catalog(const wmDrag &drag) const { BLI_assert(drag.type == WM_DRAG_ASSET_CATALOG); - const AssetCatalog *src_catalog = this->get_drag_catalog(drag, get_asset_library()); + const AssetCatalog *src_catalog = get_drag_catalog(drag, get_asset_library()); return fmt::format( TIP_("Move catalog {} into {}"), src_catalog->path.name(), catalog_item_.get_name()); @@ -436,14 +436,14 @@ std::string AssetCatalogDropTarget::drop_tooltip_asset_list(const wmDrag &drag) bool AssetCatalogDropTarget::on_drop(bContext *C, const ui::DragInfo &drag) const { if (drag.drag_data.type == WM_DRAG_ASSET_CATALOG) { - return this->drop_asset_catalog_into_catalog( - drag.drag_data, this->get_view(), catalog_item_.get_catalog_id()); + return drop_asset_catalog_into_catalog( + drag.drag_data, get_view(), catalog_item_.get_catalog_id()); } - return this->drop_assets_into_catalog(C, - this->get_view(), - drag.drag_data, - catalog_item_.get_catalog_id(), - catalog_item_.get_simple_name()); + return drop_assets_into_catalog(C, + get_view(), + drag.drag_data, + catalog_item_.get_catalog_id(), + catalog_item_.get_simple_name()); } bool AssetCatalogDropTarget::drop_asset_catalog_into_catalog( @@ -502,10 +502,11 @@ AssetCatalog *AssetCatalogDropTarget::get_drag_catalog( if (drag.type != WM_DRAG_ASSET_CATALOG) { return nullptr; } - const AssetCatalogService &catalog_service = asset_library.catalog_service(); + const AssetCatalogService *catalog_service = AS_asset_library_get_catalog_service( + &asset_library); const wmDragAssetCatalog *catalog_drag = WM_drag_get_asset_catalog_data(&drag); - return catalog_service.find_catalog(catalog_drag->drag_catalog_id); + return catalog_service->find_catalog(catalog_drag->drag_catalog_id); } bool AssetCatalogDropTarget::has_droppable_asset(const wmDrag &drag, const char **r_disabled_hint) @@ -536,13 +537,13 @@ bool AssetCatalogDropTarget::can_modify_catalogs(const asset_system::AssetLibrar asset_system::AssetLibrary &AssetCatalogDropTarget::get_asset_library() const { - return *this->get_view().asset_library_; + return *get_view().asset_library_; } /* ---------------------------------------------------------------------- */ AssetCatalogDragController::AssetCatalogDragController(AssetCatalogTreeView &tree_view, - const AssetCatalogTreeItem &catalog_item) + AssetCatalogTreeItem &catalog_item) : ui::AbstractViewItemDragController(tree_view), catalog_item_(catalog_item) { } @@ -562,7 +563,7 @@ void *AssetCatalogDragController::create_drag_data() const void AssetCatalogDragController::on_drag_start() { - AssetCatalogTreeView &tree_view_ = this->get_view(); + AssetCatalogTreeView &tree_view_ = get_view(); tree_view_.activate_catalog_by_id(catalog_item_.get_catalog_id()); } @@ -574,15 +575,11 @@ void AssetCatalogTreeViewAllItem::build_row(uiLayout &row) PointerRNA *props; - UI_but_extra_operator_icon_add(reinterpret_cast(this->view_item_button()), - "ASSET_OT_catalogs_save", - WM_OP_INVOKE_DEFAULT, - ICON_FILE_TICK); + UI_but_extra_operator_icon_add( + (uiBut *)view_item_button(), "ASSET_OT_catalogs_save", WM_OP_INVOKE_DEFAULT, ICON_FILE_TICK); - props = UI_but_extra_operator_icon_add(reinterpret_cast(this->view_item_button()), - "ASSET_OT_catalog_new", - WM_OP_INVOKE_DEFAULT, - ICON_ADD); + props = UI_but_extra_operator_icon_add( + (uiBut *)view_item_button(), "ASSET_OT_catalog_new", WM_OP_INVOKE_DEFAULT, ICON_ADD); /* No parent path to use the root level. */ RNA_string_set(props, "parent_path", nullptr); } @@ -603,7 +600,7 @@ bool AssetCatalogTreeViewAllItem::DropTarget::can_drop(const wmDrag &drag, if (drag.type != WM_DRAG_ASSET_CATALOG) { return false; } - asset_system::AssetLibrary &library = *this->get_view().asset_library_; + asset_system::AssetLibrary &library = *get_view().asset_library_; if (!AssetCatalogDropTarget::can_modify_catalogs(library, r_disabled_hint)) { return false; } @@ -622,7 +619,7 @@ std::string AssetCatalogTreeViewAllItem::DropTarget::drop_tooltip( { BLI_assert(drag_info.drag_data.type == WM_DRAG_ASSET_CATALOG); const AssetCatalog *drag_catalog = AssetCatalogDropTarget::get_drag_catalog( - drag_info.drag_data, *this->get_view().asset_library_); + drag_info.drag_data, *get_view().asset_library_); return fmt::format(TIP_("Move catalog {} to the top level of the tree"), drag_catalog->path.name()); @@ -634,7 +631,7 @@ bool AssetCatalogTreeViewAllItem::DropTarget::on_drop(bContext * /*C*/, BLI_assert(drag.drag_data.type == WM_DRAG_ASSET_CATALOG); return AssetCatalogDropTarget::drop_asset_catalog_into_catalog( drag.drag_data, - this->get_view(), + get_view(), /* No value to drop into the root level. */ std::nullopt); } @@ -677,11 +674,15 @@ bool AssetCatalogTreeViewUnassignedItem::DropTarget::on_drop(bContext *C, { /* Assign to nil catalog ID. */ return AssetCatalogDropTarget::drop_assets_into_catalog( - C, this->get_view(), drag.drag_data, CatalogID{}); + C, get_view(), drag.drag_data, CatalogID{}); } +} // namespace blender::ed::asset_browser + /* ---------------------------------------------------------------------- */ +namespace blender::ed::asset_browser { + class AssetCatalogFilterSettings { public: eFileSel_Params_AssetCatalogVisibility asset_catalog_visibility; @@ -690,22 +691,32 @@ class AssetCatalogFilterSettings { std::unique_ptr catalog_filter; }; -AssetCatalogFilterSettings *file_create_asset_catalog_filter_settings() +} // namespace blender::ed::asset_browser + +using namespace blender::ed::asset_browser; + +FileAssetCatalogFilterSettingsHandle *file_create_asset_catalog_filter_settings() { - return MEM_new(__func__); + AssetCatalogFilterSettings *filter_settings = MEM_new(__func__); + return reinterpret_cast(filter_settings); } -void file_delete_asset_catalog_filter_settings(AssetCatalogFilterSettings **filter_settings) +void file_delete_asset_catalog_filter_settings( + FileAssetCatalogFilterSettingsHandle **filter_settings_handle) { + AssetCatalogFilterSettings **filter_settings = reinterpret_cast( + filter_settings_handle); MEM_delete(*filter_settings); *filter_settings = nullptr; } bool file_set_asset_catalog_filter_settings( - AssetCatalogFilterSettings *filter_settings, + FileAssetCatalogFilterSettingsHandle *filter_settings_handle, eFileSel_Params_AssetCatalogVisibility catalog_visibility, - const ::bUUID &catalog_id) + ::bUUID catalog_id) { + AssetCatalogFilterSettings *filter_settings = reinterpret_cast( + filter_settings_handle); bool needs_update = false; if (filter_settings->asset_catalog_visibility != catalog_visibility) { @@ -723,20 +734,27 @@ bool file_set_asset_catalog_filter_settings( return needs_update; } -void file_ensure_updated_catalog_filter_data(AssetCatalogFilterSettings *filter_settings, - const asset_system::AssetLibrary *asset_library) +void file_ensure_updated_catalog_filter_data( + FileAssetCatalogFilterSettingsHandle *filter_settings_handle, + const asset_system::AssetLibrary *asset_library) { - const AssetCatalogService &catalog_service = asset_library->catalog_service(); + AssetCatalogFilterSettings *filter_settings = reinterpret_cast( + filter_settings_handle); + const AssetCatalogService *catalog_service = asset_library->catalog_service.get(); if (filter_settings->asset_catalog_visibility != FILE_SHOW_ASSETS_ALL_CATALOGS) { filter_settings->catalog_filter = std::make_unique( - catalog_service.create_catalog_filter(filter_settings->asset_catalog_id)); + catalog_service->create_catalog_filter(filter_settings->asset_catalog_id)); } } bool file_is_asset_visible_in_catalog_filter_settings( - const AssetCatalogFilterSettings *filter_settings, const AssetMetaData *asset_data) + const FileAssetCatalogFilterSettingsHandle *filter_settings_handle, + const AssetMetaData *asset_data) { + const AssetCatalogFilterSettings *filter_settings = + reinterpret_cast(filter_settings_handle); + switch (filter_settings->asset_catalog_visibility) { case FILE_SHOW_ASSETS_WITHOUT_CATALOG: return !filter_settings->catalog_filter->is_known(asset_data->catalog_id); @@ -770,5 +788,3 @@ void file_create_asset_catalog_tree_view_in_layout(asset_system::AssetLibrary *a ui::TreeViewBuilder::build_tree_view(*tree_view, *layout); } - -} // namespace blender::ed::asset_browser diff --git a/source/blender/editors/space_file/file_draw.cc b/source/blender/editors/space_file/file_draw.cc index 362b0018966..2a5a47ebeac 100644 --- a/source/blender/editors/space_file/file_draw.cc +++ b/source/blender/editors/space_file/file_draw.cc @@ -30,11 +30,11 @@ #include "BKE_blendfile.hh" #include "BKE_context.hh" -#include "BKE_report.hh" +#include "BKE_report.h" -#include "BLO_readfile.hh" +#include "BLO_readfile.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BLF_api.hh" @@ -392,9 +392,12 @@ static uiBut *file_add_icon_but(const SpaceFile *sfile, const int x = tile_draw_rect->xmin; const int y = tile_draw_rect->ymax - sfile->layout->tile_border_y - height; + /* For #uiDefIconBut(): if `a1==1.0` then a2 is alpha `0.0 - 1.0`. */ + const float a1 = dimmed ? 1.0f : 0.0f; + const float a2 = dimmed ? 0.3f : 0.0f; but = uiDefIconBut( - block, UI_BTYPE_LABEL, 0, icon, x, y, width, height, nullptr, 0.0f, 0.0f, nullptr); - UI_but_label_alpha_factor_set(but, dimmed ? 0.3f : 1.0f); + block, UI_BTYPE_LABEL, 0, icon, x, y, width, height, nullptr, 0.0f, 0.0f, a1, a2, nullptr); + if (file->asset) { UI_but_func_tooltip_set(but, file_draw_asset_tooltip_func, file->asset, nullptr); } @@ -531,6 +534,8 @@ static void file_add_preview_drag_but(const SpaceFile *sfile, nullptr, 0.0, 0.0, + 0, + 0, nullptr); file_but_enable_drag(but, sfile, file, path, preview_image, icon, scale); @@ -687,7 +692,7 @@ static void file_draw_preview(const FileList *files, float icon_x, icon_y; icon_x = xco + (2.0f * UI_SCALE_FAC); icon_y = yco + (2.0f * UI_SCALE_FAC); - const int arrow = is_link ? ICON_LOOP_FORWARDS : ICON_INTERNET; + const int arrow = is_link ? ICON_LOOP_FORWARDS : ICON_URL; if (!is_icon) { /* At very bottom-left if preview style. */ const uchar dark[4] = {0, 0, 0, 255}; @@ -1290,13 +1295,11 @@ void file_draw_list(const bContext *C, ARegion *region) nullptr, 0, 0, + 0, + 0, nullptr); UI_but_dragflag_enable(drag_but, UI_BUT_DRAG_FULL_BUT); file_but_enable_drag(drag_but, sfile, file, path, nullptr, icon, UI_SCALE_FAC); - UI_but_func_tooltip_custom_set(drag_but, - file_draw_tooltip_custom_func, - file_tooltip_data_create(sfile, file), - MEM_freeN); } } @@ -1334,6 +1337,8 @@ void file_draw_list(const bContext *C, ARegion *region) params->renamefile, 1.0f, float(sizeof(params->renamefile)), + 0, + 0, ""); UI_but_func_rename_set(but, renamebutton_cb, file); UI_but_flag_enable(but, UI_BUT_NO_UTF8); /* allow non utf8 names */ @@ -1418,7 +1423,7 @@ static void file_draw_invalid_asset_library_hint(const bContext *C, ARegion *region, FileAssetSelectParams *asset_params) { - char library_ui_path[FILE_MAX_LIBEXTRA]; + char library_ui_path[PATH_MAX]; file_path_to_ui_path(asset_params->base_params.dir, library_ui_path, sizeof(library_ui_path)); uchar text_col[4]; diff --git a/source/blender/editors/space_file/file_indexer.cc b/source/blender/editors/space_file/file_indexer.cc index d004a0b6d62..78d29856466 100644 --- a/source/blender/editors/space_file/file_indexer.cc +++ b/source/blender/editors/space_file/file_indexer.cc @@ -14,6 +14,7 @@ #include "BLI_linklist.h" #include "BLI_listbase.h" +#include "BLI_string.h" #include "BLI_utildefines.h" namespace blender::ed::file::indexer { diff --git a/source/blender/editors/space_file/file_intern.hh b/source/blender/editors/space_file/file_intern.hh index 44e822fcae8..381cc34eb8d 100644 --- a/source/blender/editors/space_file/file_intern.hh +++ b/source/blender/editors/space_file/file_intern.hh @@ -22,9 +22,6 @@ struct Main; struct SpaceFile; struct View2D; struct uiLayout; -namespace blender::asset_system { -class AssetLibrary; -} bool file_main_region_needs_refresh_before_draw(SpaceFile *sfile); @@ -227,29 +224,33 @@ void file_path_to_ui_path(const char *path, char *r_pathi, int max_size); /* asset_catalog_tree_view.cc */ -namespace blender::ed::asset_browser { +/* C-handle for #ed::asset_browser::AssetCatalogFilterSettings. */ +struct FileAssetCatalogFilterSettingsHandle; -void file_create_asset_catalog_tree_view_in_layout(asset_system::AssetLibrary *asset_library, - uiLayout *layout, - SpaceFile *space_file, - FileAssetSelectParams *params); +void file_create_asset_catalog_tree_view_in_layout( + blender::asset_system::AssetLibrary *asset_library, + uiLayout *layout, + SpaceFile *space_file, + FileAssetSelectParams *params); -class AssetCatalogFilterSettings; +namespace blender::asset_system { +class AssetLibrary; +} -AssetCatalogFilterSettings *file_create_asset_catalog_filter_settings(); +FileAssetCatalogFilterSettingsHandle *file_create_asset_catalog_filter_settings(); void file_delete_asset_catalog_filter_settings( - AssetCatalogFilterSettings **filter_settings_handle); + FileAssetCatalogFilterSettingsHandle **filter_settings_handle); /** * \return True if the file list should update its filtered results * (e.g. because filtering parameters changed). */ bool file_set_asset_catalog_filter_settings( - AssetCatalogFilterSettings *filter_settings_handle, + FileAssetCatalogFilterSettingsHandle *filter_settings_handle, eFileSel_Params_AssetCatalogVisibility catalog_visibility, - const ::bUUID &catalog_id); -void file_ensure_updated_catalog_filter_data(AssetCatalogFilterSettings *filter_settings_handle, - const asset_system::AssetLibrary *asset_library); + ::bUUID catalog_id); +void file_ensure_updated_catalog_filter_data( + FileAssetCatalogFilterSettingsHandle *filter_settings_handle, + const blender::asset_system::AssetLibrary *asset_library); bool file_is_asset_visible_in_catalog_filter_settings( - const AssetCatalogFilterSettings *filter_settings_handle, const AssetMetaData *asset_data); - -} // namespace blender::ed::asset_browser + const FileAssetCatalogFilterSettingsHandle *filter_settings_handle, + const AssetMetaData *asset_data); diff --git a/source/blender/editors/space_file/file_ops.cc b/source/blender/editors/space_file/file_ops.cc index 4d803e1fbf9..589fabec3fd 100644 --- a/source/blender/editors/space_file/file_ops.cc +++ b/source/blender/editors/space_file/file_ops.cc @@ -14,16 +14,18 @@ #include "BKE_appdir.hh" #include "BKE_blendfile.hh" #include "BKE_context.hh" +#include "BKE_global.h" #include "BKE_main.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "BKE_screen.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #ifdef WIN32 # include "BLI_winstuff.h" #endif +#include "ED_asset.hh" #include "ED_fileselect.hh" #include "ED_screen.hh" #include "ED_select_utils.hh" @@ -2698,15 +2700,6 @@ static int file_directory_new_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } -static int file_directory_new_invoke(bContext *C, wmOperator *op, const wmEvent * /*event*/) -{ - if (RNA_boolean_get(op->ptr, "confirm")) { - return WM_operator_confirm_ex( - C, op, IFACE_("Create new directory?"), nullptr, IFACE_("Create"), ALERT_ICON_NONE, false); - } - return file_directory_new_exec(C, op); -} - void FILE_OT_directory_new(wmOperatorType *ot) { PropertyRNA *prop; @@ -2717,7 +2710,7 @@ void FILE_OT_directory_new(wmOperatorType *ot) ot->idname = "FILE_OT_directory_new"; /* api callbacks */ - ot->invoke = file_directory_new_invoke; + ot->invoke = WM_operator_confirm_or_exec; ot->exec = file_directory_new_exec; /* File browsing only operator (not asset browsing). */ ot->poll = ED_operator_file_browsing_active; /* <- important, handler is on window level */ @@ -3195,12 +3188,6 @@ static int file_delete_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } -static int file_delete_invoke(bContext *C, wmOperator *op, const wmEvent * /*event*/) -{ - return WM_operator_confirm_ex( - C, op, IFACE_("Delete selected files?"), nullptr, IFACE_("Delete"), ALERT_ICON_NONE, false); -} - void FILE_OT_delete(wmOperatorType *ot) { /* identifiers */ @@ -3209,7 +3196,7 @@ void FILE_OT_delete(wmOperatorType *ot) ot->idname = "FILE_OT_delete"; /* api callbacks */ - ot->invoke = file_delete_invoke; + ot->invoke = WM_operator_confirm; ot->exec = file_delete_exec; ot->poll = file_delete_poll; /* <- important, handler is on window level */ } diff --git a/source/blender/editors/space_file/file_panels.cc b/source/blender/editors/space_file/file_panels.cc index 6b2275c21ab..ba1a436f48a 100644 --- a/source/blender/editors/space_file/file_panels.cc +++ b/source/blender/editors/space_file/file_panels.cc @@ -12,7 +12,7 @@ #include "BKE_context.hh" #include "BKE_screen.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_screen_types.h" #include "DNA_space_types.h" @@ -35,6 +35,7 @@ #include "file_intern.hh" #include "filelist.hh" +#include "fsmenu.h" #include @@ -251,8 +252,7 @@ static void file_panel_asset_catalog_buttons_draw(const bContext *C, Panel *pane uiItemS(col); - blender::ed::asset_browser::file_create_asset_catalog_tree_view_in_layout( - asset_library, col, sfile, params); + file_create_asset_catalog_tree_view_in_layout(asset_library, col, sfile, params); } void file_tools_region_panels_register(ARegionType *art) diff --git a/source/blender/editors/space_file/file_utils.cc b/source/blender/editors/space_file/file_utils.cc index 6b5d7501728..7b5cab46a85 100644 --- a/source/blender/editors/space_file/file_utils.cc +++ b/source/blender/editors/space_file/file_utils.cc @@ -6,13 +6,18 @@ * \ingroup spfile */ +#include "BLI_fileops.h" #include "BLI_path_util.h" #include "BLI_rect.h" #include "BLI_string.h" #include "BKE_blendfile.hh" +#include "BKE_context.hh" #include "ED_fileselect.hh" +#include "ED_screen.hh" + +#include "WM_types.hh" #include "file_intern.hh" @@ -31,7 +36,7 @@ void file_tile_boundbox(const ARegion *region, FileLayout *layout, const int fil void file_path_to_ui_path(const char *path, char *r_path, int max_size) { - char tmp_path[FILE_MAX_LIBEXTRA]; + char tmp_path[PATH_MAX]; STRNCPY(tmp_path, path); BLI_path_slash_rstrip(tmp_path); BLI_strncpy(r_path, BKE_blendfile_extension_check(tmp_path) ? tmp_path : path, max_size); diff --git a/source/blender/editors/space_file/filelist.cc b/source/blender/editors/space_file/filelist.cc index 5a6300322cd..04fcd9217c6 100644 --- a/source/blender/editors/space_file/filelist.cc +++ b/source/blender/editors/space_file/filelist.cc @@ -40,6 +40,7 @@ #include "BLI_string_utils.hh" #include "BLI_task.h" #include "BLI_threads.h" +#include "BLI_time.h" #include "BLI_utildefines.h" #include "BLI_uuid.h" @@ -50,10 +51,12 @@ #include "BKE_asset.hh" #include "BKE_blendfile.hh" #include "BKE_context.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_icons.h" #include "BKE_idtype.hh" +#include "BKE_lib_id.hh" #include "BKE_main.hh" +#include "BKE_main_idmap.hh" #include "BKE_preferences.h" #include "BKE_preview_image.hh" @@ -62,6 +65,7 @@ #include "ED_datafiles.h" #include "ED_fileselect.hh" +#include "ED_screen.hh" #include "IMB_imbuf.hh" #include "IMB_imbuf_types.hh" @@ -193,7 +197,7 @@ struct FileListFilter { char filter_search[66]; /* + 2 for heading/trailing implicit '*' wildcards. */ short flags; - blender::ed::asset_browser::AssetCatalogFilterSettings *asset_catalog_filter; + FileAssetCatalogFilterSettingsHandle *asset_catalog_filter; }; /** #FileListFilter.flags */ @@ -1034,8 +1038,7 @@ void filelist_set_asset_catalog_filter_options( { if (!filelist->filter_data.asset_catalog_filter) { /* There's no filter data yet. */ - filelist->filter_data.asset_catalog_filter = - blender::ed::asset_browser::file_create_asset_catalog_filter_settings(); + filelist->filter_data.asset_catalog_filter = file_create_asset_catalog_filter_settings(); } const bool needs_update = file_set_asset_catalog_filter_settings( diff --git a/source/blender/editors/space_file/filesel.cc b/source/blender/editors/space_file/filesel.cc index dda186661c2..9d6de11346d 100644 --- a/source/blender/editors/space_file/filesel.cc +++ b/source/blender/editors/space_file/filesel.cc @@ -37,9 +37,9 @@ #include "BLI_math_base.h" #include "BLI_utildefines.h" -#include "BLO_userdef_default.h" +#include "BLO_readfile.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_appdir.hh" #include "BKE_context.hh" diff --git a/source/blender/editors/space_file/fsmenu.cc b/source/blender/editors/space_file/fsmenu.cc index 03fc3ca87ff..2d70206177e 100644 --- a/source/blender/editors/space_file/fsmenu.cc +++ b/source/blender/editors/space_file/fsmenu.cc @@ -15,15 +15,17 @@ #include "MEM_guardedalloc.h" #include "BLI_blenlib.h" +#include "BLI_ghash.h" #include "BLI_string_utils.hh" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_appdir.hh" #include "ED_fileselect.hh" +#include "UI_interface_icons.hh" #include "UI_resources.hh" #include "WM_api.hh" #include "WM_types.hh" diff --git a/source/blender/editors/space_file/fsmenu_system.cc b/source/blender/editors/space_file/fsmenu_system.cc index baf306a0a9f..3d2213f087b 100644 --- a/source/blender/editors/space_file/fsmenu_system.cc +++ b/source/blender/editors/space_file/fsmenu_system.cc @@ -18,17 +18,18 @@ #include "BLI_listbase.h" #include "BLI_path_util.h" #include "BLI_string.h" +#include "BLI_string_utf8.h" #include "BLI_utildefines.h" #include "DNA_userdef_types.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" + +#include "BKE_appdir.hh" #include "ED_fileselect.hh" #ifdef WIN32 -# include "BLI_string_utf8.h" /* For `BLI_strncpy_wchar_as_utf8`. */ - /* Need to include windows.h so _WIN32_IE is defined. */ # include /* For SHGetSpecialFolderPath, has to be done before BLI_winstuff @@ -370,7 +371,7 @@ void fsmenu_read_system(FSMenu *fsmenu, int read_bookmarks) FS_CATEGORY_SYSTEM_BOOKMARKS, FOLDERID_SkyDrive, N_("OneDrive"), - ICON_INTERNET, + ICON_URL, FS_INSERT_LAST); /* These items are just put in path cache for thumbnail views and if bookmarked. */ diff --git a/source/blender/editors/space_file/space_file.cc b/source/blender/editors/space_file/space_file.cc index 6c0d65a2c97..ba3ddcaa44c 100644 --- a/source/blender/editors/space_file/space_file.cc +++ b/source/blender/editors/space_file/space_file.cc @@ -12,14 +12,16 @@ #include "MEM_guardedalloc.h" #include "BLI_blenlib.h" +#include "BLI_linklist.h" #include "BLI_utildefines.h" #include "BKE_appdir.hh" #include "BKE_context.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_lib_query.hh" +#include "BKE_lib_remap.hh" #include "BKE_main.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "BKE_screen.hh" #include "RNA_access.hh" @@ -36,6 +38,7 @@ #include "ED_screen.hh" #include "ED_space_api.hh" +#include "IMB_imbuf_types.hh" #include "IMB_thumbs.hh" #include "UI_resources.hh" @@ -43,6 +46,7 @@ #include "BLO_read_write.hh" +#include "GPU_framebuffer.h" #include "file_indexer.hh" #include "file_intern.hh" /* own include */ #include "filelist.hh" @@ -827,9 +831,7 @@ static void file_space_subtype_item_extend(bContext * /*C*/, EnumPropertyItem ** RNA_enum_items_add(item, totitem, rna_enum_space_file_browse_mode_items); } -static void file_id_remap(ScrArea *area, - SpaceLink *sl, - const blender::bke::id::IDRemapper & /*mappings*/) +static void file_id_remap(ScrArea *area, SpaceLink *sl, const IDRemapper * /*mappings*/) { SpaceFile *sfile = (SpaceFile *)sl; diff --git a/source/blender/editors/space_graph/graph_buttons.cc b/source/blender/editors/space_graph/graph_buttons.cc index 0dea3e22e74..4d433c7041b 100644 --- a/source/blender/editors/space_graph/graph_buttons.cc +++ b/source/blender/editors/space_graph/graph_buttons.cc @@ -23,14 +23,15 @@ #include "BLI_math_rotation.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" -#include "BKE_anim_data.hh" +#include "BKE_anim_data.h" #include "BKE_context.hh" #include "BKE_curve.hh" -#include "BKE_fcurve.hh" +#include "BKE_fcurve.h" #include "BKE_fcurve_driver.h" -#include "BKE_global.hh" +#include "BKE_global.h" +#include "BKE_main.hh" #include "BKE_screen.hh" #include "BKE_unit.hh" @@ -45,6 +46,7 @@ #include "RNA_prototypes.h" #include "ED_anim_api.hh" +#include "ED_keyframing.hh" #include "ED_screen.hh" #include "ED_undo.hh" @@ -617,15 +619,15 @@ static void do_graph_region_driver_buttons(bContext *C, void *id_v, int event) ID *id = static_cast(id_v); AnimData *adt = BKE_animdata_from_id(id); - /* Rebuild depsgraph for the new dependencies, and ensure evaluated copies get flushed. */ + /* Rebuild depsgraph for the new dependencies, and ensure COW copies get flushed. */ DEG_relations_tag_update(bmain); - DEG_id_tag_update_ex(bmain, id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update_ex(bmain, id, ID_RECALC_COPY_ON_WRITE); if (adt != nullptr) { if (adt->action != nullptr) { - DEG_id_tag_update_ex(bmain, &adt->action->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update_ex(bmain, &adt->action->id, ID_RECALC_COPY_ON_WRITE); } if (adt->tmpact != nullptr) { - DEG_id_tag_update_ex(bmain, &adt->tmpact->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update_ex(bmain, &adt->tmpact->id, ID_RECALC_COPY_ON_WRITE); } } @@ -1105,6 +1107,8 @@ static void graph_draw_driver_settings_panel(uiLayout *layout, nullptr, 0.0, 0.0, + 0, + 0, TIP_("Add a Driver Variable to keep track of an input used by the driver")); UI_but_func_set(but, driver_add_var_cb, driver, nullptr); @@ -1174,6 +1178,8 @@ static void graph_draw_driver_settings_panel(uiLayout *layout, nullptr, 0.0, 0.0, + 0.0, + 0.0, TIP_("Invalid variable name, click here for details")); UI_but_func_set(but, driver_dvar_invalid_name_query_cb, dvar, nullptr); /* XXX: reports? */ } @@ -1190,6 +1196,8 @@ static void graph_draw_driver_settings_panel(uiLayout *layout, nullptr, 0.0, 0.0, + 0.0, + 0.0, TIP_("Delete target variable")); UI_but_func_set(but, driver_delete_var_cb, driver, dvar); UI_block_emboss_set(block, UI_EMBOSS); @@ -1265,6 +1273,8 @@ static void graph_draw_driver_settings_panel(uiLayout *layout, nullptr, 0.0, 0.0, + 0, + 0, TIP_("Force updates of dependencies - Only use this if drivers are not updating correctly")); UI_but_func_set(but, driver_update_flags_cb, fcu, nullptr); } diff --git a/source/blender/editors/space_graph/graph_draw.cc b/source/blender/editors/space_graph/graph_draw.cc index af480138b9f..8d117432a7a 100644 --- a/source/blender/editors/space_graph/graph_draw.cc +++ b/source/blender/editors/space_graph/graph_draw.cc @@ -11,6 +11,7 @@ #include #include +#include "BLI_blenlib.h" #include "BLI_math_vector_types.hh" #include "BLI_utildefines.h" #include "BLI_vector.hh" @@ -19,10 +20,13 @@ #include "DNA_screen_types.h" #include "DNA_space_types.h" #include "DNA_userdef_types.h" +#include "DNA_windowmanager_types.h" -#include "BKE_anim_data.hh" +#include "BKE_action.h" +#include "BKE_anim_data.h" +#include "BKE_context.hh" #include "BKE_curve.hh" -#include "BKE_fcurve.hh" +#include "BKE_fcurve.h" #include "BKE_nla.h" #include "GPU_immediate.h" diff --git a/source/blender/editors/space_graph/graph_edit.cc b/source/blender/editors/space_graph/graph_edit.cc index a7542ac6e24..a16a3f2a382 100644 --- a/source/blender/editors/space_graph/graph_edit.cc +++ b/source/blender/editors/space_graph/graph_edit.cc @@ -21,6 +21,7 @@ #include "BLI_blenlib.h" #include "BLI_math_rotation.h" +#include "BLI_math_vector.h" #include "BLI_utildefines.h" #include "DNA_anim_types.h" @@ -31,19 +32,19 @@ #include "RNA_enum_types.hh" #include "RNA_prototypes.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_animsys.h" #include "BKE_context.hh" -#include "BKE_fcurve.hh" -#include "BKE_global.hh" +#include "BKE_fcurve.h" +#include "BKE_global.h" #include "BKE_nla.h" -#include "BKE_report.hh" -#include "BKE_scene.hh" +#include "BKE_report.h" +#include "BKE_scene.h" #include "DEG_depsgraph_build.hh" -#include "UI_interface_icons.hh" +#include "UI_interface.hh" #include "UI_view2d.hh" #include "ANIM_animdata.hh" @@ -802,20 +803,6 @@ static int graphkeys_delete_exec(bContext *C, wmOperator * /*op*/) return OPERATOR_FINISHED; } -static int graphkeys_delete_invoke(bContext *C, wmOperator *op, const wmEvent * /*event*/) -{ - if (RNA_boolean_get(op->ptr, "confirm")) { - return WM_operator_confirm_ex(C, - op, - IFACE_("Delete selected keyframes?"), - nullptr, - IFACE_("Delete"), - ALERT_ICON_NONE, - false); - } - return graphkeys_delete_exec(C, op); -} - void GRAPH_OT_delete(wmOperatorType *ot) { /* Identifiers */ @@ -824,7 +811,7 @@ void GRAPH_OT_delete(wmOperatorType *ot) ot->description = "Remove all selected keyframes"; /* API callbacks */ - ot->invoke = graphkeys_delete_invoke; + ot->invoke = WM_operator_confirm_or_exec; ot->exec = graphkeys_delete_exec; ot->poll = graphop_editable_keyframes_poll; @@ -982,20 +969,6 @@ static int graphkeys_keys_to_samples_exec(bContext *C, wmOperator * /*op*/) return OPERATOR_FINISHED; } -static int graphkeys_keys_to_samples_invoke(bContext *C, wmOperator *op, const wmEvent * /*event*/) -{ - if (RNA_boolean_get(op->ptr, "confirm")) { - return WM_operator_confirm_ex(C, - op, - IFACE_("Convert selected keys to samples?"), - nullptr, - IFACE_("Convert"), - ALERT_ICON_NONE, - false); - } - return graphkeys_keys_to_samples_exec(C, op); -} - void GRAPH_OT_keys_to_samples(wmOperatorType *ot) { /* Identifiers */ @@ -1005,7 +978,7 @@ void GRAPH_OT_keys_to_samples(wmOperatorType *ot) "Convert selected channels to an uneditable set of samples to save storage space"; /* API callbacks */ - ot->invoke = graphkeys_keys_to_samples_invoke; + ot->invoke = WM_operator_confirm_or_exec; ot->exec = graphkeys_keys_to_samples_exec; ot->poll = graphop_selected_fcurve_poll; diff --git a/source/blender/editors/space_graph/graph_ops.cc b/source/blender/editors/space_graph/graph_ops.cc index f205d144287..0b01c62e01e 100644 --- a/source/blender/editors/space_graph/graph_ops.cc +++ b/source/blender/editors/space_graph/graph_ops.cc @@ -11,16 +11,18 @@ #include "DNA_scene_types.h" +#include "BLI_blenlib.h" #include "BLI_math_base.h" #include "BLI_utildefines.h" #include "BKE_context.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "UI_view2d.hh" #include "ED_anim_api.hh" #include "ED_screen.hh" +#include "ED_transform.hh" #include "graph_intern.h" diff --git a/source/blender/editors/space_graph/graph_select.cc b/source/blender/editors/space_graph/graph_select.cc index 61261ea4674..c8ec51e750b 100644 --- a/source/blender/editors/space_graph/graph_select.cc +++ b/source/blender/editors/space_graph/graph_select.cc @@ -13,7 +13,8 @@ #include "MEM_guardedalloc.h" -#include "BLI_lasso_2d.hh" +#include "BLI_blenlib.h" +#include "BLI_lasso_2d.h" #include "BLI_math_vector.h" #include "BLI_utildefines.h" @@ -25,7 +26,8 @@ #include "RNA_access.hh" #include "RNA_define.hh" -#include "BKE_fcurve.hh" +#include "BKE_context.hh" +#include "BKE_fcurve.h" #include "BKE_nla.h" #include "UI_interface_c.hh" @@ -571,7 +573,7 @@ static void initialize_box_select_key_editing_data(const bool incl_handles, r_ked->iterflags |= KEYFRAME_ITER_HANDLES_DEFAULT_INVISIBLE; } - /* Enable handles selection. (used in keyframes_edit.cc > keyframe_ok_checks function) */ + /* Enable handles selection. (used in keyframes_edit.cc > KEYFRAME_OK_CHECKS macro) */ if (incl_handles) { r_ked->iterflags |= KEYFRAME_ITER_INCL_HANDLES; *r_mapping_flag = 0; @@ -954,7 +956,7 @@ static int graphkeys_lassoselect_exec(bContext *C, wmOperator *op) { bAnimContext ac; - KeyframeEdit_LassoData data_lasso{}; + KeyframeEdit_LassoData data_lasso = {nullptr}; rcti rect; rctf rect_fl; @@ -966,8 +968,8 @@ static int graphkeys_lassoselect_exec(bContext *C, wmOperator *op) } data_lasso.rectf_view = &rect_fl; - data_lasso.mcoords = WM_gesture_lasso_path_to_array(C, op); - if (data_lasso.mcoords.is_empty()) { + data_lasso.mcoords = WM_gesture_lasso_path_to_array(C, op, &data_lasso.mcoords_len); + if (data_lasso.mcoords == nullptr) { return OPERATOR_CANCELLED; } @@ -988,7 +990,7 @@ static int graphkeys_lassoselect_exec(bContext *C, wmOperator *op) } /* Get settings from operator. */ - BLI_lasso_boundbox(&rect, data_lasso.mcoords); + BLI_lasso_boundbox(&rect, data_lasso.mcoords, data_lasso.mcoords_len); BLI_rctf_rcti_copy(&rect_fl, &rect); /* Apply box_select action. */ @@ -1000,6 +1002,8 @@ static int graphkeys_lassoselect_exec(bContext *C, wmOperator *op) &ac, &rect_fl, BEZT_OK_REGION_LASSO, selectmode, incl_handles, &data_lasso); } + MEM_freeN((void *)data_lasso.mcoords); + /* Send notifier that keyframe selection has changed. */ WM_event_add_notifier(C, NC_ANIMATION | ND_KEYFRAME | NA_SELECTED, nullptr); diff --git a/source/blender/editors/space_graph/graph_slider_ops.cc b/source/blender/editors/space_graph/graph_slider_ops.cc index 5b5bc3ab59c..363a882194b 100644 --- a/source/blender/editors/space_graph/graph_slider_ops.cc +++ b/source/blender/editors/space_graph/graph_slider_ops.cc @@ -27,7 +27,7 @@ #include "RNA_access.hh" #include "RNA_define.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_context.hh" diff --git a/source/blender/editors/space_graph/graph_utils.cc b/source/blender/editors/space_graph/graph_utils.cc index ed91f986c10..40334123c67 100644 --- a/source/blender/editors/space_graph/graph_utils.cc +++ b/source/blender/editors/space_graph/graph_utils.cc @@ -17,14 +17,17 @@ #include "MEM_guardedalloc.h" +#include "BLI_blenlib.h" + #include "BKE_context.hh" -#include "BKE_fcurve.hh" +#include "BKE_fcurve.h" #include "BKE_screen.hh" #include "ED_anim_api.hh" #include "ED_screen.hh" #include "UI_interface.hh" +#include "RNA_access.hh" #include "RNA_prototypes.h" #include "graph_intern.h" /* own include */ diff --git a/source/blender/editors/space_graph/graph_view.cc b/source/blender/editors/space_graph/graph_view.cc index eadc00c1876..e7196038497 100644 --- a/source/blender/editors/space_graph/graph_view.cc +++ b/source/blender/editors/space_graph/graph_view.cc @@ -21,9 +21,10 @@ #include "RNA_define.hh" #include "BKE_context.hh" -#include "BKE_fcurve.hh" +#include "BKE_fcurve.h" #include "BKE_nla.h" +#include "UI_interface.hh" #include "UI_view2d.hh" #include "ED_anim_api.hh" diff --git a/source/blender/editors/space_graph/space_graph.cc b/source/blender/editors/space_graph/space_graph.cc index efdb71072af..e616d84dc9f 100644 --- a/source/blender/editors/space_graph/space_graph.cc +++ b/source/blender/editors/space_graph/space_graph.cc @@ -20,7 +20,7 @@ #include "BLI_utildefines.h" #include "BKE_context.hh" -#include "BKE_fcurve.hh" +#include "BKE_fcurve.h" #include "BKE_lib_query.hh" #include "BKE_lib_remap.hh" #include "BKE_screen.hh" @@ -31,6 +31,7 @@ #include "ED_space_api.hh" #include "ED_time_scrub_ui.hh" +#include "GPU_framebuffer.h" #include "GPU_immediate.h" #include "GPU_state.h" @@ -812,17 +813,15 @@ static void graph_refresh(const bContext *C, ScrArea *area) graph_refresh_fcurve_colors(C); } -static void graph_id_remap(ScrArea * /*area*/, - SpaceLink *slink, - const blender::bke::id::IDRemapper &mappings) +static void graph_id_remap(ScrArea * /*area*/, SpaceLink *slink, const IDRemapper *mappings) { SpaceGraph *sgraph = (SpaceGraph *)slink; if (!sgraph->ads) { return; } - mappings.apply(reinterpret_cast(&sgraph->ads->filter_grp), ID_REMAP_APPLY_DEFAULT); - mappings.apply(reinterpret_cast(&sgraph->ads->source), ID_REMAP_APPLY_DEFAULT); + BKE_id_remapper_apply(mappings, (ID **)&sgraph->ads->filter_grp, ID_REMAP_APPLY_DEFAULT); + BKE_id_remapper_apply(mappings, (ID **)&sgraph->ads->source, ID_REMAP_APPLY_DEFAULT); } static void graph_foreach_id(SpaceLink *space_link, LibraryForeachIDData *data) diff --git a/source/blender/editors/space_image/image_buttons.cc b/source/blender/editors/space_image/image_buttons.cc index 3da057bc197..3e0feb4a9ac 100644 --- a/source/blender/editors/space_image/image_buttons.cc +++ b/source/blender/editors/space_image/image_buttons.cc @@ -17,12 +17,13 @@ #include "BLI_blenlib.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_context.hh" #include "BKE_image.h" #include "BKE_image_format.h" -#include "BKE_node.hh" +#include "BKE_node.h" +#include "BKE_scene.h" #include "BKE_screen.hh" #include "RE_pipeline.h" @@ -31,6 +32,7 @@ #include "IMB_imbuf.hh" #include "IMB_imbuf_types.hh" +#include "ED_gpencil_legacy.hh" #include "ED_image.hh" #include "ED_screen.hh" @@ -88,6 +90,8 @@ static void ui_imageuser_slot_menu(bContext * /*C*/, uiLayout *layout, void *ima &image->render_slot, float(slot_id), 0.0, + 0, + -1, ""); } @@ -103,6 +107,8 @@ static void ui_imageuser_slot_menu(bContext * /*C*/, uiLayout *layout, void *ima nullptr, 0.0, 0.0, + 0, + 0, ""); } @@ -178,6 +184,8 @@ static void ui_imageuser_layer_menu(bContext * /*C*/, uiLayout *layout, void *rn &iuser->layer, 0.0, 0.0, + 0, + -1, ""); } @@ -194,6 +202,8 @@ static void ui_imageuser_layer_menu(bContext * /*C*/, uiLayout *layout, void *rn &iuser->layer, float(nr), 0.0, + 0, + -1, ""); } @@ -209,6 +219,8 @@ static void ui_imageuser_layer_menu(bContext * /*C*/, uiLayout *layout, void *rn nullptr, 0.0, 0.0, + 0, + 0, ""); BKE_image_release_renderresult(scene, image); @@ -266,6 +278,8 @@ static void ui_imageuser_pass_menu(bContext * /*C*/, uiLayout *layout, void *rnd &iuser->pass, float(nr), 0.0, + 0, + -1, ""); } @@ -281,6 +295,8 @@ static void ui_imageuser_pass_menu(bContext * /*C*/, uiLayout *layout, void *rnd nullptr, 0.0, 0.0, + 0, + 0, ""); BLI_freelistN(&added_passes); @@ -320,6 +336,8 @@ static void ui_imageuser_view_menu_rr(bContext * /*C*/, uiLayout *layout, void * nullptr, 0.0, 0.0, + 0, + 0, ""); uiItemS(layout); @@ -339,6 +357,8 @@ static void ui_imageuser_view_menu_rr(bContext * /*C*/, uiLayout *layout, void * &iuser->view, float(nr), 0.0, + 0, + -1, ""); } @@ -368,6 +388,8 @@ static void ui_imageuser_view_menu_multiview(bContext * /*C*/, uiLayout *layout, nullptr, 0.0, 0.0, + 0, + 0, ""); uiItemS(layout); @@ -385,6 +407,8 @@ static void ui_imageuser_view_menu_multiview(bContext * /*C*/, uiLayout *layout, &iuser->view, float(nr), 0.0, + 0, + -1, ""); } } diff --git a/source/blender/editors/space_image/image_edit.cc b/source/blender/editors/space_image/image_edit.cc index 35b734510c2..7f39bb91ee4 100644 --- a/source/blender/editors/space_image/image_edit.cc +++ b/source/blender/editors/space_image/image_edit.cc @@ -17,15 +17,17 @@ #include "BKE_colortools.hh" #include "BKE_context.hh" #include "BKE_editmesh.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_image.h" #include "BKE_layer.hh" #include "BKE_lib_id.hh" #include "BKE_main.hh" -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "IMB_imbuf_types.hh" +#include "DEG_depsgraph.hh" + #include "ED_image.hh" /* own include */ #include "ED_mesh.hh" #include "ED_screen.hh" diff --git a/source/blender/editors/space_image/image_ops.cc b/source/blender/editors/space_image/image_ops.cc index 8c4f3ad9198..fbc1057e7f1 100644 --- a/source/blender/editors/space_image/image_ops.cc +++ b/source/blender/editors/space_image/image_ops.cc @@ -26,7 +26,7 @@ #include "BLI_time.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_camera_types.h" #include "DNA_node_types.h" @@ -36,23 +36,27 @@ #include "BKE_colortools.hh" #include "BKE_context.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_icons.h" #include "BKE_image.h" +#include "BKE_image_format.h" #include "BKE_image_save.h" #include "BKE_layer.hh" #include "BKE_lib_id.hh" #include "BKE_main.hh" #include "BKE_packedFile.h" -#include "BKE_report.hh" -#include "BKE_scene.hh" +#include "BKE_report.h" +#include "BKE_scene.h" #include "DEG_depsgraph.hh" +#include "GPU_state.h" + #include "IMB_colormanagement.hh" #include "IMB_imbuf.hh" #include "IMB_imbuf_types.hh" #include "IMB_moviecache.hh" +#include "IMB_openexr.hh" #include "RE_pipeline.h" @@ -66,6 +70,7 @@ #include "ED_paint.hh" #include "ED_render.hh" #include "ED_screen.hh" +#include "ED_space_api.hh" #include "ED_undo.hh" #include "ED_util.hh" #include "ED_util_imbuf.hh" @@ -536,7 +541,7 @@ static void image_view_zoom_init(bContext *C, wmOperator *op, const wmEvent *eve if (U.viewzoom == USER_ZOOM_CONTINUE) { /* needs a timer to continue redrawing */ vpd->timer = WM_event_timer_add(CTX_wm_manager(C), CTX_wm_window(C), TIMER, 0.01f); - vpd->timer_lastdraw = BLI_time_now_seconds(); + vpd->timer_lastdraw = BLI_check_seconds_timer(); } vpd->sima = sima; @@ -646,7 +651,7 @@ static void image_zoom_apply(ViewZoomData *vpd, } if (viewzoom == USER_ZOOM_CONTINUE) { - double time = BLI_time_now_seconds(); + double time = BLI_check_seconds_timer(); float time_step = float(time - vpd->timer_lastdraw); float zfac; zfac = 1.0f + ((delta / 20.0f) * time_step); @@ -2683,8 +2688,7 @@ void IMAGE_OT_new(wmOperatorType *ot) ot->flag = OPTYPE_UNDO; /* properties */ - ot->prop = RNA_def_string( - ot->srna, "name", IMA_DEF_NAME, MAX_ID_NAME - 2, "Name", "Image data-block name"); + RNA_def_string(ot->srna, "name", IMA_DEF_NAME, MAX_ID_NAME - 2, "Name", "Image data-block name"); prop = RNA_def_int(ot->srna, "width", 1024, 1, INT_MAX, "Width", "Image width", 1, 16384); RNA_def_property_subtype(prop, PROP_PIXEL); prop = RNA_def_int(ot->srna, "height", 1024, 1, INT_MAX, "Height", "Image height", 1, 16384); @@ -3173,8 +3177,7 @@ static int image_scale_invoke(bContext *C, wmOperator *op, const wmEvent * /*eve RNA_property_int_set_array(op->ptr, prop, size); BKE_image_release_ibuf(ima, ibuf, nullptr); } - return WM_operator_props_dialog_popup( - C, op, 200, IFACE_("Scale Image to New Size"), IFACE_("Resize")); + return WM_operator_props_dialog_popup(C, op, 200); } static int image_scale_exec(bContext *C, wmOperator *op) @@ -3999,7 +4002,7 @@ static int render_border_exec(bContext *C, wmOperator *op) scene->r.mode |= R_BORDER; } - DEG_id_tag_update(&scene->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&scene->id, ID_RECALC_COPY_ON_WRITE); WM_event_add_notifier(C, NC_SCENE | ND_RENDER_OPTIONS, nullptr); return OPERATOR_FINISHED; @@ -4213,7 +4216,7 @@ static int tile_add_invoke(bContext *C, wmOperator *op, const wmEvent * /*event* RNA_int_set(op->ptr, "count", 1); RNA_string_set(op->ptr, "label", ""); - return WM_operator_props_dialog_popup(C, op, 300, IFACE_("Add Tile to Image"), IFACE_("Add")); + return WM_operator_props_dialog_popup(C, op, 300); } static void tile_add_draw(bContext * /*C*/, wmOperator *op) @@ -4346,8 +4349,7 @@ static int tile_fill_invoke(bContext *C, wmOperator *op, const wmEvent * /*event { tile_fill_init(op->ptr, CTX_data_edit_image(C), nullptr); - return WM_operator_props_dialog_popup( - C, op, 300, IFACE_("Fill Tile With Generated Image"), IFACE_("Fill")); + return WM_operator_props_dialog_popup(C, op, 300); } static void tile_fill_draw(bContext * /*C*/, wmOperator *op) diff --git a/source/blender/editors/space_image/image_sequence.cc b/source/blender/editors/space_image/image_sequence.cc index c08c6501007..d2a8c8399fc 100644 --- a/source/blender/editors/space_image/image_sequence.cc +++ b/source/blender/editors/space_image/image_sequence.cc @@ -10,6 +10,7 @@ #include "MEM_guardedalloc.h" +#include "BLI_fileops.h" #include "BLI_fileops_types.h" #include "BLI_listbase.h" #include "BLI_math_base.h" diff --git a/source/blender/editors/space_image/space_image.cc b/source/blender/editors/space_image/space_image.cc index a2004fb3bd0..567f34f7e33 100644 --- a/source/blender/editors/space_image/space_image.cc +++ b/source/blender/editors/space_image/space_image.cc @@ -22,6 +22,7 @@ #include "BKE_context.hh" #include "BKE_image.h" #include "BKE_layer.hh" +#include "BKE_lib_id.hh" #include "BKE_lib_query.hh" #include "BKE_lib_remap.hh" #include "BKE_screen.hh" @@ -30,6 +31,8 @@ #include "RNA_define.hh" #include "RNA_enum_types.hh" +#include "DEG_depsgraph.hh" + #include "IMB_imbuf_types.hh" #include "ED_image.hh" @@ -101,7 +104,6 @@ static SpaceLink *image_create(const ScrArea * /*area*/, const Scene * /*scene*/ simage->lock = true; simage->flag = SI_SHOW_GPENCIL | SI_USE_ALPHA | SI_COORDFLOATS; simage->uv_opacity = 1.0f; - simage->stretch_opacity = 1.0f; simage->overlay.flag = SI_OVERLAY_SHOW_OVERLAYS | SI_OVERLAY_SHOW_GRID_BACKGROUND; BKE_imageuser_default(&simage->iuser); @@ -1007,19 +1009,19 @@ static void image_header_region_listener(const wmRegionListenerParams *params) } } -static void image_id_remap(ScrArea * /*area*/, - SpaceLink *slink, - const blender::bke::id::IDRemapper &mappings) +static void image_id_remap(ScrArea * /*area*/, SpaceLink *slink, const IDRemapper *mappings) { SpaceImage *simg = (SpaceImage *)slink; - if (!mappings.contains_mappings_for_any(FILTER_ID_IM | FILTER_ID_GD_LEGACY | FILTER_ID_MSK)) { + if (!BKE_id_remapper_has_mapping_for(mappings, + FILTER_ID_IM | FILTER_ID_GD_LEGACY | FILTER_ID_MSK)) + { return; } - mappings.apply(reinterpret_cast(&simg->image), ID_REMAP_APPLY_ENSURE_REAL); - mappings.apply(reinterpret_cast(&simg->gpd), ID_REMAP_APPLY_UPDATE_REFCOUNT); - mappings.apply(reinterpret_cast(&simg->mask_info.mask), ID_REMAP_APPLY_ENSURE_REAL); + BKE_id_remapper_apply(mappings, (ID **)&simg->image, ID_REMAP_APPLY_ENSURE_REAL); + BKE_id_remapper_apply(mappings, (ID **)&simg->gpd, ID_REMAP_APPLY_UPDATE_REFCOUNT); + BKE_id_remapper_apply(mappings, (ID **)&simg->mask_info.mask, ID_REMAP_APPLY_ENSURE_REAL); } static void image_foreach_id(SpaceLink *space_link, LibraryForeachIDData *data) diff --git a/source/blender/editors/space_info/info_draw.cc b/source/blender/editors/space_info/info_draw.cc index 5ee03d5b2dc..b0312941bbe 100644 --- a/source/blender/editors/space_info/info_draw.cc +++ b/source/blender/editors/space_info/info_draw.cc @@ -12,8 +12,9 @@ #include "BLI_utildefines.h" #include "DNA_screen_types.h" +#include "DNA_space_types.h" -#include "BKE_report.hh" +#include "BKE_report.h" #include "UI_interface.hh" #include "UI_resources.hh" diff --git a/source/blender/editors/space_info/info_ops.cc b/source/blender/editors/space_info/info_ops.cc index 14636264cc2..a23eb42a71c 100644 --- a/source/blender/editors/space_info/info_ops.cc +++ b/source/blender/editors/space_info/info_ops.cc @@ -15,18 +15,19 @@ #include "MEM_guardedalloc.h" #include "BLI_blenlib.h" +#include "BLI_math_vector.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" -#include "BKE_bpath.hh" +#include "BKE_bpath.h" #include "BKE_context.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_image.h" #include "BKE_lib_id.hh" #include "BKE_main.hh" #include "BKE_packedFile.h" -#include "BKE_report.hh" +#include "BKE_report.h" #include "BKE_screen.hh" #include "WM_api.hh" @@ -87,13 +88,8 @@ static int unpack_libraries_exec(bContext *C, wmOperator *op) static int unpack_libraries_invoke(bContext *C, wmOperator *op, const wmEvent * /*event*/) { - return WM_operator_confirm_ex(C, - op, - IFACE_("Restore Packed Linked Data to Their Original Locations"), - IFACE_("Will create directories so that all paths are valid."), - IFACE_("Unpack"), - ALERT_ICON_INFO, - false); + return WM_operator_confirm_message( + C, op, "Unpack Linked Libraries - creates directories, all new paths should work"); } void FILE_OT_unpack_libraries(wmOperatorType *ot) @@ -176,14 +172,8 @@ static int pack_all_invoke(bContext *C, wmOperator *op, const wmEvent * /*event* } if (ima) { - return WM_operator_confirm_ex( - C, - op, - IFACE_("Pack all used external files into this .blend file"), - IFACE_("Warning: Some images are modified and these changes will be lost."), - IFACE_("Pack"), - ALERT_ICON_WARNING, - false); + return WM_operator_confirm_message( + C, op, "Some images are painted on. These changes will be lost. Continue?"); } return pack_all_exec(C, op); diff --git a/source/blender/editors/space_info/info_report.cc b/source/blender/editors/space_info/info_report.cc index 2aa3b256670..481f40df6ca 100644 --- a/source/blender/editors/space_info/info_report.cc +++ b/source/blender/editors/space_info/info_report.cc @@ -12,6 +12,7 @@ #include "MEM_guardedalloc.h" +#include "BLI_blenlib.h" #include "BLI_dynstr.h" #include "BLI_utildefines.h" diff --git a/source/blender/editors/space_info/info_stats.cc b/source/blender/editors/space_info/info_stats.cc index 3074cf397c2..adc48915562 100644 --- a/source/blender/editors/space_info/info_stats.cc +++ b/source/blender/editors/space_info/info_stats.cc @@ -12,6 +12,7 @@ #include "MEM_guardedalloc.h" #include "DNA_armature_types.h" +#include "DNA_collection_types.h" #include "DNA_curve_types.h" #include "DNA_gpencil_legacy_types.h" #include "DNA_grease_pencil_types.h" @@ -32,13 +33,15 @@ #include "BLI_timecode.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_action.h" #include "BKE_armature.hh" #include "BKE_blender_version.h" +#include "BKE_context.hh" #include "BKE_curve.hh" #include "BKE_curves.hh" +#include "BKE_displist.h" #include "BKE_editmesh.hh" #include "BKE_gpencil_legacy.h" #include "BKE_grease_pencil.hh" @@ -48,8 +51,9 @@ #include "BKE_mesh.hh" #include "BKE_object.hh" #include "BKE_paint.hh" +#include "BKE_particle.h" #include "BKE_pbvh_api.hh" -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "BKE_subdiv_ccg.hh" #include "BKE_subdiv_modifier.hh" @@ -93,17 +97,17 @@ struct SceneStatsFmt { totgppoint[BLI_STR_FORMAT_UINT64_GROUPED_SIZE]; }; -static bool stats_mesheval(const Mesh *mesh_eval, bool is_selected, SceneStats *stats) +static bool stats_mesheval(const Mesh *me_eval, bool is_selected, SceneStats *stats) { - if (mesh_eval == nullptr) { + if (me_eval == nullptr) { return false; } int totvert, totedge, totface, totloop; - const SubsurfRuntimeData *subsurf_runtime_data = mesh_eval->runtime->subsurf_runtime_data; + const SubsurfRuntimeData *subsurf_runtime_data = me_eval->runtime->subsurf_runtime_data; - if (const std::unique_ptr &subdiv_ccg = mesh_eval->runtime->subdiv_ccg) { + if (const std::unique_ptr &subdiv_ccg = me_eval->runtime->subdiv_ccg) { BKE_subdiv_ccg_topology_counters(*subdiv_ccg, totvert, totedge, totface, totloop); } else if (subsurf_runtime_data && subsurf_runtime_data->resolution != 0) { @@ -113,10 +117,10 @@ static bool stats_mesheval(const Mesh *mesh_eval, bool is_selected, SceneStats * totloop = subsurf_runtime_data->stats_totloop; } else { - totvert = mesh_eval->verts_num; - totedge = mesh_eval->edges_num; - totface = mesh_eval->faces_num; - totloop = mesh_eval->corners_num; + totvert = me_eval->verts_num; + totedge = me_eval->edges_num; + totface = me_eval->faces_num; + totloop = me_eval->corners_num; } stats->totvert += totvert; @@ -158,11 +162,11 @@ static void stats_object(Object *ob, switch (ob->type) { case OB_MESH: { /* we assume evaluated mesh is already built, this strictly does stats now. */ - const Mesh *mesh_eval = BKE_object_get_evaluated_mesh_no_subsurf(ob); - if (!BLI_gset_add(objects_gset, (void *)mesh_eval)) { + const Mesh *me_eval = BKE_object_get_evaluated_mesh_no_subsurf(ob); + if (!BLI_gset_add(objects_gset, (void *)me_eval)) { break; } - stats_mesheval(mesh_eval, is_selected, stats); + stats_mesheval(me_eval, is_selected, stats); break; } case OB_LAMP: @@ -484,7 +488,7 @@ static bool format_stats( if (*stats_p == nullptr) { /* Don't access dependency graph if interface is marked as locked. */ wmWindowManager *wm = (wmWindowManager *)bmain->wm.first; - if (wm->runtime->is_interface_locked) { + if (wm->is_interface_locked) { return false; } Depsgraph *depsgraph = BKE_scene_ensure_depsgraph(bmain, scene, view_layer); diff --git a/source/blender/editors/space_info/space_info.cc b/source/blender/editors/space_info/space_info.cc index c3aa588f7dd..0adab579015 100644 --- a/source/blender/editors/space_info/space_info.cc +++ b/source/blender/editors/space_info/space_info.cc @@ -24,6 +24,8 @@ #include "WM_message.hh" #include "WM_types.hh" +#include "RNA_access.hh" + #include "UI_resources.hh" #include "UI_view2d.hh" diff --git a/source/blender/editors/space_nla/nla_buttons.cc b/source/blender/editors/space_nla/nla_buttons.cc index e41999c37f1..ede967654bf 100644 --- a/source/blender/editors/space_nla/nla_buttons.cc +++ b/source/blender/editors/space_nla/nla_buttons.cc @@ -19,10 +19,10 @@ #include "BLI_blenlib.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_context.hh" -#include "BKE_fcurve.hh" +#include "BKE_fcurve.h" #include "BKE_nla.h" #include "BKE_screen.hh" @@ -33,6 +33,7 @@ #include "RNA_prototypes.h" #include "ED_anim_api.hh" +#include "ED_screen.hh" #include "UI_interface.hh" #include "UI_resources.hh" diff --git a/source/blender/editors/space_nla/nla_draw.cc b/source/blender/editors/space_nla/nla_draw.cc index 476b0412fb3..f9eb8f1edf5 100644 --- a/source/blender/editors/space_nla/nla_draw.cc +++ b/source/blender/editors/space_nla/nla_draw.cc @@ -16,14 +16,18 @@ #include "DNA_node_types.h" #include "DNA_screen_types.h" #include "DNA_space_types.h" +#include "DNA_windowmanager_types.h" #include "BLI_blenlib.h" +#include "BLI_dlrbTree.h" #include "BLI_range.h" #include "BLI_utildefines.h" #include "BKE_action.h" -#include "BKE_fcurve.hh" +#include "BKE_context.hh" +#include "BKE_fcurve.h" #include "BKE_nla.h" +#include "BKE_screen.hh" #include "ED_anim_api.hh" #include "ED_keyframes_draw.hh" diff --git a/source/blender/editors/space_nla/nla_edit.cc b/source/blender/editors/space_nla/nla_edit.cc index fe184f39fc2..573866f225e 100644 --- a/source/blender/editors/space_nla/nla_edit.cc +++ b/source/blender/editors/space_nla/nla_edit.cc @@ -16,34 +16,37 @@ #include "MEM_guardedalloc.h" +#include "BLI_blenlib.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" +#include "BKE_action.h" #include "BKE_context.hh" -#include "BKE_fcurve.hh" +#include "BKE_fcurve.h" #include "BKE_lib_id.hh" #include "BKE_main.hh" #include "BKE_nla.h" -#include "BKE_report.hh" +#include "BKE_report.h" +#include "BKE_screen.hh" #include "ED_anim_api.hh" #include "ED_keyframes_edit.hh" #include "ED_markers.hh" #include "ED_screen.hh" +#include "ED_transform.hh" #include "RNA_access.hh" #include "RNA_define.hh" #include "RNA_enum_types.hh" #include "RNA_prototypes.h" -#include "UI_interface_icons.hh" - #include "WM_api.hh" #include "WM_types.hh" #include "DEG_depsgraph_build.hh" +#include "UI_interface.hh" #include "UI_view2d.hh" #include "nla_intern.hh" @@ -2092,20 +2095,6 @@ static int nlaedit_make_single_user_exec(bContext *C, wmOperator * /*op*/) return OPERATOR_FINISHED; } -static int nlaedit_make_single_user_invoke(bContext *C, wmOperator *op, const wmEvent * /*event*/) -{ - if (RNA_boolean_get(op->ptr, "confirm")) { - return WM_operator_confirm_ex(C, - op, - IFACE_("Make each action single-user in the selected strips?"), - nullptr, - IFACE_("Make Single"), - ALERT_ICON_NONE, - false); - } - return nlaedit_make_single_user_exec(C, op); -} - void NLA_OT_make_single_user(wmOperatorType *ot) { /* identifiers */ @@ -2114,7 +2103,7 @@ void NLA_OT_make_single_user(wmOperatorType *ot) ot->description = "Ensure that each action is only used once in the set of strips selected"; /* api callbacks */ - ot->invoke = nlaedit_make_single_user_invoke; + ot->invoke = WM_operator_confirm_or_exec; ot->exec = nlaedit_make_single_user_exec; ot->poll = nlaop_poll_tweakmode_off; diff --git a/source/blender/editors/space_nla/nla_ops.cc b/source/blender/editors/space_nla/nla_ops.cc index 2b52e9dd1be..c08657bd260 100644 --- a/source/blender/editors/space_nla/nla_ops.cc +++ b/source/blender/editors/space_nla/nla_ops.cc @@ -12,6 +12,7 @@ #include "DNA_scene_types.h" #include "BKE_context.hh" +#include "BKE_screen.hh" #include "ED_anim_api.hh" #include "ED_screen.hh" diff --git a/source/blender/editors/space_nla/nla_select.cc b/source/blender/editors/space_nla/nla_select.cc index 812d1b7e2e7..892c9282c31 100644 --- a/source/blender/editors/space_nla/nla_select.cc +++ b/source/blender/editors/space_nla/nla_select.cc @@ -14,9 +14,12 @@ #include "MEM_guardedalloc.h" +#include "BLI_blenlib.h" #include "BLI_math_base.h" +#include "BKE_context.hh" #include "BKE_nla.h" +#include "BKE_screen.hh" #include "ED_anim_api.hh" #include "ED_keyframes_edit.hh" @@ -29,6 +32,7 @@ #include "WM_api.hh" #include "WM_types.hh" +#include "UI_interface.hh" #include "UI_view2d.hh" #include "nla_intern.hh" /* own include */ diff --git a/source/blender/editors/space_nla/nla_tracks.cc b/source/blender/editors/space_nla/nla_tracks.cc index 584ab30d087..40aec83d92e 100644 --- a/source/blender/editors/space_nla/nla_tracks.cc +++ b/source/blender/editors/space_nla/nla_tracks.cc @@ -15,14 +15,17 @@ #include "DNA_object_types.h" #include "DNA_scene_types.h" +#include "BLI_blenlib.h" #include "BLI_utildefines.h" -#include "BKE_anim_data.hh" +#include "BKE_anim_data.h" #include "BKE_context.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_layer.hh" #include "BKE_nla.h" -#include "BKE_report.hh" +#include "BKE_report.h" +#include "BKE_scene.h" +#include "BKE_screen.hh" #include "ED_anim_api.hh" #include "ED_keyframes_edit.hh" @@ -35,6 +38,8 @@ #include "WM_api.hh" #include "WM_types.hh" +#include "UI_interface.hh" + #include "DEG_depsgraph.hh" #include "DEG_depsgraph_build.hh" diff --git a/source/blender/editors/space_nla/space_nla.cc b/source/blender/editors/space_nla/space_nla.cc index d1fa8392b10..0b16e9a608b 100644 --- a/source/blender/editors/space_nla/space_nla.cc +++ b/source/blender/editors/space_nla/space_nla.cc @@ -559,18 +559,17 @@ static void nla_listener(const wmSpaceTypeListenerParams *params) } } -static void nla_id_remap(ScrArea * /*area*/, - SpaceLink *slink, - const blender::bke::id::IDRemapper &mappings) +static void nla_id_remap(ScrArea * /*area*/, SpaceLink *slink, const IDRemapper *mappings) { SpaceNla *snla = reinterpret_cast(slink); if (snla->ads == nullptr) { return; } - - mappings.apply(reinterpret_cast(&snla->ads->filter_grp), ID_REMAP_APPLY_DEFAULT); - mappings.apply(reinterpret_cast(&snla->ads->source), ID_REMAP_APPLY_DEFAULT); + BKE_id_remapper_apply( + mappings, reinterpret_cast(&snla->ads->filter_grp), ID_REMAP_APPLY_DEFAULT); + BKE_id_remapper_apply( + mappings, reinterpret_cast(&snla->ads->source), ID_REMAP_APPLY_DEFAULT); } static void nla_foreach_id(SpaceLink *space_link, LibraryForeachIDData *data) diff --git a/source/blender/editors/space_node/add_menu_assets.cc b/source/blender/editors/space_node/add_menu_assets.cc index df28500d063..37af78d64c4 100644 --- a/source/blender/editors/space_node/add_menu_assets.cc +++ b/source/blender/editors/space_node/add_menu_assets.cc @@ -10,19 +10,21 @@ #include "BLI_multi_value_map.hh" #include "BLI_string.h" +#include "DNA_screen_types.h" #include "DNA_space_types.h" #include "BKE_asset.hh" #include "BKE_idprop.h" #include "BKE_screen.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "RNA_access.hh" #include "ED_asset.hh" #include "ED_asset_menu_utils.hh" #include "ED_node.hh" +#include "ED_screen.hh" #include "node_intern.hh" @@ -41,7 +43,7 @@ static bool all_loading_finished() static asset::AssetItemTree build_catalog_tree(const bContext &C, const bNodeTree &node_tree) { - asset::AssetFilterSettings type_filter{}; + AssetFilterSettings type_filter{}; type_filter.id_types = FILTER_ID_NT; auto meta_data_filter = [&](const AssetMetaData &meta_data) { const IDProperty *tree_type = BKE_asset_metadata_idprop_find(&meta_data, "type"); @@ -51,7 +53,6 @@ static asset::AssetItemTree build_catalog_tree(const bContext &C, const bNodeTre return true; }; const AssetLibraryReference library = asset_system::all_library_reference(); - asset_system::all_library_reload_catalogs_if_dirty(); return asset::build_filtered_all_catalog_tree(library, C, type_filter, meta_data_filter); } @@ -166,7 +167,7 @@ static void node_add_catalog_assets_draw(const bContext *C, Menu *menu) *static_cast(menu_path_ptr.data); const Span assets = tree.assets_per_path.lookup(menu_path); - const asset_system::AssetCatalogTreeItem *catalog_item = tree.catalogs.find_item(menu_path); + asset_system::AssetCatalogTreeItem *catalog_item = tree.catalogs.find_item(menu_path); BLI_assert(catalog_item != nullptr); if (assets.is_empty() && !catalog_item->has_children()) { @@ -201,7 +202,7 @@ static void node_add_catalog_assets_draw(const bContext *C, Menu *menu) const Set all_builtin_menus = get_builtin_menus(edit_tree->type); - catalog_item->foreach_child([&](const asset_system::AssetCatalogTreeItem &item) { + catalog_item->foreach_child([&](asset_system::AssetCatalogTreeItem &item) { if (all_builtin_menus.contains_as(item.catalog_path().str())) { return; } @@ -275,7 +276,7 @@ static void add_root_catalogs_draw(const bContext *C, Menu *menu) return; } - tree.catalogs.foreach_root_item([&](const asset_system::AssetCatalogTreeItem &item) { + tree.catalogs.foreach_root_item([&](asset_system::AssetCatalogTreeItem &item) { if (!all_builtin_menus.contains_as(item.catalog_path().str())) { asset::draw_menu_for_catalog( screen, *all_library, item, "NODE_MT_node_add_catalog_assets", *layout); diff --git a/source/blender/editors/space_node/clipboard.cc b/source/blender/editors/space_node/clipboard.cc index 667c6a3b359..fdd76cb06d4 100644 --- a/source/blender/editors/space_node/clipboard.cc +++ b/source/blender/editors/space_node/clipboard.cc @@ -5,17 +5,20 @@ #include "DNA_space_types.h" #include "BKE_context.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_lib_id.hh" #include "BKE_main.hh" #include "BKE_node.hh" #include "BKE_node_runtime.hh" -#include "BKE_report.hh" +#include "BKE_node_tree_update.hh" +#include "BKE_report.h" #include "ED_node.hh" #include "ED_render.hh" #include "ED_screen.hh" +#include "NOD_socket.hh" + #include "RNA_access.hh" #include "RNA_define.hh" diff --git a/source/blender/editors/space_node/drawnode.cc b/source/blender/editors/space_node/drawnode.cc index 49303484d80..4a3eec89921 100644 --- a/source/blender/editors/space_node/drawnode.cc +++ b/source/blender/editors/space_node/drawnode.cc @@ -26,11 +26,11 @@ #include "BKE_node_enum.hh" #include "BKE_node_runtime.hh" #include "BKE_node_tree_update.hh" -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "BKE_tracking.h" #include "BLF_api.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BIF_glutil.hh" @@ -42,7 +42,7 @@ #include "GPU_platform.h" #include "GPU_shader_shared.h" #include "GPU_state.h" -#include "GPU_uniform_buffer.hh" +#include "GPU_uniform_buffer.h" #include "DRW_engine.hh" @@ -1201,7 +1201,6 @@ static const float std_node_socket_colors[][4] = { {0.92, 0.46, 0.51, 1.0}, /* SOCK_MATERIAL */ {0.65, 0.39, 0.78, 1.0}, /* SOCK_ROTATION */ {0.40, 0.40, 0.40, 1.0}, /* SOCK_MENU */ - {0.72, 0.20, 0.52, 1.0}, /* SOCK_MATRIX */ }; /* Callback for colors that does not depend on the socket pointer argument to get the type. */ @@ -1237,7 +1236,6 @@ static const SocketColorFn std_node_socket_color_funcs[] = { std_node_socket_color_fn, std_node_socket_color_fn, std_node_socket_color_fn, - std_node_socket_color_fn, }; /* draw function for file output node sockets, @@ -1352,10 +1350,6 @@ static void std_node_socket_draw( uiItemR(column, ptr, "default_value", DEFAULT_FLAGS, text, ICON_NONE); break; } - case SOCK_MATRIX: { - uiItemL(layout, text, ICON_NONE); - break; - } case SOCK_RGBA: { if (text[0] == '\0') { uiItemR(layout, ptr, "default_value", DEFAULT_FLAGS, "", ICON_NONE); @@ -1534,7 +1528,6 @@ static void std_node_socket_interface_draw(ID *id, } case SOCK_SHADER: case SOCK_GEOMETRY: - case SOCK_MATRIX: break; case SOCK_CUSTOM: diff --git a/source/blender/editors/space_node/link_drag_search.cc b/source/blender/editors/space_node/link_drag_search.cc index dd87aa5c268..b97dc3390b4 100644 --- a/source/blender/editors/space_node/link_drag_search.cc +++ b/source/blender/editors/space_node/link_drag_search.cc @@ -21,7 +21,9 @@ #include "NOD_socket.hh" #include "NOD_socket_search_link.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" + +#include "RNA_access.hh" #include "WM_api.hh" @@ -233,7 +235,7 @@ static void gather_search_link_ops_for_asset_library(const bContext &C, const bool skip_local, Vector &search_link_ops) { - asset::AssetFilterSettings filter_settings{}; + AssetFilterSettings filter_settings{}; filter_settings.id_types = FILTER_ID_NT; asset::list::storage_fetch(&library_ref, &C); @@ -447,6 +449,8 @@ static uiBlock *create_search_popup_block(bContext *C, ARegion *region, void *ar 10, UI_searchbox_size_x(), UI_UNIT_Y, + 0, + 0, ""); UI_but_func_search_set_sep_string(but, UI_MENU_ARROW_SEP); UI_but_func_search_set_listen(but, link_drag_search_listen_fn); @@ -472,6 +476,8 @@ static uiBlock *create_search_popup_block(bContext *C, ARegion *region, void *ar nullptr, 0, 0, + 0, + 0, nullptr); const int2 offset = {0, -UI_UNIT_Y}; diff --git a/source/blender/editors/space_node/node_add.cc b/source/blender/editors/space_node/node_add.cc index e86c751ba2d..df4267ea3ec 100644 --- a/source/blender/editors/space_node/node_add.cc +++ b/source/blender/editors/space_node/node_add.cc @@ -19,7 +19,7 @@ #include "BLI_listbase.h" #include "BLI_math_geom.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_context.hh" #include "BKE_image.h" @@ -28,8 +28,8 @@ #include "BKE_node.hh" #include "BKE_node_runtime.hh" #include "BKE_node_tree_update.hh" -#include "BKE_report.hh" -#include "BKE_scene.hh" +#include "BKE_report.h" +#include "BKE_scene.h" #include "BKE_texture.h" #include "DEG_depsgraph_build.hh" @@ -729,7 +729,7 @@ static int node_add_file_exec(bContext *C, wmOperator *op) node->id = (ID *)ima; } - /* When adding new image file via drag-drop we need to load #ImBuf in order + /* When adding new image file via drag-drop we need to load imbuf in order * to get proper image source. */ if (RNA_struct_property_is_set(op->ptr, "filepath")) { BKE_image_signal(bmain, ima, nullptr, IMA_SIGNAL_RELOAD); diff --git a/source/blender/editors/space_node/node_context_path.cc b/source/blender/editors/space_node/node_context_path.cc index 64bc5fd2f35..ee1b18d2d85 100644 --- a/source/blender/editors/space_node/node_context_path.cc +++ b/source/blender/editors/space_node/node_context_path.cc @@ -13,8 +13,12 @@ #include "BKE_context.hh" #include "BKE_material.h" +#include "BKE_modifier.hh" #include "BKE_object.hh" +#include "BKE_screen.hh" + +#include "RNA_access.hh" #include "RNA_prototypes.h" #include "ED_screen.hh" diff --git a/source/blender/editors/space_node/node_draw.cc b/source/blender/editors/space_node/node_draw.cc index 4b055469de2..f099fda2f5a 100644 --- a/source/blender/editors/space_node/node_draw.cc +++ b/source/blender/editors/space_node/node_draw.cc @@ -32,12 +32,12 @@ #include "BLI_string_ref.hh" #include "BLI_vector.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_compute_contexts.hh" #include "BKE_context.hh" #include "BKE_curves.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_idtype.hh" #include "BKE_lib_id.hh" #include "BKE_main.hh" @@ -46,8 +46,7 @@ #include "BKE_node_tree_update.hh" #include "BKE_node_tree_zones.hh" #include "BKE_object.hh" -#include "BKE_scene.hh" -#include "BKE_scene_runtime.hh" +#include "BKE_scene.h" #include "BKE_type_conversions.hh" #include "IMB_imbuf.hh" @@ -93,8 +92,6 @@ #include "GEO_fillet_curves.hh" -#include "COM_profile.hh" - #include "node_intern.hh" /* own include */ #include @@ -129,9 +126,6 @@ struct TreeDrawContext { * True if there is an active realtime compositor using the node tree, false otherwise. */ bool used_by_realtime_compositor = false; - - blender::Map - *compositor_per_node_execution_time = nullptr; }; float ED_node_grid_size() @@ -614,36 +608,17 @@ static Vector node_build_item_data(bNode &node) if (const nodes::SocketDeclaration *socket_decl = dynamic_cast(item_decl->get())) { - if (socket_decl->align_with_previous_socket) { - NodeInterfaceItemData &last_item = result.last(); - switch (socket_decl->in_out) { - case SOCK_IN: - BLI_assert(input != input_end); - BLI_assert(last_item.input == nullptr); - last_item.input = *input; - ++input; - break; - case SOCK_OUT: - BLI_assert(output != output_end); - BLI_assert(last_item.output == nullptr); - last_item.output = *output; - ++output; - break; - } - } - else { - switch (socket_decl->in_out) { - case SOCK_IN: - BLI_assert(input != input_end); - result.append({socket_decl, *input, nullptr}); - ++input; - break; - case SOCK_OUT: - BLI_assert(output != output_end); - result.append({socket_decl, nullptr, *output}); - ++output; - break; - } + switch (socket_decl->in_out) { + case SOCK_IN: + BLI_assert(input != input_end); + result.append({socket_decl, *input, nullptr}); + ++input; + break; + case SOCK_OUT: + BLI_assert(output != output_end); + result.append({socket_decl, nullptr, *output}); + ++output; + break; } ++item_decl; } @@ -699,9 +674,6 @@ static void node_update_panel_items_visibility_recursive(int num_items, node_update_panel_items_visibility_recursive( item.panel_decl->num_child_decls, is_collapsed, *item.state, state); - if (item.panel_decl->draw_buttons) { - item.state->flag |= NODE_PANEL_CONTENT_VISIBLE; - } if (item.state->flag & NODE_PANEL_CONTENT_VISIBLE) { /* If child panel is visible so is the parent panel. */ parent_state.flag |= NODE_PANEL_CONTENT_VISIBLE; @@ -1334,14 +1306,6 @@ static void create_inspection_string_for_generic_value(const bNodeSocket &socket ss << fmt::format(TIP_("{} (Boolean)"), ((*static_cast(socket_value)) ? TIP_("True") : TIP_("False"))); } - else if (socket_type.is()) { - const float4x4 &value = *static_cast(socket_value); - ss << value[0] << ",\n"; - ss << value[1] << ",\n"; - ss << value[2] << ",\n"; - ss << value[3] << ",\n"; - ss << TIP_("(Matrix)"); - } } static void create_inspection_string_for_field_info(const bNodeSocket &socket, @@ -1747,6 +1711,8 @@ static void node_socket_draw_nested(const bContext &C, nullptr, 0, 0, + 0, + 0, nullptr); UI_but_func_tooltip_set( @@ -2246,6 +2212,8 @@ static void node_draw_panels(bNodeTree &ntree, const bNode &node, uiBlock &block nullptr, 0.0f, 0.0f, + 0.0f, + 0.0f, ""); /* Panel label. */ @@ -2260,6 +2228,8 @@ static void node_draw_panels(bNodeTree &ntree, const bNode &node, uiBlock &block nullptr, 0, 0, + 0, + 0, ""); if (node.flag & NODE_MUTED) { UI_but_flag_enable(but, UI_BUT_INACTIVE); @@ -2278,6 +2248,8 @@ static void node_draw_panels(bNodeTree &ntree, const bNode &node, uiBlock &block nullptr, 0.0f, 0.0f, + 0.0f, + 0.0f, ""); UI_but_func_pushed_state_set(but, [&state](const uiBut &) { return state.is_collapsed(); }); UI_but_func_set( @@ -2377,6 +2349,8 @@ static void node_add_unsupported_compositor_operation_error_message_button(const nullptr, 0, 0, + 0, + 0, TIP_(node.typeinfo->realtime_compositor_unsupported_message)); UI_block_emboss_set(&block, UI_EMBOSS); } @@ -2434,6 +2408,8 @@ static void node_add_error_message_button(const TreeDrawContext &tree_draw_ctx, nullptr, 0, 0, + 0, + 0, nullptr); UI_but_func_tooltip_set(but, node_errors_tooltip_fn, tooltip_data, [](void *arg) { MEM_delete(static_cast(arg)); @@ -2441,11 +2417,9 @@ static void node_add_error_message_button(const TreeDrawContext &tree_draw_ctx, UI_block_emboss_set(&block, UI_EMBOSS); } -static std::optional geo_node_get_execution_time( - const TreeDrawContext &tree_draw_ctx, const SpaceNode &snode, const bNode &node) +static std::optional node_get_execution_time( + const TreeDrawContext &tree_draw_ctx, const bNodeTree &ntree, const bNode &node) { - const bNodeTree &ntree = *snode.edittree; - geo_log::GeoTreeLog *tree_log = [&]() -> geo_log::GeoTreeLog * { const bNodeTreeZones *zones = ntree.zones(); if (!zones) { @@ -2468,8 +2442,8 @@ static std::optional geo_node_get_execution_time( for (const bNode *tnode : node.direct_children_in_frame()) { if (tnode->is_frame()) { - std::optional sub_frame_run_time = geo_node_get_execution_time( - tree_draw_ctx, snode, *tnode); + std::optional sub_frame_run_time = node_get_execution_time( + tree_draw_ctx, ntree, *tnode); if (sub_frame_run_time.has_value()) { run_time += *sub_frame_run_time; found_node = true; @@ -2494,87 +2468,12 @@ static std::optional geo_node_get_execution_time( return std::nullopt; } -/* Create node key instance, assuming the node comes from the currently edited node tree. */ -static bNodeInstanceKey current_node_instance_key(const SpaceNode &snode, const bNode &node) -{ - const bNodeTreePath *path = static_cast(snode.treepath.last); - - /* Some code in this file checks for the non-null elements of the tree path. However, if we did - * iterate into a node it is expected that there is a tree, and it should be in the path. - * Otherwise something else went wrong. */ - BLI_assert(path); - - /* Assume that the currently editing tree is the last in the path. */ - BLI_assert(snode.edittree == path->nodetree); - - return BKE_node_instance_key(path->parent_key, snode.edittree, &node); -} - -static std::optional compositor_accumulate_frame_node_execution_time( - const TreeDrawContext &tree_draw_ctx, const SpaceNode &snode, const bNode &node) -{ - BLI_assert(tree_draw_ctx.compositor_per_node_execution_time); - - timeit::Nanoseconds frame_execution_time(0); - bool has_any_execution_time = false; - - for (const bNode *current_node : node.direct_children_in_frame()) { - const bNodeInstanceKey key = current_node_instance_key(snode, *current_node); - if (const timeit::Nanoseconds *node_execution_time = - tree_draw_ctx.compositor_per_node_execution_time->lookup_ptr(key)) - { - frame_execution_time += *node_execution_time; - has_any_execution_time = true; - } - } - - if (!has_any_execution_time) { - return std::nullopt; - } - - return frame_execution_time; -} - -static std::optional compositor_node_get_execution_time( - const TreeDrawContext &tree_draw_ctx, const SpaceNode &snode, const bNode &node) -{ - BLI_assert(tree_draw_ctx.compositor_per_node_execution_time); - - /* For the frame nodes accumulate execution time of its children. */ - if (node.is_frame()) { - return compositor_accumulate_frame_node_execution_time(tree_draw_ctx, snode, node); - } - - /* For other nodes simply lookup execution time. - * The group node instances have their own entries in the execution times map. */ - const bNodeInstanceKey key = current_node_instance_key(snode, node); - if (const timeit::Nanoseconds *execution_time = - tree_draw_ctx.compositor_per_node_execution_time->lookup_ptr(key)) - { - return *execution_time; - } - - return std::nullopt; -} - -static std::optional node_get_execution_time( - const TreeDrawContext &tree_draw_ctx, const SpaceNode &snode, const bNode &node) -{ - switch (snode.edittree->type) { - case NTREE_GEOMETRY: - return geo_node_get_execution_time(tree_draw_ctx, snode, node); - case NTREE_COMPOSIT: - return compositor_node_get_execution_time(tree_draw_ctx, snode, node); - } - return std::nullopt; -} - static std::string node_get_execution_time_label(TreeDrawContext &tree_draw_ctx, const SpaceNode &snode, const bNode &node) { const std::optional exec_time = node_get_execution_time( - tree_draw_ctx, snode, node); + tree_draw_ctx, *snode.edittree, node); if (!exec_time.has_value()) { return std::string(""); @@ -2713,35 +2612,6 @@ static std::optional node_get_accessed_attributes_row( return row_from_used_named_attribute(node_log->used_named_attributes); } -static std::optional node_get_execution_time_label_row( - TreeDrawContext &tree_draw_ctx, const SpaceNode &snode, const bNode &node) -{ - NodeExtraInfoRow row; - row.text = node_get_execution_time_label(tree_draw_ctx, snode, node); - if (row.text.empty()) { - return std::nullopt; - } - row.tooltip = TIP_( - "The execution time from the node tree's latest evaluation. For frame and group " - "nodes, the time for all sub-nodes"); - row.icon = ICON_PREVIEW_RANGE; - return row; -} - -static void node_get_compositor_extra_info(TreeDrawContext &tree_draw_ctx, - const SpaceNode &snode, - const bNode &node, - Vector &rows) -{ - if (snode.overlay.flag & SN_OVERLAY_SHOW_TIMINGS) { - std::optional row = node_get_execution_time_label_row( - tree_draw_ctx, snode, node); - if (row.has_value()) { - rows.append(std::move(*row)); - } - } -} - static Vector node_get_extra_info(const bContext &C, TreeDrawContext &tree_draw_ctx, const SpaceNode &snode, @@ -2762,13 +2632,8 @@ static Vector node_get_extra_info(const bContext &C, rows.append(std::move(row)); } - if (snode.edittree->type == NTREE_COMPOSIT) { - node_get_compositor_extra_info(tree_draw_ctx, snode, node, rows); - return rows; - } - if (!(snode.edittree->type == NTREE_GEOMETRY)) { - /* Currently geometry and compositor nodes are the only nodes to have extra info per nodes. */ + /* Currently geometry nodes are the only nodes to have extra infos per nodes. */ return rows; } @@ -2784,10 +2649,15 @@ static Vector node_get_extra_info(const bContext &C, (ELEM(node.typeinfo->nclass, NODE_CLASS_GEOMETRY, NODE_CLASS_GROUP, NODE_CLASS_ATTRIBUTE) || ELEM(node.type, NODE_FRAME, NODE_GROUP_OUTPUT))) { - std::optional row = node_get_execution_time_label_row( - tree_draw_ctx, snode, node); - if (row.has_value()) { - rows.append(std::move(*row)); + NodeExtraInfoRow row; + row.text = node_get_execution_time_label(tree_draw_ctx, snode, node); + if (!row.text.empty()) { + row.tooltip = TIP_( + "The execution time from the node tree's latest evaluation. For frame and group " + "nodes, " + "the time for all sub-nodes"); + row.icon = ICON_PREVIEW_RANGE; + rows.append(std::move(row)); } } @@ -2838,6 +2708,8 @@ static void node_draw_extra_info_row(const bNode &node, nullptr, 0, 0, + 0, + 0, extra_info_row.tooltip); if (extra_info_row.tooltip_fn != nullptr) { UI_but_func_tooltip_set(but_icon, @@ -2862,6 +2734,8 @@ static void node_draw_extra_info_row(const bNode &node, nullptr, 0, 0, + 0, + 0, ""); if (node.flag & NODE_MUTED) { @@ -3086,6 +2960,8 @@ static void node_draw_basis(const bContext &C, nullptr, 0, 0, + 0, + 0, ""); UI_but_func_set(but, node_toggle_button_cb, @@ -3111,6 +2987,8 @@ static void node_draw_basis(const bContext &C, nullptr, 0, 0, + 0, + 0, ""); UI_but_func_set(but, node_toggle_button_cb, @@ -3132,6 +3010,8 @@ static void node_draw_basis(const bContext &C, nullptr, 0, 0, + 0, + 0, ""); UI_block_emboss_set(&block, UI_EMBOSS); } @@ -3150,6 +3030,8 @@ static void node_draw_basis(const bContext &C, nullptr, 0, 0, + 0, + 0, ""); /* Selection implicitly activates the node. */ const char *operator_idname = is_active ? "NODE_OT_deactivate_viewer" : "NODE_OT_select"; @@ -3184,6 +3066,8 @@ static void node_draw_basis(const bContext &C, nullptr, 0.0f, 0.0f, + 0.0f, + 0.0f, ""); UI_but_func_set(but, @@ -3207,6 +3091,8 @@ static void node_draw_basis(const bContext &C, nullptr, 0, 0, + 0, + 0, ""); if (node.flag & NODE_MUTED) { UI_but_flag_enable(but, UI_BUT_INACTIVE); @@ -3411,6 +3297,8 @@ static void node_draw_hidden(const bContext &C, nullptr, 0.0f, 0.0f, + 0.0f, + 0.0f, ""); UI_but_func_set(but, @@ -3434,6 +3322,8 @@ static void node_draw_hidden(const bContext &C, nullptr, 0, 0, + 0, + 0, ""); /* Outline. */ @@ -3850,8 +3740,20 @@ static void reroute_node_draw( const int x = BLI_rctf_cent_x(&node.runtime->totr) - (width / 2); const int y = node.runtime->totr.ymax; - uiBut *label_but = uiDefBut( - &block, UI_BTYPE_LABEL, 0, showname, x, y, width, short(NODE_DY), nullptr, 0, 0, nullptr); + uiBut *label_but = uiDefBut(&block, + UI_BTYPE_LABEL, + 0, + showname, + x, + y, + width, + short(NODE_DY), + nullptr, + 0, + 0, + 0, + 0, + nullptr); UI_but_drawflag_disable(label_but, UI_BUT_TEXT_LEFT); } @@ -4193,7 +4095,7 @@ static bool realtime_compositor_is_in_use(const bContext &context) } if (U.experimental.use_full_frame_compositor && - scene->nodetree->execution_mode == NTREE_EXECUTION_MODE_GPU) + scene->nodetree->execution_mode == NTREE_EXECUTION_MODE_REALTIME) { return true; } @@ -4247,10 +4149,7 @@ static void draw_nodetree(const bContext &C, workspace->viewer_path, *snode); } else if (ntree.type == NTREE_COMPOSIT) { - const Scene *scene = CTX_data_scene(&C); tree_draw_ctx.used_by_realtime_compositor = realtime_compositor_is_in_use(C); - tree_draw_ctx.compositor_per_node_execution_time = - &scene->runtime->compositor.per_node_execution_time; } else if (ntree.type == NTREE_SHADER && U.experimental.use_shader_node_previews && BKE_scene_uses_shader_previews(CTX_data_scene(&C)) && diff --git a/source/blender/editors/space_node/node_edit.cc b/source/blender/editors/space_node/node_edit.cc index 04affd994a1..2bd944f7d01 100644 --- a/source/blender/editors/space_node/node_edit.cc +++ b/source/blender/editors/space_node/node_edit.cc @@ -10,29 +10,32 @@ #include "MEM_guardedalloc.h" +#include "DNA_light_types.h" #include "DNA_material_types.h" #include "DNA_node_types.h" #include "DNA_text_types.h" #include "DNA_world_types.h" -#include "BKE_callbacks.hh" +#include "BKE_callbacks.h" #include "BKE_context.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_image.h" +#include "BKE_image_format.h" #include "BKE_lib_id.hh" #include "BKE_main.hh" #include "BKE_material.h" #include "BKE_node.hh" #include "BKE_node_runtime.hh" #include "BKE_node_tree_update.hh" -#include "BKE_report.hh" -#include "BKE_scene.hh" -#include "BKE_scene_runtime.hh" +#include "BKE_report.h" +#include "BKE_scene.h" +#include "BKE_workspace.h" +#include "BLI_set.hh" #include "BLI_string.h" #include "BLI_string_utf8.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DEG_depsgraph.hh" #include "DEG_depsgraph_build.hh" @@ -46,10 +49,12 @@ #include "ED_node.hh" /* own include */ #include "ED_render.hh" #include "ED_screen.hh" +#include "ED_select_utils.hh" #include "ED_viewer_path.hh" #include "RNA_access.hh" #include "RNA_define.hh" +#include "RNA_enum_types.hh" #include "RNA_prototypes.h" #include "WM_api.hh" @@ -69,8 +74,6 @@ #include "NOD_texture.h" #include "node_intern.hh" /* own include */ -#include "COM_profile.hh" - namespace blender::ed::space_node { #define USE_ESC_COMPO @@ -101,8 +104,6 @@ struct CompoJob { bool *do_update; float *progress; bool cancelled; - - blender::compositor::ProfilerData profiler_data; }; float node_socket_calculate_height(const bNodeSocket &socket) @@ -222,8 +223,7 @@ static void compo_freejob(void *cjv) if (cj->compositor_depsgraph != nullptr) { DEG_graph_free(cj->compositor_depsgraph); } - - MEM_delete(cj); + MEM_freeN(cj); } /* Only now we copy the nodetree, so adding many jobs while @@ -296,23 +296,15 @@ static void compo_startjob(void *cjv, wmJobWorkerStatus *worker_status) BKE_callback_exec_id(cj->bmain, &scene->id, BKE_CB_EVT_COMPOSITE_PRE); if ((cj->scene->r.scemode & R_MULTIVIEW) == 0) { - ntreeCompositExecTree( - cj->re, cj->scene, ntree, &cj->scene->r, false, true, "", nullptr, cj->profiler_data); + ntreeCompositExecTree(cj->re, cj->scene, ntree, &cj->scene->r, false, true, "", nullptr); } else { LISTBASE_FOREACH (SceneRenderView *, srv, &scene->r.views) { if (BKE_scene_multiview_is_render_view_active(&scene->r, srv) == false) { continue; } - ntreeCompositExecTree(cj->re, - cj->scene, - ntree, - &cj->scene->r, - false, - true, - srv->name, - nullptr, - cj->profiler_data); + ntreeCompositExecTree( + cj->re, cj->scene, ntree, &cj->scene->r, false, true, srv->name, nullptr); } } @@ -328,8 +320,6 @@ static void compo_canceljob(void *cjv) Scene *scene = cj->scene; BKE_callback_exec_id(bmain, &scene->id, BKE_CB_EVT_COMPOSITE_CANCEL); cj->cancelled = true; - - scene->runtime->compositor.per_node_execution_time = cj->profiler_data.per_node_execution_time; } static void compo_completejob(void *cjv) @@ -338,8 +328,6 @@ static void compo_completejob(void *cjv) Main *bmain = cj->bmain; Scene *scene = cj->scene; BKE_callback_exec_id(bmain, &scene->id, BKE_CB_EVT_COMPOSITE_POST); - - scene->runtime->compositor.per_node_execution_time = cj->profiler_data.per_node_execution_time; } /** \} */ @@ -357,7 +345,7 @@ static bool is_compositing_possible(const bContext *C) Scene *scene = CTX_data_scene(C); /* CPU compositor can always run. */ if (!U.experimental.use_full_frame_compositor || - scene->nodetree->execution_mode != NTREE_EXECUTION_MODE_GPU) + scene->nodetree->execution_mode != NTREE_EXECUTION_MODE_REALTIME) { return true; } @@ -407,7 +395,7 @@ void ED_node_composite_job(const bContext *C, bNodeTree *nodetree, Scene *scene_ "Compositing", WM_JOB_EXCL_RENDER | WM_JOB_PROGRESS, WM_JOB_TYPE_COMPOSITE); - CompoJob *cj = MEM_new("compo job"); + CompoJob *cj = MEM_cnew("compo job"); /* Custom data for preview thread. */ cj->bmain = bmain; @@ -506,7 +494,7 @@ void ED_node_tree_propagate_change(const bContext *C, Main *bmain, bNodeTree *ro NodeTreeUpdateExtraParams params = {nullptr}; params.tree_changed_fn = [](ID *id, bNodeTree *ntree, void * /*user_data*/) { blender::ed::space_node::send_notifiers_after_tree_change(id, ntree); - DEG_id_tag_update(&ntree->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&ntree->id, ID_RECALC_COPY_ON_WRITE); }; params.tree_output_changed_fn = [](ID * /*id*/, bNodeTree *ntree, void * /*user_data*/) { DEG_id_tag_update(&ntree->id, ID_RECALC_NTREE_OUTPUT); @@ -633,6 +621,7 @@ void ED_node_composit_default(const bContext *C, Scene *sce) sce->nodetree = blender::bke::ntreeAddTreeEmbedded( nullptr, &sce->id, "Compositing Nodetree", ntreeType_Composite->idname); + sce->nodetree->chunksize = 256; sce->nodetree->edit_quality = NTREE_QUALITY_HIGH; sce->nodetree->render_quality = NTREE_QUALITY_HIGH; diff --git a/source/blender/editors/space_node/node_geometry_attribute_search.cc b/source/blender/editors/space_node/node_geometry_attribute_search.cc index 04b08a2474e..9b5cf5d4361 100644 --- a/source/blender/editors/space_node/node_geometry_attribute_search.cc +++ b/source/blender/editors/space_node/node_geometry_attribute_search.cc @@ -28,7 +28,7 @@ #include "ED_screen.hh" #include "ED_undo.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "UI_interface.hh" #include "UI_resources.hh" @@ -157,7 +157,6 @@ static eCustomDataType data_type_in_attribute_input_node(const eCustomDataType t case CD_PROP_COLOR: case CD_PROP_BOOL: case CD_PROP_QUATERNION: - case CD_PROP_FLOAT4X4: return type; case CD_PROP_BYTE_COLOR: return CD_PROP_COLOR; diff --git a/source/blender/editors/space_node/node_gizmo.cc b/source/blender/editors/space_node/node_gizmo.cc index 0a33af4984c..47c7c0ab9d8 100644 --- a/source/blender/editors/space_node/node_gizmo.cc +++ b/source/blender/editors/space_node/node_gizmo.cc @@ -15,6 +15,7 @@ #include "BKE_context.hh" #include "BKE_image.h" +#include "BKE_main.hh" #include "ED_gizmo_library.hh" #include "ED_screen.hh" @@ -26,6 +27,7 @@ #include "RNA_access.hh" #include "RNA_prototypes.h" +#include "WM_api.hh" #include "WM_types.hh" #include "node_intern.hh" @@ -50,16 +52,13 @@ static void node_gizmo_calc_matrix_space(const SpaceNode *snode, static void node_gizmo_calc_matrix_space_with_image_dims(const SpaceNode *snode, const ARegion *region, const float2 &image_dims, - const float2 &image_offset, float matrix_space[4][4]) { unit_m4(matrix_space); mul_v3_fl(matrix_space[0], snode->zoom * image_dims.x); mul_v3_fl(matrix_space[1], snode->zoom * image_dims.y); - matrix_space[3][0] = ((region->winx / 2) + snode->xof) - - ((image_dims.x / 2.0f - image_offset.x) * snode->zoom); - matrix_space[3][1] = ((region->winy / 2) + snode->yof) - - ((image_dims.y / 2.0f - image_offset.y) * snode->zoom); + matrix_space[3][0] = ((region->winx / 2) + snode->xof) - ((image_dims.x / 2.0f) * snode->zoom); + matrix_space[3][1] = ((region->winy / 2) + snode->yof) - ((image_dims.y / 2.0f) * snode->zoom); } /** \} */ @@ -405,7 +404,6 @@ struct NodeSunBeamsWidgetGroup { struct { float2 dims; - float2 offset; } state; }; @@ -452,7 +450,7 @@ static void WIDGETGROUP_node_sbeam_draw_prepare(const bContext *C, wmGizmoGroup SpaceNode *snode = CTX_wm_space_node(C); node_gizmo_calc_matrix_space_with_image_dims( - snode, region, sbeam_group->state.dims, sbeam_group->state.offset, gz->matrix_space); + snode, region, sbeam_group->state.dims, gz->matrix_space); } static void WIDGETGROUP_node_sbeam_refresh(const bContext *C, wmGizmoGroup *gzgroup) @@ -468,7 +466,6 @@ static void WIDGETGROUP_node_sbeam_refresh(const bContext *C, wmGizmoGroup *gzgr if (ibuf) { sbeam_group->state.dims[0] = (ibuf->x > 0) ? ibuf->x : 64.0f; sbeam_group->state.dims[1] = (ibuf->y > 0) ? ibuf->y : 64.0f; - sbeam_group->state.offset = {float(ima->offset_x), float(ima->offset_y)}; SpaceNode *snode = CTX_wm_space_node(C); bNode *node = nodeGetActive(snode->edittree); @@ -512,7 +509,6 @@ struct NodeCornerPinWidgetGroup { struct { float2 dims; - float2 offset; } state; }; @@ -547,7 +543,7 @@ static void WIDGETGROUP_node_corner_pin_setup(const bContext * /*C*/, wmGizmoGro RNA_enum_set(gz->ptr, "draw_style", ED_GIZMO_MOVE_STYLE_CROSS_2D); - gz->scale_basis = 0.05f / 75.0; + gz->scale_basis = 0.01f / 75.0; } gzgroup->customdata = cpin_group; @@ -562,7 +558,7 @@ static void WIDGETGROUP_node_corner_pin_draw_prepare(const bContext *C, wmGizmoG float matrix_space[4][4]; node_gizmo_calc_matrix_space_with_image_dims( - snode, region, cpin_group->state.dims, cpin_group->state.offset, matrix_space); + snode, region, cpin_group->state.dims, matrix_space); for (int i = 0; i < 4; i++) { wmGizmo *gz = cpin_group->gizmos[i]; @@ -582,7 +578,6 @@ static void WIDGETGROUP_node_corner_pin_refresh(const bContext *C, wmGizmoGroup if (ibuf) { cpin_group->state.dims[0] = (ibuf->x > 0) ? ibuf->x : 64.0f; cpin_group->state.dims[1] = (ibuf->y > 0) ? ibuf->y : 64.0f; - cpin_group->state.offset = {float(ima->offset_x), float(ima->offset_y)}; SpaceNode *snode = CTX_wm_space_node(C); bNode *node = nodeGetActive(snode->edittree); diff --git a/source/blender/editors/space_node/node_group.cc b/source/blender/editors/space_node/node_group.cc index 824e01a5766..f97870b9427 100644 --- a/source/blender/editors/space_node/node_group.cc +++ b/source/blender/editors/space_node/node_group.cc @@ -22,7 +22,7 @@ #include "BLI_string.h" #include "BLI_vector.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_action.h" #include "BKE_animsys.h" @@ -31,7 +31,7 @@ #include "BKE_main.hh" #include "BKE_node_runtime.hh" #include "BKE_node_tree_update.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "DEG_depsgraph_build.hh" diff --git a/source/blender/editors/space_node/node_ops.cc b/source/blender/editors/space_node/node_ops.cc index 6f2970fe45a..89d9c940a41 100644 --- a/source/blender/editors/space_node/node_ops.cc +++ b/source/blender/editors/space_node/node_ops.cc @@ -8,6 +8,8 @@ #include "DNA_node_types.h" +#include "BKE_context.hh" + #include "ED_node.hh" /* own include */ #include "ED_screen.hh" diff --git a/source/blender/editors/space_node/node_relationships.cc b/source/blender/editors/space_node/node_relationships.cc index 74cac434386..af83bec6b6b 100644 --- a/source/blender/editors/space_node/node_relationships.cc +++ b/source/blender/editors/space_node/node_relationships.cc @@ -8,38 +8,50 @@ #include "MEM_guardedalloc.h" +#include "DNA_anim_types.h" #include "DNA_node_types.h" #include "BLI_easing.h" #include "BLI_math_geom.h" #include "BLI_stack.hh" +#include "BKE_anim_data.h" #include "BKE_context.hh" +#include "BKE_curve.hh" +#include "BKE_lib_id.hh" +#include "BKE_main.hh" #include "BKE_node.hh" #include "BKE_node_runtime.hh" #include "BKE_node_tree_update.hh" +#include "BKE_screen.hh" #include "ED_node.hh" /* own include */ #include "ED_render.hh" #include "ED_screen.hh" #include "ED_space_api.hh" +#include "ED_util.hh" #include "ED_viewer_path.hh" #include "RNA_access.hh" #include "RNA_define.hh" #include "RNA_prototypes.h" +#include "DEG_depsgraph.hh" + #include "WM_api.hh" #include "WM_types.hh" +#include "GPU_state.h" + #include "UI_interface_icons.hh" #include "UI_resources.hh" #include "UI_view2d.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "NOD_node_declaration.hh" #include "NOD_socket.hh" +#include "NOD_socket_declarations.hh" #include "NOD_socket_declarations_geometry.hh" #include "node_intern.hh" /* own include */ @@ -2230,7 +2242,6 @@ static int get_main_socket_priority(const bNodeSocket *socket) case SOCK_OBJECT: case SOCK_IMAGE: case SOCK_ROTATION: - case SOCK_MATRIX: case SOCK_GEOMETRY: case SOCK_COLLECTION: case SOCK_TEXTURE: diff --git a/source/blender/editors/space_node/node_select.cc b/source/blender/editors/space_node/node_select.cc index 3842e1e1f08..a4243711d9f 100644 --- a/source/blender/editors/space_node/node_select.cc +++ b/source/blender/editors/space_node/node_select.cc @@ -13,7 +13,7 @@ #include "DNA_node_types.h" #include "DNA_windowmanager_types.h" -#include "BLI_lasso_2d.hh" +#include "BLI_lasso_2d.h" #include "BLI_listbase.h" #include "BLI_rect.h" #include "BLI_string.h" @@ -530,7 +530,7 @@ void node_select_single(bContext &C, bNode &node) tree_draw_order_update(node_tree); if (active_texture_changed && has_workbench_in_texture_color(wm, scene, ob)) { - DEG_id_tag_update(&node_tree.id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&node_tree.id, ID_RECALC_COPY_ON_WRITE); } WM_event_add_notifier(&C, NC_NODE | NA_SELECTED, nullptr); @@ -690,7 +690,7 @@ static bool node_mouse_select(bContext *C, if ((active_texture_changed && has_workbench_in_texture_color(wm, scene, ob)) || viewer_node_changed) { - DEG_id_tag_update(&snode.edittree->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&snode.edittree->id, ID_RECALC_COPY_ON_WRITE); } WM_event_add_notifier(C, NC_NODE | NA_SELECTED, nullptr); @@ -964,7 +964,10 @@ static int node_lasso_select_invoke(bContext *C, wmOperator *op, const wmEvent * return WM_gesture_lasso_invoke(C, op, event); } -static bool do_lasso_select_node(bContext *C, const Span mcoords, eSelectOp sel_op) +static bool do_lasso_select_node(bContext *C, + const int mcoords[][2], + const int mcoords_len, + eSelectOp sel_op) { SpaceNode *snode = CTX_wm_space_node(C); bNodeTree &node_tree = *snode->edittree; @@ -981,7 +984,7 @@ static bool do_lasso_select_node(bContext *C, const Span mcoords, eSelectO } /* Get rectangle from operator. */ - BLI_lasso_boundbox(&rect, mcoords); + BLI_lasso_boundbox(&rect, mcoords, mcoords_len); for (bNode *node : node_tree.all_nodes()) { if (select && (node->flag & NODE_SELECT)) { @@ -1013,7 +1016,7 @@ static bool do_lasso_select_node(bContext *C, const Span mcoords, eSelectO if (UI_view2d_view_to_region_clip( ®ion->v2d, center.x, center.y, &screen_co.x, &screen_co.y) && BLI_rcti_isect_pt(&rect, screen_co.x, screen_co.y) && - BLI_lasso_is_point_inside(mcoords, screen_co.x, screen_co.y, INT_MAX)) + BLI_lasso_is_point_inside(mcoords, mcoords_len, screen_co.x, screen_co.y, INT_MAX)) { nodeSetSelected(node, select); changed = true; @@ -1032,17 +1035,19 @@ static bool do_lasso_select_node(bContext *C, const Span mcoords, eSelectO static int node_lasso_select_exec(bContext *C, wmOperator *op) { - const Array mcoords = WM_gesture_lasso_path_to_array(C, op); + int mcoords_len; + const int(*mcoords)[2] = WM_gesture_lasso_path_to_array(C, op, &mcoords_len); - if (mcoords.is_empty()) { - return OPERATOR_PASS_THROUGH; + if (mcoords) { + const eSelectOp sel_op = (eSelectOp)RNA_enum_get(op->ptr, "mode"); + + do_lasso_select_node(C, mcoords, mcoords_len, sel_op); + + MEM_freeN((void *)mcoords); + + return OPERATOR_FINISHED; } - - const eSelectOp sel_op = (eSelectOp)RNA_enum_get(op->ptr, "mode"); - - do_lasso_select_node(C, mcoords, sel_op); - - return OPERATOR_FINISHED; + return OPERATOR_PASS_THROUGH; } void NODE_OT_select_lasso(wmOperatorType *ot) @@ -1394,6 +1399,8 @@ static uiBlock *node_find_menu(bContext *C, ARegion *region, void *arg_op) 10, UI_searchbox_size_x(), UI_UNIT_Y, + 0, + 0, ""); UI_but_func_search_set( but, nullptr, node_find_update_fn, op->type, false, nullptr, node_find_exec_fn, nullptr); @@ -1411,6 +1418,8 @@ static uiBlock *node_find_menu(bContext *C, ARegion *region, void *arg_op) nullptr, 0, 0, + 0, + 0, nullptr); /* Move it downwards, mouse over button. */ diff --git a/source/blender/editors/space_node/node_shader_preview.cc b/source/blender/editors/space_node/node_shader_preview.cc index b7fd483bd21..4dad85296c5 100644 --- a/source/blender/editors/space_node/node_shader_preview.cc +++ b/source/blender/editors/space_node/node_shader_preview.cc @@ -34,7 +34,7 @@ #include "BKE_colortools.hh" #include "BKE_compute_contexts.hh" #include "BKE_context.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_layer.hh" #include "BKE_lib_id.hh" #include "BKE_main.hh" @@ -42,6 +42,7 @@ #include "BKE_node.hh" #include "BKE_node_runtime.hh" #include "BKE_node_tree_update.hh" +#include "BKE_scene.h" #include "DEG_depsgraph.hh" @@ -49,6 +50,7 @@ #include "WM_api.hh" +#include "ED_datafiles.h" #include "ED_node_preview.hh" #include "ED_render.hh" #include "ED_screen.hh" @@ -448,7 +450,7 @@ static void connect_node_to_surface_output(const Span treepath, /* Connect the nodes to some aov nodes located in the first nodetree from `treepath`. Last element * of `treepath` should be the path to the nodes nodetree. */ static void connect_nodes_to_aovs(const Span treepath, - const Span nodesocket_span) + const Span &nodesocket_span) { if (nodesocket_span.is_empty()) { return; diff --git a/source/blender/editors/space_node/node_templates.cc b/source/blender/editors/space_node/node_templates.cc index 3a0474ce8ab..6c6ec2b53d8 100644 --- a/source/blender/editors/space_node/node_templates.cc +++ b/source/blender/editors/space_node/node_templates.cc @@ -20,7 +20,7 @@ #include "BLI_string_utf8.h" #include "BLI_vector.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_context.hh" #include "BKE_lib_id.hh" @@ -391,9 +391,6 @@ static Vector ui_node_link_items(NodeLinkArg *arg, else if (dynamic_cast(&socket_decl)) { item.socket_type = SOCK_ROTATION; } - else if (dynamic_cast(&socket_decl)) { - item.socket_type = SOCK_MATRIX; - } else if (dynamic_cast(&socket_decl)) { item.socket_type = SOCK_STRING; } @@ -604,6 +601,8 @@ static void ui_node_menu_column(NodeLinkArg *arg, int nclass, const char *cname) nullptr, 0.0, 0.0, + 0.0, + 0.0, ""); } @@ -627,6 +626,8 @@ static void ui_node_menu_column(NodeLinkArg *arg, int nclass, const char *cname) nullptr, 0.0, 0.0, + 0.0, + 0.0, TIP_("Add node to input")); argN = (NodeLinkArg *)MEM_dupallocN(arg); @@ -686,6 +687,8 @@ static void ui_template_node_link_menu(bContext *C, uiLayout *layout, void *but_ nullptr, 0.0, 0.0, + 0.0, + 0.0, TIP_("Remove nodes connected to the input")); UI_but_funcN_set(but, ui_node_link, MEM_dupallocN(arg), POINTER_FROM_INT(UI_NODE_LINK_REMOVE)); @@ -700,6 +703,8 @@ static void ui_template_node_link_menu(bContext *C, uiLayout *layout, void *but_ nullptr, 0.0, 0.0, + 0.0, + 0.0, TIP_("Disconnect nodes connected to the input")); UI_but_funcN_set( but, ui_node_link, MEM_dupallocN(arg), POINTER_FROM_INT(UI_NODE_LINK_DISCONNECT)); @@ -806,6 +811,8 @@ static void ui_node_draw_panel(uiLayout &layout, nullptr, 0.0, 0.0, + 0.0, + 0.0, ""); UI_but_drawflag_enable(but, UI_BUT_TEXT_LEFT | UI_BUT_NO_TOOLTIP); UI_but_func_set(but, node_panel_toggle_button_cb, &panel_state, &ntree); diff --git a/source/blender/editors/space_node/node_view.cc b/source/blender/editors/space_node/node_view.cc index fe66eb64870..31dc46712af 100644 --- a/source/blender/editors/space_node/node_view.cc +++ b/source/blender/editors/space_node/node_view.cc @@ -8,13 +8,17 @@ #include "DNA_node_types.h" +#include "BLI_listbase.h" #include "BLI_rect.h" #include "BLI_string_ref.hh" #include "BLI_utildefines.h" #include "BKE_context.hh" #include "BKE_image.h" +#include "BKE_main.hh" +#include "BKE_node.hh" #include "BKE_node_runtime.hh" +#include "BKE_screen.hh" #include "ED_image.hh" #include "ED_node.hh" /* own include */ @@ -40,7 +44,7 @@ namespace blender::ed::space_node { /* -------------------------------------------------------------------- */ -/** \name Local Functions +/** \name Local Funcitons * \{ */ static bool space_node_active_view_poll(bContext *C) diff --git a/source/blender/editors/space_node/space_node.cc b/source/blender/editors/space_node/space_node.cc index 6c3bb863ddb..d8015fb8e26 100644 --- a/source/blender/editors/space_node/space_node.cc +++ b/source/blender/editors/space_node/space_node.cc @@ -12,7 +12,9 @@ #include "BLI_string.h" #include "DNA_ID.h" +#include "DNA_gpencil_legacy_types.h" #include "DNA_image_types.h" +#include "DNA_light_types.h" #include "DNA_material_types.h" #include "DNA_modifier_types.h" #include "DNA_node_types.h" @@ -20,6 +22,7 @@ #include "DNA_screen_types.h" #include "DNA_space_types.h" #include "DNA_windowmanager_types.h" +#include "DNA_world_types.h" #include "MEM_guardedalloc.h" @@ -31,6 +34,7 @@ #include "BKE_lib_id.hh" #include "BKE_lib_query.hh" #include "BKE_lib_remap.hh" +#include "BKE_node.hh" #include "BKE_node_runtime.hh" #include "BKE_node_tree_zones.hh" #include "BKE_screen.hh" @@ -38,6 +42,7 @@ #include "ED_image.hh" #include "ED_node.hh" #include "ED_node_preview.hh" +#include "ED_render.hh" #include "ED_screen.hh" #include "ED_space_api.hh" @@ -1150,8 +1155,10 @@ static void node_widgets() WM_gizmogrouptype_append_and_link(gzmap_type, NODE_GGT_backdrop_corner_pin); } -static void node_id_remap(ID *old_id, ID *new_id, SpaceNode *snode) +static void node_id_remap_cb(ID *old_id, ID *new_id, void *user_data) { + SpaceNode *snode = static_cast(user_data); + if (snode->id == old_id) { /* nasty DNA logic for SpaceNode: * ideally should be handled by editor code, but would be bad level call @@ -1181,10 +1188,8 @@ static void node_id_remap(ID *old_id, ID *new_id, SpaceNode *snode) } else if (GS(old_id->name) == ID_NT) { - if (snode->geometry_nodes_tool_tree) { - if (&snode->geometry_nodes_tool_tree->id == old_id) { - snode->geometry_nodes_tool_tree = reinterpret_cast(new_id); - } + if (&snode->geometry_nodes_tool_tree->id == old_id) { + snode->geometry_nodes_tool_tree = reinterpret_cast(new_id); } bNodeTreePath *path, *path_next; @@ -1223,9 +1228,7 @@ static void node_id_remap(ID *old_id, ID *new_id, SpaceNode *snode) } } -static void node_id_remap(ScrArea * /*area*/, - SpaceLink *slink, - const blender::bke::id::IDRemapper &mappings) +static void node_id_remap(ScrArea * /*area*/, SpaceLink *slink, const IDRemapper *mappings) { /* Although we should be able to perform all the mappings in a single go this lead to issues when * running the python test cases. Somehow the nodetree/edittree weren't updated to the new @@ -1238,9 +1241,7 @@ static void node_id_remap(ScrArea * /*area*/, * We could also move a remap address at a time to use the IDRemapper as that should get closer * to cleaner code. See {D13615} for more information about this topic. */ - mappings.iter([&](ID *old_id, ID *new_id) { - node_id_remap(old_id, new_id, reinterpret_cast(slink)); - }); + BKE_id_remapper_iter(mappings, node_id_remap_cb, slink); } static void node_foreach_id(SpaceLink *space_link, LibraryForeachIDData *data) diff --git a/source/blender/editors/space_outliner/CMakeLists.txt b/source/blender/editors/space_outliner/CMakeLists.txt index cd45045e901..26df8082a1c 100644 --- a/source/blender/editors/space_outliner/CMakeLists.txt +++ b/source/blender/editors/space_outliner/CMakeLists.txt @@ -4,7 +4,6 @@ set(INC ../include - ../../blenfont ../../blenkernel ../../blenloader ../../blentranslation @@ -14,8 +13,6 @@ set(INC ../../sequencer ../../windowmanager - ../../../../extern/fmtlib/include - # RNA_prototypes.h ${CMAKE_BINARY_DIR}/source/blender/makesrna ) @@ -140,7 +137,6 @@ set(LIB bf_editor_undo PRIVATE bf::intern::clog PRIVATE bf::intern::guardedalloc - extern_fmtlib ) diff --git a/source/blender/editors/space_outliner/outliner_collections.cc b/source/blender/editors/space_outliner/outliner_collections.cc index c8cb339381c..f7b7265dc71 100644 --- a/source/blender/editors/space_outliner/outliner_collections.cc +++ b/source/blender/editors/space_outliner/outliner_collections.cc @@ -15,12 +15,13 @@ #include "DNA_collection_types.h" #include "DNA_object_types.h" -#include "BKE_collection.hh" +#include "BKE_collection.h" #include "BKE_context.hh" +#include "BKE_idtype.hh" #include "BKE_layer.hh" #include "BKE_lib_id.hh" #include "BKE_main.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "DEG_depsgraph.hh" #include "DEG_depsgraph_build.hh" @@ -251,7 +252,7 @@ static int collection_new_exec(bContext *C, wmOperator *op) BKE_collection_add(bmain, data.collection, nullptr); - DEG_id_tag_update(&data.collection->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&data.collection->id, ID_RECALC_COPY_ON_WRITE); DEG_relations_tag_update(bmain); outliner_cleanup_tree(space_outliner); @@ -417,7 +418,7 @@ static int collection_hierarchy_delete_exec(bContext *C, wmOperator *op) outliner_collection_delete(C, bmain, scene, op->reports, true); - DEG_id_tag_update(&scene->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&scene->id, ID_RECALC_COPY_ON_WRITE); DEG_relations_tag_update(bmain); WM_main_add_notifier(NC_SCENE | ND_LAYER, nullptr); @@ -743,7 +744,7 @@ static int collection_link_exec(bContext *C, wmOperator *op) BLI_gset_free(data.collections_to_edit, nullptr); - DEG_id_tag_update(&active_collection->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&active_collection->id, ID_RECALC_COPY_ON_WRITE); DEG_relations_tag_update(bmain); WM_main_add_notifier(NC_SCENE | ND_LAYER, nullptr); diff --git a/source/blender/editors/space_outliner/outliner_context.cc b/source/blender/editors/space_outliner/outliner_context.cc index 444f9832567..63c747fd656 100644 --- a/source/blender/editors/space_outliner/outliner_context.cc +++ b/source/blender/editors/space_outliner/outliner_context.cc @@ -6,6 +6,8 @@ * \ingroup spoutliner */ +#include "BLI_listbase.h" + #include "BKE_context.hh" #include "DNA_space_types.h" diff --git a/source/blender/editors/space_outliner/outliner_dragdrop.cc b/source/blender/editors/space_outliner/outliner_dragdrop.cc index c01f96c6224..fcc210d7223 100644 --- a/source/blender/editors/space_outliner/outliner_dragdrop.cc +++ b/source/blender/editors/space_outliner/outliner_dragdrop.cc @@ -18,16 +18,16 @@ #include "BLI_listbase.h" #include "BLI_string.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" -#include "BKE_collection.hh" +#include "BKE_collection.h" #include "BKE_context.hh" #include "BKE_layer.hh" #include "BKE_lib_id.hh" #include "BKE_main.hh" #include "BKE_material.h" #include "BKE_object.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "DEG_depsgraph.hh" #include "DEG_depsgraph_build.hh" @@ -1357,12 +1357,12 @@ static int collection_drop_invoke(bContext *C, wmOperator * /*op*/, const wmEven if (from) { DEG_id_tag_update(&from->id, - ID_RECALC_SYNC_TO_EVAL | ID_RECALC_GEOMETRY | ID_RECALC_HIERARCHY); + ID_RECALC_COPY_ON_WRITE | ID_RECALC_GEOMETRY | ID_RECALC_HIERARCHY); } } /* Update dependency graph. */ - DEG_id_tag_update(&data.to->id, ID_RECALC_SYNC_TO_EVAL | ID_RECALC_HIERARCHY); + DEG_id_tag_update(&data.to->id, ID_RECALC_COPY_ON_WRITE | ID_RECALC_HIERARCHY); DEG_relations_tag_update(bmain); WM_event_add_notifier(C, NC_SCENE | ND_LAYER, scene); @@ -1453,7 +1453,7 @@ static int outliner_item_drag_drop_invoke(bContext *C, wmOperator * /*op*/, cons TSE_GPENCIL_EFFECT_BASE); const eWM_DragDataType wm_drag_type = use_datastack_drag ? WM_DRAG_DATASTACK : WM_DRAG_ID; - wmDrag *drag = WM_drag_data_create(C, data.icon, wm_drag_type, nullptr, WM_DRAG_NOP); + wmDrag *drag = WM_drag_data_create(C, data.icon, wm_drag_type, nullptr, 0.0, WM_DRAG_NOP); if (use_datastack_drag) { TreeElement *te_bone = nullptr; diff --git a/source/blender/editors/space_outliner/outliner_draw.cc b/source/blender/editors/space_outliner/outliner_draw.cc index 5b56a5cb62d..60c8f3eee36 100644 --- a/source/blender/editors/space_outliner/outliner_draw.cc +++ b/source/blender/editors/space_outliner/outliner_draw.cc @@ -20,10 +20,11 @@ #include "DNA_text_types.h" #include "BLI_blenlib.h" +#include "BLI_mempool.h" #include "BLI_string_utils.hh" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_armature.hh" #include "BKE_context.hh" @@ -42,7 +43,7 @@ #include "BKE_node.hh" #include "BKE_object.hh" #include "BKE_particle.h" -#include "BKE_report.hh" +#include "BKE_report.h" #include "ANIM_bone_collections.hh" @@ -69,6 +70,7 @@ #include "RNA_access.hh" #include "outliner_intern.hh" +#include "tree/tree_display.hh" #include "tree/tree_element.hh" #include "tree/tree_element_grease_pencil_node.hh" #include "tree/tree_element_id.hh" @@ -284,7 +286,7 @@ static void outliner_object_set_flag_recursive_fn(bContext *C, if (BKE_object_is_child_recursive(ob_parent, ob_iter)) { if (ob) { ptr = RNA_id_pointer_create(&ob_iter->id); - DEG_id_tag_update(&ob_iter->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&ob_iter->id, ID_RECALC_COPY_ON_WRITE); } else { BKE_view_layer_synced_ensure(scene, view_layer); @@ -385,7 +387,7 @@ static void outliner_collection_set_flag_recursive(Scene *scene, RNA_property_boolean_set(&ptr, base_or_object_prop, value); if (collection) { - DEG_id_tag_update(&cob->ob->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&cob->ob->id, ID_RECALC_COPY_ON_WRITE); } } } @@ -407,7 +409,7 @@ static void outliner_collection_set_flag_recursive(Scene *scene, } if (collection) { - DEG_id_tag_update(&collection->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&collection->id, ID_RECALC_COPY_ON_WRITE); } } @@ -737,7 +739,7 @@ static void namebutton_fn(bContext *C, void *tsep, char *oldname) } } - DEG_id_tag_update(tselem->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(tselem->id, ID_RECALC_COPY_ON_WRITE); } else { switch (tselem->type) { @@ -746,7 +748,7 @@ static void namebutton_fn(bContext *C, void *tsep, char *oldname) bDeformGroup *vg = static_cast(te->directdata); BKE_object_defgroup_unique_name(vg, ob); WM_msg_publish_rna_prop(mbus, &ob->id, vg, VertexGroup, name); - DEG_id_tag_update(tselem->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(tselem->id, ID_RECALC_COPY_ON_WRITE); break; } case TSE_NLA_ACTION: { @@ -754,7 +756,7 @@ static void namebutton_fn(bContext *C, void *tsep, char *oldname) BKE_main_namemap_remove_name(bmain, &act->id, oldname); BKE_libblock_ensure_unique_name(bmain, &act->id); WM_msg_publish_rna_prop(mbus, &act->id, &act->id, ID, name); - DEG_id_tag_update(tselem->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(tselem->id, ID_RECALC_COPY_ON_WRITE); break; } case TSE_NLA_TRACK: { @@ -773,7 +775,7 @@ static void namebutton_fn(bContext *C, void *tsep, char *oldname) ED_armature_bone_rename(bmain, arm, oldname, newname); WM_msg_publish_rna_prop(mbus, &arm->id, ebone, EditBone, name); WM_event_add_notifier(C, NC_OBJECT | ND_POSE, nullptr); - DEG_id_tag_update(tselem->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(tselem->id, ID_RECALC_COPY_ON_WRITE); } break; } @@ -795,7 +797,7 @@ static void namebutton_fn(bContext *C, void *tsep, char *oldname) ED_armature_bone_rename(bmain, arm, oldname, newname); WM_msg_publish_rna_prop(mbus, &arm->id, bone, Bone, name); WM_event_add_notifier(C, NC_OBJECT | ND_POSE, nullptr); - DEG_id_tag_update(tselem->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(tselem->id, ID_RECALC_COPY_ON_WRITE); break; } case TSE_POSE_CHANNEL: { @@ -818,8 +820,8 @@ static void namebutton_fn(bContext *C, void *tsep, char *oldname) ED_armature_bone_rename(bmain, static_cast(ob->data), oldname, newname); WM_msg_publish_rna_prop(mbus, &arm->id, pchan->bone, Bone, name); WM_event_add_notifier(C, NC_OBJECT | ND_POSE, nullptr); - DEG_id_tag_update(tselem->id, ID_RECALC_SYNC_TO_EVAL); - DEG_id_tag_update(&arm->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(tselem->id, ID_RECALC_COPY_ON_WRITE); + DEG_id_tag_update(&arm->id, ID_RECALC_COPY_ON_WRITE); break; } case TSE_GP_LAYER: { @@ -836,7 +838,7 @@ static void namebutton_fn(bContext *C, void *tsep, char *oldname) WM_msg_publish_rna_prop(mbus, &gpd->id, gpl, GPencilLayer, info); DEG_id_tag_update(&gpd->id, ID_RECALC_GEOMETRY); WM_event_add_notifier(C, NC_GPENCIL | ND_DATA | NA_SELECTED, gpd); - DEG_id_tag_update(tselem->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(tselem->id, ID_RECALC_COPY_ON_WRITE); break; } case TSE_GREASE_PENCIL_NODE: { @@ -850,7 +852,7 @@ static void namebutton_fn(bContext *C, void *tsep, char *oldname) std::string new_name(node.name()); node.set_name(oldname); grease_pencil.rename_node(node, new_name); - DEG_id_tag_update(&grease_pencil.id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&grease_pencil.id, ID_RECALC_COPY_ON_WRITE); WM_event_add_notifier(C, NC_ID | NA_RENAME, nullptr); break; } @@ -867,7 +869,7 @@ static void namebutton_fn(bContext *C, void *tsep, char *oldname) BKE_view_layer_rename(bmain, scene, view_layer, newname); WM_msg_publish_rna_prop(mbus, &scene->id, view_layer, ViewLayer, name); WM_event_add_notifier(C, NC_ID | NA_RENAME, nullptr); - DEG_id_tag_update(tselem->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(tselem->id, ID_RECALC_COPY_ON_WRITE); break; } case TSE_LAYER_COLLECTION: { @@ -877,7 +879,7 @@ static void namebutton_fn(bContext *C, void *tsep, char *oldname) BKE_libblock_ensure_unique_name(bmain, &collection->id); WM_msg_publish_rna_prop(mbus, &collection->id, &collection->id, ID, name); WM_event_add_notifier(C, NC_ID | NA_RENAME, nullptr); - DEG_id_tag_update(tselem->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(tselem->id, ID_RECALC_COPY_ON_WRITE); break; } @@ -888,7 +890,7 @@ static void namebutton_fn(bContext *C, void *tsep, char *oldname) ANIM_armature_bonecoll_name_set(arm, bcoll, bcoll->name); WM_msg_publish_rna_prop(mbus, &arm->id, bcoll, BoneCollection, name); WM_event_add_notifier(C, NC_OBJECT | ND_BONE_COLLECTION, arm); - DEG_id_tag_update(&arm->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&arm->id, ID_RECALC_COPY_ON_WRITE); break; } } @@ -1151,6 +1153,8 @@ static void outliner_draw_restrictbuts(uiBlock *block, &layer->flag, 0, 0, + 0, + 0, TIP_("Use view layer for rendering")); UI_but_func_set(bt, restrictbutton_r_lay_fn, tselem->id, nullptr); UI_but_flag_enable(bt, UI_BUT_DRAG_LOCK); @@ -1380,6 +1384,8 @@ static void outliner_draw_restrictbuts(uiBlock *block, &(bone->flag), 0, 0, + 0, + 0, TIP_("Restrict selection in the 3D View\n" "* Shift to set children")); UI_but_func_set(bt, restrictbutton_bone_select_fn, ob->data, bone); @@ -1404,6 +1410,8 @@ static void outliner_draw_restrictbuts(uiBlock *block, &(ebone->flag), 0, 0, + 0, + 0, TIP_("Restrict visibility in the 3D View\n" "* Shift to set children")); UI_but_func_set(bt, restrictbutton_ebone_visibility_fn, arm, ebone); @@ -1424,6 +1432,8 @@ static void outliner_draw_restrictbuts(uiBlock *block, &(ebone->flag), 0, 0, + 0, + 0, TIP_("Restrict selection in the 3D View\n" "* Shift to set children")); UI_but_func_set(bt, restrictbutton_ebone_select_fn, arm, ebone); @@ -1448,6 +1458,8 @@ static void outliner_draw_restrictbuts(uiBlock *block, &gpl->flag, 0, 0, + 0, + 0, TIP_("Restrict visibility in the 3D View")); UI_but_func_set(bt, restrictbutton_gp_layer_flag_fn, id, gpl); UI_but_flag_enable(bt, UI_BUT_DRAG_LOCK); @@ -1467,6 +1479,8 @@ static void outliner_draw_restrictbuts(uiBlock *block, &gpl->flag, 0, 0, + 0, + 0, TIP_("Restrict editing of strokes and keyframes in this layer")); UI_but_func_set(bt, restrictbutton_gp_layer_flag_fn, id, gpl); UI_but_flag_enable(bt, UI_BUT_DRAG_LOCK); @@ -1780,6 +1794,8 @@ static void outliner_draw_userbuts(uiBlock *block, nullptr, 0.0, 0.0, + 0, + 0, TIP_("Number of users of this data-block")); UI_but_flag_enable(bt, but_flag); @@ -1801,6 +1817,8 @@ static void outliner_draw_userbuts(uiBlock *block, &id->flag, 0, 0, + 0, + 0, tip); UI_but_func_set(bt, restrictbutton_id_user_toggle, id, nullptr); UI_but_flag_enable(bt, but_flag); @@ -1837,7 +1855,7 @@ static void outliner_draw_overrides_rna_buts(uiBlock *block, uiBut *but = uiDefBut(block, UI_BTYPE_LABEL, 0, - override_elem->rna_path, + override_elem->rna_path.c_str(), x + pad_x, te->ys + pad_y, item_max_width, @@ -1845,6 +1863,8 @@ static void outliner_draw_overrides_rna_buts(uiBlock *block, nullptr, 0.0f, 0.0f, + 0.0f, + 0.0f, ""); UI_but_flag_enable(but, UI_BUT_REDALERT); continue; @@ -1858,7 +1878,7 @@ static void outliner_draw_overrides_rna_buts(uiBlock *block, uiDefBut(block, UI_BTYPE_LABEL, 0, - op_label, + op_label.c_str(), x + pad_x, te->ys + pad_y, item_max_width, @@ -1866,6 +1886,8 @@ static void outliner_draw_overrides_rna_buts(uiBlock *block, nullptr, 0, 0, + 0, + 0, ""); continue; } @@ -2106,6 +2128,8 @@ static void outliner_buttons(const bContext *C, (void *)te->name, 1.0, float(len), + 0, + 0, ""); UI_but_func_rename_set(bt, namebutton_fn, tselem); @@ -2203,6 +2227,8 @@ static void outliner_draw_mode_column_toggle(uiBlock *block, nullptr, 0.0, 0.0, + 0.0, + 0.0, tip); UI_but_func_set(but, outliner_mode_toggle_fn, tselem, nullptr); UI_but_flag_enable(but, UI_BUT_DRAG_LOCK); @@ -2291,6 +2317,8 @@ static void outliner_draw_warning_tree_element(uiBlock *block, nullptr, 0.0, 0.0, + 0.0, + 0.0, warning_msg.c_str()); /* No need for undo here, this is a pure info widget. */ UI_but_flag_disable(but, UI_BUT_UNDO); @@ -2433,8 +2461,6 @@ static BIFIconID tree_element_get_icon_from_id(const ID *id) return ICON_WORLD_DATA; case ID_AC: return ICON_ACTION; - case ID_AN: - return ICON_ACTION; /* TODO: give Animation its own icon. */ case ID_NLA: return ICON_NLA; case ID_TXT: { @@ -2966,6 +2992,8 @@ static bool tselem_draw_icon(uiBlock *block, nullptr, 0.0, 0.0, + 0.0, + 0.0f, (data.drag_id && ID_IS_LINKED(data.drag_id)) ? data.drag_id->lib->filepath : ""); } diff --git a/source/blender/editors/space_outliner/outliner_edit.cc b/source/blender/editors/space_outliner/outliner_edit.cc index 15c2f8d15fa..aaa86123dec 100644 --- a/source/blender/editors/space_outliner/outliner_edit.cc +++ b/source/blender/editors/space_outliner/outliner_edit.cc @@ -7,10 +7,6 @@ */ #include -#include -#include - -#include #include "MEM_guardedalloc.h" @@ -25,9 +21,7 @@ #include "BLI_path_util.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" - -#include "BLF_api.hh" +#include "BLT_translation.h" #include "BKE_action.h" #include "BKE_animsys.h" @@ -43,7 +37,7 @@ #include "BKE_lib_remap.hh" #include "BKE_main.hh" #include "BKE_object.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "BKE_workspace.h" #include "DEG_depsgraph.hh" @@ -71,8 +65,6 @@ #include "tree/tree_element_rna.hh" #include "tree/tree_iterator.hh" -#include "wm_window.hh" - using namespace blender::ed::outliner; namespace blender::ed::outliner { @@ -105,7 +97,7 @@ static int outliner_highlight_update_invoke(bContext *C, wmOperator * /*op*/, co return OPERATOR_PASS_THROUGH; } - /* Drag and drop does its own highlighting. */ + /* Drag and drop does own highlighting. */ wmWindowManager *wm = CTX_wm_manager(C); if (wm->drags.first) { return OPERATOR_PASS_THROUGH; @@ -376,7 +368,8 @@ void item_rename_fn(bContext *C, Scene * /*scene*/, TreeElement *te, TreeStoreElem * /*tsep*/, - TreeStoreElem *tselem) + TreeStoreElem *tselem, + void * /*user_data*/) { ARegion *region = CTX_wm_region(C); do_item_rename(region, te, tselem, reports); @@ -522,7 +515,8 @@ void id_delete_tag_fn(bContext *C, Scene * /*scene*/, TreeElement *te, TreeStoreElem * /*tsep*/, - TreeStoreElem *tselem) + TreeStoreElem *tselem, + void * /*user_data*/) { id_delete_tag(C, reports, te, tselem); } @@ -693,7 +687,7 @@ static int outliner_id_remap_invoke(bContext *C, wmOperator *op, const wmEvent * outliner_id_remap_find_tree_element(C, op, &space_outliner->tree, fmval[1]); } - return WM_operator_props_dialog_popup(C, op, 400, IFACE_("Remap Data ID"), IFACE_("Remap")); + return WM_operator_props_dialog_popup(C, op, 400); } static const EnumPropertyItem *outliner_id_itemf(bContext *C, @@ -766,7 +760,8 @@ void id_remap_fn(bContext *C, Scene * /*scene*/, TreeElement * /*te*/, TreeStoreElem * /*tsep*/, - TreeStoreElem *tselem) + TreeStoreElem *tselem, + void * /*user_data*/) { wmOperatorType *ot = WM_operatortype_find("OUTLINER_OT_id_remap", false); PointerRNA op_props; @@ -1006,7 +1001,8 @@ void lib_relocate_fn(bContext *C, Scene * /*scene*/, TreeElement *te, TreeStoreElem * /*tsep*/, - TreeStoreElem *tselem) + TreeStoreElem *tselem, + void * /*user_data*/) { /* XXX: This does not work with several items * (it is only called once in the end, due to the 'deferred' @@ -1062,7 +1058,8 @@ void lib_reload_fn(bContext *C, Scene * /*scene*/, TreeElement *te, TreeStoreElem * /*tsep*/, - TreeStoreElem *tselem) + TreeStoreElem *tselem, + void * /*user_data*/) { wmOperatorType *ot = WM_operatortype_find("WM_OT_lib_reload", false); @@ -2127,95 +2124,51 @@ static bool ed_operator_outliner_id_orphans_active(bContext *C) return true; } -static void unused_message_gen(std::string &message, - const std::array &num_tagged) -{ - bool is_first = true; - if (num_tagged[INDEX_ID_NULL] == 0) { - message += IFACE_("None"); - return; - } - - /* NOTE: Index is looped in reversed order, since typically 'higher level' IDs (like Collections - * or Objects) have a higher index than 'lower level' ones like object data, materials, etc. - * - * It makes more sense to present to the user the deleted numbers of Collections or Objects - * before the ones for object data or Materials. */ - for (int i = INDEX_ID_MAX - 2; i >= 0; i--) { - if (num_tagged[i] != 0) { - message += fmt::format( - "{}{} {}", - (is_first) ? "" : ", ", - num_tagged[i], - (num_tagged[i] > 1) ? - IFACE_(BKE_idtype_idcode_to_name_plural(BKE_idtype_index_to_idcode(i))) : - IFACE_(BKE_idtype_idcode_to_name(BKE_idtype_index_to_idcode(i)))); - is_first = false; - } - } -} - -static int unused_message_popup_width_compute(bContext *C) -{ - /* Computation of unused data amounts, with all options ON. - * Used to estimate the maximum required width for the dialog. */ - Main *bmain = CTX_data_main(C); - LibQueryUnusedIDsData data; - data.do_local_ids = true; - data.do_linked_ids = true; - data.do_recursive = true; - BKE_lib_query_unused_ids_amounts(bmain, data); - - std::string unused_message = ""; - const uiStyle *style = UI_style_get_dpi(); - unused_message_gen(unused_message, data.num_local); - float max_messages_width = BLF_width( - style->widget.uifont_id, unused_message.c_str(), BLF_DRAW_STR_DUMMY_MAX); - - unused_message = ""; - unused_message_gen(unused_message, data.num_linked); - max_messages_width = std::max( - max_messages_width, - BLF_width(style->widget.uifont_id, unused_message.c_str(), BLF_DRAW_STR_DUMMY_MAX)); - - return int(std::max(max_messages_width, 300.0f)); -} - -static void outliner_orphans_purge_cleanup(wmOperator *op) -{ - if (op->customdata) { - MEM_delete(static_cast(op->customdata)); - op->customdata = nullptr; - } -} - -static bool outliner_orphans_purge_check(bContext *C, wmOperator *op) -{ - Main *bmain = CTX_data_main(C); - LibQueryUnusedIDsData &data = *static_cast(op->customdata); - - data.do_local_ids = RNA_boolean_get(op->ptr, "do_local_ids"); - data.do_linked_ids = RNA_boolean_get(op->ptr, "do_linked_ids"); - data.do_recursive = RNA_boolean_get(op->ptr, "do_recursive"); - - BKE_lib_query_unused_ids_amounts(bmain, data); - - /* Always assume count changed, and request a redraw. */ - return true; -} - static int outliner_orphans_purge_invoke(bContext *C, wmOperator *op, const wmEvent * /*event*/) { - op->customdata = MEM_new(__func__); + Main *bmain = CTX_data_main(C); + int num_tagged[INDEX_ID_MAX] = {0}; - /* Compute expected amounts of deleted IDs and store them in 'cached' operator properties. */ - outliner_orphans_purge_check(C, op); + 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"); - return WM_operator_props_dialog_popup(C, - op, - unused_message_popup_width_compute(C), - IFACE_("Purge Unused Data From This File"), - IFACE_("Delete")); + /* 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) { + BKE_report(op->reports, RPT_INFO, "No orphaned data-blocks to purge"); + return OPERATOR_CANCELLED; + } + + DynStr *dyn_str = BLI_dynstr_new(); + BLI_dynstr_appendf(dyn_str, RPT_("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) { + if (!is_first) { + BLI_dynstr_append(dyn_str, ", "); + } + else { + is_first = false; + } + BLI_dynstr_appendf(dyn_str, + "%d %s", + num_tagged[i], + RPT_(BKE_idtype_idcode_to_name_plural(BKE_idtype_idcode_from_index(i)))); + } + } + BLI_dynstr_append(dyn_str, RPT_("). Click here to proceed...")); + + char *message = BLI_dynstr_get_cstring(dyn_str); + int ret = WM_operator_confirm_message(C, op, message); + + MEM_freeN(message); + BLI_dynstr_free(dyn_str); + return ret; } static int outliner_orphans_purge_exec(bContext *C, wmOperator *op) @@ -2223,27 +2176,26 @@ static int outliner_orphans_purge_exec(bContext *C, wmOperator *op) Main *bmain = CTX_data_main(C); ScrArea *area = CTX_wm_area(C); SpaceOutliner *space_outliner = CTX_wm_space_outliner(C); + int num_tagged[INDEX_ID_MAX] = {0}; - if (!op->customdata) { - op->customdata = MEM_new(__func__); - } - LibQueryUnusedIDsData &data = *static_cast(op->customdata); + if ((num_tagged[INDEX_ID_NULL] = RNA_int_get(op->ptr, "num_deleted")) == 0) { + 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"); - data.do_local_ids = RNA_boolean_get(op->ptr, "do_local_ids"); - data.do_linked_ids = RNA_boolean_get(op->ptr, "do_linked_ids"); - data.do_recursive = 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); - /* Tag all IDs to delete. */ - BKE_lib_query_unused_ids_tag(bmain, LIB_TAG_DOIT, data); - - if (data.num_total[INDEX_ID_NULL] == 0) { - BKE_report(op->reports, RPT_INFO, "No orphaned data-blocks to purge"); - return OPERATOR_CANCELLED; + if (num_tagged[INDEX_ID_NULL] == 0) { + BKE_report(op->reports, RPT_INFO, "No orphaned data-blocks to purge"); + return OPERATOR_CANCELLED; + } } BKE_id_multi_tagged_delete(bmain); - BKE_reportf(op->reports, RPT_INFO, "Deleted %d data-block(s)", data.num_total[INDEX_ID_NULL]); + BKE_reportf(op->reports, RPT_INFO, "Deleted %d data-block(s)", num_tagged[INDEX_ID_NULL]); /* XXX: tree management normally happens from draw_outliner(), but when * you're clicking to fast on Delete object from context menu in @@ -2259,51 +2211,9 @@ static int outliner_orphans_purge_exec(bContext *C, wmOperator *op) /* Force full redraw of the UI. */ WM_main_add_notifier(NC_WINDOW, nullptr); - outliner_orphans_purge_cleanup(op); - return OPERATOR_FINISHED; } -static void outliner_orphans_purge_cancel(bContext * /*C*/, wmOperator *op) -{ - outliner_orphans_purge_cleanup(op); -} - -static void outliner_orphans_purge_ui(bContext * /*C*/, wmOperator *op) -{ - uiLayout *layout = op->layout; - PointerRNA *ptr = op->ptr; - if (!op->customdata) { - /* This should only happen on 'adjust last operation' case, since `invoke` will not have been - * called then before showing the UI (the 'redo panel' UI uses WM-stored operator properties - * and a newly-created operator). - * - * Since that operator is not 'registered' for adjusting from undo stack, this should never - * happen currently. */ - BLI_assert_unreachable(); - op->customdata = MEM_new(__func__); - } - LibQueryUnusedIDsData &data = *static_cast(op->customdata); - - std::string unused_message = ""; - unused_message_gen(unused_message, data.num_local); - uiLayout *column = uiLayoutColumn(layout, true); - uiItemR(column, ptr, "do_local_ids", UI_ITEM_NONE, nullptr, ICON_NONE); - uiLayout *row = uiLayoutRow(column, true); - uiItemS_ex(row, 2.67f); - uiItemL(row, unused_message.c_str(), ICON_NONE); - - unused_message = ""; - unused_message_gen(unused_message, data.num_linked); - column = uiLayoutColumn(layout, true); - uiItemR(column, ptr, "do_linked_ids", UI_ITEM_NONE, nullptr, ICON_NONE); - row = uiLayoutRow(column, true); - uiItemS_ex(row, 2.67f); - uiItemL(row, unused_message.c_str(), ICON_NONE); - - uiItemR(layout, ptr, "do_recursive", UI_ITEM_NONE, nullptr, ICON_NONE); -} - void OUTLINER_OT_orphans_purge(wmOperatorType *ot) { /* identifiers */ @@ -2314,17 +2224,15 @@ void OUTLINER_OT_orphans_purge(wmOperatorType *ot) /* callbacks */ ot->invoke = outliner_orphans_purge_invoke; ot->exec = outliner_orphans_purge_exec; - ot->cancel = outliner_orphans_purge_cancel; - ot->poll = ed_operator_outliner_id_orphans_active; - ot->check = outliner_orphans_purge_check; - ot->ui = outliner_orphans_purge_ui; /* flags */ - /* NOTE: No #OPTYPE_REGISTER, since this operator should not be 'adjustable'. */ - ot->flag = OPTYPE_UNDO; + ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; + + /* properties */ + PropertyRNA *prop = RNA_def_int(ot->srna, "num_deleted", 0, 0, INT_MAX, "", "", 0, INT_MAX); + RNA_def_property_flag(prop, (PropertyFlag)(PROP_SKIP_SAVE | PROP_HIDDEN)); - /* Actual user-visible settings. */ RNA_def_boolean(ot->srna, "do_local_ids", true, @@ -2346,53 +2254,4 @@ void OUTLINER_OT_orphans_purge(wmOperatorType *ot) /** \} */ -/* -------------------------------------------------------------------- */ -/** \name Manage Orphan Data-Blocks Operator - * \{ */ - -static int outliner_orphans_manage_invoke(bContext *C, wmOperator * /*op*/, const wmEvent *event) -{ - const int sizex = int(450.0f * UI_SCALE_FAC); - const int sizey = int(450.0f * UI_SCALE_FAC); - const rcti window_rect = { - /*xmin*/ event->xy[0], - /*xmax*/ event->xy[0] + sizex, - /*ymin*/ event->xy[1], - /*ymax*/ event->xy[1] + sizey, - }; - - if (WM_window_open(C, - IFACE_("Manage Unused Data"), - &window_rect, - SPACE_OUTLINER, - false, - false, - true, - WIN_ALIGN_LOCATION_CENTER, - nullptr, - nullptr) != nullptr) - { - SpaceOutliner *soutline = CTX_wm_space_outliner(C); - soutline->outlinevis = SO_ID_ORPHANS; - return OPERATOR_FINISHED; - } - return OPERATOR_CANCELLED; -} - -void OUTLINER_OT_orphans_manage(wmOperatorType *ot) -{ - /* identifiers */ - ot->idname = "OUTLINER_OT_orphans_manage"; - ot->name = "Manage Unused Data"; - ot->description = "Open a window to manage unused data"; - - /* callbacks */ - ot->invoke = outliner_orphans_manage_invoke; - - /* flags */ - ot->flag = OPTYPE_REGISTER; -} - -/** \} */ - } // namespace blender::ed::outliner diff --git a/source/blender/editors/space_outliner/outliner_intern.hh b/source/blender/editors/space_outliner/outliner_intern.hh index 7e7204eaadf..b81ff4437f1 100644 --- a/source/blender/editors/space_outliner/outliner_intern.hh +++ b/source/blender/editors/space_outliner/outliner_intern.hh @@ -10,8 +10,6 @@ #include -#include "BLI_function_ref.hh" - #include "RNA_types.hh" /* Needed for `tree_element_cast()`. */ @@ -139,7 +137,6 @@ struct TreeElementIcon { ID_GR, \ ID_AR, \ ID_AC, \ - ID_AN, \ ID_BR, \ ID_PA, \ ID_GD_LEGACY, \ @@ -385,12 +382,13 @@ bool outliner_is_co_within_mode_column(SpaceOutliner *space_outliner, const floa void outliner_item_mode_toggle(bContext *C, TreeViewContext *tvc, TreeElement *te, bool do_extend); /* `outliner_edit.cc` */ -using outliner_operation_fn = blender::FunctionRef; +using outliner_operation_fn = void (*)(bContext *C, + ReportList *, + Scene *scene, + TreeElement *, + TreeStoreElem *, + TreeStoreElem *, + void *); /** * \param recurse_selected: Set to false for operations which are already @@ -402,6 +400,7 @@ void outliner_do_object_operation_ex(bContext *C, SpaceOutliner *space_outliner, ListBase *lb, outliner_operation_fn operation_fn, + void *user_data, bool recurse_selected); void outliner_do_object_operation(bContext *C, ReportList *reports, @@ -425,32 +424,37 @@ void item_rename_fn(bContext *C, Scene *scene, TreeElement *te, TreeStoreElem *tsep, - TreeStoreElem *tselem); + TreeStoreElem *tselem, + void *user_data); void lib_relocate_fn(bContext *C, ReportList *reports, Scene *scene, TreeElement *te, TreeStoreElem *tsep, - TreeStoreElem *tselem); + TreeStoreElem *tselem, + void *user_data); void lib_reload_fn(bContext *C, ReportList *reports, Scene *scene, TreeElement *te, TreeStoreElem *tsep, - TreeStoreElem *tselem); + TreeStoreElem *tselem, + void *user_data); void id_delete_tag_fn(bContext *C, ReportList *reports, Scene *scene, TreeElement *te, TreeStoreElem *tsep, - TreeStoreElem *tselem); + TreeStoreElem *tselem, + void *user_data); void id_remap_fn(bContext *C, ReportList *reports, Scene *scene, TreeElement *te, TreeStoreElem *tsep, - TreeStoreElem *tselem); + TreeStoreElem *tselem, + void *user_data); /** * To retrieve coordinates with redrawing the entire tree. @@ -508,7 +512,6 @@ void OUTLINER_OT_drivers_add_selected(wmOperatorType *ot); void OUTLINER_OT_drivers_delete_selected(wmOperatorType *ot); void OUTLINER_OT_orphans_purge(wmOperatorType *ot); -void OUTLINER_OT_orphans_manage(wmOperatorType *ot); /* `outliner_query.cc` */ diff --git a/source/blender/editors/space_outliner/outliner_ops.cc b/source/blender/editors/space_outliner/outliner_ops.cc index 8be6ddd0949..b94df433274 100644 --- a/source/blender/editors/space_outliner/outliner_ops.cc +++ b/source/blender/editors/space_outliner/outliner_ops.cc @@ -60,7 +60,6 @@ void outliner_operatortypes() WM_operatortype_append(OUTLINER_OT_drivers_delete_selected); WM_operatortype_append(OUTLINER_OT_orphans_purge); - WM_operatortype_append(OUTLINER_OT_orphans_manage); WM_operatortype_append(OUTLINER_OT_parent_drop); WM_operatortype_append(OUTLINER_OT_parent_clear); diff --git a/source/blender/editors/space_outliner/outliner_select.cc b/source/blender/editors/space_outliner/outliner_select.cc index 06f6b402f9b..f8ae176cb0c 100644 --- a/source/blender/editors/space_outliner/outliner_select.cc +++ b/source/blender/editors/space_outliner/outliner_select.cc @@ -11,6 +11,7 @@ #include "MEM_guardedalloc.h" #include "DNA_armature_types.h" +#include "DNA_collection_types.h" #include "DNA_gpencil_legacy_types.h" #include "DNA_gpencil_modifier_types.h" #include "DNA_modifier_types.h" @@ -18,12 +19,13 @@ #include "DNA_scene_types.h" #include "DNA_sequence_types.h" #include "DNA_shader_fx_types.h" +#include "DNA_text_types.h" #include "BLI_listbase.h" #include "BLI_utildefines.h" #include "BKE_armature.hh" -#include "BKE_collection.hh" +#include "BKE_collection.h" #include "BKE_constraint.h" #include "BKE_context.hh" #include "BKE_deform.hh" @@ -36,7 +38,7 @@ #include "BKE_modifier.hh" #include "BKE_object.hh" #include "BKE_particle.h" -#include "BKE_report.hh" +#include "BKE_report.h" #include "BKE_shader_fx.h" #include "DEG_depsgraph.hh" @@ -68,6 +70,7 @@ #include "ANIM_bone_collections.hh" #include "outliner_intern.hh" +#include "tree/tree_display.hh" #include "tree/tree_element_grease_pencil_node.hh" #include "tree/tree_element_seq.hh" #include "tree/tree_iterator.hh" @@ -81,7 +84,7 @@ namespace blender::ed::outliner { /** * \note changes to selection are by convention and not essential. * - * \note Handles its own undo push. + * \note Handles own undo push. */ static void do_outliner_item_editmode_toggle(bContext *C, Scene *scene, Base *base) { @@ -114,7 +117,7 @@ static void do_outliner_item_editmode_toggle(bContext *C, Scene *scene, Base *ba /** * \note changes to selection are by convention and not essential. * - * \note Handles its own undo push. + * \note Handles own undo push. */ static void do_outliner_item_posemode_toggle(bContext *C, Scene *scene, Base *base) { @@ -158,7 +161,7 @@ static void do_outliner_item_posemode_toggle(bContext *C, Scene *scene, Base *ba * If we didn't want to touch selection we could add an option to the operators * not to do multi-object editing. * - * \note Handles its own undo push. + * \note Handles own undo push. */ static void do_outliner_item_mode_toggle_generic(bContext *C, TreeViewContext *tvc, Base *base) { @@ -444,7 +447,7 @@ static void tree_element_camera_activate(bContext *C, Scene *scene, TreeElement wmWindowManager *wm = static_cast(bmain->wm.first); WM_windows_scene_data_sync(&wm->windows, scene); - DEG_id_tag_update(&scene->id, ID_RECALC_SYNC_TO_EVAL); + 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, nullptr); } diff --git a/source/blender/editors/space_outliner/outliner_sync.cc b/source/blender/editors/space_outliner/outliner_sync.cc index 10b0a960c01..fbd650dd53c 100644 --- a/source/blender/editors/space_outliner/outliner_sync.cc +++ b/source/blender/editors/space_outliner/outliner_sync.cc @@ -250,7 +250,7 @@ static void outliner_select_sync_to_edit_bone(const Scene *scene, else if (!is_edit_bone_selected(selected_ebones, ebone)) { /* Don't flush to parent bone tip, synced selection is iterating the whole tree so * deselecting potential children with `ED_armature_ebone_select_set(ebone, false)` - * would leave its own tip deselected. */ + * would leave own tip deselected. */ ebone->flag &= ~(BONE_SELECTED | BONE_TIPSEL | BONE_ROOTSEL); } } diff --git a/source/blender/editors/space_outliner/outliner_tools.cc b/source/blender/editors/space_outliner/outliner_tools.cc index fe478f83318..2176b0242bb 100644 --- a/source/blender/editors/space_outliner/outliner_tools.cc +++ b/source/blender/editors/space_outliner/outliner_tools.cc @@ -37,14 +37,14 @@ #include "BLI_utildefines.h" #include "BLI_vector.hh" -#include "BKE_anim_data.hh" +#include "BKE_anim_data.h" #include "BKE_animsys.h" #include "BKE_armature.hh" -#include "BKE_collection.hh" +#include "BKE_collection.h" #include "BKE_constraint.h" #include "BKE_context.hh" -#include "BKE_fcurve.hh" -#include "BKE_global.hh" +#include "BKE_fcurve.h" +#include "BKE_global.h" #include "BKE_grease_pencil.hh" #include "BKE_idtype.hh" #include "BKE_layer.hh" @@ -54,8 +54,8 @@ #include "BKE_lib_remap.hh" #include "BKE_main.hh" #include "BKE_object.hh" -#include "BKE_report.hh" -#include "BKE_scene.hh" +#include "BKE_report.h" +#include "BKE_scene.h" #include "BKE_screen.hh" #include "DEG_depsgraph.hh" @@ -77,7 +77,7 @@ #include "UI_resources.hh" #include "UI_view2d.hh" -#include "../../blender/blenloader/BLO_readfile.hh" +#include "../../blender/blenloader/BLO_readfile.h" #include "RNA_access.hh" #include "RNA_define.hh" @@ -147,7 +147,6 @@ static void get_element_operation_type( case ID_KE: case ID_WO: case ID_AC: - case ID_AN: case ID_TXT: case ID_GR: case ID_LS: @@ -223,7 +222,8 @@ static void unlink_action_fn(bContext *C, Scene * /*scene*/, TreeElement * /*te*/, TreeStoreElem *tsep, - TreeStoreElem *tselem) + TreeStoreElem *tselem, + void * /*user_data*/) { if (!tsep || !TSE_IS_REAL_ID(tsep)) { /* Valid case, no parent element of the action or it is not an ID (could be a #TSE_ID_BASE @@ -247,7 +247,8 @@ static void unlink_material_fn(bContext * /*C*/, Scene * /*scene*/, TreeElement *te, TreeStoreElem *tsep, - TreeStoreElem *tselem) + TreeStoreElem *tselem, + void * /*user_data*/) { const bool te_is_material = TSE_IS_REAL_ID(tselem) && (GS(tselem->id->name) == ID_MA); @@ -334,7 +335,8 @@ static void unlink_texture_fn(bContext * /*C*/, Scene * /*scene*/, TreeElement *te, TreeStoreElem *tsep, - TreeStoreElem *tselem) + TreeStoreElem *tselem, + void * /*user_data*/) { if (!tsep || !TSE_IS_REAL_ID(tsep)) { /* Valid case, no parent element of the texture or it is not an ID (could be a #TSE_ID_BASE @@ -373,7 +375,8 @@ static void unlink_collection_fn(bContext *C, Scene * /*scene*/, TreeElement * /*te*/, TreeStoreElem *tsep, - TreeStoreElem *tselem) + TreeStoreElem *tselem, + void * /*user_data*/) { Main *bmain = CTX_data_main(C); Collection *collection = (Collection *)tselem->id; @@ -410,7 +413,7 @@ static void unlink_collection_fn(bContext *C, Collection *parent = (Collection *)tsep->id; id_fake_user_set(&collection->id); BKE_collection_child_remove(bmain, parent, collection); - DEG_id_tag_update(&parent->id, ID_RECALC_SYNC_TO_EVAL | ID_RECALC_HIERARCHY); + DEG_id_tag_update(&parent->id, ID_RECALC_COPY_ON_WRITE | ID_RECALC_HIERARCHY); DEG_relations_tag_update(bmain); } else if (GS(tsep->id->name) == ID_SCE) { @@ -418,7 +421,7 @@ static void unlink_collection_fn(bContext *C, Collection *parent = scene->master_collection; id_fake_user_set(&collection->id); BKE_collection_child_remove(bmain, parent, collection); - DEG_id_tag_update(&scene->id, ID_RECALC_SYNC_TO_EVAL | ID_RECALC_HIERARCHY); + DEG_id_tag_update(&scene->id, ID_RECALC_COPY_ON_WRITE | ID_RECALC_HIERARCHY); DEG_relations_tag_update(bmain); } } @@ -429,7 +432,8 @@ static void unlink_object_fn(bContext *C, Scene * /*scene*/, TreeElement *te, TreeStoreElem *tsep, - TreeStoreElem *tselem) + TreeStoreElem *tselem, + void * /*user_data*/) { if (tsep && tsep->id) { Main *bmain = CTX_data_main(C); @@ -464,7 +468,7 @@ static void unlink_object_fn(bContext *C, if (GS(tsep->id->name) == ID_GR) { Collection *parent = (Collection *)tsep->id; BKE_collection_object_remove(bmain, parent, ob, true); - DEG_id_tag_update(&parent->id, ID_RECALC_SYNC_TO_EVAL | ID_RECALC_HIERARCHY); + DEG_id_tag_update(&parent->id, ID_RECALC_COPY_ON_WRITE | ID_RECALC_HIERARCHY); DEG_id_tag_update(&ob->id, ID_RECALC_HIERARCHY); DEG_relations_tag_update(bmain); } @@ -481,7 +485,7 @@ static void unlink_object_fn(bContext *C, } } FOREACH_SCENE_COLLECTION_END; - DEG_id_tag_update(&scene->id, ID_RECALC_SYNC_TO_EVAL | ID_RECALC_HIERARCHY); + DEG_id_tag_update(&scene->id, ID_RECALC_COPY_ON_WRITE | ID_RECALC_HIERARCHY); DEG_relations_tag_update(bmain); } } @@ -493,7 +497,8 @@ static void unlink_world_fn(bContext * /*C*/, Scene * /*scene*/, TreeElement * /*te*/, TreeStoreElem *tsep, - TreeStoreElem *tselem) + TreeStoreElem *tselem, + void * /*user_data*/) { if (!tsep || !TSE_IS_REAL_ID(tsep)) { /* Valid case, no parent element of the world or it is not an ID (could be a #TSE_ID_BASE @@ -518,7 +523,8 @@ static void outliner_do_libdata_operation(bContext *C, ReportList *reports, Scene *scene, SpaceOutliner *space_outliner, - outliner_operation_fn operation_fn) + outliner_operation_fn operation_fn, + void *user_data) { tree_iterator::all_open(*space_outliner, [&](TreeElement *te) { TreeStoreElem *tselem = TREESTORE(te); @@ -527,7 +533,7 @@ static void outliner_do_libdata_operation(bContext *C, tselem->type == TSE_LAYER_COLLECTION) { TreeStoreElem *tsep = te->parent ? TREESTORE(te->parent) : nullptr; - operation_fn(C, reports, scene, te, tsep, tselem); + operation_fn(C, reports, scene, te, tsep, tselem, user_data); } } }); @@ -570,7 +576,8 @@ static bool outliner_do_libdata_operation_selection_set_element( TreeStoreElem *tselem, const bool has_parent_selected, outliner_operation_fn operation_fn, - eOutlinerLibOpSelectionSet selection_set) + eOutlinerLibOpSelectionSet selection_set, + void *user_data) { const bool do_selected = ELEM(selection_set, OUTLINER_LIB_SELECTIONSET_SELECTED, @@ -585,7 +592,7 @@ static bool outliner_do_libdata_operation_selection_set_element( tselem->type == TSE_LAYER_COLLECTION) { TreeStoreElem *tsep = element->parent ? TREESTORE(element->parent) : nullptr; - operation_fn(C, reports, scene, element, tsep, tselem); + operation_fn(C, reports, scene, element, tsep, tselem, user_data); } } return is_selected; @@ -598,7 +605,8 @@ static void outliner_do_libdata_operation_selection_set(bContext *C, const ListBase &subtree, const bool has_parent_selected, outliner_operation_fn operation_fn, - eOutlinerLibOpSelectionSet selection_set) + eOutlinerLibOpSelectionSet selection_set, + void *user_data) { LISTBASE_FOREACH_MUTABLE (TreeElement *, element, &subtree) { /* Get needed data out in case element gets freed. */ @@ -606,7 +614,15 @@ static void outliner_do_libdata_operation_selection_set(bContext *C, const ListBase subtree = element->subtree; const bool is_selected = outliner_do_libdata_operation_selection_set_element( - C, reports, scene, element, tselem, has_parent_selected, operation_fn, selection_set); + C, + reports, + scene, + element, + tselem, + has_parent_selected, + operation_fn, + selection_set, + user_data); /* Don't access element from now on, it may be freed. Note that the open/collapsed state may * also have been changed in the visitor callback. */ @@ -617,7 +633,8 @@ static void outliner_do_libdata_operation_selection_set(bContext *C, subtree, is_selected || has_parent_selected, operation_fn, - selection_set); + selection_set, + user_data); } } @@ -627,6 +644,7 @@ static void outliner_do_libdata_operation_selection_set(bContext *C, SpaceOutliner *space_outliner, outliner_operation_fn operation_fn, eOutlinerLibOpSelectionSet selection_set, + void *user_data, const bool do_active_element_first) { if (do_active_element_first) { @@ -636,18 +654,39 @@ static void outliner_do_libdata_operation_selection_set(bContext *C, TreeStoreElem *tselem = TREESTORE(active_element); const ListBase subtree = active_element->subtree; - const bool is_selected = outliner_do_libdata_operation_selection_set_element( - C, reports, scene, active_element, tselem, false, operation_fn, selection_set); + const bool is_selected = outliner_do_libdata_operation_selection_set_element(C, + reports, + scene, + active_element, + tselem, + false, + operation_fn, + selection_set, + user_data); /* Don't access element from now on, it may be freed. Note that the open/collapsed state may * also have been changed in the visitor callback. */ - outliner_do_libdata_operation_selection_set( - C, reports, scene, space_outliner, subtree, is_selected, operation_fn, selection_set); + outliner_do_libdata_operation_selection_set(C, + reports, + scene, + space_outliner, + subtree, + is_selected, + operation_fn, + selection_set, + user_data); } } - outliner_do_libdata_operation_selection_set( - C, reports, scene, space_outliner, space_outliner->tree, false, operation_fn, selection_set); + outliner_do_libdata_operation_selection_set(C, + reports, + scene, + space_outliner, + space_outliner->tree, + false, + operation_fn, + selection_set, + user_data); } /** \} */ @@ -834,7 +873,7 @@ static uiBlock *merged_element_search_menu(bContext *C, ARegion *region, void *d short menu_width = 10 * UI_UNIT_X; but = uiDefSearchBut( - block, search, 0, ICON_VIEWZOOM, sizeof(search), 10, 10, menu_width, UI_UNIT_Y, ""); + block, search, 0, ICON_VIEWZOOM, sizeof(search), 10, 10, menu_width, UI_UNIT_Y, 0, 0, ""); UI_but_func_search_set(but, nullptr, merged_element_search_update_fn, @@ -857,6 +896,8 @@ static uiBlock *merged_element_search_menu(bContext *C, ARegion *region, void *d nullptr, 0, 0, + 0, + 0, nullptr); /* Center the menu on the cursor */ @@ -882,7 +923,8 @@ static void object_select_fn(bContext *C, Scene * /*scene*/, TreeElement * /*te*/, TreeStoreElem * /*tsep*/, - TreeStoreElem *tselem) + TreeStoreElem *tselem, + void * /*user_data*/) { const Scene *scene = CTX_data_scene(C); ViewLayer *view_layer = CTX_data_view_layer(C); @@ -906,7 +948,8 @@ static void object_select_hierarchy_fn(bContext *C, Scene * /*scene*/, TreeElement *te, TreeStoreElem * /*tsep*/, - TreeStoreElem * /*tselem*/) + TreeStoreElem * /*tselem*/, + void * /*user_data*/) { /* Don't extend because this toggles, which is nice for Ctrl-Click but not for a menu item. * it's especially confusing when multiple items are selected since some toggle on/off. */ @@ -920,7 +963,8 @@ static void object_deselect_fn(bContext *C, Scene * /*scene*/, TreeElement * /*te*/, TreeStoreElem * /*tsep*/, - TreeStoreElem *tselem) + TreeStoreElem *tselem, + void * /*user_data*/) { const Scene *scene = CTX_data_scene(C); ViewLayer *view_layer = CTX_data_view_layer(C); @@ -967,7 +1011,8 @@ static void id_local_fn(bContext *C, Scene * /*scene*/, TreeElement * /*te*/, TreeStoreElem * /*tsep*/, - TreeStoreElem *tselem) + TreeStoreElem *tselem, + void * /*user_data*/) { if (ID_IS_LINKED(tselem->id) && (tselem->id->tag & LIB_TAG_EXTERN)) { Main *bmain = CTX_data_main(C); @@ -1058,15 +1103,17 @@ struct OutlinerLibOverrideData { /* Store 'UUID' of IDs of selected elements in the Outliner tree, before generating the override * hierarchy. */ -static void id_override_library_create_hierarchy_pre_process(bContext *C, - OutlinerLibOverrideData *data, - ReportList *reports, - TreeElement *te, - TreeStoreElem *tsep, - TreeStoreElem *tselem) +static void id_override_library_create_hierarchy_pre_process_fn(bContext *C, + ReportList *reports, + Scene * /*scene*/, + TreeElement *te, + TreeStoreElem *tsep, + TreeStoreElem *tselem, + void *user_data) { BLI_assert(TSE_IS_REAL_ID(tselem)); + OutlinerLibOverrideData *data = static_cast(user_data); const bool do_hierarchy = data->do_hierarchy; ID *id_root_reference = tselem->id; @@ -1389,12 +1436,17 @@ static void id_override_library_create_hierarchy_process(bContext *C, FOREACH_MAIN_ID_END; } -static void id_override_library_reset(bContext *C, - OutlinerLibOverrideData *data, - TreeStoreElem *tselem) +static void id_override_library_reset_fn(bContext *C, + ReportList * /*reports*/, + Scene * /*scene*/, + TreeElement * /*te*/, + TreeStoreElem * /*tsep*/, + TreeStoreElem *tselem, + void *user_data) { BLI_assert(TSE_IS_REAL_ID(tselem)); ID *id_root = tselem->id; + OutlinerLibOverrideData *data = static_cast(user_data); const bool do_hierarchy = data->do_hierarchy; if (!ID_IS_OVERRIDE_LIBRARY_REAL(id_root) || ID_IS_LINKED(id_root)) { @@ -1467,13 +1519,19 @@ static void id_override_library_clear_single_process(bContext *C, do_process_leaves = has_found_leaves; } - DEG_id_tag_update(&scene->id, ID_RECALC_BASE_FLAGS | ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&scene->id, ID_RECALC_BASE_FLAGS | ID_RECALC_COPY_ON_WRITE); } -static void id_override_library_clear_single(OutlinerLibOverrideData *data, - ReportList *reports, - TreeStoreElem *tselem) +static void id_override_library_clear_single_fn(bContext * /*C*/, + ReportList *reports, + Scene * /*scene*/, + TreeElement * /*te*/, + TreeStoreElem * /*tsep*/, + TreeStoreElem *tselem, + void *user_data) { + OutlinerLibOverrideData *data = reinterpret_cast(user_data); + BLI_assert(TSE_IS_REAL_ID(tselem)); ID *id = tselem->id; @@ -1500,10 +1558,17 @@ static void id_override_library_clear_single(OutlinerLibOverrideData *data, data->id_root_set(id); } -static void id_override_library_resync(OutlinerLibOverrideData *data, TreeStoreElem *tselem) +static void id_override_library_resync_fn(bContext * /*C*/, + ReportList * /*reports*/, + Scene * /*scene*/, + TreeElement * /*te*/, + TreeStoreElem * /*tsep*/, + TreeStoreElem *tselem, + void *user_data) { BLI_assert(TSE_IS_REAL_ID(tselem)); ID *id_root = tselem->id; + OutlinerLibOverrideData *data = static_cast(user_data); if (!ID_IS_OVERRIDE_LIBRARY_REAL(id_root) || ID_IS_LINKED(id_root)) { CLOG_WARN(&LOG, "Could not resync library override of data block '%s'", id_root->name); @@ -1542,9 +1607,16 @@ static void id_override_library_resync_hierarchy_process(bContext *C, WM_event_add_notifier(C, NC_WINDOW, nullptr); } -static void id_override_library_delete_hierarchy(OutlinerLibOverrideData *data, - TreeStoreElem *tselem) +static void id_override_library_delete_hierarchy_fn(bContext * /*C*/, + ReportList * /*reports*/, + Scene * /*scene*/, + TreeElement * /*te*/, + TreeStoreElem * /*tsep*/, + TreeStoreElem *tselem, + void *user_data) { + OutlinerLibOverrideData *data = reinterpret_cast(user_data); + BLI_assert(TSE_IS_REAL_ID(tselem)); ID *id_root = tselem->id; @@ -1577,7 +1649,8 @@ static void id_fake_user_set_fn(bContext * /*C*/, Scene * /*scene*/, TreeElement * /*te*/, TreeStoreElem * /*tsep*/, - TreeStoreElem *tselem) + TreeStoreElem *tselem, + void * /*user_data*/) { ID *id = tselem->id; @@ -1589,7 +1662,8 @@ static void id_fake_user_clear_fn(bContext * /*C*/, Scene * /*scene*/, TreeElement * /*te*/, TreeStoreElem * /*tsep*/, - TreeStoreElem *tselem) + TreeStoreElem *tselem, + void * /*user_data*/) { ID *id = tselem->id; @@ -1601,7 +1675,8 @@ static void id_select_linked_fn(bContext *C, Scene * /*scene*/, TreeElement * /*te*/, TreeStoreElem * /*tsep*/, - TreeStoreElem *tselem) + TreeStoreElem *tselem, + void * /*user_data*/) { ID *id = tselem->id; @@ -1613,7 +1688,8 @@ static void singleuser_action_fn(bContext *C, Scene * /*scene*/, TreeElement *te, TreeStoreElem *tsep, - TreeStoreElem *tselem) + TreeStoreElem *tselem, + void * /*user_data*/) { /* This callback runs for all selected elements, some of which may not be actions which results * in a crash. */ @@ -1639,7 +1715,8 @@ static void singleuser_world_fn(bContext *C, Scene * /*scene*/, TreeElement * /*te*/, TreeStoreElem *tsep, - TreeStoreElem *tselem) + TreeStoreElem *tselem, + void * /*user_data*/) { ID *id = tselem->id; @@ -1661,6 +1738,7 @@ void outliner_do_object_operation_ex(bContext *C, SpaceOutliner *space_outliner, ListBase *lb, outliner_operation_fn operation_fn, + void *user_data, bool recurse_selected) { LISTBASE_FOREACH (TreeElement *, te, lb) { @@ -1676,14 +1754,21 @@ void outliner_do_object_operation_ex(bContext *C, /* Important to use 'scene_owner' not scene_act else deleting objects can crash. * only use 'scene_act' when 'scene_owner' is nullptr, which can happen when the * outliner isn't showing scenes: Visible Layer draw mode for eg. */ - operation_fn(C, reports, scene_owner ? scene_owner : scene_act, te, nullptr, tselem); + operation_fn( + C, reports, scene_owner ? scene_owner : scene_act, te, nullptr, tselem, user_data); select_handled = true; } } if (TSELEM_OPEN(tselem, space_outliner)) { if ((select_handled == false) || recurse_selected) { - outliner_do_object_operation_ex( - C, reports, scene_act, space_outliner, &te->subtree, operation_fn, recurse_selected); + outliner_do_object_operation_ex(C, + reports, + scene_act, + space_outliner, + &te->subtree, + operation_fn, + nullptr, + recurse_selected); } } } @@ -1696,7 +1781,8 @@ void outliner_do_object_operation(bContext *C, ListBase *lb, outliner_operation_fn operation_fn) { - outliner_do_object_operation_ex(C, reports, scene_act, space_outliner, lb, operation_fn, true); + outliner_do_object_operation_ex( + C, reports, scene_act, space_outliner, lb, operation_fn, nullptr, true); } /** \} */ @@ -1850,16 +1936,9 @@ static int outliner_liboverride_operation_exec(bContext *C, wmOperator *op) op->reports, scene, space_outliner, - [&](bContext *C, - ReportList *reports, - Scene * /*scene*/, - TreeElement *te, - TreeStoreElem *tsep, - TreeStoreElem *tselem) { - id_override_library_create_hierarchy_pre_process( - C, &override_data, reports, te, tsep, tselem); - }, + id_override_library_create_hierarchy_pre_process_fn, selection_set, + &override_data, true); id_override_library_create_hierarchy_process(C, op->reports, override_data); @@ -1869,19 +1948,14 @@ static int outliner_liboverride_operation_exec(bContext *C, wmOperator *op) } case OUTLINER_LIBOVERRIDE_OP_RESET: { OutlinerLibOverrideData override_data{}; - outliner_do_libdata_operation_selection_set( - C, - op->reports, - scene, - space_outliner, - [&](bContext *C, - ReportList * /*reports*/, - Scene * /*scene*/, - TreeElement * /*te*/, - TreeStoreElem * /*tsep*/, - TreeStoreElem *tselem) { id_override_library_reset(C, &override_data, tselem); }, - selection_set, - false); + outliner_do_libdata_operation_selection_set(C, + op->reports, + scene, + space_outliner, + id_override_library_reset_fn, + selection_set, + &override_data, + false); ED_undo_push(C, "Reset Overridden Data"); break; } @@ -1890,21 +1964,14 @@ static int outliner_liboverride_operation_exec(bContext *C, wmOperator *op) override_data.do_hierarchy = false; override_data.do_fully_editable = false; - outliner_do_libdata_operation_selection_set( - C, - op->reports, - scene, - space_outliner, - [&](bContext * /*C*/, - ReportList *reports, - Scene * /*scene*/, - TreeElement * /*te*/, - TreeStoreElem * /*tsep*/, - TreeStoreElem *tselem) { - id_override_library_clear_single(&override_data, reports, tselem); - }, - selection_set, - false); + outliner_do_libdata_operation_selection_set(C, + op->reports, + scene, + space_outliner, + id_override_library_clear_single_fn, + selection_set, + &override_data, + false); id_override_library_clear_single_process(C, op->reports, override_data); @@ -1915,19 +1982,14 @@ static int outliner_liboverride_operation_exec(bContext *C, wmOperator *op) case OUTLINER_LIBOVERRIDE_OP_RESYNC_HIERARCHY: { OutlinerLibOverrideData override_data{}; override_data.do_hierarchy = true; - outliner_do_libdata_operation_selection_set( - C, - op->reports, - scene, - space_outliner, - [&](bContext * /*C*/, - ReportList * /*reports*/, - Scene * /*scene*/, - TreeElement * /*te*/, - TreeStoreElem * /*tsep*/, - TreeStoreElem *tselem) { id_override_library_resync(&override_data, tselem); }, - OUTLINER_LIB_SELECTIONSET_SELECTED, - false); + outliner_do_libdata_operation_selection_set(C, + op->reports, + scene, + space_outliner, + id_override_library_resync_fn, + OUTLINER_LIB_SELECTIONSET_SELECTED, + &override_data, + false); id_override_library_resync_hierarchy_process(C, op->reports, override_data); @@ -1938,19 +2000,14 @@ static int outliner_liboverride_operation_exec(bContext *C, wmOperator *op) OutlinerLibOverrideData override_data{}; override_data.do_hierarchy = true; override_data.do_resync_hierarchy_enforce = true; - outliner_do_libdata_operation_selection_set( - C, - op->reports, - scene, - space_outliner, - [&](bContext * /*C*/, - ReportList * /*reports*/, - Scene * /*scene*/, - TreeElement * /*te*/, - TreeStoreElem * /*tsep*/, - TreeStoreElem *tselem) { id_override_library_resync(&override_data, tselem); }, - OUTLINER_LIB_SELECTIONSET_SELECTED, - false); + outliner_do_libdata_operation_selection_set(C, + op->reports, + scene, + space_outliner, + id_override_library_resync_fn, + OUTLINER_LIB_SELECTIONSET_SELECTED, + &override_data, + false); id_override_library_resync_hierarchy_process(C, op->reports, override_data); @@ -1960,21 +2017,14 @@ static int outliner_liboverride_operation_exec(bContext *C, wmOperator *op) case OUTLINER_LIBOVERRIDE_OP_DELETE_HIERARCHY: { OutlinerLibOverrideData override_data{}; override_data.do_hierarchy = true; - outliner_do_libdata_operation_selection_set( - C, - op->reports, - scene, - space_outliner, - [&](bContext * /*C*/, - ReportList * /*reports*/, - Scene * /*scene*/, - TreeElement * /*te*/, - TreeStoreElem * /*tsep*/, - TreeStoreElem *tselem) { - id_override_library_delete_hierarchy(&override_data, tselem); - }, - OUTLINER_LIB_SELECTIONSET_SELECTED, - false); + outliner_do_libdata_operation_selection_set(C, + op->reports, + scene, + space_outliner, + id_override_library_delete_hierarchy_fn, + OUTLINER_LIB_SELECTIONSET_SELECTED, + &override_data, + false); id_override_library_delete_hierarchy_process(C, op->reports, override_data); @@ -2508,6 +2558,7 @@ static int outliner_object_operation_exec(bContext *C, wmOperator *op) space_outliner, &space_outliner->tree, object_select_hierarchy_fn, + nullptr, false); /* FIXME: This is most certainly broken, maybe check should rather be * `if (CTX_data_scene(C) != scene)` ? */ @@ -2525,7 +2576,7 @@ static int outliner_object_operation_exec(bContext *C, wmOperator *op) selection_changed = true; break; case OL_OP_REMAP: - outliner_do_libdata_operation(C, op->reports, scene, space_outliner, id_remap_fn); + outliner_do_libdata_operation(C, op->reports, scene, space_outliner, id_remap_fn, nullptr); /* No undo push here, operator does it itself (since it's a modal one, the op_undo_depth * trick does not work here). */ break; @@ -2701,7 +2752,7 @@ static int outliner_delete_exec(bContext *C, wmOperator *op) * cleanup tree here to prevent such cases. */ outliner_cleanup_tree(space_outliner); - DEG_id_tag_update(&scene->id, ID_RECALC_SYNC_TO_EVAL | ID_RECALC_HIERARCHY); + DEG_id_tag_update(&scene->id, ID_RECALC_COPY_ON_WRITE | ID_RECALC_HIERARCHY); DEG_relations_tag_update(bmain); BKE_view_layer_synced_ensure(scene, view_layer); @@ -2865,7 +2916,8 @@ static int outliner_id_operation_exec(bContext *C, wmOperator *op) case OUTLINER_IDOP_UNLINK: { /* unlink datablock from its parent */ if (objectlevel) { - outliner_do_libdata_operation(C, op->reports, scene, space_outliner, unlink_object_fn); + outliner_do_libdata_operation( + C, op->reports, scene, space_outliner, unlink_object_fn, nullptr); WM_event_add_notifier(C, NC_SCENE | ND_LAYER, nullptr); ED_undo_push(C, "Unlink Object"); @@ -2874,32 +2926,36 @@ static int outliner_id_operation_exec(bContext *C, wmOperator *op) switch (idlevel) { case ID_AC: - outliner_do_libdata_operation(C, op->reports, scene, space_outliner, unlink_action_fn); + outliner_do_libdata_operation( + C, op->reports, scene, space_outliner, unlink_action_fn, nullptr); WM_event_add_notifier(C, NC_ANIMATION | ND_NLA_ACTCHANGE, nullptr); ED_undo_push(C, "Unlink action"); break; case ID_MA: - outliner_do_libdata_operation(C, op->reports, scene, space_outliner, unlink_material_fn); + outliner_do_libdata_operation( + C, op->reports, scene, space_outliner, unlink_material_fn, nullptr); WM_event_add_notifier(C, NC_OBJECT | ND_OB_SHADING, nullptr); ED_undo_push(C, "Unlink material"); break; case ID_TE: - outliner_do_libdata_operation(C, op->reports, scene, space_outliner, unlink_texture_fn); + outliner_do_libdata_operation( + C, op->reports, scene, space_outliner, unlink_texture_fn, nullptr); WM_event_add_notifier(C, NC_OBJECT | ND_OB_SHADING, nullptr); ED_undo_push(C, "Unlink texture"); break; case ID_WO: - outliner_do_libdata_operation(C, op->reports, scene, space_outliner, unlink_world_fn); + outliner_do_libdata_operation( + C, op->reports, scene, space_outliner, unlink_world_fn, nullptr); WM_event_add_notifier(C, NC_SCENE | ND_WORLD, nullptr); ED_undo_push(C, "Unlink world"); break; case ID_GR: outliner_do_libdata_operation( - C, op->reports, scene, space_outliner, unlink_collection_fn); + C, op->reports, scene, space_outliner, unlink_collection_fn, nullptr); WM_event_add_notifier(C, NC_SCENE | ND_LAYER, nullptr); ED_undo_push(C, "Unlink Collection"); @@ -2912,7 +2968,7 @@ static int outliner_id_operation_exec(bContext *C, wmOperator *op) } case OUTLINER_IDOP_LOCAL: { /* make local */ - outliner_do_libdata_operation(C, op->reports, scene, space_outliner, id_local_fn); + outliner_do_libdata_operation(C, op->reports, scene, space_outliner, id_local_fn, nullptr); ED_undo_push(C, "Localized Data"); break; } @@ -2921,7 +2977,7 @@ static int outliner_id_operation_exec(bContext *C, wmOperator *op) switch (idlevel) { case ID_AC: outliner_do_libdata_operation( - C, op->reports, scene, space_outliner, singleuser_action_fn); + C, op->reports, scene, space_outliner, singleuser_action_fn, nullptr); WM_event_add_notifier(C, NC_ANIMATION | ND_NLA_ACTCHANGE, nullptr); ED_undo_push(C, "Single-User Action"); @@ -2929,7 +2985,7 @@ static int outliner_id_operation_exec(bContext *C, wmOperator *op) case ID_WO: outliner_do_libdata_operation( - C, op->reports, scene, space_outliner, singleuser_world_fn); + C, op->reports, scene, space_outliner, singleuser_world_fn, nullptr); WM_event_add_notifier(C, NC_SCENE | ND_WORLD, nullptr); ED_undo_push(C, "Single-User World"); @@ -2944,7 +3000,8 @@ static int outliner_id_operation_exec(bContext *C, wmOperator *op) case OUTLINER_IDOP_DELETE: { if (idlevel > 0) { BKE_main_id_tag_all(bmain, LIB_TAG_DOIT, false); - outliner_do_libdata_operation(C, op->reports, scene, space_outliner, id_delete_tag_fn); + outliner_do_libdata_operation( + C, op->reports, scene, space_outliner, id_delete_tag_fn, nullptr); BKE_id_multi_tagged_delete(bmain); ED_undo_push(C, "Delete"); } @@ -2952,7 +3009,7 @@ static int outliner_id_operation_exec(bContext *C, wmOperator *op) } case OUTLINER_IDOP_REMAP: { if (idlevel > 0 || objectlevel) { - outliner_do_libdata_operation(C, op->reports, scene, space_outliner, id_remap_fn); + outliner_do_libdata_operation(C, op->reports, scene, space_outliner, id_remap_fn, nullptr); /* No undo push here, operator does it itself (since it's a modal one, the op_undo_depth * trick does not work here). */ } @@ -2975,7 +3032,8 @@ static int outliner_id_operation_exec(bContext *C, wmOperator *op) } case OUTLINER_IDOP_FAKE_ADD: { /* set fake user */ - outliner_do_libdata_operation(C, op->reports, scene, space_outliner, id_fake_user_set_fn); + outliner_do_libdata_operation( + C, op->reports, scene, space_outliner, id_fake_user_set_fn, nullptr); WM_event_add_notifier(C, NC_ID | NA_EDITED, nullptr); ED_undo_push(C, "Add Fake User"); @@ -2983,7 +3041,8 @@ static int outliner_id_operation_exec(bContext *C, wmOperator *op) } case OUTLINER_IDOP_FAKE_CLEAR: { /* clear fake user */ - outliner_do_libdata_operation(C, op->reports, scene, space_outliner, id_fake_user_clear_fn); + outliner_do_libdata_operation( + C, op->reports, scene, space_outliner, id_fake_user_clear_fn, nullptr); WM_event_add_notifier(C, NC_ID | NA_EDITED, nullptr); ED_undo_push(C, "Clear Fake User"); @@ -2991,14 +3050,16 @@ static int outliner_id_operation_exec(bContext *C, wmOperator *op) } case OUTLINER_IDOP_RENAME: { /* rename */ - outliner_do_libdata_operation(C, op->reports, scene, space_outliner, item_rename_fn); + outliner_do_libdata_operation( + C, op->reports, scene, space_outliner, item_rename_fn, nullptr); WM_event_add_notifier(C, NC_ID | NA_EDITED, nullptr); ED_undo_push(C, "Rename"); break; } case OUTLINER_IDOP_SELECT_LINKED: - outliner_do_libdata_operation(C, op->reports, scene, space_outliner, id_select_linked_fn); + outliner_do_libdata_operation( + C, op->reports, scene, space_outliner, id_select_linked_fn, nullptr); ED_outliner_select_sync_from_all_tag(C); ED_undo_push(C, "Select"); break; @@ -3082,19 +3143,21 @@ static int outliner_lib_operation_exec(bContext *C, wmOperator *op) switch (event) { case OL_LIB_DELETE: { BKE_main_id_tag_all(bmain, LIB_TAG_DOIT, false); - outliner_do_libdata_operation(C, op->reports, scene, space_outliner, id_delete_tag_fn); + outliner_do_libdata_operation( + C, op->reports, scene, space_outliner, id_delete_tag_fn, nullptr); BKE_id_multi_tagged_delete(bmain); ED_undo_push(C, "Delete Library"); break; } case OL_LIB_RELOCATE: { - outliner_do_libdata_operation(C, op->reports, scene, space_outliner, lib_relocate_fn); + outliner_do_libdata_operation( + C, op->reports, scene, space_outliner, lib_relocate_fn, nullptr); /* No undo push here, operator does it itself (since it's a modal one, the op_undo_depth * trick does not work here). */ break; } case OL_LIB_RELOAD: { - outliner_do_libdata_operation(C, op->reports, scene, space_outliner, lib_reload_fn); + outliner_do_libdata_operation(C, op->reports, scene, space_outliner, lib_reload_fn, nullptr); /* No undo push here, operator does it itself (since it's a modal one, the op_undo_depth * trick does not work here). */ break; diff --git a/source/blender/editors/space_outliner/outliner_utils.cc b/source/blender/editors/space_outliner/outliner_utils.cc index 78e58b639df..b20711237ad 100644 --- a/source/blender/editors/space_outliner/outliner_utils.cc +++ b/source/blender/editors/space_outliner/outliner_utils.cc @@ -16,9 +16,11 @@ #include "DNA_screen_types.h" #include "DNA_space_types.h" +#include "BKE_armature.hh" #include "BKE_context.hh" #include "BKE_layer.hh" #include "BKE_object.hh" +#include "BKE_outliner_treehash.hh" #include "ED_outliner.hh" #include "ED_screen.hh" @@ -28,6 +30,7 @@ #include "outliner_intern.hh" #include "tree/tree_display.hh" +#include "tree/tree_iterator.hh" namespace blender::ed::outliner { diff --git a/source/blender/editors/space_outliner/space_outliner.cc b/source/blender/editors/space_outliner/space_outliner.cc index 521b386df24..c68b1617164 100644 --- a/source/blender/editors/space_outliner/space_outliner.cc +++ b/source/blender/editors/space_outliner/space_outliner.cc @@ -31,6 +31,8 @@ #include "WM_message.hh" #include "WM_types.hh" +#include "RNA_access.hh" + #include "DNA_object_types.h" #include "DNA_scene_types.h" @@ -410,9 +412,7 @@ static SpaceLink *outliner_duplicate(SpaceLink *sl) return (SpaceLink *)space_outliner_new; } -static void outliner_id_remap(ScrArea *area, - SpaceLink *slink, - const blender::bke::id::IDRemapper &mappings) +static void outliner_id_remap(ScrArea *area, SpaceLink *slink, const IDRemapper *mappings) { SpaceOutliner *space_outliner = (SpaceOutliner *)slink; @@ -427,7 +427,7 @@ static void outliner_id_remap(ScrArea *area, BLI_mempool_iternew(space_outliner->treestore, &iter); while ((tselem = static_cast(BLI_mempool_iterstep(&iter)))) { - switch (mappings.apply(&tselem->id, ID_REMAP_APPLY_DEFAULT)) { + switch (BKE_id_remapper_apply(mappings, &tselem->id, ID_REMAP_APPLY_DEFAULT)) { case ID_REMAP_RESULT_SOURCE_REMAPPED: changed = true; break; diff --git a/source/blender/editors/space_outliner/tree/common.cc b/source/blender/editors/space_outliner/tree/common.cc index 2c60444f7c1..0edca57e330 100644 --- a/source/blender/editors/space_outliner/tree/common.cc +++ b/source/blender/editors/space_outliner/tree/common.cc @@ -21,6 +21,7 @@ #include "../outliner_intern.hh" #include "common.hh" +#include "tree_display.hh" namespace blender::ed::outliner { diff --git a/source/blender/editors/space_outliner/tree/tree_display_data.cc b/source/blender/editors/space_outliner/tree/tree_display_data.cc index 6049670bb58..3103cf95c14 100644 --- a/source/blender/editors/space_outliner/tree/tree_display_data.cc +++ b/source/blender/editors/space_outliner/tree/tree_display_data.cc @@ -6,6 +6,7 @@ * \ingroup spoutliner */ +#include "BLI_listbase.h" #include "BLI_mempool.h" #include "DNA_space_types.h" @@ -14,6 +15,7 @@ #include "../outliner_intern.hh" #include "tree_display.hh" +#include "tree_element.hh" namespace blender::ed::outliner { diff --git a/source/blender/editors/space_outliner/tree/tree_display_libraries.cc b/source/blender/editors/space_outliner/tree/tree_display_libraries.cc index 78ce6df0cf3..3ae3db5a2c9 100644 --- a/source/blender/editors/space_outliner/tree/tree_display_libraries.cc +++ b/source/blender/editors/space_outliner/tree/tree_display_libraries.cc @@ -9,17 +9,18 @@ #include "BLI_listbase.h" #include "BLI_listbase_wrapper.hh" -#include "BKE_collection.hh" +#include "BKE_collection.h" #include "BKE_main.hh" #include "DNA_collection_types.h" #include "DNA_space_types.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "../outliner_intern.hh" #include "common.hh" #include "tree_display.hh" +#include "tree_element.hh" namespace blender::ed::outliner { diff --git a/source/blender/editors/space_outliner/tree/tree_display_orphaned.cc b/source/blender/editors/space_outliner/tree/tree_display_orphaned.cc index cc769937279..f2878b8fe80 100644 --- a/source/blender/editors/space_outliner/tree/tree_display_orphaned.cc +++ b/source/blender/editors/space_outliner/tree/tree_display_orphaned.cc @@ -18,6 +18,7 @@ #include "../outliner_intern.hh" #include "common.hh" #include "tree_display.hh" +#include "tree_element.hh" namespace blender::ed::outliner { diff --git a/source/blender/editors/space_outliner/tree/tree_display_override_library_hierarchies.cc b/source/blender/editors/space_outliner/tree/tree_display_override_library_hierarchies.cc index 430be729db5..e7293ce421f 100644 --- a/source/blender/editors/space_outliner/tree/tree_display_override_library_hierarchies.cc +++ b/source/blender/editors/space_outliner/tree/tree_display_override_library_hierarchies.cc @@ -6,6 +6,7 @@ * \ingroup spoutliner */ +#include "DNA_key_types.h" #include "DNA_space_types.h" #include "BLI_function_ref.hh" @@ -14,7 +15,7 @@ #include "BLI_set.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_lib_override.hh" #include "BKE_lib_query.hh" @@ -100,10 +101,10 @@ class OverrideIDHierarchyBuilder { const ID &override_root_id_; /* The ancestor IDs leading to the current ID, to avoid IDs recursing into themselves. Changes * with every level of recursion. */ - Set parent_ids; + Set parent_ids{}; /* The IDs that were already added to #parent_te, to avoid duplicates. Entirely new set with * every level of recursion. */ - Set sibling_ids; + Set sibling_ids{}; }; public: diff --git a/source/blender/editors/space_outliner/tree/tree_display_override_library_properties.cc b/source/blender/editors/space_outliner/tree/tree_display_override_library_properties.cc index ef6cbb2cd19..fe29fa55f31 100644 --- a/source/blender/editors/space_outliner/tree/tree_display_override_library_properties.cc +++ b/source/blender/editors/space_outliner/tree/tree_display_override_library_properties.cc @@ -9,13 +9,18 @@ #include "BLI_listbase.h" #include "BLI_listbase_wrapper.hh" +#include "BKE_collection.h" #include "BKE_main.hh" +#include "DNA_collection_types.h" #include "DNA_space_types.h" +#include "BLT_translation.h" + #include "../outliner_intern.hh" #include "common.hh" #include "tree_display.hh" +#include "tree_element.hh" namespace blender::ed::outliner { diff --git a/source/blender/editors/space_outliner/tree/tree_display_scenes.cc b/source/blender/editors/space_outliner/tree/tree_display_scenes.cc index ed18c51c495..c9e1815798f 100644 --- a/source/blender/editors/space_outliner/tree/tree_display_scenes.cc +++ b/source/blender/editors/space_outliner/tree/tree_display_scenes.cc @@ -8,6 +8,7 @@ #include "DNA_space_types.h" +#include "BLI_listbase.h" #include "BLI_listbase_wrapper.hh" #include "BLI_mempool.h" @@ -16,6 +17,7 @@ #include "../outliner_intern.hh" #include "common.hh" #include "tree_display.hh" +#include "tree_element.hh" namespace blender::ed::outliner { diff --git a/source/blender/editors/space_outliner/tree/tree_display_sequencer.cc b/source/blender/editors/space_outliner/tree/tree_display_sequencer.cc index 712ffb187b5..d1ff5e8f525 100644 --- a/source/blender/editors/space_outliner/tree/tree_display_sequencer.cc +++ b/source/blender/editors/space_outliner/tree/tree_display_sequencer.cc @@ -19,6 +19,7 @@ #include "../outliner_intern.hh" #include "tree_display.hh" +#include "tree_element.hh" namespace blender::ed::outliner { 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 58937a0ef2a..652baf55324 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 @@ -19,9 +19,12 @@ #include "BLI_map.hh" #include "BLI_vector.hh" +#include "BLT_translation.h" + #include "../outliner_intern.hh" #include "common.hh" #include "tree_display.hh" +#include "tree_element.hh" namespace blender::ed::outliner { diff --git a/source/blender/editors/space_outliner/tree/tree_element.cc b/source/blender/editors/space_outliner/tree/tree_element.cc index 133b3e02053..d8a583e321c 100644 --- a/source/blender/editors/space_outliner/tree/tree_element.cc +++ b/source/blender/editors/space_outliner/tree/tree_element.cc @@ -10,11 +10,14 @@ #include #include +#include "DNA_anim_types.h" #include "DNA_listBase.h" #include "DNA_space_types.h" #include "UI_resources.hh" +#include "BLT_translation.h" + #include "tree_display.hh" #include "tree_element_anim_data.hh" #include "tree_element_bone.hh" diff --git a/source/blender/editors/space_outliner/tree/tree_element_anim_data.cc b/source/blender/editors/space_outliner/tree/tree_element_anim_data.cc index b53598ea8af..3717ebd4b80 100644 --- a/source/blender/editors/space_outliner/tree/tree_element_anim_data.cc +++ b/source/blender/editors/space_outliner/tree/tree_element_anim_data.cc @@ -12,7 +12,7 @@ #include "DNA_listBase.h" #include "DNA_outliner_types.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "../outliner_intern.hh" diff --git a/source/blender/editors/space_outliner/tree/tree_element_bone_collection.cc b/source/blender/editors/space_outliner/tree/tree_element_bone_collection.cc index 513f400e4af..f82f97d464d 100644 --- a/source/blender/editors/space_outliner/tree/tree_element_bone_collection.cc +++ b/source/blender/editors/space_outliner/tree/tree_element_bone_collection.cc @@ -7,9 +7,12 @@ */ #include "DNA_action_types.h" +#include "DNA_object_types.h" #include "DNA_outliner_types.h" -#include "BLT_translation.hh" +#include "BLI_listbase.h" + +#include "BLT_translation.h" #include "../outliner_intern.hh" diff --git a/source/blender/editors/space_outliner/tree/tree_element_collection.cc b/source/blender/editors/space_outliner/tree/tree_element_collection.cc index 08c897352f1..ab60a4958b5 100644 --- a/source/blender/editors/space_outliner/tree/tree_element_collection.cc +++ b/source/blender/editors/space_outliner/tree/tree_element_collection.cc @@ -10,7 +10,7 @@ #include "DNA_outliner_types.h" #include "DNA_scene_types.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "../outliner_intern.hh" diff --git a/source/blender/editors/space_outliner/tree/tree_element_constraint.cc b/source/blender/editors/space_outliner/tree/tree_element_constraint.cc index dd990a86393..a7108f2e7c8 100644 --- a/source/blender/editors/space_outliner/tree/tree_element_constraint.cc +++ b/source/blender/editors/space_outliner/tree/tree_element_constraint.cc @@ -7,9 +7,10 @@ */ #include "DNA_constraint_types.h" +#include "DNA_object_types.h" #include "DNA_outliner_types.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "../outliner_intern.hh" diff --git a/source/blender/editors/space_outliner/tree/tree_element_defgroup.cc b/source/blender/editors/space_outliner/tree/tree_element_defgroup.cc index 1242dff5ca7..b7c8a3b3fa0 100644 --- a/source/blender/editors/space_outliner/tree/tree_element_defgroup.cc +++ b/source/blender/editors/space_outliner/tree/tree_element_defgroup.cc @@ -13,7 +13,7 @@ #include "BKE_deform.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "../outliner_intern.hh" diff --git a/source/blender/editors/space_outliner/tree/tree_element_driver.cc b/source/blender/editors/space_outliner/tree/tree_element_driver.cc index 6483c07b79d..4d043b6a2f0 100644 --- a/source/blender/editors/space_outliner/tree/tree_element_driver.cc +++ b/source/blender/editors/space_outliner/tree/tree_element_driver.cc @@ -14,7 +14,7 @@ #include "DNA_listBase.h" #include "DNA_space_types.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "../outliner_intern.hh" diff --git a/source/blender/editors/space_outliner/tree/tree_element_gpencil_effect.cc b/source/blender/editors/space_outliner/tree/tree_element_gpencil_effect.cc index 58bc4d03042..ef3ce1d668e 100644 --- a/source/blender/editors/space_outliner/tree/tree_element_gpencil_effect.cc +++ b/source/blender/editors/space_outliner/tree/tree_element_gpencil_effect.cc @@ -12,7 +12,7 @@ #include "BLI_listbase.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "../outliner_intern.hh" diff --git a/source/blender/editors/space_outliner/tree/tree_element_id.cc b/source/blender/editors/space_outliner/tree/tree_element_id.cc index 1c48221166a..56d7c3226bf 100644 --- a/source/blender/editors/space_outliner/tree/tree_element_id.cc +++ b/source/blender/editors/space_outliner/tree/tree_element_id.cc @@ -9,9 +9,15 @@ #include "DNA_ID.h" #include "DNA_space_types.h" +#include "BLI_listbase_wrapper.hh" #include "BLI_utildefines.h" -#include "BKE_anim_data.hh" +#include "BKE_anim_data.h" +#include "BKE_lib_override.hh" + +#include "BLT_translation.h" + +#include "RNA_access.hh" #include "../outliner_intern.hh" #include "common.hh" @@ -88,7 +94,6 @@ std::unique_ptr TreeElementID::create_from_id(TreeElement &legacy case ID_TXT: case ID_SO: case ID_AC: - case ID_AN: case ID_PAL: case ID_PC: case ID_CF: diff --git a/source/blender/editors/space_outliner/tree/tree_element_id_library.cc b/source/blender/editors/space_outliner/tree/tree_element_id_library.cc index 5fab64aa51a..86db6746aa0 100644 --- a/source/blender/editors/space_outliner/tree/tree_element_id_library.cc +++ b/source/blender/editors/space_outliner/tree/tree_element_id_library.cc @@ -6,7 +6,7 @@ * \ingroup spoutliner */ -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_ID.h" #include "DNA_listBase.h" diff --git a/source/blender/editors/space_outliner/tree/tree_element_id_object.cc b/source/blender/editors/space_outliner/tree/tree_element_id_object.cc index cd46b229a55..1e713d0796d 100644 --- a/source/blender/editors/space_outliner/tree/tree_element_id_object.cc +++ b/source/blender/editors/space_outliner/tree/tree_element_id_object.cc @@ -11,11 +11,18 @@ #include "DNA_ID.h" #include "DNA_action_types.h" #include "DNA_armature_types.h" +#include "DNA_constraint_types.h" +#include "DNA_gpencil_modifier_types.h" +#include "DNA_modifier_types.h" #include "DNA_object_types.h" #include "DNA_outliner_types.h" +#include "DNA_particle_types.h" +#include "DNA_shader_fx_types.h" #include "BKE_deform.hh" +#include "BLT_translation.h" + #include "../outliner_intern.hh" #include "tree_element_id_object.hh" diff --git a/source/blender/editors/space_outliner/tree/tree_element_modifier.cc b/source/blender/editors/space_outliner/tree/tree_element_modifier.cc index 54e065361a2..234aa98df29 100644 --- a/source/blender/editors/space_outliner/tree/tree_element_modifier.cc +++ b/source/blender/editors/space_outliner/tree/tree_element_modifier.cc @@ -13,7 +13,7 @@ #include "BLI_listbase.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "../outliner_intern.hh" diff --git a/source/blender/editors/space_outliner/tree/tree_element_nla.cc b/source/blender/editors/space_outliner/tree/tree_element_nla.cc index 20a6ad0ce9c..f224f05963b 100644 --- a/source/blender/editors/space_outliner/tree/tree_element_nla.cc +++ b/source/blender/editors/space_outliner/tree/tree_element_nla.cc @@ -12,7 +12,7 @@ #include "DNA_listBase.h" #include "DNA_space_types.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "../outliner_intern.hh" diff --git a/source/blender/editors/space_outliner/tree/tree_element_overrides.cc b/source/blender/editors/space_outliner/tree/tree_element_overrides.cc index cdcce23355f..886761d2b2c 100644 --- a/source/blender/editors/space_outliner/tree/tree_element_overrides.cc +++ b/source/blender/editors/space_outliner/tree/tree_element_overrides.cc @@ -6,7 +6,7 @@ * \ingroup spoutliner */ -#include "BKE_collection.hh" +#include "BKE_collection.h" #include "BKE_lib_override.hh" #include "BLI_function_ref.hh" @@ -14,7 +14,7 @@ #include "BLI_map.hh" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_space_types.h" diff --git a/source/blender/editors/space_outliner/tree/tree_element_pose.cc b/source/blender/editors/space_outliner/tree/tree_element_pose.cc index 5c9e1d6649a..f3316eb8726 100644 --- a/source/blender/editors/space_outliner/tree/tree_element_pose.cc +++ b/source/blender/editors/space_outliner/tree/tree_element_pose.cc @@ -7,12 +7,13 @@ */ #include "DNA_armature_types.h" +#include "DNA_constraint_types.h" #include "DNA_object_types.h" #include "DNA_outliner_types.h" #include "BLI_listbase.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "../outliner_intern.hh" diff --git a/source/blender/editors/space_outliner/tree/tree_element_rna.cc b/source/blender/editors/space_outliner/tree/tree_element_rna.cc index 622a6f66836..2737d13e94e 100644 --- a/source/blender/editors/space_outliner/tree/tree_element_rna.cc +++ b/source/blender/editors/space_outliner/tree/tree_element_rna.cc @@ -9,9 +9,10 @@ #include #include +#include "BLI_listbase.h" #include "BLI_string.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_outliner_types.h" #include "DNA_space_types.h" diff --git a/source/blender/editors/space_outliner/tree/tree_element_scene_objects.cc b/source/blender/editors/space_outliner/tree/tree_element_scene_objects.cc index 55d6d7c93c7..56e77693ece 100644 --- a/source/blender/editors/space_outliner/tree/tree_element_scene_objects.cc +++ b/source/blender/editors/space_outliner/tree/tree_element_scene_objects.cc @@ -6,11 +6,11 @@ * \ingroup spoutliner */ -#include "BKE_collection.hh" +#include "BKE_collection.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_outliner_types.h" diff --git a/source/blender/editors/space_outliner/tree/tree_element_seq.cc b/source/blender/editors/space_outliner/tree/tree_element_seq.cc index 0358fa54fb1..da855aaafcd 100644 --- a/source/blender/editors/space_outliner/tree/tree_element_seq.cc +++ b/source/blender/editors/space_outliner/tree/tree_element_seq.cc @@ -11,7 +11,7 @@ #include "BLI_listbase.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "../outliner_intern.hh" #include "tree_element_seq.hh" diff --git a/source/blender/editors/space_outliner/tree/tree_element_view_collection.cc b/source/blender/editors/space_outliner/tree/tree_element_view_collection.cc index 6f02753bf13..ba2632dc1f9 100644 --- a/source/blender/editors/space_outliner/tree/tree_element_view_collection.cc +++ b/source/blender/editors/space_outliner/tree/tree_element_view_collection.cc @@ -9,7 +9,7 @@ #include "DNA_outliner_types.h" #include "DNA_scene_types.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "../outliner_intern.hh" diff --git a/source/blender/editors/space_outliner/tree/tree_element_view_layer.cc b/source/blender/editors/space_outliner/tree/tree_element_view_layer.cc index 40ef16275e4..93a5efce2fd 100644 --- a/source/blender/editors/space_outliner/tree/tree_element_view_layer.cc +++ b/source/blender/editors/space_outliner/tree/tree_element_view_layer.cc @@ -12,7 +12,7 @@ #include "BLI_listbase_wrapper.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "../outliner_intern.hh" diff --git a/source/blender/editors/space_script/script_edit.cc b/source/blender/editors/space_script/script_edit.cc index 88e39f92592..18ee9f6a41d 100644 --- a/source/blender/editors/space_script/script_edit.cc +++ b/source/blender/editors/space_script/script_edit.cc @@ -13,9 +13,9 @@ #include "BLI_utildefines.h" #include "BKE_context.hh" -#include "BKE_report.hh" +#include "BKE_report.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "WM_api.hh" #include "WM_types.hh" diff --git a/source/blender/editors/space_sequencer/sequencer_add.cc b/source/blender/editors/space_sequencer/sequencer_add.cc index 10e38e5605c..d0d025fcfb0 100644 --- a/source/blender/editors/space_sequencer/sequencer_add.cc +++ b/source/blender/editors/space_sequencer/sequencer_add.cc @@ -14,18 +14,25 @@ #include "MEM_guardedalloc.h" #include "BLI_blenlib.h" +#include "BLI_ghash.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" +#include "DNA_mask_types.h" #include "DNA_scene_types.h" +#include "DNA_sound_types.h" #include "DNA_space_types.h" #include "BKE_context.hh" -#include "BKE_global.hh" +#include "BKE_global.h" +#include "BKE_lib_id.hh" #include "BKE_main.hh" -#include "BKE_report.hh" -#include "BKE_scene.hh" +#include "BKE_mask.h" +#include "BKE_movieclip.h" +#include "BKE_report.h" +#include "BKE_scene.h" +#include "BKE_sound.h" #include "IMB_imbuf.hh" @@ -38,11 +45,15 @@ #include "SEQ_add.hh" #include "SEQ_effects.hh" +#include "SEQ_iterator.hh" #include "SEQ_proxy.hh" +#include "SEQ_relations.hh" +#include "SEQ_render.hh" #include "SEQ_select.hh" #include "SEQ_sequencer.hh" #include "SEQ_time.hh" #include "SEQ_transform.hh" +#include "SEQ_utils.hh" #include "ED_scene.hh" /* For menu, popup, icons, etc. */ diff --git a/source/blender/editors/space_sequencer/sequencer_buttons.cc b/source/blender/editors/space_sequencer/sequencer_buttons.cc index bb691a4f142..a030d4ef78e 100644 --- a/source/blender/editors/space_sequencer/sequencer_buttons.cc +++ b/source/blender/editors/space_sequencer/sequencer_buttons.cc @@ -15,10 +15,10 @@ #include "BLI_string.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_context.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_screen.hh" #include "ED_screen.hh" diff --git a/source/blender/editors/space_sequencer/sequencer_channels_draw.cc b/source/blender/editors/space_sequencer/sequencer_channels_draw.cc index 9f1def17c3a..d26e55ac398 100644 --- a/source/blender/editors/space_sequencer/sequencer_channels_draw.cc +++ b/source/blender/editors/space_sequencer/sequencer_channels_draw.cc @@ -19,9 +19,15 @@ #include "ED_screen.hh" +#include "GPU_framebuffer.h" +#include "GPU_immediate.h" +#include "GPU_immediate_util.h" #include "GPU_matrix.h" +#include "GPU_state.h" #include "GPU_vertex_buffer.h" +#include "GPU_viewport.h" +#include "RNA_access.hh" #include "RNA_prototypes.h" #include "SEQ_channels.hh" @@ -190,8 +196,7 @@ static rctf label_rect_init(const SeqChannelDrawContext *context, float margin_x = icon_width_get(context) * 0.65; float width = max_ff(0.0f, context->v2d->cur.xmax / context->scale - used_width); - /* Text input has its own margin. Prevent text jumping around and use as much space as possible. - */ + /* Text input has own margin. Prevent text jumping around and use as much space as possible. */ if (channel_is_being_renamed(CTX_wm_space_seq(context->C), channel_index)) { float input_box_margin = icon_width_get(context) * 0.5f; margin_x -= input_box_margin; @@ -257,6 +262,8 @@ static void draw_channel_labels(const SeqChannelDrawContext *context, nullptr, 0, 0, + 0, + 0, nullptr); } } diff --git a/source/blender/editors/space_sequencer/sequencer_channels_edit.cc b/source/blender/editors/space_sequencer/sequencer_channels_edit.cc index 2a101f20789..549711cfbc3 100644 --- a/source/blender/editors/space_sequencer/sequencer_channels_edit.cc +++ b/source/blender/editors/space_sequencer/sequencer_channels_edit.cc @@ -12,14 +12,22 @@ #include "BKE_context.hh" +#include "BLI_blenlib.h" #include "BLI_utildefines.h" #include "ED_screen.hh" #include "UI_view2d.hh" +#include "SEQ_channels.hh" +#include "SEQ_sequencer.hh" +#include "SEQ_time.hh" + #include "WM_api.hh" +#include "RNA_define.hh" +#include "RNA_enum_types.hh" + /* Own include. */ #include "sequencer_intern.hh" diff --git a/source/blender/editors/space_sequencer/sequencer_clipboard.cc b/source/blender/editors/space_sequencer/sequencer_clipboard.cc index c22d9653676..a871948f4a2 100644 --- a/source/blender/editors/space_sequencer/sequencer_clipboard.cc +++ b/source/blender/editors/space_sequencer/sequencer_clipboard.cc @@ -10,9 +10,10 @@ #include -#include "BLO_readfile.hh" +#include "BLO_readfile.h" #include "MEM_guardedalloc.h" +#include "ED_keyframing.hh" #include "ED_outliner.hh" #include "ED_sequencer.hh" @@ -30,13 +31,15 @@ #include "BKE_blender_copybuffer.hh" #include "BKE_blendfile.hh" #include "BKE_context.hh" -#include "BKE_fcurve.hh" +#include "BKE_fcurve.h" #include "BKE_lib_id.hh" #include "BKE_lib_query.hh" #include "BKE_lib_remap.hh" #include "BKE_main.hh" -#include "BKE_report.hh" -#include "BKE_scene.hh" +#include "BKE_report.h" +#include "BKE_scene.h" + +#include "RNA_access.hh" #include "SEQ_animation.hh" #include "SEQ_select.hh" @@ -66,8 +69,7 @@ static int gather_strip_data_ids_to_null(LibraryIDLinkCallbackData *cb_data) { - blender::bke::id::IDRemapper &id_remapper = *static_cast( - cb_data->user_data); + IDRemapper *id_remapper = static_cast(cb_data->user_data); ID *id = *cb_data->id_pointer; /* We don't care about embedded, loop-back, or internal IDs. */ @@ -83,7 +85,7 @@ static int gather_strip_data_ids_to_null(LibraryIDLinkCallbackData *cb_data) /* Nullify everything that is not: * #bSound, #MovieClip, #Image, #Text, #VFont, #bAction, or #Collection IDs. */ if (!ELEM(id_type, ID_SO, ID_MC, ID_IM, ID_TXT, ID_VF, ID_AC)) { - id_remapper.add(id, nullptr); + BKE_id_remapper_add(id_remapper, id, nullptr); return IDWALK_RET_STOP_RECURSION; } } @@ -184,15 +186,16 @@ static bool sequencer_write_copy_paste_file(Main *bmain_src, * to copy whole scenes. We have to come up with a proper idea of how to copy and * paste scene strips. */ - blender::bke::id::IDRemapper id_remapper; + IDRemapper *id_remapper = BKE_id_remapper_create(); BKE_library_foreach_ID_link( - bmain_src, &scene_dst->id, gather_strip_data_ids_to_null, &id_remapper, IDWALK_RECURSE); + bmain_src, &scene_dst->id, gather_strip_data_ids_to_null, id_remapper, IDWALK_RECURSE); BKE_libblock_relink_multiple(bmain_src, {&scene_dst->id}, ID_REMAP_TYPE_REMAP, id_remapper, (ID_REMAP_SKIP_USER_CLEAR | ID_REMAP_SKIP_USER_REFCOUNT)); + BKE_id_remapper_free(id_remapper); /* Ensure that there are no old copy tags around */ BKE_blendfile_write_partial_begin(bmain_src); @@ -369,7 +372,7 @@ int sequencer_clipboard_paste_exec(bContext *C, wmOperator *op) nseqbase.first = iseq_first; LISTBASE_FOREACH (Sequence *, iseq, &nseqbase) { - if (iseq->name == active_seq_name) { + if (STREQ(iseq->name, active_seq_name.c_str())) { SEQ_select_active_set(scene_dst, iseq); } /* Make sure, that pasted strips have unique names. This has to be done after diff --git a/source/blender/editors/space_sequencer/sequencer_drag_drop.cc b/source/blender/editors/space_sequencer/sequencer_drag_drop.cc index 570f6576278..bcfcc470a86 100644 --- a/source/blender/editors/space_sequencer/sequencer_drag_drop.cc +++ b/source/blender/editors/space_sequencer/sequencer_drag_drop.cc @@ -15,6 +15,7 @@ #include "BLI_string_utils.hh" #include "BKE_context.hh" +#include "BKE_global.h" #include "BKE_image.h" #include "BKE_main.hh" diff --git a/source/blender/editors/space_sequencer/sequencer_edit.cc b/source/blender/editors/space_sequencer/sequencer_edit.cc index 1146386eb35..45b6915344a 100644 --- a/source/blender/editors/space_sequencer/sequencer_edit.cc +++ b/source/blender/editors/space_sequencer/sequencer_edit.cc @@ -15,16 +15,17 @@ #include "BLI_timecode.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_anim_types.h" #include "DNA_scene_types.h" #include "DNA_sound_types.h" #include "BKE_context.hh" -#include "BKE_global.hh" +#include "BKE_fcurve.h" +#include "BKE_global.h" #include "BKE_main.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "BKE_sound.h" #include "SEQ_add.hh" diff --git a/source/blender/editors/space_sequencer/sequencer_modifier.cc b/source/blender/editors/space_sequencer/sequencer_modifier.cc index eda9245d39c..ff1799eed96 100644 --- a/source/blender/editors/space_sequencer/sequencer_modifier.cc +++ b/source/blender/editors/space_sequencer/sequencer_modifier.cc @@ -6,6 +6,7 @@ * \ingroup spseq */ +#include "BLI_blenlib.h" #include "BLI_utildefines.h" #include "DNA_scene_types.h" @@ -20,6 +21,7 @@ #include "RNA_define.hh" #include "RNA_enum_types.hh" +#include "SEQ_iterator.hh" #include "SEQ_modifier.hh" #include "SEQ_relations.hh" #include "SEQ_select.hh" diff --git a/source/blender/editors/space_sequencer/sequencer_preview.cc b/source/blender/editors/space_sequencer/sequencer_preview.cc index 9554ca1703f..f51622e7add 100644 --- a/source/blender/editors/space_sequencer/sequencer_preview.cc +++ b/source/blender/editors/space_sequencer/sequencer_preview.cc @@ -14,7 +14,7 @@ #include "BLI_threads.h" #include "BKE_context.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_sound.h" #include "WM_api.hh" diff --git a/source/blender/editors/space_sequencer/sequencer_preview_draw.cc b/source/blender/editors/space_sequencer/sequencer_preview_draw.cc index c9806639eda..bbc3b682aaa 100644 --- a/source/blender/editors/space_sequencer/sequencer_preview_draw.cc +++ b/source/blender/editors/space_sequencer/sequencer_preview_draw.cc @@ -22,8 +22,8 @@ #include "DNA_space_types.h" #include "BKE_context.hh" -#include "BKE_global.hh" -#include "BKE_scene.hh" +#include "BKE_global.h" +#include "BKE_scene.h" #include "IMB_colormanagement.hh" #include "IMB_imbuf.hh" @@ -552,7 +552,8 @@ static void draw_histogram(ARegion *region, /* Label. */ char buf[10]; - const size_t buf_len = SNPRINTF_RLEN(buf, "%.2f", val); + BLI_snprintf(buf, sizeof(buf), "%.2f", val); + size_t buf_len = strlen(buf); float text_width, text_height; BLF_width_and_height(BLF_default(), buf, buf_len, &text_width, &text_height); diff --git a/source/blender/editors/space_sequencer/sequencer_proxy.cc b/source/blender/editors/space_sequencer/sequencer_proxy.cc index d10d1a04602..889cdb765c2 100644 --- a/source/blender/editors/space_sequencer/sequencer_proxy.cc +++ b/source/blender/editors/space_sequencer/sequencer_proxy.cc @@ -8,16 +8,17 @@ #include "MEM_guardedalloc.h" +#include "BLI_blenlib.h" #include "BLI_ghash.h" #include "DNA_scene_types.h" #include "BKE_context.hh" -#include "BKE_global.hh" -#include "BKE_report.hh" - -#include "BLT_translation.hh" +#include "BKE_global.h" +#include "BKE_main.hh" +#include "BKE_report.h" +#include "SEQ_iterator.hh" #include "SEQ_proxy.hh" #include "SEQ_relations.hh" #include "SEQ_sequencer.hh" @@ -156,8 +157,7 @@ void SEQUENCER_OT_rebuild_proxy(wmOperatorType *ot) static int sequencer_enable_proxies_invoke(bContext *C, wmOperator *op, const wmEvent * /*event*/) { - return WM_operator_props_dialog_popup( - C, op, 200, IFACE_("Set Selected Strip Proxies"), IFACE_("Set")); + return WM_operator_props_dialog_popup(C, op, 200); } static int sequencer_enable_proxies_exec(bContext *C, wmOperator *op) diff --git a/source/blender/editors/space_sequencer/sequencer_retiming.cc b/source/blender/editors/space_sequencer/sequencer_retiming.cc index 88b99f3260f..2f39fd3092f 100644 --- a/source/blender/editors/space_sequencer/sequencer_retiming.cc +++ b/source/blender/editors/space_sequencer/sequencer_retiming.cc @@ -8,14 +8,17 @@ #include "MEM_guardedalloc.h" +#include "BLI_blenlib.h" #include "BLI_set.hh" +#include "DNA_anim_types.h" #include "DNA_scene_types.h" #include "DNA_space_types.h" +#include "DNA_workspace_types.h" #include "BKE_context.hh" -#include "BKE_report.hh" -#include "BKE_scene.hh" +#include "BKE_report.h" +#include "BKE_scene.h" #include "ED_select_utils.hh" #include "ED_sequencer.hh" @@ -29,11 +32,15 @@ #include "SEQ_transform.hh" #include "WM_api.hh" +#include "WM_toolsystem.hh" #include "RNA_define.hh" +#include "UI_interface.hh" #include "UI_view2d.hh" +#include "DEG_depsgraph.hh" + /* Own include. */ #include "sequencer_intern.hh" diff --git a/source/blender/editors/space_sequencer/sequencer_retiming_draw.cc b/source/blender/editors/space_sequencer/sequencer_retiming_draw.cc index 9069bb64583..2a3987d304d 100644 --- a/source/blender/editors/space_sequencer/sequencer_retiming_draw.cc +++ b/source/blender/editors/space_sequencer/sequencer_retiming_draw.cc @@ -11,26 +11,42 @@ #include "BLI_blenlib.h" #include "BLI_span.hh" +#include "DNA_anim_types.h" #include "DNA_sequence_types.h" #include "BKE_context.hh" -#include "BKE_fcurve.hh" +#include "BKE_fcurve.h" +#include "BKE_scene.h" #include "BLF_api.hh" #include "GPU_batch.h" +#include "GPU_batch_utils.h" #include "GPU_immediate.h" +#include "GPU_immediate_util.h" +#include "GPU_matrix.h" +#include "GPU_select.hh" #include "GPU_state.h" +#include "RNA_access.hh" +#include "RNA_define.hh" +#include "RNA_enum_types.hh" + #include "WM_api.hh" #include "WM_types.hh" #include "ED_keyframes_draw.hh" #include "ED_keyframes_keylist.hh" #include "ED_screen.hh" +#include "ED_sequencer.hh" +#include "ED_view3d.hh" +#include "UI_interface.hh" +#include "UI_interface_icons.hh" +#include "UI_resources.hh" #include "UI_view2d.hh" +#include "SEQ_iterator.hh" #include "SEQ_retiming.hh" #include "SEQ_sequencer.hh" #include "SEQ_time.hh" diff --git a/source/blender/editors/space_sequencer/sequencer_scopes.cc b/source/blender/editors/space_sequencer/sequencer_scopes.cc index 8b5aea97d8d..188fcb42452 100644 --- a/source/blender/editors/space_sequencer/sequencer_scopes.cc +++ b/source/blender/editors/space_sequencer/sequencer_scopes.cc @@ -10,6 +10,7 @@ #include #include "BLI_math_vector.hh" +#include "BLI_task.h" #include "BLI_task.hh" #include "BLI_utildefines.h" @@ -222,7 +223,7 @@ ImBuf *make_zebra_view_from_ibuf(const ImBuf *ibuf, float perc) #ifdef DEBUG_TIME SCOPED_TIMER(__func__); #endif - ImBuf *res = IMB_allocImBuf(ibuf->x, ibuf->y, 32, IB_rect | IB_uninitialized_pixels); + ImBuf *res = IMB_allocImBuf(ibuf->x, ibuf->y, 32, IB_rect); threading::parallel_for(IndexRange(ibuf->y), 16, [&](IndexRange y_range) { if (ibuf->float_buffer.data) { diff --git a/source/blender/editors/space_sequencer/sequencer_select.cc b/source/blender/editors/space_sequencer/sequencer_select.cc index eb834b01dc6..cfd82a0b4d2 100644 --- a/source/blender/editors/space_sequencer/sequencer_select.cc +++ b/source/blender/editors/space_sequencer/sequencer_select.cc @@ -21,9 +21,10 @@ #include "DNA_scene_types.h" #include "BKE_context.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "WM_api.hh" +#include "WM_toolsystem.hh" #include "WM_types.hh" #include "RNA_define.hh" @@ -36,6 +37,7 @@ #include "SEQ_sequencer.hh" #include "SEQ_time.hh" #include "SEQ_transform.hh" +#include "SEQ_utils.hh" /* For menu, popup, icons, etc. */ diff --git a/source/blender/editors/space_sequencer/sequencer_thumbnails.cc b/source/blender/editors/space_sequencer/sequencer_thumbnails.cc index eb4962b3681..1dd782586ae 100644 --- a/source/blender/editors/space_sequencer/sequencer_thumbnails.cc +++ b/source/blender/editors/space_sequencer/sequencer_thumbnails.cc @@ -10,8 +10,8 @@ #include "BLI_ghash.h" #include "BKE_context.hh" -#include "BKE_global.hh" -#include "BKE_scene.hh" +#include "BKE_global.h" +#include "BKE_scene.h" #include "IMB_imbuf.hh" #include "IMB_imbuf_types.hh" diff --git a/source/blender/editors/space_sequencer/sequencer_timeline_draw.cc b/source/blender/editors/space_sequencer/sequencer_timeline_draw.cc index 01a7bb69d52..1455d0b7e4d 100644 --- a/source/blender/editors/space_sequencer/sequencer_timeline_draw.cc +++ b/source/blender/editors/space_sequencer/sequencer_timeline_draw.cc @@ -21,24 +21,32 @@ #include "DNA_userdef_types.h" #include "BKE_context.hh" -#include "BKE_fcurve.hh" -#include "BKE_global.hh" +#include "BKE_fcurve.h" +#include "BKE_global.h" +#include "BKE_scene.h" #include "BKE_sound.h" +#include "IMB_imbuf.hh" + #include "GPU_immediate.h" +#include "GPU_immediate_util.h" +#include "GPU_vertex_buffer.h" #include "GPU_viewport.h" #include "ED_anim_api.hh" #include "ED_markers.hh" #include "ED_mask.hh" +#include "ED_screen.hh" #include "ED_sequencer.hh" #include "ED_space_api.hh" #include "ED_time_scrub_ui.hh" +#include "ED_util.hh" #include "RNA_prototypes.h" #include "SEQ_channels.hh" #include "SEQ_effects.hh" +#include "SEQ_iterator.hh" #include "SEQ_prefetch.hh" #include "SEQ_relations.hh" #include "SEQ_render.hh" @@ -48,6 +56,7 @@ #include "SEQ_transform.hh" #include "SEQ_utils.hh" +#include "UI_interface.hh" #include "UI_resources.hh" #include "UI_view2d.hh" @@ -1572,13 +1581,32 @@ struct CacheDrawData { float stripe_ofs_y; float stripe_ht; int cache_flag; - SeqQuadsBatch *quads; + GPUVertBuf *raw_vbo; + GPUVertBuf *preprocessed_vbo; + GPUVertBuf *composite_vbo; + GPUVertBuf *final_out_vbo; + size_t raw_vert_count; + size_t preprocessed_vert_count; + size_t composite_vert_count; + size_t final_out_vert_count; }; /* Called as a callback. */ -static bool draw_cache_view_init_fn(void * /*userdata*/, size_t item_count) +static bool draw_cache_view_init_fn(void *userdata, size_t item_count) { - return item_count == 0; + if (item_count == 0) { + return true; + } + + CacheDrawData *drawdata = static_cast(userdata); + /* We can not get item count per cache type, so using total item count is safe. */ + size_t max_vert_count = item_count * 6; + GPU_vertbuf_data_alloc(drawdata->raw_vbo, max_vert_count); + GPU_vertbuf_data_alloc(drawdata->preprocessed_vbo, max_vert_count); + GPU_vertbuf_data_alloc(drawdata->composite_vbo, max_vert_count); + GPU_vertbuf_data_alloc(drawdata->final_out_vbo, max_vert_count); + + return false; } /* Called as a callback */ @@ -1587,106 +1615,133 @@ static bool draw_cache_view_iter_fn(void *userdata, int timeline_frame, int cache_type) { - using blender::uchar4; CacheDrawData *drawdata = static_cast(userdata); - const View2D *v2d = drawdata->v2d; + View2D *v2d = drawdata->v2d; float stripe_bot; - - const uchar4 col_final{255, 102, 51, 100}; - const uchar4 col_raw{255, 25, 5, 100}; - const uchar4 col_preproc{25, 25, 191, 100}; - const uchar4 col_composite{255, 153, 0, 100}; - - uchar4 col{0, 0, 0, 0}; + GPUVertBuf *vbo; + size_t *vert_count; if ((cache_type & SEQ_CACHE_STORE_FINAL_OUT) && (drawdata->cache_flag & SEQ_CACHE_VIEW_FINAL_OUT)) { stripe_bot = UI_view2d_region_to_view_y(v2d, V2D_SCROLL_HANDLE_HEIGHT); - col = col_final; + vbo = drawdata->final_out_vbo; + vert_count = &drawdata->final_out_vert_count; } else if ((cache_type & SEQ_CACHE_STORE_RAW) && (drawdata->cache_flag & SEQ_CACHE_VIEW_RAW)) { stripe_bot = seq->machine + SEQ_STRIP_OFSBOTTOM + drawdata->stripe_ofs_y; - col = col_raw; + vbo = drawdata->raw_vbo; + vert_count = &drawdata->raw_vert_count; } else if ((cache_type & SEQ_CACHE_STORE_PREPROCESSED) && (drawdata->cache_flag & SEQ_CACHE_VIEW_PREPROCESSED)) { stripe_bot = seq->machine + SEQ_STRIP_OFSBOTTOM + drawdata->stripe_ht + drawdata->stripe_ofs_y * 2; - col = col_preproc; + vbo = drawdata->preprocessed_vbo; + vert_count = &drawdata->preprocessed_vert_count; } else if ((cache_type & SEQ_CACHE_STORE_COMPOSITE) && (drawdata->cache_flag & SEQ_CACHE_VIEW_COMPOSITE)) { stripe_bot = seq->machine + SEQ_STRIP_OFSTOP - drawdata->stripe_ofs_y - drawdata->stripe_ht; - col = col_composite; + vbo = drawdata->composite_vbo; + vert_count = &drawdata->composite_vert_count; } else { return false; } float stripe_top = stripe_bot + drawdata->stripe_ht; - drawdata->quads->add_quad(timeline_frame, stripe_bot, timeline_frame + 1, stripe_top, col); + float vert_pos[6][2]; + copy_v2_fl2(vert_pos[0], timeline_frame, stripe_bot); + copy_v2_fl2(vert_pos[1], timeline_frame, stripe_top); + copy_v2_fl2(vert_pos[2], timeline_frame + 1, stripe_top); + copy_v2_v2(vert_pos[3], vert_pos[2]); + copy_v2_v2(vert_pos[4], vert_pos[0]); + copy_v2_fl2(vert_pos[5], timeline_frame + 1, stripe_bot); + + for (int i = 0; i < 6; i++) { + GPU_vertbuf_vert_set(vbo, *vert_count + i, vert_pos[i]); + } + + *vert_count += 6; return false; } +static void draw_cache_view_batch( + GPUVertBuf *vbo, size_t vert_count, float col_r, float col_g, float col_b, float col_a) +{ + GPUBatch *batch = GPU_batch_create_ex(GPU_PRIM_TRIS, vbo, nullptr, GPU_BATCH_OWNS_VBO); + if (vert_count > 0) { + GPU_vertbuf_data_len_set(vbo, vert_count); + GPU_batch_program_set_builtin(batch, GPU_SHADER_3D_UNIFORM_COLOR); + GPU_batch_uniform_4f(batch, "color", col_r, col_g, col_b, col_a); + GPU_batch_draw(batch); + } + GPU_batch_discard(batch); +} + static void draw_cache_stripe(const Scene *scene, const Sequence *seq, - SeqQuadsBatch &quads, + uint pos, const float stripe_bot, const float stripe_ht, - const uchar color[4]) + const float bg_color[4]) { - quads.add_quad(SEQ_time_left_handle_frame_get(scene, seq), - stripe_bot, - SEQ_time_right_handle_frame_get(scene, seq), - stripe_bot + stripe_ht, - color); + immUniformColor4fv(bg_color); + immRectf(pos, + SEQ_time_left_handle_frame_get(scene, seq), + stripe_bot, + SEQ_time_right_handle_frame_get(scene, seq), + stripe_bot + stripe_ht); } static void draw_cache_background(const bContext *C, CacheDrawData *draw_data) { - using blender::uchar4; Scene *scene = CTX_data_scene(C); View2D *v2d = UI_view2d_fromcontext(C); + float bg_colors[4][4]; + copy_v4_fl4(bg_colors[0], 1.0f, 0.4f, 0.2f, 0.1f); + copy_v4_fl4(bg_colors[1], 1.0f, 0.1f, 0.02f, 0.1f); + copy_v4_fl4(bg_colors[2], 0.1f, 0.1f, 0.75f, 0.1f); + copy_v4_fl4(bg_colors[3], 1.0f, 0.6f, 0.0f, 0.1f); - const uchar4 bg_final{255, 102, 51, 25}; - const uchar4 bg_raw{255, 25, 5, 25}; - const uchar4 bg_preproc{25, 25, 191, 25}; - const uchar4 bg_composite{255, 153, 0, 25}; + GPU_blend(GPU_BLEND_ALPHA); + uint pos = GPU_vertformat_attr_add(immVertexFormat(), "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT); + immBindBuiltinProgram(GPU_SHADER_3D_UNIFORM_COLOR); float stripe_bot; if (scene->ed->cache_flag & SEQ_CACHE_VIEW_FINAL_OUT) { stripe_bot = UI_view2d_region_to_view_y(v2d, V2D_SCROLL_HANDLE_HEIGHT); - draw_data->quads->add_quad( - scene->r.sfra, stripe_bot, scene->r.efra, stripe_bot + draw_data->stripe_ht, bg_final); + immUniformColor4fv(bg_colors[0]); + immRectf(pos, scene->r.sfra, stripe_bot, scene->r.efra, stripe_bot + draw_data->stripe_ht); } blender::Vector strips = sequencer_visible_strips_get(C); strips.remove_if([&](Sequence *seq) { return seq->type == SEQ_TYPE_SOUND_RAM; }); - for (const Sequence *seq : strips) { + for (Sequence *seq : strips) { stripe_bot = seq->machine + SEQ_STRIP_OFSBOTTOM + draw_data->stripe_ofs_y; if (scene->ed->cache_flag & SEQ_CACHE_VIEW_RAW) { - draw_cache_stripe(scene, seq, *draw_data->quads, stripe_bot, draw_data->stripe_ht, bg_raw); + draw_cache_stripe(scene, seq, pos, stripe_bot, draw_data->stripe_ht, bg_colors[1]); } if (scene->ed->cache_flag & SEQ_CACHE_VIEW_PREPROCESSED) { stripe_bot += draw_data->stripe_ht + draw_data->stripe_ofs_y; - draw_cache_stripe( - scene, seq, *draw_data->quads, stripe_bot, draw_data->stripe_ht, bg_preproc); + draw_cache_stripe(scene, seq, pos, stripe_bot, draw_data->stripe_ht, bg_colors[2]); } if (scene->ed->cache_flag & SEQ_CACHE_VIEW_COMPOSITE) { stripe_bot = seq->machine + SEQ_STRIP_OFSTOP - draw_data->stripe_ofs_y - draw_data->stripe_ht; - draw_cache_stripe( - scene, seq, *draw_data->quads, stripe_bot, draw_data->stripe_ht, bg_composite); + draw_cache_stripe(scene, seq, pos, stripe_bot, draw_data->stripe_ht, bg_colors[3]); } } + + immUnbindProgram(); } static void draw_cache_view(const bContext *C) @@ -1705,20 +1760,34 @@ static void draw_cache_view(const bContext *C) CLAMP_MAX(stripe_ht, 0.2f); CLAMP_MIN(stripe_ofs_y, stripe_ht / 2); - SeqQuadsBatch quads; + GPUVertFormat format = {0}; + GPU_vertformat_attr_add(&format, "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT); + CacheDrawData userdata; userdata.v2d = v2d; userdata.stripe_ofs_y = stripe_ofs_y; userdata.stripe_ht = stripe_ht; userdata.cache_flag = scene->ed->cache_flag; - userdata.quads = &quads; + userdata.raw_vert_count = 0; + userdata.preprocessed_vert_count = 0; + userdata.composite_vert_count = 0; + userdata.final_out_vert_count = 0; + userdata.raw_vbo = GPU_vertbuf_create_with_format(&format); + userdata.preprocessed_vbo = GPU_vertbuf_create_with_format(&format); + userdata.composite_vbo = GPU_vertbuf_create_with_format(&format); + userdata.final_out_vbo = GPU_vertbuf_create_with_format(&format); - GPU_blend(GPU_BLEND_ALPHA); - - draw_cache_background(C, &userdata); SEQ_cache_iterate(scene, &userdata, draw_cache_view_init_fn, draw_cache_view_iter_fn); - quads.draw(); + draw_cache_background(C, &userdata); + draw_cache_view_batch(userdata.raw_vbo, userdata.raw_vert_count, 1.0f, 0.1f, 0.02f, 0.4f); + draw_cache_view_batch( + userdata.preprocessed_vbo, userdata.preprocessed_vert_count, 0.1f, 0.1f, 0.75f, 0.4f); + draw_cache_view_batch( + userdata.composite_vbo, userdata.composite_vert_count, 1.0f, 0.6f, 0.0f, 0.4f); + draw_cache_view_batch( + userdata.final_out_vbo, userdata.final_out_vert_count, 1.0f, 0.4f, 0.2f, 0.4f); + GPU_blend(GPU_BLEND_NONE); } diff --git a/source/blender/editors/space_sequencer/sequencer_view.cc b/source/blender/editors/space_sequencer/sequencer_view.cc index 40d710a1e70..22d169ce7f0 100644 --- a/source/blender/editors/space_sequencer/sequencer_view.cc +++ b/source/blender/editors/space_sequencer/sequencer_view.cc @@ -6,12 +6,13 @@ * \ingroup spseq */ +#include "BLI_blenlib.h" #include "BLI_utildefines.h" #include "DNA_scene_types.h" #include "BKE_context.hh" -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "WM_api.hh" #include "WM_types.hh" @@ -20,6 +21,8 @@ #include "UI_view2d.hh" +#include "SEQ_iterator.hh" +#include "SEQ_select.hh" #include "SEQ_sequencer.hh" #include "SEQ_time.hh" #include "SEQ_transform.hh" diff --git a/source/blender/editors/space_sequencer/space_sequencer.cc b/source/blender/editors/space_sequencer/space_sequencer.cc index b2f0e419023..232f93da239 100644 --- a/source/blender/editors/space_sequencer/space_sequencer.cc +++ b/source/blender/editors/space_sequencer/space_sequencer.cc @@ -20,7 +20,7 @@ #include "BLI_ghash.h" #include "BLI_math_base.h" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_lib_query.hh" #include "BKE_lib_remap.hh" #include "BKE_screen.hh" @@ -49,6 +49,8 @@ #include "BLO_read_write.hh" +#include "IMB_imbuf.hh" + /* Only for cursor drawing. */ #include "DRW_engine.hh" @@ -910,12 +912,10 @@ static void sequencer_buttons_region_listener(const wmRegionListenerParams *para } } -static void sequencer_id_remap(ScrArea * /*area*/, - SpaceLink *slink, - const blender::bke::id::IDRemapper &mappings) +static void sequencer_id_remap(ScrArea * /*area*/, SpaceLink *slink, const IDRemapper *mappings) { SpaceSeq *sseq = (SpaceSeq *)slink; - mappings.apply(reinterpret_cast(&sseq->gpd), ID_REMAP_APPLY_DEFAULT); + BKE_id_remapper_apply(mappings, (ID **)&sseq->gpd, ID_REMAP_APPLY_DEFAULT); } static void sequencer_foreach_id(SpaceLink *space_link, LibraryForeachIDData *data) diff --git a/source/blender/editors/space_spreadsheet/space_spreadsheet.cc b/source/blender/editors/space_spreadsheet/space_spreadsheet.cc index a4f8c159d11..0735b724223 100644 --- a/source/blender/editors/space_spreadsheet/space_spreadsheet.cc +++ b/source/blender/editors/space_spreadsheet/space_spreadsheet.cc @@ -7,6 +7,8 @@ #include "BLI_listbase.h" #include "BLI_string.h" +#include "BKE_global.h" +#include "BKE_lib_remap.hh" #include "BKE_screen.hh" #include "ED_screen.hh" @@ -28,14 +30,17 @@ #include "DEG_depsgraph_query.hh" +#include "RNA_access.hh" + #include "WM_api.hh" #include "WM_types.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BLF_api.hh" #include "spreadsheet_data_source_geometry.hh" +#include "spreadsheet_dataset_draw.hh" #include "spreadsheet_intern.hh" #include "spreadsheet_layout.hh" #include "spreadsheet_row_filter.hh" @@ -152,9 +157,7 @@ static void spreadsheet_keymap(wmKeyConfig *keyconf) WM_keymap_ensure(keyconf, "Spreadsheet Generic", SPACE_SPREADSHEET, RGN_TYPE_WINDOW); } -static void spreadsheet_id_remap(ScrArea * /*area*/, - SpaceLink *slink, - const blender::bke::id::IDRemapper &mappings) +static void spreadsheet_id_remap(ScrArea * /*area*/, SpaceLink *slink, const IDRemapper *mappings) { SpaceSpreadsheet *sspreadsheet = (SpaceSpreadsheet *)slink; BKE_viewer_path_id_remap(&sspreadsheet->viewer_path, mappings); @@ -341,7 +344,6 @@ static float get_default_column_width(const ColumnValues &values) static const float float_width = 3; switch (values.type()) { case SPREADSHEET_VALUE_TYPE_BOOL: - case SPREADSHEET_VALUE_TYPE_FLOAT4X4: return 2.0f; case SPREADSHEET_VALUE_TYPE_INT8: case SPREADSHEET_VALUE_TYPE_INT32: diff --git a/source/blender/editors/space_spreadsheet/spreadsheet_column.cc b/source/blender/editors/space_spreadsheet/spreadsheet_column.cc index e0df52fdb5b..2bd2c596e99 100644 --- a/source/blender/editors/space_spreadsheet/spreadsheet_column.cc +++ b/source/blender/editors/space_spreadsheet/spreadsheet_column.cc @@ -60,9 +60,6 @@ eSpreadsheetColumnValueType cpp_type_to_column_type(const CPPType &type) if (type.is()) { return SPREADSHEET_VALUE_TYPE_QUATERNION; } - if (type.is()) { - return SPREADSHEET_VALUE_TYPE_FLOAT4X4; - } return SPREADSHEET_VALUE_TYPE_UNKNOWN; } diff --git a/source/blender/editors/space_spreadsheet/spreadsheet_data_source_geometry.cc b/source/blender/editors/space_spreadsheet/spreadsheet_data_source_geometry.cc index 36a734ddafc..b8d29a00d62 100644 --- a/source/blender/editors/space_spreadsheet/spreadsheet_data_source_geometry.cc +++ b/source/blender/editors/space_spreadsheet/spreadsheet_data_source_geometry.cc @@ -12,7 +12,7 @@ #include "BKE_editmesh.hh" #include "BKE_geometry_fields.hh" #include "BKE_geometry_set.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_grease_pencil.hh" #include "BKE_instances.hh" #include "BKE_lib_id.hh" @@ -37,7 +37,7 @@ #include "NOD_geometry_nodes_lazy_function.hh" #include "NOD_geometry_nodes_log.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "RNA_access.hh" #include "RNA_enum_types.hh" @@ -204,13 +204,6 @@ void GeometryDataSource::foreach_default_column_ids( if (!bke::allow_procedural_attribute_access(attribute_id.name())) { return true; } - if (meta_data.domain == bke::AttrDomain::Instance && - attribute_id.name() == "instance_transform") - { - /* Don't display the instance transform attribute, since matrix visualization in the - * spreadsheet isn't helpful. */ - return true; - } SpreadsheetColumnID column_id; column_id.name = (char *)attribute_id.name().data(); const bool is_front = attribute_id.name() == ".viewer"; @@ -219,7 +212,6 @@ void GeometryDataSource::foreach_default_column_ids( }); if (component_->type() == bke::GeometryComponent::Type::Instance) { - fn({(char *)"Position"}, false); fn({(char *)"Rotation"}, false); fn({(char *)"Scale"}, false); } @@ -265,12 +257,6 @@ std::unique_ptr GeometryDataSource::get_column_values( })); } Span transforms = instances->transforms(); - if (STREQ(column_id.name, "Position")) { - return std::make_unique( - column_id.name, VArray::ForFunc(domain_num, [transforms](int64_t index) { - return transforms[index].location(); - })); - } if (STREQ(column_id.name, "Rotation")) { return std::make_unique( column_id.name, VArray::ForFunc(domain_num, [transforms](int64_t index) { diff --git a/source/blender/editors/space_spreadsheet/spreadsheet_dataset_draw.cc b/source/blender/editors/space_spreadsheet/spreadsheet_dataset_draw.cc index bf18eb885b1..72076d0c219 100644 --- a/source/blender/editors/space_spreadsheet/spreadsheet_dataset_draw.cc +++ b/source/blender/editors/space_spreadsheet/spreadsheet_dataset_draw.cc @@ -20,9 +20,10 @@ #include "WM_types.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "spreadsheet_dataset_draw.hh" +#include "spreadsheet_draw.hh" #include "spreadsheet_intern.hh" namespace blender::ed::spreadsheet { diff --git a/source/blender/editors/space_spreadsheet/spreadsheet_layout.cc b/source/blender/editors/space_spreadsheet/spreadsheet_layout.cc index def1cb3a65f..628e3ef9ee7 100644 --- a/source/blender/editors/space_spreadsheet/spreadsheet_layout.cc +++ b/source/blender/editors/space_spreadsheet/spreadsheet_layout.cc @@ -7,8 +7,10 @@ #include +#include "BLI_math_color.hh" #include "BLI_math_quaternion_types.hh" #include "BLI_math_vector_types.hh" +#include "BLI_string.h" #include "BKE_geometry_set.hh" #include "BKE_instances.hh" @@ -23,7 +25,9 @@ #include "UI_interface.hh" #include "UI_resources.hh" -#include "BLT_translation.hh" +#include "BLF_api.hh" + +#include "BLT_translation.h" namespace blender::ed::spreadsheet { @@ -47,7 +51,7 @@ class SpreadsheetLayoutDrawer : public SpreadsheetDrawer { UI_BTYPE_LABEL, 0, ICON_NONE, - name, + name.c_str(), params.xmin, params.ymin, params.width, @@ -55,6 +59,8 @@ class SpreadsheetLayoutDrawer : public SpreadsheetDrawer { nullptr, 0, 0, + 0, + 0, nullptr); /* Center-align column headers. */ UI_but_drawflag_disable(but, UI_BUT_TEXT_LEFT); @@ -69,7 +75,7 @@ class SpreadsheetLayoutDrawer : public SpreadsheetDrawer { UI_BTYPE_LABEL, 0, ICON_NONE, - index_str, + index_str.c_str(), params.xmin, params.ymin, params.width, @@ -77,6 +83,8 @@ class SpreadsheetLayoutDrawer : public SpreadsheetDrawer { nullptr, 0, 0, + 0, + 0, nullptr); /* Right-align indices. */ UI_but_drawflag_enable(but, UI_BUT_TEXT_RIGHT); @@ -100,7 +108,7 @@ class SpreadsheetLayoutDrawer : public SpreadsheetDrawer { UI_BTYPE_LABEL, 0, ICON_NONE, - value_str, + value_str.c_str(), params.xmin, params.ymin, params.width, @@ -108,6 +116,8 @@ class SpreadsheetLayoutDrawer : public SpreadsheetDrawer { nullptr, 0, 0, + 0, + 0, nullptr); /* Right-align Integers. */ UI_but_drawflag_disable(but, UI_BUT_TEXT_LEFT); @@ -120,7 +130,7 @@ class SpreadsheetLayoutDrawer : public SpreadsheetDrawer { UI_BTYPE_LABEL, 0, ICON_NONE, - value_str, + value_str.c_str(), params.xmin, params.ymin, params.width, @@ -128,6 +138,8 @@ class SpreadsheetLayoutDrawer : public SpreadsheetDrawer { nullptr, 0, 0, + 0, + 0, nullptr); /* Right-align Integers. */ UI_but_drawflag_disable(but, UI_BUT_TEXT_LEFT); @@ -146,7 +158,7 @@ class SpreadsheetLayoutDrawer : public SpreadsheetDrawer { UI_BTYPE_LABEL, 0, ICON_NONE, - value_str, + value_str.c_str(), params.xmin, params.ymin, params.width, @@ -154,6 +166,8 @@ class SpreadsheetLayoutDrawer : public SpreadsheetDrawer { nullptr, 0, 0, + 0, + 0, nullptr); /* Right-align Floats. */ UI_but_drawflag_disable(but, UI_BUT_TEXT_LEFT); @@ -174,6 +188,8 @@ class SpreadsheetLayoutDrawer : public SpreadsheetDrawer { nullptr, 0, 0, + 0, + 0, nullptr); UI_but_drawflag_disable(but, UI_BUT_ICON_LEFT); } @@ -197,9 +213,6 @@ class SpreadsheetLayoutDrawer : public SpreadsheetDrawer { const float4 value = float4(data.get(real_index)); this->draw_float_vector(params, Span(&value.x, 4)); } - else if (data.type().is()) { - this->draw_float4x4(params, data.get(real_index)); - } else if (data.type().is()) { const bke::InstanceReference value = data.get(real_index); switch (value.type()) { @@ -217,6 +230,8 @@ class SpreadsheetLayoutDrawer : public SpreadsheetDrawer { nullptr, 0, 0, + 0, + 0, nullptr); break; } @@ -234,6 +249,8 @@ class SpreadsheetLayoutDrawer : public SpreadsheetDrawer { nullptr, 0, 0, + 0, + 0, nullptr); break; } @@ -250,6 +267,8 @@ class SpreadsheetLayoutDrawer : public SpreadsheetDrawer { nullptr, 0, 0, + 0, + 0, nullptr); break; } @@ -263,7 +282,7 @@ class SpreadsheetLayoutDrawer : public SpreadsheetDrawer { UI_BTYPE_LABEL, 0, ICON_NONE, - data.get(real_index), + data.get(real_index).c_str(), params.xmin, params.ymin, params.width, @@ -271,6 +290,8 @@ class SpreadsheetLayoutDrawer : public SpreadsheetDrawer { nullptr, 0, 0, + 0, + 0, nullptr); } } @@ -288,7 +309,7 @@ class SpreadsheetLayoutDrawer : public SpreadsheetDrawer { UI_BTYPE_LABEL, 0, ICON_NONE, - value_str, + value_str.c_str(), params.xmin + i * segment_width, params.ymin, segment_width, @@ -296,6 +317,8 @@ class SpreadsheetLayoutDrawer : public SpreadsheetDrawer { nullptr, 0, 0, + 0, + 0, nullptr); /* Right-align Floats. */ UI_but_drawflag_disable(but, UI_BUT_TEXT_LEFT); @@ -316,7 +339,7 @@ class SpreadsheetLayoutDrawer : public SpreadsheetDrawer { UI_BTYPE_LABEL, 0, ICON_NONE, - value_str, + value_str.c_str(), params.xmin + i * segment_width, params.ymin, segment_width, @@ -324,6 +347,8 @@ class SpreadsheetLayoutDrawer : public SpreadsheetDrawer { nullptr, 0, 0, + 0, + 0, nullptr); /* Right-align Floats. */ UI_but_drawflag_disable(but, UI_BUT_TEXT_LEFT); @@ -345,7 +370,7 @@ class SpreadsheetLayoutDrawer : public SpreadsheetDrawer { UI_BTYPE_LABEL, 0, ICON_NONE, - value_str, + value_str.c_str(), params.xmin + i * segment_width, params.ymin, segment_width, @@ -353,6 +378,8 @@ class SpreadsheetLayoutDrawer : public SpreadsheetDrawer { nullptr, 0, 0, + 0, + 0, nullptr); /* Right-align Floats. */ UI_but_drawflag_disable(but, UI_BUT_TEXT_LEFT); @@ -375,38 +402,6 @@ class SpreadsheetLayoutDrawer : public SpreadsheetDrawer { } } - void draw_float4x4(const CellDrawParams ¶ms, const float4x4 &value) const - { - uiBut *but = uiDefIconTextBut(params.block, - UI_BTYPE_LABEL, - 0, - ICON_NONE, - "...", - params.xmin, - params.ymin, - params.width, - params.height, - nullptr, - 0, - 0, - nullptr); - /* Center alignment. */ - UI_but_drawflag_disable(but, UI_BUT_TEXT_LEFT); - UI_but_func_tooltip_set( - but, - [](bContext * /*C*/, void *argN, const char * /*tip*/) { - const float4x4 &value = *static_cast(argN); - std::stringstream ss; - ss << value[0] << ",\n"; - ss << value[1] << ",\n"; - ss << value[2] << ",\n"; - ss << value[3]; - return ss.str(); - }, - MEM_new(__func__, value), - MEM_freeN); - } - int column_width(int column_index) const final { return spreadsheet_layout_.columns[column_index].width; diff --git a/source/blender/editors/space_spreadsheet/spreadsheet_ops.cc b/source/blender/editors/space_spreadsheet/spreadsheet_ops.cc index 2032a66cb7f..412e90a9e88 100644 --- a/source/blender/editors/space_spreadsheet/spreadsheet_ops.cc +++ b/source/blender/editors/space_spreadsheet/spreadsheet_ops.cc @@ -1,6 +1,7 @@ /* SPDX-FileCopyrightText: 2023 Blender Authors * * SPDX-License-Identifier: GPL-2.0-or-later */ +#include "BKE_screen.hh" #include "DNA_space_types.h" diff --git a/source/blender/editors/space_spreadsheet/spreadsheet_panels.cc b/source/blender/editors/space_spreadsheet/spreadsheet_panels.cc index 21d562acfdb..3efbc461dbe 100644 --- a/source/blender/editors/space_spreadsheet/spreadsheet_panels.cc +++ b/source/blender/editors/space_spreadsheet/spreadsheet_panels.cc @@ -7,7 +7,7 @@ #include "BKE_screen.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "spreadsheet_dataset_draw.hh" #include "spreadsheet_intern.hh" diff --git a/source/blender/editors/space_spreadsheet/spreadsheet_row_filter_ui.cc b/source/blender/editors/space_spreadsheet/spreadsheet_row_filter_ui.cc index be101b66bcb..2df1091dd3e 100644 --- a/source/blender/editors/space_spreadsheet/spreadsheet_row_filter_ui.cc +++ b/source/blender/editors/space_spreadsheet/spreadsheet_row_filter_ui.cc @@ -19,7 +19,7 @@ #include "UI_interface.hh" #include "UI_resources.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "WM_api.hh" #include "WM_types.hh" @@ -109,7 +109,6 @@ static std::string value_string(const SpreadsheetRowFilter &row_filter, case SPREADSHEET_VALUE_TYPE_STRING: return row_filter.value_string; case SPREADSHEET_VALUE_TYPE_QUATERNION: - case SPREADSHEET_VALUE_TYPE_FLOAT4X4: case SPREADSHEET_VALUE_TYPE_UNKNOWN: return ""; } @@ -254,7 +253,6 @@ static void spreadsheet_filter_panel_draw(const bContext *C, Panel *panel) break; case SPREADSHEET_VALUE_TYPE_UNKNOWN: case SPREADSHEET_VALUE_TYPE_QUATERNION: - case SPREADSHEET_VALUE_TYPE_FLOAT4X4: uiItemL(layout, IFACE_("Unsupported column type"), ICON_ERROR); break; } diff --git a/source/blender/editors/space_statusbar/space_statusbar.cc b/source/blender/editors/space_statusbar/space_statusbar.cc index 811ded68566..e4c071c21da 100644 --- a/source/blender/editors/space_statusbar/space_statusbar.cc +++ b/source/blender/editors/space_statusbar/space_statusbar.cc @@ -19,10 +19,13 @@ #include "ED_screen.hh" #include "ED_space_api.hh" +#include "RNA_access.hh" + #include "UI_interface.hh" #include "BLO_read_write.hh" +#include "WM_api.hh" #include "WM_message.hh" #include "WM_types.hh" diff --git a/source/blender/editors/space_text/CMakeLists.txt b/source/blender/editors/space_text/CMakeLists.txt index 9d7235a0965..a9a274e3a00 100644 --- a/source/blender/editors/space_text/CMakeLists.txt +++ b/source/blender/editors/space_text/CMakeLists.txt @@ -21,7 +21,6 @@ set(SRC text_autocomplete.cc text_draw.cc text_format.cc - text_format_glsl.cc text_format_osl.cc text_format_pov.cc text_format_pov_ini.cc diff --git a/source/blender/editors/space_text/space_text.cc b/source/blender/editors/space_text/space_text.cc index d957e34e6e0..bec54c4e3f7 100644 --- a/source/blender/editors/space_text/space_text.cc +++ b/source/blender/editors/space_text/space_text.cc @@ -15,6 +15,8 @@ #include "BLI_blenlib.h" #include "BKE_context.hh" +#include "BKE_global.h" +#include "BKE_lib_id.hh" #include "BKE_lib_query.hh" #include "BKE_lib_remap.hh" #include "BKE_screen.hh" @@ -301,7 +303,7 @@ static void text_cursor(wmWindow *win, ScrArea *area, ARegion *region) /* ************* dropboxes ************* */ -static bool text_drop_path_poll(bContext * /*C*/, wmDrag *drag, const wmEvent * /*event*/) +static bool text_drop_poll(bContext * /*C*/, wmDrag *drag, const wmEvent * /*event*/) { if (drag->type == WM_DRAG_PATH) { const eFileSel_File_Types file_type = eFileSel_File_Types(WM_drag_get_path_file_type(drag)); @@ -312,18 +314,18 @@ static bool text_drop_path_poll(bContext * /*C*/, wmDrag *drag, const wmEvent * return false; } -static void text_drop_path_copy(bContext * /*C*/, wmDrag *drag, wmDropBox *drop) +static void text_drop_copy(bContext * /*C*/, wmDrag *drag, wmDropBox *drop) { /* copy drag path to properties */ RNA_string_set(drop->ptr, "filepath", WM_drag_get_single_path(drag)); } -static bool text_drop_id_poll(bContext * /*C*/, wmDrag *drag, const wmEvent * /*event*/) +static bool text_drop_paste_poll(bContext * /*C*/, wmDrag *drag, const wmEvent * /*event*/) { return (drag->type == WM_DRAG_ID); } -static void text_drop_id_copy(bContext * /*C*/, wmDrag *drag, wmDropBox *drop) +static void text_drop_paste(bContext * /*C*/, wmDrag *drag, wmDropBox *drop) { ID *id = WM_drag_get_local_ID(drag, 0); @@ -332,26 +334,13 @@ static void text_drop_id_copy(bContext * /*C*/, wmDrag *drag, wmDropBox *drop) RNA_string_set(drop->ptr, "text", text.c_str()); } -static bool text_drop_string_poll(bContext * /*C*/, wmDrag *drag, const wmEvent * /*event*/) -{ - return (drag->type == WM_DRAG_STRING); -} - -static void text_drop_string_copy(bContext * /*C*/, wmDrag *drag, wmDropBox *drop) -{ - const std::string &str = WM_drag_get_string(drag); - RNA_string_set(drop->ptr, "text", str.c_str()); -} - /* this region dropbox definition */ static void text_dropboxes() { ListBase *lb = WM_dropboxmap_find("Text", SPACE_TEXT, RGN_TYPE_WINDOW); - WM_dropbox_add(lb, "TEXT_OT_open", text_drop_path_poll, text_drop_path_copy, nullptr, nullptr); - WM_dropbox_add(lb, "TEXT_OT_insert", text_drop_id_poll, text_drop_id_copy, nullptr, nullptr); - WM_dropbox_add( - lb, "TEXT_OT_insert", text_drop_string_poll, text_drop_string_copy, nullptr, nullptr); + WM_dropbox_add(lb, "TEXT_OT_open", text_drop_poll, text_drop_copy, nullptr, nullptr); + WM_dropbox_add(lb, "TEXT_OT_insert", text_drop_paste_poll, text_drop_paste, nullptr, nullptr); } /* ************* end drop *********** */ @@ -389,12 +378,10 @@ static void text_properties_region_draw(const bContext *C, ARegion *region) ED_region_panels(C, region); } -static void text_id_remap(ScrArea * /*area*/, - SpaceLink *slink, - const blender::bke::id::IDRemapper &mappings) +static void text_id_remap(ScrArea * /*area*/, SpaceLink *slink, const IDRemapper *mappings) { SpaceText *stext = (SpaceText *)slink; - mappings.apply(reinterpret_cast(&stext->text), ID_REMAP_APPLY_ENSURE_REAL); + BKE_id_remapper_apply(mappings, (ID **)&stext->text, ID_REMAP_APPLY_ENSURE_REAL); } static void text_foreach_id(SpaceLink *space_link, LibraryForeachIDData *data) @@ -480,11 +467,9 @@ void ED_spacetype_text() BKE_spacetype_register(std::move(st)); - /* Register formatters. - * The first registered formatter is default when there is no extension in the ID-name. */ - ED_text_format_register_py(); /* Keep first (default formatter). */ + /* register formatters */ + ED_text_format_register_py(); ED_text_format_register_osl(); - ED_text_format_register_glsl(); ED_text_format_register_pov(); ED_text_format_register_pov_ini(); } diff --git a/source/blender/editors/space_text/text_autocomplete.cc b/source/blender/editors/space_text/text_autocomplete.cc index b7fe565415f..c38c5d83507 100644 --- a/source/blender/editors/space_text/text_autocomplete.cc +++ b/source/blender/editors/space_text/text_autocomplete.cc @@ -28,6 +28,8 @@ #include "ED_text.hh" #include "ED_undo.hh" +#include "UI_interface.hh" + #include "text_format.hh" #include "text_intern.hh" /* own include */ diff --git a/source/blender/editors/space_text/text_draw.cc b/source/blender/editors/space_text/text_draw.cc index effaa9954be..cad3ca78825 100644 --- a/source/blender/editors/space_text/text_draw.cc +++ b/source/blender/editors/space_text/text_draw.cc @@ -30,6 +30,7 @@ #include "UI_interface.hh" #include "UI_resources.hh" +#include "UI_view2d.hh" #include "text_format.hh" #include "text_intern.hh" diff --git a/source/blender/editors/space_text/text_format.hh b/source/blender/editors/space_text/text_format.hh index a7c7edeb4a2..1294f32c822 100644 --- a/source/blender/editors/space_text/text_format.hh +++ b/source/blender/editors/space_text/text_format.hh @@ -114,7 +114,6 @@ TextFormatType *ED_text_format_get(Text *text); void ED_text_format_register(TextFormatType *tft); /* formatters */ -void ED_text_format_register_glsl(); void ED_text_format_register_py(); void ED_text_format_register_osl(); void ED_text_format_register_pov(); diff --git a/source/blender/editors/space_text/text_format_glsl.cc b/source/blender/editors/space_text/text_format_glsl.cc deleted file mode 100644 index 64b2eced625..00000000000 --- a/source/blender/editors/space_text/text_format_glsl.cc +++ /dev/null @@ -1,593 +0,0 @@ -/* SPDX-FileCopyrightText: 2024 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup sptext - * - * Note that this formatter shares core logic with `text_format_osl.cc`, - * improvements here may apply there too. - */ - -#include - -#include "BLI_blenlib.h" - -#include "DNA_space_types.h" -#include "DNA_text_types.h" - -#include "BKE_text.h" - -#include "text_format.hh" - -/* -------------------------------------------------------------------- */ -/** \name Local Literal Definitions - * \{ */ - -/** - * GLSL builtin functions. - * https://registry.khronos.org/OpenGL/specs/gl/GLSLangSpec.4.60.pdf - */ -static const char *text_format_glsl_literals_builtinfunc_data[] = { - /* Force single column, sorted list. */ - /* clang-format off */ - "EmitStreamVertex", - "EmitVertex", - "EndPrimitive", - "EndStreamPrimitive", - "abs", - "acos", - "acosh", - "all", - "any", - "asin", - "asinh", - "atan", - "atanh", - "atomicAdd", - "atomicAnd", - "atomicCompSwap", - "atomicCounter", - "atomicCounterDecrement", - "atomicCounterIncrement", - "atomicExchange", - "atomicMax", - "atomicMin", - "atomicOr", - "atomicXor", - "barrier", - "bitCount", - "bitfieldExtract", - "bitfieldInsert", - "bitfieldReverse", - "bool", - "break", - "bvec2", - "bvec3", - "bvec4", - "case", - "ceil", - "clamp", - "continue", - "cos", - "cosh", - "cross", - "dFdx", - "dFdxCoarse", - "dFdxFine", - "dFdy", - "dFdyCoarse", - "dFdyFine", - "degrees", - "determinant", - "discard", - "distance", - "dmat2", - "dmat2x2", - "dmat2x3", - "dmat2x4", - "dmat3", - "dmat3x2", - "dmat3x3", - "dmat3x4", - "dmat4", - "dmat4x2", - "dmat4x3", - "dmat4x4", - "do", - "dot", - "double", - "else", - "equal", - "exp", - "exp2", - "faceforward", - "findLSB", - "findMSB", - "float", - "floatBitsToInt", - "floatBitsToUint", - "floor", - "fma", - "for", - "fract", - "frexp", - "fwidth", - "greaterThan", - "greaterThanEqual", - "groupMemoryBarrier", - "if", - "imageAtomicAdd", - "imageAtomicAnd", - "imageAtomicCompSwap", - "imageAtomicExchange", - "imageAtomicMax", - "imageAtomicMin", - "imageAtomicOr", - "imageAtomicXor", - "imageLoad", - "imageSamples", - "imageSize", - "imageStore", - "int", - "intBitsToFloat", - "interpolateAtCentriod", - "interpolateAtOffset", - "interpolateAtSample", - "inverse", - "inversesqrt", - "isinf", - "isnan", - "ivec2", - "ivec3", - "ivec4", - "ldexp", - "length", - "lessThan", - "lessThanEqual", - "log", - "log2", - "mat2", - "mat2x2", - "mat2x3", - "mat2x4", - "mat3", - "mat3x2", - "mat3x3", - "mat3x4", - "mat4", - "mat4x2", - "mat4x3", - "mat4x4", - "matrixCompMult", - "max", - "memoryBarrier", - "memoryBarrierAtomicCounter", - "memoryBarrierBuffer", - "memoryBarrierImage", - "memoryBarrierShared", - "min", - "mix", - "mod", - "modf", - "noise", - "normalize", - "not", - "notEqual", - "outerProduct", - "packDouble2x32", - "packHalf2x16", - "packUnorm", - "pow", - "radians", - "reflect", - "refract", - "return", - "round", - "roundEven", - "sampler1D", - "sampler1DArray", - "sampler1DArrayShadow", - "sampler1DShadow", - "sampler2D", - "sampler2DArray", - "sampler2DArrayShadow", - "sampler2DMS", - "sampler2DMSArray", - "sampler2DRect", - "sampler2DShadow", - "sampler3D", - "samplerBuffer", - "samplerCube", - "samplerCubeArray", - "samplerCubeArrayShadow", - "samplerCubeShadow", - "sign", - "sin", - "sinh", - "smoothstep", - "sqrt", - "step", - "struct", - "switch", - "tan", - "tanh", - "texelFetch", - "texelFetchOffset", - "texture", - "textureGather", - "textureGatherOffset", - "textureGatherOffsets", - "textureGrad", - "textureGradOffset", - "textureLod", - "textureLodOffset", - "textureOffset", - "textureProj", - "textureProjGrad", - "textureProjGradOffset", - "textureProjLod", - "textureProjLodOffset", - "textureProjOffset", - "textureQueryLevels", - "textureQueryLod", - "textureSamples", - "textureSize", - "transpose", - "trunc", - "uaddCarry", - "uint", - "uintBitsToFloat", - "umulExtended", - "unpackDouble2x32", - "unpackHalf2x16", - "unpackUnorm2x16", - "unpackUnorm4x8", - "usubBorrow", - "uvec2", - "uvec3", - "uvec4", - "vec2", - "vec3", - "vec4", - "void", - "while", - /* clang-format on */ -}; -static const Span text_format_glsl_literals_builtinfunc( - text_format_glsl_literals_builtinfunc_data, - ARRAY_SIZE(text_format_glsl_literals_builtinfunc_data)); - -/** - * GLSL reserved keywords. - * https://registry.khronos.org/OpenGL/specs/gl/GLSLangSpec.4.60.pdf - */ -static const char *text_format_glsl_literals_reserved_data[] = { - /* Force single column, sorted list. */ - /* clang-format off */ - "buffer", - "coherent", - "default", - "false", - "flat", - "in", - "inout", - "layout", - "out", - "readonly", - "restrict", - "sampler", - "smooth", - "true", - "uniform", - "varying", - "volatile", - "writeonly", - /* clang-format on */ -}; -static const Span text_format_glsl_literals_reserved( - text_format_glsl_literals_reserved_data, ARRAY_SIZE(text_format_glsl_literals_reserved_data)); - -/** - * GLSL special variables. - * https://registry.khronos.org/OpenGL/specs/gl/GLSLangSpec.4.60.pdf - */ -static const char *text_format_glsl_literals_specialvar_data[] = { - /* Force single column , sorted list */ - /* clang-format off */ - "gl_ClipDistance", - "gl_FragCoord", - "gl_FragDepth", - "gl_FrontFacing", - "gl_GlobalInvocationID", - "gl_InstanceID", - "gl_InvocationID", - "gl_Layer", - "gl_LocalInvocationID", - "gl_LocalInvocationIndex", - "gl_NumSamples", - "gl_NumWorkGroups", - "gl_PatchVerticesIn", - "gl_PointCoord", - "gl_PointSize", - "gl_Position", - "gl_PrimitiveID", - "gl_PrimitiveIDIn", - "gl_SampleID", - "gl_SampleMask", - "gl_SampleMaskIn", - "gl_SamplePosition", - "gl_TessCoord", - "gl_TessLevelInner", - "gl_TessLevelOuter", - "gl_VertexID", - "gl_ViewportIndex", - "gl_WorkGroupID", - "gl_WorkGroupSize", - /* clang-format on */ -}; -static const Span text_format_glsl_literals_specialvar( - text_format_glsl_literals_specialvar_data, - ARRAY_SIZE(text_format_glsl_literals_specialvar_data)); - -/** \} */ - -/*---------------------------------------------------------------------*/ -/* name local functions - */ - -static int txtfmt_glsl_find_builtinfunc(const char *string) -{ - const int i = text_format_string_literal_find(text_format_glsl_literals_builtinfunc, string); - - if (i == 0 || text_check_identifier(string[i])) { - return -1; - } - return i; -} - -static int txtfmt_glsl_find_reserved(const char *string) -{ - const int i = text_format_string_literal_find(text_format_glsl_literals_reserved, string); - - if (i == 0 || text_check_identifier(string[i])) { - return -1; - } - return i; -} -static int txtfmt_glsl_find_specialvar(const char *string) -{ - const int i = text_format_string_literal_find(text_format_glsl_literals_specialvar, string); - - if (i == 0 || text_check_identifier(string[i])) { - return -1; - } - return i; -} -static int txtfmt_glsl_find_preprocessor(const char *string) -{ - if (string[0] == '#') { - int i = 1; - /* White-space is ok '# foo'. */ - while (text_check_whitespace(string[i])) { - i++; - } - while (text_check_identifier(string[i])) { - i++; - } - return i; - } - return -1; -} -static char txtfmt_glsl_format_identifier(const char *str) -{ - char fmt; - - /* clang-format off */ - - if (txtfmt_glsl_find_specialvar(str) != -1) {fmt = FMT_TYPE_SPECIAL; - } else if (txtfmt_glsl_find_builtinfunc(str) != -1) {fmt = FMT_TYPE_KEYWORD; - } else if (txtfmt_glsl_find_reserved(str) != -1) {fmt = FMT_TYPE_RESERVED; - } else if (txtfmt_glsl_find_preprocessor(str) != -1) {fmt = FMT_TYPE_DIRECTIVE; - } else {fmt = FMT_TYPE_DEFAULT; - } - - /* clang-format on */ - - return fmt; -} - -/** \} */ - -/* -------------------------------------------------------------------- */ -/** \name Format Line Implementation (#TextFormatType::format_line) - * \{ */ - -static void txtfmt_glsl_format_line(SpaceText *st, TextLine *line, const bool do_next) -{ - FlattenString fs; - const char *str; - char *fmt; - char cont_orig, cont, find, prev = ' '; - int len, i; - - /* Get continuation from previous line */ - if (line->prev && line->prev->format != nullptr) { - fmt = line->prev->format; - cont = fmt[strlen(fmt) + 1]; /* Just after the null-terminator */ - BLI_assert((FMT_CONT_ALL & cont) == cont); - } - else { - cont = FMT_CONT_NOP; - } - - /* Get original continuation from this line */ - if (line->format != nullptr) { - fmt = line->format; - cont_orig = fmt[strlen(fmt) + 1]; /* Just after the null-terminator */ - BLI_assert((FMT_CONT_ALL & cont_orig) == cont_orig); - } - else { - cont_orig = 0xFF; - } - - len = flatten_string(st, &fs, line->line); - str = fs.buf; - if (!text_check_format_len(line, len)) { - flatten_string_free(&fs); - return; - } - fmt = line->format; - - while (*str) { - /* Handle escape sequences by skipping both \ and next char */ - if (*str == '\\') { - *fmt = prev; - fmt++; - str++; - if (*str == '\0') { - break; - } - *fmt = prev; - fmt++; - str += BLI_str_utf8_size_safe(str); - continue; - } - /* Handle continuations */ - if (cont) { - /* C-Style comments */ - if (cont & FMT_CONT_COMMENT_C) { - if (*str == '*' && *(str + 1) == '/') { - *fmt = FMT_TYPE_COMMENT; - fmt++; - str++; - *fmt = FMT_TYPE_COMMENT; - cont = FMT_CONT_NOP; - } - else { - *fmt = FMT_TYPE_COMMENT; - } - /* Handle other comments */ - } - else { - find = (cont & FMT_CONT_QUOTEDOUBLE) ? '"' : '\''; - if (*str == find) { - cont = 0; - } - *fmt = FMT_TYPE_STRING; - } - - str += BLI_str_utf8_size_safe(str) - 1; - } - /* Not in a string... */ - else { - /* Deal with comments first */ - if (*str == '/' && *(str + 1) == '/') { - /* fill the remaining line */ - text_format_fill(&str, &fmt, FMT_TYPE_COMMENT, len - int(fmt - line->format)); - } - /* C-Style (multi-line) comments */ - else if (*str == '/' && *(str + 1) == '*') { - cont = FMT_CONT_COMMENT_C; - *fmt = FMT_TYPE_COMMENT; - fmt++; - str++; - *fmt = FMT_TYPE_COMMENT; - } - else if (ELEM(*str, '"', '\'')) { - /* Strings */ - find = *str; - cont = (*str == '"') ? FMT_CONT_QUOTEDOUBLE : FMT_CONT_QUOTESINGLE; - *fmt = FMT_TYPE_STRING; - } - /* White-space (all white-space has been converted to spaces). */ - else if (*str == ' ') { - *fmt = FMT_TYPE_WHITESPACE; - } - /* Numbers (digits not part of an identifier and periods followed by digits) */ - else if ((prev != FMT_TYPE_DEFAULT && text_check_digit(*str)) || - (*str == '.' && text_check_digit(*(str + 1)))) - { - *fmt = FMT_TYPE_NUMERAL; - } - /* Punctuation */ - else if ((*str != '#') && text_check_delim(*str)) { - *fmt = FMT_TYPE_SYMBOL; - } - /* Identifiers and other text (no previous white-space or delimiters. so text continues). */ - else if (prev == FMT_TYPE_DEFAULT) { - str += BLI_str_utf8_size_safe(str) - 1; - *fmt = FMT_TYPE_DEFAULT; - } - /* Not white-space, a digit, punctuation, or continuing text. - * Must be new, check for special words. */ - else { - /* Keep aligned arguments for readability. */ - /* clang-format off */ - - /* Special vars(v) or built-in keywords(b) */ - /* keep in sync with `txtfmt_glsl_format_identifier()`. */ - if ((i = txtfmt_glsl_find_specialvar(str)) != -1) { prev = FMT_TYPE_SPECIAL; - } else if ((i = txtfmt_glsl_find_builtinfunc(str)) != -1) { prev = FMT_TYPE_KEYWORD; - } else if ((i = txtfmt_glsl_find_reserved(str)) != -1) { prev = FMT_TYPE_RESERVED; - } else if ((i = txtfmt_glsl_find_preprocessor(str)) != -1) { prev = FMT_TYPE_DIRECTIVE; - } - /* clang-format on */ - - if (i > 0) { - if (prev == FMT_TYPE_DIRECTIVE) { /* can contain utf8 */ - text_format_fill(&str, &fmt, prev, i); - } - else { - text_format_fill_ascii(&str, &fmt, prev, i); - } - } - else { - str += BLI_str_utf8_size_safe(str) - 1; - *fmt = FMT_TYPE_DEFAULT; - } - } - } - prev = *fmt; - fmt++; - str++; - } - - /* Terminate and add continuation char. */ - *fmt = '\0'; - fmt++; - *fmt = cont; - - /* If continuation has changed and we're allowed, process the next line */ - if (cont != cont_orig && do_next && line->next) { - txtfmt_glsl_format_line(st, line->next, do_next); - } - - flatten_string_free(&fs); -} - -/** \} */ - -/* -------------------------------------------------------------------- */ -/** \name Registration - * \{ */ - -void ED_text_format_register_glsl() -{ - static TextFormatType tft = {nullptr}; - static const char *ext[] = {"glsl", nullptr}; - - tft.format_identifier = txtfmt_glsl_format_identifier; - tft.format_line = txtfmt_glsl_format_line; - tft.ext = ext; - tft.comment_line = "//"; - - ED_text_format_register(&tft); - - BLI_assert( - text_format_string_literals_check_sorted_array(text_format_glsl_literals_builtinfunc)); - BLI_assert(text_format_string_literals_check_sorted_array(text_format_glsl_literals_reserved)); - BLI_assert(text_format_string_literals_check_sorted_array(text_format_glsl_literals_specialvar)); -} - -/** \} */ diff --git a/source/blender/editors/space_text/text_format_osl.cc b/source/blender/editors/space_text/text_format_osl.cc index 3cc2647e5bc..18e7777bef7 100644 --- a/source/blender/editors/space_text/text_format_osl.cc +++ b/source/blender/editors/space_text/text_format_osl.cc @@ -4,9 +4,6 @@ /** \file * \ingroup sptext - * - * Note that this formatter shares core logic with `text_format_glsl.cc`, - * improvements here may apply there too. */ #include diff --git a/source/blender/editors/space_text/text_ops.cc b/source/blender/editors/space_text/text_ops.cc index cb879de5b08..a7511fae3ff 100644 --- a/source/blender/editors/space_text/text_ops.cc +++ b/source/blender/editors/space_text/text_ops.cc @@ -22,12 +22,12 @@ #include "BLI_string_utf8.h" #include "BLI_time.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_context.hh" #include "BKE_lib_id.hh" #include "BKE_main.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "BKE_text.h" #include "WM_api.hh" @@ -540,17 +540,6 @@ static int text_reload_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } -static int text_reload_invoke(bContext *C, wmOperator *op, const wmEvent * /*event*/) -{ - return WM_operator_confirm_ex(C, - op, - IFACE_("Reload active text file?"), - nullptr, - IFACE_("Reload"), - ALERT_ICON_NONE, - false); -} - void TEXT_OT_reload(wmOperatorType *ot) { /* identifiers */ @@ -560,7 +549,7 @@ void TEXT_OT_reload(wmOperatorType *ot) /* api callbacks */ ot->exec = text_reload_exec; - ot->invoke = text_reload_invoke; + ot->invoke = WM_operator_confirm; ot->poll = text_edit_poll; } @@ -602,17 +591,6 @@ static int text_unlink_exec(bContext *C, wmOperator * /*op*/) return OPERATOR_FINISHED; } -static int text_unlink_invoke(bContext *C, wmOperator *op, const wmEvent * /*event*/) -{ - return WM_operator_confirm_ex(C, - op, - IFACE_("Delete active text file?"), - nullptr, - IFACE_("Delete"), - ALERT_ICON_NONE, - false); -} - void TEXT_OT_unlink(wmOperatorType *ot) { /* identifiers */ @@ -622,7 +600,7 @@ void TEXT_OT_unlink(wmOperatorType *ot) /* api callbacks */ ot->exec = text_unlink_exec; - ot->invoke = text_unlink_invoke; + ot->invoke = WM_operator_confirm; ot->poll = text_unlink_poll; /* flags */ @@ -2482,6 +2460,8 @@ static int text_jump_invoke(bContext *C, wmOperator *op, const wmEvent * /*event void TEXT_OT_jump(wmOperatorType *ot) { + PropertyRNA *prop; + /* identifiers */ ot->name = "Jump"; ot->idname = "TEXT_OT_jump"; @@ -2493,9 +2473,8 @@ void TEXT_OT_jump(wmOperatorType *ot) ot->poll = text_edit_poll; /* properties */ - ot->prop = RNA_def_int( - ot->srna, "line", 1, 1, INT_MAX, "Line", "Line number to jump to", 1, 10000); - RNA_def_property_translation_context(ot->prop, BLT_I18NCONTEXT_ID_TEXT); + prop = RNA_def_int(ot->srna, "line", 1, 1, INT_MAX, "Line", "Line number to jump to", 1, 10000); + RNA_def_property_translation_context(prop, BLT_I18NCONTEXT_ID_TEXT); } /** \} */ @@ -3541,7 +3520,7 @@ static int text_line_number_invoke(bContext *C, wmOperator * /*op*/, const wmEve return OPERATOR_PASS_THROUGH; } - time = BLI_time_now_seconds(); + time = BLI_check_seconds_timer(); if (last_jump < time - 1) { jump_to = 0; } diff --git a/source/blender/editors/space_text/text_undo.cc b/source/blender/editors/space_text/text_undo.cc index 2a57357da42..e9e2cab5932 100644 --- a/source/blender/editors/space_text/text_undo.cc +++ b/source/blender/editors/space_text/text_undo.cc @@ -14,20 +14,32 @@ #include "DNA_text_types.h" #include "BLI_array_store.h" -#include "BLI_array_utils.h" /* For `BLI_array_is_zeroed`. */ +#include "BLI_array_utils.h" +#include "BLI_time.h" + +#include "BLT_translation.h" #include "BKE_context.hh" #include "BKE_main.hh" +#include "BKE_report.h" #include "BKE_text.h" #include "BKE_undo_system.hh" #include "WM_api.hh" #include "WM_types.hh" +#include "ED_curve.hh" #include "ED_screen.hh" #include "ED_text.hh" #include "ED_undo.hh" +#include "UI_interface.hh" +#include "UI_resources.hh" + +#include "RNA_access.hh" +#include "RNA_define.hh" + +#include "text_format.hh" #include "text_intern.hh" /* -------------------------------------------------------------------- */ diff --git a/source/blender/editors/space_topbar/space_topbar.cc b/source/blender/editors/space_topbar/space_topbar.cc index a9d290e771d..470a6c912f3 100644 --- a/source/blender/editors/space_topbar/space_topbar.cc +++ b/source/blender/editors/space_topbar/space_topbar.cc @@ -14,9 +14,11 @@ #include "BLI_blenlib.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" +#include "BKE_blendfile.hh" #include "BKE_context.hh" +#include "BKE_global.h" #include "BKE_screen.hh" #include "BKE_undo_system.hh" diff --git a/source/blender/editors/space_userpref/space_userpref.cc b/source/blender/editors/space_userpref/space_userpref.cc index f078ae17e4c..3263fe894e1 100644 --- a/source/blender/editors/space_userpref/space_userpref.cc +++ b/source/blender/editors/space_userpref/space_userpref.cc @@ -23,6 +23,7 @@ #include "RNA_access.hh" #include "RNA_enum_types.hh" +#include "WM_api.hh" #include "WM_types.hh" #include "UI_interface.hh" diff --git a/source/blender/editors/space_userpref/userpref_ops.cc b/source/blender/editors/space_userpref/userpref_ops.cc index fd0010dde1c..4af49972b50 100644 --- a/source/blender/editors/space_userpref/userpref_ops.cc +++ b/source/blender/editors/space_userpref/userpref_ops.cc @@ -18,17 +18,15 @@ #endif #include "BLI_fileops.h" #include "BLI_path_util.h" -#include "BLI_string.h" -#include "BLI_string_utf8.h" -#include "BKE_callbacks.hh" +#include "BKE_callbacks.h" #include "BKE_context.hh" #include "BKE_main.hh" #include "BKE_preferences.h" -#include "BKE_report.hh" +#include "BKE_report.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "RNA_access.hh" #include "RNA_define.hh" @@ -250,21 +248,6 @@ enum class bUserExtensionRepoAddType { Local = 1, }; -static const char *preferences_extension_repo_default_name_from_type( - const bUserExtensionRepoAddType repo_type) -{ - switch (repo_type) { - case bUserExtensionRepoAddType::Remote: { - return "Remote Repository"; - } - case bUserExtensionRepoAddType::Local: { - return "User Repository"; - } - } - BLI_assert_unreachable(); - return ""; -} - static int preferences_extension_repo_add_exec(bContext *C, wmOperator *op) { const bUserExtensionRepoAddType repo_type = bUserExtensionRepoAddType( @@ -273,53 +256,17 @@ static int preferences_extension_repo_add_exec(bContext *C, wmOperator *op) Main *bmain = CTX_data_main(C); BKE_callback_exec_null(bmain, BKE_CB_EVT_EXTENSION_REPOS_UPDATE_PRE); - char name[sizeof(bUserExtensionRepo::name)] = ""; - char remote_path[sizeof(bUserExtensionRepo::remote_path)] = ""; - char custom_directory[sizeof(bUserExtensionRepo::custom_dirpath)] = ""; + char name[sizeof(bUserExtensionRepo::name)]; + char custom_directory[FILE_MAX] = ""; const bool use_custom_directory = RNA_boolean_get(op->ptr, "use_custom_directory"); + RNA_string_get(op->ptr, "name", name); + if (use_custom_directory) { RNA_string_get(op->ptr, "custom_directory", custom_directory); BLI_path_slash_rstrip(custom_directory); } - if (repo_type == bUserExtensionRepoAddType::Remote) { - RNA_string_get(op->ptr, "remote_path", remote_path); - } - - /* Setup the name using the following logic: - * - It has been set so leave as-is. - * - Initialize it based on the URL (default for remote repositories). - * - Use a default name as a fallback. - */ - { - PropertyRNA *prop = RNA_struct_find_property(op->ptr, "name"); - if (RNA_property_is_set(op->ptr, prop)) { - RNA_property_string_get(op->ptr, prop, name); - } - - /* Unset or empty, auto-name based on remote URL or local directory. */ - if (name[0] == '\0') { - switch (repo_type) { - case bUserExtensionRepoAddType::Remote: { - BKE_preferences_extension_remote_to_name(remote_path, name); - break; - } - case bUserExtensionRepoAddType::Local: { - if (use_custom_directory) { - const char *custom_directory_basename = BLI_path_basename(custom_directory); - STRNCPY_UTF8(name, custom_directory_basename); - BLI_path_slash_rstrip(name); - } - break; - } - } - } - if (name[0] == '\0') { - STRNCPY_UTF8(name, preferences_extension_repo_default_name_from_type(repo_type)); - } - } - const char *module = custom_directory[0] ? BLI_path_basename(custom_directory) : name; bUserExtensionRepo *new_repo = BKE_preferences_extension_repo_add( &U, name, module, custom_directory); @@ -329,7 +276,7 @@ static int preferences_extension_repo_add_exec(bContext *C, wmOperator *op) } if (repo_type == bUserExtensionRepoAddType::Remote) { - STRNCPY(new_repo->remote_path, remote_path); + RNA_string_get(op->ptr, "remote_path", new_repo->remote_path); new_repo->flag |= USER_EXTENSION_REPO_FLAG_USE_REMOTE_PATH; } @@ -353,10 +300,12 @@ static int preferences_extension_repo_add_invoke(bContext *C, wmOperator *op, co RNA_enum_get(op->ptr, "type")); PropertyRNA *prop_name = RNA_struct_find_property(op->ptr, "name"); if (!RNA_property_is_set(op->ptr, prop_name)) { - const char *name_default = preferences_extension_repo_default_name_from_type(repo_type); - /* Leave unset, let this be set by the URL. */ + const char *name_default = nullptr; if (repo_type == bUserExtensionRepoAddType::Remote) { - name_default = nullptr; + name_default = "Remote Repository"; + } + else { + name_default = "User Repository"; } RNA_property_string_set(op->ptr, prop_name, name_default); } @@ -364,49 +313,48 @@ static int preferences_extension_repo_add_invoke(bContext *C, wmOperator *op, co return WM_operator_props_popup_confirm(C, op, event); } -static void preferences_extension_repo_add_ui(bContext * /*C*/, wmOperator *op) +static bool preferences_extension_repo_add_poll_property(const bContext * /*C*/, + wmOperator *op, + const PropertyRNA *prop) { - - uiLayout *layout = op->layout; - uiLayoutSetPropSep(layout, true); - uiLayoutSetPropDecorate(layout, false); - PointerRNA *ptr = op->ptr; + + const char *prop_id = RNA_property_identifier(prop); const bUserExtensionRepoAddType repo_type = bUserExtensionRepoAddType(RNA_enum_get(ptr, "type")); - switch (repo_type) { - case bUserExtensionRepoAddType::Remote: { - uiItemR(layout, op->ptr, "remote_path", UI_ITEM_R_IMMEDIATE, nullptr, ICON_NONE); - break; - } - case bUserExtensionRepoAddType::Local: { - uiItemR(layout, op->ptr, "name", UI_ITEM_R_IMMEDIATE, nullptr, ICON_NONE); - break; + /* Only show remote_path for remote repositories. */ + if (STREQ(prop_id, "remote_path")) { + if (repo_type != bUserExtensionRepoAddType::Remote) { + return false; } } - uiItemR(layout, op->ptr, "use_custom_directory", UI_ITEM_NONE, nullptr, ICON_NONE); - uiLayout *col = uiLayoutRow(layout, false); - uiLayoutSetActive(col, RNA_boolean_get(ptr, "use_custom_directory")); - uiItemR(col, op->ptr, "custom_directory", UI_ITEM_NONE, nullptr, ICON_NONE); + if (STREQ(prop_id, "custom_directory")) { + if (!RNA_boolean_get(ptr, "use_custom_directory")) { + return false; + } + } + + /* Else, show it! */ + return true; } static void PREFERENCES_OT_extension_repo_add(wmOperatorType *ot) { ot->name = "Add Extension Repository"; ot->idname = "PREFERENCES_OT_extension_repo_add"; - ot->description = "Add a new repository used to store extensions"; + ot->description = "Add a directory to be used as a local extension repository"; ot->invoke = preferences_extension_repo_add_invoke; ot->exec = preferences_extension_repo_add_exec; - ot->ui = preferences_extension_repo_add_ui; + ot->poll_property = preferences_extension_repo_add_poll_property; ot->flag = OPTYPE_INTERNAL | OPTYPE_REGISTER; static const EnumPropertyItem repo_type_items[] = { {int(bUserExtensionRepoAddType::Remote), "REMOTE", - ICON_INTERNET, + ICON_WORLD, "Add Remote Repository", "Add a repository referencing an remote repository " "with support for listing and updating extensions"}, @@ -489,14 +437,12 @@ static void PREFERENCES_OT_extension_repo_add(wmOperatorType *ot) /** \name Generic Extension Repository Utilities * \{ */ -static bool preferences_extension_repo_remote_active_enabled_poll(bContext *C) +static bool preferences_extension_repo_active_enabled_poll(bContext *C) { const bUserExtensionRepo *repo = BKE_preferences_extension_repo_find_index( &U, U.active_extension_repo); - if (repo == nullptr || (repo->flag & USER_EXTENSION_REPO_FLAG_DISABLED) || - !(repo->flag & USER_EXTENSION_REPO_FLAG_USE_REMOTE_PATH)) - { - CTX_wm_operator_poll_msg_set(C, "An enabled remote repository must be selected"); + if (repo == nullptr || (repo->flag & USER_EXTENSION_REPO_FLAG_DISABLED)) { + CTX_wm_operator_poll_msg_set(C, "An enabled repository must be selected"); return false; } return true; @@ -651,7 +597,7 @@ static void PREFERENCES_OT_extension_repo_sync(wmOperatorType *ot) ot->description = "Synchronize the active extension repository with its remote URL"; ot->exec = preferences_extension_repo_sync_exec; - ot->poll = preferences_extension_repo_remote_active_enabled_poll; + ot->poll = preferences_extension_repo_active_enabled_poll; ot->flag = OPTYPE_INTERNAL; } @@ -677,40 +623,13 @@ static void PREFERENCES_OT_extension_repo_upgrade(wmOperatorType *ot) ot->description = "Update any outdated extensions for the active extension repository"; ot->exec = preferences_extension_repo_upgrade_exec; - ot->poll = preferences_extension_repo_remote_active_enabled_poll; + ot->poll = preferences_extension_repo_active_enabled_poll; ot->flag = OPTYPE_INTERNAL; } /** \} */ -/* -------------------------------------------------------------------- */ -/** \name Drop Extension Operator - * \{ */ - -static int preferences_extension_url_drop_exec(bContext *C, wmOperator *op) -{ - char *url = RNA_string_get_alloc(op->ptr, "url", nullptr, 0, nullptr); - BKE_callback_exec_string(CTX_data_main(C), BKE_CB_EVT_EXTENSION_DROP_URL, url); - MEM_freeN(url); - return OPERATOR_FINISHED; -} - -static void PREFERENCES_OT_extension_url_drop(wmOperatorType *ot) -{ - /* identifiers */ - ot->name = "Drop Extension URL"; - ot->description = "Handle dropping an extension URL"; - ot->idname = "PREFERENCES_OT_extension_url_drop"; - - /* api callbacks */ - ot->exec = preferences_extension_url_drop_exec; - - RNA_def_string(ot->srna, "url", nullptr, 0, "URL", "Location of the extension to install"); -} - -/** \} */ - /* -------------------------------------------------------------------- */ /** \name Associate File Type Operator (Windows only) * \{ */ @@ -827,106 +746,6 @@ static void PREFERENCES_OT_unassociate_blend(wmOperatorType *ot) /** \} */ -/* -------------------------------------------------------------------- */ -/** \name Drag & Drop URL - * \{ */ - -static bool drop_extension_url_poll(bContext * /*C*/, wmDrag *drag, const wmEvent * /*event*/) -{ - if (!U.experimental.use_extension_repos) { - return false; - } - if (drag->type != WM_DRAG_STRING) { - return false; - } - - /* NOTE(@ideasman42): it should be possible to drag a URL into the text editor or Python console. - * In the future we may support dragging images into Blender by URL, so treating any single-line - * URL as an extension could back-fire. Avoid problems in the future by limiting the text which - * is accepted as an extension to ZIP's or URL's that reference known repositories. */ - - const std::string &str = WM_drag_get_string(drag); - - /* Only URL formatted text. */ - const char *cstr = str.c_str(); - if (BKE_preferences_extension_repo_remote_scheme_end(cstr) == 0) { - return false; - } - - /* Only single line strings. */ - if (str.find('\n') != std::string::npos) { - return false; - } - - const char *cstr_ext = BLI_path_extension(cstr); - /* Check the URL has a `.zip` suffix OR has a known repository as a prefix. - * This is needed to support redirects which don't contain an extension. */ - if (!(cstr_ext && STRCASEEQ(cstr_ext, ".zip")) && - !(BKE_preferences_extension_repo_find_by_remote_path_prefix(&U, cstr, true))) - { - return false; - } - - return true; -} - -static void drop_extension_url_copy(bContext * /*C*/, wmDrag *drag, wmDropBox *drop) -{ - /* Copy drag URL to properties. */ - const std::string &str = WM_drag_get_string(drag); - RNA_string_set(drop->ptr, "url", str.c_str()); -} - -/** \} */ - -/* -------------------------------------------------------------------- */ -/** \name Drag & Drop Paths - * \{ */ - -static bool drop_extension_path_poll(bContext * /*C*/, wmDrag *drag, const wmEvent * /*event*/) -{ - if (!U.experimental.use_extension_repos) { - return false; - } - if (drag->type != WM_DRAG_PATH) { - return false; - } - - const char *cstr = WM_drag_get_single_path(drag); - const char *cstr_ext = BLI_path_extension(cstr); - if (!(cstr_ext && STRCASEEQ(cstr_ext, ".zip"))) { - return false; - } - - return true; -} - -static void drop_extension_path_copy(bContext * /*C*/, wmDrag *drag, wmDropBox *drop) -{ - /* Copy drag URL to properties. */ - const char *cstr = WM_drag_get_single_path(drag); - RNA_string_set(drop->ptr, "url", cstr); -} - -/** \} */ - -static void ED_dropbox_drop_extension() -{ - ListBase *lb = WM_dropboxmap_find("Window", SPACE_EMPTY, RGN_TYPE_WINDOW); - WM_dropbox_add(lb, - "PREFERENCES_OT_extension_url_drop", - drop_extension_url_poll, - drop_extension_url_copy, - nullptr, - nullptr); - WM_dropbox_add(lb, - "PREFERENCES_OT_extension_url_drop", - drop_extension_path_poll, - drop_extension_path_copy, - nullptr, - nullptr); -} - void ED_operatortypes_userpref() { WM_operatortype_append(PREFERENCES_OT_reset_default_theme); @@ -941,10 +760,7 @@ void ED_operatortypes_userpref() WM_operatortype_append(PREFERENCES_OT_extension_repo_remove); WM_operatortype_append(PREFERENCES_OT_extension_repo_sync); WM_operatortype_append(PREFERENCES_OT_extension_repo_upgrade); - WM_operatortype_append(PREFERENCES_OT_extension_url_drop); WM_operatortype_append(PREFERENCES_OT_associate_blend); WM_operatortype_append(PREFERENCES_OT_unassociate_blend); - - ED_dropbox_drop_extension(); } diff --git a/source/blender/editors/space_view3d/drawobject.cc b/source/blender/editors/space_view3d/drawobject.cc index a46a6ce1a20..0a3bcb42e2a 100644 --- a/source/blender/editors/space_view3d/drawobject.cc +++ b/source/blender/editors/space_view3d/drawobject.cc @@ -6,8 +6,33 @@ * \ingroup spview3d */ +#include "DNA_object_types.h" #include "DNA_scene_types.h" +#include "BLI_math_vector.h" + +#include "BKE_DerivedMesh.hh" +#include "BKE_customdata.hh" +#include "BKE_editmesh.hh" +#include "BKE_global.h" +#include "BKE_mesh.hh" +#include "BKE_mesh_runtime.hh" +#include "BKE_object.hh" + +#include "DEG_depsgraph.hh" +#include "DEG_depsgraph_query.hh" + +#include "GPU_batch.h" +#include "GPU_immediate.h" +#include "GPU_shader.h" +#include "GPU_state.h" + +#include "ED_mesh.hh" + +#include "UI_resources.hh" + +#include "DRW_engine.hh" + #include "view3d_intern.h" /* bad level include */ #ifdef VIEW3D_CAMERA_BORDER_HACK diff --git a/source/blender/editors/space_view3d/space_view3d.cc b/source/blender/editors/space_view3d/space_view3d.cc index 5a02b932de0..7eda7d250bf 100644 --- a/source/blender/editors/space_view3d/space_view3d.cc +++ b/source/blender/editors/space_view3d/space_view3d.cc @@ -16,6 +16,7 @@ #include "DNA_collection_types.h" #include "DNA_defaults.h" +#include "DNA_gpencil_legacy_types.h" #include "DNA_lightprobe_types.h" #include "DNA_material_types.h" #include "DNA_object_types.h" @@ -30,22 +31,28 @@ #include "BLI_math_vector.hh" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_asset.hh" #include "BKE_context.hh" -#include "BKE_global.hh" +#include "BKE_curve.hh" +#include "BKE_global.h" #include "BKE_gpencil_legacy.h" +#include "BKE_icons.h" #include "BKE_idprop.h" +#include "BKE_lattice.hh" #include "BKE_layer.hh" #include "BKE_lib_id.hh" #include "BKE_lib_query.hh" #include "BKE_lib_remap.hh" #include "BKE_main.hh" +#include "BKE_mball.hh" +#include "BKE_mesh.hh" #include "BKE_object.hh" -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "BKE_screen.hh" #include "BKE_viewer_path.hh" +#include "BKE_workspace.h" #include "ED_asset_shelf.hh" #include "ED_geometry.hh" @@ -56,6 +63,7 @@ #include "ED_space_api.hh" #include "ED_transform.hh" #include "ED_undo.hh" +#include "ED_viewer_path.hh" #include "GPU_matrix.h" @@ -66,6 +74,9 @@ #include "WM_toolsystem.hh" #include "WM_types.hh" +#include "RE_engine.h" +#include "RE_pipeline.h" + #include "RNA_access.hh" #include "UI_interface.hh" @@ -126,11 +137,11 @@ bool ED_view3d_area_user_region(const ScrArea *area, const View3D *v3d, ARegion void ED_view3d_init_mats_rv3d(const Object *ob, RegionView3D *rv3d) { /* local viewmat and persmat, to calculate projections */ - mul_m4_m4m4(rv3d->viewmatob, rv3d->viewmat, ob->object_to_world().ptr()); - mul_m4_m4m4(rv3d->persmatob, rv3d->persmat, ob->object_to_world().ptr()); + mul_m4_m4m4(rv3d->viewmatob, rv3d->viewmat, ob->object_to_world); + mul_m4_m4m4(rv3d->persmatob, rv3d->persmat, ob->object_to_world); /* initializes object space clipping, speeds up clip tests */ - ED_view3d_clipping_local(rv3d, ob->object_to_world().ptr()); + ED_view3d_clipping_local(rv3d, ob->object_to_world); } void ED_view3d_init_mats_rv3d_gl(const Object *ob, RegionView3D *rv3d) @@ -140,7 +151,7 @@ void ED_view3d_init_mats_rv3d_gl(const Object *ob, RegionView3D *rv3d) /* We have to multiply instead of loading `viewmatob` to make * it work with duplis using display-lists, otherwise it will * override the dupli-matrix. */ - GPU_matrix_mul(ob->object_to_world().ptr()); + GPU_matrix_mul(ob->object_to_world); } #ifndef NDEBUG @@ -737,7 +748,7 @@ static void view3d_ob_drop_matrix_from_snap(V3DSnapCursorState *snap_state, copy_v3_v3(obmat_final[3], snap_data->loc); float scale[3]; - mat4_to_size(scale, ob->object_to_world().ptr()); + mat4_to_size(scale, ob->object_to_world); rescale_m4(obmat_final, scale); if (const std::optional> bb = BKE_object_boundbox_get(ob)) { @@ -969,13 +980,13 @@ static void view3d_dropboxes() WM_drag_free_imported_drag_ID, view3d_geometry_nodes_drop_tooltip); WM_dropbox_add(lb, - "VIEW3D_OT_camera_background_image_add", + "VIEW3D_OT_background_image_add", view3d_ima_bg_drop_poll, view3d_id_path_drop_copy, WM_drag_free_imported_drag_ID, nullptr); WM_dropbox_add(lb, - "OBJECT_OT_empty_image_add", + "OBJECT_OT_drop_named_image", view3d_ima_empty_drop_poll, view3d_id_path_drop_copy, WM_drag_free_imported_drag_ID, @@ -1714,9 +1725,6 @@ void ED_view3d_buttons_region_layout_ex(const bContext *C, case CTX_MODE_EDIT_GREASE_PENCIL: ARRAY_SET_ITEMS(contexts, ".grease_pencil_edit"); break; - case CTX_MODE_PAINT_GREASE_PENCIL: - ARRAY_SET_ITEMS(contexts, ".grease_pencil_paint"); - break; case CTX_MODE_EDIT_POINT_CLOUD: ARRAY_SET_ITEMS(contexts, ".point_cloud_edit"); break; @@ -1999,10 +2007,9 @@ static void space_view3d_refresh(const bContext *C, ScrArea *area) MEM_SAFE_FREE(v3d->runtime.local_stats); } -static void view3d_id_remap_v3d_ob_centers(View3D *v3d, - const blender::bke::id::IDRemapper &mappings) +static void view3d_id_remap_v3d_ob_centers(View3D *v3d, const IDRemapper *mappings) { - if (mappings.apply(reinterpret_cast(&v3d->ob_center), ID_REMAP_APPLY_DEFAULT) == + if (BKE_id_remapper_apply(mappings, (ID **)&v3d->ob_center, ID_REMAP_APPLY_DEFAULT) == ID_REMAP_RESULT_SOURCE_UNASSIGNED) { /* Otherwise, bone-name may remain valid... @@ -2011,13 +2018,10 @@ static void view3d_id_remap_v3d_ob_centers(View3D *v3d, } } -static void view3d_id_remap_v3d(ScrArea *area, - SpaceLink *slink, - View3D *v3d, - const blender::bke::id::IDRemapper &mappings, - const bool is_local) +static void view3d_id_remap_v3d( + ScrArea *area, SpaceLink *slink, View3D *v3d, const IDRemapper *mappings, const bool is_local) { - if (mappings.apply(reinterpret_cast(&v3d->camera), ID_REMAP_APPLY_DEFAULT) == + if (BKE_id_remapper_apply(mappings, (ID **)&v3d->camera, ID_REMAP_APPLY_DEFAULT) == ID_REMAP_RESULT_SOURCE_UNASSIGNED) { /* 3D view might be inactive, in that case needs to use slink->regionbase */ @@ -2035,12 +2039,11 @@ static void view3d_id_remap_v3d(ScrArea *area, } } -static void view3d_id_remap(ScrArea *area, - SpaceLink *slink, - const blender::bke::id::IDRemapper &mappings) +static void view3d_id_remap(ScrArea *area, SpaceLink *slink, const IDRemapper *mappings) { - if (!mappings.contains_mappings_for_any(FILTER_ID_OB | FILTER_ID_MA | FILTER_ID_IM | - FILTER_ID_MC)) + + if (!BKE_id_remapper_has_mapping_for(mappings, + FILTER_ID_OB | FILTER_ID_MA | FILTER_ID_IM | FILTER_ID_MC)) { return; } diff --git a/source/blender/editors/space_view3d/view3d_buttons.cc b/source/blender/editors/space_view3d/view3d_buttons.cc index 1a9a53ace9f..31b23c310ee 100644 --- a/source/blender/editors/space_view3d/view3d_buttons.cc +++ b/source/blender/editors/space_view3d/view3d_buttons.cc @@ -22,7 +22,7 @@ #include "MEM_guardedalloc.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BLI_array_utils.h" #include "BLI_bitmap.h" @@ -42,8 +42,7 @@ #include "BKE_layer.hh" #include "BKE_object.hh" #include "BKE_object_deform.h" -#include "BKE_object_types.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "BKE_screen.hh" #include "DEG_depsgraph.hh" @@ -470,15 +469,27 @@ static void v3d_editvertex_buts(uiLayout *layout, View3D *v3d, Object *ob, float } if (tot == 0) { - uiDefBut( - block, UI_BTYPE_LABEL, 0, IFACE_("Nothing selected"), 0, 130, 200, 20, nullptr, 0, 0, ""); + uiDefBut(block, + UI_BTYPE_LABEL, + 0, + IFACE_("Nothing selected"), + 0, + 130, + 200, + 20, + nullptr, + 0, + 0, + 0, + 0, + ""); return; } /* Location, X/Y/Z */ mul_v3_fl(median_basis.generic.location, 1.0f / float(tot)); if (v3d->flag & V3D_GLOBAL_STATS) { - mul_m4_v3(ob->object_to_world().ptr(), median_basis.generic.location); + mul_m4_v3(ob->object_to_world, median_basis.generic.location); } if (has_meshdata) { @@ -535,7 +546,7 @@ static void v3d_editvertex_buts(uiLayout *layout, View3D *v3d, Object *ob, float else { c = IFACE_("Median:"); } - uiDefBut(block, UI_BTYPE_LABEL, 0, c, 0, yi -= buth, butw, buth, nullptr, 0, 0, ""); + uiDefBut(block, UI_BTYPE_LABEL, 0, c, 0, yi -= buth, butw, buth, nullptr, 0, 0, 0, 0, ""); UI_block_align_begin(block); @@ -647,6 +658,8 @@ static void v3d_editvertex_buts(uiLayout *layout, View3D *v3d, Object *ob, float nullptr, 0.0, 0.0, + 0, + 0, ""); /* customdata layer added on demand */ but = uiDefButF(block, @@ -723,6 +736,8 @@ static void v3d_editvertex_buts(uiLayout *layout, View3D *v3d, Object *ob, float nullptr, 0.0, 0.0, + 0, + 0, ""); /* customdata layer added on demand */ but = uiDefButF(block, @@ -913,9 +928,9 @@ static void v3d_editvertex_buts(uiLayout *layout, View3D *v3d, Object *ob, float memcpy(&ve_median_basis, &tfp->ve_median, sizeof(tfp->ve_median)); if (v3d->flag & V3D_GLOBAL_STATS) { - invert_m4_m4(ob->runtime->world_to_object.ptr(), ob->object_to_world().ptr()); - mul_m4_v3(ob->world_to_object().ptr(), median_basis.generic.location); - mul_m4_v3(ob->world_to_object().ptr(), ve_median_basis.generic.location); + invert_m4_m4(ob->world_to_object, ob->object_to_world); + mul_m4_v3(ob->world_to_object, median_basis.generic.location); + mul_m4_v3(ob->world_to_object, ve_median_basis.generic.location); } sub_vn_vnvn((float *)&median_basis, (float *)&ve_median_basis, @@ -1186,7 +1201,7 @@ static void v3d_object_dimension_buts(bContext *C, uiLayout *layout, View3D *v3d BKE_object_dimensions_eval_cached_get(ob, tfp->ob_dims); copy_v3_v3(tfp->ob_dims_orig, tfp->ob_dims); copy_v3_v3(tfp->ob_scale_orig, ob->scale); - copy_m4_m4(tfp->ob_obmat_orig, ob->object_to_world().ptr()); + copy_m4_m4(tfp->ob_obmat_orig, ob->object_to_world); uiDefBut(block, UI_BTYPE_LABEL, @@ -1199,6 +1214,8 @@ static void v3d_object_dimension_buts(bContext *C, uiLayout *layout, View3D *v3d nullptr, 0, 0, + 0, + 0, ""); UI_block_align_begin(block); const float lim = FLT_MAX; diff --git a/source/blender/editors/space_view3d/view3d_camera_control.cc b/source/blender/editors/space_view3d/view3d_camera_control.cc index eb159e42ef4..5788419169d 100644 --- a/source/blender/editors/space_view3d/view3d_camera_control.cc +++ b/source/blender/editors/space_view3d/view3d_camera_control.cc @@ -152,7 +152,7 @@ View3DCameraControl *ED_view3d_cameracontrol_acquire(Depsgraph *depsgraph, vctrl->obtfm = BKE_object_tfm_backup(ob_back); BKE_object_where_is_calc(depsgraph, scene, v3d->camera); - negate_v3_v3(rv3d->ofs, v3d->camera->object_to_world().location()); + negate_v3_v3(rv3d->ofs, v3d->camera->object_to_world[3]); rv3d->dist = 0.0; } @@ -260,7 +260,7 @@ void ED_view3d_cameracontrol_update(View3DCameraControl *vctrl, /* args for keyf invert_m4_m4(prev_view_imat, vctrl->view_mat_prev); mul_m4_m4m4(diff_mat, view_mat, prev_view_imat); - mul_m4_m4m4(parent_mat, diff_mat, vctrl->root_parent->object_to_world().ptr()); + mul_m4_m4m4(parent_mat, diff_mat, vctrl->root_parent->object_to_world); if (object_apply_mat4_with_protect(vctrl->root_parent, parent_mat, false, rv3d, view_mat)) { /* Calculate again since the view locking changes the matrix. */ diff --git a/source/blender/editors/space_view3d/view3d_context.cc b/source/blender/editors/space_view3d/view3d_context.cc index 9040c610e81..18ff0924ec0 100644 --- a/source/blender/editors/space_view3d/view3d_context.cc +++ b/source/blender/editors/space_view3d/view3d_context.cc @@ -18,6 +18,8 @@ #include "ED_view3d.hh" +#include "RNA_types.hh" + #include "view3d_intern.h" /* -------------------------------------------------------------------- */ diff --git a/source/blender/editors/space_view3d/view3d_cursor_snap.cc b/source/blender/editors/space_view3d/view3d_cursor_snap.cc index 2a1909978cf..0610e4633de 100644 --- a/source/blender/editors/space_view3d/view3d_cursor_snap.cc +++ b/source/blender/editors/space_view3d/view3d_cursor_snap.cc @@ -18,11 +18,11 @@ #include "MEM_guardedalloc.h" #include "BKE_context.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_layer.hh" #include "BKE_main.hh" #include "BKE_object.hh" -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "BKE_screen.hh" #include "GPU_immediate.h" diff --git a/source/blender/editors/space_view3d/view3d_draw.cc b/source/blender/editors/space_view3d/view3d_draw.cc index 124377203c2..d718cbdb796 100644 --- a/source/blender/editors/space_view3d/view3d_draw.cc +++ b/source/blender/editors/space_view3d/view3d_draw.cc @@ -8,9 +8,11 @@ #include +#include "BLI_jitter_2d.h" #include "BLI_listbase.h" #include "BLI_math_matrix.h" #include "BLI_math_rotation.h" +#include "BLI_math_vector.hh" #include "BLI_rect.h" #include "BLI_string.h" #include "BLI_string_utils.hh" @@ -18,26 +20,29 @@ #include "BKE_armature.hh" #include "BKE_camera.h" -#include "BKE_collection.hh" +#include "BKE_collection.h" #include "BKE_context.hh" #include "BKE_customdata.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_image.h" #include "BKE_key.hh" #include "BKE_layer.hh" #include "BKE_main.hh" #include "BKE_object.hh" #include "BKE_paint.hh" -#include "BKE_scene.hh" +#include "BKE_scene.h" +#include "BKE_studiolight.h" #include "BKE_unit.hh" #include "BLF_api.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_armature_types.h" +#include "DNA_brush_types.h" #include "DNA_camera_types.h" #include "DNA_key_types.h" +#include "DNA_mesh_types.h" #include "DNA_object_types.h" #include "DNA_view3d_types.h" #include "DNA_windowmanager_types.h" @@ -50,6 +55,8 @@ #include "ED_keyframing.hh" #include "ED_scene.hh" #include "ED_screen.hh" +#include "ED_screen_types.hh" +#include "ED_transform.hh" #include "ED_view3d_offscreen.hh" #include "ED_viewer_path.hh" @@ -58,6 +65,8 @@ #include "DEG_depsgraph_query.hh" #include "GPU_batch.h" +#include "GPU_batch_presets.h" +#include "GPU_capabilities.h" #include "GPU_framebuffer.h" #include "GPU_immediate.h" #include "GPU_immediate_util.h" @@ -76,6 +85,8 @@ #include "WM_api.hh" #include "WM_types.hh" +#include "RNA_access.hh" + #include "IMB_imbuf.hh" #include "IMB_imbuf_types.hh" @@ -1219,7 +1230,8 @@ static const char *view3d_get_name(View3D *v3d, RegionView3D *rv3d) default: if (rv3d->persp == RV3D_CAMOB) { if ((v3d->camera) && (v3d->camera->type == OB_CAMERA)) { - const Camera *cam = static_cast(v3d->camera->data); + Camera *cam; + cam = static_cast(v3d->camera->data); if (cam->type == CAM_PERSP) { name = IFACE_("Camera Perspective"); } @@ -2103,7 +2115,7 @@ ImBuf *ED_view3d_draw_offscreen_imbuf_simple(Depsgraph *depsgraph, rv3d.persp = RV3D_CAMOB; - copy_m4_m4(rv3d.viewinv, v3d.camera->object_to_world().ptr()); + copy_m4_m4(rv3d.viewinv, v3d.camera->object_to_world); normalize_m4(rv3d.viewinv); invert_m4_m4(rv3d.viewmat, rv3d.viewinv); @@ -2248,7 +2260,7 @@ static void view3d_opengl_read_Z_pixels(GPUViewport *viewport, rcti *rect, void GPU_framebuffer_free(depth_read_fb); } -void ED_view3d_select_id_validate(const ViewContext *vc) +void ED_view3d_select_id_validate(ViewContext *vc) { validate_object_select_id( vc->depsgraph, vc->scene, vc->view_layer, vc->region, vc->v3d, vc->obact); @@ -2439,39 +2451,6 @@ void ED_view3d_depths_free(ViewDepths *depths) MEM_freeN(depths); } -bool ED_view3d_has_depth_buffer_updated(const Depsgraph *depsgraph, const View3D *v3d) -{ -#ifdef REUSE_DEPTH_BUFFER - /* Check if the depth buffer was drawn by any engine and thus can be reused. - * - * The idea is good, but it is too error prone. - * Even when updated by an engine, the depth buffer can still be cleared by drawing callbacks and - * by the GPU_select API used by gizmos. - * Check #GPU_clear_depth to track when the depth buffer is cleared. */ - const char *engine_name = DEG_get_evaluated_scene(depsgraph)->r.engine; - RenderEngineType *engine_type = RE_engines_find(engine_name); - - bool is_viewport_wire_no_xray = v3d->shading.type < OB_SOLID && !XRAY_ENABLED(v3d); - bool is_viewport_preview_solid = v3d->shading.type == OB_SOLID; - bool is_viewport_preview_material = v3d->shading.type == OB_MATERIAL; - bool is_viewport_render_eevee = v3d->shading.type == OB_RENDER && - (STREQ(engine_name, RE_engine_id_BLENDER_EEVEE) || - STREQ(engine_name, RE_engine_id_BLENDER_EEVEE_NEXT)); - bool is_viewport_render_workbench = v3d->shading.type == OB_RENDER && - STREQ(engine_name, RE_engine_id_BLENDER_WORKBENCH); - bool is_viewport_render_external_with_overlay = v3d->shading.type == OB_RENDER && - !(engine_type->flag & RE_INTERNAL) && - !(v3d->flag2 & V3D_HIDE_OVERLAYS); - - return is_viewport_preview_solid || is_viewport_preview_material || is_viewport_wire_no_xray || - is_viewport_render_eevee || is_viewport_render_workbench || - is_viewport_render_external_with_overlay; -#else - UNUSED_VARS(depsgraph, v3d); - return false; -#endif -} - /** \} */ /* -------------------------------------------------------------------- */ diff --git a/source/blender/editors/space_view3d/view3d_edit.cc b/source/blender/editors/space_view3d/view3d_edit.cc index 9c8160cffaf..161e0a97b21 100644 --- a/source/blender/editors/space_view3d/view3d_edit.cc +++ b/source/blender/editors/space_view3d/view3d_edit.cc @@ -24,9 +24,10 @@ #include "BKE_armature.hh" #include "BKE_camera.h" #include "BKE_lib_id.hh" +#include "BKE_main.hh" #include "BKE_object.hh" -#include "BKE_report.hh" -#include "BKE_scene.hh" +#include "BKE_report.h" +#include "BKE_scene.h" #include "BKE_screen.hh" #include "DEG_depsgraph_query.hh" @@ -321,7 +322,7 @@ static int render_border_exec(bContext *C, wmOperator *op) } if (rv3d->persp == RV3D_CAMOB) { - DEG_id_tag_update(&scene->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&scene->id, ID_RECALC_COPY_ON_WRITE); } return OPERATOR_FINISHED; } @@ -381,7 +382,7 @@ static int clear_render_border_exec(bContext *C, wmOperator * /*op*/) border->ymax = 1.0f; if (rv3d->persp == RV3D_CAMOB) { - DEG_id_tag_update(&scene->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&scene->id, ID_RECALC_COPY_ON_WRITE); } return OPERATOR_FINISHED; } @@ -562,7 +563,15 @@ static Camera *background_image_camera_from_context(bContext *C) return static_cast(CTX_data_pointer_get_type(C, "camera", &RNA_Camera).data); } -static int camera_background_image_add_exec(bContext *C, wmOperator *op) +static int background_image_add_exec(bContext *C, wmOperator * /*op*/) +{ + Camera *cam = background_image_camera_from_context(C); + BKE_camera_background_image_new(cam); + + return OPERATOR_FINISHED; +} + +static int background_image_add_invoke(bContext *C, wmOperator *op, const wmEvent * /*event*/) { Camera *cam = background_image_camera_from_context(C); Image *ima; @@ -577,42 +586,42 @@ static int camera_background_image_add_exec(bContext *C, wmOperator *op) cam->flag |= CAM_SHOW_BG_IMAGE; WM_event_add_notifier(C, NC_CAMERA | ND_DRAW_RENDER_VIEWPORT, cam); - DEG_id_tag_update(&cam->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&cam->id, ID_RECALC_COPY_ON_WRITE); return OPERATOR_FINISHED; } -static bool camera_background_image_add_poll(bContext *C) +static bool background_image_add_poll(bContext *C) { return background_image_camera_from_context(C) != nullptr; } -void VIEW3D_OT_camera_background_image_add(wmOperatorType *ot) +void VIEW3D_OT_background_image_add(wmOperatorType *ot) { /* identifiers */ - ot->name = "Add Camera Background Image"; - ot->description = "Add a new background image to the active camera"; - ot->idname = "VIEW3D_OT_camera_background_image_add"; + /* NOTE: having key shortcut here is bad practice, + * but for now keep because this displays when dragging an image over the 3D viewport */ + ot->name = "Add Background Image"; + ot->description = "Add a new background image"; + ot->idname = "VIEW3D_OT_background_image_add"; /* api callbacks */ - ot->exec = camera_background_image_add_exec; - ot->poll = camera_background_image_add_poll; + ot->invoke = background_image_add_invoke; + ot->exec = background_image_add_exec; + ot->poll = background_image_add_poll; /* flags */ - ot->flag = OPTYPE_UNDO | OPTYPE_REGISTER; + ot->flag = OPTYPE_UNDO; /* properties */ - PropertyRNA *prop = RNA_def_string( - ot->srna, "filepath", nullptr, FILE_MAX, "Filepath", "Path to image file"); - RNA_def_property_flag(prop, PropertyFlag(PROP_HIDDEN | PROP_SKIP_SAVE)); - prop = RNA_def_boolean(ot->srna, - "relative_path", - true, - "Relative Path", - "Select the file relative to the blend file"); - RNA_def_property_flag(prop, PropertyFlag(PROP_HIDDEN | PROP_SKIP_SAVE)); - WM_operator_properties_id_lookup(ot, true); + WM_operator_properties_filesel(ot, + FILE_TYPE_FOLDER | FILE_TYPE_IMAGE | FILE_TYPE_MOVIE, + FILE_SPECIAL, + FILE_OPENFILE, + WM_FILESEL_FILEPATH | WM_FILESEL_RELPATH, + FILE_DEFAULTDISPLAY, + FILE_SORT_DEFAULT); } /** \} */ @@ -621,7 +630,7 @@ void VIEW3D_OT_camera_background_image_add(wmOperatorType *ot) /** \name Background Image Remove Operator * \{ */ -static int camera_background_image_remove_exec(bContext *C, wmOperator *op) +static int background_image_remove_exec(bContext *C, wmOperator *op) { Camera *cam = static_cast(CTX_data_pointer_get_type(C, "camera", &RNA_Camera).data); const int index = RNA_int_get(op->ptr, "index"); @@ -646,22 +655,22 @@ static int camera_background_image_remove_exec(bContext *C, wmOperator *op) BKE_camera_background_image_remove(cam, bgpic_rem); WM_event_add_notifier(C, NC_CAMERA | ND_DRAW_RENDER_VIEWPORT, cam); - DEG_id_tag_update(&cam->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&cam->id, ID_RECALC_COPY_ON_WRITE); return OPERATOR_FINISHED; } return OPERATOR_CANCELLED; } -void VIEW3D_OT_camera_background_image_remove(wmOperatorType *ot) +void VIEW3D_OT_background_image_remove(wmOperatorType *ot) { /* identifiers */ - ot->name = "Remove Camera Background Image"; - ot->description = "Remove a background image from the camera"; - ot->idname = "VIEW3D_OT_camera_background_image_remove"; + ot->name = "Remove Background Image"; + ot->description = "Remove a background image from the 3D view"; + ot->idname = "VIEW3D_OT_background_image_remove"; /* api callbacks */ - ot->exec = camera_background_image_remove_exec; + ot->exec = background_image_remove_exec; ot->poll = ED_operator_camera_poll; /* flags */ @@ -693,7 +702,7 @@ static int drop_world_exec(bContext *C, wmOperator *op) id_us_plus(&world->id); scene->world = world; - DEG_id_tag_update(&scene->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&scene->id, ID_RECALC_COPY_ON_WRITE); DEG_relations_tag_update(bmain); WM_event_add_notifier(C, NC_SCENE | ND_WORLD, scene); @@ -846,11 +855,7 @@ void ED_view3d_cursor3d_position(bContext *C, Depsgraph *depsgraph = CTX_data_ensure_evaluated_depsgraph(C); view3d_operator_needs_opengl(C); - - /* Ensure the depth buffer is updated for #ED_view3d_autodist. */ - ED_view3d_depth_override(depsgraph, region, v3d, nullptr, V3D_DEPTH_NO_GPENCIL, nullptr); - - if (ED_view3d_autodist(region, v3d, mval, cursor_co, nullptr)) { + if (ED_view3d_autodist(depsgraph, region, v3d, mval, cursor_co, true, nullptr)) { depth_used = true; } } @@ -1053,7 +1058,7 @@ void ED_view3d_cursor3d_update(bContext *C, WM_msg_publish_rna_params(mbus, &msg_key_params); } - DEG_id_tag_update(&scene->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&scene->id, ID_RECALC_COPY_ON_WRITE); } static int view3d_cursor3d_invoke(bContext *C, wmOperator *op, const wmEvent *event) diff --git a/source/blender/editors/space_view3d/view3d_gizmo_armature.cc b/source/blender/editors/space_view3d/view3d_gizmo_armature.cc index 23f8b3c4077..c6449006f45 100644 --- a/source/blender/editors/space_view3d/view3d_gizmo_armature.cc +++ b/source/blender/editors/space_view3d/view3d_gizmo_armature.cc @@ -6,11 +6,13 @@ * \ingroup spview3d */ +#include "BLI_blenlib.h" #include "BLI_math_matrix.h" #include "BLI_math_vector.h" #include "BLI_utildefines.h" #include "BKE_action.h" +#include "BKE_armature.hh" #include "BKE_context.hh" #include "BKE_layer.hh" #include "BKE_object.hh" @@ -18,7 +20,9 @@ #include "DNA_armature_types.h" #include "DNA_object_types.h" +#include "ED_armature.hh" #include "ED_gizmo_library.hh" +#include "ED_screen.hh" #include "UI_resources.hh" @@ -26,6 +30,7 @@ #include "RNA_access.hh" +#include "WM_api.hh" #include "WM_types.hh" #include "view3d_intern.h" /* own include */ @@ -184,8 +189,7 @@ static void WIDGETGROUP_armature_spline_refresh(const bContext *C, wmGizmoGroup bspline_group->handles[i].index = i; float mat[4][4]; - mul_m4_m4m4( - mat, ob->object_to_world().ptr(), (i == 0) ? pchan->disp_mat : pchan->disp_tail_mat); + mul_m4_m4m4(mat, ob->object_to_world, (i == 0) ? pchan->disp_mat : pchan->disp_tail_mat); copy_m4_m4(gz->matrix_space, mat); /* need to set property here for undo. TODO: would prefer to do this in _init. */ diff --git a/source/blender/editors/space_view3d/view3d_gizmo_camera.cc b/source/blender/editors/space_view3d/view3d_gizmo_camera.cc index a341d33e31d..9e0202751a5 100644 --- a/source/blender/editors/space_view3d/view3d_gizmo_camera.cc +++ b/source/blender/editors/space_view3d/view3d_gizmo_camera.cc @@ -6,6 +6,7 @@ * \ingroup spview3d */ +#include "BLI_blenlib.h" #include "BLI_math_matrix.h" #include "BLI_math_vector.h" #include "BLI_utildefines.h" @@ -18,6 +19,7 @@ #include "DNA_camera_types.h" #include "DNA_object_types.h" +#include "ED_armature.hh" #include "ED_gizmo_library.hh" #include "ED_screen.hh" @@ -27,6 +29,7 @@ #include "RNA_access.hh" +#include "WM_api.hh" #include "WM_message.hh" #include "WM_types.hh" @@ -63,7 +66,7 @@ static bool WIDGETGROUP_camera_poll(const bContext *C, wmGizmoGroupType * /*gzgt if (base && BASE_SELECTABLE(v3d, base)) { Object *ob = base->object; if (ob->type == OB_CAMERA) { - const Camera *camera = static_cast(ob->data); + Camera *camera = static_cast(ob->data); /* TODO: support overrides. */ if (BKE_id_is_editable(CTX_data_main(C), &camera->id)) { return true; @@ -87,7 +90,7 @@ static void WIDGETGROUP_camera_setup(const bContext *C, wmGizmoGroup *gzgroup) MEM_callocN(sizeof(CameraWidgetGroup), __func__)); gzgroup->customdata = cagzgroup; - negate_v3_v3(dir, ob->object_to_world().ptr()[2]); + negate_v3_v3(dir, ob->object_to_world[2]); /* dof distance */ { @@ -139,12 +142,11 @@ static void WIDGETGROUP_camera_refresh(const bContext *C, wmGizmoGroup *gzgroup) PointerRNA camera_ptr = RNA_pointer_create(&ca->id, &RNA_Camera, ca); - negate_v3_v3(dir, ob->object_to_world().ptr()[2]); + negate_v3_v3(dir, ob->object_to_world[2]); if ((ca->flag & CAM_SHOWLIMITS) && (v3d->gizmo_show_camera & V3D_GIZMO_SHOW_CAMERA_DOF_DIST)) { - WM_gizmo_set_matrix_location(cagzgroup->dop_dist, ob->object_to_world().location()); - WM_gizmo_set_matrix_rotation_from_yz_axis( - cagzgroup->dop_dist, ob->object_to_world().ptr()[1], dir); + WM_gizmo_set_matrix_location(cagzgroup->dop_dist, ob->object_to_world[3]); + WM_gizmo_set_matrix_rotation_from_yz_axis(cagzgroup->dop_dist, ob->object_to_world[1], dir); WM_gizmo_set_scale(cagzgroup->dop_dist, ca->drawsize); WM_gizmo_set_flag(cagzgroup->dop_dist, WM_GIZMO_HIDDEN, false); @@ -184,17 +186,17 @@ static void WIDGETGROUP_camera_refresh(const bContext *C, wmGizmoGroup *gzgroup) aspect[1] = (sensor_fit == CAMERA_SENSOR_FIT_HOR) ? aspy / aspx : 1.0f; unit_m4(widget->matrix_basis); - WM_gizmo_set_matrix_location(widget, ob->object_to_world().location()); - WM_gizmo_set_matrix_rotation_from_yz_axis(widget, ob->object_to_world().ptr()[1], dir); + WM_gizmo_set_matrix_location(widget, ob->object_to_world[3]); + WM_gizmo_set_matrix_rotation_from_yz_axis(widget, ob->object_to_world[1], dir); if (is_ortho) { scale_matrix = ca->ortho_scale * 0.5f; } else { const float ob_scale_inv[3] = { - 1.0f / len_v3(ob->object_to_world().ptr()[0]), - 1.0f / len_v3(ob->object_to_world().ptr()[1]), - 1.0f / len_v3(ob->object_to_world().ptr()[2]), + 1.0f / len_v3(ob->object_to_world[0]), + 1.0f / len_v3(ob->object_to_world[1]), + 1.0f / len_v3(ob->object_to_world[2]), }; const float ob_scale_uniform_inv = (ob_scale_inv[0] + ob_scale_inv[1] + ob_scale_inv[2]) / 3.0f; @@ -362,7 +364,7 @@ static void gizmo_render_border_prop_matrix_set(const wmGizmo * /*gz*/, BLI_rctf_isect(&rect, border, border); if (viewgroup->is_camera) { - DEG_id_tag_update(&viewgroup->scene->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&viewgroup->scene->id, ID_RECALC_COPY_ON_WRITE); } } diff --git a/source/blender/editors/space_view3d/view3d_gizmo_empty.cc b/source/blender/editors/space_view3d/view3d_gizmo_empty.cc index db8cb670457..e860aea9dee 100644 --- a/source/blender/editors/space_view3d/view3d_gizmo_empty.cc +++ b/source/blender/editors/space_view3d/view3d_gizmo_empty.cc @@ -17,9 +17,11 @@ #include "DEG_depsgraph.hh" +#include "DNA_light_types.h" #include "DNA_object_types.h" #include "ED_gizmo_library.hh" +#include "ED_screen.hh" #include "UI_resources.hh" @@ -27,6 +29,7 @@ #include "RNA_access.hh" +#include "WM_api.hh" #include "WM_types.hh" #include "view3d_intern.h" /* own include */ @@ -141,7 +144,7 @@ static void WIDGETGROUP_empty_image_refresh(const bContext *C, wmGizmoGroup *gzg BKE_view_layer_synced_ensure(scene, view_layer); Object *ob = BKE_view_layer_active_object_get(view_layer); - copy_m4_m4(gz->matrix_basis, ob->object_to_world().ptr()); + copy_m4_m4(gz->matrix_basis, ob->object_to_world); RNA_enum_set(gz->ptr, "transform", diff --git a/source/blender/editors/space_view3d/view3d_gizmo_forcefield.cc b/source/blender/editors/space_view3d/view3d_gizmo_forcefield.cc index b78afae0857..ccb2adb1d98 100644 --- a/source/blender/editors/space_view3d/view3d_gizmo_forcefield.cc +++ b/source/blender/editors/space_view3d/view3d_gizmo_forcefield.cc @@ -15,6 +15,7 @@ #include "DNA_object_types.h" #include "ED_gizmo_library.hh" +#include "ED_screen.hh" #include "UI_resources.hh" @@ -23,6 +24,7 @@ #include "RNA_access.hh" #include "RNA_prototypes.h" +#include "WM_api.hh" #include "WM_types.hh" #include "view3d_intern.h" /* own include */ @@ -87,8 +89,8 @@ static void WIDGETGROUP_forcefield_refresh(const bContext *C, wmGizmoGroup *gzgr const float ofs[3] = {0.0f, -size, 0.0f}; PointerRNA field_ptr = RNA_pointer_create(&ob->id, &RNA_FieldSettings, pd); - WM_gizmo_set_matrix_location(gz, ob->object_to_world().location()); - WM_gizmo_set_matrix_rotation_from_z_axis(gz, ob->object_to_world().ptr()[2]); + WM_gizmo_set_matrix_location(gz, ob->object_to_world[3]); + WM_gizmo_set_matrix_rotation_from_z_axis(gz, ob->object_to_world[2]); WM_gizmo_set_matrix_offset_location(gz, ofs); WM_gizmo_set_flag(gz, WM_GIZMO_HIDDEN, false); WM_gizmo_target_property_def_rna(gz, "offset", &field_ptr, "strength", -1); diff --git a/source/blender/editors/space_view3d/view3d_gizmo_light.cc b/source/blender/editors/space_view3d/view3d_gizmo_light.cc index 79f82fa223a..503b0188bc9 100644 --- a/source/blender/editors/space_view3d/view3d_gizmo_light.cc +++ b/source/blender/editors/space_view3d/view3d_gizmo_light.cc @@ -13,6 +13,7 @@ #include "BKE_context.hh" #include "BKE_layer.hh" +#include "BKE_object.hh" #include "DEG_depsgraph.hh" @@ -20,6 +21,7 @@ #include "DNA_object_types.h" #include "ED_gizmo_library.hh" +#include "ED_screen.hh" #include "UI_resources.hh" @@ -231,9 +233,9 @@ static void WIDGETGROUP_light_spot_refresh(const bContext *C, wmGizmoGroup *gzgr wmGizmo *gz = ls_gzgroup->spot_angle; float dir[3]; - negate_v3_v3(dir, ob->object_to_world().ptr()[2]); + negate_v3_v3(dir, ob->object_to_world[2]); WM_gizmo_set_matrix_rotation_from_z_axis(gz, dir); - WM_gizmo_set_matrix_location(gz, ob->object_to_world().location()); + WM_gizmo_set_matrix_location(gz, ob->object_to_world[3]); const char *propname = "spot_size"; WM_gizmo_target_property_def_rna(gz, "offset", &lamp_ptr, propname, -1); @@ -243,11 +245,11 @@ static void WIDGETGROUP_light_spot_refresh(const bContext *C, wmGizmoGroup *gzgr { wmGizmo *gz = ls_gzgroup->spot_blend; - copy_m4_m4(gz->matrix_basis, ob->object_to_world().ptr()); + copy_m4_m4(gz->matrix_basis, ob->object_to_world); /* Move center to the cone base plane. */ float dir[3]; - negate_v3_v3(dir, ob->object_to_world().ptr()[2]); + negate_v3_v3(dir, ob->object_to_world[2]); mul_v3_fl(dir, CONE_SCALE * cosf(0.5f * la->spotsize)); add_v3_v3(gz->matrix_basis[3], dir); } @@ -267,7 +269,7 @@ static void WIDGETGROUP_light_spot_draw_prepare(const bContext *C, wmGizmoGroup RegionView3D *rv3d = static_cast(CTX_wm_region(C)->regiondata); WM_gizmo_set_matrix_rotation_from_z_axis(gz, rv3d->viewinv[2]); - WM_gizmo_set_matrix_location(gz, ob->object_to_world().location()); + WM_gizmo_set_matrix_location(gz, ob->object_to_world[3]); } void VIEW3D_GGT_light_spot(wmGizmoGroupType *gzgt) @@ -353,7 +355,7 @@ static void WIDGETGROUP_light_point_draw_prepare(const bContext *C, wmGizmoGroup const RegionView3D *rv3d = static_cast(CTX_wm_region(C)->regiondata); WM_gizmo_set_matrix_rotation_from_z_axis(gz, rv3d->viewinv[2]); - WM_gizmo_set_matrix_location(gz, ob->object_to_world().location()); + WM_gizmo_set_matrix_location(gz, ob->object_to_world[3]); } void VIEW3D_GGT_light_point(wmGizmoGroupType *gzgt) @@ -405,7 +407,7 @@ static void gizmo_area_light_prop_matrix_set(const wmGizmo * /*gz*/, la->area_size = len_v3(matrix[0]); } - DEG_id_tag_update(&la->id, ID_RECALC_PARAMETERS); + DEG_id_tag_update(&la->id, ID_RECALC_COPY_ON_WRITE); WM_main_add_notifier(NC_LAMP | ND_LIGHTING_DRAW, la); } @@ -459,7 +461,7 @@ static void WIDGETGROUP_light_area_refresh(const bContext *C, wmGizmoGroup *gzgr Light *la = static_cast(ob->data); wmGizmo *gz = wwrapper->gizmo; - copy_m4_m4(gz->matrix_basis, ob->object_to_world().ptr()); + copy_m4_m4(gz->matrix_basis, ob->object_to_world); int flag = ED_GIZMO_CAGE_XFORM_FLAG_SCALE; if (ELEM(la->area_shape, LA_AREA_SQUARE, LA_AREA_DISK)) { @@ -555,7 +557,7 @@ static void WIDGETGROUP_light_target_draw_prepare(const bContext *C, wmGizmoGrou Object *ob = BKE_view_layer_active_object_get(view_layer); wmGizmo *gz = wwrapper->gizmo; - normalize_m4_m4(gz->matrix_basis, ob->object_to_world().ptr()); + normalize_m4_m4(gz->matrix_basis, ob->object_to_world); unit_m4(gz->matrix_offset); if (ob->type == OB_LAMP) { diff --git a/source/blender/editors/space_view3d/view3d_gizmo_navigate_type.cc b/source/blender/editors/space_view3d/view3d_gizmo_navigate_type.cc index 62f6970f520..d6d82414bac 100644 --- a/source/blender/editors/space_view3d/view3d_gizmo_navigate_type.cc +++ b/source/blender/editors/space_view3d/view3d_gizmo_navigate_type.cc @@ -25,18 +25,25 @@ #include "BKE_context.hh" #include "GPU_batch.h" +#include "GPU_batch_presets.h" #include "GPU_immediate.h" +#include "GPU_immediate_util.h" #include "GPU_matrix.h" #include "GPU_state.h" #include "BLF_api.hh" +#include "RNA_access.hh" +#include "RNA_define.hh" + #include "UI_interface.hh" #include "UI_resources.hh" #include "WM_api.hh" #include "WM_types.hh" +#include "ED_screen.hh" + #include "view3d_intern.h" /* Radius of the entire background. */ diff --git a/source/blender/editors/space_view3d/view3d_gizmo_preselect.cc b/source/blender/editors/space_view3d/view3d_gizmo_preselect.cc index aff5ca88ba4..7c463ef72a2 100644 --- a/source/blender/editors/space_view3d/view3d_gizmo_preselect.cc +++ b/source/blender/editors/space_view3d/view3d_gizmo_preselect.cc @@ -10,11 +10,14 @@ #include "BLI_utildefines.h" +#include "BKE_context.hh" + #include "ED_gizmo_utils.hh" #include "ED_screen.hh" #include "UI_resources.hh" +#include "WM_api.hh" #include "WM_types.hh" #include "view3d_intern.h" /* own include */ diff --git a/source/blender/editors/space_view3d/view3d_gizmo_preselect_type.cc b/source/blender/editors/space_view3d/view3d_gizmo_preselect_type.cc index 07d11b96602..6d677d55a04 100644 --- a/source/blender/editors/space_view3d/view3d_gizmo_preselect_type.cc +++ b/source/blender/editors/space_view3d/view3d_gizmo_preselect_type.cc @@ -19,7 +19,7 @@ #include "BKE_context.hh" #include "BKE_editmesh.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_layer.hh" #include "BKE_mesh.hh" #include "BKE_mesh_wrapper.hh" @@ -102,7 +102,7 @@ static void gizmo_preselect_elem_draw(const bContext *C, wmGizmo *gz) MeshElemGizmo3D *gz_ele = (MeshElemGizmo3D *)gz; if (gz_ele->base_index != -1) { Object *ob = gz_ele->bases[gz_ele->base_index]->object; - EDBM_preselect_elem_draw(gz_ele->psel, ob->object_to_world().ptr()); + EDBM_preselect_elem_draw(gz_ele->psel, ob->object_to_world); } } @@ -188,8 +188,7 @@ static int gizmo_preselect_elem_test_select(bContext *C, wmGizmo *gz, const int BMVert *vert = (BMVert *)eve_test; float vert_p_co[2], vert_co[3]; const float mval_f[2] = {float(vc.mval[0]), float(vc.mval[1])}; - mul_v3_m4v3( - vert_co, gz_ele->bases[base_index_vert]->object->object_to_world().ptr(), vert->co); + mul_v3_m4v3(vert_co, gz_ele->bases[base_index_vert]->object->object_to_world, vert->co); ED_view3d_project_v2(vc.region, vert_co, vert_p_co); float len = len_v2v2(vert_p_co, mval_f); if (len < 35) { @@ -241,9 +240,9 @@ static int gizmo_preselect_elem_test_select(bContext *C, wmGizmo *gz, const int Object *ob = gz_ele->bases[gz_ele->base_index]->object; Depsgraph *depsgraph = CTX_data_ensure_evaluated_depsgraph(C); Object *ob_eval = DEG_get_evaluated_object(depsgraph, ob); - Mesh *mesh_eval = BKE_object_get_editmesh_eval_cage(ob_eval); - if (BKE_mesh_wrapper_vert_len(mesh_eval) == bm->totvert) { - coords = BKE_mesh_wrapper_vert_coords(mesh_eval); + Mesh *me_eval = BKE_object_get_editmesh_eval_cage(ob_eval); + if (BKE_mesh_wrapper_vert_len(me_eval) == bm->totvert) { + coords = BKE_mesh_wrapper_vert_coords(me_eval); } } EDBM_preselect_elem_update_from_single(gz_ele->psel, bm, best.ele, coords); @@ -336,7 +335,7 @@ static void gizmo_preselect_edgering_draw(const bContext *C, wmGizmo *gz) MeshEdgeRingGizmo3D *gz_ring = (MeshEdgeRingGizmo3D *)gz; if (gz_ring->base_index != -1) { Object *ob = gz_ring->bases[gz_ring->base_index]->object; - EDBM_preselect_edgering_draw(gz_ring->psel, ob->object_to_world().ptr()); + EDBM_preselect_edgering_draw(gz_ring->psel, ob->object_to_world); } } diff --git a/source/blender/editors/space_view3d/view3d_gizmo_ruler.cc b/source/blender/editors/space_view3d/view3d_gizmo_ruler.cc index da1992d25c0..b2733344845 100644 --- a/source/blender/editors/space_view3d/view3d_gizmo_ruler.cc +++ b/source/blender/editors/space_view3d/view3d_gizmo_ruler.cc @@ -11,15 +11,21 @@ #include "BLI_math_matrix_types.hh" #include "BLI_math_rotation.h" #include "BLI_math_vector_types.hh" +#include "BLI_rect.h" #include "BLI_string.h" #include "BLI_utildefines.h" +#include "BLT_translation.h" + #include "BKE_context.hh" #include "BKE_gpencil_legacy.h" -#include "BKE_report.hh" +#include "BKE_main.hh" +#include "BKE_report.h" #include "BKE_layer.hh" -#include "BKE_scene.hh" +#include "BKE_material.h" +#include "BKE_object.hh" +#include "BKE_scene.h" #include "BKE_unit.hh" #include "DNA_gpencil_legacy_types.h" @@ -28,6 +34,7 @@ #include "ED_gizmo_library.hh" #include "ED_gizmo_utils.hh" +#include "ED_gpencil_legacy.hh" #include "ED_screen.hh" #include "ED_transform.hh" #include "ED_transform_snap_object_context.hh" @@ -518,7 +525,7 @@ static void view3d_ruler_gpencil_ensure(bContext *C) Scene *scene = CTX_data_scene(C); if (scene->gpd == nullptr) { scene->gpd = BKE_gpencil_data_addnew(bmain, "Annotations"); - DEG_id_tag_update_ex(bmain, &scene->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update_ex(bmain, &scene->id, ID_RECALC_COPY_ON_WRITE); DEG_relations_tag_update(bmain); } } diff --git a/source/blender/editors/space_view3d/view3d_gizmo_tool_generic.cc b/source/blender/editors/space_view3d/view3d_gizmo_tool_generic.cc index 952fee17026..a000564230f 100644 --- a/source/blender/editors/space_view3d/view3d_gizmo_tool_generic.cc +++ b/source/blender/editors/space_view3d/view3d_gizmo_tool_generic.cc @@ -11,7 +11,7 @@ #include "BLI_utildefines.h" #include "BKE_context.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "ED_gizmo_library.hh" #include "ED_gizmo_utils.hh" diff --git a/source/blender/editors/space_view3d/view3d_header.cc b/source/blender/editors/space_view3d/view3d_header.cc index 4b451eec1ad..3e14ebb2259 100644 --- a/source/blender/editors/space_view3d/view3d_header.cc +++ b/source/blender/editors/space_view3d/view3d_header.cc @@ -14,8 +14,11 @@ #include "DNA_object_types.h" #include "DNA_scene_types.h" +#include "BLI_math_base.h" #include "BLI_utildefines.h" +#include "BLT_translation.h" + #include "BKE_context.hh" #include "BKE_editmesh.hh" #include "BKE_layer.hh" @@ -29,6 +32,9 @@ #include "WM_api.hh" #include "WM_types.hh" +#include "ED_mesh.hh" +#include "ED_undo.hh" + #include "UI_interface.hh" #include "UI_resources.hh" @@ -50,7 +56,7 @@ static int toggle_matcap_flip_exec(bContext *C, wmOperator * /*op*/) else { Scene *scene = CTX_data_scene(C); scene->display.shading.flag ^= V3D_SHADING_MATCAP_FLIP_X; - DEG_id_tag_update(&scene->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&scene->id, ID_RECALC_COPY_ON_WRITE); WM_event_add_notifier(C, NC_SCENE | ND_RENDER_OPTIONS, scene); } @@ -121,9 +127,6 @@ static void uiTemplatePaintModeSelection(uiLayout *layout, bContext *C) ViewLayer *view_layer = CTX_data_view_layer(C); BKE_view_layer_synced_ensure(scene, view_layer); Object *ob = BKE_view_layer_active_object_get(view_layer); - if (ob->type != OB_MESH) { - return; - } /* Gizmos aren't used in paint modes */ if (!ELEM(ob->mode, OB_MODE_SCULPT, OB_MODE_PARTICLE_EDIT)) { diff --git a/source/blender/editors/space_view3d/view3d_intern.h b/source/blender/editors/space_view3d/view3d_intern.h index 84e07618da3..695025cf726 100644 --- a/source/blender/editors/space_view3d/view3d_intern.h +++ b/source/blender/editors/space_view3d/view3d_intern.h @@ -52,8 +52,8 @@ void VIEW3D_OT_view_center_camera(struct wmOperatorType *ot); void VIEW3D_OT_view_center_lock(struct wmOperatorType *ot); void VIEW3D_OT_view_persportho(struct wmOperatorType *ot); void VIEW3D_OT_navigate(struct wmOperatorType *ot); -void VIEW3D_OT_camera_background_image_add(struct wmOperatorType *ot); -void VIEW3D_OT_camera_background_image_remove(struct wmOperatorType *ot); +void VIEW3D_OT_background_image_add(struct wmOperatorType *ot); +void VIEW3D_OT_background_image_remove(struct wmOperatorType *ot); void VIEW3D_OT_drop_world(struct wmOperatorType *ot); void VIEW3D_OT_clip_border(struct wmOperatorType *ot); void VIEW3D_OT_cursor3d(struct wmOperatorType *ot); diff --git a/source/blender/editors/space_view3d/view3d_iterators.cc b/source/blender/editors/space_view3d/view3d_iterators.cc index 042b839b8f1..23a2bcab212 100644 --- a/source/blender/editors/space_view3d/view3d_iterators.cc +++ b/source/blender/editors/space_view3d/view3d_iterators.cc @@ -26,7 +26,9 @@ #include "BKE_editmesh.hh" #include "BKE_mesh.hh" #include "BKE_mesh_iterators.hh" +#include "BKE_mesh_runtime.hh" #include "BKE_mesh_wrapper.hh" +#include "BKE_modifier.hh" #include "BKE_object.hh" #include "BKE_object_types.hh" @@ -284,7 +286,7 @@ static void meshobject_foreachScreenVert__mapFunc(void *user_data, data->func(data->user_data, screen_co, index); } -void meshobject_foreachScreenVert(const ViewContext *vc, +void meshobject_foreachScreenVert(ViewContext *vc, void (*func)(void *user_data, const float screen_co[2], int index), @@ -308,7 +310,7 @@ void meshobject_foreachScreenVert(const ViewContext *vc, data.hide_vert = *attributes.lookup(".hide_vert", bke::AttrDomain::Point); if (clip_flag & V3D_PROJ_TEST_CLIP_BB) { - ED_view3d_clipping_local(vc->rv3d, vc->obact->object_to_world().ptr()); + ED_view3d_clipping_local(vc->rv3d, vc->obact->object_to_world); } BKE_mesh_foreach_mapped_vert( @@ -337,7 +339,7 @@ static void mesh_foreachScreenVert__mapFunc(void *user_data, } void mesh_foreachScreenVert( - const ViewContext *vc, + ViewContext *vc, void (*func)(void *user_data, BMVert *eve, const float screen_co[2], int index), void *user_data, eV3DProjTest clip_flag) @@ -357,7 +359,7 @@ void mesh_foreachScreenVert( if (clip_flag & V3D_PROJ_TEST_CLIP_BB) { ED_view3d_clipping_local(vc->rv3d, - vc->obedit->object_to_world().ptr()); /* for local clipping lookups */ + vc->obedit->object_to_world); /* for local clipping lookups */ } BM_mesh_elem_table_ensure(vc->em->bm, BM_VERT); @@ -398,7 +400,7 @@ static void mesh_foreachScreenEdge__mapFunc(void *user_data, data->func(data->user_data, eed, screen_co_a, screen_co_b, index); } -void mesh_foreachScreenEdge(const ViewContext *vc, +void mesh_foreachScreenEdge(ViewContext *vc, void (*func)(void *user_data, BMEdge *eed, const float screen_co_a[2], @@ -428,7 +430,7 @@ void mesh_foreachScreenEdge(const ViewContext *vc, if (clip_flag & V3D_PROJ_TEST_CLIP_BB) { ED_view3d_clipping_local(vc->rv3d, - vc->obedit->object_to_world().ptr()); /* for local clipping lookups */ + vc->obedit->object_to_world); /* for local clipping lookups */ } if (clip_flag & V3D_PROJ_TEST_CLIP_CONTENT) { @@ -488,7 +490,7 @@ static void mesh_foreachScreenEdge_clip_bb_segment__mapFunc(void *user_data, data->func(data->user_data, eed, screen_co_a, screen_co_b, index); } -void mesh_foreachScreenEdge_clip_bb_segment(const ViewContext *vc, +void mesh_foreachScreenEdge_clip_bb_segment(ViewContext *vc, void (*func)(void *user_data, BMEdge *eed, const float screen_co_a[2], @@ -527,8 +529,8 @@ void mesh_foreachScreenEdge_clip_bb_segment(const ViewContext *vc, BM_mesh_elem_table_ensure(vc->em->bm, BM_EDGE); if ((clip_flag & V3D_PROJ_TEST_CLIP_BB) && (vc->rv3d->clipbb != nullptr)) { - ED_view3d_clipping_local( - vc->rv3d, vc->obedit->object_to_world().ptr()); /* for local clipping lookups. */ + ED_view3d_clipping_local(vc->rv3d, + vc->obedit->object_to_world); /* for local clipping lookups. */ BKE_mesh_foreach_mapped_edge( mesh, vc->em->bm->totedge, mesh_foreachScreenEdge_clip_bb_segment__mapFunc, &data); } @@ -566,7 +568,7 @@ static void mesh_foreachScreenFace__mapFunc(void *user_data, } void mesh_foreachScreenFace( - const ViewContext *vc, + ViewContext *vc, void (*func)(void *user_data, BMFace *efa, const float screen_co_b[2], int index), void *user_data, const eV3DProjTest clip_flag) @@ -603,7 +605,7 @@ void mesh_foreachScreenFace( /** \name Edit-Nurbs: For Each Screen Vertex * \{ */ -void nurbs_foreachScreenVert(const ViewContext *vc, +void nurbs_foreachScreenVert(ViewContext *vc, void (*func)(void *user_data, Nurb *nu, BPoint *bp, @@ -624,7 +626,7 @@ void nurbs_foreachScreenVert(const ViewContext *vc, if (clip_flag & V3D_PROJ_TEST_CLIP_BB) { ED_view3d_clipping_local(vc->rv3d, - vc->obedit->object_to_world().ptr()); /* for local clipping lookups */ + vc->obedit->object_to_world); /* for local clipping lookups */ } LISTBASE_FOREACH (Nurb *, nu, nurbs) { @@ -702,7 +704,7 @@ void nurbs_foreachScreenVert(const ViewContext *vc, /** \name Edit-Meta: For Each Screen Meta-Element * \{ */ -void mball_foreachScreenElem(const ViewContext *vc, +void mball_foreachScreenElem(ViewContext *vc, void (*func)(void *user_data, MetaElem *ml, const float screen_co_b[2]), @@ -729,7 +731,7 @@ void mball_foreachScreenElem(const ViewContext *vc, /** \name Edit-Lattice: For Each Screen Vertex * \{ */ -void lattice_foreachScreenVert(const ViewContext *vc, +void lattice_foreachScreenVert(ViewContext *vc, void (*func)(void *user_data, BPoint *bp, const float screen_co[2]), void *user_data, const eV3DProjTest clip_flag) @@ -746,8 +748,7 @@ void lattice_foreachScreenVert(const ViewContext *vc, ED_view3d_check_mats_rv3d(vc->rv3d); if (clip_flag & V3D_PROJ_TEST_CLIP_BB) { - ED_view3d_clipping_local(vc->rv3d, - obedit->object_to_world().ptr()); /* for local clipping lookups */ + ED_view3d_clipping_local(vc->rv3d, obedit->object_to_world); /* for local clipping lookups */ } for (i = 0; i < N; i++, bp++, co += 3) { @@ -768,7 +769,7 @@ void lattice_foreachScreenVert(const ViewContext *vc, /** \name Edit-Armature: For Each Screen Bone * \{ */ -void armature_foreachScreenBone(const ViewContext *vc, +void armature_foreachScreenBone(ViewContext *vc, void (*func)(void *user_data, EditBone *ebone, const float screen_co_a[2], @@ -836,7 +837,7 @@ void armature_foreachScreenBone(const ViewContext *vc, /** \name Pose: For Each Screen Bone * \{ */ -void pose_foreachScreenBone(const ViewContext *vc, +void pose_foreachScreenBone(ViewContext *vc, void (*func)(void *user_data, bPoseChannel *pchan, const float screen_co_a[2], diff --git a/source/blender/editors/space_view3d/view3d_navigate.cc b/source/blender/editors/space_view3d/view3d_navigate.cc index 1d396a9e76d..155d15088f1 100644 --- a/source/blender/editors/space_view3d/view3d_navigate.cc +++ b/source/blender/editors/space_view3d/view3d_navigate.cc @@ -7,29 +7,45 @@ */ #include "DNA_curve_types.h" +#include "DNA_gpencil_legacy_types.h" + +#include "MEM_guardedalloc.h" #include "BLI_math_geom.h" #include "BLI_math_matrix.h" #include "BLI_math_rotation.h" +#include "BLI_math_vector.h" #include "BLI_math_vector.hh" #include "BLI_rect.h" +#include "BLT_translation.h" + +#include "BKE_armature.hh" #include "BKE_context.hh" +#include "BKE_gpencil_geom_legacy.h" #include "BKE_layer.hh" #include "BKE_object.hh" +#include "BKE_object_types.hh" #include "BKE_paint.hh" +#include "BKE_scene.h" +#include "BKE_screen.hh" #include "BKE_vfont.hh" #include "DEG_depsgraph_query.hh" +#include "ED_mesh.hh" +#include "ED_particle.hh" #include "ED_screen.hh" #include "ED_transform.hh" #include "WM_api.hh" +#include "WM_message.hh" #include "RNA_access.hh" #include "RNA_define.hh" +#include "UI_resources.hh" + #include "view3d_intern.h" #include "view3d_navigate.hh" /* own include */ @@ -206,11 +222,8 @@ static eViewOpsFlag navigate_pivot_get(bContext *C, float fallback_depth_pt[3]; negate_v3_v3(fallback_depth_pt, static_cast(region->regiondata)->ofs); - if (!ED_view3d_has_depth_buffer_updated(depsgraph, v3d)) { - ED_view3d_depth_override(depsgraph, region, v3d, nullptr, V3D_DEPTH_NO_GPENCIL, nullptr); - } - - const bool is_set = ED_view3d_autodist(region, v3d, event->mval, r_pivot, fallback_depth_pt); + const bool is_set = ED_view3d_autodist( + depsgraph, region, v3d, event->mval, r_pivot, true, fallback_depth_pt); ED_view3d_autodist_last_set(win, event, r_pivot, is_set); } @@ -807,7 +820,7 @@ bool view3d_orbit_calc_center(bContext *C, float r_dyn_ofs[3]) } mul_v2_fl(lastofs, 1.0f / 4.0f); - mul_m4_v3(ob_act_eval->object_to_world().ptr(), lastofs); + mul_m4_v3(ob_act_eval->object_to_world, lastofs); is_set = true; } @@ -825,11 +838,11 @@ bool view3d_orbit_calc_center(bContext *C, float r_dyn_ofs[3]) if (ob_eval->runtime->bounds_eval) { blender::float3 cent = blender::math::midpoint(ob_eval->runtime->bounds_eval->min, ob_eval->runtime->bounds_eval->max); - mul_m4_v3(ob_eval->object_to_world().ptr(), cent); + mul_m4_v3(ob_eval->object_to_world, cent); add_v3_v3(select_center, cent); } else { - add_v3_v3(select_center, ob_eval->object_to_world().location()); + add_v3_v3(select_center, ob_eval->object_to_world[3]); } tot++; } diff --git a/source/blender/editors/space_view3d/view3d_navigate_fly.cc b/source/blender/editors/space_view3d/view3d_navigate_fly.cc index 2c8785f2084..31679d44d43 100644 --- a/source/blender/editors/space_view3d/view3d_navigate_fly.cc +++ b/source/blender/editors/space_view3d/view3d_navigate_fly.cc @@ -29,7 +29,9 @@ #include "BKE_context.hh" #include "BKE_lib_id.hh" -#include "BKE_report.hh" +#include "BKE_report.h" + +#include "BLT_translation.h" #include "WM_api.hh" #include "WM_types.hh" @@ -37,14 +39,17 @@ #include "ED_screen.hh" #include "ED_space_api.hh" +#include "UI_interface.hh" #include "UI_resources.hh" #include "GPU_immediate.h" +#include "DEG_depsgraph.hh" + #include "view3d_intern.h" /* own include */ #include "view3d_navigate.hh" -#include "BLI_strict_flags.h" /* Keep last. */ +#include "BLI_strict_flags.h" /* -------------------------------------------------------------------- */ /** \name Modal Key-map @@ -366,7 +371,7 @@ static bool initFlyInfo(bContext *C, FlyInfo *fly, wmOperator *op, const wmEvent fly->ndof = nullptr; #endif - fly->time_lastdraw = fly->time_lastwheel = BLI_time_now_seconds(); + fly->time_lastdraw = fly->time_lastwheel = BLI_check_seconds_timer(); fly->draw_handle_pixel = ED_region_draw_cb_activate( fly->region->type, drawFlyPixel, fly, REGION_DRAW_POST_PIXEL); @@ -513,7 +518,7 @@ static void flyEvent(FlyInfo *fly, const wmEvent *event) fly->ndof = nullptr; } /* Update the time else the view will jump when 2D mouse/timer resume. */ - fly->time_lastdraw = BLI_time_now_seconds(); + fly->time_lastdraw = BLI_check_seconds_timer(); break; } default: { @@ -561,7 +566,7 @@ static void flyEvent(FlyInfo *fly, const wmEvent *event) fly->speed = fabsf(fly->speed); } - time_currwheel = BLI_time_now_seconds(); + time_currwheel = BLI_check_seconds_timer(); time_wheel = float(time_currwheel - fly->time_lastwheel); fly->time_lastwheel = time_currwheel; /* Mouse wheel delays range from (0.5 == slow) to (0.01 == fast). */ @@ -586,7 +591,7 @@ static void flyEvent(FlyInfo *fly, const wmEvent *event) fly->speed = -fabsf(fly->speed); } - time_currwheel = BLI_time_now_seconds(); + time_currwheel = BLI_check_seconds_timer(); time_wheel = float(time_currwheel - fly->time_lastwheel); fly->time_lastwheel = time_currwheel; /* 0-0.5 -> 0-5.0 */ @@ -843,7 +848,7 @@ static int flyApply(bContext *C, FlyInfo *fly, bool is_confirm) #ifdef NDOF_FLY_DRAW_TOOMUCH fly->redraw = 1; #endif - time_current = BLI_time_now_seconds(); + time_current = BLI_check_seconds_timer(); time_redraw = float(time_current - fly->time_lastdraw); /* Clamp redraw time to avoid jitter in roll correction. */ @@ -1017,7 +1022,7 @@ static int flyApply(bContext *C, FlyInfo *fly, bool is_confirm) } else { /* We're not redrawing but we need to update the time else the view will jump. */ - fly->time_lastdraw = BLI_time_now_seconds(); + fly->time_lastdraw = BLI_check_seconds_timer(); } /* End drawing. */ copy_v3_v3(fly->dvec_prev, dvec); diff --git a/source/blender/editors/space_view3d/view3d_navigate_smoothview.cc b/source/blender/editors/space_view3d/view3d_navigate_smoothview.cc index f488ca5b502..94ecacb1709 100644 --- a/source/blender/editors/space_view3d/view3d_navigate_smoothview.cc +++ b/source/blender/editors/space_view3d/view3d_navigate_smoothview.cc @@ -262,7 +262,7 @@ void ED_view3d_smooth_view_ex( Object *ob_camera_eval = DEG_get_evaluated_object(depsgraph, sview->camera); if (sview->ofs != nullptr) { sms.dst.dist = ED_view3d_offset_distance( - ob_camera_eval->object_to_world().ptr(), sview->ofs, VIEW3D_DIST_FALLBACK); + ob_camera_eval->object_to_world, sview->ofs, VIEW3D_DIST_FALLBACK); } ED_view3d_from_object(ob_camera_eval, sms.dst.ofs, sms.dst.quat, &sms.dst.dist, &sms.dst.lens); sms.to_camera = true; /* restore view3d values in end */ @@ -287,7 +287,7 @@ void ED_view3d_smooth_view_ex( Object *ob_camera_old_eval = DEG_get_evaluated_object(depsgraph, sview->camera_old); if (sview->ofs != nullptr) { sms.src.dist = ED_view3d_offset_distance( - ob_camera_old_eval->object_to_world().ptr(), sview->ofs, 0.0f); + ob_camera_old_eval->object_to_world, sview->ofs, 0.0f); } ED_view3d_from_object( ob_camera_old_eval, sms.src.ofs, sms.src.quat, &sms.src.dist, &sms.src.lens); diff --git a/source/blender/editors/space_view3d/view3d_navigate_view_all.cc b/source/blender/editors/space_view3d/view3d_navigate_view_all.cc index 4f58524cd2b..e357332d4d3 100644 --- a/source/blender/editors/space_view3d/view3d_navigate_view_all.cc +++ b/source/blender/editors/space_view3d/view3d_navigate_view_all.cc @@ -10,18 +10,21 @@ #include "BKE_armature.hh" #include "BKE_context.hh" +#include "BKE_crazyspace.hh" #include "BKE_gpencil_geom_legacy.h" #include "BKE_layer.hh" #include "BKE_object.hh" #include "BKE_paint.hh" -#include "BKE_scene.hh" +#include "BKE_scene.h" +#include "BLI_bounds.hh" #include "BLI_bounds_types.hh" #include "BLI_math_matrix.h" #include "BLI_math_vector.h" #include "DEG_depsgraph_query.hh" +#include "ED_curves.hh" #include "ED_mesh.hh" #include "ED_particle.hh" #include "ED_screen.hh" @@ -74,7 +77,7 @@ static void view3d_object_calc_minmax(Depsgraph *depsgraph, if (BKE_object_minmax_dupli(depsgraph, scene, ob_eval, min, max, false) == 0) { /* Use if duplis aren't found. */ if (only_center) { - minmax_v3v3_v3(min, max, ob_eval->object_to_world().location()); + minmax_v3v3_v3(min, max, ob_eval->object_to_world[3]); } else { BKE_object_minmax(ob_eval, min, max); @@ -238,7 +241,7 @@ static int view3d_all_exec(bContext *C, wmOperator *op) wmMsgBus *mbus = CTX_wm_message_bus(C); WM_msg_publish_rna_prop(mbus, &scene->id, &scene->cursor, View3DCursor, location); - DEG_id_tag_update(&scene->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&scene->id, ID_RECALC_COPY_ON_WRITE); } if (!changed) { @@ -379,8 +382,8 @@ static int viewselected_exec(bContext *C, wmOperator *op) CTX_DATA_END; if ((ob_eval) && (ok)) { - mul_m4_v3(ob_eval->object_to_world().ptr(), min); - mul_m4_v3(ob_eval->object_to_world().ptr(), max); + mul_m4_v3(ob_eval->object_to_world, min); + mul_m4_v3(ob_eval->object_to_world, max); } } else if (is_face_map) { diff --git a/source/blender/editors/space_view3d/view3d_navigate_view_axis.cc b/source/blender/editors/space_view3d/view3d_navigate_view_axis.cc index 1240bf8d25a..db9b8d94bb4 100644 --- a/source/blender/editors/space_view3d/view3d_navigate_view_axis.cc +++ b/source/blender/editors/space_view3d/view3d_navigate_view_axis.cc @@ -6,17 +6,36 @@ * \ingroup spview3d */ +#include "DNA_curve_types.h" +#include "DNA_gpencil_legacy_types.h" + #include "MEM_guardedalloc.h" #include "BLI_math_rotation.h" +#include "BLI_math_vector.h" +#include "BLI_rect.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" +#include "BKE_armature.hh" #include "BKE_context.hh" +#include "BKE_gpencil_geom_legacy.h" +#include "BKE_layer.hh" +#include "BKE_object.hh" +#include "BKE_paint.hh" +#include "BKE_scene.h" +#include "BKE_screen.hh" +#include "BKE_vfont.hh" +#include "DEG_depsgraph_query.hh" + +#include "ED_mesh.hh" +#include "ED_particle.hh" +#include "ED_screen.hh" #include "ED_transform.hh" #include "WM_api.hh" +#include "WM_message.hh" #include "RNA_access.hh" #include "RNA_define.hh" diff --git a/source/blender/editors/space_view3d/view3d_navigate_view_camera.cc b/source/blender/editors/space_view3d/view3d_navigate_view_camera.cc index e83b4764dfe..aeb03ce0a0a 100644 --- a/source/blender/editors/space_view3d/view3d_navigate_view_camera.cc +++ b/source/blender/editors/space_view3d/view3d_navigate_view_camera.cc @@ -6,14 +6,39 @@ * \ingroup spview3d */ +#include "DNA_curve_types.h" +#include "DNA_gpencil_legacy_types.h" + #include "MEM_guardedalloc.h" +#include "BLI_rect.h" + +#include "BLT_translation.h" + +#include "BKE_armature.hh" #include "BKE_context.hh" +#include "BKE_gpencil_geom_legacy.h" #include "BKE_layer.hh" +#include "BKE_object.hh" +#include "BKE_paint.hh" +#include "BKE_scene.h" +#include "BKE_screen.hh" +#include "BKE_vfont.hh" #include "DEG_depsgraph_query.hh" +#include "ED_mesh.hh" +#include "ED_particle.hh" +#include "ED_screen.hh" +#include "ED_transform.hh" + #include "WM_api.hh" +#include "WM_message.hh" + +#include "RNA_access.hh" +#include "RNA_define.hh" + +#include "UI_resources.hh" #include "view3d_intern.h" @@ -80,7 +105,7 @@ static int view_camera_exec(bContext *C, wmOperator *op) /* important these don't get out of sync for locked scenes */ if (v3d->scenelock && scene->camera != v3d->camera) { scene->camera = v3d->camera; - DEG_id_tag_update(&scene->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&scene->id, ID_RECALC_COPY_ON_WRITE); } /* finally do snazzy view zooming */ diff --git a/source/blender/editors/space_view3d/view3d_navigate_view_center_cursor.cc b/source/blender/editors/space_view3d/view3d_navigate_view_center_cursor.cc index 9c01c6fab97..67ceec73250 100644 --- a/source/blender/editors/space_view3d/view3d_navigate_view_center_cursor.cc +++ b/source/blender/editors/space_view3d/view3d_navigate_view_center_cursor.cc @@ -6,13 +6,40 @@ * \ingroup spview3d */ +#include "DNA_curve_types.h" +#include "DNA_gpencil_legacy_types.h" + #include "MEM_guardedalloc.h" #include "BLI_math_vector.h" +#include "BLI_rect.h" +#include "BLT_translation.h" + +#include "BKE_armature.hh" #include "BKE_context.hh" +#include "BKE_gpencil_geom_legacy.h" +#include "BKE_layer.hh" +#include "BKE_object.hh" +#include "BKE_paint.hh" +#include "BKE_scene.h" +#include "BKE_screen.hh" +#include "BKE_vfont.hh" + +#include "DEG_depsgraph_query.hh" + +#include "ED_mesh.hh" +#include "ED_particle.hh" +#include "ED_screen.hh" +#include "ED_transform.hh" #include "WM_api.hh" +#include "WM_message.hh" + +#include "RNA_access.hh" +#include "RNA_define.hh" + +#include "UI_resources.hh" #include "view3d_intern.h" diff --git a/source/blender/editors/space_view3d/view3d_navigate_view_center_pick.cc b/source/blender/editors/space_view3d/view3d_navigate_view_center_pick.cc index d6b04633fef..1a6bab521b2 100644 --- a/source/blender/editors/space_view3d/view3d_navigate_view_center_pick.cc +++ b/source/blender/editors/space_view3d/view3d_navigate_view_center_pick.cc @@ -6,13 +6,40 @@ * \ingroup spview3d */ +#include "DNA_curve_types.h" +#include "DNA_gpencil_legacy_types.h" + #include "MEM_guardedalloc.h" #include "BLI_math_vector.h" +#include "BLI_rect.h" +#include "BLT_translation.h" + +#include "BKE_armature.hh" #include "BKE_context.hh" +#include "BKE_gpencil_geom_legacy.h" +#include "BKE_layer.hh" +#include "BKE_object.hh" +#include "BKE_paint.hh" +#include "BKE_scene.h" +#include "BKE_screen.hh" +#include "BKE_vfont.hh" + +#include "DEG_depsgraph_query.hh" + +#include "ED_mesh.hh" +#include "ED_particle.hh" +#include "ED_screen.hh" +#include "ED_transform.hh" #include "WM_api.hh" +#include "WM_message.hh" + +#include "RNA_access.hh" +#include "RNA_define.hh" + +#include "UI_resources.hh" #include "view3d_intern.h" @@ -37,10 +64,7 @@ static int viewcenter_pick_invoke(bContext *C, wmOperator *op, const wmEvent *ev view3d_operator_needs_opengl(C); - /* Ensure the depth buffer is updated for #ED_view3d_autodist. */ - ED_view3d_depth_override(depsgraph, region, v3d, nullptr, V3D_DEPTH_NO_GPENCIL, nullptr); - - if (ED_view3d_autodist(region, v3d, event->mval, new_ofs, nullptr)) { + if (ED_view3d_autodist(depsgraph, region, v3d, event->mval, new_ofs, false, nullptr)) { /* pass */ } else { diff --git a/source/blender/editors/space_view3d/view3d_navigate_view_dolly.cc b/source/blender/editors/space_view3d/view3d_navigate_view_dolly.cc index 59c56b0c982..4c8e68cd263 100644 --- a/source/blender/editors/space_view3d/view3d_navigate_view_dolly.cc +++ b/source/blender/editors/space_view3d/view3d_navigate_view_dolly.cc @@ -7,10 +7,12 @@ */ #include "BKE_context.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "BLI_math_vector.h" +#include "DEG_depsgraph.hh" + #include "WM_api.hh" #include "RNA_access.hh" diff --git a/source/blender/editors/space_view3d/view3d_navigate_view_move.cc b/source/blender/editors/space_view3d/view3d_navigate_view_move.cc index e69e4030315..76d64f7b761 100644 --- a/source/blender/editors/space_view3d/view3d_navigate_view_move.cc +++ b/source/blender/editors/space_view3d/view3d_navigate_view_move.cc @@ -6,10 +6,15 @@ * \ingroup spview3d */ +#include "BLI_math_vector.h" + #include "BKE_context.hh" #include "WM_api.hh" +#include "RNA_access.hh" +#include "RNA_define.hh" + #include "ED_screen.hh" #include "view3d_intern.h" diff --git a/source/blender/editors/space_view3d/view3d_navigate_view_ndof.cc b/source/blender/editors/space_view3d/view3d_navigate_view_ndof.cc index 4bdebe782d3..109ac85dd9f 100644 --- a/source/blender/editors/space_view3d/view3d_navigate_view_ndof.cc +++ b/source/blender/editors/space_view3d/view3d_navigate_view_ndof.cc @@ -6,9 +6,13 @@ * \ingroup spview3d */ +#include "BKE_context.hh" + #include "BLI_math_rotation.h" #include "BLI_math_vector.h" +#include "DEG_depsgraph.hh" + #include "WM_api.hh" #include "ED_screen.hh" diff --git a/source/blender/editors/space_view3d/view3d_navigate_view_orbit.cc b/source/blender/editors/space_view3d/view3d_navigate_view_orbit.cc index ef8a4ced0be..51aec20d595 100644 --- a/source/blender/editors/space_view3d/view3d_navigate_view_orbit.cc +++ b/source/blender/editors/space_view3d/view3d_navigate_view_orbit.cc @@ -6,15 +6,42 @@ * \ingroup spview3d */ +#include "DNA_curve_types.h" +#include "DNA_gpencil_legacy_types.h" + #include "MEM_guardedalloc.h" #include "BLI_math_rotation.h" +#include "BLI_math_vector.h" +#include "BLI_rect.h" + +#include "BLT_translation.h" + +#include "BKE_armature.hh" +#include "BKE_context.hh" +#include "BKE_gpencil_geom_legacy.h" +#include "BKE_layer.hh" +#include "BKE_object.hh" +#include "BKE_paint.hh" +#include "BKE_scene.h" +#include "BKE_screen.hh" +#include "BKE_vfont.hh" + +#include "DEG_depsgraph_query.hh" + +#include "ED_mesh.hh" +#include "ED_particle.hh" +#include "ED_screen.hh" +#include "ED_transform.hh" #include "WM_api.hh" +#include "WM_message.hh" #include "RNA_access.hh" #include "RNA_define.hh" +#include "UI_resources.hh" + #include "view3d_intern.h" #include "view3d_navigate.hh" /* own include */ diff --git a/source/blender/editors/space_view3d/view3d_navigate_view_pan.cc b/source/blender/editors/space_view3d/view3d_navigate_view_pan.cc index 45402e83fed..15d218f6e22 100644 --- a/source/blender/editors/space_view3d/view3d_navigate_view_pan.cc +++ b/source/blender/editors/space_view3d/view3d_navigate_view_pan.cc @@ -6,13 +6,40 @@ * \ingroup spview3d */ +#include "DNA_curve_types.h" +#include "DNA_gpencil_legacy_types.h" + #include "MEM_guardedalloc.h" +#include "BLI_rect.h" + +#include "BLT_translation.h" + +#include "BKE_armature.hh" +#include "BKE_context.hh" +#include "BKE_gpencil_geom_legacy.h" +#include "BKE_layer.hh" +#include "BKE_object.hh" +#include "BKE_paint.hh" +#include "BKE_scene.h" +#include "BKE_screen.hh" +#include "BKE_vfont.hh" + +#include "DEG_depsgraph_query.hh" + +#include "ED_mesh.hh" +#include "ED_particle.hh" +#include "ED_screen.hh" +#include "ED_transform.hh" + #include "WM_api.hh" +#include "WM_message.hh" #include "RNA_access.hh" #include "RNA_define.hh" +#include "UI_resources.hh" + #include "view3d_intern.h" #include "view3d_navigate.hh" /* own include */ diff --git a/source/blender/editors/space_view3d/view3d_navigate_view_roll.cc b/source/blender/editors/space_view3d/view3d_navigate_view_roll.cc index 16c975415bd..a886926b08d 100644 --- a/source/blender/editors/space_view3d/view3d_navigate_view_roll.cc +++ b/source/blender/editors/space_view3d/view3d_navigate_view_roll.cc @@ -18,6 +18,8 @@ #include "RNA_access.hh" #include "RNA_define.hh" +#include "DEG_depsgraph_query.hh" + #include "ED_screen.hh" #include "view3d_intern.h" diff --git a/source/blender/editors/space_view3d/view3d_navigate_view_rotate.cc b/source/blender/editors/space_view3d/view3d_navigate_view_rotate.cc index 14b23b94291..b85c4d20325 100644 --- a/source/blender/editors/space_view3d/view3d_navigate_view_rotate.cc +++ b/source/blender/editors/space_view3d/view3d_navigate_view_rotate.cc @@ -14,6 +14,8 @@ #include "WM_api.hh" +#include "RNA_access.hh" + #include "ED_screen.hh" #include "view3d_intern.h" diff --git a/source/blender/editors/space_view3d/view3d_navigate_view_zoom.cc b/source/blender/editors/space_view3d/view3d_navigate_view_zoom.cc index 6e49d9486c5..ff4feb5da89 100644 --- a/source/blender/editors/space_view3d/view3d_navigate_view_zoom.cc +++ b/source/blender/editors/space_view3d/view3d_navigate_view_zoom.cc @@ -13,6 +13,8 @@ #include "BKE_context.hh" #include "BKE_screen.hh" +#include "DEG_depsgraph_query.hh" + #include "WM_api.hh" #include "RNA_access.hh" @@ -160,7 +162,7 @@ static float viewzoom_scale_value(const rcti *winrct, float zfac; if (viewzoom == USER_ZOOM_CONTINUE) { - double time = BLI_time_now_seconds(); + double time = BLI_check_seconds_timer(); float time_step = float(time - *r_timer_lastdraw); float fac; @@ -513,7 +515,7 @@ static int viewzoom_invoke_impl(bContext *C, if (U.viewzoom == USER_ZOOM_CONTINUE) { /* needs a timer to continue redrawing */ vod->timer = WM_event_timer_add(CTX_wm_manager(C), CTX_wm_window(C), TIMER, 0.01f); - vod->prev.time = BLI_time_now_seconds(); + vod->prev.time = BLI_check_seconds_timer(); } return OPERATOR_RUNNING_MODAL; diff --git a/source/blender/editors/space_view3d/view3d_navigate_walk.cc b/source/blender/editors/space_view3d/view3d_navigate_walk.cc index e71b8afb952..ddcd34623da 100644 --- a/source/blender/editors/space_view3d/view3d_navigate_walk.cc +++ b/source/blender/editors/space_view3d/view3d_navigate_walk.cc @@ -27,7 +27,10 @@ #include "BKE_context.hh" #include "BKE_lib_id.hh" -#include "BKE_report.hh" +#include "BKE_main.hh" +#include "BKE_report.h" + +#include "BLT_translation.h" #include "WM_api.hh" #include "WM_types.hh" @@ -36,14 +39,17 @@ #include "ED_space_api.hh" #include "ED_transform_snap_object_context.hh" +#include "UI_interface.hh" #include "UI_resources.hh" #include "GPU_immediate.h" +#include "DEG_depsgraph.hh" + #include "view3d_intern.h" /* own include */ #include "view3d_navigate.hh" -#include "BLI_strict_flags.h" /* Keep last. */ +#include "BLI_strict_flags.h" #ifdef WITH_INPUT_NDOF // # define NDOF_WALK_DEBUG @@ -617,7 +623,7 @@ static bool initWalkInfo(bContext *C, WalkInfo *walk, wmOperator *op, const int walk->need_rotation_keyframe = false; walk->need_translation_keyframe = false; - walk->time_lastdraw = BLI_time_now_seconds(); + walk->time_lastdraw = BLI_check_seconds_timer(); walk->draw_handle_pixel = ED_region_draw_cb_activate( walk->region->type, drawWalkPixel, walk, REGION_DRAW_POST_PIXEL); @@ -758,7 +764,7 @@ static void walkEvent(WalkInfo *walk, const wmEvent *event) } /* Update the time else the view will jump when 2D mouse/timer resume. */ - walk->time_lastdraw = BLI_time_now_seconds(); + walk->time_lastdraw = BLI_check_seconds_timer(); break; } @@ -879,7 +885,7 @@ static void walkEvent(WalkInfo *walk, const wmEvent *event) float t; /* Delta time. */ - t = float(BLI_time_now_seconds() - walk->teleport.initial_time); + t = float(BLI_check_seconds_timer() - walk->teleport.initial_time); /* Reduce the velocity, if JUMP wasn't hold for long enough. */ t = min_ff(t, JUMP_TIME_MAX); @@ -904,7 +910,7 @@ static void walkEvent(WalkInfo *walk, const wmEvent *event) walk->gravity_state = WALK_GRAVITY_STATE_JUMP; walk->speed_jump = JUMP_SPEED_MAX; - walk->teleport.initial_time = BLI_time_now_seconds(); + walk->teleport.initial_time = BLI_check_seconds_timer(); copy_v3_v3(walk->teleport.origin, walk->rv3d->viewinv[3]); /* Using previous vector because WASD keys are not called when SPACE is. */ @@ -932,7 +938,7 @@ static void walkEvent(WalkInfo *walk, const wmEvent *event) teleport->navigation_mode = walk->navigation_mode; } teleport->state = WALK_TELEPORT_STATE_ON; - teleport->initial_time = BLI_time_now_seconds(); + teleport->initial_time = BLI_check_seconds_timer(); teleport->duration = U.walk_navigation.teleport_time; walk_navigation_mode_set(walk, WALK_MODE_FREE); @@ -1081,7 +1087,7 @@ static int walkApply(bContext *C, WalkInfo *walk, bool is_confirm) #ifdef NDOF_WALK_DRAW_TOOMUCH walk->redraw = true; #endif - time_current = BLI_time_now_seconds(); + time_current = BLI_check_seconds_timer(); time_redraw = float(time_current - walk->time_lastdraw); /* Clamp redraw time to avoid jitter in roll correction. */ @@ -1324,7 +1330,7 @@ static int walkApply(bContext *C, WalkInfo *walk, bool is_confirm) } else { /* Hijack the teleport variables. */ - walk->teleport.initial_time = BLI_time_now_seconds(); + walk->teleport.initial_time = BLI_check_seconds_timer(); walk->gravity_state = WALK_GRAVITY_STATE_ON; walk->teleport.duration = 0.0f; @@ -1337,7 +1343,7 @@ static int walkApply(bContext *C, WalkInfo *walk, bool is_confirm) if (ELEM(walk->gravity_state, WALK_GRAVITY_STATE_ON, WALK_GRAVITY_STATE_JUMP)) { float ray_distance, difference = -100.0f; /* Delta time. */ - const float t = float(BLI_time_now_seconds() - walk->teleport.initial_time); + const float t = float(BLI_check_seconds_timer() - walk->teleport.initial_time); /* Keep moving if we were moving. */ copy_v2_v2(dvec, walk->teleport.direction); @@ -1380,7 +1386,7 @@ static int walkApply(bContext *C, WalkInfo *walk, bool is_confirm) float cur_loc[3]; /* Linear interpolation. */ - t = float(BLI_time_now_seconds() - walk->teleport.initial_time); + t = float(BLI_check_seconds_timer() - walk->teleport.initial_time); t /= walk->teleport.duration; /* Clamp so we don't go past our limit. */ @@ -1411,7 +1417,7 @@ static int walkApply(bContext *C, WalkInfo *walk, bool is_confirm) } else { /* We're not redrawing but we need to update the time else the view will jump. */ - walk->time_lastdraw = BLI_time_now_seconds(); + walk->time_lastdraw = BLI_check_seconds_timer(); } /* End drawing. */ copy_v3_v3(walk->dvec_prev, dvec); diff --git a/source/blender/editors/space_view3d/view3d_navigate_zoom_border.cc b/source/blender/editors/space_view3d/view3d_navigate_zoom_border.cc index 8e10312349c..7c97db0e627 100644 --- a/source/blender/editors/space_view3d/view3d_navigate_zoom_border.cc +++ b/source/blender/editors/space_view3d/view3d_navigate_zoom_border.cc @@ -14,7 +14,9 @@ #include "BLI_rect.h" #include "BKE_context.hh" -#include "BKE_report.hh" +#include "BKE_report.h" + +#include "DEG_depsgraph_query.hh" #include "WM_api.hh" diff --git a/source/blender/editors/space_view3d/view3d_ops.cc b/source/blender/editors/space_view3d/view3d_ops.cc index 189d5ba5f22..1bc6e5c0aee 100644 --- a/source/blender/editors/space_view3d/view3d_ops.cc +++ b/source/blender/editors/space_view3d/view3d_ops.cc @@ -20,7 +20,8 @@ #include "BKE_appdir.hh" #include "BKE_blender_copybuffer.hh" #include "BKE_context.hh" -#include "BKE_report.hh" +#include "BKE_main.hh" +#include "BKE_report.h" #include "RNA_access.hh" #include "RNA_define.hh" @@ -174,8 +175,8 @@ void view3d_operatortypes() WM_operatortype_append(VIEW3D_OT_view_roll); WM_operatortype_append(VIEW3D_OT_view_pan); WM_operatortype_append(VIEW3D_OT_view_persportho); - WM_operatortype_append(VIEW3D_OT_camera_background_image_add); - WM_operatortype_append(VIEW3D_OT_camera_background_image_remove); + WM_operatortype_append(VIEW3D_OT_background_image_add); + WM_operatortype_append(VIEW3D_OT_background_image_remove); WM_operatortype_append(VIEW3D_OT_drop_world); WM_operatortype_append(VIEW3D_OT_view_selected); WM_operatortype_append(VIEW3D_OT_view_lock_clear); diff --git a/source/blender/editors/space_view3d/view3d_placement.cc b/source/blender/editors/space_view3d/view3d_placement.cc index df725272984..fe3ff7b6e30 100644 --- a/source/blender/editors/space_view3d/view3d_placement.cc +++ b/source/blender/editors/space_view3d/view3d_placement.cc @@ -20,6 +20,7 @@ #include "RNA_access.hh" #include "RNA_define.hh" +#include "RNA_enum_types.hh" #include "WM_api.hh" #include "WM_toolsystem.hh" diff --git a/source/blender/editors/space_view3d/view3d_project.cc b/source/blender/editors/space_view3d/view3d_project.cc index d0d29f0e7e8..0f374a29781 100644 --- a/source/blender/editors/space_view3d/view3d_project.cc +++ b/source/blender/editors/space_view3d/view3d_project.cc @@ -18,6 +18,7 @@ #include "BLI_math_matrix.h" #include "BLI_math_rotation.h" #include "BLI_math_vector.h" +#include "BLI_math_vector.hh" #include "BKE_camera.h" #include "BKE_screen.hh" @@ -83,7 +84,7 @@ void ED_view3d_project_float_v3_m4(const ARegion *region, eV3DProjStatus ED_view3d_project_base(const ARegion *region, Base *base, float r_co[2]) { eV3DProjStatus ret = ED_view3d_project_float_global( - region, base->object->object_to_world().location(), r_co, V3D_PROJ_TEST_CLIP_DEFAULT); + region, base->object->object_to_world[3], r_co, V3D_PROJ_TEST_CLIP_DEFAULT); /* Prevent uninitialized values when projection fails, * although the callers should check the return value. */ @@ -492,14 +493,17 @@ void ED_view3d_win_to_3d(const View3D *v3d, float lambda; if (rv3d->is_persp) { + float plane[4]; + copy_v3_v3(ray_origin, rv3d->viewinv[3]); ED_view3d_win_to_vector(region, mval, ray_direction); /* NOTE: we could use #isect_line_plane_v3() * however we want the intersection to be in front of the view no matter what, * so apply the unsigned factor instead. */ - isect_ray_plane_v3_factor(ray_origin, ray_direction, depth_pt, rv3d->viewinv[2], &lambda); + plane_from_point_normal_v3(plane, depth_pt, rv3d->viewinv[2]); + isect_ray_plane_v3(ray_origin, ray_direction, plane, &lambda, false); lambda = fabsf(lambda); } else { @@ -701,15 +705,19 @@ blender::float4x4 ED_view3d_ob_project_mat_get(const RegionView3D *rv3d, const O float vmat[4][4]; blender::float4x4 r_pmat; - mul_m4_m4m4(vmat, rv3d->viewmat, ob->object_to_world().ptr()); + mul_m4_m4m4(vmat, rv3d->viewmat, ob->object_to_world); mul_m4_m4m4(r_pmat.ptr(), rv3d->winmat, vmat); return r_pmat; } -blender::float4x4 ED_view3d_ob_project_mat_get_from_obmat(const RegionView3D *rv3d, - const blender::float4x4 &obmat) +void ED_view3d_ob_project_mat_get_from_obmat(const RegionView3D *rv3d, + const float obmat[4][4], + float r_pmat[4][4]) { - return blender::float4x4_view(rv3d->winmat) * blender::float4x4_view(rv3d->viewmat) * obmat; + float vmat[4][4]; + + mul_m4_m4m4(vmat, rv3d->viewmat, obmat); + mul_m4_m4m4(r_pmat, rv3d->winmat, vmat); } void ED_view3d_project_v3(const ARegion *region, const float world[3], float r_region_co[3]) diff --git a/source/blender/editors/space_view3d/view3d_select.cc b/source/blender/editors/space_view3d/view3d_select.cc index 304f089d15e..2ab147bb96e 100644 --- a/source/blender/editors/space_view3d/view3d_select.cc +++ b/source/blender/editors/space_view3d/view3d_select.cc @@ -25,7 +25,7 @@ #include "MEM_guardedalloc.h" #include "BLI_bitmap.h" -#include "BLI_lasso_2d.hh" +#include "BLI_lasso_2d.h" #include "BLI_linklist.h" #include "BLI_listbase.h" #include "BLI_math_bits.h" @@ -42,7 +42,7 @@ #endif /* vertex box select */ -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_main.hh" #include "IMB_imbuf.hh" #include "IMB_imbuf_types.hh" @@ -61,7 +61,7 @@ #include "BKE_object.hh" #include "BKE_object_types.hh" #include "BKE_paint.hh" -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "BKE_tracking.h" #include "BKE_workspace.h" @@ -106,9 +106,6 @@ // #include "BLI_time_utildefines.h" -using blender::Array; -using blender::int2; -using blender::Span; using blender::Vector; /* -------------------------------------------------------------------- */ @@ -205,7 +202,7 @@ struct EditSelectBuf_Cache { BLI_bitmap *select_bitmap; }; -static void editselect_buf_cache_init(const ViewContext *vc, short select_mode) +static void editselect_buf_cache_init(ViewContext *vc, short select_mode) { if (vc->obedit) { Vector bases = BKE_view_layer_array_from_bases_in_edit_mode( @@ -235,7 +232,7 @@ static void editselect_buf_cache_free_voidp(void *esel_voidp) } static void editselect_buf_cache_init_with_generic_userdata(wmGenericUserData *wm_userdata, - const ViewContext *vc, + ViewContext *vc, short select_mode) { EditSelectBuf_Cache *esel = MEM_cnew(__func__); @@ -416,11 +413,12 @@ static bool edbm_backbuf_check_and_select_faces_obmode(Mesh *mesh, * \{ */ struct LassoSelectUserData { - const ViewContext *vc; + ViewContext *vc; const rcti *rect; const rctf *rect_fl; rctf _rect_fl; - Span mcoords; + const int (*mcoords)[2]; + int mcoords_len; eSelectOp sel_op; eBezTriple_Flag select_flag; @@ -431,9 +429,10 @@ struct LassoSelectUserData { }; static void view3d_userdata_lassoselect_init(LassoSelectUserData *r_data, - const ViewContext *vc, + ViewContext *vc, const rcti *rect, - const Span mcoords, + const int (*mcoords)[2], + const int mcoords_len, const eSelectOp sel_op) { r_data->vc = vc; @@ -443,6 +442,7 @@ static void view3d_userdata_lassoselect_init(LassoSelectUserData *r_data, BLI_rctf_rcti_copy(&r_data->_rect_fl, rect); r_data->mcoords = mcoords; + r_data->mcoords_len = mcoords_len; r_data->sel_op = sel_op; /* SELECT by default, but can be changed if needed (only few cases use and respect this). */ r_data->select_flag = (eBezTriple_Flag)SELECT; @@ -541,13 +541,14 @@ static void do_lasso_select_pose__do_tag(void *user_data, } if (BLI_rctf_isect_segment(data->rect_fl, screen_co_a, screen_co_b) && - BLI_lasso_is_edge_inside(data->mcoords, UNPACK2(screen_co_a), UNPACK2(screen_co_b), INT_MAX)) + BLI_lasso_is_edge_inside( + data->mcoords, data->mcoords_len, UNPACK2(screen_co_a), UNPACK2(screen_co_b), INT_MAX)) { pchan->bone->flag |= BONE_DONE; data->is_changed = true; } } -static void do_lasso_tag_pose(const ViewContext *vc, const Span mcoords) +static void do_lasso_tag_pose(ViewContext *vc, const int mcoords[][2], const int mcoords_len) { LassoSelectUserData data; rcti rect; @@ -556,9 +557,10 @@ static void do_lasso_tag_pose(const ViewContext *vc, const Span mcoords) return; } - BLI_lasso_boundbox(&rect, mcoords); + BLI_lasso_boundbox(&rect, mcoords, mcoords_len); - view3d_userdata_lassoselect_init(&data, vc, &rect, mcoords, static_cast(0)); + view3d_userdata_lassoselect_init( + &data, vc, &rect, mcoords, mcoords_len, static_cast(0)); ED_view3d_init_mats_rv3d(vc->obact, vc->rv3d); @@ -569,8 +571,9 @@ static void do_lasso_tag_pose(const ViewContext *vc, const Span mcoords) V3D_PROJ_TEST_CLIP_DEFAULT | V3D_PROJ_TEST_CLIP_CONTENT_DEFAULT); } -static bool do_lasso_select_objects(const ViewContext *vc, - const Span mcoords, +static bool do_lasso_select_objects(ViewContext *vc, + const int mcoords[][2], + const int mcoords_len, const eSelectOp sel_op) { View3D *v3d = vc->v3d; @@ -587,6 +590,7 @@ static bool do_lasso_select_objects(const ViewContext *vc, const bool is_inside = (ED_view3d_project_base(vc->region, base, region_co) == V3D_PROJ_RET_OK) && BLI_lasso_is_point_inside(mcoords, + mcoords_len, int(region_co[0]), int(region_co[1]), /* Dummy value. */ @@ -609,7 +613,7 @@ static bool do_lasso_select_objects(const ViewContext *vc, /** * Use for lasso & box select. */ -static blender::Vector do_pose_tag_select_op_prepare(const ViewContext *vc) +static blender::Vector do_pose_tag_select_op_prepare(ViewContext *vc) { auto bases_tag_and_append_fn = [](blender::Vector &bases, Base *base) { Object *ob = base->object; @@ -699,8 +703,9 @@ static bool do_pose_tag_select_op_exec(blender::MutableSpan bases, const return changed_multi; } -static bool do_lasso_select_pose(const ViewContext *vc, - const Span mcoords, +static bool do_lasso_select_pose(ViewContext *vc, + const int mcoords[][2], + const int mcoords_len, const eSelectOp sel_op) { blender::Vector bases = do_pose_tag_select_op_prepare(vc); @@ -711,7 +716,7 @@ static bool do_lasso_select_pose(const ViewContext *vc, Base *base_iter = bases[i]; Object *ob_iter = base_iter->object; ED_view3d_viewcontext_init_object(&vc_temp, ob_iter); - do_lasso_tag_pose(&vc_temp, mcoords); + do_lasso_tag_pose(&vc_temp, mcoords, mcoords_len); } const bool changed_multi = do_pose_tag_select_op_exec(bases, sel_op); @@ -730,9 +735,10 @@ static void do_lasso_select_mesh__doSelectVert(void *user_data, { LassoSelectUserData *data = static_cast(user_data); const bool is_select = BM_elem_flag_test(eve, BM_ELEM_SELECT); - const bool is_inside = (BLI_rctf_isect_pt_v(data->rect_fl, screen_co) && - BLI_lasso_is_point_inside( - data->mcoords, screen_co[0], screen_co[1], IS_CLIPPED)); + const bool is_inside = + (BLI_rctf_isect_pt_v(data->rect_fl, screen_co) && + BLI_lasso_is_point_inside( + data->mcoords, data->mcoords_len, screen_co[0], screen_co[1], IS_CLIPPED)); const int sel_op_result = ED_select_op_action_deselected(data->sel_op, is_select, is_inside); if (sel_op_result != -1) { BM_vert_select_set(data->vc->em->bm, eve, sel_op_result); @@ -762,8 +768,10 @@ static void do_lasso_select_mesh__doSelectEdge_pass0(void *user_data, const bool is_select = BM_elem_flag_test(eed, BM_ELEM_SELECT); const bool is_inside = (is_visible && edge_fully_inside_rect(data->rect_fl, screen_co_a, screen_co_b) && - BLI_lasso_is_point_inside(data->mcoords, UNPACK2(screen_co_a), IS_CLIPPED) && - BLI_lasso_is_point_inside(data->mcoords, UNPACK2(screen_co_b), IS_CLIPPED)); + BLI_lasso_is_point_inside( + data->mcoords, data->mcoords_len, UNPACK2(screen_co_a), IS_CLIPPED) && + BLI_lasso_is_point_inside( + data->mcoords, data->mcoords_len, UNPACK2(screen_co_b), IS_CLIPPED)); const int sel_op_result = ED_select_op_action_deselected(data->sel_op, is_select, is_inside); if (sel_op_result != -1) { BM_edge_select_set(data->vc->em->bm, eed, sel_op_result); @@ -788,6 +796,7 @@ static void do_lasso_select_mesh__doSelectEdge_pass1(void *user_data, const bool is_select = BM_elem_flag_test(eed, BM_ELEM_SELECT); const bool is_inside = (is_visible && BLI_lasso_is_edge_inside(data->mcoords, + data->mcoords_len, UNPACK2(screen_co_a), UNPACK2(screen_co_b), IS_CLIPPED)); @@ -805,9 +814,10 @@ static void do_lasso_select_mesh__doSelectFace(void *user_data, { LassoSelectUserData *data = static_cast(user_data); const bool is_select = BM_elem_flag_test(efa, BM_ELEM_SELECT); - const bool is_inside = (BLI_rctf_isect_pt_v(data->rect_fl, screen_co) && - BLI_lasso_is_point_inside( - data->mcoords, screen_co[0], screen_co[1], IS_CLIPPED)); + const bool is_inside = + (BLI_rctf_isect_pt_v(data->rect_fl, screen_co) && + BLI_lasso_is_point_inside( + data->mcoords, data->mcoords_len, screen_co[0], screen_co[1], IS_CLIPPED)); const int sel_op_result = ED_select_op_action_deselected(data->sel_op, is_select, is_inside); if (sel_op_result != -1) { BM_face_select_set(data->vc->em->bm, efa, sel_op_result); @@ -815,20 +825,22 @@ static void do_lasso_select_mesh__doSelectFace(void *user_data, } } -static bool do_lasso_select_mesh(const ViewContext *vc, +static bool do_lasso_select_mesh(ViewContext *vc, wmGenericUserData *wm_userdata, - const Span mcoords, + const int mcoords[][2], + const int mcoords_len, const eSelectOp sel_op) { LassoSelectUserData data; ToolSettings *ts = vc->scene->toolsettings; rcti rect; - BLI_assert(vc->em == BKE_editmesh_from_object(vc->obedit)); + /* set editmesh */ + vc->em = BKE_editmesh_from_object(vc->obedit); - BLI_lasso_boundbox(&rect, mcoords); + BLI_lasso_boundbox(&rect, mcoords, mcoords_len); - view3d_userdata_lassoselect_init(&data, vc, &rect, mcoords, sel_op); + view3d_userdata_lassoselect_init(&data, vc, &rect, mcoords, mcoords_len, sel_op); if (SEL_OP_USE_PRE_DESELECT(sel_op)) { if (vc->em->bm->totvertsel) { @@ -850,7 +862,7 @@ static bool do_lasso_select_mesh(const ViewContext *vc, editselect_buf_cache_init_with_generic_userdata(wm_userdata, vc, ts->selectmode); esel = static_cast(wm_userdata->data); esel->select_bitmap = DRW_select_buffer_bitmap_from_poly( - vc->depsgraph, vc->region, vc->v3d, mcoords, &rect, nullptr); + vc->depsgraph, vc->region, vc->v3d, mcoords, mcoords_len, &rect, nullptr); } } @@ -916,7 +928,7 @@ static void do_lasso_select_curve__doSelect(void *user_data, LassoSelectUserData *data = static_cast(user_data); const bool is_inside = BLI_lasso_is_point_inside( - data->mcoords, screen_co[0], screen_co[1], IS_CLIPPED); + data->mcoords, data->mcoords_len, screen_co[0], screen_co[1], IS_CLIPPED); if (bp) { const bool is_select = bp->f1 & SELECT; const int sel_op_result = ED_select_op_action_deselected(data->sel_op, is_select, is_inside); @@ -948,17 +960,18 @@ static void do_lasso_select_curve__doSelect(void *user_data, } } -static bool do_lasso_select_curve(const ViewContext *vc, - const Span mcoords, +static bool do_lasso_select_curve(ViewContext *vc, + const int mcoords[][2], + const int mcoords_len, const eSelectOp sel_op) { const bool deselect_all = (sel_op == SEL_OP_SET); LassoSelectUserData data; rcti rect; - BLI_lasso_boundbox(&rect, mcoords); + BLI_lasso_boundbox(&rect, mcoords, mcoords_len); - view3d_userdata_lassoselect_init(&data, vc, &rect, mcoords, sel_op); + view3d_userdata_lassoselect_init(&data, vc, &rect, mcoords, mcoords_len, sel_op); Curve *curve = (Curve *)vc->obedit->data; ListBase *nurbs = BKE_curve_editNurbs_get(curve); @@ -989,25 +1002,27 @@ static void do_lasso_select_lattice__doSelect(void *user_data, { LassoSelectUserData *data = static_cast(user_data); const bool is_select = bp->f1 & SELECT; - const bool is_inside = (BLI_rctf_isect_pt_v(data->rect_fl, screen_co) && - BLI_lasso_is_point_inside( - data->mcoords, screen_co[0], screen_co[1], IS_CLIPPED)); + const bool is_inside = + (BLI_rctf_isect_pt_v(data->rect_fl, screen_co) && + BLI_lasso_is_point_inside( + data->mcoords, data->mcoords_len, screen_co[0], screen_co[1], IS_CLIPPED)); const int sel_op_result = ED_select_op_action_deselected(data->sel_op, is_select, is_inside); if (sel_op_result != -1) { SET_FLAG_FROM_TEST(bp->f1, sel_op_result, SELECT); data->is_changed = true; } } -static bool do_lasso_select_lattice(const ViewContext *vc, - const Span mcoords, +static bool do_lasso_select_lattice(ViewContext *vc, + const int mcoords[][2], + const int mcoords_len, const eSelectOp sel_op) { LassoSelectUserData data; rcti rect; - BLI_lasso_boundbox(&rect, mcoords); + BLI_lasso_boundbox(&rect, mcoords, mcoords_len); - view3d_userdata_lassoselect_init(&data, vc, &rect, mcoords, sel_op); + view3d_userdata_lassoselect_init(&data, vc, &rect, mcoords, mcoords_len, sel_op); if (SEL_OP_USE_PRE_DESELECT(sel_op)) { data.is_changed |= ED_lattice_flags_set(vc->obedit, 0); @@ -1035,7 +1050,7 @@ static void do_lasso_select_armature__doSelectBone(void *user_data, if (screen_co_a[0] != IS_CLIPPED) { if (BLI_rcti_isect_pt(data->rect, UNPACK2(screen_co_a)) && - BLI_lasso_is_point_inside(data->mcoords, UNPACK2(screen_co_a), INT_MAX)) + BLI_lasso_is_point_inside(data->mcoords, data->mcoords_len, UNPACK2(screen_co_a), INT_MAX)) { is_inside_flag |= BONESEL_ROOT; } @@ -1046,7 +1061,7 @@ static void do_lasso_select_armature__doSelectBone(void *user_data, if (screen_co_b[0] != IS_CLIPPED) { if (BLI_rcti_isect_pt(data->rect, UNPACK2(screen_co_b)) && - BLI_lasso_is_point_inside(data->mcoords, UNPACK2(screen_co_b), INT_MAX)) + BLI_lasso_is_point_inside(data->mcoords, data->mcoords_len, UNPACK2(screen_co_b), INT_MAX)) { is_inside_flag |= BONESEL_TIP; } @@ -1058,7 +1073,7 @@ static void do_lasso_select_armature__doSelectBone(void *user_data, if (is_ignore_flag == 0) { if (is_inside_flag == (BONE_ROOTSEL | BONE_TIPSEL) || BLI_lasso_is_edge_inside( - data->mcoords, UNPACK2(screen_co_a), UNPACK2(screen_co_b), INT_MAX)) + data->mcoords, data->mcoords_len, UNPACK2(screen_co_a), UNPACK2(screen_co_b), INT_MAX)) { is_inside_flag |= BONESEL_BONE; } @@ -1087,7 +1102,8 @@ static void do_lasso_select_armature__doSelectBone_clip_content(void *user_data, return; } - if (BLI_lasso_is_edge_inside(data->mcoords, UNPACK2(screen_co_a), UNPACK2(screen_co_b), INT_MAX)) + if (BLI_lasso_is_edge_inside( + data->mcoords, data->mcoords_len, UNPACK2(screen_co_a), UNPACK2(screen_co_b), INT_MAX)) { is_inside_flag |= BONESEL_BONE; } @@ -1095,16 +1111,17 @@ static void do_lasso_select_armature__doSelectBone_clip_content(void *user_data, ebone->temp.i = is_inside_flag | (is_ignore_flag >> 16); } -static bool do_lasso_select_armature(const ViewContext *vc, - const Span mcoords, +static bool do_lasso_select_armature(ViewContext *vc, + const int mcoords[][2], + const int mcoords_len, const eSelectOp sel_op) { LassoSelectUserData data; rcti rect; - BLI_lasso_boundbox(&rect, mcoords); + BLI_lasso_boundbox(&rect, mcoords, mcoords_len); - view3d_userdata_lassoselect_init(&data, vc, &rect, mcoords, sel_op); + view3d_userdata_lassoselect_init(&data, vc, &rect, mcoords, mcoords_len, sel_op); if (SEL_OP_USE_PRE_DESELECT(sel_op)) { data.is_changed |= ED_armature_edit_deselect_all_visible(vc->obedit); @@ -1142,17 +1159,19 @@ static void do_lasso_select_mball__doSelectElem(void *user_data, { LassoSelectUserData *data = static_cast(user_data); const bool is_select = ml->flag & SELECT; - const bool is_inside = (BLI_rctf_isect_pt_v(data->rect_fl, screen_co) && - BLI_lasso_is_point_inside( - data->mcoords, screen_co[0], screen_co[1], INT_MAX)); + const bool is_inside = + (BLI_rctf_isect_pt_v(data->rect_fl, screen_co) && + BLI_lasso_is_point_inside( + data->mcoords, data->mcoords_len, screen_co[0], screen_co[1], INT_MAX)); const int sel_op_result = ED_select_op_action_deselected(data->sel_op, is_select, is_inside); if (sel_op_result != -1) { SET_FLAG_FROM_TEST(ml->flag, sel_op_result, SELECT); data->is_changed = true; } } -static bool do_lasso_select_meta(const ViewContext *vc, - const Span mcoords, +static bool do_lasso_select_meta(ViewContext *vc, + const int mcoords[][2], + const int mcoords_len, const eSelectOp sel_op) { LassoSelectUserData data; @@ -1160,9 +1179,9 @@ static bool do_lasso_select_meta(const ViewContext *vc, MetaBall *mb = (MetaBall *)vc->obedit->data; - BLI_lasso_boundbox(&rect, mcoords); + BLI_lasso_boundbox(&rect, mcoords, mcoords_len); - view3d_userdata_lassoselect_init(&data, vc, &rect, mcoords, sel_op); + view3d_userdata_lassoselect_init(&data, vc, &rect, mcoords, mcoords_len, sel_op); if (SEL_OP_USE_PRE_DESELECT(sel_op)) { data.is_changed |= BKE_mball_deselect_all(mb); @@ -1176,8 +1195,9 @@ static bool do_lasso_select_meta(const ViewContext *vc, return data.is_changed; } -static bool do_lasso_select_grease_pencil(const ViewContext *vc, - const Span mcoords, +static bool do_lasso_select_grease_pencil(ViewContext *vc, + const int mcoords[][2], + const int mcoords_len, const eSelectOp sel_op) { using namespace blender; @@ -1190,10 +1210,9 @@ static bool do_lasso_select_grease_pencil(const ViewContext *vc, vc->scene->toolsettings); bool changed = false; - const Vector drawings = + const Array drawings = ed::greasepencil::retrieve_editable_drawings(*vc->scene, grease_pencil); for (const ed::greasepencil::MutableDrawingInfo info : drawings) { - const bke::greasepencil::Layer &layer = *grease_pencil.layers()[info.layer_index]; bke::crazyspace::GeometryDeformation deformation = bke::crazyspace::get_evaluated_grease_pencil_drawing_deformation( ob_eval, *vc->obedit, info.layer_index, info.frame_number); @@ -1204,16 +1223,14 @@ static bool do_lasso_select_grease_pencil(const ViewContext *vc, if (elements.is_empty()) { continue; } - const float4x4 layer_to_world = layer.to_world_space(*ob_eval); - const float4x4 projection = ED_view3d_ob_project_mat_get_from_obmat(vc->rv3d, layer_to_world); - changed = ed::curves::select_lasso(*vc, - info.drawing.strokes_for_write(), - deformation.positions, - projection, - elements, - selection_domain, - mcoords, - sel_op); + changed = ed::curves::select_lasso( + *vc, + info.drawing.strokes_for_write(), + deformation.positions, + elements, + selection_domain, + Span(reinterpret_cast(mcoords), mcoords_len), + sel_op); } if (changed) { @@ -1239,18 +1256,20 @@ static void do_lasso_select_meshobject__doSelectVert(void *user_data, user_data); LassoSelectUserData *data = &mesh_data->lasso_data; const bool is_select = mesh_data->select_vert[index]; - const bool is_inside = (BLI_rctf_isect_pt_v(data->rect_fl, screen_co) && - BLI_lasso_is_point_inside( - data->mcoords, screen_co[0], screen_co[1], IS_CLIPPED)); + const bool is_inside = + (BLI_rctf_isect_pt_v(data->rect_fl, screen_co) && + BLI_lasso_is_point_inside( + data->mcoords, data->mcoords_len, screen_co[0], screen_co[1], IS_CLIPPED)); const int sel_op_result = ED_select_op_action_deselected(data->sel_op, is_select, is_inside); if (sel_op_result != -1) { mesh_data->select_vert[index] = sel_op_result == 1; data->is_changed = true; } } -static bool do_lasso_select_paintvert(const ViewContext *vc, +static bool do_lasso_select_paintvert(ViewContext *vc, wmGenericUserData *wm_userdata, - const Span mcoords, + const int mcoords[][2], + const int mcoords_len, const eSelectOp sel_op) { using namespace blender; @@ -1269,7 +1288,7 @@ static bool do_lasso_select_paintvert(const ViewContext *vc, changed |= paintvert_deselect_all_visible(ob, SEL_DESELECT, false); } - BLI_lasso_boundbox(&rect, mcoords); + BLI_lasso_boundbox(&rect, mcoords, mcoords_len); EditSelectBuf_Cache *esel = static_cast(wm_userdata->data); if (use_zbuf) { @@ -1277,7 +1296,7 @@ static bool do_lasso_select_paintvert(const ViewContext *vc, editselect_buf_cache_init_with_generic_userdata(wm_userdata, vc, SCE_SELECT_VERTEX); esel = static_cast(wm_userdata->data); esel->select_bitmap = DRW_select_buffer_bitmap_from_poly( - vc->depsgraph, vc->region, vc->v3d, mcoords, &rect, nullptr); + vc->depsgraph, vc->region, vc->v3d, mcoords, mcoords_len, &rect, nullptr); } } @@ -1294,7 +1313,7 @@ static bool do_lasso_select_paintvert(const ViewContext *vc, LassoSelectUserData_ForMeshVert data; data.select_vert = select_vert.span; - view3d_userdata_lassoselect_init(&data.lasso_data, vc, &rect, mcoords, sel_op); + view3d_userdata_lassoselect_init(&data.lasso_data, vc, &rect, mcoords, mcoords_len, sel_op); ED_view3d_init_mats_rv3d(vc->obact, vc->rv3d); @@ -1315,9 +1334,10 @@ static bool do_lasso_select_paintvert(const ViewContext *vc, return changed; } -static bool do_lasso_select_paintface(const ViewContext *vc, +static bool do_lasso_select_paintface(ViewContext *vc, wmGenericUserData *wm_userdata, - const Span mcoords, + const int mcoords[][2], + const int mcoords_len, const eSelectOp sel_op) { Object *ob = vc->obact; @@ -1334,14 +1354,14 @@ static bool do_lasso_select_paintface(const ViewContext *vc, changed |= paintface_deselect_all_visible(vc->C, ob, SEL_DESELECT, false); } - BLI_lasso_boundbox(&rect, mcoords); + BLI_lasso_boundbox(&rect, mcoords, mcoords_len); EditSelectBuf_Cache *esel = static_cast(wm_userdata->data); if (esel == nullptr) { editselect_buf_cache_init_with_generic_userdata(wm_userdata, vc, SCE_SELECT_FACE); esel = static_cast(wm_userdata->data); esel->select_bitmap = DRW_select_buffer_bitmap_from_poly( - vc->depsgraph, vc->region, vc->v3d, mcoords, &rect, nullptr); + vc->depsgraph, vc->region, vc->v3d, mcoords, mcoords_len, &rect, nullptr); } if (esel->select_bitmap) { @@ -1356,7 +1376,8 @@ static bool do_lasso_select_paintface(const ViewContext *vc, static bool view3d_lasso_select(bContext *C, ViewContext *vc, - const Span mcoords, + const int mcoords[][2], + const int mcoords_len, const eSelectOp sel_op) { using namespace blender; @@ -1368,22 +1389,19 @@ static bool view3d_lasso_select(bContext *C, if (vc->obedit == nullptr) { /* Object Mode */ if (BKE_paint_select_face_test(ob)) { - changed_multi |= do_lasso_select_paintface(vc, wm_userdata, mcoords, sel_op); + changed_multi |= do_lasso_select_paintface(vc, wm_userdata, mcoords, mcoords_len, sel_op); } else if (BKE_paint_select_vert_test(ob)) { - changed_multi |= do_lasso_select_paintvert(vc, wm_userdata, mcoords, sel_op); + changed_multi |= do_lasso_select_paintvert(vc, wm_userdata, mcoords, mcoords_len, sel_op); } else if (ob && (ob->mode & OB_MODE_PARTICLE_EDIT)) { - changed_multi |= PE_lasso_select(C, - reinterpret_cast(mcoords.data()), - mcoords.size(), - sel_op) != OPERATOR_CANCELLED; + changed_multi |= PE_lasso_select(C, mcoords, mcoords_len, sel_op) != OPERATOR_CANCELLED; } else if (ob && ((ob->mode & OB_MODE_POSE) | ((ob->mode & OB_MODE_WEIGHT_PAINT) && BKE_object_pose_armature_get_with_wpaint_check(ob)))) { - changed_multi |= do_lasso_select_pose(vc, mcoords, sel_op); + changed_multi |= do_lasso_select_pose(vc, mcoords, mcoords_len, sel_op); if (changed_multi) { ED_outliner_select_sync_from_pose_bone_tag(C); } @@ -1394,17 +1412,13 @@ static bool view3d_lasso_select(bContext *C, /* pass */ } else { - changed_multi |= do_lasso_select_objects(vc, mcoords, sel_op); + changed_multi |= do_lasso_select_objects(vc, mcoords, mcoords_len, sel_op); if (changed_multi) { ED_outliner_select_sync_from_object_tag(C); } } } else { /* Edit Mode */ - if (vc->obedit->type == OB_MESH) { - vc->em = BKE_editmesh_from_object(vc->obedit); - } - FOREACH_OBJECT_IN_MODE_BEGIN (vc->scene, vc->view_layer, vc->v3d, ob->type, ob->mode, ob_iter) { ED_view3d_viewcontext_init_object(vc, ob_iter); @@ -1412,23 +1426,23 @@ static bool view3d_lasso_select(bContext *C, switch (vc->obedit->type) { case OB_MESH: - changed = do_lasso_select_mesh(vc, wm_userdata, mcoords, sel_op); + changed = do_lasso_select_mesh(vc, wm_userdata, mcoords, mcoords_len, sel_op); break; case OB_CURVES_LEGACY: case OB_SURF: - changed = do_lasso_select_curve(vc, mcoords, sel_op); + changed = do_lasso_select_curve(vc, mcoords, mcoords_len, sel_op); break; case OB_LATTICE: - changed = do_lasso_select_lattice(vc, mcoords, sel_op); + changed = do_lasso_select_lattice(vc, mcoords, mcoords_len, sel_op); break; case OB_ARMATURE: - changed = do_lasso_select_armature(vc, mcoords, sel_op); + changed = do_lasso_select_armature(vc, mcoords, mcoords_len, sel_op); if (changed) { ED_outliner_select_sync_from_edit_bone_tag(C); } break; case OB_MBALL: - changed = do_lasso_select_meta(vc, mcoords, sel_op); + changed = do_lasso_select_meta(vc, mcoords, mcoords_len, sel_op); break; case OB_CURVES: { Curves &curves_id = *static_cast(vc->obedit->data); @@ -1437,15 +1451,14 @@ static bool view3d_lasso_select(bContext *C, bke::crazyspace::get_evaluated_curves_deformation(*vc->depsgraph, *vc->obedit); const bke::AttrDomain selection_domain = bke::AttrDomain(curves_id.selection_domain); const IndexRange elements(curves.attributes().domain_size(selection_domain)); - const float4x4 projection = ED_view3d_ob_project_mat_get(vc->rv3d, vc->obedit); - changed = ed::curves::select_lasso(*vc, - curves, - deformation.positions, - projection, - elements, - selection_domain, - mcoords, - sel_op); + changed = ed::curves::select_lasso( + *vc, + curves, + deformation.positions, + elements, + selection_domain, + Span(reinterpret_cast(mcoords), mcoords_len), + sel_op); if (changed) { /* Use #ID_RECALC_GEOMETRY instead of #ID_RECALC_SELECT because it is handled as a * generic attribute for now. */ @@ -1455,7 +1468,7 @@ static bool view3d_lasso_select(bContext *C, break; } case OB_GREASE_PENCIL: { - changed = do_lasso_select_grease_pencil(vc, mcoords, sel_op); + changed = do_lasso_select_grease_pencil(vc, mcoords, mcoords_len, sel_op); break; } default: @@ -1481,25 +1494,28 @@ static bool view3d_lasso_select(bContext *C, * with short array we convert */ static int view3d_lasso_select_exec(bContext *C, wmOperator *op) { - Array mcoords = WM_gesture_lasso_path_to_array(C, op); - if (mcoords.is_empty()) { - return OPERATOR_PASS_THROUGH; + int mcoords_len; + const int(*mcoords)[2] = WM_gesture_lasso_path_to_array(C, op, &mcoords_len); + + if (mcoords) { + Depsgraph *depsgraph = CTX_data_ensure_evaluated_depsgraph(C); + view3d_operator_needs_opengl(C); + BKE_object_update_select_id(CTX_data_main(C)); + + /* setup view context for argument to callbacks */ + ViewContext vc = ED_view3d_viewcontext_init(C, depsgraph); + + eSelectOp sel_op = static_cast(RNA_enum_get(op->ptr, "mode")); + bool changed_multi = view3d_lasso_select(C, &vc, mcoords, mcoords_len, sel_op); + + MEM_freeN((void *)mcoords); + + if (changed_multi) { + return OPERATOR_FINISHED; + } + return OPERATOR_CANCELLED; } - - Depsgraph *depsgraph = CTX_data_ensure_evaluated_depsgraph(C); - view3d_operator_needs_opengl(C); - BKE_object_update_select_id(CTX_data_main(C)); - - /* setup view context for argument to callbacks */ - ViewContext vc = ED_view3d_viewcontext_init(C, depsgraph); - - eSelectOp sel_op = static_cast(RNA_enum_get(op->ptr, "mode")); - bool changed_multi = view3d_lasso_select(C, &vc, mcoords, sel_op); - - if (changed_multi) { - return OPERATOR_FINISHED; - } - return OPERATOR_CANCELLED; + return OPERATOR_PASS_THROUGH; } void VIEW3D_OT_select_lasso(wmOperatorType *ot) @@ -1680,7 +1696,7 @@ void VIEW3D_OT_select_menu(wmOperatorType *ot) * \return True when a menu was activated. */ static bool object_mouse_select_menu(bContext *C, - const ViewContext *vc, + ViewContext *vc, const blender::Span hit_results, const int mval[2], const SelectPick_Params *params, @@ -2085,7 +2101,7 @@ static int selectbuffer_ret_hits_5(blender::MutableSpan hit_res * at the nearest surface. The hits must still be ordered by depth. * Needed so we can step to the next, non-active object when it's already selected, see: #76445. */ -static int mixed_bones_object_selectbuffer(const ViewContext *vc, +static int mixed_bones_object_selectbuffer(ViewContext *vc, GPUSelectBuffer *buffer, const int mval[2], eV3DSelectObjectFilter select_filter, @@ -2175,7 +2191,7 @@ finally: return hits; } -static int mixed_bones_object_selectbuffer_extended(const ViewContext *vc, +static int mixed_bones_object_selectbuffer_extended(ViewContext *vc, GPUSelectBuffer *buffer, const int mval[2], eV3DSelectObjectFilter select_filter, @@ -2253,7 +2269,7 @@ static int gpu_select_buffer_depth_id_cmp(const void *sel_a_p, const void *sel_b * * \return the active base or nullptr. */ -static Base *mouse_select_eval_buffer(const ViewContext *vc, +static Base *mouse_select_eval_buffer(ViewContext *vc, const GPUSelectBuffer &buffer, int hits, bool do_nearest, @@ -2371,7 +2387,7 @@ static Base *mouse_select_eval_buffer(const ViewContext *vc, return basact; } -static Base *mouse_select_object_center(const ViewContext *vc, Base *startbase, const int mval[2]) +static Base *mouse_select_object_center(ViewContext *vc, Base *startbase, const int mval[2]) { ARegion *region = vc->region; Scene *scene = vc->scene; @@ -2391,10 +2407,9 @@ static Base *mouse_select_object_center(const ViewContext *vc, Base *startbase, while (base) { if (BASE_SELECTABLE(v3d, base)) { float screen_co[2]; - if (ED_view3d_project_float_global(region, - base->object->object_to_world().location(), - screen_co, - V3D_PROJ_TEST_CLIP_DEFAULT) == V3D_PROJ_RET_OK) + if (ED_view3d_project_float_global( + region, base->object->object_to_world[3], screen_co, V3D_PROJ_TEST_CLIP_DEFAULT) == + V3D_PROJ_RET_OK) { float dist_test = len_manhattan_v2v2(mval_fl, screen_co); if (base == oldbasact) { @@ -2430,7 +2445,7 @@ static Base *ed_view3d_give_base_under_cursor_ex(bContext *C, view3d_operator_needs_opengl(C); BKE_object_update_select_id(CTX_data_main(C)); - const ViewContext vc = ED_view3d_viewcontext_init(C, depsgraph); + ViewContext vc = ED_view3d_viewcontext_init(C, depsgraph); const bool do_nearest = !XRAY_ACTIVE(vc.v3d); const bool do_material_slot_selection = r_material_slot != nullptr; @@ -3093,7 +3108,7 @@ static bool ed_curves_select_pick(bContext &C, const int mval[2], const SelectPi using namespace blender; Depsgraph *depsgraph = CTX_data_ensure_evaluated_depsgraph(&C); /* Setup view context for argument to callbacks. */ - const ViewContext vc = ED_view3d_viewcontext_init(&C, depsgraph); + ViewContext vc = ED_view3d_viewcontext_init(&C, depsgraph); const Vector bases = BKE_view_layer_array_from_bases_in_edit_mode_unique_data( vc.scene, vc.view_layer, vc.v3d); @@ -3113,13 +3128,12 @@ static bool ed_curves_select_pick(bContext &C, const int mval[2], const SelectPi bke::crazyspace::GeometryDeformation deformation = bke::crazyspace::get_evaluated_curves_deformation(*vc.depsgraph, *vc.obedit); const bke::CurvesGeometry &curves = curves_id.geometry.wrap(); - const float4x4 projection = ED_view3d_ob_project_mat_get(vc.rv3d, &curves_ob); const IndexRange elements(curves.attributes().domain_size(selection_domain)); std::optional new_closest_elem = ed::curves::closest_elem_find_screen_space(vc, + curves_ob, curves.points_by_curve(), deformation.positions, - projection, elements, selection_domain, mval, @@ -3193,12 +3207,12 @@ static bool ed_grease_pencil_select_pick(bContext *C, using namespace blender; Depsgraph *depsgraph = CTX_data_ensure_evaluated_depsgraph(C); /* Setup view context for argument to callbacks. */ - const ViewContext vc = ED_view3d_viewcontext_init(C, depsgraph); + ViewContext vc = ED_view3d_viewcontext_init(C, depsgraph); /* Collect editable drawings. */ const Object *ob_eval = DEG_get_evaluated_object(vc.depsgraph, const_cast(vc.obedit)); GreasePencil &grease_pencil = *static_cast(vc.obedit->data); - const Vector drawings = + const Array drawings = ed::greasepencil::retrieve_editable_drawings(*vc.scene, grease_pencil); /* Get selection domain from tool settings. */ @@ -3213,7 +3227,6 @@ static bool ed_grease_pencil_select_pick(bContext *C, ClosestGreasePencilDrawing new_closest = init; for (const int i : range) { ed::greasepencil::MutableDrawingInfo info = drawings[i]; - const bke::greasepencil::Layer &layer = *grease_pencil.layers()[info.layer_index]; /* Get deformation by modifiers. */ bke::crazyspace::GeometryDeformation deformation = bke::crazyspace::get_evaluated_grease_pencil_drawing_deformation( @@ -3225,14 +3238,11 @@ static bool ed_grease_pencil_select_pick(bContext *C, if (elements.is_empty()) { continue; } - const float4x4 layer_to_world = layer.to_world_space(*ob_eval); - const float4x4 projection = ED_view3d_ob_project_mat_get_from_obmat(vc.rv3d, - layer_to_world); std::optional new_closest_elem = ed::curves::closest_elem_find_screen_space(vc, + *vc.obedit, info.drawing.strokes().points_by_curve(), deformation.positions, - projection, elements, selection_domain, mval, @@ -3315,7 +3325,7 @@ static int view3d_select_exec(bContext *C, wmOperator *op) } Depsgraph *depsgraph = CTX_data_ensure_evaluated_depsgraph(C); - const ViewContext vc = ED_view3d_viewcontext_init(C, depsgraph); + ViewContext vc = ED_view3d_viewcontext_init(C, depsgraph); SelectPick_Params params{}; ED_select_pick_params_from_operator(op->ptr, ¶ms); @@ -3487,7 +3497,7 @@ void VIEW3D_OT_select(wmOperatorType *ot) * \{ */ struct BoxSelectUserData { - const ViewContext *vc; + ViewContext *vc; const rcti *rect; const rctf *rect_fl; rctf _rect_fl; @@ -3500,7 +3510,7 @@ struct BoxSelectUserData { }; static void view3d_userdata_boxselect_init(BoxSelectUserData *r_data, - const ViewContext *vc, + ViewContext *vc, const rcti *rect, const eSelectOp sel_op) { @@ -3547,7 +3557,7 @@ static void do_paintvert_box_select__doSelectVert(void *user_data, data->is_changed = true; } } -static bool do_paintvert_box_select(const ViewContext *vc, +static bool do_paintvert_box_select(ViewContext *vc, wmGenericUserData *wm_userdata, const rcti *rect, const eSelectOp sel_op) @@ -3608,7 +3618,7 @@ static bool do_paintvert_box_select(const ViewContext *vc, return changed; } -static bool do_paintface_box_select(const ViewContext *vc, +static bool do_paintface_box_select(ViewContext *vc, wmGenericUserData *wm_userdata, const rcti *rect, eSelectOp sel_op) @@ -3689,7 +3699,7 @@ static void do_nurbs_box_select__doSelect(void *user_data, } } } -static bool do_nurbs_box_select(const ViewContext *vc, const rcti *rect, const eSelectOp sel_op) +static bool do_nurbs_box_select(ViewContext *vc, const rcti *rect, const eSelectOp sel_op) { const bool deselect_all = (sel_op == SEL_OP_SET); BoxSelectUserData data; @@ -3729,7 +3739,7 @@ static void do_lattice_box_select__doSelect(void *user_data, BPoint *bp, const f data->is_changed = true; } } -static bool do_lattice_box_select(const ViewContext *vc, const rcti *rect, const eSelectOp sel_op) +static bool do_lattice_box_select(ViewContext *vc, const rcti *rect, const eSelectOp sel_op) { BoxSelectUserData data; @@ -3833,7 +3843,7 @@ static void do_mesh_box_select__doSelectFace(void *user_data, data->is_changed = true; } } -static bool do_mesh_box_select(const ViewContext *vc, +static bool do_mesh_box_select(ViewContext *vc, wmGenericUserData *wm_userdata, const rcti *rect, const eSelectOp sel_op) @@ -3918,7 +3928,7 @@ static bool do_mesh_box_select(const ViewContext *vc, return data.is_changed; } -static bool do_meta_box_select(const ViewContext *vc, const rcti *rect, const eSelectOp sel_op) +static bool do_meta_box_select(ViewContext *vc, const rcti *rect, const eSelectOp sel_op) { Object *ob = vc->obedit; MetaBall *mb = (MetaBall *)ob->data; @@ -3989,7 +3999,7 @@ static bool do_meta_box_select(const ViewContext *vc, const rcti *rect, const eS return changed; } -static bool do_armature_box_select(const ViewContext *vc, const rcti *rect, const eSelectOp sel_op) +static bool do_armature_box_select(ViewContext *vc, const rcti *rect, const eSelectOp sel_op) { bool changed = false; int a; @@ -4065,7 +4075,7 @@ static int opengl_bone_select_buffer_cmp(const void *sel_a_p, const void *sel_b_ } static bool do_object_box_select(bContext *C, - const ViewContext *vc, + ViewContext *vc, const rcti *rect, const eSelectOp sel_op) { @@ -4136,7 +4146,7 @@ finally: } static bool do_pose_box_select(bContext *C, - const ViewContext *vc, + ViewContext *vc, const rcti *rect, const eSelectOp sel_op) { @@ -4209,9 +4219,7 @@ static bool do_pose_box_select(bContext *C, return changed_multi; } -static bool do_grease_pencil_box_select(const ViewContext *vc, - const rcti *rect, - const eSelectOp sel_op) +static bool do_grease_pencil_box_select(ViewContext *vc, const rcti *rect, const eSelectOp sel_op) { using namespace blender; Scene *scene = vc->scene; @@ -4224,10 +4232,9 @@ static bool do_grease_pencil_box_select(const ViewContext *vc, scene->toolsettings); bool changed = false; - const Vector drawings = + const Array drawings = ed::greasepencil::retrieve_editable_drawings(*scene, grease_pencil); for (const ed::greasepencil::MutableDrawingInfo info : drawings) { - const bke::greasepencil::Layer &layer = *grease_pencil.layers()[info.layer_index]; bke::crazyspace::GeometryDeformation deformation = bke::crazyspace::get_evaluated_grease_pencil_drawing_deformation( ob_eval, *vc->obedit, info.layer_index, info.frame_number); @@ -4237,12 +4244,9 @@ static bool do_grease_pencil_box_select(const ViewContext *vc, if (elements.is_empty()) { continue; } - const float4x4 layer_to_world = layer.to_world_space(*ob_eval); - const float4x4 projection = ED_view3d_ob_project_mat_get_from_obmat(vc->rv3d, layer_to_world); changed |= ed::curves::select_box(*vc, info.drawing.strokes_for_write(), deformation.positions, - projection, elements, selection_domain, *rect, @@ -4328,16 +4332,9 @@ static int view3d_box_select_exec(bContext *C, wmOperator *op) bke::crazyspace::GeometryDeformation deformation = bke::crazyspace::get_evaluated_curves_deformation(*vc.depsgraph, *vc.obedit); const bke::AttrDomain selection_domain = bke::AttrDomain(curves_id.selection_domain); - const float4x4 projection = ED_view3d_ob_project_mat_get(vc.rv3d, vc.obedit); const IndexRange elements(curves.attributes().domain_size(selection_domain)); - changed = ed::curves::select_box(vc, - curves, - deformation.positions, - projection, - elements, - selection_domain, - rect, - sel_op); + changed = ed::curves::select_box( + vc, curves, deformation.positions, elements, selection_domain, rect, sel_op); if (changed) { /* Use #ID_RECALC_GEOMETRY instead of #ID_RECALC_SELECT because it is handled as a * generic attribute for now. */ @@ -4422,7 +4419,7 @@ void VIEW3D_OT_select_box(wmOperatorType *ot) * \{ */ struct CircleSelectUserData { - const ViewContext *vc; + ViewContext *vc; bool select; int mval[2]; float mval_fl[2]; @@ -4435,7 +4432,7 @@ struct CircleSelectUserData { }; static void view3d_userdata_circleselect_init(CircleSelectUserData *r_data, - const ViewContext *vc, + ViewContext *vc, const bool select, const int mval[2], const float rad) @@ -4494,7 +4491,7 @@ static void mesh_circle_doSelectFace(void *user_data, } } -static bool mesh_circle_select(const ViewContext *vc, +static bool mesh_circle_select(ViewContext *vc, wmGenericUserData *wm_userdata, eSelectOp sel_op, const int mval[2], @@ -4502,7 +4499,7 @@ static bool mesh_circle_select(const ViewContext *vc, { ToolSettings *ts = vc->scene->toolsettings; CircleSelectUserData data; - BLI_assert(vc->em == BKE_editmesh_from_object(vc->obedit)); + vc->em = BKE_editmesh_from_object(vc->obedit); bool changed = false; if (SEL_OP_USE_PRE_DESELECT(sel_op)) { @@ -4585,7 +4582,7 @@ static bool mesh_circle_select(const ViewContext *vc, return changed; } -static bool paint_facesel_circle_select(const ViewContext *vc, +static bool paint_facesel_circle_select(ViewContext *vc, wmGenericUserData *wm_userdata, const eSelectOp sel_op, const int mval[2], @@ -4639,7 +4636,7 @@ static void paint_vertsel_circle_select_doSelectVert(void *user_data, data->is_changed = true; } } -static bool paint_vertsel_circle_select(const ViewContext *vc, +static bool paint_vertsel_circle_select(ViewContext *vc, wmGenericUserData *wm_userdata, const eSelectOp sel_op, const int mval[2], @@ -4731,7 +4728,7 @@ static void nurbscurve_circle_doSelect(void *user_data, data->is_changed = true; } } -static bool nurbscurve_circle_select(const ViewContext *vc, +static bool nurbscurve_circle_select(ViewContext *vc, const eSelectOp sel_op, const int mval[2], float rad) @@ -4773,7 +4770,7 @@ static void latticecurve_circle_doSelect(void *user_data, BPoint *bp, const floa data->is_changed = true; } } -static bool lattice_circle_select(const ViewContext *vc, +static bool lattice_circle_select(ViewContext *vc, const eSelectOp sel_op, const int mval[2], float rad) @@ -4864,7 +4861,7 @@ static void do_circle_select_pose__doSelectBone(void *user_data, data->is_changed |= is_point_done; } -static bool pose_circle_select(const ViewContext *vc, +static bool pose_circle_select(ViewContext *vc, const eSelectOp sel_op, const int mval[2], float rad) @@ -5001,7 +4998,7 @@ static void do_circle_select_armature__doSelectBone_clip_content(void *user_data data->is_changed = true; } } -static bool armature_circle_select(const ViewContext *vc, +static bool armature_circle_select(ViewContext *vc, const eSelectOp sel_op, const int mval[2], float rad) @@ -5055,7 +5052,7 @@ static void do_circle_select_mball__doSelectElem(void *user_data, data->is_changed = true; } } -static bool mball_circle_select(const ViewContext *vc, +static bool mball_circle_select(ViewContext *vc, const eSelectOp sel_op, const int mval[2], float rad) @@ -5077,7 +5074,7 @@ static bool mball_circle_select(const ViewContext *vc, return data.is_changed; } -static bool grease_pencil_circle_select(const ViewContext *vc, +static bool grease_pencil_circle_select(ViewContext *vc, const eSelectOp sel_op, const int mval[2], const float rad) @@ -5092,10 +5089,9 @@ static bool grease_pencil_circle_select(const ViewContext *vc, vc->scene->toolsettings); bool changed = false; - const Vector drawings = + const Array drawings = ed::greasepencil::retrieve_editable_drawings(*vc->scene, grease_pencil); for (const ed::greasepencil::MutableDrawingInfo info : drawings) { - const bke::greasepencil::Layer &layer = *grease_pencil.layers()[info.layer_index]; bke::crazyspace::GeometryDeformation deformation = bke::crazyspace::get_evaluated_grease_pencil_drawing_deformation( ob_eval, *vc->obedit, info.layer_index, info.frame_number); @@ -5105,12 +5101,9 @@ static bool grease_pencil_circle_select(const ViewContext *vc, if (elements.is_empty()) { continue; } - const float4x4 layer_to_world = layer.to_world_space(*ob_eval); - const float4x4 projection = ED_view3d_ob_project_mat_get_from_obmat(vc->rv3d, layer_to_world); changed = ed::curves::select_circle(*vc, info.drawing.strokes_for_write(), deformation.positions, - projection, elements, selection_domain, int2(mval), @@ -5132,7 +5125,7 @@ static bool grease_pencil_circle_select(const ViewContext *vc, * Callbacks for circle selection in Editmode */ static bool obedit_circle_select(bContext *C, - const ViewContext *vc, + ViewContext *vc, wmGenericUserData *wm_userdata, const eSelectOp sel_op, const int mval[2], @@ -5167,17 +5160,9 @@ static bool obedit_circle_select(bContext *C, bke::crazyspace::GeometryDeformation deformation = bke::crazyspace::get_evaluated_curves_deformation(*vc->depsgraph, *vc->obedit); const bke::AttrDomain selection_domain = bke::AttrDomain(curves_id.selection_domain); - const float4x4 projection = ED_view3d_ob_project_mat_get(vc->rv3d, vc->obedit); const IndexRange elements(curves.attributes().domain_size(selection_domain)); - changed = ed::curves::select_circle(*vc, - curves, - deformation.positions, - projection, - elements, - selection_domain, - mval, - rad, - sel_op); + changed = ed::curves::select_circle( + *vc, curves, deformation.positions, elements, selection_domain, mval, rad, sel_op); if (changed) { /* Use #ID_RECALC_GEOMETRY instead of #ID_RECALC_SELECT because it is handled as a * generic attribute for now. */ @@ -5202,7 +5187,7 @@ static bool obedit_circle_select(bContext *C, return changed; } -static bool object_circle_select(const ViewContext *vc, +static bool object_circle_select(ViewContext *vc, const eSelectOp sel_op, const int mval[2], float rad) @@ -5226,7 +5211,7 @@ static bool object_circle_select(const ViewContext *vc, if (BASE_SELECTABLE(v3d, base) && ((base->flag & BASE_SELECTED) != select_flag)) { float screen_co[2]; if (ED_view3d_project_float_global(vc->region, - base->object->object_to_world().location(), + base->object->object_to_world[3], screen_co, V3D_PROJ_TEST_CLIP_DEFAULT) == V3D_PROJ_RET_OK) { @@ -5310,11 +5295,6 @@ static int view3d_circle_select_exec(bContext *C, wmOperator *op) if (obedit == nullptr) { BKE_object_update_select_id(CTX_data_main(C)); } - else { - if (vc.obedit->type == OB_MESH) { - vc.em = BKE_editmesh_from_object(vc.obedit); - } - } FOREACH_OBJECT_IN_MODE_BEGIN ( vc.scene, vc.view_layer, vc.v3d, obact->type, obact->mode, ob_iter) diff --git a/source/blender/editors/space_view3d/view3d_snap.cc b/source/blender/editors/space_view3d/view3d_snap.cc index 9dd1c42e20c..40393abb555 100644 --- a/source/blender/editors/space_view3d/view3d_snap.cc +++ b/source/blender/editors/space_view3d/view3d_snap.cc @@ -28,8 +28,8 @@ #include "BKE_main.hh" #include "BKE_mball.hh" #include "BKE_object.hh" -#include "BKE_report.hh" -#include "BKE_scene.hh" +#include "BKE_report.h" +#include "BKE_scene.h" #include "BKE_tracking.h" #include "DEG_depsgraph.hh" @@ -99,18 +99,18 @@ static int snap_sel_to_grid_exec(bContext *C, wmOperator *op) } if (tvs.transverts_tot != 0) { - copy_m3_m4(bmat, obedit->object_to_world().ptr()); + copy_m3_m4(bmat, obedit->object_to_world); invert_m3_m3(imat, bmat); tv = tvs.transverts; for (a = 0; a < tvs.transverts_tot; a++, tv++) { copy_v3_v3(vec, tv->loc); mul_m3_v3(bmat, vec); - add_v3_v3(vec, obedit->object_to_world().location()); + add_v3_v3(vec, obedit->object_to_world[3]); vec[0] = gridf * floorf(0.5f + vec[0] / gridf); vec[1] = gridf * floorf(0.5f + vec[1] / gridf); vec[2] = gridf * floorf(0.5f + vec[2] / gridf); - sub_v3_v3(vec, obedit->object_to_world().location()); + sub_v3_v3(vec, obedit->object_to_world[3]); mul_m3_v3(imat, vec); copy_v3_v3(tv->loc, vec); @@ -127,7 +127,7 @@ static int snap_sel_to_grid_exec(bContext *C, wmOperator *op) Object *ob = DEG_get_original_object(ob_eval); bArmature *arm_eval = static_cast(ob_eval->data); - invert_m4_m4(ob_eval->runtime->world_to_object.ptr(), ob_eval->object_to_world().ptr()); + invert_m4_m4(ob_eval->world_to_object, ob_eval->object_to_world); LISTBASE_FOREACH (bPoseChannel *, pchan_eval, &ob_eval->pose->chanbase) { if (pchan_eval->bone->flag & BONE_SELECTED) { @@ -138,12 +138,12 @@ static int snap_sel_to_grid_exec(bContext *C, wmOperator *op) /* get nearest grid point to snap to */ copy_v3_v3(nLoc, pchan_eval->pose_mat[3]); /* We must operate in world space! */ - mul_m4_v3(ob_eval->object_to_world().ptr(), nLoc); + mul_m4_v3(ob_eval->object_to_world, nLoc); vec[0] = gridf * floorf(0.5f + nLoc[0] / gridf); vec[1] = gridf * floorf(0.5f + nLoc[1] / gridf); vec[2] = gridf * floorf(0.5f + nLoc[2] / gridf); /* Back in object space... */ - mul_m4_v3(ob_eval->world_to_object().ptr(), vec); + mul_m4_v3(ob_eval->world_to_object, vec); /* Get location of grid point in pose space. */ BKE_armature_loc_pose_to_bone(pchan_eval, vec, vec); @@ -215,12 +215,12 @@ static int snap_sel_to_grid_exec(bContext *C, wmOperator *op) for (Object *ob_eval : objects_eval) { Object *ob = DEG_get_original_object(ob_eval); - vec[0] = -ob_eval->object_to_world().location()[0] + - gridf * floorf(0.5f + ob_eval->object_to_world().location()[0] / gridf); - vec[1] = -ob_eval->object_to_world().location()[1] + - gridf * floorf(0.5f + ob_eval->object_to_world().location()[1] / gridf); - vec[2] = -ob_eval->object_to_world().location()[2] + - gridf * floorf(0.5f + ob_eval->object_to_world().location()[2] / gridf); + vec[0] = -ob_eval->object_to_world[3][0] + + gridf * floorf(0.5f + ob_eval->object_to_world[3][0] / gridf); + vec[1] = -ob_eval->object_to_world[3][1] + + gridf * floorf(0.5f + ob_eval->object_to_world[3][1] / gridf); + vec[2] = -ob_eval->object_to_world[3][2] + + gridf * floorf(0.5f + ob_eval->object_to_world[3][2] / gridf); if (ob->parent) { float originmat[3][3]; @@ -347,11 +347,11 @@ static bool snap_selected_to_location(bContext *C, } if (tvs.transverts_tot != 0) { - copy_m3_m4(bmat, obedit->object_to_world().ptr()); + copy_m3_m4(bmat, obedit->object_to_world); invert_m3_m3(imat, bmat); /* get the cursor in object space */ - sub_v3_v3v3(snap_target_local, snap_target_global, obedit->object_to_world().location()); + sub_v3_v3v3(snap_target_local, snap_target_global, obedit->object_to_world[3]); mul_m3_v3(imat, snap_target_local); if (use_offset) { @@ -384,8 +384,8 @@ static bool snap_selected_to_location(bContext *C, bArmature *arm = static_cast(ob->data); float snap_target_local[3]; - invert_m4_m4(ob->runtime->world_to_object.ptr(), ob->object_to_world().ptr()); - mul_v3_m4v3(snap_target_local, ob->world_to_object().ptr(), snap_target_global); + invert_m4_m4(ob->world_to_object, ob->object_to_world); + mul_v3_m4v3(snap_target_local, ob->world_to_object, snap_target_global); LISTBASE_FOREACH (bPoseChannel *, pchan, &ob->pose->chanbase) { if ((pchan->bone->flag & BONE_SELECTED) && PBONE_VISIBLE(arm, pchan->bone) && @@ -411,10 +411,10 @@ static bool snap_selected_to_location(bContext *C, float cursor_pose[3]; if (use_offset) { - mul_v3_m4v3(cursor_pose, ob->object_to_world().ptr(), pchan->pose_mat[3]); + mul_v3_m4v3(cursor_pose, ob->object_to_world, pchan->pose_mat[3]); add_v3_v3(cursor_pose, offset_global); - mul_m4_v3(ob->world_to_object().ptr(), cursor_pose); + mul_m4_v3(ob->world_to_object, cursor_pose); BKE_armature_loc_pose_to_bone(pchan, cursor_pose, cursor_pose); } else { @@ -508,13 +508,13 @@ static bool snap_selected_to_location(bContext *C, float cursor_parent[3]; /* parent-relative */ if (use_offset) { - add_v3_v3v3(cursor_parent, ob->object_to_world().location(), offset_global); + add_v3_v3v3(cursor_parent, ob->object_to_world[3], offset_global); } else { copy_v3_v3(cursor_parent, snap_target_global); } - sub_v3_v3(cursor_parent, ob->object_to_world().location()); + sub_v3_v3(cursor_parent, ob->object_to_world[3]); if (ob->parent) { float originmat[3][3], parentmat[4][4]; @@ -681,7 +681,7 @@ static int snap_curs_to_grid_exec(bContext *C, wmOperator * /*op*/) curs[2] = gridf * floorf(0.5f + curs[2] / gridf); WM_event_add_notifier(C, NC_SPACE | ND_SPACE_VIEW3D, nullptr); /* hrm */ - DEG_id_tag_update(&scene->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&scene->id, ID_RECALC_COPY_ON_WRITE); return OPERATOR_FINISHED; } @@ -723,7 +723,7 @@ static void bundle_midpoint(Scene *scene, Object *ob, float r_vec[3]) MovieTracking *tracking = &clip->tracking; - copy_m4_m4(cammat, ob->object_to_world().ptr()); + copy_m4_m4(cammat, ob->object_to_world); BKE_tracking_get_camera_object_matrix(ob, mat); @@ -798,13 +798,13 @@ static bool snap_curs_to_sel_ex(bContext *C, const int pivot_point, float r_curs count += tvs.transverts_tot; if (tvs.transverts_tot != 0) { Object *obedit_eval = DEG_get_evaluated_object(depsgraph, obedit); - copy_m3_m4(bmat, obedit_eval->object_to_world().ptr()); + copy_m3_m4(bmat, obedit_eval->object_to_world); tv = tvs.transverts; for (int i = 0; i < tvs.transverts_tot; i++, tv++) { copy_v3_v3(vec, tv->loc); mul_m3_v3(bmat, vec); - add_v3_v3(vec, obedit_eval->object_to_world().location()); + add_v3_v3(vec, obedit_eval->object_to_world[3]); add_v3_v3(centroid, vec); minmax_v3v3_v3(min, max, vec); } @@ -822,7 +822,7 @@ static bool snap_curs_to_sel_ex(bContext *C, const int pivot_point, float r_curs if (ANIM_bonecoll_is_visible_pchan(arm, pchan)) { if (pchan->bone->flag & BONE_SELECTED) { copy_v3_v3(vec, pchan->pose_head); - mul_m4_v3(obact_eval->object_to_world().ptr(), vec); + mul_m4_v3(obact_eval->object_to_world, vec); add_v3_v3(centroid, vec); minmax_v3v3_v3(min, max, vec); count++; @@ -832,7 +832,7 @@ static bool snap_curs_to_sel_ex(bContext *C, const int pivot_point, float r_curs } else { FOREACH_SELECTED_OBJECT_BEGIN (view_layer_eval, v3d, ob_eval) { - copy_v3_v3(vec, ob_eval->object_to_world().location()); + copy_v3_v3(vec, ob_eval->object_to_world[3]); /* special case for camera -- snap to bundles */ if (ob_eval->type == OB_CAMERA) { @@ -870,7 +870,7 @@ static int snap_curs_to_sel_exec(bContext *C, wmOperator * /*op*/) const int pivot_point = scene->toolsettings->transform_pivot_point; if (snap_curs_to_sel_ex(C, pivot_point, scene->cursor.location)) { WM_event_add_notifier(C, NC_SPACE | ND_SPACE_VIEW3D, nullptr); - DEG_id_tag_update(&scene->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&scene->id, ID_RECALC_COPY_ON_WRITE); return OPERATOR_FINISHED; } @@ -919,7 +919,7 @@ static int snap_curs_to_active_exec(bContext *C, wmOperator * /*op*/) if (snap_calc_active_center(C, false, scene->cursor.location)) { WM_event_add_notifier(C, NC_SPACE | ND_SPACE_VIEW3D, nullptr); - DEG_id_tag_update(&scene->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&scene->id, ID_RECALC_COPY_ON_WRITE); return OPERATOR_FINISHED; } @@ -957,7 +957,7 @@ static int snap_curs_to_center_exec(bContext *C, wmOperator * /*op*/) zero_v3(scene->cursor.location); BKE_scene_cursor_mat3_to_rot(&scene->cursor, mat3, false); - DEG_id_tag_update(&scene->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&scene->id, ID_RECALC_COPY_ON_WRITE); WM_event_add_notifier(C, NC_SPACE | ND_SPACE_VIEW3D, nullptr); return OPERATOR_FINISHED; @@ -1022,7 +1022,7 @@ bool ED_view3d_minmax_verts(Object *obedit, float r_min[3], float r_max[3]) changed = BKE_mball_minmax_ex(static_cast(obedit->data), ob_min, ob_max, - obedit->object_to_world().ptr(), + obedit->object_to_world, SELECT); if (changed) { minmax_v3v3_v3(r_min, r_max, ob_min); @@ -1042,7 +1042,7 @@ bool ED_view3d_minmax_verts(Object *obedit, float r_min[3], float r_max[3]) bke::crazyspace::get_evaluated_curves_deformation(obedit, ob_orig); const std::optional> curves_bounds = bounds_min_max_with_transform( - obedit->object_to_world(), deformation.positions, mask); + float4x4(obedit->object_to_world), deformation.positions, mask); if (curves_bounds) { minmax_v3v3_v3(r_min, r_max, curves_bounds->min); @@ -1060,13 +1060,13 @@ bool ED_view3d_minmax_verts(Object *obedit, float r_min[3], float r_max[3]) return false; } - copy_m3_m4(bmat, obedit->object_to_world().ptr()); + copy_m3_m4(bmat, obedit->object_to_world); tv = tvs.transverts; for (int a = 0; a < tvs.transverts_tot; a++, tv++) { copy_v3_v3(vec, (tv->flag & TX_VERT_USE_MAPLOC) ? tv->maploc : tv->loc); mul_m3_v3(bmat, vec); - add_v3_v3(vec, obedit->object_to_world().location()); + add_v3_v3(vec, obedit->object_to_world[3]); add_v3_v3(centroid, vec); minmax_v3v3_v3(r_min, r_max, vec); } diff --git a/source/blender/editors/space_view3d/view3d_utils.cc b/source/blender/editors/space_view3d/view3d_utils.cc index 521ef1f8c6c..8a10d32e452 100644 --- a/source/blender/editors/space_view3d/view3d_utils.cc +++ b/source/blender/editors/space_view3d/view3d_utils.cc @@ -23,6 +23,7 @@ #include "BLI_array_utils.h" #include "BLI_bitmap_draw_2d.h" +#include "BLI_blenlib.h" #include "BLI_math_geom.h" #include "BLI_math_matrix.h" #include "BLI_math_rotation.h" @@ -32,12 +33,14 @@ #include "BKE_camera.h" #include "BKE_context.hh" #include "BKE_object.hh" -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "BKE_screen.hh" #include "DEG_depsgraph.hh" #include "DEG_depsgraph_query.hh" +#include "BIF_glutil.hh" + #include "GPU_matrix.h" #include "WM_api.hh" @@ -284,7 +287,7 @@ void ED_view3d_clipping_calc( /* optionally transform to object space */ if (ob) { float imat[4][4]; - invert_m4_m4(imat, ob->object_to_world().ptr()); + invert_m4_m4(imat, ob->object_to_world); for (int val = 0; val < 8; val++) { mul_m4_v3(imat, bb->vec[val]); @@ -294,7 +297,7 @@ void ED_view3d_clipping_calc( /* verify if we have negative scale. doing the transform before cross * product flips the sign of the vector compared to doing cross product * before transform then, so we correct for that. */ - int flip_sign = (ob) ? is_negative_m4(ob->object_to_world().ptr()) : false; + int flip_sign = (ob) ? is_negative_m4(ob->object_to_world) : false; ED_view3d_clipping_calc_from_boundbox(planes, bb, flip_sign); } @@ -472,7 +475,7 @@ void ED_view3d_persp_switch_from_camera(const Depsgraph *depsgraph, if (v3d->camera) { Object *ob_camera_eval = DEG_get_evaluated_object(depsgraph, v3d->camera); rv3d->dist = ED_view3d_offset_distance( - ob_camera_eval->object_to_world().ptr(), rv3d->ofs, VIEW3D_DIST_FALLBACK); + ob_camera_eval->object_to_world, rv3d->ofs, VIEW3D_DIST_FALLBACK); ED_view3d_from_object(ob_camera_eval, rv3d->ofs, rv3d->viewquat, &rv3d->dist, nullptr); } @@ -564,7 +567,7 @@ void ED_view3d_camera_lock_init_ex(const Depsgraph *depsgraph, if (calc_dist) { /* using a fallback dist is OK here since ED_view3d_from_object() compensates for it */ rv3d->dist = ED_view3d_offset_distance( - ob_camera_eval->object_to_world().ptr(), rv3d->ofs, VIEW3D_DIST_FALLBACK); + ob_camera_eval->object_to_world, rv3d->ofs, VIEW3D_DIST_FALLBACK); } ED_view3d_from_object(ob_camera_eval, rv3d->ofs, rv3d->viewquat, &rv3d->dist, nullptr); } @@ -599,12 +602,12 @@ bool ED_view3d_camera_lock_sync(const Depsgraph *depsgraph, View3D *v3d, RegionV ED_view3d_to_m4(view_mat, rv3d->ofs, rv3d->viewquat, rv3d->dist); - normalize_m4_m4(tmat, ob_camera_eval->object_to_world().ptr()); + normalize_m4_m4(tmat, ob_camera_eval->object_to_world); invert_m4_m4(imat, tmat); mul_m4_m4m4(diff_mat, view_mat, imat); - mul_m4_m4m4(parent_mat, diff_mat, root_parent_eval->object_to_world().ptr()); + mul_m4_m4m4(parent_mat, diff_mat, root_parent_eval->object_to_world); BKE_object_tfm_protected_backup(root_parent, &obtfm); BKE_object_apply_mat4(root_parent, parent_mat, true, false); @@ -1101,16 +1104,21 @@ static float view_autodist_depth_margin(ARegion *region, const int mval[2], int return depth_close; } -bool ED_view3d_autodist(ARegion *region, +bool ED_view3d_autodist(Depsgraph *depsgraph, + ARegion *region, View3D *v3d, const int mval[2], float mouse_worldloc[3], + const bool /*alphaoverride*/, const float fallback_depth_pt[3]) { float depth_close; int margin_arr[] = {0, 2, 4}; bool depth_ok = false; + /* Get Z Depths, needed for perspective, nice for ortho */ + ED_view3d_depth_override(depsgraph, region, v3d, nullptr, V3D_DEPTH_NO_GPENCIL, nullptr); + /* Attempt with low margin's first */ int i = 0; do { @@ -1574,7 +1582,7 @@ void ED_view3d_to_m4(float mat[4][4], const float ofs[3], const float quat[4], c void ED_view3d_from_object(const Object *ob, float ofs[3], float quat[4], float *dist, float *lens) { - ED_view3d_from_m4(ob->object_to_world().ptr(), ofs, quat, dist); + ED_view3d_from_m4(ob->object_to_world, ofs, quat, dist); if (lens) { CameraParams params; @@ -1623,7 +1631,7 @@ static bool view3d_camera_to_view_selected_impl(Main *bmain, is_ortho_camera = true; } - copy_m4_m4(obmat_new, camera_ob_eval->object_to_world().ptr()); + copy_m4_m4(obmat_new, camera_ob_eval->object_to_world); copy_v3_v3(obmat_new[3], co); /* only touch location */ diff --git a/source/blender/editors/space_view3d/view3d_view.cc b/source/blender/editors/space_view3d/view3d_view.cc index 65e6543964f..8e604b53383 100644 --- a/source/blender/editors/space_view3d/view3d_view.cc +++ b/source/blender/editors/space_view3d/view3d_view.cc @@ -17,7 +17,7 @@ #include "BKE_action.h" #include "BKE_context.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_gpencil_modifier_legacy.h" #include "BKE_idprop.h" #include "BKE_layer.hh" @@ -25,8 +25,8 @@ #include "BKE_main.hh" #include "BKE_modifier.hh" #include "BKE_object.hh" -#include "BKE_report.hh" -#include "BKE_scene.hh" +#include "BKE_report.h" +#include "BKE_scene.h" #include "DEG_depsgraph_query.hh" @@ -241,7 +241,7 @@ static int view3d_setobjectascamera_exec(bContext *C, wmOperator *op) v3d->camera = ob; if (v3d->scenelock && scene->camera != ob) { scene->camera = ob; - DEG_id_tag_update(&scene->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&scene->id, ID_RECALC_COPY_ON_WRITE); DEG_relations_tag_update(CTX_data_main(C)); } @@ -370,7 +370,7 @@ static void obmat_to_viewmat(RegionView3D *rv3d, Object *ob) rv3d->view = RV3D_VIEW_USER; /* don't show the grid */ - normalize_m4_m4(bmat, ob->object_to_world().ptr()); + normalize_m4_m4(bmat, ob->object_to_world); invert_m4_m4(rv3d->viewmat, bmat); /* view quat calculation, needed for add object */ @@ -409,12 +409,12 @@ void view3d_viewmatrix_set(Depsgraph *depsgraph, Object *ob_eval = DEG_get_evaluated_object(depsgraph, v3d->ob_center); float vec[3]; - copy_v3_v3(vec, ob_eval->object_to_world().location()); + copy_v3_v3(vec, ob_eval->object_to_world[3]); if (ob_eval->type == OB_ARMATURE && v3d->ob_center_bone[0]) { bPoseChannel *pchan = BKE_pose_channel_find_name(ob_eval->pose, v3d->ob_center_bone); if (pchan) { copy_v3_v3(vec, pchan->pose_mat[3]); - mul_m4_v3(ob_eval->object_to_world().ptr(), vec); + mul_m4_v3(ob_eval->object_to_world, vec); } } translate_m4(rv3d->viewmat, -vec[0], -vec[1], -vec[2]); @@ -541,7 +541,7 @@ static bool drw_select_filter_object_mode_lock_for_weight_paint(Object *ob, void return ob_pose_list && (BLI_linklist_index(ob_pose_list, DEG_get_original_object(ob)) != -1); } -int view3d_opengl_select_ex(const ViewContext *vc, +int view3d_opengl_select_ex(ViewContext *vc, GPUSelectBuffer *buffer, const rcti *input, eV3DSelectMode select_mode, @@ -753,7 +753,7 @@ finally: return hits; } -int view3d_opengl_select(const ViewContext *vc, +int view3d_opengl_select(ViewContext *vc, GPUSelectBuffer *buffer, const rcti *input, eV3DSelectMode select_mode, @@ -762,7 +762,7 @@ int view3d_opengl_select(const ViewContext *vc, return view3d_opengl_select_ex(vc, buffer, input, select_mode, select_filter, false); } -int view3d_opengl_select_with_id_filter(const ViewContext *vc, +int view3d_opengl_select_with_id_filter(ViewContext *vc, GPUSelectBuffer *buffer, const rcti *input, eV3DSelectMode select_mode, diff --git a/source/blender/editors/transform/CMakeLists.txt b/source/blender/editors/transform/CMakeLists.txt index 039786d86a0..68490e2917e 100644 --- a/source/blender/editors/transform/CMakeLists.txt +++ b/source/blender/editors/transform/CMakeLists.txt @@ -117,7 +117,6 @@ set(SRC set(LIB PRIVATE bf::animrig PRIVATE bf::blenfont - PRIVATE bf::extern::fmtlib bf_blenkernel PRIVATE bf::blenlib bf_bmesh diff --git a/source/blender/editors/transform/transform.cc b/source/blender/editors/transform/transform.cc index 1074ebef3b7..7188190f954 100644 --- a/source/blender/editors/transform/transform.cc +++ b/source/blender/editors/transform/transform.cc @@ -11,6 +11,8 @@ #include "MEM_guardedalloc.h" #include "DNA_gpencil_legacy_types.h" +#include "DNA_mask_types.h" +#include "DNA_mesh_types.h" #include "DNA_screen_types.h" #include "BLI_math_matrix.h" @@ -21,12 +23,14 @@ #include "BKE_editmesh.hh" #include "BKE_layer.hh" #include "BKE_mask.h" +#include "BKE_scene.h" #include "GPU_state.h" #include "ED_clip.hh" #include "ED_gpencil_legacy.hh" #include "ED_image.hh" +#include "ED_keyframing.hh" #include "ED_node.hh" #include "ED_screen.hh" #include "ED_space_api.hh" @@ -46,7 +50,7 @@ #include "RNA_access.hh" #include "BLF_api.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "transform.hh" #include "transform_constraints.hh" @@ -59,26 +63,10 @@ /* Disabling, since when you type you know what you are doing, * and being able to set it to zero is handy. */ -/* #define USE_NUM_NO_ZERO. */ +/* #define USE_NUM_NO_ZERO */ using namespace blender; -/* -------------------------------------------------------------------- */ -/** \name General Utils - * \{ */ - -/* Calculates projection vector based on a location. */ -void transform_view_vector_calc(const TransInfo *t, const float focus[3], float r_vec[3]) -{ - if (t->persp != RV3D_ORTHO) { - sub_v3_v3v3(r_vec, t->viewinv[3], focus); - } - else { - copy_v3_v3(r_vec, t->viewinv[2]); - } - normalize_v3(r_vec); -} - bool transdata_check_local_islands(TransInfo *t, short around) { if (t->options & (CTX_CURSOR | CTX_TEXTURE_SPACE)) { @@ -88,8 +76,6 @@ bool transdata_check_local_islands(TransInfo *t, short around) ELEM(t->obedit_type, OB_MESH, OB_GPENCIL_LEGACY)); } -/** \} */ - /* ************************** SPACE DEPENDENT CODE **************************** */ void setTransformViewMatrices(TransInfo *t) @@ -125,7 +111,7 @@ void setTransformViewAspect(TransInfo *t, float r_aspect[3]) ED_space_image_get_aspect(sima, &r_aspect[0], &r_aspect[1]); } else if (t->options & CTX_PAINT_CURVE) { - /* Pass. */ + /* pass */ } else { ED_space_image_get_uv_aspect(sima, &r_aspect[0], &r_aspect[1]); @@ -169,8 +155,8 @@ static void convertViewVec2D_mask(View2D *v2d, float r_vec[3], int dx, int dy) float mulx = BLI_rctf_size_x(&v2d->cur); float muly = BLI_rctf_size_y(&v2d->cur); - /* Difference with #convertViewVec2D. */ - /* Clamp w/h, mask only. */ + /* difference with convertViewVec2D */ + /* clamp w/h, mask only */ if (mulx / divx < muly / divy) { divy = divx; muly = mulx; @@ -179,7 +165,7 @@ static void convertViewVec2D_mask(View2D *v2d, float r_vec[3], int dx, int dy) divx = divy; mulx = muly; } - /* End difference. */ + /* end difference */ r_vec[0] = mulx * dx / divx; r_vec[1] = muly * dy / divy; @@ -241,7 +227,7 @@ void projectIntViewEx(TransInfo *t, const float vec[3], int adr[2], const eV3DPr if (t->spacetype == SPACE_VIEW3D) { if (t->region->regiontype == RGN_TYPE_WINDOW) { if (ED_view3d_project_int_global(t->region, vec, adr, flag) != V3D_PROJ_RET_OK) { - /* This is what was done in 2.64, perhaps we can be smarter? */ + /* this is what was done in 2.64, perhaps we can be smarter? */ adr[0] = int(2140000000.0f); adr[1] = int(2140000000.0f); } @@ -283,7 +269,7 @@ void projectIntViewEx(TransInfo *t, const float vec[3], int adr[2], const eV3DPr if (sact->flag & SACTION_DRAWTIME) { // vec[0] = vec[0] / ((t->scene->r.frs_sec / t->scene->r.frs_sec_base)); - /* Same as below. */ + /* same as below */ UI_view2d_view_to_region((View2D *)t->view, vec[0], vec[1], &out[0], &out[1]); } else @@ -302,7 +288,7 @@ void projectIntViewEx(TransInfo *t, const float vec[3], int adr[2], const eV3DPr adr[0] = out[0]; adr[1] = out[1]; } - else if (t->spacetype == SPACE_SEQ) { /* XXX not tested yet, but should work. */ + else if (t->spacetype == SPACE_SEQ) { /* XXX not tested yet, but should work */ int out[2] = {0, 0}; UI_view2d_view_to_region((View2D *)t->view, vec[0], vec[1], &out[0], &out[1]); @@ -363,7 +349,7 @@ void projectFloatViewEx(TransInfo *t, const float vec[3], float adr[2], const eV adr[1] = vec[1]; } else if (t->region->regiontype == RGN_TYPE_WINDOW) { - /* Allow points behind the view #33643. */ + /* allow points behind the view #33643. */ if (ED_view3d_project_float_global(t->region, vec, adr, flag) != V3D_PROJ_RET_OK) { /* XXX, 2.64 and prior did this, weak! */ adr[0] = t->region->winx / 2.0f; @@ -465,7 +451,7 @@ static void viewRedrawForce(const bContext *C, TransInfo *t) WM_event_add_notifier(C, NC_OBJECT | ND_TRANSFORM, nullptr); } - /* For real-time animation record - send notifiers recognized by animation editors. */ + /* For real-time animation record - send notifiers recognized by animation editors */ /* XXX: is this notifier a lame duck? */ if ((t->animtimer) && blender::animrig::is_autokey_on(t->scene)) { WM_event_add_notifier(C, NC_OBJECT | ND_KEYS, nullptr); @@ -524,7 +510,7 @@ static void viewRedrawForce(const bContext *C, TransInfo *t) if (ED_space_clip_check_show_trackedit(sc)) { MovieClip *clip = ED_space_clip_get_clip(sc); - /* Objects could be parented to tracking data, so send this for viewport refresh. */ + /* objects could be parented to tracking data, so send this for viewport refresh */ WM_event_add_notifier(C, NC_OBJECT | ND_TRANSFORM, nullptr); WM_event_add_notifier(C, NC_MOVIECLIP | NA_EDITED, clip); @@ -547,7 +533,7 @@ static void viewRedrawPost(bContext *C, TransInfo *t) WM_main_add_notifier(NC_ANIMATION | ND_KEYFRAME | NA_EDITED, nullptr); } - /* Redraw UV editor. */ + /* redraw UV editor */ const char uvcalc_correct_flag = ELEM(t->mode, TFM_VERT_SLIDE, TFM_EDGE_SLIDE) ? UVCALC_TRANSFORM_CORRECT_SLIDE : UVCALC_TRANSFORM_CORRECT; @@ -674,7 +660,7 @@ static bool transform_modal_item_poll(const wmOperator *op, int value) return t->data_type == &TransConvertType_Tracking; } if (value == TFM_MODAL_VERT_EDGE_SLIDE && - (!ELEM(t->data_type, &TransConvertType_Mesh, &TransConvertType_MeshUV) || + (t->data_type != &TransConvertType_Mesh || /* WORKAROUND: Avoid repeated keys in status bar. * * Previously, `Vert/Edge Slide` and `Move` were triggered by the same modal key. @@ -710,7 +696,7 @@ static bool transform_modal_item_poll(const wmOperator *op, int value) case TFM_MODAL_EDIT_SNAP_SOURCE_OFF: return false; case TFM_MODAL_EDIT_SNAP_SOURCE_ON: { - if (!ELEM(t->spacetype, SPACE_VIEW3D, SPACE_IMAGE)) { + if (t->spacetype != SPACE_VIEW3D) { return false; } if (!ELEM( @@ -901,7 +887,7 @@ static bool transform_event_modal_constraint(TransInfo *t, short modal_type) int constraint_new; const char *msg_2d = "", *msg_3d = ""; - /* Initialize. */ + /* Initialize */ switch (modal_type) { case TFM_MODAL_AXIS_X: msg_2d = IFACE_("along X"); @@ -931,7 +917,7 @@ static bool transform_event_modal_constraint(TransInfo *t, short modal_type) constraint_new = CON_AXIS0 | CON_AXIS1; break; default: - /* Invalid key. */ + /* Invalid key */ return false; } @@ -1004,7 +990,7 @@ int transformEvent(TransInfo *t, const wmEvent *event) else if (!is_navigating && event->type == MOUSEMOVE) { t->mval = float2(event->mval); - /* Use this for soft redraw. Might cause flicker in object mode. */ + /* Use this for soft redraw. Might cause flicker in object mode */ // t->redraw |= TREDRAW_SOFT; t->redraw |= TREDRAW_HARD; @@ -1018,8 +1004,8 @@ int transformEvent(TransInfo *t, const wmEvent *event) t->redraw |= handleSnapping(t, event); handled = true; } - /* Handle modal keymap first. */ - /* Enforce redraw of transform when modifiers are used. */ + /* handle modal keymap first */ + /* enforce redraw of transform when modifiers are used */ else if (event->type == EVT_MODAL_MAP) { switch (event->val) { case TFM_MODAL_CANCEL: @@ -1040,7 +1026,7 @@ int transformEvent(TransInfo *t, const wmEvent *event) case TFM_MODAL_TRACKBALL: case TFM_MODAL_ROTATE_NORMALS: case TFM_MODAL_VERT_EDGE_SLIDE: - /* Only switch when. */ + /* only switch when... */ if (!transform_mode_is_changeable(t->mode)) { break; } @@ -1311,8 +1297,8 @@ int transformEvent(TransInfo *t, const wmEvent *event) } else if (event->prev_val == KM_PRESS) { t->modifiers |= MOD_PRECISION; + /* Shift is modifier for higher precision transform. */ t->mouse.precision = true; - t->redraw |= TREDRAW_HARD; } else if (event->prev_val == KM_RELEASE) { @@ -1378,7 +1364,7 @@ int transformEvent(TransInfo *t, const wmEvent *event) break; case EVT_LEFTALTKEY: case EVT_RIGHTALTKEY: - if (ELEM(t->spacetype, SPACE_SEQ, SPACE_VIEW3D, SPACE_IMAGE)) { + if (ELEM(t->spacetype, SPACE_SEQ, SPACE_VIEW3D)) { t->flag |= T_ALT_TRANSFORM; t->redraw |= TREDRAW_HARD; handled = true; @@ -1388,7 +1374,7 @@ int transformEvent(TransInfo *t, const wmEvent *event) break; } - /* Snapping key events. */ + /* Snapping key events */ t->redraw |= handleSnapping(t, event); } else if (event->val == KM_RELEASE) { @@ -1396,7 +1382,7 @@ int transformEvent(TransInfo *t, const wmEvent *event) case EVT_LEFTALTKEY: case EVT_RIGHTALTKEY: /* TODO: Modal Map */ - if (ELEM(t->spacetype, SPACE_SEQ, SPACE_VIEW3D, SPACE_IMAGE)) { + if (ELEM(t->spacetype, SPACE_SEQ, SPACE_VIEW3D)) { t->flag &= ~T_ALT_TRANSFORM; t->redraw |= TREDRAW_HARD; handled = true; @@ -1404,13 +1390,13 @@ int transformEvent(TransInfo *t, const wmEvent *event) break; } - /* Confirm transform if launch key is released after mouse move. */ + /* confirm transform if launch key is released after mouse move */ if ((t->flag & T_RELEASE_CONFIRM) && event->type == t->launch_event) { t->state = TRANS_CONFIRM; } } - /* Per transform event, if present. */ + /* Per transform event, if present */ if (t->mode_info && t->mode_info->handle_event_fn && (!handled || /* Needed for vertex slide, see #38756. */ @@ -1453,12 +1439,12 @@ bool calculateTransformCenter(bContext *C, int centerMode, float cent3d[3], floa initTransInfo(C, t, nullptr, nullptr); - /* Avoid doing connectivity lookups (when V3D_AROUND_LOCAL_ORIGINS is set). */ + /* avoid doing connectivity lookups (when V3D_AROUND_LOCAL_ORIGINS is set) */ t->around = V3D_AROUND_CENTER_BOUNDS; - create_trans_data(C, t); /* Make TransData structs from selection. */ + create_trans_data(C, t); /* make TransData structs from selection */ - t->around = centerMode; /* Override user-defined mode. */ + t->around = centerMode; /* override user-defined mode. */ if (t->data_len_all == 0) { success = false; @@ -1473,12 +1459,12 @@ bool calculateTransformCenter(bContext *C, int centerMode, float cent3d[3], floa } if (cent3d) { - /* Copy center from constraint center. Transform center can be local. */ + /* Copy center from constraint center. Transform center can be local */ copy_v3_v3(cent3d, t->center_global); } } - /* Aftertrans does insert keyframes, and clears base flags; doesn't read transdata. */ + /* aftertrans does insert keyframes, and clears base flags; doesn't read transdata */ special_aftertrans_update(C, t); postTrans(C, t); @@ -1587,15 +1573,15 @@ static void drawAutoKeyWarning(TransInfo *t, ARegion *region) xco = (rect->xmax - U.widget_unit) - int(printable_size[0]) - offset; yco = (rect->ymax - U.widget_unit); - /* Warning text (to clarify meaning of overlays) - * - Original color was red to match the icon, but that clashes badly with a less nasty border. + /* warning text (to clarify meaning of overlays) + * - original color was red to match the icon, but that clashes badly with a less nasty border */ uchar color[3]; UI_GetThemeColorShade3ubv(TH_TEXT_HI, -50, color); BLF_color3ubv(font_id, color); BLF_draw_default_shadowed(xco, yco, 0.0f, printable, BLF_DRAW_STR_DUMMY_MAX); - /* Auto-key recording icon. */ + /* autokey recording icon... */ GPU_blend(GPU_BLEND_ALPHA); xco -= U.widget_unit; @@ -1620,7 +1606,7 @@ static void drawTransformPixel(const bContext * /*C*/, ARegion *region, void *ar BKE_view_layer_synced_ensure(scene, view_layer); Object *ob = BKE_view_layer_active_object_get(view_layer); - /* Draw auto-key-framing hint in the corner + /* draw auto-key-framing hint in the corner * - only draw if enabled (advanced users may be distracted/annoyed), * for objects that will be auto-keyframed (no point otherwise), * AND only for the active region (as showing all is too overwhelming) @@ -1662,9 +1648,9 @@ void saveTransform(bContext *C, TransInfo *t, wmOperator *op) } } - /* If modal, save settings back in scene if not set as operator argument. */ + /* If modal, save settings back in scene if not set as operator argument */ if ((t->flag & T_MODAL) || (op->flag & OP_IS_REPEAT)) { - /* Save settings if not set in operator. */ + /* save settings if not set in operator */ if ((prop = RNA_struct_find_property(op->ptr, "use_proportional_edit")) && !RNA_property_is_set(op->ptr, prop)) { @@ -1723,7 +1709,7 @@ void saveTransform(bContext *C, TransInfo *t, wmOperator *op) } } - /* Save back mode in case we're in the generic operator. */ + /* Save back mode in case we're in the generic operator */ if ((prop = RNA_struct_find_property(op->ptr, "mode"))) { RNA_property_enum_set(op->ptr, prop, t->mode); } @@ -1922,7 +1908,7 @@ bool initTransform(bContext *C, TransInfo *t, wmOperator *op, const wmEvent *eve t->context = C; - /* Added initialize, for external calls to set stuff in TransInfo, like undo string. */ + /* added initialize, for external calls to set stuff in TransInfo, like undo string */ t->state = TRANS_STARTING; @@ -2021,7 +2007,7 @@ bool initTransform(bContext *C, TransInfo *t, wmOperator *op, const wmEvent *eve } if (event) { - /* Keymap for shortcut header prints. */ + /* keymap for shortcut header prints */ t->keymap = WM_keymap_active(CTX_wm_manager(C), op->type->modalkeymap); /* Stupid code to have Ctrl-Click on gizmo work ok. @@ -2075,17 +2061,17 @@ bool initTransform(bContext *C, TransInfo *t, wmOperator *op, const wmEvent *eve } } - initSnapping(t, op); /* Initialize snapping data AFTER mode flags. */ + initSnapping(t, op); /* Initialize snapping data AFTER mode flags */ initSnapSpatial(t, t->snap_spatial, &t->snap_spatial_precision); /* EVIL! pose-mode code can switch translation to rotate when 1 bone is selected. - * will be removed (ton). */ + * will be removed (ton) */ - /* EVIL2: we gave as argument also texture space context bit... was cleared. */ + /* EVIL2: we gave as argument also texture space context bit... was cleared */ /* EVIL3: extend mode for animation editors also switches modes... - * but is best way to avoid duplicate code. */ + * but is best way to avoid duplicate code */ mode = t->mode; calculatePropRatio(t); @@ -2112,7 +2098,7 @@ bool initTransform(bContext *C, TransInfo *t, wmOperator *op, const wmEvent *eve return false; } - /* Transformation axis from operator. */ + /* Transformation axis from operator */ if ((prop = RNA_struct_find_property(op->ptr, "orient_axis")) && RNA_property_is_set(op->ptr, prop)) { @@ -2124,7 +2110,7 @@ bool initTransform(bContext *C, TransInfo *t, wmOperator *op, const wmEvent *eve t->orient_axis_ortho = RNA_property_enum_get(op->ptr, prop); } - /* Constraint init from operator. */ + /* Constraint init from operator */ if (t->con.mode & CON_APPLY) { setUserConstraint(t, t->con.mode, "%s"); } @@ -2181,7 +2167,7 @@ void transformApply(bContext *C, TransInfo *t) if (t->redraw == TREDRAW_HARD) { selectConstraint(t); if (t->mode_info) { - t->mode_info->transform_fn(t); /* Calls #recalc_data(). */ + t->mode_info->transform_fn(t); /* calls recalc_data() */ } } @@ -2191,7 +2177,7 @@ void transformApply(bContext *C, TransInfo *t) t->redraw = TREDRAW_NOTHING; - /* If auto confirm is on, break after one pass. */ + /* If auto confirm is on, break after one pass */ if (t->options & CTX_AUTOCONFIRM) { t->state = TRANS_CONFIRM; } @@ -2206,10 +2192,10 @@ int transformEnd(bContext *C, TransInfo *t) t->context = C; if (!ELEM(t->state, TRANS_STARTING, TRANS_RUNNING)) { - /* Handle restoring objects. */ + /* handle restoring objects */ if (t->state == TRANS_CANCEL) { exit_code = OPERATOR_CANCELLED; - restoreTransObjects(t); /* Calls #recalc_data(). */ + restoreTransObjects(t); /* calls recalc_data() */ } else { if (t->flag & T_CLNOR_REBUILD) { @@ -2221,13 +2207,13 @@ int transformEnd(bContext *C, TransInfo *t) exit_code = OPERATOR_FINISHED; } - /* Aftertrans does insert keyframes, and clears base flags; doesn't read transdata. */ + /* aftertrans does insert keyframes, and clears base flags; doesn't read transdata */ special_aftertrans_update(C, t); /* Free data, also handles overlap [in freeTransCustomData()]. */ postTrans(C, t); - /* Send events out for redraws. */ + /* send events out for redraws */ viewRedrawPost(C, t); viewRedrawForce(C, t); @@ -2242,12 +2228,12 @@ int transformEnd(bContext *C, TransInfo *t) bool checkUseAxisMatrix(TransInfo *t) { - /* Currently only checks for editmode. */ + /* currently only checks for editmode */ if (t->flag & T_EDIT) { if ((t->around == V3D_AROUND_LOCAL_ORIGINS) && ELEM(t->obedit_type, OB_MESH, OB_CURVES_LEGACY, OB_MBALL, OB_ARMATURE)) { - /* Not all editmode supports axis-matrix. */ + /* not all editmode supports axis-matrix */ return true; } } diff --git a/source/blender/editors/transform/transform.hh b/source/blender/editors/transform/transform.hh index 0f1ad26a45b..22b5a35f53c 100644 --- a/source/blender/editors/transform/transform.hh +++ b/source/blender/editors/transform/transform.hh @@ -80,7 +80,7 @@ enum eTContext { CTX_OBMODE_XFORM_OBDATA = (1 << 13), /** Transform object parents without moving their children. */ CTX_OBMODE_XFORM_SKIP_CHILDREN = (1 << 14), - /** Enable edge scrolling in 2D views. */ + /** Enable edge scrolling in 2D views */ CTX_VIEW2D_EDGE_PAN = (1 << 15), }; ENUM_OPERATORS(eTContext, CTX_VIEW2D_EDGE_PAN) @@ -91,7 +91,7 @@ enum eTFlag { T_EDIT = 1 << 0, /** Transform points, having no rotation/scale. */ T_POINTS = 1 << 1, - /** Restrictions flags. */ + /** restrictions flags */ T_NO_CONSTRAINT = 1 << 2, T_NULL_ONE = 1 << 3, @@ -140,7 +140,7 @@ enum eTFlag { /** Use drag-start position of the event, otherwise use the cursor coordinates (unmodified). */ T_EVENT_DRAG_START = 1 << 22, - /** No cursor wrapping on region bounds. */ + /** No cursor wrapping on region bounds */ T_NO_CURSOR_WRAP = 1 << 23, /** Do not display Xform gizmo even though it is available. */ @@ -299,22 +299,22 @@ struct TransSnapPoint { }; struct TransSnap { - /* Snapping options stored as flags. */ + /* Snapping options stored as flags */ eSnapFlag flag; - /* Method(s) used for snapping source to target. */ + /* Method(s) used for snapping source to target */ eSnapMode mode; - /* Part of source to snap to target. */ + /* Part of source to snap to target */ eSnapSourceOP source_operation; - /* Determines which objects are possible target. */ + /* Determines which objects are possible target */ eSnapTargetOP target_operation; short face_nearest_steps; eTSnap status; /* Snapped Element Type (currently for objects only). */ eSnapMode source_type; eSnapMode target_type; - /** Snapping from this point (in global-space). */ + /** snapping from this point (in global-space). */ float snap_source[3]; - /** To this point (in global-space). */ + /** to this point (in global-space). */ float snap_target[3]; float snap_target_grid[3]; float snapNormal[3]; @@ -359,7 +359,7 @@ struct TransCon { const TransDataContainer *tc, const TransData *td, float r_smat[3][3]); - /** Apply function pointer for rotation transformation. */ + /** Apply function pointer for rotation transformation */ void (*applyRot)(const TransInfo *t, const TransDataContainer *tc, const TransData *td, @@ -457,10 +457,10 @@ struct TransDataContainer { float mat3[3][3]; float imat3[3][3]; - /** Normalized #mat3. */ + /** Normalized 'mat3' */ float mat3_unit[3][3]; - /** If `t->flag & T_POSE`, this denotes pose object. */ + /** if 't->flag & T_POSE', this denotes pose object */ Object *poseobj; /** Center of transformation (in local-space), Calculated from #TransInfo.center_global. */ @@ -474,8 +474,8 @@ struct TransDataContainer { /** * Store matrix, this avoids having to have duplicate check all over - * Typically: 'obedit->object_to_world().ptr()' or 'poseobj->object_to_world().ptr()', but may be - * used elsewhere too. + * Typically: 'obedit->object_to_world' or 'poseobj->object_to_world', but may be used elsewhere + * too. */ bool use_local_mat; @@ -534,20 +534,20 @@ struct TransInfo { /** Mouse input. */ MouseInput mouse; - /** Proportional circle radius. */ + /** proportional circle radius. */ float prop_size; - /** Proportional falloff text. */ + /** proportional falloff text. */ char proptext[20]; /** * Spaces using non 1:1 aspect, (UV's, F-curve, movie-clip... etc). * use for conversion and snapping. */ float aspect[3]; - /** Center of transformation (in global-space). */ + /** center of transformation (in global-space) */ float center_global[3]; - /** Center in screen coordinates. */ + /** center in screen coordinates. */ float center2d[2]; - /** Maximum index on the input vector. */ + /** maximum index on the input vector. */ short idx_max; /** Snapping Gears. */ float snap[2]; @@ -558,36 +558,36 @@ struct TransInfo { * modifier is enabled for snap to grid or incremental snap. */ float snap_spatial_precision; - /** Mouse side of the current frame, 'L', 'R' or 'B'. */ + /** Mouse side of the current frame, 'L', 'R' or 'B' */ char frame_side; - /** Copy from #RegionView3D, prevents feedback. */ + /** copy from #RegionView3D, prevents feedback. */ float viewmat[4][4]; - /** And to make sure we don't have to. */ + /** and to make sure we don't have to. */ float viewinv[4][4]; /** Access #RegionView3D from other space types. */ float persmat[4][4]; float persinv[4][4]; short persp; short around; - /** Space-type where transforming is. */ + /** space-type where transforming is. */ char spacetype; /** Type of active object being edited. */ short obedit_type; - /** Translation, to show for widget. */ + /** translation, to show for widget. */ float vec[3]; /** Rotate/re-scale, to show for widget. */ float mat[3][3]; - /** Orientation matrix of the current space. */ + /** orientation matrix of the current space. */ float spacemtx[3][3]; float spacemtx_inv[3][3]; - /** Name of the current space, MAX_NAME. */ + /** name of the current space, MAX_NAME. */ char spacename[64]; /*************** NEW STUFF *********************/ - /** Event type used to launch transform. */ + /** event type used to launch transform. */ short launch_event; /** * Is the actual launch event a drag event? @@ -633,7 +633,7 @@ struct TransInfo { /** Secondary axis, shear uses this. */ int orient_axis_ortho; - /** Remove elements if operator is canceled. */ + /** remove elements if operator is canceled. */ bool remove_on_cancel; void *view; @@ -649,11 +649,11 @@ struct TransInfo { wmTimer *animtimer; /** Needed so we can perform a look up for header text. */ wmKeyMap *keymap; - /** Assign from the operator, or can be NULL. */ + /** assign from the operator, or can be NULL. */ ReportList *reports; - /** Current mouse position. */ + /** current mouse position. */ blender::float2 mval; - /** Use for 3d view. */ + /** use for 3d view. */ float zfac; void *draw_handle_view; void *draw_handle_pixel; @@ -716,10 +716,9 @@ void transform_final_value_get(const TransInfo *t, float *value, int value_num); /** \} */ /* -------------------------------------------------------------------- */ -/** \name General Utils +/** \name TransData Creation and General Handling * \{ */ -void transform_view_vector_calc(const TransInfo *t, const float focus[3], float r_vec[3]); bool transdata_check_local_islands(TransInfo *t, short around); /** \} */ @@ -779,8 +778,7 @@ void initTransInfo(bContext *C, TransInfo *t, wmOperator *op, const wmEvent *eve */ void freeTransCustomDataForMode(TransInfo *t); /** - * Here I would suggest only #TransInfo related issues, like free data & reset variables. - * Not redraws. + * Here I would suggest only #TransInfo related issues, like free data & reset vars. Not redraws. */ void postTrans(bContext *C, TransInfo *t); /** @@ -789,7 +787,7 @@ void postTrans(bContext *C, TransInfo *t); void resetTransModal(TransInfo *t); void resetTransRestrictions(TransInfo *t); -/* DRAWLINE options flags. */ +/* DRAWLINE options flags */ #define DRAWLIGHT 1 void applyTransObjects(TransInfo *t); @@ -805,7 +803,7 @@ void calculateCenter(TransInfo *t); */ void tranformViewUpdate(TransInfo *t); -/* API functions for getting center points. */ +/* API functions for getting center points */ void calculateCenterBound(TransInfo *t, float r_center[3]); void calculateCenterMedian(TransInfo *t, float r_center[3]); void calculateCenterCursor(TransInfo *t, float r_center[3]); diff --git a/source/blender/editors/transform/transform_constraints.cc b/source/blender/editors/transform/transform_constraints.cc index ec6f144c25e..c8e9b626b34 100644 --- a/source/blender/editors/transform/transform_constraints.cc +++ b/source/blender/editors/transform/transform_constraints.cc @@ -27,9 +27,11 @@ #include "BLI_string.h" #include "BLI_utildefines.h" +#include "BKE_context.hh" + #include "ED_view3d.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "UI_resources.hh" #include "UI_view2d.hh" @@ -83,7 +85,7 @@ static void view_vector_calc(const TransInfo *t, const float focus[3], float r_v /* ************************** CONSTRAINTS ************************* */ #define CONSTRAIN_EPSILON 0.0001f -static void constraint_plane_normal_calc(const TransInfo *t, float r_plane_no[3]) +static void constraint_plane_calc(const TransInfo *t, float r_plane[4]) { const float *constraint_vector[2]; int n = 0; @@ -97,8 +99,9 @@ static void constraint_plane_normal_calc(const TransInfo *t, float r_plane_no[3] } BLI_assert(n == 2); - cross_v3_v3v3(r_plane_no, constraint_vector[0], constraint_vector[1]); - normalize_v3(r_plane_no); + cross_v3_v3v3(r_plane, constraint_vector[0], constraint_vector[1]); + normalize_v3(r_plane); + r_plane[3] = -dot_v3v3(r_plane, t->center_global); } void constraintNumInput(TransInfo *t, float vec[3]) @@ -150,7 +153,7 @@ static void viewAxisCorrectCenter(const TransInfo *t, float t_con_center[3]) { if (t->spacetype == SPACE_VIEW3D) { // View3D *v3d = t->area->spacedata.first; - const float min_dist = 1.0f; /* `v3d->clip_start`. */ + const float min_dist = 1.0f; /* v3d->clip_start; */ float dir[3]; float l; @@ -187,7 +190,7 @@ static void axisProjection(const TransInfo *t, copy_v3_v3(t_con_center, t->center_global); - /* Checks for center being too close to the view center. */ + /* checks for center being too close to the view center */ viewAxisCorrectCenter(t, t_con_center); angle = fabsf(angle_v3v3(axis, t->viewinv[2])); @@ -197,7 +200,7 @@ static void axisProjection(const TransInfo *t, /* For when view is parallel to constraint... will cause NaNs otherwise * So we take vertical motion in 3D space and apply it to the - * constraint axis. Nice for camera grab + MMB. */ + * constraint axis. Nice for camera grab + MMB */ if (angle < DEG2RADF(5.0f)) { project_v3_v3v3(vec, in, t->viewinv[1]); factor = dot_v3v3(t->viewinv[1], vec) * 2.0f; @@ -210,7 +213,7 @@ static void axisProjection(const TransInfo *t, factor *= factor; } - /* -factor makes move down going backwards. */ + /* -factor makes move down going backwards */ normalize_v3_v3_length(out, axis, -factor); } else { @@ -227,7 +230,7 @@ static void axisProjection(const TransInfo *t, add_v3_v3v3(v, vec, t_con_center); view_vector_calc(t, v, norm); - /* Give arbitrary large value if projection is impossible. */ + /* give arbitrary large value if projection is impossible */ factor = dot_v3v3(axis, norm); if (1.0f - fabsf(factor) < 0.0002f) { copy_v3_v3(out, axis); @@ -250,7 +253,8 @@ static void axisProjection(const TransInfo *t, BLI_assert(0); } - /* Possible some values become nan when viewpoint and object are both zero. */ + /* possible some values become nan when + * viewpoint and object are both zero */ if (!isfinite(out[0])) { out[0] = 0.0f; } @@ -267,16 +271,14 @@ static void axisProjection(const TransInfo *t, /** * Snap to the intersection between the edge direction and the constraint plane. */ -static void constraint_snap_plane_to_edge(const TransInfo *t, - const float plane_no[3], - float r_out[3]) +static void constraint_snap_plane_to_edge(const TransInfo *t, const float plane[4], float r_out[3]) { float lambda; const float *edge_snap_point = t->tsnap.snap_target; const float *edge_dir = t->tsnap.snapNormal; - bool is_aligned = fabsf(dot_v3v3(edge_dir, plane_no)) < CONSTRAIN_EPSILON; - if (!is_aligned && isect_ray_plane_v3_factor( - edge_snap_point, edge_dir, t->tsnap.snap_source, plane_no, &lambda)) + bool is_aligned = fabsf(dot_v3v3(edge_dir, plane)) < CONSTRAIN_EPSILON; + if (!is_aligned && + isect_ray_plane_v3_factor(edge_snap_point, edge_dir, t->tsnap.snap_source, plane, &lambda)) { madd_v3_v3v3fl(r_out, edge_snap_point, edge_dir, lambda); sub_v3_v3(r_out, t->tsnap.snap_source); @@ -318,12 +320,12 @@ void transform_constraint_snap_axis_to_face(const TransInfo *t, float r_out[3]) { float lambda; + float face_plane[4]; const float *face_snap_point = t->tsnap.snap_target; const float *face_normal = t->tsnap.snapNormal; - bool is_aligned = fabsf(dot_v3v3(axis, face_normal)) < CONSTRAIN_EPSILON; - if (!is_aligned && - isect_ray_plane_v3_factor(t->tsnap.snap_source, axis, face_snap_point, face_normal, &lambda)) - { + plane_from_point_normal_v3(face_plane, face_snap_point, face_normal); + bool is_aligned = fabsf(dot_v3v3(axis, face_plane)) < CONSTRAIN_EPSILON; + if (!is_aligned && isect_ray_plane_v3(t->tsnap.snap_source, axis, face_plane, &lambda, false)) { mul_v3_v3fl(r_out, axis, lambda); } } @@ -332,18 +334,18 @@ void transform_constraint_snap_axis_to_face(const TransInfo *t, * Return true if the 2x axis are both aligned when projected into the view. * In this case, we can't usefully project the cursor onto the plane. */ -static bool isPlaneProjectionViewAligned(const TransInfo *t, const float plane_no[3]) +static bool isPlaneProjectionViewAligned(const TransInfo *t, const float plane[4]) { const float eps = 0.001f; float view_to_plane[3]; view_vector_calc(t, t->center_global, view_to_plane); - float factor = dot_v3v3(plane_no, view_to_plane); + float factor = dot_v3v3(plane, view_to_plane); return fabsf(factor) < eps; } static void planeProjection(const TransInfo *t, - const float plane_no[3], + const float plane[4], const float in[3], float out[3]) { @@ -353,7 +355,7 @@ static void planeProjection(const TransInfo *t, add_v3_v3v3(pos, in, t->center_global); view_vector_calc(t, pos, view_vec); - if (isect_ray_plane_v3_factor(pos, view_vec, t->center_global, plane_no, &factor)) { + if (isect_ray_plane_v3(pos, view_vec, plane, &factor, false)) { madd_v3_v3v3fl(out, in, view_vec, factor); } } @@ -419,19 +421,19 @@ static void applyAxisConstraintVec(const TransInfo *t, const int dims = getConstraintSpaceDimension(t); if (dims == 2) { if (!is_zero_v3(out)) { - float plane_no[3]; - constraint_plane_normal_calc(t, plane_no); + float plane[4]; + constraint_plane_calc(t, plane); if (is_snap_to_edge) { - constraint_snap_plane_to_edge(t, plane_no, out); + constraint_snap_plane_to_edge(t, plane, out); } else if (is_snap_to_face) { /* Disabled, as it has not proven to be really useful. (See #82386). */ // constraint_snap_plane_to_face(t, plane, out); } - else if (!isPlaneProjectionViewAligned(t, plane_no)) { + else if (!isPlaneProjectionViewAligned(t, plane)) { /* View alignment correction. */ - planeProjection(t, plane_no, in, out); + planeProjection(t, plane, in, out); } } } @@ -578,7 +580,7 @@ static void constraints_rotation_impl(const TransInfo *t, copy_v3_v3(r_axis, axismtx[2]); break; } - /* Don't flip axis if asked to or if num input. */ + /* don't flip axis if asked to or if num input */ if (r_angle && !((mode & CON_NOFLIP) || hasNumInput(&t->num) || (t->flag & T_INPUT_IS_VALUES_FINAL))) { @@ -637,7 +639,7 @@ static void applyObjectConstraintRot(const TransInfo *t, float tmp_axismtx[3][3]; const float(*axismtx)[3]; - /* On setup call, use first object. */ + /* on setup call, use first object */ if (td == nullptr) { BLI_assert(tc == nullptr); tc = TRANS_DATA_CONTAINER_FIRST_OK(t); @@ -845,7 +847,7 @@ void drawConstraint(TransInfo *t) GPU_viewport_size_get_f(viewport_size); immUniform2f("viewport_size", viewport_size[2], viewport_size[3]); - immUniform1i("colors_len", 0); /* "simple" mode. */ + immUniform1i("colors_len", 0); /* "simple" mode */ immUniformColor4f(1.0f, 1.0f, 1.0f, 1.0f); immUniform1f("dash_width", 2.0f); immUniform1f("udash_factor", 0.5f); @@ -898,7 +900,7 @@ void drawPropCircle(TransInfo *t) GPU_matrix_push(); if (t->spacetype == SPACE_VIEW3D) { - /* Pass. */ + /* pass */ } else if (t->spacetype == SPACE_IMAGE) { GPU_matrix_scale_2f(1.0f / t->aspect[0], 1.0f / t->aspect[1]); @@ -989,14 +991,14 @@ static void drawObjectConstraint(TransInfo *t) const float(*axismtx)[3]; if (t->flag & T_PROP_EDIT) { - /* We're sorted, so skip the rest. */ + /* we're sorted, so skip the rest */ if (td->factor == 0.0f) { break; } } if (t->options & CTX_GPENCIL_STROKES) { - /* Only draw a constraint line for one point, otherwise we can't see anything. */ + /* only draw a constraint line for one point, otherwise we can't see anything */ if ((options & DRAWLIGHT) == 0) { break; } @@ -1102,7 +1104,7 @@ static void setNearestAxis2d(TransInfo *t) /* Clear any prior constraint flags. */ t->con.mode &= ~(CON_AXIS0 | CON_AXIS1 | CON_AXIS2); - /* No correction needed... just use whichever one is lower. */ + /* no correction needed... just use whichever one is lower */ blender::float2 dvec = t->mval - t->mouse.imval; if (abs(dvec.x) < abs(dvec.y)) { t->con.mode |= CON_AXIS1; @@ -1124,7 +1126,7 @@ static void setNearestAxis3d(TransInfo *t) float len[3]; int i; - /* Calculate mouse movement. */ + /* calculate mouse movement */ mvec[0] = t->mval[0] - t->mouse.imval[0]; mvec[1] = t->mval[1] - t->mouse.imval[1]; mvec[2] = 0.0f; @@ -1144,7 +1146,7 @@ static void setNearestAxis3d(TransInfo *t) copy_v3_v3(axis, t->spacemtx[i]); mul_v3_fl(axis, zfac); - /* Now we can project to get window coordinate. */ + /* now we can project to get window coordinate */ add_v3_v3(axis, t->center_global); projectFloatView(t, axis, axis_2d); @@ -1197,13 +1199,13 @@ void setNearestAxis(TransInfo *t) { eTConstraint mode_prev = t->con.mode; - /* Constraint setting - depends on spacetype. */ + /* constraint setting - depends on spacetype */ if (t->spacetype == SPACE_VIEW3D) { - /* 3d-view. */ + /* 3d-view */ setNearestAxis3d(t); } else { - /* Assume that this means a 2D-Editor. */ + /* assume that this means a 2D-Editor */ setNearestAxis2d(t); } diff --git a/source/blender/editors/transform/transform_convert.cc b/source/blender/editors/transform/transform_convert.cc index 71b347c5270..555d0a85281 100644 --- a/source/blender/editors/transform/transform_convert.cc +++ b/source/blender/editors/transform/transform_convert.cc @@ -20,15 +20,20 @@ #include "BLI_math_vector.hh" #include "BKE_action.h" -#include "BKE_anim_data.hh" +#include "BKE_anim_data.h" #include "BKE_context.hh" -#include "BKE_global.hh" +#include "BKE_fcurve.h" +#include "BKE_global.h" +#include "BKE_image.h" #include "BKE_layer.hh" #include "BKE_lib_id.hh" +#include "BKE_main.hh" #include "BKE_modifier.hh" #include "BKE_nla.h" -#include "BKE_scene.hh" +#include "BKE_scene.h" +#include "ED_keyframes_edit.hh" +#include "ED_keyframing.hh" #include "ED_particle.hh" #include "ED_screen.hh" #include "ED_screen_types.hh" @@ -43,6 +48,7 @@ #include "DEG_depsgraph_build.hh" #include "transform.hh" +#include "transform_snap.hh" /* Own include. */ #include "transform_convert.hh" @@ -213,7 +219,7 @@ static void set_prop_dist(TransInfo *t, const bool with_dist) float _proj_vec[3]; const float *proj_vec = nullptr; - /* Support for face-islands. */ + /* support for face-islands */ const bool use_island = transdata_check_local_islands(t, t->around); if (t->flag & T_PROP_PROJECTED) { @@ -306,17 +312,17 @@ static void set_prop_dist(TransInfo *t, const bool with_dist) /** \name Pose Mode (Auto-IK) * \{ */ -/** Adjust pose-channel's auto-ik chainlen. */ +/* adjust pose-channel's auto-ik chainlen */ static bool pchan_autoik_adjust(bPoseChannel *pchan, short chainlen) { bool changed = false; - /* Don't bother to search if no valid constraints. */ + /* don't bother to search if no valid constraints */ if ((pchan->constflag & (PCHAN_HAS_IK | PCHAN_HAS_NO_TARGET)) == 0) { return changed; } - /* Check if pchan has ik-constraint. */ + /* check if pchan has ik-constraint */ LISTBASE_FOREACH (bConstraint *, con, &pchan->constraints) { if (con->flag & (CONSTRAINT_DISABLE | CONSTRAINT_OFF)) { continue; @@ -324,9 +330,9 @@ static bool pchan_autoik_adjust(bPoseChannel *pchan, short chainlen) if (con->type == CONSTRAINT_TYPE_KINEMATIC && (con->enforce != 0.0f)) { bKinematicConstraint *data = static_cast(con->data); - /* Only accept if a temporary one (for auto-IK). */ + /* only accept if a temporary one (for auto-ik) */ if (data->flag & CONSTRAINT_IK_TEMP) { - /* `chainlen` is new `chainlen`, but is limited by maximum `chainlen`. */ + /* chainlen is new chainlen, but is limited by maximum chainlen */ const int old_rootbone = data->rootbone; if ((chainlen == 0) || (chainlen > data->max_rootbone)) { data->rootbone = data->max_rootbone; @@ -348,13 +354,13 @@ void transform_autoik_update(TransInfo *t, short mode) short *chainlen = &t->settings->autoik_chainlen; - /* `mode` determines what change to apply to `chainlen`. */ + /* mode determines what change to apply to chainlen */ if (mode == 1) { - /* `mode==1` is from WHEELMOUSEDOWN: increases len. */ + /* mode=1 is from WHEELMOUSEDOWN... increases len */ (*chainlen)++; } else if (mode == -1) { - /* `mode==-1` is from WHEELMOUSEUP: decreases len. */ + /* mode==-1 is from WHEELMOUSEUP... decreases len */ if (*chainlen > 0) { (*chainlen)--; } @@ -364,12 +370,12 @@ void transform_autoik_update(TransInfo *t, short mode) } } - /* Apply to all pose-channels. */ + /* apply to all pose-channels */ bool changed = false; FOREACH_TRANS_DATA_CONTAINER (t, tc) { - /* Sanity checks (don't assume `t->poseobj` is set, or that it is an armature). */ + /* sanity checks (don't assume t->poseobj is set, or that it is an armature) */ if (ELEM(nullptr, tc->poseobj, tc->poseobj->pose)) { continue; } @@ -461,7 +467,7 @@ TransDataCurveHandleFlags *initTransDataCurveHandles(TransData *td, BezTriple *b MEM_mallocN(sizeof(TransDataCurveHandleFlags), "CuHandle Data")); hdata->ih1 = bezt->h1; hdata->h1 = &bezt->h1; - hdata->ih2 = bezt->h2; /* In case the second is not selected. */ + hdata->ih2 = bezt->h2; /* in case the second is not selected */ hdata->h2 = &bezt->h2; return hdata; } @@ -524,12 +530,12 @@ char transform_convert_frame_side_dir_get(TransInfo *t, float cframe) bool FrameOnMouseSide(char side, float frame, float cframe) { - /* Both sides, so it doesn't matter. */ + /* both sides, so it doesn't matter */ if (side == 'B') { return true; } - /* Only on the named side. */ + /* only on the named side */ if (side == 'R') { return (frame >= cframe); } @@ -544,14 +550,15 @@ bool FrameOnMouseSide(char side, float frame, float cframe) bool constraints_list_needinv(TransInfo *t, ListBase *list) { - /* Loop through constraints, checking if there's one of the mentioned - * constraints needing special crazy-space corrections. */ + /* loop through constraints, checking if there's one of the mentioned + * constraints needing special crazy-space corrections + */ if (list) { LISTBASE_FOREACH (bConstraint *, con, list) { - /* Only consider constraint if it is enabled, and has influence on result. */ + /* only consider constraint if it is enabled, and has influence on result */ if ((con->flag & (CONSTRAINT_DISABLE | CONSTRAINT_OFF)) == 0 && (con->enforce != 0.0f)) { - /* Affirmative: returns for specific constraints here. */ - /* Constraints that require this regardless. */ + /* (affirmative) returns for specific constraints here... */ + /* constraints that require this regardless. */ if (ELEM(con->type, CONSTRAINT_TYPE_FOLLOWPATH, CONSTRAINT_TYPE_CLAMPTO, @@ -562,7 +569,7 @@ bool constraints_list_needinv(TransInfo *t, ListBase *list) return true; } - /* Constraints that require this only under special conditions. */ + /* constraints that require this only under special conditions */ if (con->type == CONSTRAINT_TYPE_CHILDOF) { /* ChildOf constraint only works when using all location components, see #42256. */ bChildOfConstraint *data = (bChildOfConstraint *)con->data; @@ -574,7 +581,7 @@ bool constraints_list_needinv(TransInfo *t, ListBase *list) } } else if (con->type == CONSTRAINT_TYPE_ROTLIKE) { - /* CopyRot constraint only does this when rotating, and offset is on. */ + /* CopyRot constraint only does this when rotating, and offset is on */ bRotateLikeConstraint *data = (bRotateLikeConstraint *)con->data; if (ELEM(data->mix_mode, ROTLIKE_MIX_OFFSET, ROTLIKE_MIX_BEFORE) && @@ -624,7 +631,7 @@ bool constraints_list_needinv(TransInfo *t, ListBase *list) } } - /* No appropriate candidates found. */ + /* no appropriate candidates found */ return false; } @@ -640,7 +647,7 @@ void special_aftertrans_update(bContext *C, TransInfo *t) * with transform's order of freeing (campbell). * Order changed, the sequencer stuff should go back in here. */ - /* Early out when nothing happened. */ + /* early out when nothing happened */ if (t->data_len_all == 0 || t->mode == TFM_DUMMY) { return; } @@ -731,7 +738,7 @@ static void init_proportional_edit(TransInfo *t) &TransConvertType_Object) || ELEM(t->data_type, &TransConvertType_Particle))) { - /* Disable proportional editing. */ + /* Disable proportional editing */ t->options |= CTX_NO_PET; t->flag &= ~T_PROP_EDIT_ALL; return; @@ -841,7 +848,7 @@ static void init_TransDataContainers(TransInfo *t, Object *obact, Span if (object_mode & OB_MODE_EDIT) { tc->obedit = objects[i]; - /* Check needed for UVs. */ + /* Check needed for UVs */ if ((t->flag & T_2D_EDIT) == 0) { tc->use_local_mat = true; } @@ -859,10 +866,10 @@ static void init_TransDataContainers(TransInfo *t, Object *obact, Span if (tc->use_local_mat) { BLI_assert((t->flag & T_2D_EDIT) == 0); - copy_m4_m4(tc->mat, objects[i]->object_to_world().ptr()); + copy_m4_m4(tc->mat, objects[i]->object_to_world); copy_m3_m4(tc->mat3, tc->mat); - /* For non-invertible scale matrices, #invert_m4_m4_fallback() - * can still provide a valid pivot. */ + /* 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); @@ -878,7 +885,7 @@ static TransConvertTypeInfo *convert_type_get(const TransInfo *t, Object **r_obj BKE_view_layer_synced_ensure(t->scene, t->view_layer); Object *ob = BKE_view_layer_active_object_get(view_layer); - /* If tests must match recalc_data for correct updates. */ + /* if tests must match recalc_data for correct updates */ if (t->options & CTX_CURSOR) { if (t->spacetype == SPACE_IMAGE) { return &TransConvertType_CursorImage; @@ -901,7 +908,7 @@ static TransConvertTypeInfo *convert_type_get(const TransInfo *t, Object **r_obj if (t->options & CTX_EDGE_DATA) { return &TransConvertType_MeshEdge; } - if (t->options & CTX_GPENCIL_STROKES) { + if ((t->options & CTX_GPENCIL_STROKES) && (t->spacetype == SPACE_VIEW3D)) { if (t->obedit_type == OB_GREASE_PENCIL) { return &TransConvertType_GreasePencil; } @@ -1050,12 +1057,12 @@ void create_trans_data(bContext *C, TransInfo *t) t->options |= CTX_OBMODE_XFORM_SKIP_CHILDREN; } TransConvertType_Object.create_trans_data(C, t); - /* Check if we're transforming the camera from the camera. */ + /* Check if we're transforming the camera from the camera */ if ((t->spacetype == SPACE_VIEW3D) && (t->region->regiontype == RGN_TYPE_WINDOW)) { View3D *v3d = static_cast(t->view); RegionView3D *rv3d = static_cast(t->region->regiondata); if ((rv3d->persp == RV3D_CAMOB) && v3d->camera) { - /* We could have a flag to easily check an object is being transformed. */ + /* 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; } @@ -1112,8 +1119,8 @@ void transform_convert_clip_mirror_modifier_apply(TransDataContainer *tc) if (mmd->mirror_ob) { float obinv[4][4]; - invert_m4_m4(obinv, mmd->mirror_ob->object_to_world().ptr()); - mul_m4_m4m4(mtx, obinv, ob->object_to_world().ptr()); + invert_m4_m4(obinv, mmd->mirror_ob->object_to_world); + mul_m4_m4m4(mtx, obinv, ob->object_to_world); invert_m4_m4(imtx, mtx); } @@ -1176,67 +1183,71 @@ void animrecord_check_state(TransInfo *t, ID *id) ScreenAnimData *sad = static_cast((animtimer) ? animtimer->customdata : nullptr); - /* Sanity checks. */ + /* sanity checks */ if (ELEM(nullptr, scene, id, sad)) { return; } - /* Check if we need a new strip if: - * - If `animtimer` is running. - * - We're not only keying for available channels. - * - The option to add new actions for each round is not enabled. + /* check if we need a new strip if: + * - if animtimer is running + * - we're not only keying for available channels + * - the option to add new actions for each round is not enabled */ if (blender::animrig::is_keying_flag(scene, AUTOKEY_FLAG_INSERTAVAILABLE) == 0 && (scene->toolsettings->keying_flag & AUTOKEY_FLAG_LAYERED_RECORD)) { - /* If playback has just looped around, - * we need to add a new NLA track+strip to allow a clean pass to occur. */ + /* if playback has just looped around, + * we need to add a new NLA track+strip to allow a clean pass to occur */ if ((sad) && (sad->flag & ANIMPLAY_FLAG_JUMPED)) { AnimData *adt = BKE_animdata_from_id(id); const bool is_first = (adt) && (adt->nla_tracks.first == nullptr); - /* Perform push-down manually with some differences - * NOTE: #BKE_nla_action_pushdown() sync warning. */ + /* perform push-down manually with some differences + * NOTE: BKE_nla_action_pushdown() sync warning... + */ if ((adt->action) && !(adt->flag & ADT_NLA_EDIT_ON)) { float astart, aend; - /* Only push down if action is more than 1-2 frames long. */ + /* only push down if action is more than 1-2 frames long */ BKE_action_frame_range_calc(adt->action, true, &astart, &aend); if (aend > astart + 2.0f) { NlaStrip *strip = BKE_nlastack_add_strip(adt, adt->action, ID_IS_OVERRIDE_LIBRARY(id)); - /* Clear reference to action now that we've pushed it onto the stack. */ + /* clear reference to action now that we've pushed it onto the stack */ id_us_min(&adt->action->id); adt->action = nullptr; - /* Adjust blending + extend so that they will behave correctly. */ + /* adjust blending + extend so that they will behave correctly */ strip->extendmode = NLASTRIP_EXTEND_NOTHING; strip->flag &= ~(NLASTRIP_FLAG_AUTO_BLENDS | NLASTRIP_FLAG_SELECT | NLASTRIP_FLAG_ACTIVE); - /* Copy current "action blending" settings from adt to the strip, + /* copy current "action blending" settings from adt to the strip, * as it was keyframed with these settings, so omitting them will - * change the effect, see: #54766. */ + * change the effect [#54766] + */ if (is_first == false) { strip->blendmode = adt->act_blendmode; strip->influence = adt->act_influence; if (adt->act_influence < 1.0f) { - /* Enable "user-controlled" influence (which will insert a default keyframe) - * so that the influence doesn't get lost on the new update. + /* enable "user-controlled" influence (which will insert a default keyframe) + * so that the influence doesn't get lost on the new update * * NOTE: An alternative way would have been to instead hack the influence * to not get always get reset to full strength if NLASTRIP_FLAG_USR_INFLUENCE * is disabled but auto-blending isn't being used. However, that approach * is a bit hacky/hard to discover, and may cause backwards compatibility issues, - * so it's better to just do it this way. */ + * so it's better to just do it this way. + */ strip->flag |= NLASTRIP_FLAG_USR_INFLUENCE; BKE_nlastrip_validate_fcurves(strip); } } - /* Also, adjust the AnimData's action extend mode to be on - * 'nothing' so that previous result still play. */ + /* also, adjust the AnimData's action extend mode to be on + * 'nothing' so that previous result still play + */ adt->act_extendmode = NLASTRIP_EXTEND_NOTHING; } } diff --git a/source/blender/editors/transform/transform_convert.hh b/source/blender/editors/transform/transform_convert.hh index 5145ad2bc4e..b00da9e8774 100644 --- a/source/blender/editors/transform/transform_convert.hh +++ b/source/blender/editors/transform/transform_convert.hh @@ -26,7 +26,7 @@ struct TransInfo; struct bContext; struct TransConvertTypeInfo { - int flags; /* #eTFlag. */ + int flags; /* eTFlag */ /** * Allocate and initialize `t->data`. @@ -44,42 +44,6 @@ struct TransConvertTypeInfo { void (*special_aftertrans_update)(bContext *C, TransInfo *t); }; -/** - * Structure used for Edge Slide operation. - * The data is filled based on the 'transform_convert_' type. - */ -struct TransDataEdgeSlideVert { - TransData *td; - blender::float3 dir_side[2]; /* Directional vectors on the sides.*/ - float edge_len; /* Distance between vectors. */ - int loop_nr; /* Number that identifies the group of connected edges. */ - - const float *v_co_orig() const - { - return this->td->iloc; - } -}; - -/** - * Structure used for Vert Slide operation. - * The data is filled based on the 'transform_convert_' type. - */ -struct TransDataVertSlideVert { - TransData *td; - blender::Span co_link_orig_3d; /* Target locations.*/ - int co_link_curr; - - const float *co_orig_3d() const - { - return this->td->iloc; - } - - const blender::float3 &co_dest_3d() const - { - return this->co_link_orig_3d[this->co_link_curr]; - } -}; - /* `transform_convert.cc` */ /** @@ -153,7 +117,6 @@ void animrecord_check_state(TransInfo *t, ID *id); */ void curve_populate_trans_data_structs(TransDataContainer &tc, blender::bke::CurvesGeometry &curves, - const blender::float4x4 &matrix, std::optional> value_attribute, const blender::IndexMask &selected_indices, bool use_proportional_edit, @@ -276,12 +239,6 @@ void transform_convert_mesh_crazyspace_transdata_set(const float mtx[3][3], TransData *r_td); void transform_convert_mesh_crazyspace_free(TransMeshDataCrazySpace *r_crazyspace_data); -blender::Array transform_mesh_vert_slide_data_create( - const TransDataContainer *tc, blender::Vector &r_loc_dst_buffer); - -blender::Array transform_mesh_edge_slide_data_create( - const TransDataContainer *tc, int *r_group_len); - /* `transform_convert_mesh_edge.cc` */ extern TransConvertTypeInfo TransConvertType_MeshEdge; @@ -294,14 +251,6 @@ extern TransConvertTypeInfo TransConvertType_MeshSkin; extern TransConvertTypeInfo TransConvertType_MeshUV; -blender::Array transform_mesh_uv_vert_slide_data_create( - const TransInfo *t, - TransDataContainer *tc, - blender::Vector &r_loc_dst_buffer); - -blender::Array transform_mesh_uv_edge_slide_data_create( - const TransInfo *t, TransDataContainer *tc, int *r_group_len); - /* `transform_convert_mesh_vert_cdata.cc` */ extern TransConvertTypeInfo TransConvertType_MeshVertCData; @@ -310,7 +259,7 @@ extern TransConvertTypeInfo TransConvertType_MeshVertCData; extern TransConvertTypeInfo TransConvertType_NLA; -/* `transform_convert_node.cc` */ +/* transform_convert_node.cc */ extern TransConvertTypeInfo TransConvertType_Node; @@ -330,7 +279,7 @@ extern TransConvertTypeInfo TransConvertType_PaintCurve; extern TransConvertTypeInfo TransConvertType_Particle; -/* `transform_convert_sculpt.cc` */ +/* transform_convert_sculpt.cc */ extern TransConvertTypeInfo TransConvertType_Sculpt; diff --git a/source/blender/editors/transform/transform_convert_action.cc b/source/blender/editors/transform/transform_convert_action.cc index 4270b1fcd8a..c06f71a1bb1 100644 --- a/source/blender/editors/transform/transform_convert_action.cc +++ b/source/blender/editors/transform/transform_convert_action.cc @@ -17,7 +17,7 @@ #include "BLI_rect.h" #include "BKE_context.hh" -#include "BKE_fcurve.hh" +#include "BKE_fcurve.h" #include "BKE_gpencil_legacy.h" #include "BKE_grease_pencil.hh" #include "BKE_key.hh" @@ -69,7 +69,7 @@ static bool grease_pencil_layer_initialize_trans_data(blender::bke::greasepencil continue; } - /* Store frames' duration to keep them visually correct while moving the frames. */ + /* Store frames' duration to keep them visually correct while moving the frames */ if (!frame.is_implicit_hold()) { trans_data.frames_duration.add(frame_number, layer.get_frame_duration_at(frame_number)); } @@ -196,9 +196,7 @@ static bool grease_pencil_layer_apply_trans_data(GreasePencil &grease_pencil, /** \name Action Transform Creation * \{ */ -/** - * Fully select selected beztriples, but only include if it's on the right side of cfra. - */ +/* fully select selected beztriples, but only include if it's on the right side of cfra */ static int count_fcurve_keys(FCurve *fcu, char side, float cfra, bool is_prop_edit) { BezTriple *bezt; @@ -208,11 +206,11 @@ static int count_fcurve_keys(FCurve *fcu, char side, float cfra, bool is_prop_ed return count; } - /* Only include points that occur on the right side of cfra. */ + /* only include points that occur on the right side of cfra */ for (i = 0, bezt = fcu->bezt; i < fcu->totvert; i++, bezt++) { if (FrameOnMouseSide(side, bezt->vec[1][0], cfra)) { - /* No need to adjust the handle selection since they are assumed - * selected (like graph editor with #SIPO_NOHANDLES). */ + /* no need to adjust the handle selection since they are assumed + * selected (like graph editor with SIPO_NOHANDLES) */ if (bezt->f2 & SELECT) { count++; } @@ -227,9 +225,7 @@ static int count_fcurve_keys(FCurve *fcu, char side, float cfra, bool is_prop_ed return count; } -/** - * Fully select selected beztriples, but only include if it's on the right side of cfra. - */ +/* fully select selected beztriples, but only include if it's on the right side of cfra */ static int count_gplayer_frames(bGPDlayer *gpl, char side, float cfra, bool is_prop_edit) { int count = 0, count_all = 0; @@ -238,7 +234,7 @@ static int count_gplayer_frames(bGPDlayer *gpl, char side, float cfra, bool is_p return count; } - /* Only include points that occur on the right side of cfra. */ + /* only include points that occur on the right side of cfra */ LISTBASE_FOREACH (bGPDframe *, gpf, &gpl->frames) { if (FrameOnMouseSide(side, float(gpf->framenum), cfra)) { if (gpf->flag & GP_FRAME_SELECT) { @@ -291,7 +287,7 @@ static int count_grease_pencil_frames(const blender::bke::greasepencil::Layer *l return count_selected; } -/** Fully select selected beztriples, but only include if it's on the right side of cfra. */ +/* fully select selected beztriples, but only include if it's on the right side of cfra */ static int count_masklayer_frames(MaskLayer *masklay, char side, float cfra, bool is_prop_edit) { int count = 0, count_all = 0; @@ -300,7 +296,7 @@ static int count_masklayer_frames(MaskLayer *masklay, char side, float cfra, boo return count; } - /* Only include points that occur on the right side of cfra. */ + /* only include points that occur on the right side of cfra */ LISTBASE_FOREACH (MaskLayerShape *, masklayer_shape, &masklay->splines_shapes) { if (FrameOnMouseSide(side, float(masklayer_shape->frame), cfra)) { if (masklayer_shape->flag & MASK_SHAPE_SELECT) { @@ -316,7 +312,7 @@ static int count_masklayer_frames(MaskLayer *masklay, char side, float cfra, boo return count; } -/* This function assigns the information to transdata. */ +/* This function assigns the information to transdata */ static void TimeToTransData( TransData *td, TransData2D *td2d, BezTriple *bezt, AnimData *adt, float ypos) { @@ -386,10 +382,10 @@ static TransData *ActionFCurveToTransData(TransData *td, } for (i = 0, bezt = fcu->bezt; i < fcu->totvert; i++, bezt++) { - /* Only add selected keyframes (for now, proportional edit is not enabled). */ + /* only add selected keyframes (for now, proportional edit is not enabled) */ if (is_prop_edit || (bezt->f2 & SELECT)) - { /* Note this MUST match #count_fcurve_keys(), so can't use #BEZT_ISSEL_ANY() macro. */ - /* Only add if on the right 'side' of the current frame. */ + { /* note this MUST match count_fcurve_keys(), * so can't use BEZT_ISSEL_ANY() macro */ + /* only add if on the right 'side' of the current frame */ if (FrameOnMouseSide(side, bezt->vec[1][0], cfra)) { TimeToTransData(td, td2d, bezt, adt, ypos); @@ -422,7 +418,7 @@ static int GPLayerToTransData(TransData *td, { int count = 0; - /* Check for select frames on right side of current frame. */ + /* check for select frames on right side of current frame */ LISTBASE_FOREACH (bGPDframe *, gpf, &gpl->frames) { const bool is_selected = (gpf->flag & GP_FRAME_SELECT) != 0; if (is_prop_edit || is_selected) { @@ -528,9 +524,7 @@ static int GreasePencilLayerToTransData(TransData *td, return total_trans_frames; } -/** - * Refer to comment above #GPLayerToTransData, this is the same but for masks. - */ +/* refer to comment above #GPLayerToTransData, this is the same but for masks */ static int MaskLayerToTransData(TransData *td, TransData2D *td2d, MaskLayer *masklay, @@ -541,7 +535,7 @@ static int MaskLayerToTransData(TransData *td, { int count = 0; - /* Check for select frames on right side of current frame. */ + /* check for select frames on right side of current frame */ LISTBASE_FOREACH (MaskLayerShape *, masklay_shape, &masklay->splines_shapes) { if (is_prop_edit || (masklay_shape->flag & MASK_SHAPE_SELECT)) { if (FrameOnMouseSide(side, float(masklay_shape->frame), cfra)) { @@ -556,7 +550,7 @@ static int MaskLayerToTransData(TransData *td, BLI_assert(is_td2d_int(td2d)); - /* Advance td now. */ + /* advance td now */ td++; td2d++; count++; @@ -595,31 +589,32 @@ static void createTransActionData(bContext *C, TransInfo *t) float cfra; float ypos = 1.0f / ((ysize / xsize) * (xmask / ymask)) * BLI_rctf_cent_y(&t->region->v2d.cur); - /* Determine what type of data we are operating on. */ + /* determine what type of data we are operating on */ if (ANIM_animdata_get_context(C, &ac) == 0) { return; } - /* Filter data. */ + /* filter data */ filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_FOREDIT); ANIM_animdata_filter( &ac, &anim_data, eAnimFilter_Flags(filter), ac.data, eAnimCont_Types(ac.datatype)); - /* Which side of the current frame should be allowed. */ + /* which side of the current frame should be allowed */ if (t->mode == TFM_TIME_EXTEND) { t->frame_side = transform_convert_frame_side_dir_get(t, float(scene->r.cfra)); } else { - /* Normal transform - both sides of current frame are considered. */ + /* normal transform - both sides of current frame are considered */ t->frame_side = 'B'; } - /* Loop 1: fully select F-Curve keys and count how many BezTriples are selected. */ + /* loop 1: fully select F-Curve keys and count how many BezTriples are selected */ LISTBASE_FOREACH (bAnimListElem *, ale, &anim_data) { AnimData *adt = ANIM_nla_mapping_get(&ac, ale); int adt_count = 0; - /* Convert current-frame to action-time (slightly less accurate, especially under - * higher scaling ratios, but is faster than converting all points). */ + /* convert current-frame to action-time (slightly less accurate, especially under + * higher scaling ratios, but is faster than converting all points) + */ if (adt) { cfra = BKE_nla_tweakedit_remap(adt, float(scene->r.cfra), NLATIME_CONVERT_UNMAP); } @@ -657,16 +652,16 @@ static void createTransActionData(bContext *C, TransInfo *t) } } - /* Stop if trying to build list if nothing selected. */ + /* stop if trying to build list if nothing selected */ if (count == 0 && gpf_count == 0) { - /* Cleanup temp list. */ + /* cleanup temp list */ ANIM_animdata_freelist(&anim_data); return; } TransDataContainer *tc = TRANS_DATA_CONTAINER_FIRST_SINGLE(t); - /* Allocate memory for data. */ + /* allocate memory for data */ tc->data_len = count; tc->data = static_cast( @@ -676,7 +671,7 @@ static void createTransActionData(bContext *C, TransInfo *t) td = tc->data; td2d = tc->data_2d; - /* Loop 2: build transdata array. */ + /* loop 2: build transdata array */ LISTBASE_FOREACH (bAnimListElem *, ale, &anim_data) { if (is_prop_edit && !ale->tag) { @@ -727,14 +722,14 @@ static void createTransActionData(bContext *C, TransInfo *t) } } - /* Calculate distances for proportional editing. */ + /* calculate distances for proportional editing */ if (is_prop_edit) { td = tc->data; LISTBASE_FOREACH (bAnimListElem *, ale, &anim_data) { AnimData *adt; - /* F-Curve may not have any keyframes. */ + /* F-Curve may not have any keyframes */ if (!ale->tag) { continue; } @@ -870,7 +865,7 @@ static void createTransActionData(bContext *C, TransInfo *t) } } - /* Cleanup temp list. */ + /* cleanup temp list */ ANIM_animdata_freelist(&anim_data); } @@ -905,8 +900,8 @@ static void recalcData_actedit(TransInfo *t) BKE_view_layer_synced_ensure(t->scene, t->view_layer); - /* Initialize relevant anim-context `context` data from #TransInfo data. */ - /* NOTE: sync this with the code in #ANIM_animdata_get_context(). */ + /* initialize relevant anim-context 'context' data from TransInfo data */ + /* NOTE: sync this with the code in ANIM_animdata_get_context() */ ac.bmain = CTX_data_main(t->context); ac.scene = t->scene; ac.view_layer = t->view_layer; @@ -961,15 +956,16 @@ static void recalcData_actedit(TransInfo *t) ANIM_animdata_filter( &ac, &anim_data, eAnimFilter_Flags(filter), ac.data, eAnimCont_Types(ac.datatype)); - /* Just tag these animdata-blocks to recalc, assuming that some data there changed - * BUT only do this if realtime updates are enabled. */ + /* just tag these animdata-blocks to recalc, assuming that some data there changed + * BUT only do this if realtime updates are enabled + */ if ((saction->flag & SACTION_NOREALTIMEUPDATES) == 0) { LISTBASE_FOREACH (bAnimListElem *, ale, &anim_data) { - /* Set refresh tags for objects using this animation. */ + /* set refresh tags for objects using this animation */ ANIM_list_elem_update(CTX_data_main(t->context), t->scene, ale); } - /* Now free temp channels. */ + /* now free temp channels */ ANIM_animdata_freelist(&anim_data); } @@ -1008,7 +1004,7 @@ static int masklay_shape_cmp_frame(void *thunk, const void *a, const void *b) return 1; } *((bool *)thunk) = true; - /* Selected last. */ + /* selected last */ if ((frame_a->flag & MASK_SHAPE_SELECT) && ((frame_b->flag & MASK_SHAPE_SELECT) == 0)) { return 1; } @@ -1076,28 +1072,27 @@ static void posttrans_gpd_clean(bGPdata *gpd) } #endif } - /* Set cache flag to dirty. */ + /* set cache flag to dirty */ DEG_id_tag_update(&gpd->id, ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY); WM_main_add_notifier(NC_GPENCIL | NA_EDITED, gpd); } -/** - * Called by #special_aftertrans_update to make sure selected keyframes replace +/* Called by special_aftertrans_update to make sure selected keyframes replace * any other keyframes which may reside on that frame (that is not selected). - * remake_action_ipos should have already been called. + * remake_action_ipos should have already been called */ static void posttrans_action_clean(bAnimContext *ac, bAction *act) { ListBase anim_data = {nullptr, nullptr}; int filter; - /* Filter data. */ + /* filter data */ filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_FCURVESONLY); ANIM_animdata_filter(ac, &anim_data, eAnimFilter_Flags(filter), act, ANIMCONT_ACTION); - /* Loop through relevant data, removing keyframes as appropriate. - * - all keyframes are converted in/out of global time. + /* loop through relevant data, removing keyframes as appropriate + * - all keyframes are converted in/out of global time */ LISTBASE_FOREACH (bAnimListElem *, ale, &anim_data) { AnimData *adt = ANIM_nla_mapping_get(ac, ale); @@ -1106,17 +1101,17 @@ static void posttrans_action_clean(bAnimContext *ac, bAction *act) ANIM_nla_mapping_apply_fcurve(adt, static_cast(ale->key_data), false, false); BKE_fcurve_merge_duplicate_keys(static_cast(ale->key_data), SELECT, - false); /* Only use handles in graph editor. */ + false); /* only use handles in graph editor */ ANIM_nla_mapping_apply_fcurve(adt, static_cast(ale->key_data), true, false); } else { BKE_fcurve_merge_duplicate_keys(static_cast(ale->key_data), SELECT, - false); /* Only use handles in graph editor. */ + false); /* only use handles in graph editor */ } } - /* Free temp data. */ + /* free temp data */ ANIM_animdata_freelist(&anim_data); } @@ -1128,7 +1123,7 @@ static void special_aftertrans_update__actedit(bContext *C, TransInfo *t) const bool canceled = (t->state == TRANS_CANCEL); const bool duplicate = (t->flag & T_DUPLICATED_KEYFRAMES) != 0; - /* Initialize relevant anim-context 'context' data. */ + /* initialize relevant anim-context 'context' data */ if (ANIM_animdata_get_context(C, &ac) == 0) { return; } @@ -1139,7 +1134,7 @@ static void special_aftertrans_update__actedit(bContext *C, TransInfo *t) ListBase anim_data = {nullptr, nullptr}; short filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_FOREDIT); - /* Get channels to work on. */ + /* get channels to work on */ ANIM_animdata_filter( &ac, &anim_data, eAnimFilter_Flags(filter), ac.data, eAnimCont_Types(ac.datatype)); @@ -1155,22 +1150,22 @@ static void special_aftertrans_update__actedit(bContext *C, TransInfo *t) FCurve *fcu = (FCurve *)ale->key_data; /* 3 cases here for curve cleanups: - * 1) NOTRANSKEYCULL on -> cleanup of duplicates shouldn't be done. + * 1) NOTRANSKEYCULL on -> cleanup of duplicates shouldn't be done * 2) canceled == 0 -> user confirmed the transform, - * so duplicates should be removed. + * so duplicates should be removed * 3) canceled + duplicate -> user canceled the transform, - * but we made duplicates, so get rid of these. + * but we made duplicates, so get rid of these */ if ((saction->flag & SACTION_NOTRANSKEYCULL) == 0 && ((canceled == 0) || (duplicate))) { if (adt) { ANIM_nla_mapping_apply_fcurve(adt, fcu, false, false); BKE_fcurve_merge_duplicate_keys( - fcu, SELECT, false); /* Only use handles in graph editor. */ + fcu, SELECT, false); /* only use handles in graph editor */ ANIM_nla_mapping_apply_fcurve(adt, fcu, true, false); } else { BKE_fcurve_merge_duplicate_keys( - fcu, SELECT, false); /* Only use handles in graph editor. */ + fcu, SELECT, false); /* only use handles in graph editor */ } } break; @@ -1181,11 +1176,11 @@ static void special_aftertrans_update__actedit(bContext *C, TransInfo *t) } } - /* Free temp memory. */ + /* free temp memory */ ANIM_animdata_freelist(&anim_data); } else if (ac.datatype == ANIMCONT_ACTION) { /* TODO: just integrate into the above. */ - /* Depending on the lock status, draw necessary views. */ + /* Depending on the lock status, draw necessary views */ /* FIXME: some of this stuff is not good. */ if (ob) { if (ob->pose || BKE_key_from_object(ob)) { @@ -1208,13 +1203,13 @@ static void special_aftertrans_update__actedit(bContext *C, TransInfo *t) } } else if (ac.datatype == ANIMCONT_GPENCIL) { - /* Remove duplicate frames and also make sure points are in order! */ + /* remove duplicate frames and also make sure points are in order! */ /* 3 cases here for curve cleanups: - * 1) NOTRANSKEYCULL on -> cleanup of duplicates shouldn't be done. + * 1) NOTRANSKEYCULL on -> cleanup of duplicates shouldn't be done * 2) canceled == 0 -> user confirmed the transform, - * so duplicates should be removed. + * so duplicates should be removed * 3) canceled + duplicate -> user canceled the transform, - * but we made duplicates, so get rid of these. + * but we made duplicates, so get rid of these */ ListBase anim_data = {nullptr, nullptr}; const int filter = ANIMFILTER_DATA_VISIBLE; @@ -1248,7 +1243,7 @@ static void special_aftertrans_update__actedit(bContext *C, TransInfo *t) ANIM_animdata_freelist(&anim_data); } else if (ac.datatype == ANIMCONT_MASK) { - /* Remove duplicate frames and also make sure points are in order! */ + /* remove duplicate frames and also make sure points are in order! */ /* 3 cases here for curve cleanups: * 1) NOTRANSKEYCULL on: * Cleanup of duplicates shouldn't be done. @@ -1273,17 +1268,18 @@ static void special_aftertrans_update__actedit(bContext *C, TransInfo *t) } } - /* Marker transform, not especially nice but we may want to move markers - * at the same time as keyframes in the dope sheet. */ + /* marker transform, not especially nice but we may want to move markers + * at the same time as keyframes in the dope sheet. + */ if ((saction->flag & SACTION_MARKERS_MOVE) && (canceled == 0)) { if (t->mode == TFM_TIME_TRANSLATE) { #if 0 - if (ELEM(t->frame_side, 'L', 'R')) { /* #TFM_TIME_EXTEND. */ - /* Same as below. */ + if (ELEM(t->frame_side, 'L', 'R')) { /* TFM_TIME_EXTEND */ + /* same as below */ ED_markers_post_apply_transform( ED_context_get_markers(C), t->scene, t->mode, t->values_final[0], t->frame_side); } - else /* #TFM_TIME_TRANSLATE. */ + else /* TFM_TIME_TRANSLATE */ #endif { ED_markers_post_apply_transform( @@ -1296,12 +1292,12 @@ static void special_aftertrans_update__actedit(bContext *C, TransInfo *t) } } - /* Make sure all F-Curves are set correctly. */ + /* make sure all F-Curves are set correctly */ if (!ELEM(ac.datatype, ANIMCONT_GPENCIL)) { ANIM_editkeyframes_refresh(&ac); } - /* Clear flag that was set for time-slide drawing. */ + /* clear flag that was set for time-slide drawing */ saction->flag &= ~SACTION_MOVING; } diff --git a/source/blender/editors/transform/transform_convert_armature.cc b/source/blender/editors/transform/transform_convert_armature.cc index a68040bbf48..a67ae001fc8 100644 --- a/source/blender/editors/transform/transform_convert_armature.cc +++ b/source/blender/editors/transform/transform_convert_armature.cc @@ -18,18 +18,25 @@ #include "BLI_math_vector.h" #include "BKE_action.h" +#include "BKE_animsys.h" #include "BKE_armature.hh" #include "BKE_constraint.h" #include "BKE_context.hh" -#include "BKE_report.hh" +#include "BKE_main.hh" +#include "BKE_report.h" +#include "BKE_scene.h" #include "BIK_api.h" #include "ED_armature.hh" +#include "ED_keyframing.hh" #include "DEG_depsgraph.hh" #include "DEG_depsgraph_query.hh" +#include "RNA_access.hh" +#include "RNA_prototypes.h" + #include "ANIM_bone_collections.hh" #include "ANIM_keyframing.hh" #include "ANIM_rna.hh" @@ -70,13 +77,13 @@ static bConstraint *add_temporary_ik_constraint(bPoseChannel *pchan, bConstraint *con = BKE_constraint_add_for_pose( nullptr, pchan, "TempConstraint", CONSTRAINT_TYPE_KINEMATIC); - /* For draw, but also for detecting while pose solving. */ + /* for draw, but also for detecting while pose solving */ pchan->constflag |= (PCHAN_HAS_IK | PCHAN_HAS_NO_TARGET); bKinematicConstraint *temp_con_data = static_cast(con->data); if (targetless_con) { - /* If exists, use values from last targetless (but disabled) IK-constraint as base. */ + /* if exists, use values from last targetless (but disabled) IK-constraint as base */ *temp_con_data = *targetless_con; } else { @@ -120,35 +127,33 @@ static bKinematicConstraint *has_targetless_ik(bPoseChannel *pchan) return nullptr; } -/** - * Adds the IK to pchan - returns if added. - */ +/* adds the IK to pchan - returns if added */ static short pose_grab_with_ik_add(bPoseChannel *pchan) { bKinematicConstraint *targetless = nullptr; bKinematicConstraint *data; - /* Sanity check. */ + /* Sanity check */ if (pchan == nullptr) { return 0; } - /* Rule: not if there's already an IK on this channel. */ + /* Rule: not if there's already an IK on this channel */ LISTBASE_FOREACH (bConstraint *, con, &pchan->constraints) { if (con->type == CONSTRAINT_TYPE_KINEMATIC && (con->flag & CONSTRAINT_OFF) == 0) { data = static_cast(con->data); if (data->tar == nullptr || (data->tar->type == OB_ARMATURE && data->subtarget[0] == '\0')) { - /* Make reference to constraint to base things off later - * (if it's the last targetless constraint encountered). */ + /* make reference to constraint to base things off later + * (if it's the last targetless constraint encountered) */ targetless = (bKinematicConstraint *)con->data; - /* But, if this is a targetless IK, we make it auto anyway (for the children loop). */ + /* but, if this is a targetless IK, we make it auto anyway (for the children loop) */ if (con->enforce != 0.0f) { data->flag |= CONSTRAINT_IK_AUTO; - /* If no chain length has been specified, - * just make things obey standard rotation locks too. */ + /* if no chain length has been specified, + * just make things obey standard rotation locks too */ if (data->rootbone == 0) { for (bPoseChannel *pchan_iter = pchan; pchan_iter; pchan_iter = pchan_iter->parent) { /* Here, we set IK-settings for bone from `pchan->protectflag`. */ @@ -182,11 +187,11 @@ static short pose_grab_with_ik_add(bPoseChannel *pchan) copy_v3_v3(data->grabtarget, pchan->pose_tail); - /* Watch-it! has to be 0 here, since we're still on the + /* watch-it! has to be 0 here, since we're still on the * same bone for the first time through the loop #25885. */ data->rootbone = 0; - /* We only include bones that are part of a continual connected chain. */ + /* we only include bones that are part of a continual connected chain */ do { /* Here, we set IK-settings for bone from `pchan->protectflag`. */ /* XXX: careful with quaternion/axis-angle rotations where we're locking 4D components. */ @@ -200,10 +205,10 @@ static short pose_grab_with_ik_add(bPoseChannel *pchan) pchan->ikflag |= BONE_IK_NO_ZDOF_TEMP; } - /* Now we count this pchan as being included. */ + /* now we count this pchan as being included */ data->rootbone++; - /* Continue to parent, but only if we're connected to it. */ + /* continue to parent, but only if we're connected to it */ if (pchan->bone->flag & BONE_CONNECTED) { pchan = pchan->parent; } @@ -212,20 +217,18 @@ static short pose_grab_with_ik_add(bPoseChannel *pchan) } } while (pchan); - /* Make a copy of maximum chain-length. */ + /* make a copy of maximum chain-length */ data->max_rootbone = data->rootbone; return 1; } -/** - * Bone is a candidate to get IK, but we don't do it if it has children connected. - */ +/* bone is a candidate to get IK, but we don't do it if it has children connected */ static short pose_grab_with_ik_children(bPose *pose, Bone *bone) { short wentdeeper = 0, added = 0; - /* Go deeper if children & children are connected. */ + /* go deeper if children & children are connected */ LISTBASE_FOREACH (Bone *, bonec, &bone->childbase) { if (bonec->flag & BONE_CONNECTED) { wentdeeper = 1; @@ -242,7 +245,7 @@ static short pose_grab_with_ik_children(bPose *pose, Bone *bone) return added; } -/* Main call which adds temporal IK chains. */ +/* main call which adds temporal IK chains */ static short pose_grab_with_ik(Main *bmain, Object *ob) { bArmature *arm; @@ -256,7 +259,7 @@ static short pose_grab_with_ik(Main *bmain, Object *ob) arm = static_cast(ob->data); /* Rule: allow multiple Bones - * (but they must be selected, and only one ik-solver per chain should get added). */ + * (but they must be selected, and only one ik-solver per chain should get added) */ LISTBASE_FOREACH (bPoseChannel *, pchan, &ob->pose->chanbase) { if (BKE_pose_is_bonecoll_visible(arm, pchan)) { if (pchan->bone->flag & (BONE_SELECTED | BONE_TRANSFORM_MIRROR)) { @@ -271,9 +274,9 @@ static short pose_grab_with_ik(Main *bmain, Object *ob) continue; } - /* Rule: if selected Bone is not a root bone, it gets a temporal IK. */ + /* rule: if selected Bone is not a root bone, it gets a temporal IK */ if (pchan->parent) { - /* Only adds if there's no IK yet (and no parent bone was selected). */ + /* only adds if there's no IK yet (and no parent bone was selected) */ bPoseChannel *parent; for (parent = pchan->parent; parent; parent = parent->parent) { if (parent->bone->flag & (BONE_SELECTED | BONE_TRANSFORM_MIRROR)) { @@ -285,14 +288,14 @@ static short pose_grab_with_ik(Main *bmain, Object *ob) } } else { - /* Rule: go over the children and add IK to the tips. */ + /* rule: go over the children and add IK to the tips */ tot_ik += pose_grab_with_ik_children(ob->pose, pchan->bone); } } } } - /* `ITaSC` needs clear for new IK constraints. */ + /* iTaSC needs clear for new IK constraints */ if (tot_ik) { update_deg_with_temporary_ik(bmain, ob); } @@ -439,8 +442,8 @@ static void add_pose_transdata(TransInfo *t, bPoseChannel *pchan, Object *ob, Tr } td->ext->rotOrder = pchan->rotmode; - /* Proper way to get parent transform + our own transform + constraints transform. */ - copy_m3_m4(omat, ob->object_to_world().ptr()); + /* proper way to get parent transform + own transform + constraints transform */ + copy_m3_m4(omat, ob->object_to_world); /* New code, using "generic" BKE_bone_parent_transform_calc_from_pchan(). */ { @@ -476,12 +479,12 @@ static void add_pose_transdata(TransInfo *t, bPoseChannel *pchan, Object *ob, Tr pseudoinverse_m3_m3(td->smtx, td->mtx, PSEUDOINVERSE_EPSILON); - /* Exceptional case: rotate the pose bone which also applies transformation - * when a parentless bone has #BONE_NO_LOCAL_LOCATION []. */ + /* exceptional case: rotate the pose bone which also applies transformation + * when a parentless bone has BONE_NO_LOCAL_LOCATION [] */ if (!ELEM(t->mode, TFM_TRANSLATION, TFM_RESIZE) && (pchan->bone->flag & BONE_NO_LOCAL_LOCATION)) { if (pchan->parent) { - /* Same as `td->smtx` but without `pchan->bone->bone_mat`. */ + /* same as td->smtx but without pchan->bone->bone_mat */ td->flag |= TD_PBONE_LOCAL_MTX_C; mul_m3_m3m3(td->ext->l_smtx, pchan->bone->bone_mat, td->smtx); } @@ -490,7 +493,7 @@ static void add_pose_transdata(TransInfo *t, bPoseChannel *pchan, Object *ob, Tr } } - /* For `axismtx` we use the 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); @@ -507,13 +510,13 @@ static void add_pose_transdata(TransInfo *t, bPoseChannel *pchan, Object *ob, Tr td->ival = bone->dist; } else if (t->mode == TFM_BONESIZE) { - /* Abusive storage of scale in the loc pointer :). */ + /* Abusive storage of scale in the loc pointer :) */ td->loc = &bone->xwidth; copy_v3_v3(td->iloc, td->loc); td->val = nullptr; } - /* In this case we can do target-less IK grabbing. */ + /* in this case we can do target-less IK grabbing */ if (t->mode == TFM_TRANSLATION) { bKinematicConstraint *data = has_targetless_ik(pchan); if (data) { @@ -539,13 +542,13 @@ static void add_pose_transdata(TransInfo *t, bPoseChannel *pchan, Object *ob, Tr update_deg_with_temporary_ik(bmain, ob); } - /* Only object matrix correction. */ + /* only object matrix correction */ copy_m3_m3(td->mtx, omat); pseudoinverse_m3_m3(td->smtx, td->mtx, PSEUDOINVERSE_EPSILON); } } - /* Store reference to first constraint. */ + /* store reference to first constraint */ td->con = static_cast(pchan->constraints.first); } @@ -564,7 +567,7 @@ static void createTransPose(bContext * /*C*/, TransInfo *t) bArmature *arm; - /* Check validity of state. */ + /* check validity of state */ arm = BKE_armature_from_object(tc->poseobj); if ((arm == nullptr) || (pose == nullptr)) { continue; @@ -669,7 +672,7 @@ static void createTransPose(bContext * /*C*/, TransInfo *t) /* We also allow non-active objects to be transformed, in weight-paint. */ tc->poseobj = ob; - /* Initialize trans data. */ + /* init trans data */ td = tc->data = static_cast( MEM_callocN(tc->data_len * sizeof(TransData), "TransPoseBone")); tdx = tc->data_ext = static_cast( @@ -692,7 +695,7 @@ static void createTransPose(bContext * /*C*/, TransInfo *t) } } - /* Do we need to add temporal IK chains? */ + /* do we need to add temporal IK chains? */ if ((pose->flag & POSE_AUTO_IK) && t->mode == TFM_TRANSLATION) { if (pose_grab_with_ik(bmain, ob)) { t->flag |= T_AUTOIK; @@ -700,7 +703,7 @@ static void createTransPose(bContext * /*C*/, TransInfo *t) } } - /* Use pose channels to fill trans data. */ + /* use pose channels to fill trans data */ td = tc->data; LISTBASE_FOREACH (bPoseChannel *, pchan, &ob->pose->chanbase) { if (pchan->bone->flag & BONE_TRANSFORM) { @@ -719,7 +722,7 @@ static void createTransPose(bContext * /*C*/, TransInfo *t) transform_autoik_update(t, 0); } - /* If there are no translatable bones, do rotation. */ + /* if there are no translatable bones, do rotation */ if ((t->mode == TFM_TRANSLATION) && !has_translate_rotate[0]) { if (has_translate_rotate[1]) { t->mode = TFM_ROTATION; @@ -780,7 +783,7 @@ static void createTransArmatureVerts(bContext * /*C*/, TransInfo *t) BoneInitData *bid = static_cast( MEM_mallocN((total_mirrored + 1) * sizeof(BoneInitData), "BoneInitData")); - /* Trick to terminate iteration. */ + /* trick to terminate iteration */ bid[total_mirrored].bone = nullptr; tc->custom.type.data = bid; @@ -804,7 +807,7 @@ static void createTransArmatureVerts(bContext * /*C*/, TransInfo *t) bool mirror = ((arm->flag & ARM_MIRROR_EDIT) != 0); BoneInitData *bid = static_cast(tc->custom.type.data); - copy_m3_m4(mtx, tc->obedit->object_to_world().ptr()); + copy_m3_m4(mtx, tc->obedit->object_to_world); pseudoinverse_m3_m3(smtx, mtx, PSEUDOINVERSE_EPSILON); td = tc->data = static_cast( @@ -867,7 +870,7 @@ static void createTransArmatureVerts(bContext * /*C*/, TransInfo *t) copy_v3_v3(td->center, ebo->head); td->flag = TD_SELECTED; - /* Use local bone matrix. */ + /* use local bone matrix */ ED_armature_ebone_to_mat3(ebo, bonemat); mul_m3_m3m3(td->mtx, mtx, bonemat); invert_m3_m3(td->smtx, td->mtx); @@ -949,7 +952,7 @@ static void createTransArmatureVerts(bContext * /*C*/, TransInfo *t) ED_armature_ebone_to_mat3(ebo, td->axismtx); - td->extra = ebo; /* To fix roll. */ + td->extra = ebo; /* to fix roll */ td->ival = ebo->roll; td->ext = nullptr; @@ -979,7 +982,7 @@ static void createTransArmatureVerts(bContext * /*C*/, TransInfo *t) } if (mirror) { - /* Trick to terminate iteration. */ + /* trick to terminate iteration */ BLI_assert(i + 1 == (MEM_allocN_len(bid) / sizeof(*bid))); bid[i].bone = nullptr; } @@ -1019,7 +1022,7 @@ static void restoreBones(TransDataContainer *tc) copy_v3_v3(ebo->tail, bid->tail); if (arm->flag & ARM_MIRROR_EDIT) { - /* Also move connected ebo_child, in case ebo_child's name aren't mirrored properly. */ + /* Also move connected ebo_child, in case ebo_child's name aren't mirrored properly */ LISTBASE_FOREACH (EditBone *, ebo_child, arm->edbo) { if ((ebo_child->flag & BONE_CONNECTED) && (ebo_child->parent == ebo)) { copy_v3_v3(ebo_child->head, ebo->tail); @@ -1027,7 +1030,7 @@ static void restoreBones(TransDataContainer *tc) } } - /* Also move connected parent, in case parent's name isn't mirrored properly. */ + /* Also move connected parent, in case parent's name isn't mirrored properly */ if ((ebo->flag & BONE_CONNECTED) && ebo->parent) { EditBone *parent = ebo->parent; copy_v3_v3(parent->tail, ebo->head); @@ -1052,19 +1055,19 @@ static void recalcData_edit_armature(TransInfo *t) TransData *td = tc->data; int i; - /* Ensure all bones are correctly adjusted. */ + /* Ensure all bones are correctly adjusted */ LISTBASE_FOREACH (EditBone *, ebo, edbo) { ebo_parent = (ebo->flag & BONE_CONNECTED) ? ebo->parent : nullptr; if (ebo_parent) { - /* If this bone has a parent tip that has been moved. */ + /* If this bone has a parent tip that has been moved */ if (ebo_parent->flag & BONE_TIPSEL) { copy_v3_v3(ebo->head, ebo_parent->tail); if (t->mode == TFM_BONE_ENVELOPE) { ebo->rad_head = ebo_parent->rad_tail; } } - /* If this bone has a parent tip that has NOT been moved. */ + /* If this bone has a parent tip that has NOT been moved */ else { copy_v3_v3(ebo_parent->tail, ebo->head); if (t->mode == TFM_BONE_ENVELOPE) { @@ -1073,7 +1076,7 @@ static void recalcData_edit_armature(TransInfo *t) } } - /* On extrude bones, oldlength==0.0f, so we scale radius of points. */ + /* on extrude bones, oldlength==0.0f, so we scale radius of points */ ebo->length = len_v3v3(ebo->head, ebo->tail); if (ebo->oldlength == 0.0f) { ebo->rad_head = 0.25f * ebo->length; @@ -1086,7 +1089,7 @@ static void recalcData_edit_armature(TransInfo *t) } } else if (t->mode != TFM_BONE_ENVELOPE) { - /* If bones change length, lets do that for the deform distance as well. */ + /* if bones change length, lets do that for the deform distance as well */ ebo->dist *= ebo->length / ebo->oldlength; ebo->rad_head *= ebo->length / ebo->oldlength; ebo->rad_tail *= ebo->length / ebo->oldlength; @@ -1099,7 +1102,7 @@ static void recalcData_edit_armature(TransInfo *t) } if (!ELEM(t->mode, TFM_BONE_ROLL, TFM_BONE_ENVELOPE, TFM_BONE_ENVELOPE_DIST, TFM_BONESIZE)) { - /* Fix roll. */ + /* fix roll */ for (i = 0; i < tc->data_len; i++, td++) { if (td->extra) { float vec[3], up_axis[3]; @@ -1109,7 +1112,7 @@ static void recalcData_edit_armature(TransInfo *t) ebo = static_cast(td->extra); if (t->state == TRANS_CANCEL) { - /* Restore roll. */ + /* restore roll */ ebo->roll = td->ival; } else { @@ -1120,7 +1123,7 @@ static void recalcData_edit_armature(TransInfo *t) rotation_between_vecs_to_quat(qrot, td->axismtx[1], vec); mul_qt_v3(qrot, up_axis); - /* Roll has a tendency to flip in certain orientations - #34283, #33974. */ + /* roll has a tendency to flip in certain orientations - #34283, #33974. */ roll = ED_armature_ebone_roll_to_vector(ebo, up_axis, false); ebo->roll = angle_compat_rad(roll, td->ival); } @@ -1385,11 +1388,11 @@ static void recalcData_pose(TransInfo *t) } } - /* If animtimer is running, and the object already has animation data, + /* if animtimer is running, and the object already has animation data, * check if the auto-record feature means that we should record 'samples' - * (i.e. un-editable animation values). + * (i.e. un-editable animation values) * - * Context is needed for keying set poll() functions. + * context is needed for keying set poll() functions. */ /* TODO: autokeyframe calls need some setting to specify to add samples @@ -1470,8 +1473,8 @@ void transform_convert_pose_transflags_update(Object *ob, const int mode, const } } - /* Make sure no bone can be transformed when a parent is transformed. */ - /* Since pchans are depsgraph sorted, the parents are in beginning of list. */ + /* make sure no bone can be transformed when a parent is transformed */ + /* since pchans are depsgraph sorted, the parents are in beginning of list */ if (!ELEM(mode, TFM_BONESIZE, TFM_BONE_ENVELOPE_DIST)) { LISTBASE_FOREACH (bPoseChannel *, pchan, &ob->pose->chanbase) { bone = pchan->bone; @@ -1488,9 +1491,9 @@ static short apply_targetless_ik(Object *ob) bKinematicConstraint *data; int segcount, apply = 0; - /* Now we got a difficult situation... we have to find the + /* now we got a difficult situation... we have to find the * target-less IK pchans, and apply transformation to the all - * pchans that were in the chain. */ + * pchans that were in the chain */ LISTBASE_FOREACH (bPoseChannel *, pchan, &ob->pose->chanbase) { data = has_targetless_ik(pchan); @@ -1499,33 +1502,33 @@ static short apply_targetless_ik(Object *ob) /* Fill the array with the bones of the chain (`armature.cc` does same, keep it synced). */ segcount = 0; - /* Exclude tip from chain? */ + /* exclude tip from chain? */ bPoseChannel *parchan = (data->flag & CONSTRAINT_IK_TIP) ? pchan : pchan->parent; - /* Find the chain's root & count the segments needed. */ + /* Find the chain's root & count the segments needed */ for (; parchan; parchan = parchan->parent) { chanlist[segcount] = parchan; segcount++; if (segcount == data->rootbone || segcount > 255) { - break; /* 255 is weak. */ + break; /* 255 is weak */ } } for (; segcount; segcount--) { Bone *bone; float mat[4][4]; - /* `pose_mat(b) = pose_mat(b-1) * offs_bone * channel * constraint * IK`. */ - /* We put in channel the entire result of: `mat = (channel * constraint * IK)`. */ - /* `pose_mat(b) = pose_mat(b-1) * offs_bone * mat`. */ - /* `mat = pose_mat(b) * inv(pose_mat(b-1) * offs_bone)`. */ + /* `pose_mat(b) = pose_mat(b-1) * offs_bone * channel * constraint * IK` */ + /* We put in channel the entire result of: `mat = (channel * constraint * IK)` */ + /* `pose_mat(b) = pose_mat(b-1) * offs_bone * mat` */ + /* `mat = pose_mat(b) * inv(pose_mat(b-1) * offs_bone)` */ parchan = chanlist[segcount - 1]; bone = parchan->bone; - bone->flag |= BONE_TRANSFORM; /* Ensures it gets an auto key inserted. */ + bone->flag |= BONE_TRANSFORM; /* ensures it gets an auto key inserted */ BKE_armature_mat_pose_to_bone(parchan, parchan->pose_mat, mat); - /* Apply and decompose, doesn't work for constraints or non-uniform scale well. */ + /* apply and decompose, doesn't work for constraints or non-uniform scale well */ { float rmat3[3][3], qrmat[3][3], imat3[3][3], smat[3][3]; @@ -1533,15 +1536,15 @@ static short apply_targetless_ik(Object *ob) /* Make sure that our rotation matrix only contains rotation and not scale. */ normalize_m3(rmat3); - /* Rotation. */ + /* rotation */ /* #22409 is partially caused by this, as slight numeric error introduced during * the solving process leads to locked-axis values changing. However, we cannot modify * the values here, or else there are huge discrepancies between IK-solver (interactive) * and applied poses. */ BKE_pchan_mat3_to_rot(parchan, rmat3, false); - /* For size, remove rotation. */ - /* Causes problems with some constraints (so apply only if needed). */ + /* for size, remove rotation */ + /* causes problems with some constraints (so apply only if needed) */ if (data->flag & CONSTRAINT_IK_STRETCH) { BKE_pchan_rot_to_mat3(parchan, qrmat); invert_m3_m3(imat3, qrmat); @@ -1563,7 +1566,7 @@ static short apply_targetless_ik(Object *ob) return apply; } -/** Frees temporal IKs. */ +/* frees temporal IKs */ static void pose_grab_with_ik_clear(Main *bmain, Object *ob) { bKinematicConstraint *data; @@ -1571,12 +1574,12 @@ static void pose_grab_with_ik_clear(Main *bmain, Object *ob) bool relations_changed = false; LISTBASE_FOREACH (bPoseChannel *, pchan, &ob->pose->chanbase) { - /* Clear all temporary lock flags. */ + /* clear all temporary lock flags */ pchan->ikflag &= ~(BONE_IK_NO_XDOF_TEMP | BONE_IK_NO_YDOF_TEMP | BONE_IK_NO_ZDOF_TEMP); pchan->constflag &= ~(PCHAN_HAS_IK | PCHAN_HAS_NO_TARGET); - /* Remove all temporary IK-constraints added. */ + /* remove all temporary IK-constraints added */ for (con = static_cast(pchan->constraints.first); con; con = next) { next = con->next; if (con->type == CONSTRAINT_TYPE_KINEMATIC) { @@ -1584,7 +1587,7 @@ static void pose_grab_with_ik_clear(Main *bmain, Object *ob) if (data->flag & CONSTRAINT_IK_TEMP) { relations_changed = true; - /* `iTaSC` needs clear for removed constraints. */ + /* iTaSC needs clear for removed constraints */ BIK_clear_data(ob->pose); BLI_remlink(&pchan->constraints, con); @@ -1629,9 +1632,9 @@ static void special_aftertrans_update__pose(bContext *C, TransInfo *t) ob = tc->poseobj; if ((t->flag & T_AUTOIK) && (t->options & CTX_AUTOCONFIRM)) { - /* When running transform non-interactively (operator exec), + /* when running transform non-interactively (operator exec), * we need to update the pose otherwise no updates get called during - * transform and the auto-IK is not applied. see #26164. */ + * transform and the auto-ik is not applied. see #26164. */ Object *pose_ob = tc->poseobj; BKE_pose_where_is(t->depsgraph, t->scene, pose_ob); } @@ -1641,12 +1644,12 @@ static void special_aftertrans_update__pose(bContext *C, TransInfo *t) transform_convert_pose_transflags_update(ob, t->mode, t->around); } - /* If target-less IK grabbing, we calculate the pchan transforms and clear flag. */ + /* if target-less IK grabbing, we calculate the pchan transforms and clear flag */ if (!canceled && t->mode == TFM_TRANSLATION) { targetless_ik = apply_targetless_ik(ob); } else { - /* Not forget to clear the auto flag. */ + /* not forget to clear the auto flag */ LISTBASE_FOREACH (bPoseChannel *, pchan, &ob->pose->chanbase) { bKinematicConstraint *data = has_targetless_ik(pchan); if (data) { @@ -1660,8 +1663,8 @@ static void special_aftertrans_update__pose(bContext *C, TransInfo *t) pose_grab_with_ik_clear(bmain, ob); } - /* Automatic inserting of keys and unkeyed tagging - - * only if transform wasn't canceled (or #TFM_DUMMY). */ + /* automatic inserting of keys and unkeyed tagging - + * only if transform wasn't canceled (or TFM_DUMMY) */ if (!canceled && (t->mode != TFM_DUMMY)) { autokeyframe_pose(C, t->scene, ob, targetless_ik, t->mode); DEG_id_tag_update(&ob->id, ID_RECALC_GEOMETRY); diff --git a/source/blender/editors/transform/transform_convert_cursor.cc b/source/blender/editors/transform/transform_convert_cursor.cc index 9404baea908..cb8cdae811c 100644 --- a/source/blender/editors/transform/transform_convert_cursor.cc +++ b/source/blender/editors/transform/transform_convert_cursor.cc @@ -16,8 +16,9 @@ #include "BLI_math_rotation.h" #include "BLI_math_vector.h" -#include "BKE_report.hh" -#include "BKE_scene.hh" +#include "BKE_context.hh" +#include "BKE_report.h" +#include "BKE_scene.h" #include "transform.hh" #include "transform_convert.hh" @@ -77,7 +78,7 @@ static void recalcData_cursor_2D_impl(TransInfo *t) td2d->loc2d[0] = td->loc[0] * aspect_inv[0]; td2d->loc2d[1] = td->loc[1] * aspect_inv[1]; - DEG_id_tag_update(&t->scene->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&t->scene->id, ID_RECALC_COPY_ON_WRITE); } /** \} */ @@ -185,7 +186,7 @@ static void createTransCursor_view3d(bContext * /*C*/, TransInfo *t) static void recalcData_cursor_view3d(TransInfo *t) { - DEG_id_tag_update(&t->scene->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&t->scene->id, ID_RECALC_COPY_ON_WRITE); } /** \} */ diff --git a/source/blender/editors/transform/transform_convert_curve.cc b/source/blender/editors/transform/transform_convert_curve.cc index e796917120d..a1b53936cde 100644 --- a/source/blender/editors/transform/transform_convert_curve.cc +++ b/source/blender/editors/transform/transform_convert_curve.cc @@ -15,6 +15,7 @@ #include "BLI_math_matrix.h" #include "BLI_math_vector.h" +#include "BKE_context.hh" #include "BKE_curve.hh" #include "ED_object.hh" @@ -94,7 +95,7 @@ static void createTransCurveVerts(bContext * /*C*/, TransInfo *t) continue; } - /* Count total of vertices, check identical as in 2nd loop for making transdata! */ + /* count total of vertices, check identical as in 2nd loop for making transdata! */ ListBase *nurbs = BKE_curve_editNurbs_get(cu); LISTBASE_FOREACH (Nurb *, nu, nurbs) { if (nu->type == CU_BEZIER) { @@ -177,7 +178,7 @@ static void createTransCurveVerts(bContext * /*C*/, TransInfo *t) transform_mode_use_local_origins(t)); float mtx[3][3], smtx[3][3]; - copy_m3_m4(mtx, tc->obedit->object_to_world().ptr()); + copy_m3_m4(mtx, tc->obedit->object_to_world); pseudoinverse_m3_m3(smtx, mtx, PSEUDOINVERSE_EPSILON); TransData *td = tc->data; @@ -199,7 +200,7 @@ static void createTransCurveVerts(bContext * /*C*/, TransInfo *t) BKE_nurb_bezt_calc_plane(nu, bezt, plane); if (createSpaceNormalTangent(axismtx, normal, plane)) { - /* Pass. */ + /* pass */ } else { normalize_v3(normal); @@ -251,7 +252,7 @@ static void createTransCurveVerts(bContext * /*C*/, TransInfo *t) tail++; } - /* This is the Curve Point, the other two are handles. */ + /* This is the Curve Point, the other two are handles */ if (is_prop_edit || bezt_tx & SEL_F2) { copy_v3_v3(td->iloc, bezt->vec[1]); td->loc = bezt->vec[1]; @@ -286,7 +287,7 @@ static void createTransCurveVerts(bContext * /*C*/, TransInfo *t) if ((bezt_tx & SEL_F1) == 0 && (bezt_tx & SEL_F3) == 0) { /* If the middle is selected but the sides aren't, this is needed. */ if (hdata == nullptr) { - /* If the handle was not saved by the previous handle. */ + /* if the handle was not saved by the previous handle */ hdata = initTransDataCurveHandles(td, bezt); } } @@ -322,7 +323,7 @@ static void createTransCurveVerts(bContext * /*C*/, TransInfo *t) td->val = nullptr; if (hdata == nullptr) { - /* If the handle was not saved by the previous handle. */ + /* if the handle was not saved by the previous handle */ hdata = initTransDataCurveHandles(td, bezt); } @@ -336,7 +337,7 @@ static void createTransCurveVerts(bContext * /*C*/, TransInfo *t) tail++; } - (void)hdata; /* Quiet warning. */ + (void)hdata; /* quiet warning */ } } } @@ -376,7 +377,7 @@ static void createTransCurveVerts(bContext * /*C*/, TransInfo *t) BKE_nurb_bpoint_calc_plane(nu, bp, plane); if (createSpaceNormalTangent(td->axismtx, normal, plane)) { - /* Pass. */ + /* pass */ } else { normalize_v3(normal); @@ -406,12 +407,12 @@ static void createTransCurveVerts(bContext * /*C*/, TransInfo *t) } /* TODO: in the case of tilt and radius we can also avoid allocating the - * #initTransDataCurveHandles but for now just don't change handle types. */ + * initTransDataCurveHandles but for now just don't change handle types */ if ((nu->type == CU_BEZIER) && ELEM(t->mode, TFM_CURVE_SHRINKFATTEN, TFM_TILT, TFM_DUMMY) == 0) { - /* Sets the handles based on their selection, - * do this after the data is copied to the #TransData. */ + /* sets the handles based on their selection, + * do this after the data is copied to the TransData */ BKE_nurb_handles_test(nu, handle_mode, use_around_origins_for_handles_test); } } @@ -436,7 +437,7 @@ static void recalcData_curve(TransInfo *t) if (t->state == TRANS_CANCEL) { while (nu) { - /* Can't do testhandlesNurb here, it messes up the h1 and h2 flags. */ + /* Can't do testhandlesNurb here, it messes up the h1 and h2 flags */ BKE_nurb_handles_calc(nu); nu = nu->next; } diff --git a/source/blender/editors/transform/transform_convert_curves.cc b/source/blender/editors/transform/transform_convert_curves.cc index 06916da105b..ad9d4b1de79 100644 --- a/source/blender/editors/transform/transform_convert_curves.cc +++ b/source/blender/editors/transform/transform_convert_curves.cc @@ -95,8 +95,7 @@ static void createTransCurvesVerts(bContext * /*C*/, TransInfo *t) if (tc.data_len == 0) { continue; } - Object *object = tc.obedit; - Curves *curves_id = static_cast(object->data); + Curves *curves_id = static_cast(tc.obedit->data); bke::CurvesGeometry &curves = curves_id->geometry.wrap(); std::optional> value_attribute; @@ -118,7 +117,6 @@ static void createTransCurvesVerts(bContext * /*C*/, TransInfo *t) curve_populate_trans_data_structs(tc, curves, - object->object_to_world(), value_attribute, selection_per_object[i], use_proportional_edit, @@ -155,10 +153,9 @@ static void recalcData_curves(TransInfo *t) void curve_populate_trans_data_structs(TransDataContainer &tc, blender::bke::CurvesGeometry &curves, - const blender::float4x4 &transform, std::optional> value_attribute, const blender::IndexMask &selected_indices, - const bool use_proportional_edit, + bool use_proportional_edit, const blender::IndexMask &affected_curves, bool use_connected_only, int trans_data_offset) @@ -166,7 +163,7 @@ void curve_populate_trans_data_structs(TransDataContainer &tc, using namespace blender; float mtx[3][3], smtx[3][3]; - copy_m3_m4(mtx, transform.ptr()); + copy_m3_m4(mtx, tc.obedit->object_to_world); pseudoinverse_m3_m3(smtx, mtx, PSEUDOINVERSE_EPSILON); MutableSpan positions = curves.positions_for_write(); diff --git a/source/blender/editors/transform/transform_convert_gpencil_legacy.cc b/source/blender/editors/transform/transform_convert_gpencil_legacy.cc index a1ae2c948cf..274a13d457e 100644 --- a/source/blender/editors/transform/transform_convert_gpencil_legacy.cc +++ b/source/blender/editors/transform/transform_convert_gpencil_legacy.cc @@ -110,7 +110,7 @@ static void createTransGPencil_curves(bContext *C, TransDataContainer *tc = TRANS_DATA_CONTAINER_FIRST_SINGLE(t); tc->data_len = 0; - /* Number of selected curve points. */ + /* Number of selected curve points */ uint32_t tot_curve_points = 0, tot_sel_curve_points = 0, tot_points = 0, tot_sel_points = 0; LISTBASE_FOREACH (bGPDlayer *, gpl, &gpd->layers) { /* Only editable and visible layers are considered. */ @@ -120,7 +120,7 @@ static void createTransGPencil_curves(bContext *C, for (bGPDframe *gpf = init_gpf; gpf; gpf = gpf->next) { if ((gpf == gpl->actframe) || ((gpf->flag & GP_FRAME_SELECT) && (is_multiedit))) { LISTBASE_FOREACH (bGPDstroke *, gps, &gpf->strokes) { - /* Skip strokes that are invalid for current view. */ + /* skip strokes that are invalid for current view */ if (ED_gpencil_stroke_can_use(C, gps) == false) { continue; } @@ -128,7 +128,7 @@ static void createTransGPencil_curves(bContext *C, if (ED_gpencil_stroke_material_editable(obact, gpl, gps) == false) { continue; } - /* Check if stroke has an editcurve. */ + /* Check if stroke has an editcurve */ if (gps->editcurve == nullptr) { continue; } @@ -242,7 +242,7 @@ static void createTransGPencil_curves(bContext *C, for (gpf = init_gpf; gpf; gpf = gpf->next) { if ((gpf == gpl->actframe) || ((gpf->flag & GP_FRAME_SELECT) && (is_multiedit))) { /* If multi-frame and falloff, recalculate and save value. */ - float falloff = 1.0f; /* By default no falloff. */ + float falloff = 1.0f; /* by default no falloff */ if ((is_multiedit) && (use_multiframe_falloff)) { /* Falloff depends on distance to active frame * (relative to the overall frame range). */ @@ -251,7 +251,7 @@ static void createTransGPencil_curves(bContext *C, } LISTBASE_FOREACH (bGPDstroke *, gps, &gpf->strokes) { - /* Skip strokes that are invalid for current view. */ + /* skip strokes that are invalid for current view */ if (ED_gpencil_stroke_can_use(C, gps) == false) { continue; } @@ -259,7 +259,7 @@ static void createTransGPencil_curves(bContext *C, if (ED_gpencil_stroke_material_editable(obact, gpl, gps) == false) { continue; } - /* Check if stroke has an editcurve. */ + /* Check if stroke has an editcurve */ if (gps->editcurve == nullptr) { continue; } @@ -284,7 +284,7 @@ static void createTransGPencil_curves(bContext *C, handle_all_visible || (handle_only_selected_visible && (gpc_pt->flag & GP_CURVE_POINT_SELECT))); const short sel_flag = get_bezt_sel_triple_flag(bezt, hide_handles); - /* Iterate over bezier triple. */ + /* Iterate over bezier triple */ for (int j = 0; j < 3; j++) { bool is_ctrl_point = (j == 1); bool sel = sel_flag & (1 << j); @@ -356,7 +356,7 @@ static void createTransGPencil_curves(bContext *C, bezt_use |= sel; } - /* Update the handle types so transformation is possible. */ + /* Update the handle types so transformation is possible */ if (bezt_use && !ELEM(t->mode, TFM_GPENCIL_OPACITY, TFM_GPENCIL_SHRINKFATTEN)) { BKE_nurb_bezt_handle_test(bezt, SELECT, @@ -428,7 +428,7 @@ static void createTransGPencil_strokes(bContext *C, for (gpf = init_gpf; gpf; gpf = gpf->next) { if ((gpf == gpl->actframe) || ((gpf->flag & GP_FRAME_SELECT) && (is_multiedit))) { LISTBASE_FOREACH (bGPDstroke *, gps, &gpf->strokes) { - /* Skip strokes that are invalid for current view. */ + /* skip strokes that are invalid for current view */ if (ED_gpencil_stroke_can_use(C, gps) == false) { continue; } @@ -478,7 +478,7 @@ static void createTransGPencil_strokes(bContext *C, return; } - /* Allocate memory for data. */ + /* Allocate memory for data */ tc->data = static_cast( MEM_callocN(tc->data_len * sizeof(TransData), "TransData(GPencil)")); td = tc->data; @@ -488,7 +488,7 @@ static void createTransGPencil_strokes(bContext *C, /* Second Pass: Build transform-data array. */ LISTBASE_FOREACH (bGPDlayer *, gpl, &gpd->layers) { - /* Only editable and visible layers are considered. */ + /* only editable and visible layers are considered */ if (BKE_gpencil_layer_is_editable(gpl) && (gpl->actframe != nullptr)) { const int cfra = (gpl->flag & GP_LAYER_FRAMELOCK) ? gpl->actframe->framenum : cfra_scene; bGPDframe *gpf = gpl->actframe; @@ -539,7 +539,7 @@ static void createTransGPencil_strokes(bContext *C, if ((gpf == gpl->actframe) || ((gpf->flag & GP_FRAME_SELECT) && (is_multiedit))) { /* If multi-frame and falloff, recalculate and save value. */ - float falloff = 1.0f; /* By default no falloff. */ + float falloff = 1.0f; /* by default no falloff */ if ((is_multiedit) && (use_multiframe_falloff)) { /* Falloff depends on distance to active frame * (relative to the overall frame range). */ @@ -552,27 +552,27 @@ static void createTransGPencil_strokes(bContext *C, TransData *tail = td; bool stroke_ok; - /* Skip strokes that are invalid for current view. */ + /* skip strokes that are invalid for current view */ if (ED_gpencil_stroke_can_use(C, gps) == false) { continue; } - /* Check if the color is editable. */ + /* check if the color is editable */ if (ED_gpencil_stroke_material_editable(obact, gpl, gps) == false) { continue; } /* What we need to include depends on proportional editing settings... */ if (is_prop_edit) { if (is_prop_edit_connected) { - /* A) "Connected" - Only those in selected strokes. */ + /* A) "Connected" - Only those in selected strokes */ stroke_ok = (gps->flag & GP_STROKE_SELECT) != 0; } else { - /* B) All points, always. */ + /* B) All points, always */ stroke_ok = true; } } else { - /* C) Only selected points in selected strokes. */ + /* C) Only selected points in selected strokes */ stroke_ok = (gps->flag & GP_STROKE_SELECT) != 0; } @@ -581,18 +581,18 @@ static void createTransGPencil_strokes(bContext *C, bGPDspoint *pt; int i; - /* Save falloff factor. */ + /* save falloff factor */ gps->runtime.multi_frame_falloff = falloff; - /* Calculate stroke center. */ + /* calculate stroke center */ float center[3]; createTransGPencil_center_get(gps, center); - /* Add all necessary points... */ + /* add all necessary points... */ for (i = 0, pt = gps->points; i < gps->totpoints; i++, pt++) { bool point_ok; - /* Include point? */ + /* include point? */ if (is_prop_edit) { /* Always all points in strokes that get included. */ point_ok = true; @@ -602,7 +602,7 @@ static void createTransGPencil_strokes(bContext *C, point_ok = (pt->flag & GP_SPOINT_SELECT) != 0; } - /* Do point... */ + /* do point... */ if (point_ok) { copy_v3_v3(td->iloc, &pt->x); /* Only copy center in local origins. @@ -626,7 +626,8 @@ static void createTransGPencil_strokes(bContext *C, } /* For other transform modes (e.g. shrink-fatten), need to additional data - * but never for mirror. */ + * but never for mirror. + */ if (t->mode != TFM_MIRROR) { if (t->mode != TFM_GPENCIL_OPACITY) { if (is_scale_thickness) { @@ -648,15 +649,15 @@ static void createTransGPencil_strokes(bContext *C, td->protectflag = OB_LOCK_LOCZ | OB_LOCK_ROTZ | OB_LOCK_SCALEZ; } else { - /* Configure 2D data-space points so that they don't play up. */ + /* configure 2D data-space points so that they don't play up. */ if (gps->flag & (GP_STROKE_2DSPACE | GP_STROKE_2DIMAGE)) { td->protectflag = OB_LOCK_LOCZ | OB_LOCK_ROTZ | OB_LOCK_SCALEZ; } } - /* Apply parent transformations. */ - copy_m3_m3(td->smtx, inverse_diff_mat); /* Final position. */ - copy_m3_m3(td->mtx, diff_mat); /* Display position. */ - copy_m3_m3(td->axismtx, diff_mat); /* Axis orientation. */ + /* apply parent transformations */ + copy_m3_m3(td->smtx, inverse_diff_mat); /* final position */ + copy_m3_m3(td->mtx, diff_mat); /* display position */ + copy_m3_m3(td->axismtx, diff_mat); /* axis orientation */ /* Triangulation must be calculated again, * so save the stroke for recalculate function. */ @@ -713,7 +714,7 @@ static void createTransGPencil(bContext *C, TransInfo *t) const bool is_curve_edit = bool(GPENCIL_CURVE_EDIT_SESSIONS_ON(gpd)); - /* Initialize falloff curve. */ + /* initialize falloff curve */ if (is_multiedit) { BKE_curvemapping_init(ts->gp_sculpt.cur_falloff); } diff --git a/source/blender/editors/transform/transform_convert_graph.cc b/source/blender/editors/transform/transform_convert_graph.cc index d80942f35ac..61c482b62eb 100644 --- a/source/blender/editors/transform/transform_convert_graph.cc +++ b/source/blender/editors/transform/transform_convert_graph.cc @@ -15,19 +15,21 @@ #include "BLI_math_vector.h" #include "BKE_context.hh" -#include "BKE_fcurve.hh" +#include "BKE_fcurve.h" #include "BKE_layer.hh" #include "BKE_nla.h" -#include "BKE_report.hh" +#include "BKE_report.h" #include "ED_anim_api.hh" #include "ED_keyframes_edit.hh" +#include "ED_markers.hh" #include "UI_view2d.hh" #include "transform.hh" #include "transform_constraints.hh" #include "transform_convert.hh" +#include "transform_mode.hh" #include "transform_snap.hh" struct TransDataGraph { @@ -39,9 +41,8 @@ struct TransDataGraph { /** \name Graph Editor Transform Creation * \{ */ -/** - * Helper function for createTransGraphEditData, which is responsible for associating - * source data with transform data. +/* Helper function for createTransGraphEditData, which is responsible for associating + * source data with transform data */ static void bezt_to_transdata(TransData *td, TransData2D *td2d, @@ -109,7 +110,7 @@ static void bezt_to_transdata(TransData *td, td->ext = nullptr; td->val = nullptr; - /* Store AnimData info in td->extra, for applying mapping when flushing. */ + /* store AnimData info in td->extra, for applying mapping when flushing */ td->extra = adt; if (selected) { @@ -127,7 +128,7 @@ static void bezt_to_transdata(TransData *td, td->flag |= TD_INTVALUES; } - /* Copy space-conversion matrices for dealing with non-uniform scales. */ + /* copy space-conversion matrices for dealing with non-uniform scales */ copy_m3_m3(td->mtx, mtx); copy_m3_m3(td->smtx, smtx); @@ -253,26 +254,26 @@ static void createTransGraphEditData(bContext *C, TransInfo *t) short anim_map_flag = ANIM_UNITCONV_ONLYSEL | ANIM_UNITCONV_SELVERTS; bool sel_key, sel_left, sel_right; - /* Determine what type of data we are operating on. */ + /* determine what type of data we are operating on */ if (ANIM_animdata_get_context(C, &ac) == 0) { return; } anim_map_flag |= ANIM_get_normalization_flags(ac.sl); - /* Filter data. */ + /* filter data */ filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_CURVE_VISIBLE | ANIMFILTER_FCURVESONLY); ANIM_animdata_filter( &ac, &anim_data, eAnimFilter_Flags(filter), ac.data, eAnimCont_Types(ac.datatype)); - /* Which side of the current frame should be allowed. */ + /* which side of the current frame should be allowed */ /* XXX we still want this mode, but how to get this using standard transform too? */ if (t->mode == TFM_TIME_EXTEND) { t->frame_side = transform_convert_frame_side_dir_get(t, float(scene->r.cfra)); } else { - /* Normal transform - both sides of current frame are considered. */ + /* normal transform - both sides of current frame are considered */ t->frame_side = 'B'; } @@ -285,13 +286,14 @@ static void createTransGraphEditData(bContext *C, TransInfo *t) int curvecount = 0; bool selected = false; - /* F-Curve may not have any keyframes. */ + /* F-Curve may not have any keyframes */ if (fcu->bezt == nullptr) { continue; } - /* Convert current-frame to action-time (slightly less accurate, especially under - * higher scaling ratios, but is faster than converting all points). */ + /* convert current-frame to action-time (slightly less accurate, especially under + * higher scaling ratios, but is faster than converting all points) + */ if (adt) { cfra = BKE_nla_tweakedit_remap(adt, float(scene->r.cfra), NLATIME_CONVERT_UNMAP); } @@ -320,7 +322,7 @@ static void createTransGraphEditData(bContext *C, TransInfo *t) count++; } - /* Only include main vert if selected. */ + /* only include main vert if selected */ if (sel_key && !use_local_center) { count++; } @@ -336,16 +338,16 @@ static void createTransGraphEditData(bContext *C, TransInfo *t) } } - /* Stop if trying to build list if nothing selected. */ + /* stop if trying to build list if nothing selected */ if (count == 0) { - /* Cleanup temp list. */ + /* cleanup temp list */ ANIM_animdata_freelist(&anim_data); return; } TransDataContainer *tc = TRANS_DATA_CONTAINER_FIRST_SINGLE(t); - /* Allocate memory for data. */ + /* allocate memory for data */ tc->data_len = count; tc->data = static_cast( @@ -361,21 +363,21 @@ static void createTransGraphEditData(bContext *C, TransInfo *t) td2d = tc->data_2d; tdg = static_cast(tc->custom.type.data); - /* Precompute space-conversion matrices for dealing with non-uniform scaling of Graph Editor. */ + /* precompute space-conversion matrices for dealing with non-uniform scaling of Graph Editor */ unit_m3(mtx); unit_m3(smtx); if (ELEM(t->mode, TFM_ROTATION, TFM_RESIZE)) { float xscale, yscale; - /* Apply scale factors to x and y axes of space-conversion matrices. */ + /* apply scale factors to x and y axes of space-conversion matrices */ UI_view2d_scale_get(v2d, &xscale, &yscale); - /* `mtx` is data to global (i.e. view) conversion. */ + /* mtx is data to global (i.e. view) conversion */ mul_v3_fl(mtx[0], xscale); mul_v3_fl(mtx[1], yscale); - /* `smtx` is global (i.e. view) to data conversion. */ + /* smtx is global (i.e. view) to data conversion */ if (IS_EQF(xscale, 0.0f) == 0) { mul_v3_fl(smtx[0], 1.0f / xscale); } @@ -386,7 +388,7 @@ static void createTransGraphEditData(bContext *C, TransInfo *t) bool at_least_one_key_selected = false; - /* Loop 2: build transdata arrays. */ + /* loop 2: build transdata arrays */ LISTBASE_FOREACH (bAnimListElem *, ale, &anim_data) { AnimData *adt = ANIM_nla_mapping_get(&ac, ale); FCurve *fcu = (FCurve *)ale->key_data; @@ -394,13 +396,14 @@ static void createTransGraphEditData(bContext *C, TransInfo *t) float unit_scale, offset; float cfra; - /* F-Curve may not have any keyframes. */ + /* F-Curve may not have any keyframes */ if (fcu->bezt == nullptr || (is_prop_edit && ale->tag == 0)) { continue; } - /* Convert current-frame to action-time (slightly less accurate, especially under - * higher scaling ratios, but is faster than converting all points). */ + /* convert current-frame to action-time (slightly less accurate, especially under + * higher scaling ratios, but is faster than converting all points) + */ if (adt) { cfra = BKE_nla_tweakedit_remap(adt, float(scene->r.cfra), NLATIME_CONVERT_UNMAP); } @@ -417,8 +420,8 @@ static void createTransGraphEditData(bContext *C, TransInfo *t) bezt->f2 &= ~BEZT_FLAG_TEMP_TAG; bezt->f3 &= ~BEZT_FLAG_TEMP_TAG; - /* Only include BezTriples whose 'keyframe' occurs on the same side - * of the current frame as mouse (if applicable). */ + /* only include BezTriples whose 'keyframe' occurs on the same side + * of the current frame as mouse (if applicable) */ if (FrameOnMouseSide(t->frame_side, bezt->vec[1][0], cfra)) { TransDataCurveHandleFlags *hdata = nullptr; @@ -426,8 +429,7 @@ static void createTransGraphEditData(bContext *C, TransInfo *t) at_least_one_key_selected |= sel_key; if (is_prop_edit) { bool is_sel = (sel_key || sel_left || sel_right); - /* We always select all handles for proportional editing * if central handle is - * selected. */ + /* we always select all handles for proportional editing if central handle is selected */ initTransDataCurveHandles(td, bezt); bezt_to_transdata(td++, td2d++, @@ -478,8 +480,9 @@ static void createTransGraphEditData(bContext *C, TransInfo *t) } } else { - /* Only include handles if selected, irrespective of the interpolation modes. - * also, only treat handles specially if the center point isn't selected. */ + /* only include handles if selected, irrespective of the interpolation modes. + * also, only treat handles specially if the center point isn't selected. + */ if (sel_left) { hdata = initTransDataCurveHandles(td, bezt); bezt_to_transdata(td++, @@ -518,9 +521,9 @@ static void createTransGraphEditData(bContext *C, TransInfo *t) bezt->f3 |= BEZT_FLAG_TEMP_TAG; } - /* Only include main vert if selected. */ + /* only include main vert if selected */ if (sel_key && !use_local_center) { - /* Move handles relative to center. */ + /* move handles relative to center */ if (graph_edit_is_translation_mode(t)) { if (sel_left) { td->flag |= TD_MOVEHANDLE1; @@ -530,7 +533,7 @@ static void createTransGraphEditData(bContext *C, TransInfo *t) } } - /* If handles were not selected, store their selection status. */ + /* if handles were not selected, store their selection status */ if (!(sel_left) || !(sel_right)) { if (hdata == nullptr) { hdata = initTransDataCurveHandles(td, bezt); @@ -557,7 +560,7 @@ static void createTransGraphEditData(bContext *C, TransInfo *t) * * - Check if we've got entire BezTriple selected and we're scaling/rotating that point, * then check if we're using auto-handles. - * - If so, change them auto-handles to aligned handles so that handles get affected too. + * - If so, change them auto-handles to aligned handles so that handles get affected too */ if (ELEM(bezt->h1, HD_AUTO, HD_AUTO_ANIM) && ELEM(bezt->h2, HD_AUTO, HD_AUTO_ANIM) && ELEM(t->mode, TFM_ROTATION, TFM_RESIZE)) @@ -571,12 +574,12 @@ static void createTransGraphEditData(bContext *C, TransInfo *t) } } - /* Sets handles based on the selection. */ + /* Sets handles based on the selection */ testhandles_fcurve(fcu, BEZT_FLAG_TEMP_TAG, use_handle); } if (is_prop_edit) { - /* Loop 2: build transdata arrays. */ + /* loop 2: build transdata arrays */ td = tc->data; LISTBASE_FOREACH (bAnimListElem *, ale, &anim_data) { @@ -585,13 +588,14 @@ static void createTransGraphEditData(bContext *C, TransInfo *t) TransData *td_start = td; float cfra; - /* F-Curve may not have any keyframes. */ + /* F-Curve may not have any keyframes */ if (fcu->bezt == nullptr || (ale->tag == 0)) { continue; } - /* Convert current-frame to action-time (slightly less accurate, especially under - * higher scaling ratios, but is faster than converting all points). */ + /* convert current-frame to action-time (slightly less accurate, especially under + * higher scaling ratios, but is faster than converting all points) + */ if (adt) { cfra = BKE_nla_tweakedit_remap(adt, float(scene->r.cfra), NLATIME_CONVERT_UNMAP); } @@ -600,8 +604,8 @@ static void createTransGraphEditData(bContext *C, TransInfo *t) } for (i = 0, bezt = fcu->bezt; i < fcu->totvert; i++, bezt++) { - /* Only include BezTriples whose 'keyframe' occurs on the - * same side of the current frame as mouse (if applicable). */ + /* only include BezTriples whose 'keyframe' occurs on the + * same side of the current frame as mouse (if applicable) */ if (FrameOnMouseSide(t->frame_side, bezt->vec[1][0], cfra)) { graph_bezt_get_transform_selection(t, bezt, use_handle, &sel_left, &sel_key, &sel_right); @@ -637,7 +641,7 @@ static void createTransGraphEditData(bContext *C, TransInfo *t) enable_autolock(t, sipo); } - /* Cleanup temp list. */ + /* cleanup temp list */ ANIM_animdata_freelist(&anim_data); } @@ -652,7 +656,7 @@ static bool fcu_test_selected(FCurve *fcu) BezTriple *bezt = fcu->bezt; uint i; - if (bezt == nullptr) { /* Ignore baked. */ + if (bezt == nullptr) { /* ignore baked */ return false; } @@ -665,9 +669,8 @@ static bool fcu_test_selected(FCurve *fcu) return false; } -/** - * This function is called on recalc_data to apply the transforms applied - * to the transdata on to the actual keyframe data. +/* This function is called on recalc_data to apply the transforms applied + * to the transdata on to the actual keyframe data */ static void flushTransGraphData(TransInfo *t) { @@ -679,7 +682,7 @@ static void flushTransGraphData(TransInfo *t) eSnapMode snap_mode = t->tsnap.mode; TransDataContainer *tc = TRANS_DATA_CONTAINER_FIRST_SINGLE(t); - /* Flush to 2d vector from internally used 3d vector. */ + /* flush to 2d vector from internally used 3d vector */ for (a = 0, td = tc->data, td2d = tc->data_2d, @@ -687,7 +690,7 @@ static void flushTransGraphData(TransInfo *t) a < tc->data_len; a++, td++, td2d++, tdg++) { - /* Pointers to relevant AnimData blocks are stored in the `td->extra` pointers. */ + /* pointers to relevant AnimData blocks are stored in the td->extra pointers */ AnimData *adt = (AnimData *)td->extra; float inv_unit_scale = 1.0f / tdg->unit_scale; @@ -701,7 +704,7 @@ static void flushTransGraphData(TransInfo *t) transform_snap_anim_flush_data(t, td, snap_mode, td->loc); } - /* We need to unapply the nla-mapping from the time in some situations. */ + /* we need to unapply the nla-mapping from the time in some situations */ if (adt) { td2d->loc2d[0] = BKE_nla_tweakedit_remap(adt, td2d->loc[0], NLATIME_CONVERT_UNMAP); } @@ -709,7 +712,7 @@ static void flushTransGraphData(TransInfo *t) td2d->loc2d[0] = td2d->loc[0]; } - /* If int-values only, truncate to integers. */ + /* if int-values only, truncate to integers */ if (td->flag & TD_INTVALUES) { td2d->loc2d[1] = floorf(td2d->loc[1] * inv_unit_scale - tdg->offset + 0.5f); } @@ -721,22 +724,17 @@ static void flushTransGraphData(TransInfo *t) } } -/** Struct for use in re-sorting BezTriples during Graph Editor transform. */ +/* struct for use in re-sorting BezTriples during Graph Editor transform */ struct BeztMap { BezTriple *bezt; - /** Index of `bezt` in `fcu->bezt` array before sorting. */ - uint oldIndex; - /** Index of `bezt` in `fcu->bezt` array after sorting. */ - uint newIndex; - /** Swap order of handles (-1=clear; 0=not checked, 1=swap). */ - short swapHs; - /** Interpolation of current and next segments. */ - char pipo, cipo; + uint oldIndex; /* index of bezt in fcu->bezt array before sorting */ + uint newIndex; /* index of bezt in fcu->bezt array after sorting */ + short swapHs; /* swap order of handles (-1=clear; 0=not checked, 1=swap) */ + char pipo, cipo; /* interpolation of current and next segments */ }; -/** - * This function converts an FCurve's BezTriple array to a BeztMap array - * NOTE: this allocates memory that will need to get freed later. +/* This function converts an FCurve's BezTriple array to a BeztMap array + * NOTE: this allocates memory that will need to get freed later */ static BeztMap *bezt_to_beztmaps(BezTriple *bezts, int totvert) { @@ -745,13 +743,13 @@ static BeztMap *bezt_to_beztmaps(BezTriple *bezts, int totvert) BeztMap *bezm, *bezms; int i; - /* Allocate memory for this array. */ + /* allocate memory for this array */ if (totvert == 0 || bezts == nullptr) { return nullptr; } bezm = bezms = static_cast(MEM_callocN(sizeof(BeztMap) * totvert, "BeztMaps")); - /* Assign beztriples to beztmaps. */ + /* assign beztriples to beztmaps */ for (i = 0; i < totvert; i++, bezm++, prevbezt = bezt, bezt++) { bezm->bezt = bezt; @@ -765,20 +763,20 @@ static BeztMap *bezt_to_beztmaps(BezTriple *bezts, int totvert) return bezms; } -/* This function copies the code of sort_time_ipocurve, but acts on BeztMap structs instead. */ +/* This function copies the code of sort_time_ipocurve, but acts on BeztMap structs instead */ static void sort_time_beztmaps(BeztMap *bezms, int totvert) { BeztMap *bezm; int i, ok = 1; - /* Keep repeating the process until nothing is out of place anymore. */ + /* keep repeating the process until nothing is out of place anymore */ while (ok) { ok = 0; bezm = bezms; i = totvert; while (i--) { - /* Is current bezm out of order (i.e. occurs later than next)? */ + /* is current bezm out of order (i.e. occurs later than next)? */ if (i > 0) { if (bezm->bezt->vec[1][0] > (bezm + 1)->bezt->vec[1][0]) { bezm->newIndex++; @@ -790,17 +788,18 @@ static void sort_time_beztmaps(BeztMap *bezms, int totvert) } } - /* Do we need to check if the handles need to be swapped? - * Optimization: this only needs to be performed in the first loop. */ + /* do we need to check if the handles need to be swapped? + * optimization: this only needs to be performed in the first loop + */ if (bezm->swapHs == 0) { if ((bezm->bezt->vec[0][0] > bezm->bezt->vec[1][0]) && (bezm->bezt->vec[2][0] < bezm->bezt->vec[1][0])) { - /* Handles need to be swapped. */ + /* handles need to be swapped */ bezm->swapHs = 1; } else { - /* Handles need to be cleared. */ + /* handles need to be cleared */ bezm->swapHs = -1; } } @@ -810,7 +809,7 @@ static void sort_time_beztmaps(BeztMap *bezms, int totvert) } } -/* This function firstly adjusts the pointers that the transdata has to each BezTriple. */ +/* This function firstly adjusts the pointers that the transdata has to each BezTriple */ static void beztmap_to_data(TransInfo *t, FCurve *fcu, BeztMap *bezms, int totvert) { BezTriple *bezts = fcu->bezt; @@ -822,25 +821,29 @@ static void beztmap_to_data(TransInfo *t, FCurve *fcu, BeztMap *bezms, int totve TransDataContainer *tc = TRANS_DATA_CONTAINER_FIRST_SINGLE(t); - /* Dynamically allocate an array of chars to mark whether an TransData's - * pointers have been fixed already, so that we don't override ones that are already done. */ + /* dynamically allocate an array of chars to mark whether an TransData's + * pointers have been fixed already, so that we don't override ones that are + * already done + */ adjusted = static_cast(MEM_callocN(tc->data_len, "beztmap_adjusted_map")); - /* For each beztmap item, find if it is used anywhere. */ + /* for each beztmap item, find if it is used anywhere */ bezm = bezms; for (i = 0; i < totvert; i++, bezm++) { - /* Loop through transdata, testing if we have a hit - * for the handles (vec[0]/vec[2]), we must also check if they need to be swapped. */ + /* loop through transdata, testing if we have a hit + * for the handles (vec[0]/vec[2]), we must also check if they need to be swapped... + */ td2d = tc->data_2d; td = tc->data; for (j = 0; j < tc->data_len; j++, td2d++, td++) { - /* Skip item if already marked. */ + /* skip item if already marked */ if (adjusted[j] != 0) { continue; } - /* Update all transdata pointers, no need to check for selections etc, - * since only points that are really needed were created as transdata. */ + /* update all transdata pointers, no need to check for selections etc, + * since only points that are really needed were created as transdata + */ if (td2d->loc2d == bezm->bezt->vec[0]) { if (bezm->swapHs == 1) { td2d->loc2d = (bezts + bezm->newIndex)->vec[2]; @@ -862,7 +865,7 @@ static void beztmap_to_data(TransInfo *t, FCurve *fcu, BeztMap *bezms, int totve else if (td2d->loc2d == bezm->bezt->vec[1]) { td2d->loc2d = (bezts + bezm->newIndex)->vec[1]; - /* If only control point is selected, the handle pointers need to be updated as well. */ + /* if only control point is selected, the handle pointers need to be updated as well */ if (td2d->h1) { td2d->h1 = (bezts + bezm->newIndex)->vec[0]; } @@ -873,7 +876,7 @@ static void beztmap_to_data(TransInfo *t, FCurve *fcu, BeztMap *bezms, int totve adjusted[j] = 1; } - /* The handle type pointer has to be updated too. */ + /* the handle type pointer has to be updated too */ if (adjusted[j] && td->flag & TD_BEZTRIPLE && td->hdata) { if (bezm->swapHs == 1) { td->hdata->h1 = &(bezts + bezm->newIndex)->h2; @@ -887,7 +890,7 @@ static void beztmap_to_data(TransInfo *t, FCurve *fcu, BeztMap *bezms, int totve } } - /* Free temp memory used for 'adjusted' array. */ + /* free temp memory used for 'adjusted' array */ MEM_freeN(adjusted); } @@ -903,7 +906,7 @@ static void remake_graph_transdata(TransInfo *t, ListBase *anim_data) SpaceGraph *sipo = (SpaceGraph *)t->area->spacedata.first; const bool use_handle = (sipo->flag & SIPO_NOHANDLES) == 0; - /* Sort and reassign verts. */ + /* sort and reassign verts */ LISTBASE_FOREACH (bAnimListElem *, ale, anim_data) { FCurve *fcu = (FCurve *)ale->key_data; @@ -916,14 +919,13 @@ static void remake_graph_transdata(TransInfo *t, ListBase *anim_data) sort_time_beztmaps(bezm, fcu->totvert); beztmap_to_data(t, fcu, bezm, fcu->totvert); - /* Free mapping stuff. */ + /* free mapping stuff */ MEM_freeN(bezm); - /* Re-sort actual beztriples - * (perhaps this could be done using the beztmaps to save time?). */ + /* re-sort actual beztriples (perhaps this could be done using the beztmaps to save time?) */ sort_time_fcurve(fcu); - /* Make sure handles are all set correctly. */ + /* make sure handles are all set correctly */ testhandles_fcurve(fcu, BEZT_FLAG_TEMP_TAG, use_handle); } } @@ -942,8 +944,8 @@ static void recalcData_graphedit(TransInfo *t) BKE_view_layer_synced_ensure(t->scene, t->view_layer); - /* Initialize relevant anim-context 'context' data from TransInfo data. */ - /* NOTE: sync this with the code in #ANIM_animdata_get_context(). */ + /* initialize relevant anim-context 'context' data from TransInfo data */ + /* NOTE: sync this with the code in ANIM_animdata_get_context() */ ac.bmain = CTX_data_main(t->context); ac.scene = t->scene; ac.view_layer = t->view_layer; @@ -956,25 +958,25 @@ static void recalcData_graphedit(TransInfo *t) ANIM_animdata_context_getdata(&ac); - /* Do the flush first. */ + /* do the flush first */ flushTransGraphData(t); - /* Get curves to check if a re-sort is needed. */ + /* get curves to check if a re-sort is needed */ filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_CURVE_VISIBLE | ANIMFILTER_FCURVESONLY); ANIM_animdata_filter( &ac, &anim_data, eAnimFilter_Flags(filter), ac.data, eAnimCont_Types(ac.datatype)); - /* Now test if there is a need to re-sort. */ + /* now test if there is a need to re-sort */ LISTBASE_FOREACH (bAnimListElem *, ale, &anim_data) { FCurve *fcu = (FCurve *)ale->key_data; - /* Ignore FC-Curves without any selected verts. */ + /* ignore FC-Curves without any selected verts */ if (!fcu_test_selected(fcu)) { continue; } - /* Watch it: if the time is wrong: do not correct handles yet. */ + /* watch it: if the time is wrong: do not correct handles yet */ if (test_time_fcurve(fcu)) { dosort++; } @@ -982,19 +984,20 @@ static void recalcData_graphedit(TransInfo *t) BKE_fcurve_handles_recalc_ex(fcu, BEZT_FLAG_TEMP_TAG); } - /* Set refresh tags for objects using this animation, - * BUT only if realtime updates are enabled. */ + /* set refresh tags for objects using this animation, + * BUT only if realtime updates are enabled + */ if ((sipo->flag & SIPO_NOREALTIMEUPDATES) == 0) { ANIM_list_elem_update(CTX_data_main(t->context), t->scene, ale); } } - /* Do resort and other updates? */ + /* do resort and other updates? */ if (dosort) { remake_graph_transdata(t, &anim_data); } - /* Now free temp channels. */ + /* now free temp channels */ ANIM_animdata_freelist(&anim_data); } @@ -1013,7 +1016,7 @@ static void special_aftertrans_update__graph(bContext *C, TransInfo *t) const bool canceled = (t->state == TRANS_CANCEL); const bool duplicate = (t->flag & T_DUPLICATED_KEYFRAMES) != 0; - /* Initialize relevant anim-context 'context' data. */ + /* initialize relevant anim-context 'context' data */ if (ANIM_animdata_get_context(C, &ac) == 0) { return; } @@ -1023,7 +1026,7 @@ static void special_aftertrans_update__graph(bContext *C, TransInfo *t) short filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_CURVE_VISIBLE | ANIMFILTER_FCURVESONLY); - /* Get channels to work on. */ + /* get channels to work on */ ANIM_animdata_filter( &ac, &anim_data, eAnimFilter_Flags(filter), ac.data, eAnimCont_Types(ac.datatype)); @@ -1032,11 +1035,11 @@ static void special_aftertrans_update__graph(bContext *C, TransInfo *t) FCurve *fcu = (FCurve *)ale->key_data; /* 3 cases here for curve cleanups: - * 1) NOTRANSKEYCULL on -> cleanup of duplicates shouldn't be done. + * 1) NOTRANSKEYCULL on -> cleanup of duplicates shouldn't be done * 2) canceled == 0 -> user confirmed the transform, - * so duplicates should be removed. + * so duplicates should be removed * 3) canceled + duplicate -> user canceled the transform, - * but we made duplicates, so get rid of these. + * but we made duplicates, so get rid of these */ if ((sipo->flag & SIPO_NOTRANSKEYCULL) == 0 && ((canceled == 0) || (duplicate))) { if (adt) { @@ -1050,14 +1053,14 @@ static void special_aftertrans_update__graph(bContext *C, TransInfo *t) } } - /* Free temp memory. */ + /* free temp memory */ ANIM_animdata_freelist(&anim_data); } /* Make sure all F-Curves are set correctly, but not if transform was * canceled, since then curves were already restored to initial state. * NOTE: if the refresh is really needed after cancel then some way - * has to be added to not update handle types, see #22289. + * has to be added to not update handle types (see bug 22289). */ if (!canceled) { ANIM_editkeyframes_refresh(&ac); diff --git a/source/blender/editors/transform/transform_convert_grease_pencil.cc b/source/blender/editors/transform/transform_convert_grease_pencil.cc index 17c83baa0c8..7736342306d 100644 --- a/source/blender/editors/transform/transform_convert_grease_pencil.cc +++ b/source/blender/editors/transform/transform_convert_grease_pencil.cc @@ -6,10 +6,11 @@ * \ingroup edtransform */ +#include "BLI_math_matrix.h" + #include "BKE_context.hh" -#include "DEG_depsgraph_query.hh" - +#include "ED_curves.hh" #include "ED_grease_pencil.hh" #include "transform.hh" @@ -23,7 +24,6 @@ namespace blender::ed::transform::greasepencil { static void createTransGreasePencilVerts(bContext *C, TransInfo *t) { - Depsgraph *depsgraph = CTX_data_depsgraph_pointer(C); Scene *scene = CTX_data_scene(C); Object *object = CTX_data_active_object(C); MutableSpan trans_data_contrainers(t->data_container, t->data_container_len); @@ -31,13 +31,13 @@ static void createTransGreasePencilVerts(bContext *C, TransInfo *t) const bool use_connected_only = (t->flag & T_PROP_CONNECTED) != 0; int total_number_of_drawings = 0; - Vector> all_drawings; + Vector> all_drawings; /* Count the number layers in all objects. */ for (const int i : trans_data_contrainers.index_range()) { TransDataContainer &tc = trans_data_contrainers[i]; GreasePencil &grease_pencil = *static_cast(tc.obedit->data); - const Vector drawings = + const Array drawings = ed::greasepencil::retrieve_editable_drawings(*scene, grease_pencil); all_drawings.append(drawings); total_number_of_drawings += drawings.size(); @@ -51,7 +51,7 @@ static void createTransGreasePencilVerts(bContext *C, TransInfo *t) for (const int i : trans_data_contrainers.index_range()) { TransDataContainer &tc = trans_data_contrainers[i]; - const Vector drawings = all_drawings[i]; + const Array drawings = all_drawings[i]; for (ed::greasepencil::MutableDrawingInfo info : drawings) { if (use_proportional_edit) { points_per_layer_per_object[layer_offset] = ed::greasepencil::retrieve_editable_points( @@ -72,7 +72,7 @@ static void createTransGreasePencilVerts(bContext *C, TransInfo *t) } } - /* Reuse the variable `layer_offset`. */ + /* Reuse the variable `layer_offset` */ layer_offset = 0; /* Populate TransData structs. */ @@ -81,15 +81,15 @@ static void createTransGreasePencilVerts(bContext *C, TransInfo *t) if (tc.data_len == 0) { continue; } - Object *object_eval = DEG_get_evaluated_object(depsgraph, tc.obedit); - GreasePencil &grease_pencil = *static_cast(tc.obedit->data); - Span layers = grease_pencil.layers(); + + float mtx[3][3], smtx[3][3]; + copy_m3_m4(mtx, tc.obedit->object_to_world); + pseudoinverse_m3_m3(smtx, mtx, PSEUDOINVERSE_EPSILON); int layer_points_offset = 0; - const Vector drawings = all_drawings[i]; + + const Array drawings = all_drawings[i]; for (ed::greasepencil::MutableDrawingInfo info : drawings) { - const bke::greasepencil::Layer &layer = *layers[info.layer_index]; - const float4x4 layer_space_to_world_space = layer.to_world_space(*object_eval); bke::CurvesGeometry &curves = info.drawing.strokes_for_write(); const IndexMask points = points_per_layer_per_object[layer_offset]; @@ -108,7 +108,6 @@ static void createTransGreasePencilVerts(bContext *C, TransInfo *t) *object, info.drawing, memory); curve_populate_trans_data_structs(tc, curves, - layer_space_to_world_space, value_attribute, points, true, @@ -119,7 +118,6 @@ static void createTransGreasePencilVerts(bContext *C, TransInfo *t) else { curve_populate_trans_data_structs(tc, curves, - layer_space_to_world_space, value_attribute, points, false, @@ -143,7 +141,7 @@ static void recalcData_grease_pencil(TransInfo *t) for (const TransDataContainer &tc : trans_data_contrainers) { GreasePencil &grease_pencil = *static_cast(tc.obedit->data); - const Vector drawings = + const Array drawings = ed::greasepencil::retrieve_editable_drawings(*scene, grease_pencil); for (ed::greasepencil::MutableDrawingInfo info : drawings) { bke::CurvesGeometry &curves = info.drawing.strokes_for_write(); diff --git a/source/blender/editors/transform/transform_convert_lattice.cc b/source/blender/editors/transform/transform_convert_lattice.cc index e0c232d2c7c..c18c94de6e9 100644 --- a/source/blender/editors/transform/transform_convert_lattice.cc +++ b/source/blender/editors/transform/transform_convert_lattice.cc @@ -14,6 +14,7 @@ #include "BLI_math_matrix.h" #include "BLI_math_vector.h" +#include "BKE_context.hh" #include "BKE_lattice.hh" #include "ED_object.hh" @@ -78,7 +79,7 @@ static void createTransLatticeVerts(bContext * /*C*/, TransInfo *t) tc->data = static_cast( MEM_callocN(tc->data_len * sizeof(TransData), "TransObData(Lattice EditMode)")); - copy_m3_m4(mtx, tc->obedit->object_to_world().ptr()); + copy_m3_m4(mtx, tc->obedit->object_to_world); pseudoinverse_m3_m3(smtx, mtx, PSEUDOINVERSE_EPSILON); td = tc->data; diff --git a/source/blender/editors/transform/transform_convert_mask.cc b/source/blender/editors/transform/transform_convert_mask.cc index acfea783166..7c57ea01afe 100644 --- a/source/blender/editors/transform/transform_convert_mask.cc +++ b/source/blender/editors/transform/transform_convert_mask.cc @@ -135,7 +135,7 @@ static void MaskPointToTransData(Scene *scene, /* CV coords are scaled by aspects. this is needed for rotations and * proportional editing to be consistent with the stretched CV coords * that are displayed. this also means that for display and number-input, - * and when the CV coords are flushed, these are converted each time. */ + * and when the CV coords are flushed, these are converted each time */ mul_v2_m3v2(td2d->loc, parent_matrix, bezt->vec[i]); td2d->loc[0] *= asp[0]; td2d->loc[1] *= asp[1]; @@ -156,7 +156,7 @@ static void MaskPointToTransData(Scene *scene, td->ext = nullptr; if (i == 1) { - /* Scaling weights. */ + /* scaling weights */ td->val = &bezt->weight; td->ival = *td->val; } @@ -267,7 +267,7 @@ static void createTransMaskingData(bContext *C, TransInfo *t) return; } - /* Count. */ + /* count */ LISTBASE_FOREACH (MaskLayer *, masklay, &mask->masklayers) { if (masklay->visibility_flag & (MASK_HIDE_VIEW | MASK_HIDE_SELECT)) { continue; @@ -316,15 +316,15 @@ static void createTransMaskingData(bContext *C, TransInfo *t) tc->data_len = (is_prop_edit) ? count : countsel; td = tc->data = static_cast( MEM_callocN(tc->data_len * sizeof(TransData), "TransObData(Mask Editing)")); - /* For each 2d uv coord a 3d vector is allocated, so that they can be - * treated just as if they were 3d verts. */ + /* for each 2d uv coord a 3d vector is allocated, so that they can be + * treated just as if they were 3d verts */ td2d = tc->data_2d = static_cast( MEM_callocN(tc->data_len * sizeof(TransData2D), "TransObData2D(Mask Editing)")); tc->custom.type.data = tdm = static_cast( MEM_callocN(tc->data_len * sizeof(TransDataMasking), "TransDataMasking(Mask Editing)")); tc->custom.type.use_free = true; - /* Create data. */ + /* create data */ LISTBASE_FOREACH (MaskLayer *, masklay, &mask->masklayers) { if (masklay->visibility_flag & (MASK_HIDE_VIEW | MASK_HIDE_SELECT)) { continue; @@ -389,7 +389,7 @@ static void flushTransMasking(TransInfo *t) inv[0] = 1.0f / asp[0]; inv[1] = 1.0f / asp[1]; - /* Flush to 2d vector from internally used 3d vector. */ + /* flush to 2d vector from internally used 3d vector */ for (a = 0, td = tc->data_2d, tdm = static_cast(tc->custom.type.data); a < tc->data_len; a++, td++, tdm++) diff --git a/source/blender/editors/transform/transform_convert_mball.cc b/source/blender/editors/transform/transform_convert_mball.cc index 303233dde13..ba692e15352 100644 --- a/source/blender/editors/transform/transform_convert_mball.cc +++ b/source/blender/editors/transform/transform_convert_mball.cc @@ -36,7 +36,7 @@ static void createTransMBallVerts(bContext * /*C*/, TransInfo *t) const bool is_prop_edit = (t->flag & T_PROP_EDIT) != 0; const bool is_prop_connected = (t->flag & T_PROP_CONNECTED) != 0; - /* Count totals. */ + /* count totals */ LISTBASE_FOREACH (MetaElem *, ml, mb->editelems) { if (ml->flag & SELECT) { countsel++; @@ -65,7 +65,7 @@ static void createTransMBallVerts(bContext * /*C*/, TransInfo *t) tx = tc->data_ext = static_cast( MEM_callocN(tc->data_len * sizeof(TransDataExtension), "MetaElement_TransExtension")); - copy_m3_m4(mtx, tc->obedit->object_to_world().ptr()); + copy_m3_m4(mtx, tc->obedit->object_to_world); pseudoinverse_m3_m3(smtx, mtx, PSEUDOINVERSE_EPSILON); LISTBASE_FOREACH (MetaElem *, ml, mb->editelems) { @@ -88,7 +88,7 @@ static void createTransMBallVerts(bContext * /*C*/, TransInfo *t) td->ext = tx; - /* Radius of MetaElem (mass of MetaElem influence). */ + /* Radius of MetaElem (mass of MetaElem influence) */ if (ml->flag & MB_SCALE_RAD) { td->val = &ml->rad; td->ival = ml->rad; @@ -98,13 +98,13 @@ static void createTransMBallVerts(bContext * /*C*/, TransInfo *t) td->ival = ml->s; } - /* `expx/expy/expz` determine "shape" of some MetaElem types. */ + /* expx/expy/expz determine "shape" of some MetaElem types */ tx->size = &ml->expx; tx->isize[0] = ml->expx; tx->isize[1] = ml->expy; tx->isize[2] = ml->expz; - /* `quat` is used for rotation of #MetaElem. */ + /* quat is used for rotation of MetaElem */ tx->quat = ml->quat; copy_qt_qt(tx->iquat, ml->quat); diff --git a/source/blender/editors/transform/transform_convert_mesh.cc b/source/blender/editors/transform/transform_convert_mesh.cc index a9823643e85..b30c2cad4c4 100644 --- a/source/blender/editors/transform/transform_convert_mesh.cc +++ b/source/blender/editors/transform/transform_convert_mesh.cc @@ -18,14 +18,13 @@ #include "BLI_math_rotation.h" #include "BLI_math_vector.h" #include "BLI_memarena.h" -#include "BLI_utildefines_stack.h" #include "BKE_context.hh" #include "BKE_crazyspace.hh" #include "BKE_editmesh.hh" #include "BKE_mesh.hh" #include "BKE_modifier.hh" -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "ED_mesh.hh" #include "ED_object.hh" @@ -38,8 +37,6 @@ #include "transform_convert.hh" -using namespace blender; - /* -------------------------------------------------------------------- */ /** \name Container TransCustomData Creation * \{ */ @@ -145,7 +142,7 @@ static void mesh_customdata_free_fn(TransInfo * /*t*/, * \{ */ struct TransCustomDataMergeGroup { - /** Map {#BMVert: #TransCustomDataLayerVert}. */ + /** map {BMVert: TransCustomDataLayerVert} */ LinkNode **cd_loop_groups; }; @@ -161,12 +158,12 @@ struct TransCustomDataLayer { /* Optionally merge custom-data groups (this keeps UVs connected for example). */ struct { - /** Map {#BMVert: #TransDataBasic}. */ + /** map {BMVert: TransDataBasic} */ GHash *origverts; TransCustomDataMergeGroup *data; int data_len; /** Array size of 'layer_math_map_len' - * maps #TransCustomDataLayerVert.cd_group index to absolute #CustomData layer index. */ + * maps #TransCustomDataLayerVert.cd_group index to absolute #CustomData layer index */ int *customdatalayer_map; /** Number of math BMLoop layers. */ int customdatalayer_map_len; @@ -382,8 +379,8 @@ static TransCustomDataLayer *mesh_customdatacorrect_create_impl(TransDataContain if (bm->shapenr > 1) { /* Don't do this at all for non-basis shape keys, too easy to - * accidentally break uv maps or vertex colors then. */ - /* Create copies of faces for custom-data projection. */ + * accidentally break uv maps or vertex colors then */ + /* create copies of faces for custom-data projection. */ return nullptr; } if (!CustomData_has_math(&bm->ldata) && !CustomData_has_layer(&bm->ldata, CD_MDISPS)) { @@ -539,7 +536,7 @@ static void mesh_customdatacorrect_apply_vert(TransCustomDataLayer *tcld, const bool is_moved = (len_squared_v3v3(v->co, co_orig_3d) > FLT_EPSILON); const bool do_loop_weight = is_moved && tcld->merge_group.customdatalayer_map_len; const float *v_proj_axis = v->no; - /* Original (`l->prev`, `l`, `l->next`) projections for each loop ('l' remains unchanged). */ + /* original (l->prev, l, l->next) projections for each loop ('l' remains unchanged) */ float v_proj[3][3]; if (do_loop_weight) { @@ -552,7 +549,7 @@ static void mesh_customdatacorrect_apply_vert(TransCustomDataLayer *tcld, loop_weights = do_loop_weight ? static_cast(BLI_array_alloca(loop_weights, l_num)) : nullptr; for (j = 0; j < l_num; j++) { - BMFace *f_copy; /* The copy of 'f'. */ + BMFace *f_copy; /* the copy of 'f' */ BMLoop *l = static_cast(BM_iter_step(&liter)); f_copy = static_cast(BLI_ghash_lookup(tcld->origfaces, l->f)); @@ -565,11 +562,11 @@ static void mesh_customdatacorrect_apply_vert(TransCustomDataLayer *tcld, } #endif - /* Only loop data, no vertex data since that contains shape keys, - * and we do not want to mess up other shape keys. */ + /* only loop data, no vertex data since that contains shape keys, + * and we do not want to mess up other shape keys */ BM_loop_interp_from_face(bm, l, f_copy, false, false); - /* Weight the loop. */ + /* weight the loop */ if (do_loop_weight) { const float eps = 1.0e-8f; const BMLoop *l_prev = l->prev; @@ -754,7 +751,7 @@ void transform_convert_mesh_islands_calc(BMEditMesh *em, char itype; int i; - /* Group variables. */ + /* group vars */ int *groups_array = nullptr; int(*group_index)[2] = nullptr; @@ -765,7 +762,7 @@ void transform_convert_mesh_islands_calc(BMEditMesh *em, data.island_vert_map = static_cast( MEM_mallocN(sizeof(*data.island_vert_map) * bm->totvert, __func__)); - /* We shouldn't need this, but with incorrect selection flushing + /* we shouldn't need this, but with incorrect selection flushing * its possible we have a selected vertex that's not in a face, * for now best not crash in that case. */ copy_vn_i(data.island_vert_map, bm->totvert, -1); @@ -780,7 +777,7 @@ void transform_convert_mesh_islands_calc(BMEditMesh *em, htype = BM_EDGE; itype = BM_VERTS_OF_EDGE; } - else { /* `bm->selectmode & SCE_SELECT_FACE`. */ + else { /* (bm->selectmode & SCE_SELECT_FACE) */ groups_array = static_cast( MEM_mallocN(sizeof(*groups_array) * bm->totfacesel, __func__)); data.island_tot = BM_mesh_calc_face_groups( @@ -808,7 +805,7 @@ void transform_convert_mesh_islands_calc(BMEditMesh *em, BM_mesh_elem_index_ensure(bm, BM_VERT); - /* May be an edge OR a face array. */ + /* may be an edge OR a face array */ for (i = 0; i < data.island_tot; i++) { BMEditSelection ese = {nullptr}; @@ -823,9 +820,9 @@ void transform_convert_mesh_islands_calc(BMEditMesh *em, ese.htype = htype; - /* Loop on each face or edge in this group: - * - Assign `r_vert_map`. - * - Calculate (`co`, `no`). + /* loop on each face or edge in this group: + * - assign r_vert_map + * - calculate (co, no) */ for (j = 0; j < fg_len; j++) { ese.ele = static_cast(ele_array[groups_array[fg_sta + j]]); @@ -845,11 +842,11 @@ void transform_convert_mesh_islands_calc(BMEditMesh *em, } { - /* Setup vertex map. */ + /* setup vertex map */ BMIter iter; BMVert *v; - /* Connected edge-verts. */ + /* connected edge-verts */ BM_ITER_ELEM (v, &iter, ese.ele, itype) { data.island_vert_map[BM_elem_index_get(v)] = i; } @@ -862,7 +859,7 @@ void transform_convert_mesh_islands_calc(BMEditMesh *em, if (data.axismtx) { if (createSpaceNormalTangent(data.axismtx[i], no, tangent)) { - /* Pass. */ + /* pass */ } else { if (normalize_v3(no) != 0.0f) { @@ -880,8 +877,8 @@ void transform_convert_mesh_islands_calc(BMEditMesh *em, MEM_freeN(group_index); } - /* For proportional editing we need islands of 1 so connected vertices can use it with - * #V3D_AROUND_LOCAL_ORIGINS. */ + /* for proportional editing we need islands of 1 so connected vertices can use it with + * V3D_AROUND_LOCAL_ORIGINS */ if (calc_single_islands) { BMIter viter; BMVert *v; @@ -951,7 +948,7 @@ void transform_convert_mesh_islanddata_free(TransIslandData *island_data) static bool bmesh_test_dist_add(BMVert *v0, BMVert *v1, BMVert *v2, - float *dists, /* Optionally track original index. */ + float *dists, /* optionally track original index */ int *index, const float mtx[3][3]) { @@ -1028,7 +1025,7 @@ void transform_convert_mesh_connectivity_distance(BMesh *bm, { BLI_LINKSTACK_DECLARE(queue, BMEdge *); - /* Any BM_ELEM_TAG'd edge is in 'queue_next', so we don't add in twice. */ + /* 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; @@ -1348,8 +1345,8 @@ void transform_convert_mesh_crazyspace_detect(TransInfo *t, Scene *scene_eval = (Scene *)DEG_get_evaluated_id(t->depsgraph, &t->scene->id); Object *obedit_eval = (Object *)DEG_get_evaluated_id(t->depsgraph, &tc->obedit->id); BMEditMesh *em_eval = BKE_editmesh_from_object(obedit_eval); - /* Check if we can use deform matrices for modifier from the - * start up to stack, they are more accurate than quats. */ + /* check if we can use deform matrices for modifier from the + * start up to stack, they are more accurate than quats */ totleft = BKE_crazyspace_get_first_deform_matrices_editbmesh( t->depsgraph, scene_eval, obedit_eval, em_eval, r_crazyspace_data->defmats, defcos); } @@ -1380,7 +1377,7 @@ void transform_convert_mesh_crazyspace_transdata_set(const float mtx[3][3], const float quat[4], TransData *r_td) { - /* CrazySpace. */ + /* CrazySpace */ if (quat || defmat) { float mat[3][3], qmat[3][3], imat[3][3]; @@ -1436,7 +1433,7 @@ static void mesh_transdata_center_copy(const TransIslandData *island_data, } } -/* Way to overwrite what data is edited with transform. */ +/* way to overwrite what data is edited with transform */ static void VertsToTransData(TransInfo *t, TransData *td, TransDataExtension *tx, @@ -1473,7 +1470,7 @@ static void VertsToTransData(TransInfo *t, createSpaceNormal(td->axismtx, no); } else { - /* Setting normals. */ + /* Setting normals */ copy_v3_v3(td->axismtx[2], no); td->axismtx[0][0] = td->axismtx[0][1] = td->axismtx[0][2] = td->axismtx[1][0] = td->axismtx[1][1] = td->axismtx[1][2] = 0.0f; @@ -1569,9 +1566,9 @@ static void createTransEditVerts(bContext * /*C*/, TransInfo *t) em, calc_single_islands, calc_island_center, calc_island_axismtx, &island_data); } - copy_m3_m4(mtx, tc->obedit->object_to_world().ptr()); - /* We use a pseudo-inverse so that when one of the axes is scaled to 0, - * matrix inversion still works and we can still moving along the other. */ + copy_m3_m4(mtx, tc->obedit->object_to_world); + /* we use a pseudo-inverse so that when one of the axes is scaled to 0, + * matrix inversion still works and we can still moving along the other */ pseudoinverse_m3_m3(smtx, mtx, PSEUDOINVERSE_EPSILON); /* Original index of our connected vertex when connected distances are calculated. @@ -1619,10 +1616,10 @@ static void createTransEditVerts(bContext * /*C*/, TransInfo *t) tc->data = static_cast( MEM_callocN(data_len * sizeof(TransData), "TransObData(Mesh EditMode)")); if (t->mode == TFM_SHRINKFATTEN) { - /* Warning: this is overkill, we only need 2 extra floats, + /* warning, this is overkill, we only need 2 extra floats, * but this stores loads of extra stuff, for TFM_SHRINKFATTEN its even more overkill * since we may not use the 'alt' transform mode to maintain shell thickness, - * but with generic transform code its hard to lazy init variables. */ + * but with generic transform code its hard to lazy init vars */ tx = tc->data_ext = static_cast( MEM_callocN(tc->data_len * sizeof(TransDataExtension), "TransObData ext")); } @@ -1665,7 +1662,7 @@ static void createTransEditVerts(bContext * /*C*/, TransInfo *t) tx++; } - /* Selected. */ + /* selected */ if (BM_elem_flag_test(eve, BM_ELEM_SELECT)) { tob->flag |= TD_SELECTED; } @@ -1679,7 +1676,7 @@ static void createTransEditVerts(bContext * /*C*/, TransInfo *t) } } - /* CrazySpace. */ + /* CrazySpace */ transform_convert_mesh_crazyspace_transdata_set( mtx, smtx, @@ -1714,15 +1711,6 @@ static void createTransEditVerts(bContext * /*C*/, TransInfo *t) if (dists_index) { MEM_freeN(dists_index); } - - /* WORKAROUND: The transform operators rely on looptris being up-to-date. - * However, this is not always the case, especially when called from scripts. - * If this happens, to prevent update issues, make sure the size of #BMEditMesh::looptris - * arrays aligns with the number looptris to update. */ - const bool looptri_is_dirty = em->tottri != poly_to_tri_count(bm->totface, bm->totloop); - if (looptri_is_dirty) { - BKE_editmesh_looptris_calc(em); - } } } @@ -2161,7 +2149,7 @@ static void special_aftertrans_update__mesh(bContext * /*C*/, TransInfo *t) } FOREACH_TRANS_DATA_CONTAINER (t, tc) { - /* Table needs to be created for each edit command, since vertices can move etc. */ + /* table needs to be created for each edit command, since vertices can move etc */ ED_mesh_mirror_spatial_table_end(tc->obedit); /* TODO(@ideasman42): xform: We need support for many mirror objects at once! */ break; @@ -2170,472 +2158,6 @@ static void special_aftertrans_update__mesh(bContext * /*C*/, TransInfo *t) /** \} */ -/* -------------------------------------------------------------------- */ -/** \name API for Vert Slide - * \{ */ - -Array transform_mesh_vert_slide_data_create( - const TransDataContainer *tc, Vector &r_loc_dst_buffer) -{ - int td_selected_len = 0; - TransData *td = tc->data; - for (int i = 0; i < tc->data_len; i++, td++) { - if (!(td->flag & TD_SELECTED)) { - /* The selected ones are sorted at the beginning. */ - break; - } - td_selected_len++; - } - - Array r_sv(td_selected_len); - - r_loc_dst_buffer.reserve(r_sv.size() * 4); - td = tc->data; - for (int i = 0; i < tc->data_len; i++, td++) { - if (!(td->flag & TD_SELECTED)) { - /* The selected ones are sorted at the beginning. */ - break; - } - const int size_prev = r_loc_dst_buffer.size(); - - BMVert *v = static_cast(td->extra); - if (!v->e) { - r_loc_dst_buffer.append(td->iloc); - } - else { - BMIter eiter; - BMEdge *e; - BM_ITER_ELEM (e, &eiter, v, BM_EDGES_OF_VERT) { - if (BM_elem_flag_test(e, BM_ELEM_HIDDEN)) { - continue; - } - BMVert *v_other = BM_edge_other_vert(e, v); - r_loc_dst_buffer.append(v_other->co); - } - } - - TransDataVertSlideVert &sv = r_sv[i]; - sv.td = &tc->data[i]; - /* The buffer address may change as the vector is resized. Avoid setting #Span. */ - // sv.targets = r_loc_dst_buffer.as_span().drop_front(size_prev); - - /* Store the buffer size temporarily in `target_curr`. */ - sv.co_link_curr = r_loc_dst_buffer.size() - size_prev; - } - - int start = 0; - for (TransDataVertSlideVert &sv : r_sv) { - int size = sv.co_link_curr; - sv.co_link_orig_3d = r_loc_dst_buffer.as_span().slice(start, size); - sv.co_link_curr = 0; - start += size; - } - - return r_sv; -} - -/** \} */ - -/* -------------------------------------------------------------------- */ -/** \name API for Edge Slide - * \{ */ - -static bool mesh_vert_is_inner(BMVert *v) -{ - return BM_vert_is_edge_pair(v) && !BM_vert_is_boundary(v); -} - -/** - * Find the closest point on the ngon on the opposite side. - * used to set the edge slide distance for ngons. - */ -static bool bm_loop_calc_opposite_co(const BMLoop *l_tmp, const float plane_no[3], float r_co[3]) -{ - /* Skip adjacent edges. */ - BMLoop *l_first = l_tmp->next; - BMLoop *l_last = l_tmp->prev; - BMLoop *l_iter; - float dist_sq_best = FLT_MAX; - bool found = false; - - l_iter = l_first; - do { - float tvec[3]; - if (isect_line_plane_v3(tvec, l_iter->v->co, l_iter->next->v->co, l_tmp->v->co, plane_no)) { - const float fac = line_point_factor_v3(tvec, l_iter->v->co, l_iter->next->v->co); - /* Allow some overlap to avoid missing the intersection because of float precision. */ - if ((fac > -FLT_EPSILON) && (fac < 1.0f + FLT_EPSILON)) { - /* Likelihood of multiple intersections per ngon is quite low, - * it would have to loop back on itself, but better support it - * so check for the closest opposite edge. */ - const float dist_sq_test = len_squared_v3v3(l_tmp->v->co, tvec); - if (dist_sq_test < dist_sq_best) { - copy_v3_v3(r_co, tvec); - dist_sq_best = dist_sq_test; - found = true; - } - } - } - } while ((l_iter = l_iter->next) != l_last); - - return found; -} - -static float3 isect_face_dst(const BMLoop *l) -{ - BMFace *f = l->f; - BMLoop *l_next = l->next; - if (f->len == 4) { - /* We could use code below, but in this case - * sliding diagonally across the quad works well. */ - return l_next->next->v->co; - } - - float3 plane_no; - BM_loop_calc_face_direction(l, plane_no); - - float3 isect_co; - if (!bm_loop_calc_opposite_co(l, plane_no, isect_co)) { - /* Rare case. */ - mid_v3_v3v3(isect_co, l->prev->v->co, l_next->v->co); - } - return isect_co; -} - -Array transform_mesh_edge_slide_data_create(const TransDataContainer *tc, - int *r_group_len) -{ - BMEditMesh *em = BKE_editmesh_from_object(tc->obedit); - BMesh *bm = em->bm; - - int td_selected_len = 0; - - /* Ensure valid selection. */ - BMIter iter; - BMVert *v; - TransData *td = tc->data; - for (int i = 0; i < tc->data_len; i++, td++) { - if (!(td->flag & TD_SELECTED)) { - /* The selected ones are sorted at the beginning. */ - break; - } - v = static_cast(td->extra); - int numsel = BM_iter_elem_count_flag(BM_EDGES_OF_VERT, v, BM_ELEM_SELECT, true); - if (numsel == 0 || numsel > 2) { - /* Invalid edge selection. */ - return {}; - } - td_selected_len++; - } - - BMEdge *e; - BM_ITER_MESH (e, &iter, bm, BM_EDGES_OF_MESH) { - if (!BM_elem_flag_test(e, BM_ELEM_SELECT)) { - continue; - } - if (!BM_edge_is_manifold(e) && !BM_edge_is_boundary(e)) { - /* Can edges with at least once face user. */ - return {}; - } - } - - BM_ITER_MESH (v, &iter, bm, BM_VERTS_OF_MESH) { - BM_elem_index_set(v, -1); - } - bm->elem_index_dirty |= BM_VERT; - - /* Alloc and initialize the #TransDataEdgeSlideVert. */ - - Array r_sv(td_selected_len); - TransDataEdgeSlideVert *sv = &r_sv[0]; - int sv_index = 0; - td = tc->data; - for (int i = 0; i < tc->data_len; i++, td++) { - if (!(td->flag & TD_SELECTED)) { - continue; - } - sv->td = td; - sv->loop_nr = -1; - sv->dir_side[0] = float3(0); - sv->dir_side[1] = float3(0); - - /* Identify the #TransDataEdgeSlideVert by the vertex index. */ - v = static_cast(td->extra); - BM_elem_index_set(v, sv_index); - sv_index++; - sv++; - } - - /* Map indicating the indexes of #TransData connected by edge. */ - Array td_connected(tc->data_len, int2(-1, -1)); - BM_ITER_MESH (e, &iter, bm, BM_EDGES_OF_MESH) { - if (!BM_elem_flag_test(e, BM_ELEM_SELECT)) { - continue; - } - int td_index_1 = BM_elem_index_get(e->v1); - int td_index_2 = BM_elem_index_get(e->v2); - - int slot_1 = int(td_connected[td_index_1][0] != -1); - int slot_2 = int(td_connected[td_index_2][0] != -1); - - td_connected[td_index_1][slot_1] = td_index_2; - td_connected[td_index_2][slot_2] = td_index_1; - } - - /* Compute the sliding groups. */ - int loop_nr = 0; - for (int i : r_sv.index_range()) { - TransDataEdgeSlideVert *sv = &r_sv[i]; - if (sv->loop_nr != -1) { - /* This vertex has already been computed. */ - continue; - } - - /* Start from a vertex connected to just a single edge or any if it doesn't exist. */ - int i_curr = i; - int i_prev = td_connected[i][1]; - while (!ELEM(i_prev, -1, i)) { - int tmp = td_connected[i_prev][0] != i_curr ? td_connected[i_prev][0] : - td_connected[i_prev][1]; - i_curr = i_prev; - i_prev = tmp; - } - - /** - * We need at least 3 points to calculate the intersection of - * `prev`-`curr` and `next`-`curr` destinations. - * `next_next` is only required to identify the edge in `next.e`. - * - * | | | | - * | prev.e | curr.e | next.e | - * prev.v ---- curr.v ---- next.v ---- next_next.v - */ - struct SlideTempDataMesh { - int i; /* The #TransDataEdgeSlideVert index. */ - TransDataEdgeSlideVert *sv; - BMVert *v; - BMEdge *e; - struct { - BMFace *f; - BMVert *v_dst; - float3 dst; - } fdata[2]; - bool vert_is_edge_pair; - /** - * Find the best direction to slide among the ones already computed. - * - * \param curr_side_other: previous state of the #SlideTempDataMesh where the faces are - linked to the previous edge. - * \param l_src: the source corner in the edge to slide. - * \param l_dst: the current destination corner. - */ - int find_best_dir(const SlideTempDataMesh *curr_side_other, - const BMFace *f_curr, - const BMLoop *l_src, - const BMVert *v_dst, - bool *r_do_isect_curr_dirs) const - { - *r_do_isect_curr_dirs = false; - - if (f_curr == curr_side_other->fdata[0].f || v_dst == curr_side_other->fdata[0].v_dst) { - return 0; - } - - if (f_curr == curr_side_other->fdata[1].f || v_dst == curr_side_other->fdata[1].v_dst) { - return 1; - } - - if (curr_side_other->fdata[0].f || curr_side_other->fdata[1].f) { - /* Find the best direction checking the edges that share faces between them. */ - int best_dir = -1; - const BMLoop *l_edge = l_src->next->v == v_dst ? l_src : l_src->prev; - const BMLoop *l_other = l_edge->radial_next; - while (l_other != l_edge) { - if (l_other->f == curr_side_other->fdata[0].f) { - best_dir = 0; - break; - } - if (l_other->f == curr_side_other->fdata[1].f) { - best_dir = 1; - break; - } - l_other = (l_other->v == this->v ? l_other->prev : l_other->next)->radial_next; - } - - if (best_dir != -1) { - *r_do_isect_curr_dirs = true; - return best_dir; - } - } - - if (ELEM(nullptr, this->fdata[0].f, this->fdata[1].f)) { - return int(this->fdata[0].f != nullptr); - } - - /* Find the best direction among those already computed. - * Prioritizing in order: - * - Boundary edge that points to the closest direction. - * - Any edge that points to the closest direction. */ - - *r_do_isect_curr_dirs = true; - BMEdge *e0 = this->fdata[0].v_dst ? BM_edge_exists(this->v, this->fdata[0].v_dst) : - nullptr; - BMEdge *e1 = this->fdata[1].v_dst ? BM_edge_exists(this->v, this->fdata[1].v_dst) : - nullptr; - const bool is_boundary_0 = e0 && BM_edge_is_boundary(e0); - const bool is_boundary_1 = e1 && BM_edge_is_boundary(e1); - if (is_boundary_0 && !is_boundary_1) { - return 0; - } - - if (is_boundary_1 && !is_boundary_0) { - return 1; - } - - /* Find the closest direction. */ - float3 src = this->v->co; - float3 dst = v_dst->co; - float3 dir_curr = dst - src; - float3 dir0 = math::normalize(this->fdata[0].dst - src); - float3 dir1 = math::normalize(this->fdata[1].dst - src); - float dot0 = math::dot(dir_curr, dir0); - float dot1 = math::dot(dir_curr, dir1); - return int(dot0 < dot1); - } - } prev = {}, curr = {}, next = {}, next_next = {}, tmp = {}; - - next.i = td_connected[i_curr][0] != i_prev ? td_connected[i_curr][0] : td_connected[i_curr][1]; - next.sv = &r_sv[next.i]; - next.v = static_cast(next.sv->td->extra); - next.vert_is_edge_pair = mesh_vert_is_inner(next.v); - - curr.i = i_curr; - curr.sv = &r_sv[curr.i]; - curr.v = static_cast(curr.sv->td->extra); - curr.vert_is_edge_pair = mesh_vert_is_inner(curr.v); - curr.e = BM_edge_exists(curr.v, next.v); - - /* Do not compute `prev` for now. Let the loop calculate `curr` twice. */ - prev.i = -1; - - while (curr.i != -1) { - if (next.i != -1) { - next_next.i = td_connected[next.i][0] != curr.i ? td_connected[next.i][0] : - td_connected[next.i][1]; - if (next_next.i != -1) { - next_next.sv = &r_sv[next_next.i]; - next_next.v = static_cast(next_next.sv->td->extra); - next_next.vert_is_edge_pair = mesh_vert_is_inner(next_next.v); - next.e = BM_edge_exists(next.v, next_next.v); - } - - tmp = curr; - - BMLoop *l; - BM_ITER_ELEM (l, &iter, curr.e, BM_LOOPS_OF_EDGE) { - BMFace *f_curr = l->f; - - BMVert *v1_dst, *v2_dst; - BMEdge *l_edge_next; - BMLoop *l1, *l2; - if (l->v == curr.v) { - l1 = l; - l2 = l->next; - l_edge_next = l2->e; - v1_dst = l1->prev->v; - v2_dst = l2->next->v; - } - else { - l1 = l->next; - l2 = l; - l_edge_next = l2->prev->e; - v1_dst = l1->next->v; - v2_dst = l2->prev->v; - } - - float3 dst = v1_dst->co; - - /* Sometimes the sliding direction may fork (`isect_curr_dirs` is `true`). - * In this case, the resulting direction is the intersection of the destinations. */ - bool isect_curr_dirs = false; - - /* Identify the slot to slide according to the directions already computed in `curr`. */ - int best_dir = curr.find_best_dir(&tmp, f_curr, l1, v1_dst, &isect_curr_dirs); - - if (curr.fdata[best_dir].f == nullptr) { - curr.fdata[best_dir].f = f_curr; - if (curr.vert_is_edge_pair) { - curr.fdata[best_dir].dst = isect_face_dst(l1); - } - else { - curr.fdata[best_dir].v_dst = v1_dst; - curr.fdata[best_dir].dst = v1_dst->co; - } - } - - /* Compute `next`. */ - next.fdata[best_dir].f = f_curr; - if (l_edge_next == next.e || next.vert_is_edge_pair) { - /* Case where the vertex slides over the face. */ - next.fdata[best_dir].v_dst = nullptr; - next.fdata[best_dir].dst = isect_face_dst(l2); - } - else { - /* Case where the vertex slides over an edge. */ - next.fdata[best_dir].v_dst = v2_dst; - next.fdata[best_dir].dst = v2_dst->co; - } - - if (isect_curr_dirs) { - /* The `best_dir` can only have one direction. */ - float3 &dst0 = prev.fdata[best_dir].dst; - float3 &dst1 = curr.fdata[best_dir].dst; - float3 &dst2 = dst; - float3 &dst3 = next.fdata[best_dir].dst; - float3 isect0, isect1; - if (isect_line_line_epsilon_v3(dst0, dst1, dst2, dst3, isect0, isect1, FLT_EPSILON) == - 2) - { - curr.fdata[best_dir].dst = math::midpoint(isect0, isect1); - } - else { - curr.fdata[best_dir].dst = math::midpoint(dst1, dst2); - } - } - } - } - - /* The data in `curr` is computed. Use to compute the #TransDataEdgeSlideVert. */ - float3 iloc = curr.sv->td->iloc; - if (curr.fdata[0].f) { - curr.sv->dir_side[0] = curr.fdata[0].dst - iloc; - } - if (curr.fdata[1].f) { - curr.sv->dir_side[1] = curr.fdata[1].dst - iloc; - } - curr.sv->edge_len = math::distance(curr.sv->dir_side[0], curr.sv->dir_side[1]); - curr.sv->loop_nr = loop_nr; - - if (i_prev != -1 && prev.i == i_prev) { - /* Cycle returned to the beginning. - * The data with index `i_curr` was computed twice to make sure the directions are correct - * the second time. */ - break; - } - - /* Move forward. */ - prev = curr; - curr = next; - next = next_next; - } - loop_nr++; - } - *r_group_len = loop_nr; - return r_sv; -} - -/** \} */ - TransConvertTypeInfo TransConvertType_Mesh = { /*flags*/ (T_EDIT | T_POINTS), /*create_trans_data*/ createTransEditVerts, diff --git a/source/blender/editors/transform/transform_convert_mesh_edge.cc b/source/blender/editors/transform/transform_convert_mesh_edge.cc index f1c43c8575f..13bf1c7fcb2 100644 --- a/source/blender/editors/transform/transform_convert_mesh_edge.cc +++ b/source/blender/editors/transform/transform_convert_mesh_edge.cc @@ -6,6 +6,8 @@ * \ingroup edtransform */ +#include "DNA_mesh_types.h" + #include "MEM_guardedalloc.h" #include "BLI_math_matrix.h" @@ -14,6 +16,7 @@ #include "BKE_context.hh" #include "BKE_customdata.hh" #include "BKE_editmesh.hh" +#include "BKE_mesh.hh" #include "transform.hh" #include "transform_convert.hh" @@ -62,10 +65,10 @@ static void createTransEdge(bContext * /*C*/, TransInfo *t) td = tc->data = static_cast( MEM_callocN(tc->data_len * sizeof(TransData), "TransCrease")); - copy_m3_m4(mtx, tc->obedit->object_to_world().ptr()); + copy_m3_m4(mtx, tc->obedit->object_to_world); pseudoinverse_m3_m3(smtx, mtx, PSEUDOINVERSE_EPSILON); - /* Create data we need. */ + /* create data we need */ if (t->mode == TFM_BWEIGHT) { if (!CustomData_has_layer_named(&em->bm->edata, CD_PROP_FLOAT, "bevel_weight_edge")) { BM_data_layer_add_named(em->bm, &em->bm->edata, CD_PROP_FLOAT, "bevel_weight_edge"); @@ -73,7 +76,7 @@ static void createTransEdge(bContext * /*C*/, TransInfo *t) cd_edge_float_offset = CustomData_get_offset_named( &em->bm->edata, CD_PROP_FLOAT, "bevel_weight_edge"); } - else { /* `if (t->mode == TFM_EDGE_CREASE) {`. */ + else { /* if (t->mode == TFM_EDGE_CREASE) { */ BLI_assert(t->mode == TFM_EDGE_CREASE); if (!CustomData_has_layer_named(&em->bm->edata, CD_PROP_FLOAT, "crease_edge")) { BM_data_layer_add_named(em->bm, &em->bm->edata, CD_PROP_FLOAT, "crease_edge"); @@ -89,7 +92,7 @@ static void createTransEdge(bContext * /*C*/, TransInfo *t) (BM_elem_flag_test(eed, BM_ELEM_SELECT) || is_prop_edit)) { float *fl_ptr; - /* Need to set center for center calculations. */ + /* need to set center for center calculations */ mid_v3_v3v3(td->center, eed->v1->co, eed->v2->co); td->loc = nullptr; diff --git a/source/blender/editors/transform/transform_convert_mesh_skin.cc b/source/blender/editors/transform/transform_convert_mesh_skin.cc index 546b4e25ab8..f13cef865d8 100644 --- a/source/blender/editors/transform/transform_convert_mesh_skin.cc +++ b/source/blender/editors/transform/transform_convert_mesh_skin.cc @@ -15,7 +15,14 @@ #include "BLI_math_vector.h" #include "BKE_context.hh" +#include "BKE_crazyspace.hh" #include "BKE_editmesh.hh" +#include "BKE_modifier.hh" +#include "BKE_scene.h" + +#include "ED_mesh.hh" + +#include "DEG_depsgraph_query.hh" #include "transform.hh" #include "transform_orientations.hh" @@ -127,9 +134,9 @@ static void createTransMeshSkin(bContext * /*C*/, TransInfo *t) em, calc_single_islands, calc_island_center, calc_island_axismtx, &island_data); } - copy_m3_m4(mtx, tc->obedit->object_to_world().ptr()); - /* We use a pseudo-inverse so that when one of the axes is scaled to 0, - * matrix inversion still works and we can still moving along the other. */ + copy_m3_m4(mtx, tc->obedit->object_to_world); + /* we use a pseudo-inverse so that when one of the axes is scaled to 0, + * matrix inversion still works and we can still moving along the other */ pseudoinverse_m3_m3(smtx, mtx, PSEUDOINVERSE_EPSILON); /* Original index of our connected vertex when connected distances are calculated. @@ -210,7 +217,7 @@ static void createTransMeshSkin(bContext * /*C*/, TransInfo *t) createSpaceNormal(td->axismtx, eve->no); } else { - /* Setting normals. */ + /* Setting normals */ copy_v3_v3(td->axismtx[2], eve->no); td->axismtx[0][0] = td->axismtx[0][1] = td->axismtx[0][2] = td->axismtx[1][0] = td->axismtx[1][1] = td->axismtx[1][2] = 0.0f; @@ -225,7 +232,7 @@ static void createTransMeshSkin(bContext * /*C*/, TransInfo *t) } } - /* CrazySpace. */ + /* CrazySpace */ transform_convert_mesh_crazyspace_transdata_set( mtx, smtx, @@ -272,7 +279,7 @@ static void mesh_skin_apply_to_mirror(TransInfo *t) static void recalcData_mesh_skin(TransInfo *t) { bool is_canceling = t->state == TRANS_CANCEL; - /* Mirror modifier clipping? */ + /* mirror modifier clipping? */ if (!is_canceling) { if (!(t->flag & T_NO_MIRROR)) { mesh_skin_apply_to_mirror(t); diff --git a/source/blender/editors/transform/transform_convert_mesh_uv.cc b/source/blender/editors/transform/transform_convert_mesh_uv.cc index 81760f1af90..c9902dcc152 100644 --- a/source/blender/editors/transform/transform_convert_mesh_uv.cc +++ b/source/blender/editors/transform/transform_convert_mesh_uv.cc @@ -8,8 +8,8 @@ #include "MEM_guardedalloc.h" +#include "BLI_bitmap.h" #include "BLI_linklist_stack.h" -#include "BLI_math_geom.h" #include "BLI_math_matrix.h" #include "BLI_math_vector.h" @@ -22,57 +22,53 @@ #include "ED_mesh.hh" #include "ED_uvedit.hh" -#include "WM_api.hh" /* For #WM_event_add_notifier to deal with stabilization nodes. */ +#include "WM_api.hh" /* for WM_event_add_notifier to deal with stabilization nodes */ #include "transform.hh" #include "transform_convert.hh" -using namespace blender; - /* -------------------------------------------------------------------- */ /** \name UVs Transform Creation * \{ */ static void UVsToTransData(const float aspect[2], + TransData *td, + TransData2D *td2d, float *uv, const float *center, - const float calc_dist, - const bool selected, - BMLoop *l, - TransData *r_td, - TransData2D *r_td2d) + float calc_dist, + bool selected) { /* UV coords are scaled by aspects. this is needed for rotations and * proportional editing to be consistent with the stretched UV coords * that are displayed. this also means that for display and number-input, * and when the UV coords are flushed, these are converted each time. */ - r_td2d->loc[0] = uv[0] * aspect[0]; - r_td2d->loc[1] = uv[1] * aspect[1]; - r_td2d->loc[2] = 0.0f; - r_td2d->loc2d = uv; + td2d->loc[0] = uv[0] * aspect[0]; + td2d->loc[1] = uv[1] * aspect[1]; + td2d->loc[2] = 0.0f; + td2d->loc2d = uv; - r_td->flag = 0; - r_td->loc = r_td2d->loc; - copy_v2_v2(r_td->center, center ? center : r_td->loc); - r_td->center[2] = 0.0f; - copy_v3_v3(r_td->iloc, r_td->loc); + td->flag = 0; + td->loc = td2d->loc; + copy_v2_v2(td->center, center ? center : td->loc); + td->center[2] = 0.0f; + copy_v3_v3(td->iloc, td->loc); - memset(r_td->axismtx, 0, sizeof(r_td->axismtx)); - r_td->axismtx[2][2] = 1.0f; + memset(td->axismtx, 0, sizeof(td->axismtx)); + td->axismtx[2][2] = 1.0f; - r_td->ext = nullptr; - r_td->val = nullptr; + td->ext = nullptr; + td->val = nullptr; if (selected) { - r_td->flag |= TD_SELECTED; - r_td->dist = 0.0; + td->flag |= TD_SELECTED; + td->dist = 0.0; } else { - r_td->dist = calc_dist; + td->dist = calc_dist; } - unit_m3(r_td->mtx); - unit_m3(r_td->smtx); - r_td->extra = l; + unit_m3(td->mtx); + unit_m3(td->smtx); } /** @@ -224,7 +220,7 @@ static void uv_set_connectivity_distance(const ToolSettings *ts, } while (BLI_LINKSTACK_SIZE(queue)); #ifndef NDEBUG - /* Check that we didn't leave any loops tagged. */ + /* Check that we didn't leave any loops tagged */ BM_ITER_MESH (f, &fiter, bm, BM_FACES_OF_MESH) { /* Visible faces was tagged in #createTransUVs. */ if (!BM_elem_flag_test(f, BM_ELEM_TAG)) { @@ -272,9 +268,9 @@ static void createTransUVs(bContext *C, TransInfo *t) continue; } - /* Count. */ + /* count */ if (is_island_center) { - /* Create element map with island information. */ + /* create element map with island information */ elementmap = BM_uv_element_map_create(em->bm, scene, true, false, true, true); if (elementmap == nullptr) { continue; @@ -336,8 +332,8 @@ static void createTransUVs(bContext *C, TransInfo *t) tc->data_len = (is_prop_edit) ? count : countsel; tc->data = static_cast( MEM_callocN(tc->data_len * sizeof(TransData), "TransObData(UV Editing)")); - /* For each 2d uv coord a 3d vector is allocated, so that they can be - * treated just as if they were 3d verts. */ + /* for each 2d uv coord a 3d vector is allocated, so that they can be + * treated just as if they were 3d verts */ tc->data_2d = static_cast( MEM_callocN(tc->data_len * sizeof(TransData2D), "TransObData2D(UV Editing)")); @@ -385,7 +381,7 @@ static void createTransUVs(bContext *C, TransInfo *t) } luv = (float(*)[2])BM_ELEM_CD_GET_FLOAT_P(l, offsets.uv); - UVsToTransData(t->aspect, *luv, center, prop_distance, selected, l, td++, td2d++); + UVsToTransData(t->aspect, td++, td2d++, *luv, center, prop_distance, selected); } } @@ -432,7 +428,7 @@ static void flushTransUVs(TransInfo *t) size[1] = size_i[1]; } - /* Flush to 2d vector from internally used 3d vector. */ + /* flush to 2d vector from internally used 3d vector */ for (a = 0, td = tc->data_2d; a < tc->data_len; a++, td++) { td->loc2d[0] = td->loc[0] * aspect_inv[0]; td->loc2d[1] = td->loc[1] * aspect_inv[1]; @@ -477,681 +473,6 @@ static void recalcData_uv(TransInfo *t) /** \} */ -/* -------------------------------------------------------------------- */ -/** \name API for Vert and Edge Slide - * \{ */ - -struct UVGroups { - int sd_len; - - private: - Vector groups_offs_buffer_; - Vector groups_offs_indices_; - - public: - void init(const TransDataContainer *tc, BMesh *bm, const BMUVOffsets &offsets) - { - /* To identify #TransData by the corner, we first need to set all values in `index` to `-1`. */ - BMIter fiter; - BMIter liter; - BMFace *f; - BM_ITER_MESH (f, &fiter, bm, BM_FACES_OF_MESH) { - BMLoop *l; - BM_ITER_ELEM (l, &liter, f, BM_LOOPS_OF_FACE) { - BM_elem_index_set(l, -1); - } - } - - /* Now, count and set the index for the corners being transformed. */ - this->sd_len = 0; - TransData *td = tc->data; - for (int i = 0; i < tc->data_len; i++, td++) { - if (!(td->flag & TD_SELECTED)) { - /* The selected ones are sorted at the beginning. */ - break; - } - this->sd_len++; - - BMLoop *l = static_cast(td->extra); - BM_elem_index_set(l, i); - } - bm->elem_index_dirty |= BM_LOOP; - - /* Create the groups. */ - groups_offs_buffer_.reserve(this->sd_len); - groups_offs_indices_.reserve((this->sd_len / 4) + 2); - - td = tc->data; - for (int i = 0; i < tc->data_len; i++, td++) { - BMLoop *l_orig = static_cast(td->extra); - if (BM_elem_index_get(l_orig) == -1) { - /* Already added to a group. */ - continue; - } - - const float2 &uv_orig = BM_ELEM_CD_GET_FLOAT_P(l_orig, offsets.uv); - groups_offs_indices_.append(groups_offs_buffer_.size()); - - BMIter liter; - BMLoop *l_iter; - BM_ITER_ELEM (l_iter, &liter, l_orig->v, BM_LOOPS_OF_VERT) { - if (BM_elem_index_get(l_iter) == -1) { - /* Already added to a group or not participating in the transformation. */ - continue; - } - - if (l_orig != l_iter && - !compare_v2v2(uv_orig, BM_ELEM_CD_GET_FLOAT_P(l_iter, offsets.uv), FLT_EPSILON)) - { - /* Non-connected. */ - continue; - } - - groups_offs_buffer_.append(BM_elem_index_get(l_iter)); - BM_elem_index_set(l_iter, -1); - } - } - groups_offs_indices_.append(groups_offs_buffer_.size()); - } - - OffsetIndices groups() const - { - return OffsetIndices(groups_offs_indices_); - } - - Span td_indices_get(const int group_index) const - { - return groups_offs_buffer_.as_span().slice(this->groups()[group_index]); - } - - Array sd_array_create_and_init(TransDataContainer *tc) - { - Array r_sv(this->sd_len); - TransDataVertSlideVert *sv = &r_sv[0]; - for (const int group_index : this->groups().index_range()) { - for (int td_index : this->td_indices_get(group_index)) { - TransData *td = &tc->data[td_index]; - sv->td = td; - sv++; - } - } - - return r_sv; - } - - Array sd_array_create_and_init_edge(TransDataContainer *tc) - { - Array r_sv(this->sd_len); - TransDataEdgeSlideVert *sv = &r_sv[0]; - for (const int group_index : this->groups().index_range()) { - for (int td_index : this->td_indices_get(group_index)) { - TransData *td = &tc->data[td_index]; - sv->td = td; - sv->dir_side[0] = float3(0); - sv->dir_side[1] = float3(0); - sv->loop_nr = -1; - sv++; - } - } - - return r_sv; - } - - MutableSpan sd_group_get(MutableSpan sd_array, - const int group_index) - { - return sd_array.slice(this->groups()[group_index]); - } - - MutableSpan sd_group_get(MutableSpan sd_array, - const int group_index) - { - return sd_array.slice(this->groups()[group_index]); - } -}; - -static UVGroups *mesh_uv_groups_get(TransDataContainer *tc, BMesh *bm, const BMUVOffsets &offsets) -{ - UVGroups *uv_groups = static_cast(tc->custom.type.data); - if (uv_groups == nullptr) { - uv_groups = MEM_new(__func__); - uv_groups->init(tc, bm, offsets); - - /* Edge Slide and Vert Slide are often called in sequence, so, to avoid recalculating the - * groups, save them in the #TransDataContainer. */ - - tc->custom.type.data = uv_groups; - tc->custom.type.free_cb = [](TransInfo *, TransDataContainer *, TransCustomData *custom_data) { - UVGroups *data = static_cast(custom_data->data); - MEM_delete(data); - custom_data->data = nullptr; - }; - } - - return uv_groups; -} - -/** \} */ - -/* -------------------------------------------------------------------- */ -/** \name API for Vert Slide - * \{ */ - -Array transform_mesh_uv_vert_slide_data_create( - const TransInfo *t, TransDataContainer *tc, Vector &r_loc_dst_buffer) -{ - - BMEditMesh *em = BKE_editmesh_from_object(tc->obedit); - BMesh *bm = em->bm; - const BMUVOffsets offsets = BM_uv_map_get_offsets(bm); - - UVGroups *uv_groups = mesh_uv_groups_get(tc, bm, offsets); - - Array r_sv = uv_groups->sd_array_create_and_init(tc); - - r_loc_dst_buffer.reserve(r_sv.size() * 4); - - for (const int group_index : uv_groups->groups().index_range()) { - const int size_prev = r_loc_dst_buffer.size(); - - for (int td_index : uv_groups->td_indices_get(group_index)) { - TransData *td = &tc->data[td_index]; - BMLoop *l = static_cast(td->extra); - - for (BMLoop *l_dst : {l->prev, l->next}) { - const float2 &uv_dest = BM_ELEM_CD_GET_FLOAT_P(l_dst, offsets.uv); - Span uvs_added = r_loc_dst_buffer.as_span().drop_front(size_prev); - - bool skip = std::any_of( - uvs_added.begin(), uvs_added.end(), [&](const float3 &uv_dest_added) { - return compare_v2v2(uv_dest, uv_dest_added, FLT_EPSILON); - }); - - if (!skip) { - r_loc_dst_buffer.append(float3(uv_dest, 0.0f)); - } - } - } - - const int size_new = r_loc_dst_buffer.size() - size_prev; - for (TransDataVertSlideVert &sv : uv_groups->sd_group_get(r_sv, group_index)) { - /* The buffer address may change as the vector is resized. Avoid setting #Span now. */ - // sv.targets = r_loc_dst_buffer.as_span().drop_front(size_prev); - - /* Store the buffer slice temporarily in `target_curr`. */ - sv.co_link_orig_3d = {static_cast(POINTER_FROM_INT(size_prev)), size_new}; - sv.co_link_curr = 0; - } - } - - if (t->aspect[0] != 1.0f || t->aspect[1] != 1.0f) { - for (float3 &dest : r_loc_dst_buffer) { - dest[0] *= t->aspect[0]; - dest[1] *= t->aspect[1]; - } - } - - for (TransDataVertSlideVert &sv : r_sv) { - int start = POINTER_AS_INT(sv.co_link_orig_3d.data()); - sv.co_link_orig_3d = r_loc_dst_buffer.as_span().slice(start, sv.co_link_orig_3d.size()); - } - - return r_sv; -} - -/** \} */ - -/* -------------------------------------------------------------------- */ -/** \name API for Edge Slide - * \{ */ - -/* Check if the UV group is a vertex between 2 faces. */ -static bool mesh_uv_group_is_inner(const TransDataContainer *tc, - const BMUVOffsets &offsets, - Span group) -{ - if (group.size() == 1) { - return false; - } - if (group.size() > 2) { - return false; - } - - TransData *td_a = &tc->data[group[0]]; - TransData *td_b = &tc->data[group[1]]; - BMLoop *l_a = static_cast(td_a->extra); - BMLoop *l_b = static_cast(td_b->extra); - BMLoop *l_a_prev = l_a->prev; - BMLoop *l_a_next = l_a->next; - BMLoop *l_b_prev = l_b->next; - BMLoop *l_b_next = l_b->prev; - if (l_a_prev->v != l_b_prev->v) { - std::swap(l_b_prev, l_b_next); - if (l_a_prev->v != l_b_prev->v) { - return false; - } - } - - if (l_a_next->v != l_b_next->v) { - return false; - } - - const float2 &uv_a_prev = BM_ELEM_CD_GET_FLOAT_P(l_a_prev, offsets.uv); - const float2 &uv_b_prev = BM_ELEM_CD_GET_FLOAT_P(l_b_prev, offsets.uv); - if (!compare_v2v2(uv_a_prev, uv_b_prev, FLT_EPSILON)) { - return false; - } - - const float2 &uv_a_next = BM_ELEM_CD_GET_FLOAT_P(l_a_next, offsets.uv); - const float2 &uv_b_next = BM_ELEM_CD_GET_FLOAT_P(l_b_next, offsets.uv); - if (!compare_v2v2(uv_a_next, uv_b_next, FLT_EPSILON)) { - return false; - } - - return true; -} - -/** - * Find the closest point on the ngon on the opposite side. - * used to set the edge slide distance for ngons. - */ -static bool bm_loop_uv_calc_opposite_co(const BMLoop *l_tmp, - const float2 &uv_tmp, - const BMUVOffsets &offsets, - const float2 &ray_direction, - float2 &r_co) -{ - /* skip adjacent edges */ - BMLoop *l_first = l_tmp->next; - BMLoop *l_last = l_tmp->prev; - BMLoop *l_iter; - float dist_sq_best = FLT_MAX; - bool found = false; - - l_iter = l_first; - do { - const float2 &uv_iter = BM_ELEM_CD_GET_FLOAT_P(l_iter, offsets.uv); - const float2 &uv_iter_next = BM_ELEM_CD_GET_FLOAT_P(l_iter->next, offsets.uv); - float lambda; - if (isect_ray_seg_v2(uv_tmp, ray_direction, uv_iter, uv_iter_next, &lambda, nullptr) || - isect_ray_seg_v2(uv_tmp, -ray_direction, uv_iter, uv_iter_next, &lambda, nullptr)) - { - float2 isect_co = uv_tmp + ray_direction * lambda; - /* likelihood of multiple intersections per ngon is quite low, - * it would have to loop back on itself, but better support it - * so check for the closest opposite edge */ - const float dist_sq_test = math::distance_squared(uv_tmp, isect_co); - if (dist_sq_test < dist_sq_best) { - r_co = isect_co; - dist_sq_best = dist_sq_test; - found = true; - } - } - } while ((l_iter = l_iter->next) != l_last); - - return found; -} - -static float2 isect_face_dst(const BMLoop *l, - const float2 &uv, - const float2 &aspect, - const BMUVOffsets &offsets) -{ - BMFace *f = l->f; - BMLoop *l_next = l->next; - if (f->len == 4) { - /* we could use code below, but in this case - * sliding diagonally across the quad works well */ - return BM_ELEM_CD_GET_FLOAT_P(l_next->next, offsets.uv); - } - - BMLoop *l_prev = l->prev; - const float2 &uv_prev = BM_ELEM_CD_GET_FLOAT_P(l_prev, offsets.uv); - const float2 &uv_next = BM_ELEM_CD_GET_FLOAT_P(l_next, offsets.uv); - - float2 ray_dir = (uv - uv_prev) + (uv_next - uv); - ray_dir = math::orthogonal(ray_dir * aspect); - ray_dir[0] /= aspect[0]; - ray_dir[1] /= aspect[1]; - - float2 isect_co; - if (!bm_loop_uv_calc_opposite_co(l, uv, offsets, ray_dir, isect_co)) { - /* Rare case. */ - mid_v3_v3v3(isect_co, l->prev->v->co, l_next->v->co); - } - return isect_co; -} - -Array transform_mesh_uv_edge_slide_data_create(const TransInfo *t, - TransDataContainer *tc, - int *r_group_len) -{ - Array r_sv; - BMEditMesh *em = BKE_editmesh_from_object(tc->obedit); - BMesh *bm = em->bm; - const BMUVOffsets offsets = BM_uv_map_get_offsets(bm); - - const bool check_edge = ED_uvedit_select_mode_get(t->scene) == UV_SELECT_EDGE; - - UVGroups *uv_groups = mesh_uv_groups_get(tc, bm, offsets); - Array groups_linked(uv_groups->groups().size(), int2(-1, -1)); - - { - /* Identify the group to which a loop belongs through the element's index value. */ - - /* First we just need to "clean up" the neighboring loops. - * This way we can identify where a group of sliding edges starts and where it ends. */ - TransData *td = tc->data; - for (int i = 0; i < tc->data_len; i++, td++) { - if (!(td->flag & TD_SELECTED)) { - /* The selected ones are sorted at the beginning. */ - break; - } - BMLoop *l = static_cast(td->extra); - BM_elem_index_set(l->prev, -1); - BM_elem_index_set(l->next, -1); - } - - /* Now set the group indexes. */ - for (const int group_index : uv_groups->groups().index_range()) { - for (int td_index : uv_groups->td_indices_get(group_index)) { - TransData *td = &tc->data[td_index]; - BMLoop *l = static_cast(td->extra); - BM_elem_index_set(l, group_index); - } - } - bm->elem_index_dirty |= BM_LOOP; - } - - for (const int group_index : uv_groups->groups().index_range()) { - int2 &group_linked_pair = groups_linked[group_index]; - - for (int td_index : uv_groups->td_indices_get(group_index)) { - TransData *td = &tc->data[td_index]; - BMLoop *l = static_cast(td->extra); - - for (BMLoop *l_dst : {l->prev, l->next}) { - const int group_index_dst = BM_elem_index_get(l_dst); - if (group_index_dst == -1) { - continue; - } - - if (ELEM(group_index_dst, group_linked_pair[0], group_linked_pair[1])) { - continue; - } - - if (check_edge) { - BMLoop *l_edge = l_dst == l->prev ? l_dst : l; - if (!uvedit_edge_select_test_ex(t->settings, l_edge, offsets)) { - continue; - } - } - - if (group_linked_pair[1] != -1) { - /* For Edge Slide, the vertex can only be connected to a maximum of 2 sliding edges. */ - return r_sv; - } - const int slot = int(group_linked_pair[0] != -1); - group_linked_pair[slot] = group_index_dst; - } - } - - if (group_linked_pair[0] == -1) { - /* For Edge Slide, the vertex must be connected to at least 1 sliding edge. */ - return r_sv; - } - } - - /* Alloc and initialize the #TransDataEdgeSlideVert. */ - r_sv = uv_groups->sd_array_create_and_init_edge(tc); - - /* Compute the sliding groups. */ - int loop_nr = 0; - for (int i : r_sv.index_range()) { - if (r_sv[i].loop_nr != -1) { - /* This vertex has already been computed. */ - continue; - } - - BMLoop *l = static_cast(r_sv[i].td->extra); - int group_index = BM_elem_index_get(l); - - /* Start from a vertex connected to just a single edge or any if it doesn't exist. */ - int i_curr = group_index; - int i_prev = groups_linked[group_index][1]; - while (!ELEM(i_prev, -1, group_index)) { - int tmp = groups_linked[i_prev][0] != i_curr ? groups_linked[i_prev][0] : - groups_linked[i_prev][1]; - i_curr = i_prev; - i_prev = tmp; - } - - /** - * We need at least 3 points to calculate the intersection of - * `prev`-`curr` and `next`-`curr` destinations. - * - * | | | - * | | | - * prev ---- curr ---- next - */ - struct SlideTempDataUV { - int i; /* The group index. */ - struct { - BMFace *f; - float2 dst; - } fdata[2]; - bool vert_is_inner; /* In the middle of two faces. */ - /** - * Find the best direction to slide among the ones already computed. - * - * \param curr_prev: prev state of the #SlideTempDataUV where the faces are linked to the - previous edge. - * \param l_src: the source corner in the edge to slide. - * \param l_dst: the current destination corner. - */ - int find_best_dir(const SlideTempDataUV *curr_side_other, - const BMLoop *l_src, - const BMLoop *l_dst, - const float2 &src, - const float2 &dst, - bool *r_do_isect_curr_dirs) const - { - *r_do_isect_curr_dirs = false; - const BMFace *f_curr = l_src->f; - if (curr_side_other->fdata[0].f && - (curr_side_other->fdata[0].f == f_curr || - compare_v2v2(dst, curr_side_other->fdata[0].dst, FLT_EPSILON))) - { - return 0; - } - - if (curr_side_other->fdata[1].f && - (curr_side_other->fdata[1].f == f_curr || - compare_v2v2(dst, curr_side_other->fdata[1].dst, FLT_EPSILON))) - { - return 1; - } - - if (curr_side_other->fdata[0].f || curr_side_other->fdata[1].f) { - /* Find the best direction checking the edges that share faces between them. */ - int best_dir = -1; - const BMLoop *l_edge_dst = l_src->prev == l_dst ? l_src->prev : l_src; - const BMLoop *l_other = l_edge_dst->radial_next; - while (l_other != l_edge_dst) { - const BMLoop *l_other_dst = l_other->v == l_src->v ? l_other->next : l_other; - if (BM_elem_index_get(l_other_dst) != -1) { - /* This is a sliding edge corner. */ - break; - } - - if (l_other->f == curr_side_other->fdata[0].f) { - best_dir = 0; - break; - } - if (l_other->f == curr_side_other->fdata[1].f) { - best_dir = 1; - break; - } - l_other = (l_other->v == l_src->v ? l_other->prev : l_other->next)->radial_next; - } - - if (best_dir != -1) { - *r_do_isect_curr_dirs = true; - return best_dir; - } - } - - if (ELEM(nullptr, this->fdata[0].f, this->fdata[1].f)) { - return int(this->fdata[0].f != nullptr); - } - - /* Find the closest direction. */ - *r_do_isect_curr_dirs = true; - - float2 dir_curr = dst - src; - float2 dir0 = math::normalize(this->fdata[0].dst - src); - float2 dir1 = math::normalize(this->fdata[1].dst - src); - float dot0 = math::dot(dir_curr, dir0); - float dot1 = math::dot(dir_curr, dir1); - return int(dot0 < dot1); - } - } prev = {}, curr = {}, next = {}, tmp = {}; - - curr.i = i_curr; - curr.vert_is_inner = mesh_uv_group_is_inner(tc, offsets, uv_groups->td_indices_get(curr.i)); - - /* Do not compute `prev` for now. Let the loop calculate `curr` twice. */ - prev.i = -1; - - while (curr.i != -1) { - int tmp_i = prev.i == -1 ? i_prev : prev.i; - next.i = groups_linked[curr.i][0] != tmp_i ? groups_linked[curr.i][0] : - groups_linked[curr.i][1]; - if (next.i != -1) { - next.vert_is_inner = mesh_uv_group_is_inner( - tc, offsets, uv_groups->td_indices_get(next.i)); - - tmp = curr; - Span td_indices_next = uv_groups->td_indices_get(next.i); - - for (int td_index_curr : uv_groups->td_indices_get(curr.i)) { - BMLoop *l_curr = static_cast(tc->data[td_index_curr].extra); - const float2 &src = BM_ELEM_CD_GET_FLOAT_P(l_curr, offsets.uv); - - for (int td_index_next : td_indices_next) { - BMLoop *l_next = static_cast(tc->data[td_index_next].extra); - if (l_curr->f != l_next->f) { - continue; - } - - BLI_assert(l_curr != l_next); - - BMLoop *l1_dst, *l2_dst; - if (l_curr->next == l_next) { - l1_dst = l_curr->prev; - l2_dst = l_next->next; - } - else { - l1_dst = l_curr->next; - l2_dst = l_next->prev; - } - - const float2 &dst = BM_ELEM_CD_GET_FLOAT_P(l1_dst, offsets.uv); - - /* Sometimes the sliding direction may fork (`isect_curr_dirs` is `true`). - * In this case, the resulting direction is the intersection of the destinations. */ - bool isect_curr_dirs = false; - - /* Identify the slot to slide according to the directions already computed in `curr`. - */ - int best_dir = curr.find_best_dir(&tmp, l_curr, l1_dst, src, dst, &isect_curr_dirs); - - if (curr.fdata[best_dir].f == nullptr) { - curr.fdata[best_dir].f = l_curr->f; - if (curr.vert_is_inner) { - curr.fdata[best_dir].dst = isect_face_dst(l_curr, src, t->aspect, offsets); - } - else { - curr.fdata[best_dir].dst = dst; - } - } - - /* Compute `next`. */ - next.fdata[best_dir].f = l_curr->f; - if (BM_elem_index_get(l2_dst) != -1 || next.vert_is_inner) { - /* Case where the vertex slides over the face. */ - const float2 &src_next = BM_ELEM_CD_GET_FLOAT_P(l_next, offsets.uv); - next.fdata[best_dir].dst = isect_face_dst(l_next, src_next, t->aspect, offsets); - } - else { - /* Case where the vertex slides over an edge. */ - const float2 &dst_next = BM_ELEM_CD_GET_FLOAT_P(l2_dst, offsets.uv); - next.fdata[best_dir].dst = dst_next; - } - - if (isect_curr_dirs) { - /* The `best_dir` can only have one direction. */ - const float2 &dst0 = prev.fdata[best_dir].dst; - const float2 &dst1 = curr.fdata[best_dir].dst; - const float2 &dst2 = dst; - const float2 &dst3 = next.fdata[best_dir].dst; - if (isect_line_line_v2_point(dst0, dst1, dst2, dst3, curr.fdata[best_dir].dst) == - ISECT_LINE_LINE_COLINEAR) - { - curr.fdata[best_dir].dst = math::midpoint(dst1, dst2); - } - } - /* There is only one pair of corners to slide per face, we don't need to keep checking - * `if (f_curr != l_next->f)`. */ - break; - } - } - } - - TransDataEdgeSlideVert *sv_first = nullptr; - for (TransDataEdgeSlideVert &sv : uv_groups->sd_group_get(r_sv, curr.i)) { - if (sv_first) { - TransData *td = sv.td; - sv = *sv_first; - sv.td = td; - } - else { - sv_first = &sv; - float2 iloc = sv.td->iloc; - const float2 &aspect = t->aspect; - if (curr.fdata[0].f) { - float2 dst = curr.fdata[0].dst * aspect; - sv.dir_side[0] = float3(dst - iloc, 0.0f); - } - if (curr.fdata[1].f) { - float2 dst = curr.fdata[1].dst * aspect; - sv.dir_side[1] = float3(dst - iloc, 0.0f); - } - sv.edge_len = math::distance(sv.dir_side[0], sv.dir_side[1]); - sv.loop_nr = loop_nr; - } - } - - if (i_prev != -1 && prev.i == i_prev) { - /* Cycle returned to the beginning. - * The data with index `i_curr` was computed twice to make sure the directions are - * correct the second time. */ - break; - } - - /* Move forward. */ - prev = curr; - curr = next; - next.fdata[0].f = next.fdata[1].f = nullptr; - } - loop_nr++; - } - *r_group_len = loop_nr; - return r_sv; -} - -/** \} */ - TransConvertTypeInfo TransConvertType_MeshUV = { /*flags*/ (T_EDIT | T_POINTS | T_2D_EDIT), /*create_trans_data*/ createTransUVs, diff --git a/source/blender/editors/transform/transform_convert_mesh_vert_cdata.cc b/source/blender/editors/transform/transform_convert_mesh_vert_cdata.cc index d45d9851562..ec91c64f57f 100644 --- a/source/blender/editors/transform/transform_convert_mesh_vert_cdata.cc +++ b/source/blender/editors/transform/transform_convert_mesh_vert_cdata.cc @@ -122,9 +122,9 @@ static void createTransMeshVertCData(bContext * /*C*/, TransInfo *t) em, calc_single_islands, calc_island_center, calc_island_axismtx, &island_data); } - copy_m3_m4(mtx, tc->obedit->object_to_world().ptr()); - /* We use a pseudo-inverse so that when one of the axes is scaled to 0, - * matrix inversion still works and we can still moving along the other. */ + copy_m3_m4(mtx, tc->obedit->object_to_world); + /* we use a pseudo-inverse so that when one of the axes is scaled to 0, + * matrix inversion still works and we can still moving along the other */ pseudoinverse_m3_m3(smtx, mtx, PSEUDOINVERSE_EPSILON); /* Original index of our connected vertex when connected distances are calculated. @@ -168,7 +168,7 @@ static void createTransMeshVertCData(bContext * /*C*/, TransInfo *t) createSpaceNormal(td->axismtx, eve->no); } else { - /* Setting normals. */ + /* Setting normals */ copy_v3_v3(td->axismtx[2], eve->no); td->axismtx[0][0] = td->axismtx[0][1] = td->axismtx[0][2] = td->axismtx[1][0] = td->axismtx[1][1] = td->axismtx[1][2] = 0.0f; @@ -183,7 +183,7 @@ static void createTransMeshVertCData(bContext * /*C*/, TransInfo *t) } } - /* CrazySpace. */ + /* CrazySpace */ transform_convert_mesh_crazyspace_transdata_set( mtx, smtx, diff --git a/source/blender/editors/transform/transform_convert_nla.cc b/source/blender/editors/transform/transform_convert_nla.cc index 8ac35e4ba9f..ff882e32b0a 100644 --- a/source/blender/editors/transform/transform_convert_nla.cc +++ b/source/blender/editors/transform/transform_convert_nla.cc @@ -17,11 +17,12 @@ #include "BLI_math_matrix.h" #include "BLI_math_vector.h" -#include "BKE_anim_data.hh" +#include "BKE_anim_data.h" #include "BKE_context.hh" #include "BKE_nla.h" #include "ED_anim_api.hh" +#include "ED_markers.hh" #include "WM_api.hh" #include "WM_types.hh" @@ -31,6 +32,8 @@ #include "transform.hh" #include "transform_convert.hh" +#include "transform_mode.hh" +#include "transform_snap.hh" /** Used for NLA transform (stored in #TransData.extra pointer). */ struct TransDataNla { @@ -45,13 +48,13 @@ struct TransDataNla { /** NLA-strip this data represents. */ NlaStrip *strip; - /* Dummy values for transform to write in - must have 3 elements. */ - /** Start handle. */ + /* dummy values for transform to write in - must have 3 elements... */ + /** start handle. */ float h1[3]; - /** End handle. */ + /** end handle. */ float h2[3]; - /** Index of track that strip is currently in. */ + /** index of track that strip is currently in. */ int trackIndex; /** @@ -60,7 +63,7 @@ struct TransDataNla { */ int signed_track_index; - /** Handle-index: 0 for dummy entry, -1 for start, 1 for end, 2 for both ends. */ + /** handle-index: 0 for dummy entry, -1 for start, 1 for end, 2 for both ends. */ int handle; }; @@ -359,10 +362,10 @@ static void nlastrip_flag_overlaps(NlaStrip *strip) */ static void nlastrip_fix_overlapping(TransInfo *t, TransDataNla *tdn, NlaStrip *strip) { - /* Firstly, check if the proposed transform locations would overlap with any neighboring - * strips (barring transitions) which are absolute barriers since they are not being moved. + /* firstly, check if the proposed transform locations would overlap with any neighboring + * strips (barring transitions) which are absolute barriers since they are not being moved * - * This is done as a iterative procedure (done 5 times max for now). */ + * this is done as a iterative procedure (done 5 times max for now). */ short iter_max = 4; NlaStrip *prev = BKE_nlastrip_prev_in_track(strip, true); NlaStrip *next = BKE_nlastrip_next_in_track(strip, true); @@ -387,20 +390,20 @@ static void nlastrip_fix_overlapping(TransInfo *t, TransDataNla *tdn, NlaStrip * } } else if (n_exceeded) { - /* Move backwards. */ + /* move backwards */ float offset = tdn->h2[0] - next->start; tdn->h1[0] -= offset; tdn->h2[0] -= offset; } else if (p_exceeded) { - /* More forwards. */ + /* more forwards */ float offset = prev->end - tdn->h1[0]; tdn->h1[0] += offset; tdn->h2[0] += offset; } - else { /* All is fine and well. */ + else { /* all is fine and well */ break; } } @@ -450,38 +453,38 @@ static void createTransNlaData(bContext *C, TransInfo *t) TransDataContainer *tc = TRANS_DATA_CONTAINER_FIRST_SINGLE(t); - /* Determine what type of data we are operating on. */ + /* determine what type of data we are operating on */ if (ANIM_animdata_get_context(C, &ac) == 0) { return; } snla = (SpaceNla *)ac.sl; - /* Filter data. */ + /* filter data */ filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_FCURVESONLY); ANIM_animdata_filter( &ac, &anim_data, eAnimFilter_Flags(filter), ac.data, eAnimCont_Types(ac.datatype)); - /* Which side of the current frame should be allowed. */ + /* which side of the current frame should be allowed */ if (t->mode == TFM_TIME_EXTEND) { t->frame_side = transform_convert_frame_side_dir_get(t, float(scene->r.cfra)); } else { - /* Normal transform - both sides of current frame are considered. */ + /* normal transform - both sides of current frame are considered */ t->frame_side = 'B'; } - /* Loop 1: count how many strips are selected (consider each strip as 2 points). */ + /* loop 1: count how many strips are selected (consider each strip as 2 points) */ LISTBASE_FOREACH (bAnimListElem *, ale, &anim_data) { NlaTrack *nlt = (NlaTrack *)ale->data; - /* Make some meta-strips for chains of selected strips. */ + /* make some meta-strips for chains of selected strips */ BKE_nlastrips_make_metas(&nlt->strips, true); - /* Only consider selected strips. */ + /* only consider selected strips */ LISTBASE_FOREACH (NlaStrip *, strip, &nlt->strips) { /* TODO: we can make strips have handles later on. */ - /* Transition strips can't get directly transformed. */ + /* transition strips can't get directly transformed */ if (strip->type == NLASTRIP_TYPE_TRANSITION) { continue; } @@ -497,21 +500,22 @@ static void createTransNlaData(bContext *C, TransInfo *t) } } - /* Stop if trying to build list if nothing selected. */ + /* stop if trying to build list if nothing selected */ if (count == 0) { - /* Clear temp metas that may have been created but aren't needed now - * because they fell on the wrong side of `scene->r.cfra`. */ + /* clear temp metas that may have been created but aren't needed now + * because they fell on the wrong side of scene->r.cfra + */ LISTBASE_FOREACH (bAnimListElem *, ale, &anim_data) { NlaTrack *nlt = (NlaTrack *)ale->data; BKE_nlastrips_clear_metas(&nlt->strips, false, true); } - /* Cleanup temp list. */ + /* cleanup temp list */ ANIM_animdata_freelist(&anim_data); return; } - /* Allocate memory for data. */ + /* allocate memory for data */ tc->data_len = count; tc->data = static_cast( @@ -521,17 +525,17 @@ static void createTransNlaData(bContext *C, TransInfo *t) MEM_callocN(tc->data_len * sizeof(TransDataNla), "TransDataNla (NLA Editor)")); tc->custom.type.use_free = true; - /* Loop 2: build transdata array. */ + /* loop 2: build transdata array */ LISTBASE_FOREACH (bAnimListElem *, ale, &anim_data) { - /* Only if a real NLA-track. */ + /* only if a real NLA-track */ if (ale->type == ANIMTYPE_NLATRACK) { AnimData *adt = ale->adt; NlaTrack *nlt = (NlaTrack *)ale->data; - /* Only consider selected strips. */ + /* only consider selected strips */ LISTBASE_FOREACH (NlaStrip *, strip, &nlt->strips) { /* TODO: we can make strips have handles later on. */ - /* Transition strips can't get directly transformed. */ + /* transition strips can't get directly transformed */ if (strip->type == NLASTRIP_TYPE_TRANSITION) { continue; } @@ -569,9 +573,9 @@ static void createTransNlaData(bContext *C, TransInfo *t) center[1] = yval; center[2] = 0.0f; - /* Set td's based on which handles are applicable. */ + /* set td's based on which handles are applicable */ if (FrameOnMouseSide(t->frame_side, strip->start, float(scene->r.cfra))) { - /* Just set `tdn` to assume that it only has one handle for now. */ + /* just set tdn to assume that it only has one handle for now */ tdn->handle = -1; /* Now, link the transform data up to this data. */ @@ -591,8 +595,8 @@ static void createTransNlaData(bContext *C, TransInfo *t) td++; } if (FrameOnMouseSide(t->frame_side, strip->end, float(scene->r.cfra))) { - /* If `tdn` is already holding the start handle, - * then we're doing both, otherwise, only end. */ + /* if tdn is already holding the start handle, + * then we're doing both, otherwise, only end */ tdn->handle = (tdn->handle) ? 2 : 1; /* Now, link the transform data up to this data. */ @@ -628,7 +632,7 @@ static void createTransNlaData(bContext *C, TransInfo *t) BLI_assert(tdn <= (((TransDataNla *)tc->custom.type.data) + tc->data_len)); - /* Cleanup temp list. */ + /* cleanup temp list */ ANIM_animdata_freelist(&anim_data); } @@ -647,32 +651,33 @@ static void recalcData_nla(TransInfo *t) NlaStrip *strip = tdn->strip; int delta_y1, delta_y2; - /* If this tdn has no handles, that means it is just a dummy that should be skipped. */ + /* if this tdn has no handles, that means it is just a dummy that should be skipped */ if (tdn->handle == 0) { continue; } strip->flag &= ~NLASTRIP_FLAG_INVALID_LOCATION; - /* Set refresh tags for objects using this animation, - * BUT only if realtime updates are enabled. */ - + /* set refresh tags for objects using this animation, + * BUT only if realtime updates are enabled + */ if ((snla->flag & SNLA_NOREALTIMEUPDATES) == 0) { ANIM_id_update(CTX_data_main(t->context), tdn->id); } - /* If canceling transform, just write the values without validating, then move on. */ + /* if canceling transform, just write the values without validating, then move on */ if (t->state == TRANS_CANCEL) { - /* Clear the values by directly overwriting the originals, but also need to restore - * endpoints of neighboring transition-strips. */ + /* clear the values by directly overwriting the originals, but also need to restore + * endpoints of neighboring transition-strips + */ - /* Start. */ + /* start */ strip->start = tdn->h1[0]; if ((strip->prev) && (strip->prev->type == NLASTRIP_TYPE_TRANSITION)) { strip->prev->end = tdn->h1[0]; } - /* End. */ + /* end */ strip->end = tdn->h2[0]; if ((strip->next) && (strip->next->type == NLASTRIP_TYPE_TRANSITION)) { @@ -681,10 +686,10 @@ static void recalcData_nla(TransInfo *t) strip->scale = tdn->h1[2]; - /* Flush transforms to child strips (since this should be a meta). */ + /* flush transforms to child strips (since this should be a meta) */ BKE_nlameta_flush_transforms(strip); - /* Restore to original track (if needed). */ + /* restore to original track (if needed) */ if (tdn->oldTrack != tdn->nlt) { /* Just append to end of list for now, * since strips get sorted in special_aftertrans_update(). */ @@ -709,7 +714,7 @@ static void recalcData_nla(TransInfo *t) nlastrip_fix_overlapping(t, tdn, strip); } - /* Flush transforms to child strips (since this should be a meta). */ + /* flush transforms to child strips (since this should be a meta) */ BKE_nlameta_flush_transforms(strip); /* Now, check if we need to try and move track: @@ -746,9 +751,9 @@ static void recalcData_nla(TransInfo *t) * The last case leads to `delta_new_tracks == 0`. */ int delta_new_tracks = delta; - /* It's possible to drag a strip fast enough to make delta > |1|. We only want to process - * 1 track shift at a time. */ - + /* it's possible to drag a strip fast enough to make delta > |1|. We only want to process + * 1 track shift at a time. + */ CLAMP(delta_new_tracks, -1, 1); dst_track = old_track; @@ -821,7 +826,7 @@ struct IDGroupedTransData { ListBase trans_datas; }; -/** Horizontally translate (shuffle) the transformed strip to a non-overlapping state. */ +/** horizontally translate (shuffle) the transformed strip to a non-overlapping state. */ static void nlastrip_shuffle_transformed(TransDataContainer *tc, TransDataNla *first_trans_data) { /* Element: #IDGroupedTransData. */ @@ -890,7 +895,7 @@ static void nlastrip_shuffle_transformed(TransDataContainer *tc, TransDataNla *f trans_data->nlt = dst_track; } else { - /* If destination track is locked, we need revert strip to source track. */ + /* if destination track is locked, we need revert strip to source track. */ printf("Cannot moved. Target track '%s' is locked. \n", trans_data->nlt->name); int old_track_index = BLI_findindex(tracks, trans_data->oldTrack); NlaTrack *old_track = static_cast(BLI_findlink(tracks, old_track_index)); @@ -926,7 +931,7 @@ static void special_aftertrans_update__nla(bContext *C, TransInfo *t) { bAnimContext ac; - /* Initialize relevant anim-context 'context' data. */ + /* initialize relevant anim-context 'context' data */ if (ANIM_animdata_get_context(C, &ac) == 0) { return; } @@ -956,17 +961,17 @@ static void special_aftertrans_update__nla(bContext *C, TransInfo *t) ListBase anim_data = {nullptr, nullptr}; short filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_FCURVESONLY); - /* Get tracks to work on. */ + /* get tracks to work on */ ANIM_animdata_filter( &ac, &anim_data, eAnimFilter_Flags(filter), ac.data, eAnimCont_Types(ac.datatype)); LISTBASE_FOREACH (bAnimListElem *, ale, &anim_data) { NlaTrack *nlt = (NlaTrack *)ale->data; - /* Make sure strips are in order again. */ + /* make sure strips are in order again */ BKE_nlatrack_sort_strips(nlt); - /* Remove the temp metas. */ + /* remove the temp metas */ BKE_nlastrips_clear_metas(&nlt->strips, false, true); } @@ -976,7 +981,7 @@ static void special_aftertrans_update__nla(bContext *C, TransInfo *t) * - duplicate-move moves to different track. */ WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_ADDED, nullptr); - /* Free temp memory. */ + /* free temp memory */ ANIM_animdata_freelist(&anim_data); /* Truncate temporarily added tracks. */ diff --git a/source/blender/editors/transform/transform_convert_node.cc b/source/blender/editors/transform/transform_convert_node.cc index 20bcfde0e77..11081f9f82c 100644 --- a/source/blender/editors/transform/transform_convert_node.cc +++ b/source/blender/editors/transform/transform_convert_node.cc @@ -17,9 +17,13 @@ #include "BKE_context.hh" #include "BKE_node.hh" +#include "BKE_node_runtime.hh" +#include "BKE_node_tree_update.hh" +#include "BKE_report.h" #include "ED_node.hh" +#include "UI_interface.hh" #include "UI_view2d.hh" #include "transform.hh" @@ -46,21 +50,21 @@ static void create_transform_data_for_node(TransData &td, bNode &node, const float dpi_fac) { - /* Account for parents (nested nodes). */ + /* account for parents (nested nodes) */ const float2 node_offset = {node.offsetx, node.offsety}; float2 loc = bke::nodeToView(&node, math::round(node_offset)); loc *= dpi_fac; - /* Use top-left corner as the transform origin for nodes. */ + /* use top-left corner as the transform origin for nodes */ /* Weirdo - but the node system is a mix of free 2d elements and DPI sensitive UI. */ td2d.loc[0] = loc.x; td2d.loc[1] = loc.y; td2d.loc[2] = 0.0f; - td2d.loc2d = td2d.loc; /* Current location. */ + td2d.loc2d = td2d.loc; /* current location */ td.loc = td2d.loc; copy_v3_v3(td.iloc, td.loc); - /* Use node center instead of origin (top-left corner). */ + /* use node center instead of origin (top-left corner) */ td.center[0] = td2d.loc[0]; td.center[1] = td2d.loc[1]; td.center[2] = 0.0f; @@ -98,7 +102,7 @@ static void createTransNodeData(bContext * /*C*/, TransInfo *t) return; } - /* Custom data to enable edge panning during the node transform. */ + /* Custom data to enable edge panning during the node transform */ TransCustomDataNode *customdata = MEM_cnew(__func__); UI_view2d_edge_pan_init(t->context, &customdata->edgepan_data, @@ -199,7 +203,7 @@ static void flushTransNodes(TransInfo *t) UI_view2d_edge_pan_cancel(t->context, &customdata->edgepan_data); } else { - /* Edge panning functions expect window coordinates, mval is relative to region. */ + /* Edge panning functions expect window coordinates, mval is relative to region */ const int xy[2] = { t->region->winrct.xmin + int(t->mval[0]), t->region->winrct.ymin + int(t->mval[1]), @@ -221,7 +225,7 @@ static void flushTransNodes(TransInfo *t) FOREACH_TRANS_DATA_CONTAINER (t, tc) { node_snap_grid_apply(t); - /* Flush to 2d vector from internally used 3d vector. */ + /* flush to 2d vector from internally used 3d vector */ for (int i = 0; i < tc->data_len; i++) { TransData *td = &tc->data[i]; TransData2D *td2d = &tc->data_2d[i]; @@ -233,7 +237,7 @@ static void flushTransNodes(TransInfo *t) /* Weirdo - but the node system is a mix of free 2d elements and DPI sensitive UI. */ loc /= dpi_fac; - /* Account for parents (nested nodes). */ + /* account for parents (nested nodes) */ const float2 node_offset = {node->offsetx, node->offsety}; const float2 new_node_location = loc - math::round(node_offset); const float2 location = bke::nodeFromView(node->parent, new_node_location); @@ -241,7 +245,7 @@ static void flushTransNodes(TransInfo *t) node->locy = location.y; } - /* Handle intersection with noodles. */ + /* handle intersection with noodles */ if (tc->data_len == 1) { if (t->modifiers & MOD_NODE_ATTACH) { space_node::node_insert_on_link_flags_set(*snode, *t->region); @@ -268,7 +272,7 @@ static void special_aftertrans_update__node(bContext *C, TransInfo *t) const bool canceled = (t->state == TRANS_CANCEL); if (canceled && t->remove_on_cancel) { - /* Remove selected nodes on cancel. */ + /* remove selected nodes on cancel */ if (ntree) { LISTBASE_FOREACH_MUTABLE (bNode *, node, &ntree->nodes) { if (node->flag & NODE_SELECT) { diff --git a/source/blender/editors/transform/transform_convert_object.cc b/source/blender/editors/transform/transform_convert_object.cc index 69888c0c5e9..760a8830705 100644 --- a/source/blender/editors/transform/transform_convert_object.cc +++ b/source/blender/editors/transform/transform_convert_object.cc @@ -13,16 +13,20 @@ #include "BLI_math_rotation.h" #include "BLI_math_vector.h" +#include "BKE_animsys.h" #include "BKE_context.hh" #include "BKE_layer.hh" #include "BKE_lib_id.hh" +#include "BKE_main.hh" #include "BKE_object.hh" #include "BKE_pointcache.h" +#include "BKE_report.h" #include "BKE_rigidbody.h" -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "ANIM_keyframing.hh" #include "ANIM_rna.hh" +#include "ED_keyframing.hh" #include "ED_object.hh" #include "DEG_depsgraph_query.hh" @@ -129,9 +133,7 @@ static void trans_obchild_in_obmode_update_all(TransInfo *t) /* *********************** Object Transform data ******************* */ -/** - * Transcribe given object into TransData for Transforming. - */ +/* transcribe given object into TransData for Transforming */ static void ObjectToTransData(TransInfo *t, TransData *td, Object *ob) { Scene *scene = t->scene; @@ -142,11 +144,11 @@ static void ObjectToTransData(TransInfo *t, TransData *td, Object *ob) float rot[3][3], scale[3]; float ctime = BKE_scene_ctime_get(scene); - /* Only use rigid body transform if simulation is running, - * avoids problems with initial setup of rigid bodies. */ + /* only use rigid body transform if simulation is running, + * avoids problems with initial setup of rigid bodies */ if (BKE_rigidbody_check_sim_running(scene->rigidbody_world, ctime)) { - /* Save original object transform. */ + /* save original object transform */ copy_v3_v3(td->ext->oloc, ob->loc); if (ob->rotmode > 0) { @@ -159,15 +161,15 @@ static void ObjectToTransData(TransInfo *t, TransData *td, Object *ob) else { copy_qt_qt(td->ext->oquat, ob->quat); } - /* Update object's loc/rot to get current rigid body transform. */ - mat4_to_loc_rot_size(ob->loc, rot, scale, ob->object_to_world().ptr()); + /* update object's loc/rot to get current rigid body transform */ + mat4_to_loc_rot_size(ob->loc, rot, scale, ob->object_to_world); sub_v3_v3(ob->loc, ob->dloc); - BKE_object_mat3_to_rot(ob, rot, false); /* `drot` is already corrected here. */ + BKE_object_mat3_to_rot(ob, rot, false); /* drot is already corrected here */ } } - /* `axismtx` has the real orientation. */ - transform_orientations_create_from_axis(td->axismtx, UNPACK3(ob->object_to_world().ptr())); + /* axismtx has the real orientation */ + transform_orientations_create_from_axis(td->axismtx, UNPACK3(ob->object_to_world)); if (t->orient_type_mask & (1 << V3D_ORIENT_GIMBAL)) { if (!gimbal_axis_object(ob, td->ext->axismtx_gimbal)) { copy_m3_m3(td->ext->axismtx_gimbal, td->axismtx); @@ -176,27 +178,28 @@ static void ObjectToTransData(TransInfo *t, TransData *td, Object *ob) td->con = static_cast(ob->constraints.first); - /* HACK: temporarily disable tracking and/or constraints when getting + /* hack: temporarily disable tracking and/or constraints when getting * object matrix, if tracking is on, or if constraints don't need * inverse correction to stop it from screwing up space conversion - * matrix later. */ + * matrix later + */ constinv = constraints_list_needinv(t, &ob->constraints); - /* Disable constraints inversion for dummy pass. */ + /* disable constraints inversion for dummy pass */ if (t->mode == TFM_DUMMY) { skip_invert = true; } - /* NOTE: This is not really following copy-on-evaluation design and we should not + /* NOTE: This is not really following copy-on-write design and we should not * be re-evaluating the evaluated object. But as the comment above mentioned * this is part of a hack. * More proper solution would be to make a shallow copy of the object and * evaluate that, and access matrix of that evaluated copy of the object. * Might be more tricky than it sounds, if some logic later on accesses the - * object matrix via td->ob->object_to_world().ptr(). */ + * object matrix via td->ob->object_to_world. */ Object *object_eval = DEG_get_evaluated_object(t->depsgraph, ob); if (skip_invert == false && constinv == false) { - object_eval->transflag |= OB_NO_CONSTRAINTS; /* #BKE_object_where_is_calc checks this. */ + object_eval->transflag |= OB_NO_CONSTRAINTS; /* BKE_object_where_is_calc checks this */ /* It is possible to have transform data initialization prior to a * complete dependency graph evaluated. Happens, for example, when * changing transformation mode. */ @@ -209,7 +212,7 @@ static void ObjectToTransData(TransInfo *t, TransData *td, Object *ob) } /* Copy newly evaluated fields to the original object, similar to how * active dependency graph will do it. */ - copy_m4_m4(ob->runtime->object_to_world.ptr(), object_eval->object_to_world().ptr()); + copy_m4_m4(ob->object_to_world, object_eval->object_to_world); /* Only copy negative scale flag, this is the only flag which is modified by * the BKE_object_where_is_calc(). The rest of the flags we need to keep, * otherwise we might lose dupli flags (see #61787). */ @@ -259,11 +262,11 @@ static void ObjectToTransData(TransInfo *t, TransData *td, Object *ob) copy_v3_v3(td->ext->isize, ob->scale); copy_v3_v3(td->ext->dscale, ob->dscale); - copy_v3_v3(td->center, ob->object_to_world().location()); + copy_v3_v3(td->center, ob->object_to_world[3]); - copy_m4_m4(td->ext->obmat, ob->object_to_world().ptr()); + copy_m4_m4(td->ext->obmat, ob->object_to_world); - /* Is there a need to set the global<->data space conversion matrices? */ + /* is there a need to set the global<->data space conversion matrices? */ if (ob->parent || constinv) { float obmtx[3][3], totmat[3][3], obinv[3][3]; @@ -272,7 +275,7 @@ static void ObjectToTransData(TransInfo *t, TransData *td, Object *ob) * done, as it doesn't work well. */ BKE_object_to_mat3(ob, obmtx); - copy_m3_m4(totmat, ob->object_to_world().ptr()); + copy_m3_m4(totmat, ob->object_to_world); /* If the object scale is zero on any axis, this might result in a zero matrix. * In this case, the transformation would not do anything, see: #50103. */ @@ -337,10 +340,8 @@ static void trans_object_base_deps_flag_finish(const TransInfo *t, } } -/** - * Sets flags in Bases to define whether they take part in transform. - * It deselects Bases, so we have to call the clear function always after. - */ +/* sets flags in Bases to define whether they take part in transform */ +/* it deselects Bases, so we have to call the clear function always after */ static void set_trans_object_base_flags(TransInfo *t) { Main *bmain = CTX_data_main(t->context); @@ -372,7 +373,7 @@ static void set_trans_object_base_flags(TransInfo *t) while (parsel != nullptr) { if (parsel->base_flag & BASE_SELECTED) { Base *parbase = BKE_view_layer_base_find(view_layer, parsel); - if (parbase != nullptr) { /* In rare cases this can fail. */ + if (parbase != nullptr) { /* in rare cases this can fail */ if (BASE_SELECTED_EDITABLE(v3d, parbase)) { break; } @@ -432,7 +433,7 @@ static int count_proportional_objects(TransInfo *t) LISTBASE_FOREACH (Base *, base, BKE_view_layer_object_bases_get(view_layer)) { if (BASE_SELECTED_EDITABLE(v3d, base) && BASE_SELECTABLE(v3d, base)) { Object *parent = base->object->parent; - /* Flag all parents. */ + /* flag all parents */ while (parent != nullptr) { parent->flag |= BA_TRANSFORM_PARENT; parent = parent->parent; @@ -441,7 +442,7 @@ static int count_proportional_objects(TransInfo *t) } /* Mark all children. */ LISTBASE_FOREACH (Base *, base, BKE_view_layer_object_bases_get(view_layer)) { - /* All base not already selected or marked that is editable. */ + /* all base not already selected or marked that is editable */ if ((base->object->flag & (BA_TRANSFORM_CHILD | BA_TRANSFORM_PARENT)) == 0 && (base->flag & BASE_SELECTED) == 0 && (BASE_EDITABLE(v3d, base) && BASE_SELECTABLE(v3d, base))) @@ -499,11 +500,11 @@ static void createTransObject(bContext *C, TransInfo *t) TransDataContainer *tc = TRANS_DATA_CONTAINER_FIRST_SINGLE(t); - /* Count. */ + /* count */ tc->data_len = CTX_DATA_COUNT(C, selected_bases); if (!tc->data_len) { - /* Clear here, main transform function escapes too. */ + /* clear here, main transform function escapes too */ clear_trans_object_base_flags(t); return; } @@ -538,7 +539,7 @@ static void createTransObject(bContext *C, TransInfo *t) td->flag |= TD_NO_LOC; } - /* Select linked objects, but skip them later. */ + /* select linked objects, but skip them later */ if (!BKE_id_is_editable(bmain, &ob->id)) { td->flag |= TD_SKIP; } @@ -577,8 +578,8 @@ static void createTransObject(bContext *C, TransInfo *t) LISTBASE_FOREACH (Base *, base, BKE_view_layer_object_bases_get(view_layer)) { Object *ob = base->object; - /* If base is not selected, not a parent of selection - * or not a child of selection and it is editable and selectable. */ + /* if base is not selected, not a parent of selection + * or not a child of selection and it is editable and selectable */ if ((ob->flag & (BA_TRANSFORM_CHILD | BA_TRANSFORM_PARENT)) == 0 && (base->flag & BASE_SELECTED) == 0 && BASE_EDITABLE(v3d, base) && BASE_SELECTABLE(v3d, base)) @@ -612,8 +613,8 @@ static void createTransObject(bContext *C, TransInfo *t) LISTBASE_FOREACH (Base *, base, BKE_view_layer_object_bases_get(view_layer)) { Object *ob = base->object; - /* If base is not selected, not a parent of selection - * or not a child of selection and it is editable and selectable. */ + /* if base is not selected, not a parent of selection + * or not a child of selection and it is editable and selectable */ if ((base->flag_legacy & BA_WAS_SEL) && (base->flag & BASE_SELECTED) == 0 && BASE_EDITABLE(v3d, base) && BASE_SELECTABLE(v3d, base)) { @@ -695,7 +696,7 @@ static void createTransObject(bContext *C, TransInfo *t) Object *ob = base->object; if (BASE_XFORM_INDIRECT(base) || BLI_gset_haskey(objects_in_transdata, ob)) { - /* Pass. */ + /* pass. */ } else if (ob->parent != nullptr) { Base *base_parent = BKE_view_layer_base_find(view_layer, ob->parent); @@ -844,11 +845,11 @@ static void recalcData_objects(TransInfo *t) continue; } - /* If animtimer is running, and the object already has animation data, + /* if animtimer is running, and the object already has animation data, * check if the auto-record feature means that we should record 'samples' - * (i.e. uneditable animation values). */ - - /* TODO: auto-keyframe calls need some setting to specify to add samples + * (i.e. uneditable animation values) + */ + /* TODO: autokeyframe calls need some setting to specify to add samples * (FPoints) instead of keyframes? */ if ((t->animtimer) && blender::animrig::is_autokey_on(t->scene)) { animrecord_check_state(t, &ob->id); @@ -857,8 +858,9 @@ static void recalcData_objects(TransInfo *t) motionpath_update |= motionpath_need_update_object(t->scene, ob); - /* Sets recalc flags fully, instead of flushing existing ones - * otherwise proxies don't function correctly. */ + /* sets recalc flags fully, instead of flushing existing ones + * otherwise proxies don't function correctly + */ DEG_id_tag_update(&ob->id, ID_RECALC_TRANSFORM); } } @@ -903,11 +905,11 @@ static void special_aftertrans_update__object(bContext *C, TransInfo *t) continue; } - /* Flag object caches as outdated. */ + /* flag object caches as outdated */ BKE_ptcache_ids_from_object(&pidlist, ob, t->scene, MAX_DUPLI_RECUR); LISTBASE_FOREACH (PTCacheID *, pid, &pidlist) { if (pid->type != PTCACHE_TYPE_PARTICLES) { - /* Particles don't need reset on geometry change. */ + /* particles don't need reset on geometry change */ pid->cache->flag |= PTCACHE_OUTDATED; } } diff --git a/source/blender/editors/transform/transform_convert_object_texspace.cc b/source/blender/editors/transform/transform_convert_object_texspace.cc index 5142e07efac..8c2c3e77ae9 100644 --- a/source/blender/editors/transform/transform_convert_object_texspace.cc +++ b/source/blender/editors/transform/transform_convert_object_texspace.cc @@ -11,9 +11,11 @@ #include "BLI_math_matrix.h" #include "BLI_math_vector.h" +#include "BKE_animsys.h" +#include "BKE_context.hh" #include "BKE_layer.hh" #include "BKE_object.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "DNA_mesh_types.h" @@ -68,8 +70,8 @@ static void createTransTexspace(bContext * /*C*/, TransInfo *t) td->flag = TD_SELECTED; td->ob = ob; - copy_m3_m4(td->mtx, ob->object_to_world().ptr()); - copy_m3_m4(td->axismtx, ob->object_to_world().ptr()); + copy_m3_m4(td->mtx, ob->object_to_world); + copy_m3_m4(td->axismtx, ob->object_to_world); normalize_m3(td->axismtx); pseudoinverse_m3_m3(td->smtx, td->mtx, PSEUDOINVERSE_EPSILON); diff --git a/source/blender/editors/transform/transform_convert_paintcurve.cc b/source/blender/editors/transform/transform_convert_paintcurve.cc index d35d4d7958c..fb846d687cb 100644 --- a/source/blender/editors/transform/transform_convert_paintcurve.cc +++ b/source/blender/editors/transform/transform_convert_paintcurve.cc @@ -13,13 +13,14 @@ #include "BLI_math_matrix.h" #include "BLI_math_vector.h" +#include "BKE_context.hh" #include "BKE_paint.hh" #include "transform.hh" #include "transform_convert.hh" struct TransDataPaintCurve { - PaintCurvePoint *pcp; /* Initial curve point. */ + PaintCurvePoint *pcp; /* initial curve point */ char id; }; diff --git a/source/blender/editors/transform/transform_convert_particle.cc b/source/blender/editors/transform/transform_convert_particle.cc index 53222c24562..6f8cc4319f4 100644 --- a/source/blender/editors/transform/transform_convert_particle.cc +++ b/source/blender/editors/transform/transform_convert_particle.cc @@ -14,8 +14,8 @@ #include "BLI_math_matrix.h" #include "BLI_math_vector.h" +#include "BKE_context.hh" #include "BKE_layer.hh" -#include "BKE_object_types.hh" #include "BKE_particle.h" #include "BKE_pointcache.h" @@ -98,7 +98,7 @@ static void createTransParticleVerts(bContext * /*C*/, TransInfo *t) unit_m4(mat); - invert_m4_m4(ob->runtime->world_to_object.ptr(), ob->object_to_world().ptr()); + invert_m4_m4(ob->world_to_object, ob->object_to_world); for (i = 0, point = edit->points; i < edit->totpoint; i++, point++) { TransData *head, *tail; @@ -137,7 +137,7 @@ static void createTransParticleVerts(bContext * /*C*/, TransInfo *t) unit_m3(td->mtx); unit_m3(td->smtx); - /* Don't allow moving roots. */ + /* don't allow moving roots */ if (k == 0 && pset->flag & PE_LOCK_FIRST && (!psys || !(psys->flag & PSYS_GLOBAL_HAIR))) { td->protectflag |= OB_LOCK_LOC; } @@ -147,7 +147,7 @@ static void createTransParticleVerts(bContext * /*C*/, TransInfo *t) if (t->mode == TFM_BAKE_TIME) { td->val = key->time; td->ival = *(key->time); - /* Abuse size and quat for min/max values. */ + /* abuse size and quat for min/max values */ td->flag |= TD_NO_EXT; if (k == 0) { tx->size = nullptr; @@ -199,8 +199,8 @@ static void flushTransParticles(TransInfo *t) int i, k; const bool is_prop_edit = (t->flag & T_PROP_EDIT) != 0; - /* We do transform in world space, so flush world space position - * back to particle local space (only for hair particles). */ + /* we do transform in world space, so flush world space position + * back to particle local space (only for hair particles) */ td = tc->data; for (i = 0, point = edit->points; i < edit->totpoint; i++, point++, td++) { if (!(point->flag & PEP_TRANSFORM)) { @@ -217,7 +217,7 @@ static void flushTransParticles(TransInfo *t) copy_v3_v3(co, key->world_co); mul_m4_v3(imat, co); - /* Optimization for proportional edit. */ + /* optimization for proportional edit */ if (!is_prop_edit || !compare_v3v3(key->co, co, 0.0001f)) { copy_v3_v3(key->co, co); point->flag |= PEP_EDIT_RECALC; diff --git a/source/blender/editors/transform/transform_convert_sculpt.cc b/source/blender/editors/transform/transform_convert_sculpt.cc index e6b3060071f..6094adbd249 100644 --- a/source/blender/editors/transform/transform_convert_sculpt.cc +++ b/source/blender/editors/transform/transform_convert_sculpt.cc @@ -16,7 +16,7 @@ #include "BKE_layer.hh" #include "BKE_lib_id.hh" #include "BKE_paint.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "ED_sculpt.hh" @@ -57,7 +57,7 @@ static void createTransSculpt(bContext *C, TransInfo *t) td->flag = TD_SELECTED; copy_v3_v3(td->center, ss->pivot_pos); - mul_m4_v3(ob->object_to_world().ptr(), td->center); + mul_m4_v3(ob->object_to_world, td->center); td->ob = ob; td->loc = ss->pivot_pos; @@ -68,16 +68,16 @@ static void createTransSculpt(bContext *C, TransInfo *t) } float obmat_inv[3][3]; - copy_m3_m4(obmat_inv, ob->object_to_world().ptr()); + copy_m3_m4(obmat_inv, ob->object_to_world); invert_m3(obmat_inv); td->ext->rot = nullptr; td->ext->rotAxis = nullptr; td->ext->rotAngle = nullptr; td->ext->quat = ss->pivot_rot; - copy_m4_m4(td->ext->obmat, ob->object_to_world().ptr()); + copy_m4_m4(td->ext->obmat, ob->object_to_world); copy_m3_m3(td->ext->l_smtx, obmat_inv); - copy_m3_m4(td->ext->r_mtx, ob->object_to_world().ptr()); + copy_m3_m4(td->ext->r_mtx, ob->object_to_world); copy_m3_m3(td->ext->r_smtx, obmat_inv); copy_qt_qt(td->ext->iquat, ss->pivot_rot); @@ -91,8 +91,8 @@ static void createTransSculpt(bContext *C, TransInfo *t) copy_v3_v3(td->ext->isize, ss->init_pivot_scale); copy_m3_m3(td->smtx, obmat_inv); - copy_m3_m4(td->mtx, ob->object_to_world().ptr()); - copy_m3_m4(td->axismtx, ob->object_to_world().ptr()); + copy_m3_m4(td->mtx, ob->object_to_world); + copy_m3_m4(td->axismtx, ob->object_to_world); BLI_assert(!(t->options & CTX_PAINT_CURVE)); ED_sculpt_init_transform(C, ob, t->mval, t->undo_name); diff --git a/source/blender/editors/transform/transform_convert_sequencer.cc b/source/blender/editors/transform/transform_convert_sequencer.cc index c0bd93d0e3f..6113600eb1e 100644 --- a/source/blender/editors/transform/transform_convert_sequencer.cc +++ b/source/blender/editors/transform/transform_convert_sequencer.cc @@ -15,17 +15,23 @@ #include "BLI_math_matrix.h" #include "BLI_math_vector.h" -#include "BKE_report.hh" +#include "BKE_context.hh" +#include "BKE_main.hh" +#include "BKE_report.h" #include "ED_markers.hh" +#include "ED_time_scrub_ui.hh" #include "SEQ_animation.hh" #include "SEQ_channels.hh" +#include "SEQ_edit.hh" +#include "SEQ_effects.hh" #include "SEQ_iterator.hh" #include "SEQ_relations.hh" #include "SEQ_sequencer.hh" #include "SEQ_time.hh" #include "SEQ_transform.hh" +#include "SEQ_utils.hh" #include "UI_view2d.hh" @@ -47,7 +53,7 @@ struct TransDataSeq { /** Use this so we can have transform data at the strips start, * but apply correctly to the start frame. */ int start_offset; - /** One of #SELECT, #SEQ_LEFTSEL and #SEQ_RIGHTSEL. */ + /** one of #SELECT, #SEQ_LEFTSEL and #SEQ_RIGHTSEL. */ short sel_flag; }; @@ -59,7 +65,7 @@ struct TransSeq { int selection_channel_range_min; int selection_channel_range_max; - /* Initial rect of the view2d, used for computing offset during edge panning. */ + /* Initial rect of the view2d, used for computing offset during edge panning */ rctf initial_v2d_cur; View2DEdgePanData edge_pan; @@ -82,7 +88,7 @@ static void SeqTransInfo(TransInfo *t, Sequence *seq, int *r_count, int *r_flag) Editing *ed = SEQ_editing_get(t->scene); ListBase *channels = SEQ_channels_displayed_get(ed); - /* For extend we need to do some tricks. */ + /* for extend we need to do some tricks */ if (t->mode == TFM_TIME_EXTEND) { /* *** Extend Transform *** */ @@ -95,15 +101,15 @@ static void SeqTransInfo(TransInfo *t, Sequence *seq, int *r_count, int *r_flag) *r_flag = 0; } else { - *r_count = 1; /* Unless its set to 0, extend will never set 2 handles at once. */ + *r_count = 1; /* unless its set to 0, extend will never set 2 handles at once */ *r_flag = (seq->flag | SELECT) & ~(SEQ_LEFTSEL | SEQ_RIGHTSEL); if (t->frame_side == 'R') { if (right <= cfra) { *r_count = *r_flag = 0; - } /* Ignore. */ + } /* ignore */ else if (left > cfra) { - } /* Keep the selection. */ + } /* keep the selection */ else { *r_flag |= SEQ_RIGHTSEL; } @@ -111,9 +117,9 @@ static void SeqTransInfo(TransInfo *t, Sequence *seq, int *r_count, int *r_flag) else { if (left >= cfra) { *r_count = *r_flag = 0; - } /* Ignore. */ + } /* ignore */ else if (right < cfra) { - } /* Keep the selection. */ + } /* keep the selection */ else { *r_flag |= SEQ_LEFTSEL; } @@ -126,7 +132,7 @@ static void SeqTransInfo(TransInfo *t, Sequence *seq, int *r_count, int *r_flag) /* *** Normal Transform *** */ - /* Count. */ + /* Count */ /* Non nested strips (reset selection and handles). */ if ((seq->flag & SELECT) == 0 || SEQ_transform_is_locked(channels, seq)) { @@ -136,11 +142,11 @@ static void SeqTransInfo(TransInfo *t, Sequence *seq, int *r_count, int *r_flag) else { if ((seq->flag & (SEQ_LEFTSEL | SEQ_RIGHTSEL)) == (SEQ_LEFTSEL | SEQ_RIGHTSEL)) { *r_flag = seq->flag; - *r_count = 2; /* We need 2 transdata's. */ + *r_count = 2; /* we need 2 transdata's */ } else { *r_flag = seq->flag; - *r_count = 1; /* Selected or with a handle selected. */ + *r_count = 1; /* selected or with a handle selected */ } } } @@ -151,7 +157,7 @@ static int SeqTransCount(TransInfo *t, ListBase *seqbase) int tot = 0, count, flag; LISTBASE_FOREACH (Sequence *, seq, seqbase) { - SeqTransInfo(t, seq, &count, &flag); /* Ignore the flag. */ + SeqTransInfo(t, seq, &count, &flag); /* ignore the flag */ tot += count; } @@ -172,10 +178,10 @@ static TransData *SeqToTransData(Scene *scene, case SELECT: /* Use seq_tx_get_final_left() and an offset here * so transform has the left hand location of the strip. - * `tdsq->start_offset` is used when flushing the tx data back. */ + * tdsq->start_offset is used when flushing the tx data back */ start_left = SEQ_time_left_handle_frame_get(scene, seq); td2d->loc[0] = start_left; - tdsq->start_offset = start_left - seq->start; /* Use to apply the original location. */ + tdsq->start_offset = start_left - seq->start; /* use to apply the original location */ break; case SEQ_LEFTSEL: start_left = SEQ_time_left_handle_frame_get(scene, seq); @@ -186,18 +192,18 @@ static TransData *SeqToTransData(Scene *scene, break; } - td2d->loc[1] = seq->machine; /* Channel - Y location. */ + td2d->loc[1] = seq->machine; /* channel - Y location */ td2d->loc[2] = 0.0f; td2d->loc2d = nullptr; tdsq->seq = seq; /* Use instead of seq->flag for nested strips and other - * cases where the selection may need to be modified. */ + * cases where the selection may need to be modified */ tdsq->flag = flag; tdsq->sel_flag = sel_flag; - td->extra = (void *)tdsq; /* Allow us to update the strip from here. */ + td->extra = (void *)tdsq; /* allow us to update the strip from here */ td->flag = 0; td->loc = td2d->loc; @@ -216,7 +222,7 @@ static TransData *SeqToTransData(Scene *scene, unit_m3(td->mtx); unit_m3(td->smtx); - /* Time Transform (extend). */ + /* Time Transform (extend) */ td->val = td2d->loc; td->ival = td2d->loc[0]; @@ -234,7 +240,7 @@ static int SeqToTransData_build( SeqTransInfo(t, seq, &count, &flag); - /* Use 'flag' which is derived from seq->flag but modified for special cases. */ + /* use 'flag' which is derived from seq->flag but modified for special cases */ if (flag & SELECT) { if (flag & (SEQ_LEFTSEL | SEQ_RIGHTSEL)) { if (flag & SEQ_LEFTSEL) { @@ -474,10 +480,10 @@ static void createTransSeqData(bContext * /*C*/, TransInfo *t) count = SeqTransCount(t, ed->seqbasep); - /* Allocate memory for data. */ + /* allocate memory for data */ tc->data_len = count; - /* Stop if trying to build list if nothing selected. */ + /* stop if trying to build list if nothing selected */ if (count == 0) { return; } @@ -503,7 +509,7 @@ static void createTransSeqData(bContext * /*C*/, TransInfo *t) UI_view2d_edge_pan_set_limits(&ts->edge_pan, -FLT_MAX, FLT_MAX, 1, MAXSEQ + 1); ts->initial_v2d_cur = t->region->v2d.cur; - /* Loop 2: build transdata array. */ + /* loop 2: build transdata array */ SeqToTransData_build(t, ed->seqbasep, td, td2d, tdsq); ts->selection_channel_range_min = MAXSEQ + 1; @@ -527,7 +533,7 @@ static void view2d_edge_pan_loc_compensate(TransInfo *t, float loc_in[2], float { TransSeq *ts = (TransSeq *)TRANS_DATA_CONTAINER_FIRST_SINGLE(t)->custom.type.data; - /* Initial and current view2D rects for additional transform due to view panning and zooming. */ + /* Initial and current view2D rects for additional transform due to view panning and zooming */ const rctf *rect_src = &ts->initial_v2d_cur; const rctf *rect_dst = &t->region->v2d.cur; @@ -536,7 +542,7 @@ static void view2d_edge_pan_loc_compensate(TransInfo *t, float loc_in[2], float UI_view2d_edge_pan_cancel(t->context, &ts->edge_pan); } else { - /* Edge panning functions expect window coordinates, mval is relative to region. */ + /* Edge panning functions expect window coordinates, mval is relative to region */ const int xy[2] = { t->region->winrct.xmin + int(t->mval[0]), t->region->winrct.ymin + int(t->mval[1]), @@ -552,7 +558,7 @@ static void view2d_edge_pan_loc_compensate(TransInfo *t, float loc_in[2], float static void flushTransSeq(TransInfo *t) { - /* Editing null check already done. */ + /* Editing null check already done */ ListBase *seqbasep = seqbase_active_get(t); int a, new_frame, offset; @@ -624,14 +630,14 @@ static void flushTransSeq(TransInfo *t) SEQ_offset_animdata(t->scene, seq, max_offset); } - /* Need to do the overlap check in a new loop otherwise adjacent strips - * will not be updated and we'll get false positives. */ + /* need to do the overlap check in a new loop otherwise adjacent strips + * will not be updated and we'll get false positives */ blender::VectorSet transformed_strips = seq_transform_collection_from_transdata(tc); SEQ_iterator_set_expand( t->scene, seqbase_active_get(t), transformed_strips, SEQ_query_strip_effect_chain); for (Sequence *seq : transformed_strips) { - /* Test overlap, displays red outline. */ + /* test overlap, displays red outline */ seq->flag &= ~SEQ_OVERLAP; if (SEQ_transform_test_overlap(scene, seqbasep, seq)) { seq->flag |= SEQ_OVERLAP; @@ -674,16 +680,16 @@ static void special_aftertrans_update__sequencer(bContext * /*C*/, TransInfo *t) if (t->state == TRANS_CANCEL) { return; } - /* #freeSeqData in `transform_conversions.cc` does this - * keep here so the else at the end won't run. */ + /* freeSeqData in transform_conversions.c does this + * keep here so the else at the end won't run... */ SpaceSeq *sseq = (SpaceSeq *)t->area->spacedata.first; /* Marker transform, not especially nice but we may want to move markers * at the same time as strips in the Video Sequencer. */ if (sseq->flag & SEQ_MARKER_TRANS) { - /* Can't use #TFM_TIME_EXTEND - * for some reason EXTEND is changed into TRANSLATE, so use frame_side instead. */ + /* can't use TFM_TIME_EXTEND + * for some reason EXTEND is changed into TRANSLATE, so use frame_side instead */ if (t->mode == TFM_SEQ_SLIDE) { if (t->frame_side == 'B') { diff --git a/source/blender/editors/transform/transform_convert_sequencer_image.cc b/source/blender/editors/transform/transform_convert_sequencer_image.cc index 71b5659fa18..05d38c5bcd7 100644 --- a/source/blender/editors/transform/transform_convert_sequencer_image.cc +++ b/source/blender/editors/transform/transform_convert_sequencer_image.cc @@ -11,20 +11,28 @@ #include "DNA_sequence_types.h" #include "DNA_space_types.h" +#include "BLI_listbase.h" #include "BLI_math_matrix.h" #include "BLI_math_rotation.h" #include "BLI_math_vector.h" -#include "BKE_report.hh" +#include "BKE_context.hh" +#include "BKE_report.h" #include "SEQ_channels.hh" #include "SEQ_iterator.hh" #include "SEQ_relations.hh" #include "SEQ_sequencer.hh" +#include "SEQ_time.hh" #include "SEQ_transform.hh" +#include "SEQ_utils.hh" + +#include "ED_keyframing.hh" #include "ANIM_keyframing.hh" +#include "UI_view2d.hh" + #include "RNA_access.hh" #include "RNA_prototypes.h" diff --git a/source/blender/editors/transform/transform_convert_sequencer_retiming.cc b/source/blender/editors/transform/transform_convert_sequencer_retiming.cc index c52408cf66f..0734e72fe79 100644 --- a/source/blender/editors/transform/transform_convert_sequencer_retiming.cc +++ b/source/blender/editors/transform/transform_convert_sequencer_retiming.cc @@ -9,15 +9,26 @@ #include "MEM_guardedalloc.h" #include "DNA_sequence_types.h" +#include "DNA_space_types.h" +#include "BLI_listbase.h" #include "BLI_math_matrix.h" #include "BLI_math_vector.h" #include "BKE_context.hh" +#include "BKE_report.h" #include "SEQ_relations.hh" #include "SEQ_retiming.hh" #include "SEQ_sequencer.hh" +#include "SEQ_time.hh" + +#include "ED_keyframing.hh" + +#include "UI_view2d.hh" + +#include "RNA_access.hh" +#include "RNA_prototypes.h" #include "transform.hh" #include "transform_convert.hh" diff --git a/source/blender/editors/transform/transform_convert_tracking.cc b/source/blender/editors/transform/transform_convert_tracking.cc index 782e064593b..63604118ba5 100644 --- a/source/blender/editors/transform/transform_convert_tracking.cc +++ b/source/blender/editors/transform/transform_convert_tracking.cc @@ -14,6 +14,7 @@ #include "BLI_math_vector.h" #include "BKE_context.hh" +#include "BKE_main.hh" #include "BKE_movieclip.h" #include "BKE_node_tree_update.hh" #include "BKE_tracking.h" @@ -29,7 +30,7 @@ struct TransDataTracking { int mode; int flag; - /* Tracks transformation from main window. */ + /* tracks transformation from main window */ int area; const float *relative, *loc; float soffset[2], srelative[2]; @@ -96,17 +97,17 @@ static void markerToTransDataInit(TransformInitContext *init_context, tdt->mode = transDataTracking_ModeTracks; if (anchor) { - td2d->loc[0] = rel[0] * aspect[0]; /* Hold original location. */ + td2d->loc[0] = rel[0] * aspect[0]; /* hold original location */ td2d->loc[1] = rel[1] * aspect[1]; tdt->loc = loc; - td2d->loc2d = loc; /* Current location. */ + td2d->loc2d = loc; /* current location */ } else { - td2d->loc[0] = loc[0] * aspect[0]; /* Hold original location. */ + td2d->loc[0] = loc[0] * aspect[0]; /* hold original location */ td2d->loc[1] = loc[1] * aspect[1]; - td2d->loc2d = loc; /* Current location. */ + td2d->loc2d = loc; /* current location */ } td2d->loc[2] = 0.0f; @@ -251,10 +252,10 @@ static void planeMarkerToTransDataInit(TransformInitContext *init_context, tdt->mode = transDataTracking_ModePlaneTracks; tdt->plane_track = plane_track; - td2d->loc[0] = corner[0] * aspect[0]; /* Hold original location. */ + td2d->loc[0] = corner[0] * aspect[0]; /* hold original location */ td2d->loc[1] = corner[1] * aspect[1]; - td2d->loc2d = corner; /* Current location. */ + td2d->loc2d = corner; /* current location */ td2d->loc[2] = 0.0f; td->flag = 0; @@ -461,7 +462,7 @@ static void flushTransTracking(TransInfo *t) TransDataContainer *tc = TRANS_DATA_CONTAINER_FIRST_SINGLE(t); - /* Flush to 2d vector from internally used 3d vector. */ + /* flush to 2d vector from internally used 3d vector */ for (td_index = 0, td = tc->data, td2d = tc->data_2d, diff --git a/source/blender/editors/transform/transform_convert_tracking_curves.cc b/source/blender/editors/transform/transform_convert_tracking_curves.cc index 54c20853b26..b2be1871e9b 100644 --- a/source/blender/editors/transform/transform_convert_tracking_curves.cc +++ b/source/blender/editors/transform/transform_convert_tracking_curves.cc @@ -13,6 +13,7 @@ #include "BLI_math_vector.h" #include "BKE_context.hh" +#include "BKE_main.hh" #include "BKE_movieclip.h" #include "BKE_node_tree_update.hh" #include "BKE_tracking.h" @@ -28,7 +29,7 @@ struct TransDataTrackingCurves { int flag; - /* Marker transformation from curves editor. */ + /* marker transformation from curves editor */ float *prev_pos; float scale; short coord; @@ -59,12 +60,12 @@ static void markerToTransCurveDataInit(TransData *td, tdt->prev_pos = prev_marker->pos; tdt->track = track; - /* Calculate values depending on marker's speed. */ + /* calculate values depending on marker's speed */ td2d->loc[0] = marker->framenr; td2d->loc[1] = (marker->pos[coord] - prev_marker->pos[coord]) * size / frames_delta; td2d->loc[2] = 0.0f; - td2d->loc2d = marker->pos; /* Current location. */ + td2d->loc2d = marker->pos; /* current location */ td->flag = 0; td->loc = td2d->loc; @@ -98,7 +99,7 @@ static void createTransTrackingCurvesData(bContext *C, TransInfo *t) TransDataContainer *tc = TRANS_DATA_CONTAINER_FIRST_SINGLE(t); - /* Count. */ + /* count */ tc->data_len = 0; if ((sc->flag & SC_SHOW_GRAPH_TRACKS_MOTION) == 0) { @@ -138,7 +139,7 @@ static void createTransTrackingCurvesData(bContext *C, TransInfo *t) tc->data_len * sizeof(TransDataTrackingCurves), "TransTracking TransDataTracking")); tc->custom.type.free_cb = nullptr; - /* Create actual data. */ + /* create actual data */ LISTBASE_FOREACH (MovieTrackingTrack *, track, &tracking_object->tracks) { if (TRACK_VIEW_SELECTED(sc, track) && (track->flag & TRACK_LOCKED) == 0) { for (int i = 1; i < track->markersnr; i++) { @@ -190,7 +191,7 @@ static void createTransTrackingCurves(bContext *C, TransInfo *t) return; } - /* Transformation was called from graph editor. */ + /* transformation was called from graph editor */ BLI_assert(CTX_wm_region(C)->regiontype == RGN_TYPE_PREVIEW); createTransTrackingCurvesData(C, t); } @@ -247,7 +248,7 @@ static void flushTransTrackingCurves(TransInfo *t) TransDataContainer *tc = TRANS_DATA_CONTAINER_FIRST_SINGLE(t); - /* Flush to 2d vector from internally used 3d vector. */ + /* flush to 2d vector from internally used 3d vector */ for (td_index = 0, td = tc->data, td2d = tc->data_2d, diff --git a/source/blender/editors/transform/transform_data.hh b/source/blender/editors/transform/transform_data.hh index 8da02c6f4ca..6218ec419f8 100644 --- a/source/blender/editors/transform/transform_data.hh +++ b/source/blender/editors/transform/transform_data.hh @@ -42,10 +42,10 @@ struct TransDataMirror { struct TransDataExtension { /** Initial object drot. */ float drot[3]; -#if 0 /* TODO: not yet implemented. */ - /* Initial object `drotAngle`. */ +#if 0 /* TODO: not yet implemented */ + /* Initial object drotAngle */ float drotAngle; - /* Initial object `drotAxis`. */ + /* Initial object drotAxis */ float drotAxis[3]; #endif /** Initial object delta quat. */ @@ -134,7 +134,7 @@ struct TransData { bConstraint *con; /** For objects, poses. 1 single allocation per #TransInfo! */ TransDataExtension *ext; - /** For curves, stores handle flags for modification/cancel. */ + /** for curves, stores handle flags for modification/cancel. */ TransDataCurveHandleFlags *hdata; /** If set, copy of Object or #bPoseChannel protection. */ short protectflag; @@ -147,7 +147,7 @@ enum { TD_SELECTED = 1 << 0, TD_USEQUAT = 1 << 1, /* TD_NOTCONNECTED = 1 << 2, */ - /** Used for scaling of #MetaElem.rad. */ + /** Used for scaling of #MetaElem.rad */ TD_SINGLESIZE = 1 << 3, /** Scale relative to individual element center. */ TD_INDIVIDUAL_SCALE = 1 << 4, @@ -161,7 +161,7 @@ enum { * if this is set #TransData.hdata needs freeing. */ TD_BEZTRIPLE = 1 << 8, - /** When this is set, don't apply translation changes to this element. */ + /** when this is set, don't apply translation changes to this element */ TD_NO_LOC = 1 << 9, /** For Graph Editor auto-snap, indicates that point should not undergo auto-snapping. */ TD_NOTIMESNAP = 1 << 10, diff --git a/source/blender/editors/transform/transform_draw_cursors.cc b/source/blender/editors/transform/transform_draw_cursors.cc index c9f6bf49745..86b9ed5fc33 100644 --- a/source/blender/editors/transform/transform_draw_cursors.cc +++ b/source/blender/editors/transform/transform_draw_cursors.cc @@ -17,6 +17,7 @@ #include "DNA_screen_types.h" #include "DNA_userdef_types.h" +#include "UI_interface.hh" #include "UI_resources.hh" #include "transform.hh" @@ -115,7 +116,7 @@ void transform_draw_cursor_draw(bContext * /*C*/, int x, int y, void *customdata GPU_line_width(DASH_WIDTH); immBindBuiltinProgram(GPU_SHADER_3D_LINE_DASHED_UNIFORM_COLOR); immUniform2f("viewport_size", viewport_size[2], viewport_size[3]); - immUniform1i("colors_len", 0); /* "simple" mode. */ + immUniform1i("colors_len", 0); /* "simple" mode */ immUniformThemeColor3(TH_VIEW_OVERLAY); immUniform1f("dash_width", DASH_LENGTH); immUniform1f("udash_factor", 0.5f); diff --git a/source/blender/editors/transform/transform_draw_cursors.hh b/source/blender/editors/transform/transform_draw_cursors.hh index 6c2c3b5f99f..06d7f1ff88a 100644 --- a/source/blender/editors/transform/transform_draw_cursors.hh +++ b/source/blender/editors/transform/transform_draw_cursors.hh @@ -8,7 +8,7 @@ #pragma once -/* Callbacks for #WM_paint_cursor_activate. */ +/* Callbacks for #WM_paint_cursor_activate */ /** * Poll callback for cursor drawing: diff --git a/source/blender/editors/transform/transform_generics.cc b/source/blender/editors/transform/transform_generics.cc index 6e12ff6f980..d63f91ed7da 100644 --- a/source/blender/editors/transform/transform_generics.cc +++ b/source/blender/editors/transform/transform_generics.cc @@ -18,10 +18,13 @@ #include "BLI_rand.h" #include "BLI_time.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "RNA_access.hh" +#include "GPU_immediate.h" +#include "GPU_matrix.h" + #include "BKE_context.hh" #include "BKE_layer.hh" #include "BKE_mask.h" @@ -40,6 +43,7 @@ #include "WM_api.hh" #include "WM_types.hh" +#include "UI_resources.hh" #include "UI_view2d.hh" #include "SEQ_sequencer.hh" @@ -47,6 +51,7 @@ #include "transform.hh" #include "transform_convert.hh" #include "transform_gizmo.hh" +#include "transform_mode.hh" #include "transform_orientations.hh" #include "transform_snap.hh" @@ -166,7 +171,7 @@ void initTransInfo(bContext *C, TransInfo *t, wmOperator *op, const wmEvent *eve t->data_container_len = 1; } - t->redraw = TREDRAW_HARD; /* Redraw first time. */ + t->redraw = TREDRAW_HARD; /* redraw first time */ float2 mval; if (event) { @@ -199,12 +204,12 @@ void initTransInfo(bContext *C, TransInfo *t, wmOperator *op, const wmEvent *eve t->orient_axis = 2; t->orient_axis_ortho = 1; - /* If there's an event, we're modal. */ + /* if there's an event, we're modal */ if (event) { t->flag |= T_MODAL; } - /* Crease needs edge flag. */ + /* Crease needs edge flag */ if (ELEM(t->mode, TFM_EDGE_CREASE, TFM_BWEIGHT)) { t->options |= CTX_EDGE_DATA; } @@ -219,21 +224,19 @@ void initTransInfo(bContext *C, TransInfo *t, wmOperator *op, const wmEvent *eve } } - /* GPencil editing context. */ + /* GPencil editing context */ if (GPENCIL_EDIT_MODE(gpd)) { t->options |= CTX_GPENCIL_STROKES; } - /* Grease Pencil editing context. */ - if (t->obedit_type == OB_GREASE_PENCIL && object_mode == OB_MODE_EDIT && - (area->spacetype == SPACE_VIEW3D)) - { + /* Grease Pencil editing context */ + if (t->obedit_type == OB_GREASE_PENCIL && object_mode == OB_MODE_EDIT) { t->options |= CTX_GPENCIL_STROKES; } - /* Assign the space type, some exceptions for running in different mode. */ + /* Assign the space type, some exceptions for running in different mode */ if (area == nullptr) { - /* Background mode. */ + /* background mode */ t->spacetype = SPACE_EMPTY; } else if (((region == nullptr) || (region->regiondata == nullptr)) && @@ -244,11 +247,11 @@ void initTransInfo(bContext *C, TransInfo *t, wmOperator *op, const wmEvent *eve t->spacetype = SPACE_EMPTY; } else { - /* Normal operation. */ + /* normal operation */ t->spacetype = area->spacetype; } - /* Handle #T_ALT_TRANSFORM initialization, we may use for different operators. */ + /* handle T_ALT_TRANSFORM initialization, we may use for different operators */ if (op) { const char *prop_id = nullptr; if (t->mode == TFM_SHRINKFATTEN) { @@ -276,7 +279,7 @@ void initTransInfo(bContext *C, TransInfo *t, wmOperator *op, const wmEvent *eve } } - /* Initialize UV transform from. */ + /* initialize UV transform from */ if (op && (prop = RNA_struct_find_property(op->ptr, "correct_uv"))) { if (RNA_property_is_set(op->ptr, prop)) { if (RNA_property_boolean_get(op->ptr, prop)) { @@ -296,7 +299,7 @@ void initTransInfo(bContext *C, TransInfo *t, wmOperator *op, const wmEvent *eve SpaceImage *sima = static_cast(area->spacedata.first); BKE_view_layer_synced_ensure(t->scene, t->view_layer); if (ED_space_image_show_uvedit(sima, BKE_view_layer_active_object_get(t->view_layer))) { - /* UV transform. */ + /* UV transform */ } else if (sima->mode == SI_MODE_MASK) { t->options |= CTX_MASK; @@ -307,7 +310,7 @@ void initTransInfo(bContext *C, TransInfo *t, wmOperator *op, const wmEvent *eve t->options |= CTX_PAINT_CURVE; } } - /* Image not in UV edit, nor in mask mode, can happen for some tools. */ + /* image not in uv edit, nor in mask mode, can happen for some tools */ } else if (t->spacetype == SPACE_CLIP) { SpaceClip *sclip = static_cast(area->spacedata.first); @@ -355,7 +358,7 @@ void initTransInfo(bContext *C, TransInfo *t, wmOperator *op, const wmEvent *eve if (op && (prop = RNA_struct_find_property(op->ptr, "value")) && RNA_property_is_set(op->ptr, prop)) { - float values[4] = {0}; /* In case value isn't length 4, avoid uninitialized memory. */ + float values[4] = {0}; /* in case value isn't length 4, avoid uninitialized memory. */ if (RNA_property_array_check(prop)) { RNA_property_float_get_array(op->ptr, prop, values); t_values_set_is_array = true; @@ -544,7 +547,7 @@ void initTransInfo(bContext *C, TransInfo *t, wmOperator *op, const wmEvent *eve if (ISMOUSE_BUTTON(t->launch_event) && ((U.flag & USER_RELEASECONFIRM) || (t->spacetype == SPACE_NODE))) { - /* Global "release confirm" on mouse bindings. */ + /* Global "release confirm" on mouse bindings */ t->flag |= T_RELEASE_CONFIRM; } } @@ -557,7 +560,7 @@ void initTransInfo(bContext *C, TransInfo *t, wmOperator *op, const wmEvent *eve } } else if ((t->spacetype == SPACE_VIEW3D) && (t->obedit_type == OB_MESH)) { - /* Pass. */ + /* pass */ } else { /* Avoid mirroring for unsupported contexts. */ @@ -579,7 +582,7 @@ void initTransInfo(bContext *C, TransInfo *t, wmOperator *op, const wmEvent *eve } } else { - /* Use settings from scene only if modal. */ + /* use settings from scene only if modal */ if (t->flag & T_MODAL) { if ((t->options & CTX_NO_PET) == 0) { bool use_prop_edit = false; @@ -621,7 +624,7 @@ void initTransInfo(bContext *C, TransInfo *t, wmOperator *op, const wmEvent *eve t->prop_size = ts->proportional_size; } - /* TRANSFORM_FIX_ME rna restrictions. */ + /* TRANSFORM_FIX_ME rna restrictions */ if (t->prop_size <= 0.00001f) { printf("Proportional size (%f) under 0.00001, resetting to 1!\n", t->prop_size); t->prop_size = 1.0f; @@ -636,7 +639,7 @@ void initTransInfo(bContext *C, TransInfo *t, wmOperator *op, const wmEvent *eve t->prop_mode = ts->prop_mode; } } - else { /* Add not pet option to context when not available. */ + else { /* add not pet option to context when not available */ t->options |= CTX_NO_PET; } @@ -760,16 +763,16 @@ void postTrans(bContext *C, TransInfo *t) WM_cursor_modal_restore(CTX_wm_window(C)); } - /* Free all custom-data. */ + /* Free all custom-data */ freeTransCustomDataContainer(t, nullptr, &t->custom); FOREACH_TRANS_DATA_CONTAINER (t, tc) { freeTransCustomDataContainer(t, tc, &tc->custom); } - /* #postTrans can be called when nothing is selected, so data is nullptr already. */ + /* postTrans can be called when nothing is selected, so data is nullptr already */ if (t->data_len_all != 0) { FOREACH_TRANS_DATA_CONTAINER (t, tc) { - /* Free data malloced per trans-data. */ + /* free data malloced per trans-data */ if (ELEM(t->obedit_type, OB_CURVES_LEGACY, OB_SURF, OB_GPENCIL_LEGACY) || (t->spacetype == SPACE_GRAPH)) { @@ -795,7 +798,7 @@ void postTrans(bContext *C, TransInfo *t) if (t->spacetype == SPACE_IMAGE) { if (t->options & (CTX_MASK | CTX_PAINT_CURVE)) { - /* Pass. */ + /* pass */ } else { SpaceImage *sima = static_cast(t->area->spacedata.first); @@ -866,7 +869,7 @@ static void restoreElement(TransData *td) if (td->ext->rotAxis) { copy_v3_v3(td->ext->rotAxis, td->ext->irotAxis); } - /* XXX, `drotAngle` & `drotAxis` not used yet. */ + /* XXX, drotAngle & drotAxis not used yet */ if (td->ext->size) { copy_v3_v3(td->ext->size, td->ext->isize); } @@ -939,7 +942,7 @@ void calculateCenterCursor(TransInfo *t, float r_center[3]) const float *cursor = t->scene->cursor.location; copy_v3_v3(r_center, cursor); - /* If edit or pose mode, move cursor in local space. */ + /* If edit or pose mode, move cursor in local space */ if (t->options & CTX_PAINT_CURVE) { if (ED_view3d_project_float_global(t->region, cursor, r_center, V3D_PROJ_TEST_NOP) != V3D_PROJ_RET_OK) @@ -1007,7 +1010,7 @@ void calculateCenterCursorGraph2D(TransInfo *t, float r_center[2]) SpaceGraph *sipo = (SpaceGraph *)t->area->spacedata.first; Scene *scene = t->scene; - /* Cursor is combination of current frame, and graph-editor cursor value. */ + /* cursor is combination of current frame, and graph-editor cursor value */ if (sipo->mode == SIPO_MODE_DRIVERS) { r_center[0] = sipo->cursorTime; r_center[1] = sipo->cursorVal; @@ -1096,7 +1099,7 @@ bool calculateCenterActive(TransInfo *t, bool select_only, float r_center[3]) } if (tc->obedit) { if (ED_object_calc_active_center_for_editmode(tc->obedit, select_only, r_center)) { - mul_m4_v3(tc->obedit->object_to_world().ptr(), r_center); + mul_m4_v3(tc->obedit->object_to_world, r_center); return true; } } @@ -1104,7 +1107,7 @@ bool calculateCenterActive(TransInfo *t, bool select_only, float r_center[3]) BKE_view_layer_synced_ensure(t->scene, t->view_layer); Object *ob = BKE_view_layer_active_object_get(t->view_layer); if (ED_object_calc_active_center_for_posemode(ob, select_only, r_center)) { - mul_m4_v3(ob->object_to_world().ptr(), r_center); + mul_m4_v3(ob->object_to_world, r_center); return true; } } @@ -1117,11 +1120,11 @@ bool calculateCenterActive(TransInfo *t, bool select_only, float r_center[3]) return true; } else { - /* Object mode. */ + /* object mode */ BKE_view_layer_synced_ensure(t->scene, t->view_layer); Base *base = BKE_view_layer_active_base_get(t->view_layer); if (base && ((!select_only) || ((base->flag & BASE_SELECTED) != 0))) { - copy_v3_v3(r_center, base->object->object_to_world().location()); + copy_v3_v3(r_center, base->object->object_to_world[3]); return true; } } @@ -1150,15 +1153,15 @@ static void calculateCenter_FromAround(TransInfo *t, int around, float r_center[ } break; case V3D_AROUND_LOCAL_ORIGINS: - /* Individual element center uses median center for helpline and such. */ + /* Individual element center uses median center for helpline and such */ calculateCenterMedian(t, r_center); break; case V3D_AROUND_ACTIVE: { if (calculateCenterActive(t, false, r_center)) { - /* Pass. */ + /* pass */ } else { - /* Fallback. */ + /* fallback */ calculateCenterMedian(t, r_center); } break; @@ -1168,14 +1171,14 @@ static void calculateCenter_FromAround(TransInfo *t, int around, float r_center[ static void calculateZfac(TransInfo *t) { - /* #ED_view3d_calc_zfac() defines a factor for perspective depth correction, - * used in #ED_view3d_win_to_delta(). */ + /* ED_view3d_calc_zfac() defines a factor for perspective depth correction, + * used in ED_view3d_win_to_delta() */ - /* `zfac` is only used #convertViewVec only in cases operator was invoked in #RGN_TYPE_WINDOW + /* zfac is only used convertViewVec only in cases operator was invoked in RGN_TYPE_WINDOW * and never used in other cases. * - * We need special case here as well, since #ED_view3d_calc_zfac will crash when called - * for a region different from #RGN_TYPE_WINDOW. + * We need special case here as well, since ED_view3d_calc_zfac will crash when called + * for a region different from RGN_TYPE_WINDOW. */ if ((t->spacetype == SPACE_VIEW3D) && (t->region->regiontype == RGN_TYPE_WINDOW)) { t->zfac = ED_view3d_calc_zfac(static_cast(t->region->regiondata), @@ -1209,11 +1212,11 @@ void calculateCenter(TransInfo *t) if (t->options & CTX_CAMERA) { float axis[3]; - /* `persinv` is nasty, use `viewinv` instead, always right. */ + /* persinv is nasty, use viewinv instead, always right */ copy_v3_v3(axis, t->viewinv[2]); normalize_v3(axis); - /* 6.0 = 6 grid units. */ + /* 6.0 = 6 grid units */ axis[0] = t->center_global[0] - 6.0f * axis[0]; axis[1] = t->center_global[1] - 6.0f * axis[1]; axis[2] = t->center_global[2] - 6.0f * axis[2]; @@ -1289,7 +1292,7 @@ void calculatePropRatio(TransInfo *t) restoreElement(td); } else { - /* Use `rdist` for falloff calculations, it is the real distance. */ + /* Use rdist for falloff calculations, it is the real distance */ if (connected) { dist = (t->prop_size - td->dist) / t->prop_size; } @@ -1328,7 +1331,7 @@ void calculatePropRatio(TransInfo *t) case PROP_RANDOM: if (t->rng == nullptr) { /* Lazy initialization. */ - uint rng_seed = uint(BLI_time_now_seconds_i() & UINT_MAX); + uint rng_seed = uint(BLI_check_seconds_timer_i() & UINT_MAX); t->rng = BLI_rng_new(rng_seed); } td->factor = BLI_rng_get_float(t->rng) * dist; @@ -1394,13 +1397,13 @@ void transform_data_ext_rotate(TransData *td, float mat[3][3], bool use_drot) float fmat[3][3]; float obmat[3][3]; - float dmat[3][3]; /* Delta rotation. */ + float dmat[3][3]; /* delta rotation */ float dmat_inv[3][3]; mul_m3_m3m3(totmat, mat, td->mtx); mul_m3_m3m3(smat, td->smtx, mat); - /* Logic from #BKE_object_rot_to_mat3. */ + /* logic from BKE_object_rot_to_mat3 */ if (use_drot) { if (td->ext->rotOrder > 0) { eulO_to_mat3(dmat, td->ext->drot, td->ext->rotOrder); @@ -1430,7 +1433,7 @@ void transform_data_ext_rotate(TransData *td, float mat[3][3], bool use_drot) mul_m3_m3m3(obmat, dmat, obmat); } - /* `mat = transform`, `obmat = object rotation`. */ + /* mat = transform, obmat = object rotation */ mul_m3_m3m3(fmat, smat, obmat); if (use_drot) { @@ -1439,7 +1442,7 @@ void transform_data_ext_rotate(TransData *td, float mat[3][3], bool use_drot) mat3_to_quat(quat, fmat); - /* Apply. */ + /* apply */ copy_qt_qt(td->ext->quat, quat); } else if (td->ext->rotOrder == ROT_MODE_AXISANGLE) { @@ -1451,7 +1454,7 @@ void transform_data_ext_rotate(TransData *td, float mat[3][3], bool use_drot) mul_m3_m3m3(obmat, dmat, obmat); } - /* `mat = transform`, `obmat = object rotation`. */ + /* mat = transform, obmat = object rotation */ mul_m3_m3m3(fmat, smat, obmat); if (use_drot) { @@ -1460,7 +1463,7 @@ void transform_data_ext_rotate(TransData *td, float mat[3][3], bool use_drot) mat3_to_axis_angle(axis, &angle, fmat); - /* Apply. */ + /* apply */ copy_v3_v3(td->ext->rotAxis, axis); *td->ext->rotAngle = angle; } @@ -1473,7 +1476,7 @@ void transform_data_ext_rotate(TransData *td, float mat[3][3], bool use_drot) mul_m3_m3m3(obmat, dmat, obmat); } - /* `mat = transform`, `obmat = object rotation`. */ + /* mat = transform, obmat = object rotation */ mul_m3_m3m3(fmat, smat, obmat); if (use_drot) { @@ -1482,7 +1485,7 @@ void transform_data_ext_rotate(TransData *td, float mat[3][3], bool use_drot) mat3_to_compatible_eulO(eul, td->ext->rot, td->ext->rotOrder, fmat); - /* Apply. */ + /* apply */ copy_v3_v3(td->ext->rot, eul); } } diff --git a/source/blender/editors/transform/transform_gizmo_2d.cc b/source/blender/editors/transform/transform_gizmo_2d.cc index 2f0851a1559..50937a61779 100644 --- a/source/blender/editors/transform/transform_gizmo_2d.cc +++ b/source/blender/editors/transform/transform_gizmo_2d.cc @@ -24,7 +24,7 @@ #include "DNA_view3d_types.h" #include "BKE_context.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_layer.hh" #include "RNA_access.hh" @@ -45,6 +45,7 @@ #include "SEQ_channels.hh" #include "SEQ_iterator.hh" #include "SEQ_sequencer.hh" +#include "SEQ_time.hh" #include "SEQ_transform.hh" #include "transform.hh" @@ -150,7 +151,7 @@ static void gizmo2d_pivot_point_message_subscribe(wmGizmoGroup *gzgroup, * * \{ */ -/* Axes as index. */ +/* axes as index */ enum { MAN2D_AXIS_TRANS_X = 0, MAN2D_AXIS_TRANS_Y, @@ -162,7 +163,7 @@ struct GizmoGroup2D { wmGizmo *translate_xy[3]; wmGizmo *cage; - /* Current origin in view space, used to update widget origin for possible view changes. */ + /* Current origin in view space, used to update widget origin for possible view changes */ float origin[2]; float min[2]; float max[2]; @@ -441,14 +442,14 @@ static void gizmo2d_xform_setup(const bContext * /*C*/, wmGizmoGroup *gzgroup) for (int i = 0; i < ARRAY_SIZE(ggd->translate_xy); i++) { wmGizmo *gz = ggd->translate_xy[i]; - /* Custom handler! */ + /* custom handler! */ WM_gizmo_set_fn_custom_modal(gz, gizmo2d_modal); if (i < 2) { float color[4], color_hi[4]; gizmo2d_get_axis_color(i, color, color_hi); - /* Set up widget data. */ + /* set up widget data */ RNA_float_set(gz->ptr, "length", 0.8f); float axis[3] = {0.0f}; axis[i] = 1.0f; @@ -502,7 +503,7 @@ static void gizmo2d_xform_setup(const bContext * /*C*/, wmGizmoGroup *gzgroup) wmOperatorType *ot_rotate = WM_operatortype_find("TRANSFORM_OT_rotate", true); PointerRNA *ptr; - /* Assign operator. */ + /* assign operator */ ptr = WM_gizmo_operator_set(ggd->cage, 0, ot_translate, nullptr); RNA_boolean_set(ptr, "release_confirm", true); @@ -849,14 +850,14 @@ static void gizmo2d_resize_setup(const bContext * /*C*/, wmGizmoGroup *gzgroup) for (int i = 0; i < ARRAY_SIZE(ggd->gizmo_xy); i++) { wmGizmo *gz = ggd->gizmo_xy[i]; - /* Custom handler! */ + /* custom handler! */ WM_gizmo_set_fn_custom_modal(gz, gizmo2d_modal); if (i < 2) { float color[4], color_hi[4]; gizmo2d_get_axis_color(i, color, color_hi); - /* Set up widget data. */ + /* set up widget data */ RNA_float_set(gz->ptr, "length", 1.0f); RNA_enum_set(gz->ptr, "draw_style", ED_GIZMO_ARROW_STYLE_BOX); @@ -997,7 +998,7 @@ static void gizmo2d_rotate_setup(const bContext * /*C*/, wmGizmoGroup *gzgroup) { wmGizmo *gz = ggd->gizmo; - /* Custom handler! */ + /* custom handler! */ WM_gizmo_set_fn_custom_modal(gz, gizmo2d_modal); WM_gizmo_set_scale(gz, 1.2f); diff --git a/source/blender/editors/transform/transform_gizmo_3d.cc b/source/blender/editors/transform/transform_gizmo_3d.cc index 2f6ba0df29b..2b2180c1b92 100644 --- a/source/blender/editors/transform/transform_gizmo_3d.cc +++ b/source/blender/editors/transform/transform_gizmo_3d.cc @@ -25,15 +25,14 @@ #include "BKE_crazyspace.hh" #include "BKE_curve.hh" #include "BKE_editmesh.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_gpencil_legacy.h" #include "BKE_grease_pencil.hh" #include "BKE_layer.hh" #include "BKE_object.hh" -#include "BKE_object_types.hh" #include "BKE_paint.hh" #include "BKE_pointcache.h" -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "WM_api.hh" #include "WM_message.hh" @@ -55,7 +54,7 @@ #include "ANIM_bone_collections.hh" -/* Local module include. */ +/* local module include */ #include "transform.hh" #include "transform_convert.hh" #include "transform_gizmo.hh" @@ -71,7 +70,7 @@ static void gizmogroup_refresh_from_matrix(wmGizmoGroup *gzgroup, const float scale[3], const bool ignore_hidden); -/* Return codes for select, and drawing flags. */ +/* return codes for select, and drawing flags */ #define MAN_TRANS_X (1 << 0) #define MAN_TRANS_Y (1 << 1) @@ -88,18 +87,18 @@ static void gizmogroup_refresh_from_matrix(wmGizmoGroup *gzgroup, #define MAN_SCALE_Z (1 << 10) #define MAN_SCALE_C (MAN_SCALE_X | MAN_SCALE_Y | MAN_SCALE_Z) -/* Threshold for testing view aligned gizmo axis. */ +/* threshold for testing view aligned gizmo axis */ static struct { float min, max; } g_tw_axis_range[2] = { - /* Regular range. */ + /* Regular range */ {0.02f, 0.1f}, /* Use a different range because we flip the dot product, * also the view aligned planes are harder to see so hiding early is preferred. */ {0.175f, 0.25f}, }; -/* Axes as index. */ +/* axes as index */ enum { MAN_AXIS_TRANS_X = 0, MAN_AXIS_TRANS_Y, @@ -116,7 +115,7 @@ enum { MAN_AXIS_ROT_Y, MAN_AXIS_ROT_Z, MAN_AXIS_ROT_C, - MAN_AXIS_ROT_T, /* Trackball rotation. */ + MAN_AXIS_ROT_T, /* trackball rotation */ #define MAN_AXIS_RANGE_ROT_START MAN_AXIS_ROT_X #define MAN_AXIS_RANGE_ROT_END (MAN_AXIS_ROT_T + 1) @@ -133,7 +132,7 @@ enum { MAN_AXIS_LAST = MAN_AXIS_SCALE_ZX + 1, }; -/* Axis types. */ +/* axis types */ enum { MAN_AXES_ALL = 0, MAN_AXES_TRANSLATE, @@ -165,7 +164,7 @@ struct GizmoGroup { /** \name Utilities * \{ */ -/* Loop over axes. */ +/* loop over axes */ #define MAN_ITER_AXES_BEGIN(axis, axis_idx) \ { \ wmGizmo *axis; \ @@ -247,7 +246,7 @@ static bool gizmo_is_axis_visible(const RegionView3D *rv3d, if ((axis_idx >= MAN_AXIS_RANGE_ROT_START && axis_idx < MAN_AXIS_RANGE_ROT_END) == 0) { bool is_plane = false; const uint aidx_norm = gizmo_orientation_axis(axis_idx, &is_plane); - /* Don't draw axis perpendicular to the view. */ + /* don't draw axis perpendicular to the view */ if (aidx_norm < 3) { float idot_axis = idot[aidx_norm]; if (is_plane) { @@ -322,14 +321,14 @@ static void gizmo_get_axis_color(const int axis_idx, float r_col[4], float r_col_hi[4]) { - /* Alpha values for normal/highlighted states. */ + /* alpha values for normal/highlighted states */ const float alpha = 0.6f; const float alpha_hi = 1.0f; float alpha_fac; if (axis_idx >= MAN_AXIS_RANGE_ROT_START && axis_idx < MAN_AXIS_RANGE_ROT_END) { /* Never fade rotation rings. */ - /* Trackball rotation axis is a special case, we only draw a slight overlay. */ + /* trackball rotation axis is a special case, we only draw a slight overlay */ alpha_fac = (axis_idx == MAN_AXIS_ROT_T) ? 0.05f : 1.0f; } else { @@ -439,9 +438,7 @@ static void reset_tw_center(TransformBounds *tbounds) } } -/** - * Transform widget center calc helper for below. - */ +/* transform widget center calc helper for below */ static void calc_tw_center(TransformBounds *tbounds, const float co[3]) { minmax_v3v3_v3(tbounds->min, tbounds->max, co); @@ -552,15 +549,15 @@ static int gizmo_3d_foreach_selected(const bContext *C, float diff_mat[4][4]; const bool use_mat_local = true; LISTBASE_FOREACH (bGPDlayer *, gpl, &gpd->layers) { - /* Only editable and visible layers are considered. */ + /* only editable and visible layers are considered */ if (BKE_gpencil_layer_is_editable(gpl) && (gpl->actframe != nullptr)) { - /* Calculate difference matrix. */ + /* calculate difference matrix */ BKE_gpencil_layer_transform_matrix_get(depsgraph, ob, gpl, diff_mat); LISTBASE_FOREACH (bGPDstroke *, gps, &gpl->actframe->strokes) { - /* Skip strokes that are invalid for current view. */ + /* skip strokes that are invalid for current view */ if (ED_gpencil_stroke_can_use(C, gps) == false) { continue; } @@ -587,12 +584,12 @@ static int gizmo_3d_foreach_selected(const bContext *C, } } else { - /* We're only interested in selected points here... */ + /* we're only interested in selected points here... */ if (gps->flag & GP_STROKE_SELECT) { bGPDspoint *pt; int i; - /* Change selection status of all points, then make the stroke match. */ + /* Change selection status of all points, then make the stroke match */ for (i = 0, pt = gps->points; i < gps->totpoints; i++, pt++) { if (pt->flag & GP_SPOINT_SELECT) { run_coord_with_matrix(&pt->x, use_mat_local, diff_mat); @@ -609,7 +606,7 @@ static int gizmo_3d_foreach_selected(const bContext *C, #define FOREACH_EDIT_OBJECT_BEGIN(ob_iter, use_mat_local) \ { \ - invert_m4_m4(obedit->runtime->world_to_object.ptr(), obedit->object_to_world().ptr()); \ + invert_m4_m4(obedit->world_to_object, obedit->object_to_world); \ Vector objects = BKE_view_layer_array_from_objects_in_edit_mode( \ scene, view_layer, CTX_wm_view3d(C)); \ for (Object * ob_iter : objects) { \ @@ -635,8 +632,7 @@ static int gizmo_3d_foreach_selected(const bContext *C, float mat_local[4][4]; if (use_mat_local) { - mul_m4_m4m4( - mat_local, obedit->world_to_object().ptr(), ob_iter->object_to_world().ptr()); + mul_m4_m4m4(mat_local, obedit->world_to_object, ob_iter->object_to_world); } BM_ITER_MESH (eve, &iter, bm, BM_VERTS_OF_MESH) { @@ -649,15 +645,14 @@ static int gizmo_3d_foreach_selected(const bContext *C, } } FOREACH_EDIT_OBJECT_END(); - } /* End editmesh. */ + } /* end editmesh */ else if (obedit->type == OB_ARMATURE) { FOREACH_EDIT_OBJECT_BEGIN (ob_iter, use_mat_local) { bArmature *arm = static_cast(ob_iter->data); float mat_local[4][4]; if (use_mat_local) { - mul_m4_m4m4( - mat_local, obedit->world_to_object().ptr(), ob_iter->object_to_world().ptr()); + mul_m4_m4m4(mat_local, obedit->world_to_object, ob_iter->object_to_world); } LISTBASE_FOREACH (EditBone *, ebo, arm->edbo) { if (EBONE_VISIBLE(arm, ebo)) { @@ -666,7 +661,7 @@ static int gizmo_3d_foreach_selected(const bContext *C, totsel++; } if ((ebo->flag & BONE_ROOTSEL) && - /* Don't include same point multiple times. */ + /* don't include same point multiple times */ ((ebo->flag & BONE_CONNECTED) && (ebo->parent != nullptr) && (ebo->parent->flag & BONE_TIPSEL) && EBONE_VISIBLE(arm, ebo->parent)) == 0) { @@ -696,8 +691,7 @@ static int gizmo_3d_foreach_selected(const bContext *C, float mat_local[4][4]; if (use_mat_local) { - mul_m4_m4m4( - mat_local, obedit->world_to_object().ptr(), ob_iter->object_to_world().ptr()); + mul_m4_m4m4(mat_local, obedit->world_to_object, ob_iter->object_to_world); } Nurb *nu = static_cast(nurbs->first); @@ -706,9 +700,9 @@ static int gizmo_3d_foreach_selected(const bContext *C, bezt = nu->bezt; a = nu->pntsu; while (a--) { - /* Exceptions: - * - If handles are hidden then only check the center points. - * - If the center knot is selected then only use this as the center point. + /* exceptions + * if handles are hidden then only check the center points. + * If the center knot is selected then only use this as the center point. */ if (v3d->overlay.handle_display == CURVE_HANDLE_NONE) { if (bezt->f2 & SELECT) { @@ -757,8 +751,7 @@ static int gizmo_3d_foreach_selected(const bContext *C, float mat_local[4][4]; if (use_mat_local) { - mul_m4_m4m4( - mat_local, obedit->world_to_object().ptr(), ob_iter->object_to_world().ptr()); + mul_m4_m4m4(mat_local, obedit->world_to_object, ob_iter->object_to_world); } LISTBASE_FOREACH (MetaElem *, ml, mb->editelems) { @@ -778,8 +771,7 @@ static int gizmo_3d_foreach_selected(const bContext *C, float mat_local[4][4]; if (use_mat_local) { - mul_m4_m4m4( - mat_local, obedit->world_to_object().ptr(), ob_iter->object_to_world().ptr()); + mul_m4_m4m4(mat_local, obedit->world_to_object, ob_iter->object_to_world); } while (a--) { @@ -801,7 +793,7 @@ static int gizmo_3d_foreach_selected(const bContext *C, float4x4 mat_local; if (use_mat_local) { - mat_local = obedit->world_to_object() * ob_iter->object_to_world(); + mat_local = float4x4(obedit->world_to_object) * float4x4(ob_iter->object_to_world); } IndexMaskMemory memory; @@ -820,10 +812,10 @@ static int gizmo_3d_foreach_selected(const bContext *C, float4x4 mat_local; if (use_mat_local) { - mat_local = obedit->world_to_object() * ob_iter->object_to_world(); + mat_local = float4x4(obedit->world_to_object) * float4x4(ob_iter->object_to_world); } - const Vector drawings = + const Array drawings = ed::greasepencil::retrieve_editable_drawings(*scene, grease_pencil); threading::parallel_for_each( drawings, [&](const ed::greasepencil::MutableDrawingInfo &info) { @@ -850,20 +842,20 @@ static int gizmo_3d_foreach_selected(const bContext *C, #undef FOREACH_EDIT_OBJECT_END } else if (ob && (ob->mode & OB_MODE_POSE)) { - invert_m4_m4(ob->runtime->world_to_object.ptr(), ob->object_to_world().ptr()); + invert_m4_m4(ob->world_to_object, ob->object_to_world); Vector objects = BKE_object_pose_array_get(scene, view_layer, v3d); for (Object *ob_iter : objects) { const bool use_mat_local = (ob_iter != ob); - /* Mislead counting bones... bah. We don't know the gizmo mode, could be mixed. */ + /* mislead counting bones... bah. We don't know the gizmo mode, could be mixed */ const int mode = TFM_ROTATION; transform_convert_pose_transflags_update(ob_iter, mode, V3D_AROUND_CENTER_BOUNDS); float mat_local[4][4]; if (use_mat_local) { - mul_m4_m4m4(mat_local, ob->world_to_object().ptr(), ob_iter->object_to_world().ptr()); + mul_m4_m4m4(mat_local, ob->world_to_object, ob_iter->object_to_world); } /* Use channels to get stats. */ @@ -887,7 +879,7 @@ static int gizmo_3d_foreach_selected(const bContext *C, else if (ob && (ob->mode & OB_MODE_ALL_PAINT)) { if (ob->mode & OB_MODE_SCULPT) { totsel = 1; - run_coord_with_matrix(ob->sculpt->pivot_pos, false, ob->object_to_world().ptr()); + run_coord_with_matrix(ob->sculpt->pivot_pos, false, ob->object_to_world); } } else if (ob && ob->mode & OB_MODE_PARTICLE_EDIT) { @@ -914,7 +906,7 @@ static int gizmo_3d_foreach_selected(const bContext *C, } else { - /* We need the one selected object, if its not active. */ + /* we need the one selected object, if its not active */ BKE_view_layer_synced_ensure(scene, view_layer); { Base *base = BKE_view_layer_active_base_get(view_layer); @@ -942,12 +934,12 @@ static int gizmo_3d_foreach_selected(const bContext *C, } if (use_only_center || !bb) { - user_fn(base->object->object_to_world().location()); + user_fn(base->object->object_to_world[3]); } else { for (uint j = 0; j < 8; j++) { float co[3]; - mul_v3_m4v3(co, base->object->object_to_world().ptr(), bb->vec[j]); + mul_v3_m4v3(co, base->object->object_to_world, bb->vec[j]); user_fn(co); } } @@ -967,7 +959,7 @@ static int gizmo_3d_foreach_selected(const bContext *C, } if (r_mat && ob) { - *r_mat = ob->object_to_world().ptr(); + *r_mat = ob->object_to_world; } return totsel; @@ -995,7 +987,7 @@ int ED_transform_calc_gizmo_stats(const bContext *C, tbounds->use_matrix_space = false; unit_m3(tbounds->axis); - /* Global, local or normal orientation? + /* global, local or normal orientation? * if we could check 'totsel' now, this should be skipped with no selection. */ if (ob) { float mat[3][3]; @@ -1007,21 +999,21 @@ int ED_transform_calc_gizmo_stats(const bContext *C, reset_tw_center(tbounds); if (rv3d) { - /* Transform widget centroid/center. */ + /* transform widget centroid/center */ copy_m4_m3(rv3d->twmat, tbounds->axis); rv3d->twdrawflag = short(0xFFFF); } if (params->use_local_axis && (ob && ob->mode & (OB_MODE_EDIT | OB_MODE_POSE))) { float diff_mat[3][3]; - copy_m3_m4(diff_mat, ob->object_to_world().ptr()); + copy_m3_m4(diff_mat, ob->object_to_world); normalize_m3(diff_mat); invert_m3(diff_mat); mul_m3_m3_pre(tbounds->axis, diff_mat); normalize_m3(tbounds->axis); tbounds->use_matrix_space = true; - copy_m4_m4(tbounds->matrix_space, ob->object_to_world().ptr()); + copy_m4_m4(tbounds->matrix_space, ob->object_to_world); } const auto gizmo_3d_tbounds_calc_fn = [&](const float3 &co) { calc_tw_center(tbounds, co); }; @@ -1035,17 +1027,17 @@ int ED_transform_calc_gizmo_stats(const bContext *C, rv3d ? &rv3d->twdrawflag : nullptr); if (totsel) { - mul_v3_fl(tbounds->center, 1.0f / float(totsel)); /* Centroid! */ + mul_v3_fl(tbounds->center, 1.0f / float(totsel)); /* centroid! */ bGPdata *gpd = CTX_data_gpencil_data(C); const bool is_gp_edit = GPENCIL_ANY_MODE(gpd); if (!is_gp_edit && (obedit || (ob && (ob->mode & (OB_MODE_POSE | OB_MODE_SCULPT))))) { if (ob->mode & OB_MODE_POSE) { - invert_m4_m4(ob->runtime->world_to_object.ptr(), ob->object_to_world().ptr()); + invert_m4_m4(ob->world_to_object, ob->object_to_world); } - mul_m4_v3(ob->object_to_world().ptr(), tbounds->center); - mul_m4_v3(ob->object_to_world().ptr(), tbounds->min); - mul_m4_v3(ob->object_to_world().ptr(), tbounds->max); + mul_m4_v3(ob->object_to_world, tbounds->center); + mul_m4_v3(ob->object_to_world, tbounds->min); + mul_m4_v3(ob->object_to_world, tbounds->max); } } @@ -1198,7 +1190,7 @@ void gizmo_xform_message_subscribe(wmGizmoGroup *gzgroup, ARegion *region, void (*type_fn)(wmGizmoGroupType *)) { - /* Subscribe to view properties. */ + /* Subscribe to view properties */ wmMsgSubscribeValue msg_sub_value_gz_tag_refresh{}; msg_sub_value_gz_tag_refresh.owner = region; msg_sub_value_gz_tag_refresh.user_data = gzgroup->parent_gzmap; @@ -1211,7 +1203,7 @@ void gizmo_xform_message_subscribe(wmGizmoGroup *gzgroup, } else if (type_fn == VIEW3D_GGT_xform_cage) { orient_flag = V3D_GIZMO_SHOW_OBJECT_SCALE; - /* Pass. */ + /* pass */ } else if (type_fn == VIEW3D_GGT_xform_shear) { orient_flag = V3D_GIZMO_SHOW_OBJECT_ROTATE; @@ -1291,10 +1283,10 @@ void gizmo_xform_message_subscribe(wmGizmoGroup *gzgroup, } } else if (type_fn == VIEW3D_GGT_xform_cage) { - /* Pass. */ + /* pass */ } else if (type_fn == VIEW3D_GGT_xform_shear) { - /* Pass. */ + /* pass */ } else { BLI_assert(0); @@ -1640,7 +1632,7 @@ static GizmoGroup *gizmogroup_init(wmGizmoGroup *gzgroup) } \ ((void)0) - /* Add/init widgets - order matters! */ + /* add/init widgets - order matters! */ GIZMO_NEW_DIAL(MAN_AXIS_ROT_T); GIZMO_NEW_PRIM(MAN_AXIS_SCALE_C); @@ -1657,7 +1649,7 @@ static GizmoGroup *gizmogroup_init(wmGizmoGroup *gzgroup) GIZMO_NEW_DIAL(MAN_AXIS_ROT_Y); GIZMO_NEW_DIAL(MAN_AXIS_ROT_Z); - /* Initialize screen aligned widget last here, looks better, behaves better. */ + /* init screen aligned widget last here, looks better, behaves better */ GIZMO_NEW_DIAL(MAN_AXIS_ROT_C); GIZMO_NEW_PRIM(MAN_AXIS_TRANS_C); @@ -1781,7 +1773,7 @@ static void gizmogroup_init_properties_from_twtype(wmGizmoGroup *gzgroup) gizmo_get_axis_constraint(axis_idx, constraint_axis); - /* Custom handler! */ + /* custom handler! */ WM_gizmo_set_fn_custom_modal(axis, gizmo_modal); gizmo_3d_setup_draw_from_twtype(axis, axis_idx, ggd->twtype); @@ -1859,7 +1851,7 @@ static void WIDGETGROUP_gizmo_setup(const bContext *C, wmGizmoGroup *gzgroup) } else { /* This is also correct logic for 'builtin.transform', no special check needed. */ - /* Setup all gizmos, they can be toggled via #ToolSettings::gizmo_flag. */ + /* Setup all gizmos, they can be toggled via 'ToolSettings.gizmo_flag' */ ggd->twtype = V3D_GIZMO_SHOW_OBJECT_TRANSLATE | V3D_GIZMO_SHOW_OBJECT_ROTATE | V3D_GIZMO_SHOW_OBJECT_SCALE; ggd->use_twtype_refresh = true; @@ -1981,7 +1973,7 @@ static void WIDGETGROUP_gizmo_refresh(const bContext *C, wmGizmoGroup *gzgroup) const int orient_index = BKE_scene_orientation_get_index_from_flag(scene, ggd->twtype_init); - /* Skip, we don't draw anything anyway. */ + /* skip, we don't draw anything anyway */ TransformCalcParams calc_params{}; calc_params.use_only_center = true; calc_params.orientation_index = orient_index + 1; @@ -2035,8 +2027,8 @@ static void WIDGETGROUP_gizmo_draw_prepare(const bContext *C, wmGizmoGroup *gzgr } } - /* When looking through a selected camera, the gizmo can be at the - * exact same position as the view, skip so we don't break selection. */ + /* when looking through a selected camera, the gizmo can be at the + * exact same position as the view, skip so we don't break selection */ if (ggd->all_hidden || fabsf(ED_view3d_pixel_size(rv3d, rv3d->twmat[3])) < 5e-7f) { if (!is_modal) { gizmogroup_hide_all(ggd); @@ -2175,7 +2167,7 @@ static void WIDGETGROUP_gizmo_invoke_prepare(const bContext *C, RNA_property_unset(ptr, prop_orient_type); } else { - /* TODO: API function. */ + /* TODO: APIfunction */ int index = BKE_scene_orientation_slot_get_index(orient_slot); RNA_property_enum_set(ptr, prop_orient_type, index); } diff --git a/source/blender/editors/transform/transform_gizmo_3d_cage.cc b/source/blender/editors/transform/transform_gizmo_3d_cage.cc index 5af3d3cabe9..2f8a4c2801c 100644 --- a/source/blender/editors/transform/transform_gizmo_3d_cage.cc +++ b/source/blender/editors/transform/transform_gizmo_3d_cage.cc @@ -14,8 +14,8 @@ #include "BLI_math_vector.h" #include "BKE_context.hh" -#include "BKE_global.hh" -#include "BKE_scene.hh" +#include "BKE_global.h" +#include "BKE_scene.h" #include "ED_gizmo_library.hh" #include "ED_gizmo_utils.hh" @@ -24,7 +24,7 @@ #include "RNA_access.hh" -/* Local module include. */ +/* local module include */ #include "transform.hh" #include "transform_gizmo.hh" @@ -75,7 +75,7 @@ static void WIDGETGROUP_xform_cage_setup(const bContext * /*C*/, wmGizmoGroup *g wmOperatorType *ot_resize = WM_operatortype_find("TRANSFORM_OT_resize", true); PointerRNA *ptr; - /* Assign operator. */ + /* assign operator */ PropertyRNA *prop_release_confirm = nullptr; PropertyRNA *prop_constraint_axis = nullptr; diff --git a/source/blender/editors/transform/transform_gizmo_3d_shear.cc b/source/blender/editors/transform/transform_gizmo_3d_shear.cc index 6a8c9531f6d..0dbb1f1540d 100644 --- a/source/blender/editors/transform/transform_gizmo_3d_shear.cc +++ b/source/blender/editors/transform/transform_gizmo_3d_shear.cc @@ -14,7 +14,7 @@ #include "BLI_math_vector.h" #include "BKE_context.hh" -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "ED_gizmo_library.hh" #include "ED_gizmo_utils.hh" @@ -25,7 +25,7 @@ #include "RNA_access.hh" -/* Local module include. */ +/* local module include */ #include "transform.hh" #include "transform_gizmo.hh" diff --git a/source/blender/editors/transform/transform_gizmo_extrude_3d.cc b/source/blender/editors/transform/transform_gizmo_extrude_3d.cc index 62a16ae260c..8fe35885d2d 100644 --- a/source/blender/editors/transform/transform_gizmo_extrude_3d.cc +++ b/source/blender/editors/transform/transform_gizmo_extrude_3d.cc @@ -13,8 +13,8 @@ #include "BLI_utildefines.h" #include "BKE_context.hh" -#include "BKE_global.hh" -#include "BKE_scene.hh" +#include "BKE_global.h" +#include "BKE_scene.h" #include "RNA_access.hh" #include "RNA_define.hh" @@ -78,7 +78,7 @@ struct GizmoExtrudeGroup { int normal_axis; struct { - float normal_mat3[3][3]; /* Use Z axis for normal. */ + float normal_mat3[3][3]; /* use Z axis for normal. */ int orientation_index; } data; @@ -144,7 +144,7 @@ static void gizmo_mesh_extrude_setup(const bContext *C, wmGizmoGroup *gzgroup) { const char *op_idname = nullptr; /* Grease pencil does not use `obedit`. */ - /* GPXX: Remove if #OB_MODE_EDIT_GPENCIL_LEGACY is merged with #OB_MODE_EDIT. */ + /* GPXX: Remove if OB_MODE_EDIT_GPENCIL_LEGACY is merged with OB_MODE_EDIT */ const Object *obact = CTX_data_active_object(C); if (obact->type == OB_GPENCIL_LEGACY) { op_idname = "GPENCIL_OT_extrude_move"; @@ -430,7 +430,7 @@ static void gizmo_mesh_extrude_invoke_prepare(const bContext * /*C*/, RNA_float_set_array(¯optr, "value", ggd->redo_xform.value); } else if (gz == ggd->invoke_view) { - /* Pass. */ + /* pass */ } else { /* Workaround for extrude action modifying normals. */ @@ -459,7 +459,7 @@ static void gizmo_mesh_extrude_message_subscribe(const bContext *C, GizmoExtrudeGroup *ggd = static_cast(gzgroup->customdata); ARegion *region = CTX_wm_region(C); - /* Subscribe to view properties. */ + /* Subscribe to view properties */ wmMsgSubscribeValue msg_sub_value_gz_tag_refresh{}; msg_sub_value_gz_tag_refresh.owner = region; msg_sub_value_gz_tag_refresh.user_data = gzgroup->parent_gzmap; diff --git a/source/blender/editors/transform/transform_input.cc b/source/blender/editors/transform/transform_input.cc index 5e8036d8ed2..cab11ac1b7d 100644 --- a/source/blender/editors/transform/transform_input.cc +++ b/source/blender/editors/transform/transform_input.cc @@ -10,6 +10,7 @@ #include #include "DNA_screen_types.h" +#include "DNA_space_types.h" #include "BKE_context.hh" @@ -30,13 +31,13 @@ using namespace blender; /** \name Callbacks for #MouseInput.apply * \{ */ -/** Callback for #INPUT_VECTOR. */ +/** Callback for #INPUT_VECTOR */ static void InputVector(TransInfo *t, MouseInput *mi, const double mval[2], float output[3]) { convertViewVec(t, output, mval[0] - mi->imval[0], mval[1] - mi->imval[1]); } -/** Callback for #INPUT_SPRING. */ +/** Callback for #INPUT_SPRING */ static void InputSpring(TransInfo * /*t*/, MouseInput *mi, const double mval[2], float output[3]) { double dx, dy; @@ -49,13 +50,13 @@ static void InputSpring(TransInfo * /*t*/, MouseInput *mi, const double mval[2], output[0] = ratio; } -/** Callback for #INPUT_SPRING_FLIP. */ +/** Callback for #INPUT_SPRING_FLIP */ static void InputSpringFlip(TransInfo *t, MouseInput *mi, const double mval[2], float output[3]) { InputSpring(t, mi, mval, output); - /* Flip scale. */ - /* Values can become really big when zoomed in so use longs #26598. */ + /* flip scale */ + /* values can become really big when zoomed in so use longs #26598. */ if ((int64_t(int(mi->center[0]) - mval[0]) * int64_t(int(mi->center[0]) - mi->imval[0]) + int64_t(int(mi->center[1]) - mval[1]) * int64_t(int(mi->center[1]) - mi->imval[1])) < 0) { @@ -63,14 +64,14 @@ static void InputSpringFlip(TransInfo *t, MouseInput *mi, const double mval[2], } } -/** Callback for #INPUT_SPRING_DELTA. */ +/** Callback for #INPUT_SPRING_DELTA */ static void InputSpringDelta(TransInfo *t, MouseInput *mi, const double mval[2], float output[3]) { InputSpring(t, mi, mval, output); output[0] -= 1.0f; } -/** Callback for #INPUT_TRACKBALL. */ +/** Callback for #INPUT_TRACKBALL */ static void InputTrackBall(TransInfo * /*t*/, MouseInput *mi, const double mval[2], @@ -83,7 +84,7 @@ static void InputTrackBall(TransInfo * /*t*/, output[1] *= mi->factor; } -/** Callback for #INPUT_HORIZONTAL_RATIO. */ +/** Callback for #INPUT_HORIZONTAL_RATIO */ static void InputHorizontalRatio(TransInfo *t, MouseInput *mi, const double mval[2], @@ -94,7 +95,7 @@ static void InputHorizontalRatio(TransInfo *t, output[0] = ((mval[0] - mi->imval[0]) / winx) * 2.0f; } -/** Callback for #INPUT_HORIZONTAL_ABSOLUTE. */ +/** Callback for #INPUT_HORIZONTAL_ABSOLUTE */ static void InputHorizontalAbsolute(TransInfo *t, MouseInput *mi, const double mval[2], @@ -116,7 +117,7 @@ static void InputVerticalRatio(TransInfo *t, MouseInput *mi, const double mval[2 output[0] = ((mval[1] - mi->imval[1]) / winy) * 2.0f; } -/** Callback for #INPUT_VERTICAL_ABSOLUTE. */ +/** Callback for #INPUT_VERTICAL_ABSOLUTE */ static void InputVerticalAbsolute(TransInfo *t, MouseInput *mi, const double mval[2], @@ -131,7 +132,7 @@ static void InputVerticalAbsolute(TransInfo *t, output[0] = dot_v3v3(t->viewinv[1], vec) * 2.0f; } -/** Callback for #INPUT_CUSTOM_RATIO_FLIP. */ +/** Callback for #INPUT_CUSTOM_RATIO_FLIP */ static void InputCustomRatioFlip(TransInfo * /*t*/, MouseInput *mi, const double mval[2], @@ -158,7 +159,7 @@ static void InputCustomRatioFlip(TransInfo * /*t*/, } } -/** Callback for #INPUT_CUSTOM_RATIO. */ +/** Callback for #INPUT_CUSTOM_RATIO */ static void InputCustomRatio(TransInfo *t, MouseInput *mi, const double mval[2], float output[3]) { InputCustomRatioFlip(t, mi, mval, output); @@ -170,7 +171,7 @@ struct InputAngle_Data { double mval_prev[2]; }; -/** Callback for #INPUT_ANGLE. */ +/** Callback for #INPUT_ANGLE */ static void InputAngle(TransInfo * /*t*/, MouseInput *mi, const double mval[2], float output[3]) { InputAngle_Data *data = static_cast(mi->data); @@ -284,7 +285,7 @@ static void calcSpringFactor(MouseInput *mi) mi->factor = len_v2(mdir); if (mi->factor == 0.0f) { - mi->factor = 1.0f; /* Prevent inf. */ + mi->factor = 1.0f; /* prevent Inf */ } } @@ -338,7 +339,7 @@ void initMouseInputMode(TransInfo *t, MouseInput *mi, MouseInputMode mode) } case INPUT_TRACKBALL: mi->precision_factor = 1.0f / 30.0f; - /* Factor has to become setting or so. */ + /* factor has to become setting or so */ mi->factor = 0.01f; mi->apply = InputTrackBall; t->helpline = HLP_TRACKBALL; @@ -373,12 +374,12 @@ void initMouseInputMode(TransInfo *t, MouseInput *mi, MouseInputMode mode) break; } - /* Setup for the mouse cursor: either set a custom one, - * or hide it if it will be drawn with the helpline. */ + /* setup for the mouse cursor: either set a custom one, + * or hide it if it will be drawn with the helpline */ wmWindow *win = CTX_wm_window(t->context); switch (t->helpline) { case HLP_NONE: - /* INPUT_VECTOR, INPUT_CUSTOM_RATIO, INPUT_CUSTOM_RATIO_FLIP. */ + /* INPUT_VECTOR, INPUT_CUSTOM_RATIO, INPUT_CUSTOM_RATIO_FLIP */ if (t->flag & T_MODAL) { t->flag |= T_MODAL_CURSOR_SET; WM_cursor_modal_set(win, WM_CURSOR_NSEW_SCROLL); @@ -399,8 +400,8 @@ void initMouseInputMode(TransInfo *t, MouseInput *mi, MouseInputMode mode) break; } - /* If we've allocated new data, free the old data - * less hassle than checking before every alloc above. */ + /* if we've allocated new data, free the old data + * less hassle than checking before every alloc above */ if (mi_data_prev && (mi_data_prev != mi->data)) { MEM_freeN(mi_data_prev); } @@ -416,7 +417,7 @@ void applyMouseInput(TransInfo *t, MouseInput *mi, const float2 &mval, float out double mval_db[2]; if (mi->use_virtual_mval) { - /* Update accumulator. */ + /* update accumulator */ double mval_delta[2]; mval_delta[0] = (mval[0] - mi->imval[0]) - mi->virtual_mval.prev[0]; diff --git a/source/blender/editors/transform/transform_mode.cc b/source/blender/editors/transform/transform_mode.cc index 123a1cfbe53..6352fccb820 100644 --- a/source/blender/editors/transform/transform_mode.cc +++ b/source/blender/editors/transform/transform_mode.cc @@ -8,6 +8,7 @@ #include +#include "DNA_anim_types.h" #include "DNA_armature_types.h" #include "DNA_constraint_types.h" #include "DNA_gpencil_legacy_types.h" @@ -21,8 +22,13 @@ #include "BKE_constraint.h" #include "BKE_context.hh" +#include "BKE_nla.h" -#include "BLT_translation.hh" +#include "RNA_access.hh" + +#include "UI_interface.hh" + +#include "BLT_translation.h" #include "ED_sequencer.hh" @@ -57,7 +63,7 @@ bool transdata_check_local_center(const TransInfo *t, short around) return ( (around == V3D_AROUND_LOCAL_ORIGINS) && ((t->options & (CTX_OBJECT | CTX_POSE_BONE)) || - /* Implicit: `(t->flag & T_EDIT)`. */ + /* implicit: (t->flag & T_EDIT) */ ELEM(t->obedit_type, OB_MESH, OB_CURVES_LEGACY, OB_MBALL, OB_ARMATURE, OB_GPENCIL_LEGACY) || (t->spacetype == SPACE_GRAPH) || (t->options & (CTX_MOVIECLIP | CTX_MASK | CTX_PAINT_CURVE | CTX_SEQUENCER_IMAGE)))); @@ -92,16 +98,16 @@ void protectedTransBits(short protectflag, float vec[3]) } } -/* This function only does the delta rotation. */ +/* this function only does the delta rotation */ static void protectedQuaternionBits(short protectflag, float quat[4], const float oldquat[4]) { - /* Check that protection flags are set. */ + /* check that protection flags are set */ if ((protectflag & (OB_LOCK_ROTX | OB_LOCK_ROTY | OB_LOCK_ROTZ | OB_LOCK_ROTW)) == 0) { return; } if (protectflag & OB_LOCK_ROT4D) { - /* Quaternions getting limited as 4D entities that they are. */ + /* quaternions getting limited as 4D entities that they are... */ if (protectflag & OB_LOCK_ROTW) { quat[0] = oldquat[0]; } @@ -116,7 +122,7 @@ static void protectedQuaternionBits(short protectflag, float quat[4], const floa } } else { - /* Quaternions get limited with euler... (compatibility mode). */ + /* quaternions get limited with euler... (compatibility mode) */ float eul[3], oldeul[3], nquat[4], noldquat[4]; float qlen; @@ -138,10 +144,10 @@ static void protectedQuaternionBits(short protectflag, float quat[4], const floa eul_to_quat(quat, eul); - /* Restore original quat size. */ + /* restore original quat size */ mul_qt_fl(quat, qlen); - /* Quaternions flip w sign to accumulate rotations correctly. */ + /* quaternions flip w sign to accumulate rotations correctly */ if ((nquat[0] < 0.0f && quat[0] > 0.0f) || (nquat[0] > 0.0f && quat[0] < 0.0f)) { mul_qt_fl(quat, -1.0f); } @@ -161,20 +167,18 @@ static void protectedRotateBits(short protectflag, float eul[3], const float old } } -/** - * This function only does the delta rotation. - * Axis-angle is usually internally stored as quaternions. - */ +/* this function only does the delta rotation */ +/* axis-angle is usually internally stored as quats... */ static void protectedAxisAngleBits( short protectflag, float axis[3], float *angle, const float oldAxis[3], float oldAngle) { - /* Check that protection flags are set. */ + /* check that protection flags are set */ if ((protectflag & (OB_LOCK_ROTX | OB_LOCK_ROTY | OB_LOCK_ROTZ | OB_LOCK_ROTW)) == 0) { return; } if (protectflag & OB_LOCK_ROT4D) { - /* Axis-angle getting limited as 4D entities that they are... */ + /* axis-angle getting limited as 4D entities that they are... */ if (protectflag & OB_LOCK_ROTW) { *angle = oldAngle; } @@ -189,7 +193,7 @@ static void protectedAxisAngleBits( } } else { - /* Axis-angle get limited with euler. */ + /* axis-angle get limited with euler... */ float eul[3], oldeul[3]; axis_angle_to_eulO(eul, EULER_ORDER_DEFAULT, axis, *angle); @@ -210,7 +214,7 @@ static void protectedAxisAngleBits( /* When converting to axis-angle, * we need a special exception for the case when there is no axis. */ if (IS_EQF(axis[0], axis[1]) && IS_EQF(axis[1], axis[2])) { - /* For now, rotate around y-axis then (so that it simply becomes the roll). */ + /* for now, rotate around y-axis then (so that it simply becomes the roll) */ axis[1] = 1.0f; } } @@ -248,18 +252,18 @@ void constraintTransLim(const TransInfo *t, const TransDataContainer *tc, TransD float ctime = float(t->scene->r.cfra); /* Make a temporary bConstraintOb for using these limit constraints - * - They only care that cob->matrix is correctly set ;-). - * - Current space should be local. + * - they only care that cob->matrix is correctly set ;-) + * - current space should be local */ unit_m4(cob.matrix); copy_v3_v3(cob.matrix[3], td->loc); - /* Evaluate valid constraints. */ + /* Evaluate valid constraints */ for (con = td->con; con; con = con->next) { const bConstraintTypeInfo *cti = nullptr; ListBase targets = {nullptr, nullptr}; - /* Only consider constraint if enabled. */ + /* only consider constraint if enabled */ if (con->flag & (CONSTRAINT_DISABLE | CONSTRAINT_OFF)) { continue; } @@ -267,7 +271,7 @@ void constraintTransLim(const TransInfo *t, const TransDataContainer *tc, TransD continue; } - /* Only use it if it's tagged for this purpose (and the right type). */ + /* only use it if it's tagged for this purpose (and the right type) */ if (con->type == CONSTRAINT_TYPE_LOCLIMIT) { bLocLimitConstraint *data = (bLocLimitConstraint *)con->data; @@ -286,7 +290,7 @@ void constraintTransLim(const TransInfo *t, const TransDataContainer *tc, TransD } if (cti) { - /* Do space conversions. */ + /* do space conversions */ if (con->ownspace == CONSTRAINT_SPACE_WORLD) { mul_m3_v3(td->mtx, cob.matrix[3]); if (tc->use_local_mat) { @@ -294,20 +298,20 @@ void constraintTransLim(const TransInfo *t, const TransDataContainer *tc, TransD } } else if (con->ownspace != CONSTRAINT_SPACE_LOCAL) { - /* Skip... incompatible spacetype. */ + /* skip... incompatible spacetype */ continue; } /* Initialize the custom space for use in calculating the matrices. */ BKE_constraint_custom_object_space_init(&cob, con); - /* Get constraint targets if needed. */ + /* get constraint targets if needed */ BKE_constraint_targets_for_solving_get(t->depsgraph, con, &cob, &targets, ctime); - /* Do constraint. */ + /* do constraint */ cti->evaluate_constraint(con, &cob, &targets); - /* Convert spaces again. */ + /* convert spaces again */ if (con->ownspace == CONSTRAINT_SPACE_WORLD) { if (tc->use_local_mat) { sub_v3_v3(cob.matrix[3], tc->mat[3]); @@ -315,12 +319,12 @@ void constraintTransLim(const TransInfo *t, const TransDataContainer *tc, TransD mul_m3_v3(td->smtx, cob.matrix[3]); } - /* Free targets list. */ + /* free targets list */ BLI_freelistN(&targets); } } - /* Copy results from `cob->matrix`. */ + /* copy results from cob->matrix */ copy_v3_v3(td->loc, cob.matrix[3]); } } @@ -334,20 +338,20 @@ static void constraintob_from_transdata(bConstraintOb *cob, TransData *td) memset(cob, 0, sizeof(bConstraintOb)); if (td->ext) { if (td->ext->rotOrder == ROT_MODE_QUAT) { - /* Quaternion. */ - /* Objects and bones do normalization first too, otherwise + /* quats */ + /* objects and bones do normalization first too, otherwise * we don't necessarily end up with a rotation matrix, and - * then conversion back to quat gives a different result. */ + * then conversion back to quat gives a different result */ float quat[4]; normalize_qt_qt(quat, td->ext->quat); quat_to_mat4(cob->matrix, quat); } else if (td->ext->rotOrder == ROT_MODE_AXISANGLE) { - /* Axis angle. */ + /* axis angle */ axis_angle_to_mat4(cob->matrix, td->ext->rotAxis, *td->ext->rotAngle); } else { - /* Eulers. */ + /* eulers */ eulO_to_mat4(cob->matrix, td->ext->rot, td->ext->rotOrder); } } @@ -361,9 +365,9 @@ static void constraintRotLim(const TransInfo * /*t*/, TransData *td) bConstraint *con; bool do_limit = false; - /* Evaluate valid constraints. */ + /* Evaluate valid constraints */ for (con = td->con; con; con = con->next) { - /* Only consider constraint if enabled. */ + /* only consider constraint if enabled */ if (con->flag & (CONSTRAINT_DISABLE | CONSTRAINT_OFF)) { continue; } @@ -371,11 +375,11 @@ static void constraintRotLim(const TransInfo * /*t*/, TransData *td) continue; } - /* We're only interested in Limit-Rotation constraints. */ + /* we're only interested in Limit-Rotation constraints */ if (con->type == CONSTRAINT_TYPE_ROTLIMIT) { bRotLimitConstraint *data = (bRotLimitConstraint *)con->data; - /* Only use it if it's tagged for this purpose. */ + /* only use it if it's tagged for this purpose */ if ((data->flag2 & LIMIT_TRANSFORM) == 0) { continue; } @@ -391,35 +395,35 @@ static void constraintRotLim(const TransInfo * /*t*/, TransData *td) do_limit = true; } - /* Do space conversions. */ + /* do space conversions */ if (con->ownspace == CONSTRAINT_SPACE_WORLD) { - /* Just multiply by `td->mtx` (this should be ok). */ + /* just multiply by td->mtx (this should be ok) */ mul_m4_m3m4(cob.matrix, td->mtx, cob.matrix); } - /* Do constraint. */ + /* do constraint */ cti->evaluate_constraint(con, &cob, nullptr); - /* Convert spaces again. */ + /* convert spaces again */ if (con->ownspace == CONSTRAINT_SPACE_WORLD) { - /* Just multiply by `td->smtx` (this should be ok). */ + /* just multiply by td->smtx (this should be ok) */ mul_m4_m3m4(cob.matrix, td->smtx, cob.matrix); } } } if (do_limit) { - /* Copy results from `cob->matrix`. */ + /* copy results from cob->matrix */ if (td->ext->rotOrder == ROT_MODE_QUAT) { - /* Quaternion. */ + /* quats */ mat4_to_quat(td->ext->quat, cob.matrix); } else if (td->ext->rotOrder == ROT_MODE_AXISANGLE) { - /* Axis angle. */ + /* axis angle */ mat4_to_axis_angle(td->ext->rotAxis, td->ext->rotAngle, cob.matrix); } else { - /* Eulers. */ + /* eulers */ mat4_to_eulO(td->ext->rot, td->ext->rotOrder, cob.matrix); } } @@ -440,16 +444,16 @@ void constraintSizeLim(const TransInfo *t, TransData *td) * - current space should be local */ if ((td->flag & TD_SINGLESIZE) && !(t->con.mode & CON_APPLY)) { - /* Scale val and reset size. */ - return; /* TODO: fix this case. */ + /* scale val and reset size */ + return; /* TODO: fix this case */ } - /* Reset val if SINGLESIZE but using a constraint. */ + /* Reset val if SINGLESIZE but using a constraint */ if (td->flag & TD_SINGLESIZE) { return; } - /* Separate out sign to apply back later. */ + /* separate out sign to apply back later */ for (i = 0; i < 3; i++) { size_sign[i] = signf(td->ext->size[i]); size_abs[i] = fabsf(td->ext->size[i]); @@ -457,9 +461,9 @@ void constraintSizeLim(const TransInfo *t, TransData *td) size_to_mat4(cob.matrix, size_abs); - /* Evaluate valid constraints. */ + /* Evaluate valid constraints */ for (con = td->con; con; con = con->next) { - /* Only consider constraint if enabled. */ + /* only consider constraint if enabled */ if (con->flag & (CONSTRAINT_DISABLE | CONSTRAINT_OFF)) { continue; } @@ -467,43 +471,43 @@ void constraintSizeLim(const TransInfo *t, TransData *td) continue; } - /* We're only interested in Limit-Scale constraints. */ + /* we're only interested in Limit-Scale constraints */ if (con->type == CONSTRAINT_TYPE_SIZELIMIT) { bSizeLimitConstraint *data = static_cast(con->data); - /* Only use it if it's tagged for this purpose. */ + /* only use it if it's tagged for this purpose */ if ((data->flag2 & LIMIT_TRANSFORM) == 0) { continue; } - /* Do space conversions. */ + /* do space conversions */ if (con->ownspace == CONSTRAINT_SPACE_WORLD) { - /* Just multiply by `td->mtx` (this should be ok). */ + /* just multiply by td->mtx (this should be ok) */ mul_m4_m3m4(cob.matrix, td->mtx, cob.matrix); } else if (con->ownspace != CONSTRAINT_SPACE_LOCAL) { - /* Skip... incompatible `spacetype`. */ + /* skip... incompatible spacetype */ continue; } - /* Do constraint. */ + /* do constraint */ cti->evaluate_constraint(con, &cob, nullptr); - /* Convert spaces again. */ + /* convert spaces again */ if (con->ownspace == CONSTRAINT_SPACE_WORLD) { - /* Just multiply by `td->smtx` (this should be ok). */ + /* just multiply by td->smtx (this should be ok) */ mul_m4_m3m4(cob.matrix, td->smtx, cob.matrix); } } } - /* Copy results from `cob->matrix`. */ + /* copy results from cob->matrix */ if ((td->flag & TD_SINGLESIZE) && !(t->con.mode & CON_APPLY)) { - /* Scale val and reset size. */ + /* scale val and reset size */ return; /* TODO: fix this case. */ } - /* Reset val if SINGLESIZE but using a constraint. */ + /* Reset val if SINGLESIZE but using a constraint */ if (td->flag & TD_SINGLESIZE) { return; } @@ -572,7 +576,7 @@ void ElementRotation_ex(const TransInfo *t, } } else if (t->obedit_type == OB_GREASE_PENCIL) { - /* Pass. */ + /* pass */ } } @@ -587,12 +591,12 @@ void ElementRotation_ex(const TransInfo *t, if (td->flag & TD_USEQUAT) { mul_m3_series(fmat, td->smtx, mat, td->mtx); - mat3_to_quat(quat, fmat); /* Actual transform. */ + mat3_to_quat(quat, fmat); /* Actual transform */ if (td->ext->quat) { mul_qt_qtqt(td->ext->quat, quat, td->ext->iquat); - /* Is there a reason not to have this here? -jahka. */ + /* is there a reason not to have this here? -jahka */ protectedQuaternionBits(td->protectflag, td->ext->quat, td->ext->iquat); } } @@ -610,7 +614,7 @@ void ElementRotation_ex(const TransInfo *t, * has been computed, it has to be converted back into the bone's space. */ else if (t->options & CTX_POSE_BONE) { - /* Extract and invert armature object matrix. */ + /* Extract and invert armature object matrix */ if ((td->flag & TD_NO_LOC) == 0) { sub_v3_v3v3(vec, td->center, center); @@ -620,13 +624,13 @@ void ElementRotation_ex(const TransInfo *t, mul_m3_v3(tc->imat3, vec); /* To Local space. */ add_v3_v3(vec, center); - /* `vec` now is the location where the object has to be. */ + /* vec now is the location where the object has to be */ - sub_v3_v3v3(vec, vec, td->center); /* Translation needed from the initial location. */ + sub_v3_v3v3(vec, vec, td->center); /* Translation needed from the initial location */ - /* Special exception, see TD_PBONE_LOCAL_MTX definition comments. */ + /* special exception, see TD_PBONE_LOCAL_MTX definition comments */ if (td->flag & TD_PBONE_LOCAL_MTX_P) { - /* Do nothing. */ + /* do nothing */ } else if (td->flag & TD_PBONE_LOCAL_MTX_C) { mul_m3_v3(tc->mat3, vec); /* To Global space. */ @@ -644,35 +648,35 @@ void ElementRotation_ex(const TransInfo *t, constraintTransLim(t, tc, td); } - /* Rotation. */ + /* rotation */ /* MORE HACK: as in some cases the matrix to apply location and rot/scale is not the same, * and ElementRotation() might be called in Translation context (with align snapping), * we need to be sure to actually use the *rotation* matrix here... - * So no other way than storing it in some dedicated members of `td->ext`! */ - if ((t->flag & T_V3D_ALIGN) == 0) { /* Align mode doesn't rotate objects itself. */ - /* Euler or quaternion/axis-angle? */ + * So no other way than storing it in some dedicated members of td->ext! */ + if ((t->flag & T_V3D_ALIGN) == 0) { /* align mode doesn't rotate objects itself */ + /* euler or quaternion/axis-angle? */ if (td->ext->rotOrder == ROT_MODE_QUAT) { mul_m3_series(fmat, td->ext->r_smtx, mat, td->ext->r_mtx); - mat3_to_quat(quat, fmat); /* Actual transform. */ + mat3_to_quat(quat, fmat); /* Actual transform */ mul_qt_qtqt(td->ext->quat, quat, td->ext->iquat); - /* This function works on end result. */ + /* this function works on end result */ protectedQuaternionBits(td->protectflag, td->ext->quat, td->ext->iquat); } else if (td->ext->rotOrder == ROT_MODE_AXISANGLE) { - /* Calculate effect based on quaternions. */ + /* calculate effect based on quats */ float iquat[4], tquat[4]; axis_angle_to_quat(iquat, td->ext->irotAxis, td->ext->irotAngle); mul_m3_series(fmat, td->ext->r_smtx, mat, td->ext->r_mtx); - mat3_to_quat(quat, fmat); /* Actual transform. */ + mat3_to_quat(quat, fmat); /* Actual transform */ mul_qt_qtqt(tquat, quat, iquat); quat_to_axis_angle(td->ext->rotAxis, td->ext->rotAngle, tquat); - /* This function works on end result. */ + /* this function works on end result */ protectedAxisAngleBits(td->protectflag, td->ext->rotAxis, td->ext->rotAngle, @@ -689,12 +693,12 @@ void ElementRotation_ex(const TransInfo *t, copy_v3_v3(eul, td->ext->irot); eulO_to_mat3(eulmat, eul, td->ext->rotOrder); - /* `mat = transform`, `obmat = bone rotation`. */ + /* mat = transform, obmat = bone rotation */ mul_m3_m3m3(fmat, smat, eulmat); mat3_to_compatible_eulO(eul, td->ext->rot, td->ext->rotOrder, fmat); - /* And apply (to end result only). */ + /* and apply (to end result only) */ protectedRotateBits(td->protectflag, eul, td->ext->irot); copy_v3_v3(td->ext->rot, eul); } @@ -704,11 +708,11 @@ void ElementRotation_ex(const TransInfo *t, } else { if ((td->flag & TD_NO_LOC) == 0) { - /* Translation. */ + /* translation */ sub_v3_v3v3(vec, td->center, center); mul_m3_v3(mat, vec); add_v3_v3(vec, center); - /* `vec` now is the location where the object has to be. */ + /* vec now is the location where the object has to be */ sub_v3_v3(vec, td->center); mul_m3_v3(td->smtx, vec); @@ -719,25 +723,25 @@ void ElementRotation_ex(const TransInfo *t, constraintTransLim(t, tc, td); - /* Rotation. */ + /* rotation */ if ((t->flag & T_V3D_ALIGN) == 0) { /* Align mode doesn't rotate objects itself. */ - /* Euler or quaternion? */ + /* euler or quaternion? */ if ((td->ext->rotOrder == ROT_MODE_QUAT) || (td->flag & TD_USEQUAT)) { - /* Can be called for texture space translate for example, then opt out. */ + /* can be called for texture space translate for example, then opt out */ if (td->ext->quat) { mul_m3_series(fmat, td->smtx, mat, td->mtx); if (!is_zero_v3(td->ext->dquat)) { - /* Correct for delta quat. */ + /* Correct for delta quat */ float tmp_mat[3][3]; quat_to_mat3(tmp_mat, td->ext->dquat); mul_m3_m3m3(fmat, fmat, tmp_mat); } - mat3_to_quat(quat, fmat); /* Actual transform. */ + mat3_to_quat(quat, fmat); /* Actual transform */ if (!is_zero_v4(td->ext->dquat)) { - /* Correct back for delta quaternion. */ + /* Correct back for delta quat. */ float idquat[4]; invert_qt_qt_normalized(idquat, td->ext->dquat); mul_qt_qtqt(quat, idquat, quat); @@ -745,23 +749,23 @@ void ElementRotation_ex(const TransInfo *t, mul_qt_qtqt(td->ext->quat, quat, td->ext->iquat); - /* This function works on end result. */ + /* this function works on end result */ protectedQuaternionBits(td->protectflag, td->ext->quat, td->ext->iquat); } } else if (td->ext->rotOrder == ROT_MODE_AXISANGLE) { - /* Calculate effect based on quaternions. */ + /* calculate effect based on quats */ float iquat[4], tquat[4]; axis_angle_to_quat(iquat, td->ext->irotAxis, td->ext->irotAngle); mul_m3_series(fmat, td->smtx, mat, td->mtx); - mat3_to_quat(quat, fmat); /* Actual transform. */ + mat3_to_quat(quat, fmat); /* Actual transform */ mul_qt_qtqt(tquat, quat, iquat); quat_to_axis_angle(td->ext->rotAxis, td->ext->rotAngle, tquat); - /* This function works on end result. */ + /* this function works on end result */ protectedAxisAngleBits(td->protectflag, td->ext->rotAxis, td->ext->rotAngle, @@ -776,7 +780,7 @@ void ElementRotation_ex(const TransInfo *t, mul_m3_m3m3(smat, td->smtx, totmat); if (!is_zero_v3(td->ext->drot)) { - /* Correct for delta rot. */ + /* Correct for delta rot */ add_eul_euleul(eul, td->ext->irot, td->ext->drot, td->ext->rotOrder); } else { @@ -792,7 +796,7 @@ void ElementRotation_ex(const TransInfo *t, sub_eul_euleul(eul, eul, td->ext->drot, td->ext->rotOrder); } - /* And apply. */ + /* and apply */ protectedRotateBits(td->protectflag, eul, td->ext->irot); copy_v3_v3(td->ext->rot, eul); } @@ -810,7 +814,7 @@ void ElementRotation(const TransInfo *t, { const float *center; - /* Local constraint shouldn't alter center. */ + /* local constraint shouldn't alter center */ if (transdata_check_local_center(t, around)) { center = td->center; } @@ -942,7 +946,7 @@ void ElementResize(const TransInfo *t, t->con.applySize(t, tc, td, tmat); } - /* Local constraint shouldn't alter center. */ + /* local constraint shouldn't alter center */ if (transdata_check_local_center(t, t->around)) { copy_v3_v3(center, td->center); } @@ -981,9 +985,9 @@ void ElementResize(const TransInfo *t, protectedSizeBits(td->protectflag, fsize); - if ((t->flag & T_V3D_ALIGN) == 0) { /* Align mode doesn't resize objects itself. */ + if ((t->flag & T_V3D_ALIGN) == 0) { /* align mode doesn't resize objects itself */ if ((td->flag & TD_SINGLESIZE) && !(t->con.mode & CON_APPLY)) { - /* Scale val and reset size. */ + /* scale val and reset size */ *td->val = td->ival * (1 + (fsize[0] - 1) * td->factor); td->ext->size[0] = td->ext->isize[0]; @@ -991,7 +995,7 @@ void ElementResize(const TransInfo *t, td->ext->size[2] = td->ext->isize[2]; } else { - /* Reset val if SINGLESIZE but using a constraint. */ + /* Reset val if SINGLESIZE but using a constraint */ if (td->flag & TD_SINGLESIZE) { *td->val = td->ival; } @@ -1005,7 +1009,7 @@ void ElementResize(const TransInfo *t, constraintSizeLim(t, td); } - /* For individual element center, Editmode need to use iloc. */ + /* For individual element center, Editmode need to use iloc */ if (t->flag & T_POINTS) { sub_v3_v3v3(vec, td->iloc, center); } @@ -1066,7 +1070,7 @@ void ElementResize(const TransInfo *t, if (t->options & CTX_POSE_BONE) { /* Without this, the resulting location of scaled bones aren't correct, * especially noticeable scaling root or disconnected bones around the cursor, see #92515. */ - mul_mat3_m4_v3(tc->poseobj->object_to_world().ptr(), vec); + mul_mat3_m4_v3(tc->poseobj->object_to_world, vec); } mul_m3_v3(td->smtx, vec); } diff --git a/source/blender/editors/transform/transform_mode.hh b/source/blender/editors/transform/transform_mode.hh index 15a1ca6f41f..bb6f21be100 100644 --- a/source/blender/editors/transform/transform_mode.hh +++ b/source/blender/editors/transform/transform_mode.hh @@ -19,7 +19,7 @@ struct wmOperator; struct wmEvent; struct TransModeInfo { - int flags; /* #eTFlag. */ + int flags; /* eTFlag */ void (*init_fn)(TransInfo *, wmOperator *); @@ -49,7 +49,7 @@ struct TransModeInfo { void (*draw_fn)(TransInfo *); }; -/* Header of #TransDataEdgeSlideVert, #TransDataEdgeSlideEdge. */ +/* header of TransDataEdgeSlideVert, TransDataEdgeSlideEdge */ struct TransDataGenericSlideVert { BMVert *v; LinkNode **cd_loop_groups; diff --git a/source/blender/editors/transform/transform_mode_align.cc b/source/blender/editors/transform/transform_mode_align.cc index b2365522773..1d4ce84856f 100644 --- a/source/blender/editors/transform/transform_mode_align.cc +++ b/source/blender/editors/transform/transform_mode_align.cc @@ -8,12 +8,14 @@ #include +#include "BKE_context.hh" + #include "ED_screen.hh" #include "BLI_math_matrix.h" #include "BLI_math_vector.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "transform.hh" #include "transform_convert.hh" @@ -30,7 +32,7 @@ static void applyAlign(TransInfo *t) int i; FOREACH_TRANS_DATA_CONTAINER (t, tc) { - /* Saving original center. */ + /* saving original center */ copy_v3_v3(center, tc->center_local); TransData *td = tc->data; for (i = 0; i < tc->data_len; i++, td++) { @@ -40,7 +42,7 @@ static void applyAlign(TransInfo *t) continue; } - /* Around local centers. */ + /* around local centers */ if (t->options & (CTX_OBJECT | CTX_POSE_BONE)) { copy_v3_v3(tc->center_local, td->center); } @@ -56,7 +58,7 @@ static void applyAlign(TransInfo *t) ElementRotation(t, tc, td, mat, t->around); } - /* Restoring original center. */ + /* restoring original center */ copy_v3_v3(tc->center_local, center); } diff --git a/source/blender/editors/transform/transform_mode_baketime.cc b/source/blender/editors/transform/transform_mode_baketime.cc index 72d58b58362..69bcb7f4c92 100644 --- a/source/blender/editors/transform/transform_mode_baketime.cc +++ b/source/blender/editors/transform/transform_mode_baketime.cc @@ -11,13 +11,14 @@ #include "BLI_math_vector.h" #include "BLI_string.h" +#include "BKE_context.hh" #include "BKE_unit.hh" #include "ED_screen.hh" #include "UI_interface.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "transform.hh" #include "transform_convert.hh" @@ -38,7 +39,7 @@ static void applyBakeTime(TransInfo *t) float fac = 0.1f; /* XXX, disable precision for now, - * this isn't even accessible by the user. */ + * this isn't even accessible by the user */ #if 0 if (t->mouse.precision) { /* Calculate ratio for shift-key position, and for total, and blend these for precision. */ @@ -55,7 +56,7 @@ static void applyBakeTime(TransInfo *t) applyNumInput(&t->num, &time); - /* Header print for NumInput. */ + /* header print for NumInput */ if (hasNumInput(&t->num)) { char c[NUM_STR_REP_LEN]; @@ -69,7 +70,7 @@ static void applyBakeTime(TransInfo *t) } } else { - /* Default header print. */ + /* default header print */ if (time >= 0.0f) { SNPRINTF(str, IFACE_("Time: +%.3f %s"), time, t->proptext); } diff --git a/source/blender/editors/transform/transform_mode_bbone_resize.cc b/source/blender/editors/transform/transform_mode_bbone_resize.cc index 2eac2750c5b..3af6196346e 100644 --- a/source/blender/editors/transform/transform_mode_bbone_resize.cc +++ b/source/blender/editors/transform/transform_mode_bbone_resize.cc @@ -12,13 +12,14 @@ #include "BLI_math_vector.h" #include "BLI_string.h" +#include "BKE_context.hh" #include "BKE_unit.hh" #include "ED_screen.hh" #include "UI_interface.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "transform.hh" #include "transform_constraints.hh" @@ -43,7 +44,7 @@ static void headerBoneSize(TransInfo *t, const float vec[3], char str[UI_MAX_DRA BLI_snprintf(&tvec[NUM_STR_REP_LEN * 2], NUM_STR_REP_LEN, "%.4f", vec[2]); } - /* Hmm... perhaps the y-axis values don't need to be shown? */ + /* hmm... perhaps the y-axis values don't need to be shown? */ if (t->con.mode & CON_APPLY) { if (t->num.idx_max == 0) { BLI_snprintf( @@ -87,7 +88,7 @@ static void ElementBoneSize(TransInfo *t, t->con.applySize(t, tc, td, tmat); } - /* We've tucked the scale in loc. */ + /* we've tucked the scale in loc */ oldy = td->iloc[1]; size_to_mat3(sizemat, td->iloc); mul_m3_m3m3(tmat, tmat, sizemat); @@ -128,7 +129,7 @@ static void applyBoneSize(TransInfo *t) } } - copy_m3_m3(t->mat, mat); /* Used in gizmo. */ + copy_m3_m3(t->mat, mat); /* used in gizmo */ headerBoneSize(t, t->values_final, str); diff --git a/source/blender/editors/transform/transform_mode_bend.cc b/source/blender/editors/transform/transform_mode_bend.cc index 0e538673439..c7582e036ec 100644 --- a/source/blender/editors/transform/transform_mode_bend.cc +++ b/source/blender/editors/transform/transform_mode_bend.cc @@ -19,6 +19,7 @@ #include "BLI_string.h" #include "BLI_task.h" +#include "BKE_context.hh" #include "BKE_unit.hh" #include "ED_screen.hh" @@ -28,7 +29,7 @@ #include "UI_interface.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "transform.hh" #include "transform_convert.hh" @@ -51,7 +52,7 @@ struct BendCustomData { float warp_nor[3]; float warp_tan[3]; - /* For applying the mouse distance. */ + /* for applying the mouse distance */ float warp_init_dist; }; @@ -126,7 +127,7 @@ static void transdata_elem_bend(const TransInfo *t, interp_v3_v3v3(delta, warp_sta_local, warp_end_radius_local, fac_scaled); sub_v3_v3(delta, warp_sta_local); - /* Delta is subtracted, rotation adds back this offset. */ + /* delta is subtracted, rotation adds back this offset */ sub_v3_v3(vec, delta); sub_v3_v3(vec, pivot_local); @@ -135,12 +136,12 @@ static void transdata_elem_bend(const TransInfo *t, mul_m3_v3(td->smtx, vec); - /* Rotation. */ + /* rotation */ if ((t->flag & T_POINTS) == 0) { ElementRotation(t, tc, td, mat, V3D_AROUND_LOCAL_ORIGINS); } - /* Location. */ + /* location */ copy_v3_v3(td->loc, vec); } @@ -198,13 +199,13 @@ static void Bend(TransInfo *t) float vector[2]; } values; - /* Amount of radians for bend. */ + /* amount of radians for bend */ copy_v2_v2(values.vector, t->values); #if 0 snapGrid(t, angle_rad); #else - /* Hrmf, snapping radius is using 'angle' steps, need to convert to something else + /* hrmf, snapping radius is using 'angle' steps, need to convert to something else * this isn't essential but nicer to give reasonable snapping values for radius. */ if (t->tsnap.mode & SCE_SNAP_TO_INCREMENT) { const float radius_snap = 0.1f; @@ -221,7 +222,7 @@ static void Bend(TransInfo *t) copy_v2_v2(t->values_final, values.vector); - /* Header print for NumInput. */ + /* header print for NumInput */ if (hasNumInput(&t->num)) { char c[NUM_STR_REP_LEN * 2]; @@ -234,7 +235,7 @@ static void Bend(TransInfo *t) WM_bool_as_string(is_clamp)); } else { - /* Default header print. */ + /* default header print */ SNPRINTF(str, IFACE_("Bend Angle: %.3f, Radius: %.4f, Alt: Clamp %s"), RAD2DEGF(values.angle), @@ -245,12 +246,12 @@ static void Bend(TransInfo *t) values.angle *= -1.0f; values.scale *= bend_data->warp_init_dist; - /* Calculate `data->warp_end` from `data->warp_end_init`. */ + /* calc 'data->warp_end' from 'data->warp_end_init' */ copy_v3_v3(warp_end_radius_global, bend_data->warp_end); dist_ensure_v3_v3fl(warp_end_radius_global, bend_data->warp_sta, values.scale); - /* Done. */ + /* done */ - /* Calculate pivot. */ + /* calculate pivot */ copy_v3_v3(pivot_global, bend_data->warp_sta); if (values.angle > 0.0f) { madd_v3_v3fl(pivot_global, @@ -337,7 +338,8 @@ static void initBend(TransInfo *t, wmOperator * /*op*/) t->idx_max = 1; t->num.idx_max = 1; - initSnapAngleIncrements(t); + t->snap[0] = SNAP_INCREMENTAL_ANGLE; + t->snap[1] = t->snap[0] * 0.2; copy_v3_fl(t->num.val_inc, t->snap[0]); t->num.unit_sys = t->scene->unit.system; @@ -361,7 +363,7 @@ static void initBend(TransInfo *t, wmOperator * /*op*/) copy_v3_v3(data->warp_nor, t->viewinv[2]); normalize_v3(data->warp_nor); - /* Tangent. */ + /* tangent */ sub_v3_v3v3(tvec, data->warp_end, data->warp_sta); cross_v3_v3v3(data->warp_tan, tvec, data->warp_nor); normalize_v3(data->warp_tan); diff --git a/source/blender/editors/transform/transform_mode_boneenvelope.cc b/source/blender/editors/transform/transform_mode_boneenvelope.cc index 02ed24540d7..7ff1ab880ab 100644 --- a/source/blender/editors/transform/transform_mode_boneenvelope.cc +++ b/source/blender/editors/transform/transform_mode_boneenvelope.cc @@ -11,13 +11,14 @@ #include "BLI_math_vector.h" #include "BLI_string.h" +#include "BKE_context.hh" #include "BKE_unit.hh" #include "ED_screen.hh" #include "UI_interface.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "transform.hh" #include "transform_convert.hh" @@ -43,7 +44,7 @@ static void applyBoneEnvelope(TransInfo *t) t->values_final[0] = ratio; - /* Header print for NumInput. */ + /* header print for NumInput */ if (hasNumInput(&t->num)) { char c[NUM_STR_REP_LEN]; @@ -62,7 +63,7 @@ static void applyBoneEnvelope(TransInfo *t) } if (td->val) { - /* If the old/original value was 0.0f, then just use ratio. */ + /* if the old/original value was 0.0f, then just use ratio */ if (td->ival) { *td->val = td->ival * ratio; } diff --git a/source/blender/editors/transform/transform_mode_boneroll.cc b/source/blender/editors/transform/transform_mode_boneroll.cc index 554c80a42e6..2507307be43 100644 --- a/source/blender/editors/transform/transform_mode_boneroll.cc +++ b/source/blender/editors/transform/transform_mode_boneroll.cc @@ -12,13 +12,14 @@ #include "BLI_math_vector.h" #include "BLI_string.h" +#include "BKE_context.hh" #include "BKE_unit.hh" #include "ED_screen.hh" #include "UI_interface.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "transform.hh" #include "transform_convert.hh" @@ -56,7 +57,7 @@ static void applyBoneRoll(TransInfo *t) SNPRINTF(str, IFACE_("Roll: %.2f"), RAD2DEGF(final)); } - /* Set roll values. */ + /* set roll values */ FOREACH_TRANS_DATA_CONTAINER (t, tc) { TransData *td = tc->data; for (i = 0; i < tc->data_len; i++, td++) { @@ -81,7 +82,8 @@ static void initBoneRoll(TransInfo *t, wmOperator * /*op*/) t->idx_max = 0; t->num.idx_max = 0; - initSnapAngleIncrements(t); + t->snap[0] = DEG2RAD(5.0); + t->snap[1] = DEG2RAD(1.0); copy_v3_fl(t->num.val_inc, t->snap[0]); t->num.unit_sys = t->scene->unit.system; diff --git a/source/blender/editors/transform/transform_mode_curveshrinkfatten.cc b/source/blender/editors/transform/transform_mode_curveshrinkfatten.cc index 65e88ee5d8b..5a0ed7cf536 100644 --- a/source/blender/editors/transform/transform_mode_curveshrinkfatten.cc +++ b/source/blender/editors/transform/transform_mode_curveshrinkfatten.cc @@ -12,13 +12,14 @@ #include "BLI_math_vector.h" #include "BLI_string.h" +#include "BKE_context.hh" #include "BKE_unit.hh" #include "ED_screen.hh" #include "UI_interface.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "transform.hh" #include "transform_convert.hh" @@ -44,7 +45,7 @@ static void applyCurveShrinkFatten(TransInfo *t) t->values_final[0] = ratio; - /* Header print for NumInput. */ + /* header print for NumInput */ if (hasNumInput(&t->num)) { char c[NUM_STR_REP_LEN]; diff --git a/source/blender/editors/transform/transform_mode_customdata.cc b/source/blender/editors/transform/transform_mode_customdata.cc index 2757e46a703..64464171898 100644 --- a/source/blender/editors/transform/transform_mode_customdata.cc +++ b/source/blender/editors/transform/transform_mode_customdata.cc @@ -12,13 +12,14 @@ #include "BLI_string.h" #include "BLI_task.h" +#include "BKE_context.hh" #include "BKE_unit.hh" #include "ED_screen.hh" #include "UI_interface.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "transform.hh" #include "transform_convert.hh" @@ -86,7 +87,7 @@ static void apply_value_impl(TransInfo *t, const char *value_name) t->values_final[0] = value; - /* Header print for NumInput. */ + /* header print for NumInput */ if (hasNumInput(&t->num)) { char c[NUM_STR_REP_LEN]; @@ -100,7 +101,7 @@ static void apply_value_impl(TransInfo *t, const char *value_name) } } else { - /* Default header print. */ + /* default header print */ if (value >= 0.0f) { SNPRINTF(str, "%s: +%.3f %s", value_name, value, t->proptext); } diff --git a/source/blender/editors/transform/transform_mode_edge_rotate_normal.cc b/source/blender/editors/transform/transform_mode_edge_rotate_normal.cc index 4343df1ee1d..2a315548711 100644 --- a/source/blender/editors/transform/transform_mode_edge_rotate_normal.cc +++ b/source/blender/editors/transform/transform_mode_edge_rotate_normal.cc @@ -12,6 +12,7 @@ #include "BLI_math_rotation.h" #include "BLI_math_vector.h" +#include "BKE_context.hh" #include "BKE_editmesh.hh" #include "BKE_mesh.hh" #include "BKE_unit.hh" @@ -47,7 +48,7 @@ void freeCustomNormalArray(TransInfo *t, TransDataContainer *tc, TransCustomData BMEditMesh *em = BKE_editmesh_from_object(tc->obedit); BMesh *bm = em->bm; - /* Restore custom loop normal on cancel. */ + /* Restore custom loop normal on cancel */ for (int i = 0; i < lnors_ed_arr->totloop; i++, lnor_ed++) { BKE_lnor_space_custom_normal_to_data( bm->lnor_spacearr->lspacearr[lnor_ed->loop_index], lnor_ed->niloc, lnor_ed->clnors_data); @@ -60,7 +61,7 @@ void freeCustomNormalArray(TransInfo *t, TransDataContainer *tc, TransCustomData tc->custom.mode.free_cb = nullptr; } -/* Works by getting custom normal from clnor_data, transform, then store. */ +/* Works by getting custom normal from clnor_data, transform, then store */ static void applyNormalRotation(TransInfo *t) { char str[UI_MAX_DRAW_STR]; @@ -118,7 +119,8 @@ static void initNormalRotation(TransInfo *t, wmOperator * /*op*/) t->idx_max = 0; t->num.idx_max = 0; - initSnapAngleIncrements(t); + t->snap[0] = DEG2RAD(5.0); + t->snap[1] = DEG2RAD(1.0); copy_v3_fl(t->num.val_inc, t->snap[1]); t->num.unit_sys = t->scene->unit.system; diff --git a/source/blender/editors/transform/transform_mode_edge_seq_slide.cc b/source/blender/editors/transform/transform_mode_edge_seq_slide.cc index edf159f5137..9bd3ab0f4be 100644 --- a/source/blender/editors/transform/transform_mode_edge_seq_slide.cc +++ b/source/blender/editors/transform/transform_mode_edge_seq_slide.cc @@ -13,6 +13,7 @@ #include "BLI_blenlib.h" #include "BLI_math_vector.h" +#include "BKE_context.hh" #include "BKE_unit.hh" #include "ED_screen.hh" @@ -21,8 +22,13 @@ #include "WM_types.hh" #include "UI_interface.hh" +#include "UI_view2d.hh" -#include "BLT_translation.hh" +#include "SEQ_iterator.hh" +#include "SEQ_sequencer.hh" +#include "SEQ_time.hh" + +#include "BLT_translation.h" #include "transform.hh" #include "transform_convert.hh" diff --git a/source/blender/editors/transform/transform_mode_edge_slide.cc b/source/blender/editors/transform/transform_mode_edge_slide.cc index 08da69567af..3d41dff9a83 100644 --- a/source/blender/editors/transform/transform_mode_edge_slide.cc +++ b/source/blender/editors/transform/transform_mode_edge_slide.cc @@ -6,25 +6,36 @@ * \ingroup edtransform */ -#include "BLI_math_matrix.h" -#include "BLI_string.h" +#include +#include "MEM_guardedalloc.h" + +#include "BLI_math_matrix.h" +#include "BLI_math_vector_types.hh" +#include "BLI_string.h" +#include "BLI_utildefines_stack.h" + +#include "BKE_context.hh" +#include "BKE_editmesh.hh" +#include "BKE_editmesh_bvh.h" #include "BKE_unit.hh" #include "GPU_immediate.h" #include "GPU_matrix.h" +#include "GPU_state.h" +#include "ED_mesh.hh" #include "ED_screen.hh" -#include "ED_transform_snap_object_context.hh" #include "WM_api.hh" +#include "WM_types.hh" #include "RNA_access.hh" #include "UI_interface.hh" -#include "UI_view2d.hh" +#include "UI_resources.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "transform.hh" #include "transform_constraints.hh" @@ -32,57 +43,39 @@ #include "transform_mode.hh" #include "transform_snap.hh" -using namespace blender; - /* -------------------------------------------------------------------- */ /** \name Transform (Edge Slide) * \{ */ +struct TransDataEdgeSlideVert { + /** #TransDataGenericSlideVert (header) */ + BMVert *v; + LinkNode **cd_loop_groups; + float v_co_orig[3]; + /* end generic */ + + float edge_len; + + BMVert *v_side[2]; + + /* add origvert.co to get the original locations */ + float dir_side[2][3]; + + int loop_nr; +}; + struct EdgeSlideData { - Array sv; + TransDataEdgeSlideVert *sv; + int totsv; int mval_start[2], mval_end[2]; int curr_sv_index; - - private: - float4x4 proj_mat; - float2 win_half; - - public: - void update_proj_mat(TransInfo *t, const TransDataContainer *tc) - { - ARegion *region = t->region; - this->win_half = {region->winx / 2.0f, region->winy / 2.0f}; - - if (t->spacetype == SPACE_VIEW3D) { - RegionView3D *rv3d = static_cast(region->regiondata); - this->proj_mat = ED_view3d_ob_project_mat_get(rv3d, tc->obedit); - - for (int i = 0; i < 4; i++) { - this->proj_mat[i][0] *= this->win_half[0]; - this->proj_mat[i][1] *= this->win_half[1]; - } - } - else { - const View2D *v2d = static_cast(t->view); - UI_view2d_view_to_region_m4(v2d, this->proj_mat.ptr()); - this->proj_mat.location()[0] -= this->win_half[0]; - this->proj_mat.location()[1] -= this->win_half[1]; - } - } - - void project(const TransDataEdgeSlideVert *svert, float2 &r_sco_a, float2 &r_sco_b) const - { - float3 iloc = svert->v_co_orig(); - r_sco_a = math::project_point(this->proj_mat, iloc + svert->dir_side[0]).xy() + this->win_half; - r_sco_b = math::project_point(this->proj_mat, iloc + svert->dir_side[1]).xy() + this->win_half; - } }; struct EdgeSlideParams { float perc; - /** When un-clamped - use this index: #TransDataEdgeSlideVert.dir_side. */ + /** when un-clamped - use this index: #TransDataEdgeSlideVert.dir_side */ int curr_side_unclamp; bool use_even; @@ -118,19 +111,33 @@ static void calcEdgeSlideCustomPoints(TransInfo *t) setCustomPoints(t, &t->mouse, sld->mval_end, sld->mval_start); - /* #setCustomPoints isn't normally changing as the mouse moves, + /* setCustomPoints isn't normally changing as the mouse moves, * in this case apply mouse input immediately so we don't refresh - * with the value from the previous points. */ + * with the value from the previous points */ applyMouseInput(t, &t->mouse, t->mval, t->values); } +static BMEdge *get_other_edge(BMVert *v, BMEdge *e) +{ + BMIter iter; + BMEdge *e_iter; + + BM_ITER_ELEM (e_iter, &iter, v, BM_EDGES_OF_VERT) { + if (BM_elem_flag_test(e_iter, BM_ELEM_SELECT) && e_iter != e) { + return e_iter; + } + } + + return nullptr; +} + /* Interpolates along a line made up of 2 segments (used for edge slide). */ static void interp_line_v3_v3v3v3( float p[3], const float v1[3], const float v2[3], const float v3[3], float t) { float t_mid, t_delta; - /* Could be pre-calculated. */ + /* could be pre-calculated */ t_mid = line_point_factor_v3(v2, v1, v3); t_delta = t - t_mid; @@ -155,6 +162,181 @@ static void interp_line_v3_v3v3v3( } } +/** + * Find the closest point on the ngon on the opposite side. + * used to set the edge slide distance for ngons. + */ +static bool bm_loop_calc_opposite_co(BMLoop *l_tmp, const float plane_no[3], float r_co[3]) +{ + /* skip adjacent edges */ + BMLoop *l_first = l_tmp->next; + BMLoop *l_last = l_tmp->prev; + BMLoop *l_iter; + float dist = FLT_MAX; + bool found = false; + + l_iter = l_first; + do { + float tvec[3]; + if (isect_line_plane_v3(tvec, l_iter->v->co, l_iter->next->v->co, l_tmp->v->co, plane_no)) { + const float fac = line_point_factor_v3(tvec, l_iter->v->co, l_iter->next->v->co); + /* allow some overlap to avoid missing the intersection because of float precision */ + if ((fac > -FLT_EPSILON) && (fac < 1.0f + FLT_EPSILON)) { + /* likelihood of multiple intersections per ngon is quite low, + * it would have to loop back on itself, but better support it + * so check for the closest opposite edge */ + const float tdist = len_v3v3(l_tmp->v->co, tvec); + if (tdist < dist) { + copy_v3_v3(r_co, tvec); + dist = tdist; + found = true; + } + } + } + } while ((l_iter = l_iter->next) != l_last); + + return found; +} + +/** + * Given 2 edges and a loop, step over the loops + * and calculate a direction to slide along. + * + * \param r_slide_vec: the direction to slide, + * the length of the vector defines the slide distance. + */ +static BMLoop *get_next_loop( + BMVert *v, BMLoop *l, BMEdge *e_prev, BMEdge *e_next, float r_slide_vec[3]) +{ + BMLoop *l_first; + float vec_accum[3] = {0.0f, 0.0f, 0.0f}; + float vec_accum_len = 0.0f; + int i = 0; + + BLI_assert(BM_edge_share_vert(e_prev, e_next) == v); + BLI_assert(BM_vert_in_edge(l->e, v)); + + l_first = l; + do { + l = BM_loop_other_edge_loop(l, v); + + if (l->e == e_next) { + if (i) { + normalize_v3_length(vec_accum, vec_accum_len / float(i)); + } + else { + /* When there is no edge to slide along, + * we must slide along the vector defined by the face we're attach to */ + BMLoop *l_tmp = BM_face_vert_share_loop(l_first->f, v); + + BLI_assert(ELEM(l_tmp->e, e_prev, e_next) && ELEM(l_tmp->prev->e, e_prev, e_next)); + + if (l_tmp->f->len == 4) { + /* we could use code below, but in this case + * sliding diagonally across the quad works well */ + sub_v3_v3v3(vec_accum, l_tmp->next->next->v->co, v->co); + } + else { + float tdir[3]; + BM_loop_calc_face_direction(l_tmp, tdir); + cross_v3_v3v3(vec_accum, l_tmp->f->no, tdir); +#if 0 + /* Rough guess, we can do better! */ + normalize_v3_length(vec_accum, + (BM_edge_calc_length(e_prev) + BM_edge_calc_length(e_next)) / 2.0f); +#else + /* be clever, check the opposite ngon edge to slide into. + * this gives best results */ + { + float tvec[3]; + float dist; + + if (bm_loop_calc_opposite_co(l_tmp, tdir, tvec)) { + dist = len_v3v3(l_tmp->v->co, tvec); + } + else { + dist = (BM_edge_calc_length(e_prev) + BM_edge_calc_length(e_next)) / 2.0f; + } + + normalize_v3_length(vec_accum, dist); + } +#endif + } + } + + copy_v3_v3(r_slide_vec, vec_accum); + return l; + } + + /* accumulate the normalized edge vector, + * normalize so some edges don't skew the result */ + float tvec[3]; + sub_v3_v3v3(tvec, BM_edge_other_vert(l->e, v)->co, v->co); + vec_accum_len += normalize_v3(tvec); + add_v3_v3(vec_accum, tvec); + i += 1; + + if (BM_loop_other_edge_loop(l, v)->e == e_next) { + if (i) { + normalize_v3_length(vec_accum, vec_accum_len / float(i)); + } + + copy_v3_v3(r_slide_vec, vec_accum); + return BM_loop_other_edge_loop(l, v); + } + + } while ((l != l->radial_next) && ((l = l->radial_next) != l_first)); + + if (i) { + normalize_v3_length(vec_accum, vec_accum_len / float(i)); + } + + copy_v3_v3(r_slide_vec, vec_accum); + + return nullptr; +} + +static blender::float4x4 edge_slide_projmat_get(TransInfo *t, TransDataContainer *tc) +{ + RegionView3D *rv3d = nullptr; + + if (t->spacetype == SPACE_VIEW3D) { + /* Background mode support. */ + rv3d = static_cast(t->region ? t->region->regiondata : nullptr); + } + + if (!rv3d) { + /* Ok, let's try to survive this. */ + return blender::float4x4::identity(); + } + return ED_view3d_ob_project_mat_get(rv3d, tc->obedit); +} + +static void edge_slide_pair_project(TransDataEdgeSlideVert *sv, + ARegion *region, + const float projectMat[4][4], + float r_sco_a[3], + float r_sco_b[3]) +{ + BMVert *v = sv->v; + + if (sv->v_side[1]) { + ED_view3d_project_float_v3_m4(region, sv->v_side[1]->co, r_sco_b, projectMat); + } + else { + add_v3_v3v3(r_sco_b, v->co, sv->dir_side[1]); + ED_view3d_project_float_v3_m4(region, r_sco_b, r_sco_b, projectMat); + } + + if (sv->v_side[0]) { + ED_view3d_project_float_v3_m4(region, sv->v_side[0]->co, r_sco_a, projectMat); + } + else { + add_v3_v3v3(r_sco_a, v->co, sv->dir_side[0]); + ED_view3d_project_float_v3_m4(region, r_sco_a, r_sco_a, projectMat); + } +} + static void edge_slide_data_init_mval(MouseInput *mi, EdgeSlideData *sld, float *mval_dir) { /* Possible all of the edge loops are pointing directly at the view. */ @@ -168,7 +350,7 @@ static void edge_slide_data_init_mval(MouseInput *mi, EdgeSlideData *sld, float /* Zero out Start. */ zero_v2(mval_start); - /* `mval_dir` holds a vector along edge loop. */ + /* dir holds a vector along edge loop */ copy_v2_v2(mval_end, mval_dir); mul_v2_fl(mval_end, 0.5f); @@ -179,141 +361,117 @@ static void edge_slide_data_init_mval(MouseInput *mi, EdgeSlideData *sld, float sld->mval_end[1] = mi->imval[1] + mval_end[1]; } -static bool is_vert_slide_visible(TransInfo *t, - SnapObjectContext *sctx, - TransDataEdgeSlideVert *sv, - const float4 &plane_near) -{ - const float3 &v_co_orig = sv->v_co_orig(); - float3 points[3] = { - v_co_orig, - v_co_orig + sv->dir_side[0] * 0.9f, - v_co_orig + sv->dir_side[1] * 0.9f, - }; - - float3 hit_loc; - for (const float3 &p : points) { - float3 view_vec; - float lambda, ray_depth = FLT_MAX; - - transform_view_vector_calc(t, p, view_vec); - - if (dot_v3v3(view_vec, plane_near) > 0.0f) { - /* Behind the view origin. */ - return false; - } - - if (!isect_ray_plane_v3(p, view_vec, plane_near, &lambda, false)) { - return false; - } - - float3 view_orig = p + view_vec * lambda; - - SnapObjectParams snap_object_params{}; - snap_object_params.snap_target_select = t->tsnap.target_operation; - snap_object_params.edit_mode_type = (t->flag & T_EDIT) != 0 ? SNAP_GEOM_EDIT : SNAP_GEOM_FINAL; - snap_object_params.use_occlusion_test = false; - snap_object_params.use_backface_culling = (t->tsnap.flag & SCE_SNAP_BACKFACE_CULLING) != 0; - - bool has_hit = ED_transform_snap_object_project_ray_ex(sctx, - t->depsgraph, - static_cast(t->view), - &snap_object_params, - view_orig, - -view_vec, - &ray_depth, - hit_loc, - nullptr, - nullptr, - nullptr, - nullptr); - - const bool is_occluded = has_hit && lambda > (ray_depth + 0.0001f); - if (!is_occluded) { - return true; - } - } - return false; -} - /** * Calculate screen-space `mval_start` / `mval_end`, optionally slide direction. */ static void calcEdgeSlide_mval_range(TransInfo *t, + TransDataContainer *tc, EdgeSlideData *sld, + const int *sv_table, const int loop_nr, - const float2 &mval, + const blender::float2 &mval, + const bool use_occlude_geometry, const bool use_calc_direction) { - /* Use for visibility checks. */ - SnapObjectContext *snap_context = nullptr; - bool use_occlude_geometry = false; - float4 plane_near; + TransDataEdgeSlideVert *sv; + BMEditMesh *em = BKE_editmesh_from_object(tc->obedit); + ARegion *region = t->region; + View3D *v3d = nullptr; + BMBVHTree *bmbvh; + + /* only for use_calc_direction */ + float(*loop_dir)[3] = nullptr, *loop_maxdist = nullptr; + + float mval_dir[3], dist_best_sq; + if (t->spacetype == SPACE_VIEW3D) { - View3D *v3d = static_cast(t->area ? t->area->spacedata.first : nullptr); - use_occlude_geometry = (v3d && TRANS_DATA_CONTAINER_FIRST_OK(t)->obedit->dt > OB_WIRE && - !XRAY_ENABLED(v3d)); - planes_from_projmat(t->persmat, nullptr, nullptr, nullptr, nullptr, plane_near, nullptr); - snap_context = ED_transform_snap_object_context_create(t->scene, 0); + /* background mode support */ + v3d = static_cast(t->area ? t->area->spacedata.first : nullptr); } - /* Find mouse vectors, the global one, and one per loop in case we have - * multiple loops selected, in case they are oriented different. */ - float2 mval_dir = float2(0); - float dist_best_sq = FLT_MAX; + const blender::float4x4 projection = edge_slide_projmat_get(t, tc); - /* Only for use_calc_direction. */ - float2 *loop_dir = nullptr; - float *loop_maxdist = nullptr; + if (use_occlude_geometry) { + bmbvh = BKE_bmbvh_new_from_editmesh(em, BMBVH_RESPECT_HIDDEN, nullptr, false); + } + else { + bmbvh = nullptr; + } + + /* find mouse vectors, the global one, and one per loop in case we have + * multiple loops selected, in case they are oriented different */ + zero_v3(mval_dir); + dist_best_sq = -1.0f; if (use_calc_direction) { - loop_dir = static_cast(MEM_callocN(sizeof(float2) * loop_nr, "sv loop_dir")); + loop_dir = static_cast(MEM_callocN(sizeof(float[3]) * loop_nr, "sv loop_dir")); loop_maxdist = static_cast(MEM_mallocN(sizeof(float) * loop_nr, "sv loop_maxdist")); - copy_vn_fl(loop_maxdist, loop_nr, FLT_MAX); + copy_vn_fl(loop_maxdist, loop_nr, -1.0f); } - for (int i : sld->sv.index_range()) { - TransDataEdgeSlideVert *sv = &sld->sv[i]; - bool is_visible = !use_occlude_geometry || - is_vert_slide_visible(t, snap_context, sv, plane_near); + sv = &sld->sv[0]; + for (int i = 0; i < sld->totsv; i++, sv++) { + BMIter iter_other; + BMEdge *e; + BMVert *v = sv->v; - /* This test is only relevant if object is not wire-drawn! See #32068. */ - if (!is_visible && !use_calc_direction) { - continue; - } + UNUSED_VARS_NDEBUG(sv_table); /* silence warning */ + BLI_assert(i == sv_table[BM_elem_index_get(v)]); /* Search cross edges for visible edge to the mouse cursor, * then use the shared vertex to calculate screen vector. */ - /* Screen-space coords. */ - float2 sco_a, sco_b; - sld->project(sv, sco_a, sco_b); + BM_ITER_ELEM (e, &iter_other, v, BM_EDGES_OF_VERT) { + /* screen-space coords */ + float sco_a[3], sco_b[3]; + float dist_sq; + int l_nr; - /* Global direction. */ - float dist_sq = dist_squared_to_line_segment_v2(mval, sco_b, sco_a); - if (is_visible) { - if (dist_sq < dist_best_sq && (len_squared_v2v2(sco_b, sco_a) > 0.1f)) { - dist_best_sq = dist_sq; - mval_dir = sco_b - sco_a; - sld->curr_sv_index = i; + if (BM_elem_flag_test(e, BM_ELEM_SELECT)) { + continue; } - } - if (use_calc_direction) { - /* Per loop direction. */ - int l_nr = sv->loop_nr; - if (dist_sq < loop_maxdist[l_nr]) { - loop_maxdist[l_nr] = dist_sq; - loop_dir[l_nr] = sco_b - sco_a; + /* This test is only relevant if object is not wire-drawn! See #32068. */ + bool is_visible = !use_occlude_geometry || + BMBVH_EdgeVisible(bmbvh, e, t->depsgraph, region, v3d, tc->obedit); + + if (!is_visible && !use_calc_direction) { + continue; + } + + edge_slide_pair_project(sv, region, projection.ptr(), sco_a, sco_b); + + /* global direction */ + dist_sq = dist_squared_to_line_segment_v2(mval, sco_b, sco_a); + if (is_visible) { + if ((dist_best_sq == -1.0f) || + /* intentionally use 2d size on 3d vector */ + (dist_sq < dist_best_sq && (len_squared_v2v2(sco_b, sco_a) > 0.1f))) + { + dist_best_sq = dist_sq; + sub_v3_v3v3(mval_dir, sco_b, sco_a); + } + } + + if (use_calc_direction) { + /* per loop direction */ + l_nr = sv->loop_nr; + if (loop_maxdist[l_nr] == -1.0f || dist_sq < loop_maxdist[l_nr]) { + loop_maxdist[l_nr] = dist_sq; + sub_v3_v3v3(loop_dir[l_nr], sco_b, sco_a); + } } } } if (use_calc_direction) { - for (TransDataEdgeSlideVert &sv : sld->sv) { - /* Switch a/b if loop direction is different from global direction. */ - int l_nr = sv.loop_nr; - if (math::dot(loop_dir[l_nr], mval_dir) < 0.0f) { - swap_v3_v3(sv.dir_side[0], sv.dir_side[1]); + int i; + sv = &sld->sv[0]; + for (i = 0; i < sld->totsv; i++, sv++) { + /* switch a/b if loop direction is different from global direction */ + int l_nr = sv->loop_nr; + if (dot_v3v3(loop_dir[l_nr], mval_dir) < 0.0f) { + swap_v3_v3(sv->dir_side[0], sv->dir_side[1]); + std::swap(sv->v_side[0], sv->v_side[1]); } } @@ -323,62 +481,585 @@ static void calcEdgeSlide_mval_range(TransInfo *t, edge_slide_data_init_mval(&t->mouse, sld, mval_dir); - if (snap_context) { - ED_transform_snap_object_context_destroy(snap_context); + if (bmbvh) { + BKE_bmbvh_free(bmbvh); } } -static EdgeSlideData *createEdgeSlideVerts(TransInfo *t, - TransDataContainer *tc, - const bool use_double_side) +static void calcEdgeSlide_even(TransInfo *t, + TransDataContainer *tc, + EdgeSlideData *sld, + const blender::float2 &mval) { - int group_len; - EdgeSlideData *sld = MEM_new("sld"); - if (t->data_type == &TransConvertType_MeshUV) { - sld->sv = transform_mesh_uv_edge_slide_data_create(t, tc, &group_len); + TransDataEdgeSlideVert *sv = sld->sv; + + if (sld->totsv > 0) { + ARegion *region = t->region; + + int i = 0; + + float dist_min_sq = FLT_MAX; + + const blender::float4x4 projection = edge_slide_projmat_get(t, tc); + + for (i = 0; i < sld->totsv; i++, sv++) { + /* Set length */ + sv->edge_len = len_v3v3(sv->dir_side[0], sv->dir_side[1]); + + const blender::float2 v_proj = ED_view3d_project_float_v2_m4(region, sv->v->co, projection); + const float dist_sq = len_squared_v2v2(mval, v_proj); + if (dist_sq < dist_min_sq) { + dist_min_sq = dist_sq; + sld->curr_sv_index = i; + } + } } else { - sld->sv = transform_mesh_edge_slide_data_create(tc, &group_len); + sld->curr_sv_index = 0; } +} - if (sld->sv.is_empty()) { - MEM_delete(sld); - return nullptr; - } +static EdgeSlideData *createEdgeSlideVerts_double_side(TransInfo *t, TransDataContainer *tc) +{ + BMEditMesh *em = BKE_editmesh_from_object(tc->obedit); + BMesh *bm = em->bm; + BMIter iter; + BMEdge *e; + BMVert *v; + TransDataEdgeSlideVert *sv_array; + int sv_tot; + int *sv_table; /* BMVert -> sv_array index */ + EdgeSlideData *sld = static_cast(MEM_callocN(sizeof(*sld), "sld")); + int numsel, i, loop_nr; + bool use_occlude_geometry = false; + View3D *v3d = nullptr; + RegionView3D *rv3d = nullptr; - if (!use_double_side) { - /* Single Side Case. - * Used by #MESH_OT_offset_edge_loops_slide. - * It only slides to the side with the longest length. */ - struct TMP { - float2 accum; - int count; - } zero{}; + sld->curr_sv_index = 0; - Array array_len(group_len, zero); - for (TransDataEdgeSlideVert &sv : sld->sv) { - array_len[sv.loop_nr].accum += float2(math::length(sv.dir_side[0]), - math::length(sv.dir_side[1])); - array_len[sv.loop_nr].count++; - } + /* Ensure valid selection. */ + BM_ITER_MESH (v, &iter, bm, BM_VERTS_OF_MESH) { + if (BM_elem_flag_test(v, BM_ELEM_SELECT)) { + BMIter iter2; + numsel = 0; + BM_ITER_ELEM (e, &iter2, v, BM_EDGES_OF_VERT) { + if (BM_elem_flag_test(e, BM_ELEM_SELECT)) { + /* BMESH_TODO: this is probably very evil, + * set `v->e` to a selected edge. */ + v->e = e; - for (TMP &accum : array_len) { - accum.accum /= accum.count; - } - - for (TransDataEdgeSlideVert &sv : sld->sv) { - if (array_len[sv.loop_nr].accum[1] > array_len[sv.loop_nr].accum[0]) { - sv.dir_side[0] = sv.dir_side[1]; + numsel++; + } + } + + if (numsel == 0 || numsel > 2) { + /* Invalid edge selection. */ + MEM_freeN(sld); + return nullptr; } - sv.dir_side[1] = float3(0); - sv.edge_len = math::length(sv.dir_side[0]); } } + BM_ITER_MESH (e, &iter, bm, BM_EDGES_OF_MESH) { + if (BM_elem_flag_test(e, BM_ELEM_SELECT)) { + /* NOTE: any edge with loops can work, but we won't get predictable results, so bail out. */ + if (!BM_edge_is_manifold(e) && !BM_edge_is_boundary(e)) { + /* can edges with at least once face user */ + MEM_freeN(sld); + return nullptr; + } + } + } + + sv_table = static_cast(MEM_mallocN(sizeof(*sv_table) * bm->totvert, __func__)); + +#define INDEX_UNSET -1 +#define INDEX_INVALID -2 + + { + int j = 0; + BM_ITER_MESH_INDEX (v, &iter, bm, BM_VERTS_OF_MESH, i) { + if (BM_elem_flag_test(v, BM_ELEM_SELECT)) { + BM_elem_flag_enable(v, BM_ELEM_TAG); + sv_table[i] = INDEX_UNSET; + j += 1; + } + else { + BM_elem_flag_disable(v, BM_ELEM_TAG); + sv_table[i] = INDEX_INVALID; + } + BM_elem_index_set(v, i); /* set_inline */ + } + bm->elem_index_dirty &= ~BM_VERT; + + if (!j) { + MEM_freeN(sld); + MEM_freeN(sv_table); + return nullptr; + } + sv_tot = j; + } + + sv_array = static_cast( + MEM_callocN(sizeof(TransDataEdgeSlideVert) * sv_tot, "sv_array")); + loop_nr = 0; + + STACK_DECLARE(sv_array); + STACK_INIT(sv_array, sv_tot); + + while (true) { + float vec_a[3], vec_b[3]; + BMLoop *l_a, *l_b; + BMLoop *l_a_prev, *l_b_prev; + BMVert *v_first; +/* If this succeeds call get_next_loop() + * which calculates the direction to slide based on clever checks. + * + * otherwise we simply use 'e_dir' as an edge-rail. + * (which is better when the attached edge is a boundary, see: #40422) + */ +#define EDGESLIDE_VERT_IS_INNER(v, e_dir) \ +\ + ((BM_edge_is_boundary(e_dir) == false) && (BM_vert_edge_count_nonwire(v) == 2)) + + v = nullptr; + BM_ITER_MESH (v, &iter, bm, BM_VERTS_OF_MESH) { + if (BM_elem_flag_test(v, BM_ELEM_TAG)) { + break; + } + } + + if (!v) { + break; + } + + if (!v->e) { + continue; + } + + v_first = v; + + /* Walk along the edge loop. */ + e = v->e; + + /* First, rewind. */ + do { + e = get_other_edge(v, e); + if (!e) { + e = v->e; + break; + } + + if (!BM_elem_flag_test(BM_edge_other_vert(e, v), BM_ELEM_TAG)) { + break; + } + + v = BM_edge_other_vert(e, v); + } while (e != v_first->e); + + BM_elem_flag_disable(v, BM_ELEM_TAG); + + l_a = e->l; + l_b = e->l->radial_next; + + /* regarding e_next, use get_next_loop()'s improved interpolation where possible */ + { + BMEdge *e_next = get_other_edge(v, e); + if (e_next) { + get_next_loop(v, l_a, e, e_next, vec_a); + } + else { + BMLoop *l_tmp = BM_loop_other_edge_loop(l_a, v); + if (EDGESLIDE_VERT_IS_INNER(v, l_tmp->e)) { + get_next_loop(v, l_a, e, l_tmp->e, vec_a); + } + else { + sub_v3_v3v3(vec_a, BM_edge_other_vert(l_tmp->e, v)->co, v->co); + } + } + } + + /* Equivalent to `!BM_edge_is_boundary(e)`. */ + if (l_b != l_a) { + BMEdge *e_next = get_other_edge(v, e); + if (e_next) { + get_next_loop(v, l_b, e, e_next, vec_b); + } + else { + BMLoop *l_tmp = BM_loop_other_edge_loop(l_b, v); + if (EDGESLIDE_VERT_IS_INNER(v, l_tmp->e)) { + get_next_loop(v, l_b, e, l_tmp->e, vec_b); + } + else { + sub_v3_v3v3(vec_b, BM_edge_other_vert(l_tmp->e, v)->co, v->co); + } + } + } + else { + l_b = nullptr; + } + + l_a_prev = nullptr; + l_b_prev = nullptr; + +#define SV_FROM_VERT(v) \ +\ + ((sv_table[BM_elem_index_get(v)] == INDEX_UNSET) ? \ + ((void)(sv_table[BM_elem_index_get(v)] = STACK_SIZE(sv_array)), \ +\ + STACK_PUSH_RET_PTR(sv_array)) : \ +\ + (&sv_array[sv_table[BM_elem_index_get(v)]])) + + /* Iterate over the loop. */ + v_first = v; + do { + bool l_a_ok_prev; + bool l_b_ok_prev; + TransDataEdgeSlideVert *sv; + BMVert *v_prev; + BMEdge *e_prev; + + /* XXX, 'sv' will initialize multiple times, this is suspicious. see #34024. */ + BLI_assert(v != nullptr); + BLI_assert(sv_table[BM_elem_index_get(v)] != INDEX_INVALID); + sv = SV_FROM_VERT(v); + sv->v = v; + copy_v3_v3(sv->v_co_orig, v->co); + sv->loop_nr = loop_nr; + + if (l_a || l_a_prev) { + BMLoop *l_tmp = BM_loop_other_edge_loop(l_a ? l_a : l_a_prev, v); + sv->v_side[0] = BM_edge_other_vert(l_tmp->e, v); + copy_v3_v3(sv->dir_side[0], vec_a); + } + + if (l_b || l_b_prev) { + BMLoop *l_tmp = BM_loop_other_edge_loop(l_b ? l_b : l_b_prev, v); + sv->v_side[1] = BM_edge_other_vert(l_tmp->e, v); + copy_v3_v3(sv->dir_side[1], vec_b); + } + + v_prev = v; + v = BM_edge_other_vert(e, v); + + e_prev = e; + e = get_other_edge(v, e); + + if (!e) { + BLI_assert(v != nullptr); + + BLI_assert(sv_table[BM_elem_index_get(v)] != INDEX_INVALID); + sv = SV_FROM_VERT(v); + + sv->v = v; + copy_v3_v3(sv->v_co_orig, v->co); + sv->loop_nr = loop_nr; + + if (l_a) { + BMLoop *l_tmp = BM_loop_other_edge_loop(l_a, v); + sv->v_side[0] = BM_edge_other_vert(l_tmp->e, v); + if (EDGESLIDE_VERT_IS_INNER(v, l_tmp->e)) { + get_next_loop(v, l_a, e_prev, l_tmp->e, sv->dir_side[0]); + } + else { + sub_v3_v3v3(sv->dir_side[0], sv->v_side[0]->co, v->co); + } + } + + if (l_b) { + BMLoop *l_tmp = BM_loop_other_edge_loop(l_b, v); + sv->v_side[1] = BM_edge_other_vert(l_tmp->e, v); + if (EDGESLIDE_VERT_IS_INNER(v, l_tmp->e)) { + get_next_loop(v, l_b, e_prev, l_tmp->e, sv->dir_side[1]); + } + else { + sub_v3_v3v3(sv->dir_side[1], sv->v_side[1]->co, v->co); + } + } + + BM_elem_flag_disable(v, BM_ELEM_TAG); + BM_elem_flag_disable(v_prev, BM_ELEM_TAG); + + break; + } + l_a_ok_prev = (l_a != nullptr); + l_b_ok_prev = (l_b != nullptr); + + l_a_prev = l_a; + l_b_prev = l_b; + + if (l_a) { + l_a = get_next_loop(v, l_a, e_prev, e, vec_a); + } + else { + zero_v3(vec_a); + } + + if (l_b) { + l_b = get_next_loop(v, l_b, e_prev, e, vec_b); + } + else { + zero_v3(vec_b); + } + + if (l_a && l_b) { + /* pass */ + } + else { + if (l_a || l_b) { + /* find the opposite loop if it was missing previously */ + if (l_a == nullptr && l_b && (l_b->radial_next != l_b)) { + l_a = l_b->radial_next; + } + else if (l_b == nullptr && l_a && (l_a->radial_next != l_a)) { + l_b = l_a->radial_next; + } + } + else if (e->l != nullptr) { + /* if there are non-contiguous faces, we can still recover + * the loops of the new edges faces */ + + /* NOTE:, the behavior in this case means edges may move in opposite directions, + * this could be made to work more usefully. */ + + if (l_a_ok_prev) { + l_a = e->l; + l_b = (l_a->radial_next != l_a) ? l_a->radial_next : nullptr; + } + else if (l_b_ok_prev) { + l_b = e->l; + l_a = (l_b->radial_next != l_b) ? l_b->radial_next : nullptr; + } + } + + if (!l_a_ok_prev && l_a) { + get_next_loop(v, l_a, e, e_prev, vec_a); + } + if (!l_b_ok_prev && l_b) { + get_next_loop(v, l_b, e, e_prev, vec_b); + } + } + + BM_elem_flag_disable(v, BM_ELEM_TAG); + BM_elem_flag_disable(v_prev, BM_ELEM_TAG); + } while ((e != v_first->e) && (l_a || l_b)); + +#undef SV_FROM_VERT +#undef INDEX_UNSET +#undef INDEX_INVALID + + loop_nr++; + +#undef EDGESLIDE_VERT_IS_INNER + } + + // EDBM_flag_disable_all(em, BM_ELEM_SELECT); + + BLI_assert(STACK_SIZE(sv_array) == uint(sv_tot)); + + sld->sv = sv_array; + sld->totsv = sv_tot; + + /* use for visibility checks */ + if (t->spacetype == SPACE_VIEW3D) { + v3d = static_cast(t->area ? t->area->spacedata.first : nullptr); + rv3d = static_cast(t->region ? t->region->regiondata : nullptr); + use_occlude_geometry = (v3d && TRANS_DATA_CONTAINER_FIRST_OK(t)->obedit->dt > OB_WIRE && + !XRAY_ENABLED(v3d)); + } + + calcEdgeSlide_mval_range(t, tc, sld, sv_table, loop_nr, t->mval, use_occlude_geometry, true); + + if (rv3d) { + calcEdgeSlide_even(t, tc, sld, t->mval); + } + + MEM_freeN(sv_table); + + return sld; +} + +/** + * A simple version of #createEdgeSlideVerts_double_side + * Which assumes the longest unselected. + */ +static EdgeSlideData *createEdgeSlideVerts_single_side(TransInfo *t, TransDataContainer *tc) +{ + BMEditMesh *em = BKE_editmesh_from_object(tc->obedit); + BMesh *bm = em->bm; + BMIter iter; + BMEdge *e; + TransDataEdgeSlideVert *sv_array; + int sv_tot; + int *sv_table; /* BMVert -> sv_array index */ + EdgeSlideData *sld = static_cast(MEM_callocN(sizeof(*sld), "sld")); + int loop_nr; + bool use_occlude_geometry = false; + View3D *v3d = nullptr; + RegionView3D *rv3d = nullptr; + + if (t->spacetype == SPACE_VIEW3D) { + /* background mode support */ + v3d = static_cast(t->area ? t->area->spacedata.first : nullptr); + rv3d = static_cast(t->region ? t->region->regiondata : nullptr); + } + sld->curr_sv_index = 0; - sld->update_proj_mat(t, tc); + /* ensure valid selection */ + { + int i = 0, j = 0; + BMVert *v; - calcEdgeSlide_mval_range(t, sld, group_len, t->mval, use_double_side); + BM_ITER_MESH_INDEX (v, &iter, bm, BM_VERTS_OF_MESH, i) { + if (BM_elem_flag_test(v, BM_ELEM_SELECT)) { + float len_sq_max = -1.0f; + BMIter iter2; + BM_ITER_ELEM (e, &iter2, v, BM_EDGES_OF_VERT) { + if (!BM_elem_flag_test(e, BM_ELEM_SELECT)) { + float len_sq = BM_edge_calc_length_squared(e); + if (len_sq > len_sq_max) { + len_sq_max = len_sq; + v->e = e; + } + } + } + + if (len_sq_max != -1.0f) { + j++; + } + } + BM_elem_index_set(v, i); /* set_inline */ + } + bm->elem_index_dirty &= ~BM_VERT; + + if (!j) { + MEM_freeN(sld); + return nullptr; + } + + sv_tot = j; + } + + BLI_assert(sv_tot != 0); + /* over alloc */ + sv_array = static_cast( + MEM_callocN(sizeof(TransDataEdgeSlideVert) * bm->totvertsel, "sv_array")); + + /* Same loop for all loops, weak but we don't connect loops in this case. */ + loop_nr = 1; + + sv_table = static_cast(MEM_mallocN(sizeof(*sv_table) * bm->totvert, __func__)); + + { + int i = 0, j = 0; + BMVert *v; + + BM_ITER_MESH_INDEX (v, &iter, bm, BM_VERTS_OF_MESH, i) { + sv_table[i] = -1; + if ((v->e != nullptr) && BM_elem_flag_test(v, BM_ELEM_SELECT)) { + if (BM_elem_flag_test(v->e, BM_ELEM_SELECT) == 0) { + TransDataEdgeSlideVert *sv; + sv = &sv_array[j]; + sv->v = v; + copy_v3_v3(sv->v_co_orig, v->co); + sv->v_side[0] = BM_edge_other_vert(v->e, v); + sub_v3_v3v3(sv->dir_side[0], sv->v_side[0]->co, v->co); + sv->loop_nr = 0; + sv_table[i] = j; + j += 1; + } + } + } + } + + /* check for wire vertices, + * interpolate the directions of wire verts between non-wire verts */ + if (sv_tot != bm->totvert) { + const int sv_tot_nowire = sv_tot; + TransDataEdgeSlideVert *sv_iter = sv_array; + + for (int i = 0; i < sv_tot_nowire; i++, sv_iter++) { + BMIter eiter; + BM_ITER_ELEM (e, &eiter, sv_iter->v, BM_EDGES_OF_VERT) { + /* walk over wire */ + TransDataEdgeSlideVert *sv_end = nullptr; + BMEdge *e_step = e; + BMVert *v = sv_iter->v; + int j; + + j = sv_tot; + + while (true) { + BMVert *v_other = BM_edge_other_vert(e_step, v); + int endpoint = ((sv_table[BM_elem_index_get(v_other)] != -1) + + (BM_vert_is_edge_pair(v_other) == false)); + + if ((BM_elem_flag_test(e_step, BM_ELEM_SELECT) && + BM_elem_flag_test(v_other, BM_ELEM_SELECT)) && + (endpoint == 0)) + { + /* scan down the list */ + TransDataEdgeSlideVert *sv; + BLI_assert(sv_table[BM_elem_index_get(v_other)] == -1); + sv_table[BM_elem_index_get(v_other)] = j; + sv = &sv_array[j]; + sv->v = v_other; + copy_v3_v3(sv->v_co_orig, v_other->co); + copy_v3_v3(sv->dir_side[0], sv_iter->dir_side[0]); + j++; + + /* advance! */ + v = v_other; + e_step = BM_DISK_EDGE_NEXT(e_step, v_other); + } + else { + if ((endpoint == 2) && (sv_tot != j)) { + BLI_assert(BM_elem_index_get(v_other) != -1); + sv_end = &sv_array[sv_table[BM_elem_index_get(v_other)]]; + } + break; + } + } + + if (sv_end) { + int sv_tot_prev = sv_tot; + const float *co_src = sv_iter->v->co; + const float *co_dst = sv_end->v->co; + const float *dir_src = sv_iter->dir_side[0]; + const float *dir_dst = sv_end->dir_side[0]; + sv_tot = j; + + while (j-- != sv_tot_prev) { + float factor; + factor = line_point_factor_v3(sv_array[j].v->co, co_src, co_dst); + interp_v3_v3v3(sv_array[j].dir_side[0], dir_src, dir_dst, factor); + } + } + } + } + } + + // EDBM_flag_disable_all(em, BM_ELEM_SELECT); + + sld->sv = sv_array; + sld->totsv = sv_tot; + + /* use for visibility checks */ + if (t->spacetype == SPACE_VIEW3D) { + v3d = static_cast(t->area ? t->area->spacedata.first : nullptr); + rv3d = static_cast(t->region ? t->region->regiondata : nullptr); + use_occlude_geometry = (v3d && TRANS_DATA_CONTAINER_FIRST_OK(t)->obedit->dt > OB_WIRE && + !XRAY_ENABLED(v3d)); + } + + calcEdgeSlide_mval_range(t, tc, sld, sv_table, loop_nr, t->mval, use_occlude_geometry, false); + + if (rv3d) { + calcEdgeSlide_even(t, tc, sld, t->mval); + } + + MEM_freeN(sv_table); return sld; } @@ -393,7 +1074,8 @@ static void freeEdgeSlideVerts(TransInfo * /*t*/, return; } - MEM_delete(sld); + MEM_freeN(sld->sv); + MEM_freeN(sld); custom_data->data = nullptr; } @@ -419,7 +1101,7 @@ static eRedrawFlag handleEventEdgeSlide(TransInfo *t, const wmEvent *event) } break; case EVT_CKEY: - /* Use like a modifier key. */ + /* use like a modifier key */ if (event->val == KM_PRESS) { t->flag ^= T_ALT_TRANSFORM; calcEdgeSlideCustomPoints(t); @@ -452,52 +1134,48 @@ static void drawEdgeSlide(TransInfo *t) GPU_blend(GPU_BLEND_ALPHA); - if (t->spacetype == SPACE_VIEW3D) { - GPU_matrix_push(); - GPU_matrix_mul(TRANS_DATA_CONTAINER_FIRST_OK(t)->obedit->object_to_world().ptr()); - } + GPU_matrix_push(); + GPU_matrix_mul(TRANS_DATA_CONTAINER_FIRST_OK(t)->obedit->object_to_world); uint pos = GPU_vertformat_attr_add(immVertexFormat(), "pos", GPU_COMP_F32, 3, GPU_FETCH_FLOAT); immBindBuiltinProgram(GPU_SHADER_3D_UNIFORM_COLOR); - TransDataEdgeSlideVert *curr_sv = &sld->sv[sld->curr_sv_index]; - const float3 &curr_sv_co_orig = curr_sv->v_co_orig(); - if (slp->use_even == true) { - /* Even mode. */ + /* Even mode */ float co_a[3], co_b[3], co_mark[3]; + TransDataEdgeSlideVert *curr_sv = &sld->sv[sld->curr_sv_index]; const float fac = (slp->perc + 1.0f) / 2.0f; const float ctrl_size = UI_GetThemeValuef(TH_FACEDOT_SIZE) + 1.5f; const float guide_size = ctrl_size - 0.5f; const int alpha_shade = -30; - add_v3_v3v3(co_a, curr_sv_co_orig, curr_sv->dir_side[0]); - add_v3_v3v3(co_b, curr_sv_co_orig, curr_sv->dir_side[1]); + add_v3_v3v3(co_a, curr_sv->v_co_orig, curr_sv->dir_side[0]); + add_v3_v3v3(co_b, curr_sv->v_co_orig, curr_sv->dir_side[1]); GPU_line_width(line_size); immUniformThemeColorShadeAlpha(TH_EDGE_SELECT, 80, alpha_shade); immBeginAtMost(GPU_PRIM_LINES, 4); - if (!math::is_zero(curr_sv->dir_side[0])) { - immVertex3fv(pos, co_a); - immVertex3fv(pos, curr_sv_co_orig); + if (curr_sv->v_side[0]) { + immVertex3fv(pos, curr_sv->v_side[0]->co); + immVertex3fv(pos, curr_sv->v_co_orig); } - if (!math::is_zero(curr_sv->dir_side[1])) { - immVertex3fv(pos, co_b); - immVertex3fv(pos, curr_sv_co_orig); + if (curr_sv->v_side[1]) { + immVertex3fv(pos, curr_sv->v_side[1]->co); + immVertex3fv(pos, curr_sv->v_co_orig); } immEnd(); { float *co_test = nullptr; if (slp->flipped) { - if (!math::is_zero(curr_sv->dir_side[1])) { - co_test = co_b; + if (curr_sv->v_side[1]) { + co_test = curr_sv->v_side[1]->co; } } else { - if (!math::is_zero(curr_sv->dir_side[0])) { - co_test = co_a; + if (curr_sv->v_side[0]) { + co_test = curr_sv->v_side[0]->co; } } @@ -513,35 +1191,36 @@ static void drawEdgeSlide(TransInfo *t) immUniformThemeColorShadeAlpha(TH_SELECT, 255, alpha_shade); GPU_point_size(guide_size); immBegin(GPU_PRIM_POINTS, 1); - interp_line_v3_v3v3v3(co_mark, co_b, curr_sv_co_orig, co_a, fac); + interp_line_v3_v3v3v3(co_mark, co_b, curr_sv->v_co_orig, co_a, fac); immVertex3fv(pos, co_mark); immEnd(); } else if (is_clamp == false) { const int side_index = slp->curr_side_unclamp; + TransDataEdgeSlideVert *sv; + int i; const int alpha_shade = -160; GPU_line_width(line_size); immUniformThemeColorShadeAlpha(TH_EDGE_SELECT, 80, alpha_shade); - immBegin(GPU_PRIM_LINES, sld->sv.size() * 2); + immBegin(GPU_PRIM_LINES, sld->totsv * 2); /* TODO(@ideasman42): Loop over all verts. */ - for (TransDataEdgeSlideVert &sv : sld->sv) { + sv = sld->sv; + for (i = 0; i < sld->totsv; i++, sv++) { float a[3], b[3]; - if (!is_zero_v3(sv.dir_side[side_index])) { - copy_v3_v3(a, sv.dir_side[side_index]); + if (!is_zero_v3(sv->dir_side[side_index])) { + copy_v3_v3(a, sv->dir_side[side_index]); } else { - copy_v3_v3(a, sv.dir_side[!side_index]); + copy_v3_v3(a, sv->dir_side[!side_index]); } mul_v3_fl(a, 100.0f); negate_v3_v3(b, a); - - const float3 &sv_co_orig = sv.v_co_orig(); - add_v3_v3(a, sv_co_orig); - add_v3_v3(b, sv_co_orig); + add_v3_v3(a, sv->v_co_orig); + add_v3_v3(b, sv->v_co_orig); immVertex3fv(pos, a); immVertex3fv(pos, b); @@ -550,27 +1229,27 @@ static void drawEdgeSlide(TransInfo *t) } else { /* Common case. */ + TransDataEdgeSlideVert *curr_sv = &sld->sv[sld->curr_sv_index]; const int alpha_shade = -160; float co_dir[3]; - add_v3_v3v3(co_dir, curr_sv_co_orig, curr_sv->dir_side[slp->curr_side_unclamp]); + add_v3_v3v3(co_dir, curr_sv->v_co_orig, curr_sv->dir_side[slp->curr_side_unclamp]); GPU_line_width(line_size); immUniformThemeColorShadeAlpha(TH_EDGE_SELECT, 80, alpha_shade); immBeginAtMost(GPU_PRIM_LINES, 2); - immVertex3fv(pos, curr_sv_co_orig); + immVertex3fv(pos, curr_sv->v_co_orig); immVertex3fv(pos, co_dir); immEnd(); } immUnbindProgram(); - if (t->spacetype == SPACE_VIEW3D) { - GPU_matrix_pop(); - GPU_depth_test(GPU_DEPTH_LESS_EQUAL); - } + GPU_matrix_pop(); GPU_blend(GPU_BLEND_NONE); + + GPU_depth_test(GPU_DEPTH_LESS_EQUAL); } static void edge_slide_snap_apply(TransInfo *t, float *value) @@ -579,11 +1258,11 @@ static void edge_slide_snap_apply(TransInfo *t, float *value) EdgeSlideParams *slp = static_cast(t->custom.mode.data); EdgeSlideData *sld_active = static_cast(tc->custom.mode.data); TransDataEdgeSlideVert *sv = &sld_active->sv[sld_active->curr_sv_index]; - float3 co_orig, co_dest[2], dvec, snap_point; - co_orig = sv->v_co_orig(); - co_dest[0] = co_orig + sv->dir_side[0]; - co_dest[1] = co_orig + sv->dir_side[1]; + float snap_point[3], co_orig[3], co_dest[2][3], dvec[3]; + copy_v3_v3(co_orig, sv->v_co_orig); + add_v3_v3v3(co_dest[0], co_orig, sv->dir_side[0]); + add_v3_v3v3(co_dest[1], co_orig, sv->dir_side[1]); if (tc->use_local_mat) { mul_m4_v3(tc->mat, co_orig); mul_m4_v3(tc->mat, co_dest[0]); @@ -603,10 +1282,7 @@ static void edge_slide_snap_apply(TransInfo *t, float *value) side_index = perc < 0.0f; } else { - /* Use the side indicated in `EdgeSlideParams::curr_side_unclamp` as long as that side is not - * zero length. */ - side_index = int(slp->curr_side_unclamp == - !math::is_zero(sv->dir_side[slp->curr_side_unclamp])); + side_index = slp->curr_side_unclamp; } } else { @@ -659,7 +1335,7 @@ static void edge_slide_snap_apply(TransInfo *t, float *value) *value = perc; } -static void edge_slide_apply_elem(const TransDataEdgeSlideVert &sv, +static void edge_slide_apply_elem(const TransDataEdgeSlideVert *sv, const float fac, const float curr_length_fac, const int curr_side_unclamp, @@ -668,21 +1344,21 @@ static void edge_slide_apply_elem(const TransDataEdgeSlideVert &sv, const bool use_flip, float r_co[3]) { - copy_v3_v3(r_co, sv.v_co_orig()); + copy_v3_v3(r_co, sv->v_co_orig); if (use_even == false) { if (use_clamp) { const int side_index = (fac < 0.0f); const float fac_final = fabsf(fac); - madd_v3_v3fl(r_co, sv.dir_side[side_index], fac_final); + madd_v3_v3fl(r_co, sv->dir_side[side_index], fac_final); } else { int side_index = curr_side_unclamp; - if (is_zero_v3(sv.dir_side[side_index])) { - side_index = int(!side_index); + if (is_zero_v3(sv->dir_side[side_index])) { + side_index = !side_index; } const float fac_final = (side_index == (fac < 0.0f) ? fabsf(fac) : -fabsf(fac)); - madd_v3_v3fl(r_co, sv.dir_side[side_index], fac_final); + madd_v3_v3fl(r_co, sv->dir_side[side_index], fac_final); } } else { @@ -696,18 +1372,18 @@ static void edge_slide_apply_elem(const TransDataEdgeSlideVert &sv, * is the same as the distance between the original vert locations, * same goes for the lines below. */ - if (sv.edge_len > FLT_EPSILON) { + if (sv->edge_len > FLT_EPSILON) { float co_a[3], co_b[3]; - const float fac_final = min_ff(sv.edge_len, curr_length_fac) / sv.edge_len; + const float fac_final = min_ff(sv->edge_len, curr_length_fac) / sv->edge_len; - add_v3_v3v3(co_a, r_co, sv.dir_side[0]); - add_v3_v3v3(co_b, r_co, sv.dir_side[1]); + add_v3_v3v3(co_a, sv->v_co_orig, sv->dir_side[0]); + add_v3_v3v3(co_b, sv->v_co_orig, sv->dir_side[1]); if (use_flip) { - interp_line_v3_v3v3v3(r_co, co_b, r_co, co_a, fac_final); + interp_line_v3_v3v3v3(r_co, co_b, sv->v_co_orig, co_a, fac_final); } else { - interp_line_v3_v3v3v3(r_co, co_a, r_co, co_b, fac_final); + interp_line_v3_v3v3v3(r_co, co_a, sv->v_co_orig, co_b, fac_final); } } } @@ -741,9 +1417,10 @@ static void doEdgeSlide(TransInfo *t, float perc) continue; } - for (TransDataEdgeSlideVert &sv : sld->sv) { + TransDataEdgeSlideVert *sv = sld->sv; + for (int i = 0; i < sld->totsv; i++, sv++) { edge_slide_apply_elem( - sv, perc, curr_length_fac, curr_side_unclamp, use_clamp, use_even, use_flip, sv.td->loc); + sv, perc, curr_length_fac, curr_side_unclamp, use_clamp, use_even, use_flip, sv->v->co); } } } @@ -766,7 +1443,7 @@ static void applyEdgeSlide(TransInfo *t) transform_snap_increment(t, &final); } - /* Only do this so out of range values are not displayed. */ + /* only do this so out of range values are not displayed */ if (is_constrained) { CLAMP(final, -1.0f, 1.0f); } @@ -775,7 +1452,7 @@ static void applyEdgeSlide(TransInfo *t) t->values_final[0] = final; - /* Header string. */ + /* header string */ ofs += BLI_strncpy_rlen(str + ofs, RPT_("Edge Slide: "), sizeof(str) - ofs); if (hasNumInput(&t->num)) { char c[NUM_STR_REP_LEN]; @@ -793,9 +1470,9 @@ static void applyEdgeSlide(TransInfo *t) } ofs += BLI_snprintf_rlen( str + ofs, sizeof(str) - ofs, RPT_("Alt or (C)lamp: %s"), WM_bool_as_string(is_clamp)); - /* Done with header string. */ + /* done with header string */ - /* Do stuff here. */ + /* do stuff here */ doEdgeSlide(t, final); recalc_data(t); @@ -810,14 +1487,14 @@ static void edge_slide_transform_matrix_fn(TransInfo *t, float mat_xform[4][4]) EdgeSlideParams *slp = static_cast(t->custom.mode.data); TransDataContainer *tc = edge_slide_container_first_ok(t); EdgeSlideData *sld_active = static_cast(tc->custom.mode.data); - TransDataEdgeSlideVert &sv_active = sld_active->sv[sld_active->curr_sv_index]; + TransDataEdgeSlideVert *sv_active = &sld_active->sv[sld_active->curr_sv_index]; - copy_v3_v3(orig_co, sv_active.v_co_orig()); + copy_v3_v3(orig_co, sv_active->v_co_orig); const float fac = t->values_final[0]; float curr_length_fac = 0.0f; if (slp->use_even) { - curr_length_fac = sv_active.edge_len * (((slp->flipped ? fac : -fac) + 1.0f) / 2.0f); + curr_length_fac = sv_active->edge_len * (((slp->flipped ? fac : -fac) + 1.0f) / 2.0f); } edge_slide_apply_elem(sv_active, @@ -850,7 +1527,7 @@ static void initEdgeSlide_ex( EdgeSlideParams *slp = static_cast(MEM_callocN(sizeof(*slp), __func__)); slp->use_even = use_even; slp->flipped = flipped; - /* Happens to be best for single-sided. */ + /* happens to be best for single-sided */ if (use_double_side == false) { slp->flipped = !flipped; } @@ -865,7 +1542,8 @@ static void initEdgeSlide_ex( } FOREACH_TRANS_DATA_CONTAINER (t, tc) { - sld = createEdgeSlideVerts(t, tc, use_double_side); + sld = use_double_side ? createEdgeSlideVerts_double_side(t, tc) : + createEdgeSlideVerts_single_side(t, tc); if (sld) { tc->custom.mode.data = sld; tc->custom.mode.free_cb = freeEdgeSlideVerts; @@ -878,7 +1556,7 @@ static void initEdgeSlide_ex( return; } - /* Set custom point first if you want value to be initialized by init. */ + /* set custom point first if you want value to be initialized by init */ calcEdgeSlideCustomPoints(t); initMouseInputMode(t, &t->mouse, INPUT_CUSTOM_RATIO_FLIP); @@ -915,15 +1593,18 @@ static void initEdgeSlide(TransInfo *t, wmOperator *op) void transform_mode_edge_slide_reproject_input(TransInfo *t) { + ARegion *region = t->region; + FOREACH_TRANS_DATA_CONTAINER (t, tc) { EdgeSlideData *sld = static_cast(tc->custom.mode.data); if (sld) { - sld->update_proj_mat(t, tc); + const blender::float4x4 projection = edge_slide_projmat_get(t, tc); + TransDataEdgeSlideVert *curr_sv = &sld->sv[sld->curr_sv_index]; - float2 sco_a, sco_b; - sld->project(curr_sv, sco_a, sco_b); - float2 mval_dir = sco_b - sco_a; + float mval_dir[3], sco_a[3], sco_b[3]; + edge_slide_pair_project(curr_sv, region, projection.ptr(), sco_a, sco_b); + sub_v3_v3v3(mval_dir, sco_b, sco_a); edge_slide_data_init_mval(&t->mouse, sld, mval_dir); } } diff --git a/source/blender/editors/transform/transform_mode_gpopacity.cc b/source/blender/editors/transform/transform_mode_gpopacity.cc index d9dc7bd25dd..483738e49f1 100644 --- a/source/blender/editors/transform/transform_mode_gpopacity.cc +++ b/source/blender/editors/transform/transform_mode_gpopacity.cc @@ -11,6 +11,7 @@ #include "BLI_math_vector.h" #include "BLI_string.h" +#include "BKE_context.hh" #include "BKE_unit.hh" #include "DNA_gpencil_legacy_types.h" @@ -19,7 +20,7 @@ #include "UI_interface.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "transform.hh" #include "transform_convert.hh" @@ -45,7 +46,7 @@ static void applyGPOpacity(TransInfo *t) t->values_final[0] = ratio; - /* Header print for NumInput. */ + /* header print for NumInput */ if (hasNumInput(&t->num)) { char c[NUM_STR_REP_LEN]; diff --git a/source/blender/editors/transform/transform_mode_gpshrinkfatten.cc b/source/blender/editors/transform/transform_mode_gpshrinkfatten.cc index 1211ddd9625..6b59c279be9 100644 --- a/source/blender/editors/transform/transform_mode_gpshrinkfatten.cc +++ b/source/blender/editors/transform/transform_mode_gpshrinkfatten.cc @@ -11,6 +11,7 @@ #include "BLI_math_vector.h" #include "BLI_string.h" +#include "BKE_context.hh" #include "BKE_unit.hh" #include "DNA_gpencil_legacy_types.h" @@ -19,7 +20,7 @@ #include "UI_interface.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "transform.hh" #include "transform_convert.hh" @@ -45,7 +46,7 @@ static void applyGPShrinkFatten(TransInfo *t) t->values_final[0] = ratio; - /* Header print for NumInput. */ + /* header print for NumInput */ if (hasNumInput(&t->num)) { char c[NUM_STR_REP_LEN]; diff --git a/source/blender/editors/transform/transform_mode_maskshrinkfatten.cc b/source/blender/editors/transform/transform_mode_maskshrinkfatten.cc index 616bfb5d765..ab6922ddfce 100644 --- a/source/blender/editors/transform/transform_mode_maskshrinkfatten.cc +++ b/source/blender/editors/transform/transform_mode_maskshrinkfatten.cc @@ -11,13 +11,14 @@ #include "BLI_math_vector.h" #include "BLI_string.h" +#include "BKE_context.hh" #include "BKE_unit.hh" #include "ED_screen.hh" #include "UI_interface.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "transform.hh" #include "transform_convert.hh" @@ -44,7 +45,7 @@ static void applyMaskShrinkFatten(TransInfo *t) t->values_final[0] = ratio; - /* Header print for NumInput. */ + /* header print for NumInput */ if (hasNumInput(&t->num)) { char c[NUM_STR_REP_LEN]; @@ -55,7 +56,7 @@ static void applyMaskShrinkFatten(TransInfo *t) SNPRINTF(str, IFACE_("Feather Shrink/Fatten: %3f"), ratio); } - /* Detect if no points have feather yet. */ + /* detect if no points have feather yet */ if (ratio > 1.0f) { initial_feather = true; @@ -73,7 +74,7 @@ static void applyMaskShrinkFatten(TransInfo *t) } } - /* Apply shrink/fatten. */ + /* apply shrink/fatten */ FOREACH_TRANS_DATA_CONTAINER (t, tc) { TransData *td; for (td = tc->data, i = 0; i < tc->data_len; i++, td++) { diff --git a/source/blender/editors/transform/transform_mode_mirror.cc b/source/blender/editors/transform/transform_mode_mirror.cc index 4b63a7755da..8ac76511263 100644 --- a/source/blender/editors/transform/transform_mode_mirror.cc +++ b/source/blender/editors/transform/transform_mode_mirror.cc @@ -13,11 +13,14 @@ #include "BLI_math_vector.h" #include "BLI_string.h" +#include "BKE_armature.hh" +#include "BKE_context.hh" + #include "ED_screen.hh" #include "UI_interface.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "transform.hh" #include "transform_convert.hh" @@ -160,7 +163,7 @@ static void applyMirror(TransInfo *t) * This still recalculates transformation on mouse move * while it should only recalculate on constraint change. */ - /* If an axis has been selected. */ + /* if an axis has been selected */ if (t->con.mode & CON_APPLY) { /* #special_axis is either the constraint plane normal or the constraint axis. * Assuming that CON_AXIS0 < CON_AXIS1 < CON_AXIS2 and CON_AXIS2 is CON_AXIS0 << 2 */ diff --git a/source/blender/editors/transform/transform_mode_push_pull.cc b/source/blender/editors/transform/transform_mode_push_pull.cc index b4ee87c5fd2..f5850d1c6d9 100644 --- a/source/blender/editors/transform/transform_mode_push_pull.cc +++ b/source/blender/editors/transform/transform_mode_push_pull.cc @@ -13,13 +13,14 @@ #include "BLI_string.h" #include "BLI_task.h" +#include "BKE_context.hh" #include "BKE_unit.hh" #include "ED_screen.hh" #include "UI_interface.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "transform.hh" #include "transform_constraints.hh" @@ -117,7 +118,7 @@ static void applyPushPull(TransInfo *t) t->values_final[0] = distance; - /* Header print for NumInput. */ + /* header print for NumInput */ if (hasNumInput(&t->num)) { char c[NUM_STR_REP_LEN]; @@ -126,7 +127,7 @@ static void applyPushPull(TransInfo *t) SNPRINTF(str, IFACE_("Push/Pull: %s%s %s"), c, t->con.text, t->proptext); } else { - /* Default header print. */ + /* default header print */ SNPRINTF(str, IFACE_("Push/Pull: %.4f%s %s"), distance, t->con.text, t->proptext); } diff --git a/source/blender/editors/transform/transform_mode_resize.cc b/source/blender/editors/transform/transform_mode_resize.cc index d6a1301274f..f8cbc50dd6c 100644 --- a/source/blender/editors/transform/transform_mode_resize.cc +++ b/source/blender/editors/transform/transform_mode_resize.cc @@ -14,6 +14,7 @@ #include "BLI_math_vector.h" #include "BLI_task.h" +#include "BKE_context.hh" #include "BKE_image.h" #include "BKE_unit.hh" @@ -106,7 +107,7 @@ static void constrain_scale_to_boundary(const float numerator, * "catastrophic cancellation". See #102923 for an example. We use epsilon tests here to * distinguish between genuine negative coordinates versus coordinates that should be rounded off * to zero. */ - const float epsilon = 0.25f / 65536.0f; /* A quarter of a texel on a 65536 x 65536 texture. */ + const float epsilon = 0.25f / 65536.0f; /* i.e. Quarter of a texel on a 65536 x 65536 texture. */ if (fabsf(denominator) < epsilon) { /* The origin of the scale is very near the edge of the boundary. */ if (numerator < -epsilon) { @@ -169,7 +170,7 @@ static bool clip_uv_transform_resize(TransInfo *t, float vec[2]) constrain_scale_to_boundary( scale_origin[0] - base_offset[0], scale_origin[0] - min[0], &scale); - /* Now the right border, negated, because `-1.0 / -1.0 = 1.0`. */ + /* Now the right border, negated, because `-1.0 / -1.0 = 1.0` */ constrain_scale_to_boundary( base_offset[0] + t->aspect[0] - scale_origin[0], max[0] - scale_origin[0], &scale); } @@ -234,7 +235,7 @@ static void applyResize(TransInfo *t) headerResize(t, t->values_final, str, sizeof(str)); } - copy_m3_m3(t->mat, mat); /* Used in gizmo. */ + copy_m3_m3(t->mat, mat); /* used in gizmo */ FOREACH_TRANS_DATA_CONTAINER (t, tc) { diff --git a/source/blender/editors/transform/transform_mode_rotate.cc b/source/blender/editors/transform/transform_mode_rotate.cc index 33197572de9..f4b0a75b1db 100644 --- a/source/blender/editors/transform/transform_mode_rotate.cc +++ b/source/blender/editors/transform/transform_mode_rotate.cc @@ -13,7 +13,8 @@ #include "BLI_math_vector.h" #include "BLI_task.h" -#include "BKE_report.hh" +#include "BKE_context.hh" +#include "BKE_report.h" #include "BKE_unit.hh" #include "ED_screen.hh" @@ -318,7 +319,7 @@ static bool clip_uv_transform_rotate(const TransInfo *t, float *vec, float *vec_ /* Binary search. */ const float angle_mid = (angle_inside_bounds + angle) / 2.0f; if (ELEM(angle_mid, angle_inside_bounds, angle)) { - break; /* Float precision reached. */ + break; /* float precision reached. */ } if (uv_rotation_in_clip_bounds_test(t, angle_mid)) { angle_inside_bounds = angle_mid; @@ -412,7 +413,8 @@ static void initRotation(TransInfo *t, wmOperator * /*op*/) t->idx_max = 0; t->num.idx_max = 0; - initSnapAngleIncrements(t); + t->snap[0] = DEG2RAD(5.0); + t->snap[1] = DEG2RAD(1.0); copy_v3_fl(t->num.val_inc, t->snap[1]); t->num.unit_sys = t->scene->unit.system; diff --git a/source/blender/editors/transform/transform_mode_shear.cc b/source/blender/editors/transform/transform_mode_shear.cc index 5bc23eb899b..0eeabf2c2d7 100644 --- a/source/blender/editors/transform/transform_mode_shear.cc +++ b/source/blender/editors/transform/transform_mode_shear.cc @@ -15,6 +15,7 @@ #include "BLI_string.h" #include "BLI_task.h" +#include "BKE_context.hh" #include "BKE_unit.hh" #include "ED_screen.hh" @@ -23,7 +24,7 @@ #include "UI_interface.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "transform.hh" #include "transform_convert.hh" @@ -151,7 +152,7 @@ static eRedrawFlag handleEventShear(TransInfo *t, const wmEvent *event) eRedrawFlag status = TREDRAW_NOTHING; if (event->type == MIDDLEMOUSE && event->val == KM_PRESS) { - /* Use custom.mode.data pointer to signal Shear direction. */ + /* Use custom.mode.data pointer to signal Shear direction */ do { t->orient_axis_ortho = (t->orient_axis_ortho + 1) % 3; } while (t->orient_axis_ortho == t->orient_axis); @@ -264,7 +265,7 @@ static bool clip_uv_transform_shear(const TransInfo *t, float *vec, float *vec_i /* Binary search. */ const float value_mid = (value_inside_bounds + value) / 2.0f; if (ELEM(value_mid, value_inside_bounds, value)) { - break; /* Float precision reached. */ + break; /* float precision reached. */ } if (uv_shear_in_clip_bounds_test(t, value_mid)) { value_inside_bounds = value_mid; @@ -302,14 +303,14 @@ static void apply_shear(TransInfo *t) recalc_data(t); char str[UI_MAX_DRAW_STR]; - /* Header print for NumInput. */ + /* header print for NumInput */ if (hasNumInput(&t->num)) { char c[NUM_STR_REP_LEN]; outputNumInput(&(t->num), c, &t->scene->unit); SNPRINTF(str, IFACE_("Shear: %s %s"), c, t->proptext); } else { - /* Default header print. */ + /* default header print */ SNPRINTF(str, IFACE_("Shear: %.3f %s (Press X or Y to set shear axis)"), value, t->proptext); } diff --git a/source/blender/editors/transform/transform_mode_shrink_fatten.cc b/source/blender/editors/transform/transform_mode_shrink_fatten.cc index 9a232db4ac8..2de9701c2fe 100644 --- a/source/blender/editors/transform/transform_mode_shrink_fatten.cc +++ b/source/blender/editors/transform/transform_mode_shrink_fatten.cc @@ -7,12 +7,13 @@ */ #include -#include #include "BLI_math_vector.h" +#include "BLI_string.h" #include "BLI_task.h" -#include "BKE_report.hh" +#include "BKE_context.hh" +#include "BKE_report.h" #include "BKE_unit.hh" #include "ED_screen.hh" @@ -20,7 +21,9 @@ #include "WM_api.hh" #include "WM_types.hh" -#include "BLT_translation.hh" +#include "UI_interface.hh" + +#include "BLT_translation.h" #include "transform.hh" #include "transform_convert.hh" @@ -49,7 +52,7 @@ static void transdata_elem_shrink_fatten(const TransInfo *t, /* Get the final offset. */ float tdistance = distance * td->factor; if (td->ext && (t->flag & T_ALT_TRANSFORM) != 0) { - tdistance *= td->ext->isize[0]; /* Shell factor. */ + tdistance *= td->ext->isize[0]; /* shell factor */ } madd_v3_v3v3fl(td->loc, td->iloc, td->axismtx[2], tdistance); @@ -89,7 +92,8 @@ static void applyShrinkFatten(TransInfo *t) { float distance; int i; - fmt::memory_buffer str; + char str[UI_MAX_DRAW_STR]; + size_t ofs = 0; UnitSettings *unit = &t->scene->unit; distance = t->values[0] + t->values_modal_offset[0]; @@ -100,40 +104,44 @@ static void applyShrinkFatten(TransInfo *t) t->values_final[0] = distance; - /* Header print for NumInput. */ - fmt::format_to(fmt::appender(str), IFACE_("Shrink/Fatten: ")); + /* header print for NumInput */ + ofs += BLI_strncpy_rlen(str + ofs, IFACE_("Shrink/Fatten: "), sizeof(str) - ofs); if (hasNumInput(&t->num)) { char c[NUM_STR_REP_LEN]; outputNumInput(&(t->num), c, unit); - fmt::format_to(fmt::appender(str), c); + ofs += BLI_snprintf_rlen(str + ofs, sizeof(str) - ofs, "%s", c); } else { - /* Default header print. */ + /* default header print */ if (unit != nullptr) { - char unit_str[64]; - BKE_unit_value_as_string( - unit_str, sizeof(unit_str), distance * unit->scale_length, 4, B_UNIT_LENGTH, unit, true); - fmt::format_to(fmt::appender(str), unit_str); + ofs += BKE_unit_value_as_string(str + ofs, + sizeof(str) - ofs, + distance * unit->scale_length, + 4, + B_UNIT_LENGTH, + unit, + true); } else { - fmt::format_to(fmt::appender(str), "{:.4f}", distance); + ofs += BLI_snprintf_rlen(str + ofs, sizeof(str) - ofs, "%.4f", distance); } } if (t->proptext[0]) { - fmt::format_to(fmt::appender(str), " {}", t->proptext); + ofs += BLI_snprintf_rlen(str + ofs, sizeof(str) - ofs, " %s", t->proptext); } - fmt::format_to(fmt::appender(str), ", ("); + ofs += BLI_strncpy_rlen(str + ofs, ", (", sizeof(str) - ofs); const wmKeyMapItem *kmi = static_cast(t->custom.mode.data); if (kmi) { - str.append(WM_keymap_item_to_string(kmi, false).value_or("")); + ofs += WM_keymap_item_to_string(kmi, false, str + ofs, sizeof(str) - ofs); } - fmt::format_to(fmt::appender(str), - IFACE_(" or Alt) Even Thickness {}"), - WM_bool_as_string((t->flag & T_ALT_TRANSFORM) != 0)); - /* Done with header string. */ + BLI_snprintf(str + ofs, + sizeof(str) - ofs, + IFACE_(" or Alt) Even Thickness %s"), + WM_bool_as_string((t->flag & T_ALT_TRANSFORM) != 0)); + /* done with header string */ FOREACH_TRANS_DATA_CONTAINER (t, tc) { if (tc->data_len < TRANSDATA_THREAD_LIMIT) { @@ -158,7 +166,7 @@ static void applyShrinkFatten(TransInfo *t) recalc_data(t); - ED_area_status_text(t->area, fmt::to_string(str).c_str()); + ED_area_status_text(t->area, str); } static void initShrinkFatten(TransInfo *t, wmOperator * /*op*/) diff --git a/source/blender/editors/transform/transform_mode_skin_resize.cc b/source/blender/editors/transform/transform_mode_skin_resize.cc index f4a946295a3..d182f06a34d 100644 --- a/source/blender/editors/transform/transform_mode_skin_resize.cc +++ b/source/blender/editors/transform/transform_mode_skin_resize.cc @@ -12,6 +12,7 @@ #include "BLI_math_vector.h" #include "BLI_task.h" +#include "BKE_context.hh" #include "BKE_unit.hh" #include "ED_screen.hh" diff --git a/source/blender/editors/transform/transform_mode_snapsource.cc b/source/blender/editors/transform/transform_mode_snapsource.cc index c7cfeaa3505..f3385361048 100644 --- a/source/blender/editors/transform/transform_mode_snapsource.cc +++ b/source/blender/editors/transform/transform_mode_snapsource.cc @@ -172,7 +172,7 @@ void transform_mode_snap_source_init(TransInfo *t, wmOperator * /*op*/) } if (ELEM(t->mode, TFM_INIT, TFM_DUMMY)) { - /* Fallback. */ + /* Fallback */ transform_mode_init(t, nullptr, TFM_TRANSLATION); } @@ -194,13 +194,10 @@ void transform_mode_snap_source_init(TransInfo *t, wmOperator * /*op*/) } t->mode_info = &TransMode_snapsource; + t->flag |= T_DRAW_SNAP_SOURCE; t->tsnap.target_operation = SCE_SNAP_TARGET_ALL; t->tsnap.status &= ~SNAP_SOURCE_FOUND; - if (t->spacetype == SPACE_VIEW3D) { - t->flag |= T_DRAW_SNAP_SOURCE; - } - customdata->snap_mode_confirm = t->tsnap.mode; t->tsnap.mode &= ~(SCE_SNAP_TO_EDGE_PERPENDICULAR | SCE_SNAP_INDIVIDUAL_PROJECT | SCE_SNAP_INDIVIDUAL_NEAREST); diff --git a/source/blender/editors/transform/transform_mode_tilt.cc b/source/blender/editors/transform/transform_mode_tilt.cc index 57157118d3b..d81f6c1ee1c 100644 --- a/source/blender/editors/transform/transform_mode_tilt.cc +++ b/source/blender/editors/transform/transform_mode_tilt.cc @@ -12,13 +12,14 @@ #include "BLI_math_vector.h" #include "BLI_string.h" +#include "BKE_context.hh" #include "BKE_unit.hh" #include "ED_screen.hh" #include "UI_interface.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "transform.hh" #include "transform_convert.hh" @@ -86,7 +87,8 @@ static void initTilt(TransInfo *t, wmOperator * /*op*/) t->idx_max = 0; t->num.idx_max = 0; - initSnapAngleIncrements(t); + t->snap[0] = DEG2RAD(5.0); + t->snap[1] = DEG2RAD(1.0); copy_v3_fl(t->num.val_inc, t->snap[1]); t->num.unit_sys = t->scene->unit.system; diff --git a/source/blender/editors/transform/transform_mode_timescale.cc b/source/blender/editors/transform/transform_mode_timescale.cc index 03ab19db159..2501da895de 100644 --- a/source/blender/editors/transform/transform_mode_timescale.cc +++ b/source/blender/editors/transform/transform_mode_timescale.cc @@ -8,9 +8,12 @@ #include +#include "DNA_anim_types.h" + #include "BLI_math_vector.h" #include "BLI_string.h" +#include "BKE_context.hh" #include "BKE_nla.h" #include "BKE_unit.hh" @@ -18,7 +21,7 @@ #include "UI_interface.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "transform.hh" #include "transform_convert.hh" @@ -61,22 +64,23 @@ static void applyTimeScaleValue(TransInfo *t, float value) TransData *td = tc->data; TransData2D *td2d = tc->data_2d; for (int i = 0; i < tc->data_len; i++, td++, td2d++) { - /* It is assumed that td->extra is a pointer to the AnimData, + /* it is assumed that td->extra is a pointer to the AnimData, * whose active action is where this keyframe comes from - * (this is only valid when not in NLA). */ + * (this is only valid when not in NLA) + */ AnimData *adt = static_cast((t->spacetype != SPACE_NLA) ? td->extra : nullptr); float startx = scene->r.cfra; float fac = value; - /* Take proportional editing into account. */ + /* take proportional editing into account */ fac = ((fac - 1.0f) * td->factor) + 1; - /* Check if any need to apply nla-mapping. */ + /* check if any need to apply nla-mapping */ if (adt) { startx = BKE_nla_tweakedit_remap(adt, startx, NLATIME_CONVERT_UNMAP); } - /* Now, calculate the new value. */ + /* now, calculate the new value */ td->loc[0] = ((td->iloc[0] - startx) * fac) + startx; } } @@ -86,7 +90,7 @@ static void applyTimeScale(TransInfo *t) { char str[UI_MAX_DRAW_STR]; - /* Handle numeric-input stuff. */ + /* handle numeric-input stuff */ t->vec[0] = t->values[0]; applyNumInput(&t->num, &t->vec[0]); @@ -115,23 +119,24 @@ static void initTimeScale(TransInfo *t, wmOperator * /*op*/) { float center[2]; - /* This tool is only really available in the Action Editor - * AND NLA Editor (for strip scaling). */ + /* this tool is only really available in the Action Editor + * AND NLA Editor (for strip scaling) + */ if (ELEM(t->spacetype, SPACE_ACTION, SPACE_NLA) == 0) { t->state = TRANS_CANCEL; } t->mode = TFM_TIME_SCALE; - /* Recalculate center2d to use scene->r.cfra and mouse Y, since that's - * what is used in time scale. */ + /* recalculate center2d to use scene->r.cfra and mouse Y, since that's + * what is used in time scale */ if ((t->flag & T_OVERRIDE_CENTER) == 0) { t->center_global[0] = t->scene->r.cfra; projectFloatView(t, t->center_global, center); center[1] = t->mouse.imval[1]; } - /* Force a reinitialize with the center2d used here. */ + /* force a reinit with the center2d used here */ initMouseInput(t, &t->mouse, center, t->mouse.imval, false); initMouseInputMode(t, &t->mouse, INPUT_SPRING_FLIP); diff --git a/source/blender/editors/transform/transform_mode_timeslide.cc b/source/blender/editors/transform/transform_mode_timeslide.cc index cf255e77a43..a689afc5143 100644 --- a/source/blender/editors/transform/transform_mode_timeslide.cc +++ b/source/blender/editors/transform/transform_mode_timeslide.cc @@ -11,9 +11,12 @@ #include "MEM_guardedalloc.h" +#include "DNA_anim_types.h" + #include "BLI_math_vector.h" #include "BLI_string.h" +#include "BKE_context.hh" #include "BKE_nla.h" #include "BKE_unit.hh" @@ -22,7 +25,7 @@ #include "UI_interface.hh" #include "UI_view2d.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "transform.hh" #include "transform_convert.hh" @@ -63,7 +66,7 @@ static void applyTimeSlideValue(TransInfo *t, float sval, float cval) float minx = range[0]; float maxx = range[1]; - /* Set value for drawing black line. */ + /* set value for drawing black line */ if (t->spacetype == SPACE_ACTION) { SpaceAction *saction = (SpaceAction *)t->area->spacedata.first; saction->timeslide = cval; @@ -74,12 +77,13 @@ static void applyTimeSlideValue(TransInfo *t, float sval, float cval) FOREACH_TRANS_DATA_CONTAINER (t, tc) { TransData *td = tc->data; for (i = 0; i < tc->data_len; i++, td++) { - /* It is assumed that td->extra is a pointer to the AnimData, + /* it is assumed that td->extra is a pointer to the AnimData, * whose active action is where this keyframe comes from - * (this is only valid when not in NLA). */ + * (this is only valid when not in NLA) + */ AnimData *adt = static_cast((t->spacetype != SPACE_NLA) ? td->extra : nullptr); - /* Only apply to data if in range. */ + /* only apply to data if in range */ if ((sval > minx) && (sval < maxx)) { float cvalc = std::clamp(cval, minx, maxx); float timefac; @@ -96,17 +100,17 @@ static void applyTimeSlideValue(TransInfo *t, float sval, float cval) } /* NLA mapping magic here works as follows: - * - `ival` goes from strip time to global time. - * - Calculation is performed into `td->val` in global time - * (since `sval` and min/max are all in global time). - * - `td->val` then gets put back into strip time. + * - "ival" goes from strip time to global time + * - calculation is performed into td->val in global time + * (since sval and min/max are all in global time) + * - "td->val" then gets put back into strip time */ if (adt) { - /* Strip to global. */ + /* strip to global */ ival = BKE_nla_tweakedit_remap(adt, ival, NLATIME_CONVERT_MAP); } - /* Left half? */ + /* left half? */ if (ival < sval) { timefac = (sval - ival) / (sval - minx); *dst = cvalc - timefac * (cvalc - minx); @@ -117,7 +121,7 @@ static void applyTimeSlideValue(TransInfo *t, float sval, float cval) } if (adt) { - /* Global to strip. */ + /* global to strip */ *dst = BKE_nla_tweakedit_remap(adt, *dst, NLATIME_CONVERT_UNMAP); } } @@ -134,16 +138,15 @@ static void applyTimeSlide(TransInfo *t) float maxx = range[1]; char str[UI_MAX_DRAW_STR]; - /* Calculate mouse co-ordinates. */ + /* calculate mouse co-ordinates */ UI_view2d_region_to_view(v2d, t->mval[0], t->mval[1], &cval[0], &cval[1]); UI_view2d_region_to_view(v2d, t->mouse.imval[0], t->mouse.imval[1], &sval[0], &sval[1]); - /* `t->values_final[0]` stores `cval[0]`, - * which is the current mouse-pointer location (in frames). */ + /* t->values_final[0] stores cval[0], which is the current mouse-pointer location (in frames) */ /* XXX Need to be able to repeat this. */ // t->values_final[0] = cval[0]; /* UNUSED (reset again later). */ - /* Handle numeric-input stuff. */ + /* handle numeric-input stuff */ t->vec[0] = 2.0f * (cval[0] - sval[0]) / (maxx - minx); applyNumInput(&t->num, &t->vec[0]); t->values_final[0] = (maxx - minx) * t->vec[0] / 2.0f + sval[0]; @@ -158,11 +161,11 @@ static void applyTimeSlide(TransInfo *t) static void initTimeSlide(TransInfo *t, wmOperator * /*op*/) { - /* This tool is only really available in the Action Editor. */ + /* this tool is only really available in the Action Editor... */ if (t->spacetype == SPACE_ACTION) { SpaceAction *saction = (SpaceAction *)t->area->spacedata.first; - /* Set flag for drawing stuff. */ + /* set flag for drawing stuff */ saction->flag |= SACTION_MOVING; } else { @@ -188,7 +191,7 @@ static void initTimeSlide(TransInfo *t, wmOperator * /*op*/) AnimData *adt = static_cast((t->spacetype != SPACE_NLA) ? td->extra : nullptr); float val = *(td->val); - /* Strip/action time to global (mapped) time. */ + /* strip/action time to global (mapped) time */ if (adt) { val = BKE_nla_tweakedit_remap(adt, val, NLATIME_CONVERT_MAP); } @@ -203,7 +206,7 @@ static void initTimeSlide(TransInfo *t, wmOperator * /*op*/) } if (min == max) { - /* Just use the current frame ranges. */ + /* just use the current frame ranges */ min = float(PSFRA); max = float(PEFRA); } diff --git a/source/blender/editors/transform/transform_mode_timetranslate.cc b/source/blender/editors/transform/transform_mode_timetranslate.cc index 2820922237a..26eff134c1d 100644 --- a/source/blender/editors/transform/transform_mode_timetranslate.cc +++ b/source/blender/editors/transform/transform_mode_timetranslate.cc @@ -8,9 +8,12 @@ #include +#include "DNA_anim_types.h" + #include "BLI_math_vector.h" #include "BLI_string.h" +#include "BKE_context.hh" #include "BKE_unit.hh" #include "ED_screen.hh" @@ -18,7 +21,7 @@ #include "UI_interface.hh" #include "UI_view2d.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "transform.hh" #include "transform_convert.hh" @@ -35,7 +38,7 @@ static void headerTimeTranslate(TransInfo *t, char str[UI_MAX_DRAW_STR]) char tvec[NUM_STR_REP_LEN * 3]; int ofs = 0; - /* If numeric input is active, use results from that, otherwise apply snapping to result. */ + /* if numeric input is active, use results from that, otherwise apply snapping to result */ if (hasNumInput(&t->num)) { outputNumInput(&(t->num), tvec, &t->scene->unit); } @@ -99,17 +102,17 @@ static void applyTimeTranslate(TransInfo *t) View2D *v2d = (View2D *)t->view; char str[UI_MAX_DRAW_STR]; - /* Calculate translation amount from mouse movement - in 'time-grid space'. */ + /* calculate translation amount from mouse movement - in 'time-grid space' */ if (t->flag & T_MODAL) { float cval[2], sval[2]; UI_view2d_region_to_view(v2d, t->mval[0], t->mval[0], &cval[0], &cval[1]); UI_view2d_region_to_view(v2d, t->mouse.imval[0], t->mouse.imval[0], &sval[0], &sval[1]); - /* We only need to calculate effect for time (#applyTimeTranslate only needs that). */ + /* we only need to calculate effect for time (applyTimeTranslate only needs that) */ t->values[0] = cval[0] - sval[0]; } - /* Handle numeric-input stuff. */ + /* handle numeric-input stuff */ t->vec[0] = t->values[0]; applyNumInput(&t->num, &t->vec[0]); t->values_final[0] = t->vec[0]; @@ -124,7 +127,7 @@ static void applyTimeTranslate(TransInfo *t) static void initTimeTranslate(TransInfo *t, wmOperator * /*op*/) { - /* This tool is only really available in the Action Editor. */ + /* this tool is only really available in the Action Editor... */ if (!ELEM(t->spacetype, SPACE_ACTION, SPACE_SEQ)) { t->state = TRANS_CANCEL; } diff --git a/source/blender/editors/transform/transform_mode_tosphere.cc b/source/blender/editors/transform/transform_mode_tosphere.cc index a104d4e4998..e672a87268c 100644 --- a/source/blender/editors/transform/transform_mode_tosphere.cc +++ b/source/blender/editors/transform/transform_mode_tosphere.cc @@ -15,13 +15,14 @@ #include "MEM_guardedalloc.h" +#include "BKE_context.hh" #include "BKE_unit.hh" #include "ED_screen.hh" #include "UI_interface.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "transform.hh" #include "transform_convert.hh" @@ -189,7 +190,7 @@ static void applyToSphere(TransInfo *t) t->values_final[0] = ratio; - /* Header print for NumInput. */ + /* header print for NumInput */ if (hasNumInput(&t->num)) { char c[NUM_STR_REP_LEN]; @@ -198,7 +199,7 @@ static void applyToSphere(TransInfo *t) SNPRINTF(str, IFACE_("To Sphere: %s %s"), c, t->proptext); } else { - /* Default header print. */ + /* default header print */ SNPRINTF(str, IFACE_("To Sphere: %.4f %s"), ratio, t->proptext); } diff --git a/source/blender/editors/transform/transform_mode_trackball.cc b/source/blender/editors/transform/transform_mode_trackball.cc index 7550b2e5e38..85dd1243cfd 100644 --- a/source/blender/editors/transform/transform_mode_trackball.cc +++ b/source/blender/editors/transform/transform_mode_trackball.cc @@ -14,13 +14,14 @@ #include "BLI_string.h" #include "BLI_task.h" +#include "BKE_context.hh" #include "BKE_unit.hh" #include "ED_screen.hh" #include "UI_interface.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "transform.hh" #include "transform_convert.hh" diff --git a/source/blender/editors/transform/transform_mode_translate.cc b/source/blender/editors/transform/transform_mode_translate.cc index 212f0b3584f..0ed9c54d0be 100644 --- a/source/blender/editors/transform/transform_mode_translate.cc +++ b/source/blender/editors/transform/transform_mode_translate.cc @@ -18,16 +18,19 @@ #include "BLI_string.h" #include "BLI_task.h" +#include "BKE_context.hh" #include "BKE_image.h" -#include "BKE_report.hh" +#include "BKE_report.h" #include "BKE_unit.hh" #include "ED_node.hh" #include "ED_screen.hh" +#include "WM_api.hh" + #include "UI_interface.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "transform.hh" #include "transform_convert.hh" @@ -411,7 +414,7 @@ static bool translate_snap_grid(TransInfo *t, float *val) return false; } - /* Don't do grid snapping if not in 3D viewport or UV editor. */ + /* Don't do grid snapping if not in 3D viewport or UV editor */ if (!ELEM(t->spacetype, SPACE_VIEW3D, SPACE_IMAGE)) { return false; } @@ -426,7 +429,7 @@ static bool translate_snap_grid(TransInfo *t, float *val) mul_v3_fl(grid_dist, t->snap_spatial_precision); } - /* Early bailing out if no need to snap. */ + /* Early bailing out if no need to snap */ if (is_zero_v3(grid_dist)) { return false; } @@ -459,7 +462,7 @@ static void ApplySnapTranslation(TransInfo *t, float vec[3]) if (ED_view3d_project_float_global(t->region, point, point, V3D_PROJ_TEST_NOP) != V3D_PROJ_RET_OK) { - zero_v3(point); /* No good answer here... */ + zero_v3(point); /* no good answer here... */ } } } @@ -506,7 +509,7 @@ static void applyTranslationValue(TransInfo *t, const float vec[3]) if (rotate_mode != TRANSLATE_ROTATE_OFF) { snap_source_local = t->tsnap.snap_source; if (tc->use_local_mat) { - /* The pivot has to be in local-space (see #49494). */ + /* The pivot has to be in local-space (see #49494) */ snap_source_local = math::transform_point(float4x4(tc->imat), snap_source_local); } } @@ -642,7 +645,7 @@ static void applyTranslation(TransInfo *t) applyTranslationValue(t, global_dir); - /* Evil hack - redo translation if clipping needed. */ + /* evil hack - redo translation if clipping needed */ if (t->flag & T_CLIP_UV && clip_uv_transform_translation(t, global_dir)) { applyTranslationValue(t, global_dir); @@ -670,7 +673,7 @@ static void applyTranslationMatrix(TransInfo *t, float mat_xform[4][4]) static void initTranslation(TransInfo *t, wmOperator * /*op*/) { if (t->spacetype == SPACE_ACTION) { - /* This space uses time translate. */ + /* this space uses time translate */ BKE_report(t->reports, RPT_ERROR, "Use 'Time_Translate' transform mode instead of 'Translation' mode " diff --git a/source/blender/editors/transform/transform_mode_vert_slide.cc b/source/blender/editors/transform/transform_mode_vert_slide.cc index ade2e33d130..ef8ebc556ab 100644 --- a/source/blender/editors/transform/transform_mode_vert_slide.cc +++ b/source/blender/editors/transform/transform_mode_vert_slide.cc @@ -6,24 +6,32 @@ * \ingroup edtransform */ +#include + +#include "MEM_guardedalloc.h" + #include "BLI_math_matrix.h" #include "BLI_string.h" +#include "BKE_context.hh" +#include "BKE_editmesh.hh" #include "BKE_unit.hh" #include "GPU_immediate.h" #include "GPU_matrix.h" +#include "GPU_state.h" #include "ED_screen.hh" #include "WM_api.hh" +#include "WM_types.hh" #include "RNA_access.hh" #include "UI_interface.hh" -#include "UI_view2d.hh" +#include "UI_resources.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "transform.hh" #include "transform_constraints.hh" @@ -37,98 +45,24 @@ using namespace blender; /** \name Transform (Vert Slide) * \{ */ +struct TransDataVertSlideVert { + /** #TransDataGenericSlideVert (header) */ + BMVert *v; + LinkNode **cd_loop_groups; + float co_orig_3d[3]; + /* end generic */ + + float (*co_link_orig_3d)[3]; + int co_link_tot; + int co_link_curr; +}; + struct VertSlideData { - Array sv; - Vector targets_buffer; - int curr_sv_index; - - private: + /* result of ED_view3d_ob_project_mat_get */ float4x4 proj_mat; - float2 win_half; - - public: - void update_proj_mat(TransInfo *t, const TransDataContainer *tc) - { - ARegion *region = t->region; - this->win_half = {region->winx / 2.0f, region->winy / 2.0f}; - - if (t->spacetype == SPACE_VIEW3D) { - RegionView3D *rv3d = static_cast(region->regiondata); - this->proj_mat = ED_view3d_ob_project_mat_get(rv3d, tc->obedit); - - for (int i = 0; i < 4; i++) { - this->proj_mat[i][0] *= this->win_half[0]; - this->proj_mat[i][1] *= this->win_half[1]; - } - } - else { - const View2D *v2d = static_cast(t->view); - UI_view2d_view_to_region_m4(v2d, this->proj_mat.ptr()); - this->proj_mat.location()[0] -= this->win_half[0]; - this->proj_mat.location()[1] -= this->win_half[1]; - } - } - - float2 project(const float3 &co) - { - return math::project_point(this->proj_mat, co).xy() + this->win_half; - } - - /** - * Run while moving the mouse to slide along the edge matching the mouse direction. - */ - void update_active_edges(TransInfo *t, const float2 &mval_fl) - { - /* First get the direction of the original mouse position. */ - float2 dir = math::normalize(mval_fl - t->mouse.imval); - - for (TransDataVertSlideVert &sv : this->sv) { - if (sv.co_link_orig_3d.size() <= 1) { - continue; - } - - const float3 &v_co_orig = sv.co_orig_3d(); - float2 loc_src_2d = math::project_point(this->proj_mat, v_co_orig).xy(); - - float dir_dot_best = -FLT_MAX; - int co_link_curr_best = -1; - - for (int j : sv.co_link_orig_3d.index_range()) { - const float3 &loc_dst = sv.co_link_orig_3d[j]; - float2 loc_dst_2d = math::project_point(this->proj_mat, loc_dst).xy(); - float2 tdir = math::normalize(loc_dst_2d - loc_src_2d); - - float dir_dot = math::dot(dir, tdir); - if (dir_dot > dir_dot_best) { - dir_dot_best = dir_dot; - co_link_curr_best = j; - } - } - - if (co_link_curr_best != -1) { - sv.co_link_curr = co_link_curr_best; - } - } - } - - /** - * Run once when initializing vert slide to find the reference edge. - */ - void update_active_vert(TransInfo * /*t*/, const float2 &mval_fl) - { - /* Set the vertex to use as a reference for the mouse direction `curr_sv_index`. */ - float dist_min_sq = FLT_MAX; - - for (int i : this->sv.index_range()) { - TransDataVertSlideVert &sv = this->sv[i]; - const float2 co_2d = this->project(sv.co_orig_3d()); - const float dist_sq = len_squared_v2v2(mval_fl, co_2d); - if (dist_sq < dist_min_sq) { - dist_min_sq = dist_sq; - this->curr_sv_index = i; - } - } - } + TransDataVertSlideVert *sv; + int totsv; + int curr_sv_index; }; struct VertSlideParams { @@ -145,13 +79,13 @@ static void vert_slide_update_input(TransInfo *t) TRANS_DATA_CONTAINER_FIRST_OK(t)->custom.mode.data); TransDataVertSlideVert *sv = &sld->sv[sld->curr_sv_index]; - const float3 &co_orig_3d = sv->co_orig_3d(); - const float3 &co_dest_3d = sv->co_dest_3d(); + const float *co_orig_3d = sv->co_orig_3d; + const float *co_curr_3d = sv->co_link_orig_3d[sv->co_link_curr]; int mval_ofs[2], mval_start[2], mval_end[2]; - const float2 co_orig_2d = sld->project(co_orig_3d); - const float2 co_curr_2d = sld->project(co_dest_3d); + const float2 co_orig_2d = ED_view3d_project_float_v2_m4(t->region, co_orig_3d, sld->proj_mat); + const float2 co_curr_2d = ED_view3d_project_float_v2_m4(t->region, co_curr_3d, sld->proj_mat); ARRAY_SET_ITEMS(mval_ofs, t->mouse.imval[0] - co_orig_2d[0], t->mouse.imval[1] - co_orig_2d[1]); ARRAY_SET_ITEMS(mval_start, co_orig_2d[0] + mval_ofs[0], co_orig_2d[1] + mval_ofs[1]); @@ -169,29 +103,177 @@ static void calcVertSlideCustomPoints(TransInfo *t) { vert_slide_update_input(t); - /* #setCustomPoints isn't normally changing as the mouse moves, + /* setCustomPoints isn't normally changing as the mouse moves, * in this case apply mouse input immediately so we don't refresh - * with the value from the previous points. */ + * with the value from the previous points */ applyMouseInput(t, &t->mouse, t->mval, t->values); } -static VertSlideData *createVertSlideVerts(TransInfo *t, TransDataContainer *tc) +/** + * Run once when initializing vert slide to find the reference edge + */ +static void calcVertSlideMouseActiveVert(TransInfo *t, const float2 &mval_fl) { - VertSlideData *sld = MEM_new(__func__); - if (t->data_type == &TransConvertType_MeshUV) { - sld->sv = transform_mesh_uv_vert_slide_data_create(t, tc, sld->targets_buffer); + /* Active object may have no selected vertices. */ + VertSlideData *sld = static_cast( + TRANS_DATA_CONTAINER_FIRST_OK(t)->custom.mode.data); + TransDataVertSlideVert *sv; + + /* set the vertex to use as a reference for the mouse direction 'curr_sv_index' */ + float dist_min_sq = FLT_MAX; + int i; + + for (i = 0, sv = sld->sv; i < sld->totsv; i++, sv++) { + const float2 co_2d = ED_view3d_project_float_v2_m4(t->region, sv->co_orig_3d, sld->proj_mat); + + const float dist_sq = len_squared_v2v2(mval_fl, co_2d); + if (dist_sq < dist_min_sq) { + dist_min_sq = dist_sq; + sld->curr_sv_index = i; + } } - else { - sld->sv = transform_mesh_vert_slide_data_create(tc, sld->targets_buffer); +} + +/** + * Run while moving the mouse to slide along the edge matching the mouse direction + */ +static void calcVertSlideMouseActiveEdges(TransInfo *t, const float2 &mval_fl) +{ + VertSlideData *sld = static_cast( + TRANS_DATA_CONTAINER_FIRST_OK(t)->custom.mode.data); + + float dir[3]; + TransDataVertSlideVert *sv; + int i; + + /* NOTE: we could save a matrix-multiply for each vertex + * by finding the closest edge in local-space. + * However this skews the outcome with non-uniform-scale. */ + + /* First get the direction of the original mouse position. */ + sub_v2_v2v2(dir, t->mouse.imval, mval_fl); + ED_view3d_win_to_delta(t->region, dir, t->zfac, dir); + normalize_v3(dir); + + for (i = 0, sv = sld->sv; i < sld->totsv; i++, sv++) { + if (sv->co_link_tot > 1) { + float dir_dot_best = -FLT_MAX; + int co_link_curr_best = -1; + int j; + + for (j = 0; j < sv->co_link_tot; j++) { + float tdir[3]; + float dir_dot; + + sub_v3_v3v3(tdir, sv->co_orig_3d, sv->co_link_orig_3d[j]); + mul_mat3_m4_v3(TRANS_DATA_CONTAINER_FIRST_OK(t)->obedit->object_to_world, tdir); + project_plane_v3_v3v3(tdir, tdir, t->viewinv[2]); + + normalize_v3(tdir); + dir_dot = dot_v3v3(dir, tdir); + if (dir_dot > dir_dot_best) { + dir_dot_best = dir_dot; + co_link_curr_best = j; + } + } + + if (co_link_curr_best != -1) { + sv->co_link_curr = co_link_curr_best; + } + } + } +} + +static VertSlideData *createVertSlideVerts(TransInfo *t, const TransDataContainer *tc) +{ + BMEditMesh *em = BKE_editmesh_from_object(tc->obedit); + BMesh *bm = em->bm; + BMIter iter; + BMIter eiter; + BMEdge *e; + BMVert *v; + TransDataVertSlideVert *sv_array; + VertSlideData *sld = MEM_new(__func__); + int j; + + sld->curr_sv_index = 0; + + j = 0; + BM_ITER_MESH (v, &iter, bm, BM_VERTS_OF_MESH) { + bool ok = false; + if (BM_elem_flag_test(v, BM_ELEM_SELECT) && v->e) { + BM_ITER_ELEM (e, &eiter, v, BM_EDGES_OF_VERT) { + if (!BM_elem_flag_test(e, BM_ELEM_HIDDEN)) { + ok = true; + break; + } + } + } + + if (ok) { + BM_elem_flag_enable(v, BM_ELEM_TAG); + j += 1; + } + else { + BM_elem_flag_disable(v, BM_ELEM_TAG); + } } - if (sld->sv.is_empty()) { - MEM_delete(sld); + if (!j) { + MEM_freeN(sld); return nullptr; } - sld->curr_sv_index = 0; - sld->update_proj_mat(t, tc); + sv_array = static_cast( + MEM_callocN(sizeof(TransDataVertSlideVert) * j, "sv_array")); + + j = 0; + BM_ITER_MESH (v, &iter, bm, BM_VERTS_OF_MESH) { + if (BM_elem_flag_test(v, BM_ELEM_TAG)) { + int k; + sv_array[j].v = v; + copy_v3_v3(sv_array[j].co_orig_3d, v->co); + + k = 0; + BM_ITER_ELEM (e, &eiter, v, BM_EDGES_OF_VERT) { + if (!BM_elem_flag_test(e, BM_ELEM_HIDDEN)) { + k++; + } + } + + sv_array[j].co_link_orig_3d = static_cast( + MEM_mallocN(sizeof(*sv_array[j].co_link_orig_3d) * k, __func__)); + sv_array[j].co_link_tot = k; + + k = 0; + BM_ITER_ELEM (e, &eiter, v, BM_EDGES_OF_VERT) { + if (!BM_elem_flag_test(e, BM_ELEM_HIDDEN)) { + BMVert *v_other = BM_edge_other_vert(e, v); + copy_v3_v3(sv_array[j].co_link_orig_3d[k], v_other->co); + k++; + } + } + j++; + } + } + + sld->sv = sv_array; + sld->totsv = j; + + /* most likely will be set below */ + sld->proj_mat = blender::float4x4::identity(); + + if (t->spacetype == SPACE_VIEW3D) { + /* view vars */ + RegionView3D *rv3d = nullptr; + ARegion *region = t->region; + + rv3d = static_cast(region ? region->regiondata : nullptr); + if (rv3d) { + sld->proj_mat = ED_view3d_ob_project_mat_get(rv3d, tc->obedit); + } + } + return sld; } @@ -205,7 +287,17 @@ static void freeVertSlideVerts(TransInfo * /*t*/, return; } - MEM_delete(sld); + if (sld->totsv > 0) { + TransDataVertSlideVert *sv = sld->sv; + int i = 0; + for (i = 0; i < sld->totsv; i++, sv++) { + MEM_freeN(sv->co_link_orig_3d); + } + } + + MEM_freeN(sld->sv); + MEM_freeN(sld); + custom_data->data = nullptr; } @@ -232,7 +324,7 @@ static eRedrawFlag handleEventVertSlide(TransInfo *t, const wmEvent *event) } break; case EVT_CKEY: - /* Use like a modifier key. */ + /* use like a modifier key */ if (event->val == KM_PRESS) { t->flag ^= T_ALT_TRANSFORM; calcVertSlideCustomPoints(t); @@ -240,12 +332,10 @@ static eRedrawFlag handleEventVertSlide(TransInfo *t, const wmEvent *event) } break; case MOUSEMOVE: { - /* Don't recalculate the best edge. */ + /* don't recalculate the best edge */ const bool is_clamp = !(t->flag & T_ALT_TRANSFORM); if (is_clamp) { - const TransDataContainer *tc = TRANS_DATA_CONTAINER_FIRST_OK(t); - VertSlideData *sld = static_cast(tc->custom.mode.data); - sld->update_active_edges(t, float2(event->mval)); + calcVertSlideMouseActiveEdges(t, float2(event->mval)); } calcVertSlideCustomPoints(t); break; @@ -259,34 +349,27 @@ static eRedrawFlag handleEventVertSlide(TransInfo *t, const wmEvent *event) static void drawVertSlide(TransInfo *t) { - TransDataContainer *tc = TRANS_DATA_CONTAINER_FIRST_OK(t); - VertSlideData *sld = static_cast(tc->custom.mode.data); - if (sld) { + if (TRANS_DATA_CONTAINER_FIRST_OK(t)->custom.mode.data) { const VertSlideParams *slp = static_cast(t->custom.mode.data); + VertSlideData *sld = static_cast( + TRANS_DATA_CONTAINER_FIRST_OK(t)->custom.mode.data); const bool is_clamp = !(t->flag & T_ALT_TRANSFORM); - /* Non-Prop mode. */ + /* Non-Prop mode */ { TransDataVertSlideVert *curr_sv = &sld->sv[sld->curr_sv_index]; - - const float3 &co_orig_3d_act = curr_sv->co_orig_3d(); - const float3 &co_dest_3d_act = curr_sv->co_dest_3d(); - + TransDataVertSlideVert *sv; const float ctrl_size = UI_GetThemeValuef(TH_FACEDOT_SIZE) + 1.5f; const float line_size = UI_GetThemeValuef(TH_OUTLINE_WIDTH) + 0.5f; const int alpha_shade = -160; + int i; GPU_depth_test(GPU_DEPTH_NONE); GPU_blend(GPU_BLEND_ALPHA); GPU_matrix_push(); - if (t->spacetype == SPACE_VIEW3D) { - GPU_matrix_mul(tc->obedit->object_to_world().ptr()); - } - else { - GPU_matrix_scale_2f(1 / t->aspect[0], 1 / t->aspect[1]); - } + GPU_matrix_mul(TRANS_DATA_CONTAINER_FIRST_OK(t)->obedit->object_to_world); GPU_line_width(line_size); @@ -296,23 +379,23 @@ static void drawVertSlide(TransInfo *t) immBindBuiltinProgram(GPU_SHADER_3D_UNIFORM_COLOR); immUniformThemeColorShadeAlpha(TH_EDGE_SELECT, 80, alpha_shade); - immBegin(GPU_PRIM_LINES, sld->sv.size() * 2); + immBegin(GPU_PRIM_LINES, sld->totsv * 2); if (is_clamp) { - for (TransDataVertSlideVert &sv : sld->sv) { - immVertex3fv(shdr_pos, sv.co_orig_3d()); - immVertex3fv(shdr_pos, sv.co_dest_3d()); + sv = sld->sv; + for (i = 0; i < sld->totsv; i++, sv++) { + immVertex3fv(shdr_pos, sv->co_orig_3d); + immVertex3fv(shdr_pos, sv->co_link_orig_3d[sv->co_link_curr]); } } else { - for (TransDataVertSlideVert &sv : sld->sv) { - const float3 &co_orig_3d = sv.co_orig_3d(); - const float3 &co_dest_3d = sv.co_dest_3d(); + sv = sld->sv; + for (i = 0; i < sld->totsv; i++, sv++) { float a[3], b[3]; - sub_v3_v3v3(a, co_dest_3d, co_orig_3d); + sub_v3_v3v3(a, sv->co_link_orig_3d[sv->co_link_curr], sv->co_orig_3d); mul_v3_fl(a, 100.0f); negate_v3_v3(b, a); - add_v3_v3(a, co_orig_3d); - add_v3_v3(b, co_orig_3d); + add_v3_v3(a, sv->co_orig_3d); + add_v3_v3(b, sv->co_orig_3d); immVertex3fv(shdr_pos, a); immVertex3fv(shdr_pos, b); @@ -323,85 +406,87 @@ static void drawVertSlide(TransInfo *t) GPU_point_size(ctrl_size); immBegin(GPU_PRIM_POINTS, 1); - immVertex3fv(shdr_pos, (slp->flipped && slp->use_even) ? co_dest_3d_act : co_orig_3d_act); + immVertex3fv(shdr_pos, + (slp->flipped && slp->use_even) ? + curr_sv->co_link_orig_3d[curr_sv->co_link_curr] : + curr_sv->co_orig_3d); immEnd(); immUnbindProgram(); - GPU_matrix_pop(); - - /* Direction from active vertex! */ + /* direction from active vertex! */ if (!compare_v2v2(t->mval, t->mouse.imval, FLT_EPSILON)) { - /* 2D Pixel Space. */ - GPU_matrix_push_projection(); - GPU_matrix_push(); - GPU_matrix_identity_set(); - wmOrtho2_region_pixelspace(t->region); + float zfac; + float co_orig_3d[3]; + float co_dest_3d[3]; - float3 co_orig_3d_cpy = co_orig_3d_act; - if (t->spacetype != SPACE_VIEW3D) { - co_orig_3d_cpy[0] /= t->aspect[0]; - co_orig_3d_cpy[1] /= t->aspect[1]; - } + float2 xy_delta = t->mval - t->mouse.imval; - float2 loc_src_act_2d = sld->project(co_orig_3d_cpy); - float2 loc_mval_dir = loc_src_act_2d + (t->mval - t->mouse.imval); + mul_v3_m4v3(co_orig_3d, + TRANS_DATA_CONTAINER_FIRST_OK(t)->obedit->object_to_world, + curr_sv->co_orig_3d); + zfac = ED_view3d_calc_zfac(static_cast(t->region->regiondata), + co_orig_3d); + + ED_view3d_win_to_delta(t->region, xy_delta, zfac, co_dest_3d); + + invert_m4_m4(TRANS_DATA_CONTAINER_FIRST_OK(t)->obedit->world_to_object, + TRANS_DATA_CONTAINER_FIRST_OK(t)->obedit->object_to_world); + mul_mat3_m4_v3(TRANS_DATA_CONTAINER_FIRST_OK(t)->obedit->world_to_object, co_dest_3d); + + add_v3_v3(co_dest_3d, curr_sv->co_orig_3d); GPU_line_width(1.0f); - const uint shdr_pos_2d = GPU_vertformat_attr_add( - immVertexFormat(), "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT); - immBindBuiltinProgram(GPU_SHADER_3D_LINE_DASHED_UNIFORM_COLOR); float viewport_size[4]; GPU_viewport_size_get_f(viewport_size); immUniform2f("viewport_size", viewport_size[2], viewport_size[3]); - immUniform1i("colors_len", 0); /* "simple" mode. */ + immUniform1i("colors_len", 0); /* "simple" mode */ immUniformColor4f(1.0f, 1.0f, 1.0f, 1.0f); immUniform1f("dash_width", 6.0f); immUniform1f("udash_factor", 0.5f); immBegin(GPU_PRIM_LINES, 2); - immVertex2fv(shdr_pos_2d, loc_src_act_2d); - immVertex2fv(shdr_pos_2d, loc_mval_dir); + immVertex3fv(shdr_pos, curr_sv->co_orig_3d); + immVertex3fv(shdr_pos, co_dest_3d); immEnd(); immUnbindProgram(); - - GPU_matrix_pop(); - GPU_matrix_pop_projection(); } + + GPU_matrix_pop(); + + GPU_depth_test(GPU_DEPTH_LESS_EQUAL); } } } -static void vert_slide_apply_elem(const TransDataVertSlideVert &sv, +static void vert_slide_apply_elem(const TransDataVertSlideVert *sv, const float perc, const bool use_even, const bool use_flip, float r_co[3]) { - const float3 &co_orig_3d = sv.co_orig_3d(); - const float3 &co_dest_3d = sv.co_dest_3d(); if (use_even == false) { - interp_v3_v3v3(r_co, co_orig_3d, co_dest_3d, perc); + interp_v3_v3v3(r_co, sv->co_orig_3d, sv->co_link_orig_3d[sv->co_link_curr], perc); } else { float dir[3]; - sub_v3_v3v3(dir, co_dest_3d, co_orig_3d); + sub_v3_v3v3(dir, sv->co_link_orig_3d[sv->co_link_curr], sv->co_orig_3d); float edge_len = normalize_v3(dir); if (edge_len > FLT_EPSILON) { if (use_flip) { - madd_v3_v3v3fl(r_co, co_dest_3d, dir, -perc); + madd_v3_v3v3fl(r_co, sv->co_link_orig_3d[sv->co_link_curr], dir, -perc); } else { - madd_v3_v3v3fl(r_co, co_orig_3d, dir, perc); + madd_v3_v3v3fl(r_co, sv->co_orig_3d, dir, perc); } } else { - copy_v3_v3(r_co, co_orig_3d); + copy_v3_v3(r_co, sv->co_orig_3d); } } } @@ -423,12 +508,14 @@ static void doVertSlide(TransInfo *t, float perc) float tperc = perc; if (use_even) { TransDataVertSlideVert *sv_curr = &sld->sv[sld->curr_sv_index]; - const float edge_len_curr = len_v3v3(sv_curr->co_orig_3d(), sv_curr->co_dest_3d()); + const float edge_len_curr = len_v3v3(sv_curr->co_orig_3d, + sv_curr->co_link_orig_3d[sv_curr->co_link_curr]); tperc *= edge_len_curr; } - for (TransDataVertSlideVert &sv : sld->sv) { - vert_slide_apply_elem(sv, tperc, use_even, slp->flipped, sv.td->loc); + TransDataVertSlideVert *sv = sld->sv; + for (int i = 0; i < sld->totsv; i++, sv++) { + vert_slide_apply_elem(sv, tperc, use_even, slp->flipped, sv->v->co); } } } @@ -438,10 +525,10 @@ static void vert_slide_snap_apply(TransInfo *t, float *value) TransDataContainer *tc = TRANS_DATA_CONTAINER_FIRST_OK(t); VertSlideData *sld = static_cast(tc->custom.mode.data); TransDataVertSlideVert *sv = &sld->sv[sld->curr_sv_index]; - float3 co_orig_3d = sv->co_orig_3d(); - float3 co_curr_3d = sv->co_dest_3d(); - float snap_point[3], dvec[3]; + float snap_point[3], co_orig_3d[3], co_curr_3d[3], dvec[3]; + copy_v3_v3(co_orig_3d, sv->co_orig_3d); + copy_v3_v3(co_curr_3d, sv->co_link_orig_3d[sv->co_link_curr]); if (tc->use_local_mat) { mul_m4_v3(tc->mat, co_orig_3d); mul_m4_v3(tc->mat, co_curr_3d); @@ -483,7 +570,7 @@ static void applyVertSlide(TransInfo *t) transform_snap_increment(t, &final); } - /* Only do this so out of range values are not displayed. */ + /* only do this so out of range values are not displayed */ if (is_constrained) { CLAMP(final, 0.0f, 1.0f); } @@ -492,7 +579,7 @@ static void applyVertSlide(TransInfo *t) t->values_final[0] = final; - /* Header string. */ + /* header string */ ofs += BLI_strncpy_rlen(str + ofs, IFACE_("Vertex Slide: "), sizeof(str) - ofs); if (hasNumInput(&t->num)) { char c[NUM_STR_REP_LEN]; @@ -510,9 +597,9 @@ static void applyVertSlide(TransInfo *t) } ofs += BLI_snprintf_rlen( str + ofs, sizeof(str) - ofs, IFACE_("Alt or (C)lamp: %s"), WM_bool_as_string(is_clamp)); - /* Done with header string. */ + /* done with header string */ - /* Do stuff here. */ + /* do stuff here */ doVertSlide(t, final); recalc_data(t); @@ -522,22 +609,22 @@ static void applyVertSlide(TransInfo *t) static void vert_slide_transform_matrix_fn(TransInfo *t, float mat_xform[4][4]) { - float delta[3]; + float delta[3], orig_co[3], final_co[3]; VertSlideParams *slp = static_cast(t->custom.mode.data); TransDataContainer *tc = TRANS_DATA_CONTAINER_FIRST_OK(t); - VertSlideData *sld = static_cast(tc->custom.mode.data); - TransDataVertSlideVert &sv_active = sld->sv[sld->curr_sv_index]; - float3 orig_co = sv_active.co_orig_3d(); - const float3 &loc_dst_act = sv_active.co_dest_3d(); + VertSlideData *sld_active = static_cast(tc->custom.mode.data); + TransDataVertSlideVert *sv_active = &sld_active->sv[sld_active->curr_sv_index]; + + copy_v3_v3(orig_co, sv_active->co_orig_3d); float tperc = t->values_final[0]; if (slp->use_even) { - const float edge_len_curr = len_v3v3(orig_co, loc_dst_act); + const float edge_len_curr = len_v3v3(sv_active->co_orig_3d, + sv_active->co_link_orig_3d[sv_active->co_link_curr]); tperc *= edge_len_curr; } - float3 final_co; vert_slide_apply_elem(sv_active, tperc, slp->use_even, slp->flipped, final_co); if (tc->use_local_mat) { @@ -572,9 +659,6 @@ static void initVertSlide_ex(TransInfo *t, bool use_even, bool flipped, bool use FOREACH_TRANS_DATA_CONTAINER (t, tc) { VertSlideData *sld = createVertSlideVerts(t, tc); if (sld) { - sld->update_active_vert(t, t->mval); - sld->update_active_edges(t, t->mval); - tc->custom.mode.data = sld; tc->custom.mode.free_cb = freeVertSlideVerts; ok = true; @@ -586,7 +670,10 @@ static void initVertSlide_ex(TransInfo *t, bool use_even, bool flipped, bool use return; } - /* Set custom point first if you want value to be initialized by init. */ + calcVertSlideMouseActiveVert(t, t->mval); + calcVertSlideMouseActiveEdges(t, t->mval); + + /* set custom point first if you want value to be initialized by init */ calcVertSlideCustomPoints(t); initMouseInputMode(t, &t->mouse, INPUT_CUSTOM_RATIO); @@ -621,10 +708,11 @@ static void initVertSlide(TransInfo *t, wmOperator *op) void transform_mode_vert_slide_reproject_input(TransInfo *t) { - FOREACH_TRANS_DATA_CONTAINER (t, tc) { - VertSlideData *sld = static_cast(tc->custom.mode.data); - if (sld) { - sld->update_proj_mat(t, tc); + if (t->spacetype == SPACE_VIEW3D) { + RegionView3D *rv3d = static_cast(t->region->regiondata); + FOREACH_TRANS_DATA_CONTAINER (t, tc) { + VertSlideData *sld = static_cast(tc->custom.mode.data); + sld->proj_mat = ED_view3d_ob_project_mat_get(rv3d, tc->obedit); } } diff --git a/source/blender/editors/transform/transform_ops.cc b/source/blender/editors/transform/transform_ops.cc index c43f6c5621f..a56d649b78b 100644 --- a/source/blender/editors/transform/transform_ops.cc +++ b/source/blender/editors/transform/transform_ops.cc @@ -15,12 +15,13 @@ #include "BLI_math_vector.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_context.hh" -#include "BKE_global.hh" -#include "BKE_report.hh" -#include "BKE_scene.hh" +#include "BKE_editmesh.hh" +#include "BKE_global.h" +#include "BKE_report.h" +#include "BKE_scene.h" #include "RNA_access.hh" #include "RNA_define.hh" @@ -35,7 +36,7 @@ #include "UI_resources.hh" #include "ED_screen.hh" -/** For #USE_LOOPSLIDE_HACK only. */ +/* for USE_LOOPSLIDE_HACK only */ #include "ED_mesh.hh" #include "transform.hh" @@ -189,13 +190,13 @@ static void TRANSFORM_OT_select_orientation(wmOperatorType *ot) { PropertyRNA *prop; - /* Identifiers. */ + /* identifiers */ ot->name = "Select Orientation"; ot->description = "Select transformation orientation"; ot->idname = "TRANSFORM_OT_select_orientation"; ot->flag = OPTYPE_UNDO; - /* API callbacks. */ + /* api callbacks */ ot->invoke = select_orientation_invoke; ot->exec = select_orientation_exec; ot->poll = ED_operator_view3d_active; @@ -237,13 +238,13 @@ static bool delete_orientation_poll(bContext *C) static void TRANSFORM_OT_delete_orientation(wmOperatorType *ot) { - /* Identifiers. */ + /* identifiers */ ot->name = "Delete Orientation"; ot->description = "Delete transformation orientation"; ot->idname = "TRANSFORM_OT_delete_orientation"; ot->flag = OPTYPE_UNDO; - /* API callbacks. */ + /* api callbacks */ ot->invoke = delete_orientation_invoke; ot->exec = delete_orientation_exec; ot->poll = delete_orientation_poll; @@ -285,13 +286,13 @@ static int create_orientation_exec(bContext *C, wmOperator *op) static void TRANSFORM_OT_create_orientation(wmOperatorType *ot) { - /* Identifiers. */ + /* identifiers */ ot->name = "Create Orientation"; ot->description = "Create transformation orientation from selection"; ot->idname = "TRANSFORM_OT_create_orientation"; ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; - /* API callbacks. */ + /* api callbacks */ ot->exec = create_orientation_exec; ot->poll = ED_operator_areaactive; @@ -349,7 +350,7 @@ static void transformops_loopsel_hack(bContext *C, wmOperator *op) } } #else -/* Prevent removal by cleanup. */ +/* prevent removal by cleanup */ # error "loopslide hack removed!" #endif /* USE_LOOPSLIDE_HACK */ @@ -387,7 +388,7 @@ static int transformops_data(bContext *C, wmOperator *op, const wmEvent *event) int mode = transformops_mode(op); retval = initTransform(C, t, op, event, mode); - /* Store data. */ + /* store data */ if (retval) { G.moving = special_transform_moving(t); op->customdata = t; @@ -397,7 +398,7 @@ static int transformops_data(bContext *C, wmOperator *op, const wmEvent *event) } } - return retval; /* Return 0 on error. */ + return retval; /* return 0 on error */ } static int transform_modal(bContext *C, wmOperator *op, const wmEvent *event) @@ -417,7 +418,7 @@ static int transform_modal(bContext *C, wmOperator *op, const wmEvent *event) } #endif - /* XXX insert keys are called here, and require context. */ + /* XXX insert keys are called here, and require context */ t->context = C; exit_code = transformEvent(t, event); t->context = nullptr; @@ -486,7 +487,7 @@ static int transform_modal(bContext *C, wmOperator *op, const wmEvent *event) if (ot_new) { WM_operator_type_set(op, ot_new); } - /* End suspicious code. */ + /* end suspicious code */ } } @@ -538,7 +539,7 @@ static int transform_invoke(bContext *C, wmOperator *op, const wmEvent *event) return transform_exec(C, op); } - /* Add temp handler. */ + /* add temp handler */ WM_event_add_modal_handler(C, op); /* Use when modal input has some transformation to begin with. */ @@ -558,28 +559,33 @@ static bool transform_poll_property(const bContext *C, wmOperator *op, const Pro const char *prop_id = RNA_property_identifier(prop); /* Orientation/Constraints. */ - if (STRPREFIX(prop_id, "constraint")) { + { /* Hide orientation axis if no constraints are set, since it won't be used. */ PropertyRNA *prop_con = RNA_struct_find_property(op->ptr, "orient_type"); if (!ELEM(prop_con, nullptr, prop)) { + if (STRPREFIX(prop_id, "constraint")) { - /* Special case: show constraint axis if we don't have values, - * needed for mirror operator. */ - if (STREQ(prop_id, "constraint_axis") && - (RNA_struct_find_property(op->ptr, "value") == nullptr)) - { - return true; + /* Special case: show constraint axis if we don't have values, + * needed for mirror operator. */ + if (STREQ(prop_id, "constraint_axis") && + (RNA_struct_find_property(op->ptr, "value") == nullptr)) + { + return true; + } + + return false; } - - return false; } - return true; } /* Orientation Axis. */ - if (STREQ(prop_id, "orient_axis")) { - eTfmMode mode = (eTfmMode)transformops_mode(op); - return mode != TFM_ALIGN; + { + if (STREQ(prop_id, "orient_axis")) { + eTfmMode mode = (eTfmMode)transformops_mode(op); + if (mode == TFM_ALIGN) { + return false; + } + } } /* Proportional Editing. */ @@ -599,18 +605,15 @@ static bool transform_poll_property(const bContext *C, wmOperator *op, const Pro * - "use_proportional_projected". */ return false; } - return true; } /* Snapping. */ - if (STREQ(prop_id, "use_snap_project")) { - return RNA_boolean_get(op->ptr, "snap"); - } - - /* #P_CORRECT_UV. */ - if (STREQ(prop_id, "correct_uv")) { - ScrArea *area = CTX_wm_area(C); - return area->spacetype == SPACE_VIEW3D; + { + if (STREQ(prop_id, "use_snap_project")) { + if (RNA_boolean_get(op->ptr, "snap") == false) { + return false; + } + } } return true; @@ -661,7 +664,7 @@ void Transform_Properties(wmOperatorType *ot, int flags) if (flags & P_MIRROR) { prop = RNA_def_boolean(ot->srna, "mirror", false, "Mirror Editing", ""); if ((flags & P_MIRROR_DUMMY) == P_MIRROR_DUMMY) { - /* Only used so macros can disable this option. */ + /* only used so macros can disable this option */ RNA_def_property_flag(prop, PROP_HIDDEN); } } @@ -818,13 +821,13 @@ void Transform_Properties(wmOperatorType *ot, int flags) static void TRANSFORM_OT_translate(wmOperatorType *ot) { - /* Identifiers. */ + /* identifiers */ ot->name = "Move"; ot->description = "Move selected items"; ot->idname = OP_TRANSLATION; ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_BLOCKING; - /* API callbacks. */ + /* api callbacks */ ot->invoke = transform_invoke; ot->exec = transform_exec; ot->modal = transform_modal; @@ -845,13 +848,13 @@ static void TRANSFORM_OT_translate(wmOperatorType *ot) static void TRANSFORM_OT_resize(wmOperatorType *ot) { - /* Identifiers. */ + /* identifiers */ ot->name = "Resize"; ot->description = "Scale (resize) selected items"; ot->idname = OP_RESIZE; ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_BLOCKING; - /* API callbacks. */ + /* api callbacks */ ot->invoke = transform_invoke; ot->exec = transform_exec; ot->modal = transform_modal; @@ -884,13 +887,13 @@ static void TRANSFORM_OT_resize(wmOperatorType *ot) static void TRANSFORM_OT_skin_resize(wmOperatorType *ot) { - /* Identifiers. */ + /* identifiers */ ot->name = "Skin Resize"; ot->description = "Scale selected vertices' skin radii"; ot->idname = OP_SKIN_RESIZE; ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_BLOCKING; - /* API callbacks. */ + /* api callbacks */ ot->invoke = transform_invoke; ot->exec = transform_exec; ot->modal = transform_modal; @@ -910,13 +913,13 @@ static void TRANSFORM_OT_skin_resize(wmOperatorType *ot) static void TRANSFORM_OT_trackball(wmOperatorType *ot) { - /* Identifiers. */ + /* identifiers */ ot->name = "Trackball"; ot->description = "Trackball style rotation of selected items"; ot->idname = OP_TRACKBALL; ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_BLOCKING; - /* API callbacks. */ + /* api callbacks */ ot->invoke = transform_invoke; ot->exec = transform_exec; ot->modal = transform_modal; @@ -935,13 +938,13 @@ static void TRANSFORM_OT_trackball(wmOperatorType *ot) static void TRANSFORM_OT_rotate(wmOperatorType *ot) { - /* Identifiers. */ + /* identifiers */ ot->name = "Rotate"; ot->description = "Rotate selected items"; ot->idname = OP_ROTATION; ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_BLOCKING; - /* API callbacks. */ + /* api callbacks */ ot->invoke = transform_invoke; ot->exec = transform_exec; ot->modal = transform_modal; @@ -977,16 +980,16 @@ static bool tilt_poll(bContext *C) static void TRANSFORM_OT_tilt(wmOperatorType *ot) { - /* Identifiers. */ + /* identifiers */ ot->name = "Tilt"; - /* Optional - + /* optional - * "Tilt selected vertices" - * "Specify an extra axis rotation for selected vertices of 3D curve". */ + * "Specify an extra axis rotation for selected vertices of 3D curve" */ ot->description = "Tilt selected control vertices of 3D curve"; ot->idname = OP_TILT; ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_BLOCKING; - /* API callbacks. */ + /* api callbacks */ ot->invoke = transform_invoke; ot->exec = transform_exec; ot->modal = transform_modal; @@ -1004,16 +1007,16 @@ static void TRANSFORM_OT_tilt(wmOperatorType *ot) static void TRANSFORM_OT_bend(wmOperatorType *ot) { - /* Identifiers. */ + /* identifiers */ ot->name = "Bend"; ot->description = "Bend selected items between the 3D cursor and the mouse"; ot->idname = OP_BEND; /* Depend on cursor location because the cursor location is used to define the region to bend. */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_BLOCKING | OPTYPE_DEPENDS_ON_CURSOR; - /* API callbacks. */ + /* api callbacks */ ot->invoke = transform_invoke; - // ot->exec = transform_exec; /* Unsupported. */ + // ot->exec = transform_exec; /* unsupported */ ot->modal = transform_modal; ot->cancel = transform_cancel; ot->poll = ED_operator_region_view3d_active; @@ -1039,13 +1042,13 @@ static bool transform_shear_poll(bContext *C) static void TRANSFORM_OT_shear(wmOperatorType *ot) { - /* Identifiers. */ + /* identifiers */ ot->name = "Shear"; ot->description = "Shear selected items along the given axis"; ot->idname = OP_SHEAR; ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_BLOCKING; - /* API callbacks. */ + /* api callbacks */ ot->invoke = transform_invoke; ot->exec = transform_exec; ot->modal = transform_modal; @@ -1064,13 +1067,13 @@ static void TRANSFORM_OT_shear(wmOperatorType *ot) static void TRANSFORM_OT_push_pull(wmOperatorType *ot) { - /* Identifiers. */ + /* identifiers */ ot->name = "Push/Pull"; ot->description = "Push/Pull selected items"; ot->idname = OP_PUSH_PULL; ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_BLOCKING; - /* API callbacks. */ + /* api callbacks */ ot->invoke = transform_invoke; ot->exec = transform_exec; ot->modal = transform_modal; @@ -1087,13 +1090,13 @@ static void TRANSFORM_OT_push_pull(wmOperatorType *ot) static void TRANSFORM_OT_shrink_fatten(wmOperatorType *ot) { - /* Identifiers. */ + /* identifiers */ ot->name = "Shrink/Fatten"; ot->description = "Shrink/fatten selected vertices along normals"; ot->idname = OP_SHRINK_FATTEN; ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_BLOCKING; - /* API callbacks. */ + /* api callbacks */ ot->invoke = transform_invoke; ot->exec = transform_exec; ot->modal = transform_modal; @@ -1116,13 +1119,13 @@ static void TRANSFORM_OT_shrink_fatten(wmOperatorType *ot) static void TRANSFORM_OT_tosphere(wmOperatorType *ot) { - /* Identifiers. */ + /* identifiers */ ot->name = "To Sphere"; ot->description = "Move selected items outward in a spherical shape around geometric center"; ot->idname = OP_TOSPHERE; ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_BLOCKING; - /* API callbacks. */ + /* api callbacks */ ot->invoke = transform_invoke; ot->exec = transform_exec; ot->modal = transform_modal; @@ -1139,13 +1142,13 @@ static void TRANSFORM_OT_tosphere(wmOperatorType *ot) static void TRANSFORM_OT_mirror(wmOperatorType *ot) { - /* Identifiers. */ + /* identifiers */ ot->name = "Mirror"; ot->description = "Mirror selected items around one or more axes"; ot->idname = OP_MIRROR; ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_BLOCKING; - /* API callbacks. */ + /* api callbacks */ ot->invoke = transform_invoke; ot->exec = transform_exec; ot->modal = transform_modal; @@ -1158,13 +1161,13 @@ static void TRANSFORM_OT_mirror(wmOperatorType *ot) static void TRANSFORM_OT_bbone_resize(wmOperatorType *ot) { - /* Identifiers. */ + /* identifiers */ ot->name = "Scale B-Bone"; ot->description = "Scale selected bendy bones display size"; ot->idname = OP_BONE_SIZE; ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_BLOCKING; - /* API callbacks. */ + /* api callbacks */ ot->invoke = transform_invoke; ot->exec = transform_exec; ot->modal = transform_modal; @@ -1184,18 +1187,18 @@ static void TRANSFORM_OT_edge_slide(wmOperatorType *ot) { PropertyRNA *prop; - /* Identifiers. */ + /* identifiers */ ot->name = "Edge Slide"; ot->description = "Slide an edge loop along a mesh"; ot->idname = OP_EDGE_SLIDE; ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_BLOCKING; - /* API callbacks. */ + /* api callbacks */ ot->invoke = transform_invoke; ot->exec = transform_exec; ot->modal = transform_modal; ot->cancel = transform_cancel; - ot->poll = ED_operator_editmesh; + ot->poll = ED_operator_editmesh_region_view3d; ot->poll_property = transform_poll_property; RNA_def_float_factor(ot->srna, "value", 0, -10.0f, 10.0f, "Factor", "", -1.0f, 1.0f); @@ -1222,18 +1225,18 @@ static void TRANSFORM_OT_edge_slide(wmOperatorType *ot) static void TRANSFORM_OT_vert_slide(wmOperatorType *ot) { - /* Identifiers. */ + /* identifiers */ ot->name = "Vertex Slide"; ot->description = "Slide a vertex along a mesh"; ot->idname = OP_VERT_SLIDE; ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_BLOCKING | OPTYPE_DEPENDS_ON_CURSOR; - /* API callbacks. */ + /* api callbacks */ ot->invoke = transform_invoke; ot->exec = transform_exec; ot->modal = transform_modal; ot->cancel = transform_cancel; - ot->poll = ED_operator_editmesh; + ot->poll = ED_operator_editmesh_region_view3d; ot->poll_property = transform_poll_property; RNA_def_float_factor(ot->srna, "value", 0, -10.0f, 10.0f, "Factor", "", -1.0f, 1.0f); @@ -1257,13 +1260,13 @@ static void TRANSFORM_OT_vert_slide(wmOperatorType *ot) static void TRANSFORM_OT_edge_crease(wmOperatorType *ot) { - /* Identifiers. */ + /* identifiers */ ot->name = "Edge Crease"; ot->description = "Change the crease of edges"; ot->idname = OP_EDGE_CREASE; ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_BLOCKING; - /* API callbacks. */ + /* api callbacks */ ot->invoke = transform_invoke; ot->exec = transform_exec; ot->modal = transform_modal; @@ -1280,13 +1283,13 @@ static void TRANSFORM_OT_edge_crease(wmOperatorType *ot) static void TRANSFORM_OT_vert_crease(wmOperatorType *ot) { - /* Identifiers. */ + /* identifiers */ ot->name = "Vertex Crease"; ot->description = "Change the crease of vertices"; ot->idname = OP_VERT_CREASE; ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_BLOCKING; - /* API callbacks. */ + /* api callbacks */ ot->invoke = transform_invoke; ot->exec = transform_exec; ot->modal = transform_modal; @@ -1303,13 +1306,13 @@ static void TRANSFORM_OT_vert_crease(wmOperatorType *ot) static void TRANSFORM_OT_edge_bevelweight(wmOperatorType *ot) { - /* Identifiers. */ + /* identifiers */ ot->name = "Edge Bevel Weight"; ot->description = "Change the bevel weight of edges"; ot->idname = OP_EDGE_BWEIGHT; ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_BLOCKING; - /* API callbacks. */ + /* api callbacks */ ot->invoke = transform_invoke; ot->exec = transform_exec; ot->modal = transform_modal; @@ -1325,20 +1328,20 @@ static void TRANSFORM_OT_edge_bevelweight(wmOperatorType *ot) static void TRANSFORM_OT_seq_slide(wmOperatorType *ot) { - /* Identifiers. */ + /* identifiers */ ot->name = "Sequence Slide"; ot->description = "Slide a sequence strip in time"; ot->idname = OP_SEQ_SLIDE; ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_BLOCKING; - /* API callbacks. */ + /* api callbacks */ ot->invoke = transform_invoke; ot->exec = transform_exec; ot->modal = transform_modal; ot->cancel = transform_cancel; ot->poll = ED_operator_sequencer_active; - /* Properties. */ + /* properties */ PropertyRNA *prop; prop = RNA_def_float_vector( @@ -1352,13 +1355,13 @@ static void TRANSFORM_OT_seq_slide(wmOperatorType *ot) static void TRANSFORM_OT_rotate_normal(wmOperatorType *ot) { - /* Identifiers. */ + /* identifiers */ ot->name = "Rotate Normals"; ot->description = "Rotate split normal of selected items"; ot->idname = OP_NORMAL_ROTATION; ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_BLOCKING; - /* API callbacks. */ + /* api callbacks */ ot->invoke = transform_invoke; ot->exec = transform_exec; ot->modal = transform_modal; @@ -1375,13 +1378,13 @@ static void TRANSFORM_OT_transform(wmOperatorType *ot) { PropertyRNA *prop; - /* Identifiers. */ + /* identifiers */ ot->name = "Transform"; ot->description = "Transform selected items by mode type"; ot->idname = "TRANSFORM_OT_transform"; ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_BLOCKING; - /* API callbacks. */ + /* api callbacks */ ot->invoke = transform_invoke; ot->exec = transform_exec; ot->modal = transform_modal; @@ -1447,13 +1450,13 @@ static int transform_from_gizmo_invoke(bContext *C, wmOperator * /*op*/, const w /* Use with 'TRANSFORM_GGT_gizmo'. */ static void TRANSFORM_OT_from_gizmo(wmOperatorType *ot) { - /* Identifiers. */ + /* identifiers */ ot->name = "Transform from Gizmo"; ot->description = "Transform selected items by mode type"; ot->idname = "TRANSFORM_OT_from_gizmo"; ot->flag = 0; - /* API callbacks. */ + /* api callbacks */ ot->invoke = transform_from_gizmo_invoke; } diff --git a/source/blender/editors/transform/transform_orientations.cc b/source/blender/editors/transform/transform_orientations.cc index 18348c92d77..b72f612f9c6 100644 --- a/source/blender/editors/transform/transform_orientations.cc +++ b/source/blender/editors/transform/transform_orientations.cc @@ -37,10 +37,10 @@ #include "BKE_curve.hh" #include "BKE_editmesh.hh" #include "BKE_layer.hh" -#include "BKE_report.hh" -#include "BKE_scene.hh" +#include "BKE_report.h" +#include "BKE_scene.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "ED_armature.hh" @@ -63,7 +63,7 @@ void BIF_clearTransformOrientation(bContext *C) for (int i = 0; i < ARRAY_SIZE(scene->orientation_slots); i++) { TransformOrientationSlot *orient_slot = &scene->orientation_slots[i]; if (orient_slot->type == V3D_ORIENT_CUSTOM) { - orient_slot->type = V3D_ORIENT_GLOBAL; /* Fallback to global. */ + orient_slot->type = V3D_ORIENT_GLOBAL; /* fallback to global */ orient_slot->index_custom = -1; } } @@ -134,10 +134,10 @@ static TransformOrientation *createObjectSpace(bContext *C, ob = base->object; - copy_m3_m4(mat, ob->object_to_world().ptr()); + copy_m3_m4(mat, ob->object_to_world); normalize_m3(mat); - /* Use object name if no name is given. */ + /* use object name if no name is given */ if (name[0] == 0) { name = ob->id.name + 2; } @@ -243,9 +243,7 @@ static bool test_rotmode_euler(short rotmode) return ELEM(rotmode, ROT_MODE_AXISANGLE, ROT_MODE_QUAT) ? false : true; } -/** - * Could move into BLI_math_rotation.h however this is only useful for display/editing purposes. - */ +/* could move into BLI_math_rotation.h however this is only useful for display/editing purposes */ static void axis_angle_to_gimbal_axis(float gmat[3][3], const float axis[3], const float angle) { /* X/Y are arbitrary axes, most importantly Z is the axis of rotation. */ @@ -253,23 +251,24 @@ static void axis_angle_to_gimbal_axis(float gmat[3][3], const float axis[3], con float cross_vec[3]; float quat[4]; - /* This is an un-scientific method to get a vector to cross with XYZ intentionally YZX. */ + /* this is an un-scientific method to get a vector to cross with + * XYZ intentionally YZX */ cross_vec[0] = axis[1]; cross_vec[1] = axis[2]; cross_vec[2] = axis[0]; - /* X-axis. */ + /* X-axis */ cross_v3_v3v3(gmat[0], cross_vec, axis); normalize_v3(gmat[0]); axis_angle_to_quat(quat, axis, angle); mul_qt_v3(quat, gmat[0]); - /* Y-axis. */ + /* Y-axis */ axis_angle_to_quat(quat, axis, M_PI_2); copy_v3_v3(gmat[1], gmat[0]); mul_qt_v3(quat, gmat[1]); - /* Z-axis. */ + /* Z-axis */ copy_v3_v3(gmat[2], axis); normalize_m3(gmat); @@ -284,11 +283,11 @@ bool gimbal_axis_pose(Object *ob, const bPoseChannel *pchan, float gmat[3][3]) else if (pchan->rotmode == ROT_MODE_AXISANGLE) { axis_angle_to_gimbal_axis(mat, pchan->rotAxis, pchan->rotAngle); } - else { /* Quaternion. */ + else { /* quat */ return false; } - /* Apply bone transformation. */ + /* apply bone transformation */ mul_m3_m3m3(tmat, pchan->bone->bone_mat, mat); if (pchan->parent) { @@ -299,13 +298,13 @@ bool gimbal_axis_pose(Object *ob, const bPoseChannel *pchan, float gmat[3][3]) pchan->parent->pose_mat); mul_m3_m3m3(mat, parent_mat, tmat); - /* Needed if object transformation isn't identity. */ - copy_m3_m4(obmat, ob->object_to_world().ptr()); + /* needed if object transformation isn't identity */ + copy_m3_m4(obmat, ob->object_to_world); mul_m3_m3m3(gmat, obmat, mat); } else { - /* Needed if object transformation isn't identity. */ - copy_m3_m4(obmat, ob->object_to_world().ptr()); + /* needed if object transformation isn't identity */ + copy_m3_m4(obmat, ob->object_to_world); mul_m3_m3m3(gmat, obmat, tmat); } @@ -321,13 +320,13 @@ bool gimbal_axis_object(Object *ob, float gmat[3][3]) else if (ob->rotmode == ROT_MODE_AXISANGLE) { axis_angle_to_gimbal_axis(gmat, ob->rotAxis, ob->rotAngle); } - else { /* Quaternion. */ + else { /* quat */ return false; } if (ob->parent) { float parent_mat[3][3]; - copy_m3_m4(parent_mat, ob->parent->object_to_world().ptr()); + copy_m3_m4(parent_mat, ob->parent->object_to_world); normalize_m3(parent_mat); mul_m3_m3m3(gmat, parent_mat, gmat); } @@ -388,7 +387,7 @@ bool createSpaceNormal(float mat[3][3], const float normal[3]) copy_v3_v3(mat[2], normal); if (normalize_v3(mat[2]) == 0.0f) { - return false; /* Error return. */ + return false; /* error return */ } cross_v3_v3v3(mat[0], mat[2], tangent); @@ -408,25 +407,25 @@ bool createSpaceNormal(float mat[3][3], const float normal[3]) bool createSpaceNormalTangent(float mat[3][3], const float normal[3], const float tangent[3]) { if (normalize_v3_v3(mat[2], normal) == 0.0f) { - return false; /* Error return. */ + return false; /* error return */ } - /* Negate so we can use values from the matrix as input. */ + /* negate so we can use values from the matrix as input */ negate_v3_v3(mat[1], tangent); - /* Preempt zero length tangent from causing trouble. */ + /* preempt zero length tangent from causing trouble */ if (is_zero_v3(mat[1])) { mat[1][2] = 1.0f; } cross_v3_v3v3(mat[0], mat[2], mat[1]); if (normalize_v3(mat[0]) == 0.0f) { - return false; /* Error return. */ + return false; /* error return */ } cross_v3_v3v3(mat[1], mat[2], mat[0]); normalize_v3(mat[1]); - /* Final matrix must be normalized, do inline. */ + /* final matrix must be normalized, do inline */ // normalize_m3(mat); return true; @@ -491,7 +490,7 @@ TransformOrientation *addMatrixSpace(bContext *C, name = name_unique; } - /* If not, create a new one. */ + /* if not, create a new one */ if (ts == nullptr) { ts = static_cast( MEM_callocN(sizeof(TransformOrientation), "UserTransSpace from matrix")); @@ -499,7 +498,7 @@ TransformOrientation *addMatrixSpace(bContext *C, STRNCPY(ts->name, name); } - /* Copy matrix into transform space. */ + /* copy matrix into transform space */ copy_m3_m3(ts->mat, mat); return ts; @@ -561,7 +560,7 @@ static int armature_bone_transflags_update_recursive(bArmature *arm, bone->flag |= BONE_TRANSFORM; total++; - /* No transform on children if one parent bone is selected. */ + /* no transform on children if one parent bone is selected */ do_next = false; } } @@ -598,21 +597,20 @@ static void handle_armature_parent_orientation(Object *ob, float r_mat[3][3]) /* For child, show parent local regardless if "local location" is set for parent bone. */ transform_orientations_create_from_axis(r_mat, UNPACK3(active_pchan->parent->pose_mat)); float ob_orientations_mat[3][3]; - transform_orientations_create_from_axis(ob_orientations_mat, - UNPACK3(ob->object_to_world().ptr())); + transform_orientations_create_from_axis(ob_orientations_mat, UNPACK3(ob->object_to_world)); mul_m3_m3_pre(r_mat, ob_orientations_mat); return; } /* For root, use local transform of armature object. */ - transform_orientations_create_from_axis(r_mat, UNPACK3(ob->object_to_world().ptr())); + transform_orientations_create_from_axis(r_mat, UNPACK3(ob->object_to_world)); } static void handle_object_parent_orientation(Object *ob, float r_mat[3][3]) { /* If object has parent, then orient to parent. */ if (ob->parent) { - transform_orientations_create_from_axis(r_mat, UNPACK3(ob->parent->object_to_world().ptr())); + transform_orientations_create_from_axis(r_mat, UNPACK3(ob->parent->object_to_world)); } else { /* If object doesn't have parent, then orient to world. */ @@ -679,7 +677,7 @@ short ED_transform_calc_orientation_from_type_ex(const Scene *scene, ED_getTransformOrientationMatrix(scene, view_layer, v3d, ob, obedit, pivot_point, r_mat); } else { - transform_orientations_create_from_axis(r_mat, UNPACK3(ob->object_to_world().ptr())); + transform_orientations_create_from_axis(r_mat, UNPACK3(ob->object_to_world)); } break; } @@ -818,7 +816,7 @@ void transform_orientations_current_set(TransInfo *t, const short orient_index) } /** - * Utility function - get first n, selected vert/edge/faces. + * utility function - get first n, selected vert/edge/faces */ static uint bm_mesh_elems_select_get_n__internal( BMesh *bm, BMElem **elems, const uint n, const BMIterType itype, const char htype) @@ -831,13 +829,13 @@ static uint bm_mesh_elems_select_get_n__internal( BLI_assert(ELEM(itype, BM_VERTS_OF_MESH, BM_EDGES_OF_MESH, BM_FACES_OF_MESH)); if (!BLI_listbase_is_empty(&bm->selected)) { - /* Quick check. */ + /* quick check */ i = 0; LISTBASE_FOREACH_BACKWARD (BMEditSelection *, ese, &bm->selected) { - /* Shouldn't need this check. */ + /* shouldn't need this check */ if (BM_elem_flag_test(ese->ele, BM_ELEM_SELECT)) { - /* Only use contiguous selection. */ + /* only use contiguous selection */ if (ese->htype != htype) { i = 0; break; @@ -854,7 +852,7 @@ static uint bm_mesh_elems_select_get_n__internal( } if (i == 0) { - /* Pass. */ + /* pass */ } else if (i == n) { return i; @@ -911,8 +909,8 @@ int getTransformOrientation_ex(const Scene *scene, if (obedit) { float imat[3][3], mat[3][3]; - /* We need the transpose of the inverse for a normal... */ - copy_m3_m4(imat, ob->object_to_world().ptr()); + /* we need the transpose of the inverse for a normal... */ + copy_m3_m4(imat, ob->object_to_world); invert_m3_m3(mat, imat); transpose_m3(mat); @@ -924,7 +922,7 @@ int getTransformOrientation_ex(const Scene *scene, BMEditSelection ese; float vec[3] = {0, 0, 0}; - /* Use last selected with active. */ + /* USE LAST SELECTED WITH ACTIVE */ if (activeOnly && BM_select_history_active_get(em->bm, &ese)) { BM_editselection_normal(&ese, normal); BM_editselection_plane(&ese, plane); @@ -965,7 +963,7 @@ int getTransformOrientation_ex(const Scene *scene, normal_tri_v3(normal, v_tri[0]->co, v_tri[1]->co, v_tri[2]->co); - /* Check if the normal is pointing opposite to vert normals. */ + /* check if the normal is pointing opposite to vert normals */ no_test[0] = v_tri[0]->no[0] + v_tri[1]->no[0] + v_tri[2]->no[0]; no_test[1] = v_tri[0]->no[1] + v_tri[1]->no[1] + v_tri[2]->no[1]; no_test[2] = v_tri[0]->no[2] + v_tri[1]->no[2] + v_tri[2]->no[2]; @@ -974,7 +972,7 @@ int getTransformOrientation_ex(const Scene *scene, } if (em->bm->totedgesel >= 1) { - /* Find an edge that's a part of v_tri (no need to search all edges). */ + /* find an edge that's a part of v_tri (no need to search all edges) */ float e_length; int j; @@ -1026,7 +1024,7 @@ int getTransformOrientation_ex(const Scene *scene, bm_mesh_verts_select_get_n(em->bm, v_pair, 2); } - /* Should never fail. */ + /* should never fail */ if (LIKELY(v_pair[0] && v_pair[1])) { bool v_pair_swap = false; /** @@ -1040,12 +1038,12 @@ int getTransformOrientation_ex(const Scene *scene, * take care making changes here, see: #38592, #43708 */ - /* Be deterministic where possible and ensure `v_pair[0]` is active. */ + /* be deterministic where possible and ensure v_pair[0] is active */ if (BM_mesh_active_vert_get(em->bm) == v_pair[1]) { v_pair_swap = true; } else if (eed && BM_edge_is_boundary(eed)) { - /* Predictable direction for boundary edges. */ + /* predictable direction for boundary edges */ if (eed->l->v != v_pair[0]) { v_pair_swap = true; } @@ -1063,7 +1061,7 @@ int getTransformOrientation_ex(const Scene *scene, * project onto the plane so we can use a fallback value. */ project_plane_normalized_v3_v3v3(normal, normal, plane); if (UNLIKELY(normalize_v3(normal) == 0.0f)) { - /* In the case the normal and plane are aligned, + /* in the case the normal and plane are aligned, * use a fallback normal which is orthogonal to the plane. */ ortho_v3_v3(normal, plane); } @@ -1131,10 +1129,10 @@ int getTransformOrientation_ex(const Scene *scene, } } - /* Not needed but this matches 2.68 and older behavior. */ + /* not needed but this matches 2.68 and older behavior */ negate_v3(plane); - } /* End edit-mesh. */ + } /* end editmesh */ else if (ELEM(obedit->type, OB_CURVES_LEGACY, OB_SURF)) { Curve *cu = static_cast(obedit->data); Nurb *nu = nullptr; @@ -1158,7 +1156,7 @@ int getTransformOrientation_ex(const Scene *scene, const bool use_handle = v3d->overlay.handle_display != CURVE_HANDLE_NONE; for (nu = static_cast(nurbs->first); nu; nu = nu->next) { - /* Only bezier has a normal. */ + /* only bezier has a normal */ if (nu->type == CU_BEZIER) { BezTriple *bezt = nu->bezt; a = nu->pntsu; @@ -1184,7 +1182,7 @@ int getTransformOrientation_ex(const Scene *scene, flag = (bezt->f2 & SELECT) ? (SEL_F1 | SEL_F2 | SEL_F3) : 0; } - /* Exception. */ + /* exception */ if (flag) { float tvec[3]; if ((around == V3D_AROUND_LOCAL_ORIGINS) || @@ -1194,7 +1192,7 @@ int getTransformOrientation_ex(const Scene *scene, add_v3_v3(normal, tvec); } else { - /* Ignore `bezt->f2` in this case. */ + /* ignore bezt->f2 in this case */ if (flag & SEL_F1) { sub_v3_v3v3(tvec, bezt->vec[0], bezt->vec[1]); normalize_v3(tvec); @@ -1231,12 +1229,12 @@ int getTransformOrientation_ex(const Scene *scene, const bool is_prev_sel = bp_prev && (bp_prev->f1 & SELECT); const bool is_next_sel = bp_next && (bp_next->f1 & SELECT); if (is_prev_sel == false && is_next_sel == false) { - /* Isolated, add based on surrounding. */ + /* Isolated, add based on surrounding */ BKE_nurb_bpoint_calc_normal(nu, bp, tvec); add_v3_v3(normal, tvec); } else if (is_next_sel) { - /* A segment, add the edge normal. */ + /* A segment, add the edge normal */ sub_v3_v3v3(tvec, bp->vec, bp_next->vec); normalize_v3(tvec); add_v3_v3(normal, tvec); @@ -1338,14 +1336,14 @@ int getTransformOrientation_ex(const Scene *scene, } } - /* Vectors from edges don't need the special transpose inverse multiplication. */ + /* Vectors from edges don't need the special transpose inverse multiplication */ if (result == ORIENTATION_EDGE) { float tvec[3]; - mul_mat3_m4_v3(ob->object_to_world().ptr(), normal); - mul_mat3_m4_v3(ob->object_to_world().ptr(), plane); + mul_mat3_m4_v3(ob->object_to_world, normal); + mul_mat3_m4_v3(ob->object_to_world, plane); - /* Align normal to edge direction (so normal is perpendicular to the plane). + /* align normal to edge direction (so normal is perpendicular to the plane). * 'ORIENTATION_EDGE' will do the other way around. * This has to be done **after** applying obmat, see #45775! */ project_v3_v3v3(tvec, normal, plane); @@ -1371,7 +1369,7 @@ int getTransformOrientation_ex(const Scene *scene, int transformed_len; transformed_len = armature_bone_transflags_update_recursive(arm, &arm->bonebase, true); if (transformed_len) { - /* Use channels to get stats. */ + /* use channels to get stats */ LISTBASE_FOREACH (bPoseChannel *, pchan, &ob->pose->chanbase) { if (pchan->bone && pchan->bone->flag & BONE_TRANSFORM) { add_v3_v3(normal, pchan->pose_mat[2]); @@ -1382,10 +1380,10 @@ int getTransformOrientation_ex(const Scene *scene, } } - /* Use for both active & all. */ + /* use for both active & all */ if (ok) { - /* We need the transpose of the inverse for a normal. */ - copy_m3_m4(imat, ob->object_to_world().ptr()); + /* we need the transpose of the inverse for a normal... */ + copy_m3_m4(imat, ob->object_to_world); invert_m3_m3(mat, imat); transpose_m3(mat); @@ -1396,7 +1394,7 @@ int getTransformOrientation_ex(const Scene *scene, } } else { - /* We need the one selected object, if its not active. */ + /* we need the one selected object, if its not active */ if (ob != nullptr) { bool ok = false; if (activeOnly || (ob->mode & (OB_MODE_ALL_PAINT | OB_MODE_PARTICLE_EDIT))) { @@ -1417,8 +1415,8 @@ int getTransformOrientation_ex(const Scene *scene, } if (ok) { - copy_v3_v3(normal, ob->object_to_world().ptr()[2]); - copy_v3_v3(plane, ob->object_to_world().ptr()[1]); + copy_v3_v3(normal, ob->object_to_world[2]); + copy_v3_v3(plane, ob->object_to_world[1]); } } result = ORIENTATION_NORMAL; @@ -1432,7 +1430,7 @@ int getTransformOrientation(const bContext *C, float normal[3], float plane[3]) Object *obact = CTX_data_active_object(C); Object *obedit = CTX_data_edit_object(C); - /* Dummy value, not #V3D_AROUND_ACTIVE and not #V3D_AROUND_LOCAL_ORIGINS. */ + /* dummy value, not V3D_AROUND_ACTIVE and not V3D_AROUND_LOCAL_ORIGINS */ short around = V3D_AROUND_CENTER_BOUNDS; const Scene *scene = CTX_data_scene(C); diff --git a/source/blender/editors/transform/transform_snap.cc b/source/blender/editors/transform/transform_snap.cc index 5e9693d3c93..70b30865f8b 100644 --- a/source/blender/editors/transform/transform_snap.cc +++ b/source/blender/editors/transform/transform_snap.cc @@ -10,6 +10,7 @@ #include "DNA_windowmanager_types.h" +#include "BLI_blenlib.h" #include "BLI_math_matrix.h" #include "BLI_math_rotation.h" #include "BLI_time.h" @@ -19,17 +20,20 @@ #include "GPU_matrix.h" #include "GPU_state.h" +#include "BKE_context.hh" #include "BKE_editmesh.hh" #include "BKE_layer.hh" #include "BKE_node_runtime.hh" #include "BKE_object.hh" -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "RNA_access.hh" #include "WM_api.hh" #include "WM_types.hh" +#include "ED_gizmo_library.hh" +#include "ED_markers.hh" #include "ED_node.hh" #include "ED_transform_snap_object_context.hh" #include "ED_uvedit.hh" @@ -38,7 +42,9 @@ #include "UI_resources.hh" #include "UI_view2d.hh" +#include "SEQ_iterator.hh" #include "SEQ_sequencer.hh" +#include "SEQ_time.hh" #include "MEM_guardedalloc.h" @@ -49,7 +55,7 @@ using namespace blender; -/* Use half of flt-max so we can scale up without an exception. */ +/* use half of flt-max so we can scale up without an exception */ /* -------------------------------------------------------------------- */ /** \name Prototypes @@ -82,7 +88,7 @@ int BIF_snappingSupported(Object *obedit) { int status = 0; - /* Only support object mesh, armature, curves. */ + /* only support object mesh, armature, curves */ if (obedit == nullptr || ELEM(obedit->type, OB_MESH, OB_ARMATURE, OB_CURVES_LEGACY, OB_LATTICE, OB_MBALL)) { @@ -367,7 +373,7 @@ eRedrawFlag handleSnapping(TransInfo *t, const wmEvent *event) { eRedrawFlag status = TREDRAW_NOTHING; -#if 0 /* XXX: need a proper selector for all snap mode. */ +#if 0 /* XXX need a proper selector for all snap mode */ if (BIF_snappingSupported(t->obedit) && (event->type == EVT_TABKEY) && (event->modifier & KM_SHIFT)) { @@ -395,7 +401,7 @@ static bool applyFaceProject(TransInfo *t, TransDataContainer *tc, TransData *td } else if (t->options & CTX_OBJECT) { BKE_object_eval_transform_all(t->depsgraph, t->scene, td->ob); - copy_v3_v3(iloc, td->ob->object_to_world().location()); + copy_v3_v3(iloc, td->ob->object_to_world[3]); } if (ED_view3d_project_float_global(t->region, iloc, mval_fl, V3D_PROJ_TEST_NOP) != @@ -434,7 +440,7 @@ static bool applyFaceProject(TransInfo *t, TransDataContainer *tc, TransData *td add_v3_v3(td->loc, tvec); if ((t->tsnap.flag & SCE_SNAP_ROTATE) && (t->options & CTX_OBJECT)) { - /* Handle alignment as well. */ + /* handle alignment as well */ const float *original_normal; float mat[3][3]; @@ -464,7 +470,7 @@ static void applyFaceNearest(TransInfo *t, TransDataContainer *tc, TransData *td } else if (t->options & CTX_OBJECT) { BKE_object_eval_transform_all(t->depsgraph, t->scene, td->ob); - copy_v3_v3(init_loc, td->ob->object_to_world().location()); + copy_v3_v3(init_loc, td->ob->object_to_world[3]); } SnapObjectParams snap_object_params{}; @@ -515,7 +521,7 @@ void transform_snap_project_individual_apply(TransInfo *t) return; } - /* XXX: flickers in object mode. */ + /* XXX FLICKER IN OBJECT MODE */ FOREACH_TRANS_DATA_CONTAINER (t, tc) { TransData *td = tc->data; for (int i = 0; i < tc->data_len; i++, td++) { @@ -562,7 +568,7 @@ void transform_snap_mixed_apply(TransInfo *t, float *vec) } if (t->tsnap.mode & ~(SCE_SNAP_TO_INCREMENT | SCE_SNAP_TO_GRID)) { - double current = BLI_time_now_seconds(); + double current = BLI_check_seconds_timer(); /* Time base quirky code to go around find-nearest slowness. */ /* TODO: add exception for object mode, no need to slow it down then. */ @@ -739,11 +745,11 @@ static eSnapTargetOP snap_target_select_from_spacetype(TransInfo *t) const int obedit_type = t->obedit_type; if (obedit_type != -1) { - /* Edit mode. */ + /* Edit mode */ if (obedit_type == OB_MESH) { - /* Editing a mesh. */ + /* Editing a mesh */ if ((t->flag & T_PROP_EDIT) != 0) { - /* Exclude editmesh when using proportional edit. */ + /* Exclude editmesh when using proportional edit */ ret |= SCE_SNAP_TARGET_NOT_EDITED; } /* UV editing must never snap to the selection as this is what is transformed. */ @@ -837,7 +843,7 @@ void initSnapping(TransInfo *t, wmOperator *op) t->tsnap.target_operation = snap_target_select_from_spacetype(t); t->tsnap.face_nearest_steps = max_ii(ts->snap_face_nearest_steps, 1); - /* If snap property exists. */ + /* if snap property exists */ PropertyRNA *prop; if (op && (prop = RNA_struct_find_property(op->ptr, "snap")) && RNA_property_is_set(op->ptr, prop)) @@ -868,7 +874,7 @@ void initSnapping(TransInfo *t, wmOperator *op) t->tsnap.status |= SNAP_TARGET_FOUND; } - /* Snap align only defined in specific cases. */ + /* snap align only defined in specific cases */ if ((prop = RNA_struct_find_property(op->ptr, "snap_align")) && RNA_property_is_set(op->ptr, prop)) { @@ -886,7 +892,7 @@ void initSnapping(TransInfo *t, wmOperator *op) t->tsnap.mode, RNA_property_boolean_get(op->ptr, prop), SCE_SNAP_INDIVIDUAL_PROJECT); } - /* Use_snap_self is misnamed and should be use_snap_active. */ + /* use_snap_self is misnamed and should be use_snap_active */ if ((prop = RNA_struct_find_property(op->ptr, "use_snap_self")) && RNA_property_is_set(op->ptr, prop)) { @@ -920,7 +926,7 @@ void initSnapping(TransInfo *t, wmOperator *op) } } } - /* Use scene defaults only when transform is modal. */ + /* use scene defaults only when transform is modal */ else if (t->flag & T_MODAL) { if (t->tsnap.flag & SCE_SNAP) { t->modifiers |= MOD_SNAP; @@ -961,18 +967,6 @@ void freeSnapping(TransInfo *t) } } -void initSnapAngleIncrements(TransInfo *t) -{ - if (t->spacetype == SPACE_VIEW3D) { - t->snap[0] = t->settings->snap_angle_increment_3d; - t->snap[1] = t->settings->snap_angle_increment_3d_precision; - } - else { - t->snap[0] = t->settings->snap_angle_increment_2d; - t->snap[1] = t->settings->snap_angle_increment_2d_precision; - } -} - static void setSnappingCallback(TransInfo *t) { if (t->spacetype == SPACE_VIEW3D) { @@ -1156,7 +1150,7 @@ static void snap_target_view3d_fn(TransInfo *t, float * /*vec*/) float dist_px = SNAP_MIN_DISTANCE; /* Use a user defined value here. */ if (t->tsnap.mode & SCE_SNAP_TO_GEOM) { - zero_v3(no); /* Objects won't set this. */ + zero_v3(no); /* objects won't set this */ snap_elem = snapObjectsTransform(t, t->mval, &dist_px, loc, no); found = (snap_elem != SCE_SNAP_TO_NONE); } @@ -1317,7 +1311,7 @@ static void TargetSnapOffset(TransInfo *t, TransData *td) static void snap_source_center_fn(TransInfo *t) { - /* Only need to calculate once. */ + /* Only need to calculate once */ if ((t->tsnap.status & SNAP_SOURCE_FOUND) == 0) { copy_v3_v3(t->tsnap.snap_source, t->center_global); TargetSnapOffset(t, nullptr); @@ -1329,7 +1323,7 @@ static void snap_source_center_fn(TransInfo *t) static void snap_source_active_fn(TransInfo *t) { - /* Only need to calculate once. */ + /* Only need to calculate once */ if ((t->tsnap.status & SNAP_SOURCE_FOUND) == 0) { if (calculateCenterActive(t, true, t->tsnap.snap_source)) { TargetSnapOffset(t, nullptr); @@ -1362,7 +1356,7 @@ static void snap_source_closest_fn(TransInfo *t) float dist_closest = 0.0f; TransData *closest = nullptr; - /* Object mode. */ + /* Object mode */ if (t->options & CTX_OBJECT) { int i; FOREACH_TRANS_DATA_CONTAINER (t, tc) { @@ -1374,7 +1368,7 @@ static void snap_source_closest_fn(TransInfo *t) bounds = BKE_object_boundbox_get(td->ob); } - /* Use bound-box if possible. */ + /* use boundbox if possible */ if (bounds) { BoundBox bb; BKE_boundbox_init_from_minmax(&bb, bounds->min, bounds->max); @@ -1398,7 +1392,7 @@ static void snap_source_closest_fn(TransInfo *t) } } } - /* Use element center otherwise. */ + /* use element center otherwise */ else { float loc[3]; float dist; @@ -1491,7 +1485,7 @@ eSnapMode snapObjectsTransform( bool peelObjectsTransform(TransInfo *t, const float mval[2], const bool use_peel_object, - /* Return args. */ + /* return args */ float r_loc[3], float r_no[3], float *r_thickness) @@ -1512,7 +1506,7 @@ bool peelObjectsTransform(TransInfo *t, &depths_peel); if (!BLI_listbase_is_empty(&depths_peel)) { - /* At the moment we only use the hits of the first object. */ + /* At the moment we only use the hits of the first object */ SnapObjectHitDepth *hit_min = static_cast(depths_peel.first); for (SnapObjectHitDepth *iter = hit_min->next; iter; iter = iter->next) { if (iter->depth < hit_min->depth) { @@ -1522,7 +1516,7 @@ bool peelObjectsTransform(TransInfo *t, SnapObjectHitDepth *hit_max = nullptr; if (use_peel_object) { - /* If peeling objects, take the first and last from each object. */ + /* if peeling objects, take the first and last from each object */ hit_max = hit_min; LISTBASE_FOREACH (SnapObjectHitDepth *, iter, &depths_peel) { if ((iter->depth > hit_max->depth) && (iter->ob_uuid == hit_min->ob_uuid)) { @@ -1531,7 +1525,7 @@ bool peelObjectsTransform(TransInfo *t, } } else { - /* Otherwise, pair first with second and so on. */ + /* otherwise, pair first with second and so on */ LISTBASE_FOREACH (SnapObjectHitDepth *, iter, &depths_peel) { if ((iter != hit_min) && (iter->ob_uuid == hit_min->ob_uuid)) { if (hit_max == nullptr) { @@ -1554,7 +1548,7 @@ bool peelObjectsTransform(TransInfo *t, *r_thickness = hit_max->depth - hit_min->depth; } - /* XXX, is there a correct normal in this case ???, for now just z up. */ + /* XXX, is there a correct normal in this case ???, for now just z up */ r_no[0] = 0.0; r_no[1] = 0.0; r_no[2] = 1.0; @@ -1573,7 +1567,7 @@ bool peelObjectsTransform(TransInfo *t, static bool snapNodeTest(View2D *v2d, bNode *node, eSnapTargetOP snap_target_select) { - /* Node is use for snapping only if a) snap mode matches and b) node is inside the view. */ + /* node is use for snapping only if a) snap mode matches and b) node is inside the view */ return (((snap_target_select & SCE_SNAP_TARGET_NOT_SELECTED) && !(node->flag & NODE_SELECT)) || (snap_target_select == SCE_SNAP_TARGET_ALL && !(node->flag & NODE_ACTIVE))) && (node->runtime->totr.xmin < v2d->cur.xmax && node->runtime->totr.xmax > v2d->cur.xmin && @@ -1701,7 +1695,7 @@ static void snap_increment_apply_ex(const TransInfo * /*t*/, const float loc[3], float r_out[3]) { - /* Relative snapping in fixed increments. */ + /* relative snapping in fixed increments */ for (int i = 0; i <= max_index; i++) { const float iter_fac = increment_val * aspect[i]; r_out[i] = iter_fac * roundf(loc[i] / iter_fac); @@ -1716,7 +1710,7 @@ static void snap_increment_apply(const TransInfo *t, BLI_assert(t->tsnap.mode & SCE_SNAP_TO_INCREMENT); BLI_assert(max_index <= 2); - /* Early bailing out if no need to snap. */ + /* Early bailing out if no need to snap */ if (increment_dist == 0.0f) { return; } @@ -1726,7 +1720,7 @@ static void snap_increment_apply(const TransInfo *t, const float *asp = use_aspect ? t->aspect : asp_local; if (use_aspect) { - /* Custom aspect for fcurve. */ + /* custom aspect for fcurve */ if (t->spacetype == SPACE_GRAPH) { View2D *v2d = &t->region->v2d; Scene *scene = t->scene; @@ -1758,6 +1752,7 @@ bool transform_snap_increment_ex(const TransInfo *t, bool use_local_space, float } if (use_local_space) { + BLI_assert(t->idx_max == 2); mul_m3_v3(t->spacemtx_inv, r_val); } @@ -1788,9 +1783,7 @@ float transform_snap_increment_get(const TransInfo *t) void tranform_snap_source_restore_context(TransInfo *t) { - if (t->spacetype == SPACE_VIEW3D) { - snap_object_context_init(t); - } + snap_object_context_init(t); snap_multipoints_free(t); } diff --git a/source/blender/editors/transform/transform_snap.hh b/source/blender/editors/transform/transform_snap.hh index 4d276554845..79a23f518b9 100644 --- a/source/blender/editors/transform/transform_snap.hh +++ b/source/blender/editors/transform/transform_snap.hh @@ -17,7 +17,7 @@ bool peelObjectsTransform(TransInfo *t, const float mval[2], bool use_peel_object, - /* Return args. */ + /* return args */ float r_loc[3], float r_no[3], float *r_thickness); @@ -25,12 +25,12 @@ bool peelObjectsTransform(TransInfo *t, eSnapMode snapObjectsTransform(TransInfo *t, const float mval[2], float *dist_px, - /* Return args. */ + /* return args */ float r_loc[3], float r_no[3]); bool snapNodesTransform(TransInfo *t, const blender::float2 &mval, - /* Return args. */ + /* return args */ float r_loc[2], float *r_dist_px, char *r_node_border); @@ -51,7 +51,6 @@ bool validSnap(const TransInfo *t); void initSnapping(TransInfo *t, wmOperator *op); void freeSnapping(TransInfo *t); -void initSnapAngleIncrements(TransInfo *t); bool transform_snap_project_individual_is_active(const TransInfo *t); void transform_snap_project_individual_apply(TransInfo *t); void transform_snap_mixed_apply(TransInfo *t, float *vec); @@ -75,12 +74,12 @@ void transform_snap_sequencer_data_free(TransSeqSnapData *data); bool transform_snap_sequencer_calc(TransInfo *t); void transform_snap_sequencer_apply_translate(TransInfo *t, float *vec); -/* `transform_snap_animation.cc` */ +/* transform_snap_animation.cc */ void snapFrameTransform( TransInfo *t, eSnapMode autosnap, float val_initial, float val_final, float *r_val_final); /** * This function is used by Animation Editor specific transform functions to do - * the Snap Keyframe to Nearest Frame/Marker. + * the Snap Keyframe to Nearest Frame/Marker */ void transform_snap_anim_flush_data(TransInfo *t, TransData *td, diff --git a/source/blender/editors/transform/transform_snap_animation.cc b/source/blender/editors/transform/transform_snap_animation.cc index abee64eb0d9..0282dbfc2c5 100644 --- a/source/blender/editors/transform/transform_snap_animation.cc +++ b/source/blender/editors/transform/transform_snap_animation.cc @@ -6,12 +6,16 @@ * \ingroup edtransform */ +#include "DNA_anim_types.h" + #include "BLI_math_matrix_types.hh" #include "BLI_math_vector.h" +#include "BKE_context.hh" #include "BKE_nla.h" #include "ED_markers.hh" +#include "ED_screen.hh" #include "transform.hh" #include "transform_snap.hh" @@ -78,7 +82,7 @@ static void transform_snap_anim_flush_data_ex( AnimData *adt = static_cast(!ELEM(t->spacetype, SPACE_NLA, SPACE_SEQ) ? td->extra : nullptr); - /* Convert frame to nla-action time (if needed). */ + /* Convert frame to nla-action time (if needed) */ if (adt) { val = BKE_nla_tweakedit_remap(adt, val, NLATIME_CONVERT_MAP); ival = BKE_nla_tweakedit_remap(adt, ival, NLATIME_CONVERT_MAP); diff --git a/source/blender/editors/transform/transform_snap_object.cc b/source/blender/editors/transform/transform_snap_object.cc index c927394119f..c52a99e3045 100644 --- a/source/blender/editors/transform/transform_snap_object.cc +++ b/source/blender/editors/transform/transform_snap_object.cc @@ -13,7 +13,8 @@ #include "DNA_screen_types.h" #include "BKE_bvhutils.hh" -#include "BKE_duplilist.hh" +#include "BKE_duplilist.h" +#include "BKE_editmesh.hh" #include "BKE_geometry_set_instances.hh" #include "BKE_layer.hh" #include "BKE_mesh.hh" @@ -28,7 +29,6 @@ #ifdef DEBUG_SNAP_TIME # include "BLI_timeit.hh" -# include # if WIN32 and NDEBUG # pragma optimize("t", on) @@ -368,30 +368,34 @@ static ID *data_for_snap(Object *ob_eval, eSnapEditType edit_mode_type, bool *r_ switch (ob_eval->type) { case OB_MESH: { - Mesh *mesh_eval = BKE_object_get_evaluated_mesh(ob_eval); + Mesh *me_eval = BKE_object_get_evaluated_mesh(ob_eval); if (BKE_object_is_in_editmode(ob_eval)) { if (edit_mode_type == SNAP_GEOM_EDIT) { return nullptr; } - Mesh *editmesh_eval = (edit_mode_type == SNAP_GEOM_FINAL) ? - BKE_object_get_editmesh_eval_final(ob_eval) : - (edit_mode_type == SNAP_GEOM_CAGE) ? - BKE_object_get_editmesh_eval_cage(ob_eval) : - nullptr; + Mesh *editmesh_eval_final = BKE_object_get_editmesh_eval_final(ob_eval); + Mesh *editmesh_eval_cage = BKE_object_get_editmesh_eval_cage(ob_eval); - if (editmesh_eval) { - if (editmesh_eval->runtime->wrapper_type == ME_WRAPPER_TYPE_BMESH) { + if ((edit_mode_type == SNAP_GEOM_FINAL) && editmesh_eval_final) { + if (editmesh_eval_final->runtime->wrapper_type == ME_WRAPPER_TYPE_BMESH) { return nullptr; } - mesh_eval = editmesh_eval; + me_eval = editmesh_eval_final; + use_hide = true; + } + else if ((edit_mode_type == SNAP_GEOM_CAGE) && editmesh_eval_cage) { + if (editmesh_eval_cage->runtime->wrapper_type == ME_WRAPPER_TYPE_BMESH) { + return nullptr; + } + me_eval = editmesh_eval_cage; use_hide = true; } } if (r_use_hide) { *r_use_hide = use_hide; } - return (ID *)mesh_eval; + return (ID *)me_eval; } default: break; @@ -513,9 +517,12 @@ static eSnapMode iter_snap_objects(SnapObjectContext *sctx, IterSnapObjsCallback bool use_hide = false; ID *ob_data = data_for_snap(obj_eval, sctx->runtime.params.edit_mode_type, &use_hide); - if ((tmp = sob_callback( - sctx, obj_eval, ob_data, obj_eval->object_to_world(), is_object_active, use_hide)) != - SCE_SNAP_TO_NONE) + if ((tmp = sob_callback(sctx, + obj_eval, + ob_data, + float4x4(obj_eval->object_to_world), + is_object_active, + use_hide)) != SCE_SNAP_TO_NONE) { ret = tmp; } @@ -585,7 +592,7 @@ bool raycast_tri_backface_culling_test( } /** - * \note Duplicate args here are documented at #snapObjectsRay. + * \note Duplicate args here are documented at #snapObjectsRay */ static eSnapMode raycast_obj_fn(SnapObjectContext *sctx, Object *ob_eval, @@ -829,21 +836,39 @@ void cb_snap_edge(void *userdata, static eSnapMode snap_polygon(SnapObjectContext *sctx, eSnapMode snap_to_flag) { - if (sctx->ret.ob->type != OB_MESH || !sctx->ret.data || GS(sctx->ret.data->name) != ID_ME) { + if (sctx->ret.ob->type != OB_MESH) { return SCE_SNAP_TO_NONE; } - return snap_polygon_mesh( + if (sctx->ret.data && GS(sctx->ret.data->name) != ID_ME) { + return SCE_SNAP_TO_NONE; + } + + if (sctx->ret.data) { + return snap_polygon_mesh( + sctx, sctx->ret.ob, sctx->ret.data, sctx->ret.obmat, snap_to_flag, sctx->ret.index); + } + return snap_polygon_editmesh( sctx, sctx->ret.ob, sctx->ret.data, sctx->ret.obmat, snap_to_flag, sctx->ret.index); } static eSnapMode snap_edge_points(SnapObjectContext *sctx, const float dist_px_sq_orig) { - if (sctx->ret.ob->type != OB_MESH || !sctx->ret.data || GS(sctx->ret.data->name) != ID_ME) { - return SCE_SNAP_TO_EDGE; + eSnapMode elem = SCE_SNAP_TO_EDGE; + + if (sctx->ret.ob->type != OB_MESH) { + return elem; } - return snap_edge_points_mesh( + if (sctx->ret.data && GS(sctx->ret.data->name) != ID_ME) { + return elem; + } + + if (sctx->ret.data) { + return snap_edge_points_mesh( + sctx, sctx->ret.ob, sctx->ret.data, sctx->ret.obmat, dist_px_sq_orig, sctx->ret.index); + } + return snap_edge_points_editmesh( sctx, sctx->ret.ob, sctx->ret.data, sctx->ret.obmat, dist_px_sq_orig, sctx->ret.index); } @@ -875,7 +900,7 @@ eSnapMode snap_object_center(SnapObjectContext *sctx, } /** - * \note Duplicate args here are documented at #snapObjectsRay. + * \note Duplicate args here are documented at #snapObjectsRay */ static eSnapMode snap_obj_fn(SnapObjectContext *sctx, Object *ob_eval, @@ -894,7 +919,7 @@ static eSnapMode snap_obj_fn(SnapObjectContext *sctx, } if (ob_eval->dt == OB_BOUNDBOX) { - /* Do not snap to objects that are in bounding box display mode. */ + /* Do not snap to objects that are in bounding box display mode */ return SCE_SNAP_TO_NONE; } @@ -1185,7 +1210,7 @@ bool ED_transform_snap_object_project_ray_all(SnapObjectContext *sctx, if (sort) { BLI_listbase_sort(r_hit_list, hit_depth_cmp); } - /* Meant to be read-only for 'all' hits, ensure it is. */ + /* meant to be readonly for 'all' hits, ensure it is */ #ifndef NDEBUG BLI_assert(ray_depth_prev == sctx->ret.ray_depth_max); #endif diff --git a/source/blender/editors/transform/transform_snap_object.hh b/source/blender/editors/transform/transform_snap_object.hh index 50d16d439ec..d7ecec1adf2 100644 --- a/source/blender/editors/transform/transform_snap_object.hh +++ b/source/blender/editors/transform/transform_snap_object.hh @@ -25,7 +25,7 @@ struct SnapObjectContext { }; blender::Map> editmesh_caches; - /* Filter data, returns true to check this value. */ + /* Filter data, returns true to check this value */ struct { struct { bool (*test_vert_fn)(BMVert *, void *user_data); @@ -49,14 +49,14 @@ struct SnapObjectContext { blender::float3 init_co; blender::float3 curr_co; - blender::float2 win_size; /* Win x and y. */ + blender::float2 win_size; /* win x and y */ blender::float2 mval; blender::Vector clip_planes; blender::float4 occlusion_plane; blender::float4 occlusion_plane_in_front; - /* Read/write. */ + /* read/write */ uint object_index; bool has_occlusion_plane; @@ -93,7 +93,7 @@ struct SnapObjectContext { struct RayCastAll_Data { void *bvhdata; - /* Internal vars for adding depths. */ + /* internal vars for adding depths */ BVHTree_RayCastCallback raycast_callback; const blender::float4x4 *obmat; @@ -103,7 +103,7 @@ struct RayCastAll_Data { uint ob_uuid; - /* Output data. */ + /* output data */ ListBase *hit_list; }; @@ -150,7 +150,7 @@ class SnapData { virtual void copy_vert_no(const int /*index*/, float /*r_no*/[3]){}; }; -/* `transform_snap_object.cc` */ +/* transform_snap_object.cc */ void raycast_all_cb(void *userdata, int index, const BVHTreeRay *ray, BVHTreeRayHit *hit); @@ -183,25 +183,25 @@ eSnapMode snap_object_center(SnapObjectContext *sctx, const blender::float4x4 &obmat, eSnapMode snap_to_flag); -/* `transform_snap_object_armature.cc` */ +/* transform_snap_object_armature.cc */ eSnapMode snapArmature(SnapObjectContext *sctx, Object *ob_eval, const blender::float4x4 &obmat, bool is_object_active); -/* `transform_snap_object_camera.cc` */ +/* transform_snap_object_camera.cc */ eSnapMode snapCamera(SnapObjectContext *sctx, Object *object, const blender::float4x4 &obmat, eSnapMode snap_to_flag); -/* `transform_snap_object_curve.cc` */ +/* transform_snap_object_curve.cc */ eSnapMode snapCurve(SnapObjectContext *sctx, Object *ob_eval, const blender::float4x4 &obmat); -/* `transform_snap_object_editmesh.cc` */ +/* transform_snap_object_editmesh.cc */ eSnapMode snap_object_editmesh(SnapObjectContext *sctx, Object *ob_eval, @@ -210,7 +210,21 @@ eSnapMode snap_object_editmesh(SnapObjectContext *sctx, eSnapMode snap_to_flag, bool use_hide); -/* `transform_snap_object_mesh.cc` */ +eSnapMode snap_polygon_editmesh(SnapObjectContext *sctx, + Object *ob_eval, + const ID *id, + const blender::float4x4 &obmat, + eSnapMode snap_to_flag, + int face); + +eSnapMode snap_edge_points_editmesh(SnapObjectContext *sctx, + Object *ob_eval, + const ID *id, + const blender::float4x4 &obmat, + float dist_px_sq_orig, + int edge); + +/* transform_snap_object_mesh.cc */ eSnapMode snap_object_mesh(SnapObjectContext *sctx, Object *ob_eval, diff --git a/source/blender/editors/transform/transform_snap_object_armature.cc b/source/blender/editors/transform/transform_snap_object_armature.cc index b4b2c8dd34d..34b2d104bcf 100644 --- a/source/blender/editors/transform/transform_snap_object_armature.cc +++ b/source/blender/editors/transform/transform_snap_object_armature.cc @@ -10,6 +10,7 @@ #include "BKE_armature.hh" #include "BKE_bvhutils.hh" +#include "BKE_mesh.hh" #include "DNA_armature_types.h" #include "ED_transform_snap_object_context.hh" diff --git a/source/blender/editors/transform/transform_snap_object_camera.cc b/source/blender/editors/transform/transform_snap_object_camera.cc index 57ea6335b95..29632c410b8 100644 --- a/source/blender/editors/transform/transform_snap_object_camera.cc +++ b/source/blender/editors/transform/transform_snap_object_camera.cc @@ -9,6 +9,7 @@ #include "BLI_math_matrix.hh" #include "BKE_bvhutils.hh" +#include "BKE_mesh.hh" #include "BKE_object.hh" #include "BKE_tracking.h" diff --git a/source/blender/editors/transform/transform_snap_object_curve.cc b/source/blender/editors/transform/transform_snap_object_curve.cc index 9dd2d5cdd20..dc041df0423 100644 --- a/source/blender/editors/transform/transform_snap_object_curve.cc +++ b/source/blender/editors/transform/transform_snap_object_curve.cc @@ -12,6 +12,7 @@ #include "BKE_bvhutils.hh" #include "BKE_curve.hh" +#include "BKE_mesh.hh" #include "BKE_object.hh" #include "ED_transform_snap_object_context.hh" @@ -37,7 +38,7 @@ eSnapMode snapCurve(SnapObjectContext *sctx, Object *ob_eval, const float4x4 &ob const bool use_obedit = BKE_object_is_in_editmode(ob_eval); if (use_obedit == false) { - /* Test BoundBox. */ + /* Test BoundBox */ std::optional> bounds = BKE_curve_minmax(cu, true); if (bounds && !nearest2d.snap_boundbox(bounds->min, bounds->max)) { return SCE_SNAP_TO_NONE; diff --git a/source/blender/editors/transform/transform_snap_object_editmesh.cc b/source/blender/editors/transform/transform_snap_object_editmesh.cc index 1589e1b68f5..9c04253d329 100644 --- a/source/blender/editors/transform/transform_snap_object_editmesh.cc +++ b/source/blender/editors/transform/transform_snap_object_editmesh.cc @@ -6,17 +6,19 @@ * \ingroup edtransform */ -#include "BKE_attribute.hh" +#include "BLI_math_matrix.hh" +#include "BLI_math_vector.h" + #include "BKE_bvhutils.hh" #include "BKE_editmesh.hh" -#include "BKE_global.hh" -#include "BKE_lib_id.hh" +#include "BKE_global.h" #include "BKE_mesh.hh" #include "BKE_object.hh" #include "DEG_depsgraph_query.hh" #include "ED_transform_snap_object_context.hh" +#include "ED_view3d.hh" #include "transform_snap_object.hh" @@ -26,43 +28,27 @@ using namespace blender; /** \name Snap Object Data * \{ */ -static Mesh *get_mesh_ref(Object *ob_eval) -{ - if (Mesh *me = BKE_object_get_editmesh_eval_final(ob_eval)) { - return me; - } - - if (Mesh *me = BKE_object_get_editmesh_eval_cage(ob_eval)) { - return me; - } - - return static_cast(ob_eval->data); -} - struct SnapCache_EditMesh : public SnapObjectContext::SnapCache { - /* Mesh created from the edited mesh. */ - Mesh *mesh; + /* Loose Verts, Edges, Triangles. */ + BVHTree *bvhtree[3]; + bool cached[3]; - /* Reference to pointers that change when the mesh is changed. It is used to detect updates. */ - Mesh *mesh_ref; - bke::MeshRuntime *runtime_ref; - bke::EditMeshData *edit_data_ref; + BMEditMesh *em; - bool has_mesh_updated(Mesh *mesh) - { - if (mesh != this->mesh_ref || mesh->runtime != this->runtime_ref || - mesh->runtime->edit_data.get() != this->edit_data_ref) - { - return true; - } + /** Default callbacks to BVH nearest and ray-cast used only for triangles. */ + BVHTree_NearestPointCallback nearest_callback; + BVHTree_RayCastCallback raycast_callback; - return false; - } + bke::MeshRuntime *mesh_runtime; + float min[3], max[3]; void clear() { - if (this->mesh) { - BKE_id_free(nullptr, this->mesh); + for (int i = 0; i < ARRAY_SIZE(this->bvhtree); i++) { + if (!this->cached[i]) { + BLI_bvhtree_free(this->bvhtree[i]); + } + this->bvhtree[i] = nullptr; } } @@ -72,101 +58,98 @@ struct SnapCache_EditMesh : public SnapObjectContext::SnapCache { } #ifdef WITH_CXX_GUARDEDALLOC - MEM_CXX_CLASS_ALLOC_FUNCS("SnapCache_EditMesh") + MEM_CXX_CLASS_ALLOC_FUNCS("SnapData_EditMesh") #endif }; -static Mesh *create_mesh(SnapObjectContext *sctx, - Object *ob_eval, - eSnapEditType /*edit_mode_type*/) +/** + * Calculate the minimum and maximum coordinates of the box that encompasses this mesh. + */ +static void snap_editmesh_minmax(SnapObjectContext *sctx, + BMesh *bm, + float r_min[3], + float r_max[3]) { - Mesh *mesh = static_cast(BKE_id_new_nomain(ID_ME, nullptr)); - BMEditMesh *em = BKE_editmesh_from_object(ob_eval); - BMesh *bm = em->bm; - BM_mesh_bm_to_me_compact(*bm, *mesh, nullptr, false); + INIT_MINMAX(r_min, r_max); + BMIter iter; + BMVert *v; - bke::MutableAttributeAccessor attrs = mesh->attributes_for_write(); - bke::SpanAttributeWriter hide_vert = attrs.lookup_or_add_for_write_only_span( - ".hide_vert", bke::AttrDomain::Point); - bke::SpanAttributeWriter hide_edge = attrs.lookup_or_add_for_write_only_span( - ".hide_edge", bke::AttrDomain::Edge); - bke::SpanAttributeWriter hide_poly = attrs.lookup_or_add_for_write_only_span( - ".hide_poly", bke::AttrDomain::Face); + BM_ITER_MESH (v, &iter, bm, BM_VERTS_OF_MESH) { + if (sctx->callbacks.edit_mesh.test_vert_fn && + !sctx->callbacks.edit_mesh.test_vert_fn(v, sctx->callbacks.edit_mesh.user_data)) + { + continue; + } + minmax_v3v3_v3(r_min, r_max, v->co); + } +} - /* Loop over all elements in parallel to choose which elements will participate in the snap. - * Hidden elements are ignored for snapping. */ - const bool use_threading = (mesh->faces_num + mesh->edges_num) > 1024; - threading::parallel_invoke( - use_threading, - [&]() { - BMIter iter; - BMVert *v; - int i; - BM_ITER_MESH_INDEX (v, &iter, bm, BM_VERTS_OF_MESH, i) { - if (sctx->callbacks.edit_mesh.test_vert_fn) { - hide_vert.span[i] = !sctx->callbacks.edit_mesh.test_vert_fn( - v, sctx->callbacks.edit_mesh.user_data); - } - else { - hide_vert.span[i] = BM_elem_flag_test_bool(v, BM_ELEM_HIDDEN); - } - } - }, - [&]() { - BMIter iter; - BMEdge *e; - int i; - BM_ITER_MESH_INDEX (e, &iter, bm, BM_EDGES_OF_MESH, i) { - if (sctx->callbacks.edit_mesh.test_edge_fn) { - hide_edge.span[i] = !sctx->callbacks.edit_mesh.test_edge_fn( - e, sctx->callbacks.edit_mesh.user_data); - } - else { - hide_edge.span[i] = BM_elem_flag_test_bool(e, BM_ELEM_HIDDEN); - } - } - }, - [&]() { - BMIter iter; - BMFace *f; - int i; - BM_ITER_MESH_INDEX (f, &iter, bm, BM_FACES_OF_MESH, i) { - if (sctx->callbacks.edit_mesh.test_face_fn) { - hide_poly.span[i] = !sctx->callbacks.edit_mesh.test_face_fn( - f, sctx->callbacks.edit_mesh.user_data); - } - else { - hide_poly.span[i] = BM_elem_flag_test_bool(f, BM_ELEM_HIDDEN); - } - } - }); +/* Searches for the #Mesh_Runtime associated with the object that is most likely to be updated due + * to changes in the `edit_mesh`. */ +static blender::bke::MeshRuntime *snap_object_data_editmesh_runtime_get(Object *ob_eval) +{ + Mesh *editmesh_eval_final = BKE_object_get_editmesh_eval_final(ob_eval); + if (editmesh_eval_final) { + return editmesh_eval_final->runtime; + } - hide_vert.finish(); - hide_edge.finish(); - hide_poly.finish(); - return mesh; + Mesh *editmesh_eval_cage = BKE_object_get_editmesh_eval_cage(ob_eval); + if (editmesh_eval_cage) { + return editmesh_eval_cage->runtime; + } + + return ((Mesh *)ob_eval->data)->runtime; } static SnapCache_EditMesh *snap_object_data_editmesh_get(SnapObjectContext *sctx, Object *ob_eval, - bool create) + BMEditMesh *em, + const bool create) { SnapCache_EditMesh *em_cache = nullptr; - bool init = false; - Mesh *mesh_ref = (G.moving) ? /* WORKAROUND: - * Avoid updating while transforming. Do not check if the reference - * mesh has been updated. */ - nullptr : - get_mesh_ref(ob_eval); if (std::unique_ptr *em_cache_p = sctx->editmesh_caches.lookup_ptr( ob_eval->runtime->data_orig)) { em_cache = static_cast(em_cache_p->get()); - + bool is_dirty = false; /* Check if the geometry has changed. */ - if (mesh_ref && em_cache->has_mesh_updated(mesh_ref)) { + if (em_cache->em != em) { + is_dirty = true; + } + else if (em_cache->mesh_runtime) { + if (em_cache->mesh_runtime != snap_object_data_editmesh_runtime_get(ob_eval)) { + if (G.moving) { + /* WORKAROUND: avoid updating while transforming. */ + BLI_assert(!em_cache->cached[0] && !em_cache->cached[1] && !em_cache->cached[2]); + em_cache->mesh_runtime = snap_object_data_editmesh_runtime_get(ob_eval); + } + else { + is_dirty = true; + } + } + else if (em_cache->bvhtree[0] && em_cache->cached[0] && + !bvhcache_has_tree(em_cache->mesh_runtime->bvh_cache, em_cache->bvhtree[0])) + { + /* The tree is owned by the EditMesh and may have been freed since we last used! */ + is_dirty = true; + } + else if (em_cache->bvhtree[1] && em_cache->cached[1] && + !bvhcache_has_tree(em_cache->mesh_runtime->bvh_cache, em_cache->bvhtree[1])) + { + /* The tree is owned by the EditMesh and may have been freed since we last used! */ + is_dirty = true; + } + else if (em_cache->bvhtree[2] && em_cache->cached[2] && + !bvhcache_has_tree(em_cache->mesh_runtime->bvh_cache, em_cache->bvhtree[2])) + { + /* The tree is owned by the EditMesh and may have been freed since we last used! */ + is_dirty = true; + } + } + + if (is_dirty) { em_cache->clear(); init = true; } @@ -179,17 +162,54 @@ static SnapCache_EditMesh *snap_object_data_editmesh_get(SnapObjectContext *sctx } if (init) { - em_cache->mesh = create_mesh(sctx, ob_eval, sctx->runtime.params.edit_mode_type); - if (mesh_ref) { - em_cache->mesh_ref = mesh_ref; - em_cache->runtime_ref = mesh_ref->runtime; - em_cache->edit_data_ref = mesh_ref->runtime->edit_data.get(); - } + /* Operators only update the editmesh looptris of the original mesh. */ + BLI_assert(em == BKE_editmesh_from_object(DEG_get_original_object(ob_eval))); + + em_cache->em = em; + em_cache->mesh_runtime = snap_object_data_editmesh_runtime_get(ob_eval); + snap_editmesh_minmax(sctx, em->bm, em_cache->min, em_cache->max); } return em_cache; } +static void snap_cache_tri_ensure(SnapCache_EditMesh *em_cache, SnapObjectContext *sctx) +{ + if (em_cache->bvhtree[2] == nullptr) { + BVHTreeFromEditMesh treedata{}; + BMEditMesh *em = em_cache->em; + + if (sctx->callbacks.edit_mesh.test_face_fn) { + BMesh *bm = em->bm; + BLI_assert(poly_to_tri_count(bm->totface, bm->totloop) == em->tottri); + + blender::BitVector<> elem_mask(em->tottri); + int looptris_num_active = BM_iter_mesh_bitmap_from_filter_tessface( + bm, + elem_mask, + sctx->callbacks.edit_mesh.test_face_fn, + sctx->callbacks.edit_mesh.user_data); + + bvhtree_from_editmesh_looptris_ex(&treedata, em, elem_mask, looptris_num_active, 0.0f, 4, 6); + } + else { + /* Only cache if BVH-tree is created without a mask. + * This helps keep a standardized BVH-tree in cache. */ + BKE_bvhtree_from_editmesh_get(&treedata, + em, + 4, + BVHTREE_FROM_EM_LOOPTRIS, + /* WORKAROUND: avoid updating while transforming. */ + G.moving ? nullptr : &em_cache->mesh_runtime->bvh_cache, + &em_cache->mesh_runtime->eval_mutex); + } + em_cache->bvhtree[2] = treedata.tree; + em_cache->cached[2] = treedata.cached; + em_cache->nearest_callback = treedata.nearest_callback; + em_cache->raycast_callback = treedata.raycast_callback; + } +} + /** \} */ /* -------------------------------------------------------------------- */ @@ -221,7 +241,7 @@ static SnapCache_EditMesh *editmesh_snapdata_init(SnapObjectContext *sctx, return nullptr; } - SnapCache_EditMesh *em_cache = snap_object_data_editmesh_get(sctx, ob_eval, false); + SnapCache_EditMesh *em_cache = snap_object_data_editmesh_get(sctx, ob_eval, em, false); if (em_cache != nullptr) { return em_cache; } @@ -231,7 +251,423 @@ static SnapCache_EditMesh *editmesh_snapdata_init(SnapObjectContext *sctx, return nullptr; } - return snap_object_data_editmesh_get(sctx, ob_eval, true); + return snap_object_data_editmesh_get(sctx, ob_eval, em, true); +} + +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Ray Cast Functions + * \{ */ + +/* Callback to ray-cast with back-face culling (#EditMesh). */ +static void editmesh_looptris_raycast_backface_culling_cb(void *userdata, + int index, + const BVHTreeRay *ray, + BVHTreeRayHit *hit) +{ + BMEditMesh *em = static_cast(userdata); + const BMLoop **ltri = const_cast(em->looptris[index]); + + const float *t0, *t1, *t2; + t0 = ltri[0]->v->co; + t1 = ltri[1]->v->co; + t2 = ltri[2]->v->co; + + { + float dist = bvhtree_ray_tri_intersection(ray, hit->dist, t0, t1, t2); + + if (dist >= 0 && dist < hit->dist) { + float no[3]; + if (raycast_tri_backface_culling_test(ray->direction, t0, t1, t2, no)) { + hit->index = index; + hit->dist = dist; + madd_v3_v3v3fl(hit->co, ray->origin, ray->direction, dist); + normalize_v3_v3(hit->no, no); + } + } + } +} + +static bool raycastEditMesh(SnapCache_EditMesh *em_cache, + SnapObjectContext *sctx, + Object *ob_eval, + BMEditMesh *em, + const float4x4 &obmat, + const uint ob_index) +{ + bool retval = false; + + float4x4 imat = math::invert(obmat); + float3 ray_start_local = math::transform_point(imat, sctx->runtime.ray_start); + float3 ray_normal_local = math::transform_direction(imat, sctx->runtime.ray_dir); + float local_scale, local_depth, len_diff = 0.0f; + + /* local scale in normal direction */ + ray_normal_local = math::normalize_and_get_length(ray_normal_local, local_scale); + + const bool is_in_front = sctx->runtime.params.use_occlusion_test && + (ob_eval->dtx & OB_DRAW_IN_FRONT) != 0; + const float depth_max = is_in_front ? sctx->ret.ray_depth_max_in_front : sctx->ret.ray_depth_max; + local_depth = depth_max; + if (local_depth != BVH_RAYCAST_DIST_MAX) { + local_depth *= local_scale; + } + + /* Test bounding box */ + + /* was BKE_boundbox_ray_hit_check, see: cf6ca226fa58 */ + if (!isect_ray_aabb_v3_simple( + ray_start_local, ray_normal_local, em_cache->min, em_cache->max, &len_diff, nullptr)) + { + return retval; + } + + /* We pass a temp ray_start, set from object's bounding-box, to avoid precision issues with + * very far away ray_start values (as returned in case of ortho view3d), see #50486, #38358. */ + if (len_diff > 400.0f) { + len_diff -= local_scale; /* make temp start point a bit away from bounding-box hit point. */ + madd_v3_v3fl(ray_start_local, ray_normal_local, len_diff); + local_depth -= len_diff; + } + else { + len_diff = 0.0f; + } + + snap_cache_tri_ensure(em_cache, sctx); + if (em_cache->bvhtree[2] == nullptr) { + return retval; + } + + if (sctx->ret.hit_list) { + RayCastAll_Data data; + + data.bvhdata = em; + data.raycast_callback = em_cache->raycast_callback; + data.obmat = &obmat; + data.len_diff = len_diff; + data.local_scale = local_scale; + data.ob_uuid = ob_index; + data.hit_list = sctx->ret.hit_list; + + void *hit_last_prev = data.hit_list->last; + BLI_bvhtree_ray_cast_all(em_cache->bvhtree[2], + ray_start_local, + ray_normal_local, + 0.0f, + depth_max, + raycast_all_cb, + &data); + + retval = hit_last_prev != data.hit_list->last; + } + else { + BVHTreeRayHit hit{}; + hit.index = -1; + hit.dist = local_depth; + + if (BLI_bvhtree_ray_cast(em_cache->bvhtree[2], + ray_start_local, + ray_normal_local, + 0.0f, + &hit, + sctx->runtime.params.use_backface_culling ? + editmesh_looptris_raycast_backface_culling_cb : + em_cache->raycast_callback, + em) != -1) + { + hit.dist += len_diff; + hit.dist /= local_scale; + if (hit.dist <= depth_max) { + hit.index = BM_elem_index_get(em->looptris[hit.index][0]->f); + retval = true; + } + SnapData::register_result_raycast(sctx, ob_eval, nullptr, obmat, &hit, is_in_front); + } + } + + return retval; +} + +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Surface Snap Functions + * \{ */ + +static bool nearest_world_editmesh(SnapCache_EditMesh *em_cache, + SnapObjectContext *sctx, + Object *ob_eval, + BMEditMesh *em, + const float4x4 &obmat) +{ + snap_cache_tri_ensure(em_cache, sctx); + if (em_cache->bvhtree[2] == nullptr) { + return false; + } + + BVHTreeNearest nearest{}; + nearest.dist_sq = sctx->ret.dist_nearest_sq; + if (nearest_world_tree( + sctx, em_cache->bvhtree[2], em_cache->nearest_callback, obmat, em, &nearest)) + { + SnapData::register_result(sctx, ob_eval, nullptr, obmat, &nearest); + return true; + } + return false; +} + +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Subclass for Snapping to Edges or Points of an EditMesh + * \{ */ + +class SnapData_EditMesh : public SnapData { + public: + BMesh *bm; + + SnapData_EditMesh(SnapObjectContext *sctx, BMesh *bm, const float4x4 &obmat) + : SnapData(sctx, obmat), bm(bm){}; + + void get_vert_co(const int index, const float **r_co) override + { + BMVert *eve = BM_vert_at_index(this->bm, index); + *r_co = eve->co; + } + + void get_edge_verts_index(const int index, int r_v_index[2]) override + { + BMEdge *eed = BM_edge_at_index(this->bm, index); + r_v_index[0] = BM_elem_index_get(eed->v1); + r_v_index[1] = BM_elem_index_get(eed->v2); + } + + void copy_vert_no(const int index, float r_no[3]) override + { + BMVert *eve = BM_vert_at_index(this->bm, index); + copy_v3_v3(r_no, eve->no); + } +}; + +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Internal Object Snapping API + * \{ */ + +eSnapMode snap_polygon_editmesh(SnapObjectContext *sctx, + Object *ob_eval, + const ID * /*id*/, + const float4x4 &obmat, + eSnapMode snap_to_flag, + int face) +{ + eSnapMode elem = SCE_SNAP_TO_NONE; + + BMEditMesh *em = BKE_editmesh_from_object(ob_eval); + SnapData_EditMesh nearest2d(sctx, em->bm, obmat); + nearest2d.clip_planes_enable(sctx, ob_eval); + + BVHTreeNearest nearest{}; + nearest.index = -1; + nearest.dist_sq = sctx->ret.dist_px_sq; + + BM_mesh_elem_table_ensure(em->bm, BM_FACE); + BMFace *f = BM_face_at_index(em->bm, face); + BMLoop *l_iter, *l_first; + l_iter = l_first = BM_FACE_FIRST_LOOP(f); + if (snap_to_flag & SCE_SNAP_TO_EDGE) { + elem = SCE_SNAP_TO_EDGE; + BM_mesh_elem_index_ensure(em->bm, BM_VERT | BM_EDGE); + BM_mesh_elem_table_ensure(em->bm, BM_VERT | BM_EDGE); + do { + cb_snap_edge(&nearest2d, + BM_elem_index_get(l_iter->e), + &nearest2d.nearest_precalc, + reinterpret_cast(nearest2d.clip_planes.data()), + nearest2d.clip_planes.size(), + &nearest); + } while ((l_iter = l_iter->next) != l_first); + } + else { + elem = SCE_SNAP_TO_EDGE_ENDPOINT; + BM_mesh_elem_index_ensure(em->bm, BM_VERT); + BM_mesh_elem_table_ensure(em->bm, BM_VERT); + do { + cb_snap_vert(&nearest2d, + BM_elem_index_get(l_iter->v), + &nearest2d.nearest_precalc, + reinterpret_cast(nearest2d.clip_planes.data()), + nearest2d.clip_planes.size(), + &nearest); + } while ((l_iter = l_iter->next) != l_first); + } + + if (nearest.index != -1) { + nearest2d.nearest_point = nearest; + nearest2d.register_result(sctx, ob_eval, nullptr); + return elem; + } + + return SCE_SNAP_TO_NONE; +} + +eSnapMode snap_edge_points_editmesh(SnapObjectContext *sctx, + Object *ob_eval, + const ID * /*id*/, + const float4x4 &obmat, + float dist_pex_sq_orig, + int edge) +{ + BMEditMesh *em = BKE_editmesh_from_object(ob_eval); + SnapData_EditMesh nearest2d(sctx, em->bm, obmat); + eSnapMode elem = nearest2d.snap_edge_points_impl(sctx, edge, dist_pex_sq_orig); + if (nearest2d.nearest_point.index != -2) { + nearest2d.register_result(sctx, ob_eval, nullptr); + } + return elem; +} + +static eSnapMode snapEditMesh(SnapCache_EditMesh *em_cache, + SnapObjectContext *sctx, + Object *ob_eval, + BMEditMesh *em, + const float4x4 &obmat, + eSnapMode snap_to_flag) +{ + BLI_assert(snap_to_flag != SCE_SNAP_TO_FACE); + + SnapData_EditMesh nearest2d(sctx, em->bm, obmat); + + /* Was BKE_boundbox_ray_hit_check, see: cf6ca226fa58. */ + if (!nearest2d.snap_boundbox(em_cache->min, em_cache->max)) { + return SCE_SNAP_TO_NONE; + } + + if (snap_to_flag & SCE_SNAP_TO_POINT) { + BVHTreeFromEditMesh treedata{}; + treedata.tree = em_cache->bvhtree[0]; + + if (treedata.tree == nullptr) { + if (sctx->callbacks.edit_mesh.test_vert_fn) { + auto test_looseverts_fn = [](BMElem *elem, void *user_data) { + SnapObjectContext *sctx_ = static_cast(user_data); + BMVert *v = reinterpret_cast(elem); + if (v->e && (!sctx_->callbacks.edit_mesh.test_edge_fn || + sctx_->callbacks.edit_mesh.test_edge_fn( + v->e, sctx_->callbacks.edit_mesh.user_data))) + { + return false; + } + return sctx_->callbacks.edit_mesh.test_vert_fn(v, sctx_->callbacks.edit_mesh.user_data); + }; + blender::BitVector<> verts_mask(em->bm->totvert); + const int verts_num_active = BM_iter_mesh_bitmap_from_filter( + BM_VERTS_OF_MESH, em->bm, verts_mask, test_looseverts_fn, sctx); + + bvhtree_from_editmesh_verts_ex(&treedata, em, verts_mask, verts_num_active, 0.0f, 2, 6); + } + else { + BKE_bvhtree_from_editmesh_get(&treedata, + em, + 2, + BVHTREE_FROM_EM_LOOSEVERTS, + /* WORKAROUND: avoid updating while transforming. */ + G.moving ? nullptr : &em_cache->mesh_runtime->bvh_cache, + &em_cache->mesh_runtime->eval_mutex); + } + em_cache->bvhtree[0] = treedata.tree; + em_cache->cached[0] = treedata.cached; + } + } + + if (snap_to_flag & SNAP_TO_EDGE_ELEMENTS) { + BVHTreeFromEditMesh treedata{}; + treedata.tree = em_cache->bvhtree[1]; + + if (treedata.tree == nullptr) { + if (sctx->callbacks.edit_mesh.test_edge_fn) { + blender::BitVector<> edges_mask(em->bm->totedge); + const int edges_num_active = BM_iter_mesh_bitmap_from_filter( + BM_EDGES_OF_MESH, + em->bm, + edges_mask, + (bool (*)(BMElem *, void *))sctx->callbacks.edit_mesh.test_edge_fn, + sctx->callbacks.edit_mesh.user_data); + + bvhtree_from_editmesh_edges_ex(&treedata, em, edges_mask, edges_num_active, 0.0f, 2, 6); + } + else { + BKE_bvhtree_from_editmesh_get(&treedata, + em, + 2, + BVHTREE_FROM_EM_EDGES, + /* WORKAROUND: avoid updating while transforming. */ + G.moving ? nullptr : &em_cache->mesh_runtime->bvh_cache, + &em_cache->mesh_runtime->eval_mutex); + } + em_cache->bvhtree[1] = treedata.tree; + em_cache->cached[1] = treedata.cached; + } + } + + /* #XRAY_ENABLED can return false even with the XRAY flag enabled, this happens because the + * alpha is 1.0 in this case. But even with the alpha being 1.0, the edit mesh is still not + * occluded. */ + const bool skip_occlusion_plane = XRAY_FLAG_ENABLED(sctx->runtime.v3d); + nearest2d.clip_planes_enable(sctx, ob_eval, skip_occlusion_plane); + + BVHTreeNearest nearest{}; + nearest.index = -1; + nearest.dist_sq = sctx->ret.dist_px_sq; + + eSnapMode elem = SCE_SNAP_TO_POINT; + + if (em_cache->bvhtree[0] && (snap_to_flag & SCE_SNAP_TO_POINT)) { + BM_mesh_elem_table_ensure(em->bm, BM_VERT); + BM_mesh_elem_index_ensure(em->bm, BM_VERT); + BLI_bvhtree_find_nearest_projected(em_cache->bvhtree[0], + nearest2d.pmat_local.ptr(), + sctx->runtime.win_size, + sctx->runtime.mval, + reinterpret_cast(nearest2d.clip_planes.data()), + nearest2d.clip_planes.size(), + &nearest, + cb_snap_vert, + &nearest2d); + } + + if (em_cache->bvhtree[1] && (snap_to_flag & SNAP_TO_EDGE_ELEMENTS)) { + int last_index = nearest.index; + nearest.index = -1; + BM_mesh_elem_table_ensure(em->bm, BM_EDGE | BM_VERT); + BM_mesh_elem_index_ensure(em->bm, BM_EDGE | BM_VERT); + BLI_bvhtree_find_nearest_projected(em_cache->bvhtree[1], + nearest2d.pmat_local.ptr(), + sctx->runtime.win_size, + sctx->runtime.mval, + reinterpret_cast(nearest2d.clip_planes.data()), + nearest2d.clip_planes.size(), + &nearest, + cb_snap_edge, + &nearest2d); + + if (nearest.index != -1) { + elem = SCE_SNAP_TO_EDGE; + } + else { + nearest.index = last_index; + } + } + + if (nearest.index != -1) { + nearest2d.nearest_point = nearest; + nearest2d.register_result(sctx, ob_eval, nullptr); + return elem; + } + + return SCE_SNAP_TO_NONE; } /** \} */ @@ -243,9 +679,33 @@ eSnapMode snap_object_editmesh(SnapObjectContext *sctx, eSnapMode snap_to_flag, bool /*use_hide*/) { + eSnapMode elem = SCE_SNAP_TO_NONE; + SnapCache_EditMesh *em_cache = editmesh_snapdata_init(sctx, ob_eval, snap_to_flag); - if (em_cache && em_cache->mesh) { - return snap_object_mesh(sctx, ob_eval, &em_cache->mesh->id, obmat, snap_to_flag, true); + if (em_cache == nullptr) { + return elem; } + + BMEditMesh *em = em_cache->em; + eSnapMode snap_mode_used = snap_to_flag & editmesh_snap_mode_supported(em->bm); + if (snap_mode_used & (SNAP_TO_EDGE_ELEMENTS | SCE_SNAP_TO_POINT)) { + elem = snapEditMesh(em_cache, sctx, ob_eval, em, obmat, snap_mode_used); + if (elem) { + return elem; + } + } + + if (snap_mode_used & SCE_SNAP_TO_FACE) { + if (raycastEditMesh(em_cache, sctx, ob_eval, em, obmat, sctx->runtime.object_index++)) { + return SCE_SNAP_TO_FACE; + } + } + + if (snap_mode_used & SCE_SNAP_INDIVIDUAL_NEAREST) { + if (nearest_world_editmesh(em_cache, sctx, ob_eval, em, obmat)) { + return SCE_SNAP_INDIVIDUAL_NEAREST; + } + } + return SCE_SNAP_TO_NONE; } diff --git a/source/blender/editors/transform/transform_snap_object_mesh.cc b/source/blender/editors/transform/transform_snap_object_mesh.cc index 6374eb812e7..2aa8bb84e19 100644 --- a/source/blender/editors/transform/transform_snap_object_mesh.cc +++ b/source/blender/editors/transform/transform_snap_object_mesh.cc @@ -10,7 +10,9 @@ #include "BLI_math_vector.h" #include "BKE_bvhutils.hh" +#include "BKE_editmesh.hh" #include "BKE_mesh.hh" +#include "BKE_object.hh" #include "ED_transform_snap_object_context.hh" @@ -28,13 +30,13 @@ using namespace blender; /** \name Snap Object Data * \{ */ -static void snap_object_data_mesh_get(const Mesh *mesh_eval, +static void snap_object_data_mesh_get(const Mesh *me_eval, bool use_hide, BVHTreeFromMesh *r_treedata) { /* The BVHTree from corner_tris is always required. */ BKE_bvhtree_from_mesh_get(r_treedata, - mesh_eval, + me_eval, use_hide ? BVHTREE_FROM_CORNER_TRIS_NO_HIDDEN : BVHTREE_FROM_CORNER_TRIS, 4); @@ -78,14 +80,14 @@ static void mesh_corner_tris_raycast_backface_culling_cb(void *userdata, static bool raycastMesh(SnapObjectContext *sctx, Object *ob_eval, - const Mesh *mesh_eval, + const Mesh *me_eval, const float4x4 &obmat, const uint ob_index, bool use_hide) { bool retval = false; - if (mesh_eval->faces_num == 0) { + if (me_eval->faces_num == 0) { return retval; } @@ -94,7 +96,7 @@ static bool raycastMesh(SnapObjectContext *sctx, float3 ray_normal_local = math::transform_direction(imat, sctx->runtime.ray_dir); float local_scale, local_depth, len_diff = 0.0f; - /* Local scale in normal direction. */ + /* local scale in normal direction */ ray_normal_local = math::normalize_and_get_length(ray_normal_local, local_scale); const bool is_in_front = sctx->runtime.params.use_occlusion_test && @@ -105,13 +107,15 @@ static bool raycastMesh(SnapObjectContext *sctx, local_depth *= local_scale; } - /* Test bounding box. */ - const Bounds bounds = *mesh_eval->bounds_min_max(); - /* Was #BKE_boundbox_ray_hit_check, see: cf6ca226fa58 */ - if (!isect_ray_aabb_v3_simple( - ray_start_local, ray_normal_local, bounds.min, bounds.max, &len_diff, nullptr)) - { - return retval; + /* Test bounding box */ + if (ob_eval->data == me_eval) { + const Bounds bounds = *me_eval->bounds_min_max(); + /* was BKE_boundbox_ray_hit_check, see: cf6ca226fa58 */ + if (!isect_ray_aabb_v3_simple( + ray_start_local, ray_normal_local, bounds.min, bounds.max, &len_diff, nullptr)) + { + return retval; + } } /* We pass a temp ray_start, set from object's boundbox, to avoid precision issues with @@ -128,9 +132,9 @@ static bool raycastMesh(SnapObjectContext *sctx, } BVHTreeFromMesh treedata; - snap_object_data_mesh_get(mesh_eval, use_hide, &treedata); + snap_object_data_mesh_get(me_eval, use_hide, &treedata); - const blender::Span tri_faces = mesh_eval->corner_tri_faces(); + const blender::Span tri_faces = me_eval->corner_tri_faces(); if (treedata.tree == nullptr) { return retval; @@ -175,7 +179,7 @@ static bool raycastMesh(SnapObjectContext *sctx, hit.index = tri_faces[hit.index]; retval = true; } - SnapData::register_result_raycast(sctx, ob_eval, &mesh_eval->id, obmat, &hit, is_in_front); + SnapData::register_result_raycast(sctx, ob_eval, &me_eval->id, obmat, &hit, is_in_front); } } @@ -190,12 +194,12 @@ static bool raycastMesh(SnapObjectContext *sctx, static bool nearest_world_mesh(SnapObjectContext *sctx, Object *ob_eval, - const Mesh *mesh_eval, + const Mesh *me_eval, const float4x4 &obmat, bool use_hide) { BVHTreeFromMesh treedata; - snap_object_data_mesh_get(mesh_eval, use_hide, &treedata); + snap_object_data_mesh_get(me_eval, use_hide, &treedata); if (treedata.tree == nullptr) { return false; } @@ -205,7 +209,7 @@ static bool nearest_world_mesh(SnapObjectContext *sctx, if (nearest_world_tree( sctx, treedata.tree, treedata.nearest_callback, obmat, &treedata, &nearest)) { - SnapData::register_result(sctx, ob_eval, &mesh_eval->id, obmat, &nearest); + SnapData::register_result(sctx, ob_eval, &me_eval->id, obmat, &nearest); return true; } return false; @@ -221,7 +225,7 @@ class SnapData_Mesh : public SnapData { public: const float3 *vert_positions; const float3 *vert_normals; - const int2 *edges; /* Only used for #BVHTreeFromMeshEdges. */ + const int2 *edges; /* only used for #BVHTreeFromMeshEdges */ const int *corner_verts; const int *corner_edges; const int3 *corner_tris; @@ -438,35 +442,34 @@ static eSnapMode mesh_snap_mode_supported(const Mesh *mesh) static eSnapMode snapMesh(SnapObjectContext *sctx, Object *ob_eval, - const Mesh *mesh_eval, + const Mesh *me_eval, const float4x4 &obmat, bool use_hide, eSnapMode snap_to) { BLI_assert(snap_to != SCE_SNAP_TO_FACE); - SnapData_Mesh nearest2d(sctx, mesh_eval, obmat); + SnapData_Mesh nearest2d(sctx, me_eval, obmat); - if (ob_eval->data == mesh_eval) { - if (std::optional> bounds = mesh_eval->bounds_min_max()) { - if (!nearest2d.snap_boundbox(bounds->min, bounds->max)) { - return SCE_SNAP_TO_NONE; - } + if (ob_eval->data == me_eval) { + const Bounds bounds = *me_eval->bounds_min_max(); + if (!nearest2d.snap_boundbox(bounds.min, bounds.max)) { + return SCE_SNAP_TO_NONE; } } - snap_to &= mesh_snap_mode_supported(mesh_eval) & (SNAP_TO_EDGE_ELEMENTS | SCE_SNAP_TO_POINT); + snap_to &= mesh_snap_mode_supported(me_eval) & (SNAP_TO_EDGE_ELEMENTS | SCE_SNAP_TO_POINT); if (snap_to == SCE_SNAP_TO_NONE) { return SCE_SNAP_TO_NONE; } BVHTreeFromMesh treedata, treedata_dummy; - snap_object_data_mesh_get(mesh_eval, use_hide, &treedata); + snap_object_data_mesh_get(me_eval, use_hide, &treedata); BVHTree *bvhtree[2] = {nullptr}; - bvhtree[0] = BKE_bvhtree_from_mesh_get(&treedata_dummy, mesh_eval, BVHTREE_FROM_LOOSEEDGES, 2); + bvhtree[0] = BKE_bvhtree_from_mesh_get(&treedata_dummy, me_eval, BVHTREE_FROM_LOOSEEDGES, 2); BLI_assert(treedata_dummy.cached); if (snap_to & SCE_SNAP_TO_POINT) { - bvhtree[1] = BKE_bvhtree_from_mesh_get(&treedata_dummy, mesh_eval, BVHTREE_FROM_LOOSEVERTS, 2); + bvhtree[1] = BKE_bvhtree_from_mesh_get(&treedata_dummy, me_eval, BVHTREE_FROM_LOOSEVERTS, 2); BLI_assert(treedata_dummy.cached); } @@ -481,7 +484,7 @@ static eSnapMode snapMesh(SnapObjectContext *sctx, if (bvhtree[1]) { BLI_assert(snap_to & SCE_SNAP_TO_POINT); - /* Snap to loose verts. */ + /* snap to loose verts */ BLI_bvhtree_find_nearest_projected(bvhtree[1], nearest2d.pmat_local.ptr(), sctx->runtime.win_size, @@ -568,7 +571,7 @@ static eSnapMode snapMesh(SnapObjectContext *sctx, if (nearest.index != -1) { nearest2d.nearest_point = nearest; - nearest2d.register_result(sctx, ob_eval, &mesh_eval->id); + nearest2d.register_result(sctx, ob_eval, &me_eval->id); return elem; } diff --git a/source/blender/editors/transform/transform_snap_sequencer.cc b/source/blender/editors/transform/transform_snap_sequencer.cc index ec3d19d0f23..e17caa7f2fe 100644 --- a/source/blender/editors/transform/transform_snap_sequencer.cc +++ b/source/blender/editors/transform/transform_snap_sequencer.cc @@ -10,6 +10,10 @@ #include "MEM_guardedalloc.h" +#include "BLI_blenlib.h" + +#include "BKE_context.hh" + #include "DNA_sequence_types.h" #include "ED_screen.hh" diff --git a/source/blender/editors/undo/ed_undo.cc b/source/blender/editors/undo/ed_undo.cc index 96725d9febe..a515081c2ad 100644 --- a/source/blender/editors/undo/ed_undo.cc +++ b/source/blender/editors/undo/ed_undo.cc @@ -18,17 +18,17 @@ #include "BLI_listbase.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_blender_undo.hh" -#include "BKE_callbacks.hh" +#include "BKE_callbacks.h" #include "BKE_context.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_layer.hh" #include "BKE_main.hh" #include "BKE_paint.hh" -#include "BKE_report.hh" -#include "BKE_scene.hh" +#include "BKE_report.h" +#include "BKE_scene.h" #include "BKE_screen.hh" #include "BKE_undo_system.hh" #include "BKE_workspace.h" diff --git a/source/blender/editors/undo/memfile_undo.cc b/source/blender/editors/undo/memfile_undo.cc index a3fb961e11c..afb361ef731 100644 --- a/source/blender/editors/undo/memfile_undo.cc +++ b/source/blender/editors/undo/memfile_undo.cc @@ -23,11 +23,12 @@ #include "BKE_blender_undo.hh" #include "BKE_context.hh" +#include "BKE_lib_id.hh" #include "BKE_lib_query.hh" #include "BKE_main.hh" #include "BKE_node.hh" #include "BKE_preview_image.hh" -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "BKE_undo_system.hh" #include "../depsgraph/DEG_depsgraph.hh" @@ -35,6 +36,7 @@ #include "WM_api.hh" #include "WM_types.hh" +#include "ED_object.hh" #include "ED_render.hh" #include "ED_undo.hh" #include "ED_util.hh" @@ -227,7 +229,7 @@ static void memfile_undosys_step_decode( BKE_scene_undo_depsgraphs_restore(bmain, depsgraphs); /* We need to inform depsgraph about re-used old IDs that would be using newly read - * data-blocks, at least evaluated copies need to be updated... */ + * data-blocks, at least COW evaluated copies need to be updated... */ ID *id = nullptr; FOREACH_MAIN_ID_BEGIN (bmain, id) { if (id->tag & LIB_TAG_UNDO_OLD_ID_REUSED_UNCHANGED) { @@ -235,12 +237,12 @@ static void memfile_undosys_step_decode( bmain, id, memfile_undosys_step_id_reused_cb, nullptr, IDWALK_READONLY); } - /* NOTE: Tagging `ID_RECALC_SYNC_TO_EVAL` here should not be needed in practice, since + /* NOTE: Tagging `ID_RECALC_COPY_ON_WRITE` here should not be needed in practice, since * modified IDs should already have other depsgraph update tags anyway. * However, for the sake of consistency, it's better to effectively use it, * since content of that ID pointer does have been modified. */ uint recalc_flags = id->recalc | ((id->tag & LIB_TAG_UNDO_OLD_ID_REREAD_IN_PLACE) ? - ID_RECALC_SYNC_TO_EVAL : + ID_RECALC_COPY_ON_WRITE : IDRecalcFlag(0)); /* Tag depsgraph to update data-block for changes that happened between the * current and the target state, see direct_link_id_restore_recalc(). */ @@ -252,7 +254,7 @@ static void memfile_undosys_step_decode( if (nodetree != nullptr) { recalc_flags = nodetree->id.recalc; if (id->tag & LIB_TAG_UNDO_OLD_ID_REREAD_IN_PLACE) { - recalc_flags |= ID_RECALC_SYNC_TO_EVAL; + recalc_flags |= ID_RECALC_COPY_ON_WRITE; } if (recalc_flags != 0) { DEG_id_tag_update_ex(bmain, &nodetree->id, recalc_flags); @@ -263,7 +265,7 @@ static void memfile_undosys_step_decode( if (scene->master_collection != nullptr) { recalc_flags = scene->master_collection->id.recalc; if (id->tag & LIB_TAG_UNDO_OLD_ID_REREAD_IN_PLACE) { - recalc_flags |= ID_RECALC_SYNC_TO_EVAL; + recalc_flags |= ID_RECALC_COPY_ON_WRITE; } if (recalc_flags != 0) { DEG_id_tag_update_ex(bmain, &scene->master_collection->id, recalc_flags); @@ -355,15 +357,13 @@ static MemFile *ed_undosys_step_get_memfile(UndoStep *us_p) return &us->data->memfile; } -MemFile *ED_undosys_stack_memfile_get_if_active(UndoStack *ustack) +MemFile *ED_undosys_stack_memfile_get_active(UndoStack *ustack) { - if (!ustack->step_active) { - return nullptr; + UndoStep *us = BKE_undosys_stack_active_with_type(ustack, BKE_UNDOSYS_TYPE_MEMFILE); + if (us) { + return ed_undosys_step_get_memfile(us); } - if (ustack->step_active->type != BKE_UNDOSYS_TYPE_MEMFILE) { - return nullptr; - } - return ed_undosys_step_get_memfile(ustack->step_active); + return nullptr; } void ED_undosys_stack_memfile_id_changed_tag(UndoStack *ustack, ID *id) diff --git a/source/blender/editors/undo/undo_system_types.cc b/source/blender/editors/undo/undo_system_types.cc index eadbc4f6d52..f7fa4a345cf 100644 --- a/source/blender/editors/undo/undo_system_types.cc +++ b/source/blender/editors/undo/undo_system_types.cc @@ -13,7 +13,6 @@ #include "ED_armature.hh" #include "ED_curve.hh" #include "ED_curves.hh" -#include "ED_grease_pencil.hh" #include "ED_lattice.hh" #include "ED_mball.hh" #include "ED_mesh.hh" @@ -38,7 +37,6 @@ void ED_undosys_type_init() BKE_undosys_type_append(ED_mball_undosys_type); BKE_undosys_type_append(ED_mesh_undosys_type); BKE_undosys_type_append(ED_curves_undosys_type); - BKE_undosys_type_append(ED_undosys_type_grease_pencil); /* Paint Modes */ BKE_UNDOSYS_TYPE_IMAGE = BKE_undosys_type_append(ED_image_undosys_type); diff --git a/source/blender/editors/util/ed_draw.cc b/source/blender/editors/util/ed_draw.cc index 7b7b69fa4a9..5ee3888d0a9 100644 --- a/source/blender/editors/util/ed_draw.cc +++ b/source/blender/editors/util/ed_draw.cc @@ -13,11 +13,12 @@ #include "MEM_guardedalloc.h" #include "BLI_listbase.h" +#include "BLI_path_util.h" #include "BLI_rect.h" #include "BLI_string.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_context.hh" #include "BKE_image.h" @@ -38,6 +39,7 @@ #include "UI_interface.hh" #include "UI_resources.hh" +#include "RNA_access.hh" #include "WM_api.hh" #include "WM_types.hh" diff --git a/source/blender/editors/util/ed_transverts.cc b/source/blender/editors/util/ed_transverts.cc index 22b98b3294f..98766ba5306 100644 --- a/source/blender/editors/util/ed_transverts.cc +++ b/source/blender/editors/util/ed_transverts.cc @@ -16,8 +16,10 @@ #include "DNA_object_types.h" #include "DNA_scene_types.h" +#include "BLI_blenlib.h" #include "BLI_utildefines.h" +#include "BKE_DerivedMesh.hh" #include "BKE_armature.hh" #include "BKE_context.hh" #include "BKE_curve.hh" diff --git a/source/blender/editors/util/ed_util.cc b/source/blender/editors/util/ed_util.cc index 337594a7191..2e80002f0d9 100644 --- a/source/blender/editors/util/ed_util.cc +++ b/source/blender/editors/util/ed_util.cc @@ -16,10 +16,10 @@ #include "BLI_path_util.h" #include "BLI_string.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" -#include "BKE_collection.hh" -#include "BKE_global.hh" +#include "BKE_collection.h" +#include "BKE_global.h" #include "BKE_layer.hh" #include "BKE_lib_id.hh" #include "BKE_lib_remap.hh" @@ -112,7 +112,7 @@ void ED_editors_init(bContext *C) GP_DATA_STROKE_SCULPTMODE | GP_DATA_STROKE_WEIGHTMODE | GP_DATA_STROKE_VERTEXMODE); ob->mode = OB_MODE_OBJECT; - DEG_id_tag_update(&ob->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&ob->id, ID_RECALC_COPY_ON_WRITE); } else if (mode & OB_MODE_ALL_PAINT_GPENCIL) { ED_gpencil_toggle_brush_cursor(C, true, nullptr); @@ -124,7 +124,7 @@ void ED_editors_init(bContext *C) * previous mode if possible, re-creating its mode data, etc. */ ID *ob_data = static_cast(ob->data); ob->mode = OB_MODE_OBJECT; - DEG_id_tag_update(&ob->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&ob->id, ID_RECALC_COPY_ON_WRITE); /* Object mode is enforced if there is no active object, or if the active object's type is * different. */ @@ -464,9 +464,7 @@ void unpack_menu(bContext *C, UI_popup_menu_end(C, pup); } -void ED_spacedata_id_remap(ScrArea *area, - SpaceLink *sl, - const blender::bke::id::IDRemapper &mappings) +void ED_spacedata_id_remap(ScrArea *area, SpaceLink *sl, const IDRemapper *mappings) { SpaceType *st = BKE_spacetype_from_id(sl->spacetype); if (st && st->id_remap) { @@ -479,8 +477,9 @@ void ED_spacedata_id_remap_single(ScrArea *area, SpaceLink *sl, ID *old_id, ID * SpaceType *st = BKE_spacetype_from_id(sl->spacetype); if (st && st->id_remap) { - blender::bke::id::IDRemapper mappings; - mappings.add(old_id, new_id); + IDRemapper *mappings = BKE_id_remapper_create(); + BKE_id_remapper_add(mappings, old_id, new_id); st->id_remap(area, sl, mappings); + BKE_id_remapper_free(mappings); } } diff --git a/source/blender/editors/util/ed_util_imbuf.cc b/source/blender/editors/util/ed_util_imbuf.cc index 6466ee93ff0..ff93cc357ea 100644 --- a/source/blender/editors/util/ed_util_imbuf.cc +++ b/source/blender/editors/util/ed_util_imbuf.cc @@ -16,6 +16,8 @@ #include "BKE_colortools.hh" #include "BKE_context.hh" #include "BKE_image.h" +#include "BKE_main.hh" +#include "BKE_screen.hh" #include "ED_image.hh" #include "ED_screen.hh" diff --git a/source/blender/editors/util/ed_util_ops.cc b/source/blender/editors/util/ed_util_ops.cc index 374cf19d093..819ee591d7b 100644 --- a/source/blender/editors/util/ed_util_ops.cc +++ b/source/blender/editors/util/ed_util_ops.cc @@ -19,8 +19,11 @@ #include "BKE_context.hh" #include "BKE_lib_id.hh" #include "BKE_lib_override.hh" +#include "BKE_main.hh" #include "BKE_preview_image.hh" -#include "BKE_report.hh" +#include "BKE_report.h" + +#include "BLT_translation.h" #include "ED_asset.hh" #include "ED_render.hh" diff --git a/source/blender/editors/util/numinput.cc b/source/blender/editors/util/numinput.cc index 53d06bf1306..680137c38ff 100644 --- a/source/blender/editors/util/numinput.cc +++ b/source/blender/editors/util/numinput.cc @@ -15,11 +15,11 @@ #include "BLI_string_utf8.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_context.hh" -#include "BKE_report.hh" -#include "BKE_scene.hh" +#include "BKE_report.h" +#include "BKE_scene.h" #include "BKE_unit.hh" #include "DNA_scene_types.h" diff --git a/source/blender/editors/util/select_utils.cc b/source/blender/editors/util/select_utils.cc index 1cb3d6bdfdc..8871dd31fdd 100644 --- a/source/blender/editors/util/select_utils.cc +++ b/source/blender/editors/util/select_utils.cc @@ -13,7 +13,7 @@ #include "BLI_kdtree.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_windowmanager_types.h" diff --git a/source/blender/editors/uvedit/uvedit_buttons.cc b/source/blender/editors/uvedit/uvedit_buttons.cc index 4614386b189..16d499ba594 100644 --- a/source/blender/editors/uvedit/uvedit_buttons.cc +++ b/source/blender/editors/uvedit/uvedit_buttons.cc @@ -20,7 +20,7 @@ #include "BLI_math_vector.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_context.hh" #include "BKE_customdata.hh" diff --git a/source/blender/editors/uvedit/uvedit_clipboard.cc b/source/blender/editors/uvedit/uvedit_clipboard.cc index da58b67ade0..0bb9079b50a 100644 --- a/source/blender/editors/uvedit/uvedit_clipboard.cc +++ b/source/blender/editors/uvedit/uvedit_clipboard.cc @@ -23,17 +23,18 @@ #include "BKE_editmesh.hh" #include "BKE_layer.hh" #include "BKE_mesh_mapping.hh" /* UvElementMap */ -#include "BKE_report.hh" +#include "BKE_report.h" #include "DEG_depsgraph.hh" #include "ED_mesh.hh" #include "ED_screen.hh" +#include "ED_uvedit.hh" /* Own include. */ #include "WM_api.hh" #include "uvedit_clipboard_graph_iso.hh" -#include "uvedit_intern.hh" /* Own include. */ +#include "uvedit_intern.hh" /* linker, extern "C" */ using blender::Vector; diff --git a/source/blender/editors/uvedit/uvedit_draw.cc b/source/blender/editors/uvedit/uvedit_draw.cc index f229f8a20e7..f2434376075 100644 --- a/source/blender/editors/uvedit/uvedit_draw.cc +++ b/source/blender/editors/uvedit/uvedit_draw.cc @@ -8,12 +8,14 @@ #include "BLI_utildefines.h" +#include "DNA_scene_types.h" #include "DNA_screen_types.h" #include "DNA_userdef_types.h" #include "GPU_immediate.h" #include "GPU_matrix.h" +#include "UI_interface.hh" #include "UI_view2d.hh" #include "ED_uvedit.hh" diff --git a/source/blender/editors/uvedit/uvedit_ops.cc b/source/blender/editors/uvedit/uvedit_ops.cc index abc10314c95..bc48af908f0 100644 --- a/source/blender/editors/uvedit/uvedit_ops.cc +++ b/source/blender/editors/uvedit/uvedit_ops.cc @@ -25,15 +25,16 @@ #include "BLI_math_vector.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_context.hh" #include "BKE_customdata.hh" #include "BKE_editmesh.hh" #include "BKE_layer.hh" +#include "BKE_main.hh" #include "BKE_material.h" #include "BKE_mesh_mapping.hh" -#include "BKE_node.hh" +#include "BKE_node.h" #include "DEG_depsgraph.hh" #include "DEG_depsgraph_query.hh" @@ -1208,7 +1209,7 @@ static int uv_pin_exec(bContext *C, wmOperator *op) if (changed) { WM_event_add_notifier(C, NC_GEOM | ND_DATA, obedit->data); - DEG_id_tag_update(static_cast(obedit->data), ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(static_cast(obedit->data), ID_RECALC_COPY_ON_WRITE); } } diff --git a/source/blender/editors/uvedit/uvedit_path.cc b/source/blender/editors/uvedit/uvedit_path.cc index cfb031ee3f6..abc23a223f3 100644 --- a/source/blender/editors/uvedit/uvedit_path.cc +++ b/source/blender/editors/uvedit/uvedit_path.cc @@ -17,6 +17,7 @@ #include "MEM_guardedalloc.h" #include "BLI_ghash.h" +#include "BLI_linklist_stack.h" #include "BLI_math_vector.h" #include "BLI_utildefines.h" @@ -32,13 +33,14 @@ #include "BKE_editmesh.hh" #include "BKE_layer.hh" #include "BKE_mesh.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "DEG_depsgraph.hh" #include "DEG_depsgraph_query.hh" #include "ED_object.hh" #include "ED_screen.hh" +#include "ED_transform.hh" #include "ED_uvedit.hh" #include "RNA_access.hh" diff --git a/source/blender/editors/uvedit/uvedit_rip.cc b/source/blender/editors/uvedit/uvedit_rip.cc index 4c57e4a53ac..a46330e2359 100644 --- a/source/blender/editors/uvedit/uvedit_rip.cc +++ b/source/blender/editors/uvedit/uvedit_rip.cc @@ -28,7 +28,7 @@ #include "BKE_customdata.hh" #include "BKE_editmesh.hh" #include "BKE_layer.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "DEG_depsgraph.hh" diff --git a/source/blender/editors/uvedit/uvedit_select.cc b/source/blender/editors/uvedit/uvedit_select.cc index 729b44daacf..6bdf5f63741 100644 --- a/source/blender/editors/uvedit/uvedit_select.cc +++ b/source/blender/editors/uvedit/uvedit_select.cc @@ -25,7 +25,7 @@ #include "BLI_heap.h" #include "BLI_kdopbvh.h" #include "BLI_kdtree.h" -#include "BLI_lasso_2d.hh" +#include "BLI_lasso_2d.h" #include "BLI_math_geom.h" #include "BLI_math_matrix.h" #include "BLI_math_vector.h" @@ -34,7 +34,7 @@ #include "BLI_polyfill_2d_beautify.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_context.hh" #include "BKE_customdata.hh" @@ -43,7 +43,7 @@ #include "BKE_material.h" #include "BKE_mesh.hh" #include "BKE_mesh_mapping.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "DEG_depsgraph.hh" #include "DEG_depsgraph_query.hh" @@ -65,8 +65,6 @@ #include "uvedit_intern.hh" -using blender::Array; -using blender::int2; using blender::Span; using blender::Vector; @@ -2977,13 +2975,13 @@ static int uv_select_linked_internal(bContext *C, wmOperator *op, const wmEvent scene, objects, pick ? &hit : nullptr, extend, deselect, false, select_faces); if (pick) { - DEG_id_tag_update(static_cast(hit.ob->data), ID_RECALC_SYNC_TO_EVAL | ID_RECALC_SELECT); + DEG_id_tag_update(static_cast(hit.ob->data), ID_RECALC_COPY_ON_WRITE | ID_RECALC_SELECT); WM_event_add_notifier(C, NC_GEOM | ND_SELECT, hit.ob->data); } else { for (Object *obedit : objects) { DEG_id_tag_update(static_cast(obedit->data), - ID_RECALC_SYNC_TO_EVAL | ID_RECALC_SELECT); + ID_RECALC_COPY_ON_WRITE | ID_RECALC_SELECT); WM_event_add_notifier(C, NC_GEOM | ND_SELECT, obedit->data); } } @@ -3894,14 +3892,15 @@ void UV_OT_select_circle(wmOperatorType *ot) static bool do_lasso_select_mesh_uv_is_point_inside(const ARegion *region, const rcti *clip_rect, - const Span mcoords, + const int mcoords[][2], + const int mcoords_len, const float co_test[2]) { int co_screen[2]; if (UI_view2d_view_to_region_clip( ®ion->v2d, co_test[0], co_test[1], &co_screen[0], &co_screen[1]) && BLI_rcti_isect_pt_v(clip_rect, co_screen) && - BLI_lasso_is_point_inside(mcoords, co_screen[0], co_screen[1], V2D_IS_CLIPPED)) + BLI_lasso_is_point_inside(mcoords, mcoords_len, co_screen[0], co_screen[1], V2D_IS_CLIPPED)) { return true; } @@ -3910,7 +3909,8 @@ static bool do_lasso_select_mesh_uv_is_point_inside(const ARegion *region, static bool do_lasso_select_mesh_uv_is_edge_inside(const ARegion *region, const rcti *clip_rect, - const Span mcoords, + const int mcoords[][2], + const int mcoords_len, const float co_test_a[2], const float co_test_b[2]) { @@ -3919,14 +3919,17 @@ static bool do_lasso_select_mesh_uv_is_edge_inside(const ARegion *region, ®ion->v2d, co_test_a, co_test_b, co_screen_a, co_screen_b) && BLI_rcti_isect_segment(clip_rect, co_screen_a, co_screen_b) && BLI_lasso_is_edge_inside( - mcoords, UNPACK2(co_screen_a), UNPACK2(co_screen_b), V2D_IS_CLIPPED)) + mcoords, mcoords_len, UNPACK2(co_screen_a), UNPACK2(co_screen_b), V2D_IS_CLIPPED)) { return true; } return false; } -static bool do_lasso_select_mesh_uv(bContext *C, const Span mcoords, const eSelectOp sel_op) +static bool do_lasso_select_mesh_uv(bContext *C, + const int mcoords[][2], + const int mcoords_len, + const eSelectOp sel_op) { Depsgraph *depsgraph = CTX_data_ensure_evaluated_depsgraph(C); const ARegion *region = CTX_wm_region(C); @@ -3952,7 +3955,7 @@ static bool do_lasso_select_mesh_uv(bContext *C, const Span mcoords, const bool changed_multi = false; rcti rect; - BLI_lasso_boundbox(&rect, mcoords); + BLI_lasso_boundbox(&rect, mcoords, mcoords_len); Vector objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data_with_uvs( scene, view_layer, nullptr); @@ -3979,7 +3982,7 @@ static bool do_lasso_select_mesh_uv(bContext *C, const Span mcoords, const if (select != uvedit_face_select_test(scene, efa, offsets)) { float cent[2]; BM_face_uv_calc_center_median(efa, offsets.uv, cent); - if (do_lasso_select_mesh_uv_is_point_inside(region, &rect, mcoords, cent)) { + if (do_lasso_select_mesh_uv_is_point_inside(region, &rect, mcoords, mcoords_len, cent)) { BM_elem_flag_enable(efa, BM_ELEM_TAG); changed = true; } @@ -4003,8 +4006,9 @@ static bool do_lasso_select_mesh_uv(bContext *C, const Span mcoords, const BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) { float *luv = BM_ELEM_CD_GET_FLOAT_P(l, offsets.uv); - if (do_lasso_select_mesh_uv_is_point_inside(region, &rect, mcoords, luv) && - do_lasso_select_mesh_uv_is_point_inside(region, &rect, mcoords, luv_prev)) + if (do_lasso_select_mesh_uv_is_point_inside(region, &rect, mcoords, mcoords_len, luv) && + do_lasso_select_mesh_uv_is_point_inside( + region, &rect, mcoords, mcoords_len, luv_prev)) { uvedit_edge_select_set_with_sticky(scene, em, l_prev, select, false, offsets); do_second_pass = false; @@ -4027,7 +4031,9 @@ static bool do_lasso_select_mesh_uv(bContext *C, const Span mcoords, const BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) { float *luv = BM_ELEM_CD_GET_FLOAT_P(l, offsets.uv); - if (do_lasso_select_mesh_uv_is_edge_inside(region, &rect, mcoords, luv, luv_prev)) { + if (do_lasso_select_mesh_uv_is_edge_inside( + region, &rect, mcoords, mcoords_len, luv, luv_prev)) + { uvedit_edge_select_set_with_sticky(scene, em, l_prev, select, false, offsets); changed = true; } @@ -4048,7 +4054,8 @@ static bool do_lasso_select_mesh_uv(bContext *C, const Span mcoords, const BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) { if (select != uvedit_uv_select_test(scene, l, offsets)) { float *luv = BM_ELEM_CD_GET_FLOAT_P(l, offsets.uv); - if (do_lasso_select_mesh_uv_is_point_inside(region, &rect, mcoords, luv)) { + if (do_lasso_select_mesh_uv_is_point_inside(region, &rect, mcoords, mcoords_len, luv)) + { uvedit_uv_select_set(scene, em->bm, l, select, false, offsets); changed = true; BM_elem_flag_enable(l->v, BM_ELEM_TAG); @@ -4086,15 +4093,18 @@ static bool do_lasso_select_mesh_uv(bContext *C, const Span mcoords, const static int uv_lasso_select_exec(bContext *C, wmOperator *op) { - Array mcoords = WM_gesture_lasso_path_to_array(C, op); - if (mcoords.is_empty()) { - return OPERATOR_PASS_THROUGH; + int mcoords_len; + const int(*mcoords)[2] = WM_gesture_lasso_path_to_array(C, op, &mcoords_len); + + if (mcoords) { + const eSelectOp sel_op = eSelectOp(RNA_enum_get(op->ptr, "mode")); + bool changed = do_lasso_select_mesh_uv(C, mcoords, mcoords_len, sel_op); + MEM_freeN((void *)mcoords); + + return changed ? OPERATOR_FINISHED : OPERATOR_CANCELLED; } - const eSelectOp sel_op = eSelectOp(RNA_enum_get(op->ptr, "mode")); - bool changed = do_lasso_select_mesh_uv(C, mcoords, sel_op); - - return changed ? OPERATOR_FINISHED : OPERATOR_CANCELLED; + return OPERATOR_PASS_THROUGH; } void UV_OT_select_lasso(wmOperatorType *ot) @@ -4702,7 +4712,7 @@ static int uv_select_similar_vert_exec(bContext *C, wmOperator *op) const BMUVOffsets offsets = BM_uv_map_get_offsets(bm); float ob_m3[3][3]; - copy_m3_m4(ob_m3, ob->object_to_world().ptr()); + copy_m3_m4(ob_m3, ob->object_to_world); BMFace *face; BMIter iter; @@ -4738,7 +4748,7 @@ static int uv_select_similar_vert_exec(bContext *C, wmOperator *op) const BMUVOffsets offsets = BM_uv_map_get_offsets(bm); float ob_m3[3][3]; - copy_m3_m4(ob_m3, ob->object_to_world().ptr()); + copy_m3_m4(ob_m3, ob->object_to_world); BMFace *face; BMIter iter; @@ -4809,7 +4819,7 @@ static int uv_select_similar_edge_exec(bContext *C, wmOperator *op) const BMUVOffsets offsets = BM_uv_map_get_offsets(bm); float ob_m3[3][3]; - copy_m3_m4(ob_m3, ob->object_to_world().ptr()); + copy_m3_m4(ob_m3, ob->object_to_world); BMFace *face; BMIter iter; @@ -4847,7 +4857,7 @@ static int uv_select_similar_edge_exec(bContext *C, wmOperator *op) bool changed = false; const BMUVOffsets offsets = BM_uv_map_get_offsets(bm); float ob_m3[3][3]; - copy_m3_m4(ob_m3, ob->object_to_world().ptr()); + copy_m3_m4(ob_m3, ob->object_to_world); BMFace *face; BMIter iter; @@ -4909,7 +4919,7 @@ static int uv_select_similar_face_exec(bContext *C, wmOperator *op) BMesh *bm = em->bm; float ob_m3[3][3]; - copy_m3_m4(ob_m3, ob->object_to_world().ptr()); + copy_m3_m4(ob_m3, ob->object_to_world); const BMUVOffsets offsets = BM_uv_map_get_offsets(bm); @@ -4944,7 +4954,7 @@ static int uv_select_similar_face_exec(bContext *C, wmOperator *op) const BMUVOffsets offsets = BM_uv_map_get_offsets(bm); float ob_m3[3][3]; - copy_m3_m4(ob_m3, ob->object_to_world().ptr()); + copy_m3_m4(ob_m3, ob->object_to_world); BMFace *face; BMIter iter; @@ -5027,7 +5037,7 @@ static int uv_select_similar_island_exec(bContext *C, wmOperator *op) } float ob_m3[3][3]; - copy_m3_m4(ob_m3, obedit->object_to_world().ptr()); + copy_m3_m4(ob_m3, obedit->object_to_world); int index; LISTBASE_FOREACH_INDEX (FaceIsland *, island, &island_list_ptr[ob_index], index) { @@ -5056,7 +5066,7 @@ static int uv_select_similar_island_exec(bContext *C, wmOperator *op) continue; } float ob_m3[3][3]; - copy_m3_m4(ob_m3, obedit->object_to_world().ptr()); + copy_m3_m4(ob_m3, obedit->object_to_world); bool changed = false; int index; @@ -5530,7 +5540,7 @@ static int uv_select_mode_exec(bContext *C, wmOperator *op) /* Handle UV selection states according to new select mode and sticky mode. */ ED_uvedit_selectmode_clean_multi(C); - DEG_id_tag_update(&scene->id, ID_RECALC_SYNC_TO_EVAL | ID_RECALC_SELECT); + DEG_id_tag_update(&scene->id, ID_RECALC_COPY_ON_WRITE | ID_RECALC_SELECT); WM_main_add_notifier(NC_SCENE | ND_TOOLSETTINGS, nullptr); return OPERATOR_FINISHED; diff --git a/source/blender/editors/uvedit/uvedit_smart_stitch.cc b/source/blender/editors/uvedit/uvedit_smart_stitch.cc index 165eab2cb67..8b878022d36 100644 --- a/source/blender/editors/uvedit/uvedit_smart_stitch.cc +++ b/source/blender/editors/uvedit/uvedit_smart_stitch.cc @@ -23,14 +23,14 @@ #include "BLI_string.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_context.hh" #include "BKE_customdata.hh" #include "BKE_editmesh.hh" #include "BKE_layer.hh" #include "BKE_mesh_mapping.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "DEG_depsgraph.hh" diff --git a/source/blender/editors/uvedit/uvedit_unwrap_ops.cc b/source/blender/editors/uvedit/uvedit_unwrap_ops.cc index ecc39bb4fdc..bbc1ae44d9b 100644 --- a/source/blender/editors/uvedit/uvedit_unwrap_ops.cc +++ b/source/blender/editors/uvedit/uvedit_unwrap_ops.cc @@ -12,13 +12,15 @@ #include "MEM_guardedalloc.h" +#include "DNA_camera_types.h" #include "DNA_modifier_types.h" #include "DNA_object_types.h" #include "DNA_scene_types.h" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BLI_array.hh" +#include "BLI_convexhull_2d.h" #include "BLI_linklist.h" #include "BLI_listbase.h" #include "BLI_math_geom.h" @@ -32,7 +34,7 @@ #include "BLI_uvproject.h" #include "BLI_vector.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_context.hh" #include "BKE_customdata.hh" @@ -40,9 +42,11 @@ #include "BKE_image.h" #include "BKE_layer.hh" #include "BKE_lib_id.hh" +#include "BKE_main.hh" +#include "BKE_material.h" #include "BKE_mesh.hh" -#include "BKE_object_types.hh" -#include "BKE_report.hh" +#include "BKE_report.h" +#include "BKE_scene.h" #include "BKE_subdiv.hh" #include "BKE_subdiv_mesh.hh" #include "BKE_subdiv_modifier.hh" @@ -54,6 +58,7 @@ #include "UI_interface.hh" #include "UI_resources.hh" +#include "UI_view2d.hh" #include "ED_image.hh" #include "ED_mesh.hh" @@ -794,7 +799,7 @@ static bool minimize_stretch_init(bContext *C, wmOperator *op) ms->iterations = RNA_int_get(op->ptr, "iterations"); ms->i = 0; ms->handle = construct_param_handle_multi(scene, objects, &options); - ms->lasttime = BLI_time_now_seconds(); + ms->lasttime = BLI_check_seconds_timer(); blender::geometry::uv_parametrizer_stretch_begin(ms->handle); if (ms->blend != 0.0f) { @@ -820,7 +825,7 @@ static void minimize_stretch_iteration(bContext *C, wmOperator *op, bool interac ms->i++; RNA_int_set(op->ptr, "iterations", ms->i); - if (interactive && (BLI_time_now_seconds() - ms->lasttime > 0.5)) { + if (interactive && (BLI_check_seconds_timer() - ms->lasttime > 0.5)) { char str[UI_MAX_DRAW_STR]; blender::geometry::uv_parametrizer_flush(ms->handle); @@ -831,7 +836,7 @@ static void minimize_stretch_iteration(bContext *C, wmOperator *op, bool interac ED_workspace_status_text(C, IFACE_("Press + and -, or scroll wheel to set blending")); } - ms->lasttime = BLI_time_now_seconds(); + ms->lasttime = BLI_check_seconds_timer(); for (Object *obedit : ms->objects_edit) { BMEditMesh *em = BKE_editmesh_from_object(obedit); @@ -956,11 +961,11 @@ static int minimize_stretch_modal(bContext *C, wmOperator *op, const wmEvent *ev break; case TIMER: if (ms->timer == event->customdata) { - double start = BLI_time_now_seconds(); + double start = BLI_check_seconds_timer(); do { minimize_stretch_iteration(C, op, true); - } while (BLI_time_now_seconds() - start < 0.01); + } while (BLI_check_seconds_timer() - start < 0.01); } break; } @@ -1932,8 +1937,8 @@ static void uv_map_transform_center(const Scene *scene, } case V3D_AROUND_CURSOR: /* cursor center */ { - invert_m4_m4(ob->runtime->world_to_object.ptr(), ob->object_to_world().ptr()); - mul_v3_m4v3(r_center, ob->world_to_object().ptr(), scene->cursor.location); + invert_m4_m4(ob->world_to_object, ob->object_to_world); + mul_v3_m4v3(r_center, ob->world_to_object, scene->cursor.location); break; } case V3D_AROUND_ACTIVE: { @@ -1983,7 +1988,7 @@ static void uv_map_rotation_matrix_ex(float result[4][4], zero_v3(viewmatrix[3]); /* get rotation of the current object matrix */ - copy_m4_m4(rotobj, ob->object_to_world().ptr()); + copy_m4_m4(rotobj, ob->object_to_world); zero_v3(rotobj[3]); /* but shifting */ @@ -2474,7 +2479,7 @@ static int unwrap_exec(bContext *C, wmOperator *op) continue; } - mat4_to_size(obsize, obedit->object_to_world().ptr()); + mat4_to_size(obsize, obedit->object_to_world); if (!(fabsf(obsize[0] - obsize[1]) < 1e-4f && fabsf(obsize[1] - obsize[2]) < 1e-4f)) { if ((reported_errors & UNWRAP_ERROR_NONUNIFORM) == 0) { BKE_report(op->reports, @@ -2484,7 +2489,7 @@ static int unwrap_exec(bContext *C, wmOperator *op) reported_errors |= UNWRAP_ERROR_NONUNIFORM; } } - else if (is_negative_m4(obedit->object_to_world().ptr())) { + else if (is_negative_m4(obedit->object_to_world)) { if ((reported_errors & UNWRAP_ERROR_NEGATIVE) == 0) { BKE_report( op->reports, @@ -3011,7 +3016,7 @@ static int uv_from_view_invoke(bContext *C, wmOperator *op, const wmEvent * /*ev { View3D *v3d = CTX_wm_view3d(C); RegionView3D *rv3d = CTX_wm_region_view3d(C); - const Camera *camera = ED_view3d_camera_data_get(v3d, rv3d); + Camera *camera = ED_view3d_camera_data_get(v3d, rv3d); PropertyRNA *prop; prop = RNA_struct_find_property(op->ptr, "camera_bounds"); @@ -3033,7 +3038,7 @@ static int uv_from_view_exec(bContext *C, wmOperator *op) ARegion *region = CTX_wm_region(C); View3D *v3d = CTX_wm_view3d(C); RegionView3D *rv3d = CTX_wm_region_view3d(C); - const Camera *camera = ED_view3d_camera_data_get(v3d, rv3d); + Camera *camera = ED_view3d_camera_data_get(v3d, rv3d); BMFace *efa; BMLoop *l; BMIter iter, liter; @@ -3051,7 +3056,7 @@ static int uv_from_view_exec(bContext *C, wmOperator *op) float objects_pos_avg[4] = {0}; for (Object *object : objects) { - add_v4_v4(objects_pos_avg, object->object_to_world().location()); + add_v4_v4(objects_pos_avg, object->object_to_world[3]); } mul_v4_fl(objects_pos_avg, 1.0f / objects.size()); @@ -3090,7 +3095,7 @@ static int uv_from_view_exec(bContext *C, wmOperator *op) const bool camera_bounds = RNA_boolean_get(op->ptr, "camera_bounds"); ProjCameraInfo *uci = BLI_uvproject_camera_info( v3d->camera, - obedit->object_to_world().ptr(), + obedit->object_to_world, camera_bounds ? (scene->r.xsch * scene->r.xasp) : 1.0f, camera_bounds ? (scene->r.ysch * scene->r.yasp) : 1.0f); @@ -3111,7 +3116,7 @@ static int uv_from_view_exec(bContext *C, wmOperator *op) } } else { - copy_m4_m4(rotmat, obedit->object_to_world().ptr()); + copy_m4_m4(rotmat, obedit->object_to_world); BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) { if (!BM_elem_flag_test(efa, BM_ELEM_SELECT)) { diff --git a/source/blender/freestyle/intern/application/AppView.cpp b/source/blender/freestyle/intern/application/AppView.cpp index 4d44b127534..469be2aa964 100644 --- a/source/blender/freestyle/intern/application/AppView.cpp +++ b/source/blender/freestyle/intern/application/AppView.cpp @@ -28,7 +28,7 @@ #include "IMB_imbuf_types.hh" #if 1 // FRS_antialiasing -# include "BKE_global.hh" +# include "BKE_global.h" # include "DNA_scene_types.h" #endif diff --git a/source/blender/freestyle/intern/application/Controller.cpp b/source/blender/freestyle/intern/application/Controller.cpp index a2c33a0a0e0..2e7fa97db02 100644 --- a/source/blender/freestyle/intern/application/Controller.cpp +++ b/source/blender/freestyle/intern/application/Controller.cpp @@ -49,7 +49,7 @@ extern "C" { #include "../blender_interface/BlenderStrokeRenderer.h" #include "../blender_interface/BlenderStyleModule.h" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BLI_path_util.h" #include "BLI_utildefines.h" diff --git a/source/blender/freestyle/intern/blender_interface/BlenderFileLoader.cpp b/source/blender/freestyle/intern/blender_interface/BlenderFileLoader.cpp index 6079d410619..3d784afa4d1 100644 --- a/source/blender/freestyle/intern/blender_interface/BlenderFileLoader.cpp +++ b/source/blender/freestyle/intern/blender_interface/BlenderFileLoader.cpp @@ -17,7 +17,7 @@ #include "BKE_attribute.hh" #include "BKE_customdata.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_mesh.hh" #include "BKE_object.hh" @@ -444,7 +444,7 @@ void BlenderFileLoader::insertShapeNode(Object *ob, Mesh *mesh, int id) // Compute matrix including camera transform float obmat[4][4], nmat[4][4]; - mul_m4_m4m4(obmat, viewmat, ob->object_to_world().ptr()); + mul_m4_m4m4(obmat, viewmat, ob->object_to_world); invert_m4_m4(nmat, obmat); transpose_m4(nmat); diff --git a/source/blender/freestyle/intern/blender_interface/BlenderFileLoader.h b/source/blender/freestyle/intern/blender_interface/BlenderFileLoader.h index e7f27d3fdc7..ac765a797a1 100644 --- a/source/blender/freestyle/intern/blender_interface/BlenderFileLoader.h +++ b/source/blender/freestyle/intern/blender_interface/BlenderFileLoader.h @@ -35,7 +35,7 @@ #include "BKE_lib_id.hh" #include "BKE_material.h" #include "BKE_mesh.h" -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "BLI_iterator.h" #include "BLI_listbase.h" diff --git a/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp b/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp index 1bdf2f6a948..817bd4be4f5 100644 --- a/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp +++ b/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp @@ -29,9 +29,9 @@ #include "DNA_screen_types.h" #include "BKE_attribute.hh" -#include "BKE_collection.hh" +#include "BKE_collection.h" #include "BKE_customdata.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_idprop.h" #include "BKE_layer.hh" #include "BKE_lib_id.hh" /* free_libblock */ @@ -41,7 +41,7 @@ #include "BKE_node.hh" #include "BKE_node_tree_update.hh" #include "BKE_object.hh" -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "BLI_ghash.h" #include "BLI_listbase.h" diff --git a/source/blender/freestyle/intern/blender_interface/FRS_freestyle.cpp b/source/blender/freestyle/intern/blender_interface/FRS_freestyle.cpp index 5f83a58eb53..4668e8334fc 100644 --- a/source/blender/freestyle/intern/blender_interface/FRS_freestyle.cpp +++ b/source/blender/freestyle/intern/blender_interface/FRS_freestyle.cpp @@ -28,16 +28,16 @@ using namespace Freestyle; #include "DNA_material_types.h" #include "DNA_text_types.h" -#include "BKE_callbacks.hh" +#include "BKE_callbacks.h" #include "BKE_context.hh" #include "BKE_freestyle.h" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_lib_id.hh" #include "BKE_linestyle.h" -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "BKE_text.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BLI_blenlib.h" #include "BLI_math_color_blend.h" diff --git a/source/blender/freestyle/intern/geometry/FastGrid.cpp b/source/blender/freestyle/intern/geometry/FastGrid.cpp index 6af6350eb7e..8b783e6b01e 100644 --- a/source/blender/freestyle/intern/geometry/FastGrid.cpp +++ b/source/blender/freestyle/intern/geometry/FastGrid.cpp @@ -11,7 +11,7 @@ #include "FastGrid.h" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BLI_utildefines.h" namespace Freestyle { diff --git a/source/blender/freestyle/intern/geometry/GeomCleaner.cpp b/source/blender/freestyle/intern/geometry/GeomCleaner.cpp index 5b96eedf2b1..fc32ebba1b7 100644 --- a/source/blender/freestyle/intern/geometry/GeomCleaner.cpp +++ b/source/blender/freestyle/intern/geometry/GeomCleaner.cpp @@ -25,7 +25,7 @@ #include "../system/TimeUtils.h" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BLI_sys_types.h" diff --git a/source/blender/freestyle/intern/stroke/BasicStrokeShaders.cpp b/source/blender/freestyle/intern/stroke/BasicStrokeShaders.cpp index 5d4925addad..04d7354d469 100644 --- a/source/blender/freestyle/intern/stroke/BasicStrokeShaders.cpp +++ b/source/blender/freestyle/intern/stroke/BasicStrokeShaders.cpp @@ -23,7 +23,7 @@ #include "../view_map/Functions0D.h" #include "../view_map/Functions1D.h" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BLI_sys_types.h" diff --git a/source/blender/freestyle/intern/stroke/Canvas.cpp b/source/blender/freestyle/intern/stroke/Canvas.cpp index 1b52be3d683..eb4d086d6bd 100644 --- a/source/blender/freestyle/intern/stroke/Canvas.cpp +++ b/source/blender/freestyle/intern/stroke/Canvas.cpp @@ -26,7 +26,7 @@ #include "BLI_sys_types.h" -#include "BKE_global.hh" +#include "BKE_global.h" // soc #include // soc #include diff --git a/source/blender/freestyle/intern/stroke/Curve.cpp b/source/blender/freestyle/intern/stroke/Curve.cpp index 23c4190a9a4..1d7c6cc7417 100644 --- a/source/blender/freestyle/intern/stroke/Curve.cpp +++ b/source/blender/freestyle/intern/stroke/Curve.cpp @@ -13,7 +13,7 @@ #include "CurveAdvancedIterators.h" #include "CurveIterators.h" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BLI_utildefines.h" namespace Freestyle { diff --git a/source/blender/freestyle/intern/stroke/Operators.cpp b/source/blender/freestyle/intern/stroke/Operators.cpp index 05409e5c1fa..5d6ddc2b19f 100644 --- a/source/blender/freestyle/intern/stroke/Operators.cpp +++ b/source/blender/freestyle/intern/stroke/Operators.cpp @@ -18,7 +18,7 @@ #include "BLI_sys_types.h" -#include "BKE_global.hh" +#include "BKE_global.h" namespace Freestyle { diff --git a/source/blender/freestyle/intern/stroke/Stroke.cpp b/source/blender/freestyle/intern/stroke/Stroke.cpp index 3bc0e2c32c7..ca628f5888f 100644 --- a/source/blender/freestyle/intern/stroke/Stroke.cpp +++ b/source/blender/freestyle/intern/stroke/Stroke.cpp @@ -12,7 +12,7 @@ #include "StrokeIterators.h" #include "StrokeRenderer.h" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_node.hh" namespace Freestyle { diff --git a/source/blender/freestyle/intern/stroke/StrokeRep.cpp b/source/blender/freestyle/intern/stroke/StrokeRep.cpp index 95b53e24cf2..613dda1a431 100644 --- a/source/blender/freestyle/intern/stroke/StrokeRep.cpp +++ b/source/blender/freestyle/intern/stroke/StrokeRep.cpp @@ -15,7 +15,7 @@ #include "StrokeRenderer.h" #include "StrokeRep.h" -#include "BKE_global.hh" +#include "BKE_global.h" using namespace std; diff --git a/source/blender/freestyle/intern/system/PythonInterpreter.h b/source/blender/freestyle/intern/system/PythonInterpreter.h index 49d37f2bd30..129e959b084 100644 --- a/source/blender/freestyle/intern/system/PythonInterpreter.h +++ b/source/blender/freestyle/intern/system/PythonInterpreter.h @@ -14,7 +14,7 @@ #include "Interpreter.h" #include "BKE_context.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_lib_id.hh" #include "BKE_main.hh" #include "BKE_text.h" diff --git a/source/blender/freestyle/intern/view_map/ArbitraryGridDensityProvider.cpp b/source/blender/freestyle/intern/view_map/ArbitraryGridDensityProvider.cpp index b7e1ae77689..f5cad712490 100644 --- a/source/blender/freestyle/intern/view_map/ArbitraryGridDensityProvider.cpp +++ b/source/blender/freestyle/intern/view_map/ArbitraryGridDensityProvider.cpp @@ -11,7 +11,7 @@ #include "BLI_sys_types.h" -#include "BKE_global.hh" +#include "BKE_global.h" namespace Freestyle { diff --git a/source/blender/freestyle/intern/view_map/AverageAreaGridDensityProvider.cpp b/source/blender/freestyle/intern/view_map/AverageAreaGridDensityProvider.cpp index 01a36e20422..362a9fb78f8 100644 --- a/source/blender/freestyle/intern/view_map/AverageAreaGridDensityProvider.cpp +++ b/source/blender/freestyle/intern/view_map/AverageAreaGridDensityProvider.cpp @@ -11,7 +11,7 @@ #include "BLI_sys_types.h" -#include "BKE_global.hh" +#include "BKE_global.h" namespace Freestyle { diff --git a/source/blender/freestyle/intern/view_map/BoxGrid.cpp b/source/blender/freestyle/intern/view_map/BoxGrid.cpp index e0c9a8ebd56..92e30012d5d 100644 --- a/source/blender/freestyle/intern/view_map/BoxGrid.cpp +++ b/source/blender/freestyle/intern/view_map/BoxGrid.cpp @@ -14,7 +14,7 @@ #include "BLI_sys_types.h" -#include "BKE_global.hh" +#include "BKE_global.h" using namespace std; diff --git a/source/blender/freestyle/intern/view_map/BoxGrid.h b/source/blender/freestyle/intern/view_map/BoxGrid.h index 852b740ddaf..69a57861522 100644 --- a/source/blender/freestyle/intern/view_map/BoxGrid.h +++ b/source/blender/freestyle/intern/view_map/BoxGrid.h @@ -29,7 +29,7 @@ #include "../winged_edge/WEdge.h" -#include "BKE_global.hh" +#include "BKE_global.h" #ifdef WITH_CXX_GUARDEDALLOC # include "MEM_guardedalloc.h" diff --git a/source/blender/freestyle/intern/view_map/CulledOccluderSource.cpp b/source/blender/freestyle/intern/view_map/CulledOccluderSource.cpp index 65e1a1a7065..f9017f662a3 100644 --- a/source/blender/freestyle/intern/view_map/CulledOccluderSource.cpp +++ b/source/blender/freestyle/intern/view_map/CulledOccluderSource.cpp @@ -13,7 +13,7 @@ #include "BLI_sys_types.h" -#include "BKE_global.hh" +#include "BKE_global.h" namespace Freestyle { diff --git a/source/blender/freestyle/intern/view_map/FEdgeXDetector.cpp b/source/blender/freestyle/intern/view_map/FEdgeXDetector.cpp index a232a33bd7e..9426815e396 100644 --- a/source/blender/freestyle/intern/view_map/FEdgeXDetector.cpp +++ b/source/blender/freestyle/intern/view_map/FEdgeXDetector.cpp @@ -16,7 +16,7 @@ #include "BLI_sys_types.h" -#include "BKE_global.hh" +#include "BKE_global.h" namespace Freestyle { diff --git a/source/blender/freestyle/intern/view_map/Functions0D.cpp b/source/blender/freestyle/intern/view_map/Functions0D.cpp index ed0a89a0ac5..f89edd0c4a3 100644 --- a/source/blender/freestyle/intern/view_map/Functions0D.cpp +++ b/source/blender/freestyle/intern/view_map/Functions0D.cpp @@ -12,7 +12,7 @@ #include "BLI_sys_types.h" -#include "BKE_global.hh" +#include "BKE_global.h" using namespace std; diff --git a/source/blender/freestyle/intern/view_map/GridDensityProvider.h b/source/blender/freestyle/intern/view_map/GridDensityProvider.h index 84815906fd5..d979f286520 100644 --- a/source/blender/freestyle/intern/view_map/GridDensityProvider.h +++ b/source/blender/freestyle/intern/view_map/GridDensityProvider.h @@ -18,7 +18,7 @@ #include "../geometry/BBox.h" -#include "BKE_global.hh" +#include "BKE_global.h" #ifdef WITH_CXX_GUARDEDALLOC # include "MEM_guardedalloc.h" diff --git a/source/blender/freestyle/intern/view_map/OccluderSource.cpp b/source/blender/freestyle/intern/view_map/OccluderSource.cpp index a1d7a298322..8a9ad783536 100644 --- a/source/blender/freestyle/intern/view_map/OccluderSource.cpp +++ b/source/blender/freestyle/intern/view_map/OccluderSource.cpp @@ -13,7 +13,7 @@ #include "BLI_sys_types.h" -#include "BKE_global.hh" +#include "BKE_global.h" namespace Freestyle { diff --git a/source/blender/freestyle/intern/view_map/Pow23GridDensityProvider.cpp b/source/blender/freestyle/intern/view_map/Pow23GridDensityProvider.cpp index ae2c3ad97c4..be34056f934 100644 --- a/source/blender/freestyle/intern/view_map/Pow23GridDensityProvider.cpp +++ b/source/blender/freestyle/intern/view_map/Pow23GridDensityProvider.cpp @@ -11,7 +11,7 @@ #include "BLI_sys_types.h" -#include "BKE_global.hh" +#include "BKE_global.h" namespace Freestyle { diff --git a/source/blender/freestyle/intern/view_map/SilhouetteGeomEngine.cpp b/source/blender/freestyle/intern/view_map/SilhouetteGeomEngine.cpp index 17218327ff8..8ae5d5be0d1 100644 --- a/source/blender/freestyle/intern/view_map/SilhouetteGeomEngine.cpp +++ b/source/blender/freestyle/intern/view_map/SilhouetteGeomEngine.cpp @@ -18,7 +18,7 @@ #include "BLI_sys_types.h" -#include "BKE_global.hh" +#include "BKE_global.h" using namespace std; diff --git a/source/blender/freestyle/intern/view_map/SphericalGrid.cpp b/source/blender/freestyle/intern/view_map/SphericalGrid.cpp index 13cd96884da..76c8a3d65c1 100644 --- a/source/blender/freestyle/intern/view_map/SphericalGrid.cpp +++ b/source/blender/freestyle/intern/view_map/SphericalGrid.cpp @@ -14,7 +14,7 @@ #include "BLI_sys_types.h" -#include "BKE_global.hh" +#include "BKE_global.h" using namespace std; diff --git a/source/blender/freestyle/intern/view_map/SphericalGrid.h b/source/blender/freestyle/intern/view_map/SphericalGrid.h index fc265066dfc..5ab4dd85f80 100644 --- a/source/blender/freestyle/intern/view_map/SphericalGrid.h +++ b/source/blender/freestyle/intern/view_map/SphericalGrid.h @@ -29,7 +29,7 @@ #include "../winged_edge/WEdge.h" -#include "BKE_global.hh" +#include "BKE_global.h" #ifdef WITH_CXX_GUARDEDALLOC # include "MEM_guardedalloc.h" diff --git a/source/blender/freestyle/intern/view_map/SteerableViewMap.cpp b/source/blender/freestyle/intern/view_map/SteerableViewMap.cpp index a3a71fb74f0..67bf9f00ee4 100644 --- a/source/blender/freestyle/intern/view_map/SteerableViewMap.cpp +++ b/source/blender/freestyle/intern/view_map/SteerableViewMap.cpp @@ -21,7 +21,7 @@ #include "BLI_math_base.h" #include "BLI_sys_types.h" -#include "BKE_global.hh" +#include "BKE_global.h" #include "IMB_imbuf.hh" #include "IMB_imbuf_types.hh" diff --git a/source/blender/freestyle/intern/view_map/ViewMapBuilder.cpp b/source/blender/freestyle/intern/view_map/ViewMapBuilder.cpp index c1c86ee42bb..1b09fe95a3d 100644 --- a/source/blender/freestyle/intern/view_map/ViewMapBuilder.cpp +++ b/source/blender/freestyle/intern/view_map/ViewMapBuilder.cpp @@ -28,7 +28,7 @@ #include "BLI_sys_types.h" -#include "BKE_global.hh" +#include "BKE_global.h" namespace Freestyle { diff --git a/source/blender/freestyle/intern/winged_edge/WXEdge.cpp b/source/blender/freestyle/intern/winged_edge/WXEdge.cpp index b0cbd6283ce..df064e5354c 100644 --- a/source/blender/freestyle/intern/winged_edge/WXEdge.cpp +++ b/source/blender/freestyle/intern/winged_edge/WXEdge.cpp @@ -11,7 +11,7 @@ #include "BLI_sys_types.h" -#include "BKE_global.hh" +#include "BKE_global.h" namespace Freestyle { diff --git a/source/blender/functions/intern/lazy_function_graph_executor.cc b/source/blender/functions/intern/lazy_function_graph_executor.cc index 47e74979d36..47d31fa5c8e 100644 --- a/source/blender/functions/intern/lazy_function_graph_executor.cc +++ b/source/blender/functions/intern/lazy_function_graph_executor.cc @@ -727,7 +727,7 @@ class Executor { } else { /* Schedule as priority node. This allows freeing up memory earlier which results - * in better memory reuse and fewer implicit sharing copies. */ + * in better memory reuse and less copy-on-write copies caused by shared data. */ this->schedule_node(locked_node, current_task, true); } } diff --git a/source/blender/functions/intern/multi_function.cc b/source/blender/functions/intern/multi_function.cc index f7c50050b07..ccbe3cdf63e 100644 --- a/source/blender/functions/intern/multi_function.cc +++ b/source/blender/functions/intern/multi_function.cc @@ -152,11 +152,11 @@ void MultiFunction::call_auto(const IndexMask &mask, Params params, Context cont IndexMaskMemory memory; const int64_t offset = -input_slice_start; - const IndexMask shifted_mask = mask.slice_and_shift(sub_range, offset, memory); + const IndexMask offset_mask = mask.slice_and_offset(sub_range, offset, memory); - ParamsBuilder sliced_params{*this, &shifted_mask}; + ParamsBuilder sliced_params{*this, &offset_mask}; add_sliced_parameters(*signature_ref_, params, input_slice_range, sliced_params); - this->call(shifted_mask, sliced_params, context); + this->call(offset_mask, sliced_params, context); }); } diff --git a/source/blender/geometry/CMakeLists.txt b/source/blender/geometry/CMakeLists.txt index 9db3d9e7d81..1aa4d1d0afa 100644 --- a/source/blender/geometry/CMakeLists.txt +++ b/source/blender/geometry/CMakeLists.txt @@ -6,7 +6,6 @@ set(INC . ../blenkernel ../blentranslation - ../bmesh ../functions ../makesrna ../../../intern/eigen @@ -18,10 +17,8 @@ set(INC_SYS set(SRC intern/add_curves_on_mesh.cc intern/curve_constraints.cc - intern/extend_curves.cc intern/fillet_curves.cc intern/join_geometries.cc - intern/mesh_boolean.cc intern/mesh_copy_selection.cc intern/mesh_merge_by_distance.cc intern/mesh_primitive_cuboid.cc @@ -52,10 +49,8 @@ set(SRC GEO_add_curves_on_mesh.hh GEO_curve_constraints.hh - GEO_extend_curves.hh GEO_fillet_curves.hh GEO_join_geometries.hh - GEO_mesh_boolean.hh GEO_mesh_copy_selection.hh GEO_mesh_merge_by_distance.hh GEO_mesh_primitive_cuboid.hh @@ -90,7 +85,6 @@ set(LIB PRIVATE bf::blenlib PRIVATE bf::dna PRIVATE bf::intern::guardedalloc - PRIVATE bf::extern::fmtlib ) if(WITH_OPENVDB) @@ -119,16 +113,4 @@ if(WITH_TBB) ) endif() -if(WITH_GMP) - add_definitions(-DWITH_GMP) - - list(APPEND INC_SYS - ${GMP_INCLUDE_DIRS} - ) - - list(APPEND LIB - ${GMP_LIBRARIES} - ) -endif() - blender_add_lib(bf_geometry "${SRC}" "${INC}" "${INC_SYS}" "${LIB}") diff --git a/source/blender/geometry/GEO_add_curves_on_mesh.hh b/source/blender/geometry/GEO_add_curves_on_mesh.hh index ef31028628b..f5b0f188813 100644 --- a/source/blender/geometry/GEO_add_curves_on_mesh.hh +++ b/source/blender/geometry/GEO_add_curves_on_mesh.hh @@ -22,12 +22,10 @@ struct AddCurvesOnMeshInputs { /** Determines shape of new curves. */ bool interpolate_length = false; - bool interpolate_radius = false; bool interpolate_shape = false; bool interpolate_point_count = false; bool interpolate_resolution = false; float fallback_curve_length = 0.0f; - float fallback_curve_radius = 0.0f; int fallback_point_count = 0; /** Information about the surface that the new curves are attached to. */ diff --git a/source/blender/geometry/GEO_extend_curves.hh b/source/blender/geometry/GEO_extend_curves.hh deleted file mode 100644 index 9c0917eab41..00000000000 --- a/source/blender/geometry/GEO_extend_curves.hh +++ /dev/null @@ -1,33 +0,0 @@ -/* SPDX-FileCopyrightText: 2023 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -#pragma once - -#include "BLI_span.hh" -#include "DNA_node_types.h" - -#include "BKE_curves.hh" -#include "BKE_curves_utils.hh" -#include "BKE_geometry_set.hh" - -namespace blender::geometry { - -/* - * Extend curves from their end-points, selectively allow curvature from the original curve to - * influence extended segments. - */ -bke::CurvesGeometry extend_curves(bke::CurvesGeometry &src_curves, - const IndexMask &selection, - const VArray &start_lengths, - const VArray &end_lengths, - float overshoot_fac, - bool follow_curvature, - float point_density, - float segment_influence, - float max_angle, - bool invert_curvature, - GeometryNodeCurveSampleMode sample_mode, - const bke::AnonymousAttributePropagationInfo &propagation_info); - -} // namespace blender::geometry diff --git a/source/blender/geometry/GEO_mesh_boolean.hh b/source/blender/geometry/GEO_mesh_boolean.hh deleted file mode 100644 index a7f3581fa6d..00000000000 --- a/source/blender/geometry/GEO_mesh_boolean.hh +++ /dev/null @@ -1,82 +0,0 @@ -/* SPDX-FileCopyrightText: 2019 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -#pragma once - -#include "BLI_array.hh" -#include "BLI_math_matrix_types.hh" -#include "BLI_span.hh" - -struct Mesh; - -namespace blender::geometry::boolean { - -/** Specifies which solver to use. */ -enum class Solver { - /** - * The exact solver based on the Mesh Arrangments for Solid Geometry paper, - * by Zhou, Grinspun, Zorin, and Jacobson. - */ - MeshArr = 0, - /** The original BMesh floating point solver. */ - Float = 1, -}; - -enum class Operation { - Intersect = 0, - Union = 1, - Difference = 2, -}; - -/** - * BooleanOpParameters bundles together the global parameters for the boolean operation. - * As well as saying which particular operation (intersect, difference, union) is desired, - * it also states some assumptions that the algorithm is allowed to make about the input - * (e.g., whether or not there are any self intersections). - */ -struct BooleanOpParameters { - Operation boolean_mode; - /** Can we assume there are no self-intersections in any of the operands? */ - bool no_self_intersections = true; - /** Can we assume there are no nested components (e.g., a box inside a box) in any of the - * components? */ - bool no_nested_components = true; - /** Can we assume the argument meshes are watertight volume enclosing? */ - bool watertight = true; -}; - -/** - * Do a mesh boolean operation directly on meshes. - * Boolean operations operate on the volumes enclosed by the operands. - * If is only one operand, the non-float versions will do self-intersection and remove - * internal faces. - * If there are more than two meshes, the first mesh is operand 0 and the rest of the - * meshes are operand 1 (i.e., as if all of operands 1, ... are joined into one mesh. - * The exact solvers assume that the meshes are PWN (piecewise winding number, - * which approximately means that the meshes are enclosed watertight voluems, - * and all edges are manifold, though there are allowable exceptions to that last condition). - * If the meshes don't sastisfy those conditions, all solvers will try to use ray-shooting - * to determine whether particular faces survive or not. This may or may not work - * in the way the user hopes. - * - * \param meshes: The meshes that are operands of the boolean operation. - * \param transforms: An array of transform matrices used for each mesh's positions. - * \param target_transform: the result needs to be transformed by this. - * \param material_remaps: An array of maps from material slot numbers in the corresponding mesh - * to the material slot in the first mesh. It is OK for material_remaps or any of its constituent - * arrays to be empty. A -1 value means that the original index should be used with no mapping. - * \param op_params: Specifies the boolean operation and assumptions we can make. - * \param solver: which solver to use - * \param r_intersecting_edges: Vector to store indices of edges on the resulting mesh in. These - * 'new' edges are the result of the intersections. - */ -Mesh *mesh_boolean(Span meshes, - Span transforms, - const float4x4 &target_transform, - Span> material_remaps, - BooleanOpParameters op_params, - Solver solver, - Vector *r_intersecting_edges); - -} // namespace blender::geometry::boolean diff --git a/source/blender/geometry/GEO_mesh_to_volume.hh b/source/blender/geometry/GEO_mesh_to_volume.hh index c87b9eb2e09..cd0298c8b6b 100644 --- a/source/blender/geometry/GEO_mesh_to_volume.hh +++ b/source/blender/geometry/GEO_mesh_to_volume.hh @@ -5,8 +5,6 @@ #include "BLI_bounds.hh" #include "BLI_function_ref.hh" #include "BLI_math_matrix_types.hh" -#include "BLI_math_vector_types.hh" -#include "BLI_span.hh" #include "BLI_string_ref.hh" #include "DNA_modifier_types.h" @@ -49,26 +47,15 @@ float volume_compute_voxel_size(const Depsgraph *depsgraph, */ bke::VolumeGridData *fog_volume_grid_add_from_mesh(Volume *volume, StringRefNull name, - Span positions, - Span corner_verts, - Span corner_tris, + const Mesh *mesh, const float4x4 &mesh_to_volume_space_transform, float voxel_size, float interior_band_width, float density); - -bke::VolumeGrid mesh_to_density_grid(const Span positions, - const Span corner_verts, - const Span corner_tris, - const float voxel_size, - const float interior_band_width, - const float density); - -bke::VolumeGrid mesh_to_sdf_grid(Span positions, - Span corner_verts, - Span corner_tris, - float voxel_size, - float half_band_width); - +/** + * Add a new SDF VolumeGrid to the Volume by converting the supplied mesh. + */ +bke::VolumeGridData *sdf_volume_grid_add_from_mesh( + Volume *volume, StringRefNull name, const Mesh &mesh, float voxel_size, float half_band_width); #endif } // namespace blender::geometry diff --git a/source/blender/geometry/GEO_points_to_volume.hh b/source/blender/geometry/GEO_points_to_volume.hh index 689dfaeaaea..89b3a101f91 100644 --- a/source/blender/geometry/GEO_points_to_volume.hh +++ b/source/blender/geometry/GEO_points_to_volume.hh @@ -2,8 +2,12 @@ * * SPDX-License-Identifier: GPL-2.0-or-later */ +#include "BLI_function_ref.hh" +#include "BLI_math_matrix_types.hh" #include "BLI_string_ref.hh" +#include "DNA_modifier_types.h" + #include "BKE_volume_grid_fwd.hh" #pragma once @@ -27,10 +31,13 @@ bke::VolumeGridData *fog_volume_grid_add_from_points(Volume *volume, Span radii, float voxel_size, float density); - -bke::VolumeGrid points_to_sdf_grid(Span positions, - Span radii, - float voxel_size); - +/** + * Add a new SDF VolumeGrid to the Volume by converting the supplied points. + */ +bke::VolumeGridData *sdf_volume_grid_add_from_points(Volume *volume, + StringRefNull name, + Span positions, + Span radii, + float voxel_size); #endif } // namespace blender::geometry diff --git a/source/blender/geometry/GEO_resample_curves.hh b/source/blender/geometry/GEO_resample_curves.hh index 4320947dd48..dab10c75a06 100644 --- a/source/blender/geometry/GEO_resample_curves.hh +++ b/source/blender/geometry/GEO_resample_curves.hh @@ -25,10 +25,6 @@ struct ResampleCurvesOutputAttributeIDs { * * \note The values provided by the #count_field are clamped to 1 or greater. */ -CurvesGeometry resample_to_count(const CurvesGeometry &src_curves, - const IndexMask &selection, - const VArray &counts, - const ResampleCurvesOutputAttributeIDs &output_ids = {}); CurvesGeometry resample_to_count(const CurvesGeometry &src_curves, const fn::FieldContext &field_context, const fn::Field &selection_field, @@ -40,10 +36,6 @@ CurvesGeometry resample_to_count(const CurvesGeometry &src_curves, * #segment_length field input, rounded to make the length of each segment the same. * The accuracy will depend on the curve's resolution parameter. */ -CurvesGeometry resample_to_length(const CurvesGeometry &src_curves, - const IndexMask &selection, - const VArray &sample_lengths, - const ResampleCurvesOutputAttributeIDs &output_ids = {}); CurvesGeometry resample_to_length(const CurvesGeometry &src_curves, const fn::FieldContext &field_context, const fn::Field &selection_field, @@ -53,9 +45,6 @@ CurvesGeometry resample_to_length(const CurvesGeometry &src_curves, /** * Evaluate each selected curve to its implicit evaluated points. */ -CurvesGeometry resample_to_evaluated(const CurvesGeometry &src_curves, - const IndexMask &selection, - const ResampleCurvesOutputAttributeIDs &output_ids = {}); CurvesGeometry resample_to_evaluated(const CurvesGeometry &src_curves, const fn::FieldContext &field_context, const fn::Field &selection_field, diff --git a/source/blender/geometry/GEO_reverse_uv_sampler.hh b/source/blender/geometry/GEO_reverse_uv_sampler.hh index f9a21dca41a..b7d80357a93 100644 --- a/source/blender/geometry/GEO_reverse_uv_sampler.hh +++ b/source/blender/geometry/GEO_reverse_uv_sampler.hh @@ -18,18 +18,14 @@ namespace blender::geometry { * \note this uses a trivial implementation currently that has to be replaced. */ class ReverseUVSampler { - public: - struct LookupGrid; - private: Span uv_map_; Span corner_tris_; int resolution_; - std::unique_ptr lookup_grid_; + MultiValueMap corner_tris_by_cell_; public: ReverseUVSampler(Span uv_map, Span corner_tris); - ~ReverseUVSampler(); enum class ResultType { None, diff --git a/source/blender/geometry/GEO_set_curve_type.hh b/source/blender/geometry/GEO_set_curve_type.hh index eec5c584d3d..31ac22cde12 100644 --- a/source/blender/geometry/GEO_set_curve_type.hh +++ b/source/blender/geometry/GEO_set_curve_type.hh @@ -11,6 +11,19 @@ namespace blender::geometry { +/** + * Try the conversion to the #dst_type-- avoiding the majority of the work done in + * #convert_curves by modifying an existing object in place rather than creating a new one. + * + * \note This function is necessary because attributes do not have proper support for CoW. + * + * \param get_writable_curves_fn: Should return the write-able curves to change directly if + * possible. This is a function in order to avoid the cost of retrieval when unnecessary. + */ +bool try_curves_conversion_in_place(const IndexMask &selection, + CurveType dst_type, + FunctionRef get_writable_curves_fn); + /** * Change the types of the selected curves, potentially changing the total point count. */ diff --git a/source/blender/geometry/intern/add_curves_on_mesh.cc b/source/blender/geometry/intern/add_curves_on_mesh.cc index 5bd31011b9e..35c711a9c73 100644 --- a/source/blender/geometry/intern/add_curves_on_mesh.cc +++ b/source/blender/geometry/intern/add_curves_on_mesh.cc @@ -47,13 +47,13 @@ float3 compute_surface_point_normal(const int3 &corner_tri, return math::normalize(value); } -template -static inline void linear_interpolation(const T &a, const T &b, MutableSpan dst) +static void initialize_straight_curve_positions(const float3 &p1, + const float3 &p2, + MutableSpan r_positions) { - dst.first() = a; - const float step = 1.0f / dst.size(); - for (const int i : dst.index_range().drop_front(1)) { - dst[i] = bke::attribute_math::mix2(i * step, a, b); + const float step = 1.0f / float(r_positions.size() - 1); + for (const int i : r_positions.index_range()) { + r_positions[i] = math::interpolate(p1, p2, i * step); } } @@ -85,10 +85,10 @@ static Array find_curve_neighbors(const Span root_positi } template -void interpolate_from_neighbor_curves(const Span neighbors_per_curve, - const T &fallback, - const GetValueF &get_value_from_neighbor, - MutableSpan r_interpolated_values) +void interpolate_from_neighbors(const Span neighbors_per_curve, + const T &fallback, + const GetValueF &get_value_from_neighbor, + MutableSpan r_interpolated_values) { bke::attribute_math::DefaultMixer mixer{r_interpolated_values}; threading::parallel_for(r_interpolated_values.index_range(), 512, [&](const IndexRange range) { @@ -108,12 +108,13 @@ void interpolate_from_neighbor_curves(const Span neighbors_per_c }); } -static void calc_position_without_interpolation(CurvesGeometry &curves, - const int old_curves_num, - const Span root_positions_cu, - const Span new_lengths_cu, - const Span new_normals_su, - const float4x4 &surface_to_curves_normal_mat) +static void interpolate_position_without_interpolation( + CurvesGeometry &curves, + const int old_curves_num, + const Span root_positions_cu, + const Span new_lengths_cu, + const Span new_normals_su, + const float4x4 &surface_to_curves_normal_mat) { const int added_curves_num = root_positions_cu.size(); const OffsetIndices points_by_curve = curves.points_by_curve(); @@ -129,21 +130,21 @@ static void calc_position_without_interpolation(CurvesGeometry &curves, math::transform_direction(surface_to_curves_normal_mat, normal_su)); const float3 tip_cu = root_cu + length * normal_cu; - linear_interpolation(root_cu, tip_cu, positions_cu.slice(points)); + initialize_straight_curve_positions(root_cu, tip_cu, positions_cu.slice(points)); } }); } -static void calc_position_with_interpolation(CurvesGeometry &curves, - const Span root_positions_cu, - const Span neighbors_per_curve, - const int old_curves_num, - const Span new_lengths_cu, - const Span new_normals_su, - const bke::CurvesSurfaceTransforms &transforms, - const Span corner_tris, - const ReverseUVSampler &reverse_uv_sampler, - const Span corner_normals_su) +static void interpolate_position_with_interpolation(CurvesGeometry &curves, + const Span root_positions_cu, + const Span neighbors_per_curve, + const int old_curves_num, + const Span new_lengths_cu, + const Span new_normals_su, + const bke::CurvesSurfaceTransforms &transforms, + const Span corner_tris, + const ReverseUVSampler &reverse_uv_sampler, + const Span corner_normals_su) { MutableSpan positions_cu = curves.positions_for_write(); const int added_curves_num = root_positions_cu.size(); @@ -167,7 +168,7 @@ static void calc_position_with_interpolation(CurvesGeometry &curves, if (neighbors.is_empty()) { /* If there are no neighbors, just make a straight line. */ const float3 tip_cu = root_cu + length_cu * normal_cu; - linear_interpolation(root_cu, tip_cu, positions_cu.slice(points)); + initialize_straight_curve_positions(root_cu, tip_cu, positions_cu.slice(points)); continue; } @@ -235,91 +236,13 @@ static void calc_position_with_interpolation(CurvesGeometry &curves, }); } -static void calc_radius_without_interpolation(CurvesGeometry &curves, - const IndexRange new_points_range, - const float radius) -{ - bke::MutableAttributeAccessor attributes = curves.attributes_for_write(); - bke::SpanAttributeWriter radius_attr = attributes.lookup_or_add_for_write_span( - "radius", bke::AttrDomain::Point); - radius_attr.span.slice(new_points_range).fill(radius); - radius_attr.finish(); -} - -static void calc_radius_with_interpolation(CurvesGeometry &curves, - const int old_curves_num, - const float radius, - const Span new_lengths_cu, - const Span neighbors_per_curve) -{ - const int added_curves_num = new_lengths_cu.size(); - const OffsetIndices points_by_curve = curves.points_by_curve(); - bke::MutableAttributeAccessor attributes = curves.attributes_for_write(); - bke::SpanAttributeWriter radius_attr = attributes.lookup_for_write_span("radius"); - if (!radius_attr) { - return; - } - - MutableSpan positions_cu = curves.positions_for_write(); - MutableSpan radii_cu = radius_attr.span; - - threading::parallel_for(IndexRange(added_curves_num), 256, [&](const IndexRange range) { - for (const int i : range) { - const NeighborCurves &neighbors = neighbors_per_curve[i]; - const float length_cu = new_lengths_cu[i]; - const int curve_i = old_curves_num + i; - const IndexRange points = points_by_curve[curve_i]; - - if (neighbors.is_empty()) { - /* If there are no neighbors, just using uniform radius. */ - radii_cu.slice(points).fill(radius); - continue; - } - - radii_cu.slice(points).fill(0.0f); - - for (const NeighborCurve &neighbor : neighbors) { - const int neighbor_curve_i = neighbor.index; - const IndexRange neighbor_points = points_by_curve[neighbor_curve_i]; - const Span neighbor_positions_cu = positions_cu.slice(neighbor_points); - const Span neighbor_radii_cu = radius_attr.span.slice(neighbor_points); - - Array lengths(length_parameterize::segments_num(neighbor_points.size(), false)); - length_parameterize::accumulate_lengths(neighbor_positions_cu, false, lengths); - - const float neighbor_length_cu = lengths.last(); - - Array sample_lengths(points.size()); - const float length_factor = std::min(1.0f, length_cu / neighbor_length_cu); - const float resample_factor = (1.0f / (points.size() - 1.0f)) * length_factor; - for (const int i : sample_lengths.index_range()) { - sample_lengths[i] = i * resample_factor * neighbor_length_cu; - } - - Array indices(points.size()); - Array factors(points.size()); - length_parameterize::sample_at_lengths(lengths, sample_lengths, indices, factors); - - for (const int i : IndexRange(points.size())) { - const float sample_cu = math::interpolate( - neighbor_radii_cu[indices[i]], neighbor_radii_cu[indices[i] + 1], factors[i]); - - radii_cu[points[i]] += neighbor.weight * sample_cu; - } - } - } - }); - radius_attr.finish(); -} - AddCurvesOnMeshOutputs add_curves_on_mesh(CurvesGeometry &curves, const AddCurvesOnMeshInputs &inputs) { AddCurvesOnMeshOutputs outputs; const bool use_interpolation = inputs.interpolate_length || inputs.interpolate_point_count || - inputs.interpolate_radius || inputs.interpolate_shape || - inputs.interpolate_resolution; + inputs.interpolate_shape || inputs.interpolate_resolution; Vector root_positions_cu; Vector bary_coords; @@ -365,13 +288,14 @@ AddCurvesOnMeshOutputs add_curves_on_mesh(CurvesGeometry &curves, if (new_curves_num == 0) { return outputs; } + const IndexRange new_curves_range = curves.curves_range().drop_front(old_curves_num); /* Compute new curve offsets. */ MutableSpan curve_offsets = curves.offsets_for_write(); Array new_point_counts_per_curve(added_curves_num); if (inputs.interpolate_point_count && old_curves_num > 0) { const OffsetIndices old_points_by_curve{curve_offsets.take_front(old_curves_num + 1)}; - interpolate_from_neighbor_curves( + interpolate_from_neighbors( neighbors_per_curve, inputs.fallback_point_count, [&](const int curve_i) { return old_points_by_curve[curve_i].size(); }, @@ -390,7 +314,7 @@ AddCurvesOnMeshOutputs add_curves_on_mesh(CurvesGeometry &curves, const int new_points_num = curves.offsets().last(); curves.resize(new_points_num, new_curves_num); - const OffsetIndices points_by_curve = curves.points_by_curve(); + MutableSpan positions_cu = curves.positions_for_write(); /* The new elements are added at the end of the arrays. */ outputs.new_points_range = curves.points_range().drop_front(old_points_num); @@ -401,10 +325,10 @@ AddCurvesOnMeshOutputs add_curves_on_mesh(CurvesGeometry &curves, surface_uv_coords.take_back(added_curves_num).copy_from(used_uvs); /* Determine length of new curves. */ - Span positions_cu = curves.positions(); Array new_lengths_cu(added_curves_num); if (inputs.interpolate_length) { - interpolate_from_neighbor_curves( + const OffsetIndices points_by_curve = curves.points_by_curve(); + interpolate_from_neighbors( neighbors_per_curve, inputs.fallback_curve_length, [&](const int curve_i) { @@ -434,37 +358,27 @@ AddCurvesOnMeshOutputs add_curves_on_mesh(CurvesGeometry &curves, /* Initialize position attribute. */ if (inputs.interpolate_shape) { - calc_position_with_interpolation(curves, - root_positions_cu, - neighbors_per_curve, - old_curves_num, - new_lengths_cu, - new_normals_su, - *inputs.transforms, - inputs.surface_corner_tris, - *inputs.reverse_uv_sampler, - inputs.corner_normals_su); + interpolate_position_with_interpolation(curves, + root_positions_cu, + neighbors_per_curve, + old_curves_num, + new_lengths_cu, + new_normals_su, + *inputs.transforms, + inputs.surface_corner_tris, + *inputs.reverse_uv_sampler, + inputs.corner_normals_su); } else { - calc_position_without_interpolation(curves, - old_curves_num, - root_positions_cu, - new_lengths_cu, - new_normals_su, - inputs.transforms->surface_to_curves_normal); + interpolate_position_without_interpolation(curves, + old_curves_num, + root_positions_cu, + new_lengths_cu, + new_normals_su, + inputs.transforms->surface_to_curves_normal); } - /* Initialize radius attribute */ - if (inputs.interpolate_radius) { - calc_radius_with_interpolation( - curves, old_curves_num, inputs.fallback_curve_radius, new_lengths_cu, neighbors_per_curve); - } - else { - calc_radius_without_interpolation( - curves, outputs.new_points_range, inputs.fallback_curve_radius); - } - - curves.fill_curve_types(outputs.new_curves_range, CURVE_TYPE_CATMULL_ROM); + curves.fill_curve_types(new_curves_range, CURVE_TYPE_CATMULL_ROM); bke::MutableAttributeAccessor attributes = curves.attributes_for_write(); @@ -472,7 +386,7 @@ AddCurvesOnMeshOutputs add_curves_on_mesh(CurvesGeometry &curves, "resolution")) { if (inputs.interpolate_resolution) { - interpolate_from_neighbor_curves( + interpolate_from_neighbors( neighbors_per_curve, 12, [&](const int curve_i) { return resolution.span[curve_i]; }, @@ -486,7 +400,7 @@ AddCurvesOnMeshOutputs add_curves_on_mesh(CurvesGeometry &curves, /* Explicitly set all other attributes besides those processed above to default values. */ bke::fill_attribute_range_default( - attributes, bke::AttrDomain::Point, {"position", "radius"}, outputs.new_points_range); + attributes, bke::AttrDomain::Point, {"position"}, outputs.new_points_range); bke::fill_attribute_range_default(attributes, bke::AttrDomain::Curve, {"curve_type", "surface_uv_coordinate", "resolution"}, diff --git a/source/blender/geometry/intern/extend_curves.cc b/source/blender/geometry/intern/extend_curves.cc deleted file mode 100644 index d856a0aa95e..00000000000 --- a/source/blender/geometry/intern/extend_curves.cc +++ /dev/null @@ -1,358 +0,0 @@ -/* SPDX-FileCopyrightText: 2023 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup bke - */ - -#include "BLI_array_utils.hh" -#include "BLI_length_parameterize.hh" -#include "BLI_math_axis_angle.hh" -#include "BLI_math_matrix.hh" -#include "BLI_math_quaternion.hh" -#include "BLI_math_rotation.hh" -#include "BLI_math_vector.hh" - -#include "BKE_attribute.hh" -#include "BKE_attribute_math.hh" -#include "BKE_curves.hh" -#include "BKE_curves_utils.hh" -#include "BKE_geometry_set.hh" - -#include "GEO_extend_curves.hh" - -namespace blender::geometry { - -static void extend_curves_straight(const float used_percent_length, - const float new_size, - const Span start_points, - const Span end_points, - const int curve, - const IndexRange new_curve, - const Span use_start_lengths, - const Span use_end_lengths, - MutableSpan positions) -{ - float overshoot_point_param = used_percent_length * (new_size - 1); - if (start_points[curve]) { - /** Here we use the vector between two adjacent points around #overshoot_point_param as - * our reference for the direction of extension, however to have better tolerance for jitter, - * using the vector (a_few_points_back - end_point) might be a better solution in the future. - */ - int index1 = math::floor(overshoot_point_param); - int index2 = math::ceil(overshoot_point_param); - - /* When #overshoot_point_param is zero */ - if (index2 == 0) { - index2 = 1; - } - float3 result = math::interpolate(positions[new_curve[index1]], - positions[new_curve[index2]], - fmodf(overshoot_point_param, 1.0f)); - result -= positions[new_curve.first()]; - if (UNLIKELY(math::is_zero(result))) { - result = positions[new_curve[1]] - positions[new_curve[0]]; - } - positions[new_curve[0]] += result * (-use_start_lengths[curve] / math::length(result)); - } - - if (end_points[curve]) { - int index1 = new_size - 1 - math::floor(overshoot_point_param); - int index2 = new_size - 1 - math::ceil(overshoot_point_param); - float3 result = math::interpolate(positions[new_curve[index1]], - positions[new_curve[index2]], - fmodf(overshoot_point_param, 1.0f)); - result -= positions[new_curve.last()]; - if (UNLIKELY(math::is_zero(result))) { - result = positions[new_curve[new_size - 2]] - positions[new_curve[new_size - 1]]; - } - positions[new_curve[new_size - 1]] += result * - (-use_end_lengths[curve] / math::length(result)); - } -} - -static void extend_curves_curved(const float used_percent_length, - const Span start_points, - const Span end_points, - const OffsetIndices points_by_curve, - const int curve, - const IndexRange new_curve, - const Span use_start_lengths, - const Span use_end_lengths, - const float max_angle, - const float segment_influence, - const bool invert_curvature, - MutableSpan positions) -{ - /* Curvature calculation. */ - const int first_old_index = start_points[curve] ? start_points[curve] : 0; - const int last_old_index = points_by_curve[curve].size() - 1 + first_old_index; - const int orig_totpoints = points_by_curve[curve].size(); - - /* The fractional amount of points to query when calculating the average curvature of the - * strokes. */ - const float overshoot_parameter = used_percent_length * (orig_totpoints - 2); - int overshoot_pointcount = math::ceil(overshoot_parameter); - overshoot_pointcount = math::clamp(overshoot_pointcount, 1, orig_totpoints - 2); - - /* Do for both sides without code duplication. */ - float3 vec1, total_angle; - for (int k = 0; k < 2; k++) { - if ((k == 0 && !start_points[curve]) || (k == 1 && !end_points[curve])) { - continue; - } - - const int start_i = k == 0 ? first_old_index : last_old_index; - const int dir_i = 1 - k * 2; - - vec1 = positions[new_curve[start_i + dir_i]] - positions[new_curve[start_i]]; - total_angle = float3({0, 0, 0}); - - float segment_length; - vec1 = math::normalize_and_get_length(vec1, segment_length); - - float overshoot_length = 0.0f; - - /* Accumulate rotation angle and length. */ - int j = 0; - float3 no, vec2; - for (int i = start_i; j < overshoot_pointcount; i += dir_i, j++) { - /* Don't fully add last segment to get continuity in overshoot_fac. */ - float fac = math::min(overshoot_parameter - j, 1.0f); - - /* Read segments. */ - vec2 = vec1; - vec1 = positions[new_curve[i + dir_i * 2]] - positions[new_curve[i + dir_i]]; - - float len; - vec1 = math::normalize_and_get_length(vec1, len); - float angle = math::angle_between(vec1, vec2).radian() * fac; - - /* Add half of both adjacent legs of the current angle. */ - const float added_len = (segment_length + len) * 0.5f * fac; - overshoot_length += added_len; - segment_length = len; - - if (angle > max_angle) { - continue; - } - if (angle > M_PI * 0.995f) { - continue; - } - - angle *= math::pow(added_len, segment_influence); - - no = math::cross(vec1, vec2); - no = math::normalize(no) * angle; - total_angle += no; - } - - if (UNLIKELY(overshoot_length == 0.0f)) { - /* Don't do a proper extension if the used points are all in the same position. */ - continue; - } - - vec1 = positions[new_curve[start_i]] - positions[new_curve[start_i + dir_i]]; - /* In general curvature = 1/radius. For the case without the - * weights introduced by #segment_influence, the calculation is: - * `curvature = delta angle/delta arclength = len_v3(total_angle) / overshoot_length` */ - float curvature = normalize_v3(total_angle) / overshoot_length; - /* Compensate for the weights powf(added_len, segment_influence). */ - curvature /= math::pow(overshoot_length / math::min(overshoot_parameter, float(j)), - segment_influence); - if (invert_curvature) { - curvature = -curvature; - } - const float dist = k == 0 ? use_start_lengths[curve] : use_end_lengths[curve]; - const int extra_point_count = k == 0 ? start_points[curve] : end_points[curve]; - const float angle_step = curvature * dist / extra_point_count; - float step_length = dist / extra_point_count; - if (math::abs(angle_step) > FLT_EPSILON) { - /* Make a direct step length from the assigned arc step length. */ - step_length *= sin(angle_step * 0.5f) / (angle_step * 0.5f); - } - else { - total_angle = float3({0, 0, 0}); - } - float prev_length; - vec1 = math::normalize_and_get_length(vec1, prev_length); - vec1 *= step_length; - - /* Build rotation matrix here to get best performance. */ - math::AxisAngle axis_base(total_angle, angle_step); - math::Quaternion q = math::to_quaternion(axis_base); - float3x3 rot = math::from_rotation(q); - - /* Rotate the starting direction to account for change in edge lengths. */ - math::AxisAngle step_base(total_angle, - math::max(0.0f, 1.0f - math::abs(segment_influence)) * - (curvature * prev_length - angle_step) / 2.0f); - q = math::to_quaternion(step_base); - vec1 = math::transform_point(q, vec1); - - /* Now iteratively accumulate the segments with a rotating added direction. */ - for (int i = start_i - dir_i, j = 0; j < extra_point_count; i -= dir_i, j++) { - vec1 = rot * vec1; - positions[new_curve[i]] = vec1 + positions[new_curve[i + dir_i]]; - } - } -} - -bke::CurvesGeometry extend_curves(bke::CurvesGeometry &src_curves, - const IndexMask &selection, - const VArray &start_lengths, - const VArray &end_lengths, - const float overshoot_fac, - const bool follow_curvature, - const float point_density, - const float segment_influence, - const float max_angle, - const bool invert_curvature, - const GeometryNodeCurveSampleMode sample_mode, - const bke::AnonymousAttributePropagationInfo &propagation_info) -{ - if (src_curves.points_num() < 2) { - return src_curves; - } - - const int src_curves_num = src_curves.curves_num(); - Array start_points(src_curves_num); - Array end_points(src_curves_num); - Array use_start_lengths(src_curves_num); - Array use_end_lengths(src_curves_num); - - const OffsetIndices points_by_curve = src_curves.points_by_curve(); - - src_curves.ensure_evaluated_lengths(); - selection.foreach_index([&](const int curve) { - use_start_lengths[curve] = start_lengths[curve]; - use_end_lengths[curve] = end_lengths[curve]; - if (sample_mode == GEO_NODE_CURVE_SAMPLE_FACTOR) { - float total_length = src_curves.evaluated_length_total_for_curve(curve, false); - use_start_lengths[curve] *= total_length; - use_end_lengths[curve] *= total_length; - start_points[curve] = 1; - end_points[curve] = 1; - } - }); - - bke::CurvesGeometry dst_curves; - - /* Use the old curves when extending straight when no new points are added. */ - if (!follow_curvature) { - dst_curves = std::move(src_curves); - } - else { - /* Copy only curves domain since we are not changing the number of curves here. */ - dst_curves = bke::curves::copy_only_curve_domain(src_curves); - /* Count how many points we need. */ - MutableSpan dst_points_by_curve = dst_curves.offsets_for_write(); - selection.foreach_index([&](const int curve) { - int point_count = points_by_curve[curve].size(); - dst_points_by_curve[curve] = point_count; - /* Curve not suitable for stretching... */ - if (point_count <= 2) { - return; - } - - const int count_start = (use_start_lengths[curve] > 0) ? - (math::ceil(use_start_lengths[curve] * point_density)) : - 0; - const int count_end = (use_end_lengths[curve] > 0) ? - (math::ceil(use_end_lengths[curve] * point_density)) : - 0; - dst_points_by_curve[curve] += count_start; - dst_points_by_curve[curve] += count_end; - start_points[curve] = count_start; - end_points[curve] = count_end; - }); - - OffsetIndices dst_indices = offset_indices::accumulate_counts_to_offsets(dst_points_by_curve); - int target_point_count = dst_points_by_curve.last(); - - /* Make destination to source map for points. */ - Array dst_to_src_point(target_point_count); - for (const int curve : src_curves.curves_range()) { - const int point_count = points_by_curve[curve].size(); - int local_front = 0; - MutableSpan new_points_by_curve = dst_to_src_point.as_mutable_span().slice( - dst_indices[curve]); - if (start_points[curve]) { - MutableSpan starts = new_points_by_curve.slice(0, start_points[curve]); - starts.fill(points_by_curve[curve].first()); - local_front = start_points[curve]; - } - if (end_points[curve]) { - MutableSpan ends = new_points_by_curve.slice( - new_points_by_curve.size() - end_points[curve], end_points[curve]); - ends.fill(points_by_curve[curve].last()); - } - MutableSpan original_points = new_points_by_curve.slice(local_front, point_count); - for (const int point_i : original_points.index_range()) { - original_points[point_i] = points_by_curve[curve][point_i]; - } - } - - dst_curves.resize(target_point_count, src_curves_num); - - const bke::AttributeAccessor src_attributes = src_curves.attributes(); - bke::MutableAttributeAccessor dst_attributes = dst_curves.attributes_for_write(); - - /* Transfer point attributes. */ - gather_attributes(src_attributes, - bke::AttrDomain::Point, - propagation_info, - {}, - dst_to_src_point, - dst_attributes); - } - - MutableSpan positions = dst_curves.positions_for_write(); - - const OffsetIndices new_points_by_curve = dst_curves.points_by_curve(); - threading::parallel_for(dst_curves.curves_range(), 512, [&](const IndexRange curves_range) { - for (const int curve : curves_range) { - if (!start_points[curve] && !end_points[curve]) { - /* Curves should not be touched if they didn't generate extra points before. */ - return; - } - const IndexRange new_curve = new_points_by_curve[curve]; - int new_size = new_curve.size(); - - /* #used_percent_length must always be finite and non-zero. */ - const float used_percent_length = math::clamp( - isfinite(overshoot_fac) ? overshoot_fac : 0.1f, 1e-4f, 1.0f); - - if (!follow_curvature) { - extend_curves_straight(used_percent_length, - new_size, - start_points.as_span(), - end_points.as_span(), - curve, - new_curve, - use_start_lengths.as_span(), - use_end_lengths.as_span(), - positions); - } - else { - extend_curves_curved(used_percent_length, - start_points.as_span(), - end_points.as_span(), - points_by_curve, - curve, - new_curve, - use_start_lengths.as_span(), - use_end_lengths.as_span(), - max_angle, - segment_influence, - invert_curvature, - positions); - } - } - }); - - return dst_curves; -} - -} // namespace blender::geometry diff --git a/source/blender/geometry/intern/fillet_curves.cc b/source/blender/geometry/intern/fillet_curves.cc index fe40ab7e5a2..0066e57a6a4 100644 --- a/source/blender/geometry/intern/fillet_curves.cc +++ b/source/blender/geometry/intern/fillet_curves.cc @@ -5,7 +5,9 @@ #include "BKE_attribute_math.hh" #include "BKE_curves.hh" #include "BKE_curves_utils.hh" +#include "BKE_geometry_set.hh" +#include "BLI_math_geom.h" #include "BLI_math_rotation_legacy.hh" #include "BLI_task.hh" diff --git a/source/blender/geometry/intern/join_geometries.cc b/source/blender/geometry/intern/join_geometries.cc index 5927338e3a0..2acaf0d8909 100644 --- a/source/blender/geometry/intern/join_geometries.cc +++ b/source/blender/geometry/intern/join_geometries.cc @@ -109,6 +109,7 @@ static void join_instances(const Span src_components, std::unique_ptr dst_instances = std::make_unique(); dst_instances->resize(offsets.total_size()); + MutableSpan all_transforms = dst_instances->transforms(); MutableSpan all_handles = dst_instances->reference_handles_for_write(); for (const int i : src_components.index_range()) { @@ -125,11 +126,12 @@ static void join_instances(const Span src_components, const Span src_handles = src_instances.reference_handles(); array_utils::gather(handle_map.as_span(), src_handles, all_handles.slice(dst_range)); + array_utils::copy(src_instances.transforms(), all_transforms.slice(dst_range)); } result.replace_instances(dst_instances.release()); auto &dst_component = result.get_component_for_write(); - join_attributes(src_components, dst_component, {".reference_index"}); + join_attributes(src_components, dst_component, {"position", ".reference_index"}); } static void join_volumes(const Span /*src_components*/, @@ -172,13 +174,11 @@ static void join_component_type(const bke::GeometryComponent::Type component_typ } std::unique_ptr instances = std::make_unique(); - instances->resize(components.size()); - instances->transforms_for_write().fill(float4x4::identity()); - MutableSpan handles = instances->reference_handles_for_write(); - for (const int i : components.index_range()) { + for (const GeometryComponent *component : components) { GeometrySet tmp_geo; - tmp_geo.add(*components[i]); - handles[i] = instances->add_reference(bke::InstanceReference{tmp_geo}); + tmp_geo.add(*component); + const int handle = instances->add_reference(bke::InstanceReference{tmp_geo}); + instances->add_instance(handle, float4x4::identity()); } RealizeInstancesOptions options; diff --git a/source/blender/geometry/intern/mesh_copy_selection.cc b/source/blender/geometry/intern/mesh_copy_selection.cc index af34d97f90c..c35f898a562 100644 --- a/source/blender/geometry/intern/mesh_copy_selection.cc +++ b/source/blender/geometry/intern/mesh_copy_selection.cc @@ -70,6 +70,25 @@ static void remap_edges(const OffsetIndices src_faces, }); } +/** Create a mesh with no built-in attributes. */ +static Mesh *create_mesh_no_attributes(const Mesh ¶ms_mesh, + const int verts_num, + const int edges_num, + const int faces_num, + const int corners_num) +{ + Mesh *mesh = BKE_mesh_new_nomain(0, 0, faces_num, 0); + mesh->verts_num = verts_num; + mesh->edges_num = edges_num; + mesh->corners_num = corners_num; + CustomData_free_layer_named(&mesh->vert_data, "position", 0); + CustomData_free_layer_named(&mesh->edge_data, ".edge_verts", 0); + CustomData_free_layer_named(&mesh->corner_data, ".corner_vert", 0); + CustomData_free_layer_named(&mesh->corner_data, ".corner_edge", 0); + BKE_mesh_copy_parameters_for_eval(mesh, ¶ms_mesh); + return mesh; +} + static void copy_loose_vert_hint(const Mesh &src, Mesh &dst) { const auto &src_cache = src.runtime->loose_verts_cache; @@ -199,9 +218,8 @@ std::optional mesh_copy_selection( return std::nullopt; } - Mesh *dst_mesh = bke::mesh_new_no_attributes( - vert_mask.size(), edge_mask.size(), face_mask.size(), 0); - BKE_mesh_copy_parameters_for_eval(dst_mesh, &src_mesh); + Mesh *dst_mesh = create_mesh_no_attributes( + src_mesh, vert_mask.size(), edge_mask.size(), face_mask.size(), 0); bke::MutableAttributeAccessor dst_attributes = dst_mesh->attributes_for_write(); dst_attributes.add(".edge_verts", bke::AttrDomain::Edge, bke::AttributeInitConstruct()); MutableSpan dst_edges = dst_mesh->edges_for_write(); @@ -333,9 +351,8 @@ std::optional mesh_copy_selection_keep_verts( return std::nullopt; } - Mesh *dst_mesh = bke::mesh_new_no_attributes( - src_mesh.verts_num, edge_mask.size(), face_mask.size(), 0); - BKE_mesh_copy_parameters_for_eval(dst_mesh, &src_mesh); + Mesh *dst_mesh = create_mesh_no_attributes( + src_mesh, src_mesh.verts_num, edge_mask.size(), face_mask.size(), 0); bke::MutableAttributeAccessor dst_attributes = dst_mesh->attributes_for_write(); const OffsetIndices dst_faces = offset_indices::gather_selected_offsets( @@ -426,9 +443,8 @@ std::optional mesh_copy_selection_keep_edges( return std::nullopt; } - Mesh *dst_mesh = bke::mesh_new_no_attributes( - src_mesh.verts_num, src_mesh.edges_num, face_mask.size(), 0); - BKE_mesh_copy_parameters_for_eval(dst_mesh, &src_mesh); + Mesh *dst_mesh = create_mesh_no_attributes( + src_mesh, src_mesh.verts_num, src_mesh.edges_num, face_mask.size(), 0); bke::MutableAttributeAccessor dst_attributes = dst_mesh->attributes_for_write(); const OffsetIndices dst_faces = offset_indices::gather_selected_offsets( diff --git a/source/blender/geometry/intern/mesh_merge_by_distance.cc b/source/blender/geometry/intern/mesh_merge_by_distance.cc index 161bfc09631..bb581b50f04 100644 --- a/source/blender/geometry/intern/mesh_merge_by_distance.cc +++ b/source/blender/geometry/intern/mesh_merge_by_distance.cc @@ -10,6 +10,7 @@ #include "BLI_index_mask.hh" #include "BLI_kdtree.h" #include "BLI_math_vector.h" +#include "BLI_math_vector.hh" #include "BLI_offset_indices.hh" #include "BLI_vector.hh" diff --git a/source/blender/geometry/intern/mesh_primitive_uv_sphere.cc b/source/blender/geometry/intern/mesh_primitive_uv_sphere.cc index 97401b77a51..edaaeb085d4 100644 --- a/source/blender/geometry/intern/mesh_primitive_uv_sphere.cc +++ b/source/blender/geometry/intern/mesh_primitive_uv_sphere.cc @@ -2,6 +2,8 @@ * * SPDX-License-Identifier: GPL-2.0-or-later */ +#include "BLI_math_vector.hh" + #include "BKE_attribute.hh" #include "BKE_mesh.hh" diff --git a/source/blender/geometry/intern/mesh_to_curve_convert.cc b/source/blender/geometry/intern/mesh_to_curve_convert.cc index 71c6c51d28d..b0bf1beb047 100644 --- a/source/blender/geometry/intern/mesh_to_curve_convert.cc +++ b/source/blender/geometry/intern/mesh_to_curve_convert.cc @@ -10,6 +10,7 @@ #include "BKE_attribute.hh" #include "BKE_attribute_math.hh" #include "BKE_curves.hh" +#include "BKE_geometry_set.hh" #include "BKE_mesh.hh" #include "GEO_mesh_to_curve.hh" @@ -55,9 +56,6 @@ BLI_NOINLINE bke::CurvesGeometry create_curve_from_vert_indices( if (meta_data.domain == bke::AttrDomain::Point) { return true; } - if (meta_data.data_type == CD_PROP_STRING) { - return true; - } if (skip.contains(id.name())) { return true; } diff --git a/source/blender/geometry/intern/mesh_to_volume.cc b/source/blender/geometry/intern/mesh_to_volume.cc index a339a520c05..cf137d347b3 100644 --- a/source/blender/geometry/intern/mesh_to_volume.cc +++ b/source/blender/geometry/intern/mesh_to_volume.cc @@ -5,8 +5,9 @@ #include "BLI_math_matrix.hh" #include "BLI_task.hh" +#include "BKE_mesh.hh" +#include "BKE_mesh_runtime.hh" #include "BKE_volume.hh" -#include "BKE_volume_grid.hh" #include "BKE_volume_openvdb.hh" #include "GEO_mesh_to_volume.hh" @@ -29,23 +30,17 @@ class OpenVDBMeshAdapter { float4x4 transform_; public: - OpenVDBMeshAdapter(const Span positions, - const Span corner_verts, - const Span corner_tris, - const float4x4 &transform); + OpenVDBMeshAdapter(const Mesh &mesh, float4x4 transform); size_t polygonCount() const; size_t pointCount() const; size_t vertexCount(size_t /*polygon_index*/) const; void getIndexSpacePoint(size_t polygon_index, size_t vertex_index, openvdb::Vec3d &pos) const; }; -OpenVDBMeshAdapter::OpenVDBMeshAdapter(const Span positions, - const Span corner_verts, - const Span corner_tris, - const float4x4 &transform) - : positions_(positions), - corner_verts_(corner_verts), - corner_tris_(corner_tris), +OpenVDBMeshAdapter::OpenVDBMeshAdapter(const Mesh &mesh, float4x4 transform) + : positions_(mesh.vert_positions()), + corner_verts_(mesh.corner_verts()), + corner_tris_(mesh.corner_tris()), transform_(transform) { } @@ -110,10 +105,8 @@ float volume_compute_voxel_size(const Depsgraph *depsgraph, return voxel_size / volume_simplify; } -static openvdb::FloatGrid::Ptr mesh_to_density_grid_impl( - const Span positions, - const Span corner_verts, - const Span corner_tris, +static openvdb::FloatGrid::Ptr mesh_to_fog_volume_grid( + const Mesh *mesh, const float4x4 &mesh_to_volume_space_transform, const float voxel_size, const float interior_band_width, @@ -128,8 +121,7 @@ static openvdb::FloatGrid::Ptr mesh_to_density_grid_impl( /* Better align generated grid with the source mesh. */ mesh_to_index_space_transform.location() -= 0.5f; - OpenVDBMeshAdapter mesh_adapter{ - positions, corner_verts, corner_tris, mesh_to_index_space_transform}; + OpenVDBMeshAdapter mesh_adapter{*mesh, mesh_to_index_space_transform}; const float interior = std::max(1.0f, interior_band_width / voxel_size); openvdb::math::Transform::Ptr transform = openvdb::math::Transform::createLinearTransform( @@ -148,36 +140,18 @@ static openvdb::FloatGrid::Ptr mesh_to_density_grid_impl( return new_grid; } -bke::VolumeGrid mesh_to_density_grid(const Span positions, - const Span corner_verts, - const Span corner_tris, - const float voxel_size, - const float interior_band_width, - const float density) -{ - openvdb::FloatGrid::Ptr grid = mesh_to_density_grid_impl(positions, - corner_verts, - corner_tris, - float4x4::identity(), - voxel_size, - interior_band_width, - density); - if (!grid) { - return {}; - } - return bke::VolumeGrid(std::move(grid)); -} - -bke::VolumeGrid mesh_to_sdf_grid(const Span positions, - const Span corner_verts, - const Span corner_tris, - const float voxel_size, - const float half_band_width) +static openvdb::FloatGrid::Ptr mesh_to_sdf_volume_grid(const Mesh &mesh, + const float voxel_size, + const float half_band_width) { if (voxel_size <= 0.0f || half_band_width <= 0.0f) { - return {}; + return nullptr; } + const Span positions = mesh.vert_positions(); + const Span corner_verts = mesh.corner_verts(); + const Span corner_tris = mesh.corner_tris(); + std::vector points(positions.size()); std::vector triangles(corner_tris.size()); @@ -201,28 +175,30 @@ bke::VolumeGrid mesh_to_sdf_grid(const Span positions, openvdb::FloatGrid::Ptr new_grid = openvdb::tools::meshToLevelSet( *transform, points, triangles, half_band_width); - return bke::VolumeGrid(std::move(new_grid)); + return new_grid; } bke::VolumeGridData *fog_volume_grid_add_from_mesh(Volume *volume, const StringRefNull name, - const Span positions, - const Span corner_verts, - const Span corner_tris, + const Mesh *mesh, const float4x4 &mesh_to_volume_space_transform, const float voxel_size, const float interior_band_width, const float density) { - openvdb::FloatGrid::Ptr mesh_grid = mesh_to_density_grid_impl(positions, - corner_verts, - corner_tris, - mesh_to_volume_space_transform, - voxel_size, - interior_band_width, - density); + openvdb::FloatGrid::Ptr mesh_grid = mesh_to_fog_volume_grid( + mesh, mesh_to_volume_space_transform, voxel_size, interior_band_width, density); return mesh_grid ? BKE_volume_grid_add_vdb(*volume, name, std::move(mesh_grid)) : nullptr; } +bke::VolumeGridData *sdf_volume_grid_add_from_mesh(Volume *volume, + const StringRefNull name, + const Mesh &mesh, + const float voxel_size, + const float half_band_width) +{ + openvdb::FloatGrid::Ptr mesh_grid = mesh_to_sdf_volume_grid(mesh, voxel_size, half_band_width); + return mesh_grid ? BKE_volume_grid_add_vdb(*volume, name, std::move(mesh_grid)) : nullptr; +} } // namespace blender::geometry #endif diff --git a/source/blender/geometry/intern/mix_geometries.cc b/source/blender/geometry/intern/mix_geometries.cc index 085dc20f248..c0d5438c5b6 100644 --- a/source/blender/geometry/intern/mix_geometries.cc +++ b/source/blender/geometry/intern/mix_geometries.cc @@ -69,6 +69,29 @@ static void mix(GMutableSpan a, const GVArray &b, const float factor) }); } +static void mix(MutableSpan a, const Span b, const float factor) +{ + threading::parallel_for(a.index_range(), 1024, [&](const IndexRange range) { + for (const int i : range) { + a[i] = math::interpolate(a[i], b[i], factor); + } + }); +} + +static void mix_with_indices(MutableSpan a, + const Span b, + const Span index_map, + const float factor) +{ + threading::parallel_for(a.index_range(), 1024, [&](const IndexRange range) { + for (const int i : range) { + if (index_map[i] != -1) { + a[i] = math::interpolate(a[i], b[index_map[i]], factor); + } + } + }); +} + static void mix_attributes(bke::MutableAttributeAccessor attributes_a, const bke::AttributeAccessor b_attributes, const Span index_map, @@ -193,7 +216,13 @@ bke::GeometrySet mix_geometries(bke::GeometrySet a, const bke::GeometrySet &b, c index_map, bke::AttrDomain::Instance, factor, - {}); + {"position"}); + if (index_map.is_empty()) { + mix(instances_a->transforms(), instances_b->transforms(), factor); + } + else { + mix_with_indices(instances_a->transforms(), instances_b->transforms(), index_map, factor); + } } } return a; diff --git a/source/blender/geometry/intern/point_merge_by_distance.cc b/source/blender/geometry/intern/point_merge_by_distance.cc index 955ce52e120..85fa4b6c5de 100644 --- a/source/blender/geometry/intern/point_merge_by_distance.cc +++ b/source/blender/geometry/intern/point_merge_by_distance.cc @@ -10,6 +10,7 @@ #include "DNA_pointcloud_types.h" #include "BKE_attribute_math.hh" +#include "BKE_geometry_set.hh" #include "BKE_pointcloud.hh" #include "GEO_point_merge_by_distance.hh" diff --git a/source/blender/geometry/intern/points_to_volume.cc b/source/blender/geometry/intern/points_to_volume.cc index ee13375c004..9a62d91904a 100644 --- a/source/blender/geometry/intern/points_to_volume.cc +++ b/source/blender/geometry/intern/points_to_volume.cc @@ -5,7 +5,6 @@ #include "BLI_math_matrix.hh" #include "BKE_volume.hh" -#include "BKE_volume_grid.hh" #include "BKE_volume_openvdb.hh" #include "GEO_points_to_volume.hh" @@ -18,47 +17,31 @@ namespace blender::geometry { /* Implements the interface required by #openvdb::tools::ParticlesToLevelSet. */ -class OpenVDBParticleList { - public: +struct OpenVDBParticleList { using PosType = openvdb::Vec3R; - private: - Span positions_; - Span radii_; - float voxel_size_inv_; - - public: - OpenVDBParticleList(const Span positions, - const Span radii, - const float voxel_size) - : positions_(positions), radii_(radii), voxel_size_inv_(math::rcp(voxel_size)) - { - BLI_assert(voxel_size > 0.0f); - } + Span positions; + Span radii; size_t size() const { - return size_t(positions_.size()); + return size_t(positions.size()); } void getPos(size_t n, openvdb::Vec3R &xyz) const { - float3 pos = positions_[n] * voxel_size_inv_; - /* Better align generated grid with source points. */ - pos -= float3(0.5f); - xyz = &pos.x; + xyz = &positions[n].x; } void getPosRad(size_t n, openvdb::Vec3R &xyz, openvdb::Real &radius) const { - this->getPos(n, xyz); - radius = radii_[n] * voxel_size_inv_; + xyz = &positions[n].x; + radius = radii[n]; } }; -static openvdb::FloatGrid::Ptr points_to_sdf_grid_impl(const Span positions, - const Span radii, - const float voxel_size) +static openvdb::FloatGrid::Ptr points_to_sdf_grid(const Span positions, + const Span radii) { /* Create a new grid that will be filled. #ParticlesToLevelSet requires * the background value to be positive */ @@ -69,23 +52,13 @@ static openvdb::FloatGrid::Ptr points_to_sdf_grid_impl(const Span positi /* Don't ignore particles based on their radius. */ op.setRmin(0.0f); op.setRmax(std::numeric_limits::max()); - OpenVDBParticleList particles{positions, radii, voxel_size}; + OpenVDBParticleList particles{positions, radii}; op.rasterizeSpheres(particles); op.finalize(); - new_grid->transform().postScale(voxel_size); - new_grid->setGridClass(openvdb::GRID_LEVEL_SET); - return new_grid; } -bke::VolumeGrid points_to_sdf_grid(const Span positions, - const Span radii, - const float voxel_size) -{ - return bke::VolumeGrid(points_to_sdf_grid_impl(positions, radii, voxel_size)); -} - bke::VolumeGridData *fog_volume_grid_add_from_points(Volume *volume, const StringRefNull name, const Span positions, @@ -93,7 +66,8 @@ bke::VolumeGridData *fog_volume_grid_add_from_points(Volume *volume, const float voxel_size, const float density) { - openvdb::FloatGrid::Ptr new_grid = points_to_sdf_grid_impl(positions, radii, voxel_size); + openvdb::FloatGrid::Ptr new_grid = points_to_sdf_grid(positions, radii); + new_grid->transform().postScale(voxel_size); new_grid->setGridClass(openvdb::GRID_FOG_VOLUME); /* Convert the level set to a fog volume. This also sets the background value to zero. Inside the @@ -109,5 +83,17 @@ bke::VolumeGridData *fog_volume_grid_add_from_points(Volume *volume, return BKE_volume_grid_add_vdb(*volume, name, std::move(new_grid)); } +bke::VolumeGridData *sdf_volume_grid_add_from_points(Volume *volume, + const StringRefNull name, + const Span positions, + const Span radii, + const float voxel_size) +{ + openvdb::FloatGrid::Ptr new_grid = points_to_sdf_grid(positions, radii); + new_grid->transform().postScale(voxel_size); + new_grid->setGridClass(openvdb::GRID_LEVEL_SET); + + return BKE_volume_grid_add_vdb(*volume, name, std::move(new_grid)); +} } // namespace blender::geometry #endif diff --git a/source/blender/geometry/intern/randomize.cc b/source/blender/geometry/intern/randomize.cc index 54ebbffe42b..77a516b806c 100644 --- a/source/blender/geometry/intern/randomize.cc +++ b/source/blender/geometry/intern/randomize.cc @@ -17,8 +17,9 @@ #include "BKE_curves.hh" #include "BKE_customdata.hh" #include "BKE_geometry_set.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_instances.hh" +#include "BKE_mesh.hh" #include "BLI_array.hh" @@ -233,10 +234,27 @@ void debug_randomize_instance_order(bke::Instances *instances) if (instances == nullptr || !use_debug_randomization()) { return; } + const int instances_num = instances->instances_num(); const int seed = seed_from_instances(*instances); const Array new_by_old_map = get_permutation(instances_num, seed); + reorder_customdata(instances->custom_data_attributes(), new_by_old_map); + + const Span old_reference_handles = instances->reference_handles(); + const Span old_transforms = instances->transforms(); + + Vector new_reference_handles(instances_num); + Vector new_transforms(instances_num); + + for (const int old_i : new_by_old_map.index_range()) { + const int new_i = new_by_old_map[old_i]; + new_reference_handles[new_i] = old_reference_handles[old_i]; + new_transforms[new_i] = old_transforms[old_i]; + } + + instances->reference_handles_for_write().copy_from(new_reference_handles); + instances->transforms().copy_from(new_transforms); } bool use_debug_randomization() diff --git a/source/blender/geometry/intern/realize_instances.cc b/source/blender/geometry/intern/realize_instances.cc index ca060082ef9..5b1fda25c57 100644 --- a/source/blender/geometry/intern/realize_instances.cc +++ b/source/blender/geometry/intern/realize_instances.cc @@ -15,7 +15,7 @@ #include "BLI_noise.hh" #include "BLI_task.hh" -#include "BKE_collection.hh" +#include "BKE_collection.h" #include "BKE_curves.hh" #include "BKE_customdata.hh" #include "BKE_geometry_set_instances.hh" @@ -470,7 +470,8 @@ static void foreach_geometry_in_reference( int index = 0; FOREACH_COLLECTION_OBJECT_RECURSIVE_BEGIN (&collection, object) { const bke::GeometrySet object_geometry = bke::object_get_evaluated_geometry_set(*object); - const float4x4 matrix = base_transform * offset_matrix * object->object_to_world(); + const float4x4 matrix = base_transform * offset_matrix * + float4x4_view(object->object_to_world); const int sub_id = noise::hash(id, index); fn(object_geometry, matrix, sub_id); index++; diff --git a/source/blender/geometry/intern/reorder.cc b/source/blender/geometry/intern/reorder.cc index 8eb23f8275b..1007657e264 100644 --- a/source/blender/geometry/intern/reorder.cc +++ b/source/blender/geometry/intern/reorder.cc @@ -53,9 +53,6 @@ static void reorder_attributes_group_to_group(const bke::AttributeAccessor src_a if (meta_data.domain != domain) { return true; } - if (meta_data.data_type == CD_PROP_STRING) { - return true; - } const GVArray src = *src_attributes.lookup(id, domain); bke::GSpanAttributeWriter dst = dst_attributes.lookup_or_add_for_write_only_span( id, domain, meta_data.data_type); @@ -212,25 +209,27 @@ static void reorder_instaces_exec(const bke::Instances &src_instances, {}, old_by_new_map, dst_instances.attributes_for_write()); + + const Span old_transforms = src_instances.transforms(); + MutableSpan new_transforms = dst_instances.transforms(); + array_utils::gather(old_transforms, old_by_new_map, new_transforms); } static void clean_unused_attributes(const bke::AnonymousAttributePropagationInfo &propagation_info, bke::MutableAttributeAccessor attributes) { Vector unused_ids; - attributes.for_all([&](const bke::AttributeIDRef &id, const bke::AttributeMetaData meta_data) { - if (!id.is_anonymous()) { - return true; - } - if (meta_data.data_type == CD_PROP_STRING) { - return true; - } - if (propagation_info.propagate(id.anonymous_id())) { - return true; - } - unused_ids.append(id.name()); - return true; - }); + attributes.for_all( + [&](const bke::AttributeIDRef &id, const bke::AttributeMetaData /*meta_data*/) { + if (!id.is_anonymous()) { + return true; + } + if (propagation_info.propagate(id.anonymous_id())) { + return true; + } + unused_ids.append(id.name()); + return true; + }); for (const std::string &unused_id : unused_ids) { attributes.remove(unused_id); diff --git a/source/blender/geometry/intern/resample_curves.cc b/source/blender/geometry/intern/resample_curves.cc index 2e92ff32d01..6c530fbab87 100644 --- a/source/blender/geometry/intern/resample_curves.cc +++ b/source/blender/geometry/intern/resample_curves.cc @@ -245,21 +245,37 @@ static void normalize_curve_point_data(const IndexMaskSegment curve_selection, } } -static void resample_to_uniform(const CurvesGeometry &src_curves, - const IndexMask &selection, - const ResampleCurvesOutputAttributeIDs &output_ids, - CurvesGeometry &dst_curves) +static CurvesGeometry resample_to_uniform(const CurvesGeometry &src_curves, + const fn::FieldContext &field_context, + const fn::Field &selection_field, + const fn::Field &count_field, + const ResampleCurvesOutputAttributeIDs &output_ids) { if (src_curves.curves_range().is_empty()) { - return; + return {}; } - const OffsetIndices src_points_by_curve = src_curves.points_by_curve(); const OffsetIndices evaluated_points_by_curve = src_curves.evaluated_points_by_curve(); const VArray curves_cyclic = src_curves.cyclic(); const VArray curve_types = src_curves.curve_types(); const Span evaluated_positions = src_curves.evaluated_positions(); + CurvesGeometry dst_curves = bke::curves::copy_only_curve_domain(src_curves); + MutableSpan dst_offsets = dst_curves.offsets_for_write(); + + fn::FieldEvaluator evaluator{field_context, src_curves.curves_num()}; + evaluator.set_selection(selection_field); + evaluator.add_with_destination(count_field, dst_offsets.drop_back(1)); + evaluator.evaluate(); + const IndexMask selection = evaluator.get_evaluated_selection_as_mask(); + IndexMaskMemory memory; + const IndexMask unselected = selection.complement(src_curves.curves_range(), memory); + + /* Fill the counts for the curves that aren't selected and accumulate the counts into offsets. */ + offset_indices::copy_group_sizes(src_points_by_curve, unselected, dst_offsets); + offset_indices::accumulate_counts_to_offsets(dst_offsets); + dst_curves.resize(dst_offsets.last(), dst_curves.curves_num()); + /* All resampled curves are poly curves. */ dst_curves.fill_curve_types(selection, CURVE_TYPE_POLY); @@ -369,75 +385,11 @@ static void resample_to_uniform(const CurvesGeometry &src_curves, } }); - IndexMaskMemory memory; - const IndexMask unselected = selection.complement(src_curves.curves_range(), memory); copy_or_defaults_for_unselected_curves(src_curves, unselected, attributes, dst_curves); for (bke::GSpanAttributeWriter &attribute : attributes.dst_attributes) { attribute.finish(); } -} - -static CurvesGeometry resample_to_uniform(const CurvesGeometry &src_curves, - const fn::FieldContext &field_context, - const fn::Field &selection_field, - const fn::Field &count_field, - const ResampleCurvesOutputAttributeIDs &output_ids) -{ - if (src_curves.curves_range().is_empty()) { - return {}; - } - const OffsetIndices src_points_by_curve = src_curves.points_by_curve(); - - CurvesGeometry dst_curves = bke::curves::copy_only_curve_domain(src_curves); - MutableSpan dst_offsets = dst_curves.offsets_for_write(); - - fn::FieldEvaluator evaluator{field_context, src_curves.curves_num()}; - evaluator.set_selection(selection_field); - evaluator.add_with_destination(count_field, dst_offsets.drop_back(1)); - evaluator.evaluate(); - const IndexMask selection = evaluator.get_evaluated_selection_as_mask(); - IndexMaskMemory memory; - const IndexMask unselected = selection.complement(src_curves.curves_range(), memory); - - /* Fill the counts for the curves that aren't selected and accumulate the counts into offsets. */ - offset_indices::copy_group_sizes(src_points_by_curve, unselected, dst_offsets); - offset_indices::accumulate_counts_to_offsets(dst_offsets); - dst_curves.resize(dst_offsets.last(), dst_curves.curves_num()); - - resample_to_uniform(src_curves, selection, output_ids, dst_curves); - - return dst_curves; -} - -CurvesGeometry resample_to_count(const CurvesGeometry &src_curves, - const IndexMask &selection, - const VArray &counts, - const ResampleCurvesOutputAttributeIDs &output_ids) -{ - if (src_curves.curves_range().is_empty()) { - return {}; - } - const OffsetIndices src_points_by_curve = src_curves.points_by_curve(); - - CurvesGeometry dst_curves = bke::curves::copy_only_curve_domain(src_curves); - MutableSpan dst_offsets = dst_curves.offsets_for_write(); - - array_utils::copy(counts, selection, dst_offsets); - - IndexMaskMemory memory; - const IndexMask unselected = selection.complement(src_curves.curves_range(), memory); - - /* Fill the counts for the curves that aren't selected and accumulate the counts into offsets. */ - offset_indices::copy_group_sizes(src_points_by_curve, unselected, dst_offsets); - /* We assume the counts are at least 1. */ - BLI_assert(std::all_of(dst_offsets.begin(), - dst_offsets.drop_back(1).end(), - [&](const int count) { return count > 0; })); - offset_indices::accumulate_counts_to_offsets(dst_offsets); - dst_curves.resize(dst_offsets.last(), dst_curves.curves_num()); - - resample_to_uniform(src_curves, selection, output_ids, dst_curves); return dst_curves; } @@ -455,40 +407,6 @@ CurvesGeometry resample_to_count(const CurvesGeometry &src_curves, output_ids); } -CurvesGeometry resample_to_length(const CurvesGeometry &src_curves, - const IndexMask &selection, - const VArray &sample_lengths, - const ResampleCurvesOutputAttributeIDs &output_ids) -{ - if (src_curves.curves_range().is_empty()) { - return {}; - } - const OffsetIndices src_points_by_curve = src_curves.points_by_curve(); - const VArray curves_cyclic = src_curves.cyclic(); - - CurvesGeometry dst_curves = bke::curves::copy_only_curve_domain(src_curves); - MutableSpan dst_offsets = dst_curves.offsets_for_write(); - - src_curves.ensure_evaluated_lengths(); - selection.foreach_index(GrainSize(1024), [&](const int curve_i) { - const float curve_length = src_curves.evaluated_length_total_for_curve(curve_i, - curves_cyclic[curve_i]); - dst_offsets[curve_i] = int(curve_length / sample_lengths[curve_i]) + 1; - }); - - IndexMaskMemory memory; - const IndexMask unselected = selection.complement(src_curves.curves_range(), memory); - - /* Fill the counts for the curves that aren't selected and accumulate the counts into offsets. */ - offset_indices::copy_group_sizes(src_points_by_curve, unselected, dst_offsets); - offset_indices::accumulate_counts_to_offsets(dst_offsets); - dst_curves.resize(dst_offsets.last(), dst_curves.curves_num()); - - resample_to_uniform(src_curves, selection, output_ids, dst_curves); - - return dst_curves; -} - CurvesGeometry resample_to_length(const CurvesGeometry &src_curves, const fn::FieldContext &field_context, const fn::Field &selection_field, @@ -503,7 +421,8 @@ CurvesGeometry resample_to_length(const CurvesGeometry &src_curves, } CurvesGeometry resample_to_evaluated(const CurvesGeometry &src_curves, - const IndexMask &selection, + const fn::FieldContext &field_context, + const fn::Field &selection_field, const ResampleCurvesOutputAttributeIDs &output_ids) { if (src_curves.curves_range().is_empty()) { @@ -513,6 +432,10 @@ CurvesGeometry resample_to_evaluated(const CurvesGeometry &src_curves, const OffsetIndices src_evaluated_points_by_curve = src_curves.evaluated_points_by_curve(); const Span evaluated_positions = src_curves.evaluated_positions(); + fn::FieldEvaluator evaluator{field_context, src_curves.curves_num()}; + evaluator.set_selection(selection_field); + evaluator.evaluate(); + const IndexMask selection = evaluator.get_evaluated_selection_as_mask(); IndexMaskMemory memory; const IndexMask unselected = selection.complement(src_curves.curves_range(), memory); @@ -588,19 +511,4 @@ CurvesGeometry resample_to_evaluated(const CurvesGeometry &src_curves, return dst_curves; } -CurvesGeometry resample_to_evaluated(const CurvesGeometry &src_curves, - const fn::FieldContext &field_context, - const fn::Field &selection_field, - const ResampleCurvesOutputAttributeIDs &output_ids) -{ - if (src_curves.curves_range().is_empty()) { - return {}; - } - fn::FieldEvaluator evaluator{field_context, src_curves.curves_num()}; - evaluator.set_selection(selection_field); - evaluator.evaluate(); - return resample_to_evaluated( - src_curves, evaluator.get_evaluated_selection_as_mask(), output_ids); -} - } // namespace blender::geometry diff --git a/source/blender/geometry/intern/reverse_uv_sampler.cc b/source/blender/geometry/intern/reverse_uv_sampler.cc index efc07b17c06..fe1bb93d77c 100644 --- a/source/blender/geometry/intern/reverse_uv_sampler.cc +++ b/source/blender/geometry/intern/reverse_uv_sampler.cc @@ -3,232 +3,52 @@ * SPDX-License-Identifier: GPL-2.0-or-later */ #include -#include #include "GEO_reverse_uv_sampler.hh" -#include "BLI_bounds.hh" -#include "BLI_enumerable_thread_specific.hh" -#include "BLI_index_mask.hh" -#include "BLI_linear_allocator_chunked_list.hh" #include "BLI_math_geom.h" #include "BLI_math_vector.hh" -#include "BLI_offset_indices.hh" #include "BLI_task.hh" #include "BLI_timeit.hh" namespace blender::geometry { -struct Row { - /** The min and max horizontal cell index that is used in this row. */ - int x_min = 0; - int x_max = 0; - /** Offsets into the array of indices below. Also see #OffsetIndices. */ - Array offsets; - /** A flat array containing the triangle indices contained in each cell. */ - Array tri_indices; -}; - -struct ReverseUVSampler::LookupGrid { - /** Minimum vertical cell index that contains triangles. */ - int y_min = 0; - /** Information about all rows starting at `y_min`. */ - Array rows; -}; - -struct TriWithRange { - int tri_index; - int x_min; - int x_max; -}; - -struct LocalRowData { - linear_allocator::ChunkedList tris; - int x_min = INT32_MAX; - int x_max = INT32_MIN; -}; - -struct LocalData { - LinearAllocator<> allocator; - Map> rows; -}; - -static int2 uv_to_cell(const float2 &uv, const int resolution) +static int2 uv_to_cell_key(const float2 &uv, const int resolution) { return int2{uv * resolution}; } -static Bounds tri_to_cell_bounds(const int3 &tri, - const int resolution, - const Span uv_map) -{ - const float2 &uv_0 = uv_map[tri[0]]; - const float2 &uv_1 = uv_map[tri[1]]; - const float2 &uv_2 = uv_map[tri[2]]; - - const int2 cell_0 = uv_to_cell(uv_0, resolution); - const int2 cell_1 = uv_to_cell(uv_1, resolution); - const int2 cell_2 = uv_to_cell(uv_2, resolution); - - const int2 min_cell = math::min(math::min(cell_0, cell_1), cell_2); - const int2 max_cell = math::max(math::max(cell_0, cell_1), cell_2); - - return {min_cell, max_cell}; -} - -/** - * Add each triangle to the rows that it is in. After this, the information about each row is still - * scattered across multiple thread-specific lists. Those separate lists are then joined in a - * separate step. - */ -static void sort_tris_into_rows(const Span uv_map, - const Span corner_tris, - const int resolution, - threading::EnumerableThreadSpecific &data_per_thread) -{ - threading::parallel_for(corner_tris.index_range(), 256, [&](const IndexRange tris_range) { - LocalData &local_data = data_per_thread.local(); - for (const int tri_i : tris_range) { - const int3 &tri = corner_tris[tri_i]; - - /* Compute the cells that the triangle touches approximately. */ - const Bounds cell_bounds = tri_to_cell_bounds(tri, resolution, uv_map); - const TriWithRange tri_with_range{tri_i, cell_bounds.min.x, cell_bounds.max.x}; - - /* Go over each row that the triangle is in. */ - for (int cell_y = cell_bounds.min.y; cell_y <= cell_bounds.max.y; cell_y++) { - LocalRowData &row = *local_data.rows.lookup_or_add_cb( - cell_y, [&]() { return local_data.allocator.construct(); }); - row.tris.append(local_data.allocator, tri_with_range); - row.x_min = std::min(row.x_min, cell_bounds.min.x); - row.x_max = std::max(row.x_max, cell_bounds.max.x); - } - } - }); -} - -/** - * Consolidates the data that has been gather for each row so that it is each to look up which - * triangles are in each cell. - */ -static void finish_rows(const Span all_ys, - const Span local_data_vec, - const Bounds y_bounds, - ReverseUVSampler::LookupGrid &lookup_grid) -{ - threading::parallel_for(all_ys.index_range(), 8, [&](const IndexRange all_ys_range) { - Vector local_rows; - for (const int y : all_ys.slice(all_ys_range)) { - Row &row = lookup_grid.rows[y - y_bounds.min]; - - local_rows.clear(); - for (const LocalData *local_data : local_data_vec) { - if (const destruct_ptr *local_row = local_data->rows.lookup_ptr(y)) { - local_rows.append(local_row->get()); - } - } - - int x_min = INT32_MAX; - int x_max = INT32_MIN; - for (const LocalRowData *local_row : local_rows) { - x_min = std::min(x_min, local_row->x_min); - x_max = std::max(x_max, local_row->x_max); - } - - const int x_num = x_max - x_min + 1; - row.offsets.reinitialize(x_num + 1); - { - /* Count how many triangles are in each cell in the current row. */ - MutableSpan counts = row.offsets; - counts.fill(0); - for (const LocalRowData *local_row : local_rows) { - for (const TriWithRange &tri_with_range : local_row->tris) { - for (int x = tri_with_range.x_min; x <= tri_with_range.x_max; x++) { - counts[x - x_min]++; - } - } - } - offset_indices::accumulate_counts_to_offsets(counts); - } - const int tri_indices_num = row.offsets.last(); - row.tri_indices.reinitialize(tri_indices_num); - - /* Populate the array containing all triangle indices in all cells in this row. */ - Array current_offsets(x_num, 0); - for (const LocalRowData *local_row : local_rows) { - for (const TriWithRange &tri_with_range : local_row->tris) { - for (int x = tri_with_range.x_min; x <= tri_with_range.x_max; x++) { - const int offset_x = x - x_min; - row.tri_indices[row.offsets[offset_x] + current_offsets[offset_x]] = - tri_with_range.tri_index; - current_offsets[offset_x]++; - } - } - } - - row.x_min = x_min; - row.x_max = x_max; - } - }); -} - ReverseUVSampler::ReverseUVSampler(const Span uv_map, const Span corner_tris) - : uv_map_(uv_map), corner_tris_(corner_tris), lookup_grid_(std::make_unique()) + : uv_map_(uv_map), corner_tris_(corner_tris) { - /* A lower resolution means that there will be fewer cells and more triangles in each cell. Fewer - * cells make construction faster, but more triangles per cell make lookup slower. This value - * needs to be determined experimentally. */ - resolution_ = std::max(3, std::sqrt(corner_tris.size()) * 3); - if (corner_tris.is_empty()) { - return; - } + resolution_ = std::max(3, std::sqrt(corner_tris.size()) * 2); - threading::EnumerableThreadSpecific data_per_thread; - sort_tris_into_rows(uv_map_, corner_tris_, resolution_, data_per_thread); + for (const int tri_i : corner_tris.index_range()) { + const int3 &tri = corner_tris[tri_i]; + const float2 &uv_0 = uv_map_[tri[0]]; + const float2 &uv_1 = uv_map_[tri[1]]; + const float2 &uv_2 = uv_map_[tri[2]]; - VectorSet all_ys; - Vector local_data_vec; - for (const LocalData &local_data : data_per_thread) { - local_data_vec.append(&local_data); - for (const int y : local_data.rows.keys()) { - all_ys.add(y); + const int2 key_0 = uv_to_cell_key(uv_0, resolution_); + const int2 key_1 = uv_to_cell_key(uv_1, resolution_); + const int2 key_2 = uv_to_cell_key(uv_2, resolution_); + + const int2 min_key = math::min(math::min(key_0, key_1), key_2); + const int2 max_key = math::max(math::max(key_0, key_1), key_2); + + for (int key_x = min_key.x; key_x <= max_key.x; key_x++) { + for (int key_y = min_key.y; key_y <= max_key.y; key_y++) { + const int2 key{key_x, key_y}; + corner_tris_by_cell_.add(key, tri_i); + } } } - - const Bounds y_bounds = *bounds::min_max(all_ys.as_span()); - lookup_grid_->y_min = y_bounds.min; - - const int rows_num = y_bounds.max - y_bounds.min + 1; - lookup_grid_->rows.reinitialize(rows_num); - - finish_rows(all_ys, local_data_vec, y_bounds, *lookup_grid_); -} - -static Span lookup_tris_in_cell(const int2 cell, - const ReverseUVSampler::LookupGrid &lookup_grid) -{ - if (cell.y < lookup_grid.y_min) { - return {}; - } - if (cell.y >= lookup_grid.y_min + lookup_grid.rows.size()) { - return {}; - } - const Row &row = lookup_grid.rows[cell.y - lookup_grid.y_min]; - if (cell.x < row.x_min) { - return {}; - } - if (cell.x > row.x_max) { - return {}; - } - const int offset = row.offsets[cell.x - row.x_min]; - const int tris_num = row.offsets[cell.x - row.x_min + 1] - offset; - return row.tri_indices.as_span().slice(offset, tris_num); } ReverseUVSampler::Result ReverseUVSampler::sample(const float2 &query_uv) const { - const int2 cell = uv_to_cell(query_uv, resolution_); - const Span tri_indices = lookup_tris_in_cell(cell, *lookup_grid_); + const int2 cell_key = uv_to_cell_key(query_uv, resolution_); + const Span tri_indices = corner_tris_by_cell_.lookup(cell_key); float best_dist = FLT_MAX; float3 best_bary_weights; @@ -281,8 +101,6 @@ ReverseUVSampler::Result ReverseUVSampler::sample(const float2 &query_uv) const return Result{}; } -ReverseUVSampler::~ReverseUVSampler() = default; - void ReverseUVSampler::sample_many(const Span query_uvs, MutableSpan r_results) const { diff --git a/source/blender/geometry/intern/set_curve_type.cc b/source/blender/geometry/intern/set_curve_type.cc index 0ff551af276..499e66be2a8 100644 --- a/source/blender/geometry/intern/set_curve_type.cc +++ b/source/blender/geometry/intern/set_curve_type.cc @@ -28,6 +28,21 @@ static bool is_nurbs_to_bezier_one_to_one(const KnotsMode knots_mode) return false; } +/** + * As an optimization, just change the types on a mutable curves data-block when the conversion is + * simple. This could be expanded to more cases where the number of points doesn't change in the + * future, though that might require properly initializing some attributes, or removing others. + */ +static bool conversion_can_change_point_num(const CurveType dst_type) +{ + if (ELEM(dst_type, CURVE_TYPE_CATMULL_ROM, CURVE_TYPE_POLY)) { + /* The conversion to Catmull Rom or Poly should never change the number of points, no matter + * the source type (Bezier to Catmull Rom conversion cannot maintain the same shape anyway). */ + return false; + } + return true; +} + template static void scale_input_assign(const Span src, const int scale, @@ -647,4 +662,17 @@ bke::CurvesGeometry convert_curves(const bke::CurvesGeometry &src_curves, return {}; } +bool try_curves_conversion_in_place(const IndexMask &selection, + const CurveType dst_type, + FunctionRef get_writable_curves_fn) +{ + if (conversion_can_change_point_num(dst_type)) { + return false; + } + bke::CurvesGeometry &curves = get_writable_curves_fn(); + curves.fill_curve_types(selection, dst_type); + curves.remove_attributes_based_on_types(); + return true; +} + } // namespace blender::geometry diff --git a/source/blender/geometry/intern/subdivide_curves.cc b/source/blender/geometry/intern/subdivide_curves.cc index a4fb2c85db4..4d7854a94f6 100644 --- a/source/blender/geometry/intern/subdivide_curves.cc +++ b/source/blender/geometry/intern/subdivide_curves.cc @@ -5,6 +5,7 @@ #include "BKE_attribute_math.hh" #include "BKE_curves.hh" #include "BKE_curves_utils.hh" +#include "BKE_geometry_set.hh" #include "BLI_task.hh" diff --git a/source/blender/geometry/intern/transform.cc b/source/blender/geometry/intern/transform.cc index d30b811d0ec..6eab95c7f05 100644 --- a/source/blender/geometry/intern/transform.cc +++ b/source/blender/geometry/intern/transform.cc @@ -10,12 +10,14 @@ #include "BLI_math_base.h" #include "BLI_math_matrix.h" +#include "BLI_math_rotation.hh" #include "BLI_math_vector.hh" #include "BLI_task.hh" #include "DNA_grease_pencil_types.h" #include "DNA_mesh_types.h" #include "DNA_pointcloud_types.h" +#include "DNA_volume_types.h" #include "BKE_attribute.hh" #include "BKE_curves.hh" @@ -111,7 +113,7 @@ static void transform_greasepencil(GreasePencil &grease_pencil, const float4x4 & static void translate_instances(bke::Instances &instances, const float3 translation) { - MutableSpan transforms = instances.transforms_for_write(); + MutableSpan transforms = instances.transforms(); threading::parallel_for(transforms.index_range(), 1024, [&](const IndexRange range) { for (float4x4 &instance_transform : transforms.slice(range)) { add_v3_v3(instance_transform.ptr()[3], translation); @@ -121,7 +123,7 @@ static void translate_instances(bke::Instances &instances, const float3 translat static void transform_instances(bke::Instances &instances, const float4x4 &transform) { - MutableSpan transforms = instances.transforms_for_write(); + MutableSpan transforms = instances.transforms(); threading::parallel_for(transforms.index_range(), 1024, [&](const IndexRange range) { for (float4x4 &instance_transform : transforms.slice(range)) { instance_transform = transform * instance_transform; diff --git a/source/blender/geometry/intern/trim_curves.cc b/source/blender/geometry/intern/trim_curves.cc index 38f4358c647..5a08fcb472a 100644 --- a/source/blender/geometry/intern/trim_curves.cc +++ b/source/blender/geometry/intern/trim_curves.cc @@ -13,6 +13,7 @@ #include "BKE_attribute_math.hh" #include "BKE_curves.hh" #include "BKE_curves_utils.hh" +#include "BKE_geometry_set.hh" #include "GEO_trim_curves.hh" @@ -32,7 +33,7 @@ namespace blender::geometry { * \param cyclic: If curve is cyclic. * \param resolution: Curve resolution (number of evaluated points per segment). * \param num_curve_points: Total number of control points in the curve. - * \return Point on the piecewise segment matching the given distance. + * \return: Point on the piecewise segment matching the given distance. */ static bke::curves::CurvePoint lookup_point_uniform_spacing(const Span lengths, const float sample_length, diff --git a/source/blender/geometry/intern/uv_pack.cc b/source/blender/geometry/intern/uv_pack.cc index 15d3198840a..90db9cccec4 100644 --- a/source/blender/geometry/intern/uv_pack.cc +++ b/source/blender/geometry/intern/uv_pack.cc @@ -8,7 +8,7 @@ #include "GEO_uv_pack.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BLI_array.hh" #include "BLI_bounds.hh" @@ -1998,7 +1998,7 @@ static float pack_islands_scale_margin(const Span islands, * Find the optimal scale to pack islands into the unit square. * returns largest scale that will pack `islands` into the unit square. */ -static float pack_islands_margin_fraction(const Span islands, +static float pack_islands_margin_fraction(const Span &islands, const float margin_fraction, const bool rescale_margin, const UVPackIsland_Params ¶ms) @@ -2112,7 +2112,7 @@ static float pack_islands_margin_fraction(const Span islands, return scale_low; } -static float calc_margin_from_aabb_length_sum(const Span island_vector, +static float calc_margin_from_aabb_length_sum(const Span &island_vector, const UVPackIsland_Params ¶ms) { /* Logic matches previous behavior from #geometry::uv_parametrizer_pack. @@ -2201,7 +2201,7 @@ class OverlapMerger { return result; } - static float pack_islands_overlap(const Span islands, + static float pack_islands_overlap(const Span &islands, const UVPackIsland_Params ¶ms) { @@ -2261,7 +2261,7 @@ class OverlapMerger { } }; -static void finalize_geometry(const Span islands, const UVPackIsland_Params ¶ms) +static void finalize_geometry(const Span &islands, const UVPackIsland_Params ¶ms) { MemArena *arena = BLI_memarena_new(BLI_MEMARENA_STD_BUFSIZE, __func__); Heap *heap = BLI_heap_new(); diff --git a/source/blender/gpencil_modifiers_legacy/MOD_gpencil_legacy_lineart.h b/source/blender/gpencil_modifiers_legacy/MOD_gpencil_legacy_lineart.h index 160ac5a33c4..ba54f78d916 100644 --- a/source/blender/gpencil_modifiers_legacy/MOD_gpencil_legacy_lineart.h +++ b/source/blender/gpencil_modifiers_legacy/MOD_gpencil_legacy_lineart.h @@ -25,7 +25,6 @@ void WM_operatortypes_lineart(void); struct LineartCache; -LineartCache *MOD_lineart_init_cache(); void MOD_lineart_clear_cache(struct LineartCache **lc); #ifdef __cplusplus diff --git a/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_armature.cc b/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_armature.cc index bbff7261ae7..02da264654d 100644 --- a/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_armature.cc +++ b/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_armature.cc @@ -8,24 +8,30 @@ #include +#include "BLI_listbase.h" #include "BLI_math_vector.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_defaults.h" #include "DNA_gpencil_legacy_types.h" #include "DNA_gpencil_modifier_types.h" #include "DNA_modifier_types.h" #include "DNA_object_types.h" +#include "DNA_scene_types.h" #include "DNA_screen_types.h" #include "BKE_armature.hh" +#include "BKE_context.hh" #include "BKE_gpencil_geom_legacy.h" #include "BKE_gpencil_legacy.h" #include "BKE_gpencil_modifier_legacy.h" #include "BKE_lib_query.hh" +#include "BKE_main.hh" #include "BKE_modifier.hh" +#include "BKE_scene.h" +#include "BKE_screen.hh" #include "MEM_guardedalloc.h" @@ -34,10 +40,13 @@ #include "RNA_access.hh" +#include "MOD_gpencil_legacy_modifiertypes.h" #include "MOD_gpencil_legacy_ui_common.h" #include "MOD_gpencil_legacy_util.h" +#include "DEG_depsgraph.hh" #include "DEG_depsgraph_build.hh" +#include "DEG_depsgraph_query.hh" static void init_data(GpencilModifierData *md) { diff --git a/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_array.cc b/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_array.cc index 06937979d59..d8429e6aa6a 100644 --- a/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_array.cc +++ b/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_array.cc @@ -18,7 +18,7 @@ #include "BLI_rand.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_defaults.h" #include "DNA_gpencil_legacy_types.h" @@ -27,11 +27,15 @@ #include "DNA_scene_types.h" #include "DNA_screen_types.h" +#include "BKE_context.hh" #include "BKE_gpencil_geom_legacy.h" #include "BKE_gpencil_legacy.h" #include "BKE_gpencil_modifier_legacy.h" #include "BKE_lib_query.hh" +#include "BKE_main.hh" #include "BKE_modifier.hh" +#include "BKE_object.hh" +#include "BKE_screen.hh" #include "UI_interface.hh" #include "UI_resources.hh" @@ -42,6 +46,7 @@ #include "DEG_depsgraph_build.hh" #include "DEG_depsgraph_query.hh" +#include "MOD_gpencil_legacy_modifiertypes.h" #include "MOD_gpencil_legacy_ui_common.h" #include "MOD_gpencil_legacy_util.h" @@ -102,9 +107,9 @@ static void BKE_gpencil_instance_modifier_instance_tfm(Object *ob, if (mmd->flag & GP_ARRAY_USE_OFFSET) { add_v3_v3(mat_offset[3], mmd->offset); } - invert_m4_m4(obinv, ob->object_to_world().ptr()); + invert_m4_m4(obinv, ob->object_to_world); - mul_m4_series(r_offset, mat_offset, obinv, mmd->object->object_to_world().ptr()); + mul_m4_series(r_offset, mat_offset, obinv, mmd->object->object_to_world); copy_m4_m4(mat_offset, r_offset); /* clear r_mat locations to avoid double transform */ diff --git a/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_build.cc b/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_build.cc index 797059210e4..4a09bf67fce 100644 --- a/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_build.cc +++ b/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_build.cc @@ -17,9 +17,10 @@ #include "BLI_math_base.h" #include "BLI_math_matrix.h" #include "BLI_math_vector.h" +#include "BLI_sort.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_defaults.h" #include "DNA_gpencil_legacy_types.h" @@ -29,12 +30,14 @@ #include "DNA_scene_types.h" #include "DNA_screen_types.h" +#include "BKE_context.hh" #include "BKE_deform.hh" #include "BKE_gpencil_geom_legacy.h" #include "BKE_gpencil_legacy.h" #include "BKE_gpencil_modifier_legacy.h" #include "BKE_lib_query.hh" #include "BKE_modifier.hh" +#include "BKE_screen.hh" #include "UI_interface.hh" #include "UI_resources.hh" @@ -44,6 +47,7 @@ #include "DEG_depsgraph.hh" #include "DEG_depsgraph_query.hh" +#include "MOD_gpencil_legacy_modifiertypes.h" #include "MOD_gpencil_legacy_ui_common.h" /* Two hard-coded values for GP_BUILD_MODE_ADDITIVE with GP_BUILD_TIMEMODE_DRAWSPEED. */ @@ -318,8 +322,8 @@ static void build_sequential(Object *ob, /* Compute distance to control object if set, and build according to that order. */ if (mmd->object) { float sv1[3], sv2[3]; - mul_v3_m4v3(sv1, ob->object_to_world().ptr(), &gps->points[0].x); - mul_v3_m4v3(sv2, ob->object_to_world().ptr(), &gps->points[gps->totpoints - 1].x); + mul_v3_m4v3(sv1, ob->object_to_world, &gps->points[0].x); + mul_v3_m4v3(sv2, ob->object_to_world, &gps->points[gps->totpoints - 1].x); float dist_l = len_v3v3(sv1, mmd->object->loc); float dist_r = len_v3v3(sv2, mmd->object->loc); if (dist_r < dist_l) { diff --git a/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_color.cc b/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_color.cc index d7ebeadd35e..627f5cb452b 100644 --- a/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_color.cc +++ b/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_color.cc @@ -13,24 +13,31 @@ #include "BLI_math_color.h" #include "BLI_math_vector.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_defaults.h" #include "DNA_gpencil_legacy_types.h" #include "DNA_gpencil_modifier_types.h" #include "DNA_material_types.h" +#include "DNA_object_types.h" #include "DNA_screen_types.h" #include "BKE_colortools.hh" +#include "BKE_context.hh" #include "BKE_gpencil_modifier_legacy.h" #include "BKE_lib_query.hh" +#include "BKE_main.hh" #include "BKE_material.h" +#include "BKE_screen.hh" #include "UI_interface.hh" #include "UI_resources.hh" #include "BKE_modifier.hh" +#include "DEG_depsgraph.hh" + +#include "MOD_gpencil_legacy_modifiertypes.h" #include "MOD_gpencil_legacy_ui_common.h" #include "MOD_gpencil_legacy_util.h" diff --git a/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_dash.cc b/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_dash.cc index 9fa593cfa19..ba838550d5f 100644 --- a/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_dash.cc +++ b/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_dash.cc @@ -20,12 +20,14 @@ #include "DNA_gpencil_modifier_types.h" #include "DNA_meshdata_types.h" #include "DNA_object_types.h" +#include "DNA_scene_types.h" #include "DNA_screen_types.h" #include "BKE_gpencil_geom_legacy.h" #include "BKE_gpencil_legacy.h" #include "BKE_gpencil_modifier_legacy.h" #include "BKE_lib_query.hh" +#include "BKE_main.hh" #include "BKE_modifier.hh" #include "BKE_screen.hh" @@ -37,8 +39,9 @@ #include "RNA_access.hh" #include "RNA_prototypes.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" +#include "MOD_gpencil_legacy_modifiertypes.h" #include "MOD_gpencil_legacy_ui_common.h" #include "MOD_gpencil_legacy_util.h" diff --git a/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_envelope.cc b/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_envelope.cc index 768231a6154..4dd62f7a50e 100644 --- a/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_envelope.cc +++ b/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_envelope.cc @@ -13,21 +13,24 @@ #include "BLI_math_vector.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_defaults.h" #include "DNA_gpencil_legacy_types.h" #include "DNA_gpencil_modifier_types.h" #include "DNA_meshdata_types.h" #include "DNA_object_types.h" +#include "DNA_scene_types.h" #include "DNA_screen_types.h" +#include "BKE_context.hh" #include "BKE_deform.hh" #include "BKE_gpencil_geom_legacy.h" #include "BKE_gpencil_legacy.h" #include "BKE_gpencil_modifier_legacy.h" #include "BKE_lib_query.hh" #include "BKE_modifier.hh" +#include "BKE_screen.hh" #include "DEG_depsgraph.hh" #include "DEG_depsgraph_build.hh" @@ -38,6 +41,7 @@ #include "RNA_access.hh" +#include "MOD_gpencil_legacy_modifiertypes.h" #include "MOD_gpencil_legacy_ui_common.h" #include "MOD_gpencil_legacy_util.h" diff --git a/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_hook.cc b/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_hook.cc index 582c9cd6b72..42527f0dd08 100644 --- a/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_hook.cc +++ b/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_hook.cc @@ -9,12 +9,13 @@ #include #include +#include "BLI_listbase.h" #include "BLI_math_base.h" #include "BLI_math_matrix.h" #include "BLI_math_vector.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_defaults.h" #include "DNA_gpencil_legacy_types.h" @@ -22,26 +23,33 @@ #include "DNA_meshdata_types.h" #include "DNA_modifier_types.h" #include "DNA_object_types.h" +#include "DNA_scene_types.h" #include "DNA_screen_types.h" #include "BKE_action.h" #include "BKE_colortools.hh" +#include "BKE_context.hh" #include "BKE_deform.hh" #include "BKE_gpencil_geom_legacy.h" #include "BKE_gpencil_modifier_legacy.h" #include "BKE_lib_query.hh" +#include "BKE_main.hh" #include "BKE_modifier.hh" -#include "BKE_object_types.hh" +#include "BKE_scene.h" +#include "BKE_screen.hh" #include "UI_interface.hh" #include "UI_resources.hh" #include "RNA_access.hh" +#include "MOD_gpencil_legacy_modifiertypes.h" #include "MOD_gpencil_legacy_ui_common.h" #include "MOD_gpencil_legacy_util.h" +#include "DEG_depsgraph.hh" #include "DEG_depsgraph_build.hh" +#include "DEG_depsgraph_query.hh" /* temp struct to hold data */ struct GPHookData_cb { @@ -228,14 +236,14 @@ static void deform_stroke(GpencilModifierData *md, /* get world-space matrix of target, corrected for the space the verts are in */ if (mmd->subtarget[0] && pchan) { /* bone target if there's a matching pose-channel */ - mul_m4_m4m4(dmat, mmd->object->object_to_world().ptr(), pchan->pose_mat); + mul_m4_m4m4(dmat, mmd->object->object_to_world, pchan->pose_mat); } else { /* just object target */ - copy_m4_m4(dmat, mmd->object->object_to_world().ptr()); + copy_m4_m4(dmat, mmd->object->object_to_world); } - invert_m4_m4(ob->runtime->world_to_object.ptr(), ob->object_to_world().ptr()); - mul_m4_series(tData.mat, ob->world_to_object().ptr(), dmat, mmd->parentinv); + invert_m4_m4(ob->world_to_object, ob->object_to_world); + mul_m4_series(tData.mat, ob->world_to_object, dmat, mmd->parentinv); /* loop points and apply deform */ for (int i = 0; i < gps->totpoints; i++) { diff --git a/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_lattice.cc b/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_lattice.cc index 22ace359dd6..b32410ce77b 100644 --- a/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_lattice.cc +++ b/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_lattice.cc @@ -12,7 +12,7 @@ #include "BLI_listbase.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_defaults.h" #include "DNA_gpencil_legacy_types.h" @@ -22,19 +22,23 @@ #include "DNA_scene_types.h" #include "DNA_screen_types.h" +#include "BKE_context.hh" #include "BKE_deform.hh" #include "BKE_gpencil_geom_legacy.h" #include "BKE_gpencil_modifier_legacy.h" #include "BKE_lattice.hh" #include "BKE_lib_query.hh" +#include "BKE_main.hh" #include "BKE_modifier.hh" -#include "BKE_scene.hh" +#include "BKE_scene.h" +#include "BKE_screen.hh" #include "UI_interface.hh" #include "UI_resources.hh" #include "RNA_access.hh" +#include "MOD_gpencil_legacy_modifiertypes.h" #include "MOD_gpencil_legacy_ui_common.h" #include "MOD_gpencil_legacy_util.h" diff --git a/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_length.cc b/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_length.cc index fa4dd23e062..228a6eb2b27 100644 --- a/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_length.cc +++ b/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_length.cc @@ -15,18 +15,22 @@ #include "BLI_rand.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_defaults.h" #include "DNA_gpencil_legacy_types.h" #include "DNA_gpencil_modifier_types.h" #include "DNA_object_types.h" +#include "DNA_scene_types.h" #include "DNA_screen_types.h" +#include "BKE_context.hh" #include "BKE_gpencil_geom_legacy.h" #include "BKE_gpencil_modifier_legacy.h" #include "BKE_lib_query.hh" +#include "BKE_main.hh" #include "BKE_modifier.hh" +#include "BKE_screen.hh" #include "MEM_guardedalloc.h" @@ -35,6 +39,7 @@ #include "RNA_access.hh" +#include "MOD_gpencil_legacy_modifiertypes.h" #include "MOD_gpencil_legacy_ui_common.h" #include "MOD_gpencil_legacy_util.h" diff --git a/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_lineart.cc b/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_lineart.cc index 7a07518547e..9b2afd8b0d0 100644 --- a/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_lineart.cc +++ b/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_lineart.cc @@ -11,21 +11,25 @@ #include "BLI_math_vector.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_collection_types.h" #include "DNA_defaults.h" #include "DNA_gpencil_legacy_types.h" #include "DNA_gpencil_modifier_types.h" +#include "DNA_material_types.h" #include "DNA_object_types.h" #include "DNA_scene_types.h" #include "DNA_screen_types.h" -#include "BKE_collection.hh" -#include "BKE_global.hh" +#include "BKE_collection.h" +#include "BKE_context.hh" +#include "BKE_global.h" #include "BKE_gpencil_legacy.h" #include "BKE_gpencil_modifier_legacy.h" #include "BKE_lib_query.hh" +#include "BKE_main.hh" +#include "BKE_screen.hh" #include "UI_interface.hh" #include "UI_resources.hh" @@ -37,6 +41,7 @@ #include "DEG_depsgraph_query.hh" #include "MOD_gpencil_legacy_lineart.h" +#include "MOD_gpencil_legacy_modifiertypes.h" #include "MOD_gpencil_legacy_ui_common.h" #include "lineart/MOD_lineart.h" @@ -70,8 +75,8 @@ static void generate_strokes_actual( gpl, gpf, lmd->source_type, - lmd->source_type == LINEART_SOURCE_OBJECT ? (void *)lmd->source_object : - (void *)lmd->source_collection, + lmd->source_type == LRT_SOURCE_OBJECT ? (void *)lmd->source_object : + (void *)lmd->source_collection, lmd->level_start, lmd->use_multiple_levels ? lmd->level_end : lmd->level_start, lmd->target_material ? BKE_gpencil_object_material_index_get(ob, lmd->target_material) : 0, @@ -97,16 +102,16 @@ static bool isModifierDisabled(GpencilModifierData *md) return true; } - if (lmd->source_type == LINEART_SOURCE_OBJECT && !lmd->source_object) { + if (lmd->source_type == LRT_SOURCE_OBJECT && !lmd->source_object) { return true; } - if (lmd->source_type == LINEART_SOURCE_COLLECTION && !lmd->source_collection) { + if (lmd->source_type == LRT_SOURCE_COLLECTION && !lmd->source_collection) { return true; } /* Preventing calculation in depsgraph when baking frames. */ - if (lmd->flags & MOD_LINEART_IS_BAKED) { + if (lmd->flags & LRT_GPENCIL_IS_BAKED) { return true; } @@ -143,7 +148,7 @@ static void generate_strokes(GpencilModifierData *md, Depsgraph *depsgraph, Obje MOD_lineart_destroy_render_data(lmd); } else { - if (!(lmd->flags & MOD_LINEART_USE_CACHE)) { + if (!(lmd->flags & LRT_GPENCIL_USE_CACHE)) { MOD_lineart_compute_feature_lines(depsgraph, lmd, &local_lc, !(ob->dtx & OB_DRAW_IN_FRONT)); MOD_lineart_destroy_render_data(lmd); } @@ -153,7 +158,7 @@ static void generate_strokes(GpencilModifierData *md, Depsgraph *depsgraph, Obje generate_strokes_actual(md, depsgraph, ob, gpl, gpf); - if (!(lmd->flags & MOD_LINEART_USE_CACHE)) { + if (!(lmd->flags & LRT_GPENCIL_USE_CACHE)) { /* Clear local cache. */ if (local_lc != gpd->runtime.lineart_cache) { MOD_lineart_clear_cache(&local_lc); @@ -246,7 +251,7 @@ static void update_depsgraph(GpencilModifierData *md, * visibility computation. Line art exclusion is handled inside #add_this_collection. */ add_this_collection(ctx->scene->master_collection, ctx, mode); - if (lmd->calculation_flags & MOD_LINEART_USE_CUSTOM_CAMERA && lmd->source_camera) { + if (lmd->calculation_flags & LRT_USE_CUSTOM_CAMERA && lmd->source_camera) { DEG_add_object_relation( ctx->node, lmd->source_camera, DEG_OB_COMP_TRANSFORM, "Line Art Modifier"); DEG_add_object_relation( @@ -299,10 +304,10 @@ static void panel_draw(const bContext * /*C*/, Panel *panel) uiItemR(layout, ptr, "source_type", UI_ITEM_NONE, nullptr, ICON_NONE); - if (source_type == LINEART_SOURCE_OBJECT) { + if (source_type == LRT_SOURCE_OBJECT) { uiItemR(layout, ptr, "source_object", UI_ITEM_NONE, nullptr, ICON_OBJECT_DATA); } - else if (source_type == LINEART_SOURCE_COLLECTION) { + else if (source_type == LRT_SOURCE_COLLECTION) { uiLayout *sub = uiLayoutRow(layout, true); uiItemR(sub, ptr, "source_collection", UI_ITEM_NONE, nullptr, ICON_OUTLINER_COLLECTION); uiItemR(sub, ptr, "use_invert_collection", UI_ITEM_NONE, "", ICON_ARROW_LEFTRIGHT); @@ -369,7 +374,7 @@ static void edge_types_panel_draw(const bContext * /*C*/, Panel *panel) uiItemR(entry, ptr, "silhouette_filtering", UI_ITEM_NONE, "", ICON_NONE); const int silhouette_filtering = RNA_enum_get(ptr, "silhouette_filtering"); - if (silhouette_filtering != LINEART_SILHOUETTE_FILTER_NONE) { + if (silhouette_filtering != LRT_SILHOUETTE_FILTER_NONE) { uiItemR(entry, ptr, "use_invert_silhouette", UI_ITEM_NONE, "", ICON_ARROW_LEFTRIGHT); } diff --git a/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_mirror.cc b/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_mirror.cc index bd4ce1bb6e1..c098563acb6 100644 --- a/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_mirror.cc +++ b/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_mirror.cc @@ -14,7 +14,7 @@ #include "BLI_math_matrix.h" #include "BLI_math_vector.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_defaults.h" #include "DNA_gpencil_legacy_types.h" @@ -23,16 +23,20 @@ #include "DNA_scene_types.h" #include "DNA_screen_types.h" +#include "BKE_context.hh" #include "BKE_gpencil_geom_legacy.h" #include "BKE_gpencil_legacy.h" #include "BKE_gpencil_modifier_legacy.h" #include "BKE_lib_query.hh" +#include "BKE_main.hh" #include "BKE_modifier.hh" -#include "BKE_scene.hh" +#include "BKE_scene.h" +#include "BKE_screen.hh" #include "UI_interface.hh" #include "UI_resources.hh" +#include "MOD_gpencil_legacy_modifiertypes.h" #include "MOD_gpencil_legacy_ui_common.h" #include "MOD_gpencil_legacy_util.h" @@ -79,8 +83,8 @@ static void update_mirror_object(Object *ob, float tmp[4][4]; float itmp[4][4]; - invert_m4_m4(tmp, mmd->object->object_to_world().ptr()); - mul_m4_m4m4(tmp, tmp, ob->object_to_world().ptr()); + invert_m4_m4(tmp, mmd->object->object_to_world); + mul_m4_m4m4(tmp, tmp, ob->object_to_world); invert_m4_m4(itmp, tmp); mul_m4_series(mtx, itmp, mtx, tmp); diff --git a/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_multiply.cc b/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_multiply.cc index d254a430922..68dce29d405 100644 --- a/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_multiply.cc +++ b/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_multiply.cc @@ -14,6 +14,7 @@ #include "DNA_gpencil_legacy_types.h" #include "DNA_gpencil_modifier_types.h" #include "DNA_object_types.h" +#include "DNA_scene_types.h" #include "DNA_screen_types.h" #include "BLI_listbase.h" @@ -21,13 +22,16 @@ #include "BLI_math_vector.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" +#include "BKE_context.hh" #include "BKE_gpencil_geom_legacy.h" #include "BKE_gpencil_legacy.h" #include "BKE_gpencil_modifier_legacy.h" #include "BKE_lib_query.hh" +#include "BKE_main.hh" #include "BKE_modifier.hh" +#include "BKE_screen.hh" #include "DEG_depsgraph.hh" #include "DEG_depsgraph_build.hh" @@ -38,6 +42,7 @@ #include "RNA_access.hh" +#include "MOD_gpencil_legacy_modifiertypes.h" #include "MOD_gpencil_legacy_ui_common.h" #include "MOD_gpencil_legacy_util.h" @@ -106,7 +111,7 @@ static void duplicateStroke(Object *ob, float opacity_factor; /* Apply object scale to offset distance. */ - offset *= mat4_to_scale(ob->object_to_world().ptr()); + offset *= mat4_to_scale(ob->object_to_world); BKE_gpencil_stroke_normal(gps, stroke_normal); if (len_v3(stroke_normal) < FLT_EPSILON) { diff --git a/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_noise.cc b/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_noise.cc index 5af7b61129b..b9e8f9c920d 100644 --- a/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_noise.cc +++ b/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_noise.cc @@ -13,7 +13,7 @@ #include "BLI_math_vector.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "MEM_guardedalloc.h" @@ -25,12 +25,14 @@ #include "DNA_screen_types.h" #include "BKE_colortools.hh" +#include "BKE_context.hh" #include "BKE_deform.hh" #include "BKE_gpencil_geom_legacy.h" #include "BKE_gpencil_legacy.h" #include "BKE_gpencil_modifier_legacy.h" #include "BKE_lib_query.hh" #include "BKE_modifier.hh" +#include "BKE_screen.hh" #include "DEG_depsgraph.hh" #include "DEG_depsgraph_query.hh" @@ -40,6 +42,7 @@ #include "RNA_access.hh" +#include "MOD_gpencil_legacy_modifiertypes.h" #include "MOD_gpencil_legacy_ui_common.h" #include "MOD_gpencil_legacy_util.h" diff --git a/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_offset.cc b/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_offset.cc index fcec8dd4014..1d2042926a4 100644 --- a/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_offset.cc +++ b/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_offset.cc @@ -15,7 +15,7 @@ #include "BLI_rand.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BLI_hash.h" #include "BLI_rand.h" @@ -27,17 +27,22 @@ #include "DNA_screen_types.h" #include "RNA_access.hh" +#include "BKE_context.hh" #include "BKE_deform.hh" #include "BKE_gpencil_geom_legacy.h" #include "BKE_gpencil_modifier_legacy.h" #include "BKE_lib_query.hh" #include "BKE_modifier.hh" +#include "BKE_screen.hh" +#include "DEG_depsgraph.hh" #include "DEG_depsgraph_build.hh" +#include "DEG_depsgraph_query.hh" #include "UI_interface.hh" #include "UI_resources.hh" +#include "MOD_gpencil_legacy_modifiertypes.h" #include "MOD_gpencil_legacy_ui_common.h" #include "MOD_gpencil_legacy_util.h" diff --git a/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_opacity.cc b/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_opacity.cc index d32fd085b7a..cca736909a0 100644 --- a/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_opacity.cc +++ b/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_opacity.cc @@ -11,25 +11,32 @@ #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_defaults.h" #include "DNA_gpencil_legacy_types.h" #include "DNA_gpencil_modifier_types.h" #include "DNA_meshdata_types.h" +#include "DNA_object_types.h" #include "DNA_screen_types.h" #include "BKE_colortools.hh" +#include "BKE_context.hh" #include "BKE_deform.hh" #include "BKE_gpencil_modifier_legacy.h" #include "BKE_lib_query.hh" +#include "BKE_main.hh" #include "BKE_modifier.hh" +#include "BKE_screen.hh" + +#include "DEG_depsgraph.hh" #include "UI_interface.hh" #include "UI_resources.hh" #include "RNA_access.hh" +#include "MOD_gpencil_legacy_modifiertypes.h" #include "MOD_gpencil_legacy_ui_common.h" #include "MOD_gpencil_legacy_util.h" diff --git a/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_outline.cc b/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_outline.cc index 93e35fcb068..36c4a20046d 100644 --- a/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_outline.cc +++ b/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_outline.cc @@ -14,7 +14,7 @@ #include "BLI_math_matrix.h" #include "BLI_math_vector.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_defaults.h" #include "DNA_gpencil_legacy_types.h" @@ -29,8 +29,10 @@ #include "BKE_gpencil_legacy.h" #include "BKE_gpencil_modifier_legacy.h" #include "BKE_lib_query.hh" +#include "BKE_main.hh" #include "BKE_material.h" -#include "BKE_scene.hh" +#include "BKE_scene.h" +#include "BKE_screen.hh" #include "UI_interface.hh" #include "UI_resources.hh" @@ -40,6 +42,7 @@ #include "DEG_depsgraph.hh" #include "DEG_depsgraph_query.hh" +#include "MOD_gpencil_legacy_modifiertypes.h" #include "MOD_gpencil_legacy_ui_common.h" #include "MOD_gpencil_legacy_util.h" @@ -116,7 +119,7 @@ static void convert_stroke(GpencilModifierData *md, /* Apply layer thickness change. */ gps_duplicate->thickness += gpl->line_change; /* Apply object scale to thickness. */ - gps_duplicate->thickness *= mat4_to_scale(ob->object_to_world().ptr()); + gps_duplicate->thickness *= mat4_to_scale(ob->object_to_world); CLAMP_MIN(gps_duplicate->thickness, 1.0f); /* Stroke. */ @@ -197,7 +200,7 @@ static void generate_strokes(GpencilModifierData *md, Depsgraph *depsgraph, Obje } Object *cam_ob = scene->camera; float viewmat[4][4]; - invert_m4_m4(viewmat, cam_ob->object_to_world().ptr()); + invert_m4_m4(viewmat, cam_ob->object_to_world); LISTBASE_FOREACH (bGPDlayer *, gpl, &gpd->layers) { bGPDframe *gpf = BKE_gpencil_frame_retime_get(depsgraph, scene, ob, gpl); @@ -240,7 +243,7 @@ static void bake_modifier(Main * /*bmain*/, BKE_scene_graph_update_for_newframe(depsgraph); /* Ensure the camera is the right one. */ BKE_scene_camera_switch_update(scene); - invert_m4_m4(viewmat, cam_ob->object_to_world().ptr()); + invert_m4_m4(viewmat, cam_ob->object_to_world); /* Prepare transform matrix. */ float diff_mat[4][4]; diff --git a/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_shrinkwrap.cc b/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_shrinkwrap.cc index 6406abad46a..9c46653871d 100644 --- a/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_shrinkwrap.cc +++ b/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_shrinkwrap.cc @@ -13,21 +13,25 @@ #include "BLI_math_vector.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_defaults.h" #include "DNA_gpencil_legacy_types.h" #include "DNA_gpencil_modifier_types.h" +#include "DNA_mesh_types.h" #include "DNA_object_types.h" #include "DNA_scene_types.h" #include "DNA_screen_types.h" +#include "BKE_context.hh" #include "BKE_deform.hh" #include "BKE_gpencil_geom_legacy.h" #include "BKE_gpencil_modifier_legacy.h" #include "BKE_lib_query.hh" +#include "BKE_main.hh" #include "BKE_modifier.hh" -#include "BKE_scene.hh" +#include "BKE_scene.h" +#include "BKE_screen.hh" #include "BKE_shrinkwrap.hh" #include "MEM_guardedalloc.h" @@ -37,6 +41,7 @@ #include "RNA_access.hh" +#include "MOD_gpencil_legacy_modifiertypes.h" #include "MOD_gpencil_legacy_ui_common.h" #include "MOD_gpencil_legacy_util.h" diff --git a/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_simplify.cc b/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_simplify.cc index f4916a71494..4bbbef53e98 100644 --- a/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_simplify.cc +++ b/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_simplify.cc @@ -9,25 +9,32 @@ #include #include /* For #MEMCPY_STRUCT_AFTER. */ +#include "BLI_listbase.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_defaults.h" +#include "DNA_gpencil_legacy_types.h" #include "DNA_gpencil_modifier_types.h" #include "DNA_object_types.h" #include "DNA_screen_types.h" +#include "BKE_context.hh" #include "BKE_gpencil_geom_legacy.h" #include "BKE_gpencil_modifier_legacy.h" #include "BKE_lib_query.hh" #include "BKE_modifier.hh" +#include "BKE_screen.hh" + +#include "DEG_depsgraph.hh" #include "UI_interface.hh" #include "UI_resources.hh" #include "RNA_access.hh" +#include "MOD_gpencil_legacy_modifiertypes.h" #include "MOD_gpencil_legacy_ui_common.h" #include "MOD_gpencil_legacy_util.h" diff --git a/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_smooth.cc b/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_smooth.cc index 42b4ab9e66f..eb1ec9b19c9 100644 --- a/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_smooth.cc +++ b/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_smooth.cc @@ -9,28 +9,35 @@ #include #include /* For #MEMCPY_STRUCT_AFTER. */ +#include "BLI_listbase.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_defaults.h" #include "DNA_gpencil_legacy_types.h" #include "DNA_gpencil_modifier_types.h" #include "DNA_meshdata_types.h" +#include "DNA_object_types.h" #include "DNA_screen_types.h" #include "BKE_colortools.hh" +#include "BKE_context.hh" #include "BKE_deform.hh" #include "BKE_gpencil_geom_legacy.h" #include "BKE_gpencil_modifier_legacy.h" #include "BKE_lib_query.hh" #include "BKE_modifier.hh" +#include "BKE_screen.hh" + +#include "DEG_depsgraph.hh" #include "UI_interface.hh" #include "UI_resources.hh" #include "RNA_access.hh" +#include "MOD_gpencil_legacy_modifiertypes.h" #include "MOD_gpencil_legacy_ui_common.h" #include "MOD_gpencil_legacy_util.h" diff --git a/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_subdiv.cc b/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_subdiv.cc index c4434b5a94f..e9dc918ba09 100644 --- a/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_subdiv.cc +++ b/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_subdiv.cc @@ -9,9 +9,10 @@ #include #include /* For #MEMCPY_STRUCT_AFTER. */ +#include "BLI_listbase.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_defaults.h" #include "DNA_gpencil_legacy_types.h" @@ -19,14 +20,19 @@ #include "DNA_object_types.h" #include "DNA_screen_types.h" +#include "BKE_context.hh" #include "BKE_gpencil_geom_legacy.h" #include "BKE_gpencil_modifier_legacy.h" #include "BKE_lib_query.hh" #include "BKE_modifier.hh" +#include "BKE_screen.hh" + +#include "DEG_depsgraph.hh" #include "UI_interface.hh" #include "UI_resources.hh" +#include "MOD_gpencil_legacy_modifiertypes.h" #include "MOD_gpencil_legacy_ui_common.h" #include "MOD_gpencil_legacy_util.h" diff --git a/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_texture.cc b/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_texture.cc index cecbbde39a0..b4d1f3cdcdf 100644 --- a/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_texture.cc +++ b/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_texture.cc @@ -8,10 +8,11 @@ #include +#include "BLI_listbase.h" #include "BLI_math_vector.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_defaults.h" #include "DNA_gpencil_legacy_types.h" @@ -20,17 +21,22 @@ #include "DNA_object_types.h" #include "DNA_screen_types.h" +#include "BKE_context.hh" #include "BKE_deform.hh" #include "BKE_gpencil_geom_legacy.h" #include "BKE_gpencil_modifier_legacy.h" #include "BKE_lib_query.hh" #include "BKE_modifier.hh" +#include "BKE_screen.hh" + +#include "DEG_depsgraph.hh" #include "UI_interface.hh" #include "UI_resources.hh" #include "RNA_access.hh" +#include "MOD_gpencil_legacy_modifiertypes.h" #include "MOD_gpencil_legacy_ui_common.h" #include "MOD_gpencil_legacy_util.h" diff --git a/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_thick.cc b/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_thick.cc index b1bee2bf888..1364df79618 100644 --- a/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_thick.cc +++ b/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_thick.cc @@ -8,28 +8,35 @@ #include +#include "BLI_listbase.h" #include "BLI_math_vector.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_defaults.h" #include "DNA_gpencil_legacy_types.h" #include "DNA_gpencil_modifier_types.h" #include "DNA_meshdata_types.h" +#include "DNA_object_types.h" #include "DNA_screen_types.h" #include "BKE_colortools.hh" +#include "BKE_context.hh" #include "BKE_deform.hh" #include "BKE_gpencil_modifier_legacy.h" #include "BKE_lib_query.hh" #include "BKE_modifier.hh" +#include "BKE_screen.hh" + +#include "DEG_depsgraph.hh" #include "UI_interface.hh" #include "UI_resources.hh" #include "RNA_access.hh" +#include "MOD_gpencil_legacy_modifiertypes.h" #include "MOD_gpencil_legacy_ui_common.h" #include "MOD_gpencil_legacy_util.h" diff --git a/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_time.cc b/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_time.cc index 99a1981126c..ca279e47f56 100644 --- a/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_time.cc +++ b/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_time.cc @@ -12,34 +12,43 @@ #include "MEM_guardedalloc.h" +#include "BLI_listbase.h" #include "BLI_string.h" #include "BLI_string_utf8.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_defaults.h" #include "DNA_gpencil_legacy_types.h" #include "DNA_gpencil_modifier_types.h" +#include "DNA_object_types.h" #include "DNA_scene_types.h" #include "DNA_screen_types.h" #include "BKE_context.hh" +#include "BKE_gpencil_geom_legacy.h" +#include "BKE_gpencil_legacy.h" #include "BKE_gpencil_modifier_legacy.h" #include "BKE_lib_query.hh" +#include "BKE_main.hh" #include "BKE_modifier.hh" #include "BKE_screen.hh" #include "RNA_access.hh" #include "RNA_prototypes.h" +#include "MOD_gpencil_legacy_modifiertypes.h" #include "MOD_gpencil_legacy_ui_common.h" +#include "MOD_gpencil_legacy_util.h" #include "UI_interface.hh" #include "UI_resources.hh" #include "WM_api.hh" +#include "DEG_depsgraph.hh" + static void init_data(GpencilModifierData *md) { TimeGpencilModifierData *gpmd = (TimeGpencilModifierData *)md; diff --git a/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_tint.cc b/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_tint.cc index 01e8c34b164..2008041c873 100644 --- a/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_tint.cc +++ b/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_tint.cc @@ -10,10 +10,11 @@ #include "BLI_utildefines.h" +#include "BLI_listbase.h" #include "BLI_math_matrix.h" #include "BLI_math_vector.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_defaults.h" #include "DNA_gpencil_legacy_types.h" @@ -22,15 +23,20 @@ #include "DNA_meshdata_types.h" #include "DNA_modifier_types.h" #include "DNA_object_types.h" +#include "DNA_scene_types.h" #include "DNA_screen_types.h" #include "BKE_colorband.hh" #include "BKE_colortools.hh" +#include "BKE_context.hh" #include "BKE_deform.hh" #include "BKE_gpencil_modifier_legacy.h" #include "BKE_lib_query.hh" +#include "BKE_main.hh" #include "BKE_material.h" #include "BKE_modifier.hh" +#include "BKE_scene.h" +#include "BKE_screen.hh" #include "MEM_guardedalloc.h" @@ -39,9 +45,11 @@ #include "RNA_access.hh" +#include "MOD_gpencil_legacy_modifiertypes.h" #include "MOD_gpencil_legacy_ui_common.h" #include "MOD_gpencil_legacy_util.h" +#include "DEG_depsgraph.hh" #include "DEG_depsgraph_build.hh" static void init_data(GpencilModifierData *md) @@ -139,7 +147,7 @@ static void deform_stroke(GpencilModifierData *md, float coba_res[4]; float matrix[4][4]; if (is_gradient) { - mul_m4_m4m4(matrix, mmd->object->world_to_object().ptr(), ob->object_to_world().ptr()); + mul_m4_m4m4(matrix, mmd->object->world_to_object, ob->object_to_world); } /* loop points and apply color. */ diff --git a/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_ui_common.cc b/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_ui_common.cc index eefa9af5084..8e62ec57a98 100644 --- a/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_ui_common.cc +++ b/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_ui_common.cc @@ -16,12 +16,13 @@ #include "BKE_material.h" #include "BKE_screen.hh" +#include "DNA_material_types.h" #include "DNA_object_types.h" #include "DNA_screen_types.h" #include "ED_object.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "UI_interface.hh" #include "UI_resources.hh" diff --git a/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_util.cc b/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_util.cc index b926cfd0fd3..96684c09866 100644 --- a/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_util.cc +++ b/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_util.cc @@ -9,6 +9,7 @@ #include #include "BLI_listbase.h" +#include "BLI_math_vector.h" #include "BLI_utildefines.h" #include "DNA_gpencil_legacy_types.h" @@ -21,7 +22,7 @@ #include "BKE_deform.hh" #include "BKE_gpencil_modifier_legacy.h" #include "BKE_material.h" -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "MOD_gpencil_legacy_modifiertypes.h" #include "MOD_gpencil_legacy_util.h" diff --git a/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_weight_angle.cc b/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_weight_angle.cc index 3de6bed8ef6..561f5b5fa47 100644 --- a/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_weight_angle.cc +++ b/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_weight_angle.cc @@ -8,11 +8,12 @@ #include +#include "BLI_listbase.h" #include "BLI_math_matrix.h" #include "BLI_math_vector.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_defaults.h" #include "DNA_gpencil_legacy_types.h" @@ -21,17 +22,23 @@ #include "DNA_object_types.h" #include "DNA_screen_types.h" +#include "BKE_context.hh" #include "BKE_deform.hh" #include "BKE_gpencil_legacy.h" #include "BKE_gpencil_modifier_legacy.h" #include "BKE_lib_query.hh" #include "BKE_modifier.hh" +#include "BKE_screen.hh" + +#include "DEG_depsgraph.hh" +#include "DEG_depsgraph_build.hh" #include "UI_interface.hh" #include "UI_resources.hh" #include "RNA_access.hh" +#include "MOD_gpencil_legacy_modifiertypes.h" #include "MOD_gpencil_legacy_ui_common.h" #include "MOD_gpencil_legacy_util.h" @@ -93,7 +100,7 @@ static void deform_stroke(GpencilModifierData *md, /* Apply the rotation of the object. */ if (mmd->space == GP_SPACE_LOCAL) { - mul_mat3_m4_v3(ob->object_to_world().ptr(), vec_ref); + mul_mat3_m4_v3(ob->object_to_world, vec_ref); } /* Ensure there is a vertex group. */ @@ -118,8 +125,8 @@ static void deform_stroke(GpencilModifierData *md, bGPDspoint *pt1 = (i > 0) ? &gps->points[i] : &gps->points[i + 1]; bGPDspoint *pt2 = (i > 0) ? &gps->points[i - 1] : &gps->points[i]; float fpt1[3], fpt2[3]; - mul_v3_m4v3(fpt1, ob->object_to_world().ptr(), &pt1->x); - mul_v3_m4v3(fpt2, ob->object_to_world().ptr(), &pt2->x); + mul_v3_m4v3(fpt1, ob->object_to_world, &pt1->x); + mul_v3_m4v3(fpt2, ob->object_to_world, &pt2->x); float vec[3]; sub_v3_v3v3(vec, fpt1, fpt2); diff --git a/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_weight_proximity.cc b/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_weight_proximity.cc index 4e5ad0db6d1..99841464447 100644 --- a/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_weight_proximity.cc +++ b/source/blender/gpencil_modifiers_legacy/intern/MOD_gpencil_legacy_weight_proximity.cc @@ -8,11 +8,12 @@ #include +#include "BLI_listbase.h" #include "BLI_math_matrix.h" #include "BLI_math_vector.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_defaults.h" #include "DNA_gpencil_legacy_types.h" @@ -21,12 +22,15 @@ #include "DNA_object_types.h" #include "DNA_screen_types.h" +#include "BKE_context.hh" #include "BKE_deform.hh" #include "BKE_gpencil_legacy.h" #include "BKE_gpencil_modifier_legacy.h" #include "BKE_lib_query.hh" #include "BKE_modifier.hh" +#include "BKE_screen.hh" +#include "DEG_depsgraph.hh" #include "DEG_depsgraph_build.hh" #include "UI_interface.hh" @@ -34,6 +38,7 @@ #include "RNA_access.hh" +#include "MOD_gpencil_legacy_modifiertypes.h" #include "MOD_gpencil_legacy_ui_common.h" #include "MOD_gpencil_legacy_util.h" @@ -60,8 +65,8 @@ static float calc_point_weight_by_distance(Object *ob, { float weight; float gvert[3]; - mul_v3_m4v3(gvert, ob->object_to_world().ptr(), &pt->x); - float dist = len_v3v3(mmd->object->object_to_world().location(), gvert); + mul_v3_m4v3(gvert, ob->object_to_world, &pt->x); + float dist = len_v3v3(mmd->object->object_to_world[3], gvert); if (dist > dist_max) { weight = 1.0f; diff --git a/source/blender/gpencil_modifiers_legacy/intern/lineart/MOD_lineart.h b/source/blender/gpencil_modifiers_legacy/intern/lineart/MOD_lineart.h index 51e4e9791fc..e9882aed214 100644 --- a/source/blender/gpencil_modifiers_legacy/intern/lineart/MOD_lineart.h +++ b/source/blender/gpencil_modifiers_legacy/intern/lineart/MOD_lineart.h @@ -10,7 +10,6 @@ #include "BLI_linklist.h" #include "BLI_listbase.h" -#include "BLI_math_matrix_types.hh" #include "BLI_math_vector.h" #include "BLI_threads.h" @@ -423,18 +422,7 @@ typedef struct LineartData { } LineartData; -/* Stores the maximum calculation range in the whole modifier stack for line art so the cache can - * cover everything that will be visible. */ -struct GreasePencilLineartLimitInfo { - int16_t edge_types; - uint8_t min_level; - uint8_t max_level; - uint8_t shadow_selection; - uint8_t silhouette_selection; -}; - typedef struct LineartCache { - GreasePencilLineartLimitInfo LimitInfo; /** Separate memory pool for chain data and shadow, this goes to the cache, so when we free the * main pool, chains and shadows will still be available. */ LineartStaticMemPool chain_data_pool; @@ -875,12 +863,10 @@ struct bGPDframe; struct bGPDlayer; struct Depsgraph; struct LineartGpencilModifierData; -struct GreasePencilLineartModifierData; struct LineartData; struct Scene; -void MOD_lineart_destroy_render_data(struct LineartGpencilModifierData *lmd_legacy); -void MOD_lineart_destroy_render_data_v3(struct GreasePencilLineartModifierData *lmd); +void MOD_lineart_destroy_render_data(struct LineartGpencilModifierData *lmd); void MOD_lineart_chain_feature_lines(LineartData *ld); void MOD_lineart_chain_split_for_fixed_occlusion(LineartData *ld); @@ -911,13 +897,9 @@ void MOD_lineart_finalize_chains(LineartData *ld); * \return True when a change is made. */ bool MOD_lineart_compute_feature_lines(struct Depsgraph *depsgraph, - struct LineartGpencilModifierData *lmd_legacy, + struct LineartGpencilModifierData *lmd, struct LineartCache **cached_result, bool enable_stroke_depth_offset); -bool MOD_lineart_compute_feature_lines_v3(struct Depsgraph *depsgraph, - struct GreasePencilLineartModifierData &lmd, - struct LineartCache **cached_result, - bool enable_stroke_depth_offset); /** * This only gets initial "biggest" tile. @@ -955,32 +937,6 @@ void MOD_lineart_gpencil_generate(LineartCache *cache, int modifier_flags, int modifier_calculation_flags); -namespace blender::bke::greasepencil { -class Drawing; -} -void MOD_lineart_gpencil_generate_v3(const LineartCache *cache, - const blender::float4x4 &mat, - Depsgraph *depsgraph, - blender::bke::greasepencil::Drawing &drawing, - int8_t source_type, - Object *source_object, - struct Collection *source_collection, - int level_start, - int level_end, - int mat_nr, - int16_t edge_types, - uchar mask_switches, - uchar material_mask_bits, - uchar intersection_mask, - float thickness, - float opacity, - uchar shadow_selection, - uchar silhouette_mode, - const char *source_vgname, - const char *vgname, - int modifier_flags, - int modifier_calculation_flags); - /** * Length is in image space. */ diff --git a/source/blender/gpencil_modifiers_legacy/intern/lineart/lineart_chain.cc b/source/blender/gpencil_modifiers_legacy/intern/lineart/lineart_chain.cc index 4476c8c2766..7028b7bf092 100644 --- a/source/blender/gpencil_modifiers_legacy/intern/lineart/lineart_chain.cc +++ b/source/blender/gpencil_modifiers_legacy/intern/lineart/lineart_chain.cc @@ -6,6 +6,7 @@ * \ingroup editors */ +#include "BLI_linklist.h" #include "BLI_listbase.h" #include "BLI_math_geom.h" @@ -32,13 +33,11 @@ static LineartEdge *lineart_line_get_connected(LineartBoundingArea *ba, for (int i = 0; i < ba->line_count; i++) { LineartEdge *n_e = ba->linked_lines[i]; - if (!(n_e->flags & MOD_LINEART_EDGE_FLAG_ALL_TYPE) || - (n_e->flags & MOD_LINEART_EDGE_FLAG_CHAIN_PICKED)) - { + if (!(n_e->flags & LRT_EDGE_FLAG_ALL_TYPE) || (n_e->flags & LRT_EDGE_FLAG_CHAIN_PICKED)) { continue; } - if (match_flag && ((n_e->flags & MOD_LINEART_EDGE_FLAG_ALL_TYPE) & match_flag) == 0) { + if (match_flag && ((n_e->flags & LRT_EDGE_FLAG_ALL_TYPE) & match_flag) == 0) { continue; } @@ -51,7 +50,7 @@ static LineartEdge *lineart_line_get_connected(LineartBoundingArea *ba, return n_e; } - if (n_e->flags & MOD_LINEART_EDGE_FLAG_INTERSECTION) { + if (n_e->flags & LRT_EDGE_FLAG_INTERSECTION) { if (n_e->object_ref != match_isec_object) { continue; } @@ -130,7 +129,7 @@ static LineartEdgeChainItem *lineart_chain_append_point(LineartData *ld, copy_v3_v3(eci->gpos, gpos); eci->index = index; copy_v3_v3(eci->normal, normal); - eci->line_type = type & MOD_LINEART_EDGE_FLAG_ALL_TYPE; + eci->line_type = type & LRT_EDGE_FLAG_ALL_TYPE; eci->occlusion = level; eci->material_mask_bits = material_mask_bits; eci->shadow_mask_bits = shadow_mask_bits; @@ -165,7 +164,7 @@ static LineartEdgeChainItem *lineart_chain_prepend_point(LineartData *ld, copy_v3_v3(eci->gpos, gpos); eci->index = index; copy_v3_v3(eci->normal, normal); - eci->line_type = type & MOD_LINEART_EDGE_FLAG_ALL_TYPE; + eci->line_type = type & LRT_EDGE_FLAG_ALL_TYPE; eci->occlusion = level; eci->material_mask_bits = material_mask_bits; eci->shadow_mask_bits = shadow_mask_bits; @@ -197,14 +196,12 @@ void MOD_lineart_chain_feature_lines(LineartData *ld) LRT_ITER_ALL_LINES_BEGIN { - if (!(e->flags & MOD_LINEART_EDGE_FLAG_ALL_TYPE) || - (e->flags & MOD_LINEART_EDGE_FLAG_CHAIN_PICKED)) - { + if (!(e->flags & LRT_EDGE_FLAG_ALL_TYPE) || (e->flags & LRT_EDGE_FLAG_CHAIN_PICKED)) { LRT_ITER_ALL_LINES_NEXT continue; } - e->flags |= MOD_LINEART_EDGE_FLAG_CHAIN_PICKED; + e->flags |= LRT_EDGE_FLAG_CHAIN_PICKED; ec = lineart_chain_create(ld); @@ -249,7 +246,7 @@ void MOD_lineart_chain_feature_lines(LineartData *ld) while (ba && (new_e = lineart_line_get_connected( ba, new_vt, &new_vt, e->flags, ec->intersection_mask, ec->object_ref))) { - new_e->flags |= MOD_LINEART_EDGE_FLAG_CHAIN_PICKED; + new_e->flags |= LRT_EDGE_FLAG_CHAIN_PICKED; if (new_e->t1 || new_e->t2) { zero_v3(N); @@ -394,7 +391,7 @@ void MOD_lineart_chain_feature_lines(LineartData *ld) while (ba && (new_e = lineart_line_get_connected( ba, new_vt, &new_vt, e->flags, ec->intersection_mask, ec->object_ref))) { - new_e->flags |= MOD_LINEART_EDGE_FLAG_CHAIN_PICKED; + new_e->flags |= LRT_EDGE_FLAG_CHAIN_PICKED; if (new_e->t1 || new_e->t2) { zero_v3(N); @@ -413,7 +410,7 @@ void MOD_lineart_chain_feature_lines(LineartData *ld) /* Fix leading vertex type. */ eci = static_cast(ec->chain.last); - eci->line_type = new_e->flags & MOD_LINEART_EDGE_FLAG_ALL_TYPE; + eci->line_type = new_e->flags & LRT_EDGE_FLAG_ALL_TYPE; if (new_vt == new_e->v1) { es = static_cast(new_e->segments.last); @@ -493,10 +490,10 @@ void MOD_lineart_chain_feature_lines(LineartData *ld) ba = MOD_lineart_get_bounding_area(ld, new_vt->fbcoord[0], new_vt->fbcoord[1]); } if (ld->conf.fuzzy_everything) { - ec->type = MOD_LINEART_EDGE_FLAG_CONTOUR; + ec->type = LRT_EDGE_FLAG_CONTOUR; } else { - ec->type = (e->flags & MOD_LINEART_EDGE_FLAG_ALL_TYPE); + ec->type = (e->flags & LRT_EDGE_FLAG_ALL_TYPE); } } LRT_ITER_ALL_LINES_END @@ -762,15 +759,15 @@ static void lineart_chain_connect(LineartData * /*ld*/, int reverse_2) { LineartEdgeChainItem *eci; - if (onto->type == MOD_LINEART_EDGE_FLAG_INTERSECTION) { + if (onto->type == LRT_EDGE_FLAG_INTERSECTION) { if (sub->object_ref) { onto->object_ref = sub->object_ref; - onto->type = MOD_LINEART_EDGE_FLAG_CONTOUR; + onto->type = LRT_EDGE_FLAG_CONTOUR; } } - else if (sub->type == MOD_LINEART_EDGE_FLAG_INTERSECTION) { - if (onto->type != MOD_LINEART_EDGE_FLAG_INTERSECTION) { - onto->type = MOD_LINEART_EDGE_FLAG_CONTOUR; + else if (sub->type == LRT_EDGE_FLAG_INTERSECTION) { + if (onto->type != LRT_EDGE_FLAG_INTERSECTION) { + onto->type = LRT_EDGE_FLAG_CONTOUR; } } if (!reverse_1) { /* L--R L-R. */ @@ -836,8 +833,8 @@ static LineartChainRegisterEntry *lineart_chain_get_closest_cre(LineartData *ld, if (!ld->conf.fuzzy_everything) { if (ld->conf.fuzzy_intersections) { /* If none of those are intersection lines... */ - if (!(cre->ec->type & MOD_LINEART_EDGE_FLAG_INTERSECTION) && - !(ec->type & MOD_LINEART_EDGE_FLAG_INTERSECTION)) + if (!(cre->ec->type & LRT_EDGE_FLAG_INTERSECTION) && + !(ec->type & LRT_EDGE_FLAG_INTERSECTION)) { continue; /* We don't want to chain along different objects at the moment. */ } @@ -859,8 +856,8 @@ static LineartChainRegisterEntry *lineart_chain_get_closest_cre(LineartData *ld, if (!ld->conf.fuzzy_everything) { if (cre->ec->type != ec->type) { if (ld->conf.fuzzy_intersections) { - if (!(cre->ec->type == MOD_LINEART_EDGE_FLAG_INTERSECTION || - ec->type == MOD_LINEART_EDGE_FLAG_INTERSECTION)) + if (!(cre->ec->type == LRT_EDGE_FLAG_INTERSECTION || + ec->type == LRT_EDGE_FLAG_INTERSECTION)) { continue; /* Fuzzy intersections but no intersection line found. */ } @@ -954,7 +951,7 @@ void MOD_lineart_chain_connect(LineartData *ld) BLI_addtail(&ld->chains, ec); loop_id = ec->loop_id; - if (ec->type == MOD_LINEART_EDGE_FLAG_LOOSE && (!ld->conf.use_loose_edge_chain)) { + if (ec->type == LRT_EDGE_FLAG_LOOSE && (!ld->conf.use_loose_edge_chain)) { continue; } @@ -1096,9 +1093,9 @@ void MOD_lineart_finalize_chains(LineartData *ld) { LISTBASE_FOREACH (LineartEdgeChain *, ec, &ld->chains) { if (ELEM(ec->type, - MOD_LINEART_EDGE_FLAG_INTERSECTION, - MOD_LINEART_EDGE_FLAG_PROJECTED_SHADOW, - MOD_LINEART_EDGE_FLAG_LIGHT_CONTOUR)) + LRT_EDGE_FLAG_INTERSECTION, + LRT_EDGE_FLAG_PROJECTED_SHADOW, + LRT_EDGE_FLAG_LIGHT_CONTOUR)) { continue; } @@ -1397,7 +1394,7 @@ void MOD_lineart_chain_offset_towards_camera(LineartData *ld, float dist, bool u void MOD_lineart_chain_find_silhouette_backdrop_objects(LineartData *ld) { LISTBASE_FOREACH (LineartEdgeChain *, ec, &ld->chains) { - if (ec->type == MOD_LINEART_EDGE_FLAG_CONTOUR && + if (ec->type == LRT_EDGE_FLAG_CONTOUR && ec->shadow_mask_bits & LRT_SHADOW_SILHOUETTE_ERASED_GROUP) { uint32_t target = ec->shadow_mask_bits & LRT_OBINDEX_HIGHER; diff --git a/source/blender/gpencil_modifiers_legacy/intern/lineart/lineart_cpu.cc b/source/blender/gpencil_modifiers_legacy/intern/lineart/lineart_cpu.cc index 88532419f54..de919421b1d 100644 --- a/source/blender/gpencil_modifiers_legacy/intern/lineart/lineart_cpu.cc +++ b/source/blender/gpencil_modifiers_legacy/intern/lineart/lineart_cpu.cc @@ -11,15 +11,13 @@ #include "MOD_gpencil_legacy_lineart.h" #include "MOD_lineart.h" +#include "BLI_linklist.h" #include "BLI_listbase.h" -#include "BLI_math_base.hh" #include "BLI_math_geom.h" #include "BLI_math_matrix.h" -#include "BLI_math_matrix.hh" #include "BLI_math_rotation.h" #include "BLI_math_vector.hh" #include "BLI_sort.hh" -#include "BLI_string.h" #include "BLI_task.h" #include "BLI_time.h" #include "BLI_utildefines.h" @@ -27,21 +25,23 @@ #include "BKE_attribute.hh" #include "BKE_camera.h" -#include "BKE_collection.hh" -#include "BKE_curves.hh" +#include "BKE_collection.h" #include "BKE_customdata.hh" #include "BKE_deform.hh" -#include "BKE_global.hh" +#include "BKE_duplilist.h" +#include "BKE_editmesh.hh" +#include "BKE_global.h" #include "BKE_gpencil_geom_legacy.h" #include "BKE_gpencil_legacy.h" #include "BKE_gpencil_modifier_legacy.h" -#include "BKE_grease_pencil.hh" -#include "BKE_grease_pencil_legacy_convert.hh" #include "BKE_lib_id.hh" #include "BKE_material.h" #include "BKE_mesh.hh" +#include "BKE_mesh_mapping.hh" +#include "BKE_mesh_runtime.hh" #include "BKE_object.hh" -#include "BKE_scene.hh" +#include "BKE_pointcache.h" +#include "BKE_scene.h" #include "DEG_depsgraph_query.hh" @@ -59,17 +59,11 @@ #include "RE_pipeline.h" #include "intern/render_types.h" -#include "ED_grease_pencil.hh" - #include "lineart_intern.h" #include /* For `min/max`. */ -using blender::float3; using blender::int3; -using blender::MutableSpan; -using namespace blender::bke; -using blender::bke::mesh::corner_tri_get_real_edges; struct LineartIsecSingle { double v1[3], v2[3]; @@ -133,6 +127,8 @@ static void lineart_free_bounding_area_memory(LineartBoundingArea *ba, bool recu static void lineart_free_bounding_area_memories(LineartData *ld); +static LineartCache *lineart_init_cache(); + static void lineart_discard_segment(LineartData *ld, LineartEdgeSegment *es) { BLI_spin_lock(&ld->lock_cuts); @@ -322,7 +318,7 @@ void lineart_edge_cut(LineartData *ld, * flags. See LineartEdgeSegment::shadow_mask_bits for details. */ if (shadow_bits == LRT_SHADOW_MASK_ENCLOSED_SHAPE) { if (seg->shadow_mask_bits & LRT_SHADOW_MASK_ILLUMINATED || - e->flags & MOD_LINEART_EDGE_FLAG_LIGHT_CONTOUR) + e->flags & LRT_EDGE_FLAG_LIGHT_CONTOUR) { seg->shadow_mask_bits |= LRT_SHADOW_MASK_INHIBITED; } @@ -752,9 +748,9 @@ static bool lineart_edge_match(LineartTriangle *tri, LineartEdge *e, int v1, int static void lineart_discard_duplicated_edges(LineartEdge *old_e) { LineartEdge *e = old_e; - while (e->flags & MOD_LINEART_EDGE_FLAG_NEXT_IS_DUPLICATION) { + while (e->flags & LRT_EDGE_FLAG_NEXT_IS_DUPLICATION) { e++; - e->flags |= MOD_LINEART_EDGE_FLAG_CHAIN_PICKED; + e->flags |= LRT_EDGE_FLAG_CHAIN_PICKED; } } @@ -820,7 +816,7 @@ static void lineart_triangle_cull_single(LineartData *ld, if (tri_adj->e[e_num]) { \ old_e = tri_adj->e[e_num]; \ new_flag = old_e->flags; \ - old_e->flags = MOD_LINEART_EDGE_FLAG_CHAIN_PICKED; \ + old_e->flags = LRT_EDGE_FLAG_CHAIN_PICKED; \ lineart_discard_duplicated_edges(old_e); \ INCREASE_EDGE \ e->v1 = (v1_link); \ @@ -843,15 +839,15 @@ static void lineart_triangle_cull_single(LineartData *ld, #define REMOVE_TRIANGLE_EDGE \ if (tri_adj->e[0]) { \ - tri_adj->e[0]->flags = MOD_LINEART_EDGE_FLAG_CHAIN_PICKED; \ + tri_adj->e[0]->flags = LRT_EDGE_FLAG_CHAIN_PICKED; \ lineart_discard_duplicated_edges(tri_adj->e[0]); \ } \ if (tri_adj->e[1]) { \ - tri_adj->e[1]->flags = MOD_LINEART_EDGE_FLAG_CHAIN_PICKED; \ + tri_adj->e[1]->flags = LRT_EDGE_FLAG_CHAIN_PICKED; \ lineart_discard_duplicated_edges(tri_adj->e[1]); \ } \ if (tri_adj->e[2]) { \ - tri_adj->e[2]->flags = MOD_LINEART_EDGE_FLAG_CHAIN_PICKED; \ + tri_adj->e[2]->flags = LRT_EDGE_FLAG_CHAIN_PICKED; \ lineart_discard_duplicated_edges(tri_adj->e[2]); \ } @@ -916,7 +912,7 @@ static void lineart_triangle_cull_single(LineartData *ld, /* New line connecting two new points. */ INCREASE_EDGE if (allow_boundaries) { - e->flags = MOD_LINEART_EDGE_FLAG_CONTOUR; + e->flags = LRT_EDGE_FLAG_CONTOUR; lineart_add_edge_to_array(&ld->pending_edges, e); } /* NOTE: inverting `e->v1/v2` (left/right point) doesn't matter as long as @@ -965,7 +961,7 @@ static void lineart_triangle_cull_single(LineartData *ld, INCREASE_EDGE if (allow_boundaries) { - e->flags = MOD_LINEART_EDGE_FLAG_CONTOUR; + e->flags = LRT_EDGE_FLAG_CONTOUR; lineart_add_edge_to_array(&ld->pending_edges, e); } e->v1 = &vt[0]; @@ -1006,7 +1002,7 @@ static void lineart_triangle_cull_single(LineartData *ld, INCREASE_EDGE if (allow_boundaries) { - e->flags = MOD_LINEART_EDGE_FLAG_CONTOUR; + e->flags = LRT_EDGE_FLAG_CONTOUR; lineart_add_edge_to_array(&ld->pending_edges, e); } e->v1 = &vt[1]; @@ -1081,7 +1077,7 @@ static void lineart_triangle_cull_single(LineartData *ld, /* New line connects two new points. */ INCREASE_EDGE if (allow_boundaries) { - e->flags = MOD_LINEART_EDGE_FLAG_CONTOUR; + e->flags = LRT_EDGE_FLAG_CONTOUR; lineart_add_edge_to_array(&ld->pending_edges, e); } e->v1 = &vt[1]; @@ -1133,7 +1129,7 @@ static void lineart_triangle_cull_single(LineartData *ld, INCREASE_EDGE if (allow_boundaries) { - e->flags = MOD_LINEART_EDGE_FLAG_CONTOUR; + e->flags = LRT_EDGE_FLAG_CONTOUR; lineart_add_edge_to_array(&ld->pending_edges, e); } e->v1 = &vt[1]; @@ -1182,7 +1178,7 @@ static void lineart_triangle_cull_single(LineartData *ld, INCREASE_EDGE if (allow_boundaries) { - e->flags = MOD_LINEART_EDGE_FLAG_CONTOUR; + e->flags = LRT_EDGE_FLAG_CONTOUR; lineart_add_edge_to_array(&ld->pending_edges, e); } e->v1 = &vt[1]; @@ -1406,7 +1402,7 @@ void lineart_main_discard_out_of_frame_edges(LineartData *ld) e = (LineartEdge *)eln->pointer; for (int i = 0; i < eln->element_count; i++) { if (!e[i].v1 || !e[i].v2) { - e[i].flags = MOD_LINEART_EDGE_FLAG_CHAIN_PICKED; + e[i].flags = LRT_EDGE_FLAG_CHAIN_PICKED; continue; } const blender::float2 vec1(e[i].v1->fbcoord), vec2(e[i].v2->fbcoord); @@ -1418,7 +1414,7 @@ void lineart_main_discard_out_of_frame_edges(LineartData *ld) isect_seg_seg_v2(bounds[1], bounds[3], vec1, vec2) == ISECT_LINE_LINE_NONE && isect_seg_seg_v2(bounds[2], bounds[3], vec1, vec2) == ISECT_LINE_LINE_NONE) { - e[i].flags = MOD_LINEART_EDGE_FLAG_CHAIN_PICKED; + e[i].flags = LRT_EDGE_FLAG_CHAIN_PICKED; } } } @@ -1452,12 +1448,12 @@ static void lineart_mvert_transform_task(void *__restrict userdata, } static const int LRT_MESH_EDGE_TYPES[] = { - MOD_LINEART_EDGE_FLAG_EDGE_MARK, - MOD_LINEART_EDGE_FLAG_CONTOUR, - MOD_LINEART_EDGE_FLAG_CREASE, - MOD_LINEART_EDGE_FLAG_MATERIAL, - MOD_LINEART_EDGE_FLAG_LOOSE, - MOD_LINEART_EDGE_FLAG_CONTOUR_SECONDARY, + LRT_EDGE_FLAG_EDGE_MARK, + LRT_EDGE_FLAG_CONTOUR, + LRT_EDGE_FLAG_CREASE, + LRT_EDGE_FLAG_MATERIAL, + LRT_EDGE_FLAG_LOOSE, + LRT_EDGE_FLAG_CONTOUR_SECONDARY, }; #define LRT_MESH_EDGE_TYPES_COUNT 6 @@ -1579,7 +1575,7 @@ static void lineart_identify_corner_tri_feature_edges(void *__restrict userdata, face_mark_filtered = !face_mark_filtered; } if (!face_mark_filtered) { - edge_nabr[i].flags = MOD_LINEART_EDGE_FLAG_INHIBIT; + edge_nabr[i].flags = LRT_EDGE_FLAG_INHIBIT; if (e_feat_data->ld->conf.filter_face_mark_keep_contour) { only_contour = true; } @@ -1592,7 +1588,7 @@ static void lineart_identify_corner_tri_feature_edges(void *__restrict userdata, /* Mesh boundary */ if (edge_nabr[i].e == -1) { - edge_nabr[i].flags = MOD_LINEART_EDGE_FLAG_CONTOUR; + edge_nabr[i].flags = LRT_EDGE_FLAG_CONTOUR; reduce_data->feat_edges += 1; return; } @@ -1627,7 +1623,7 @@ static void lineart_identify_corner_tri_feature_edges(void *__restrict userdata, dot_v2 = dot_v3v3_db(view_vector, tri2->gn); if ((result = dot_v1 * dot_v2) <= 0 && (dot_v1 + dot_v2)) { - edge_flag_result |= MOD_LINEART_EDGE_FLAG_CONTOUR; + edge_flag_result |= LRT_EDGE_FLAG_CONTOUR; } if (ld->conf.use_back_face_culling) { @@ -1661,7 +1657,7 @@ static void lineart_identify_corner_tri_feature_edges(void *__restrict userdata, dot_v2 = dot_v3v3_db(view_vector, tri2->gn); if ((result = dot_v1 * dot_v2) <= 0 && (dot_v1 + dot_v2)) { - edge_flag_result |= MOD_LINEART_EDGE_FLAG_CONTOUR_SECONDARY; + edge_flag_result |= LRT_EDGE_FLAG_CONTOUR_SECONDARY; } } @@ -1674,7 +1670,7 @@ static void lineart_identify_corner_tri_feature_edges(void *__restrict userdata, do_crease = false; } if (do_crease && (dot_v3v3_db(tri1->gn, tri2->gn) < e_feat_data->crease_threshold)) { - edge_flag_result |= MOD_LINEART_EDGE_FLAG_CREASE; + edge_flag_result |= LRT_EDGE_FLAG_CREASE; } } @@ -1689,11 +1685,11 @@ static void lineart_identify_corner_tri_feature_edges(void *__restrict userdata, (m2->lineart.mat_occlusion == 0 && m1->lineart.mat_occlusion != 0))) { if (ld->conf.use_contour) { - edge_flag_result |= MOD_LINEART_EDGE_FLAG_CONTOUR; + edge_flag_result |= LRT_EDGE_FLAG_CONTOUR; } } if (ld->conf.use_material) { - edge_flag_result |= MOD_LINEART_EDGE_FLAG_MATERIAL; + edge_flag_result |= LRT_EDGE_FLAG_MATERIAL; } } } @@ -1703,16 +1699,17 @@ static void lineart_identify_corner_tri_feature_edges(void *__restrict userdata, } } - const int3 real_edges = corner_tri_get_real_edges(e_feat_data->edges, - e_feat_data->corner_verts, - e_feat_data->corner_edges, - corner_tris[i / 3]); + const blender::int3 real_edges = blender::bke::mesh::corner_tri_get_real_edges( + e_feat_data->edges, + e_feat_data->corner_verts, + e_feat_data->corner_edges, + corner_tris[i / 3]); if (real_edges[i % 3] >= 0) { if (ld->conf.use_crease && ld->conf.sharp_as_crease && e_feat_data->sharp_edges[real_edges[i % 3]]) { - edge_flag_result |= MOD_LINEART_EDGE_FLAG_CREASE; + edge_flag_result |= LRT_EDGE_FLAG_CREASE; } if (ld->conf.use_edge_marks && e_feat_data->use_freestyle_edge) { @@ -1720,7 +1717,7 @@ static void lineart_identify_corner_tri_feature_edges(void *__restrict userdata, int index = e_feat_data->freestyle_edge_index; fe = &((FreestyleEdge *)mesh->edge_data.layers[index].data)[real_edges[i % 3]]; if (fe->flag & FREESTYLE_EDGE_MARK) { - edge_flag_result |= MOD_LINEART_EDGE_FLAG_EDGE_MARK; + edge_flag_result |= LRT_EDGE_FLAG_EDGE_MARK; } } } @@ -1985,8 +1982,9 @@ static void lineart_geometry_object_load(LineartObjectInfo *ob_info, /* Triangulate. */ const Span corner_tris = mesh->corner_tris(); - const AttributeAccessor attributes = mesh->attributes(); - const VArraySpan material_indices = *attributes.lookup("material_index", AttrDomain::Face); + const bke::AttributeAccessor attributes = mesh->attributes(); + const VArraySpan material_indices = *attributes.lookup("material_index", + bke::AttrDomain::Face); /* Check if we should look for custom data tags like Freestyle edges or faces. */ bool can_find_freestyle_edge = false; @@ -2116,9 +2114,9 @@ static void lineart_geometry_object_load(LineartObjectInfo *ob_info, edge_feat_settings.func_reduce = feat_data_sum_reduce; const VArray sharp_edges = *attributes.lookup_or_default( - "sharp_edge", AttrDomain::Edge, false); + "sharp_edge", bke::AttrDomain::Edge, false); const VArray sharp_faces = *attributes.lookup_or_default( - "sharp_face", AttrDomain::Face, false); + "sharp_face", bke::AttrDomain::Face, false); EdgeFeatData edge_feat_data = {nullptr}; edge_feat_data.ld = la_data; @@ -2159,7 +2157,7 @@ static void lineart_geometry_object_load(LineartObjectInfo *ob_info, if (la_data->conf.use_loose) { /* Only identifying floating edges at this point because other edges has been taken care of * inside #lineart_identify_corner_tri_feature_edges function. */ - const LooseEdgeCache &loose_edges = mesh->loose_edges(); + const bke::LooseEdgeCache &loose_edges = mesh->loose_edges(); loose_data.loose_array = static_cast( MEM_malloc_arrayN(loose_edges.count, sizeof(int), __func__)); if (loose_edges.count > 0) { @@ -2261,7 +2259,7 @@ static void lineart_geometry_object_load(LineartObjectInfo *ob_info, } if (edge_added) { - edge_added->flags |= MOD_LINEART_EDGE_FLAG_NEXT_IS_DUPLICATION; + edge_added->flags |= LRT_EDGE_FLAG_NEXT_IS_DUPLICATION; } edge_added = la_edge; @@ -2281,7 +2279,7 @@ static void lineart_geometry_object_load(LineartObjectInfo *ob_info, const int2 &edge = edges[loose_data.loose_array[i]]; la_edge->v1 = &la_v_arr[edge[0]]; la_edge->v2 = &la_v_arr[edge[1]]; - la_edge->flags = MOD_LINEART_EDGE_FLAG_LOOSE; + la_edge->flags = LRT_EDGE_FLAG_LOOSE; la_edge->object_ref = orig_ob; la_edge->edge_identifier = LRT_EDGE_IDENTIFIER(ob_info, la_edge); BLI_addtail(&la_edge->segments, la_seg); @@ -2477,7 +2475,7 @@ static void lineart_object_load_single_instance(LineartData *ld, Scene *scene, Object *ob, Object *ref_ob, - const float use_mat[4][4], + float use_mat[4][4], bool is_render, LineartObjectLoadTaskInfo *olti, int thread_count, @@ -2589,7 +2587,7 @@ void lineart_main_load_geometries(Depsgraph *depsgraph, double t_start; if (G.debug_value == 4000) { - t_start = BLI_time_now_seconds(); + t_start = BLI_check_seconds_timer(); } int thread_count = ld->thread_count; @@ -2639,7 +2637,7 @@ void lineart_main_load_geometries(Depsgraph *depsgraph, scene, eval_ob, eval_ob, - eval_ob->object_to_world().ptr(), + eval_ob->object_to_world, is_render, olti, thread_count, @@ -2699,7 +2697,7 @@ void lineart_main_load_geometries(Depsgraph *depsgraph, } if (G.debug_value == 4000) { - double t_elapsed = BLI_time_now_seconds() - t_start; + double t_elapsed = BLI_check_seconds_timer() - t_start; printf("Line art loading time: %lf\n", t_elapsed); printf("Discarded %d object from bound box check\n", bound_box_discard_count); } @@ -2737,7 +2735,7 @@ bool lineart_edge_from_triangle(const LineartTriangle *tri, bool allow_overlapping_edges) { const LineartEdge *use_e = e; - if (e->flags & MOD_LINEART_EDGE_FLAG_LIGHT_CONTOUR) { + if (e->flags & LRT_EDGE_FLAG_LIGHT_CONTOUR) { if (((e->target_reference & LRT_LIGHT_CONTOUR_TARGET) == tri->target_reference) || (((e->target_reference >> 32) & LRT_LIGHT_CONTOUR_TARGET) == tri->target_reference)) { @@ -2896,11 +2894,11 @@ static bool lineart_triangle_edge_image_space_occlusion(const LineartTriangle *t dot_v2 = dot_v3v3_db(dir_v2, tri->gn); dot_f = dot_v3v3_db(dir_cam, tri->gn); - if ((e->flags & MOD_LINEART_EDGE_FLAG_PROJECTED_SHADOW) && + if ((e->flags & LRT_EDGE_FLAG_PROJECTED_SHADOW) && (e->target_reference == tri->target_reference)) { - if (((dot_f > 0) && (e->flags & MOD_LINEART_EDGE_FLAG_SHADOW_FACING_LIGHT)) || - ((dot_f < 0) && !(e->flags & MOD_LINEART_EDGE_FLAG_SHADOW_FACING_LIGHT))) + if (((dot_f > 0) && (e->flags & LRT_EDGE_FLAG_SHADOW_FACING_LIGHT)) || + ((dot_f < 0) && !(e->flags & LRT_EDGE_FLAG_SHADOW_FACING_LIGHT))) { *from = 0.0f; *to = 1.0f; @@ -3559,7 +3557,7 @@ static void lineart_destroy_render_data(LineartData *ld) lineart_mem_destroy(&ld->render_data_pool); } -void MOD_lineart_destroy_render_data_v3(GreasePencilLineartModifierData *lmd) +void MOD_lineart_destroy_render_data(LineartGpencilModifierData *lmd) { LineartData *ld = lmd->la_data_ptr; @@ -3575,15 +3573,7 @@ void MOD_lineart_destroy_render_data_v3(GreasePencilLineartModifierData *lmd) } } -void MOD_lineart_destroy_render_data(LineartGpencilModifierData *lmd_legacy) -{ - GreasePencilLineartModifierData lmd; - greasepencil::convert::lineart_wrap_v3(lmd_legacy, &lmd); - MOD_lineart_destroy_render_data_v3(&lmd); - greasepencil::convert::lineart_unwrap_v3(lmd_legacy, &lmd); -} - -LineartCache *MOD_lineart_init_cache() +static LineartCache *lineart_init_cache() { LineartCache *lc = static_cast( MEM_callocN(sizeof(LineartCache), "Lineart Cache")); @@ -3600,11 +3590,11 @@ void MOD_lineart_clear_cache(LineartCache **lc) (*lc) = nullptr; } -static LineartData *lineart_create_render_buffer_v3(Scene *scene, - GreasePencilLineartModifierData *lmd, - Object *camera, - Object *active_camera, - LineartCache *lc) +static LineartData *lineart_create_render_buffer(Scene *scene, + LineartGpencilModifierData *lmd, + Object *camera, + Object *active_camera, + LineartCache *lc) { LineartData *ld = static_cast( MEM_callocN(sizeof(LineartData), "Line Art render buffer")); @@ -3615,19 +3605,19 @@ static LineartData *lineart_create_render_buffer_v3(Scene *scene, if (!scene || !camera || !lc) { return nullptr; } - const Camera *c = static_cast(camera->data); + Camera *c = static_cast(camera->data); double clipping_offset = 0; - if (lmd->calculation_flags & MOD_LINEART_ALLOW_CLIPPING_BOUNDARIES) { + if (lmd->calculation_flags & LRT_ALLOW_CLIPPING_BOUNDARIES) { /* This way the clipped lines are "stably visible" by prevents depth buffer artifacts. */ clipping_offset = 0.0001; } - copy_v3db_v3fl(ld->conf.camera_pos, camera->object_to_world().location()); + copy_v3db_v3fl(ld->conf.camera_pos, camera->object_to_world[3]); if (active_camera) { - copy_v3db_v3fl(ld->conf.active_camera_pos, active_camera->object_to_world().location()); + copy_v3db_v3fl(ld->conf.active_camera_pos, active_camera->object_to_world[3]); } - copy_m4_m4(ld->conf.cam_obmat, camera->object_to_world().ptr()); + copy_m4_m4(ld->conf.cam_obmat, camera->object_to_world); /* Make sure none of the scaling factor makes in, line art expects no scaling on cameras and * lights. */ normalize_v3(ld->conf.cam_obmat[0]); @@ -3659,8 +3649,8 @@ static LineartData *lineart_create_render_buffer_v3(Scene *scene, if (lmd->light_contour_object) { Object *light_obj = lmd->light_contour_object; - copy_v3db_v3fl(ld->conf.camera_pos_secondary, light_obj->object_to_world().location()); - copy_m4_m4(ld->conf.cam_obmat_secondary, light_obj->object_to_world().ptr()); + copy_v3db_v3fl(ld->conf.camera_pos_secondary, light_obj->object_to_world[3]); + copy_m4_m4(ld->conf.cam_obmat_secondary, light_obj->object_to_world); /* Make sure none of the scaling factor makes in, line art expects no scaling on cameras and * lights. */ normalize_v3(ld->conf.cam_obmat_secondary[0]); @@ -3677,31 +3667,24 @@ static LineartData *lineart_create_render_buffer_v3(Scene *scene, ld->conf.angle_splitting_threshold = lmd->angle_splitting_threshold; ld->conf.chain_smooth_tolerance = lmd->chain_smooth_tolerance; - ld->conf.fuzzy_intersections = (lmd->calculation_flags & MOD_LINEART_INTERSECTION_AS_CONTOUR) != - 0; - ld->conf.fuzzy_everything = (lmd->calculation_flags & MOD_LINEART_EVERYTHING_AS_CONTOUR) != 0; - ld->conf.allow_boundaries = (lmd->calculation_flags & MOD_LINEART_ALLOW_CLIPPING_BOUNDARIES) != - 0; - ld->conf.use_loose_as_contour = (lmd->calculation_flags & MOD_LINEART_LOOSE_AS_CONTOUR) != 0; - ld->conf.use_loose_edge_chain = (lmd->calculation_flags & MOD_LINEART_CHAIN_LOOSE_EDGES) != 0; - ld->conf.use_geometry_space_chain = (lmd->calculation_flags & - MOD_LINEART_CHAIN_GEOMETRY_SPACE) != 0; + ld->conf.fuzzy_intersections = (lmd->calculation_flags & LRT_INTERSECTION_AS_CONTOUR) != 0; + ld->conf.fuzzy_everything = (lmd->calculation_flags & LRT_EVERYTHING_AS_CONTOUR) != 0; + ld->conf.allow_boundaries = (lmd->calculation_flags & LRT_ALLOW_CLIPPING_BOUNDARIES) != 0; + ld->conf.use_loose_as_contour = (lmd->calculation_flags & LRT_LOOSE_AS_CONTOUR) != 0; + ld->conf.use_loose_edge_chain = (lmd->calculation_flags & LRT_CHAIN_LOOSE_EDGES) != 0; + ld->conf.use_geometry_space_chain = (lmd->calculation_flags & LRT_CHAIN_GEOMETRY_SPACE) != 0; ld->conf.use_image_boundary_trimming = (lmd->calculation_flags & - MOD_LINEART_USE_IMAGE_BOUNDARY_TRIMMING) != 0; + LRT_USE_IMAGE_BOUNDARY_TRIMMING) != 0; /* See lineart_edge_from_triangle() for how this option may impact performance. */ - ld->conf.allow_overlapping_edges = (lmd->calculation_flags & - MOD_LINEART_ALLOW_OVERLAPPING_EDGES) != 0; + ld->conf.allow_overlapping_edges = (lmd->calculation_flags & LRT_ALLOW_OVERLAPPING_EDGES) != 0; - ld->conf.allow_duplicated_types = (lmd->calculation_flags & - MOD_LINEART_ALLOW_OVERLAP_EDGE_TYPES) != 0; + ld->conf.allow_duplicated_types = (lmd->calculation_flags & LRT_ALLOW_OVERLAP_EDGE_TYPES) != 0; - ld->conf.force_crease = (lmd->calculation_flags & MOD_LINEART_USE_CREASE_ON_SMOOTH_SURFACES) != - 0; - ld->conf.sharp_as_crease = (lmd->calculation_flags & MOD_LINEART_USE_CREASE_ON_SHARP_EDGES) != 0; + ld->conf.force_crease = (lmd->calculation_flags & LRT_USE_CREASE_ON_SMOOTH_SURFACES) != 0; + ld->conf.sharp_as_crease = (lmd->calculation_flags & LRT_USE_CREASE_ON_SHARP_EDGES) != 0; - ld->conf.chain_preserve_details = (lmd->calculation_flags & - MOD_LINEART_CHAIN_PRESERVE_DETAILS) != 0; + ld->conf.chain_preserve_details = (lmd->calculation_flags & LRT_CHAIN_PRESERVE_DETAILS) != 0; /* This is used to limit calculation to a certain level to save time, lines who have higher * occlusion levels will get ignored. */ @@ -3710,32 +3693,30 @@ static LineartData *lineart_create_render_buffer_v3(Scene *scene, int16_t edge_types = lmd->edge_types_override; /* lmd->edge_types_override contains all used flags in the modifier stack. */ - ld->conf.use_contour = (edge_types & MOD_LINEART_EDGE_FLAG_CONTOUR) != 0; - ld->conf.use_crease = (edge_types & MOD_LINEART_EDGE_FLAG_CREASE) != 0; - ld->conf.use_material = (edge_types & MOD_LINEART_EDGE_FLAG_MATERIAL) != 0; - ld->conf.use_edge_marks = (edge_types & MOD_LINEART_EDGE_FLAG_EDGE_MARK) != 0; - ld->conf.use_intersections = (edge_types & MOD_LINEART_EDGE_FLAG_INTERSECTION) != 0; - ld->conf.use_loose = (edge_types & MOD_LINEART_EDGE_FLAG_LOOSE) != 0; - ld->conf.use_light_contour = ((edge_types & MOD_LINEART_EDGE_FLAG_LIGHT_CONTOUR) != 0 && + ld->conf.use_contour = (edge_types & LRT_EDGE_FLAG_CONTOUR) != 0; + ld->conf.use_crease = (edge_types & LRT_EDGE_FLAG_CREASE) != 0; + ld->conf.use_material = (edge_types & LRT_EDGE_FLAG_MATERIAL) != 0; + ld->conf.use_edge_marks = (edge_types & LRT_EDGE_FLAG_EDGE_MARK) != 0; + ld->conf.use_intersections = (edge_types & LRT_EDGE_FLAG_INTERSECTION) != 0; + ld->conf.use_loose = (edge_types & LRT_EDGE_FLAG_LOOSE) != 0; + ld->conf.use_light_contour = ((edge_types & LRT_EDGE_FLAG_LIGHT_CONTOUR) != 0 && (lmd->light_contour_object != nullptr)); - ld->conf.use_shadow = ((edge_types & MOD_LINEART_EDGE_FLAG_PROJECTED_SHADOW) != 0 && + ld->conf.use_shadow = ((edge_types & LRT_EDGE_FLAG_PROJECTED_SHADOW) != 0 && (lmd->light_contour_object != nullptr)); ld->conf.shadow_selection = lmd->shadow_selection_override; ld->conf.shadow_enclose_shapes = lmd->shadow_selection_override == - LINEART_SHADOW_FILTER_ILLUMINATED_ENCLOSED_SHAPES; + LRT_SHADOW_FILTER_ILLUMINATED_ENCLOSED_SHAPES; ld->conf.shadow_use_silhouette = lmd->shadow_use_silhouette_override != 0; - ld->conf.use_back_face_culling = (lmd->calculation_flags & MOD_LINEART_USE_BACK_FACE_CULLING) != - 0; + ld->conf.use_back_face_culling = (lmd->calculation_flags & LRT_USE_BACK_FACE_CULLING) != 0; - ld->conf.filter_face_mark_invert = (lmd->calculation_flags & - MOD_LINEART_FILTER_FACE_MARK_INVERT) != 0; - ld->conf.filter_face_mark = (lmd->calculation_flags & MOD_LINEART_FILTER_FACE_MARK) != 0; + ld->conf.filter_face_mark_invert = (lmd->calculation_flags & LRT_FILTER_FACE_MARK_INVERT) != 0; + ld->conf.filter_face_mark = (lmd->calculation_flags & LRT_FILTER_FACE_MARK) != 0; ld->conf.filter_face_mark_boundaries = (lmd->calculation_flags & - MOD_LINEART_FILTER_FACE_MARK_BOUNDARIES) != 0; + LRT_FILTER_FACE_MARK_BOUNDARIES) != 0; ld->conf.filter_face_mark_keep_contour = (lmd->calculation_flags & - MOD_LINEART_FILTER_FACE_MARK_KEEP_CONTOUR) != 0; + LRT_FILTER_FACE_MARK_KEEP_CONTOUR) != 0; ld->chain_data_pool = &lc->chain_data_pool; @@ -4712,7 +4693,7 @@ static void lineart_create_edges_from_isec_data(LineartIsecData *d) e->t2 = is->tri2; /* This is so we can also match intersection edges from shadow to later viewing stage. */ e->edge_identifier = (uint64_t(e->t1->target_reference) << 32) | e->t2->target_reference; - e->flags = MOD_LINEART_EDGE_FLAG_INTERSECTION; + e->flags = LRT_EDGE_FLAG_INTERSECTION; e->intersection_mask = (is->tri1->intersection_mask | is->tri2->intersection_mask); BLI_addtail(&e->segments, es); @@ -4751,7 +4732,7 @@ void lineart_main_add_triangles(LineartData *ld) { double t_start; if (G.debug_value == 4000) { - t_start = BLI_time_now_seconds(); + t_start = BLI_check_seconds_timer(); } /* Initialize per-thread data for thread task scheduling information and storing intersection @@ -4774,7 +4755,7 @@ void lineart_main_add_triangles(LineartData *ld) lineart_destroy_isec_thread(&d); if (G.debug_value == 4000) { - double t_elapsed = BLI_time_now_seconds() - t_start; + double t_elapsed = BLI_check_seconds_timer() - t_start; printf("Line art intersection time: %f\n", t_elapsed); } } @@ -5029,10 +5010,10 @@ LineartBoundingArea *lineart_bounding_area_next(LineartBoundingArea *self, return nullptr; } -bool MOD_lineart_compute_feature_lines_v3(Depsgraph *depsgraph, - GreasePencilLineartModifierData &lmd, - LineartCache **cached_result, - bool enable_stroke_depth_offset) +bool MOD_lineart_compute_feature_lines(Depsgraph *depsgraph, + LineartGpencilModifierData *lmd, + LineartCache **cached_result, + bool enable_stroke_depth_offset) { LineartData *ld; Scene *scene = DEG_get_evaluated_scene(depsgraph); @@ -5041,13 +5022,13 @@ bool MOD_lineart_compute_feature_lines_v3(Depsgraph *depsgraph, double t_start; if (G.debug_value == 4000) { - t_start = BLI_time_now_seconds(); + t_start = BLI_check_seconds_timer(); } bool use_render_camera_override = false; - if (lmd.calculation_flags & MOD_LINEART_USE_CUSTOM_CAMERA) { - if (!lmd.source_camera || - (lineart_camera = DEG_get_evaluated_object(depsgraph, lmd.source_camera))->type != + if (lmd->calculation_flags & LRT_USE_CUSTOM_CAMERA) { + if (!lmd->source_camera || + (lineart_camera = DEG_get_evaluated_object(depsgraph, lmd->source_camera))->type != OB_CAMERA) { return false; @@ -5068,14 +5049,11 @@ bool MOD_lineart_compute_feature_lines_v3(Depsgraph *depsgraph, } } - LineartCache *lc = MOD_lineart_init_cache(); + LineartCache *lc = lineart_init_cache(); *cached_result = lc; - ld = lineart_create_render_buffer_v3(scene, - &lmd, - lineart_camera, - use_render_camera_override ? lineart_camera : scene->camera, - lc); + ld = lineart_create_render_buffer( + scene, lmd, lineart_camera, use_render_camera_override ? lineart_camera : scene->camera, lc); /* Triangle thread testing data size varies depending on the thread count. * See definition of LineartTriangleThread for details. */ @@ -5084,15 +5062,15 @@ bool MOD_lineart_compute_feature_lines_v3(Depsgraph *depsgraph, LineartData *shadow_rb = nullptr; LineartElementLinkNode *shadow_veln, *shadow_eeln; ListBase *shadow_elns = ld->conf.shadow_selection ? &lc->shadow_elns : nullptr; - bool shadow_generated = lineart_main_try_generate_shadow_v3(depsgraph, - scene, - ld, - &lmd, - &lc->shadow_data_pool, - &shadow_veln, - &shadow_eeln, - shadow_elns, - &shadow_rb); + bool shadow_generated = lineart_main_try_generate_shadow(depsgraph, + scene, + ld, + lmd, + &lc->shadow_data_pool, + &shadow_veln, + &shadow_eeln, + shadow_elns, + &shadow_rb); /* Get view vector before loading geometries, because we detect feature lines there. */ lineart_main_get_view_vector(ld); @@ -5101,7 +5079,7 @@ bool MOD_lineart_compute_feature_lines_v3(Depsgraph *depsgraph, scene, lineart_camera, ld, - lmd.calculation_flags & MOD_LINEART_ALLOW_DUPLI_OBJECTS, + lmd->calculation_flags & LRT_ALLOW_DUPLI_OBJECTS, false, shadow_elns); @@ -5190,9 +5168,9 @@ bool MOD_lineart_compute_feature_lines_v3(Depsgraph *depsgraph, MOD_lineart_chain_split_angle(ld, ld->conf.angle_splitting_threshold); } - if (enable_stroke_depth_offset && lmd.stroke_depth_offset > FLT_EPSILON) { + if (enable_stroke_depth_offset && lmd->stroke_depth_offset > FLT_EPSILON) { MOD_lineart_chain_offset_towards_camera( - ld, lmd.stroke_depth_offset, lmd.flags & MOD_LINEART_OFFSET_TOWARDS_CUSTOM_CAMERA); + ld, lmd->stroke_depth_offset, lmd->flags & LRT_GPENCIL_OFFSET_TOWARDS_CUSTOM_CAMERA); } if (ld->conf.shadow_use_silhouette) { @@ -5218,27 +5196,13 @@ bool MOD_lineart_compute_feature_lines_v3(Depsgraph *depsgraph, if (G.debug_value == 4000) { lineart_count_and_print_render_buffer_memory(ld); - double t_elapsed = BLI_time_now_seconds() - t_start; + double t_elapsed = BLI_check_seconds_timer() - t_start; printf("Line art total time: %lf\n", t_elapsed); } return true; } -bool MOD_lineart_compute_feature_lines(Depsgraph *depsgraph, - LineartGpencilModifierData *lmd_legacy, - LineartCache **cached_result, - bool enable_stroke_depth_offset) -{ - bool ret = false; - GreasePencilLineartModifierData lmd; - greasepencil::convert::lineart_wrap_v3(lmd_legacy, &lmd); - ret = MOD_lineart_compute_feature_lines_v3( - depsgraph, lmd, cached_result, enable_stroke_depth_offset); - greasepencil::convert::lineart_unwrap_v3(lmd_legacy, &lmd); - return ret; -} - static void lineart_gpencil_generate(LineartCache *cache, Depsgraph *depsgraph, Object *gpencil_object, @@ -5287,9 +5251,9 @@ static void lineart_gpencil_generate(LineartCache *cache, /* (!orig_col && !orig_ob) means the whole scene is selected. */ int enabled_types = cache->all_enabled_edge_types; - bool invert_input = modifier_calculation_flags & MOD_LINEART_INVERT_SOURCE_VGROUP; - bool match_output = modifier_calculation_flags & MOD_LINEART_MATCH_OUTPUT_VGROUP; - bool inverse_silhouette = modifier_flags & MOD_LINEART_INVERT_SILHOUETTE_FILTER; + bool invert_input = modifier_calculation_flags & LRT_GPENCIL_INVERT_SOURCE_VGROUP; + bool match_output = modifier_calculation_flags & LRT_GPENCIL_MATCH_OUTPUT_VGROUP; + bool inverse_silhouette = modifier_flags & LRT_GPENCIL_INVERT_SILHOUETTE_FILTER; LISTBASE_FOREACH (LineartEdgeChain *, ec, &cache->chains) { @@ -5307,18 +5271,18 @@ static void lineart_gpencil_generate(LineartCache *cache, } if (orig_col && ec->object_ref) { if (BKE_collection_has_object_recursive_instanced(orig_col, (Object *)ec->object_ref)) { - if (modifier_flags & MOD_LINEART_INVERT_COLLECTION) { + if (modifier_flags & LRT_GPENCIL_INVERT_COLLECTION) { continue; } } else { - if (!(modifier_flags & MOD_LINEART_INVERT_COLLECTION)) { + if (!(modifier_flags & LRT_GPENCIL_INVERT_COLLECTION)) { continue; } } } - if (mask_switches & MOD_LINEART_MATERIAL_MASK_ENABLE) { - if (mask_switches & MOD_LINEART_MATERIAL_MASK_MATCH) { + if (mask_switches & LRT_GPENCIL_MATERIAL_MASK_ENABLE) { + if (mask_switches & LRT_GPENCIL_MATERIAL_MASK_MATCH) { if (ec->material_mask_bits != material_mask_bits) { continue; } @@ -5329,8 +5293,8 @@ static void lineart_gpencil_generate(LineartCache *cache, } } } - if (ec->type & MOD_LINEART_EDGE_FLAG_INTERSECTION) { - if (mask_switches & MOD_LINEART_INTERSECTION_MATCH) { + if (ec->type & LRT_EDGE_FLAG_INTERSECTION) { + if (mask_switches & LRT_GPENCIL_INTERSECTION_MATCH) { if (ec->intersection_mask != intersection_mask) { continue; } @@ -5344,17 +5308,17 @@ static void lineart_gpencil_generate(LineartCache *cache, if (shaodow_selection) { if (ec->shadow_mask_bits != LRT_SHADOW_MASK_UNDEFINED) { /* TODO(@Yiming): Give a behavior option for how to display undefined shadow info. */ - if (shaodow_selection == LINEART_SHADOW_FILTER_ILLUMINATED && + if (shaodow_selection == LRT_SHADOW_FILTER_ILLUMINATED && !(ec->shadow_mask_bits & LRT_SHADOW_MASK_ILLUMINATED)) { continue; } - if (shaodow_selection == LINEART_SHADOW_FILTER_SHADED && + if (shaodow_selection == LRT_SHADOW_FILTER_SHADED && !(ec->shadow_mask_bits & LRT_SHADOW_MASK_SHADED)) { continue; } - if (shaodow_selection == LINEART_SHADOW_FILTER_ILLUMINATED_ENCLOSED_SHAPES) { + if (shaodow_selection == LRT_SHADOW_FILTER_ILLUMINATED_ENCLOSED_SHAPES) { uint32_t test_bits = ec->shadow_mask_bits & LRT_SHADOW_TEST_SHAPE_BITS; if ((test_bits != LRT_SHADOW_MASK_ILLUMINATED) && (test_bits != (LRT_SHADOW_MASK_SHADED | LRT_SHADOW_MASK_ILLUMINATED_SHAPE))) @@ -5364,7 +5328,7 @@ static void lineart_gpencil_generate(LineartCache *cache, } } } - if (silhouette_mode && (ec->type & (MOD_LINEART_EDGE_FLAG_CONTOUR))) { + if (silhouette_mode && (ec->type & (LRT_EDGE_FLAG_CONTOUR))) { bool is_silhouette = false; if (orig_col) { if (!ec->silhouette_backdrop) { @@ -5381,7 +5345,7 @@ static void lineart_gpencil_generate(LineartCache *cache, } } - if ((silhouette_mode == LINEART_SILHOUETTE_FILTER_INDIVIDUAL || orig_ob) && + if ((silhouette_mode == LRT_SILHOUETTE_FILTER_INDIVIDUAL || orig_ob) && ec->silhouette_backdrop != ec->object_ref) { is_silhouette = true; @@ -5470,11 +5434,6 @@ static void lineart_gpencil_generate(LineartCache *cache, } } -typedef struct LineartChainWriteInfo { - LineartEdgeChain *chain; - int point_count; -} LineartChainWriteInfo; - void MOD_lineart_gpencil_generate(LineartCache *cache, Depsgraph *depsgraph, Object *ob, @@ -5506,13 +5465,13 @@ void MOD_lineart_gpencil_generate(LineartCache *cache, Object *source_object = nullptr; Collection *source_collection = nullptr; int16_t use_types = edge_types; - if (source_type == LINEART_SOURCE_OBJECT) { + if (source_type == LRT_SOURCE_OBJECT) { if (!source_reference) { return; } source_object = (Object *)source_reference; } - else if (source_type == LINEART_SOURCE_COLLECTION) { + else if (source_type == LRT_SOURCE_COLLECTION) { if (!source_reference) { return; } @@ -5520,7 +5479,7 @@ void MOD_lineart_gpencil_generate(LineartCache *cache, } float gp_obmat_inverse[4][4]; - invert_m4_m4(gp_obmat_inverse, ob->object_to_world().ptr()); + invert_m4_m4(gp_obmat_inverse, ob->object_to_world); lineart_gpencil_generate(cache, depsgraph, ob, @@ -5545,268 +5504,3 @@ void MOD_lineart_gpencil_generate(LineartCache *cache, modifier_flags, modifier_calculation_flags); } - -void MOD_lineart_gpencil_generate_v3(const LineartCache *cache, - const blender::float4x4 &inverse_mat, - Depsgraph *depsgraph, - blender::bke::greasepencil::Drawing &drawing, - const int8_t source_type, - Object *source_object, - Collection *source_collection, - const int level_start, - const int level_end, - const int mat_nr, - const int16_t edge_types, - const uchar mask_switches, - const uchar material_mask_bits, - const uchar intersection_mask, - const float thickness, - const float opacity, - const uchar shadow_selection, - const uchar silhouette_mode, - const char *source_vgname, - const char *vgname, - const int modifier_flags, - const int modifier_calculation_flags) -{ - if (G.debug_value == 4000) { - printf("Line Art v3: Generating...\n"); - } - - if (cache == nullptr) { - if (G.debug_value == 4000) { - printf("nullptr Lineart cache!\n"); - } - return; - } - - Object *orig_ob = nullptr; - Collection *orig_col = nullptr; - - if (source_type == LINEART_SOURCE_OBJECT) { - if (!source_object) { - return; - } - orig_ob = source_object->id.orig_id ? (Object *)source_object->id.orig_id : source_object; - orig_col = nullptr; - } - else if (source_type == LINEART_SOURCE_COLLECTION) { - if (!source_collection) { - return; - } - orig_col = source_collection->id.orig_id ? (Collection *)source_collection->id.orig_id : - source_collection; - orig_ob = nullptr; - } - /* Otherwise the whole scene is selected. */ - - int enabled_types = cache->all_enabled_edge_types; - - bool invert_input = modifier_calculation_flags & MOD_LINEART_INVERT_SOURCE_VGROUP; - - bool inverse_silhouette = modifier_flags & MOD_LINEART_INVERT_SILHOUETTE_FILTER; - - blender::Vector writer; - writer.reserve(128); - int total_point_count = 0; - int stroke_count = 0; - LISTBASE_FOREACH (LineartEdgeChain *, ec, &cache->chains) { - - if (ec->picked) { - continue; - } - if (!(ec->type & (edge_types & enabled_types))) { - continue; - } - if (ec->level > level_end || ec->level < level_start) { - continue; - } - if (orig_ob && orig_ob != ec->object_ref) { - continue; - } - if (orig_col && ec->object_ref) { - if (BKE_collection_has_object_recursive_instanced(orig_col, (Object *)ec->object_ref)) { - if (modifier_flags & MOD_LINEART_INVERT_COLLECTION) { - continue; - } - } - else { - if (!(modifier_flags & MOD_LINEART_INVERT_COLLECTION)) { - continue; - } - } - } - if (mask_switches & MOD_LINEART_MATERIAL_MASK_ENABLE) { - if (mask_switches & MOD_LINEART_MATERIAL_MASK_MATCH) { - if (ec->material_mask_bits != material_mask_bits) { - continue; - } - } - else { - if (!(ec->material_mask_bits & material_mask_bits)) { - continue; - } - } - } - if (ec->type & MOD_LINEART_EDGE_FLAG_INTERSECTION) { - if (mask_switches & MOD_LINEART_INTERSECTION_MATCH) { - if (ec->intersection_mask != intersection_mask) { - continue; - } - } - else { - if ((intersection_mask) && !(ec->intersection_mask & intersection_mask)) { - continue; - } - } - } - if (shadow_selection) { - if (ec->shadow_mask_bits != LRT_SHADOW_MASK_UNDEFINED) { - /* TODO(@Yiming): Give a behavior option for how to display undefined shadow info. */ - if (shadow_selection == LINEART_SHADOW_FILTER_ILLUMINATED && - !(ec->shadow_mask_bits & LRT_SHADOW_MASK_ILLUMINATED)) - { - continue; - } - if (shadow_selection == LINEART_SHADOW_FILTER_SHADED && - !(ec->shadow_mask_bits & LRT_SHADOW_MASK_SHADED)) - { - continue; - } - if (shadow_selection == LINEART_SHADOW_FILTER_ILLUMINATED_ENCLOSED_SHAPES) { - uint32_t test_bits = ec->shadow_mask_bits & LRT_SHADOW_TEST_SHAPE_BITS; - if ((test_bits != LRT_SHADOW_MASK_ILLUMINATED) && - (test_bits != (LRT_SHADOW_MASK_SHADED | LRT_SHADOW_MASK_ILLUMINATED_SHAPE))) - { - continue; - } - } - } - } - if (silhouette_mode && (ec->type & (MOD_LINEART_EDGE_FLAG_CONTOUR))) { - bool is_silhouette = false; - if (orig_col) { - if (!ec->silhouette_backdrop) { - is_silhouette = true; - } - else if (!BKE_collection_has_object_recursive_instanced(orig_col, ec->silhouette_backdrop)) - { - is_silhouette = true; - } - } - else { - if ((!orig_ob) && (!ec->silhouette_backdrop)) { - is_silhouette = true; - } - } - - if ((silhouette_mode == LINEART_SILHOUETTE_FILTER_INDIVIDUAL || orig_ob) && - ec->silhouette_backdrop != ec->object_ref) - { - is_silhouette = true; - } - - if (inverse_silhouette) { - is_silhouette = !is_silhouette; - } - if (!is_silhouette) { - continue; - } - } - - /* Preserved: If we ever do asynchronous generation, this picked flag should be set here. */ - // ec->picked = 1; - - const int count = MOD_lineart_chain_count(ec); - if (count < 2) { - continue; - } - - total_point_count += count; - writer.append({ec, count}); - - stroke_count++; - } - - if (!total_point_count || !stroke_count) { - return; - } - - blender::bke::CurvesGeometry new_curves(total_point_count, stroke_count); - new_curves.fill_curve_types(CURVE_TYPE_POLY); - - MutableAttributeAccessor attributes = new_curves.attributes_for_write(); - MutableSpan point_positions = new_curves.positions_for_write(); - - SpanAttributeWriter point_radii = attributes.lookup_or_add_for_write_only_span( - "radius", AttrDomain::Point); - - SpanAttributeWriter point_opacities = attributes.lookup_or_add_for_write_span( - "opacity", AttrDomain::Point); - - SpanAttributeWriter stroke_materials = attributes.lookup_or_add_for_write_span( - "material_index", AttrDomain::Curve); - - MutableSpan offsets = new_curves.offsets_for_write(); - - SpanAttributeWriter vgroup_weights; - if (vgname) { - vgroup_weights = attributes.lookup_or_add_for_write_span(vgname, AttrDomain::Point); - } - - int up_to_point = 0; - for (int chain_i : writer.index_range()) { - LineartChainWriteInfo &cwi = writer[chain_i]; - - MDeformVert *src_dvert = nullptr; - int src_deform_group = -1; - Mesh *src_mesh = nullptr; - if (source_vgname && vgroup_weights) { - Object *eval_ob = DEG_get_evaluated_object(depsgraph, cwi.chain->object_ref); - if (eval_ob && eval_ob->type == OB_MESH) { - src_mesh = BKE_object_get_evaluated_mesh(eval_ob); - src_dvert = src_mesh->deform_verts_for_write().data(); - src_deform_group = BKE_id_defgroup_name_index(&src_mesh->id, source_vgname); - } - } - - int i; - LISTBASE_FOREACH_INDEX (LineartEdgeChainItem *, eci, &cwi.chain->chain, i) { - int point_i = i + up_to_point; - point_positions[point_i] = blender::math::transform_point(inverse_mat, float3(eci->gpos)); - point_radii.span[point_i] = thickness / 2.0f; - point_opacities.span[point_i] = opacity; - - if (src_deform_group >= 0) { - int vindex; - vindex = eci->index; - if (vindex >= src_mesh->verts_num) { - break; - } - MDeformWeight *mdw = BKE_defvert_ensure_index(&src_dvert[vindex], src_deform_group); - - vgroup_weights.span[point_i] = invert_input ? (1 - mdw->weight) : mdw->weight; - } - } - offsets[chain_i] = up_to_point; - stroke_materials.span[chain_i] = max_ii(mat_nr, 0); - up_to_point += cwi.point_count; - } - offsets[writer.index_range().last() + 1] = up_to_point; - - SpanAttributeWriter stroke_cyclic = attributes.lookup_or_add_for_write_span( - "cyclic", AttrDomain::Curve); - stroke_cyclic.span.fill(false); - stroke_cyclic.finish(); - - point_radii.finish(); - point_opacities.finish(); - stroke_materials.finish(); - - drawing.strokes_for_write() = std::move(new_curves); - drawing.tag_topology_changed(); - - if (G.debug_value == 4000) { - printf("LRT: Generated %d strokes.\n", stroke_count); - } -} diff --git a/source/blender/gpencil_modifiers_legacy/intern/lineart/lineart_intern.h b/source/blender/gpencil_modifiers_legacy/intern/lineart/lineart_intern.h index e2d616faf2e..169306da858 100644 --- a/source/blender/gpencil_modifiers_legacy/intern/lineart/lineart_intern.h +++ b/source/blender/gpencil_modifiers_legacy/intern/lineart/lineart_intern.h @@ -25,7 +25,6 @@ struct LineartEdge; struct LineartData; struct LineartStaticMemPool; struct LineartStaticMemPoolNode; -struct GreasePencilLineartModifierData; void *lineart_list_append_pointer_pool(ListBase *h, struct LineartStaticMemPool *smp, void *data); void *lineart_list_append_pointer_pool_sized(ListBase *h, @@ -160,21 +159,12 @@ void lineart_main_add_triangles(struct LineartData *ld); bool lineart_main_try_generate_shadow(struct Depsgraph *depsgraph, struct Scene *scene, struct LineartData *original_ld, - struct LineartGpencilModifierData *lmd_legacy, + struct LineartGpencilModifierData *lmd, struct LineartStaticMemPool *shadow_data_pool, struct LineartElementLinkNode **r_veln, struct LineartElementLinkNode **r_eeln, struct ListBase *r_calculated_edges_eln_list, struct LineartData **r_shadow_ld_if_reproject); -bool lineart_main_try_generate_shadow_v3(struct Depsgraph *depsgraph, - struct Scene *scene, - struct LineartData *original_ld, - struct GreasePencilLineartModifierData *lmd, - struct LineartStaticMemPool *shadow_data_pool, - struct LineartElementLinkNode **r_veln, - struct LineartElementLinkNode **r_eeln, - struct ListBase *r_calculated_edges_eln_list, - struct LineartData **r_shadow_ld_if_reproject); /** * Does the 3rd stage reprojection, will not re-load objects because #shadow_ld is not deleted. * Only re-projects view camera edges and check visibility in light camera, then we can determine diff --git a/source/blender/gpencil_modifiers_legacy/intern/lineart/lineart_ops.cc b/source/blender/gpencil_modifiers_legacy/intern/lineart/lineart_ops.cc index 5752a085a17..b421fe3c233 100644 --- a/source/blender/gpencil_modifiers_legacy/intern/lineart/lineart_ops.cc +++ b/source/blender/gpencil_modifiers_legacy/intern/lineart/lineart_ops.cc @@ -14,11 +14,11 @@ #include "BLI_utildefines.h" #include "BKE_context.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_gpencil_legacy.h" #include "BKE_gpencil_modifier_legacy.h" -#include "BKE_report.hh" -#include "BKE_scene.hh" +#include "BKE_report.h" +#include "BKE_scene.h" #include "DEG_depsgraph_query.hh" @@ -27,7 +27,6 @@ #include "DNA_gpencil_legacy_types.h" #include "DNA_gpencil_modifier_types.h" -#include "DNA_modifier_types.h" #include "DNA_scene_types.h" #include "MOD_gpencil_legacy_lineart.h" @@ -45,9 +44,9 @@ static bool lineart_mod_is_disabled(GpencilModifierData *md) /* Toggle on and off the baked flag as we are only interested in if something else is disabling * it. We can assume that the guard function has already toggled this on for all modifiers that * are sent here. */ - lmd->flags &= (~MOD_LINEART_IS_BAKED); + lmd->flags &= (~LRT_GPENCIL_IS_BAKED); bool disabled = info->is_disabled(md, false); - lmd->flags |= MOD_LINEART_IS_BAKED; + lmd->flags |= LRT_GPENCIL_IS_BAKED; return disabled; } @@ -108,7 +107,7 @@ static bool bake_strokes(Object *ob, MOD_lineart_destroy_render_data(lmd); } else { - if (is_first || !(lmd->flags & MOD_LINEART_USE_CACHE)) { + if (is_first || !(lmd->flags & LRT_GPENCIL_USE_CACHE)) { MOD_lineart_compute_feature_lines(dg, lmd, &local_lc, !(ob->dtx & OB_DRAW_IN_FRONT)); MOD_lineart_destroy_render_data(lmd); } @@ -123,8 +122,8 @@ static bool bake_strokes(Object *ob, gpl, gpf, lmd->source_type, - lmd->source_type == LINEART_SOURCE_OBJECT ? (void *)lmd->source_object : - (void *)lmd->source_collection, + lmd->source_type == LRT_SOURCE_OBJECT ? (void *)lmd->source_object : + (void *)lmd->source_collection, lmd->level_start, lmd->use_multiple_levels ? lmd->level_end : lmd->level_start, lmd->target_material ? BKE_gpencil_object_material_index_get(ob, lmd->target_material) : 0, @@ -141,7 +140,7 @@ static bool bake_strokes(Object *ob, lmd->flags, lmd->calculation_flags); - if (!(lmd->flags & MOD_LINEART_USE_CACHE)) { + if (!(lmd->flags & LRT_GPENCIL_USE_CACHE)) { /* Clear local cache. */ if (!is_first) { MOD_lineart_clear_cache(&local_lc); @@ -214,7 +213,7 @@ static void lineart_gpencil_guard_modifiers(LineartBakeJob *bj) LISTBASE_FOREACH (GpencilModifierData *, md, &ob->greasepencil_modifiers) { if (md->type == eGpencilModifierType_Lineart) { LineartGpencilModifierData *lmd = (LineartGpencilModifierData *)md; - lmd->flags |= MOD_LINEART_IS_BAKED; + lmd->flags |= LRT_GPENCIL_IS_BAKED; } } } @@ -403,7 +402,7 @@ static void lineart_gpencil_clear_strokes_exec_common(Object *ob) md->mode |= eGpencilModifierMode_Realtime | eGpencilModifierMode_Render; - lmd->flags &= (~MOD_LINEART_IS_BAKED); + lmd->flags &= (~LRT_GPENCIL_IS_BAKED); } DEG_id_tag_update((ID *)ob->data, ID_RECALC_GEOMETRY); } diff --git a/source/blender/gpencil_modifiers_legacy/intern/lineart/lineart_shadow.cc b/source/blender/gpencil_modifiers_legacy/intern/lineart/lineart_shadow.cc index b007d866eff..87cb77077d9 100644 --- a/source/blender/gpencil_modifiers_legacy/intern/lineart/lineart_shadow.cc +++ b/source/blender/gpencil_modifiers_legacy/intern/lineart/lineart_shadow.cc @@ -11,19 +11,26 @@ #include "lineart_intern.h" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_gpencil_modifier_legacy.h" -#include "BKE_grease_pencil.hh" -#include "BKE_grease_pencil_legacy_convert.hh" +#include "BKE_lib_id.hh" +#include "BKE_material.h" #include "BKE_object.hh" +#include "BKE_scene.h" #include "BLI_math_matrix.h" #include "BLI_math_rotation.h" #include "BLI_task.h" #include "BLI_time.h" +#include "DEG_depsgraph_query.hh" + +#include "DNA_collection_types.h" +#include "DNA_gpencil_legacy_types.h" #include "DNA_light_types.h" +#include "DNA_material_types.h" #include "DNA_modifier_types.h" +#include "DNA_scene_types.h" #include "MEM_guardedalloc.h" @@ -54,7 +61,7 @@ LineartEdge *lineart_find_matching_edge(LineartElementLinkNode *shadow_eln, static bool lineart_contour_viewed_from_dark_side(LineartData *ld, LineartEdge *e) { - if (!(e->flags & (MOD_LINEART_EDGE_FLAG_CONTOUR | MOD_LINEART_EDGE_FLAG_CONTOUR_SECONDARY))) { + if (!(e->flags & (LRT_EDGE_FLAG_CONTOUR | LRT_EDGE_FLAG_CONTOUR_SECONDARY))) { return false; } double view_vector[3]; @@ -310,9 +317,9 @@ static void lineart_shadow_create_shadow_edge_array(LineartData *ld, /* Count and allocate at once to save time. */ int segment_count = 0; - uint16_t accept_types = (MOD_LINEART_EDGE_FLAG_CONTOUR | MOD_LINEART_EDGE_FLAG_LOOSE); + uint16_t accept_types = (LRT_EDGE_FLAG_CONTOUR | LRT_EDGE_FLAG_LOOSE); if (do_light_contour) { - accept_types |= MOD_LINEART_EDGE_FLAG_LIGHT_CONTOUR; + accept_types |= LRT_EDGE_FLAG_LIGHT_CONTOUR; } LRT_ITER_ALL_LINES_BEGIN { @@ -322,11 +329,11 @@ static void lineart_shadow_create_shadow_edge_array(LineartData *ld, if (!(e->flags & accept_types)) { continue; } - if (e->flags == MOD_LINEART_EDGE_FLAG_LIGHT_CONTOUR) { + if (e->flags == LRT_EDGE_FLAG_LIGHT_CONTOUR) { /* Check if the light contour also doubles as a view contour. */ LineartEdge *orig_e = (LineartEdge *)e->t1; if (!orig_e->t2) { - e->flags |= MOD_LINEART_EDGE_FLAG_CONTOUR; + e->flags |= LRT_EDGE_FLAG_CONTOUR; } else { double vv[3]; @@ -346,10 +353,10 @@ static void lineart_shadow_create_shadow_edge_array(LineartData *ld, if ((result = dot_1 * dot_2) <= 0 && (dot_1 + dot_2)) { /* If this edge is both a light contour and a view contour, mark it for the convenience * of generating it in the next iteration. */ - e->flags |= MOD_LINEART_EDGE_FLAG_CONTOUR; + e->flags |= LRT_EDGE_FLAG_CONTOUR; } } - if (!(e->flags & MOD_LINEART_EDGE_FLAG_CONTOUR)) { + if (!(e->flags & LRT_EDGE_FLAG_CONTOUR)) { continue; } } @@ -371,7 +378,7 @@ static void lineart_shadow_create_shadow_edge_array(LineartData *ld, int i = 0; LRT_ITER_ALL_LINES_BEGIN { - if (!(e->flags & (MOD_LINEART_EDGE_FLAG_CONTOUR | MOD_LINEART_EDGE_FLAG_LOOSE))) { + if (!(e->flags & (LRT_EDGE_FLAG_CONTOUR | LRT_EDGE_FLAG_LOOSE))) { continue; } LISTBASE_FOREACH (LineartEdgeSegment *, es, &e->segments) { @@ -406,12 +413,12 @@ static void lineart_shadow_create_shadow_edge_array(LineartData *ld, BLI_addtail(&sedge[i].shadow_segments, &sseg[i * 2]); BLI_addtail(&sedge[i].shadow_segments, &sseg[i * 2 + 1]); - if (e->flags & MOD_LINEART_EDGE_FLAG_LIGHT_CONTOUR) { + if (e->flags & LRT_EDGE_FLAG_LIGHT_CONTOUR) { sedge[i].e_ref = (LineartEdge *)e->t1; sedge[i].e_ref_light_contour = e; /* Restore original edge flag for edges "who is both view and light contour" so we still * have correct edge flags. */ - e->flags &= (~MOD_LINEART_EDGE_FLAG_CONTOUR); + e->flags &= (~LRT_EDGE_FLAG_CONTOUR); } else { sedge[i].e_ref = e; @@ -1014,10 +1021,9 @@ static bool lineart_shadow_cast_generate_edges(LineartData *ld, sedge->e_ref); e->target_reference = sseg->target_reference; e->edge_identifier = sedge->e_ref->edge_identifier; - e->flags = (MOD_LINEART_EDGE_FLAG_PROJECTED_SHADOW | - ((sseg->flag & LRT_SHADOW_FACING_LIGHT) ? - MOD_LINEART_EDGE_FLAG_SHADOW_FACING_LIGHT : - 0)); + e->flags = (LRT_EDGE_FLAG_PROJECTED_SHADOW | + ((sseg->flag & LRT_SHADOW_FACING_LIGHT) ? LRT_EDGE_FLAG_SHADOW_FACING_LIGHT : + 0)); ei++; } if (do_original_edges) { @@ -1036,7 +1042,7 @@ static bool lineart_shadow_cast_generate_edges(LineartData *ld, e->v1 = v1; e->v2 = v2; e->t1 = e->t2 = (LineartTriangle *)sedge->e_ref; - e->flags = MOD_LINEART_EDGE_FLAG_LIGHT_CONTOUR; + e->flags = LRT_EDGE_FLAG_LIGHT_CONTOUR; if (lineart_contour_viewed_from_dark_side(ld, sedge->e_ref)) { lineart_edge_cut(ld, e, 0.0f, 1.0f, 0, 0, LRT_SHADOW_MASK_SHADED); } @@ -1132,15 +1138,15 @@ static void lineart_shadow_register_enclosed_shapes(LineartData *ld, LineartData } } -bool lineart_main_try_generate_shadow_v3(Depsgraph *depsgraph, - Scene *scene, - LineartData *original_ld, - GreasePencilLineartModifierData *lmd, - LineartStaticMemPool *shadow_data_pool, - LineartElementLinkNode **r_veln, - LineartElementLinkNode **r_eeln, - ListBase *r_calculated_edges_eln_list, - LineartData **r_shadow_ld_if_reproject) +bool lineart_main_try_generate_shadow(Depsgraph *depsgraph, + Scene *scene, + LineartData *original_ld, + LineartGpencilModifierData *lmd, + LineartStaticMemPool *shadow_data_pool, + LineartElementLinkNode **r_veln, + LineartElementLinkNode **r_eeln, + ListBase *r_calculated_edges_eln_list, + LineartData **r_shadow_ld_if_reproject) { if ((!original_ld->conf.use_shadow && !original_ld->conf.use_light_contour && !original_ld->conf.shadow_selection) || @@ -1151,7 +1157,7 @@ bool lineart_main_try_generate_shadow_v3(Depsgraph *depsgraph, double t_start; if (G.debug_value == 4000) { - t_start = BLI_time_now_seconds(); + t_start = BLI_check_seconds_timer(); } bool is_persp = true; @@ -1185,7 +1191,7 @@ bool lineart_main_try_generate_shadow_v3(Depsgraph *depsgraph, copy_v3_v3_db(ld->conf.camera_pos_secondary, ld->conf.camera_pos); copy_m4_m4(ld->conf.cam_obmat_secondary, ld->conf.cam_obmat); - copy_m4_m4(ld->conf.cam_obmat, lmd->light_contour_object->object_to_world().ptr()); + copy_m4_m4(ld->conf.cam_obmat, lmd->light_contour_object->object_to_world); copy_v3db_v3fl(ld->conf.camera_pos, ld->conf.cam_obmat[3]); ld->conf.cam_is_persp_secondary = ld->conf.cam_is_persp; ld->conf.cam_is_persp = is_persp; @@ -1241,7 +1247,7 @@ bool lineart_main_try_generate_shadow_v3(Depsgraph *depsgraph, lineart_main_get_view_vector(ld); lineart_main_load_geometries( - depsgraph, scene, nullptr, ld, lmd->flags & MOD_LINEART_ALLOW_DUPLI_OBJECTS, true, nullptr); + depsgraph, scene, nullptr, ld, lmd->flags & LRT_ALLOW_DUPLI_OBJECTS, true, nullptr); if (!ld->geom.vertex_buffer_pointers.first) { /* No geometry loaded, return early. */ @@ -1283,39 +1289,13 @@ bool lineart_main_try_generate_shadow_v3(Depsgraph *depsgraph, } if (G.debug_value == 4000) { - double t_elapsed = BLI_time_now_seconds() - t_start; + double t_elapsed = BLI_check_seconds_timer() - t_start; printf("Line art shadow stage 1 time: %f\n", t_elapsed); } return any_generated; } -bool lineart_main_try_generate_shadow(Depsgraph *depsgraph, - Scene *scene, - LineartData *original_ld, - LineartGpencilModifierData *lmd_legacy, - LineartStaticMemPool *shadow_data_pool, - LineartElementLinkNode **r_veln, - LineartElementLinkNode **r_eeln, - ListBase *r_calculated_edges_eln_list, - LineartData **r_shadow_ld_if_reproject) -{ - bool ret = false; - GreasePencilLineartModifierData lmd; - blender::bke::greasepencil::convert::lineart_wrap_v3(lmd_legacy, &lmd); - ret = lineart_main_try_generate_shadow_v3(depsgraph, - scene, - original_ld, - &lmd, - shadow_data_pool, - r_veln, - r_eeln, - r_calculated_edges_eln_list, - r_shadow_ld_if_reproject); - blender::bke::greasepencil::convert::lineart_unwrap_v3(lmd_legacy, &lmd); - return ret; -} - struct LineartShadowFinalizeData { LineartData *ld; LineartVert *v; @@ -1340,7 +1320,7 @@ static void lineart_shadow_finalize_shadow_edges_task(void *__restrict userdata, LineartData *ld = data->ld; LineartEdge *e = data->e; - if (e[i].flags & MOD_LINEART_EDGE_FLAG_LIGHT_CONTOUR) { + if (e[i].flags & LRT_EDGE_FLAG_LIGHT_CONTOUR) { LineartElementLinkNode *eln = lineart_find_matching_eln( &ld->geom.vertex_buffer_pointers, e[i].edge_identifier & LRT_OBINDEX_HIGHER); if (eln) { @@ -1393,7 +1373,7 @@ void lineart_main_make_enclosed_shapes(LineartData *ld, LineartData *shadow_ld) { double t_start; if (G.debug_value == 4000) { - t_start = BLI_time_now_seconds(); + t_start = BLI_check_seconds_timer(); } if (shadow_ld || ld->conf.shadow_use_silhouette) { @@ -1404,7 +1384,7 @@ void lineart_main_make_enclosed_shapes(LineartData *ld, LineartData *shadow_ld) } if (G.debug_value == 4000) { - double t_elapsed = BLI_time_now_seconds() - t_start; + double t_elapsed = BLI_check_seconds_timer() - t_start; printf("Line art shadow stage 2 cast and silhouette time: %f\n", t_elapsed); } @@ -1453,7 +1433,7 @@ void lineart_main_make_enclosed_shapes(LineartData *ld, LineartData *shadow_ld) lineart_shadow_register_enclosed_shapes(ld, shadow_ld); if (G.debug_value == 4000) { - double t_elapsed = BLI_time_now_seconds() - t_start; + double t_elapsed = BLI_check_seconds_timer() - t_start; printf("Line art shadow stage 2 total time: %f\n", t_elapsed); } } diff --git a/source/blender/gpu/CMakeLists.txt b/source/blender/gpu/CMakeLists.txt index c6d0f299436..b265fab17b4 100644 --- a/source/blender/gpu/CMakeLists.txt +++ b/source/blender/gpu/CMakeLists.txt @@ -108,7 +108,7 @@ set(SRC GPU_state.h GPU_storage_buffer.h GPU_texture.h - GPU_uniform_buffer.hh + GPU_uniform_buffer.h GPU_vertex_buffer.h GPU_vertex_format.h GPU_viewport.h @@ -590,9 +590,6 @@ set(GLSL_SRC shaders/gpu_shader_cfg_world_clip_lib.glsl shaders/gpu_shader_colorspace_lib.glsl - shaders/gpu_shader_index_2d_array_points.glsl - shaders/gpu_shader_index_2d_array_lines.glsl - shaders/gpu_shader_index_2d_array_tris.glsl GPU_shader_shared_utils.h ) @@ -760,7 +757,6 @@ set(SRC_SHADER_CREATE_INFOS shaders/infos/gpu_shader_3D_uniform_color_info.hh shaders/infos/gpu_shader_gpencil_stroke_info.hh shaders/infos/gpu_shader_icon_info.hh - shaders/infos/gpu_shader_index_info.hh shaders/infos/gpu_shader_instance_varying_color_varying_size_info.hh shaders/infos/gpu_shader_keyframe_shape_info.hh shaders/infos/gpu_shader_line_dashed_uniform_color_info.hh diff --git a/source/blender/gpu/GPU_batch.h b/source/blender/gpu/GPU_batch.h index 1c8d79637f9..83cbf38c574 100644 --- a/source/blender/gpu/GPU_batch.h +++ b/source/blender/gpu/GPU_batch.h @@ -23,7 +23,7 @@ #include "GPU_index_buffer.h" #include "GPU_shader.h" #include "GPU_storage_buffer.h" -#include "GPU_uniform_buffer.hh" +#include "GPU_uniform_buffer.h" #include "GPU_vertex_buffer.h" #define GPU_BATCH_VBO_MAX_LEN 16 diff --git a/source/blender/gpu/GPU_capabilities.h b/source/blender/gpu/GPU_capabilities.h index dd56b0a34a6..cb0167ddc34 100644 --- a/source/blender/gpu/GPU_capabilities.h +++ b/source/blender/gpu/GPU_capabilities.h @@ -25,7 +25,6 @@ int GPU_max_textures(void); int GPU_max_textures_vert(void); int GPU_max_textures_geom(void); int GPU_max_textures_frag(void); -int GPU_max_images(void); int GPU_max_work_group_count(int index); int GPU_max_work_group_size(int index); int GPU_max_uniforms_vert(void); diff --git a/source/blender/gpu/GPU_debug.h b/source/blender/gpu/GPU_debug.h index 04da14ff595..b5def134367 100644 --- a/source/blender/gpu/GPU_debug.h +++ b/source/blender/gpu/GPU_debug.h @@ -16,7 +16,7 @@ * #include "GPU_debug.h" * static void do_render_engine(Render *re) * { - * GPU_debug_capture_begin(__func__); + * GPU_debug_capture_begin(); * RE_engine_render(re, false); * GPU_debug_capture_end(); * } @@ -68,10 +68,8 @@ bool GPU_debug_group_match(const char *ref); * GPU Frame capture support. * * Allows instantaneous frame capture of GPU calls between begin/end. - * - * \param title: Optional title to set for the frame capture. */ -void GPU_debug_capture_begin(const char *title); +void GPU_debug_capture_begin(void); void GPU_debug_capture_end(void); /** diff --git a/source/blender/gpu/GPU_index_buffer.h b/source/blender/gpu/GPU_index_buffer.h index d8d33ddc841..ff22c653ab9 100644 --- a/source/blender/gpu/GPU_index_buffer.h +++ b/source/blender/gpu/GPU_index_buffer.h @@ -72,10 +72,6 @@ void GPU_indexbuf_build_in_place(GPUIndexBufBuilder *, GPUIndexBuf *); void GPU_indexbuf_bind_as_ssbo(GPUIndexBuf *elem, int binding); -GPUIndexBuf *GPU_indexbuf_build_curves_on_device(GPUPrimType prim_type, - uint curves_num, - uint verts_per_curve); - /* Upload data to the GPU (if not built on the device) and bind the buffer to its default target. */ void GPU_indexbuf_use(GPUIndexBuf *elem); diff --git a/source/blender/gpu/GPU_material.hh b/source/blender/gpu/GPU_material.hh index e6f9ad01bab..e0d1d5ed169 100644 --- a/source/blender/gpu/GPU_material.hh +++ b/source/blender/gpu/GPU_material.hh @@ -8,8 +8,6 @@ #pragma once -#include - #include "DNA_customdata_types.h" /* for eCustomDataType */ #include "DNA_image_types.h" #include "DNA_listBase.h" @@ -73,7 +71,6 @@ enum eGPUMaterialFlag { GPU_MATFLAG_HOLDOUT = (1 << 6), GPU_MATFLAG_SHADER_TO_RGBA = (1 << 7), GPU_MATFLAG_AO = (1 << 8), - /* Signals the presence of multiple reflection closures. */ GPU_MATFLAG_COAT = (1 << 9), GPU_MATFLAG_TRANSLUCENT = (1 << 10), @@ -133,14 +130,14 @@ enum eGPUDefaultValue { }; struct GPUCodegenOutput { - std::string attr_load; + char *attr_load; /* Node-tree functions calls. */ - std::string displacement; - std::string surface; - std::string volume; - std::string thickness; - std::string composite; - std::string material_functions; + char *displacement; + char *surface; + char *volume; + char *thickness; + char *composite; + char *material_functions; GPUShaderCreateInfo *create_info; }; diff --git a/source/blender/gpu/GPU_select.hh b/source/blender/gpu/GPU_select.hh index fd1d9de1610..72f7396d918 100644 --- a/source/blender/gpu/GPU_select.hh +++ b/source/blender/gpu/GPU_select.hh @@ -70,20 +70,20 @@ void GPU_select_begin_next(GPUSelectBuffer *buffer, * \warning We rely on the order of object rendering on passes to be the same for this to work. */ bool GPU_select_load_id(unsigned int id); -void GPU_select_finalize(); +void GPU_select_finalize(void); /** * Cleanup and flush selection results to buffer. * Return number of hits and hits in buffer. * if \a dopass is true, we will do a second pass with occlusion queries to get the closest hit. */ -unsigned int GPU_select_end(); +unsigned int GPU_select_end(void); /* Cache selection region. */ -bool GPU_select_is_cached(); -void GPU_select_cache_begin(); -void GPU_select_cache_load_id(); -void GPU_select_cache_end(); +bool GPU_select_is_cached(void); +void GPU_select_cache_begin(void); +void GPU_select_cache_load_id(void); +void GPU_select_cache_end(void); /* Utilities. */ diff --git a/source/blender/gpu/GPU_shader.h b/source/blender/gpu/GPU_shader.h index 556513c25fa..1498542a084 100644 --- a/source/blender/gpu/GPU_shader.h +++ b/source/blender/gpu/GPU_shader.h @@ -333,13 +333,13 @@ typedef enum { int GPU_shader_get_builtin_uniform(GPUShader *shader, int builtin); /** - * Compile all statically defined shaders and print a report to the console. + * Compile all staticly defined shaders and print a report to the console. * * This is used for platform support, where bug reports can list all failing shaders. */ void GPU_shader_compile_static(); -/** DEPRECATED: Use hard-coded buffer location instead. */ +/** DEPRECATED: Use hardcoded buffer location instead. */ typedef enum { GPU_UNIFORM_BLOCK_VIEW = 0, /* viewBlock */ GPU_UNIFORM_BLOCK_MODEL, /* modelBlock */ @@ -353,7 +353,7 @@ typedef enum { GPU_NUM_UNIFORM_BLOCKS, /* Special value, denotes number of builtin uniforms block. */ } GPUUniformBlockBuiltin; -/** DEPRECATED: Use hard-coded buffer location instead. */ +/** DEPRECATED: Use hardcoded buffer location instead. */ int GPU_shader_get_builtin_block(GPUShader *shader, int builtin); /** DEPRECATED: Kept only because of Python GPU API. */ diff --git a/source/blender/gpu/GPU_shader_builtin.h b/source/blender/gpu/GPU_shader_builtin.h index 2b3cfbe7e1e..d369d7a9017 100644 --- a/source/blender/gpu/GPU_shader_builtin.h +++ b/source/blender/gpu/GPU_shader_builtin.h @@ -79,11 +79,6 @@ typedef enum eGPUBuiltinShader { /** Draw wide lines with uniform color. Has an additional clip plane parameter. */ GPU_SHADER_3D_POLYLINE_CLIPPED_UNIFORM_COLOR, - /** Compute shaders to generate 2d index buffers (mainly for curve drawing). */ - GPU_SHADER_INDEXBUF_POINTS, - GPU_SHADER_INDEXBUF_LINES, - GPU_SHADER_INDEXBUF_TRIS, - /** * ----------------------- Shaders exposed through pyGPU module ----------------------- * diff --git a/source/blender/gpu/GPU_shader_shared.h b/source/blender/gpu/GPU_shader_shared.h index 3524e8e35af..0d428eeaf25 100644 --- a/source/blender/gpu/GPU_shader_shared.h +++ b/source/blender/gpu/GPU_shader_shared.h @@ -37,8 +37,8 @@ struct NodeLinkData { /* bezierPts Is actually a float2, but due to std140 each element needs to be aligned to 16 * bytes. */ float4 bezierPts[4]; - bool32_t doArrow; - bool32_t doMuted; + bool1 doArrow; + bool1 doMuted; float dim_factor; float thickness; float4 dash_params; @@ -64,8 +64,8 @@ struct GPencilStrokeData { int xraymode; int caps_start; int caps_end; - bool32_t keep_size; - bool32_t fill_stroke; + bool1 keep_size; + bool1 fill_stroke; float2 _pad; }; BLI_STATIC_ASSERT_ALIGN(struct GPencilStrokeData, 16) diff --git a/source/blender/gpu/GPU_shader_shared_utils.h b/source/blender/gpu/GPU_shader_shared_utils.h index fcee5e223f5..e605b0d4f84 100644 --- a/source/blender/gpu/GPU_shader_shared_utils.h +++ b/source/blender/gpu/GPU_shader_shared_utils.h @@ -25,19 +25,15 @@ * * IMPORTANT: Do not forget to align mat4, vec3 and vec4 to 16 bytes, and vec2 to 8 bytes. * - * NOTE: You can use bool type using bool32_t a int boolean type matching the GLSL type. + * NOTE: You can use bool type using bool1 a int boolean type matching the GLSL type. */ #ifdef GPU_SHADER -/* Silence macros when compiling for shaders. */ # define BLI_STATIC_ASSERT(cond, msg) # define BLI_STATIC_ASSERT_ALIGN(type_, align_) # define BLI_STATIC_ASSERT_SIZE(type_, size_) -# define ENUM_OPERATORS(a, b) -/* Incompatible keywords. */ # define static # define inline -/* Math function renaming. */ # define cosf cos # define sinf sin # define tanf tan @@ -49,43 +45,71 @@ # define sqrtf sqrt # define expf exp +# define bool1 bool +/* Type name collision with Metal shading language - These type-names are already defined. */ +# ifndef GPU_METAL +# define float2 vec2 +# define float3 vec3 +# define float3x4 mat3x4 +# define float4 vec4 +# define float4x4 mat4 +# define int2 ivec2 +# define int3 ivec3 +# define int4 ivec4 +# define uint2 uvec2 +# define uint3 uvec3 +# define uint4 uvec4 +# define bool2 bvec2 +# define bool3 bvec3 +# define bool4 bvec4 +# define packed_float3 vec3 +# define packed_int3 int3 +# endif + #else /* C / C++ */ # pragma once # include "BLI_assert.h" -# include "BLI_math_matrix_types.hh" -# include "BLI_math_vector_types.hh" - -using bool32_t = int32_t; -// using bool2 = blender::int2; /* Size is not consistent across backend. */ -// using bool3 = blender::int3; /* Size is not consistent across backend. */ -// using bool4 = blender::int4; /* Size is not consistent across backend. */ - +# ifdef __cplusplus +# include "BLI_math_matrix_types.hh" +# include "BLI_math_vector_types.hh" using blender::float2; +using blender::float3; +using blender::float3x4; using blender::float4; +using blender::float4x4; using blender::int2; +using blender::int3; using blender::int4; using blender::uint2; -using blender::uint4; -/** IMPORTANT: Do not use in shared struct. Use packed_(float/int/uint)3 instead. - * Here for static functions usage only. */ -using blender::float3; -using blender::int3; using blender::uint3; -/** Packed types are needed for MSL which have different alignment rules for float3. */ +using blender::uint4; +using bool1 = int; +using bool2 = blender::int2; +using bool3 = blender::int3; +using bool4 = blender::int4; using packed_float3 = blender::float3; using packed_int3 = blender::int3; -using packed_uint3 = blender::uint3; -using blender::float2x2; -// using blender::float3x2; /* Does not follow alignment rules of GPU. */ -using blender::float4x2; -// using blender::float2x3; /* Does not follow alignment rules of GPU. */ -// using blender::float3x3; /* Does not follow alignment rules of GPU. */ -// using blender::float4x3; /* Does not follow alignment rules of GPU. */ -using blender::float2x4; -using blender::float3x4; -using blender::float4x4; +# else /* C */ +typedef float float2[2]; +typedef float float3[3]; +typedef float float4[4]; +typedef float float4x4[4][4]; +typedef float float3x4[3][4]; +typedef int int2[2]; +typedef int int3[2]; +typedef int int4[4]; +typedef uint uint2[2]; +typedef uint uint3[3]; +typedef uint uint4[4]; +typedef int bool1; +typedef int bool2[2]; +typedef int bool3[2]; +typedef int bool4[4]; +typedef float3 packed_float3; +typedef int3 packed_int3; +# endif #endif diff --git a/source/blender/gpu/GPU_storage_buffer.h b/source/blender/gpu/GPU_storage_buffer.h index 2f29333e45d..e9f6084b1cf 100644 --- a/source/blender/gpu/GPU_storage_buffer.h +++ b/source/blender/gpu/GPU_storage_buffer.h @@ -63,8 +63,9 @@ void GPU_storagebuf_sync_to_host(GPUStorageBuf *ssbo); * If pending GPU updates to the storage buffer are not yet visible to the host, the command will * stall until dependent GPU work has completed. * - * Otherwise, this command is synchronized against this call and will stall the CPU until the - * buffer content can be read by the host. + * Otherwise, this command is unsynchronized and will return current visible storage buffer + * contents immediately. + * Alternatively, use appropriate barrier or GPU_finish before reading. */ void GPU_storagebuf_read(GPUStorageBuf *ssbo, void *data); diff --git a/source/blender/gpu/GPU_uniform_buffer.hh b/source/blender/gpu/GPU_uniform_buffer.h similarity index 85% rename from source/blender/gpu/GPU_uniform_buffer.hh rename to source/blender/gpu/GPU_uniform_buffer.h index 2d691ee0046..98f16a76dc2 100644 --- a/source/blender/gpu/GPU_uniform_buffer.hh +++ b/source/blender/gpu/GPU_uniform_buffer.h @@ -15,10 +15,14 @@ #pragma once +#ifdef __cplusplus +extern "C" { +#endif + struct ListBase; /** Opaque type hiding blender::gpu::UniformBuf. */ -struct GPUUniformBuf; +typedef struct GPUUniformBuf GPUUniformBuf; GPUUniformBuf *GPU_uniformbuf_create_ex(size_t size, const void *data, const char *name); /** @@ -27,7 +31,7 @@ GPUUniformBuf *GPU_uniformbuf_create_ex(size_t size, const void *data, const cha * * \param inputs: ListBase of #BLI_genericNodeN(#GPUInput). */ -GPUUniformBuf *GPU_uniformbuf_create_from_list(ListBase *inputs, const char *name); +GPUUniformBuf *GPU_uniformbuf_create_from_list(struct ListBase *inputs, const char *name); #define GPU_uniformbuf_create(size) GPU_uniformbuf_create_ex(size, NULL, __func__); @@ -38,7 +42,7 @@ void GPU_uniformbuf_update(GPUUniformBuf *ubo, const void *data); void GPU_uniformbuf_bind(GPUUniformBuf *ubo, int slot); void GPU_uniformbuf_bind_as_ssbo(GPUUniformBuf *ubo, int slot); void GPU_uniformbuf_unbind(GPUUniformBuf *ubo); -void GPU_uniformbuf_unbind_all(); +void GPU_uniformbuf_unbind_all(void); void GPU_uniformbuf_clear_to_zero(GPUUniformBuf *ubo); @@ -46,3 +50,7 @@ void GPU_uniformbuf_clear_to_zero(GPUUniformBuf *ubo); #define GPU_ATTRIBUTE_UBO_BLOCK_NAME "unf_attrs" #define GPU_LAYER_ATTRIBUTE_UBO_BLOCK_NAME "drw_layer_attrs" #define GPU_NODE_TREE_UBO_SLOT 0 + +#ifdef __cplusplus +} +#endif diff --git a/source/blender/gpu/dummy/dummy_context.hh b/source/blender/gpu/dummy/dummy_context.hh index f9e2cc0a3bf..73d8bbe2084 100644 --- a/source/blender/gpu/dummy/dummy_context.hh +++ b/source/blender/gpu/dummy/dummy_context.hh @@ -32,7 +32,7 @@ class DummyContext : public Context { void debug_group_begin(const char *, int) override {} void debug_group_end() override {} - bool debug_capture_begin(const char * /*title*/) override + bool debug_capture_begin() override { return false; } diff --git a/source/blender/gpu/intern/gpu_capabilities.cc b/source/blender/gpu/intern/gpu_capabilities.cc index dfcc2cf584a..f9716bb5777 100644 --- a/source/blender/gpu/intern/gpu_capabilities.cc +++ b/source/blender/gpu/intern/gpu_capabilities.cc @@ -71,11 +71,6 @@ int GPU_max_textures() return GCaps.max_textures; } -int GPU_max_images() -{ - return GCaps.max_images; -} - int GPU_max_work_group_count(int index) { return GCaps.max_work_group_count[index]; diff --git a/source/blender/gpu/intern/gpu_capabilities_private.hh b/source/blender/gpu/intern/gpu_capabilities_private.hh index 315953ab08a..234dc954d4c 100644 --- a/source/blender/gpu/intern/gpu_capabilities_private.hh +++ b/source/blender/gpu/intern/gpu_capabilities_private.hh @@ -28,7 +28,6 @@ struct GPUCapabilities { int max_textures_geom = 0; int max_textures_frag = 0; int max_samplers = 0; - int max_images = 0; int max_work_group_count[3] = {0, 0, 0}; int max_work_group_size[3] = {0, 0, 0}; int max_uniforms_vert = 0; diff --git a/source/blender/gpu/intern/gpu_codegen.cc b/source/blender/gpu/intern/gpu_codegen.cc index 1ed14559d90..0e386888ac0 100644 --- a/source/blender/gpu/intern/gpu_codegen.cc +++ b/source/blender/gpu/intern/gpu_codegen.cc @@ -30,7 +30,7 @@ #include "GPU_context.h" #include "GPU_material.hh" #include "GPU_shader.h" -#include "GPU_uniform_buffer.hh" +#include "GPU_uniform_buffer.h" #include "GPU_vertex_format.h" #include "BLI_sys_types.h" /* for intptr_t support */ @@ -288,6 +288,13 @@ class GPUCodegen { ~GPUCodegen() { + MEM_SAFE_FREE(output.attr_load); + MEM_SAFE_FREE(output.surface); + MEM_SAFE_FREE(output.volume); + MEM_SAFE_FREE(output.thickness); + MEM_SAFE_FREE(output.displacement); + MEM_SAFE_FREE(output.composite); + MEM_SAFE_FREE(output.material_functions); MEM_SAFE_FREE(cryptomatte_input_); delete create_info; BLI_freelistN(&ubo_inputs_); @@ -320,16 +327,22 @@ class GPUCodegen { void set_unique_ids(); void node_serialize(std::stringstream &eval_ss, const GPUNode *node); - std::string graph_serialize(eGPUNodeTag tree_tag, - GPUNodeLink *output_link, - const char *output_default = nullptr); - std::string graph_serialize(eGPUNodeTag tree_tag); + char *graph_serialize(eGPUNodeTag tree_tag, + GPUNodeLink *output_link, + const char *output_default = nullptr); + char *graph_serialize(eGPUNodeTag tree_tag); + + static char *extract_c_str(std::stringstream &stream) + { + auto string = stream.str(); + return BLI_strdup(string.c_str()); + } }; void GPUCodegen::generate_attribs() { if (BLI_listbase_is_empty(&graph.attributes)) { - output.attr_load.clear(); + output.attr_load = nullptr; return; } @@ -384,7 +397,7 @@ void GPUCodegen::generate_attribs() iface.smooth(to_type(iface_type), var_name); } - output.attr_load = load_ss.str(); + output.attr_load = extract_c_str(load_ss); } void GPUCodegen::generate_resources() @@ -571,12 +584,12 @@ void GPUCodegen::node_serialize(std::stringstream &eval_ss, const GPUNode *node) nodes_total_++; } -std::string GPUCodegen::graph_serialize(eGPUNodeTag tree_tag, - GPUNodeLink *output_link, - const char *output_default) +char *GPUCodegen::graph_serialize(eGPUNodeTag tree_tag, + GPUNodeLink *output_link, + const char *output_default) { if (output_link == nullptr && output_default == nullptr) { - return ""; + return nullptr; } std::stringstream eval_ss; @@ -592,7 +605,7 @@ std::string GPUCodegen::graph_serialize(eGPUNodeTag tree_tag, } if (!has_nodes) { - return ""; + return nullptr; } if (output_link) { @@ -603,12 +616,12 @@ std::string GPUCodegen::graph_serialize(eGPUNodeTag tree_tag, eval_ss << "return " << output_default << ";\n"; } - std::string str = eval_ss.str(); - BLI_hash_mm2a_add(&hm2a_, reinterpret_cast(str.c_str()), str.size()); - return str; + char *eval_c_str = extract_c_str(eval_ss); + BLI_hash_mm2a_add(&hm2a_, (uchar *)eval_c_str, eval_ss.str().size()); + return eval_c_str; } -std::string GPUCodegen::graph_serialize(eGPUNodeTag tree_tag) +char *GPUCodegen::graph_serialize(eGPUNodeTag tree_tag) { std::stringstream eval_ss; LISTBASE_FOREACH (GPUNode *, node, &graph.nodes) { @@ -616,9 +629,9 @@ std::string GPUCodegen::graph_serialize(eGPUNodeTag tree_tag) node_serialize(eval_ss, node); } } - std::string str = eval_ss.str(); - BLI_hash_mm2a_add(&hm2a_, reinterpret_cast(str.c_str()), str.size()); - return str; + char *eval_c_str = extract_c_str(eval_ss); + BLI_hash_mm2a_add(&hm2a_, (uchar *)eval_c_str, eval_ss.str().size()); + return eval_c_str; } void GPUCodegen::generate_cryptomatte() @@ -695,10 +708,11 @@ void GPUCodegen::generate_graphs() } /* Tag only the nodes needed for the current function */ gpu_nodes_tag(func_link->outlink, GPU_NODE_TAG_FUNCTION); - const std::string fn = graph_serialize(GPU_NODE_TAG_FUNCTION, func_link->outlink); + char *fn = graph_serialize(GPU_NODE_TAG_FUNCTION, func_link->outlink); eval_ss << "float " << func_link->name << "() {\n" << fn << "}\n\n"; + MEM_SAFE_FREE(fn); } - output.material_functions = eval_ss.str(); + output.material_functions = extract_c_str(eval_ss); /* Leave the function tags as they were before serialization */ LISTBASE_FOREACH (GPUNodeGraphFunctionLink *, funclink, &graph.material_functions) { gpu_nodes_tag(funclink->outlink, GPU_NODE_TAG_FUNCTION); @@ -938,7 +952,7 @@ void GPU_pass_release(GPUPass *pass) void GPU_pass_cache_garbage_collect() { const int shadercollectrate = 60; /* hardcoded for now. */ - int ctime = int(BLI_time_now_seconds()); + int ctime = int(BLI_check_seconds_timer()); BLI_spin_lock(&pass_cache_spin); GPUPass *next, **prev_pass = &pass_cache; diff --git a/source/blender/gpu/intern/gpu_context_private.hh b/source/blender/gpu/intern/gpu_context_private.hh index 0ca2fc42fb2..e05c62742b8 100644 --- a/source/blender/gpu/intern/gpu_context_private.hh +++ b/source/blender/gpu/intern/gpu_context_private.hh @@ -87,7 +87,7 @@ class Context { virtual void debug_group_end(){}; /* Returns true if capture successfully started. */ - virtual bool debug_capture_begin(const char *title) = 0; + virtual bool debug_capture_begin() = 0; virtual void debug_capture_end() = 0; virtual void *debug_capture_scope_create(const char *name) = 0; virtual bool debug_capture_scope_begin(void *scope) = 0; diff --git a/source/blender/gpu/intern/gpu_debug.cc b/source/blender/gpu/intern/gpu_debug.cc index 21f806a07f5..af565358bae 100644 --- a/source/blender/gpu/intern/gpu_debug.cc +++ b/source/blender/gpu/intern/gpu_debug.cc @@ -8,7 +8,7 @@ * Debug features of OpenGL. */ -#include "BKE_global.hh" +#include "BKE_global.h" #include "BLI_string.h" @@ -75,7 +75,7 @@ bool GPU_debug_group_match(const char *ref) return false; } -void GPU_debug_capture_begin(const char *title) +void GPU_debug_capture_begin() { /* GPU Frame capture is only enabled when --debug-gpu is specified. */ if (!(G.debug & G_DEBUG_GPU)) { @@ -84,7 +84,7 @@ void GPU_debug_capture_begin(const char *title) Context *ctx = Context::get(); if (ctx && !ctx->debug_is_capturing) { - ctx->debug_is_capturing = ctx->debug_capture_begin(title); + ctx->debug_is_capturing = ctx->debug_capture_begin(); if (!ctx->debug_is_capturing) { printf("Failed to start GPU frame capture!\n"); } diff --git a/source/blender/gpu/intern/gpu_debug_private.hh b/source/blender/gpu/intern/gpu_debug_private.hh index 76d8bd17941..231ccab0002 100644 --- a/source/blender/gpu/intern/gpu_debug_private.hh +++ b/source/blender/gpu/intern/gpu_debug_private.hh @@ -15,6 +15,6 @@ namespace blender::gpu { -using DebugStack = Vector; +typedef Vector DebugStack; } // namespace blender::gpu diff --git a/source/blender/gpu/intern/gpu_framebuffer_private.hh b/source/blender/gpu/intern/gpu_framebuffer_private.hh index 0fcad169308..f15c6c8cd81 100644 --- a/source/blender/gpu/intern/gpu_framebuffer_private.hh +++ b/source/blender/gpu/intern/gpu_framebuffer_private.hh @@ -19,7 +19,7 @@ struct GPUTexture; -enum GPUAttachmentType : int { +typedef enum GPUAttachmentType : int { GPU_FB_DEPTH_ATTACHMENT = 0, GPU_FB_DEPTH_STENCIL_ATTACHMENT, GPU_FB_COLOR_ATTACHMENT0, @@ -35,7 +35,7 @@ enum GPUAttachmentType : int { * the maximum number of COLOR attachments specified by glDrawBuffers. */ GPU_FB_MAX_ATTACHMENT, -}; +} GPUAttachmentType; #define GPU_FB_MAX_COLOR_ATTACHMENT (GPU_FB_MAX_ATTACHMENT - GPU_FB_COLOR_ATTACHMENT0) diff --git a/source/blender/gpu/intern/gpu_index_buffer.cc b/source/blender/gpu/intern/gpu_index_buffer.cc index 2b8070770df..162f7cc3f20 100644 --- a/source/blender/gpu/intern/gpu_index_buffer.cc +++ b/source/blender/gpu/intern/gpu_index_buffer.cc @@ -17,8 +17,6 @@ #include "gpu_index_buffer_private.hh" -#include "GPU_capabilities.h" -#include "GPU_compute.h" #include "GPU_platform.h" #include /* For `min/max`. */ @@ -243,54 +241,6 @@ void GPU_indexbuf_set_tri_restart(GPUIndexBufBuilder *builder, uint elem) builder->uses_restart_indices = true; } -GPUIndexBuf *GPU_indexbuf_build_curves_on_device(GPUPrimType prim_type, - uint curves_num, - uint verts_per_curve) -{ - uint64_t dispatch_x_dim = verts_per_curve; - if (ELEM(prim_type, GPU_PRIM_LINE_STRIP, GPU_PRIM_TRI_STRIP)) { - dispatch_x_dim += 1; - } - uint64_t grid_x, grid_y, grid_z; - uint64_t max_grid_x = GPU_max_work_group_count(0), max_grid_y = GPU_max_work_group_count(1), - max_grid_z = GPU_max_work_group_count(2); - grid_x = min_uu(max_grid_x, (dispatch_x_dim + 15) / 16); - grid_y = (curves_num + 15) / 16; - if (grid_y <= max_grid_y) { - grid_z = 1; - } - else { - grid_y = grid_z = uint64_t(ceil(sqrt(double(grid_y)))); - grid_y = min_uu(grid_y, max_grid_y); - grid_z = min_uu(grid_z, max_grid_z); - } - bool tris = (prim_type == GPU_PRIM_TRIS); - bool lines = (prim_type == GPU_PRIM_LINES); - GPUShader *shader = GPU_shader_get_builtin_shader( - tris ? GPU_SHADER_INDEXBUF_TRIS : - (lines ? GPU_SHADER_INDEXBUF_LINES : GPU_SHADER_INDEXBUF_POINTS)); - GPU_shader_bind(shader); - GPUIndexBuf *ibo = GPU_indexbuf_build_on_device(curves_num * dispatch_x_dim); - int resolution; - if (tris) { - resolution = 6; - } - else if (lines) { - resolution = 2; - } - else { - resolution = 1; - } - GPU_shader_uniform_1i(shader, "elements_per_curve", dispatch_x_dim / resolution); - GPU_shader_uniform_1i(shader, "ncurves", curves_num); - GPU_indexbuf_bind_as_ssbo(ibo, GPU_shader_get_ssbo_binding(shader, "out_indices")); - GPU_compute_dispatch(shader, grid_x, grid_y, grid_z); - - GPU_memory_barrier(GPU_BARRIER_ELEMENT_ARRAY); - GPU_shader_unbind(); - return ibo; -} - /** \} */ /* -------------------------------------------------------------------- */ diff --git a/source/blender/gpu/intern/gpu_material.cc b/source/blender/gpu/intern/gpu_material.cc index 1f6f106ec0a..559dadfdfa2 100644 --- a/source/blender/gpu/intern/gpu_material.cc +++ b/source/blender/gpu/intern/gpu_material.cc @@ -26,14 +26,14 @@ #include "BKE_main.hh" #include "BKE_material.h" -#include "BKE_node.hh" +#include "BKE_node.h" #include "NOD_shader.h" #include "GPU_material.hh" #include "GPU_shader.h" #include "GPU_texture.h" -#include "GPU_uniform_buffer.hh" +#include "GPU_uniform_buffer.h" #include "DRW_engine.hh" @@ -747,7 +747,7 @@ void GPU_material_optimization_status_set(GPUMaterial *mat, eGPUMaterialOptimiza mat->optimization_status = status; if (mat->optimization_status == GPU_MAT_OPTIMIZATION_READY) { /* Reset creation timer to delay optimization pass. */ - mat->creation_time = BLI_time_now_seconds(); + mat->creation_time = BLI_check_seconds_timer(); } } @@ -761,7 +761,7 @@ bool GPU_material_optimization_ready(GPUMaterial *mat) * to do this quickly to avoid build-up and improve runtime performance. * The threshold just prevents compilations being queued frame after frame. */ const double optimization_time_threshold_s = 1.2; - return ((BLI_time_now_seconds() - mat->creation_time) >= optimization_time_threshold_s); + return ((BLI_check_seconds_timer() - mat->creation_time) >= optimization_time_threshold_s); } void GPU_material_set_default(GPUMaterial *material, GPUMaterial *default_material) @@ -790,10 +790,6 @@ bool GPU_material_has_displacement_output(GPUMaterial *mat) void GPU_material_flag_set(GPUMaterial *mat, eGPUMaterialFlag flag) { - if ((flag & GPU_MATFLAG_GLOSSY) && (mat->flag & GPU_MATFLAG_GLOSSY)) { - /* Tag material using multiple glossy BSDF as using clear coat. */ - mat->flag |= GPU_MATFLAG_COAT; - } mat->flag |= flag; } diff --git a/source/blender/gpu/intern/gpu_select_pick.cc b/source/blender/gpu/intern/gpu_select_pick.cc index 8fe7b7649d2..ebe3ce3930f 100644 --- a/source/blender/gpu/intern/gpu_select_pick.cc +++ b/source/blender/gpu/intern/gpu_select_pick.cc @@ -25,7 +25,7 @@ #include "gpu_select_private.h" -#include "BLI_strict_flags.h" /* Keep last. */ +#include "BLI_strict_flags.h" /* #define DEBUG_PRINT */ diff --git a/source/blender/gpu/intern/gpu_shader.cc b/source/blender/gpu/intern/gpu_shader.cc index 392151db39e..eefba01fe27 100644 --- a/source/blender/gpu/intern/gpu_shader.cc +++ b/source/blender/gpu/intern/gpu_shader.cc @@ -577,26 +577,29 @@ void GPU_shader_constant_int_ex(GPUShader *sh, int location, int value) { Shader &shader = *unwrap(sh); BLI_assert(shader.constants.types[location] == gpu::shader::Type::INT); - shader.constants.is_dirty |= assign_if_different(shader.constants.values[location].i, value); + shader.constants.values[location].i = value; + shader.constants.is_dirty = true; } void GPU_shader_constant_uint_ex(GPUShader *sh, int location, uint value) { Shader &shader = *unwrap(sh); BLI_assert(shader.constants.types[location] == gpu::shader::Type::UINT); - shader.constants.is_dirty |= assign_if_different(shader.constants.values[location].u, value); + shader.constants.values[location].u = value; + shader.constants.is_dirty = true; } void GPU_shader_constant_float_ex(GPUShader *sh, int location, float value) { Shader &shader = *unwrap(sh); BLI_assert(shader.constants.types[location] == gpu::shader::Type::FLOAT); - shader.constants.is_dirty |= assign_if_different(shader.constants.values[location].f, value); + shader.constants.values[location].f = value; + shader.constants.is_dirty = true; } void GPU_shader_constant_bool_ex(GPUShader *sh, int location, bool value) { Shader &shader = *unwrap(sh); BLI_assert(shader.constants.types[location] == gpu::shader::Type::BOOL); - shader.constants.is_dirty |= assign_if_different(shader.constants.values[location].u, - uint32_t(value)); + shader.constants.values[location].u = value; + shader.constants.is_dirty = true; } void GPU_shader_constant_int(GPUShader *sh, const char *name, int value) diff --git a/source/blender/gpu/intern/gpu_shader_builder_stubs.cc b/source/blender/gpu/intern/gpu_shader_builder_stubs.cc index 4442bcdff85..0851c8b5b62 100644 --- a/source/blender/gpu/intern/gpu_shader_builder_stubs.cc +++ b/source/blender/gpu/intern/gpu_shader_builder_stubs.cc @@ -15,7 +15,7 @@ #include "BKE_attribute.hh" #include "BKE_customdata.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_material.h" #include "BKE_mesh.hh" #include "BKE_node.hh" @@ -33,7 +33,10 @@ #include "UI_resources.hh" +extern "C" { Global G; +} + UserDef U; /* -------------------------------------------------------------------- */ @@ -152,6 +155,13 @@ int CustomData_get_offset(const struct CustomData * /*data*/, eCustomDataType /* return 0; } +int CustomData_get_named_layer_index(const struct CustomData * /*data*/, + eCustomDataType /*type*/, + const char * /*name*/) +{ + return -1; +} + int CustomData_get_active_layer_index(const struct CustomData * /*data*/, eCustomDataType /*type*/) { return -1; @@ -178,13 +188,13 @@ extern "C" void ntreeGPUMaterialNodes(struct bNodeTree * /*localtree*/, BLI_assert_unreachable(); } -struct bNodeTree *ntreeLocalize(struct bNodeTree * /*ntree*/) +extern "C" struct bNodeTree *ntreeLocalize(struct bNodeTree * /*ntree*/) { BLI_assert_unreachable(); return nullptr; } -void ntreeFreeLocalTree(struct bNodeTree * /*ntree*/) +extern "C" void ntreeFreeLocalTree(struct bNodeTree * /*ntree*/) { BLI_assert_unreachable(); } diff --git a/source/blender/gpu/intern/gpu_shader_builtin.cc b/source/blender/gpu/intern/gpu_shader_builtin.cc index 442fa484582..2f7f78cb428 100644 --- a/source/blender/gpu/intern/gpu_shader_builtin.cc +++ b/source/blender/gpu/intern/gpu_shader_builtin.cc @@ -87,12 +87,6 @@ static const char *builtin_shader_create_info_name(eGPUBuiltinShader shader) return "gpu_shader_2D_nodelink_inst"; case GPU_SHADER_GPENCIL_STROKE: return "gpu_shader_gpencil_stroke"; - case GPU_SHADER_INDEXBUF_POINTS: - return "gpu_shader_index_2d_array_points"; - case GPU_SHADER_INDEXBUF_LINES: - return "gpu_shader_index_2d_array_lines"; - case GPU_SHADER_INDEXBUF_TRIS: - return "gpu_shader_index_2d_array_tris"; default: BLI_assert_unreachable(); return ""; diff --git a/source/blender/gpu/intern/gpu_shader_create_info.cc b/source/blender/gpu/intern/gpu_shader_create_info.cc index cab6f60225f..ad6ad7c84c4 100644 --- a/source/blender/gpu/intern/gpu_shader_create_info.cc +++ b/source/blender/gpu/intern/gpu_shader_create_info.cc @@ -12,8 +12,6 @@ #include "BLI_set.hh" #include "BLI_string_ref.hh" -#include "BKE_global.hh" - #include "GPU_capabilities.h" #include "GPU_context.h" #include "GPU_platform.h" @@ -272,16 +270,7 @@ std::string ShaderCreateInfo::check_error() const } } - if ((G.debug & G_DEBUG_GPU) == 0) { - return error; - } - - /* - * The next check has been disabled. 'eevee_legacy_surface_common_iface' is known to fail. - * The check was added to validate if shader would be able to compile on Vulkan. - * TODO(jbakker): Enable the check after EEVEE is replaced by EEVEE-Next. - */ -#if 0 +#ifndef NDEBUG if (bool(this->builtins_ & (BuiltinBits::BARYCENTRIC_COORD | BuiltinBits::VIEWPORT_INDEX | BuiltinBits::LAYER))) { @@ -293,7 +282,6 @@ std::string ShaderCreateInfo::check_error() const } } } -#endif if (!this->is_vulkan_compatible()) { error += this->name_ + @@ -310,6 +298,7 @@ std::string ShaderCreateInfo::check_error() const } } } +#endif return error; } diff --git a/source/blender/gpu/intern/gpu_shader_dependency.cc b/source/blender/gpu/intern/gpu_shader_dependency.cc index 2583b66247d..d5e9e945514 100644 --- a/source/blender/gpu/intern/gpu_shader_dependency.cc +++ b/source/blender/gpu/intern/gpu_shader_dependency.cc @@ -104,7 +104,6 @@ struct GPUSource { if (filename.endswith(".h") || filename.endswith(".hh")) { enum_preprocess(); quote_preprocess(); - small_types_check(); } else { if (source.find("'") != StringRef::not_found) { @@ -237,45 +236,6 @@ struct GPUSource { source = processed_source.c_str(); } - /** - * Assert not small types are present inside shader shared files. - */ - void small_types_check() - { -#ifndef NDEBUG - auto check_type = [&](StringRefNull type_str) { - int64_t cursor = -1; - while (true) { - cursor = find_keyword(source, type_str, cursor + 1); - if (cursor == -1) { - break; - } - print_error(source, cursor, "small types are forbidden in shader interfaces"); - } - }; - check_type("char "); - check_type("char2 "); - check_type("char3 "); - check_type("char4 "); - check_type("uchar "); - check_type("uchar2 "); - check_type("uchar3 "); - check_type("uchar4 "); - check_type("short "); - check_type("short2 "); - check_type("short3 "); - check_type("short4 "); - check_type("ushort "); - check_type("ushort2 "); - check_type("ushort3 "); - check_type("ushort4 "); - check_type("half "); - check_type("half2 "); - check_type("half3 "); - check_type("half4 "); -#endif - } - /** * Transform C,C++ enum declaration into GLSL compatible defines and constants: * diff --git a/source/blender/gpu/intern/gpu_shader_log.cc b/source/blender/gpu/intern/gpu_shader_log.cc index a7bf05e56de..2ae385c108f 100644 --- a/source/blender/gpu/intern/gpu_shader_log.cc +++ b/source/blender/gpu/intern/gpu_shader_log.cc @@ -245,21 +245,19 @@ void Shader::print_log(Span sources, log_line = line_end + 1; previous_location = log_item.cursor; } + // printf("%s", sources_combined); + MEM_freeN(sources_combined); CLG_Severity severity = error ? CLG_SEVERITY_ERROR : CLG_SEVERITY_WARN; if (((LOG.type->flag & CLG_FLAG_USE) && (LOG.type->level >= 0)) || (severity >= CLG_SEVERITY_WARN)) { - if (DEBUG_LOG_SHADER_SRC_ON_ERROR && error) { - CLG_log_str(LOG.type, severity, this->name, stage, sources_combined); - } const char *_str = BLI_dynstr_get_cstring(dynstr); CLG_log_str(LOG.type, severity, this->name, stage, _str); MEM_freeN((void *)_str); } - MEM_freeN(sources_combined); BLI_dynstr_free(dynstr); } diff --git a/source/blender/gpu/intern/gpu_shader_private.hh b/source/blender/gpu/intern/gpu_shader_private.hh index ba7b976c28c..a698de6b6bb 100644 --- a/source/blender/gpu/intern/gpu_shader_private.hh +++ b/source/blender/gpu/intern/gpu_shader_private.hh @@ -25,9 +25,6 @@ namespace gpu { class GPULogParser; -/* Set to 1 to log the full source of shaders that fail to compile. */ -#define DEBUG_LOG_SHADER_SRC_ON_ERROR 0 - /** * Compilation is done on a list of GLSL sources. This list contains placeholders that should be * provided by the backend shader. These defines contains the locations where the backend can patch diff --git a/source/blender/gpu/intern/gpu_texture_private.hh b/source/blender/gpu/intern/gpu_texture_private.hh index 1fdd7aea071..8129fd18be7 100644 --- a/source/blender/gpu/intern/gpu_texture_private.hh +++ b/source/blender/gpu/intern/gpu_texture_private.hh @@ -17,7 +17,7 @@ namespace blender { namespace gpu { -enum eGPUTextureFormatFlag { +typedef enum eGPUTextureFormatFlag { /* The format has a depth component and can be used as depth attachment. */ GPU_FORMAT_DEPTH = (1 << 0), /* The format has a stencil component and can be used as stencil attachment. */ @@ -36,7 +36,7 @@ enum eGPUTextureFormatFlag { GPU_FORMAT_SIGNED = (1 << 7), GPU_FORMAT_DEPTH_STENCIL = (GPU_FORMAT_DEPTH | GPU_FORMAT_STENCIL), -}; +} eGPUTextureFormatFlag; ENUM_OPERATORS(eGPUTextureFormatFlag, GPU_FORMAT_SIGNED) diff --git a/source/blender/gpu/intern/gpu_uniform_buffer.cc b/source/blender/gpu/intern/gpu_uniform_buffer.cc index 605b5b07f16..01d44b7bacf 100644 --- a/source/blender/gpu/intern/gpu_uniform_buffer.cc +++ b/source/blender/gpu/intern/gpu_uniform_buffer.cc @@ -18,7 +18,7 @@ #include "GPU_context.h" #include "GPU_material.hh" -#include "GPU_uniform_buffer.hh" +#include "GPU_uniform_buffer.h" #include "gpu_uniform_buffer_private.hh" /* -------------------------------------------------------------------- */ diff --git a/source/blender/gpu/intern/gpu_viewport.cc b/source/blender/gpu/intern/gpu_viewport.cc index 7a90fe88a0b..dd3dc2b8309 100644 --- a/source/blender/gpu/intern/gpu_viewport.cc +++ b/source/blender/gpu/intern/gpu_viewport.cc @@ -24,7 +24,7 @@ #include "GPU_immediate.h" #include "GPU_matrix.h" #include "GPU_texture.h" -#include "GPU_uniform_buffer.hh" +#include "GPU_uniform_buffer.h" #include "GPU_viewport.h" #include "DRW_engine.hh" diff --git a/source/blender/gpu/metal/mtl_backend.mm b/source/blender/gpu/metal/mtl_backend.mm index 5b57b4d216a..c7ee09c6785 100644 --- a/source/blender/gpu/metal/mtl_backend.mm +++ b/source/blender/gpu/metal/mtl_backend.mm @@ -6,7 +6,7 @@ * \ingroup gpu */ -#include "BKE_global.hh" +#include "BKE_global.h" #include "gpu_backend.hh" #include "mtl_backend.hh" @@ -413,8 +413,6 @@ void MTLBackend::capabilities_init(MTLContext *ctx) GCaps.max_textures_geom = 0; /* N/A geometry shaders not supported. */ GCaps.max_textures_frag = GCaps.max_textures; - GCaps.max_images = GCaps.max_textures; - /* Conservative uniform data limit is 4KB per-stage -- This is the limit of setBytes. * MTLBuffer path is also supported but not as efficient. */ GCaps.max_uniforms_vert = 1024; diff --git a/source/blender/gpu/metal/mtl_batch.mm b/source/blender/gpu/metal/mtl_batch.mm index 0d1f0c40e9b..ae32cd8e442 100644 --- a/source/blender/gpu/metal/mtl_batch.mm +++ b/source/blender/gpu/metal/mtl_batch.mm @@ -11,7 +11,7 @@ #include "BLI_assert.h" #include "BLI_span.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "GPU_common.h" #include "gpu_batch_private.hh" diff --git a/source/blender/gpu/metal/mtl_command_buffer.mm b/source/blender/gpu/metal/mtl_command_buffer.mm index 80607697bfe..6526e85f29d 100644 --- a/source/blender/gpu/metal/mtl_command_buffer.mm +++ b/source/blender/gpu/metal/mtl_command_buffer.mm @@ -662,7 +662,6 @@ void MTLCommandBufferManager::encode_signal_event(id event, uint64_t s BLI_assert(cmd_buf); this->end_active_command_encoder(); [cmd_buf encodeSignalEvent:event value:signal_value]; - register_encoder_counters(); } void MTLCommandBufferManager::encode_wait_for_event(id event, uint64_t signal_value) @@ -672,7 +671,6 @@ void MTLCommandBufferManager::encode_wait_for_event(id event, uint64_t BLI_assert(cmd_buf); this->end_active_command_encoder(); [cmd_buf encodeWaitForEvent:event value:signal_value]; - register_encoder_counters(); } /** \} */ diff --git a/source/blender/gpu/metal/mtl_context.hh b/source/blender/gpu/metal/mtl_context.hh index 9e65088fd2c..9ca913d9347 100644 --- a/source/blender/gpu/metal/mtl_context.hh +++ b/source/blender/gpu/metal/mtl_context.hh @@ -780,7 +780,7 @@ class MTLContext : public Context { void debug_group_begin(const char *name, int index) override; void debug_group_end() override; - bool debug_capture_begin(const char *title) override; + bool debug_capture_begin() override; void debug_capture_end() override; void *debug_capture_scope_create(const char *name) override; bool debug_capture_scope_begin(void *scope) override; diff --git a/source/blender/gpu/metal/mtl_context.mm b/source/blender/gpu/metal/mtl_context.mm index 92bd091b92f..63f80822567 100644 --- a/source/blender/gpu/metal/mtl_context.mm +++ b/source/blender/gpu/metal/mtl_context.mm @@ -25,7 +25,7 @@ #include "GPU_shader.h" #include "GPU_storage_buffer.h" #include "GPU_texture.h" -#include "GPU_uniform_buffer.hh" +#include "GPU_uniform_buffer.h" #include "GPU_vertex_buffer.h" #include "intern/gpu_matrix_private.h" @@ -1883,12 +1883,6 @@ void MTLContext::ensure_texture_bindings( * shader. */ id tex = bound_texture->get_metal_handle(); - /* If texture resource is an image binding and has a non-default swizzle mask, we need - * to bind the source texture resource to retain image write access. */ - if (!is_resource_sampler && bound_texture->has_custom_swizzle()) { - tex = bound_texture->get_metal_handle_base(); - } - if (bool(shader_texture_info.stage_mask & ShaderStage::COMPUTE)) { cs.bind_compute_texture(tex, slot); cs.bind_compute_sampler(bound_sampler, use_argument_buffer_for_samplers, slot); @@ -2684,7 +2678,7 @@ void present(MTLRenderPassDescriptor *blit_descriptor, } while (MTLContext::max_drawables_in_flight > min_ii(perf_max_drawables, MTL_MAX_DRAWABLES)) { - BLI_time_sleep_ms(1); + BLI_sleep_ms(1); } /* Present is submitted in its own CMD Buffer to ensure drawable reference released as early as diff --git a/source/blender/gpu/metal/mtl_debug.hh b/source/blender/gpu/metal/mtl_debug.hh index d6fad67dd18..4c4006be6aa 100644 --- a/source/blender/gpu/metal/mtl_debug.hh +++ b/source/blender/gpu/metal/mtl_debug.hh @@ -8,7 +8,7 @@ #pragma once -#include "BKE_global.hh" +#include "BKE_global.h" #include "CLG_log.h" /** Options for organizing Metal GPU debug captures. */ diff --git a/source/blender/gpu/metal/mtl_debug.mm b/source/blender/gpu/metal/mtl_debug.mm index f522c2ae17c..4dcdb42a584 100644 --- a/source/blender/gpu/metal/mtl_debug.mm +++ b/source/blender/gpu/metal/mtl_debug.mm @@ -13,7 +13,7 @@ #include "BLI_system.h" #include "BLI_utildefines.h" -#include "BKE_global.hh" +#include "BKE_global.h" #include "GPU_debug.h" #include "GPU_platform.h" @@ -59,7 +59,7 @@ void MTLContext::debug_group_end() } } -bool MTLContext::debug_capture_begin(const char * /*title*/) +bool MTLContext::debug_capture_begin() { MTLCaptureManager *capture_manager = [MTLCaptureManager sharedCaptureManager]; if (!capture_manager) { diff --git a/source/blender/gpu/metal/mtl_framebuffer.mm b/source/blender/gpu/metal/mtl_framebuffer.mm index c68789c73ab..8eb55792f59 100644 --- a/source/blender/gpu/metal/mtl_framebuffer.mm +++ b/source/blender/gpu/metal/mtl_framebuffer.mm @@ -8,7 +8,7 @@ #include "BLI_string.h" -#include "BKE_global.hh" +#include "BKE_global.h" #include "mtl_context.hh" #include "mtl_debug.hh" diff --git a/source/blender/gpu/metal/mtl_immediate.mm b/source/blender/gpu/metal/mtl_immediate.mm index b2baaa6ef01..c6558920e0a 100644 --- a/source/blender/gpu/metal/mtl_immediate.mm +++ b/source/blender/gpu/metal/mtl_immediate.mm @@ -8,7 +8,7 @@ * Mimics old style opengl immediate mode drawing. */ -#include "BKE_global.hh" +#include "BKE_global.h" #include "GPU_vertex_format.h" #include "gpu_context_private.hh" diff --git a/source/blender/gpu/metal/mtl_index_buffer.mm b/source/blender/gpu/metal/mtl_index_buffer.mm index 93b25e7a071..bb09086d93f 100644 --- a/source/blender/gpu/metal/mtl_index_buffer.mm +++ b/source/blender/gpu/metal/mtl_index_buffer.mm @@ -55,9 +55,7 @@ void MTLIndexBuf::bind_as_ssbo(uint32_t binding) /* Create MTLStorageBuffer to wrap this resource and use conventional binding. */ if (ssbo_wrapper_ == nullptr) { - /* Buffer's size in bytes is required to be multiple of 16. */ - int multiple_of_16 = ceil_to_multiple_u(alloc_size_, 16); - ssbo_wrapper_ = new MTLStorageBuf(this, multiple_of_16); + ssbo_wrapper_ = new MTLStorageBuf(this, alloc_size_); } ssbo_wrapper_->bind(binding); } diff --git a/source/blender/gpu/metal/mtl_memory.mm b/source/blender/gpu/metal/mtl_memory.mm index 9ac1a9b18e7..6bd5d57a9cd 100644 --- a/source/blender/gpu/metal/mtl_memory.mm +++ b/source/blender/gpu/metal/mtl_memory.mm @@ -2,7 +2,7 @@ * * SPDX-License-Identifier: GPL-2.0-or-later */ -#include "BKE_global.hh" +#include "BKE_global.h" #include "DNA_userdef_types.h" diff --git a/source/blender/gpu/metal/mtl_shader.mm b/source/blender/gpu/metal/mtl_shader.mm index af6a423e3a9..f70a5d42a85 100644 --- a/source/blender/gpu/metal/mtl_shader.mm +++ b/source/blender/gpu/metal/mtl_shader.mm @@ -6,7 +6,7 @@ * \ingroup gpu */ -#include "BKE_global.hh" +#include "BKE_global.h" #include "BLI_time.h" @@ -236,14 +236,6 @@ void MTLShader::compute_shader_from_glsl(MutableSpan sources) /* Consolidate GLSL compute sources. */ std::stringstream ss; for (int i = 0; i < sources.size(); i++) { - /* Output preprocessor directive to improve shader log. */ - StringRefNull name = shader::gpu_shader_dependency_get_filename_from_source_string(sources[i]); - if (name.is_empty()) { - ss << "#line 1 \"generated_code_" << i << "\"\n"; - } - else { - ss << "#line 1 \"" << name << "\"\n"; - } ss << sources[i] << std::endl; } shd_builder_->glsl_compute_source_ = ss.str(); @@ -658,43 +650,15 @@ void MTLShader::uniform_int(int location, int comp_len, int array_size, const in uint8_t *ptr = (uint8_t *)push_constant_data_; ptr += uniform.byte_offset; - /** Determine size of data to copy. */ - const char *data_to_copy = (char *)data; - uint data_size_to_copy = sizeof(int) * comp_len * array_size; - - /* Special cases for small types support where storage is shader push constant buffer is smaller - * than the incoming data. */ - ushort us; - uchar uc; - if (uniform.size_in_bytes == 1) { - /* Convert integer storage value down to uchar. */ - data_size_to_copy = uniform.size_in_bytes; - uc = *data; - data_to_copy = (char *)&uc; - } - else if (uniform.size_in_bytes == 2) { - /* Convert integer storage value down to ushort. */ - data_size_to_copy = uniform.size_in_bytes; - us = *data; - data_to_copy = (char *)&us; - } - else { - BLI_assert_msg( - (mtl_get_data_type_alignment(uniform.type) % sizeof(int)) == 0, - "When uniform inputs are provided as integers, the underlying type must adhere " - "to alignment per-component. If this test fails, the input data cannot be directly copied " - "to the buffer. e.g. Array of small types uchar/bool/ushort etc; are currently not " - "handled."); - } - /* Copy data into local block. Only flag UBO as modified if data is different * This can avoid re-binding of unmodified local uniform data, reducing * the total number of copy operations needed and data transfers between * CPU and GPU. */ - bool data_changed = (memcmp((void *)ptr, (void *)data_to_copy, data_size_to_copy) != 0); + bool data_changed = (memcmp((void *)ptr, (void *)data, sizeof(int) * comp_len * array_size) != + 0); if (data_changed) { this->push_constant_bindstate_mark_dirty(true); - memcpy((void *)ptr, (void *)data_to_copy, data_size_to_copy); + memcpy((void *)ptr, (void *)data, sizeof(int) * comp_len * array_size); } } diff --git a/source/blender/gpu/metal/mtl_shader_generator.mm b/source/blender/gpu/metal/mtl_shader_generator.mm index d9b17597364..d33dfe60ef0 100644 --- a/source/blender/gpu/metal/mtl_shader_generator.mm +++ b/source/blender/gpu/metal/mtl_shader_generator.mm @@ -6,7 +6,7 @@ * \ingroup gpu */ -#include "BKE_global.hh" +#include "BKE_global.h" #include "BLI_string.h" @@ -303,7 +303,7 @@ static void replace_outvars(std::string &str) /* Generate out-variable pattern for arrays, of form * `OUT(vec2,samples,CRYPTOMATTE_LEVELS_MAX)` * replacing original `out vec2 samples[SAMPLE_LEN]` - * using 'OUT' macro declared in `mtl_shader_defines.msl`. */ + * using 'OUT' macro declared in mtl_shader_defines.msl*/ char *array_end = strchr(word_base2 + len2, ']'); if (array_end != nullptr) { *start = 'O'; @@ -1355,7 +1355,7 @@ bool MTLShader::generate_msl_from_glsl(const shader::ShaderCreateInfo *info) ss_fragment << "float2 gl_PointCoord;" << std::endl; } if (msl_iface.uses_gl_FrontFacing) { - ss_fragment << "bool gl_FrontFacing;" << std::endl; + ss_fragment << "MTLBOOL gl_FrontFacing;" << std::endl; } if (msl_iface.uses_gl_PrimitiveID) { ss_fragment << "uint gl_PrimitiveID;" << std::endl; @@ -1535,7 +1535,6 @@ bool MTLShader::generate_msl_from_glsl_compute(const shader::ShaderCreateInfo *i /** Generate Compute shader stage. **/ std::stringstream ss_compute; - ss_compute << "#line 1 \"msl_wrapper_code\"\n"; ss_compute << "#define GPU_ARB_shader_draw_parameters 1\n"; if (bool(info->builtins_ & BuiltinBits::TEXTURE_ATOMIC) && @@ -2616,7 +2615,7 @@ std::string MSLGeneratorInterface::generate_msl_fragment_inputs_string() } if (this->uses_gl_FrontFacing) { out << parameter_delimiter(is_first_parameter) - << "\n\tconst bool gl_FrontFacing [[front_facing]]"; + << "\n\tconst MTLBOOL gl_FrontFacing [[front_facing]]"; } if (this->uses_gl_PrimitiveID) { out << parameter_delimiter(is_first_parameter) @@ -3166,11 +3165,10 @@ std::string MSLGeneratorInterface::generate_msl_vertex_attribute_input_populatio &do_attribute_conversion_on_read, this->vertex_input_attributes[attribute].type); if (do_attribute_conversion_on_read) { - BLI_assert(this->vertex_input_attributes[attribute].layout_location >= 0); - out << "\t" << attribute_conversion_func_name << "(MTL_AttributeConvert" - << this->vertex_input_attributes[attribute].layout_location << ", v_in." - << this->vertex_input_attributes[attribute].name << ", " << shader_stage_inst_name - << "." << this->vertex_input_attributes[attribute].name << ");" << std::endl; + out << "\t" << attribute_conversion_func_name << "(MTL_AttributeConvert" << attribute + << ", v_in." << this->vertex_input_attributes[attribute].name << ", " + << shader_stage_inst_name << "." << this->vertex_input_attributes[attribute].name + << ");" << std::endl; } else { out << "\t" << shader_stage_inst_name << "." diff --git a/source/blender/gpu/metal/mtl_shader_interface.mm b/source/blender/gpu/metal/mtl_shader_interface.mm index 368bd6f3014..8c7b229ce84 100644 --- a/source/blender/gpu/metal/mtl_shader_interface.mm +++ b/source/blender/gpu/metal/mtl_shader_interface.mm @@ -191,7 +191,7 @@ void MTLShaderInterface::add_uniform(uint32_t name_offset, eMTLDataType type, in /* Determine size and offset alignment -- C++ struct alignment rules: Base address of value must * match alignment of type. GLSL follows minimum type alignment of 4. */ int data_type_size = mtl_get_data_type_size(type) * array_len; - int data_type_alignment = mtl_get_data_type_alignment(type); + int data_type_alignment = max_ii(mtl_get_data_type_alignment(type), 4); int current_offset = push_constant_block_.current_offset; if ((current_offset % data_type_alignment) != 0) { current_offset += data_type_alignment - (current_offset % data_type_alignment); diff --git a/source/blender/gpu/metal/mtl_shader_interface_type.hh b/source/blender/gpu/metal/mtl_shader_interface_type.hh index da51e047d0f..6d9dadf9a4e 100644 --- a/source/blender/gpu/metal/mtl_shader_interface_type.hh +++ b/source/blender/gpu/metal/mtl_shader_interface_type.hh @@ -189,6 +189,7 @@ inline uint mtl_get_data_type_alignment(eMTLDataType type) case MTL_DATATYPE_CHAR3: case MTL_DATATYPE_UCHAR3: case MTL_DATATYPE_BOOL3: + return 3; case MTL_DATATYPE_CHAR4: case MTL_DATATYPE_UCHAR4: case MTL_DATATYPE_INT: diff --git a/source/blender/gpu/metal/mtl_storage_buffer.mm b/source/blender/gpu/metal/mtl_storage_buffer.mm index eff1630f05e..b38a5610e57 100644 --- a/source/blender/gpu/metal/mtl_storage_buffer.mm +++ b/source/blender/gpu/metal/mtl_storage_buffer.mm @@ -426,16 +426,13 @@ void MTLStorageBuf::read(void *data) else { /** Direct storage buffer read. */ /* If we have a synchronization event from a prior memory sync, ensure memory is fully synced. - * Otherwise, assume read is synchronous and stall until in-flight work is complete. */ + * Otherwise, assume read is asynchronous. */ if (gpu_write_fence_ != nil) { /* Ensure the GPU updates are visible to the host before reading. */ while (gpu_write_fence_.signaledValue < host_read_signal_value_) { - BLI_time_sleep_ms(1); + BLI_sleep_ms(1); } } - else { - GPU_finish(); - } /* Managed buffers need to be explicitly flushed back to host. */ if (metal_buffer_->get_resource_options() & MTLResourceStorageModeManaged) { diff --git a/source/blender/gpu/metal/mtl_texture.hh b/source/blender/gpu/metal/mtl_texture.hh index 24080f81614..196ddd7b1c4 100644 --- a/source/blender/gpu/metal/mtl_texture.hh +++ b/source/blender/gpu/metal/mtl_texture.hh @@ -291,14 +291,6 @@ class MTLTexture : public Texture { return name_; } - bool has_custom_swizzle() - { - return (mtl_swizzle_mask_.red != MTLTextureSwizzleRed || - mtl_swizzle_mask_.green != MTLTextureSwizzleGreen || - mtl_swizzle_mask_.blue != MTLTextureSwizzleBlue || - mtl_swizzle_mask_.alpha != MTLTextureSwizzleAlpha); - } - id get_vertex_buffer() const { if (resource_mode_ == MTL_TEXTURE_MODE_VBO) { diff --git a/source/blender/gpu/metal/mtl_texture.mm b/source/blender/gpu/metal/mtl_texture.mm index a3d3265d53d..9c06bef954f 100644 --- a/source/blender/gpu/metal/mtl_texture.mm +++ b/source/blender/gpu/metal/mtl_texture.mm @@ -6,7 +6,7 @@ * \ingroup gpu */ -#include "BKE_global.hh" +#include "BKE_global.h" #include "DNA_userdef_types.h" @@ -1122,8 +1122,6 @@ void gpu::MTLTexture::update_sub( /* Decrement texture reference counts. This ensures temporary texture views are released. */ [texture_handle release]; - ctx->main_command_buffer.submit(false); - /* Release temporary staging buffer allocation. * NOTE: Allocation will be tracked with command submission and released once no longer in use. */ @@ -1689,16 +1687,11 @@ void gpu::MTLTexture::read_internal(int mip, * happen after work with associated texture is finished. */ GPU_finish(); - /** Determine source read texture handle. */ + /* Texture View for SRGB special case. */ id read_texture = texture_; - /* Use textureview handle if reading from a GPU texture view. */ - if (resource_mode_ == MTL_TEXTURE_MODE_TEXTURE_VIEW) { - read_texture = this->get_metal_handle(); - } - /* Create Texture View for SRGB special case to bypass internal type conversion. */ if (format_ == GPU_SRGB8_A8) { BLI_assert(gpu_image_usage_flags_ & GPU_TEXTURE_USAGE_FORMAT_VIEW); - read_texture = [read_texture newTextureViewWithPixelFormat:MTLPixelFormatRGBA8Unorm]; + read_texture = [texture_ newTextureViewWithPixelFormat:MTLPixelFormatRGBA8Unorm]; } /* Perform per-texture type read. */ diff --git a/source/blender/gpu/metal/mtl_texture_util.mm b/source/blender/gpu/metal/mtl_texture_util.mm index a1d41b64e00..bcdbb6d9914 100644 --- a/source/blender/gpu/metal/mtl_texture_util.mm +++ b/source/blender/gpu/metal/mtl_texture_util.mm @@ -6,7 +6,7 @@ * \ingroup gpu */ -#include "BKE_global.hh" +#include "BKE_global.h" #include "DNA_userdef_types.h" diff --git a/source/blender/gpu/metal/mtl_uniform_buffer.mm b/source/blender/gpu/metal/mtl_uniform_buffer.mm index e2eecb1ec23..21ef11bfdf5 100644 --- a/source/blender/gpu/metal/mtl_uniform_buffer.mm +++ b/source/blender/gpu/metal/mtl_uniform_buffer.mm @@ -6,7 +6,7 @@ * \ingroup gpu */ -#include "BKE_global.hh" +#include "BKE_global.h" #include "BLI_string.h" diff --git a/source/blender/gpu/metal/mtl_vertex_buffer.mm b/source/blender/gpu/metal/mtl_vertex_buffer.mm index 5c143603f80..5f421906e24 100644 --- a/source/blender/gpu/metal/mtl_vertex_buffer.mm +++ b/source/blender/gpu/metal/mtl_vertex_buffer.mm @@ -307,7 +307,7 @@ void MTLVertBuf::bind_as_ssbo(uint binding) /* Create MTLStorageBuffer to wrap this resource and use conventional binding. */ if (ssbo_wrapper_ == nullptr) { - ssbo_wrapper_ = new MTLStorageBuf(this, ceil_to_multiple_u(alloc_size_, 16)); + ssbo_wrapper_ = new MTLStorageBuf(this, alloc_size_); } ssbo_wrapper_->bind(binding); } diff --git a/source/blender/gpu/opengl/gl_backend.cc b/source/blender/gpu/opengl/gl_backend.cc index 8d563127cdd..8cad6fdbe06 100644 --- a/source/blender/gpu/opengl/gl_backend.cc +++ b/source/blender/gpu/opengl/gl_backend.cc @@ -6,7 +6,7 @@ * \ingroup gpu */ -#include "BKE_global.hh" +#include "BKE_global.h" #if defined(WIN32) # include "BLI_winstuff.h" #endif @@ -431,15 +431,11 @@ static void detect_workarounds() } } - /* Draw shader parameters are broken on Qualcomm Windows ARM64 devices - * on Mesa version < 24.0.0 */ + /* Right now draw shader parameters are broken on Qualcomm devices + * regardless of driver version */ if (GPU_type_matches(GPU_DEVICE_QUALCOMM, GPU_OS_WIN, GPU_DRIVER_ANY)) { - if (strstr(version, "Mesa 20.") || strstr(version, "Mesa 21.") || - strstr(version, "Mesa 22.") || strstr(version, "Mesa 23.")) - { - GCaps.shader_draw_parameters_support = false; - GLContext::shader_draw_parameters_support = false; - } + GCaps.shader_draw_parameters_support = false; + GLContext::shader_draw_parameters_support = false; } /* Some Intel drivers have issues with using mips as frame-buffer targets if @@ -517,7 +513,6 @@ void GLBackend::capabilities_init() glGetIntegerv(GL_MAX_ELEMENTS_VERTICES, &GCaps.max_batch_vertices); glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &GCaps.max_vertex_attribs); glGetIntegerv(GL_MAX_VARYING_FLOATS, &GCaps.max_varying_floats); - glGetIntegerv(GL_MAX_IMAGE_UNITS, &GCaps.max_images); glGetIntegerv(GL_NUM_EXTENSIONS, &GCaps.extensions_len); GCaps.extension_get = gl_extension_get; diff --git a/source/blender/gpu/opengl/gl_backend.hh b/source/blender/gpu/opengl/gl_backend.hh index 5d7f1189b44..efae977d01b 100644 --- a/source/blender/gpu/opengl/gl_backend.hh +++ b/source/blender/gpu/opengl/gl_backend.hh @@ -163,7 +163,7 @@ class GLBackend : public GPUBackend { void render_end() override{}; void render_step() override{}; - bool debug_capture_begin(const char *title); + bool debug_capture_begin(); void debug_capture_end(); private: diff --git a/source/blender/gpu/opengl/gl_context.cc b/source/blender/gpu/opengl/gl_context.cc index ab4cf35b222..b1e1ceb6b52 100644 --- a/source/blender/gpu/opengl/gl_context.cc +++ b/source/blender/gpu/opengl/gl_context.cc @@ -9,7 +9,7 @@ #include "BLI_assert.h" #include "BLI_utildefines.h" -#include "BKE_global.hh" +#include "BKE_global.h" #include "GPU_framebuffer.h" diff --git a/source/blender/gpu/opengl/gl_context.hh b/source/blender/gpu/opengl/gl_context.hh index ab15d19d25c..10e76d2f977 100644 --- a/source/blender/gpu/opengl/gl_context.hh +++ b/source/blender/gpu/opengl/gl_context.hh @@ -129,7 +129,7 @@ class GLContext : public Context { void debug_group_begin(const char *name, int index) override; void debug_group_end() override; - bool debug_capture_begin(const char *title) override; + bool debug_capture_begin() override; void debug_capture_end() override; void *debug_capture_scope_create(const char *name) override; bool debug_capture_scope_begin(void *scope) override; diff --git a/source/blender/gpu/opengl/gl_debug.cc b/source/blender/gpu/opengl/gl_debug.cc index 3a150cae13e..687ad1feced 100644 --- a/source/blender/gpu/opengl/gl_debug.cc +++ b/source/blender/gpu/opengl/gl_debug.cc @@ -13,7 +13,7 @@ #include "BLI_system.h" #include "BLI_utildefines.h" -#include "BKE_global.hh" +#include "BKE_global.h" #include "GPU_debug.h" #include "GPU_platform.h" @@ -386,23 +386,18 @@ void GLContext::debug_group_end() } } -bool GLContext::debug_capture_begin(const char *title) +bool GLContext::debug_capture_begin() { - return GLBackend::get()->debug_capture_begin(title); + return GLBackend::get()->debug_capture_begin(); } -bool GLBackend::debug_capture_begin(const char *title) +bool GLBackend::debug_capture_begin() { #ifdef WITH_RENDERDOC if (G.debug & G_DEBUG_GPU_RENDERDOC) { - bool result = renderdoc_.start_frame_capture(nullptr, nullptr); - if (result && title) { - renderdoc_.set_frame_capture_title(title); - } - return result; + return renderdoc_.start_frame_capture(nullptr, nullptr); } #endif - UNUSED_VARS(title); return false; } diff --git a/source/blender/gpu/opengl/gl_framebuffer.cc b/source/blender/gpu/opengl/gl_framebuffer.cc index e931af16020..6414d9b72ca 100644 --- a/source/blender/gpu/opengl/gl_framebuffer.cc +++ b/source/blender/gpu/opengl/gl_framebuffer.cc @@ -8,7 +8,7 @@ #include "BLI_string.h" -#include "BKE_global.hh" +#include "BKE_global.h" #include "gl_backend.hh" #include "gl_debug.hh" diff --git a/source/blender/gpu/opengl/gl_shader.cc b/source/blender/gpu/opengl/gl_shader.cc index 83d9c519c30..311ba01443e 100644 --- a/source/blender/gpu/opengl/gl_shader.cc +++ b/source/blender/gpu/opengl/gl_shader.cc @@ -8,7 +8,7 @@ #include -#include "BKE_global.hh" +#include "BKE_global.h" #include "BLI_string.h" #include "BLI_vector.hh" @@ -755,9 +755,9 @@ std::string GLShader::fragment_interface_declare(const ShaderCreateInfo &info) c std::string pre_main, post_main; ss << "\n/* Interfaces. */\n"; - const Span in_interfaces = info.geometry_source_.is_empty() ? - info.vertex_out_interfaces_ : - info.geometry_out_interfaces_; + const Vector &in_interfaces = info.geometry_source_.is_empty() ? + info.vertex_out_interfaces_ : + info.geometry_out_interfaces_; for (const StageInterfaceInfo *iface : in_interfaces) { print_interface(ss, "in", *iface); } @@ -909,7 +909,7 @@ std::string GLShader::geometry_layout_declare(const ShaderCreateInfo &info) cons return ss.str(); } -static StageInterfaceInfo *find_interface_by_name(const Span ifaces, +static StageInterfaceInfo *find_interface_by_name(const Vector &ifaces, const StringRefNull &name) { for (auto *iface : ifaces) { @@ -1173,30 +1173,6 @@ GLuint GLShader::create_shader_stage(GLenum gl_stage, sources[SOURCES_INDEX_VERSION] = glsl_patch_get(gl_stage); sources[SOURCES_INDEX_SPECIALIZATION_CONSTANTS] = constants_source.c_str(); - if (DEBUG_LOG_SHADER_SRC_ON_ERROR) { - /* Store the generated source for printing in case the link fails. */ - StringRefNull source_type; - switch (gl_stage) { - case GL_VERTEX_SHADER: - source_type = "VertShader"; - break; - case GL_GEOMETRY_SHADER: - source_type = "GeomShader"; - break; - case GL_FRAGMENT_SHADER: - source_type = "FragShader"; - break; - case GL_COMPUTE_SHADER: - source_type = "ComputeShader"; - break; - } - - debug_source += "\n\n----------" + source_type + "----------\n\n"; - for (const char *source : sources) { - debug_source.append(source); - } - } - glShaderSource(shader, sources.size(), sources.data(), nullptr); glCompileShader(shader); @@ -1534,7 +1510,7 @@ bool GLShader::program_link() if (!status) { char log[5000]; glGetProgramInfoLog(program_id, sizeof(log), nullptr, log); - Span sources = {debug_source.c_str()}; + Span sources; GLLogParser parser; print_log(sources, log, "Linking", true, &parser); } diff --git a/source/blender/gpu/opengl/gl_shader.hh b/source/blender/gpu/opengl/gl_shader.hh index fb063cb0acb..d0cd351fa07 100644 --- a/source/blender/gpu/opengl/gl_shader.hh +++ b/source/blender/gpu/opengl/gl_shader.hh @@ -139,8 +139,6 @@ class GLShader : public Shader { eGPUShaderTFBType transform_feedback_type_ = GPU_SHADER_TFB_NONE; - std::string debug_source; - public: GLShader(const char *name); ~GLShader(); diff --git a/source/blender/gpu/opengl/gl_state.cc b/source/blender/gpu/opengl/gl_state.cc index 4e1ee86f97c..c67ee6e38d3 100644 --- a/source/blender/gpu/opengl/gl_state.cc +++ b/source/blender/gpu/opengl/gl_state.cc @@ -6,7 +6,7 @@ * \ingroup gpu */ -#include "BKE_global.hh" +#include "BKE_global.h" #include "BLI_math_base.h" #include "BLI_math_bits.h" diff --git a/source/blender/gpu/opengl/gl_storage_buffer.cc b/source/blender/gpu/opengl/gl_storage_buffer.cc index 75958f9c153..85492228b81 100644 --- a/source/blender/gpu/opengl/gl_storage_buffer.cc +++ b/source/blender/gpu/opengl/gl_storage_buffer.cc @@ -33,25 +33,6 @@ GLStorageBuf::GLStorageBuf(size_t size, GPUUsageType usage, const char *name) GLStorageBuf::~GLStorageBuf() { - if (read_fence_) { - glDeleteSync(read_fence_); - } - - if (persistent_ptr_) { - if (GLContext::direct_state_access_support) { - glUnmapNamedBuffer(read_ssbo_id_); - } - else { - glBindBuffer(GL_SHADER_STORAGE_BUFFER, read_ssbo_id_); - glUnmapBuffer(GL_SHADER_STORAGE_BUFFER); - glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0); - } - } - - if (read_ssbo_id_) { - GLContext::buf_free(read_ssbo_id_); - } - GLContext::buf_free(ssbo_id_); } @@ -77,7 +58,6 @@ void GLStorageBuf::update(const void *data) if (ssbo_id_ == 0) { this->init(); } - glBindBuffer(GL_SHADER_STORAGE_BUFFER, ssbo_id_); glBufferSubData(GL_SHADER_STORAGE_BUFFER, 0, size_in_bytes_, data); glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0); @@ -183,59 +163,24 @@ void GLStorageBuf::copy_sub(VertBuf *src_, uint dst_offset, uint src_offset, uin void GLStorageBuf::async_flush_to_host() { - if (ssbo_id_ == 0) { - this->init(); - } - - if (read_ssbo_id_ == 0) { - glGenBuffers(1, &read_ssbo_id_); - glBindBuffer(GL_SHADER_STORAGE_BUFFER, read_ssbo_id_); - glBufferStorage(GL_SHADER_STORAGE_BUFFER, - size_in_bytes_, - nullptr, - GL_MAP_PERSISTENT_BIT | GL_MAP_READ_BIT); - persistent_ptr_ = glMapBufferRange( - GL_SHADER_STORAGE_BUFFER, 0, size_in_bytes_, GL_MAP_PERSISTENT_BIT | GL_MAP_READ_BIT); - BLI_assert(persistent_ptr_); - debug::object_label(GL_SHADER_STORAGE_BUFFER, read_ssbo_id_, name_); - } - - if (GLContext::direct_state_access_support) { - glCopyNamedBufferSubData(ssbo_id_, read_ssbo_id_, 0, 0, size_in_bytes_); - } - else { - glBindBuffer(GL_COPY_READ_BUFFER, ssbo_id_); - glBindBuffer(GL_COPY_WRITE_BUFFER, read_ssbo_id_); - glCopyBufferSubData(GL_SHADER_STORAGE_BUFFER, GL_COPY_WRITE_BUFFER, 0, 0, size_in_bytes_); - glBindBuffer(GL_COPY_READ_BUFFER, 0); - glBindBuffer(GL_COPY_WRITE_BUFFER, 0); - } - - glMemoryBarrier(GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT); - - if (read_fence_) { - glDeleteSync(read_fence_); - } - read_fence_ = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0); + GPU_memory_barrier(GPU_BARRIER_BUFFER_UPDATE); } void GLStorageBuf::read(void *data) { - if (data == nullptr) { - return; + if (ssbo_id_ == 0) { + this->init(); } - if (!persistent_ptr_ || !read_fence_) { - this->async_flush_to_host(); + if (GLContext::direct_state_access_support) { + glGetNamedBufferSubData(ssbo_id_, 0, size_in_bytes_, data); } - - while (glClientWaitSync(read_fence_, GL_SYNC_FLUSH_COMMANDS_BIT, 1000) == GL_TIMEOUT_EXPIRED) { - /* Repeat until the data is ready.*/ + else { + /* This binds the buffer to GL_ARRAY_BUFFER and upload the data if any. */ + glBindBuffer(GL_SHADER_STORAGE_BUFFER, ssbo_id_); + glGetBufferSubData(GL_SHADER_STORAGE_BUFFER, 0, size_in_bytes_, data); + glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0); } - glDeleteSync(read_fence_); - read_fence_ = 0; - - memcpy(data, persistent_ptr_, size_in_bytes_); } void GLStorageBuf::sync_as_indirect_buffer() diff --git a/source/blender/gpu/opengl/gl_storage_buffer.hh b/source/blender/gpu/opengl/gl_storage_buffer.hh index be2eb3e8df2..af3fdacb7b2 100644 --- a/source/blender/gpu/opengl/gl_storage_buffer.hh +++ b/source/blender/gpu/opengl/gl_storage_buffer.hh @@ -26,10 +26,6 @@ class GLStorageBuf : public StorageBuf { GLuint ssbo_id_ = 0; /** Usage type. */ GPUUsageType usage_; - /* Read */ - GLuint read_ssbo_id_ = 0; - GLsync read_fence_ = 0; - void *persistent_ptr_ = nullptr; public: GLStorageBuf(size_t size, GPUUsageType usage, const char *name); diff --git a/source/blender/gpu/shaders/gpu_shader_index_2d_array_lines.glsl b/source/blender/gpu/shaders/gpu_shader_index_2d_array_lines.glsl deleted file mode 100644 index 86ed213f4fc..00000000000 --- a/source/blender/gpu/shaders/gpu_shader_index_2d_array_lines.glsl +++ /dev/null @@ -1,27 +0,0 @@ -/* SPDX-FileCopyrightText: 2023 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** - * Constructs a 2D array index buffer with 'ncurves' rows and 'elements_per_curve*2' - * columns. Each row contains 'elements_per_curve' pairs of indexes. - * e.g., for elements_per_curve=32, first two rows are - * 0 1 1 2 2 3 ... 31 32 - * 33 34 34 35 35 36 .. 64 65 - * The index buffer can then be used to draw 'ncurves' curves with 'elements_per_curve+1' - * vertexes each, using GL_LINES primitives. Intended to be used if GL_LINE_STRIP - * primitives can't be used for some reason. - */ -void main() -{ - ivec3 gid = ivec3(gl_GlobalInvocationID); - ivec3 nthreads = ivec3(gl_NumWorkGroups * uvec3(gl_WorkGroupSize)); - for (int y = gid.y + gid.z * nthreads.y; y < ncurves; y += nthreads.y * nthreads.z) { - for (int x = gid.x; x < elements_per_curve; x += nthreads.x) { - int store_index = (x + y * elements_per_curve) * 2; - uint t = uint(x + y * (elements_per_curve + 1)); - out_indices[store_index] = t; - out_indices[store_index + 1] = t + 1u; - } - } -} diff --git a/source/blender/gpu/shaders/gpu_shader_index_2d_array_points.glsl b/source/blender/gpu/shaders/gpu_shader_index_2d_array_points.glsl deleted file mode 100644 index ac2dff0640d..00000000000 --- a/source/blender/gpu/shaders/gpu_shader_index_2d_array_points.glsl +++ /dev/null @@ -1,23 +0,0 @@ -/* SPDX-FileCopyrightText: 2023 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** - * Constructs a simple 2D array index buffer, with 'ncurves' rows and 'elements_per_curve' - * columns. Each row contains 'elements_per_curve-1' indexes and a restart index. - * The index buffer can then be used to draw either 'ncurves' lines with 'elements_per_curve-1' - * vertexes each, or 'ncurves' triangle strips with 'elements_per_curve-3' triangles each. - */ -void main() -{ - ivec3 gid = ivec3(gl_GlobalInvocationID); - ivec3 nthreads = ivec3(gl_NumWorkGroups * uvec3(gl_WorkGroupSize)); - for (int y = gid.y + gid.z * nthreads.y; y < ncurves; y += nthreads.y * nthreads.z) { - for (int x = gid.x; x < elements_per_curve; x += nthreads.x) { - int store_index = x + y * elements_per_curve; - out_indices[store_index] = (x + 1 < elements_per_curve) ? - uint(x + y * (elements_per_curve - 1)) : - 0xFFFFFFFFu; - } - } -} diff --git a/source/blender/gpu/shaders/gpu_shader_index_2d_array_tris.glsl b/source/blender/gpu/shaders/gpu_shader_index_2d_array_tris.glsl deleted file mode 100644 index 6ec9788af4d..00000000000 --- a/source/blender/gpu/shaders/gpu_shader_index_2d_array_tris.glsl +++ /dev/null @@ -1,27 +0,0 @@ -/* SPDX-FileCopyrightText: 2023 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** - * Constructs a 2D array index buffer, with 'ncurves' rows and 'elements_per_curve*6' columns. - * The index buffer can be used to draw 'ncurves' triangle strips with 'elements_per_curve*2' - * triangles each, using GL_TRIANGLES primitives. Intended to be used if GL_TRIANGLE_STRIP - * primitives can't be used for some reason. - */ -void main() -{ - ivec3 gid = ivec3(gl_GlobalInvocationID); - ivec3 nthreads = ivec3(gl_NumWorkGroups * uvec3(gl_WorkGroupSize)); - for (int y = gid.y + gid.z * nthreads.y; y < ncurves; y += nthreads.y * nthreads.z) { - for (int x = gid.x; x < elements_per_curve; x += nthreads.x) { - int store_index = (x + y * elements_per_curve) * 6; - uint t = x + y * (elements_per_curve * 2 + 2); - out_indices[store_index + 0] = t; - out_indices[store_index + 1] = t + 1u; - out_indices[store_index + 2] = t + 2u; - out_indices[store_index + 3] = t + 1u; - out_indices[store_index + 4] = t + 3u; - out_indices[store_index + 5] = t + 2u; - } - } -} diff --git a/source/blender/gpu/shaders/infos/gpu_shader_index_info.hh b/source/blender/gpu/shaders/infos/gpu_shader_index_info.hh deleted file mode 100644 index 4204416b032..00000000000 --- a/source/blender/gpu/shaders/infos/gpu_shader_index_info.hh +++ /dev/null @@ -1,34 +0,0 @@ -/* SPDX-FileCopyrightText: 2022 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup gpu - */ - -#include "gpu_interface_info.hh" -#include "gpu_shader_create_info.hh" - -GPU_SHADER_CREATE_INFO(gpu_shader_index_2d_array_points) - .local_group_size(16, 16, 1) - .push_constant(Type::INT, "elements_per_curve") - .push_constant(Type::INT, "ncurves") - .storage_buf(0, Qualifier::WRITE, "uint", "out_indices[]") - .compute_source("gpu_shader_index_2d_array_points.glsl") - .do_static_compilation(true); - -GPU_SHADER_CREATE_INFO(gpu_shader_index_2d_array_lines) - .local_group_size(16, 16, 1) - .push_constant(Type::INT, "elements_per_curve") - .push_constant(Type::INT, "ncurves") - .storage_buf(0, Qualifier::WRITE, "uint", "out_indices[]") - .compute_source("gpu_shader_index_2d_array_lines.glsl") - .do_static_compilation(true); - -GPU_SHADER_CREATE_INFO(gpu_shader_index_2d_array_tris) - .local_group_size(16, 16, 1) - .push_constant(Type::INT, "elements_per_curve") - .push_constant(Type::INT, "ncurves") - .storage_buf(0, Qualifier::WRITE, "uint", "out_indices[]") - .compute_source("gpu_shader_index_2d_array_tris.glsl") - .do_static_compilation(true); diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_tex_image.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_tex_image.glsl index b956029954e..73524864409 100644 --- a/source/blender/gpu/shaders/material/gpu_shader_material_tex_image.glsl +++ b/source/blender/gpu/shaders/material/gpu_shader_material_tex_image.glsl @@ -56,16 +56,7 @@ void point_map_to_tube(vec3 vin, out vec3 vout) void node_tex_image_linear(vec3 co, sampler2D ima, out vec4 color, out float alpha) { -#ifdef GPU_FRAGMENT_SHADER - vec2 scaling_factor = vec2(film_scaling_factor_get()); - vec2 dx = dFdx(co.xy) / scaling_factor; - vec2 dy = dFdy(co.xy) / scaling_factor; - - color = safe_color(textureGrad(ima, co.xy, dx, dy)); -#else color = safe_color(texture(ima, co.xy)); -#endif - alpha = color.a; } diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_tex_voronoi.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_tex_voronoi.glsl index ef64b4b75eb..84122bd5a44 100644 --- a/source/blender/gpu/shaders/material/gpu_shader_material_tex_voronoi.glsl +++ b/source/blender/gpu/shaders/material/gpu_shader_material_tex_voronoi.glsl @@ -63,7 +63,7 @@ void node_tex_voronoi_f1_1d(vec3 coord, params.max_distance = 0.5 + 0.5 * params.randomness; VoronoiOutput Output = fractal_voronoi_x_fx(params, w); outDistance = Output.Distance; - outColor = vec4(Output.Color, 1.0); + outColor.xyz = Output.Color; outW = Output.Position.w; } @@ -93,7 +93,7 @@ void node_tex_voronoi_smooth_f1_1d(vec3 coord, params.max_distance = 0.5 + 0.5 * params.randomness; VoronoiOutput Output = fractal_voronoi_x_fx(params, w); outDistance = Output.Distance; - outColor = vec4(Output.Color, 1.0); + outColor.xyz = Output.Color; outW = Output.Position.w; } @@ -123,7 +123,7 @@ void node_tex_voronoi_f2_1d(vec3 coord, params.max_distance = (0.5 + 0.5 * params.randomness) * 2.0; VoronoiOutput Output = fractal_voronoi_x_fx(params, w); outDistance = Output.Distance; - outColor = vec4(Output.Color, 1.0); + outColor.xyz = Output.Color; outW = Output.Position.w; } @@ -208,7 +208,7 @@ void node_tex_voronoi_f1_2d(vec3 coord, params.max_distance = voronoi_distance(vec2(0.0), vec2(0.5 + 0.5 * params.randomness), params); VoronoiOutput Output = fractal_voronoi_x_fx(params, coord.xy); outDistance = Output.Distance; - outColor = vec4(Output.Color, 1.0); + outColor.xyz = Output.Color; outPosition = Output.Position.xyz; } @@ -238,7 +238,7 @@ void node_tex_voronoi_smooth_f1_2d(vec3 coord, params.max_distance = voronoi_distance(vec2(0.0), vec2(0.5 + 0.5 * params.randomness), params); VoronoiOutput Output = fractal_voronoi_x_fx(params, coord.xy); outDistance = Output.Distance; - outColor = vec4(Output.Color, 1.0); + outColor.xyz = Output.Color; outPosition = Output.Position.xyz; } @@ -269,7 +269,7 @@ void node_tex_voronoi_f2_2d(vec3 coord, 2.0; VoronoiOutput Output = fractal_voronoi_x_fx(params, coord.xy); outDistance = Output.Distance; - outColor = vec4(Output.Color, 1.0); + outColor.xyz = Output.Color; outPosition = Output.Position.xyz; } @@ -354,7 +354,7 @@ void node_tex_voronoi_f1_3d(vec3 coord, params.max_distance = voronoi_distance(vec3(0.0), vec3(0.5 + 0.5 * params.randomness), params); VoronoiOutput Output = fractal_voronoi_x_fx(params, coord); outDistance = Output.Distance; - outColor = vec4(Output.Color, 1.0); + outColor.xyz = Output.Color; outPosition = Output.Position.xyz; } @@ -384,7 +384,7 @@ void node_tex_voronoi_smooth_f1_3d(vec3 coord, params.max_distance = voronoi_distance(vec3(0.0), vec3(0.5 + 0.5 * params.randomness), params); VoronoiOutput Output = fractal_voronoi_x_fx(params, coord); outDistance = Output.Distance; - outColor = vec4(Output.Color, 1.0); + outColor.xyz = Output.Color; outPosition = Output.Position.xyz; } @@ -415,7 +415,7 @@ void node_tex_voronoi_f2_3d(vec3 coord, 2.0; VoronoiOutput Output = fractal_voronoi_x_fx(params, coord); outDistance = Output.Distance; - outColor = vec4(Output.Color, 1.0); + outColor.xyz = Output.Color; outPosition = Output.Position.xyz; } @@ -501,7 +501,7 @@ void node_tex_voronoi_f1_4d(vec3 coord, params.max_distance = voronoi_distance(vec4(0.0), vec4(0.5 + 0.5 * params.randomness), params); VoronoiOutput Output = fractal_voronoi_x_fx(params, vec4(coord, w)); outDistance = Output.Distance; - outColor = vec4(Output.Color, 1.0); + outColor.xyz = Output.Color; outPosition = Output.Position.xyz; outW = Output.Position.w; } @@ -533,7 +533,7 @@ void node_tex_voronoi_smooth_f1_4d(vec3 coord, params.max_distance = voronoi_distance(vec4(0.0), vec4(0.5 + 0.5 * params.randomness), params); VoronoiOutput Output = fractal_voronoi_x_fx(params, vec4(coord, w)); outDistance = Output.Distance; - outColor = vec4(Output.Color, 1.0); + outColor.xyz = Output.Color; outPosition = Output.Position.xyz; outW = Output.Position.w; } @@ -566,7 +566,7 @@ void node_tex_voronoi_f2_4d(vec3 coord, 2.0; VoronoiOutput Output = fractal_voronoi_x_fx(params, vec4(coord, w)); outDistance = Output.Distance; - outColor = vec4(Output.Color, 1.0); + outColor.xyz = Output.Color; outPosition = Output.Position.xyz; outW = Output.Position.w; } diff --git a/source/blender/gpu/shaders/metal/mtl_shader_defines.msl b/source/blender/gpu/shaders/metal/mtl_shader_defines.msl index 645e5146f9a..15f882aab98 100644 --- a/source/blender/gpu/shaders/metal/mtl_shader_defines.msl +++ b/source/blender/gpu/shaders/metal/mtl_shader_defines.msl @@ -22,11 +22,6 @@ #define DFDY_SIGN 1.0 /* Type definitions. */ -/* int implicitly cast to bool in MSL. */ -using bool32_t = int32_t; -using vec3_1010102_Unorm = uint32_t; -using vec3_1010102_Inorm = int32_t; -/* GLSL types aliases. */ using vec2 = float2; using vec3 = float3; using vec4 = float4; @@ -41,6 +36,7 @@ using mat4x3 = float4x3; using mat4x4 = float4x4; using mat2 = float2x2; using mat3 = float3x3; +using mat3x4 = float3x4; using mat4 = float4x4; using ivec2 = int2; using ivec3 = int3; @@ -48,9 +44,27 @@ using ivec4 = int4; using uvec2 = uint2; using uvec3 = uint3; using uvec4 = uint4; -using bvec2 = bool2; -using bvec3 = bool3; -using bvec4 = bool4; +/* MTLBOOL is used for native boolean's generated by the Metal backend, to avoid type-emulation + * for GLSL booleans, which are treated as integers. */ +#define MTLBOOL bool +#define bool int +#define bvec2 bool2 +#define bvec3 bool3 +#define bvec4 bool4 +#define vec3_1010102_Unorm uint +#define vec3_1010102_Inorm int + +/* Strip GLSL Decorators. */ +/* NOTE: For debugging, keep decorators in to ensure we have not missed any + * shader resources which are not guarded behind Macro's. */ +#if 0 +# define in +# define flat +# define smooth +# define noperspective +# define layout(std140) struct +# define uniform +#endif /* Compute decorators. */ #define TG threadgroup @@ -366,9 +380,6 @@ struct SStruct { #define imageStore(_tex, _coord, _value) _texture_write_internal(_tex, _coord, _value) #define imageStoreFast(_tex, _coord, _value) _texture_write_internal_fast(_tex, _coord, _value) -/* Texture synchronization functions. */ -#define imageFence(image) image.texture->fence() - /* Singular return values from texture functions of type DEPTH are often indexed with either .r or * .x. This is a lightweight wrapper type for handling this syntax. */ union _msl_return_float { @@ -2312,7 +2323,7 @@ template vec mix(vec a, vec b, bvec2 mask) } /* Overload for mix(A, B, bvec). */ -template T mix(T a, T b, bool mask) +template T mix(T a, T b, MTLBOOL mask) { return (mask) ? b : a; } diff --git a/source/blender/gpu/shaders/opengl/glsl_shader_defines.glsl b/source/blender/gpu/shaders/opengl/glsl_shader_defines.glsl index d65c81bda30..d28599a3fcb 100644 --- a/source/blender/gpu/shaders/opengl/glsl_shader_defines.glsl +++ b/source/blender/gpu/shaders/opengl/glsl_shader_defines.glsl @@ -2,66 +2,6 @@ * * SPDX-License-Identifier: GPL-2.0-or-later */ -/** Type aliases. */ -/** IMPORTANT: Be wary of size and alignment matching for types that are present - * in C++ shared code. */ - -/* Boolean in GLSL are 32bit in interface structs. */ -#define bool32_t bool -#define bool2 bvec2 -#define bool3 bvec3 -#define bool4 bvec4 - -#define float2 vec2 -#define float3 vec3 -#define float4 vec4 -#define int2 ivec2 -#define int3 ivec3 -#define int4 ivec4 -#define uint2 uvec2 -#define uint3 uvec3 -#define uint4 uvec4 -/* GLSL already follows the packed alignment / size rules for vec3. */ -#define packed_float3 float3 -#define packed_int3 int3 -#define packed_uint3 uint3 - -#define float2x2 mat2x2 -#define float3x2 mat3x2 -#define float4x2 mat4x2 -#define float2x3 mat2x3 -#define float3x3 mat3x3 -#define float4x3 mat4x3 -#define float2x4 mat2x4 -#define float3x4 mat3x4 -#define float4x4 mat4x4 - -/* Small types are unavailable in GLSL (or badly supported), promote them to bigger type. */ -#define char int -#define char2 int2 -#define char3 int3 -#define char4 int4 -#define short int -#define short2 int2 -#define short3 int3 -#define short4 int4 -#define uchar uint -#define uchar2 uint2 -#define uchar3 uint3 -#define uchar4 uint4 -#define ushort uint -#define ushort2 uint2 -#define ushort3 uint3 -#define ushort4 uint4 -#define half float -#define half2 float2 -#define half3 float3 -#define half4 float4 - -/* Aliases for supported fixed width types. */ -#define int32_t int -#define uint32_t uint - /* Fast store variant macro. In GLSL this is the same as imageStore, but assumes no bounds * checking. */ #define imageStoreFast imageStore @@ -83,9 +23,6 @@ #define isampler2DAtomic isampler2D #define isampler3DAtomic isampler3D -/* Pass through functions. */ -#define imageFence(image) - /* Backend Functions. */ #define select(A, B, mask) mix(A, B, mask) diff --git a/source/blender/gpu/tests/gpu_testing.cc b/source/blender/gpu/tests/gpu_testing.cc index c5d03638160..f61573c4522 100644 --- a/source/blender/gpu/tests/gpu_testing.cc +++ b/source/blender/gpu/tests/gpu_testing.cc @@ -37,7 +37,7 @@ void GPUTest::SetUp() GPU_render_begin(); GPU_context_begin_frame(context); - GPU_debug_capture_begin(nullptr); + GPU_debug_capture_begin(); } void GPUTest::TearDown() diff --git a/source/blender/gpu/tests/gpu_testing.hh b/source/blender/gpu/tests/gpu_testing.hh index 44ba0dd1398..0d6104a2344 100644 --- a/source/blender/gpu/tests/gpu_testing.hh +++ b/source/blender/gpu/tests/gpu_testing.hh @@ -4,7 +4,7 @@ #include "testing/testing.h" -#include "BKE_global.hh" +#include "BKE_global.h" #include "GHOST_C-api.h" diff --git a/source/blender/gpu/vulkan/vk_backend.cc b/source/blender/gpu/vulkan/vk_backend.cc index 299b4937858..051437abb63 100644 --- a/source/blender/gpu/vulkan/vk_backend.cc +++ b/source/blender/gpu/vulkan/vk_backend.cc @@ -129,10 +129,7 @@ void VKBackend::delete_resources() {} void VKBackend::samplers_update() { - VKDevice &device = VKBackend::get().device_; - if (device.is_initialized()) { - device.reinit(); - } + NOT_YET_IMPLEMENTED } void VKBackend::compute_dispatch(int groups_x_len, int groups_y_len, int groups_z_len) @@ -266,7 +263,6 @@ void VKBackend::capabilities_init(VKDevice &device) GCaps.max_textures_geom = limits.maxPerStageDescriptorSampledImages; GCaps.max_textures_frag = limits.maxPerStageDescriptorSampledImages; GCaps.max_samplers = limits.maxSamplerAllocationCount; - GCaps.max_images = limits.maxPerStageDescriptorStorageImages; for (int i = 0; i < 3; i++) { GCaps.max_work_group_count[i] = limits.maxComputeWorkGroupCount[i]; GCaps.max_work_group_size[i] = limits.maxComputeWorkGroupSize[i]; diff --git a/source/blender/gpu/vulkan/vk_backend.hh b/source/blender/gpu/vulkan/vk_backend.hh index 107af4c77ed..e5e35c03583 100644 --- a/source/blender/gpu/vulkan/vk_backend.hh +++ b/source/blender/gpu/vulkan/vk_backend.hh @@ -72,7 +72,7 @@ class VKBackend : public GPUBackend { void render_end() override; void render_step() override; - bool debug_capture_begin(const char *title); + bool debug_capture_begin(); void debug_capture_end(); shaderc::Compiler &get_shaderc_compiler(); diff --git a/source/blender/gpu/vulkan/vk_context.hh b/source/blender/gpu/vulkan/vk_context.hh index fe7884b180e..5e797aa5c98 100644 --- a/source/blender/gpu/vulkan/vk_context.hh +++ b/source/blender/gpu/vulkan/vk_context.hh @@ -50,7 +50,7 @@ class VKContext : public Context, NonCopyable { void debug_group_begin(const char *, int) override; void debug_group_end() override; - bool debug_capture_begin(const char *title) override; + bool debug_capture_begin() override; void debug_capture_end() override; void *debug_capture_scope_create(const char *name) override; bool debug_capture_scope_begin(void *scope) override; diff --git a/source/blender/gpu/vulkan/vk_data_conversion.cc b/source/blender/gpu/vulkan/vk_data_conversion.cc index 31f404fac84..3e41cf0dd2d 100644 --- a/source/blender/gpu/vulkan/vk_data_conversion.cc +++ b/source/blender/gpu/vulkan/vk_data_conversion.cc @@ -768,7 +768,7 @@ template void convert(F32 &dst, const UnsignedNormalized -void convert(UnsignedNormalized & /*dst*/, const UI32 & /*src*/) +void convert(UnsignedNormalized & /*dst*/, const UI32 &src) { BLI_assert_unreachable(); } diff --git a/source/blender/gpu/vulkan/vk_debug.cc b/source/blender/gpu/vulkan/vk_debug.cc index f27aa5607ef..3001aa5a084 100644 --- a/source/blender/gpu/vulkan/vk_debug.cc +++ b/source/blender/gpu/vulkan/vk_debug.cc @@ -8,7 +8,7 @@ #include -#include "BKE_global.hh" +#include "BKE_global.h" #include "CLG_log.h" #include "vk_backend.hh" @@ -30,21 +30,16 @@ void VKContext::debug_group_end() debug::pop_marker(device); } -bool VKContext::debug_capture_begin(const char *title) +bool VKContext::debug_capture_begin() { - return VKBackend::get().debug_capture_begin(title); + return VKBackend::get().debug_capture_begin(); } -bool VKBackend::debug_capture_begin(const char *title) +bool VKBackend::debug_capture_begin() { #ifdef WITH_RENDERDOC - bool result = renderdoc_api_.start_frame_capture(device_get().instance_get(), nullptr); - if (result && title) { - renderdoc_api_.set_frame_capture_title(title); - } - return result; + return renderdoc_api_.start_frame_capture(device_get().instance_get(), nullptr); #else - UNUSED_VARS(title); return false; #endif } @@ -257,12 +252,12 @@ void VKDebuggingTools::print_labels(const VkDebugUtilsMessengerCallbackDataEXT * VKAPI_ATTR VkBool32 VKAPI_CALL messenger_callback(VkDebugUtilsMessageSeverityFlagBitsEXT message_severity, - VkDebugUtilsMessageTypeFlagsEXT /*message_type*/, + VkDebugUtilsMessageTypeFlagsEXT /* message_type*/, const VkDebugUtilsMessengerCallbackDataEXT *callback_data, void *user_data); VKAPI_ATTR VkBool32 VKAPI_CALL messenger_callback(VkDebugUtilsMessageSeverityFlagBitsEXT message_severity, - VkDebugUtilsMessageTypeFlagsEXT /*message_type*/, + VkDebugUtilsMessageTypeFlagsEXT /* message_type*/, const VkDebugUtilsMessengerCallbackDataEXT *callback_data, void *user_data) { diff --git a/source/blender/gpu/vulkan/vk_debug.hh b/source/blender/gpu/vulkan/vk_debug.hh index a7e017453b8..65e96e399b0 100644 --- a/source/blender/gpu/vulkan/vk_debug.hh +++ b/source/blender/gpu/vulkan/vk_debug.hh @@ -7,7 +7,7 @@ */ #pragma once -#include "BKE_global.hh" +#include "BKE_global.h" #include "BLI_compiler_attrs.h" #include "BLI_set.hh" #include "BLI_string.h" diff --git a/source/blender/gpu/vulkan/vk_device.cc b/source/blender/gpu/vulkan/vk_device.cc index 3a6f2a69cab..fd2129a68c5 100644 --- a/source/blender/gpu/vulkan/vk_device.cc +++ b/source/blender/gpu/vulkan/vk_device.cc @@ -27,12 +27,6 @@ extern "C" char datatoc_glsl_shader_defines_glsl[]; namespace blender::gpu { -void VKDevice::reinit() -{ - samplers_.free(); - samplers_.init(); -} - void VKDevice::deinit() { VK_ALLOCATION_CALLBACKS @@ -221,7 +215,6 @@ constexpr int32_t PCI_ID_NVIDIA = 0x10de; constexpr int32_t PCI_ID_INTEL = 0x8086; constexpr int32_t PCI_ID_AMD = 0x1002; constexpr int32_t PCI_ID_ATI = 0x1022; -constexpr int32_t PCI_ID_APPLE = 0x106b; eGPUDeviceType VKDevice::device_type() const { @@ -239,8 +232,6 @@ eGPUDeviceType VKDevice::device_type() const case PCI_ID_AMD: case PCI_ID_ATI: return GPU_DEVICE_ATI; - case PCI_ID_APPLE: - return GPU_DEVICE_APPLE; default: break; } @@ -260,14 +251,12 @@ std::string VKDevice::vendor_name() const /* Below 0x10000 are the PCI vendor IDs (https://pcisig.com/membership/member-companies) */ if (vk_physical_device_properties_.vendorID < 0x10000) { switch (vk_physical_device_properties_.vendorID) { - case PCI_ID_AMD: + case 0x1022: return "Advanced Micro Devices"; - case PCI_ID_NVIDIA: + case 0x10DE: return "NVIDIA Corporation"; - case PCI_ID_INTEL: + case 0x8086: return "Intel Corporation"; - case PCI_ID_APPLE: - return "Apple"; default: return std::to_string(vk_physical_device_properties_.vendorID); } @@ -327,7 +316,7 @@ void VKDevice::context_unregister(VKContext &context) { contexts_.remove(contexts_.first_index_of(std::reference_wrapper(context))); } -Span> VKDevice::contexts_get() const +const Vector> &VKDevice::contexts_get() const { return contexts_; }; diff --git a/source/blender/gpu/vulkan/vk_device.hh b/source/blender/gpu/vulkan/vk_device.hh index fa52c0a6be0..b1f7f9ce041 100644 --- a/source/blender/gpu/vulkan/vk_device.hh +++ b/source/blender/gpu/vulkan/vk_device.hh @@ -186,7 +186,6 @@ class VKDevice : public NonCopyable { */ void init_dummy_buffer(VKContext &context); void init_dummy_color_attachment(); - void reinit(); void deinit(); eGPUDeviceType device_type() const; @@ -208,7 +207,7 @@ class VKDevice : public NonCopyable { void context_register(VKContext &context); void context_unregister(VKContext &context); - Span> contexts_get() const; + const Vector> &contexts_get() const; const VKBuffer &dummy_buffer_get() const { diff --git a/source/blender/gpu/vulkan/vk_framebuffer.cc b/source/blender/gpu/vulkan/vk_framebuffer.cc index de564227b9d..d2077acc2d3 100644 --- a/source/blender/gpu/vulkan/vk_framebuffer.cc +++ b/source/blender/gpu/vulkan/vk_framebuffer.cc @@ -135,7 +135,7 @@ void VKFrameBuffer::build_clear_attachments_color(const float (*clear_colors)[4] /** \name Clear * \{ */ -void VKFrameBuffer::clear(const Span attachments) const +void VKFrameBuffer::clear(const Vector &attachments) const { if (attachments.is_empty()) { return; diff --git a/source/blender/gpu/vulkan/vk_framebuffer.hh b/source/blender/gpu/vulkan/vk_framebuffer.hh index 401ff1e2a6e..5ee504bf6b8 100644 --- a/source/blender/gpu/vulkan/vk_framebuffer.hh +++ b/source/blender/gpu/vulkan/vk_framebuffer.hh @@ -139,7 +139,7 @@ class VKFrameBuffer : public FrameBuffer { void build_clear_attachments_color(const float (*clear_colors)[4], const bool multi_clear_colors, Vector &r_attachments) const; - void clear(Span attachments) const; + void clear(const Vector &attachments) const; }; static inline VKFrameBuffer *unwrap(FrameBuffer *framebuffer) diff --git a/source/blender/gpu/vulkan/vk_shader.cc b/source/blender/gpu/vulkan/vk_shader.cc index 19880b4077e..87d29dbc528 100644 --- a/source/blender/gpu/vulkan/vk_shader.cc +++ b/source/blender/gpu/vulkan/vk_shader.cc @@ -20,7 +20,7 @@ #include "BLI_string_utils.hh" #include "BLI_vector.hh" -#include "BKE_global.hh" +#include "BKE_global.h" using namespace blender::gpu::shader; @@ -869,7 +869,7 @@ static VkDescriptorSetLayoutBinding create_descriptor_set_layout_binding( static void add_descriptor_set_layout_bindings( const VKShaderInterface &interface, - const Span resources, + const Vector &resources, Vector &r_bindings, VkShaderStageFlags vk_shader_stages) { @@ -888,7 +888,7 @@ static void add_descriptor_set_layout_bindings( static VkDescriptorSetLayoutCreateInfo create_descriptor_set_layout( const VKShaderInterface &interface, - const Span resources, + const Vector &resources, Vector &r_bindings, VkShaderStageFlags vk_shader_stages) { @@ -1123,9 +1123,9 @@ std::string VKShader::fragment_interface_declare(const shader::ShaderCreateInfo const VKWorkarounds &workarounds = VKBackend::get().device_get().workarounds_get(); ss << "\n/* Interfaces. */\n"; - const Span in_interfaces = info.geometry_source_.is_empty() ? - info.vertex_out_interfaces_ : - info.geometry_out_interfaces_; + const Vector &in_interfaces = info.geometry_source_.is_empty() ? + info.vertex_out_interfaces_ : + info.geometry_out_interfaces_; int location = 0; for (const StageInterfaceInfo *iface : in_interfaces) { print_interface(ss, "in", *iface, location); @@ -1227,10 +1227,10 @@ std::string VKShader::geometry_interface_declare(const shader::ShaderCreateInfo return ss.str(); } -static StageInterfaceInfo *find_interface_by_name(const Span ifaces, - const StringRefNull name) +static StageInterfaceInfo *find_interface_by_name(const Vector &ifaces, + const StringRefNull &name) { - for (StageInterfaceInfo *iface : ifaces) { + for (auto *iface : ifaces) { if (iface->instance_name == name) { return iface; } diff --git a/source/blender/gpu/vulkan/vk_texture.cc b/source/blender/gpu/vulkan/vk_texture.cc index 3104d6e55b3..59d4205e4e9 100644 --- a/source/blender/gpu/vulkan/vk_texture.cc +++ b/source/blender/gpu/vulkan/vk_texture.cc @@ -19,7 +19,7 @@ #include "BLI_math_vector.hh" -#include "BKE_global.hh" +#include "BKE_global.h" namespace blender::gpu { diff --git a/source/blender/gpu/vulkan/vk_vertex_buffer.cc b/source/blender/gpu/vulkan/vk_vertex_buffer.cc index 628d9a3924d..a0bc7dbc2c3 100644 --- a/source/blender/gpu/vulkan/vk_vertex_buffer.cc +++ b/source/blender/gpu/vulkan/vk_vertex_buffer.cc @@ -140,9 +140,6 @@ void VKVertexBuffer::upload_data_direct(const VKBuffer &host_buffer) { device_format_ensure(); if (vertex_format_converter.needs_conversion()) { - if (G.debug & G_DEBUG_GPU) { - std::cout << "PERFORMANCE: Vertex buffer requires conversion.\n"; - } vertex_format_converter.convert(host_buffer.mapped_memory_get(), data, vertex_len); host_buffer.flush(); } diff --git a/source/blender/ikplugin/intern/iksolver_plugin.cc b/source/blender/ikplugin/intern/iksolver_plugin.cc index a490a8391a0..4a658cffa62 100644 --- a/source/blender/ikplugin/intern/iksolver_plugin.cc +++ b/source/blender/ikplugin/intern/iksolver_plugin.cc @@ -428,7 +428,7 @@ static void execute_posetree(Depsgraph *depsgraph, Scene *scene, Object *ob, Pos } copy_v3_v3(rootmat[3], pchan->pose_head); - mul_m4_m4m4(imat, ob->object_to_world().ptr(), rootmat); + mul_m4_m4m4(imat, ob->object_to_world, rootmat); invert_m4_m4(goalinv, imat); LISTBASE_FOREACH (PoseTarget *, target, &tree->targets) { @@ -487,7 +487,7 @@ static void execute_posetree(Depsgraph *depsgraph, Scene *scene, Object *ob, Pos /* end effector in world space */ copy_m4_m4(end_pose, pchan->pose_mat); copy_v3_v3(end_pose[3], pchan->pose_tail); - mul_m4_series(world_pose, goalinv, ob->object_to_world().ptr(), end_pose); + mul_m4_series(world_pose, goalinv, ob->object_to_world, end_pose); /* blend position */ goalpos[0] = fac * goalpos[0] + mfac * world_pose[3][0]; diff --git a/source/blender/ikplugin/intern/itasc_plugin.cc b/source/blender/ikplugin/intern/itasc_plugin.cc index 89217f2134b..545ddc379bc 100644 --- a/source/blender/ikplugin/intern/itasc_plugin.cc +++ b/source/blender/ikplugin/intern/itasc_plugin.cc @@ -36,7 +36,7 @@ #include "BKE_action.h" #include "BKE_armature.hh" #include "BKE_constraint.h" -#include "BKE_global.hh" +#include "BKE_global.h" #include "DNA_action_types.h" #include "DNA_armature_types.h" #include "DNA_constraint_types.h" @@ -589,10 +589,10 @@ static bool target_callback(const iTaSC::Timestamp ×tamp, float chanmat[4][4]; copy_m4_m4(chanmat, pchan->pose_mat); copy_v3_v3(chanmat[3], pchan->pose_tail); - mul_m4_series(restmat, target->owner->object_to_world().ptr(), chanmat, target->eeRest); + mul_m4_series(restmat, target->owner->object_to_world, chanmat, target->eeRest); } else { - mul_m4_m4m4(restmat, target->owner->object_to_world().ptr(), target->eeRest); + mul_m4_m4m4(restmat, target->owner->object_to_world, target->eeRest); } /* blend the target */ blend_m4_m4m4(tarmat, restmat, tarmat, constraint->enforce); @@ -623,10 +623,10 @@ static bool base_callback(const iTaSC::Timestamp ×tamp, ikscene->baseFrame.setValue(&chanmat[0][0]); /* iTaSC armature is scaled to object scale, scale the base frame too */ ikscene->baseFrame.p *= ikscene->blScale; - mul_m4_m4m4(rootmat, ikscene->blArmature->object_to_world().ptr(), chanmat); + mul_m4_m4m4(rootmat, ikscene->blArmature->object_to_world, chanmat); } else { - copy_m4_m4(rootmat, ikscene->blArmature->object_to_world().ptr()); + copy_m4_m4(rootmat, ikscene->blArmature->object_to_world); ikscene->baseFrame = iTaSC::F_identity; } next.setValue(&rootmat[0][0]); @@ -1068,7 +1068,7 @@ static void convert_pose(IK_Scene *ikscene) int a, joint; /* assume uniform scaling and take Y scale as general scale for the armature */ - scale = len_v3(ikscene->blArmature->object_to_world().ptr()[1]); + scale = len_v3(ikscene->blArmature->object_to_world[1]); rot = ikscene->jointArray(0); for (joint = a = 0, ikchan = ikscene->channels; a < ikscene->numchan && joint < ikscene->numjoint; @@ -1109,7 +1109,7 @@ static void BKE_pose_rest(IK_Scene *ikscene) int a, joint; /* assume uniform scaling and take Y scale as general scale for the armature */ - scale = len_v3(ikscene->blArmature->object_to_world().ptr()[1]); + scale = len_v3(ikscene->blArmature->object_to_world[1]); /* rest pose is 0 */ SetToZero(ikscene->jointArray); /* except for transY joints */ @@ -1188,7 +1188,7 @@ static IK_Scene *convert_tree( } ikscene->blArmature = ob; /* assume uniform scaling and take Y scale as general scale for the armature */ - ikscene->blScale = len_v3(ob->object_to_world().ptr()[1]); + ikscene->blScale = len_v3(ob->object_to_world[1]); ikscene->blInvScale = (ikscene->blScale < KDL::epsilon) ? 0.0f : 1.0f / ikscene->blScale; std::string joint; @@ -1676,7 +1676,7 @@ static void create_scene(Depsgraph *depsgraph, Scene *scene, Object *ob, float c static int init_scene(Object *ob) { /* check also if scaling has changed */ - float scale = len_v3(ob->object_to_world().ptr()[1]); + float scale = len_v3(ob->object_to_world[1]); IK_Scene *scene; if (ob->pose->ikdata) { diff --git a/source/blender/imbuf/CMakeLists.txt b/source/blender/imbuf/CMakeLists.txt index c02870489f3..72e35d477e2 100644 --- a/source/blender/imbuf/CMakeLists.txt +++ b/source/blender/imbuf/CMakeLists.txt @@ -102,8 +102,8 @@ else() endif() # Keep until APPLE/ARM libraries are updated. -if(APPLE OR WIN32) - if(CMAKE_OSX_ARCHITECTURES MATCHES arm64 OR CMAKE_SYSTEM_PROCESSOR STREQUAL "ARM64") +if(APPLE) + if(CMAKE_OSX_ARCHITECTURES MATCHES arm64) list(APPEND INC_SYS ${IMATH_INCLUDE_DIRS} ) @@ -124,6 +124,16 @@ if(WITH_IMAGE_OPENJPEG) add_definitions(-DWITH_OPENJPEG ${OPENJPEG_DEFINES}) endif() +if(WITH_CODEC_AVI) + list(APPEND INC + ../io/avi + ) + list(APPEND LIB + bf_avi + ) + add_definitions(-DWITH_AVI) +endif() + if(WITH_CODEC_FFMPEG) list(APPEND INC ../../../intern/ffmpeg diff --git a/source/blender/imbuf/IMB_colormanagement.hh b/source/blender/imbuf/IMB_colormanagement.hh index db3b018f7fe..41433d204b7 100644 --- a/source/blender/imbuf/IMB_colormanagement.hh +++ b/source/blender/imbuf/IMB_colormanagement.hh @@ -83,7 +83,7 @@ BLI_INLINE void IMB_colormanagement_aces_to_scene_linear(float scene_linear[3], const float aces[3]); BLI_INLINE void IMB_colormanagement_scene_linear_to_aces(float aces[3], const float scene_linear[3]); -const float *IMB_colormanagement_get_xyz_to_scene_linear(); +const float *IMB_colormanagement_get_xyz_to_scene_linear(void); /** \} */ @@ -300,12 +300,12 @@ void IMB_display_buffer_release(void *cache_handle); int IMB_colormanagement_display_get_named_index(const char *name); const char *IMB_colormanagement_display_get_indexed_name(int index); -const char *IMB_colormanagement_display_get_default_name(); +const char *IMB_colormanagement_display_get_default_name(void); /** * Used by performance-critical pixel processing areas, such as color widgets. */ ColorManagedDisplay *IMB_colormanagement_display_get_named(const char *name); -const char *IMB_colormanagement_display_get_none_name(); +const char *IMB_colormanagement_display_get_none_name(void); const char *IMB_colormanagement_display_get_default_view_transform_name( ColorManagedDisplay *display); @@ -326,7 +326,7 @@ const char *IMB_colormanagement_view_get_indexed_name(int index); int IMB_colormanagement_look_get_named_index(const char *name); const char *IMB_colormanagement_look_get_indexed_name(int index); -const char *IMB_colormanagement_look_get_default_name(); +const char *IMB_colormanagement_look_get_default_name(void); const char *IMB_colormanagement_look_validate_for_view(const char *view_name, const char *look_name); @@ -483,7 +483,7 @@ bool IMB_colormanagement_setup_glsl_draw_from_space_ctx(const bContext *C, /** * Finish GLSL-based display space conversion. */ -void IMB_colormanagement_finish_glsl_draw(); +void IMB_colormanagement_finish_glsl_draw(void); /** \} */ diff --git a/source/blender/imbuf/IMB_imbuf.hh b/source/blender/imbuf/IMB_imbuf.hh index fb9bfdd5cc9..b789eea51f0 100644 --- a/source/blender/imbuf/IMB_imbuf.hh +++ b/source/blender/imbuf/IMB_imbuf.hh @@ -60,8 +60,8 @@ struct GSet; struct ImageFormatData; struct Stereo3dFormat; -void IMB_init(); -void IMB_exit(); +void IMB_init(void); +void IMB_exit(void); ImBuf *IMB_ibImageFromMemory(const unsigned char *mem, size_t size, @@ -333,6 +333,7 @@ void IMB_close_anim(ImBufAnim *anim); void IMB_close_anim_proxies(ImBufAnim *anim); bool IMB_anim_can_produce_frames(const ImBufAnim *anim); +int ismovie(const char *filepath); int IMB_anim_get_image_width(ImBufAnim *anim); int IMB_anim_get_image_height(ImBufAnim *anim); bool IMB_get_gop_decode_time(ImBufAnim *anim); @@ -396,12 +397,10 @@ bool IMB_ispic_type_matches(const char *filepath, int filetype); int IMB_ispic_type_from_memory(const unsigned char *buf, size_t buf_size); int IMB_ispic_type(const char *filepath); -/** - * Test if the file is a video file (known format, has a video stream and - * supported video codec). - */ bool IMB_isanim(const char *filepath); +int imb_get_anim_type(const char *filepath); + /** * Test if color-space conversions of pixels in buffer need to take into account alpha. */ @@ -521,7 +520,11 @@ void IMB_alpha_under_color_byte(unsigned char *rect, int x, int y, const float b ImBuf *IMB_loadifffile(int file, int flags, char colorspace[IM_MAX_SPACE], const char *descr); ImBuf *IMB_half_x(ImBuf *ibuf1); +ImBuf *IMB_double_fast_x(ImBuf *ibuf1); +ImBuf *IMB_double_x(ImBuf *ibuf1); ImBuf *IMB_half_y(ImBuf *ibuf1); +ImBuf *IMB_double_fast_y(ImBuf *ibuf1); +ImBuf *IMB_double_y(ImBuf *ibuf1); void IMB_flipx(ImBuf *ibuf); void IMB_flipy(ImBuf *ibuf); @@ -592,18 +595,15 @@ void *imb_alloc_pixels(unsigned int x, unsigned int y, unsigned int channels, size_t typesize, - bool initialize_pixels, const char *alloc_name); -bool imb_addrectImBuf(ImBuf *ibuf, bool initialize_pixels = true); +bool imb_addrectImBuf(ImBuf *ibuf); /** * Any free `ibuf->rect` frees mipmaps to be sure, creation is in render on first request. */ void imb_freerectImBuf(ImBuf *ibuf); -bool imb_addrectfloatImBuf(ImBuf *ibuf, - const unsigned int channels, - bool initialize_pixels = true); +bool imb_addrectfloatImBuf(ImBuf *ibuf, const unsigned int channels); /** * Any free `ibuf->rect` frees mipmaps to be sure, creation is in render on first request. */ @@ -627,7 +627,7 @@ void IMB_processor_apply_threaded( void(init_handle)(void *handle, int start_line, int tot_line, void *customdata), void *(do_thread)(void *)); -using ScanlineThreadFunc = void (*)(void *custom_data, int scanline); +typedef void (*ScanlineThreadFunc)(void *custom_data, int scanline); void IMB_processor_apply_threaded_scanlines(int total_scanlines, ScanlineThreadFunc do_thread, void *custom_data); @@ -674,8 +674,8 @@ void IMB_transform(const ImBuf *src, /* FFMPEG */ -void IMB_ffmpeg_init(); -const char *IMB_ffmpeg_last_error(); +void IMB_ffmpeg_init(void); +const char *IMB_ffmpeg_last_error(void); GPUTexture *IMB_create_gpu_texture(const char *name, ImBuf *ibuf, diff --git a/source/blender/imbuf/IMB_imbuf_types.hh b/source/blender/imbuf/IMB_imbuf_types.hh index e40f109c8a0..fee5b79a8d2 100644 --- a/source/blender/imbuf/IMB_imbuf_types.hh +++ b/source/blender/imbuf/IMB_imbuf_types.hh @@ -22,7 +22,7 @@ struct IDProperty; * * Types needed for using the image buffer. * - * ImBuf is external code, slightly adapted to live in the Blender + * Imbuf is external code, slightly adapted to live in the Blender * context. It requires an external JPEG module, and the AVI-module * (also external code) in order to function correctly. * @@ -94,7 +94,7 @@ struct ImbFormatOptions { }; /* -------------------------------------------------------------------- */ -/** \name ImBuf Component flags +/** \name Imbuf Component flags * \brief These flags determine the components of an ImBuf struct. * \{ */ @@ -106,11 +106,6 @@ enum eImBufFlags { IB_multilayer = 1 << 7, IB_metadata = 1 << 8, IB_animdeinterlace = 1 << 9, - /** Do not clear image pixel buffer to zero. Without this flag, allocating - * a new ImBuf does clear the pixel data to zero (transparent black). If - * whole pixel data is overwritten after allocation, then this flag can be - * faster since it avoids a memory clear. */ - IB_uninitialized_pixels = 1 << 10, /** indicates whether image on disk have premul alpha */ IB_alphamode_premul = 1 << 12, @@ -128,7 +123,7 @@ enum eImBufFlags { /** \} */ /* -------------------------------------------------------------------- */ -/** \name ImBuf buffer storage +/** \name Imbuf buffer storage * \{ */ /* Specialization of an ownership whenever a bare pointer is provided to the ImBuf buffers @@ -292,7 +287,7 @@ enum { /** \} */ /* -------------------------------------------------------------------- */ -/** \name ImBuf Preset Profile Tags +/** \name Imbuf Preset Profile Tags * * \brief Some predefined color space profiles that 8 bit imbufs can represent. * \{ */ @@ -328,7 +323,7 @@ extern const char *imb_ext_movie[]; extern const char *imb_ext_audio[]; /* -------------------------------------------------------------------- */ -/** \name ImBuf Color Management Flag +/** \name Imbuf Color Management Flag * * \brief Used with #ImBuf.colormanage_flag * \{ */ diff --git a/source/blender/imbuf/IMB_metadata.hh b/source/blender/imbuf/IMB_metadata.hh index 3bb7aae4492..1d501ca351e 100644 --- a/source/blender/imbuf/IMB_metadata.hh +++ b/source/blender/imbuf/IMB_metadata.hh @@ -39,7 +39,7 @@ void IMB_metadata_free(IDProperty *metadata); * \param len: length of value buffer allocated by user. * \return 1 (true) if metadata is present and value for the key found, 0 (false) otherwise. */ -bool IMB_metadata_get_field(const IDProperty *metadata, +bool IMB_metadata_get_field(IDProperty *metadata, const char *key, char *value, size_t value_maxncpy); @@ -54,9 +54,9 @@ bool IMB_metadata_get_field(const IDProperty *metadata, */ void IMB_metadata_set_field(IDProperty *metadata, const char *key, const char *value); -void IMB_metadata_copy(ImBuf *ibuf_dst, const ImBuf *ibuf_src); +void IMB_metadata_copy(ImBuf *dimb, ImBuf *simb); IDProperty *IMB_anim_load_metadata(ImBufAnim *anim); /* Invoke callback for every value stored in the metadata. */ -using IMBMetadataForeachCb = void (*)(const char *field, const char *value, void *userdata); +typedef void (*IMBMetadataForeachCb)(const char *field, const char *value, void *userdata); void IMB_metadata_foreach(ImBuf *ibuf, IMBMetadataForeachCb callback, void *userdata); diff --git a/source/blender/imbuf/IMB_moviecache.hh b/source/blender/imbuf/IMB_moviecache.hh index 727c5c4352e..aa542379c1a 100644 --- a/source/blender/imbuf/IMB_moviecache.hh +++ b/source/blender/imbuf/IMB_moviecache.hh @@ -18,17 +18,14 @@ struct ImBuf; struct MovieCache; -using MovieCacheGetKeyDataFP = void (*)(void *userkey, - int *framenr, - int *proxy, - int *render_flags); +typedef void (*MovieCacheGetKeyDataFP)(void *userkey, int *framenr, int *proxy, int *render_flags); -using MovieCacheGetPriorityDataFP = void *(*)(void *userkey); -using MovieCacheGetItemPriorityFP = int (*)(void *last_userkey, void *priority_data); -using MovieCachePriorityDeleterFP = void (*)(void *priority_data); +typedef void *(*MovieCacheGetPriorityDataFP)(void *userkey); +typedef int (*MovieCacheGetItemPriorityFP)(void *last_userkey, void *priority_data); +typedef void (*MovieCachePriorityDeleterFP)(void *priority_data); -void IMB_moviecache_init(); -void IMB_moviecache_destruct(); +void IMB_moviecache_init(void); +void IMB_moviecache_destruct(void); MovieCache *IMB_moviecache_create(const char *name, int keysize, diff --git a/source/blender/imbuf/IMB_openexr.hh b/source/blender/imbuf/IMB_openexr.hh index ceda7cb9dbe..8e8e8e2a142 100644 --- a/source/blender/imbuf/IMB_openexr.hh +++ b/source/blender/imbuf/IMB_openexr.hh @@ -20,7 +20,7 @@ struct StampData; -void *IMB_exr_get_handle(); +void *IMB_exr_get_handle(void); void *IMB_exr_get_handle_name(const char *name); /** diff --git a/source/blender/imbuf/IMB_thumbs.hh b/source/blender/imbuf/IMB_thumbs.hh index 8d95adcb225..c03c6323653 100644 --- a/source/blender/imbuf/IMB_thumbs.hh +++ b/source/blender/imbuf/IMB_thumbs.hh @@ -46,13 +46,13 @@ enum ThumbSource { #define THUMB_DEFAULT_HASH "00000000000000000000000000000000" /** - * Create thumbnail for file and returns new ImBuf for thumbnail. + * Create thumbnail for file and returns new imbuf for thumbnail. * \param filepath: File path (but not a library path!) to the thumbnail to be created. */ ImBuf *IMB_thumb_create(const char *filepath, ThumbSize size, ThumbSource source, ImBuf *img); /** - * Read thumbnail for file and returns new ImBuf for thumbnail. + * Read thumbnail for file and returns new imbuf for thumbnail. * \param file_or_lib_path: File path or library-ID path (e.g. `/a/b.blend/Material/MyMaterial`) to * the thumbnail to be read. */ @@ -78,7 +78,7 @@ ImBuf *IMB_thumb_manage(const char *file_or_lib_path, ThumbSize size, ThumbSourc /** * Create the necessary directories to store the thumbnails. */ -void IMB_thumb_makedirs(); +void IMB_thumb_makedirs(void); /** * Special function for loading a thumbnail embedded into a blend file. @@ -93,7 +93,7 @@ bool IMB_thumb_load_font_get_hash(char *r_hash); /* Threading */ -void IMB_thumb_locks_acquire(); -void IMB_thumb_locks_release(); +void IMB_thumb_locks_acquire(void); +void IMB_thumb_locks_release(void); void IMB_thumb_path_lock(const char *path); void IMB_thumb_path_unlock(const char *path); diff --git a/source/blender/imbuf/intern/IMB_allocimbuf.hh b/source/blender/imbuf/intern/IMB_allocimbuf.hh index 401662c0d0f..dc8fc450432 100644 --- a/source/blender/imbuf/intern/IMB_allocimbuf.hh +++ b/source/blender/imbuf/intern/IMB_allocimbuf.hh @@ -9,14 +9,14 @@ struct ImBuf; -void imb_refcounter_lock_init(); -void imb_refcounter_lock_exit(); +void imb_refcounter_lock_init(void); +void imb_refcounter_lock_exit(void); #ifndef WIN32 -void imb_mmap_lock_init(); -void imb_mmap_lock_exit(); -void imb_mmap_lock(); -void imb_mmap_unlock(); +void imb_mmap_lock_init(void); +void imb_mmap_lock_exit(void); +void imb_mmap_lock(void); +void imb_mmap_unlock(void); #else # define imb_mmap_lock_init() # define imb_mmap_lock_exit() diff --git a/source/blender/imbuf/intern/IMB_anim.hh b/source/blender/imbuf/intern/IMB_anim.hh index 188dbd52c60..77f675d4ba2 100644 --- a/source/blender/imbuf/intern/IMB_anim.hh +++ b/source/blender/imbuf/intern/IMB_anim.hh @@ -8,26 +8,70 @@ #pragma once -#include +#ifdef _WIN32 +# define INC_OLE2 +# include +# include +# include +# include +# include +# include -#include "IMB_imbuf_enums.h" +# undef AVIIF_KEYFRAME /* redefined in AVI_avi.h */ +# undef AVIIF_LIST /* redefined in AVI_avi.h */ +#endif /* _WIN32 */ -#ifdef WITH_FFMPEG -struct AVFormatContext; -struct AVCodecContext; -struct AVCodec; -struct AVFrame; -struct AVPacket; -struct SwsContext; +#include +#include +#include +#include + +#ifdef _WIN32 +# include +#else +# include #endif +#include "imbuf.hh" + +#ifdef WITH_AVI +# include "AVI_avi.h" +#endif + +#include "IMB_imbuf.hh" +#include "IMB_imbuf_types.hh" + +#ifdef WITH_FFMPEG +extern "C" { +# include +# include +# include +} +#endif + +/* more endianness... should move to a separate file... */ +#ifdef __BIG_ENDIAN__ +# define LITTLE_LONG SWAP_LONG +#else +# define LITTLE_LONG ENDIAN_NOP +#endif + +/** #ImBufAnim::curtype, runtime only. */ +#define ANIM_NONE 0 +#define ANIM_SEQUENCE (1 << 0) +#define ANIM_MOVIE (1 << 4) +#define ANIM_AVI (1 << 6) +#define ANIM_FFMPEG (1 << 8) + +#define MAXNUMSTREAMS 50 + struct IDProperty; +struct _AviMovie; struct ImBufAnimIndex; struct ImBufAnim { - enum class State { Uninitialized, Failed, Valid }; int ib_flags; - State state; + int curtype; int cur_position; /* index 0 = 1e, 1 = 2e, enz. */ int duration_in_frames; int frs_sec; @@ -37,16 +81,38 @@ struct ImBufAnim { /* for number */ char filepath[1024]; + /* for sequence */ + char filepath_first[1024]; + /* movie */ + void *movie; + void *track; + void *params; + int orientation; + size_t framesize; + int interlacing; int streamindex; + /* avi */ + struct _AviMovie *avi; + +#if defined(_WIN32) + /* windows avi */ + int avistreams; + int firstvideo; + int pfileopen; + PAVIFILE pfile; + PAVISTREAM pavi[MAXNUMSTREAMS]; /* the current streams */ + PGETFRAME pgf; +#endif + #ifdef WITH_FFMPEG AVFormatContext *pFormatCtx; AVCodecContext *pCodecCtx; const AVCodec *pCodec; AVFrame *pFrameRGB; AVFrame *pFrameDeinterlaced; - SwsContext *img_convert_ctx; + struct SwsContext *img_convert_ctx; int videoStream; AVFrame *pFrame; @@ -66,11 +132,11 @@ struct ImBufAnim { int proxies_tried; int indices_tried; - ImBufAnim *proxy_anim[IMB_PROXY_MAX_SLOT]; - ImBufAnimIndex *curr_idx[IMB_TC_MAX_SLOT]; + struct ImBufAnim *proxy_anim[IMB_PROXY_MAX_SLOT]; + struct ImBufAnimIndex *curr_idx[IMB_TC_MAX_SLOT]; char colorspace[64]; char suffix[64]; /* MAX_NAME - multiview */ - IDProperty *metadata; + struct IDProperty *metadata; }; diff --git a/source/blender/imbuf/intern/IMB_colormanagement_intern.hh b/source/blender/imbuf/intern/IMB_colormanagement_intern.hh index c700588ecbc..833e4c9b020 100644 --- a/source/blender/imbuf/intern/IMB_colormanagement_intern.hh +++ b/source/blender/imbuf/intern/IMB_colormanagement_intern.hh @@ -77,13 +77,13 @@ struct ColorManagedLook { /* ** Initialization / De-initialization ** */ -void colormanagement_init(); -void colormanagement_exit(); +void colormanagement_init(void); +void colormanagement_exit(void); void colormanage_cache_free(ImBuf *ibuf); -const char *colormanage_display_get_default_name(); -ColorManagedDisplay *colormanage_display_get_default(); +const char *colormanage_display_get_default_name(void); +ColorManagedDisplay *colormanage_display_get_default(void); ColorManagedDisplay *colormanage_display_add(const char *name); ColorManagedDisplay *colormanage_display_get_named(const char *name); ColorManagedDisplay *colormanage_display_get_indexed(int index); diff --git a/source/blender/imbuf/intern/IMB_filetype.hh b/source/blender/imbuf/intern/IMB_filetype.hh index ad3196966a8..d485ad9d9eb 100644 --- a/source/blender/imbuf/intern/IMB_filetype.hh +++ b/source/blender/imbuf/intern/IMB_filetype.hh @@ -24,9 +24,9 @@ struct ImBuf; struct ImFileType { /** Optional, called once when initializing. */ - void (*init)(); + void (*init)(void); /** Optional, called once when exiting. */ - void (*exit)(); + void (*exit)(void); /** * Check if the data matches this file types 'magic', @@ -67,8 +67,8 @@ extern const ImFileType *IMB_FILE_TYPES_LAST; const ImFileType *IMB_file_type_from_ftype(int ftype); const ImFileType *IMB_file_type_from_ibuf(const ImBuf *ibuf); -void imb_filetypes_init(); -void imb_filetypes_exit(); +void imb_filetypes_init(void); +void imb_filetypes_exit(void); /** \} */ diff --git a/source/blender/imbuf/intern/IMB_filter.hh b/source/blender/imbuf/intern/IMB_filter.hh index 66af19b03c7..963f89a1af3 100644 --- a/source/blender/imbuf/intern/IMB_filter.hh +++ b/source/blender/imbuf/intern/IMB_filter.hh @@ -13,6 +13,8 @@ struct ImBuf; +void imb_filterx(ImBuf *ibuf); + void IMB_premultiply_rect(uint8_t *rect, char planes, int w, int h); void IMB_premultiply_rect_float(float *rect_float, int channels, int w, int h); diff --git a/source/blender/imbuf/intern/allocimbuf.cc b/source/blender/imbuf/intern/allocimbuf.cc index 481561fb502..1c5f9ab5b79 100644 --- a/source/blender/imbuf/intern/allocimbuf.cc +++ b/source/blender/imbuf/intern/allocimbuf.cc @@ -87,15 +87,11 @@ template static void imb_free_buffer(BufferType &buffer) /* Allocate pixel storage of the given buffer. The buffer owns the allocated memory. * Returns true of allocation succeeded, false otherwise. */ template -bool imb_alloc_buffer(BufferType &buffer, - const uint x, - const uint y, - const uint channels, - const size_t type_size, - bool initialize_pixels) +bool imb_alloc_buffer( + BufferType &buffer, const uint x, const uint y, const uint channels, const size_t type_size) { buffer.data = static_cast( - imb_alloc_pixels(x, y, channels, type_size, initialize_pixels, __func__)); + imb_alloc_pixels(x, y, channels, type_size, __func__)); if (!buffer.data) { return false; } @@ -301,9 +297,7 @@ bool imb_addencodedbufferImBuf(ImBuf *ibuf) ibuf->encoded_size = 0; - if (!imb_alloc_buffer( - ibuf->encoded_buffer, ibuf->encoded_buffer_size, 1, 1, sizeof(uint8_t), true)) - { + if (!imb_alloc_buffer(ibuf->encoded_buffer, ibuf->encoded_buffer_size, 1, 1, sizeof(uint8_t))) { return false; } @@ -329,7 +323,7 @@ bool imb_enlargeencodedbufferImBuf(ImBuf *ibuf) } ImBufByteBuffer new_buffer; - if (!imb_alloc_buffer(new_buffer, newsize, 1, 1, sizeof(uint8_t), true)) { + if (!imb_alloc_buffer(new_buffer, newsize, 1, 1, sizeof(uint8_t))) { return false; } @@ -349,8 +343,7 @@ bool imb_enlargeencodedbufferImBuf(ImBuf *ibuf) return true; } -void *imb_alloc_pixels( - uint x, uint y, uint channels, size_t typesize, bool initialize_pixels, const char *alloc_name) +void *imb_alloc_pixels(uint x, uint y, uint channels, size_t typesize, const char *alloc_name) { /* Protect against buffer overflow vulnerabilities from files specifying * a width and height that overflow and alloc too little memory. */ @@ -359,10 +352,10 @@ void *imb_alloc_pixels( } size_t size = size_t(x) * size_t(y) * size_t(channels) * typesize; - return initialize_pixels ? MEM_callocN(size, alloc_name) : MEM_mallocN(size, alloc_name); + return MEM_callocN(size, alloc_name); } -bool imb_addrectfloatImBuf(ImBuf *ibuf, const uint channels, bool initialize_pixels) +bool imb_addrectfloatImBuf(ImBuf *ibuf, const uint channels) { if (ibuf == nullptr) { return false; @@ -375,9 +368,7 @@ bool imb_addrectfloatImBuf(ImBuf *ibuf, const uint channels, bool initialize_pix imb_freerectfloatImBuf(ibuf); /* frees mipmap too, hrm */ } - if (!imb_alloc_buffer( - ibuf->float_buffer, ibuf->x, ibuf->y, channels, sizeof(float), initialize_pixels)) - { + if (!imb_alloc_buffer(ibuf->float_buffer, ibuf->x, ibuf->y, channels, sizeof(float))) { return false; } @@ -387,7 +378,7 @@ bool imb_addrectfloatImBuf(ImBuf *ibuf, const uint channels, bool initialize_pix return true; } -bool imb_addrectImBuf(ImBuf *ibuf, bool initialize_pixels) +bool imb_addrectImBuf(ImBuf *ibuf) { /* Question; why also add ZBUF (when `planes > 32`)? */ @@ -399,9 +390,7 @@ bool imb_addrectImBuf(ImBuf *ibuf, bool initialize_pixels) * this call is used only too give float buffers display. */ imb_free_buffer(ibuf->byte_buffer); - if (!imb_alloc_buffer( - ibuf->byte_buffer, ibuf->x, ibuf->y, 4, sizeof(uint8_t), initialize_pixels)) - { + if (!imb_alloc_buffer(ibuf->byte_buffer, ibuf->x, ibuf->y, 4, sizeof(uint8_t))) { return false; } @@ -516,13 +505,13 @@ ImBuf *IMB_allocFromBuffer( if (float_buffer) { /* TODO(sergey): The 4 channels is the historical code. Should probably be `channels`, but * needs a dedicated investigation. */ - imb_alloc_buffer(ibuf->float_buffer, w, h, 4, sizeof(float), false); + imb_alloc_buffer(ibuf->float_buffer, w, h, 4, sizeof(float)); memcpy(ibuf->float_buffer.data, float_buffer, sizeof(float[4]) * w * h); } if (byte_buffer) { - imb_alloc_buffer(ibuf->byte_buffer, w, h, 4, sizeof(uint8_t), false); + imb_alloc_buffer(ibuf->byte_buffer, w, h, 4, sizeof(uint8_t)); memcpy(ibuf->byte_buffer.data, byte_buffer, sizeof(uint8_t[4]) * w * h); } @@ -559,16 +548,14 @@ bool IMB_initImBuf(ImBuf *ibuf, uint x, uint y, uchar planes, uint flags) /* IMB_DPI_DEFAULT -> pixels-per-meter. */ ibuf->ppm[0] = ibuf->ppm[1] = IMB_DPI_DEFAULT / 0.0254; - const bool init_pixels = (flags & IB_uninitialized_pixels) == 0; - if (flags & IB_rect) { - if (imb_addrectImBuf(ibuf, init_pixels) == false) { + if (imb_addrectImBuf(ibuf) == false) { return false; } } if (flags & IB_rectfloat) { - if (imb_addrectfloatImBuf(ibuf, ibuf->channels, init_pixels) == false) { + if (imb_addrectfloatImBuf(ibuf, ibuf->channels) == false) { return false; } } @@ -582,7 +569,7 @@ bool IMB_initImBuf(ImBuf *ibuf, uint x, uint y, uchar planes, uint flags) ImBuf *IMB_dupImBuf(const ImBuf *ibuf1) { ImBuf *ibuf2, tbuf; - int flags = IB_uninitialized_pixels; + int flags = 0; int a, x, y; if (ibuf1 == nullptr) { diff --git a/source/blender/imbuf/intern/anim_movie.cc b/source/blender/imbuf/intern/anim_movie.cc index 3d51969dd46..104076835b8 100644 --- a/source/blender/imbuf/intern/anim_movie.cc +++ b/source/blender/imbuf/intern/anim_movie.cc @@ -6,6 +6,26 @@ * \ingroup imbuf */ +#ifdef _WIN32 +# include "BLI_winstuff.h" +# include + +# undef AVIIF_KEYFRAME /* redefined in AVI_avi.h */ +# undef AVIIF_LIST /* redefined in AVI_avi.h */ + +# define FIXCC(fcc) \ + { \ + if (fcc == 0) { \ + fcc = mmioFOURCC('N', 'o', 'n', 'e'); \ + } \ + if (fcc == BI_RLE8) { \ + fcc = mmioFOURCC('R', 'l', 'e', '8'); \ + } \ + } \ + (void)0 + +#endif + #include #include #include @@ -27,6 +47,10 @@ #include "MEM_guardedalloc.h" +#ifdef WITH_AVI +# include "AVI_avi.h" +#endif + #include "IMB_imbuf.hh" #include "IMB_imbuf_types.hh" @@ -38,6 +62,7 @@ #include "IMB_metadata.hh" #ifdef WITH_FFMPEG +# include "BKE_global.h" /* ENDIAN_ORDER */ # include "BKE_writeffmpeg.hh" extern "C" { @@ -52,6 +77,66 @@ extern "C" { #endif /* WITH_FFMPEG */ +int ismovie(const char * /*filepath*/) +{ + return 0; +} + +/* never called, just keep the linker happy */ +static int startmovie(ImBufAnim * /*anim*/) +{ + return 1; +} +static ImBuf *movie_fetchibuf(ImBufAnim * /*anim*/, int /*position*/) +{ + return nullptr; +} +static void free_anim_movie(ImBufAnim * /*anim*/) +{ + /* pass */ +} + +#ifdef WITH_AVI +static void free_anim_avi(ImBufAnim *anim) +{ +# if defined(_WIN32) + int i; +# endif + + if (anim == nullptr) { + return; + } + if (anim->avi == nullptr) { + return; + } + + AVI_close(anim->avi); + MEM_freeN(anim->avi); + anim->avi = nullptr; + +# if defined(_WIN32) + + if (anim->pgf) { + AVIStreamGetFrameClose(anim->pgf); + anim->pgf = nullptr; + } + + for (i = 0; i < anim->avistreams; i++) { + AVIStreamRelease(anim->pavi[i]); + } + anim->avistreams = 0; + + if (anim->pfileopen) { + AVIFileRelease(anim->pfile); + anim->pfileopen = 0; + AVIFileExit(); + } +# endif + + anim->duration_in_frames = 0; +} +#endif /* WITH_AVI */ + #ifdef WITH_FFMPEG static void free_anim_ffmpeg(ImBufAnim *anim); #endif @@ -63,6 +148,12 @@ void IMB_free_anim(ImBufAnim *anim) return; } + free_anim_movie(anim); + +#ifdef WITH_AVI + free_anim_avi(anim); +#endif + #ifdef WITH_FFMPEG free_anim_ffmpeg(anim); #endif @@ -92,23 +183,35 @@ void IMB_close_anim_proxies(ImBufAnim *anim) IDProperty *IMB_anim_load_metadata(ImBufAnim *anim) { - if (anim->state == ImBufAnim::State::Valid) { + switch (anim->curtype) { + case ANIM_FFMPEG: { #ifdef WITH_FFMPEG - BLI_assert(anim->pFormatCtx != nullptr); - av_log(anim->pFormatCtx, AV_LOG_DEBUG, "METADATA FETCH\n"); + AVDictionaryEntry *entry = nullptr; - AVDictionaryEntry *entry = nullptr; - while (true) { - entry = av_dict_get(anim->pFormatCtx->metadata, "", entry, AV_DICT_IGNORE_SUFFIX); - if (entry == nullptr) { - break; + BLI_assert(anim->pFormatCtx != nullptr); + av_log(anim->pFormatCtx, AV_LOG_DEBUG, "METADATA FETCH\n"); + + while (true) { + entry = av_dict_get(anim->pFormatCtx->metadata, "", entry, AV_DICT_IGNORE_SUFFIX); + if (entry == nullptr) { + break; + } + + /* Delay creation of the property group until there is actual metadata to put in there. */ + IMB_metadata_ensure(&anim->metadata); + IMB_metadata_set_field(anim->metadata, entry->key, entry->value); } - - /* Delay creation of the property group until there is actual metadata to put in there. */ - IMB_metadata_ensure(&anim->metadata); - IMB_metadata_set_field(anim->metadata, entry->key, entry->value); - } #endif + break; + } + case ANIM_SEQUENCE: + case ANIM_AVI: + case ANIM_MOVIE: + /* TODO */ + break; + case ANIM_NONE: + default: + break; } return anim->metadata; } @@ -142,10 +245,15 @@ ImBufAnim *IMB_open_anim(const char *filepath, bool IMB_anim_can_produce_frames(const ImBufAnim *anim) { -#if !defined(WITH_FFMPEG) +#if !(defined(WITH_AVI) || defined(WITH_FFMPEG)) UNUSED_VARS(anim); #endif +#ifdef WITH_AVI + if (anim->avi != nullptr) { + return true; + } +#endif #ifdef WITH_FFMPEG if (anim->pCodecCtx != nullptr) { return true; @@ -159,6 +267,179 @@ void IMB_suffix_anim(ImBufAnim *anim, const char *suffix) STRNCPY(anim->suffix, suffix); } +#ifdef WITH_AVI +static int startavi(ImBufAnim *anim) +{ + + AviError avierror; +# if defined(_WIN32) + HRESULT hr; + int i, firstvideo = -1; + int streamcount; + BYTE abFormat[1024]; + LONG l; + LPBITMAPINFOHEADER lpbi; + AVISTREAMINFO avis; + + streamcount = anim->streamindex; +# endif + + anim->avi = MEM_cnew("animavi"); + + if (anim->avi == nullptr) { + printf("Can't open avi: %s\n", anim->filepath); + return -1; + } + + avierror = AVI_open_movie(anim->filepath, anim->avi); + +# if defined(_WIN32) + if (avierror == AVI_ERROR_COMPRESSION) { + AVIFileInit(); + hr = AVIFileOpen(&anim->pfile, anim->filepath, OF_READ, 0L); + if (hr == 0) { + anim->pfileopen = 1; + for (i = 0; i < MAXNUMSTREAMS; i++) { + if (AVIFileGetStream(anim->pfile, &anim->pavi[i], 0L, i) != AVIERR_OK) { + break; + } + + AVIStreamInfo(anim->pavi[i], &avis, sizeof(avis)); + if ((avis.fccType == streamtypeVIDEO) && (firstvideo == -1)) { + if (streamcount > 0) { + streamcount--; + continue; + } + anim->pgf = AVIStreamGetFrameOpen(anim->pavi[i], nullptr); + if (anim->pgf) { + firstvideo = i; + + /* get stream length */ + anim->avi->header->TotalFrames = AVIStreamLength(anim->pavi[i]); + + /* get information about images inside the stream */ + l = sizeof(abFormat); + AVIStreamReadFormat(anim->pavi[i], 0, &abFormat, &l); + lpbi = (LPBITMAPINFOHEADER)abFormat; + anim->avi->header->Height = lpbi->biHeight; + anim->avi->header->Width = lpbi->biWidth; + } + else { + FIXCC(avis.fccHandler); + FIXCC(avis.fccType); + printf("Can't find AVI decoder for type : %4.4hs/%4.4hs\n", + (LPSTR)&avis.fccType, + (LPSTR)&avis.fccHandler); + } + } + } + + /* register number of opened avistreams */ + anim->avistreams = i; + + /* + * Couldn't get any video streams out of this file + */ + if ((anim->avistreams == 0) || (firstvideo == -1)) { + avierror = AVI_ERROR_FORMAT; + } + else { + avierror = AVI_ERROR_NONE; + anim->firstvideo = firstvideo; + } + } + else { + AVIFileExit(); + } + } +# endif + + if (avierror != AVI_ERROR_NONE) { + AVI_print_error(avierror); + printf("Error loading avi: %s\n", anim->filepath); + free_anim_avi(anim); + return -1; + } + + anim->duration_in_frames = anim->avi->header->TotalFrames; + anim->start_offset = 0.0f; + anim->params = nullptr; + + anim->x = anim->avi->header->Width; + anim->y = anim->avi->header->Height; + anim->interlacing = 0; + anim->orientation = 0; + anim->framesize = anim->x * anim->y * 4; + + anim->cur_position = 0; + +# if 0 + printf("x:%d y:%d size:%d interlace:%d dur:%d\n", + anim->x, + anim->y, + anim->framesize, + anim->interlacing, + anim->duration_in_frames); +# endif + + return 0; +} +#endif /* WITH_AVI */ + +#ifdef WITH_AVI +static ImBuf *avi_fetchibuf(ImBufAnim *anim, int position) +{ + ImBuf *ibuf = nullptr; + int *tmp; + int y; + + if (anim == nullptr) { + return nullptr; + } + +# if defined(_WIN32) + if (anim->avistreams) { + LPBITMAPINFOHEADER lpbi; + + if (anim->pgf) { + lpbi = static_cast( + AVIStreamGetFrame(anim->pgf, position + AVIStreamStart(anim->pavi[anim->firstvideo]))); + if (lpbi) { + ibuf = IMB_ibImageFromMemory( + (const uchar *)lpbi, 100, IB_rect, anim->colorspace, ""); + /* Oh brother... */ + } + } + } + else +# endif + { + ibuf = IMB_allocImBuf(anim->x, anim->y, 24, IB_rect); + + tmp = static_cast(AVI_read_frame( + anim->avi, AVI_FORMAT_RGB32, position, AVI_get_stream(anim->avi, AVIST_VIDEO, 0))); + + if (tmp == nullptr) { + printf("Error reading frame from AVI: '%s'\n", anim->filepath); + IMB_freeImBuf(ibuf); + return nullptr; + } + + for (y = 0; y < anim->y; y++) { + memcpy(&(ibuf->byte_buffer.data)[((anim->y - y) - 1) * anim->x], + &tmp[y * anim->x], + anim->x * 4); + } + + MEM_freeN(tmp); + } + + ibuf->byte_buffer.colorspace = colormanage_colorspace_get_named(anim->colorspace); + + return ibuf; +} +#endif /* WITH_AVI */ + #ifdef WITH_FFMPEG static int startffmpeg(ImBufAnim *anim) @@ -344,6 +625,8 @@ static int startffmpeg(ImBufAnim *anim) * starts. */ anim->start_offset = video_start; + anim->params = nullptr; + anim->x = pCodecCtx->width; anim->y = pCodecCtx->height; @@ -352,6 +635,10 @@ static int startffmpeg(ImBufAnim *anim) anim->pCodec = pCodec; anim->videoStream = video_stream_index; + anim->interlacing = 0; + anim->orientation = 0; + anim->framesize = anim->x * anim->y * 4; + anim->cur_position = 0; anim->cur_pts = -1; anim->cur_key_frame_pts = -1; @@ -1120,7 +1407,7 @@ static ImBuf *ffmpeg_fetchibuf(ImBufAnim *anim, int position, IMB_Timecode_Type * in FFmpeg 4.3.1. It got fixed later on, but for compatibility reasons is * still best to avoid crash. * - * This is achieved by using a separate allocation call rather than relying on + * This is achieved by using own allocation call rather than relying on * IMB_allocImBuf() to do so since the IMB_allocImBuf() is not guaranteed * to perform aligned allocation. * @@ -1183,7 +1470,8 @@ static void free_anim_ffmpeg(ImBufAnim *anim) av_frame_free(&anim->pFrame_backup); av_frame_free(&anim->pFrameRGB); av_frame_free(&anim->pFrameDeinterlaced); - BKE_ffmpeg_sws_release_context(anim->img_convert_ctx); + + sws_freeContext(anim->img_convert_ctx); } anim->duration_in_frames = 0; } @@ -1196,21 +1484,58 @@ static void free_anim_ffmpeg(ImBufAnim *anim) */ static bool anim_getnew(ImBufAnim *anim) { + BLI_assert(anim->curtype == ANIM_NONE); if (anim == nullptr) { /* Nothing to initialize. */ return false; } - BLI_assert(anim->state == ImBufAnim::State::Uninitialized); + free_anim_movie(anim); + +#ifdef WITH_AVI + free_anim_avi(anim); +#endif #ifdef WITH_FFMPEG free_anim_ffmpeg(anim); - if (startffmpeg(anim)) { - anim->state = ImBufAnim::State::Failed; - return false; - } #endif - anim->state = ImBufAnim::State::Valid; + + anim->curtype = imb_get_anim_type(anim->filepath); + + switch (anim->curtype) { + case ANIM_SEQUENCE: { + ImBuf *ibuf = IMB_loadiffname(anim->filepath, anim->ib_flags, anim->colorspace); + if (ibuf) { + STRNCPY(anim->filepath_first, anim->filepath); + anim->duration_in_frames = 1; + IMB_freeImBuf(ibuf); + } + else { + return false; + } + break; + } + case ANIM_MOVIE: + if (startmovie(anim)) { + return false; + } + break; +#ifdef WITH_AVI + case ANIM_AVI: + if (startavi(anim)) { + printf("couldn't start avi\n"); + return false; + } + break; +#endif +#ifdef WITH_FFMPEG + case ANIM_FFMPEG: + if (startffmpeg(anim)) { + return false; + } + break; +#endif + } return true; } @@ -1235,7 +1560,7 @@ ImBuf *IMB_anim_previewframe(ImBufAnim *anim) IMB_metadata_set_field(ibuf->metadata, "Thumb::Video::Frames", value); #ifdef WITH_FFMPEG - if (anim->pFormatCtx) { + if (anim->pFormatCtx && anim->curtype == ANIM_FFMPEG) { AVStream *v_st = anim->pFormatCtx->streams[anim->videoStream]; AVRational frame_rate = av_guess_frame_rate(anim->pFormatCtx, v_st, nullptr); if (frame_rate.num != 0) { @@ -1258,12 +1583,15 @@ ImBuf *IMB_anim_absolute(ImBufAnim *anim, IMB_Proxy_Size preview_size) { ImBuf *ibuf = nullptr; + int filter_y; if (anim == nullptr) { return nullptr; } + filter_y = (anim->ib_flags & IB_animdeinterlace); + if (preview_size == IMB_PROXY_NONE) { - if (anim->state == ImBufAnim::State::Uninitialized) { + if (anim->curtype == ANIM_NONE) { if (!anim_getnew(anim)) { return nullptr; } @@ -1286,16 +1614,51 @@ ImBuf *IMB_anim_absolute(ImBufAnim *anim, } } -#ifdef WITH_FFMPEG - if (anim->state == ImBufAnim::State::Valid) { - ibuf = ffmpeg_fetchibuf(anim, position, tc); - if (ibuf) { - anim->cur_position = position; + switch (anim->curtype) { + case ANIM_SEQUENCE: { + constexpr size_t filepath_size = BOUNDED_ARRAY_TYPE_SIZEfilepath_first)>(); + char head[filepath_size], tail[filepath_size]; + ushort digits; + const int pic = BLI_path_sequence_decode( + anim->filepath_first, head, sizeof(head), tail, sizeof(tail), &digits) + + position; + BLI_path_sequence_encode(anim->filepath, sizeof(anim->filepath), head, tail, digits, pic); + ibuf = IMB_loadiffname(anim->filepath, IB_rect, anim->colorspace); + if (ibuf) { + anim->cur_position = position; + } + break; } - } + case ANIM_MOVIE: + ibuf = movie_fetchibuf(anim, position); + if (ibuf) { + anim->cur_position = position; + IMB_convert_rgba_to_abgr(ibuf); + } + break; +#ifdef WITH_AVI + case ANIM_AVI: + ibuf = avi_fetchibuf(anim, position); + if (ibuf) { + anim->cur_position = position; + } + break; #endif +#ifdef WITH_FFMPEG + case ANIM_FFMPEG: + ibuf = ffmpeg_fetchibuf(anim, position, tc); + if (ibuf) { + anim->cur_position = position; + } + filter_y = 0; /* done internally */ + break; +#endif + } if (ibuf) { + if (filter_y) { + IMB_filtery(ibuf); + } SNPRINTF(ibuf->filepath, "%s.%04d", anim->filepath, anim->cur_position + 1); } return ibuf; diff --git a/source/blender/imbuf/intern/cineon/cineon_dpx.cc b/source/blender/imbuf/intern/cineon/cineon_dpx.cc index 05c150ac89f..8c98037a2f5 100644 --- a/source/blender/imbuf/intern/cineon/cineon_dpx.cc +++ b/source/blender/imbuf/intern/cineon/cineon_dpx.cc @@ -16,7 +16,7 @@ #include "IMB_imbuf.hh" #include "IMB_imbuf_types.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "MEM_guardedalloc.h" diff --git a/source/blender/imbuf/intern/cineon/logImageCore.cc b/source/blender/imbuf/intern/cineon/logImageCore.cc index 594ed286899..8467ed1ecd6 100644 --- a/source/blender/imbuf/intern/cineon/logImageCore.cc +++ b/source/blender/imbuf/intern/cineon/logImageCore.cc @@ -237,7 +237,7 @@ int logImageSetDataRGBA(LogImageFile *logImage, float *data, int dataIsLinearRGB int returnValue; elementData = (float *)imb_alloc_pixels( - logImage->width, logImage->height, logImage->depth, sizeof(float), true, __func__); + logImage->width, logImage->height, logImage->depth, sizeof(float), __func__); if (elementData == nullptr) { return 1; } @@ -438,12 +438,8 @@ int logImageGetDataRGBA(LogImageFile *logImage, float *data, int dataIsLinearRGB /* descriptor_Depth and descriptor_Composite are not supported */ if (!ELEM(logImage->element[i].descriptor, descriptor_Depth, descriptor_Composite)) { /* Allocate memory */ - elementData[i] = static_cast(imb_alloc_pixels(logImage->width, - logImage->height, - logImage->element[i].depth, - sizeof(float), - true, - __func__)); + elementData[i] = static_cast(imb_alloc_pixels( + logImage->width, logImage->height, logImage->element[i].depth, sizeof(float), __func__)); if (elementData[i] == nullptr) { if (verbose) { printf("DPX/Cineon: Cannot allocate memory for elementData[%d]\n.", i); @@ -628,7 +624,7 @@ int logImageGetDataRGBA(LogImageFile *logImage, float *data, int dataIsLinearRGB } mergedData = (float *)imb_alloc_pixels( - logImage->width, logImage->height, mergedElement.depth, sizeof(float), true, __func__); + logImage->width, logImage->height, mergedElement.depth, sizeof(float), __func__); if (mergedData == nullptr) { if (verbose) { printf("DPX/Cineon: Cannot allocate mergedData.\n"); @@ -1711,7 +1707,7 @@ static int convertRGBAToLogElement( if (srcIsLinearRGB != 0) { /* we need to convert src to sRGB */ srgbSrc = (float *)imb_alloc_pixels( - logImage->width, logImage->height, 4, sizeof(float), false, __func__); + logImage->width, logImage->height, 4, sizeof(float), __func__); if (srgbSrc == nullptr) { return 1; } diff --git a/source/blender/imbuf/intern/colormanagement.cc b/source/blender/imbuf/intern/colormanagement.cc index f6e19a36734..e2c6c6c1c60 100644 --- a/source/blender/imbuf/intern/colormanagement.cc +++ b/source/blender/imbuf/intern/colormanagement.cc @@ -39,6 +39,7 @@ #include "BKE_appdir.hh" #include "BKE_colortools.hh" #include "BKE_context.hh" +#include "BKE_image.h" #include "BKE_image_format.h" #include "BKE_main.hh" diff --git a/source/blender/imbuf/intern/divers.cc b/source/blender/imbuf/intern/divers.cc index 086ef1f9429..396dee05c07 100644 --- a/source/blender/imbuf/intern/divers.cc +++ b/source/blender/imbuf/intern/divers.cc @@ -702,7 +702,7 @@ void IMB_rect_from_float(ImBuf *ibuf) /* create byte rect if it didn't exist yet */ if (ibuf->byte_buffer.data == nullptr) { - if (imb_addrectImBuf(ibuf, false) == 0) { + if (imb_addrectImBuf(ibuf) == 0) { return; } } diff --git a/source/blender/imbuf/intern/filter.cc b/source/blender/imbuf/intern/filter.cc index cdbbcfabb6b..fac3a8d43ba 100644 --- a/source/blender/imbuf/intern/filter.cc +++ b/source/blender/imbuf/intern/filter.cc @@ -19,6 +19,44 @@ #include "imbuf.hh" +static void filtrow(uchar *point, int x) +{ + uint c1, c2, c3, error; + + if (x > 1) { + c1 = c2 = *point; + error = 2; + for (x--; x > 0; x--) { + c3 = point[4]; + c1 += (c2 << 1) + c3 + error; + error = c1 & 3; + *point = c1 >> 2; + point += 4; + c1 = c2; + c2 = c3; + } + *point = (c1 + (c2 << 1) + c2 + error) >> 2; + } +} + +static void filtrowf(float *point, int x) +{ + float c1, c2, c3; + + if (x > 1) { + c1 = c2 = *point; + for (x--; x > 0; x--) { + c3 = point[4]; + c1 += (c2 * 2) + c3; + *point = 0.25f * c1; + point += 4; + c1 = c2; + c2 = c3; + } + *point = 0.25f * (c1 + (c2 * 2) + c2); + } +} + static void filtcolum(uchar *point, int y, int skip) { uint c1, c2, c3, error; @@ -99,6 +137,43 @@ void IMB_filtery(ImBuf *ibuf) } } +void imb_filterx(ImBuf *ibuf) +{ + uchar *point = ibuf->byte_buffer.data; + float *pointf = ibuf->float_buffer.data; + + int x = ibuf->x; + int y = ibuf->y; + int skip = (x << 2) - 3; + + for (; y > 0; y--) { + if (point) { + if (ibuf->planes > 24) { + filtrow(point, x); + } + point++; + filtrow(point, x); + point++; + filtrow(point, x); + point++; + filtrow(point, x); + point += skip; + } + if (pointf) { + if (ibuf->planes > 24) { + filtrowf(pointf, x); + } + pointf++; + filtrowf(pointf, x); + pointf++; + filtrowf(pointf, x); + pointf++; + filtrowf(pointf, x); + pointf += skip; + } + } +} + static void imb_filterN(ImBuf *out, ImBuf *in) { BLI_assert(out->channels == in->channels); @@ -216,6 +291,12 @@ static void imb_filterN(ImBuf *out, ImBuf *in) } } +void IMB_filter(ImBuf *ibuf) +{ + IMB_filtery(ibuf); + imb_filterx(ibuf); +} + void IMB_mask_filter_extend(char *mask, int width, int height) { const char *row1, *row2, *row3; diff --git a/source/blender/imbuf/intern/format_svg.cc b/source/blender/imbuf/intern/format_svg.cc index 9483444d9cf..7f6e311dcfe 100644 --- a/source/blender/imbuf/intern/format_svg.cc +++ b/source/blender/imbuf/intern/format_svg.cc @@ -14,6 +14,7 @@ #include "IMB_colormanagement.hh" #include "IMB_filetype.hh" #include "IMB_imbuf_types.hh" +#include "nanosvg.h" #include "nanosvgrast.h" ImBuf *imb_load_filepath_thumbnail_svg(const char *filepath, diff --git a/source/blender/imbuf/intern/imbuf.hh b/source/blender/imbuf/intern/imbuf.hh index 73987f59e91..ea81c9743db 100644 --- a/source/blender/imbuf/intern/imbuf.hh +++ b/source/blender/imbuf/intern/imbuf.hh @@ -26,4 +26,22 @@ # define O_BINARY 0 #endif +#define SWAP_SHORT(x) (((x & 0xff) << 8) | ((x >> 8) & 0xff)) +#define SWAP_LONG(x) \ + (((x) << 24) | (((x) & 0xff00) << 8) | (((x) >> 8) & 0xff00) | (((x) >> 24) & 0xff)) + +#define ENDIAN_NOP(x) (x) + +#ifdef __BIG_ENDIAN__ +# define LITTLE_SHORT SWAP_SHORT +# define LITTLE_LONG SWAP_LONG +# define BIG_SHORT ENDIAN_NOP +# define BIG_LONG ENDIAN_NOP +#else +# define LITTLE_SHORT ENDIAN_NOP +# define LITTLE_LONG ENDIAN_NOP +# define BIG_SHORT SWAP_SHORT +# define BIG_LONG SWAP_LONG +#endif + #define IMB_DPI_DEFAULT 72.0 diff --git a/source/blender/imbuf/intern/indexer.cc b/source/blender/imbuf/intern/indexer.cc index f5fceae322d..6286e7fd779 100644 --- a/source/blender/imbuf/intern/indexer.cc +++ b/source/blender/imbuf/intern/indexer.cc @@ -30,6 +30,10 @@ #include "IMB_indexer.hh" #include "imbuf.hh" +#ifdef WITH_AVI +# include "AVI_avi.h" +#endif + #ifdef WITH_FFMPEG extern "C" { # include "ffmpeg_compat.h" @@ -458,7 +462,9 @@ static void get_tc_filepath(ImBufAnim *anim, IMB_Timecode_Type tc, char *filepat * - common rebuilder structures * ---------------------------------------------------------------------- */ -struct IndexBuildContext {}; +struct IndexBuildContext { + int anim_type; +}; /* ---------------------------------------------------------------------- * - ffmpeg rebuilder @@ -784,7 +790,8 @@ static void free_proxy_output_ffmpeg(proxy_output_ctx *ctx, int rollback) MEM_freeN(ctx); } -struct FFmpegIndexBuilderContext : public IndexBuildContext { +struct FFmpegIndexBuilderContext { + int anim_type; AVFormatContext *iFormatCtx; AVCodecContext *iCodecCtx; @@ -1122,7 +1129,7 @@ static int indexer_performance_get_decode_rate(FFmpegIndexBuilderContext *contex AVFrame *in_frame = av_frame_alloc(); AVPacket *packet = av_packet_alloc(); - const double start = BLI_time_now_seconds(); + const double start = BLI_check_seconds_timer(); int frames_decoded = 0; while (av_read_frame(context->iFormatCtx, packet) >= 0) { @@ -1148,7 +1155,7 @@ static int indexer_performance_get_decode_rate(FFmpegIndexBuilderContext *contex frames_decoded++; } - const double end = BLI_time_now_seconds(); + const double end = BLI_check_seconds_timer(); if (end > start + time_period) { break; @@ -1233,6 +1240,172 @@ static bool indexer_need_to_build_proxy(FFmpegIndexBuilderContext *context) #endif +/* ---------------------------------------------------------------------- + * - internal AVI (fallback) rebuilder + * ---------------------------------------------------------------------- */ + +#ifdef WITH_AVI +struct FallbackIndexBuilderContext { + int anim_type; + + ImBufAnim *anim; + AviMovie *proxy_ctx[IMB_PROXY_MAX_SLOT]; + int proxy_sizes_in_use; +}; +static AviMovie *alloc_proxy_output_avi( + ImBufAnim *anim, const char *filepath, int width, int height, int quality) +{ + int x, y; + AviFormat format; + double framerate; + AviMovie *avi; + /* It doesn't really matter for proxies, but sane defaults help anyways. */ + short frs_sec = 25; + float frs_sec_base = 1.0; + + IMB_anim_get_fps(anim, false, &frs_sec, &frs_sec_base); + + x = width; + y = height; + + framerate = double(frs_sec) / double(frs_sec_base); + + avi = MEM_cnew("avimovie"); + + format = AVI_FORMAT_MJPEG; + + if (AVI_open_compress(filepath, avi, 1, format) != AVI_ERROR_NONE) { + MEM_freeN(avi); + return nullptr; + } + + AVI_set_compress_option(avi, AVI_OPTION_TYPE_MAIN, 0, AVI_OPTION_WIDTH, &x); + AVI_set_compress_option(avi, AVI_OPTION_TYPE_MAIN, 0, AVI_OPTION_HEIGHT, &y); + AVI_set_compress_option(avi, AVI_OPTION_TYPE_MAIN, 0, AVI_OPTION_QUALITY, &quality); + AVI_set_compress_option(avi, AVI_OPTION_TYPE_MAIN, 0, AVI_OPTION_FRAMERATE, &framerate); + + avi->interlace = 0; + avi->odd_fields = 0; + + return avi; +} + +static IndexBuildContext *index_fallback_create_context(ImBufAnim *anim, + int /*tcs_in_use*/, + int proxy_sizes_in_use, + int quality) +{ + FallbackIndexBuilderContext *context; + int i; + + /* since timecode indices only work with ffmpeg right now, + * don't know a sensible fallback here... + * + * so no proxies... + */ + if (proxy_sizes_in_use == IMB_PROXY_NONE) { + return nullptr; + } + + context = MEM_cnew("fallback index builder context"); + + context->anim = anim; + context->proxy_sizes_in_use = proxy_sizes_in_use; + + memset(context->proxy_ctx, 0, sizeof(context->proxy_ctx)); + + for (i = 0; i < IMB_PROXY_MAX_SLOT; i++) { + if (context->proxy_sizes_in_use & proxy_sizes[i]) { + char filepath[FILE_MAX]; + + get_proxy_filepath(anim, proxy_sizes[i], filepath, true); + BLI_file_ensure_parent_dir_exists(filepath); + + context->proxy_ctx[i] = alloc_proxy_output_avi( + anim, filepath, anim->x * proxy_fac[i], anim->y * proxy_fac[i], quality); + } + } + + return (IndexBuildContext *)context; +} + +static void index_rebuild_fallback_finish(FallbackIndexBuilderContext *context, const bool stop) +{ + ImBufAnim *anim = context->anim; + char filepath[FILE_MAX]; + char filepath_tmp[FILE_MAX]; + int i; + + for (i = 0; i < IMB_PROXY_MAX_SLOT; i++) { + if (context->proxy_sizes_in_use & proxy_sizes[i]) { + AVI_close_compress(context->proxy_ctx[i]); + MEM_freeN(context->proxy_ctx[i]); + + get_proxy_filepath(anim, proxy_sizes[i], filepath_tmp, true); + get_proxy_filepath(anim, proxy_sizes[i], filepath, false); + + if (stop) { + unlink(filepath_tmp); + } + else { + unlink(filepath); + rename(filepath_tmp, filepath); + } + } + } +} + +static void index_rebuild_fallback(FallbackIndexBuilderContext *context, + const bool *stop, + bool *do_update, + float *progress) +{ + int count = IMB_anim_get_duration(context->anim, IMB_TC_NONE); + int i, pos; + ImBufAnim *anim = context->anim; + + for (pos = 0; pos < count; pos++) { + ImBuf *ibuf = IMB_anim_absolute(anim, pos, IMB_TC_NONE, IMB_PROXY_NONE); + ImBuf *tmp_ibuf = IMB_dupImBuf(ibuf); + float next_progress = float(pos) / float(count); + + if (*progress != next_progress) { + *progress = next_progress; + *do_update = true; + } + + if (*stop) { + break; + } + + IMB_flipy(tmp_ibuf); + + for (i = 0; i < IMB_PROXY_MAX_SLOT; i++) { + if (context->proxy_sizes_in_use & proxy_sizes[i]) { + int x = anim->x * proxy_fac[i]; + int y = anim->y * proxy_fac[i]; + + ImBuf *s_ibuf = IMB_dupImBuf(tmp_ibuf); + + IMB_scalefastImBuf(s_ibuf, x, y); + + IMB_convert_rgba_to_abgr(s_ibuf); + + /* note that libavi free's the buffer... */ + uint8_t *rect = IMB_steal_byte_buffer(s_ibuf); + AVI_write_frame(context->proxy_ctx[i], pos, AVI_FORMAT_RGB32, rect, x * y * 4); + + IMB_freeImBuf(s_ibuf); + } + } + + IMB_freeImBuf(tmp_ibuf); + IMB_freeImBuf(ibuf); + } +} + +#endif /* WITH_AVI */ + /* ---------------------------------------------------------------------- * - public API * ---------------------------------------------------------------------- */ @@ -1245,6 +1418,7 @@ IndexBuildContext *IMB_anim_index_rebuild_context(ImBufAnim *anim, GSet *file_list, bool build_only_on_bad_performance) { + IndexBuildContext *context = nullptr; int proxy_sizes_to_build = proxy_sizes_in_use; int i; @@ -1293,16 +1467,27 @@ IndexBuildContext *IMB_anim_index_rebuild_context(ImBufAnim *anim, return nullptr; } - IndexBuildContext *context = nullptr; + switch (anim->curtype) { #ifdef WITH_FFMPEG - if (anim->state == ImBufAnim::State::Valid) { - context = index_ffmpeg_create_context( - anim, tcs_in_use, proxy_sizes_to_build, quality, build_only_on_bad_performance); - } + case ANIM_FFMPEG: + context = index_ffmpeg_create_context( + anim, tcs_in_use, proxy_sizes_to_build, quality, build_only_on_bad_performance); + break; #else - UNUSED_VARS(build_only_on_bad_performance); + UNUSED_VARS(build_only_on_bad_performance); #endif + default: +#ifdef WITH_AVI + context = index_fallback_create_context(anim, tcs_in_use, proxy_sizes_to_build, quality); +#endif + break; + } + + if (context) { + context->anim_type = anim->curtype; + } + return context; UNUSED_VARS(tcs_in_use, proxy_sizes_in_use, quality); @@ -1316,25 +1501,41 @@ void IMB_anim_index_rebuild(IndexBuildContext *context, /* NOLINTNEXTLINE: readability-non-const-parameter. */ float *progress) { + switch (context->anim_type) { #ifdef WITH_FFMPEG - if (context != nullptr) { - if (indexer_need_to_build_proxy((FFmpegIndexBuilderContext *)context)) { - index_rebuild_ffmpeg((FFmpegIndexBuilderContext *)context, stop, do_update, progress); - } - } + case ANIM_FFMPEG: + if (indexer_need_to_build_proxy((FFmpegIndexBuilderContext *)context)) { + index_rebuild_ffmpeg((FFmpegIndexBuilderContext *)context, stop, do_update, progress); + } + break; #endif - UNUSED_VARS(context, stop, do_update, progress); + default: +#ifdef WITH_AVI + index_rebuild_fallback((FallbackIndexBuilderContext *)context, stop, do_update, progress); +#endif + break; + } + + UNUSED_VARS(stop, do_update, progress); } void IMB_anim_index_rebuild_finish(IndexBuildContext *context, const bool stop) { + switch (context->anim_type) { #ifdef WITH_FFMPEG - if (context != nullptr) { - index_rebuild_ffmpeg_finish((FFmpegIndexBuilderContext *)context, stop); - } + case ANIM_FFMPEG: + index_rebuild_ffmpeg_finish((FFmpegIndexBuilderContext *)context, stop); + break; #endif + default: +#ifdef WITH_AVI + index_rebuild_fallback_finish((FallbackIndexBuilderContext *)context, stop); +#endif + break; + } + /* static defined at top of the file */ - UNUSED_VARS(context, stop, proxy_sizes); + UNUSED_VARS(stop, proxy_sizes); } void IMB_free_indices(ImBufAnim *anim) diff --git a/source/blender/imbuf/intern/iris.cc b/source/blender/imbuf/intern/iris.cc index a5fef4e27a1..4975fdf2cff 100644 --- a/source/blender/imbuf/intern/iris.cc +++ b/source/blender/imbuf/intern/iris.cc @@ -17,6 +17,7 @@ #include "IMB_filetype.hh" #include "IMB_imbuf.hh" #include "IMB_imbuf_types.hh" +#include "imbuf.hh" #define IMAGIC 0732 diff --git a/source/blender/imbuf/intern/jpeg.cc b/source/blender/imbuf/intern/jpeg.cc index e367380d514..61a4b91bcb2 100644 --- a/source/blender/imbuf/intern/jpeg.cc +++ b/source/blender/imbuf/intern/jpeg.cc @@ -27,6 +27,7 @@ #include "IMB_imbuf.hh" #include "IMB_imbuf_types.hh" #include "IMB_metadata.hh" +#include "imbuf.hh" #include #include @@ -292,9 +293,7 @@ static ImBuf *ibJpegImageFromCinfo( jpeg_abort_decompress(cinfo); ibuf = IMB_allocImBuf(x, y, 8 * depth, 0); } - else if ((ibuf = IMB_allocImBuf(x, y, 8 * depth, IB_rect | IB_uninitialized_pixels)) == - nullptr) - { + else if ((ibuf = IMB_allocImBuf(x, y, 8 * depth, IB_rect)) == nullptr) { jpeg_abort_decompress(cinfo); } else { diff --git a/source/blender/imbuf/intern/metadata.cc b/source/blender/imbuf/intern/metadata.cc index 8097ab80fde..8ce4bfe32bf 100644 --- a/source/blender/imbuf/intern/metadata.cc +++ b/source/blender/imbuf/intern/metadata.cc @@ -17,6 +17,9 @@ #include "DNA_ID.h" /* ID property definitions. */ +#include "MEM_guardedalloc.h" + +#include "IMB_imbuf.hh" #include "IMB_imbuf_types.hh" #include "IMB_metadata.hh" @@ -40,16 +43,18 @@ void IMB_metadata_free(IDProperty *metadata) IDP_FreeProperty(metadata); } -bool IMB_metadata_get_field(const IDProperty *metadata, +bool IMB_metadata_get_field(IDProperty *metadata, const char *key, char *value, const size_t value_maxncpy) { + IDProperty *prop; + if (metadata == nullptr) { return false; } - IDProperty *prop = IDP_GetPropertyFromGroup(metadata, key); + prop = IDP_GetPropertyFromGroup(metadata, key); if (prop && prop->type == IDP_STRING) { BLI_strncpy(value, IDP_String(prop), value_maxncpy); @@ -58,12 +63,12 @@ bool IMB_metadata_get_field(const IDProperty *metadata, return false; } -void IMB_metadata_copy(ImBuf *ibuf_dst, const ImBuf *ibuf_src) +void IMB_metadata_copy(ImBuf *dimb, ImBuf *simb) { - BLI_assert(ibuf_dst != ibuf_src); - if (ibuf_src->metadata) { - IMB_metadata_free(ibuf_dst->metadata); - ibuf_dst->metadata = IDP_CopyProperty(ibuf_src->metadata); + BLI_assert(dimb != simb); + if (simb->metadata) { + IMB_metadata_free(dimb->metadata); + dimb->metadata = IDP_CopyProperty(simb->metadata); } } @@ -80,7 +85,7 @@ void IMB_metadata_set_field(IDProperty *metadata, const char *key, const char *v if (prop) { IDP_AssignString(prop, value); } - else { + else if (prop == nullptr) { prop = IDP_NewString(value, key); IDP_AddToGroup(metadata, prop); } diff --git a/source/blender/imbuf/intern/moviecache.cc b/source/blender/imbuf/intern/moviecache.cc index 35b36b37de3..623e358165f 100644 --- a/source/blender/imbuf/intern/moviecache.cc +++ b/source/blender/imbuf/intern/moviecache.cc @@ -18,6 +18,7 @@ #include "BLI_ghash.h" #include "BLI_mempool.h" #include "BLI_string.h" +#include "BLI_threads.h" #include "BLI_utildefines.h" #include "IMB_moviecache.hh" diff --git a/source/blender/imbuf/intern/oiio/CMakeLists.txt b/source/blender/imbuf/intern/oiio/CMakeLists.txt index e14110196ab..76f9cde7b47 100644 --- a/source/blender/imbuf/intern/oiio/CMakeLists.txt +++ b/source/blender/imbuf/intern/oiio/CMakeLists.txt @@ -45,8 +45,8 @@ if(WITH_IMAGE_OPENEXR) endif() # Keep until APPLE/ARM libraries are updated. -if(APPLE OR WIN32) - if(CMAKE_OSX_ARCHITECTURES MATCHES arm64 OR CMAKE_SYSTEM_PROCESSOR STREQUAL "ARM64") +if(APPLE) + if(CMAKE_OSX_ARCHITECTURES MATCHES arm64) list(APPEND INC_SYS ${IMATH_INCLUDE_DIRS} ) diff --git a/source/blender/imbuf/intern/oiio/openimageio_support.cc b/source/blender/imbuf/intern/oiio/openimageio_support.cc index 1baa1b72d49..ce7a5c02b61 100644 --- a/source/blender/imbuf/intern/oiio/openimageio_support.cc +++ b/source/blender/imbuf/intern/oiio/openimageio_support.cc @@ -100,7 +100,7 @@ static ImBuf *load_pixels( { /* Allocate the ImBuf for the image. */ constexpr bool is_float = sizeof(T) > 1; - const uint format_flag = (is_float ? IB_rectfloat : IB_rect) | IB_uninitialized_pixels; + const uint format_flag = is_float ? IB_rectfloat : IB_rect; const uint ibuf_flags = (flags & IB_test) ? 0 : format_flag; const int planes = use_all_planes ? 32 : 8 * channels; ImBuf *ibuf = IMB_allocImBuf(width, height, planes, ibuf_flags); diff --git a/source/blender/imbuf/intern/openexr/openexr_api.cpp b/source/blender/imbuf/intern/openexr/openexr_api.cpp index 9c847f0437d..335091fe0cb 100644 --- a/source/blender/imbuf/intern/openexr/openexr_api.cpp +++ b/source/blender/imbuf/intern/openexr/openexr_api.cpp @@ -79,6 +79,7 @@ #include "BLI_fileops.h" #include "BLI_math_color.h" #include "BLI_mmap.h" +#include "BLI_string_utils.hh" #include "BLI_threads.h" #include "BKE_idprop.h" diff --git a/source/blender/imbuf/intern/readimage.cc b/source/blender/imbuf/intern/readimage.cc index 3fdbce144a7..460472d2a6d 100644 --- a/source/blender/imbuf/intern/readimage.cc +++ b/source/blender/imbuf/intern/readimage.cc @@ -14,7 +14,7 @@ #include "BLI_fileops.h" #include "BLI_mmap.h" -#include "BLI_path_util.h" /* For assertions. */ +#include "BLI_path_util.h" #include "BLI_string.h" #include "BLI_utildefines.h" #include diff --git a/source/blender/imbuf/intern/scaling.cc b/source/blender/imbuf/intern/scaling.cc index 9c31aa06ace..1d5fcea2f42 100644 --- a/source/blender/imbuf/intern/scaling.cc +++ b/source/blender/imbuf/intern/scaling.cc @@ -8,6 +8,7 @@ #include +#include "BLI_math_color.h" #include "BLI_utildefines.h" #include "MEM_guardedalloc.h" @@ -15,6 +16,7 @@ #include "IMB_imbuf.hh" #include "IMB_imbuf_types.hh" #include "IMB_interp.hh" +#include "imbuf.hh" #include "BLI_sys_types.h" /* for intptr_t support */ @@ -102,6 +104,68 @@ ImBuf *IMB_half_x(ImBuf *ibuf1) return ibuf2; } +ImBuf *IMB_double_fast_x(ImBuf *ibuf1) +{ + ImBuf *ibuf2; + int *p1, *dest, i, col, do_rect, do_float; + float *p1f, *destf; + + if (ibuf1 == nullptr) { + return nullptr; + } + if (ibuf1->byte_buffer.data == nullptr && ibuf1->float_buffer.data == nullptr) { + return nullptr; + } + + do_rect = (ibuf1->byte_buffer.data != nullptr); + do_float = (ibuf1->float_buffer.data != nullptr); + + ibuf2 = IMB_allocImBuf(2 * ibuf1->x, ibuf1->y, ibuf1->planes, ibuf1->flags); + if (ibuf2 == nullptr) { + return nullptr; + } + + p1 = (int *)ibuf1->byte_buffer.data; + dest = (int *)ibuf2->byte_buffer.data; + p1f = (float *)ibuf1->float_buffer.data; + destf = (float *)ibuf2->float_buffer.data; + + for (i = ibuf1->y * ibuf1->x; i > 0; i--) { + if (do_rect) { + col = *p1++; + *dest++ = col; + *dest++ = col; + } + if (do_float) { + destf[0] = destf[4] = p1f[0]; + destf[1] = destf[5] = p1f[1]; + destf[2] = destf[6] = p1f[2]; + destf[3] = destf[7] = p1f[3]; + destf += 8; + p1f += 4; + } + } + + return ibuf2; +} + +ImBuf *IMB_double_x(ImBuf *ibuf1) +{ + ImBuf *ibuf2; + + if (ibuf1 == nullptr) { + return nullptr; + } + if (ibuf1->byte_buffer.data == nullptr && ibuf1->float_buffer.data == nullptr) { + return nullptr; + } + + ibuf2 = IMB_double_fast_x(ibuf1); + + imb_filterx(ibuf2); + return ibuf2; +} + static void imb_half_y_no_alloc(ImBuf *ibuf2, ImBuf *ibuf1) { uchar *p1, *p2, *_p1, *dest; @@ -194,6 +258,70 @@ ImBuf *IMB_half_y(ImBuf *ibuf1) return ibuf2; } +ImBuf *IMB_double_fast_y(ImBuf *ibuf1) +{ + ImBuf *ibuf2; + int *p1, *dest1, *dest2; + float *p1f, *dest1f, *dest2f; + int x, y; + + if (ibuf1 == nullptr) { + return nullptr; + } + if (ibuf1->byte_buffer.data == nullptr && ibuf1->float_buffer.data == nullptr) { + return nullptr; + } + + const bool do_rect = (ibuf1->byte_buffer.data != nullptr); + const bool do_float = (ibuf1->float_buffer.data != nullptr); + + ibuf2 = IMB_allocImBuf(ibuf1->x, 2 * ibuf1->y, ibuf1->planes, ibuf1->flags); + if (ibuf2 == nullptr) { + return nullptr; + } + + p1 = (int *)ibuf1->byte_buffer.data; + dest1 = (int *)ibuf2->byte_buffer.data; + p1f = (float *)ibuf1->float_buffer.data; + dest1f = (float *)ibuf2->float_buffer.data; + + for (y = ibuf1->y; y > 0; y--) { + if (do_rect) { + dest2 = dest1 + ibuf2->x; + for (x = ibuf2->x; x > 0; x--) { + *dest1++ = *dest2++ = *p1++; + } + dest1 = dest2; + } + if (do_float) { + dest2f = dest1f + (4 * ibuf2->x); + for (x = ibuf2->x * 4; x > 0; x--) { + *dest1f++ = *dest2f++ = *p1f++; + } + dest1f = dest2f; + } + } + + return ibuf2; +} + +ImBuf *IMB_double_y(ImBuf *ibuf1) +{ + ImBuf *ibuf2; + + if (ibuf1 == nullptr) { + return nullptr; + } + if (ibuf1->byte_buffer.data == nullptr) { + return nullptr; + } + + ibuf2 = IMB_double_fast_y(ibuf1); + + IMB_filtery(ibuf2); + return ibuf2; +} + /* pretty much specific functions which converts uchar <-> ushort but assumes * ushort range of 255*255 which is more convenient here */ diff --git a/source/blender/imbuf/intern/stereoimbuf.cc b/source/blender/imbuf/intern/stereoimbuf.cc index 7f4b0cb14de..8aaf1b835ee 100644 --- a/source/blender/imbuf/intern/stereoimbuf.cc +++ b/source/blender/imbuf/intern/stereoimbuf.cc @@ -12,6 +12,11 @@ #include "IMB_imbuf.hh" #include "IMB_imbuf_types.hh" +#include "IMB_allocimbuf.hh" +#include "IMB_colormanagement_intern.hh" +#include "IMB_filetype.hh" +#include "IMB_metadata.hh" + #include "imbuf.hh" #include "MEM_guardedalloc.h" diff --git a/source/blender/imbuf/intern/thumbs_blend.cc b/source/blender/imbuf/intern/thumbs_blend.cc index 7048a1850c3..172a34bf840 100644 --- a/source/blender/imbuf/intern/thumbs_blend.cc +++ b/source/blender/imbuf/intern/thumbs_blend.cc @@ -10,15 +10,20 @@ #include #include -#include "BLI_listbase.h" /* Needed due to import of BLO_readfile.hh */ +#include "BLI_linklist.h" +#include "BLI_listbase.h" /* Needed due to import of BLO_readfile.h */ #include "BLI_utildefines.h" -#include "BLO_readfile.hh" +#include "BLO_blend_defs.hh" +#include "BLO_readfile.h" #include "BKE_idtype.hh" #include "BKE_main.hh" #include "BKE_preview_image.hh" +#include "DNA_ID.h" /* For preview images... */ + +#include "IMB_imbuf.hh" #include "IMB_imbuf_types.hh" #include "IMB_thumbs.hh" diff --git a/source/blender/imbuf/intern/thumbs_font.cc b/source/blender/imbuf/intern/thumbs_font.cc index f9e40735912..b0cf587fdcc 100644 --- a/source/blender/imbuf/intern/thumbs_font.cc +++ b/source/blender/imbuf/intern/thumbs_font.cc @@ -6,6 +6,7 @@ * \ingroup imbuf */ +#include "BLI_fileops.h" #include "BLI_hash_md5.hh" #include "BLI_utildefines.h" diff --git a/source/blender/imbuf/intern/util.cc b/source/blender/imbuf/intern/util.cc index 41aa415c826..b6ce3832a5b 100644 --- a/source/blender/imbuf/intern/util.cc +++ b/source/blender/imbuf/intern/util.cc @@ -29,7 +29,7 @@ #ifdef WITH_FFMPEG # include "BLI_string.h" /* BLI_vsnprintf */ -# include "BKE_global.hh" /* G.debug */ +# include "BKE_global.h" /* G.debug */ extern "C" { # include @@ -37,7 +37,7 @@ extern "C" { # include # include -# include "ffmpeg_compat.h" /* Keep for compatibility. */ +# include "ffmpeg_compat.h" } #endif @@ -171,6 +171,16 @@ bool IMB_ispic(const char *filepath) return (IMB_ispic_type(filepath) != IMB_FTYPE_NONE); } +static bool isavi(const char *filepath) +{ +#ifdef WITH_AVI + return AVI_is_avi(filepath); +#else + (void)filepath; + return false; +#endif +} + #ifdef WITH_FFMPEG /* BLI_vsnprintf in ffmpeg_log_callback() causes invalid warning */ @@ -215,7 +225,7 @@ void IMB_ffmpeg_init() av_log_set_level(AV_LOG_DEBUG); } - /* set separate callback which could store last error to report to UI */ + /* set own callback which could store last error to report to UI */ av_log_set_callback(ffmpeg_log_callback); } @@ -299,19 +309,72 @@ static int isffmpeg(const char *filepath) } #endif -bool IMB_isanim(const char *filepath) +int imb_get_anim_type(const char *filepath) { + BLI_stat_t st; + BLI_assert(!BLI_path_is_rel(filepath)); if (UTIL_DEBUG) { printf("%s: %s\n", __func__, filepath); } -#ifdef WITH_FFMPEG +#ifndef _WIN32 +# ifdef WITH_FFMPEG + /* stat test below fails on large files > 4GB */ if (isffmpeg(filepath)) { - return true; + return ANIM_FFMPEG; + } +# endif + if (BLI_stat(filepath, &st) == -1) { + return 0; + } + if (((st.st_mode) & S_IFMT) != S_IFREG) { + return 0; } -#endif - return false; + if (isavi(filepath)) { + return ANIM_AVI; + } + + if (ismovie(filepath)) { + return ANIM_MOVIE; + } +#else /* !_WIN32 */ + if (BLI_stat(filepath, &st) == -1) { + return 0; + } + if (((st.st_mode) & S_IFMT) != S_IFREG) { + return 0; + } + + if (ismovie(filepath)) { + return ANIM_MOVIE; + } +# ifdef WITH_FFMPEG + if (isffmpeg(filepath)) { + return ANIM_FFMPEG; + } +# endif + + if (isavi(filepath)) { + return ANIM_AVI; + } +#endif /* !_WIN32 */ + + /* Assume a single image is part of an image sequence. */ + if (IMB_ispic(filepath)) { + return ANIM_SEQUENCE; + } + + return ANIM_NONE; +} + +bool IMB_isanim(const char *filepath) +{ + int type; + + type = imb_get_anim_type(filepath); + + return (type && type != ANIM_SEQUENCE); } diff --git a/source/blender/imbuf/intern/util_gpu.cc b/source/blender/imbuf/intern/util_gpu.cc index 1cba6c9026d..776ca277741 100644 --- a/source/blender/imbuf/intern/util_gpu.cc +++ b/source/blender/imbuf/intern/util_gpu.cc @@ -6,10 +6,15 @@ * \ingroup imbuf */ +#include "imbuf.hh" + #include "BLI_utildefines.h" #include "MEM_guardedalloc.h" +#include "BKE_global.h" + #include "GPU_capabilities.h" +#include "GPU_state.h" #include "GPU_texture.h" #include "IMB_colormanagement.hh" diff --git a/source/blender/imbuf/intern/writeimage.cc b/source/blender/imbuf/intern/writeimage.cc index e058380c0f6..ccaa92d2ae9 100644 --- a/source/blender/imbuf/intern/writeimage.cc +++ b/source/blender/imbuf/intern/writeimage.cc @@ -10,7 +10,7 @@ #include #include -#include "BLI_path_util.h" /* For assertions. */ +#include "BLI_path_util.h" #include "BLI_utildefines.h" #include "IMB_colormanagement.hh" diff --git a/source/blender/io/CMakeLists.txt b/source/blender/io/CMakeLists.txt index 37a85969d11..f4e64f41aef 100644 --- a/source/blender/io/CMakeLists.txt +++ b/source/blender/io/CMakeLists.txt @@ -26,6 +26,10 @@ if(WITH_ALEMBIC) add_subdirectory(alembic) endif() +if(WITH_CODEC_AVI) + add_subdirectory(avi) +endif() + if(WITH_OPENCOLLADA) add_subdirectory(collada) endif() diff --git a/source/blender/io/alembic/ABC_alembic.h b/source/blender/io/alembic/ABC_alembic.h index 4bd590b3578..6081a965a01 100644 --- a/source/blender/io/alembic/ABC_alembic.h +++ b/source/blender/io/alembic/ABC_alembic.h @@ -124,18 +124,12 @@ typedef struct ABCReadParams { float velocity_scale; } ABCReadParams; -#ifdef __cplusplus -namespace blender::bke { -struct GeometrySet; -} - -/* Either modifies the existing geometry component, or create a new one. */ -void ABC_read_geometry(CacheReader *reader, - Object *ob, - blender::bke::GeometrySet &geometry_set, - const ABCReadParams *params, - const char **err_str); -#endif +/* Either modifies existing_mesh in-place or constructs a new mesh. */ +struct Mesh *ABC_read_mesh(struct CacheReader *reader, + struct Object *ob, + struct Mesh *existing_mesh, + const ABCReadParams *params, + const char **err_str); bool ABC_mesh_topology_changed(struct CacheReader *reader, struct Object *ob, diff --git a/source/blender/io/alembic/exporter/abc_archive.cc b/source/blender/io/alembic/exporter/abc_archive.cc index 72704eda818..368175a9bf5 100644 --- a/source/blender/io/alembic/exporter/abc_archive.cc +++ b/source/blender/io/alembic/exporter/abc_archive.cc @@ -6,18 +6,14 @@ #include "BKE_blender_version.h" #include "BKE_main.hh" +#include "BKE_scene.h" + +#include "DEG_depsgraph_query.hh" #include "DNA_scene_types.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include +#include #ifdef WIN32 # include "BLI_path_util.h" diff --git a/source/blender/io/alembic/exporter/abc_custom_props.cc b/source/blender/io/alembic/exporter/abc_custom_props.cc index c3b804465c5..4654df9b0d7 100644 --- a/source/blender/io/alembic/exporter/abc_custom_props.cc +++ b/source/blender/io/alembic/exporter/abc_custom_props.cc @@ -10,9 +10,13 @@ #include "abc_writer_abstract.h" +#include +#include +#include #include #include +#include #include "BLI_listbase.h" diff --git a/source/blender/io/alembic/exporter/abc_custom_props.h b/source/blender/io/alembic/exporter/abc_custom_props.h index 5e11b85bf89..6b882943634 100644 --- a/source/blender/io/alembic/exporter/abc_custom_props.h +++ b/source/blender/io/alembic/exporter/abc_custom_props.h @@ -13,7 +13,7 @@ #include "BLI_map.hh" -#include +#include struct IDProperty; diff --git a/source/blender/io/alembic/exporter/abc_export_capi.cc b/source/blender/io/alembic/exporter/abc_export_capi.cc index 1489fcca294..0e4b3e3a399 100644 --- a/source/blender/io/alembic/exporter/abc_export_capi.cc +++ b/source/blender/io/alembic/exporter/abc_export_capi.cc @@ -13,12 +13,14 @@ #include "DEG_depsgraph_build.hh" #include "DEG_depsgraph_query.hh" +#include "DNA_modifier_types.h" #include "DNA_scene_types.h" +#include "BKE_blender_version.h" #include "BKE_context.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_main.hh" -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "BLI_fileops.h" #include "BLI_path_util.h" @@ -31,6 +33,7 @@ #include "CLG_log.h" static CLG_LogRef LOG = {"io.alembic"}; +#include #include struct ExportJobData { diff --git a/source/blender/io/alembic/exporter/abc_hierarchy_iterator.cc b/source/blender/io/alembic/exporter/abc_hierarchy_iterator.cc index a86dc473bfd..bcdc66a8239 100644 --- a/source/blender/io/alembic/exporter/abc_hierarchy_iterator.cc +++ b/source/blender/io/alembic/exporter/abc_hierarchy_iterator.cc @@ -19,6 +19,9 @@ #include "BLI_assert.h" +#include "DEG_depsgraph_query.hh" + +#include "DNA_ID.h" #include "DNA_layer_types.h" #include "DNA_object_types.h" diff --git a/source/blender/io/alembic/exporter/abc_hierarchy_iterator.h b/source/blender/io/alembic/exporter/abc_hierarchy_iterator.h index 46fa8875e4c..209d7ffe1c1 100644 --- a/source/blender/io/alembic/exporter/abc_hierarchy_iterator.h +++ b/source/blender/io/alembic/exporter/abc_hierarchy_iterator.h @@ -10,6 +10,7 @@ #include +#include #include struct Depsgraph; diff --git a/source/blender/io/alembic/exporter/abc_writer_abstract.cc b/source/blender/io/alembic/exporter/abc_writer_abstract.cc index 1bc0d9940e0..a4d000bf385 100644 --- a/source/blender/io/alembic/exporter/abc_writer_abstract.cc +++ b/source/blender/io/alembic/exporter/abc_writer_abstract.cc @@ -4,8 +4,14 @@ #include "abc_writer_abstract.h" #include "abc_hierarchy_iterator.h" +#include "BKE_animsys.h" +#include "BKE_key.hh" #include "BKE_object.hh" +#include "DNA_modifier_types.h" + +#include "DEG_depsgraph.hh" + #include #include "CLG_log.h" diff --git a/source/blender/io/alembic/exporter/abc_writer_abstract.h b/source/blender/io/alembic/exporter/abc_writer_abstract.h index 202f5c63ef9..30487257654 100644 --- a/source/blender/io/alembic/exporter/abc_writer_abstract.h +++ b/source/blender/io/alembic/exporter/abc_writer_abstract.h @@ -8,8 +8,10 @@ #include "abc_hierarchy_iterator.h" #include +#include -#include +#include "DEG_depsgraph_query.hh" +#include "DNA_material_types.h" struct IDProperty; struct Object; diff --git a/source/blender/io/alembic/exporter/abc_writer_camera.cc b/source/blender/io/alembic/exporter/abc_writer_camera.cc index 097f65b1148..5f68c4a5e8f 100644 --- a/source/blender/io/alembic/exporter/abc_writer_camera.cc +++ b/source/blender/io/alembic/exporter/abc_writer_camera.cc @@ -9,9 +9,10 @@ #include "abc_writer_camera.h" #include "abc_hierarchy_iterator.h" -#include "BKE_scene.hh" +#include "BKE_camera.h" +#include "BKE_scene.h" -#include "DEG_depsgraph_query.hh" +#include "BLI_assert.h" #include "DNA_camera_types.h" #include "DNA_scene_types.h" @@ -29,7 +30,7 @@ ABCCameraWriter::ABCCameraWriter(const ABCWriterConstructorArgs &args) : ABCAbst bool ABCCameraWriter::is_supported(const HierarchyContext *context) const { - const Camera *camera = static_cast(context->object->data); + Camera *camera = static_cast(context->object->data); return camera->type == CAM_PERSP; } @@ -68,7 +69,7 @@ Alembic::Abc::OCompoundProperty ABCCameraWriter::abc_prop_for_custom_props() void ABCCameraWriter::do_write(HierarchyContext &context) { - const Camera *cam = static_cast(context.object->data); + Camera *cam = static_cast(context.object->data); abc_stereo_distance_.set(cam->stereo.convergence_distance); abc_eye_separation_.set(cam->stereo.interocular_distance); diff --git a/source/blender/io/alembic/exporter/abc_writer_hair.cc b/source/blender/io/alembic/exporter/abc_writer_hair.cc index 79ed02b9d49..1e2ee7109d6 100644 --- a/source/blender/io/alembic/exporter/abc_writer_hair.cc +++ b/source/blender/io/alembic/exporter/abc_writer_hair.cc @@ -9,14 +9,19 @@ #include "abc_writer_hair.h" #include "intern/abc_axis_conversion.h" +#include + #include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" +#include "DNA_modifier_types.h" #include "DNA_object_types.h" +#include "BLI_math_geom.h" #include "BLI_math_matrix.h" #include "BLI_math_vector.h" #include "BKE_customdata.hh" +#include "BKE_mesh.hh" #include "BKE_mesh_legacy_convert.hh" #include "BKE_mesh_runtime.hh" #include "BKE_object.hh" @@ -122,7 +127,7 @@ void ABCHairWriter::write_hair_sample(const HierarchyContext &context, { /* Get untransformed vertices, there's a xform under the hair. */ float inv_mat[4][4]; - invert_m4_m4_safe(inv_mat, context.object->object_to_world().ptr()); + invert_m4_m4_safe(inv_mat, context.object->object_to_world); MTFace *mtface = (MTFace *)CustomData_get_layer_for_write( &mesh->fdata_legacy, CD_MTFACE, mesh->totface_legacy); @@ -247,7 +252,7 @@ void ABCHairWriter::write_hair_child_sample(const HierarchyContext &context, { /* Get untransformed vertices, there's a xform under the hair. */ float inv_mat[4][4]; - invert_m4_m4_safe(inv_mat, context.object->object_to_world().ptr()); + invert_m4_m4_safe(inv_mat, context.object->object_to_world); const MFace *mface = (const MFace *)CustomData_get_layer(&mesh->fdata_legacy, CD_MFACE); MTFace *mtface = (MTFace *)CustomData_get_layer_for_write( diff --git a/source/blender/io/alembic/exporter/abc_writer_mball.cc b/source/blender/io/alembic/exporter/abc_writer_mball.cc index 611d018f55a..9fdda2dd066 100644 --- a/source/blender/io/alembic/exporter/abc_writer_mball.cc +++ b/source/blender/io/alembic/exporter/abc_writer_mball.cc @@ -9,14 +9,16 @@ #include "abc_writer_mball.h" #include "abc_hierarchy_iterator.h" +#include "BLI_assert.h" + +#include "BKE_displist.h" #include "BKE_lib_id.hh" #include "BKE_mball.hh" #include "BKE_mesh.hh" #include "BKE_object.hh" -#include "DEG_depsgraph_query.hh" - #include "DNA_mesh_types.h" +#include "DNA_meta_types.h" namespace blender::io::alembic { diff --git a/source/blender/io/alembic/exporter/abc_writer_mesh.cc b/source/blender/io/alembic/exporter/abc_writer_mesh.cc index 281079a45b7..0eb3cdcfe46 100644 --- a/source/blender/io/alembic/exporter/abc_writer_mesh.cc +++ b/source/blender/io/alembic/exporter/abc_writer_mesh.cc @@ -10,21 +10,28 @@ #include "abc_hierarchy_iterator.h" #include "intern/abc_axis_conversion.h" +#include "BLI_array_utils.hh" +#include "BLI_assert.h" #include "BLI_math_vector.h" #include "BKE_attribute.hh" +#include "BKE_customdata.hh" #include "BKE_lib_id.hh" #include "BKE_material.h" #include "BKE_mesh.hh" +#include "BKE_modifier.hh" #include "BKE_object.hh" #include "bmesh.hh" #include "bmesh_tools.hh" -#include "DNA_customdata_types.h" -#include "DNA_material_types.h" +#include "DEG_depsgraph.hh" + +#include "DNA_layer_types.h" #include "DNA_mesh_types.h" #include "DNA_modifier_types.h" +#include "DNA_object_fluidsim_types.h" +#include "DNA_particle_types.h" #include "CLG_log.h" static CLG_LogRef LOG = {"io.alembic"}; diff --git a/source/blender/io/alembic/exporter/abc_writer_nurbs.h b/source/blender/io/alembic/exporter/abc_writer_nurbs.h index b16bf2f8156..e7c697b1912 100644 --- a/source/blender/io/alembic/exporter/abc_writer_nurbs.h +++ b/source/blender/io/alembic/exporter/abc_writer_nurbs.h @@ -9,9 +9,6 @@ #include "abc_writer_abstract.h" #include "abc_writer_mesh.h" - -#include - #include namespace blender::io::alembic { diff --git a/source/blender/io/alembic/exporter/abc_writer_points.cc b/source/blender/io/alembic/exporter/abc_writer_points.cc index 8e8224ec5ea..6d974ace7bf 100644 --- a/source/blender/io/alembic/exporter/abc_writer_points.cc +++ b/source/blender/io/alembic/exporter/abc_writer_points.cc @@ -14,6 +14,7 @@ #include "BLI_math_matrix.h" #include "BLI_math_vector.h" +#include "BKE_lattice.hh" #include "BKE_particle.h" #include "DEG_depsgraph_query.hh" @@ -100,7 +101,7 @@ void ABCPointsWriter::do_write(HierarchyContext &context) } /* location */ - mul_v3_m4v3(pos, context.object->world_to_object().ptr(), state.co); + mul_v3_m4v3(pos, context.object->world_to_object, state.co); /* velocity */ sub_v3_v3v3(vel, state.co, psys->particles[p].prev_state.co); diff --git a/source/blender/io/alembic/exporter/abc_writer_transform.cc b/source/blender/io/alembic/exporter/abc_writer_transform.cc index 674024cbaee..835ec8d6655 100644 --- a/source/blender/io/alembic/exporter/abc_writer_transform.cc +++ b/source/blender/io/alembic/exporter/abc_writer_transform.cc @@ -16,6 +16,8 @@ #include "BLI_math_matrix.h" #include "BLI_math_rotation.h" +#include "DNA_layer_types.h" + #include "CLG_log.h" static CLG_LogRef LOG = {"io.alembic"}; diff --git a/source/blender/io/alembic/exporter/abc_writer_transform.h b/source/blender/io/alembic/exporter/abc_writer_transform.h index 8d03299fc78..61f1becfc91 100644 --- a/source/blender/io/alembic/exporter/abc_writer_transform.h +++ b/source/blender/io/alembic/exporter/abc_writer_transform.h @@ -9,6 +9,8 @@ #include "abc_writer_abstract.h" +#include + #include namespace blender::io::alembic { diff --git a/source/blender/io/alembic/intern/abc_axis_conversion.cc b/source/blender/io/alembic/intern/abc_axis_conversion.cc index 41e61a2c32b..e2be5b20632 100644 --- a/source/blender/io/alembic/intern/abc_axis_conversion.cc +++ b/source/blender/io/alembic/intern/abc_axis_conversion.cc @@ -9,12 +9,11 @@ #include "abc_axis_conversion.h" #include "BLI_assert.h" +#include "BLI_math_geom.h" #include "BLI_math_matrix.h" #include "BLI_math_rotation.h" #include "BLI_math_vector.h" -#include "BKE_object_types.hh" - #include "DNA_object_types.h" namespace blender::io::alembic { @@ -140,16 +139,15 @@ void create_transform_matrix(Object *obj, if (mode == ABC_MATRIX_LOCAL && obj->parent) { /* Note that this produces another matrix than the local matrix, due to * constraints and modifiers as well as the obj->parentinv matrix. */ - invert_m4_m4(obj->parent->runtime->world_to_object.ptr(), - obj->parent->object_to_world().ptr()); - mul_m4_m4m4(zup_mat, obj->parent->world_to_object().ptr(), obj->object_to_world().ptr()); + invert_m4_m4(obj->parent->world_to_object, obj->parent->object_to_world); + mul_m4_m4m4(zup_mat, obj->parent->world_to_object, obj->object_to_world); } else { - copy_m4_m4(zup_mat, obj->object_to_world().ptr()); + copy_m4_m4(zup_mat, obj->object_to_world); } if (proxy_from) { - mul_m4_m4m4(zup_mat, proxy_from->object_to_world().ptr(), zup_mat); + mul_m4_m4m4(zup_mat, proxy_from->object_to_world, zup_mat); } copy_m44_axis_swap(r_yup_mat, zup_mat, ABC_YUP_FROM_ZUP); diff --git a/source/blender/io/alembic/intern/abc_customdata.cc b/source/blender/io/alembic/intern/abc_customdata.cc index d7acd2bdb88..9cea1fd54cf 100644 --- a/source/blender/io/alembic/intern/abc_customdata.cc +++ b/source/blender/io/alembic/intern/abc_customdata.cc @@ -9,22 +9,16 @@ #include "abc_customdata.h" #include "abc_axis_conversion.h" -#include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include #include "DNA_customdata_types.h" #include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" #include "BLI_math_base.h" -#include "BLI_math_vector.h" -#include "BLI_math_vector_types.hh" +#include "BLI_math_geom.h" #include "BLI_utildefines.h" #include "BKE_attribute.hh" diff --git a/source/blender/io/alembic/intern/abc_customdata.h b/source/blender/io/alembic/intern/abc_customdata.h index 65b78c7f8cf..8a158032464 100644 --- a/source/blender/io/alembic/intern/abc_customdata.h +++ b/source/blender/io/alembic/intern/abc_customdata.h @@ -9,18 +9,12 @@ #include "BLI_math_vector_types.hh" -#include -#include -#include -#include -#include -#include -#include +#include +#include -#include #include -#include -#include + +#include "BLI_math_vector_types.hh" struct CustomData; struct Mesh; diff --git a/source/blender/io/alembic/intern/abc_reader_archive.cc b/source/blender/io/alembic/intern/abc_reader_archive.cc index 780c3721300..fd3c7db1fca 100644 --- a/source/blender/io/alembic/intern/abc_reader_archive.cc +++ b/source/blender/io/alembic/intern/abc_reader_archive.cc @@ -9,7 +9,6 @@ #include "abc_reader_archive.h" #include "Alembic/AbcCoreLayer/Read.h" -#include "Alembic/AbcCoreOgawa/ReadWrite.h" #include "BKE_main.hh" @@ -21,7 +20,6 @@ #endif #include -#include using Alembic::Abc::ErrorHandler; using Alembic::Abc::Exception; diff --git a/source/blender/io/alembic/intern/abc_reader_archive.h b/source/blender/io/alembic/intern/abc_reader_archive.h index 077654f2fca..1fa8ca52a83 100644 --- a/source/blender/io/alembic/intern/abc_reader_archive.h +++ b/source/blender/io/alembic/intern/abc_reader_archive.h @@ -7,11 +7,10 @@ * \ingroup balembic */ -#include -#include +#include +#include #include -#include struct Main; diff --git a/source/blender/io/alembic/intern/abc_reader_camera.cc b/source/blender/io/alembic/intern/abc_reader_camera.cc index 2205bea7760..cf4641ce126 100644 --- a/source/blender/io/alembic/intern/abc_reader_camera.cc +++ b/source/blender/io/alembic/intern/abc_reader_camera.cc @@ -7,6 +7,7 @@ */ #include "abc_reader_camera.h" +#include "abc_reader_transform.h" #include "abc_util.h" #include "DNA_camera_types.h" @@ -17,7 +18,7 @@ #include "BKE_camera.h" #include "BKE_object.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" using Alembic::AbcGeom::CameraSample; using Alembic::AbcGeom::ICamera; diff --git a/source/blender/io/alembic/intern/abc_reader_camera.h b/source/blender/io/alembic/intern/abc_reader_camera.h index 2ad4e256aa7..e91cae2afc6 100644 --- a/source/blender/io/alembic/intern/abc_reader_camera.h +++ b/source/blender/io/alembic/intern/abc_reader_camera.h @@ -9,8 +9,6 @@ #include "abc_reader_object.h" -#include - namespace blender::io::alembic { class AbcCameraReader final : public AbcObjectReader { diff --git a/source/blender/io/alembic/intern/abc_reader_curves.cc b/source/blender/io/alembic/intern/abc_reader_curves.cc index ae31f0f3ec4..d397fe73b57 100644 --- a/source/blender/io/alembic/intern/abc_reader_curves.cc +++ b/source/blender/io/alembic/intern/abc_reader_curves.cc @@ -8,22 +8,24 @@ #include "abc_reader_curves.h" #include "abc_axis_conversion.h" +#include "abc_reader_transform.h" #include "abc_util.h" #include -#include "DNA_curves_types.h" +#include "MEM_guardedalloc.h" + +#include "DNA_curve_types.h" #include "DNA_object_types.h" -#include "BKE_attribute.hh" -#include "BKE_curves.hh" -#include "BKE_geometry_set.hh" +#include "BLI_listbase.h" + +#include "BLT_translation.h" + +#include "BKE_curve.hh" +#include "BKE_mesh.hh" #include "BKE_object.hh" -#include "BLI_vector.hh" - -#include "BLT_translation.hh" - using Alembic::Abc::FloatArraySamplePtr; using Alembic::Abc::Int32ArraySamplePtr; using Alembic::Abc::P3fArraySamplePtr; @@ -40,230 +42,6 @@ using Alembic::AbcGeom::ISampleSelector; using Alembic::AbcGeom::kWrapExisting; namespace blender::io::alembic { -static int16_t get_curve_resolution(const ICurvesSchema &schema, - const Alembic::Abc::ISampleSelector &sample_sel) -{ - ICompoundProperty user_props = schema.getUserProperties(); - if (!user_props) { - return 1; - } - - const PropertyHeader *header = user_props.getPropertyHeader(ABC_CURVE_RESOLUTION_U_PROPNAME); - if (!header || !header->isScalar() || !IInt16Property::matches(*header)) { - return 1; - } - - IInt16Property resolu(user_props, header->getName()); - return resolu.getValue(sample_sel); -} - -static int16_t get_curve_order(const Alembic::AbcGeom::CurveType abc_curve_type, - const UcharArraySamplePtr orders, - const size_t curve_index) -{ - switch (abc_curve_type) { - case Alembic::AbcGeom::kCubic: - return 4; - case Alembic::AbcGeom::kVariableOrder: - if (orders && orders->size() > curve_index) { - return int16_t((*orders)[curve_index]); - } - ATTR_FALLTHROUGH; - case Alembic::AbcGeom::kLinear: - default: - return 2; - } -} - -static int get_curve_overlap(const Alembic::AbcGeom::CurvePeriodicity periodicity, - const P3fArraySamplePtr positions, - const int idx, - const int num_verts, - const int16_t order) -{ - if (periodicity != Alembic::AbcGeom::kPeriodic) { - /* kNonPeriodic is always assumed to have no overlap. */ - return 0; - } - - /* Check the number of points which overlap, we don't have overlapping points in Blender, but - * other software do use them to indicate that a curve is actually cyclic. Usually the number of - * overlapping points is equal to the order/degree of the curve. - */ - - const int start = idx; - const int end = idx + num_verts; - int overlap = 0; - - const int safe_order = order <= num_verts ? order : num_verts; - for (int j = start, k = end - safe_order; j < (start + safe_order); j++, k++) { - const Imath::V3f &p1 = (*positions)[j]; - const Imath::V3f &p2 = (*positions)[k]; - - if (p1 != p2) { - break; - } - - overlap++; - } - - /* TODO: Special case, need to figure out how it coincides with knots. */ - if (overlap == 0 && num_verts > 2 && (*positions)[start] == (*positions)[end - 1]) { - overlap = 1; - } - - /* There is no real cycles. */ - return overlap; -} - -static CurveType get_curve_type(const Alembic::AbcGeom::BasisType basis) -{ - switch (basis) { - case Alembic::AbcGeom::kNoBasis: - return CURVE_TYPE_POLY; - case Alembic::AbcGeom::kBezierBasis: - return CURVE_TYPE_BEZIER; - case Alembic::AbcGeom::kBsplineBasis: - return CURVE_TYPE_NURBS; - case Alembic::AbcGeom::kCatmullromBasis: - return CURVE_TYPE_CATMULL_ROM; - case Alembic::AbcGeom::kHermiteBasis: - case Alembic::AbcGeom::kPowerBasis: - /* Those types are unknown to Blender, use a default poly type. */ - return CURVE_TYPE_POLY; - } - return CURVE_TYPE_POLY; -} - -static bool curves_topology_changed(const bke::CurvesGeometry &curves, - Span preprocessed_offsets) -{ - if (curves.offsets() != preprocessed_offsets) { - return true; - } - return false; -} - -/* Preprocessed data to help and simplify converting curve data from Alembic to Blender. - * As some operations may require to look up the Alembic sample multiple times, we just - * do it once and cache the results in this. - */ -struct PreprocessedSampleData { - /* This holds one value for each spline. This will be used to lookup the data at the right - * indices, and will also be used to set #CurveGeometry.offsets. */ - Vector offset_in_blender; - /* This holds one value for each spline, and tells where in the Alembic curve sample the spline - * actually starts, accounting for duplicate points indicating cyclicity. */ - Vector offset_in_alembic; - /* This holds one value for each spline to tell whether it is cyclic. */ - Vector curves_cyclic; - /* This holds one value for each spline which define its order. */ - Vector curves_orders; - - /* True if any values of `curves_overlaps` is true. If so, we will need to copy the - * `curves_overlaps` to an attribute on the Blender curves. */ - bool do_cyclic = false; - - /* Only one curve type for the whole objects. */ - CurveType curve_type; - - /* Store the pointers during preprocess so we do not have to look up the sample twice. */ - P3fArraySamplePtr positions = nullptr; - FloatArraySamplePtr weights = nullptr; - FloatArraySamplePtr radii = nullptr; -}; - -/* Compute topological information about the curves. We do this step mainly to properly account - * for curves overlaps which imply different offsets between Blender and Alembic, but also to - * validate the data and cache some values. */ -static std::optional preprocess_sample(StringRefNull iobject_name, - const ICurvesSchema &schema, - const ISampleSelector sample_sel) -{ - - ICurvesSchema::Sample smp; - try { - smp = schema.getValue(sample_sel); - } - catch (Alembic::Util::Exception &ex) { - printf("Alembic: error reading curve sample for '%s/%s' at time %f: %s\n", - iobject_name.c_str(), - schema.getName().c_str(), - sample_sel.getRequestedTime(), - ex.what()); - return {}; - } - - /* Note: although Alembic can store knots, we do not read them as the functionality is not - * exposed by the Blender's Curves API yet. */ - const Int32ArraySamplePtr per_curve_vertices_count = smp.getCurvesNumVertices(); - const P3fArraySamplePtr positions = smp.getPositions(); - const FloatArraySamplePtr weights = smp.getPositionWeights(); - const CurvePeriodicity periodicity = smp.getWrap(); - const UcharArraySamplePtr orders = smp.getOrders(); - - const IFloatGeomParam widths_param = schema.getWidthsParam(); - FloatArraySamplePtr radii; - if (widths_param.valid()) { - IFloatGeomParam::Sample wsample = widths_param.getExpandedValue(sample_sel); - radii = wsample.getVals(); - } - - const int curve_count = per_curve_vertices_count->size(); - - PreprocessedSampleData data; - /* Add 1 as these store offsets with the actual value being `offset[i + 1] - offset[i]`. */ - data.offset_in_blender.resize(curve_count + 1); - data.offset_in_alembic.resize(curve_count + 1); - data.curves_cyclic.resize(curve_count); - data.curve_type = get_curve_type(smp.getBasis()); - - if (data.curve_type == CURVE_TYPE_NURBS) { - data.curves_orders.resize(curve_count); - } - - /* Compute topological information. */ - - int blender_offset = 0; - int alembic_offset = 0; - for (size_t i = 0; i < curve_count; i++) { - const int vertices_count = (*per_curve_vertices_count)[i]; - - const int curve_order = get_curve_order(smp.getType(), orders, i); - - /* Check if the curve is cyclic. */ - const int overlap = get_curve_overlap( - periodicity, positions, alembic_offset, vertices_count, curve_order); - - data.offset_in_blender[i] = blender_offset; - data.offset_in_alembic[i] = alembic_offset; - data.curves_cyclic[i] = overlap != 0; - - if (data.curve_type == CURVE_TYPE_NURBS) { - data.curves_orders[i] = curve_order; - } - - data.do_cyclic |= data.curves_cyclic[i]; - blender_offset += (overlap >= vertices_count) ? vertices_count : (vertices_count - overlap); - alembic_offset += vertices_count; - } - data.offset_in_blender[curve_count] = blender_offset; - data.offset_in_alembic[curve_count] = alembic_offset; - - /* Store relevant pointers. */ - - data.positions = positions; - - if (weights && weights->size() > 1) { - data.weights = weights; - } - - if (radii && radii->size() > 1) { - data.radii = radii; - } - - return data; -} AbcCurveReader::AbcCurveReader(const Alembic::Abc::IObject &object, ImportSettings &settings) : AbcObjectReader(object, settings) @@ -286,13 +64,13 @@ bool AbcCurveReader::accepts_object_type( { if (!Alembic::AbcGeom::ICurves::matches(alembic_header)) { *err_str = RPT_( - "Object type mismatch, Alembic object path pointed to Curves when importing, but not " - "anymore."); + "Object type mismatch, Alembic object path pointed to Curves when importing, but not any " + "more"); return false; } - if (ob->type != OB_CURVES) { - *err_str = RPT_("Object type mismatch, Alembic object path points to Curves."); + if (ob->type != OB_CURVES_LEGACY) { + *err_str = RPT_("Object type mismatch, Alembic object path points to Curves"); return false; } @@ -301,102 +79,262 @@ bool AbcCurveReader::accepts_object_type( void AbcCurveReader::readObjectData(Main *bmain, const Alembic::Abc::ISampleSelector &sample_sel) { - Curves *curves = static_cast(BKE_curves_add(bmain, m_data_name.c_str())); + Curve *cu = BKE_curve_add(bmain, m_data_name.c_str(), OB_CURVES_LEGACY); - m_object = BKE_object_add_only_object(bmain, OB_CURVES, m_object_name.c_str()); - m_object->data = curves; + cu->flag |= CU_3D; + cu->actvert = CU_ACT_NONE; + cu->resolu = 1; - read_curves_sample(curves, m_curves_schema, sample_sel); + ICompoundProperty user_props = m_curves_schema.getUserProperties(); + if (user_props) { + const PropertyHeader *header = user_props.getPropertyHeader(ABC_CURVE_RESOLUTION_U_PROPNAME); + if (header != nullptr && header->isScalar() && IInt16Property::matches(*header)) { + IInt16Property resolu(user_props, header->getName()); + cu->resolu = resolu.getValue(sample_sel); + } + } + + m_object = BKE_object_add_only_object(bmain, OB_CURVES_LEGACY, m_object_name.c_str()); + m_object->data = cu; + + read_curve_sample(cu, m_curves_schema, sample_sel); if (m_settings->always_add_cache_reader || has_animations(m_curves_schema, m_settings)) { addCacheModifier(); } } -void AbcCurveReader::read_curves_sample(Curves *curves_id, - const ICurvesSchema &schema, - const ISampleSelector &sample_sel) +void AbcCurveReader::read_curve_sample(Curve *cu, + const ICurvesSchema &schema, + const ISampleSelector &sample_sel) { - std::optional opt_preprocess = preprocess_sample( - m_iobject.getFullName(), schema, sample_sel); - if (!opt_preprocess) { + ICurvesSchema::Sample smp; + try { + smp = schema.getValue(sample_sel); + } + catch (Alembic::Util::Exception &ex) { + printf("Alembic: error reading curve sample for '%s/%s' at time %f: %s\n", + m_iobject.getFullName().c_str(), + schema.getName().c_str(), + sample_sel.getRequestedTime(), + ex.what()); return; } - const PreprocessedSampleData &data = opt_preprocess.value(); + const Int32ArraySamplePtr num_vertices = smp.getCurvesNumVertices(); + const P3fArraySamplePtr positions = smp.getPositions(); + const FloatArraySamplePtr weights = smp.getPositionWeights(); + const FloatArraySamplePtr knots = smp.getKnots(); + const CurvePeriodicity periodicity = smp.getWrap(); + const UcharArraySamplePtr orders = smp.getOrders(); - const int point_count = data.offset_in_blender.last(); - const int curve_count = data.offset_in_blender.size() - 1; + const IFloatGeomParam widths_param = schema.getWidthsParam(); + FloatArraySamplePtr radiuses; - bke::CurvesGeometry &curves = curves_id->geometry.wrap(); - - if (curves_topology_changed(curves, data.offset_in_blender)) { - curves.resize(point_count, curve_count); - curves.offsets_for_write().copy_from(data.offset_in_blender); + if (widths_param.valid()) { + IFloatGeomParam::Sample wsample = widths_param.getExpandedValue(sample_sel); + radiuses = wsample.getVals(); } - curves.fill_curve_types(data.curve_type); + int knot_offset = 0; - if (data.curve_type != CURVE_TYPE_POLY) { - curves.resolution_for_write().fill(get_curve_resolution(schema, sample_sel)); - } + size_t idx = 0; + for (size_t i = 0; i < num_vertices->size(); i++) { + const int num_verts = (*num_vertices)[i]; - MutableSpan curves_positions = curves.positions_for_write(); - for (const int i_curve : curves.curves_range()) { - int position_offset = data.offset_in_alembic[i_curve]; - for (const int i_point : curves.points_by_curve()[i_curve]) { - const Imath::V3f &pos = (*data.positions)[position_offset++]; - copy_zup_from_yup(curves_positions[i_point], pos.getValue()); + Nurb *nu = static_cast(MEM_callocN(sizeof(Nurb), "abc_getnurb")); + nu->resolu = cu->resolu; + nu->resolv = cu->resolv; + nu->pntsu = num_verts; + nu->pntsv = 1; + nu->flag |= CU_SMOOTH; + + switch (smp.getType()) { + case Alembic::AbcGeom::kCubic: + nu->orderu = 4; + break; + case Alembic::AbcGeom::kVariableOrder: + if (orders && orders->size() > i) { + nu->orderu = short((*orders)[i]); + break; + } + ATTR_FALLTHROUGH; + case Alembic::AbcGeom::kLinear: + default: + nu->orderu = 2; } - } - if (data.do_cyclic) { - curves.cyclic_for_write().copy_from(data.curves_cyclic); - curves.handle_types_left_for_write().fill(BEZIER_HANDLE_AUTO); - curves.handle_types_right_for_write().fill(BEZIER_HANDLE_AUTO); - } + if (periodicity == Alembic::AbcGeom::kNonPeriodic) { + nu->flagu |= CU_NURB_ENDPOINT; + } + else if (periodicity == Alembic::AbcGeom::kPeriodic) { + nu->flagu |= CU_NURB_CYCLIC; - if (data.radii) { - bke::SpanAttributeWriter radii = - curves.attributes_for_write().lookup_or_add_for_write_span("radius", - bke::AttrDomain::Point); + /* Check the number of points which overlap, we don't have + * overlapping points in Blender, but other software do use them to + * indicate that a curve is actually cyclic. Usually the number of + * overlapping points is equal to the order/degree of the curve. + */ - for (const int i_curve : curves.curves_range()) { - int position_offset = data.offset_in_alembic[i_curve]; - for (const int i_point : curves.points_by_curve()[i_curve]) { - radii.span[i_point] = (*data.radii)[position_offset++]; + const int start = idx; + const int end = idx + num_verts; + int overlap = 0; + + for (int j = start, k = end - nu->orderu; j < nu->orderu; j++, k++) { + const Imath::V3f &p1 = (*positions)[j]; + const Imath::V3f &p2 = (*positions)[k]; + + if (p1 != p2) { + break; + } + + overlap++; } - } - radii.finish(); - } - - if (data.curve_type == CURVE_TYPE_NURBS) { - curves.nurbs_orders_for_write().copy_from(data.curves_orders); - - if (data.weights) { - MutableSpan curves_weights = curves.nurbs_weights_for_write(); - Span data_weights_span = {data.weights->get(), int64_t(data.weights->size())}; - for (const int i_curve : curves.curves_range()) { - const int alembic_offset = data.offset_in_alembic[i_curve]; - const IndexRange points = curves.points_by_curve()[i_curve]; - curves_weights.slice(points).copy_from( - data_weights_span.slice(alembic_offset, points.size())); + /* TODO: Special case, need to figure out how it coincides with knots. */ + if (overlap == 0 && num_verts > 2 && (*positions)[start] == (*positions)[end - 1]) { + overlap = 1; } + + /* There is no real cycles. */ + if (overlap == 0) { + nu->flagu &= ~CU_NURB_CYCLIC; + nu->flagu |= CU_NURB_ENDPOINT; + } + + nu->pntsu -= overlap; } + + const bool do_weights = (weights != nullptr) && (weights->size() > 1); + float weight = 1.0f; + + const bool do_radius = (radiuses != nullptr) && (radiuses->size() > 1); + float radius = (radiuses && radiuses->size() == 1) ? (*radiuses)[0] : 1.0f; + + nu->type = CU_NURBS; + + nu->bp = static_cast(MEM_callocN(sizeof(BPoint) * nu->pntsu, "abc_getnurb")); + BPoint *bp = nu->bp; + + for (int j = 0; j < nu->pntsu; j++, bp++, idx++) { + const Imath::V3f &pos = (*positions)[idx]; + + if (do_radius) { + radius = (*radiuses)[idx]; + } + + if (do_weights) { + weight = (*weights)[idx]; + } + + copy_zup_from_yup(bp->vec, pos.getValue()); + bp->vec[3] = weight; + bp->f1 = SELECT; + bp->radius = radius; + bp->weight = 1.0f; + } + + if (knots && knots->size() != 0) { + nu->knotsu = static_cast( + MEM_callocN(KNOTSU(nu) * sizeof(float), "abc_setsplineknotsu")); + + /* TODO: second check is temporary, for until the check for cycles is rock solid. */ + if (periodicity == Alembic::AbcGeom::kPeriodic && (KNOTSU(nu) == knots->size() - 2)) { + /* Skip first and last knots. */ + for (size_t i = 1; i < knots->size() - 1; i++) { + nu->knotsu[i - 1] = (*knots)[knot_offset + i]; + } + } + else { + /* TODO: figure out how to use the knots array from other + * software in this case. */ + BKE_nurb_knot_calc_u(nu); + } + + knot_offset += knots->size(); + } + else { + BKE_nurb_knot_calc_u(nu); + } + + BLI_addtail(BKE_curve_nurbs_get(cu), nu); } } -void AbcCurveReader::read_geometry(bke::GeometrySet &geometry_set, - const Alembic::Abc::ISampleSelector &sample_sel, - int /*read_flag*/, - const char * /*velocity_name*/, - const float /*velocity_scale*/, - const char ** /*err_str*/) +Mesh *AbcCurveReader::read_mesh(Mesh *existing_mesh, + const ISampleSelector &sample_sel, + int /*read_flag*/, + const char * /*velocity_name*/, + const float /*velocity_scale*/, + const char **err_str) { - Curves *curves = geometry_set.get_curves_for_write(); + ICurvesSchema::Sample sample; - read_curves_sample(curves, m_curves_schema, sample_sel); + try { + sample = m_curves_schema.getValue(sample_sel); + } + catch (Alembic::Util::Exception &ex) { + *err_str = RPT_("Error reading curve sample; more detail on the console"); + printf("Alembic: error reading curve sample for '%s/%s' at time %f: %s\n", + m_iobject.getFullName().c_str(), + m_curves_schema.getName().c_str(), + sample_sel.getRequestedTime(), + ex.what()); + return existing_mesh; + } + + const P3fArraySamplePtr &positions = sample.getPositions(); + const Int32ArraySamplePtr num_vertices = sample.getCurvesNumVertices(); + + int vertex_idx = 0; + int curve_idx; + Curve *curve = static_cast(m_object->data); + + const int curve_count = BLI_listbase_count(&curve->nurb); + bool same_topology = curve_count == num_vertices->size(); + + if (same_topology) { + Nurb *nurbs = static_cast(curve->nurb.first); + for (curve_idx = 0; nurbs; nurbs = nurbs->next, curve_idx++) { + const int num_in_alembic = (*num_vertices)[curve_idx]; + const int num_in_blender = nurbs->pntsu; + + if (num_in_alembic != num_in_blender) { + same_topology = false; + break; + } + } + } + + if (!same_topology) { + BKE_nurbList_free(&curve->nurb); + read_curve_sample(curve, m_curves_schema, sample_sel); + } + else { + Nurb *nurbs = static_cast(curve->nurb.first); + for (curve_idx = 0; nurbs; nurbs = nurbs->next, curve_idx++) { + const int totpoint = (*num_vertices)[curve_idx]; + + if (nurbs->bp) { + BPoint *point = nurbs->bp; + + for (int i = 0; i < totpoint; i++, point++, vertex_idx++) { + const Imath::V3f &pos = (*positions)[vertex_idx]; + copy_zup_from_yup(point->vec, pos.getValue()); + } + } + else if (nurbs->bezt) { + BezTriple *bezier = nurbs->bezt; + + for (int i = 0; i < totpoint; i++, bezier++, vertex_idx++) { + const Imath::V3f &pos = (*positions)[vertex_idx]; + copy_zup_from_yup(bezier->vec[1], pos.getValue()); + } + } + } + } + + return BKE_mesh_new_nomain_from_curve(m_object); } } // namespace blender::io::alembic diff --git a/source/blender/io/alembic/intern/abc_reader_curves.h b/source/blender/io/alembic/intern/abc_reader_curves.h index cde6478e28e..726da43ec5b 100644 --- a/source/blender/io/alembic/intern/abc_reader_curves.h +++ b/source/blender/io/alembic/intern/abc_reader_curves.h @@ -7,11 +7,10 @@ * \ingroup balembic */ +#include "abc_reader_mesh.h" #include "abc_reader_object.h" -#include - -struct Curves; +struct Curve; #define ABC_CURVE_RESOLUTION_U_PROPNAME "blender:resolution" @@ -29,17 +28,23 @@ class AbcCurveReader final : public AbcObjectReader { const char **err_str) const override; void readObjectData(Main *bmain, const Alembic::Abc::ISampleSelector &sample_sel) override; + /** + * \note Alembic only stores data about control points, but the Mesh + * passed from the cache modifier contains the #DispList, which has more data + * than the control points, so to avoid corrupting the #DispList we modify the + * object directly and create a new Mesh from that. Also we might need to + * create new or delete existing NURBS in the curve. + */ + struct Mesh *read_mesh(struct Mesh *existing_mesh, + const Alembic::Abc::ISampleSelector &sample_sel, + int read_flag, + const char *velocity_name, + float velocity_scale, + const char **err_str) override; - void read_geometry(bke::GeometrySet &geometry_set, - const Alembic::Abc::ISampleSelector &sample_sel, - int read_flag, - const char *velocity_name, - float velocity_scale, - const char **err_str) override; - - void read_curves_sample(Curves *curves_id, - const Alembic::AbcGeom::ICurvesSchema &schema, - const Alembic::Abc::ISampleSelector &sample_selector); + void read_curve_sample(Curve *cu, + const Alembic::AbcGeom::ICurvesSchema &schema, + const Alembic::Abc::ISampleSelector &sample_selector); }; } // namespace blender::io::alembic diff --git a/source/blender/io/alembic/intern/abc_reader_mesh.cc b/source/blender/io/alembic/intern/abc_reader_mesh.cc index 5c617f38061..f5cc7414dfd 100644 --- a/source/blender/io/alembic/intern/abc_reader_mesh.cc +++ b/source/blender/io/alembic/intern/abc_reader_mesh.cc @@ -8,33 +8,37 @@ #include "abc_reader_mesh.h" #include "abc_axis_conversion.h" -#include "abc_customdata.h" +#include "abc_reader_transform.h" #include "abc_util.h" +#include + +#include "MEM_guardedalloc.h" + #include "DNA_customdata_types.h" #include "DNA_material_types.h" -#include "DNA_modifier_types.h" - #include "DNA_object_types.h" #include "BLI_compiler_compat.h" +#include "BLI_index_range.hh" #include "BLI_listbase.h" -#include "BLI_map.hh" -#include "BLI_math_vector.h" +#include "BLI_math_geom.h" #include "BLI_ordered_edge.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" +#include "BKE_attribute.hh" #include "BKE_customdata.hh" -#include "BKE_geometry_set.hh" #include "BKE_lib_id.hh" #include "BKE_main.hh" #include "BKE_material.h" #include "BKE_mesh.hh" +#include "BKE_modifier.hh" #include "BKE_object.hh" using Alembic::Abc::FloatArraySamplePtr; using Alembic::Abc::Int32ArraySamplePtr; +using Alembic::Abc::IV3fArrayProperty; using Alembic::Abc::P3fArraySamplePtr; using Alembic::Abc::PropertyHeader; using Alembic::Abc::V3fArraySamplePtr; @@ -485,7 +489,7 @@ static void read_mesh_sample(const std::string &iobject_full_name, } } -static CDStreamConfig get_config(Mesh *mesh) +CDStreamConfig get_config(Mesh *mesh) { CDStreamConfig config; config.mesh = mesh; @@ -683,24 +687,6 @@ bool AbcMeshReader::topology_changed(const Mesh *existing_mesh, const ISampleSel return false; } -void AbcMeshReader::read_geometry(bke::GeometrySet &geometry_set, - const Alembic::Abc::ISampleSelector &sample_sel, - const int read_flag, - const char *velocity_name, - const float velocity_scale, - const char **err_str) -{ - Mesh *mesh = geometry_set.get_mesh_for_write(); - - if (mesh == nullptr) { - return; - } - - Mesh *new_mesh = read_mesh(mesh, sample_sel, read_flag, velocity_name, velocity_scale, err_str); - - geometry_set.replace_mesh(new_mesh); -} - Mesh *AbcMeshReader::read_mesh(Mesh *existing_mesh, const ISampleSelector &sample_sel, const int read_flag, @@ -1113,22 +1099,4 @@ Mesh *AbcSubDReader::read_mesh(Mesh *existing_mesh, return mesh_to_export; } -void AbcSubDReader::read_geometry(bke::GeometrySet &geometry_set, - const Alembic::Abc::ISampleSelector &sample_sel, - const int read_flag, - const char *velocity_name, - const float velocity_scale, - const char **err_str) -{ - Mesh *mesh = geometry_set.get_mesh_for_write(); - - if (mesh == nullptr) { - return; - } - - Mesh *new_mesh = read_mesh(mesh, sample_sel, read_flag, velocity_name, velocity_scale, err_str); - - geometry_set.replace_mesh(new_mesh); -} - } // namespace blender::io::alembic diff --git a/source/blender/io/alembic/intern/abc_reader_mesh.h b/source/blender/io/alembic/intern/abc_reader_mesh.h index 14deb9022b6..a0241ab5e63 100644 --- a/source/blender/io/alembic/intern/abc_reader_mesh.h +++ b/source/blender/io/alembic/intern/abc_reader_mesh.h @@ -9,11 +9,9 @@ #include "BLI_span.hh" +#include "abc_customdata.h" #include "abc_reader_object.h" -#include -#include - struct Mesh; namespace blender::io::alembic { @@ -35,15 +33,7 @@ class AbcMeshReader final : public AbcObjectReader { int read_flag, const char *velocity_name, float velocity_scale, - const char **err_str); - - void read_geometry(bke::GeometrySet &geometry_set, - const Alembic::Abc::ISampleSelector &sample_sel, - int read_flag, - const char *velocity_name, - float velocity_scale, - const char **err_str) override; - + const char **err_str) override; bool topology_changed(const Mesh *existing_mesh, const Alembic::Abc::ISampleSelector &sample_sel) override; @@ -68,25 +58,18 @@ class AbcSubDReader final : public AbcObjectReader { const Object *const ob, const char **err_str) const override; void readObjectData(Main *bmain, const Alembic::Abc::ISampleSelector &sample_sel) override; - - void read_geometry(bke::GeometrySet &geometry_set, - const Alembic::Abc::ISampleSelector &sample_sel, - int read_flag, - const char *velocity_name, - const float velocity_scale, - const char **err_str) override; - - private: struct Mesh *read_mesh(struct Mesh *existing_mesh, const Alembic::Abc::ISampleSelector &sample_sel, int read_flag, const char *velocity_name, - const float velocity_scale, - const char **err_str); + float velocity_scale, + const char **err_str) override; }; void read_mverts(Mesh &mesh, const Alembic::AbcGeom::P3fArraySamplePtr positions, const Alembic::AbcGeom::N3fArraySamplePtr normals); +CDStreamConfig get_config(struct Mesh *mesh); + } // namespace blender::io::alembic diff --git a/source/blender/io/alembic/intern/abc_reader_nurbs.cc b/source/blender/io/alembic/intern/abc_reader_nurbs.cc index 612bfcbf2cb..e558d7e626b 100644 --- a/source/blender/io/alembic/intern/abc_reader_nurbs.cc +++ b/source/blender/io/alembic/intern/abc_reader_nurbs.cc @@ -8,6 +8,7 @@ #include "abc_reader_nurbs.h" #include "abc_axis_conversion.h" +#include "abc_reader_transform.h" #include "abc_util.h" #include "MEM_guardedalloc.h" @@ -16,8 +17,9 @@ #include "DNA_object_types.h" #include "BLI_listbase.h" +#include "BLI_string.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_curve.hh" #include "BKE_object.hh" diff --git a/source/blender/io/alembic/intern/abc_reader_nurbs.h b/source/blender/io/alembic/intern/abc_reader_nurbs.h index a82f9084f2d..bda5ade7cd7 100644 --- a/source/blender/io/alembic/intern/abc_reader_nurbs.h +++ b/source/blender/io/alembic/intern/abc_reader_nurbs.h @@ -9,8 +9,6 @@ #include "abc_reader_object.h" -#include - namespace blender::io::alembic { class AbcNurbsReader final : public AbcObjectReader { diff --git a/source/blender/io/alembic/intern/abc_reader_object.cc b/source/blender/io/alembic/intern/abc_reader_object.cc index 929cb6522f0..2aa79042356 100644 --- a/source/blender/io/alembic/intern/abc_reader_object.cc +++ b/source/blender/io/alembic/intern/abc_reader_object.cc @@ -13,19 +13,20 @@ #include "DNA_cachefile_types.h" #include "DNA_constraint_types.h" #include "DNA_modifier_types.h" -#include "DNA_object_types.h" +#include "DNA_space_types.h" /* for FILE_MAX */ #include "BKE_constraint.h" #include "BKE_lib_id.hh" #include "BKE_modifier.hh" #include "BKE_object.hh" -#include "BKE_object_types.hh" #include "BLI_listbase.h" +#include "BLI_math_geom.h" #include "BLI_math_matrix.h" #include "BLI_math_rotation.h" #include "BLI_math_vector.h" #include "BLI_string.h" +#include "BLI_utildefines.h" using Alembic::AbcGeom::IObject; using Alembic::AbcGeom::IXform; @@ -140,13 +141,14 @@ Imath::M44d get_matrix(const IXformSchema &schema, const chrono_t time) return blend_matrices(s0.getMatrix(), s1.getMatrix(), interpolation_settings->weight); } -void AbcObjectReader::read_geometry(bke::GeometrySet & /*geometry_set*/, - const Alembic::Abc::ISampleSelector & /*sample_sel*/, - int /*read_flag*/, - const char * /*velocity_name*/, - const float /*velocity_scale*/, - const char ** /*err_str*/) +Mesh *AbcObjectReader::read_mesh(Mesh *existing_mesh, + const Alembic::Abc::ISampleSelector & /*sample_sel*/, + int /*read_flag*/, + const char * /*velocity_name*/, + const float /*velocity_scale*/, + const char ** /*err_str*/) { + return existing_mesh; } bool AbcObjectReader::topology_changed(const Mesh * /*existing_mesh*/, @@ -172,7 +174,7 @@ void AbcObjectReader::setupObjectTransform(const chrono_t time) /* Apply the matrix to the object. */ BKE_object_apply_mat4(m_object, transform_from_alembic, true, false); - BKE_object_to_mat4(m_object, m_object->runtime->object_to_world.ptr()); + BKE_object_to_mat4(m_object, m_object->object_to_world); if (!is_constant || m_settings->always_add_cache_reader) { bConstraint *con = BKE_constraint_add_for_object( diff --git a/source/blender/io/alembic/intern/abc_reader_object.h b/source/blender/io/alembic/intern/abc_reader_object.h index abb1b502645..6daf7dd5c2d 100644 --- a/source/blender/io/alembic/intern/abc_reader_object.h +++ b/source/blender/io/alembic/intern/abc_reader_object.h @@ -7,24 +7,16 @@ * \ingroup balembic */ -#include -#include -#include -#include -#include +#include +#include -#include -#include +#include "DNA_ID.h" struct CacheFile; struct Main; struct Mesh; struct Object; -namespace blender::bke { -struct GeometrySet; -} - using Alembic::AbcCoreAbstract::chrono_t; namespace blender::io::alembic { @@ -147,13 +139,12 @@ class AbcObjectReader { virtual void readObjectData(Main *bmain, const Alembic::Abc::ISampleSelector &sample_sel) = 0; - virtual void read_geometry(bke::GeometrySet &geometry_set, - const Alembic::Abc::ISampleSelector &sample_sel, - int read_flag, - const char *velocity_name, - float velocity_scale, - const char **err_str); - + virtual struct Mesh *read_mesh(struct Mesh *mesh, + const Alembic::Abc::ISampleSelector &sample_sel, + int read_flag, + const char *velocity_name, + float velocity_scale, + const char **err_str); virtual bool topology_changed(const Mesh *existing_mesh, const Alembic::Abc::ISampleSelector &sample_sel); diff --git a/source/blender/io/alembic/intern/abc_reader_points.cc b/source/blender/io/alembic/intern/abc_reader_points.cc index 90c3b41a864..fd774f65e40 100644 --- a/source/blender/io/alembic/intern/abc_reader_points.cc +++ b/source/blender/io/alembic/intern/abc_reader_points.cc @@ -7,21 +7,29 @@ */ #include "abc_reader_points.h" -#include "abc_axis_conversion.h" +#include "abc_reader_mesh.h" +#include "abc_reader_transform.h" #include "abc_util.h" +#include "DNA_mesh_types.h" +#include "DNA_modifier_types.h" #include "DNA_object_types.h" -#include "DNA_pointcloud_types.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" -#include "BKE_geometry_set.hh" +#include "BKE_customdata.hh" +#include "BKE_mesh.hh" #include "BKE_object.hh" -#include "BKE_pointcloud.hh" -#include "BLI_math_vector.h" +using Alembic::AbcGeom::kWrapExisting; +using Alembic::AbcGeom::N3fArraySamplePtr; +using Alembic::AbcGeom::P3fArraySamplePtr; -using namespace Alembic::AbcGeom; +using Alembic::AbcGeom::ICompoundProperty; +using Alembic::AbcGeom::IN3fArrayProperty; +using Alembic::AbcGeom::IPoints; +using Alembic::AbcGeom::IPointsSchema; +using Alembic::AbcGeom::ISampleSelector; namespace blender::io::alembic { @@ -50,8 +58,8 @@ bool AbcPointsReader::accepts_object_type( return false; } - if (ob->type != OB_POINTCLOUD) { - *err_str = RPT_("Object type mismatch, Alembic object path points to Points."); + if (ob->type != OB_MESH) { + *err_str = RPT_("Object type mismatch, Alembic object path points to Points"); return false; } @@ -60,38 +68,29 @@ bool AbcPointsReader::accepts_object_type( void AbcPointsReader::readObjectData(Main *bmain, const Alembic::Abc::ISampleSelector &sample_sel) { - PointCloud *point_cloud = static_cast( - BKE_pointcloud_add_default(bmain, m_data_name.c_str())); + Mesh *mesh = BKE_mesh_add(bmain, m_data_name.c_str()); + Mesh *read_mesh = this->read_mesh(mesh, sample_sel, 0, "", 0.0f, nullptr); - bke::GeometrySet geometry_set = bke::GeometrySet::from_pointcloud( - point_cloud, bke::GeometryOwnershipType::Editable); - read_geometry(geometry_set, sample_sel, 0, "", 1.0f, nullptr); - - PointCloud *read_point_cloud = - geometry_set.get_component_for_write().release(); - - if (read_point_cloud != point_cloud) { - BKE_pointcloud_nomain_to_pointcloud(read_point_cloud, point_cloud); + if (read_mesh != mesh) { + BKE_mesh_nomain_to_mesh(read_mesh, mesh, m_object); } - m_object = BKE_object_add_only_object(bmain, OB_POINTCLOUD, m_object_name.c_str()); - m_object->data = point_cloud; + if (m_settings->validate_meshes) { + BKE_mesh_validate(mesh, false, false); + } + + m_object = BKE_object_add_only_object(bmain, OB_MESH, m_object_name.c_str()); + m_object->data = mesh; if (m_settings->always_add_cache_reader || has_animations(m_schema, m_settings)) { addCacheModifier(); } } -static void read_points(const P3fArraySamplePtr positions, MutableSpan r_points) -{ - for (size_t i = 0; i < positions->size(); i++) { - copy_zup_from_yup(r_points[i], (*positions)[i].getValue()); - } -} - -static N3fArraySamplePtr read_points_sample(const IPointsSchema &schema, - const ISampleSelector &selector, - MutableSpan r_points) +void read_points_sample(const IPointsSchema &schema, + const ISampleSelector &selector, + CDStreamConfig &config, + ImportSettings *settings) { Alembic::AbcGeom::IPointsSchema::Sample sample = schema.getValue(selector); @@ -110,19 +109,23 @@ static N3fArraySamplePtr read_points_sample(const IPointsSchema &schema, } } - read_points(positions, r_points); - return vnormals; + read_mverts(*config.mesh, positions, vnormals); + + if (!settings->velocity_name.empty() && settings->velocity_scale != 0.0f) { + V3fArraySamplePtr velocities = get_velocity_prop(schema, selector, settings->velocity_name); + if (velocities) { + read_velocity(velocities, config, settings->velocity_scale); + } + } } -void AbcPointsReader::read_geometry(bke::GeometrySet &geometry_set, - const Alembic::Abc::ISampleSelector &sample_sel, - int /*read_flag*/, - const char * /*velocity_name*/, - const float /*velocity_scale*/, - const char **err_str) +Mesh *AbcPointsReader::read_mesh(Mesh *existing_mesh, + const ISampleSelector &sample_sel, + int /*read_flag*/, + const char *velocity_name, + const float velocity_scale, + const char **err_str) { - BLI_assert(geometry_set.has_pointcloud()); - IPointsSchema::Sample sample; try { sample = m_schema.getValue(sample_sel); @@ -134,60 +137,26 @@ void AbcPointsReader::read_geometry(bke::GeometrySet &geometry_set, m_schema.getName().c_str(), sample_sel.getRequestedTime(), ex.what()); - return; + return existing_mesh; } - PointCloud *existing_point_cloud = geometry_set.get_pointcloud_for_write(); - PointCloud *point_cloud = existing_point_cloud; - const P3fArraySamplePtr &positions = sample.getPositions(); - const IFloatGeomParam widths_param = m_schema.getWidthsParam(); - FloatArraySamplePtr radii; + Mesh *new_mesh = nullptr; - if (widths_param.valid()) { - IFloatGeomParam::Sample wsample = widths_param.getExpandedValue(sample_sel); - radii = wsample.getVals(); + if (existing_mesh->verts_num != positions->size()) { + new_mesh = BKE_mesh_new_nomain(positions->size(), 0, 0, 0); } - if (point_cloud->totpoint != positions->size()) { - point_cloud = BKE_pointcloud_new_nomain(positions->size()); - } + ImportSettings settings; + settings.velocity_name = velocity_name; + settings.velocity_scale = velocity_scale; - bke::MutableAttributeAccessor attribute_accessor = point_cloud->attributes_for_write(); + Mesh *mesh_to_export = new_mesh ? new_mesh : existing_mesh; + CDStreamConfig config = get_config(mesh_to_export); + read_points_sample(m_schema, sample_sel, config, &settings); - bke::SpanAttributeWriter positions_writer = - attribute_accessor.lookup_or_add_for_write_span("position", bke::AttrDomain::Point); - MutableSpan point_positions = positions_writer.span; - N3fArraySamplePtr normals = read_points_sample(m_schema, sample_sel, point_positions); - positions_writer.finish(); - - bke::SpanAttributeWriter point_radii_writer = - attribute_accessor.lookup_or_add_for_write_span("radius", bke::AttrDomain::Point); - MutableSpan point_radii = point_radii_writer.span; - - if (radii) { - for (size_t i = 0; i < radii->size(); i++) { - point_radii[i] = (*radii)[i]; - } - } - else { - point_radii.fill(0.01f); - } - point_radii_writer.finish(); - - if (normals) { - bke::SpanAttributeWriter normals_writer = - attribute_accessor.lookup_or_add_for_write_span("N", bke::AttrDomain::Point); - MutableSpan point_normals = normals_writer.span; - for (size_t i = 0; i < normals->size(); i++) { - Imath::V3f nor_in = (*normals)[i]; - copy_zup_from_yup(point_normals[i], nor_in.getValue()); - } - normals_writer.finish(); - } - - geometry_set.replace_pointcloud(point_cloud); + return mesh_to_export; } } // namespace blender::io::alembic diff --git a/source/blender/io/alembic/intern/abc_reader_points.h b/source/blender/io/alembic/intern/abc_reader_points.h index 533f365d32a..90ccad58148 100644 --- a/source/blender/io/alembic/intern/abc_reader_points.h +++ b/source/blender/io/alembic/intern/abc_reader_points.h @@ -7,10 +7,9 @@ * \ingroup balembic */ +#include "abc_customdata.h" #include "abc_reader_object.h" -#include - namespace blender::io::alembic { class AbcPointsReader final : public AbcObjectReader { @@ -27,12 +26,17 @@ class AbcPointsReader final : public AbcObjectReader { void readObjectData(Main *bmain, const Alembic::Abc::ISampleSelector &sample_sel) override; - void read_geometry(bke::GeometrySet &geometry_set, - const Alembic::Abc::ISampleSelector &sample_sel, - int read_flag, - const char *velocity_name, - float velocity_scale, - const char **err_str) override; + struct Mesh *read_mesh(struct Mesh *existing_mesh, + const Alembic::Abc::ISampleSelector &sample_sel, + int read_flag, + const char *velocity_name, + float velocity_scale, + const char **err_str) override; }; +void read_points_sample(const Alembic::AbcGeom::IPointsSchema &schema, + const Alembic::AbcGeom::ISampleSelector &selector, + CDStreamConfig &config, + ImportSettings *settings); + } // namespace blender::io::alembic diff --git a/source/blender/io/alembic/intern/abc_reader_transform.cc b/source/blender/io/alembic/intern/abc_reader_transform.cc index 4c66617ce98..6918452c869 100644 --- a/source/blender/io/alembic/intern/abc_reader_transform.cc +++ b/source/blender/io/alembic/intern/abc_reader_transform.cc @@ -11,7 +11,9 @@ #include "DNA_object_types.h" -#include "BLT_translation.hh" +#include "BLI_utildefines.h" + +#include "BLT_translation.h" #include "BKE_object.hh" diff --git a/source/blender/io/alembic/intern/abc_reader_transform.h b/source/blender/io/alembic/intern/abc_reader_transform.h index 82c963bef62..17afc452977 100644 --- a/source/blender/io/alembic/intern/abc_reader_transform.h +++ b/source/blender/io/alembic/intern/abc_reader_transform.h @@ -9,12 +9,7 @@ #include "abc_reader_object.h" -#include -#include -#include -#include - -struct Object; +#include namespace blender::io::alembic { diff --git a/source/blender/io/alembic/intern/abc_util.cc b/source/blender/io/alembic/intern/abc_util.cc index ddda4213119..9042699d13b 100644 --- a/source/blender/io/alembic/intern/abc_util.cc +++ b/source/blender/io/alembic/intern/abc_util.cc @@ -8,20 +8,21 @@ #include "abc_util.h" +#include "abc_axis_conversion.h" #include "abc_reader_camera.h" #include "abc_reader_curves.h" #include "abc_reader_mesh.h" +#include "abc_reader_nurbs.h" #include "abc_reader_points.h" #include "abc_reader_transform.h" -#include -#include #include #include #include "DNA_object_types.h" +#include "BLI_math_geom.h" #include "BLI_time.h" using Alembic::Abc::IV3fArrayProperty; @@ -124,8 +125,7 @@ V3fArraySamplePtr get_velocity_prop(const Alembic::Abc::ICompoundProperty &schem const PropertyHeader &header = schema.getPropertyHeader(i); if (header.isCompound()) { - const Alembic::Abc::ICompoundProperty &prop = Alembic::Abc::ICompoundProperty( - schema, header.getName()); + const ICompoundProperty &prop = ICompoundProperty(schema, header.getName()); if (has_property(prop, name)) { /* Header cannot be null here, as its presence is checked via has_property, so it is safe @@ -241,13 +241,14 @@ AbcObjectReader *create_reader(const Alembic::AbcGeom::IObject &object, ImportSe /* ********************** */ -ScopeTimer::ScopeTimer(const char *message) : m_message(message), m_start(BLI_time_now_seconds()) +ScopeTimer::ScopeTimer(const char *message) + : m_message(message), m_start(BLI_check_seconds_timer()) { } ScopeTimer::~ScopeTimer() { - fprintf(stderr, "%s: %fs\n", m_message, BLI_time_now_seconds() - m_start); + fprintf(stderr, "%s: %fs\n", m_message, BLI_check_seconds_timer() - m_start); } /* ********************** */ diff --git a/source/blender/io/alembic/intern/abc_util.h b/source/blender/io/alembic/intern/abc_util.h index 67e03e11f58..6446e7a3609 100644 --- a/source/blender/io/alembic/intern/abc_util.h +++ b/source/blender/io/alembic/intern/abc_util.h @@ -7,21 +7,10 @@ * \ingroup balembic */ -#include "abc_reader_object.h" +#include +#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include #include -#include -#include using Alembic::Abc::chrono_t; using Alembic::Abc::V3fArraySamplePtr; diff --git a/source/blender/io/alembic/intern/alembic_capi.cc b/source/blender/io/alembic/intern/alembic_capi.cc index 512d3822290..6b8748bf477 100644 --- a/source/blender/io/alembic/intern/alembic_capi.cc +++ b/source/blender/io/alembic/intern/alembic_capi.cc @@ -9,7 +9,6 @@ #include "../ABC_alembic.h" #include "IO_types.hh" -#include #include #include "abc_axis_conversion.h" @@ -26,15 +25,20 @@ #include "DNA_cachefile_types.h" #include "DNA_collection_types.h" +#include "DNA_curve_types.h" +#include "DNA_modifier_types.h" #include "DNA_object_types.h" #include "DNA_scene_types.h" -#include "BKE_cachefile.hh" +#include "BKE_cachefile.h" #include "BKE_context.hh" -#include "BKE_global.hh" +#include "BKE_curve.hh" +#include "BKE_global.h" #include "BKE_layer.hh" #include "BKE_lib_id.hh" #include "BKE_object.hh" +#include "BKE_scene.h" +#include "BKE_screen.hh" #include "DEG_depsgraph.hh" #include "DEG_depsgraph_build.hh" @@ -42,15 +46,15 @@ #include "ED_undo.hh" #include "BLI_compiler_compat.h" +#include "BLI_fileops.h" +#include "BLI_ghash.h" #include "BLI_listbase.h" #include "BLI_math_matrix.h" #include "BLI_path_util.h" -#include "BLI_sort.hh" -#include "BLI_span.hh" #include "BLI_string.h" #include "BLI_timeit.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "WM_api.hh" #include "WM_types.hh" @@ -449,16 +453,6 @@ static void report_job_duration(const ImportJobData *data) std::cout << '\n'; } -static void sort_readers(blender::MutableSpan readers) -{ - blender::parallel_sort( - readers.begin(), readers.end(), [](const AbcObjectReader *a, const AbcObjectReader *b) { - const char *na = a->name().c_str(); - const char *nb = b->name().c_str(); - return BLI_strcasecmp(na, nb) < 0; - }); -} - static void import_startjob(void *user_data, wmJobWorkerStatus *worker_status) { SCOPE_TIMER("Alembic import, objects reading and creation"); @@ -515,10 +509,6 @@ static void import_startjob(void *user_data, wmJobWorkerStatus *worker_status) /* Create objects and set scene frame range. */ - /* Sort readers by name: when creating a lot of objects in Blender, - * it is much faster if the order is sorted by name. */ - sort_readers(data->readers); - const float size = float(data->readers.size()); size_t i = 0; @@ -541,7 +531,7 @@ static void import_startjob(void *user_data, wmJobWorkerStatus *worker_status) << " is invalid.\n"; } - *data->progress = 0.1f + 0.6f * (++i / size); + *data->progress = 0.1f + 0.3f * (++i / size); *data->do_update = true; if (G.is_break) { @@ -637,7 +627,7 @@ static void import_endjob(void *user_data) /* TODO: is setting active needed? */ BKE_view_layer_base_select_and_set_active(view_layer, base); - DEG_id_tag_update(&lc->collection->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&lc->collection->id, ID_RECALC_COPY_ON_WRITE); DEG_id_tag_update_ex(data->bmain, &ob->id, ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY | ID_RECALC_ANIMATION | @@ -802,24 +792,24 @@ static ISampleSelector sample_selector_for_time(chrono_t time) return ISampleSelector(time, ISampleSelector::kFloorIndex); } -void ABC_read_geometry(CacheReader *reader, - Object *ob, - blender::bke::GeometrySet &geometry_set, - const ABCReadParams *params, - const char **err_str) +Mesh *ABC_read_mesh(CacheReader *reader, + Object *ob, + Mesh *existing_mesh, + const ABCReadParams *params, + const char **err_str) { AbcObjectReader *abc_reader = get_abc_reader(reader, ob, err_str); if (abc_reader == nullptr) { - return; + return nullptr; } ISampleSelector sample_sel = sample_selector_for_time(params->time); - return abc_reader->read_geometry(geometry_set, - sample_sel, - params->read_flags, - params->velocity_name, - params->velocity_scale, - err_str); + return abc_reader->read_mesh(existing_mesh, + sample_sel, + params->read_flags, + params->velocity_name, + params->velocity_scale, + err_str); } bool ABC_mesh_topology_changed(CacheReader *reader, diff --git a/source/blender/io/avi/AVI_avi.h b/source/blender/io/avi/AVI_avi.h new file mode 100644 index 00000000000..998f83a3743 --- /dev/null +++ b/source/blender/io/avi/AVI_avi.h @@ -0,0 +1,290 @@ +/* SPDX-FileCopyrightText: 2001-2002 NaN Holding BV. All rights reserved. + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +/** \file + * \ingroup avi + * + * \section avi_about About the AVI module + * + * This is external code. It provides avi file import/export and + * conversions. It has been adapted to make use of Blender memory + * management functions, and because of this it needs module + * blenlib. You need to provide this lib when linking with libavi.a . + * + * \subsection avi_issues Known issues with AVI + * + * - avi uses #MEM_mallocN, #MEM_freeN from blenlib. + * - Not all functions that are used externally are properly + * prototyped. + * + * This header has not been split, since it interleaves type defines + * and functions. You would need the types to be able to include the + * function headers anyway. And, after all, it is someone else's + * code. So we keep it like this. + */ + +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include "BLI_sys_types.h" +#include /* for FILE */ + +typedef struct _AviChunk { + int fcc; + int size; +} AviChunk; + +typedef struct _AviList { + int fcc; + int size; + int ids; +} AviList; + +typedef struct _AviMainHeader { + int fcc; + int size; + int MicroSecPerFrame; /* MicroSecPerFrame - timing between frames */ + int MaxBytesPerSec; /* MaxBytesPerSec - approx bps system must handle */ + int PaddingGranularity; + int Flags; + + /** had idx1 chunk */ +#define AVIF_HASINDEX 0x00000010 + /** must use idx1 chunk to determine order */ +#define AVIF_MUSTUSEINDEX 0x00000020 + /** AVI file is interleaved */ +#define AVIF_ISINTERLEAVED 0x00000100 +#define AVIF_TRUSTCKTYPE 0x00000800 + /** specially allocated used for capturing real time video */ +#define AVIF_WASCAPTUREFILE 0x00010000 + /** contains copyrighted data */ +#define AVIF_COPYRIGHTED 0x00020000 + + int TotalFrames; + int InitialFrames; /* InitialFrames - initial frame before interleaving */ + int Streams; + int SuggestedBufferSize; + int Width; + int Height; + int Reserved[4]; +} AviMainHeader; + +typedef struct _AviStreamHeader { + int fcc; + int size; + int Type; +#define AVIST_VIDEO FCC("vids") +#define AVIST_AUDIO FCC("auds") +#define AVIST_MIDI FCC("mids") +#define AVIST_TEXT FCC("txts") + + int Handler; + int Flags; +#define AVISF_DISABLED 0x00000001 +#define AVISF_VIDEO_PALCHANGES 0x00010000 + + short Priority; + short Language; + int InitialFrames; + int Scale; + int Rate; + int Start; + int Length; + int SuggestedBufferSize; + int Quality; + int SampleSize; + short left; + short top; + short right; + short bottom; +} AviStreamHeader; + +typedef struct _AviBitmapInfoHeader { + int fcc; + int size; + int Size; + int Width; + int Height; + short Planes; + short BitCount; + int Compression; + int SizeImage; + int XPelsPerMeter; + int YPelsPerMeter; + int ClrUsed; + int ClrImportant; +} AviBitmapInfoHeader; + +typedef struct _AviMJPEGUnknown { + int a; + int b; + int c; + int d; + int e; + int f; + int g; +} AviMJPEGUnknown; + +typedef struct _AviIndexEntry { + int ChunkId; + int Flags; +#define AVIIF_LIST 0x00000001 +#define AVIIF_KEYFRAME 0x00000010 +#define AVIIF_NO_TIME 0x00000100 +#define AVIIF_COMPRESSOR 0x0FFF0000 + int Offset; + int Size; +} AviIndexEntry; + +typedef struct _AviIndex { + int fcc; + int size; + AviIndexEntry *entrys; +} AviIndex; + +typedef enum { + /** The most basic of forms, 3 bytes per pixel, 1 per r, g, b. */ + AVI_FORMAT_RGB24, + /** The second most basic of forms, 4 bytes per pixel, 1 per r, g, b, alpha. */ + AVI_FORMAT_RGB32, + /** Same as above, but is in the weird AVI order (bottom to top, left to right). */ + AVI_FORMAT_AVI_RGB, + /** Motion-JPEG. */ + AVI_FORMAT_MJPEG, +} AviFormat; + +typedef struct _AviStreamRec { + AviStreamHeader sh; + void *sf; + int sf_size; + AviFormat format; +} AviStreamRec; + +typedef struct _AviMovie { + FILE *fp; + + int type; +#define AVI_MOVIE_READ 0 +#define AVI_MOVIE_WRITE 1 + + int64_t size; + + AviMainHeader *header; + AviStreamRec *streams; + AviIndexEntry *entries; + int index_entries; + + int64_t movi_offset; + int64_t read_offset; + int64_t *offset_table; + + /* Local data goes here */ + int interlace; + int odd_fields; +} AviMovie; + +typedef enum { + AVI_ERROR_NONE = 0, + AVI_ERROR_COMPRESSION, + AVI_ERROR_OPEN, + AVI_ERROR_READING, + AVI_ERROR_WRITING, + AVI_ERROR_FORMAT, + AVI_ERROR_ALLOC, + AVI_ERROR_FOUND, + AVI_ERROR_OPTION, +} AviError; + +/* belongs to the option-setting function. */ +typedef enum { + AVI_OPTION_WIDTH = 0, + AVI_OPTION_HEIGHT, + AVI_OPTION_QUALITY, + AVI_OPTION_FRAMERATE, +} AviOption; + +/* The offsets that will always stay the same in AVI files we + * write... used to seek around to the places where we need to write + * the sizes */ + +#define AVI_RIFF_SOFF 4L +#define AVI_HDRL_SOFF 16L + +/** + * This is a sort of MAKE_ID thing. Used in imbuf :( It is used + * through options in the AVI header (AviStreamHeader). */ +#define FCC(ch4) (ch4[0] | ch4[1] << 8 | ch4[2] << 16 | ch4[3] << 24) + +/** + * Test whether this is an avi-format. + */ +bool AVI_is_avi(const char *filepath); + +/** + * Open a compressed file, decompress it into memory. + */ +AviError AVI_open_compress(const char *filepath, AviMovie *movie, int streams, ...); + +/** + * Finalize a compressed output stream. + */ +AviError AVI_close_compress(AviMovie *movie); + +/** + * Choose a compression option for \. Possible options are + * AVI_OPTION_TYPE_MAIN, AVI_OPTION_TYPE_STRH, AVI_OPTION_TYPE_STRF + */ +AviError AVI_set_compress_option( + AviMovie *movie, int option_type, int stream, AviOption option, void *opt_data); + +/* TODO: there should be some explanation about what these mean. */ +/** + * Compression option, for use in avi_set_compress_option + */ +#define AVI_OPTION_TYPE_MAIN 0 +/** + * Compression option, for use in avi_set_compress_option + */ +#define AVI_OPTION_TYPE_STRH 1 +/** + * Compression option, for use in avi_set_compress_option + */ +#define AVI_OPTION_TYPE_STRF 2 + +/** + * Direct the streams \ to \. Redirect \ + * streams. + */ +int AVI_get_stream(AviMovie *movie, int avist_type, int stream_num); + +/** + * Open a movie stream from file. + */ +AviError AVI_open_movie(const char *filepath, AviMovie *movie); + +/** + * Read a frame from a movie stream. + */ +void *AVI_read_frame(AviMovie *movie, AviFormat format, int frame, int stream); +/** + * Close an open movie stream. + */ +AviError AVI_close(AviMovie *movie); + +/** + * Write frames to a movie stream. + */ +AviError AVI_write_frame(AviMovie *movie, int frame_num, ...); + +/** + * Unused but still external + */ +AviError AVI_print_error(AviError error); + +#ifdef __cplusplus +} +#endif diff --git a/source/blender/io/avi/CMakeLists.txt b/source/blender/io/avi/CMakeLists.txt new file mode 100644 index 00000000000..a64b9826f2b --- /dev/null +++ b/source/blender/io/avi/CMakeLists.txt @@ -0,0 +1,38 @@ +# SPDX-FileCopyrightText: 2006 Blender Authors +# +# SPDX-License-Identifier: GPL-2.0-or-later + +set(INC + . + ../../imbuf +) + +set(INC_SYS + ${JPEG_INCLUDE_DIR} +) + +set(SRC + intern/avi.cc + intern/avi_codecs.cc + intern/avi_endian.cc + intern/avi_mjpeg.cc + intern/avi_options.cc + intern/avi_rgb.cc + intern/avi_rgb32.cc + + AVI_avi.h + intern/avi_endian.h + intern/avi_intern.h + intern/avi_mjpeg.h + intern/avi_rgb.h + intern/avi_rgb32.h +) + +set(LIB + ${JPEG_LIBRARIES} + PRIVATE bf::blenlib + PRIVATE bf::dna + PRIVATE bf::intern::guardedalloc +) + +blender_add_lib(bf_avi "${SRC}" "${INC}" "${INC_SYS}" "${LIB}") diff --git a/source/blender/io/avi/intern/avi.cc b/source/blender/io/avi/intern/avi.cc new file mode 100644 index 00000000000..a4f4d21cd91 --- /dev/null +++ b/source/blender/io/avi/intern/avi.cc @@ -0,0 +1,1048 @@ +/* SPDX-FileCopyrightText: 2001-2002 NaN Holding BV. All rights reserved. + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +/** \file + * \ingroup avi + * + * This is external code. + */ + +#include +#include +#include +#include +#include + +#ifdef WIN32 +# include "BLI_winstuff.h" +#endif + +#include "MEM_guardedalloc.h" + +#include "BLI_fileops.h" +#include "BLI_sys_types.h" +#include "BLI_utildefines.h" + +#include "AVI_avi.h" +#include "avi_intern.h" + +#include "avi_endian.h" + +static int AVI_DEBUG = 0; +static char DEBUG_FCC[4]; + +#define DEBUG_PRINT(x) \ + if (AVI_DEBUG) { \ + printf("AVI DEBUG: " x); \ + } \ + (void)0 + +/* local functions */ +char *fcc_to_char(uint fcc); +char *tcc_to_char(uint tcc); + +/* implementation */ + +uint GET_FCC(FILE *fp) +{ + uchar tmp[4]; + + tmp[0] = getc(fp); + tmp[1] = getc(fp); + tmp[2] = getc(fp); + tmp[3] = getc(fp); + + return FCC(tmp); +} + +uint GET_TCC(FILE *fp) +{ + char tmp[5]; + + tmp[0] = getc(fp); + tmp[1] = getc(fp); + tmp[2] = 0; + tmp[3] = 0; + + return FCC(tmp); +} + +char *fcc_to_char(uint fcc) +{ + DEBUG_FCC[0] = (fcc) & 127; + DEBUG_FCC[1] = (fcc >> 8) & 127; + DEBUG_FCC[2] = (fcc >> 16) & 127; + DEBUG_FCC[3] = (fcc >> 24) & 127; + + return DEBUG_FCC; +} + +char *tcc_to_char(uint tcc) +{ + DEBUG_FCC[0] = (tcc) & 127; + DEBUG_FCC[1] = (tcc >> 8) & 127; + DEBUG_FCC[2] = 0; + DEBUG_FCC[3] = 0; + + return DEBUG_FCC; +} + +int AVI_get_stream(AviMovie *movie, int avist_type, int stream_num) +{ + int cur_stream; + + if (movie == nullptr) { + return -AVI_ERROR_OPTION; + } + + for (cur_stream = 0; cur_stream < movie->header->Streams; cur_stream++) { + if (movie->streams[cur_stream].sh.Type == avist_type) { + if (stream_num == 0) { + return cur_stream; + } + + stream_num--; + } + } + + return -AVI_ERROR_FOUND; +} + +static int fcc_get_stream(int fcc) +{ + char fccs[4]; + + fccs[0] = fcc; + fccs[1] = fcc >> 8; + fccs[2] = fcc >> 16; + fccs[3] = fcc >> 24; + + return 10 * (fccs[0] - '0') + (fccs[1] - '0'); +} + +static bool fcc_is_data(int fcc) +{ + char fccs[4]; + + fccs[0] = fcc; + fccs[1] = fcc >> 8; + fccs[2] = fcc >> 16; + fccs[3] = fcc >> 24; + + if (!isdigit(fccs[0]) || !isdigit(fccs[1]) || !ELEM(fccs[2], 'd', 'w')) { + return false; + } + if (!ELEM(fccs[3], 'b', 'c')) { + return false; + } + + return true; +} + +AviError AVI_print_error(AviError in_error) +{ + int error; + + if (int(in_error) < 0) { + error = -in_error; + } + else { + error = in_error; + } + + switch (error) { + case AVI_ERROR_NONE: + break; + case AVI_ERROR_COMPRESSION: + printf("AVI ERROR: compressed in an unsupported format\n"); + break; + case AVI_ERROR_OPEN: + printf("AVI ERROR: could not open file\n"); + break; + case AVI_ERROR_READING: + printf("AVI ERROR: could not read from file\n"); + break; + case AVI_ERROR_WRITING: + printf("AVI ERROR: could not write to file\n"); + break; + case AVI_ERROR_FORMAT: + printf("AVI ERROR: file is in an illegal or unrecognized format\n"); + break; + case AVI_ERROR_ALLOC: + printf("AVI ERROR: error encountered while allocating memory\n"); + break; + case AVI_ERROR_OPTION: + printf("AVI ERROR: program made illegal request\n"); + break; + case AVI_ERROR_FOUND: + printf("AVI ERROR: movie did not contain expected item\n"); + break; + default: + break; + } + + return in_error; +} + +bool AVI_is_avi(const char *filepath) +{ + int temp, fcca, j; + AviMovie movie = {nullptr}; + AviMainHeader header; + AviBitmapInfoHeader bheader; + int movie_tracks = 0; + + DEBUG_PRINT("opening movie\n"); + + movie.type = AVI_MOVIE_READ; + movie.fp = BLI_fopen(filepath, "rb"); + movie.offset_table = nullptr; + + if (movie.fp == nullptr) { + return false; + } + + if (GET_FCC(movie.fp) != FCC("RIFF") || !(movie.size = GET_FCC(movie.fp))) { + fclose(movie.fp); + return false; + } + + movie.header = &header; + + if (GET_FCC(movie.fp) != FCC("AVI ") || GET_FCC(movie.fp) != FCC("LIST") || !GET_FCC(movie.fp) || + GET_FCC(movie.fp) != FCC("hdrl") || (movie.header->fcc = GET_FCC(movie.fp)) != FCC("avih") || + !(movie.header->size = GET_FCC(movie.fp))) + { + DEBUG_PRINT("bad initial header info\n"); + fclose(movie.fp); + return false; + } + + movie.header->MicroSecPerFrame = GET_FCC(movie.fp); + movie.header->MaxBytesPerSec = GET_FCC(movie.fp); + movie.header->PaddingGranularity = GET_FCC(movie.fp); + movie.header->Flags = GET_FCC(movie.fp); + movie.header->TotalFrames = GET_FCC(movie.fp); + movie.header->InitialFrames = GET_FCC(movie.fp); + movie.header->Streams = GET_FCC(movie.fp); + movie.header->SuggestedBufferSize = GET_FCC(movie.fp); + movie.header->Width = GET_FCC(movie.fp); + movie.header->Height = GET_FCC(movie.fp); + movie.header->Reserved[0] = GET_FCC(movie.fp); + movie.header->Reserved[1] = GET_FCC(movie.fp); + movie.header->Reserved[2] = GET_FCC(movie.fp); + movie.header->Reserved[3] = GET_FCC(movie.fp); + + BLI_fseek(movie.fp, movie.header->size - 14 * 4, SEEK_CUR); + + /* Limit number of streams to some reasonable amount to prevent + * buffer overflow vulnerabilities. */ + if (movie.header->Streams < 1 || movie.header->Streams > 65536) { + DEBUG_PRINT("Number of streams should be in range 1-65536\n"); + fclose(movie.fp); + return false; + } + + movie.streams = (AviStreamRec *)MEM_calloc_arrayN( + movie.header->Streams, sizeof(AviStreamRec), "moviestreams"); + + for (temp = 0; temp < movie.header->Streams; temp++) { + + if (GET_FCC(movie.fp) != FCC("LIST") || !GET_FCC(movie.fp) || + GET_FCC(movie.fp) != FCC("strl") || + (movie.streams[temp].sh.fcc = GET_FCC(movie.fp)) != FCC("strh") || + !(movie.streams[temp].sh.size = GET_FCC(movie.fp))) + { + DEBUG_PRINT("bad stream header information\n"); + + MEM_freeN(movie.streams); + fclose(movie.fp); + return false; + } + + movie.streams[temp].sh.Type = GET_FCC(movie.fp); + movie.streams[temp].sh.Handler = GET_FCC(movie.fp); + + fcca = movie.streams[temp].sh.Handler; + + if (movie.streams[temp].sh.Type == FCC("vids")) { + if (fcca == FCC("DIB ") || fcca == FCC("RGB ") || fcca == FCC("rgb ") || + fcca == FCC("RAW ") || fcca == 0) + { + movie.streams[temp].format = AVI_FORMAT_AVI_RGB; + } + else if (fcca == FCC("mjpg") || fcca == FCC("MJPG")) { + movie.streams[temp].format = AVI_FORMAT_MJPEG; + } + else { + MEM_freeN(movie.streams); + fclose(movie.fp); + return false; + } + movie_tracks++; + } + + movie.streams[temp].sh.Flags = GET_FCC(movie.fp); + movie.streams[temp].sh.Priority = GET_TCC(movie.fp); + movie.streams[temp].sh.Language = GET_TCC(movie.fp); + movie.streams[temp].sh.InitialFrames = GET_FCC(movie.fp); + movie.streams[temp].sh.Scale = GET_FCC(movie.fp); + movie.streams[temp].sh.Rate = GET_FCC(movie.fp); + movie.streams[temp].sh.Start = GET_FCC(movie.fp); + movie.streams[temp].sh.Length = GET_FCC(movie.fp); + movie.streams[temp].sh.SuggestedBufferSize = GET_FCC(movie.fp); + movie.streams[temp].sh.Quality = GET_FCC(movie.fp); + movie.streams[temp].sh.SampleSize = GET_FCC(movie.fp); + movie.streams[temp].sh.left = GET_TCC(movie.fp); + movie.streams[temp].sh.top = GET_TCC(movie.fp); + movie.streams[temp].sh.right = GET_TCC(movie.fp); + movie.streams[temp].sh.bottom = GET_TCC(movie.fp); + + BLI_fseek(movie.fp, movie.streams[temp].sh.size - 14 * 4, SEEK_CUR); + + if (GET_FCC(movie.fp) != FCC("strf")) { + DEBUG_PRINT("no stream format information\n"); + MEM_freeN(movie.streams); + fclose(movie.fp); + return false; + } + + movie.streams[temp].sf_size = GET_FCC(movie.fp); + if (movie.streams[temp].sh.Type == FCC("vids")) { + j = movie.streams[temp].sf_size - (sizeof(AviBitmapInfoHeader) - 8); + if (j >= 0) { + AviBitmapInfoHeader *bi; + + movie.streams[temp].sf = &bheader; + bi = (AviBitmapInfoHeader *)movie.streams[temp].sf; + + bi->fcc = FCC("strf"); + bi->size = movie.streams[temp].sf_size; + bi->Size = GET_FCC(movie.fp); + bi->Width = GET_FCC(movie.fp); + bi->Height = GET_FCC(movie.fp); + bi->Planes = GET_TCC(movie.fp); + bi->BitCount = GET_TCC(movie.fp); + bi->Compression = GET_FCC(movie.fp); + bi->SizeImage = GET_FCC(movie.fp); + bi->XPelsPerMeter = GET_FCC(movie.fp); + bi->YPelsPerMeter = GET_FCC(movie.fp); + bi->ClrUsed = GET_FCC(movie.fp); + bi->ClrImportant = GET_FCC(movie.fp); + + fcca = bi->Compression; + + if (movie.streams[temp].format == AVI_FORMAT_AVI_RGB) { + if (fcca == FCC("DIB ") || fcca == FCC("RGB ") || fcca == FCC("rgb ") || + fcca == FCC("RAW ") || fcca == 0) + { + /* pass */ + } + else if (fcca == FCC("mjpg") || fcca == FCC("MJPG")) { + movie.streams[temp].format = AVI_FORMAT_MJPEG; + } + else { + MEM_freeN(movie.streams); + fclose(movie.fp); + return false; + } + } + } + if (j > 0) { + BLI_fseek(movie.fp, j, SEEK_CUR); + } + } + else { + BLI_fseek(movie.fp, movie.streams[temp].sf_size, SEEK_CUR); + } + + /* Walk to the next LIST */ + while (GET_FCC(movie.fp) != FCC("LIST")) { + temp = GET_FCC(movie.fp); + if (temp < 0 || BLI_ftell(movie.fp) > movie.size) { + DEBUG_PRINT("incorrect size in header or error in AVI\n"); + + MEM_freeN(movie.streams); + fclose(movie.fp); + return false; + } + BLI_fseek(movie.fp, temp, SEEK_CUR); + } + + BLI_fseek(movie.fp, -4L, SEEK_CUR); + } + + MEM_freeN(movie.streams); + fclose(movie.fp); + + /* at least one video track is needed */ + return (movie_tracks != 0); +} + +AviError AVI_open_movie(const char *filepath, AviMovie *movie) +{ + int temp, fcca, size, j; + + DEBUG_PRINT("opening movie\n"); + + memset(movie, 0, sizeof(AviMovie)); + + movie->type = AVI_MOVIE_READ; + movie->fp = BLI_fopen(filepath, "rb"); + movie->offset_table = nullptr; + + if (movie->fp == nullptr) { + return AVI_ERROR_OPEN; + } + + if (GET_FCC(movie->fp) != FCC("RIFF") || !(movie->size = GET_FCC(movie->fp))) { + return AVI_ERROR_FORMAT; + } + + movie->header = (AviMainHeader *)MEM_mallocN(sizeof(AviMainHeader), "movieheader"); + + if (GET_FCC(movie->fp) != FCC("AVI ") || GET_FCC(movie->fp) != FCC("LIST") || + !GET_FCC(movie->fp) || GET_FCC(movie->fp) != FCC("hdrl") || + (movie->header->fcc = GET_FCC(movie->fp)) != FCC("avih") || + !(movie->header->size = GET_FCC(movie->fp))) + { + DEBUG_PRINT("bad initial header info\n"); + return AVI_ERROR_FORMAT; + } + + movie->header->MicroSecPerFrame = GET_FCC(movie->fp); + movie->header->MaxBytesPerSec = GET_FCC(movie->fp); + movie->header->PaddingGranularity = GET_FCC(movie->fp); + movie->header->Flags = GET_FCC(movie->fp); + movie->header->TotalFrames = GET_FCC(movie->fp); + movie->header->InitialFrames = GET_FCC(movie->fp); + movie->header->Streams = GET_FCC(movie->fp); + movie->header->SuggestedBufferSize = GET_FCC(movie->fp); + movie->header->Width = GET_FCC(movie->fp); + movie->header->Height = GET_FCC(movie->fp); + movie->header->Reserved[0] = GET_FCC(movie->fp); + movie->header->Reserved[1] = GET_FCC(movie->fp); + movie->header->Reserved[2] = GET_FCC(movie->fp); + movie->header->Reserved[3] = GET_FCC(movie->fp); + + BLI_fseek(movie->fp, movie->header->size - 14 * 4, SEEK_CUR); + + /* Limit number of streams to some reasonable amount to prevent + * buffer overflow vulnerabilities. */ + if (movie->header->Streams < 1 || movie->header->Streams > 65536) { + DEBUG_PRINT("Number of streams should be in range 1-65536\n"); + return AVI_ERROR_FORMAT; + } + + movie->streams = (AviStreamRec *)MEM_calloc_arrayN( + movie->header->Streams, sizeof(AviStreamRec), "moviestreams"); + + for (temp = 0; temp < movie->header->Streams; temp++) { + + if (GET_FCC(movie->fp) != FCC("LIST") || !GET_FCC(movie->fp) || + GET_FCC(movie->fp) != FCC("strl") || + (movie->streams[temp].sh.fcc = GET_FCC(movie->fp)) != FCC("strh") || + !(movie->streams[temp].sh.size = GET_FCC(movie->fp))) + { + DEBUG_PRINT("bad stream header information\n"); + return AVI_ERROR_FORMAT; + } + + movie->streams[temp].sh.Type = GET_FCC(movie->fp); + movie->streams[temp].sh.Handler = GET_FCC(movie->fp); + + fcca = movie->streams[temp].sh.Handler; + + if (movie->streams[temp].sh.Type == FCC("vids")) { + if (fcca == FCC("DIB ") || fcca == FCC("RGB ") || fcca == FCC("rgb ") || + fcca == FCC("RAW ") || fcca == 0) + { + movie->streams[temp].format = AVI_FORMAT_AVI_RGB; + } + else if (fcca == FCC("mjpg") || fcca == FCC("MJPG")) { + movie->streams[temp].format = AVI_FORMAT_MJPEG; + } + else { + return AVI_ERROR_COMPRESSION; + } + } + + movie->streams[temp].sh.Flags = GET_FCC(movie->fp); + movie->streams[temp].sh.Priority = GET_TCC(movie->fp); + movie->streams[temp].sh.Language = GET_TCC(movie->fp); + movie->streams[temp].sh.InitialFrames = GET_FCC(movie->fp); + movie->streams[temp].sh.Scale = GET_FCC(movie->fp); + movie->streams[temp].sh.Rate = GET_FCC(movie->fp); + movie->streams[temp].sh.Start = GET_FCC(movie->fp); + movie->streams[temp].sh.Length = GET_FCC(movie->fp); + movie->streams[temp].sh.SuggestedBufferSize = GET_FCC(movie->fp); + movie->streams[temp].sh.Quality = GET_FCC(movie->fp); + movie->streams[temp].sh.SampleSize = GET_FCC(movie->fp); + movie->streams[temp].sh.left = GET_TCC(movie->fp); + movie->streams[temp].sh.top = GET_TCC(movie->fp); + movie->streams[temp].sh.right = GET_TCC(movie->fp); + movie->streams[temp].sh.bottom = GET_TCC(movie->fp); + + BLI_fseek(movie->fp, movie->streams[temp].sh.size - 14 * 4, SEEK_CUR); + + if (GET_FCC(movie->fp) != FCC("strf")) { + DEBUG_PRINT("no stream format information\n"); + return AVI_ERROR_FORMAT; + } + + movie->streams[temp].sf_size = GET_FCC(movie->fp); + if (movie->streams[temp].sh.Type == FCC("vids")) { + j = movie->streams[temp].sf_size - (sizeof(AviBitmapInfoHeader) - 8); + if (j >= 0) { + AviBitmapInfoHeader *bi; + + movie->streams[temp].sf = MEM_mallocN(sizeof(AviBitmapInfoHeader), "streamformat"); + + bi = (AviBitmapInfoHeader *)movie->streams[temp].sf; + + bi->fcc = FCC("strf"); + bi->size = movie->streams[temp].sf_size; + bi->Size = GET_FCC(movie->fp); + bi->Width = GET_FCC(movie->fp); + bi->Height = GET_FCC(movie->fp); + bi->Planes = GET_TCC(movie->fp); + bi->BitCount = GET_TCC(movie->fp); + bi->Compression = GET_FCC(movie->fp); + bi->SizeImage = GET_FCC(movie->fp); + bi->XPelsPerMeter = GET_FCC(movie->fp); + bi->YPelsPerMeter = GET_FCC(movie->fp); + bi->ClrUsed = GET_FCC(movie->fp); + bi->ClrImportant = GET_FCC(movie->fp); + + fcca = bi->Compression; + + if (movie->streams[temp].format == AVI_FORMAT_AVI_RGB) { + if (fcca == FCC("DIB ") || fcca == FCC("RGB ") || fcca == FCC("rgb ") || + fcca == FCC("RAW ") || fcca == 0) + { + /* pass */ + } + else if (fcca == FCC("mjpg") || fcca == FCC("MJPG")) { + movie->streams[temp].format = AVI_FORMAT_MJPEG; + } + else { + return AVI_ERROR_COMPRESSION; + } + } + } + if (j > 0) { + BLI_fseek(movie->fp, j, SEEK_CUR); + } + } + else { + BLI_fseek(movie->fp, movie->streams[temp].sf_size, SEEK_CUR); + } + + /* Walk to the next LIST */ + while (GET_FCC(movie->fp) != FCC("LIST")) { + temp = GET_FCC(movie->fp); + if (temp < 0 || BLI_ftell(movie->fp) > movie->size) { + DEBUG_PRINT("incorrect size in header or error in AVI\n"); + return AVI_ERROR_FORMAT; + } + BLI_fseek(movie->fp, temp, SEEK_CUR); + } + + BLI_fseek(movie->fp, -4L, SEEK_CUR); + } + + while (true) { + temp = GET_FCC(movie->fp); + size = GET_FCC(movie->fp); + + if (size == 0) { + break; + } + + if (temp == FCC("LIST")) { + if (GET_FCC(movie->fp) == FCC("movi")) { + break; + } + + BLI_fseek(movie->fp, size - 4, SEEK_CUR); + } + else { + BLI_fseek(movie->fp, size, SEEK_CUR); + } + if (BLI_ftell(movie->fp) > movie->size) { + DEBUG_PRINT("incorrect size in header or error in AVI\n"); + return AVI_ERROR_FORMAT; + } + } + + movie->movi_offset = BLI_ftell(movie->fp); + movie->read_offset = movie->movi_offset; + + /* Read in the index if the file has one, otherwise create one */ + if (movie->header->Flags & AVIF_HASINDEX) { + BLI_fseek(movie->fp, size - 4, SEEK_CUR); + + if (GET_FCC(movie->fp) != FCC("idx1")) { + DEBUG_PRINT("bad index information\n"); + return AVI_ERROR_FORMAT; + } + + movie->index_entries = GET_FCC(movie->fp) / sizeof(AviIndexEntry); + if (movie->index_entries == 0) { + DEBUG_PRINT("no index entries\n"); + return AVI_ERROR_FORMAT; + } + + movie->entries = (AviIndexEntry *)MEM_mallocN(movie->index_entries * sizeof(AviIndexEntry), + "movieentries"); + + for (temp = 0; temp < movie->index_entries; temp++) { + movie->entries[temp].ChunkId = GET_FCC(movie->fp); + movie->entries[temp].Flags = GET_FCC(movie->fp); + movie->entries[temp].Offset = GET_FCC(movie->fp); + movie->entries[temp].Size = GET_FCC(movie->fp); + + if (AVI_DEBUG) { + printf("Index entry %04d: ChunkId:%s Flags:%d Offset:%d Size:%d\n", + temp, + fcc_to_char(movie->entries[temp].ChunkId), + movie->entries[temp].Flags, + movie->entries[temp].Offset, + movie->entries[temp].Size); + } + } + + /* Some AVI's have offset entries in absolute coordinates + * instead of an offset from the movie beginning... this is... + * wacky, but we need to handle it. The wacky offset always + * starts at movi_offset it seems... so we'll check that. + * Note the offset needs an extra 4 bytes for some + * undetermined reason */ + + if (movie->entries[0].Offset == movie->movi_offset) { + movie->read_offset = 4; + } + } + + DEBUG_PRINT("movie successfully opened\n"); + return AVI_ERROR_NONE; +} + +void *AVI_read_frame(AviMovie *movie, AviFormat format, int frame, int stream) +{ + int cur_frame = -1, i = 0, rewind = 1; + void *buffer; + + /* Retrieve the record number of the desired frame in the index + * If a chunk has Size 0 we need to rewind to previous frame */ + while (rewind && frame > -1) { + i = 0; + cur_frame = -1; + rewind = 0; + + while (cur_frame < frame && i < movie->index_entries) { + if (fcc_is_data(movie->entries[i].ChunkId) && + fcc_get_stream(movie->entries[i].ChunkId) == stream) + { + if ((cur_frame == frame - 1) && (movie->entries[i].Size == 0)) { + rewind = 1; + frame = frame - 1; + } + else { + cur_frame++; + } + } + i++; + } + } + + if (cur_frame != frame) { + return nullptr; + } + + BLI_fseek(movie->fp, movie->read_offset + movie->entries[i - 1].Offset, SEEK_SET); + + size_t size = GET_FCC(movie->fp); + buffer = MEM_mallocN(size, "readbuffer"); + + if (fread(buffer, 1, size, movie->fp) != size) { + MEM_freeN(buffer); + + return nullptr; + } + + buffer = avi_format_convert(movie, stream, buffer, movie->streams[stream].format, format, &size); + + return buffer; +} + +AviError AVI_close(AviMovie *movie) +{ + int i; + + fclose(movie->fp); + + for (i = 0; i < movie->header->Streams; i++) { + if (movie->streams[i].sf != nullptr) { + MEM_freeN(movie->streams[i].sf); + } + } + + MEM_freeN(movie->header); + MEM_freeN(movie->streams); + + if (movie->entries != nullptr) { + MEM_freeN(movie->entries); + } + if (movie->offset_table != nullptr) { + MEM_freeN(movie->offset_table); + } + + return AVI_ERROR_NONE; +} + +AviError AVI_open_compress(const char *filepath, AviMovie *movie, int streams, ...) +{ + va_list ap; + AviList list; + AviChunk chunk; + int i; + int64_t header_pos1, header_pos2; + int64_t stream_pos1, stream_pos2; + int64_t junk_pos; + + movie->type = AVI_MOVIE_WRITE; + movie->fp = BLI_fopen(filepath, "wb"); + + movie->index_entries = 0; + + if (movie->fp == nullptr) { + return AVI_ERROR_OPEN; + } + + movie->offset_table = (int64_t *)MEM_mallocN((1 + streams * 2) * sizeof(int64_t), "offsettable"); + + for (i = 0; i < 1 + streams * 2; i++) { + movie->offset_table[i] = -1L; + } + + movie->entries = nullptr; + + movie->header = (AviMainHeader *)MEM_mallocN(sizeof(AviMainHeader), "movieheader"); + + movie->header->fcc = FCC("avih"); + movie->header->size = 56; + movie->header->MicroSecPerFrame = 66667; + movie->header->MaxBytesPerSec = 0; + movie->header->PaddingGranularity = 0; + movie->header->Flags = AVIF_HASINDEX | AVIF_MUSTUSEINDEX; + movie->header->TotalFrames = 0; + movie->header->InitialFrames = 0; + movie->header->Streams = streams; + movie->header->SuggestedBufferSize = 0; + movie->header->Width = 0; + movie->header->Height = 0; + movie->header->Reserved[0] = 0; + movie->header->Reserved[1] = 0; + movie->header->Reserved[2] = 0; + movie->header->Reserved[3] = 0; + + /* Limit number of streams to some reasonable amount to prevent + * buffer overflow vulnerabilities. */ + if (movie->header->Streams < 0 || movie->header->Streams > 65536) { + DEBUG_PRINT("Number of streams should be in range 0-65536\n"); + return AVI_ERROR_FORMAT; + } + + movie->streams = (AviStreamRec *)MEM_mallocN(sizeof(AviStreamRec) * movie->header->Streams, + "moviestreams"); + + va_start(ap, streams); + + for (i = 0; i < movie->header->Streams; i++) { + movie->streams[i].format = AviFormat(va_arg(ap, int)); + + movie->streams[i].sh.fcc = FCC("strh"); + movie->streams[i].sh.size = 56; + movie->streams[i].sh.Type = avi_get_format_type(movie->streams[i].format); + if (movie->streams[i].sh.Type == 0) { + va_end(ap); + return AVI_ERROR_FORMAT; + } + + movie->streams[i].sh.Handler = avi_get_format_fcc(movie->streams[i].format); + if (movie->streams[i].sh.Handler == 0) { + va_end(ap); + return AVI_ERROR_FORMAT; + } + + movie->streams[i].sh.Flags = 0; + movie->streams[i].sh.Priority = 0; + movie->streams[i].sh.Language = 0; + movie->streams[i].sh.InitialFrames = 0; + movie->streams[i].sh.Scale = 66667; + movie->streams[i].sh.Rate = 1000000; + movie->streams[i].sh.Start = 0; + movie->streams[i].sh.Length = 0; + movie->streams[i].sh.SuggestedBufferSize = 0; + movie->streams[i].sh.Quality = 10000; + movie->streams[i].sh.SampleSize = 0; + movie->streams[i].sh.left = 0; + movie->streams[i].sh.top = 0; + movie->streams[i].sh.right = 0; + movie->streams[i].sh.bottom = 0; + + if (movie->streams[i].sh.Type == FCC("vids")) { + movie->streams[i].sf = MEM_mallocN(sizeof(AviBitmapInfoHeader), "moviestreamformatS"); + movie->streams[i].sf_size = sizeof(AviBitmapInfoHeader); + + ((AviBitmapInfoHeader *)movie->streams[i].sf)->fcc = FCC("strf"); + ((AviBitmapInfoHeader *)movie->streams[i].sf)->size = movie->streams[i].sf_size - 8; + ((AviBitmapInfoHeader *)movie->streams[i].sf)->Size = movie->streams[i].sf_size - 8; + ((AviBitmapInfoHeader *)movie->streams[i].sf)->Width = 0; + ((AviBitmapInfoHeader *)movie->streams[i].sf)->Height = 0; + ((AviBitmapInfoHeader *)movie->streams[i].sf)->Planes = 1; + ((AviBitmapInfoHeader *)movie->streams[i].sf)->BitCount = 24; + ((AviBitmapInfoHeader *)movie->streams[i].sf)->Compression = avi_get_format_compression( + movie->streams[i].format); + ((AviBitmapInfoHeader *)movie->streams[i].sf)->SizeImage = 0; + ((AviBitmapInfoHeader *)movie->streams[i].sf)->XPelsPerMeter = 0; + ((AviBitmapInfoHeader *)movie->streams[i].sf)->YPelsPerMeter = 0; + ((AviBitmapInfoHeader *)movie->streams[i].sf)->ClrUsed = 0; + ((AviBitmapInfoHeader *)movie->streams[i].sf)->ClrImportant = 0; + } + } + + list.fcc = FCC("RIFF"); + list.size = 0; + list.ids = FCC("AVI "); + + awrite(movie, &list, 1, sizeof(AviList), movie->fp, AVI_LIST); + + list.fcc = FCC("LIST"); + list.size = 0; + list.ids = FCC("hdrl"); + + awrite(movie, &list, 1, sizeof(AviList), movie->fp, AVI_LIST); + + header_pos1 = BLI_ftell(movie->fp); + + movie->offset_table[0] = BLI_ftell(movie->fp); + + awrite(movie, movie->header, 1, sizeof(AviMainHeader), movie->fp, AVI_MAINH); + + for (i = 0; i < movie->header->Streams; i++) { + list.fcc = FCC("LIST"); + list.size = 0; + list.ids = FCC("strl"); + + awrite(movie, &list, 1, sizeof(AviList), movie->fp, AVI_LIST); + + stream_pos1 = BLI_ftell(movie->fp); + + movie->offset_table[1 + i * 2] = BLI_ftell(movie->fp); + awrite(movie, &movie->streams[i].sh, 1, sizeof(AviStreamHeader), movie->fp, AVI_STREAMH); + + movie->offset_table[1 + i * 2 + 1] = BLI_ftell(movie->fp); + awrite(movie, movie->streams[i].sf, 1, movie->streams[i].sf_size, movie->fp, AVI_BITMAPH); + + stream_pos2 = BLI_ftell(movie->fp); + + BLI_fseek(movie->fp, stream_pos1 - 8, SEEK_SET); + + PUT_FCCN((stream_pos2 - stream_pos1 + 4L), movie->fp); + + BLI_fseek(movie->fp, stream_pos2, SEEK_SET); + } + + junk_pos = BLI_ftell(movie->fp); + + if (junk_pos < 2024 - 8) { + chunk.fcc = FCC("JUNK"); + chunk.size = 2024 - 8 - int(junk_pos); + + awrite(movie, &chunk, 1, sizeof(AviChunk), movie->fp, AVI_CHUNK); + + for (i = 0; i < chunk.size; i++) { + putc(0, movie->fp); + } + } + + header_pos2 = BLI_ftell(movie->fp); + + list.fcc = FCC("LIST"); + list.size = 0; + list.ids = FCC("movi"); + + awrite(movie, &list, 1, sizeof(AviList), movie->fp, AVI_LIST); + + movie->movi_offset = BLI_ftell(movie->fp) - 8L; + + BLI_fseek(movie->fp, AVI_HDRL_SOFF, SEEK_SET); + + PUT_FCCN((header_pos2 - header_pos1 + 4L), movie->fp); + + va_end(ap); + + return AVI_ERROR_NONE; +} + +AviError AVI_write_frame(AviMovie *movie, int frame_num, ...) +{ + AviList list; + AviChunk chunk; + va_list ap; + int stream; + int64_t rec_off; + AviFormat format; + void *buffer; + + if (frame_num < 0) { + return AVI_ERROR_OPTION; + } + + /* Allocate the new memory for the index entry */ + + if (frame_num >= movie->index_entries) { + const size_t entry_size = (movie->header->Streams + 1) * sizeof(AviIndexEntry); + movie->entries = (AviIndexEntry *)MEM_recallocN(movie->entries, (frame_num + 1) * entry_size); + movie->index_entries = frame_num + 1; + } + + /* Slap a new record entry onto the end of the file */ + + BLI_fseek(movie->fp, 0L, SEEK_END); + + list.fcc = FCC("LIST"); + list.size = 0; + list.ids = FCC("rec "); + + awrite(movie, &list, 1, sizeof(AviList), movie->fp, AVI_LIST); + + rec_off = BLI_ftell(movie->fp) - 8L; + + /* Write a frame for every stream */ + + va_start(ap, frame_num); + + for (stream = 0; stream < movie->header->Streams; stream++) { + uint tbuf = 0; + + format = AviFormat(va_arg(ap, int)); + buffer = va_arg(ap, void *); + size_t size = va_arg(ap, int); + + /* Convert the buffer into the output format */ + buffer = avi_format_convert( + movie, stream, buffer, format, movie->streams[stream].format, &size); + + /* Write the header info for this data chunk */ + + BLI_fseek(movie->fp, 0L, SEEK_END); + + chunk.fcc = avi_get_data_id(format, stream); + chunk.size = size; + + if (size % 4) { + chunk.size += 4 - size % 4; + } + + awrite(movie, &chunk, 1, sizeof(AviChunk), movie->fp, AVI_CHUNK); + + /* Write the index entry for this data chunk */ + + movie->entries[frame_num * (movie->header->Streams + 1) + stream + 1].ChunkId = chunk.fcc; + movie->entries[frame_num * (movie->header->Streams + 1) + stream + 1].Flags = AVIIF_KEYFRAME; + movie->entries[frame_num * (movie->header->Streams + 1) + stream + 1].Offset = int( + BLI_ftell(movie->fp) - 12L - movie->movi_offset); + movie->entries[frame_num * (movie->header->Streams + 1) + stream + 1].Size = chunk.size; + + /* Write the chunk */ + awrite(movie, buffer, 1, size, movie->fp, AVI_RAW); + MEM_freeN(buffer); + + if (size % 4) { + awrite(movie, &tbuf, 1, 4 - size % 4, movie->fp, AVI_RAW); + } + + /* Update the stream headers length field */ + movie->streams[stream].sh.Length++; + BLI_fseek(movie->fp, movie->offset_table[1 + stream * 2], SEEK_SET); + awrite(movie, &movie->streams[stream].sh, 1, sizeof(AviStreamHeader), movie->fp, AVI_STREAMH); + } + va_end(ap); + + /* Record the entry for the new record */ + + BLI_fseek(movie->fp, 0L, SEEK_END); + + movie->entries[frame_num * (movie->header->Streams + 1)].ChunkId = FCC("rec "); + movie->entries[frame_num * (movie->header->Streams + 1)].Flags = AVIIF_LIST; + movie->entries[frame_num * (movie->header->Streams + 1)].Offset = int(rec_off - 8L - + movie->movi_offset); + movie->entries[frame_num * (movie->header->Streams + 1)].Size = int(BLI_ftell(movie->fp) - + (rec_off + 4L)); + + /* Update the record size */ + BLI_fseek(movie->fp, rec_off, SEEK_SET); + PUT_FCCN(movie->entries[frame_num * (movie->header->Streams + 1)].Size, movie->fp); + + /* Update the main header information in the file */ + movie->header->TotalFrames++; + BLI_fseek(movie->fp, movie->offset_table[0], SEEK_SET); + awrite(movie, movie->header, 1, sizeof(AviMainHeader), movie->fp, AVI_MAINH); + + return AVI_ERROR_NONE; +} + +AviError AVI_close_compress(AviMovie *movie) +{ + int temp, movi_size, i; + + if (movie->fp == nullptr) { + /* none of the allocations below were done if the file failed to open */ + return AVI_ERROR_FOUND; + } + + BLI_fseek(movie->fp, 0L, SEEK_END); + movi_size = int(BLI_ftell(movie->fp)); + + PUT_FCC("idx1", movie->fp); + PUT_FCCN((movie->index_entries * (movie->header->Streams + 1) * 16), movie->fp); + + for (temp = 0; temp < movie->index_entries * (movie->header->Streams + 1); temp++) { + awrite(movie, &movie->entries[temp], 1, sizeof(AviIndexEntry), movie->fp, AVI_INDEXE); + } + + temp = int(BLI_ftell(movie->fp)); + + BLI_fseek(movie->fp, AVI_RIFF_SOFF, SEEK_SET); + + PUT_FCCN((temp - 8L), movie->fp); + + BLI_fseek(movie->fp, movie->movi_offset, SEEK_SET); + + PUT_FCCN((movi_size - (movie->movi_offset + 4L)), movie->fp); + + fclose(movie->fp); + + for (i = 0; i < movie->header->Streams; i++) { + if (movie->streams && (movie->streams[i].sf != nullptr)) { + MEM_freeN(movie->streams[i].sf); + } + } + + MEM_freeN(movie->header); + + if (movie->entries != nullptr) { + MEM_freeN(movie->entries); + } + if (movie->streams != nullptr) { + MEM_freeN(movie->streams); + } + if (movie->offset_table != nullptr) { + MEM_freeN(movie->offset_table); + } + return AVI_ERROR_NONE; +} diff --git a/source/blender/io/avi/intern/avi_codecs.cc b/source/blender/io/avi/intern/avi_codecs.cc new file mode 100644 index 00000000000..f1cd0ad925a --- /dev/null +++ b/source/blender/io/avi/intern/avi_codecs.cc @@ -0,0 +1,125 @@ +/* SPDX-FileCopyrightText: 2001-2002 NaN Holding BV. All rights reserved. + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +/** \file + * \ingroup avi + * + * This is external code. Identify and convert different avi-files. + */ + +#include "AVI_avi.h" +#include "avi_intern.h" + +#include "avi_mjpeg.h" +#include "avi_rgb.h" +#include "avi_rgb32.h" + +#include "BLI_string.h" + +void *avi_format_convert( + AviMovie *movie, int stream, void *buffer, AviFormat from, AviFormat to, size_t *size) +{ + if (from == to) { + return buffer; + } + + if (from != AVI_FORMAT_RGB24 && to != AVI_FORMAT_RGB24) { + return avi_format_convert( + movie, + stream, + avi_format_convert(movie, stream, buffer, from, AVI_FORMAT_RGB24, size), + AVI_FORMAT_RGB24, + to, + size); + } + + switch (to) { + case AVI_FORMAT_RGB24: + switch (from) { + case AVI_FORMAT_AVI_RGB: + buffer = avi_converter_from_avi_rgb(movie, stream, static_cast(buffer), size); + break; + case AVI_FORMAT_MJPEG: + buffer = avi_converter_from_mjpeg(movie, stream, static_cast(buffer), size); + break; + case AVI_FORMAT_RGB32: + buffer = avi_converter_from_rgb32(movie, stream, static_cast(buffer), size); + break; + default: + break; + } + break; + case AVI_FORMAT_AVI_RGB: + buffer = avi_converter_to_avi_rgb(movie, stream, static_cast(buffer), size); + break; + case AVI_FORMAT_MJPEG: + buffer = avi_converter_to_mjpeg(movie, stream, static_cast(buffer), size); + break; + case AVI_FORMAT_RGB32: + buffer = avi_converter_to_rgb32(movie, stream, static_cast(buffer), size); + break; + default: + break; + } + + return buffer; +} + +int avi_get_data_id(AviFormat format, int stream) +{ + char fcc[5]; + + if (avi_get_format_type(format) == FCC("vids")) { + SNPRINTF(fcc, "%2.2ddc", stream); + } + else if (avi_get_format_type(format) == FCC("auds")) { + SNPRINTF(fcc, "%2.2ddc", stream); + } + else { + return 0; + } + + return FCC(fcc); +} + +int avi_get_format_type(AviFormat format) +{ + switch (format) { + case AVI_FORMAT_RGB24: + case AVI_FORMAT_RGB32: + case AVI_FORMAT_AVI_RGB: + case AVI_FORMAT_MJPEG: + return FCC("vids"); + default: + return 0; + } +} + +int avi_get_format_fcc(AviFormat format) +{ + switch (format) { + case AVI_FORMAT_RGB24: + case AVI_FORMAT_RGB32: + case AVI_FORMAT_AVI_RGB: + return FCC("DIB "); + case AVI_FORMAT_MJPEG: + return FCC("MJPG"); + default: + return 0; + } +} + +int avi_get_format_compression(AviFormat format) +{ + switch (format) { + case AVI_FORMAT_RGB24: + case AVI_FORMAT_RGB32: + case AVI_FORMAT_AVI_RGB: + return 0; + case AVI_FORMAT_MJPEG: + return FCC("MJPG"); + default: + return 0; + } +} diff --git a/source/blender/io/avi/intern/avi_endian.cc b/source/blender/io/avi/intern/avi_endian.cc new file mode 100644 index 00000000000..8dadd5dace3 --- /dev/null +++ b/source/blender/io/avi/intern/avi_endian.cc @@ -0,0 +1,188 @@ +/* SPDX-FileCopyrightText: 2001-2002 NaN Holding BV. All rights reserved. + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +/** \file + * \ingroup avi + * + * This is external code. Streams bytes to output depending on the + * endianness of the system. + */ + +#include +#include +#include + +#include "AVI_avi.h" +#include "avi_endian.h" +#include "avi_intern.h" + +#ifdef __BIG_ENDIAN__ +# include "MEM_guardedalloc.h" +#endif + +#ifdef __BIG_ENDIAN__ + +/* copied from BLI_endian_switch_inline.h */ +static void invert(int *val) +{ + int tval = *val; + *val = (tval >> 24) | ((tval << 8) & 0x00ff0000) | ((tval >> 8) & 0x0000ff00) | (tval << 24); +} + +static void sinvert(short int *val) +{ + short tval = *val; + *val = (tval >> 8) | (tval << 8); +} + +static void Ichunk(AviChunk *chunk) +{ + invert(&chunk->fcc); + invert(&chunk->size); +} +#endif + +#ifdef __BIG_ENDIAN__ +static void Ilist(AviList *list) +{ + invert(&list->fcc); + invert(&list->size); + invert(&list->ids); +} + +static void Imainh(AviMainHeader *mainh) +{ + invert(&mainh->fcc); + invert(&mainh->size); + invert(&mainh->MicroSecPerFrame); + invert(&mainh->MaxBytesPerSec); + invert(&mainh->PaddingGranularity); + invert(&mainh->Flags); + invert(&mainh->TotalFrames); + invert(&mainh->InitialFrames); + invert(&mainh->Streams); + invert(&mainh->SuggestedBufferSize); + invert(&mainh->Width); + invert(&mainh->Height); + invert(&mainh->Reserved[0]); + invert(&mainh->Reserved[1]); + invert(&mainh->Reserved[2]); + invert(&mainh->Reserved[3]); +} + +static void Istreamh(AviStreamHeader *streamh) +{ + invert(&streamh->fcc); + invert(&streamh->size); + invert(&streamh->Type); + invert(&streamh->Handler); + invert(&streamh->Flags); + sinvert(&streamh->Priority); + sinvert(&streamh->Language); + invert(&streamh->InitialFrames); + invert(&streamh->Scale); + invert(&streamh->Rate); + invert(&streamh->Start); + invert(&streamh->Length); + invert(&streamh->SuggestedBufferSize); + invert(&streamh->Quality); + invert(&streamh->SampleSize); + sinvert(&streamh->left); + sinvert(&streamh->right); + sinvert(&streamh->top); + sinvert(&streamh->bottom); +} + +static void Ibitmaph(AviBitmapInfoHeader *bitmaph) +{ + invert(&bitmaph->fcc); + invert(&bitmaph->size); + invert(&bitmaph->Size); + invert(&bitmaph->Width); + invert(&bitmaph->Height); + sinvert(&bitmaph->Planes); + sinvert(&bitmaph->BitCount); + invert(&bitmaph->Compression); + invert(&bitmaph->SizeImage); + invert(&bitmaph->XPelsPerMeter); + invert(&bitmaph->YPelsPerMeter); + invert(&bitmaph->ClrUsed); + invert(&bitmaph->ClrImportant); +} + +static void Imjpegu(AviMJPEGUnknown *mjpgu) +{ + invert(&mjpgu->a); + invert(&mjpgu->b); + invert(&mjpgu->c); + invert(&mjpgu->d); + invert(&mjpgu->e); + invert(&mjpgu->f); + invert(&mjpgu->g); +} + +static void Iindexe(AviIndexEntry *indexe) +{ + invert(&indexe->ChunkId); + invert(&indexe->Flags); + invert(&indexe->Offset); + invert(&indexe->Size); +} +#endif /* __BIG_ENDIAN__ */ + +void awrite(AviMovie *movie, const void *datain, int block, int size, FILE *fp, int type) +{ +#ifdef __BIG_ENDIAN__ + void *data; + + data = MEM_mallocN(size, "avi endian"); + + memcpy(data, datain, size); + + switch (type) { + case AVI_RAW: + fwrite(data, block, size, fp); + break; + case AVI_CHUNK: + Ichunk((AviChunk *)data); + fwrite(data, block, size, fp); + break; + case AVI_LIST: + Ilist((AviList *)data); + fwrite(data, block, size, fp); + break; + case AVI_MAINH: + Imainh((AviMainHeader *)data); + fwrite(data, block, size, fp); + break; + case AVI_STREAMH: + Istreamh((AviStreamHeader *)data); + fwrite(data, block, size, fp); + break; + case AVI_BITMAPH: + Ibitmaph((AviBitmapInfoHeader *)data); + if (size == sizeof(AviBitmapInfoHeader) + sizeof(AviMJPEGUnknown)) { + Imjpegu((AviMJPEGUnknown *)((char *)data + sizeof(AviBitmapInfoHeader))); + } + fwrite(data, block, size, fp); + break; + case AVI_MJPEGU: + Imjpegu((AviMJPEGUnknown *)data); + fwrite(data, block, size, fp); + break; + case AVI_INDEXE: + Iindexe((AviIndexEntry *)data); + fwrite(data, block, size, fp); + break; + default: + break; + } + + MEM_freeN(data); +#else /* __BIG_ENDIAN__ */ + (void)movie; /* unused */ + (void)type; /* unused */ + fwrite(datain, block, size, fp); +#endif /* __BIG_ENDIAN__ */ +} diff --git a/source/blender/io/avi/intern/avi_endian.h b/source/blender/io/avi/intern/avi_endian.h new file mode 100644 index 00000000000..38cdb14cddc --- /dev/null +++ b/source/blender/io/avi/intern/avi_endian.h @@ -0,0 +1,30 @@ +/* SPDX-FileCopyrightText: 2001-2002 NaN Holding BV. All rights reserved. + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +/** \file + * \ingroup avi + * + * This is external code. + */ + +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#define AVI_RAW 0 +#define AVI_CHUNK 1 +#define AVI_LIST 2 +#define AVI_MAINH 3 +#define AVI_STREAMH 4 +#define AVI_BITMAPH 5 +#define AVI_INDEXE 6 +#define AVI_MJPEGU 7 + +void awrite(AviMovie *movie, const void *datain, int block, int size, FILE *fp, int type); + +#ifdef __cplusplus +} +#endif diff --git a/source/blender/io/avi/intern/avi_intern.h b/source/blender/io/avi/intern/avi_intern.h new file mode 100644 index 00000000000..9112e769732 --- /dev/null +++ b/source/blender/io/avi/intern/avi_intern.h @@ -0,0 +1,55 @@ +/* SPDX-FileCopyrightText: 2001-2002 NaN Holding BV. All rights reserved. + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +/** \file + * \ingroup avi + */ + +#pragma once + +#include /* for FILE */ + +#ifdef __cplusplus +extern "C" { +#endif + +unsigned int GET_FCC(FILE *fp); +unsigned int GET_TCC(FILE *fp); + +#define PUT_FCC(ch4, fp) \ + { \ + putc(ch4[0], fp); \ + putc(ch4[1], fp); \ + putc(ch4[2], fp); \ + putc(ch4[3], fp); \ + } \ + (void)0 + +#define PUT_FCCN(num, fp) \ + { \ + putc((num >> 0) & 0377, fp); \ + putc((num >> 8) & 0377, fp); \ + putc((num >> 16) & 0377, fp); \ + putc((num >> 24) & 0377, fp); \ + } \ + (void)0 + +#define PUT_TCC(ch2, fp) \ + { \ + putc(ch2[0], fp); \ + putc(ch2[1], fp); \ + } \ + (void)0 + +void *avi_format_convert( + AviMovie *movie, int stream, void *buffer, AviFormat from, AviFormat to, size_t *size); + +int avi_get_data_id(AviFormat format, int stream); +int avi_get_format_type(AviFormat format); +int avi_get_format_fcc(AviFormat format); +int avi_get_format_compression(AviFormat format); + +#ifdef __cplusplus +} +#endif diff --git a/source/blender/io/avi/intern/avi_mjpeg.cc b/source/blender/io/avi/intern/avi_mjpeg.cc new file mode 100644 index 00000000000..634a2e15854 --- /dev/null +++ b/source/blender/io/avi/intern/avi_mjpeg.cc @@ -0,0 +1,548 @@ +/* SPDX-FileCopyrightText: 2001-2002 NaN Holding BV. All rights reserved. + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +/** \file + * \ingroup avi + * + * This is external code. Converts between AVI and MPEG/JPEG. + */ + +#include +#include + +#include "AVI_avi.h" + +#include "MEM_guardedalloc.h" + +#include "BLI_math_base.h" +#include "IMB_imbuf.hh" + +#include +#include + +#include "avi_mjpeg.h" + +static void jpegmemdestmgr_build(j_compress_ptr cinfo, uchar *buffer, size_t bufsize); +static void jpegmemsrcmgr_build(j_decompress_ptr dinfo, const uchar *buffer, size_t bufsize); + +static size_t numbytes; + +static void add_huff_table(j_decompress_ptr dinfo, + JHUFF_TBL **htblptr, + const UINT8 *bits, + const size_t bits_size, + const UINT8 *val, + const size_t val_size) +{ + if (*htblptr == nullptr) { + *htblptr = jpeg_alloc_huff_table((j_common_ptr)dinfo); + } + + memcpy((*htblptr)->bits, bits, min_zz(sizeof((*htblptr)->bits), bits_size)); + memcpy((*htblptr)->huffval, val, min_zz(sizeof((*htblptr)->huffval), val_size)); + + /* Initialize sent_table false so table will be written to JPEG file. */ + (*htblptr)->sent_table = false; +} + +/* Set up the standard Huffman tables (cf. JPEG standard section K.3) */ +/* IMPORTANT: these are only valid for 8-bit data precision! */ + +static void std_huff_tables(j_decompress_ptr dinfo) +{ + static const UINT8 bits_dc_luminance[17] = { + /* 0-base */ + 0, + 0, + 1, + 5, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + }; + static const UINT8 val_dc_luminance[] = { + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + }; + + static const UINT8 bits_dc_chrominance[17] = { + /* 0-base */ + 0, + 0, + 3, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + }; + static const UINT8 val_dc_chrominance[] = { + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + }; + + static const UINT8 bits_ac_luminance[17] = { + /* 0-base */ + 0, + 0, + 2, + 1, + 3, + 3, + 2, + 4, + 3, + 5, + 5, + 4, + 4, + 0, + 0, + 1, + 0x7d, + }; + static const UINT8 val_ac_luminance[] = { + 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12, 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, + 0x07, 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08, 0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, + 0xd1, 0xf0, 0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x25, + 0x26, 0x27, 0x28, 0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x43, 0x44, 0x45, + 0x46, 0x47, 0x48, 0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x63, 0x64, + 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x83, + 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, + 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, + 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, + 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, + 0xe9, 0xea, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, + }; + static const UINT8 bits_ac_chrominance[17] = { + /* 0-base */ + 0, + 0, + 2, + 1, + 2, + 4, + 4, + 3, + 4, + 7, + 5, + 4, + 4, + 0, + 1, + 2, + 0x77, + }; + static const UINT8 val_ac_chrominance[] = { + 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21, 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, + 0x71, 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91, 0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, + 0x52, 0xf0, 0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34, 0xe1, 0x25, 0xf1, 0x17, 0x18, + 0x19, 0x1a, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x43, 0x44, + 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x63, + 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, + 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, + 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, + 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, + 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, + 0xe8, 0xe9, 0xea, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, + }; + + add_huff_table(dinfo, + &dinfo->dc_huff_tbl_ptrs[0], + bits_dc_luminance, + sizeof(bits_dc_luminance), + val_dc_luminance, + sizeof(val_dc_luminance)); + add_huff_table(dinfo, + &dinfo->ac_huff_tbl_ptrs[0], + bits_ac_luminance, + sizeof(bits_ac_luminance), + val_ac_luminance, + sizeof(val_ac_luminance)); + add_huff_table(dinfo, + &dinfo->dc_huff_tbl_ptrs[1], + bits_dc_chrominance, + sizeof(bits_dc_chrominance), + val_dc_chrominance, + sizeof(val_dc_chrominance)); + add_huff_table(dinfo, + &dinfo->ac_huff_tbl_ptrs[1], + bits_ac_chrominance, + sizeof(bits_ac_chrominance), + val_ac_chrominance, + sizeof(val_ac_chrominance)); +} + +static int Decode_JPEG(uchar *inBuffer, uchar *outBuffer, uint width, uint height, size_t bufsize) +{ + jpeg_decompress_struct dinfo; + jpeg_error_mgr jerr; + + (void)width; /* unused */ + + numbytes = 0; + + dinfo.err = jpeg_std_error(&jerr); + jpeg_create_decompress(&dinfo); + jpegmemsrcmgr_build(&dinfo, inBuffer, bufsize); + jpeg_read_header(&dinfo, true); + if (dinfo.dc_huff_tbl_ptrs[0] == nullptr) { + std_huff_tables(&dinfo); + } + dinfo.out_color_space = JCS_RGB; + dinfo.dct_method = JDCT_IFAST; + + jpeg_start_decompress(&dinfo); + + size_t rowstride = dinfo.output_width * dinfo.output_components; + for (size_t y = 0; y < dinfo.output_height; y++) { + jpeg_read_scanlines(&dinfo, (JSAMPARRAY)&outBuffer, 1); + outBuffer += rowstride; + } + jpeg_finish_decompress(&dinfo); + + if (dinfo.output_height >= height) { + return 0; + } + + inBuffer += numbytes; + jpegmemsrcmgr_build(&dinfo, inBuffer, bufsize - numbytes); + + numbytes = 0; + jpeg_read_header(&dinfo, true); + if (dinfo.dc_huff_tbl_ptrs[0] == nullptr) { + std_huff_tables(&dinfo); + } + + jpeg_start_decompress(&dinfo); + rowstride = dinfo.output_width * dinfo.output_components; + for (size_t y = 0; y < dinfo.output_height; y++) { + jpeg_read_scanlines(&dinfo, (JSAMPARRAY)&outBuffer, 1); + outBuffer += rowstride; + } + jpeg_finish_decompress(&dinfo); + jpeg_destroy_decompress(&dinfo); + + return 1; +} + +static void Compress_JPEG( + int quality, uchar *outbuffer, const uchar *inBuffer, int width, int height, size_t bufsize) +{ + jpeg_compress_struct cinfo; + jpeg_error_mgr jerr; + uchar marker[60]; + + cinfo.err = jpeg_std_error(&jerr); + jpeg_create_compress(&cinfo); + jpegmemdestmgr_build(&cinfo, outbuffer, bufsize); + + cinfo.image_width = width; + cinfo.image_height = height; + cinfo.input_components = 3; + cinfo.in_color_space = JCS_RGB; + + jpeg_set_defaults(&cinfo); + jpeg_set_colorspace(&cinfo, JCS_YCbCr); + + jpeg_set_quality(&cinfo, quality, true); + + cinfo.dc_huff_tbl_ptrs[0]->sent_table = true; + cinfo.dc_huff_tbl_ptrs[1]->sent_table = true; + cinfo.ac_huff_tbl_ptrs[0]->sent_table = true; + cinfo.ac_huff_tbl_ptrs[1]->sent_table = true; + + cinfo.comp_info[0].component_id = 0; + cinfo.comp_info[0].v_samp_factor = 1; + cinfo.comp_info[1].component_id = 1; + cinfo.comp_info[2].component_id = 2; + + cinfo.write_JFIF_header = false; + + jpeg_start_compress(&cinfo, false); + + int i = 0; + marker[i++] = 'A'; + marker[i++] = 'V'; + marker[i++] = 'I'; + marker[i++] = '1'; + marker[i++] = 0; + while (i < 60) { + marker[i++] = 32; + } + + jpeg_write_marker(&cinfo, JPEG_APP0, marker, 60); + + i = 0; + while (i < 60) { + marker[i++] = 0; + } + + jpeg_write_marker(&cinfo, JPEG_COM, marker, 60); + + size_t rowstride = cinfo.image_width * cinfo.input_components; + for (size_t y = 0; y < cinfo.image_height; y++) { + jpeg_write_scanlines(&cinfo, (JSAMPARRAY)&inBuffer, 1); + inBuffer += rowstride; + } + jpeg_finish_compress(&cinfo); + jpeg_destroy_compress(&cinfo); +} + +static void interlace(uchar *to, uchar *from, int width, int height) +{ + size_t i, rowstride = width * 3; + + for (i = 0; i < height; i++) { + if (i & 1) { + memcpy(&to[i * rowstride], &from[(i / 2 + height / 2) * rowstride], rowstride); + } + else { + memcpy(&to[i * rowstride], &from[(i / 2) * rowstride], rowstride); + } + } +} + +static void deinterlace(int odd, uchar *to, uchar *from, int width, int height) +{ + size_t i, rowstride = width * 3; + + for (i = 0; i < height; i++) { + if ((i & 1) == odd) { + memcpy(&to[(i / 2 + height / 2) * rowstride], &from[i * rowstride], rowstride); + } + else { + memcpy(&to[(i / 2) * rowstride], &from[i * rowstride], rowstride); + } + } +} + +void *avi_converter_from_mjpeg(AviMovie *movie, int stream, uchar *buffer, const size_t *size) +{ + int deint; + uchar *buf; + + (void)stream; /* unused */ + + buf = static_cast(imb_alloc_pixels(movie->header->Height, + movie->header->Width, + 3, + sizeof(uchar), + "avi.avi_converter_from_mjpeg 1")); + if (!buf) { + return nullptr; + } + + deint = Decode_JPEG(buffer, buf, movie->header->Width, movie->header->Height, *size); + + MEM_freeN(buffer); + + if (deint) { + buffer = static_cast(imb_alloc_pixels(movie->header->Height, + movie->header->Width, + 3, + sizeof(uchar), + "avi.avi_converter_from_mjpeg 2")); + if (buffer) { + interlace(buffer, buf, movie->header->Width, movie->header->Height); + } + MEM_freeN(buf); + + buf = buffer; + } + + return buf; +} + +void *avi_converter_to_mjpeg(AviMovie *movie, int stream, uchar *buffer, size_t *size) +{ + uchar *buf; + size_t bufsize = *size; + + numbytes = 0; + *size = 0; + + buf = static_cast(imb_alloc_pixels(movie->header->Height, + movie->header->Width, + 3, + sizeof(uchar), + "avi.avi_converter_to_mjpeg 1")); + if (!buf) { + return nullptr; + } + + if (!movie->interlace) { + Compress_JPEG(movie->streams[stream].sh.Quality / 100, + buf, + buffer, + movie->header->Width, + movie->header->Height, + bufsize); + *size += numbytes; + } + else { + deinterlace(movie->odd_fields, buf, buffer, movie->header->Width, movie->header->Height); + MEM_freeN(buffer); + + buffer = buf; + buf = static_cast(imb_alloc_pixels(movie->header->Height, + movie->header->Width, + 3, + sizeof(uchar), + "avi.avi_converter_to_mjpeg 1")); + + if (buf) { + Compress_JPEG(movie->streams[stream].sh.Quality / 100, + buf, + buffer, + movie->header->Width, + movie->header->Height / 2, + bufsize / 2); + *size += numbytes; + numbytes = 0; + Compress_JPEG(movie->streams[stream].sh.Quality / 100, + buf + *size, + buffer + size_t(movie->header->Height / 2) * size_t(movie->header->Width) * 3, + movie->header->Width, + movie->header->Height / 2, + bufsize / 2); + *size += numbytes; + } + } + + MEM_freeN(buffer); + return buf; +} + +/* Compression from memory */ + +static void jpegmemdestmgr_init_destination(j_compress_ptr cinfo) +{ + (void)cinfo; /* unused */ +} + +static boolean jpegmemdestmgr_empty_output_buffer(j_compress_ptr cinfo) +{ + (void)cinfo; /* unused */ + return true; +} + +static void jpegmemdestmgr_term_destination(j_compress_ptr cinfo) +{ + numbytes -= cinfo->dest->free_in_buffer; + + MEM_freeN(cinfo->dest); +} + +static void jpegmemdestmgr_build(j_compress_ptr cinfo, uchar *buffer, size_t bufsize) +{ + cinfo->dest = static_cast( + MEM_mallocN(sizeof(*(cinfo->dest)), "avi.jpegmemdestmgr_build")); + + cinfo->dest->init_destination = jpegmemdestmgr_init_destination; + cinfo->dest->empty_output_buffer = jpegmemdestmgr_empty_output_buffer; + cinfo->dest->term_destination = jpegmemdestmgr_term_destination; + + cinfo->dest->next_output_byte = buffer; + cinfo->dest->free_in_buffer = bufsize; + + numbytes = bufsize; +} + +/* Decompression from memory */ + +static void jpegmemsrcmgr_init_source(j_decompress_ptr dinfo) +{ + (void)dinfo; +} + +static boolean jpegmemsrcmgr_fill_input_buffer(j_decompress_ptr dinfo) +{ + uchar *buf = (uchar *)dinfo->src->next_input_byte - 2; + + /* if we get called, must have run out of data */ + WARNMS(dinfo, JWRN_JPEG_EOF); + + buf[0] = (JOCTET)0xFF; + buf[1] = (JOCTET)JPEG_EOI; + + dinfo->src->next_input_byte = buf; + dinfo->src->bytes_in_buffer = 2; + + return true; +} + +static void jpegmemsrcmgr_skip_input_data(j_decompress_ptr dinfo, long skip_count) +{ + if (dinfo->src->bytes_in_buffer < skip_count) { + skip_count = dinfo->src->bytes_in_buffer; + } + + dinfo->src->next_input_byte += skip_count; + dinfo->src->bytes_in_buffer -= skip_count; +} + +static void jpegmemsrcmgr_term_source(j_decompress_ptr dinfo) +{ + numbytes -= dinfo->src->bytes_in_buffer; + + MEM_freeN(dinfo->src); +} + +static void jpegmemsrcmgr_build(j_decompress_ptr dinfo, const uchar *buffer, size_t bufsize) +{ + dinfo->src = static_cast( + MEM_mallocN(sizeof(*(dinfo->src)), "avi.jpegmemsrcmgr_build")); + + dinfo->src->init_source = jpegmemsrcmgr_init_source; + dinfo->src->fill_input_buffer = jpegmemsrcmgr_fill_input_buffer; + dinfo->src->skip_input_data = jpegmemsrcmgr_skip_input_data; + dinfo->src->resync_to_restart = jpeg_resync_to_restart; + dinfo->src->term_source = jpegmemsrcmgr_term_source; + + dinfo->src->bytes_in_buffer = bufsize; + dinfo->src->next_input_byte = buffer; + + numbytes = bufsize; +} diff --git a/source/blender/io/avi/intern/avi_mjpeg.h b/source/blender/io/avi/intern/avi_mjpeg.h new file mode 100644 index 00000000000..b12dc03040e --- /dev/null +++ b/source/blender/io/avi/intern/avi_mjpeg.h @@ -0,0 +1,20 @@ +/* SPDX-FileCopyrightText: 2001-2002 NaN Holding BV. All rights reserved. + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +/** \file + * \ingroup avi + */ + +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +void *avi_converter_from_mjpeg(AviMovie *movie, int stream, uchar *buffer, const size_t *size); +void *avi_converter_to_mjpeg(AviMovie *movie, int stream, uchar *buffer, size_t *size); + +#ifdef __cplusplus +} +#endif diff --git a/source/blender/io/avi/intern/avi_options.cc b/source/blender/io/avi/intern/avi_options.cc new file mode 100644 index 00000000000..f4a0b481c7b --- /dev/null +++ b/source/blender/io/avi/intern/avi_options.cc @@ -0,0 +1,134 @@ +/* SPDX-FileCopyrightText: 2001-2002 NaN Holding BV. All rights reserved. + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +/** \file + * \ingroup avi + * + * This is external code. Sets some compression related options + * (width, height quality, frame-rate). + */ + +#include "AVI_avi.h" +#include "BLI_fileops.h" +#include "avi_endian.h" +#include "avi_intern.h" + +#ifdef WIN32 +# include "BLI_winstuff.h" +#endif + +/* avi_set_compress_options gets its own file... now don't WE feel important? */ + +AviError AVI_set_compress_option( + AviMovie *movie, int option_type, int stream, AviOption option, void *opt_data) +{ + int i; + int useconds; + + (void)stream; /* unused */ + + if (movie->header->TotalFrames != 0) { + /* Can't change parameters after we have already started writing frames. */ + return AVI_ERROR_OPTION; + } + + switch (option_type) { + case AVI_OPTION_TYPE_MAIN: + switch (option) { + case AVI_OPTION_WIDTH: + movie->header->Width = *((int *)opt_data); + movie->header->SuggestedBufferSize = movie->header->Width * movie->header->Height * 3; + + for (i = 0; i < movie->header->Streams; i++) { + if (avi_get_format_type(movie->streams[i].format) == FCC("vids")) { + ((AviBitmapInfoHeader *)movie->streams[i].sf)->Width = *((int *)opt_data); + movie->streams[i].sh.SuggestedBufferSize = movie->header->SuggestedBufferSize; + movie->streams[i].sh.right = *((int *)opt_data); + ((AviBitmapInfoHeader *)movie->streams[i].sf)->SizeImage = + movie->header->SuggestedBufferSize; + BLI_fseek(movie->fp, movie->offset_table[1 + i * 2 + 1], SEEK_SET); + awrite(movie, + movie->streams[i].sf, + 1, + movie->streams[i].sf_size, + movie->fp, + AVI_BITMAPH); + } + } + + break; + + case AVI_OPTION_HEIGHT: + movie->header->Height = *((int *)opt_data); + movie->header->SuggestedBufferSize = movie->header->Width * movie->header->Height * 3; + + for (i = 0; i < movie->header->Streams; i++) { + if (avi_get_format_type(movie->streams[i].format) == FCC("vids")) { + ((AviBitmapInfoHeader *)movie->streams[i].sf)->Height = *((int *)opt_data); + movie->streams[i].sh.SuggestedBufferSize = movie->header->SuggestedBufferSize; + movie->streams[i].sh.bottom = *((int *)opt_data); + ((AviBitmapInfoHeader *)movie->streams[i].sf)->SizeImage = + movie->header->SuggestedBufferSize; + BLI_fseek(movie->fp, movie->offset_table[1 + i * 2 + 1], SEEK_SET); + awrite(movie, + movie->streams[i].sf, + 1, + movie->streams[i].sf_size, + movie->fp, + AVI_BITMAPH); + } + } + + break; + + case AVI_OPTION_QUALITY: + for (i = 0; i < movie->header->Streams; i++) { + if (avi_get_format_type(movie->streams[i].format) == FCC("vids")) { + movie->streams[i].sh.Quality = *((int *)opt_data) * 100; + BLI_fseek(movie->fp, movie->offset_table[1 + i * 2 + 1], SEEK_SET); + awrite(movie, + movie->streams[i].sf, + 1, + movie->streams[i].sf_size, + movie->fp, + AVI_BITMAPH); + } + } + break; + + case AVI_OPTION_FRAMERATE: + useconds = int(1000000 / *((double *)opt_data)); + if (useconds) { + movie->header->MicroSecPerFrame = useconds; + } + + for (i = 0; i < movie->header->Streams; i++) { + if (avi_get_format_type(movie->streams[i].format) == FCC("vids")) { + movie->streams[i].sh.Scale = movie->header->MicroSecPerFrame; + BLI_fseek(movie->fp, movie->offset_table[1 + i * 2 + 1], SEEK_SET); + awrite(movie, + movie->streams[i].sf, + 1, + movie->streams[i].sf_size, + movie->fp, + AVI_BITMAPH); + } + } + break; + } + + BLI_fseek(movie->fp, movie->offset_table[0], SEEK_SET); + awrite(movie, movie->header, 1, sizeof(AviMainHeader), movie->fp, AVI_MAINH); + + break; + case AVI_OPTION_TYPE_STRH: + break; + case AVI_OPTION_TYPE_STRF: + break; + default: + return AVI_ERROR_OPTION; + } + + return AVI_ERROR_NONE; +} diff --git a/source/blender/io/avi/intern/avi_rgb.cc b/source/blender/io/avi/intern/avi_rgb.cc new file mode 100644 index 00000000000..12acb6cedf8 --- /dev/null +++ b/source/blender/io/avi/intern/avi_rgb.cc @@ -0,0 +1,142 @@ +/* SPDX-FileCopyrightText: 2001-2002 NaN Holding BV. All rights reserved. + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +/** \file + * \ingroup avi + * + * This is external code. Converts RGB-type AVI files. + */ + +#include +#include + +#include "MEM_guardedalloc.h" + +#include "AVI_avi.h" +#include "avi_rgb.h" + +#include "IMB_imbuf.hh" + +#include "BLI_utildefines.h" + +/* implementation */ + +void *avi_converter_from_avi_rgb(AviMovie *movie, int stream, uchar *buffer, const size_t *size) +{ + uchar *buf; + AviBitmapInfoHeader *bi; + short bits = 32; + + (void)size; /* unused */ + + bi = (AviBitmapInfoHeader *)movie->streams[stream].sf; + if (bi) { + bits = bi->BitCount; + } + + if (bits == 16) { + ushort *pxl; + uchar *to; +#ifdef __BIG_ENDIAN__ + uchar *pxla; +#endif + + buf = static_cast(imb_alloc_pixels( + movie->header->Height, movie->header->Width, 3, sizeof(uchar), "fromavirgbbuf")); + + if (buf) { + size_t y = movie->header->Height; + to = buf; + + while (y--) { + pxl = (ushort *)(buffer + y * movie->header->Width * 2); + +#ifdef __BIG_ENDIAN__ + pxla = (uchar *)pxl; +#endif + + size_t x = movie->header->Width; + while (x--) { +#ifdef __BIG_ENDIAN__ + int i = pxla[0]; + pxla[0] = pxla[1]; + pxla[1] = i; + + pxla += 2; +#endif + + *(to++) = ((*pxl >> 10) & 0x1f) * 8; + *(to++) = ((*pxl >> 5) & 0x1f) * 8; + *(to++) = (*pxl & 0x1f) * 8; + pxl++; + } + } + } + + MEM_freeN(buffer); + + return buf; + } + + buf = static_cast(imb_alloc_pixels( + movie->header->Height, movie->header->Width, 3, sizeof(uchar), "fromavirgbbuf")); + + if (buf) { + size_t rowstride = movie->header->Width * 3; + BLI_assert(bits != 16); + if (movie->header->Width % 2) { + rowstride++; + } + + for (size_t y = 0; y < movie->header->Height; y++) { + memcpy(&buf[y * movie->header->Width * 3], + &buffer[((movie->header->Height - 1) - y) * rowstride], + movie->header->Width * 3); + } + + for (size_t y = 0; y < size_t(movie->header->Height) * size_t(movie->header->Width) * 3; + y += 3) + { + int i = buf[y]; + buf[y] = buf[y + 2]; + buf[y + 2] = i; + } + } + + MEM_freeN(buffer); + + return buf; +} + +void *avi_converter_to_avi_rgb(AviMovie *movie, int stream, uchar *buffer, size_t *size) +{ + uchar *buf; + + (void)stream; /* unused */ + + size_t rowstride = movie->header->Width * 3; + /* AVI files has uncompressed lines 4-byte aligned */ + rowstride = (rowstride + 3) & ~3; + + *size = movie->header->Height * rowstride; + buf = static_cast(MEM_mallocN(*size, "toavirgbbuf")); + + for (size_t y = 0; y < movie->header->Height; y++) { + memcpy(&buf[y * rowstride], + &buffer[((movie->header->Height - 1) - y) * movie->header->Width * 3], + movie->header->Width * 3); + } + + for (size_t y = 0; y < movie->header->Height; y++) { + for (size_t x = 0; x < movie->header->Width * 3; x += 3) { + int i = buf[y * rowstride + x]; + buf[y * rowstride + x] = buf[y * rowstride + x + 2]; + buf[y * rowstride + x + 2] = i; + } + } + + MEM_freeN(buffer); + + return buf; +} diff --git a/source/blender/io/avi/intern/avi_rgb.h b/source/blender/io/avi/intern/avi_rgb.h new file mode 100644 index 00000000000..3edbea63262 --- /dev/null +++ b/source/blender/io/avi/intern/avi_rgb.h @@ -0,0 +1,23 @@ +/* SPDX-FileCopyrightText: 2001-2002 NaN Holding BV. All rights reserved. + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +/** \file + * \ingroup avi + */ + +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +void *avi_converter_from_avi_rgb(AviMovie *movie, + int stream, + unsigned char *buffer, + const size_t *size); +void *avi_converter_to_avi_rgb(AviMovie *movie, int stream, unsigned char *buffer, size_t *size); + +#ifdef __cplusplus +} +#endif diff --git a/source/blender/io/avi/intern/avi_rgb32.cc b/source/blender/io/avi/intern/avi_rgb32.cc new file mode 100644 index 00000000000..cb2a708e02d --- /dev/null +++ b/source/blender/io/avi/intern/avi_rgb32.cc @@ -0,0 +1,79 @@ +/* SPDX-FileCopyrightText: 2001-2002 NaN Holding BV. All rights reserved. + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +/** \file + * \ingroup avi + * + * This is external code. Converts between rgb32 and avi. + */ + +#include +#include + +#include "MEM_guardedalloc.h" + +#include "IMB_imbuf.hh" + +#include "AVI_avi.h" +#include "avi_rgb32.h" + +void *avi_converter_from_rgb32(AviMovie *movie, int stream, uchar *buffer, size_t *size) +{ + uchar *buf; + + (void)stream; /* unused */ + + *size = size_t(movie->header->Height) * size_t(movie->header->Width) * 3; + buf = static_cast(imb_alloc_pixels( + movie->header->Height, movie->header->Width, 3, sizeof(uchar), "fromrgb32buf")); + if (!buf) { + return nullptr; + } + + size_t rowstridea = movie->header->Width * 3; + size_t rowstrideb = movie->header->Width * 4; + + for (size_t y = 0; y < movie->header->Height; y++) { + for (size_t x = 0; x < movie->header->Width; x++) { + buf[y * rowstridea + x * 3 + 0] = buffer[y * rowstrideb + x * 4 + 3]; + buf[y * rowstridea + x * 3 + 1] = buffer[y * rowstrideb + x * 4 + 2]; + buf[y * rowstridea + x * 3 + 2] = buffer[y * rowstrideb + x * 4 + 1]; + } + } + + MEM_freeN(buffer); + + return buf; +} + +void *avi_converter_to_rgb32(AviMovie *movie, int stream, uchar *buffer, size_t *size) +{ + uchar *buf; + uchar *to, *from; + + (void)stream; /* unused */ + + *size = size_t(movie->header->Height) * size_t(movie->header->Width) * 4; + buf = static_cast(imb_alloc_pixels( + movie->header->Height, movie->header->Width, 4, sizeof(uchar), "torgb32buf")); + if (!buf) { + return nullptr; + } + + memset(buf, 255, *size); + + to = buf; + from = buffer; + size_t i = size_t(movie->header->Height) * size_t(movie->header->Width); + + while (i--) { + memcpy(to, from, 3); + to += 4; + from += 3; + } + + MEM_freeN(buffer); + + return buf; +} diff --git a/source/blender/io/avi/intern/avi_rgb32.h b/source/blender/io/avi/intern/avi_rgb32.h new file mode 100644 index 00000000000..6e7b158db6a --- /dev/null +++ b/source/blender/io/avi/intern/avi_rgb32.h @@ -0,0 +1,20 @@ +/* SPDX-FileCopyrightText: 2001-2002 NaN Holding BV. All rights reserved. + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +/** \file + * \ingroup avi + */ + +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +void *avi_converter_from_rgb32(AviMovie *movie, int stream, unsigned char *buffer, size_t *size); +void *avi_converter_to_rgb32(AviMovie *movie, int stream, unsigned char *buffer, size_t *size); + +#ifdef __cplusplus +} +#endif diff --git a/source/blender/io/collada/AnimationExporter.h b/source/blender/io/collada/AnimationExporter.h index 0913a96e858..d8f5bb9d1a7 100644 --- a/source/blender/io/collada/AnimationExporter.h +++ b/source/blender/io/collada/AnimationExporter.h @@ -29,9 +29,9 @@ #include "BKE_action.h" /* pose functions */ #include "BKE_armature.hh" #include "BKE_constraint.h" -#include "BKE_fcurve.hh" +#include "BKE_fcurve.h" #include "BKE_object.hh" -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "ED_object.hh" #include "MEM_guardedalloc.h" diff --git a/source/blender/io/collada/AnimationImporter.cpp b/source/blender/io/collada/AnimationImporter.cpp index bef2e62ce5e..ce4db271f64 100644 --- a/source/blender/io/collada/AnimationImporter.cpp +++ b/source/blender/io/collada/AnimationImporter.cpp @@ -23,11 +23,11 @@ #include "BLI_string.h" #include "BLI_string_utils.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_action.h" #include "BKE_armature.hh" -#include "BKE_fcurve.hh" +#include "BKE_fcurve.h" #include "BKE_object.hh" #include "MEM_guardedalloc.h" @@ -339,8 +339,8 @@ void AnimationImporter::read_node_transform(COLLADAFW::Node *node, Object *ob) float mat[4][4]; TransformReader::get_node_mat(mat, node, &uid_animated_map, ob); if (ob) { - copy_m4_m4(ob->runtime->object_to_world.ptr(), mat); - BKE_object_apply_mat4(ob, ob->object_to_world().ptr(), false, false); + copy_m4_m4(ob->object_to_world, mat); + BKE_object_apply_mat4(ob, ob->object_to_world, false, false); } } @@ -2107,7 +2107,7 @@ Object *AnimationImporter::get_joint_object(COLLADAFW::Node *root, if (par_job) { float temp[4][4], ipar[4][4]; - invert_m4_m4(ipar, par_job->object_to_world().ptr()); + invert_m4_m4(ipar, par_job->object_to_world); copy_m4_m4(temp, mat); mul_m4_m4m4(mat, ipar, temp); } diff --git a/source/blender/io/collada/ArmatureExporter.cpp b/source/blender/io/collada/ArmatureExporter.cpp index 7c632c3c65a..815f34bb55b 100644 --- a/source/blender/io/collada/ArmatureExporter.cpp +++ b/source/blender/io/collada/ArmatureExporter.cpp @@ -16,7 +16,7 @@ #include "BKE_action.h" #include "BKE_armature.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_mesh.hh" #include "ED_armature.hh" diff --git a/source/blender/io/collada/ArmatureImporter.cpp b/source/blender/io/collada/ArmatureImporter.cpp index 7337b0a973e..0ba34f6af8a 100644 --- a/source/blender/io/collada/ArmatureImporter.cpp +++ b/source/blender/io/collada/ArmatureImporter.cpp @@ -119,7 +119,7 @@ int ArmatureImporter::create_bone(SkinInfo *skin, Object *ob_arm = skin->BKE_armature_from_object(); if (ob_arm) { float invmat[4][4]; - invert_m4_m4(invmat, ob_arm->object_to_world().ptr()); + invert_m4_m4(invmat, ob_arm->object_to_world); mul_m4_m4m4(mat, invmat, mat); } @@ -721,7 +721,7 @@ void ArmatureImporter::set_pose(Object *ob_arm, copy_m4_m4(mat, obmat); float invObmat[4][4]; - invert_m4_m4(invObmat, ob_arm->object_to_world().ptr()); + invert_m4_m4(invObmat, ob_arm->object_to_world); mul_m4_m4m4(pchan->pose_mat, invObmat, mat); } diff --git a/source/blender/io/collada/BCAnimationCurve.h b/source/blender/io/collada/BCAnimationCurve.h index 5dd008ec7af..3300b0c0359 100644 --- a/source/blender/io/collada/BCAnimationCurve.h +++ b/source/blender/io/collada/BCAnimationCurve.h @@ -10,7 +10,7 @@ #include "MEM_guardedalloc.h" #include "BKE_armature.hh" -#include "BKE_fcurve.hh" +#include "BKE_fcurve.h" #include "BKE_material.h" #include "ED_anim_api.hh" diff --git a/source/blender/io/collada/BlenderContext.cpp b/source/blender/io/collada/BlenderContext.cpp index 2dc4e716cca..1b985a0b774 100644 --- a/source/blender/io/collada/BlenderContext.cpp +++ b/source/blender/io/collada/BlenderContext.cpp @@ -12,7 +12,7 @@ #include "ExportSettings.h" #include "BKE_layer.hh" -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "BLI_listbase.h" diff --git a/source/blender/io/collada/ControllerExporter.cpp b/source/blender/io/collada/ControllerExporter.cpp index 8e7b5b4c05e..757e1958c45 100644 --- a/source/blender/io/collada/ControllerExporter.cpp +++ b/source/blender/io/collada/ControllerExporter.cpp @@ -18,7 +18,7 @@ #include "BKE_action.h" #include "BKE_armature.hh" #include "BKE_deform.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_idprop.h" #include "BKE_lib_id.hh" #include "BKE_mesh.hh" @@ -408,7 +408,7 @@ void ControllerExporter::add_bind_shape_mat(Object *ob) bc_add_global_transform(f_obmat, export_settings.get_global_transform()); } - // UnitConverter::mat4_to_dae_double(bind_mat, ob->object_to_world().ptr()); + // UnitConverter::mat4_to_dae_double(bind_mat, ob->object_to_world); UnitConverter::mat4_to_dae_double(bind_mat, f_obmat); if (this->export_settings.get_limit_precision()) { BCMatrix::sanitize(bind_mat, LIMITTED_PRECISION); @@ -524,7 +524,7 @@ std::string ControllerExporter::add_inv_bind_mats_source(Object *ob_arm, } /* make world-space matrix (bind_mat is armature-space) */ - mul_m4_m4m4(world, ob_arm->object_to_world().ptr(), bind_mat); + mul_m4_m4m4(world, ob_arm->object_to_world, bind_mat); if (!has_bindmat) { if (export_settings.get_apply_global_orientation()) { diff --git a/source/blender/io/collada/DocumentExporter.cpp b/source/blender/io/collada/DocumentExporter.cpp index 23110d0dbde..68f05180da3 100644 --- a/source/blender/io/collada/DocumentExporter.cpp +++ b/source/blender/io/collada/DocumentExporter.cpp @@ -72,13 +72,13 @@ #include "BKE_armature.hh" #include "BKE_blender_version.h" #include "BKE_customdata.hh" -#include "BKE_fcurve.hh" -#include "BKE_global.hh" +#include "BKE_fcurve.h" +#include "BKE_global.h" #include "BKE_image.h" #include "BKE_main.hh" #include "BKE_material.h" #include "BKE_object.hh" -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "ED_keyframing.hh" #ifdef WITH_BUILDINFO diff --git a/source/blender/io/collada/DocumentImporter.cpp b/source/blender/io/collada/DocumentImporter.cpp index a3fd127ed78..b292190c25b 100644 --- a/source/blender/io/collada/DocumentImporter.cpp +++ b/source/blender/io/collada/DocumentImporter.cpp @@ -40,15 +40,15 @@ #include "BLI_utildefines.h" #include "BKE_camera.h" -#include "BKE_collection.hh" -#include "BKE_fcurve.hh" -#include "BKE_global.hh" +#include "BKE_collection.h" +#include "BKE_fcurve.h" +#include "BKE_global.h" #include "BKE_image.h" #include "BKE_layer.hh" #include "BKE_lib_id.hh" #include "BKE_light.h" #include "BKE_material.h" -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "BLI_path_util.h" @@ -256,7 +256,7 @@ void DocumentImporter::finish() delete objects_to_scale; /* update scene */ - DEG_id_tag_update(&sce->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&sce->id, ID_RECALC_COPY_ON_WRITE); DEG_relations_tag_update(bmain); WM_event_add_notifier(mContext, NC_OBJECT | ND_TRANSFORM, nullptr); } @@ -412,8 +412,8 @@ Object *DocumentImporter::create_instance_node(Object *source_ob, } } /* calc new matrix and apply */ - mul_m4_m4m4(obn->runtime->object_to_world.ptr(), obn->object_to_world().ptr(), mat); - BKE_object_apply_mat4(obn, obn->object_to_world().ptr(), false, false); + mul_m4_m4m4(obn->object_to_world, obn->object_to_world, mat); + BKE_object_apply_mat4(obn, obn->object_to_world, false, false); } } else { diff --git a/source/blender/io/collada/EffectExporter.cpp b/source/blender/io/collada/EffectExporter.cpp index 356f77be6df..728b68445f9 100644 --- a/source/blender/io/collada/EffectExporter.cpp +++ b/source/blender/io/collada/EffectExporter.cpp @@ -22,7 +22,7 @@ #include "DNA_mesh_types.h" #include "DNA_world_types.h" -#include "BKE_collection.hh" +#include "BKE_collection.h" #include "BKE_customdata.hh" #include "BKE_material.h" #include "BKE_mesh.hh" diff --git a/source/blender/io/collada/GeometryExporter.cpp b/source/blender/io/collada/GeometryExporter.cpp index 89c1fdad4e5..c92d01e2b81 100644 --- a/source/blender/io/collada/GeometryExporter.cpp +++ b/source/blender/io/collada/GeometryExporter.cpp @@ -22,7 +22,7 @@ #include "BKE_attribute.hh" #include "BKE_customdata.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_lib_id.hh" #include "BKE_material.h" #include "BKE_mesh.hh" diff --git a/source/blender/io/collada/ImageExporter.cpp b/source/blender/io/collada/ImageExporter.cpp index 4508f21d73a..2f5c80ec174 100644 --- a/source/blender/io/collada/ImageExporter.cpp +++ b/source/blender/io/collada/ImageExporter.cpp @@ -13,7 +13,7 @@ #include "DNA_texture_types.h" #include "BKE_customdata.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_image.h" #include "BKE_image_format.h" #include "BKE_main.hh" diff --git a/source/blender/io/collada/Materials.h b/source/blender/io/collada/Materials.h index 5667fdcbd03..09b4f4a9bd2 100644 --- a/source/blender/io/collada/Materials.h +++ b/source/blender/io/collada/Materials.h @@ -8,7 +8,7 @@ #include #include "BKE_context.hh" -#include "BKE_node.hh" +#include "BKE_node.h" #include "BLI_listbase.h" #include "DNA_material_types.h" #include "DNA_node_types.h" diff --git a/source/blender/io/collada/MeshImporter.cpp b/source/blender/io/collada/MeshImporter.cpp index 3991a3825a5..2db33f3e9de 100644 --- a/source/blender/io/collada/MeshImporter.cpp +++ b/source/blender/io/collada/MeshImporter.cpp @@ -21,7 +21,7 @@ #include "BKE_attribute.hh" #include "BKE_customdata.hh" #include "BKE_displist.h" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_lib_id.hh" #include "BKE_material.h" #include "BKE_mesh.hh" @@ -476,7 +476,7 @@ void MeshImporter::allocate_poly_data(COLLADAFW::Mesh *collada_mesh, Mesh *mesh) COLLADAFW::String &uvname = info->mName; /* Allocate space for UV_data */ CustomData_add_layer_named( - &mesh->corner_data, CD_PROP_FLOAT2, CD_SET_DEFAULT, mesh->corners_num, uvname); + &mesh->corner_data, CD_PROP_FLOAT2, CD_SET_DEFAULT, mesh->corners_num, uvname.c_str()); } /* activate the first uv map */ CustomData_set_layer_active(&mesh->corner_data, CD_PROP_FLOAT2, 0); @@ -488,8 +488,11 @@ void MeshImporter::allocate_poly_data(COLLADAFW::Mesh *collada_mesh, Mesh *mesh) COLLADAFW::MeshVertexData::InputInfos *info = collada_mesh->getColors().getInputInfosArray()[i]; COLLADAFW::String colname = extract_vcolname(info->mName); - CustomData_add_layer_named( - &mesh->corner_data, CD_PROP_BYTE_COLOR, CD_SET_DEFAULT, mesh->corners_num, colname); + CustomData_add_layer_named(&mesh->corner_data, + CD_PROP_BYTE_COLOR, + CD_SET_DEFAULT, + mesh->corners_num, + colname.c_str()); } BKE_id_attributes_active_color_set( &mesh->id, CustomData_get_layer_name(&mesh->corner_data, CD_PROP_BYTE_COLOR, 0)); @@ -723,8 +726,10 @@ void MeshImporter::read_polys(COLLADAFW::Mesh *collada_mesh, { COLLADAFW::IndexList &index_list = *index_list_array_uvcoord[uvset_index]; blender::float2 *mloopuv = static_cast( - CustomData_get_layer_named_for_write( - &mesh->corner_data, CD_PROP_FLOAT2, index_list.getName(), mesh->corners_num)); + CustomData_get_layer_named_for_write(&mesh->corner_data, + CD_PROP_FLOAT2, + index_list.getName().c_str(), + mesh->corners_num)); if (mloopuv == nullptr) { fprintf(stderr, "Collada import: Mesh [%s] : Unknown reference to TEXCOORD [#%s].\n", @@ -765,7 +770,7 @@ void MeshImporter::read_polys(COLLADAFW::Mesh *collada_mesh, COLLADAFW::IndexList &color_index_list = *mp->getColorIndices(vcolor_index); COLLADAFW::String colname = extract_vcolname(color_index_list.getName()); MLoopCol *mloopcol = (MLoopCol *)CustomData_get_layer_named_for_write( - &mesh->corner_data, CD_PROP_BYTE_COLOR, colname, mesh->corners_num); + &mesh->corner_data, CD_PROP_BYTE_COLOR, colname.c_str(), mesh->corners_num); if (mloopcol == nullptr) { fprintf(stderr, "Collada import: Mesh [%s] : Unknown reference to VCOLOR [#%s].\n", diff --git a/source/blender/io/collada/SceneExporter.cpp b/source/blender/io/collada/SceneExporter.cpp index 82451d38cf3..ee126e680c4 100644 --- a/source/blender/io/collada/SceneExporter.cpp +++ b/source/blender/io/collada/SceneExporter.cpp @@ -6,7 +6,7 @@ * \ingroup collada */ -#include "BKE_collection.hh" +#include "BKE_collection.h" #include "BKE_lib_id.hh" #include "BKE_object.hh" #include "BLI_listbase.h" diff --git a/source/blender/io/collada/SceneExporter.h b/source/blender/io/collada/SceneExporter.h index b194ebf6fb8..74ebdc48c90 100644 --- a/source/blender/io/collada/SceneExporter.h +++ b/source/blender/io/collada/SceneExporter.h @@ -28,7 +28,7 @@ #include "DNA_userdef_types.h" #include "BKE_constraint.h" -#include "BKE_fcurve.hh" +#include "BKE_fcurve.h" #include "BLI_fileops.h" #include "BLI_path_util.h" #include "ED_keyframing.hh" diff --git a/source/blender/io/collada/SkinInfo.cpp b/source/blender/io/collada/SkinInfo.cpp index b4c1ae5e1a2..a884bfe2fb1 100644 --- a/source/blender/io/collada/SkinInfo.cpp +++ b/source/blender/io/collada/SkinInfo.cpp @@ -209,17 +209,17 @@ void SkinInfo::link_armature(bContext *C, bc_set_parent(ob, ob_arm, C); } #else - Depsgraph *depsgraph = CTX_data_ensure_evaluated_depsgraph(C); - + Object workob; ob->parent = ob_arm; ob->partype = PAROBJECT; - invert_m4_m4(ob->parentinv, BKE_object_calc_parent(depsgraph, scene, ob).ptr()); + BKE_object_workob_calc_parent(scene, ob, &workob); + invert_m4_m4(ob->parentinv, workob.object_to_world); DEG_id_tag_update(&obn->id, ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY); #endif - copy_m4_m4(ob->runtime->object_to_world.ptr(), bind_shape_matrix); - BKE_object_apply_mat4(ob, ob->object_to_world().ptr(), false, false); + copy_m4_m4(ob->object_to_world, bind_shape_matrix); + BKE_object_apply_mat4(ob, ob->object_to_world, false, false); amd->deformflag = ARM_DEF_VGROUP; diff --git a/source/blender/io/collada/collada.cpp b/source/blender/io/collada/collada.cpp index 7dafa12f4de..045e6214ed9 100644 --- a/source/blender/io/collada/collada.cpp +++ b/source/blender/io/collada/collada.cpp @@ -16,7 +16,7 @@ #include "collada.h" #include "BKE_context.hh" -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "DEG_depsgraph.hh" #include "DEG_depsgraph_query.hh" diff --git a/source/blender/io/collada/collada_utils.cpp b/source/blender/io/collada/collada_utils.cpp index 95c42990830..cf162ca6c7f 100644 --- a/source/blender/io/collada/collada_utils.cpp +++ b/source/blender/io/collada/collada_utils.cpp @@ -37,7 +37,7 @@ #include "BKE_constraint.h" #include "BKE_context.hh" #include "BKE_customdata.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_key.hh" #include "BKE_layer.hh" #include "BKE_lib_id.hh" @@ -47,7 +47,7 @@ #include "BKE_mesh_runtime.hh" #include "BKE_node.hh" #include "BKE_object.hh" -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "ANIM_bone_collections.hh" @@ -135,9 +135,7 @@ bool bc_set_parent(Object *ob, Object *par, bContext *C, bool is_parent_space) const bool keep_transform = false; if (par && is_parent_space) { - mul_m4_m4m4(ob->runtime->object_to_world.ptr(), - par->object_to_world().ptr(), - ob->object_to_world().ptr()); + mul_m4_m4m4(ob->object_to_world, par->object_to_world, ob->object_to_world); } bool ok = ED_object_parent_set( @@ -393,12 +391,10 @@ std::string bc_replace_string(std::string data, void bc_match_scale(Object *ob, UnitConverter &bc_unit, bool scale_to_scene) { if (scale_to_scene) { - mul_m4_m4m4( - ob->runtime->object_to_world.ptr(), bc_unit.get_scale(), ob->object_to_world().ptr()); + mul_m4_m4m4(ob->object_to_world, bc_unit.get_scale(), ob->object_to_world); } - mul_m4_m4m4( - ob->runtime->object_to_world.ptr(), bc_unit.get_rotation(), ob->object_to_world().ptr()); - BKE_object_apply_mat4(ob, ob->object_to_world().ptr(), false, false); + mul_m4_m4m4(ob->object_to_world, bc_unit.get_rotation(), ob->object_to_world); + BKE_object_apply_mat4(ob, ob->object_to_world, false, false); } void bc_match_scale(std::vector *objects_done, diff --git a/source/blender/io/collada/collada_utils.h b/source/blender/io/collada/collada_utils.h index 61932daf827..714ca17cc76 100644 --- a/source/blender/io/collada/collada_utils.h +++ b/source/blender/io/collada/collada_utils.h @@ -40,9 +40,9 @@ #include "BKE_context.hh" #include "BKE_idprop.h" #include "BKE_main.hh" -#include "BKE_node.hh" +#include "BKE_node.h" #include "BKE_object.hh" -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "DEG_depsgraph_query.hh" @@ -95,7 +95,7 @@ inline bAction *bc_getSceneCameraAction(Object *ob) return NULL; } - const Camera *camera = (const Camera *)ob->data; + Camera *camera = (Camera *)ob->data; return (camera->adt && camera->adt->action) ? camera->adt->action : NULL; } diff --git a/source/blender/io/common/IO_dupli_persistent_id.hh b/source/blender/io/common/IO_dupli_persistent_id.hh index 5da10b364eb..cf57f6498be 100644 --- a/source/blender/io/common/IO_dupli_persistent_id.hh +++ b/source/blender/io/common/IO_dupli_persistent_id.hh @@ -3,7 +3,7 @@ * SPDX-License-Identifier: GPL-2.0-or-later */ #pragma once -#include "BKE_duplilist.hh" +#include "BKE_duplilist.h" #include "DNA_object_types.h" /* For MAX_DUPLI_RECUR */ diff --git a/source/blender/io/common/intern/abstract_hierarchy_iterator.cc b/source/blender/io/common/intern/abstract_hierarchy_iterator.cc index fa8a2e92430..09ccf47f58f 100644 --- a/source/blender/io/common/intern/abstract_hierarchy_iterator.cc +++ b/source/blender/io/common/intern/abstract_hierarchy_iterator.cc @@ -10,8 +10,8 @@ #include #include -#include "BKE_anim_data.hh" -#include "BKE_duplilist.hh" +#include "BKE_anim_data.h" +#include "BKE_duplilist.h" #include "BKE_key.hh" #include "BKE_object.hh" #include "BKE_particle.h" @@ -413,7 +413,7 @@ void AbstractHierarchyIterator::visit_object(Object *object, context->original_export_path = ""; context->higher_up_export_path = ""; - copy_m4_m4(context->matrix_world, object->object_to_world().ptr()); + copy_m4_m4(context->matrix_world, object->object_to_world); ExportGraph::key_type graph_index = determine_graph_index_object(context); context_update_for_graph_index(context, graph_index); diff --git a/source/blender/io/common/intern/abstract_hierarchy_iterator_test.cc b/source/blender/io/common/intern/abstract_hierarchy_iterator_test.cc index 6b7d174a14a..8637b200f83 100644 --- a/source/blender/io/common/intern/abstract_hierarchy_iterator_test.cc +++ b/source/blender/io/common/intern/abstract_hierarchy_iterator_test.cc @@ -5,9 +5,9 @@ #include "tests/blendfile_loading_base_test.h" -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "BLI_path_util.h" -#include "BLO_readfile.hh" +#include "BLO_readfile.h" #include "DEG_depsgraph.hh" #include "DEG_depsgraph_build.hh" #include "DNA_object_types.h" diff --git a/source/blender/io/common/intern/dupli_parent_finder.hh b/source/blender/io/common/intern/dupli_parent_finder.hh index a94b3949b69..62737d0bfd1 100644 --- a/source/blender/io/common/intern/dupli_parent_finder.hh +++ b/source/blender/io/common/intern/dupli_parent_finder.hh @@ -5,7 +5,7 @@ #include "IO_dupli_persistent_id.hh" -#include "BKE_duplilist.hh" +#include "BKE_duplilist.h" #include #include diff --git a/source/blender/io/common/intern/object_identifier.cc b/source/blender/io/common/intern/object_identifier.cc index cb8275a8bcb..3855c0b2cb8 100644 --- a/source/blender/io/common/intern/object_identifier.cc +++ b/source/blender/io/common/intern/object_identifier.cc @@ -3,7 +3,13 @@ * SPDX-License-Identifier: GPL-2.0-or-later */ #include "IO_abstract_hierarchy_iterator.h" -#include "BKE_duplilist.hh" +#include "BKE_duplilist.h" + +extern "C" { +#include /* For INT_MAX. */ +} +#include +#include namespace blender::io { diff --git a/source/blender/io/gpencil/intern/gpencil_io_base.cc b/source/blender/io/gpencil/intern/gpencil_io_base.cc index d487c9045ef..db98b46a902 100644 --- a/source/blender/io/gpencil/intern/gpencil_io_base.cc +++ b/source/blender/io/gpencil/intern/gpencil_io_base.cc @@ -24,7 +24,7 @@ #include "BKE_layer.hh" #include "BKE_main.hh" #include "BKE_material.h" -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "UI_view2d.hh" @@ -79,7 +79,7 @@ void GpencilIO::prepare_camera_params(Scene *scene, const GpencilIOParams *ipara BKE_camera_params_compute_viewplane(¶ms, rd->xsch, rd->ysch, rd->xasp, rd->yasp); BKE_camera_params_compute_matrix(¶ms); - float4x4 viewmat = math::invert(cam_ob->object_to_world()); + float4x4 viewmat = math::invert(float4x4(cam_ob->object_to_world)); persmat_ = float4x4(params.winmat) * viewmat; } @@ -149,7 +149,7 @@ void GpencilIO::create_object_list() continue; } - float3 object_position = float3(object->object_to_world().location()); + float3 object_position = float3(object->object_to_world[3]); /* Save z-depth from view to sort from back to front. */ if (is_camera_) { diff --git a/source/blender/io/gpencil/intern/gpencil_io_capi.cc b/source/blender/io/gpencil/intern/gpencil_io_capi.cc index 2622bcfdf17..fe73a5ba165 100644 --- a/source/blender/io/gpencil/intern/gpencil_io_capi.cc +++ b/source/blender/io/gpencil/intern/gpencil_io_capi.cc @@ -17,7 +17,7 @@ #include "BKE_context.hh" #include "BKE_gpencil_legacy.h" #include "BKE_main.hh" -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "DEG_depsgraph.hh" #include "DEG_depsgraph_query.hh" diff --git a/source/blender/io/gpencil/intern/gpencil_io_export_pdf.cc b/source/blender/io/gpencil/intern/gpencil_io_export_pdf.cc index 9dbce4e7664..93c28885af7 100644 --- a/source/blender/io/gpencil/intern/gpencil_io_export_pdf.cc +++ b/source/blender/io/gpencil/intern/gpencil_io_export_pdf.cc @@ -186,7 +186,7 @@ void GpencilExporterPDF::export_gpencil_layers() /* Apply layer thickness change. */ gps_duplicate->thickness += gpl->line_change; /* Apply object scale to thickness. */ - const float scalef = mat4_to_scale(ob->object_to_world().ptr()); + const float scalef = mat4_to_scale(ob->object_to_world); gps_duplicate->thickness = ceilf(float(gps_duplicate->thickness) * scalef); CLAMP_MIN(gps_duplicate->thickness, 1.0f); /* Fill. */ diff --git a/source/blender/io/gpencil/intern/gpencil_io_export_svg.cc b/source/blender/io/gpencil/intern/gpencil_io_export_svg.cc index 6f7e41cdb3d..6ecb1c40167 100644 --- a/source/blender/io/gpencil/intern/gpencil_io_export_svg.cc +++ b/source/blender/io/gpencil/intern/gpencil_io_export_svg.cc @@ -202,7 +202,7 @@ void GpencilExporterSVG::export_gpencil_layers() /* Apply layer thickness change. */ gps_duplicate->thickness += gpl->line_change; /* Apply object scale to thickness. */ - const float scalef = mat4_to_scale(ob->object_to_world().ptr()); + const float scalef = mat4_to_scale(ob->object_to_world); gps_duplicate->thickness = ceilf(float(gps_duplicate->thickness) * scalef); CLAMP_MIN(gps_duplicate->thickness, 1.0f); diff --git a/source/blender/io/ply/IO_ply.hh b/source/blender/io/ply/IO_ply.hh index f4c952fa94e..5ed4225823a 100644 --- a/source/blender/io/ply/IO_ply.hh +++ b/source/blender/io/ply/IO_ply.hh @@ -8,11 +8,11 @@ #pragma once -#include "BLI_path_util.h" -#include "IO_orientation.hh" +#include "BKE_context.hh" -struct bContext; -struct ReportList; +#include "BLI_path_util.h" +#include "DNA_windowmanager_types.h" +#include "IO_orientation.hh" enum ePLYVertexColorMode { PLY_VERTEX_COLOR_NONE = 0, diff --git a/source/blender/io/ply/exporter/ply_export.cc b/source/blender/io/ply/exporter/ply_export.cc index 88461c4a25e..2a085cb26f1 100644 --- a/source/blender/io/ply/exporter/ply_export.cc +++ b/source/blender/io/ply/exporter/ply_export.cc @@ -8,9 +8,14 @@ #include -#include "BKE_context.hh" -#include "BKE_report.hh" +#include "BKE_layer.hh" +#include "BKE_report.h" +#include "DNA_collection_types.h" +#include "DNA_scene_types.h" + +#include "BKE_context.hh" +#include "BLI_memory_utils.hh" #include "IO_ply.hh" #include "ply_data.hh" diff --git a/source/blender/io/ply/exporter/ply_export_load_plydata.cc b/source/blender/io/ply/exporter/ply_export_load_plydata.cc index ec4c7c0fa02..fee0d99d35d 100644 --- a/source/blender/io/ply/exporter/ply_export_load_plydata.cc +++ b/source/blender/io/ply/exporter/ply_export_load_plydata.cc @@ -14,21 +14,19 @@ #include "BKE_lib_id.hh" #include "BKE_mesh.hh" #include "BKE_object.hh" -#include "BLI_color.hh" #include "BLI_hash.hh" +#include "BLI_math_color.hh" #include "BLI_math_matrix.h" -#include "BLI_math_quaternion_types.hh" +#include "BLI_math_quaternion.hh" #include "BLI_math_rotation.h" #include "BLI_math_vector.h" #include "BLI_vector.hh" - #include "DEG_depsgraph_query.hh" - -#include "DNA_customdata_types.h" #include "DNA_layer_types.h" #include "bmesh.hh" -#include "tools/bmesh_triangulate.hh" +#include "bmesh_tools.hh" +#include namespace blender::io::ply { @@ -57,10 +55,10 @@ static void set_world_axes_transform(const Object &object, unit_m3(axes_transform); /* +Y-forward and +Z-up are the default Blender axis settings. */ mat3_from_axis_conversion(forward, up, IO_AXIS_Y, IO_AXIS_Z, axes_transform); - mul_m4_m3m4(r_world_and_axes_transform, axes_transform, object.object_to_world().ptr()); + mul_m4_m3m4(r_world_and_axes_transform, axes_transform, object.object_to_world); /* mul_m4_m3m4 does not transform last row of obmat, i.e. location data. */ - mul_v3_m3v3(r_world_and_axes_transform[3], axes_transform, object.object_to_world().location()); - r_world_and_axes_transform[3][3] = object.object_to_world()[3][3]; + mul_v3_m3v3(r_world_and_axes_transform[3], axes_transform, object.object_to_world[3]); + r_world_and_axes_transform[3][3] = object.object_to_world[3][3]; /* Normals need inverse transpose of the regular matrix to handle non-uniform scale. */ float normal_matrix[3][3]; @@ -169,7 +167,7 @@ static float *find_or_add_attribute(const StringRef name, } static void load_custom_attributes(const Mesh *mesh, - const Span ply_to_vertex, + const Vector &ply_to_vertex, uint32_t vertex_offset, Vector &r_attributes) { diff --git a/source/blender/io/ply/exporter/ply_file_buffer.cc b/source/blender/io/ply/exporter/ply_file_buffer.cc index 6a8500830d9..3889f8a84cb 100644 --- a/source/blender/io/ply/exporter/ply_file_buffer.cc +++ b/source/blender/io/ply/exporter/ply_file_buffer.cc @@ -8,10 +8,7 @@ #include "ply_file_buffer.hh" -#include "BLI_fileops.hh" - #include -#include namespace blender::io::ply { diff --git a/source/blender/io/ply/exporter/ply_file_buffer.hh b/source/blender/io/ply/exporter/ply_file_buffer.hh index 3f48a5095b8..b1fc954bade 100644 --- a/source/blender/io/ply/exporter/ply_file_buffer.hh +++ b/source/blender/io/ply/exporter/ply_file_buffer.hh @@ -10,6 +10,8 @@ #include +#include "BLI_compiler_attrs.h" +#include "BLI_fileops.h" #include "BLI_string_ref.hh" #include "BLI_utility_mixins.hh" #include "BLI_vector.hh" diff --git a/source/blender/io/ply/importer/ply_import.cc b/source/blender/io/ply/importer/ply_import.cc index fd399aa2251..b254eee1d2d 100644 --- a/source/blender/io/ply/importer/ply_import.cc +++ b/source/blender/io/ply/importer/ply_import.cc @@ -8,9 +8,10 @@ #include "BKE_context.hh" #include "BKE_layer.hh" +#include "BKE_lib_id.hh" #include "BKE_mesh.hh" #include "BKE_object.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "DNA_collection_types.h" #include "DNA_object_types.h" @@ -19,7 +20,7 @@ #include "BLI_math_matrix.h" #include "BLI_math_rotation.h" #include "BLI_math_vector.h" -#include "BLI_span.hh" +#include "BLI_memory_utils.hh" #include "BLI_string.h" #include "DEG_depsgraph.hh" @@ -240,7 +241,7 @@ void importer_main(Main *bmain, rescale_m4(obmat4x4, scale_vec); BKE_object_apply_mat4(obj, obmat4x4, true, false); - DEG_id_tag_update(&lc->collection->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&lc->collection->id, ID_RECALC_COPY_ON_WRITE); int flags = ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY | ID_RECALC_ANIMATION | ID_RECALC_BASE_FLAGS; DEG_id_tag_update_ex(bmain, &obj->id, flags); diff --git a/source/blender/io/ply/importer/ply_import.hh b/source/blender/io/ply/importer/ply_import.hh index 60b32ed93f4..c7e01926170 100644 --- a/source/blender/io/ply/importer/ply_import.hh +++ b/source/blender/io/ply/importer/ply_import.hh @@ -11,11 +11,6 @@ #include "IO_ply.hh" #include "ply_data.hh" -struct bContext; -struct Main; -struct Scene; -struct ViewLayer; - namespace blender::io::ply { class PlyReadBuffer; diff --git a/source/blender/io/ply/importer/ply_import_buffer.cc b/source/blender/io/ply/importer/ply_import_buffer.cc index 45ca35d9094..4e96b7dd04b 100644 --- a/source/blender/io/ply/importer/ply_import_buffer.cc +++ b/source/blender/io/ply/importer/ply_import_buffer.cc @@ -6,7 +6,6 @@ #include "BLI_fileops.h" -#include #include #include diff --git a/source/blender/io/ply/importer/ply_import_buffer.hh b/source/blender/io/ply/importer/ply_import_buffer.hh index 24d4a6feb3b..760276fcd94 100644 --- a/source/blender/io/ply/importer/ply_import_buffer.hh +++ b/source/blender/io/ply/importer/ply_import_buffer.hh @@ -8,7 +8,8 @@ #pragma once -#include +#include +#include #include "BLI_array.hh" #include "BLI_span.hh" diff --git a/source/blender/io/ply/importer/ply_import_data.cc b/source/blender/io/ply/importer/ply_import_data.cc index 4b364e8e599..9b7a0ff54a5 100644 --- a/source/blender/io/ply/importer/ply_import_data.cc +++ b/source/blender/io/ply/importer/ply_import_data.cc @@ -15,6 +15,7 @@ #include "fast_float.h" +#include #include static bool is_whitespace(char c) diff --git a/source/blender/io/ply/importer/ply_import_mesh.cc b/source/blender/io/ply/importer/ply_import_mesh.cc index e63f8a208b6..77f8ab542f7 100644 --- a/source/blender/io/ply/importer/ply_import_mesh.cc +++ b/source/blender/io/ply/importer/ply_import_mesh.cc @@ -7,15 +7,15 @@ */ #include "BKE_attribute.hh" +#include "BKE_customdata.hh" #include "BKE_lib_id.hh" #include "BKE_mesh.hh" #include "BKE_mesh_runtime.hh" #include "GEO_mesh_merge_by_distance.hh" -#include "BLI_color.hh" +#include "BLI_math_color.hh" #include "BLI_math_vector.h" -#include "BLI_span.hh" #include "ply_import_mesh.hh" diff --git a/source/blender/io/ply/importer/ply_import_mesh.hh b/source/blender/io/ply/importer/ply_import_mesh.hh index c50f0a79214..fc75040f595 100644 --- a/source/blender/io/ply/importer/ply_import_mesh.hh +++ b/source/blender/io/ply/importer/ply_import_mesh.hh @@ -11,8 +11,6 @@ #include "IO_ply.hh" #include "ply_data.hh" -struct Mesh; - namespace blender::io::ply { /** diff --git a/source/blender/io/ply/intern/ply_data.hh b/source/blender/io/ply/intern/ply_data.hh index 83fe9f47479..7555f9bc0d6 100644 --- a/source/blender/io/ply/intern/ply_data.hh +++ b/source/blender/io/ply/intern/ply_data.hh @@ -8,9 +8,6 @@ #pragma once -#include -#include - #include "BLI_math_vector_types.hh" #include "BLI_string_ref.hh" #include "BLI_vector.hh" diff --git a/source/blender/io/ply/tests/io_ply_exporter_test.cc b/source/blender/io/ply/tests/io_ply_exporter_test.cc index 61a6a66ac8b..973ab9d354e 100644 --- a/source/blender/io/ply/tests/io_ply_exporter_test.cc +++ b/source/blender/io/ply/tests/io_ply_exporter_test.cc @@ -5,7 +5,6 @@ #include "testing/testing.h" #include "tests/blendfile_loading_base_test.h" -#include "BLI_fileops.h" #include "BLI_string.h" #include "BKE_appdir.hh" @@ -43,7 +42,7 @@ class PLYExportTest : public BlendfileLoadingBaseTest { { BlendfileLoadingBaseTest::SetUp(); - BKE_tempdir_init(nullptr); + BKE_tempdir_init(""); } void TearDown() override diff --git a/source/blender/io/stl/IO_stl.hh b/source/blender/io/stl/IO_stl.hh index c0b741080a3..2542a465a89 100644 --- a/source/blender/io/stl/IO_stl.hh +++ b/source/blender/io/stl/IO_stl.hh @@ -8,12 +8,10 @@ #pragma once +#include "BKE_context.hh" #include "BLI_path_util.h" #include "IO_orientation.hh" -struct bContext; -struct ReportList; - struct STLImportParams { /** Full path to the source STL file to import. */ char filepath[FILE_MAX]; diff --git a/source/blender/io/stl/exporter/stl_export.cc b/source/blender/io/stl/exporter/stl_export.cc index 56c2f91cc7b..1fba3c3b4ac 100644 --- a/source/blender/io/stl/exporter/stl_export.cc +++ b/source/blender/io/stl/exporter/stl_export.cc @@ -11,18 +11,19 @@ #include #include "BKE_context.hh" +#include "BKE_mesh.hh" #include "BKE_object.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "BLI_string.h" #include "DEG_depsgraph_query.hh" -#include "DNA_mesh_types.h" #include "DNA_scene_types.h" #include "BLI_math_matrix.h" #include "BLI_math_rotation.h" +#include "BLI_math_vector.h" #include "BLI_math_vector.hh" #include "BLI_math_vector_types.hh" @@ -104,10 +105,10 @@ void export_frame(Depsgraph *depsgraph, /* +Y-forward and +Z-up are the default Blender axis settings. */ mat3_from_axis_conversion( export_params.forward_axis, export_params.up_axis, IO_AXIS_Y, IO_AXIS_Z, axes_transform); - mul_m4_m3m4(xform, axes_transform, obj_eval->object_to_world().ptr()); + mul_m4_m3m4(xform, axes_transform, obj_eval->object_to_world); /* mul_m4_m3m4 does not transform last row of obmat, i.e. location data. */ - mul_v3_m3v3(xform[3], axes_transform, obj_eval->object_to_world().location()); - xform[3][3] = obj_eval->object_to_world()[3][3]; + mul_v3_m3v3(xform[3], axes_transform, obj_eval->object_to_world[3]); + xform[3][3] = obj_eval->object_to_world[3][3]; /* Write triangles. */ const Span positions = mesh->vert_positions(); diff --git a/source/blender/io/stl/exporter/stl_export.hh b/source/blender/io/stl/exporter/stl_export.hh index 17ddc0aa75d..62d91700403 100644 --- a/source/blender/io/stl/exporter/stl_export.hh +++ b/source/blender/io/stl/exporter/stl_export.hh @@ -10,9 +10,6 @@ #include "IO_stl.hh" -struct bContext; -struct Depsgraph; - namespace blender::io::stl { void exporter_main(bContext *C, const STLExportParams &export_params); diff --git a/source/blender/io/stl/importer/stl_import.cc b/source/blender/io/stl/importer/stl_import.cc index 64e58a243e3..aa0a6394095 100644 --- a/source/blender/io/stl/importer/stl_import.cc +++ b/source/blender/io/stl/importer/stl_import.cc @@ -12,7 +12,7 @@ #include "BKE_layer.hh" #include "BKE_mesh.hh" #include "BKE_object.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "DNA_collection_types.h" #include "DNA_layer_types.h" @@ -21,6 +21,7 @@ #include "BLI_fileops.hh" #include "BLI_math_matrix.h" #include "BLI_math_rotation.h" +#include "BLI_math_vector.h" #include "BLI_memory_utils.hh" #include "BLI_string.h" @@ -140,7 +141,7 @@ void importer_main(Main *bmain, rescale_m4(obmat4x4, scale_vec); BKE_object_apply_mat4(obj, obmat4x4, true, false); - DEG_id_tag_update(&lc->collection->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&lc->collection->id, ID_RECALC_COPY_ON_WRITE); int flags = ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY | ID_RECALC_ANIMATION | ID_RECALC_BASE_FLAGS; DEG_id_tag_update_ex(bmain, &obj->id, flags); diff --git a/source/blender/io/stl/importer/stl_import.hh b/source/blender/io/stl/importer/stl_import.hh index c074d96b7a1..a375cea908d 100644 --- a/source/blender/io/stl/importer/stl_import.hh +++ b/source/blender/io/stl/importer/stl_import.hh @@ -10,11 +10,6 @@ #include "IO_stl.hh" -struct bContext; -struct Main; -struct Scene; -struct ViewLayer; - namespace blender::io::stl { void stl_import_report_error(FILE *file); diff --git a/source/blender/io/stl/importer/stl_import_ascii_reader.cc b/source/blender/io/stl/importer/stl_import_ascii_reader.cc index c829f5c92d9..a3af244ce3d 100644 --- a/source/blender/io/stl/importer/stl_import_ascii_reader.cc +++ b/source/blender/io/stl/importer/stl_import_ascii_reader.cc @@ -6,11 +6,14 @@ * \ingroup stl */ +#include #include -#include + +#include "BKE_mesh.hh" #include "BLI_fileops.hh" #include "BLI_memory_utils.hh" +#include "BLI_string_ref.hh" #include "DNA_mesh_types.h" @@ -22,6 +25,7 @@ * the minimum spec, use an external library. */ #include "fast_float.h" +#include "stl_import.hh" #include "stl_import_ascii_reader.hh" #include "stl_import_mesh.hh" diff --git a/source/blender/io/stl/importer/stl_import_ascii_reader.hh b/source/blender/io/stl/importer/stl_import_ascii_reader.hh index 5b4b8e97b37..44affa36be9 100644 --- a/source/blender/io/stl/importer/stl_import_ascii_reader.hh +++ b/source/blender/io/stl/importer/stl_import_ascii_reader.hh @@ -8,7 +8,11 @@ #pragma once -struct Mesh; +#include + +#include "BKE_mesh.h" + +#include "stl_import.hh" /** * ASCII STL spec: diff --git a/source/blender/io/stl/importer/stl_import_binary_reader.cc b/source/blender/io/stl/importer/stl_import_binary_reader.cc index 01231ce4cf9..a72d6aa4d20 100644 --- a/source/blender/io/stl/importer/stl_import_binary_reader.cc +++ b/source/blender/io/stl/importer/stl_import_binary_reader.cc @@ -9,9 +9,11 @@ #include #include +#include "BKE_main.hh" #include "BKE_mesh.hh" #include "BLI_array.hh" +#include "BLI_memory_utils.hh" #include "DNA_mesh_types.h" diff --git a/source/blender/io/stl/importer/stl_import_binary_reader.hh b/source/blender/io/stl/importer/stl_import_binary_reader.hh index 81f56aee4f7..a946267094c 100644 --- a/source/blender/io/stl/importer/stl_import_binary_reader.hh +++ b/source/blender/io/stl/importer/stl_import_binary_reader.hh @@ -10,17 +10,17 @@ #include -struct Mesh; +#include "BKE_mesh.h" /* Binary STL spec.: - * UINT8[80] - Header - 80 bytes - * UINT32 - Number of triangles - 4 bytes + * UINT8[80] – Header - 80 bytes + * UINT32 – Number of triangles - 4 bytes * For each triangle - 50 bytes: - * REAL32[3] - Normal vector - 12 bytes - * REAL32[3] - Vertex 1 - 12 bytes - * REAL32[3] - Vertex 2 - 12 bytes - * REAL32[3] - Vertex 3 - 12 bytes - * UINT16 - Attribute byte count - 2 bytes + * REAL32[3] – Normal vector - 12 bytes + * REAL32[3] – Vertex 1 - 12 bytes + * REAL32[3] – Vertex 2 - 12 bytes + * REAL32[3] – Vertex 3 - 12 bytes + * UINT16 – Attribute byte count - 2 bytes */ namespace blender::io::stl { diff --git a/source/blender/io/stl/importer/stl_import_mesh.cc b/source/blender/io/stl/importer/stl_import_mesh.cc index 8d067693909..b0ebb50c773 100644 --- a/source/blender/io/stl/importer/stl_import_mesh.cc +++ b/source/blender/io/stl/importer/stl_import_mesh.cc @@ -8,10 +8,16 @@ #include +#include "BKE_customdata.hh" +#include "BKE_lib_id.hh" +#include "BKE_main.hh" #include "BKE_mesh.hh" +#include "BLI_array.hh" #include "BLI_array_utils.hh" -#include "BLI_math_vector_types.hh" +#include "BLI_math_vector.h" +#include "BLI_math_vector.hh" +#include "BLI_task.hh" #include "stl_import_mesh.hh" diff --git a/source/blender/io/stl/importer/stl_import_mesh.hh b/source/blender/io/stl/importer/stl_import_mesh.hh index 50676711dfd..c72f241f8e8 100644 --- a/source/blender/io/stl/importer/stl_import_mesh.hh +++ b/source/blender/io/stl/importer/stl_import_mesh.hh @@ -11,6 +11,7 @@ #include #include "BLI_math_vector_types.hh" +#include "BLI_set.hh" #include "BLI_vector.hh" #include "BLI_vector_set.hh" diff --git a/source/blender/io/stl/tests/stl_exporter_tests.cc b/source/blender/io/stl/tests/stl_exporter_tests.cc index ca88208a9a0..09c048335ba 100644 --- a/source/blender/io/stl/tests/stl_exporter_tests.cc +++ b/source/blender/io/stl/tests/stl_exporter_tests.cc @@ -10,7 +10,7 @@ #include "BLI_fileops.h" #include "BLI_string.h" -#include "BLO_readfile.hh" +#include "BLO_readfile.h" #include "DEG_depsgraph.hh" @@ -60,7 +60,7 @@ class STLExportTest : public BlendfileLoadingBaseTest { void SetUp() override { BlendfileLoadingBaseTest::SetUp(); - BKE_tempdir_init(nullptr); + BKE_tempdir_init(""); } void TearDown() override diff --git a/source/blender/io/stl/tests/stl_importer_tests.cc b/source/blender/io/stl/tests/stl_importer_tests.cc index 17a31204445..b8682f1e59b 100644 --- a/source/blender/io/stl/tests/stl_importer_tests.cc +++ b/source/blender/io/stl/tests/stl_importer_tests.cc @@ -11,7 +11,7 @@ #include "BLI_math_vector_types.hh" #include "BLI_string.h" -#include "BLO_readfile.hh" +#include "BLO_readfile.h" #include "DEG_depsgraph_query.hh" diff --git a/source/blender/io/usd/CMakeLists.txt b/source/blender/io/usd/CMakeLists.txt index fb527627a6f..26c77b19c55 100644 --- a/source/blender/io/usd/CMakeLists.txt +++ b/source/blender/io/usd/CMakeLists.txt @@ -52,11 +52,6 @@ if(WIN32) # warning alert. # Silence them by restore warn C4100 back to w4 remove_cc_flag("/w34100") - if(CMAKE_SYSTEM_PROCESSOR STREQUAL "ARM64") - # USD currently does not support the new preprocessor, - # and does not use sse2neon, so we can remove it here - remove_cc_flag("/Zc:preprocessor") - endif() endif() set(INC @@ -113,13 +108,13 @@ set(SRC intern/usd_reader_material.cc intern/usd_reader_mesh.cc intern/usd_reader_nurbs.cc - intern/usd_reader_pointinstancer.cc intern/usd_reader_prim.cc intern/usd_reader_shape.cc intern/usd_reader_skeleton.cc intern/usd_reader_stage.cc intern/usd_reader_volume.cc intern/usd_reader_xform.cc + intern/usd_reader_pointinstancer.cc intern/usd_skel_convert.cc intern/usd_skel_root_utils.cc @@ -153,13 +148,13 @@ set(SRC intern/usd_reader_material.hh intern/usd_reader_mesh.hh intern/usd_reader_nurbs.hh - intern/usd_reader_pointinstancer.hh intern/usd_reader_prim.hh intern/usd_reader_shape.hh intern/usd_reader_skeleton.hh intern/usd_reader_stage.hh intern/usd_reader_volume.hh intern/usd_reader_xform.hh + intern/usd_reader_pointinstancer.hh intern/usd_skel_convert.hh intern/usd_skel_root_utils.hh ) diff --git a/source/blender/io/usd/hydra/curves.cc b/source/blender/io/usd/hydra/curves.cc index 5e10dcc3f8b..be9f39735e6 100644 --- a/source/blender/io/usd/hydra/curves.cc +++ b/source/blender/io/usd/hydra/curves.cc @@ -234,9 +234,9 @@ void HairData::write_curves() Object *object = (Object *)id; float scale = particle_system_->part->rad_scale * - (std::abs(object->object_to_world().ptr()[0][0]) + - std::abs(object->object_to_world().ptr()[1][1]) + - std::abs(object->object_to_world().ptr()[2][2])) / + (std::abs(object->object_to_world[0][0]) + + std::abs(object->object_to_world[1][1]) + + std::abs(object->object_to_world[2][2])) / 3; float root = scale * particle_system_->part->rad_root; float tip = scale * particle_system_->part->rad_tip; diff --git a/source/blender/io/usd/hydra/curves.hh b/source/blender/io/usd/hydra/curves.hh index bfac0316507..d04dec983be 100644 --- a/source/blender/io/usd/hydra/curves.hh +++ b/source/blender/io/usd/hydra/curves.hh @@ -9,7 +9,7 @@ #include "BLI_set.hh" -#include "BKE_duplilist.hh" +#include "BKE_duplilist.h" #include "DNA_curves_types.h" #include "DNA_particle_types.h" diff --git a/source/blender/io/usd/hydra/hydra_scene_delegate.cc b/source/blender/io/usd/hydra/hydra_scene_delegate.cc index 1c3ed2e41b1..5c1a38e5077 100644 --- a/source/blender/io/usd/hydra/hydra_scene_delegate.cc +++ b/source/blender/io/usd/hydra/hydra_scene_delegate.cc @@ -398,7 +398,7 @@ void HydraSceneDelegate::check_updates() break; } case ID_SCE: { - if ((id->recalc & ID_RECALC_SYNC_TO_EVAL && !(id->recalc & ID_RECALC_SELECT)) || + if ((id->recalc & ID_RECALC_COPY_ON_WRITE && !(id->recalc & ID_RECALC_SELECT)) || id->recalc & (ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY | ID_RECALC_BASE_FLAGS)) { do_update_collection = true; diff --git a/source/blender/io/usd/hydra/mesh.hh b/source/blender/io/usd/hydra/mesh.hh index 7d189ec27bf..5daf125a6ae 100644 --- a/source/blender/io/usd/hydra/mesh.hh +++ b/source/blender/io/usd/hydra/mesh.hh @@ -9,7 +9,7 @@ #include "BLI_set.hh" -#include "BKE_duplilist.hh" +#include "BKE_duplilist.h" #include "material.hh" #include "object.hh" diff --git a/source/blender/io/usd/hydra/object.cc b/source/blender/io/usd/hydra/object.cc index a1b26796f34..5349022a219 100644 --- a/source/blender/io/usd/hydra/object.cc +++ b/source/blender/io/usd/hydra/object.cc @@ -121,7 +121,7 @@ void ObjectData::available_materials(Set & /*paths*/) const {} void ObjectData::write_transform() { - transform = gf_matrix_from_transform(((const Object *)id)->object_to_world().ptr()); + transform = gf_matrix_from_transform(((const Object *)id)->object_to_world); } void ObjectData::write_materials() {} diff --git a/source/blender/io/usd/hydra/usd_scene_delegate.cc b/source/blender/io/usd/hydra/usd_scene_delegate.cc index d96debf16a0..9b30a417352 100644 --- a/source/blender/io/usd/hydra/usd_scene_delegate.cc +++ b/source/blender/io/usd/hydra/usd_scene_delegate.cc @@ -9,7 +9,7 @@ #include "BLI_string.h" #include "BKE_appdir.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "DEG_depsgraph_query.hh" diff --git a/source/blender/io/usd/hydra/volume_modifier.cc b/source/blender/io/usd/hydra/volume_modifier.cc index 023b3dfcff0..04da4c78cce 100644 --- a/source/blender/io/usd/hydra/volume_modifier.cc +++ b/source/blender/io/usd/hydra/volume_modifier.cc @@ -120,7 +120,7 @@ void VolumeModifierData::write_transform() pxr::GfMatrix4d(1.0f).SetTranslate(pxr::GfVec3d(texspace_loc)); /* applying object transform */ - transform *= gf_matrix_from_transform(object->object_to_world().ptr()); + transform *= gf_matrix_from_transform(object->object_to_world); } std::string VolumeModifierData::get_cached_file_path(std::string directory, int frame) diff --git a/source/blender/io/usd/hydra/world.cc b/source/blender/io/usd/hydra/world.cc index 926435fe27f..b4a94ba7271 100644 --- a/source/blender/io/usd/hydra/world.cc +++ b/source/blender/io/usd/hydra/world.cc @@ -18,7 +18,7 @@ #include "BLI_math_rotation.h" #include "BLI_path_util.h" -#include "BKE_node.hh" +#include "BKE_node.h" #include "BKE_node_runtime.hh" #include "BKE_studiolight.h" diff --git a/source/blender/io/usd/intern/usd_armature_utils.cc b/source/blender/io/usd/intern/usd_armature_utils.cc index 1476735ab03..7a583d7940f 100644 --- a/source/blender/io/usd/intern/usd_armature_utils.cc +++ b/source/blender/io/usd/intern/usd_armature_utils.cc @@ -6,12 +6,12 @@ #include "BKE_armature.hh" #include "BKE_modifier.hh" -#include "BLI_listbase.h" -#include "BLI_vector.hh" #include "DEG_depsgraph.hh" #include "DEG_depsgraph_query.hh" -#include "DNA_action_types.h" #include "DNA_armature_types.h" +#include "ED_armature.hh" + +#include "WM_api.hh" namespace blender::io::usd { diff --git a/source/blender/io/usd/intern/usd_armature_utils.hh b/source/blender/io/usd/intern/usd_armature_utils.hh index c2c74982ba8..82d48a4c7b8 100644 --- a/source/blender/io/usd/intern/usd_armature_utils.hh +++ b/source/blender/io/usd/intern/usd_armature_utils.hh @@ -12,12 +12,14 @@ #include #include -#include +#include struct Bone; struct Depsgraph; struct ModifierData; struct Object; +struct Scene; +struct USDExportParams; namespace blender::io::usd { @@ -46,7 +48,7 @@ void get_armature_bone_names(const Object *ob_arm, bool use_deform, Vector #include @@ -11,7 +10,7 @@ #include #include "BKE_main.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "BLI_fileops.h" #include "BLI_path_util.h" diff --git a/source/blender/io/usd/intern/usd_asset_utils.hh b/source/blender/io/usd/intern/usd_asset_utils.hh index 82fc448f140..31b543e03c6 100644 --- a/source/blender/io/usd/intern/usd_asset_utils.hh +++ b/source/blender/io/usd/intern/usd_asset_utils.hh @@ -5,6 +5,8 @@ #include "usd.hh" +#include + #include namespace blender::io::usd { diff --git a/source/blender/io/usd/intern/usd_blend_shape_utils.cc b/source/blender/io/usd/intern/usd_blend_shape_utils.cc index 4fe06168434..bc279692037 100644 --- a/source/blender/io/usd/intern/usd_blend_shape_utils.cc +++ b/source/blender/io/usd/intern/usd_blend_shape_utils.cc @@ -3,27 +3,49 @@ * SPDX-License-Identifier: GPL-2.0-or-later */ #include "usd_blend_shape_utils.hh" +#include "usd_skel_convert.hh" +#include "usd.hh" + +#include #include #include #include #include #include +#include +#include +#include +#include "DNA_anim_types.h" +#include "DNA_armature_types.h" #include "DNA_key_types.h" #include "DNA_mesh_types.h" +#include "DNA_meshdata_types.h" +#include "DNA_meta_types.h" +#include "DNA_scene_types.h" +#include "BKE_action.h" +#include "BKE_armature.hh" +#include "BKE_deform.hh" +#include "BKE_fcurve.h" #include "BKE_key.hh" +#include "BKE_lib_id.hh" #include "BKE_mesh.hh" +#include "BKE_mesh_runtime.hh" +#include "BKE_modifier.hh" #include "BKE_object.hh" -#include "DNA_object_types.h" +#include "BKE_object_deform.h" -#include "BLI_assert.h" -#include "BLI_listbase.h" #include "BLI_math_vector.h" #include "BLI_set.hh" +#include "BLI_span.hh" #include "BLI_vector.hh" +#include "ED_armature.hh" +#include "ED_keyframing.hh" +#include "ED_mesh.hh" + #include #include diff --git a/source/blender/io/usd/intern/usd_blend_shape_utils.hh b/source/blender/io/usd/intern/usd_blend_shape_utils.hh index 935df6ccf84..0e9a5f524c0 100644 --- a/source/blender/io/usd/intern/usd_blend_shape_utils.hh +++ b/source/blender/io/usd/intern/usd_blend_shape_utils.hh @@ -4,10 +4,16 @@ #pragma once #include +#include +#include struct Key; +struct Main; struct Mesh; struct Object; +struct Scene; +struct USDExportParams; +struct USDImportParams; namespace blender::io::usd { @@ -22,8 +28,8 @@ struct ImportSettings; * Return the shape key on the given mesh object. * * \param obj: The mesh object - * \return The shape key on the given object's mesh data, or - * null if the object isn't a mesh. + * \return: The shape key on the given object's mesh data, or + * null if the object isn't a mesh. */ const Key *get_mesh_shape_key(const Object *obj); @@ -32,7 +38,8 @@ const Key *get_mesh_shape_key(const Object *obj); * shape keys. * * \param obj: The mesh object - * \return True if the object is a mesh with shape keys, false otherwise + * \return: True if the object is a mesh with shape keys, false + * otherwise */ bool is_mesh_with_shape_keys(const Object *obj); @@ -53,7 +60,7 @@ void create_blend_shapes(pxr::UsdStageRefPtr stage, * Return the current weight values of the given key. * * \param key: The key whose values will be queried - * \return The array of key values. + * \return: The array of key values */ pxr::VtFloatArray get_blendshape_weights(const Key *key); @@ -78,7 +85,7 @@ void ensure_blend_shape_skeleton(pxr::UsdStageRefPtr stage, pxr::UsdPrim &mesh_p * Query whether the object is a mesh with animated shape keys. * * \param obj: The mesh object - * \return True if the object has animated keys, false otherwise. + * \return: True if the object has animated keys, false otherwise */ bool has_animated_mesh_shape_key(const Object *obj); @@ -86,7 +93,7 @@ bool has_animated_mesh_shape_key(const Object *obj); * Return the block names of the given shape key. * * \param key: The key to query - * \return The list of key block names. + * \return: The list of key block names */ pxr::VtTokenArray get_blend_shape_names(const Key *key); @@ -95,7 +102,7 @@ pxr::VtTokenArray get_blend_shape_names(const Key *key); * prim's 'blendShapes' attribute value. * * \param mesh_prim: The prim to query - * \return The list of blend shape names. + * \return: The list of blend shape names */ pxr::VtTokenArray get_blend_shapes_attr_value(const pxr::UsdPrim &mesh_prim); @@ -120,8 +127,8 @@ void remap_blend_shape_anim(pxr::UsdStageRefPtr stage, * with its verts in the shape key basis positions. The returned mesh must be freed by the caller. * * \param obj: The mesh object with shape keys - * \return A new mesh corresponding to the shape key basis shape, or null if the object - * isn't a mesh or has no shape keys. + * \return: A new mesh corresponding to the shape key basis shape, or null if the object + * isn't a mesh or has no shape keys */ Mesh *get_shape_key_basis_mesh(Object *obj); diff --git a/source/blender/io/usd/intern/usd_capi_export.cc b/source/blender/io/usd/intern/usd_capi_export.cc index c3fc350a609..b7aa774bebe 100644 --- a/source/blender/io/usd/intern/usd_capi_export.cc +++ b/source/blender/io/usd/intern/usd_capi_export.cc @@ -10,14 +10,15 @@ #include "usd_hook.hh" #include "usd_private.hh" +#include #include #include -#include +#include #include #include #include #include -#include +#include #include "MEM_guardedalloc.h" @@ -30,9 +31,9 @@ #include "BKE_appdir.hh" #include "BKE_blender_version.h" #include "BKE_context.hh" -#include "BKE_global.hh" -#include "BKE_report.hh" -#include "BKE_scene.hh" +#include "BKE_global.h" +#include "BKE_report.h" +#include "BKE_scene.h" #include "BLI_fileops.h" #include "BLI_path_util.h" diff --git a/source/blender/io/usd/intern/usd_capi_import.cc b/source/blender/io/usd/intern/usd_capi_import.cc index c8c8b5a9f91..f1358b05b80 100644 --- a/source/blender/io/usd/intern/usd_capi_import.cc +++ b/source/blender/io/usd/intern/usd_capi_import.cc @@ -4,21 +4,29 @@ #include "IO_types.hh" #include "usd.hh" +#include "usd_hierarchy_iterator.hh" #include "usd_hook.hh" #include "usd_reader_geom.hh" #include "usd_reader_prim.hh" #include "usd_reader_stage.hh" -#include "BKE_cachefile.hh" -#include "BKE_collection.hh" +#include "BKE_appdir.hh" +#include "BKE_blender_version.h" +#include "BKE_cachefile.h" +#include "BKE_cdderivedmesh.h" #include "BKE_context.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_layer.hh" #include "BKE_lib_id.hh" +#include "BKE_library.hh" #include "BKE_main.hh" +#include "BKE_node.hh" #include "BKE_object.hh" -#include "BKE_report.hh" +#include "BKE_report.h" +#include "BKE_scene.h" +#include "BKE_world.h" +#include "BLI_fileops.h" #include "BLI_listbase.h" #include "BLI_math_matrix.h" #include "BLI_math_rotation.h" @@ -26,18 +34,17 @@ #include "BLI_string.h" #include "BLI_timeit.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DEG_depsgraph.hh" #include "DEG_depsgraph_build.hh" +#include "DEG_depsgraph_query.hh" #include "DNA_cachefile_types.h" #include "DNA_collection_types.h" -#include "DNA_layer_types.h" -#include "DNA_listBase.h" -#include "DNA_object_types.h" +#include "DNA_node_types.h" #include "DNA_scene_types.h" -#include "DNA_windowmanager_types.h" +#include "DNA_world_types.h" #include "MEM_guardedalloc.h" @@ -46,7 +53,9 @@ #include #include +#include #include +#include #include @@ -142,6 +151,7 @@ static void find_prefix_to_skip(pxr::UsdStageRefPtr stage, ImportSettings *r_set } /* Treat the root as empty */ + auto path_string = path.GetString(); if (path == pxr::SdfPath("/")) { path = pxr::SdfPath(); } @@ -211,7 +221,7 @@ static void import_startjob(void *customdata, wmJobWorkerStatus *worker_status) data->bmain, data->scene->master_collection, display_name); id_fake_user_set(&import_collection->id); - DEG_id_tag_update(&import_collection->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&import_collection->id, ID_RECALC_COPY_ON_WRITE); DEG_relations_tag_update(data->bmain); BKE_view_layer_synced_ensure(data->scene, data->view_layer); @@ -429,7 +439,7 @@ static void import_endjob(void *customdata) /* TODO: is setting active needed? */ BKE_view_layer_base_select_and_set_active(view_layer, base); - DEG_id_tag_update(&lc->collection->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&lc->collection->id, ID_RECALC_COPY_ON_WRITE); DEG_id_tag_update_ex(data->bmain, &ob->id, ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY | ID_RECALC_ANIMATION | @@ -564,19 +574,19 @@ USDMeshReadParams create_mesh_read_params(const double motion_sample_time, const return params; } -void USD_read_geometry(CacheReader *reader, - Object *ob, - blender::bke::GeometrySet &geometry_set, - const USDMeshReadParams params, - const char **err_str) +Mesh *USD_read_mesh(CacheReader *reader, + Object *ob, + Mesh *existing_mesh, + const USDMeshReadParams params, + const char **err_str) { USDGeomReader *usd_reader = dynamic_cast(get_usd_reader(reader, ob, err_str)); if (usd_reader == nullptr) { - return; + return nullptr; } - return usd_reader->read_geometry(geometry_set, params, err_str); + return usd_reader->read_mesh(existing_mesh, params, err_str); } bool USD_mesh_topology_changed(CacheReader *reader, diff --git a/source/blender/io/usd/intern/usd_hierarchy_iterator.cc b/source/blender/io/usd/intern/usd_hierarchy_iterator.cc index 2ac8773f290..cac9bce0284 100644 --- a/source/blender/io/usd/intern/usd_hierarchy_iterator.cc +++ b/source/blender/io/usd/intern/usd_hierarchy_iterator.cc @@ -19,17 +19,25 @@ #include "usd_writer_transform.hh" #include "usd_writer_volume.hh" +#include #include #include -#include "BKE_main.hh" +#include "BKE_duplilist.h" #include "BLI_assert.h" +#include "BLI_utildefines.h" +#include "DEG_depsgraph_query.hh" + +#include "DNA_ID.h" #include "DNA_layer_types.h" #include "DNA_object_types.h" +#include "DNA_armature_types.h" +#include "DNA_mesh_types.h" + namespace blender::io::usd { USDHierarchyIterator::USDHierarchyIterator(Main *bmain, diff --git a/source/blender/io/usd/intern/usd_hook.cc b/source/blender/io/usd/intern/usd_hook.cc index 8a3ed1d42e6..402163000a0 100644 --- a/source/blender/io/usd/intern/usd_hook.cc +++ b/source/blender/io/usd/intern/usd_hook.cc @@ -14,9 +14,7 @@ #include "BLI_utildefines.h" -#include "BKE_report.hh" - -#include "DNA_windowmanager_types.h" +#include "BKE_report.h" #include "RNA_access.hh" #include "RNA_prototypes.h" diff --git a/source/blender/io/usd/intern/usd_hook.hh b/source/blender/io/usd/intern/usd_hook.hh index d3ae95da314..49af92e4c7a 100644 --- a/source/blender/io/usd/intern/usd_hook.hh +++ b/source/blender/io/usd/intern/usd_hook.hh @@ -3,12 +3,16 @@ * SPDX-License-Identifier: GPL-2.0-or-later */ #pragma once -#include +#include #include +#include + struct Depsgraph; +struct ExportJobData; struct Material; struct ReportList; +struct USDExportParams; namespace blender::io::usd { diff --git a/source/blender/io/usd/intern/usd_reader_camera.cc b/source/blender/io/usd/intern/usd_reader_camera.cc index f32ae22991b..71894c80bed 100644 --- a/source/blender/io/usd/intern/usd_reader_camera.cc +++ b/source/blender/io/usd/intern/usd_reader_camera.cc @@ -15,6 +15,7 @@ #include "BKE_camera.h" #include "BKE_object.hh" +#include #include namespace blender::io::usd { diff --git a/source/blender/io/usd/intern/usd_reader_curve.cc b/source/blender/io/usd/intern/usd_reader_curve.cc index 4c346ab532e..95461efe2ef 100644 --- a/source/blender/io/usd/intern/usd_reader_curve.cc +++ b/source/blender/io/usd/intern/usd_reader_curve.cc @@ -1,120 +1,46 @@ -/* SPDX-FileCopyrightText: 2024 Blender Authors +/* SPDX-FileCopyrightText: 2023 Blender Authors * * SPDX-License-Identifier: GPL-2.0-or-later * Adapted from the Blender Alembic importer implementation. Copyright 2016 Kévin Dietrich. * Modifications Copyright 2021 Tangent Animation. All rights reserved. */ #include "usd_reader_curve.hh" -#include "usd.hh" -#include "BKE_attribute.hh" -#include "BKE_curves.hh" -#include "BKE_geometry_set.hh" +#include "BKE_curve.hh" +#include "BKE_mesh.hh" #include "BKE_object.hh" -#include "BLI_index_range.hh" -#include "BLI_math_vector_types.hh" +#include "BLI_listbase.h" -#include "DNA_curves_types.h" +#include "DNA_curve_types.h" #include "DNA_object_types.h" +#include "MEM_guardedalloc.h" + +#include #include +#include + #include +#include namespace blender::io::usd { -static inline float3 to_float3(pxr::GfVec3f vec3f) -{ - return float3(vec3f.data()); -} - -static inline int bezier_point_count(int usd_count, bool is_cyclic) -{ - return is_cyclic ? (usd_count / 3) : ((usd_count / 3) + 1); -} - -static int point_count(int usdCount, CurveType curve_type, bool is_cyclic) -{ - if (curve_type == CURVE_TYPE_BEZIER) { - return bezier_point_count(usdCount, is_cyclic); - } - return usdCount; -} - -static Array calc_curve_offsets(const pxr::VtIntArray &usdCounts, - const CurveType curve_type, - bool is_cyclic) -{ - Array offsets(usdCounts.size() + 1); - int offset = 0; - for (const int i : offsets.index_range()) { - offsets[i] = offset; - offset += point_count(usdCounts[i], curve_type, is_cyclic); - } - return offsets; -} - -static void add_bezier_control_point(int cp, - int offset, - MutableSpan positions, - MutableSpan handles_left, - MutableSpan handles_right, - const Span usdPoints) -{ - if (offset == 0) { - positions[cp] = to_float3(usdPoints[offset]); - handles_right[cp] = to_float3(usdPoints[offset + 1]); - handles_left[cp] = 2.0f * positions[cp] - handles_right[cp]; - } - else if (offset == usdPoints.size() - 1) { - positions[cp] = to_float3(usdPoints[offset]); - handles_left[cp] = to_float3(usdPoints[offset - 1]); - handles_right[cp] = 2.0f * positions[cp] - handles_left[cp]; - } - else { - positions[cp] = to_float3(usdPoints[offset]); - handles_left[cp] = to_float3(usdPoints[offset - 1]); - handles_right[cp] = to_float3(usdPoints[offset + 1]); - } -} - -/** Returns true if the number of curves or the number of curve points in each curve differ. */ -static bool curves_topology_changed(const bke::CurvesGeometry &curves, const Span usd_offsets) -{ - if (curves.offsets() != usd_offsets) { - return true; - } - - return false; -} - -static CurveType get_curve_type(pxr::TfToken type, pxr::TfToken basis) -{ - if (type == pxr::UsdGeomTokens->cubic) { - if (basis == pxr::UsdGeomTokens->bezier) { - return CURVE_TYPE_BEZIER; - } - if (basis == pxr::UsdGeomTokens->bspline) { - return CURVE_TYPE_NURBS; - } - if (basis == pxr::UsdGeomTokens->catmullRom) { - return CURVE_TYPE_CATMULL_ROM; - } - } - - return CURVE_TYPE_POLY; -} void USDCurvesReader::create_object(Main *bmain, const double /*motionSampleTime*/) { - curve_ = static_cast(BKE_curves_add(bmain, name_.c_str())); + curve_ = BKE_curve_add(bmain, name_.c_str(), OB_CURVES_LEGACY); - object_ = BKE_object_add_only_object(bmain, OB_CURVES, name_.c_str()); + curve_->flag |= CU_3D; + curve_->actvert = CU_ACT_NONE; + curve_->resolu = 2; + + object_ = BKE_object_add_only_object(bmain, OB_CURVES_LEGACY, name_.c_str()); object_->data = curve_; } void USDCurvesReader::read_object_data(Main *bmain, double motionSampleTime) { - Curves *cu = (Curves *)object_->data; + Curve *cu = (Curve *)object_->data; read_curve_sample(cu, motionSampleTime); if (curve_prim_.GetPointsAttr().ValueMightBeTimeVarying()) { @@ -124,9 +50,10 @@ void USDCurvesReader::read_object_data(Main *bmain, double motionSampleTime) USDXformReader::read_object_data(bmain, motionSampleTime); } -void USDCurvesReader::read_curve_sample(Curves *curves_id, const double motionSampleTime) +void USDCurvesReader::read_curve_sample(Curve *cu, const double motionSampleTime) { curve_prim_ = pxr::UsdGeomBasisCurves(prim_); + if (!curve_prim_) { return; } @@ -136,7 +63,9 @@ void USDCurvesReader::read_curve_sample(Curves *curves_id, const double motionSa pxr::UsdAttribute pointsAttr = curve_prim_.GetPointsAttr(); pxr::VtIntArray usdCounts; + vertexAttr.Get(&usdCounts, motionSampleTime); + int num_subcurves = usdCounts.size(); pxr::VtVec3fArray usdPoints; pointsAttr.Get(&usdPoints, motionSampleTime); @@ -156,123 +85,155 @@ void USDCurvesReader::read_curve_sample(Curves *curves_id, const double motionSa pxr::TfToken wrap; wrapAttr.Get(&wrap, motionSampleTime); - const CurveType curve_type = get_curve_type(type, basis); - const bool is_cyclic = wrap == pxr::UsdGeomTokens->periodic; - const int curves_num = usdCounts.size(); - const Array new_offsets = calc_curve_offsets(usdCounts, curve_type, is_cyclic); + pxr::VtVec3fArray usdNormals; + curve_prim_.GetNormalsAttr().Get(&usdNormals, motionSampleTime); - bke::CurvesGeometry &curves = curves_id->geometry.wrap(); - if (curves_topology_changed(curves, new_offsets)) { - curves.resize(new_offsets.last(), curves_num); - } - - curves.offsets_for_write().copy_from(new_offsets); - - curves.fill_curve_types(curve_type); - - if (is_cyclic) { - curves.cyclic_for_write().fill(true); - } - - if (curve_type == CURVE_TYPE_NURBS) { - const int8_t curve_order = type == pxr::UsdGeomTokens->cubic ? 4 : 2; - curves.nurbs_orders_for_write().fill(curve_order); - } - - MutableSpan positions = curves.positions_for_write(); - - /* Bezier curves require care in filing out their left/right handles. */ - if (type == pxr::UsdGeomTokens->cubic && basis == pxr::UsdGeomTokens->bezier) { - curves.handle_types_left_for_write().fill(BEZIER_HANDLE_ALIGN); - curves.handle_types_right_for_write().fill(BEZIER_HANDLE_ALIGN); - - MutableSpan handles_right = curves.handle_positions_right_for_write(); - MutableSpan handles_left = curves.handle_positions_left_for_write(); - Span points{usdPoints.data(), int64_t(usdPoints.size())}; - - int usd_point_offset = 0; - int point_offset = 0; - for (const int i : curves.curves_range()) { - const int usd_point_count = usdCounts[i]; - const int point_count = bezier_point_count(usd_point_count, is_cyclic); - - int cp_offset = 0; - for (const int cp : IndexRange(point_count)) { - add_bezier_control_point(cp, - cp_offset, - positions.slice(point_offset, point_count), - handles_left.slice(point_offset, point_count), - handles_right.slice(point_offset, point_count), - points.slice(usd_point_offset, usd_point_count)); - cp_offset += 3; - } - - point_offset += point_count; - usd_point_offset += usd_point_count; - } + /* If normals, extrude, else bevel. + * Perhaps to be replaced by Blender/USD Schema. */ + if (!usdNormals.empty()) { + /* Set extrusion to 1.0f. */ + curve_->extrude = 1.0f; } else { - static_assert(sizeof(pxr::GfVec3f) == sizeof(float3)); - positions.copy_from(Span(usdPoints.data(), usdPoints.size()).cast()); + /* Set bevel depth to 1.0f. */ + curve_->bevel_radius = 1.0f; } - if (!usdWidths.empty()) { - bke::MutableAttributeAccessor attributes = curves.attributes_for_write(); - bke::SpanAttributeWriter radii = attributes.lookup_or_add_for_write_span( - "radius", bke::AttrDomain::Point); + size_t idx = 0; + for (size_t i = 0; i < num_subcurves; i++) { + const int num_verts = usdCounts[i]; + Nurb *nu = static_cast(MEM_callocN(sizeof(Nurb), __func__)); - pxr::TfToken widths_interp = curve_prim_.GetWidthsInterpolation(); - if (widths_interp == pxr::UsdGeomTokens->constant) { - radii.span.fill(usdWidths[0] / 2.0f); + if (basis == pxr::UsdGeomTokens->bspline) { + nu->flag = CU_SMOOTH; + nu->type = CU_NURBS; } - else { - const bool is_bezier_vertex_interp = (type == pxr::UsdGeomTokens->cubic && - basis == pxr::UsdGeomTokens->bezier && - widths_interp == pxr::UsdGeomTokens->vertex); - if (is_bezier_vertex_interp) { - /* Blender does not support 'vertex-varying' interpolation. - * Assign the widths as-if it were 'varying' only. */ - int usd_point_offset = 0; - int point_offset = 0; - for (const int i : curves.curves_range()) { - const int usd_point_count = usdCounts[i]; - const int point_count = bezier_point_count(usd_point_count, is_cyclic); + else if (basis == pxr::UsdGeomTokens->bezier) { + /* TODO(makowalski): Beziers are not properly imported as beziers. */ + nu->type = CU_POLY; + } + else if (basis.IsEmpty()) { + nu->type = CU_POLY; + } + nu->resolu = cu->resolu; + nu->resolv = cu->resolv; - int cp_offset = 0; - for (const int cp : IndexRange(point_count)) { - radii.span[point_offset + cp] = usdWidths[usd_point_offset + cp_offset] / 2.0f; - cp_offset += 3; - } + nu->pntsu = num_verts; + nu->pntsv = 1; - point_offset += point_count; - usd_point_offset += usd_point_count; - } - } - else { - for (const int i_point : curves.points_range()) { - radii.span[i_point] = usdWidths[i_point] / 2.0f; - } - } + if (type == pxr::UsdGeomTokens->cubic) { + nu->orderu = 4; + } + else if (type == pxr::UsdGeomTokens->linear) { + nu->orderu = 2; } - radii.finish(); + if (wrap == pxr::UsdGeomTokens->periodic) { + nu->flagu |= CU_NURB_CYCLIC; + } + else if (wrap == pxr::UsdGeomTokens->pinned) { + nu->flagu |= CU_NURB_ENDPOINT; + } + + float weight = 1.0f; + + nu->bp = static_cast(MEM_callocN(sizeof(BPoint) * nu->pntsu, __func__)); + BPoint *bp = nu->bp; + + for (int j = 0; j < nu->pntsu; j++, bp++, idx++) { + bp->vec[0] = float(usdPoints[idx][0]); + bp->vec[1] = float(usdPoints[idx][1]); + bp->vec[2] = float(usdPoints[idx][2]); + bp->vec[3] = weight; + bp->f1 = SELECT; + bp->weight = weight; + + float radius = curve_->offset; + if (idx < usdWidths.size()) { + radius = usdWidths[idx]; + } + + bp->radius = radius; + } + + BKE_nurb_knot_calc_u(nu); + BKE_nurb_knot_calc_v(nu); + + BLI_addtail(BKE_curve_nurbs_get(cu), nu); } } -void USDCurvesReader::read_geometry(bke::GeometrySet &geometry_set, - const USDMeshReadParams params, - const char ** /*err_str*/) +Mesh *USDCurvesReader::read_mesh(Mesh *existing_mesh, + const USDMeshReadParams params, + const char ** /*err_str*/) { if (!curve_prim_) { - return; + return existing_mesh; } - if (!geometry_set.has_curves()) { - return; + pxr::UsdAttribute widthsAttr = curve_prim_.GetWidthsAttr(); + pxr::UsdAttribute vertexAttr = curve_prim_.GetCurveVertexCountsAttr(); + pxr::UsdAttribute pointsAttr = curve_prim_.GetPointsAttr(); + + pxr::VtIntArray usdCounts; + + vertexAttr.Get(&usdCounts, params.motion_sample_time); + int num_subcurves = usdCounts.size(); + + pxr::VtVec3fArray usdPoints; + pointsAttr.Get(&usdPoints, params.motion_sample_time); + + int vertex_idx = 0; + int curve_idx; + Curve *curve = static_cast(object_->data); + + const int curve_count = BLI_listbase_count(&curve->nurb); + bool same_topology = curve_count == num_subcurves; + + if (same_topology) { + Nurb *nurbs = static_cast(curve->nurb.first); + for (curve_idx = 0; nurbs; nurbs = nurbs->next, curve_idx++) { + const int num_in_usd = usdCounts[curve_idx]; + const int num_in_blender = nurbs->pntsu; + + if (num_in_usd != num_in_blender) { + same_topology = false; + break; + } + } } - Curves *curves = geometry_set.get_curves_for_write(); - read_curve_sample(curves, params.motion_sample_time); + if (!same_topology) { + BKE_nurbList_free(&curve->nurb); + read_curve_sample(curve, params.motion_sample_time); + } + else { + Nurb *nurbs = static_cast(curve->nurb.first); + for (curve_idx = 0; nurbs; nurbs = nurbs->next, curve_idx++) { + const int totpoint = usdCounts[curve_idx]; + + if (nurbs->bp) { + BPoint *point = nurbs->bp; + + for (int i = 0; i < totpoint; i++, point++, vertex_idx++) { + point->vec[0] = usdPoints[vertex_idx][0]; + point->vec[1] = usdPoints[vertex_idx][1]; + point->vec[2] = usdPoints[vertex_idx][2]; + } + } + else if (nurbs->bezt) { + BezTriple *bezier = nurbs->bezt; + + for (int i = 0; i < totpoint; i++, bezier++, vertex_idx++) { + bezier->vec[1][0] = usdPoints[vertex_idx][0]; + bezier->vec[1][1] = usdPoints[vertex_idx][1]; + bezier->vec[1][2] = usdPoints[vertex_idx][2]; + } + } + } + } + + return BKE_mesh_new_nomain_from_curve(object_); } } // namespace blender::io::usd diff --git a/source/blender/io/usd/intern/usd_reader_curve.hh b/source/blender/io/usd/intern/usd_reader_curve.hh index 1d2832b6d2f..1a697addbff 100644 --- a/source/blender/io/usd/intern/usd_reader_curve.hh +++ b/source/blender/io/usd/intern/usd_reader_curve.hh @@ -8,19 +8,16 @@ #include "usd.hh" #include "usd_reader_geom.hh" -#include +#include "pxr/usd/usdGeom/basisCurves.h" -struct Curves; -namespace blender::bke { -struct GeometrySet; -} +struct Curve; namespace blender::io::usd { class USDCurvesReader : public USDGeomReader { protected: pxr::UsdGeomBasisCurves curve_prim_; - Curves *curve_; + Curve *curve_; public: USDCurvesReader(const pxr::UsdPrim &prim, @@ -38,11 +35,11 @@ class USDCurvesReader : public USDGeomReader { void create_object(Main *bmain, double motionSampleTime) override; void read_object_data(Main *bmain, double motionSampleTime) override; - void read_curve_sample(Curves *curves_id, double motionSampleTime); + void read_curve_sample(Curve *cu, double motionSampleTime); - void read_geometry(bke::GeometrySet &geometry_set, - USDMeshReadParams params, - const char **err_str) override; + Mesh *read_mesh(struct Mesh *existing_mesh, + USDMeshReadParams params, + const char **err_str) override; }; } // namespace blender::io::usd diff --git a/source/blender/io/usd/intern/usd_reader_geom.cc b/source/blender/io/usd/intern/usd_reader_geom.cc index a4f4abf4b7f..18b8e258119 100644 --- a/source/blender/io/usd/intern/usd_reader_geom.cc +++ b/source/blender/io/usd/intern/usd_reader_geom.cc @@ -6,12 +6,17 @@ #include "BKE_lib_id.hh" #include "BKE_modifier.hh" +#include "BKE_object.hh" #include "BLI_listbase.h" +#include "BLI_math_geom.h" #include "BLI_string.h" +#include "BLI_utildefines.h" #include "DNA_cachefile_types.h" #include "DNA_modifier_types.h" +#include "DNA_object_types.h" +#include "DNA_space_types.h" /* for FILE_MAX */ namespace blender::io::usd { diff --git a/source/blender/io/usd/intern/usd_reader_geom.hh b/source/blender/io/usd/intern/usd_reader_geom.hh index a6979c659ac..19fd9b68d0e 100644 --- a/source/blender/io/usd/intern/usd_reader_geom.hh +++ b/source/blender/io/usd/intern/usd_reader_geom.hh @@ -8,10 +8,6 @@ struct Mesh; -namespace blender::bke { -struct GeometrySet; -} - namespace blender::io::usd { class USDGeomReader : public USDXformReader { @@ -24,9 +20,9 @@ class USDGeomReader : public USDXformReader { { } - virtual void read_geometry(bke::GeometrySet &geometry_set, - USDMeshReadParams params, - const char **err_str) = 0; + virtual Mesh *read_mesh(struct Mesh *existing_mesh, + USDMeshReadParams params, + const char **err_str) = 0; virtual bool topology_changed(const Mesh * /*existing_mesh*/, double /*motionSampleTime*/) { diff --git a/source/blender/io/usd/intern/usd_reader_instance.hh b/source/blender/io/usd/intern/usd_reader_instance.hh index ff365d669a7..6fbdc9b9634 100644 --- a/source/blender/io/usd/intern/usd_reader_instance.hh +++ b/source/blender/io/usd/intern/usd_reader_instance.hh @@ -5,8 +5,9 @@ #include "usd_reader_xform.hh" +#include + struct Collection; -struct Main; namespace blender::io::usd { diff --git a/source/blender/io/usd/intern/usd_reader_light.hh b/source/blender/io/usd/intern/usd_reader_light.hh index d6fee03bbed..5142a0da4a5 100644 --- a/source/blender/io/usd/intern/usd_reader_light.hh +++ b/source/blender/io/usd/intern/usd_reader_light.hh @@ -6,8 +6,6 @@ #include "usd.hh" #include "usd_reader_xform.hh" -struct Main; - namespace blender::io::usd { class USDLightReader : public USDXformReader { diff --git a/source/blender/io/usd/intern/usd_reader_material.cc b/source/blender/io/usd/intern/usd_reader_material.cc index c03568841c1..6fdf561de3b 100644 --- a/source/blender/io/usd/intern/usd_reader_material.cc +++ b/source/blender/io/usd/intern/usd_reader_material.cc @@ -13,7 +13,7 @@ #include "BKE_material.h" #include "BKE_node.hh" #include "BKE_node_tree_update.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "BLI_fileops.h" #include "BLI_map.hh" @@ -24,6 +24,8 @@ #include "DNA_material_types.h" +#include "WM_api.hh" + #include #include #include diff --git a/source/blender/io/usd/intern/usd_reader_mesh.cc b/source/blender/io/usd/intern/usd_reader_mesh.cc index b943a4a4762..651a7dc2a8e 100644 --- a/source/blender/io/usd/intern/usd_reader_mesh.cc +++ b/source/blender/io/usd/intern/usd_reader_mesh.cc @@ -12,17 +12,17 @@ #include "BKE_attribute.hh" #include "BKE_customdata.hh" -#include "BKE_geometry_set.hh" #include "BKE_main.hh" #include "BKE_material.h" #include "BKE_mesh.hh" #include "BKE_object.hh" -#include "BKE_report.hh" +#include "BKE_report.h" -#include "BLI_color.hh" #include "BLI_map.hh" +#include "BLI_math_color.hh" #include "BLI_math_vector_types.hh" #include "BLI_span.hh" +#include "BLI_string.h" #include "DNA_customdata_types.h" #include "DNA_material_types.h" @@ -30,13 +30,15 @@ #include "DNA_object_types.h" #include "DNA_windowmanager_types.h" +#include "WM_api.hh" + #include "MEM_guardedalloc.h" -#include #include #include #include #include +#include #include #include #include @@ -1120,18 +1122,6 @@ Mesh *USDMeshReader::read_mesh(Mesh *existing_mesh, return active_mesh; } -void USDMeshReader::read_geometry(bke::GeometrySet &geometry_set, - const USDMeshReadParams params, - const char **err_str) -{ - Mesh *existing_mesh = geometry_set.get_mesh_for_write(); - Mesh *new_mesh = read_mesh(existing_mesh, params, err_str); - - if (new_mesh != existing_mesh) { - geometry_set.replace_mesh(new_mesh); - } -} - std::string USDMeshReader::get_skeleton_path() const { /* Make sure we can apply UsdSkelBindingAPI to the prim. diff --git a/source/blender/io/usd/intern/usd_reader_mesh.hh b/source/blender/io/usd/intern/usd_reader_mesh.hh index b358057effd..badc57c27ea 100644 --- a/source/blender/io/usd/intern/usd_reader_mesh.hh +++ b/source/blender/io/usd/intern/usd_reader_mesh.hh @@ -11,7 +11,7 @@ #include "usd.hh" #include "usd_reader_geom.hh" -#include +#include "pxr/usd/usdGeom/mesh.h" namespace blender::io::usd { @@ -50,9 +50,9 @@ class USDMeshReader : public USDGeomReader { void create_object(Main *bmain, double motionSampleTime) override; void read_object_data(Main *bmain, double motionSampleTime) override; - void read_geometry(bke::GeometrySet &geometry_set, - USDMeshReadParams params, - const char **err_str) override; + struct Mesh *read_mesh(struct Mesh *existing_mesh, + USDMeshReadParams params, + const char **err_str) override; bool topology_changed(const Mesh *existing_mesh, double motionSampleTime) override; @@ -84,10 +84,6 @@ class USDMeshReader : public USDGeomReader { double motionSampleTime, bool new_mesh); - Mesh *read_mesh(struct Mesh *existing_mesh, - const USDMeshReadParams params, - const char **err_str); - void read_custom_data(const ImportSettings *settings, Mesh *mesh, double motionSampleTime, diff --git a/source/blender/io/usd/intern/usd_reader_nurbs.cc b/source/blender/io/usd/intern/usd_reader_nurbs.cc index 1942ab2aae4..2c4d3b63b66 100644 --- a/source/blender/io/usd/intern/usd_reader_nurbs.cc +++ b/source/blender/io/usd/intern/usd_reader_nurbs.cc @@ -8,7 +8,6 @@ #include "usd_reader_nurbs.hh" #include "BKE_curve.hh" -#include "BKE_geometry_set.hh" #include "BKE_mesh.hh" #include "BKE_object.hh" @@ -19,7 +18,10 @@ #include "MEM_guardedalloc.h" +#include #include +#include +#include #include @@ -166,15 +168,6 @@ void USDNurbsReader::read_curve_sample(Curve *cu, const double motionSampleTime) } } -void USDNurbsReader::read_geometry(bke::GeometrySet &geometry_set, - const USDMeshReadParams params, - const char **err_str) -{ - BLI_assert(geometry_set.has_mesh()); - Mesh *new_mesh = read_mesh(nullptr, params, err_str); - geometry_set.replace_mesh(new_mesh); -} - Mesh *USDNurbsReader::read_mesh(Mesh * /*existing_mesh*/, const USDMeshReadParams params, const char ** /*err_str*/) diff --git a/source/blender/io/usd/intern/usd_reader_nurbs.hh b/source/blender/io/usd/intern/usd_reader_nurbs.hh index b5d38ba48a8..07e5c17b237 100644 --- a/source/blender/io/usd/intern/usd_reader_nurbs.hh +++ b/source/blender/io/usd/intern/usd_reader_nurbs.hh @@ -10,7 +10,7 @@ #include "usd.hh" #include "usd_reader_geom.hh" -#include +#include "pxr/usd/usdGeom/nurbsCurves.h" struct Curve; @@ -39,12 +39,9 @@ class USDNurbsReader : public USDGeomReader { void read_curve_sample(Curve *cu, double motionSampleTime); - void read_geometry(bke::GeometrySet &geometry_set, - USDMeshReadParams params, - const char **err_str) override; - - private: - Mesh *read_mesh(struct Mesh *existing_mesh, USDMeshReadParams params, const char **err_str); + Mesh *read_mesh(struct Mesh *existing_mesh, + USDMeshReadParams params, + const char **err_str) override; }; } // namespace blender::io::usd diff --git a/source/blender/io/usd/intern/usd_reader_pointinstancer.cc b/source/blender/io/usd/intern/usd_reader_pointinstancer.cc index be9b4ed1a34..0a09a779979 100644 --- a/source/blender/io/usd/intern/usd_reader_pointinstancer.cc +++ b/source/blender/io/usd/intern/usd_reader_pointinstancer.cc @@ -5,17 +5,16 @@ #include "usd_reader_pointinstancer.hh" #include "BKE_attribute.hh" +#include "BKE_lib_id.hh" #include "BKE_modifier.hh" -#include "BKE_node.hh" #include "BKE_node_runtime.hh" #include "BKE_node_tree_update.hh" #include "BKE_object.hh" #include "BKE_pointcloud.hh" -#include "BLI_math_quaternion_types.hh" +#include "BLI_math_quaternion.hh" #include "BLI_string.h" #include "DNA_collection_types.h" -#include "DNA_node_types.h" #include diff --git a/source/blender/io/usd/intern/usd_reader_prim.cc b/source/blender/io/usd/intern/usd_reader_prim.cc index af3e3933888..a1230ffde53 100644 --- a/source/blender/io/usd/intern/usd_reader_prim.cc +++ b/source/blender/io/usd/intern/usd_reader_prim.cc @@ -7,7 +7,7 @@ #include "usd_reader_prim.hh" -#include "BLI_assert.h" +#include "BLI_utildefines.h" namespace blender::io::usd { diff --git a/source/blender/io/usd/intern/usd_reader_prim.hh b/source/blender/io/usd/intern/usd_reader_prim.hh index 7e170d993c7..91669fd2627 100644 --- a/source/blender/io/usd/intern/usd_reader_prim.hh +++ b/source/blender/io/usd/intern/usd_reader_prim.hh @@ -22,7 +22,6 @@ struct CacheFile; struct Main; struct Material; struct Object; -struct ReportList; namespace blender::io::usd { diff --git a/source/blender/io/usd/intern/usd_reader_shape.cc b/source/blender/io/usd/intern/usd_reader_shape.cc index 175372c9af0..2af88b907b4 100644 --- a/source/blender/io/usd/intern/usd_reader_shape.cc +++ b/source/blender/io/usd/intern/usd_reader_shape.cc @@ -2,15 +2,18 @@ * * SPDX-License-Identifier: GPL-2.0-or-later */ -#include "BKE_geometry_set.hh" #include "BKE_lib_id.hh" #include "BKE_mesh.hh" +#include "BKE_modifier.hh" #include "BKE_object.hh" -#include "BKE_report.hh" +#include "BKE_report.h" +#include "DNA_cachefile_types.h" #include "DNA_object_types.h" #include "DNA_windowmanager_types.h" +#include "WM_api.hh" + #include "usd_reader_shape.hh" #include @@ -158,18 +161,6 @@ Mesh *USDShapeReader::read_mesh(Mesh *existing_mesh, return active_mesh; } -void USDShapeReader::read_geometry(bke::GeometrySet &geometry_set, - USDMeshReadParams params, - const char **err_str) -{ - Mesh *existing_mesh = geometry_set.get_mesh_for_write(); - Mesh *new_mesh = read_mesh(existing_mesh, params, err_str); - - if (new_mesh != existing_mesh) { - geometry_set.replace_mesh(new_mesh); - } -} - Mesh *USDShapeReader::mesh_from_prim(Mesh *existing_mesh, double motionSampleTime, pxr::VtIntArray &face_indices, diff --git a/source/blender/io/usd/intern/usd_reader_shape.hh b/source/blender/io/usd/intern/usd_reader_shape.hh index 99115f15cac..dfabd921245 100644 --- a/source/blender/io/usd/intern/usd_reader_shape.hh +++ b/source/blender/io/usd/intern/usd_reader_shape.hh @@ -6,6 +6,8 @@ #include "usd.hh" #include "usd_reader_geom.hh" +#include "usd_reader_xform.hh" +#include struct Mesh; @@ -39,8 +41,6 @@ class USDShapeReader : public USDGeomReader { pxr::VtIntArray &face_indices, pxr::VtIntArray &face_counts) const; - Mesh *read_mesh(Mesh *existing_mesh, USDMeshReadParams params, const char ** /*err_str*/); - public: USDShapeReader(const pxr::UsdPrim &prim, const USDImportParams &import_params, @@ -48,10 +48,9 @@ class USDShapeReader : public USDGeomReader { void create_object(Main *bmain, double /*motionSampleTime*/) override; void read_object_data(Main *bmain, double motionSampleTime) override; - void read_geometry(bke::GeometrySet & /*geometry_set*/, - USDMeshReadParams /*params*/, - const char ** /*err_str*/) override; - + Mesh *read_mesh(Mesh *existing_mesh, + USDMeshReadParams params, + const char ** /*err_str*/) override; bool is_time_varying(); virtual bool topology_changed(const Mesh * /*existing_mesh*/, diff --git a/source/blender/io/usd/intern/usd_reader_skeleton.cc b/source/blender/io/usd/intern/usd_reader_skeleton.cc index 9b64b5faf82..163cd2ed897 100644 --- a/source/blender/io/usd/intern/usd_reader_skeleton.cc +++ b/source/blender/io/usd/intern/usd_reader_skeleton.cc @@ -6,11 +6,16 @@ #include "usd_skel_convert.hh" #include "BKE_armature.hh" +#include "BKE_idprop.h" #include "BKE_object.hh" #include "DNA_armature_types.h" #include "DNA_object_types.h" +#include "MEM_guardedalloc.h" + +#include "WM_api.hh" + namespace blender::io::usd { bool USDSkeletonReader::valid() const diff --git a/source/blender/io/usd/intern/usd_reader_stage.cc b/source/blender/io/usd/intern/usd_reader_stage.cc index 88ba434c87e..3d4d5947ba3 100644 --- a/source/blender/io/usd/intern/usd_reader_stage.cc +++ b/source/blender/io/usd/intern/usd_reader_stage.cc @@ -18,10 +18,12 @@ #include "usd_reader_xform.hh" #include +#include #include #include #include #include +#include #include #include #include @@ -43,10 +45,10 @@ #include "BLI_sort.hh" #include "BLI_string.h" -#include "BKE_collection.hh" +#include "BKE_collection.h" #include "BKE_lib_id.hh" #include "BKE_modifier.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "CLG_log.h" diff --git a/source/blender/io/usd/intern/usd_reader_stage.hh b/source/blender/io/usd/intern/usd_reader_stage.hh index 079d5bd6a5c..fc19eaba4ac 100644 --- a/source/blender/io/usd/intern/usd_reader_stage.hh +++ b/source/blender/io/usd/intern/usd_reader_stage.hh @@ -3,22 +3,22 @@ * SPDX-License-Identifier: GPL-2.0-or-later */ #pragma once -#include "BLI_map.hh" +struct Main; + +#include "WM_types.hh" + #include "BLI_set.hh" -#include "BLI_vector.hh" #include "usd.hh" #include "usd_hash_types.hh" #include "usd_reader_prim.hh" +#include #include #include -struct Collection; struct ImportSettings; -struct Main; -struct ReportList; namespace blender::io::usd { @@ -134,8 +134,8 @@ class USDStageReader { * be set to false when converting point instancer * prototype prims, which can be declared as overs. * \param r_readers: Readers created for the prims in the converted subtree. - * \return A pointer to the reader created for the given prim or null if - * the prim cannot be converted. + * \return: A pointer to the reader created for the given prim or null if + * the prim cannot be converted. */ USDPrimReader *collect_readers(const pxr::UsdPrim &prim, const UsdPathSet &pruned_prims, @@ -170,8 +170,8 @@ class USDStageReader { * Iterate over the stage and return the paths of all prototype * primitives references by point instancers. * - * \return The prototype paths, or an empty path set if the scene - * does not contain any point instancers. + * \return: The prototype paths, or an empty path set if the scene + * does not contain any point instancers. */ UsdPathSet collect_point_instancer_proto_paths() const; diff --git a/source/blender/io/usd/intern/usd_reader_volume.hh b/source/blender/io/usd/intern/usd_reader_volume.hh index a2abfc2f97b..7a153b81a90 100644 --- a/source/blender/io/usd/intern/usd_reader_volume.hh +++ b/source/blender/io/usd/intern/usd_reader_volume.hh @@ -6,7 +6,7 @@ #include "usd.hh" #include "usd_reader_xform.hh" -#include +#include "pxr/usd/usdVol/volume.h" namespace blender::io::usd { diff --git a/source/blender/io/usd/intern/usd_reader_xform.cc b/source/blender/io/usd/intern/usd_reader_xform.cc index beee510a1bd..c984143097b 100644 --- a/source/blender/io/usd/intern/usd_reader_xform.cc +++ b/source/blender/io/usd/intern/usd_reader_xform.cc @@ -9,19 +9,25 @@ #include "BKE_constraint.h" #include "BKE_lib_id.hh" +#include "BKE_library.hh" +#include "BKE_modifier.hh" #include "BKE_object.hh" +#include "BLI_math_geom.h" #include "BLI_math_matrix.h" #include "BLI_string.h" +#include "BLI_utildefines.h" #include "DNA_cachefile_types.h" #include "DNA_constraint_types.h" +#include "DNA_modifier_types.h" #include "DNA_object_types.h" +#include "DNA_space_types.h" /* for FILE_MAX */ +#include #include -#include -#include +#include namespace blender::io::usd { diff --git a/source/blender/io/usd/intern/usd_reader_xform.hh b/source/blender/io/usd/intern/usd_reader_xform.hh index 230c5e01312..643ad3869ff 100644 --- a/source/blender/io/usd/intern/usd_reader_xform.hh +++ b/source/blender/io/usd/intern/usd_reader_xform.hh @@ -62,10 +62,10 @@ class USDXformReader : public USDPrimReader { * * \param time: Time code for evaluating the transform. * - * \return Optional tuple with the following elements: - * - The transform matrix. - * - A boolean flag indicating whether the matrix - * is constant over time. + * \return: Optional tuple with the following elements: + * - The transform matrix. + * - A boolean flag indicating whether the matrix + * is constant over time. */ virtual std::optional get_local_usd_xform(float time) const; }; diff --git a/source/blender/io/usd/intern/usd_skel_convert.cc b/source/blender/io/usd/intern/usd_skel_convert.cc index dafc1c2b8bb..1c5571dd46c 100644 --- a/source/blender/io/usd/intern/usd_skel_convert.cc +++ b/source/blender/io/usd/intern/usd_skel_convert.cc @@ -4,10 +4,12 @@ #include "usd_skel_convert.hh" +#include "usd.hh" #include "usd_armature_utils.hh" #include "usd_blend_shape_utils.hh" #include "usd_hash_types.hh" +#include #include #include #include @@ -20,16 +22,22 @@ #include "DNA_armature_types.h" #include "DNA_key_types.h" #include "DNA_meshdata_types.h" +#include "DNA_meta_types.h" +#include "DNA_scene_types.h" #include "BKE_action.h" #include "BKE_armature.hh" +#include "BKE_attribute.hh" #include "BKE_deform.hh" -#include "BKE_fcurve.hh" +#include "BKE_fcurve.h" #include "BKE_key.hh" +#include "BKE_lib_id.hh" #include "BKE_mesh.hh" +#include "BKE_mesh_runtime.hh" #include "BKE_modifier.hh" +#include "BKE_object.hh" #include "BKE_object_deform.h" -#include "BKE_report.hh" +#include "BKE_report.h" #include "BLI_map.hh" #include "BLI_math_vector.h" @@ -39,6 +47,7 @@ #include "BLI_vector.hh" #include "ED_armature.hh" +#include "ED_keyframing.hh" #include "ED_mesh.hh" #include "ANIM_animdata.hh" @@ -1238,7 +1247,7 @@ void shape_key_export_chaser(pxr::UsdStageRefPtr stage, void export_deform_verts(const Mesh *mesh, const pxr::UsdSkelBindingAPI &skel_api, - const Span bone_names) + const Vector &bone_names) { BLI_assert(mesh); BLI_assert(skel_api); @@ -1302,7 +1311,7 @@ void export_deform_verts(const Mesh *mesh, continue; } - int def_nr = int(vert.dw[j].def_nr); + int def_nr = static_cast(vert.dw[j].def_nr); if (def_nr >= joint_index.size()) { BLI_assert_unreachable(); diff --git a/source/blender/io/usd/intern/usd_skel_convert.hh b/source/blender/io/usd/intern/usd_skel_convert.hh index 86cc77b2887..73291bdd31a 100644 --- a/source/blender/io/usd/intern/usd_skel_convert.hh +++ b/source/blender/io/usd/intern/usd_skel_convert.hh @@ -6,16 +6,18 @@ #include "BLI_map.hh" #include "BLI_vector.hh" +#include "DNA_windowmanager_types.h" + #include #include #include +#include struct Depsgraph; struct Key; struct Main; struct Mesh; struct Object; -struct ReportList; namespace blender::io::usd { @@ -141,6 +143,6 @@ void shape_key_export_chaser(pxr::UsdStageRefPtr stage, */ void export_deform_verts(const Mesh *mesh, const pxr::UsdSkelBindingAPI &skel_api, - Span bone_names); + const Vector &bone_names); } // namespace blender::io::usd diff --git a/source/blender/io/usd/intern/usd_skel_root_utils.cc b/source/blender/io/usd/intern/usd_skel_root_utils.cc index d579e95c138..dedbb8cfde2 100644 --- a/source/blender/io/usd/intern/usd_skel_root_utils.cc +++ b/source/blender/io/usd/intern/usd_skel_root_utils.cc @@ -9,7 +9,7 @@ #include #include -#include "BKE_report.hh" +#include "BKE_report.h" #include "WM_types.hh" diff --git a/source/blender/io/usd/intern/usd_skel_root_utils.hh b/source/blender/io/usd/intern/usd_skel_root_utils.hh index a9fc75c3709..0a81c91c7c1 100644 --- a/source/blender/io/usd/intern/usd_skel_root_utils.hh +++ b/source/blender/io/usd/intern/usd_skel_root_utils.hh @@ -5,7 +5,7 @@ #include "usd.hh" -#include +#include namespace blender::io::usd { diff --git a/source/blender/io/usd/intern/usd_writer_abstract.cc b/source/blender/io/usd/intern/usd_writer_abstract.cc index f9a7a9efb93..22e1a299027 100644 --- a/source/blender/io/usd/intern/usd_writer_abstract.cc +++ b/source/blender/io/usd/intern/usd_writer_abstract.cc @@ -9,7 +9,7 @@ #include #include "BKE_customdata.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "BLI_assert.h" diff --git a/source/blender/io/usd/intern/usd_writer_abstract.hh b/source/blender/io/usd/intern/usd_writer_abstract.hh index 76c228a55f3..9f4ec5347da 100644 --- a/source/blender/io/usd/intern/usd_writer_abstract.hh +++ b/source/blender/io/usd/intern/usd_writer_abstract.hh @@ -7,19 +7,21 @@ #include "usd_exporter_context.hh" #include -#include +#include #include #include #include +#include + +#include "DEG_depsgraph_query.hh" + #include "WM_types.hh" #include "DNA_material_types.h" - -#include +#include "DNA_windowmanager_types.h" struct Material; -struct ReportList; namespace blender::io::usd { diff --git a/source/blender/io/usd/intern/usd_writer_armature.cc b/source/blender/io/usd/intern/usd_writer_armature.cc index 34ec8b45436..efddcf3839b 100644 --- a/source/blender/io/usd/intern/usd_writer_armature.cc +++ b/source/blender/io/usd/intern/usd_writer_armature.cc @@ -4,16 +4,24 @@ #include "usd_writer_armature.hh" #include "usd_armature_utils.hh" +#include "usd_hierarchy_iterator.hh" +#include "usd_writer_transform.hh" #include "BKE_action.h" +#include "BKE_armature.hh" #include "DNA_armature_types.h" +#include "ED_armature.hh" + #include #include #include #include #include +#include + +#include #include "CLG_log.h" static CLG_LogRef LOG = {"io.usd"}; diff --git a/source/blender/io/usd/intern/usd_writer_armature.hh b/source/blender/io/usd/intern/usd_writer_armature.hh index a81ee28d0fc..fac03426a03 100644 --- a/source/blender/io/usd/intern/usd_writer_armature.hh +++ b/source/blender/io/usd/intern/usd_writer_armature.hh @@ -8,6 +8,7 @@ #include "BLI_map.hh" struct Bone; +struct Object; namespace blender::io::usd { diff --git a/source/blender/io/usd/intern/usd_writer_camera.cc b/source/blender/io/usd/intern/usd_writer_camera.cc index d6d4692b44f..e080b9c6790 100644 --- a/source/blender/io/usd/intern/usd_writer_camera.cc +++ b/source/blender/io/usd/intern/usd_writer_camera.cc @@ -10,8 +10,6 @@ #include "BKE_camera.h" #include "BLI_assert.h" -#include "DEG_depsgraph_query.hh" - #include "DNA_camera_types.h" #include "DNA_scene_types.h" @@ -21,7 +19,7 @@ USDCameraWriter::USDCameraWriter(const USDExporterContext &ctx) : USDAbstractWri bool USDCameraWriter::is_supported(const HierarchyContext *context) const { - const Camera *camera = static_cast(context->object->data); + Camera *camera = static_cast(context->object->data); return camera->type == CAM_PERSP; } @@ -61,7 +59,7 @@ void USDCameraWriter::do_write(HierarchyContext &context) pxr::UsdGeomCamera usd_camera = pxr::UsdGeomCamera::Define(usd_export_context_.stage, usd_export_context_.usd_path); - const Camera *camera = static_cast(context.object->data); + Camera *camera = static_cast(context.object->data); Scene *scene = DEG_get_evaluated_scene(usd_export_context_.depsgraph); usd_camera.CreateProjectionAttr().Set(pxr::UsdGeomTokens->perspective); diff --git a/source/blender/io/usd/intern/usd_writer_curves.cc b/source/blender/io/usd/intern/usd_writer_curves.cc index 3554d608bd7..6f871c2db97 100644 --- a/source/blender/io/usd/intern/usd_writer_curves.cc +++ b/source/blender/io/usd/intern/usd_writer_curves.cc @@ -19,13 +19,16 @@ #include "BKE_curves.hh" #include "BKE_lib_id.hh" #include "BKE_material.h" -#include "BKE_report.hh" +#include "BKE_report.h" -#include "BLT_translation.hh" +#include "BLI_math_geom.h" +#include "BLT_translation.h" #include "RNA_access.hh" #include "RNA_enum_types.hh" +#include "WM_api.hh" + namespace blender::io::usd { USDCurvesWriter::USDCurvesWriter(const USDExporterContext &ctx) : USDAbstractWriter(ctx) {} @@ -213,8 +216,10 @@ static void populate_curve_verts_for_bezier(const bke::CurvesGeometry &geometry, positions[last_point_index][1], positions[last_point_index][2])); - /* For USD periodic bezier curves, since the curve is closed, we need to include - * the right handle of the last point and the left handle of the first point. + /* For USD representation of periodic bezier curve, one of the curve's points must be + * repeated to close the curve. The repeated point is the first point. Since the curve is + * closed, we now need to include the right handle of the last point and the left handle of + * the first point. */ if (is_cyclic) { const blender::float3 right_handle = handles_r[last_point_index]; @@ -222,6 +227,10 @@ static void populate_curve_verts_for_bezier(const bke::CurvesGeometry &geometry, const blender::float3 left_handle = handles_l[start_point_index]; verts.push_back(pxr::GfVec3f(left_handle[0], left_handle[1], left_handle[2])); + + verts.push_back(pxr::GfVec3f(positions[start_point_index][0], + positions[start_point_index][1], + positions[start_point_index][2])); } const int tot_points = verts.size() - start_verts_count; diff --git a/source/blender/io/usd/intern/usd_writer_curves.hh b/source/blender/io/usd/intern/usd_writer_curves.hh index 09924b11283..a1a46cbcac5 100644 --- a/source/blender/io/usd/intern/usd_writer_curves.hh +++ b/source/blender/io/usd/intern/usd_writer_curves.hh @@ -3,9 +3,12 @@ * SPDX-License-Identifier: GPL-2.0-or-later */ #pragma once +#include + +#include "DNA_curves_types.h" #include "usd_writer_abstract.hh" -#include +#include namespace blender::io::usd { diff --git a/source/blender/io/usd/intern/usd_writer_light.cc b/source/blender/io/usd/intern/usd_writer_light.cc index 4db0ac7341e..5d8c07d2dec 100644 --- a/source/blender/io/usd/intern/usd_writer_light.cc +++ b/source/blender/io/usd/intern/usd_writer_light.cc @@ -12,8 +12,10 @@ #include "BLI_assert.h" #include "BLI_math_rotation.h" +#include "BLI_utildefines.h" #include "DNA_light_types.h" +#include "DNA_object_types.h" namespace blender::io::usd { diff --git a/source/blender/io/usd/intern/usd_writer_material.cc b/source/blender/io/usd/intern/usd_writer_material.cc index 83be0ac1382..5e566a4481b 100644 --- a/source/blender/io/usd/intern/usd_writer_material.cc +++ b/source/blender/io/usd/intern/usd_writer_material.cc @@ -4,6 +4,7 @@ #include "usd_writer_material.hh" +#include "usd.hh" #include "usd_exporter_context.hh" #include "usd_hook.hh" @@ -12,11 +13,12 @@ #include "BKE_main.hh" #include "BKE_node.hh" #include "BKE_node_runtime.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "IMB_colormanagement.hh" #include "BLI_fileops.h" +#include "BLI_linklist.h" #include "BLI_listbase.h" #include "BLI_map.hh" #include "BLI_memory_utils.hh" @@ -25,13 +27,14 @@ #include "BLI_string_utils.hh" #include "DNA_material_types.h" -#include "DNA_node_types.h" #include "MEM_guardedalloc.h" -#include "WM_types.hh" +#include "WM_api.hh" #include +#include +#include #include "CLG_log.h" static CLG_LogRef LOG = {"io.usd"}; diff --git a/source/blender/io/usd/intern/usd_writer_material.hh b/source/blender/io/usd/intern/usd_writer_material.hh index 07409d8fbd8..98b3cf4a045 100644 --- a/source/blender/io/usd/intern/usd_writer_material.hh +++ b/source/blender/io/usd/intern/usd_writer_material.hh @@ -3,6 +3,9 @@ * SPDX-License-Identifier: GPL-2.0-or-later */ #pragma once +#include +#include +#include #include #include diff --git a/source/blender/io/usd/intern/usd_writer_mesh.cc b/source/blender/io/usd/intern/usd_writer_mesh.cc index b89fae3f198..93a5c958fe3 100644 --- a/source/blender/io/usd/intern/usd_writer_mesh.cc +++ b/source/blender/io/usd/intern/usd_writer_mesh.cc @@ -5,33 +5,50 @@ #include "usd_armature_utils.hh" #include "usd_blend_shape_utils.hh" +#include "usd_hierarchy_iterator.hh" #include "usd_skel_convert.hh" +#include "usd_writer_armature.hh" +#include #include #include #include #include +#include #include +#include #include "BLI_array_utils.hh" #include "BLI_assert.h" -#include "BLI_color.hh" +#include "BLI_math_color.hh" #include "BLI_math_quaternion_types.hh" +#include "BLI_math_vector.h" #include "BLI_math_vector_types.hh" +#include "BKE_armature.hh" #include "BKE_attribute.hh" #include "BKE_customdata.hh" +#include "BKE_deform.hh" +#include "BKE_key.hh" #include "BKE_lib_id.hh" #include "BKE_material.h" #include "BKE_mesh.hh" +#include "BKE_mesh_runtime.hh" #include "BKE_mesh_wrapper.hh" +#include "BKE_modifier.hh" #include "BKE_object.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "DEG_depsgraph.hh" +#include "DNA_armature_types.h" #include "DNA_key_types.h" +#include "DNA_layer_types.h" #include "DNA_modifier_types.h" +#include "DNA_object_fluidsim_types.h" +#include "DNA_particle_types.h" + +#include "WM_api.hh" #include "CLG_log.h" static CLG_LogRef LOG = {"io.usd"}; diff --git a/source/blender/io/usd/intern/usd_writer_mesh.hh b/source/blender/io/usd/intern/usd_writer_mesh.hh index 445250b9822..8c482cfa79a 100644 --- a/source/blender/io/usd/intern/usd_writer_mesh.hh +++ b/source/blender/io/usd/intern/usd_writer_mesh.hh @@ -3,6 +3,7 @@ * SPDX-License-Identifier: GPL-2.0-or-later */ #pragma once +#include "DNA_modifier_types.h" #include "usd_writer_abstract.hh" #include "BLI_map.hh" @@ -10,7 +11,6 @@ #include struct Key; -struct SubsurfModifierData; namespace blender::bke { class AttributeIDRef; diff --git a/source/blender/io/usd/intern/usd_writer_metaball.cc b/source/blender/io/usd/intern/usd_writer_metaball.cc index 896e663d0e5..b69b69fa053 100644 --- a/source/blender/io/usd/intern/usd_writer_metaball.cc +++ b/source/blender/io/usd/intern/usd_writer_metaball.cc @@ -2,16 +2,22 @@ * * SPDX-License-Identifier: GPL-2.0-or-later */ #include "usd_writer_metaball.hh" -#include "usd_exporter_context.hh" +#include "usd_hierarchy_iterator.hh" +#include +#include +#include + +#include "BLI_assert.h" + +#include "BKE_displist.h" #include "BKE_lib_id.hh" #include "BKE_mball.hh" #include "BKE_mesh.hh" #include "BKE_object.hh" -#include "DEG_depsgraph_query.hh" - #include "DNA_mesh_types.h" +#include "DNA_meta_types.h" namespace blender::io::usd { diff --git a/source/blender/io/usd/intern/usd_writer_transform.cc b/source/blender/io/usd/intern/usd_writer_transform.cc index 95076694aff..2f68da36bb5 100644 --- a/source/blender/io/usd/intern/usd_writer_transform.cc +++ b/source/blender/io/usd/intern/usd_writer_transform.cc @@ -4,7 +4,6 @@ #include "usd_writer_transform.hh" #include "usd_hierarchy_iterator.hh" -#include #include #include @@ -12,6 +11,8 @@ #include "BLI_math_matrix.h" +#include "DNA_layer_types.h" + namespace blender::io::usd { USDTransformWriter::USDTransformWriter(const USDExporterContext &ctx) : USDAbstractWriter(ctx) {} diff --git a/source/blender/io/usd/intern/usd_writer_volume.cc b/source/blender/io/usd/intern/usd_writer_volume.cc index e93c1a0048a..d6e80e6cfda 100644 --- a/source/blender/io/usd/intern/usd_writer_volume.cc +++ b/source/blender/io/usd/intern/usd_writer_volume.cc @@ -3,7 +3,6 @@ * SPDX-License-Identifier: GPL-2.0-or-later */ #include "usd_writer_volume.hh" -#include "usd_hierarchy_iterator.hh" #include #include @@ -12,16 +11,19 @@ #include "DNA_volume_types.h" #include "DNA_windowmanager_types.h" -#include "BKE_report.hh" +#include "BKE_report.h" #include "BKE_volume.hh" #include "BLI_fileops.h" #include "BLI_index_range.hh" #include "BLI_math_base.h" -#include "BLI_math_vector_types.hh" #include "BLI_path_util.h" #include "BLI_string.h" +#include "WM_api.hh" + +#include "usd_hierarchy_iterator.hh" + namespace blender::io::usd { USDVolumeWriter::USDVolumeWriter(const USDExporterContext &ctx) : USDAbstractWriter(ctx) {} diff --git a/source/blender/io/usd/intern/usd_writer_volume.hh b/source/blender/io/usd/intern/usd_writer_volume.hh index 4d5ec93600e..c37ca3f6fe8 100644 --- a/source/blender/io/usd/intern/usd_writer_volume.hh +++ b/source/blender/io/usd/intern/usd_writer_volume.hh @@ -5,6 +5,7 @@ #include +#include "BLI_math_vector_types.hh" #include "usd_writer_abstract.hh" struct Volume; diff --git a/source/blender/io/usd/tests/usd_curves_test.cc b/source/blender/io/usd/tests/usd_curves_test.cc index 894d012ccc1..c1979c4fbca 100644 --- a/source/blender/io/usd/tests/usd_curves_test.cc +++ b/source/blender/io/usd/tests/usd_curves_test.cc @@ -27,11 +27,11 @@ #include "BKE_lib_id.hh" #include "BKE_main.hh" #include "BKE_mesh.hh" -#include "BKE_node.hh" +#include "BKE_node.h" #include "BLI_fileops.h" #include "BLI_math_vector_types.hh" #include "BLI_path_util.h" -#include "BLO_readfile.hh" +#include "BLO_readfile.h" #include "BKE_node_runtime.hh" @@ -127,7 +127,7 @@ TEST_F(UsdCurvesTest, usd_export_curves) std::string prim_name = pxr::TfMakeValidIdentifier("BezierCircle"); pxr::UsdPrim test_prim = stage->GetPrimAtPath(pxr::SdfPath("/BezierCircle/" + prim_name)); EXPECT_TRUE(test_prim.IsValid()); - check_bezier_curve(test_prim, true, 12); + check_bezier_curve(test_prim, true, 13); } { diff --git a/source/blender/io/usd/tests/usd_export_test.cc b/source/blender/io/usd/tests/usd_export_test.cc index 8711f8ad6c4..73b779dee4a 100644 --- a/source/blender/io/usd/tests/usd_export_test.cc +++ b/source/blender/io/usd/tests/usd_export_test.cc @@ -28,7 +28,7 @@ #include "BLI_fileops.h" #include "BLI_math_vector_types.hh" #include "BLI_path_util.h" -#include "BLO_readfile.hh" +#include "BLO_readfile.h" #include "BKE_node_runtime.hh" diff --git a/source/blender/io/usd/tests/usd_usdz_export_test.cc b/source/blender/io/usd/tests/usd_usdz_export_test.cc index a03ff00e75c..58c9debed37 100644 --- a/source/blender/io/usd/tests/usd_usdz_export_test.cc +++ b/source/blender/io/usd/tests/usd_usdz_export_test.cc @@ -13,7 +13,7 @@ #include "BKE_main.hh" #include "BLI_fileops.h" #include "BLI_path_util.h" -#include "BLO_readfile.hh" +#include "BLO_readfile.h" #include "DEG_depsgraph.hh" diff --git a/source/blender/io/usd/usd.hh b/source/blender/io/usd/usd.hh index e6228079a63..ae2fd69287d 100644 --- a/source/blender/io/usd/usd.hh +++ b/source/blender/io/usd/usd.hh @@ -19,10 +19,6 @@ struct Object; struct ReportList; struct wmJobWorkerStatus; -namespace blender::bke { -struct GeometrySet; -} - namespace blender::io::usd { /** @@ -165,7 +161,7 @@ bool USD_import(bContext *C, bool as_background_job, ReportList *reports); -int USD_get_version(); +int USD_get_version(void); /* USD Import and Mesh Cache interface. */ @@ -176,11 +172,11 @@ void USD_free_handle(CacheArchiveHandle *handle); void USD_get_transform(CacheReader *reader, float r_mat[4][4], float time, float scale); /** Either modifies current_mesh in-place or constructs a new mesh. */ -void USD_read_geometry(CacheReader *reader, - Object *ob, - blender::bke::GeometrySet &geometry_set, - USDMeshReadParams params, - const char **err_str); +Mesh *USD_read_mesh(CacheReader *reader, + Object *ob, + Mesh *existing_mesh, + USDMeshReadParams params, + const char **err_str); bool USD_mesh_topology_changed(CacheReader *reader, const Object *ob, diff --git a/source/blender/io/usd/usd_private.hh b/source/blender/io/usd/usd_private.hh index b72f91fd065..357bce7ac4e 100644 --- a/source/blender/io/usd/usd_private.hh +++ b/source/blender/io/usd/usd_private.hh @@ -4,7 +4,7 @@ #pragma once -#include +#include #include "usd.hh" diff --git a/source/blender/io/wavefront_obj/IO_wavefront_obj.hh b/source/blender/io/wavefront_obj/IO_wavefront_obj.hh index 367e4513ee2..0c2ffdb20f2 100644 --- a/source/blender/io/wavefront_obj/IO_wavefront_obj.hh +++ b/source/blender/io/wavefront_obj/IO_wavefront_obj.hh @@ -10,14 +10,13 @@ #include "BLI_path_util.h" +#include "BKE_context.hh" + #include "DEG_depsgraph.hh" #include "IO_orientation.hh" #include "IO_path_util_types.hh" -struct bContext; -struct ReportList; - struct OBJExportParams { /** Full path to the destination .OBJ file. */ char filepath[FILE_MAX]; diff --git a/source/blender/io/wavefront_obj/exporter/obj_export_file_writer.cc b/source/blender/io/wavefront_obj/exporter/obj_export_file_writer.cc index 6766031fb3c..c04cdbd1db6 100644 --- a/source/blender/io/wavefront_obj/exporter/obj_export_file_writer.cc +++ b/source/blender/io/wavefront_obj/exporter/obj_export_file_writer.cc @@ -676,8 +676,8 @@ void MTLWriter::write_materials(const char *blen_filepath, return; } - char blen_filedir[FILE_MAX]; - BLI_path_split_dir_part(blen_filepath, blen_filedir, sizeof(blen_filedir)); + char blen_filedir[PATH_MAX]; + BLI_path_split_dir_part(blen_filepath, blen_filedir, PATH_MAX); BLI_path_slash_native(blen_filedir); BLI_path_normalize(blen_filedir); diff --git a/source/blender/io/wavefront_obj/exporter/obj_export_mesh.cc b/source/blender/io/wavefront_obj/exporter/obj_export_mesh.cc index 92fc636cade..2f552532909 100644 --- a/source/blender/io/wavefront_obj/exporter/obj_export_mesh.cc +++ b/source/blender/io/wavefront_obj/exporter/obj_export_mesh.cc @@ -154,7 +154,7 @@ void OBJMesh::set_world_axes_transform(const Object &obj_eval, /* +Y-forward and +Z-up are the default Blender axis settings. */ mat3_from_axis_conversion(forward, up, IO_AXIS_Y, IO_AXIS_Z, axes_transform.ptr()); - const float4x4 &object_to_world = obj_eval.object_to_world(); + const float4x4 object_to_world(obj_eval.object_to_world); const float3x3 transform = axes_transform * float3x3(object_to_world); world_and_axes_transform_ = float4x4(transform); diff --git a/source/blender/io/wavefront_obj/exporter/obj_export_nurbs.cc b/source/blender/io/wavefront_obj/exporter/obj_export_nurbs.cc index 0c93a3874c7..8c848a0da17 100644 --- a/source/blender/io/wavefront_obj/exporter/obj_export_nurbs.cc +++ b/source/blender/io/wavefront_obj/exporter/obj_export_nurbs.cc @@ -35,11 +35,10 @@ void OBJCurve::set_world_axes_transform(const eIOAxis forward, const eIOAxis up) unit_m3(axes_transform); /* +Y-forward and +Z-up are the Blender's default axis settings. */ mat3_from_axis_conversion(forward, up, IO_AXIS_Y, IO_AXIS_Z, axes_transform); - mul_m4_m3m4(world_axes_transform_, axes_transform, export_object_eval_->object_to_world().ptr()); + mul_m4_m3m4(world_axes_transform_, axes_transform, export_object_eval_->object_to_world); /* #mul_m4_m3m4 does not transform last row of #Object.object_to_world, i.e. location data. */ - mul_v3_m3v3( - world_axes_transform_[3], axes_transform, export_object_eval_->object_to_world().location()); - world_axes_transform_[3][3] = export_object_eval_->object_to_world()[3][3]; + mul_v3_m3v3(world_axes_transform_[3], axes_transform, export_object_eval_->object_to_world[3]); + world_axes_transform_[3][3] = export_object_eval_->object_to_world[3][3]; } const char *OBJCurve::get_curve_name() const diff --git a/source/blender/io/wavefront_obj/exporter/obj_export_nurbs.hh b/source/blender/io/wavefront_obj/exporter/obj_export_nurbs.hh index 6dbc81f7fbd..7642bd12d34 100644 --- a/source/blender/io/wavefront_obj/exporter/obj_export_nurbs.hh +++ b/source/blender/io/wavefront_obj/exporter/obj_export_nurbs.hh @@ -33,7 +33,7 @@ class OBJCurve : NonCopyable { int total_splines() const; /** * \param spline_index: Zero-based index of spline of interest. - * \return Total vertices in a spline. + * \return: Total vertices in a spline. */ int total_spline_vertices(int spline_index) const; /** diff --git a/source/blender/io/wavefront_obj/exporter/obj_exporter.cc b/source/blender/io/wavefront_obj/exporter/obj_exporter.cc index 641fadb3d3f..0cf4db22841 100644 --- a/source/blender/io/wavefront_obj/exporter/obj_exporter.cc +++ b/source/blender/io/wavefront_obj/exporter/obj_exporter.cc @@ -11,8 +11,8 @@ #include #include "BKE_context.hh" -#include "BKE_report.hh" -#include "BKE_scene.hh" +#include "BKE_report.h" +#include "BKE_scene.h" #include "BLI_path_util.h" #include "BLI_string.h" @@ -290,9 +290,9 @@ void export_frame(Depsgraph *depsgraph, const OBJExportParams &export_params, co write_mesh_objects(exportable_as_mesh, *frame_writer, mtl_writer.get(), export_params); if (mtl_writer) { mtl_writer->write_header(export_params.blen_filepath); - char dest_dir[FILE_MAX]; + char dest_dir[PATH_MAX]; if (export_params.file_base_for_tests[0] == '\0') { - BLI_path_split_dir_part(export_params.filepath, dest_dir, sizeof(dest_dir)); + BLI_path_split_dir_part(export_params.filepath, dest_dir, PATH_MAX); } else { STRNCPY(dest_dir, export_params.file_base_for_tests); diff --git a/source/blender/io/wavefront_obj/importer/importer_mesh_utils.cc b/source/blender/io/wavefront_obj/importer/importer_mesh_utils.cc index 7e1191c8725..9391d130c72 100644 --- a/source/blender/io/wavefront_obj/importer/importer_mesh_utils.cc +++ b/source/blender/io/wavefront_obj/importer/importer_mesh_utils.cc @@ -14,6 +14,7 @@ #include "BLI_math_matrix.h" #include "BLI_math_rotation.h" #include "BLI_math_vector.h" +#include "BLI_set.hh" #include "DNA_object_types.h" @@ -21,8 +22,6 @@ #include "importer_mesh_utils.hh" -#include - namespace blender::io::obj { Vector> fixup_invalid_face(Span vert_positions, Span face_verts) diff --git a/source/blender/io/wavefront_obj/importer/obj_import_file_reader.cc b/source/blender/io/wavefront_obj/importer/obj_import_file_reader.cc index 75b16432f38..920174313dd 100644 --- a/source/blender/io/wavefront_obj/importer/obj_import_file_reader.cc +++ b/source/blender/io/wavefront_obj/importer/obj_import_file_reader.cc @@ -6,12 +6,11 @@ * \ingroup obj */ -#include "BKE_report.hh" +#include "BKE_report.h" -#include "BLI_fileops.hh" #include "BLI_map.hh" +#include "BLI_math_color.h" #include "BLI_math_vector.h" -#include "BLI_math_vector_types.hh" #include "BLI_string.h" #include "BLI_string_ref.hh" #include "BLI_vector.hh" @@ -487,7 +486,7 @@ static bool parse_keyword(const char *&p, const char *end, StringRef keyword) /* Special case: if there were no faces/edges in any geometries, * treat all the vertices as a point cloud. */ static void use_all_vertices_if_no_faces(Geometry *geom, - const Span> all_geometries, + const Vector> &all_geometries, const GlobalVertices &global_vertices) { if (!global_vertices.vertices.is_empty() && geom && geom->geom_type_ == GEOM_MESH) { diff --git a/source/blender/io/wavefront_obj/importer/obj_import_file_reader.hh b/source/blender/io/wavefront_obj/importer/obj_import_file_reader.hh index 025c7c6fedc..d130fed6a7d 100644 --- a/source/blender/io/wavefront_obj/importer/obj_import_file_reader.hh +++ b/source/blender/io/wavefront_obj/importer/obj_import_file_reader.hh @@ -8,17 +8,13 @@ #pragma once +#include "BLI_fileops.hh" #include "IO_wavefront_obj.hh" - -#include "BLI_map.hh" -#include "BLI_vector.hh" - +#include "obj_import_mtl.hh" #include "obj_import_objects.hh" namespace blender::io::obj { -struct MTLMaterial; - /* NOTE: the OBJ parser implementation is planned to get fairly large changes "soon", * so don't read too much into current implementation... */ class OBJParser { diff --git a/source/blender/io/wavefront_obj/importer/obj_import_mesh.cc b/source/blender/io/wavefront_obj/importer/obj_import_mesh.cc index 60557a101bb..5c05e9ef68c 100644 --- a/source/blender/io/wavefront_obj/importer/obj_import_mesh.cc +++ b/source/blender/io/wavefront_obj/importer/obj_import_mesh.cc @@ -8,13 +8,13 @@ #include -#include "DNA_customdata_types.h" #include "DNA_material_types.h" #include "DNA_meshdata_types.h" +#include "DNA_scene_types.h" #include "BKE_attribute.hh" +#include "BKE_customdata.hh" #include "BKE_deform.hh" -#include "BKE_lib_id.hh" #include "BKE_material.h" #include "BKE_mesh.hh" #include "BKE_node_tree_update.hh" @@ -261,7 +261,7 @@ void MeshFromGeometry::create_edges(Mesh *mesh) int2 &dst_edge = edges[i]; dst_edge[0] = mesh_geometry_.global_to_local_vertices_.lookup_default(src_edge[0], 0); dst_edge[1] = mesh_geometry_.global_to_local_vertices_.lookup_default(src_edge[1], 0); - BLI_assert(dst_edge[0] < total_verts && dst_edge[1] < total_verts); + BLI_assert(dst_edge[0] < total_verts && dst_edge[0] < total_verts); } /* Set argument `update` to true so that existing, explicitly imported edges can be merged diff --git a/source/blender/io/wavefront_obj/importer/obj_import_mesh.hh b/source/blender/io/wavefront_obj/importer/obj_import_mesh.hh index 7a1cc1f8525..d05caca162d 100644 --- a/source/blender/io/wavefront_obj/importer/obj_import_mesh.hh +++ b/source/blender/io/wavefront_obj/importer/obj_import_mesh.hh @@ -8,14 +8,14 @@ #pragma once +#include "BKE_lib_id.hh" + #include "BLI_utility_mixins.hh" #include "obj_import_mtl.hh" #include "obj_import_objects.hh" -struct Main; struct Material; -struct Object; namespace blender::io::obj { diff --git a/source/blender/io/wavefront_obj/importer/obj_import_mtl.cc b/source/blender/io/wavefront_obj/importer/obj_import_mtl.cc index 2c397d991df..aea744ca21d 100644 --- a/source/blender/io/wavefront_obj/importer/obj_import_mtl.cc +++ b/source/blender/io/wavefront_obj/importer/obj_import_mtl.cc @@ -10,6 +10,7 @@ #include "BKE_main.hh" #include "BKE_node.hh" +#include "BLI_map.hh" #include "BLI_math_vector.h" #include "BLI_path_util.h" #include "BLI_string.h" @@ -21,6 +22,7 @@ #include "obj_export_mtl.hh" #include "obj_import_mtl.hh" +#include "obj_import_string_utils.hh" #include diff --git a/source/blender/io/wavefront_obj/importer/obj_import_mtl.hh b/source/blender/io/wavefront_obj/importer/obj_import_mtl.hh index fb4dff6e15b..b5bbbe7ff2b 100644 --- a/source/blender/io/wavefront_obj/importer/obj_import_mtl.hh +++ b/source/blender/io/wavefront_obj/importer/obj_import_mtl.hh @@ -4,7 +4,8 @@ #pragma once -struct bNodeTree; +#include "DNA_node_types.h" + struct Main; struct Material; diff --git a/source/blender/io/wavefront_obj/importer/obj_import_objects.hh b/source/blender/io/wavefront_obj/importer/obj_import_objects.hh index 31a21d3cd58..d1a0a64472a 100644 --- a/source/blender/io/wavefront_obj/importer/obj_import_objects.hh +++ b/source/blender/io/wavefront_obj/importer/obj_import_objects.hh @@ -8,6 +8,8 @@ #pragma once +#include "BKE_lib_id.hh" + #include "BLI_map.hh" #include "BLI_math_base.hh" #include "BLI_math_vector_types.hh" diff --git a/source/blender/io/wavefront_obj/importer/obj_importer.cc b/source/blender/io/wavefront_obj/importer/obj_importer.cc index e68918b4ab5..44c8b73016f 100644 --- a/source/blender/io/wavefront_obj/importer/obj_importer.cc +++ b/source/blender/io/wavefront_obj/importer/obj_importer.cc @@ -9,6 +9,7 @@ #include #include "BLI_map.hh" +#include "BLI_math_vector_types.hh" #include "BLI_set.hh" #include "BLI_sort.hh" #include "BLI_string.h" @@ -16,6 +17,7 @@ #include "BKE_context.hh" #include "BKE_layer.hh" +#include "BKE_scene.h" #include "DEG_depsgraph_build.hh" @@ -130,7 +132,7 @@ static void geometry_to_blender_objects(Main *bmain, DEG_id_tag_update_ex(bmain, &obj->id, flags); } for (Collection *col : collections) { - DEG_id_tag_update(&col->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&col->id, ID_RECALC_COPY_ON_WRITE); } DEG_id_tag_update(&scene->id, ID_RECALC_BASE_FLAGS); diff --git a/source/blender/io/wavefront_obj/tests/obj_exporter_tests.cc b/source/blender/io/wavefront_obj/tests/obj_exporter_tests.cc index a59fb8a7d7c..ce382e6d4c5 100644 --- a/source/blender/io/wavefront_obj/tests/obj_exporter_tests.cc +++ b/source/blender/io/wavefront_obj/tests/obj_exporter_tests.cc @@ -21,7 +21,7 @@ #include "BLI_string_utf8.h" #include "BLI_vector.hh" -#include "BLO_readfile.hh" +#include "BLO_readfile.h" #include "DEG_depsgraph.hh" @@ -143,7 +143,7 @@ class ObjExporterWriterTest : public testing::Test { protected: void SetUp() override { - BKE_tempdir_init(nullptr); + BKE_tempdir_init(""); } void TearDown() override diff --git a/source/blender/io/wavefront_obj/tests/obj_importer_tests.cc b/source/blender/io/wavefront_obj/tests/obj_importer_tests.cc index ae37dd68728..124acf6bf27 100644 --- a/source/blender/io/wavefront_obj/tests/obj_importer_tests.cc +++ b/source/blender/io/wavefront_obj/tests/obj_importer_tests.cc @@ -13,14 +13,14 @@ #include "BKE_material.h" #include "BKE_mesh.hh" #include "BKE_object.hh" -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "BLI_listbase.h" #include "BLI_math_base.hh" #include "BLI_math_vector_types.hh" #include "BLI_string.h" -#include "BLO_readfile.hh" +#include "BLO_readfile.h" #include "DEG_depsgraph.hh" #include "DEG_depsgraph_query.hh" diff --git a/source/blender/io/wavefront_obj/tests/obj_mtl_parser_tests.cc b/source/blender/io/wavefront_obj/tests/obj_mtl_parser_tests.cc index 5d3da4b53eb..746dcdac5cd 100644 --- a/source/blender/io/wavefront_obj/tests/obj_mtl_parser_tests.cc +++ b/source/blender/io/wavefront_obj/tests/obj_mtl_parser_tests.cc @@ -4,8 +4,6 @@ #include -#include "BLI_fileops.h" - #include "BKE_appdir.hh" #include "testing/testing.h" diff --git a/source/blender/makesdna/DNA_ID.h b/source/blender/makesdna/DNA_ID.h index d8af3ab6377..78f84409ca6 100644 --- a/source/blender/makesdna/DNA_ID.h +++ b/source/blender/makesdna/DNA_ID.h @@ -501,7 +501,7 @@ typedef struct ID { IDOverrideLibrary *override_library; /** - * Only set for data-blocks which are coming from copy-on-evaluation, points to + * Only set for data-blocks which are coming from copy-on-write, points to * the original version of it. * Also used temporarily during memfile undo to keep a reference to old ID when found. */ @@ -697,11 +697,11 @@ typedef struct PreviewImage { #define ID_IS_ASSET(_id) (((const ID *)(_id))->asset_data != NULL) -/* Check whether datablock type is covered by copy-on-evaluation. */ -#define ID_TYPE_USE_COPY_ON_EVAL(_id_type) \ +/* Check whether datablock type is covered by copy-on-write. */ +#define ID_TYPE_IS_COW(_id_type) \ (!ELEM(_id_type, ID_LI, ID_IP, ID_SCR, ID_VF, ID_BR, ID_WM, ID_PAL, ID_PC, ID_WS, ID_IM)) -/* Check whether data-block type requires copy-on-evaluation from #ID_RECALC_PARAMETERS. +/* Check whether data-block type requires copy-on-write from #ID_RECALC_PARAMETERS. * Keep in sync with #BKE_id_eval_properties_copy. */ #define ID_TYPE_SUPPORTS_PARAMS_WITHOUT_COW(id_type) ELEM(id_type, ID_ME) @@ -961,7 +961,7 @@ enum { */ LIB_TAG_LOCALIZED = 1 << 22, /** - * ID is an evaluated/localized version. + * ID is a copy-on-write/localized version. * * RESET_NEVER * @@ -969,17 +969,17 @@ enum { * If support for this is needed, see #88026 as this flag controls memory ownership * of physics *shared* pointers. */ - LIB_TAG_COPIED_ON_EVAL = 1 << 23, + LIB_TAG_COPIED_ON_WRITE = 1 << 23, /** - * ID is not the original evaluated ID created by the depsgraph, but has been re-allocated during - * the evaluation process of another ID. + * ID is not the original COW ID created by the depsgraph, but has been re-allocated during the + * evaluation process of another ID. * * RESET_NEVER * * Typical example is object data, when evaluating the object's modifier stack the final obdata - * can be different than the evaluated initial obdata ID. + * can be different than the COW initial obdata ID. */ - LIB_TAG_COPIED_ON_EVAL_FINAL_RESULT = 1 << 24, + LIB_TAG_COPIED_ON_WRITE_EVAL_RESULT = 1 << 24, /** * ID management status tags related to non-standard BMain IDs. @@ -1085,12 +1085,12 @@ typedef enum IDRecalcFlag { * re-rendered. */ ID_RECALC_EDITORS = (1 << 12), - /* ** Update evaluated copy component. ** + /* ** Update copy on write component. ** * * This is most generic tag which should only be used when nothing else matches. * It is not to explicitly mixed in with other recalculation flags. */ - ID_RECALC_SYNC_TO_EVAL = (1 << 13), + ID_RECALC_COPY_ON_WRITE = (1 << 13), /* Sequences in the sequencer did change. * Use this tag with a scene ID which owns the sequences. */ @@ -1106,13 +1106,13 @@ typedef enum IDRecalcFlag { ID_RECALC_AUDIO = (1 << 20), - /* NOTE: This triggers copy-on-eval for types that require it. + /* NOTE: This triggers copy on write for types that require it. * Exceptions to this can be added using #ID_TYPE_SUPPORTS_PARAMS_WITHOUT_COW, * this has the advantage that large arrays stored in the idea data don't * have to be copied on every update. */ ID_RECALC_PARAMETERS = (1 << 21), - /* Input has changed and data-block is to be reload from disk. + /* Input has changed and datablock is to be reload from disk. * Applies to movie clips to inform that copy-on-written version is to be refreshed for the new * input file or for color space changes. */ ID_RECALC_SOURCE = (1 << 23), @@ -1148,12 +1148,12 @@ typedef enum IDRecalcFlag { /* Update animation data-block itself, without doing full re-evaluation of * all dependent objects. */ - ID_RECALC_ANIMATION_NO_FLUSH = ID_RECALC_SYNC_TO_EVAL, + ID_RECALC_ANIMATION_NO_FLUSH = ID_RECALC_COPY_ON_WRITE, /* Ensure geometry of object and edit modes are both up-to-date in the evaluated data-block. * Example usage is when mesh validation modifies the non-edit-mode data, * which we want to be copied over to the evaluated data-block. */ - ID_RECALC_GEOMETRY_ALL_MODES = ID_RECALC_GEOMETRY | ID_RECALC_SYNC_TO_EVAL, + ID_RECALC_GEOMETRY_ALL_MODES = ID_RECALC_GEOMETRY | ID_RECALC_COPY_ON_WRITE, /*************************************************************************** * Aggregate flags, use only for checks on runtime. @@ -1209,8 +1209,6 @@ typedef enum IDRecalcFlag { #define FILTER_ID_WM (1ULL << 38) #define FILTER_ID_LI (1ULL << 39) #define FILTER_ID_GP (1ULL << 40) -#define FILTER_ID_IP (1ULL << 41) -#define FILTER_ID_AN (1ULL << 42) #define FILTER_ID_ALL \ (FILTER_ID_AC | FILTER_ID_AR | FILTER_ID_BR | FILTER_ID_CA | FILTER_ID_CU_LEGACY | \ @@ -1219,8 +1217,7 @@ typedef enum IDRecalcFlag { FILTER_ID_NT | FILTER_ID_OB | FILTER_ID_PA | FILTER_ID_PAL | FILTER_ID_PC | FILTER_ID_SCE | \ FILTER_ID_SPK | FILTER_ID_SO | FILTER_ID_TE | FILTER_ID_TXT | FILTER_ID_VF | FILTER_ID_WO | \ FILTER_ID_CF | FILTER_ID_WS | FILTER_ID_LP | FILTER_ID_CV | FILTER_ID_PT | FILTER_ID_VO | \ - FILTER_ID_SIM | FILTER_ID_KE | FILTER_ID_SCR | FILTER_ID_WM | FILTER_ID_LI | FILTER_ID_GP | \ - FILTER_ID_IP | FILTER_ID_AN) + FILTER_ID_SIM | FILTER_ID_KE | FILTER_ID_SCR | FILTER_ID_WM | FILTER_ID_LI | FILTER_ID_GP) /** * This enum defines the index assigned to each type of IDs in the array returned by @@ -1259,7 +1256,6 @@ typedef enum eID_Index { /* Animation types, might be used by almost all other types. */ INDEX_ID_IP, /* Deprecated. */ INDEX_ID_AC, - INDEX_ID_AN, /* Grease Pencil, special case, should be with the other obdata, but it can also be used by many * other ID types, including node trees e.g. @@ -1331,7 +1327,7 @@ typedef enum eID_Index { INDEX_ID_WS, INDEX_ID_WM, - /* Special values, keep last. */ + /* Special values. */ INDEX_ID_NULL, } eID_Index; diff --git a/source/blender/makesdna/DNA_ID_enums.h b/source/blender/makesdna/DNA_ID_enums.h index a4db7befa1c..7ce8785aed0 100644 --- a/source/blender/makesdna/DNA_ID_enums.h +++ b/source/blender/makesdna/DNA_ID_enums.h @@ -84,7 +84,6 @@ typedef enum ID_Type { ID_PT = MAKE_ID2('P', 'T'), /* PointCloud */ ID_VO = MAKE_ID2('V', 'O'), /* Volume */ ID_GP = MAKE_ID2('G', 'P'), /* Grease Pencil */ - ID_AN = MAKE_ID2('A', 'N'), /* Animation */ } ID_Type; /* Only used as 'placeholder' in .blend files for directly linked data-blocks. */ diff --git a/source/blender/makesdna/DNA_anim_defaults.h b/source/blender/makesdna/DNA_anim_defaults.h deleted file mode 100644 index e6e6c3bf1da..00000000000 --- a/source/blender/makesdna/DNA_anim_defaults.h +++ /dev/null @@ -1,38 +0,0 @@ -/* SPDX-FileCopyrightText: 2024 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup DNA - */ - -#pragma once - -#include - -/* clang-format off */ - -/* -------------------------------------------------------------------- */ -/** \name AnimationLayer Struct - * \{ */ - -#define _DNA_DEFAULT_AnimationLayer \ - { \ - .influence = 1.0f, \ - } - -/** \} */ - -/* -------------------------------------------------------------------- */ -/** \name AnimationStrip Struct - * \{ */ - -#define _DNA_DEFAULT_AnimationStrip \ - { \ - .frame_start = -INFINITY, \ - .frame_end = INFINITY, \ - } - -/** \} */ - -/* clang-format on */ diff --git a/source/blender/makesdna/DNA_anim_types.h b/source/blender/makesdna/DNA_anim_types.h index d54df36ccc8..02763118d5f 100644 --- a/source/blender/makesdna/DNA_anim_types.h +++ b/source/blender/makesdna/DNA_anim_types.h @@ -15,19 +15,6 @@ #include "DNA_curve_types.h" #include "DNA_listBase.h" -#ifdef __cplusplus -# include "BLI_span.hh" - -# include -#endif - -/* Forward declarations so the actual declarations can happen top-down. */ -struct Animation; -struct AnimationLayer; -struct AnimationBinding; -struct AnimationStrip; -struct AnimationChannelBag; - /* ************************************************ */ /* F-Curve DataTypes */ @@ -732,7 +719,8 @@ typedef enum eFCurve_Smoothing { /* 'Action' Datatypes */ /* NOTE: Although these are part of the Animation System, - * they are not stored here, see `DNA_action_types.h` instead. */ + * they are not stored here... see DNA_action_types.h instead + */ /* ************************************************ */ /* NLA - Non-Linear Animation */ @@ -1158,32 +1146,10 @@ typedef struct AnimData { /** Runtime data, for depsgraph evaluation. */ FCurve **driver_array; - /** - * Active Animation data-block. If this is set, `action` and NLA-related - * properties should be ignored. Note that there is plenty of code in Blender - * that doesn't check this pointer yet. - */ - struct Animation *animation; - - /** - * Identifier for which AnimationBinding of the above Animation is actually animating this - * data-block. - * - * Do not set this directly, use one of the assignment functions in ANIM_animation.hh instead. - */ - int32_t binding_handle; - /** - * Binding name, primarily used for mapping to the right binding when assigning - * another Animation data-block. Should be the same type as #AnimationBinding::name. - * - * \see #AnimationBinding::name - */ - char binding_name[66]; - uint8_t _pad0[6]; - /* settings for animation evaluation */ /** User-defined settings. */ int flag; + char _pad[4]; /* settings for active action evaluation (based on NLA strip settings) */ /** Accumulation mode for active action. */ @@ -1242,183 +1208,3 @@ typedef struct IdAdtTemplate { #define SELECT 1 /* ************************************************ */ -/* Layered Animation data-types. */ - -/* Declarations of C++ wrappers. See ANIM_animation.hh for the actual classes. */ -#ifdef __cplusplus -namespace blender::animrig { -class Animation; -class ChannelBag; -class KeyframeStrip; -class Layer; -class Binding; -class Strip; -} // namespace blender::animrig -#endif - -/** - * Container of layered animation data. - * - * \see #blender::animrig::Animation - */ -typedef struct Animation { - ID id; - - struct AnimationLayer **layer_array; /* Array of 'layer_array_num' layers. */ - int layer_array_num; - int layer_active_index; /* Index into layer_array, -1 means 'no active'. */ - - struct AnimationBinding **binding_array; /* Array of 'binding_array_num` bindings. */ - int binding_array_num; - int32_t last_binding_handle; - -#ifdef __cplusplus - blender::animrig::Animation &wrap(); - const blender::animrig::Animation &wrap() const; -#endif -} Animation; - -/** - * \see #blender::animrig::Layer - */ -typedef struct AnimationLayer { - /** User-Visible identifier, unique within the Animation. */ - char name[64]; /* MAX_NAME. */ - - float influence; /* [0-1] */ - - /** \see #blender::animrig::Layer::flags() */ - uint8_t layer_flags; - - /** \see #blender::animrig::Layer::mixmode() */ - int8_t layer_mix_mode; - - uint8_t _pad0[2]; - - /** - * There is always at least one strip. - * If there is only one, it can be infinite. This is the default for new layers. - */ - struct AnimationStrip **strip_array; /* Array of 'strip_array_num' strips. */ - int strip_array_num; - - uint8_t _pad1[4]; - -#ifdef __cplusplus - blender::animrig::Layer &wrap(); - const blender::animrig::Layer &wrap() const; -#endif -} AnimationLayer; - -/** - * \see #blender::animrig::Binding - */ -typedef struct AnimationBinding { - /** - * Typically the ID name this binding was created for, including the two - * letters indicating the ID type. - * - * \see #AnimData::binding_name - */ - char name[66]; /* MAX_ID_NAME */ - uint8_t _pad0[2]; - - /** - * Type of ID-blocks that this binding can be assigned to. - * If 0, will be set to whatever ID is first assigned. - */ - int idtype; - - /** - * Identifier of this Binding within the Animation data-block. - * - * This number allows reorganization of the #Animation::bindings_array without - * invalidating references. Also these remain valid when copy-on-evaluate - * copies are made. - * - * Only valid within the Animation data-block that owns this Binding. - * - * \see #blender::animrig::Animation::binding_for_handle() - */ - int32_t handle; - -#ifdef __cplusplus - blender::animrig::Binding &wrap(); - const blender::animrig::Binding &wrap() const; -#endif -} AnimationBinding; - -/** - * \see #blender::animrig::Strip - */ -typedef struct AnimationStrip { - /** - * \see #blender::animrig::Strip::type() - */ - int8_t strip_type; - uint8_t _pad0[3]; - - float frame_start; /** Start frame of the strip, in Animation time. */ - float frame_end; /** End frame of the strip, in Animation time. */ - - /** - * Offset applied to the contents of the strip, in frames. - * - * This offset determines the difference between "Animation time" (which would - * typically be the same as the scene time, until the animation system - * supports strips referencing other Animation data-blocks). - */ - float frame_offset; - -#ifdef __cplusplus - blender::animrig::Strip &wrap(); - const blender::animrig::Strip &wrap() const; -#endif -} AnimationStrip; - -/** - * #AnimationStrip::type = #Strip::Type::Keyframe. - * - * \see #blender::animrig::KeyframeStrip - */ -typedef struct KeyframeAnimationStrip { - AnimationStrip strip; - - struct AnimationChannelBag **channelbags_array; - int channelbags_array_num; - - uint8_t _pad[4]; - -#ifdef __cplusplus - blender::animrig::KeyframeStrip &wrap(); - const blender::animrig::KeyframeStrip &wrap() const; -#endif -} KeyframeAnimationStrip; - -/** - * \see #blender::animrig::ChannelBag - */ -typedef struct AnimationChannelBag { - int32_t binding_handle; - - int fcurve_array_num; - FCurve **fcurve_array; /* Array of 'fcurve_array_num' FCurves. */ - - /* TODO: Design & implement a way to integrate other channel types as well, - * and still have them map to a certain binding */ -#ifdef __cplusplus - blender::animrig::ChannelBag &wrap(); - const blender::animrig::ChannelBag &wrap() const; -#endif -} ChannelBag; - -#ifdef __cplusplus -/* Some static assertions that things that should have the same type actually do. */ -static_assert( - std::is_same_v); -static_assert( - std::is_same_v); -static_assert(std::is_same_v); -static_assert(std::is_same_v); -#endif diff --git a/source/blender/makesdna/DNA_armature_defaults.h b/source/blender/makesdna/DNA_armature_defaults.h index 6b1009e0a5c..c92f2592b84 100644 --- a/source/blender/makesdna/DNA_armature_defaults.h +++ b/source/blender/makesdna/DNA_armature_defaults.h @@ -8,6 +8,7 @@ #pragma once +/* Struct members on own line. */ /* clang-format off */ /* -------------------------------------------------------------------- */ diff --git a/source/blender/makesdna/DNA_armature_types.h b/source/blender/makesdna/DNA_armature_types.h index 7fc31b4fe4c..0cd09cf97ca 100644 --- a/source/blender/makesdna/DNA_armature_types.h +++ b/source/blender/makesdna/DNA_armature_types.h @@ -29,7 +29,7 @@ struct BoneCollection; /* this system works on different transformation space levels; * - * 1) Bone Space; with each Bone having its own (0,0,0) origin + * 1) Bone Space; with each Bone having own (0,0,0) origin * 2) Armature Space; the rest position, in Object space, Bones Spaces are applied hierarchical * 3) Pose Space; the animation position, in Object space * 4) World Space; Object matrix applied to Pose or Armature space diff --git a/source/blender/makesdna/DNA_asset_defaults.h b/source/blender/makesdna/DNA_asset_defaults.h index bc003b24396..aa9bc5c5148 100644 --- a/source/blender/makesdna/DNA_asset_defaults.h +++ b/source/blender/makesdna/DNA_asset_defaults.h @@ -8,6 +8,7 @@ #pragma once +/* Struct members on own line. */ /* clang-format off */ /* -------------------------------------------------------------------- */ diff --git a/source/blender/makesdna/DNA_asset_types.h b/source/blender/makesdna/DNA_asset_types.h index 9555df760f8..0c6ba9fdcd9 100644 --- a/source/blender/makesdna/DNA_asset_types.h +++ b/source/blender/makesdna/DNA_asset_types.h @@ -32,6 +32,15 @@ typedef struct AssetTag { char name[64]; /* MAX_NAME */ } AssetTag; +# +# +typedef struct AssetFilterSettings { + /** Tags to match against. These are newly allocated, and compared against the + * #AssetMetaData.tags. */ + ListBase tags; /* AssetTag */ + uint64_t id_types; /* rna_enum_id_type_filter_items */ +} AssetFilterSettings; + /** * \brief The meta-data of an asset. * By creating and giving this for a data-block (#ID.asset_data), the data-block becomes an asset. @@ -41,6 +50,11 @@ typedef struct AssetTag { * more than that from the file. So pointers to other IDs or ID data are strictly forbidden. */ typedef struct AssetMetaData { +#ifdef __cplusplus + /** Enables use with `std::unique_ptr`. */ + ~AssetMetaData(); +#endif + /** Runtime type, to reference event callbacks. Only valid for local assets. */ struct AssetTypeInfo *local_type_info; @@ -82,11 +96,6 @@ typedef struct AssetMetaData { short tot_tags; char _pad[4]; - -#ifdef __cplusplus - /** Enables use with `std::unique_ptr`. */ - ~AssetMetaData(); -#endif } AssetMetaData; typedef enum eAssetLibraryType { @@ -168,16 +177,15 @@ typedef struct AssetWeakReference { #ifdef __cplusplus AssetWeakReference(); - AssetWeakReference(const AssetWeakReference &); AssetWeakReference(AssetWeakReference &&); - AssetWeakReference &operator=(const AssetWeakReference &); - AssetWeakReference &operator=(AssetWeakReference &&); + AssetWeakReference(const AssetWeakReference &) = delete; ~AssetWeakReference(); /** - * See AssetRepresentation::make_weak_reference(). + * See AssetRepresentation::make_weak_reference(). Must be freed using + * #BKE_asset_weak_reference_free(). */ - static AssetWeakReference make_reference( + static AssetWeakReference *make_reference( const blender::asset_system::AssetLibrary &library, const blender::asset_system::AssetIdentifier &asset_identifier); #endif diff --git a/source/blender/makesdna/DNA_brush_defaults.h b/source/blender/makesdna/DNA_brush_defaults.h index 44a647e60e5..bd88d4ac6d7 100644 --- a/source/blender/makesdna/DNA_brush_defaults.h +++ b/source/blender/makesdna/DNA_brush_defaults.h @@ -10,6 +10,7 @@ #include "DNA_texture_defaults.h" +/* Struct members on own line. */ /* clang-format off */ /* -------------------------------------------------------------------- */ diff --git a/source/blender/makesdna/DNA_brush_enums.h b/source/blender/makesdna/DNA_brush_enums.h index 034562c12dd..8f5e93dfdab 100644 --- a/source/blender/makesdna/DNA_brush_enums.h +++ b/source/blender/makesdna/DNA_brush_enums.h @@ -656,7 +656,6 @@ typedef enum eBrushCurvesSculptFlag { BRUSH_CURVES_SCULPT_FLAG_INTERPOLATE_LENGTH = (1 << 2), BRUSH_CURVES_SCULPT_FLAG_INTERPOLATE_SHAPE = (1 << 3), BRUSH_CURVES_SCULPT_FLAG_INTERPOLATE_POINT_COUNT = (1 << 4), - BRUSH_CURVES_SCULPT_FLAG_INTERPOLATE_RADIUS = (1 << 5), } eBrushCurvesSculptFlag; typedef enum eBrushCurvesSculptDensityMode { diff --git a/source/blender/makesdna/DNA_brush_types.h b/source/blender/makesdna/DNA_brush_types.h index 069ba23103f..f4800083f53 100644 --- a/source/blender/makesdna/DNA_brush_types.h +++ b/source/blender/makesdna/DNA_brush_types.h @@ -155,13 +155,11 @@ typedef struct BrushCurvesSculptSettings { float curve_length; /** Minimum distance between curve root points used by the Density brush. */ float minimum_distance; - /** The initial radius of curve. **/ - float curve_radius; /** How often the Density brush tries to add a new curve. */ int density_add_attempts; /** #eBrushCurvesSculptDensityMode. */ uint8_t density_mode; - char _pad[7]; + char _pad[3]; struct CurveMapping *curve_parameter_falloff; } BrushCurvesSculptSettings; diff --git a/source/blender/makesdna/DNA_cachefile_defaults.h b/source/blender/makesdna/DNA_cachefile_defaults.h index de2fffe7dfa..5899b5570bf 100644 --- a/source/blender/makesdna/DNA_cachefile_defaults.h +++ b/source/blender/makesdna/DNA_cachefile_defaults.h @@ -8,6 +8,7 @@ #pragma once +/* Struct members on own line. */ /* clang-format off */ /* -------------------------------------------------------------------- */ diff --git a/source/blender/makesdna/DNA_camera_defaults.h b/source/blender/makesdna/DNA_camera_defaults.h index ab0cd68c028..c8130ace5da 100644 --- a/source/blender/makesdna/DNA_camera_defaults.h +++ b/source/blender/makesdna/DNA_camera_defaults.h @@ -8,6 +8,7 @@ #pragma once +/* Struct members on own line. */ /* clang-format off */ /* -------------------------------------------------------------------- */ diff --git a/source/blender/makesdna/DNA_collection_defaults.h b/source/blender/makesdna/DNA_collection_defaults.h index b54ec7a656e..c2a2ade4a53 100644 --- a/source/blender/makesdna/DNA_collection_defaults.h +++ b/source/blender/makesdna/DNA_collection_defaults.h @@ -8,6 +8,7 @@ #pragma once +/* Struct members on own line. */ /* clang-format off */ /* -------------------------------------------------------------------- */ diff --git a/source/blender/makesdna/DNA_constraint_types.h b/source/blender/makesdna/DNA_constraint_types.h index 922bd1b4fad..4b4ed33884e 100644 --- a/source/blender/makesdna/DNA_constraint_types.h +++ b/source/blender/makesdna/DNA_constraint_types.h @@ -1052,7 +1052,7 @@ typedef enum eTransformLimits_Flags2 { LIMIT_TRANSFORM = (1 << 1), } eTransformLimits_Flags2; -/* transform limiting constraints -> flag. */ +/* transform limiting constraints -> flag (own flags). */ typedef enum eTransformLimits_Flags { LIMIT_XMIN = (1 << 0), LIMIT_XMAX = (1 << 1), @@ -1062,7 +1062,7 @@ typedef enum eTransformLimits_Flags { LIMIT_ZMAX = (1 << 5), } eTransformLimits_Flags; -/* limit rotation constraint -> flag. */ +/* limit rotation constraint -> flag (own flags). */ typedef enum eRotLimit_Flags { LIMIT_XROT = (1 << 0), LIMIT_YROT = (1 << 1), diff --git a/source/blender/makesdna/DNA_curve_defaults.h b/source/blender/makesdna/DNA_curve_defaults.h index ffead05c314..77a3d4eab6b 100644 --- a/source/blender/makesdna/DNA_curve_defaults.h +++ b/source/blender/makesdna/DNA_curve_defaults.h @@ -8,6 +8,7 @@ #pragma once +/* Struct members on own line. */ /* clang-format off */ /* -------------------------------------------------------------------- */ diff --git a/source/blender/makesdna/DNA_curves_defaults.h b/source/blender/makesdna/DNA_curves_defaults.h index b90a4855e4c..18a0a981165 100644 --- a/source/blender/makesdna/DNA_curves_defaults.h +++ b/source/blender/makesdna/DNA_curves_defaults.h @@ -8,6 +8,7 @@ #pragma once +/* Struct members on own line. */ /* clang-format off */ /* -------------------------------------------------------------------- */ diff --git a/source/blender/makesdna/DNA_customdata_types.h b/source/blender/makesdna/DNA_customdata_types.h index d45abd3bcc6..f1c47c5e951 100644 --- a/source/blender/makesdna/DNA_customdata_types.h +++ b/source/blender/makesdna/DNA_customdata_types.h @@ -138,7 +138,7 @@ typedef enum eCustomDataType { CD_PROP_BYTE_COLOR = 17, CD_TANGENT = 18, CD_MDISPS = 19, - CD_PROP_FLOAT4X4 = 20, + /* CD_PREVIEW_MCOL = 20, */ /* UNUSED */ /* CD_ID_MCOL = 21, */ /* CD_TEXTURE_MLOOPCOL = 22, */ /* UNUSED */ CD_CLOTH_ORCO = 23, @@ -230,7 +230,6 @@ using eCustomDataMask = uint64_t; #define CD_MASK_PROP_INT8 (1ULL << CD_PROP_INT8) #define CD_MASK_PROP_INT32_2D (1ULL << CD_PROP_INT32_2D) #define CD_MASK_PROP_QUATERNION (1ULL << CD_PROP_QUATERNION) -#define CD_MASK_PROP_FLOAT4X4 (1ULL << CD_PROP_FLOAT4X4) /** Multi-resolution loop data. */ #define CD_MASK_MULTIRES_GRIDS (CD_MASK_MDISPS | CD_GRID_PAINT_MASK) @@ -242,7 +241,7 @@ using eCustomDataMask = uint64_t; #define CD_MASK_PROP_ALL \ (CD_MASK_PROP_FLOAT | CD_MASK_PROP_FLOAT2 | CD_MASK_PROP_FLOAT3 | CD_MASK_PROP_INT32 | \ CD_MASK_PROP_COLOR | CD_MASK_PROP_STRING | CD_MASK_PROP_BYTE_COLOR | CD_MASK_PROP_BOOL | \ - CD_MASK_PROP_INT8 | CD_MASK_PROP_INT32_2D | CD_MASK_PROP_QUATERNION | CD_MASK_PROP_FLOAT4X4) + CD_MASK_PROP_INT8 | CD_MASK_PROP_INT32_2D | CD_MASK_PROP_QUATERNION) /* All color attributes */ #define CD_MASK_COLOR_ALL (CD_MASK_PROP_COLOR | CD_MASK_PROP_BYTE_COLOR) diff --git a/source/blender/makesdna/DNA_fluid_defaults.h b/source/blender/makesdna/DNA_fluid_defaults.h index a09d5587069..96c81948ef9 100644 --- a/source/blender/makesdna/DNA_fluid_defaults.h +++ b/source/blender/makesdna/DNA_fluid_defaults.h @@ -8,6 +8,7 @@ #pragma once +/* Struct members on own line. */ /* clang-format off */ /* -------------------------------------------------------------------- */ diff --git a/source/blender/makesdna/DNA_gpencil_legacy_types.h b/source/blender/makesdna/DNA_gpencil_legacy_types.h index 6cfa3ab18f8..dfb7a7ed6d1 100644 --- a/source/blender/makesdna/DNA_gpencil_legacy_types.h +++ b/source/blender/makesdna/DNA_gpencil_legacy_types.h @@ -73,9 +73,9 @@ typedef struct bGPDspoint { /** Factor of uv along the stroke. */ float uv_fac; - /** UV rotation for dot mode. */ + /** Uv rotation for dot mode. */ float uv_rot; - /** UV for fill mode */ + /** Uv for fill mode */ float uv_fill[2]; /** Vertex Color RGBA (A=mix factor). */ @@ -186,9 +186,9 @@ typedef struct bGPDcurve_point { /** Factor of uv along the stroke. */ float uv_fac; - /** UV rotation for dot mode. */ + /** Uv rotation for dot mode. */ float uv_rot; - /** UV for fill mode. */ + /** Uv for fill mode. */ float uv_fill[2]; /** Vertex Color RGBA (A=mix factor). */ diff --git a/source/blender/makesdna/DNA_gpencil_modifier_defaults.h b/source/blender/makesdna/DNA_gpencil_modifier_defaults.h index 42036326423..ac8d34be803 100644 --- a/source/blender/makesdna/DNA_gpencil_modifier_defaults.h +++ b/source/blender/makesdna/DNA_gpencil_modifier_defaults.h @@ -10,6 +10,7 @@ /* Note that some struct members for color-mapping and color-bands are not initialized here. */ +/* Struct members on own line. */ /* clang-format off */ #define _DNA_DEFAULT_ArmatureGpencilModifierData \ @@ -328,13 +329,13 @@ #define _DNA_DEFAULT_LineartGpencilModifierData \ { \ - .edge_types = MOD_LINEART_EDGE_FLAG_INIT_TYPE, \ + .edge_types = LRT_EDGE_FLAG_INIT_TYPE, \ .thickness = 25, \ .opacity = 1.0f, \ .crease_threshold = DEG2RAD(140.0f), \ - .calculation_flags = MOD_LINEART_ALLOW_DUPLI_OBJECTS | MOD_LINEART_ALLOW_CLIPPING_BOUNDARIES | \ - MOD_LINEART_USE_CREASE_ON_SHARP_EDGES | MOD_LINEART_FILTER_FACE_MARK_KEEP_CONTOUR | \ - MOD_LINEART_MATCH_OUTPUT_VGROUP, \ + .calculation_flags = LRT_ALLOW_DUPLI_OBJECTS | LRT_ALLOW_CLIPPING_BOUNDARIES | \ + LRT_USE_CREASE_ON_SHARP_EDGES | LRT_FILTER_FACE_MARK_KEEP_CONTOUR | \ + LRT_GPENCIL_MATCH_OUTPUT_VGROUP, \ /* Do not split by default, this is for better chaining quality. */ \ .angle_splitting_threshold = 0.0f, \ .chaining_image_threshold = 0.001f, \ diff --git a/source/blender/makesdna/DNA_gpencil_modifier_types.h b/source/blender/makesdna/DNA_gpencil_modifier_types.h index 822f1a27b90..3907688fd55 100644 --- a/source/blender/makesdna/DNA_gpencil_modifier_types.h +++ b/source/blender/makesdna/DNA_gpencil_modifier_types.h @@ -1073,6 +1073,51 @@ typedef enum eGpencilModifierSpace { GP_SPACE_WORLD = 1, } eGpencilModifierSpace; +typedef enum eLineartGpencilModifierSource { + LRT_SOURCE_COLLECTION = 0, + LRT_SOURCE_OBJECT = 1, + LRT_SOURCE_SCENE = 2, +} eLineartGpencilModifierSource; + +typedef enum eLineartGpencilModifierShadowFilter { + /* These options need to be ordered in this way because those latter options requires line art to + * run a few extra stages. Having those values set up this way will allow + * #BKE_gpencil_get_lineart_modifier_limits() to find out maximum stages needed in multiple + * cached line art modifiers. */ + LRT_SHADOW_FILTER_NONE = 0, + LRT_SHADOW_FILTER_ILLUMINATED = 1, + LRT_SHADOW_FILTER_SHADED = 2, + LRT_SHADOW_FILTER_ILLUMINATED_ENCLOSED_SHAPES = 3, +} eLineartGpencilModifierShadowFilter; + +typedef enum eLineartGpencilModifierSilhouetteFilter { + LRT_SILHOUETTE_FILTER_NONE = 0, + LRT_SILHOUETTE_FILTER_GROUP = (1 << 0), + LRT_SILHOUETTE_FILTER_INDIVIDUAL = (1 << 1), +} eLineartGpencilModifierSilhouetteFilter; + +/* This enum is for modifier internal state only. */ +typedef enum eLineArtGPencilModifierFlags { + /* These two moved to #eLineartMainFlags to keep consistent with flag variable purpose. */ + /* LRT_GPENCIL_INVERT_SOURCE_VGROUP = (1 << 0), */ + /* LRT_GPENCIL_MATCH_OUTPUT_VGROUP = (1 << 1), */ + LRT_GPENCIL_BINARY_WEIGHTS = (1 << 2) /* Deprecated, this is removed for lack of use case. */, + LRT_GPENCIL_IS_BAKED = (1 << 3), + LRT_GPENCIL_USE_CACHE = (1 << 4), + LRT_GPENCIL_OFFSET_TOWARDS_CUSTOM_CAMERA = (1 << 5), + LRT_GPENCIL_INVERT_COLLECTION = (1 << 6), + LRT_GPENCIL_INVERT_SILHOUETTE_FILTER = (1 << 7), +} eLineArtGPencilModifierFlags; + +typedef enum eLineartGpencilMaskSwitches { + LRT_GPENCIL_MATERIAL_MASK_ENABLE = (1 << 0), + /** When set, material mask bit comparisons are done with bit wise "AND" instead of "OR". */ + LRT_GPENCIL_MATERIAL_MASK_MATCH = (1 << 1), + LRT_GPENCIL_INTERSECTION_MATCH = (1 << 2), +} eLineartGpencilMaskSwitches; + +struct LineartCache; + struct LineartCache; typedef struct LineartGpencilModifierData { @@ -1080,7 +1125,7 @@ typedef struct LineartGpencilModifierData { uint16_t edge_types; /* line type enable flags, bits in eLineartEdgeFlag */ - /** Object or Collection, from #GreasePencilLineartModifierSource. */ + /** Object or Collection, from #eLineartGpencilModifierSource. */ char source_type; char use_multiple_levels; @@ -1119,7 +1164,7 @@ typedef struct LineartGpencilModifierData { float opacity; short thickness; - unsigned char mask_switches; /* #GreasePencilLineartMaskSwitches */ + unsigned char mask_switches; /* #eLineartGpencilMaskSwitches */ unsigned char material_mask_bits; unsigned char intersection_mask; diff --git a/source/blender/makesdna/DNA_grease_pencil_types.h b/source/blender/makesdna/DNA_grease_pencil_types.h index 646ca37c3b2..8b4e551649b 100644 --- a/source/blender/makesdna/DNA_grease_pencil_types.h +++ b/source/blender/makesdna/DNA_grease_pencil_types.h @@ -240,7 +240,6 @@ typedef enum GreasePencilLayerTreeNodeFlag { GP_LAYER_TREE_NODE_USE_LIGHTS = (1 << 4), GP_LAYER_TREE_NODE_USE_ONION_SKINNING = (1 << 5), GP_LAYER_TREE_NODE_EXPANDED = (1 << 6), - GP_LAYER_TREE_NODE_HIDE_MASKS = (1 << 7), } GreasePencilLayerTreeNodeFlag; struct GreasePencilLayerTreeGroup; @@ -293,21 +292,6 @@ typedef struct GreasePencilLayer { * List of `GreasePencilLayerMask`. */ ListBase masks; - int active_mask_index; - char _pad2[4]; - /** - * Layer parent object. Can be an armature in which case the `parsubstr` is the bone name. - */ - struct Object *parent; - char *parsubstr; - /** - * Layer transform UI settings. These should *not* be used to do any computation. - * Use the functions is the `bke::greasepencil::Layer` class instead. - */ - float translation[3], rotation[3], scale[3]; - char _pad3[4]; - /** Name of the view layer used to filter render output. */ - char *viewlayername; /** * Runtime struct pointer. */ @@ -339,8 +323,6 @@ typedef struct GreasePencilLayerTreeGroup { */ typedef enum GreasePencilFlag { GREASE_PENCIL_ANIM_CHANNEL_EXPANDED = (1 << 0), - GREASE_PENCIL_AUTOLOCK_LAYERS = (1 << 1), - GREASE_PENCIL_STROKE_ORDER_3D = (1 << 2), } GreasePencilFlag; /** @@ -495,7 +477,6 @@ typedef struct GreasePencil { blender::bke::greasepencil::Layer *get_active_layer(); void set_active_layer(const blender::bke::greasepencil::Layer *layer); bool is_layer_active(const blender::bke::greasepencil::Layer *layer) const; - void autolock_inactive_layers(); /* Adding layers and layer groups. */ /** Adds a new layer with the given name to the top of root group. */ @@ -537,13 +518,6 @@ typedef struct GreasePencil { void remove_layer(blender::bke::greasepencil::Layer &layer); /* Drawing API functions. */ - - /** - * Low-level resizing of drawings array. Only allocates new entries in the array, no drawings are - * created in case of size increase. In case of size decrease, the removed drawings are deleted. - */ - void resize_drawings(const int new_num); - /** Add `add_num` new empty geometry drawings. */ void add_empty_drawings(int add_num); void add_duplicate_drawings(int duplicate_num, const blender::bke::greasepencil::Drawing &drawing); diff --git a/source/blender/makesdna/DNA_image_defaults.h b/source/blender/makesdna/DNA_image_defaults.h index 9e7b4bf696a..28ba505167d 100644 --- a/source/blender/makesdna/DNA_image_defaults.h +++ b/source/blender/makesdna/DNA_image_defaults.h @@ -8,6 +8,7 @@ #pragma once +/* Struct members on own line. */ /* clang-format off */ /* -------------------------------------------------------------------- */ diff --git a/source/blender/makesdna/DNA_lattice_defaults.h b/source/blender/makesdna/DNA_lattice_defaults.h index f5495e575b9..e67105b6a0a 100644 --- a/source/blender/makesdna/DNA_lattice_defaults.h +++ b/source/blender/makesdna/DNA_lattice_defaults.h @@ -8,6 +8,7 @@ #pragma once +/* Struct members on own line. */ /* clang-format off */ /* -------------------------------------------------------------------- */ diff --git a/source/blender/makesdna/DNA_layer_types.h b/source/blender/makesdna/DNA_layer_types.h index 661a7fde678..c7c431ceebe 100644 --- a/source/blender/makesdna/DNA_layer_types.h +++ b/source/blender/makesdna/DNA_layer_types.h @@ -178,7 +178,6 @@ typedef struct ViewLayer { int samples; struct Material *mat_override; - struct World *world_override; /** Equivalent to datablocks ID properties. */ struct IDProperty *id_properties; diff --git a/source/blender/makesdna/DNA_light_defaults.h b/source/blender/makesdna/DNA_light_defaults.h index ff3fdde979f..cff2cf7b5a9 100644 --- a/source/blender/makesdna/DNA_light_defaults.h +++ b/source/blender/makesdna/DNA_light_defaults.h @@ -8,6 +8,7 @@ #pragma once +/* Struct members on own line. */ /* clang-format off */ /* -------------------------------------------------------------------- */ @@ -43,7 +44,6 @@ .volume_fac = 1.0f, \ .shadow_softness_factor = 1.0f, \ .shadow_trace_distance = 10.0f, \ - .shadow_filter_radius = 3.0f, \ .att_dist = 40.0f, \ .sun_angle = DEG2RADF(0.526f), \ .area_spread = DEG2RADF(180.0f), \ diff --git a/source/blender/makesdna/DNA_light_types.h b/source/blender/makesdna/DNA_light_types.h index 13f1821d711..6b20f307421 100644 --- a/source/blender/makesdna/DNA_light_types.h +++ b/source/blender/makesdna/DNA_light_types.h @@ -77,7 +77,7 @@ typedef struct Light { float spec_fac, att_dist; float shadow_softness_factor; float shadow_trace_distance; - float shadow_filter_radius; + float _pad3; /* Preview */ struct PreviewImage *preview; diff --git a/source/blender/makesdna/DNA_lightprobe_defaults.h b/source/blender/makesdna/DNA_lightprobe_defaults.h index c673523262e..8b8b730b979 100644 --- a/source/blender/makesdna/DNA_lightprobe_defaults.h +++ b/source/blender/makesdna/DNA_lightprobe_defaults.h @@ -8,6 +8,7 @@ #pragma once +/* Struct members on own line. */ /* clang-format off */ /* -------------------------------------------------------------------- */ diff --git a/source/blender/makesdna/DNA_lineart_types.h b/source/blender/makesdna/DNA_lineart_types.h index 8c84333455b..8f815aa7b26 100644 --- a/source/blender/makesdna/DNA_lineart_types.h +++ b/source/blender/makesdna/DNA_lineart_types.h @@ -17,61 +17,61 @@ /** These flags are used for 1 time calculation, not stroke selection afterwards. */ typedef enum eLineartMainFlags { - MOD_LINEART_INTERSECTION_AS_CONTOUR = (1 << 0), - MOD_LINEART_EVERYTHING_AS_CONTOUR = (1 << 1), - MOD_LINEART_ALLOW_DUPLI_OBJECTS = (1 << 2), - MOD_LINEART_ALLOW_OVERLAPPING_EDGES = (1 << 3), - MOD_LINEART_ALLOW_CLIPPING_BOUNDARIES = (1 << 4), + LRT_INTERSECTION_AS_CONTOUR = (1 << 0), + LRT_EVERYTHING_AS_CONTOUR = (1 << 1), + LRT_ALLOW_DUPLI_OBJECTS = (1 << 2), + LRT_ALLOW_OVERLAPPING_EDGES = (1 << 3), + LRT_ALLOW_CLIPPING_BOUNDARIES = (1 << 4), /* LRT_REMOVE_DOUBLES = (1 << 5), Deprecated */ - MOD_LINEART_LOOSE_AS_CONTOUR = (1 << 6), - MOD_LINEART_INVERT_SOURCE_VGROUP = (1 << 7), - MOD_LINEART_MATCH_OUTPUT_VGROUP = (1 << 8), - MOD_LINEART_FILTER_FACE_MARK = (1 << 9), - MOD_LINEART_FILTER_FACE_MARK_INVERT = (1 << 10), - MOD_LINEART_FILTER_FACE_MARK_BOUNDARIES = (1 << 11), - MOD_LINEART_CHAIN_LOOSE_EDGES = (1 << 12), - MOD_LINEART_CHAIN_GEOMETRY_SPACE = (1 << 13), - MOD_LINEART_ALLOW_OVERLAP_EDGE_TYPES = (1 << 14), - MOD_LINEART_USE_CREASE_ON_SMOOTH_SURFACES = (1 << 15), - MOD_LINEART_USE_CREASE_ON_SHARP_EDGES = (1 << 16), - MOD_LINEART_USE_CUSTOM_CAMERA = (1 << 17), - MOD_LINEART_FILTER_FACE_MARK_KEEP_CONTOUR = (1 << 18), - MOD_LINEART_USE_BACK_FACE_CULLING = (1 << 19), - MOD_LINEART_USE_IMAGE_BOUNDARY_TRIMMING = (1 << 20), - MOD_LINEART_CHAIN_PRESERVE_DETAILS = (1 << 22), - MOD_LINEART_SHADOW_USE_SILHOUETTE = (1 << 24), + LRT_LOOSE_AS_CONTOUR = (1 << 6), + LRT_GPENCIL_INVERT_SOURCE_VGROUP = (1 << 7), + LRT_GPENCIL_MATCH_OUTPUT_VGROUP = (1 << 8), + LRT_FILTER_FACE_MARK = (1 << 9), + LRT_FILTER_FACE_MARK_INVERT = (1 << 10), + LRT_FILTER_FACE_MARK_BOUNDARIES = (1 << 11), + LRT_CHAIN_LOOSE_EDGES = (1 << 12), + LRT_CHAIN_GEOMETRY_SPACE = (1 << 13), + LRT_ALLOW_OVERLAP_EDGE_TYPES = (1 << 14), + LRT_USE_CREASE_ON_SMOOTH_SURFACES = (1 << 15), + LRT_USE_CREASE_ON_SHARP_EDGES = (1 << 16), + LRT_USE_CUSTOM_CAMERA = (1 << 17), + LRT_FILTER_FACE_MARK_KEEP_CONTOUR = (1 << 18), + LRT_USE_BACK_FACE_CULLING = (1 << 19), + LRT_USE_IMAGE_BOUNDARY_TRIMMING = (1 << 20), + LRT_CHAIN_PRESERVE_DETAILS = (1 << 22), + LRT_SHADOW_USE_SILHOUETTE = (1 << 24), } eLineartMainFlags; typedef enum eLineartEdgeFlag { - MOD_LINEART_EDGE_FLAG_EDGE_MARK = (1 << 0), - MOD_LINEART_EDGE_FLAG_CONTOUR = (1 << 1), - MOD_LINEART_EDGE_FLAG_CREASE = (1 << 2), - MOD_LINEART_EDGE_FLAG_MATERIAL = (1 << 3), - MOD_LINEART_EDGE_FLAG_INTERSECTION = (1 << 4), - MOD_LINEART_EDGE_FLAG_LOOSE = (1 << 5), - MOD_LINEART_EDGE_FLAG_LIGHT_CONTOUR = (1 << 6), - /* MOD_LINEART_EDGE_FLAG_FOR_FUTURE = (1 << 7), */ + LRT_EDGE_FLAG_EDGE_MARK = (1 << 0), + LRT_EDGE_FLAG_CONTOUR = (1 << 1), + LRT_EDGE_FLAG_CREASE = (1 << 2), + LRT_EDGE_FLAG_MATERIAL = (1 << 3), + LRT_EDGE_FLAG_INTERSECTION = (1 << 4), + LRT_EDGE_FLAG_LOOSE = (1 << 5), + LRT_EDGE_FLAG_LIGHT_CONTOUR = (1 << 6), + /* LRT_EDGE_FLAG_FOR_FUTURE = (1 << 7), */ /** * It's a legacy limit of 8 bits for feature lines that come from original mesh edges. It should * not be needed in current object loading scheme, but might still be relevant if we are to * implement edit-mesh loading, so don't exceed 8 bits just yet. */ - MOD_LINEART_EDGE_FLAG_PROJECTED_SHADOW = (1 << 8), + LRT_EDGE_FLAG_PROJECTED_SHADOW = (1 << 8), /* To determine an edge to be occluded from the front or back face it's lying on. */ - MOD_LINEART_EDGE_FLAG_SHADOW_FACING_LIGHT = (1 << 9), + LRT_EDGE_FLAG_SHADOW_FACING_LIGHT = (1 << 9), /** Also used as discarded line mark. */ - MOD_LINEART_EDGE_FLAG_CHAIN_PICKED = (1 << 10), - MOD_LINEART_EDGE_FLAG_CLIPPED = (1 << 11), + LRT_EDGE_FLAG_CHAIN_PICKED = (1 << 10), + LRT_EDGE_FLAG_CLIPPED = (1 << 11), /** Used to specify contour from viewing camera when computing shadows. */ - MOD_LINEART_EDGE_FLAG_CONTOUR_SECONDARY = (1 << 12), + LRT_EDGE_FLAG_CONTOUR_SECONDARY = (1 << 12), /** Limited to 16 bits for the entire thing. */ /** For object loading code to use only. */ - MOD_LINEART_EDGE_FLAG_INHIBIT = (1 << 14), + LRT_EDGE_FLAG_INHIBIT = (1 << 14), /** For discarding duplicated edge types in culling stage. */ - MOD_LINEART_EDGE_FLAG_NEXT_IS_DUPLICATION = (1 << 15), + LRT_EDGE_FLAG_NEXT_IS_DUPLICATION = (1 << 15), } eLineartEdgeFlag; -#define MOD_LINEART_EDGE_FLAG_ALL_TYPE 0x01ff -#define MOD_LINEART_EDGE_FLAG_INIT_TYPE 0x37 /* Without material & light contour */ -#define MOD_LINEART_EDGE_FLAG_TYPE_MAX_BITS 7 +#define LRT_EDGE_FLAG_ALL_TYPE 0x01ff +#define LRT_EDGE_FLAG_INIT_TYPE 0x37 /* Without material & light contour */ +#define LRT_EDGE_FLAG_TYPE_MAX_BITS 7 diff --git a/source/blender/makesdna/DNA_linestyle_defaults.h b/source/blender/makesdna/DNA_linestyle_defaults.h index 652b2091254..6f8d812f0e1 100644 --- a/source/blender/makesdna/DNA_linestyle_defaults.h +++ b/source/blender/makesdna/DNA_linestyle_defaults.h @@ -8,6 +8,7 @@ #pragma once +/* Struct members on own line. */ /* clang-format off */ /* -------------------------------------------------------------------- */ diff --git a/source/blender/makesdna/DNA_material_defaults.h b/source/blender/makesdna/DNA_material_defaults.h index 5bc742f384e..83dcff68efb 100644 --- a/source/blender/makesdna/DNA_material_defaults.h +++ b/source/blender/makesdna/DNA_material_defaults.h @@ -8,6 +8,7 @@ #pragma once +/* Struct members on own line. */ /* clang-format off */ /* -------------------------------------------------------------------- */ diff --git a/source/blender/makesdna/DNA_material_types.h b/source/blender/makesdna/DNA_material_types.h index 725cca51cb5..6fd60796856 100644 --- a/source/blender/makesdna/DNA_material_types.h +++ b/source/blender/makesdna/DNA_material_types.h @@ -74,7 +74,7 @@ typedef struct MaterialGPencilStyle { /** Radius for radial gradients. */ float gradient_radius DNA_DEPRECATED; char _pad2[4]; - /** UV coordinates scale. */ + /** Uv coordinates scale. */ float gradient_scale[2] DNA_DEPRECATED; /** Factor to shift filling in 2d space. */ float gradient_shift[2] DNA_DEPRECATED; diff --git a/source/blender/makesdna/DNA_mesh_defaults.h b/source/blender/makesdna/DNA_mesh_defaults.h index 43271b0988b..c7e17c70b60 100644 --- a/source/blender/makesdna/DNA_mesh_defaults.h +++ b/source/blender/makesdna/DNA_mesh_defaults.h @@ -8,6 +8,7 @@ #pragma once +/* Struct members on own line. */ /* clang-format off */ /* -------------------------------------------------------------------- */ diff --git a/source/blender/makesdna/DNA_mesh_types.h b/source/blender/makesdna/DNA_mesh_types.h index 10ccb0c9ee2..f2849b06f2f 100644 --- a/source/blender/makesdna/DNA_mesh_types.h +++ b/source/blender/makesdna/DNA_mesh_types.h @@ -74,7 +74,7 @@ typedef struct Mesh { int verts_num; /** The number of edges in the mesh, and the size of #edge_data. */ int edges_num; - /** The number of faces in the mesh, and the size of #face_data. */ + /** The number of polygons/faces in the mesh, and the size of #face_data. */ int faces_num; /** The number of face corners in the mesh, and the size of #corner_data. */ int corners_num; @@ -82,7 +82,7 @@ typedef struct Mesh { /** * Array owned by mesh. See #Mesh::faces() and #OffsetIndices. * - * This array is shared based on the bke::MeshRuntime::face_offsets_sharing_info. + * This array is shared based on the bke::MeshRuntime::poly_offsets_sharing_info. * Avoid accessing directly when possible. */ int *face_offset_indices; @@ -232,43 +232,43 @@ typedef struct Mesh { MeshRuntimeHandle *runtime; #ifdef __cplusplus /** - * Array of vertex positions. Edges and face corners are defined by indices into this array. + * Array of vertex positions. Edges and faces are defined by indices into this array. */ blender::Span vert_positions() const; /** Write access to vertex data. */ blender::MutableSpan vert_positions_for_write(); /** - * Array of edges, containing vertex indices, stored in the ".edge_verts" attribute. For simple - * triangle or quad meshes, edges could be calculated from the face and #corner_edge arrays. - * However, edges need to be stored explicitly for edge domain attributes and to support loose + * Array of edges, containing vertex indices, stored in the ".edge_verts" attributes. For simple + * triangle or quad meshes, edges could be calculated from the face and "corner edge" arrays, + * however, edges need to be stored explicitly to edge domain attributes and to support loose * edges that aren't connected to faces. */ blender::Span edges() const; /** Write access to edge data. */ blender::MutableSpan edges_for_write(); /** - * Face topology information (using the same internal data as #face_offsets()). Each face is a - * contiguous chunk of face corners represented as an #IndexRange. Each face can be used to slice - * the #corner_verts or #corner_edges arrays to find the vertices or edges that each face uses. + * Face topology storage of the offset of each face's section of the face corners. The size of + * each face is encoded using the next offset value. Can be used to slice the #corner_verts or + * #corner_edges arrays to find the vertices or edges that make up each face. */ blender::OffsetIndices faces() const; /** - * Return an array containing the first corner of each face. and the size of the face encoded as - * the next offset. The total number of corners is the final value, and the first value is always - * zero. May be empty if there are no faces. + * Index of the first corner of each face, and the size of the face encoded as the next + * offset. The total number of corners is the final value, and the first value is always zero. + * May be empty if there are no polygons. */ blender::Span face_offsets() const; - /** Write access to #face_offsets data. */ + /** Write access to #poly_offsets data. */ blender::MutableSpan face_offsets_for_write(); /** * Array of vertices for every face corner, stored in the ".corner_vert" integer attribute. * For example, the vertices in a face can be retrieved with the #slice method: * \code{.cc} - * const Span face_verts = corner_verts.slice(face); + * const Span poly_verts = corner_verts.slice(face); * \endcode - * This span can often be passed as an argument in lieu of a face and the entire corner verts - * array. + * Such a span can often be passed as an argument in lieu of a polygon or the entire corner + * verts array. */ blender::Span corner_verts() const; /** Write access to the #corner_verts data. */ @@ -385,7 +385,7 @@ typedef struct Mesh { */ blender::bke::MeshNormalDomain normals_domain(const bool support_sharp_face = false) const; /** - * Normal direction of faces, defined by positions and the winding direction of face corners. + * Normal direction of polygons, defined by positions and the winding direction of face corners. */ blender::Span face_normals() const; /** diff --git a/source/blender/makesdna/DNA_meshdata_types.h b/source/blender/makesdna/DNA_meshdata_types.h index 014e4ad4393..24dff6b3cc4 100644 --- a/source/blender/makesdna/DNA_meshdata_types.h +++ b/source/blender/makesdna/DNA_meshdata_types.h @@ -82,7 +82,9 @@ enum { * }; * * // Access all triangles in a given face. - * const Span corner_tris = corner_tris.slice(face_triangles_range(faces, i)); + * const IndexRange face = faces[i]; + * const Span corner_tris = corner_tris.slice(poly_to_tri_count(i, face.start()), + * bke::mesh::face_triangles_num(face.size())); * \endcode * * It may also be useful to check whether or not two vertices of a triangle form an edge in the diff --git a/source/blender/makesdna/DNA_meta_defaults.h b/source/blender/makesdna/DNA_meta_defaults.h index 33087185014..09a07dead90 100644 --- a/source/blender/makesdna/DNA_meta_defaults.h +++ b/source/blender/makesdna/DNA_meta_defaults.h @@ -8,6 +8,7 @@ #pragma once +/* Struct members on own line. */ /* clang-format off */ /* -------------------------------------------------------------------- */ diff --git a/source/blender/makesdna/DNA_modifier_defaults.h b/source/blender/makesdna/DNA_modifier_defaults.h index 98e0b2c5c2c..5914c65ef93 100644 --- a/source/blender/makesdna/DNA_modifier_defaults.h +++ b/source/blender/makesdna/DNA_modifier_defaults.h @@ -8,6 +8,7 @@ #pragma once +/* Struct members on own line. */ /* clang-format off */ #define _DNA_DEFAULT_ArmatureModifierData \ @@ -63,7 +64,7 @@ .collection = NULL, \ .double_threshold = 1e-6f, \ .operation = eBooleanModifierOp_Difference, \ - .solver = eBooleanModifierSolver_Mesh_Arr, \ + .solver = eBooleanModifierSolver_Exact, \ .flag = eBooleanModifierFlag_Object, \ .bm_flag = 0, \ } @@ -841,7 +842,7 @@ .offset_mode = MOD_GREASE_PENCIL_OFFSET_RANDOM, \ .loc = {0.0f, 0.0f, 0.0f}, \ .rot = {0.0f, 0.0f, 0.0f}, \ - .scale = {0.0f, 0.0f, 0.0f}, \ + .scale = {1.0f, 1.0f, 1.0f}, \ .stroke_step = 1, \ .stroke_start_offset = 0, \ } @@ -871,177 +872,4 @@ .thickness = 0.02, \ } -#define _DNA_DEFAULT_GreasePencilLatticeModifierData \ - { \ - .object = NULL, \ - .strength = 1.0f, \ - } - -#define _DNA_DEFAULT_GreasePencilDashModifierData \ - { \ - .dash_offset = 0, \ - .segments_array = NULL, \ - .segments_num = 0, \ - .segment_active_index = 0, \ - } - -#define _DNA_DEFAULT_GreasePencilDashModifierSegment \ - { \ - .name = "Segment", \ - .dash = 2, \ - .gap = 1, \ - .radius = 1.0f, \ - .opacity = 1.0f, \ - .mat_nr = -1, \ - } - -#define _DNA_DEFAULT_GreasePencilMultiModifierData \ - { \ - .flag = 0, \ - .duplications = 3, \ - .distance = 0.1f, \ - .offset = 0.0f, \ - .fading_center = 0.5f, \ - .fading_thickness = 0.5f, \ - .fading_opacity = 0.5f, \ - } - -#define _DNA_DEFAULT_GreasePencilLengthModifierData \ - { \ - .start_fac = 0.1f,\ - .end_fac = 0.1f,\ - .overshoot_fac = 0.1f,\ - .flag = GP_LENGTH_USE_CURVATURE,\ - .point_density = 30.0f,\ - .segment_influence = 0.0f,\ - .max_angle = DEG2RAD(170.0f),\ - .rand_start_fac = 0.0f,\ - .rand_end_fac = 0.0f,\ - .rand_offset = 0.0f,\ - .seed = 0,\ - .step = 4,\ - } - -#define _DNA_DEFAULT_GreasePencilWeightAngleModifierData \ - { \ - .flag = 0, \ - .axis = 1, \ - } - -#define _DNA_DEFAULT_GreasePencilArrayModifierData \ - { \ - .object = NULL, \ - .count = 2, \ - .flag = GP_ARRAY_USE_RELATIVE, \ - .offset = {0.0f, 0.0f, 0.0f}, \ - .shift = {1.0f, 0.0f, 0.0f}, \ - .rnd_offset = {0.0f, 0.0f, 0.0f}, \ - .rnd_rot = {0.0f, 0.0f, 0.0f}, \ - .rnd_scale = {0.0f, 0.0f, 0.0f}, \ - .seed = 1, \ - .mat_rpl = 0, \ - } - -#define _DNA_DEFAULT_GreasePencilWeightProximityModifierData \ - { \ - .target_vgname = "", \ - .flag = 0, \ - .dist_start = 0.0f, \ - .dist_end = 20.0f, \ - } - -#define _DNA_DEFAULT_GreasePencilHookModifierData \ - { \ - .object = NULL, \ - .subtarget = "", \ - .flag = 0, \ - .falloff_type = MOD_GREASE_PENCIL_HOOK_Falloff_Smooth, \ - .parentinv = _DNA_DEFAULT_UNIT_M4, \ - .cent = {0.0f, 0.0f, 0.0f}, \ - .falloff = 0.0f, \ - .force = 0.5f, \ - } - -#define _DNA_DEFAULT_GreasePencilLineartModifierData \ - { \ - .edge_types = MOD_LINEART_EDGE_FLAG_INIT_TYPE, \ - .thickness = 25, \ - .opacity = 1.0f, \ - .crease_threshold = DEG2RAD(140.0f), \ - .calculation_flags = MOD_LINEART_ALLOW_DUPLI_OBJECTS | MOD_LINEART_ALLOW_CLIPPING_BOUNDARIES | \ - MOD_LINEART_USE_CREASE_ON_SHARP_EDGES | MOD_LINEART_FILTER_FACE_MARK_KEEP_CONTOUR | \ - MOD_LINEART_MATCH_OUTPUT_VGROUP, \ - /* Do not split by default, this is for better chaining quality. */ \ - .angle_splitting_threshold = 0.0f, \ - .chaining_image_threshold = 0.001f, \ - .stroke_depth_offset = 0.05,\ - .chain_smooth_tolerance = 0.0f,\ - .overscan = 0.1f,\ - .shadow_camera_near = 0.1f, \ - .shadow_camera_far = 200.0f, \ - .shadow_camera_size = 200.0f, \ - } - -#define _DNA_DEFAULT_GreasePencilArmatureModifierData \ - { \ - .deformflag = ARM_DEF_VGROUP, \ - .object = NULL, \ - } - -#define _DNA_DEFAULT_GreasePencilTimeModifierData \ - { \ - .flag = MOD_GREASE_PENCIL_TIME_KEEP_LOOP, \ - .offset = 1, \ - .frame_scale = 1.0f, \ - .mode = 0, \ - .sfra = 1, \ - .efra = 250, \ - .segments_array = NULL, \ - .segments_num = 1, \ - .segment_active_index = 0, \ - } - -#define _DNA_DEFAULT_GreasePencilTimeModifierSegment \ - { \ - .name = "Segment", \ - .segment_start = 1, \ - .segment_end = 2, \ - .segment_mode = 0, \ - .segment_repeat = 1, \ - } - -#define _DNA_DEFAULT_GreasePencilEnvelopeModifierData \ - { \ - .spread = 10, \ - .mode = MOD_GREASE_PENCIL_ENVELOPE_SEGMENTS, \ - .mat_nr = -1, \ - .thickness = 1.0f, \ - .strength = 1.0f, \ - .skip = 0, \ - } - -#define _DNA_DEFAULT_GreasePencilOutlineModifierData \ - { \ - .flag = MOD_GREASE_PENCIL_OUTLINE_KEEP_SHAPE, \ - .thickness = 1, \ - .sample_length = 0.0f, \ - .subdiv = 3, \ - .outline_material = NULL, \ - } - -#define _DNA_DEFAULT_GreasePencilShrinkwrapModifierData \ - { \ - .target = NULL, \ - .aux_target = NULL, \ - .keep_dist = 0.05f, \ - .shrink_type = MOD_SHRINKWRAP_NEAREST_SURFACE, \ - .shrink_opts = MOD_SHRINKWRAP_PROJECT_ALLOW_POS_DIR, \ - .shrink_mode = MOD_SHRINKWRAP_ON_SURFACE, \ - .proj_limit = 0.0f, \ - .proj_axis = MOD_SHRINKWRAP_PROJECT_OVER_NORMAL, \ - .subsurf_levels = 0, \ - .smooth_factor = 0.05f, \ - .smooth_step = 1, \ - } - /* clang-format off */ diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h index f64c40a2550..148e598e131 100644 --- a/source/blender/makesdna/DNA_modifier_types.h +++ b/source/blender/makesdna/DNA_modifier_types.h @@ -15,8 +15,6 @@ #include "DNA_session_uid_types.h" #ifdef __cplusplus -# include "BLI_span.hh" - namespace blender { struct NodesModifierRuntime; } @@ -104,20 +102,6 @@ typedef enum ModifierType { eModifierType_GreasePencilNoise = 67, eModifierType_GreasePencilMirror = 68, eModifierType_GreasePencilThickness = 69, - eModifierType_GreasePencilLattice = 70, - eModifierType_GreasePencilDash = 71, - eModifierType_GreasePencilMultiply = 72, - eModifierType_GreasePencilLength = 73, - eModifierType_GreasePencilWeightAngle = 74, - eModifierType_GreasePencilArray = 75, - eModifierType_GreasePencilWeightProximity = 76, - eModifierType_GreasePencilHook = 77, - eModifierType_GreasePencilLineart = 78, - eModifierType_GreasePencilArmature = 79, - eModifierType_GreasePencilTime = 80, - eModifierType_GreasePencilEnvelope = 81, - eModifierType_GreasePencilOutline = 82, - eModifierType_GreasePencilShrinkwrap = 83, NUM_MODIFIER_TYPES, } ModifierType; @@ -983,8 +967,8 @@ typedef enum { /** #BooleanModifierData.solver */ typedef enum { - eBooleanModifierSolver_Float = 0, - eBooleanModifierSolver_Mesh_Arr = 1, + eBooleanModifierSolver_Fast = 0, + eBooleanModifierSolver_Exact = 1, } BooleanModifierSolver; /** #BooleanModifierData.flag */ @@ -2675,7 +2659,6 @@ typedef enum GreasePencilTintModifierFlag { MOD_GREASE_PENCIL_TINT_USE_WEIGHT_AS_FACTOR = (1 << 0), } GreasePencilTintModifierFlag; -/* Enum definitions for length modifier stays in the old DNA for the moment. */ typedef struct GreasePencilSmoothModifierData { ModifierData modifier; GreasePencilModifierInfluenceData influence; @@ -2690,12 +2673,13 @@ typedef struct GreasePencilSmoothModifierData { } GreasePencilSmoothModifierData; typedef enum eGreasePencilSmooth_Flag { - MOD_GREASE_PENCIL_SMOOTH_MOD_LOCATION = (1 << 0), - MOD_GREASE_PENCIL_SMOOTH_MOD_STRENGTH = (1 << 1), - MOD_GREASE_PENCIL_SMOOTH_MOD_THICKNESS = (1 << 2), - MOD_GREASE_PENCIL_SMOOTH_MOD_UV = (1 << 3), - MOD_GREASE_PENCIL_SMOOTH_KEEP_SHAPE = (1 << 4), - MOD_GREASE_PENCIL_SMOOTH_SMOOTH_ENDS = (1 << 5), + MOD_GREASE_PENCIL_SMOOTH_OPEN_INFLUENCE_PANEL = (1 << 0), + MOD_GREASE_PENCIL_SMOOTH_MOD_LOCATION = (1 << 1), + MOD_GREASE_PENCIL_SMOOTH_MOD_STRENGTH = (1 << 2), + MOD_GREASE_PENCIL_SMOOTH_MOD_THICKNESS = (1 << 3), + MOD_GREASE_PENCIL_SMOOTH_MOD_UV = (1 << 4), + MOD_GREASE_PENCIL_SMOOTH_KEEP_SHAPE = (1 << 5), + MOD_GREASE_PENCIL_SMOOTH_SMOOTH_ENDS = (1 << 6), } eGreasePencilSmooth_Flag; typedef struct GreasePencilOffsetModifierData { @@ -2788,525 +2772,3 @@ typedef enum GreasePencilThicknessModifierFlag { MOD_GREASE_PENCIL_THICK_NORMALIZE = (1 << 0), MOD_GREASE_PENCIL_THICK_WEIGHT_FACTOR = (1 << 1), } GreasePencilThicknessModifierFlag; - -typedef struct GreasePencilLatticeModifierData { - ModifierData modifier; - GreasePencilModifierInfluenceData influence; - struct Object *object; - float strength; - char _pad[4]; -} GreasePencilLatticeModifierData; - -typedef struct GreasePencilDashModifierSegment { - char name[64]; - int dash; - int gap; - float radius; - float opacity; - int mat_nr; - /** #GreasePencilDashModifierFlag */ - int flag; -} GreasePencilDashModifierSegment; - -typedef struct GreasePencilDashModifierData { - ModifierData modifier; - GreasePencilModifierInfluenceData influence; - - GreasePencilDashModifierSegment *segments_array; - int segments_num; - int segment_active_index; - - int dash_offset; - char _pad[4]; - -#ifdef __cplusplus - blender::Span segments() const; - blender::MutableSpan segments(); -#endif -} GreasePencilDashModifierData; - -typedef enum GreasePencilDashModifierFlag { - MOD_GREASE_PENCIL_DASH_USE_CYCLIC = (1 << 0), -} GreasePencilDashModifierFlag; - -typedef struct GreasePencilMultiModifierData { - ModifierData modifier; - GreasePencilModifierInfluenceData influence; - - /* #GreasePencilMultiplyModifierFlag */ - int flag; - - int duplications; - float distance; - /* -1:inner 0:middle 1:outer */ - float offset; - - float fading_center; - float fading_thickness; - float fading_opacity; - - int _pad0; - - void *_pad; -} GreasePencilMultiModifierData; - -typedef enum GreasePencilMultiplyModifierFlag { - /* GP_MULTIPLY_ENABLE_ANGLE_SPLITTING = (1 << 1), Deprecated. */ - MOD_GREASE_PENCIL_MULTIPLY_ENABLE_FADING = (1 << 2), -} GreasePencilMultiplyModifierFlag; - -typedef struct GreasePencilLengthModifierData { - ModifierData modifier; - GreasePencilModifierInfluenceData influence; - int flag; - float start_fac, end_fac; - float rand_start_fac, rand_end_fac, rand_offset; - float overshoot_fac; - /** (first element is the index) random values. */ - int seed; - /** How many frames before recalculate randoms. */ - int step; - /** #eLengthGpencil_Type. */ - int mode; - char _pad[4]; - /* Curvature parameters. */ - float point_density; - float segment_influence; - float max_angle; - - void *_pad1; -} GreasePencilLengthModifierData; - -typedef struct GreasePencilWeightAngleModifierData { - ModifierData modifier; - GreasePencilModifierInfluenceData influence; - /** #GreasePencilWeightAngleModifierFlag */ - int flag; - float min_weight; - /** Axis. */ - int16_t axis; - /** #GreasePencilWeightAngleModifierSpace */ - int16_t space; - /** Angle */ - float angle; - /** Weights output to this vertex group, can be the same as source group. */ - char target_vgname[64]; - - void *_pad; -} GreasePencilWeightAngleModifierData; - -typedef enum GreasePencilWeightAngleModifierFlag { - MOD_GREASE_PENCIL_WEIGHT_ANGLE_MULTIPLY_DATA = (1 << 5), - MOD_GREASE_PENCIL_WEIGHT_ANGLE_INVERT_OUTPUT = (1 << 6), -} GreasePencilWeightAngleModifierFlag; - -typedef enum GreasePencilWeightAngleModifierSpace { - MOD_GREASE_PENCIL_WEIGHT_ANGLE_SPACE_LOCAL = 0, - MOD_GREASE_PENCIL_WEIGHT_ANGLE_SPACE_WORLD = 1, -} GreasePencilWeightAngleModifierSpace; - -typedef struct GreasePencilArrayModifierData { - ModifierData modifier; - GreasePencilModifierInfluenceData influence; - struct Object *object; - int count; - /** #GreasePencilArrayModifierFlag */ - int flag; - float offset[3]; - float shift[3]; - - float rnd_offset[3]; - float rnd_rot[3]; - float rnd_scale[3]; - - char _pad[4]; - /** (first element is the index) random values. (?) */ - int seed; - - /* Replacement material index. */ - int mat_rpl; -} GreasePencilArrayModifierData; - -typedef enum GreasePencilArrayModifierFlag { - MOD_GREASE_PENCIL_ARRAY_USE_OFFSET = (1 << 7), - MOD_GREASE_PENCIL_ARRAY_USE_RELATIVE = (1 << 8), - MOD_GREASE_PENCIL_ARRAY_USE_OB_OFFSET = (1 << 9), - MOD_GREASE_PENCIL_ARRAY_UNIFORM_RANDOM_SCALE = (1 << 10), -} GreasePencilArrayModifierFlag; - -typedef struct GreasePencilWeightProximityModifierData { - ModifierData modifier; - GreasePencilModifierInfluenceData influence; - - /* #GreasePencilWeightProximityFlag. */ - int flag; - char target_vgname[64]; - float min_weight; - - float dist_start; - float dist_end; - - struct Object *object; -} GreasePencilWeightProximityModifierData; - -typedef enum GreasePencilWeightProximityFlag { - MOD_GREASE_PENCIL_WEIGHT_PROXIMITY_INVERT_OUTPUT = (1 << 0), - MOD_GREASE_PENCIL_WEIGHT_PROXIMITY_MULTIPLY_DATA = (1 << 1), -} GreasePencilWeightProximityFlag; - -typedef struct GreasePencilHookModifierData { - ModifierData modifier; - GreasePencilModifierInfluenceData influence; - - struct Object *object; - /** Optional name of bone target, MAX_ID_NAME-2. */ - char subtarget[64]; - char _pad[4]; - - /** #GreasePencilHookFlag. */ - int flag; - /** #GreasePencilHookFalloff. */ - char falloff_type; - char _pad1[3]; - /** Matrix making current transform unmodified. */ - float parentinv[4][4]; - /** Visualization of hook. */ - float cent[3]; - /** If not zero, falloff is distance where influence zero. */ - float falloff; - float force; -} GreasePencilHookModifierData; - -typedef enum GreasePencilHookFlag { - MOD_GREASE_PENCIL_HOOK_UNIFORM_SPACE = (1 << 0), -} GreasePencilHookFlag; - -typedef enum GreasePencilHookFalloff { - MOD_GREASE_PENCIL_HOOK_Falloff_None = 0, - MOD_GREASE_PENCIL_HOOK_Falloff_Curve = 1, - MOD_GREASE_PENCIL_HOOK_Falloff_Sharp = 2, - MOD_GREASE_PENCIL_HOOK_Falloff_Smooth = 3, - MOD_GREASE_PENCIL_HOOK_Falloff_Root = 4, - MOD_GREASE_PENCIL_HOOK_Falloff_Linear = 5, - MOD_GREASE_PENCIL_HOOK_Falloff_Const = 6, - MOD_GREASE_PENCIL_HOOK_Falloff_Sphere = 7, - MOD_GREASE_PENCIL_HOOK_Falloff_InvSquare = 8, -} GreasePencilHookFalloff; - -/* This enum is for modifier internal state only. */ -typedef enum eGreasePencilLineartFlags { - /* These two moved to #eLineartMainFlags to keep consistent with flag variable purpose. */ - /* LINEART_GPENCIL_INVERT_SOURCE_VGROUP = (1 << 0), */ - /* LINEART_GPENCIL_MATCH_OUTPUT_VGROUP = (1 << 1), */ - LINEART_GPENCIL_BINARY_WEIGHTS = (1 - << 2) /* Deprecated, this is removed for lack of use case. */, - LINEART_GPENCIL_IS_BAKED = (1 << 3), - LINEART_GPENCIL_USE_CACHE = (1 << 4), - LINEART_GPENCIL_OFFSET_TOWARDS_CUSTOM_CAMERA = (1 << 5), - LINEART_GPENCIL_INVERT_COLLECTION = (1 << 6), - LINEART_GPENCIL_INVERT_SILHOUETTE_FILTER = (1 << 7), -} eGreasePencilLineartFlags; - -typedef enum GreasePencilLineartModifierSource { - LINEART_SOURCE_COLLECTION = 0, - LINEART_SOURCE_OBJECT = 1, - LINEART_SOURCE_SCENE = 2, -} GreasePencilLineartModifierSource; - -typedef enum GreasePencilLineartModifierShadowFilter { - /* These options need to be ordered in this way because those latter options requires line art to - * run a few extra stages. Having those values set up this way will allow - * #BKE_gpencil_get_lineart_modifier_limits() to find out maximum stages needed in multiple - * cached line art modifiers. */ - LINEART_SHADOW_FILTER_NONE = 0, - LINEART_SHADOW_FILTER_ILLUMINATED = 1, - LINEART_SHADOW_FILTER_SHADED = 2, - LINEART_SHADOW_FILTER_ILLUMINATED_ENCLOSED_SHAPES = 3, -} GreasePencilLineartModifierShadowFilter; - -/* This enum is for modifier internal state only. */ -typedef enum eLineArtGPencilModifierFlags { - /* These two moved to #eLineartMainFlags to keep consistent with flag variable purpose. */ - /* MOD_LINEART_INVERT_SOURCE_VGROUP = (1 << 0), */ - /* MOD_LINEART_MATCH_OUTPUT_VGROUP = (1 << 1), */ - MOD_LINEART_BINARY_WEIGHTS = (1 << 2) /* Deprecated, this is removed for lack of use case. */, - MOD_LINEART_IS_BAKED = (1 << 3), - MOD_LINEART_USE_CACHE = (1 << 4), - MOD_LINEART_OFFSET_TOWARDS_CUSTOM_CAMERA = (1 << 5), - MOD_LINEART_INVERT_COLLECTION = (1 << 6), - MOD_LINEART_INVERT_SILHOUETTE_FILTER = (1 << 7), -} eLineArtGPencilModifierFlags; - -typedef enum GreasePencilLineartMaskSwitches { - MOD_LINEART_MATERIAL_MASK_ENABLE = (1 << 0), - /** When set, material mask bit comparisons are done with bit wise "AND" instead of "OR". */ - MOD_LINEART_MATERIAL_MASK_MATCH = (1 << 1), - MOD_LINEART_INTERSECTION_MATCH = (1 << 2), -} GreasePencilLineartMaskSwitches; - -typedef enum eGreasePencilLineartMaskSwitches { - LINEART_GPENCIL_MATERIAL_MASK_ENABLE = (1 << 0), - /** When set, material mask bit comparisons are done with bit wise "AND" instead of "OR". */ - LINEART_GPENCIL_MATERIAL_MASK_MATCH = (1 << 1), - LINEART_GPENCIL_INTERSECTION_MATCH = (1 << 2), -} eGreasePencilLineartMaskSwitches; - -typedef enum eGreasePencilLineartSilhouetteFilter { - LINEART_SILHOUETTE_FILTER_NONE = 0, - LINEART_SILHOUETTE_FILTER_GROUP = (1 << 0), - LINEART_SILHOUETTE_FILTER_INDIVIDUAL = (1 << 1), -} eGreasePencilLineartSilhouetteFilter; - -struct LineartCache; - -typedef struct GreasePencilLineartModifierData { - ModifierData modifier; - - /* [Important] Note on legacy material/layer selection variables: - * - * Now uses the layer/material variables in the `influence` - * field above, thus old layer/material fields are obsolete. - * - * Do not change any of the data below since the layout of these - * data is currently shared with the old line art modifier. - * See `BKE_grease_pencil_lineart_wrap_v3` for how it works. */ - - uint16_t edge_types; /* line type enable flags, bits in eLineartEdgeFlag */ - - /** Object or Collection, from #eGreasePencilLineartSource. */ - char source_type; - - char use_multiple_levels; - short level_start; - short level_end; - - struct Object *source_camera; - struct Object *light_contour_object; - - struct Object *source_object; - struct Collection *source_collection; - - /* These are redundant in GPv3, see above for explanations. */ - struct Material *target_material; - char target_layer[64]; - - /** - * These two variables are to pass on vertex group information from mesh to strokes. - * `vgname` specifies which vertex groups our strokes from source_vertex_group will go to. - * - * These are redundant in GPv3, see above for explanations. - */ - char source_vertex_group[64]; - char vgname[64]; - - /* Camera focal length is divided by (1 + over-scan), before calculation, which give a wider FOV, - * this doesn't change coordinates range internally (-1, 1), but makes the calculated frame - * bigger than actual output. This is for the easier shifting calculation. A value of 0.5 means - * the "internal" focal length become 2/3 of the actual camera. */ - float overscan; - - /* Values for point light and directional (sun) light. */ - /* For point light, fov always gonna be 120 deg horizontal, with 3 "cameras" covering 360 deg. */ - float shadow_camera_fov; - float shadow_camera_size; - float shadow_camera_near; - float shadow_camera_far; - - float opacity; - short thickness; - - unsigned char mask_switches; /* #eGreasePencilLineartMaskSwitches */ - unsigned char material_mask_bits; - unsigned char intersection_mask; - - unsigned char shadow_selection; - unsigned char silhouette_selection; - char _pad[1]; - - /** `0..1` range for cosine angle */ - float crease_threshold; - - /** `0..PI` angle, for splitting strokes at sharp points. */ - float angle_splitting_threshold; - - /** Strength for smoothing jagged chains. */ - float chain_smooth_tolerance; - - /* CPU mode */ - float chaining_image_threshold; - - /* eLineartMainFlags, for one time calculation. */ - int calculation_flags; - - /* #eGreasePencilLineartFlags, modifier internal state. */ - int flags; - - /* Move strokes towards camera to avoid clipping while preserve depth for the viewport. */ - float stroke_depth_offset; - - /* Runtime data. */ - - /* Because we can potentially only compute features lines once per modifier stack (Use Cache), we - * need to have these override values to ensure that we have the data we need is computed and - * stored in the cache. */ - char level_start_override; - char level_end_override; - short edge_types_override; - char shadow_selection_override; - char shadow_use_silhouette_override; - - char _pad2[6]; - - /* Shared cache will only be on the first line art modifier in the stack, and will exist until - * the end of modifier stack evaluation. If the object has line art modifiers, this variable is - * then initialized in #grease_pencil_evaluate_modifiers(). */ - struct LineartCache *shared_cache; - - /* Cache for single execution of line art, when LINEART_GPENCIL_USE_CACHE is enabled, this is a - * reference to first_lineart->shared_cache, otherwise it holds its own cache. */ - struct LineartCache *cache; - - /* Keep a pointer to the render buffer so we can call destroy from #ModifierData. */ - struct LineartData *la_data_ptr; -} GreasePencilLineartModifierData; - -typedef struct GreasePencilArmatureModifierData { - ModifierData modifier; - GreasePencilModifierInfluenceData influence; - - struct Object *object; - /** #eArmature_DeformFlag. */ - short deformflag; - char _pad[6]; -} GreasePencilArmatureModifierData; - -typedef struct GreasePencilTimeModifierSegment { - char name[64]; - int segment_start; - int segment_end; - int segment_mode; - int segment_repeat; -} GreasePencilTimeModifierSegment; - -typedef struct GreasePencilTimeModifierData { - ModifierData modifier; - GreasePencilModifierInfluenceData influence; - /** #GreasePencilTimeModifierFlag */ - int flag; - int offset; - /** Animation scale. */ - float frame_scale; - int mode; - /** Start and end frame for custom range. */ - int sfra, efra; - - GreasePencilTimeModifierSegment *segments_array; - int segments_num; - int segment_active_index; - -#ifdef __cplusplus - blender::Span segments() const; - blender::MutableSpan segments(); -#endif -} GreasePencilTimeModifierData; - -typedef enum GreasePencilTimeModifierFlag { - MOD_GREASE_PENCIL_TIME_KEEP_LOOP = (1 << 0), - MOD_GREASE_PENCIL_TIME_CUSTOM_RANGE = (1 << 1), -} GreasePencilTimeModifierFlag; - -typedef enum GreasePencilTimeModifierMode { - MOD_GREASE_PENCIL_TIME_MODE_NORMAL = 0, - MOD_GREASE_PENCIL_TIME_MODE_REVERSE = 1, - MOD_GREASE_PENCIL_TIME_MODE_FIX = 2, - MOD_GREASE_PENCIL_TIME_MODE_PINGPONG = 3, - MOD_GREASE_PENCIL_TIME_MODE_CHAIN = 4, -} GreasePencilTimeModifierMode; - -typedef enum GreasePencilTimeModifierSegmentMode { - MOD_GREASE_PENCIL_TIME_SEG_MODE_NORMAL = 0, - MOD_GREASE_PENCIL_TIME_SEG_MODE_REVERSE = 1, - MOD_GREASE_PENCIL_TIME_SEG_MODE_PINGPONG = 2, -} GreasePencilTimeModifierSegmentMode; - -typedef struct GreasePencilEnvelopeModifierData { - ModifierData modifier; - GreasePencilModifierInfluenceData influence; - /* #GreasePencilEnvelopeModifierMode. */ - int mode; - /** Material for the new strokes. */ - int mat_nr; - /** Thickness multiplier for the new strokes. */ - float thickness; - /** Strength multiplier for the new strokes. */ - float strength; - /** Number of points to skip over. */ - int skip; - /* Length of the envelope effect. */ - int spread; -} GreasePencilEnvelopeModifierData; - -/* Texture->mode */ -typedef enum GreasePencilEnvelopeModifierMode { - MOD_GREASE_PENCIL_ENVELOPE_DEFORM = 0, - MOD_GREASE_PENCIL_ENVELOPE_SEGMENTS = 1, - MOD_GREASE_PENCIL_ENVELOPE_FILLS = 2, -} GreasePencilEnvelopeModifierMode; - -typedef struct GreasePencilOutlineModifierData { - ModifierData modifier; - GreasePencilModifierInfluenceData influence; - - /** Target stroke origin. */ - struct Object *object; - /** #GreasePencilOutlineModifierFlag. */ - int flag; - /** Thickness. */ - int thickness; - /** Sample Length. */ - float sample_length; - /** Subdivisions. */ - int subdiv; - /** Material for outline. */ - struct Material *outline_material; -} GreasePencilOutlineModifierData; - -typedef enum GreasePencilOutlineModifierFlag { - MOD_GREASE_PENCIL_OUTLINE_KEEP_SHAPE = (1 << 0), -} GreasePencilOutlineModifierFlag; - -typedef struct GreasePencilShrinkwrapModifierData { - ModifierData modifier; - GreasePencilModifierInfluenceData influence; - - /** Shrink target. */ - struct Object *target; - /** Additional shrink target. */ - struct Object *aux_target; - /** Distance offset to keep from mesh/projection point. */ - float keep_dist; - /** Shrink type projection. */ - short shrink_type; - /** Shrink options. */ - char shrink_opts; - /** Shrink to surface mode. */ - char shrink_mode; - /** Limit the projection ray cast. */ - float proj_limit; - /** Axis to project over. */ - char proj_axis; - - /** - * If using projection over vertex normal this controls the level of subsurface that must be - * done before getting the vertex coordinates and normal. - */ - char subsurf_levels; - char _pad[2]; - /** Factor of smooth. */ - float smooth_factor; - /** How many times apply smooth. */ - int smooth_step; - - /** Runtime only. */ - struct ShrinkwrapTreeData *cache_data; -} GreasePencilShrinkwrapModifierData; diff --git a/source/blender/makesdna/DNA_movieclip_defaults.h b/source/blender/makesdna/DNA_movieclip_defaults.h index b095936b70d..450d688df3e 100644 --- a/source/blender/makesdna/DNA_movieclip_defaults.h +++ b/source/blender/makesdna/DNA_movieclip_defaults.h @@ -8,6 +8,7 @@ #pragma once +/* Struct members on own line. */ /* clang-format off */ /* -------------------------------------------------------------------- */ diff --git a/source/blender/makesdna/DNA_node_types.h b/source/blender/makesdna/DNA_node_types.h index 89eb13c5cd2..a5d9a593653 100644 --- a/source/blender/makesdna/DNA_node_types.h +++ b/source/blender/makesdna/DNA_node_types.h @@ -263,7 +263,6 @@ typedef enum eNodeSocketDatatype { SOCK_MATERIAL = 13, SOCK_ROTATION = 14, SOCK_MENU = 15, - SOCK_MATRIX = 16, } eNodeSocketDatatype; /** Socket shape. */ @@ -540,22 +539,6 @@ enum { */ typedef struct bNodeInstanceKey { unsigned int value; - -#ifdef __cplusplus - inline bool operator==(const bNodeInstanceKey &other) const - { - return value == other.value; - } - inline bool operator!=(const bNodeInstanceKey &other) const - { - return !(*this == other); - } - - inline uint64_t hash() const - { - return value; - } -#endif } bNodeInstanceKey; /** @@ -619,6 +602,16 @@ enum { NTREE_QUALITY_LOW = 2, }; +/** #bNodeTree::chunksize */ +enum { + NTREE_CHUNKSIZE_32 = 32, + NTREE_CHUNKSIZE_64 = 64, + NTREE_CHUNKSIZE_128 = 128, + NTREE_CHUNKSIZE_256 = 256, + NTREE_CHUNKSIZE_512 = 512, + NTREE_CHUNKSIZE_1024 = 1024, +}; + typedef struct bNestedNodePath { /** ID of the node that is or contains the nested node. */ int32_t node_id; @@ -644,7 +637,7 @@ typedef struct bNestedNodeRef { * The basis for a Node tree, all links and nodes reside internal here. * * Only re-usable node trees are in the library though, - * materials and textures allocate their own tree struct. + * materials and textures allocate own tree struct. */ typedef struct bNodeTree { ID id; @@ -661,7 +654,7 @@ typedef struct bNodeTree { /** Grease pencil data. */ struct bGPdata *gpd; - /** Node tree stores its own offset for consistent editor view. */ + /** Node tree stores own offset for consistent editor view. */ float view_center[2]; ListBase nodes, links; @@ -679,11 +672,15 @@ typedef struct bNodeTree { short edit_quality; /** Quality setting when rendering. */ short render_quality; + /** Tile size for compositor engine. */ + int chunksize; /** Execution mode to use for compositor engine. */ int execution_mode; /** Execution mode to use for compositor engine. */ int precision; + char _pad[4]; + rctf viewer_border; /** @@ -829,8 +826,12 @@ enum { enum { /** For animation editors. */ NTREE_DS_EXPAND = 1 << 0, + /** Use OPENCL. */ + NTREE_COM_OPENCL = 1 << 1, /** Two pass. */ NTREE_TWO_PASS = 1 << 2, + /** Use group-node buffers. */ + NTREE_COM_GROUPNODE_BUFFER = 1 << 3, /** Use a border for viewer nodes. */ NTREE_VIEWER_BORDER = 1 << 4, /** @@ -842,8 +843,9 @@ enum { /* tree->execution_mode */ typedef enum eNodeTreeExecutionMode { - NTREE_EXECUTION_MODE_CPU = 0, - NTREE_EXECUTION_MODE_GPU = 2, + NTREE_EXECUTION_MODE_TILED = 0, + NTREE_EXECUTION_MODE_FULL_FRAME = 1, + NTREE_EXECUTION_MODE_REALTIME = 2, } eNodeTreeExecutionMode; /* tree->precision */ @@ -2546,7 +2548,6 @@ typedef enum CMPNodeGlareType { CMP_NODE_GLARE_FOG_GLOW = 1, CMP_NODE_GLARE_STREAKS = 2, CMP_NODE_GLARE_GHOST = 3, - CMP_NODE_GLARE_BLOOM = 4, } CMPNodeGlareType; /* Kuwahara Node. Stored in variation */ @@ -2655,6 +2656,12 @@ typedef enum GeometryNodeProximityTargetType { GEO_NODE_PROX_TARGET_FACES = 2, } GeometryNodeProximityTargetType; +typedef enum GeometryNodeBooleanOperation { + GEO_NODE_BOOLEAN_INTERSECT = 0, + GEO_NODE_BOOLEAN_UNION = 1, + GEO_NODE_BOOLEAN_DIFFERENCE = 2, +} GeometryNodeBooleanOperation; + typedef enum GeometryNodeCurvePrimitiveCircleMode { GEO_NODE_CURVE_PRIMITIVE_CIRCLE_TYPE_POINTS = 0, GEO_NODE_CURVE_PRIMITIVE_CIRCLE_TYPE_RADIUS = 1 diff --git a/source/blender/makesdna/DNA_object_defaults.h b/source/blender/makesdna/DNA_object_defaults.h index 8f38be4691a..6797e76b2cf 100644 --- a/source/blender/makesdna/DNA_object_defaults.h +++ b/source/blender/makesdna/DNA_object_defaults.h @@ -10,6 +10,7 @@ #include "DNA_vec_defaults.h" +/* Struct members on own line. */ /* clang-format off */ /* -------------------------------------------------------------------- */ @@ -24,6 +25,7 @@ \ .constinv = _DNA_DEFAULT_UNIT_M4, \ .parentinv = _DNA_DEFAULT_UNIT_M4, \ + .object_to_world = _DNA_DEFAULT_UNIT_M4, \ \ .scale = {1, 1, 1}, \ .dscale = {1, 1, 1}, \ diff --git a/source/blender/makesdna/DNA_object_force_types.h b/source/blender/makesdna/DNA_object_force_types.h index 71415d208b1..bcc73ad8f78 100644 --- a/source/blender/makesdna/DNA_object_force_types.h +++ b/source/blender/makesdna/DNA_object_force_types.h @@ -178,10 +178,10 @@ typedef struct SBVertex { float vec[4]; } SBVertex; -/* Container for data that is shared among evaluated copies. +/* Container for data that is shared among CoW copies. * * This is placed in a separate struct so that values can be changed - * without having to update all evaluated copies. */ + * without having to update all CoW copies. */ typedef struct SoftBody_Shared { struct PointCache *pointcache; struct ListBase ptcaches; diff --git a/source/blender/makesdna/DNA_object_types.h b/source/blender/makesdna/DNA_object_types.h index f1f2901638f..db110cbb2c0 100644 --- a/source/blender/makesdna/DNA_object_types.h +++ b/source/blender/makesdna/DNA_object_types.h @@ -24,10 +24,6 @@ #include "DNA_defs.h" #include "DNA_listBase.h" -#ifdef __cplusplus -# include "BLI_math_matrix_types.hh" -#endif - #ifdef __cplusplus namespace blender::bke { struct ObjectRuntime; @@ -278,6 +274,9 @@ typedef struct Object { float rotAxis[3], drotAxis[3]; /** Axis angle rotation - angle part. */ float rotAngle, drotAngle; + /** Final transformation matrices with constraints & animsys applied. */ + float object_to_world[4][4]; + float world_to_object[4][4]; /** Inverse result of parent, so that object doesn't 'stick' to parent. */ float parentinv[4][4]; /** Inverse result of constraints. @@ -400,11 +399,6 @@ typedef struct Object { struct LightProbeObjectCache *lightprobe_cache; ObjectRuntimeHandle *runtime; - -#ifdef __cplusplus - const blender::float4x4 &object_to_world() const; - const blender::float4x4 &world_to_object() const; -#endif } Object; /** DEPRECATED: this is not used anymore because hooks are now modifiers. */ @@ -634,9 +628,9 @@ enum { GP_EMPTY = 0, GP_STROKE = 1, GP_MONKEY = 2, - GREASE_PENCIL_LINEART_SCENE = 3, - GREASE_PENCIL_LINEART_OBJECT = 4, - GREASE_PENCIL_LINEART_COLLECTION = 5, + GP_LRT_SCENE = 3, + GP_LRT_OBJECT = 4, + GP_LRT_COLLECTION = 5, }; /** #Object.boundtype */ diff --git a/source/blender/makesdna/DNA_particle_defaults.h b/source/blender/makesdna/DNA_particle_defaults.h index b49105f51e5..af86c4e595e 100644 --- a/source/blender/makesdna/DNA_particle_defaults.h +++ b/source/blender/makesdna/DNA_particle_defaults.h @@ -8,6 +8,7 @@ #pragma once +/* Struct members on own line. */ /* clang-format off */ /* -------------------------------------------------------------------- */ diff --git a/source/blender/makesdna/DNA_particle_types.h b/source/blender/makesdna/DNA_particle_types.h index ad7c6c0012e..c8b664c1c67 100644 --- a/source/blender/makesdna/DNA_particle_types.h +++ b/source/blender/makesdna/DNA_particle_types.h @@ -392,7 +392,7 @@ typedef struct ParticleSystem { void *batch_cache; /** - * Set by dependency graph's copy-on-evaluation, allows to quickly go + * Set by dependency graph's copy-on-write, allows to quickly go * from evaluated particle system to original one. * * Original system will have this set to NULL. diff --git a/source/blender/makesdna/DNA_pointcloud_defaults.h b/source/blender/makesdna/DNA_pointcloud_defaults.h index 4701e83d80c..3abb7db768c 100644 --- a/source/blender/makesdna/DNA_pointcloud_defaults.h +++ b/source/blender/makesdna/DNA_pointcloud_defaults.h @@ -8,6 +8,7 @@ #pragma once +/* Struct members on own line. */ /* clang-format off */ /* -------------------------------------------------------------------- */ diff --git a/source/blender/makesdna/DNA_rigidbody_types.h b/source/blender/makesdna/DNA_rigidbody_types.h index 085c4ac7cae..ee287910ea0 100644 --- a/source/blender/makesdna/DNA_rigidbody_types.h +++ b/source/blender/makesdna/DNA_rigidbody_types.h @@ -84,10 +84,10 @@ typedef enum eRigidBodyWorld_Flag { /* ******************************** */ /* RigidBody Object */ -/* Container for data that is shared among evaluated copies. +/* Container for data that is shared among CoW copies. * * This is placed in a separate struct so that, for example, the physics_shape - * pointer can be replaced without having to update all evaluated copies. */ + * pointer can be replaced without having to update all CoW copies. */ # # typedef struct RigidBodyOb_Shared { diff --git a/source/blender/makesdna/DNA_scene_defaults.h b/source/blender/makesdna/DNA_scene_defaults.h index 8cdd1d5098a..29661489c52 100644 --- a/source/blender/makesdna/DNA_scene_defaults.h +++ b/source/blender/makesdna/DNA_scene_defaults.h @@ -10,6 +10,7 @@ #include "DNA_view3d_defaults.h" +/* Struct members on own line. */ /* clang-format off */ /* -------------------------------------------------------------------- */ @@ -75,6 +76,7 @@ .framapto = 100, \ .images = 100, \ .framelen = 1.0, \ + .blurfac = 0.5, \ .frs_sec = 24, \ .frs_sec_base = 1, \ \ @@ -127,8 +129,6 @@ .unit_line_thickness = 1.0f, \ \ .ffcodecdata = _DNA_DEFAULT_FFMpegCodecData, \ - \ - .motion_blur_shutter = 0.5f, \ } #define _DNA_DEFAULT_AudioData \ @@ -226,6 +226,7 @@ .bloom_radius = 6.5f, \ .bloom_clamp = 0.0f, \ \ + .motion_blur_shutter = 0.5f, \ .motion_blur_depth_scale = 100.0f, \ .motion_blur_max = 32, \ .motion_blur_steps = 1, \ @@ -377,10 +378,6 @@ .snap_flag_anim = SCE_SNAP, \ .snap_transform_mode_flag = SCE_SNAP_TRANSFORM_MODE_TRANSLATE, \ .snap_face_nearest_steps = 1, \ - .snap_angle_increment_3d = DEG2RADF(5.0f), \ - .snap_angle_increment_2d = DEG2RADF(5.0f), \ - .snap_angle_increment_3d_precision = DEG2RADF(1.0f), \ - .snap_angle_increment_2d_precision = DEG2RADF(1.0f), \ \ .curve_paint_settings = _DNA_DEFAULTS_CurvePaintSettings, \ \ diff --git a/source/blender/makesdna/DNA_scene_types.h b/source/blender/makesdna/DNA_scene_types.h index 631d6c9da98..dc9e9d868f8 100644 --- a/source/blender/makesdna/DNA_scene_types.h +++ b/source/blender/makesdna/DNA_scene_types.h @@ -44,16 +44,6 @@ struct World; struct bGPdata; struct bNodeTree; -/** Workaround to forward-declare C++ type in C header. */ -#ifdef __cplusplus -namespace blender::bke { -class SceneRuntime; -} -using SceneRuntimeHandle = blender::bke::SceneRuntime; -#else // __cplusplus -typedef struct SceneRuntimeHandle SceneRuntimeHandle; -#endif // __cplusplus - /* -------------------------------------------------------------------- */ /** \name FFMPEG * \{ */ @@ -199,7 +189,6 @@ typedef struct SceneRenderLayer { /** Converted to ViewLayer setting. */ struct Material *mat_override DNA_DEPRECATED; - struct World *world_override DNA_DEPRECATED; /** Converted to LayerCollection cycles camera visibility override. */ unsigned int lay DNA_DEPRECATED; @@ -697,17 +686,21 @@ typedef struct RenderData { int images, framapto; short flag, threads; - float framelen; + float framelen, blurfac; /** Frames to jump during render/playback. */ int frame_step; + char _pad10[2]; + /** For the dimensions presets menu. */ short dimensionspreset; /** Size in %. */ short size; + char _pad6[2]; + /* From buttons: */ /** * The desired number of pixels in the x direction @@ -852,9 +845,7 @@ typedef struct RenderData { /* Hair Display. */ short hair_type, hair_subdiv; - /** Motion blur */ - float motion_blur_shutter; - int motion_blur_position; + /** Motion blur shutter. */ struct CurveMapping mblur_shutter_curve; } RenderData; @@ -869,13 +860,6 @@ typedef enum eHairType { SCE_HAIR_SHAPE_STRIP = 1, } eHairType; -/** #RenderData::motion_blur_position */ -enum { - SCE_MB_CENTER = 0, - SCE_MB_START = 1, - SCE_MB_END = 2, -}; - /** \} */ /* -------------------------------------------------------------------- */ @@ -1556,7 +1540,7 @@ typedef struct ToolSettings { /** Weight paint. */ VPaint *wpaint; Sculpt *sculpt; - /** UV smooth. */ + /** Uv smooth. */ UvSculpt *uvsculpt; /** Gpencil paint. */ GpPaint *gp_paint; @@ -1749,12 +1733,6 @@ typedef struct ToolSettings { char use_plane_axis_auto; char _pad7[2]; - /** Rotation Angle snapping amount */ - float snap_angle_increment_2d; - float snap_angle_increment_2d_precision; - float snap_angle_increment_3d; - float snap_angle_increment_3d_precision; - } ToolSettings; /** \} */ @@ -1912,8 +1890,8 @@ typedef struct SceneEEVEE { int motion_blur_samples DNA_DEPRECATED; int motion_blur_max; int motion_blur_steps; - int motion_blur_position_deprecated DNA_DEPRECATED; - float motion_blur_shutter_deprecated DNA_DEPRECATED; + int motion_blur_position; + float motion_blur_shutter; float motion_blur_depth_scale; int shadow_method DNA_DEPRECATED; @@ -1923,8 +1901,8 @@ typedef struct SceneEEVEE { int shadow_ray_count; int shadow_step_count; float shadow_normal_bias; - float _pad0; + char _pad[4]; int ray_tracing_method; struct RaytraceEEVEE ray_tracing_options; @@ -2103,9 +2081,6 @@ typedef struct Scene { struct SceneEEVEE eevee; struct SceneGpencil grease_pencil_settings; struct SceneHydra hydra; - - SceneRuntimeHandle *runtime; - void *_pad9; } Scene; /** \} */ @@ -2870,7 +2845,7 @@ enum { SCE_EEVEE_GTAO_BOUNCE = (1 << 6), // SCE_EEVEE_DOF_ENABLED = (1 << 7), /* Moved to camera->dof.flag */ SCE_EEVEE_BLOOM_ENABLED = (1 << 8), - SCE_EEVEE_MOTION_BLUR_ENABLED_DEPRECATED = (1 << 9), /* Moved to scene->r.mode */ + SCE_EEVEE_MOTION_BLUR_ENABLED = (1 << 9), SCE_EEVEE_SHADOW_HIGH_BITDEPTH = (1 << 10), SCE_EEVEE_TAA_REPROJECTION = (1 << 11), // SCE_EEVEE_SSS_ENABLED = (1 << 12), /* Unused */ @@ -2913,6 +2888,13 @@ enum { /* SHADOW_METHOD_MAX = 3, */ /* UNUSED */ }; +/** #SceneEEVEE::motion_blur_position */ +enum { + SCE_EEVEE_MB_CENTER = 0, + SCE_EEVEE_MB_START = 1, + SCE_EEVEE_MB_END = 2, +}; + /** #SceneDisplay->render_aa and #SceneDisplay->viewport_aa */ enum { SCE_DISPLAY_AA_OFF = 0, diff --git a/source/blender/makesdna/DNA_sequence_types.h b/source/blender/makesdna/DNA_sequence_types.h index af015d92f51..d39671fa981 100644 --- a/source/blender/makesdna/DNA_sequence_types.h +++ b/source/blender/makesdna/DNA_sequence_types.h @@ -227,7 +227,7 @@ typedef struct Sequence { /** The linked "bSound" object. */ struct bSound *sound; - /** Handle to #AUD_SequenceEntry. */ + /** Handle to #AUD_SequenceEntry*/ void *scene_sound; float volume; diff --git a/source/blender/makesdna/DNA_space_defaults.h b/source/blender/makesdna/DNA_space_defaults.h index 86d9d72cc3f..767823edf23 100644 --- a/source/blender/makesdna/DNA_space_defaults.h +++ b/source/blender/makesdna/DNA_space_defaults.h @@ -8,6 +8,7 @@ #pragma once +/* Struct members on own line. */ /* clang-format off */ /* -------------------------------------------------------------------- */ diff --git a/source/blender/makesdna/DNA_space_types.h b/source/blender/makesdna/DNA_space_types.h index b59e8b6c187..8c93194c352 100644 --- a/source/blender/makesdna/DNA_space_types.h +++ b/source/blender/makesdna/DNA_space_types.h @@ -1033,7 +1033,7 @@ typedef enum eFileSelectType { /** * #FileSelectParams.flag / `sfile->params->flag`. * \note short flag, also used as 16 lower bits of flags in link/append code - * (WM and BLO code area, see #eBLOLibLinkFlags in BLO_readfile.hh). + * (WM and BLO code area, see #eBLOLibLinkFlags in BLO_readfile.h). */ typedef enum eFileSel_Params_Flag { FILE_PARAMS_FLAG_UNUSED_1 = (1 << 0), @@ -1267,14 +1267,12 @@ typedef struct SpaceImage { char gizmo_flag; char grid_shape_source; - char _pad1[6]; + char _pad1[2]; int flag; float uv_opacity; - float stretch_opacity; - int tile_grid_shape[2]; /** * UV editor custom-grid. Value of `{M,N}` will produce `MxN` grid. @@ -2042,7 +2040,6 @@ typedef enum eSpreadsheetColumnValueType { SPREADSHEET_VALUE_TYPE_INT8 = 9, SPREADSHEET_VALUE_TYPE_INT32_2D = 10, SPREADSHEET_VALUE_TYPE_QUATERNION = 11, - SPREADSHEET_VALUE_TYPE_FLOAT4X4 = 12, } eSpreadsheetColumnValueType; /** diff --git a/source/blender/makesdna/DNA_speaker_defaults.h b/source/blender/makesdna/DNA_speaker_defaults.h index 129a1615345..56998fbe15f 100644 --- a/source/blender/makesdna/DNA_speaker_defaults.h +++ b/source/blender/makesdna/DNA_speaker_defaults.h @@ -8,6 +8,7 @@ #pragma once +/* Struct members on own line. */ /* clang-format off */ /* -------------------------------------------------------------------- */ diff --git a/source/blender/makesdna/DNA_texture_defaults.h b/source/blender/makesdna/DNA_texture_defaults.h index 8e5e14bbdd0..1f3a8c3246e 100644 --- a/source/blender/makesdna/DNA_texture_defaults.h +++ b/source/blender/makesdna/DNA_texture_defaults.h @@ -8,6 +8,7 @@ #pragma once +/* Struct members on own line. */ /* clang-format off */ /* -------------------------------------------------------------------- */ diff --git a/source/blender/makesdna/DNA_userdef_defaults.h b/source/blender/makesdna/DNA_userdef_defaults.h index 992d009b6ab..6bd35d28ce0 100644 --- a/source/blender/makesdna/DNA_userdef_defaults.h +++ b/source/blender/makesdna/DNA_userdef_defaults.h @@ -10,6 +10,7 @@ #include "DNA_asset_types.h" +/* Struct members on own line. */ /* clang-format off */ /* -------------------------------------------------------------------- */ diff --git a/source/blender/makesdna/DNA_userdef_types.h b/source/blender/makesdna/DNA_userdef_types.h index 0daa2b2585f..96977c5cd11 100644 --- a/source/blender/makesdna/DNA_userdef_types.h +++ b/source/blender/makesdna/DNA_userdef_types.h @@ -716,14 +716,12 @@ typedef struct UserDef_Experimental { char use_extended_asset_browser; char use_sculpt_texture_paint; char use_grease_pencil_version3; - char use_new_matrix_socket; char enable_overlay_next; char use_new_volume_nodes; char use_shader_node_previews; char use_extension_repos; - char use_extension_utils; - char _pad[2]; + char _pad[4]; /** `makesdna` does not allow empty structs. */ } UserDef_Experimental; @@ -741,12 +739,6 @@ typedef struct bUserScriptDirectory { char dir_path[768]; /* FILE_MAXDIR */ } bUserScriptDirectory; -/** - * Main user preferences data, typically accessed from #U. - * See: #BKE_blendfile_userdef_from_defaults & #BKE_blendfile_userdef_read. - * - * \note This is either loaded from the file #BLENDER_USERPREF_FILE or from memory, see #U_default. - */ typedef struct UserDef { DNA_DEFINE_CXX_METHODS(UserDef) @@ -1060,7 +1052,7 @@ typedef struct UserDef { UserDef_Runtime runtime; } UserDef; -/** From `source/blender/blenkernel/intern/blender.cc`. */ +/** From blenkernel `blender.cc`. */ extern UserDef U; /* ***************** USERDEF ****************** */ @@ -1478,6 +1470,16 @@ typedef enum eUserpref_VirtualPixel { VIRTUAL_PIXEL_DOUBLE = 1, } eUserpref_VirtualPixel; +typedef enum eOpensubdiv_Computee_Type { + USER_OPENSUBDIV_COMPUTE_NONE = 0, + USER_OPENSUBDIV_COMPUTE_CPU = 1, + USER_OPENSUBDIV_COMPUTE_OPENMP = 2, + USER_OPENSUBDIV_COMPUTE_OPENCL = 3, + USER_OPENSUBDIV_COMPUTE_CUDA = 4, + USER_OPENSUBDIV_COMPUTE_GLSL_TRANSFORM_FEEDBACK = 5, + USER_OPENSUBDIV_COMPUTE_GLSL_COMPUTE = 6, +} eOpensubdiv_Computee_Type; + /** #UserDef.factor_display_type */ typedef enum eUserpref_FactorDisplay { USER_FACTOR_AS_FACTOR = 0, diff --git a/source/blender/makesdna/DNA_vec_types.h b/source/blender/makesdna/DNA_vec_types.h index ba98dadf16b..ea2063e1e4d 100644 --- a/source/blender/makesdna/DNA_vec_types.h +++ b/source/blender/makesdna/DNA_vec_types.h @@ -49,10 +49,6 @@ typedef struct vec4i { typedef struct vec4f { float x, y, z, w; } vec4f; - -typedef struct mat4x4f { - float value[4][4]; -} mat4x4f; /* typedef struct vec4d { double x, y, z, w; diff --git a/source/blender/makesdna/DNA_view3d_defaults.h b/source/blender/makesdna/DNA_view3d_defaults.h index 1d97cd75d9b..1ac5ec72b07 100644 --- a/source/blender/makesdna/DNA_view3d_defaults.h +++ b/source/blender/makesdna/DNA_view3d_defaults.h @@ -8,6 +8,7 @@ #pragma once +/* Struct members on own line. */ /* clang-format off */ /* -------------------------------------------------------------------- */ diff --git a/source/blender/makesdna/DNA_volume_defaults.h b/source/blender/makesdna/DNA_volume_defaults.h index d5aa5b1b64b..3c3330b5ea2 100644 --- a/source/blender/makesdna/DNA_volume_defaults.h +++ b/source/blender/makesdna/DNA_volume_defaults.h @@ -8,6 +8,7 @@ #pragma once +/* Struct members on own line. */ /* clang-format off */ /* -------------------------------------------------------------------- */ diff --git a/source/blender/makesdna/DNA_windowmanager_types.h b/source/blender/makesdna/DNA_windowmanager_types.h index cac76d14430..e55911bd0bf 100644 --- a/source/blender/makesdna/DNA_windowmanager_types.h +++ b/source/blender/makesdna/DNA_windowmanager_types.h @@ -21,16 +21,6 @@ using std_mutex_type = std::mutex; # define std_mutex_type void #endif -/** Workaround to forward-declare C++ type in C header. */ -#ifdef __cplusplus -namespace blender::bke { -class WindowManagerRuntime; -} -using WindowManagerRuntimeHandle = blender::bke::WindowManagerRuntime; -#else // __cplusplus -typedef struct WindowManagerRuntimeHandle WindowManagerRuntimeHandle; -#endif // __cplusplus - /* Defined here: */ struct wmWindow; @@ -184,6 +174,9 @@ typedef struct wmWindowManager { struct GSet *notifier_queue_set; void *_pad1; + /** Information and error reports. */ + struct ReportList reports; + /** Threaded jobs manager. */ ListBase jobs; @@ -210,20 +203,19 @@ typedef struct wmWindowManager { ListBase timers; /** Timer for auto save. */ struct wmTimer *autosavetimer; - /** Auto-save timer was up, but it wasn't possible to auto-save in the current mode. */ - char autosave_scheduled; - char _pad2[7]; /** All undo history (runtime only). */ struct UndoStack *undo_stack; + /** Indicates whether interface is locked for user interaction. */ + char is_interface_locked; + char _pad[7]; + struct wmMsgBus *message_bus; // #ifdef WITH_XR_OPENXR wmXrData xr; // #endif - - WindowManagerRuntimeHandle *runtime; } wmWindowManager; #define WM_KEYCONFIG_ARRAY_P(wm) &(wm)->defaultconf, &(wm)->addonconf, &(wm)->userconf diff --git a/source/blender/makesdna/DNA_workspace_types.h b/source/blender/makesdna/DNA_workspace_types.h index 78f2f8dcba7..3c1d270ad15 100644 --- a/source/blender/makesdna/DNA_workspace_types.h +++ b/source/blender/makesdna/DNA_workspace_types.h @@ -61,7 +61,7 @@ typedef struct bToolRef { /** #bToolKey (space-type, mode), used in 'WM_api.hh' */ short space_type; /** - * Value depends on the 'space_type', object mode for 3D view, image editor has its own mode too. + * Value depends on the 'space_type', object mode for 3D view, image editor has own mode too. * RNA needs to handle using item function. */ int mode; diff --git a/source/blender/makesdna/DNA_world_defaults.h b/source/blender/makesdna/DNA_world_defaults.h index f8e88fb3f8b..922524d430a 100644 --- a/source/blender/makesdna/DNA_world_defaults.h +++ b/source/blender/makesdna/DNA_world_defaults.h @@ -8,6 +8,7 @@ #pragma once +/* Struct members on own line. */ /* clang-format off */ /* -------------------------------------------------------------------- */ diff --git a/source/blender/makesdna/intern/dna_defaults.c b/source/blender/makesdna/intern/dna_defaults.c index f5a65bd5c63..4e363153c0e 100644 --- a/source/blender/makesdna/intern/dna_defaults.c +++ b/source/blender/makesdna/intern/dna_defaults.c @@ -26,9 +26,6 @@ * * Magic numbers should be replaced with flags before committing. * - * \note Defaults must be registered by adding the #SDNA_DEFAULT_DECL_STRUCT and - * #SDNA_DEFAULT_DECL macro calls to the lists below. - * * Public API * ---------- * @@ -75,7 +72,6 @@ #include "DNA_defaults.h" -#include "DNA_anim_types.h" #include "DNA_armature_types.h" #include "DNA_asset_types.h" #include "DNA_brush_types.h" @@ -109,7 +105,6 @@ #include "DNA_volume_types.h" #include "DNA_world_types.h" -#include "DNA_anim_defaults.h" #include "DNA_armature_defaults.h" #include "DNA_asset_defaults.h" #include "DNA_brush_defaults.h" @@ -144,10 +139,6 @@ #define SDNA_DEFAULT_DECL_STRUCT(struct_name) \ static const struct_name DNA_DEFAULT_##struct_name = _DNA_DEFAULT_##struct_name -/* DNA_anim_defaults.h */ -SDNA_DEFAULT_DECL_STRUCT(AnimationLayer); -SDNA_DEFAULT_DECL_STRUCT(AnimationStrip); - /* DNA_asset_defaults.h */ SDNA_DEFAULT_DECL_STRUCT(AssetMetaData); SDNA_DEFAULT_DECL_STRUCT(AssetLibraryReference); @@ -303,8 +294,6 @@ SDNA_DEFAULT_DECL_STRUCT(WeldModifierData); SDNA_DEFAULT_DECL_STRUCT(WireframeModifierData); SDNA_DEFAULT_DECL_STRUCT(GreasePencilSubdivModifierData); SDNA_DEFAULT_DECL_STRUCT(GreasePencilNoiseModifierData); -SDNA_DEFAULT_DECL_STRUCT(GreasePencilLengthModifierData); -SDNA_DEFAULT_DECL_STRUCT(GreasePencilLineartModifierData); /* Grease Pencil 3.0 modifiers. */ SDNA_DEFAULT_DECL_STRUCT(GreasePencilSmoothModifierData); @@ -344,20 +333,6 @@ SDNA_DEFAULT_DECL_STRUCT(GreasePencilTintModifierData); SDNA_DEFAULT_DECL_STRUCT(GreasePencilOffsetModifierData); SDNA_DEFAULT_DECL_STRUCT(GreasePencilMirrorModifierData); SDNA_DEFAULT_DECL_STRUCT(GreasePencilThickModifierData); -SDNA_DEFAULT_DECL_STRUCT(GreasePencilLatticeModifierData); -SDNA_DEFAULT_DECL_STRUCT(GreasePencilDashModifierSegment); -SDNA_DEFAULT_DECL_STRUCT(GreasePencilDashModifierData); -SDNA_DEFAULT_DECL_STRUCT(GreasePencilMultiModifierData); -SDNA_DEFAULT_DECL_STRUCT(GreasePencilWeightAngleModifierData); -SDNA_DEFAULT_DECL_STRUCT(GreasePencilArrayModifierData); -SDNA_DEFAULT_DECL_STRUCT(GreasePencilWeightProximityModifierData); -SDNA_DEFAULT_DECL_STRUCT(GreasePencilHookModifierData); -SDNA_DEFAULT_DECL_STRUCT(GreasePencilArmatureModifierData); -SDNA_DEFAULT_DECL_STRUCT(GreasePencilTimeModifierSegment); -SDNA_DEFAULT_DECL_STRUCT(GreasePencilTimeModifierData); -SDNA_DEFAULT_DECL_STRUCT(GreasePencilEnvelopeModifierData); -SDNA_DEFAULT_DECL_STRUCT(GreasePencilOutlineModifierData); -SDNA_DEFAULT_DECL_STRUCT(GreasePencilShrinkwrapModifierData); #undef SDNA_DEFAULT_DECL_STRUCT @@ -387,10 +362,6 @@ extern const bTheme U_theme_default; const void *DNA_default_table[SDNA_TYPE_MAX] = { - /* DNA_anim_defaults.h */ - SDNA_DEFAULT_DECL(AnimationLayer), - SDNA_DEFAULT_DECL(AnimationStrip), - /* DNA_asset_defaults.h */ SDNA_DEFAULT_DECL(AssetMetaData), SDNA_DEFAULT_DECL(AssetLibraryReference), @@ -578,9 +549,6 @@ const void *DNA_default_table[SDNA_TYPE_MAX] = { SDNA_DEFAULT_DECL(WireframeModifierData), SDNA_DEFAULT_DECL(GreasePencilSubdivModifierData), SDNA_DEFAULT_DECL(GreasePencilNoiseModifierData), - SDNA_DEFAULT_DECL(GreasePencilLengthModifierData), - SDNA_DEFAULT_DECL(GreasePencilHookModifierData), - SDNA_DEFAULT_DECL(GreasePencilLineartModifierData), /* Grease Pencil 3.0 defaults. */ SDNA_DEFAULT_DECL(GreasePencilSmoothModifierData), @@ -620,19 +588,6 @@ const void *DNA_default_table[SDNA_TYPE_MAX] = { SDNA_DEFAULT_DECL(GreasePencilOffsetModifierData), SDNA_DEFAULT_DECL(GreasePencilMirrorModifierData), SDNA_DEFAULT_DECL(GreasePencilThickModifierData), - SDNA_DEFAULT_DECL(GreasePencilLatticeModifierData), - SDNA_DEFAULT_DECL(GreasePencilDashModifierSegment), - SDNA_DEFAULT_DECL(GreasePencilDashModifierData), - SDNA_DEFAULT_DECL(GreasePencilMultiModifierData), - SDNA_DEFAULT_DECL(GreasePencilWeightAngleModifierData), - SDNA_DEFAULT_DECL(GreasePencilArrayModifierData), - SDNA_DEFAULT_DECL(GreasePencilWeightProximityModifierData), - SDNA_DEFAULT_DECL(GreasePencilArmatureModifierData), - SDNA_DEFAULT_DECL(GreasePencilTimeModifierSegment), - SDNA_DEFAULT_DECL(GreasePencilTimeModifierData), - SDNA_DEFAULT_DECL(GreasePencilEnvelopeModifierData), - SDNA_DEFAULT_DECL(GreasePencilOutlineModifierData), - SDNA_DEFAULT_DECL(GreasePencilShrinkwrapModifierData), }; #undef SDNA_DEFAULT_DECL #undef SDNA_DEFAULT_DECL_EX diff --git a/source/blender/makesdna/intern/dna_rename_defs.h b/source/blender/makesdna/intern/dna_rename_defs.h index b5b2f845b8f..6af60ab0869 100644 --- a/source/blender/makesdna/intern/dna_rename_defs.h +++ b/source/blender/makesdna/intern/dna_rename_defs.h @@ -149,6 +149,8 @@ DNA_STRUCT_RENAME_ELEM(NodesModifierData, simulation_bake_directory, bake_direct DNA_STRUCT_RENAME_ELEM(Object, col, color) DNA_STRUCT_RENAME_ELEM(Object, dup_group, instance_collection) DNA_STRUCT_RENAME_ELEM(Object, dupfacesca, instance_faces_scale) +DNA_STRUCT_RENAME_ELEM(Object, imat, world_to_object) +DNA_STRUCT_RENAME_ELEM(Object, obmat, object_to_world) DNA_STRUCT_RENAME_ELEM(Object, restrictflag, visibility_flag) DNA_STRUCT_RENAME_ELEM(Object, size, scale) DNA_STRUCT_RENAME_ELEM(OpacityGpencilModifierData, hardeness, hardness) @@ -159,10 +161,7 @@ DNA_STRUCT_RENAME_ELEM(ParticleSettings, dup_ob, instance_object) DNA_STRUCT_RENAME_ELEM(ParticleSettings, dupliweights, instance_weights) DNA_STRUCT_RENAME_ELEM(ParticleSettings, ren_child_nbr, child_render_percent) DNA_STRUCT_RENAME_ELEM(RenderData, bake_filter, bake_margin) -DNA_STRUCT_RENAME_ELEM(RenderData, blurfac, motion_blur_shutter) DNA_STRUCT_RENAME_ELEM(RigidBodyWorld, steps_per_second, substeps_per_frame) -DNA_STRUCT_RENAME_ELEM(SceneEEVEE, motion_blur_position, motion_blur_position_deprecated) -DNA_STRUCT_RENAME_ELEM(SceneEEVEE, motion_blur_shutter, motion_blur_shutter_deprecated) DNA_STRUCT_RENAME_ELEM(SDefBind, numverts, verts_num) DNA_STRUCT_RENAME_ELEM(SDefVert, numbinds, binds_num) DNA_STRUCT_RENAME_ELEM(Sequence, retiming_handle_num, retiming_keys_num) diff --git a/source/blender/makesrna/RNA_access.hh b/source/blender/makesrna/RNA_access.hh index bfeaa615087..802cffb763d 100644 --- a/source/blender/makesrna/RNA_access.hh +++ b/source/blender/makesrna/RNA_access.hh @@ -17,7 +17,6 @@ #include "RNA_types.hh" #include "BLI_compiler_attrs.h" -#include "BLI_function_ref.hh" struct ID; struct IDOverrideLibrary; @@ -326,7 +325,7 @@ bool RNA_property_anim_editable(const PointerRNA *ptr, PropertyRNA *prop); bool RNA_property_animated(PointerRNA *ptr, PropertyRNA *prop); /** * With LibOverrides, a property may be animatable and anim-editable, but not driver-editable (in - * case the reference data already has an animation data, its Action can be an editable local ID, + * case the reference data already has an animation data, its Action can ba an editable local ID, * but the drivers are directly stored in the animdata, overriding these is not supported * currently). * @@ -410,15 +409,16 @@ void RNA_property_string_set_bytes(PointerRNA *ptr, PropertyRNA *prop, const cha eStringPropertySearchFlag RNA_property_string_search_flag(PropertyRNA *prop); /** * Search candidates for string `prop` by calling `visit_fn` with each string. + * Typically these strings are collected in `visit_user_data` in a format defined by the caller. * * See #PropStringSearchFunc for details. */ -void RNA_property_string_search( - const bContext *C, - PointerRNA *ptr, - PropertyRNA *prop, - const char *edit_text, - blender::FunctionRef visit_fn); +void RNA_property_string_search(const bContext *C, + PointerRNA *ptr, + PropertyRNA *prop, + const char *edit_text, + StringPropertySearchVisitFunc visit_fn, + void *visit_user_data); /** * \return the length without `\0` terminator. @@ -791,9 +791,6 @@ StructRNA *ID_code_to_RNA_type(short idcode); /* macro which inserts the function name */ #if defined __GNUC__ # define RNA_warning(format, args...) _RNA_warning("%s: " format "\n", __func__, ##args) -#elif defined(_MSVC_TRADITIONAL) && \ - !_MSVC_TRADITIONAL // The "new preprocessor" is enabled via /Zc:preprocessor -# define RNA_warning(format, ...) _RNA_warning("%s: " format "\n", __FUNCTION__, ##__VA_ARGS__) #else # define RNA_warning(format, ...) _RNA_warning("%s: " format "\n", __FUNCTION__, __VA_ARGS__) #endif diff --git a/source/blender/makesrna/RNA_define.hh b/source/blender/makesrna/RNA_define.hh index df019c9d12d..92908757ea8 100644 --- a/source/blender/makesrna/RNA_define.hh +++ b/source/blender/makesrna/RNA_define.hh @@ -20,7 +20,7 @@ #ifdef UNIT_TEST # define RNA_MAX_ARRAY_LENGTH 64 #else -# define RNA_MAX_ARRAY_LENGTH 64 +# define RNA_MAX_ARRAY_LENGTH 32 #endif #define RNA_MAX_ARRAY_DIMENSION 3 @@ -451,10 +451,10 @@ void RNA_def_property_override_funcs(PropertyRNA *prop, const char *store, const char *apply); -using RNAPropertyUpdateFunc = void (*)(Main *, Scene *, PointerRNA *); -using RNAPropertyUpdateFuncWithContextAndProperty = void (*)(bContext *C, - PointerRNA *ptr, - PropertyRNA *prop); +typedef void (*RNAPropertyUpdateFunc)(Main *, Scene *, PointerRNA *); +typedef void (*RNAPropertyUpdateFuncWithContextAndProperty)(bContext *C, + PointerRNA *ptr, + PropertyRNA *prop); void RNA_def_property_update_runtime(PropertyRNA *prop, RNAPropertyUpdateFunc func); void RNA_def_property_update_runtime_with_context_and_property( diff --git a/source/blender/makesrna/RNA_types.hh b/source/blender/makesrna/RNA_types.hh index 024f3c26a22..a42b6c8169d 100644 --- a/source/blender/makesrna/RNA_types.hh +++ b/source/blender/makesrna/RNA_types.hh @@ -10,10 +10,6 @@ #ifndef __RNA_TYPES_H__ #define __RNA_TYPES_H__ -#include -#include - -#include "../blenlib/BLI_function_ref.hh" #include "../blenlib/BLI_sys_types.h" #include "../blenlib/BLI_utildefines.h" @@ -207,7 +203,7 @@ enum PropertyFlag { /** * This flag means when the property's widget is in 'text-edit' mode, it will be updated * after every typed char, instead of waiting final validation. Used e.g. for text search-box. - * It will also cause UI_BUT_VALUE_CLEAR to be set for text buttons. We could add a separate flag + * It will also cause UI_BUT_VALUE_CLEAR to be set for text buttons. We could add an own flag * for search/filter properties, but this works just fine for now. */ PROP_TEXTEDIT_UPDATE = (1u << 31), @@ -387,7 +383,7 @@ ENUM_OPERATORS(ParameterFlag, PARM_PYFUNC_OPTIONAL) struct CollectionPropertyIterator; struct Link; -using IteratorSkipFunc = int (*)(CollectionPropertyIterator *iter, void *data); +typedef int (*IteratorSkipFunc)(CollectionPropertyIterator *iter, void *data); struct ListBaseIterator { Link *link; @@ -517,35 +513,33 @@ struct EnumPropertyItem { #define RNA_ENUM_ITEM_SEPR_COLUMN RNA_ENUM_ITEM_HEADING("", NULL) /* extended versions with PropertyRNA argument */ -using BooleanPropertyGetFunc = bool (*)(PointerRNA *ptr, PropertyRNA *prop); -using BooleanPropertySetFunc = void (*)(PointerRNA *ptr, PropertyRNA *prop, bool value); -using BooleanArrayPropertyGetFunc = void (*)(PointerRNA *ptr, PropertyRNA *prop, bool *values); -using BooleanArrayPropertySetFunc = void (*)(PointerRNA *ptr, - PropertyRNA *prop, - const bool *values); -using IntPropertyGetFunc = int (*)(PointerRNA *ptr, PropertyRNA *prop); -using IntPropertySetFunc = void (*)(PointerRNA *ptr, PropertyRNA *prop, int value); -using IntArrayPropertyGetFunc = void (*)(PointerRNA *ptr, PropertyRNA *prop, int *values); -using IntArrayPropertySetFunc = void (*)(PointerRNA *ptr, PropertyRNA *prop, const int *values); -using IntPropertyRangeFunc = - void (*)(PointerRNA *ptr, PropertyRNA *prop, int *min, int *max, int *softmin, int *softmax); -using FloatPropertyGetFunc = float (*)(PointerRNA *ptr, PropertyRNA *prop); -using FloatPropertySetFunc = void (*)(PointerRNA *ptr, PropertyRNA *prop, float value); -using FloatArrayPropertyGetFunc = void (*)(PointerRNA *ptr, PropertyRNA *prop, float *values); -using FloatArrayPropertySetFunc = void (*)(PointerRNA *ptr, - PropertyRNA *prop, - const float *values); -using FloatPropertyRangeFunc = void (*)( +typedef bool (*BooleanPropertyGetFunc)(PointerRNA *ptr, PropertyRNA *prop); +typedef void (*BooleanPropertySetFunc)(PointerRNA *ptr, PropertyRNA *prop, bool value); +typedef void (*BooleanArrayPropertyGetFunc)(PointerRNA *ptr, PropertyRNA *prop, bool *values); +typedef void (*BooleanArrayPropertySetFunc)(PointerRNA *ptr, + PropertyRNA *prop, + const bool *values); +typedef int (*IntPropertyGetFunc)(PointerRNA *ptr, PropertyRNA *prop); +typedef void (*IntPropertySetFunc)(PointerRNA *ptr, PropertyRNA *prop, int value); +typedef void (*IntArrayPropertyGetFunc)(PointerRNA *ptr, PropertyRNA *prop, int *values); +typedef void (*IntArrayPropertySetFunc)(PointerRNA *ptr, PropertyRNA *prop, const int *values); +typedef void (*IntPropertyRangeFunc)( + PointerRNA *ptr, PropertyRNA *prop, int *min, int *max, int *softmin, int *softmax); +typedef float (*FloatPropertyGetFunc)(PointerRNA *ptr, PropertyRNA *prop); +typedef void (*FloatPropertySetFunc)(PointerRNA *ptr, PropertyRNA *prop, float value); +typedef void (*FloatArrayPropertyGetFunc)(PointerRNA *ptr, PropertyRNA *prop, float *values); +typedef void (*FloatArrayPropertySetFunc)(PointerRNA *ptr, PropertyRNA *prop, const float *values); +typedef void (*FloatPropertyRangeFunc)( PointerRNA *ptr, PropertyRNA *prop, float *min, float *max, float *softmin, float *softmax); -using StringPropertyGetFunc = void (*)(PointerRNA *ptr, PropertyRNA *prop, char *value); -using StringPropertyLengthFunc = int (*)(PointerRNA *ptr, PropertyRNA *prop); -using StringPropertySetFunc = void (*)(PointerRNA *ptr, PropertyRNA *prop, const char *value); +typedef void (*StringPropertyGetFunc)(PointerRNA *ptr, PropertyRNA *prop, char *value); +typedef int (*StringPropertyLengthFunc)(PointerRNA *ptr, PropertyRNA *prop); +typedef void (*StringPropertySetFunc)(PointerRNA *ptr, PropertyRNA *prop, const char *value); struct StringPropertySearchVisitParams { - /** Text being searched for. */ - std::string text; - /** Additional information to display. */ - std::optional info; + /** Text being searched for (never NULL). */ + const char *text; + /** Additional information to display (optional, may be NULL). */ + const char *info; }; enum eStringPropertySearchFlag { @@ -566,6 +560,12 @@ enum eStringPropertySearchFlag { }; ENUM_OPERATORS(eStringPropertySearchFlag, PROP_STRING_SEARCH_SUGGESTION) +/** + * Visit string search candidates, `text` may be freed once this callback has finished, + * so references to it should not be held. + */ +typedef void (*StringPropertySearchVisitFunc)(void *visit_user_data, + const StringPropertySearchVisitParams *params); /** * \param C: context, may be NULL (in this case all available items should be shown). * \param ptr: RNA pointer. @@ -575,21 +575,22 @@ ENUM_OPERATORS(eStringPropertySearchFlag, PROP_STRING_SEARCH_SUGGESTION) * for the search results (auto-complete Python attributes for e.g.). * \param visit_fn: This function is called with every search candidate and is typically * responsible for storing the search results. + * \param visit_user_data: Caller defined data, passed to `visit_fn`. */ -using StringPropertySearchFunc = - void (*)(const bContext *C, - PointerRNA *ptr, - PropertyRNA *prop, - const char *edit_text, - blender::FunctionRef visit_fn); +typedef void (*StringPropertySearchFunc)(const bContext *C, + PointerRNA *ptr, + PropertyRNA *prop, + const char *edit_text, + StringPropertySearchVisitFunc visit_fn, + void *visit_user_data); -using EnumPropertyGetFunc = int (*)(PointerRNA *ptr, PropertyRNA *prop); -using EnumPropertySetFunc = void (*)(PointerRNA *ptr, PropertyRNA *prop, int value); +typedef int (*EnumPropertyGetFunc)(PointerRNA *ptr, PropertyRNA *prop); +typedef void (*EnumPropertySetFunc)(PointerRNA *ptr, PropertyRNA *prop, int value); /* same as PropEnumItemFunc */ -using EnumPropertyItemFunc = const EnumPropertyItem *(*)(bContext *C, - PointerRNA *ptr, - PropertyRNA *prop, - bool *r_free); +typedef const EnumPropertyItem *(*EnumPropertyItemFunc)(bContext *C, + PointerRNA *ptr, + PropertyRNA *prop, + bool *r_free); struct PropertyRNA; @@ -689,7 +690,7 @@ enum FunctionFlag { FUNC_FREE_POINTERS = (1 << 10), }; -using CallFunc = void (*)(bContext *C, ReportList *reports, PointerRNA *ptr, ParameterList *parms); +typedef void (*CallFunc)(bContext *C, ReportList *reports, PointerRNA *ptr, ParameterList *parms); struct FunctionRNA; @@ -724,22 +725,22 @@ enum StructFlag { STRUCT_NO_CONTEXT_WITHOUT_OWNER_ID = (1 << 11), }; -using StructValidateFunc = int (*)(PointerRNA *ptr, void *data, bool *have_function); -using StructCallbackFunc = int (*)(bContext *C, - PointerRNA *ptr, - FunctionRNA *func, - ParameterList *list); -using StructFreeFunc = void (*)(void *data); -using StructRegisterFunc = StructRNA *(*)(Main *bmain, - ReportList *reports, - void *data, - const char *identifier, - StructValidateFunc validate, - StructCallbackFunc call, - StructFreeFunc free); +typedef int (*StructValidateFunc)(PointerRNA *ptr, void *data, bool *have_function); +typedef int (*StructCallbackFunc)(bContext *C, + PointerRNA *ptr, + FunctionRNA *func, + ParameterList *list); +typedef void (*StructFreeFunc)(void *data); +typedef StructRNA *(*StructRegisterFunc)(Main *bmain, + ReportList *reports, + void *data, + const char *identifier, + StructValidateFunc validate, + StructCallbackFunc call, + StructFreeFunc free); /** Return true when `type` was successfully unregistered & freed. */ -using StructUnregisterFunc = bool (*)(Main *bmain, StructRNA *type); -using StructInstanceFunc = void **(*)(PointerRNA *ptr); +typedef bool (*StructUnregisterFunc)(Main *bmain, StructRNA *type); +typedef void **(*StructInstanceFunc)(PointerRNA *ptr); struct StructRNA; diff --git a/source/blender/makesrna/intern/CMakeLists.txt b/source/blender/makesrna/intern/CMakeLists.txt index 1e8c458539e..3d1540c5a8e 100644 --- a/source/blender/makesrna/intern/CMakeLists.txt +++ b/source/blender/makesrna/intern/CMakeLists.txt @@ -195,7 +195,7 @@ unset(GENSRC_CXXFLAGS) # NOTE: Disable clang-tidy because generated files are stored outside of the source, -# so the clang-tidy can not find our .clang-tidy and fall-backs to its own set of rules +# so the clang-tidy can not find our .clang-tidy and fall-backs to own set of rules # which are too noisy for Blender. # # In the future clang-tidy would either need to be inlined checks and passed via the diff --git a/source/blender/makesrna/intern/makesrna.cc b/source/blender/makesrna/intern/makesrna.cc index c9360b5689f..eca5d6301e0 100644 --- a/source/blender/makesrna/intern/makesrna.cc +++ b/source/blender/makesrna/intern/makesrna.cc @@ -1169,10 +1169,11 @@ static char *rna_def_property_search_func( "PointerRNA *ptr, " "PropertyRNA *prop, " "const char *edit_text, " - "blender::FunctionRef visit_fn)\n", + "StringPropertySearchVisitFunc visit_fn, " + "void *visit_user_data)\n", func); fprintf(f, "{\n"); - fprintf(f, "\n %s(C, ptr, prop, edit_text, visit_fn);\n", manualfunc); + fprintf(f, "\n %s(C, ptr, prop, edit_text, visit_fn, visit_user_data);\n", manualfunc); fprintf(f, "}\n\n"); return func; } @@ -4861,7 +4862,7 @@ static void rna_generate(BlenderRNA *brna, FILE *f, const char *filename, const fprintf(f, "#include \"BKE_context.hh\"\n"); fprintf(f, "#include \"BKE_lib_id.hh\"\n"); fprintf(f, "#include \"BKE_main.hh\"\n"); - fprintf(f, "#include \"BKE_report.hh\"\n"); + fprintf(f, "#include \"BKE_report.h\"\n"); fprintf(f, "#include \"RNA_define.hh\"\n"); fprintf(f, "#include \"RNA_types.hh\"\n"); diff --git a/source/blender/makesrna/intern/rna_ID.cc b/source/blender/makesrna/intern/rna_ID.cc index 624e87d1056..c97c7496710 100644 --- a/source/blender/makesrna/intern/rna_ID.cc +++ b/source/blender/makesrna/intern/rna_ID.cc @@ -34,7 +34,6 @@ */ const EnumPropertyItem rna_enum_id_type_items[] = { {ID_AC, "ACTION", ICON_ACTION, "Action", ""}, - {ID_AN, "ANIMATION", ICON_ACTION, "Animation", ""}, /* TODO: give Animation its own icon. */ {ID_AR, "ARMATURE", ICON_ARMATURE_DATA, "Armature", ""}, {ID_BR, "BRUSH", ICON_BRUSH_DATA, "Brush", ""}, {ID_CF, "CACHEFILE", ICON_FILE, "Cache File", ""}, @@ -214,12 +213,12 @@ const IDFilterEnumPropertyItem rna_enum_id_type_filter_items[] = { # include "BLI_listbase.h" # include "BLI_math_base.h" -# include "BLT_translation.hh" +# include "BLT_translation.h" -# include "BLO_readfile.hh" +# include "BLO_readfile.h" -# include "BKE_anim_data.hh" -# include "BKE_global.hh" /* XXX, remove me */ +# include "BKE_anim_data.h" +# include "BKE_global.h" /* XXX, remove me */ # include "BKE_idprop.h" # include "BKE_idtype.hh" # include "BKE_lib_override.hh" @@ -499,8 +498,6 @@ StructRNA *ID_code_to_RNA_type(short idcode) switch ((ID_Type)idcode) { case ID_AC: return &RNA_Action; - case ID_AN: - break; case ID_AR: return &RNA_Armature; case ID_BR: @@ -607,7 +604,7 @@ int rna_ID_is_runtime_editable(const PointerRNA *ptr, const char **r_info) ID *id = (ID *)ptr->data; /* TODO: This should be abstracted in a BKE function or define, somewhat related to #88555. */ if (id->tag & (LIB_TAG_NO_MAIN | LIB_TAG_TEMP_MAIN | LIB_TAG_LOCALIZED | - LIB_TAG_COPIED_ON_EVAL_FINAL_RESULT | LIB_TAG_COPIED_ON_EVAL)) + LIB_TAG_COPIED_ON_WRITE_EVAL_RESULT | LIB_TAG_COPIED_ON_WRITE)) { *r_info = "Cannot edit 'runtime' status of non-blendfile data-blocks, as they are by definition " @@ -623,7 +620,7 @@ bool rna_ID_is_runtime_get(PointerRNA *ptr) ID *id = (ID *)ptr->data; /* TODO: This should be abstracted in a BKE function or define, somewhat related to #88555. */ if (id->tag & (LIB_TAG_NO_MAIN | LIB_TAG_TEMP_MAIN | LIB_TAG_LOCALIZED | - LIB_TAG_COPIED_ON_EVAL_FINAL_RESULT | LIB_TAG_COPIED_ON_EVAL)) + LIB_TAG_COPIED_ON_WRITE_EVAL_RESULT | LIB_TAG_COPIED_ON_WRITE)) { return true; } @@ -1060,8 +1057,7 @@ static void rna_ID_update_tag(ID *id, Main *bmain, ReportList *reports, int flag allow_flag = OB_RECALC_ALL | PSYS_RECALC; break; # endif - case ID_AC: /* Fall-through. */ - case ID_AN: + case ID_AC: allow_flag = ID_RECALC_ANIMATION; break; default: diff --git a/source/blender/makesrna/intern/rna_access.cc b/source/blender/makesrna/intern/rna_access.cc index 62928c78257..74ba9ce3a92 100644 --- a/source/blender/makesrna/intern/rna_access.cc +++ b/source/blender/makesrna/intern/rna_access.cc @@ -31,19 +31,19 @@ #include "BLI_utildefines.h" #include "BLF_api.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" -#include "BKE_anim_data.hh" -#include "BKE_collection.hh" +#include "BKE_anim_data.h" +#include "BKE_collection.h" #include "BKE_context.hh" -#include "BKE_fcurve.hh" -#include "BKE_global.hh" +#include "BKE_fcurve.h" +#include "BKE_global.h" #include "BKE_idprop.h" #include "BKE_idtype.hh" #include "BKE_lib_override.hh" #include "BKE_main.hh" #include "BKE_node.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "CLG_log.h" @@ -2115,12 +2115,7 @@ static bool rna_property_editable_do(const PointerRNA *ptr, } /* Early return if the property itself is not editable. */ - if ((flag & PROP_EDITABLE) == 0) { - return false; - } - /* Only considered registerable properties "internal" - * because regular properties may not be editable and still be displayed. */ - if (flag & PROP_REGISTER) { + if ((flag & PROP_EDITABLE) == 0 || (flag & PROP_REGISTER) != 0) { if (r_info != nullptr && (*r_info)[0] == '\0') { *r_info = N_("This property is for internal use only and can't be edited"); } @@ -2314,8 +2309,7 @@ static void rna_property_update( #if 1 /* TODO(@ideasman42): Should eventually be replaced entirely by message bus (below) - * for now keep since copy-on-eval, bugs are hard to track when we have other missing updates. - */ + * for now keep since COW, bugs are hard to track when we have other missing updates. */ if (prop->noteflag) { WM_main_add_notifier(prop->noteflag, ptr->owner_id); } @@ -2330,12 +2324,12 @@ static void rna_property_update( } if (ptr->owner_id != nullptr && ((prop->flag & PROP_NO_DEG_UPDATE) == 0)) { const short id_type = GS(ptr->owner_id->name); - if (ID_TYPE_USE_COPY_ON_EVAL(id_type)) { + if (ID_TYPE_IS_COW(id_type)) { if (prop->flag & PROP_DEG_SYNC_ONLY) { - DEG_id_tag_update(ptr->owner_id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(ptr->owner_id, ID_RECALC_COPY_ON_WRITE); } else { - DEG_id_tag_update(ptr->owner_id, ID_RECALC_SYNC_TO_EVAL | ID_RECALC_PARAMETERS); + DEG_id_tag_update(ptr->owner_id, ID_RECALC_COPY_ON_WRITE | ID_RECALC_PARAMETERS); } } } @@ -3749,16 +3743,16 @@ eStringPropertySearchFlag RNA_property_string_search_flag(PropertyRNA *prop) return sprop->search_flag; } -void RNA_property_string_search( - const bContext *C, - PointerRNA *ptr, - PropertyRNA *prop, - const char *edit_text, - blender::FunctionRef visit_fn) +void RNA_property_string_search(const bContext *C, + PointerRNA *ptr, + PropertyRNA *prop, + const char *edit_text, + StringPropertySearchVisitFunc visit_fn, + void *visit_user_data) { BLI_assert(RNA_property_string_search_flag(prop) & PROP_STRING_SEARCH_SUPPORTED); StringPropertyRNA *sprop = (StringPropertyRNA *)rna_ensure_property(prop); - sprop->search(C, ptr, prop, edit_text, visit_fn); + sprop->search(C, ptr, prop, edit_text, visit_fn, visit_user_data); } int RNA_property_enum_get(PointerRNA *ptr, PropertyRNA *prop) diff --git a/source/blender/makesrna/intern/rna_access_compare_override.cc b/source/blender/makesrna/intern/rna_access_compare_override.cc index cfbf3b2d180..582482c68dc 100644 --- a/source/blender/makesrna/intern/rna_access_compare_override.cc +++ b/source/blender/makesrna/intern/rna_access_compare_override.cc @@ -658,7 +658,7 @@ bool RNA_struct_override_matches(Main *bmain, if (!root_path) { _delta_time_diffing = 0.0f; _num_delta_time_diffing = 0; - _timeit_time_global = BLI_time_now_seconds(); + _timeit_time_global = BLI_check_seconds_timer(); } #endif @@ -793,7 +793,7 @@ bool RNA_struct_override_matches(Main *bmain, #ifdef DEBUG_OVERRIDE_TIMEIT if (!root_path) { - _timeit_time_diffing = BLI_time_now_seconds(); + _timeit_time_diffing = BLI_check_seconds_timer(); } #endif @@ -810,7 +810,7 @@ bool RNA_struct_override_matches(Main *bmain, #ifdef DEBUG_OVERRIDE_TIMEIT if (!root_path) { - const float _delta_time = float(BLI_time_now_seconds() - _timeit_time_diffing); + const float _delta_time = float(BLI_check_seconds_timer() - _timeit_time_diffing); _delta_time_diffing += _delta_time; _num_delta_time_diffing++; } @@ -936,7 +936,7 @@ bool RNA_struct_override_matches(Main *bmain, #ifdef DEBUG_OVERRIDE_TIMEIT if (!root_path) { - const float _delta_time = float(BLI_time_now_seconds() - _timeit_time_global); + const float _delta_time = float(BLI_check_seconds_timer() - _timeit_time_global); _sum_time_global += _delta_time; _num_time_global++; _sum_time_diffing += _delta_time_diffing; diff --git a/source/blender/makesrna/intern/rna_action.cc b/source/blender/makesrna/intern/rna_action.cc index aa824e38a83..966c273d73b 100644 --- a/source/blender/makesrna/intern/rna_action.cc +++ b/source/blender/makesrna/intern/rna_action.cc @@ -16,7 +16,7 @@ #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_action.h" @@ -34,7 +34,7 @@ # include "BLI_math_base.h" -# include "BKE_fcurve.hh" +# include "BKE_fcurve.h" # include "DEG_depsgraph.hh" diff --git a/source/blender/makesrna/intern/rna_animation.cc b/source/blender/makesrna/intern/rna_animation.cc index 77f4eb1d03c..e7610c86fbb 100644 --- a/source/blender/makesrna/intern/rna_animation.cc +++ b/source/blender/makesrna/intern/rna_animation.cc @@ -14,7 +14,7 @@ #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "MEM_guardedalloc.h" @@ -91,9 +91,9 @@ const EnumPropertyItem rna_enum_keying_flag_api_items[] = { # include "BLI_math_base.h" -# include "BKE_anim_data.hh" +# include "BKE_anim_data.h" # include "BKE_animsys.h" -# include "BKE_fcurve.hh" +# include "BKE_fcurve.h" # include "BKE_nla.h" # include "DEG_depsgraph.hh" @@ -625,7 +625,7 @@ static NlaTrack *rna_NlaTrack_new(ID *id, AnimData *adt, Main *bmain, bContext * WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_ADDED, nullptr); DEG_relations_tag_update(bmain); - DEG_id_tag_update_ex(bmain, id, ID_RECALC_ANIMATION | ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update_ex(bmain, id, ID_RECALC_ANIMATION | ID_RECALC_COPY_ON_WRITE); return new_track; } @@ -646,7 +646,7 @@ static void rna_NlaTrack_remove( WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_REMOVED, nullptr); DEG_relations_tag_update(bmain); - DEG_id_tag_update_ex(bmain, id, ID_RECALC_ANIMATION | ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update_ex(bmain, id, ID_RECALC_ANIMATION | ID_RECALC_COPY_ON_WRITE); } static PointerRNA rna_NlaTrack_active_get(PointerRNA *ptr) diff --git a/source/blender/makesrna/intern/rna_animation_api.cc b/source/blender/makesrna/intern/rna_animation_api.cc index 207a9409151..38406a9cbe5 100644 --- a/source/blender/makesrna/intern/rna_animation_api.cc +++ b/source/blender/makesrna/intern/rna_animation_api.cc @@ -22,7 +22,7 @@ # include "BKE_context.hh" # include "BKE_nla.h" -# include "BKE_report.hh" +# include "BKE_report.h" # include "ED_keyframing.hh" diff --git a/source/blender/makesrna/intern/rna_animviz.cc b/source/blender/makesrna/intern/rna_animviz.cc index 5954703a2b1..70a7072e3c2 100644 --- a/source/blender/makesrna/intern/rna_animviz.cc +++ b/source/blender/makesrna/intern/rna_animviz.cc @@ -314,7 +314,7 @@ static void rna_def_animviz_paths(BlenderRNA *brna) prop, "Has Motion Paths", "Are there any bone paths that will need updating (read-only)"); /* If enabled, bakes the motion paths into camera space. */ - prop = RNA_def_property(srna, "use_camera_space_bake", PROP_BOOLEAN, PROP_NONE); + prop = RNA_def_property(srna, "bake_in_camera_space", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, nullptr, "path_bakeflag", MOTIONPATH_BAKE_CAMERA_SPACE); RNA_def_property_ui_text( prop, diff --git a/source/blender/makesrna/intern/rna_armature.cc b/source/blender/makesrna/intern/rna_armature.cc index c4fabb197e1..df0f5cbf048 100644 --- a/source/blender/makesrna/intern/rna_armature.cc +++ b/source/blender/makesrna/intern/rna_armature.cc @@ -11,7 +11,7 @@ #include "BLI_math_base.h" #include "BLI_string_utf8_symbols.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "RNA_access.hh" #include "RNA_define.hh" @@ -65,7 +65,7 @@ constexpr int COLOR_SETS_MAX_THEMED_INDEX = 20; # include "BKE_action.h" # include "BKE_context.hh" -# include "BKE_global.hh" +# include "BKE_global.h" # include "BKE_idprop.h" # include "BKE_main.hh" @@ -85,7 +85,7 @@ static void rna_Armature_update(Main * /*bmain*/, Scene * /*scene*/, PointerRNA { ID *id = ptr->owner_id; - DEG_id_tag_update(id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(id, ID_RECALC_COPY_ON_WRITE); } static void rna_Armature_update_data(Main * /*bmain*/, Scene * /*scene*/, PointerRNA *ptr) @@ -662,7 +662,7 @@ void rna_BoneColor_palette_index_set(PointerRNA *ptr, const int new_palette_inde bcolor->palette_index = new_palette_index; ID *id = ptr->owner_id; - DEG_id_tag_update(id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(id, ID_RECALC_COPY_ON_WRITE); WM_main_add_notifier(NC_GEOM | ND_DATA, id); } @@ -687,7 +687,7 @@ static void rna_Armature_redraw_data(Main * /*bmain*/, Scene * /*scene*/, Pointe { ID *id = ptr->owner_id; - DEG_id_tag_update(id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(id, ID_RECALC_COPY_ON_WRITE); WM_main_add_notifier(NC_GEOM | ND_DATA, id); } @@ -702,7 +702,7 @@ static void rna_Bone_hide_update(Main * /*bmain*/, Scene * /*scene*/, PointerRNA } WM_main_add_notifier(NC_OBJECT | ND_POSE, arm); - DEG_id_tag_update(&arm->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&arm->id, ID_RECALC_COPY_ON_WRITE); } /* called whenever a bone is renamed */ @@ -723,7 +723,7 @@ static void rna_Bone_select_update(Main * /*bmain*/, Scene * /*scene*/, PointerR /* 1) special updates for cases where rigs try to hook into armature drawing stuff * e.g. Mask Modifier - 'Armature' option - * 2) tag armature for copy-on-evaluation, so that selection status (set by addons) + * 2) tag armature for copy-on-write, so that selection status (set by addons) * will update properly, like standard tools do already */ if (id) { @@ -734,7 +734,7 @@ static void rna_Bone_select_update(Main * /*bmain*/, Scene * /*scene*/, PointerR DEG_id_tag_update(id, ID_RECALC_GEOMETRY); } - DEG_id_tag_update(id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(id, ID_RECALC_COPY_ON_WRITE); } else if (GS(id->name) == ID_OB) { Object *ob = (Object *)id; @@ -744,7 +744,7 @@ static void rna_Bone_select_update(Main * /*bmain*/, Scene * /*scene*/, PointerR DEG_id_tag_update(id, ID_RECALC_GEOMETRY); } - DEG_id_tag_update(&arm->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&arm->id, ID_RECALC_COPY_ON_WRITE); } } @@ -934,7 +934,7 @@ static void rna_Bone_bbone_handle_update(Main *bmain, Scene *scene, PointerRNA * if (pchan && pchan->bone == bone) { BKE_pchan_rebuild_bbone_handles(obt->pose, pchan); - DEG_id_tag_update(&obt->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&obt->id, ID_RECALC_COPY_ON_WRITE); } } } diff --git a/source/blender/makesrna/intern/rna_asset.cc b/source/blender/makesrna/intern/rna_asset.cc index 2f53077496b..2e72545f919 100644 --- a/source/blender/makesrna/intern/rna_asset.cc +++ b/source/blender/makesrna/intern/rna_asset.cc @@ -8,7 +8,7 @@ #include -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "RNA_define.hh" #include "RNA_enum_types.hh" @@ -364,7 +364,7 @@ void rna_AssetMetaData_catalog_id_update(bContext *C, PointerRNA *ptr) } AssetMetaData *asset_data = static_cast(ptr->data); - asset_library->refresh_catalog_simplename(asset_data); + AS_asset_library_refresh_catalog_simplename(asset_library, asset_data); } static PointerRNA rna_AssetHandle_file_data_get(PointerRNA *ptr) diff --git a/source/blender/makesrna/intern/rna_attribute.cc b/source/blender/makesrna/intern/rna_attribute.cc index 94eb9626b18..ce96c96af63 100644 --- a/source/blender/makesrna/intern/rna_attribute.cc +++ b/source/blender/makesrna/intern/rna_attribute.cc @@ -25,7 +25,7 @@ #include "BKE_attribute.hh" #include "BKE_customdata.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "WM_types.hh" @@ -47,7 +47,6 @@ const EnumPropertyItem rna_enum_attribute_type_items[] = { {CD_PROP_INT8, "INT8", 0, "8-Bit Integer", "Smaller integer with a range from -128 to 127"}, {CD_PROP_INT32_2D, "INT32_2D", 0, "2D Integer Vector", "32-bit signed integer vector"}, {CD_PROP_QUATERNION, "QUATERNION", 0, "Quaternion", "Floating point quaternion rotation"}, - {CD_PROP_FLOAT4X4, "FLOAT4X4", 0, "4x4 Matrix", "Floating point matrix"}, {0, nullptr, 0, nullptr, nullptr}, }; @@ -77,7 +76,6 @@ const EnumPropertyItem rna_enum_attribute_type_with_auto_items[] = { {CD_PROP_FLOAT2, "FLOAT2", 0, "2D Vector", "2D vector with floating-point values"}, {CD_PROP_INT32_2D, "INT32_2D", 0, "2D Integer Vector", "32-bit signed integer vector"}, {CD_PROP_QUATERNION, "QUATERNION", 0, "Quaternion", "Floating point quaternion rotation"}, - {CD_PROP_FLOAT4X4, "FLOAT4X4", 0, "4x4 Matrix", "Floating point matrix"}, {0, nullptr, 0, nullptr, nullptr}, }; @@ -170,7 +168,7 @@ const EnumPropertyItem rna_enum_attribute_curves_domain_items[] = { # include "DEG_depsgraph.hh" -# include "BLT_translation.hh" +# include "BLT_translation.h" # include "WM_api.hh" @@ -209,8 +207,6 @@ static StructRNA *srna_by_custom_data_layer_type(const eCustomDataType type) return &RNA_Int2Attribute; case CD_PROP_QUATERNION: return &RNA_QuaternionAttribute; - case CD_PROP_FLOAT4X4: - return &RNA_Float4x4Attribute; default: return nullptr; } @@ -1104,40 +1100,6 @@ static void rna_def_attribute_quaternion(BlenderRNA *brna) RNA_def_property_update(prop, 0, "rna_Attribute_update_data"); } -static void rna_def_attribute_float4x4(BlenderRNA *brna) -{ - StructRNA *srna; - PropertyRNA *prop; - - srna = RNA_def_struct(brna, "Float4x4Attribute", "Attribute"); - RNA_def_struct_sdna(srna, "CustomDataLayer"); - RNA_def_struct_ui_text( - srna, "4x4 Matrix Attribute", "Geometry attribute that stores a 4 by 4 float matrix"); - - prop = RNA_def_property(srna, "data", PROP_COLLECTION, PROP_NONE); - RNA_def_property_struct_type(prop, "Float4x4AttributeValue"); - RNA_def_property_override_flag(prop, PROPOVERRIDE_IGNORE); - 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", - nullptr, - nullptr, - nullptr); - - srna = RNA_def_struct(brna, "Float4x4AttributeValue", nullptr); - RNA_def_struct_sdna(srna, "mat4x4f"); - RNA_def_struct_ui_text(srna, "Matrix Attribute Value", "Matrix value in geometry attribute"); - - prop = RNA_def_property(srna, "value", PROP_FLOAT, PROP_MATRIX); - RNA_def_property_ui_text(prop, "Value", "Matrix"); - RNA_def_property_float_sdna(prop, nullptr, "value"); - RNA_def_property_multi_array(prop, 2, rna_matrix_dimsize_4x4); - RNA_def_property_update(prop, 0, "rna_Attribute_update_data"); -} - static void rna_def_attribute_float2(BlenderRNA *brna) { StructRNA *srna; @@ -1224,7 +1186,6 @@ static void rna_def_attribute(BlenderRNA *brna) rna_def_attribute_int(brna); rna_def_attribute_int2(brna); rna_def_attribute_quaternion(brna); - rna_def_attribute_float4x4(brna); rna_def_attribute_string(brna); rna_def_attribute_bool(brna); rna_def_attribute_float2(brna); diff --git a/source/blender/makesrna/intern/rna_brush.cc b/source/blender/makesrna/intern/rna_brush.cc index 9e47b08d27b..4f6b0ae539b 100644 --- a/source/blender/makesrna/intern/rna_brush.cc +++ b/source/blender/makesrna/intern/rna_brush.cc @@ -21,7 +21,7 @@ #include "BLI_math_base.h" #include "BLI_string_utf8_symbols.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "RNA_define.hh" #include "RNA_enum_types.hh" @@ -2179,7 +2179,7 @@ static void rna_def_curves_sculpt_options(BlenderRNA *brna) RNA_def_property_ui_text( prop, "Points per Curve", "Number of control points in a newly added curve"); - prop = RNA_def_property(srna, "use_uniform_scale", PROP_BOOLEAN, PROP_NONE); + prop = RNA_def_property(srna, "scale_uniform", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, nullptr, "flag", BRUSH_CURVES_SCULPT_FLAG_SCALE_UNIFORM); RNA_def_property_ui_text(prop, "Scale Uniform", @@ -2191,27 +2191,20 @@ static void rna_def_curves_sculpt_options(BlenderRNA *brna) RNA_def_property_ui_text( prop, "Minimum Length", "Avoid shrinking curves shorter than this length"); - prop = RNA_def_property(srna, "use_length_interpolate", PROP_BOOLEAN, PROP_NONE); + prop = RNA_def_property(srna, "interpolate_length", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna( prop, nullptr, "flag", BRUSH_CURVES_SCULPT_FLAG_INTERPOLATE_LENGTH); RNA_def_property_ui_text( prop, "Interpolate Length", "Use length of the curves in close proximity"); - prop = RNA_def_property(srna, "use_radius_interpolate", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna( - prop, nullptr, "flag", BRUSH_CURVES_SCULPT_FLAG_INTERPOLATE_RADIUS); - RNA_def_property_boolean_default(prop, true); - RNA_def_property_ui_text( - prop, "Interpolate Radius", "Use radius of the curves in close proximity"); - - prop = RNA_def_property(srna, "use_point_count_interpolate", PROP_BOOLEAN, PROP_NONE); + prop = RNA_def_property(srna, "interpolate_point_count", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna( prop, nullptr, "flag", BRUSH_CURVES_SCULPT_FLAG_INTERPOLATE_POINT_COUNT); RNA_def_property_ui_text(prop, "Interpolate Point Count", "Use the number of points from the curves in close proximity"); - prop = RNA_def_property(srna, "use_shape_interpolate", PROP_BOOLEAN, PROP_NONE); + prop = RNA_def_property(srna, "interpolate_shape", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, nullptr, "flag", BRUSH_CURVES_SCULPT_FLAG_INTERPOLATE_SHAPE); RNA_def_property_ui_text( prop, "Interpolate Shape", "Use shape of the curves in close proximity"); @@ -2229,15 +2222,6 @@ static void rna_def_curves_sculpt_options(BlenderRNA *brna) RNA_def_property_ui_text( prop, "Minimum Distance", "Goal distance between curve roots for the Density brush"); - prop = RNA_def_property(srna, "curve_radius", PROP_FLOAT, PROP_DISTANCE); - RNA_def_property_range(prop, 0.0, FLT_MAX); - RNA_def_property_float_default(prop, 0.01f); - RNA_def_property_ui_range(prop, 0.0, 1000.0f, 0.001, 2); - RNA_def_property_ui_text( - prop, - "Curve Radius", - "Radius of newly added curves when it is not interpolated from other curves"); - prop = RNA_def_property(srna, "density_add_attempts", PROP_INT, PROP_NONE); RNA_def_property_range(prop, 0, INT32_MAX); RNA_def_property_ui_text( @@ -2619,7 +2603,7 @@ static void rna_def_brush(BlenderRNA *brna) prop = RNA_def_property(srna, "uv_sculpt_tool", PROP_ENUM, PROP_NONE); RNA_def_property_enum_items(prop, rna_enum_brush_uv_sculpt_tool_items); - RNA_def_property_ui_text(prop, "UV Sculpt Tool", ""); + RNA_def_property_ui_text(prop, "Sculpt Tool", ""); RNA_def_property_update(prop, 0, "rna_Brush_update_and_reset_icon"); prop = RNA_def_property(srna, "vertex_tool", PROP_ENUM, PROP_NONE); diff --git a/source/blender/makesrna/intern/rna_cachefile.cc b/source/blender/makesrna/intern/rna_cachefile.cc index 5ec0b953ede..cb67304444e 100644 --- a/source/blender/makesrna/intern/rna_cachefile.cc +++ b/source/blender/makesrna/intern/rna_cachefile.cc @@ -9,7 +9,7 @@ #include "DNA_cachefile_types.h" #include "DNA_scene_types.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "RNA_access.hh" #include "RNA_define.hh" @@ -27,7 +27,7 @@ const EnumPropertyItem rna_enum_velocity_unit_items[] = { # include "BLI_string.h" -# include "BKE_cachefile.hh" +# include "BKE_cachefile.h" # include "DEG_depsgraph.hh" # include "DEG_depsgraph_build.hh" @@ -43,7 +43,7 @@ static void rna_CacheFile_update(Main * /*bmain*/, Scene * /*scene*/, PointerRNA { CacheFile *cache_file = (CacheFile *)ptr->data; - DEG_id_tag_update(&cache_file->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&cache_file->id, ID_RECALC_COPY_ON_WRITE); WM_main_add_notifier(NC_OBJECT | ND_DRAW, nullptr); } @@ -51,7 +51,7 @@ static void rna_CacheFileLayer_update(Main * /*bmain*/, Scene * /*scene*/, Point { CacheFile *cache_file = (CacheFile *)ptr->owner_id; - DEG_id_tag_update(&cache_file->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&cache_file->id, ID_RECALC_COPY_ON_WRITE); WM_main_add_notifier(NC_OBJECT | ND_DRAW, nullptr); } diff --git a/source/blender/makesrna/intern/rna_camera.cc b/source/blender/makesrna/intern/rna_camera.cc index 90a1181d9b8..aec8c9a35e5 100644 --- a/source/blender/makesrna/intern/rna_camera.cc +++ b/source/blender/makesrna/intern/rna_camera.cc @@ -12,7 +12,7 @@ #include "BLI_math_rotation.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "RNA_access.hh" #include "RNA_define.hh" @@ -36,7 +36,7 @@ static float rna_Camera_angle_get(PointerRNA *ptr) { - const Camera *cam = (const Camera *)ptr->owner_id; + Camera *cam = (Camera *)ptr->owner_id; float sensor = BKE_camera_sensor_size(cam->sensor_fit, cam->sensor_x, cam->sensor_y); return focallength_to_fov(cam->lens, sensor); } @@ -50,7 +50,7 @@ static void rna_Camera_angle_set(PointerRNA *ptr, float value) static float rna_Camera_angle_x_get(PointerRNA *ptr) { - const Camera *cam = (const Camera *)ptr->owner_id; + Camera *cam = (Camera *)ptr->owner_id; return focallength_to_fov(cam->lens, cam->sensor_x); } @@ -62,7 +62,7 @@ static void rna_Camera_angle_x_set(PointerRNA *ptr, float value) static float rna_Camera_angle_y_get(PointerRNA *ptr) { - const Camera *cam = (const Camera *)ptr->owner_id; + Camera *cam = (Camera *)ptr->owner_id; return focallength_to_fov(cam->lens, cam->sensor_y); } @@ -120,7 +120,7 @@ static void rna_Camera_background_images_clear(Camera *cam) static std::optional rna_Camera_background_image_path(const PointerRNA *ptr) { const CameraBGImage *bgpic = static_cast(ptr->data); - const Camera *camera = (const Camera *)ptr->owner_id; + Camera *camera = (Camera *)ptr->owner_id; const int bgpic_index = BLI_findindex(&camera->bg_images, bgpic); @@ -135,7 +135,7 @@ std::optional rna_CameraBackgroundImage_image_or_movieclip_user_pat const PointerRNA *ptr) { const char *user = static_cast(ptr->data); - const Camera *camera = (const Camera *)ptr->owner_id; + Camera *camera = (Camera *)ptr->owner_id; int bgpic_index = BLI_findindex(&camera->bg_images, user - offsetof(CameraBGImage, iuser)); if (bgpic_index >= 0) { @@ -162,7 +162,7 @@ static bool rna_Camera_background_images_override_apply( "Unsupported RNA override operation on background images collection"); Camera *cam_dst = (Camera *)ptr_dst->owner_id; - const Camera *cam_src = (const Camera *)ptr_src->owner_id; + Camera *cam_src = (Camera *)ptr_src->owner_id; /* Remember that insertion operations are defined and stored in correct order, which means that * even if we insert several items in a row, we always insert first one, then second one, etc. @@ -171,7 +171,7 @@ static bool rna_Camera_background_images_override_apply( BLI_findlink(&cam_dst->bg_images, opop->subitem_reference_index)); /* If `bgpic_anchor` is nullptr, `bgpic_src` will be inserted in first position. */ - const CameraBGImage *bgpic_src = static_cast( + CameraBGImage *bgpic_src = static_cast( BLI_findlink(&cam_src->bg_images, opop->subitem_local_index)); if (bgpic_src == nullptr) { diff --git a/source/blender/makesrna/intern/rna_collection.cc b/source/blender/makesrna/intern/rna_collection.cc index 275589470f3..f4507964ad0 100644 --- a/source/blender/makesrna/intern/rna_collection.cc +++ b/source/blender/makesrna/intern/rna_collection.cc @@ -48,8 +48,8 @@ BLI_STATIC_ASSERT(ARRAY_SIZE(rna_enum_collection_color_items) - 2 == COLLECTION_ # include "DEG_depsgraph_build.hh" # include "DEG_depsgraph_query.hh" -# include "BKE_collection.hh" -# include "BKE_global.hh" +# include "BKE_collection.h" +# include "BKE_global.h" # include "BKE_layer.hh" # include "WM_api.hh" @@ -137,7 +137,7 @@ static void rna_Collection_objects_link(Collection *collection, return; } - DEG_id_tag_update(&collection->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&collection->id, ID_RECALC_COPY_ON_WRITE); DEG_relations_tag_update(bmain); WM_main_add_notifier(NC_OBJECT | ND_DRAW, &object->id); } @@ -159,7 +159,7 @@ static void rna_Collection_objects_unlink(Collection *collection, return; } - DEG_id_tag_update(&collection->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&collection->id, ID_RECALC_COPY_ON_WRITE); DEG_relations_tag_update(bmain); WM_main_add_notifier(NC_OBJECT | ND_DRAW, &object->id); } @@ -265,7 +265,7 @@ static void rna_Collection_children_link(Collection *collection, return; } - DEG_id_tag_update(&collection->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&collection->id, ID_RECALC_COPY_ON_WRITE); DEG_relations_tag_update(bmain); WM_main_add_notifier(NC_OBJECT | ND_DRAW, &child->id); } @@ -287,7 +287,7 @@ static void rna_Collection_children_unlink(Collection *collection, return; } - DEG_id_tag_update(&collection->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&collection->id, ID_RECALC_COPY_ON_WRITE); DEG_relations_tag_update(bmain); WM_main_add_notifier(NC_OBJECT | ND_DRAW, &child->id); } @@ -373,7 +373,7 @@ static void rna_Collection_flag_update(Main *bmain, Scene *scene, PointerRNA *pt BKE_collection_object_cache_free(bmain, collection, 0); BKE_main_collection_sync(bmain); - DEG_id_tag_update(&collection->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&collection->id, ID_RECALC_COPY_ON_WRITE); DEG_relations_tag_update(bmain); WM_main_add_notifier(NC_SCENE | ND_OB_SELECT, scene); } diff --git a/source/blender/makesrna/intern/rna_color.cc b/source/blender/makesrna/intern/rna_color.cc index 6720967f9a7..14b3f3439bc 100644 --- a/source/blender/makesrna/intern/rna_color.cc +++ b/source/blender/makesrna/intern/rna_color.cc @@ -55,7 +55,7 @@ const EnumPropertyItem rna_enum_color_space_convert_default_items[] = { # include "BKE_image.h" # include "BKE_linestyle.h" # include "BKE_movieclip.h" -# include "BKE_node.hh" +# include "BKE_node.h" # include "DEG_depsgraph.hh" @@ -441,7 +441,7 @@ static void rna_ColorManagedDisplaySettings_display_device_update(Main *bmain, for (Material *ma = static_cast(bmain->materials.first); ma; ma = static_cast(ma->id.next)) { - DEG_id_tag_update(&ma->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&ma->id, ID_RECALC_COPY_ON_WRITE); } } } diff --git a/source/blender/makesrna/intern/rna_constraint.cc b/source/blender/makesrna/intern/rna_constraint.cc index c3c0e82ebf1..d729cc81f96 100644 --- a/source/blender/makesrna/intern/rna_constraint.cc +++ b/source/blender/makesrna/intern/rna_constraint.cc @@ -12,7 +12,7 @@ #include "BLI_math_rotation.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_action_types.h" #include "DNA_constraint_types.h" diff --git a/source/blender/makesrna/intern/rna_curve.cc b/source/blender/makesrna/intern/rna_curve.cc index ff89621d970..d8404937642 100644 --- a/source/blender/makesrna/intern/rna_curve.cc +++ b/source/blender/makesrna/intern/rna_curve.cc @@ -16,7 +16,7 @@ #include "BLI_math_vector.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "RNA_access.hh" #include "RNA_define.hh" diff --git a/source/blender/makesrna/intern/rna_curveprofile.cc b/source/blender/makesrna/intern/rna_curveprofile.cc index 6f2db38fb26..d179312ad42 100644 --- a/source/blender/makesrna/intern/rna_curveprofile.cc +++ b/source/blender/makesrna/intern/rna_curveprofile.cc @@ -15,7 +15,7 @@ #include "RNA_define.hh" #include "rna_internal.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "WM_api.hh" #include "WM_types.hh" diff --git a/source/blender/makesrna/intern/rna_curves.cc b/source/blender/makesrna/intern/rna_curves.cc index f716d6ef21f..a7ceef96b1b 100644 --- a/source/blender/makesrna/intern/rna_curves.cc +++ b/source/blender/makesrna/intern/rna_curves.cc @@ -54,7 +54,7 @@ const EnumPropertyItem rna_enum_curve_normal_mode_items[] = { # include "BKE_attribute.hh" # include "BKE_curves.hh" -# include "BKE_report.hh" +# include "BKE_report.h" # include "DEG_depsgraph.hh" diff --git a/source/blender/makesrna/intern/rna_define.cc b/source/blender/makesrna/intern/rna_define.cc index 7af75e42a56..f496a87f81f 100644 --- a/source/blender/makesrna/intern/rna_define.cc +++ b/source/blender/makesrna/intern/rna_define.cc @@ -24,7 +24,7 @@ #include "BLI_ghash.h" #include "BLI_listbase.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "UI_interface.hh" /* For things like UI_PRECISION_FLOAT_MAX... */ diff --git a/source/blender/makesrna/intern/rna_depsgraph.cc b/source/blender/makesrna/intern/rna_depsgraph.cc index ece8db9ff9f..3eb420ed40e 100644 --- a/source/blender/makesrna/intern/rna_depsgraph.cc +++ b/source/blender/makesrna/intern/rna_depsgraph.cc @@ -35,9 +35,9 @@ # include "RNA_access.hh" -# include "BKE_duplilist.hh" +# include "BKE_duplilist.h" # include "BKE_object.hh" -# include "BKE_scene.hh" +# include "BKE_scene.h" # include "DEG_depsgraph_build.hh" # include "DEG_depsgraph_debug.hh" @@ -174,7 +174,7 @@ static void rna_DepsgraphObjectInstance_matrix_world_get(PointerRNA *ptr, float /* We can return actual object's matrix here, no reason to return identity matrix * when this is not actually an instance... */ Object *ob = (Object *)di->iter.current; - copy_m4_m4((float(*)[4])mat, ob->object_to_world().ptr()); + copy_m4_m4((float(*)[4])mat, ob->object_to_world); } } diff --git a/source/blender/makesrna/intern/rna_dynamicpaint.cc b/source/blender/makesrna/intern/rna_dynamicpaint.cc index bf39e553118..05bda7360ea 100644 --- a/source/blender/makesrna/intern/rna_dynamicpaint.cc +++ b/source/blender/makesrna/intern/rna_dynamicpaint.cc @@ -14,7 +14,7 @@ #include "BLI_string_utf8_symbols.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_dynamicpaint_types.h" #include "DNA_modifier_types.h" diff --git a/source/blender/makesrna/intern/rna_fcurve.cc b/source/blender/makesrna/intern/rna_fcurve.cc index e23a673bf2c..2ca3485db47 100644 --- a/source/blender/makesrna/intern/rna_fcurve.cc +++ b/source/blender/makesrna/intern/rna_fcurve.cc @@ -15,7 +15,7 @@ #include "MEM_guardedalloc.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_action.h" @@ -219,8 +219,8 @@ static StructRNA *rna_FModifierType_refine(PointerRNA *ptr) /* ****************************** */ -# include "BKE_anim_data.hh" -# include "BKE_fcurve.hh" +# include "BKE_anim_data.h" +# include "BKE_fcurve.h" # include "BKE_fcurve_driver.h" # include "DEG_depsgraph.hh" @@ -714,7 +714,7 @@ static void rna_FCurve_update_data_relations(Main *bmain, Scene * /*scene*/, Poi DEG_relations_tag_update(bmain); } -/* RNA update callback for F-Curves to indicate that there are copy-on-evaluation tagging/flushing +/* RNA update callback for F-Curves to indicate that there are copy-on-write tagging/flushing * needed (e.g. for properties that affect how animation gets evaluated). */ static void rna_FCurve_update_eval(Main *bmain, Scene * /*scene*/, PointerRNA *ptr) diff --git a/source/blender/makesrna/intern/rna_fcurve_api.cc b/source/blender/makesrna/intern/rna_fcurve_api.cc index 37b722b75cb..7bfaec26eeb 100644 --- a/source/blender/makesrna/intern/rna_fcurve_api.cc +++ b/source/blender/makesrna/intern/rna_fcurve_api.cc @@ -24,7 +24,7 @@ # include -# include "BKE_fcurve.hh" +# include "BKE_fcurve.h" static void rna_FCurve_convert_to_samples(FCurve *fcu, ReportList *reports, int start, int end) { diff --git a/source/blender/makesrna/intern/rna_fluid.cc b/source/blender/makesrna/intern/rna_fluid.cc index 6657581dbef..7e8f515ceea 100644 --- a/source/blender/makesrna/intern/rna_fluid.cc +++ b/source/blender/makesrna/intern/rna_fluid.cc @@ -23,7 +23,7 @@ #include "BKE_modifier.hh" #include "BKE_pointcache.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_fluid_types.h" #include "DNA_modifier_types.h" diff --git a/source/blender/makesrna/intern/rna_gpencil_legacy.cc b/source/blender/makesrna/intern/rna_gpencil_legacy.cc index 9e0dd54f093..b2778c1575e 100644 --- a/source/blender/makesrna/intern/rna_gpencil_legacy.cc +++ b/source/blender/makesrna/intern/rna_gpencil_legacy.cc @@ -22,7 +22,7 @@ #include "BLI_math_vector.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "RNA_access.hh" #include "RNA_define.hh" @@ -340,13 +340,13 @@ static int rna_GPencilLayer_active_frame_editable(const PointerRNA *ptr, const c static void set_parent(bGPDlayer *gpl, Object *par, const int type, const char *substr) { if (type == PAROBJECT) { - invert_m4_m4(gpl->inverse, par->object_to_world().ptr()); + invert_m4_m4(gpl->inverse, par->object_to_world); gpl->parent = par; gpl->partype |= PAROBJECT; gpl->parsubstr[0] = 0; } else if (type == PARSKEL) { - invert_m4_m4(gpl->inverse, par->object_to_world().ptr()); + invert_m4_m4(gpl->inverse, par->object_to_world); gpl->parent = par; gpl->partype |= PARSKEL; gpl->parsubstr[0] = 0; @@ -355,7 +355,7 @@ static void set_parent(bGPDlayer *gpl, Object *par, const int type, const char * bPoseChannel *pchan = BKE_pose_channel_find_name(par->pose, substr); if (pchan) { float tmp_mat[4][4]; - mul_m4_m4m4(tmp_mat, par->object_to_world().ptr(), pchan->pose_mat); + mul_m4_m4m4(tmp_mat, par->object_to_world, pchan->pose_mat); invert_m4_m4(gpl->inverse, tmp_mat); gpl->parent = par; @@ -363,7 +363,7 @@ static void set_parent(bGPDlayer *gpl, Object *par, const int type, const char * STRNCPY(gpl->parsubstr, substr); } else { - invert_m4_m4(gpl->inverse, par->object_to_world().ptr()); + invert_m4_m4(gpl->inverse, par->object_to_world); gpl->parent = par; gpl->partype |= PAROBJECT; gpl->parsubstr[0] = 0; @@ -756,7 +756,8 @@ static void rna_GPencil_stroke_point_add( /* Calc geometry data. */ BKE_gpencil_stroke_geometry_update(gpd, stroke); - DEG_id_tag_update(&gpd->id, ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY | ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&gpd->id, + ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY | ID_RECALC_COPY_ON_WRITE); WM_main_add_notifier(NC_GPENCIL | ND_DATA | NA_EDITED, nullptr); } @@ -818,7 +819,7 @@ static void rna_GPencil_stroke_point_pop(ID *id, /* Calc geometry data. */ BKE_gpencil_stroke_geometry_update(gpd, stroke); - DEG_id_tag_update(&gpd->id, ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY | ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&gpd->id, ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY | ID_RECALC_COPY_ON_WRITE); WM_main_add_notifier(NC_GPENCIL | NA_EDITED, nullptr); } @@ -831,7 +832,8 @@ static void rna_GPencil_stroke_point_update(ID *id, bGPDstroke *stroke) if (stroke) { BKE_gpencil_stroke_geometry_update(gpd, stroke); - DEG_id_tag_update(&gpd->id, ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY | ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&gpd->id, + ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY | ID_RECALC_COPY_ON_WRITE); WM_main_add_notifier(NC_GPENCIL | NA_EDITED, nullptr); } @@ -911,7 +913,7 @@ static void rna_GPencil_stroke_remove(ID *id, BKE_gpencil_free_stroke(stroke); RNA_POINTER_INVALIDATE(stroke_ptr); - DEG_id_tag_update(&gpd->id, ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY | ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&gpd->id, ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY | ID_RECALC_COPY_ON_WRITE); WM_main_add_notifier(NC_GPENCIL | ND_DATA | NA_EDITED, nullptr); } @@ -929,7 +931,7 @@ static void rna_GPencil_stroke_close(ID *id, BKE_gpencil_stroke_close(stroke); - DEG_id_tag_update(&gpd->id, ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY | ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&gpd->id, ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY | ID_RECALC_COPY_ON_WRITE); WM_main_add_notifier(NC_GPENCIL | ND_DATA | NA_EDITED, nullptr); } diff --git a/source/blender/makesrna/intern/rna_gpencil_legacy_modifier.cc b/source/blender/makesrna/intern/rna_gpencil_legacy_modifier.cc index 4e1efc80c0e..a83b3322947 100644 --- a/source/blender/makesrna/intern/rna_gpencil_legacy_modifier.cc +++ b/source/blender/makesrna/intern/rna_gpencil_legacy_modifier.cc @@ -24,7 +24,7 @@ #include "BLI_math_rotation.h" #include "BLI_string_utils.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_animsys.h" @@ -279,7 +279,7 @@ static const EnumPropertyItem modifier_noise_random_mode_items[] = { # include "DNA_material_types.h" # include "DNA_particle_types.h" -# include "BKE_cachefile.hh" +# include "BKE_cachefile.h" # include "BKE_context.hh" # include "BKE_gpencil_legacy.h" # include "BKE_gpencil_modifier_legacy.h" @@ -3560,29 +3560,29 @@ static void rna_def_modifier_gpencillineart(BlenderRNA *brna) PropertyRNA *prop; static const EnumPropertyItem modifier_lineart_source_type[] = { - {LINEART_SOURCE_COLLECTION, "COLLECTION", 0, "Collection", ""}, - {LINEART_SOURCE_OBJECT, "OBJECT", 0, "Object", ""}, - {LINEART_SOURCE_SCENE, "SCENE", 0, "Scene", ""}, + {LRT_SOURCE_COLLECTION, "COLLECTION", 0, "Collection", ""}, + {LRT_SOURCE_OBJECT, "OBJECT", 0, "Object", ""}, + {LRT_SOURCE_SCENE, "SCENE", 0, "Scene", ""}, {0, nullptr, 0, nullptr, nullptr}, }; static const EnumPropertyItem modifier_lineart_shadow_region_filtering[] = { - {LINEART_SHADOW_FILTER_NONE, + {LRT_SHADOW_FILTER_NONE, "NONE", 0, "None", "Not filtering any lines based on illumination region"}, - {LINEART_SHADOW_FILTER_ILLUMINATED, + {LRT_SHADOW_FILTER_ILLUMINATED, "ILLUMINATED", 0, "Illuminated", "Only selecting lines from illuminated regions"}, - {LINEART_SHADOW_FILTER_SHADED, + {LRT_SHADOW_FILTER_SHADED, "SHADED", 0, "Shaded", "Only selecting lines from shaded regions"}, - {LINEART_SHADOW_FILTER_ILLUMINATED_ENCLOSED_SHAPES, + {LRT_SHADOW_FILTER_ILLUMINATED_ENCLOSED_SHAPES, "ILLUMINATED_ENCLOSED", 0, "Illuminated (Enclosed Shapes)", @@ -3592,9 +3592,9 @@ static void rna_def_modifier_gpencillineart(BlenderRNA *brna) }; static const EnumPropertyItem modifier_lineart_silhouette_filtering[] = { - {LINEART_SILHOUETTE_FILTER_NONE, "NONE", 0, "Contour", ""}, - {LINEART_SILHOUETTE_FILTER_GROUP, "GROUP", 0, "Silhouette", ""}, - {LINEART_SILHOUETTE_FILTER_INDIVIDUAL, "INDIVIDUAL", 0, "Individual Silhouette", ""}, + {LRT_SILHOUETTE_FILTER_NONE, "NONE", 0, "Contour", ""}, + {LRT_SILHOUETTE_FILTER_GROUP, "GROUP", 0, "Silhouette", ""}, + {LRT_SILHOUETTE_FILTER_INDIVIDUAL, "INDIVIDUAL", 0, "Individual Silhouette", ""}, {0, nullptr, 0, nullptr, nullptr}, }; @@ -3607,14 +3607,13 @@ static void rna_def_modifier_gpencillineart(BlenderRNA *brna) RNA_define_lib_overridable(true); prop = RNA_def_property(srna, "use_custom_camera", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, nullptr, "calculation_flags", MOD_LINEART_USE_CUSTOM_CAMERA); + RNA_def_property_boolean_sdna(prop, nullptr, "calculation_flags", LRT_USE_CUSTOM_CAMERA); RNA_def_property_ui_text( prop, "Use Custom Camera", "Use custom camera instead of the active camera"); RNA_def_property_update(prop, 0, "rna_GpencilModifier_dependency_update"); prop = RNA_def_property(srna, "use_fuzzy_intersections", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna( - prop, nullptr, "calculation_flags", MOD_LINEART_INTERSECTION_AS_CONTOUR); + RNA_def_property_boolean_sdna(prop, nullptr, "calculation_flags", LRT_INTERSECTION_AS_CONTOUR); RNA_def_property_ui_text(prop, "Intersection With Contour", "Treat intersection and contour lines as if they were the same type so " @@ -3622,23 +3621,20 @@ static void rna_def_modifier_gpencillineart(BlenderRNA *brna) RNA_def_property_update(prop, NC_SCENE, "rna_GpencilModifier_update"); prop = RNA_def_property(srna, "use_fuzzy_all", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna( - prop, nullptr, "calculation_flags", MOD_LINEART_EVERYTHING_AS_CONTOUR); + RNA_def_property_boolean_sdna(prop, nullptr, "calculation_flags", LRT_EVERYTHING_AS_CONTOUR); RNA_def_property_ui_text( prop, "All Lines", "Treat all lines as the same line type so they can be chained together"); RNA_def_property_update(prop, NC_SCENE, "rna_GpencilModifier_update"); prop = RNA_def_property(srna, "use_object_instances", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna( - prop, nullptr, "calculation_flags", MOD_LINEART_ALLOW_DUPLI_OBJECTS); + RNA_def_property_boolean_sdna(prop, nullptr, "calculation_flags", LRT_ALLOW_DUPLI_OBJECTS); RNA_def_property_ui_text(prop, "Instanced Objects", "Allow particle objects and face/vertex instances to show in line art"); RNA_def_property_update(prop, NC_SCENE, "rna_GpencilModifier_update"); prop = RNA_def_property(srna, "use_edge_overlap", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna( - prop, nullptr, "calculation_flags", MOD_LINEART_ALLOW_OVERLAPPING_EDGES); + RNA_def_property_boolean_sdna(prop, nullptr, "calculation_flags", LRT_ALLOW_OVERLAPPING_EDGES); RNA_def_property_ui_text( prop, "Handle Overlapping Edges", @@ -3646,8 +3642,7 @@ static void rna_def_modifier_gpencillineart(BlenderRNA *brna) RNA_def_property_update(prop, NC_SCENE, "rna_GpencilModifier_update"); prop = RNA_def_property(srna, "use_clip_plane_boundaries", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna( - prop, nullptr, "calculation_flags", MOD_LINEART_ALLOW_CLIPPING_BOUNDARIES); + RNA_def_property_boolean_sdna(prop, nullptr, "calculation_flags", LRT_ALLOW_CLIPPING_BOUNDARIES); RNA_def_property_ui_text(prop, "Clipping Boundaries", "Allow lines generated by the near/far clipping plane to be shown"); @@ -3681,44 +3676,43 @@ static void rna_def_modifier_gpencillineart(BlenderRNA *brna) RNA_def_property_update(prop, NC_SCENE, "rna_GpencilModifier_update"); prop = RNA_def_property(srna, "use_loose_as_contour", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, nullptr, "calculation_flags", MOD_LINEART_LOOSE_AS_CONTOUR); + RNA_def_property_boolean_sdna(prop, nullptr, "calculation_flags", LRT_LOOSE_AS_CONTOUR); RNA_def_property_ui_text(prop, "Loose As Contour", "Loose edges will have contour type"); RNA_def_property_update(prop, NC_SCENE, "rna_GpencilModifier_update"); prop = RNA_def_property(srna, "invert_source_vertex_group", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna( - prop, nullptr, "calculation_flags", MOD_LINEART_INVERT_SOURCE_VGROUP); + prop, nullptr, "calculation_flags", LRT_GPENCIL_INVERT_SOURCE_VGROUP); RNA_def_property_ui_text(prop, "Invert Vertex Group", "Invert source vertex group values"); RNA_def_property_update(prop, 0, "rna_GpencilModifier_update"); prop = RNA_def_property(srna, "use_output_vertex_group_match_by_name", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna( - prop, nullptr, "calculation_flags", MOD_LINEART_MATCH_OUTPUT_VGROUP); + prop, nullptr, "calculation_flags", LRT_GPENCIL_MATCH_OUTPUT_VGROUP); RNA_def_property_ui_text(prop, "Match Output", "Match output vertex group based on name"); RNA_def_property_update(prop, 0, "rna_GpencilModifier_update"); prop = RNA_def_property(srna, "use_face_mark", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, nullptr, "calculation_flags", MOD_LINEART_FILTER_FACE_MARK); + RNA_def_property_boolean_sdna(prop, nullptr, "calculation_flags", LRT_FILTER_FACE_MARK); RNA_def_property_ui_text( prop, "Filter Face Marks", "Filter feature lines using freestyle face marks"); RNA_def_property_update(prop, 0, "rna_GpencilModifier_update"); prop = RNA_def_property(srna, "use_face_mark_invert", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna( - prop, nullptr, "calculation_flags", MOD_LINEART_FILTER_FACE_MARK_INVERT); + RNA_def_property_boolean_sdna(prop, nullptr, "calculation_flags", LRT_FILTER_FACE_MARK_INVERT); RNA_def_property_ui_text(prop, "Invert", "Invert face mark filtering"); RNA_def_property_update(prop, 0, "rna_GpencilModifier_update"); prop = RNA_def_property(srna, "use_face_mark_boundaries", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna( - prop, nullptr, "calculation_flags", MOD_LINEART_FILTER_FACE_MARK_BOUNDARIES); + prop, nullptr, "calculation_flags", LRT_FILTER_FACE_MARK_BOUNDARIES); RNA_def_property_ui_text( prop, "Boundaries", "Filter feature lines based on face mark boundaries"); RNA_def_property_update(prop, 0, "rna_GpencilModifier_update"); prop = RNA_def_property(srna, "use_face_mark_keep_contour", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna( - prop, nullptr, "calculation_flags", MOD_LINEART_FILTER_FACE_MARK_KEEP_CONTOUR); + prop, nullptr, "calculation_flags", LRT_FILTER_FACE_MARK_KEEP_CONTOUR); RNA_def_property_ui_text(prop, "Keep Contour", "Preserve contour lines while filtering"); RNA_def_property_update(prop, 0, "rna_GpencilModifier_update"); @@ -3732,27 +3726,24 @@ static void rna_def_modifier_gpencillineart(BlenderRNA *brna) RNA_def_property_update(prop, NC_SCENE, "rna_GpencilModifier_update"); prop = RNA_def_property(srna, "use_loose_edge_chain", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, nullptr, "calculation_flags", MOD_LINEART_CHAIN_LOOSE_EDGES); + RNA_def_property_boolean_sdna(prop, nullptr, "calculation_flags", LRT_CHAIN_LOOSE_EDGES); RNA_def_property_ui_text(prop, "Chain Loose Edges", "Allow loose edges to be chained together"); RNA_def_property_update(prop, 0, "rna_GpencilModifier_update"); prop = RNA_def_property(srna, "use_geometry_space_chain", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna( - prop, nullptr, "calculation_flags", MOD_LINEART_CHAIN_GEOMETRY_SPACE); + RNA_def_property_boolean_sdna(prop, nullptr, "calculation_flags", LRT_CHAIN_GEOMETRY_SPACE); RNA_def_property_ui_text( prop, "Use Geometry Space", "Use geometry distance for chaining instead of image space"); RNA_def_property_update(prop, 0, "rna_GpencilModifier_update"); prop = RNA_def_property(srna, "use_detail_preserve", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna( - prop, nullptr, "calculation_flags", MOD_LINEART_CHAIN_PRESERVE_DETAILS); + RNA_def_property_boolean_sdna(prop, nullptr, "calculation_flags", LRT_CHAIN_PRESERVE_DETAILS); RNA_def_property_ui_text( prop, "Preserve Details", "Keep the zig-zag \"noise\" in initial chaining"); RNA_def_property_update(prop, 0, "rna_GpencilModifier_update"); prop = RNA_def_property(srna, "use_overlap_edge_type_support", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna( - prop, nullptr, "calculation_flags", MOD_LINEART_ALLOW_OVERLAP_EDGE_TYPES); + RNA_def_property_boolean_sdna(prop, nullptr, "calculation_flags", LRT_ALLOW_OVERLAP_EDGE_TYPES); RNA_def_property_ui_text(prop, "Overlapping Edge Types", "Allow an edge to have multiple overlapping types. This will create a " @@ -3769,7 +3760,7 @@ static void rna_def_modifier_gpencillineart(BlenderRNA *brna) RNA_def_property_update(prop, NC_SCENE, "rna_GpencilModifier_update"); prop = RNA_def_property(srna, "use_offset_towards_custom_camera", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, nullptr, "flags", MOD_LINEART_OFFSET_TOWARDS_CUSTOM_CAMERA); + RNA_def_property_boolean_sdna(prop, nullptr, "flags", LRT_GPENCIL_OFFSET_TOWARDS_CUSTOM_CAMERA); RNA_def_property_ui_text(prop, "Offset Towards Custom Camera", "Offset strokes towards selected camera instead of the active camera"); @@ -3811,46 +3802,45 @@ static void rna_def_modifier_gpencillineart(BlenderRNA *brna) /* types */ prop = RNA_def_property(srna, "use_contour", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, nullptr, "edge_types", MOD_LINEART_EDGE_FLAG_CONTOUR); + RNA_def_property_boolean_sdna(prop, nullptr, "edge_types", LRT_EDGE_FLAG_CONTOUR); RNA_def_property_ui_text(prop, "Use Contour", "Generate strokes from contours lines"); RNA_def_property_update(prop, 0, "rna_GpencilModifier_update"); prop = RNA_def_property(srna, "use_loose", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, nullptr, "edge_types", MOD_LINEART_EDGE_FLAG_LOOSE); + RNA_def_property_boolean_sdna(prop, nullptr, "edge_types", LRT_EDGE_FLAG_LOOSE); RNA_def_property_ui_text(prop, "Use Loose", "Generate strokes from loose edges"); RNA_def_property_update(prop, 0, "rna_GpencilModifier_update"); prop = RNA_def_property(srna, "use_crease", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, nullptr, "edge_types", MOD_LINEART_EDGE_FLAG_CREASE); + RNA_def_property_boolean_sdna(prop, nullptr, "edge_types", LRT_EDGE_FLAG_CREASE); RNA_def_property_ui_text(prop, "Use Crease", "Generate strokes from creased edges"); RNA_def_property_update(prop, 0, "rna_GpencilModifier_update"); prop = RNA_def_property(srna, "use_material", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, nullptr, "edge_types", MOD_LINEART_EDGE_FLAG_MATERIAL); + RNA_def_property_boolean_sdna(prop, nullptr, "edge_types", LRT_EDGE_FLAG_MATERIAL); RNA_def_property_ui_text( prop, "Use Material", "Generate strokes from borders between materials"); RNA_def_property_update(prop, 0, "rna_GpencilModifier_update"); prop = RNA_def_property(srna, "use_edge_mark", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, nullptr, "edge_types", MOD_LINEART_EDGE_FLAG_EDGE_MARK); + RNA_def_property_boolean_sdna(prop, nullptr, "edge_types", LRT_EDGE_FLAG_EDGE_MARK); RNA_def_property_ui_text(prop, "Use Edge Mark", "Generate strokes from freestyle marked edges"); RNA_def_property_update(prop, 0, "rna_GpencilModifier_update"); prop = RNA_def_property(srna, "use_intersection", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, nullptr, "edge_types", MOD_LINEART_EDGE_FLAG_INTERSECTION); + RNA_def_property_boolean_sdna(prop, nullptr, "edge_types", LRT_EDGE_FLAG_INTERSECTION); RNA_def_property_ui_text(prop, "Use Intersection", "Generate strokes from intersections"); RNA_def_property_update(prop, 0, "rna_GpencilModifier_update"); prop = RNA_def_property(srna, "use_light_contour", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, nullptr, "edge_types", MOD_LINEART_EDGE_FLAG_LIGHT_CONTOUR); + RNA_def_property_boolean_sdna(prop, nullptr, "edge_types", LRT_EDGE_FLAG_LIGHT_CONTOUR); RNA_def_property_ui_text(prop, "Use Light Contour", "Generate light/shadow separation lines from a reference light object"); RNA_def_property_update(prop, 0, "rna_GpencilModifier_update"); prop = RNA_def_property(srna, "use_shadow", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna( - prop, nullptr, "edge_types", MOD_LINEART_EDGE_FLAG_PROJECTED_SHADOW); + RNA_def_property_boolean_sdna(prop, nullptr, "edge_types", LRT_EDGE_FLAG_PROJECTED_SHADOW); RNA_def_property_ui_text( prop, "Use Shadow", "Project contour lines using a light source object"); RNA_def_property_update(prop, 0, "rna_GpencilModifier_update"); @@ -3921,12 +3911,12 @@ static void rna_def_modifier_gpencillineart(BlenderRNA *brna) RNA_def_property_update(prop, 0, "rna_GpencilModifier_update"); prop = RNA_def_property(srna, "is_baked", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, nullptr, "flags", MOD_LINEART_IS_BAKED); + RNA_def_property_boolean_sdna(prop, nullptr, "flags", LRT_GPENCIL_IS_BAKED); RNA_def_property_ui_text(prop, "Is Baked", "This modifier has baked data"); RNA_def_property_update(prop, 0, "rna_GpencilModifier_update"); prop = RNA_def_property(srna, "use_cache", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, nullptr, "flags", MOD_LINEART_USE_CACHE); + RNA_def_property_boolean_sdna(prop, nullptr, "flags", LRT_GPENCIL_USE_CACHE); RNA_def_property_ui_text(prop, "Use Cache", "Use cached scene data from the first line art modifier in the stack. " @@ -3955,13 +3945,13 @@ static void rna_def_modifier_gpencillineart(BlenderRNA *brna) RNA_def_property_update(prop, 0, "rna_GpencilModifier_update"); prop = RNA_def_property(srna, "use_material_mask", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, nullptr, "mask_switches", MOD_LINEART_MATERIAL_MASK_ENABLE); + RNA_def_property_boolean_sdna(prop, nullptr, "mask_switches", LRT_GPENCIL_MATERIAL_MASK_ENABLE); RNA_def_property_ui_text( prop, "Use Material Mask", "Use material masks to filter out occluded strokes"); RNA_def_property_update(prop, 0, "rna_GpencilModifier_update"); prop = RNA_def_property(srna, "use_material_mask_match", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, nullptr, "mask_switches", MOD_LINEART_MATERIAL_MASK_MATCH); + RNA_def_property_boolean_sdna(prop, nullptr, "mask_switches", LRT_GPENCIL_MATERIAL_MASK_MATCH); RNA_def_property_ui_text( prop, "Match Masks", "Require matching all material masks instead of just one"); RNA_def_property_update(prop, 0, "rna_GpencilModifier_update"); @@ -3973,7 +3963,7 @@ static void rna_def_modifier_gpencillineart(BlenderRNA *brna) RNA_def_property_update(prop, 0, "rna_GpencilModifier_update"); prop = RNA_def_property(srna, "use_intersection_match", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, nullptr, "mask_switches", MOD_LINEART_INTERSECTION_MATCH); + RNA_def_property_boolean_sdna(prop, nullptr, "mask_switches", LRT_GPENCIL_INTERSECTION_MATCH); RNA_def_property_ui_text( prop, "Match Intersection", "Require matching all intersection masks instead of just one"); RNA_def_property_update(prop, 0, "rna_GpencilModifier_update"); @@ -3986,28 +3976,26 @@ static void rna_def_modifier_gpencillineart(BlenderRNA *brna) prop = RNA_def_property(srna, "use_crease_on_smooth", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna( - prop, nullptr, "calculation_flags", MOD_LINEART_USE_CREASE_ON_SMOOTH_SURFACES); + prop, nullptr, "calculation_flags", LRT_USE_CREASE_ON_SMOOTH_SURFACES); RNA_def_property_ui_text( prop, "Crease On Smooth Surfaces", "Allow crease edges to show inside smooth surfaces"); RNA_def_property_update(prop, 0, "rna_GpencilModifier_update"); prop = RNA_def_property(srna, "use_crease_on_sharp", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna( - prop, nullptr, "calculation_flags", MOD_LINEART_USE_CREASE_ON_SHARP_EDGES); + RNA_def_property_boolean_sdna(prop, nullptr, "calculation_flags", LRT_USE_CREASE_ON_SHARP_EDGES); RNA_def_property_ui_text(prop, "Crease On Sharp Edges", "Allow crease to show on sharp edges"); RNA_def_property_update(prop, 0, "rna_GpencilModifier_update"); prop = RNA_def_property(srna, "use_image_boundary_trimming", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna( - prop, nullptr, "calculation_flags", MOD_LINEART_USE_IMAGE_BOUNDARY_TRIMMING); + prop, nullptr, "calculation_flags", LRT_USE_IMAGE_BOUNDARY_TRIMMING); RNA_def_property_ui_text( prop, "Image Boundary Trimming", "Trim all edges right at the boundary of image (including overscan region)"); prop = RNA_def_property(srna, "use_back_face_culling", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna( - prop, nullptr, "calculation_flags", MOD_LINEART_USE_BACK_FACE_CULLING); + RNA_def_property_boolean_sdna(prop, nullptr, "calculation_flags", LRT_USE_BACK_FACE_CULLING); RNA_def_property_ui_text( prop, "Back Face Culling", @@ -4038,14 +4026,14 @@ static void rna_def_modifier_gpencillineart(BlenderRNA *brna) RNA_def_property_range(prop, 0.0f, 10000.0f); prop = RNA_def_property(srna, "use_invert_collection", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, nullptr, "flags", MOD_LINEART_INVERT_COLLECTION); + RNA_def_property_boolean_sdna(prop, nullptr, "flags", LRT_GPENCIL_INVERT_COLLECTION); RNA_def_property_ui_text(prop, "Invert Collection Filtering", "Select everything except lines from specified collection"); RNA_def_property_update(prop, 0, "rna_GpencilModifier_update"); prop = RNA_def_property(srna, "use_invert_silhouette", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, nullptr, "flags", MOD_LINEART_INVERT_SILHOUETTE_FILTER); + RNA_def_property_boolean_sdna(prop, nullptr, "flags", LRT_GPENCIL_INVERT_SILHOUETTE_FILTER); RNA_def_property_ui_text(prop, "Invert Silhouette Filtering", "Select anti-silhouette lines"); RNA_def_property_update(prop, 0, "rna_GpencilModifier_update"); diff --git a/source/blender/makesrna/intern/rna_grease_pencil.cc b/source/blender/makesrna/intern/rna_grease_pencil.cc index bf0d580c7fb..c2adafef7c1 100644 --- a/source/blender/makesrna/intern/rna_grease_pencil.cc +++ b/source/blender/makesrna/intern/rna_grease_pencil.cc @@ -22,13 +22,11 @@ # include -# include "BKE_attribute.hh" # include "BKE_grease_pencil.hh" # include "BLI_span.hh" # include "DEG_depsgraph.hh" -# include "DEG_depsgraph_build.hh" static GreasePencil *rna_grease_pencil(const PointerRNA *ptr) { @@ -38,84 +36,7 @@ static GreasePencil *rna_grease_pencil(const PointerRNA *ptr) static void rna_grease_pencil_update(Main * /*bmain*/, Scene * /*scene*/, PointerRNA *ptr) { DEG_id_tag_update(&rna_grease_pencil(ptr)->id, ID_RECALC_GEOMETRY); - WM_main_add_notifier(NC_GPENCIL | NA_EDITED, rna_grease_pencil(ptr)); -} - -static void rna_grease_pencil_autolock(Main * /*bmain*/, Scene * /*scene*/, PointerRNA *ptr) -{ - using namespace blender::bke::greasepencil; - GreasePencil *grease_pencil = rna_grease_pencil(ptr); - if (grease_pencil->flag & GREASE_PENCIL_AUTOLOCK_LAYERS) { - grease_pencil->autolock_inactive_layers(); - } - else { - for (Layer *layer : grease_pencil->layers_for_write()) { - layer->set_locked(false); - } - } - - rna_grease_pencil_update(nullptr, nullptr, ptr); -} - -static void rna_grease_pencil_dependency_update(Main *bmain, Scene * /*scene*/, PointerRNA *ptr) -{ - DEG_id_tag_update(&rna_grease_pencil(ptr)->id, ID_RECALC_GEOMETRY); - DEG_relations_tag_update(bmain); - WM_main_add_notifier(NC_GPENCIL | NA_EDITED, rna_grease_pencil(ptr)); -} - -static void rna_grease_pencil_layer_mask_name_get(PointerRNA *ptr, char *dst) -{ - using namespace blender; - GreasePencilLayerMask *mask = static_cast(ptr->data); - if (mask->layer_name != nullptr) { - strcpy(dst, mask->layer_name); - } - else { - dst[0] = '\0'; - } -} - -static int rna_grease_pencil_layer_mask_name_length(PointerRNA *ptr) -{ - using namespace blender; - GreasePencilLayerMask *mask = static_cast(ptr->data); - if (mask->layer_name != nullptr) { - return strlen(mask->layer_name); - } - return 0; -} - -static void rna_grease_pencil_layer_mask_name_set(PointerRNA *ptr, const char *value) -{ - using namespace blender; - GreasePencil *grease_pencil = rna_grease_pencil(ptr); - GreasePencilLayerMask *mask = static_cast(ptr->data); - - const std::string oldname(mask->layer_name); - if (bke::greasepencil::TreeNode *node = grease_pencil->find_node_by_name(oldname)) { - grease_pencil->rename_node(*node, value); - } -} - -static int rna_grease_pencil_active_mask_index_get(PointerRNA *ptr) -{ - GreasePencilLayer *layer = static_cast(ptr->data); - return layer->active_mask_index; -} - -static void rna_grease_pencil_active_mask_index_set(PointerRNA *ptr, int value) -{ - GreasePencilLayer *layer = static_cast(ptr->data); - layer->active_mask_index = value; -} - -static void rna_grease_pencil_active_mask_index_range( - PointerRNA *ptr, int *min, int *max, int * /*softmin*/, int * /*softmax*/) -{ - GreasePencilLayer *layer = static_cast(ptr->data); - *min = 0; - *max = max_ii(0, BLI_listbase_count(&layer->masks) - 1); + WM_main_add_notifier(NC_GPENCIL | NA_EDITED, nullptr); } static void rna_iterator_grease_pencil_layers_begin(CollectionPropertyIterator *iter, @@ -190,34 +111,6 @@ static void rna_GreasePencilLayer_name_set(PointerRNA *ptr, const char *value) grease_pencil->rename_node(layer->wrap().as_node(), value); } -static int rna_GreasePencilLayer_pass_index_get(PointerRNA *ptr) -{ - using namespace blender; - const GreasePencil &grease_pencil = *rna_grease_pencil(ptr); - const bke::greasepencil::Layer &layer = - static_cast(ptr->data)->wrap(); - const int layer_idx = *grease_pencil.get_layer_index(layer); - - const VArray layer_passes = *grease_pencil.attributes().lookup_or_default( - "pass_index", bke::AttrDomain::Layer, 0); - return layer_passes[layer_idx]; -} - -static void rna_GreasePencilLayer_pass_index_set(PointerRNA *ptr, int value) -{ - using namespace blender; - GreasePencil &grease_pencil = *rna_grease_pencil(ptr); - const bke::greasepencil::Layer &layer = - static_cast(ptr->data)->wrap(); - const int layer_idx = *grease_pencil.get_layer_index(layer); - - bke::SpanAttributeWriter layer_passes = - grease_pencil.attributes_for_write().lookup_or_add_for_write_span( - "pass_index", bke::AttrDomain::Layer); - layer_passes.span[layer_idx] = std::max(0, value); - layer_passes.finish(); -} - static PointerRNA rna_GreasePencil_active_layer_get(PointerRNA *ptr) { GreasePencil *grease_pencil = rna_grease_pencil(ptr); @@ -283,76 +176,11 @@ static int rna_iterator_grease_pencil_layer_groups_length(PointerRNA *ptr) #else -static void rna_def_grease_pencil_layers_mask_api(BlenderRNA *brna, PropertyRNA *cprop) -{ - StructRNA *srna; - PropertyRNA *prop; - - RNA_def_property_srna(cprop, "GreasePencilLayerMasks"); - srna = RNA_def_struct(brna, "GreasePencilLayerMasks", nullptr); - RNA_def_struct_sdna(srna, "GreasePencilLayer"); - RNA_def_struct_ui_text( - srna, "Grease Pencil Mask Layers", "Collection of grease pencil masking layers"); - - prop = RNA_def_property(srna, "active_mask_index", PROP_INT, PROP_UNSIGNED); - RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); - RNA_def_property_int_funcs(prop, - "rna_grease_pencil_active_mask_index_get", - "rna_grease_pencil_active_mask_index_set", - "rna_grease_pencil_active_mask_index_range"); - RNA_def_property_ui_text(prop, "Active Layer Mask Index", "Active index in layer mask array"); -} - -static void rna_def_grease_pencil_layer_mask(BlenderRNA *brna) -{ - StructRNA *srna; - PropertyRNA *prop; - - srna = RNA_def_struct(brna, "GreasePencilLayerMask", nullptr); - RNA_def_struct_sdna(srna, "GreasePencilLayerMask"); - RNA_def_struct_ui_text(srna, "Grease Pencil Masking Layers", "List of Mask Layers"); - // RNA_def_struct_path_func(srna, "rna_GreasePencilLayerMask_path"); - - prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE); - RNA_def_property_ui_text(prop, "Layer", "Mask layer name"); - RNA_def_property_string_sdna(prop, nullptr, "layer_name"); - RNA_def_property_string_funcs(prop, - "rna_grease_pencil_layer_mask_name_get", - "rna_grease_pencil_layer_mask_name_length", - "rna_grease_pencil_layer_mask_name_set"); - RNA_def_struct_name_property(srna, prop); - RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); - RNA_def_property_update(prop, NC_GPENCIL | ND_DATA | NA_RENAME, nullptr); - - prop = RNA_def_property(srna, "hide", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, nullptr, "flag", GP_LAYER_MASK_HIDE); - RNA_def_property_ui_icon(prop, ICON_HIDE_OFF, -1); - RNA_def_property_ui_text(prop, "Hide", "Set mask Visibility"); - RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_grease_pencil_update"); - - prop = RNA_def_property(srna, "invert", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, nullptr, "flag", GP_LAYER_MASK_INVERT); - RNA_def_property_ui_icon(prop, ICON_SELECT_INTERSECT, 1); - RNA_def_property_ui_text(prop, "Invert", "Invert mask"); - RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_grease_pencil_update"); -} - static void rna_def_grease_pencil_layer(BlenderRNA *brna) { StructRNA *srna; PropertyRNA *prop; - static const float scale_defaults[3] = {1.0f, 1.0f, 1.0f}; - - static const EnumPropertyItem rna_enum_layer_blend_modes_items[] = { - {GP_LAYER_BLEND_NONE, "REGULAR", 0, "Regular", ""}, - {GP_LAYER_BLEND_HARDLIGHT, "HARDLIGHT", 0, "Hard Light", ""}, - {GP_LAYER_BLEND_ADD, "ADD", 0, "Add", ""}, - {GP_LAYER_BLEND_SUBTRACT, "SUBTRACT", 0, "Subtract", ""}, - {GP_LAYER_BLEND_MULTIPLY, "MULTIPLY", 0, "Multiply", ""}, - {GP_LAYER_BLEND_DIVIDE, "DIVIDE", 0, "Divide", ""}, - {0, nullptr, 0, nullptr, nullptr}}; - srna = RNA_def_struct(brna, "GreasePencilLayer", nullptr); RNA_def_struct_sdna(srna, "GreasePencilLayer"); RNA_def_struct_ui_text(srna, "Grease Pencil Layer", "Collection of related drawings"); @@ -368,13 +196,6 @@ static void rna_def_grease_pencil_layer(BlenderRNA *brna) RNA_def_struct_name_property(srna, prop); RNA_def_property_update(prop, NC_GPENCIL | ND_DATA | NA_RENAME, "rna_grease_pencil_update"); - /* Mask Layers */ - prop = RNA_def_property(srna, "mask_layers", PROP_COLLECTION, PROP_NONE); - RNA_def_property_collection_sdna(prop, nullptr, "masks", nullptr); - RNA_def_property_struct_type(prop, "GreasePencilLayerMask"); - RNA_def_property_ui_text(prop, "Masks", "List of Masking Layers"); - rna_def_grease_pencil_layers_mask_api(brna, prop); - /* Visibility */ prop = RNA_def_property(srna, "hide", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna( @@ -405,73 +226,6 @@ static void rna_def_grease_pencil_layer(BlenderRNA *brna) RNA_def_property_ui_text( prop, "Onion Skinning", "Display onion skins before and after the current frame"); RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_grease_pencil_update"); - - /* Use Masks. */ - prop = RNA_def_property(srna, "use_masks", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_negative_sdna( - prop, "GreasePencilLayerTreeNode", "flag", GP_LAYER_TREE_NODE_HIDE_MASKS); - RNA_def_property_ui_text( - prop, - "Use Masks", - "The visibility of drawings on this layer is affected by the layers in its masks list"); - RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_grease_pencil_update"); - - /* pass index for compositing and modifiers */ - prop = RNA_def_property(srna, "pass_index", PROP_INT, PROP_UNSIGNED); - RNA_def_property_ui_text(prop, "Pass Index", "Index number for the \"Layer Index\" pass"); - RNA_def_property_int_funcs(prop, - "rna_GreasePencilLayer_pass_index_get", - "rna_GreasePencilLayer_pass_index_set", - nullptr); - RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_grease_pencil_update"); - - prop = RNA_def_property(srna, "parent", PROP_POINTER, PROP_NONE); - RNA_def_property_struct_type(prop, "Object"); - RNA_def_property_flag(prop, PROP_EDITABLE | PROP_ID_SELF_CHECK); - RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_LIBRARY); - RNA_def_property_ui_text(prop, "Parent", "Parent object"); - RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_grease_pencil_dependency_update"); - - prop = RNA_def_property(srna, "parent_bone", PROP_STRING, PROP_NONE); - RNA_def_property_string_sdna(prop, nullptr, "parsubstr"); - RNA_def_property_ui_text( - prop, "Parent Bone", "Name of parent bone. Only used when the parent object is an armature"); - RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_grease_pencil_dependency_update"); - - prop = RNA_def_property(srna, "translation", PROP_FLOAT, PROP_TRANSLATION); - RNA_def_property_array(prop, 3); - RNA_def_property_float_sdna(prop, nullptr, "translation"); - RNA_def_property_ui_range(prop, -FLT_MAX, FLT_MAX, 1, RNA_TRANSLATION_PREC_DEFAULT); - RNA_def_property_ui_text(prop, "Translation", "Translation of the layer"); - RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_grease_pencil_update"); - - prop = RNA_def_property(srna, "rotation", PROP_FLOAT, PROP_EULER); - RNA_def_property_array(prop, 3); - RNA_def_property_float_sdna(prop, nullptr, "rotation"); - RNA_def_property_ui_range(prop, -FLT_MAX, FLT_MAX, 1, RNA_TRANSLATION_PREC_DEFAULT); - RNA_def_property_ui_text(prop, "Rotation", "Euler rotation of the layer"); - RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_grease_pencil_update"); - - prop = RNA_def_property(srna, "scale", PROP_FLOAT, PROP_XYZ); - RNA_def_property_array(prop, 3); - RNA_def_property_float_sdna(prop, nullptr, "scale"); - RNA_def_property_float_array_default(prop, scale_defaults); - RNA_def_property_ui_range(prop, -FLT_MAX, FLT_MAX, 1, 3); - RNA_def_property_ui_text(prop, "Scale", "Scale of the layer"); - RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_grease_pencil_update"); - - prop = RNA_def_property(srna, "viewlayer_render", PROP_STRING, PROP_NONE); - RNA_def_property_string_sdna(prop, nullptr, "viewlayername"); - RNA_def_property_ui_text( - prop, - "ViewLayer", - "Only include Layer in this View Layer render output (leave blank to include always)"); - - prop = RNA_def_property(srna, "blend_mode", PROP_ENUM, PROP_NONE); - RNA_def_property_enum_sdna(prop, nullptr, "blend_mode"); - RNA_def_property_enum_items(prop, rna_enum_layer_blend_modes_items); - RNA_def_property_ui_text(prop, "Blend Mode", "Blend mode"); - RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_grease_pencil_update"); } static void rna_def_grease_pencil_layers_api(BlenderRNA *brna, PropertyRNA *cprop) @@ -532,16 +286,6 @@ static void rna_def_grease_pencil_layer_group(BlenderRNA *brna) RNA_def_property_ui_text( prop, "Locked", "Protect group from further editing and/or frame changes"); RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_grease_pencil_update"); - - /* Use Masks. */ - prop = RNA_def_property(srna, "use_masks", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_negative_sdna( - prop, "GreasePencilLayerTreeNode", "flag", GP_LAYER_TREE_NODE_HIDE_MASKS); - RNA_def_property_ui_text(prop, - "Use Masks", - "The visibility of drawings in the layers in this group is affected by " - "the layers in the masks lists"); - RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_grease_pencil_update"); } static void rna_def_grease_pencil_data(BlenderRNA *brna) @@ -549,16 +293,6 @@ static void rna_def_grease_pencil_data(BlenderRNA *brna) StructRNA *srna; PropertyRNA *prop; - static EnumPropertyItem prop_stroke_depth_order_items[] = { - {0, "2D", 0, "2D Layers", "Display strokes using grease pencil layers to define order"}, - {GREASE_PENCIL_STROKE_ORDER_3D, - "3D", - 0, - "3D Location", - "Display strokes using real 3D position in 3D space"}, - {0, nullptr, 0, nullptr, nullptr}, - }; - srna = RNA_def_struct(brna, "GreasePencilv3", "ID"); RNA_def_struct_sdna(srna, "GreasePencil"); RNA_def_struct_ui_text(srna, "Grease Pencil", "Grease Pencil data-block"); @@ -614,31 +348,12 @@ static void rna_def_grease_pencil_data(BlenderRNA *brna) nullptr, /* TODO */ nullptr); RNA_def_property_ui_text(prop, "Layer Groups", "Grease Pencil layer groups"); - - prop = RNA_def_property(srna, "use_autolock_layers", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, nullptr, "flag", GREASE_PENCIL_AUTOLOCK_LAYERS); - RNA_def_property_ui_text( - prop, - "Auto-Lock Layers", - "Automatically lock all layers except the active one to avoid accidental changes"); - RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_grease_pencil_autolock"); - - /* Uses a single flag, because the depth order can only be 2D or 3D. */ - prop = RNA_def_property(srna, "stroke_depth_order", PROP_ENUM, PROP_NONE); - RNA_def_property_enum_bitflag_sdna(prop, nullptr, "flag"); - RNA_def_property_enum_items(prop, prop_stroke_depth_order_items); - RNA_def_property_ui_text( - prop, - "Stroke Depth Order", - "Defines how the strokes are ordered in 3D space (for objects not displayed 'In Front')"); - RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_grease_pencil_update"); } void RNA_def_grease_pencil(BlenderRNA *brna) { rna_def_grease_pencil_data(brna); rna_def_grease_pencil_layer(brna); - rna_def_grease_pencil_layer_mask(brna); rna_def_grease_pencil_layer_group(brna); } diff --git a/source/blender/makesrna/intern/rna_image.cc b/source/blender/makesrna/intern/rna_image.cc index f93e234de7a..ec67020092a 100644 --- a/source/blender/makesrna/intern/rna_image.cc +++ b/source/blender/makesrna/intern/rna_image.cc @@ -58,7 +58,7 @@ static const EnumPropertyItem image_source_items[] = { # include "BLI_math_base.h" # include "BLI_math_vector.h" -# include "BKE_global.hh" +# include "BKE_global.h" # include "GPU_texture.h" diff --git a/source/blender/makesrna/intern/rna_image_api.cc b/source/blender/makesrna/intern/rna_image_api.cc index 2dc5e5bfcdd..9893287485a 100644 --- a/source/blender/makesrna/intern/rna_image_api.cc +++ b/source/blender/makesrna/intern/rna_image_api.cc @@ -30,7 +30,7 @@ # include "BKE_image_format.h" # include "BKE_image_save.h" # include "BKE_main.hh" -# include "BKE_scene.hh" +# include "BKE_scene.h" # include # include "IMB_imbuf.hh" diff --git a/source/blender/makesrna/intern/rna_internal.hh b/source/blender/makesrna/intern/rna_internal.hh index b1482cf4ad2..c58b73592bb 100644 --- a/source/blender/makesrna/intern/rna_internal.hh +++ b/source/blender/makesrna/intern/rna_internal.hh @@ -347,7 +347,7 @@ void rna_Scene_use_view_map_cache_update(Main *bmain, Scene *scene, PointerRNA * void rna_Scene_render_update(Main *bmain, Scene *scene, PointerRNA *ptr); void rna_Scene_freestyle_update(Main *bmain, Scene *scene, PointerRNA *ptr); void rna_ViewLayer_name_set(PointerRNA *ptr, const char *value); -void rna_ViewLayer_override_update(Main *bmain, Scene *activescene, PointerRNA *ptr); +void rna_ViewLayer_material_override_update(Main *bmain, Scene *activescene, PointerRNA *ptr); void rna_ViewLayer_pass_update(Main *bmain, Scene *activescene, PointerRNA *ptr); void rna_ViewLayer_active_aov_index_range( PointerRNA *ptr, int *min, int *max, int *softmin, int *softmax); diff --git a/source/blender/makesrna/intern/rna_internal_types.hh b/source/blender/makesrna/intern/rna_internal_types.hh index 6d4eed32869..89713dd241e 100644 --- a/source/blender/makesrna/intern/rna_internal_types.hh +++ b/source/blender/makesrna/intern/rna_internal_types.hh @@ -531,7 +531,7 @@ struct StructRNA { /* various options */ int flag; - /* Each StructRNA type can define its own tags which properties can set + /* Each StructRNA type can define own tags which properties can set * (PropertyRNA.tags) for changed behavior based on struct-type. */ const EnumPropertyItem *prop_tag_defines; diff --git a/source/blender/makesrna/intern/rna_key.cc b/source/blender/makesrna/intern/rna_key.cc index 4257c1e98c0..4b512c98937 100644 --- a/source/blender/makesrna/intern/rna_key.cc +++ b/source/blender/makesrna/intern/rna_key.cc @@ -18,7 +18,7 @@ #include "BLI_math_rotation.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "RNA_access.hh" #include "RNA_define.hh" diff --git a/source/blender/makesrna/intern/rna_layer.cc b/source/blender/makesrna/intern/rna_layer.cc index aaa6ec88116..31d0b91e5db 100644 --- a/source/blender/makesrna/intern/rna_layer.cc +++ b/source/blender/makesrna/intern/rna_layer.cc @@ -10,7 +10,7 @@ #include "DNA_scene_types.h" #include "DNA_view3d_types.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "ED_object.hh" #include "ED_render.hh" @@ -38,8 +38,8 @@ # include "BKE_idprop.h" # include "BKE_layer.hh" # include "BKE_mesh.hh" -# include "BKE_node.hh" -# include "BKE_scene.hh" +# include "BKE_node.h" +# include "BKE_scene.h" # include "NOD_composite.hh" diff --git a/source/blender/makesrna/intern/rna_light.cc b/source/blender/makesrna/intern/rna_light.cc index 05963a7fbe0..227881573ca 100644 --- a/source/blender/makesrna/intern/rna_light.cc +++ b/source/blender/makesrna/intern/rna_light.cc @@ -12,7 +12,7 @@ #include "BLI_math_rotation.h" #include "BLI_sys_types.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "RNA_define.hh" #include "RNA_enum_types.hh" @@ -296,14 +296,6 @@ static void rna_def_light_shadow(StructRNA *srna, bool sun) prop, "Shadow Softness Factor", "Scale light shape for smaller penumbra"); RNA_def_property_update(prop, 0, "rna_Light_update"); - prop = RNA_def_property(srna, "shadow_filter_radius", PROP_FLOAT, PROP_FACTOR); - RNA_def_property_range(prop, 0.0f, FLT_MAX); - RNA_def_property_ui_range(prop, 0.0f, 5.0f, 1.0f, 2); - RNA_def_property_ui_text( - prop, "Shadow Filter Radius", "Blur shadow aliasing using Percentage Closer Filtering"); - RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_LIBRARY); - RNA_def_property_update(prop, 0, "rna_Light_update"); - if (sun) { prop = RNA_def_property(srna, "shadow_cascade_max_distance", PROP_FLOAT, PROP_DISTANCE); RNA_def_property_float_sdna(prop, nullptr, "cascade_max_dist"); diff --git a/source/blender/makesrna/intern/rna_linestyle.cc b/source/blender/makesrna/intern/rna_linestyle.cc index 44cabed816f..24a64a172cf 100644 --- a/source/blender/makesrna/intern/rna_linestyle.cc +++ b/source/blender/makesrna/intern/rna_linestyle.cc @@ -12,7 +12,7 @@ #include "BLI_math_rotation.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "RNA_define.hh" #include "RNA_enum_types.hh" diff --git a/source/blender/makesrna/intern/rna_main.cc b/source/blender/makesrna/intern/rna_main.cc index e02bc64bab1..a5684bc47c3 100644 --- a/source/blender/makesrna/intern/rna_main.cc +++ b/source/blender/makesrna/intern/rna_main.cc @@ -19,7 +19,7 @@ #ifdef RNA_RUNTIME -# include "BKE_global.hh" +# include "BKE_global.h" # include "BKE_main.hh" # include "BKE_mesh.hh" diff --git a/source/blender/makesrna/intern/rna_main_api.cc b/source/blender/makesrna/intern/rna_main_api.cc index acb1d52ff92..9c3cccb1dee 100644 --- a/source/blender/makesrna/intern/rna_main_api.cc +++ b/source/blender/makesrna/intern/rna_main_api.cc @@ -29,7 +29,7 @@ # include "BKE_armature.hh" # include "BKE_brush.hh" # include "BKE_camera.h" -# include "BKE_collection.hh" +# include "BKE_collection.h" # include "BKE_curve.hh" # include "BKE_curves.h" # include "BKE_displist.h" @@ -47,12 +47,12 @@ # include "BKE_mball.hh" # include "BKE_mesh.hh" # include "BKE_movieclip.h" -# include "BKE_node.hh" +# include "BKE_node.h" # include "BKE_object.hh" # include "BKE_paint.hh" # include "BKE_particle.h" # include "BKE_pointcloud.hh" -# include "BKE_scene.hh" +# include "BKE_scene.h" # include "BKE_sound.h" # include "BKE_speaker.h" # include "BKE_text.h" @@ -94,7 +94,7 @@ # include "ED_node.hh" # include "ED_screen.hh" -# include "BLT_translation.hh" +# include "BLT_translation.h" # ifdef WITH_PYTHON # include "BPY_extern.h" diff --git a/source/blender/makesrna/intern/rna_mask.cc b/source/blender/makesrna/intern/rna_mask.cc index 13a87a1d923..5f06cf10aa0 100644 --- a/source/blender/makesrna/intern/rna_mask.cc +++ b/source/blender/makesrna/intern/rna_mask.cc @@ -18,7 +18,7 @@ #include "BLI_math_vector.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_movieclip.h" #include "BKE_tracking.h" diff --git a/source/blender/makesrna/intern/rna_material.cc b/source/blender/makesrna/intern/rna_material.cc index e1b8de5ae69..9b3fb084b3b 100644 --- a/source/blender/makesrna/intern/rna_material.cc +++ b/source/blender/makesrna/intern/rna_material.cc @@ -15,7 +15,7 @@ #include "BLI_math_rotation.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_customdata.hh" @@ -72,9 +72,9 @@ const EnumPropertyItem rna_enum_ramp_blend_items[] = { # include "BKE_grease_pencil.hh" # include "BKE_main.hh" # include "BKE_material.h" -# include "BKE_node.hh" +# include "BKE_node.h" # include "BKE_paint.hh" -# include "BKE_scene.hh" +# include "BKE_scene.h" # include "BKE_texture.h" # include "BKE_workspace.h" @@ -200,7 +200,7 @@ static void rna_Material_use_nodes_update(bContext *C, PointerRNA *ptr) ED_node_shader_default(C, &ma->id); } - DEG_id_tag_update(&ma->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&ma->id, ID_RECALC_COPY_ON_WRITE); DEG_relations_tag_update(bmain); rna_Material_draw_update(bmain, CTX_data_scene(C), ptr); } diff --git a/source/blender/makesrna/intern/rna_mesh.cc b/source/blender/makesrna/intern/rna_mesh.cc index 892d1a85ee1..0cd9313a7f0 100644 --- a/source/blender/makesrna/intern/rna_mesh.cc +++ b/source/blender/makesrna/intern/rna_mesh.cc @@ -62,7 +62,7 @@ static const EnumPropertyItem rna_enum_mesh_remesh_mode_items[] = { # include "BKE_main.hh" # include "BKE_mesh.hh" # include "BKE_mesh_runtime.hh" -# include "BKE_report.hh" +# include "BKE_report.h" # include "DEG_depsgraph.hh" diff --git a/source/blender/makesrna/intern/rna_mesh_api.cc b/source/blender/makesrna/intern/rna_mesh_api.cc index b9d6c8d70ab..5f7b1f7a75a 100644 --- a/source/blender/makesrna/intern/rna_mesh_api.cc +++ b/source/blender/makesrna/intern/rna_mesh_api.cc @@ -23,7 +23,7 @@ # include "DNA_mesh_types.h" -# include "BKE_anim_data.hh" +# include "BKE_anim_data.h" # include "BKE_attribute.hh" # include "BKE_mesh.h" # include "BKE_mesh.hh" @@ -31,7 +31,7 @@ # include "BKE_mesh_mapping.hh" # include "BKE_mesh_runtime.hh" # include "BKE_mesh_tangent.hh" -# include "BKE_report.hh" +# include "BKE_report.h" # include "ED_mesh.hh" diff --git a/source/blender/makesrna/intern/rna_meta.cc b/source/blender/makesrna/intern/rna_meta.cc index c0ef140ef94..f43f16926d2 100644 --- a/source/blender/makesrna/intern/rna_meta.cc +++ b/source/blender/makesrna/intern/rna_meta.cc @@ -32,7 +32,7 @@ # include "BKE_main.hh" # include "BKE_mball.hh" -# include "BKE_scene.hh" +# include "BKE_scene.h" # include "DEG_depsgraph.hh" @@ -81,7 +81,7 @@ static void rna_MetaBall_redraw_data(Main * /*bmain*/, Scene * /*scene*/, Pointe { ID *id = ptr->owner_id; - DEG_id_tag_update(id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(id, ID_RECALC_COPY_ON_WRITE); WM_main_add_notifier(NC_GEOM | ND_DATA, id); } diff --git a/source/blender/makesrna/intern/rna_modifier.cc b/source/blender/makesrna/intern/rna_modifier.cc index cad26a073e8..9cccaebd075 100644 --- a/source/blender/makesrna/intern/rna_modifier.cc +++ b/source/blender/makesrna/intern/rna_modifier.cc @@ -13,7 +13,6 @@ #include "DNA_armature_types.h" #include "DNA_cachefile_types.h" #include "DNA_gpencil_modifier_types.h" -#include "DNA_lineart_types.h" #include "DNA_mesh_types.h" #include "DNA_modifier_types.h" #include "DNA_object_force_types.h" @@ -22,7 +21,7 @@ #include "MEM_guardedalloc.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_animsys.h" #include "BKE_attribute.hh" @@ -50,13 +49,6 @@ #include "MOD_nodes.hh" const EnumPropertyItem rna_enum_object_modifier_type_items[] = { - RNA_ENUM_ITEM_HEADING(N_("Modify"), nullptr), - {eModifierType_GreasePencilWeightProximity, - "GREASE_PENCIL_VERTEX_WEIGHT_PROXIMITY", - ICON_MOD_VERTEX_WEIGHT, - "Vertex Weight Proximity", - "Generate Vertex Weights base on distance to object"}, - RNA_ENUM_ITEM_HEADING(N_("Modify"), nullptr), {eModifierType_DataTransfer, "DATA_TRANSFER", @@ -124,16 +116,6 @@ const EnumPropertyItem rna_enum_object_modifier_type_items[] = { ICON_MOD_OPACITY, "Opacity", "Change the opacity of the strokes"}, - {eModifierType_GreasePencilWeightAngle, - "GREASE_PENCIL_VERTEX_WEIGHT_ANGLE", - ICON_MOD_VERTEX_WEIGHT, - "Vertex Weight Angle", - "Generate vertex weights base on stroke angle"}, - {eModifierType_GreasePencilTime, - "GREASE_PENCIL_TIME", - ICON_MOD_TIME, - "Time Offset", - "Offset keyframes"}, RNA_ENUM_ITEM_HEADING(N_("Generate"), nullptr), {eModifierType_Array, @@ -229,46 +211,16 @@ const EnumPropertyItem rna_enum_object_modifier_type_items[] = { ICON_MOD_WIREFRAME, "Wireframe", "Convert faces into thickened edges"}, - {eModifierType_GreasePencilArray, - "GREASE_PENCIL_ARRAY", - ICON_MOD_ARRAY, - "Array strokes", - "Duplicate strokes into an array"}, - {eModifierType_GreasePencilLength, - "GREASE_PENCIL_LENGTH", - ICON_MOD_LENGTH, - "Length", - "Grease Pencil length modifier"}, - {eModifierType_GreasePencilLineart, - "LINEART", - ICON_GREASEPENCIL, - "Line Art", - "Generate line art from scene geometries"}, - {eModifierType_GreasePencilMirror, - "GREASE_PENCIL_MIRROR", - ICON_MOD_MIRROR, - "Mirror strokes", - "Duplicate strokes like a mirror"}, - {eModifierType_GreasePencilMultiply, - "GREASE_PENCIL_MULTIPLY", - ICON_GP_MULTIFRAME_EDITING, - "Multiple Strokes", - "Generate multiple strokes around original strokes"}, {eModifierType_GreasePencilSubdiv, "GREASE_PENCIL_SUBDIV", ICON_MOD_SUBSURF, "Subdivide strokes", "Grease Pencil subdivide modifier"}, - {eModifierType_GreasePencilEnvelope, - "GREASE_PENCIL_ENVELOPE", - ICON_MOD_ENVELOPE, - "Envelope", - "Create an envelope shape"}, - {eModifierType_GreasePencilOutline, - "GREASE_PENCIL_OUTLINE", - ICON_MOD_OUTLINE, - "Outline", - "Convert stroke to perimeter"}, + {eModifierType_GreasePencilMirror, + "GREASE_PENCIL_MIRROR", + ICON_MOD_MIRROR, + "Mirror strokes", + "Duplicate strokes like a mirror"}, RNA_ENUM_ITEM_HEADING(N_("Deform"), nullptr), {eModifierType_Armature, @@ -349,11 +301,6 @@ const EnumPropertyItem rna_enum_object_modifier_type_items[] = { ICON_VOLUME_DATA, "Volume Displace", "Deform volume based on noise or other vector fields"}, /* TODO: Use correct icon. */ - {eModifierType_GreasePencilHook, - "GREASE_PENCIL_HOOK", - ICON_HOOK, - "Hook", - "Deform stroke points using objects"}, {eModifierType_GreasePencilNoise, "GREASE_PENCIL_NOISE", ICON_MOD_NOISE, @@ -374,26 +321,6 @@ const EnumPropertyItem rna_enum_object_modifier_type_items[] = { ICON_MOD_THICKNESS, "Thickness", "Change stroke thickness"}, - {eModifierType_GreasePencilLattice, - "GREASE_PENCIL_LATTICE", - ICON_MOD_LATTICE, - "Lattice", - "Deform strokes using a lattice object"}, - {eModifierType_GreasePencilDash, - "GREASE_PENCIL_DASH", - ICON_MOD_DASH, - "Dot Dash", - "Generate dot-dash styled strokes"}, - {eModifierType_GreasePencilArmature, - "GREASE_PENCIL_ARMATURE", - ICON_MOD_ARMATURE, - "Armature", - "Deform stroke points using armature object"}, - {eModifierType_GreasePencilShrinkwrap, - "GREASE_PENCIL_SHRINKWRAP", - ICON_MOD_SHRINKWRAP, - "Shrinkwrap", - "Project the shape onto another object"}, RNA_ENUM_ITEM_HEADING(N_("Physics"), nullptr), {eModifierType_Cloth, "CLOTH", ICON_MOD_CLOTH, "Cloth", ""}, @@ -794,7 +721,7 @@ const EnumPropertyItem rna_enum_subdivision_boundary_smooth_items[] = { # include "DNA_material_types.h" # include "DNA_particle_types.h" -# include "BKE_cachefile.hh" +# include "BKE_cachefile.h" # include "BKE_context.hh" # include "BKE_deform.hh" # include "BKE_material.h" @@ -804,7 +731,6 @@ const EnumPropertyItem rna_enum_subdivision_boundary_smooth_items[] = { # include "BKE_particle.h" # include "BLI_sort_utils.h" -# include "BLI_string_utils.hh" # include "DEG_depsgraph.hh" # include "DEG_depsgraph_build.hh" @@ -941,9 +867,6 @@ RNA_MOD_VGROUP_NAME_SET(WeightVGProximity, mask_defgrp_name); RNA_MOD_VGROUP_NAME_SET(WeightedNormal, defgrp_name); RNA_MOD_VGROUP_NAME_SET(Weld, defgrp_name); RNA_MOD_VGROUP_NAME_SET(Wireframe, defgrp_name); -RNA_MOD_VGROUP_NAME_SET(GreasePencilWeightAngle, target_vgname); -RNA_MOD_VGROUP_NAME_SET(GreasePencilWeightProximity, target_vgname); -RNA_MOD_VGROUP_NAME_SET(GreasePencilLineart, vgname); static void rna_ExplodeModifier_vgroup_get(PointerRNA *ptr, char *value) { @@ -1020,15 +943,6 @@ RNA_MOD_OBJECT_SET(NormalEdit, target, OB_EMPTY); RNA_MOD_OBJECT_SET(Shrinkwrap, target, OB_MESH); RNA_MOD_OBJECT_SET(Shrinkwrap, auxTarget, OB_MESH); RNA_MOD_OBJECT_SET(SurfaceDeform, target, OB_MESH); -RNA_MOD_OBJECT_SET(GreasePencilMirror, object, OB_EMPTY); -RNA_MOD_OBJECT_SET(GreasePencilTint, object, OB_EMPTY); -RNA_MOD_OBJECT_SET(GreasePencilLattice, object, OB_LATTICE); -RNA_MOD_OBJECT_SET(GreasePencilWeightProximity, object, OB_EMPTY); -RNA_MOD_OBJECT_SET(GreasePencilHook, object, OB_EMPTY); -RNA_MOD_OBJECT_SET(GreasePencilArmature, object, OB_ARMATURE); -RNA_MOD_OBJECT_SET(GreasePencilOutline, object, OB_EMPTY); -RNA_MOD_OBJECT_SET(GreasePencilShrinkwrap, target, OB_MESH); -RNA_MOD_OBJECT_SET(GreasePencilShrinkwrap, aux_target, OB_MESH); static void rna_HookModifier_object_set(PointerRNA *ptr, PointerRNA value, @@ -1492,21 +1406,21 @@ static const EnumPropertyItem *rna_DataTransferModifier_layers_select_src_itemf( *r_free = true; return item; } - const Mesh *mesh_eval = BKE_object_get_evaluated_mesh(ob_eval); - if (!mesh_eval) { + const Mesh *me_eval = BKE_object_get_evaluated_mesh(ob_eval); + if (!me_eval) { RNA_enum_item_end(&item, &totitem); *r_free = true; return item; } - num_data = CustomData_number_of_layers(&mesh_eval->corner_data, CD_PROP_FLOAT2); + num_data = CustomData_number_of_layers(&me_eval->corner_data, CD_PROP_FLOAT2); RNA_enum_item_add_separator(&item, &totitem); for (i = 0; i < num_data; i++) { tmp_item.value = i; tmp_item.identifier = tmp_item.name = CustomData_get_layer_name( - &mesh_eval->corner_data, CD_PROP_FLOAT2, i); + &me_eval->corner_data, CD_PROP_FLOAT2, i); RNA_enum_item_add(&item, &totitem, &tmp_item); } } @@ -1844,24 +1758,6 @@ static IDProperty **rna_NodesModifier_properties(PointerRNA *ptr) return &settings->properties; } -static void rna_Lineart_start_level_set(PointerRNA *ptr, int value) -{ - GreasePencilLineartModifierData *lmd = (GreasePencilLineartModifierData *)ptr->data; - - value = std::clamp(value, 0, 128); - lmd->level_start = value; - lmd->level_end = std::max(value, int(lmd->level_end)); -} - -static void rna_Lineart_end_level_set(PointerRNA *ptr, int value) -{ - GreasePencilLineartModifierData *lmd = (GreasePencilLineartModifierData *)ptr->data; - - value = std::clamp(value, 0, 128); - lmd->level_end = value; - lmd->level_start = std::min(value, int(lmd->level_start)); -} - static const NodesModifierData *find_nodes_modifier_by_bake(const Object &object, const NodesModifierBake &bake) { @@ -1958,42 +1854,14 @@ RNA_MOD_GREASE_PENCIL_MATERIAL_FILTER_SET(GreasePencilTint); RNA_MOD_GREASE_PENCIL_MATERIAL_FILTER_SET(GreasePencilSmooth); RNA_MOD_GREASE_PENCIL_MATERIAL_FILTER_SET(GreasePencilNoise); RNA_MOD_GREASE_PENCIL_MATERIAL_FILTER_SET(GreasePencilThick); -RNA_MOD_GREASE_PENCIL_MATERIAL_FILTER_SET(GreasePencilLattice); -RNA_MOD_GREASE_PENCIL_MATERIAL_FILTER_SET(GreasePencilDash); -RNA_MOD_GREASE_PENCIL_MATERIAL_FILTER_SET(GreasePencilMulti); -RNA_MOD_GREASE_PENCIL_MATERIAL_FILTER_SET(GreasePencilLength); -RNA_MOD_GREASE_PENCIL_MATERIAL_FILTER_SET(GreasePencilWeightAngle); -RNA_MOD_GREASE_PENCIL_MATERIAL_FILTER_SET(GreasePencilArray); -RNA_MOD_GREASE_PENCIL_MATERIAL_FILTER_SET(GreasePencilWeightProximity); -RNA_MOD_GREASE_PENCIL_MATERIAL_FILTER_SET(GreasePencilHook); -RNA_MOD_GREASE_PENCIL_MATERIAL_FILTER_SET(GreasePencilEnvelope); -RNA_MOD_GREASE_PENCIL_MATERIAL_FILTER_SET(GreasePencilOutline); -RNA_MOD_GREASE_PENCIL_MATERIAL_FILTER_SET(GreasePencilShrinkwrap); RNA_MOD_GREASE_PENCIL_VERTEX_GROUP_SET(GreasePencilOffset); RNA_MOD_GREASE_PENCIL_VERTEX_GROUP_SET(GreasePencilOpacity); +RNA_MOD_GREASE_PENCIL_VERTEX_GROUP_SET(GreasePencilSubdiv); RNA_MOD_GREASE_PENCIL_VERTEX_GROUP_SET(GreasePencilTint); RNA_MOD_GREASE_PENCIL_VERTEX_GROUP_SET(GreasePencilSmooth); RNA_MOD_GREASE_PENCIL_VERTEX_GROUP_SET(GreasePencilNoise); RNA_MOD_GREASE_PENCIL_VERTEX_GROUP_SET(GreasePencilThick); -RNA_MOD_GREASE_PENCIL_VERTEX_GROUP_SET(GreasePencilLattice); -RNA_MOD_GREASE_PENCIL_VERTEX_GROUP_SET(GreasePencilWeightAngle); -RNA_MOD_GREASE_PENCIL_VERTEX_GROUP_SET(GreasePencilWeightProximity); -RNA_MOD_GREASE_PENCIL_VERTEX_GROUP_SET(GreasePencilHook); -RNA_MOD_GREASE_PENCIL_VERTEX_GROUP_SET(GreasePencilArmature); -RNA_MOD_GREASE_PENCIL_VERTEX_GROUP_SET(GreasePencilEnvelope); -RNA_MOD_GREASE_PENCIL_VERTEX_GROUP_SET(GreasePencilShrinkwrap); - -static void rna_GreasePencilLineartModifier_material_set(PointerRNA *ptr, - PointerRNA value, - ReportList *reports) -{ - GreasePencilLineartModifierData *lmd = reinterpret_cast( - ptr->data); - Material **ma_target = &lmd->target_material; - - rna_GreasePencilModifier_material_set(ptr, value, reports, ma_target); -} static void rna_GreasePencilOpacityModifier_opacity_factor_range( PointerRNA *ptr, float *min, float *max, float *softmin, float *softmax) @@ -2015,196 +1883,26 @@ static void rna_GreasePencilOpacityModifier_opacity_factor_max_set(PointerRNA *p value; } -static const GreasePencilDashModifierData *find_grease_pencil_dash_modifier_of_segment( - const Object &ob, const GreasePencilDashModifierSegment &dash_segment) +static void rna_GreasePencilTintModifier_object_set(PointerRNA *ptr, + PointerRNA value, + ReportList * /*reports*/) { - LISTBASE_FOREACH (const ModifierData *, md, &ob.modifiers) { - if (md->type == eModifierType_GreasePencilDash) { - const auto *dmd = reinterpret_cast(md); - if (dmd->segments().contains_ptr(&dash_segment)) { - return dmd; - } - } - } - return nullptr; + GreasePencilTintModifierData *tmd = static_cast(ptr->data); + Object *ob = static_cast(value.data); + + tmd->object = ob; + id_lib_extern(&ob->id); } -static std::optional rna_GreasePencilDashModifierSegment_path(const PointerRNA *ptr) - +static void rna_GreasePencilMirrorModifier_object_set(PointerRNA *ptr, + PointerRNA value, + ReportList * /*reports*/) { - const Object *ob = reinterpret_cast(ptr->owner_id); - const auto *dash_segment = static_cast(ptr->data); - const GreasePencilDashModifierData *dmd = find_grease_pencil_dash_modifier_of_segment( - *ob, *dash_segment); - BLI_assert(dmd != nullptr); + GreasePencilMirrorModifierData *mmd = static_cast(ptr->data); + Object *ob = static_cast(value.data); - char name_esc[sizeof(dmd->modifier.name) * 2]; - BLI_str_escape(name_esc, dmd->modifier.name, sizeof(name_esc)); - - char ds_name_esc[sizeof(dash_segment->name) * 2]; - BLI_str_escape(ds_name_esc, dash_segment->name, sizeof(ds_name_esc)); - - return fmt::format("modifiers[\"{}\"].segments[\"{}\"]", name_esc, ds_name_esc); -} - -static void rna_GreasePencilDashModifierSegment_name_set(PointerRNA *ptr, const char *value) -{ - const Object *ob = reinterpret_cast(ptr->owner_id); - auto *dash_segment = static_cast(ptr->data); - const GreasePencilDashModifierData *dmd = find_grease_pencil_dash_modifier_of_segment( - *ob, *dash_segment); - BLI_assert(dmd != nullptr); - - const std::string oldname = dash_segment->name; - STRNCPY_UTF8(dash_segment->name, value); - BLI_uniquename_cb( - [dmd, dash_segment](const blender::StringRef name) { - for (const GreasePencilDashModifierSegment &ds : dmd->segments()) { - if (&ds != dash_segment && ds.name == name) { - return true; - } - } - return false; - }, - '.', - dash_segment->name); - - /* Fix all the animation data which may link to this. */ - char name_esc[sizeof(dmd->modifier.name) * 2]; - BLI_str_escape(name_esc, dmd->modifier.name, sizeof(name_esc)); - char rna_path_prefix[36 + sizeof(name_esc) + 1]; - SNPRINTF(rna_path_prefix, "modifiers[\"%s\"].segments", name_esc); - BKE_animdata_fix_paths_rename_all(nullptr, rna_path_prefix, oldname.c_str(), dash_segment->name); -} - -static void rna_GreasePencilDashModifier_segments_begin(CollectionPropertyIterator *iter, - PointerRNA *ptr) -{ - auto *dmd = static_cast(ptr->data); - rna_iterator_array_begin(iter, - dmd->segments_array, - sizeof(GreasePencilDashModifierSegment), - dmd->segments_num, - false, - nullptr); -} - -static const GreasePencilTimeModifierData *find_grease_pencil_time_modifier_of_segment( - const Object &ob, const GreasePencilTimeModifierSegment &time_segment) -{ - LISTBASE_FOREACH (const ModifierData *, md, &ob.modifiers) { - if (md->type == eModifierType_GreasePencilTime) { - const auto *tmd = reinterpret_cast(md); - if (tmd->segments().contains_ptr(&time_segment)) { - return tmd; - } - } - } - return nullptr; -} - -static std::optional rna_GreasePencilTimeModifierSegment_path(const PointerRNA *ptr) - -{ - const Object *ob = reinterpret_cast(ptr->owner_id); - const auto *segment = static_cast(ptr->data); - const GreasePencilTimeModifierData *tmd = find_grease_pencil_time_modifier_of_segment(*ob, - *segment); - BLI_assert(tmd != nullptr); - - char name_esc[sizeof(tmd->modifier.name) * 2]; - BLI_str_escape(name_esc, tmd->modifier.name, sizeof(name_esc)); - - char ds_name_esc[sizeof(segment->name) * 2]; - BLI_str_escape(ds_name_esc, segment->name, sizeof(ds_name_esc)); - - return fmt::format("modifiers[\"{}\"].segments[\"{}\"]", name_esc, ds_name_esc); -} - -static void rna_GreasePencilTimeModifierSegment_name_set(PointerRNA *ptr, const char *value) -{ - const Object *ob = reinterpret_cast(ptr->owner_id); - auto *segment = static_cast(ptr->data); - const GreasePencilTimeModifierData *tmd = find_grease_pencil_time_modifier_of_segment(*ob, - *segment); - BLI_assert(tmd != nullptr); - - const std::string oldname = segment->name; - STRNCPY_UTF8(segment->name, value); - BLI_uniquename_cb( - [tmd, segment](const blender::StringRef name) { - for (const GreasePencilTimeModifierSegment &ds : tmd->segments()) { - if (&ds != segment && ds.name == name) { - return true; - } - } - return false; - }, - '.', - segment->name); - - /* Fix all the animation data which may link to this. */ - char name_esc[sizeof(tmd->modifier.name) * 2]; - BLI_str_escape(name_esc, tmd->modifier.name, sizeof(name_esc)); - char rna_path_prefix[36 + sizeof(name_esc) + 1]; - SNPRINTF(rna_path_prefix, "modifiers[\"%s\"].segments", name_esc); - BKE_animdata_fix_paths_rename_all(nullptr, rna_path_prefix, oldname.c_str(), segment->name); -} - -static void rna_GreasePencilTimeModifier_segments_begin(CollectionPropertyIterator *iter, - PointerRNA *ptr) -{ - auto *tmd = static_cast(ptr->data); - rna_iterator_array_begin(iter, - tmd->segments_array, - sizeof(GreasePencilTimeModifierSegment), - tmd->segments_num, - false, - nullptr); -} - -static void rna_GreasePencilTimeModifier_start_frame_set(PointerRNA *ptr, int value) -{ - auto *tmd = static_cast(ptr->data); - CLAMP(value, MINFRAME, MAXFRAME); - tmd->sfra = value; - - if (tmd->sfra >= tmd->efra) { - tmd->efra = std::min(tmd->sfra, MAXFRAME); - } -} - -static void rna_GreasePencilTimeModifier_end_frame_set(PointerRNA *ptr, int value) -{ - auto *tmd = static_cast(ptr->data); - CLAMP(value, MINFRAME, MAXFRAME); - tmd->efra = value; - - if (tmd->sfra >= tmd->efra) { - tmd->sfra = std::max(tmd->efra, MINFRAME); - } -} - -static void rna_GreasePencilOutlineModifier_outline_material_set(PointerRNA *ptr, - PointerRNA value, - ReportList *reports) -{ - GreasePencilOutlineModifierData *omd = static_cast(ptr->data); - rna_GreasePencilModifier_material_set(ptr, value, reports, &omd->outline_material); -} - -static int rna_GreasePencilShrinkwrapModifier_face_cull_get(PointerRNA *ptr) -{ - const GreasePencilShrinkwrapModifierData *smd = - static_cast(ptr->data); - return smd->shrink_opts & MOD_SHRINKWRAP_CULL_TARGET_MASK; -} - -static void rna_GreasePencilShrinkwrapModifier_face_cull_set(PointerRNA *ptr, int value) -{ - GreasePencilShrinkwrapModifierData *smd = static_cast( - ptr->data); - smd->shrink_opts = (smd->shrink_opts & ~MOD_SHRINKWRAP_CULL_TARGET_MASK) | value; + mmd->object = ob; + id_lib_extern(&ob->id); } #else @@ -3291,16 +2989,12 @@ static void rna_def_modifier_boolean(BlenderRNA *brna) }; static const EnumPropertyItem prop_solver_items[] = { - {eBooleanModifierSolver_Float, + {eBooleanModifierSolver_Fast, "FAST", 0, "Fast", "Simple solver for the best performance, without support for overlapping geometry"}, - {eBooleanModifierSolver_Mesh_Arr, - "EXACT", - 0, - "Exact", - "Advanced solver for the best result"}, + {eBooleanModifierSolver_Exact, "EXACT", 0, "Exact", "Advanced solver for the best result"}, {0, nullptr, 0, nullptr, nullptr}, }; @@ -3367,7 +3061,7 @@ static void rna_def_modifier_boolean(BlenderRNA *brna) prop = RNA_def_property(srna, "solver", PROP_ENUM, PROP_NONE); RNA_def_property_enum_items(prop, prop_solver_items); - RNA_def_property_enum_default(prop, eBooleanModifierSolver_Mesh_Arr); + RNA_def_property_enum_default(prop, eBooleanModifierSolver_Exact); RNA_def_property_ui_text(prop, "Solver", "Method for calculating booleans"); RNA_def_property_update(prop, 0, "rna_Modifier_update"); @@ -8123,6 +7817,7 @@ static void rna_def_modifier_grease_pencil_opacity(BlenderRNA *brna) { StructRNA *srna; PropertyRNA *prop; + static const EnumPropertyItem color_mode_items[] = { {MOD_GREASE_PENCIL_COLOR_BOTH, "BOTH", 0, "Stroke & Fill", "Modify fill and stroke colors"}, {MOD_GREASE_PENCIL_COLOR_STROKE, "STROKE", 0, "Stroke", "Modify stroke color only"}, @@ -8206,6 +7901,8 @@ static void rna_def_modifier_grease_pencil_subdiv(BlenderRNA *brna) rna_def_modifier_grease_pencil_layer_filter(srna); rna_def_modifier_grease_pencil_material_filter( srna, "rna_GreasePencilSubdivModifier_material_filter_set"); + rna_def_modifier_grease_pencil_vertex_group( + srna, "rna_GreasePencilSubdivModifier_vertex_group_name_set"); rna_def_modifier_panel_open_prop(srna, "open_influence_panel", 0); @@ -8370,509 +8067,6 @@ static void rna_def_modifier_grease_pencil_tint(BlenderRNA *brna) RNA_def_property_update(prop, 0, "rna_Modifier_update"); } -static void rna_def_modifier_grease_pencil_lineart(BlenderRNA *brna) -{ - StructRNA *srna; - PropertyRNA *prop; - - static const EnumPropertyItem modifier_lineart_source_type[] = { - {LINEART_SOURCE_COLLECTION, "COLLECTION", 0, "Collection", ""}, - {LINEART_SOURCE_OBJECT, "OBJECT", 0, "Object", ""}, - {LINEART_SOURCE_SCENE, "SCENE", 0, "Scene", ""}, - {0, nullptr, 0, nullptr, nullptr}, - }; - - static const EnumPropertyItem modifier_lineart_shadow_region_filtering[] = { - {LINEART_SHADOW_FILTER_NONE, - "NONE", - 0, - "None", - "Not filtering any lines based on illumination region"}, - {LINEART_SHADOW_FILTER_ILLUMINATED, - "ILLUMINATED", - 0, - "Illuminated", - "Only selecting lines from illuminated regions"}, - {LINEART_SHADOW_FILTER_SHADED, - "SHADED", - 0, - "Shaded", - "Only selecting lines from shaded regions"}, - {LINEART_SHADOW_FILTER_ILLUMINATED_ENCLOSED_SHAPES, - "ILLUMINATED_ENCLOSED", - 0, - "Illuminated (Enclosed Shapes)", - "Selecting lines from lit regions, and make the combination of contour, light contour and " - "shadow lines into enclosed shapes"}, - {0, nullptr, 0, nullptr, nullptr}, - }; - - static const EnumPropertyItem modifier_lineart_silhouette_filtering[] = { - {LINEART_SILHOUETTE_FILTER_NONE, "NONE", 0, "Contour", ""}, - {LINEART_SILHOUETTE_FILTER_GROUP, "GROUP", 0, "Silhouette", ""}, - {LINEART_SILHOUETTE_FILTER_INDIVIDUAL, "INDIVIDUAL", 0, "Individual Silhouette", ""}, - {0, nullptr, 0, nullptr, nullptr}, - }; - - srna = RNA_def_struct(brna, "GreasePencilLineartModifier", "Modifier"); - RNA_def_struct_ui_text( - srna, "Line Art Modifier", "Generate line art strokes from selected source"); - RNA_def_struct_sdna(srna, "GreasePencilLineartModifierData"); - RNA_def_struct_ui_icon(srna, ICON_MOD_LINEART); - - RNA_define_lib_overridable(true); - - prop = RNA_def_property(srna, "use_custom_camera", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, nullptr, "calculation_flags", MOD_LINEART_USE_CUSTOM_CAMERA); - RNA_def_property_ui_text( - prop, "Use Custom Camera", "Use custom camera instead of the active camera"); - RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update"); - - prop = RNA_def_property(srna, "use_fuzzy_intersections", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna( - prop, nullptr, "calculation_flags", MOD_LINEART_INTERSECTION_AS_CONTOUR); - RNA_def_property_ui_text(prop, - "Intersection With Contour", - "Treat intersection and contour lines as if they were the same type so " - "they can be chained together"); - RNA_def_property_update(prop, NC_SCENE, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "use_fuzzy_all", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna( - prop, nullptr, "calculation_flags", MOD_LINEART_EVERYTHING_AS_CONTOUR); - RNA_def_property_ui_text( - prop, "All Lines", "Treat all lines as the same line type so they can be chained together"); - RNA_def_property_update(prop, NC_SCENE, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "use_object_instances", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna( - prop, nullptr, "calculation_flags", MOD_LINEART_ALLOW_DUPLI_OBJECTS); - RNA_def_property_ui_text(prop, - "Instanced Objects", - "Allow particle objects and face/vertex instances to show in line art"); - RNA_def_property_update(prop, NC_SCENE, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "use_edge_overlap", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna( - prop, nullptr, "calculation_flags", MOD_LINEART_ALLOW_OVERLAPPING_EDGES); - RNA_def_property_ui_text( - prop, - "Handle Overlapping Edges", - "Allow edges in the same location (i.e. from edge split) to show properly. May run slower"); - RNA_def_property_update(prop, NC_SCENE, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "use_clip_plane_boundaries", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna( - prop, nullptr, "calculation_flags", MOD_LINEART_ALLOW_CLIPPING_BOUNDARIES); - RNA_def_property_ui_text(prop, - "Clipping Boundaries", - "Allow lines generated by the near/far clipping plane to be shown"); - RNA_def_property_update(prop, NC_SCENE, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "crease_threshold", PROP_FLOAT, PROP_ANGLE); - RNA_def_property_range(prop, 0, DEG2RAD(180.0f)); - RNA_def_property_ui_range(prop, 0.0f, DEG2RAD(180.0f), 0.01f, 1); - RNA_def_property_ui_text(prop, - "Crease Threshold", - "Angles smaller than this will be treated as creases. Crease angle " - "priority: object line art crease override > mesh auto smooth angle > " - "line art default crease"); - RNA_def_property_update(prop, NC_SCENE, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "split_angle", PROP_FLOAT, PROP_ANGLE); - RNA_def_property_float_sdna(prop, nullptr, "angle_splitting_threshold"); - RNA_def_property_ui_text( - prop, "Angle Splitting", "Angle in screen space below which a stroke is split in two"); - /* Don't allow value very close to PI, or we get a lot of small segments. */ - RNA_def_property_ui_range(prop, 0.0f, DEG2RAD(179.5f), 0.01f, 1); - RNA_def_property_range(prop, 0.0f, DEG2RAD(180.0f)); - RNA_def_property_update(prop, NC_SCENE, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "smooth_tolerance", PROP_FLOAT, PROP_NONE); - RNA_def_property_float_sdna(prop, nullptr, "chain_smooth_tolerance"); - RNA_def_property_ui_text( - prop, "Smooth Tolerance", "Strength of smoothing applied on jagged chains"); - RNA_def_property_ui_range(prop, 0.0f, 1.0f, 0.05f, 4); - RNA_def_property_range(prop, 0.0f, 30.0f); - RNA_def_property_update(prop, NC_SCENE, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "use_loose_as_contour", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, nullptr, "calculation_flags", MOD_LINEART_LOOSE_AS_CONTOUR); - RNA_def_property_ui_text(prop, "Loose As Contour", "Loose edges will have contour type"); - RNA_def_property_update(prop, NC_SCENE, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "invert_source_vertex_group", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna( - prop, nullptr, "calculation_flags", MOD_LINEART_INVERT_SOURCE_VGROUP); - RNA_def_property_ui_text(prop, "Invert Vertex Group", "Invert source vertex group values"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "use_output_vertex_group_match_by_name", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna( - prop, nullptr, "calculation_flags", MOD_LINEART_MATCH_OUTPUT_VGROUP); - RNA_def_property_ui_text(prop, "Match Output", "Match output vertex group based on name"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "use_face_mark", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, nullptr, "calculation_flags", MOD_LINEART_FILTER_FACE_MARK); - RNA_def_property_ui_text( - prop, "Filter Face Marks", "Filter feature lines using freestyle face marks"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "use_face_mark_invert", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna( - prop, nullptr, "calculation_flags", MOD_LINEART_FILTER_FACE_MARK_INVERT); - RNA_def_property_ui_text(prop, "Invert", "Invert face mark filtering"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "use_face_mark_boundaries", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna( - prop, nullptr, "calculation_flags", MOD_LINEART_FILTER_FACE_MARK_BOUNDARIES); - RNA_def_property_ui_text( - prop, "Boundaries", "Filter feature lines based on face mark boundaries"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "use_face_mark_keep_contour", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna( - prop, nullptr, "calculation_flags", MOD_LINEART_FILTER_FACE_MARK_KEEP_CONTOUR); - RNA_def_property_ui_text(prop, "Keep Contour", "Preserve contour lines while filtering"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "chaining_image_threshold", PROP_FLOAT, PROP_DISTANCE); - RNA_def_property_ui_text( - prop, - "Image Threshold", - "Segments with an image distance smaller than this will be chained together"); - RNA_def_property_ui_range(prop, 0.0f, 0.3f, 0.001f, 4); - RNA_def_property_range(prop, 0.0f, 0.3f); - RNA_def_property_update(prop, NC_SCENE, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "use_loose_edge_chain", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, nullptr, "calculation_flags", MOD_LINEART_CHAIN_LOOSE_EDGES); - RNA_def_property_ui_text(prop, "Chain Loose Edges", "Allow loose edges to be chained together"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "use_geometry_space_chain", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna( - prop, nullptr, "calculation_flags", MOD_LINEART_CHAIN_GEOMETRY_SPACE); - RNA_def_property_ui_text( - prop, "Use Geometry Space", "Use geometry distance for chaining instead of image space"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "use_detail_preserve", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna( - prop, nullptr, "calculation_flags", MOD_LINEART_CHAIN_PRESERVE_DETAILS); - RNA_def_property_ui_text( - prop, "Preserve Details", "Keep the zig-zag \"noise\" in initial chaining"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "use_overlap_edge_type_support", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna( - prop, nullptr, "calculation_flags", MOD_LINEART_ALLOW_OVERLAP_EDGE_TYPES); - RNA_def_property_ui_text(prop, - "Overlapping Edge Types", - "Allow an edge to have multiple overlapping types. This will create a " - "separate stroke for each overlapping type"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "stroke_depth_offset", PROP_FLOAT, PROP_DISTANCE); - RNA_def_property_ui_text(prop, - "Stroke Depth Offset", - "Move strokes slightly towards the camera to avoid clipping while " - "preserve depth for the viewport"); - RNA_def_property_ui_range(prop, 0.0, 0.5, 0.001, 4); - RNA_def_property_range(prop, -0.1, FLT_MAX); - RNA_def_property_update(prop, NC_SCENE, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "use_offset_towards_custom_camera", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna( - prop, nullptr, "flags", LINEART_GPENCIL_OFFSET_TOWARDS_CUSTOM_CAMERA); - RNA_def_property_ui_text(prop, - "Offset Towards Custom Camera", - "Offset strokes towards selected camera instead of the active camera"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "source_camera", PROP_POINTER, PROP_NONE); - RNA_def_property_flag(prop, PROP_EDITABLE | PROP_ID_SELF_CHECK); - RNA_def_property_struct_type(prop, "Object"); - RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_LIBRARY); - RNA_def_property_ui_text( - prop, "Camera Object", "Use specified camera object for generating line art"); - RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update"); - - prop = RNA_def_property(srna, "light_contour_object", PROP_POINTER, PROP_NONE); - RNA_def_property_flag(prop, PROP_EDITABLE | PROP_ID_SELF_CHECK); - RNA_def_property_struct_type(prop, "Object"); - RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_LIBRARY); - RNA_def_property_ui_text( - prop, "Light Object", "Use this light object to generate light contour"); - RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update"); - - prop = RNA_def_property(srna, "source_type", PROP_ENUM, PROP_NONE); - RNA_def_property_enum_items(prop, modifier_lineart_source_type); - RNA_def_property_ui_text(prop, "Source Type", "Line art stroke source type"); - RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update"); - - prop = RNA_def_property(srna, "source_object", PROP_POINTER, PROP_NONE); - RNA_def_property_flag(prop, PROP_EDITABLE | PROP_ID_SELF_CHECK); - RNA_def_property_struct_type(prop, "Object"); - RNA_def_property_ui_text(prop, "Object", "Generate strokes from this object"); - RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update"); - - prop = RNA_def_property(srna, "source_collection", PROP_POINTER, PROP_NONE); - RNA_def_property_flag(prop, PROP_EDITABLE | PROP_ID_SELF_CHECK); - RNA_def_property_struct_type(prop, "Collection"); - RNA_def_property_ui_text( - prop, "Collection", "Generate strokes from the objects in this collection"); - RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update"); - - /* types */ - prop = RNA_def_property(srna, "use_contour", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, nullptr, "edge_types", MOD_LINEART_EDGE_FLAG_CONTOUR); - RNA_def_property_ui_text(prop, "Use Contour", "Generate strokes from contours lines"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "use_loose", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, nullptr, "edge_types", MOD_LINEART_EDGE_FLAG_LOOSE); - RNA_def_property_ui_text(prop, "Use Loose", "Generate strokes from loose edges"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "use_crease", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, nullptr, "edge_types", MOD_LINEART_EDGE_FLAG_CREASE); - RNA_def_property_ui_text(prop, "Use Crease", "Generate strokes from creased edges"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "use_material", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, nullptr, "edge_types", MOD_LINEART_EDGE_FLAG_MATERIAL); - RNA_def_property_ui_text( - prop, "Use Material", "Generate strokes from borders between materials"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "use_edge_mark", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, nullptr, "edge_types", MOD_LINEART_EDGE_FLAG_EDGE_MARK); - RNA_def_property_ui_text(prop, "Use Edge Mark", "Generate strokes from freestyle marked edges"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "use_intersection", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, nullptr, "edge_types", MOD_LINEART_EDGE_FLAG_INTERSECTION); - RNA_def_property_ui_text(prop, "Use Intersection", "Generate strokes from intersections"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "use_light_contour", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, nullptr, "edge_types", MOD_LINEART_EDGE_FLAG_LIGHT_CONTOUR); - RNA_def_property_ui_text(prop, - "Use Light Contour", - "Generate light/shadow separation lines from a reference light object"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "use_shadow", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna( - prop, nullptr, "edge_types", MOD_LINEART_EDGE_FLAG_PROJECTED_SHADOW); - RNA_def_property_ui_text( - prop, "Use Shadow", "Project contour lines using a light source object"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "shadow_region_filtering", PROP_ENUM, PROP_NONE); - RNA_def_property_enum_sdna(prop, nullptr, "shadow_selection"); - RNA_def_property_enum_items(prop, modifier_lineart_shadow_region_filtering); - RNA_def_property_ui_text(prop, - "Shadow Region Filtering", - "Select feature lines that comes from lit or shaded regions. Will not " - "affect cast shadow and light contour since they are at the border"); - RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update"); - - prop = RNA_def_property(srna, "silhouette_filtering", PROP_ENUM, PROP_NONE); - RNA_def_property_enum_sdna(prop, nullptr, "silhouette_selection"); - RNA_def_property_enum_items(prop, modifier_lineart_silhouette_filtering); - RNA_def_property_ui_text(prop, "Silhouette Filtering", "Select contour or silhouette"); - RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update"); - - prop = RNA_def_property(srna, "use_multiple_levels", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, nullptr, "use_multiple_levels", 0); - RNA_def_property_ui_text( - prop, "Use Occlusion Range", "Generate strokes from a range of occlusion levels"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "level_start", PROP_INT, PROP_NONE); - RNA_def_property_ui_text( - prop, "Level Start", "Minimum number of occlusions for the generated strokes"); - RNA_def_property_range(prop, 0, 128); - RNA_def_property_int_funcs(prop, nullptr, "rna_Lineart_start_level_set", nullptr); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "level_end", PROP_INT, PROP_NONE); - RNA_def_property_ui_text( - prop, "Level End", "Maximum number of occlusions for the generated strokes"); - RNA_def_property_range(prop, 0, 128); - RNA_def_property_int_funcs(prop, nullptr, "rna_Lineart_end_level_set", nullptr); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "target_layer", PROP_STRING, PROP_NONE); - RNA_def_property_ui_text( - prop, "Layer", "Grease Pencil layer to which assign the generated strokes"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "target_material", PROP_POINTER, PROP_NONE); - RNA_def_property_flag(prop, PROP_EDITABLE); - RNA_def_property_struct_type(prop, "Material"); - RNA_def_property_pointer_funcs(prop, - nullptr, - "rna_GreasePencilLineartModifier_material_set", - nullptr, - "rna_GreasePencilModifier_material_poll"); - RNA_def_property_ui_text( - prop, "Material", "Grease Pencil material assigned to the generated strokes"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "source_vertex_group", PROP_STRING, PROP_NONE); - RNA_def_property_ui_text( - prop, - "Source Vertex Group", - "Match the beginning of vertex group names from mesh objects, match all when left empty"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "vertex_group", PROP_STRING, PROP_NONE); - RNA_def_property_string_sdna(prop, nullptr, "vgname"); - RNA_def_property_string_funcs( - prop, nullptr, nullptr, "rna_GreasePencilLineartModifier_vgname_set"); - RNA_def_property_ui_text(prop, "Vertex Group", "Vertex group name for selected strokes"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "is_baked", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, nullptr, "flags", LINEART_GPENCIL_IS_BAKED); - RNA_def_property_ui_text(prop, "Is Baked", "This modifier has baked data"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "use_cache", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, nullptr, "flags", LINEART_GPENCIL_USE_CACHE); - RNA_def_property_ui_text(prop, - "Use Cache", - "Use cached scene data from the first line art modifier in the stack. " - "Certain settings will be unavailable"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "overscan", PROP_FLOAT, PROP_NONE); - RNA_def_property_ui_text( - prop, - "Overscan", - "A margin to prevent strokes from ending abruptly at the edge of the image"); - RNA_def_property_ui_range(prop, 0.0f, 0.5f, 0.01f, 3); - RNA_def_property_range(prop, 0.0f, 0.5f); - RNA_def_property_update(prop, NC_SCENE, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "thickness", PROP_INT, PROP_NONE); - RNA_def_property_ui_text(prop, "Thickness", "The thickness for the generated strokes"); - RNA_def_property_ui_range(prop, 1, 100, 1, 1); - RNA_def_property_range(prop, 1, 200); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "opacity", PROP_FLOAT, PROP_FACTOR); - RNA_def_property_ui_text(prop, "Opacity", "The strength value for the generate strokes"); - RNA_def_property_ui_range(prop, 0.0f, 1.0f, 0.01f, 2); - RNA_def_property_range(prop, 0.0f, 1.0f); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "use_material_mask", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna( - prop, nullptr, "mask_switches", LINEART_GPENCIL_MATERIAL_MASK_ENABLE); - RNA_def_property_ui_text( - prop, "Use Material Mask", "Use material masks to filter out occluded strokes"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "use_material_mask_match", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna( - prop, nullptr, "mask_switches", LINEART_GPENCIL_MATERIAL_MASK_MATCH); - RNA_def_property_ui_text( - prop, "Match Masks", "Require matching all material masks instead of just one"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "use_material_mask_bits", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, nullptr, "material_mask_bits", 1); - RNA_def_property_array(prop, 8); - RNA_def_property_ui_text(prop, "Masks", "Mask bits to match from Material Line Art settings"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "use_intersection_match", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna( - prop, nullptr, "mask_switches", LINEART_GPENCIL_INTERSECTION_MATCH); - RNA_def_property_ui_text( - prop, "Match Intersection", "Require matching all intersection masks instead of just one"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "use_intersection_mask", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, nullptr, "intersection_mask", 1); - RNA_def_property_array(prop, 8); - RNA_def_property_ui_text(prop, "Masks", "Mask bits to match from Collection Line Art settings"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "use_crease_on_smooth", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna( - prop, nullptr, "calculation_flags", MOD_LINEART_USE_CREASE_ON_SMOOTH_SURFACES); - RNA_def_property_ui_text( - prop, "Crease On Smooth Surfaces", "Allow crease edges to show inside smooth surfaces"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "use_crease_on_sharp", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna( - prop, nullptr, "calculation_flags", MOD_LINEART_USE_CREASE_ON_SHARP_EDGES); - RNA_def_property_ui_text(prop, "Crease On Sharp Edges", "Allow crease to show on sharp edges"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "use_image_boundary_trimming", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna( - prop, nullptr, "calculation_flags", MOD_LINEART_USE_IMAGE_BOUNDARY_TRIMMING); - RNA_def_property_ui_text( - prop, - "Image Boundary Trimming", - "Trim all edges right at the boundary of image (including overscan region)"); - - prop = RNA_def_property(srna, "use_back_face_culling", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna( - prop, nullptr, "calculation_flags", MOD_LINEART_USE_BACK_FACE_CULLING); - RNA_def_property_ui_text( - prop, - "Back Face Culling", - "Remove all back faces to speed up calculation, this will create edges in " - "different occlusion levels than when disabled"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "shadow_camera_near", PROP_FLOAT, PROP_NONE); - RNA_def_property_ui_text(prop, "Shadow Camera Near", "Near clipping distance of shadow camera"); - RNA_def_property_ui_range(prop, 0.0f, 500.0f, 0.1f, 2); - RNA_def_property_range(prop, 0.0f, 10000.0f); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "shadow_camera_far", PROP_FLOAT, PROP_NONE); - RNA_def_property_ui_text(prop, "Shadow Camera Far", "Far clipping distance of shadow camera"); - RNA_def_property_ui_range(prop, 0.0f, 500.0f, 0.1f, 2); - RNA_def_property_range(prop, 0.0f, 10000.0f); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "shadow_camera_size", PROP_FLOAT, PROP_NONE); - RNA_def_property_ui_text( - prop, - "Shadow Camera Size", - "Represents the \"Orthographic Scale\" of an orthographic camera. " - "If the camera is positioned at the light's location with this scale, it will " - "represent the coverage of the shadow \"camera\""); - RNA_def_property_ui_range(prop, 0.0f, 500.0f, 0.1f, 2); - RNA_def_property_range(prop, 0.0f, 10000.0f); - - prop = RNA_def_property(srna, "use_invert_collection", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, nullptr, "flags", LINEART_GPENCIL_INVERT_COLLECTION); - RNA_def_property_ui_text(prop, - "Invert Collection Filtering", - "Select everything except lines from specified collection"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "use_invert_silhouette", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, nullptr, "flags", LINEART_GPENCIL_INVERT_SILHOUETTE_FILTER); - RNA_def_property_ui_text(prop, "Invert Silhouette Filtering", "Select anti-silhouette lines"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - RNA_define_lib_overridable(false); -} - static void rna_def_modifier_grease_pencil_smooth(BlenderRNA *brna) { StructRNA *srna; @@ -8977,8 +8171,7 @@ static void rna_def_modifier_grease_pencil_offset(BlenderRNA *brna) rna_def_modifier_grease_pencil_vertex_group( srna, "rna_GreasePencilOffsetModifier_vertex_group_name_set"); - rna_def_modifier_panel_open_prop(srna, "open_general_panel", 0); - rna_def_modifier_panel_open_prop(srna, "open_influence_panel", 1); + rna_def_modifier_panel_open_prop(srna, "open_influence_panel", 0); prop = RNA_def_property(srna, "offset_mode", PROP_ENUM, PROP_NONE); RNA_def_property_enum_items(prop, offset_mode_items); @@ -9134,151 +8327,6 @@ static void rna_def_modifier_grease_pencil_noise(BlenderRNA *brna) RNA_def_property_enum_sdna(prop, nullptr, "noise_mode"); RNA_def_property_enum_items(prop, modifier_noise_random_mode_items); RNA_def_property_ui_text(prop, "Mode", "Where to perform randomization"); - - RNA_define_lib_overridable(false); -} - -static void rna_def_modifier_grease_pencil_length(BlenderRNA *brna) -{ - StructRNA *srna; - PropertyRNA *prop; - static const EnumPropertyItem gpencil_length_mode_items[] = { - {GP_LENGTH_RELATIVE, "RELATIVE", 0, "Relative", "Length in ratio to the stroke's length"}, - {GP_LENGTH_ABSOLUTE, "ABSOLUTE", 0, "Absolute", "Length in geometry space"}, - {0, nullptr, 0, nullptr, nullptr}, - }; - - srna = RNA_def_struct(brna, "GreasePencilLengthModifier", "Modifier"); - RNA_def_struct_ui_text(srna, "Length Modifier", "Stretch or shrink strokes"); - RNA_def_struct_sdna(srna, "GreasePencilLengthModifierData"); - RNA_def_struct_ui_icon(srna, ICON_MOD_LENGTH); - - rna_def_modifier_grease_pencil_layer_filter(srna); - rna_def_modifier_grease_pencil_material_filter( - srna, "rna_GreasePencilLengthModifier_material_filter_set"); - - rna_def_modifier_panel_open_prop(srna, "open_random_panel", 0); - rna_def_modifier_panel_open_prop(srna, "open_curvature_panel", 1); - rna_def_modifier_panel_open_prop(srna, "open_influence_panel", 2); - - RNA_define_lib_overridable(true); - - prop = RNA_def_property(srna, "start_factor", PROP_FLOAT, PROP_NONE); - RNA_def_property_float_sdna(prop, nullptr, "start_fac"); - RNA_def_property_ui_range(prop, -10.0f, 10.0f, 0.1, 2); - RNA_def_property_ui_text( - prop, "Start Factor", "Added length to the start of each stroke relative to its length"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "end_factor", PROP_FLOAT, PROP_NONE); - RNA_def_property_float_sdna(prop, nullptr, "end_fac"); - RNA_def_property_ui_range(prop, -10.0f, 10.0f, 0.1, 2); - RNA_def_property_ui_text( - prop, "End Factor", "Added length to the end of each stroke relative to its length"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "start_length", PROP_FLOAT, PROP_DISTANCE); - RNA_def_property_float_sdna(prop, nullptr, "start_fac"); - RNA_def_property_ui_range(prop, -100.0f, 100.0f, 0.1f, 3); - RNA_def_property_ui_text( - prop, "Start Factor", "Absolute added length to the start of each stroke"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "end_length", PROP_FLOAT, PROP_DISTANCE); - RNA_def_property_float_sdna(prop, nullptr, "end_fac"); - RNA_def_property_ui_range(prop, -100.0f, 100.0f, 0.1f, 3); - RNA_def_property_ui_text(prop, "End Factor", "Absolute added length to the end of each stroke"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "random_start_factor", PROP_FLOAT, PROP_NONE); - RNA_def_property_float_sdna(prop, nullptr, "rand_start_fac"); - RNA_def_property_ui_range(prop, -10.0f, 10.0f, 0.1, 1); - RNA_def_property_ui_text( - prop, "Random Start Factor", "Size of random length added to the start of each stroke"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "random_end_factor", PROP_FLOAT, PROP_NONE); - RNA_def_property_float_sdna(prop, nullptr, "rand_end_fac"); - RNA_def_property_ui_range(prop, -10.0f, 10.0f, 0.1, 1); - RNA_def_property_ui_text( - prop, "Random End Factor", "Size of random length added to the end of each stroke"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "random_offset", PROP_FLOAT, PROP_NONE); - RNA_def_property_float_sdna(prop, nullptr, "rand_offset"); - RNA_def_property_ui_range(prop, 0.0f, 100.0f, 0.1, 3); - RNA_def_property_ui_text( - prop, "Random Noise Offset", "Smoothly offset each stroke's random value"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "use_random", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, nullptr, "flag", GP_LENGTH_USE_RANDOM); - RNA_def_property_ui_text(prop, "Random", "Use random values over time"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "seed", PROP_INT, PROP_UNSIGNED); - RNA_def_property_ui_text(prop, "Seed", "Random seed"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "step", PROP_INT, PROP_NONE); - RNA_def_property_int_sdna(prop, nullptr, "step"); - RNA_def_property_range(prop, 1, 100); - RNA_def_property_ui_text(prop, "Step", "Number of frames between randomization steps"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "overshoot_factor", PROP_FLOAT, PROP_FACTOR); - RNA_def_property_float_sdna(prop, nullptr, "overshoot_fac"); - RNA_def_property_range(prop, 0.0f, 1.0f); - RNA_def_property_ui_text( - prop, - "Used Length", - "Defines what portion of the stroke is used for the calculation of the extension"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "mode", PROP_ENUM, PROP_NONE); - RNA_def_property_enum_sdna(prop, nullptr, "mode"); - RNA_def_property_enum_items(prop, gpencil_length_mode_items); - RNA_def_property_ui_text(prop, "Mode", "Mode to define length"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "use_curvature", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, nullptr, "flag", GP_LENGTH_USE_CURVATURE); - RNA_def_property_ui_text(prop, "Use Curvature", "Follow the curvature of the stroke"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "invert_curvature", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, nullptr, "flag", GP_LENGTH_INVERT_CURVATURE); - RNA_def_property_ui_text( - prop, "Invert Curvature", "Invert the curvature of the stroke's extension"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "point_density", PROP_FLOAT, PROP_NONE); - RNA_def_property_range(prop, 0.1f, 1000.0f); - RNA_def_property_ui_range(prop, 0.1f, 1000.0f, 1.0f, 1); - RNA_def_property_ui_scale_type(prop, PROP_SCALE_CUBIC); - RNA_def_property_ui_text( - prop, "Point Density", "Multiplied by Start/End for the total added point count"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "segment_influence", PROP_FLOAT, PROP_FACTOR); - RNA_def_property_range(prop, -2.0f, 3.0f); - RNA_def_property_ui_range(prop, 0.0f, 1.0f, 0.1f, 2); - RNA_def_property_ui_text(prop, - "Segment Influence", - "Factor to determine how much the length of the individual segments " - "should influence the final computed curvature. Higher factors makes " - "small segments influence the overall curvature less"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "max_angle", PROP_FLOAT, PROP_ANGLE); - RNA_def_property_ui_text(prop, - "Filter Angle", - "Ignore points on the stroke that deviate from their neighbors by more " - "than this angle when determining the extrapolation shape"); - RNA_def_property_range(prop, 0.0f, DEG2RAD(180.0f)); - RNA_def_property_ui_range(prop, 0.0f, DEG2RAD(179.5f), 10.0f, 1); - RNA_def_property_update(prop, NC_SCENE, "rna_Modifier_update"); - RNA_define_lib_overridable(false); } @@ -9373,1077 +8421,6 @@ static void rna_def_modifier_grease_pencil_thickness(BlenderRNA *brna) RNA_define_lib_overridable(false); } -static void rna_def_modifier_grease_pencil_array(BlenderRNA *brna) -{ - StructRNA *srna; - PropertyRNA *prop; - - srna = RNA_def_struct(brna, "GreasePencilArrayModifier", "Modifier"); - RNA_def_struct_ui_text(srna, "Instance Modifier", "Create grid of duplicate instances"); - RNA_def_struct_sdna(srna, "GreasePencilArrayModifierData"); - RNA_def_struct_ui_icon(srna, ICON_MOD_ARRAY); - - rna_def_modifier_grease_pencil_layer_filter(srna); - rna_def_modifier_grease_pencil_material_filter( - srna, "rna_GreasePencilArrayModifier_material_filter_set"); - - rna_def_modifier_panel_open_prop(srna, "open_constant_offset_panel", 0); - rna_def_modifier_panel_open_prop(srna, "open_relative_offset_panel", 1); - rna_def_modifier_panel_open_prop(srna, "open_object_offset_panel", 2); - rna_def_modifier_panel_open_prop(srna, "open_randomize_panel", 3); - rna_def_modifier_panel_open_prop(srna, "open_influence_panel", 4); - - RNA_define_lib_overridable(true); - - prop = RNA_def_property(srna, "count", PROP_INT, PROP_NONE); - RNA_def_property_range(prop, 1, SHRT_MAX); - RNA_def_property_ui_range(prop, 1, 50, 1, -1); - RNA_def_property_ui_text(prop, "Count", "Number of items"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - /* Offset parameters */ - prop = RNA_def_property(srna, "offset_object", PROP_POINTER, PROP_NONE); - RNA_def_property_pointer_sdna(prop, nullptr, "object"); - RNA_def_property_ui_text( - prop, - "Offset Object", - "Use the location and rotation of another object to determine the distance and " - "rotational change between arrayed items"); - RNA_def_property_flag(prop, PROP_EDITABLE | PROP_ID_SELF_CHECK); - RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update"); - - prop = RNA_def_property(srna, "constant_offset", PROP_FLOAT, PROP_TRANSLATION); - RNA_def_property_float_sdna(prop, nullptr, "offset"); - RNA_def_property_ui_text(prop, "Constant Offset", "Value for the distance between items"); - RNA_def_property_ui_range(prop, -FLT_MAX, FLT_MAX, 1, RNA_TRANSLATION_PREC_DEFAULT); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "relative_offset", PROP_FLOAT, PROP_XYZ); - RNA_def_property_float_sdna(prop, nullptr, "shift"); - RNA_def_property_ui_text( - prop, - "Relative Offset", - "The size of the geometry will determine the distance between arrayed items"); - RNA_def_property_ui_range(prop, -FLT_MAX, FLT_MAX, 1, RNA_TRANSLATION_PREC_DEFAULT); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "random_offset", PROP_FLOAT, PROP_XYZ); - RNA_def_property_float_sdna(prop, nullptr, "rnd_offset"); - RNA_def_property_ui_text(prop, "Random Offset", "Value for changes in location"); - RNA_def_property_ui_range(prop, -FLT_MAX, FLT_MAX, 1, RNA_TRANSLATION_PREC_DEFAULT); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "random_rotation", PROP_FLOAT, PROP_EULER); - RNA_def_property_float_sdna(prop, nullptr, "rnd_rot"); - RNA_def_property_ui_text(prop, "Random Rotation", "Value for changes in rotation"); - RNA_def_property_ui_range(prop, -FLT_MAX, FLT_MAX, 100, RNA_TRANSLATION_PREC_DEFAULT); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "random_scale", PROP_FLOAT, PROP_XYZ); - RNA_def_property_float_sdna(prop, nullptr, "rnd_scale"); - RNA_def_property_ui_text(prop, "Scale", "Value for changes in scale"); - RNA_def_property_ui_range(prop, -FLT_MAX, FLT_MAX, 1, RNA_TRANSLATION_PREC_DEFAULT); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "seed", PROP_INT, PROP_UNSIGNED); - RNA_def_property_ui_text(prop, "Seed", "Random seed"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "replace_material", PROP_INT, PROP_NONE); - RNA_def_property_int_sdna(prop, nullptr, "mat_rpl"); - RNA_def_property_range(prop, 0, SHRT_MAX); - RNA_def_property_ui_text( - prop, - "Material", - "Index of the material used for generated strokes (0 keep original material)"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "use_constant_offset", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, nullptr, "flag", MOD_GREASE_PENCIL_ARRAY_USE_OFFSET); - RNA_def_property_ui_text(prop, "Offset", "Enable offset"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "use_object_offset", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, nullptr, "flag", MOD_GREASE_PENCIL_ARRAY_USE_OB_OFFSET); - RNA_def_property_ui_text(prop, "Use Object Offset", "Enable object offset"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "use_relative_offset", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, nullptr, "flag", MOD_GREASE_PENCIL_ARRAY_USE_RELATIVE); - RNA_def_property_ui_text(prop, "Shift", "Enable shift"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "use_uniform_random_scale", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna( - prop, nullptr, "flag", MOD_GREASE_PENCIL_ARRAY_UNIFORM_RANDOM_SCALE); - RNA_def_property_ui_text( - prop, "Uniform Scale", "Use the same random seed for each scale axis for a uniform scale"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - RNA_define_lib_overridable(false); -} - -static void rna_def_modifier_grease_pencil_lattice(BlenderRNA *brna) -{ - StructRNA *srna; - PropertyRNA *prop; - - srna = RNA_def_struct(brna, "GreasePencilLatticeModifier", "Modifier"); - RNA_def_struct_ui_text( - srna, "Grease Pencil Lattice Modifier", "Deform strokes using a lattice object"); - RNA_def_struct_sdna(srna, "GreasePencilLatticeModifierData"); - RNA_def_struct_ui_icon(srna, ICON_MOD_LATTICE); - - rna_def_modifier_grease_pencil_layer_filter(srna); - rna_def_modifier_grease_pencil_material_filter( - srna, "rna_GreasePencilLatticeModifier_material_filter_set"); - rna_def_modifier_grease_pencil_vertex_group( - srna, "rna_GreasePencilLatticeModifier_vertex_group_name_set"); - - rna_def_modifier_panel_open_prop(srna, "open_influence_panel", 0); - - RNA_define_lib_overridable(true); - - prop = RNA_def_property(srna, "object", PROP_POINTER, PROP_NONE); - RNA_def_property_ui_text(prop, "Object", "Lattice object to deform with"); - RNA_def_property_pointer_funcs(prop, - nullptr, - "rna_GreasePencilLatticeModifier_object_set", - nullptr, - "rna_Lattice_object_poll"); - RNA_def_property_flag(prop, PROP_EDITABLE | PROP_ID_SELF_CHECK); - RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update"); - - prop = RNA_def_property(srna, "strength", PROP_FLOAT, PROP_NONE); - RNA_def_property_range(prop, -FLT_MAX, FLT_MAX); - RNA_def_property_ui_range(prop, 0, 1, 10, 2); - RNA_def_property_ui_text(prop, "Strength", "Strength of modifier effect"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - RNA_define_lib_overridable(false); -} - -static void rna_def_modifier_grease_pencil_dash_segment(BlenderRNA *brna) -{ - StructRNA *srna; - PropertyRNA *prop; - - srna = RNA_def_struct(brna, "GreasePencilDashModifierSegment", nullptr); - RNA_def_struct_ui_text(srna, "Dash Modifier Segment", "Configuration for a single dash segment"); - RNA_def_struct_sdna(srna, "GreasePencilDashModifierSegment"); - RNA_def_struct_path_func(srna, "rna_GreasePencilDashModifierSegment_path"); - - prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE); - RNA_def_property_ui_text(prop, "Name", "Name of the dash segment"); - RNA_def_property_string_funcs( - prop, nullptr, nullptr, "rna_GreasePencilDashModifierSegment_name_set"); - RNA_def_struct_name_property(srna, prop); - RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER | NA_RENAME, nullptr); - - prop = RNA_def_property(srna, "dash", PROP_INT, PROP_NONE); - RNA_def_property_range(prop, 1, INT16_MAX); - RNA_def_property_ui_text( - prop, - "Dash", - "The number of consecutive points from the original stroke to include in this segment"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "gap", PROP_INT, PROP_NONE); - RNA_def_property_range(prop, 0, INT16_MAX); - RNA_def_property_ui_text(prop, "Gap", "The number of points skipped after this segment"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "radius", PROP_FLOAT, PROP_FACTOR | PROP_UNSIGNED); - RNA_def_property_ui_range(prop, 0, 1, 0.1, 2); - RNA_def_property_ui_text( - prop, "Radius", "The factor to apply to the original point's radius for the new points"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "opacity", PROP_FLOAT, PROP_FACTOR); - RNA_def_property_ui_range(prop, 0, 1, 0.1, 2); - RNA_def_property_ui_text( - prop, "Opacity", "The factor to apply to the original point's opacity for the new points"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "material_index", PROP_INT, PROP_NONE); - RNA_def_property_int_sdna(prop, nullptr, "mat_nr"); - RNA_def_property_range(prop, -1, INT16_MAX); - RNA_def_property_ui_text( - prop, - "Material Index", - "Use this index on generated segment. -1 means using the existing material"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "use_cyclic", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, nullptr, "flag", MOD_GREASE_PENCIL_DASH_USE_CYCLIC); - RNA_def_property_ui_text(prop, "Cyclic", "Enable cyclic on individual stroke dashes"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); -} - -static void rna_def_modifier_grease_pencil_dash(BlenderRNA *brna) -{ - StructRNA *srna; - PropertyRNA *prop; - - srna = RNA_def_struct(brna, "GreasePencilDashModifierData", "Modifier"); - RNA_def_struct_ui_text( - srna, "Grease Pencil Dash Modifier", "Create dot-dash effect for strokes"); - RNA_def_struct_sdna(srna, "GreasePencilDashModifierData"); - RNA_def_struct_ui_icon(srna, ICON_MOD_DASH); - - rna_def_modifier_grease_pencil_layer_filter(srna); - rna_def_modifier_grease_pencil_material_filter( - srna, "rna_GreasePencilDashModifier_material_filter_set"); - - rna_def_modifier_panel_open_prop(srna, "open_influence_panel", 0); - - RNA_define_lib_overridable(true); - - prop = RNA_def_property(srna, "segments", PROP_COLLECTION, PROP_NONE); - RNA_def_property_struct_type(prop, "GreasePencilDashModifierSegment"); - RNA_def_property_collection_sdna(prop, nullptr, "segments_array", nullptr); - RNA_def_property_collection_funcs(prop, - "rna_GreasePencilDashModifier_segments_begin", - "rna_iterator_array_next", - "rna_iterator_array_end", - "rna_iterator_array_get", - nullptr, - nullptr, - nullptr, - nullptr); - RNA_def_property_ui_text(prop, "Segments", ""); - - prop = RNA_def_property(srna, "segment_active_index", PROP_INT, PROP_UNSIGNED); - RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); - RNA_def_property_ui_text(prop, "Active Dash Segment Index", "Active index in the segment list"); - - prop = RNA_def_property(srna, "dash_offset", PROP_INT, PROP_NONE); - RNA_def_property_ui_text( - prop, - "Offset", - "Offset into each stroke before the beginning of the dashed segment generation"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - RNA_define_lib_overridable(false); -} - -static void rna_def_modifier_grease_pencil_weight_angle(BlenderRNA *brna) -{ - StructRNA *srna; - PropertyRNA *prop; - - static const EnumPropertyItem axis_items[] = { - {0, "X", 0, "X", ""}, - {1, "Y", 0, "Y", ""}, - {2, "Z", 0, "Z", ""}, - {0, nullptr, 0, nullptr, nullptr}, - }; - - static const EnumPropertyItem space_items[] = { - {MOD_GREASE_PENCIL_WEIGHT_ANGLE_SPACE_LOCAL, "LOCAL", 0, "Local Space", ""}, - {MOD_GREASE_PENCIL_WEIGHT_ANGLE_SPACE_WORLD, "WORLD", 0, "World Space", ""}, - {0, nullptr, 0, nullptr, nullptr}, - }; - - srna = RNA_def_struct(brna, "GreasePencilWeightAngleModifier", "Modifier"); - RNA_def_struct_ui_text(srna, "Weight Modifier Angle", "Calculate Vertex Weight dynamically"); - RNA_def_struct_sdna(srna, "GreasePencilWeightAngleModifierData"); - RNA_def_struct_ui_icon(srna, ICON_MOD_VERTEX_WEIGHT); - - rna_def_modifier_grease_pencil_layer_filter(srna); - rna_def_modifier_grease_pencil_material_filter( - srna, "rna_GreasePencilWeightAngleModifier_material_filter_set"); - rna_def_modifier_grease_pencil_vertex_group( - srna, "rna_GreasePencilWeightAngleModifier_vertex_group_name_set"); - - rna_def_modifier_panel_open_prop(srna, "open_influence_panel", 0); - - RNA_define_lib_overridable(true); - - prop = RNA_def_property(srna, "target_vertex_group", PROP_STRING, PROP_NONE); - RNA_def_property_string_sdna(prop, nullptr, "target_vgname"); - RNA_def_property_ui_text(prop, "Vertex Group", "Output Vertex group"); - RNA_def_property_string_funcs( - prop, nullptr, nullptr, "rna_GreasePencilWeightAngleModifier_target_vgname_set"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "use_multiply", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, nullptr, "flag", GP_WEIGHT_MULTIPLY_DATA); - RNA_def_property_ui_text( - prop, - "Multiply Weights", - "Multiply the calculated weights with the existing values in the vertex group"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "use_invert_output", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, nullptr, "flag", GP_WEIGHT_INVERT_OUTPUT); - RNA_def_property_ui_text(prop, "Invert", "Invert output weight values"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "angle", PROP_FLOAT, PROP_ANGLE); - RNA_def_property_float_sdna(prop, nullptr, "angle"); - RNA_def_property_ui_text(prop, "Angle", "Angle"); - RNA_def_property_range(prop, 0.0f, DEG2RAD(180.0f)); - RNA_def_property_update(prop, NC_SCENE, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "axis", PROP_ENUM, PROP_NONE); - RNA_def_property_enum_sdna(prop, nullptr, "axis"); - RNA_def_property_enum_items(prop, axis_items); - RNA_def_property_ui_text(prop, "Axis", ""); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "space", PROP_ENUM, PROP_NONE); - RNA_def_property_enum_sdna(prop, nullptr, "space"); - RNA_def_property_enum_items(prop, space_items); - RNA_def_property_ui_text(prop, "Space", "Coordinates space"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "minimum_weight", PROP_FLOAT, PROP_FACTOR); - RNA_def_property_float_sdna(prop, nullptr, "min_weight"); - RNA_def_property_ui_text(prop, "Minimum", "Minimum value for vertex weight"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - RNA_define_lib_overridable(false); -} - -static void rna_def_modifier_grease_pencil_multiply(BlenderRNA *brna) -{ - StructRNA *srna; - PropertyRNA *prop; - - srna = RNA_def_struct(brna, "GreasePencilMultiplyModifier", "Modifier"); - RNA_def_struct_ui_text(srna, "Multiply Modifier", "Generate multiple strokes from one stroke"); - RNA_def_struct_sdna(srna, "GreasePencilMultiModifierData"); - RNA_def_struct_ui_icon(srna, ICON_GP_MULTIFRAME_EDITING); - - rna_def_modifier_grease_pencil_layer_filter(srna); - rna_def_modifier_grease_pencil_material_filter( - srna, "rna_GreasePencilMultiModifier_material_filter_set"); - - rna_def_modifier_panel_open_prop(srna, "open_fading_panel", 1); - rna_def_modifier_panel_open_prop(srna, "open_influence_panel", 0); - - RNA_define_lib_overridable(true); - - prop = RNA_def_property(srna, "use_fade", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, nullptr, "flag", MOD_GREASE_PENCIL_MULTIPLY_ENABLE_FADING); - RNA_def_property_ui_text(prop, "Fade", "Fade the stroke thickness for each generated stroke"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "duplicates", PROP_INT, PROP_NONE); - RNA_def_property_int_sdna(prop, nullptr, "duplications"); - RNA_def_property_range(prop, 0, 999); - RNA_def_property_ui_range(prop, 1, 10, 1, 1); - RNA_def_property_ui_text(prop, "duplicates", "How many copies of strokes be displayed"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "distance", PROP_FLOAT, PROP_DISTANCE); - RNA_def_property_range(prop, -FLT_MAX, FLT_MAX); - RNA_def_property_ui_range(prop, 0.0, 1.0, 0.01, 3); - RNA_def_property_ui_text(prop, "Distance", "Distance of duplications"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "offset", PROP_FLOAT, PROP_NONE); - RNA_def_property_ui_range(prop, -1, 1, 0.01, 3); - RNA_def_property_ui_text(prop, "Offset", "Offset of duplicates. -1 to 1: inner to outer"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "fading_thickness", PROP_FLOAT, PROP_NONE); - RNA_def_property_range(prop, 0, 1); - RNA_def_property_ui_text(prop, "Thickness", "Fade influence of stroke's thickness"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "fading_opacity", PROP_FLOAT, PROP_NONE); - RNA_def_property_range(prop, 0, 1); - RNA_def_property_ui_text(prop, "Opacity", "Fade influence of stroke's opacity"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "fading_center", PROP_FLOAT, PROP_FACTOR); - RNA_def_property_range(prop, 0, 1); - RNA_def_property_ui_text(prop, "Center", "Fade center"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - RNA_define_lib_overridable(false); -} - -static void rna_def_modifier_grease_pencil_hook(BlenderRNA *brna) -{ - StructRNA *srna; - PropertyRNA *prop; - - static const EnumPropertyItem hook_falloff_items[] = { - {MOD_GREASE_PENCIL_HOOK_Falloff_None, "NONE", 0, "No Falloff", ""}, - {MOD_GREASE_PENCIL_HOOK_Falloff_Curve, "CURVE", 0, "Curve", ""}, - {MOD_GREASE_PENCIL_HOOK_Falloff_Smooth, "SMOOTH", ICON_SMOOTHCURVE, "Smooth", ""}, - {MOD_GREASE_PENCIL_HOOK_Falloff_Sphere, "SPHERE", ICON_SPHERECURVE, "Sphere", ""}, - {MOD_GREASE_PENCIL_HOOK_Falloff_Root, "ROOT", ICON_ROOTCURVE, "Root", ""}, - {MOD_GREASE_PENCIL_HOOK_Falloff_InvSquare, - "INVERSE_SQUARE", - ICON_ROOTCURVE, - "Inverse Square", - ""}, - {MOD_GREASE_PENCIL_HOOK_Falloff_Sharp, "SHARP", ICON_SHARPCURVE, "Sharp", ""}, - {MOD_GREASE_PENCIL_HOOK_Falloff_Linear, "LINEAR", ICON_LINCURVE, "Linear", ""}, - {MOD_GREASE_PENCIL_HOOK_Falloff_Const, "CONSTANT", ICON_NOCURVE, "Constant", ""}, - {0, nullptr, 0, nullptr, nullptr}, - }; - - srna = RNA_def_struct(brna, "GreasePencilHookModifier", "Modifier"); - RNA_def_struct_ui_text( - srna, "Hook Modifier", "Hook modifier to modify the location of stroke points"); - RNA_def_struct_sdna(srna, "GreasePencilHookModifierData"); - RNA_def_struct_ui_icon(srna, ICON_HOOK); - - rna_def_modifier_grease_pencil_layer_filter(srna); - rna_def_modifier_grease_pencil_material_filter( - srna, "rna_GreasePencilHookModifier_material_filter_set"); - rna_def_modifier_grease_pencil_vertex_group( - srna, "rna_GreasePencilHookModifier_vertex_group_name_set"); - rna_def_modifier_grease_pencil_custom_curve(srna); - - rna_def_modifier_panel_open_prop(srna, "open_influence_panel", 0); - rna_def_modifier_panel_open_prop(srna, "open_falloff_panel", 1); - - RNA_define_lib_overridable(true); - - prop = RNA_def_property(srna, "object", PROP_POINTER, PROP_NONE); - RNA_def_property_ui_text( - prop, "Object", "Parent Object for hook, also recalculates and clears offset"); - RNA_def_property_flag(prop, PROP_EDITABLE | PROP_ID_SELF_CHECK); - RNA_def_property_pointer_funcs( - prop, nullptr, "rna_GreasePencilHookModifier_object_set", nullptr, nullptr); - RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update"); - - prop = RNA_def_property(srna, "subtarget", PROP_STRING, PROP_NONE); - RNA_def_property_string_sdna(prop, nullptr, "subtarget"); - RNA_def_property_ui_text( - prop, - "Sub-Target", - "Name of Parent Bone for hook (if applicable), also recalculates and clears offset"); - RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update"); - - prop = RNA_def_property(srna, "strength", PROP_FLOAT, PROP_NONE); - RNA_def_property_float_sdna(prop, nullptr, "force"); - RNA_def_property_range(prop, 0, 1); - RNA_def_property_ui_text(prop, "Strength", "Relative force of the hook"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "falloff_type", PROP_ENUM, PROP_NONE); - RNA_def_property_enum_items(prop, hook_falloff_items); /* share the enum */ - RNA_def_property_ui_text(prop, "Falloff Type", ""); - RNA_def_property_translation_context(prop, - BLT_I18NCONTEXT_ID_CURVE_LEGACY); /* Abusing id_curve :/ */ - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "falloff_radius", PROP_FLOAT, PROP_DISTANCE); - RNA_def_property_float_sdna(prop, nullptr, "falloff"); - RNA_def_property_range(prop, 0, FLT_MAX); - RNA_def_property_ui_range(prop, 0, 100, 100, 2); - RNA_def_property_ui_text( - prop, "Radius", "If not zero, the distance from the hook where influence ends"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "center", PROP_FLOAT, PROP_NONE); - RNA_def_property_float_sdna(prop, nullptr, "cent"); - RNA_def_property_ui_text(prop, "Hook Center", ""); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "matrix_inverse", PROP_FLOAT, PROP_MATRIX); - RNA_def_property_float_sdna(prop, nullptr, "parentinv"); - RNA_def_property_multi_array(prop, 2, rna_matrix_dimsize_4x4); - RNA_def_property_ui_text( - prop, "Matrix", "Reverse the transformation between this object and its target"); - RNA_def_property_update(prop, NC_OBJECT | ND_TRANSFORM, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "use_falloff_uniform", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, nullptr, "flag", MOD_GREASE_PENCIL_HOOK_UNIFORM_SPACE); - RNA_def_property_ui_text(prop, "Uniform Falloff", "Compensate for non-uniform object scale"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - RNA_define_lib_overridable(false); -} - -static void rna_def_modifier_grease_pencil_weight_proximity(BlenderRNA *brna) -{ - StructRNA *srna; - PropertyRNA *prop; - - srna = RNA_def_struct(brna, "GreasePencilWeightProximityModifier", "Modifier"); - RNA_def_struct_ui_text(srna, "Weight Modifier Proximity", "Calculate Vertex Weight dynamically"); - RNA_def_struct_sdna(srna, "GreasePencilWeightProximityModifierData"); - RNA_def_struct_ui_icon(srna, ICON_MOD_VERTEX_WEIGHT); - - rna_def_modifier_grease_pencil_layer_filter(srna); - rna_def_modifier_grease_pencil_material_filter( - srna, "rna_GreasePencilWeightProximityModifier_material_filter_set"); - rna_def_modifier_grease_pencil_vertex_group( - srna, "rna_GreasePencilWeightProximityModifier_vertex_group_name_set"); - - rna_def_modifier_panel_open_prop(srna, "open_influence_panel", 0); - - RNA_define_lib_overridable(true); - - prop = RNA_def_property(srna, "use_multiply", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna( - prop, nullptr, "flag", MOD_GREASE_PENCIL_WEIGHT_PROXIMITY_MULTIPLY_DATA); - RNA_def_property_ui_text( - prop, - "Multiply Weights", - "Multiply the calculated weights with the existing values in the vertex group"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "use_invert_output", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna( - prop, nullptr, "flag", MOD_GREASE_PENCIL_WEIGHT_PROXIMITY_INVERT_OUTPUT); - RNA_def_property_ui_text(prop, "Invert", "Invert output weight values"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "target_vertex_group", PROP_STRING, PROP_NONE); - RNA_def_property_string_sdna(prop, nullptr, "target_vgname"); - RNA_def_property_ui_text(prop, "Vertex Group", "Output Vertex group"); - RNA_def_property_string_funcs( - prop, nullptr, nullptr, "rna_GreasePencilWeightProximityModifier_target_vgname_set"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - /* Distance reference object */ - prop = RNA_def_property(srna, "object", PROP_POINTER, PROP_NONE); - RNA_def_property_ui_text(prop, "Target Object", "Object used as distance reference"); - RNA_def_property_pointer_funcs( - prop, nullptr, "rna_GreasePencilWeightProximityModifier_object_set", nullptr, nullptr); - RNA_def_property_flag(prop, PROP_EDITABLE | PROP_ID_SELF_CHECK); - RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update"); - - prop = RNA_def_property(srna, "distance_start", PROP_FLOAT, PROP_DISTANCE); - RNA_def_property_float_sdna(prop, nullptr, "dist_start"); - RNA_def_property_range(prop, 0.0, FLT_MAX); - RNA_def_property_ui_range(prop, 0.0, 1000.0, 1.0, 2); - RNA_def_property_ui_text(prop, "Lowest", "Distance mapping to 0.0 weight"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "minimum_weight", PROP_FLOAT, PROP_FACTOR); - RNA_def_property_float_sdna(prop, nullptr, "min_weight"); - RNA_def_property_ui_text(prop, "Minimum", "Minimum value for vertex weight"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "distance_end", PROP_FLOAT, PROP_DISTANCE); - RNA_def_property_float_sdna(prop, nullptr, "dist_end"); - RNA_def_property_range(prop, 0.0, FLT_MAX); - RNA_def_property_ui_range(prop, 0.0, 1000.0, 1.0, 2); - RNA_def_property_ui_text(prop, "Highest", "Distance mapping to 1.0 weight"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - RNA_define_lib_overridable(false); -} - -static void rna_def_modifier_grease_pencil_armature(BlenderRNA *brna) -{ - StructRNA *srna; - PropertyRNA *prop; - - srna = RNA_def_struct(brna, "GreasePencilArmatureModifier", "Modifier"); - RNA_def_struct_ui_text(srna, "Armature Modifier", "Deform stroke points using armature object"); - RNA_def_struct_sdna(srna, "GreasePencilArmatureModifierData"); - RNA_def_struct_ui_icon(srna, ICON_MOD_ARMATURE); - - rna_def_modifier_grease_pencil_vertex_group( - srna, "rna_GreasePencilArmatureModifier_vertex_group_name_set"); - - rna_def_modifier_panel_open_prop(srna, "open_influence_panel", 0); - - RNA_define_lib_overridable(true); - - prop = RNA_def_property(srna, "object", PROP_POINTER, PROP_NONE); - RNA_def_property_ui_text(prop, "Object", "Armature object to deform with"); - RNA_def_property_pointer_funcs(prop, - nullptr, - "rna_GreasePencilArmatureModifier_object_set", - nullptr, - "rna_Armature_object_poll"); - RNA_def_property_flag(prop, PROP_EDITABLE | PROP_ID_SELF_CHECK); - RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update"); - - prop = RNA_def_property(srna, "use_bone_envelopes", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, nullptr, "deformflag", ARM_DEF_ENVELOPE); - RNA_def_property_ui_text(prop, "Use Bone Envelopes", "Bind Bone envelopes to armature modifier"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "use_vertex_groups", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, nullptr, "deformflag", ARM_DEF_VGROUP); - RNA_def_property_ui_text(prop, "Use Vertex Groups", "Bind vertex groups to armature modifier"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "use_deform_preserve_volume", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, nullptr, "deformflag", ARM_DEF_QUATERNION); - RNA_def_property_ui_text( - prop, "Preserve Volume", "Deform rotation interpolation with quaternions"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - RNA_define_lib_overridable(false); -} - -static void rna_def_modifier_grease_pencil_time_segment(BlenderRNA *brna) -{ - StructRNA *srna; - PropertyRNA *prop; - - static const EnumPropertyItem segment_mode_items[] = { - {MOD_GREASE_PENCIL_TIME_SEG_MODE_NORMAL, - "NORMAL", - 0, - "Regular", - "Apply offset in usual animation direction"}, - {MOD_GREASE_PENCIL_TIME_SEG_MODE_REVERSE, - "REVERSE", - 0, - "Reverse", - "Apply offset in reverse animation direction"}, - {MOD_GREASE_PENCIL_TIME_SEG_MODE_PINGPONG, - "PINGPONG", - 0, - "Ping Pong", - "Loop back and forth"}, - {0, nullptr, 0, nullptr, nullptr}, - }; - - srna = RNA_def_struct(brna, "GreasePencilTimeModifierSegment", nullptr); - RNA_def_struct_ui_text(srna, "Time Modifier Segment", "Configuration for a single dash segment"); - RNA_def_struct_sdna(srna, "GreasePencilTimeModifierSegment"); - RNA_def_struct_path_func(srna, "rna_GreasePencilTimeModifierSegment_path"); - - prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE); - RNA_def_property_ui_text(prop, "Name", "Name of the dash segment"); - RNA_def_property_string_funcs( - prop, nullptr, nullptr, "rna_GreasePencilTimeModifierSegment_name_set"); - RNA_def_struct_name_property(srna, prop); - RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER | NA_RENAME, nullptr); - - prop = RNA_def_property(srna, "segment_start", PROP_INT, PROP_NONE); - RNA_def_property_range(prop, 0, INT16_MAX); - RNA_def_property_ui_text(prop, "Frame Start", "First frame of the segment"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "segment_end", PROP_INT, PROP_NONE); - RNA_def_property_range(prop, 0, INT16_MAX); - RNA_def_property_ui_text(prop, "End", "Last frame of the segment"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "segment_repeat", PROP_INT, PROP_NONE); - RNA_def_property_range(prop, 1, INT16_MAX); - RNA_def_property_ui_text(prop, "Repeat", "Number of cycle repeats"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "segment_mode", PROP_ENUM, PROP_NONE); - RNA_def_property_enum_sdna(prop, nullptr, "segment_mode"); - RNA_def_property_enum_items(prop, segment_mode_items); - RNA_def_property_ui_text(prop, "Mode", ""); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); -} - -static void rna_def_modifier_grease_pencil_time(BlenderRNA *brna) -{ - StructRNA *srna; - PropertyRNA *prop; - - static const EnumPropertyItem time_mode_items[] = { - {MOD_GREASE_PENCIL_TIME_MODE_NORMAL, - "NORMAL", - 0, - "Regular", - "Apply offset in usual animation direction"}, - {MOD_GREASE_PENCIL_TIME_MODE_REVERSE, - "REVERSE", - 0, - "Reverse", - "Apply offset in reverse animation direction"}, - {MOD_GREASE_PENCIL_TIME_MODE_FIX, - "FIX", - 0, - "Fixed Frame", - "Keep frame and do not change with time"}, - {MOD_GREASE_PENCIL_TIME_MODE_PINGPONG, - "PINGPONG", - 0, - "Ping Pong", - "Loop back and forth starting in reverse"}, - {MOD_GREASE_PENCIL_TIME_MODE_CHAIN, - "CHAIN", - 0, - "Chain", - "List of chained animation segments"}, - {0, nullptr, 0, nullptr, nullptr}, - }; - - srna = RNA_def_struct(brna, "GreasePencilTimeModifier", "Modifier"); - RNA_def_struct_ui_text(srna, "Grease Pencil Time Modifier", "Offset keyframes"); - RNA_def_struct_sdna(srna, "GreasePencilTimeModifierData"); - RNA_def_struct_ui_icon(srna, ICON_MOD_TIME); - - rna_def_modifier_grease_pencil_layer_filter(srna); - - rna_def_modifier_panel_open_prop(srna, "open_influence_panel", 0); - rna_def_modifier_panel_open_prop(srna, "open_custom_range_panel", 1); - - RNA_define_lib_overridable(true); - - prop = RNA_def_property(srna, "segments", PROP_COLLECTION, PROP_NONE); - RNA_def_property_struct_type(prop, "GreasePencilTimeModifierSegment"); - RNA_def_property_collection_sdna(prop, nullptr, "segments_array", nullptr); - RNA_def_property_collection_funcs(prop, - "rna_GreasePencilTimeModifier_segments_begin", - "rna_iterator_array_next", - "rna_iterator_array_end", - "rna_iterator_array_get", - nullptr, - nullptr, - nullptr, - nullptr); - RNA_def_property_ui_text(prop, "Segments", ""); - - prop = RNA_def_property(srna, "segment_active_index", PROP_INT, PROP_UNSIGNED); - RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); - RNA_def_property_ui_text(prop, "Active Time Segment Index", "Active index in the segment list"); - - prop = RNA_def_property(srna, "mode", PROP_ENUM, PROP_NONE); - RNA_def_property_enum_sdna(prop, nullptr, "mode"); - RNA_def_property_enum_items(prop, time_mode_items); - RNA_def_property_ui_text(prop, "Mode", ""); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "offset", PROP_INT, PROP_NONE); - RNA_def_property_int_sdna(prop, nullptr, "offset"); - RNA_def_property_range(prop, SHRT_MIN, SHRT_MAX); - RNA_def_property_ui_text( - prop, "Frame Offset", "Number of frames to offset original keyframe number or frame to fix"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "frame_scale", PROP_FLOAT, PROP_NONE); - RNA_def_property_float_sdna(prop, nullptr, "frame_scale"); - RNA_def_property_range(prop, 0.001f, 100.0f); - RNA_def_property_ui_text(prop, "Frame Scale", "Evaluation time in seconds"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "frame_start", PROP_INT, PROP_TIME); - RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); - RNA_def_property_int_sdna(prop, nullptr, "sfra"); - RNA_def_property_int_funcs( - prop, nullptr, "rna_GreasePencilTimeModifier_start_frame_set", nullptr); - RNA_def_property_range(prop, MINFRAME, MAXFRAME); - RNA_def_property_ui_text(prop, "Start Frame", "First frame of the range"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "frame_end", PROP_INT, PROP_TIME); - RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); - RNA_def_property_int_sdna(prop, nullptr, "efra"); - RNA_def_property_int_funcs(prop, nullptr, "rna_GreasePencilTimeModifier_end_frame_set", nullptr); - RNA_def_property_range(prop, MINFRAME, MAXFRAME); - RNA_def_property_ui_text(prop, "End Frame", "Final frame of the range"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "use_keep_loop", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, nullptr, "flag", MOD_GREASE_PENCIL_TIME_KEEP_LOOP); - RNA_def_property_ui_text( - prop, "Keep Loop", "Retiming end frames and move to start of animation to keep loop"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "use_custom_frame_range", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, nullptr, "flag", MOD_GREASE_PENCIL_TIME_CUSTOM_RANGE); - RNA_def_property_ui_text( - prop, "Custom Range", "Define a custom range of frames to use in modifier"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - RNA_define_lib_overridable(false); -} - -static void rna_def_modifier_grease_pencil_envelope(BlenderRNA *brna) -{ - StructRNA *srna; - PropertyRNA *prop; - - static const EnumPropertyItem envelope_mode_items[] = { - {MOD_GREASE_PENCIL_ENVELOPE_DEFORM, - "DEFORM", - 0, - "Deform", - "Deform the stroke to best match the envelope shape"}, - {MOD_GREASE_PENCIL_ENVELOPE_SEGMENTS, - "SEGMENTS", - 0, - "Segments", - "Add segments to create the envelope. Keep the original stroke"}, - {MOD_GREASE_PENCIL_ENVELOPE_FILLS, - "FILLS", - 0, - "Fills", - "Add fill segments to create the envelope. Don't keep the original stroke"}, - {0, nullptr, 0, nullptr, nullptr}, - }; - - srna = RNA_def_struct(brna, "GreasePencilEnvelopeModifier", "Modifier"); - RNA_def_struct_ui_text( - srna, "Grease Pencil Envelope Modifier", "AEnvelope stroke effect modifier"); - RNA_def_struct_sdna(srna, "GreasePencilEnvelopeModifierData"); - RNA_def_struct_ui_icon(srna, ICON_MOD_ENVELOPE); - - rna_def_modifier_grease_pencil_layer_filter(srna); - rna_def_modifier_grease_pencil_material_filter( - srna, "rna_GreasePencilEnvelopeModifier_material_filter_set"); - rna_def_modifier_grease_pencil_vertex_group( - srna, "rna_GreasePencilEnvelopeModifier_vertex_group_name_set"); - - rna_def_modifier_panel_open_prop(srna, "open_influence_panel", 0); - - RNA_define_lib_overridable(true); - - prop = RNA_def_property(srna, "mode", PROP_ENUM, PROP_NONE); - RNA_def_property_enum_sdna(prop, nullptr, "mode"); - RNA_def_property_enum_items(prop, envelope_mode_items); - RNA_def_property_ui_text(prop, "Mode", "Algorithm to use for generating the envelope"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "spread", PROP_INT, PROP_NONE); - RNA_def_property_int_sdna(prop, nullptr, "spread"); - RNA_def_property_range(prop, 1, INT_MAX); - RNA_def_property_ui_text( - prop, "Spread Length", "The number of points to skip to create straight segments"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "mat_nr", PROP_INT, PROP_NONE); - RNA_def_property_int_sdna(prop, nullptr, "mat_nr"); - RNA_def_property_range(prop, -1, INT16_MAX); - RNA_def_property_ui_text(prop, "Material Index", "The material to use for the new strokes"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "thickness", PROP_FLOAT, PROP_FACTOR); - RNA_def_property_float_sdna(prop, nullptr, "thickness"); - RNA_def_property_range(prop, 0, FLT_MAX); - RNA_def_property_ui_range(prop, 0, 1, 10, 3); - RNA_def_property_ui_text(prop, "Thickness", "Multiplier for the thickness of the new strokes"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "strength", PROP_FLOAT, PROP_FACTOR); - RNA_def_property_float_sdna(prop, nullptr, "strength"); - RNA_def_property_range(prop, 0, FLT_MAX); - RNA_def_property_ui_range(prop, 0, 1, 10, 3); - RNA_def_property_ui_text(prop, "Strength", "Multiplier for the strength of the new strokes"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "skip", PROP_INT, PROP_NONE); - RNA_def_property_int_sdna(prop, nullptr, "skip"); - RNA_def_property_range(prop, 0, INT_MAX); - RNA_def_property_ui_text( - prop, "Skip Segments", "The number of generated segments to skip to reduce complexity"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - RNA_define_lib_overridable(false); -} - -static void rna_def_modifier_grease_pencil_outline(BlenderRNA *brna) -{ - StructRNA *srna; - PropertyRNA *prop; - - srna = RNA_def_struct(brna, "GreasePencilOutlineModifier", "Modifier"); - RNA_def_struct_ui_text(srna, "Outline Modifier", "Outline of Strokes modifier from camera view"); - RNA_def_struct_sdna(srna, "GreasePencilOutlineModifierData"); - RNA_def_struct_ui_icon(srna, ICON_MOD_OUTLINE); - - rna_def_modifier_grease_pencil_layer_filter(srna); - rna_def_modifier_grease_pencil_material_filter( - srna, "rna_GreasePencilOutlineModifier_material_filter_set"); - - rna_def_modifier_panel_open_prop(srna, "open_influence_panel", 0); - - RNA_define_lib_overridable(true); - - prop = RNA_def_property(srna, "thickness", PROP_INT, PROP_NONE); - RNA_def_property_int_sdna(prop, nullptr, "thickness"); - RNA_def_property_range(prop, 1, 1000); - RNA_def_property_ui_text(prop, "Thickness", "Thickness of the perimeter stroke"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "sample_length", PROP_FLOAT, PROP_NONE); - RNA_def_property_float_sdna(prop, nullptr, "sample_length"); - RNA_def_property_ui_range(prop, 0.0f, 100.0f, 0.1f, 2); - RNA_def_property_ui_text(prop, "Sample Length", ""); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "subdivision", PROP_INT, PROP_NONE); - RNA_def_property_int_sdna(prop, nullptr, "subdiv"); - RNA_def_property_range(prop, 0, 10); - RNA_def_property_ui_text(prop, "Subdivisions", "Number of subdivisions"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "use_keep_shape", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, nullptr, "flag", MOD_GREASE_PENCIL_OUTLINE_KEEP_SHAPE); - RNA_def_property_ui_text(prop, "Keep Shape", "Try to keep global shape"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "outline_material", PROP_POINTER, PROP_NONE); - RNA_def_property_flag(prop, PROP_EDITABLE); - RNA_def_property_pointer_funcs(prop, - nullptr, - "rna_GreasePencilOutlineModifier_outline_material_set", - nullptr, - "rna_GreasePencilModifier_material_poll"); - RNA_def_property_ui_text(prop, "Outline Material", "Material used for outline strokes"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "object", PROP_POINTER, PROP_NONE); - RNA_def_property_ui_text(prop, "Target Object", "Target object to define stroke start"); - RNA_def_property_flag(prop, PROP_EDITABLE | PROP_ID_SELF_CHECK); - RNA_def_property_pointer_funcs( - prop, nullptr, "rna_GreasePencilOutlineModifier_object_set", nullptr, nullptr); - RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update"); - - RNA_define_lib_overridable(false); -} - -static void rna_def_modifier_grease_pencil_shrinkwrap(BlenderRNA *brna) -{ - StructRNA *srna; - PropertyRNA *prop; - - srna = RNA_def_struct(brna, "GreasePencilShrinkwrapModifier", "Modifier"); - RNA_def_struct_ui_text(srna, - "Shrinkwrap Modifier", - "Shrink wrapping modifier to shrink wrap an object to a target"); - RNA_def_struct_sdna(srna, "GreasePencilShrinkwrapModifierData"); - RNA_def_struct_ui_icon(srna, ICON_MOD_SHRINKWRAP); - - rna_def_modifier_grease_pencil_layer_filter(srna); - rna_def_modifier_grease_pencil_material_filter( - srna, "rna_GreasePencilShrinkwrapModifier_material_filter_set"); - rna_def_modifier_grease_pencil_vertex_group( - srna, "rna_GreasePencilShrinkwrapModifier_vertex_group_name_set"); - - rna_def_modifier_panel_open_prop(srna, "open_influence_panel", 0); - - RNA_define_lib_overridable(true); - - prop = RNA_def_property(srna, "wrap_method", PROP_ENUM, PROP_NONE); - RNA_def_property_enum_sdna(prop, nullptr, "shrink_type"); - RNA_def_property_enum_items(prop, rna_enum_shrinkwrap_type_items); - RNA_def_property_ui_text(prop, "Wrap Method", ""); - RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update"); - - prop = RNA_def_property(srna, "wrap_mode", PROP_ENUM, PROP_NONE); - RNA_def_property_enum_sdna(prop, nullptr, "shrink_mode"); - RNA_def_property_enum_items(prop, rna_enum_modifier_shrinkwrap_mode_items); - RNA_def_property_ui_text( - prop, "Snap Mode", "Select how vertices are constrained to the target surface"); - RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update"); - - prop = RNA_def_property(srna, "cull_face", PROP_ENUM, PROP_NONE); - RNA_def_property_enum_sdna(prop, nullptr, "shrink_opts"); - RNA_def_property_enum_items(prop, rna_enum_shrinkwrap_face_cull_items); - RNA_def_property_enum_funcs(prop, - "rna_GreasePencilShrinkwrapModifier_face_cull_get", - "rna_GreasePencilShrinkwrapModifier_face_cull_set", - nullptr); - RNA_def_property_ui_text( - prop, - "Face Cull", - "Stop vertices from projecting to a face on the target when facing towards/away"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "target", PROP_POINTER, PROP_NONE); - RNA_def_property_ui_text(prop, "Target", "Mesh target to shrink to"); - RNA_def_property_pointer_funcs(prop, - nullptr, - "rna_GreasePencilShrinkwrapModifier_target_set", - nullptr, - "rna_Mesh_object_poll"); - RNA_def_property_flag(prop, PROP_EDITABLE | PROP_ID_SELF_CHECK); - RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update"); - - prop = RNA_def_property(srna, "auxiliary_target", PROP_POINTER, PROP_NONE); - RNA_def_property_pointer_sdna(prop, nullptr, "aux_target"); - RNA_def_property_ui_text(prop, "Auxiliary Target", "Additional mesh target to shrink to"); - RNA_def_property_pointer_funcs(prop, - nullptr, - "rna_GreasePencilShrinkwrapModifier_aux_target_set", - nullptr, - "rna_Mesh_object_poll"); - RNA_def_property_flag(prop, PROP_EDITABLE | PROP_ID_SELF_CHECK); - RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update"); - - prop = RNA_def_property(srna, "offset", PROP_FLOAT, PROP_DISTANCE); - RNA_def_property_float_sdna(prop, nullptr, "keep_dist"); - RNA_def_property_range(prop, -FLT_MAX, FLT_MAX); - RNA_def_property_ui_range(prop, -100, 100, 1, 2); - RNA_def_property_ui_text(prop, "Offset", "Distance to keep from the target"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "project_limit", PROP_FLOAT, PROP_DISTANCE); - RNA_def_property_float_sdna(prop, nullptr, "proj_limit"); - RNA_def_property_range(prop, 0.0, FLT_MAX); - RNA_def_property_ui_range(prop, 0, 100, 1, 2); - RNA_def_property_ui_text( - prop, "Project Limit", "Limit the distance used for projection (zero disables)"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "use_project_x", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, nullptr, "proj_axis", MOD_SHRINKWRAP_PROJECT_OVER_X_AXIS); - RNA_def_property_ui_text(prop, "X", ""); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "use_project_y", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, nullptr, "proj_axis", MOD_SHRINKWRAP_PROJECT_OVER_Y_AXIS); - RNA_def_property_ui_text(prop, "Y", ""); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "use_project_z", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, nullptr, "proj_axis", MOD_SHRINKWRAP_PROJECT_OVER_Z_AXIS); - RNA_def_property_ui_text(prop, "Z", ""); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "subsurf_levels", PROP_INT, PROP_NONE); - RNA_def_property_int_sdna(prop, nullptr, "subsurf_levels"); - RNA_def_property_range(prop, 0, 6); - RNA_def_property_ui_range(prop, 0, 6, 1, -1); - RNA_def_property_ui_text( - prop, - "Subdivision Levels", - "Number of subdivisions that must be performed before extracting vertices' " - "positions and normals"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "use_negative_direction", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna( - prop, nullptr, "shrink_opts", MOD_SHRINKWRAP_PROJECT_ALLOW_NEG_DIR); - RNA_def_property_ui_text( - prop, "Negative", "Allow vertices to move in the negative direction of axis"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "use_positive_direction", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna( - prop, nullptr, "shrink_opts", MOD_SHRINKWRAP_PROJECT_ALLOW_POS_DIR); - RNA_def_property_ui_text( - prop, "Positive", "Allow vertices to move in the positive direction of axis"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "use_invert_cull", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, nullptr, "shrink_opts", MOD_SHRINKWRAP_INVERT_CULL_TARGET); - RNA_def_property_ui_text( - prop, "Invert Cull", "When projecting in the negative direction invert the face cull mode"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "smooth_factor", PROP_FLOAT, PROP_FACTOR); - RNA_def_property_float_sdna(prop, nullptr, "smooth_factor"); - RNA_def_property_range(prop, 0, 1); - RNA_def_property_ui_text(prop, "Smooth Factor", "Amount of smoothing to apply"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop = RNA_def_property(srna, "smooth_step", PROP_INT, PROP_NONE); - RNA_def_property_int_sdna(prop, nullptr, "smooth_step"); - RNA_def_property_range(prop, 1, 10); - RNA_def_property_ui_text( - prop, "Steps", "Number of times to apply smooth (high numbers can reduce FPS)"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - RNA_define_lib_overridable(false); -} - void RNA_def_modifier(BlenderRNA *brna) { StructRNA *srna; @@ -10620,22 +8597,6 @@ void RNA_def_modifier(BlenderRNA *brna) rna_def_modifier_grease_pencil_noise(brna); rna_def_modifier_grease_pencil_mirror(brna); rna_def_modifier_grease_pencil_thickness(brna); - rna_def_modifier_grease_pencil_lattice(brna); - rna_def_modifier_grease_pencil_dash_segment(brna); - rna_def_modifier_grease_pencil_dash(brna); - rna_def_modifier_grease_pencil_multiply(brna); - rna_def_modifier_grease_pencil_length(brna); - rna_def_modifier_grease_pencil_weight_angle(brna); - rna_def_modifier_grease_pencil_array(brna); - rna_def_modifier_grease_pencil_weight_proximity(brna); - rna_def_modifier_grease_pencil_hook(brna); - rna_def_modifier_grease_pencil_lineart(brna); - rna_def_modifier_grease_pencil_armature(brna); - rna_def_modifier_grease_pencil_time_segment(brna); - rna_def_modifier_grease_pencil_time(brna); - rna_def_modifier_grease_pencil_envelope(brna); - rna_def_modifier_grease_pencil_outline(brna); - rna_def_modifier_grease_pencil_shrinkwrap(brna); } #endif diff --git a/source/blender/makesrna/intern/rna_nla.cc b/source/blender/makesrna/intern/rna_nla.cc index fd69e48df44..4d76a1ec5c0 100644 --- a/source/blender/makesrna/intern/rna_nla.cc +++ b/source/blender/makesrna/intern/rna_nla.cc @@ -76,8 +76,8 @@ const EnumPropertyItem rna_enum_nla_mode_extend_items[] = { # include /* needed for some of the validation stuff... */ -# include "BKE_anim_data.hh" -# include "BKE_fcurve.hh" +# include "BKE_anim_data.h" +# include "BKE_fcurve.h" # include "BKE_nla.h" # include "DNA_object_types.h" @@ -581,7 +581,7 @@ static NlaStrip *rna_NlaStrip_new(ID *id, WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_ADDED, nullptr); DEG_relations_tag_update(bmain); - DEG_id_tag_update_ex(bmain, id, ID_RECALC_ANIMATION | ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update_ex(bmain, id, ID_RECALC_ANIMATION | ID_RECALC_COPY_ON_WRITE); return strip; } @@ -602,7 +602,7 @@ static void rna_NlaStrip_remove( WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_REMOVED, nullptr); DEG_relations_tag_update(bmain); - DEG_id_tag_update_ex(bmain, id, ID_RECALC_ANIMATION | ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update_ex(bmain, id, ID_RECALC_ANIMATION | ID_RECALC_COPY_ON_WRITE); } /* Set the 'solo' setting for the given NLA-track, making sure that it is the only one diff --git a/source/blender/makesrna/intern/rna_node_socket.cc b/source/blender/makesrna/intern/rna_node_socket.cc index d2c65fc6fc9..4077d67b4ac 100644 --- a/source/blender/makesrna/intern/rna_node_socket.cc +++ b/source/blender/makesrna/intern/rna_node_socket.cc @@ -25,7 +25,6 @@ const EnumPropertyItem rna_enum_node_socket_type_items[] = { {SOCK_BOOLEAN, "BOOLEAN", 0, "Boolean", ""}, {SOCK_VECTOR, "VECTOR", 0, "Vector", ""}, {SOCK_ROTATION, "ROTATION", 0, "Rotation", ""}, - {SOCK_MATRIX, "MATRIX", 0, "Matrix", ""}, {SOCK_STRING, "STRING", 0, "String", ""}, {SOCK_RGBA, "RGBA", 0, "RGBA", ""}, {SOCK_SHADER, "SHADER", 0, "Shader", ""}, @@ -45,7 +44,7 @@ const EnumPropertyItem rna_enum_node_socket_type_items[] = { # include "DNA_material_types.h" -# include "BKE_node.hh" +# include "BKE_node.h" # include "BKE_node_enum.hh" # include "BKE_node_runtime.hh" # include "BKE_node_tree_update.hh" @@ -1016,30 +1015,6 @@ static void rna_def_node_socket_interface_rotation(BlenderRNA *brna, const char rna_def_node_tree_interface_socket_builtin(srna); } -static void rna_def_node_socket_matrix(BlenderRNA *brna, const char *identifier) -{ - StructRNA *srna; - - srna = RNA_def_struct(brna, identifier, "NodeSocketStandard"); - RNA_def_struct_ui_text(srna, "Matrix Node Socket", "Matrix value socket of a node"); - RNA_def_struct_sdna(srna, "bNodeSocket"); - - RNA_def_struct_sdna_from(srna, "bNodeSocket", nullptr); -} - -static void rna_def_node_socket_interface_matrix(BlenderRNA *brna, const char *identifier) -{ - StructRNA *srna; - - srna = RNA_def_struct(brna, identifier, "NodeTreeInterfaceSocket"); - RNA_def_struct_ui_text(srna, "Matrix Node Socket Interface", "Matrix value socket of a node"); - RNA_def_struct_sdna(srna, "bNodeTreeInterfaceSocket"); - - RNA_def_struct_sdna_from(srna, "bNodeTreeInterfaceSocket", nullptr); - - rna_def_node_tree_interface_socket_builtin(srna); -} - static void rna_def_node_socket_vector(BlenderRNA *brna, const char *identifier, PropertySubType subtype) @@ -1557,7 +1532,6 @@ static const bNodeSocketStaticTypeInfo node_socket_subtypes[] = { {"NodeSocketIntFactor", "NodeTreeInterfaceSocketIntFactor", SOCK_INT, PROP_FACTOR}, {"NodeSocketBool", "NodeTreeInterfaceSocketBool", SOCK_BOOLEAN, PROP_NONE}, {"NodeSocketRotation", "NodeTreeInterfaceSocketRotation", SOCK_ROTATION, PROP_NONE}, - {"NodeSocketMatrix", "NodeTreeInterfaceSocketMatrix", SOCK_MATRIX, PROP_NONE}, {"NodeSocketVector", "NodeTreeInterfaceSocketVector", SOCK_VECTOR, PROP_NONE}, {"NodeSocketVectorTranslation", "NodeTreeInterfaceSocketVectorTranslation", @@ -1607,9 +1581,6 @@ static void rna_def_node_socket_subtypes(BlenderRNA *brna) case SOCK_ROTATION: rna_def_node_socket_rotation(brna, identifier); break; - case SOCK_MATRIX: - rna_def_node_socket_matrix(brna, identifier); - break; case SOCK_VECTOR: rna_def_node_socket_vector(brna, identifier, info.subtype); break; @@ -1673,9 +1644,6 @@ void rna_def_node_socket_interface_subtypes(BlenderRNA *brna) case SOCK_ROTATION: rna_def_node_socket_interface_rotation(brna, identifier); break; - case SOCK_MATRIX: - rna_def_node_socket_interface_matrix(brna, identifier); - break; case SOCK_VECTOR: rna_def_node_socket_interface_vector(brna, identifier, info.subtype); break; diff --git a/source/blender/makesrna/intern/rna_node_tree_interface.cc b/source/blender/makesrna/intern/rna_node_tree_interface.cc index e63e2697e18..63d951fd15b 100644 --- a/source/blender/makesrna/intern/rna_node_tree_interface.cc +++ b/source/blender/makesrna/intern/rna_node_tree_interface.cc @@ -31,7 +31,7 @@ static const EnumPropertyItem node_tree_interface_socket_in_out_items[] = { # include # include "BKE_attribute.hh" -# include "BKE_node.hh" +# include "BKE_node.h" # include "BKE_node_enum.hh" # include "BKE_node_runtime.hh" # include "BKE_node_tree_interface.hh" @@ -39,7 +39,7 @@ static const EnumPropertyItem node_tree_interface_socket_in_out_items[] = { # include "BLI_set.hh" -# include "BLT_translation.hh" +# include "BLT_translation.h" # include "DNA_material_types.h" # include "ED_node.hh" @@ -530,19 +530,32 @@ static bNodeTreeInterfaceSocket *rna_NodeTreeInterfaceItems_new_socket( return socket; } -static bNodeTreeInterfacePanel *rna_NodeTreeInterfaceItems_new_panel(ID *id, - bNodeTreeInterface *interface, - Main *bmain, - ReportList *reports, - const char *name, - const char *description, - bool default_closed) +static bNodeTreeInterfacePanel *rna_NodeTreeInterfaceItems_new_panel( + ID *id, + bNodeTreeInterface *interface, + Main *bmain, + ReportList *reports, + const char *name, + const char *description, + bool default_closed, + bNodeTreeInterfacePanel *parent) { + if (parent != nullptr) { + if (!interface->find_item(parent->item)) { + BKE_report(reports, RPT_ERROR_INVALID_INPUT, "Parent is not part of the interface"); + return nullptr; + } + if (!(parent->flag & NODE_INTERFACE_PANEL_ALLOW_CHILD_PANELS)) { + BKE_report(reports, RPT_WARNING, "Parent panel does not allow child panels"); + return nullptr; + } + } + NodeTreeInterfacePanelFlag flag = NodeTreeInterfacePanelFlag(0); SET_FLAG_FROM_TEST(flag, default_closed, NODE_INTERFACE_PANEL_DEFAULT_CLOSED); bNodeTreeInterfacePanel *panel = interface->add_panel( - name ? name : "", description ? description : "", flag, nullptr); + name ? name : "", description ? description : "", flag, parent); if (panel == nullptr) { BKE_report(reports, RPT_ERROR, "Unable to create panel"); @@ -1165,6 +1178,11 @@ static void rna_def_node_tree_interface_items_api(StructRNA *srna) RNA_def_boolean( func, "default_closed", false, "Default Closed", "Panel is closed by default on new nodes"); RNA_def_parameter_flags(parm, PropertyFlag(0), PARM_REQUIRED); + RNA_def_pointer(func, + "parent", + "NodeTreeInterfacePanel", + "Parent", + "Add panel as a child of the parent panel"); /* return value */ parm = RNA_def_pointer(func, "item", "NodeTreeInterfacePanel", "Panel", "New panel"); RNA_def_function_return(func, parm); diff --git a/source/blender/makesrna/intern/rna_nodetree.cc b/source/blender/makesrna/intern/rna_nodetree.cc index 7e7656b3626..abccdc0776f 100644 --- a/source/blender/makesrna/intern/rna_nodetree.cc +++ b/source/blender/makesrna/intern/rna_nodetree.cc @@ -21,7 +21,7 @@ #include "BLF_api.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_curves_types.h" #include "DNA_material_types.h" @@ -38,7 +38,7 @@ #include "BKE_cryptomatte.h" #include "BKE_geometry_set.hh" #include "BKE_image.h" -#include "BKE_node.hh" +#include "BKE_node.h" #include "BKE_node_runtime.hh" #include "BKE_node_tree_update.hh" #include "BKE_texture.h" @@ -79,7 +79,6 @@ const EnumPropertyItem rna_enum_node_socket_data_type_items[] = { {SOCK_BOOLEAN, "BOOLEAN", 0, "Boolean", ""}, {SOCK_VECTOR, "VECTOR", 0, "Vector", ""}, {SOCK_ROTATION, "ROTATION", 0, "Rotation", ""}, - {SOCK_MATRIX, "MATRIX", 0, "Matrix", ""}, {SOCK_STRING, "STRING", 0, "String", ""}, {SOCK_MENU, "MENU", 0, "Menu", ""}, {SOCK_RGBA, "RGBA", 0, "Color", ""}, @@ -99,11 +98,58 @@ static const EnumPropertyItem node_quality_items[] = { {NTREE_QUALITY_LOW, "LOW", 0, "Low", "Low quality"}, {0, nullptr, 0, nullptr, nullptr}, }; + +static const EnumPropertyItem node_chunksize_items[] = { + {NTREE_CHUNKSIZE_32, + "32", + 0, + "32" BLI_STR_UTF8_MULTIPLICATION_SIGN "32", + "Chunksize of 32" BLI_STR_UTF8_MULTIPLICATION_SIGN "32"}, + {NTREE_CHUNKSIZE_64, + "64", + 0, + "64" BLI_STR_UTF8_MULTIPLICATION_SIGN "64", + "Chunksize of 64" BLI_STR_UTF8_MULTIPLICATION_SIGN "64"}, + {NTREE_CHUNKSIZE_128, + "128", + 0, + "128" BLI_STR_UTF8_MULTIPLICATION_SIGN "128", + "Chunksize of 128" BLI_STR_UTF8_MULTIPLICATION_SIGN "128"}, + {NTREE_CHUNKSIZE_256, + "256", + 0, + "256" BLI_STR_UTF8_MULTIPLICATION_SIGN "256", + "Chunksize of 256" BLI_STR_UTF8_MULTIPLICATION_SIGN "256"}, + {NTREE_CHUNKSIZE_512, + "512", + 0, + "512" BLI_STR_UTF8_MULTIPLICATION_SIGN "512", + "Chunksize of 512" BLI_STR_UTF8_MULTIPLICATION_SIGN "512"}, + {NTREE_CHUNKSIZE_1024, + "1024", + 0, + "1024" BLI_STR_UTF8_MULTIPLICATION_SIGN "1024", + "Chunksize of 1024" BLI_STR_UTF8_MULTIPLICATION_SIGN "1024"}, + {0, nullptr, 0, nullptr, nullptr}, +}; #endif static const EnumPropertyItem rna_enum_execution_mode_items[] = { - {NTREE_EXECUTION_MODE_CPU, "CPU", 0, "CPU", ""}, - {NTREE_EXECUTION_MODE_GPU, "GPU", 0, "GPU", ""}, + {NTREE_EXECUTION_MODE_TILED, + "TILED", + 0, + "Tiled", + "Compositing is tiled, having as priority to display first tiles as fast as possible"}, + {NTREE_EXECUTION_MODE_FULL_FRAME, + "FULL_FRAME", + 0, + "Full Frame", + "Composites full image result as fast as possible"}, + {NTREE_EXECUTION_MODE_REALTIME, + "REALTIME", + 0, + "GPU", + "Use GPU accelerated compositing with more limited functionality"}, {0, nullptr, 0, nullptr, nullptr}, }; @@ -551,7 +597,7 @@ static const EnumPropertyItem node_cryptomatte_layer_name_items[] = { # include "BKE_context.hh" # include "BKE_idprop.h" -# include "BKE_global.hh" +# include "BKE_global.h" # include "ED_node.hh" # include "ED_render.hh" @@ -1866,8 +1912,7 @@ static bool generic_attribute_type_supported(const EnumPropertyItem *item) CD_PROP_BOOL, CD_PROP_INT32, CD_PROP_BYTE_COLOR, - CD_PROP_QUATERNION, - CD_PROP_FLOAT4X4); + CD_PROP_QUATERNION); } static bool generic_attribute_type_supported_with_socket(const EnumPropertyItem *item) @@ -2205,8 +2250,7 @@ static bNodeSocket *rna_Node_inputs_new(ID *id, ReportList *reports, const char *type, const char *name, - const char *identifier, - const bool use_multi_input) + const char *identifier) { if (!allow_changing_sockets(node)) { BKE_report(reports, RPT_ERROR, "Cannot add socket to built-in node"); @@ -2220,9 +2264,6 @@ static bNodeSocket *rna_Node_inputs_new(ID *id, BKE_report(reports, RPT_ERROR, "Unable to create socket"); } else { - if (use_multi_input) { - sock->flag |= SOCK_MULTI_INPUT; - } ED_node_tree_propagate_change(nullptr, bmain, ntree); WM_main_add_notifier(NC_NODE | NA_EDITED, ntree); } @@ -2236,19 +2277,13 @@ static bNodeSocket *rna_Node_outputs_new(ID *id, ReportList *reports, const char *type, const char *name, - const char *identifier, - const bool use_multi_input) + const char *identifier) { if (!allow_changing_sockets(node)) { BKE_report(reports, RPT_ERROR, "Cannot add socket to built-in node"); return nullptr; } - if (use_multi_input) { - BKE_report(reports, RPT_ERROR, "Output sockets cannot be multi-input"); - return nullptr; - } - bNodeTree *ntree = reinterpret_cast(id); bNodeSocket *sock = nodeAddSocket(ntree, node, SOCK_OUT, type, identifier, name); @@ -4140,9 +4175,9 @@ static const EnumPropertyItem node_principled_hair_model_items[] = { "HUANG", 0, "Huang", - "Multi-scale hair scattering model by Huang et al. 2022, suitable for viewing both up close " - "and from a distance, supports elliptical cross-sections and has more precise highlight in " - "forward scattering directions"}, + "Far-field hair scattering model by Huang et al. 2022, suitable for viewing from a distance, " + "supports elliptical cross-sections and has more precise highlight in forward scattering " + "directions"}, {0, nullptr, 0, nullptr, nullptr}, }; @@ -4547,7 +4582,7 @@ static void def_fn_input_color(StructRNA *srna) RNA_def_struct_sdna_from(srna, "NodeInputColor", "storage"); - prop = RNA_def_property(srna, "value", PROP_FLOAT, PROP_COLOR); + prop = RNA_def_property(srna, "color", PROP_FLOAT, PROP_COLOR); RNA_def_property_array(prop, 4); RNA_def_property_float_sdna(prop, nullptr, "color"); RNA_def_property_ui_text(prop, "Color", ""); @@ -5857,8 +5892,7 @@ static void def_sh_output_aov(StructRNA *srna) RNA_def_struct_sdna_from(srna, "NodeShaderOutputAOV", "storage"); - prop = RNA_def_property(srna, "aov_name", PROP_STRING, PROP_NONE); - RNA_def_property_string_sdna(prop, nullptr, "name"); + prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE); RNA_def_property_ui_text(prop, "Name", "Name of the AOV that this output writes to"); RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update"); @@ -7336,11 +7370,10 @@ static void def_cmp_glare(StructRNA *srna) PropertyRNA *prop; static const EnumPropertyItem type_items[] = { - {CMP_NODE_GLARE_BLOOM, "BLOOM", 0, "Bloom", ""}, - {CMP_NODE_GLARE_GHOST, "GHOSTS", 0, "Ghosts", ""}, - {CMP_NODE_GLARE_STREAKS, "STREAKS", 0, "Streaks", ""}, - {CMP_NODE_GLARE_FOG_GLOW, "FOG_GLOW", 0, "Fog Glow", ""}, - {CMP_NODE_GLARE_SIMPLE_STAR, "SIMPLE_STAR", 0, "Simple Star", ""}, + {3, "GHOSTS", 0, "Ghosts", ""}, + {2, "STREAKS", 0, "Streaks", ""}, + {1, "FOG_GLOW", 0, "Fog Glow", ""}, + {0, "SIMPLE_STAR", 0, "Simple Star", ""}, {0, nullptr, 0, nullptr, nullptr}, }; @@ -7857,14 +7890,14 @@ static void def_cmp_boxmask(StructRNA *srna) RNA_def_property_ui_text(prop, "Y", "Y position of the middle of the box"); RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update"); - prop = RNA_def_property(srna, "mask_width", PROP_FLOAT, PROP_NONE); + prop = RNA_def_property(srna, "width", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, nullptr, "width"); RNA_def_property_float_default(prop, 0.3f); RNA_def_property_range(prop, 0.0f, 2.0f); RNA_def_property_ui_text(prop, "Width", "Width of the box"); RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update"); - prop = RNA_def_property(srna, "mask_height", PROP_FLOAT, PROP_NONE); + prop = RNA_def_property(srna, "height", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, nullptr, "height"); RNA_def_property_float_default(prop, 0.2f); RNA_def_property_range(prop, 0.0f, 2.0f); @@ -7904,14 +7937,14 @@ static void def_cmp_ellipsemask(StructRNA *srna) RNA_def_property_ui_text(prop, "Y", "Y position of the middle of the ellipse"); RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update"); - prop = RNA_def_property(srna, "mask_width", PROP_FLOAT, PROP_NONE); + prop = RNA_def_property(srna, "width", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, nullptr, "width"); RNA_def_property_float_default(prop, 0.3f); RNA_def_property_range(prop, 0.0f, 2.0f); RNA_def_property_ui_text(prop, "Width", "Width of the ellipse"); RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update"); - prop = RNA_def_property(srna, "mask_height", PROP_FLOAT, PROP_NONE); + prop = RNA_def_property(srna, "height", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, nullptr, "height"); RNA_def_property_float_default(prop, 0.2f); RNA_def_property_range(prop, 0.0f, 2.0f); @@ -9925,8 +9958,6 @@ static void rna_def_node_sockets_api(BlenderRNA *brna, PropertyRNA *cprop, int i parm = RNA_def_string(func, "name", nullptr, MAX_NAME, "Name", ""); RNA_def_parameter_flags(parm, PropertyFlag(0), PARM_REQUIRED); RNA_def_string(func, "identifier", nullptr, MAX_NAME, "Identifier", "Unique socket identifier"); - RNA_def_boolean( - func, "use_multi_input", false, "", "Make the socket a multi-input. Only valid for inputs"); /* return value */ parm = RNA_def_pointer(func, "socket", "NodeSocket", "", "New socket"); RNA_def_function_return(func, parm); @@ -10630,6 +10661,22 @@ static void rna_def_composite_nodetree(BlenderRNA *brna) RNA_def_property_enum_items(prop, node_quality_items); RNA_def_property_ui_text(prop, "Edit Quality", "Quality when editing"); + prop = RNA_def_property(srna, "chunk_size", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, nullptr, "chunksize"); + RNA_def_property_enum_items(prop, node_chunksize_items); + RNA_def_property_ui_text(prop, + "Chunksize", + "Max size of a tile (smaller values gives better distribution " + "of multiple threads, but more overhead)"); + + prop = RNA_def_property(srna, "use_opencl", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, nullptr, "flag", NTREE_COM_OPENCL); + RNA_def_property_ui_text(prop, "OpenCL", "Enable GPU calculations"); + + prop = RNA_def_property(srna, "use_groupnode_buffer", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, nullptr, "flag", NTREE_COM_GROUPNODE_BUFFER); + RNA_def_property_ui_text(prop, "Buffer Groups", "Enable buffering of group nodes"); + prop = RNA_def_property(srna, "use_two_pass", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, nullptr, "flag", NTREE_TWO_PASS); RNA_def_property_ui_text(prop, diff --git a/source/blender/makesrna/intern/rna_object.cc b/source/blender/makesrna/intern/rna_object.cc index 44ac12562dc..7bbdf513fa5 100644 --- a/source/blender/makesrna/intern/rna_object.cc +++ b/source/blender/makesrna/intern/rna_object.cc @@ -29,10 +29,10 @@ #include "BLI_math_vector.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_camera.h" -#include "BKE_collection.hh" +#include "BKE_collection.h" #include "BKE_editlattice.h" #include "BKE_editmesh.hh" #include "BKE_layer.hh" @@ -157,18 +157,18 @@ const EnumPropertyItem rna_enum_object_gpencil_type_items[] = { {GP_STROKE, "STROKE", ICON_STROKE, "Stroke", "Create a simple stroke with basic colors"}, {GP_MONKEY, "MONKEY", ICON_MONKEY, "Monkey", "Construct a Suzanne grease pencil object"}, RNA_ENUM_ITEM_SEPR, - {GREASE_PENCIL_LINEART_SCENE, - "LINEART_SCENE", + {GP_LRT_SCENE, + "LRT_SCENE", ICON_SCENE_DATA, "Scene Line Art", "Quickly set up line art for the entire scene"}, - {GREASE_PENCIL_LINEART_COLLECTION, - "LINEART_COLLECTION", + {GP_LRT_COLLECTION, + "LRT_COLLECTION", ICON_OUTLINER_COLLECTION, "Collection Line Art", "Quickly set up line art for the active collection"}, - {GREASE_PENCIL_LINEART_OBJECT, - "LINEART_OBJECT", + {GP_LRT_OBJECT, + "LRT_OBJECT", ICON_OBJECT_DATA, "Object Line Art", "Quickly set up line art for the active object"}, @@ -332,7 +332,7 @@ const EnumPropertyItem rna_enum_object_axis_items[] = { # include "BKE_curve.hh" # include "BKE_deform.hh" # include "BKE_effect.h" -# include "BKE_global.hh" +# include "BKE_global.h" # include "BKE_gpencil_modifier_legacy.h" # include "BKE_key.hh" # include "BKE_light_linking.h" @@ -342,7 +342,7 @@ const EnumPropertyItem rna_enum_object_axis_items[] = { # include "BKE_modifier.hh" # include "BKE_object.hh" # include "BKE_particle.h" -# include "BKE_scene.hh" +# include "BKE_scene.h" # include "DEG_depsgraph.hh" # include "DEG_depsgraph_build.hh" @@ -367,7 +367,7 @@ static void rna_Object_matrix_world_update(Main *bmain, Scene *scene, PointerRNA { /* Don't use compatibility so we get predictable rotation. */ Object *ob = reinterpret_cast(ptr->owner_id); - BKE_object_apply_mat4(ob, ob->object_to_world().ptr(), false, true); + BKE_object_apply_mat4(ob, ob->object_to_world, false, true); rna_Object_internal_update(bmain, scene, ptr); } @@ -375,7 +375,7 @@ static void rna_Object_hide_update(Main *bmain, Scene * /*scene*/, PointerRNA *p { Object *ob = reinterpret_cast(ptr->owner_id); BKE_main_collection_sync_remap(bmain); - DEG_id_tag_update(&ob->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&ob->id, ID_RECALC_COPY_ON_WRITE); DEG_relations_tag_update(bmain); WM_main_add_notifier(NC_OBJECT | ND_DRAW, &ob->id); } @@ -407,18 +407,6 @@ static void rna_GPencil_update(Main * /*bmain*/, Scene * /*scene*/, PointerRNA * } } -static void rna_Object_matrix_world_get(PointerRNA *ptr, float *values) -{ - Object *ob = static_cast(ptr->data); - std::copy_n(ob->object_to_world().base_ptr(), 16, values); -} - -static void rna_Object_matrix_world_set(PointerRNA *ptr, const float *values) -{ - Object *ob = static_cast(ptr->data); - ob->runtime->object_to_world = blender::float4x4(values); -} - static void rna_Object_matrix_local_get(PointerRNA *ptr, float values[16]) { Object *ob = reinterpret_cast(ptr->owner_id); @@ -3351,12 +3339,11 @@ static void rna_def_object(BlenderRNA *brna) /* matrix */ prop = RNA_def_property(srna, "matrix_world", PROP_FLOAT, PROP_MATRIX); + RNA_def_property_float_sdna(prop, nullptr, "object_to_world"); RNA_def_property_multi_array(prop, 2, rna_matrix_dimsize_4x4); RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); RNA_def_property_override_flag(prop, PROPOVERRIDE_NO_COMPARISON); RNA_def_property_override_clear_flag(prop, PROPOVERRIDE_OVERRIDABLE_LIBRARY); - RNA_def_property_float_funcs( - prop, "rna_Object_matrix_world_get", "rna_Object_matrix_world_set", nullptr); RNA_def_property_ui_text(prop, "Matrix World", "Worldspace transformation matrix"); RNA_def_property_update(prop, NC_OBJECT | ND_TRANSFORM, "rna_Object_matrix_world_update"); diff --git a/source/blender/makesrna/intern/rna_object_api.cc b/source/blender/makesrna/intern/rna_object_api.cc index 22954c12393..30b1f342908 100644 --- a/source/blender/makesrna/intern/rna_object_api.cc +++ b/source/blender/makesrna/intern/rna_object_api.cc @@ -56,7 +56,7 @@ static const EnumPropertyItem space_items[] = { # include "BKE_context.hh" # include "BKE_crazyspace.hh" # include "BKE_customdata.hh" -# include "BKE_global.hh" +# include "BKE_global.h" # include "BKE_layer.hh" # include "BKE_main.hh" # include "BKE_mball.hh" @@ -65,7 +65,7 @@ static const EnumPropertyItem space_items[] = { # include "BKE_modifier.hh" # include "BKE_object.hh" # include "BKE_object_types.hh" -# include "BKE_report.hh" +# include "BKE_report.h" # include "BKE_vfont.hh" # include "ED_object.hh" @@ -551,13 +551,13 @@ static void rna_Mesh_assign_verts_to_group( # endif /* don't call inside a loop */ -static int mesh_corner_tri_to_face_index(Mesh *mesh_eval, const int tri_index) +static int mesh_corner_tri_to_face_index(Mesh *me_eval, const int tri_index) { - const blender::Span tri_faces = mesh_eval->corner_tri_faces(); + const blender::Span tri_faces = me_eval->corner_tri_faces(); const int face_i = tri_faces[tri_index]; - const int *index_face_to_orig = static_cast( - CustomData_get_layer(&mesh_eval->face_data, CD_ORIGINDEX)); - return index_face_to_orig ? index_face_to_orig[face_i] : face_i; + const int *index_mp_to_orig = static_cast( + CustomData_get_layer(&me_eval->face_data, CD_ORIGINDEX)); + return index_mp_to_orig ? index_mp_to_orig[face_i] : face_i; } /* TODO(sergey): Make the Python API more clear that evaluation might happen, or require @@ -741,7 +741,7 @@ static bool rna_Object_is_deform_modified(Object *ob, Scene *scene, int settings void rna_Object_me_eval_info( Object *ob, bContext *C, int type, PointerRNA *rnaptr_depsgraph, char *result) { - Mesh *mesh_eval = nullptr; + Mesh *me_eval = nullptr; char *ret = nullptr; result[0] = '\0'; @@ -757,19 +757,19 @@ void rna_Object_me_eval_info( switch (type) { case 0: if (ob->type == OB_MESH) { - mesh_eval = static_cast(ob->data); + me_eval = static_cast(ob->data); } break; case 1: - mesh_eval = ob->runtime->mesh_deform_eval; + me_eval = ob->runtime->mesh_deform_eval; break; case 2: - mesh_eval = BKE_object_get_evaluated_mesh(ob); + me_eval = BKE_object_get_evaluated_mesh(ob); break; } - if (mesh_eval) { - ret = BKE_mesh_debug_info(mesh_eval); + if (me_eval) { + ret = BKE_mesh_debug_info(me_eval); if (ret) { BLI_strncpy(result, ret, MESH_DM_INFO_STR_MAX); MEM_freeN(ret); diff --git a/source/blender/makesrna/intern/rna_object_force.cc b/source/blender/makesrna/intern/rna_object_force.cc index bd668c2e38a..8416f518446 100644 --- a/source/blender/makesrna/intern/rna_object_force.cc +++ b/source/blender/makesrna/intern/rna_object_force.cc @@ -8,7 +8,7 @@ #include -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_cloth_types.h" #include "DNA_dynamicpaint_types.h" @@ -109,7 +109,7 @@ static const EnumPropertyItem empty_vortex_shape_items[] = { # include "DNA_modifier_types.h" # include "DNA_texture_types.h" -# include "BKE_collection.hh" +# include "BKE_collection.h" # include "BKE_context.hh" # include "BKE_modifier.hh" # include "BKE_pointcache.h" diff --git a/source/blender/makesrna/intern/rna_palette.cc b/source/blender/makesrna/intern/rna_palette.cc index d8d867dd6a5..bea16e515d7 100644 --- a/source/blender/makesrna/intern/rna_palette.cc +++ b/source/blender/makesrna/intern/rna_palette.cc @@ -22,7 +22,7 @@ # include "DNA_brush_types.h" # include "BKE_paint.hh" -# include "BKE_report.hh" +# include "BKE_report.h" static PaletteColor *rna_Palette_color_new(Palette *palette) { if (ID_IS_LINKED(palette) || ID_IS_OVERRIDE_LIBRARY(palette)) { diff --git a/source/blender/makesrna/intern/rna_particle.cc b/source/blender/makesrna/intern/rna_particle.cc index 88eb2b0e951..aa41fcf5cce 100644 --- a/source/blender/makesrna/intern/rna_particle.cc +++ b/source/blender/makesrna/intern/rna_particle.cc @@ -32,7 +32,7 @@ #include "BLI_math_matrix.h" #include "BLI_math_vector.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "rna_internal.hh" @@ -474,7 +474,7 @@ static void rna_ParticleSystem_co_hair( if (step >= 0 && step <= max_k) { copy_v3_v3(n_co, (cache + step)->co); mul_m4_v3(particlesystem->imat, n_co); - mul_m4_v3(object->object_to_world().ptr(), n_co); + mul_m4_v3(object->object_to_world, n_co); } } diff --git a/source/blender/makesrna/intern/rna_pose.cc b/source/blender/makesrna/intern/rna_pose.cc index 8f2db2b5058..26158ee67eb 100644 --- a/source/blender/makesrna/intern/rna_pose.cc +++ b/source/blender/makesrna/intern/rna_pose.cc @@ -24,7 +24,7 @@ #include "BLI_math_vector.h" #include "BLI_string_utf8_symbols.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "UI_resources.hh" @@ -74,7 +74,7 @@ const EnumPropertyItem rna_enum_color_sets_items[] = { # include "BKE_constraint.h" # include "BKE_context.hh" -# include "BKE_global.hh" +# include "BKE_global.h" # include "BKE_idprop.h" # include "DEG_depsgraph.hh" diff --git a/source/blender/makesrna/intern/rna_render.cc b/source/blender/makesrna/intern/rna_render.cc index f76d6e7de48..d1aadd3c387 100644 --- a/source/blender/makesrna/intern/rna_render.cc +++ b/source/blender/makesrna/intern/rna_render.cc @@ -22,7 +22,7 @@ #include "DEG_depsgraph.hh" #include "BKE_image.h" -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "RNA_define.hh" #include "RNA_enum_types.hh" @@ -88,7 +88,7 @@ const EnumPropertyItem rna_enum_bake_pass_type_items[] = { # include "BKE_appdir.hh" # include "BKE_context.hh" -# include "BKE_report.hh" +# include "BKE_report.h" # include "GPU_capabilities.h" # include "GPU_shader.h" @@ -987,7 +987,7 @@ static void rna_def_render_engine(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Use Custom Shading Nodes", "Don't expose Cycles and EEVEE shading nodes in the node editor user " - "interface, so separate nodes can be used instead"); + "interface, so own nodes can be used instead"); prop = RNA_def_property(srna, "bl_use_spherical_stereo", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, nullptr, "type->flag", RE_USE_SPHERICAL_STEREO); diff --git a/source/blender/makesrna/intern/rna_rna.cc b/source/blender/makesrna/intern/rna_rna.cc index 424c338b8f2..8232141058c 100644 --- a/source/blender/makesrna/intern/rna_rna.cc +++ b/source/blender/makesrna/intern/rna_rna.cc @@ -153,51 +153,33 @@ const EnumPropertyItem rna_enum_property_unit_items[] = { {0, nullptr, 0, nullptr, nullptr}, }; -/* Descriptions for rna_enum_property_flag_items and rna_enum_property_flag_enum_items. */ -static constexpr auto PROP_HIDDEN_DESCR = - "For operators: hide from places in the user interface where Blender would add the property " - "automatically, like Adjust Last Operation. Also this property is not written to presets"; -static constexpr auto PROP_SKIP_SAVE_DESCR = - "For operators: the value of this property will not be remembered between invocations of the " - "operator; instead, each invocation will start by using the default value. Also this " - "property is not written to presets"; -static constexpr auto PROP_SKIP_PRESET_DESCR = "Do not write in presets"; -static constexpr auto PROP_ANIMATABLE_DESCR = ""; -static constexpr auto PROP_LIB_EXCEPTION_DESCR = - "This property can be edited, even when it is used on linked data (which normally is " - "read-only). Note that edits to the property will not be saved to the blend file"; -static constexpr auto PROP_PROPORTIONAL_DESCR = ""; -static constexpr auto PROP_TEXTEDIT_UPDATE_DESCR = ""; -static constexpr auto PROP_PATH_OUTPUT_DESCR = ""; -static constexpr auto PROP_ENUM_FLAG_DESCR = ""; - const EnumPropertyItem rna_enum_property_flag_items[] = { - {PROP_HIDDEN, "HIDDEN", 0, "Hidden", PROP_HIDDEN_DESCR}, - {PROP_SKIP_SAVE, "SKIP_SAVE", 0, "Skip Save", PROP_SKIP_SAVE_DESCR}, - {PROP_SKIP_PRESET, "SKIP_PRESET", 0, "Skip Preset", PROP_SKIP_PRESET_DESCR}, - {PROP_ANIMATABLE, "ANIMATABLE", 0, "Animatable", PROP_ANIMATABLE_DESCR}, - {PROP_LIB_EXCEPTION, "LIBRARY_EDITABLE", 0, "Library Editable", PROP_LIB_EXCEPTION_DESCR}, - {PROP_PROPORTIONAL, - "PROPORTIONAL", + {PROP_HIDDEN, "HIDDEN", 0, "Hidden", "Hidden in the user interface. Inherits 'SKIP_PRESET'"}, + {PROP_SKIP_SAVE, + "SKIP_SAVE", 0, - "Adjust values proportionally to each other", - PROP_PROPORTIONAL_DESCR}, + "Skip Save", + "Do not use ghost values. Inherits 'SKIP_PRESET'"}, + {PROP_SKIP_PRESET, "SKIP_PRESET", 0, "Skip Preset", "Do not write in presets"}, + {PROP_ANIMATABLE, "ANIMATABLE", 0, "Animatable", ""}, + {PROP_LIB_EXCEPTION, "LIBRARY_EDITABLE", 0, "Library Editable", ""}, + {PROP_PROPORTIONAL, "PROPORTIONAL", 0, "Adjust values proportionally to each other", ""}, {int(PROP_TEXTEDIT_UPDATE), "TEXTEDIT_UPDATE", 0, "Update on every keystroke in textedit 'mode'", - PROP_TEXTEDIT_UPDATE_DESCR}, - {PROP_PATH_OUTPUT, "OUTPUT_PATH", 0, "Output Path", PROP_PATH_OUTPUT_DESCR}, + ""}, + {PROP_PATH_OUTPUT, "OUTPUT_PATH", 0, "Output Path", ""}, {0, nullptr, 0, nullptr, nullptr}, }; /** Only for enum type properties. */ const EnumPropertyItem rna_enum_property_flag_enum_items[] = { - {PROP_HIDDEN, "HIDDEN", 0, "Hidden", PROP_HIDDEN_DESCR}, - {PROP_SKIP_SAVE, "SKIP_SAVE", 0, "Skip Save", PROP_SKIP_SAVE_DESCR}, - {PROP_ANIMATABLE, "ANIMATABLE", 0, "Animatable", PROP_ANIMATABLE_DESCR}, - {PROP_LIB_EXCEPTION, "LIBRARY_EDITABLE", 0, "Library Editable", PROP_LIB_EXCEPTION_DESCR}, - {PROP_ENUM_FLAG, "ENUM_FLAG", 0, "Enum Flag", PROP_ENUM_FLAG_DESCR}, + {PROP_HIDDEN, "HIDDEN", 0, "Hidden", ""}, + {PROP_SKIP_SAVE, "SKIP_SAVE", 0, "Skip Save", ""}, + {PROP_ANIMATABLE, "ANIMATABLE", 0, "Animatable", ""}, + {PROP_LIB_EXCEPTION, "LIBRARY_EDITABLE", 0, "Library Editable", ""}, + {PROP_ENUM_FLAG, "ENUM_FLAG", 0, "Enum Flag", ""}, {0, nullptr, 0, nullptr, nullptr}, }; diff --git a/source/blender/makesrna/intern/rna_scene.cc b/source/blender/makesrna/intern/rna_scene.cc index a622916d158..bbe87c44ad1 100644 --- a/source/blender/makesrna/intern/rna_scene.cc +++ b/source/blender/makesrna/intern/rna_scene.cc @@ -31,7 +31,7 @@ #include "BLI_math_vector.h" #include "BLI_string_utf8_symbols.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_armature.hh" #include "BKE_editmesh.hh" @@ -384,8 +384,18 @@ const EnumPropertyItem rna_enum_image_type_items[] = { IMAGE_TYPE_ITEMS_IMAGE_ONLY RNA_ENUM_ITEM_HEADING(N_("Movie"), nullptr), + {R_IMF_IMTYPE_AVIJPEG, + "AVI_JPEG", + ICON_FILE_MOVIE, + "AVI JPEG", + "Output video in AVI JPEG format"}, + {R_IMF_IMTYPE_AVIRAW, "AVI_RAW", ICON_FILE_MOVIE, "AVI Raw", "Output video in AVI Raw format"}, #ifdef WITH_FFMPEG - {R_IMF_IMTYPE_FFMPEG, "FFMPEG", ICON_FILE_MOVIE, "FFmpeg Video", ""}, + {R_IMF_IMTYPE_FFMPEG, + "FFMPEG", + ICON_FILE_MOVIE, + "FFmpeg Video", + "The most versatile way to output video files"}, #endif {0, nullptr, 0, nullptr, nullptr}, }; @@ -719,10 +729,10 @@ const EnumPropertyItem rna_enum_grease_pencil_selectmode_items[] = { # include "BKE_animsys.h" # include "BKE_bake_geometry_nodes_modifier.hh" # include "BKE_brush.hh" -# include "BKE_collection.hh" +# include "BKE_collection.h" # include "BKE_context.hh" # include "BKE_freestyle.h" -# include "BKE_global.hh" +# include "BKE_global.h" # include "BKE_gpencil_legacy.h" # include "BKE_idprop.h" # include "BKE_image.h" @@ -730,9 +740,9 @@ const EnumPropertyItem rna_enum_grease_pencil_selectmode_items[] = { # include "BKE_layer.hh" # include "BKE_main.hh" # include "BKE_mesh.hh" -# include "BKE_node.hh" +# include "BKE_node.h" # include "BKE_pointcache.h" -# include "BKE_scene.hh" +# include "BKE_scene.h" # include "BKE_screen.hh" # include "BKE_unit.hh" @@ -960,7 +970,7 @@ static void rna_Scene_camera_update(Main *bmain, Scene * /*scene_unused*/, Point Scene *scene = (Scene *)ptr->data; WM_windows_scene_data_sync(&wm->windows, scene); - DEG_id_tag_update(&scene->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&scene->id, ID_RECALC_COPY_ON_WRITE); DEG_relations_tag_update(bmain); } @@ -1721,7 +1731,7 @@ static void rna_RenderSettings_engine_set(PointerRNA *ptr, int value) if (type) { STRNCPY_UTF8(rd->engine, type->idname); - DEG_id_tag_update(ptr->owner_id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(ptr->owner_id, ID_RECALC_COPY_ON_WRITE); } } @@ -1788,7 +1798,7 @@ void rna_Scene_render_update(Main * /*bmain*/, Scene * /*scene*/, PointerRNA *pt { Scene *scene = (Scene *)ptr->owner_id; - DEG_id_tag_update(&scene->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&scene->id, ID_RECALC_COPY_ON_WRITE); } static void rna_Scene_world_update(Main *bmain, Scene *scene, PointerRNA *ptr) @@ -1818,14 +1828,14 @@ void rna_Scene_freestyle_update(Main * /*bmain*/, Scene * /*scene*/, PointerRNA { Scene *scene = (Scene *)ptr->owner_id; - DEG_id_tag_update(&scene->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&scene->id, ID_RECALC_COPY_ON_WRITE); } void rna_Scene_use_freestyle_update(Main * /*bmain*/, Scene * /*scene*/, PointerRNA *ptr) { Scene *scene = (Scene *)ptr->owner_id; - DEG_id_tag_update(&scene->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&scene->id, ID_RECALC_COPY_ON_WRITE); if (scene->nodetree) { ntreeCompositUpdateRLayers(scene->nodetree); @@ -1860,7 +1870,7 @@ static void rna_SceneRenderView_name_set(PointerRNA *ptr, const char *value) sizeof(rv->name)); } -void rna_ViewLayer_override_update(Main *bmain, Scene * /*scene*/, PointerRNA *ptr) +void rna_ViewLayer_material_override_update(Main *bmain, Scene * /*scene*/, PointerRNA *ptr) { Scene *scene = (Scene *)ptr->owner_id; rna_Scene_render_update(bmain, scene, ptr); @@ -1918,19 +1928,6 @@ static std::optional rna_ViewLayerEEVEE_path(const PointerRNA *ptr) return rna_path; } -static void rna_SceneEEVEE_gi_cubemap_resolution_update(Main * /*main*/, - Scene *scene, - PointerRNA * /*ptr*/) -{ - /* Tag all light probes to recalc transform. This signals EEVEE to update the light probes. */ - FOREACH_SCENE_OBJECT_BEGIN (scene, ob) { - if (ob->type == OB_LIGHTPROBE) { - DEG_id_tag_update(&ob->id, ID_RECALC_TRANSFORM); - } - } - FOREACH_SCENE_OBJECT_END; -} - static std::optional rna_SceneRenderView_path(const PointerRNA *ptr) { const SceneRenderView *srv = (SceneRenderView *)ptr->data; @@ -1961,7 +1958,7 @@ static void rna_Physics_update(Main * /*bmain*/, Scene * /*scene*/, PointerRNA * } FOREACH_SCENE_OBJECT_END; - DEG_id_tag_update(&scene->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&scene->id, ID_RECALC_COPY_ON_WRITE); } static void rna_Scene_editmesh_select_mode_set(PointerRNA *ptr, const bool *value) @@ -2093,7 +2090,7 @@ static void rna_Scene_simplify_update_impl(Main *bmain, WM_main_add_notifier(NC_GEOM | ND_DATA, nullptr); WM_main_add_notifier(NC_OBJECT | ND_DRAW, nullptr); - DEG_id_tag_update(&sce->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&sce->id, ID_RECALC_COPY_ON_WRITE); } static void rna_Scene_use_simplify_update(bContext *C, PointerRNA *ptr) @@ -2472,7 +2469,7 @@ FreestyleLineSet *rna_FreestyleSettings_lineset_add(ID *id, Scene *scene = (Scene *)id; FreestyleLineSet *lineset = BKE_freestyle_lineset_add(bmain, (FreestyleConfig *)config, name); - DEG_id_tag_update(&scene->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&scene->id, ID_RECALC_COPY_ON_WRITE); WM_main_add_notifier(NC_SCENE | ND_RENDER_OPTIONS, nullptr); return lineset; @@ -2493,7 +2490,7 @@ void rna_FreestyleSettings_lineset_remove(ID *id, RNA_POINTER_INVALIDATE(lineset_ptr); - DEG_id_tag_update(&scene->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&scene->id, ID_RECALC_COPY_ON_WRITE); WM_main_add_notifier(NC_SCENE | ND_RENDER_OPTIONS, nullptr); } @@ -2530,7 +2527,7 @@ FreestyleModuleConfig *rna_FreestyleSettings_module_add(ID *id, FreestyleSetting Scene *scene = (Scene *)id; FreestyleModuleConfig *module = BKE_freestyle_module_add((FreestyleConfig *)config); - DEG_id_tag_update(&scene->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&scene->id, ID_RECALC_COPY_ON_WRITE); WM_main_add_notifier(NC_SCENE | ND_RENDER_OPTIONS, nullptr); return module; @@ -2559,7 +2556,7 @@ void rna_FreestyleSettings_module_remove(ID *id, RNA_POINTER_INVALIDATE(module_ptr); - DEG_id_tag_update(&scene->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&scene->id, ID_RECALC_COPY_ON_WRITE); WM_main_add_notifier(NC_SCENE | ND_RENDER_OPTIONS, nullptr); } @@ -3518,40 +3515,6 @@ static void rna_def_tool_settings(BlenderRNA *brna) "Absolute grid alignment while translating (based on the pivot center)"); RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, nullptr); /* header redraw */ - prop = RNA_def_property(srna, "snap_angle_increment_2d", PROP_FLOAT, PROP_ANGLE); - RNA_def_property_float_sdna(prop, nullptr, "snap_angle_increment_2d"); - RNA_def_property_ui_text( - prop, "Rotation Increment", "Angle used for rotation increments in 2D editors"); - RNA_def_property_range(prop, 0, DEG2RADF(180.0f)); - RNA_def_property_ui_range(prop, DEG2RADF(1.0f), DEG2RADF(180.0f), 100.0f, 2); - RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, nullptr); /* header redraw */ - - prop = RNA_def_property(srna, "snap_angle_increment_2d_precision", PROP_FLOAT, PROP_ANGLE); - RNA_def_property_float_sdna(prop, nullptr, "snap_angle_increment_2d_precision"); - RNA_def_property_ui_text(prop, - "Rotation Precision Increment", - "Precision angle used for rotation increments in 2D editors"); - RNA_def_property_range(prop, 0, DEG2RADF(180.0f)); - RNA_def_property_ui_range(prop, DEG2RADF(0.1f), DEG2RADF(180.0f), 10.0f, 3); - RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, nullptr); /* header redraw */ - - prop = RNA_def_property(srna, "snap_angle_increment_3d", PROP_FLOAT, PROP_ANGLE); - RNA_def_property_float_sdna(prop, nullptr, "snap_angle_increment_3d"); - RNA_def_property_ui_text( - prop, "Rotation Increment", "Angle used for rotation increments in 3D editors"); - RNA_def_property_range(prop, 0, DEG2RADF(180.0f)); - RNA_def_property_ui_range(prop, DEG2RADF(1.0f), DEG2RADF(180.0f), 100.0f, 2); - RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, nullptr); /* header redraw */ - - prop = RNA_def_property(srna, "snap_angle_increment_3d_precision", PROP_FLOAT, PROP_ANGLE); - RNA_def_property_float_sdna(prop, nullptr, "snap_angle_increment_3d_precision"); - RNA_def_property_ui_text(prop, - "Rotation Precision Increment", - "Precision angle used for rotation increments in 3D editors"); - RNA_def_property_range(prop, 0, DEG2RADF(180.0f)); - RNA_def_property_ui_range(prop, DEG2RADF(0.1f), DEG2RADF(180.0f), 10.0f, 3); - RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, nullptr); /* header redraw */ - prop = RNA_def_property(srna, "snap_elements", PROP_ENUM, PROP_NONE); RNA_def_property_enum_bitflag_sdna(prop, nullptr, "snap_mode"); RNA_def_property_flag(prop, PROP_DEG_SYNC_ONLY); @@ -3569,8 +3532,7 @@ static void rna_def_tool_settings(BlenderRNA *brna) RNA_def_property_enum_funcs( prop, "rna_ToolSettings_snap_mode_get", "rna_ToolSettings_snap_mode_set", nullptr); RNA_def_property_flag(prop, PROP_ENUM_FLAG); - RNA_def_property_ui_text( - prop, "Snap Element", "Type of element for the \"Snap With\" to snap to"); + RNA_def_property_ui_text(prop, "Snap Element", "Type of element for the 'Snap With' to snap to"); RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, nullptr); /* header redraw */ prop = RNA_def_property(srna, "snap_elements_individual", PROP_ENUM, PROP_NONE); @@ -3599,9 +3561,9 @@ static void rna_def_tool_settings(BlenderRNA *brna) RNA_def_property_ui_text( prop, "Snap to Same Target", - "Snap only to target that source was initially near (\"Face Nearest\" only)"); + "Snap only to target that source was initially near (Face Nearest Only)"); - /* node editor uses its own set of snap modes */ + /* node editor uses own set of snap modes */ prop = RNA_def_property(srna, "snap_node_element", PROP_ENUM, PROP_NONE); RNA_def_property_enum_bitflag_sdna(prop, nullptr, "snap_node_mode"); RNA_def_property_flag(prop, PROP_DEG_SYNC_ONLY); @@ -3627,11 +3589,11 @@ static void rna_def_tool_settings(BlenderRNA *brna) RNA_def_property_enum_bitflag_sdna(prop, nullptr, "snap_anim_mode"); RNA_def_property_flag(prop, PROP_DEG_SYNC_ONLY); RNA_def_property_enum_items(prop, rna_enum_snap_animation_element_items); - RNA_def_property_ui_text(prop, "Snap Animation Element", "Type of element to snap to"); + RNA_def_property_ui_text(prop, "Snap Anim Element", "Type of element to snap to"); RNA_def_property_translation_context(prop, BLT_I18NCONTEXT_UNIT); RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, nullptr); /* header redraw */ - /* image editor uses its own set of snap modes */ + /* image editor uses own set of snap modes */ prop = RNA_def_property(srna, "snap_uv_element", PROP_ENUM, PROP_NONE); RNA_def_property_enum_bitflag_sdna(prop, nullptr, "snap_uv_mode"); RNA_def_property_flag(prop, PROP_DEG_SYNC_ONLY); @@ -3677,21 +3639,21 @@ static void rna_def_tool_settings(BlenderRNA *brna) RNA_def_property_boolean_negative_sdna(prop, nullptr, "snap_flag", SCE_SNAP_NOT_TO_ACTIVE); RNA_def_property_flag(prop, PROP_DEG_SYNC_ONLY); RNA_def_property_ui_text( - prop, "Snap onto Active", "Snap onto itself only if enabled (edit mode only)"); + prop, "Snap onto Active", "Snap onto itself only if enabled (Edit Mode Only)"); RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, nullptr); /* header redraw */ prop = RNA_def_property(srna, "use_snap_edit", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, nullptr, "snap_flag", SCE_SNAP_TO_INCLUDE_EDITED); RNA_def_property_flag(prop, PROP_DEG_SYNC_ONLY); RNA_def_property_ui_text( - prop, "Snap onto Edited", "Snap onto non-active objects in edit mode (edit mode only)"); + prop, "Snap onto Edited", "Snap onto non-active objects in Edit Mode (Edit Mode Only)"); RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, nullptr); /* header redraw */ prop = RNA_def_property(srna, "use_snap_nonedit", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, nullptr, "snap_flag", SCE_SNAP_TO_INCLUDE_NONEDITED); RNA_def_property_flag(prop, PROP_DEG_SYNC_ONLY); RNA_def_property_ui_text( - prop, "Snap onto Non-edited", "Snap onto objects not in edit mode (edit mode only)"); + prop, "Snap onto Non-edited", "Snap onto objects not in Edit Mode (Edit Mode Only)"); RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, nullptr); /* header redraw */ prop = RNA_def_property(srna, "use_snap_selectable", PROP_BOOLEAN, PROP_NONE); @@ -3777,7 +3739,9 @@ static void rna_def_tool_settings(BlenderRNA *brna) RNA_def_property_boolean_sdna(prop, nullptr, "gpencil_flags", GP_TOOL_FLAG_PAINT_ONBACK); RNA_def_property_flag(prop, PROP_DEG_SYNC_ONLY); RNA_def_property_ui_text( - prop, "Draw Strokes on Back", "New strokes are drawn below of all strokes in the layer"); + prop, + "Draw Strokes on Back", + "When draw new strokes, the new stroke is drawn below of all strokes in the layer"); RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, nullptr); prop = RNA_def_property(srna, "use_gpencil_thumbnail_list", PROP_BOOLEAN, PROP_NONE); @@ -3785,7 +3749,7 @@ static void rna_def_tool_settings(BlenderRNA *brna) prop, nullptr, "gpencil_flags", GP_TOOL_FLAG_THUMBNAIL_LIST); RNA_def_property_flag(prop, PROP_DEG_SYNC_ONLY); RNA_def_property_ui_text( - prop, "Compact List", "Show compact list of colors instead of thumbnails"); + prop, "Compact List", "Show compact list of color instead of thumbnails"); RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, nullptr); prop = RNA_def_property(srna, "use_gpencil_weight_data_add", PROP_BOOLEAN, PROP_NONE); @@ -3793,8 +3757,9 @@ static void rna_def_tool_settings(BlenderRNA *brna) RNA_def_property_flag(prop, PROP_DEG_SYNC_ONLY); RNA_def_property_ui_text(prop, "Add weight data for new strokes", - "Weight data for new strokes is added according to the current vertex " - "group and weight. If no vertex group selected, weight is not added"); + "When creating new strokes, the weight data is added according to the " + "current vertex group and weight, " + "if no vertex group selected, weight is not added"); RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, nullptr); prop = RNA_def_property(srna, "use_gpencil_automerge_strokes", PROP_BOOLEAN, PROP_NONE); @@ -3805,7 +3770,7 @@ static void rna_def_tool_settings(BlenderRNA *brna) RNA_def_property_ui_text( prop, "Automerge", - "Join the last drawn stroke with previous strokes in the active layer by distance"); + "Join by distance last drawn stroke with previous strokes in the active layer"); RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, nullptr); @@ -3821,7 +3786,7 @@ static void rna_def_tool_settings(BlenderRNA *brna) RNA_def_property_flag(prop, PROP_DEG_SYNC_ONLY); RNA_def_property_struct_type(prop, "GPencilInterpolateSettings"); RNA_def_property_ui_text( - prop, "Grease Pencil Interpolate", "Settings for grease pencil interpolation tools"); + prop, "Grease Pencil Interpolate", "Settings for Grease Pencil Interpolation tools"); /* Grease Pencil - 3D View Stroke Placement */ prop = RNA_def_property(srna, "gpencil_stroke_placement_view3d", PROP_ENUM, PROP_NONE); @@ -3848,8 +3813,7 @@ static void rna_def_tool_settings(BlenderRNA *brna) prop = RNA_def_property(srna, "gpencil_surface_offset", PROP_FLOAT, PROP_DISTANCE); RNA_def_property_float_sdna(prop, nullptr, "gpencil_surface_offset"); RNA_def_property_flag(prop, PROP_DEG_SYNC_ONLY); - RNA_def_property_ui_text( - prop, "Surface Offset", "Offset along the normal when drawing on surfaces"); + RNA_def_property_ui_text(prop, "Surface Offset", "Offset along normal when drawing on surfaces"); RNA_def_property_range(prop, 0.0f, 1.0f); RNA_def_property_ui_range(prop, 0.0f, 1.0f, 0.1f, 3); RNA_def_property_float_default(prop, 0.150f); @@ -3879,7 +3843,7 @@ static void rna_def_tool_settings(BlenderRNA *brna) RNA_def_property_boolean_sdna( prop, nullptr, "gpencil_selectmode_sculpt", GP_SCULPT_MASK_SELECTMODE_STROKE); RNA_def_property_flag(prop, PROP_DEG_SYNC_ONLY); - RNA_def_property_ui_text(prop, "Selection Mask", "Only sculpt selected strokes"); + RNA_def_property_ui_text(prop, "Selection Mask", "Only sculpt selected stroke"); RNA_def_property_ui_icon(prop, ICON_GP_SELECT_STROKES, 0); RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); RNA_def_property_flag(prop, PROP_CONTEXT_UPDATE); @@ -3912,7 +3876,7 @@ static void rna_def_tool_settings(BlenderRNA *brna) RNA_def_property_boolean_sdna( prop, nullptr, "gpencil_selectmode_vertex", GP_VERTEX_MASK_SELECTMODE_STROKE); RNA_def_property_flag(prop, PROP_DEG_SYNC_ONLY); - RNA_def_property_ui_text(prop, "Selection Mask", "Only paint selected strokes"); + RNA_def_property_ui_text(prop, "Selection Mask", "Only paint selected stroke"); RNA_def_property_ui_icon(prop, ICON_GP_SELECT_STROKES, 0); RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); RNA_def_property_flag(prop, PROP_CONTEXT_UPDATE); @@ -3975,7 +3939,7 @@ static void rna_def_tool_settings(BlenderRNA *brna) RNA_def_property_boolean_sdna(prop, nullptr, "autokey_mode", AUTOKEY_ON); RNA_def_property_flag(prop, PROP_DEG_SYNC_ONLY); RNA_def_property_ui_text( - prop, "Auto Keying", "Automatic keyframe insertion for objects, bones and masks"); + prop, "Auto Keying", "Automatic keyframe insertion for Objects, Bones and Masks"); RNA_def_property_ui_icon(prop, ICON_RECORD_OFF, 1); prop = RNA_def_property(srna, "auto_keying_mode", PROP_ENUM, PROP_NONE); @@ -3984,7 +3948,7 @@ static void rna_def_tool_settings(BlenderRNA *brna) RNA_def_property_enum_items(prop, auto_key_items); RNA_def_property_ui_text(prop, "Auto-Keying Mode", - "Mode of automatic keyframe insertion for objects, bones and masks"); + "Mode of automatic keyframe insertion for Objects, Bones and Masks"); prop = RNA_def_property(srna, "use_record_with_nla", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, nullptr, "keying_flag", AUTOKEY_FLAG_LAYERED_RECORD); @@ -4074,7 +4038,7 @@ static void rna_def_tool_settings(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Live Unwrap", "Changing edge seams recalculates UV unwrap"); prop = RNA_def_property(srna, "normal_vector", PROP_FLOAT, PROP_XYZ); - RNA_def_property_ui_text(prop, "Normal Vector", "Normal vector used to copy, add or multiply"); + RNA_def_property_ui_text(prop, "Normal Vector", "Normal Vector used to copy, add or multiply"); RNA_def_property_ui_range(prop, -10000.0, 10000.0, 1, 3); /* Unified Paint Settings */ @@ -4770,15 +4734,8 @@ void rna_def_view_layer_common(BlenderRNA *brna, StructRNA *srna, const bool sce RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_LIBRARY); RNA_def_property_ui_text( prop, "Material Override", "Material to override all other materials in this view layer"); - RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, "rna_ViewLayer_override_update"); - - prop = RNA_def_property(srna, "world_override", PROP_POINTER, PROP_NONE); - RNA_def_property_pointer_sdna(prop, nullptr, "world_override"); - RNA_def_property_struct_type(prop, "World"); - RNA_def_property_flag(prop, PROP_EDITABLE); - RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_LIBRARY); - RNA_def_property_ui_text(prop, "World Override", "Override world in this view layer"); - RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, "rna_ViewLayer_override_update"); + RNA_def_property_update( + prop, NC_SCENE | ND_RENDER_OPTIONS, "rna_ViewLayer_material_override_update"); prop = RNA_def_property(srna, "samples", PROP_INT, PROP_UNSIGNED); RNA_def_property_ui_text(prop, @@ -6068,6 +6025,7 @@ static void rna_def_image_format_stereo3d_format(BlenderRNA *brna) srna = RNA_def_struct(brna, "Stereo3dFormat", nullptr); RNA_def_struct_sdna(srna, "Stereo3dFormat"); + RNA_def_struct_clear_flag(srna, STRUCT_UNDO); RNA_def_struct_ui_text(srna, "Stereo Output", "Settings for stereo output"); prop = RNA_def_property(srna, "display_mode", PROP_ENUM, PROP_NONE); @@ -6648,17 +6606,6 @@ static void rna_def_scene_render_data(BlenderRNA *brna) {0, nullptr, 0, nullptr, nullptr}, }; - static const EnumPropertyItem motion_blur_position_items[] = { - {SCE_MB_START, "START", 0, "Start on Frame", "The shutter opens at the current frame"}, - {SCE_MB_CENTER, - "CENTER", - 0, - "Center on Frame", - "The shutter is open during the current frame"}, - {SCE_MB_END, "END", 0, "End on Frame", "The shutter closes at the current frame"}, - {0, nullptr, 0, nullptr, nullptr}, - }; - static const EnumPropertyItem hair_shape_type_items[] = { {SCE_HAIR_SHAPE_STRAND, "STRAND", 0, "Strand", ""}, {SCE_HAIR_SHAPE_STRIP, "STRIP", 0, "Strip", ""}, @@ -6837,20 +6784,12 @@ static void rna_def_scene_render_data(BlenderRNA *brna) RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, "rna_Scene_render_update"); prop = RNA_def_property(srna, "motion_blur_shutter", PROP_FLOAT, PROP_FACTOR); + RNA_def_property_float_sdna(prop, nullptr, "blurfac"); RNA_def_property_range(prop, 0.0f, FLT_MAX); RNA_def_property_ui_range(prop, 0.01f, 1.0f, 1, 2); RNA_def_property_ui_text(prop, "Shutter", "Time taken in frames between shutter open and close"); RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, "rna_Scene_render_update"); - prop = RNA_def_property(srna, "motion_blur_position", PROP_ENUM, PROP_NONE); - RNA_def_property_enum_items(prop, motion_blur_position_items); - RNA_def_property_ui_text(prop, - "Motion Blur Position", - "Offset for the shutter's time interval, " - "allows to change the motion blur trails"); - RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_LIBRARY); - RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, nullptr); - prop = RNA_def_property(srna, "motion_blur_shutter_curve", PROP_POINTER, PROP_NONE); RNA_def_property_pointer_sdna(prop, nullptr, "mblur_shutter_curve"); RNA_def_property_struct_type(prop, "CurveMapping"); @@ -7818,6 +7757,17 @@ static void rna_def_scene_eevee(BlenderRNA *brna) {0, nullptr, 0, nullptr, nullptr}, }; + static const EnumPropertyItem eevee_motion_blur_position_items[] = { + {SCE_EEVEE_MB_START, "START", 0, "Start on Frame", "The shutter opens at the current frame"}, + {SCE_EEVEE_MB_CENTER, + "CENTER", + 0, + "Center on Frame", + "The shutter is open during the current frame"}, + {SCE_EEVEE_MB_END, "END", 0, "End on Frame", "The shutter closes at the current frame"}, + {0, nullptr, 0, nullptr, nullptr}, + }; + static const EnumPropertyItem ray_tracing_method_items[] = { {RAYTRACE_EEVEE_METHOD_NONE, "NONE", 0, "None", "No intersection with scene geometry"}, {RAYTRACE_EEVEE_METHOD_SCREEN, @@ -7845,7 +7795,6 @@ static void rna_def_scene_eevee(BlenderRNA *brna) RNA_def_property_enum_items(prop, eevee_shadow_size_items); RNA_def_property_ui_text(prop, "Cubemap Size", "Size of every cubemaps"); RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_LIBRARY); - RNA_def_property_update(prop, 0, "rna_SceneEEVEE_gi_cubemap_resolution_update"); prop = RNA_def_property(srna, "gi_visibility_resolution", PROP_ENUM, PROP_NONE); RNA_def_property_enum_items(prop, eevee_gi_visibility_size_items); @@ -8283,6 +8232,19 @@ static void rna_def_scene_eevee(BlenderRNA *brna) RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, nullptr); /* Motion blur */ + prop = RNA_def_property(srna, "use_motion_blur", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, nullptr, "flag", SCE_EEVEE_MOTION_BLUR_ENABLED); + RNA_def_property_ui_text(prop, "Motion Blur", "Enable motion blur effect (only in camera view)"); + RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_LIBRARY); + RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, nullptr); + + prop = RNA_def_property(srna, "motion_blur_shutter", PROP_FLOAT, PROP_FACTOR); + RNA_def_property_ui_text(prop, "Shutter", "Time taken in frames between shutter open and close"); + RNA_def_property_range(prop, 0.0f, FLT_MAX); + RNA_def_property_ui_range(prop, 0.01f, 1.0f, 1, 2); + RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_LIBRARY); + RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, nullptr); + prop = RNA_def_property(srna, "motion_blur_depth_scale", PROP_FLOAT, PROP_NONE); RNA_def_property_ui_text(prop, "Background Separation", @@ -8310,6 +8272,15 @@ static void rna_def_scene_eevee(BlenderRNA *brna) RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_LIBRARY); RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, nullptr); + prop = RNA_def_property(srna, "motion_blur_position", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_items(prop, eevee_motion_blur_position_items); + RNA_def_property_ui_text(prop, + "Motion Blur Position", + "Offset for the shutter's time interval, " + "allows to change the motion blur trails"); + RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_LIBRARY); + RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, nullptr); + /* Shadows */ prop = RNA_def_property(srna, "use_shadows", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, nullptr, "flag", SCE_EEVEE_SHADOW_ENABLED); diff --git a/source/blender/makesrna/intern/rna_scene_api.cc b/source/blender/makesrna/intern/rna_scene_api.cc index f480cc461e2..a75475d52a3 100644 --- a/source/blender/makesrna/intern/rna_scene_api.cc +++ b/source/blender/makesrna/intern/rna_scene_api.cc @@ -31,10 +31,10 @@ #ifdef RNA_RUNTIME # include "BKE_editmesh.hh" -# include "BKE_global.hh" +# include "BKE_global.h" # include "BKE_image.h" -# include "BKE_scene.hh" -# include "BKE_writemovie.hh" +# include "BKE_scene.h" +# include "BKE_writeavi.h" # include "DEG_depsgraph_query.hh" diff --git a/source/blender/makesrna/intern/rna_screen.cc b/source/blender/makesrna/intern/rna_screen.cc index e2868bc391c..a02b6c6c809 100644 --- a/source/blender/makesrna/intern/rna_screen.cc +++ b/source/blender/makesrna/intern/rna_screen.cc @@ -56,7 +56,7 @@ static const EnumPropertyItem rna_enum_region_panel_category_items[] = { # include "RNA_access.hh" -# include "BKE_global.hh" +# include "BKE_global.h" # include "BKE_screen.hh" # include "BKE_workspace.h" @@ -64,7 +64,7 @@ static const EnumPropertyItem rna_enum_region_panel_category_items[] = { # include "UI_view2d.hh" -# include "BLT_translation.hh" +# include "BLT_translation.h" # ifdef WITH_PYTHON # include "BPY_extern.h" diff --git a/source/blender/makesrna/intern/rna_sculpt_paint.cc b/source/blender/makesrna/intern/rna_sculpt_paint.cc index 9d35a4863c2..edddba74f16 100644 --- a/source/blender/makesrna/intern/rna_sculpt_paint.cc +++ b/source/blender/makesrna/intern/rna_sculpt_paint.cc @@ -109,7 +109,7 @@ const EnumPropertyItem rna_enum_symmetrize_direction_items[] = { #ifdef RNA_RUNTIME # include "MEM_guardedalloc.h" -# include "BKE_collection.hh" +# include "BKE_collection.h" # include "BKE_context.hh" # include "BKE_gpencil_legacy.h" # include "BKE_object.hh" @@ -180,7 +180,7 @@ static void rna_ParticleEdit_redo(bContext *C, PointerRNA * /*ptr*/) BKE_particle_batch_cache_dirty_tag(edit->psys, BKE_PARTICLE_BATCH_DIRTY_ALL); psys_free_path_cache(edit->psys, edit); - DEG_id_tag_update(&scene->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&scene->id, ID_RECALC_COPY_ON_WRITE); } static void rna_ParticleEdit_update(bContext *C, PointerRNA * /*ptr*/) @@ -195,7 +195,7 @@ static void rna_ParticleEdit_update(bContext *C, PointerRNA * /*ptr*/) } /* Sync tool setting changes from original to evaluated scenes. */ - DEG_id_tag_update(&scene->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&scene->id, ID_RECALC_COPY_ON_WRITE); } static void rna_ParticleEdit_tool_set(PointerRNA *ptr, int value) diff --git a/source/blender/makesrna/intern/rna_sequencer.cc b/source/blender/makesrna/intern/rna_sequencer.cc index 5bbba8de437..65284bfa3e2 100644 --- a/source/blender/makesrna/intern/rna_sequencer.cc +++ b/source/blender/makesrna/intern/rna_sequencer.cc @@ -22,9 +22,9 @@ #include "BLI_string_utf8_symbols.h" #include "BLI_string_utils.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" -#include "BKE_anim_data.hh" +#include "BKE_anim_data.h" #include "BKE_animsys.h" #include "BKE_sound.h" @@ -115,10 +115,10 @@ const EnumPropertyItem rna_enum_strip_color_items[] = { # include -# include "BKE_global.hh" +# include "BKE_global.h" # include "BKE_idprop.h" # include "BKE_movieclip.h" -# include "BKE_report.hh" +# include "BKE_report.h" # include "WM_api.hh" @@ -205,13 +205,13 @@ static void rna_Sequence_use_sequence(Main *bmain, Scene *scene, PointerRNA *ptr { /* General update callback. */ rna_Sequence_invalidate_raw_update(bmain, scene, ptr); - /* Changing recursion changes set of IDs which needs to be remapped by the copy-on-evaluation. - * the only way for this currently is to tag the ID for ID_RECALC_SYNC_TO_EVAL. */ + /* Changing recursion changes set of IDs which needs to be remapped by the copy-on-write. + * the only way for this currently is to tag the ID for ID_RECALC_COPY_ON_WRITE. */ Editing *ed = SEQ_editing_get(scene); if (ed) { Sequence *seq = (Sequence *)ptr->data; if (seq->scene != nullptr) { - DEG_id_tag_update(&seq->scene->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&seq->scene->id, ID_RECALC_COPY_ON_WRITE); } } /* The sequencer scene is to be updated as well, including new relations from the nested @@ -3750,7 +3750,7 @@ static void rna_def_brightcontrast_modifier(BlenderRNA *brna) prop = RNA_def_property(srna, "bright", PROP_FLOAT, PROP_UNSIGNED); RNA_def_property_float_sdna(prop, nullptr, "bright"); RNA_def_property_range(prop, -FLT_MAX, FLT_MAX); - RNA_def_property_ui_text(prop, "Brightness", "Adjust the luminosity of the colors"); + RNA_def_property_ui_text(prop, "Bright", "Adjust the luminosity of the colors"); RNA_def_property_update(prop, NC_SCENE | ND_SEQUENCER, "rna_SequenceModifier_update"); prop = RNA_def_property(srna, "contrast", PROP_FLOAT, PROP_UNSIGNED); diff --git a/source/blender/makesrna/intern/rna_sequencer_api.cc b/source/blender/makesrna/intern/rna_sequencer_api.cc index 014f7270c56..501e366333b 100644 --- a/source/blender/makesrna/intern/rna_sequencer_api.cc +++ b/source/blender/makesrna/intern/rna_sequencer_api.cc @@ -35,7 +35,7 @@ # include "BKE_mask.h" # include "BKE_movieclip.h" -# include "BKE_report.hh" +# include "BKE_report.h" # include "BKE_sound.h" # include "IMB_imbuf.hh" diff --git a/source/blender/makesrna/intern/rna_shader_fx.cc b/source/blender/makesrna/intern/rna_shader_fx.cc index 59153d4ffa0..2933dbdd21c 100644 --- a/source/blender/makesrna/intern/rna_shader_fx.cc +++ b/source/blender/makesrna/intern/rna_shader_fx.cc @@ -19,7 +19,7 @@ #include "BLI_math_rotation.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_animsys.h" diff --git a/source/blender/makesrna/intern/rna_space.cc b/source/blender/makesrna/intern/rna_space.cc index ee7bb2541c8..c9f7d2d1725 100644 --- a/source/blender/makesrna/intern/rna_space.cc +++ b/source/blender/makesrna/intern/rna_space.cc @@ -11,7 +11,7 @@ #include "MEM_guardedalloc.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_attribute.hh" #include "BKE_context.hh" @@ -19,7 +19,7 @@ #include "BKE_image.h" #include "BKE_key.hh" #include "BKE_movieclip.h" -#include "BKE_node.hh" +#include "BKE_node.h" #include "BKE_studiolight.h" #include "BKE_viewer_path.hh" @@ -551,17 +551,17 @@ static const EnumPropertyItem rna_enum_curve_display_handle_items[] = { # include "BLI_path_util.h" # include "BLI_string.h" -# include "BKE_anim_data.hh" +# include "BKE_anim_data.h" # include "BKE_brush.hh" # include "BKE_context.hh" -# include "BKE_global.hh" +# include "BKE_global.h" # include "BKE_icons.h" # include "BKE_idprop.h" # include "BKE_layer.hh" # include "BKE_nla.h" # include "BKE_paint.hh" # include "BKE_preferences.h" -# include "BKE_scene.hh" +# include "BKE_scene.h" # include "BKE_screen.hh" # include "BKE_workspace.h" @@ -3732,12 +3732,6 @@ static void rna_def_space_image_uv(BlenderRNA *brna) RNA_def_property_ui_text(prop, "UV Opacity", "Opacity of UV overlays"); RNA_def_property_update(prop, NC_SPACE | ND_SPACE_IMAGE, nullptr); - prop = RNA_def_property(srna, "stretch_opacity", PROP_FLOAT, PROP_FACTOR); - RNA_def_property_float_sdna(prop, nullptr, "stretch_opacity"); - RNA_def_property_range(prop, 0.0f, 1.0f); - RNA_def_property_ui_text(prop, "Stretch Opacity", "Opacity of the UV Stretch overlay"); - RNA_def_property_update(prop, NC_SPACE | ND_SPACE_IMAGE, nullptr); - prop = RNA_def_property(srna, "pixel_round_mode", PROP_ENUM, PROP_NONE); RNA_def_property_enum_items(prop, pixel_round_mode_items); RNA_def_property_ui_text(prop, "Round to Pixels", "Round UVs to pixels while editing"); @@ -3798,8 +3792,8 @@ static void rna_def_space_outliner(BlenderRNA *brna) {SO_ID_ORPHANS, "ORPHAN_DATA", ICON_ORPHAN_DATA, - "Unused Data", - "Display data that is unused and/or will be lost when the file is reloaded"}, + "Orphan Data", + "Display data-blocks which are unused and/or will be lost when the file is reloaded"}, {0, nullptr, 0, nullptr, nullptr}, }; @@ -6440,7 +6434,7 @@ static void rna_def_space_graph(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Show Handles", "Show handles of Bézier control points"); RNA_def_property_update(prop, NC_SPACE | ND_SPACE_GRAPH, nullptr); - prop = RNA_def_property(srna, "use_auto_lock_translation_axis", PROP_BOOLEAN, PROP_NONE); + prop = RNA_def_property(srna, "autolock_translation_axis", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, nullptr, "flag", SIPO_AUTOLOCK_AXIS); RNA_def_property_ui_text(prop, "Auto-Lock Key Axis", diff --git a/source/blender/makesrna/intern/rna_space_api.cc b/source/blender/makesrna/intern/rna_space_api.cc index 258c31ee511..411711d9551 100644 --- a/source/blender/makesrna/intern/rna_space_api.cc +++ b/source/blender/makesrna/intern/rna_space_api.cc @@ -15,7 +15,7 @@ #ifdef RNA_RUNTIME -# include "BKE_global.hh" +# include "BKE_global.h" # include "ED_fileselect.hh" # include "ED_screen.hh" diff --git a/source/blender/makesrna/intern/rna_speaker.cc b/source/blender/makesrna/intern/rna_speaker.cc index d85ef59e62e..d553fd378f1 100644 --- a/source/blender/makesrna/intern/rna_speaker.cc +++ b/source/blender/makesrna/intern/rna_speaker.cc @@ -16,7 +16,7 @@ #include "DNA_sound_types.h" #include "DNA_speaker_types.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #ifdef RNA_RUNTIME diff --git a/source/blender/makesrna/intern/rna_text.cc b/source/blender/makesrna/intern/rna_text.cc index 96411a00b1f..2499f7f896d 100644 --- a/source/blender/makesrna/intern/rna_text.cc +++ b/source/blender/makesrna/intern/rna_text.cc @@ -11,7 +11,7 @@ #include "MEM_guardedalloc.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_text.h" diff --git a/source/blender/makesrna/intern/rna_texture.cc b/source/blender/makesrna/intern/rna_texture.cc index 208f87e7c31..e922e5557f4 100644 --- a/source/blender/makesrna/intern/rna_texture.cc +++ b/source/blender/makesrna/intern/rna_texture.cc @@ -22,11 +22,11 @@ #include "BLI_utildefines.h" -#include "BKE_node.hh" +#include "BKE_node.h" #include "BKE_node_tree_update.hh" #include "BKE_paint.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "RNA_define.hh" #include "RNA_enum_types.hh" diff --git a/source/blender/makesrna/intern/rna_texture_api.cc b/source/blender/makesrna/intern/rna_texture_api.cc index b2033f3c2bc..4170dd38170 100644 --- a/source/blender/makesrna/intern/rna_texture_api.cc +++ b/source/blender/makesrna/intern/rna_texture_api.cc @@ -19,7 +19,7 @@ #ifdef RNA_RUNTIME # include "BKE_context.hh" -# include "BKE_global.hh" +# include "BKE_global.h" # include "BLI_math_vector.h" # include "DNA_scene_types.h" # include "IMB_imbuf.hh" diff --git a/source/blender/makesrna/intern/rna_timeline.cc b/source/blender/makesrna/intern/rna_timeline.cc index da67f2b0e79..cbb389f41b7 100644 --- a/source/blender/makesrna/intern/rna_timeline.cc +++ b/source/blender/makesrna/intern/rna_timeline.cc @@ -19,7 +19,7 @@ #ifdef RNA_RUNTIME # include "BKE_idprop.h" -# include "BKE_scene.hh" +# include "BKE_scene.h" # include "BKE_screen.hh" # include "WM_api.hh" diff --git a/source/blender/makesrna/intern/rna_tracking.cc b/source/blender/makesrna/intern/rna_tracking.cc index 0fe6cd9642d..047cff98c35 100644 --- a/source/blender/makesrna/intern/rna_tracking.cc +++ b/source/blender/makesrna/intern/rna_tracking.cc @@ -15,7 +15,7 @@ #include "BKE_node_tree_update.hh" #include "BKE_tracking.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "RNA_access.hh" #include "RNA_define.hh" @@ -35,10 +35,10 @@ # include "BLI_math_vector.h" -# include "BKE_anim_data.hh" +# include "BKE_anim_data.h" # include "BKE_animsys.h" -# include "BKE_node.hh" -# include "BKE_report.hh" +# include "BKE_node.h" +# include "BKE_report.h" # include "DEG_depsgraph.hh" diff --git a/source/blender/makesrna/intern/rna_ui.cc b/source/blender/makesrna/intern/rna_ui.cc index 991c4fb4df3..085b4773937 100644 --- a/source/blender/makesrna/intern/rna_ui.cc +++ b/source/blender/makesrna/intern/rna_ui.cc @@ -11,7 +11,7 @@ #include "DNA_screen_types.h" #include "DNA_space_types.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_file_handler.hh" #include "BKE_idprop.h" @@ -63,7 +63,7 @@ const EnumPropertyItem rna_enum_uilist_layout_type_items[] = { # include "BKE_context.hh" # include "BKE_main.hh" -# include "BKE_report.hh" +# include "BKE_report.h" # include "BKE_screen.hh" # include "ED_asset_library.hh" diff --git a/source/blender/makesrna/intern/rna_ui_api.cc b/source/blender/makesrna/intern/rna_ui_api.cc index fa2cac3b744..4b8f45cc3e6 100644 --- a/source/blender/makesrna/intern/rna_ui_api.cc +++ b/source/blender/makesrna/intern/rna_ui_api.cc @@ -11,7 +11,7 @@ #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "RNA_define.hh" #include "RNA_enum_types.hh" @@ -37,7 +37,6 @@ const EnumPropertyItem rna_enum_icon_items[] = { # include "DNA_asset_types.h" -# include "ED_asset_filter.hh" # include "ED_geometry.hh" # include "ED_node.hh" # include "ED_object.hh" @@ -517,11 +516,6 @@ static void rna_uiItemProgress(uiLayout *layout, uiItemProgressIndicator(layout, text, factor, eButProgressType(progress_type)); } -static void rna_uiItemSeparator(uiLayout *layout, float factor, int type) -{ - uiItemS_ex(layout, factor, LayoutSeparatorType(type)); -} - static void rna_uiTemplateID(uiLayout *layout, bContext *C, PointerRNA *ptr, @@ -721,7 +715,7 @@ static void rna_uiTemplateAssetView(uiLayout *layout, const char *drag_opname, PointerRNA *r_drag_op_properties) { - blender::ed::asset::AssetFilterSettings filter_settings{}; + AssetFilterSettings filter_settings{}; filter_settings.id_types = filter_id_types ? filter_id_types : FILTER_ID_ALL; uiTemplateAssetView(layout, @@ -1077,25 +1071,6 @@ void RNA_api_ui_layout(StructRNA *srna) {0, nullptr, 0, nullptr, nullptr}, }; - static const EnumPropertyItem rna_enum_separator_type_items[] = { - {int(LayoutSeparatorType::Auto), - "AUTO", - 0, - "Auto", - "Best guess at what type of separator is needed."}, - {int(LayoutSeparatorType::Space), - "SPACE", - 0, - "Empty space", - "Horizontal or Vertical empty space, depending on layout direction."}, - {int(LayoutSeparatorType::Line), - "LINE", - 0, - "Line", - "Horizontal or Vertical line, depending on layout direction."}, - {0, nullptr, 0, nullptr, nullptr}, - }; - static float node_socket_color_default[] = {0.0f, 0.0f, 0.0f, 1.0f}; /* simple layout specifiers */ @@ -1508,7 +1483,7 @@ void RNA_api_ui_layout(StructRNA *srna) parm = RNA_def_string(func, "category", nullptr, 0, "", "panel type category"); RNA_def_parameter_flags(parm, PropertyFlag(0), PARM_REQUIRED); - func = RNA_def_function(srna, "separator", "rna_uiItemSeparator"); + func = RNA_def_function(srna, "separator", "uiItemS_ex"); RNA_def_function_ui_description(func, "Item. Inserts empty space into the layout between items"); RNA_def_float(func, "factor", @@ -1519,12 +1494,6 @@ void RNA_api_ui_layout(StructRNA *srna) "Percentage of width to space (leave unset for default space)", 0.0f, FLT_MAX); - RNA_def_enum(func, - "type", - rna_enum_separator_type_items, - int(LayoutSeparatorType::Auto), - "Type", - "The type of the separator"); func = RNA_def_function(srna, "separator_spacer", "uiItemSpacer"); RNA_def_function_ui_description( diff --git a/source/blender/makesrna/intern/rna_userdef.cc b/source/blender/makesrna/intern/rna_userdef.cc index efaa829a904..fb55898f09f 100644 --- a/source/blender/makesrna/intern/rna_userdef.cc +++ b/source/blender/makesrna/intern/rna_userdef.cc @@ -26,11 +26,11 @@ # include "BLI_winstuff.h" #endif -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_addon.h" #include "BKE_appdir.hh" -#include "BKE_callbacks.hh" +#include "BKE_callbacks.h" #include "BKE_sound.h" #include "BKE_studiolight.h" @@ -47,7 +47,7 @@ #include "WM_api.hh" #include "WM_types.hh" -#include "BLT_lang.hh" +#include "BLT_lang.h" const EnumPropertyItem rna_enum_preference_section_items[] = { {USER_SECTION_INTERFACE, "INTERFACE", 0, "Interface", ""}, @@ -173,8 +173,8 @@ static const EnumPropertyItem rna_enum_preference_gpu_backend_items[] = { # include "DNA_object_types.h" # include "DNA_screen_types.h" -# include "BKE_blender.hh" -# include "BKE_global.hh" +# include "BKE_blender.h" +# include "BKE_global.h" # include "BKE_idprop.h" # include "BKE_image.h" # include "BKE_main.hh" @@ -373,7 +373,7 @@ static void rna_userdef_extension_repo_module_set(PointerRNA *ptr, const char *v BKE_callback_exec_null(bmain, BKE_CB_EVT_EXTENSION_REPOS_UPDATE_POST); } -static void rna_userdef_extension_repo_custom_directory_set(PointerRNA *ptr, const char *value) +static void rna_userdef_extension_repo_directory_set(PointerRNA *ptr, const char *value) { Main *bmain = G.main; bUserExtensionRepo *repo = (bUserExtensionRepo *)ptr->data; @@ -382,19 +382,6 @@ static void rna_userdef_extension_repo_custom_directory_set(PointerRNA *ptr, con BKE_callback_exec_null(bmain, BKE_CB_EVT_EXTENSION_REPOS_UPDATE_POST); } -static void rna_userdef_extension_repo_directory_get(PointerRNA *ptr, char *value) -{ - const bUserExtensionRepo *repo = (bUserExtensionRepo *)ptr->data; - BKE_preferences_extension_repo_dirpath_get(repo, value, FILE_MAX); -} - -static int rna_userdef_extension_repo_directory_length(PointerRNA *ptr) -{ - const bUserExtensionRepo *repo = (bUserExtensionRepo *)ptr->data; - char dirpath[FILE_MAX]; - return BKE_preferences_extension_repo_dirpath_get(repo, dirpath, sizeof(dirpath)); -} - static void rna_userdef_extension_repo_generic_flag_set_impl(PointerRNA *ptr, const bool value, const int flag) @@ -532,11 +519,9 @@ static bUserExtensionRepo *rna_userdef_extension_repo_new(const char *name, if (remote_path) { STRNCPY(repo->remote_path, remote_path); - } - - if (repo->remote_path[0]) { repo->flag |= USER_EXTENSION_REPO_FLAG_USE_REMOTE_PATH; } + if (repo->custom_dirpath[0]) { repo->flag |= USER_EXTENSION_REPO_FLAG_USE_CUSTOM_DIRECTORY; } @@ -1355,6 +1340,7 @@ static void rna_def_userdef_theme_ui_font_style(BlenderRNA *brna) srna = RNA_def_struct(brna, "ThemeFontStyle", nullptr); RNA_def_struct_sdna(srna, "uiFontStyle"); + RNA_def_struct_clear_flag(srna, STRUCT_UNDO); RNA_def_struct_ui_text(srna, "Font Style", "Theme settings for Font"); prop = RNA_def_property(srna, "points", PROP_FLOAT, PROP_UNSIGNED); @@ -1410,6 +1396,7 @@ static void rna_def_userdef_theme_ui_style(BlenderRNA *brna) srna = RNA_def_struct(brna, "ThemeStyle", nullptr); RNA_def_struct_sdna(srna, "uiStyle"); + RNA_def_struct_clear_flag(srna, STRUCT_UNDO); RNA_def_struct_ui_text(srna, "Style", "Theme settings for style sets"); prop = RNA_def_property(srna, "panel_title", PROP_POINTER, PROP_NONE); @@ -1441,6 +1428,7 @@ static void rna_def_userdef_theme_ui_wcol(BlenderRNA *brna) srna = RNA_def_struct(brna, "ThemeWidgetColors", nullptr); RNA_def_struct_sdna(srna, "uiWidgetColors"); + RNA_def_struct_clear_flag(srna, STRUCT_UNDO); RNA_def_struct_ui_text(srna, "Theme Widget Color Set", "Theme settings for widget color sets"); prop = RNA_def_property(srna, "outline", PROP_FLOAT, PROP_COLOR_GAMMA); @@ -1502,6 +1490,7 @@ static void rna_def_userdef_theme_ui_wcol_state(BlenderRNA *brna) srna = RNA_def_struct(brna, "ThemeWidgetStateColors", nullptr); RNA_def_struct_sdna(srna, "uiWidgetStateColors"); + RNA_def_struct_clear_flag(srna, STRUCT_UNDO); RNA_def_struct_ui_text( srna, "Theme Widget State Color", "Theme settings for widget state colors"); @@ -1567,6 +1556,7 @@ static void rna_def_userdef_theme_ui_panel(BlenderRNA *brna) srna = RNA_def_struct(brna, "ThemePanelColors", nullptr); RNA_def_struct_sdna(srna, "uiPanelColors"); + RNA_def_struct_clear_flag(srna, STRUCT_UNDO); RNA_def_struct_ui_text(srna, "Theme Panel Color", "Theme settings for panel colors"); prop = RNA_def_property(srna, "header", PROP_FLOAT, PROP_COLOR_GAMMA); @@ -1609,6 +1599,7 @@ static void rna_def_userdef_theme_ui_gradient(BlenderRNA *brna) srna = RNA_def_struct(brna, "ThemeGradientColors", nullptr); RNA_def_struct_sdna(srna, "ThemeSpace"); + RNA_def_struct_clear_flag(srna, STRUCT_UNDO); RNA_def_struct_ui_text( srna, "Theme Background Color", "Theme settings for background colors and gradient"); @@ -1643,6 +1634,7 @@ static void rna_def_userdef_theme_ui(BlenderRNA *brna) srna = RNA_def_struct(brna, "ThemeUserInterface", nullptr); RNA_def_struct_sdna(srna, "ThemeUI"); + RNA_def_struct_clear_flag(srna, STRUCT_UNDO); RNA_def_struct_ui_text( srna, "Theme User Interface", "Theme settings for user interface elements"); @@ -2132,6 +2124,7 @@ static void rna_def_userdef_theme_asset_shelf(BlenderRNA *brna) PropertyRNA *prop; srna = RNA_def_struct(brna, "ThemeAssetShelf", nullptr); + RNA_def_struct_clear_flag(srna, STRUCT_UNDO); RNA_def_struct_ui_text(srna, "Theme Asset Shelf Color", "Theme settings for asset shelves"); prop = RNA_def_property(srna, "header_back", PROP_FLOAT, PROP_COLOR_GAMMA); @@ -2456,6 +2449,7 @@ static void rna_def_userdef_theme_space_view3d(BlenderRNA *brna) srna = RNA_def_struct(brna, "ThemeView3D", nullptr); RNA_def_struct_sdna(srna, "ThemeSpace"); + RNA_def_struct_clear_flag(srna, STRUCT_UNDO); RNA_def_struct_ui_text(srna, "Theme 3D Viewport", "Theme settings for the 3D viewport"); rna_def_userdef_theme_spaces_gradient(srna); @@ -2685,6 +2679,7 @@ static void rna_def_userdef_theme_space_graph(BlenderRNA *brna) /* space_graph */ srna = RNA_def_struct(brna, "ThemeGraphEditor", nullptr); RNA_def_struct_sdna(srna, "ThemeSpace"); + RNA_def_struct_clear_flag(srna, STRUCT_UNDO); RNA_def_struct_ui_text(srna, "Theme Graph Editor", "Theme settings for the graph editor"); rna_def_userdef_theme_spaces_main(srna); @@ -2771,6 +2766,7 @@ static void rna_def_userdef_theme_space_file(BlenderRNA *brna) srna = RNA_def_struct(brna, "ThemeFileBrowser", nullptr); RNA_def_struct_sdna(srna, "ThemeSpace"); + RNA_def_struct_clear_flag(srna, STRUCT_UNDO); RNA_def_struct_ui_text(srna, "Theme File Browser", "Theme settings for the File Browser"); rna_def_userdef_theme_spaces_main(srna); @@ -2796,6 +2792,7 @@ static void rna_def_userdef_theme_space_outliner(BlenderRNA *brna) srna = RNA_def_struct(brna, "ThemeOutliner", nullptr); RNA_def_struct_sdna(srna, "ThemeSpace"); + RNA_def_struct_clear_flag(srna, STRUCT_UNDO); RNA_def_struct_ui_text(srna, "Theme Outliner", "Theme settings for the Outliner"); rna_def_userdef_theme_spaces_main(srna); @@ -2844,6 +2841,7 @@ static void rna_def_userdef_theme_space_userpref(BlenderRNA *brna) srna = RNA_def_struct(brna, "ThemePreferences", nullptr); RNA_def_struct_sdna(srna, "ThemeSpace"); + RNA_def_struct_clear_flag(srna, STRUCT_UNDO); RNA_def_struct_ui_text(srna, "Theme Preferences", "Theme settings for the Blender Preferences"); rna_def_userdef_theme_spaces_main(srna); @@ -2858,6 +2856,7 @@ static void rna_def_userdef_theme_space_console(BlenderRNA *brna) srna = RNA_def_struct(brna, "ThemeConsole", nullptr); RNA_def_struct_sdna(srna, "ThemeSpace"); + RNA_def_struct_clear_flag(srna, STRUCT_UNDO); RNA_def_struct_ui_text(srna, "Theme Console", "Theme settings for the Console"); rna_def_userdef_theme_spaces_main(srna); @@ -2908,6 +2907,7 @@ static void rna_def_userdef_theme_space_info(BlenderRNA *brna) srna = RNA_def_struct(brna, "ThemeInfo", nullptr); RNA_def_struct_sdna(srna, "ThemeSpace"); + RNA_def_struct_clear_flag(srna, STRUCT_UNDO); RNA_def_struct_ui_text(srna, "Theme Info", "Theme settings for Info"); rna_def_userdef_theme_spaces_main(srna); @@ -2992,6 +2992,7 @@ static void rna_def_userdef_theme_space_text(BlenderRNA *brna) srna = RNA_def_struct(brna, "ThemeTextEditor", nullptr); RNA_def_struct_sdna(srna, "ThemeSpace"); + RNA_def_struct_clear_flag(srna, STRUCT_UNDO); RNA_def_struct_ui_text(srna, "Theme Text Editor", "Theme settings for the Text Editor"); rna_def_userdef_theme_spaces_main(srna); @@ -3087,6 +3088,7 @@ static void rna_def_userdef_theme_space_node(BlenderRNA *brna) srna = RNA_def_struct(brna, "ThemeNodeEditor", nullptr); RNA_def_struct_sdna(srna, "ThemeSpace"); + RNA_def_struct_clear_flag(srna, STRUCT_UNDO); RNA_def_struct_ui_text(srna, "Theme Node Editor", "Theme settings for the Node Editor"); rna_def_userdef_theme_spaces_main(srna); @@ -3290,6 +3292,7 @@ static void rna_def_userdef_theme_space_buts(BlenderRNA *brna) srna = RNA_def_struct(brna, "ThemeProperties", nullptr); RNA_def_struct_sdna(srna, "ThemeSpace"); + RNA_def_struct_clear_flag(srna, STRUCT_UNDO); RNA_def_struct_ui_text(srna, "Theme Properties", "Theme settings for the Properties"); prop = RNA_def_property(srna, "match", PROP_FLOAT, PROP_COLOR_GAMMA); @@ -3315,6 +3318,7 @@ static void rna_def_userdef_theme_space_image(BlenderRNA *brna) srna = RNA_def_struct(brna, "ThemeImageEditor", nullptr); RNA_def_struct_sdna(srna, "ThemeSpace"); + RNA_def_struct_clear_flag(srna, STRUCT_UNDO); RNA_def_struct_ui_text(srna, "Theme Image Editor", "Theme settings for the Image Editor"); rna_def_userdef_theme_spaces_main(srna); @@ -3427,6 +3431,7 @@ static void rna_def_userdef_theme_space_seq(BlenderRNA *brna) srna = RNA_def_struct(brna, "ThemeSequenceEditor", nullptr); RNA_def_struct_sdna(srna, "ThemeSpace"); + RNA_def_struct_clear_flag(srna, STRUCT_UNDO); RNA_def_struct_ui_text(srna, "Theme Sequence Editor", "Theme settings for the Sequence Editor"); rna_def_userdef_theme_spaces_main(srna); @@ -3633,6 +3638,7 @@ static void rna_def_userdef_theme_space_action(BlenderRNA *brna) srna = RNA_def_struct(brna, "ThemeDopeSheet", nullptr); RNA_def_struct_sdna(srna, "ThemeSpace"); + RNA_def_struct_clear_flag(srna, STRUCT_UNDO); RNA_def_struct_ui_text(srna, "Theme Dope Sheet", "Theme settings for the Dope Sheet"); rna_def_userdef_theme_spaces_main(srna); @@ -3842,6 +3848,7 @@ static void rna_def_userdef_theme_space_nla(BlenderRNA *brna) /* space_nla */ srna = RNA_def_struct(brna, "ThemeNLAEditor", nullptr); RNA_def_struct_sdna(srna, "ThemeSpace"); + RNA_def_struct_clear_flag(srna, STRUCT_UNDO); RNA_def_struct_ui_text(srna, "Theme Nonlinear Animation", "Theme settings for the NLA Editor"); rna_def_userdef_theme_spaces_main(srna); @@ -4004,6 +4011,7 @@ static void rna_def_userdef_theme_colorset(BlenderRNA *brna) srna = RNA_def_struct(brna, "ThemeBoneColorSet", nullptr); RNA_def_struct_sdna(srna, "ThemeWireColor"); + RNA_def_struct_clear_flag(srna, STRUCT_UNDO); RNA_def_struct_ui_text(srna, "Theme Bone Color Set", "Theme settings for bone color sets"); prop = RNA_def_property(srna, "normal", PROP_FLOAT, PROP_COLOR_GAMMA); @@ -4040,6 +4048,7 @@ static void rna_def_userdef_theme_collection_color(BlenderRNA *brna) srna = RNA_def_struct(brna, "ThemeCollectionColor", nullptr); RNA_def_struct_sdna(srna, "ThemeCollectionColor"); + RNA_def_struct_clear_flag(srna, STRUCT_UNDO); RNA_def_struct_ui_text(srna, "Theme Collection Color", "Theme settings for collection colors"); prop = RNA_def_property(srna, "color", PROP_FLOAT, PROP_COLOR_GAMMA); @@ -4056,6 +4065,7 @@ static void rna_def_userdef_theme_strip_color(BlenderRNA *brna) srna = RNA_def_struct(brna, "ThemeStripColor", nullptr); RNA_def_struct_sdna(srna, "ThemeStripColor"); + RNA_def_struct_clear_flag(srna, STRUCT_UNDO); RNA_def_struct_ui_text(srna, "Theme Strip Color", "Theme settings for strip colors"); prop = RNA_def_property(srna, "color", PROP_FLOAT, PROP_COLOR_GAMMA); @@ -4074,6 +4084,7 @@ static void rna_def_userdef_theme_space_clip(BlenderRNA *brna) srna = RNA_def_struct(brna, "ThemeClipEditor", nullptr); RNA_def_struct_sdna(srna, "ThemeSpace"); + RNA_def_struct_clear_flag(srna, STRUCT_UNDO); RNA_def_struct_ui_text(srna, "Theme Clip Editor", "Theme settings for the Movie Clip Editor"); rna_def_userdef_theme_spaces_main(srna); @@ -4198,6 +4209,7 @@ static void rna_def_userdef_theme_space_topbar(BlenderRNA *brna) srna = RNA_def_struct(brna, "ThemeTopBar", nullptr); RNA_def_struct_sdna(srna, "ThemeSpace"); + RNA_def_struct_clear_flag(srna, STRUCT_UNDO); RNA_def_struct_ui_text(srna, "Theme Top Bar", "Theme settings for the Top Bar"); rna_def_userdef_theme_spaces_main(srna); @@ -4211,6 +4223,7 @@ static void rna_def_userdef_theme_space_statusbar(BlenderRNA *brna) srna = RNA_def_struct(brna, "ThemeStatusBar", nullptr); RNA_def_struct_sdna(srna, "ThemeSpace"); + RNA_def_struct_clear_flag(srna, STRUCT_UNDO); RNA_def_struct_ui_text(srna, "Theme Status Bar", "Theme settings for the Status Bar"); rna_def_userdef_theme_spaces_main(srna); @@ -4225,6 +4238,7 @@ static void rna_def_userdef_theme_space_spreadsheet(BlenderRNA *brna) srna = RNA_def_struct(brna, "ThemeSpreadsheet", nullptr); RNA_def_struct_sdna(srna, "ThemeSpace"); + RNA_def_struct_clear_flag(srna, STRUCT_UNDO); RNA_def_struct_ui_text(srna, "Theme Spreadsheet", "Theme settings for the Spreadsheet"); prop = RNA_def_property(srna, "row_alternate", PROP_FLOAT, PROP_COLOR_GAMMA); @@ -4268,6 +4282,7 @@ static void rna_def_userdef_themes(BlenderRNA *brna) srna = RNA_def_struct(brna, "Theme", nullptr); RNA_def_struct_sdna(srna, "bTheme"); + RNA_def_struct_clear_flag(srna, STRUCT_UNDO); RNA_def_struct_ui_text(srna, "Theme", "User interface styling and color settings"); prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE); @@ -4424,6 +4439,7 @@ static void rna_def_userdef_addon(BlenderRNA *brna) srna = RNA_def_struct(brna, "Addon", nullptr); RNA_def_struct_sdna(srna, "bAddon"); + RNA_def_struct_clear_flag(srna, STRUCT_UNDO); RNA_def_struct_ui_text(srna, "Add-on", "Python add-ons to be loaded automatically"); prop = RNA_def_property(srna, "module", PROP_STRING, PROP_NONE); @@ -4492,6 +4508,7 @@ static void rna_def_userdef_studiolight(BlenderRNA *brna) RNA_define_verify_sdna(false); srna = RNA_def_struct(brna, "StudioLight", nullptr); + RNA_def_struct_clear_flag(srna, STRUCT_UNDO); RNA_def_struct_ui_text(srna, "Studio Light", "Studio light"); prop = RNA_def_property(srna, "index", PROP_INT, PROP_NONE); @@ -4567,6 +4584,7 @@ static void rna_def_userdef_pathcompare(BlenderRNA *brna) srna = RNA_def_struct(brna, "PathCompare", nullptr); RNA_def_struct_sdna(srna, "bPathCompare"); + RNA_def_struct_clear_flag(srna, STRUCT_UNDO); RNA_def_struct_ui_text(srna, "Path Compare", "Match paths against this value"); prop = RNA_def_property(srna, "path", PROP_STRING, PROP_DIRPATH); @@ -4650,6 +4668,7 @@ static void rna_def_userdef_solidlight(BlenderRNA *brna) srna = RNA_def_struct(brna, "UserSolidLight", nullptr); RNA_def_struct_sdna(srna, "SolidLight"); + RNA_def_struct_clear_flag(srna, STRUCT_UNDO); RNA_def_struct_ui_text( srna, "Solid Light", "Light used for Studio lighting in solid shading mode"); @@ -4695,6 +4714,7 @@ static void rna_def_userdef_walk_navigation(BlenderRNA *brna) srna = RNA_def_struct(brna, "WalkNavigation", nullptr); RNA_def_struct_sdna(srna, "WalkNavigation"); + RNA_def_struct_clear_flag(srna, STRUCT_UNDO); RNA_def_struct_ui_text(srna, "Walk Navigation", "Walk navigation settings"); prop = RNA_def_property(srna, "mouse_speed", PROP_FLOAT, PROP_NONE); @@ -4859,6 +4879,7 @@ static void rna_def_userdef_view(BlenderRNA *brna) srna = RNA_def_struct(brna, "PreferencesView", nullptr); RNA_def_struct_sdna(srna, "UserDef"); RNA_def_struct_nested(brna, srna, "Preferences"); + RNA_def_struct_clear_flag(srna, STRUCT_UNDO); RNA_def_struct_ui_text(srna, "View & Controls", "Preferences related to viewing data"); /* View. */ @@ -5348,6 +5369,7 @@ static void rna_def_userdef_edit(BlenderRNA *brna) srna = RNA_def_struct(brna, "PreferencesEdit", nullptr); RNA_def_struct_sdna(srna, "UserDef"); RNA_def_struct_nested(brna, srna, "Preferences"); + RNA_def_struct_clear_flag(srna, STRUCT_UNDO); RNA_def_struct_ui_text(srna, "Edit Methods", "Settings for interacting with Blender data"); /* Edit Methods */ @@ -5854,6 +5876,7 @@ static void rna_def_userdef_system(BlenderRNA *brna) srna = RNA_def_struct(brna, "PreferencesSystem", nullptr); RNA_def_struct_sdna(srna, "UserDef"); RNA_def_struct_nested(brna, srna, "Preferences"); + RNA_def_struct_clear_flag(srna, STRUCT_UNDO); RNA_def_struct_ui_text(srna, "System & OpenGL", "Graphics driver and operating system settings"); /* UI settings. */ @@ -6220,6 +6243,7 @@ static void rna_def_userdef_input(BlenderRNA *brna) srna = RNA_def_struct(brna, "PreferencesInput", nullptr); RNA_def_struct_sdna(srna, "UserDef"); RNA_def_struct_nested(brna, srna, "Preferences"); + RNA_def_struct_clear_flag(srna, STRUCT_UNDO); RNA_def_struct_ui_text(srna, "Input", "Settings for input devices"); prop = RNA_def_property(srna, "view_zoom_method", PROP_ENUM, PROP_NONE); @@ -6525,6 +6549,7 @@ static void rna_def_userdef_keymap(BlenderRNA *brna) StructRNA *srna = RNA_def_struct(brna, "PreferencesKeymap", nullptr); RNA_def_struct_sdna(srna, "UserDef"); RNA_def_struct_nested(brna, srna, "Preferences"); + RNA_def_struct_clear_flag(srna, STRUCT_UNDO); RNA_def_struct_ui_text(srna, "Keymap", "Shortcut setup for keyboards and other input devices"); prop = RNA_def_property(srna, "show_ui_keyconfig", PROP_BOOLEAN, PROP_NONE); @@ -6544,6 +6569,7 @@ static void rna_def_userdef_filepaths_asset_library(BlenderRNA *brna) srna = RNA_def_struct(brna, "UserAssetLibrary", nullptr); RNA_def_struct_sdna(srna, "bUserAssetLibrary"); + RNA_def_struct_clear_flag(srna, STRUCT_UNDO); RNA_def_struct_ui_text( srna, "Asset Library", "Settings to define a reusable library for Asset Browsers to use"); @@ -6600,6 +6626,7 @@ static void rna_def_userdef_filepaths_extension_repo(BlenderRNA *brna) srna = RNA_def_struct(brna, "UserExtensionRepo", nullptr); RNA_def_struct_sdna(srna, "bUserExtensionRepo"); + RNA_def_struct_clear_flag(srna, STRUCT_UNDO); RNA_def_struct_ui_text( srna, "Extension Repository", "Settings to define an extension repository"); @@ -6619,18 +6646,9 @@ static void rna_def_userdef_filepaths_extension_repo(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Custom Directory", "The local directory containing extensions"); RNA_def_property_translation_context(prop, BLT_I18NCONTEXT_EDITOR_FILEBROWSER); RNA_def_property_string_funcs( - prop, nullptr, nullptr, "rna_userdef_extension_repo_custom_directory_set"); + prop, nullptr, nullptr, "rna_userdef_extension_repo_directory_set"); RNA_def_property_update(prop, 0, "rna_userdef_update"); - prop = RNA_def_property(srna, "directory", PROP_STRING, PROP_DIRPATH); - RNA_def_property_ui_text(prop, "Directory", "The local directory containing extensions"); - RNA_def_property_translation_context(prop, BLT_I18NCONTEXT_EDITOR_FILEBROWSER); - RNA_def_property_clear_flag(prop, PROP_EDITABLE); - RNA_def_property_string_funcs(prop, - "rna_userdef_extension_repo_directory_get", - "rna_userdef_extension_repo_directory_length", - nullptr); - prop = RNA_def_property(srna, "remote_path", PROP_STRING, PROP_NONE); RNA_def_property_string_sdna(prop, nullptr, "remote_path"); RNA_def_property_ui_text(prop, "URL", "Remote URL or path for extension repository"); @@ -6673,6 +6691,7 @@ static void rna_def_userdef_script_directory(BlenderRNA *brna) { StructRNA *srna = RNA_def_struct(brna, "ScriptDirectory", nullptr); RNA_def_struct_sdna(srna, "bUserScriptDirectory"); + RNA_def_struct_clear_flag(srna, STRUCT_UNDO); RNA_def_struct_ui_text(srna, "Python Scripts Directory", ""); PropertyRNA *prop; @@ -6716,6 +6735,7 @@ static void rna_def_userdef_script_directory_collection(BlenderRNA *brna, Proper RNA_def_property_srna(cprop, "ScriptDirectoryCollection"); srna = RNA_def_struct(brna, "ScriptDirectoryCollection", nullptr); + RNA_def_struct_clear_flag(srna, STRUCT_UNDO); RNA_def_struct_ui_text(srna, "Python Scripts Directories", ""); func = RNA_def_function(srna, "new", "rna_userdef_script_directory_new"); @@ -6741,6 +6761,7 @@ static void rna_def_userdef_asset_library_collection(BlenderRNA *brna, PropertyR RNA_def_property_srna(cprop, "AssetLibraryCollection"); srna = RNA_def_struct(brna, "AssetLibraryCollection", nullptr); + RNA_def_struct_clear_flag(srna, STRUCT_UNDO); RNA_def_struct_ui_text(srna, "User Asset Libraries", "Collection of user asset libraries"); func = RNA_def_function(srna, "new", "rna_userdef_asset_library_new"); @@ -6768,6 +6789,7 @@ static void rna_def_userdef_extension_repos_collection(BlenderRNA *brna, Propert RNA_def_property_srna(cprop, "UserExtensionRepoCollection"); srna = RNA_def_struct(brna, "UserExtensionRepoCollection", nullptr); + RNA_def_struct_clear_flag(srna, STRUCT_UNDO); RNA_def_struct_ui_text( srna, "User Extension Repositories", "Collection of user extension repositories"); @@ -6824,6 +6846,7 @@ static void rna_def_userdef_filepaths(BlenderRNA *brna) srna = RNA_def_struct(brna, "PreferencesFilePaths", nullptr); RNA_def_struct_sdna(srna, "UserDef"); RNA_def_struct_nested(brna, srna, "Preferences"); + RNA_def_struct_clear_flag(srna, STRUCT_UNDO); RNA_def_struct_ui_text(srna, "File Paths", "Default paths for external files"); prop = RNA_def_property(srna, "show_hidden_files_datablocks", PROP_BOOLEAN, PROP_NONE); @@ -7037,6 +7060,7 @@ static void rna_def_userdef_apps(BlenderRNA *brna) srna = RNA_def_struct(brna, "PreferencesApps", nullptr); RNA_def_struct_sdna(srna, "UserDef"); RNA_def_struct_nested(brna, srna, "Preferences"); + RNA_def_struct_clear_flag(srna, STRUCT_UNDO); RNA_def_struct_ui_text(srna, "Apps", "Preferences that work only for apps"); prop = RNA_def_property(srna, "show_corner_split", PROP_BOOLEAN, PROP_NONE); @@ -7065,6 +7089,7 @@ static void rna_def_userdef_experimental(BlenderRNA *brna) srna = RNA_def_struct(brna, "PreferencesExperimental", nullptr); RNA_def_struct_sdna(srna, "UserDef_Experimental"); RNA_def_struct_nested(brna, srna, "Preferences"); + RNA_def_struct_clear_flag(srna, STRUCT_UNDO); RNA_def_struct_ui_text(srna, "Experimental", "Experimental features"); prop = RNA_def_property(srna, "use_undo_legacy", PROP_BOOLEAN, PROP_NONE); @@ -7147,12 +7172,6 @@ static void rna_def_userdef_experimental(BlenderRNA *brna) RNA_def_property_flag(prop, PROP_CONTEXT_UPDATE); RNA_def_property_update(prop, 0, "rna_userdef_keyconfig_reload_update"); - prop = RNA_def_property(srna, "use_new_matrix_socket", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, nullptr, "use_new_matrix_socket", 1); - RNA_def_property_ui_text( - prop, "Matrix Socket", "Enable the matrix socket type for geometry nodes"); - RNA_def_property_update(prop, 0, "rna_userdef_ui_update"); - prop = RNA_def_property(srna, "use_viewport_debug", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, nullptr, "use_viewport_debug", 1); RNA_def_property_ui_text(prop, @@ -7183,17 +7202,15 @@ static void rna_def_userdef_experimental(BlenderRNA *brna) RNA_def_property_update(prop, 0, "rna_userdef_ui_update"); prop = RNA_def_property(srna, "use_extension_repos", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_ui_text(prop, - "Extensions", - "Enables support for extensions, accessible from the \"Extensions\" " - "section of the preferences"); + RNA_def_property_ui_text( + prop, + "Extension Repositories", + "Enables extension repositories, " + "accessible from the \"Extension Repositories\" panel in the " + "\"File Paths\" section of the preferences. " + "These paths are exposed as add-ons, package management is not yet integrated"); RNA_def_property_boolean_funcs( prop, nullptr, "rna_PreferencesExperimental_use_extension_repos_set"); - - prop = RNA_def_property(srna, "use_extension_utils", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_ui_text( - prop, "Extensions Development Utilities", "Developer support utilities for extensions"); - RNA_def_property_update(prop, 0, "rna_userdef_update"); } static void rna_def_userdef_addon_collection(BlenderRNA *brna, PropertyRNA *cprop) @@ -7204,6 +7221,7 @@ static void rna_def_userdef_addon_collection(BlenderRNA *brna, PropertyRNA *cpro RNA_def_property_srna(cprop, "Addons"); srna = RNA_def_struct(brna, "Addons", nullptr); + RNA_def_struct_clear_flag(srna, STRUCT_UNDO); RNA_def_struct_ui_text(srna, "User Add-ons", "Collection of add-ons"); func = RNA_def_function(srna, "new", "rna_userdef_addon_new"); @@ -7229,6 +7247,7 @@ static void rna_def_userdef_autoexec_path_collection(BlenderRNA *brna, PropertyR RNA_def_property_srna(cprop, "PathCompareCollection"); srna = RNA_def_struct(brna, "PathCompareCollection", nullptr); + RNA_def_struct_clear_flag(srna, STRUCT_UNDO); RNA_def_struct_ui_text(srna, "Paths Compare", "Collection of paths"); func = RNA_def_function(srna, "new", "rna_userdef_pathcompare_new"); @@ -7259,6 +7278,7 @@ void RNA_def_userdef(BlenderRNA *brna) srna = RNA_def_struct(brna, "Preferences", nullptr); RNA_def_struct_sdna(srna, "UserDef"); + RNA_def_struct_clear_flag(srna, STRUCT_UNDO); RNA_def_struct_ui_text(srna, "Preferences", "Global preferences"); prop = RNA_def_property(srna, "active_section", PROP_ENUM, PROP_NONE); diff --git a/source/blender/makesrna/intern/rna_volume.cc b/source/blender/makesrna/intern/rna_volume.cc index 2643e2d79ee..b1118dbeb28 100644 --- a/source/blender/makesrna/intern/rna_volume.cc +++ b/source/blender/makesrna/intern/rna_volume.cc @@ -22,7 +22,7 @@ #include "BLI_math_base.h" #include "BLI_string_utf8_symbols.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" const EnumPropertyItem rna_enum_volume_grid_data_type_items[] = { {VOLUME_GRID_BOOLEAN, "BOOLEAN", 0, "Boolean", "Boolean"}, @@ -81,7 +81,7 @@ static void rna_Volume_update_filepath(Main * /*bmain*/, Scene * /*scene*/, Poin { Volume *volume = (Volume *)ptr->owner_id; BKE_volume_unload(volume); - DEG_id_tag_update(&volume->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&volume->id, ID_RECALC_COPY_ON_WRITE); WM_main_add_notifier(NC_GEOM | ND_DATA, volume); } diff --git a/source/blender/makesrna/intern/rna_wm.cc b/source/blender/makesrna/intern/rna_wm.cc index 9aa8dfc1005..d9a773591a0 100644 --- a/source/blender/makesrna/intern/rna_wm.cc +++ b/source/blender/makesrna/intern/rna_wm.cc @@ -16,7 +16,7 @@ #include "BLI_string_utf8_symbols.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_keyconfig.h" #include "BKE_screen.hh" @@ -554,7 +554,7 @@ const EnumPropertyItem rna_enum_wm_report_items[] = { # include "UI_interface.hh" -# include "BKE_global.hh" +# include "BKE_global.h" # include "BKE_idprop.h" # include "MEM_guardedalloc.h" @@ -565,16 +565,14 @@ const EnumPropertyItem rna_enum_wm_report_items[] = { static wmOperator *rna_OperatorProperties_find_operator(PointerRNA *ptr) { - if (ptr->owner_id == nullptr || GS(ptr->owner_id->name) != ID_WM) { - return nullptr; - } - wmWindowManager *wm = (wmWindowManager *)ptr->owner_id; - IDProperty *properties = (IDProperty *)ptr->data; - for (wmOperator *op = static_cast(wm->operators.last); op; op = op->prev) { - if (op->properties == properties) { - return op; + if (wm) { + IDProperty *properties = (IDProperty *)ptr->data; + for (wmOperator *op = static_cast(wm->operators.last); op; op = op->prev) { + if (op->properties == properties) { + return op; + } } } @@ -827,7 +825,6 @@ static void rna_Window_workspace_update(bContext *C, PointerRNA *ptr) if (new_workspace) { wmWindowManager *wm = CTX_wm_manager(C); WM_event_add_notifier_ex(wm, win, NC_SCREEN | ND_WORKSPACE_SET, new_workspace); - WM_event_add_notifier(C, NC_SPACE | ND_SPACE_INFO, nullptr); win->workspace_hook->temp_workspace_store = nullptr; } } @@ -2054,6 +2051,7 @@ static void rna_def_operator(BlenderRNA *brna) RNA_def_struct_idprops_func(srna, "rna_OperatorProperties_idprops"); RNA_def_struct_property_tags(srna, rna_enum_operator_property_tag_items); RNA_def_struct_flag(srna, STRUCT_NO_DATABLOCK_IDPROPERTIES | STRUCT_NO_CONTEXT_WITHOUT_OWNER_ID); + RNA_def_struct_clear_flag(srna, STRUCT_UNDO); } static void rna_def_macro_operator(BlenderRNA *brna) @@ -2390,6 +2388,7 @@ static void rna_def_window_stereo3d(BlenderRNA *brna) srna = RNA_def_struct(brna, "Stereo3dDisplay", nullptr); RNA_def_struct_sdna(srna, "Stereo3dFormat"); + RNA_def_struct_clear_flag(srna, STRUCT_UNDO); RNA_def_struct_ui_text(srna, "Stereo 3D Display", "Settings for stereo 3D display"); prop = RNA_def_property(srna, "display_mode", PROP_ENUM, PROP_NONE); diff --git a/source/blender/makesrna/intern/rna_wm_api.cc b/source/blender/makesrna/intern/rna_wm_api.cc index c0f818ad378..8b25313aad5 100644 --- a/source/blender/makesrna/intern/rna_wm_api.cc +++ b/source/blender/makesrna/intern/rna_wm_api.cc @@ -75,8 +75,7 @@ static bool rna_KeyMapItem_compare(wmKeyMapItem *k1, wmKeyMapItem *k2) static void rna_KeyMapItem_to_string(wmKeyMapItem *kmi, bool compact, char *result) { - BLI_strncpy( - result, WM_keymap_item_to_string(kmi, compact).value_or("").c_str(), UI_MAX_SHORTCUT_STR); + WM_keymap_item_to_string(kmi, compact, result, UI_MAX_SHORTCUT_STR); } static wmKeyMap *rna_keymap_active(wmKeyMap *km, bContext *C) @@ -123,10 +122,10 @@ static bool rna_event_modal_handler_add(bContext *C, ReportList *reports, wmOper return WM_event_add_modal_handler_ex(win, area, region, op) != nullptr; } +/* XXX, need a way for python to know event types, 0x0110 is hard coded */ static wmTimer *rna_event_timer_add(wmWindowManager *wm, float time_step, wmWindow *win) { - /* NOTE: we need a way for Python to know event types, `TIMER` is hard coded. */ - return WM_event_timer_add(wm, win, TIMER, time_step); + return WM_event_timer_add(wm, win, 0x0110, time_step); } static void rna_event_timer_remove(wmWindowManager *wm, wmTimer *timer) @@ -241,12 +240,7 @@ static int rna_Operator_props_dialog_popup(bContext *C, { title = RNA_translate_ui_text(title, text_ctxt, nullptr, nullptr, translate); confirm_text = RNA_translate_ui_text(confirm_text, text_ctxt, nullptr, nullptr, translate); - return WM_operator_props_dialog_popup( - C, - op, - width, - title ? std::make_optional(title) : std::nullopt, - confirm_text ? std::make_optional(confirm_text) : std::nullopt); + return WM_operator_props_dialog_popup(C, op, width, title, confirm_text); } static int keymap_item_modifier_flag_from_args(bool any, int shift, int ctrl, int alt, int oskey) @@ -952,7 +946,6 @@ void RNA_api_wm(StructRNA *srna) parm = RNA_def_property(func, "icon", PROP_ENUM, PROP_NONE); RNA_def_property_enum_items(parm, rna_operator_popup_icon_items); - RNA_def_property_enum_default(parm, ALERT_ICON_NONE); RNA_def_property_ui_text(parm, "Icon", "Optional icon displayed in the dialog"); api_ui_item_common_translation(func); @@ -1033,7 +1026,6 @@ void RNA_api_wm(StructRNA *srna) RNA_def_function_flag(func, FUNC_NO_SELF); parm = RNA_def_property(srna, "is_interface_locked", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(parm, nullptr, "runtime->is_interface_locked", 0); RNA_def_property_ui_text( parm, "Is Interface Locked", diff --git a/source/blender/makesrna/intern/rna_wm_gizmo.cc b/source/blender/makesrna/intern/rna_wm_gizmo.cc index d2f49f95dd9..3a198973cac 100644 --- a/source/blender/makesrna/intern/rna_wm_gizmo.cc +++ b/source/blender/makesrna/intern/rna_wm_gizmo.cc @@ -17,7 +17,7 @@ #include "BLI_listbase.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "RNA_access.hh" #include "RNA_define.hh" @@ -43,7 +43,7 @@ # include "UI_interface.hh" -# include "BKE_global.hh" +# include "BKE_global.h" # include "BKE_idprop.h" # include "BKE_workspace.h" diff --git a/source/blender/makesrna/intern/rna_wm_gizmo_api.cc b/source/blender/makesrna/intern/rna_wm_gizmo_api.cc index 536608c7dff..274fbc6fdcd 100644 --- a/source/blender/makesrna/intern/rna_wm_gizmo_api.cc +++ b/source/blender/makesrna/intern/rna_wm_gizmo_api.cc @@ -11,9 +11,9 @@ #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" -#include "BKE_report.hh" +#include "BKE_report.h" #include "RNA_define.hh" #include "RNA_enum_types.hh" diff --git a/source/blender/makesrna/intern/rna_workspace.cc b/source/blender/makesrna/intern/rna_workspace.cc index 09c043ece8a..4fce2bf5739 100644 --- a/source/blender/makesrna/intern/rna_workspace.cc +++ b/source/blender/makesrna/intern/rna_workspace.cc @@ -27,7 +27,7 @@ # include "BLI_listbase.h" -# include "BKE_global.hh" +# include "BKE_global.h" # include "DNA_object_types.h" # include "DNA_screen_types.h" @@ -212,6 +212,7 @@ static void rna_def_workspace_owner(BlenderRNA *brna) srna = RNA_def_struct(brna, "wmOwnerID", nullptr); RNA_def_struct_sdna(srna, "wmOwnerID"); + RNA_def_struct_clear_flag(srna, STRUCT_UNDO); RNA_def_struct_ui_text(srna, "Work Space UI Tag", ""); prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE); @@ -261,6 +262,7 @@ static void rna_def_workspace_tool(BlenderRNA *brna) srna = RNA_def_struct(brna, "WorkSpaceTool", nullptr); RNA_def_struct_sdna(srna, "bToolRef"); + RNA_def_struct_clear_flag(srna, STRUCT_UNDO); RNA_def_struct_ui_text(srna, "Work Space Tool", ""); prop = RNA_def_property(srna, "idname", PROP_STRING, PROP_NONE); diff --git a/source/blender/makesrna/intern/rna_xr.cc b/source/blender/makesrna/intern/rna_xr.cc index 0ef0a97cc34..61b09109b5d 100644 --- a/source/blender/makesrna/intern/rna_xr.cc +++ b/source/blender/makesrna/intern/rna_xr.cc @@ -6,7 +6,7 @@ * \ingroup RNA */ -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_space_types.h" #include "DNA_view3d_types.h" @@ -2088,6 +2088,7 @@ static void rna_def_xr_session_state(BlenderRNA *brna) PropertyRNA *parm, *prop; srna = RNA_def_struct(brna, "XrSessionState", nullptr); + RNA_def_struct_clear_flag(srna, STRUCT_UNDO); RNA_def_struct_ui_text(srna, "Session State", "Runtime state information about the VR session"); func = RNA_def_function(srna, "is_running", "rna_XrSessionState_is_running"); diff --git a/source/blender/makesrna/rna_cleanup/rna_cleaner.py b/source/blender/makesrna/rna_cleanup/rna_cleaner.py index b5e41a82771..aee502ca3e6 100755 --- a/source/blender/makesrna/rna_cleanup/rna_cleaner.py +++ b/source/blender/makesrna/rna_cleanup/rna_cleaner.py @@ -11,7 +11,7 @@ Typical line in the input file (elements in [] are optional). [comment *] ToolSettings.snap_align_rotation -> use_snap_align_rotation: boolean [Align rotation with the snapping target] Geterate output format from blender run this: - ./blender.bin --background --python ./scripts/modules/rna_info.py 2> source/blender/makesrna/rna_cleanup/out.txt + ./blender.bin --background -noaudio --python ./scripts/modules/rna_info.py 2> source/blender/makesrna/rna_cleanup/out.txt """ diff --git a/source/blender/modifiers/CMakeLists.txt b/source/blender/modifiers/CMakeLists.txt index e0ac4cfaafd..a015a6f3962 100644 --- a/source/blender/modifiers/CMakeLists.txt +++ b/source/blender/modifiers/CMakeLists.txt @@ -18,11 +18,6 @@ set(INC ../windowmanager ../../../intern/eigen - # Needed for shared line art functions from legacy implementations. - ../gpencil_modifiers_legacy - ../gpencil_modifiers_legacy/intern - ../gpencil_modifiers_legacy/intern/lineart - # RNA_prototypes.h ${CMAKE_BINARY_DIR}/source/blender/makesrna ) @@ -49,34 +44,20 @@ set(SRC intern/MOD_edgesplit.cc intern/MOD_explode.cc intern/MOD_fluid.cc - intern/MOD_grease_pencil_armature.cc - intern/MOD_grease_pencil_array.cc intern/MOD_grease_pencil_color.cc - intern/MOD_grease_pencil_dash.cc - intern/MOD_grease_pencil_envelope.cc - intern/MOD_grease_pencil_hook.cc - intern/MOD_grease_pencil_lattice.cc - intern/MOD_grease_pencil_length.cc intern/MOD_grease_pencil_mirror.cc - intern/MOD_grease_pencil_multiply.cc intern/MOD_grease_pencil_noise.cc intern/MOD_grease_pencil_offset.cc intern/MOD_grease_pencil_opacity.cc - intern/MOD_grease_pencil_outline.cc - intern/MOD_grease_pencil_shrinkwrap.cc intern/MOD_grease_pencil_smooth.cc intern/MOD_grease_pencil_subdiv.cc intern/MOD_grease_pencil_thickness.cc - intern/MOD_grease_pencil_time.cc intern/MOD_grease_pencil_tint.cc intern/MOD_grease_pencil_util.cc - intern/MOD_grease_pencil_weight_angle.cc - intern/MOD_grease_pencil_weight_proximity.cc intern/MOD_hook.cc intern/MOD_laplaciandeform.cc intern/MOD_laplaciansmooth.cc intern/MOD_lattice.cc - intern/MOD_lineart.cc intern/MOD_mask.cc intern/MOD_mesh_to_volume.cc intern/MOD_meshcache.cc diff --git a/source/blender/modifiers/MOD_modifiertypes.hh b/source/blender/modifiers/MOD_modifiertypes.hh index 4bd949ba47b..351abe1a0bd 100644 --- a/source/blender/modifiers/MOD_modifiertypes.hh +++ b/source/blender/modifiers/MOD_modifiertypes.hh @@ -82,20 +82,6 @@ extern ModifierTypeInfo modifierType_GreasePencilOffset; extern ModifierTypeInfo modifierType_GreasePencilNoise; extern ModifierTypeInfo modifierType_GreasePencilMirror; extern ModifierTypeInfo modifierType_GreasePencilThickness; -extern ModifierTypeInfo modifierType_GreasePencilLattice; -extern ModifierTypeInfo modifierType_GreasePencilDash; -extern ModifierTypeInfo modifierType_GreasePencilMultiply; -extern ModifierTypeInfo modifierType_GreasePencilLength; -extern ModifierTypeInfo modifierType_GreasePencilWeightAngle; -extern ModifierTypeInfo modifierType_GreasePencilArray; -extern ModifierTypeInfo modifierType_GreasePencilWeightProximity; -extern ModifierTypeInfo modifierType_GreasePencilHook; -extern ModifierTypeInfo modifierType_GreasePencilLineart; -extern ModifierTypeInfo modifierType_GreasePencilArmature; -extern ModifierTypeInfo modifierType_GreasePencilTime; -extern ModifierTypeInfo modifierType_GreasePencilEnvelope; -extern ModifierTypeInfo modifierType_GreasePencilOutline; -extern ModifierTypeInfo modifierType_GreasePencilShrinkwrap; /* MOD_util.cc */ diff --git a/source/blender/modifiers/intern/MOD_armature.cc b/source/blender/modifiers/intern/MOD_armature.cc index 613d243fc26..9e4567a6a3a 100644 --- a/source/blender/modifiers/intern/MOD_armature.cc +++ b/source/blender/modifiers/intern/MOD_armature.cc @@ -11,7 +11,7 @@ #include "BLI_listbase.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_armature_types.h" #include "DNA_defaults.h" @@ -21,16 +21,26 @@ #include "BKE_action.h" #include "BKE_armature.hh" +#include "BKE_context.hh" #include "BKE_deform.hh" +#include "BKE_editmesh.hh" +#include "BKE_lib_id.hh" #include "BKE_lib_query.hh" #include "BKE_mesh.hh" +#include "BKE_mesh_wrapper.hh" #include "BKE_modifier.hh" +#include "BKE_screen.hh" #include "UI_interface.hh" #include "UI_resources.hh" +#include "RNA_access.hh" #include "RNA_prototypes.h" +#include "BLO_read_write.hh" + +#include "DEG_depsgraph_query.hh" + #include "MEM_guardedalloc.h" #include "MOD_ui_common.hh" diff --git a/source/blender/modifiers/intern/MOD_array.cc b/source/blender/modifiers/intern/MOD_array.cc index da46104560f..a21b642eba6 100644 --- a/source/blender/modifiers/intern/MOD_array.cc +++ b/source/blender/modifiers/intern/MOD_array.cc @@ -16,17 +16,21 @@ #include "BLI_math_vector.h" #include "BLI_span.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" +#include "DNA_curve_types.h" #include "DNA_defaults.h" #include "DNA_meshdata_types.h" #include "DNA_object_types.h" +#include "DNA_scene_types.h" #include "DNA_screen_types.h" #include "BKE_anim_path.h" #include "BKE_attribute.hh" +#include "BKE_context.hh" #include "BKE_curve.hh" #include "BKE_customdata.hh" +#include "BKE_displist.h" #include "BKE_lib_id.hh" #include "BKE_lib_query.hh" #include "BKE_mesh.hh" @@ -34,6 +38,7 @@ #include "BKE_modifier.hh" #include "BKE_object_deform.h" #include "BKE_object_types.hh" +#include "BKE_screen.hh" #include "UI_interface.hh" #include "UI_resources.hh" @@ -42,8 +47,10 @@ #include "RNA_prototypes.h" #include "MOD_ui_common.hh" +#include "MOD_util.hh" #include "DEG_depsgraph.hh" +#include "DEG_depsgraph_query.hh" #include "GEO_mesh_merge_by_distance.hh" @@ -479,13 +486,13 @@ static Mesh *arrayModifier_doArray(ArrayModifierData *amd, float result_mat[4][4]; if (ctx->object) { - invert_m4_m4(obinv, ctx->object->object_to_world().ptr()); + invert_m4_m4(obinv, ctx->object->object_to_world); } else { unit_m4(obinv); } - mul_m4_series(result_mat, offset, obinv, amd->offset_ob->object_to_world().ptr()); + mul_m4_series(result_mat, offset, obinv, amd->offset_ob->object_to_world); copy_m4_m4(offset, result_mat); } @@ -497,7 +504,7 @@ static Mesh *arrayModifier_doArray(ArrayModifierData *amd, Object *curve_ob = amd->curve_ob; CurveCache *curve_cache = curve_ob->runtime->curve_cache; if (curve_cache != nullptr && curve_cache->anim_path_accum_length != nullptr) { - float scale_fac = mat4_to_scale(curve_ob->object_to_world().ptr()); + float scale_fac = mat4_to_scale(curve_ob->object_to_world); length = scale_fac * BKE_anim_path_get_length(curve_cache); } } diff --git a/source/blender/modifiers/intern/MOD_bevel.cc b/source/blender/modifiers/intern/MOD_bevel.cc index 4aaf55fc31f..6ca9255a2ef 100644 --- a/source/blender/modifiers/intern/MOD_bevel.cc +++ b/source/blender/modifiers/intern/MOD_bevel.cc @@ -13,17 +13,22 @@ #include "BLI_math_vector.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_curveprofile_types.h" #include "DNA_defaults.h" +#include "DNA_mesh_types.h" +#include "DNA_meshdata_types.h" #include "DNA_object_types.h" +#include "DNA_scene_types.h" #include "DNA_screen_types.h" +#include "BKE_context.hh" #include "BKE_curveprofile.h" #include "BKE_deform.hh" #include "BKE_mesh.hh" #include "BKE_modifier.hh" +#include "BKE_screen.hh" #include "UI_interface.hh" #include "UI_resources.hh" @@ -41,6 +46,8 @@ #include "bmesh.hh" #include "bmesh_tools.hh" +#include "DEG_depsgraph_query.hh" + static void init_data(ModifierData *md) { BevelModifierData *bmd = (BevelModifierData *)md; diff --git a/source/blender/modifiers/intern/MOD_boolean.cc b/source/blender/modifiers/intern/MOD_boolean.cc index 39cd5bac47e..6140eca3a25 100644 --- a/source/blender/modifiers/intern/MOD_boolean.cc +++ b/source/blender/modifiers/intern/MOD_boolean.cc @@ -17,20 +17,24 @@ #include "BLI_vector.hh" #include "BLI_vector_set.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" +#include "DNA_collection_types.h" #include "DNA_defaults.h" #include "DNA_mesh_types.h" +#include "DNA_meshdata_types.h" #include "DNA_object_types.h" #include "DNA_scene_types.h" #include "DNA_screen_types.h" -#include "BKE_collection.hh" -#include "BKE_global.hh" /* only to check G.debug */ +#include "BKE_collection.h" +#include "BKE_context.hh" +#include "BKE_global.h" /* only to check G.debug */ #include "BKE_lib_id.hh" #include "BKE_lib_query.hh" #include "BKE_material.h" #include "BKE_mesh.hh" +#include "BKE_mesh_boolean_convert.hh" #include "BKE_mesh_wrapper.hh" #include "BKE_modifier.hh" @@ -41,13 +45,17 @@ #include "RNA_prototypes.h" #include "MOD_ui_common.hh" +#include "MOD_util.hh" + +#include "DEG_depsgraph_query.hh" #include "MEM_guardedalloc.h" -#include "GEO_mesh_boolean.hh" #include "GEO_randomize.hh" #include "bmesh.hh" +#include "bmesh_tools.hh" +#include "tools/bmesh_boolean.hh" #include "tools/bmesh_intersect.hh" // #define DEBUG_TIME @@ -84,7 +92,7 @@ static bool is_disabled(const Scene * /*scene*/, ModifierData *md, bool /*use_re } if (bmd->flag & eBooleanModifierFlag_Collection) { /* The Exact solver tolerates an empty collection. */ - return !col && bmd->solver != eBooleanModifierSolver_Mesh_Arr; + return !col && bmd->solver != eBooleanModifierSolver_Exact; } return false; } @@ -135,8 +143,8 @@ static Mesh *get_quick_mesh( float imat[4][4]; float omat[4][4]; - invert_m4_m4(imat, ob_self->object_to_world().ptr()); - mul_m4_m4m4(omat, imat, ob_operand_ob->object_to_world().ptr()); + invert_m4_m4(imat, ob_self->object_to_world); + mul_m4_m4m4(omat, imat, ob_operand_ob->object_to_world); MutableSpan positions = result->vert_positions_for_write(); for (const int i : positions.index_range()) { @@ -176,7 +184,7 @@ static bool BMD_error_messages(const Object *ob, ModifierData *md) bool error_returns_result = false; const bool operand_collection = (bmd->flag & eBooleanModifierFlag_Collection) != 0; - const bool use_exact = bmd->solver == eBooleanModifierSolver_Mesh_Arr; + const bool use_exact = bmd->solver == eBooleanModifierSolver_Exact; const bool operation_intersect = bmd->operation == eBooleanModifierOp_Intersect; #ifndef WITH_GMP @@ -223,8 +231,8 @@ static BMesh *BMD_mesh_bm_create( SCOPED_TIMER(__func__); #endif - *r_is_flip = (is_negative_m4(object->object_to_world().ptr()) != - is_negative_m4(operand_ob->object_to_world().ptr())); + *r_is_flip = (is_negative_m4(object->object_to_world) != + is_negative_m4(operand_ob->object_to_world)); const BMAllocTemplate allocsize = BMALLOC_TEMPLATE_FROM_ME(mesh, mesh_operand_ob); @@ -291,8 +299,8 @@ static void BMD_mesh_intersection(BMesh *bm, float imat[4][4]; float omat[4][4]; - invert_m4_m4(imat, object->object_to_world().ptr()); - mul_m4_m4m4(omat, imat, operand_ob->object_to_world().ptr()); + invert_m4_m4(imat, object->object_to_world); + mul_m4_m4m4(omat, imat, operand_ob->object_to_world); BMVert *eve; i = 0; @@ -316,7 +324,7 @@ static void BMD_mesh_intersection(BMesh *bm, Array material_remap(operand_ob->totcol ? operand_ob->totcol : 1); /* Using original (not evaluated) object here since we are writing to it. */ - /* XXX Pretty sure comment above is fully wrong now with copy-on-eval & co ? */ + /* XXX Pretty sure comment above is fully wrong now with CoW & co ? */ BKE_object_material_remap_calc(ctx->object, operand_ob, material_remap.data()); BMFace *efa; @@ -420,7 +428,7 @@ static Mesh *exact_boolean_mesh(BooleanModifierData *bmd, } meshes.append(mesh); - obmats.append(ctx->object->object_to_world()); + obmats.append(float4x4(ctx->object->object_to_world)); material_remaps.append({}); const BooleanModifierMaterialMode material_mode = BooleanModifierMaterialMode( @@ -443,7 +451,7 @@ static Mesh *exact_boolean_mesh(BooleanModifierData *bmd, } BKE_mesh_wrapper_ensure_mdata(mesh_operand); meshes.append(mesh_operand); - obmats.append(bmd->object->object_to_world()); + obmats.append(float4x4(bmd->object->object_to_world)); if (material_mode == eBooleanModifierMaterialMode_Index) { material_remaps.append(get_material_remap_index_based(ctx->object, bmd->object)); } @@ -463,7 +471,7 @@ static Mesh *exact_boolean_mesh(BooleanModifierData *bmd, } BKE_mesh_wrapper_ensure_mdata(collection_mesh); meshes.append(collection_mesh); - obmats.append(ob->object_to_world()); + obmats.append(float4x4(ob->object_to_world)); if (material_mode == eBooleanModifierMaterialMode_Index) { material_remaps.append(get_material_remap_index_based(ctx->object, ob)); } @@ -478,18 +486,14 @@ static Mesh *exact_boolean_mesh(BooleanModifierData *bmd, const bool use_self = (bmd->flag & eBooleanModifierFlag_Self) != 0; const bool hole_tolerant = (bmd->flag & eBooleanModifierFlag_HoleTolerant) != 0; - blender::geometry::boolean::BooleanOpParameters op_params; - op_params.boolean_mode = blender::geometry::boolean::Operation(bmd->operation); - op_params.no_self_intersections = !use_self; - op_params.watertight = !hole_tolerant; - op_params.no_nested_components = false; - Mesh *result = blender::geometry::boolean::mesh_boolean( + Mesh *result = blender::meshintersect::direct_mesh_boolean( meshes, obmats, - ctx->object->object_to_world(), + float4x4(ctx->object->object_to_world), material_remaps, - op_params, - blender::geometry::boolean::Solver::MeshArr, + use_self, + hole_tolerant, + bmd->operation, nullptr); if (material_mode == eBooleanModifierMaterialMode_Transfer) { @@ -518,7 +522,7 @@ static Mesh *modify_mesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh } #ifdef WITH_GMP - if (bmd->solver == eBooleanModifierSolver_Mesh_Arr) { + if (bmd->solver == eBooleanModifierSolver_Exact) { return exact_boolean_mesh(bmd, ctx, mesh); } #endif @@ -636,7 +640,7 @@ static void solver_options_panel_draw(const bContext * /*C*/, Panel *panel) uiLayout *layout = panel->layout; PointerRNA *ptr = modifier_panel_get_property_pointers(panel, nullptr); - const bool use_exact = RNA_enum_get(ptr, "solver") == eBooleanModifierSolver_Mesh_Arr; + const bool use_exact = RNA_enum_get(ptr, "solver") == eBooleanModifierSolver_Exact; uiLayoutSetPropSep(layout, true); diff --git a/source/blender/modifiers/intern/MOD_build.cc b/source/blender/modifiers/intern/MOD_build.cc index 83579b73832..31ebe971e1c 100644 --- a/source/blender/modifiers/intern/MOD_build.cc +++ b/source/blender/modifiers/intern/MOD_build.cc @@ -14,19 +14,23 @@ #include "BLI_math_vector.h" #include "BLI_rand.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_defaults.h" #include "DNA_mesh_types.h" +#include "DNA_meshdata_types.h" #include "DNA_object_types.h" #include "DNA_screen_types.h" #include "DEG_depsgraph_query.hh" +#include "BKE_context.hh" #include "BKE_customdata.hh" #include "BKE_mesh.hh" #include "BKE_modifier.hh" -#include "BKE_scene.hh" +#include "BKE_particle.h" +#include "BKE_scene.h" +#include "BKE_screen.hh" #include "UI_interface.hh" #include "UI_resources.hh" @@ -34,6 +38,7 @@ #include "RNA_access.hh" #include "RNA_prototypes.h" +#include "MOD_modifiertypes.hh" #include "MOD_ui_common.hh" static void init_data(ModifierData *md) diff --git a/source/blender/modifiers/intern/MOD_cast.cc b/source/blender/modifiers/intern/MOD_cast.cc index d065dd82735..ad0d2124b55 100644 --- a/source/blender/modifiers/intern/MOD_cast.cc +++ b/source/blender/modifiers/intern/MOD_cast.cc @@ -10,17 +10,24 @@ #include "BLI_math_vector.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_defaults.h" +#include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" #include "DNA_object_types.h" #include "DNA_screen_types.h" +#include "BKE_context.hh" #include "BKE_deform.hh" +#include "BKE_editmesh.hh" +#include "BKE_lib_id.hh" #include "BKE_lib_query.hh" +#include "BKE_mesh.hh" +#include "BKE_mesh_runtime.hh" +#include "BKE_mesh_wrapper.hh" #include "BKE_modifier.hh" -#include "BKE_object_types.hh" +#include "BKE_screen.hh" #include "UI_interface.hh" #include "UI_resources.hh" @@ -28,6 +35,8 @@ #include "RNA_access.hh" #include "RNA_prototypes.h" +#include "DEG_depsgraph_query.hh" + #include "MOD_ui_common.hh" #include "MOD_util.hh" @@ -115,13 +124,13 @@ static void sphere_do(CastModifierData *cmd, * we use its location, transformed to ob's local space. */ if (ctrl_ob) { if (flag & MOD_CAST_USE_OB_TRANSFORM) { - invert_m4_m4(imat, ctrl_ob->object_to_world().ptr()); - mul_m4_m4m4(mat, imat, ob->object_to_world().ptr()); + invert_m4_m4(imat, ctrl_ob->object_to_world); + mul_m4_m4m4(mat, imat, ob->object_to_world); invert_m4_m4(imat, mat); } - invert_m4_m4(ob->runtime->world_to_object.ptr(), ob->object_to_world().ptr()); - mul_v3_m4v3(center, ob->world_to_object().ptr(), ctrl_ob->object_to_world().location()); + invert_m4_m4(ob->world_to_object, ob->object_to_world); + mul_v3_m4v3(center, ob->world_to_object, ctrl_ob->object_to_world[3]); } /* now we check which options the user wants */ @@ -263,13 +272,13 @@ static void cuboid_do(CastModifierData *cmd, if (ctrl_ob) { if (flag & MOD_CAST_USE_OB_TRANSFORM) { - invert_m4_m4(imat, ctrl_ob->object_to_world().ptr()); - mul_m4_m4m4(mat, imat, ob->object_to_world().ptr()); + invert_m4_m4(imat, ctrl_ob->object_to_world); + mul_m4_m4m4(mat, imat, ob->object_to_world); invert_m4_m4(imat, mat); } - invert_m4_m4(ob->runtime->world_to_object.ptr(), ob->object_to_world().ptr()); - mul_v3_m4v3(center, ob->world_to_object().ptr(), ctrl_ob->object_to_world().location()); + invert_m4_m4(ob->world_to_object, ob->object_to_world); + mul_v3_m4v3(center, ob->world_to_object, ctrl_ob->object_to_world[3]); } if ((flag & MOD_CAST_SIZE_FROM_RADIUS) && has_radius) { diff --git a/source/blender/modifiers/intern/MOD_cloth.cc b/source/blender/modifiers/intern/MOD_cloth.cc index 4916fea50fc..979203a37c1 100644 --- a/source/blender/modifiers/intern/MOD_cloth.cc +++ b/source/blender/modifiers/intern/MOD_cloth.cc @@ -12,7 +12,7 @@ #include "BLI_listbase.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_cloth_types.h" #include "DNA_defaults.h" @@ -20,29 +20,35 @@ #include "DNA_mesh_types.h" #include "DNA_object_force_types.h" #include "DNA_object_types.h" +#include "DNA_scene_types.h" #include "DNA_screen_types.h" #include "MEM_guardedalloc.h" #include "BKE_cloth.hh" +#include "BKE_context.hh" #include "BKE_customdata.hh" #include "BKE_effect.h" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_key.hh" #include "BKE_lib_id.hh" #include "BKE_lib_query.hh" +#include "BKE_mesh.hh" #include "BKE_modifier.hh" #include "BKE_pointcache.h" +#include "BKE_screen.hh" #include "UI_interface.hh" #include "UI_resources.hh" +#include "RNA_access.hh" #include "RNA_prototypes.h" #include "DEG_depsgraph_physics.hh" #include "DEG_depsgraph_query.hh" #include "MOD_ui_common.hh" +#include "MOD_util.hh" static void init_data(ModifierData *md) { diff --git a/source/blender/modifiers/intern/MOD_collision.cc b/source/blender/modifiers/intern/MOD_collision.cc index 5ad7d88c501..097c7b4981d 100644 --- a/source/blender/modifiers/intern/MOD_collision.cc +++ b/source/blender/modifiers/intern/MOD_collision.cc @@ -12,7 +12,7 @@ #include "BLI_math_matrix.h" #include "BLI_math_vector.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_defaults.h" #include "DNA_object_force_types.h" @@ -22,16 +22,27 @@ #include "MEM_guardedalloc.h" #include "BKE_collision.h" -#include "BKE_global.hh" +#include "BKE_context.hh" +#include "BKE_global.h" +#include "BKE_lib_id.hh" #include "BKE_mesh.hh" +#include "BKE_mesh_runtime.hh" #include "BKE_modifier.hh" +#include "BKE_pointcache.h" +#include "BKE_scene.h" +#include "BKE_screen.hh" #include "UI_interface.hh" #include "UI_resources.hh" +#include "RNA_access.hh" #include "RNA_prototypes.h" +#include "MOD_modifiertypes.hh" #include "MOD_ui_common.hh" +#include "MOD_util.hh" + +#include "BLO_read_write.hh" #include "DEG_depsgraph_query.hh" @@ -131,7 +142,7 @@ static void deform_verts(ModifierData *md, for (uint i = 0; i < mvert_num; i++) { /* we save global positions */ - mul_m4_v3(ob->object_to_world().ptr(), collmd->x[i]); + mul_m4_v3(ob->object_to_world, collmd->x[i]); } collmd->xnew = static_cast(MEM_dupallocN(collmd->x)); /* Frame end position. */ @@ -176,7 +187,7 @@ static void deform_verts(ModifierData *md, for (uint i = 0; i < mvert_num; i++) { /* we save global positions */ - mul_m4_v3(ob->object_to_world().ptr(), collmd->xnew[i]); + mul_m4_v3(ob->object_to_world, collmd->xnew[i]); /* detect motion */ is_static = is_static && equals_v3v3(collmd->x[i], collmd->xnew[i]); diff --git a/source/blender/modifiers/intern/MOD_correctivesmooth.cc b/source/blender/modifiers/intern/MOD_correctivesmooth.cc index 28e0735254f..bb628e01b67 100644 --- a/source/blender/modifiers/intern/MOD_correctivesmooth.cc +++ b/source/blender/modifiers/intern/MOD_correctivesmooth.cc @@ -13,18 +13,24 @@ #include "BLI_math_vector.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_defaults.h" #include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" #include "DNA_object_types.h" +#include "DNA_scene_types.h" #include "DNA_screen_types.h" #include "MEM_guardedalloc.h" +#include "BKE_context.hh" #include "BKE_deform.hh" #include "BKE_editmesh.hh" +#include "BKE_lib_id.hh" +#include "BKE_mesh.hh" +#include "BKE_mesh_wrapper.hh" +#include "BKE_screen.hh" #include "UI_interface.hh" #include "UI_resources.hh" @@ -45,9 +51,10 @@ #include "BLI_time.h" #ifdef DEBUG_TIME # include "BLI_time_utildefines.h" + #endif -#include "BLI_strict_flags.h" /* Keep last. */ +#include "BLI_strict_flags.h" static void init_data(ModifierData *md) { diff --git a/source/blender/modifiers/intern/MOD_curve.cc b/source/blender/modifiers/intern/MOD_curve.cc index 8a6de0d00e1..4f46ebe3f67 100644 --- a/source/blender/modifiers/intern/MOD_curve.cc +++ b/source/blender/modifiers/intern/MOD_curve.cc @@ -10,27 +10,36 @@ #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_defaults.h" #include "DNA_mesh_types.h" #include "DNA_object_types.h" +#include "DNA_scene_types.h" #include "DNA_screen_types.h" +#include "BKE_context.hh" #include "BKE_curve.hh" #include "BKE_deform.hh" +#include "BKE_editmesh.hh" +#include "BKE_lib_id.hh" #include "BKE_lib_query.hh" #include "BKE_mesh.hh" +#include "BKE_mesh_wrapper.hh" #include "BKE_modifier.hh" +#include "BKE_screen.hh" #include "UI_interface.hh" #include "UI_resources.hh" +#include "RNA_access.hh" #include "RNA_prototypes.h" #include "DEG_depsgraph.hh" #include "DEG_depsgraph_build.hh" +#include "DEG_depsgraph_query.hh" +#include "MOD_modifiertypes.hh" #include "MOD_ui_common.hh" #include "MOD_util.hh" diff --git a/source/blender/modifiers/intern/MOD_datatransfer.cc b/source/blender/modifiers/intern/MOD_datatransfer.cc index 100d9fa7738..f8d9c32dd38 100644 --- a/source/blender/modifiers/intern/MOD_datatransfer.cc +++ b/source/blender/modifiers/intern/MOD_datatransfer.cc @@ -8,13 +8,15 @@ #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_mesh_types.h" +#include "DNA_meshdata_types.h" #include "DNA_modifier_types.h" #include "DNA_object_types.h" #include "DNA_screen_types.h" +#include "BKE_context.hh" #include "BKE_customdata.hh" #include "BKE_data_transfer.h" #include "BKE_lib_id.hh" @@ -23,7 +25,8 @@ #include "BKE_mesh_mapping.hh" #include "BKE_mesh_remap.hh" #include "BKE_modifier.hh" -#include "BKE_report.hh" +#include "BKE_report.h" +#include "BKE_screen.hh" #include "UI_interface.hh" #include "UI_resources.hh" @@ -31,9 +34,12 @@ #include "RNA_access.hh" #include "RNA_prototypes.h" +#include "DEG_depsgraph_query.hh" + #include "MEM_guardedalloc.h" #include "MOD_ui_common.hh" +#include "MOD_util.hh" /************************************** * Modifiers functions. * diff --git a/source/blender/modifiers/intern/MOD_decimate.cc b/source/blender/modifiers/intern/MOD_decimate.cc index c17a4b2ab62..d9aad87d8c3 100644 --- a/source/blender/modifiers/intern/MOD_decimate.cc +++ b/source/blender/modifiers/intern/MOD_decimate.cc @@ -9,7 +9,7 @@ #include "BLI_string.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_defaults.h" #include "DNA_mesh_types.h" @@ -19,8 +19,10 @@ #include "MEM_guardedalloc.h" +#include "BKE_context.hh" #include "BKE_deform.hh" #include "BKE_mesh.hh" +#include "BKE_screen.hh" #include "UI_interface.hh" #include "UI_resources.hh" diff --git a/source/blender/modifiers/intern/MOD_displace.cc b/source/blender/modifiers/intern/MOD_displace.cc index 9ee636ed448..9c2b704474f 100644 --- a/source/blender/modifiers/intern/MOD_displace.cc +++ b/source/blender/modifiers/intern/MOD_displace.cc @@ -12,7 +12,7 @@ #include "BLI_math_vector.h" #include "BLI_task.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_defaults.h" #include "DNA_mesh_types.h" @@ -20,12 +20,18 @@ #include "DNA_object_types.h" #include "DNA_screen_types.h" +#include "BKE_context.hh" #include "BKE_customdata.hh" #include "BKE_deform.hh" +#include "BKE_editmesh.hh" #include "BKE_image.h" +#include "BKE_lib_id.hh" #include "BKE_lib_query.hh" #include "BKE_mesh.hh" +#include "BKE_mesh_wrapper.hh" #include "BKE_modifier.hh" +#include "BKE_object.hh" +#include "BKE_screen.hh" #include "BKE_texture.h" #include "UI_interface.hh" @@ -317,7 +323,7 @@ static void displaceModifier_do(DisplaceModifierData *dmd, else if (ELEM(direction, MOD_DISP_DIR_X, MOD_DISP_DIR_Y, MOD_DISP_DIR_Z, MOD_DISP_DIR_RGB_XYZ) && use_global_direction) { - copy_m4_m4(local_mat, ob->object_to_world().ptr()); + copy_m4_m4(local_mat, ob->object_to_world); } DisplaceUserdata data = {nullptr}; diff --git a/source/blender/modifiers/intern/MOD_dynamicpaint.cc b/source/blender/modifiers/intern/MOD_dynamicpaint.cc index 20e9d55325b..c03e1bbe36c 100644 --- a/source/blender/modifiers/intern/MOD_dynamicpaint.cc +++ b/source/blender/modifiers/intern/MOD_dynamicpaint.cc @@ -12,21 +12,28 @@ #include "BLI_listbase.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_defaults.h" #include "DNA_dynamicpaint_types.h" +#include "DNA_mesh_types.h" #include "DNA_object_force_types.h" #include "DNA_object_types.h" +#include "DNA_scene_types.h" #include "DNA_screen_types.h" +#include "BKE_context.hh" #include "BKE_dynamicpaint.h" +#include "BKE_layer.hh" #include "BKE_lib_query.hh" +#include "BKE_mesh.hh" #include "BKE_modifier.hh" +#include "BKE_screen.hh" #include "UI_interface.hh" #include "UI_resources.hh" +#include "RNA_access.hh" #include "RNA_prototypes.h" #include "DEG_depsgraph.hh" @@ -34,6 +41,7 @@ #include "DEG_depsgraph_physics.hh" #include "DEG_depsgraph_query.hh" +#include "MOD_modifiertypes.hh" #include "MOD_ui_common.hh" static void init_data(ModifierData *md) diff --git a/source/blender/modifiers/intern/MOD_edgesplit.cc b/source/blender/modifiers/intern/MOD_edgesplit.cc index 8c9475bf80d..10341de358e 100644 --- a/source/blender/modifiers/intern/MOD_edgesplit.cc +++ b/source/blender/modifiers/intern/MOD_edgesplit.cc @@ -14,14 +14,17 @@ #include "BLI_math_vector.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_defaults.h" #include "DNA_mesh_types.h" +#include "DNA_object_types.h" #include "DNA_screen_types.h" +#include "BKE_context.hh" #include "BKE_mesh.hh" #include "BKE_modifier.hh" +#include "BKE_screen.hh" #include "UI_interface.hh" #include "UI_resources.hh" @@ -32,6 +35,7 @@ #include "bmesh.hh" #include "bmesh_tools.hh" +#include "MOD_modifiertypes.hh" #include "MOD_ui_common.hh" #include "GEO_randomize.hh" diff --git a/source/blender/modifiers/intern/MOD_explode.cc b/source/blender/modifiers/intern/MOD_explode.cc index 2ed5cdca584..9dfc95e5e52 100644 --- a/source/blender/modifiers/intern/MOD_explode.cc +++ b/source/blender/modifiers/intern/MOD_explode.cc @@ -17,26 +17,32 @@ #include "BLI_math_vector.h" #include "BLI_rand.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_defaults.h" #include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" #include "DNA_object_types.h" +#include "DNA_scene_types.h" #include "DNA_screen_types.h" +#include "BKE_context.hh" #include "BKE_customdata.hh" #include "BKE_deform.hh" +#include "BKE_lattice.hh" #include "BKE_lib_id.hh" #include "BKE_mesh.hh" #include "BKE_mesh_legacy_convert.hh" #include "BKE_modifier.hh" #include "BKE_particle.h" -#include "BKE_scene.hh" +#include "BKE_scene.h" +#include "BKE_screen.hh" #include "UI_interface.hh" #include "UI_resources.hh" +#include "BLO_read_write.hh" + #include "RNA_access.hh" #include "RNA_prototypes.h" @@ -44,6 +50,7 @@ #include "MEM_guardedalloc.h" +#include "MOD_modifiertypes.hh" #include "MOD_ui_common.hh" static void init_data(ModifierData *md) @@ -973,7 +980,7 @@ static Mesh *explodeMesh(ExplodeModifierData *emd, &explode->fdata_legacy, CD_MTFACE, emd->uvname, explode->totface_legacy)); /* getting back to object space */ - invert_m4_m4(imat, ctx->object->object_to_world().ptr()); + invert_m4_m4(imat, ctx->object->object_to_world); psys_sim_data_init(&sim); @@ -1001,7 +1008,7 @@ static Mesh *explodeMesh(ExplodeModifierData *emd, psys_get_particle_state(&sim, ed_v2, &state, true); vertco = explode_positions[v]; - mul_m4_v3(ctx->object->object_to_world().ptr(), vertco); + mul_m4_v3(ctx->object->object_to_world, vertco); sub_v3_v3(vertco, birth.co); diff --git a/source/blender/modifiers/intern/MOD_fluid.cc b/source/blender/modifiers/intern/MOD_fluid.cc index 5876f85b0ff..e9b3984343d 100644 --- a/source/blender/modifiers/intern/MOD_fluid.cc +++ b/source/blender/modifiers/intern/MOD_fluid.cc @@ -13,20 +13,27 @@ #include "BLI_task.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" +#include "DNA_collection_types.h" #include "DNA_fluid_types.h" +#include "DNA_mesh_types.h" #include "DNA_object_force_types.h" #include "DNA_object_types.h" +#include "DNA_scene_types.h" #include "DNA_screen_types.h" +#include "BKE_context.hh" #include "BKE_fluid.h" +#include "BKE_layer.hh" #include "BKE_lib_query.hh" #include "BKE_modifier.hh" +#include "BKE_screen.hh" #include "UI_interface.hh" #include "UI_resources.hh" +#include "RNA_access.hh" #include "RNA_prototypes.h" #include "DEG_depsgraph.hh" @@ -34,6 +41,7 @@ #include "DEG_depsgraph_physics.hh" #include "DEG_depsgraph_query.hh" +#include "MOD_modifiertypes.hh" #include "MOD_ui_common.hh" static void init_data(ModifierData *md) diff --git a/source/blender/modifiers/intern/MOD_grease_pencil_armature.cc b/source/blender/modifiers/intern/MOD_grease_pencil_armature.cc deleted file mode 100644 index b6f8e3447a0..00000000000 --- a/source/blender/modifiers/intern/MOD_grease_pencil_armature.cc +++ /dev/null @@ -1,243 +0,0 @@ -/* SPDX-FileCopyrightText: 2024 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup modifiers - */ - -#include "MEM_guardedalloc.h" - -#include "BLI_math_matrix.hh" - -#include "DNA_defaults.h" -#include "DNA_material_types.h" -#include "DNA_meshdata_types.h" -#include "DNA_modifier_types.h" -#include "DNA_scene_types.h" - -#include "BKE_armature.hh" -#include "BKE_colorband.hh" -#include "BKE_curves.hh" -#include "BKE_geometry_set.hh" -#include "BKE_grease_pencil.hh" -#include "BKE_lib_query.hh" -#include "BKE_material.h" -#include "BKE_modifier.hh" -#include "BKE_screen.hh" - -#include "BLO_read_write.hh" - -#include "DEG_depsgraph_query.hh" - -#include "UI_interface.hh" -#include "UI_resources.hh" - -#include "BLT_translation.hh" - -#include "WM_types.hh" - -#include "RNA_access.hh" -#include "RNA_enum_types.hh" -#include "RNA_prototypes.h" - -#include "MOD_grease_pencil_util.hh" -#include "MOD_modifiertypes.hh" -#include "MOD_ui_common.hh" - -namespace blender { - -using bke::greasepencil::Drawing; - -static void init_data(ModifierData *md) -{ - auto *amd = reinterpret_cast(md); - - BLI_assert(MEMCMP_STRUCT_AFTER_IS_ZERO(amd, modifier)); - - MEMCPY_STRUCT_AFTER(amd, DNA_struct_default_get(GreasePencilArmatureModifierData), modifier); - modifier::greasepencil::init_influence_data(&amd->influence, false); -} - -static void copy_data(const ModifierData *md, ModifierData *target, const int flag) -{ - const auto *amd = reinterpret_cast(md); - auto *tamd = reinterpret_cast(target); - - modifier::greasepencil::free_influence_data(&tamd->influence); - - BKE_modifier_copydata_generic(md, target, flag); - modifier::greasepencil::copy_influence_data(&amd->influence, &tamd->influence, flag); -} - -static void free_data(ModifierData *md) -{ - auto *amd = reinterpret_cast(md); - modifier::greasepencil::free_influence_data(&amd->influence); -} - -static void foreach_ID_link(ModifierData *md, Object *ob, IDWalkFunc walk, void *user_data) -{ - auto *amd = reinterpret_cast(md); - modifier::greasepencil::foreach_influence_ID_link(&amd->influence, ob, walk, user_data); - walk(user_data, ob, (ID **)&amd->object, IDWALK_CB_NOP); -} - -static bool is_disabled(const Scene * /*scene*/, ModifierData *md, bool /*use_render_params*/) -{ - auto *amd = reinterpret_cast(md); - - /* The object type check is only needed here in case we have a placeholder - * object assigned (because the library containing the armature is missing). - * - * In other cases it should be impossible to have a type mismatch. */ - return !amd->object || amd->object->type != OB_ARMATURE; -} - -static void update_depsgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx) -{ - auto *amd = reinterpret_cast(md); - if (amd->object != nullptr) { - DEG_add_object_relation(ctx->node, amd->object, DEG_OB_COMP_EVAL_POSE, "Armature Modifier"); - DEG_add_object_relation(ctx->node, amd->object, DEG_OB_COMP_TRANSFORM, "Armature Modifier"); - } - DEG_add_object_relation(ctx->node, ctx->object, DEG_OB_COMP_TRANSFORM, "Armature Modifier"); -} - -static void modify_curves(ModifierData &md, const ModifierEvalContext &ctx, Drawing &drawing) -{ - auto &amd = reinterpret_cast(md); - bke::CurvesGeometry &curves = drawing.strokes_for_write(); - - /* The influence flag is where the "invert" flag is stored, - * but armature functions expect `deformflag` to have the flag set as well. - * Copy to `deformflag` here to keep old functions happy. */ - const int deformflag = amd.deformflag | - (amd.influence.flag & GREASE_PENCIL_INFLUENCE_INVERT_VERTEX_GROUP ? - ARM_DEF_INVERT_VGROUP : - 0); - - IndexMaskMemory mask_memory; - const IndexMask curves_mask = modifier::greasepencil::get_filtered_stroke_mask( - ctx.object, curves, amd.influence, mask_memory); - - const OffsetIndices points_by_curve = curves.points_by_curve(); - const MutableSpan positions = curves.positions_for_write(); - const Span dverts = curves.deform_verts(); - - if (dverts.is_empty()) { - return; - } - - curves_mask.foreach_index(blender::GrainSize(128), [&](const int curve_i) { - const IndexRange points = points_by_curve[curve_i]; - - BKE_armature_deform_coords_with_curves(*amd.object, - *ctx.object, - positions.slice(points), - std::nullopt, - std::nullopt, - dverts.slice(points), - deformflag, - amd.influence.vertex_group_name); - }); - - drawing.tag_positions_changed(); -} - -static void modify_geometry_set(ModifierData *md, - const ModifierEvalContext *ctx, - bke::GeometrySet *geometry_set) -{ - const auto *amd = reinterpret_cast(md); - - if (!geometry_set->has_grease_pencil()) { - return; - } - GreasePencil &grease_pencil = *geometry_set->get_grease_pencil_for_write(); - const int frame = grease_pencil.runtime->eval_frame; - - IndexMaskMemory mask_memory; - const IndexMask layer_mask = modifier::greasepencil::get_filtered_layer_mask( - grease_pencil, amd->influence, mask_memory); - const Vector drawings = modifier::greasepencil::get_drawings_for_write( - grease_pencil, layer_mask, frame); - threading::parallel_for_each(drawings, - [&](Drawing *drawing) { modify_curves(*md, *ctx, *drawing); }); -} - -static void panel_draw(const bContext *C, Panel *panel) -{ - uiLayout *layout = panel->layout; - - PointerRNA ob_ptr; - PointerRNA *ptr = modifier_panel_get_property_pointers(panel, &ob_ptr); - - uiLayoutSetPropSep(layout, true); - - uiItemR(layout, ptr, "object", UI_ITEM_NONE, nullptr, ICON_NONE); - modifier::greasepencil::draw_vertex_group_settings(C, layout, ptr); - - uiLayout *col = uiLayoutColumnWithHeading(layout, true, IFACE_("Bind To")); - uiItemR(col, ptr, "use_vertex_groups", UI_ITEM_NONE, IFACE_("Vertex Groups"), ICON_NONE); - uiItemR(col, ptr, "use_bone_envelopes", UI_ITEM_NONE, IFACE_("Bone Envelopes"), ICON_NONE); - - modifier_panel_end(layout, ptr); -} - -static void panel_register(ARegionType *region_type) -{ - modifier_panel_register(region_type, eModifierType_GreasePencilArmature, panel_draw); -} - -static void blend_write(BlendWriter *writer, const ID * /*id_owner*/, const ModifierData *md) -{ - const auto *amd = reinterpret_cast(md); - - BLO_write_struct(writer, GreasePencilArmatureModifierData, amd); - modifier::greasepencil::write_influence_data(writer, &amd->influence); -} - -static void blend_read(BlendDataReader *reader, ModifierData *md) -{ - auto *amd = reinterpret_cast(md); - - modifier::greasepencil::read_influence_data(reader, &amd->influence); -} - -} // namespace blender - -ModifierTypeInfo modifierType_GreasePencilArmature = { - /*idname*/ "GreasePencilArmature", - /*name*/ N_("Armature"), - /*struct_name*/ "GreasePencilArmatureModifierData", - /*struct_size*/ sizeof(GreasePencilArmatureModifierData), - /*srna*/ &RNA_GreasePencilArmatureModifier, - /*type*/ ModifierTypeType::OnlyDeform, - /*flags*/ eModifierTypeFlag_AcceptsGreasePencil | eModifierTypeFlag_SupportsEditmode | - eModifierTypeFlag_EnableInEditmode | eModifierTypeFlag_SupportsMapping, - /*icon*/ ICON_MOD_ARMATURE, - - /*copy_data*/ blender::copy_data, - - /*deform_verts*/ nullptr, - /*deform_matrices*/ nullptr, - /*deform_verts_EM*/ nullptr, - /*deform_matrices_EM*/ nullptr, - /*modify_mesh*/ nullptr, - /*modify_geometry_set*/ blender::modify_geometry_set, - - /*init_data*/ blender::init_data, - /*required_data_mask*/ nullptr, - /*free_data*/ blender::free_data, - /*is_disabled*/ blender::is_disabled, - /*update_depsgraph*/ blender::update_depsgraph, - /*depends_on_time*/ nullptr, - /*depends_on_normals*/ nullptr, - /*foreach_ID_link*/ blender::foreach_ID_link, - /*foreach_tex_link*/ nullptr, - /*free_runtime_data*/ nullptr, - /*panel_register*/ blender::panel_register, - /*blend_write*/ blender::blend_write, - /*blend_read*/ blender::blend_read, -}; diff --git a/source/blender/modifiers/intern/MOD_grease_pencil_array.cc b/source/blender/modifiers/intern/MOD_grease_pencil_array.cc deleted file mode 100644 index 76db89a1987..00000000000 --- a/source/blender/modifiers/intern/MOD_grease_pencil_array.cc +++ /dev/null @@ -1,397 +0,0 @@ -/* SPDX-FileCopyrightText: 2024 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup modifiers - */ - -#include "DNA_defaults.h" -#include "DNA_modifier_types.h" - -#include "BKE_curves.hh" -#include "BKE_geometry_set.hh" -#include "BKE_grease_pencil.hh" -#include "BKE_instances.hh" -#include "BKE_lib_query.hh" -#include "BKE_material.h" -#include "BKE_modifier.hh" -#include "BKE_screen.hh" - -#include "BLO_read_write.hh" - -#include "GEO_realize_instances.hh" - -#include "UI_interface.hh" -#include "UI_resources.hh" - -#include "BLT_translation.hh" - -#include "BLI_bounds_types.hh" -#include "BLI_hash.h" -#include "BLI_math_matrix.hh" -#include "BLI_rand.h" - -#include "WM_types.hh" - -#include "RNA_access.hh" -#include "RNA_prototypes.h" - -#include "MOD_grease_pencil_util.hh" -#include "MOD_modifiertypes.hh" -#include "MOD_ui_common.hh" - -namespace blender { - -static void init_data(ModifierData *md) -{ - auto *mmd = reinterpret_cast(md); - - BLI_assert(MEMCMP_STRUCT_AFTER_IS_ZERO(mmd, modifier)); - - MEMCPY_STRUCT_AFTER(mmd, DNA_struct_default_get(GreasePencilArrayModifierData), modifier); - modifier::greasepencil::init_influence_data(&mmd->influence, false); -} - -static void copy_data(const ModifierData *md, ModifierData *target, const int flag) -{ - const auto *mmd = reinterpret_cast(md); - auto *tmmd = reinterpret_cast(target); - - modifier::greasepencil::free_influence_data(&tmmd->influence); - - BKE_modifier_copydata_generic(md, target, flag); - modifier::greasepencil::copy_influence_data(&mmd->influence, &tmmd->influence, flag); -} - -static void free_data(ModifierData *md) -{ - auto *mmd = reinterpret_cast(md); - modifier::greasepencil::free_influence_data(&mmd->influence); -} - -static void foreach_ID_link(ModifierData *md, Object *ob, IDWalkFunc walk, void *user_data) -{ - auto *mmd = reinterpret_cast(md); - walk(user_data, ob, (ID **)&mmd->object, IDWALK_CB_NOP); - modifier::greasepencil::foreach_influence_ID_link(&mmd->influence, ob, walk, user_data); -} - -static void update_depsgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx) -{ - auto *mmd = reinterpret_cast(md); - if (mmd->object != nullptr) { - DEG_add_object_relation( - ctx->node, mmd->object, DEG_OB_COMP_TRANSFORM, "Grease Pencil Array Modifier"); - DEG_add_depends_on_transform_relation(ctx->node, "Grease Pencil Array Modifier"); - } -} - -static float4x4 get_array_matrix(const Object &ob, - const GreasePencilArrayModifierData &mmd, - const int elem_idx, - const bool use_object_offset) -{ - - if (use_object_offset) { - float4x4 mat_offset = float4x4::identity(); - - if (mmd.flag & MOD_GREASE_PENCIL_ARRAY_USE_OFFSET) { - mat_offset[3] += mmd.offset; - } - const float4x4 &obinv = ob.world_to_object(); - - return mat_offset * obinv * mmd.object->object_to_world(); - } - - const float3 offset = [&]() { - if (mmd.flag & MOD_GREASE_PENCIL_ARRAY_USE_OFFSET) { - return float3(mmd.offset) * elem_idx; - } - return float3(0.0f); - }(); - - return math::from_location(offset); -} - -static float4x4 get_rand_matrix(const GreasePencilArrayModifierData &mmd, - const Object &ob, - const int elem_id) -{ - int seed = mmd.seed; - seed += BLI_hash_string(ob.id.name + 2); - seed += BLI_hash_string(mmd.modifier.name); - const float rand_offset = BLI_hash_int_01(seed); - float3x3 rand; - for (int j = 0; j < 3; j++) { - const uint3 primes(2, 3, 7); - double3 offset(0.0); - double3 r; - /* To ensure a nice distribution, we use halton sequence and offset using the seed. */ - BLI_halton_3d(primes, offset, elem_id, r); - - if ((mmd.flag & MOD_GREASE_PENCIL_ARRAY_UNIFORM_RANDOM_SCALE) && j == 2) { - float rand_value; - rand_value = math::mod(r[0] * 2.0 - 1.0 + rand_offset, 1.0); - rand_value = math::mod(math::sin(rand_value * 12.9898 + j * 78.233) * 43758.5453, 1.0); - rand[j] = float3(rand_value); - } - else { - for (int i = 0; i < 3; i++) { - rand[j][i] = math::mod(r[i] * 2.0 - 1.0 + rand_offset, 1.0); - rand[j][i] = math::mod(math::sin(rand[j][i] * 12.9898 + j * 78.233) * 43758.5453, 1.0); - } - } - } - /* Calculate Random matrix. */ - return math::from_loc_rot_scale( - mmd.rnd_offset * rand[0], mmd.rnd_rot * rand[1], float3(1.0f) + mmd.rnd_scale * rand[2]); -}; - -static bke::CurvesGeometry create_array_copies(const Object &ob, - const GreasePencilArrayModifierData &mmd, - const bke::CurvesGeometry &base_curves, - bke::CurvesGeometry filtered_curves) -{ - /* Assign replacement material on filtered curves so all copies can have this material when later - * when they get instanced. */ - if (mmd.mat_rpl > 0) { - bke::MutableAttributeAccessor attributes = filtered_curves.attributes_for_write(); - bke::SpanAttributeWriter stroke_materials = attributes.lookup_or_add_for_write_span( - "material_index", bke::AttrDomain::Curve); - stroke_materials.span.fill(mmd.mat_rpl - 1); - stroke_materials.finish(); - } - - Curves *base_curves_id = bke::curves_new_nomain(base_curves); - Curves *filtered_curves_id = bke::curves_new_nomain(filtered_curves); - bke::GeometrySet base_geo = bke::GeometrySet::from_curves(base_curves_id); - bke::GeometrySet filtered_geo = bke::GeometrySet::from_curves(filtered_curves_id); - - std::unique_ptr instances = std::make_unique(); - const int base_handle = instances->add_reference(bke::InstanceReference{base_geo}); - const int filtered_handle = instances->add_reference(bke::InstanceReference{filtered_geo}); - - /* Always add untouched original curves. */ - instances->add_instance(base_handle, float4x4::identity()); - - float3 size(0.0f); - if (mmd.flag & MOD_GREASE_PENCIL_ARRAY_USE_RELATIVE) { - std::optional> bounds = filtered_curves.bounds_min_max(); - if (bounds.has_value()) { - size = bounds.value().max - bounds.value().min; - /* Need a minimum size (for flat drawings). */ - size = math::max(size, float3(0.01f)); - } - } - - float4x4 current_offset = float4x4::identity(); - for (const int elem_id : IndexRange(1, mmd.count - 1)) { - const bool use_object_offset = (mmd.flag & MOD_GREASE_PENCIL_ARRAY_USE_OB_OFFSET) && - (mmd.object); - const float4x4 mat = get_array_matrix(ob, mmd, elem_id, use_object_offset); - - if (use_object_offset) { - current_offset = current_offset * mat; - } - else { - current_offset = mat; - } - - /* Apply relative offset. */ - if (mmd.flag & MOD_GREASE_PENCIL_ARRAY_USE_RELATIVE) { - float3 relative = size * float3(mmd.shift); - float3 translate = relative * float3(float(elem_id)); - current_offset.w += float4(translate, 1.0f); - } - - current_offset *= get_rand_matrix(mmd, ob, elem_id); - - instances->add_instance(filtered_handle, current_offset); - } - - geometry::RealizeInstancesOptions options; - options.keep_original_ids = true; - options.realize_instance_attributes = false; /* Should this be true? */ - options.propagation_info = {}; - bke::GeometrySet result_geo = geometry::realize_instances( - bke::GeometrySet::from_instances(instances.release()), options); - return std::move(result_geo.get_curves_for_write()->geometry.wrap()); -} - -static void modify_drawing(const GreasePencilArrayModifierData &mmd, - const ModifierEvalContext &ctx, - bke::greasepencil::Drawing &drawing) -{ - const bke::CurvesGeometry &src_curves = drawing.strokes(); - if (src_curves.curve_num == 0) { - return; - } - - IndexMaskMemory curve_mask_memory; - const IndexMask curves_mask = modifier::greasepencil::get_filtered_stroke_mask( - ctx.object, src_curves, mmd.influence, curve_mask_memory); - - if (curves_mask.size() == src_curves.curve_num) { - /* Make a full copy so we can modify materials inside #create_array_copies before instancing. - */ - bke::CurvesGeometry copy = bke::CurvesGeometry(src_curves); - - drawing.strokes_for_write() = create_array_copies( - *ctx.object, mmd, src_curves, std::move(copy)); - } - else { - bke::CurvesGeometry masked_curves = bke::curves_copy_curve_selection( - src_curves, curves_mask, {}); - - drawing.strokes_for_write() = create_array_copies( - *ctx.object, mmd, src_curves, std::move(masked_curves)); - } - - drawing.tag_topology_changed(); -} - -static void modify_geometry_set(ModifierData *md, - const ModifierEvalContext *ctx, - bke::GeometrySet *geometry_set) -{ - using bke::greasepencil::Drawing; - - auto *mmd = reinterpret_cast(md); - - if (!geometry_set->has_grease_pencil()) { - return; - } - GreasePencil &grease_pencil = *geometry_set->get_grease_pencil_for_write(); - const int frame = grease_pencil.runtime->eval_frame; - - IndexMaskMemory mask_memory; - const IndexMask layer_mask = modifier::greasepencil::get_filtered_layer_mask( - grease_pencil, mmd->influence, mask_memory); - - const Vector drawings = modifier::greasepencil::get_drawings_for_write( - grease_pencil, layer_mask, frame); - threading::parallel_for_each(drawings, - [&](Drawing *drawing) { modify_drawing(*mmd, *ctx, *drawing); }); -} - -static void panel_draw(const bContext *C, Panel *panel) -{ - uiLayout *layout = panel->layout; - - PointerRNA ob_ptr; - PointerRNA *ptr = modifier_panel_get_property_pointers(panel, &ob_ptr); - - uiLayoutSetPropSep(layout, true); - - uiItemR(layout, ptr, "count", UI_ITEM_NONE, nullptr, ICON_NONE); - uiItemR(layout, ptr, "replace_material", UI_ITEM_NONE, IFACE_("Material Override"), ICON_NONE); - - if (uiLayout *sub = uiLayoutPanelProp( - C, layout, ptr, "open_relative_offset_panel", "Relative Offset")) - { - uiLayoutSetPropSep(sub, true); - uiItemR(sub, ptr, "use_relative_offset", UI_ITEM_NONE, IFACE_("Enable"), ICON_NONE); - - uiLayout *col = uiLayoutColumn(sub, false); - uiLayoutSetActive(col, RNA_boolean_get(ptr, "use_relative_offset")); - uiItemR(col, ptr, "relative_offset", UI_ITEM_NONE, IFACE_("Factor"), ICON_NONE); - } - - if (uiLayout *sub = uiLayoutPanelProp( - C, layout, ptr, "open_constant_offset_panel", "Constant Offset")) - { - uiLayoutSetPropSep(sub, true); - uiItemR(sub, ptr, "use_constant_offset", UI_ITEM_NONE, IFACE_("Enable"), ICON_NONE); - - uiLayout *col = uiLayoutColumn(sub, false); - uiLayoutSetActive(col, RNA_boolean_get(ptr, "use_constant_offset")); - uiItemR(col, ptr, "constant_offset", UI_ITEM_NONE, IFACE_("Distance"), ICON_NONE); - } - - if (uiLayout *sub = uiLayoutPanelProp( - C, layout, ptr, "open_object_offset_panel", "Object Offset")) - { - uiLayoutSetPropSep(sub, true); - uiItemR(sub, ptr, "use_object_offset", UI_ITEM_NONE, IFACE_("Enable"), ICON_NONE); - - uiLayout *col = uiLayoutColumn(sub, false); - uiLayoutSetActive(col, RNA_boolean_get(ptr, "use_object_offset")); - uiItemR(col, ptr, "offset_object", UI_ITEM_NONE, IFACE_("Object"), ICON_NONE); - } - - if (uiLayout *sub = uiLayoutPanelProp(C, layout, ptr, "open_randomize_panel", "Randomize")) { - uiLayoutSetPropSep(sub, true); - uiItemR(sub, ptr, "random_offset", UI_ITEM_NONE, IFACE_("Offset"), ICON_NONE); - uiItemR(sub, ptr, "random_rotation", UI_ITEM_NONE, IFACE_("Rotation"), ICON_NONE); - uiItemR(sub, ptr, "random_scale", UI_ITEM_NONE, IFACE_("Scale"), ICON_NONE); - uiItemR(sub, ptr, "use_uniform_random_scale", UI_ITEM_NONE, nullptr, ICON_NONE); - uiItemR(sub, ptr, "seed", UI_ITEM_NONE, nullptr, ICON_NONE); - } - - if (uiLayout *influence_panel = uiLayoutPanelProp( - C, layout, ptr, "open_influence_panel", "Influence")) - { - modifier::greasepencil::draw_layer_filter_settings(C, influence_panel, ptr); - modifier::greasepencil::draw_material_filter_settings(C, influence_panel, ptr); - } - - modifier_panel_end(layout, ptr); -} - -static void panel_register(ARegionType *region_type) -{ - modifier_panel_register(region_type, eModifierType_GreasePencilArray, panel_draw); -} - -static void blend_write(BlendWriter *writer, const ID * /*id_owner*/, const ModifierData *md) -{ - const auto *mmd = reinterpret_cast(md); - - BLO_write_struct(writer, GreasePencilArrayModifierData, mmd); - modifier::greasepencil::write_influence_data(writer, &mmd->influence); -} - -static void blend_read(BlendDataReader *reader, ModifierData *md) -{ - auto *mmd = reinterpret_cast(md); - - modifier::greasepencil::read_influence_data(reader, &mmd->influence); -} - -} // namespace blender - -ModifierTypeInfo modifierType_GreasePencilArray = { - /*idname*/ "GreasePencilArrayModifier", - /*name*/ N_("Array"), - /*struct_name*/ "GreasePencilArrayModifierData", - /*struct_size*/ sizeof(GreasePencilArrayModifierData), - /*srna*/ &RNA_GreasePencilArrayModifier, - /*type*/ ModifierTypeType::Constructive, - /*flags*/ eModifierTypeFlag_AcceptsGreasePencil | eModifierTypeFlag_SupportsEditmode | - eModifierTypeFlag_EnableInEditmode | eModifierTypeFlag_SupportsMapping, - /*icon*/ ICON_MOD_ARRAY, - - /*copy_data*/ blender::copy_data, - - /*deform_verts*/ nullptr, - /*deform_matrices*/ nullptr, - /*deform_verts_EM*/ nullptr, - /*deform_matrices_EM*/ nullptr, - /*modify_mesh*/ nullptr, - /*modify_geometry_set*/ blender::modify_geometry_set, - - /*init_data*/ blender::init_data, - /*required_data_mask*/ nullptr, - /*free_data*/ blender::free_data, - /*is_disabled*/ nullptr, - /*update_depsgraph*/ blender::update_depsgraph, - /*depends_on_time*/ nullptr, - /*depends_on_normals*/ nullptr, - /*foreach_ID_link*/ blender::foreach_ID_link, - /*foreach_tex_link*/ nullptr, - /*free_runtime_data*/ nullptr, - /*panel_register*/ blender::panel_register, - /*blend_write*/ blender::blend_write, - /*blend_read*/ blender::blend_read, -}; diff --git a/source/blender/modifiers/intern/MOD_grease_pencil_color.cc b/source/blender/modifiers/intern/MOD_grease_pencil_color.cc index 1383690a167..a276bbb5b31 100644 --- a/source/blender/modifiers/intern/MOD_grease_pencil_color.cc +++ b/source/blender/modifiers/intern/MOD_grease_pencil_color.cc @@ -30,7 +30,7 @@ #include "UI_interface.hh" #include "UI_resources.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "WM_types.hh" @@ -228,6 +228,7 @@ static void panel_draw(const bContext *C, Panel *panel) { modifier::greasepencil::draw_layer_filter_settings(C, influence_panel, ptr); modifier::greasepencil::draw_material_filter_settings(C, influence_panel, ptr); + modifier::greasepencil::draw_vertex_group_settings(C, influence_panel, ptr); modifier::greasepencil::draw_custom_curve_settings(C, influence_panel, ptr); } diff --git a/source/blender/modifiers/intern/MOD_grease_pencil_dash.cc b/source/blender/modifiers/intern/MOD_grease_pencil_dash.cc deleted file mode 100644 index efa31ac125d..00000000000 --- a/source/blender/modifiers/intern/MOD_grease_pencil_dash.cc +++ /dev/null @@ -1,532 +0,0 @@ -/* SPDX-FileCopyrightText: 2024 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup modifiers - */ - -#include "BLI_index_range.hh" -#include "BLI_span.hh" -#include "BLI_string.h" -#include "BLI_string_utf8.h" - -#include "DNA_defaults.h" -#include "DNA_modifier_types.h" - -#include "BKE_curves.hh" -#include "BKE_geometry_set.hh" -#include "BKE_grease_pencil.hh" -#include "BKE_instances.hh" -#include "BKE_modifier.hh" -#include "BKE_screen.hh" - -#include "BLO_read_write.hh" - -#include "UI_interface.hh" -#include "UI_resources.hh" - -#include "BLT_translation.hh" - -#include "WM_api.hh" -#include "WM_types.hh" - -#include "RNA_access.hh" -#include "RNA_prototypes.h" - -#include "MOD_grease_pencil_util.hh" -#include "MOD_ui_common.hh" - -namespace blender { - -static void init_data(ModifierData *md) -{ - auto *dmd = reinterpret_cast(md); - - BLI_assert(MEMCMP_STRUCT_AFTER_IS_ZERO(dmd, modifier)); - - MEMCPY_STRUCT_AFTER(dmd, DNA_struct_default_get(GreasePencilDashModifierData), modifier); - modifier::greasepencil::init_influence_data(&dmd->influence, false); - - GreasePencilDashModifierSegment *ds = DNA_struct_default_alloc(GreasePencilDashModifierSegment); - STRNCPY_UTF8(ds->name, DATA_("Segment")); - dmd->segments_array = ds; - dmd->segments_num = 1; -} - -static void copy_data(const ModifierData *md, ModifierData *target, const int flag) -{ - const auto *dmd = reinterpret_cast(md); - auto *tmmd = reinterpret_cast(target); - - modifier::greasepencil::free_influence_data(&tmmd->influence); - - BKE_modifier_copydata_generic(md, target, flag); - modifier::greasepencil::copy_influence_data(&dmd->influence, &tmmd->influence, flag); - - tmmd->segments_array = static_cast( - MEM_dupallocN(dmd->segments_array)); -} - -static void free_data(ModifierData *md) -{ - auto *dmd = reinterpret_cast(md); - modifier::greasepencil::free_influence_data(&dmd->influence); - - MEM_SAFE_FREE(dmd->segments_array); -} - -static void foreach_ID_link(ModifierData *md, Object *ob, IDWalkFunc walk, void *user_data) -{ - auto *dmd = reinterpret_cast(md); - modifier::greasepencil::foreach_influence_ID_link(&dmd->influence, ob, walk, user_data); -} - -static bool is_disabled(const Scene * /*scene*/, ModifierData *md, bool /*use_render_params*/) -{ - const auto *dmd = reinterpret_cast(md); - /* Enable if at least one segment has non-zero length. */ - for (const GreasePencilDashModifierSegment &dash_segment : dmd->segments()) { - if (dash_segment.dash + dash_segment.gap - 1 > 0) { - return false; - } - } - return true; -} - -static int floored_modulo(const int a, const int b) -{ - return a - math::floor(float(a) / float(b)) * b; -} - -/* Combined segment info used by all strokes. */ -struct PatternInfo { - int offset = 0; - int length = 0; - Array segments; - Array cyclic; - Array material; - Array radius; - Array opacity; -}; - -static PatternInfo get_pattern_info(const GreasePencilDashModifierData &dmd) -{ - PatternInfo info; - for (const GreasePencilDashModifierSegment &dash_segment : dmd.segments()) { - info.length += dash_segment.dash + dash_segment.gap; - } - - info.segments.reinitialize(dmd.segments().size()); - info.cyclic.reinitialize(dmd.segments().size()); - info.material.reinitialize(dmd.segments().size()); - info.radius.reinitialize(dmd.segments().size()); - info.opacity.reinitialize(dmd.segments().size()); - info.offset = floored_modulo(dmd.dash_offset, info.length); - - /* Store segments as ranges. */ - IndexRange dash_range(0); - IndexRange gap_range(0); - for (const int i : dmd.segments().index_range()) { - const GreasePencilDashModifierSegment &dash_segment = dmd.segments()[i]; - dash_range = gap_range.after(dash_segment.dash); - gap_range = dash_range.after(dash_segment.gap); - info.segments[i] = dash_range; - info.cyclic[i] = dash_segment.flag & MOD_GREASE_PENCIL_DASH_USE_CYCLIC; - info.material[i] = dash_segment.mat_nr; - info.radius[i] = dash_segment.radius; - info.opacity[i] = dash_segment.opacity; - } - return info; -} - -/* Returns the segment covering the given index, including repetitions.*/ -static int find_dash_segment(const PatternInfo &pattern_info, const int index) -{ - const int repeat = index / pattern_info.length; - const int segments_num = pattern_info.segments.size(); - - const int local_index = index - repeat * pattern_info.length; - for (const int i : pattern_info.segments.index_range().drop_back(1)) { - const IndexRange segment = pattern_info.segments[i]; - const IndexRange next_segment = pattern_info.segments[i + 1]; - if (local_index >= segment.start() && local_index < next_segment.start()) { - return i + repeat * segments_num; - } - } - return segments_num - 1 + repeat * segments_num; -} - -/** - * Iterate over all dash curves. - * \param fn: Function taking an index range of source points describing new curves. - * \note Point range can be larger than the source point range in case of cyclic curves. - */ -static void foreach_dash(const PatternInfo &pattern_info, - const IndexRange src_points, - const bool cyclic, - FunctionRef fn) -{ - const int points_num = src_points.size(); - const int segments_num = pattern_info.segments.size(); - - const int first_segment = find_dash_segment(pattern_info, pattern_info.offset); - const int last_segment = find_dash_segment(pattern_info, pattern_info.offset + points_num - 1); - BLI_assert(first_segment < segments_num); - BLI_assert(last_segment >= first_segment); - - const IndexRange all_segments = IndexRange(first_segment, last_segment - first_segment + 1); - for (const int i : all_segments) { - const int repeat = i / segments_num; - const int segment_index = i - repeat * segments_num; - const IndexRange range = pattern_info.segments[segment_index].shift(repeat * - pattern_info.length); - - const int64_t point_shift = src_points.start() - pattern_info.offset; - const int64_t min_point = src_points.start(); - const int64_t max_point = cyclic ? src_points.one_after_last() : src_points.last(); - const int64_t start = std::clamp(range.start() + point_shift, min_point, max_point); - const int64_t end = std::clamp(range.one_after_last() + point_shift, min_point, max_point + 1); - - IndexRange points(start, end - start); - if (!points.is_empty()) { - fn(points, - pattern_info.cyclic[segment_index], - pattern_info.material[segment_index], - pattern_info.radius[segment_index], - pattern_info.opacity[segment_index]); - } - } -} - -static bke::CurvesGeometry create_dashes(const PatternInfo &pattern_info, - const bke::CurvesGeometry &src_curves, - const IndexMask &curves_mask) -{ - const bke::AttributeAccessor src_attributes = src_curves.attributes(); - const VArray src_cyclic = *src_attributes.lookup_or_default( - "cyclic", bke::AttrDomain::Curve, false); - const VArray src_material = *src_attributes.lookup_or_default( - "material_index", bke::AttrDomain::Curve, 0); - const VArray src_radius = *src_attributes.lookup("radius", bke::AttrDomain::Point); - const VArray src_opacity = *src_attributes.lookup("opacity", - bke::AttrDomain::Point); - - /* Count new curves and points. */ - int dst_point_num = 0; - int dst_curve_num = 0; - curves_mask.foreach_index([&](const int64_t src_curve_i) { - const IndexRange src_points = src_curves.points_by_curve()[src_curve_i]; - - foreach_dash(pattern_info, - src_points, - src_cyclic[src_curve_i], - [&](const IndexRange copy_points, - bool /*cyclic*/, - int /*material*/, - float /*radius*/, - float /*opacity*/) { - dst_point_num += copy_points.size(); - dst_curve_num += 1; - }); - }); - - bke::CurvesGeometry dst_curves(dst_point_num, dst_curve_num); - bke::MutableAttributeAccessor dst_attributes = dst_curves.attributes_for_write(); - bke::SpanAttributeWriter dst_cyclic = dst_attributes.lookup_or_add_for_write_span( - "cyclic", bke::AttrDomain::Curve); - bke::SpanAttributeWriter dst_material = dst_attributes.lookup_or_add_for_write_span( - "material_index", bke::AttrDomain::Curve); - bke::SpanAttributeWriter dst_radius = dst_attributes.lookup_or_add_for_write_span( - "radius", bke::AttrDomain::Point); - bke::SpanAttributeWriter dst_opacity = dst_attributes.lookup_or_add_for_write_span( - "opacity", bke::AttrDomain::Point); - /* Map each destination point and curve to its source. */ - Array src_point_indices(dst_point_num); - Array src_curve_indices(dst_curve_num); - - { - /* Start at curve offset and add points for each dash. */ - IndexRange dst_point_range(0); - int dst_curve_i = 0; - auto add_dash_curve = [&](const int src_curve, - const IndexRange src_points, - const IndexRange copy_points, - bool cyclic, - int material, - float radius, - float opacity) { - dst_point_range = dst_point_range.after(copy_points.size()); - dst_curves.offsets_for_write()[dst_curve_i] = dst_point_range.start(); - - if (src_points.contains(copy_points.last())) { - array_utils::fill_index_range(src_point_indices.as_mutable_span().slice(dst_point_range), - int(copy_points.start())); - } - else { - /* Cyclic curve. */ - array_utils::fill_index_range( - src_point_indices.as_mutable_span().slice(dst_point_range.drop_back(1)), - int(copy_points.start())); - src_point_indices[dst_point_range.last()] = src_points.first(); - } - src_curve_indices[dst_curve_i] = src_curve; - dst_cyclic.span[dst_curve_i] = cyclic; - dst_material.span[dst_curve_i] = material >= 0 ? material : src_material[src_curve]; - for (const int i : dst_point_range) { - dst_radius.span[i] = src_radius[src_point_indices[i]] * radius; - dst_opacity.span[i] = src_opacity[src_point_indices[i]] * opacity; - } - - ++dst_curve_i; - }; - - curves_mask.foreach_index([&](const int64_t src_curve_i) { - const IndexRange src_points = src_curves.points_by_curve()[src_curve_i]; - foreach_dash(pattern_info, - src_points, - src_cyclic[src_curve_i], - [&](const IndexRange copy_points, - bool cyclic, - int material, - float radius, - float opacity) { - add_dash_curve( - src_curve_i, src_points, copy_points, cyclic, material, radius, opacity); - }); - }); - if (dst_curve_i > 0) { - /* Last offset entry is total point count. */ - dst_curves.offsets_for_write()[dst_curve_i] = dst_point_range.one_after_last(); - } - } - - bke::gather_attributes(src_attributes, - bke::AttrDomain::Point, - {}, - {"radius", "opacity"}, - src_point_indices, - dst_attributes); - bke::gather_attributes(src_attributes, - bke::AttrDomain::Curve, - {}, - {"cyclic", "material_index"}, - src_curve_indices, - dst_attributes); - - dst_cyclic.finish(); - dst_material.finish(); - dst_radius.finish(); - dst_opacity.finish(); - dst_curves.update_curve_types(); - - return dst_curves; -} - -static void modify_drawing(const GreasePencilDashModifierData &dmd, - const ModifierEvalContext &ctx, - const PatternInfo &pattern_info, - bke::greasepencil::Drawing &drawing) -{ - const bke::CurvesGeometry &src_curves = drawing.strokes(); - if (src_curves.curve_num == 0) { - return; - } - /* Selected source curves. */ - IndexMaskMemory curve_mask_memory; - const IndexMask curves_mask = modifier::greasepencil::get_filtered_stroke_mask( - ctx.object, src_curves, dmd.influence, curve_mask_memory); - - drawing.strokes_for_write() = create_dashes(pattern_info, src_curves, curves_mask); - drawing.tag_topology_changed(); -} - -static void modify_geometry_set(ModifierData *md, - const ModifierEvalContext *ctx, - bke::GeometrySet *geometry_set) -{ - using bke::greasepencil::Drawing; - - auto *dmd = reinterpret_cast(md); - - if (!geometry_set->has_grease_pencil()) { - return; - } - GreasePencil &grease_pencil = *geometry_set->get_grease_pencil_for_write(); - const int frame = grease_pencil.runtime->eval_frame; - - const PatternInfo pattern_info = get_pattern_info(*dmd); - - IndexMaskMemory mask_memory; - const IndexMask layer_mask = modifier::greasepencil::get_filtered_layer_mask( - grease_pencil, dmd->influence, mask_memory); - - const Vector drawings = modifier::greasepencil::get_drawings_for_write( - grease_pencil, layer_mask, frame); - threading::parallel_for_each( - drawings, [&](Drawing *drawing) { modify_drawing(*dmd, *ctx, pattern_info, *drawing); }); -} - -static void panel_draw(const bContext *C, Panel *panel) -{ - uiLayout *layout = panel->layout; - - PointerRNA ob_ptr; - PointerRNA *ptr = modifier_panel_get_property_pointers(panel, &ob_ptr); - auto *dmd = static_cast(ptr->data); - - uiLayoutSetPropSep(layout, true); - - uiItemR(layout, ptr, "dash_offset", UI_ITEM_NONE, nullptr, ICON_NONE); - - uiLayout *row = uiLayoutRow(layout, false); - uiLayoutSetPropSep(row, false); - - uiTemplateList(row, - (bContext *)C, - "MOD_UL_grease_pencil_dash_modifier_segments", - "", - ptr, - "segments", - ptr, - "segment_active_index", - nullptr, - 3, - 10, - 0, - 1, - UI_TEMPLATE_LIST_FLAG_NONE); - - uiLayout *col = uiLayoutColumn(row, false); - uiLayout *sub = uiLayoutColumn(col, true); - uiItemO(sub, "", ICON_ADD, "OBJECT_OT_grease_pencil_dash_modifier_segment_add"); - uiItemO(sub, "", ICON_REMOVE, "OBJECT_OT_grease_pencil_dash_modifier_segment_remove"); - uiItemS(col); - sub = uiLayoutColumn(col, true); - uiItemEnumO_string( - sub, "", ICON_TRIA_UP, "OBJECT_OT_grease_pencil_dash_modifier_segment_move", "type", "UP"); - uiItemEnumO_string(sub, - "", - ICON_TRIA_DOWN, - "OBJECT_OT_grease_pencil_dash_modifier_segment_move", - "type", - "DOWN"); - - if (dmd->segment_active_index >= 0 && dmd->segment_active_index < dmd->segments_num) { - PointerRNA ds_ptr = RNA_pointer_create(ptr->owner_id, - &RNA_GreasePencilDashModifierSegment, - &dmd->segments()[dmd->segment_active_index]); - - sub = uiLayoutColumn(layout, true); - uiItemR(sub, &ds_ptr, "dash", UI_ITEM_NONE, nullptr, ICON_NONE); - uiItemR(sub, &ds_ptr, "gap", UI_ITEM_NONE, nullptr, ICON_NONE); - - sub = uiLayoutColumn(layout, false); - uiItemR(sub, &ds_ptr, "radius", UI_ITEM_NONE, nullptr, ICON_NONE); - uiItemR(sub, &ds_ptr, "opacity", UI_ITEM_NONE, nullptr, ICON_NONE); - uiItemR(sub, &ds_ptr, "material_index", UI_ITEM_NONE, nullptr, ICON_NONE); - uiItemR(sub, &ds_ptr, "use_cyclic", UI_ITEM_NONE, nullptr, ICON_NONE); - } - - if (uiLayout *influence_panel = uiLayoutPanelProp( - C, layout, ptr, "open_influence_panel", "Influence")) - { - modifier::greasepencil::draw_layer_filter_settings(C, influence_panel, ptr); - modifier::greasepencil::draw_material_filter_settings(C, influence_panel, ptr); - } - - modifier_panel_end(layout, ptr); -} - -static void segment_list_item_draw(uiList * /*ui_list*/, - const bContext * /*C*/, - uiLayout *layout, - PointerRNA * /*idataptr*/, - PointerRNA *itemptr, - int /*icon*/, - PointerRNA * /*active_dataptr*/, - const char * /*active_propname*/, - int /*index*/, - int /*flt_flag*/) -{ - uiLayout *row = uiLayoutRow(layout, true); - uiItemR(row, itemptr, "name", UI_ITEM_R_NO_BG, "", ICON_NONE); -} - -static void panel_register(ARegionType *region_type) -{ - modifier_panel_register(region_type, eModifierType_GreasePencilDash, panel_draw); - - uiListType *list_type = static_cast( - MEM_callocN(sizeof(uiListType), "Grease Pencil Dash modifier segments")); - STRNCPY(list_type->idname, "MOD_UL_grease_pencil_dash_modifier_segments"); - list_type->draw_item = segment_list_item_draw; - WM_uilisttype_add(list_type); -} - -static void blend_write(BlendWriter *writer, const ID * /*id_owner*/, const ModifierData *md) -{ - const auto *dmd = reinterpret_cast(md); - - BLO_write_struct(writer, GreasePencilDashModifierData, dmd); - modifier::greasepencil::write_influence_data(writer, &dmd->influence); - - BLO_write_struct_array( - writer, GreasePencilDashModifierSegment, dmd->segments_num, dmd->segments_array); -} - -static void blend_read(BlendDataReader *reader, ModifierData *md) -{ - auto *dmd = reinterpret_cast(md); - - modifier::greasepencil::read_influence_data(reader, &dmd->influence); - - BLO_read_data_address(reader, &dmd->segments_array); -} - -} // namespace blender - -ModifierTypeInfo modifierType_GreasePencilDash = { - /*idname*/ "GreasePencilDash", - /*name*/ N_("Dot Dash"), - /*struct_name*/ "GreasePencilDashModifierData", - /*struct_size*/ sizeof(GreasePencilDashModifierData), - /*srna*/ &RNA_GreasePencilDashModifierData, - /*type*/ ModifierTypeType::Nonconstructive, - /*flags*/ eModifierTypeFlag_AcceptsGreasePencil | eModifierTypeFlag_SupportsEditmode | - eModifierTypeFlag_EnableInEditmode | eModifierTypeFlag_SupportsMapping, - /*icon*/ ICON_MOD_DASH, - - /*copy_data*/ blender::copy_data, - - /*deform_verts*/ nullptr, - /*deform_matrices*/ nullptr, - /*deform_verts_EM*/ nullptr, - /*deform_matrices_EM*/ nullptr, - /*modify_mesh*/ nullptr, - /*modify_geometry_set*/ blender::modify_geometry_set, - - /*init_data*/ blender::init_data, - /*required_data_mask*/ nullptr, - /*free_data*/ blender::free_data, - /*is_disabled*/ blender::is_disabled, - /*update_depsgraph*/ nullptr, - /*depends_on_time*/ nullptr, - /*depends_on_normals*/ nullptr, - /*foreach_ID_link*/ blender::foreach_ID_link, - /*foreach_tex_link*/ nullptr, - /*free_runtime_data*/ nullptr, - /*panel_register*/ blender::panel_register, - /*blend_write*/ blender::blend_write, - /*blend_read*/ blender::blend_read, -}; - -blender::Span GreasePencilDashModifierData::segments() const -{ - return {this->segments_array, this->segments_num}; -} - -blender::MutableSpan GreasePencilDashModifierData::segments() -{ - return {this->segments_array, this->segments_num}; -} diff --git a/source/blender/modifiers/intern/MOD_grease_pencil_envelope.cc b/source/blender/modifiers/intern/MOD_grease_pencil_envelope.cc deleted file mode 100644 index 4b551e4423f..00000000000 --- a/source/blender/modifiers/intern/MOD_grease_pencil_envelope.cc +++ /dev/null @@ -1,760 +0,0 @@ -/* SPDX-FileCopyrightText: 2024 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup modifiers - */ - -#include "DNA_defaults.h" -#include "DNA_modifier_types.h" - -#include "BLI_math_geom.h" - -#include "BKE_curves.hh" -#include "BKE_geometry_set.hh" -#include "BKE_grease_pencil.hh" -#include "BKE_instances.hh" -#include "BKE_lib_query.hh" -#include "BKE_material.h" -#include "BKE_modifier.hh" -#include "BKE_screen.hh" - -#include "BLO_read_write.hh" - -#include "GEO_realize_instances.hh" - -#include "UI_interface.hh" -#include "UI_resources.hh" - -#include "BLT_translation.hh" - -#include "WM_types.hh" - -#include "RNA_access.hh" -#include "RNA_prototypes.h" - -#include "MOD_grease_pencil_util.hh" -#include "MOD_modifiertypes.hh" -#include "MOD_ui_common.hh" - -namespace blender { - -static void init_data(ModifierData *md) -{ - auto *emd = reinterpret_cast(md); - - BLI_assert(MEMCMP_STRUCT_AFTER_IS_ZERO(emd, modifier)); - - MEMCPY_STRUCT_AFTER(emd, DNA_struct_default_get(GreasePencilEnvelopeModifierData), modifier); - modifier::greasepencil::init_influence_data(&emd->influence, false); -} - -static void copy_data(const ModifierData *md, ModifierData *target, const int flag) -{ - const auto *emd = reinterpret_cast(md); - auto *temd = reinterpret_cast(target); - - modifier::greasepencil::free_influence_data(&temd->influence); - - BKE_modifier_copydata_generic(md, target, flag); - modifier::greasepencil::copy_influence_data(&emd->influence, &temd->influence, flag); -} - -static void free_data(ModifierData *md) -{ - auto *emd = reinterpret_cast(md); - modifier::greasepencil::free_influence_data(&emd->influence); -} - -static void foreach_ID_link(ModifierData *md, Object *ob, IDWalkFunc walk, void *user_data) -{ - auto *emd = reinterpret_cast(md); - modifier::greasepencil::foreach_influence_ID_link(&emd->influence, ob, walk, user_data); -} - -static inline float3 calculate_plane(const float3 ¢er, const float3 &prev, const float3 &next) -{ - const float3 v1 = math::normalize(prev - center); - const float3 v2 = math::normalize(next - center); - return math::normalize(v1 - v2); -} - -static inline std::optional find_plane_intersection(const float3 &plane_point, - const float3 &plane_normal, - const float3 &from, - const float3 &to) -{ - const float lambda = line_plane_factor_v3(plane_point, plane_normal, from, to); - if (lambda <= 0.0f || lambda >= 1.0f) { - return std::nullopt; - } - return math::interpolate(from, to, lambda); -} - -/* "Infinite" radius in case no limit is applied. */ -static const float unlimited_radius = FLT_MAX; - -/** - * Compute the minimal radius of a circle centered on the direction vector, - * going through the origin and touching the line (p1, p2). - * - * Use plane-conic-intersections to choose the minimal radius. - * The conic is defined in 4D as f({x,y,z,t}) = x*x + y*y + z*z - t*t = 0 - * Then a plane is defined parametrically as - * {p}(u, v) = {p1,0}*u + {p2,0}*(1-u) + {dir,1}*v with 0 <= u <= 1 and v >= 0 - * Now compute the intersection point with the smallest t. - * To do so, compute the parameters u, v such that f(p(u, v)) = 0 and v is minimal. - * This can be done analytically and the solution is: - * u = -dot(p2,dir) / dot(p1-p2, dir) +/- sqrt((dot(p2,dir) / dot(p1-p2, dir))^2 - - * (2*dot(p1-p2,p2)*dot(p2,dir)-dot(p2,p2)*dot(p1-p2,dir))/(dot(p1-p2,dir)*dot(p1-p2,p1-p2))); - * v = ({p1}u + {p2}*(1-u))^2 / (2*(dot(p1,dir)*u + dot(p2,dir)*(1-u))); - */ -static float calc_min_radius_v3v3(const float3 &p1, const float3 &p2, const float3 &dir) -{ - const float p1_dir = math::dot(p1, dir); - const float p2_dir = math::dot(p2, dir); - const float p2_sqr = math::length_squared(p2); - const float diff_dir = p1_dir - p2_dir; - - const float u = [=]() { - if (diff_dir == 0.0f) { - const float p1_sqr = math::length_squared(p1); - return p1_sqr < p2_sqr ? 1.0f : 0.0f; - } - - const float p = p2_dir / diff_dir; - const float3 diff = p1 - p2; - const float diff_sqr = math::length_squared(diff); - const float diff_p2 = math::dot(diff, p2); - const float q = (2 * diff_p2 * p2_dir - p2_sqr * diff_dir) / (diff_dir * diff_sqr); - if (p * p - q < 0) { - return 0.5f - std::copysign(0.5f, p); - } - - return math::clamp(-p - math::sqrt(p * p - q) * std::copysign(1.0f, p), 0.0f, 1.0f); - }(); - - /* v is the determined minimal radius. In case p1 and p2 are the same, there is a - * simple proof for the following formula using the geometric mean theorem and Thales theorem. */ - const float v = math::length_squared(math::interpolate(p2, p1, u)) / - (2 * math::interpolate(p2_dir, p1_dir, u)); - if (v < 0 || !isfinite(v)) { - /* No limit to the radius from this segment. */ - return unlimited_radius; - } - return v; -} - -static float calc_radius_limit(const Span positions, - const bool is_cyclic, - const int spread, - const int point, - const float3 &direction) -{ - if (math::is_zero(direction)) { - return unlimited_radius; - } - - const int point_num = positions.size(); - const float3 ¢er = positions[point]; - - float result = unlimited_radius; - if (is_cyclic) { - /* Spread should be limited to half the points in the cyclic case. */ - BLI_assert(spread <= point_num / 2); - /* Left side. */ - for (const int line_i : IndexRange(spread)) { - const int from_i = (point - line_i - 2 + point_num) % point_num; - const int to_i = (point - line_i - 1 + point_num) % point_num; - const float limit = calc_min_radius_v3v3( - positions[from_i] - center, positions[to_i] - center, direction); - result = std::min(result, limit); - } - /* Right side. */ - for (const int line_i : IndexRange(spread)) { - const int from_i = (point + line_i + 1 + point_num) % point_num; - const int to_i = (point + line_i + 2 + point_num) % point_num; - const float limit = calc_min_radius_v3v3( - positions[from_i] - center, positions[to_i] - center, direction); - result = std::min(result, limit); - } - } - else { - if (point == 0 || point >= point_num - 1) { - return unlimited_radius; - } - /* Left side. */ - const int spread_left = std::min(spread, std::max(point - 2, 0)); - for (const int line_i : IndexRange(spread_left)) { - const int from_i = std::max(point - line_i - 2, 0); - const int to_i = std::max(point - line_i - 1, 0); - const float limit = calc_min_radius_v3v3( - positions[from_i] - center, positions[to_i] - center, direction); - result = std::min(result, limit); - } - /* Right side. */ - const int spread_right = std::min(spread, std::max(point_num - point - 2, 0)); - for (const int line_i : IndexRange(spread_right)) { - const int from_i = std::min(point + line_i + 1, point_num - 1); - const int to_i = std::min(point + line_i + 2, point_num - 1); - const float limit = calc_min_radius_v3v3( - positions[from_i] - center, positions[to_i] - center, direction); - result = std::min(result, limit); - } - } - return result; -} - -/** - * Find a suitable center and radius to enclose the envelope around a point. - */ -static bool find_envelope(const Span positions, - const bool is_cyclic, - const int spread, - const int point, - float3 &r_center, - float &r_radius) -{ - /* Compute a plane normal for intersections. */ - const IndexRange points = positions.index_range(); - const float3 &pos = positions[point]; - const float3 &prev_pos = - positions[points.contains(point - 1) ? point - 1 : (is_cyclic ? points.last() : point)]; - const float3 &next_pos = - positions[points.contains(point + 1) ? point + 1 : (is_cyclic ? points.first() : point)]; - const float3 plane_normal = calculate_plane(pos, prev_pos, next_pos); - if (math::is_zero(plane_normal)) { - return false; - } - - /* Find two intersections with maximal radii. */ - float max_distance1 = 0.0f; - float max_distance2 = 0.0f; - float3 intersect1 = pos; - float3 intersect2 = pos; - for (const int line_i : IndexRange(spread + 2)) { - /* Raw indices, can be out of range. */ - const int from_spread_i = point - spread - 1 + line_i; - const int to_spread_i = point + line_i; - /* Clamp or wrap to valid indices. */ - const int from_i = is_cyclic ? (from_spread_i + points.size()) % points.size() : - std::max(from_spread_i, int(points.first())); - const int to_i = is_cyclic ? (to_spread_i + points.size()) % points.size() : - std::min(to_spread_i, int(points.last())); - const float3 &from_pos = positions[from_i]; - const float3 &to_pos = positions[to_i]; - const float3 line_delta = to_pos - from_pos; - - const std::optional line_intersect = find_plane_intersection( - pos, plane_normal, from_pos, to_pos); - if (!line_intersect) { - continue; - } - const float3 line_direction = line_intersect.value() - pos; - const float line_distance = math::length(line_direction); - - /* Diameter of a sphere centered in the plane, touching both #pos and the intersection line. */ - const float cos_angle = math::abs(math::dot(plane_normal, line_delta)) / - math::length(line_delta); - const float diameter = line_distance * 2.0f * cos_angle / (1 + cos_angle); - - if (line_i == 0) { - max_distance1 = diameter; - intersect1 = line_intersect.value(); - continue; - } - /* Use as vector 1 or 2 based on primary direction. */ - if (math::dot(intersect1 - pos, line_direction) >= 0.0f) { - if (diameter > max_distance1) { - intersect1 = line_intersect.value(); - max_distance1 = diameter; - } - } - else { - if (diameter > max_distance2) { - intersect2 = line_intersect.value(); - max_distance2 = diameter; - } - } - } - - r_radius = 0.5f * (max_distance1 + max_distance2); - if (r_radius < FLT_EPSILON) { - return false; - } - - const float3 new_center = 0.5f * (intersect1 + intersect2); - /* Apply radius limiting to not cross existing lines. */ - const float3 dir = math::normalize(new_center - pos); - r_radius = std::min(r_radius, calc_radius_limit(positions, is_cyclic, spread, point, dir)); - - r_center = math::interpolate( - pos, new_center, 2.0f * r_radius / math::distance(intersect1, intersect2)); - - return true; -} - -static void deform_drawing_as_envelope(const GreasePencilEnvelopeModifierData &emd, - bke::greasepencil::Drawing &drawing, - const IndexMask &curves_mask) -{ - bke::CurvesGeometry &curves = drawing.strokes_for_write(); - const bke::AttributeAccessor attributes = curves.attributes(); - const MutableSpan positions = curves.positions_for_write(); - const MutableSpan radii = drawing.radii_for_write(); - const OffsetIndices points_by_curve = curves.points_by_curve(); - const VArray vgroup_weights = modifier::greasepencil::get_influence_vertex_weights( - curves, emd.influence); - const VArray cyclic_flags = *attributes.lookup_or_default( - "cyclic", bke::AttrDomain::Curve, false); - - /* Cache to avoid affecting neighboring point results when updating positions. */ - const Array old_positions(positions.as_span()); - - curves_mask.foreach_index(GrainSize(512), [&](const int64_t curve_i) { - const IndexRange points = points_by_curve[curve_i]; - const bool cyclic = cyclic_flags[curve_i]; - const int point_num = points.size(); - const int spread = cyclic ? (math::abs(((emd.spread + point_num / 2) % point_num) - - point_num / 2)) : - std::min(emd.spread, point_num - 1); - - for (const int64_t i : points.index_range()) { - const int64_t point_i = points[i]; - const float weight = vgroup_weights[point_i]; - - float3 envelope_center; - float envelope_radius; - if (!find_envelope(old_positions.as_span().slice(points), - cyclic, - spread, - i, - envelope_center, - envelope_radius)) - { - continue; - } - - const float target_radius = radii[point_i] * emd.thickness + envelope_radius; - radii[point_i] = math::interpolate(radii[point_i], target_radius, weight); - positions[point_i] = math::interpolate(old_positions[point_i], envelope_center, weight); - } - }); - - drawing.tag_positions_changed(); - curves.tag_radii_changed(); -} - -struct EnvelopeInfo { - /* Offset left and right from the source point. */ - int spread; - /* Number of points to skip. */ - int skip; - /* Number of points in each envelope stroke. */ - int points_per_curve; - /* Material index assigned to new strokes. */ - int material_index; - float thickness; - float strength; -}; - -static EnvelopeInfo get_envelope_info(const GreasePencilEnvelopeModifierData &emd, - const ModifierEvalContext &ctx) -{ - EnvelopeInfo info; - info.spread = emd.spread; - info.skip = emd.skip; - switch (GreasePencilEnvelopeModifierMode(emd.mode)) { - case MOD_GREASE_PENCIL_ENVELOPE_DEFORM: - info.points_per_curve = 0; - break; - case MOD_GREASE_PENCIL_ENVELOPE_SEGMENTS: - info.points_per_curve = 2; - break; - case MOD_GREASE_PENCIL_ENVELOPE_FILLS: - info.points_per_curve = 2 * (2 + emd.skip); - break; - } - info.material_index = std::min(emd.mat_nr, ctx.object->totcol - 1); - info.thickness = emd.thickness; - info.strength = emd.strength; - return info; -} - -static int curve_spread(const EnvelopeInfo &info, const int point_num, const bool is_cyclic_curve) -{ - /* Clamp spread in the cyclic case to half the curve size. */ - return is_cyclic_curve ? std::min(info.spread, point_num / 2) : info.spread; -} - -static int curve_envelope_strokes_num(const EnvelopeInfo &info, - const int point_num, - const bool is_cyclic_curve) -{ - const int spread = curve_spread(info, point_num, is_cyclic_curve); - /* Number of envelope strokes making up the envelope. */ - const int num_strokes = point_num + spread - 1; - /* Skip strokes (only every n-th point generates strokes). */ - const int num_strokes_simplified = (num_strokes + info.skip) / (1 + info.skip); - return num_strokes_simplified; -} - -/** - * Create a single stroke as part of the envelope. - * - * In the simplest cast creates a single edge. - * Example for spread 4: - * - * (p-5) (p-4) (p-3) (p-2) (p-1) ( p ) (p+1) (p+2) (p+3) (p+4) (p+5) - * â””---------------------------┘ - * - * If fills is true a closed curve is created that connects contiguous point ranges. - * Example (skip=0): - * - * (p-5) (p-4) (p-3) (p-2) (p-1) ( p ) (p+1) (p+2) (p+3) (p+4) (p+5) - * | â””---┘ â””---------------------┘ â””---┘ | - * | | - * â””-------------------------------------┘ - * - * If skip > 0 more points are included in the range. - * Example (skip=2): - * - * (p-5) (p-4) (p-3) (p-2) (p-1) ( p ) (p+1) (p+2) (p+3) (p+4) (p+5) - * | â””---┘ â””---┘ â””---┘ â””---------┘ â””---┘ â””---┘ â””---┘ | - * | | - * â””-------------------------------------------------┘ - */ -static void create_envelope_stroke_for_point(const IndexRange src_curve_points, - const bool src_curve_cyclic, - const int point, - const int spread, - const int base_length, - const MutableSpan point_src_indices) -{ - const int point_num = src_curve_points.size(); - BLI_assert(point_src_indices.size() == base_length * 2); - - /* Clamp or wrap to ensure a valid index. */ - auto get_index = [=](const int index) -> int { - return src_curve_cyclic ? (index + point_num) % point_num : - math::clamp(index, 0, point_num - 1); - }; - - for (const int i : IndexRange(base_length)) { - const int reverse_i = base_length - 1 - i; - const int point_left = get_index(point - spread + reverse_i); - const int point_right = get_index(point + reverse_i); - point_src_indices[i] = src_curve_points[point_left]; - point_src_indices[base_length + i] = src_curve_points[point_right]; - } -} - -static void create_envelope_strokes_for_curve(const EnvelopeInfo &info, - const int src_curve_index, - const IndexRange src_curve_points, - const bool src_curve_cyclic, - const VArray &src_material_indices, - const IndexRange dst_points, - const MutableSpan curve_offsets, - const MutableSpan material_indices, - const MutableSpan curve_src_indices, - const MutableSpan point_src_indices) -{ - const int src_point_num = src_curve_points.size(); - const int spread = curve_spread(info, src_point_num, src_curve_cyclic); - const int num_strokes = curve_envelope_strokes_num(info, src_point_num, src_curve_cyclic); - const bool use_fills = info.points_per_curve > 2; - /* Length of continuous point ranges that get connected. */ - const int base_length = use_fills ? 2 + info.skip : 1; - - BLI_assert(curve_offsets.size() == num_strokes); - BLI_assert(material_indices.size() == num_strokes); - BLI_assert(curve_src_indices.size() == num_strokes); - BLI_assert(point_src_indices.size() == num_strokes * info.points_per_curve); - - curve_src_indices.fill(src_curve_index); - - /* - * Index range here goes beyond the point range: - * This adds points [i - spread, i + 1] as a curve. - * The total range covers [-spread - 1, spread + 1]. - * Each span only gets added once since it repeats for neighboring points. - */ - - for (const int dst_i : IndexRange(num_strokes)) { - const int src_i = dst_i * (1 + info.skip); - const IndexRange dst_envelope_points = {dst_i * info.points_per_curve, info.points_per_curve}; - - curve_offsets[dst_i] = dst_points[dst_envelope_points.start()]; - material_indices[dst_i] = info.material_index >= 0 ? info.material_index : - src_material_indices[src_curve_index]; - - create_envelope_stroke_for_point(src_curve_points, - src_curve_cyclic, - src_i, - spread, - base_length, - point_src_indices.slice(dst_envelope_points)); - } -} - -static void create_envelope_strokes(const EnvelopeInfo &info, - bke::greasepencil::Drawing &drawing, - const IndexMask &curves_mask, - const bool keep_original) -{ - const bke::CurvesGeometry &src_curves = drawing.strokes(); - const bke::AttributeAccessor src_attributes = src_curves.attributes(); - const VArray src_cyclic = *src_attributes.lookup_or_default( - "cyclic", bke::AttrDomain::Curve, false); - const VArray src_material_indices = *src_attributes.lookup_or_default( - "material_index", bke::AttrDomain::Curve, 0); - - /* Count envelopes. */ - Array envelope_curves_by_curve(src_curves.curve_num + 1); - Array envelope_points_by_curve(src_curves.curve_num + 1); - curves_mask.foreach_index([&](const int64_t src_curve_i) { - const IndexRange points = src_curves.points_by_curve()[src_curve_i]; - const int curve_num = curve_envelope_strokes_num(info, points.size(), src_cyclic[src_curve_i]); - envelope_curves_by_curve[src_curve_i] = curve_num; - envelope_points_by_curve[src_curve_i] = info.points_per_curve * curve_num; - }); - /* Ranges by source curve for envelope curves and points. */ - const OffsetIndices envelope_curve_offsets = offset_indices::accumulate_counts_to_offsets( - envelope_curves_by_curve, keep_original ? src_curves.curve_num : 0); - const OffsetIndices envelope_point_offsets = offset_indices::accumulate_counts_to_offsets( - envelope_points_by_curve, keep_original ? src_curves.point_num : 0); - const int dst_curve_num = envelope_curve_offsets.total_size(); - const int dst_point_num = envelope_point_offsets.total_size(); - if (dst_curve_num == 0 || dst_point_num == 0) { - return; - } - - bke::CurvesGeometry dst_curves(dst_point_num, dst_curve_num); - bke::MutableAttributeAccessor dst_attributes = dst_curves.attributes_for_write(); - bke::SpanAttributeWriter dst_material_indices = - dst_attributes.lookup_or_add_for_write_span("material_index", bke::AttrDomain::Curve); - bke::SpanAttributeWriter dst_cyclic = dst_attributes.lookup_or_add_for_write_span( - "cyclic", bke::AttrDomain::Curve); - /* Map each destination curve and point to its source. */ - Array src_curve_indices(dst_curve_num); - Array src_point_indices(dst_point_num); - - if (keep_original) { - /* Add indices to original data. */ - dst_curves.offsets_for_write() - .slice(src_curves.curves_range()) - .copy_from(src_curves.offsets().drop_back(1)); - - array_utils::fill_index_range( - src_curve_indices.as_mutable_span().slice(src_curves.curves_range())); - array_utils::fill_index_range( - src_point_indices.as_mutable_span().slice(src_curves.points_range())); - - array_utils::copy(src_material_indices, - dst_material_indices.span.slice(src_curves.curves_range())); - } - - curves_mask.foreach_index([&](const int64_t i) { - const bool src_curve_cyclic = src_cyclic[i]; - const IndexRange src_curve_points = src_curves.points_by_curve()[i]; - const IndexRange envelope_curves = envelope_curve_offsets[i]; - const IndexRange envelope_points = envelope_point_offsets[i]; - - create_envelope_strokes_for_curve(info, - i, - src_curve_points, - src_curve_cyclic, - src_material_indices, - envelope_points, - dst_curves.offsets_for_write().slice(envelope_curves), - dst_material_indices.span.slice(envelope_curves), - src_curve_indices.as_mutable_span().slice(envelope_curves), - src_point_indices.as_mutable_span().slice(envelope_points)); - }); - dst_curves.offsets_for_write().last() = dst_point_num; - - bke::gather_attributes( - src_attributes, bke::AttrDomain::Point, {}, {}, src_point_indices, dst_attributes); - bke::gather_attributes(src_attributes, - bke::AttrDomain::Curve, - {}, - {"cyclic", "material_index"}, - src_curve_indices, - dst_attributes); - - /* Apply thickness and strength factors. */ - { - bke::SpanAttributeWriter radius_writer = - dst_attributes.lookup_or_add_for_write_span( - "radius", - bke::AttrDomain::Point, - bke::AttributeInitVArray(VArray::ForSingle(0.01f, dst_point_num))); - bke::SpanAttributeWriter opacity_writer = - dst_attributes.lookup_or_add_for_write_span( - "opacity", - bke::AttrDomain::Point, - bke::AttributeInitVArray(VArray::ForSingle(1.0f, dst_point_num))); - const IndexRange all_new_points = keep_original ? - IndexRange(src_curves.point_num, - dst_point_num - src_curves.point_num) : - IndexRange(dst_point_num); - for (const int point_i : all_new_points) { - radius_writer.span[point_i] *= info.thickness; - opacity_writer.span[point_i] *= info.strength; - } - radius_writer.finish(); - opacity_writer.finish(); - } - - dst_cyclic.finish(); - dst_material_indices.finish(); - dst_curves.update_curve_types(); - - drawing.strokes_for_write() = std::move(dst_curves); - drawing.tag_topology_changed(); -} - -static void modify_drawing(const GreasePencilEnvelopeModifierData &emd, - const ModifierEvalContext &ctx, - bke::greasepencil::Drawing &drawing) -{ - const EnvelopeInfo info = get_envelope_info(emd, ctx); - - IndexMaskMemory mask_memory; - const IndexMask curves_mask = modifier::greasepencil::get_filtered_stroke_mask( - ctx.object, drawing.strokes(), emd.influence, mask_memory); - - const auto mode = GreasePencilEnvelopeModifierMode(emd.mode); - switch (mode) { - case MOD_GREASE_PENCIL_ENVELOPE_DEFORM: - deform_drawing_as_envelope(emd, drawing, curves_mask); - break; - case MOD_GREASE_PENCIL_ENVELOPE_SEGMENTS: - create_envelope_strokes(info, drawing, curves_mask, true); - break; - case MOD_GREASE_PENCIL_ENVELOPE_FILLS: - create_envelope_strokes(info, drawing, curves_mask, false); - break; - } -} - -static void modify_geometry_set(ModifierData *md, - const ModifierEvalContext *ctx, - bke::GeometrySet *geometry_set) -{ - using bke::greasepencil::Drawing; - - auto *emd = reinterpret_cast(md); - - if (!geometry_set->has_grease_pencil()) { - return; - } - GreasePencil &grease_pencil = *geometry_set->get_grease_pencil_for_write(); - const int frame = grease_pencil.runtime->eval_frame; - - IndexMaskMemory mask_memory; - const IndexMask layer_mask = modifier::greasepencil::get_filtered_layer_mask( - grease_pencil, emd->influence, mask_memory); - - const Vector drawings = modifier::greasepencil::get_drawings_for_write( - grease_pencil, layer_mask, frame); - threading::parallel_for_each(drawings, - [&](Drawing *drawing) { modify_drawing(*emd, *ctx, *drawing); }); -} - -static void panel_draw(const bContext *C, Panel *panel) -{ - uiLayout *layout = panel->layout; - - PointerRNA ob_ptr; - PointerRNA *ptr = modifier_panel_get_property_pointers(panel, &ob_ptr); - const GreasePencilEnvelopeModifierMode mode = GreasePencilEnvelopeModifierMode( - RNA_enum_get(ptr, "mode")); - - uiLayoutSetPropSep(layout, true); - - uiItemR(layout, ptr, "mode", UI_ITEM_NONE, nullptr, ICON_NONE); - - uiItemR(layout, ptr, "spread", UI_ITEM_NONE, nullptr, ICON_NONE); - uiItemR(layout, ptr, "thickness", UI_ITEM_NONE, nullptr, ICON_NONE); - - switch (mode) { - case MOD_GREASE_PENCIL_ENVELOPE_DEFORM: - break; - case MOD_GREASE_PENCIL_ENVELOPE_FILLS: - case MOD_GREASE_PENCIL_ENVELOPE_SEGMENTS: - uiItemR(layout, ptr, "strength", UI_ITEM_NONE, nullptr, ICON_NONE); - uiItemR(layout, ptr, "mat_nr", UI_ITEM_NONE, nullptr, ICON_NONE); - uiItemR(layout, ptr, "skip", UI_ITEM_NONE, nullptr, ICON_NONE); - break; - } - - if (uiLayout *influence_panel = uiLayoutPanelProp( - C, layout, ptr, "open_influence_panel", "Influence")) - { - modifier::greasepencil::draw_layer_filter_settings(C, influence_panel, ptr); - modifier::greasepencil::draw_material_filter_settings(C, influence_panel, ptr); - modifier::greasepencil::draw_vertex_group_settings(C, influence_panel, ptr); - } - - modifier_panel_end(layout, ptr); -} - -static void panel_register(ARegionType *region_type) -{ - modifier_panel_register(region_type, eModifierType_GreasePencilEnvelope, panel_draw); -} - -static void blend_write(BlendWriter *writer, const ID * /*id_owner*/, const ModifierData *md) -{ - const auto *emd = reinterpret_cast(md); - - BLO_write_struct(writer, GreasePencilEnvelopeModifierData, emd); - modifier::greasepencil::write_influence_data(writer, &emd->influence); -} - -static void blend_read(BlendDataReader *reader, ModifierData *md) -{ - auto *emd = reinterpret_cast(md); - - modifier::greasepencil::read_influence_data(reader, &emd->influence); -} - -} // namespace blender - -ModifierTypeInfo modifierType_GreasePencilEnvelope = { - /*idname*/ "GreasePencilEnvelope", - /*name*/ N_("Envelope"), - /*struct_name*/ "GreasePencilEnvelopeModifierData", - /*struct_size*/ sizeof(GreasePencilEnvelopeModifierData), - /*srna*/ &RNA_GreasePencilEnvelopeModifier, - /*type*/ ModifierTypeType::Nonconstructive, - /*flags*/ eModifierTypeFlag_AcceptsGreasePencil | eModifierTypeFlag_SupportsEditmode | - eModifierTypeFlag_EnableInEditmode | eModifierTypeFlag_SupportsMapping, - /*icon*/ ICON_MOD_ENVELOPE, - - /*copy_data*/ blender::copy_data, - - /*deform_verts*/ nullptr, - /*deform_matrices*/ nullptr, - /*deform_verts_EM*/ nullptr, - /*deform_matrices_EM*/ nullptr, - /*modify_mesh*/ nullptr, - /*modify_geometry_set*/ blender::modify_geometry_set, - - /*init_data*/ blender::init_data, - /*required_data_mask*/ nullptr, - /*free_data*/ blender::free_data, - /*is_disabled*/ nullptr, - /*update_depsgraph*/ nullptr, - /*depends_on_time*/ nullptr, - /*depends_on_normals*/ nullptr, - /*foreach_ID_link*/ blender::foreach_ID_link, - /*foreach_tex_link*/ nullptr, - /*free_runtime_data*/ nullptr, - /*panel_register*/ blender::panel_register, - /*blend_write*/ blender::blend_write, - /*blend_read*/ blender::blend_read, -}; diff --git a/source/blender/modifiers/intern/MOD_grease_pencil_hook.cc b/source/blender/modifiers/intern/MOD_grease_pencil_hook.cc deleted file mode 100644 index 9ac2a9a6abc..00000000000 --- a/source/blender/modifiers/intern/MOD_grease_pencil_hook.cc +++ /dev/null @@ -1,363 +0,0 @@ -/* SPDX-FileCopyrightText: 2005 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup modifiers - */ - -#include "BLI_index_mask.hh" -#include "BLI_math_rotation.hh" -#include "BLI_string.h" /* For #STRNCPY. */ - -#include "BLT_translation.hh" - -#include "BLO_read_write.hh" - -#include "DNA_defaults.h" -#include "DNA_modifier_types.h" -#include "DNA_screen_types.h" - -#include "RNA_access.hh" - -#include "BKE_action.h" -#include "BKE_colortools.hh" -#include "BKE_curves.hh" -#include "BKE_geometry_set.hh" -#include "BKE_grease_pencil.hh" -#include "BKE_lib_query.hh" -#include "BKE_modifier.hh" -#include "BKE_object_types.hh" - -#include "UI_interface.hh" -#include "UI_resources.hh" - -#include "MOD_grease_pencil_util.hh" -#include "MOD_modifiertypes.hh" -#include "MOD_ui_common.hh" - -#include "RNA_prototypes.h" - -namespace blender { - -static void init_data(ModifierData *md) -{ - auto *gpmd = reinterpret_cast(md); - - BLI_assert(MEMCMP_STRUCT_AFTER_IS_ZERO(gpmd, modifier)); - - MEMCPY_STRUCT_AFTER(gpmd, DNA_struct_default_get(GreasePencilHookModifierData), modifier); - modifier::greasepencil::init_influence_data(&gpmd->influence, true); -} - -static void copy_data(const ModifierData *md, ModifierData *target, const int flag) -{ - const auto *gmd = reinterpret_cast(md); - auto *tgmd = reinterpret_cast(target); - - BKE_modifier_copydata_generic(md, target, flag); - modifier::greasepencil::copy_influence_data(&gmd->influence, &tgmd->influence, flag); -} - -static void free_data(ModifierData *md) -{ - auto *mmd = reinterpret_cast(md); - - modifier::greasepencil::free_influence_data(&mmd->influence); -} - -static bool is_disabled(const Scene * /*scene*/, ModifierData *md, bool /*use_render_params*/) -{ - auto *mmd = reinterpret_cast(md); - - return (mmd->object == nullptr); -} - -static void update_depsgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx) -{ - auto *mmd = reinterpret_cast(md); - if (mmd->object != nullptr) { - DEG_add_object_relation(ctx->node, mmd->object, DEG_OB_COMP_TRANSFORM, "Hook Modifier"); - } - DEG_add_object_relation(ctx->node, ctx->object, DEG_OB_COMP_TRANSFORM, "Hook Modifier"); -} - -static void foreach_ID_link(ModifierData *md, Object *ob, IDWalkFunc walk, void *user_data) -{ - auto *mmd = reinterpret_cast(md); - - modifier::greasepencil::foreach_influence_ID_link(&mmd->influence, ob, walk, user_data); - - walk(user_data, ob, (ID **)&mmd->object, IDWALK_CB_NOP); -} - -static void blend_write(BlendWriter *writer, const ID * /*id_owner*/, const ModifierData *md) -{ - const auto *mmd = reinterpret_cast(md); - - BLO_write_struct(writer, GreasePencilHookModifierData, mmd); - modifier::greasepencil::write_influence_data(writer, &mmd->influence); -} - -static void blend_read(BlendDataReader *reader, ModifierData *md) -{ - auto *mmd = reinterpret_cast(md); - modifier::greasepencil::read_influence_data(reader, &mmd->influence); -} - -/* Calculate the factor of falloff. */ -static float hook_falloff(const float falloff, - const int falloff_type, - const float falloff_sq, - const float fac_orig, - const CurveMapping *curfalloff, - const float len_sq) -{ - BLI_assert(falloff_sq); - if (len_sq > falloff_sq) { - return 0.0f; - } - if (len_sq <= 0.0f) { - return fac_orig; - } - if (falloff_type == MOD_GREASE_PENCIL_HOOK_Falloff_Const) { - return fac_orig; - } - else if (falloff_type == MOD_GREASE_PENCIL_HOOK_Falloff_InvSquare) { - /* Avoid sqrt below. */ - return (1.0f - (len_sq / falloff_sq)) * fac_orig; - } - - float fac = 1.0f - (math::sqrt(len_sq) / falloff); - - switch (falloff_type) { - case MOD_GREASE_PENCIL_HOOK_Falloff_Curve: - return BKE_curvemapping_evaluateF(curfalloff, 0, fac) * fac_orig; - case MOD_GREASE_PENCIL_HOOK_Falloff_Sharp: - return fac * fac * fac_orig; - case MOD_GREASE_PENCIL_HOOK_Falloff_Smooth: - return (3.0f * fac * fac - 2.0f * fac * fac * fac) * fac_orig; - case MOD_GREASE_PENCIL_HOOK_Falloff_Root: - return math::sqrt(fac) * fac_orig; - break; - case MOD_GREASE_PENCIL_HOOK_Falloff_Sphere: - return math::sqrt(2 * fac - fac * fac) * fac_orig; - case MOD_GREASE_PENCIL_HOOK_Falloff_Linear: - ATTR_FALLTHROUGH; /* Pass. */ - default: - return fac * fac_orig; - } -} - -static void deform_drawing(const ModifierData &md, - const Object &ob, - bke::greasepencil::Drawing &drawing) -{ - const auto &mmd = reinterpret_cast(md); - bke::CurvesGeometry &curves = drawing.strokes_for_write(); - if (curves.points_num() == 0) { - return; - } - IndexMaskMemory memory; - const IndexMask strokes = modifier::greasepencil::get_filtered_stroke_mask( - &ob, curves, mmd.influence, memory); - if (strokes.is_empty()) { - return; - } - - const VArray input_weights = modifier::greasepencil::get_influence_vertex_weights( - curves, mmd.influence); - - const int falloff_type = mmd.falloff_type; - const float falloff = (mmd.falloff_type == eHook_Falloff_None) ? 0.0f : mmd.falloff; - const float falloff_sq = square_f(falloff); - const float fac_orig = mmd.force; - const bool use_falloff = falloff_sq != 0.0f; - const bool use_uniform = (mmd.flag & MOD_GREASE_PENCIL_HOOK_UNIFORM_SPACE) != 0; - - const float3x3 mat_uniform = use_uniform ? float3x3(float4x4(mmd.parentinv)) : - float3x3::identity(); - const float3 cent = use_uniform ? math::transform_point(mat_uniform, float3(mmd.cent)) : - float3(mmd.cent); - - float4x4 dmat; - /* Get world-space matrix of target, corrected for the space the verts are in. */ - if (mmd.subtarget[0]) { - bPoseChannel *pchan = BKE_pose_channel_find_name(mmd.object->pose, mmd.subtarget); - if (pchan) { - /* Bone target if there's a matching pose-channel. */ - dmat = mmd.object->object_to_world() * float4x4(pchan->pose_mat); - } - } - else { - /* Just object target. */ - dmat = mmd.object->object_to_world(); - } - float4x4 use_mat = ob.world_to_object() * dmat * float4x4(mmd.parentinv); - - auto get_weight = [&](const int point) { - const float weight = input_weights[point]; - if (mmd.influence.flag & GREASE_PENCIL_INFLUENCE_INVERT_VERTEX_GROUP) { - return 1.0f - weight; - } - return weight; - }; - - const OffsetIndices points_by_curve = curves.points_by_curve(); - MutableSpan positions = curves.positions_for_write(); - - strokes.foreach_index(blender::GrainSize(128), [&](const int stroke) { - const IndexRange points_range = points_by_curve[stroke].index_range(); - for (const int point_i : points_range) { - const int point = point_i + points_by_curve[stroke].first(); - const float weight = get_weight(point); - if (weight < 0.0f) { - continue; - } - - float fac; - if (use_falloff) { - float len_sq; - if (use_uniform) { - const float3 co_uniform = math::transform_point(mat_uniform, positions[point]); - len_sq = math::distance(cent, co_uniform); - } - else { - len_sq = math::distance(cent, positions[point]); - } - fac = hook_falloff( - falloff, falloff_type, falloff_sq, fac_orig, mmd.influence.custom_curve, len_sq); - } - else { - fac = fac_orig; - } - - if (fac != 0.0f) { - const float3 co_tmp = math::transform_point(use_mat, positions[point]); - positions[point] = math::interpolate(positions[point], co_tmp, fac * weight); - } - } - }); - - drawing.tag_positions_changed(); -} - -static void modify_geometry_set(ModifierData *md, - const ModifierEvalContext *ctx, - bke::GeometrySet *geometry_set) -{ - const GreasePencilHookModifierData *mmd = reinterpret_cast(md); - - if (!geometry_set->has_grease_pencil()) { - return; - } - - GreasePencil &grease_pencil = *geometry_set->get_grease_pencil_for_write(); - - const int current_frame = grease_pencil.runtime->eval_frame; - - IndexMaskMemory mask_memory; - const IndexMask layer_mask = modifier::greasepencil::get_filtered_layer_mask( - grease_pencil, mmd->influence, mask_memory); - const Vector drawings = - modifier::greasepencil::get_drawings_for_write(grease_pencil, layer_mask, current_frame); - - threading::parallel_for_each(drawings, [&](bke::greasepencil::Drawing *drawing) { - deform_drawing(*md, *ctx->object, *drawing); - }); -} - -static void panel_draw(const bContext *C, Panel *panel) -{ - uiLayout *layout = panel->layout; - - PointerRNA ob_ptr; - PointerRNA *ptr = modifier_panel_get_property_pointers(panel, &ob_ptr); - - PointerRNA hook_object_ptr = RNA_pointer_get(ptr, "object"); - - uiLayoutSetPropSep(layout, true); - - uiLayout *col = uiLayoutColumn(layout, false); - uiItemR(col, ptr, "object", UI_ITEM_NONE, nullptr, ICON_NONE); - if (!RNA_pointer_is_null(&hook_object_ptr) && - RNA_enum_get(&hook_object_ptr, "type") == OB_ARMATURE) - { - PointerRNA hook_object_data_ptr = RNA_pointer_get(&hook_object_ptr, "data"); - uiItemPointerR( - col, ptr, "subtarget", &hook_object_data_ptr, "bones", IFACE_("Bone"), ICON_NONE); - } - - uiItemR(layout, ptr, "strength", UI_ITEM_R_SLIDER, nullptr, ICON_NONE); - - if (uiLayout *sub = uiLayoutPanelProp(C, layout, ptr, "open_falloff_panel", "Falloff")) { - uiLayoutSetPropSep(sub, true); - - uiItemR(sub, ptr, "falloff_type", UI_ITEM_NONE, IFACE_("Type"), ICON_NONE); - - bool use_falloff = RNA_enum_get(ptr, "falloff_type") != eWarp_Falloff_None; - - uiLayout *row = uiLayoutRow(sub, false); - uiLayoutSetActive(row, use_falloff); - uiItemR(row, ptr, "falloff_radius", UI_ITEM_NONE, nullptr, ICON_NONE); - - uiItemR(sub, ptr, "use_falloff_uniform", UI_ITEM_NONE, nullptr, ICON_NONE); - - if (RNA_enum_get(ptr, "falloff_type") == eWarp_Falloff_Curve) { - uiTemplateCurveMapping(sub, ptr, "custom_curve", 0, false, false, false, false); - } - } - - if (uiLayout *influence_panel = uiLayoutPanelProp( - C, layout, ptr, "open_influence_panel", "Influence")) - { - modifier::greasepencil::draw_layer_filter_settings(C, influence_panel, ptr); - modifier::greasepencil::draw_material_filter_settings(C, influence_panel, ptr); - modifier::greasepencil::draw_vertex_group_settings(C, influence_panel, ptr); - } - - modifier_panel_end(layout, ptr); -} - -static void panel_register(ARegionType *region_type) -{ - modifier_panel_register(region_type, eModifierType_GreasePencilHook, panel_draw); -} - -} // namespace blender - -ModifierTypeInfo modifierType_GreasePencilHook = { - /*idname*/ "GreasePencilHookModifier", - /*name*/ N_("Hook"), - /*struct_name*/ "GreasePencilHookModifierData", - /*struct_size*/ sizeof(GreasePencilHookModifierData), - /*srna*/ &RNA_GreasePencilHookModifier, - /*type*/ ModifierTypeType::OnlyDeform, - /*flags*/ - eModifierTypeFlag_AcceptsGreasePencil | eModifierTypeFlag_SupportsEditmode | - eModifierTypeFlag_EnableInEditmode | eModifierTypeFlag_SupportsMapping, - /*icon*/ ICON_HOOK, - - /*copy_data*/ blender::copy_data, - - /*deform_verts*/ nullptr, - /*deform_matrices*/ nullptr, - /*deform_verts_EM*/ nullptr, - /*deform_matrices_EM*/ nullptr, - /*modify_mesh*/ nullptr, - /*modify_geometry_set*/ blender::modify_geometry_set, - - /*init_data*/ blender::init_data, - /*required_data_mask*/ nullptr, - /*free_data*/ blender::free_data, - /*is_disabled*/ blender::is_disabled, - /*update_depsgraph*/ blender::update_depsgraph, - /*depends_on_time*/ nullptr, - /*depends_on_normals*/ nullptr, - /*foreach_ID_link*/ blender::foreach_ID_link, - /*foreach_tex_link*/ nullptr, - /*free_runtime_data*/ nullptr, - /*panel_register*/ blender::panel_register, - /*blend_write*/ blender::blend_write, - /*blend_read*/ blender::blend_read, -}; diff --git a/source/blender/modifiers/intern/MOD_grease_pencil_lattice.cc b/source/blender/modifiers/intern/MOD_grease_pencil_lattice.cc deleted file mode 100644 index 7098cf6c70b..00000000000 --- a/source/blender/modifiers/intern/MOD_grease_pencil_lattice.cc +++ /dev/null @@ -1,232 +0,0 @@ -/* SPDX-FileCopyrightText: 2024 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup modifiers - */ - -#include "DNA_defaults.h" -#include "DNA_modifier_types.h" - -#include "BKE_curves.hh" -#include "BKE_geometry_set.hh" -#include "BKE_grease_pencil.hh" -#include "BKE_lattice.hh" -#include "BKE_lib_query.hh" -#include "BKE_modifier.hh" - -#include "BLO_read_write.hh" - -#include "UI_interface.hh" -#include "UI_resources.hh" - -#include "BLT_translation.hh" - -#include "WM_types.hh" - -#include "RNA_prototypes.h" - -#include "MOD_grease_pencil_util.hh" -#include "MOD_ui_common.hh" - -namespace blender { - -using bke::greasepencil::Drawing; -using bke::greasepencil::FramesMapKey; -using bke::greasepencil::Layer; - -static void init_data(ModifierData *md) -{ - auto *lmd = reinterpret_cast(md); - - BLI_assert(MEMCMP_STRUCT_AFTER_IS_ZERO(lmd, modifier)); - - MEMCPY_STRUCT_AFTER(lmd, DNA_struct_default_get(GreasePencilLatticeModifierData), modifier); - modifier::greasepencil::init_influence_data(&lmd->influence, false); -} - -static void copy_data(const ModifierData *md, ModifierData *target, const int flag) -{ - const auto *lmd = reinterpret_cast(md); - auto *tlmd = reinterpret_cast(target); - - modifier::greasepencil::free_influence_data(&tlmd->influence); - - BKE_modifier_copydata_generic(md, target, flag); - modifier::greasepencil::copy_influence_data(&lmd->influence, &tlmd->influence, flag); -} - -static void free_data(ModifierData *md) -{ - auto *lmd = reinterpret_cast(md); - modifier::greasepencil::free_influence_data(&lmd->influence); -} - -static void foreach_ID_link(ModifierData *md, Object *ob, IDWalkFunc walk, void *user_data) -{ - auto *lmd = reinterpret_cast(md); - modifier::greasepencil::foreach_influence_ID_link(&lmd->influence, ob, walk, user_data); - - walk(user_data, ob, (ID **)&lmd->object, IDWALK_CB_NOP); -} - -static void update_depsgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx) -{ - auto *lmd = reinterpret_cast(md); - if (lmd->object != nullptr) { - DEG_add_object_relation( - ctx->node, lmd->object, DEG_OB_COMP_TRANSFORM, "Grease Pencil Lattice Modifier"); - DEG_add_object_relation( - ctx->node, lmd->object, DEG_OB_COMP_GEOMETRY, "Grease Pencil Lattice Modifier"); - } - DEG_add_depends_on_transform_relation(ctx->node, "Grease Pencil Lattice Modifier"); -} - -static bool is_disabled(const Scene * /*scene*/, ModifierData *md, bool /*use_render_params*/) -{ - auto *lmd = reinterpret_cast(md); - - /* The object type check is only needed here in case we have a placeholder - * object assigned (because the library containing the lattice is missing). - * - * In other cases it should be impossible to have a type mismatch. - */ - return lmd->object == nullptr || lmd->object->type != OB_LATTICE; -} - -static void modify_curves(ModifierData *md, - const ModifierEvalContext *ctx, - const LatticeDeformData &cache_data, - Drawing &drawing) -{ - const auto *lmd = reinterpret_cast(md); - bke::CurvesGeometry &curves = drawing.strokes_for_write(); - - IndexMaskMemory mask_memory; - const IndexMask curves_mask = modifier::greasepencil::get_filtered_stroke_mask( - ctx->object, curves, lmd->influence, mask_memory); - - const OffsetIndices points_by_curve = curves.points_by_curve(); - MutableSpan positions = curves.positions_for_write(); - const VArray vgroup_weights = modifier::greasepencil::get_influence_vertex_weights( - curves, lmd->influence); - - curves_mask.foreach_index(GrainSize(512), [&](const int64_t curve_i) { - const IndexRange points = points_by_curve[curve_i]; - for (const int64_t point_i : points) { - const float weight = vgroup_weights[point_i]; - BKE_lattice_deform_data_eval_co(const_cast(&cache_data), - positions[point_i], - lmd->strength * weight); - } - }); - - drawing.tag_positions_changed(); -} - -static void modify_geometry_set(ModifierData *md, - const ModifierEvalContext *ctx, - bke::GeometrySet *geometry_set) -{ - const auto *lmd = reinterpret_cast(md); - BLI_assert(lmd->object != nullptr && lmd->object->type == OB_LATTICE); - LatticeDeformData *cache_data = BKE_lattice_deform_data_create(lmd->object, ctx->object); - - if (!geometry_set->has_grease_pencil()) { - return; - } - GreasePencil &grease_pencil = *geometry_set->get_grease_pencil_for_write(); - - IndexMaskMemory mask_memory; - const IndexMask layer_mask = modifier::greasepencil::get_filtered_layer_mask( - grease_pencil, lmd->influence, mask_memory); - const int frame = grease_pencil.runtime->eval_frame; - const Vector drawings = modifier::greasepencil::get_drawings_for_write( - grease_pencil, layer_mask, frame); - threading::parallel_for_each( - drawings, [&](Drawing *drawing) { modify_curves(md, ctx, *cache_data, *drawing); }); - - BKE_lattice_deform_data_destroy(cache_data); -} - -static void panel_draw(const bContext *C, Panel *panel) -{ - uiLayout *layout = panel->layout; - - PointerRNA ob_ptr; - PointerRNA *ptr = modifier_panel_get_property_pointers(panel, &ob_ptr); - - uiLayoutSetPropSep(layout, true); - - uiItemR(layout, ptr, "object", UI_ITEM_NONE, nullptr, ICON_NONE); - uiItemR(layout, ptr, "strength", UI_ITEM_R_SLIDER, nullptr, ICON_NONE); - - if (uiLayout *influence_panel = uiLayoutPanelProp( - C, layout, ptr, "open_influence_panel", "Influence")) - { - modifier::greasepencil::draw_layer_filter_settings(C, influence_panel, ptr); - modifier::greasepencil::draw_material_filter_settings(C, influence_panel, ptr); - modifier::greasepencil::draw_vertex_group_settings(C, influence_panel, ptr); - } - - modifier_panel_end(layout, ptr); -} - -static void panel_register(ARegionType *region_type) -{ - modifier_panel_register(region_type, eModifierType_GreasePencilLattice, panel_draw); -} - -static void blend_write(BlendWriter *writer, const ID * /*id_owner*/, const ModifierData *md) -{ - const auto *lmd = reinterpret_cast(md); - - BLO_write_struct(writer, GreasePencilLatticeModifierData, lmd); - modifier::greasepencil::write_influence_data(writer, &lmd->influence); -} - -static void blend_read(BlendDataReader *reader, ModifierData *md) -{ - auto *lmd = reinterpret_cast(md); - - modifier::greasepencil::read_influence_data(reader, &lmd->influence); -} - -} // namespace blender - -ModifierTypeInfo modifierType_GreasePencilLattice = { - /*idname*/ "GreasePencilLattice", - /*name*/ N_("Lattice"), - /*struct_name*/ "GreasePencilLatticeModifierData", - /*struct_size*/ sizeof(GreasePencilLatticeModifierData), - /*srna*/ &RNA_GreasePencilLatticeModifier, - /*type*/ ModifierTypeType::OnlyDeform, - /*flags*/ eModifierTypeFlag_AcceptsGreasePencil | eModifierTypeFlag_SupportsEditmode | - eModifierTypeFlag_EnableInEditmode | eModifierTypeFlag_SupportsMapping, - /*icon*/ ICON_MOD_LATTICE, - - /*copy_data*/ blender::copy_data, - - /*deform_verts*/ nullptr, - /*deform_matrices*/ nullptr, - /*deform_verts_EM*/ nullptr, - /*deform_matrices_EM*/ nullptr, - /*modify_mesh*/ nullptr, - /*modify_geometry_set*/ blender::modify_geometry_set, - - /*init_data*/ blender::init_data, - /*required_data_mask*/ nullptr, - /*free_data*/ blender::free_data, - /*is_disabled*/ blender::is_disabled, - /*update_depsgraph*/ blender::update_depsgraph, - /*depends_on_time*/ nullptr, - /*depends_on_normals*/ nullptr, - /*foreach_ID_link*/ blender::foreach_ID_link, - /*foreach_tex_link*/ nullptr, - /*free_runtime_data*/ nullptr, - /*panel_register*/ blender::panel_register, - /*blend_write*/ blender::blend_write, - /*blend_read*/ blender::blend_read, - /*foreach_cache*/ nullptr, -}; diff --git a/source/blender/modifiers/intern/MOD_grease_pencil_length.cc b/source/blender/modifiers/intern/MOD_grease_pencil_length.cc deleted file mode 100644 index e41843439db..00000000000 --- a/source/blender/modifiers/intern/MOD_grease_pencil_length.cc +++ /dev/null @@ -1,377 +0,0 @@ -/* SPDX-FileCopyrightText: 2005 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup modifiers - */ - -#include "BLI_hash.h" -#include "BLI_rand.h" -#include "BLI_task.h" - -#include "BLT_translation.hh" - -#include "BLO_read_write.hh" - -#include "DNA_defaults.h" -#include "DNA_gpencil_modifier_types.h" -#include "DNA_node_types.h" /* For `GeometryNodeCurveSampleMode` */ -#include "DNA_object_types.h" - -#include "BKE_curves.hh" -#include "BKE_geometry_set.hh" -#include "BKE_grease_pencil.hh" -#include "BKE_lib_query.hh" -#include "BKE_modifier.hh" - -#include "UI_interface.hh" -#include "UI_resources.hh" - -#include "MOD_grease_pencil_util.hh" -#include "MOD_modifiertypes.hh" -#include "MOD_ui_common.hh" - -#include "RNA_access.hh" -#include "RNA_prototypes.h" - -#include "GEO_extend_curves.hh" -#include "GEO_trim_curves.hh" - -namespace blender { - -static void init_data(ModifierData *md) -{ - GreasePencilLengthModifierData *gpmd = reinterpret_cast(md); - - BLI_assert(MEMCMP_STRUCT_AFTER_IS_ZERO(gpmd, modifier)); - - MEMCPY_STRUCT_AFTER(gpmd, DNA_struct_default_get(GreasePencilLengthModifierData), modifier); - modifier::greasepencil::init_influence_data(&gpmd->influence, false); -} - -static void copy_data(const ModifierData *md, ModifierData *target, int flags) -{ - const auto *omd = reinterpret_cast(md); - auto *tomd = reinterpret_cast(target); - - modifier::greasepencil::free_influence_data(&tomd->influence); - - BKE_modifier_copydata_generic(md, target, flags); - modifier::greasepencil::copy_influence_data(&omd->influence, &tomd->influence, flags); -} - -static void free_data(ModifierData *md) -{ - auto *omd = reinterpret_cast(md); - modifier::greasepencil::free_influence_data(&omd->influence); -} - -static void foreach_ID_link(ModifierData *md, Object *ob, IDWalkFunc walk, void *user_data) -{ - auto *omd = reinterpret_cast(md); - modifier::greasepencil::foreach_influence_ID_link(&omd->influence, ob, walk, user_data); -} - -static void blend_write(BlendWriter *writer, const ID * /*id_owner*/, const ModifierData *md) -{ - const GreasePencilLengthModifierData *mmd = - reinterpret_cast(md); - - BLO_write_struct(writer, GreasePencilLengthModifierData, mmd); - modifier::greasepencil::write_influence_data(writer, &mmd->influence); -} - -static void blend_read(BlendDataReader *reader, ModifierData *md) -{ - GreasePencilLengthModifierData *mmd = reinterpret_cast(md); - - modifier::greasepencil::read_influence_data(reader, &mmd->influence); -} - -static Array noise_table(int len, int offset, int seed) -{ - Array table(len); - for (const int i : table.index_range()) { - table[i] = BLI_hash_int_01(BLI_hash_int_2d(seed, i + offset + 1)); - } - return table; -} - -static float table_sample(MutableSpan table, float x) -{ - return math::interpolate(table[int(math::ceil(x))], table[int(math::floor(x))], math::fract(x)); -} - -static void deform_drawing(const ModifierData &md, - const Object &ob, - bke::greasepencil::Drawing &drawing, - const int current_time) -{ - const GreasePencilLengthModifierData &mmd = - reinterpret_cast(md); - bke::CurvesGeometry &curves = drawing.strokes_for_write(); - - if (curves.points_num() == 0) { - return; - } - - IndexMaskMemory memory; - const IndexMask selection = modifier::greasepencil::get_filtered_stroke_mask( - &ob, curves, mmd.influence, memory); - - const int curves_num = curves.curves_num(); - - /* Variable for tagging shrinking when values are adjusted after random. */ - std::atomic needs_additional_shrinking = false; - - VArray use_starts = VArray::ForSingle(mmd.start_fac, curves_num); - VArray use_ends = VArray::ForSingle(mmd.end_fac, curves_num); - - Array modified_starts; - Array modified_ends; - if (mmd.rand_start_fac != 0.0 || mmd.rand_end_fac != 0.0) { - modified_starts = Array(curves.curves_num(), mmd.start_fac); - modified_ends = Array(curves.curves_num(), mmd.end_fac); - - /* Use random to modify start/end factors. Put the modified values outside the - * branch so it could be accessed in later stretching/shrinking stages. */ - use_starts = VArray::ForSpan(modified_starts.as_mutable_span()); - use_ends = VArray::ForSpan(modified_ends.as_mutable_span()); - - int seed = mmd.seed; - - /* Make sure different modifiers get different seeds. */ - seed += BLI_hash_string(ob.id.name + 2); - seed += BLI_hash_string(md.name); - - if (mmd.flag & GP_LENGTH_USE_RANDOM) { - seed += current_time / mmd.step; - } - - float rand_offset = BLI_hash_int_01(seed); - - Array noise_table_length = noise_table( - 4 + curves_num, int(math::floor(mmd.rand_offset)), seed + 2); - - threading::parallel_for(IndexRange(curves_num), 512, [&](const IndexRange parallel_range) { - for (const int i : parallel_range) { - /* To ensure a nice distribution, we use halton sequence and offset using the seed. */ - double r[2]; - const uint primes[2] = {2, 3}; - double offset[2] = {0.0f, 0.0f}; - BLI_halton_2d(primes, offset, i, r); - - float rand[2] = {0.0f, 0.0f}; - for (int j = 0; j < 2; j++) { - float noise = table_sample(noise_table_length, i + j * 2 + math::fract(mmd.rand_offset)); - - rand[j] = math::mod(float(r[j] + rand_offset), 1.0f); - rand[j] = math::abs( - math::mod(sin(rand[j] * 12.9898f + j * 78.233f) * 43758.5453f, 1.0f) + noise); - } - - modified_starts[i] = modified_starts[i] + rand[0] * mmd.rand_start_fac; - modified_ends[i] = modified_ends[i] + rand[1] * mmd.rand_end_fac; - - if (modified_starts[i] <= 0.0f || modified_ends[i] <= 0.0f) { - needs_additional_shrinking.store(true, std::memory_order_relaxed); - } - } - }); - } - - curves = geometry::extend_curves(curves, - selection, - use_starts, - use_ends, - mmd.overshoot_fac, - (mmd.flag & GP_LENGTH_USE_CURVATURE) != 0, - mmd.point_density, - mmd.segment_influence, - mmd.max_angle, - (mmd.flag & GP_LENGTH_INVERT_CURVATURE) != 0, - ((mmd.mode & GP_LENGTH_ABSOLUTE) != 0) ? - GEO_NODE_CURVE_SAMPLE_LENGTH : - GEO_NODE_CURVE_SAMPLE_FACTOR, - {}); - - /* Always do the stretching first since it might depend on points which could be deleted by the - * shrink. */ - if (mmd.start_fac < 0.0f || mmd.end_fac < 0.0f || needs_additional_shrinking) { - /* #trim_curves() accepts the `end` values if it's sampling from the beginning of the - * curve, so we need to get the lengths of the curves and subtract it from the back when the - * modifier is in Absolute mode. For convenience, we always call #trim_curves() in LENGTH - * mode since the function itself will need length to be sampled anyway. */ - Array starts(curves.curves_num()); - Array ends(curves.curves_num()); - Array needs_removal(curves.curves_num()); - needs_removal.fill(false); - - curves.ensure_evaluated_lengths(); - - threading::parallel_for(curves.curves_range(), 512, [&](const IndexRange parallel_range) { - for (const int curve : parallel_range) { - float length = curves.evaluated_length_total_for_curve(curve, false); - if (mmd.mode & GP_LENGTH_ABSOLUTE) { - starts[curve] = -math::min(use_starts[curve], 0.0f); - ends[curve] = length - (-math::min(use_ends[curve], 0.0f)); - } - else { - starts[curve] = -math::min(use_starts[curve], 0.0f) * length; - ends[curve] = (1 + math::min(use_ends[curve], 0.0f)) * length; - } - if (starts[curve] > ends[curve]) { - needs_removal[curve] = true; - } - } - }); - curves = geometry::trim_curves(curves, - selection, - VArray::ForSpan(starts.as_span()), - VArray::ForSpan(ends.as_span()), - GEO_NODE_CURVE_SAMPLE_LENGTH, - {}); - - /* #trim_curves() will leave the last segment there when trimmed length is greater than - * curve original length, thus we need to remove those curves afterwards. */ - IndexMaskMemory memory_remove; - const IndexMask to_remove = IndexMask::from_bools(needs_removal.as_span(), memory_remove); - if (!to_remove.is_empty()) { - curves.remove_curves(to_remove, {}); - } - } - - drawing.tag_topology_changed(); -} - -static void modify_geometry_set(ModifierData *md, - const ModifierEvalContext *ctx, - blender::bke::GeometrySet *geometry_set) -{ - GreasePencilLengthModifierData *mmd = reinterpret_cast(md); - - if (!geometry_set->has_grease_pencil()) { - return; - } - - GreasePencil &grease_pencil = *geometry_set->get_grease_pencil_for_write(); - - IndexMaskMemory mask_memory; - const IndexMask layer_mask = modifier::greasepencil::get_filtered_layer_mask( - grease_pencil, mmd->influence, mask_memory); - const Vector drawings = - modifier::greasepencil::get_drawings_for_write( - grease_pencil, layer_mask, grease_pencil.runtime->eval_frame); - - threading::parallel_for_each(drawings, [&](bke::greasepencil::Drawing *drawing) { - deform_drawing(*md, *ctx->object, *drawing, grease_pencil.runtime->eval_frame); - }); -} - -static void panel_draw(const bContext *C, Panel *panel) -{ - uiLayout *layout = panel->layout; - - PointerRNA *ptr = modifier_panel_get_property_pointers(panel, nullptr); - - uiLayoutSetPropSep(layout, true); - uiItemR(layout, ptr, "mode", UI_ITEM_NONE, nullptr, ICON_NONE); - - uiLayout *col = uiLayoutColumn(layout, true); - - if (RNA_enum_get(ptr, "mode") == GP_LENGTH_RELATIVE) { - uiItemR(col, ptr, "start_factor", UI_ITEM_NONE, IFACE_("Start"), ICON_NONE); - uiItemR(col, ptr, "end_factor", UI_ITEM_NONE, IFACE_("End"), ICON_NONE); - } - else { - uiItemR(col, ptr, "start_length", UI_ITEM_NONE, IFACE_("Start"), ICON_NONE); - uiItemR(col, ptr, "end_length", UI_ITEM_NONE, IFACE_("End"), ICON_NONE); - } - - uiItemR(layout, ptr, "overshoot_factor", UI_ITEM_R_SLIDER, IFACE_("Used Length"), ICON_NONE); - - if (uiLayout *random_layout = uiLayoutPanelProp( - C, layout, ptr, "open_random_panel", "Randomize")) - { - uiItemR(random_layout, ptr, "use_random", UI_ITEM_NONE, IFACE_("Randomize"), ICON_NONE); - - uiLayout *subcol = uiLayoutColumn(random_layout, false); - uiLayoutSetPropSep(subcol, true); - uiLayoutSetActive(subcol, RNA_boolean_get(ptr, "use_random")); - - uiItemR(subcol, ptr, "step", UI_ITEM_NONE, nullptr, ICON_NONE); - - uiItemR(subcol, ptr, "random_start_factor", UI_ITEM_NONE, IFACE_("Offset Start"), ICON_NONE); - uiItemR(subcol, ptr, "random_end_factor", UI_ITEM_NONE, IFACE_("End"), ICON_NONE); - uiItemR(subcol, ptr, "random_offset", UI_ITEM_NONE, IFACE_("Noise Offset"), ICON_NONE); - uiItemR(subcol, ptr, "seed", UI_ITEM_NONE, nullptr, ICON_NONE); - } - - if (uiLayout *curvature_layout = uiLayoutPanelProp( - C, layout, ptr, "open_curvature_panel", "Curvature")) - { - uiItemR(curvature_layout, ptr, "use_curvature", UI_ITEM_NONE, IFACE_("Curvature"), ICON_NONE); - - uiLayout *subcol = uiLayoutColumn(curvature_layout, false); - uiLayoutSetPropSep(subcol, true); - uiLayoutSetActive(subcol, RNA_boolean_get(ptr, "use_curvature")); - - uiItemR(subcol, ptr, "point_density", UI_ITEM_NONE, nullptr, ICON_NONE); - uiItemR(subcol, ptr, "segment_influence", UI_ITEM_NONE, nullptr, ICON_NONE); - uiItemR(subcol, ptr, "max_angle", UI_ITEM_NONE, nullptr, ICON_NONE); - uiItemR(subcol, ptr, "invert_curvature", UI_ITEM_NONE, IFACE_("Invert"), ICON_NONE); - } - - if (uiLayout *influence_panel = uiLayoutPanelProp( - C, layout, ptr, "open_influence_panel", "Influence")) - { - modifier::greasepencil::draw_layer_filter_settings(C, influence_panel, ptr); - modifier::greasepencil::draw_material_filter_settings(C, influence_panel, ptr); - } - - modifier_panel_end(layout, ptr); -} - -static void panel_register(ARegionType *region_type) -{ - modifier_panel_register(region_type, eModifierType_GreasePencilLength, panel_draw); -} - -} // namespace blender - -ModifierTypeInfo modifierType_GreasePencilLength = { - /*idname*/ "GreasePencilLengthModifier", - /*name*/ N_("Length"), - /*struct_name*/ "GreasePencilLengthModifierData", - /*struct_size*/ sizeof(GreasePencilLengthModifierData), - /*srna*/ &RNA_GreasePencilLengthModifier, - /*type*/ ModifierTypeType::Nonconstructive, - /*flags*/ - eModifierTypeFlag_AcceptsGreasePencil | eModifierTypeFlag_EnableInEditmode | - eModifierTypeFlag_SupportsEditmode, - /*icon*/ ICON_MOD_LENGTH, - - /*copy_data*/ blender::copy_data, - - /*deform_verts*/ nullptr, - /*deform_matrices*/ nullptr, - /*deform_verts_EM*/ nullptr, - /*deform_matrices_EM*/ nullptr, - /*modify_mesh*/ nullptr, - /*modify_geometry_set*/ blender::modify_geometry_set, - - /*init_data*/ blender::init_data, - /*required_data_mask*/ nullptr, - /*free_data*/ blender::free_data, - /*is_disabled*/ nullptr, - /*update_depsgraph*/ nullptr, - /*depends_on_time*/ nullptr, - /*depends_on_normals*/ nullptr, - /*foreach_ID_link*/ blender::foreach_ID_link, - /*foreach_tex_link*/ nullptr, - /*free_runtime_data*/ nullptr, - /*panel_register*/ blender::panel_register, - /*blend_write*/ blender::blend_write, - /*blend_read*/ blender::blend_read, -}; diff --git a/source/blender/modifiers/intern/MOD_grease_pencil_mirror.cc b/source/blender/modifiers/intern/MOD_grease_pencil_mirror.cc index ee29e1af183..e2d307ea6a0 100644 --- a/source/blender/modifiers/intern/MOD_grease_pencil_mirror.cc +++ b/source/blender/modifiers/intern/MOD_grease_pencil_mirror.cc @@ -14,7 +14,9 @@ #include "BKE_grease_pencil.hh" #include "BKE_instances.hh" #include "BKE_lib_query.hh" +#include "BKE_material.h" #include "BKE_modifier.hh" +#include "BKE_screen.hh" #include "BLO_read_write.hh" @@ -23,13 +25,15 @@ #include "UI_interface.hh" #include "UI_resources.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "WM_types.hh" +#include "RNA_access.hh" #include "RNA_prototypes.h" #include "MOD_grease_pencil_util.hh" +#include "MOD_modifiertypes.hh" #include "MOD_ui_common.hh" namespace blender { @@ -89,7 +93,8 @@ static float4x4 get_mirror_matrix(const Object &ob, if (mmd.object) { /* Transforms from parent object space to target object space. */ - const float4x4 to_target = math::invert(mmd.object->object_to_world()) * ob.object_to_world(); + const float4x4 to_target = math::invert(float4x4(mmd.object->object_to_world)) * + float4x4(ob.object_to_world); /* Mirror points in the target object space. */ matrix = math::invert(to_target) * matrix * to_target; } diff --git a/source/blender/modifiers/intern/MOD_grease_pencil_multiply.cc b/source/blender/modifiers/intern/MOD_grease_pencil_multiply.cc deleted file mode 100644 index e5aa4445705..00000000000 --- a/source/blender/modifiers/intern/MOD_grease_pencil_multiply.cc +++ /dev/null @@ -1,329 +0,0 @@ -/* SPDX-FileCopyrightText: 2024 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup modifiers - */ - -#include "MEM_guardedalloc.h" - -#include "BLI_math_matrix.hh" - -#include "DNA_defaults.h" -#include "DNA_material_types.h" -#include "DNA_modifier_types.h" -#include "DNA_scene_types.h" - -#include "BKE_attribute.hh" -#include "BKE_curves.hh" -#include "BKE_geometry_set.hh" -#include "BKE_grease_pencil.hh" -#include "BKE_instances.hh" -#include "BKE_lib_query.hh" -#include "BKE_material.h" -#include "BKE_modifier.hh" -#include "BKE_screen.hh" - -#include "BLO_read_write.hh" - -#include "DEG_depsgraph_query.hh" - -#include "GEO_realize_instances.hh" - -#include "UI_interface.hh" -#include "UI_resources.hh" - -#include "BLT_translation.hh" - -#include "WM_types.hh" - -#include "RNA_access.hh" -#include "RNA_enum_types.hh" -#include "RNA_prototypes.h" - -#include "MOD_grease_pencil_util.hh" -#include "MOD_modifiertypes.hh" -#include "MOD_ui_common.hh" - -namespace blender { - -using bke::greasepencil::Drawing; - -static void init_data(ModifierData *md) -{ - auto *mmd = reinterpret_cast(md); - - BLI_assert(MEMCMP_STRUCT_AFTER_IS_ZERO(mmd, modifier)); - - MEMCPY_STRUCT_AFTER(mmd, DNA_struct_default_get(GreasePencilMultiModifierData), modifier); - modifier::greasepencil::init_influence_data(&mmd->influence, true); -} - -static void copy_data(const ModifierData *md, ModifierData *target, const int flag) -{ - const auto *mmd = reinterpret_cast(md); - auto *tmmd = reinterpret_cast(target); - - BKE_modifier_copydata_generic(md, target, flag); - modifier::greasepencil::copy_influence_data(&mmd->influence, &tmmd->influence, flag); -} - -static void free_data(ModifierData *md) -{ - auto *mmd = reinterpret_cast(md); - modifier::greasepencil::free_influence_data(&mmd->influence); -} - -static void foreach_ID_link(ModifierData *md, Object *ob, IDWalkFunc walk, void *user_data) -{ - auto *mmd = reinterpret_cast(md); - modifier::greasepencil::foreach_influence_ID_link(&mmd->influence, ob, walk, user_data); -} - -static bool is_disabled(const Scene * /*scene*/, ModifierData *md, bool /*use_render_params*/) -{ - auto *mmd = reinterpret_cast(md); - if (mmd->duplications <= 1) { - return true; - } - return false; -} - -static bke::CurvesGeometry duplicate_strokes(const bke::CurvesGeometry &curves, - const IndexMask curves_mask, - const IndexMask unselected_mask, - const int count, - int &r_original_point_count) -{ - bke::CurvesGeometry masked_curves = bke::curves_copy_curve_selection(curves, curves_mask, {}); - bke::CurvesGeometry unselected_curves = bke::curves_copy_curve_selection( - curves, unselected_mask, {}); - - r_original_point_count = masked_curves.points_num(); - - Curves *masked_curves_id = bke::curves_new_nomain(masked_curves); - Curves *unselected_curves_id = bke::curves_new_nomain(unselected_curves); - - bke::GeometrySet masked_geo = bke::GeometrySet::from_curves(masked_curves_id); - bke::GeometrySet unselected_geo = bke::GeometrySet::from_curves(unselected_curves_id); - - std::unique_ptr instances = std::make_unique(); - const int masked_handle = instances->add_reference(bke::InstanceReference{masked_geo}); - const int unselected_handle = instances->add_reference(bke::InstanceReference{unselected_geo}); - - for ([[maybe_unused]] const int i : IndexRange(count)) { - instances->add_instance(masked_handle, float4x4::identity()); - } - instances->add_instance(unselected_handle, float4x4::identity()); - - geometry::RealizeInstancesOptions options; - options.keep_original_ids = true; - options.realize_instance_attributes = true; - options.propagation_info = {}; - bke::GeometrySet result_geo = geometry::realize_instances( - bke::GeometrySet::from_instances(instances.release()), options); - return std::move(result_geo.get_curves_for_write()->geometry.wrap()); -} - -static void generate_curves(GreasePencilMultiModifierData &mmd, - const ModifierEvalContext &ctx, - Drawing &drawing) -{ - bke::CurvesGeometry &curves = drawing.strokes_for_write(); - - IndexMaskMemory mask_memory; - const IndexMask curves_mask = modifier::greasepencil::get_filtered_stroke_mask( - ctx.object, curves, mmd.influence, mask_memory); - - if (curves_mask.is_empty()) { - return; - } - - const IndexMask unselected_mask = curves_mask.complement(curves.curves_range(), mask_memory); - - int src_point_count; - bke::CurvesGeometry duplicated_strokes = duplicate_strokes( - curves, curves_mask, unselected_mask, mmd.duplications, src_point_count); - - const float offset = math::length(math::to_scale(ctx.object->object_to_world())) * mmd.offset; - const float distance = mmd.distance; - const bool use_fading = (mmd.flag & MOD_GREASE_PENCIL_MULTIPLY_ENABLE_FADING) != 0; - const float fading_thickness = mmd.fading_thickness; - const float fading_opacity = mmd.fading_opacity; - const float fading_center = mmd.fading_center; - - MutableSpan positions = duplicated_strokes.positions_for_write(); - const Span tangents = duplicated_strokes.evaluated_tangents(); - const Span normals = drawing.curve_plane_normals(); - - bke::MutableAttributeAccessor attributes = duplicated_strokes.attributes_for_write(); - bke::SpanAttributeWriter opacities = attributes.lookup_or_add_for_write_span( - "opacity", bke::AttrDomain::Point); - bke::SpanAttributeWriter radii = attributes.lookup_or_add_for_write_span( - "radius", bke::AttrDomain::Point); - - const OffsetIndices points_by_curve = curves.points_by_curve(); - - Array pos_l(src_point_count); - Array pos_r(src_point_count); - - threading::parallel_for(curves.curves_range(), 128, [&](const IndexRange range) { - for (const int curve : range) { - for (const int point : points_by_curve[curve]) { - const float3 miter = math::cross(normals[curve], tangents[point]) * distance; - pos_l[point] = positions[point] + miter; - pos_r[point] = positions[point] - miter; - } - } - }); - - const Span stroke_pos_l = pos_l.as_span(); - const Span stroke_pos_r = pos_r.as_span(); - - for (const int i : IndexRange(mmd.duplications)) { - using bke::attribute_math::mix2; - const IndexRange stroke = IndexRange(src_point_count * i, src_point_count); - MutableSpan instance_positions = positions.slice(stroke); - MutableSpan instance_opacity = opacities.span.slice(stroke); - MutableSpan instance_radii = radii.span.slice(stroke); - const float offset_fac = (mmd.duplications == 1) ? - 0.5f : - (1.0f - (float(i) / float(mmd.duplications - 1))); - const float fading_fac = fabsf(offset_fac - fading_center); - const float thickness_factor = use_fading ? mix2(fading_fac, 1.0f, 1.0f - fading_thickness) : - 1.0f; - const float opacity_factor = use_fading ? mix2(fading_fac, 1.0f, 1.0f - fading_opacity) : 1.0f; - threading::parallel_for(instance_positions.index_range(), 512, [&](const IndexRange range) { - for (const int point : range) { - const float fac = mix2(float(i) / float(mmd.duplications - 1), 1 + offset, offset); - const int old_point = point % src_point_count; - instance_positions[point] = mix2(fac, stroke_pos_l[old_point], stroke_pos_r[old_point]); - instance_radii[point] *= thickness_factor; - instance_opacity[point] *= opacity_factor; - } - }); - } - - radii.finish(); - opacities.finish(); - - curves = std::move(duplicated_strokes); - drawing.tag_topology_changed(); -} - -static void modify_geometry_set(ModifierData *md, - const ModifierEvalContext *ctx, - bke::GeometrySet *geometry_set) -{ - auto *mmd = reinterpret_cast(md); - - if (!geometry_set->has_grease_pencil()) { - return; - } - GreasePencil &grease_pencil = *geometry_set->get_grease_pencil_for_write(); - const int frame = grease_pencil.runtime->eval_frame; - - IndexMaskMemory memory; - const IndexMask layer_mask = modifier::greasepencil::get_filtered_layer_mask( - grease_pencil, mmd->influence, memory); - const Vector drawings = modifier::greasepencil::get_drawings_for_write( - grease_pencil, layer_mask, frame); - threading::parallel_for_each(drawings, - [&](Drawing *drawing) { generate_curves(*mmd, *ctx, *drawing); }); -} - -static void panel_draw(const bContext *C, Panel *panel) -{ - uiLayout *layout = panel->layout; - - PointerRNA ob_ptr; - PointerRNA *ptr = modifier_panel_get_property_pointers(panel, &ob_ptr); - - uiLayoutSetPropSep(layout, true); - - uiItemR(layout, ptr, "duplicates", UI_ITEM_NONE, nullptr, ICON_NONE); - - uiLayout *col = uiLayoutColumn(layout, false); - uiLayoutSetActive(col, RNA_int_get(ptr, "duplicates") > 0); - uiItemR(col, ptr, "distance", UI_ITEM_NONE, nullptr, ICON_NONE); - uiItemR(col, ptr, "offset", UI_ITEM_R_SLIDER, nullptr, ICON_NONE); - - if (uiLayout *fade_panel = uiLayoutPanelProp(C, layout, ptr, "open_fading_panel", "Fade")) { - uiLayoutSetPropSep(fade_panel, true); - uiItemR(fade_panel, ptr, "use_fade", UI_ITEM_NONE, nullptr, ICON_NONE); - - uiLayout *sub = uiLayoutColumn(fade_panel, false); - uiLayoutSetActive(sub, RNA_boolean_get(ptr, "use_fade")); - - uiItemR(sub, ptr, "fading_center", UI_ITEM_NONE, nullptr, ICON_NONE); - uiItemR(sub, ptr, "fading_thickness", UI_ITEM_R_SLIDER, nullptr, ICON_NONE); - uiItemR(sub, ptr, "fading_opacity", UI_ITEM_R_SLIDER, nullptr, ICON_NONE); - } - - if (uiLayout *influence_panel = uiLayoutPanelProp( - C, layout, ptr, "open_influence_panel", "Influence")) - { - modifier::greasepencil::draw_layer_filter_settings(C, influence_panel, ptr); - modifier::greasepencil::draw_material_filter_settings(C, influence_panel, ptr); - } - - modifier_panel_end(layout, ptr); -} - -static void panel_register(ARegionType *region_type) -{ - modifier_panel_register(region_type, eModifierType_GreasePencilMultiply, panel_draw); -} - -static void blend_write(BlendWriter *writer, const ID * /*id_owner*/, const ModifierData *md) -{ - const auto *mmd = reinterpret_cast(md); - - BLO_write_struct(writer, GreasePencilMultiModifierData, mmd); - modifier::greasepencil::write_influence_data(writer, &mmd->influence); -} - -static void blend_read(BlendDataReader *reader, ModifierData *md) -{ - auto *mmd = reinterpret_cast(md); - - modifier::greasepencil::read_influence_data(reader, &mmd->influence); -} - -} // namespace blender - -ModifierTypeInfo modifierType_GreasePencilMultiply = { - /*idname*/ "GreasePencilMultiply", - /*name*/ N_("Multiple Strokes"), - /*struct_name*/ "GreasePencilMultiModifierData", - /*struct_size*/ sizeof(GreasePencilMultiModifierData), - /*srna*/ &RNA_GreasePencilMultiplyModifier, - /*type*/ ModifierTypeType::Constructive, - /*flags*/ eModifierTypeFlag_AcceptsGreasePencil | eModifierTypeFlag_SupportsEditmode | - eModifierTypeFlag_EnableInEditmode | eModifierTypeFlag_SupportsMapping, - /*icon*/ ICON_MOD_CURVE, - - /*copy_data*/ blender::copy_data, - - /*deform_verts*/ nullptr, - /*deform_matrices*/ nullptr, - /*deform_verts_EM*/ nullptr, - /*deform_matrices_EM*/ nullptr, - /*modify_mesh*/ nullptr, - /*modify_geometry_set*/ blender::modify_geometry_set, - - /*init_data*/ blender::init_data, - /*required_data_mask*/ nullptr, - /*free_data*/ blender::free_data, - /*is_disabled*/ blender::is_disabled, - /*update_depsgraph*/ nullptr, - /*depends_on_time*/ nullptr, - /*depends_on_normals*/ nullptr, - /*foreach_ID_link*/ blender::foreach_ID_link, - /*foreach_tex_link*/ nullptr, - /*free_runtime_data*/ nullptr, - /*panel_register*/ blender::panel_register, - /*blend_write*/ blender::blend_write, - /*blend_read*/ blender::blend_read, -}; diff --git a/source/blender/modifiers/intern/MOD_grease_pencil_noise.cc b/source/blender/modifiers/intern/MOD_grease_pencil_noise.cc index 1fb9b59e741..160a745279b 100644 --- a/source/blender/modifiers/intern/MOD_grease_pencil_noise.cc +++ b/source/blender/modifiers/intern/MOD_grease_pencil_noise.cc @@ -9,7 +9,7 @@ #include "BLI_hash.h" #include "BLI_math_vector.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BLO_read_write.hh" @@ -25,6 +25,7 @@ #include "UI_resources.hh" #include "MOD_grease_pencil_util.hh" +#include "MOD_modifiertypes.hh" #include "MOD_ui_common.hh" #include "RNA_access.hh" @@ -117,6 +118,8 @@ static void deform_drawing(const GreasePencilNoiseModifierData &mmd, return; } + const OffsetIndices points_by_curve = strokes.points_by_curve(); + int seed = mmd.seed; /* Make sure different modifiers get different seeds. */ seed += BLI_hash_string(ob.id.name + 2); @@ -131,20 +134,15 @@ static void deform_drawing(const GreasePencilNoiseModifierData &mmd, } } - const OffsetIndices points_by_curve = strokes.points_by_curve(); - const VArray vgroup_weights = modifier::greasepencil::get_influence_vertex_weights( - strokes, mmd.influence); - auto get_weight = [&](const IndexRange points, const int point_i) { - const float vertex_weight = vgroup_weights[points[point_i]]; if (!use_curve) { - return vertex_weight; + return 1.0f; } const float value = float(point_i) / float(points.size() - 1); - return vertex_weight * BKE_curvemapping_evaluateF(mmd.influence.custom_curve, 0, value); + return BKE_curvemapping_evaluateF(mmd.influence.custom_curve, 0, value); }; - auto get_noise = [](const Span noise_table, const float value) { + auto get_noise = [](const Array &noise_table, const float value) { return math::interpolate(noise_table[int(math::ceil(value))], noise_table[int(math::floor(value))], math::fract(value)); @@ -159,7 +157,7 @@ static void deform_drawing(const GreasePencilNoiseModifierData &mmd, const IndexRange points = points_by_curve[stroke_i]; const int noise_len = math::ceil(points.size() * noise_scale) + 2; const Array table = noise_table( - noise_len, int(math::floor(mmd.noise_offset)), seed + 2 + stroke_i); + noise_len, int(math::floor(mmd.noise_offset)), seed + 2); for (const int i : points.index_range()) { const int point = points[i]; float weight = get_weight(points, i); @@ -179,8 +177,7 @@ static void deform_drawing(const GreasePencilNoiseModifierData &mmd, filtered_strokes.foreach_index(GrainSize(512), [&](const int stroke_i) { const IndexRange points = points_by_curve[stroke_i]; const int noise_len = math::ceil(points.size() * noise_scale) + 2; - const Array table = noise_table( - noise_len, int(math::floor(mmd.noise_offset)), seed + stroke_i); + const Array table = noise_table(noise_len, int(math::floor(mmd.noise_offset)), seed); for (const int i : points.index_range()) { const int point = points[i]; const float weight = get_weight(points, i); @@ -198,7 +195,7 @@ static void deform_drawing(const GreasePencilNoiseModifierData &mmd, const IndexRange points = points_by_curve[stroke_i]; const int noise_len = math::ceil(points.size() * noise_scale) + 2; const Array table = noise_table( - noise_len, int(math::floor(mmd.noise_offset)), seed + 3 + stroke_i); + noise_len, int(math::floor(mmd.noise_offset)), seed + 3); for (const int i : points.index_range()) { const int point = points[i]; const float weight = get_weight(points, i); diff --git a/source/blender/modifiers/intern/MOD_grease_pencil_offset.cc b/source/blender/modifiers/intern/MOD_grease_pencil_offset.cc index 46f1bb5865f..2ab2cb495f0 100644 --- a/source/blender/modifiers/intern/MOD_grease_pencil_offset.cc +++ b/source/blender/modifiers/intern/MOD_grease_pencil_offset.cc @@ -25,7 +25,7 @@ #include "UI_interface.hh" #include "UI_resources.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "WM_types.hh" @@ -386,13 +386,10 @@ static void panel_draw(const bContext *C, Panel *panel) const auto offset_mode = GreasePencilOffsetModifierMode(RNA_enum_get(ptr, "offset_mode")); uiLayoutSetPropSep(layout, true); - if (uiLayout *general_panel = uiLayoutPanelProp(C, layout, ptr, "open_general_panel", "General")) - { - uiLayoutSetPropSep(general_panel, true); - uiItemR(general_panel, ptr, "location", UI_ITEM_NONE, nullptr, ICON_NONE); - uiItemR(general_panel, ptr, "rotation", UI_ITEM_NONE, nullptr, ICON_NONE); - uiItemR(general_panel, ptr, "scale", UI_ITEM_NONE, nullptr, ICON_NONE); - } + + uiItemR(layout, ptr, "location", UI_ITEM_NONE, nullptr, ICON_NONE); + uiItemR(layout, ptr, "rotation", UI_ITEM_NONE, nullptr, ICON_NONE); + uiItemR(layout, ptr, "scale", UI_ITEM_NONE, nullptr, ICON_NONE); LayoutPanelState *advanced_panel_state = BKE_panel_layout_panel_state_ensure( panel, "advanced", true); diff --git a/source/blender/modifiers/intern/MOD_grease_pencil_opacity.cc b/source/blender/modifiers/intern/MOD_grease_pencil_opacity.cc index 74c1088e785..2879d271c5d 100644 --- a/source/blender/modifiers/intern/MOD_grease_pencil_opacity.cc +++ b/source/blender/modifiers/intern/MOD_grease_pencil_opacity.cc @@ -8,26 +8,30 @@ #include "DNA_defaults.h" #include "DNA_modifier_types.h" +#include "DNA_scene_types.h" #include "BKE_colortools.hh" #include "BKE_curves.hh" #include "BKE_geometry_set.hh" #include "BKE_grease_pencil.hh" #include "BKE_modifier.hh" +#include "BKE_screen.hh" #include "BLO_read_write.hh" #include "UI_interface.hh" #include "UI_resources.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "WM_types.hh" #include "RNA_access.hh" +#include "RNA_enum_types.hh" #include "RNA_prototypes.h" #include "MOD_grease_pencil_util.hh" +#include "MOD_modifiertypes.hh" #include "MOD_ui_common.hh" namespace blender { @@ -157,10 +161,10 @@ static void modify_hardness(const GreasePencilOpacityModifierData &omd, const IndexMask &curves_mask) { bke::MutableAttributeAccessor attributes = curves.attributes_for_write(); - bke::SpanAttributeWriter hardnesses = attributes.lookup_or_add_for_write_span( - "hardness", - bke::AttrDomain::Curve, - bke::AttributeInitVArray(VArray::ForSingle(1.0f, curves.curve_num))); + bke::SpanAttributeWriter hardnesses = attributes.lookup_for_write_span("hardness"); + if (!hardnesses) { + return; + } curves_mask.foreach_index(GrainSize(512), [&](int64_t curve_i) { hardnesses.span[curve_i] = std::clamp( diff --git a/source/blender/modifiers/intern/MOD_grease_pencil_outline.cc b/source/blender/modifiers/intern/MOD_grease_pencil_outline.cc deleted file mode 100644 index d24052a7bcc..00000000000 --- a/source/blender/modifiers/intern/MOD_grease_pencil_outline.cc +++ /dev/null @@ -1,729 +0,0 @@ -/* SPDX-FileCopyrightText: 2024 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup modifiers - */ - -#include "BKE_attribute.hh" -#include "BKE_material.h" -#include "BLI_array_utils.hh" -#include "BLI_enumerable_thread_specific.hh" -#include "BLI_index_range.hh" -#include "BLI_math_matrix.hh" -#include "BLI_math_vector.hh" -#include "BLI_offset_indices.hh" -#include "BLI_span.hh" - -#include "BLI_virtual_array.hh" -#include "DNA_defaults.h" -#include "DNA_modifier_types.h" -#include "DNA_scene_types.h" - -#include "BKE_curves.hh" -#include "BKE_geometry_set.hh" -#include "BKE_grease_pencil.hh" -#include "BKE_instances.hh" -#include "BKE_lib_query.hh" -#include "BKE_modifier.hh" -#include "BKE_screen.hh" - -#include "BLO_read_write.hh" - -#include "DEG_depsgraph_query.hh" - -#include "GEO_resample_curves.hh" - -#include "UI_interface.hh" -#include "UI_resources.hh" - -#include "BLT_translation.hh" - -#include "WM_api.hh" -#include "WM_types.hh" - -#include "RNA_access.hh" -#include "RNA_prototypes.h" - -#include "MOD_grease_pencil_util.hh" -#include "MOD_ui_common.hh" - -namespace blender { - -static void init_data(ModifierData *md) -{ - auto *omd = reinterpret_cast(md); - - BLI_assert(MEMCMP_STRUCT_AFTER_IS_ZERO(omd, modifier)); - - MEMCPY_STRUCT_AFTER(omd, DNA_struct_default_get(GreasePencilOutlineModifierData), modifier); - modifier::greasepencil::init_influence_data(&omd->influence, false); -} - -static void copy_data(const ModifierData *md, ModifierData *target, const int flag) -{ - const auto *omd = reinterpret_cast(md); - auto *tmmd = reinterpret_cast(target); - - modifier::greasepencil::free_influence_data(&tmmd->influence); - - BKE_modifier_copydata_generic(md, target, flag); - modifier::greasepencil::copy_influence_data(&omd->influence, &tmmd->influence, flag); -} - -static void free_data(ModifierData *md) -{ - auto *omd = reinterpret_cast(md); - modifier::greasepencil::free_influence_data(&omd->influence); -} - -static void foreach_ID_link(ModifierData *md, Object *ob, IDWalkFunc walk, void *user_data) -{ - auto *omd = reinterpret_cast(md); - modifier::greasepencil::foreach_influence_ID_link(&omd->influence, ob, walk, user_data); - walk(user_data, ob, (ID **)&omd->outline_material, IDWALK_CB_USER); - walk(user_data, ob, (ID **)&omd->object, IDWALK_CB_NOP); -} - -static void update_depsgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx) -{ - auto *omd = reinterpret_cast(md); - if (ctx->scene->camera) { - DEG_add_object_relation( - ctx->node, ctx->scene->camera, DEG_OB_COMP_TRANSFORM, "Grease Pencil Outline Modifier"); - DEG_add_object_relation( - ctx->node, ctx->scene->camera, DEG_OB_COMP_PARAMETERS, "Grease Pencil Outline Modifier"); - } - if (omd->object != nullptr) { - DEG_add_object_relation( - ctx->node, omd->object, DEG_OB_COMP_TRANSFORM, "Grease Pencil Outline Modifier"); - } - DEG_add_object_relation( - ctx->node, ctx->object, DEG_OB_COMP_TRANSFORM, "Grease Pencil Outline Modifier"); -} - -/** - * Rearrange curve buffers by moving points from the start to the back of each stroke. - * \note This is an optional feature. The offset is determine by the closest point to an object. - * \param curve_offsets Offset of each curve, indicating the point that becomes the new start. - */ -static bke::CurvesGeometry reorder_cyclic_curve_points(const bke::CurvesGeometry &src_curves, - const IndexMask &curve_selection, - const Span curve_offsets) -{ - BLI_assert(curve_offsets.size() == src_curves.curves_num()); - - OffsetIndices src_offsets = src_curves.points_by_curve(); - bke::AttributeAccessor src_attributes = src_curves.attributes(); - - Array indices(src_curves.points_num()); - curve_selection.foreach_index(GrainSize(512), [&](const int64_t curve_i) { - const IndexRange points = src_offsets[curve_i]; - const int point_num = points.size(); - const int point_start = points.start(); - MutableSpan point_indices = indices.as_mutable_span().slice(points); - if (points.size() < 2) { - array_utils::fill_index_range(point_indices, point_start); - return; - } - /* Offset can be negative or larger than the buffer. Use modulo to get an - * equivalent offset within buffer size to simplify copying. */ - const int offset_raw = curve_offsets[curve_i]; - const int offset = offset_raw >= 0 ? offset_raw % points.size() : - points.size() - ((-offset_raw) % points.size()); - BLI_assert(0 <= offset && offset < points.size()); - if (offset == 0) { - array_utils::fill_index_range(point_indices, point_start); - return; - } - - const int point_middle = point_start + offset; - array_utils::fill_index_range(point_indices.take_front(point_num - offset), point_middle); - array_utils::fill_index_range(point_indices.take_back(offset), point_start); - }); - - /* Have to make a copy of the input geometry, gather_attributes does not work in-place when the - * source indices are not ordered. */ - bke::CurvesGeometry dst_curves(src_curves); - bke::MutableAttributeAccessor dst_attributes = dst_curves.attributes_for_write(); - bke::gather_attributes(src_attributes, bke::AttrDomain::Point, {}, {}, indices, dst_attributes); - - return dst_curves; -} - -static int find_closest_point(const Span positions, const float3 &target) -{ - if (positions.is_empty()) { - return 0; - } - - int closest_i = 0; - float min_dist_squared = math::distance_squared(positions.first(), target); - for (const int i : positions.index_range().drop_front(1)) { - const float dist_squared = math::distance_squared(positions[i], target); - if (dist_squared < min_dist_squared) { - closest_i = i; - min_dist_squared = dist_squared; - } - } - return closest_i; -} - -/* Generate points in an counter-clockwise arc between two directions. */ -static void generate_arc_from_point_to_point(const float3 &from, - const float3 &to, - const float3 ¢er_pt, - const int subdivisions, - const int src_point_index, - Vector &r_perimeter, - Vector &r_src_indices) -{ - const float3 vec_from = from - center_pt; - const float3 vec_to = to - center_pt; - if (math::is_zero(vec_from) || math::is_zero(vec_to)) { - r_perimeter.append(center_pt); - r_src_indices.append(src_point_index); - return; - } - - const float cos_angle = math::dot(vec_from.xy(), vec_to.xy()); - const float sin_angle = vec_from.x * vec_to.y - vec_from.y * vec_to.x; - /* Compute angle in range [0, 2pi) so that the rotation is always counter-clockwise. */ - const float angle = math::atan2(-sin_angle, -cos_angle) + M_PI; - - /* Number of points is 2^(n+1) + 1 on half a circle (n=subdivisions) - * so we multiply by (angle / pi) to get the right amount of - * points to insert. */ - const int num_full = (1 << (subdivisions + 1)) + 1; - const int num_points = num_full * math::abs(angle) / M_PI; - if (num_points < 2) { - r_perimeter.append(center_pt + vec_from); - r_src_indices.append(src_point_index); - return; - } - const float delta_angle = angle / float(num_points - 1); - const float delta_cos = math::cos(delta_angle); - const float delta_sin = math::sin(delta_angle); - - float3 vec = vec_from; - for ([[maybe_unused]] const int i : IndexRange(num_points)) { - r_perimeter.append(center_pt + vec); - r_src_indices.append(src_point_index); - - const float x = delta_cos * vec.x - delta_sin * vec.y; - const float y = delta_sin * vec.x + delta_cos * vec.y; - vec = float3(x, y, 0.0f); - } -} - -/* Generate a semi-circle around a point, opposite the direction. */ -static void generate_cap(const float3 &point, - const float3 &tangent, - const float radius, - const int subdivisions, - const eGPDstroke_Caps cap_type, - const int src_point_index, - Vector &r_perimeter, - Vector &r_src_indices) -{ - const float3 normal = {tangent.y, -tangent.x, 0.0f}; - switch (cap_type) { - case GP_STROKE_CAP_ROUND: - generate_arc_from_point_to_point(point - normal * radius, - point + normal * radius, - point, - subdivisions, - src_point_index, - r_perimeter, - r_src_indices); - break; - case GP_STROKE_CAP_FLAT: - r_perimeter.append(point + normal * radius); - r_src_indices.append(src_point_index); - break; - case GP_STROKE_CAP_MAX: - BLI_assert_unreachable(); - break; - } -} - -/* Generate a corner between two segments, with a rounded outer perimeter. - * Note: The perimeter is considered to be to the right hand side of the stroke. The left side - * perimeter can be generated by reversing the order of points. */ -static void generate_corner(const float3 &pt_a, - const float3 &pt_b, - const float3 &pt_c, - const float radius, - const int subdivisions, - const int src_point_index, - Vector &r_perimeter, - Vector &r_src_indices) -{ - const float length = math::length(pt_c - pt_b); - const float length_prev = math::length(pt_b - pt_a); - const float2 tangent = math::normalize((pt_c - pt_b).xy()); - const float2 tangent_prev = math::normalize((pt_b - pt_a).xy()); - const float3 normal = {tangent.y, -tangent.x, 0.0f}; - const float3 normal_prev = {tangent_prev.y, -tangent_prev.x, 0.0f}; - - const float sin_angle = tangent_prev.x * tangent.y - tangent_prev.y * tangent.x; - /* Whether the corner is an inside or outside corner. - * This determines whether an arc is added or a single miter point. */ - const bool is_outside_corner = (sin_angle >= 0.0f); - if (is_outside_corner) { - generate_arc_from_point_to_point(pt_b + normal_prev * radius, - pt_b + normal * radius, - pt_b, - subdivisions, - src_point_index, - r_perimeter, - r_src_indices); - } - else { - const float2 avg_tangent = math::normalize(tangent_prev + tangent); - const float3 miter = {avg_tangent.y, -avg_tangent.x, 0.0f}; - const float miter_invscale = math::dot(normal, miter); - - /* Avoid division by tiny values for steep angles. */ - const float3 miter_point = (radius < length * miter_invscale && - radius < length_prev * miter_invscale) ? - pt_b + miter * radius / miter_invscale : - pt_b + miter * radius; - - r_perimeter.append(miter_point); - r_src_indices.append(src_point_index); - } -} - -static void generate_stroke_perimeter(const Span all_positions, - const VArray all_radii, - const IndexRange points, - const int subdivisions, - const bool is_cyclic, - const bool use_caps, - const eGPDstroke_Caps start_cap_type, - const eGPDstroke_Caps end_cap_type, - const float radius_offset, - Vector &r_perimeter, - Vector &r_point_counts, - Vector &r_point_indices) -{ - const Span positions = all_positions.slice(points); - const int point_num = points.size(); - if (point_num < 2) { - return; - } - - auto add_corner = [&](const int a, const int b, const int c) { - const int point = points[b]; - const float3 pt_a = positions[a]; - const float3 pt_b = positions[b]; - const float3 pt_c = positions[c]; - const float radius = std::max(all_radii[point] + radius_offset, 0.0f); - generate_corner(pt_a, pt_b, pt_c, radius, subdivisions, point, r_perimeter, r_point_indices); - }; - auto add_cap = [&](const int center_i, const int next_i, const eGPDstroke_Caps cap_type) { - const int point = points[center_i]; - const float3 ¢er = positions[center_i]; - const float3 dir = math::normalize(positions[next_i] - center); - const float radius = std::max(all_radii[point] + radius_offset, 0.0f); - generate_cap(center, dir, radius, subdivisions, cap_type, point, r_perimeter, r_point_indices); - }; - - /* Creates a single cyclic curve with end caps. */ - if (use_caps) { - /* Open curves generate a start and end cap and a connecting stroke on either side. */ - const int perimeter_start = r_perimeter.size(); - - /* Start cap. */ - add_cap(0, 1, start_cap_type); - - /* Right perimeter half. */ - for (const int i : points.index_range().drop_front(1).drop_back(1)) { - add_corner(i - 1, i, i + 1); - } - if (is_cyclic) { - add_corner(point_num - 2, point_num - 1, 0); - } - - /* End cap. */ - if (is_cyclic) { - /* End point is same as start point. */ - add_cap(0, point_num - 1, end_cap_type); - } - else { - /* End point is last point of the curve. */ - add_cap(point_num - 1, point_num - 2, end_cap_type); - } - - /* Left perimeter half. */ - if (is_cyclic) { - add_corner(0, point_num - 1, point_num - 2); - } - for (const int i : points.index_range().drop_front(1).drop_back(1)) { - add_corner(point_num - i, point_num - i - 1, point_num - i - 2); - } - - const int perimeter_count = r_perimeter.size() - perimeter_start; - if (perimeter_count > 0) { - r_point_counts.append(perimeter_count); - } - } - else { - /* Generate separate "inside" and an "outside" perimeter curves. - * The distinction is arbitrary, called left/right here. */ - - /* Right side perimeter. */ - const int left_perimeter_start = r_perimeter.size(); - add_corner(point_num - 1, 0, 1); - for (const int i : points.index_range().drop_front(1).drop_back(1)) { - add_corner(i - 1, i, i + 1); - } - add_corner(point_num - 2, point_num - 1, 0); - const int left_perimeter_count = r_perimeter.size() - left_perimeter_start; - if (left_perimeter_count > 0) { - r_point_counts.append(left_perimeter_count); - } - - /* Left side perimeter. */ - const int right_perimeter_start = r_perimeter.size(); - add_corner(0, point_num - 1, point_num - 2); - for (const int i : points.index_range().drop_front(1).drop_back(1)) { - add_corner(point_num - i, point_num - i - 1, point_num - i - 2); - } - add_corner(1, 0, point_num - 1); - const int right_perimeter_count = r_perimeter.size() - right_perimeter_start; - if (right_perimeter_count > 0) { - r_point_counts.append(right_perimeter_count); - } - } -} - -struct PerimeterData { - /* New points per curve count. */ - Vector point_counts; - /* New point coordinates. */ - Vector positions; - /* Source curve index. */ - Vector curve_indices; - /* Source point index. */ - Vector point_indices; -}; - -static bke::CurvesGeometry create_curves_outline(const bke::greasepencil::Drawing &drawing, - const float4x4 &viewmat, - const IndexMask &curves_mask, - const int subdivisions, - const float stroke_radius, - int stroke_mat_nr, - const bool keep_shape) -{ - const bke::CurvesGeometry &src_curves = drawing.strokes(); - Span src_positions = src_curves.positions(); - bke::AttributeAccessor src_attributes = src_curves.attributes(); - const VArray src_radii = drawing.radii(); - const VArray src_cyclic = *src_attributes.lookup_or_default( - "cyclic", bke::AttrDomain::Curve, false); - const VArray src_start_caps = *src_attributes.lookup_or_default( - "start_cap", bke::AttrDomain::Curve, GP_STROKE_CAP_ROUND); - const VArray src_end_caps = *src_attributes.lookup_or_default( - "end_cap", bke::AttrDomain::Curve, GP_STROKE_CAP_ROUND); - const VArray src_material_index = *src_attributes.lookup_or_default( - "material_index", bke::AttrDomain::Curve, -1); - - /* Transform positions into view space. */ - Array view_positions(src_positions.size()); - threading::parallel_for(view_positions.index_range(), 4096, [&](const IndexRange range) { - for (const int i : range) { - view_positions[i] = math::transform_point(viewmat, src_positions[i]); - } - }); - - const float4x4 viewinv = math::invert(viewmat); - threading::EnumerableThreadSpecific thread_data; - curves_mask.foreach_index([&](const int64_t curve_i) { - PerimeterData &data = thread_data.local(); - - const bool is_cyclic_curve = src_cyclic[curve_i]; - /* Note: Cyclic curves would better be represented by a cyclic perimeter without end caps, but - * we always generate caps for compatibility with GPv2. Fill materials cannot create holes, so - * a cyclic outline does not work well. */ - const bool use_caps = true /*!is_cyclic_curve*/; - - const int prev_point_num = data.positions.size(); - const int prev_curve_num = data.point_counts.size(); - const IndexRange points = src_curves.points_by_curve()[curve_i]; - /* Offset the strokes by the radius so the outside aligns with the input stroke. */ - const float radius_offset = keep_shape ? -stroke_radius : 0.0f; - generate_stroke_perimeter(view_positions, - src_radii, - points, - subdivisions, - is_cyclic_curve, - use_caps, - eGPDstroke_Caps(src_start_caps[curve_i]), - eGPDstroke_Caps(src_end_caps[curve_i]), - radius_offset, - data.positions, - data.point_counts, - data.point_indices); - - /* Transform perimeter positions back into object space. */ - for (float3 &pos : data.positions.as_mutable_span().drop_front(prev_point_num)) { - pos = math::transform_point(viewinv, pos); - } - - data.curve_indices.append_n_times(curve_i, data.point_counts.size() - prev_curve_num); - }); - - int dst_curve_num = 0; - int dst_point_num = 0; - for (const PerimeterData &data : thread_data) { - BLI_assert(data.point_counts.size() == data.curve_indices.size()); - BLI_assert(data.positions.size() == data.point_indices.size()); - dst_curve_num += data.point_counts.size(); - dst_point_num += data.positions.size(); - } - - bke::CurvesGeometry dst_curves(dst_point_num, dst_curve_num); - if (dst_point_num == 0 || dst_curve_num == 0) { - return dst_curves; - } - - bke::MutableAttributeAccessor dst_attributes = dst_curves.attributes_for_write(); - bke::SpanAttributeWriter dst_cyclic = dst_attributes.lookup_or_add_for_write_span( - "cyclic", bke::AttrDomain::Curve); - bke::SpanAttributeWriter dst_material = dst_attributes.lookup_or_add_for_write_span( - "material_index", bke::AttrDomain::Curve); - bke::SpanAttributeWriter dst_radius = dst_attributes.lookup_or_add_for_write_span( - "radius", bke::AttrDomain::Point); - const MutableSpan dst_offsets = dst_curves.offsets_for_write(); - const MutableSpan dst_positions = dst_curves.positions_for_write(); - /* Source indices for attribute mapping. */ - Array dst_curve_map(dst_curve_num); - Array dst_point_map(dst_point_num); - - IndexRange curves; - IndexRange points; - for (const PerimeterData &data : thread_data) { - curves = curves.after(data.point_counts.size()); - points = points.after(data.positions.size()); - - /* Append curve data. */ - dst_curve_map.as_mutable_span().slice(curves).copy_from(data.curve_indices); - /* Curve offsets are accumulated below. */ - dst_offsets.slice(curves).copy_from(data.point_counts); - dst_cyclic.span.slice(curves).fill(true); - if (stroke_mat_nr >= 0) { - dst_material.span.slice(curves).fill(stroke_mat_nr); - } - else { - for (const int i : curves.index_range()) { - dst_material.span[curves[i]] = src_material_index[data.curve_indices[i]]; - } - } - - /* Append point data. */ - dst_positions.slice(points).copy_from(data.positions); - dst_point_map.as_mutable_span().slice(points).copy_from(data.point_indices); - dst_radius.span.slice(points).fill(stroke_radius); - } - offset_indices::accumulate_counts_to_offsets(dst_curves.offsets_for_write()); - - bke::gather_attributes(src_attributes, - bke::AttrDomain::Point, - {}, - {"position", "radius"}, - dst_point_map, - dst_attributes); - bke::gather_attributes(src_attributes, - bke::AttrDomain::Curve, - {}, - {"cyclic", "material_index"}, - dst_curve_map, - dst_attributes); - - dst_cyclic.finish(); - dst_material.finish(); - dst_radius.finish(); - dst_curves.update_curve_types(); - - return dst_curves; -} - -static void modify_drawing(const GreasePencilOutlineModifierData &omd, - const ModifierEvalContext &ctx, - bke::greasepencil::Drawing &drawing, - const float4x4 &viewmat) -{ - if (drawing.strokes().curve_num == 0) { - return; - } - - /* Selected source curves. */ - IndexMaskMemory curve_mask_memory; - const IndexMask curves_mask = modifier::greasepencil::get_filtered_stroke_mask( - ctx.object, drawing.strokes(), omd.influence, curve_mask_memory); - - /* Unit object scale is applied to the stroke radius. */ - const float object_scale = math::length( - math::transform_direction(ctx.object->object_to_world(), float3(M_SQRT1_3))); - /* Legacy thickness setting is diameter in pixels, divide by 2000 to get radius. */ - const float radius = math::max(omd.thickness * object_scale, 1.0f) * 0.0005f; - const bool keep_shape = omd.flag & MOD_GREASE_PENCIL_OUTLINE_KEEP_SHAPE; - const int mat_nr = (omd.outline_material ? - BKE_object_material_index_get(ctx.object, omd.outline_material) : - -1); - - bke::CurvesGeometry curves = create_curves_outline( - drawing, viewmat, curves_mask, omd.subdiv, radius, mat_nr, keep_shape); - - /* Cyclic curve reordering feature. */ - if (omd.object) { - const OffsetIndices points_by_curve = curves.points_by_curve(); - - /* Computes the offset of the closest point to the object from the curve start. */ - Array offset_by_curve(curves.curves_num()); - for (const int i : curves.curves_range()) { - const IndexRange points = points_by_curve[i]; - /* Closest point index is already relative to the point range and can be used as offset. */ - offset_by_curve[i] = find_closest_point(curves.positions().slice(points), omd.object->loc); - } - - curves = reorder_cyclic_curve_points(curves, curves.curves_range(), offset_by_curve); - } - - /* Resampling feature. */ - if (omd.sample_length > 0.0f) { - VArray sample_lengths = VArray::ForSingle(omd.sample_length, - curves.curves_num()); - curves = geometry::resample_to_length(curves, curves.curves_range(), sample_lengths); - } - - drawing.strokes_for_write() = std::move(curves); - drawing.tag_topology_changed(); -} - -static void modify_geometry_set(ModifierData *md, - const ModifierEvalContext *ctx, - bke::GeometrySet *geometry_set) -{ - using bke::greasepencil::Drawing; - using bke::greasepencil::Layer; - using modifier::greasepencil::LayerDrawingInfo; - - const auto &omd = *reinterpret_cast(md); - - const Scene *scene = DEG_get_evaluated_scene(ctx->depsgraph); - if (!scene->camera) { - return; - } - const float4x4 viewinv = scene->camera->world_to_object(); - - if (!geometry_set->has_grease_pencil()) { - return; - } - GreasePencil &grease_pencil = *geometry_set->get_grease_pencil_for_write(); - const int frame = grease_pencil.runtime->eval_frame; - - IndexMaskMemory mask_memory; - const IndexMask layer_mask = modifier::greasepencil::get_filtered_layer_mask( - grease_pencil, omd.influence, mask_memory); - - const Vector drawings = modifier::greasepencil::get_drawing_infos_by_layer( - grease_pencil, layer_mask, frame); - threading::parallel_for_each(drawings, [&](const LayerDrawingInfo &info) { - const Layer &layer = *grease_pencil.layers()[info.layer_index]; - const float4x4 viewmat = viewinv * layer.to_world_space(*ctx->object); - modify_drawing(omd, *ctx, *info.drawing, viewmat); - }); -} - -static void panel_draw(const bContext *C, Panel *panel) -{ - uiLayout *layout = panel->layout; - - PointerRNA ob_ptr; - PointerRNA *ptr = modifier_panel_get_property_pointers(panel, &ob_ptr); - - uiLayoutSetPropSep(layout, true); - - uiItemR(layout, ptr, "thickness", UI_ITEM_NONE, nullptr, ICON_NONE); - uiItemR(layout, ptr, "use_keep_shape", UI_ITEM_NONE, nullptr, ICON_NONE); - uiItemR(layout, ptr, "subdivision", UI_ITEM_NONE, nullptr, ICON_NONE); - uiItemR(layout, ptr, "sample_length", UI_ITEM_NONE, nullptr, ICON_NONE); - uiItemR(layout, ptr, "outline_material", UI_ITEM_NONE, nullptr, ICON_NONE); - uiItemR(layout, ptr, "object", UI_ITEM_NONE, nullptr, ICON_NONE); - - Scene *scene = CTX_data_scene(C); - if (scene->camera == nullptr) { - uiItemL(layout, RPT_("Outline requires an active camera"), ICON_ERROR); - } - - if (uiLayout *influence_panel = uiLayoutPanelProp( - C, layout, ptr, "open_influence_panel", "Influence")) - { - modifier::greasepencil::draw_layer_filter_settings(C, influence_panel, ptr); - modifier::greasepencil::draw_material_filter_settings(C, influence_panel, ptr); - } - - modifier_panel_end(layout, ptr); -} - -static void panel_register(ARegionType *region_type) -{ - modifier_panel_register(region_type, eModifierType_GreasePencilOutline, panel_draw); -} - -static void blend_write(BlendWriter *writer, const ID * /*id_owner*/, const ModifierData *md) -{ - const auto *omd = reinterpret_cast(md); - - BLO_write_struct(writer, GreasePencilOutlineModifierData, omd); - modifier::greasepencil::write_influence_data(writer, &omd->influence); -} - -static void blend_read(BlendDataReader *reader, ModifierData *md) -{ - auto *omd = reinterpret_cast(md); - - modifier::greasepencil::read_influence_data(reader, &omd->influence); -} - -} // namespace blender - -ModifierTypeInfo modifierType_GreasePencilOutline = { - /*idname*/ "GreasePencilOutline", - /*name*/ N_("Outline"), - /*struct_name*/ "GreasePencilOutlineModifierData", - /*struct_size*/ sizeof(GreasePencilOutlineModifierData), - /*srna*/ &RNA_GreasePencilOutlineModifier, - /*type*/ ModifierTypeType::Nonconstructive, - /*flags*/ eModifierTypeFlag_AcceptsGreasePencil | eModifierTypeFlag_SupportsEditmode | - eModifierTypeFlag_EnableInEditmode | eModifierTypeFlag_SupportsMapping, - /*icon*/ ICON_MOD_OUTLINE, - - /*copy_data*/ blender::copy_data, - - /*deform_verts*/ nullptr, - /*deform_matrices*/ nullptr, - /*deform_verts_EM*/ nullptr, - /*deform_matrices_EM*/ nullptr, - /*modify_mesh*/ nullptr, - /*modify_geometry_set*/ blender::modify_geometry_set, - - /*init_data*/ blender::init_data, - /*required_data_mask*/ nullptr, - /*free_data*/ blender::free_data, - /*is_disabled*/ nullptr, - /*update_depsgraph*/ blender::update_depsgraph, - /*depends_on_time*/ nullptr, - /*depends_on_normals*/ nullptr, - /*foreach_ID_link*/ blender::foreach_ID_link, - /*foreach_tex_link*/ nullptr, - /*free_runtime_data*/ nullptr, - /*panel_register*/ blender::panel_register, - /*blend_write*/ blender::blend_write, - /*blend_read*/ blender::blend_read, -}; diff --git a/source/blender/modifiers/intern/MOD_grease_pencil_shrinkwrap.cc b/source/blender/modifiers/intern/MOD_grease_pencil_shrinkwrap.cc deleted file mode 100644 index 8c736370875..00000000000 --- a/source/blender/modifiers/intern/MOD_grease_pencil_shrinkwrap.cc +++ /dev/null @@ -1,365 +0,0 @@ -/* SPDX-FileCopyrightText: 2024 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup modifiers - */ - -#include "BKE_attribute.hh" -#include "BKE_material.h" - -#include "DNA_defaults.h" -#include "DNA_meshdata_types.h" -#include "DNA_modifier_types.h" -#include "DNA_scene_types.h" - -#include "BKE_curves.hh" -#include "BKE_deform.hh" -#include "BKE_geometry_set.hh" -#include "BKE_grease_pencil.hh" -#include "BKE_instances.hh" -#include "BKE_lib_query.hh" -#include "BKE_modifier.hh" -#include "BKE_screen.hh" -#include "BKE_shrinkwrap.hh" - -#include "BLO_read_write.hh" - -#include "DEG_depsgraph_query.hh" - -#include "GEO_smooth_curves.hh" - -#include "UI_interface.hh" -#include "UI_resources.hh" - -#include "BLT_translation.hh" - -#include "WM_api.hh" -#include "WM_types.hh" - -#include "RNA_access.hh" -#include "RNA_prototypes.h" - -#include "MOD_grease_pencil_util.hh" -#include "MOD_ui_common.hh" - -namespace blender { - -static void init_data(ModifierData *md) -{ - auto *smd = reinterpret_cast(md); - - BLI_assert(MEMCMP_STRUCT_AFTER_IS_ZERO(smd, modifier)); - - MEMCPY_STRUCT_AFTER(smd, DNA_struct_default_get(GreasePencilShrinkwrapModifierData), modifier); - modifier::greasepencil::init_influence_data(&smd->influence, false); -} - -static void copy_data(const ModifierData *md, ModifierData *target, const int flag) -{ - const auto *smd = reinterpret_cast(md); - auto *tsmd = reinterpret_cast(target); - - modifier::greasepencil::free_influence_data(&tsmd->influence); - - BKE_modifier_copydata_generic(md, target, flag); - modifier::greasepencil::copy_influence_data(&smd->influence, &tsmd->influence, flag); -} - -static void free_data(ModifierData *md) -{ - auto *smd = reinterpret_cast(md); - modifier::greasepencil::free_influence_data(&smd->influence); - - if (smd->cache_data) { - BKE_shrinkwrap_free_tree(smd->cache_data); - MEM_SAFE_FREE(smd->cache_data); - } -} - -static void foreach_ID_link(ModifierData *md, Object *ob, IDWalkFunc walk, void *user_data) -{ - auto *smd = reinterpret_cast(md); - modifier::greasepencil::foreach_influence_ID_link(&smd->influence, ob, walk, user_data); - walk(user_data, ob, (ID **)&smd->target, IDWALK_CB_NOP); - walk(user_data, ob, (ID **)&smd->aux_target, IDWALK_CB_NOP); -} - -static bool is_disabled(const Scene * /*scene*/, ModifierData *md, bool /*use_render_params*/) -{ - auto *smd = reinterpret_cast(md); - - /* The object type check is only needed here in case we have a placeholder - * object assigned (because the library containing the mesh is missing). - * - * In other cases it should be impossible to have a type mismatch. - */ - if (smd->target == nullptr || smd->target->type != OB_MESH) { - return true; - } - if (smd->aux_target != nullptr && smd->aux_target->type != OB_MESH) { - return true; - } - return false; -} - -static void update_depsgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx) -{ - auto *smd = reinterpret_cast(md); - CustomData_MeshMasks mask = {0}; - - if (BKE_shrinkwrap_needs_normals(smd->shrink_type, smd->shrink_mode)) { - mask.lmask |= CD_MASK_CUSTOMLOOPNORMAL; - } - - if (smd->target != nullptr) { - DEG_add_object_relation( - ctx->node, smd->target, DEG_OB_COMP_TRANSFORM, "Grease Pencil Shrinkwrap Modifier"); - DEG_add_object_relation( - ctx->node, smd->target, DEG_OB_COMP_GEOMETRY, "Grease Pencil Shrinkwrap Modifier"); - DEG_add_customdata_mask(ctx->node, smd->target, &mask); - if (smd->shrink_type == MOD_SHRINKWRAP_TARGET_PROJECT) { - DEG_add_special_eval_flag(ctx->node, &smd->target->id, DAG_EVAL_NEED_SHRINKWRAP_BOUNDARY); - } - } - if (smd->aux_target != nullptr) { - DEG_add_object_relation( - ctx->node, smd->aux_target, DEG_OB_COMP_TRANSFORM, "Grease Pencil Shrinkwrap Modifier"); - DEG_add_object_relation( - ctx->node, smd->aux_target, DEG_OB_COMP_GEOMETRY, "Grease Pencil Shrinkwrap Modifier"); - DEG_add_customdata_mask(ctx->node, smd->aux_target, &mask); - if (smd->shrink_type == MOD_SHRINKWRAP_TARGET_PROJECT) { - DEG_add_special_eval_flag( - ctx->node, &smd->aux_target->id, DAG_EVAL_NEED_SHRINKWRAP_BOUNDARY); - } - } - DEG_add_depends_on_transform_relation(ctx->node, "Grease Pencil Shrinkwrap Modifier"); -} - -static void modify_drawing(const GreasePencilShrinkwrapModifierData &smd, - const ModifierEvalContext &ctx, - bke::greasepencil::Drawing &drawing) -{ - bke::CurvesGeometry &curves = drawing.strokes_for_write(); - const OffsetIndices points_by_curve = curves.points_by_curve(); - const Span dverts = curves.deform_verts(); - const MutableSpan positions = curves.positions_for_write(); - const int defgrp_idx = BKE_object_defgroup_name_index(ctx.object, - smd.influence.vertex_group_name); - - /* Selected source curves. */ - IndexMaskMemory curve_mask_memory; - const IndexMask curves_mask = modifier::greasepencil::get_filtered_stroke_mask( - ctx.object, drawing.strokes(), smd.influence, curve_mask_memory); - - ShrinkwrapParams params; - params.target = smd.target; - params.aux_target = smd.aux_target; - params.invert_vertex_weights = smd.influence.flag & GREASE_PENCIL_INFLUENCE_INVERT_VERTEX_GROUP; - params.keep_distance = smd.keep_dist; - params.shrink_type = smd.shrink_type; - params.shrink_options = smd.shrink_opts; - params.shrink_mode = smd.shrink_mode; - params.projection_limit = smd.proj_limit; - params.projection_axis = smd.proj_axis; - params.subsurf_levels = smd.subsurf_levels; - - curves_mask.foreach_index([&](const int curve_i) { - const IndexRange points = points_by_curve[curve_i]; - const Span curve_dverts = dverts.is_empty() ? dverts : dverts.slice(points); - const MutableSpan curve_positions = positions.slice(points); - - shrinkwrapParams_deform( - params, *ctx.object, *smd.cache_data, curve_dverts, defgrp_idx, curve_positions); - }); - - /* Optional smoothing after shrinkwrap. */ - const VArray point_selection = VArray::ForSingle(true, curves.points_num()); - const bool smooth_ends = false; - const bool keep_shape = true; - geometry::smooth_curve_attribute(curves_mask, - points_by_curve, - point_selection, - curves.cyclic(), - smd.smooth_step, - smd.smooth_factor, - smooth_ends, - keep_shape, - positions); - - drawing.tag_positions_changed(); -} - -static void ensure_shrinkwrap_cache_data(GreasePencilShrinkwrapModifierData &smd, - const ModifierEvalContext &ctx) -{ - if (smd.cache_data) { - BKE_shrinkwrap_free_tree(smd.cache_data); - MEM_SAFE_FREE(smd.cache_data); - } - Object *target_ob = DEG_get_evaluated_object(ctx.depsgraph, smd.target); - Mesh *target_mesh = BKE_modifier_get_evaluated_mesh_from_evaluated_object(target_ob); - - smd.cache_data = static_cast( - MEM_callocN(sizeof(ShrinkwrapTreeData), __func__)); - const bool tree_ok = BKE_shrinkwrap_init_tree( - smd.cache_data, target_mesh, smd.shrink_type, smd.shrink_mode, false); - if (!tree_ok) { - MEM_SAFE_FREE(smd.cache_data); - } -} - -static void modify_geometry_set(ModifierData *md, - const ModifierEvalContext *ctx, - bke::GeometrySet *geometry_set) -{ - using bke::greasepencil::Drawing; - using bke::greasepencil::Layer; - using modifier::greasepencil::LayerDrawingInfo; - - auto &smd = *reinterpret_cast(md); - BLI_assert(smd.target != nullptr); - if (smd.target == ctx->object || smd.aux_target == ctx->object) { - return; - } - if (!geometry_set->has_grease_pencil()) { - return; - } - GreasePencil &grease_pencil = *geometry_set->get_grease_pencil_for_write(); - const int frame = grease_pencil.runtime->eval_frame; - - ensure_shrinkwrap_cache_data(smd, *ctx); - - IndexMaskMemory mask_memory; - const IndexMask layer_mask = modifier::greasepencil::get_filtered_layer_mask( - grease_pencil, smd.influence, mask_memory); - - const Vector drawings = modifier::greasepencil::get_drawings_for_write( - grease_pencil, layer_mask, frame); - threading::parallel_for_each(drawings, - [&](Drawing *drawing) { modify_drawing(smd, *ctx, *drawing); }); -} - -static void panel_draw(const bContext *C, Panel *panel) -{ - static const eUI_Item_Flag toggles_flag = UI_ITEM_R_TOGGLE | UI_ITEM_R_FORCE_BLANK_DECORATE; - - uiLayout *layout = panel->layout; - - PointerRNA ob_ptr; - PointerRNA *ptr = modifier_panel_get_property_pointers(panel, &ob_ptr); - int wrap_method = RNA_enum_get(ptr, "wrap_method"); - uiLayout *col, *row; - - uiLayoutSetPropSep(layout, true); - - uiItemR(layout, ptr, "wrap_method", UI_ITEM_NONE, nullptr, ICON_NONE); - - if (ELEM(wrap_method, - MOD_SHRINKWRAP_PROJECT, - MOD_SHRINKWRAP_NEAREST_SURFACE, - MOD_SHRINKWRAP_TARGET_PROJECT)) - { - uiItemR(layout, ptr, "wrap_mode", UI_ITEM_NONE, nullptr, ICON_NONE); - } - - if (wrap_method == MOD_SHRINKWRAP_PROJECT) { - uiItemR(layout, ptr, "project_limit", UI_ITEM_NONE, IFACE_("Limit"), ICON_NONE); - uiItemR(layout, ptr, "subsurf_levels", UI_ITEM_NONE, nullptr, ICON_NONE); - - col = uiLayoutColumn(layout, false); - row = uiLayoutRowWithHeading(col, true, IFACE_("Axis")); - uiItemR(row, ptr, "use_project_x", toggles_flag, nullptr, ICON_NONE); - uiItemR(row, ptr, "use_project_y", toggles_flag, nullptr, ICON_NONE); - uiItemR(row, ptr, "use_project_z", toggles_flag, nullptr, ICON_NONE); - - uiItemR(col, ptr, "use_negative_direction", UI_ITEM_NONE, nullptr, ICON_NONE); - uiItemR(col, ptr, "use_positive_direction", UI_ITEM_NONE, nullptr, ICON_NONE); - - uiItemR(layout, ptr, "cull_face", UI_ITEM_R_EXPAND, nullptr, ICON_NONE); - col = uiLayoutColumn(layout, false); - uiLayoutSetActive(col, - RNA_boolean_get(ptr, "use_negative_direction") && - RNA_enum_get(ptr, "cull_face") != 0); - uiItemR(col, ptr, "use_invert_cull", UI_ITEM_NONE, nullptr, ICON_NONE); - } - - uiItemR(layout, ptr, "target", UI_ITEM_NONE, nullptr, ICON_NONE); - if (wrap_method == MOD_SHRINKWRAP_PROJECT) { - uiItemR(layout, ptr, "auxiliary_target", UI_ITEM_NONE, nullptr, ICON_NONE); - } - uiItemR(layout, ptr, "offset", UI_ITEM_NONE, nullptr, ICON_NONE); - - uiLayoutSetPropSep(layout, true); - - uiItemR(layout, ptr, "smooth_factor", UI_ITEM_NONE, nullptr, ICON_NONE); - uiItemR(layout, ptr, "smooth_step", UI_ITEM_NONE, IFACE_("Repeat"), ICON_NONE); - - if (uiLayout *influence_panel = uiLayoutPanelProp( - C, layout, ptr, "open_influence_panel", "Influence")) - { - modifier::greasepencil::draw_layer_filter_settings(C, influence_panel, ptr); - modifier::greasepencil::draw_material_filter_settings(C, influence_panel, ptr); - modifier::greasepencil::draw_vertex_group_settings(C, influence_panel, ptr); - } - - modifier_panel_end(layout, ptr); -} - -static void panel_register(ARegionType *region_type) -{ - modifier_panel_register(region_type, eModifierType_GreasePencilShrinkwrap, panel_draw); -} - -static void blend_write(BlendWriter *writer, const ID * /*id_owner*/, const ModifierData *md) -{ - const auto *smd = reinterpret_cast(md); - - BLO_write_struct(writer, GreasePencilShrinkwrapModifierData, smd); - modifier::greasepencil::write_influence_data(writer, &smd->influence); -} - -static void blend_read(BlendDataReader *reader, ModifierData *md) -{ - auto *smd = reinterpret_cast(md); - - modifier::greasepencil::read_influence_data(reader, &smd->influence); -} - -} // namespace blender - -ModifierTypeInfo modifierType_GreasePencilShrinkwrap = { - /*idname*/ "GreasePencilShrinkwrap", - /*name*/ N_("Shrinkwrap"), - /*struct_name*/ "GreasePencilShrinkwrapModifierData", - /*struct_size*/ sizeof(GreasePencilShrinkwrapModifierData), - /*srna*/ &RNA_GreasePencilShrinkwrapModifier, - /*type*/ ModifierTypeType::OnlyDeform, - /*flags*/ eModifierTypeFlag_AcceptsGreasePencil | eModifierTypeFlag_SupportsEditmode | - eModifierTypeFlag_EnableInEditmode | eModifierTypeFlag_SupportsMapping, - /*icon*/ ICON_MOD_SHRINKWRAP, - - /*copy_data*/ blender::copy_data, - - /*deform_verts*/ nullptr, - /*deform_matrices*/ nullptr, - /*deform_verts_EM*/ nullptr, - /*deform_matrices_EM*/ nullptr, - /*modify_mesh*/ nullptr, - /*modify_geometry_set*/ blender::modify_geometry_set, - - /*init_data*/ blender::init_data, - /*required_data_mask*/ nullptr, - /*free_data*/ blender::free_data, - /*is_disabled*/ blender::is_disabled, - /*update_depsgraph*/ blender::update_depsgraph, - /*depends_on_time*/ nullptr, - /*depends_on_normals*/ nullptr, - /*foreach_ID_link*/ blender::foreach_ID_link, - /*foreach_tex_link*/ nullptr, - /*free_runtime_data*/ nullptr, - /*panel_register*/ blender::panel_register, - /*blend_write*/ blender::blend_write, - /*blend_read*/ blender::blend_read, -}; diff --git a/source/blender/modifiers/intern/MOD_grease_pencil_smooth.cc b/source/blender/modifiers/intern/MOD_grease_pencil_smooth.cc index 72671bd78c6..fdc3427730c 100644 --- a/source/blender/modifiers/intern/MOD_grease_pencil_smooth.cc +++ b/source/blender/modifiers/intern/MOD_grease_pencil_smooth.cc @@ -8,7 +8,7 @@ #include "BLI_index_mask.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BLO_read_write.hh" @@ -21,6 +21,7 @@ #include "BKE_curves.hh" #include "BKE_geometry_set.hh" #include "BKE_grease_pencil.hh" +#include "BKE_lib_query.hh" #include "BKE_modifier.hh" #include "UI_interface.hh" @@ -29,6 +30,7 @@ #include "GEO_smooth_curves.hh" #include "MOD_grease_pencil_util.hh" +#include "MOD_modifiertypes.hh" #include "MOD_ui_common.hh" #include "RNA_prototypes.h" diff --git a/source/blender/modifiers/intern/MOD_grease_pencil_subdiv.cc b/source/blender/modifiers/intern/MOD_grease_pencil_subdiv.cc index b861e633ef4..0dc6209abf3 100644 --- a/source/blender/modifiers/intern/MOD_grease_pencil_subdiv.cc +++ b/source/blender/modifiers/intern/MOD_grease_pencil_subdiv.cc @@ -8,7 +8,7 @@ #include "BLI_index_mask.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BLO_read_write.hh" @@ -26,6 +26,7 @@ #include "UI_resources.hh" #include "MOD_grease_pencil_util.hh" +#include "MOD_modifiertypes.hh" #include "MOD_ui_common.hh" #include "RNA_prototypes.h" @@ -39,7 +40,7 @@ static void init_data(ModifierData *md) BLI_assert(MEMCMP_STRUCT_AFTER_IS_ZERO(gpmd, modifier)); MEMCPY_STRUCT_AFTER(gpmd, DNA_struct_default_get(GreasePencilSubdivModifierData), modifier); - modifier::greasepencil::init_influence_data(&gpmd->influence, false); + modifier::greasepencil::init_influence_data(&gpmd->influence, true); } static void free_data(ModifierData *md) @@ -164,6 +165,7 @@ static void panel_draw(const bContext *C, Panel *panel) { modifier::greasepencil::draw_layer_filter_settings(C, influence_panel, ptr); modifier::greasepencil::draw_material_filter_settings(C, influence_panel, ptr); + modifier::greasepencil::draw_vertex_group_settings(C, influence_panel, ptr); } modifier_panel_end(layout, ptr); diff --git a/source/blender/modifiers/intern/MOD_grease_pencil_thickness.cc b/source/blender/modifiers/intern/MOD_grease_pencil_thickness.cc index 6c669e60d42..cfff04dc4b2 100644 --- a/source/blender/modifiers/intern/MOD_grease_pencil_thickness.cc +++ b/source/blender/modifiers/intern/MOD_grease_pencil_thickness.cc @@ -8,7 +8,7 @@ #include "BLI_index_mask.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BLO_read_write.hh" @@ -22,12 +22,14 @@ #include "BKE_curves.hh" #include "BKE_geometry_set.hh" #include "BKE_grease_pencil.hh" +#include "BKE_lib_query.hh" #include "BKE_modifier.hh" #include "UI_interface.hh" #include "UI_resources.hh" #include "MOD_grease_pencil_util.hh" +#include "MOD_modifiertypes.hh" #include "MOD_ui_common.hh" #include "RNA_prototypes.h" diff --git a/source/blender/modifiers/intern/MOD_grease_pencil_time.cc b/source/blender/modifiers/intern/MOD_grease_pencil_time.cc deleted file mode 100644 index 14d4f776c3d..00000000000 --- a/source/blender/modifiers/intern/MOD_grease_pencil_time.cc +++ /dev/null @@ -1,715 +0,0 @@ -/* SPDX-FileCopyrightText: 2024 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup modifiers - */ - -#include "BLI_index_range.hh" -#include "BLI_map.hh" -#include "BLI_span.hh" -#include "BLI_string.h" -#include "BLI_string_utf8.h" -#include "BLI_vector_set.hh" - -#include "DNA_defaults.h" -#include "DNA_modifier_types.h" -#include "DNA_scene_types.h" - -#include "BKE_curves.hh" -#include "BKE_geometry_set.hh" -#include "BKE_grease_pencil.hh" -#include "BKE_instances.hh" -#include "BKE_modifier.hh" -#include "BKE_screen.hh" - -#include "BLO_read_write.hh" - -#include "DEG_depsgraph_query.hh" - -#include "UI_interface.hh" -#include "UI_resources.hh" - -#include "BLT_translation.hh" - -#include "WM_api.hh" -#include "WM_types.hh" - -#include "RNA_access.hh" -#include "RNA_prototypes.h" - -#include "MOD_grease_pencil_util.hh" -#include "MOD_ui_common.hh" - -#include - -namespace blender { - -static void init_data(ModifierData *md) -{ - auto *tmd = reinterpret_cast(md); - - BLI_assert(MEMCMP_STRUCT_AFTER_IS_ZERO(tmd, modifier)); - - MEMCPY_STRUCT_AFTER(tmd, DNA_struct_default_get(GreasePencilTimeModifierData), modifier); - modifier::greasepencil::init_influence_data(&tmd->influence, false); - - GreasePencilTimeModifierSegment *segment = DNA_struct_default_alloc( - GreasePencilTimeModifierSegment); - STRNCPY_UTF8(segment->name, DATA_("Segment")); - tmd->segments_array = segment; - tmd->segments_num = 1; -} - -static void copy_data(const ModifierData *md, ModifierData *target, const int flag) -{ - const auto *tmd = reinterpret_cast(md); - auto *tmmd = reinterpret_cast(target); - - modifier::greasepencil::free_influence_data(&tmmd->influence); - - BKE_modifier_copydata_generic(md, target, flag); - modifier::greasepencil::copy_influence_data(&tmd->influence, &tmmd->influence, flag); - - tmmd->segments_array = static_cast( - MEM_dupallocN(tmd->segments_array)); -} - -static void free_data(ModifierData *md) -{ - auto *tmd = reinterpret_cast(md); - modifier::greasepencil::free_influence_data(&tmd->influence); - - MEM_SAFE_FREE(tmd->segments_array); -} - -static void foreach_ID_link(ModifierData *md, Object *ob, IDWalkFunc walk, void *user_data) -{ - auto *tmd = reinterpret_cast(md); - modifier::greasepencil::foreach_influence_ID_link(&tmd->influence, ob, walk, user_data); -} - -struct FrameRange { - /* Start frame. */ - int sfra; - /* End frame (unlimited range when undefined). */ - int efra; - - bool is_empty() const - { - return efra < sfra; - } - - bool is_single_frame() const - { - return efra == sfra; - } - - int duration() const - { - return std::max(efra + 1 - sfra, 0); - } - - FrameRange drop_front(const int n) const - { - BLI_assert(n >= 0); - return FrameRange{std::min(sfra + n, efra), efra}; - } - - FrameRange drop_back(const int n) const - { - BLI_assert(n >= 0); - return FrameRange{sfra, std::max(efra - n, sfra)}; - } - - FrameRange shift(const int n) const - { - return FrameRange{sfra + n, efra + n}; - } -}; - -/** - * Find the index range of sorted keys that covers the frame range, including the key right before - * and after the interval. The extra keys are needed when frames are held at the beginning or when - * reversing the direction. - */ -static const IndexRange find_key_range(const Span sorted_keys, const FrameRange &frame_range) -{ - IndexRange result = sorted_keys.index_range(); - for (const int i : result.index_range()) { - const int irev = result.size() - 1 - i; - if (sorted_keys[result[irev]] <= frame_range.sfra) { - /* Found first key affecting the frame range, drop any earlier keys. */ - result = result.drop_front(irev); - break; - } - } - for (const int i : result.index_range()) { - if (sorted_keys[result[i]] > frame_range.efra) { - /* Found first key outside the frame range, drop this and later keys. */ - result = result.take_front(i); - break; - } - } - return result; -} - -struct TimeMapping { - private: - float offset_; - float scale_; - bool use_loop_; - - public: - TimeMapping(const GreasePencilTimeModifierData &tmd) - : offset_(tmd.offset), - scale_(tmd.frame_scale), - use_loop_(tmd.flag & MOD_GREASE_PENCIL_TIME_KEEP_LOOP) - { - } - - float offset() const - { - return offset_; - } - float scale() const - { - return scale_; - } - bool use_loop() const - { - return use_loop_; - } - - float to_scene_time(const float local_frame) const - { - return float(local_frame - offset_) / scale_; - } - float to_local_time(const float scene_frame) const - { - return scene_frame * scale_ + offset_; - } - - /* Compute scene frame number on or after the local frame. */ - int scene_frame_before_local_frame(const int local_frame) const - { - return int(math::floor(to_scene_time(local_frame))); - } - /* Compute scene frame number on or after the local frame. */ - int scene_frame_after_local_frame(const int local_frame) const - { - return int(math::ceil(to_scene_time(local_frame))); - } - - /* Compute local frame number on or before the scene frame. */ - int local_frame_before_scene_frame(const int scene_frame) const - { - return int(math::floor(to_local_time(scene_frame))); - } - /* Compute local frame number on or after the scene frame. */ - int local_frame_after_scene_frame(const int scene_frame) const - { - return int(math::ceil(to_local_time(scene_frame))); - } -}; - -/* Determine how many times the source range must be repeated to cover the destination range. */ -static void calculate_repetitions(const TimeMapping &mapping, - const FrameRange &gp_src, - const FrameRange &scene_dst, - int &r_start, - int &r_count) -{ - if (!mapping.use_loop()) { - r_start = 0; - r_count = 1; - return; - } - const int duration = gp_src.duration(); - if (duration <= 0) { - r_start = 0; - r_count = 0; - return; - } - const FrameRange gp_dst = {mapping.local_frame_before_scene_frame(scene_dst.sfra), - mapping.local_frame_after_scene_frame(scene_dst.efra)}; - r_start = math::floor(float(gp_dst.sfra - gp_src.sfra) / float(duration)); - r_count = math::floor(float(gp_dst.efra - gp_src.sfra) / float(duration)) + 1 - r_start; -} - -static void insert_keys_forward(const TimeMapping &mapping, - const Map &frames, - const Span sorted_keys, - const FrameRange gp_src_range, - const FrameRange gp_dst_range, - Map &dst_frames) -{ - const int offset = gp_dst_range.sfra - gp_src_range.sfra; - for (const int i : sorted_keys.index_range()) { - const int gp_key = sorted_keys[i]; - const int gp_start_key = std::max(gp_key, gp_src_range.sfra); - if (gp_start_key > gp_src_range.efra) { - continue; - } - - const int scene_key = mapping.scene_frame_after_local_frame(gp_key + offset); - dst_frames.add_overwrite(scene_key, frames.lookup(gp_key)); - } -} - -/* Insert keys in reverse order. */ -static void insert_keys_reverse(const TimeMapping &mapping, - const Map &frames, - const Span sorted_keys, - const FrameRange gp_src_range, - const FrameRange gp_dst_range, - Map &dst_frames) -{ - const int offset = gp_dst_range.sfra - gp_src_range.sfra; - for (const int i : sorted_keys.index_range()) { - /* In reverse mode keys need to be inserted in reverse order to ensure "earlier" frames can - * overwrite "later" frames. */ - const int irev = sorted_keys.size() - 1 - i; - /* This finds the correct scene frame starting at the end of the frame interval. */ - const int gp_key = sorted_keys[irev]; - /* The insertion scene time is the end of the keyframe interval instead of the start. - * This is the frame after the end frame (efra) to cover the full extent of the end frame - * interval. */ - const int gp_end_key = (irev < sorted_keys.size() - 1) ? - std::min(sorted_keys[irev + 1], gp_src_range.efra + 1) : - gp_src_range.efra + 1; - if (gp_end_key < gp_src_range.sfra) { - return; - } - - /* Reverse key frame inside the range. */ - const int gp_key_rev = gp_src_range.efra + 1 - (gp_end_key - gp_src_range.sfra); - const int scene_key = mapping.scene_frame_after_local_frame(gp_key_rev + offset); - dst_frames.add_overwrite(scene_key, frames.lookup(gp_key)); - } -} - -static void fill_scene_range_fixed(const TimeMapping &mapping, - const Map &frames, - const Span sorted_keys, - const int gp_src_frame, - const FrameRange scene_dst_range, - Map &dst_frames) -{ - const FrameRange gp_src_range = {gp_src_frame, gp_src_frame}; - const FrameRange gp_dst_range = {mapping.local_frame_before_scene_frame(scene_dst_range.sfra), - mapping.local_frame_after_scene_frame(scene_dst_range.efra)}; - - const Span src_keys = sorted_keys.slice(find_key_range(sorted_keys, gp_src_range)); - insert_keys_forward(mapping, frames, src_keys, gp_src_range, gp_dst_range, dst_frames); -} - -static void fill_scene_range_forward(const TimeMapping &mapping, - const Map &frames, - const Span sorted_keys, - const FrameRange gp_src_range, - const FrameRange scene_dst_range, - Map &dst_frames) -{ - int repeat_start = 0, repeat_count = 1; - calculate_repetitions(mapping, gp_src_range, scene_dst_range, repeat_start, repeat_count); - - const Span src_keys = sorted_keys.slice(find_key_range(sorted_keys, gp_src_range)); - FrameRange gp_dst_range = gp_src_range.shift(repeat_start * gp_src_range.duration()); - for ([[maybe_unused]] const int repeat_i : IndexRange(repeat_count)) { - insert_keys_forward(mapping, frames, src_keys, gp_src_range, gp_dst_range, dst_frames); - gp_dst_range = gp_dst_range.shift(gp_src_range.duration()); - } -} - -static void fill_scene_range_reverse(const TimeMapping &mapping, - const Map &frames, - const Span sorted_keys, - const FrameRange gp_src_range, - const FrameRange scene_dst_range, - Map &dst_frames) -{ - int repeat_start = 0, repeat_count = 1; - calculate_repetitions(mapping, gp_src_range, scene_dst_range, repeat_start, repeat_count); - - const Span src_keys = sorted_keys.slice(find_key_range(sorted_keys, gp_src_range)); - FrameRange gp_dst_range = gp_src_range.shift(repeat_start * gp_src_range.duration()); - for ([[maybe_unused]] const int repeat_i : IndexRange(repeat_count)) { - insert_keys_reverse(mapping, frames, src_keys, gp_src_range, gp_dst_range, dst_frames); - gp_dst_range = gp_dst_range.shift(gp_src_range.duration()); - } -} - -static void fill_scene_range_ping_pong(const TimeMapping &mapping, - const Map &frames, - const Span sorted_keys, - const FrameRange gp_src_range, - const FrameRange scene_dst_range, - Map &dst_frames) -{ - /* Double interval for ping-pong mode, start and end frame only appear once. */ - const FrameRange gp_src_range_ping = {gp_src_range.sfra, gp_src_range.efra - 1}; - const FrameRange gp_src_range_pong = {gp_src_range.sfra + 1, gp_src_range.efra}; - const FrameRange gp_range_full = {gp_src_range.sfra, - 2 * gp_src_range.efra - gp_src_range.sfra - 1}; - int repeat_start = 0, repeat_count = 1; - calculate_repetitions(mapping, gp_range_full, scene_dst_range, repeat_start, repeat_count); - - const Span src_keys = sorted_keys.slice(find_key_range(sorted_keys, gp_src_range)); - FrameRange gp_dst_range = gp_src_range.shift(repeat_start * gp_range_full.duration()); - for ([[maybe_unused]] const int repeat_i : IndexRange(repeat_count)) { - /* Ping. */ - insert_keys_forward(mapping, frames, src_keys, gp_src_range, gp_dst_range, dst_frames); - gp_dst_range = gp_dst_range.shift(gp_src_range_ping.duration()); - /* Pong. */ - insert_keys_reverse(mapping, frames, src_keys, gp_src_range, gp_dst_range, dst_frames); - gp_dst_range = gp_dst_range.shift(gp_src_range_pong.duration()); - } -} - -static void fill_scene_range_chain(const TimeMapping &mapping, - const Map &frames, - const Span sorted_keys, - const Span segments, - const FrameRange gp_src_range, - const FrameRange scene_dst_range, - Map &dst_frames) -{ - using Segment = GreasePencilTimeModifierSegment; - - if (segments.is_empty()) { - return; - } - /* Segment settings tolerate start frame after end frame. */ - auto segment_base_range = [](const Segment &segment) { - return FrameRange{std::min(segment.segment_start, segment.segment_end), - std::max(segment.segment_start, segment.segment_end)}; - }; - auto segment_full_range = [](const Segment &segment) { - const FrameRange base_range = FrameRange{std::min(segment.segment_start, segment.segment_end), - std::max(segment.segment_start, segment.segment_end)}; - const int base_duration = (segment.segment_mode == MOD_GREASE_PENCIL_TIME_SEG_MODE_PINGPONG ? - base_range.duration() * 2 - 2 : - base_range.duration()); - return FrameRange{base_range.sfra, - base_range.sfra + segment.segment_repeat * base_duration - 1}; - }; - /* Find src range by adding up all segments. */ - const FrameRange gp_range_full = [&]() { - int duration = segment_full_range(segments.first()).duration(); - for (const Segment &segment : segments.drop_front(1)) { - duration += segment_full_range(segment).duration(); - } - /* Same start as the source range. */ - return FrameRange{gp_src_range.sfra, gp_src_range.sfra + duration - 1}; - }(); - int repeat_start = 0, repeat_count = 1; - calculate_repetitions(mapping, gp_range_full, scene_dst_range, repeat_start, repeat_count); - - const Span src_keys = sorted_keys; - - FrameRange gp_dst_range = gp_src_range.shift(repeat_start * gp_range_full.duration()); - for ([[maybe_unused]] const int repeat_i : IndexRange(repeat_count)) { - for (const Segment &segment : segments) { - const FrameRange segment_src_range = segment_base_range(segment); - for ([[maybe_unused]] const int segment_repeat_i : IndexRange(segment.segment_repeat)) { - switch (GreasePencilTimeModifierSegmentMode(segment.segment_mode)) { - case MOD_GREASE_PENCIL_TIME_SEG_MODE_NORMAL: - insert_keys_forward( - mapping, frames, src_keys, segment_src_range, gp_dst_range, dst_frames); - gp_dst_range = gp_dst_range.shift(segment_src_range.duration()); - break; - case MOD_GREASE_PENCIL_TIME_SEG_MODE_REVERSE: - insert_keys_reverse( - mapping, frames, src_keys, segment_src_range, gp_dst_range, dst_frames); - gp_dst_range = gp_dst_range.shift(segment_src_range.duration()); - break; - case MOD_GREASE_PENCIL_TIME_SEG_MODE_PINGPONG: { - /* Ping. */ - const FrameRange segment_src_range_ping = {segment_src_range.sfra, - segment_src_range.efra - 1}; - insert_keys_forward( - mapping, frames, src_keys, segment_src_range_ping, gp_dst_range, dst_frames); - gp_dst_range = gp_dst_range.shift(segment_src_range_ping.duration()); - /* Pong. */ - const FrameRange segment_src_range_pong = {segment_src_range.sfra + 1, - segment_src_range.efra}; - insert_keys_reverse( - mapping, frames, src_keys, segment_src_range_pong, gp_dst_range, dst_frames); - gp_dst_range = gp_dst_range.shift(segment_src_range_pong.duration()); - break; - } - } - } - } - } -} - -static void fill_scene_timeline(const GreasePencilTimeModifierData &tmd, - const Scene &eval_scene, - const Map &frames, - const Span sorted_keys, - const FrameRange scene_dst_range, - Map &dst_frames) -{ - const TimeMapping mapping(tmd); - const auto mode = GreasePencilTimeModifierMode(tmd.mode); - const bool use_custom_range = tmd.flag & MOD_GREASE_PENCIL_TIME_CUSTOM_RANGE; - - const FrameRange scene_range = FrameRange{eval_scene.r.sfra, eval_scene.r.efra}; - const FrameRange custom_range = use_custom_range ? FrameRange{tmd.sfra, tmd.efra} : scene_range; - - switch (mode) { - case MOD_GREASE_PENCIL_TIME_MODE_NORMAL: - fill_scene_range_forward( - tmd, frames, sorted_keys, custom_range, scene_dst_range, dst_frames); - break; - case MOD_GREASE_PENCIL_TIME_MODE_REVERSE: - fill_scene_range_reverse( - tmd, frames, sorted_keys, custom_range, scene_dst_range, dst_frames); - break; - case MOD_GREASE_PENCIL_TIME_MODE_FIX: - fill_scene_range_fixed(tmd, frames, sorted_keys, tmd.offset, scene_dst_range, dst_frames); - break; - case MOD_GREASE_PENCIL_TIME_MODE_PINGPONG: - fill_scene_range_ping_pong( - tmd, frames, sorted_keys, custom_range, scene_dst_range, dst_frames); - break; - case MOD_GREASE_PENCIL_TIME_MODE_CHAIN: - fill_scene_range_chain( - tmd, frames, sorted_keys, tmd.segments(), scene_range, scene_dst_range, dst_frames); - break; - } -} - -static void modify_geometry_set(ModifierData *md, - const ModifierEvalContext *ctx, - bke::GeometrySet *geometry_set) -{ - using bke::greasepencil::Drawing; - using bke::greasepencil::Layer; - - auto *tmd = reinterpret_cast(md); - const Scene *scene = DEG_get_evaluated_scene(ctx->depsgraph); - /* Just include the current frame for now. The method can be applied to arbitrary ranges. */ - const FrameRange dst_keyframe_range = {scene->r.cfra, scene->r.cfra}; - - if (!geometry_set->has_grease_pencil()) { - return; - } - GreasePencil &grease_pencil = *geometry_set->get_grease_pencil_for_write(); - - IndexMaskMemory mask_memory; - const IndexMask layer_mask = modifier::greasepencil::get_filtered_layer_mask( - grease_pencil, tmd->influence, mask_memory); - - const Span layers_for_write = grease_pencil.layers_for_write(); - layer_mask.foreach_index([&](const int64_t layer_i) { - Layer &layer = *layers_for_write[layer_i]; - const Span sorted_keys = layer.sorted_keys(); - const Map &src_frames = layer.frames(); - - Map new_frames; - fill_scene_timeline(*tmd, *scene, src_frames, sorted_keys, dst_keyframe_range, new_frames); - layer.frames_for_write() = std::move(new_frames); - layer.tag_frames_map_keys_changed(); - }); -} - -static void panel_draw(const bContext *C, Panel *panel) -{ - uiLayout *layout = panel->layout; - - PointerRNA ob_ptr; - PointerRNA *ptr = modifier_panel_get_property_pointers(panel, &ob_ptr); - auto *tmd = static_cast(ptr->data); - const auto mode = GreasePencilTimeModifierMode(RNA_enum_get(ptr, "mode")); - const bool use_fixed_offset = (mode == MOD_GREASE_PENCIL_TIME_MODE_FIX); - const bool use_custom_range = !ELEM( - mode, MOD_GREASE_PENCIL_TIME_MODE_FIX, MOD_GREASE_PENCIL_TIME_MODE_CHAIN); - uiLayout *row, *col; - - uiLayoutSetPropSep(layout, true); - - uiItemR(layout, ptr, "mode", UI_ITEM_NONE, nullptr, ICON_NONE); - - col = uiLayoutColumn(layout, false); - - const char *text = use_fixed_offset ? IFACE_("Frame") : IFACE_("Frame Offset"); - uiItemR(col, ptr, "offset", UI_ITEM_NONE, text, ICON_NONE); - - row = uiLayoutRow(col, false); - uiLayoutSetActive(row, !use_fixed_offset); - uiItemR(row, ptr, "frame_scale", UI_ITEM_NONE, IFACE_("Scale"), ICON_NONE); - - row = uiLayoutRow(layout, false); - uiLayoutSetActive(row, !use_fixed_offset); - uiItemR(row, ptr, "use_keep_loop", UI_ITEM_NONE, nullptr, ICON_NONE); - - if (mode == MOD_GREASE_PENCIL_TIME_MODE_CHAIN) { - row = uiLayoutRow(layout, false); - uiLayoutSetPropSep(row, false); - - uiTemplateList(row, - (bContext *)C, - "MOD_UL_grease_pencil_time_modifier_segments", - "", - ptr, - "segments", - ptr, - "segment_active_index", - nullptr, - 3, - 10, - 0, - 1, - UI_TEMPLATE_LIST_FLAG_NONE); - - col = uiLayoutColumn(row, false); - - uiLayout *sub = uiLayoutColumn(col, true); - uiItemO(sub, "", ICON_ADD, "OBJECT_OT_grease_pencil_time_modifier_segment_add"); - uiItemO(sub, "", ICON_REMOVE, "OBJECT_OT_grease_pencil_time_modifier_segment_remove"); - uiItemS(col); - sub = uiLayoutColumn(col, true); - uiItemEnumO_string( - sub, "", ICON_TRIA_UP, "OBJECT_OT_grease_pencil_time_modifier_segment_move", "type", "UP"); - uiItemEnumO_string(sub, - "", - ICON_TRIA_DOWN, - "OBJECT_OT_grease_pencil_time_modifier_segment_move", - "type", - "DOWN"); - - if (tmd->segments().index_range().contains(tmd->segment_active_index)) { - PointerRNA segment_ptr = RNA_pointer_create(ptr->owner_id, - &RNA_GreasePencilTimeModifierSegment, - &tmd->segments()[tmd->segment_active_index]); - - sub = uiLayoutColumn(layout, true); - uiItemR(sub, &segment_ptr, "segment_mode", UI_ITEM_NONE, nullptr, ICON_NONE); - sub = uiLayoutColumn(layout, true); - uiItemR(sub, &segment_ptr, "segment_start", UI_ITEM_NONE, nullptr, ICON_NONE); - uiItemR(sub, &segment_ptr, "segment_end", UI_ITEM_NONE, nullptr, ICON_NONE); - uiItemR(sub, &segment_ptr, "segment_repeat", UI_ITEM_NONE, nullptr, ICON_NONE); - } - } - - PanelLayout custom_range_panel_layout = uiLayoutPanelProp( - C, layout, ptr, "open_custom_range_panel"); - if (uiLayout *header = custom_range_panel_layout.header) { - uiLayoutSetPropSep(header, false); - uiLayoutSetActive(header, use_custom_range); - uiItemR(header, ptr, "use_custom_frame_range", UI_ITEM_NONE, nullptr, ICON_NONE); - } - if (uiLayout *body = custom_range_panel_layout.body) { - uiLayoutSetPropSep(body, true); - uiLayoutSetActive(body, use_custom_range && RNA_boolean_get(ptr, "use_custom_frame_range")); - - col = uiLayoutColumn(body, true); - uiItemR(col, ptr, "frame_start", UI_ITEM_NONE, IFACE_("Frame Start"), ICON_NONE); - uiItemR(col, ptr, "frame_end", UI_ITEM_NONE, IFACE_("End"), ICON_NONE); - } - - if (uiLayout *influence_panel = uiLayoutPanelProp( - C, layout, ptr, "open_influence_panel", "Influence")) - { - modifier::greasepencil::draw_layer_filter_settings(C, influence_panel, ptr); - } - - modifier_panel_end(layout, ptr); -} - -static void segment_list_item_draw(uiList * /*ui_list*/, - const bContext * /*C*/, - uiLayout *layout, - PointerRNA * /*idataptr*/, - PointerRNA *itemptr, - int /*icon*/, - PointerRNA * /*active_dataptr*/, - const char * /*active_propname*/, - int /*index*/, - int /*flt_flag*/) -{ - uiLayout *row = uiLayoutRow(layout, true); - uiItemR(row, itemptr, "name", UI_ITEM_R_NO_BG, "", ICON_NONE); -} - -static void panel_register(ARegionType *region_type) -{ - modifier_panel_register(region_type, eModifierType_GreasePencilTime, panel_draw); - - uiListType *list_type = static_cast( - MEM_callocN(sizeof(uiListType), "Grease Pencil Time modifier segments")); - STRNCPY(list_type->idname, "MOD_UL_grease_pencil_time_modifier_segments"); - list_type->draw_item = segment_list_item_draw; - WM_uilisttype_add(list_type); -} - -static void blend_write(BlendWriter *writer, const ID * /*id_owner*/, const ModifierData *md) -{ - const auto *tmd = reinterpret_cast(md); - - BLO_write_struct(writer, GreasePencilTimeModifierData, tmd); - modifier::greasepencil::write_influence_data(writer, &tmd->influence); - - BLO_write_struct_array( - writer, GreasePencilTimeModifierSegment, tmd->segments_num, tmd->segments_array); -} - -static void blend_read(BlendDataReader *reader, ModifierData *md) -{ - auto *tmd = reinterpret_cast(md); - - modifier::greasepencil::read_influence_data(reader, &tmd->influence); - - BLO_read_data_address(reader, &tmd->segments_array); -} - -} // namespace blender - -ModifierTypeInfo modifierType_GreasePencilTime = { - /*idname*/ "GreasePencilTime", - /*name*/ N_("TimeOffset"), - /*struct_name*/ "GreasePencilTimeModifierData", - /*struct_size*/ sizeof(GreasePencilTimeModifierData), - /*srna*/ &RNA_GreasePencilTimeModifier, - /*type*/ ModifierTypeType::Nonconstructive, - /*flags*/ eModifierTypeFlag_AcceptsGreasePencil | eModifierTypeFlag_SupportsEditmode | - eModifierTypeFlag_EnableInEditmode | eModifierTypeFlag_SupportsMapping, - /*icon*/ ICON_MOD_TIME, - - /*copy_data*/ blender::copy_data, - - /*deform_verts*/ nullptr, - /*deform_matrices*/ nullptr, - /*deform_verts_EM*/ nullptr, - /*deform_matrices_EM*/ nullptr, - /*modify_mesh*/ nullptr, - /*modify_geometry_set*/ blender::modify_geometry_set, - - /*init_data*/ blender::init_data, - /*required_data_mask*/ nullptr, - /*free_data*/ blender::free_data, - /*is_disabled*/ nullptr, - /*update_depsgraph*/ nullptr, - /*depends_on_time*/ nullptr, - /*depends_on_normals*/ nullptr, - /*foreach_ID_link*/ blender::foreach_ID_link, - /*foreach_tex_link*/ nullptr, - /*free_runtime_data*/ nullptr, - /*panel_register*/ blender::panel_register, - /*blend_write*/ blender::blend_write, - /*blend_read*/ blender::blend_read, -}; - -blender::Span GreasePencilTimeModifierData::segments() const -{ - return {this->segments_array, this->segments_num}; -} - -blender::MutableSpan GreasePencilTimeModifierData::segments() -{ - return {this->segments_array, this->segments_num}; -} diff --git a/source/blender/modifiers/intern/MOD_grease_pencil_tint.cc b/source/blender/modifiers/intern/MOD_grease_pencil_tint.cc index 70d13bfcd9a..6dd6205bb0d 100644 --- a/source/blender/modifiers/intern/MOD_grease_pencil_tint.cc +++ b/source/blender/modifiers/intern/MOD_grease_pencil_tint.cc @@ -31,7 +31,7 @@ #include "UI_interface.hh" #include "UI_resources.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "WM_types.hh" @@ -217,7 +217,8 @@ static void modify_stroke_color(Object &ob, const OffsetIndices points_by_curve = curves.points_by_curve(); const Span positions = curves.positions(); /* Transforms points to the gradient object space. */ - const float4x4 matrix = tmd.object->world_to_object() * ob.object_to_world(); + const float4x4 matrix = float4x4_view(tmd.object->world_to_object) * + float4x4_view(ob.object_to_world); curves_mask.foreach_index(GrainSize(512), [&](const int64_t curve_i) { const ColorGeometry4f material_color = get_material_color(curve_i); @@ -296,7 +297,8 @@ static void modify_fill_color(Object &ob, const OffsetIndices points_by_curve = curves.points_by_curve(); const Span positions = curves.positions(); /* Transforms points to the gradient object space. */ - const float4x4 matrix = tmd.object->world_to_object() * ob.object_to_world(); + const float4x4 matrix = float4x4_view(tmd.object->world_to_object) * + float4x4_view(ob.object_to_world); curves_mask.foreach_index(GrainSize(512), [&](int64_t curve_i) { const ColorGeometry4f material_color = get_material_color(curve_i); diff --git a/source/blender/modifiers/intern/MOD_grease_pencil_util.cc b/source/blender/modifiers/intern/MOD_grease_pencil_util.cc index 98aec2227ef..337e492a628 100644 --- a/source/blender/modifiers/intern/MOD_grease_pencil_util.cc +++ b/source/blender/modifiers/intern/MOD_grease_pencil_util.cc @@ -23,6 +23,12 @@ #include "BLO_read_write.hh" +#include "DNA_defaults.h" + +#include "DEG_depsgraph_query.hh" + +#include "MOD_ui_common.hh" + #include "RNA_access.hh" #include "RNA_prototypes.h" @@ -204,7 +210,7 @@ static IndexMask get_filtered_layer_mask(const GreasePencil &grease_pencil, bke::AttributeAccessor layer_attributes = grease_pencil.attributes(); const Span layers = grease_pencil.layers(); const VArray layer_passes = - layer_attributes.lookup_or_default("pass_index", bke::AttrDomain::Layer, 0).varray; + layer_attributes.lookup_or_default("pass", bke::AttrDomain::Layer, 0).varray; IndexMask result = IndexMask::from_predicate( full_mask, GrainSize(4096), memory, [&](const int64_t layer_i) { diff --git a/source/blender/modifiers/intern/MOD_grease_pencil_weight_angle.cc b/source/blender/modifiers/intern/MOD_grease_pencil_weight_angle.cc deleted file mode 100644 index ccdd6e6fc8b..00000000000 --- a/source/blender/modifiers/intern/MOD_grease_pencil_weight_angle.cc +++ /dev/null @@ -1,310 +0,0 @@ -/* SPDX-FileCopyrightText: 2005 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup modifiers - */ - -#include "BLI_index_mask.hh" -#include "BLI_math_rotation.hh" -#include "BLI_string.h" /* For #STRNCPY. */ - -#include "BLT_translation.hh" - -#include "BLO_read_write.hh" - -#include "DNA_defaults.h" -#include "DNA_modifier_types.h" -#include "DNA_screen_types.h" - -#include "RNA_access.hh" - -#include "BKE_curves.hh" -#include "BKE_geometry_set.hh" -#include "BKE_grease_pencil.hh" -#include "BKE_lib_query.hh" -#include "BKE_modifier.hh" - -#include "UI_interface.hh" -#include "UI_resources.hh" - -#include "MOD_grease_pencil_util.hh" -#include "MOD_modifiertypes.hh" -#include "MOD_ui_common.hh" - -#include "RNA_prototypes.h" - -namespace blender { - -static void init_data(ModifierData *md) -{ - GreasePencilWeightAngleModifierData *gpmd = - reinterpret_cast(md); - - BLI_assert(MEMCMP_STRUCT_AFTER_IS_ZERO(gpmd, modifier)); - - MEMCPY_STRUCT_AFTER(gpmd, DNA_struct_default_get(GreasePencilWeightAngleModifierData), modifier); - modifier::greasepencil::init_influence_data(&gpmd->influence, false); -} - -static void copy_data(const ModifierData *md, ModifierData *target, const int flag) -{ - const GreasePencilWeightAngleModifierData *gmd = - reinterpret_cast(md); - GreasePencilWeightAngleModifierData *tgmd = - reinterpret_cast(target); - - BKE_modifier_copydata_generic(md, target, flag); - modifier::greasepencil::copy_influence_data(&gmd->influence, &tgmd->influence, flag); -} - -static void free_data(ModifierData *md) -{ - GreasePencilWeightAngleModifierData *mmd = - reinterpret_cast(md); - - modifier::greasepencil::free_influence_data(&mmd->influence); -} - -static bool is_disabled(const Scene * /*scene*/, ModifierData *md, bool /*use_render_params*/) -{ - GreasePencilWeightAngleModifierData *mmd = (GreasePencilWeightAngleModifierData *)md; - - return (mmd->target_vgname[0] == '\0'); -} - -static void foreach_ID_link(ModifierData *md, Object *ob, IDWalkFunc walk, void *user_data) -{ - GreasePencilWeightAngleModifierData *mmd = - reinterpret_cast(md); - - modifier::greasepencil::foreach_influence_ID_link(&mmd->influence, ob, walk, user_data); -} - -static void blend_write(BlendWriter *writer, const ID * /*id_owner*/, const ModifierData *md) -{ - const GreasePencilWeightAngleModifierData *mmd = - reinterpret_cast(md); - - BLO_write_struct(writer, GreasePencilWeightAngleModifierData, mmd); - modifier::greasepencil::write_influence_data(writer, &mmd->influence); -} - -static void blend_read(BlendDataReader *reader, ModifierData *md) -{ - GreasePencilWeightAngleModifierData *mmd = - reinterpret_cast(md); - modifier::greasepencil::read_influence_data(reader, &mmd->influence); -} - -static int ensure_vertex_group(const StringRefNull name, ListBase &vertex_group_names) -{ - int def_nr = BLI_findstringindex( - &vertex_group_names, name.c_str(), offsetof(bDeformGroup, name)); - if (def_nr < 0) { - bDeformGroup *defgroup = MEM_cnew(__func__); - STRNCPY(defgroup->name, name.c_str()); - BLI_addtail(&vertex_group_names, defgroup); - def_nr = BLI_listbase_count(&vertex_group_names) - 1; - BLI_assert(def_nr >= 0); - } - return def_nr; -} - -static bool target_vertex_group_available(const StringRefNull name, - const ListBase &vertex_group_names) -{ - const int def_nr = BLI_findstringindex( - &vertex_group_names, name.c_str(), offsetof(bDeformGroup, name)); - if (def_nr < 0) { - return false; - } - return true; -} - -static void write_weights_for_drawing(const ModifierData &md, - const Object &ob, - bke::greasepencil::Drawing &drawing) -{ - const auto &mmd = reinterpret_cast(md); - bke::CurvesGeometry &curves = drawing.strokes_for_write(); - if (curves.points_num() == 0) { - return; - } - IndexMaskMemory memory; - const IndexMask strokes = modifier::greasepencil::get_filtered_stroke_mask( - &ob, curves, mmd.influence, memory); - if (strokes.is_empty()) { - return; - } - - /* Make sure that the target vertex group is added to this drawing so we can write to it. */ - ensure_vertex_group(mmd.target_vgname, curves.vertex_group_names); - - bke::MutableAttributeAccessor attributes = curves.attributes_for_write(); - bke::SpanAttributeWriter dst_weights = attributes.lookup_for_write_span( - mmd.target_vgname); - - BLI_assert(!dst_weights.span.is_empty()); - - const VArray input_weights = modifier::greasepencil::get_influence_vertex_weights( - curves, mmd.influence); - - /* Use default Z up. */ - const float3 z_up(0.0f, 0.0f, 1.0f); - float3 axis(0.0f); - axis[mmd.axis] = 1.0f; - float3 vec_ref; - /* Apply modifier rotation (sub 90 degrees for Y axis due Z-Up vector). */ - const float rot_angle = mmd.angle - ((mmd.axis == 1) ? M_PI_2 : 0.0f); - rotate_normalized_v3_v3v3fl(vec_ref, z_up, axis, rot_angle); - - const float3x3 obmat3x3(ob.object_to_world()); - - /* Apply the rotation of the object. */ - if (mmd.space == MOD_GREASE_PENCIL_WEIGHT_ANGLE_SPACE_LOCAL) { - vec_ref = math::transform_point(obmat3x3, vec_ref); - } - - const OffsetIndices points_by_curve = curves.points_by_curve(); - const Span positions = curves.positions(); - - strokes.foreach_index(GrainSize(512), [&](const int stroke) { - const IndexRange points = points_by_curve[stroke]; - if (points.size() == 1) { - dst_weights.span[points.start()] = 1.0f; - return; - } - for (const int point : points.drop_front(1)) { - const float3 p1 = math::transform_point(obmat3x3, positions[point]); - const float3 p2 = math::transform_point(obmat3x3, positions[point - 1]); - const float3 vec = p2 - p1; - const float angle = angle_on_axis_v3v3_v3(vec_ref, vec, axis); - float weight = 1.0f - math::sin(angle); - - if (mmd.flag & MOD_GREASE_PENCIL_WEIGHT_ANGLE_INVERT_OUTPUT) { - weight = 1.0f - weight; - } - - dst_weights.span[point] = (mmd.flag & MOD_GREASE_PENCIL_WEIGHT_ANGLE_MULTIPLY_DATA) ? - dst_weights.span[point] * weight : - weight; - dst_weights.span[point] = math::clamp(dst_weights.span[point], mmd.min_weight, 1.0f); - } - /* First point has the same weight as the second one. */ - dst_weights.span[points[0]] = dst_weights.span[points[1]]; - }); - - dst_weights.finish(); -} - -static void modify_geometry_set(ModifierData *md, - const ModifierEvalContext *ctx, - bke::GeometrySet *geometry_set) -{ - const GreasePencilWeightAngleModifierData *mmd = - reinterpret_cast(md); - - if (!geometry_set->has_grease_pencil()) { - return; - } - - GreasePencil &grease_pencil = *geometry_set->get_grease_pencil_for_write(); - - if (!target_vertex_group_available(mmd->target_vgname, grease_pencil.vertex_group_names)) { - return; - } - - const int current_frame = grease_pencil.runtime->eval_frame; - - IndexMaskMemory mask_memory; - const IndexMask layer_mask = modifier::greasepencil::get_filtered_layer_mask( - grease_pencil, mmd->influence, mask_memory); - const Vector drawings = - modifier::greasepencil::get_drawings_for_write(grease_pencil, layer_mask, current_frame); - - threading::parallel_for_each(drawings, [&](bke::greasepencil::Drawing *drawing) { - write_weights_for_drawing(*md, *ctx->object, *drawing); - }); -} - -static void panel_draw(const bContext *C, Panel *panel) -{ - uiLayout *row, *sub; - uiLayout *layout = panel->layout; - - PointerRNA ob_ptr; - PointerRNA *ptr = modifier_panel_get_property_pointers(panel, &ob_ptr); - - uiLayoutSetPropSep(layout, true); - - row = uiLayoutRow(layout, true); - uiItemPointerR(row, ptr, "target_vertex_group", &ob_ptr, "vertex_groups", nullptr, ICON_NONE); - - sub = uiLayoutRow(row, true); - bool has_output = RNA_string_length(ptr, "target_vertex_group") != 0; - uiLayoutSetPropDecorate(sub, false); - uiLayoutSetActive(sub, has_output); - uiItemR(sub, ptr, "use_invert_output", UI_ITEM_NONE, "", ICON_ARROW_LEFTRIGHT); - - uiItemR(layout, ptr, "angle", UI_ITEM_NONE, nullptr, ICON_NONE); - uiItemR(layout, ptr, "axis", UI_ITEM_NONE, nullptr, ICON_NONE); - uiItemR(layout, ptr, "space", UI_ITEM_NONE, nullptr, ICON_NONE); - - uiItemR(layout, ptr, "minimum_weight", UI_ITEM_NONE, nullptr, ICON_NONE); - uiItemR(layout, ptr, "use_multiply", UI_ITEM_NONE, nullptr, ICON_NONE); - - if (uiLayout *influence_panel = uiLayoutPanelProp( - C, layout, ptr, "open_influence_panel", "Influence")) - { - modifier::greasepencil::draw_layer_filter_settings(C, influence_panel, ptr); - modifier::greasepencil::draw_material_filter_settings(C, influence_panel, ptr); - modifier::greasepencil::draw_vertex_group_settings(C, influence_panel, ptr); - } - - modifier_panel_end(layout, ptr); -} - -static void panel_register(ARegionType *region_type) -{ - modifier_panel_register(region_type, eModifierType_GreasePencilWeightAngle, panel_draw); -} - -} // namespace blender - -ModifierTypeInfo modifierType_GreasePencilWeightAngle = { - /*idname*/ "GreasePencilWeightAngleModifier", - /*name*/ N_("Weight Angle"), - /*struct_name*/ "GreasePencilWeightAngleModifierData", - /*struct_size*/ sizeof(GreasePencilWeightAngleModifierData), - /*srna*/ &RNA_GreasePencilWeightAngleModifier, - /*type*/ ModifierTypeType::NonGeometrical, - /*flags*/ - eModifierTypeFlag_AcceptsGreasePencil | eModifierTypeFlag_SupportsEditmode | - eModifierTypeFlag_EnableInEditmode | eModifierTypeFlag_SupportsMapping, - /*icon*/ ICON_MOD_VERTEX_WEIGHT, - - /*copy_data*/ blender::copy_data, - - /*deform_verts*/ nullptr, - /*deform_matrices*/ nullptr, - /*deform_verts_EM*/ nullptr, - /*deform_matrices_EM*/ nullptr, - /*modify_mesh*/ nullptr, - /*modify_geometry_set*/ blender::modify_geometry_set, - - /*init_data*/ blender::init_data, - /*required_data_mask*/ nullptr, - /*free_data*/ blender::free_data, - /*is_disabled*/ blender::is_disabled, - /*update_depsgraph*/ nullptr, - /*depends_on_time*/ nullptr, - /*depends_on_normals*/ nullptr, - /*foreach_ID_link*/ blender::foreach_ID_link, - /*foreach_tex_link*/ nullptr, - /*free_runtime_data*/ nullptr, - /*panel_register*/ blender::panel_register, - /*blend_write*/ blender::blend_write, - /*blend_read*/ blender::blend_read, -}; diff --git a/source/blender/modifiers/intern/MOD_grease_pencil_weight_proximity.cc b/source/blender/modifiers/intern/MOD_grease_pencil_weight_proximity.cc deleted file mode 100644 index 6effa96b2f9..00000000000 --- a/source/blender/modifiers/intern/MOD_grease_pencil_weight_proximity.cc +++ /dev/null @@ -1,324 +0,0 @@ -/* SPDX-FileCopyrightText: 2005 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup modifiers - */ - -#include "BLI_index_mask.hh" -#include "BLI_math_matrix.hh" -#include "BLI_string.h" /* For #STRNCPY. */ - -#include "BLT_translation.hh" - -#include "BLO_read_write.hh" - -#include "DNA_defaults.h" -#include "DNA_modifier_types.h" -#include "DNA_screen_types.h" - -#include "RNA_access.hh" - -#include "BKE_curves.hh" -#include "BKE_geometry_set.hh" -#include "BKE_grease_pencil.hh" -#include "BKE_lib_query.hh" -#include "BKE_modifier.hh" - -#include "UI_interface.hh" -#include "UI_resources.hh" - -#include "MOD_grease_pencil_util.hh" -#include "MOD_modifiertypes.hh" -#include "MOD_ui_common.hh" - -#include "RNA_prototypes.h" - -namespace blender { - -static void init_data(ModifierData *md) -{ - auto *gpmd = reinterpret_cast(md); - - BLI_assert(MEMCMP_STRUCT_AFTER_IS_ZERO(gpmd, modifier)); - - MEMCPY_STRUCT_AFTER( - gpmd, DNA_struct_default_get(GreasePencilWeightProximityModifierData), modifier); - modifier::greasepencil::init_influence_data(&gpmd->influence, false); -} - -static void copy_data(const ModifierData *md, ModifierData *target, const int flag) -{ - const auto *gmd = reinterpret_cast(md); - auto *tgmd = reinterpret_cast(target); - - BKE_modifier_copydata_generic(md, target, flag); - modifier::greasepencil::copy_influence_data(&gmd->influence, &tgmd->influence, flag); -} - -static void free_data(ModifierData *md) -{ - auto *mmd = reinterpret_cast(md); - - modifier::greasepencil::free_influence_data(&mmd->influence); -} - -static bool is_disabled(const Scene * /*scene*/, ModifierData *md, bool /*use_render_params*/) -{ - auto *mmd = reinterpret_cast(md); - - return (mmd->target_vgname[0] == '\0' || mmd->object == nullptr); -} - -static void foreach_ID_link(ModifierData *md, Object *ob, IDWalkFunc walk, void *user_data) -{ - GreasePencilWeightProximityModifierData *mmd = - reinterpret_cast(md); - - modifier::greasepencil::foreach_influence_ID_link(&mmd->influence, ob, walk, user_data); - - walk(user_data, ob, (ID **)&mmd->object, IDWALK_CB_NOP); -} - -static void update_depsgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx) -{ - auto *mmd = reinterpret_cast(md); - if (mmd->object != nullptr) { - DEG_add_object_relation( - ctx->node, mmd->object, DEG_OB_COMP_TRANSFORM, "Grease Pencil Proximity Modifier"); - DEG_add_depends_on_transform_relation(ctx->node, "Grease Pencil Proximity Modifier"); - } -} - -static void blend_write(BlendWriter *writer, const ID * /*id_owner*/, const ModifierData *md) -{ - const GreasePencilWeightProximityModifierData *mmd = - reinterpret_cast(md); - - BLO_write_struct(writer, GreasePencilWeightProximityModifierData, mmd); - modifier::greasepencil::write_influence_data(writer, &mmd->influence); -} - -static void blend_read(BlendDataReader *reader, ModifierData *md) -{ - GreasePencilWeightProximityModifierData *mmd = - reinterpret_cast(md); - modifier::greasepencil::read_influence_data(reader, &mmd->influence); -} - -static float get_distance_factor(float3 target_pos, - const float4x4 &obmat, - float3 pos, - const float dist_min, - const float dist_max) -{ - const float3 gvert = math::transform_point(obmat, pos); - const float dist = math::distance(target_pos, gvert); - - if (dist > dist_max) { - return 1.0f; - } - if (dist <= dist_max && dist > dist_min) { - return 1.0f - ((dist_max - dist) / math::max((dist_max - dist_min), 0.0001f)); - } - return 0.0f; -} - -static int ensure_vertex_group(const StringRefNull name, ListBase &vertex_group_names) -{ - int def_nr = BLI_findstringindex( - &vertex_group_names, name.c_str(), offsetof(bDeformGroup, name)); - if (def_nr < 0) { - bDeformGroup *defgroup = MEM_cnew(__func__); - STRNCPY(defgroup->name, name.c_str()); - BLI_addtail(&vertex_group_names, defgroup); - def_nr = BLI_listbase_count(&vertex_group_names) - 1; - BLI_assert(def_nr >= 0); - } - return def_nr; -} - -static bool target_vertex_group_available(const StringRefNull name, - const ListBase &vertex_group_names) -{ - const int def_nr = BLI_findstringindex( - &vertex_group_names, name.c_str(), offsetof(bDeformGroup, name)); - if (def_nr < 0) { - return false; - } - return true; -} - -static void write_weights_for_drawing(const ModifierData &md, - const Object &ob, - bke::greasepencil::Drawing &drawing) -{ - const auto &mmd = reinterpret_cast(md); - bke::CurvesGeometry &curves = drawing.strokes_for_write(); - if (curves.points_num() == 0) { - return; - } - IndexMaskMemory memory; - const IndexMask strokes = modifier::greasepencil::get_filtered_stroke_mask( - &ob, curves, mmd.influence, memory); - if (strokes.is_empty()) { - return; - } - - /* Make sure that the target vertex group is added to this drawing so we can write to it. */ - ensure_vertex_group(mmd.target_vgname, curves.vertex_group_names); - - bke::MutableAttributeAccessor attributes = curves.attributes_for_write(); - bke::SpanAttributeWriter dst_weights = attributes.lookup_for_write_span( - mmd.target_vgname); - - BLI_assert(!dst_weights.span.is_empty()); - - const VArray vgroup_weights = modifier::greasepencil::get_influence_vertex_weights( - curves, mmd.influence); - - const Span positions = curves.positions(); - const float4x4 &obmat = ob.object_to_world(); - const float3 target_pos = mmd.object->object_to_world().location(); - const bool invert = (mmd.flag & MOD_GREASE_PENCIL_WEIGHT_PROXIMITY_INVERT_OUTPUT) != 0; - const bool do_multiply = (mmd.flag & MOD_GREASE_PENCIL_WEIGHT_PROXIMITY_MULTIPLY_DATA) != 0; - - threading::parallel_for(positions.index_range(), 1024, [&](const IndexRange range) { - for (const int point_i : range) { - const float weight = vgroup_weights[point_i]; - if (weight < 0.0f) { - continue; - } - - float dist_fac = get_distance_factor( - target_pos, obmat, positions[point_i], mmd.dist_start, mmd.dist_end); - - if (invert) { - dist_fac = 1.0f - dist_fac; - } - - dst_weights.span[point_i] = do_multiply ? dst_weights.span[point_i] * dist_fac : dist_fac; - - dst_weights.span[point_i] = math::clamp( - dst_weights.span[point_i], - /** Weight==0 will remove the point from the group, assign a sufficiently small value - * there to prevent the visual disconnect, and keep the behavior same as the old - * modifier. */ - math::max(mmd.min_weight, 1e-5f), - 1.0f); - } - }); - - dst_weights.finish(); -} - -static void modify_geometry_set(ModifierData *md, - const ModifierEvalContext *ctx, - bke::GeometrySet *geometry_set) -{ - const GreasePencilWeightProximityModifierData *mmd = - reinterpret_cast(md); - - if (!geometry_set->has_grease_pencil()) { - return; - } - - GreasePencil &grease_pencil = *geometry_set->get_grease_pencil_for_write(); - - if (!target_vertex_group_available(mmd->target_vgname, grease_pencil.vertex_group_names)) { - return; - } - - const int current_frame = grease_pencil.runtime->eval_frame; - - IndexMaskMemory mask_memory; - const IndexMask layer_mask = modifier::greasepencil::get_filtered_layer_mask( - grease_pencil, mmd->influence, mask_memory); - const Vector drawings = - modifier::greasepencil::get_drawings_for_write(grease_pencil, layer_mask, current_frame); - - threading::parallel_for_each(drawings, [&](bke::greasepencil::Drawing *drawing) { - write_weights_for_drawing(*md, *ctx->object, *drawing); - }); -} - -static void panel_draw(const bContext *C, Panel *panel) -{ - uiLayout *row, *sub; - uiLayout *layout = panel->layout; - - PointerRNA ob_ptr; - PointerRNA *ptr = modifier_panel_get_property_pointers(panel, &ob_ptr); - - uiLayoutSetPropSep(layout, true); - row = uiLayoutRow(layout, true); - uiItemPointerR(row, ptr, "target_vertex_group", &ob_ptr, "vertex_groups", nullptr, ICON_NONE); - sub = uiLayoutRow(row, true); - bool has_output = RNA_string_length(ptr, "target_vertex_group") != 0; - uiLayoutSetPropDecorate(sub, false); - uiLayoutSetActive(sub, has_output); - uiItemR(sub, ptr, "use_invert_output", UI_ITEM_NONE, "", ICON_ARROW_LEFTRIGHT); - - uiItemR(layout, ptr, "object", UI_ITEM_NONE, nullptr, ICON_NONE); - - sub = uiLayoutColumn(layout, true); - uiItemR(sub, ptr, "distance_start", UI_ITEM_NONE, nullptr, ICON_NONE); - uiItemR(sub, ptr, "distance_end", UI_ITEM_NONE, nullptr, ICON_NONE); - - uiItemR(layout, ptr, "minimum_weight", UI_ITEM_NONE, nullptr, ICON_NONE); - uiItemR(layout, ptr, "use_multiply", UI_ITEM_NONE, nullptr, ICON_NONE); - - if (uiLayout *influence_panel = uiLayoutPanelProp( - C, layout, ptr, "open_influence_panel", "Influence")) - { - modifier::greasepencil::draw_layer_filter_settings(C, influence_panel, ptr); - modifier::greasepencil::draw_material_filter_settings(C, influence_panel, ptr); - modifier::greasepencil::draw_vertex_group_settings(C, influence_panel, ptr); - } - - modifier_panel_end(layout, ptr); -} - -static void panel_register(ARegionType *region_type) -{ - modifier_panel_register(region_type, eModifierType_GreasePencilWeightProximity, panel_draw); -} - -} // namespace blender - -ModifierTypeInfo modifierType_GreasePencilWeightProximity = { - /*idname*/ "GreasePencilWeightProximityModifier", - /*name*/ N_("Weight Proximity"), - /*struct_name*/ "GreasePencilWeightProximityModifierData", - /*struct_size*/ sizeof(GreasePencilWeightProximityModifierData), - /*srna*/ &RNA_GreasePencilWeightProximityModifier, - /*type*/ ModifierTypeType::NonGeometrical, - /*flags*/ - eModifierTypeFlag_AcceptsGreasePencil | eModifierTypeFlag_SupportsEditmode | - eModifierTypeFlag_EnableInEditmode | eModifierTypeFlag_SupportsMapping, - /*icon*/ ICON_MOD_VERTEX_WEIGHT, - - /*copy_data*/ blender::copy_data, - - /*deform_verts*/ nullptr, - /*deform_matrices*/ nullptr, - /*deform_verts_EM*/ nullptr, - /*deform_matrices_EM*/ nullptr, - /*modify_mesh*/ nullptr, - /*modify_geometry_set*/ blender::modify_geometry_set, - - /*init_data*/ blender::init_data, - /*required_data_mask*/ nullptr, - /*free_data*/ blender::free_data, - /*is_disabled*/ blender::is_disabled, - /*update_depsgraph*/ blender::update_depsgraph, - /*depends_on_time*/ nullptr, - /*depends_on_normals*/ nullptr, - /*foreach_ID_link*/ blender::foreach_ID_link, - /*foreach_tex_link*/ nullptr, - /*free_runtime_data*/ nullptr, - /*panel_register*/ blender::panel_register, - /*blend_write*/ blender::blend_write, - /*blend_read*/ blender::blend_read, -}; diff --git a/source/blender/modifiers/intern/MOD_hook.cc b/source/blender/modifiers/intern/MOD_hook.cc index 83d5a8f57ca..b1b4b2c72c8 100644 --- a/source/blender/modifiers/intern/MOD_hook.cc +++ b/source/blender/modifiers/intern/MOD_hook.cc @@ -12,7 +12,7 @@ #include "BLI_math_matrix.h" #include "BLI_math_vector.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_defaults.h" #include "DNA_mesh_types.h" @@ -22,12 +22,15 @@ #include "BKE_action.h" #include "BKE_colortools.hh" +#include "BKE_context.hh" #include "BKE_deform.hh" #include "BKE_editmesh.hh" +#include "BKE_lib_id.hh" #include "BKE_lib_query.hh" #include "BKE_mesh.hh" +#include "BKE_mesh_wrapper.hh" #include "BKE_modifier.hh" -#include "BKE_object_types.hh" +#include "BKE_screen.hh" #include "UI_interface.hh" #include "UI_resources.hh" @@ -37,6 +40,8 @@ #include "RNA_access.hh" #include "RNA_prototypes.h" +#include "DEG_depsgraph_query.hh" + #include "MEM_guardedalloc.h" #include "MOD_ui_common.hh" @@ -114,7 +119,7 @@ static void update_depsgraph(ModifierData *md, const ModifierUpdateDepsgraphCont } DEG_add_object_relation(ctx->node, hmd->object, DEG_OB_COMP_TRANSFORM, "Hook Modifier"); } - /* We need our own transformation as well. */ + /* We need own transformation as well. */ DEG_add_depends_on_transform_relation(ctx->node, "Hook Modifier"); } @@ -332,14 +337,14 @@ static void deformVerts_do(HookModifierData *hmd, /* get world-space matrix of target, corrected for the space the verts are in */ if (hmd->subtarget[0] && pchan) { /* bone target if there's a matching pose-channel */ - mul_m4_m4m4(dmat, ob_target->object_to_world().ptr(), pchan->pose_mat); + mul_m4_m4m4(dmat, ob_target->object_to_world, pchan->pose_mat); } else { /* just object target */ - copy_m4_m4(dmat, ob_target->object_to_world().ptr()); + copy_m4_m4(dmat, ob_target->object_to_world); } - invert_m4_m4(ob->runtime->world_to_object.ptr(), ob->object_to_world().ptr()); - mul_m4_series(hd.mat, ob->world_to_object().ptr(), dmat, hmd->parentinv); + invert_m4_m4(ob->world_to_object, ob->object_to_world); + mul_m4_series(hd.mat, ob->world_to_object, dmat, hmd->parentinv); /* --- done with 'hd' init --- */ /* Regarding index range checking below. diff --git a/source/blender/modifiers/intern/MOD_laplaciandeform.cc b/source/blender/modifiers/intern/MOD_laplaciandeform.cc index ec3257998d8..a219afe9aac 100644 --- a/source/blender/modifiers/intern/MOD_laplaciandeform.cc +++ b/source/blender/modifiers/intern/MOD_laplaciandeform.cc @@ -15,15 +15,23 @@ #include "MEM_guardedalloc.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_defaults.h" #include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" #include "DNA_screen_types.h" +#include "BKE_context.hh" #include "BKE_deform.hh" +#include "BKE_editmesh.hh" +#include "BKE_lib_id.hh" +#include "BKE_mesh.hh" #include "BKE_mesh_mapping.hh" +#include "BKE_mesh_runtime.hh" +#include "BKE_mesh_wrapper.hh" +#include "BKE_particle.h" +#include "BKE_screen.hh" #include "UI_interface.hh" #include "UI_resources.hh" diff --git a/source/blender/modifiers/intern/MOD_laplaciansmooth.cc b/source/blender/modifiers/intern/MOD_laplaciansmooth.cc index 1775ea7fc9f..fb56790beaa 100644 --- a/source/blender/modifiers/intern/MOD_laplaciansmooth.cc +++ b/source/blender/modifiers/intern/MOD_laplaciansmooth.cc @@ -9,21 +9,29 @@ #include "BLI_math_geom.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_defaults.h" #include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" +#include "DNA_object_types.h" #include "DNA_screen_types.h" #include "MEM_guardedalloc.h" +#include "BKE_context.hh" #include "BKE_deform.hh" +#include "BKE_editmesh.hh" +#include "BKE_lib_id.hh" +#include "BKE_mesh.hh" +#include "BKE_mesh_wrapper.hh" #include "BKE_modifier.hh" +#include "BKE_screen.hh" #include "UI_interface.hh" #include "UI_resources.hh" +#include "RNA_access.hh" #include "RNA_prototypes.h" #include "MOD_ui_common.hh" diff --git a/source/blender/modifiers/intern/MOD_lattice.cc b/source/blender/modifiers/intern/MOD_lattice.cc index 70eda8bd47e..d2a6b70c48d 100644 --- a/source/blender/modifiers/intern/MOD_lattice.cc +++ b/source/blender/modifiers/intern/MOD_lattice.cc @@ -10,22 +10,30 @@ #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_defaults.h" #include "DNA_object_types.h" #include "DNA_screen_types.h" +#include "BKE_context.hh" +#include "BKE_editmesh.hh" #include "BKE_lattice.hh" +#include "BKE_lib_id.hh" #include "BKE_lib_query.hh" #include "BKE_mesh.hh" +#include "BKE_mesh_wrapper.hh" #include "BKE_modifier.hh" +#include "BKE_screen.hh" #include "UI_interface.hh" #include "UI_resources.hh" +#include "RNA_access.hh" #include "RNA_prototypes.h" +#include "DEG_depsgraph_query.hh" + #include "MEM_guardedalloc.h" #include "MOD_ui_common.hh" diff --git a/source/blender/modifiers/intern/MOD_lineart.cc b/source/blender/modifiers/intern/MOD_lineart.cc deleted file mode 100644 index 0434c9f68d6..00000000000 --- a/source/blender/modifiers/intern/MOD_lineart.cc +++ /dev/null @@ -1,912 +0,0 @@ -/* SPDX-FileCopyrightText: 2005 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup modifiers - */ - -#include "BLT_translation.hh" - -#include "BLO_read_write.hh" - -#include "DNA_collection_types.h" -#include "DNA_defaults.h" -#include "DNA_gpencil_modifier_types.h" -#include "DNA_scene_types.h" - -#include "BKE_collection.hh" -#include "BKE_geometry_set.hh" -#include "BKE_global.hh" -#include "BKE_grease_pencil.hh" -#include "BKE_lib_query.hh" -#include "BKE_material.h" -#include "BKE_modifier.hh" - -#include "UI_interface.hh" -#include "UI_resources.hh" - -#include "MOD_gpencil_legacy_lineart.h" /* Needed for line art cache functions. */ -#include "MOD_grease_pencil_util.hh" -#include "MOD_lineart.h" -#include "MOD_modifiertypes.hh" -#include "MOD_ui_common.hh" - -#include "RNA_access.hh" -#include "RNA_prototypes.h" - -#include "DEG_depsgraph_query.hh" - -namespace blender { - -static void get_lineart_modifier_limits(const Object &ob, GreasePencilLineartLimitInfo &info) -{ - bool is_first = true; - LISTBASE_FOREACH (const ModifierData *, md, &ob.modifiers) { - if (md->type == eModifierType_GreasePencilLineart) { - const auto *lmd = reinterpret_cast(md); - if (is_first || (lmd->flags & MOD_LINEART_USE_CACHE)) { - info.min_level = std::min(info.min_level, lmd->level_start); - info.max_level = std::max( - info.max_level, lmd->use_multiple_levels ? lmd->level_end : lmd->level_start); - info.edge_types |= lmd->edge_types; - info.shadow_selection = std::max(info.shadow_selection, lmd->shadow_selection); - info.silhouette_selection = std::max(info.silhouette_selection, lmd->silhouette_selection); - is_first = false; - } - } - } -} - -static void set_lineart_modifier_limits(GreasePencilLineartModifierData &lmd, - const GreasePencilLineartLimitInfo &info, - const bool is_first_lineart) -{ - BLI_assert(lmd.modifier.type == eModifierType_GreasePencilLineart); - if (is_first_lineart || lmd.flags & MOD_LINEART_USE_CACHE) { - lmd.level_start_override = info.min_level; - lmd.level_end_override = info.max_level; - lmd.edge_types_override = info.edge_types; - lmd.shadow_selection_override = info.shadow_selection; - lmd.shadow_use_silhouette_override = info.silhouette_selection; - } - else { - lmd.level_start_override = lmd.level_start; - lmd.level_end_override = lmd.level_end; - lmd.edge_types_override = lmd.edge_types; - lmd.shadow_selection_override = lmd.shadow_selection; - lmd.shadow_use_silhouette_override = lmd.silhouette_selection; - } -} - -static bool is_first_lineart(const GreasePencilLineartModifierData &md) -{ - if (md.modifier.type != eModifierType_GreasePencilLineart) { - return false; - } - ModifierData *imd = md.modifier.prev; - while (imd != nullptr) { - if (imd->type == eModifierType_GreasePencilLineart) { - return false; - } - imd = imd->prev; - } - return true; -} - -static bool is_last_line_art(const GreasePencilLineartModifierData &md) -{ - if (md.modifier.type != eModifierType_GreasePencilLineart) { - return false; - } - ModifierData *imd = md.modifier.next; - while (imd != nullptr) { - if (imd->type == eModifierType_GreasePencilLineart) { - return false; - } - imd = imd->next; - } - return true; -} - -static GreasePencilLineartModifierData *get_first_lineart_modifier(const Object &ob) -{ - LISTBASE_FOREACH (ModifierData *, i_md, &ob.modifiers) { - if (i_md->type == eModifierType_GreasePencilLineart) { - return reinterpret_cast(i_md); - } - } - return nullptr; -} - -static void init_data(ModifierData *md) -{ - GreasePencilLineartModifierData *gpmd = (GreasePencilLineartModifierData *)md; - - BLI_assert(MEMCMP_STRUCT_AFTER_IS_ZERO(gpmd, modifier)); - - MEMCPY_STRUCT_AFTER(gpmd, DNA_struct_default_get(GreasePencilLineartModifierData), modifier); -} - -static void copy_data(const ModifierData *md, ModifierData *target, const int flag) -{ - BKE_modifier_copydata_generic(md, target, flag); -} - -static bool is_disabled(const Scene * /*scene*/, ModifierData *md, bool /*use_render_params*/) -{ - GreasePencilLineartModifierData *lmd = (GreasePencilLineartModifierData *)md; - - if (lmd->target_layer[0] == '\0' || !lmd->target_material) { - return true; - } - if (lmd->source_type == LINEART_SOURCE_OBJECT && !lmd->source_object) { - return true; - } - if (lmd->source_type == LINEART_SOURCE_COLLECTION && !lmd->source_collection) { - return true; - } - /* Preventing calculation in depsgraph when baking frames. */ - if (lmd->flags & MOD_LINEART_IS_BAKED) { - return true; - } - - return false; -} - -static void add_this_collection(Collection &collection, - const ModifierUpdateDepsgraphContext *ctx, - const int mode) -{ - bool default_add = true; - /* Do not do nested collection usage check, this is consistent with lineart calculation, because - * collection usage doesn't have a INHERIT mode. This might initially be derived from the fact - * that an object can be inside multiple collections, but might be irrelevant now with the way - * objects are iterated. Keep this logic for now. */ - if (collection.lineart_usage & COLLECTION_LRT_EXCLUDE) { - default_add = false; - } - FOREACH_COLLECTION_VISIBLE_OBJECT_RECURSIVE_BEGIN (&collection, ob, mode) { - if (ELEM(ob->type, OB_MESH, OB_MBALL, OB_CURVES_LEGACY, OB_SURF, OB_FONT)) { - if ((ob->lineart.usage == OBJECT_LRT_INHERIT && default_add) || - ob->lineart.usage != OBJECT_LRT_EXCLUDE) - { - DEG_add_object_relation(ctx->node, ob, DEG_OB_COMP_GEOMETRY, "Line Art Modifier"); - DEG_add_object_relation(ctx->node, ob, DEG_OB_COMP_TRANSFORM, "Line Art Modifier"); - } - } - if (ob->type == OB_EMPTY && (ob->transflag & OB_DUPLICOLLECTION)) { - if (!ob->instance_collection) { - continue; - } - add_this_collection(*ob->instance_collection, ctx, mode); - } - } - FOREACH_COLLECTION_VISIBLE_OBJECT_RECURSIVE_END; -} - -static void update_depsgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx) -{ - DEG_add_object_relation(ctx->node, ctx->object, DEG_OB_COMP_TRANSFORM, "Line Art Modifier"); - - GreasePencilLineartModifierData *lmd = (GreasePencilLineartModifierData *)md; - - /* Always add whole master collection because line art will need the whole scene for - * visibility computation. Line art exclusion is handled inside #add_this_collection. */ - - /* Do we need to distinguish DAG_EVAL_VIEWPORT or DAG_EVAL_RENDER here? */ - - add_this_collection(*ctx->scene->master_collection, ctx, DAG_EVAL_VIEWPORT); - - if (lmd->calculation_flags & MOD_LINEART_USE_CUSTOM_CAMERA && lmd->source_camera) { - DEG_add_object_relation( - ctx->node, lmd->source_camera, DEG_OB_COMP_TRANSFORM, "Line Art Modifier"); - DEG_add_object_relation( - ctx->node, lmd->source_camera, DEG_OB_COMP_PARAMETERS, "Line Art Modifier"); - } - else if (ctx->scene->camera) { - DEG_add_object_relation( - ctx->node, ctx->scene->camera, DEG_OB_COMP_TRANSFORM, "Line Art Modifier"); - DEG_add_object_relation( - ctx->node, ctx->scene->camera, DEG_OB_COMP_PARAMETERS, "Line Art Modifier"); - } - if (lmd->light_contour_object) { - DEG_add_object_relation( - ctx->node, lmd->light_contour_object, DEG_OB_COMP_TRANSFORM, "Line Art Modifier"); - } -} - -static void foreach_ID_link(ModifierData *md, Object *ob, IDWalkFunc walk, void *user_data) -{ - GreasePencilLineartModifierData *lmd = (GreasePencilLineartModifierData *)md; - - walk(user_data, ob, (ID **)&lmd->source_collection, IDWALK_CB_NOP); - - walk(user_data, ob, (ID **)&lmd->source_object, IDWALK_CB_NOP); - walk(user_data, ob, (ID **)&lmd->source_camera, IDWALK_CB_NOP); - walk(user_data, ob, (ID **)&lmd->light_contour_object, IDWALK_CB_NOP); -} - -static void panel_draw(const bContext * /*C*/, Panel *panel) -{ - uiLayout *layout = panel->layout; - - PointerRNA ob_ptr; - PointerRNA *ptr = modifier_panel_get_property_pointers(panel, &ob_ptr); - - PointerRNA obj_data_ptr = RNA_pointer_get(&ob_ptr, "data"); - - const int source_type = RNA_enum_get(ptr, "source_type"); - const bool is_baked = RNA_boolean_get(ptr, "is_baked"); - - uiLayoutSetPropSep(layout, true); - uiLayoutSetEnabled(layout, !is_baked); - - if (!is_first_lineart(*static_cast(ptr->data))) { - uiItemR(layout, ptr, "use_cache", UI_ITEM_NONE, nullptr, ICON_NONE); - } - - uiItemR(layout, ptr, "source_type", UI_ITEM_NONE, nullptr, ICON_NONE); - - if (source_type == LINEART_SOURCE_OBJECT) { - uiItemR(layout, ptr, "source_object", UI_ITEM_NONE, nullptr, ICON_OBJECT_DATA); - } - else if (source_type == LINEART_SOURCE_COLLECTION) { - uiLayout *sub = uiLayoutRow(layout, true); - uiItemR(sub, ptr, "source_collection", UI_ITEM_NONE, nullptr, ICON_OUTLINER_COLLECTION); - uiItemR(sub, ptr, "use_invert_collection", UI_ITEM_NONE, "", ICON_ARROW_LEFTRIGHT); - } - else { - /* Source is Scene. */ - } - - uiLayout *col = uiLayoutColumn(layout, false); - uiItemPointerR(col, ptr, "target_layer", &obj_data_ptr, "layers", nullptr, ICON_GREASEPENCIL); - uiItemPointerR( - col, ptr, "target_material", &obj_data_ptr, "materials", nullptr, ICON_GREASEPENCIL); - - col = uiLayoutColumn(layout, false); - uiItemR(col, ptr, "thickness", UI_ITEM_R_SLIDER, IFACE_("Line Thickness"), ICON_NONE); - uiItemR(col, ptr, "opacity", UI_ITEM_R_SLIDER, nullptr, ICON_NONE); - - modifier_panel_end(layout, ptr); -} - -static void edge_types_panel_draw(const bContext * /*C*/, Panel *panel) -{ - uiLayout *layout = panel->layout; - PointerRNA ob_ptr; - PointerRNA *ptr = modifier_panel_get_property_pointers(panel, &ob_ptr); - - const bool is_baked = RNA_boolean_get(ptr, "is_baked"); - const bool use_cache = RNA_boolean_get(ptr, "use_cache"); - const bool is_first = is_first_lineart( - *static_cast(ptr->data)); - const bool has_light = RNA_pointer_get(ptr, "light_contour_object").data != nullptr; - - uiLayoutSetEnabled(layout, !is_baked); - - uiLayoutSetPropSep(layout, true); - - uiLayout *sub = uiLayoutRow(layout, false); - uiLayoutSetActive(sub, has_light); - uiItemR(sub, - ptr, - "shadow_region_filtering", - UI_ITEM_NONE, - IFACE_("Illumination Filtering"), - ICON_NONE); - - uiLayout *col = uiLayoutColumn(layout, true); - - sub = uiLayoutRowWithHeading(col, false, IFACE_("Create")); - uiItemR(sub, ptr, "use_contour", UI_ITEM_NONE, "", ICON_NONE); - - uiLayout *entry = uiLayoutRow(sub, true); - uiLayoutSetActive(entry, RNA_boolean_get(ptr, "use_contour")); - uiItemR(entry, ptr, "silhouette_filtering", UI_ITEM_NONE, "", ICON_NONE); - - const int silhouette_filtering = RNA_enum_get(ptr, "silhouette_filtering"); - if (silhouette_filtering != LINEART_SILHOUETTE_FILTER_NONE) { - uiItemR(entry, ptr, "use_invert_silhouette", UI_ITEM_NONE, "", ICON_ARROW_LEFTRIGHT); - } - - sub = uiLayoutRow(col, false); - if (use_cache && !is_first) { - uiItemR(sub, ptr, "use_crease", UI_ITEM_NONE, IFACE_("Crease (Angle Cached)"), ICON_NONE); - } - else { - uiItemR(sub, ptr, "use_crease", UI_ITEM_NONE, "", ICON_NONE); - uiItemR(sub, - ptr, - "crease_threshold", - UI_ITEM_R_SLIDER | UI_ITEM_R_FORCE_BLANK_DECORATE, - nullptr, - ICON_NONE); - } - - uiItemR(col, ptr, "use_intersection", UI_ITEM_NONE, IFACE_("Intersections"), ICON_NONE); - uiItemR(col, ptr, "use_material", UI_ITEM_NONE, IFACE_("Material Borders"), ICON_NONE); - uiItemR(col, ptr, "use_edge_mark", UI_ITEM_NONE, IFACE_("Edge Marks"), ICON_NONE); - uiItemR(col, ptr, "use_loose", UI_ITEM_NONE, IFACE_("Loose"), ICON_NONE); - - entry = uiLayoutColumn(col, false); - uiLayoutSetActive(entry, has_light); - - sub = uiLayoutRow(entry, false); - uiItemR(sub, ptr, "use_light_contour", UI_ITEM_NONE, IFACE_("Light Contour"), ICON_NONE); - - uiItemR(entry, - ptr, - "use_shadow", - UI_ITEM_NONE, - CTX_IFACE_(BLT_I18NCONTEXT_ID_GPENCIL, "Cast Shadow"), - ICON_NONE); - - uiItemL(layout, IFACE_("Options"), ICON_NONE); - - sub = uiLayoutColumn(layout, false); - if (use_cache && !is_first) { - uiItemL(sub, IFACE_("Type overlapping cached"), ICON_INFO); - } - else { - uiItemR(sub, - ptr, - "use_overlap_edge_type_support", - UI_ITEM_NONE, - IFACE_("Allow Overlapping Types"), - ICON_NONE); - } -} - -static void options_light_reference_draw(const bContext * /*C*/, Panel *panel) -{ - uiLayout *layout = panel->layout; - PointerRNA ob_ptr; - PointerRNA *ptr = modifier_panel_get_property_pointers(panel, &ob_ptr); - - const bool is_baked = RNA_boolean_get(ptr, "is_baked"); - const bool use_cache = RNA_boolean_get(ptr, "use_cache"); - const bool has_light = RNA_pointer_get(ptr, "light_contour_object").data != nullptr; - const bool is_first = is_first_lineart( - *static_cast(ptr->data)); - - uiLayoutSetPropSep(layout, true); - uiLayoutSetEnabled(layout, !is_baked); - - if (use_cache && !is_first) { - uiItemL(layout, "Cached from the first line art modifier.", ICON_INFO); - return; - } - - uiItemR(layout, ptr, "light_contour_object", UI_ITEM_NONE, nullptr, ICON_NONE); - - uiLayout *remaining = uiLayoutColumn(layout, false); - uiLayoutSetActive(remaining, has_light); - - uiItemR(remaining, ptr, "shadow_camera_size", UI_ITEM_NONE, nullptr, ICON_NONE); - - uiLayout *col = uiLayoutColumn(remaining, true); - uiItemR(col, ptr, "shadow_camera_near", UI_ITEM_NONE, IFACE_("Near"), ICON_NONE); - uiItemR(col, ptr, "shadow_camera_far", UI_ITEM_NONE, IFACE_("Far"), ICON_NONE); -} - -static void options_panel_draw(const bContext * /*C*/, Panel *panel) -{ - uiLayout *layout = panel->layout; - PointerRNA ob_ptr; - PointerRNA *ptr = modifier_panel_get_property_pointers(panel, &ob_ptr); - - const bool is_baked = RNA_boolean_get(ptr, "is_baked"); - const bool use_cache = RNA_boolean_get(ptr, "use_cache"); - const bool is_first = is_first_lineart( - *static_cast(ptr->data)); - - uiLayoutSetPropSep(layout, true); - uiLayoutSetEnabled(layout, !is_baked); - - if (use_cache && !is_first) { - uiItemL(layout, TIP_("Cached from the first line art modifier"), ICON_INFO); - return; - } - - uiLayout *row = uiLayoutRowWithHeading(layout, false, IFACE_("Custom Camera")); - uiItemR(row, ptr, "use_custom_camera", UI_ITEM_NONE, "", ICON_NONE); - uiLayout *subrow = uiLayoutRow(row, true); - uiLayoutSetActive(subrow, RNA_boolean_get(ptr, "use_custom_camera")); - uiLayoutSetPropSep(subrow, true); - uiItemR(subrow, ptr, "source_camera", UI_ITEM_NONE, "", ICON_OBJECT_DATA); - - uiLayout *col = uiLayoutColumn(layout, true); - - uiItemR(col, - ptr, - "use_edge_overlap", - UI_ITEM_NONE, - IFACE_("Overlapping Edges As Contour"), - ICON_NONE); - uiItemR(col, ptr, "use_object_instances", UI_ITEM_NONE, nullptr, ICON_NONE); - uiItemR(col, ptr, "use_clip_plane_boundaries", UI_ITEM_NONE, nullptr, ICON_NONE); - uiItemR(col, ptr, "use_crease_on_smooth", UI_ITEM_NONE, IFACE_("Crease On Smooth"), ICON_NONE); - uiItemR(col, ptr, "use_crease_on_sharp", UI_ITEM_NONE, IFACE_("Crease On Sharp"), ICON_NONE); - uiItemR(col, - ptr, - "use_back_face_culling", - UI_ITEM_NONE, - IFACE_("Force Backface Culling"), - ICON_NONE); -} - -static void occlusion_panel_draw(const bContext * /*C*/, Panel *panel) -{ - uiLayout *layout = panel->layout; - PointerRNA ob_ptr; - PointerRNA *ptr = modifier_panel_get_property_pointers(panel, &ob_ptr); - - const bool is_baked = RNA_boolean_get(ptr, "is_baked"); - - const bool use_multiple_levels = RNA_boolean_get(ptr, "use_multiple_levels"); - const bool show_in_front = RNA_boolean_get(&ob_ptr, "show_in_front"); - - uiLayoutSetPropSep(layout, true); - uiLayoutSetEnabled(layout, !is_baked); - - if (!show_in_front) { - uiItemL(layout, TIP_("Object is not in front"), ICON_INFO); - } - - layout = uiLayoutColumn(layout, false); - uiLayoutSetActive(layout, show_in_front); - - uiItemR(layout, ptr, "use_multiple_levels", UI_ITEM_NONE, IFACE_("Range"), ICON_NONE); - - if (use_multiple_levels) { - uiLayout *col = uiLayoutColumn(layout, true); - uiItemR(col, ptr, "level_start", UI_ITEM_NONE, nullptr, ICON_NONE); - uiItemR(col, ptr, "level_end", UI_ITEM_NONE, IFACE_("End"), ICON_NONE); - } - else { - uiItemR(layout, ptr, "level_start", UI_ITEM_NONE, IFACE_("Level"), ICON_NONE); - } -} - -static bool anything_showing_through(PointerRNA *ptr) -{ - const bool use_multiple_levels = RNA_boolean_get(ptr, "use_multiple_levels"); - const int level_start = RNA_int_get(ptr, "level_start"); - const int level_end = RNA_int_get(ptr, "level_end"); - if (use_multiple_levels) { - return std::max(level_start, level_end) > 0; - } - return level_start > 0; -} - -static void material_mask_panel_draw_header(const bContext * /*C*/, Panel *panel) -{ - uiLayout *layout = panel->layout; - PointerRNA ob_ptr; - PointerRNA *ptr = modifier_panel_get_property_pointers(panel, &ob_ptr); - - const bool is_baked = RNA_boolean_get(ptr, "is_baked"); - const bool show_in_front = RNA_boolean_get(&ob_ptr, "show_in_front"); - - uiLayoutSetEnabled(layout, !is_baked); - uiLayoutSetActive(layout, show_in_front && anything_showing_through(ptr)); - - uiItemR(layout, ptr, "use_material_mask", UI_ITEM_NONE, IFACE_("Material Mask"), ICON_NONE); -} - -static void material_mask_panel_draw(const bContext * /*C*/, Panel *panel) -{ - uiLayout *layout = panel->layout; - PointerRNA *ptr = modifier_panel_get_property_pointers(panel, nullptr); - - const bool is_baked = RNA_boolean_get(ptr, "is_baked"); - uiLayoutSetEnabled(layout, !is_baked); - uiLayoutSetActive(layout, anything_showing_through(ptr)); - - uiLayoutSetPropSep(layout, true); - - uiLayoutSetEnabled(layout, RNA_boolean_get(ptr, "use_material_mask")); - - uiLayout *col = uiLayoutColumn(layout, true); - uiLayout *sub = uiLayoutRowWithHeading(col, true, IFACE_("Masks")); - - PropertyRNA *prop = RNA_struct_find_property(ptr, "use_material_mask_bits"); - for (int i = 0; i < 8; i++) { - uiItemFullR(sub, ptr, prop, i, 0, UI_ITEM_R_TOGGLE, " ", ICON_NONE); - if (i == 3) { - sub = uiLayoutRow(col, true); - } - } - - uiItemR(layout, ptr, "use_material_mask_match", UI_ITEM_NONE, IFACE_("Exact Match"), ICON_NONE); -} - -static void intersection_panel_draw(const bContext * /*C*/, Panel *panel) -{ - uiLayout *layout = panel->layout; - PointerRNA *ptr = modifier_panel_get_property_pointers(panel, nullptr); - - const bool is_baked = RNA_boolean_get(ptr, "is_baked"); - uiLayoutSetEnabled(layout, !is_baked); - - uiLayoutSetPropSep(layout, true); - - uiLayoutSetActive(layout, RNA_boolean_get(ptr, "use_intersection")); - - uiLayout *col = uiLayoutColumn(layout, true); - uiLayout *sub = uiLayoutRowWithHeading(col, true, IFACE_("Collection Masks")); - - PropertyRNA *prop = RNA_struct_find_property(ptr, "use_intersection_mask"); - for (int i = 0; i < 8; i++) { - uiItemFullR(sub, ptr, prop, i, 0, UI_ITEM_R_TOGGLE, " ", ICON_NONE); - if (i == 3) { - sub = uiLayoutRow(col, true); - } - } - - uiItemR(layout, ptr, "use_intersection_match", UI_ITEM_NONE, IFACE_("Exact Match"), ICON_NONE); -} - -static void face_mark_panel_draw_header(const bContext * /*C*/, Panel *panel) -{ - uiLayout *layout = panel->layout; - PointerRNA ob_ptr; - PointerRNA *ptr = modifier_panel_get_property_pointers(panel, &ob_ptr); - - const bool is_baked = RNA_boolean_get(ptr, "is_baked"); - const bool use_cache = RNA_boolean_get(ptr, "use_cache"); - const bool is_first = is_first_lineart( - *static_cast(ptr->data)); - - if (!use_cache || is_first) { - uiLayoutSetEnabled(layout, !is_baked); - uiItemR(layout, ptr, "use_face_mark", UI_ITEM_NONE, IFACE_("Face Mark Filtering"), ICON_NONE); - } - else { - uiItemL(layout, IFACE_("Face Mark Filtering"), ICON_NONE); - } -} - -static void face_mark_panel_draw(const bContext * /*C*/, Panel *panel) -{ - uiLayout *layout = panel->layout; - PointerRNA ob_ptr; - PointerRNA *ptr = modifier_panel_get_property_pointers(panel, &ob_ptr); - - const bool is_baked = RNA_boolean_get(ptr, "is_baked"); - const bool use_mark = RNA_boolean_get(ptr, "use_face_mark"); - const bool use_cache = RNA_boolean_get(ptr, "use_cache"); - const bool is_first = is_first_lineart( - *static_cast(ptr->data)); - - uiLayoutSetEnabled(layout, !is_baked); - - if (use_cache && !is_first) { - uiItemL(layout, TIP_("Cached from the first line art modifier"), ICON_INFO); - return; - } - - uiLayoutSetPropSep(layout, true); - - uiLayoutSetActive(layout, use_mark); - - uiItemR(layout, ptr, "use_face_mark_invert", UI_ITEM_NONE, nullptr, ICON_NONE); - uiItemR(layout, ptr, "use_face_mark_boundaries", UI_ITEM_NONE, nullptr, ICON_NONE); - uiItemR(layout, ptr, "use_face_mark_keep_contour", UI_ITEM_NONE, nullptr, ICON_NONE); -} - -static void chaining_panel_draw(const bContext * /*C*/, Panel *panel) -{ - PointerRNA ob_ptr; - PointerRNA *ptr = modifier_panel_get_property_pointers(panel, &ob_ptr); - - uiLayout *layout = panel->layout; - - const bool is_baked = RNA_boolean_get(ptr, "is_baked"); - const bool use_cache = RNA_boolean_get(ptr, "use_cache"); - const bool is_first = is_first_lineart( - *static_cast(ptr->data)); - const bool is_geom = RNA_boolean_get(ptr, "use_geometry_space_chain"); - - uiLayoutSetPropSep(layout, true); - uiLayoutSetEnabled(layout, !is_baked); - - if (use_cache && !is_first) { - uiItemL(layout, TIP_("Cached from the first line art modifier"), ICON_INFO); - return; - } - - uiLayout *col = uiLayoutColumnWithHeading(layout, true, IFACE_("Chain")); - uiItemR(col, ptr, "use_fuzzy_intersections", UI_ITEM_NONE, nullptr, ICON_NONE); - uiItemR(col, ptr, "use_fuzzy_all", UI_ITEM_NONE, nullptr, ICON_NONE); - uiItemR(col, ptr, "use_loose_edge_chain", UI_ITEM_NONE, IFACE_("Loose Edges"), ICON_NONE); - uiItemR( - col, ptr, "use_loose_as_contour", UI_ITEM_NONE, IFACE_("Loose Edges As Contour"), ICON_NONE); - uiItemR(col, ptr, "use_detail_preserve", UI_ITEM_NONE, nullptr, ICON_NONE); - uiItemR(col, ptr, "use_geometry_space_chain", UI_ITEM_NONE, IFACE_("Geometry Space"), ICON_NONE); - - uiItemR(layout, - ptr, - "chaining_image_threshold", - UI_ITEM_NONE, - is_geom ? IFACE_("Geometry Threshold") : nullptr, - ICON_NONE); - - uiItemR(layout, ptr, "smooth_tolerance", UI_ITEM_R_SLIDER, nullptr, ICON_NONE); - uiItemR(layout, ptr, "split_angle", UI_ITEM_R_SLIDER, nullptr, ICON_NONE); -} - -static void vgroup_panel_draw(const bContext * /*C*/, Panel *panel) -{ - PointerRNA ob_ptr; - PointerRNA *ptr = modifier_panel_get_property_pointers(panel, &ob_ptr); - - uiLayout *layout = panel->layout; - - const bool is_baked = RNA_boolean_get(ptr, "is_baked"); - const bool use_cache = RNA_boolean_get(ptr, "use_cache"); - const bool is_first = is_first_lineart( - *static_cast(ptr->data)); - - uiLayoutSetPropSep(layout, true); - uiLayoutSetEnabled(layout, !is_baked); - - if (use_cache && !is_first) { - uiItemL(layout, TIP_("Cached from the first line art modifier"), ICON_INFO); - return; - } - - uiLayout *col = uiLayoutColumn(layout, true); - - uiLayout *row = uiLayoutRow(col, true); - - uiItemR( - row, ptr, "source_vertex_group", UI_ITEM_NONE, IFACE_("Filter Source"), ICON_GROUP_VERTEX); - uiItemR(row, ptr, "invert_source_vertex_group", UI_ITEM_R_TOGGLE, "", ICON_ARROW_LEFTRIGHT); - - uiItemR(col, ptr, "use_output_vertex_group_match_by_name", UI_ITEM_NONE, nullptr, ICON_NONE); - - uiItemPointerR(col, ptr, "vertex_group", &ob_ptr, "vertex_groups", IFACE_("Target"), ICON_NONE); -} - -static void bake_panel_draw(const bContext * /*C*/, Panel *panel) -{ - uiLayout *layout = panel->layout; - PointerRNA ob_ptr; - PointerRNA *ptr = modifier_panel_get_property_pointers(panel, &ob_ptr); - - const bool is_baked = RNA_boolean_get(ptr, "is_baked"); - - uiLayoutSetPropSep(layout, true); - - if (is_baked) { - uiLayout *col = uiLayoutColumn(layout, false); - uiLayoutSetPropSep(col, false); - uiItemL(col, TIP_("Modifier has baked data"), ICON_NONE); - uiItemR( - col, ptr, "is_baked", UI_ITEM_R_TOGGLE, IFACE_("Continue Without Clearing"), ICON_NONE); - } - - uiLayout *col = uiLayoutColumn(layout, false); - uiLayoutSetEnabled(col, !is_baked); - uiItemO(col, nullptr, ICON_NONE, "OBJECT_OT_lineart_bake_strokes"); - uiItemO(col, nullptr, ICON_NONE, "OBJECT_OT_lineart_bake_strokes_all"); - - col = uiLayoutColumn(layout, false); - uiItemO(col, nullptr, ICON_NONE, "OBJECT_OT_lineart_clear"); - uiItemO(col, nullptr, ICON_NONE, "OBJECT_OT_lineart_clear_all"); -} - -static void composition_panel_draw(const bContext * /*C*/, Panel *panel) -{ - PointerRNA ob_ptr; - PointerRNA *ptr = modifier_panel_get_property_pointers(panel, &ob_ptr); - - uiLayout *layout = panel->layout; - - const bool show_in_front = RNA_boolean_get(&ob_ptr, "show_in_front"); - - uiLayoutSetPropSep(layout, true); - - uiItemR(layout, ptr, "overscan", UI_ITEM_NONE, nullptr, ICON_NONE); - uiItemR(layout, ptr, "use_image_boundary_trimming", UI_ITEM_NONE, nullptr, ICON_NONE); - - if (show_in_front) { - uiItemL(layout, TIP_("Object is shown in front"), ICON_ERROR); - } - - uiLayout *col = uiLayoutColumn(layout, false); - uiLayoutSetActive(col, !show_in_front); - - uiItemR(col, ptr, "stroke_depth_offset", UI_ITEM_R_SLIDER, IFACE_("Depth Offset"), ICON_NONE); - uiItemR(col, - ptr, - "use_offset_towards_custom_camera", - UI_ITEM_NONE, - IFACE_("Towards Custom Camera"), - ICON_NONE); -} - -static void panel_register(ARegionType *region_type) -{ - PanelType *panel_type = modifier_panel_register( - region_type, eModifierType_GreasePencilLineart, panel_draw); - - modifier_subpanel_register( - region_type, "edge_types", "Edge Types", nullptr, edge_types_panel_draw, panel_type); - modifier_subpanel_register(region_type, - "light_reference", - "Light Reference", - nullptr, - options_light_reference_draw, - panel_type); - modifier_subpanel_register( - region_type, "geometry", "Geometry Processing", nullptr, options_panel_draw, panel_type); - PanelType *occlusion_panel = modifier_subpanel_register( - region_type, "occlusion", "Occlusion", nullptr, occlusion_panel_draw, panel_type); - modifier_subpanel_register(region_type, - "material_mask", - "", - material_mask_panel_draw_header, - material_mask_panel_draw, - occlusion_panel); - modifier_subpanel_register( - region_type, "intersection", "Intersection", nullptr, intersection_panel_draw, panel_type); - modifier_subpanel_register( - region_type, "face_mark", "", face_mark_panel_draw_header, face_mark_panel_draw, panel_type); - modifier_subpanel_register( - region_type, "chaining", "Chaining", nullptr, chaining_panel_draw, panel_type); - modifier_subpanel_register( - region_type, "vgroup", "Vertex Weight Transfer", nullptr, vgroup_panel_draw, panel_type); - modifier_subpanel_register( - region_type, "composition", "Composition", nullptr, composition_panel_draw, panel_type); - modifier_subpanel_register(region_type, "bake", "Bake", nullptr, bake_panel_draw, panel_type); -} - -static void generate_strokes(ModifierData &md, - const ModifierEvalContext &ctx, - GreasePencil &grease_pencil, - GreasePencilLineartModifierData &first_lineart) -{ - auto &lmd = reinterpret_cast(md); - - bke::greasepencil::TreeNode *node = grease_pencil.find_node_by_name(lmd.target_layer); - if (!node || !node->is_layer()) { - return; - } - - LineartCache *local_lc = first_lineart.shared_cache; - - if (!(lmd.flags & MOD_LINEART_USE_CACHE)) { - MOD_lineart_compute_feature_lines_v3( - ctx.depsgraph, lmd, &local_lc, !(ctx.object->dtx & OB_DRAW_IN_FRONT)); - MOD_lineart_destroy_render_data_v3(&lmd); - } - MOD_lineart_chain_clear_picked_flag(local_lc); - lmd.cache = local_lc; - - const int current_frame = grease_pencil.runtime->eval_frame; - - /* Ensure we have a frame in the selected layer to put line art result in. */ - bke::greasepencil::Layer &layer = node->as_layer(); - - bke::greasepencil::Drawing &drawing = [&]() -> bke::greasepencil::Drawing & { - if (bke::greasepencil::Drawing *drawing = grease_pencil.get_editable_drawing_at(layer, - current_frame)) - { - return *drawing; - } - grease_pencil.insert_blank_frame(layer, current_frame, 0, BEZT_KEYTYPE_KEYFRAME); - return *grease_pencil.get_editable_drawing_at(layer, current_frame); - }(); - - const float4x4 &mat = ctx.object->world_to_object(); - - MOD_lineart_gpencil_generate_v3( - lmd.cache, - mat, - ctx.depsgraph, - drawing, - lmd.source_type, - lmd.source_object, - lmd.source_collection, - lmd.level_start, - lmd.use_multiple_levels ? lmd.level_end : lmd.level_start, - lmd.target_material ? BKE_object_material_index_get(ctx.object, lmd.target_material) : 0, - lmd.edge_types, - lmd.mask_switches, - lmd.material_mask_bits, - lmd.intersection_mask, - float(lmd.thickness) / 1000.0f, - lmd.opacity, - lmd.shadow_selection, - lmd.silhouette_selection, - lmd.source_vertex_group, - lmd.vgname, - lmd.flags, - lmd.calculation_flags); - - if (!(lmd.flags & MOD_LINEART_USE_CACHE)) { - /* Clear local cache. */ - if (local_lc != first_lineart.shared_cache) { - MOD_lineart_clear_cache(&local_lc); - } - /* Restore the original cache pointer so the modifiers below still have access to the "global" - * cache. */ - lmd.cache = first_lineart.shared_cache; - } -} - -static void modify_geometry_set(ModifierData *md, - const ModifierEvalContext *ctx, - bke::GeometrySet *geometry_set) -{ - if (!geometry_set->has_grease_pencil()) { - return; - } - GreasePencil &grease_pencil = *geometry_set->get_grease_pencil_for_write(); - auto mmd = reinterpret_cast(md); - - GreasePencilLineartModifierData *first_lineart = get_first_lineart_modifier(*ctx->object); - BLI_assert(first_lineart); - - bool is_first_lineart = (mmd == first_lineart); - - if (is_first_lineart) { - mmd->shared_cache = MOD_lineart_init_cache(); - get_lineart_modifier_limits(*ctx->object, mmd->shared_cache->LimitInfo); - } - set_lineart_modifier_limits(*mmd, first_lineart->shared_cache->LimitInfo, is_first_lineart); - - generate_strokes(*md, *ctx, grease_pencil, *first_lineart); - - if (is_last_line_art(*mmd)) { - MOD_lineart_clear_cache(&first_lineart->shared_cache); - } - - DEG_id_tag_update(&grease_pencil.id, ID_RECALC_GEOMETRY); -} - -static void blend_write(BlendWriter *writer, const ID * /*id_owner*/, const ModifierData *md) -{ - const auto *lmd = reinterpret_cast(md); - - BLO_write_struct(writer, GreasePencilLineartModifierData, lmd); -} -} // namespace blender - -ModifierTypeInfo modifierType_GreasePencilLineart = { - /*idname*/ "Lineart Modifier", - /*name*/ N_("Lineart"), - /*struct_name*/ "GreasePencilLineartModifierData", - /*struct_size*/ sizeof(GreasePencilLineartModifierData), - /*srna*/ &RNA_GreasePencilLineartModifier, - /*type*/ ModifierTypeType::Constructive, - /*flags*/ eModifierTypeFlag_AcceptsGreasePencil, - /*icon*/ ICON_MOD_LINEART, - - /*copy_data*/ blender::copy_data, - - /*deform_verts*/ nullptr, - /*deform_matrices*/ nullptr, - /*deform_verts_EM*/ nullptr, - /*deform_matrices_EM*/ nullptr, - /*modify_mesh*/ nullptr, - /*modify_geometry_set*/ blender::modify_geometry_set, - - /*init_data*/ blender::init_data, - /*required_data_mask*/ nullptr, - /*free_data*/ nullptr, - /*is_disabled*/ blender::is_disabled, - /*update_depsgraph*/ blender::update_depsgraph, - /*depends_on_time*/ nullptr, - /*depends_on_normals*/ nullptr, - /*foreach_ID_link*/ blender::foreach_ID_link, - /*foreach_tex_link*/ nullptr, - /*free_runtime_data*/ nullptr, - /*panel_register*/ blender::panel_register, - /*blend_write*/ blender::blend_write, - /*blend_read*/ nullptr, -}; diff --git a/source/blender/modifiers/intern/MOD_mask.cc b/source/blender/modifiers/intern/MOD_mask.cc index 5dbeae92eac..588822cf599 100644 --- a/source/blender/modifiers/intern/MOD_mask.cc +++ b/source/blender/modifiers/intern/MOD_mask.cc @@ -11,9 +11,10 @@ #include "BLI_utildefines.h" #include "BLI_array_utils.hh" +#include "BLI_ghash.h" #include "BLI_listbase.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_armature_types.h" #include "DNA_defaults.h" @@ -24,11 +25,13 @@ #include "DNA_screen_types.h" #include "BKE_action.h" /* BKE_pose_channel_find_name */ +#include "BKE_context.hh" #include "BKE_customdata.hh" #include "BKE_deform.hh" #include "BKE_lib_query.hh" #include "BKE_mesh.hh" #include "BKE_modifier.hh" +#include "BKE_screen.hh" #include "UI_interface.hh" #include "UI_resources.hh" @@ -37,7 +40,9 @@ #include "RNA_prototypes.h" #include "DEG_depsgraph_build.hh" +#include "DEG_depsgraph_query.hh" +#include "MOD_modifiertypes.hh" #include "MOD_ui_common.hh" #include "BLI_array.hh" diff --git a/source/blender/modifiers/intern/MOD_mesh_to_volume.cc b/source/blender/modifiers/intern/MOD_mesh_to_volume.cc index ff9011ead48..1dcc4d7f208 100644 --- a/source/blender/modifiers/intern/MOD_mesh_to_volume.cc +++ b/source/blender/modifiers/intern/MOD_mesh_to_volume.cc @@ -11,30 +11,39 @@ #include "BKE_geometry_set.hh" #include "BKE_lib_id.hh" #include "BKE_lib_query.hh" -#include "BKE_mesh.hh" +#include "BKE_mesh_runtime.hh" #include "BKE_mesh_wrapper.hh" #include "BKE_modifier.hh" +#include "BKE_object.hh" #include "BKE_volume.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_mesh_types.h" +#include "DNA_meshdata_types.h" #include "DNA_object_types.h" #include "DNA_screen_types.h" +#include "DNA_volume_types.h" + +#include "DEG_depsgraph.hh" #include "GEO_mesh_to_volume.hh" #include "UI_interface.hh" #include "UI_resources.hh" +#include "BLO_read_write.hh" + #include "MEM_guardedalloc.h" +#include "MOD_modifiertypes.hh" #include "MOD_ui_common.hh" #include "BLI_index_range.hh" #include "BLI_math_matrix_types.hh" #include "BLI_span.hh" +#include "RNA_access.hh" #include "RNA_prototypes.h" static void init_data(ModifierData *md) @@ -123,8 +132,8 @@ static Volume *mesh_to_volume(ModifierData *md, return input_volume; } - const float4x4 mesh_to_own_object_space_transform = ctx->object->world_to_object() * - object_to_convert->object_to_world(); + const float4x4 mesh_to_own_object_space_transform = float4x4(ctx->object->world_to_object) * + float4x4(object_to_convert->object_to_world); geometry::MeshToVolumeResolution resolution; resolution.mode = (MeshToVolumeModifierResolutionMode)mvmd->resolution_mode; if (resolution.mode == MESH_TO_VOLUME_RESOLUTION_MODE_VOXEL_AMOUNT) { @@ -159,9 +168,7 @@ static Volume *mesh_to_volume(ModifierData *md, /* Convert mesh to grid and add to volume. */ geometry::fog_volume_grid_add_from_mesh(volume, "density", - mesh->vert_positions(), - mesh->corner_verts(), - mesh->corner_tris(), + mesh, mesh_to_own_object_space_transform, voxel_size, mvmd->interior_band_width, diff --git a/source/blender/modifiers/intern/MOD_meshcache.cc b/source/blender/modifiers/intern/MOD_meshcache.cc index 85cce66ff3d..ef19f157b0a 100644 --- a/source/blender/modifiers/intern/MOD_meshcache.cc +++ b/source/blender/modifiers/intern/MOD_meshcache.cc @@ -16,7 +16,7 @@ #include "BLI_path_util.h" #include "BLI_string.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_defaults.h" #include "DNA_mesh_types.h" @@ -25,10 +25,14 @@ #include "DNA_scene_types.h" #include "DNA_screen_types.h" +#include "BKE_context.hh" #include "BKE_deform.hh" +#include "BKE_lib_id.hh" #include "BKE_main.hh" #include "BKE_mesh.hh" -#include "BKE_scene.hh" +#include "BKE_mesh_wrapper.hh" +#include "BKE_scene.h" +#include "BKE_screen.hh" #include "UI_interface.hh" #include "UI_resources.hh" diff --git a/source/blender/modifiers/intern/MOD_meshcache_mdd.cc b/source/blender/modifiers/intern/MOD_meshcache_mdd.cc index 14ccf5a9033..da81dae1180 100644 --- a/source/blender/modifiers/intern/MOD_meshcache_mdd.cc +++ b/source/blender/modifiers/intern/MOD_meshcache_mdd.cc @@ -22,7 +22,7 @@ # include "BLI_winstuff.h" #endif -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_modifier_types.h" diff --git a/source/blender/modifiers/intern/MOD_meshcache_pc2.cc b/source/blender/modifiers/intern/MOD_meshcache_pc2.cc index 03afbcb3497..4808489f19b 100644 --- a/source/blender/modifiers/intern/MOD_meshcache_pc2.cc +++ b/source/blender/modifiers/intern/MOD_meshcache_pc2.cc @@ -22,7 +22,7 @@ # include "BLI_winstuff.h" #endif -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_modifier_types.h" diff --git a/source/blender/modifiers/intern/MOD_meshdeform.cc b/source/blender/modifiers/intern/MOD_meshdeform.cc index 5ece3fbe4f6..92c7e6ad882 100644 --- a/source/blender/modifiers/intern/MOD_meshdeform.cc +++ b/source/blender/modifiers/intern/MOD_meshdeform.cc @@ -13,17 +13,25 @@ #include "BLI_simd.h" #include "BLI_task.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_defaults.h" +#include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" #include "DNA_object_types.h" +#include "DNA_scene_types.h" #include "DNA_screen_types.h" +#include "BKE_context.hh" #include "BKE_deform.hh" +#include "BKE_editmesh.hh" +#include "BKE_lib_id.hh" #include "BKE_lib_query.hh" +#include "BKE_mesh.hh" +#include "BKE_mesh_runtime.hh" #include "BKE_mesh_wrapper.hh" #include "BKE_modifier.hh" +#include "BKE_screen.hh" #include "UI_interface.hh" #include "UI_resources.hh" @@ -36,6 +44,7 @@ #include "MEM_guardedalloc.h" #include "DEG_depsgraph.hh" +#include "DEG_depsgraph_query.hh" #include "MOD_ui_common.hh" #include "MOD_util.hh" @@ -148,7 +157,7 @@ static void update_depsgraph(ModifierData *md, const ModifierUpdateDepsgraphCont DEG_add_object_relation(ctx->node, mmd->object, DEG_OB_COMP_TRANSFORM, "Mesh Deform Modifier"); DEG_add_object_relation(ctx->node, mmd->object, DEG_OB_COMP_GEOMETRY, "Mesh Deform Modifier"); } - /* We need our own transformation as well. */ + /* We need own transformation as well. */ DEG_add_depends_on_transform_relation(ctx->node, "Mesh Deform Modifier"); } @@ -349,8 +358,8 @@ static void meshdeformModifier_do(ModifierData *md, } /* compute matrices to go in and out of cage object space */ - invert_m4_m4(imat, ob_target->object_to_world().ptr()); - mul_m4_m4m4(cagemat, imat, ob->object_to_world().ptr()); + invert_m4_m4(imat, ob_target->object_to_world); + mul_m4_m4m4(cagemat, imat, ob->object_to_world); mul_m4_m4m4(cmat, mmd->bindmat, cagemat); invert_m4_m4(iobmat, cmat); copy_m3_m4(icagemat, iobmat); diff --git a/source/blender/modifiers/intern/MOD_meshsequencecache.cc b/source/blender/modifiers/intern/MOD_meshsequencecache.cc index 22a59daf24b..c99832cb041 100644 --- a/source/blender/modifiers/intern/MOD_meshsequencecache.cc +++ b/source/blender/modifiers/intern/MOD_meshsequencecache.cc @@ -13,7 +13,7 @@ #include "BLI_string.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_cachefile_types.h" #include "DNA_defaults.h" @@ -25,10 +25,13 @@ #include "MEM_guardedalloc.h" -#include "BKE_cachefile.hh" -#include "BKE_geometry_set.hh" +#include "BKE_cachefile.h" +#include "BKE_context.hh" #include "BKE_lib_query.hh" #include "BKE_mesh.hh" +#include "BKE_object.hh" +#include "BKE_scene.h" +#include "BKE_screen.hh" #include "UI_interface.hh" #include "UI_resources.hh" @@ -36,6 +39,8 @@ #include "RNA_access.hh" #include "RNA_prototypes.h" +#include "BLO_read_write.hh" + #include "DEG_depsgraph_build.hh" #include "DEG_depsgraph_query.hh" @@ -45,6 +50,7 @@ #include "MOD_ui_common.hh" #if defined(WITH_USD) || defined(WITH_ALEMBIC) +# include "BKE_global.h" # include "BKE_lib_id.hh" #endif @@ -56,7 +62,8 @@ # include "usd.hh" #endif -using namespace blender; +using blender::float3; +using blender::Span; static void init_data(ModifierData *md) { @@ -163,91 +170,6 @@ static Mesh *generate_bounding_box_mesh(const Mesh *org_mesh) #endif -static void modify_geometry_set(ModifierData *md, - const ModifierEvalContext *ctx, - bke::GeometrySet *geometry_set) -{ -#if defined(WITH_USD) || defined(WITH_ALEMBIC) - MeshSeqCacheModifierData *mcmd = reinterpret_cast(md); - - Scene *scene = DEG_get_evaluated_scene(ctx->depsgraph); - CacheFile *cache_file = mcmd->cache_file; - const float frame = DEG_get_ctime(ctx->depsgraph); - const float time = BKE_cachefile_time_offset(cache_file, frame, FPS); - const char *err_str = nullptr; - - if (!mcmd->reader || !STREQ(mcmd->reader_object_path, mcmd->object_path)) { - STRNCPY(mcmd->reader_object_path, mcmd->object_path); - BKE_cachefile_reader_open(cache_file, &mcmd->reader, ctx->object, mcmd->object_path); - if (!mcmd->reader) { - BKE_modifier_set_error( - ctx->object, md, "Could not create cache reader for file %s", cache_file->filepath); - return; - } - } - - if (geometry_set->has_mesh()) { - const Mesh *mesh = geometry_set->get_mesh(); - if (can_use_mesh_for_orco_evaluation(mcmd, ctx, mesh, time, &err_str)) { - return; - } - } - - /* Do not process data if using a render procedural, return a box instead for displaying in the - * viewport. */ - if (BKE_cache_file_uses_render_procedural(cache_file, scene)) { - const Mesh *org_mesh = nullptr; - if (geometry_set->has_mesh()) { - org_mesh = geometry_set->get_mesh(); - } - - Mesh *bbox = generate_bounding_box_mesh(org_mesh); - *geometry_set = bke::GeometrySet::from_mesh(bbox, bke::GeometryOwnershipType::Editable); - return; - } - - /* Time (in frames or seconds) between two velocity samples. Automatically computed to - * scale the velocity vectors at render time for generating proper motion blur data. */ - float velocity_scale = mcmd->velocity_scale; - if (mcmd->cache_file->velocity_unit == CACHEFILE_VELOCITY_UNIT_FRAME) { - velocity_scale *= FPS; - } - - switch (cache_file->type) { - case CACHEFILE_TYPE_ALEMBIC: { -# ifdef WITH_ALEMBIC - ABCReadParams params; - params.time = time; - params.read_flags = mcmd->read_flag; - params.velocity_name = mcmd->cache_file->velocity_name; - params.velocity_scale = velocity_scale; - ABC_read_geometry(mcmd->reader, ctx->object, *geometry_set, ¶ms, &err_str); -# endif - break; - } - case CACHEFILE_TYPE_USD: { -# ifdef WITH_USD - const blender::io::usd::USDMeshReadParams params = blender::io::usd::create_mesh_read_params( - time * FPS, mcmd->read_flag); - blender::io::usd::USD_read_geometry( - mcmd->reader, ctx->object, *geometry_set, params, &err_str); -# endif - break; - } - case CACHE_FILE_TYPE_INVALID: - break; - } - - if (err_str) { - BKE_modifier_set_error(ctx->object, md, "%s", err_str); - } - -#else - UNUSED_VARS(ctx, md, geometry_set); - return; -#endif -} - static Mesh *modify_mesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh) { #if defined(WITH_USD) || defined(WITH_ALEMBIC) @@ -296,7 +218,7 @@ static Mesh *modify_mesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh /* TODO(sybren+bastien): possibly check relevant custom data layers (UV/color depending on * flags) and duplicate those too. - * XXX(Hans): This probably isn't true anymore with various copy-on-eval improvements, etc. */ + * XXX(Hans): This probably isn't true anymore with various CoW improvements, etc. */ if ((me_positions.data() == mesh_positions.data()) || (me_edges.data() == mesh_edges.data()) || (me_faces.data() == mesh_faces.data())) { @@ -310,10 +232,43 @@ static Mesh *modify_mesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh } } - bke::GeometrySet geometry_set = bke::GeometrySet::from_mesh( - mesh, bke::GeometryOwnershipType::Editable); - modify_geometry_set(md, ctx, &geometry_set); - Mesh *result = geometry_set.get_component_for_write().release(); + Mesh *result = nullptr; + + switch (cache_file->type) { + case CACHEFILE_TYPE_ALEMBIC: { +# ifdef WITH_ALEMBIC + /* Time (in frames or seconds) between two velocity samples. Automatically computed to + * scale the velocity vectors at render time for generating proper motion blur data. */ + float velocity_scale = mcmd->velocity_scale; + if (mcmd->cache_file->velocity_unit == CACHEFILE_VELOCITY_UNIT_FRAME) { + velocity_scale *= FPS; + } + + ABCReadParams params = {}; + params.time = time; + params.read_flags = mcmd->read_flag; + params.velocity_name = mcmd->cache_file->velocity_name; + params.velocity_scale = velocity_scale; + + result = ABC_read_mesh(mcmd->reader, ctx->object, mesh, ¶ms, &err_str); +# endif + break; + } + case CACHEFILE_TYPE_USD: { +# ifdef WITH_USD + const blender::io::usd::USDMeshReadParams params = blender::io::usd::create_mesh_read_params( + time * FPS, mcmd->read_flag); + result = blender::io::usd::USD_read_mesh(mcmd->reader, ctx->object, mesh, params, &err_str); +# endif + break; + } + case CACHE_FILE_TYPE_INVALID: + break; + } + + if (err_str) { + BKE_modifier_set_error(ctx->object, md, "%s", err_str); + } if (!ELEM(result, nullptr, mesh) && (mesh != org_mesh)) { BKE_id_free(nullptr, mesh); @@ -495,7 +450,7 @@ ModifierTypeInfo modifierType_MeshSequenceCache = { /*deform_verts_EM*/ nullptr, /*deform_matrices_EM*/ nullptr, /*modify_mesh*/ modify_mesh, - /*modify_geometry_set*/ modify_geometry_set, + /*modify_geometry_set*/ nullptr, /*init_data*/ init_data, /*required_data_mask*/ nullptr, diff --git a/source/blender/modifiers/intern/MOD_mirror.cc b/source/blender/modifiers/intern/MOD_mirror.cc index 2b0fd8a4680..26a9c3f3b9b 100644 --- a/source/blender/modifiers/intern/MOD_mirror.cc +++ b/source/blender/modifiers/intern/MOD_mirror.cc @@ -8,16 +8,19 @@ #include "BLI_span.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_defaults.h" #include "DNA_mesh_types.h" +#include "DNA_object_types.h" #include "DNA_screen_types.h" +#include "BKE_context.hh" #include "BKE_lib_id.hh" #include "BKE_lib_query.hh" #include "BKE_mesh_mirror.hh" #include "BKE_modifier.hh" +#include "BKE_screen.hh" #include "UI_interface.hh" #include "UI_resources.hh" @@ -28,7 +31,9 @@ #include "MEM_guardedalloc.h" #include "DEG_depsgraph_build.hh" +#include "DEG_depsgraph_query.hh" +#include "MOD_modifiertypes.hh" #include "MOD_ui_common.hh" #include "GEO_mesh_merge_by_distance.hh" diff --git a/source/blender/modifiers/intern/MOD_multires.cc b/source/blender/modifiers/intern/MOD_multires.cc index 15141e039bf..5356bb0d895 100644 --- a/source/blender/modifiers/intern/MOD_multires.cc +++ b/source/blender/modifiers/intern/MOD_multires.cc @@ -12,19 +12,22 @@ #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_defaults.h" #include "DNA_mesh_types.h" #include "DNA_object_types.h" +#include "DNA_scene_types.h" #include "DNA_screen_types.h" +#include "BKE_cdderivedmesh.h" #include "BKE_context.hh" #include "BKE_customdata.hh" #include "BKE_mesh.hh" #include "BKE_modifier.hh" #include "BKE_multires.hh" #include "BKE_paint.hh" +#include "BKE_screen.hh" #include "BKE_subdiv.hh" #include "BKE_subdiv_ccg.hh" #include "BKE_subdiv_deform.hh" @@ -41,6 +44,7 @@ #include "DEG_depsgraph_query.hh" +#include "MOD_modifiertypes.hh" #include "MOD_ui_common.hh" struct MultiresRuntimeData { diff --git a/source/blender/modifiers/intern/MOD_nodes.cc b/source/blender/modifiers/intern/MOD_nodes.cc index b18b6602294..a2e24cee185 100644 --- a/source/blender/modifiers/intern/MOD_nodes.cc +++ b/source/blender/modifiers/intern/MOD_nodes.cc @@ -47,7 +47,7 @@ #include "BKE_customdata.hh" #include "BKE_geometry_fields.hh" #include "BKE_geometry_set_instances.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_idprop.hh" #include "BKE_lib_id.hh" #include "BKE_lib_query.hh" @@ -66,7 +66,7 @@ #include "UI_interface.hh" #include "UI_resources.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "WM_api.hh" #include "WM_types.hh" @@ -336,7 +336,8 @@ static void update_id_properties_from_node_group(NodesModifierData *nmd) } IDProperty *new_properties = nmd->settings.properties; - nodes::update_input_properties_from_node_tree(*nmd->node_group, old_properties, *new_properties); + nodes::update_input_properties_from_node_tree( + *nmd->node_group, old_properties, false, *new_properties); nodes::update_output_properties_from_node_tree( *nmd->node_group, old_properties, *new_properties); @@ -834,7 +835,7 @@ static void check_property_socket_sync(const Object *ob, ModifierData *md) IDProperty *property = IDP_GetPropertyFromGroup(nmd->settings.properties, socket->identifier); if (property == nullptr) { - if (ELEM(type, SOCK_GEOMETRY, SOCK_MATRIX)) { + if (type == SOCK_GEOMETRY) { geometry_socket_count++; } else { @@ -920,7 +921,7 @@ struct BakeFrameIndices { }; static BakeFrameIndices get_bake_frame_indices( - const Span> frame_caches, const SubFrame frame) + const Span> &frame_caches, const SubFrame frame) { BakeFrameIndices frame_indices; if (!frame_caches.is_empty()) { @@ -2303,9 +2304,16 @@ static void panel_draw(const bContext *C, Panel *panel) uiLayoutSetPropDecorate(layout, false); if (!(nmd->flag & NODES_MODIFIER_HIDE_DATABLOCK_SELECTOR)) { - const char *newop = (nmd->node_group == nullptr) ? "node.new_geometry_node_group_assign" : - "object.geometry_node_tree_copy_assign"; - uiTemplateID(layout, C, ptr, "node_group", newop, nullptr, nullptr, 0, false, nullptr); + uiTemplateID(layout, + C, + ptr, + "node_group", + "node.new_geometry_node_group_assign", + nullptr, + nullptr, + 0, + false, + nullptr); } if (nmd->node_group != nullptr && nmd->settings.properties != nullptr) { diff --git a/source/blender/modifiers/intern/MOD_normal_edit.cc b/source/blender/modifiers/intern/MOD_normal_edit.cc index 9bc22d9d369..7bae49ed9d0 100644 --- a/source/blender/modifiers/intern/MOD_normal_edit.cc +++ b/source/blender/modifiers/intern/MOD_normal_edit.cc @@ -16,19 +16,22 @@ #include "BLI_math_matrix.h" #include "BLI_math_vector.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_defaults.h" #include "DNA_mesh_types.h" +#include "DNA_meshdata_types.h" #include "DNA_object_types.h" #include "DNA_screen_types.h" #include "BKE_attribute.hh" +#include "BKE_context.hh" #include "BKE_customdata.hh" #include "BKE_deform.hh" #include "BKE_lib_id.hh" #include "BKE_lib_query.hh" #include "BKE_mesh.hh" +#include "BKE_screen.hh" #include "UI_interface.hh" #include "UI_resources.hh" @@ -36,6 +39,8 @@ #include "RNA_access.hh" #include "RNA_prototypes.h" +#include "DEG_depsgraph_query.hh" + #include "MOD_ui_common.hh" #include "MOD_util.hh" @@ -63,7 +68,7 @@ static void generate_vert_coordinates(Mesh *mesh, } /* Get size (i.e. deformation of the spheroid generating normals), - * either from target object, or geometry. */ + * either from target object, or own geometry. */ if (r_size != nullptr) { if (ob_center != nullptr) { /* Using 'scale' as 'size' here. The input object is typically an empty @@ -95,8 +100,8 @@ static void generate_vert_coordinates(Mesh *mesh, /* Translate our coordinates so that center of ob_center is at (0, 0, 0). */ /* Get ob_center (world) coordinates in ob local coordinates. * No need to take into account ob_center's space here, see #44027. */ - invert_m4_m4(inv_obmat, ob->object_to_world().ptr()); - mul_v3_m4v3(diff, inv_obmat, ob_center->object_to_world().location()); + invert_m4_m4(inv_obmat, ob->object_to_world); + mul_v3_m4v3(diff, inv_obmat, ob_center->object_to_world[3]); negate_v3(diff); do_diff = true; @@ -369,8 +374,8 @@ static void normalEditModifier_do_directional(NormalEditModifierData *enmd, /* Get target's center coordinates in ob local coordinates. */ float mat[4][4]; - invert_m4_m4(mat, ob->object_to_world().ptr()); - mul_m4_m4m4(mat, mat, ob_target->object_to_world().ptr()); + invert_m4_m4(mat, ob->object_to_world); + mul_m4_m4m4(mat, mat, ob_target->object_to_world); copy_v3_v3(target_co, mat[3]); if (use_parallel_normals) { diff --git a/source/blender/modifiers/intern/MOD_ocean.cc b/source/blender/modifiers/intern/MOD_ocean.cc index 9217757b5dd..1fa775ebbcb 100644 --- a/source/blender/modifiers/intern/MOD_ocean.cc +++ b/source/blender/modifiers/intern/MOD_ocean.cc @@ -10,7 +10,7 @@ #include "BLI_task.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_customdata_types.h" #include "DNA_defaults.h" @@ -18,13 +18,16 @@ #include "DNA_meshdata_types.h" #include "DNA_modifier_types.h" #include "DNA_object_types.h" +#include "DNA_scene_types.h" #include "DNA_screen_types.h" +#include "BKE_context.hh" #include "BKE_customdata.hh" #include "BKE_lib_id.hh" #include "BKE_mesh.hh" #include "BKE_modifier.hh" #include "BKE_ocean.h" +#include "BKE_screen.hh" #include "UI_interface.hh" #include "UI_resources.hh" @@ -32,10 +35,13 @@ #include "RNA_access.hh" #include "RNA_prototypes.h" +#include "BLO_read_write.hh" + #include "WM_types.hh" /* For UI free bake operator. */ #include "DEG_depsgraph_query.hh" +#include "MOD_modifiertypes.hh" #include "MOD_ui_common.hh" #ifdef WITH_OCEANSIM diff --git a/source/blender/modifiers/intern/MOD_particleinstance.cc b/source/blender/modifiers/intern/MOD_particleinstance.cc index ef1faeaeb17..d287a8a17b7 100644 --- a/source/blender/modifiers/intern/MOD_particleinstance.cc +++ b/source/blender/modifiers/intern/MOD_particleinstance.cc @@ -11,24 +11,30 @@ #include "BLI_utildefines.h" #include "BLI_listbase.h" +#include "BLI_math_base_safe.h" #include "BLI_math_matrix.h" #include "BLI_math_rotation.h" #include "BLI_math_vector.h" #include "BLI_rand.h" +#include "BLI_string.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_defaults.h" #include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" #include "DNA_screen_types.h" +#include "BKE_context.hh" #include "BKE_customdata.hh" +#include "BKE_effect.h" +#include "BKE_lattice.hh" #include "BKE_lib_query.hh" #include "BKE_mesh.hh" #include "BKE_modifier.hh" #include "BKE_particle.h" #include "BKE_pointcache.h" +#include "BKE_screen.hh" #include "UI_interface.hh" #include "UI_resources.hh" @@ -39,6 +45,7 @@ #include "DEG_depsgraph_build.hh" #include "DEG_depsgraph_query.hh" +#include "MOD_modifiertypes.hh" #include "MOD_ui_common.hh" static void init_data(ModifierData *md) @@ -268,7 +275,7 @@ static Mesh *modify_mesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh break; case eParticleInstanceSpace_Local: /* get particle states in the particle object's local space */ - invert_m4_m4(spacemat, pimd->ob->object_to_world().ptr()); + invert_m4_m4(spacemat, pimd->ob->object_to_world); break; default: /* should not happen */ diff --git a/source/blender/modifiers/intern/MOD_particlesystem.cc b/source/blender/modifiers/intern/MOD_particlesystem.cc index a172e85ad4a..d774695d85f 100644 --- a/source/blender/modifiers/intern/MOD_particlesystem.cc +++ b/source/blender/modifiers/intern/MOD_particlesystem.cc @@ -11,22 +11,26 @@ #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_defaults.h" +#include "DNA_material_types.h" #include "DNA_mesh_types.h" #include "DNA_screen_types.h" +#include "BKE_context.hh" #include "BKE_editmesh.hh" #include "BKE_lib_id.hh" #include "BKE_mesh.hh" #include "BKE_mesh_legacy_convert.hh" #include "BKE_modifier.hh" #include "BKE_particle.h" +#include "BKE_screen.hh" #include "UI_interface.hh" #include "UI_resources.hh" +#include "RNA_access.hh" #include "RNA_prototypes.h" #include "DEG_depsgraph_query.hh" @@ -34,6 +38,7 @@ #include "BLO_read_write.hh" #include "MOD_ui_common.hh" +#include "MOD_util.hh" static void init_data(ModifierData *md) { diff --git a/source/blender/modifiers/intern/MOD_remesh.cc b/source/blender/modifiers/intern/MOD_remesh.cc index bec3d171375..803e11022b5 100644 --- a/source/blender/modifiers/intern/MOD_remesh.cc +++ b/source/blender/modifiers/intern/MOD_remesh.cc @@ -12,15 +12,18 @@ #include "BLI_threads.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_defaults.h" #include "DNA_modifier_types.h" +#include "DNA_object_types.h" #include "DNA_screen_types.h" +#include "BKE_context.hh" #include "BKE_mesh.hh" #include "BKE_mesh_remesh_voxel.hh" #include "BKE_mesh_runtime.hh" +#include "BKE_screen.hh" #include "UI_interface.hh" #include "UI_resources.hh" diff --git a/source/blender/modifiers/intern/MOD_screw.cc b/source/blender/modifiers/intern/MOD_screw.cc index 7410cbf280a..ccb772e3548 100644 --- a/source/blender/modifiers/intern/MOD_screw.cc +++ b/source/blender/modifiers/intern/MOD_screw.cc @@ -18,18 +18,21 @@ #include "BLI_math_vector.h" #include "BLI_span.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_defaults.h" #include "DNA_mesh_types.h" +#include "DNA_meshdata_types.h" #include "DNA_object_types.h" #include "DNA_screen_types.h" #include "BKE_attribute.hh" +#include "BKE_context.hh" #include "BKE_customdata.hh" #include "BKE_lib_id.hh" #include "BKE_lib_query.hh" #include "BKE_mesh.hh" +#include "BKE_screen.hh" #include "UI_interface.hh" #include "UI_resources.hh" @@ -38,15 +41,16 @@ #include "RNA_prototypes.h" #include "DEG_depsgraph_build.hh" +#include "DEG_depsgraph_query.hh" #include "MEM_guardedalloc.h" #include "MOD_modifiertypes.hh" #include "MOD_ui_common.hh" -#include "GEO_mesh_merge_by_distance.hh" +#include "BLI_strict_flags.h" -#include "BLI_strict_flags.h" /* Keep last. */ +#include "GEO_mesh_merge_by_distance.hh" using namespace blender; @@ -286,8 +290,8 @@ static Mesh *modify_mesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh if (ob_axis != nullptr) { /* Calculate the matrix relative to the axis object. */ - invert_m4_m4(mtx_tmp_a, ctx->object->object_to_world().ptr()); - copy_m4_m4(mtx_tx_inv, ob_axis->object_to_world().ptr()); + invert_m4_m4(mtx_tmp_a, ctx->object->object_to_world); + copy_m4_m4(mtx_tx_inv, ob_axis->object_to_world); mul_m4_m4m4(mtx_tx, mtx_tmp_a, mtx_tx_inv); /* Calculate the axis vector. */ diff --git a/source/blender/modifiers/intern/MOD_shapekey.cc b/source/blender/modifiers/intern/MOD_shapekey.cc index 2c55b2cefd0..3d93ff8aa08 100644 --- a/source/blender/modifiers/intern/MOD_shapekey.cc +++ b/source/blender/modifiers/intern/MOD_shapekey.cc @@ -9,13 +9,16 @@ #include "BLI_math_matrix.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_key_types.h" +#include "DNA_mesh_types.h" #include "DNA_object_types.h" #include "BKE_key.hh" +#include "BKE_particle.h" +#include "RNA_access.hh" #include "RNA_prototypes.h" #include "MOD_modifiertypes.hh" diff --git a/source/blender/modifiers/intern/MOD_shrinkwrap.cc b/source/blender/modifiers/intern/MOD_shrinkwrap.cc index 011a533abc5..73ae32f647a 100644 --- a/source/blender/modifiers/intern/MOD_shrinkwrap.cc +++ b/source/blender/modifiers/intern/MOD_shrinkwrap.cc @@ -10,14 +10,21 @@ #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_defaults.h" +#include "DNA_mesh_types.h" #include "DNA_object_types.h" #include "DNA_screen_types.h" +#include "BKE_context.hh" +#include "BKE_editmesh.hh" +#include "BKE_lib_id.hh" #include "BKE_lib_query.hh" +#include "BKE_mesh.hh" +#include "BKE_mesh_wrapper.hh" #include "BKE_modifier.hh" +#include "BKE_screen.hh" #include "BKE_shrinkwrap.hh" #include "UI_interface.hh" diff --git a/source/blender/modifiers/intern/MOD_simpledeform.cc b/source/blender/modifiers/intern/MOD_simpledeform.cc index cb93c12f904..668bb652ec1 100644 --- a/source/blender/modifiers/intern/MOD_simpledeform.cc +++ b/source/blender/modifiers/intern/MOD_simpledeform.cc @@ -10,15 +10,23 @@ #include "BLI_math_vector.h" #include "BLI_task.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_defaults.h" +#include "DNA_mesh_types.h" +#include "DNA_meshdata_types.h" #include "DNA_object_types.h" #include "DNA_screen_types.h" +#include "BKE_context.hh" #include "BKE_deform.hh" +#include "BKE_editmesh.hh" +#include "BKE_lib_id.hh" #include "BKE_lib_query.hh" +#include "BKE_mesh.hh" +#include "BKE_mesh_wrapper.hh" #include "BKE_modifier.hh" +#include "BKE_screen.hh" #include "UI_interface.hh" #include "UI_resources.hh" @@ -26,12 +34,14 @@ #include "RNA_access.hh" #include "RNA_prototypes.h" +#include "DEG_depsgraph_query.hh" + #include "MOD_ui_common.hh" #include "MOD_util.hh" #define BEND_EPS 0.000001f -BLI_ALIGN_STRUCT struct DeformUserData { +ALIGN_STRUCT struct DeformUserData { bool invert_vgroup; char mode; char deform_axis; diff --git a/source/blender/modifiers/intern/MOD_skin.cc b/source/blender/modifiers/intern/MOD_skin.cc index a002a9a7651..24e535db48e 100644 --- a/source/blender/modifiers/intern/MOD_skin.cc +++ b/source/blender/modifiers/intern/MOD_skin.cc @@ -50,19 +50,22 @@ #include "BLI_stack.h" #include "BLI_vector.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_defaults.h" #include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" #include "DNA_modifier_types.h" +#include "DNA_object_types.h" #include "DNA_screen_types.h" +#include "BKE_context.hh" #include "BKE_deform.hh" #include "BKE_lib_id.hh" #include "BKE_mesh.hh" #include "BKE_mesh_mapping.hh" #include "BKE_modifier.hh" +#include "BKE_screen.hh" #include "UI_interface.hh" #include "UI_resources.hh" @@ -72,6 +75,7 @@ #include "WM_types.hh" /* For skin mark clear operator UI. */ +#include "MOD_modifiertypes.hh" #include "MOD_ui_common.hh" #include "bmesh.hh" diff --git a/source/blender/modifiers/intern/MOD_smooth.cc b/source/blender/modifiers/intern/MOD_smooth.cc index 5aea27baefb..9ca9d722f94 100644 --- a/source/blender/modifiers/intern/MOD_smooth.cc +++ b/source/blender/modifiers/intern/MOD_smooth.cc @@ -11,18 +11,27 @@ #include "BLI_math_vector.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_defaults.h" #include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" +#include "DNA_object_types.h" #include "DNA_screen_types.h" +#include "BKE_context.hh" #include "BKE_deform.hh" +#include "BKE_editmesh.hh" +#include "BKE_lib_id.hh" +#include "BKE_mesh.hh" +#include "BKE_mesh_wrapper.hh" +#include "BKE_particle.h" +#include "BKE_screen.hh" #include "UI_interface.hh" #include "UI_resources.hh" +#include "RNA_access.hh" #include "RNA_prototypes.h" #include "MOD_modifiertypes.hh" diff --git a/source/blender/modifiers/intern/MOD_softbody.cc b/source/blender/modifiers/intern/MOD_softbody.cc index 2256cb1ffd4..f6ea575aef1 100644 --- a/source/blender/modifiers/intern/MOD_softbody.cc +++ b/source/blender/modifiers/intern/MOD_softbody.cc @@ -10,16 +10,23 @@ #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" +#include "DNA_mesh_types.h" #include "DNA_object_force_types.h" +#include "DNA_scene_types.h" #include "DNA_screen_types.h" +#include "BKE_context.hh" +#include "BKE_layer.hh" +#include "BKE_particle.h" +#include "BKE_screen.hh" #include "BKE_softbody.h" #include "UI_interface.hh" #include "UI_resources.hh" +#include "RNA_access.hh" #include "RNA_prototypes.h" #include "DEG_depsgraph.hh" @@ -62,7 +69,7 @@ static void update_depsgraph(ModifierData * /*md*/, const ModifierUpdateDepsgrap DEG_add_forcefield_relations( ctx->node, ctx->object, ctx->object->soft->effector_weights, true, 0, "Softbody Field"); } - /* We need our own transformation as well. */ + /* We need own transformation as well. */ DEG_add_depends_on_transform_relation(ctx->node, "SoftBody Modifier"); } diff --git a/source/blender/modifiers/intern/MOD_solidify.cc b/source/blender/modifiers/intern/MOD_solidify.cc index db676a999d5..514e7ac0951 100644 --- a/source/blender/modifiers/intern/MOD_solidify.cc +++ b/source/blender/modifiers/intern/MOD_solidify.cc @@ -10,7 +10,7 @@ #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_defaults.h" #include "DNA_mesh_types.h" diff --git a/source/blender/modifiers/intern/MOD_solidify_extrude.cc b/source/blender/modifiers/intern/MOD_solidify_extrude.cc index 1e054ec07a8..4b7cfc2ca63 100644 --- a/source/blender/modifiers/intern/MOD_solidify_extrude.cc +++ b/source/blender/modifiers/intern/MOD_solidify_extrude.cc @@ -23,6 +23,7 @@ #include "BKE_customdata.hh" #include "BKE_deform.hh" #include "BKE_mesh.hh" +#include "BKE_particle.h" #include "MOD_modifiertypes.hh" #include "MOD_solidify_util.hh" /* own include */ diff --git a/source/blender/modifiers/intern/MOD_solidify_nonmanifold.cc b/source/blender/modifiers/intern/MOD_solidify_nonmanifold.cc index de6d549d85b..7adfe6dc2a6 100644 --- a/source/blender/modifiers/intern/MOD_solidify_nonmanifold.cc +++ b/source/blender/modifiers/intern/MOD_solidify_nonmanifold.cc @@ -20,6 +20,7 @@ #include "BKE_customdata.hh" #include "BKE_deform.hh" #include "BKE_mesh.hh" +#include "BKE_particle.h" #include "MOD_modifiertypes.hh" #include "MOD_solidify_util.hh" /* Own include. */ diff --git a/source/blender/modifiers/intern/MOD_subsurf.cc b/source/blender/modifiers/intern/MOD_subsurf.cc index b810fe605d9..66823b8a7f4 100644 --- a/source/blender/modifiers/intern/MOD_subsurf.cc +++ b/source/blender/modifiers/intern/MOD_subsurf.cc @@ -15,7 +15,7 @@ #include "BLI_string.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_defaults.h" #include "DNA_mesh_types.h" @@ -26,12 +26,14 @@ #include "BKE_context.hh" #include "BKE_editmesh.hh" #include "BKE_mesh.hh" -#include "BKE_scene.hh" +#include "BKE_scene.h" +#include "BKE_screen.hh" #include "BKE_subdiv.hh" #include "BKE_subdiv_ccg.hh" #include "BKE_subdiv_deform.hh" #include "BKE_subdiv_mesh.hh" #include "BKE_subdiv_modifier.hh" +#include "BKE_subsurf.hh" #include "UI_interface.hh" #include "UI_resources.hh" @@ -47,6 +49,8 @@ #include "MOD_modifiertypes.hh" #include "MOD_ui_common.hh" +#include "BLO_read_write.hh" + #include "intern/CCGSubSurf.h" static void init_data(ModifierData *md) diff --git a/source/blender/modifiers/intern/MOD_surface.cc b/source/blender/modifiers/intern/MOD_surface.cc index f553c3b9f44..ea5a854fc27 100644 --- a/source/blender/modifiers/intern/MOD_surface.cc +++ b/source/blender/modifiers/intern/MOD_surface.cc @@ -10,20 +10,25 @@ #include "BLI_math_vector.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_defaults.h" #include "DNA_mesh_types.h" +#include "DNA_meshdata_types.h" #include "DNA_object_types.h" +#include "DNA_scene_types.h" #include "DNA_screen_types.h" #include "BKE_bvhutils.hh" +#include "BKE_context.hh" #include "BKE_lib_id.hh" #include "BKE_mesh.hh" +#include "BKE_screen.hh" #include "UI_interface.hh" #include "UI_resources.hh" +#include "RNA_access.hh" #include "RNA_prototypes.h" #include "DEG_depsgraph.hh" @@ -31,6 +36,9 @@ #include "MOD_modifiertypes.hh" #include "MOD_ui_common.hh" +#include "MOD_util.hh" + +#include "BLO_read_write.hh" #include "MEM_guardedalloc.h" @@ -138,7 +146,7 @@ static void deform_verts(ModifierData *md, surmd->runtime.mesh->vert_positions_for_write(); for (i = 0; i < mesh_verts_num; i++) { float *vec = positions[i]; - mul_m4_v3(ctx->object->object_to_world().ptr(), vec); + mul_m4_v3(ctx->object->object_to_world, vec); if (init) { zero_v3(surmd->runtime.vert_velocities[i]); diff --git a/source/blender/modifiers/intern/MOD_surfacedeform.cc b/source/blender/modifiers/intern/MOD_surfacedeform.cc index 72d9e957a78..a2bd6d1a0e0 100644 --- a/source/blender/modifiers/intern/MOD_surfacedeform.cc +++ b/source/blender/modifiers/intern/MOD_surfacedeform.cc @@ -10,20 +10,26 @@ #include "BLI_math_matrix.h" #include "BLI_task.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_defaults.h" #include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" #include "DNA_object_types.h" +#include "DNA_scene_types.h" #include "DNA_screen_types.h" #include "BKE_bvhutils.hh" +#include "BKE_context.hh" #include "BKE_deform.hh" +#include "BKE_editmesh.hh" +#include "BKE_lib_id.hh" #include "BKE_lib_query.hh" #include "BKE_mesh.hh" +#include "BKE_mesh_runtime.hh" #include "BKE_mesh_wrapper.hh" #include "BKE_modifier.hh" +#include "BKE_screen.hh" #include "UI_interface.hh" #include "UI_resources.hh" @@ -34,6 +40,7 @@ #include "RNA_prototypes.h" #include "DEG_depsgraph.hh" +#include "DEG_depsgraph_query.hh" #include "MEM_guardedalloc.h" @@ -1462,8 +1469,8 @@ static void surfacedeformModifier_do(ModifierData *md, ob, md); float tmp_mat[4][4]; - invert_m4_m4(tmp_mat, ob->object_to_world().ptr()); - mul_m4_m4m4(smd_orig->mat, tmp_mat, ob_target->object_to_world().ptr()); + invert_m4_m4(tmp_mat, ob->object_to_world); + mul_m4_m4m4(smd_orig->mat, tmp_mat, ob_target->object_to_world); /* Avoid converting edit-mesh data, binding is an exception. */ BKE_mesh_wrapper_ensure_mdata(target); diff --git a/source/blender/modifiers/intern/MOD_triangulate.cc b/source/blender/modifiers/intern/MOD_triangulate.cc index 52790c98aa2..b2781c91240 100644 --- a/source/blender/modifiers/intern/MOD_triangulate.cc +++ b/source/blender/modifiers/intern/MOD_triangulate.cc @@ -12,22 +12,27 @@ #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_defaults.h" +#include "DNA_object_types.h" #include "DNA_screen_types.h" +#include "BKE_context.hh" #include "BKE_mesh.hh" #include "BKE_modifier.hh" +#include "BKE_screen.hh" #include "UI_interface.hh" #include "UI_resources.hh" +#include "RNA_access.hh" #include "RNA_prototypes.h" #include "bmesh.hh" #include "bmesh_tools.hh" +#include "MOD_modifiertypes.hh" #include "MOD_ui_common.hh" static Mesh *triangulate_mesh(Mesh *mesh, diff --git a/source/blender/modifiers/intern/MOD_ui_common.cc b/source/blender/modifiers/intern/MOD_ui_common.cc index bca4b2a580d..19ca73fdeab 100644 --- a/source/blender/modifiers/intern/MOD_ui_common.cc +++ b/source/blender/modifiers/intern/MOD_ui_common.cc @@ -13,15 +13,18 @@ #include "BKE_context.hh" #include "BKE_modifier.hh" +#include "BKE_object.hh" #include "BKE_screen.hh" +#include "DNA_object_force_types.h" #include "DNA_object_types.h" #include "DNA_particle_types.h" +#include "DNA_scene_types.h" #include "DNA_screen_types.h" #include "ED_object.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "UI_interface.hh" #include "UI_resources.hh" @@ -32,6 +35,7 @@ #include "WM_api.hh" #include "WM_types.hh" +#include "MOD_modifiertypes.hh" #include "MOD_ui_common.hh" /* Self include */ /** @@ -376,6 +380,8 @@ static void modifier_panel_header(const bContext *C, Panel *panel) &apply_on_spline_always_off_hack, 0.0, 0.0, + 0.0, + 0.0, RPT_("Apply on Spline")); UI_but_disable(but, "This modifier can only deform filled curve/surface, not the control points"); @@ -400,6 +406,8 @@ static void modifier_panel_header(const bContext *C, Panel *panel) &apply_on_spline_always_on_hack, 0.0, 0.0, + 0.0, + 0.0, RPT_("Apply on Spline")); UI_but_disable(but, "This modifier can only deform control points, not the filled curve/surface"); diff --git a/source/blender/modifiers/intern/MOD_util.cc b/source/blender/modifiers/intern/MOD_util.cc index 85766fa5894..a6fc875c5b0 100644 --- a/source/blender/modifiers/intern/MOD_util.cc +++ b/source/blender/modifiers/intern/MOD_util.cc @@ -16,8 +16,10 @@ #include "DNA_image_types.h" #include "DNA_mesh_types.h" +#include "DNA_meshdata_types.h" #include "DNA_modifier_types.h" #include "DNA_object_types.h" +#include "DNA_scene_types.h" #include "BKE_action.h" /* BKE_pose_channel_find_name */ #include "BKE_attribute.hh" @@ -25,6 +27,10 @@ #include "BKE_editmesh.hh" #include "BKE_image.h" #include "BKE_lattice.hh" +#include "BKE_lib_id.hh" +#include "BKE_mesh.hh" +#include "BKE_mesh_wrapper.hh" +#include "BKE_object.hh" #include "BKE_modifier.hh" @@ -71,15 +77,15 @@ void MOD_get_texture_coords(MappingInfoModifierData *dmd, bPoseChannel *pchan = BKE_pose_channel_find_name(map_object->pose, dmd->map_bone); if (pchan) { float mat_bone_world[4][4]; - mul_m4_m4m4(mat_bone_world, map_object->object_to_world().ptr(), pchan->pose_mat); + mul_m4_m4m4(mat_bone_world, map_object->object_to_world, pchan->pose_mat); invert_m4_m4(mapref_imat, mat_bone_world); } else { - invert_m4_m4(mapref_imat, map_object->object_to_world().ptr()); + invert_m4_m4(mapref_imat, map_object->object_to_world); } } else { - invert_m4_m4(mapref_imat, map_object->object_to_world().ptr()); + invert_m4_m4(mapref_imat, map_object->object_to_world); } } else { /* if there is no map object, default to local */ @@ -129,10 +135,10 @@ void MOD_get_texture_coords(MappingInfoModifierData *dmd, copy_v3_v3(*r_texco, cos != nullptr ? *cos : positions[i]); break; case MOD_DISP_MAP_GLOBAL: - mul_v3_m4v3(*r_texco, ob->object_to_world().ptr(), cos != nullptr ? *cos : positions[i]); + mul_v3_m4v3(*r_texco, ob->object_to_world, cos != nullptr ? *cos : positions[i]); break; case MOD_DISP_MAP_OBJECT: - mul_v3_m4v3(*r_texco, ob->object_to_world().ptr(), cos != nullptr ? *cos : positions[i]); + mul_v3_m4v3(*r_texco, ob->object_to_world, cos != nullptr ? *cos : positions[i]); mul_m4_v3(mapref_imat, *r_texco); break; } @@ -273,19 +279,5 @@ void modifier_type_init(ModifierTypeInfo *types[]) INIT_TYPE(GreasePencilNoise); INIT_TYPE(GreasePencilMirror); INIT_TYPE(GreasePencilThickness); - INIT_TYPE(GreasePencilLattice); - INIT_TYPE(GreasePencilDash); - INIT_TYPE(GreasePencilMultiply); - INIT_TYPE(GreasePencilLength); - INIT_TYPE(GreasePencilWeightAngle); - INIT_TYPE(GreasePencilArray); - INIT_TYPE(GreasePencilWeightProximity); - INIT_TYPE(GreasePencilHook); - INIT_TYPE(GreasePencilLineart); - INIT_TYPE(GreasePencilArmature); - INIT_TYPE(GreasePencilTime); - INIT_TYPE(GreasePencilEnvelope); - INIT_TYPE(GreasePencilOutline); - INIT_TYPE(GreasePencilShrinkwrap); #undef INIT_TYPE } diff --git a/source/blender/modifiers/intern/MOD_uvproject.cc b/source/blender/modifiers/intern/MOD_uvproject.cc index cfcfd7c3b71..e31deb0cf1d 100644 --- a/source/blender/modifiers/intern/MOD_uvproject.cc +++ b/source/blender/modifiers/intern/MOD_uvproject.cc @@ -14,19 +14,23 @@ #include "BLI_math_vector.h" #include "BLI_uvproject.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_camera_types.h" #include "DNA_defaults.h" #include "DNA_mesh_types.h" +#include "DNA_meshdata_types.h" #include "DNA_object_types.h" #include "DNA_screen_types.h" #include "BKE_attribute.hh" #include "BKE_camera.h" +#include "BKE_context.hh" #include "BKE_customdata.hh" #include "BKE_lib_query.hh" +#include "BKE_material.h" #include "BKE_mesh.hh" +#include "BKE_screen.hh" #include "UI_interface.hh" #include "UI_resources.hh" @@ -39,7 +43,9 @@ #include "MEM_guardedalloc.h" +#include "DEG_depsgraph.hh" #include "DEG_depsgraph_build.hh" +#include "DEG_depsgraph_query.hh" static void init_data(ModifierData *md) { @@ -139,13 +145,14 @@ static Mesh *uvprojectModifier_do(UVProjectModifierData *umd, for (int i = 0; i < projectors_num; i++) { float tmpmat[4][4]; float offsetmat[4][4]; + Camera *cam = nullptr; /* calculate projection matrix */ - invert_m4_m4(projectors[i].projmat, projectors[i].ob->object_to_world().ptr()); + invert_m4_m4(projectors[i].projmat, projectors[i].ob->object_to_world); projectors[i].uci = nullptr; if (projectors[i].ob->type == OB_CAMERA) { - const Camera *cam = (const Camera *)projectors[i].ob->data; + cam = (Camera *)projectors[i].ob->data; if (cam->type == CAM_PANO) { projectors[i].uci = BLI_uvproject_camera_info(projectors[i].ob, nullptr, aspx, aspy); BLI_uvproject_camera_info_scale( @@ -186,7 +193,7 @@ static Mesh *uvprojectModifier_do(UVProjectModifierData *umd, projectors[i].normal[0] = 0; projectors[i].normal[1] = 0; projectors[i].normal[2] = 1; - mul_mat3_m4_v3(projectors[i].ob->object_to_world().ptr(), projectors[i].normal); + mul_mat3_m4_v3(projectors[i].ob->object_to_world, projectors[i].normal); } const Span positions = mesh->vert_positions(); @@ -197,7 +204,7 @@ static Mesh *uvprojectModifier_do(UVProjectModifierData *umd, /* Convert coords to world-space. */ Array coords(positions.size()); for (int64_t i = 0; i < positions.size(); i++) { - mul_v3_m4v3(coords[i], ob->object_to_world().ptr(), positions[i]); + mul_v3_m4v3(coords[i], ob->object_to_world, positions[i]); } /* if only one projector, project coords to UVs */ diff --git a/source/blender/modifiers/intern/MOD_uvwarp.cc b/source/blender/modifiers/intern/MOD_uvwarp.cc index ad021bba805..8a9c8b90f49 100644 --- a/source/blender/modifiers/intern/MOD_uvwarp.cc +++ b/source/blender/modifiers/intern/MOD_uvwarp.cc @@ -14,7 +14,7 @@ #include "BLI_math_vector.h" #include "BLI_task.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_defaults.h" #include "DNA_mesh_types.h" @@ -23,11 +23,13 @@ #include "DNA_screen_types.h" #include "BKE_action.h" /* BKE_pose_channel_find_name */ +#include "BKE_context.hh" #include "BKE_customdata.hh" #include "BKE_deform.hh" #include "BKE_lib_query.hh" #include "BKE_mesh.hh" #include "BKE_modifier.hh" +#include "BKE_screen.hh" #include "UI_interface.hh" #include "UI_resources.hh" @@ -35,6 +37,8 @@ #include "RNA_access.hh" #include "RNA_prototypes.h" +#include "DEG_depsgraph_query.hh" + #include "MOD_ui_common.hh" #include "MOD_util.hh" @@ -72,10 +76,10 @@ static void matrix_from_obj_pchan(float mat[4][4], Object *ob, const char *bonen { bPoseChannel *pchan = BKE_pose_channel_find_name(ob->pose, bonename); if (pchan) { - mul_m4_m4m4(mat, ob->object_to_world().ptr(), pchan->pose_mat); + mul_m4_m4m4(mat, ob->object_to_world, pchan->pose_mat); } else { - copy_m4_m4(mat, ob->object_to_world().ptr()); + copy_m4_m4(mat, ob->object_to_world); } } diff --git a/source/blender/modifiers/intern/MOD_volume_displace.cc b/source/blender/modifiers/intern/MOD_volume_displace.cc index 11007234f54..702e2d97c92 100644 --- a/source/blender/modifiers/intern/MOD_volume_displace.cc +++ b/source/blender/modifiers/intern/MOD_volume_displace.cc @@ -8,17 +8,20 @@ #include "BKE_geometry_set.hh" #include "BKE_lib_query.hh" +#include "BKE_mesh_runtime.hh" #include "BKE_modifier.hh" +#include "BKE_object.hh" #include "BKE_texture.h" #include "BKE_volume.hh" #include "BKE_volume_grid.hh" #include "BKE_volume_openvdb.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_object_types.h" #include "DNA_screen_types.h" #include "DNA_texture_types.h" +#include "DNA_volume_types.h" #include "DEG_depsgraph_build.hh" #include "DEG_depsgraph_query.hh" @@ -26,12 +29,16 @@ #include "UI_interface.hh" #include "UI_resources.hh" +#include "BLO_read_write.hh" + #include "MEM_guardedalloc.h" +#include "MOD_modifiertypes.hh" #include "MOD_ui_common.hh" #include "RE_texture.h" +#include "RNA_access.hh" #include "RNA_prototypes.h" #include "BLI_math_vector.h" @@ -119,12 +126,12 @@ static void panel_register(ARegionType *region_type) #ifdef WITH_OPENVDB -static openvdb::Mat4s matrix_to_openvdb(const blender::float4x4 &m) +static openvdb::Mat4s matrix_to_openvdb(const float m[4][4]) { /* OpenVDB matrices are transposed Blender matrices, i.e. the translation is in the last row * instead of in the last column. However, the layout in memory is the same, because OpenVDB * matrices are row major (compared to Blender's column major matrices). */ - openvdb::Mat4s new_matrix{m.base_ptr()}; + openvdb::Mat4s new_matrix{reinterpret_cast(m)}; return new_matrix; } @@ -250,16 +257,16 @@ struct DisplaceGridOp { return index_to_object; } case MOD_VOLUME_DISPLACE_MAP_GLOBAL: { - const openvdb::Mat4s object_to_world = matrix_to_openvdb(ctx.object->object_to_world()); + const openvdb::Mat4s object_to_world = matrix_to_openvdb(ctx.object->object_to_world); return index_to_object * object_to_world; } case MOD_VOLUME_DISPLACE_MAP_OBJECT: { if (vdmd.texture_map_object == nullptr) { return index_to_object; } - const openvdb::Mat4s object_to_world = matrix_to_openvdb(ctx.object->object_to_world()); + const openvdb::Mat4s object_to_world = matrix_to_openvdb(ctx.object->object_to_world); const openvdb::Mat4s world_to_texture = matrix_to_openvdb( - vdmd.texture_map_object->world_to_object()); + vdmd.texture_map_object->world_to_object); return index_to_object * object_to_world * world_to_texture; } } diff --git a/source/blender/modifiers/intern/MOD_volume_to_mesh.cc b/source/blender/modifiers/intern/MOD_volume_to_mesh.cc index f3fae579511..a11dadf92a8 100644 --- a/source/blender/modifiers/intern/MOD_volume_to_mesh.cc +++ b/source/blender/modifiers/intern/MOD_volume_to_mesh.cc @@ -15,22 +15,27 @@ #include "BKE_volume_grid.hh" #include "BKE_volume_to_mesh.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" +#include "MOD_modifiertypes.hh" #include "MOD_ui_common.hh" #include "DNA_modifier_types.h" #include "DNA_object_types.h" #include "DNA_screen_types.h" +#include "DNA_volume_types.h" #include "UI_interface.hh" #include "UI_resources.hh" +#include "RNA_access.hh" #include "RNA_prototypes.h" #include "BLI_math_matrix_types.hh" +#include "BLI_math_vector.h" #include "BLI_span.hh" #include "BLI_string.h" +#include "BLI_timeit.hh" #include "DEG_depsgraph_query.hh" @@ -157,8 +162,8 @@ static Mesh *modify_mesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh const openvdb::GridBase &local_grid = volume_grid->grid(tree_token); openvdb::math::Transform::Ptr transform = local_grid.transform().copy(); - transform->postMult(openvdb::Mat4d(vmmd->object->object_to_world().base_ptr())); - openvdb::Mat4d imat = openvdb::Mat4d(ctx->object->world_to_object().base_ptr()); + transform->postMult(openvdb::Mat4d((float *)vmmd->object->object_to_world)); + openvdb::Mat4d imat = openvdb::Mat4d((float *)ctx->object->world_to_object); /* `imat` had floating point issues and wasn't affine. */ imat.setCol(3, openvdb::Vec4d(0, 0, 0, 1)); transform->postMult(imat); diff --git a/source/blender/modifiers/intern/MOD_warp.cc b/source/blender/modifiers/intern/MOD_warp.cc index 2ece8e61716..7a884e438cd 100644 --- a/source/blender/modifiers/intern/MOD_warp.cc +++ b/source/blender/modifiers/intern/MOD_warp.cc @@ -14,18 +14,25 @@ #include "BLI_math_vector.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_defaults.h" +#include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" #include "DNA_object_types.h" #include "DNA_screen_types.h" #include "BKE_action.h" /* BKE_pose_channel_find_name */ #include "BKE_colortools.hh" +#include "BKE_context.hh" #include "BKE_deform.hh" +#include "BKE_editmesh.hh" +#include "BKE_lib_id.hh" #include "BKE_lib_query.hh" +#include "BKE_mesh.hh" +#include "BKE_mesh_wrapper.hh" #include "BKE_modifier.hh" +#include "BKE_screen.hh" #include "BKE_texture.h" #include "UI_interface.hh" @@ -36,6 +43,9 @@ #include "RNA_access.hh" #include "RNA_prototypes.h" +#include "DEG_depsgraph.hh" +#include "DEG_depsgraph_query.hh" + #include "RE_texture.h" #include "MOD_ui_common.hh" @@ -85,11 +95,11 @@ static void matrix_from_obj_pchan(float mat[4][4], bPoseChannel *pchan = BKE_pose_channel_find_name(ob->pose, bonename); if (pchan) { float mat_bone_world[4][4]; - mul_m4_m4m4(mat_bone_world, ob->object_to_world().ptr(), pchan->pose_mat); + mul_m4_m4m4(mat_bone_world, ob->object_to_world, pchan->pose_mat); mul_m4_m4m4(mat, obinv, mat_bone_world); } else { - mul_m4_m4m4(mat, obinv, ob->object_to_world().ptr()); + mul_m4_m4m4(mat, obinv, ob->object_to_world); } } @@ -205,7 +215,7 @@ static void warpModifier_do(WarpModifierData *wmd, BKE_curvemapping_init(wmd->curfalloff); } - invert_m4_m4(obinv, ob->object_to_world().ptr()); + invert_m4_m4(obinv, ob->object_to_world); /* Checks that the objects/bones are available. */ matrix_from_obj_pchan(mat_from, obinv, wmd->object_from, wmd->bone_from); diff --git a/source/blender/modifiers/intern/MOD_wave.cc b/source/blender/modifiers/intern/MOD_wave.cc index f540cefaaff..fbb2eb266b3 100644 --- a/source/blender/modifiers/intern/MOD_wave.cc +++ b/source/blender/modifiers/intern/MOD_wave.cc @@ -9,17 +9,25 @@ #include "BLI_math_matrix.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_defaults.h" #include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" #include "DNA_object_types.h" +#include "DNA_scene_types.h" #include "DNA_screen_types.h" +#include "BKE_context.hh" #include "BKE_deform.hh" #include "BKE_editmesh.hh" +#include "BKE_editmesh_cache.hh" +#include "BKE_lib_id.hh" #include "BKE_lib_query.hh" +#include "BKE_mesh.hh" +#include "BKE_mesh_wrapper.hh" +#include "BKE_scene.h" +#include "BKE_screen.hh" #include "BKE_texture.h" #include "UI_interface.hh" @@ -144,8 +152,8 @@ static void waveModifier_do(WaveModifierData *md, if (wmd->objectcenter != nullptr) { float mat[4][4]; /* get the control object's location in local coordinates */ - invert_m4_m4(ob->runtime->world_to_object.ptr(), ob->object_to_world().ptr()); - mul_m4_m4m4(mat, ob->world_to_object().ptr(), wmd->objectcenter->object_to_world().ptr()); + invert_m4_m4(ob->world_to_object, ob->object_to_world); + mul_m4_m4m4(mat, ob->world_to_object, wmd->objectcenter->object_to_world); wmd->startx = mat[3][0]; wmd->starty = mat[3][1]; diff --git a/source/blender/modifiers/intern/MOD_weighted_normal.cc b/source/blender/modifiers/intern/MOD_weighted_normal.cc index f3bcf7b7f45..17d13766522 100644 --- a/source/blender/modifiers/intern/MOD_weighted_normal.cc +++ b/source/blender/modifiers/intern/MOD_weighted_normal.cc @@ -13,7 +13,7 @@ #include "BLI_linklist.h" #include "BLI_math_vector.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_defaults.h" #include "DNA_mesh_types.h" diff --git a/source/blender/modifiers/intern/MOD_weightvg_util.cc b/source/blender/modifiers/intern/MOD_weightvg_util.cc index 88d18f4ef6b..0e09cb31d32 100644 --- a/source/blender/modifiers/intern/MOD_weightvg_util.cc +++ b/source/blender/modifiers/intern/MOD_weightvg_util.cc @@ -12,7 +12,7 @@ #include "BLI_rand.h" #include "BLI_string.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_color_types.h" /* CurveMapping. */ #include "DNA_mesh_types.h" @@ -26,7 +26,7 @@ #include "BKE_customdata.hh" #include "BKE_deform.hh" #include "BKE_modifier.hh" -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "BKE_texture.h" /* Texture masking. */ #include "UI_interface.hh" diff --git a/source/blender/modifiers/intern/MOD_weightvgedit.cc b/source/blender/modifiers/intern/MOD_weightvgedit.cc index dd240c84021..dffc2d0266b 100644 --- a/source/blender/modifiers/intern/MOD_weightvgedit.cc +++ b/source/blender/modifiers/intern/MOD_weightvgedit.cc @@ -14,7 +14,7 @@ #include "BLI_listbase.h" #include "BLI_rand.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_color_types.h" /* CurveMapping. */ #include "DNA_defaults.h" @@ -25,11 +25,13 @@ #include "DNA_screen_types.h" #include "BKE_colortools.hh" /* CurveMapping. */ +#include "BKE_context.hh" #include "BKE_customdata.hh" #include "BKE_deform.hh" #include "BKE_lib_query.hh" #include "BKE_mesh.hh" #include "BKE_modifier.hh" +#include "BKE_screen.hh" #include "BKE_texture.h" /* Texture masking. */ #include "UI_interface.hh" @@ -45,6 +47,7 @@ #include "MEM_guardedalloc.h" +#include "MOD_modifiertypes.hh" #include "MOD_ui_common.hh" #include "MOD_util.hh" #include "MOD_weightvg_util.hh" diff --git a/source/blender/modifiers/intern/MOD_weightvgmix.cc b/source/blender/modifiers/intern/MOD_weightvgmix.cc index 204ae620e66..663c481b90d 100644 --- a/source/blender/modifiers/intern/MOD_weightvgmix.cc +++ b/source/blender/modifiers/intern/MOD_weightvgmix.cc @@ -10,7 +10,7 @@ #include "BLI_listbase.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_defaults.h" #include "DNA_mesh_types.h" @@ -19,16 +19,19 @@ #include "DNA_object_types.h" #include "DNA_screen_types.h" +#include "BKE_context.hh" #include "BKE_customdata.hh" #include "BKE_deform.hh" #include "BKE_lib_query.hh" #include "BKE_mesh.hh" #include "BKE_modifier.hh" +#include "BKE_screen.hh" #include "BKE_texture.h" /* Texture masking. */ #include "UI_interface.hh" #include "UI_resources.hh" +#include "RNA_access.hh" #include "RNA_prototypes.h" #include "DEG_depsgraph_build.hh" @@ -36,6 +39,7 @@ #include "MEM_guardedalloc.h" +#include "MOD_modifiertypes.hh" #include "MOD_ui_common.hh" #include "MOD_util.hh" #include "MOD_weightvg_util.hh" diff --git a/source/blender/modifiers/intern/MOD_weightvgproximity.cc b/source/blender/modifiers/intern/MOD_weightvgproximity.cc index 6e100634a5c..43501a3689e 100644 --- a/source/blender/modifiers/intern/MOD_weightvgproximity.cc +++ b/source/blender/modifiers/intern/MOD_weightvgproximity.cc @@ -15,7 +15,7 @@ #include "BLI_rand.h" #include "BLI_task.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_color_types.h" /* CurveMapping. */ #include "DNA_defaults.h" @@ -27,12 +27,16 @@ #include "BKE_bvhutils.hh" #include "BKE_colortools.hh" /* CurveMapping. */ +#include "BKE_context.hh" +#include "BKE_curve.hh" #include "BKE_customdata.hh" #include "BKE_deform.hh" +#include "BKE_lib_id.hh" #include "BKE_lib_query.hh" #include "BKE_mesh.hh" #include "BKE_mesh_wrapper.hh" #include "BKE_modifier.hh" +#include "BKE_screen.hh" #include "BKE_texture.h" /* Texture masking. */ #include "UI_interface.hh" @@ -48,6 +52,7 @@ #include "MEM_guardedalloc.h" +#include "MOD_modifiertypes.hh" #include "MOD_ui_common.hh" #include "MOD_util.hh" #include "MOD_weightvg_util.hh" @@ -228,9 +233,9 @@ static void get_vert2ob_distance(int verts_num, while (i-- > 0) { /* Get world-coordinates of the vertex (constraints and anim included). */ - mul_v3_m4v3(v_wco, ob->object_to_world().ptr(), positions[indices ? indices[i] : i]); + mul_v3_m4v3(v_wco, ob->object_to_world, positions[indices ? indices[i] : i]); /* Return distance between both coordinates. */ - dist[i] = len_v3v3(v_wco, obr->object_to_world().location()); + dist[i] = len_v3v3(v_wco, obr->object_to_world[3]); } } @@ -240,7 +245,7 @@ static void get_vert2ob_distance(int verts_num, */ static float get_ob2ob_distance(const Object *ob, const Object *obr) { - return len_v3v3(ob->object_to_world().location(), obr->object_to_world().location()); + return len_v3v3(ob->object_to_world[3], obr->object_to_world[3]); } /** diff --git a/source/blender/modifiers/intern/MOD_weld.cc b/source/blender/modifiers/intern/MOD_weld.cc index 97a186ad7fc..1866de106f3 100644 --- a/source/blender/modifiers/intern/MOD_weld.cc +++ b/source/blender/modifiers/intern/MOD_weld.cc @@ -21,7 +21,7 @@ #include "BLI_span.hh" #include "BLI_vector.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_defaults.h" #include "DNA_mesh_types.h" diff --git a/source/blender/modifiers/intern/MOD_wireframe.cc b/source/blender/modifiers/intern/MOD_wireframe.cc index eb84d61b178..b00e11b6f8c 100644 --- a/source/blender/modifiers/intern/MOD_wireframe.cc +++ b/source/blender/modifiers/intern/MOD_wireframe.cc @@ -10,15 +10,17 @@ #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_defaults.h" #include "DNA_mesh_types.h" #include "DNA_object_types.h" #include "DNA_screen_types.h" +#include "BKE_context.hh" #include "BKE_deform.hh" #include "BKE_mesh.hh" +#include "BKE_screen.hh" #include "UI_interface.hh" #include "UI_resources.hh" diff --git a/source/blender/nodes/NOD_common.h b/source/blender/nodes/NOD_common.h index a8517f323a1..69cb7f60eb4 100644 --- a/source/blender/nodes/NOD_common.h +++ b/source/blender/nodes/NOD_common.h @@ -8,7 +8,7 @@ #pragma once -#include "BKE_node.hh" +#include "BKE_node.h" #ifdef __cplusplus extern "C" { diff --git a/source/blender/nodes/NOD_composite.hh b/source/blender/nodes/NOD_composite.hh index 4ceb90df1d3..4544c3a4fd0 100644 --- a/source/blender/nodes/NOD_composite.hh +++ b/source/blender/nodes/NOD_composite.hh @@ -8,14 +8,11 @@ #pragma once -#include "BKE_node.hh" +#include "BKE_node.h" namespace blender::realtime_compositor { class RenderContext; } -namespace blender::compositor { -class ProfilerData; -} struct bNodeTreeType; struct CryptomatteSession; @@ -44,8 +41,7 @@ void ntreeCompositExecTree(Render *render, bool rendering, int do_previews, const char *view_name, - blender::realtime_compositor::RenderContext *render_context, - blender::compositor::ProfilerData &profiler_data); + blender::realtime_compositor::RenderContext *render_context); /** * Called from render pipeline, to tag render input and output. diff --git a/source/blender/nodes/NOD_geometry.hh b/source/blender/nodes/NOD_geometry.hh index 081ef6eb15a..390592a5435 100644 --- a/source/blender/nodes/NOD_geometry.hh +++ b/source/blender/nodes/NOD_geometry.hh @@ -4,7 +4,7 @@ #pragma once -#include "BKE_node.hh" +#include "BKE_node.h" extern bNodeTreeType *ntreeType_Geometry; diff --git a/source/blender/nodes/NOD_geometry_exec.hh b/source/blender/nodes/NOD_geometry_exec.hh index b176b701585..954f5b6c90a 100644 --- a/source/blender/nodes/NOD_geometry_exec.hh +++ b/source/blender/nodes/NOD_geometry_exec.hh @@ -87,15 +87,8 @@ class GeoNodeExecParams { } template - static inline constexpr bool is_field_base_type_v = is_same_any_v; + static inline constexpr bool is_field_base_type_v = + is_same_any_v; template static inline constexpr bool stored_as_SocketValueVariant_v = diff --git a/source/blender/nodes/NOD_geometry_nodes_execute.hh b/source/blender/nodes/NOD_geometry_nodes_execute.hh index 204258fe091..df57d3e39f5 100644 --- a/source/blender/nodes/NOD_geometry_nodes_execute.hh +++ b/source/blender/nodes/NOD_geometry_nodes_execute.hh @@ -10,7 +10,7 @@ #include "BLI_set.hh" #include "BKE_idprop.hh" -#include "BKE_node.hh" +#include "BKE_node.h" struct bNodeTree; struct bNodeSocket; @@ -66,6 +66,7 @@ bke::GeometrySet execute_geometry_nodes_on_geometry(const bNodeTree &btree, void update_input_properties_from_node_tree(const bNodeTree &tree, const IDProperty *old_properties, + bool use_bool_for_use_attribute, IDProperty &properties); void update_output_properties_from_node_tree(const bNodeTree &tree, diff --git a/source/blender/nodes/NOD_geometry_nodes_log.hh b/source/blender/nodes/NOD_geometry_nodes_log.hh index 16682e3ccb0..b800663e643 100644 --- a/source/blender/nodes/NOD_geometry_nodes_log.hh +++ b/source/blender/nodes/NOD_geometry_nodes_log.hh @@ -33,7 +33,6 @@ #include "BLI_compute_context.hh" #include "BLI_enumerable_thread_specific.hh" #include "BLI_generic_pointer.hh" -#include "BLI_linear_allocator_chunked_list.hh" #include "BLI_multi_value_map.hh" #include "BKE_geometry_set.hh" @@ -208,13 +207,13 @@ class GeoTreeLogger { StringRefNull message; }; - linear_allocator::ChunkedList node_warnings; - linear_allocator::ChunkedList input_socket_values; - linear_allocator::ChunkedList output_socket_values; - linear_allocator::ChunkedList node_execution_times; - linear_allocator::ChunkedList viewer_node_logs; - linear_allocator::ChunkedList used_named_attributes; - linear_allocator::ChunkedList debug_messages; + Vector node_warnings; + Vector input_socket_values; + Vector output_socket_values; + Vector node_execution_times; + Vector viewer_node_logs; + Vector used_named_attributes; + Vector debug_messages; GeoTreeLogger(); ~GeoTreeLogger(); diff --git a/source/blender/nodes/NOD_node_declaration.hh b/source/blender/nodes/NOD_node_declaration.hh index 643f156d6a4..861aa99c67b 100644 --- a/source/blender/nodes/NOD_node_declaration.hh +++ b/source/blender/nodes/NOD_node_declaration.hh @@ -12,7 +12,7 @@ #include "BLI_utildefines.h" #include "BLI_vector.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_node_types.h" @@ -179,8 +179,6 @@ class SocketDeclaration : public ItemDeclaration { bool is_unavailable = false; bool is_attribute_name = false; bool is_default_link_socket = false; - /** Puts this socket on the same line as the previous one in the UI. */ - bool align_with_previous_socket = false; InputSocketFieldType input_field_type = InputSocketFieldType::None; OutputFieldDependency output_field_dependency; @@ -358,12 +356,6 @@ class BaseSocketDeclarationBuilder { */ BaseSocketDeclarationBuilder &make_available(std::function fn); - /** - * Puts this socket on the same row as the previous socket. This only works when one of them is - * an input and the other is an output. - */ - BaseSocketDeclarationBuilder &align_with_previous(bool value = true); - int input_index() const { BLI_assert(decl_in_base_ != nullptr); @@ -467,10 +459,6 @@ class NodeDeclaration { * outputs | buttons | inputs order. Panels are only supported when using custom socket order. */ bool use_custom_socket_order = false; - /** Usually output sockets come before input sockets currently. Only some specific nodes are - * exempt from that rule for now. */ - bool allow_any_socket_order = false; - /** * True if any context was used to build this declaration. */ @@ -533,7 +521,6 @@ class NodeDeclarationBuilder { void finalize(); void use_custom_socket_order(bool enable = true); - void allow_any_socket_order(bool enable = true); template typename DeclType::Builder &add_input(StringRef name, StringRef identifier = ""); diff --git a/source/blender/nodes/NOD_shader.h b/source/blender/nodes/NOD_shader.h index 6c41d1de260..c9d703fe28d 100644 --- a/source/blender/nodes/NOD_shader.h +++ b/source/blender/nodes/NOD_shader.h @@ -8,7 +8,7 @@ #pragma once -#include "BKE_node.hh" +#include "BKE_node.h" #ifdef __cplusplus extern "C" { diff --git a/source/blender/nodes/NOD_socket.hh b/source/blender/nodes/NOD_socket.hh index c9a9b99e9fd..c77a1db05b5 100644 --- a/source/blender/nodes/NOD_socket.hh +++ b/source/blender/nodes/NOD_socket.hh @@ -8,7 +8,7 @@ #pragma once -#include "BKE_node.hh" +#include "BKE_node.h" struct bNode; struct bNodeTree; diff --git a/source/blender/nodes/NOD_socket_declarations.hh b/source/blender/nodes/NOD_socket_declarations.hh index 339cec813d4..033584c4fe2 100644 --- a/source/blender/nodes/NOD_socket_declarations.hh +++ b/source/blender/nodes/NOD_socket_declarations.hh @@ -158,22 +158,6 @@ class RotationBuilder : public SocketDeclarationBuilder { RotationBuilder &default_value(const math::EulerXYZ &value); }; -class MatrixBuilder; - -class Matrix : public SocketDeclaration { - public: - friend MatrixBuilder; - - using Builder = MatrixBuilder; - - bNodeSocket &build(bNodeTree &ntree, bNode &node) const override; - bool matches(const bNodeSocket &socket) const override; - bNodeSocket &update_or_build(bNodeTree &ntree, bNode &node, bNodeSocket &socket) const override; - bool can_connect(const bNodeSocket &socket) const override; -}; - -class MatrixBuilder : public SocketDeclarationBuilder {}; - class StringBuilder; class String : public SocketDeclaration { diff --git a/source/blender/nodes/NOD_socket_items.hh b/source/blender/nodes/NOD_socket_items.hh index e016452f39d..5119d5203ae 100644 --- a/source/blender/nodes/NOD_socket_items.hh +++ b/source/blender/nodes/NOD_socket_items.hh @@ -20,7 +20,7 @@ #include "BLI_string.h" #include "BLI_string_utils.hh" -#include "BKE_node.hh" +#include "BKE_node.h" #include "BKE_node_runtime.hh" #include "DNA_array_utils.hh" diff --git a/source/blender/nodes/NOD_static_types.h b/source/blender/nodes/NOD_static_types.h index 7e84c785a89..7bbdd2dbad1 100644 --- a/source/blender/nodes/NOD_static_types.h +++ b/source/blender/nodes/NOD_static_types.h @@ -267,7 +267,6 @@ DefNode(FunctionNode, FN_NODE_AXIS_ANGLE_TO_ROTATION, 0, "AXIS_ANGLE_TO_ROTATION DefNode(FunctionNode, FN_NODE_BOOLEAN_MATH, 0, "BOOLEAN_MATH", BooleanMath, "Boolean Math", "") DefNode(FunctionNode, FN_NODE_COMBINE_COLOR, 0, "COMBINE_COLOR", CombineColor, "Combine Color", "") DefNode(FunctionNode, FN_NODE_QUATERNION_TO_ROTATION, 0, "QUATERNION_TO_ROTATION", QuaternionToRotation, "Quaternion to Rotation", "") -DefNode(FunctionNode, FN_NODE_COMBINE_TRANSFORM, 0, "COMBINE_TRANSFORM", CombineTransform, "Combine Transform", "") DefNode(FunctionNode, FN_NODE_COMPARE, 0, "COMPARE", Compare, "Compare", "") DefNode(FunctionNode, FN_NODE_EULER_TO_ROTATION, 0, "EULER_TO_ROTATION", EulerToRotation, "Euler to Rotation", "") DefNode(FunctionNode, FN_NODE_FLOAT_TO_INT, def_float_to_int, "FLOAT_TO_INT", FloatToInt, "Float to Integer", "") @@ -277,9 +276,7 @@ DefNode(FunctionNode, FN_NODE_INPUT_INT, def_fn_input_int, "INPUT_INT", InputInt DefNode(FunctionNode, FN_NODE_INPUT_SPECIAL_CHARACTERS, 0, "INPUT_SPECIAL_CHARACTERS", InputSpecialCharacters, "Special Characters", "") DefNode(FunctionNode, FN_NODE_INPUT_STRING, def_fn_input_string, "INPUT_STRING", InputString, "String", "") DefNode(FunctionNode, FN_NODE_INPUT_VECTOR, def_fn_input_vector, "INPUT_VECTOR", InputVector, "Vector", "") -DefNode(FunctionNode, FN_NODE_INVERT_MATRIX, 0, "INVERT_MATRIX", InvertMatrix, "Invert Matrix", "") DefNode(FunctionNode, FN_NODE_INVERT_ROTATION, 0, "INVERT_ROTATION", InvertRotation, "Invert Rotation", "") -DefNode(FunctionNode, FN_NODE_MATRIX_MULTIPLY, 0, "MATRIX_MULTIPLY", MatrixMultiply, "Multiply Matrices", "") DefNode(FunctionNode, FN_NODE_RANDOM_VALUE, def_fn_random_value, "RANDOM_VALUE", RandomValue, "Random Value", "") DefNode(FunctionNode, FN_NODE_REPLACE_STRING, 0, "REPLACE_STRING", ReplaceString, "Replace String", "") DefNode(FunctionNode, FN_NODE_ROTATE_EULER, def_fn_rotate_euler, "ROTATE_EULER", RotateEuler, "Rotate Euler", "") @@ -289,12 +286,8 @@ DefNode(FunctionNode, FN_NODE_ROTATION_TO_AXIS_ANGLE, 0, "ROTATION_TO_AXIS_ANGLE DefNode(FunctionNode, FN_NODE_ROTATION_TO_EULER, 0, "ROTATION_TO_EULER", RotationToEuler, "Rotation to Euler", "") DefNode(FunctionNode, FN_NODE_SEPARATE_COLOR, 0, "SEPARATE_COLOR", SeparateColor, "Separate Color", "") DefNode(FunctionNode, FN_NODE_ROTATION_TO_QUATERNION, 0, "ROTATION_TO_QUATERNION", RotationToQuaternion, "Rotation to Quaternion", "") -DefNode(FunctionNode, FN_NODE_SEPARATE_TRANSFORM, 0, "SEPARATE_TRANSFORM", SeparateTransform, "Separate Transform", "") DefNode(FunctionNode, FN_NODE_SLICE_STRING, 0, "SLICE_STRING", SliceString, "Slice String", "") DefNode(FunctionNode, FN_NODE_STRING_LENGTH, 0, "STRING_LENGTH", StringLength, "String Length", "") -DefNode(FunctionNode, FN_NODE_TRANSFORM_DIRECTION, 0, "TRANSFORM_DIRECTION", TransformDirection, "Transform Direction", "") -DefNode(FunctionNode, FN_NODE_TRANSFORM_POINT, 0, "TRANSFORM_POINT", TransformPoint, "Transform Point", "") -DefNode(FunctionNode, FN_NODE_TRANSPOSE_MATRIX, 0, "TRANSPOSE_MATRIX", TransposeMatrix, "Transpose Matrix", "") DefNode(FunctionNode, FN_NODE_VALUE_TO_STRING, 0, "VALUE_TO_STRING", ValueToString, "Value to String", "") DefNode(GeometryNode, GEO_NODE_ACCUMULATE_FIELD, 0, "ACCUMULATE_FIELD", AccumulateField, "Accumulate Field", "Add the values of an evaluated field together and output the running total for each element") @@ -326,7 +319,6 @@ DefNode(GeometryNode, GEO_NODE_CURVE_TOPOLOGY_CURVE_OF_POINT, 0, "CURVE_OF_POINT DefNode(GeometryNode, GEO_NODE_CURVE_TOPOLOGY_POINTS_OF_CURVE, 0, "POINTS_OF_CURVE", PointsOfCurve, "Points of Curve", "Retrieve a point index within a curve") DefNode(GeometryNode, GEO_NODE_DEFORM_CURVES_ON_SURFACE, 0, "DEFORM_CURVES_ON_SURFACE", DeformCurvesOnSurface, "Deform Curves on Surface", "Translate and rotate curves based on changes between the object's original and evaluated surface mesh") DefNode(GeometryNode, GEO_NODE_DELETE_GEOMETRY, 0, "DELETE_GEOMETRY", DeleteGeometry, "Delete Geometry", "Remove selected elements of a geometry") -DefNode(GeometryNode, GEO_NODE_DISTRIBUTE_POINTS_IN_GRID, 0, "DISTRIBUTE_POINTS_IN_GRID", DistributePointsInGrid, "Distribute Points in Grid", "Generate points inside a volume grid") DefNode(GeometryNode, GEO_NODE_DISTRIBUTE_POINTS_IN_VOLUME, 0, "DISTRIBUTE_POINTS_IN_VOLUME", DistributePointsInVolume, "Distribute Points in Volume", "Generate points inside a volume") DefNode(GeometryNode, GEO_NODE_DISTRIBUTE_POINTS_ON_FACES, def_geo_distribute_points_on_faces, "DISTRIBUTE_POINTS_ON_FACES", DistributePointsOnFaces, "Distribute Points on Faces", "Generate points spread out on the surface of a mesh") DefNode(GeometryNode, GEO_NODE_DUAL_MESH, 0, "DUAL_MESH", DualMesh, "Dual Mesh", "Convert Faces into vertices and vertices into faces") @@ -342,17 +334,14 @@ DefNode(GeometryNode, GEO_NODE_FILLET_CURVE, 0, "FILLET_CURVE", FilletCurve, "Fi DefNode(GeometryNode, GEO_NODE_FLIP_FACES, 0, "FLIP_FACES", FlipFaces, "Flip Faces", "Reverse the order of the vertices and edges of selected faces, flipping their normal direction") DefNode(GeometryNode, GEO_NODE_GEOMETRY_TO_INSTANCE, 0, "GEOMETRY_TO_INSTANCE", GeometryToInstance, "Geometry to Instance", "Convert each input geometry into an instance, which can be much faster than the Join Geometry node when the inputs are large") DefNode(GeometryNode, GEO_NODE_GET_NAMED_GRID, 0, "GET_NAMED_GRID", GetNamedGrid, "Get Named Grid", "Get volume grid from a volume geometry with the specified name") -DefNode(GeometryNode, GEO_NODE_GRID_TO_MESH, 0, "GRID_TO_MESH", GridToMesh, "Grid to Mesh", "Generate a mesh on the \"surface\" of a volume grid") DefNode(GeometryNode, GEO_NODE_IMAGE_INFO, 0, "IMAGE_INFO", ImageInfo, "Image Info", "Retrieve information about an image") DefNode(GeometryNode, GEO_NODE_IMAGE_TEXTURE, def_geo_image_texture, "IMAGE_TEXTURE", ImageTexture, "Image Texture", "Sample values from an image texture") -DefNode(GeometryNode, GEO_NODE_IMAGE, def_geo_image, "IMAGE", InputImage, "Image", "Input image") DefNode(GeometryNode, GEO_NODE_INDEX_OF_NEAREST, 0, "INDEX_OF_NEAREST", IndexOfNearest, "Index of Nearest", "Find the nearest element in a group. Similar to the \"Sample Nearest\" node") DefNode(GeometryNode, GEO_NODE_INDEX_SWITCH, def_geo_index_switch, "INDEX_SWITCH", IndexSwitch, "Index Switch", "Choose between an arbitrary number of values with an index") +DefNode(GeometryNode, GEO_NODE_IMAGE, def_geo_image, "IMAGE", InputImage, "Image", "Input image") DefNode(GeometryNode, GEO_NODE_INPUT_ACTIVE_CAMERA, 0, "INPUT_ACTIVE_CAMERA", InputActiveCamera, "Active Camera", "Retrieve the scene's active camera") DefNode(GeometryNode, GEO_NODE_INPUT_CURVE_HANDLES, 0, "INPUT_CURVE_HANDLES", InputCurveHandlePositions, "Curve Handle Positions", "Retrieve the position of each Bézier control point's handles") DefNode(GeometryNode, GEO_NODE_INPUT_CURVE_TILT, 0, "INPUT_CURVE_TILT", InputCurveTilt, "Curve Tilt", "Retrieve the angle at each control point used to twist the curve's normal around its tangent") -DefNode(GeometryNode, GEO_NODE_INPUT_EDGE_SMOOTH, 0, "INPUT_EDGE_SMOOTH", InputEdgeSmooth, "Is Edge Smooth", "Retrieve whether each edge is marked for smooth or split normals") -DefNode(GeometryNode, GEO_NODE_INPUT_FACE_SMOOTH, 0, "INPUT_SHADE_SMOOTH", InputShadeSmooth, "Is Face Smooth", "Retrieve whether each face is marked for smooth or sharp normals") DefNode(GeometryNode, GEO_NODE_INPUT_ID, 0, "INPUT_ID", InputID, "ID", "Retrieve a stable random identifier value from the \"id\" attribute on the point domain, or the index if the attribute does not exist") DefNode(GeometryNode, GEO_NODE_INPUT_INDEX, 0, "INDEX", InputIndex, "Index", "Retrieve an integer value indicating the position of each element in the list, starting at zero") DefNode(GeometryNode, GEO_NODE_INPUT_INSTANCE_ROTATION, 0, "INPUT_INSTANCE_ROTATION", InputInstanceRotation, "Instance Rotation", "Retrieve the rotation of each instance in the geometry") @@ -373,6 +362,7 @@ DefNode(GeometryNode, GEO_NODE_INPUT_NORMAL, 0, "INPUT_NORMAL", InputNormal, "No DefNode(GeometryNode, GEO_NODE_INPUT_POSITION, 0, "POSITION", InputPosition, "Position", "Retrieve a vector indicating the location of each element") DefNode(GeometryNode, GEO_NODE_INPUT_RADIUS, 0, "INPUT_RADIUS", InputRadius, "Radius", "Retrieve the radius at each point on curve or point cloud geometry") DefNode(GeometryNode, GEO_NODE_INPUT_SCENE_TIME, 0, "INPUT_SCENE_TIME", InputSceneTime, "Scene Time", "Retrieve the current time in the scene's animation in units of seconds or frames") +DefNode(GeometryNode, GEO_NODE_INPUT_FACE_SMOOTH, 0, "INPUT_SHADE_SMOOTH", InputShadeSmooth, "Is Face Smooth", "Retrieve whether each face is marked for smooth or sharp normals") DefNode(GeometryNode, GEO_NODE_INPUT_SHORTEST_EDGE_PATHS, 0, "SHORTEST_EDGE_PATHS", InputShortestEdgePaths, "Shortest Edge Paths", "Find the shortest paths along mesh edges to selected end vertices, with customizable cost per edge") DefNode(GeometryNode, GEO_NODE_INPUT_SPLINE_CYCLIC, 0, "INPUT_SPLINE_CYCLIC",InputSplineCyclic, "Is Spline Cyclic", "Retrieve whether each spline endpoint connects to the beginning") DefNode(GeometryNode, GEO_NODE_INPUT_SPLINE_LENGTH, 0, "SPLINE_LENGTH", SplineLength, "Spline Length", "Retrieve the total length of each spline, as a distance or as a number of points") @@ -380,7 +370,6 @@ DefNode(GeometryNode, GEO_NODE_INPUT_SPLINE_RESOLUTION, 0, "INPUT_SPLINE_RESOLUT DefNode(GeometryNode, GEO_NODE_INPUT_TANGENT, 0, "INPUT_TANGENT", InputTangent, "Curve Tangent", "Retrieve the direction of curves at each control point") DefNode(GeometryNode, GEO_NODE_INSTANCE_ON_POINTS, 0, "INSTANCE_ON_POINTS", InstanceOnPoints, "Instance on Points", "Generate a reference to geometry at each of the input points, without duplicating its underlying data") DefNode(GeometryNode, GEO_NODE_INSTANCES_TO_POINTS, 0, "INSTANCES_TO_POINTS",InstancesToPoints, "Instances to Points", "Generate points at the origins of instances.\nNote: Nested instances are not affected by this node") -DefNode(GeometryNode, GEO_NODE_INTERPOLATE_CURVES, 0, "INTERPOLATE_CURVES", InterpolateCurves, "Interpolate Curves", "Generate new curves on points by interpolating between existing curves") DefNode(GeometryNode, GEO_NODE_IS_VIEWPORT, 0, "IS_VIEWPORT", IsViewport, "Is Viewport", "Retrieve whether the nodes are being evaluated for the viewport rather than the final render") DefNode(GeometryNode, GEO_NODE_JOIN_GEOMETRY, 0, "JOIN_GEOMETRY", JoinGeometry, "Join Geometry", "Merge separately generated geometries into a single one") DefNode(GeometryNode, GEO_NODE_MATERIAL_SELECTION, 0, "MATERIAL_SELECTION", MaterialSelection, "Material Selection", "Provide a selection of faces that use the specified material") @@ -397,9 +386,7 @@ DefNode(GeometryNode, GEO_NODE_MESH_PRIMITIVE_ICO_SPHERE, 0, "MESH_PRIMITIVE_ICO DefNode(GeometryNode, GEO_NODE_MESH_PRIMITIVE_LINE, 0, "MESH_PRIMITIVE_LINE",MeshLine, "Mesh Line", "Generate vertices in a line and connect them with edges") DefNode(GeometryNode, GEO_NODE_MESH_PRIMITIVE_UV_SPHERE, 0, "MESH_PRIMITIVE_UV_SPHERE", MeshUVSphere, "UV Sphere", "Generate a spherical mesh with quads, except for triangles at the top and bottom") DefNode(GeometryNode, GEO_NODE_MESH_TO_CURVE, 0, "MESH_TO_CURVE", MeshToCurve, "Mesh to Curve", "Generate a curve from a mesh") -DefNode(GeometryNode, GEO_NODE_MESH_TO_DENSITY_GRID, 0, "MESH_TO_DENSITY_GRID", MeshToDensityGrid, "Mesh to Density Grid", "Create a filled volume grid from a mesh") DefNode(GeometryNode, GEO_NODE_MESH_TO_POINTS, 0, "MESH_TO_POINTS", MeshToPoints, "Mesh to Points", "Generate a point cloud from a mesh's vertices") -DefNode(GeometryNode, GEO_NODE_MESH_TO_SDF_GRID, 0, "MESH_TO_SDF_GRID", MeshToSDFGrid, "Mesh to SDF Grid", "Create a signed distance volume grid from a mesh") DefNode(GeometryNode, GEO_NODE_MESH_TO_VOLUME, 0, "MESH_TO_VOLUME", MeshToVolume, "Mesh to Volume", "Create a fog volume with the shape of the input mesh's surface") DefNode(GeometryNode, GEO_NODE_MESH_TOPOLOGY_CORNERS_OF_EDGE, 0, "CORNERS_OF_EDGE", CornersOfEdge, "Corners of Edge", "Retrieve face corners connected to edges") DefNode(GeometryNode, GEO_NODE_MESH_TOPOLOGY_CORNERS_OF_FACE, 0, "CORNERS_OF_FACE", CornersOfFace, "Corners of Face", "Retrieve corners that make up a face") @@ -411,8 +398,11 @@ DefNode(GeometryNode, GEO_NODE_MESH_TOPOLOGY_OFFSET_CORNER_IN_FACE, 0, "OFFSET_C DefNode(GeometryNode, GEO_NODE_MESH_TOPOLOGY_VERTEX_OF_CORNER, 0, "VERTEX_OF_CORNER", VertexOfCorner, "Vertex of Corner", "Retrieve the vertex each face corner is attached to") DefNode(GeometryNode, GEO_NODE_OBJECT_INFO, 0, "OBJECT_INFO", ObjectInfo, "Object Info", "Retrieve information from an object") DefNode(GeometryNode, GEO_NODE_OFFSET_POINT_IN_CURVE, 0, "OFFSET_POINT_IN_CURVE", OffsetPointInCurve, "Offset Point in Curve", "Offset a control point index within its curve") -DefNode(GeometryNode, GEO_NODE_POINTS_TO_CURVES, 0, "POINTS_TO_CURVES", PointsToCurves, "Points to Curves", "Split all points to curve by its group ID and reorder by weight") -DefNode(GeometryNode, GEO_NODE_POINTS_TO_SDF_GRID, 0, "POINTS_TO_SDF_GRID", PointsToSDFGrid, "Points to SDF Grid", "Create a signed distance volume grid from points") +DefNode(GeometryNode, GEO_NODE_TOOL_FACE_SET, 0, "TOOL_FACE_SET", ToolFaceSet, "Face Set", "Each face's sculpt face set value") +DefNode(GeometryNode, GEO_NODE_TOOL_3D_CURSOR, 0, "TOOL_3D_CURSOR", Tool3DCursor, "3D Cursor", "The scene's 3D cursor location and rotation") +DefNode(GeometryNode, GEO_NODE_TOOL_SELECTION, 0, "TOOL_SELECTION", ToolSelection, "Selection", "User selection of the edited geometry, for tool execution") +DefNode(GeometryNode, GEO_NODE_TOOL_SET_SELECTION, 0, "TOOL_SELECTION_SET", ToolSetSelection, "Set Selection", "Set selection of the edited geometry, for tool execution") +DefNode(GeometryNode, GEO_NODE_TOOL_SET_FACE_SET, 0, "TOOL_SET_FACE_SET", ToolSetFaceSet, "Set Face Set", "Set sculpt face set values for faces") DefNode(GeometryNode, GEO_NODE_POINTS_TO_VERTICES, 0, "POINTS_TO_VERTICES", PointsToVertices, "Points to Vertices", "Generate a mesh vertex for each point cloud point") DefNode(GeometryNode, GEO_NODE_POINTS_TO_VOLUME, 0, "POINTS_TO_VOLUME", PointsToVolume, "Points to Volume", "Generate a fog volume sphere around every point") DefNode(GeometryNode, GEO_NODE_POINTS, 0, "POINTS", Points, "Points", "Generate a point cloud with positions and radii defined by fields") @@ -427,7 +417,6 @@ DefNode(GeometryNode, GEO_NODE_RESAMPLE_CURVE, 0, "RESAMPLE_CURVE", ResampleCurv DefNode(GeometryNode, GEO_NODE_REVERSE_CURVE, 0, "REVERSE_CURVE", ReverseCurve, "Reverse Curve", "Change the direction of curves by swapping their start and end data") DefNode(GeometryNode, GEO_NODE_ROTATE_INSTANCES, 0, "ROTATE_INSTANCES", RotateInstances, "Rotate Instances", "Rotate geometry instances in local or global space") DefNode(GeometryNode, GEO_NODE_SAMPLE_CURVE, def_geo_curve_sample, "SAMPLE_CURVE", SampleCurve, "Sample Curve", "Retrieve data from a point on a curve at a certain distance from its start") -DefNode(GeometryNode, GEO_NODE_SAMPLE_GRID, 0, "SAMPLE_GRID", SampleGrid, "Sample Grid", "") DefNode(GeometryNode, GEO_NODE_SAMPLE_INDEX, def_geo_sample_index, "SAMPLE_INDEX", SampleIndex, "Sample Index", "Retrieve values from specific geometry elements") DefNode(GeometryNode, GEO_NODE_SAMPLE_NEAREST_SURFACE, 0, "SAMPLE_NEAREST_SURFACE", SampleNearestSurface, "Sample Nearest Surface", "Calculate the interpolated value of a mesh attribute on the closest point of its surface") DefNode(GeometryNode, GEO_NODE_SAMPLE_NEAREST, 0, "SAMPLE_NEAREST", SampleNearest, "Sample Nearest", "Find the element of a geometry closest to a position. Similar to the \"Index of Nearest\" node") @@ -452,8 +441,8 @@ DefNode(GeometryNode, GEO_NODE_SET_SPLINE_RESOLUTION, 0, "SET_SPLINE_RESOLUTION" DefNode(GeometryNode, GEO_NODE_SIMULATION_INPUT, def_geo_simulation_input, "SIMULATION_INPUT", SimulationInput, "Simulation Input", "Input data for the simulation zone") DefNode(GeometryNode, GEO_NODE_SIMULATION_OUTPUT, def_geo_simulation_output, "SIMULATION_OUTPUT", SimulationOutput, "Simulation Output", "Output data from the simulation zone") DefNode(GeometryNode, GEO_NODE_SORT_ELEMENTS, 0, "SORT_ELEMENTS", SortElements, "Sort Elements", "Rearrange geometry elements, changing their indices") -DefNode(GeometryNode, GEO_NODE_SPLIT_EDGES, 0, "SPLIT_EDGES", SplitEdges, "Split Edges", "Duplicate mesh edges and break connections with the surrounding faces") DefNode(GeometryNode, GEO_NODE_SPLIT_TO_INSTANCES, 0, "Split to Instances", SplitToInstances, "Split to Instances", "Create separate geometries containing the elements from the same group") +DefNode(GeometryNode, GEO_NODE_SPLIT_EDGES, 0, "SPLIT_EDGES", SplitEdges, "Split Edges", "Duplicate mesh edges and break connections with the surrounding faces") DefNode(GeometryNode, GEO_NODE_STORE_NAMED_ATTRIBUTE, 0, "STORE_NAMED_ATTRIBUTE", StoreNamedAttribute, "Store Named Attribute", "Store the result of a field on a geometry as an attribute with the specified name") DefNode(GeometryNode, GEO_NODE_STORE_NAMED_GRID, 0, "STORE_NAMED_GRID", StoreNamedGrid, "Store Named Grid", "Store grid data in a volume geometry with the specified name") DefNode(GeometryNode, GEO_NODE_STRING_JOIN, 0, "STRING_JOIN", StringJoin, "Join Strings", "Combine any number of input strings") @@ -462,11 +451,6 @@ DefNode(GeometryNode, GEO_NODE_SUBDIVIDE_CURVE, 0, "SUBDIVIDE_CURVE", SubdivideC DefNode(GeometryNode, GEO_NODE_SUBDIVIDE_MESH, 0, "SUBDIVIDE_MESH", SubdivideMesh, "Subdivide Mesh", "Divide mesh faces into smaller ones without changing the shape or volume, using linear interpolation to place the new vertices") DefNode(GeometryNode, GEO_NODE_SUBDIVISION_SURFACE, 0, "SUBDIVISION_SURFACE",SubdivisionSurface, "Subdivision Surface", "Divide mesh faces to form a smooth surface, using the Catmull-Clark subdivision method") DefNode(GeometryNode, GEO_NODE_SWITCH, 0, "SWITCH", Switch, "Switch", "Switch between two inputs") -DefNode(GeometryNode, GEO_NODE_TOOL_3D_CURSOR, 0, "TOOL_3D_CURSOR", Tool3DCursor, "3D Cursor", "The scene's 3D cursor location and rotation") -DefNode(GeometryNode, GEO_NODE_TOOL_FACE_SET, 0, "TOOL_FACE_SET", ToolFaceSet, "Face Set", "Each face's sculpt face set value") -DefNode(GeometryNode, GEO_NODE_TOOL_SELECTION, 0, "TOOL_SELECTION", ToolSelection, "Selection", "User selection of the edited geometry, for tool execution") -DefNode(GeometryNode, GEO_NODE_TOOL_SET_FACE_SET, 0, "TOOL_SET_FACE_SET", ToolSetFaceSet, "Set Face Set", "Set sculpt face set values for faces") -DefNode(GeometryNode, GEO_NODE_TOOL_SET_SELECTION, 0, "TOOL_SELECTION_SET", ToolSetSelection, "Set Selection", "Set selection of the edited geometry, for tool execution") DefNode(GeometryNode, GEO_NODE_TRANSFORM_GEOMETRY, 0, "TRANSFORM_GEOMETRY", Transform, "Transform Geometry", "Translate, rotate or scale the geometry") DefNode(GeometryNode, GEO_NODE_TRANSLATE_INSTANCES, 0, "TRANSLATE_INSTANCES",TranslateInstances, "Translate Instances", "Move top-level geometry instances in local or global space") DefNode(GeometryNode, GEO_NODE_TRIANGULATE, 0, "TRIANGULATE", Triangulate, "Triangulate", "Convert all faces in a mesh to triangular faces") @@ -477,6 +461,10 @@ DefNode(GeometryNode, GEO_NODE_VIEWER, 0, "VIEWER", Viewer, "Viewer", "Display t DefNode(GeometryNode, GEO_NODE_VOLUME_CUBE, 0, "VOLUME_CUBE", VolumeCube, "Volume Cube", "Generate a dense volume with a field that controls the density at each grid voxel based on its position") DefNode(GeometryNode, GEO_NODE_VOLUME_TO_MESH, 0, "VOLUME_TO_MESH", VolumeToMesh, "Volume to Mesh", "Generate a mesh on the \"surface\" of a volume") +DefNode(GeometryNode, GEO_NODE_INTERPOLATE_CURVES, 0, "INTERPOLATE_CURVES", InterpolateCurves, "Interpolate Curves", "Generate new curves on points by interpolating between existing curves") +DefNode(GeometryNode, GEO_NODE_POINTS_TO_CURVES, 0, "POINTS_TO_CURVES", PointsToCurves, "Points to Curves", "Split all points to curve by its group ID and reorder by weight") +DefNode(GeometryNode, GEO_NODE_INPUT_EDGE_SMOOTH, 0, "INPUT_EDGE_SMOOTH", InputEdgeSmooth, "Is Edge Smooth", "Retrieve whether each edge is marked for smooth or split normals") + /* undefine macros */ #undef DefNode diff --git a/source/blender/nodes/NOD_texture.h b/source/blender/nodes/NOD_texture.h index 976f0900850..b2ea0068753 100644 --- a/source/blender/nodes/NOD_texture.h +++ b/source/blender/nodes/NOD_texture.h @@ -8,7 +8,7 @@ #pragma once -#include "BKE_node.hh" +#include "BKE_node.h" #ifdef __cplusplus extern "C" { diff --git a/source/blender/nodes/NOD_zone_socket_items.hh b/source/blender/nodes/NOD_zone_socket_items.hh index 6c2dbf1fab4..bb66249ff1a 100644 --- a/source/blender/nodes/NOD_zone_socket_items.hh +++ b/source/blender/nodes/NOD_zone_socket_items.hh @@ -51,16 +51,12 @@ struct SimulationItemsAccessor { } static bool supports_socket_type(const eNodeSocketDatatype socket_type) { - if (socket_type == SOCK_MATRIX) { - return U.experimental.use_new_matrix_socket; - } return ELEM(socket_type, SOCK_FLOAT, SOCK_VECTOR, SOCK_RGBA, SOCK_BOOLEAN, SOCK_ROTATION, - SOCK_MATRIX, SOCK_INT, SOCK_STRING, SOCK_GEOMETRY); @@ -119,16 +115,12 @@ struct RepeatItemsAccessor { } static bool supports_socket_type(const eNodeSocketDatatype socket_type) { - if (socket_type == SOCK_MATRIX) { - return U.experimental.use_new_matrix_socket; - } return ELEM(socket_type, SOCK_FLOAT, SOCK_VECTOR, SOCK_RGBA, SOCK_BOOLEAN, SOCK_ROTATION, - SOCK_MATRIX, SOCK_INT, SOCK_STRING, SOCK_GEOMETRY, diff --git a/source/blender/nodes/composite/node_composite_tree.cc b/source/blender/nodes/composite/node_composite_tree.cc index b6a0c18f2c3..022eafd75e3 100644 --- a/source/blender/nodes/composite/node_composite_tree.cc +++ b/source/blender/nodes/composite/node_composite_tree.cc @@ -15,7 +15,7 @@ #include "DNA_scene_types.h" #include "BKE_context.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_image.h" #include "BKE_main.hh" #include "BKE_node.hh" @@ -26,7 +26,9 @@ #include "UI_resources.hh" #include "node_common.h" +#include "node_util.hh" +#include "RNA_access.hh" #include "RNA_prototypes.h" #include "NOD_composite.hh" @@ -178,13 +180,12 @@ void ntreeCompositExecTree(Render *render, bool rendering, int do_preview, const char *view_name, - blender::realtime_compositor::RenderContext *render_context, - blender::compositor::ProfilerData &profiler_data) + blender::realtime_compositor::RenderContext *render_context) { #ifdef WITH_COMPOSITOR_CPU - COM_execute(render, rd, scene, ntree, rendering, view_name, render_context, profiler_data); + COM_execute(render, rd, scene, ntree, rendering, view_name, render_context); #else - UNUSED_VARS(render, scene, ntree, rd, rendering, view_name, render_context, profiler_data); + UNUSED_VARS(render, scene, ntree, rd, rendering, view_name, render_context); #endif UNUSED_VARS(do_preview); @@ -210,7 +211,7 @@ void ntreeCompositTagRender(Scene *scene) /* XXX Think using G_MAIN here is valid, since you want to update current file's scene nodes, * not the ones in temp main generated for rendering? * This is still rather weak though, - * ideally render struct would store its own main AND original G_MAIN. */ + * ideally render struct would store own main AND original G_MAIN. */ for (Scene *sce_iter = (Scene *)G_MAIN->scenes.first; sce_iter; sce_iter = (Scene *)sce_iter->id.next) diff --git a/source/blender/nodes/composite/nodes/node_composite_antialiasing.cc b/source/blender/nodes/composite/nodes/node_composite_antialiasing.cc index 06040bc1e7e..c3e059cc7b9 100644 --- a/source/blender/nodes/composite/nodes/node_composite_antialiasing.cc +++ b/source/blender/nodes/composite/nodes/node_composite_antialiasing.cc @@ -77,7 +77,7 @@ class AntiAliasingOperation : public NodeOperation { * algorithm expects it in the [0, 10] range. */ float get_local_contrast_adaptation_factor() { - return node_storage(bnode()).contrast_limit * 10.0f; + return node_storage(bnode()).threshold * 10.0f; } /* Blender encodes the corner rounding factor in the float [0, 1] range, while the SMAA algorithm diff --git a/source/blender/nodes/composite/nodes/node_composite_blur.cc b/source/blender/nodes/composite/nodes/node_composite_blur.cc index 6226bd5fc4e..3ee31b3d5d0 100644 --- a/source/blender/nodes/composite/nodes/node_composite_blur.cc +++ b/source/blender/nodes/composite/nodes/node_composite_blur.cc @@ -17,6 +17,7 @@ #include "UI_resources.hh" #include "GPU_shader.h" +#include "GPU_state.h" #include "GPU_texture.h" #include "COM_algorithm_symmetric_separable_blur.hh" @@ -250,8 +251,9 @@ class BlurOperation : public NodeOperation { return true; } - /* Only Gaussian filters are separable. The rest is not. */ + /* Both Box and Gaussian filters are separable. The rest is not. */ switch (node_storage(bnode()).filtertype) { + case R_FILTER_BOX: case R_FILTER_GAUSS: case R_FILTER_FAST_GAUSS: return true; diff --git a/source/blender/nodes/composite/nodes/node_composite_bokehblur.cc b/source/blender/nodes/composite/nodes/node_composite_bokehblur.cc index ed47c8a498b..59553de78b8 100644 --- a/source/blender/nodes/composite/nodes/node_composite_bokehblur.cc +++ b/source/blender/nodes/composite/nodes/node_composite_bokehblur.cc @@ -14,7 +14,6 @@ #include "GPU_texture.h" -#include "COM_algorithm_parallel_reduction.hh" #include "COM_node_operation.hh" #include "COM_utilities.hh" @@ -118,13 +117,11 @@ class BokehBlurOperation : public NodeOperation { void execute_variable_size() { - const int search_radius = compute_variable_size_search_radius(); - GPUShader *shader = context().get_shader("compositor_bokeh_blur_variable_size"); GPU_shader_bind(shader); GPU_shader_uniform_1f(shader, "base_size", compute_blur_radius()); - GPU_shader_uniform_1i(shader, "search_radius", search_radius); + GPU_shader_uniform_1i(shader, "search_radius", get_max_size()); const Result &input_image = get_input("Image"); input_image.bind_as_texture(shader, "input_tx"); @@ -153,15 +150,6 @@ class BokehBlurOperation : public NodeOperation { input_mask.unbind_as_texture(); } - int compute_variable_size_search_radius() - { - const Result &input_size = get_input("Size"); - const float maximum_size = maximum_float(context(), input_size.texture()); - - const float base_size = compute_blur_radius(); - return math::clamp(int(maximum_size * base_size), 0, get_max_size()); - } - float compute_blur_radius() { const int2 image_size = get_input("Image").domain().size; diff --git a/source/blender/nodes/composite/nodes/node_composite_bokehimage.cc b/source/blender/nodes/composite/nodes/node_composite_bokehimage.cc index 17eb50f03d1..436c49f6c1e 100644 --- a/source/blender/nodes/composite/nodes/node_composite_bokehimage.cc +++ b/source/blender/nodes/composite/nodes/node_composite_bokehimage.cc @@ -16,6 +16,7 @@ #include "COM_bokeh_kernel.hh" #include "COM_node_operation.hh" +#include "COM_utilities.hh" #include "node_composite_util.hh" diff --git a/source/blender/nodes/composite/nodes/node_composite_boxmask.cc b/source/blender/nodes/composite/nodes/node_composite_boxmask.cc index 8c4973c1c8d..4caaaa80632 100644 --- a/source/blender/nodes/composite/nodes/node_composite_boxmask.cc +++ b/source/blender/nodes/composite/nodes/node_composite_boxmask.cc @@ -61,10 +61,8 @@ static void node_composit_buts_boxmask(uiLayout *layout, bContext * /*C*/, Point uiItemR(row, ptr, "y", UI_ITEM_R_SPLIT_EMPTY_NAME, nullptr, ICON_NONE); row = uiLayoutRow(layout, true); - uiItemR( - row, ptr, "mask_width", UI_ITEM_R_SPLIT_EMPTY_NAME | UI_ITEM_R_SLIDER, nullptr, ICON_NONE); - uiItemR( - row, ptr, "mask_height", UI_ITEM_R_SPLIT_EMPTY_NAME | UI_ITEM_R_SLIDER, nullptr, ICON_NONE); + uiItemR(row, ptr, "width", UI_ITEM_R_SPLIT_EMPTY_NAME | UI_ITEM_R_SLIDER, nullptr, ICON_NONE); + uiItemR(row, ptr, "height", UI_ITEM_R_SPLIT_EMPTY_NAME | UI_ITEM_R_SLIDER, nullptr, ICON_NONE); uiItemR(layout, ptr, "rotation", UI_ITEM_R_SPLIT_EMPTY_NAME, nullptr, ICON_NONE); uiItemR(layout, ptr, "mask_type", UI_ITEM_R_SPLIT_EMPTY_NAME, nullptr, ICON_NONE); diff --git a/source/blender/nodes/composite/nodes/node_composite_composite.cc b/source/blender/nodes/composite/nodes/node_composite_composite.cc index cac7a12e9df..1b5a455f0d6 100644 --- a/source/blender/nodes/composite/nodes/node_composite_composite.cc +++ b/source/blender/nodes/composite/nodes/node_composite_composite.cc @@ -12,6 +12,7 @@ #include "UI_resources.hh" #include "GPU_shader.h" +#include "GPU_state.h" #include "GPU_texture.h" #include "COM_node_operation.hh" @@ -91,9 +92,7 @@ class CompositeOperation : public NodeOperation { * that compositing region. */ const rcti compositing_region = context().get_compositing_region(); const int2 lower_bound = int2(compositing_region.xmin, compositing_region.ymin); - const int2 upper_bound = int2(compositing_region.xmax, compositing_region.ymax); GPU_shader_uniform_2iv(shader, "lower_bound", lower_bound); - GPU_shader_uniform_2iv(shader, "upper_bound", upper_bound); const Result &image = get_input("Image"); image.bind_as_texture(shader, "input_tx"); @@ -121,9 +120,7 @@ class CompositeOperation : public NodeOperation { * that compositing region. */ const rcti compositing_region = context().get_compositing_region(); const int2 lower_bound = int2(compositing_region.xmin, compositing_region.ymin); - const int2 upper_bound = int2(compositing_region.xmax, compositing_region.ymax); GPU_shader_uniform_2iv(shader, "lower_bound", lower_bound); - GPU_shader_uniform_2iv(shader, "upper_bound", upper_bound); const Result &image = get_input("Image"); image.bind_as_texture(shader, "input_tx"); @@ -151,9 +148,7 @@ class CompositeOperation : public NodeOperation { * that compositing region. */ const rcti compositing_region = context().get_compositing_region(); const int2 lower_bound = int2(compositing_region.xmin, compositing_region.ymin); - const int2 upper_bound = int2(compositing_region.xmax, compositing_region.ymax); GPU_shader_uniform_2iv(shader, "lower_bound", lower_bound); - GPU_shader_uniform_2iv(shader, "upper_bound", upper_bound); const Result &image = get_input("Image"); image.bind_as_texture(shader, "input_tx"); diff --git a/source/blender/nodes/composite/nodes/node_composite_convert_color_space.cc b/source/blender/nodes/composite/nodes/node_composite_convert_color_space.cc index fdbb4010913..9275c2eab34 100644 --- a/source/blender/nodes/composite/nodes/node_composite_convert_color_space.cc +++ b/source/blender/nodes/composite/nodes/node_composite_convert_color_space.cc @@ -6,6 +6,8 @@ * \ingroup cmpnodes */ +#include "RNA_access.hh" + #include "BLI_string.h" #include "UI_interface.hh" diff --git a/source/blender/nodes/composite/nodes/node_composite_cornerpin.cc b/source/blender/nodes/composite/nodes/node_composite_cornerpin.cc index 609d3b40336..4b36639cc18 100644 --- a/source/blender/nodes/composite/nodes/node_composite_cornerpin.cc +++ b/source/blender/nodes/composite/nodes/node_composite_cornerpin.cc @@ -15,7 +15,6 @@ #include "BKE_tracking.h" -#include "COM_algorithm_smaa.hh" #include "COM_node_operation.hh" #include "COM_utilities.hh" @@ -76,71 +75,31 @@ class CornerPinOperation : public NodeOperation { return; } - Result plane_mask = compute_plane_mask(homography_matrix); - Result anti_aliased_plane_mask = context().create_temporary_result(ResultType::Float); - smaa(context(), plane_mask, anti_aliased_plane_mask); - plane_mask.release(); - - if (output_image.should_compute()) { - compute_plane(homography_matrix, anti_aliased_plane_mask); - } - - if (output_mask.should_compute()) { - output_mask.steal_data(anti_aliased_plane_mask); - } - else { - anti_aliased_plane_mask.release(); - } - } - - void compute_plane(const float3x3 &homography_matrix, Result &plane_mask) - { GPUShader *shader = context().get_shader("compositor_plane_deform"); GPU_shader_bind(shader); GPU_shader_uniform_mat3_as_mat4(shader, "homography_matrix", homography_matrix.ptr()); - Result &input_image = get_input("Image"); GPU_texture_mipmap_mode(input_image.texture(), true, true); GPU_texture_anisotropic_filter(input_image.texture(), true); - GPU_texture_extend_mode(input_image.texture(), GPU_SAMPLER_EXTEND_MODE_EXTEND); + GPU_texture_extend_mode(input_image.texture(), GPU_SAMPLER_EXTEND_MODE_CLAMP_TO_BORDER); input_image.bind_as_texture(shader, "input_tx"); - plane_mask.bind_as_texture(shader, "mask_tx"); - const Domain domain = compute_domain(); - Result &output_image = get_result("Image"); output_image.allocate_texture(domain); output_image.bind_as_image(shader, "output_img"); + output_mask.allocate_texture(domain); + output_mask.bind_as_image(shader, "mask_img"); + compute_dispatch_threads_at_least(shader, domain.size); input_image.unbind_as_texture(); - plane_mask.unbind_as_texture(); output_image.unbind_as_image(); + output_mask.unbind_as_image(); GPU_shader_unbind(); } - Result compute_plane_mask(const float3x3 &homography_matrix) - { - GPUShader *shader = context().get_shader("compositor_plane_deform_mask"); - GPU_shader_bind(shader); - - GPU_shader_uniform_mat3_as_mat4(shader, "homography_matrix", homography_matrix.ptr()); - - const Domain domain = compute_domain(); - Result plane_mask = context().create_temporary_result(ResultType::Float); - plane_mask.allocate_texture(domain); - plane_mask.bind_as_image(shader, "mask_img"); - - compute_dispatch_threads_at_least(shader, domain.size); - - plane_mask.unbind_as_image(); - GPU_shader_unbind(); - - return plane_mask; - } - float3x3 compute_homography_matrix() { float2 lower_left = get_input("Lower Left").get_vector_value_default(float4(0.0f)).xy(); diff --git a/source/blender/nodes/composite/nodes/node_composite_cryptomatte.cc b/source/blender/nodes/composite/nodes/node_composite_cryptomatte.cc index e899a780275..baf8926e6a4 100644 --- a/source/blender/nodes/composite/nodes/node_composite_cryptomatte.cc +++ b/source/blender/nodes/composite/nodes/node_composite_cryptomatte.cc @@ -30,7 +30,7 @@ #include "BKE_context.hh" #include "BKE_cryptomatte.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_image.h" #include "BKE_lib_id.hh" #include "BKE_library.hh" @@ -240,22 +240,100 @@ CryptomatteSession *ntreeCompositCryptomatteSession(const Scene *scene, bNode *n return session_ptr.release(); } -namespace blender::nodes::node_composite_base_cryptomatte_cc { +namespace blender::nodes::node_composite_cryptomatte_cc { NODE_STORAGE_FUNCS(NodeCryptomatte) +static bNodeSocketTemplate cmp_node_cryptomatte_out[] = { + {SOCK_RGBA, N_("Image")}, + {SOCK_FLOAT, N_("Matte")}, + {SOCK_RGBA, N_("Pick")}, + {-1, ""}, +}; + +static void cmp_node_cryptomatte_declare(NodeDeclarationBuilder &b) +{ + b.add_input("Image") + .default_value({0.0f, 0.0f, 0.0f, 1.0f}) + .compositor_domain_priority(0); + b.add_output("Image"); + b.add_output("Matte"); + b.add_output("Pick"); +} + +static void node_init_cryptomatte(bNodeTree * /*ntree*/, bNode *node) +{ + NodeCryptomatte *user = MEM_cnew(__func__); + node->storage = user; +} + +static void node_init_api_cryptomatte(const bContext *C, PointerRNA *ptr) +{ + Scene *scene = CTX_data_scene(C); + bNode *node = static_cast(ptr->data); + BLI_assert(node->type == CMP_NODE_CRYPTOMATTE); + node->id = &scene->id; + id_us_plus(node->id); +} + +static void node_free_cryptomatte(bNode *node) +{ + BLI_assert(ELEM(node->type, CMP_NODE_CRYPTOMATTE, CMP_NODE_CRYPTOMATTE_LEGACY)); + NodeCryptomatte *nc = static_cast(node->storage); + + if (nc) { + MEM_SAFE_FREE(nc->matte_id); + BLI_freelistN(&nc->runtime.layers); + BLI_freelistN(&nc->entries); + MEM_freeN(nc); + } +} + +static void node_copy_cryptomatte(bNodeTree * /*dst_ntree*/, + bNode *dest_node, + const bNode *src_node) +{ + NodeCryptomatte *src_nc = static_cast(src_node->storage); + NodeCryptomatte *dest_nc = static_cast(MEM_dupallocN(src_nc)); + + BLI_duplicatelist(&dest_nc->entries, &src_nc->entries); + BLI_listbase_clear(&dest_nc->runtime.layers); + dest_nc->matte_id = static_cast(MEM_dupallocN(src_nc->matte_id)); + dest_node->storage = dest_nc; +} + +static bool node_poll_cryptomatte(const bNodeType * /*ntype*/, + const bNodeTree *ntree, + const char **r_disabled_hint) +{ + if (STREQ(ntree->idname, "CompositorNodeTree")) { + Scene *scene; + + /* See node_composit_poll_rlayers. */ + for (scene = static_cast(G.main->scenes.first); scene; + scene = static_cast(scene->id.next)) + { + if (scene->nodetree == ntree) { + break; + } + } + + if (scene == nullptr) { + *r_disabled_hint = RPT_( + "The node tree must be the compositing node tree of any scene in the file"); + } + return scene != nullptr; + } + *r_disabled_hint = RPT_("Not a compositor node tree"); + return false; +} + using namespace blender::realtime_compositor; -class BaseCryptoMatteOperation : public NodeOperation { +class CryptoMatteOperation : public NodeOperation { public: using NodeOperation::NodeOperation; - /* Should return the input image result. */ - virtual Result &get_input_image() = 0; - - /* Should returns all the Cryptomatte layers in order. */ - virtual Vector get_layers() = 0; - void execute() override { Vector layers = get_layers(); @@ -384,7 +462,7 @@ class BaseCryptoMatteOperation : public NodeOperation { GPUShader *shader = context().get_shader("compositor_cryptomatte_image"); GPU_shader_bind(shader); - Result &input_image = get_input_image(); + Result &input_image = get_input("Image"); input_image.bind_as_texture(shader, "input_tx"); matte.bind_as_texture(shader, "matte_tx"); @@ -402,123 +480,8 @@ class BaseCryptoMatteOperation : public NodeOperation { image_output.unbind_as_image(); } - /* Get the identifiers of the entities selected by the user to generate a matte from. The - * identifiers are hashes of the names of the entities encoded in floats. See the "ID Generation" - * section of the Cryptomatte specification for more information. */ - Vector get_identifiers() - { - Vector identifiers; - LISTBASE_FOREACH (CryptomatteEntry *, cryptomatte_entry, &node_storage(bnode()).entries) { - identifiers.append(cryptomatte_entry->encoded_hash); - } - return identifiers; - } -}; - -} // namespace blender::nodes::node_composite_base_cryptomatte_cc - -namespace blender::nodes::node_composite_cryptomatte_cc { - -NODE_STORAGE_FUNCS(NodeCryptomatte) - -static bNodeSocketTemplate cmp_node_cryptomatte_out[] = { - {SOCK_RGBA, N_("Image")}, - {SOCK_FLOAT, N_("Matte")}, - {SOCK_RGBA, N_("Pick")}, - {-1, ""}, -}; - -static void cmp_node_cryptomatte_declare(NodeDeclarationBuilder &b) -{ - b.add_input("Image") - .default_value({0.0f, 0.0f, 0.0f, 1.0f}) - .compositor_domain_priority(0); - b.add_output("Image"); - b.add_output("Matte"); - b.add_output("Pick"); -} - -static void node_init_cryptomatte(bNodeTree * /*ntree*/, bNode *node) -{ - NodeCryptomatte *user = MEM_cnew(__func__); - node->storage = user; -} - -static void node_init_api_cryptomatte(const bContext *C, PointerRNA *ptr) -{ - Scene *scene = CTX_data_scene(C); - bNode *node = static_cast(ptr->data); - BLI_assert(node->type == CMP_NODE_CRYPTOMATTE); - node->id = &scene->id; - id_us_plus(node->id); -} - -static void node_free_cryptomatte(bNode *node) -{ - BLI_assert(ELEM(node->type, CMP_NODE_CRYPTOMATTE, CMP_NODE_CRYPTOMATTE_LEGACY)); - NodeCryptomatte *nc = static_cast(node->storage); - - if (nc) { - MEM_SAFE_FREE(nc->matte_id); - BLI_freelistN(&nc->runtime.layers); - BLI_freelistN(&nc->entries); - MEM_freeN(nc); - } -} - -static void node_copy_cryptomatte(bNodeTree * /*dst_ntree*/, - bNode *dest_node, - const bNode *src_node) -{ - NodeCryptomatte *src_nc = static_cast(src_node->storage); - NodeCryptomatte *dest_nc = static_cast(MEM_dupallocN(src_nc)); - - BLI_duplicatelist(&dest_nc->entries, &src_nc->entries); - BLI_listbase_clear(&dest_nc->runtime.layers); - dest_nc->matte_id = static_cast(MEM_dupallocN(src_nc->matte_id)); - dest_node->storage = dest_nc; -} - -static bool node_poll_cryptomatte(const bNodeType * /*ntype*/, - const bNodeTree *ntree, - const char **r_disabled_hint) -{ - if (STREQ(ntree->idname, "CompositorNodeTree")) { - Scene *scene; - - /* See node_composit_poll_rlayers. */ - for (scene = static_cast(G.main->scenes.first); scene; - scene = static_cast(scene->id.next)) - { - if (scene->nodetree == ntree) { - break; - } - } - - if (scene == nullptr) { - *r_disabled_hint = RPT_( - "The node tree must be the compositing node tree of any scene in the file"); - } - return scene != nullptr; - } - *r_disabled_hint = RPT_("Not a compositor node tree"); - return false; -} - -using namespace blender::realtime_compositor; -using namespace blender::nodes::node_composite_base_cryptomatte_cc; - -class CryptoMatteOperation : public BaseCryptoMatteOperation { - public: - using BaseCryptoMatteOperation::BaseCryptoMatteOperation; - - Result &get_input_image() override - { - return get_input("Image"); - } - /* Returns all the relevant Cryptomatte layers from the selected source. */ - Vector get_layers() override + Vector get_layers() { switch (get_source()) { case CMP_NODE_CRYPTOMATTE_SOURCE_RENDER: @@ -668,6 +631,18 @@ class CryptoMatteOperation : public BaseCryptoMatteOperation { return std::string(type_name); } + /* Get the identifiers of the entities selected by the user to generate a matte from. The + * identifiers are hashes of the names of the entities encoded in floats. See the "ID Generation" + * section of the Cryptomatte specification for more information. */ + Vector get_identifiers() + { + Vector identifiers; + LISTBASE_FOREACH (CryptomatteEntry *, cryptomatte_entry, &node_storage(bnode()).entries) { + identifiers.append(cryptomatte_entry->encoded_hash); + } + return identifiers; + } + /* The domain should be centered with the same size as the source. In case of invalid source, * fallback to the domain inferred from the input. */ Domain compute_domain() override @@ -829,31 +804,23 @@ static void node_init_cryptomatte_legacy(bNodeTree *ntree, bNode *node) } using namespace blender::realtime_compositor; -using namespace blender::nodes::node_composite_base_cryptomatte_cc; -class LegacyCryptoMatteOperation : public BaseCryptoMatteOperation { +class CryptoMatteOperation : public NodeOperation { public: - using BaseCryptoMatteOperation::BaseCryptoMatteOperation; + using NodeOperation::NodeOperation; - Result &get_input_image() override + void execute() override { - return get_input("image"); - } - - Vector get_layers() override - { - Vector layers; - /* Add all textures of all inputs except the first input, which is the input image. */ - for (const bNodeSocket *socket : bnode().input_sockets().drop_front(1)) { - layers.append(get_input(socket->identifier).texture()); - } - return layers; + get_input("image").pass_through(get_result("Image")); + get_result("Matte").allocate_invalid(); + get_result("Pick").allocate_invalid(); + context().set_info_message("Viewport compositor setup not fully supported"); } }; static NodeOperation *get_compositor_operation(Context &context, DNode node) { - return new LegacyCryptoMatteOperation(context, node); + return new CryptoMatteOperation(context, node); } } // namespace blender::nodes::node_composite_legacy_cryptomatte_cc @@ -873,6 +840,8 @@ void register_node_type_cmp_cryptomatte_legacy() &ntype, "NodeCryptomatte", file_ns::node_free_cryptomatte, file_ns::node_copy_cryptomatte); ntype.gather_link_search_ops = nullptr; ntype.get_compositor_operation = legacy_file_ns::get_compositor_operation; + ntype.realtime_compositor_unsupported_message = N_( + "Node not supported in the Viewport compositor"); nodeRegisterType(&ntype); } diff --git a/source/blender/nodes/composite/nodes/node_composite_denoise.cc b/source/blender/nodes/composite/nodes/node_composite_denoise.cc index 7d9f689371a..9aae8fb1359 100644 --- a/source/blender/nodes/composite/nodes/node_composite_denoise.cc +++ b/source/blender/nodes/composite/nodes/node_composite_denoise.cc @@ -63,8 +63,8 @@ static void node_composit_buts_denoise(uiLayout *layout, bContext * /*C*/, Point #else /* Always supported through Accelerate framework BNNS on macOS. */ # ifndef __APPLE__ - if (!BLI_cpu_support_sse42()) { - uiItemL(layout, RPT_("Disabled, CPU with SSE4.2 is required"), ICON_ERROR); + if (!BLI_cpu_support_sse41()) { + uiItemL(layout, RPT_("Disabled, CPU with SSE4.1 is required"), ICON_ERROR); } # endif #endif @@ -76,17 +76,6 @@ static void node_composit_buts_denoise(uiLayout *layout, bContext * /*C*/, Point using namespace blender::realtime_compositor; -/* A callback to cancel the filter operations by evaluating the context's is_canceled method. The - * API specifies that true indicates the filter should continue, while false indicates it should - * stop, so invert the condition. This callback can also be used to track progress using the given - * n argument, but we currently don't make use of it. See OIDNProgressMonitorFunction in the API - * for more information. */ -[[maybe_unused]] static bool oidn_progress_monitor_function(void *user_ptr, double /*n*/) -{ - const Context *context = static_cast(user_ptr); - return !context->is_canceled(); -} - class DenoiseOperation : public NodeOperation { public: using NodeOperation::NodeOperation; @@ -119,7 +108,6 @@ class DenoiseOperation : public NodeOperation { filter.setImage("output", color, oidn::Format::Float3, width, height, 0, pixel_stride); filter.set("hdr", use_hdr()); filter.set("cleanAux", auxiliary_passes_are_clean()); - filter.setProgressMonitorFunction(oidn_progress_monitor_function, &context()); /* If the albedo input is not a single value input, download the albedo texture, denoise it * in-place if denoising auxiliary passes is needed, and set it to the main filter. */ @@ -134,7 +122,6 @@ class DenoiseOperation : public NodeOperation { "albedo", albedo, oidn::Format::Float3, width, height, 0, pixel_stride); albedoFilter.setImage( "output", albedo, oidn::Format::Float3, width, height, 0, pixel_stride); - albedoFilter.setProgressMonitorFunction(oidn_progress_monitor_function, &context()); albedoFilter.commit(); albedoFilter.execute(); } @@ -157,7 +144,6 @@ class DenoiseOperation : public NodeOperation { "normal", normal, oidn::Format::Float3, width, height, 0, pixel_stride); normalFilter.setImage( "output", normal, oidn::Format::Float3, width, height, 0, pixel_stride); - normalFilter.setProgressMonitorFunction(oidn_progress_monitor_function, &context()); normalFilter.commit(); normalFilter.execute(); } @@ -220,7 +206,7 @@ class DenoiseOperation : public NodeOperation { # ifdef __APPLE__ return true; # else - return BLI_cpu_support_sse42(); + return BLI_cpu_support_sse41(); # endif #endif } diff --git a/source/blender/nodes/composite/nodes/node_composite_ellipsemask.cc b/source/blender/nodes/composite/nodes/node_composite_ellipsemask.cc index 6557ccdf6f1..c8b7e69459f 100644 --- a/source/blender/nodes/composite/nodes/node_composite_ellipsemask.cc +++ b/source/blender/nodes/composite/nodes/node_composite_ellipsemask.cc @@ -59,10 +59,8 @@ static void node_composit_buts_ellipsemask(uiLayout *layout, bContext * /*C*/, P uiItemR(row, ptr, "x", UI_ITEM_R_SPLIT_EMPTY_NAME, nullptr, ICON_NONE); uiItemR(row, ptr, "y", UI_ITEM_R_SPLIT_EMPTY_NAME, nullptr, ICON_NONE); row = uiLayoutRow(layout, true); - uiItemR( - row, ptr, "mask_width", UI_ITEM_R_SPLIT_EMPTY_NAME | UI_ITEM_R_SLIDER, nullptr, ICON_NONE); - uiItemR( - row, ptr, "mask_height", UI_ITEM_R_SPLIT_EMPTY_NAME | UI_ITEM_R_SLIDER, nullptr, ICON_NONE); + uiItemR(row, ptr, "width", UI_ITEM_R_SPLIT_EMPTY_NAME | UI_ITEM_R_SLIDER, nullptr, ICON_NONE); + uiItemR(row, ptr, "height", UI_ITEM_R_SPLIT_EMPTY_NAME | UI_ITEM_R_SLIDER, nullptr, ICON_NONE); uiItemR(layout, ptr, "rotation", UI_ITEM_R_SPLIT_EMPTY_NAME, nullptr, ICON_NONE); uiItemR(layout, ptr, "mask_type", UI_ITEM_R_SPLIT_EMPTY_NAME, nullptr, ICON_NONE); diff --git a/source/blender/nodes/composite/nodes/node_composite_file_output.cc b/source/blender/nodes/composite/nodes/node_composite_file_output.cc index 65eb35307c2..07bd4a9358c 100644 --- a/source/blender/nodes/composite/nodes/node_composite_file_output.cc +++ b/source/blender/nodes/composite/nodes/node_composite_file_output.cc @@ -27,7 +27,7 @@ #include "BKE_image.h" #include "BKE_image_format.h" #include "BKE_main.hh" -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "RNA_access.hh" #include "RNA_prototypes.h" diff --git a/source/blender/nodes/composite/nodes/node_composite_glare.cc b/source/blender/nodes/composite/nodes/node_composite_glare.cc index 278830fc087..c3b7ff8e77a 100644 --- a/source/blender/nodes/composite/nodes/node_composite_glare.cc +++ b/source/blender/nodes/composite/nodes/node_composite_glare.cc @@ -53,7 +53,7 @@ static void node_composit_init_glare(bNodeTree * /*ntree*/, bNode *node) { NodeGlare *ndg = MEM_cnew(__func__); ndg->quality = 1; - ndg->type = CMP_NODE_GLARE_STREAKS; + ndg->type = 2; ndg->iter = 3; ndg->colmod = 0.25; ndg->mix = 0; @@ -71,38 +71,35 @@ static void node_composit_buts_glare(uiLayout *layout, bContext * /*C*/, Pointer uiItemR(layout, ptr, "glare_type", UI_ITEM_R_SPLIT_EMPTY_NAME, "", ICON_NONE); uiItemR(layout, ptr, "quality", UI_ITEM_R_SPLIT_EMPTY_NAME, "", ICON_NONE); - const int glare_type = RNA_enum_get(ptr, "glare_type"); - if (ELEM(glare_type, CMP_NODE_GLARE_SIMPLE_STAR, CMP_NODE_GLARE_GHOST, CMP_NODE_GLARE_STREAKS)) { + if (RNA_enum_get(ptr, "glare_type") != 1) { uiItemR(layout, ptr, "iterations", UI_ITEM_R_SPLIT_EMPTY_NAME, nullptr, ICON_NONE); - } - if (ELEM(glare_type, CMP_NODE_GLARE_GHOST, CMP_NODE_GLARE_STREAKS)) { - uiItemR(layout, - ptr, - "color_modulation", - UI_ITEM_R_SPLIT_EMPTY_NAME | UI_ITEM_R_SLIDER, - nullptr, - ICON_NONE); + if (RNA_enum_get(ptr, "glare_type") != 0) { + uiItemR(layout, + ptr, + "color_modulation", + UI_ITEM_R_SPLIT_EMPTY_NAME | UI_ITEM_R_SLIDER, + nullptr, + ICON_NONE); + } } uiItemR(layout, ptr, "mix", UI_ITEM_R_SPLIT_EMPTY_NAME, nullptr, ICON_NONE); uiItemR(layout, ptr, "threshold", UI_ITEM_R_SPLIT_EMPTY_NAME, nullptr, ICON_NONE); - if (glare_type == CMP_NODE_GLARE_STREAKS) { + if (RNA_enum_get(ptr, "glare_type") == 2) { uiItemR(layout, ptr, "streaks", UI_ITEM_R_SPLIT_EMPTY_NAME, nullptr, ICON_NONE); uiItemR(layout, ptr, "angle_offset", UI_ITEM_R_SPLIT_EMPTY_NAME, nullptr, ICON_NONE); } - - if (ELEM(glare_type, CMP_NODE_GLARE_SIMPLE_STAR, CMP_NODE_GLARE_STREAKS)) { + if (RNA_enum_get(ptr, "glare_type") == 0 || RNA_enum_get(ptr, "glare_type") == 2) { uiItemR( layout, ptr, "fade", UI_ITEM_R_SPLIT_EMPTY_NAME | UI_ITEM_R_SLIDER, nullptr, ICON_NONE); - } - if (glare_type == CMP_NODE_GLARE_SIMPLE_STAR) { - uiItemR(layout, ptr, "use_rotate_45", UI_ITEM_R_SPLIT_EMPTY_NAME, nullptr, ICON_NONE); + if (RNA_enum_get(ptr, "glare_type") == 0) { + uiItemR(layout, ptr, "use_rotate_45", UI_ITEM_R_SPLIT_EMPTY_NAME, nullptr, ICON_NONE); + } } - - if (ELEM(glare_type, CMP_NODE_GLARE_FOG_GLOW, CMP_NODE_GLARE_BLOOM)) { + if (RNA_enum_get(ptr, "glare_type") == 1) { uiItemR(layout, ptr, "size", UI_ITEM_R_SPLIT_EMPTY_NAME, nullptr, ICON_NONE); } } @@ -151,8 +148,6 @@ class GlareOperation : public NodeOperation { return execute_streaks(highlights_result); case CMP_NODE_GLARE_GHOST: return execute_ghost(highlights_result); - case CMP_NODE_GLARE_BLOOM: - return execute_bloom(highlights_result); default: BLI_assert_unreachable(); return context().create_temporary_result(ResultType::Color); @@ -692,16 +687,16 @@ class GlareOperation : public NodeOperation { return 1.0f - get_color_modulation_factor(); } - /* ------------ - * Bloom Glare. - * ------------ */ + /* --------------- + * Fog Glow Glare. + * --------------- */ - /* Bloom is computed by first progressively half-down-sampling the highlights down to a certain - * size, then progressively double-up-sampling the last down-sampled result up to the original - * size of the highlights, adding the down-sampled result of the same size in each up-sampling - * step. This can be illustrated as follows: + /* Fog glow is computed by first progressively half-down-sampling the highlights down to a + * certain size, then progressively double-up-sampling the last down-sampled result up to the + * original size of the highlights, adding the down-sampled result of the same size in each + * up-sampling step. This can be illustrated as follows: * - * Highlights ---+---> Bloom + * Highlights ---+---> Fog Glare * | | * Down-sampled ---+---> Up-sampled * | | @@ -719,7 +714,7 @@ class GlareOperation : public NodeOperation { * Smaller down-sampled results contribute to larger glare size, so controlling the size can be * done by stopping down-sampling down to a certain size, where the maximum possible size is * achieved when down-sampling happens down to the smallest size of 2. */ - Result execute_bloom(Result &highlights_result) + Result execute_fog_glow(Result &highlights_result) { /* The maximum possible glare size is achieved when we down-sampled down to the smallest size * of 2, which would result in a down-sampling chain length of the binary logarithm of the @@ -730,14 +725,14 @@ class GlareOperation : public NodeOperation { const int2 glare_size = get_glare_size(); const int smaller_glare_dimension = math::min(glare_size.x, glare_size.y); const int chain_length = int(std::log2(smaller_glare_dimension)) - - compute_bloom_size_halving_count(); + compute_fog_glare_size_halving_count(); - Array downsample_chain = compute_bloom_downsample_chain(highlights_result, - chain_length); + Array downsample_chain = compute_fog_glow_downsample_chain(highlights_result, + chain_length); /* Notice that for a chain length of n, we need (n - 1) up-sampling passes. */ const IndexRange upsample_passes_range(chain_length - 1); - GPUShader *shader = context().get_shader("compositor_glare_bloom_upsample"); + GPUShader *shader = context().get_shader("compositor_glare_fog_glow_upsample"); GPU_shader_bind(shader); for (const int i : upsample_passes_range) { @@ -766,7 +761,7 @@ class GlareOperation : public NodeOperation { * expected not to exceed the binary logarithm of the smaller dimension of the given result, * because that would result in down-sampling passes that produce useless textures with just * one pixel. */ - Array compute_bloom_downsample_chain(Result &highlights_result, int chain_length) + Array compute_fog_glow_downsample_chain(Result &highlights_result, int chain_length) { const Result downsampled_result = context().create_temporary_result(ResultType::Color); Array downsample_chain(chain_length, downsampled_result); @@ -784,11 +779,11 @@ class GlareOperation : public NodeOperation { * more information. Later passes use a simple average down-sampling filter because fireflies * doesn't service the first pass. */ if (i == downsample_passes_range.first()) { - shader = context().get_shader("compositor_glare_bloom_downsample_karis_average"); + shader = context().get_shader("compositor_glare_fog_glow_downsample_karis_average"); GPU_shader_bind(shader); } else { - shader = context().get_shader("compositor_glare_bloom_downsample_simple_average"); + shader = context().get_shader("compositor_glare_fog_glow_downsample_simple_average"); GPU_shader_bind(shader); } @@ -810,34 +805,21 @@ class GlareOperation : public NodeOperation { return downsample_chain; } - /* The bloom has a maximum possible size when the bloom size is equal to MAX_GLARE_SIZE and - * halves for every unit decrement of the bloom size. This method computes the number of halving - * that should take place, which is simply the difference to MAX_GLARE_SIZE. */ - int compute_bloom_size_halving_count() + /* The fog glow has a maximum possible size when the fog glow size is equal to MAX_GLARE_SIZE and + * halves for every unit decrement of the fog glow size. This method computes the number of + * halving that should take place, which is simply the difference to MAX_GLARE_SIZE. */ + int compute_fog_glare_size_halving_count() { - return MAX_GLARE_SIZE - get_bloom_size(); + return MAX_GLARE_SIZE - get_fog_glow_size(); } - /* The size of the bloom relative to its maximum possible size, see the - * compute_bloom_size_halving_count() method for more information. */ - int get_bloom_size() + /* The size of the fog glow relative to its maximum possible size, see the + * compute_fog_glare_size_halving_count() method for more information. */ + int get_fog_glow_size() { return node_storage(bnode()).size; } - /* --------------- - * Fog Glow Glare. - * --------------- */ - - Result execute_fog_glow(Result &highlights_result) - { - context().set_info_message("Fog Glow Glare not supported in GPU compositor."); - Result fog_glow_result = context().create_temporary_result(ResultType::Color); - fog_glow_result.allocate_texture(highlights_result.domain()); - GPU_texture_copy(fog_glow_result.texture(), highlights_result.texture()); - return fog_glow_result; - } - /* ---------- * Glare Mix. * ---------- */ diff --git a/source/blender/nodes/composite/nodes/node_composite_image.cc b/source/blender/nodes/composite/nodes/node_composite_image.cc index 20971446f42..dce827c6530 100644 --- a/source/blender/nodes/composite/nodes/node_composite_image.cc +++ b/source/blender/nodes/composite/nodes/node_composite_image.cc @@ -15,11 +15,11 @@ #include "BLI_utildefines.h" #include "BKE_context.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_image.h" #include "BKE_lib_id.hh" #include "BKE_main.hh" -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "DEG_depsgraph_query.hh" diff --git a/source/blender/nodes/composite/nodes/node_composite_mask.cc b/source/blender/nodes/composite/nodes/node_composite_mask.cc index 27025322a38..6bc590b58f3 100644 --- a/source/blender/nodes/composite/nodes/node_composite_mask.cc +++ b/source/blender/nodes/composite/nodes/node_composite_mask.cc @@ -15,6 +15,7 @@ #include "COM_cached_mask.hh" #include "COM_node_operation.hh" +#include "COM_utilities.hh" #include "node_composite_util.hh" diff --git a/source/blender/nodes/composite/nodes/node_composite_planetrackdeform.cc b/source/blender/nodes/composite/nodes/node_composite_planetrackdeform.cc index 8f429bdeb6f..c077ec292fe 100644 --- a/source/blender/nodes/composite/nodes/node_composite_planetrackdeform.cc +++ b/source/blender/nodes/composite/nodes/node_composite_planetrackdeform.cc @@ -28,9 +28,8 @@ #include "GPU_shader.h" #include "GPU_texture.h" -#include "GPU_uniform_buffer.hh" +#include "GPU_uniform_buffer.h" -#include "COM_algorithm_smaa.hh" #include "COM_node_operation.hh" #include "COM_utilities.hh" @@ -145,87 +144,40 @@ class PlaneTrackDeformOperation : public NodeOperation { } const Array homography_matrices = compute_homography_matrices(plane_track); - GPUUniformBuf *homography_matrices_buffer = GPU_uniformbuf_create_ex( - homography_matrices.size() * sizeof(float4x4), - homography_matrices.data(), - "Plane Track Deform Homography Matrices"); - Result plane_mask = compute_plane_mask(homography_matrices, homography_matrices_buffer); - Result anti_aliased_plane_mask = context().create_temporary_result(ResultType::Float); - smaa(context(), plane_mask, anti_aliased_plane_mask); - plane_mask.release(); - - if (output_image.should_compute()) { - compute_plane(homography_matrices, homography_matrices_buffer, anti_aliased_plane_mask); - } - - if (output_mask.should_compute()) { - output_mask.steal_data(anti_aliased_plane_mask); - } - else { - anti_aliased_plane_mask.release(); - } - - GPU_uniformbuf_free(homography_matrices_buffer); - } - - void compute_plane(const Array &homography_matrices, - GPUUniformBuf *homography_matrices_buffer, - Result &plane_mask) - { GPUShader *shader = context().get_shader("compositor_plane_deform_motion_blur"); GPU_shader_bind(shader); GPU_shader_uniform_1i(shader, "number_of_motion_blur_samples", homography_matrices.size()); + GPUUniformBuf *matrices_buffer = GPU_uniformbuf_create_ex( + homography_matrices.size() * sizeof(float4x4), + homography_matrices.data(), + "Plane Track Deform Homography Matrices"); const int ubo_location = GPU_shader_get_ubo_binding(shader, "homography_matrices"); - GPU_uniformbuf_bind(homography_matrices_buffer, ubo_location); + GPU_uniformbuf_bind(matrices_buffer, ubo_location); - Result &input_image = get_input("Image"); GPU_texture_mipmap_mode(input_image.texture(), true, true); GPU_texture_anisotropic_filter(input_image.texture(), true); - GPU_texture_extend_mode(input_image.texture(), GPU_SAMPLER_EXTEND_MODE_EXTEND); + GPU_texture_extend_mode(input_image.texture(), GPU_SAMPLER_EXTEND_MODE_CLAMP_TO_BORDER); input_image.bind_as_texture(shader, "input_tx"); - plane_mask.bind_as_texture(shader, "mask_tx"); - const Domain domain = compute_domain(); - Result &output_image = get_result("Image"); output_image.allocate_texture(domain); output_image.bind_as_image(shader, "output_img"); + output_mask.allocate_texture(domain); + output_mask.bind_as_image(shader, "mask_img"); + compute_dispatch_threads_at_least(shader, domain.size); input_image.unbind_as_texture(); - plane_mask.unbind_as_texture(); output_image.unbind_as_image(); - GPU_uniformbuf_unbind(homography_matrices_buffer); - GPU_shader_unbind(); - } - - Result compute_plane_mask(const Array &homography_matrices, - GPUUniformBuf *homography_matrices_buffer) - { - GPUShader *shader = context().get_shader("compositor_plane_deform_motion_blur_mask"); - GPU_shader_bind(shader); - - GPU_shader_uniform_1i(shader, "number_of_motion_blur_samples", homography_matrices.size()); - - const int ubo_location = GPU_shader_get_ubo_binding(shader, "homography_matrices"); - GPU_uniformbuf_bind(homography_matrices_buffer, ubo_location); - - const Domain domain = compute_domain(); - Result plane_mask = context().create_temporary_result(ResultType::Float); - plane_mask.allocate_texture(domain); - plane_mask.bind_as_image(shader, "mask_img"); - - compute_dispatch_threads_at_least(shader, domain.size); - - plane_mask.unbind_as_image(); - GPU_uniformbuf_unbind(homography_matrices_buffer); + output_mask.unbind_as_image(); GPU_shader_unbind(); - return plane_mask; + GPU_uniformbuf_unbind(matrices_buffer); + GPU_uniformbuf_free(matrices_buffer); } Domain compute_domain() override diff --git a/source/blender/nodes/composite/nodes/node_composite_split.cc b/source/blender/nodes/composite/nodes/node_composite_split.cc index 126cf40e2e5..e78959aaf35 100644 --- a/source/blender/nodes/composite/nodes/node_composite_split.cc +++ b/source/blender/nodes/composite/nodes/node_composite_split.cc @@ -6,6 +6,9 @@ * \ingroup cmpnodes */ +#include "BKE_global.h" +#include "BKE_image.h" + #include "UI_interface.hh" #include "UI_resources.hh" diff --git a/source/blender/nodes/composite/nodes/node_composite_texture.cc b/source/blender/nodes/composite/nodes/node_composite_texture.cc index 9e70f10ccac..da7a0ed20a2 100644 --- a/source/blender/nodes/composite/nodes/node_composite_texture.cc +++ b/source/blender/nodes/composite/nodes/node_composite_texture.cc @@ -8,6 +8,7 @@ #include "COM_cached_texture.hh" #include "COM_node_operation.hh" +#include "COM_utilities.hh" #include "node_composite_util.hh" diff --git a/source/blender/nodes/composite/nodes/node_composite_viewer.cc b/source/blender/nodes/composite/nodes/node_composite_viewer.cc index c9eb30d0be2..8edb27b8a85 100644 --- a/source/blender/nodes/composite/nodes/node_composite_viewer.cc +++ b/source/blender/nodes/composite/nodes/node_composite_viewer.cc @@ -8,7 +8,7 @@ #include "BLI_math_vector_types.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_image.h" #include "RNA_access.hh" @@ -17,6 +17,7 @@ #include "UI_resources.hh" #include "GPU_shader.h" +#include "GPU_state.h" #include "GPU_texture.h" #include "COM_node_operation.hh" @@ -119,28 +120,16 @@ class ViewerOperation : public NodeOperation { ResultPrecision::Half); GPU_shader_bind(shader); - const Domain domain = compute_domain(); - /* The context can use the composite output and thus has a dedicated viewer of an arbitrary - * size, so use the input in its entirety. Otherwise, no dedicated viewer exist so only write - * into the compositing region, which might be limited to a smaller region of the output - * texture. */ - if (context().use_composite_output()) { - GPU_shader_uniform_2iv(shader, "lower_bound", int2(0)); - GPU_shader_uniform_2iv(shader, "upper_bound", domain.size); - } - else { - /* The compositing space might be limited to a smaller region of the output texture, so only - * write into that compositing region. */ - const rcti compositing_region = context().get_compositing_region(); - const int2 lower_bound = int2(compositing_region.xmin, compositing_region.ymin); - const int2 upper_bound = int2(compositing_region.xmax, compositing_region.ymax); - GPU_shader_uniform_2iv(shader, "lower_bound", lower_bound); - GPU_shader_uniform_2iv(shader, "upper_bound", upper_bound); - } + /* The compositing space might be limited to a smaller region of the output texture, so only + * write into that compositing region. */ + const rcti compositing_region = context().get_compositing_region(); + const int2 lower_bound = int2(compositing_region.xmin, compositing_region.ymin); + GPU_shader_uniform_2iv(shader, "lower_bound", lower_bound); const Result &image = get_input("Image"); image.bind_as_texture(shader, "input_tx"); + const Domain domain = compute_domain(); GPUTexture *output_texture = context().get_viewer_output_texture(domain); const int image_unit = GPU_shader_get_sampler_binding(shader, "output_img"); GPU_texture_image_bind(output_texture, image_unit); @@ -159,28 +148,16 @@ class ViewerOperation : public NodeOperation { GPUShader *shader = context().get_shader("compositor_write_output", ResultPrecision::Half); GPU_shader_bind(shader); - const Domain domain = compute_domain(); - /* The context can use the composite output and thus has a dedicated viewer of an arbitrary - * size, so use the input in its entirety. Otherwise, no dedicated viewer exist so only write - * into the compositing region, which might be limited to a smaller region of the output - * texture. */ - if (context().use_composite_output()) { - GPU_shader_uniform_2iv(shader, "lower_bound", int2(0)); - GPU_shader_uniform_2iv(shader, "upper_bound", domain.size); - } - else { - /* The compositing space might be limited to a smaller region of the output texture, so only - * write into that compositing region. */ - const rcti compositing_region = context().get_compositing_region(); - const int2 lower_bound = int2(compositing_region.xmin, compositing_region.ymin); - const int2 upper_bound = int2(compositing_region.xmax, compositing_region.ymax); - GPU_shader_uniform_2iv(shader, "lower_bound", lower_bound); - GPU_shader_uniform_2iv(shader, "upper_bound", upper_bound); - } + /* The compositing space might be limited to a smaller region of the output texture, so only + * write into that compositing region. */ + const rcti compositing_region = context().get_compositing_region(); + const int2 lower_bound = int2(compositing_region.xmin, compositing_region.ymin); + GPU_shader_uniform_2iv(shader, "lower_bound", lower_bound); const Result &image = get_input("Image"); image.bind_as_texture(shader, "input_tx"); + const Domain domain = compute_domain(); GPUTexture *output_texture = context().get_viewer_output_texture(domain); const int image_unit = GPU_shader_get_sampler_binding(shader, "output_img"); GPU_texture_image_bind(output_texture, image_unit); @@ -199,24 +176,11 @@ class ViewerOperation : public NodeOperation { ResultPrecision::Half); GPU_shader_bind(shader); - const Domain domain = compute_domain(); - /* The context can use the composite output and thus has a dedicated viewer of an arbitrary - * size, so use the input in its entirety. Otherwise, no dedicated viewer exist so only write - * into the compositing region, which might be limited to a smaller region of the output - * texture. */ - if (context().use_composite_output()) { - GPU_shader_uniform_2iv(shader, "lower_bound", int2(0)); - GPU_shader_uniform_2iv(shader, "upper_bound", domain.size); - } - else { - /* The compositing space might be limited to a smaller region of the output texture, so only - * write into that compositing region. */ - const rcti compositing_region = context().get_compositing_region(); - const int2 lower_bound = int2(compositing_region.xmin, compositing_region.ymin); - const int2 upper_bound = int2(compositing_region.xmax, compositing_region.ymax); - GPU_shader_uniform_2iv(shader, "lower_bound", lower_bound); - GPU_shader_uniform_2iv(shader, "upper_bound", upper_bound); - } + /* The compositing space might be limited to a smaller region of the output texture, so only + * write into that compositing region. */ + const rcti compositing_region = context().get_compositing_region(); + const int2 lower_bound = int2(compositing_region.xmin, compositing_region.ymin); + GPU_shader_uniform_2iv(shader, "lower_bound", lower_bound); const Result &image = get_input("Image"); image.bind_as_texture(shader, "input_tx"); @@ -224,6 +188,7 @@ class ViewerOperation : public NodeOperation { const Result &alpha = get_input("Alpha"); alpha.bind_as_texture(shader, "alpha_tx"); + const Domain domain = compute_domain(); GPUTexture *output_texture = context().get_viewer_output_texture(domain); const int image_unit = GPU_shader_get_sampler_binding(shader, "output_img"); GPU_texture_image_bind(output_texture, image_unit); diff --git a/source/blender/nodes/function/CMakeLists.txt b/source/blender/nodes/function/CMakeLists.txt index 03bd7118884..42571c4f057 100644 --- a/source/blender/nodes/function/CMakeLists.txt +++ b/source/blender/nodes/function/CMakeLists.txt @@ -22,7 +22,6 @@ set(SRC nodes/node_fn_axis_angle_to_rotation.cc nodes/node_fn_boolean_math.cc nodes/node_fn_combine_color.cc - nodes/node_fn_combine_transform.cc nodes/node_fn_compare.cc nodes/node_fn_euler_to_rotation.cc nodes/node_fn_float_to_int.cc @@ -32,9 +31,7 @@ set(SRC nodes/node_fn_input_special_characters.cc nodes/node_fn_input_string.cc nodes/node_fn_input_vector.cc - nodes/node_fn_invert_matrix.cc nodes/node_fn_invert_rotation.cc - nodes/node_fn_matrix_multiply.cc nodes/node_fn_quaternion_to_rotation.cc nodes/node_fn_random_value.cc nodes/node_fn_replace_string.cc @@ -45,12 +42,8 @@ set(SRC nodes/node_fn_rotation_to_euler.cc nodes/node_fn_rotation_to_quaternion.cc nodes/node_fn_separate_color.cc - nodes/node_fn_separate_transform.cc nodes/node_fn_slice_string.cc nodes/node_fn_string_length.cc - nodes/node_fn_transform_direction.cc - nodes/node_fn_transform_point.cc - nodes/node_fn_transpose_matrix.cc nodes/node_fn_value_to_string.cc node_function_util.cc diff --git a/source/blender/nodes/function/nodes/node_fn_align_euler_to_vector.cc b/source/blender/nodes/function/nodes/node_fn_align_euler_to_vector.cc index 502683a3a2d..2058a5f2a87 100644 --- a/source/blender/nodes/function/nodes/node_fn_align_euler_to_vector.cc +++ b/source/blender/nodes/function/nodes/node_fn_align_euler_to_vector.cc @@ -6,6 +6,8 @@ #include "BLI_math_rotation.h" #include "BLI_math_vector.h" +#include "RNA_enum_types.hh" + #include "UI_interface.hh" #include "UI_resources.hh" @@ -41,7 +43,7 @@ static void align_rotations_auto_pivot(const IndexMask &mask, { mask.foreach_index([&](const int64_t i) { const float3 vector = vectors[i]; - if (math::is_zero(vector)) { + if (is_zero_v3(vector)) { output_rotations[i] = input_rotations[i]; return; } @@ -53,10 +55,10 @@ static void align_rotations_auto_pivot(const IndexMask &mask, const float3 new_axis = math::normalize(vector); float3 rotation_axis = math::cross_high_precision(old_axis, new_axis); - if (math::is_zero(rotation_axis)) { + if (is_zero_v3(rotation_axis)) { /* The vectors are linearly dependent, so we fall back to another axis. */ rotation_axis = math::cross_high_precision(old_axis, float3(1, 0, 0)); - if (math::is_zero(rotation_axis)) { + if (is_zero_v3(rotation_axis)) { /* This is now guaranteed to not be zero. */ rotation_axis = math::cross_high_precision(old_axis, float3(0, 1, 0)); } @@ -94,7 +96,7 @@ static void align_rotations_fixed_pivot(const IndexMask &mask, } const float3 vector = vectors[i]; - if (math::is_zero(vector)) { + if (is_zero_v3(vector)) { output_rotations[i] = input_rotations[i]; return; } diff --git a/source/blender/nodes/function/nodes/node_fn_axis_angle_to_rotation.cc b/source/blender/nodes/function/nodes/node_fn_axis_angle_to_rotation.cc index e4a95d61896..fd56f847f2d 100644 --- a/source/blender/nodes/function/nodes/node_fn_axis_angle_to_rotation.cc +++ b/source/blender/nodes/function/nodes/node_fn_axis_angle_to_rotation.cc @@ -3,6 +3,7 @@ * SPDX-License-Identifier: GPL-2.0-or-later */ #include "BLI_math_axis_angle.hh" +#include "BLI_math_quaternion.hh" #include "node_function_util.hh" diff --git a/source/blender/nodes/function/nodes/node_fn_combine_transform.cc b/source/blender/nodes/function/nodes/node_fn_combine_transform.cc deleted file mode 100644 index 6ed6bccb258..00000000000 --- a/source/blender/nodes/function/nodes/node_fn_combine_transform.cc +++ /dev/null @@ -1,98 +0,0 @@ -/* SPDX-FileCopyrightText: 2023 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -#include "BLI_math_matrix.hh" -#include "BLI_math_rotation.hh" - -#include "NOD_socket_search_link.hh" - -#include "node_function_util.hh" - -namespace blender::nodes::node_fn_combine_transform_cc { - -static void node_declare(NodeDeclarationBuilder &b) -{ - b.is_function_node(); - b.add_input("Location").subtype(PROP_TRANSLATION); - b.add_input("Rotation"); - b.add_input("Scale").default_value(float3(1)).subtype(PROP_XYZ); - b.add_output("Transform"); -} - -static void search_link_ops(GatherLinkSearchOpParams ¶ms) -{ - if (U.experimental.use_new_matrix_socket) { - nodes::search_link_ops_for_basic_node(params); - } -} - -class CombineTransformFunction : public mf::MultiFunction { - public: - CombineTransformFunction() - { - static const mf::Signature signature = []() { - mf::Signature signature; - mf::SignatureBuilder builder{"Combine Transform", signature}; - builder.single_input("Location"); - builder.single_input("Rotation"); - builder.single_input("Scale"); - builder.single_output("Transform"); - return signature; - }(); - this->set_signature(&signature); - } - - void call(const IndexMask &mask, mf::Params params, mf::Context /*context*/) const override - { - const VArray location = params.readonly_single_input(0, "Location"); - const VArray rotation = params.readonly_single_input(1, "Rotation"); - const VArray scale = params.readonly_single_input(2, "Scale"); - MutableSpan transforms = params.uninitialized_single_output(3, "Transform"); - - const std::optional location_single = location.get_if_single(); - const std::optional rotation_single = rotation.get_if_single(); - const std::optional scale_single = scale.get_if_single(); - - const bool no_translation = location_single && math::is_zero(*location_single); - const bool no_rotation = rotation_single && math::angle_of(*rotation_single).radian() < 1e-7f; - const bool no_scale = scale_single && math::is_equal(*scale_single, float3(1), 1e-7f); - - if (no_rotation && no_scale) { - mask.foreach_index( - [&](const int64_t i) { transforms[i] = math::from_location(location[i]); }); - } - else if (no_translation && no_scale) { - mask.foreach_index( - [&](const int64_t i) { transforms[i] = math::from_rotation(rotation[i]); }); - } - else if (no_translation && no_rotation) { - mask.foreach_index( - [&](const int64_t i) { transforms[i] = math::from_scale(scale[i]); }); - } - else { - mask.foreach_index([&](const int64_t i) { - transforms[i] = math::from_loc_rot_scale(location[i], rotation[i], scale[i]); - }); - } - } -}; - -static void node_build_multi_function(NodeMultiFunctionBuilder &builder) -{ - static CombineTransformFunction fn; - builder.set_matching_fn(fn); -} - -static void node_register() -{ - static bNodeType ntype; - fn_node_type_base(&ntype, FN_NODE_COMBINE_TRANSFORM, "Combine Transform", NODE_CLASS_CONVERTER); - ntype.declare = node_declare; - ntype.gather_link_search_ops = search_link_ops; - ntype.build_multi_function = node_build_multi_function; - nodeRegisterType(&ntype); -} -NOD_REGISTER_NODE(node_register) - -} // namespace blender::nodes::node_fn_combine_transform_cc diff --git a/source/blender/nodes/function/nodes/node_fn_compare.cc b/source/blender/nodes/function/nodes/node_fn_compare.cc index 55f4210aaf9..71d03ac22fd 100644 --- a/source/blender/nodes/function/nodes/node_fn_compare.cc +++ b/source/blender/nodes/function/nodes/node_fn_compare.cc @@ -9,7 +9,7 @@ #include "BLI_string.h" #include "BLI_string_utf8.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "UI_interface.hh" #include "UI_resources.hh" diff --git a/source/blender/nodes/function/nodes/node_fn_input_bool.cc b/source/blender/nodes/function/nodes/node_fn_input_bool.cc index 4e1a3030c4d..e9848b61d78 100644 --- a/source/blender/nodes/function/nodes/node_fn_input_bool.cc +++ b/source/blender/nodes/function/nodes/node_fn_input_bool.cc @@ -4,6 +4,8 @@ #include "node_function_util.hh" +#include "BLI_hash.h" + #include "UI_interface.hh" #include "UI_resources.hh" diff --git a/source/blender/nodes/function/nodes/node_fn_input_color.cc b/source/blender/nodes/function/nodes/node_fn_input_color.cc index 309e28d4bdf..35896ea4e3f 100644 --- a/source/blender/nodes/function/nodes/node_fn_input_color.cc +++ b/source/blender/nodes/function/nodes/node_fn_input_color.cc @@ -18,8 +18,8 @@ static void node_declare(NodeDeclarationBuilder &b) static void node_layout(uiLayout *layout, bContext * /*C*/, PointerRNA *ptr) { - uiTemplateColorPicker(layout, ptr, "value", true, false, false, true); - uiItemR(layout, ptr, "value", UI_ITEM_R_SPLIT_EMPTY_NAME, "", ICON_NONE); + uiTemplateColorPicker(layout, ptr, "color", true, false, false, true); + uiItemR(layout, ptr, "color", UI_ITEM_R_SPLIT_EMPTY_NAME, "", ICON_NONE); } static void node_build_multi_function(blender::nodes::NodeMultiFunctionBuilder &builder) diff --git a/source/blender/nodes/function/nodes/node_fn_input_int.cc b/source/blender/nodes/function/nodes/node_fn_input_int.cc index 993b66741ce..cf840a7dedf 100644 --- a/source/blender/nodes/function/nodes/node_fn_input_int.cc +++ b/source/blender/nodes/function/nodes/node_fn_input_int.cc @@ -4,6 +4,8 @@ #include "node_function_util.hh" +#include "BLI_hash.h" + #include "UI_interface.hh" #include "UI_resources.hh" 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 44b00de2b20..f0fbc57af38 100644 --- a/source/blender/nodes/function/nodes/node_fn_input_vector.cc +++ b/source/blender/nodes/function/nodes/node_fn_input_vector.cc @@ -4,6 +4,8 @@ #include "node_function_util.hh" +#include "BLI_hash.h" + #include "UI_interface.hh" #include "UI_resources.hh" diff --git a/source/blender/nodes/function/nodes/node_fn_invert_matrix.cc b/source/blender/nodes/function/nodes/node_fn_invert_matrix.cc deleted file mode 100644 index a6a7f3413cc..00000000000 --- a/source/blender/nodes/function/nodes/node_fn_invert_matrix.cc +++ /dev/null @@ -1,45 +0,0 @@ -/* SPDX-FileCopyrightText: 2023 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -#include "BLI_math_matrix.hh" - -#include "NOD_socket_search_link.hh" - -#include "node_function_util.hh" - -namespace blender::nodes::node_fn_invert_matrix_cc { - -static void node_declare(NodeDeclarationBuilder &b) -{ - b.is_function_node(); - b.add_input("Matrix"); - b.add_output("Matrix"); -} - -static void search_link_ops(GatherLinkSearchOpParams ¶ms) -{ - if (U.experimental.use_new_matrix_socket) { - nodes::search_link_ops_for_basic_node(params); - } -} - -static void node_build_multi_function(NodeMultiFunctionBuilder &builder) -{ - static auto fn = mf::build::SI1_SO( - "Invert Matrix", [](float4x4 matrix) { return math::invert(matrix); }); - builder.set_matching_fn(fn); -} - -static void node_register() -{ - static bNodeType ntype; - fn_node_type_base(&ntype, FN_NODE_INVERT_MATRIX, "Invert Matrix", NODE_CLASS_CONVERTER); - ntype.declare = node_declare; - ntype.gather_link_search_ops = search_link_ops; - ntype.build_multi_function = node_build_multi_function; - nodeRegisterType(&ntype); -} -NOD_REGISTER_NODE(node_register) - -} // namespace blender::nodes::node_fn_invert_matrix_cc diff --git a/source/blender/nodes/function/nodes/node_fn_matrix_multiply.cc b/source/blender/nodes/function/nodes/node_fn_matrix_multiply.cc deleted file mode 100644 index 5d06b6dada3..00000000000 --- a/source/blender/nodes/function/nodes/node_fn_matrix_multiply.cc +++ /dev/null @@ -1,46 +0,0 @@ -/* SPDX-FileCopyrightText: 2023 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -#include "BLI_math_matrix.hh" - -#include "NOD_socket_search_link.hh" - -#include "node_function_util.hh" - -namespace blender::nodes::node_fn_matrix_multiply_cc { - -static void node_declare(NodeDeclarationBuilder &b) -{ - b.is_function_node(); - b.add_input("Matrix"); - b.add_input("Matrix", "Matrix_001"); - b.add_output("Matrix"); -} - -static void search_link_ops(GatherLinkSearchOpParams ¶ms) -{ - if (U.experimental.use_new_matrix_socket) { - nodes::search_link_ops_for_basic_node(params); - } -} - -static void node_build_multi_function(NodeMultiFunctionBuilder &builder) -{ - static auto fn = mf::build::SI2_SO( - "Multiply Matrices", [](float4x4 a, float4x4 b) { return a * b; }); - builder.set_matching_fn(fn); -} - -static void node_register() -{ - static bNodeType ntype; - fn_node_type_base(&ntype, FN_NODE_MATRIX_MULTIPLY, "Multiply Matrices", NODE_CLASS_CONVERTER); - ntype.declare = node_declare; - ntype.gather_link_search_ops = search_link_ops; - ntype.build_multi_function = node_build_multi_function; - nodeRegisterType(&ntype); -} -NOD_REGISTER_NODE(node_register) - -} // namespace blender::nodes::node_fn_matrix_multiply_cc diff --git a/source/blender/nodes/function/nodes/node_fn_replace_string.cc b/source/blender/nodes/function/nodes/node_fn_replace_string.cc index 54aa423e60b..7a6a8d194f0 100644 --- a/source/blender/nodes/function/nodes/node_fn_replace_string.cc +++ b/source/blender/nodes/function/nodes/node_fn_replace_string.cc @@ -2,6 +2,7 @@ * * SPDX-License-Identifier: GPL-2.0-or-later */ +#include "BLI_string_utf8.h" #include "BLI_string_utils.hh" #include "node_function_util.hh" diff --git a/source/blender/nodes/function/nodes/node_fn_separate_transform.cc b/source/blender/nodes/function/nodes/node_fn_separate_transform.cc deleted file mode 100644 index 20bb5216ad1..00000000000 --- a/source/blender/nodes/function/nodes/node_fn_separate_transform.cc +++ /dev/null @@ -1,92 +0,0 @@ -/* SPDX-FileCopyrightText: 2023 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -#include "BLI_math_matrix.hh" -#include "BLI_math_rotation.hh" - -#include "NOD_socket_search_link.hh" - -#include "node_function_util.hh" - -namespace blender::nodes::node_fn_separate_transform_cc { - -static void node_declare(NodeDeclarationBuilder &b) -{ - b.is_function_node(); - b.add_input("Transform"); - b.add_output("Location").subtype(PROP_TRANSLATION); - b.add_output("Rotation"); - b.add_output("Scale").subtype(PROP_XYZ); -}; - -static void search_link_ops(GatherLinkSearchOpParams ¶ms) -{ - if (U.experimental.use_new_matrix_socket) { - nodes::search_link_ops_for_basic_node(params); - } -} - -class SeparateTransformFunction : public mf::MultiFunction { - public: - SeparateTransformFunction() - { - static const mf::Signature signature = []() { - mf::Signature signature; - mf::SignatureBuilder builder{"Separate Transform", signature}; - builder.single_input("Transform"); - builder.single_output("Location", mf::ParamFlag::SupportsUnusedOutput); - builder.single_output("Rotation", mf::ParamFlag::SupportsUnusedOutput); - builder.single_output("Scale", mf::ParamFlag::SupportsUnusedOutput); - return signature; - }(); - this->set_signature(&signature); - } - - void call(const IndexMask &mask, mf::Params params, mf::Context /*context*/) const override - { - const VArraySpan transforms = params.readonly_single_input(0, "Transform"); - MutableSpan location = params.uninitialized_single_output_if_required(1, "Location"); - MutableSpan rotation = params.uninitialized_single_output_if_required( - 2, "Rotation"); - MutableSpan scale = params.uninitialized_single_output_if_required(3, "Scale"); - - if (!location.is_empty()) { - mask.foreach_index_optimized( - [&](const int64_t i) { location[i] = transforms[i].location(); }); - } - - if (rotation.is_empty() && !scale.is_empty()) { - mask.foreach_index([&](const int64_t i) { location[i] = math::to_scale(transforms[i]); }); - } - else if (!rotation.is_empty() && scale.is_empty()) { - mask.foreach_index( - [&](const int64_t i) { rotation[i] = math::to_quaternion(transforms[i]); }); - } - else if (!rotation.is_empty() && !scale.is_empty()) { - mask.foreach_index([&](const int64_t i) { - math::to_rot_scale(float3x3(transforms[i]), rotation[i], scale[i]); - }); - } - } -}; - -static void node_build_multi_function(NodeMultiFunctionBuilder &builder) -{ - static SeparateTransformFunction fn; - builder.set_matching_fn(fn); -} - -static void node_register() -{ - static bNodeType ntype; - fn_node_type_base( - &ntype, FN_NODE_SEPARATE_TRANSFORM, "Separate Transform", NODE_CLASS_CONVERTER); - ntype.declare = node_declare; - ntype.gather_link_search_ops = search_link_ops; - ntype.build_multi_function = node_build_multi_function; - nodeRegisterType(&ntype); -} -NOD_REGISTER_NODE(node_register) - -} // namespace blender::nodes::node_fn_separate_transform_cc diff --git a/source/blender/nodes/function/nodes/node_fn_transform_direction.cc b/source/blender/nodes/function/nodes/node_fn_transform_direction.cc deleted file mode 100644 index 952dcb66708..00000000000 --- a/source/blender/nodes/function/nodes/node_fn_transform_direction.cc +++ /dev/null @@ -1,49 +0,0 @@ -/* SPDX-FileCopyrightText: 2023 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -#include "BLI_math_matrix.hh" - -#include "NOD_socket_search_link.hh" - -#include "node_function_util.hh" - -namespace blender::nodes::node_fn_transform_direction_cc { - -static void node_declare(NodeDeclarationBuilder &b) -{ - b.is_function_node(); - b.add_input("Direction").subtype(PROP_XYZ); - b.add_input("Transform"); - b.add_output("Direction").subtype(PROP_XYZ); -} - -static void search_link_ops(GatherLinkSearchOpParams ¶ms) -{ - if (U.experimental.use_new_matrix_socket) { - nodes::search_link_ops_for_basic_node(params); - } -} - -static void node_build_multi_function(NodeMultiFunctionBuilder &builder) -{ - static auto fn = mf::build::SI2_SO( - "Transform Direction", [](float3 direction, float4x4 matrix) { - return math::transform_direction(matrix, direction); - }); - builder.set_matching_fn(fn); -} - -static void node_register() -{ - static bNodeType ntype; - fn_node_type_base( - &ntype, FN_NODE_TRANSFORM_DIRECTION, "Transform Direction", NODE_CLASS_CONVERTER); - ntype.declare = node_declare; - ntype.gather_link_search_ops = search_link_ops; - ntype.build_multi_function = node_build_multi_function; - nodeRegisterType(&ntype); -} -NOD_REGISTER_NODE(node_register) - -} // namespace blender::nodes::node_fn_transform_direction_cc diff --git a/source/blender/nodes/function/nodes/node_fn_transform_point.cc b/source/blender/nodes/function/nodes/node_fn_transform_point.cc deleted file mode 100644 index ef04cce0a62..00000000000 --- a/source/blender/nodes/function/nodes/node_fn_transform_point.cc +++ /dev/null @@ -1,47 +0,0 @@ -/* SPDX-FileCopyrightText: 2023 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -#include "BLI_math_matrix.hh" - -#include "NOD_socket_search_link.hh" - -#include "node_function_util.hh" - -namespace blender::nodes::node_fn_transform_point_cc { - -static void node_declare(NodeDeclarationBuilder &b) -{ - b.is_function_node(); - b.add_input("Vector").subtype(PROP_XYZ); - b.add_input("Transform"); - b.add_output("Vector").subtype(PROP_XYZ); -} - -static void search_link_ops(GatherLinkSearchOpParams ¶ms) -{ - if (U.experimental.use_new_matrix_socket) { - nodes::search_link_ops_for_basic_node(params); - } -} - -static void node_build_multi_function(NodeMultiFunctionBuilder &builder) -{ - static auto fn = mf::build::SI2_SO( - "Transform Point", - [](float3 point, float4x4 matrix) { return math::transform_point(matrix, point); }); - builder.set_matching_fn(fn); -} - -static void node_register() -{ - static bNodeType ntype; - fn_node_type_base(&ntype, FN_NODE_TRANSFORM_POINT, "Transform Point", NODE_CLASS_CONVERTER); - ntype.declare = node_declare; - ntype.gather_link_search_ops = search_link_ops; - ntype.build_multi_function = node_build_multi_function; - nodeRegisterType(&ntype); -} -NOD_REGISTER_NODE(node_register) - -} // namespace blender::nodes::node_fn_transform_point_cc diff --git a/source/blender/nodes/function/nodes/node_fn_transpose_matrix.cc b/source/blender/nodes/function/nodes/node_fn_transpose_matrix.cc deleted file mode 100644 index 31d46770be1..00000000000 --- a/source/blender/nodes/function/nodes/node_fn_transpose_matrix.cc +++ /dev/null @@ -1,45 +0,0 @@ -/* SPDX-FileCopyrightText: 2023 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -#include "BLI_math_matrix.hh" - -#include "NOD_socket_search_link.hh" - -#include "node_function_util.hh" - -namespace blender::nodes::node_fn_transpose_matrix_cc { - -static void node_declare(NodeDeclarationBuilder &b) -{ - b.is_function_node(); - b.add_input("Matrix"); - b.add_output("Matrix"); -} - -static void search_link_ops(GatherLinkSearchOpParams ¶ms) -{ - if (U.experimental.use_new_matrix_socket) { - nodes::search_link_ops_for_basic_node(params); - } -} - -static void node_build_multi_function(NodeMultiFunctionBuilder &builder) -{ - static auto fn = mf::build::SI1_SO( - "Transpose Matrix", [](float4x4 matrix) { return math::transpose(matrix); }); - builder.set_matching_fn(fn); -} - -static void node_register() -{ - static bNodeType ntype; - fn_node_type_base(&ntype, FN_NODE_TRANSPOSE_MATRIX, "Transpose Matrix", NODE_CLASS_CONVERTER); - ntype.declare = node_declare; - ntype.gather_link_search_ops = search_link_ops; - ntype.build_multi_function = node_build_multi_function; - nodeRegisterType(&ntype); -} -NOD_REGISTER_NODE(node_register) - -} // namespace blender::nodes::node_fn_transpose_matrix_cc diff --git a/source/blender/nodes/geometry/CMakeLists.txt b/source/blender/nodes/geometry/CMakeLists.txt index a9d1dd22088..72c672048db 100644 --- a/source/blender/nodes/geometry/CMakeLists.txt +++ b/source/blender/nodes/geometry/CMakeLists.txt @@ -64,7 +64,6 @@ set(SRC nodes/node_geo_curve_trim.cc nodes/node_geo_deform_curves_on_surface.cc nodes/node_geo_delete_geometry.cc - nodes/node_geo_distribute_points_in_grid.cc nodes/node_geo_distribute_points_in_volume.cc nodes/node_geo_distribute_points_on_faces.cc nodes/node_geo_dual_mesh.cc @@ -79,7 +78,6 @@ set(SRC nodes/node_geo_flip_faces.cc nodes/node_geo_geometry_to_instance.cc nodes/node_geo_get_named_grid.cc - nodes/node_geo_grid_to_mesh.cc nodes/node_geo_image.cc nodes/node_geo_image_info.cc nodes/node_geo_image_texture.cc @@ -122,8 +120,8 @@ set(SRC nodes/node_geo_join_geometry.cc nodes/node_geo_material_replace.cc nodes/node_geo_material_selection.cc - nodes/node_geo_menu_switch.cc nodes/node_geo_merge_by_distance.cc + nodes/node_geo_menu_switch.cc nodes/node_geo_mesh_face_group_boundaries.cc nodes/node_geo_mesh_primitive_circle.cc nodes/node_geo_mesh_primitive_cone.cc @@ -135,9 +133,7 @@ set(SRC nodes/node_geo_mesh_primitive_uv_sphere.cc nodes/node_geo_mesh_subdivide.cc nodes/node_geo_mesh_to_curve.cc - nodes/node_geo_mesh_to_density_grid.cc nodes/node_geo_mesh_to_points.cc - nodes/node_geo_mesh_to_sdf_grid.cc nodes/node_geo_mesh_to_volume.cc nodes/node_geo_mesh_topology_corners_of_edge.cc nodes/node_geo_mesh_topology_corners_of_face.cc @@ -151,7 +147,6 @@ set(SRC nodes/node_geo_offset_point_in_curve.cc nodes/node_geo_points.cc nodes/node_geo_points_to_curves.cc - nodes/node_geo_points_to_sdf_grid.cc nodes/node_geo_points_to_vertices.cc nodes/node_geo_points_to_volume.cc nodes/node_geo_proximity.cc @@ -160,7 +155,6 @@ set(SRC nodes/node_geo_remove_attribute.cc nodes/node_geo_repeat.cc nodes/node_geo_rotate_instances.cc - nodes/node_geo_sample_grid.cc nodes/node_geo_sample_index.cc nodes/node_geo_sample_nearest.cc nodes/node_geo_sample_nearest_surface.cc diff --git a/source/blender/nodes/geometry/node_geometry_tree.cc b/source/blender/nodes/geometry/node_geometry_tree.cc index 6eba7e1490d..f2fbb363c55 100644 --- a/source/blender/nodes/geometry/node_geometry_tree.cc +++ b/source/blender/nodes/geometry/node_geometry_tree.cc @@ -19,11 +19,12 @@ #include "DNA_node_types.h" #include "DNA_space_types.h" +#include "RNA_access.hh" #include "RNA_prototypes.h" #include "UI_resources.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "node_common.h" @@ -96,15 +97,6 @@ static bool geometry_node_tree_validate_link(eNodeSocketDatatype type_a, /* Floats and vectors implicitly convert to rotations. */ return true; } - - /* Support implicit conversions between matrices and rotations. */ - if (type_a == SOCK_MATRIX && type_b == SOCK_ROTATION) { - return true; - } - if (type_a == SOCK_ROTATION && type_b == SOCK_MATRIX) { - return true; - } - if (type_a == SOCK_ROTATION && type_b == SOCK_VECTOR) { /* Rotations implicitly convert to vectors. */ return true; @@ -115,16 +107,12 @@ static bool geometry_node_tree_validate_link(eNodeSocketDatatype type_a, static bool geometry_node_tree_socket_type_valid(bNodeTreeType * /*treetype*/, bNodeSocketType *socket_type) { - if (socket_type->type == SOCK_MATRIX) { - return U.experimental.use_new_matrix_socket; - } return blender::bke::nodeIsStaticSocketType(socket_type) && ELEM(socket_type->type, SOCK_FLOAT, SOCK_VECTOR, SOCK_RGBA, SOCK_BOOLEAN, SOCK_ROTATION, - SOCK_MATRIX, SOCK_INT, SOCK_STRING, SOCK_OBJECT, diff --git a/source/blender/nodes/geometry/node_geometry_util.cc b/source/blender/nodes/geometry/node_geometry_util.cc index fa70ead5caf..7da1b446611 100644 --- a/source/blender/nodes/geometry/node_geometry_util.cc +++ b/source/blender/nodes/geometry/node_geometry_util.cc @@ -7,7 +7,11 @@ #include "DNA_space_types.h" +#include "BKE_context.hh" +#include "BKE_mesh.hh" +#include "BKE_mesh_runtime.hh" #include "BKE_node.hh" +#include "BKE_pointcloud.hh" #include "NOD_rna_define.hh" #include "NOD_socket_search_link.hh" @@ -33,13 +37,6 @@ void search_link_ops_for_tool_node(GatherLinkSearchOpParams ¶ms) } } -void search_link_ops_for_volume_grid_node(GatherLinkSearchOpParams ¶ms) -{ - if (U.experimental.use_new_volume_nodes) { - nodes::search_link_ops_for_basic_node(params); - } -} - namespace enums { const EnumPropertyItem *attribute_type_type_with_socket_fn(bContext * /*C*/, @@ -57,9 +54,6 @@ const EnumPropertyItem *attribute_type_type_with_socket_fn(bContext * /*C*/, bool generic_attribute_type_supported(const EnumPropertyItem &item) { - if (item.value == SOCK_MATRIX) { - return U.experimental.use_new_matrix_socket; - } return ELEM(item.value, CD_PROP_FLOAT, CD_PROP_FLOAT2, @@ -68,8 +62,7 @@ bool generic_attribute_type_supported(const EnumPropertyItem &item) CD_PROP_BOOL, CD_PROP_INT32, CD_PROP_BYTE_COLOR, - CD_PROP_QUATERNION, - CD_PROP_FLOAT4X4); + CD_PROP_QUATERNION); } const EnumPropertyItem *domain_experimental_grease_pencil_version3_fn(bContext * /*C*/, diff --git a/source/blender/nodes/geometry/node_geometry_util.hh b/source/blender/nodes/geometry/node_geometry_util.hh index d6e5ac37df2..0ed8091c216 100644 --- a/source/blender/nodes/geometry/node_geometry_util.hh +++ b/source/blender/nodes/geometry/node_geometry_util.hh @@ -32,7 +32,6 @@ namespace blender::nodes { bool check_tool_context_and_error(GeoNodeExecParams ¶ms); void search_link_ops_for_tool_node(GatherLinkSearchOpParams ¶ms); -void search_link_ops_for_volume_grid_node(GatherLinkSearchOpParams ¶ms); void get_closest_in_bvhtree(BVHTreeFromMesh &tree_data, const VArray &positions, diff --git a/source/blender/nodes/geometry/nodes/node_geo_attribute_capture.cc b/source/blender/nodes/geometry/nodes/node_geo_attribute_capture.cc index 77f3088b21e..350b0cab782 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_attribute_capture.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_attribute_capture.cc @@ -7,6 +7,8 @@ #include "UI_interface.hh" #include "UI_resources.hh" +#include "BKE_attribute_math.hh" + #include "NOD_socket_search_link.hh" #include "RNA_enum_types.hh" diff --git a/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc b/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc index 92cadeae334..a17ad8a743b 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc @@ -11,6 +11,7 @@ #include "UI_resources.hh" #include "BLI_array_utils.hh" +#include "BLI_math_base_safe.h" #include "NOD_socket_search_link.hh" diff --git a/source/blender/nodes/geometry/nodes/node_geo_bake.cc b/source/blender/nodes/geometry/nodes/node_geo_bake.cc index a0a3a1dd47f..8cdd8655c0f 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_bake.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_bake.cc @@ -217,7 +217,7 @@ class LazyFunctionForBakeNode final : public LazyFunction { user_data)) { tree_logger->node_warnings.append( - *tree_logger->allocator, {node_.identifier, {NodeWarningType::Error, info->message}}); + {node_.identifier, {NodeWarningType::Error, info->message}}); } this->set_default_outputs(params); } diff --git a/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc b/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc index 9084f84608c..add95916d7e 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc @@ -88,10 +88,6 @@ static void node_gather_link_searches(GatherLinkSearchOpParams ¶ms) /* Don't implement quaternion blurring for now. */ return; } - if (fixed_data_type == CD_PROP_FLOAT4X4) { - /* Don't implement matrix blurring for now. */ - return; - } if (fixed_data_type == CD_PROP_BOOL) { /* This node does not support boolean sockets, use integer instead. */ fixed_data_type = CD_PROP_INT32; diff --git a/source/blender/nodes/geometry/nodes/node_geo_boolean.cc b/source/blender/nodes/geometry/nodes/node_geo_boolean.cc index bc0440f435b..60622c4bf77 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_boolean.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_boolean.cc @@ -4,6 +4,7 @@ #include "BKE_geometry_set_instances.hh" #include "BKE_instances.hh" +#include "BKE_mesh_boolean_convert.hh" #include "DNA_mesh_types.h" #include "DNA_object_types.h" @@ -13,7 +14,6 @@ #include "UI_interface.hh" #include "UI_resources.hh" -#include "GEO_mesh_boolean.hh" #include "GEO_randomize.hh" #include "node_geometry_util.hh" @@ -30,15 +30,12 @@ static void node_declare(NodeDeclarationBuilder &b) b.add_input("Self Intersection"); b.add_input("Hole Tolerant"); b.add_output("Mesh").propagate_all(); - b.add_output("Intersecting Edges").field_on_all().make_available([](bNode &node) { - node.custom2 = int16_t(geometry::boolean::Solver::MeshArr); - }); + b.add_output("Intersecting Edges").field_on_all(); } static void node_layout(uiLayout *layout, bContext * /*C*/, PointerRNA *ptr) { uiItemR(layout, ptr, "operation", UI_ITEM_NONE, "", ICON_NONE); - uiItemR(layout, ptr, "solver", UI_ITEM_NONE, "", ICON_NONE); } struct AttributeOutputs { @@ -47,34 +44,27 @@ struct AttributeOutputs { static void node_update(bNodeTree *ntree, bNode *node) { - const geometry::boolean::Operation operation = geometry::boolean::Operation(node->custom1); - const geometry::boolean::Solver solver = geometry::boolean::Solver(node->custom2); + GeometryNodeBooleanOperation operation = (GeometryNodeBooleanOperation)node->custom1; bNodeSocket *geometry_1_socket = static_cast(node->inputs.first); bNodeSocket *geometry_2_socket = geometry_1_socket->next; - bNodeSocket *intersecting_edges_socket = static_cast(node->outputs.last); - switch (operation) { - case geometry::boolean::Operation::Intersect: - case geometry::boolean::Operation::Union: + case GEO_NODE_BOOLEAN_INTERSECT: + case GEO_NODE_BOOLEAN_UNION: bke::nodeSetSocketAvailability(ntree, geometry_1_socket, false); node_sock_label(geometry_2_socket, "Mesh"); break; - case geometry::boolean::Operation::Difference: + case GEO_NODE_BOOLEAN_DIFFERENCE: bke::nodeSetSocketAvailability(ntree, geometry_1_socket, true); node_sock_label(geometry_2_socket, "Mesh 2"); break; } - - bke::nodeSetSocketAvailability( - ntree, intersecting_edges_socket, solver == geometry::boolean::Solver::MeshArr); } static void node_init(bNodeTree * /*tree*/, bNode *node) { - node->custom1 = int16_t(geometry::boolean::Operation::Difference); - node->custom2 = int16_t(geometry::boolean::Solver::Float); + node->custom1 = GEO_NODE_BOOLEAN_DIFFERENCE; } #ifdef WITH_GMP @@ -92,8 +82,7 @@ static Array calc_mesh_material_map(const Mesh &mesh, VectorSet("Self Intersection"); const bool hole_tolerant = params.get_input("Hole Tolerant"); @@ -103,7 +92,7 @@ static void node_geo_exec(GeoNodeExecParams params) Vector> material_remaps; GeometrySet set_a; - if (operation == geometry::boolean::Operation::Difference) { + if (operation == GEO_NODE_BOOLEAN_DIFFERENCE) { set_a = params.extract_input("Mesh 1"); /* Note that it technically wouldn't be necessary to realize the instances for the first * geometry input, but the boolean code expects the first shape for the difference operation @@ -164,24 +153,18 @@ static void node_geo_exec(GeoNodeExecParams params) } AttributeOutputs attribute_outputs; - if (solver == geometry::boolean::Solver::MeshArr) { - attribute_outputs.intersecting_edges_id = params.get_output_anonymous_attribute_id_if_needed( - "Intersecting Edges"); - } + attribute_outputs.intersecting_edges_id = params.get_output_anonymous_attribute_id_if_needed( + "Intersecting Edges"); Vector intersecting_edges; - geometry::boolean::BooleanOpParameters op_params; - op_params.boolean_mode = operation; - op_params.no_self_intersections = !use_self; - op_params.watertight = !hole_tolerant; - op_params.no_nested_components = true; /* TODO: make this configurable. */ - Mesh *result = geometry::boolean::mesh_boolean( + Mesh *result = blender::meshintersect::direct_mesh_boolean( meshes, transforms, float4x4::identity(), material_remaps, - op_params, - solver, + use_self, + hole_tolerant, + operation, attribute_outputs.intersecting_edges_id ? &intersecting_edges : nullptr); if (!result) { params.set_default_remaining_outputs(); @@ -220,36 +203,19 @@ static void node_geo_exec(GeoNodeExecParams params) static void node_rna(StructRNA *srna) { static const EnumPropertyItem rna_node_geometry_boolean_method_items[] = { - {int(geometry::boolean::Operation::Intersect), + {GEO_NODE_BOOLEAN_INTERSECT, "INTERSECT", 0, "Intersect", "Keep the part of the mesh that is common between all operands"}, - {int(geometry::boolean::Operation::Union), - "UNION", - 0, - "Union", - "Combine meshes in an additive way"}, - {int(geometry::boolean::Operation::Difference), + {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, nullptr, 0, nullptr, nullptr}, }; - static const EnumPropertyItem rna_geometry_boolean_solver_items[] = { - {int(geometry::boolean::Solver::MeshArr), - "EXACT", - 0, - "Exact", - "Exact solver for the best results"}, - {int(geometry::boolean::Solver::Float), - "FLOAT", - 0, - "Float", - "Simple solver for the best performance, without support for overlapping geometry"}, - {0, nullptr, 0, nullptr, nullptr}, - }; RNA_def_node_enum(srna, "operation", @@ -257,15 +223,7 @@ static void node_rna(StructRNA *srna) "", rna_node_geometry_boolean_method_items, NOD_inline_enum_accessors(custom1), - int(geometry::boolean::Operation::Intersect)); - - RNA_def_node_enum(srna, - "solver", - "Solver", - "", - rna_geometry_boolean_solver_items, - NOD_inline_enum_accessors(custom2), - int(geometry::boolean::Solver::Float)); + GEO_NODE_BOOLEAN_INTERSECT); } static void node_register() 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 7b2f7fa887b..44347f613e1 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_collection_info.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_collection_info.cc @@ -2,6 +2,7 @@ * * SPDX-License-Identifier: GPL-2.0-or-later */ +#include "BLI_math_matrix.h" #include "BLI_string.h" #include "DNA_collection_types.h" @@ -11,7 +12,7 @@ #include "UI_interface.hh" #include "UI_resources.hh" -#include "BKE_collection.hh" +#include "BKE_collection.h" #include "BKE_instances.hh" #include "node_geometry_util.hh" @@ -96,7 +97,7 @@ static void node_geo_exec(GeoNodeExecParams params) if (!reset_children) { transform.location() += float3(child_collection->instance_offset); if (use_relative_transform) { - transform = self_object->world_to_object() * transform; + transform = float4x4(self_object->world_to_object) * transform; } else { transform.location() -= float3(collection->instance_offset); @@ -110,12 +111,12 @@ static void node_geo_exec(GeoNodeExecParams params) float4x4 transform = float4x4::identity(); if (!reset_children) { if (use_relative_transform) { - transform = self_object->world_to_object(); + transform = float4x4(self_object->world_to_object); } else { transform.location() -= float3(collection->instance_offset); } - transform *= child_object->object_to_world(); + transform *= float4x4(child_object->object_to_world); } entries.append({handle, &(child_object->id.name[2]), transform}); } @@ -133,7 +134,7 @@ static void node_geo_exec(GeoNodeExecParams params) float4x4 transform = float4x4::identity(); if (use_relative_transform) { transform.location() = collection->instance_offset; - transform = self_object->world_to_object() * transform; + transform = float4x4_view(self_object->world_to_object) * transform; } const int handle = instances->add_reference(*collection); diff --git a/source/blender/nodes/geometry/nodes/node_geo_curve_endpoint_selection.cc b/source/blender/nodes/geometry/nodes/node_geo_curve_endpoint_selection.cc index 5ad5be7b90e..dfbff4ee98b 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_curve_endpoint_selection.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_curve_endpoint_selection.cc @@ -6,6 +6,7 @@ #include "BKE_curves.hh" +#include "UI_interface.hh" #include "UI_resources.hh" #include "node_geometry_util.hh" @@ -64,7 +65,7 @@ class EndpointFieldInput final : public bke::CurvesFieldInput { Array selection(curves.points_num(), false); MutableSpan selection_span = selection.as_mutable_span(); const OffsetIndices points_by_curve = curves.points_by_curve(); - devirtualize_varray2(start_size, end_size, [&](const auto start_size, const auto end_size) { + devirtualize_varray2(start_size, end_size, [&](const auto &start_size, const auto &end_size) { threading::parallel_for(curves.curves_range(), 1024, [&](IndexRange curves_range) { for (const int i : curves_range) { const IndexRange points = points_by_curve[i]; @@ -80,18 +81,18 @@ class EndpointFieldInput final : public bke::CurvesFieldInput { return VArray::ForContainer(std::move(selection)); }; - void for_each_field_input_recursive(FunctionRef fn) const final + void for_each_field_input_recursive(FunctionRef fn) const override { start_size_.node().for_each_field_input_recursive(fn); end_size_.node().for_each_field_input_recursive(fn); } - uint64_t hash() const final + uint64_t hash() const override { return get_default_hash(start_size_, end_size_); } - bool is_equal_to(const fn::FieldNode &other) const final + bool is_equal_to(const fn::FieldNode &other) const override { if (const EndpointFieldInput *other_endpoint = dynamic_cast( &other)) @@ -101,7 +102,7 @@ class EndpointFieldInput final : public bke::CurvesFieldInput { return false; } - std::optional preferred_domain(const bke::CurvesGeometry & /*curves*/) const final + std::optional preferred_domain(const CurvesGeometry & /*curves*/) const { return AttrDomain::Point; } diff --git a/source/blender/nodes/geometry/nodes/node_geo_curve_fill.cc b/source/blender/nodes/geometry/nodes/node_geo_curve_fill.cc index 870367b10c1..a4547b19df5 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_curve_fill.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_curve_fill.cc @@ -132,16 +132,26 @@ static Array> do_group_aware_cdt( return {do_cdt(curves, output_type)}; } - VectorSet group_indexing; + const VArraySpan group_ids_span(curve_group_ids); + const int domain_size = group_ids_span.size(); + + VectorSet group_indexing(group_ids_span); + const int groups_num = group_indexing.size(); + IndexMaskMemory mask_memory; - const Vector group_masks = IndexMask::from_group_ids( - curve_group_ids, mask_memory, group_indexing); - const int groups_num = group_masks.size(); + Array group_masks(groups_num); + IndexMask::from_groups( + IndexMask(domain_size), + mask_memory, + [&](const int i) { + const int group_id = group_ids_span[i]; + return group_indexing.index_of(group_id); + }, + group_masks); Array> cdt_results(groups_num); /* The grain size should be larger as each group gets smaller. */ - const int domain_size = curve_group_ids.size(); const int avg_group_size = domain_size / groups_num; const int grain_size = std::max(8192 / avg_group_size, 1); threading::parallel_for(IndexRange(groups_num), grain_size, [&](const IndexRange range) { diff --git a/source/blender/nodes/geometry/nodes/node_geo_curve_handle_type_selection.cc b/source/blender/nodes/geometry/nodes/node_geo_curve_handle_type_selection.cc index b5cbe540599..85ba323c1e6 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_curve_handle_type_selection.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_curve_handle_type_selection.cc @@ -98,12 +98,12 @@ class HandleTypeFieldInput final : public bke::CurvesFieldInput { return VArray::ForContainer(std::move(selection)); } - uint64_t hash() const final + uint64_t hash() const override { return get_default_hash(int(mode_), int(type_)); } - bool is_equal_to(const fn::FieldNode &other) const final + bool is_equal_to(const fn::FieldNode &other) const override { if (const HandleTypeFieldInput *other_handle_selection = dynamic_cast(&other)) @@ -113,7 +113,7 @@ class HandleTypeFieldInput final : public bke::CurvesFieldInput { return false; } - std::optional preferred_domain(const bke::CurvesGeometry & /*curves*/) const final + std::optional preferred_domain(const CurvesGeometry & /*curves*/) const { return AttrDomain::Point; } diff --git a/source/blender/nodes/geometry/nodes/node_geo_curve_primitive_arc.cc b/source/blender/nodes/geometry/nodes/node_geo_curve_primitive_arc.cc index dd7176e3231..6ff5d3093d5 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_curve_primitive_arc.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_curve_primitive_arc.cc @@ -4,6 +4,7 @@ #include +#include "BLI_math_base_safe.h" #include "BLI_math_geom.h" #include "BLI_math_matrix.h" #include "BLI_math_rotation.h" diff --git a/source/blender/nodes/geometry/nodes/node_geo_curve_resample.cc b/source/blender/nodes/geometry/nodes/node_geo_curve_resample.cc index 82f58f4e8c3..8efdd6eba71 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_curve_resample.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_curve_resample.cc @@ -81,17 +81,18 @@ static void node_geo_exec(GeoNodeExecParams params) bke::curves_copy_parameters(*src_curves_id, *dst_curves_id); geometry.replace_curves(dst_curves_id); } - if (GreasePencil *grease_pencil = geometry_set.get_grease_pencil_for_write()) { + if (geometry_set.has_grease_pencil()) { using namespace blender::bke::greasepencil; - for (const int layer_index : grease_pencil->layers().index_range()) { - Drawing *drawing = get_eval_grease_pencil_layer_drawing_for_write(*grease_pencil, + GreasePencil &grease_pencil = *geometry_set.get_grease_pencil_for_write(); + for (const int layer_index : grease_pencil.layers().index_range()) { + Drawing *drawing = get_eval_grease_pencil_layer_drawing_for_write(grease_pencil, layer_index); if (drawing == nullptr) { continue; } const bke::CurvesGeometry &src_curves = drawing->strokes(); const bke::GreasePencilLayerFieldContext field_context( - *grease_pencil, AttrDomain::Curve, layer_index); + grease_pencil, AttrDomain::Curve, layer_index); bke::CurvesGeometry dst_curves = geometry::resample_to_count( src_curves, field_context, selection, count); drawing->strokes_for_write() = std::move(dst_curves); @@ -113,17 +114,18 @@ static void node_geo_exec(GeoNodeExecParams params) bke::curves_copy_parameters(*src_curves_id, *dst_curves_id); geometry.replace_curves(dst_curves_id); } - if (GreasePencil *grease_pencil = geometry_set.get_grease_pencil_for_write()) { + if (geometry_set.has_grease_pencil()) { using namespace blender::bke::greasepencil; - for (const int layer_index : grease_pencil->layers().index_range()) { - Drawing *drawing = get_eval_grease_pencil_layer_drawing_for_write(*grease_pencil, + GreasePencil &grease_pencil = *geometry_set.get_grease_pencil_for_write(); + for (const int layer_index : grease_pencil.layers().index_range()) { + Drawing *drawing = get_eval_grease_pencil_layer_drawing_for_write(grease_pencil, layer_index); if (drawing == nullptr) { continue; } const bke::CurvesGeometry &src_curves = drawing->strokes(); const bke::GreasePencilLayerFieldContext field_context( - *grease_pencil, AttrDomain::Curve, layer_index); + grease_pencil, AttrDomain::Curve, layer_index); bke::CurvesGeometry dst_curves = geometry::resample_to_length( src_curves, field_context, selection, length); drawing->strokes_for_write() = std::move(dst_curves); @@ -144,17 +146,18 @@ static void node_geo_exec(GeoNodeExecParams params) bke::curves_copy_parameters(*src_curves_id, *dst_curves_id); geometry.replace_curves(dst_curves_id); } - if (GreasePencil *grease_pencil = geometry_set.get_grease_pencil_for_write()) { + if (geometry_set.has_grease_pencil()) { using namespace blender::bke::greasepencil; - for (const int layer_index : grease_pencil->layers().index_range()) { - Drawing *drawing = get_eval_grease_pencil_layer_drawing_for_write(*grease_pencil, + GreasePencil &grease_pencil = *geometry_set.get_grease_pencil_for_write(); + for (const int layer_index : grease_pencil.layers().index_range()) { + Drawing *drawing = get_eval_grease_pencil_layer_drawing_for_write(grease_pencil, layer_index); if (drawing == nullptr) { continue; } const bke::CurvesGeometry &src_curves = drawing->strokes(); const bke::GreasePencilLayerFieldContext field_context( - *grease_pencil, AttrDomain::Curve, layer_index); + grease_pencil, AttrDomain::Curve, layer_index); bke::CurvesGeometry dst_curves = geometry::resample_to_evaluated( src_curves, field_context, selection); drawing->strokes_for_write() = std::move(dst_curves); diff --git a/source/blender/nodes/geometry/nodes/node_geo_curve_reverse.cc b/source/blender/nodes/geometry/nodes/node_geo_curve_reverse.cc index b91c1823a26..b4fb6866395 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_curve_reverse.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_curve_reverse.cc @@ -62,8 +62,8 @@ static void node_geo_exec(GeoNodeExecParams params) const bke::CurvesFieldContext field_context{curves, AttrDomain::Curve}; reverse_curve(curves, field_context, selection_field); } - if (GreasePencil *grease_pencil = geometry_set.get_grease_pencil_for_write()) { - reverse_grease_pencil(*grease_pencil, selection_field); + if (geometry_set.has_grease_pencil()) { + reverse_grease_pencil(*geometry_set.get_grease_pencil_for_write(), selection_field); } }); diff --git a/source/blender/nodes/geometry/nodes/node_geo_curve_spline_parameter.cc b/source/blender/nodes/geometry/nodes/node_geo_curve_spline_parameter.cc index dcfd0ed961e..11b59bdae17 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_curve_spline_parameter.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_curve_spline_parameter.cc @@ -264,17 +264,17 @@ class IndexOnSplineFieldInput final : public bke::CurvesFieldInput { return VArray::ForContainer(std::move(result)); } - uint64_t hash() const final + uint64_t hash() const override { return 4536246522; } - bool is_equal_to(const fn::FieldNode &other) const final + bool is_equal_to(const fn::FieldNode &other) const override { return dynamic_cast(&other) != nullptr; } - std::optional preferred_domain(const bke::CurvesGeometry & /*curves*/) const final + std::optional preferred_domain(const CurvesGeometry & /*curves*/) const { return AttrDomain::Point; } diff --git a/source/blender/nodes/geometry/nodes/node_geo_curve_spline_type.cc b/source/blender/nodes/geometry/nodes/node_geo_curve_spline_type.cc index dc4cc991893..b6414de0b02 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_curve_spline_type.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_curve_spline_type.cc @@ -66,8 +66,17 @@ static void node_geo_exec(GeoNodeExecParams params) return; } + if (geometry::try_curves_conversion_in_place( + selection, dst_type, [&]() -> bke::CurvesGeometry & { + return geometry_set.get_curves_for_write()->geometry.wrap(); + })) + { + return; + } + bke::CurvesGeometry dst_curves = geometry::convert_curves( src_curves, selection, dst_type, params.get_output_propagation_info("Curve")); + Curves *dst_curves_id = bke::curves_new_nomain(std::move(dst_curves)); bke::curves_copy_parameters(src_curves_id, *dst_curves_id); geometry_set.replace_curves(dst_curves_id); diff --git a/source/blender/nodes/geometry/nodes/node_geo_curve_subdivide.cc b/source/blender/nodes/geometry/nodes/node_geo_curve_subdivide.cc index 24c16affb5e..13392b4e9df 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_curve_subdivide.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_curve_subdivide.cc @@ -7,6 +7,7 @@ #include "GEO_subdivide_curves.hh" +#include "UI_interface.hh" #include "UI_resources.hh" #include "node_geometry_util.hh" diff --git a/source/blender/nodes/geometry/nodes/node_geo_curve_to_mesh.cc b/source/blender/nodes/geometry/nodes/node_geo_curve_to_mesh.cc index a6ec69e35df..8bab6397de4 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_curve_to_mesh.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_curve_to_mesh.cc @@ -8,6 +8,7 @@ #include "BKE_grease_pencil.hh" #include "BKE_instances.hh" +#include "UI_interface.hh" #include "UI_resources.hh" #include "GEO_randomize.hh" diff --git a/source/blender/nodes/geometry/nodes/node_geo_curve_to_points.cc b/source/blender/nodes/geometry/nodes/node_geo_curve_to_points.cc index ab5718a5b42..88d0a2cbe98 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_curve_to_points.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_curve_to_points.cc @@ -5,6 +5,7 @@ #include "BLI_array.hh" #include "BLI_math_matrix.hh" #include "BLI_task.hh" +#include "BLI_timeit.hh" #include "DNA_pointcloud_types.h" @@ -97,9 +98,6 @@ static void copy_curve_domain_attributes(const AttributeAccessor curve_attribute if (meta_data.domain != AttrDomain::Curve) { return true; } - if (meta_data.data_type == CD_PROP_STRING) { - return true; - } point_attributes.add( id, AttrDomain::Point, diff --git a/source/blender/nodes/geometry/nodes/node_geo_deform_curves_on_surface.cc b/source/blender/nodes/geometry/nodes/node_geo_deform_curves_on_surface.cc index ac727161288..1c7ae47d269 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_deform_curves_on_surface.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_deform_curves_on_surface.cc @@ -7,12 +7,19 @@ #include "BKE_editmesh.hh" #include "BKE_lib_id.hh" #include "BKE_mesh.hh" +#include "BKE_mesh_runtime.hh" #include "BKE_mesh_wrapper.hh" #include "BKE_modifier.hh" +#include "BKE_type_conversions.hh" #include "BLI_math_matrix.hh" #include "BLI_task.hh" +#include "UI_interface.hh" +#include "UI_resources.hh" + +#include "NOD_socket_search_link.hh" + #include "GEO_reverse_uv_sampler.hh" #include "DEG_depsgraph_query.hh" diff --git a/source/blender/nodes/geometry/nodes/node_geo_delete_geometry.cc b/source/blender/nodes/geometry/nodes/node_geo_delete_geometry.cc index 27ed816ea42..e086997e8ad 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_delete_geometry.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_delete_geometry.cc @@ -7,6 +7,16 @@ #include "UI_interface.hh" #include "UI_resources.hh" +#include "DNA_grease_pencil_types.h" +#include "DNA_pointcloud_types.h" + +#include "BKE_curves.hh" +#include "BKE_grease_pencil.hh" +#include "BKE_instances.hh" +#include "BKE_mesh.hh" +#include "BKE_pointcloud.hh" + +#include "GEO_mesh_copy_selection.hh" #include "GEO_separate_geometry.hh" #include "RNA_enum_types.hh" diff --git a/source/blender/nodes/geometry/nodes/node_geo_distribute_points_in_grid.cc b/source/blender/nodes/geometry/nodes/node_geo_distribute_points_in_grid.cc deleted file mode 100644 index 923563cb48d..00000000000 --- a/source/blender/nodes/geometry/nodes/node_geo_distribute_points_in_grid.cc +++ /dev/null @@ -1,278 +0,0 @@ -/* SPDX-FileCopyrightText: 2023 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -#ifdef WITH_OPENVDB -# include -# include -# include -#endif - -#include "DNA_node_types.h" -#include "DNA_pointcloud_types.h" - -#include "BKE_pointcloud.hh" -#include "BKE_volume.hh" -#include "BKE_volume_grid.hh" - -#include "NOD_rna_define.hh" - -#include "UI_interface.hh" -#include "UI_resources.hh" - -#include "GEO_randomize.hh" - -#include "node_geometry_util.hh" - -namespace blender::nodes::node_geo_distribute_points_in_grid_cc { - -enum class DistributeMode { - Random = 0, - Grid = 1, -}; - -static void node_declare(NodeDeclarationBuilder &b) -{ - b.add_input("Grid").hide_value(); - b.add_input("Density") - .default_value(1.0f) - .min(0.0f) - .max(100000.0f) - .subtype(PROP_NONE) - .description( - "When combined with each voxel's value, determines the number of points to sample per " - "unit volume"); - b.add_input("Seed").min(-10000).max(10000).description( - "Seed used by the random number generator to generate random points"); - b.add_input("Spacing") - .default_value({0.3, 0.3, 0.3}) - .min(0.0001f) - .subtype(PROP_XYZ) - .description("Spacing between grid points"); - b.add_input("Threshold") - .default_value(0.1f) - .min(0.0f) - .max(FLT_MAX) - .description("Minimum density of a voxel to contain a grid point"); - b.add_output("Points").propagate_all(); -} - -static void node_layout(uiLayout *layout, bContext * /*C*/, PointerRNA *ptr) -{ - uiItemR(layout, ptr, "mode", UI_ITEM_NONE, "", ICON_NONE); -} - -static void node_init(bNodeTree * /*tree*/, bNode *node) -{ - node->custom1 = int16_t(DistributeMode::Random); -} - -static void node_update(bNodeTree *ntree, bNode *node) -{ - const auto mode = DistributeMode(node->custom1); - - bNodeSocket *sock_density = static_cast(node->inputs.first)->next; - bNodeSocket *sock_seed = sock_density->next; - bNodeSocket *sock_spacing = sock_seed->next; - bNodeSocket *sock_threshold = sock_spacing->next; - - bke::nodeSetSocketAvailability(ntree, sock_density, mode == DistributeMode::Random); - bke::nodeSetSocketAvailability(ntree, sock_seed, mode == DistributeMode::Random); - bke::nodeSetSocketAvailability(ntree, sock_spacing, mode == DistributeMode::Grid); - bke::nodeSetSocketAvailability(ntree, sock_threshold, mode == DistributeMode::Grid); -} - -#ifdef WITH_OPENVDB -/* Implements the interface required by #openvdb::tools::NonUniformPointScatter. */ -class PositionsVDBWrapper { - private: - float3 offset_fix_; - Vector &vector_; - - public: - PositionsVDBWrapper(Vector &vector, const float3 &offset_fix) - : offset_fix_(offset_fix), vector_(vector) - { - } - PositionsVDBWrapper(const PositionsVDBWrapper &wrapper) = default; - - void add(const openvdb::Vec3R &pos) - { - vector_.append(float3(float(pos[0]), float(pos[1]), float(pos[2])) + offset_fix_); - } -}; - -/* Use #std::mt19937 as a random number generator. It has a very long period and thus there should - * be no visible patterns in the generated points. */ -using RNGType = std::mt19937; -/* Non-uniform scatter allows the amount of points to be scaled with the volume's density. */ -using NonUniformPointScatterVDB = - openvdb::tools::NonUniformPointScatter; - -static void point_scatter_density_random(const openvdb::FloatGrid &grid, - const float density, - const int seed, - Vector &r_positions) -{ - /* Offset points by half a voxel so that grid points are aligned with world grid points. */ - const float3 offset_fix = {0.5f * float(grid.voxelSize().x()), - 0.5f * float(grid.voxelSize().y()), - 0.5f * float(grid.voxelSize().z())}; - /* Setup and call into OpenVDB's point scatter API. */ - PositionsVDBWrapper vdb_position_wrapper(r_positions, offset_fix); - RNGType random_generator(seed); - NonUniformPointScatterVDB point_scatter(vdb_position_wrapper, density, random_generator); - point_scatter(grid); -} - -static void point_scatter_density_grid(const openvdb::FloatGrid &grid, - const float3 spacing, - const float threshold, - Vector &r_positions) -{ - const openvdb::Vec3d half_voxel(0.5, 0.5, 0.5); - const openvdb::Vec3d voxel_spacing(double(spacing.x) / grid.voxelSize().x(), - double(spacing.y) / grid.voxelSize().y(), - double(spacing.z) / grid.voxelSize().z()); - - /* Abort if spacing is zero. */ - const double min_spacing = std::min(voxel_spacing.x(), - std::min(voxel_spacing.y(), voxel_spacing.z())); - if (std::abs(min_spacing) < 0.0001) { - return; - } - - /* Iterate through tiles and voxels on the grid. */ - for (openvdb::FloatGrid::ValueOnCIter cell = grid.cbeginValueOn(); cell; ++cell) { - /* Check if the cell's value meets the minimum threshold. */ - if (cell.getValue() < threshold) { - continue; - } - /* Compute the bounding box of each tile/voxel. */ - const openvdb::CoordBBox bbox = cell.getBoundingBox(); - const openvdb::Vec3d box_min = bbox.min().asVec3d() - half_voxel; - const openvdb::Vec3d box_max = bbox.max().asVec3d() + half_voxel; - - /* Pick a starting point rounded up to the nearest possible point. */ - double abs_spacing_x = std::abs(voxel_spacing.x()); - double abs_spacing_y = std::abs(voxel_spacing.y()); - double abs_spacing_z = std::abs(voxel_spacing.z()); - const openvdb::Vec3d start(ceil(box_min.x() / abs_spacing_x) * abs_spacing_x, - ceil(box_min.y() / abs_spacing_y) * abs_spacing_y, - ceil(box_min.z() / abs_spacing_z) * abs_spacing_z); - - /* Iterate through all possible points in box. */ - for (double x = start.x(); x < box_max.x(); x += abs_spacing_x) { - for (double y = start.y(); y < box_max.y(); y += abs_spacing_y) { - for (double z = start.z(); z < box_max.z(); z += abs_spacing_z) { - /* Transform with grid matrix and add point. */ - const openvdb::Vec3d idx_pos(x, y, z); - const openvdb::Vec3d local_pos = grid.indexToWorld(idx_pos + half_voxel); - r_positions.append({float(local_pos.x()), float(local_pos.y()), float(local_pos.z())}); - } - } - } - } -} - -#endif /* WITH_OPENVDB */ - -static void node_geo_exec(GeoNodeExecParams params) -{ -#ifdef WITH_OPENVDB - const bke::VolumeGrid volume_grid = params.extract_input>("Grid"); - if (!volume_grid) { - params.set_default_remaining_outputs(); - return; - } - - bke::VolumeTreeAccessToken tree_token; - const openvdb::GridBase &base_grid = volume_grid.grid(tree_token); - if (!base_grid.isType()) { - params.set_default_remaining_outputs(); - return; - } - const openvdb::FloatGrid &grid = static_cast(base_grid); - - const DistributeMode mode = DistributeMode(params.node().custom1); - - float density; - int seed; - float3 spacing{0, 0, 0}; - float threshold; - if (mode == DistributeMode::Random) { - density = params.extract_input("Density"); - seed = params.extract_input("Seed"); - } - else if (mode == DistributeMode::Grid) { - spacing = params.extract_input("Spacing"); - threshold = params.extract_input("Threshold"); - } - - Vector positions; - switch (mode) { - case DistributeMode::Random: - point_scatter_density_random(grid, density, seed, positions); - break; - case DistributeMode::Grid: - point_scatter_density_grid(grid, spacing, threshold, positions); - break; - } - - PointCloud *pointcloud = BKE_pointcloud_new_nomain(positions.size()); - pointcloud->positions_for_write().copy_from(positions); - - geometry::debug_randomize_point_order(pointcloud); - - params.set_output("Points", GeometrySet::from_pointcloud(pointcloud)); -#else - node_geo_exec_with_missing_openvdb(params); -#endif -} - -static void node_rna(StructRNA *srna) -{ - static const EnumPropertyItem mode_items[] = { - {int(DistributeMode::Random), - "DENSITY_RANDOM", - 0, - "Random", - "Distribute points randomly inside of the volume"}, - {int(DistributeMode::Grid), - "DENSITY_GRID", - 0, - "Grid", - "Distribute the points in a grid pattern inside of the volume"}, - {0, nullptr, 0, nullptr, nullptr}, - }; - - RNA_def_node_enum(srna, - "mode", - "Distribution Method", - "Method to use for scattering points", - mode_items, - NOD_inline_enum_accessors(custom1), - int(DistributeMode::Random)); -} - -static void node_register() -{ - static bNodeType ntype; - geo_node_type_base(&ntype, - GEO_NODE_DISTRIBUTE_POINTS_IN_GRID, - "Distribute Points in Grid", - NODE_CLASS_GEOMETRY); - ntype.initfunc = node_init; - ntype.updatefunc = node_update; - blender::bke::node_type_size(&ntype, 170, 100, 320); - ntype.declare = node_declare; - ntype.geometry_node_execute = node_geo_exec; - ntype.draw_buttons = node_layout; - ntype.gather_link_search_ops = search_link_ops_for_volume_grid_node; - nodeRegisterType(&ntype); - - node_rna(ntype.rna_ext.srna); -} -NOD_REGISTER_NODE(node_register) - -} // namespace blender::nodes::node_geo_distribute_points_in_grid_cc diff --git a/source/blender/nodes/geometry/nodes/node_geo_distribute_points_on_faces.cc b/source/blender/nodes/geometry/nodes/node_geo_distribute_points_on_faces.cc index de3c9d5308e..f3676dff2f8 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_distribute_points_on_faces.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_distribute_points_on_faces.cc @@ -5,14 +5,18 @@ #include "BLI_kdtree.h" #include "BLI_math_geom.h" #include "BLI_math_rotation.h" +#include "BLI_math_rotation.hh" #include "BLI_noise.hh" #include "BLI_rand.hh" #include "BLI_task.hh" +#include "BLI_timeit.hh" #include "DNA_pointcloud_types.h" #include "BKE_attribute_math.hh" +#include "BKE_bvhutils.hh" #include "BKE_mesh.hh" +#include "BKE_mesh_runtime.hh" #include "BKE_mesh_sample.hh" #include "BKE_pointcloud.hh" diff --git a/source/blender/nodes/geometry/nodes/node_geo_dual_mesh.cc b/source/blender/nodes/geometry/nodes/node_geo_dual_mesh.cc index 610cfbf52ce..c7433e3a514 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_dual_mesh.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_dual_mesh.cc @@ -522,12 +522,12 @@ static void add_edge(const int old_edge_i, const int v2, Vector &new_to_old_edges_map, Vector &new_edges, - Vector &corner_edges) + Vector &loop_edges) { const int new_edge_i = new_edges.size(); new_to_old_edges_map.append(old_edge_i); new_edges.append({v1, v2}); - corner_edges.append(new_edge_i); + loop_edges.append(new_edge_i); } /* Returns true if the vertex is connected only to the two faces and is not on the boundary. */ @@ -642,12 +642,12 @@ static Mesh *calc_dual_mesh(const Mesh &src_mesh, /* Bad vertex that we can't work with. */ continue; } - MutableSpan corner_indices = vert_to_face_indices.as_mutable_span().slice( + MutableSpan loop_indices = vert_to_face_indices.as_mutable_span().slice( vert_to_face_offsets[i]); - Array sorted_corners(corner_indices.size()); + Array sorted_corners(loop_indices.size()); bool vertex_ok = true; if (vertex_types[i] == VertexType::Normal) { - Array shared_edges(corner_indices.size()); + Array shared_edges(loop_indices.size()); vertex_ok = sort_vertex_faces(src_edges, src_faces, src_corner_verts, @@ -655,13 +655,13 @@ static Mesh *calc_dual_mesh(const Mesh &src_mesh, i, false, edge_types, - corner_indices, + loop_indices, shared_edges, sorted_corners); vertex_shared_edges[i] = std::move(shared_edges); } else { - Array shared_edges(corner_indices.size() - 1); + Array shared_edges(loop_indices.size() - 1); vertex_ok = sort_vertex_faces(src_edges, src_faces, src_corner_verts, @@ -669,7 +669,7 @@ static Mesh *calc_dual_mesh(const Mesh &src_mesh, i, true, edge_types, - corner_indices, + loop_indices, shared_edges, sorted_corners); vertex_shared_edges[i] = std::move(shared_edges); @@ -707,9 +707,9 @@ static Mesh *calc_dual_mesh(const Mesh &src_mesh, } } - Vector face_sizes; - Vector corner_verts; - Vector corner_edges; + Vector loop_lengths; + Vector loops; + Vector loop_edges; Vector new_edges; /* These are used to transfer attributes. */ Vector new_to_old_face_corners_map; @@ -743,11 +743,11 @@ static Mesh *calc_dual_mesh(const Mesh &src_mesh, continue; } - Vector corner_indices = vert_to_face_map[i]; + Vector loop_indices = vert_to_face_map[i]; Span shared_edges = vertex_shared_edges[i]; Span sorted_corners = vertex_corners[i]; if (vertex_types[i] == VertexType::Normal) { - if (corner_indices.size() <= 2) { + if (loop_indices.size() <= 2) { /* We can't make a face from 2 vertices. */ continue; } @@ -759,9 +759,9 @@ static Mesh *calc_dual_mesh(const Mesh &src_mesh, /* This edge has not been created yet. */ new_to_old_edges_map.append(old_edge_i); old_to_new_edges_map[old_edge_i] = new_edges.size(); - new_edges.append({corner_indices[i], corner_indices[(i + 1) % corner_indices.size()]}); + new_edges.append({loop_indices[i], loop_indices[(i + 1) % loop_indices.size()]}); } - corner_edges.append(old_to_new_edges_map[old_edge_i]); + loop_edges.append(old_to_new_edges_map[old_edge_i]); } new_to_old_face_corners_map.extend(sorted_corners); @@ -770,7 +770,7 @@ static Mesh *calc_dual_mesh(const Mesh &src_mesh, /** * The code handles boundary vertices like the vertex marked "V" in the diagram below. * The first thing that happens is ordering the faces f1,f2 and f3 (stored in - * corner_indices), together with their shared edges e3 and e4 (which get stored in + * loop_indices), together with their shared edges e3 and e4 (which get stored in * shared_edges). The ordering could end up being clockwise or counterclockwise, for this * we'll assume that the ordering f1->f2->f3 is chosen. After that we add the edges in * between the faces, in this case the edges f1--f2, and f2--f3. Now we need to merge @@ -798,9 +798,9 @@ static Mesh *calc_dual_mesh(const Mesh &src_mesh, /* This edge has not been created yet. */ new_to_old_edges_map.append(old_edge_i); old_to_new_edges_map[old_edge_i] = new_edges.size(); - new_edges.append({corner_indices[i], corner_indices[i + 1]}); + new_edges.append({loop_indices[i], loop_indices[i + 1]}); } - corner_edges.append(old_to_new_edges_map[old_edge_i]); + loop_edges.append(old_to_new_edges_map[old_edge_i]); } new_to_old_face_corners_map.extend(sorted_corners); @@ -810,22 +810,22 @@ static Mesh *calc_dual_mesh(const Mesh &src_mesh, /* Get the boundary edges. */ int edge1; int edge2; - if (corner_indices.size() >= 2) { + if (loop_indices.size() >= 2) { /* The first boundary edge is at the end of the chain of faces. */ boundary_edge_on_face(src_edges, - src_corner_edges.slice(src_faces[corner_indices.last()]), + src_corner_edges.slice(src_faces[loop_indices.last()]), i, edge_types, edge1); boundary_edge_on_face(src_edges, - src_corner_edges.slice(src_faces[corner_indices.first()]), + src_corner_edges.slice(src_faces[loop_indices.first()]), i, edge_types, edge2); } else { /* If there is only one face both edges are in that face. */ - boundary_edges_on_face(src_faces[corner_indices[0]], + boundary_edges_on_face(src_faces[loop_indices[0]], src_edges, src_corner_verts, src_corner_edges, @@ -835,62 +835,58 @@ static Mesh *calc_dual_mesh(const Mesh &src_mesh, edge2); } - const int last_face_center = corner_indices.last(); - corner_indices.append(boundary_edge_midpoint_index[edge1]); + const int last_face_center = loop_indices.last(); + loop_indices.append(boundary_edge_midpoint_index[edge1]); new_to_old_face_corners_map.append(sorted_corners.last()); - const int first_midpoint = corner_indices.last(); + const int first_midpoint = loop_indices.last(); if (old_to_new_edges_map[edge1] == -1) { - add_edge(edge1, - last_face_center, - first_midpoint, - new_to_old_edges_map, - new_edges, - corner_edges); + add_edge( + edge1, last_face_center, first_midpoint, new_to_old_edges_map, new_edges, loop_edges); old_to_new_edges_map[edge1] = new_edges.size() - 1; boundary_vertex_to_relevant_face_map.append(std::pair(first_midpoint, last_face_center)); } else { - corner_edges.append(old_to_new_edges_map[edge1]); + loop_edges.append(old_to_new_edges_map[edge1]); } - corner_indices.append(vert_positions.size()); + loop_indices.append(vert_positions.size()); /* This is sort of arbitrary, but interpolating would be a lot harder to do. */ new_to_old_face_corners_map.append(sorted_corners.first()); boundary_vertex_to_relevant_face_map.append( - std::pair(corner_indices.last(), last_face_center)); + std::pair(loop_indices.last(), last_face_center)); vert_positions.append(src_positions[i]); - const int boundary_vertex = corner_indices.last(); + const int boundary_vertex = loop_indices.last(); add_edge( - edge1, first_midpoint, boundary_vertex, new_to_old_edges_map, new_edges, corner_edges); + edge1, first_midpoint, boundary_vertex, new_to_old_edges_map, new_edges, loop_edges); - corner_indices.append(boundary_edge_midpoint_index[edge2]); + loop_indices.append(boundary_edge_midpoint_index[edge2]); new_to_old_face_corners_map.append(sorted_corners.first()); - const int second_midpoint = corner_indices.last(); + const int second_midpoint = loop_indices.last(); add_edge( - edge2, boundary_vertex, second_midpoint, new_to_old_edges_map, new_edges, corner_edges); + edge2, boundary_vertex, second_midpoint, new_to_old_edges_map, new_edges, loop_edges); if (old_to_new_edges_map[edge2] == -1) { - const int first_face_center = corner_indices.first(); + const int first_face_center = loop_indices.first(); add_edge(edge2, second_midpoint, first_face_center, new_to_old_edges_map, new_edges, - corner_edges); + loop_edges); old_to_new_edges_map[edge2] = new_edges.size() - 1; boundary_vertex_to_relevant_face_map.append(std::pair(second_midpoint, first_face_center)); } else { - corner_edges.append(old_to_new_edges_map[edge2]); + loop_edges.append(old_to_new_edges_map[edge2]); } } - face_sizes.append(corner_indices.size()); - for (const int j : corner_indices) { - corner_verts.append(j); + loop_lengths.append(loop_indices.size()); + for (const int j : loop_indices) { + loops.append(j); } } Mesh *mesh_out = BKE_mesh_new_nomain( - vert_positions.size(), new_edges.size(), face_sizes.size(), corner_verts.size()); + vert_positions.size(), new_edges.size(), loop_lengths.size(), loops.size()); bke::mesh_smooth_set(*mesh_out, false); transfer_attributes(vertex_types, @@ -907,11 +903,11 @@ static Mesh *calc_dual_mesh(const Mesh &src_mesh, if (mesh_out->faces_num > 0) { MutableSpan dst_face_offsets = mesh_out->face_offsets_for_write(); - dst_face_offsets.drop_back(1).copy_from(face_sizes); + dst_face_offsets.drop_back(1).copy_from(loop_lengths); offset_indices::accumulate_counts_to_offsets(dst_face_offsets); } - mesh_out->corner_verts_for_write().copy_from(corner_verts); - mesh_out->corner_edges_for_write().copy_from(corner_edges); + mesh_out->corner_verts_for_write().copy_from(loops); + mesh_out->corner_edges_for_write().copy_from(loop_edges); return mesh_out; } diff --git a/source/blender/nodes/geometry/nodes/node_geo_duplicate_elements.cc b/source/blender/nodes/geometry/nodes/node_geo_duplicate_elements.cc index a5630d03b98..bfc7019a561 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_duplicate_elements.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_duplicate_elements.cc @@ -954,6 +954,8 @@ static void duplicate_instances(GeometrySet &geometry_set, const int old_handle = src_instances.reference_handles()[i_selection]; const bke::InstanceReference reference = src_instances.references()[old_handle]; const int new_handle = dst_instances->add_reference(reference); + const float4x4 transform = src_instances.transforms()[i_selection]; + dst_instances->transforms().slice(range).fill(transform); dst_instances->reference_handles_for_write().slice(range).fill(new_handle); } diff --git a/source/blender/nodes/geometry/nodes/node_geo_edge_paths_to_selection.cc b/source/blender/nodes/geometry/nodes/node_geo_edge_paths_to_selection.cc index 27b55191b34..5bf16e880a8 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_edge_paths_to_selection.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_edge_paths_to_selection.cc @@ -2,6 +2,7 @@ * * SPDX-License-Identifier: GPL-2.0-or-later */ +#include "BKE_attribute_math.hh" #include "BKE_mesh.hh" #include "BLI_map.hh" diff --git a/source/blender/nodes/geometry/nodes/node_geo_evaluate_at_index.cc b/source/blender/nodes/geometry/nodes/node_geo_evaluate_at_index.cc index 36935d0a7e5..d1d0f79177a 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_evaluate_at_index.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_evaluate_at_index.cc @@ -9,6 +9,8 @@ #include "UI_interface.hh" #include "UI_resources.hh" +#include "BKE_attribute_math.hh" + #include "BLI_task.hh" #include "RNA_enum_types.hh" diff --git a/source/blender/nodes/geometry/nodes/node_geo_evaluate_on_domain.cc b/source/blender/nodes/geometry/nodes/node_geo_evaluate_on_domain.cc index eb46f020d4f..4086ff5fb3d 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_evaluate_on_domain.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_evaluate_on_domain.cc @@ -9,7 +9,9 @@ #include "UI_interface.hh" #include "UI_resources.hh" +#include "BKE_attribute_math.hh" #include "BKE_geometry_fields.hh" +#include "BKE_grease_pencil.hh" #include "BLI_task.hh" diff --git a/source/blender/nodes/geometry/nodes/node_geo_get_named_grid.cc b/source/blender/nodes/geometry/nodes/node_geo_get_named_grid.cc index 79dabcef751..32bf6fe6b7d 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_get_named_grid.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_get_named_grid.cc @@ -10,6 +10,7 @@ #include "RNA_enum_types.hh" #include "NOD_rna_define.hh" +#include "NOD_socket_search_link.hh" #include "UI_interface.hh" #include "UI_resources.hh" @@ -33,6 +34,13 @@ static void node_declare(NodeDeclarationBuilder &b) b.add_output(eNodeSocketDatatype(node->custom1), "Grid"); } +static void search_link_ops(GatherLinkSearchOpParams ¶ms) +{ + if (U.experimental.use_new_volume_nodes) { + nodes::search_link_ops_for_basic_node(params); + } +} + static void node_layout(uiLayout *layout, bContext * /*C*/, PointerRNA *ptr) { uiLayoutSetPropSep(layout, true); @@ -95,7 +103,7 @@ static void node_register() geo_node_type_base(&ntype, GEO_NODE_GET_NAMED_GRID, "Get Named Grid", NODE_CLASS_GEOMETRY); ntype.declare = node_declare; - ntype.gather_link_search_ops = search_link_ops_for_volume_grid_node; + ntype.gather_link_search_ops = search_link_ops; ntype.draw_buttons = node_layout; ntype.initfunc = node_init; ntype.geometry_node_execute = node_geo_exec; diff --git a/source/blender/nodes/geometry/nodes/node_geo_grid_to_mesh.cc b/source/blender/nodes/geometry/nodes/node_geo_grid_to_mesh.cc deleted file mode 100644 index c16e8fe6404..00000000000 --- a/source/blender/nodes/geometry/nodes/node_geo_grid_to_mesh.cc +++ /dev/null @@ -1,58 +0,0 @@ -/* SPDX-FileCopyrightText: 2024 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -#include "BKE_material.h" -#include "BKE_mesh.h" -#include "BKE_volume_grid.hh" -#include "BKE_volume_to_mesh.hh" - -#include "GEO_randomize.hh" - -#include "node_geometry_util.hh" - -namespace blender::nodes::node_geo_grid_to_mesh_cc { - -static void node_declare(NodeDeclarationBuilder &b) -{ - b.add_input("Grid").hide_value(); - b.add_input("Threshold") - .default_value(0.1f) - .description("Values larger than the threshold are inside the generated mesh"); - b.add_input("Adaptivity").min(0.0f).max(1.0f).subtype(PROP_FACTOR); - b.add_output("Mesh"); -} - -static void node_geo_exec(GeoNodeExecParams params) -{ -#ifdef WITH_OPENVDB - const bke::VolumeGrid grid = params.extract_input>("Grid"); - if (!grid) { - params.set_default_remaining_outputs(); - return; - } - bke::VolumeTreeAccessToken tree_token; - Mesh *mesh = bke::volume_grid_to_mesh(grid.get().grid(tree_token), - params.extract_input("Threshold"), - params.extract_input("Adaptivity")); - BKE_id_material_eval_ensure_default_slot(&mesh->id); - geometry::debug_randomize_mesh_order(mesh); - params.set_output("Mesh", GeometrySet::from_mesh(mesh)); -#else - node_geo_exec_with_missing_openvdb(params); -#endif -} - -static void node_register() -{ - static bNodeType ntype; - - geo_node_type_base(&ntype, GEO_NODE_GRID_TO_MESH, "Grid to Mesh", NODE_CLASS_GEOMETRY); - ntype.declare = node_declare; - ntype.geometry_node_execute = node_geo_exec; - ntype.gather_link_search_ops = search_link_ops_for_volume_grid_node; - nodeRegisterType(&ntype); -} -NOD_REGISTER_NODE(node_register) - -} // namespace blender::nodes::node_geo_grid_to_mesh_cc diff --git a/source/blender/nodes/geometry/nodes/node_geo_image_info.cc b/source/blender/nodes/geometry/nodes/node_geo_image_info.cc index afe777879e5..46a35356487 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_image_info.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_image_info.cc @@ -4,9 +4,12 @@ #include "BKE_image.h" +#include "BLI_path_util.h" + #include "IMB_imbuf.hh" #include "IMB_imbuf_types.hh" +#include "UI_interface.hh" #include "UI_resources.hh" #include "node_geometry_util.hh" diff --git a/source/blender/nodes/geometry/nodes/node_geo_image_texture.cc b/source/blender/nodes/geometry/nodes/node_geo_image_texture.cc index 56dd006b200..99d652df20c 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_image_texture.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_image_texture.cc @@ -8,6 +8,7 @@ #include "BLI_math_vector_types.hh" #include "BLI_threads.h" +#include "BLI_timeit.hh" #include "IMB_colormanagement.hh" #include "IMB_imbuf.hh" diff --git a/source/blender/nodes/geometry/nodes/node_geo_index_switch.cc b/source/blender/nodes/geometry/nodes/node_geo_index_switch.cc index bffee8b412b..cec273a8708 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_index_switch.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_index_switch.cc @@ -4,6 +4,8 @@ #include "node_geometry_util.hh" +#include "BLI_array_utils.hh" + #include "UI_interface.hh" #include "UI_resources.hh" @@ -290,15 +292,11 @@ static void node_rna(StructRNA *srna) *r_free = true; return enum_items_filter(rna_enum_node_socket_data_type_items, [](const EnumPropertyItem &item) -> bool { - if (item.value == SOCK_MATRIX) { - return U.experimental.use_new_matrix_socket; - } return ELEM(item.value, SOCK_FLOAT, SOCK_INT, SOCK_BOOLEAN, SOCK_ROTATION, - SOCK_MATRIX, SOCK_VECTOR, SOCK_STRING, SOCK_RGBA, diff --git a/source/blender/nodes/geometry/nodes/node_geo_input_active_camera.cc b/source/blender/nodes/geometry/nodes/node_geo_input_active_camera.cc index 9cf0c70f753..e93907f079c 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_input_active_camera.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_input_active_camera.cc @@ -2,6 +2,8 @@ * * SPDX-License-Identifier: GPL-2.0-or-later */ +#include "BKE_scene.h" + #include "DEG_depsgraph_query.hh" #include "node_geometry_util.hh" diff --git a/source/blender/nodes/geometry/nodes/node_geo_input_curve_handles.cc b/source/blender/nodes/geometry/nodes/node_geo_input_curve_handles.cc index b1a2d954858..32dc5175d29 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_input_curve_handles.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_input_curve_handles.cc @@ -72,17 +72,17 @@ class HandlePositionFieldInput final : public bke::CurvesFieldInput { VArray::ForContainer(std::move(output)), AttrDomain::Point, domain); } - void for_each_field_input_recursive(FunctionRef fn) const final + void for_each_field_input_recursive(FunctionRef fn) const override { relative_.node().for_each_field_input_recursive(fn); } - uint64_t hash() const final + uint64_t hash() const override { return get_default_hash(relative_, left_); } - bool is_equal_to(const fn::FieldNode &other) const final + bool is_equal_to(const fn::FieldNode &other) const override { if (const HandlePositionFieldInput *other_handle = dynamic_cast(&other)) @@ -92,7 +92,7 @@ class HandlePositionFieldInput final : public bke::CurvesFieldInput { return false; } - std::optional preferred_domain(const bke::CurvesGeometry & /*curves*/) const final + std::optional preferred_domain(const CurvesGeometry & /*curves*/) const { return AttrDomain::Point; } diff --git a/source/blender/nodes/geometry/nodes/node_geo_input_scene_time.cc b/source/blender/nodes/geometry/nodes/node_geo_input_scene_time.cc index 092c9829963..e7a9fda657a 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_input_scene_time.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_input_scene_time.cc @@ -2,7 +2,7 @@ * * SPDX-License-Identifier: GPL-2.0-or-later */ -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "DEG_depsgraph_query.hh" diff --git a/source/blender/nodes/geometry/nodes/node_geo_instance_on_points.cc b/source/blender/nodes/geometry/nodes/node_geo_instance_on_points.cc index f2fa71068de..d43059578e9 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_instance_on_points.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_instance_on_points.cc @@ -2,11 +2,17 @@ * * SPDX-License-Identifier: GPL-2.0-or-later */ +#include "DNA_collection_types.h" + #include "BLI_array_utils.hh" +#include "BLI_hash.h" #include "BLI_math_matrix.h" #include "BLI_math_matrix.hh" #include "BLI_task.hh" +#include "UI_interface.hh" +#include "UI_resources.hh" + #include "BKE_attribute_math.hh" #include "BKE_curves.hh" #include "BKE_grease_pencil.hh" @@ -81,8 +87,7 @@ static void add_instances_from_component( MutableSpan dst_handles = dst_component.reference_handles_for_write().slice(start_len, select_len); - MutableSpan dst_transforms = dst_component.transforms_for_write().slice(start_len, - select_len); + MutableSpan dst_transforms = dst_component.transforms().slice(start_len, select_len); const VArraySpan positions = *src_attributes.lookup("position"); diff --git a/source/blender/nodes/geometry/nodes/node_geo_interpolate_curves.cc b/source/blender/nodes/geometry/nodes/node_geo_interpolate_curves.cc index 8fd4a2779f6..0db334ca56e 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_interpolate_curves.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_interpolate_curves.cc @@ -12,9 +12,12 @@ #include "BLI_task.hh" #include "BKE_curves.hh" +#include "BKE_curves_utils.hh" #include "GEO_randomize.hh" +#include "DNA_pointcloud_types.h" + namespace blender::nodes::node_geo_interpolate_curves_cc { static void node_declare(NodeDeclarationBuilder &b) 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 5b0f27de3ab..fe4a03d33a7 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_join_geometry.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_join_geometry.cc @@ -4,6 +4,8 @@ #include "GEO_join_geometries.hh" +#include "BKE_instances.hh" + #include "node_geometry_util.hh" namespace blender::nodes::node_geo_join_geometry_cc { diff --git a/source/blender/nodes/geometry/nodes/node_geo_material_replace.cc b/source/blender/nodes/geometry/nodes/node_geo_material_replace.cc index f85fc5ce554..d95e76151a4 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_material_replace.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_material_replace.cc @@ -7,6 +7,7 @@ #include "DNA_mesh_types.h" #include "BKE_grease_pencil.hh" +#include "BKE_material.h" namespace blender::nodes::node_geo_material_replace_cc { diff --git a/source/blender/nodes/geometry/nodes/node_geo_material_selection.cc b/source/blender/nodes/geometry/nodes/node_geo_material_selection.cc index 529037fdf42..88ead0b3cac 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_material_selection.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_material_selection.cc @@ -4,12 +4,16 @@ #include "node_geometry_util.hh" +#include "UI_interface.hh" +#include "UI_resources.hh" + #include "DNA_mesh_types.h" #include "BLI_task.hh" #include "BKE_curves.hh" #include "BKE_grease_pencil.hh" +#include "BKE_material.h" namespace blender::nodes::node_geo_material_selection_cc { diff --git a/source/blender/nodes/geometry/nodes/node_geo_menu_switch.cc b/source/blender/nodes/geometry/nodes/node_geo_menu_switch.cc index 8f17319e67c..8f26387077c 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_menu_switch.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_menu_switch.cc @@ -8,6 +8,7 @@ #include "DNA_node_types.h" +#include "BLI_array_utils.hh" #include "BLI_string.h" #include "FN_multi_function.hh" @@ -19,8 +20,11 @@ #include "NOD_socket.hh" #include "NOD_socket_search_link.hh" +#include "RNA_access.hh" #include "RNA_enum_types.hh" +#include "WM_api.hh" + namespace blender::nodes::node_geo_menu_switch_cc { NODE_STORAGE_FUNCS(NodeMenuSwitch) diff --git a/source/blender/nodes/geometry/nodes/node_geo_mesh_subdivide.cc b/source/blender/nodes/geometry/nodes/node_geo_mesh_subdivide.cc index eaef793d424..1e3d0fc361c 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_mesh_subdivide.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_mesh_subdivide.cc @@ -2,9 +2,11 @@ * * SPDX-License-Identifier: GPL-2.0-or-later */ +#include "BKE_mesh.hh" #include "BKE_subdiv.hh" #include "BKE_subdiv_mesh.hh" +#include "UI_interface.hh" #include "UI_resources.hh" #include "GEO_randomize.hh" diff --git a/source/blender/nodes/geometry/nodes/node_geo_mesh_to_density_grid.cc b/source/blender/nodes/geometry/nodes/node_geo_mesh_to_density_grid.cc deleted file mode 100644 index 376ac86aef6..00000000000 --- a/source/blender/nodes/geometry/nodes/node_geo_mesh_to_density_grid.cc +++ /dev/null @@ -1,69 +0,0 @@ -/* SPDX-FileCopyrightText: 2024 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -#include "BKE_mesh.hh" -#include "BKE_volume_grid.hh" - -#include "GEO_mesh_to_volume.hh" - -#include "node_geometry_util.hh" - -namespace blender::nodes::node_geo_mesh_to_density_grid_cc { - -NODE_STORAGE_FUNCS(NodeGeometryMeshToVolume) - -static void node_declare(NodeDeclarationBuilder &b) -{ - b.add_input("Mesh").supported_type(GeometryComponent::Type::Mesh); - b.add_input("Density").default_value(1.0f).min(0.01f).max(FLT_MAX); - b.add_input("Voxel Size") - .default_value(0.3f) - .min(0.01f) - .max(FLT_MAX) - .subtype(PROP_DISTANCE); - b.add_input("Gradient Width") - .default_value(0.2f) - .min(0.0001f) - .max(FLT_MAX) - .subtype(PROP_DISTANCE) - .description("Width of the gradient inside of the mesh"); - b.add_output("Density Grid"); -} - -static void node_geo_exec(GeoNodeExecParams params) -{ -#ifdef WITH_OPENVDB - const GeometrySet geometry_set = params.extract_input("Mesh"); - const Mesh *mesh = geometry_set.get_mesh(); - if (!mesh || mesh->faces_num == 0) { - params.set_default_remaining_outputs(); - return; - } - bke::VolumeGrid grid = geometry::mesh_to_density_grid( - mesh->vert_positions(), - mesh->corner_verts(), - mesh->corner_tris(), - params.extract_input("Voxel Size"), - params.extract_input("Gradient Width"), - params.extract_input("Density")); - params.set_output("Density Grid", std::move(grid)); -#else - node_geo_exec_with_missing_openvdb(params); -#endif -} - -static void node_register() -{ - static bNodeType ntype; - - geo_node_type_base( - &ntype, GEO_NODE_MESH_TO_DENSITY_GRID, "Mesh to Density Grid", NODE_CLASS_GEOMETRY); - ntype.declare = node_declare; - ntype.geometry_node_execute = node_geo_exec; - ntype.gather_link_search_ops = search_link_ops_for_volume_grid_node; - nodeRegisterType(&ntype); -} -NOD_REGISTER_NODE(node_register) - -} // namespace blender::nodes::node_geo_mesh_to_density_grid_cc diff --git a/source/blender/nodes/geometry/nodes/node_geo_mesh_to_points.cc b/source/blender/nodes/geometry/nodes/node_geo_mesh_to_points.cc index 0e9f68c292d..92d87eb87c2 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_mesh_to_points.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_mesh_to_points.cc @@ -10,6 +10,7 @@ #include "BKE_attribute_math.hh" #include "BKE_customdata.hh" +#include "BKE_mesh.hh" #include "BKE_pointcloud.hh" #include "NOD_rna_define.hh" diff --git a/source/blender/nodes/geometry/nodes/node_geo_mesh_to_sdf_grid.cc b/source/blender/nodes/geometry/nodes/node_geo_mesh_to_sdf_grid.cc deleted file mode 100644 index 90700dad634..00000000000 --- a/source/blender/nodes/geometry/nodes/node_geo_mesh_to_sdf_grid.cc +++ /dev/null @@ -1,63 +0,0 @@ -/* SPDX-FileCopyrightText: 2024 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -#include "BKE_mesh.hh" -#include "BKE_volume_grid.hh" - -#include "GEO_mesh_to_volume.hh" - -#include "node_geometry_util.hh" - -namespace blender::nodes::node_geo_mesh_to_sdf_grid_cc { - -static void node_declare(NodeDeclarationBuilder &b) -{ - b.add_input("Mesh").supported_type(GeometryComponent::Type::Mesh); - b.add_input("Voxel Size") - .default_value(0.3f) - .min(0.01f) - .max(FLT_MAX) - .subtype(PROP_DISTANCE); - b.add_input("Band Width") - .default_value(3) - .min(0) - .max(100) - .description("Width of the active voxel surface, in voxels"); - b.add_output("SDF Grid"); -} - -static void node_geo_exec(GeoNodeExecParams params) -{ -#ifdef WITH_OPENVDB - const GeometrySet geometry_set = params.extract_input("Mesh"); - const Mesh *mesh = geometry_set.get_mesh(); - if (!mesh || mesh->faces_num == 0) { - params.set_default_remaining_outputs(); - return; - } - bke::VolumeGrid grid = geometry::mesh_to_sdf_grid( - mesh->vert_positions(), - mesh->corner_verts(), - mesh->corner_tris(), - params.extract_input("Voxel Size"), - params.extract_input("Band Width")); - params.set_output("SDF Grid", std::move(grid)); -#else - node_geo_exec_with_missing_openvdb(params); -#endif -} - -static void node_register() -{ - static bNodeType ntype; - - geo_node_type_base(&ntype, GEO_NODE_MESH_TO_SDF_GRID, "Mesh to SDF Grid", NODE_CLASS_GEOMETRY); - ntype.declare = node_declare; - ntype.geometry_node_execute = node_geo_exec; - ntype.gather_link_search_ops = search_link_ops_for_volume_grid_node; - nodeRegisterType(&ntype); -} -NOD_REGISTER_NODE(node_register) - -} // namespace blender::nodes::node_geo_mesh_to_sdf_grid_cc diff --git a/source/blender/nodes/geometry/nodes/node_geo_mesh_to_volume.cc b/source/blender/nodes/geometry/nodes/node_geo_mesh_to_volume.cc index 9f16e9ee565..2a9a9fd398b 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_mesh_to_volume.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_mesh_to_volume.cc @@ -2,10 +2,15 @@ * * SPDX-License-Identifier: GPL-2.0-or-later */ +#include "DEG_depsgraph_query.hh" #include "node_geometry_util.hh" #include "BKE_lib_id.hh" #include "BKE_mesh.hh" +#include "BKE_mesh_runtime.hh" +#include "BKE_mesh_wrapper.hh" +#include "BKE_object.hh" +#include "BKE_volume.hh" #include "GEO_mesh_to_volume.hh" @@ -108,9 +113,7 @@ static Volume *create_volume_from_mesh(const Mesh &mesh, GeoNodeExecParams ¶ /* Convert mesh to grid and add to volume. */ geometry::fog_volume_grid_add_from_mesh(volume, "density", - mesh.vert_positions(), - mesh.corner_verts(), - mesh.corner_tris(), + &mesh, mesh_to_volume_space_transform, voxel_size, interior_band_width, diff --git a/source/blender/nodes/geometry/nodes/node_geo_mesh_topology_corners_of_vertex.cc b/source/blender/nodes/geometry/nodes/node_geo_mesh_topology_corners_of_vertex.cc index fe55de16905..82eef5b7d1d 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_mesh_topology_corners_of_vertex.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_mesh_topology_corners_of_vertex.cc @@ -3,6 +3,7 @@ * SPDX-License-Identifier: GPL-2.0-or-later */ #include "BKE_mesh.hh" +#include "BKE_mesh_mapping.hh" #include "BLI_array_utils.hh" diff --git a/source/blender/nodes/geometry/nodes/node_geo_mesh_topology_edges_of_corner.cc b/source/blender/nodes/geometry/nodes/node_geo_mesh_topology_edges_of_corner.cc index b54fbcf6abb..184a8f8069d 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_mesh_topology_edges_of_corner.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_mesh_topology_edges_of_corner.cc @@ -3,6 +3,7 @@ * SPDX-License-Identifier: GPL-2.0-or-later */ #include "BKE_mesh.hh" +#include "BKE_mesh_mapping.hh" #include "BLI_task.hh" diff --git a/source/blender/nodes/geometry/nodes/node_geo_mesh_topology_face_of_corner.cc b/source/blender/nodes/geometry/nodes/node_geo_mesh_topology_face_of_corner.cc index dc169bbef2c..00214bb7b8a 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_mesh_topology_face_of_corner.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_mesh_topology_face_of_corner.cc @@ -3,6 +3,7 @@ * SPDX-License-Identifier: GPL-2.0-or-later */ #include "BKE_mesh.hh" +#include "BKE_mesh_mapping.hh" #include "node_geometry_util.hh" diff --git a/source/blender/nodes/geometry/nodes/node_geo_mesh_topology_offset_corner_in_face.cc b/source/blender/nodes/geometry/nodes/node_geo_mesh_topology_offset_corner_in_face.cc index ed605494d28..f985febe525 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_mesh_topology_offset_corner_in_face.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_mesh_topology_offset_corner_in_face.cc @@ -3,6 +3,7 @@ * SPDX-License-Identifier: GPL-2.0-or-later */ #include "BKE_mesh.hh" +#include "BKE_mesh_mapping.hh" #include "BLI_task.hh" 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 8b52da561af..9212cbfe9d6 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_object_info.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_object_info.cc @@ -54,8 +54,8 @@ static void node_geo_exec(GeoNodeExecParams params) return; } - const float4x4 &object_matrix = object->object_to_world(); - const float4x4 transform = self_object->world_to_object() * object_matrix; + const float4x4 object_matrix = float4x4(object->object_to_world); + const float4x4 transform = float4x4(self_object->world_to_object) * object_matrix; float3 location, scale; math::Quaternion rotation; diff --git a/source/blender/nodes/geometry/nodes/node_geo_points_to_sdf_grid.cc b/source/blender/nodes/geometry/nodes/node_geo_points_to_sdf_grid.cc deleted file mode 100644 index b2b52e89e03..00000000000 --- a/source/blender/nodes/geometry/nodes/node_geo_points_to_sdf_grid.cc +++ /dev/null @@ -1,114 +0,0 @@ -/* SPDX-FileCopyrightText: 2024 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -#include "BKE_volume.hh" -#include "BKE_volume_grid.hh" - -#include "GEO_points_to_volume.hh" - -#include "node_geometry_util.hh" - -namespace blender::nodes::node_geo_points_to_sdf_grid_cc { - -static void node_declare(NodeDeclarationBuilder &b) -{ - b.add_input("Points"); - b.add_input("Radius") - .default_value(0.5f) - .min(0.0f) - .subtype(PROP_DISTANCE) - .field_on_all(); - b.add_input("Voxel Size").default_value(0.3f).min(0.01f).subtype(PROP_DISTANCE); - b.add_output("SDF Grid"); -} - -#ifdef WITH_OPENVDB - -static void gather_positions_from_component(const GeometryComponent &component, - Vector &r_positions) -{ - if (component.is_empty()) { - return; - } - const VArray positions = *component.attributes()->lookup("position"); - r_positions.resize(r_positions.size() + positions.size()); - positions.materialize(r_positions.as_mutable_span().take_back(positions.size())); -} - -static void gather_radii_from_component(const GeometryComponent &component, - const Field radius_field, - Vector &r_radii) -{ - if (component.is_empty()) { - return; - } - - const bke::GeometryFieldContext field_context{component, AttrDomain::Point}; - const int domain_num = component.attribute_domain_size(AttrDomain::Point); - - r_radii.resize(r_radii.size() + domain_num); - fn::FieldEvaluator evaluator{field_context, domain_num}; - evaluator.add_with_destination(radius_field, r_radii.as_mutable_span().take_back(domain_num)); - evaluator.evaluate(); -} - -/** - * Initializes the VolumeComponent of a GeometrySet with a new Volume from points. - * The grid class should be either openvdb::GRID_FOG_VOLUME or openvdb::GRID_LEVEL_SET. - */ -static bke::VolumeGrid points_to_grid(const GeometrySet &geometry_set, - const Field &radius_field, - const float voxel_size) -{ - const double determinant = std::pow(double(voxel_size), 3.0); - if (!BKE_volume_grid_determinant_valid(determinant)) { - return {}; - } - - Vector positions; - Vector radii; - for (const GeometryComponent::Type type : {GeometryComponent::Type::Mesh, - GeometryComponent::Type::PointCloud, - GeometryComponent::Type::Curve}) - { - if (const GeometryComponent *component = geometry_set.get_component(type)) { - gather_positions_from_component(*component, positions); - gather_radii_from_component(*component, radius_field, radii); - } - } - - if (positions.is_empty()) { - return {}; - } - - return geometry::points_to_sdf_grid(positions, radii, voxel_size); -} - -#endif /* WITH_OPENVDB */ - -static void node_geo_exec(GeoNodeExecParams params) -{ -#ifdef WITH_OPENVDB - bke::VolumeGrid grid = points_to_grid(params.extract_input("Points"), - params.extract_input>("Radius"), - params.extract_input("Voxel Size")); - params.set_output("SDF Grid", std::move(grid)); -#else - node_geo_exec_with_missing_openvdb(params); -#endif -} - -static void node_register() -{ - static bNodeType ntype; - - geo_node_type_base( - &ntype, GEO_NODE_POINTS_TO_SDF_GRID, "Points to SDF Grid", NODE_CLASS_GEOMETRY); - ntype.declare = node_declare; - ntype.geometry_node_execute = node_geo_exec; - nodeRegisterType(&ntype); -} -NOD_REGISTER_NODE(node_register) - -} // namespace blender::nodes::node_geo_points_to_sdf_grid_cc diff --git a/source/blender/nodes/geometry/nodes/node_geo_points_to_vertices.cc b/source/blender/nodes/geometry/nodes/node_geo_points_to_vertices.cc index fef2eddd429..c59db61737d 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_points_to_vertices.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_points_to_vertices.cc @@ -6,6 +6,7 @@ #include "DNA_pointcloud_types.h" +#include "BKE_attribute_math.hh" #include "BKE_customdata.hh" #include "BKE_mesh.hh" 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 f522a7c0d69..f4b59eb8cb3 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 @@ -69,13 +69,27 @@ static float compute_voxel_size_from_amount(const float voxel_amount, return voxel_size; } +static void convert_to_grid_index_space(const float voxel_size, + MutableSpan positions, + MutableSpan radii) +{ + const float voxel_size_inv = 1.0f / voxel_size; + for (const int i : positions.index_range()) { + positions[i] *= voxel_size_inv; + /* Better align generated grid with source points. */ + positions[i] -= float3(0.5f); + radii[i] *= voxel_size_inv; + } +} + /** * Initializes the VolumeComponent of a GeometrySet with a new Volume from points. * The grid class should be either openvdb::GRID_FOG_VOLUME or openvdb::GRID_LEVEL_SET. */ static void initialize_volume_component_from_points(GeoNodeExecParams ¶ms, const NodeGeometryPointsToVolume &storage, - GeometrySet &r_geometry_set) + GeometrySet &r_geometry_set, + openvdb::GridClass gridClass) { Vector positions; Vector radii; @@ -115,10 +129,17 @@ static void initialize_volume_component_from_points(GeoNodeExecParams ¶ms, Volume *volume = reinterpret_cast(BKE_id_new_nomain(ID_VO, nullptr)); - const float density = params.get_input("Density"); - blender::geometry::fog_volume_grid_add_from_points( - volume, "density", positions, radii, voxel_size, density); + convert_to_grid_index_space(voxel_size, positions, radii); + if (gridClass == openvdb::GRID_FOG_VOLUME) { + const float density = params.get_input("Density"); + blender::geometry::fog_volume_grid_add_from_points( + volume, "density", positions, radii, voxel_size, density); + } + else if (gridClass == openvdb::GRID_LEVEL_SET) { + blender::geometry::sdf_volume_grid_add_from_points( + volume, "distance", positions, radii, voxel_size); + } r_geometry_set.keep_only_during_modify({GeometryComponent::Type::Volume}); r_geometry_set.replace_volume(volume); } @@ -187,7 +208,8 @@ static void node_geo_exec(GeoNodeExecParams params) GeometrySet geometry_set = params.extract_input("Points"); const NodeGeometryPointsToVolume &storage = node_storage(params.node()); geometry_set.modify_geometry_sets([&](GeometrySet &geometry_set) { - initialize_volume_component_from_points(params, storage, geometry_set); + initialize_volume_component_from_points( + params, storage, geometry_set, openvdb::GRID_FOG_VOLUME); }); params.set_output("Volume", std::move(geometry_set)); #else diff --git a/source/blender/nodes/geometry/nodes/node_geo_proximity.cc b/source/blender/nodes/geometry/nodes/node_geo_proximity.cc index c654c85604d..d7c52f761b4 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_proximity.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_proximity.cc @@ -4,12 +4,12 @@ #include "BLI_math_vector.h" #include "BLI_task.hh" +#include "BLI_timeit.hh" + +#include "DNA_mesh_types.h" #include "BKE_bvhutils.hh" #include "BKE_geometry_set.hh" -#include "BKE_mesh.hh" - -#include "DNA_pointcloud_types.h" #include "NOD_rna_define.hh" @@ -27,21 +27,10 @@ static void node_declare(NodeDeclarationBuilder &b) b.add_input("Geometry", "Target") .only_realized_data() .supported_type({GeometryComponent::Type::Mesh, GeometryComponent::Type::PointCloud}); - b.add_input("Group ID") - .hide_value() - .field_on_all() - .description( - "Splits the elements of the input geometry into groups which can be sampled " - "individually"); b.add_input("Sample Position", "Source Position") .implicit_field(implicit_field_inputs::position); - b.add_input("Sample Group ID").hide_value().supports_field(); - b.add_output("Position").dependent_field({2, 3}).reference_pass_all(); - b.add_output("Distance").dependent_field({2, 3}).reference_pass_all(); - b.add_output("Is Valid") - .dependent_field({2, 3}) - .description( - "Whether the sampling was successfull. It can fail when the sampled group is empty"); + b.add_output("Position").dependent_field().reference_pass_all(); + b.add_output("Distance").dependent_field().reference_pass_all(); } static void node_layout(uiLayout *layout, bContext * /*C*/, PointerRNA *ptr) @@ -56,208 +45,149 @@ static void geo_proximity_init(bNodeTree * /*tree*/, bNode *node) node->storage = node_storage; } +static bool calculate_mesh_proximity(const VArray &positions, + const IndexMask &mask, + const Mesh &mesh, + const GeometryNodeProximityTargetType type, + const MutableSpan r_distances, + const MutableSpan r_locations) +{ + BVHTreeFromMesh bvh_data; + switch (type) { + case GEO_NODE_PROX_TARGET_POINTS: + BKE_bvhtree_from_mesh_get(&bvh_data, &mesh, BVHTREE_FROM_VERTS, 2); + break; + case GEO_NODE_PROX_TARGET_EDGES: + BKE_bvhtree_from_mesh_get(&bvh_data, &mesh, BVHTREE_FROM_EDGES, 2); + break; + case GEO_NODE_PROX_TARGET_FACES: + BKE_bvhtree_from_mesh_get(&bvh_data, &mesh, BVHTREE_FROM_CORNER_TRIS, 2); + break; + } + + if (bvh_data.tree == nullptr) { + return false; + } + + mask.foreach_index(GrainSize(512), [&](const int index) { + BVHTreeNearest nearest; + copy_v3_fl(nearest.co, FLT_MAX); + nearest.index = -1; + + /* Use the distance to the last found point as upper bound to speedup the bvh lookup. */ + nearest.dist_sq = math::distance_squared(float3(nearest.co), positions[index]); + + BLI_bvhtree_find_nearest( + bvh_data.tree, positions[index], &nearest, bvh_data.nearest_callback, &bvh_data); + + if (nearest.dist_sq < r_distances[index]) { + r_distances[index] = nearest.dist_sq; + if (!r_locations.is_empty()) { + r_locations[index] = nearest.co; + } + } + }); + + free_bvhtree_from_mesh(&bvh_data); + return true; +} + +static bool calculate_pointcloud_proximity(const VArray &positions, + const IndexMask &mask, + const PointCloud &pointcloud, + MutableSpan r_distances, + MutableSpan r_locations) +{ + BVHTreeFromPointCloud bvh_data; + const BVHTree *tree = BKE_bvhtree_from_pointcloud_get(&bvh_data, &pointcloud, 2); + if (tree == nullptr) { + return false; + } + + mask.foreach_index(GrainSize(512), [&](const int index) { + BVHTreeNearest nearest; + copy_v3_fl(nearest.co, FLT_MAX); + nearest.index = -1; + + /* 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.dist_sq = r_distances[index]; + + BLI_bvhtree_find_nearest( + bvh_data.tree, positions[index], &nearest, bvh_data.nearest_callback, &bvh_data); + + if (nearest.dist_sq < r_distances[index]) { + r_distances[index] = nearest.dist_sq; + if (!r_locations.is_empty()) { + r_locations[index] = nearest.co; + } + } + }); + + free_bvhtree_from_pointcloud(&bvh_data); + return true; +} + class ProximityFunction : public mf::MultiFunction { private: - struct BVHTrees { - BVHTreeFromMesh mesh_bvh = {}; - BVHTreeFromPointCloud pointcloud_bvh = {}; - }; - GeometrySet target_; GeometryNodeProximityTargetType type_; - Vector bvh_trees_; - VectorSet group_indices_; public: - ProximityFunction(GeometrySet target, - GeometryNodeProximityTargetType type, - const Field &group_id_field) + ProximityFunction(GeometrySet target, GeometryNodeProximityTargetType type) : target_(std::move(target)), type_(type) { static const mf::Signature signature = []() { mf::Signature signature; mf::SignatureBuilder builder{"Geometry Proximity", signature}; builder.single_input("Source Position"); - builder.single_input("Sample ID"); builder.single_output("Position", mf::ParamFlag::SupportsUnusedOutput); - builder.single_output("Distance", mf::ParamFlag::SupportsUnusedOutput); - builder.single_output("Is Valid", mf::ParamFlag::SupportsUnusedOutput); + builder.single_output("Distance"); return signature; }(); this->set_signature(&signature); - - if (target_.has_pointcloud() && type_ == GEO_NODE_PROX_TARGET_POINTS) { - const PointCloud &pointcloud = *target_.get_pointcloud(); - this->init_for_pointcloud(pointcloud, group_id_field); - } - if (target_.has_mesh()) { - const Mesh &mesh = *target_.get_mesh(); - this->init_for_mesh(mesh, group_id_field); - } - } - - ~ProximityFunction() - { - for (BVHTrees &trees : bvh_trees_) { - if (trees.mesh_bvh.tree) { - free_bvhtree_from_mesh(&trees.mesh_bvh); - } - if (trees.pointcloud_bvh.tree) { - free_bvhtree_from_pointcloud(&trees.pointcloud_bvh); - } - } - } - - void init_for_pointcloud(const PointCloud &pointcloud, const Field &group_id_field) - { - /* Compute group ids. */ - bke::PointCloudFieldContext field_context{pointcloud}; - FieldEvaluator field_evaluator{field_context, pointcloud.totpoint}; - field_evaluator.add(group_id_field); - field_evaluator.evaluate(); - const VArray group_ids = field_evaluator.get_evaluated(0); - - IndexMaskMemory memory; - Vector group_masks = IndexMask::from_group_ids(group_ids, memory, group_indices_); - const int groups_num = group_masks.size(); - - /* Construct BVH tree for each group. */ - bvh_trees_.resize(groups_num); - threading::parallel_for_weighted( - IndexRange(groups_num), - 512, - [&](const IndexRange range) { - for (const int group_i : range) { - const IndexMask &group_mask = group_masks[group_i]; - if (group_mask.is_empty()) { - continue; - } - BVHTreeFromPointCloud &bvh = bvh_trees_[group_i].pointcloud_bvh; - BKE_bvhtree_from_pointcloud_get(pointcloud, group_mask, bvh); - } - }, - [&](const int group_i) { return group_masks[group_i].size(); }); - } - - void init_for_mesh(const Mesh &mesh, const Field &group_id_field) - { - /* Compute group ids. */ - const bke::AttrDomain domain = this->get_domain_on_mesh(); - const int domain_size = mesh.attributes().domain_size(domain); - bke::MeshFieldContext field_context{mesh, domain}; - FieldEvaluator field_evaluator{field_context, domain_size}; - field_evaluator.add(group_id_field); - field_evaluator.evaluate(); - const VArray group_ids = field_evaluator.get_evaluated(0); - - IndexMaskMemory memory; - Vector group_masks = IndexMask::from_group_ids(group_ids, memory, group_indices_); - const int groups_num = group_masks.size(); - - /* Construct BVH tree for each group. */ - bvh_trees_.resize(groups_num); - threading::parallel_for_weighted( - IndexRange(groups_num), - 512, - [&](const IndexRange range) { - for (const int group_i : range) { - const IndexMask &group_mask = group_masks[group_i]; - if (group_mask.is_empty()) { - continue; - } - BVHTreeFromMesh &bvh = bvh_trees_[group_i].mesh_bvh; - switch (type_) { - case GEO_NODE_PROX_TARGET_POINTS: { - BKE_bvhtree_from_mesh_verts_init(mesh, group_mask, bvh); - break; - } - case GEO_NODE_PROX_TARGET_EDGES: { - BKE_bvhtree_from_mesh_edges_init(mesh, group_mask, bvh); - break; - } - case GEO_NODE_PROX_TARGET_FACES: { - BKE_bvhtree_from_mesh_tris_init(mesh, group_mask, bvh); - break; - } - } - } - }, - [&](const int group_i) { return group_masks[group_i].size(); }); - } - - bke::AttrDomain get_domain_on_mesh() const - { - switch (type_) { - case GEO_NODE_PROX_TARGET_POINTS: - return bke::AttrDomain::Point; - case GEO_NODE_PROX_TARGET_EDGES: - return bke::AttrDomain::Edge; - case GEO_NODE_PROX_TARGET_FACES: - return bke::AttrDomain::Face; - } - BLI_assert_unreachable(); - return bke::AttrDomain::Point; } void call(const IndexMask &mask, mf::Params params, mf::Context /*context*/) const override { - const VArray &sample_positions = params.readonly_single_input( - 0, "Source Position"); - const VArray &sample_ids = params.readonly_single_input(1, "Sample ID"); + const VArray &src_positions = params.readonly_single_input(0, + "Source Position"); MutableSpan positions = params.uninitialized_single_output_if_required( - 2, "Position"); - MutableSpan distances = params.uninitialized_single_output_if_required( - 3, "Distance"); - MutableSpan is_valid_span = params.uninitialized_single_output_if_required( - 4, "Is Valid"); + 1, "Position"); + /* Make sure there is a distance array, used for finding the smaller distance when there are + * multiple components. Theoretically it would be possible to avoid using the distance array + * when there is only one component. However, this only adds an allocation and a single float + * comparison per vertex, so it's likely not worth it. */ + MutableSpan distances = params.uninitialized_single_output(2, "Distance"); - mask.foreach_index([&](const int i) { - const float3 sample_position = sample_positions[i]; - const int sample_id = sample_ids[i]; - const int group_index = group_indices_.index_of_try(sample_id); - if (group_index == -1) { - if (!positions.is_empty()) { - positions[i] = float3(0, 0, 0); - } - if (!is_valid_span.is_empty()) { - is_valid_span[i] = false; - } - if (!distances.is_empty()) { - distances[i] = 0.0f; - } - return; - } - const BVHTrees &trees = bvh_trees_[group_index]; - BVHTreeNearest nearest; - /* Take mesh and pointcloud bvh tree into account. The final result is the closer of the two. - * First first bvhtree query will set `nearest.dist_sq` which is then passed into the second - * query as a maximum distance. */ - nearest.dist_sq = FLT_MAX; - if (trees.mesh_bvh.tree != nullptr) { - BLI_bvhtree_find_nearest(trees.mesh_bvh.tree, - sample_position, - &nearest, - trees.mesh_bvh.nearest_callback, - const_cast(&trees.mesh_bvh)); - } - if (trees.pointcloud_bvh.tree != nullptr) { - BLI_bvhtree_find_nearest(trees.pointcloud_bvh.tree, - sample_position, - &nearest, - trees.pointcloud_bvh.nearest_callback, - const_cast(&trees.pointcloud_bvh)); - } + index_mask::masked_fill(distances, FLT_MAX, mask); + bool success = false; + if (target_.has_mesh()) { + success |= calculate_mesh_proximity( + src_positions, mask, *target_.get_mesh(), type_, distances, positions); + } + + if (target_.has_pointcloud() && type_ == GEO_NODE_PROX_TARGET_POINTS) { + success |= calculate_pointcloud_proximity( + src_positions, mask, *target_.get_pointcloud(), distances, positions); + } + + if (!success) { if (!positions.is_empty()) { - positions[i] = nearest.co; - } - if (!is_valid_span.is_empty()) { - is_valid_span[i] = true; + index_mask::masked_fill(positions, float3(0), mask); } if (!distances.is_empty()) { - distances[i] = std::sqrt(nearest.dist_sq); + index_mask::masked_fill(distances, 0.0f, mask); } - }); + return; + } + + if (params.single_output_is_required(2, "Distance")) { + mask.foreach_index_optimized( + GrainSize(2048), [&](const int j) { distances[j] = std::sqrt(distances[j]); }); + } } }; @@ -272,18 +202,14 @@ static void node_geo_exec(GeoNodeExecParams params) } const NodeGeometryProximity &storage = node_storage(params.node()); - Field group_id_field = params.extract_input>("Group ID"); Field position_field = params.extract_input>("Source Position"); - Field sample_id_field = params.extract_input>("Sample Group ID"); auto proximity_fn = std::make_unique( - std::move(target), GeometryNodeProximityTargetType(storage.target_element), group_id_field); - auto proximity_op = FieldOperation::Create( - std::move(proximity_fn), {std::move(position_field), std::move(sample_id_field)}); + std::move(target), GeometryNodeProximityTargetType(storage.target_element)); + auto proximity_op = FieldOperation::Create(std::move(proximity_fn), {std::move(position_field)}); params.set_output("Position", Field(proximity_op, 0)); params.set_output("Distance", Field(proximity_op, 1)); - params.set_output("Is Valid", Field(proximity_op, 2)); } static void node_rna(StructRNA *srna) diff --git a/source/blender/nodes/geometry/nodes/node_geo_realize_instances.cc b/source/blender/nodes/geometry/nodes/node_geo_realize_instances.cc index 3a2072cd17f..5ecb40cca9d 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_realize_instances.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_realize_instances.cc @@ -6,6 +6,7 @@ #include "GEO_realize_instances.hh" +#include "UI_interface.hh" #include "UI_resources.hh" namespace blender::nodes::node_geo_realize_instances_cc { diff --git a/source/blender/nodes/geometry/nodes/node_geo_remove_attribute.cc b/source/blender/nodes/geometry/nodes/node_geo_remove_attribute.cc index ebe3f0a7677..22753b27ff9 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_remove_attribute.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_remove_attribute.cc @@ -4,20 +4,12 @@ #include "node_geometry_util.hh" +#include "NOD_socket_search_link.hh" + #include -#include "NOD_rna_define.hh" - -#include "UI_interface.hh" -#include "UI_resources.hh" - namespace blender::nodes::node_geo_remove_attribute_cc { -enum class PatternMode { - Exact, - Wildcard, -}; - static void node_declare(NodeDeclarationBuilder &b) { b.add_input("Geometry"); @@ -25,44 +17,22 @@ static void node_declare(NodeDeclarationBuilder &b) b.add_output("Geometry").propagate_all(); } -static void node_layout(uiLayout *layout, bContext * /*C*/, PointerRNA *ptr) -{ - uiItemR(layout, ptr, "pattern_mode", UI_ITEM_NONE, "", ICON_NONE); -} - static void node_geo_exec(GeoNodeExecParams params) { GeometrySet geometry_set = params.extract_input("Geometry"); - const std::string pattern = params.extract_input("Name"); - if (pattern.empty()) { + const std::string name = params.extract_input("Name"); + if (name.empty()) { params.set_output("Geometry", std::move(geometry_set)); return; } - const bNode &node = params.node(); - PatternMode pattern_mode = PatternMode(node.custom1); - if (pattern_mode == PatternMode::Wildcard) { - const int wildcard_count = Span(pattern.c_str(), pattern.size()).count('*'); - if (wildcard_count == 0) { - pattern_mode = PatternMode::Exact; - } - else if (wildcard_count >= 2) { - params.error_message_add(NodeWarningType::Info, - TIP_("Only one * is supported in the pattern")); - params.set_output("Geometry", std::move(geometry_set)); - return; - } + if (!bke::allow_procedural_attribute_access(name)) { + params.error_message_add(NodeWarningType::Info, TIP_(bke::no_procedural_access_message)); + params.set_output("Geometry", std::move(geometry_set)); + return; } - StringRef wildcard_prefix; - StringRef wildcard_suffix; - if (pattern_mode == PatternMode::Wildcard) { - const int wildcard_index = pattern.find('*'); - wildcard_prefix = StringRef(pattern).substr(0, wildcard_index); - wildcard_suffix = StringRef(pattern).substr(wildcard_index + 1); - } - - Set removed_attributes; - Set failed_attributes; + std::atomic attribute_exists = false; + std::atomic cannot_delete = false; geometry_set.modify_geometry_sets([&](GeometrySet &geometry_set) { for (const GeometryComponent::Type type : {GeometryComponent::Type::Mesh, @@ -70,103 +40,42 @@ static void node_geo_exec(GeoNodeExecParams params) GeometryComponent::Type::Curve, GeometryComponent::Type::Instance}) { - if (!geometry_set.has(type)) { - continue; - } - /* First check if the attribute exists before getting write access, - * to avoid potentially expensive unnecessary copies. */ - const GeometryComponent &read_only_component = *geometry_set.get_component(type); - Vector attributes_to_remove; - switch (pattern_mode) { - case PatternMode::Exact: { - if (read_only_component.attributes()->contains(pattern)) { - attributes_to_remove.append(pattern); - } - break; - } - case PatternMode::Wildcard: { - read_only_component.attributes()->for_all( - [&](const blender::bke::AttributeIDRef &id, - const blender::bke::AttributeMetaData /*meta_data*/) { - if (id.is_anonymous()) { - return true; - } - const StringRef attribute_name = id.name(); - if (attribute_name.startswith(wildcard_prefix) && - attribute_name.endswith(wildcard_suffix)) - { - attributes_to_remove.append(attribute_name); - } - return true; - }); - - break; - } - } - if (attributes_to_remove.is_empty()) { - break; - } - - GeometryComponent &component = geometry_set.get_component_for_write(type); - for (const StringRef attribute_name : attributes_to_remove) { - if (!bke::allow_procedural_attribute_access(attribute_name)) { - continue; - } - if (component.attributes_for_write()->remove(attribute_name)) { - removed_attributes.add(attribute_name); + if (geometry_set.has(type)) { + /* First check if the attribute exists before getting write access, + * to avoid potentially expensive unnecessary copies. */ + const GeometryComponent &read_only_component = *geometry_set.get_component(type); + if (read_only_component.attributes()->contains(name)) { + attribute_exists = true; } else { - failed_attributes.add(attribute_name); + continue; + } + + GeometryComponent &component = geometry_set.get_component_for_write(type); + if (!component.attributes_for_write()->remove(name)) { + cannot_delete = true; } } } }); - for (const StringRef attribute_name : removed_attributes) { - params.used_named_attribute(attribute_name, NamedAttributeUsage::Remove); + if (attribute_exists && !cannot_delete) { + params.used_named_attribute(name, NamedAttributeUsage::Remove); } - if (!failed_attributes.is_empty()) { - Vector quoted_attribute_names; - for (const StringRef attribute_name : failed_attributes) { - quoted_attribute_names.append(fmt::format("\"{}\"", attribute_name)); - } - const std::string message = fmt::format(TIP_("Cannot remove built-in attributes: {}"), - fmt::join(quoted_attribute_names, ", ")); + if (!attribute_exists) { + const std::string message = fmt::format(TIP_("Attribute does not exist: \"{}\""), name); params.error_message_add(NodeWarningType::Warning, message); } - else if (removed_attributes.is_empty() && pattern_mode == PatternMode::Exact) { - const std::string message = fmt::format(TIP_("Attribute does not exist: \"{}\""), pattern); + if (cannot_delete) { + const std::string message = fmt::format(TIP_("Cannot delete built-in attribute: \"{}\""), + name); params.error_message_add(NodeWarningType::Warning, message); } params.set_output("Geometry", std::move(geometry_set)); } -static void node_rna(StructRNA *srna) -{ - static const EnumPropertyItem pattern_mode_items[] = { - {int(PatternMode::Exact), - "EXACT", - 0, - "Exact", - "Remove the one attribute with the given name"}, - {int(PatternMode::Wildcard), - "WILDCARD", - 0, - "Wildcard", - "Remove all attributes that match the pattern which is allowed to contain a single " - "wildcard (*)."}, - {0, nullptr, 0, nullptr, nullptr}, - }; - RNA_def_node_enum(srna, - "pattern_mode", - "Pattern Mode", - "How the attributes to remove are chosen", - pattern_mode_items, - NOD_inline_enum_accessors(custom1)); -} - static void node_register() { static bNodeType ntype; @@ -174,12 +83,9 @@ static void node_register() geo_node_type_base( &ntype, GEO_NODE_REMOVE_ATTRIBUTE, "Remove Named Attribute", NODE_CLASS_ATTRIBUTE); ntype.declare = node_declare; - ntype.draw_buttons = node_layout; bke::node_type_size(&ntype, 170, 100, 700); ntype.geometry_node_execute = node_geo_exec; nodeRegisterType(&ntype); - - node_rna(ntype.rna_ext.srna); } NOD_REGISTER_NODE(node_register) diff --git a/source/blender/nodes/geometry/nodes/node_geo_repeat.cc b/source/blender/nodes/geometry/nodes/node_geo_repeat.cc index ea64436aa18..09425cde30e 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_repeat.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_repeat.cc @@ -5,6 +5,15 @@ #include "BLI_string.h" #include "BLI_string_utf8.h" +#include "BKE_compute_contexts.hh" +#include "BKE_scene.h" + +#include "DEG_depsgraph_query.hh" + +#include "UI_interface.hh" +#include "UI_resources.hh" + +#include "NOD_geometry.hh" #include "NOD_socket.hh" #include "NOD_zone_socket_items.hh" @@ -20,8 +29,6 @@ NODE_STORAGE_FUNCS(NodeGeometryRepeatInput); static void node_declare(NodeDeclarationBuilder &b) { - b.use_custom_socket_order(); - b.allow_any_socket_order(); b.add_input("Iterations").min(0).default_value(1); const bNode *node = b.node_or_null(); @@ -38,7 +45,7 @@ static void node_declare(NodeDeclarationBuilder &b) const StringRef name = item.name ? item.name : ""; const std::string identifier = RepeatItemsAccessor::socket_identifier_for_item(item); auto &input_decl = b.add_input(socket_type, name, identifier); - auto &output_decl = b.add_output(socket_type, name, identifier).align_with_previous(); + auto &output_decl = b.add_output(socket_type, name, identifier); if (socket_type_supports_fields(socket_type)) { input_decl.supports_field(); output_decl.dependent_field({input_decl.input_index()}); @@ -47,7 +54,7 @@ static void node_declare(NodeDeclarationBuilder &b) } } b.add_input("", "__extend__"); - b.add_output("", "__extend__").align_with_previous(); + b.add_output("", "__extend__"); } static void node_init(bNodeTree * /*tree*/, bNode *node) @@ -100,8 +107,6 @@ NODE_STORAGE_FUNCS(NodeGeometryRepeatOutput); static void node_declare(NodeDeclarationBuilder &b) { - b.use_custom_socket_order(); - b.allow_any_socket_order(); const bNode *node = b.node_or_null(); if (node) { const NodeGeometryRepeatOutput &storage = node_storage(*node); @@ -111,7 +116,7 @@ static void node_declare(NodeDeclarationBuilder &b) const StringRef name = item.name ? item.name : ""; const std::string identifier = RepeatItemsAccessor::socket_identifier_for_item(item); auto &input_decl = b.add_input(socket_type, name, identifier); - auto &output_decl = b.add_output(socket_type, name, identifier).align_with_previous(); + auto &output_decl = b.add_output(socket_type, name, identifier); if (socket_type_supports_fields(socket_type)) { input_decl.supports_field(); output_decl.dependent_field({input_decl.input_index()}); @@ -119,7 +124,7 @@ static void node_declare(NodeDeclarationBuilder &b) } } b.add_input("", "__extend__"); - b.add_output("", "__extend__").align_with_previous(); + b.add_output("", "__extend__"); } static void node_init(bNodeTree * /*tree*/, bNode *node) diff --git a/source/blender/nodes/geometry/nodes/node_geo_rotate_instances.cc b/source/blender/nodes/geometry/nodes/node_geo_rotate_instances.cc index d434b336505..6aef3780108 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_rotate_instances.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_rotate_instances.cc @@ -39,7 +39,7 @@ static void rotate_instances(GeoNodeExecParams ¶ms, bke::Instances &instance const VArray pivots = evaluator.get_evaluated(1); const VArray local_spaces = evaluator.get_evaluated(2); - MutableSpan transforms = instances.transforms_for_write(); + MutableSpan transforms = instances.transforms(); selection.foreach_index(GrainSize(512), [&](const int64_t i) { const float3 pivot = pivots[i]; diff --git a/source/blender/nodes/geometry/nodes/node_geo_sample_grid.cc b/source/blender/nodes/geometry/nodes/node_geo_sample_grid.cc deleted file mode 100644 index ffe4cbd6343..00000000000 --- a/source/blender/nodes/geometry/nodes/node_geo_sample_grid.cc +++ /dev/null @@ -1,299 +0,0 @@ -/* SPDX-FileCopyrightText: 2024 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -#include "BKE_type_conversions.hh" -#include "BKE_volume_grid.hh" -#include "BKE_volume_openvdb.hh" - -#include "NOD_rna_define.hh" -#include "NOD_socket_search_link.hh" - -#include "UI_interface.hh" -#include "UI_resources.hh" - -#include "RNA_enum_types.hh" - -#ifdef WITH_OPENVDB -# include -#endif - -#include "node_geometry_util.hh" - -namespace blender::nodes::node_geo_sample_grid_cc { - -enum class InterpolationMode { - Nearest = 0, - TriLinear = 1, - TriQuadratic = 2, -}; - -static void node_declare(NodeDeclarationBuilder &b) -{ - const bNode *node = b.node_or_null(); - if (!node) { - return; - } - const eNodeSocketDatatype data_type = eNodeSocketDatatype(node->custom1); - - b.add_input(data_type, "Grid").hide_value(); - b.add_input("Position").implicit_field(implicit_field_inputs::position); - - b.add_output(data_type, "Value").dependent_field({1}); -} - -static std::optional node_type_for_socket_type(const bNodeSocket &socket) -{ - switch (socket.type) { - case SOCK_FLOAT: - return SOCK_FLOAT; - case SOCK_BOOLEAN: - return SOCK_BOOLEAN; - case SOCK_INT: - return SOCK_INT; - case SOCK_VECTOR: - case SOCK_RGBA: - return SOCK_VECTOR; - default: - return std::nullopt; - } -} - -static void node_gather_link_search_ops(GatherLinkSearchOpParams ¶ms) -{ - if (!U.experimental.use_new_volume_nodes) { - return; - } - const std::optional node_type = node_type_for_socket_type( - params.other_socket()); - if (!node_type) { - return; - } - if (params.in_out() == SOCK_IN) { - params.add_item(IFACE_("Grid"), [node_type](LinkSearchOpParams ¶ms) { - bNode &node = params.add_node("GeometryNodeSampleGrid"); - node.custom1 = *node_type; - params.update_and_connect_available_socket(node, "Grid"); - }); - const eNodeSocketDatatype other_type = eNodeSocketDatatype(params.other_socket().type); - if (params.node_tree().typeinfo->validate_link(other_type, SOCK_VECTOR)) { - params.add_item(IFACE_("Position"), [](LinkSearchOpParams ¶ms) { - bNode &node = params.add_node("GeometryNodeSampleGrid"); - params.update_and_connect_available_socket(node, "Position"); - }); - } - } - else { - params.add_item(IFACE_("Value"), [node_type](LinkSearchOpParams ¶ms) { - bNode &node = params.add_node("GeometryNodeSampleGrid"); - node.custom1 = *node_type; - params.update_and_connect_available_socket(node, "Value"); - }); - } -} - -static void node_layout(uiLayout *layout, bContext * /*C*/, PointerRNA *ptr) -{ - uiItemR(layout, ptr, "data_type", UI_ITEM_NONE, "", ICON_NONE); - uiItemR(layout, ptr, "interpolation_mode", UI_ITEM_NONE, "", ICON_NONE); -} - -static void node_init(bNodeTree * /*tree*/, bNode *node) -{ - node->custom1 = SOCK_FLOAT; - node->custom2 = int16_t(InterpolationMode::TriLinear); -} - -#ifdef WITH_OPENVDB - -template -void sample_grid(const bke::OpenvdbGridType &grid, - const InterpolationMode interpolation, - const Span positions, - const IndexMask &mask, - MutableSpan dst) -{ - using GridType = bke::OpenvdbGridType; - using GridValueT = typename GridType::ValueType; - using AccessorT = typename GridType::ConstAccessor; - using TraitsT = typename bke::VolumeGridTraits; - AccessorT accessor = grid.getConstAccessor(); - - auto sample_data = [&](auto sampler) { - mask.foreach_index([&](const int64_t i) { - const float3 &pos = positions[i]; - GridValueT value = sampler.wsSample(openvdb::Vec3R(pos.x, pos.y, pos.z)); - dst[i] = TraitsT::to_blender(value); - }); - }; - - /* Use to the Nearest Neighbor sampler for Bool grids (no interpolation). */ - InterpolationMode real_interpolation = interpolation; - if constexpr (std::is_same_v) { - real_interpolation = InterpolationMode::Nearest; - } - switch (real_interpolation) { - case InterpolationMode::TriLinear: { - openvdb::tools::GridSampler sampler(accessor, - grid.transform()); - sample_data(sampler); - break; - } - case InterpolationMode::TriQuadratic: { - openvdb::tools::GridSampler sampler( - accessor, grid.transform()); - sample_data(sampler); - break; - } - case InterpolationMode::Nearest: { - openvdb::tools::GridSampler sampler( - accessor, grid.transform()); - sample_data(sampler); - break; - } - } -} - -template void convert_to_static_type(const VolumeGridType type, const Fn &fn) -{ - switch (type) { - case VOLUME_GRID_BOOLEAN: - fn(bool()); - break; - case VOLUME_GRID_FLOAT: - fn(float()); - break; - case VOLUME_GRID_INT: - fn(int()); - break; - case VOLUME_GRID_MASK: - fn(bool()); - break; - case VOLUME_GRID_VECTOR_FLOAT: - fn(float3()); - break; - default: - break; - } -} - -class SampleGridFunction : public mf::MultiFunction { - bke::GVolumeGrid grid_; - InterpolationMode interpolation_; - mf::Signature signature_; - - public: - SampleGridFunction(bke::GVolumeGrid grid, InterpolationMode interpolation) - : grid_(std::move(grid)), interpolation_(interpolation) - { - BLI_assert(grid_); - - const std::optional data_type = bke::grid_type_to_socket_type( - grid_->grid_type()); - const CPPType *cpp_type = bke::socket_type_to_geo_nodes_base_cpp_type(*data_type); - mf::SignatureBuilder builder{"Sample Grid", signature_}; - builder.single_input("Position"); - builder.single_output("Value", *cpp_type); - this->set_signature(&signature_); - } - - void call(const IndexMask &mask, mf::Params params, mf::Context /*context*/) const override - { - const VArraySpan positions = params.readonly_single_input(0, "Position"); - GMutableSpan dst = params.uninitialized_single_output(1, "Value"); - - bke::VolumeTreeAccessToken tree_token; - convert_to_static_type(grid_->grid_type(), [&](auto dummy) { - using T = decltype(dummy); - sample_grid( - grid_.typed().grid(tree_token), interpolation_, positions, mask, dst.typed()); - }); - } -}; - -#endif /* WITH_OPENVDB */ - -static void node_geo_exec(GeoNodeExecParams params) -{ -#ifdef WITH_OPENVDB - const bNode &node = params.node(); - const eNodeSocketDatatype data_type = eNodeSocketDatatype(node.custom1); - const InterpolationMode interpolation = InterpolationMode(node.custom2); - - bke::GVolumeGrid grid = params.extract_input("Grid"); - if (!grid) { - params.set_default_remaining_outputs(); - return; - } - - auto fn = std::make_shared(std::move(grid), interpolation); - auto op = FieldOperation::Create(std::move(fn), - {params.extract_input>("Position")}); - - const bke::DataTypeConversions &conversions = bke::get_implicit_type_conversions(); - const CPPType &output_type = *bke::socket_type_to_geo_nodes_base_cpp_type(data_type); - const GField output_field = conversions.try_convert(fn::GField(std::move(op)), output_type); - params.set_output("Value", std::move(output_field)); - -#else - node_geo_exec_with_missing_openvdb(params); -#endif -} - -static const EnumPropertyItem *data_type_filter_fn(bContext * /*C*/, - PointerRNA * /*ptr*/, - PropertyRNA * /*prop*/, - bool *r_free) -{ - *r_free = true; - return enum_items_filter( - rna_enum_node_socket_type_items, [](const EnumPropertyItem &item) -> bool { - return ELEM(item.value, SOCK_FLOAT, SOCK_INT, SOCK_BOOLEAN, SOCK_VECTOR); - }); -} - -static void node_rna(StructRNA *srna) -{ - RNA_def_node_enum(srna, - "data_type", - "Data Type", - "Node socket data type", - rna_enum_node_socket_type_items, - NOD_inline_enum_accessors(custom1), - CD_PROP_FLOAT, - data_type_filter_fn); - - static const EnumPropertyItem interpolation_mode_items[] = { - {int(InterpolationMode::Nearest), "NEAREST", 0, "Nearest Neighbor", ""}, - {int(InterpolationMode::TriLinear), "TRILINEAR", 0, "Trilinear", ""}, - {int(InterpolationMode::TriQuadratic), "TRIQUADRATIC", 0, "Triquadratic", ""}, - {0, nullptr, 0, nullptr, nullptr}, - }; - - RNA_def_node_enum(srna, - "interpolation_mode", - "Interpolation Mode", - "How to interpolate the values between neighboring voxels", - interpolation_mode_items, - NOD_inline_enum_accessors(custom2), - int(InterpolationMode::TriLinear)); -} - -static void node_register() -{ - static bNodeType ntype; - - geo_node_type_base(&ntype, GEO_NODE_SAMPLE_GRID, "Sample Grid", NODE_CLASS_CONVERTER); - ntype.initfunc = node_init; - ntype.declare = node_declare; - ntype.gather_link_search_ops = node_gather_link_search_ops; - ntype.geometry_node_execute = node_geo_exec; - ntype.draw_buttons = node_layout; - ntype.geometry_node_execute = node_geo_exec; - nodeRegisterType(&ntype); - - node_rna(ntype.rna_ext.srna); -} -NOD_REGISTER_NODE(node_register) - -} // namespace blender::nodes::node_geo_sample_grid_cc diff --git a/source/blender/nodes/geometry/nodes/node_geo_sample_nearest.cc b/source/blender/nodes/geometry/nodes/node_geo_sample_nearest.cc index 5a85307aefb..ecfda215b04 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_sample_nearest.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_sample_nearest.cc @@ -2,10 +2,13 @@ * * SPDX-License-Identifier: GPL-2.0-or-later */ +#include "BLI_array_utils.hh" + #include "DNA_pointcloud_types.h" #include "BKE_bvhutils.hh" #include "BKE_mesh.hh" +#include "BKE_mesh_runtime.hh" #include "NOD_rna_define.hh" @@ -80,8 +83,8 @@ static void get_closest_pointcloud_points(const PointCloud &pointcloud, BLI_assert(pointcloud.totpoint > 0); BVHTreeFromPointCloud tree_data; - BKE_bvhtree_from_pointcloud_get(pointcloud, IndexMask(pointcloud.totpoint), tree_data); - if (tree_data.tree == nullptr) { + const BVHTree *tree = BKE_bvhtree_from_pointcloud_get(&tree_data, &pointcloud, 2); + if (tree == nullptr) { r_indices.fill(0); r_distances_sq.fill(0.0f); return; diff --git a/source/blender/nodes/geometry/nodes/node_geo_sample_nearest_surface.cc b/source/blender/nodes/geometry/nodes/node_geo_sample_nearest_surface.cc index 688398215d7..805efb40ff2 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_sample_nearest_surface.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_sample_nearest_surface.cc @@ -14,8 +14,6 @@ #include "RNA_enum_types.hh" -#include "BLI_task.hh" - #include "node_geometry_util.hh" namespace blender::nodes::node_geo_sample_nearest_surface_cc { @@ -31,22 +29,12 @@ static void node_declare(NodeDeclarationBuilder &b) const eCustomDataType data_type = eCustomDataType(node->custom1); b.add_input(data_type, "Value").hide_value().field_on_all(); } - b.add_input("Group ID") - .hide_value() - .field_on_all() - .description( - "Splits the faces of the input mesh into groups which can be sampled individually"); b.add_input("Sample Position").implicit_field(implicit_field_inputs::position); - b.add_input("Sample Group ID").hide_value().supports_field(); if (node != nullptr) { const eCustomDataType data_type = eCustomDataType(node->custom1); - b.add_output(data_type, "Value").dependent_field({3, 4}); + b.add_output(data_type, "Value").dependent_field({2}); } - b.add_output("Is Valid") - .dependent_field({3, 4}) - .description( - "Whether the sampling was successfull. It can fail when the sampled group is empty"); } static void node_layout(uiLayout *layout, bContext * /*C*/, PointerRNA *ptr) @@ -76,99 +64,46 @@ static void node_gather_link_searches(GatherLinkSearchOpParams ¶ms) } } +static void get_closest_mesh_tris(const Mesh &mesh, + const VArray &positions, + const IndexMask &mask, + const MutableSpan r_tri_indices, + const MutableSpan r_distances_sq, + const MutableSpan r_positions) +{ + BLI_assert(mesh.faces_num > 0); + BVHTreeFromMesh tree_data; + BKE_bvhtree_from_mesh_get(&tree_data, &mesh, BVHTREE_FROM_CORNER_TRIS, 2); + get_closest_in_bvhtree(tree_data, positions, mask, r_tri_indices, r_distances_sq, r_positions); + free_bvhtree_from_mesh(&tree_data); +} + class SampleNearestSurfaceFunction : public mf::MultiFunction { - private: GeometrySet source_; - Array bvh_trees_; - VectorSet group_indices_; public: - SampleNearestSurfaceFunction(GeometrySet geometry, const Field &group_id_field) - : source_(std::move(geometry)) + SampleNearestSurfaceFunction(GeometrySet geometry) : source_(std::move(geometry)) { source_.ensure_owns_direct_data(); static const mf::Signature signature = []() { mf::Signature signature; mf::SignatureBuilder builder{"Sample Nearest Surface", signature}; builder.single_input("Position"); - builder.single_input("Sample ID"); builder.single_output("Triangle Index"); builder.single_output("Sample Position"); - builder.single_output("Is Valid", mf::ParamFlag::SupportsUnusedOutput); return signature; }(); this->set_signature(&signature); - - const Mesh &mesh = *source_.get_mesh(); - - /* Compute group ids on mesh. */ - bke::MeshFieldContext field_context{mesh, bke::AttrDomain::Face}; - FieldEvaluator field_evaluator{field_context, mesh.faces_num}; - field_evaluator.add(group_id_field); - field_evaluator.evaluate(); - const VArray group_ids = field_evaluator.get_evaluated(0); - - /* Compute index masks for groups. */ - IndexMaskMemory memory; - const Vector group_masks = IndexMask::from_group_ids( - group_ids, memory, group_indices_); - const int groups_num = group_masks.size(); - - /* Construct BVH tree for each group. */ - bvh_trees_.reinitialize(groups_num); - threading::parallel_for_weighted( - IndexRange(groups_num), - 512, - [&](const IndexRange range) { - for (const int group_i : range) { - const IndexMask &group_mask = group_masks[group_i]; - BVHTreeFromMesh &bvh = bvh_trees_[group_i]; - BKE_bvhtree_from_mesh_tris_init(mesh, group_mask, bvh); - } - }, - [&](const int group_i) { return group_masks[group_i].size(); }); - } - - ~SampleNearestSurfaceFunction() - { - for (BVHTreeFromMesh &tree : bvh_trees_) { - free_bvhtree_from_mesh(&tree); - } } void call(const IndexMask &mask, mf::Params params, mf::Context /*context*/) const override { const VArray &positions = params.readonly_single_input(0, "Position"); - const VArray &sample_ids = params.readonly_single_input(1, "Sample ID"); - MutableSpan triangle_index = params.uninitialized_single_output(2, "Triangle Index"); + MutableSpan triangle_index = params.uninitialized_single_output(1, "Triangle Index"); MutableSpan sample_position = params.uninitialized_single_output( - 3, "Sample Position"); - MutableSpan is_valid_span = params.uninitialized_single_output_if_required( - 4, "Is Valid"); - - mask.foreach_index([&](const int i) { - const float3 position = positions[i]; - const int sample_id = sample_ids[i]; - const int group_index = group_indices_.index_of_try(sample_id); - if (group_index == -1) { - triangle_index[i] = -1; - sample_position[i] = float3(0, 0, 0); - if (!is_valid_span.is_empty()) { - is_valid_span[i] = false; - } - return; - } - const BVHTreeFromMesh &bvh = bvh_trees_[group_index]; - BVHTreeNearest nearest; - nearest.dist_sq = FLT_MAX; - BLI_bvhtree_find_nearest( - bvh.tree, position, &nearest, bvh.nearest_callback, const_cast(&bvh)); - triangle_index[i] = nearest.index; - sample_position[i] = nearest.co; - if (!is_valid_span.is_empty()) { - is_valid_span[i] = true; - } - }); + 2, "Sample Position"); + const Mesh &mesh = *source_.get_mesh(); + get_closest_mesh_tris(mesh, positions, mask, triangle_index, {}, sample_position); } ExecutionHints get_execution_hints() const override @@ -198,13 +133,10 @@ static void node_geo_exec(GeoNodeExecParams params) } auto nearest_op = FieldOperation::Create( - std::make_shared(geometry, - params.extract_input>("Group ID")), - {params.extract_input>("Sample Position"), - params.extract_input>("Sample Group ID")}); + std::make_shared(geometry), + {params.extract_input>("Sample Position")}); Field triangle_indices(nearest_op, 0); Field nearest_positions(nearest_op, 1); - Field is_valid(nearest_op, 2); Field bary_weights = Field(FieldOperation::Create( std::make_shared(geometry), @@ -216,7 +148,6 @@ static void node_geo_exec(GeoNodeExecParams params) {triangle_indices, bary_weights}); params.set_output("Value", GField(sample_op)); - params.set_output("Is Valid", is_valid); } static void node_rna(StructRNA *srna) diff --git a/source/blender/nodes/geometry/nodes/node_geo_scale_elements.cc b/source/blender/nodes/geometry/nodes/node_geo_scale_elements.cc index dfcae1f813e..23508d5c72d 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_scale_elements.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_scale_elements.cc @@ -165,35 +165,30 @@ static void scale_vertex_islands_uniformly(Mesh &mesh, const OffsetIndices faces = mesh.faces(); const Span corner_verts = mesh.corner_verts(); - threading::parallel_for_weighted( - islands.index_range(), - 512, - [&](const IndexRange range) { - for (const int island_index : range) { - const ElementIsland &island = islands[island_index]; + threading::parallel_for(islands.index_range(), 256, [&](const IndexRange range) { + for (const int island_index : range) { + const ElementIsland &island = islands[island_index]; - float scale = 0.0f; - float3 center = {0.0f, 0.0f, 0.0f}; + float scale = 0.0f; + float3 center = {0.0f, 0.0f, 0.0f}; - VectorSet vertex_indices; - for (const int face_index : island.element_indices) { - get_vertex_indices(edges, faces, corner_verts, face_index, vertex_indices); - center += params.centers[face_index]; - scale += params.scales[face_index]; - } + VectorSet vertex_indices; + for (const int face_index : island.element_indices) { + get_vertex_indices(edges, faces, corner_verts, face_index, vertex_indices); + center += params.centers[face_index]; + scale += params.scales[face_index]; + } - /* Divide by number of elements to get the average. */ - const float f = 1.0f / island.element_indices.size(); - scale *= f; - center *= f; + /* Divide by number of elements to get the average. */ + const float f = 1.0f / island.element_indices.size(); + scale *= f; + center *= f; - for (const int vert_index : vertex_indices) { - positions[vert_index] = transform_with_uniform_scale( - positions[vert_index], center, scale); - } - } - }, - [&](const int64_t i) { return islands[i].element_indices.size(); }); + for (const int vert_index : vertex_indices) { + positions[vert_index] = transform_with_uniform_scale(positions[vert_index], center, scale); + } + } + }); mesh.tag_positions_changed(); } diff --git a/source/blender/nodes/geometry/nodes/node_geo_scale_instances.cc b/source/blender/nodes/geometry/nodes/node_geo_scale_instances.cc index efcb6f18382..e23eff152df 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_scale_instances.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_scale_instances.cc @@ -38,7 +38,7 @@ static void scale_instances(GeoNodeExecParams ¶ms, bke::Instances &instances const VArray pivots = evaluator.get_evaluated(1); const VArray local_spaces = evaluator.get_evaluated(2); - MutableSpan transforms = instances.transforms_for_write(); + MutableSpan transforms = instances.transforms(); selection.foreach_index(GrainSize(512), [&](const int64_t i) { const float3 pivot = pivots[i]; diff --git a/source/blender/nodes/geometry/nodes/node_geo_set_curve_radius.cc b/source/blender/nodes/geometry/nodes/node_geo_set_curve_radius.cc index ed0cc07b698..ddd6a9c3378 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_set_curve_radius.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_set_curve_radius.cc @@ -24,42 +24,49 @@ static void node_declare(NodeDeclarationBuilder &b) static void set_radius(bke::CurvesGeometry &curves, const fn::FieldContext &field_context, - const Field &selection, - const Field &radius) + const Field &selection_field, + const Field &radius_field) { - bke::try_capture_field_on_geometry(curves.attributes_for_write(), - field_context, - "radius", - bke::AttrDomain::Point, - selection, - radius); + if (curves.points_num() == 0) { + return; + } + MutableAttributeAccessor attributes = curves.attributes_for_write(); + AttributeWriter radii = attributes.lookup_or_add_for_write("radius", + AttrDomain::Point); + fn::FieldEvaluator evaluator{field_context, curves.points_num()}; + evaluator.set_selection(selection_field); + evaluator.add_with_destination(radius_field, radii.varray); + evaluator.evaluate(); + + radii.finish(); } static void node_geo_exec(GeoNodeExecParams params) { GeometrySet geometry_set = params.extract_input("Curve"); - const Field selection = params.extract_input>("Selection"); - const Field radius = params.extract_input>("Radius"); + Field selection_field = params.extract_input>("Selection"); + Field radii_field = params.extract_input>("Radius"); geometry_set.modify_geometry_sets([&](GeometrySet &geometry_set) { if (Curves *curves_id = geometry_set.get_curves_for_write()) { bke::CurvesGeometry &curves = curves_id->geometry.wrap(); - const bke::CurvesFieldContext field_context(curves, AttrDomain::Point); - set_radius(curves, field_context, selection, radius); + const bke::CurvesFieldContext field_context{curves, AttrDomain::Point}; + set_radius(curves, field_context, selection_field, radii_field); } + if (GreasePencil *grease_pencil = geometry_set.get_grease_pencil_for_write()) { using namespace blender::bke::greasepencil; + for (const int layer_index : grease_pencil->layers().index_range()) { Drawing *drawing = get_eval_grease_pencil_layer_drawing_for_write(*grease_pencil, layer_index); if (drawing == nullptr) { continue; } - set_radius( - drawing->strokes_for_write(), - bke::GreasePencilLayerFieldContext(*grease_pencil, AttrDomain::Point, layer_index), - selection, - radius); + bke::CurvesGeometry &curves = drawing->strokes_for_write(); + const bke::GreasePencilLayerFieldContext field_context( + *grease_pencil, AttrDomain::Point, layer_index); + set_radius(curves, field_context, selection_field, radii_field); } } }); diff --git a/source/blender/nodes/geometry/nodes/node_geo_set_curve_tilt.cc b/source/blender/nodes/geometry/nodes/node_geo_set_curve_tilt.cc index 01402ae04cb..d18af3246d5 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_set_curve_tilt.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_set_curve_tilt.cc @@ -20,20 +20,26 @@ static void node_declare(NodeDeclarationBuilder &b) static void set_curve_tilt(bke::CurvesGeometry &curves, const fn::FieldContext &field_context, - const Field &selection, - const Field &tilt) + const Field &selection_field, + const Field &tilt_field) { - bke::try_capture_field_on_geometry(curves.attributes_for_write(), - field_context, - "tilt", - bke::AttrDomain::Point, - selection, - tilt); + if (curves.points_num() == 0) { + return; + } + MutableAttributeAccessor attributes = curves.attributes_for_write(); + AttributeWriter tilts = attributes.lookup_or_add_for_write("tilt", + AttrDomain::Point); + fn::FieldEvaluator evaluator{field_context, curves.points_num()}; + evaluator.set_selection(selection_field); + evaluator.add_with_destination(tilt_field, tilts.varray); + evaluator.evaluate(); + + tilts.finish(); } static void set_grease_pencil_tilt(GreasePencil &grease_pencil, - const Field &selection, - const Field &tilt) + const Field &selection_field, + const Field &tilt_field) { using namespace blender::bke::greasepencil; for (const int layer_index : grease_pencil.layers().index_range()) { @@ -41,28 +47,28 @@ static void set_grease_pencil_tilt(GreasePencil &grease_pencil, if (drawing == nullptr) { continue; } - set_curve_tilt( - drawing->strokes_for_write(), - bke::GreasePencilLayerFieldContext(grease_pencil, AttrDomain::Point, layer_index), - selection, - tilt); + bke::CurvesGeometry &curves = drawing->strokes_for_write(); + const bke::GreasePencilLayerFieldContext field_context( + grease_pencil, AttrDomain::Point, layer_index); + set_curve_tilt(curves, field_context, selection_field, tilt_field); } } static void node_geo_exec(GeoNodeExecParams params) { GeometrySet geometry_set = params.extract_input("Curve"); - const Field selection = params.extract_input>("Selection"); - const Field tilt = params.extract_input>("Tilt"); + Field selection_field = params.extract_input>("Selection"); + Field tilt_field = params.extract_input>("Tilt"); geometry_set.modify_geometry_sets([&](GeometrySet &geometry_set) { if (Curves *curves_id = geometry_set.get_curves_for_write()) { bke::CurvesGeometry &curves = curves_id->geometry.wrap(); - const bke::CurvesFieldContext field_context(curves, AttrDomain::Point); - set_curve_tilt(curves, field_context, selection, tilt); + const bke::CurvesFieldContext field_context{curves, AttrDomain::Point}; + set_curve_tilt(curves, field_context, selection_field, tilt_field); } - if (GreasePencil *grease_pencil = geometry_set.get_grease_pencil_for_write()) { - set_grease_pencil_tilt(*grease_pencil, selection, tilt); + if (geometry_set.has_grease_pencil()) { + set_grease_pencil_tilt( + *geometry_set.get_grease_pencil_for_write(), selection_field, tilt_field); } }); diff --git a/source/blender/nodes/geometry/nodes/node_geo_set_material.cc b/source/blender/nodes/geometry/nodes/node_geo_set_material.cc index 2ba91107df4..832015953d5 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_set_material.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_set_material.cc @@ -4,6 +4,7 @@ #include "node_geometry_util.hh" +#include "UI_interface.hh" #include "UI_resources.hh" #include "DNA_curves_types.h" diff --git a/source/blender/nodes/geometry/nodes/node_geo_set_material_index.cc b/source/blender/nodes/geometry/nodes/node_geo_set_material_index.cc index 0d691837f85..090abb307b0 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_set_material_index.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_set_material_index.cc @@ -5,7 +5,6 @@ #include "node_geometry_util.hh" #include "DNA_grease_pencil_types.h" -#include "DNA_mesh_types.h" #include "BKE_curves.hh" #include "BKE_grease_pencil.hh" @@ -21,9 +20,31 @@ static void node_declare(NodeDeclarationBuilder &b) b.add_output("Geometry").propagate_all(); } +static void set_material_index_in_geometry(const fn::FieldContext &field_context, + const Field &selection_field, + const Field &index_field, + MutableAttributeAccessor &attributes, + const AttrDomain domain) +{ + const int domain_size = attributes.domain_size(domain); + if (domain_size == 0) { + return; + } + + const bke::AttributeValidator validator = attributes.lookup_validator("material_index"); + AttributeWriter indices = attributes.lookup_or_add_for_write("material_index", domain); + + fn::FieldEvaluator evaluator{field_context, domain_size}; + evaluator.set_selection(selection_field); + evaluator.add_with_destination(validator.validate_field_if_necessary(index_field), + indices.varray); + evaluator.evaluate(); + indices.finish(); +} + static void set_material_index_in_grease_pencil(GreasePencil &grease_pencil, - const Field &selection, - const Field &material_index) + const Field &selection_field, + const Field &index_field) { using namespace blender::bke::greasepencil; for (const int layer_index : grease_pencil.layers().index_range()) { @@ -31,33 +52,36 @@ static void set_material_index_in_grease_pencil(GreasePencil &grease_pencil, if (drawing == nullptr) { continue; } - bke::try_capture_field_on_geometry( - drawing->strokes_for_write().attributes_for_write(), - bke::GreasePencilLayerFieldContext(grease_pencil, AttrDomain::Curve, layer_index), - "material_index", - AttrDomain::Curve, - selection, - material_index); + bke::CurvesGeometry &curves = drawing->strokes_for_write(); + if (curves.curves_num() == 0) { + continue; + } + + MutableAttributeAccessor attributes = curves.attributes_for_write(); + const bke::GreasePencilLayerFieldContext field_context{ + grease_pencil, AttrDomain::Curve, layer_index}; + set_material_index_in_geometry( + field_context, selection_field, index_field, attributes, AttrDomain::Curve); } } static void node_geo_exec(GeoNodeExecParams params) { GeometrySet geometry_set = params.extract_input("Geometry"); - const Field selection = params.extract_input>("Selection"); - const Field material_index = params.extract_input>("Material Index"); + Field selection_field = params.extract_input>("Selection"); + Field index_field = params.extract_input>("Material Index"); geometry_set.modify_geometry_sets([&](GeometrySet &geometry_set) { - if (Mesh *mesh = geometry_set.get_mesh_for_write()) { - bke::try_capture_field_on_geometry(mesh->attributes_for_write(), - bke::MeshFieldContext(*mesh, AttrDomain::Face), - "material_index", - AttrDomain::Face, - selection, - material_index); + if (geometry_set.has_mesh()) { + GeometryComponent &component = geometry_set.get_component_for_write(); + const bke::GeometryFieldContext field_context{ + geometry_set.get_component_for_write(), AttrDomain::Face}; + MutableAttributeAccessor attributes = *component.attributes_for_write(); + set_material_index_in_geometry( + field_context, selection_field, index_field, attributes, AttrDomain::Face); } if (GreasePencil *grease_pencil = geometry_set.get_grease_pencil_for_write()) { - set_material_index_in_grease_pencil(*grease_pencil, selection, material_index); + set_material_index_in_grease_pencil(*grease_pencil, selection_field, index_field); } }); params.set_output("Geometry", std::move(geometry_set)); diff --git a/source/blender/nodes/geometry/nodes/node_geo_set_point_radius.cc b/source/blender/nodes/geometry/nodes/node_geo_set_point_radius.cc index c56ac337ea8..4128d8cec6d 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_set_point_radius.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_set_point_radius.cc @@ -20,20 +20,35 @@ static void node_declare(NodeDeclarationBuilder &b) b.add_output("Points").propagate_all(); } +static void set_radius_in_component(PointCloud &pointcloud, + const Field &selection_field, + const Field &radius_field) +{ + if (pointcloud.totpoint == 0) { + return; + } + MutableAttributeAccessor attributes = pointcloud.attributes_for_write(); + AttributeWriter radii = attributes.lookup_or_add_for_write("radius", + AttrDomain::Point); + + const bke::PointCloudFieldContext field_context{pointcloud}; + fn::FieldEvaluator evaluator{field_context, pointcloud.totpoint}; + evaluator.set_selection(selection_field); + evaluator.add_with_destination(radius_field, radii.varray); + evaluator.evaluate(); + + radii.finish(); +} + static void node_geo_exec(GeoNodeExecParams params) { GeometrySet geometry_set = params.extract_input("Points"); - const Field selection = params.extract_input>("Selection"); - const Field radius = params.extract_input>("Radius"); + Field selection_field = params.extract_input>("Selection"); + Field radii_field = params.extract_input>("Radius"); geometry_set.modify_geometry_sets([&](GeometrySet &geometry_set) { if (PointCloud *pointcloud = geometry_set.get_pointcloud_for_write()) { - bke::try_capture_field_on_geometry(pointcloud->attributes_for_write(), - bke::PointCloudFieldContext(*pointcloud), - "radius", - bke::AttrDomain::Point, - selection, - radius); + set_radius_in_component(*pointcloud, selection_field, radii_field); } }); diff --git a/source/blender/nodes/geometry/nodes/node_geo_set_position.cc b/source/blender/nodes/geometry/nodes/node_geo_set_position.cc index be7d7de18f6..82c352ad001 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_set_position.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_set_position.cc @@ -2,11 +2,13 @@ * * SPDX-License-Identifier: GPL-2.0-or-later */ +#include "DEG_depsgraph_query.hh" + +#include "BLI_task.hh" + #include "BKE_curves.hh" #include "BKE_grease_pencil.hh" -#include "BKE_instances.hh" #include "BKE_mesh.hh" -#include "BKE_pointcloud.hh" #include "node_geometry_util.hh" @@ -21,137 +23,181 @@ static void node_declare(NodeDeclarationBuilder &b) b.add_output("Geometry").propagate_all(); } -static const auto &get_add_fn() +static void set_computed_position_and_offset(GeometryComponent &component, + const VArray &in_positions, + const VArray &in_offsets, + const IndexMask &selection, + MutableAttributeAccessor attributes) { - static const auto fn = mf::build::SI2_SO( - "Add", - [](const float3 a, const float3 b) { return a + b; }, - mf::build::exec_presets::AllSpanOrSingle()); - return fn; -} + /* Optimize the case when `in_positions` references the original positions array. */ + const bke::AttributeReader positions_read_only = attributes.lookup("position"); + bool positions_are_original = false; + if (positions_read_only.varray.is_span() && in_positions.is_span()) { + positions_are_original = positions_read_only.varray.get_internal_span().data() == + in_positions.get_internal_span().data(); + } -static const auto &get_sub_fn() -{ - static const auto fn = mf::build::SI2_SO( - "Add", - [](const float3 a, const float3 b) { return a - b; }, - mf::build::exec_presets::AllSpanOrSingle()); - return fn; -} - -static void set_points_position(bke::MutableAttributeAccessor attributes, - const fn::FieldContext &field_context, - const Field &selection_field, - const Field &position_field) -{ - bke::try_capture_field_on_geometry(attributes, - field_context, - "position", - bke::AttrDomain::Point, - selection_field, - position_field); -} - -static void set_curves_position(bke::CurvesGeometry &curves, - const fn::FieldContext &field_context, - const Field &selection_field, - const Field &position_field) -{ - MutableAttributeAccessor attributes = curves.attributes_for_write(); - if (attributes.contains("handle_right") && attributes.contains("handle_left")) { - fn::Field delta(fn::FieldOperation::Create( - get_sub_fn(), {position_field, bke::AttributeFieldInput::Create("position")})); - for (const StringRef name : {"handle_left", "handle_right"}) { - bke::try_capture_field_on_geometry( - attributes, - field_context, - name, - bke::AttrDomain::Point, - selection_field, - Field(fn::FieldOperation::Create( - get_add_fn(), {bke::AttributeFieldInput::Create(name), delta}))); + if (positions_are_original) { + if (const std::optional offset = in_offsets.get_if_single()) { + if (math::is_zero(*offset)) { + return; + } + } + } + const GrainSize grain_size{10000}; + + switch (component.type()) { + case GeometryComponent::Type::Curve: { + if (attributes.contains("handle_right") && attributes.contains("handle_left")) { + CurveComponent &curve_component = static_cast(component); + Curves &curves_id = *curve_component.get_for_write(); + bke::CurvesGeometry &curves = curves_id.geometry.wrap(); + SpanAttributeWriter handle_right_attribute = + attributes.lookup_or_add_for_write_span("handle_right", AttrDomain::Point); + SpanAttributeWriter handle_left_attribute = + attributes.lookup_or_add_for_write_span("handle_left", AttrDomain::Point); + + AttributeWriter positions = attributes.lookup_for_write("position"); + MutableVArraySpan out_positions_span = positions.varray; + devirtualize_varray2( + in_positions, in_offsets, [&](const auto in_positions, const auto in_offsets) { + selection.foreach_index_optimized(grain_size, [&](const int i) { + const float3 new_position = in_positions[i] + in_offsets[i]; + const float3 delta = new_position - out_positions_span[i]; + handle_right_attribute.span[i] += delta; + handle_left_attribute.span[i] += delta; + out_positions_span[i] = new_position; + }); + }); + + out_positions_span.save(); + positions.finish(); + handle_right_attribute.finish(); + handle_left_attribute.finish(); + + /* Automatic Bezier handles must be recalculated based on the new positions. */ + curves.calculate_bezier_auto_handles(); + break; + } + ATTR_FALLTHROUGH; + } + default: { + AttributeWriter positions = attributes.lookup_for_write("position"); + MutableVArraySpan out_positions_span = positions.varray; + if (positions_are_original) { + devirtualize_varray(in_offsets, [&](const auto in_offsets) { + selection.foreach_index_optimized( + grain_size, [&](const int i) { out_positions_span[i] += in_offsets[i]; }); + }); + } + else { + devirtualize_varray2( + in_positions, in_offsets, [&](const auto in_positions, const auto in_offsets) { + selection.foreach_index_optimized(grain_size, [&](const int i) { + out_positions_span[i] = in_positions[i] + in_offsets[i]; + }); + }); + } + out_positions_span.save(); + positions.finish(); + break; } } - set_points_position(attributes, field_context, selection_field, position_field); - curves.calculate_bezier_auto_handles(); } -static void set_position_in_grease_pencil(GreasePencil &grease_pencil, +static void set_position_in_grease_pencil(GreasePencilComponent &grease_pencil_component, const Field &selection_field, - const Field &position_field) + const Field &position_field, + const Field &offset_field) { using namespace blender::bke::greasepencil; + GreasePencil &grease_pencil = *grease_pencil_component.get_for_write(); + /* Set position for each layer. */ for (const int layer_index : grease_pencil.layers().index_range()) { Drawing *drawing = bke::greasepencil::get_eval_grease_pencil_layer_drawing_for_write( grease_pencil, layer_index); if (drawing == nullptr || drawing->strokes().points_num() == 0) { continue; } - set_curves_position( - drawing->strokes_for_write(), - bke::GreasePencilLayerFieldContext(grease_pencil, bke::AttrDomain::Point, layer_index), - selection_field, - position_field); + bke::GreasePencilLayerFieldContext field_context( + grease_pencil, AttrDomain::Point, layer_index); + fn::FieldEvaluator evaluator{field_context, drawing->strokes().points_num()}; + evaluator.set_selection(selection_field); + evaluator.add(position_field); + evaluator.add(offset_field); + evaluator.evaluate(); + + const IndexMask selection = evaluator.get_evaluated_selection_as_mask(); + if (selection.is_empty()) { + continue; + } + + MutableAttributeAccessor attributes = drawing->strokes_for_write().attributes_for_write(); + const VArray positions_input = evaluator.get_evaluated(0); + const VArray offsets_input = evaluator.get_evaluated(1); + set_computed_position_and_offset( + grease_pencil_component, positions_input, offsets_input, selection, attributes); drawing->tag_positions_changed(); } } -static void set_instances_position(bke::Instances &instances, - const Field &selection_field, - const Field &position_field) +static void set_position_in_component(GeometrySet &geometry, + GeometryComponent::Type component_type, + const Field &selection_field, + const Field &position_field, + const Field &offset_field) { - const bke::InstancesFieldContext context(instances); - fn::FieldEvaluator evaluator(context, instances.instances_num()); - evaluator.set_selection(selection_field); + const GeometryComponent &component = *geometry.get_component(component_type); + const AttrDomain domain = component.type() == GeometryComponent::Type::Instance ? + AttrDomain::Instance : + AttrDomain::Point; + const int domain_size = component.attribute_domain_size(domain); + if (domain_size == 0) { + return; + } - /* Use a temporary array for the output to avoid potentially reading from freed memory if - * retrieving the transforms has to make a mutable copy (then we can't depend on the user count - * of the original read-only data). */ - Array result(instances.instances_num()); - evaluator.add_with_destination(position_field, result.as_mutable_span()); + bke::GeometryFieldContext field_context{component, domain}; + fn::FieldEvaluator evaluator{field_context, domain_size}; + evaluator.set_selection(selection_field); + evaluator.add(position_field); + evaluator.add(offset_field); evaluator.evaluate(); - MutableSpan transforms = instances.transforms_for_write(); - threading::parallel_for(transforms.index_range(), 2048, [&](const IndexRange range) { - for (const int i : range) { - transforms[i].location() = result[i]; - } - }); + const IndexMask selection = evaluator.get_evaluated_selection_as_mask(); + if (selection.is_empty()) { + return; + } + + GeometryComponent &mutable_component = geometry.get_component_for_write(component_type); + MutableAttributeAccessor attributes = *mutable_component.attributes_for_write(); + const VArray positions_input = evaluator.get_evaluated(0); + const VArray offsets_input = evaluator.get_evaluated(1); + set_computed_position_and_offset( + mutable_component, positions_input, offsets_input, selection, attributes); } static void node_geo_exec(GeoNodeExecParams params) { GeometrySet geometry = params.extract_input("Geometry"); - const Field selection_field = params.extract_input>("Selection"); - const fn::Field position_field( - fn::FieldOperation::Create(get_add_fn(), - {params.extract_input>("Position"), - params.extract_input>("Offset")})); + Field selection_field = params.extract_input>("Selection"); + Field offset_field = params.extract_input>("Offset"); + Field position_field = params.extract_input>("Position"); - if (Mesh *mesh = geometry.get_mesh_for_write()) { - set_points_position(mesh->attributes_for_write(), - bke::MeshFieldContext(*mesh, bke::AttrDomain::Point), - selection_field, - position_field); + if (geometry.has_grease_pencil()) { + set_position_in_grease_pencil(geometry.get_component_for_write(), + selection_field, + position_field, + offset_field); } - if (PointCloud *point_cloud = geometry.get_pointcloud_for_write()) { - set_points_position(point_cloud->attributes_for_write(), - bke::PointCloudFieldContext(*point_cloud), - selection_field, - position_field); - } - if (Curves *curves_id = geometry.get_curves_for_write()) { - bke::CurvesGeometry &curves = curves_id->geometry.wrap(); - set_curves_position(curves, - bke::CurvesFieldContext(curves, bke::AttrDomain::Point), - selection_field, - position_field); - } - if (GreasePencil *grease_pencil = geometry.get_grease_pencil_for_write()) { - set_position_in_grease_pencil(*grease_pencil, selection_field, position_field); - } - if (bke::Instances *instances = geometry.get_instances_for_write()) { - set_instances_position(*instances, selection_field, position_field); + + for (const GeometryComponent::Type type : {GeometryComponent::Type::Mesh, + GeometryComponent::Type::PointCloud, + GeometryComponent::Type::Curve, + GeometryComponent::Type::Instance}) + { + if (geometry.has(type)) { + set_position_in_component(geometry, type, selection_field, position_field, offset_field); + } } params.set_output("Geometry", std::move(geometry)); diff --git a/source/blender/nodes/geometry/nodes/node_geo_set_shade_smooth.cc b/source/blender/nodes/geometry/nodes/node_geo_set_shade_smooth.cc index 0409888b8dd..d0befb084ab 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_set_shade_smooth.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_set_shade_smooth.cc @@ -40,16 +40,18 @@ static void node_init(bNodeTree * /*tree*/, bNode *node) */ static bool try_removing_sharp_attribute(Mesh &mesh, const StringRef name, - const Field &selection, - const Field &sharpness) + const Field &selection_field, + const Field &sharp_field) { - if (selection.node().depends_on_input() || sharpness.node().depends_on_input()) { + if (selection_field.node().depends_on_input() || sharp_field.node().depends_on_input()) { return false; } - if (!fn::evaluate_constant_field(selection)) { + const bool selection = fn::evaluate_constant_field(selection_field); + if (!selection) { return true; } - if (fn::evaluate_constant_field(sharpness)) { + const bool sharp = fn::evaluate_constant_field(sharp_field); + if (sharp) { return false; } mesh.attributes_for_write().remove(name); @@ -59,37 +61,42 @@ static bool try_removing_sharp_attribute(Mesh &mesh, static void set_sharp(Mesh &mesh, const AttrDomain domain, const StringRef name, - const Field &selection, - const Field &sharpness) + const Field &selection_field, + const Field &sharp_field) { const int domain_size = mesh.attributes().domain_size(domain); - if (domain_size == 0) { + if (mesh.attributes().domain_size(domain) == 0) { return; } - if (try_removing_sharp_attribute(mesh, name, selection, sharpness)) { + if (try_removing_sharp_attribute(mesh, name, selection_field, sharp_field)) { return; } - bke::try_capture_field_on_geometry(mesh.attributes_for_write(), - bke::MeshFieldContext(mesh, domain), - name, - domain, - selection, - sharpness); + + MutableAttributeAccessor attributes = mesh.attributes_for_write(); + AttributeWriter sharp = attributes.lookup_or_add_for_write(name, domain); + + const bke::MeshFieldContext field_context{mesh, domain}; + fn::FieldEvaluator evaluator{field_context, domain_size}; + evaluator.set_selection(selection_field); + evaluator.add_with_destination(sharp_field, sharp.varray); + evaluator.evaluate(); + + sharp.finish(); } static void node_geo_exec(GeoNodeExecParams params) { GeometrySet geometry_set = params.extract_input("Geometry"); const AttrDomain domain = AttrDomain(params.node().custom1); - const Field selection = params.extract_input>("Selection"); - const Field smooth_field = params.extract_input>("Shade Smooth"); + Field selection_field = params.extract_input>("Selection"); + Field smooth_field = params.extract_input>("Shade Smooth"); geometry_set.modify_geometry_sets([&](GeometrySet &geometry_set) { if (Mesh *mesh = geometry_set.get_mesh_for_write()) { set_sharp(*mesh, domain, domain == AttrDomain::Face ? "sharp_face" : "sharp_edge", - selection, + selection_field, fn::invert_boolean_field(smooth_field)); } }); diff --git a/source/blender/nodes/geometry/nodes/node_geo_set_spline_cyclic.cc b/source/blender/nodes/geometry/nodes/node_geo_set_spline_cyclic.cc index 37e5d118f0a..948eddf8525 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_set_spline_cyclic.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_set_spline_cyclic.cc @@ -20,20 +20,26 @@ static void node_declare(NodeDeclarationBuilder &b) static void set_curve_cyclic(bke::CurvesGeometry &curves, const fn::FieldContext &field_context, - const Field &selection, - const Field &cyclic) + const Field &selection_field, + const Field &cyclic_field) { - bke::try_capture_field_on_geometry(curves.attributes_for_write(), - field_context, - "cyclic", - bke::AttrDomain::Curve, - selection, - cyclic); + if (curves.curves_num() == 0) { + return; + } + MutableAttributeAccessor attributes = curves.attributes_for_write(); + AttributeWriter cyclics = attributes.lookup_or_add_for_write("cyclic", + AttrDomain::Curve); + fn::FieldEvaluator evaluator{field_context, curves.curves_num()}; + evaluator.set_selection(selection_field); + evaluator.add_with_destination(cyclic_field, cyclics.varray); + evaluator.evaluate(); + + cyclics.finish(); } static void set_grease_pencil_cyclic(GreasePencil &grease_pencil, - const Field &selection, - const Field &cyclic) + const Field &selection_field, + const Field &cyclic_field) { using namespace blender::bke::greasepencil; for (const int layer_index : grease_pencil.layers().index_range()) { @@ -41,28 +47,28 @@ static void set_grease_pencil_cyclic(GreasePencil &grease_pencil, if (drawing == nullptr) { continue; } - set_curve_cyclic( - drawing->strokes_for_write(), - bke::GreasePencilLayerFieldContext(grease_pencil, AttrDomain::Curve, layer_index), - selection, - cyclic); + bke::CurvesGeometry &curves = drawing->strokes_for_write(); + const bke::GreasePencilLayerFieldContext field_context( + grease_pencil, AttrDomain::Curve, layer_index); + set_curve_cyclic(curves, field_context, selection_field, cyclic_field); } } static void node_geo_exec(GeoNodeExecParams params) { GeometrySet geometry_set = params.extract_input("Geometry"); - const Field selection = params.extract_input>("Selection"); - const Field cyclic = params.extract_input>("Cyclic"); + Field selection_field = params.extract_input>("Selection"); + Field cyclic_field = params.extract_input>("Cyclic"); geometry_set.modify_geometry_sets([&](GeometrySet &geometry_set) { if (Curves *curves_id = geometry_set.get_curves_for_write()) { bke::CurvesGeometry &curves = curves_id->geometry.wrap(); const bke::CurvesFieldContext field_context{curves, AttrDomain::Curve}; - set_curve_cyclic(curves, field_context, selection, cyclic); + set_curve_cyclic(curves_id->geometry.wrap(), field_context, selection_field, cyclic_field); } - if (GreasePencil *grease_pencil = geometry_set.get_grease_pencil_for_write()) { - set_grease_pencil_cyclic(*grease_pencil, selection, cyclic); + if (geometry_set.has_grease_pencil()) { + set_grease_pencil_cyclic( + *geometry_set.get_grease_pencil_for_write(), selection_field, cyclic_field); } }); diff --git a/source/blender/nodes/geometry/nodes/node_geo_set_spline_resolution.cc b/source/blender/nodes/geometry/nodes/node_geo_set_spline_resolution.cc index 031ac039bca..30dbeb8d2fa 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_set_spline_resolution.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_set_spline_resolution.cc @@ -20,20 +20,29 @@ static void node_declare(NodeDeclarationBuilder &b) static void set_curve_resolution(bke::CurvesGeometry &curves, const fn::FieldContext &field_context, - const Field &selection, - const Field &resolution) + const Field &selection_field, + const Field &resolution_field) { - bke::try_capture_field_on_geometry(curves.attributes_for_write(), - field_context, - "resolution", - AttrDomain::Curve, - selection, - resolution); + if (curves.curves_num() == 0) { + return; + } + MutableAttributeAccessor attributes = curves.attributes_for_write(); + AttributeWriter resolutions = attributes.lookup_or_add_for_write("resolution", + AttrDomain::Curve); + bke::AttributeValidator validator = attributes.lookup_validator("resolution"); + + fn::FieldEvaluator evaluator{field_context, curves.curves_num()}; + evaluator.set_selection(selection_field); + evaluator.add_with_destination(validator.validate_field_if_necessary(resolution_field), + resolutions.varray); + evaluator.evaluate(); + + resolutions.finish(); } static void set_grease_pencil_resolution(GreasePencil &grease_pencil, - const Field &selection, - const Field &resolution) + const Field &selection_field, + const Field &resolution_field) { using namespace blender::bke::greasepencil; for (const int layer_index : grease_pencil.layers().index_range()) { @@ -41,28 +50,28 @@ static void set_grease_pencil_resolution(GreasePencil &grease_pencil, if (drawing == nullptr) { continue; } - set_curve_resolution( - drawing->strokes_for_write(), - bke::GreasePencilLayerFieldContext(grease_pencil, AttrDomain::Curve, layer_index), - selection, - resolution); + bke::CurvesGeometry &curves = drawing->strokes_for_write(); + const bke::GreasePencilLayerFieldContext field_context( + grease_pencil, AttrDomain::Curve, layer_index); + set_curve_resolution(curves, field_context, selection_field, resolution_field); } } static void node_geo_exec(GeoNodeExecParams params) { GeometrySet geometry_set = params.extract_input("Geometry"); - const Field selection = params.extract_input>("Selection"); - const Field resolution = params.extract_input>("Resolution"); + Field selection = params.extract_input>("Selection"); + Field resolution = params.extract_input>("Resolution"); geometry_set.modify_geometry_sets([&](GeometrySet &geometry_set) { if (Curves *curves_id = geometry_set.get_curves_for_write()) { bke::CurvesGeometry &curves = curves_id->geometry.wrap(); - const bke::CurvesFieldContext field_context(curves, AttrDomain::Curve); - set_curve_resolution(curves, field_context, selection, resolution); + const bke::CurvesFieldContext field_context{curves, AttrDomain::Curve}; + set_curve_resolution(curves_id->geometry.wrap(), field_context, selection, resolution); } - if (GreasePencil *grease_pencil = geometry_set.get_grease_pencil_for_write()) { - set_grease_pencil_resolution(*grease_pencil, selection, resolution); + if (geometry_set.has_grease_pencil()) { + set_grease_pencil_resolution( + *geometry_set.get_grease_pencil_for_write(), selection, resolution); } }); diff --git a/source/blender/nodes/geometry/nodes/node_geo_simulation.cc b/source/blender/nodes/geometry/nodes/node_geo_simulation.cc index c66d4400ac5..be79b582402 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_simulation.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_simulation.cc @@ -18,7 +18,7 @@ #include "BKE_modifier.hh" #include "BKE_node_socket_value.hh" #include "BKE_object.hh" -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "DEG_depsgraph_query.hh" @@ -42,7 +42,7 @@ #include "MOD_nodes.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "GEO_mix_geometries.hh" @@ -341,8 +341,6 @@ class LazyFunctionForSimulationInputNode final : public LazyFunction { static void node_declare(NodeDeclarationBuilder &b) { - b.use_custom_socket_order(); - b.allow_any_socket_order(); b.add_output("Delta Time"); const bNode *node = b.node_or_null(); @@ -364,14 +362,14 @@ static void node_declare(NodeDeclarationBuilder &b) const StringRef name = item.name; const std::string identifier = SimulationItemsAccessor::socket_identifier_for_item(item); auto &input_decl = b.add_input(socket_type, name, identifier); - auto &output_decl = b.add_output(socket_type, name, identifier).align_with_previous(); + auto &output_decl = b.add_output(socket_type, name, identifier); if (socket_type_supports_fields(socket_type)) { input_decl.supports_field(); output_decl.dependent_field({input_decl.input_index()}); } } b.add_input("", "__extend__"); - b.add_output("", "__extend__").align_with_previous(); + b.add_output("", "__extend__"); } static void node_init(bNodeTree * /*tree*/, bNode *node) @@ -429,9 +427,9 @@ class LazyFunctionForSimulationOutputNode final : public LazyFunction { Span simulation_items_; int skip_input_index_; /** - * Start index of the simulation state inputs that are used when the simulation is skipped. - * Those inputs are linked directly to the simulation input node. Those inputs only exist - * internally, but not in the UI. + * Start index of the simulation state inputs that are used when the simulation is skipped. Those + * inputs are linked directly to the simulation input node. Those inputs only exist internally, + * but not in the UI. */ int skip_inputs_offset_; /** @@ -650,8 +648,8 @@ class LazyFunctionForSimulationOutputNode final : public LazyFunction { } const bool skip = skip_variant->get(); - /* Instead of outputting the values directly, convert them to a bake state and then back. - * This ensures that some geometry processing happens on the data consistently (e.g. removing + /* Instead of outputting the values directly, convert them to a bake state and then back. This + * ensures that some geometry processing happens on the data consistently (e.g. removing * anonymous attributes). */ std::optional bake_state = this->get_bake_state_from_inputs( params, data_block_map, skip); @@ -683,8 +681,6 @@ class LazyFunctionForSimulationOutputNode final : public LazyFunction { static void node_declare(NodeDeclarationBuilder &b) { - b.use_custom_socket_order(); - b.allow_any_socket_order(); b.add_input("Skip").description( "Forward the output of the simulation input node directly to the output node and ignore " "the nodes in the simulation zone"); @@ -702,14 +698,14 @@ static void node_declare(NodeDeclarationBuilder &b) const StringRef name = item.name; const std::string identifier = SimulationItemsAccessor::socket_identifier_for_item(item); auto &input_decl = b.add_input(socket_type, name, identifier); - auto &output_decl = b.add_output(socket_type, name, identifier).align_with_previous(); + auto &output_decl = b.add_output(socket_type, name, identifier); if (socket_type_supports_fields(socket_type)) { input_decl.supports_field(); output_decl.dependent_field({input_decl.input_index()}); } } b.add_input("", "__extend__"); - b.add_output("", "__extend__").align_with_previous(); + b.add_output("", "__extend__"); } static void node_init(bNodeTree * /*tree*/, bNode *node) @@ -949,8 +945,7 @@ void mix_baked_data_item(const eNodeSocketDatatype socket_type, case SOCK_INT: case SOCK_BOOLEAN: case SOCK_ROTATION: - case SOCK_RGBA: - case SOCK_MATRIX: { + case SOCK_RGBA: { const CPPType &type = node_geo_simulation_cc::get_simulation_item_cpp_type(socket_type); SocketValueVariant prev_value_variant = *static_cast(prev); SocketValueVariant next_value_variant = *static_cast(next); diff --git a/source/blender/nodes/geometry/nodes/node_geo_sort_elements.cc b/source/blender/nodes/geometry/nodes/node_geo_sort_elements.cc index 7a62a505928..f473ea51ac5 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_sort_elements.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_sort_elements.cc @@ -12,6 +12,8 @@ #include "BLI_sort.hh" #include "BLI_task.hh" +#include "DNA_mesh_types.h" + #include "GEO_reorder.hh" #include "NOD_rna_define.hh" diff --git a/source/blender/nodes/geometry/nodes/node_geo_split_to_instances.cc b/source/blender/nodes/geometry/nodes/node_geo_split_to_instances.cc index 5ade67d374e..c42361a5d4f 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_split_to_instances.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_split_to_instances.cc @@ -9,6 +9,7 @@ #include "BKE_curves.hh" #include "BKE_instances.hh" +#include "BKE_mesh.hh" #include "BKE_pointcloud.hh" #include "NOD_rna_define.hh" @@ -62,7 +63,7 @@ struct SplitGroups { VectorSet group_ids; IndexMaskMemory memory; - Vector group_masks; + Array group_masks; }; /** @@ -90,8 +91,24 @@ struct SplitGroups { return true; } - r_groups.group_masks = IndexMask::from_group_ids( - selection, field_evaluator.get_evaluated(0), r_groups.memory, r_groups.group_ids); + const VArray group_ids_varray = field_evaluator.get_evaluated(0); + if (selection.size() == domain_size && group_ids_varray.is_single()) { + const int group_id = group_ids_varray.get_internal_single(); + ensure_group_geometries(geometry_by_group_id, {group_id}); + geometry_by_group_id.lookup(group_id)->add(src_component); + return true; + } + + const VArraySpan group_ids = group_ids_varray; + selection.foreach_index_optimized( + [&](const int i) { r_groups.group_ids.add(group_ids[i]); }); + + r_groups.group_masks.reinitialize(r_groups.group_ids.size()); + IndexMask::from_groups( + selection, + r_groups.memory, + [&](const int i) { return r_groups.group_ids.index_of(group_ids[i]); }, + r_groups.group_masks); ensure_group_geometries(geometry_by_group_id, r_groups.group_ids); return false; @@ -246,6 +263,7 @@ static void split_instance_groups(const InstancesComponent &component, group_instances->add_reference(reference); } + array_utils::gather(src_instances.transforms(), mask, group_instances->transforms()); bke::gather_attributes(src_instances.attributes(), AttrDomain::Instance, propagation_info, @@ -322,7 +340,7 @@ static void node_geo_exec(GeoNodeExecParams params) dst_group_id.finish(); } - dst_instances->transforms_for_write().fill(float4x4::identity()); + dst_instances->transforms().fill(float4x4::identity()); array_utils::fill_index_range(dst_instances->reference_handles_for_write()); for (auto item : geometry_by_group_id.items()) { diff --git a/source/blender/nodes/geometry/nodes/node_geo_store_named_attribute.cc b/source/blender/nodes/geometry/nodes/node_geo_store_named_attribute.cc index e189a5686ef..029cf40e577 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_store_named_attribute.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_store_named_attribute.cc @@ -10,7 +10,6 @@ #include "RNA_access.hh" #include "RNA_enum_types.hh" -#include "BKE_instances.hh" #include "BKE_mesh.hh" #include "BKE_type_conversions.hh" @@ -120,21 +119,9 @@ static void node_geo_exec(GeoNodeExecParams params) if (geometry_set.has_instances()) { GeometryComponent &component = geometry_set.get_component_for_write( GeometryComponent::Type::Instance); - - if (name == "position" && data_type == CD_PROP_FLOAT3) { - /* Special case for "position" which is no longer an attribute on instances. */ - bke::Instances &instances = *geometry_set.get_instances_for_write(); - bke::InstancesFieldContext context(instances); - fn::FieldEvaluator evaluator{context, instances.instances_num()}; - evaluator.set_selection(selection); - evaluator.add_with_destination(field, bke::instance_position_varray_for_write(instances)); - evaluator.evaluate(); - } - else { - if (!bke::try_capture_field_on_geometry(component, name, domain, selection, field)) { - if (component.attribute_domain_size(domain) != 0) { - failure.store(true); - } + if (!bke::try_capture_field_on_geometry(component, name, domain, selection, field)) { + if (component.attribute_domain_size(domain) != 0) { + failure.store(true); } } } diff --git a/source/blender/nodes/geometry/nodes/node_geo_store_named_grid.cc b/source/blender/nodes/geometry/nodes/node_geo_store_named_grid.cc index 37a3b364301..b97027e2818 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_store_named_grid.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_store_named_grid.cc @@ -34,31 +34,8 @@ static void node_declare(NodeDeclarationBuilder &b) static void search_link_ops(GatherLinkSearchOpParams ¶ms) { - if (!U.experimental.use_new_volume_nodes) { - return; - } - params.add_item(IFACE_("Volume"), [](LinkSearchOpParams ¶ms) { - bNode &node = params.add_node("GeometryNodeStoreNamedGrid"); - params.update_and_connect_available_socket(node, "Volume"); - }); - if (params.in_out() == SOCK_IN) { - if (params.other_socket().type == SOCK_STRING) { - params.add_item(IFACE_("Name"), [](LinkSearchOpParams ¶ms) { - bNode &node = params.add_node("GeometryNodeStoreNamedGrid"); - params.update_and_connect_available_socket(node, "Name"); - }); - } - if (const std::optional data_type = bke::socket_type_to_custom_data_type( - eNodeSocketDatatype(params.other_socket().type))) - { - if (grid_type_supported(*data_type)) { - params.add_item(IFACE_("Grid"), [data_type](LinkSearchOpParams ¶ms) { - bNode &node = params.add_node("GeometryNodeStoreNamedGrid"); - node.custom1 = *data_type; - params.update_and_connect_available_socket(node, "Grid"); - }); - } - } + if (U.experimental.use_new_volume_nodes) { + nodes::search_link_ops_for_basic_node(params); } } diff --git a/source/blender/nodes/geometry/nodes/node_geo_string_to_curves.cc b/source/blender/nodes/geometry/nodes/node_geo_string_to_curves.cc index d330f3322a7..730ce16a1d9 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_string_to_curves.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_string_to_curves.cc @@ -3,6 +3,7 @@ * SPDX-License-Identifier: GPL-2.0-or-later */ #include "DNA_curve_types.h" +#include "DNA_vfont_types.h" #include "BKE_curve.hh" #include "BKE_curve_legacy_convert.hh" @@ -11,6 +12,7 @@ #include "BKE_vfont.hh" #include "BLI_bounds.hh" +#include "BLI_hash.h" #include "BLI_math_matrix.hh" #include "BLI_string_utf8.h" #include "BLI_task.hh" @@ -318,7 +320,7 @@ static void add_instances_from_handles(bke::Instances &instances, { instances.resize(layout.positions.size()); MutableSpan handles = instances.reference_handles_for_write(); - MutableSpan transforms = instances.transforms_for_write(); + MutableSpan transforms = instances.transforms(); threading::parallel_for(IndexRange(layout.positions.size()), 256, [&](IndexRange range) { for (const int i : range) { 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 22bfb9c7b0d..efbfb456cc5 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_subdivision_surface.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_subdivision_surface.cc @@ -2,6 +2,7 @@ * * SPDX-License-Identifier: GPL-2.0-or-later */ +#include "BLI_array_utils.hh" #include "BLI_task.hh" #include "DNA_modifier_types.h" diff --git a/source/blender/nodes/geometry/nodes/node_geo_switch.cc b/source/blender/nodes/geometry/nodes/node_geo_switch.cc index 4ac03e1af03..9fa89f0cc2b 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_switch.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_switch.cc @@ -222,15 +222,11 @@ static void node_rna(StructRNA *srna) *r_free = true; return enum_items_filter(rna_enum_node_socket_data_type_items, [](const EnumPropertyItem &item) -> bool { - if (item.value == SOCK_MATRIX) { - return U.experimental.use_new_matrix_socket; - } return ELEM(item.value, SOCK_FLOAT, SOCK_INT, SOCK_BOOLEAN, SOCK_ROTATION, - SOCK_MATRIX, SOCK_VECTOR, SOCK_STRING, SOCK_RGBA, diff --git a/source/blender/nodes/geometry/nodes/node_geo_tool_3d_cursor.cc b/source/blender/nodes/geometry/nodes/node_geo_tool_3d_cursor.cc index f369db2483a..601ec21bf18 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_tool_3d_cursor.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_tool_3d_cursor.cc @@ -6,7 +6,7 @@ #include "BLI_math_matrix.hh" -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "node_geometry_util.hh" @@ -30,8 +30,8 @@ static void node_geo_exec(GeoNodeExecParams params) } const View3DCursor &cursor = params.user_data()->call_data->operator_data->scene->cursor; - const float4x4 &world_to_object = - params.user_data()->call_data->operator_data->self_object->world_to_object(); + const float4x4 world_to_object( + params.user_data()->call_data->operator_data->self_object->world_to_object); const float3 location_global(cursor.location); params.set_output("Location", math::transform_point(world_to_object, location_global)); diff --git a/source/blender/nodes/geometry/nodes/node_geo_tool_set_face_set.cc b/source/blender/nodes/geometry/nodes/node_geo_tool_set_face_set.cc index 274d8eb54b1..c390af09eef 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_tool_set_face_set.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_tool_set_face_set.cc @@ -4,6 +4,7 @@ #include "BKE_mesh.hh" +#include "UI_interface.hh" #include "UI_resources.hh" #include "node_geometry_util.hh" diff --git a/source/blender/nodes/geometry/nodes/node_geo_transform_geometry.cc b/source/blender/nodes/geometry/nodes/node_geo_transform_geometry.cc index 0c55a86b2db..d9780315b23 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_transform_geometry.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_transform_geometry.cc @@ -2,10 +2,24 @@ * * SPDX-License-Identifier: GPL-2.0-or-later */ +#include "BLI_math_matrix.h" #include "BLI_math_matrix.hh" #include "BLI_math_rotation.hh" #include "BLI_task.hh" +#include "DNA_mesh_types.h" +#include "DNA_pointcloud_types.h" +#include "DNA_volume_types.h" + +#include "BKE_curves.hh" +#include "BKE_grease_pencil.hh" +#include "BKE_instances.hh" +#include "BKE_mesh.hh" +#include "BKE_pointcloud.hh" +#include "BKE_volume.hh" + +#include "DEG_depsgraph_query.hh" + #include "GEO_transform.hh" #include "node_geometry_util.hh" diff --git a/source/blender/nodes/geometry/nodes/node_geo_translate_instances.cc b/source/blender/nodes/geometry/nodes/node_geo_translate_instances.cc index 91cb24d8a58..24a7ded2d93 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_translate_instances.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_translate_instances.cc @@ -34,7 +34,7 @@ static void translate_instances(GeoNodeExecParams ¶ms, bke::Instances &insta const VArray translations = evaluator.get_evaluated(0); const VArray local_spaces = evaluator.get_evaluated(1); - MutableSpan transforms = instances.transforms_for_write(); + MutableSpan transforms = instances.transforms(); selection.foreach_index(GrainSize(1024), [&](const int64_t i) { if (local_spaces[i]) { diff --git a/source/blender/nodes/geometry/nodes/node_geo_volume_cube.cc b/source/blender/nodes/geometry/nodes/node_geo_volume_cube.cc index 44d865cd09f..9afce4b654e 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_volume_cube.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_volume_cube.cc @@ -11,10 +11,13 @@ #include "node_geometry_util.hh" +#include "DNA_mesh_types.h" + #include "BLI_task.hh" #include "BKE_geometry_set.hh" #include "BKE_lib_id.hh" +#include "BKE_mesh.hh" #include "BKE_volume.hh" #include "BKE_volume_openvdb.hh" 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 b88edcfc946..0426ab011e8 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 @@ -10,8 +10,10 @@ #include "node_geometry_util.hh" +#include "BKE_lib_id.hh" #include "BKE_material.h" #include "BKE_mesh.hh" +#include "BKE_mesh_runtime.hh" #include "BKE_volume.hh" #include "BKE_volume_grid.hh" #include "BKE_volume_to_mesh.hh" diff --git a/source/blender/nodes/intern/derived_node_tree.cc b/source/blender/nodes/intern/derived_node_tree.cc index 216ecd020ff..7321e274fe9 100644 --- a/source/blender/nodes/intern/derived_node_tree.cc +++ b/source/blender/nodes/intern/derived_node_tree.cc @@ -4,6 +4,8 @@ #include "NOD_derived_node_tree.hh" +#include "BKE_node.hh" + #include "BLI_dot_export.hh" namespace blender::nodes { diff --git a/source/blender/nodes/intern/geometry_nodes_execute.cc b/source/blender/nodes/intern/geometry_nodes_execute.cc index e71e9ae4de2..3dadeaee851 100644 --- a/source/blender/nodes/intern/geometry_nodes_execute.cc +++ b/source/blender/nodes/intern/geometry_nodes_execute.cc @@ -93,6 +93,7 @@ static bool node_needs_own_transform_relation(const bNode &node) node.storage); return storage.transform_space == GEO_NODE_TRANSFORM_SPACE_RELATIVE; } + if (node.type == GEO_NODE_SELF_OBJECT) { return true; } @@ -345,7 +346,6 @@ std::unique_ptr id_property_create_f socket.socket_data); return bke::idprop::create(identifier, reinterpret_cast(value->value)); } - case SOCK_MATRIX: case SOCK_CUSTOM: case SOCK_GEOMETRY: case SOCK_SHADER: @@ -387,7 +387,6 @@ bool id_property_type_matches_socket(const bNodeTreeInterfaceSocket &socket, case SOCK_MATERIAL: return property.type == IDP_ID; case SOCK_CUSTOM: - case SOCK_MATRIX: case SOCK_GEOMETRY: case SOCK_SHADER: return false; @@ -679,15 +678,12 @@ static Vector compute_attributes_to_store( for (const OutputAttributeInfo &output_info : outputs_info) { const CPPType &type = output_info.field.cpp_type(); const bke::AttributeValidator validator = attributes.lookup_validator(output_info.name); - OutputAttributeToStore store{ component_type, domain, output_info.name, GMutableSpan{ - type, - MEM_mallocN_aligned(type.size() * domain_size, type.alignment(), __func__), - domain_size}}; + type, MEM_malloc_arrayN(domain_size, type.size(), __func__), domain_size}}; fn::GField field = validator.validate_field_if_necessary(output_info.field); field_evaluator.add_with_destination(std::move(field), store.data); attributes_to_store.append(store); @@ -868,6 +864,7 @@ bke::GeometrySet execute_geometry_nodes_on_geometry(const bNodeTree &btree, void update_input_properties_from_node_tree(const bNodeTree &tree, const IDProperty *old_properties, + const bool use_bool_for_use_attribute, IDProperty &properties) { tree.ensure_interface_cache(); @@ -882,7 +879,7 @@ void update_input_properties_from_node_tree(const bNodeTree &tree, if (new_prop == nullptr) { /* Out of the set of supported input sockets, only * geometry sockets aren't added to the modifier. */ - BLI_assert(ELEM(socket_type, SOCK_GEOMETRY, SOCK_MATRIX)); + BLI_assert(socket_type == SOCK_GEOMETRY); continue; } @@ -921,7 +918,8 @@ void update_input_properties_from_node_tree(const bNodeTree &tree, const std::string attribute_name_id = socket_identifier + input_attribute_name_suffix(); IDPropertyTemplate idprop = {0}; - IDProperty *use_attribute_prop = IDP_New(IDP_BOOLEAN, &idprop, use_attribute_id.c_str()); + IDProperty *use_attribute_prop = IDP_New( + use_bool_for_use_attribute ? IDP_BOOLEAN : IDP_INT, &idprop, use_attribute_id.c_str()); IDP_AddToGroup(&properties, use_attribute_prop); IDProperty *attribute_prop = IDP_New(IDP_STRING, &idprop, attribute_name_id.c_str()); diff --git a/source/blender/nodes/intern/geometry_nodes_lazy_function.cc b/source/blender/nodes/intern/geometry_nodes_lazy_function.cc index fb88a0d01ee..87e81387e81 100644 --- a/source/blender/nodes/intern/geometry_nodes_lazy_function.cc +++ b/source/blender/nodes/intern/geometry_nodes_lazy_function.cc @@ -330,8 +330,7 @@ class LazyFunctionForGeometryNode : public LazyFunction { if (geo_eval_log::GeoTreeLogger *tree_logger = local_user_data.try_get_tree_logger(*user_data)) { - tree_logger->node_execution_times.append(*tree_logger->allocator, - {node_.identifier, start_time, end_time}); + tree_logger->node_execution_times.append({node_.identifier, start_time, end_time}); } } @@ -1707,7 +1706,6 @@ class LazyFunctionForRepeatZone : public LazyFunction { user_data)) { tree_logger->node_warnings.append( - *tree_logger->allocator, {repeat_output_bnode_.identifier, {NodeWarningType::Info, N_("Inspection index is out of range")}}); } @@ -2006,8 +2004,7 @@ class GeometryNodesLazyFunctionLogger : public lf::GraphExecutor::Logger { if (!bsockets.is_empty()) { const bNodeSocket &bsocket = *bsockets[0]; const bNode &bnode = bsocket.owner_node(); - tree_logger->debug_messages.append(*tree_logger->allocator, - {bnode.identifier, thread_id_str}); + tree_logger->debug_messages.append({bnode.identifier, thread_id_str}); return true; } } diff --git a/source/blender/nodes/intern/geometry_nodes_log.cc b/source/blender/nodes/intern/geometry_nodes_log.cc index 17d6ecad780..25fabb0a00c 100644 --- a/source/blender/nodes/intern/geometry_nodes_log.cc +++ b/source/blender/nodes/intern/geometry_nodes_log.cc @@ -10,6 +10,7 @@ #include "BKE_node_enum.hh" #include "BKE_node_runtime.hh" #include "BKE_node_socket_value.hh" +#include "BKE_viewer_path.hh" #include "DNA_modifier_types.h" #include "DNA_space_types.h" @@ -167,8 +168,7 @@ void GeoTreeLogger::log_value(const bNode &node, const bNodeSocket &socket, cons auto store_logged_value = [&](destruct_ptr value_log) { auto &socket_values = socket.in_out == SOCK_IN ? this->input_socket_values : this->output_socket_values; - socket_values.append(*this->allocator, - {node.identifier, socket.index(), std::move(value_log)}); + socket_values.append({node.identifier, socket.index(), std::move(value_log)}); }; auto log_generic_value = [&](const CPPType &type, const void *value) { @@ -226,7 +226,7 @@ void GeoTreeLogger::log_viewer_node(const bNode &viewer_node, bke::GeometrySet g destruct_ptr log = this->allocator->construct(); log->geometry = std::move(geometry); log->geometry.ensure_owns_direct_data(); - this->viewer_node_logs.append(*this->allocator, {viewer_node.identifier, std::move(log)}); + this->viewer_node_logs.append({viewer_node.identifier, std::move(log)}); } void GeoTreeLog::ensure_node_warnings() diff --git a/source/blender/nodes/intern/node_common.cc b/source/blender/nodes/intern/node_common.cc index 4938695271f..8cb16a2d594 100644 --- a/source/blender/nodes/intern/node_common.cc +++ b/source/blender/nodes/intern/node_common.cc @@ -13,6 +13,7 @@ #include "BLI_listbase.h" #include "BLI_map.hh" +#include "BLI_math_euler.hh" #include "BLI_multi_value_map.hh" #include "BLI_set.hh" #include "BLI_stack.hh" @@ -20,11 +21,14 @@ #include "BLI_string_ref.hh" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_node.hh" #include "BKE_node_runtime.hh" #include "BKE_node_tree_interface.hh" +#include "BKE_node_tree_update.hh" + +#include "RNA_types.hh" #include "MEM_guardedalloc.h" @@ -245,11 +249,6 @@ static SocketDeclarationPtr declaration_for_interface_socket( dst = std::move(decl); break; } - case SOCK_MATRIX: { - std::unique_ptr decl = std::make_unique(); - dst = std::move(decl); - break; - } case SOCK_INT: { const auto &value = node_interface::get_socket_data_as(io_socket); std::unique_ptr decl = std::make_unique(); diff --git a/source/blender/nodes/intern/node_declaration.cc b/source/blender/nodes/intern/node_declaration.cc index b20d67746d2..0d8291cb0b8 100644 --- a/source/blender/nodes/intern/node_declaration.cc +++ b/source/blender/nodes/intern/node_declaration.cc @@ -123,12 +123,6 @@ void NodeDeclarationBuilder::use_custom_socket_order(bool enable) declaration_.use_custom_socket_order = enable; } -void NodeDeclarationBuilder::allow_any_socket_order(bool enable) -{ - BLI_assert(declaration_.use_custom_socket_order); - declaration_.allow_any_socket_order = enable; -} - Span NodeDeclaration::sockets(eNodeSocketInOut in_out) const { if (in_out == SOCK_IN) { @@ -209,7 +203,7 @@ bool NodeDeclaration::is_valid() const if (const SocketDeclaration *socket_decl = dynamic_cast( item_decl.get())) { - if (state.item_type != NODE_INTERFACE_SOCKET && !this->allow_any_socket_order) { + if (state.item_type != NODE_INTERFACE_SOCKET) { std::cout << "Socket added after panel" << std::endl; return false; } @@ -219,7 +213,7 @@ bool NodeDeclaration::is_valid() const /* Start of input sockets. */ state.socket_in_out = SOCK_IN; } - if (socket_decl->in_out != state.socket_in_out && !this->allow_any_socket_order) { + if (socket_decl->in_out != state.socket_in_out) { std::cout << "Output socket added after input socket" << std::endl; return false; } @@ -420,8 +414,6 @@ std::unique_ptr make_declaration_for_socket_type( return std::make_unique(); case SOCK_ROTATION: return std::make_unique(); - case SOCK_MATRIX: - return std::make_unique(); case SOCK_INT: return std::make_unique(); case SOCK_STRING: @@ -457,8 +449,6 @@ BaseSocketDeclarationBuilder &NodeDeclarationBuilder::add_input( return this->add_input(name, identifier); case SOCK_ROTATION: return this->add_input(name, identifier); - case SOCK_MATRIX: - return this->add_input(name, identifier); case SOCK_INT: return this->add_input(name, identifier); case SOCK_STRING: @@ -502,8 +492,6 @@ BaseSocketDeclarationBuilder &NodeDeclarationBuilder::add_output( return this->add_output(name, identifier); case SOCK_ROTATION: return this->add_output(name, identifier); - case SOCK_MATRIX: - return this->add_output(name, identifier); case SOCK_INT: return this->add_output(name, identifier); case SOCK_STRING: @@ -818,17 +806,6 @@ BaseSocketDeclarationBuilder &BaseSocketDeclarationBuilder::make_available( return *this; } -BaseSocketDeclarationBuilder &BaseSocketDeclarationBuilder::align_with_previous(const bool value) -{ - if (decl_in_base_) { - decl_in_base_->align_with_previous_socket = value; - } - if (decl_out_base_) { - decl_out_base_->align_with_previous_socket = value; - } - return *this; -} - OutputFieldDependency OutputFieldDependency::ForFieldSource() { OutputFieldDependency field_dependency; diff --git a/source/blender/nodes/intern/node_exec.cc b/source/blender/nodes/intern/node_exec.cc index a6fae8661da..1bf26ced04b 100644 --- a/source/blender/nodes/intern/node_exec.cc +++ b/source/blender/nodes/intern/node_exec.cc @@ -11,7 +11,8 @@ #include "BLI_listbase.h" #include "BLI_utildefines.h" -#include "BKE_global.hh" +#include "BKE_global.h" +#include "BKE_node.hh" #include "BKE_node_runtime.hh" #include "BKE_node_tree_update.hh" diff --git a/source/blender/nodes/intern/node_geometry_exec.cc b/source/blender/nodes/intern/node_geometry_exec.cc index 8dc034e526d..d452ebcb37f 100644 --- a/source/blender/nodes/intern/node_geometry_exec.cc +++ b/source/blender/nodes/intern/node_geometry_exec.cc @@ -9,7 +9,7 @@ #include "BKE_curves.hh" #include "BKE_type_conversions.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "NOD_geometry_exec.hh" @@ -22,7 +22,6 @@ void GeoNodeExecParams::error_message_add(const NodeWarningType type, { if (geo_eval_log::GeoTreeLogger *tree_logger = this->get_local_tree_logger()) { tree_logger->node_warnings.append( - *tree_logger->allocator, {node_.identifier, {type, tree_logger->allocator->copy_string(message)}}); } } @@ -32,7 +31,6 @@ void GeoNodeExecParams::used_named_attribute(const StringRef attribute_name, { if (geo_eval_log::GeoTreeLogger *tree_logger = this->get_local_tree_logger()) { tree_logger->used_named_attributes.append( - *tree_logger->allocator, {node_.identifier, tree_logger->allocator->copy_string(attribute_name), usage}); } } diff --git a/source/blender/nodes/intern/node_multi_function.cc b/source/blender/nodes/intern/node_multi_function.cc index f74a8a72b25..e9b309cfb63 100644 --- a/source/blender/nodes/intern/node_multi_function.cc +++ b/source/blender/nodes/intern/node_multi_function.cc @@ -4,6 +4,7 @@ #include "NOD_multi_function.hh" +#include "BKE_node.hh" #include "BKE_node_runtime.hh" namespace blender::nodes { diff --git a/source/blender/nodes/intern/node_register.cc b/source/blender/nodes/intern/node_register.cc index 9631ec35696..406ffc34b89 100644 --- a/source/blender/nodes/intern/node_register.cc +++ b/source/blender/nodes/intern/node_register.cc @@ -10,7 +10,11 @@ #include "BKE_node.hh" -#include "BLT_translation.hh" +#include "ED_node.hh" + +#include "BLT_translation.h" + +#include "RNA_access.hh" #include "UI_resources.hh" diff --git a/source/blender/nodes/intern/node_socket.cc b/source/blender/nodes/intern/node_socket.cc index bb54702400a..9f25624c3fd 100644 --- a/source/blender/nodes/intern/node_socket.cc +++ b/source/blender/nodes/intern/node_socket.cc @@ -13,8 +13,6 @@ #include "BLI_color.hh" #include "BLI_listbase.h" #include "BLI_math_euler.hh" -#include "BLI_math_matrix.h" -#include "BLI_math_matrix.hh" #include "BLI_math_quaternion_types.hh" #include "BLI_math_vector.h" #include "BLI_math_vector_types.hh" @@ -32,13 +30,13 @@ #include "DNA_material_types.h" #include "RNA_access.hh" +#include "RNA_types.hh" #include "MEM_guardedalloc.h" #include "NOD_node_declaration.hh" #include "NOD_socket.hh" #include "NOD_socket_declarations.hh" -#include "NOD_socket_declarations_geometry.hh" using namespace blender; using blender::bke::SocketValueVariant; @@ -301,9 +299,6 @@ static std::optional decl_to_data_type(const SocketDeclarat else if (dynamic_cast(&socket_decl)) { return SOCK_ROTATION; } - else if (dynamic_cast(&socket_decl)) { - return SOCK_MATRIX; - } else if (dynamic_cast(&socket_decl)) { return SOCK_STRING; } @@ -325,9 +320,6 @@ static std::optional decl_to_data_type(const SocketDeclarat else if (dynamic_cast(&socket_decl)) { return SOCK_OBJECT; } - else if (dynamic_cast(&socket_decl)) { - return SOCK_GEOMETRY; - } return std::nullopt; } @@ -563,8 +555,7 @@ bool socket_type_supports_fields(const eNodeSocketDatatype socket_type) SOCK_BOOLEAN, SOCK_INT, SOCK_ROTATION, - SOCK_MENU, - SOCK_MATRIX); + SOCK_MENU); } } // namespace blender::nodes @@ -709,7 +700,6 @@ void node_socket_init_default_value_data(eNodeSocketDatatype datatype, int subty case SOCK_CUSTOM: case SOCK_GEOMETRY: - case SOCK_MATRIX: case SOCK_SHADER: break; } @@ -808,7 +798,6 @@ void node_socket_copy_default_value_data(eNodeSocketDatatype datatype, void *to, case SOCK_CUSTOM: case SOCK_GEOMETRY: - case SOCK_MATRIX: case SOCK_SHADER: break; } @@ -990,22 +979,6 @@ static bNodeSocketType *make_socket_type_rotation() return socktype; } -static bNodeSocketType *make_socket_type_matrix() -{ - bNodeSocketType *socktype = make_standard_socket_type(SOCK_MATRIX, PROP_NONE); - socktype->base_cpp_type = &blender::CPPType::get(); - socktype->get_base_cpp_value = [](const void * /*socket_value*/, void *r_value) { - *static_cast(r_value) = float4x4::identity(); - }; - socktype->geometry_nodes_cpp_type = &blender::CPPType::get(); - socktype->get_geometry_nodes_cpp_value = [](const void * /*socket_value*/, void *r_value) { - new (r_value) SocketValueVariant(float4x4::identity()); - }; - static SocketValueVariant default_value{float4x4::identity()}; - socktype->geometry_nodes_default_cpp_value = &default_value; - return socktype; -} - static bNodeSocketType *make_socket_type_float(PropertySubType subtype) { bNodeSocketType *socktype = make_standard_socket_type(SOCK_FLOAT, subtype); @@ -1200,7 +1173,6 @@ void register_standard_node_socket_types() nodeRegisterSocketType(make_socket_type_bool()); nodeRegisterSocketType(make_socket_type_rotation()); - nodeRegisterSocketType(make_socket_type_matrix()); nodeRegisterSocketType(make_socket_type_vector(PROP_NONE)); nodeRegisterSocketType(make_socket_type_vector(PROP_TRANSLATION)); diff --git a/source/blender/nodes/intern/node_socket_declarations.cc b/source/blender/nodes/intern/node_socket_declarations.cc index c04cd4a2405..8c72b107971 100644 --- a/source/blender/nodes/intern/node_socket_declarations.cc +++ b/source/blender/nodes/intern/node_socket_declarations.cc @@ -8,6 +8,7 @@ #include "NOD_socket_declarations_geometry.hh" #include "BKE_lib_id.hh" +#include "BKE_node.hh" #include "BKE_node_runtime.hh" #include "BLI_math_vector.h" @@ -417,9 +418,9 @@ bool Rotation::can_connect(const bNodeSocket &socket) const return false; } if (this->in_out == SOCK_IN) { - return ELEM(socket.type, SOCK_ROTATION, SOCK_FLOAT, SOCK_VECTOR, SOCK_MATRIX); + return ELEM(socket.type, SOCK_ROTATION, SOCK_FLOAT, SOCK_VECTOR); } - return ELEM(socket.type, SOCK_ROTATION, SOCK_VECTOR, SOCK_MATRIX); + return ELEM(socket.type, SOCK_ROTATION, SOCK_VECTOR); } bNodeSocket &Rotation::update_or_build(bNodeTree &ntree, bNode &node, bNodeSocket &socket) const @@ -434,57 +435,6 @@ bNodeSocket &Rotation::update_or_build(bNodeTree &ntree, bNode &node, bNodeSocke /** \} */ -/* -------------------------------------------------------------------- */ -/** \name #Matrix - * \{ */ - -bNodeSocket &Matrix::build(bNodeTree &ntree, bNode &node) const -{ - bNodeSocket &socket = *nodeAddStaticSocket(&ntree, - &node, - this->in_out, - SOCK_MATRIX, - PROP_NONE, - this->identifier.c_str(), - this->name.c_str()); - this->set_common_flags(socket); - return socket; -} - -bool Matrix::matches(const bNodeSocket &socket) const -{ - if (!this->matches_common_data(socket)) { - return false; - } - if (socket.type != SOCK_MATRIX) { - return false; - } - return true; -} - -bool Matrix::can_connect(const bNodeSocket &socket) const -{ - if (!sockets_can_connect(*this, socket)) { - return false; - } - if (this->in_out == SOCK_IN) { - return ELEM(socket.type, SOCK_MATRIX, SOCK_FLOAT, SOCK_VECTOR, SOCK_MATRIX); - } - return ELEM(socket.type, SOCK_MATRIX, SOCK_VECTOR, SOCK_MATRIX); -} - -bNodeSocket &Matrix::update_or_build(bNodeTree &ntree, bNode &node, bNodeSocket &socket) const -{ - if (socket.type != SOCK_MATRIX) { - BLI_assert(socket.in_out == this->in_out); - return this->build(ntree, node); - } - this->set_common_flags(socket); - return socket; -} - -/** \} */ - /* -------------------------------------------------------------------- */ /** \name #String * \{ */ diff --git a/source/blender/nodes/intern/node_util.cc b/source/blender/nodes/intern/node_util.cc index 4782cb65c25..f2d3458b9f0 100644 --- a/source/blender/nodes/intern/node_util.cc +++ b/source/blender/nodes/intern/node_util.cc @@ -17,7 +17,7 @@ #include "BLI_string_utf8.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_colortools.hh" #include "BKE_node.hh" diff --git a/source/blender/nodes/intern/node_zone_socket_items.cc b/source/blender/nodes/intern/node_zone_socket_items.cc index 3891cc90147..970ac272805 100644 --- a/source/blender/nodes/intern/node_zone_socket_items.cc +++ b/source/blender/nodes/intern/node_zone_socket_items.cc @@ -6,6 +6,8 @@ #include "NOD_zone_socket_items.hh" +#include "BKE_node.hh" + #include "BLO_read_write.hh" namespace blender::nodes { diff --git a/source/blender/nodes/intern/socket_search_link.cc b/source/blender/nodes/intern/socket_search_link.cc index 3889682cf5a..9e948d2cfa8 100644 --- a/source/blender/nodes/intern/socket_search_link.cc +++ b/source/blender/nodes/intern/socket_search_link.cc @@ -11,7 +11,7 @@ #include "UI_interface.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "NOD_node_declaration.hh" #include "NOD_socket_search_link.hh" diff --git a/source/blender/nodes/shader/materialx/group_nodes.cc b/source/blender/nodes/shader/materialx/group_nodes.cc index 297e328b50e..81ba769001e 100644 --- a/source/blender/nodes/shader/materialx/group_nodes.cc +++ b/source/blender/nodes/shader/materialx/group_nodes.cc @@ -7,7 +7,7 @@ #include "BLI_vector.hh" -#include "BKE_node.hh" +#include "BKE_node.h" #include "BKE_node_runtime.hh" namespace blender::nodes::materialx { diff --git a/source/blender/nodes/shader/node_shader_tree.cc b/source/blender/nodes/shader/node_shader_tree.cc index 3d0831dc113..a406a334e2b 100644 --- a/source/blender/nodes/shader/node_shader_tree.cc +++ b/source/blender/nodes/shader/node_shader_tree.cc @@ -14,20 +14,20 @@ #include "DNA_node_types.h" #include "DNA_scene_types.h" #include "DNA_space_types.h" +#include "DNA_workspace_types.h" #include "DNA_world_types.h" #include "BLI_array.hh" #include "BLI_linklist.h" #include "BLI_listbase.h" #include "BLI_math_vector.h" -#include "BLI_set.hh" #include "BLI_string.h" #include "BLI_threads.h" #include "BLI_utildefines.h" #include "BLI_vector.hh" #include "BKE_context.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_layer.hh" #include "BKE_lib_id.hh" #include "BKE_linestyle.h" @@ -35,12 +35,18 @@ #include "BKE_node.hh" #include "BKE_node_runtime.hh" #include "BKE_node_tree_update.hh" -#include "BKE_scene.hh" +#include "BKE_scene.h" +#include "RNA_access.hh" #include "RNA_prototypes.h" +#include "GPU_material.hh" + +#include "RE_texture.h" + #include "UI_resources.hh" +#include "NOD_common.h" #include "NOD_shader.h" #include "node_common.h" @@ -574,87 +580,69 @@ static bool ntree_branch_count_and_tag_nodes(bNode *fromnode, bNode *tonode, voi return true; } -/* Create a copy of a branch starting from a given node. */ -static void ntree_shader_copy_branch(bNodeTree *ntree, - bNode *start_node, - bool (*node_filter)(const bNode *node)) +/* Create a copy of a branch starting from a given node. + * callback is executed once for every copied node. + * Returns input node copy. */ +static bNode *ntree_shader_copy_branch(bNodeTree *ntree, + bNode *start_node, + bool (*node_filter)(const bNode *node), + void (*callback)(bNode *node, int user_data), + int user_data) { - auto gather_branch_nodes = [](bNode *fromnode, bNode * /*tonode*/, void *userdata) { - blender::Set *set = static_cast *>(userdata); - set->add(fromnode); - return true; - }; - blender::Set branch_nodes = {start_node}; - blender::bke::nodeChainIterBackwards(ntree, start_node, gather_branch_nodes, &branch_nodes, 0); - /* Initialize `runtime->tmp_flag`. */ LISTBASE_FOREACH (bNode *, node, &ntree->nodes) { node->runtime->tmp_flag = -1; } /* Count and tag all nodes inside the displacement branch of the tree. */ + start_node->runtime->tmp_flag = 0; branchIterData iter_data; iter_data.node_filter = node_filter; - iter_data.node_count = 0; + iter_data.node_count = 1; blender::bke::nodeChainIterBackwards( ntree, start_node, ntree_branch_count_and_tag_nodes, &iter_data, 1); - /* Copies of the non-filtered nodes on the branch. */ + /* Make a full copy of the branch */ Array nodes_copy(iter_data.node_count); - LISTBASE_FOREACH (bNode *, node, &ntree->nodes) { if (node->runtime->tmp_flag >= 0) { int id = node->runtime->tmp_flag; - /* Avoid creating unique names in the new tree, since it is very slow. - * The names on the new nodes will be invalid. */ + /* Avoid creating unique names in the new tree, since it is very slow. The names on the new + * nodes will be invalid. But identifiers must be created for the `bNodeTree::all_nodes()` + * vector, though they won't match the original. */ nodes_copy[id] = blender::bke::node_copy( ntree, *node, LIB_ID_CREATE_NO_USER_REFCOUNT | LIB_ID_CREATE_NO_MAIN, false); - /* But identifiers must be created for the `bNodeTree::all_nodes()` vector, - * so they won't match the original. */ nodeUniqueID(ntree, nodes_copy[id]); - bNode *copy = nodes_copy[id]; - copy->runtime->tmp_flag = -2; /* Copy */ - copy->runtime->original = node->runtime->original; + nodes_copy[id]->runtime->tmp_flag = -2; /* Copy */ + nodes_copy[id]->runtime->original = node->runtime->original; /* Make sure to clear all sockets links as they are invalid. */ - LISTBASE_FOREACH (bNodeSocket *, sock, ©->inputs) { + LISTBASE_FOREACH (bNodeSocket *, sock, &nodes_copy[id]->inputs) { sock->link = nullptr; } - LISTBASE_FOREACH (bNodeSocket *, sock, ©->outputs) { + LISTBASE_FOREACH (bNodeSocket *, sock, &nodes_copy[id]->outputs) { sock->link = nullptr; } } } - - /* Unlink the original nodes from this branch and link the copies. */ - LISTBASE_FOREACH_MUTABLE (bNodeLink *, link, &ntree->links) { - bool from_copy = link->fromnode->runtime->tmp_flag >= 0; - bool to_copy = link->tonode->runtime->tmp_flag >= 0; - if (from_copy && to_copy) { - bNode *from_node = nodes_copy[link->fromnode->runtime->tmp_flag]; - bNode *to_node = nodes_copy[link->tonode->runtime->tmp_flag]; - nodeAddLink(ntree, - from_node, - ntree_shader_node_find_output(from_node, link->fromsock->identifier), - to_node, - ntree_shader_node_find_input(to_node, link->tosock->identifier)); - } - else if (to_copy) { - bNode *to_node = nodes_copy[link->tonode->runtime->tmp_flag]; - nodeAddLink(ntree, - link->fromnode, - link->fromsock, - to_node, - ntree_shader_node_find_input(to_node, link->tosock->identifier)); - } - else if (from_copy && branch_nodes.contains(link->tonode)) { - bNode *from_node = nodes_copy[link->fromnode->runtime->tmp_flag]; - nodeAddLink(ntree, - from_node, - ntree_shader_node_find_output(from_node, link->fromsock->identifier), - link->tonode, - link->tosock); - nodeRemLink(ntree, link); + /* Recreate links between copied nodes AND incoming links to the copied nodes. */ + LISTBASE_FOREACH (bNodeLink *, link, &ntree->links) { + if (link->tonode->runtime->tmp_flag >= 0) { + bool from_node_copied = link->fromnode->runtime->tmp_flag >= 0; + bNode *fromnode = from_node_copied ? nodes_copy[link->fromnode->runtime->tmp_flag] : + link->fromnode; + bNode *tonode = nodes_copy[link->tonode->runtime->tmp_flag]; + bNodeSocket *fromsock = ntree_shader_node_find_output(fromnode, link->fromsock->identifier); + bNodeSocket *tosock = ntree_shader_node_find_input(tonode, link->tosock->identifier); + nodeAddLink(ntree, fromnode, fromsock, tonode, tosock); } } + /* Per node callback. */ + if (callback) { + for (int i = 0; i < iter_data.node_count; i++) { + callback(nodes_copy[i], user_data); + } + } + bNode *start_node_copy = nodes_copy[start_node->runtime->tmp_flag]; + return start_node_copy; } /* Generate emission node to convert regular data to closure sockets. @@ -997,51 +985,47 @@ static bool closure_node_filter(const bNode *node) } } -/* Shader to rgba needs their associated closure duplicated and the weight tree generated for. */ -static void ntree_shader_shader_to_rgba_branches(bNodeTree *ntree) +static bool shader_to_rgba_node_gather(bNode * /*fromnode*/, bNode *tonode, void *userdata) { - Vector shader_to_rgba_nodes; - LISTBASE_FOREACH (bNode *, node, &ntree->nodes) { - if (node->type == SH_NODE_SHADERTORGB) { - shader_to_rgba_nodes.append(node); - } + Vector &shader_to_rgba_nodes = *(Vector *)userdata; + if (tonode->runtime->tmp_flag == -1 && tonode->type == SH_NODE_SHADERTORGB) { + tonode->runtime->tmp_flag = 0; + shader_to_rgba_nodes.append(tonode); } + return true; +} + +/* Shader to rgba needs their associated closure duplicated and the weight tree generated for. */ +static void ntree_shader_shader_to_rgba_branch(bNodeTree *ntree, bNode *output_node) +{ + LISTBASE_FOREACH (bNode *, node, &ntree->nodes) { + node->runtime->tmp_flag = -1; + } + /* First gather the shader_to_rgba nodes linked to the output. This is separate to avoid + * conflicting usage of the `node->runtime->tmp_flag`. */ + Vector shader_to_rgba_nodes; + blender::bke::nodeChainIterBackwards( + ntree, output_node, shader_to_rgba_node_gather, &shader_to_rgba_nodes, 0); for (bNode *shader_to_rgba : shader_to_rgba_nodes) { bNodeSocket *closure_input = ntree_shader_node_input_get(shader_to_rgba, 0); if (closure_input->link == nullptr) { continue; } - ntree_shader_copy_branch(ntree, shader_to_rgba, closure_node_filter); + bNode *start_node = closure_input->link->fromnode; + bNode *start_node_copy = ntree_shader_copy_branch( + ntree, start_node, closure_node_filter, nullptr, 0); + /* Replace node copy link. This assumes that every node possibly connected to the closure input + * has only one output. */ + bNodeSocket *closure_output = ntree_shader_node_output_get(start_node_copy, 0); + nodeRemLink(ntree, closure_input->link); + nodeAddLink(ntree, start_node_copy, closure_output, shader_to_rgba, closure_input); BKE_ntree_update_main_tree(G.main, ntree, nullptr); ntree_shader_weight_tree_invert(ntree, shader_to_rgba); } } -static void iter_shader_to_rgba_depth_count(bNode *node, - int16_t &max_depth, - int16_t depth_level = 0) -{ - if (node->type == SH_NODE_SHADERTORGB) { - depth_level++; - max_depth = std::max(max_depth, depth_level); - } - node->runtime->tmp_flag = std::max(node->runtime->tmp_flag, depth_level); - - LISTBASE_FOREACH (bNodeSocket *, sock, &node->inputs) { - bNodeLink *link = sock->link; - if (link == nullptr) { - continue; - } - if ((link->flag & NODE_LINK_VALID) == 0) { - /* Skip links marked as cyclic. */ - continue; - } - iter_shader_to_rgba_depth_count(link->fromnode, max_depth, depth_level); - } -} - static void shader_node_disconnect_input(bNodeTree *ntree, bNode *node, int index) { bNodeLink *link = ntree_shader_node_input_get(node, index)->link; @@ -1190,32 +1174,16 @@ void ntreeGPUMaterialNodes(bNodeTree *localtree, GPUMaterial *mat) if (valid_tree) { ntree_shader_pruned_unused(localtree, output); if (output != nullptr) { - ntree_shader_shader_to_rgba_branches(localtree); + ntree_shader_shader_to_rgba_branch(localtree, output); ntree_shader_weight_tree_invert(localtree, output); } } exec = ntreeShaderBeginExecTree(localtree); - /* Execute nodes ordered by the number of ShaderToRGB nodes found in their path, - * so all closures can be properly evaluated. */ - int16_t max_depth = 0; - LISTBASE_FOREACH (bNode *, node, &localtree->nodes) { - node->runtime->tmp_flag = -1; - } - if (output != nullptr) { - iter_shader_to_rgba_depth_count(output, max_depth); - } + ntreeExecGPUNodes(exec, mat, output); LISTBASE_FOREACH (bNode *, node, &localtree->nodes) { if (node->type == SH_NODE_OUTPUT_AOV) { - iter_shader_to_rgba_depth_count(node, max_depth); - } - } - for (int depth = max_depth; depth >= 0; depth--) { - ntreeExecGPUNodes(exec, mat, output, &depth); - LISTBASE_FOREACH (bNode *, node, &localtree->nodes) { - if (node->type == SH_NODE_OUTPUT_AOV) { - ntreeExecGPUNodes(exec, mat, node, &depth); - } + ntreeExecGPUNodes(exec, mat, node); } } ntreeShaderEndExecTree(exec); diff --git a/source/blender/nodes/shader/node_shader_util.cc b/source/blender/nodes/shader/node_shader_util.cc index 884406fe1bb..6b13b1de6fe 100644 --- a/source/blender/nodes/shader/node_shader_util.cc +++ b/source/blender/nodes/shader/node_shader_util.cc @@ -305,7 +305,7 @@ bNode *nodeGetActivePaintCanvas(bNodeTree *ntree) } } // namespace blender::bke -void ntreeExecGPUNodes(bNodeTreeExec *exec, GPUMaterial *mat, bNode *output_node, int *depth_level) +void ntreeExecGPUNodes(bNodeTreeExec *exec, GPUMaterial *mat, bNode *output_node) { bNodeExec *nodeexec; bNode *node; @@ -321,10 +321,6 @@ void ntreeExecGPUNodes(bNodeTreeExec *exec, GPUMaterial *mat, bNode *output_node for (n = 0, nodeexec = exec->nodeexec; n < exec->totnodes; n++, nodeexec++) { node = nodeexec->node; - if (depth_level && node->runtime->tmp_flag != *depth_level) { - continue; - } - do_it = false; /* for groups, only execute outputs for edited group */ if (node->typeinfo->nclass == NODE_CLASS_OUTPUT) { @@ -338,7 +334,6 @@ void ntreeExecGPUNodes(bNodeTreeExec *exec, GPUMaterial *mat, bNode *output_node } if (do_it) { - BLI_assert(!depth_level || node->runtime->tmp_flag >= 0); if (node->typeinfo->gpu_fn) { node_get_stack(node, stack, nsin, nsout); gpu_stack_from_data_list(gpuin, &node->inputs, nsin); diff --git a/source/blender/nodes/shader/node_shader_util.hh b/source/blender/nodes/shader/node_shader_util.hh index c53b4f3f834..928caafbe32 100644 --- a/source/blender/nodes/shader/node_shader_util.hh +++ b/source/blender/nodes/shader/node_shader_util.hh @@ -68,14 +68,7 @@ bNodeTreeExec *ntreeShaderBeginExecTree_internal(bNodeExecContext *context, bNodeInstanceKey parent_key); void ntreeShaderEndExecTree_internal(bNodeTreeExec *exec); -/* If depth_level is not null, only nodes where `node->runtime->tmp_flag == depth_level` will be - * executed. This allows finer control over node execution order without modifying the tree - * topology. */ -void ntreeExecGPUNodes(bNodeTreeExec *exec, - GPUMaterial *mat, - bNode *output_node, - int *depth_level = nullptr); - +void ntreeExecGPUNodes(bNodeTreeExec *exec, GPUMaterial *mat, bNode *output_node); void get_XYZ_to_RGB_for_gpu(XYZ_to_RGB *data); bool node_socket_not_zero(const GPUNodeStack &socket); diff --git a/source/blender/nodes/shader/nodes/node_shader_background.cc b/source/blender/nodes/shader/nodes/node_shader_background.cc index acfd462611f..10e92cbb0d5 100644 --- a/source/blender/nodes/shader/nodes/node_shader_background.cc +++ b/source/blender/nodes/shader/nodes/node_shader_background.cc @@ -8,14 +8,8 @@ namespace blender::nodes::node_shader_background_cc { static void node_declare(NodeDeclarationBuilder &b) { - b.add_input("Color") - .default_value({0.8f, 0.8f, 0.8f, 1.0f}) - .description("Color of the emitted light"); - b.add_input("Strength") - .default_value(1.0f) - .min(0.0f) - .max(1000000.0f) - .description("Strength of the emitted light"); + b.add_input("Color").default_value({0.8f, 0.8f, 0.8f, 1.0f}); + b.add_input("Strength").default_value(1.0f).min(0.0f).max(1000000.0f); b.add_input("Weight").unavailable(); b.add_output("Background"); } diff --git a/source/blender/nodes/shader/nodes/node_shader_blackbody.cc b/source/blender/nodes/shader/nodes/node_shader_blackbody.cc index 26c1699a9a7..5719a8d476a 100644 --- a/source/blender/nodes/shader/nodes/node_shader_blackbody.cc +++ b/source/blender/nodes/shader/nodes/node_shader_blackbody.cc @@ -5,6 +5,7 @@ #include "FN_multi_function_builder.hh" #include "NOD_multi_function.hh" #include "node_shader_util.hh" +#include "node_util.hh" #include "BLI_color.hh" #include "IMB_colormanagement.hh" diff --git a/source/blender/nodes/shader/nodes/node_shader_bsdf_principled.cc b/source/blender/nodes/shader/nodes/node_shader_bsdf_principled.cc index 7fb9f097903..1fa63c6fc93 100644 --- a/source/blender/nodes/shader/nodes/node_shader_bsdf_principled.cc +++ b/source/blender/nodes/shader/nodes/node_shader_bsdf_principled.cc @@ -26,42 +26,23 @@ static void node_declare(NodeDeclarationBuilder &b) b.add_output("BSDF"); - b.add_input("Base Color") - .default_value({0.8f, 0.8f, 0.8f, 1.0f}) - .description( - "Color of the material used for diffuse, subsurface, metallic and transmission"); + b.add_input("Base Color").default_value({0.8f, 0.8f, 0.8f, 1.0f}); #define SOCK_BASE_COLOR_ID 0 b.add_input("Metallic") .default_value(0.0f) .min(0.0f) .max(1.0f) - .subtype(PROP_FACTOR) - .description( - "Blends between a dielectric and metallic material model. " - "At 0.0 the material consists of a diffuse or transmissive base layer, " - "with a specular reflection layer on top. A value of 1.0 gives a fully specular " - "reflection tinted with the base color, without diffuse reflection or transmission"); + .subtype(PROP_FACTOR); #define SOCK_METALLIC_ID 1 b.add_input("Roughness") .default_value(0.5f) .min(0.0f) .max(1.0f) - .subtype(PROP_FACTOR) - .description( - "Specifies microfacet roughness of the surface for specular reflection and transmission" - " (0.0 is a perfect mirror reflection, 1.0 is completely rough)"); + .subtype(PROP_FACTOR); #define SOCK_ROUGHNESS_ID 2 - b.add_input("IOR").default_value(1.5f).min(1.0f).max(1000.0f).description( - "Index of Refraction (IOR) for specular reflection and transmission. " - "For most materials, the IOR is between 1.0 (vacuum and air) and 4.0 (germanium). " - "The default value of 1.5 is a good approximation for glass"); + b.add_input("IOR").default_value(1.5f).min(1.0f).max(1000.0f); #define SOCK_IOR_ID 3 - b.add_input("Alpha") - .default_value(1.0f) - .min(0.0f) - .max(1.0f) - .subtype(PROP_FACTOR) - .description("Controls the transparency of the surface, with 1.0 fully opaque"); + b.add_input("Alpha").default_value(1.0f).min(0.0f).max(1.0f).subtype(PROP_FACTOR); #define SOCK_ALPHA_ID 4 b.add_input("Normal").hide_value(); #define SOCK_NORMAL_ID 5 @@ -106,19 +87,14 @@ static void node_declare(NodeDeclarationBuilder &b) .max(3.8f) .subtype(PROP_FACTOR) .short_label("IOR") - .description("Index of Refraction (IOR) used for rays that enter the subsurface component"); + .description("Index of refraction used for rays that enter the subsurface component"); #define SOCK_SUBSURFACE_IOR_ID 10 sss.add_input("Subsurface Anisotropy") .default_value(0.0f) .min(0.0f) .max(1.0f) .subtype(PROP_FACTOR) - .short_label("Anisotropy") - .description( - "Directionality of volume scattering within the subsurface medium. " - "Zero scatters uniformly in all directions, with higher values " - "scattering more strongly forward. For example, skin has been measured " - "to have an anisotropy of 0.8"); + .short_label("Anisotropy"); #define SOCK_SUBSURFACE_ANISOTROPY_ID 11 /* Panel for Specular settings. */ @@ -135,7 +111,7 @@ static void node_declare(NodeDeclarationBuilder &b) .subtype(PROP_FACTOR) .short_label("IOR Level") .description( - "Adjustment to the Index of Refraction (IOR) to increase or decrease specular intensity " + "Adjustment to the IOR to increase or decrease specular intensity " "(0.5 means no adjustment, 0 removes all reflections, 1 doubles them at normal " "incidence)"); #define SOCK_SPECULAR_ID 12 @@ -151,21 +127,15 @@ static void node_declare(NodeDeclarationBuilder &b) .default_value(0.0f) .min(0.0f) .max(1.0f) - .subtype(PROP_FACTOR) - .description( - "Amount of anisotropy for specular reflection. " - "Higher values give elongated highlights along the tangent direction; " - "negative values give highlights shaped perpendicular to the tangent direction"); + .subtype(PROP_FACTOR); #define SOCK_ANISOTROPIC_ID 14 spec.add_input("Anisotropic Rotation") .default_value(0.0f) .min(0.0f) .max(1.0f) - .subtype(PROP_FACTOR) - .description("Rotates the direction of anisotropy, with 1.0 going full circle"); + .subtype(PROP_FACTOR); #define SOCK_ANISOTROPIC_ROTATION_ID 15 - spec.add_input("Tangent").hide_value().description( - "Controls the tangent direction for anisotropy"); + spec.add_input("Tangent").hide_value(); #define SOCK_TANGENT_ID 16 /* Panel for Transmission settings. */ @@ -205,7 +175,7 @@ static void node_declare(NodeDeclarationBuilder &b) .max(4.0f) .short_label("IOR") .description( - "The Index of Refraction (IOR) of the coat layer " + "The index of refraction of the coat layer " "(affects its reflectivity as well as the falloff of coat tinting)"); #define SOCK_COAT_IOR_ID 20 coat.add_input("Coat Tint") @@ -246,17 +216,13 @@ static void node_declare(NodeDeclarationBuilder &b) PanelDeclarationBuilder &emis = b.add_panel("Emission").default_closed(true); emis.add_input("Emission Color") .default_value({1.0f, 1.0f, 1.0f, 1.0f}) - .short_label("Color") - .description("Color of light emission from the surface"); + .short_label("Color"); #define SOCK_EMISSION_ID 26 emis.add_input("Emission Strength") .default_value(0.0) .min(0.0f) .max(1000000.0f) - .short_label("Strength") - .description( - "Strength of the emitted light. A value of 1.0 ensures " - "that the object in the image has the exact same color as the Emission Color"); + .short_label("Strength"); #define SOCK_EMISSION_STRENGTH_ID 27 } diff --git a/source/blender/nodes/shader/nodes/node_shader_bump.cc b/source/blender/nodes/shader/nodes/node_shader_bump.cc index 9aaea4438b0..655ebc9513f 100644 --- a/source/blender/nodes/shader/nodes/node_shader_bump.cc +++ b/source/blender/nodes/shader/nodes/node_shader_bump.cc @@ -21,16 +21,8 @@ static void node_declare(NodeDeclarationBuilder &b) .default_value(1.0f) .min(0.0f) .max(1.0f) - .subtype(PROP_FACTOR) - .description( - "Strength of the bump mapping effect, interpolating between " - "no bump mapping and full bump mapping"); - b.add_input("Distance") - .default_value(1.0f) - .min(0.0f) - .max(1000.0f) - .description( - "Multiplier for the height value to control the overall distance for bump mapping"); + .subtype(PROP_FACTOR); + b.add_input("Distance").default_value(1.0f).min(0.0f).max(1000.0f); b.add_input("Height").default_value(1.0f).min(-1000.0f).max(1000.0f).hide_value(); b.add_input("Normal").min(-1.0f).max(1.0f).hide_value(); b.add_output("Normal"); diff --git a/source/blender/nodes/shader/nodes/node_shader_color_ramp.cc b/source/blender/nodes/shader/nodes/node_shader_color_ramp.cc index d5e8c460eb8..8081aacb7cb 100644 --- a/source/blender/nodes/shader/nodes/node_shader_color_ramp.cc +++ b/source/blender/nodes/shader/nodes/node_shader_color_ramp.cc @@ -12,6 +12,8 @@ #include "BLI_color.hh" +#include "FN_multi_function_builder.hh" + #include "NOD_multi_function.hh" #include "node_shader_util.hh" @@ -22,14 +24,7 @@ namespace blender::nodes::node_shader_color_ramp_cc { static void sh_node_valtorgb_declare(NodeDeclarationBuilder &b) { b.is_function_node(); - b.add_input("Fac") - .default_value(0.5f) - .min(0.0f) - .max(1.0f) - .subtype(PROP_FACTOR) - .description( - "The value used to map onto the color gradient. 0.0 results in the leftmost color, " - "while 1.0 results in the rightmost"); + b.add_input("Fac").default_value(0.5f).min(0.0f).max(1.0f).subtype(PROP_FACTOR); b.add_output("Color"); b.add_output("Alpha"); } diff --git a/source/blender/nodes/shader/nodes/node_shader_mix_shader.cc b/source/blender/nodes/shader/nodes/node_shader_mix_shader.cc index bfdd6699885..f73efb8394a 100644 --- a/source/blender/nodes/shader/nodes/node_shader_mix_shader.cc +++ b/source/blender/nodes/shader/nodes/node_shader_mix_shader.cc @@ -8,14 +8,7 @@ namespace blender::nodes::node_shader_mix_shader_cc { static void node_declare(NodeDeclarationBuilder &b) { - b.add_input("Fac") - .default_value(0.5f) - .min(0.0f) - .max(1.0f) - .subtype(PROP_FACTOR) - .description( - "Blend weight to use for mixing two shaders. " - "At zero it uses the first shader entirely and at one the second shader"); + b.add_input("Fac").default_value(0.5f).min(0.0f).max(1.0f).subtype(PROP_FACTOR); b.add_input("Shader"); b.add_input("Shader", "Shader_001"); b.add_output("Shader"); diff --git a/source/blender/nodes/shader/nodes/node_shader_output_aov.cc b/source/blender/nodes/shader/nodes/node_shader_output_aov.cc index 9e5ad3d7af2..834d39ce8d7 100644 --- a/source/blender/nodes/shader/nodes/node_shader_output_aov.cc +++ b/source/blender/nodes/shader/nodes/node_shader_output_aov.cc @@ -20,7 +20,7 @@ static void node_declare(NodeDeclarationBuilder &b) static void node_shader_buts_output_aov(uiLayout *layout, bContext * /*C*/, PointerRNA *ptr) { - uiItemR(layout, ptr, "aov_name", UI_ITEM_R_SPLIT_EMPTY_NAME, nullptr, ICON_NONE); + uiItemR(layout, ptr, "name", UI_ITEM_R_SPLIT_EMPTY_NAME, nullptr, ICON_NONE); } static void node_shader_init_output_aov(bNodeTree * /*ntree*/, bNode *node) diff --git a/source/blender/nodes/shader/nodes/node_shader_output_material.cc b/source/blender/nodes/shader/nodes/node_shader_output_material.cc index 7e3c0aecaf4..0427c38788f 100644 --- a/source/blender/nodes/shader/nodes/node_shader_output_material.cc +++ b/source/blender/nodes/shader/nodes/node_shader_output_material.cc @@ -4,6 +4,8 @@ #include "node_shader_util.hh" +#include "BKE_scene.h" + namespace blender::nodes::node_shader_output_material_cc { static void node_declare(NodeDeclarationBuilder &b) @@ -11,7 +13,9 @@ static void node_declare(NodeDeclarationBuilder &b) b.add_input("Surface"); b.add_input("Volume").translation_context(BLT_I18NCONTEXT_ID_ID); b.add_input("Displacement").hide_value(); - b.add_input("Thickness").hide_value(); + b.add_input("Thickness") + .hide_value() + .unavailable() /* EEVEE-Next only. Does nothing in 4.1. */; } static int node_shader_gpu_output_material(GPUMaterial *mat, diff --git a/source/blender/nodes/shader/nodes/node_shader_particle_info.cc b/source/blender/nodes/shader/nodes/node_shader_particle_info.cc index 40e3153fd82..eda2183cd96 100644 --- a/source/blender/nodes/shader/nodes/node_shader_particle_info.cc +++ b/source/blender/nodes/shader/nodes/node_shader_particle_info.cc @@ -4,6 +4,8 @@ #include "node_shader_util.hh" +#include "RE_texture.h" + namespace blender::nodes::node_shader_particle_info_cc { static void node_declare(NodeDeclarationBuilder &b) diff --git a/source/blender/nodes/shader/nodes/node_shader_tex_coord.cc b/source/blender/nodes/shader/nodes/node_shader_tex_coord.cc index 841a5997750..17df7d14fa3 100644 --- a/source/blender/nodes/shader/nodes/node_shader_tex_coord.cc +++ b/source/blender/nodes/shader/nodes/node_shader_tex_coord.cc @@ -39,7 +39,7 @@ static int node_shader_gpu_tex_coord(GPUMaterial *mat, /* Use special matrix to let the shader branch to using the render object's matrix. */ float dummy_matrix[4][4]; dummy_matrix[3][3] = 0.0f; - GPUNodeLink *inv_obmat = (ob != nullptr) ? GPU_uniform(&ob->world_to_object()[0][0]) : + GPUNodeLink *inv_obmat = (ob != nullptr) ? GPU_uniform(&ob->world_to_object[0][0]) : GPU_uniform(&dummy_matrix[0][0]); /* Optimization: don't request orco if not needed. */ diff --git a/source/blender/nodes/shader/nodes/node_shader_tex_noise.cc b/source/blender/nodes/shader/nodes/node_shader_tex_noise.cc index a2076dc012b..9cd56d411eb 100644 --- a/source/blender/nodes/shader/nodes/node_shader_tex_noise.cc +++ b/source/blender/nodes/shader/nodes/node_shader_tex_noise.cc @@ -28,45 +28,23 @@ static void sh_node_tex_noise_declare(NodeDeclarationBuilder &b) /* Default to 1 instead of 4, because it is much faster. */ node_storage(node).dimensions = 1; }); - b.add_input("Scale").min(-1000.0f).max(1000.0f).default_value(5.0f).description( - "Scale of the base noise octave"); - b.add_input("Detail").min(0.0f).max(15.0f).default_value(2.0f).description( - "The number of noise octaves. Higher values give more detailed noise but increase render " - "time"); + b.add_input("Scale").min(-1000.0f).max(1000.0f).default_value(5.0f); + b.add_input("Detail").min(0.0f).max(15.0f).default_value(2.0f); b.add_input("Roughness") .min(0.0f) .max(1.0f) .default_value(0.5f) - .subtype(PROP_FACTOR) - .description( - "Blend factor between an octave and its previous one. A value of zero corresponds to " - "zero detail"); + .subtype(PROP_FACTOR); b.add_input("Lacunarity") .min(0.0f) .max(1000.0f) .default_value(2.0f) - .description( - "The difference between the scale of each two consecutive octaves. Larger values " - "corresponds to larger scale for higher octaves"); - b.add_input("Offset") - .min(-1000.0f) - .max(1000.0f) - .default_value(0.0f) - .make_available([](bNode &node) { node_storage(node).type = SHD_NOISE_RIDGED_MULTIFRACTAL; }) - .description( - "An added offset to each octave, determines the level where the highest octave will " - "appear"); - b.add_input("Gain") - .min(0.0f) - .max(1000.0f) - .default_value(1.0f) - .make_available([](bNode &node) { node_storage(node).type = SHD_NOISE_RIDGED_MULTIFRACTAL; }) - .description("An extra multiplier to tune the magnitude of octaves"); - b.add_input("Distortion") - .min(-1000.0f) - .max(1000.0f) - .default_value(0.0f) - .description("Amount of distortion"); + .description("The scale of a Perlin noise octave relative to that of the previous octave"); + b.add_input("Offset").min(-1000.0f).max(1000.0f).default_value(0.0f).make_available( + [](bNode &node) { node_storage(node).type = SHD_NOISE_RIDGED_MULTIFRACTAL; }); + b.add_input("Gain").min(0.0f).max(1000.0f).default_value(1.0f).make_available( + [](bNode &node) { node_storage(node).type = SHD_NOISE_RIDGED_MULTIFRACTAL; }); + b.add_input("Distortion").min(-1000.0f).max(1000.0f).default_value(0.0f); b.add_output("Fac").no_muted_links(); b.add_output("Color").no_muted_links(); } diff --git a/source/blender/nodes/shader/nodes/node_shader_tex_sky.cc b/source/blender/nodes/shader/nodes/node_shader_tex_sky.cc index 2e308b0de1f..159ce3747b4 100644 --- a/source/blender/nodes/shader/nodes/node_shader_tex_sky.cc +++ b/source/blender/nodes/shader/nodes/node_shader_tex_sky.cc @@ -10,7 +10,7 @@ #include "BLI_task.hh" #include "BKE_context.hh" -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "BKE_texture.h" #include "RNA_access.hh" diff --git a/source/blender/nodes/shader/nodes/node_shader_wireframe.cc b/source/blender/nodes/shader/nodes/node_shader_wireframe.cc index 7d2a762fb08..1b7b475752a 100644 --- a/source/blender/nodes/shader/nodes/node_shader_wireframe.cc +++ b/source/blender/nodes/shader/nodes/node_shader_wireframe.cc @@ -4,7 +4,7 @@ #include "node_shader_util.hh" -#include "BKE_node.hh" +#include "BKE_node.h" #include "GPU_material.hh" diff --git a/source/blender/nodes/texture/node_texture_tree.cc b/source/blender/nodes/texture/node_texture_tree.cc index b05d5f2d4d5..da0f618f17b 100644 --- a/source/blender/nodes/texture/node_texture_tree.cc +++ b/source/blender/nodes/texture/node_texture_tree.cc @@ -31,8 +31,13 @@ #include "node_texture_util.hh" #include "node_util.hh" +#include "DEG_depsgraph.hh" + +#include "RNA_access.hh" #include "RNA_prototypes.h" +#include "RE_texture.h" + #include "UI_resources.hh" static void texture_get_from_context( diff --git a/source/blender/nodes/texture/node_texture_util.cc b/source/blender/nodes/texture/node_texture_util.cc index 958f7cf1a05..351d9870a9f 100644 --- a/source/blender/nodes/texture/node_texture_util.cc +++ b/source/blender/nodes/texture/node_texture_util.cc @@ -18,7 +18,7 @@ * comments: (ton) * * This system needs recode, a node system should rely on the stack, and - * callbacks for nodes only should evaluate their own node, not recursively go + * callbacks for nodes only should evaluate own node, not recursively go * over other previous ones. */ diff --git a/source/blender/nodes/texture/node_texture_util.hh b/source/blender/nodes/texture/node_texture_util.hh index a77965af4d3..4d8c5b98bc6 100644 --- a/source/blender/nodes/texture/node_texture_util.hh +++ b/source/blender/nodes/texture/node_texture_util.hh @@ -12,7 +12,7 @@ #include "node_texture_register.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "RE_texture.h" diff --git a/source/blender/nodes/texture/nodes/node_texture_at.cc b/source/blender/nodes/texture/nodes/node_texture_at.cc index 664a1f875d6..ca4f9f1c14f 100644 --- a/source/blender/nodes/texture/nodes/node_texture_at.cc +++ b/source/blender/nodes/texture/nodes/node_texture_at.cc @@ -6,6 +6,7 @@ * \ingroup texnodes */ +#include "NOD_texture.h" #include "node_texture_util.hh" static bNodeSocketTemplate inputs[] = { diff --git a/source/blender/nodes/texture/nodes/node_texture_bricks.cc b/source/blender/nodes/texture/nodes/node_texture_bricks.cc index 15511aa9a05..350c2e1332c 100644 --- a/source/blender/nodes/texture/nodes/node_texture_bricks.cc +++ b/source/blender/nodes/texture/nodes/node_texture_bricks.cc @@ -9,6 +9,7 @@ #include "BKE_material.h" #include "BLI_math_vector.h" #include "DNA_material_types.h" +#include "NOD_texture.h" #include "node_texture_util.hh" #include diff --git a/source/blender/nodes/texture/nodes/node_texture_checker.cc b/source/blender/nodes/texture/nodes/node_texture_checker.cc index 028f931c7b9..3c49ce3d654 100644 --- a/source/blender/nodes/texture/nodes/node_texture_checker.cc +++ b/source/blender/nodes/texture/nodes/node_texture_checker.cc @@ -6,6 +6,7 @@ * \ingroup texnodes */ +#include "NOD_texture.h" #include "node_texture_util.hh" #include diff --git a/source/blender/nodes/texture/nodes/node_texture_compose.cc b/source/blender/nodes/texture/nodes/node_texture_compose.cc index 9966c3d640b..f52148b858a 100644 --- a/source/blender/nodes/texture/nodes/node_texture_compose.cc +++ b/source/blender/nodes/texture/nodes/node_texture_compose.cc @@ -6,6 +6,7 @@ * \ingroup texnodes */ +#include "NOD_texture.h" #include "node_texture_util.hh" static bNodeSocketTemplate inputs[] = { diff --git a/source/blender/nodes/texture/nodes/node_texture_coord.cc b/source/blender/nodes/texture/nodes/node_texture_coord.cc index 85b21222c59..48fff37d107 100644 --- a/source/blender/nodes/texture/nodes/node_texture_coord.cc +++ b/source/blender/nodes/texture/nodes/node_texture_coord.cc @@ -7,6 +7,7 @@ */ #include "BLI_math_vector.h" +#include "NOD_texture.h" #include "node_texture_util.hh" static bNodeSocketTemplate outputs[] = { diff --git a/source/blender/nodes/texture/nodes/node_texture_curves.cc b/source/blender/nodes/texture/nodes/node_texture_curves.cc index 4cb5f4258d6..d31d2265416 100644 --- a/source/blender/nodes/texture/nodes/node_texture_curves.cc +++ b/source/blender/nodes/texture/nodes/node_texture_curves.cc @@ -9,6 +9,7 @@ #include #include "BKE_colortools.hh" +#include "NOD_texture.h" #include "node_texture_util.hh" #include "node_util.hh" diff --git a/source/blender/nodes/texture/nodes/node_texture_decompose.cc b/source/blender/nodes/texture/nodes/node_texture_decompose.cc index 9ac27c0e5ee..ee34ceba20a 100644 --- a/source/blender/nodes/texture/nodes/node_texture_decompose.cc +++ b/source/blender/nodes/texture/nodes/node_texture_decompose.cc @@ -6,6 +6,7 @@ * \ingroup texnodes */ +#include "NOD_texture.h" #include "node_texture_util.hh" #include diff --git a/source/blender/nodes/texture/nodes/node_texture_distance.cc b/source/blender/nodes/texture/nodes/node_texture_distance.cc index be1a5c83dd3..3afd97c0594 100644 --- a/source/blender/nodes/texture/nodes/node_texture_distance.cc +++ b/source/blender/nodes/texture/nodes/node_texture_distance.cc @@ -7,6 +7,7 @@ */ #include "BLI_math_vector.h" +#include "NOD_texture.h" #include "node_texture_util.hh" #include diff --git a/source/blender/nodes/texture/nodes/node_texture_hueSatVal.cc b/source/blender/nodes/texture/nodes/node_texture_hueSatVal.cc index 250dd5f317e..405f8e6713e 100644 --- a/source/blender/nodes/texture/nodes/node_texture_hueSatVal.cc +++ b/source/blender/nodes/texture/nodes/node_texture_hueSatVal.cc @@ -8,6 +8,7 @@ #include "BLI_math_color.h" #include "BLI_math_vector.h" +#include "NOD_texture.h" #include "node_texture_util.hh" static bNodeSocketTemplate inputs[] = { diff --git a/source/blender/nodes/texture/nodes/node_texture_image.cc b/source/blender/nodes/texture/nodes/node_texture_image.cc index f40dfc8cfa4..ede1c92c501 100644 --- a/source/blender/nodes/texture/nodes/node_texture_image.cc +++ b/source/blender/nodes/texture/nodes/node_texture_image.cc @@ -10,6 +10,7 @@ #include "BLI_math_vector.h" #include "BLI_threads.h" #include "IMB_imbuf.hh" +#include "NOD_texture.h" #include "node_texture_util.hh" #include "node_util.hh" diff --git a/source/blender/nodes/texture/nodes/node_texture_invert.cc b/source/blender/nodes/texture/nodes/node_texture_invert.cc index 5b515cfb06d..8a1e12cff70 100644 --- a/source/blender/nodes/texture/nodes/node_texture_invert.cc +++ b/source/blender/nodes/texture/nodes/node_texture_invert.cc @@ -7,6 +7,7 @@ */ #include "BLI_math_vector.h" +#include "NOD_texture.h" #include "node_texture_util.hh" /* **************** INVERT ******************** */ diff --git a/source/blender/nodes/texture/nodes/node_texture_math.cc b/source/blender/nodes/texture/nodes/node_texture_math.cc index ee9517d415f..3a9992254a6 100644 --- a/source/blender/nodes/texture/nodes/node_texture_math.cc +++ b/source/blender/nodes/texture/nodes/node_texture_math.cc @@ -7,6 +7,7 @@ */ #include "BLI_math_rotation.h" +#include "NOD_texture.h" #include "node_texture_util.hh" #include "node_util.hh" diff --git a/source/blender/nodes/texture/nodes/node_texture_mixRgb.cc b/source/blender/nodes/texture/nodes/node_texture_mixRgb.cc index 13ffeb367df..7c49382caf1 100644 --- a/source/blender/nodes/texture/nodes/node_texture_mixRgb.cc +++ b/source/blender/nodes/texture/nodes/node_texture_mixRgb.cc @@ -6,6 +6,7 @@ * \ingroup texnodes */ +#include "NOD_texture.h" #include "node_texture_util.hh" #include "node_util.hh" diff --git a/source/blender/nodes/texture/nodes/node_texture_output.cc b/source/blender/nodes/texture/nodes/node_texture_output.cc index 3edac7e58b9..3c4c4806ae2 100644 --- a/source/blender/nodes/texture/nodes/node_texture_output.cc +++ b/source/blender/nodes/texture/nodes/node_texture_output.cc @@ -8,6 +8,7 @@ #include "BLI_string.h" +#include "NOD_texture.h" #include "node_texture_util.hh" #include "node_util.hh" diff --git a/source/blender/nodes/texture/nodes/node_texture_proc.cc b/source/blender/nodes/texture/nodes/node_texture_proc.cc index cf447adf189..84bbbb94aca 100644 --- a/source/blender/nodes/texture/nodes/node_texture_proc.cc +++ b/source/blender/nodes/texture/nodes/node_texture_proc.cc @@ -10,6 +10,7 @@ #include "BKE_texture.h" #include "BLI_math_vector.h" #include "DNA_material_types.h" +#include "NOD_texture.h" #include "node_texture_util.hh" #include "node_util.hh" diff --git a/source/blender/nodes/texture/nodes/node_texture_rotate.cc b/source/blender/nodes/texture/nodes/node_texture_rotate.cc index 46dcd973a20..b00218862dd 100644 --- a/source/blender/nodes/texture/nodes/node_texture_rotate.cc +++ b/source/blender/nodes/texture/nodes/node_texture_rotate.cc @@ -10,6 +10,7 @@ #include "BLI_math_vector.h" +#include "NOD_texture.h" #include "node_texture_util.hh" static bNodeSocketTemplate inputs[] = { diff --git a/source/blender/nodes/texture/nodes/node_texture_texture.cc b/source/blender/nodes/texture/nodes/node_texture_texture.cc index 03e3a938e80..be7480400f7 100644 --- a/source/blender/nodes/texture/nodes/node_texture_texture.cc +++ b/source/blender/nodes/texture/nodes/node_texture_texture.cc @@ -6,7 +6,9 @@ * \ingroup texnodes */ +#include "NOD_texture.h" #include "node_texture_util.hh" +#include "node_util.hh" #include "BKE_material.h" #include "BKE_node_runtime.hh" diff --git a/source/blender/nodes/texture/nodes/node_texture_translate.cc b/source/blender/nodes/texture/nodes/node_texture_translate.cc index 37365d8cb1e..6cd130fd7fc 100644 --- a/source/blender/nodes/texture/nodes/node_texture_translate.cc +++ b/source/blender/nodes/texture/nodes/node_texture_translate.cc @@ -6,6 +6,7 @@ * \ingroup texnodes */ +#include "NOD_texture.h" #include "node_texture_util.hh" #include diff --git a/source/blender/nodes/texture/nodes/node_texture_valToNor.cc b/source/blender/nodes/texture/nodes/node_texture_valToNor.cc index 9ac411af933..0887b7529f2 100644 --- a/source/blender/nodes/texture/nodes/node_texture_valToNor.cc +++ b/source/blender/nodes/texture/nodes/node_texture_valToNor.cc @@ -6,6 +6,7 @@ * \ingroup texnodes */ +#include "NOD_texture.h" #include "node_texture_util.hh" static bNodeSocketTemplate inputs[] = { diff --git a/source/blender/nodes/texture/nodes/node_texture_valToRgb.cc b/source/blender/nodes/texture/nodes/node_texture_valToRgb.cc index a6ac96fdfbd..30e28543bb4 100644 --- a/source/blender/nodes/texture/nodes/node_texture_valToRgb.cc +++ b/source/blender/nodes/texture/nodes/node_texture_valToRgb.cc @@ -8,6 +8,7 @@ #include "BKE_colorband.hh" #include "IMB_colormanagement.hh" +#include "NOD_texture.h" #include "node_texture_util.hh" #include "node_util.hh" diff --git a/source/blender/nodes/texture/nodes/node_texture_viewer.cc b/source/blender/nodes/texture/nodes/node_texture_viewer.cc index b4e3f2f32f5..56e73741311 100644 --- a/source/blender/nodes/texture/nodes/node_texture_viewer.cc +++ b/source/blender/nodes/texture/nodes/node_texture_viewer.cc @@ -6,6 +6,7 @@ * \ingroup texnodes */ +#include "NOD_texture.h" #include "node_texture_util.hh" #include diff --git a/source/blender/python/bmesh/bmesh_py_types.cc b/source/blender/python/bmesh/bmesh_py_types.cc index 8b43eda05b8..57c3fea6c19 100644 --- a/source/blender/python/bmesh/bmesh_py_types.cc +++ b/source/blender/python/bmesh/bmesh_py_types.cc @@ -18,7 +18,7 @@ #include "DNA_object_types.h" #include "BKE_customdata.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_lib_id.hh" #include "BKE_mesh.hh" #include "BKE_mesh_runtime.hh" @@ -1266,7 +1266,7 @@ static PyObject *bpy_bmesh_from_object(BPy_BMesh *self, PyObject *args, PyObject Object *ob, *ob_eval; Depsgraph *depsgraph; Scene *scene_eval; - const Mesh *mesh_eval; + const Mesh *me_eval; BMesh *bm; bool use_cage = false; bool use_fnorm = true; @@ -1313,19 +1313,19 @@ static PyObject *bpy_bmesh_from_object(BPy_BMesh *self, PyObject *args, PyObject return nullptr; } - mesh_eval = BKE_mesh_new_from_object(depsgraph, ob_eval, true, false); + me_eval = BKE_mesh_new_from_object(depsgraph, ob_eval, true, false); need_free = true; } else { if (use_cage) { - mesh_eval = mesh_get_eval_deform(depsgraph, scene_eval, ob_eval, &data_masks); + me_eval = mesh_get_eval_deform(depsgraph, scene_eval, ob_eval, &data_masks); } else { - mesh_eval = BKE_object_get_evaluated_mesh(ob_eval); + me_eval = BKE_object_get_evaluated_mesh(ob_eval); } } - if (mesh_eval == nullptr) { + if (me_eval == nullptr) { PyErr_Format(PyExc_ValueError, "from_object(...): Object '%s' has no usable mesh data", ob->id.name + 2); @@ -1337,10 +1337,10 @@ static PyObject *bpy_bmesh_from_object(BPy_BMesh *self, PyObject *args, PyObject BMeshFromMeshParams params{}; params.calc_face_normal = use_fnorm; params.calc_vert_normal = use_vert_normal; - BM_mesh_bm_from_me(bm, mesh_eval, ¶ms); + BM_mesh_bm_from_me(bm, me_eval, ¶ms); if (need_free) { - BKE_id_free(nullptr, (Mesh *)mesh_eval); + BKE_id_free(nullptr, (Mesh *)me_eval); } Py_RETURN_NONE; diff --git a/source/blender/python/bmesh/bmesh_py_types_meshdata.cc b/source/blender/python/bmesh/bmesh_py_types_meshdata.cc index 2e16a0eced8..f7e1e114f83 100644 --- a/source/blender/python/bmesh/bmesh_py_types_meshdata.cc +++ b/source/blender/python/bmesh/bmesh_py_types_meshdata.cc @@ -22,6 +22,7 @@ #include "../mathutils/mathutils.h" #include "DNA_meshdata_types.h" +#include "DNA_object_types.h" #include "BKE_customdata.hh" diff --git a/source/blender/python/bmesh/bmesh_py_types_select.cc b/source/blender/python/bmesh/bmesh_py_types_select.cc index df4ac8fe2cd..cea2048135f 100644 --- a/source/blender/python/bmesh/bmesh_py_types_select.cc +++ b/source/blender/python/bmesh/bmesh_py_types_select.cc @@ -22,6 +22,7 @@ #include "bmesh_py_types.h" #include "bmesh_py_types_select.h" +#include "../generic/py_capi_utils.h" #include "../generic/python_utildefines.h" PyDoc_STRVAR( diff --git a/source/blender/python/generic/bgl.cc b/source/blender/python/generic/bgl.cc index b3b5be7af8c..fb3e214e19b 100644 --- a/source/blender/python/generic/bgl.cc +++ b/source/blender/python/generic/bgl.cc @@ -24,7 +24,7 @@ #include "py_capi_utils.h" -#include "BKE_global.hh" +#include "BKE_global.h" #include "../generic/py_capi_utils.h" diff --git a/source/blender/python/generic/bl_math_py_api.cc b/source/blender/python/generic/bl_math_py_api.cc index f208b02a3ab..6a2556e231e 100644 --- a/source/blender/python/generic/bl_math_py_api.cc +++ b/source/blender/python/generic/bl_math_py_api.cc @@ -13,6 +13,8 @@ #include "BLI_utildefines.h" +#include "py_capi_utils.h" + #include "bl_math_py_api.h" /* -------------------------------------------------------------------- */ diff --git a/source/blender/python/generic/bpy_threads.cc b/source/blender/python/generic/bpy_threads.cc index 031079834e6..118244d7f37 100644 --- a/source/blender/python/generic/bpy_threads.cc +++ b/source/blender/python/generic/bpy_threads.cc @@ -12,6 +12,7 @@ #include #include "../BPY_extern.h" +#include "BLI_utildefines.h" BPy_ThreadStatePtr BPY_thread_save() { diff --git a/source/blender/python/gpu/gpu_py_batch.cc b/source/blender/python/gpu/gpu_py_batch.cc index c45fc7f9d90..98e1bf62e4a 100644 --- a/source/blender/python/gpu/gpu_py_batch.cc +++ b/source/blender/python/gpu/gpu_py_batch.cc @@ -181,19 +181,6 @@ PyDoc_STRVAR( " :type program: :class:`gpu.types.GPUShader`\n"); static PyObject *pygpu_batch_program_set(BPyGPUBatch *self, BPyGPUShader *py_shader) { - - static bool deprecation_warning_issued = false; - - /* Deprecation warning raised when calling `gpu.types.GPUBatch.program_set`. */ - if (!deprecation_warning_issued) { - PyErr_WarnEx(PyExc_DeprecationWarning, - "Calls to GPUBatch.program_set are deprecated." - "Please set the shader via the 'program' parameter when calling " - "GPUBatch.draw/draw_instanced/draw_range.", - 1); - deprecation_warning_issued = true; - } - if (!BPyGPUShader_Check(py_shader)) { PyErr_Format(PyExc_TypeError, "Expected a GPUShader, got %s", Py_TYPE(py_shader)->tp_name); return nullptr; @@ -235,25 +222,12 @@ PyDoc_STRVAR( " :type program: :class:`gpu.types.GPUShader`\n"); static PyObject *pygpu_batch_draw(BPyGPUBatch *self, PyObject *args) { - static bool deprecation_warning_issued = false; - BPyGPUShader *py_program = nullptr; if (!PyArg_ParseTuple(args, "|O!:GPUBatch.draw", &BPyGPUShader_Type, &py_program)) { return nullptr; } if (py_program == nullptr) { - - if (!deprecation_warning_issued) { - /* Deprecation warning raised when calling gpu.types.GPUBatch.draw without a valid GPUShader. - */ - PyErr_WarnEx(PyExc_DeprecationWarning, - "Calling GPUBatch.draw without specifying a program is deprecated. " - "Please provide a valid GPUShader as the 'program' parameter.", - 1); - deprecation_warning_issued = true; - } - if (!pygpu_batch_is_program_or_error(self)) { return nullptr; } diff --git a/source/blender/python/gpu/gpu_py_capabilities.cc b/source/blender/python/gpu/gpu_py_capabilities.cc index 243a1efa274..c0d4aa9c5b2 100644 --- a/source/blender/python/gpu/gpu_py_capabilities.cc +++ b/source/blender/python/gpu/gpu_py_capabilities.cc @@ -111,20 +111,6 @@ static PyObject *pygpu_max_textures_frag_get(PyObject * /*self*/) return PyLong_FromLong(GPU_max_textures_frag()); } -PyDoc_STRVAR( - /* Wrap. */ - pygpu_max_images_get_doc, - ".. function:: max_images_get()\n" - "\n" - " Get maximum supported number of image units.\n" - "\n" - " :return: Number of image units.\n" - " :rtype: int\n"); -static PyObject *pygpu_max_images_get(PyObject * /*self*/) -{ - return PyLong_FromLong(GPU_max_images()); -} - PyDoc_STRVAR( /* Wrap. */ pygpu_max_uniforms_vert_get_doc, @@ -359,7 +345,6 @@ static PyMethodDef pygpu_capabilities__tp_methods[] = { (PyCFunction)pygpu_max_textures_frag_get, METH_NOARGS, pygpu_max_textures_frag_get_doc}, - {"max_images_get", (PyCFunction)pygpu_max_images_get, METH_NOARGS, pygpu_max_images_get_doc}, {"max_uniforms_vert_get", (PyCFunction)pygpu_max_uniforms_vert_get, METH_NOARGS, diff --git a/source/blender/python/gpu/gpu_py_compute.cc b/source/blender/python/gpu/gpu_py_compute.cc index 6c7d7914d09..62662242485 100644 --- a/source/blender/python/gpu/gpu_py_compute.cc +++ b/source/blender/python/gpu/gpu_py_compute.cc @@ -15,13 +15,23 @@ #include "GPU_capabilities.h" #include "GPU_compute.h" +#include "GPU_shader.h" #include "GPU_state.h" +#include "GPU_texture.h" +#include "GPU_uniform_buffer.h" +#include "../generic/py_capi_utils.h" #include "../generic/python_compat.h" +#include "../generic/python_utildefines.h" + +#include "../mathutils/mathutils.h" #include "gpu_py.h" #include "gpu_py_compute.h" /* own include */ #include "gpu_py_shader.h" +#include "gpu_py_texture.h" +#include "gpu_py_uniformbuffer.h" +#include "gpu_py_vertex_format.h" PyDoc_STRVAR( /* Wrap. */ diff --git a/source/blender/python/gpu/gpu_py_element.cc b/source/blender/python/gpu/gpu_py_element.cc index 3ef5cae0506..4e19649e544 100644 --- a/source/blender/python/gpu/gpu_py_element.cc +++ b/source/blender/python/gpu/gpu_py_element.cc @@ -17,6 +17,7 @@ #include "../generic/py_capi_utils.h" #include "../generic/python_compat.h" +#include "../generic/python_utildefines.h" #include "gpu_py.h" #include "gpu_py_element.h" /* own include */ diff --git a/source/blender/python/gpu/gpu_py_offscreen.cc b/source/blender/python/gpu/gpu_py_offscreen.cc index b2614a9a072..6094a5edde7 100644 --- a/source/blender/python/gpu/gpu_py_offscreen.cc +++ b/source/blender/python/gpu/gpu_py_offscreen.cc @@ -17,10 +17,12 @@ #include "BLI_string.h" #include "BLI_utildefines.h" -#include "BKE_global.hh" -#include "BKE_lib_id.hh" /* For #BKE_id_is_in_global_main. */ -#include "BKE_scene.hh" +#include "BKE_global.h" +#include "BKE_lib_id.hh" +#include "BKE_scene.h" +#include "DNA_scene_types.h" +#include "DNA_screen_types.h" #include "DNA_view3d_types.h" #include "GPU_context.h" @@ -35,6 +37,7 @@ #include "../generic/py_capi_utils.h" #include "../generic/python_compat.h" +#include "gpu_py.h" #include "gpu_py_texture.h" #include "gpu_py_offscreen.h" /* own include */ diff --git a/source/blender/python/gpu/gpu_py_shader.cc b/source/blender/python/gpu/gpu_py_shader.cc index 753cdb8df7a..915cf5219c8 100644 --- a/source/blender/python/gpu/gpu_py_shader.cc +++ b/source/blender/python/gpu/gpu_py_shader.cc @@ -15,7 +15,7 @@ #include "GPU_shader.h" #include "GPU_texture.h" -#include "GPU_uniform_buffer.hh" +#include "GPU_uniform_buffer.h" #include "../generic/py_capi_utils.h" #include "../generic/python_compat.h" diff --git a/source/blender/python/gpu/gpu_py_types.cc b/source/blender/python/gpu/gpu_py_types.cc index c1a7ddb4e1c..7860a796be7 100644 --- a/source/blender/python/gpu/gpu_py_types.cc +++ b/source/blender/python/gpu/gpu_py_types.cc @@ -11,6 +11,8 @@ #include +#include "../generic/py_capi_utils.h" + #include "gpu_py.h" #include "gpu_py_types.h" /* own include */ diff --git a/source/blender/python/gpu/gpu_py_uniformbuffer.cc b/source/blender/python/gpu/gpu_py_uniformbuffer.cc index 695d35bf803..e683be6778b 100644 --- a/source/blender/python/gpu/gpu_py_uniformbuffer.cc +++ b/source/blender/python/gpu/gpu_py_uniformbuffer.cc @@ -16,10 +16,13 @@ #include "BLI_string.h" #include "GPU_context.h" -#include "GPU_uniform_buffer.hh" +#include "GPU_uniform_buffer.h" +#include "../generic/py_capi_utils.h" #include "../generic/python_compat.h" +#include "gpu_py.h" + #include "gpu_py_uniformbuffer.h" /* own include */ /* -------------------------------------------------------------------- */ diff --git a/source/blender/python/gpu/gpu_py_vertex_format.cc b/source/blender/python/gpu/gpu_py_vertex_format.cc index c6f204f5a72..53d6b27e4de 100644 --- a/source/blender/python/gpu/gpu_py_vertex_format.cc +++ b/source/blender/python/gpu/gpu_py_vertex_format.cc @@ -13,6 +13,7 @@ #include "../generic/py_capi_utils.h" #include "../generic/python_compat.h" +#include "../generic/python_utildefines.h" #include "gpu_py_vertex_format.h" /* own include */ diff --git a/source/blender/python/intern/CMakeLists.txt b/source/blender/python/intern/CMakeLists.txt index 69795ea86f7..84b16de91a4 100644 --- a/source/blender/python/intern/CMakeLists.txt +++ b/source/blender/python/intern/CMakeLists.txt @@ -40,7 +40,6 @@ set(SRC bpy_app_translations.cc bpy_app_usd.cc bpy_capi_utils.cc - bpy_cli_command.cc bpy_driver.cc bpy_gizmo_wrap.cc bpy_interface.cc @@ -88,7 +87,6 @@ set(SRC bpy_app_translations.h bpy_app_usd.h bpy_capi_utils.h - bpy_cli_command.h bpy_driver.h bpy_gizmo_wrap.h bpy_intern_string.h @@ -182,6 +180,10 @@ if(WITH_BULLET) add_definitions(-DWITH_BULLET) endif() +if(WITH_CODEC_AVI) + add_definitions(-DWITH_AVI) +endif() + if(WITH_CODEC_FFMPEG) list(APPEND INC_SYS ${FFMPEG_INCLUDE_DIRS} diff --git a/source/blender/python/intern/bpy.cc b/source/blender/python/intern/bpy.cc index 6731827fdfa..aa0d505148d 100644 --- a/source/blender/python/intern/bpy.cc +++ b/source/blender/python/intern/bpy.cc @@ -21,12 +21,13 @@ #include "BKE_appdir.hh" #include "BKE_blender_version.h" -#include "BKE_bpath.hh" -#include "BKE_global.hh" /* XXX, G_MAIN only */ +#include "BKE_bpath.h" +#include "BKE_global.h" /* XXX, G_MAIN only */ #include "RNA_access.hh" #include "RNA_enum_types.hh" #include "RNA_prototypes.h" +#include "RNA_types.hh" #include "GPU_state.h" @@ -34,7 +35,7 @@ #include "bpy.h" #include "bpy_app.h" -#include "bpy_cli_command.h" +#include "bpy_capi_utils.h" #include "bpy_driver.h" #include "bpy_library.h" #include "bpy_operator.h" @@ -42,6 +43,7 @@ #include "bpy_rna.h" #include "bpy_rna_data.h" #include "bpy_rna_gizmo.h" +#include "bpy_rna_id_collection.h" #include "bpy_rna_types_capi.h" #include "bpy_utils_previews.h" #include "bpy_utils_units.h" @@ -76,11 +78,11 @@ static PyObject *bpy_script_paths(PyObject * /*self*/) PyObject *item; std::optional path = BKE_appdir_folder_id(BLENDER_SYSTEM_SCRIPTS, nullptr); - item = PyC_UnicodeFromStdStr(path.value_or("")); + item = PyC_UnicodeFromStdStr(path.has_value() ? path.value() : ""); BLI_assert(item != nullptr); PyTuple_SET_ITEM(ret, 0, item); path = BKE_appdir_folder_id(BLENDER_USER_SCRIPTS, nullptr); - item = PyC_UnicodeFromStdStr(path.value_or("")); + item = PyC_UnicodeFromStdStr(path.has_value() ? path.value() : ""); BLI_assert(item != nullptr); PyTuple_SET_ITEM(ret, 1, item); @@ -256,7 +258,7 @@ static PyObject *bpy_user_resource(PyObject * /*self*/, PyObject *args, PyObject subdir_data.value); Py_XDECREF(subdir_data.value_coerce); - return PyC_UnicodeFromStdStr(path.value_or("")); + return PyC_UnicodeFromStdStr(path.has_value() ? path.value() : ""); } PyDoc_STRVAR( @@ -306,7 +308,7 @@ static PyObject *bpy_system_resource(PyObject * /*self*/, PyObject *args, PyObje std::optional path = BKE_appdir_folder_id(type.value_found, subdir_data.value); Py_XDECREF(subdir_data.value_coerce); - return PyC_UnicodeFromStdStr(path.value_or("")); + return PyC_UnicodeFromStdStr(path.has_value() ? path.value() : ""); } PyDoc_STRVAR( @@ -356,7 +358,7 @@ static PyObject *bpy_resource_path(PyObject * /*self*/, PyObject *args, PyObject const std::optional path = BKE_appdir_resource_path_id_with_version( type.value_found, false, (major * 100) + minor); - return PyC_UnicodeFromStdStr(path.value_or("")); + return PyC_UnicodeFromStdStr(path.has_value() ? path.value() : ""); } /* This is only exposed for tests, see: `tests/python/bl_pyapi_bpy_driver_secure_eval.py`. */ @@ -718,28 +720,27 @@ void BPy_init_modules(bContext *C) /* Register methods and property get/set for RNA types. */ BPY_rna_types_extend_capi(); -#define PYMODULE_ADD_METHOD(mod, meth) \ - PyModule_AddObject(mod, (meth)->ml_name, (PyObject *)PyCFunction_New(meth, nullptr)) - for (int i = 0; bpy_methods[i].ml_name; i++) { PyMethodDef *m = &bpy_methods[i]; /* Currently there is no need to support these. */ BLI_assert((m->ml_flags & (METH_CLASS | METH_STATIC)) == 0); - PYMODULE_ADD_METHOD(mod, m); + PyModule_AddObject(mod, m->ml_name, (PyObject *)PyCFunction_New(m, nullptr)); } /* Register functions (`bpy_rna.cc`). */ - PYMODULE_ADD_METHOD(mod, &meth_bpy_register_class); - PYMODULE_ADD_METHOD(mod, &meth_bpy_unregister_class); + PyModule_AddObject(mod, + meth_bpy_register_class.ml_name, + (PyObject *)PyCFunction_New(&meth_bpy_register_class, nullptr)); + PyModule_AddObject(mod, + meth_bpy_unregister_class.ml_name, + (PyObject *)PyCFunction_New(&meth_bpy_unregister_class, nullptr)); - PYMODULE_ADD_METHOD(mod, &meth_bpy_owner_id_get); - PYMODULE_ADD_METHOD(mod, &meth_bpy_owner_id_set); - - /* Register command functions. */ - PYMODULE_ADD_METHOD(mod, &BPY_cli_command_register_def); - PYMODULE_ADD_METHOD(mod, &BPY_cli_command_unregister_def); - -#undef PYMODULE_ADD_METHOD + PyModule_AddObject(mod, + meth_bpy_owner_id_get.ml_name, + (PyObject *)PyCFunction_New(&meth_bpy_owner_id_get, nullptr)); + PyModule_AddObject(mod, + meth_bpy_owner_id_set.ml_name, + (PyObject *)PyCFunction_New(&meth_bpy_owner_id_set, nullptr)); /* add our own modules dir, this is a python package */ bpy_package_py = bpy_import_test("bpy"); diff --git a/source/blender/python/intern/bpy_app.cc b/source/blender/python/intern/bpy_app.cc index 581062d4a5a..14c6178bd48 100644 --- a/source/blender/python/intern/bpy_app.cc +++ b/source/blender/python/intern/bpy_app.cc @@ -39,7 +39,7 @@ #include "BKE_appdir.hh" #include "BKE_blender_version.h" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_main.hh" #include "DNA_ID.h" diff --git a/source/blender/python/intern/bpy_app_build_options.cc b/source/blender/python/intern/bpy_app_build_options.cc index b451d9a8c05..87aaeada3fa 100644 --- a/source/blender/python/intern/bpy_app_build_options.cc +++ b/source/blender/python/intern/bpy_app_build_options.cc @@ -89,8 +89,11 @@ static PyObject *make_builtopts_info() SetObjIncref(Py_False); #endif - /* AVI */ +#ifdef WITH_AVI + SetObjIncref(Py_True); +#else SetObjIncref(Py_False); +#endif #ifdef WITH_FFMPEG SetObjIncref(Py_True); diff --git a/source/blender/python/intern/bpy_app_handlers.cc b/source/blender/python/intern/bpy_app_handlers.cc index 292573c181d..d44ba399e89 100644 --- a/source/blender/python/intern/bpy_app_handlers.cc +++ b/source/blender/python/intern/bpy_app_handlers.cc @@ -13,9 +13,11 @@ #include "BLI_utildefines.h" #include -#include "BKE_callbacks.hh" +#include "BKE_callbacks.h" #include "RNA_access.hh" +#include "RNA_prototypes.h" +#include "RNA_types.hh" #include "bpy_app_handlers.h" #include "bpy_rna.h" @@ -39,7 +41,7 @@ static PyTypeObject BlenderAppCbType; "the file being loaded, an empty string for the startup-file." /** - * See `BKE_callbacks.hh` #eCbEvent declaration for the policy on naming. + * See `BKE_callbacks.h` #eCbEvent declaration for the policy on naming. */ static PyStructSequence_Field app_cb_info_fields[] = { {"frame_change_pre", @@ -96,7 +98,6 @@ static PyStructSequence_Field app_cb_info_fields[] = { {"_extension_repos_update_post", "on changes to extension repos (after)"}, {"_extension_repos_sync", "on creating or synchronizing the active repository"}, {"_extension_repos_upgrade", "on upgrading the active repository"}, - {"_extension_drop_url", "on dropping a URL"}, /* sets the permanent tag */ #define APP_CB_OTHER_FIELDS 1 diff --git a/source/blender/python/intern/bpy_app_timers.cc b/source/blender/python/intern/bpy_app_timers.cc index 4f2074f0e39..094b563902b 100644 --- a/source/blender/python/intern/bpy_app_timers.cc +++ b/source/blender/python/intern/bpy_app_timers.cc @@ -6,13 +6,18 @@ * \ingroup pythonintern */ +#include "BLI_time.h" #include "BLI_timer.h" +#include "BLI_utildefines.h" #include +#include "BPY_extern.h" #include "bpy_app_timers.h" +#include "../generic/py_capi_utils.h" #include "../generic/python_compat.h" +#include "../generic/python_utildefines.h" static double handle_returned_value(PyObject *function, PyObject *ret) { diff --git a/source/blender/python/intern/bpy_app_translations.cc b/source/blender/python/intern/bpy_app_translations.cc index 958c3c8b33b..b51746b295f 100644 --- a/source/blender/python/intern/bpy_app_translations.cc +++ b/source/blender/python/intern/bpy_app_translations.cc @@ -21,8 +21,8 @@ #include "MEM_guardedalloc.h" -#include "BLT_lang.hh" -#include "BLT_translation.hh" +#include "BLT_lang.h" +#include "BLT_translation.h" #include "RNA_types.hh" @@ -416,7 +416,7 @@ static BLT_i18n_contexts_descriptor _contexts[] = BLT_I18NCONTEXTS_DESC; /* These fields are just empty placeholders, actual values get set in app_translations_struct(). * This allows us to avoid many handwriting, and above all, - * to keep all context definition stuff in BLT_translation.hh! */ + * to keep all context definition stuff in BLT_translation.h! */ static PyStructSequence_Field app_translations_contexts_fields[ARRAY_SIZE(_contexts)] = { {nullptr}}; diff --git a/source/blender/python/intern/bpy_capi_utils.cc b/source/blender/python/intern/bpy_capi_utils.cc index 90934a5e841..46dae3f5bd2 100644 --- a/source/blender/python/intern/bpy_capi_utils.cc +++ b/source/blender/python/intern/bpy_capi_utils.cc @@ -11,6 +11,7 @@ #include +#include "BLI_dynstr.h" #include "BLI_listbase.h" #include "BLI_utildefines.h" @@ -18,7 +19,10 @@ #include "MEM_guardedalloc.h" -#include "BKE_report.hh" +#include "BKE_context.hh" +#include "BKE_report.h" + +#include "BLT_translation.h" #include "../generic/py_capi_utils.h" diff --git a/source/blender/python/intern/bpy_cli_command.cc b/source/blender/python/intern/bpy_cli_command.cc deleted file mode 100644 index 02f7e5960d5..00000000000 --- a/source/blender/python/intern/bpy_cli_command.cc +++ /dev/null @@ -1,315 +0,0 @@ -/* SPDX-FileCopyrightText: 2024 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup pythonintern - * - * Wrap `BKE_command_cli_*` to support custom CLI commands. - */ -#include - -#include "BLI_utildefines.h" - -#include "bpy_capi_utils.h" - -#include "MEM_guardedalloc.h" - -#include "BKE_blender_cli_command.hh" - -#include "../generic/py_capi_utils.h" -#include "../generic/python_compat.h" -#include "../generic/python_utildefines.h" - -#include "bpy_cli_command.h" /* Own include. */ - -static const char *bpy_cli_command_capsule_name = "bpy_cli_command"; -static const char *bpy_cli_command_capsule_name_invalid = "bpy_cli_command"; - -/* -------------------------------------------------------------------- */ -/** \name Internal Utilities - * \{ */ - -/** - * Return a list of strings, compatible with the construction of Python's `sys.argv`. - */ -static PyObject *py_argv_from_bytes(const int argc, const char **argv) -{ - /* Copy functionality from Python's internal `sys.argv` initialization. */ - PyConfig config; - PyConfig_InitPythonConfig(&config); - PyStatus status = PyConfig_SetBytesArgv(&config, argc, (char *const *)argv); - PyObject *py_argv = nullptr; - if (UNLIKELY(PyStatus_Exception(status))) { - PyErr_Format(PyExc_ValueError, "%s", status.err_msg); - } - else { - BLI_assert(argc == config.argv.length); - py_argv = PyList_New(config.argv.length); - for (Py_ssize_t i = 0; i < config.argv.length; i++) { - PyList_SET_ITEM(py_argv, i, PyUnicode_FromWideChar(config.argv.items[i], -1)); - } - } - PyConfig_Clear(&config); - return py_argv; -} - -/** \} */ - -/* -------------------------------------------------------------------- */ -/** \name Internal Implementation - * \{ */ - -static int bpy_cli_command_exec(struct bContext *C, - PyObject *py_exec_fn, - const int argc, - const char **argv) -{ - int exit_code = EXIT_FAILURE; - PyGILState_STATE gilstate; - bpy_context_set(C, &gilstate); - - /* For the most part `sys.argv[-argc:]` is sufficient & less trouble than re-creating this - * list. Don't do this because: - * - Python scripts *could* have manipulated `sys.argv` (although it's bad practice). - * - We may want to support invoking commands directly, - * where the arguments aren't necessarily from `sys.argv`. - */ - bool has_error = false; - PyObject *py_argv = py_argv_from_bytes(argc, argv); - - if (py_argv == nullptr) { - has_error = true; - } - else { - PyObject *exec_args = PyTuple_New(1); - PyTuple_SET_ITEM(exec_args, 0, py_argv); - - PyObject *result = PyObject_Call(py_exec_fn, exec_args, nullptr); - - Py_DECREF(exec_args); /* Frees `py_argv` too. */ - - /* Convert `sys.exit` into a return-value. - * NOTE: typically `sys.exit` *doesn't* need any special handling, - * however it's neater if we use the same code paths for exiting either way. */ - if ((result == nullptr) && PyErr_ExceptionMatches(PyExc_SystemExit)) { - PyObject *error_type, *error_value, *error_traceback; - PyErr_Fetch(&error_type, &error_value, &error_traceback); - if (PyObject_TypeCheck(error_value, (PyTypeObject *)PyExc_SystemExit) && - (((PySystemExitObject *)error_value)->code != nullptr)) - { - /* When `SystemExit(..)` is raised. */ - result = ((PySystemExitObject *)error_value)->code; - } - else { - /* When `sys.exit()` is called. */ - result = error_value; - } - Py_INCREF(result); - PyErr_Restore(error_type, error_value, error_traceback); - PyErr_Clear(); - } - - if (result == nullptr) { - has_error = true; - } - else { - if (!PyLong_Check(result)) { - PyErr_Format(PyExc_TypeError, - "Expected an int return value, not a %.200s", - Py_TYPE(result)->tp_name); - has_error = true; - } - else { - const int exit_code_test = PyC_Long_AsI32(result); - if ((exit_code_test == -1) && PyErr_Occurred()) { - exit_code = EXIT_SUCCESS; - has_error = true; - } - else { - exit_code = exit_code_test; - } - } - Py_DECREF(result); - } - } - - if (has_error) { - PyErr_Print(); - PyErr_Clear(); - } - - bpy_context_clear(C, &gilstate); - - return exit_code; -} - -static void bpy_cli_command_free(PyObject *py_exec_fn) -{ - /* An explicit unregister clears to avoid acquiring a lock. */ - if (py_exec_fn) { - PyGILState_STATE gilstate = PyGILState_Ensure(); - Py_DECREF(py_exec_fn); - PyGILState_Release(gilstate); - } -} - -/** \} */ - -/* -------------------------------------------------------------------- */ -/** \name Internal Class - * \{ */ - -class BPyCommandHandler : public CommandHandler { - public: - BPyCommandHandler(const std::string &id, PyObject *py_exec_fn) - : CommandHandler(id), py_exec_fn(py_exec_fn) - { - } - ~BPyCommandHandler() override - { - bpy_cli_command_free(this->py_exec_fn); - } - - int exec(struct bContext *C, int argc, const char **argv) override - { - return bpy_cli_command_exec(C, this->py_exec_fn, argc, argv); - } - - PyObject *py_exec_fn = nullptr; -}; - -/** \} */ - -/* -------------------------------------------------------------------- */ -/** \name Public Methods - * \{ */ - -PyDoc_STRVAR( - /* Wrap. */ - bpy_cli_command_register_doc, - ".. method:: register_cli_command(id, execute)\n" - "\n" - " Register a command, accessible via the (``-c`` / ``--command``) command-line argument.\n" - "\n" - " :arg id: The command identifier (must pass an ``str.isidentifier`` check).\n" - "\n" - " If the ``id`` is already registered, a warning is printed and " - "the command is inaccessible to prevent accidents invoking the wrong command.\n" - " :type id: str\n" - " :arg execute: Callback, taking a single list of strings and returns an int.\n" - " The arguments are built from all command-line arguments following the command id.\n" - " The return value should be 0 for success, 1 on failure " - "(specific error codes from the ``os`` module can also be used).\n" - " :type execute: callable\n" - " :return: The command handle which can be passed to :func:`unregister_cli_command`.\n" - " :rtype: capsule\n"); -static PyObject *bpy_cli_command_register(PyObject * /*self*/, PyObject *args, PyObject *kw) -{ - PyObject *py_id; - PyObject *py_exec_fn; - - static const char *_keywords[] = { - "id", - "execute", - nullptr, - }; - static _PyArg_Parser _parser = { - PY_ARG_PARSER_HEAD_COMPAT() - "O!" /* `id` */ - "O" /* `execute` */ - ":register_cli_command", - _keywords, - nullptr, - }; - if (!_PyArg_ParseTupleAndKeywordsFast(args, kw, &_parser, &PyUnicode_Type, &py_id, &py_exec_fn)) - { - return nullptr; - } - if (!PyUnicode_IsIdentifier(py_id)) { - PyErr_SetString(PyExc_ValueError, "The command id is not a valid identifier"); - return nullptr; - } - if (!PyCallable_Check(py_exec_fn)) { - PyErr_SetString(PyExc_ValueError, "The execute argument must be callable"); - return nullptr; - } - - const char *id = PyUnicode_AsUTF8(py_id); - - std::unique_ptr cmd_ptr = std::make_unique( - std::string(id), Py_INCREF_RET(py_exec_fn)); - void *cmd_p = cmd_ptr.get(); - - BKE_blender_cli_command_register(std::move(cmd_ptr)); - - return PyCapsule_New(cmd_p, bpy_cli_command_capsule_name, nullptr); -} - -PyDoc_STRVAR( - /* Wrap. */ - bpy_cli_command_unregister_doc, - ".. method:: unregister_cli_command(handle)\n" - "\n" - " Unregister a CLI command.\n" - "\n" - " :arg handle: The return value of :func:`register_cli_command`.\n" - " :type handle: capsule\n"); -static PyObject *bpy_cli_command_unregister(PyObject * /*self*/, PyObject *value) -{ - if (!PyCapsule_CheckExact(value)) { - PyErr_Format(PyExc_TypeError, - "Expected a capsule returned from register_cli_command(...), found a: %.200s", - Py_TYPE(value)->tp_name); - return nullptr; - } - - BPyCommandHandler *cmd = static_cast( - PyCapsule_GetPointer(value, bpy_cli_command_capsule_name)); - if (cmd == nullptr) { - const char *capsule_name = PyCapsule_GetName(value); - if (capsule_name == bpy_cli_command_capsule_name_invalid) { - PyErr_SetString(PyExc_ValueError, "The command has already been removed"); - } - else { - PyErr_Format(PyExc_ValueError, - "Unrecognized capsule ID \"%.200s\"", - capsule_name ? capsule_name : ""); - } - return nullptr; - } - - /* Don't acquire the GIL when un-registering. */ - Py_CLEAR(cmd->py_exec_fn); - - /* Don't allow removing again. */ - PyCapsule_SetName(value, bpy_cli_command_capsule_name_invalid); - - BKE_blender_cli_command_unregister((CommandHandler *)cmd); - - Py_RETURN_NONE; -} - -#if (defined(__GNUC__) && !defined(__clang__)) -# pragma GCC diagnostic push -# pragma GCC diagnostic ignored "-Wcast-function-type" -#endif - -PyMethodDef BPY_cli_command_register_def = { - "register_cli_command", - (PyCFunction)bpy_cli_command_register, - METH_STATIC | METH_VARARGS | METH_KEYWORDS, - bpy_cli_command_register_doc, -}; -PyMethodDef BPY_cli_command_unregister_def = { - "unregister_cli_command", - (PyCFunction)bpy_cli_command_unregister, - METH_STATIC | METH_O, - bpy_cli_command_unregister_doc, -}; - -#if (defined(__GNUC__) && !defined(__clang__)) -# pragma GCC diagnostic pop -#endif - -/** \} */ diff --git a/source/blender/python/intern/bpy_cli_command.h b/source/blender/python/intern/bpy_cli_command.h deleted file mode 100644 index b7dac5ed068..00000000000 --- a/source/blender/python/intern/bpy_cli_command.h +++ /dev/null @@ -1,20 +0,0 @@ -/* SPDX-FileCopyrightText: 2023 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup pythonintern - */ - -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif - -extern PyMethodDef BPY_cli_command_register_def; -extern PyMethodDef BPY_cli_command_unregister_def; - -#ifdef __cplusplus -} -#endif diff --git a/source/blender/python/intern/bpy_driver.cc b/source/blender/python/intern/bpy_driver.cc index 42b4db9e710..55fb2d54c81 100644 --- a/source/blender/python/intern/bpy_driver.cc +++ b/source/blender/python/intern/bpy_driver.cc @@ -20,11 +20,12 @@ #include "BKE_animsys.h" #include "BKE_fcurve_driver.h" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_idtype.hh" #include "RNA_access.hh" #include "RNA_prototypes.h" +#include "RNA_types.hh" #include "bpy_rna_driver.h" /* For #pyrna_driver_get_variable_value. */ @@ -493,7 +494,7 @@ float BPY_driver_exec(PathResolvedRNA *anim_rna, * now release the GIL on python operator execution instead, using * #PyEval_SaveThread() / #PyEval_RestoreThread() so we don't lock up blender. * - * For copy-on-evaluation we always cache expressions and write errors in the + * For copy-on-write we always cache expressions and write errors in the * original driver, otherwise these would get freed while editing. * Due to the GIL this is thread-safe. */ diff --git a/source/blender/python/intern/bpy_gizmo_wrap.cc b/source/blender/python/intern/bpy_gizmo_wrap.cc index a3c0c59f211..6d3c2b69d77 100644 --- a/source/blender/python/intern/bpy_gizmo_wrap.cc +++ b/source/blender/python/intern/bpy_gizmo_wrap.cc @@ -18,6 +18,7 @@ #include "BLI_utildefines.h" +#include "WM_api.hh" #include "WM_types.hh" #include "RNA_access.hh" diff --git a/source/blender/python/intern/bpy_interface.cc b/source/blender/python/intern/bpy_interface.cc index 740f4e5fa4a..415aaacde15 100644 --- a/source/blender/python/intern/bpy_interface.cc +++ b/source/blender/python/intern/bpy_interface.cc @@ -29,7 +29,7 @@ #include "BLI_threads.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "RNA_types.hh" @@ -47,7 +47,7 @@ #include "BKE_appdir.hh" #include "BKE_context.hh" -#include "BKE_global.hh" /* Only for script checking. */ +#include "BKE_global.h" /* Only for script checking. */ #include "BKE_main.hh" #include "BKE_text.h" @@ -128,10 +128,10 @@ void bpy_context_set(bContext *C, PyGILState_STATE *gilstate) #ifdef TIME_PY_RUN if (bpy_timer_count == 0) { /* Record time from the beginning. */ - bpy_timer = BLI_time_now_seconds(); + bpy_timer = BLI_check_seconds_timer(); bpy_timer_run = bpy_timer_run_tot = 0.0; } - bpy_timer_run = BLI_time_now_seconds(); + bpy_timer_run = BLI_check_seconds_timer(); bpy_timer_count++; #endif @@ -157,7 +157,7 @@ void bpy_context_clear(bContext * /*C*/, const PyGILState_STATE *gilstate) #endif #ifdef TIME_PY_RUN - bpy_timer_run_tot += BLI_time_now_seconds() - bpy_timer_run; + bpy_timer_run_tot += BLI_check_seconds_timer() - bpy_timer_run; bpy_timer_count++; #endif } @@ -593,7 +593,7 @@ void BPY_python_end(const bool do_python_exit) #ifdef TIME_PY_RUN /* Measure time since Python started. */ - bpy_timer = BLI_time_now_seconds() - bpy_timer; + bpy_timer = BLI_check_seconds_timer() - bpy_timer; printf("*bpy stats* - "); printf("tot exec: %d, ", bpy_timer_count); diff --git a/source/blender/python/intern/bpy_interface_run.cc b/source/blender/python/intern/bpy_interface_run.cc index 9fe79457411..b74ad667d52 100644 --- a/source/blender/python/intern/bpy_interface_run.cc +++ b/source/blender/python/intern/bpy_interface_run.cc @@ -19,11 +19,12 @@ #include "BKE_context.hh" #include "BKE_main.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "BKE_text.h" #include "DNA_text_types.h" +#include "BPY_extern.h" #include "BPY_extern_run.h" #include "bpy_capi_utils.h" diff --git a/source/blender/python/intern/bpy_library_load.cc b/source/blender/python/intern/bpy_library_load.cc index ec09ade9c4b..db14d2ed321 100644 --- a/source/blender/python/intern/bpy_library_load.cc +++ b/source/blender/python/intern/bpy_library_load.cc @@ -16,6 +16,7 @@ #include #include +#include "BLI_ghash.h" #include "BLI_linklist.h" #include "BLI_path_util.h" #include "BLI_string.h" @@ -26,11 +27,11 @@ #include "BKE_idtype.hh" #include "BKE_lib_id.hh" #include "BKE_main.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "DNA_space_types.h" /* FILE_LINK, FILE_RELPATH */ -#include "BLO_readfile.hh" +#include "BLO_readfile.h" #include "MEM_guardedalloc.h" diff --git a/source/blender/python/intern/bpy_library_write.cc b/source/blender/python/intern/bpy_library_write.cc index 3dfe973fd2a..073bf1d59fb 100644 --- a/source/blender/python/intern/bpy_library_write.cc +++ b/source/blender/python/intern/bpy_library_write.cc @@ -19,16 +19,16 @@ #include "BLI_utildefines.h" #include "BKE_blendfile.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_main.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "BLO_writefile.hh" #include "RNA_types.hh" #include "bpy_capi_utils.h" -#include "bpy_library.h" /* Declaration for #BPY_library_load_method_def */ +#include "bpy_library.h" #include "bpy_rna.h" #include "../generic/py_capi_utils.h" diff --git a/source/blender/python/intern/bpy_msgbus.cc b/source/blender/python/intern/bpy_msgbus.cc index a5677df770b..d4cec2cba1c 100644 --- a/source/blender/python/intern/bpy_msgbus.cc +++ b/source/blender/python/intern/bpy_msgbus.cc @@ -20,11 +20,17 @@ #include "BKE_context.hh" +#include "WM_api.hh" #include "WM_message.hh" +#include "WM_types.hh" #include "RNA_access.hh" +#include "RNA_define.hh" +#include "RNA_enum_types.hh" #include "bpy_capi_utils.h" +#include "bpy_gizmo_wrap.h" /* own include */ +#include "bpy_intern_string.h" #include "bpy_rna.h" #include "bpy_msgbus.h" /* own include */ diff --git a/source/blender/python/intern/bpy_operator.cc b/source/blender/python/intern/bpy_operator.cc index 9bd454477db..4c66122ea06 100644 --- a/source/blender/python/intern/bpy_operator.cc +++ b/source/blender/python/intern/bpy_operator.cc @@ -43,7 +43,7 @@ #include "BLI_ghash.h" #include "BKE_context.hh" -#include "BKE_report.hh" +#include "BKE_report.h" /* so operators called can spawn threads which acquire the GIL */ #define BPY_RELEASE_GIL @@ -226,7 +226,7 @@ static PyObject *pyop_call(PyObject * /*self*/, PyObject *args) if (kw && PyDict_Size(kw)) { error_val = pyrna_pydict_to_props( - &ptr, kw, false, "Converting py args to operator properties:"); + &ptr, kw, false, "Converting py args to operator properties: "); } if (error_val == 0) { @@ -366,7 +366,7 @@ static PyObject *pyop_as_string(PyObject * /*self*/, PyObject *args) if (kw && PyDict_Size(kw)) { error_val = pyrna_pydict_to_props( - &ptr, kw, false, "Converting py args to operator properties:"); + &ptr, kw, false, "Converting py args to operator properties: "); } std::string op_string; diff --git a/source/blender/python/intern/bpy_props.cc b/source/blender/python/intern/bpy_props.cc index ba5974d1a6a..f758051469e 100644 --- a/source/blender/python/intern/bpy_props.cc +++ b/source/blender/python/intern/bpy_props.cc @@ -27,6 +27,8 @@ #include "bpy_props.h" #include "bpy_rna.h" +#include "BKE_idprop.h" + #include "RNA_access.hh" #include "RNA_define.hh" /* for defining our own rna */ #include "RNA_enum_types.hh" @@ -1597,10 +1599,10 @@ static void bpy_prop_string_set_fn(PointerRNA *ptr, PropertyRNA *prop, const cha } } -static bool bpy_prop_string_visit_fn_call( - PyObject *py_func, - PyObject *item, - blender::FunctionRef visit_fn) +static bool bpy_prop_string_visit_fn_call(PyObject *py_func, + PyObject *item, + StringPropertySearchVisitFunc visit_fn, + void *visit_user_data) { const char *text; const char *info = nullptr; @@ -1637,19 +1639,19 @@ static bool bpy_prop_string_visit_fn_call( } } - StringPropertySearchVisitParams visit_params{}; + StringPropertySearchVisitParams visit_params = {nullptr}; visit_params.text = text; - visit_params.info = info ? info : ""; - visit_fn(visit_params); + visit_params.info = info; + visit_fn(visit_user_data, &visit_params); return true; } -static void bpy_prop_string_visit_for_search_fn( - const bContext *C, - PointerRNA *ptr, - PropertyRNA *prop, - const char *edit_text, - blender::FunctionRef visit_fn) +static void bpy_prop_string_visit_for_search_fn(const bContext *C, + PointerRNA *ptr, + PropertyRNA *prop, + const char *edit_text, + StringPropertySearchVisitFunc visit_fn, + void *visit_user_data) { BPyPropStore *prop_store = static_cast(RNA_property_py_data_get(prop)); PyObject *py_func; @@ -1703,7 +1705,8 @@ static void bpy_prop_string_visit_for_search_fn( if (py_text == nullptr) { break; } - const bool ok = bpy_prop_string_visit_fn_call(py_func, py_text, visit_fn); + const bool ok = bpy_prop_string_visit_fn_call( + py_func, py_text, visit_fn, visit_user_data); Py_DECREF(py_text); if (!ok) { break; @@ -1733,7 +1736,8 @@ static void bpy_prop_string_visit_for_search_fn( const Py_ssize_t ret_num = PySequence_Fast_GET_SIZE(ret_fast); PyObject **ret_fast_items = PySequence_Fast_ITEMS(ret_fast); for (Py_ssize_t i = 0; i < ret_num; i++) { - const bool ok = bpy_prop_string_visit_fn_call(py_func, ret_fast_items[i], visit_fn); + const bool ok = bpy_prop_string_visit_fn_call( + py_func, ret_fast_items[i], visit_fn, visit_user_data); if (!ok) { break; } diff --git a/source/blender/python/intern/bpy_rna.cc b/source/blender/python/intern/bpy_rna.cc index edbb87636de..b6c658a52b5 100644 --- a/source/blender/python/intern/bpy_rna.cc +++ b/source/blender/python/intern/bpy_rna.cc @@ -51,14 +51,14 @@ #include "MEM_guardedalloc.h" #include "BKE_context.hh" -#include "BKE_global.hh" /* evil G.* */ +#include "BKE_global.h" /* evil G.* */ #include "BKE_idprop.h" #include "BKE_idtype.hh" #include "BKE_main.hh" -#include "BKE_report.hh" +#include "BKE_report.h" /* Only for types. */ -#include "BKE_node.hh" +#include "BKE_node.h" #include "DEG_depsgraph_query.hh" diff --git a/source/blender/python/intern/bpy_rna_anim.cc b/source/blender/python/intern/bpy_rna_anim.cc index f9f101b019f..9d3e0801b1f 100644 --- a/source/blender/python/intern/bpy_rna_anim.cc +++ b/source/blender/python/intern/bpy_rna_anim.cc @@ -20,18 +20,19 @@ #include "DNA_anim_types.h" #include "DNA_scene_types.h" +#include "ED_keyframes_edit.hh" #include "ED_keyframing.hh" #include "ANIM_keyframing.hh" -#include "BKE_anim_data.hh" +#include "BKE_anim_data.h" #include "BKE_animsys.h" #include "BKE_context.hh" -#include "BKE_fcurve.hh" -#include "BKE_global.hh" +#include "BKE_fcurve.h" +#include "BKE_global.h" #include "BKE_idtype.hh" #include "BKE_lib_id.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "RNA_access.hh" #include "RNA_enum_types.hh" @@ -594,7 +595,7 @@ PyObject *pyrna_struct_driver_add(BPy_StructRNA *self, PyObject *args) bContext *context = BPY_context_get(); WM_event_add_notifier(BPY_context_get(), NC_ANIMATION | ND_FCURVES_ORDER, nullptr); - DEG_id_tag_update(id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(id, ID_RECALC_COPY_ON_WRITE); DEG_relations_tag_update(CTX_data_main(context)); } else { diff --git a/source/blender/python/intern/bpy_rna_data.cc b/source/blender/python/intern/bpy_rna_data.cc index f0b9a68ad32..a6b54efa1b2 100644 --- a/source/blender/python/intern/bpy_rna_data.cc +++ b/source/blender/python/intern/bpy_rna_data.cc @@ -22,7 +22,7 @@ #include "BLI_string.h" #include "BLI_utildefines.h" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_main.hh" #include "RNA_access.hh" diff --git a/source/blender/python/intern/bpy_rna_gizmo.cc b/source/blender/python/intern/bpy_rna_gizmo.cc index 45e354d878a..9a04bf307d8 100644 --- a/source/blender/python/intern/bpy_rna_gizmo.cc +++ b/source/blender/python/intern/bpy_rna_gizmo.cc @@ -16,6 +16,7 @@ #include "BLI_alloca.h" #include "BLI_utildefines.h" +#include "WM_api.hh" #include "WM_types.hh" #include "bpy_capi_utils.h" @@ -23,9 +24,12 @@ #include "../generic/py_capi_utils.h" #include "../generic/python_compat.h" +#include "../generic/python_utildefines.h" #include "RNA_access.hh" +#include "RNA_enum_types.hh" #include "RNA_prototypes.h" +#include "RNA_types.hh" #include "bpy_rna.h" diff --git a/source/blender/python/intern/bpy_rna_id_collection.cc b/source/blender/python/intern/bpy_rna_id_collection.cc index a8051141506..c72e002bdb6 100644 --- a/source/blender/python/intern/bpy_rna_id_collection.cc +++ b/source/blender/python/intern/bpy_rna_id_collection.cc @@ -16,7 +16,7 @@ #include "BLI_bitmap.h" #include "BLI_utildefines.h" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_lib_id.hh" #include "BKE_lib_query.hh" #include "BKE_main.hh" @@ -24,17 +24,23 @@ #include "DNA_ID.h" /* Those following are only to support hack of not listing some internal * 'backward' pointers in generated user_map. */ +#include "DNA_key_types.h" +#include "DNA_object_types.h" #include "WM_api.hh" #include "WM_types.hh" +#include "bpy_capi_utils.h" #include "bpy_rna_id_collection.h" #include "../generic/py_capi_rna.h" #include "../generic/py_capi_utils.h" #include "../generic/python_compat.h" +#include "../generic/python_utildefines.h" +#include "RNA_access.hh" #include "RNA_enum_types.hh" +#include "RNA_types.hh" #include "bpy_rna.h" @@ -377,10 +383,11 @@ static PyObject *bpy_orphans_purge(PyObject * /*self*/, PyObject *args, PyObject Main *bmain = G_MAIN; /* XXX Ugly, but should work! */ #endif - LibQueryUnusedIDsData unused_ids_data; - unused_ids_data.do_local_ids = true; - unused_ids_data.do_linked_ids = true; - unused_ids_data.do_recursive = false; + 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", nullptr}; static _PyArg_Parser _parser = { @@ -397,19 +404,20 @@ static PyObject *bpy_orphans_purge(PyObject * /*self*/, PyObject *args, PyObject kwds, &_parser, PyC_ParseBool, - &unused_ids_data.do_local_ids, + &do_local_ids, PyC_ParseBool, - &unused_ids_data.do_linked_ids, + &do_linked_ids, PyC_ParseBool, - &unused_ids_data.do_recursive)) + &do_recursive_cleanup)) { return nullptr; } /* Tag all IDs to delete. */ - BKE_lib_query_unused_ids_tag(bmain, LIB_TAG_DOIT, unused_ids_data); + BKE_lib_query_unused_ids_tag( + bmain, LIB_TAG_DOIT, do_local_ids, do_linked_ids, do_recursive_cleanup, num_tagged); - if (unused_ids_data.num_total[INDEX_ID_NULL] == 0) { + if (num_tagged[INDEX_ID_NULL] == 0) { return PyLong_FromSize_t(0); } diff --git a/source/blender/python/intern/bpy_rna_operator.cc b/source/blender/python/intern/bpy_rna_operator.cc index 21f5d840666..7f15ea5fc88 100644 --- a/source/blender/python/intern/bpy_rna_operator.cc +++ b/source/blender/python/intern/bpy_rna_operator.cc @@ -19,7 +19,7 @@ #include "BPY_extern.h" #include "bpy_capi_utils.h" -#include "bpy_rna_operator.h" /* Own include, #BPY_rna_operator_poll_message_set_method_def. */ +#include "bpy_rna_operator.h" /* Own include. */ /* -------------------------------------------------------------------- */ /** \name Operator `poll_message_set` Method diff --git a/source/blender/python/intern/bpy_rna_text.cc b/source/blender/python/intern/bpy_rna_text.cc index 6fe476964c8..a7054f557c2 100644 --- a/source/blender/python/intern/bpy_rna_text.cc +++ b/source/blender/python/intern/bpy_rna_text.cc @@ -12,6 +12,8 @@ #include +#include "DNA_text_types.h" + #include "MEM_guardedalloc.h" #include "WM_api.hh" @@ -20,8 +22,9 @@ #include "../generic/python_compat.h" +#include "bpy_capi_utils.h" #include "bpy_rna.h" -#include "bpy_rna_text.h" /* Declare #BPY_rna_region_as_string_method_def. */ +#include "bpy_rna_text.h" /* -------------------------------------------------------------------- */ /** \name Data structures. diff --git a/source/blender/python/intern/bpy_rna_types_capi.cc b/source/blender/python/intern/bpy_rna_types_capi.cc index aab00b8cd70..f68f1427b20 100644 --- a/source/blender/python/intern/bpy_rna_types_capi.cc +++ b/source/blender/python/intern/bpy_rna_types_capi.cc @@ -35,6 +35,7 @@ #include "../generic/py_capi_utils.h" +#include "RNA_access.hh" #include "RNA_prototypes.h" #include "MEM_guardedalloc.h" diff --git a/source/blender/python/intern/bpy_rna_ui.cc b/source/blender/python/intern/bpy_rna_ui.cc index a7579231c4b..6d8f3898840 100644 --- a/source/blender/python/intern/bpy_rna_ui.cc +++ b/source/blender/python/intern/bpy_rna_ui.cc @@ -16,8 +16,10 @@ #include "UI_interface.hh" +#include "RNA_types.hh" + #include "bpy_rna.h" -#include "bpy_rna_ui.h" /* Declare #BPY_rna_uilayout_introspect_method_def. */ +#include "bpy_rna_ui.h" PyDoc_STRVAR( /* Wrap. */ diff --git a/source/blender/python/intern/bpy_utils_previews.cc b/source/blender/python/intern/bpy_utils_previews.cc index 076a2de6b52..61673ae058f 100644 --- a/source/blender/python/intern/bpy_utils_previews.cc +++ b/source/blender/python/intern/bpy_utils_previews.cc @@ -18,7 +18,9 @@ #include "RNA_access.hh" #include "RNA_prototypes.h" +#include "RNA_types.hh" +#include "BPY_extern.h" #include "bpy_rna.h" #include "bpy_utils_previews.h" @@ -26,10 +28,16 @@ #include "MEM_guardedalloc.h" +#include "IMB_imbuf.hh" +#include "IMB_imbuf_types.hh" #include "IMB_thumbs.hh" #include "BKE_preview_image.hh" +#include "DNA_ID.h" + +#include "../generic/python_utildefines.h" + #define STR_SOURCE_TYPES "'IMAGE', 'MOVIE', 'BLEND', 'FONT'" PyDoc_STRVAR( diff --git a/source/blender/python/mathutils/mathutils_bvhtree.cc b/source/blender/python/mathutils/mathutils_bvhtree.cc index 570d50a5df0..c9d8f28afb6 100644 --- a/source/blender/python/mathutils/mathutils_bvhtree.cc +++ b/source/blender/python/mathutils/mathutils_bvhtree.cc @@ -35,6 +35,7 @@ # include "DNA_object_types.h" # include "BKE_customdata.hh" +# include "BKE_editmesh_bvh.h" # include "BKE_lib_id.hh" # include "BKE_mesh.hh" # include "BKE_mesh_runtime.hh" @@ -47,7 +48,7 @@ # include "../bmesh/bmesh_py_types.h" #endif /* MATH_STANDALONE */ -#include "BLI_strict_flags.h" /* Keep last. */ +#include "BLI_strict_flags.h" /* -------------------------------------------------------------------- */ /** \name Documentation String (snippets) diff --git a/source/blender/python/mathutils/mathutils_kdtree.cc b/source/blender/python/mathutils/mathutils_kdtree.cc index 580035341cd..d23bd1548c6 100644 --- a/source/blender/python/mathutils/mathutils_kdtree.cc +++ b/source/blender/python/mathutils/mathutils_kdtree.cc @@ -22,7 +22,7 @@ #include "mathutils.h" #include "mathutils_kdtree.h" /* own include */ -#include "BLI_strict_flags.h" /* Keep last. */ +#include "BLI_strict_flags.h" struct PyKDTree { PyObject_HEAD diff --git a/source/blender/render/CMakeLists.txt b/source/blender/render/CMakeLists.txt index 0439f9b2755..f7b39a0a9f6 100644 --- a/source/blender/render/CMakeLists.txt +++ b/source/blender/render/CMakeLists.txt @@ -8,7 +8,6 @@ set(INC intern ../blenkernel ../blentranslation - ../compositor ../compositor/realtime_compositor ../compositor/realtime_compositor/cached_resources ../draw diff --git a/source/blender/render/RE_bake.h b/source/blender/render/RE_bake.h index 9670ff0d017..47c8810dda2 100644 --- a/source/blender/render/RE_bake.h +++ b/source/blender/render/RE_bake.h @@ -94,8 +94,8 @@ bool RE_bake_pixels_populate_from_objects(struct Mesh *me_low, bool is_custom_cage, float cage_extrusion, float max_ray_distance, - const float mat_low[4][4], - const float mat_cage[4][4], + float mat_low[4][4], + float mat_cage[4][4], struct Mesh *me_cage); void RE_bake_pixels_populate(struct Mesh *mesh, @@ -130,7 +130,7 @@ void RE_bake_normal_world_to_tangent(const BakePixel pixel_array[], float result[], struct Mesh *mesh, const eBakeNormalSwizzle normal_swizzle[3], - const float mat[4][4]); + float mat[4][4]); void RE_bake_normal_world_to_world(const BakePixel pixel_array[], size_t pixels_num, int depth, diff --git a/source/blender/render/RE_pipeline.h b/source/blender/render/RE_pipeline.h index 392d8fe3ce9..2237eb79a07 100644 --- a/source/blender/render/RE_pipeline.h +++ b/source/blender/render/RE_pipeline.h @@ -392,7 +392,7 @@ struct RenderResult *RE_MultilayerConvert( /* Display and event callbacks. */ /** - * Image and movie output has to move to either #ImBuf or kernel. + * Image and movie output has to move to either imbuf or kernel. */ void RE_display_init_cb(struct Render *re, void *handle, diff --git a/source/blender/render/hydra/CMakeLists.txt b/source/blender/render/hydra/CMakeLists.txt index dca5b0c03cb..9b1622f19ad 100644 --- a/source/blender/render/hydra/CMakeLists.txt +++ b/source/blender/render/hydra/CMakeLists.txt @@ -33,11 +33,6 @@ if(WIN32) # warning alert. # Silence them by restore warn C4100 back to w4 remove_cc_flag("/w34100") - if(CMAKE_SYSTEM_PROCESSOR STREQUAL "ARM64") - # USD currently does not support the new preprocessor, - # and does not use sse2neon, so we can remove it here - remove_cc_flag("/Zc:preprocessor") - endif() endif() set(INC diff --git a/source/blender/render/hydra/camera.cc b/source/blender/render/hydra/camera.cc index a62319461b0..0fcf2c88c63 100644 --- a/source/blender/render/hydra/camera.cc +++ b/source/blender/render/hydra/camera.cc @@ -80,7 +80,7 @@ pxr::GfCamera gf_camera(const Object *camera_obj, BKE_camera_params_from_object(¶ms, camera_obj); pxr::GfCamera camera = gf_camera(params, res, border); - camera.SetTransform(io::hydra::gf_matrix_from_transform(camera_obj->object_to_world().ptr())); + camera.SetTransform(io::hydra::gf_matrix_from_transform(camera_obj->object_to_world)); return camera; } diff --git a/source/blender/render/hydra/final_engine.cc b/source/blender/render/hydra/final_engine.cc index 2f5584bf065..13648148df6 100644 --- a/source/blender/render/hydra/final_engine.cc +++ b/source/blender/render/hydra/final_engine.cc @@ -72,7 +72,7 @@ void FinalEngine::render() engine_->Execute(render_index_.get(), &t); char elapsed_time[32]; - double time_begin = BLI_time_now_seconds(); + double time_begin = BLI_check_seconds_timer(); float percent_done = 0.0; while (true) { @@ -82,7 +82,7 @@ void FinalEngine::render() percent_done = renderer_percent_done(); BLI_timecode_string_from_time_simple( - elapsed_time, sizeof(elapsed_time), BLI_time_now_seconds() - time_begin); + elapsed_time, sizeof(elapsed_time), BLI_check_seconds_timer() - time_begin); notify_status(percent_done / 100.0, std::string(scene_name) + ": " + view_layer->name, std::string("Render Time: ") + elapsed_time + diff --git a/source/blender/render/hydra/viewport_engine.cc b/source/blender/render/hydra/viewport_engine.cc index 180fe054b8c..3bb6afcff92 100644 --- a/source/blender/render/hydra/viewport_engine.cc +++ b/source/blender/render/hydra/viewport_engine.cc @@ -9,6 +9,7 @@ #include #include +#include "DNA_camera_types.h" #include "DNA_scene_types.h" #include "DNA_screen_types.h" #include "DNA_vec_types.h" /* This include must be before `BKE_camera.h` due to `rctf` type. */ @@ -21,6 +22,9 @@ #include "BKE_camera.h" #include "BKE_context.hh" +#include "DEG_depsgraph_query.hh" + +#include "GPU_context.h" #include "GPU_matrix.h" #include "RE_engine.h" @@ -65,7 +69,7 @@ ViewSettings::ViewSettings(bContext *context) for (int i = 0; i < 4; i++) { float world_location[] = { camera_points[i][0], camera_points[i][1], camera_points[i][2], 1.0f}; - mul_m4_v4(camera_obj->object_to_world().ptr(), world_location); + mul_m4_v4(camera_obj->object_to_world, world_location); mul_m4_v4(region_data->persmat, world_location); if (world_location[3] > 0.0) { @@ -247,13 +251,13 @@ void ViewportEngine::render() GPU_shader_unbind(); if (renderer_percent_done() == 0.0f) { - time_begin_ = BLI_time_now_seconds(); + time_begin_ = BLI_check_seconds_timer(); } char elapsed_time[32]; BLI_timecode_string_from_time_simple( - elapsed_time, sizeof(elapsed_time), BLI_time_now_seconds() - time_begin_); + elapsed_time, sizeof(elapsed_time), BLI_check_seconds_timer() - time_begin_); float percent_done = renderer_percent_done(); if (!render_task_delegate_->is_converged()) { diff --git a/source/blender/render/intern/bake.cc b/source/blender/render/intern/bake.cc index b08d45b5a00..5466b60680d 100644 --- a/source/blender/render/intern/bake.cc +++ b/source/blender/render/intern/bake.cc @@ -450,7 +450,7 @@ static bool cast_ray_highpoly(BVHTreeFromMesh *treeData, * This function populates an array of verts for the triangles of a mesh * Tangent and Normals are also stored */ -static TriTessFace *mesh_calc_tri_tessface(Mesh *mesh, bool tangent, Mesh *mesh_eval) +static TriTessFace *mesh_calc_tri_tessface(Mesh *mesh, bool tangent, Mesh *me_eval) { using namespace blender; int i; @@ -490,13 +490,12 @@ static TriTessFace *mesh_calc_tri_tessface(Mesh *mesh, bool tangent, Mesh *mesh_ const TSpace *tspace = nullptr; blender::Span corner_normals; if (tangent) { - BKE_mesh_calc_loop_tangents(mesh_eval, true, nullptr, 0); + BKE_mesh_calc_loop_tangents(me_eval, true, nullptr, 0); - tspace = static_cast( - CustomData_get_layer(&mesh_eval->corner_data, CD_TANGENT)); + tspace = static_cast(CustomData_get_layer(&me_eval->corner_data, CD_TANGENT)); BLI_assert(tspace); - corner_normals = mesh_eval->corner_normals(); + corner_normals = me_eval->corner_normals(); } const blender::Span vert_normals = mesh->vert_normals(); @@ -551,8 +550,8 @@ bool RE_bake_pixels_populate_from_objects(Mesh *me_low, const bool is_custom_cage, const float cage_extrusion, const float max_ray_distance, - const float mat_low[4][4], - const float mat_cage[4][4], + float mat_low[4][4], + float mat_cage[4][4], Mesh *me_cage) { size_t i; @@ -856,15 +855,15 @@ void RE_bake_normal_world_to_tangent(const BakePixel pixel_array[], float result[], Mesh *mesh, const eBakeNormalSwizzle normal_swizzle[3], - const float mat[4][4]) + float mat[4][4]) { size_t i; TriTessFace *triangles; - Mesh *mesh_eval = BKE_mesh_copy_for_eval(mesh); + Mesh *me_eval = BKE_mesh_copy_for_eval(mesh); - triangles = mesh_calc_tri_tessface(mesh, true, mesh_eval); + triangles = mesh_calc_tri_tessface(mesh, true, me_eval); BLI_assert(pixels_num >= 3); @@ -970,8 +969,8 @@ void RE_bake_normal_world_to_tangent(const BakePixel pixel_array[], /* garbage collection */ MEM_freeN(triangles); - if (mesh_eval) { - BKE_id_free(nullptr, mesh_eval); + if (me_eval) { + BKE_id_free(nullptr, me_eval); } } @@ -985,7 +984,7 @@ void RE_bake_normal_world_to_object(const BakePixel pixel_array[], size_t i; float iobmat[4][4]; - invert_m4_m4(iobmat, ob->object_to_world().ptr()); + invert_m4_m4(iobmat, ob->object_to_world); for (i = 0; i < pixels_num; i++) { size_t offset; diff --git a/source/blender/render/intern/compositor.cc b/source/blender/render/intern/compositor.cc index 662b6082112..ae1d54872a2 100644 --- a/source/blender/render/intern/compositor.cc +++ b/source/blender/render/intern/compositor.cc @@ -13,10 +13,10 @@ #include "DNA_ID.h" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_image.h" #include "BKE_node.hh" -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "DRW_engine.hh" #include "DRW_render.hh" @@ -33,10 +33,6 @@ #include "RE_compositor.hh" #include "RE_pipeline.h" -#include "WM_api.hh" - -#include "GPU_context.h" - #include "render_types.h" namespace blender::render { @@ -210,7 +206,7 @@ class Context : public realtime_compositor::Context { int2 get_render_size() const override { int width, height; - BKE_render_resolution(input_data_.render_data, true, &width, &height); + BKE_render_resolution(input_data_.render_data, false, &width, &height); return int2(width, height); } @@ -508,21 +504,7 @@ class RealtimeCompositor { * to avoid them blocking each other. */ BLI_assert(!BLI_thread_is_main() || G.background); - if (G.background) { - /* In the background mode the system context of the render engine might be nullptr, which - * forces some code paths which more tightly couple it with the draw manager. - * For the compositor we want to have the least amount of coupling with the draw manager, so - * ensure that the render engine has its own system GPU context. */ - RE_system_gpu_context_ensure(&render_); - } - - void *re_system_gpu_context = RE_system_gpu_context_get(&render_); - void *re_blender_gpu_context = RE_blender_gpu_context_ensure(&render_); - - GPU_render_begin(); - WM_system_gpu_context_activate(re_system_gpu_context); - GPU_context_active_set(static_cast(re_blender_gpu_context)); - + DRW_render_context_enable(&render_); context_->update_input_data(input_data); /* Always recreate the evaluator, as this only runs on compositing node changes and @@ -535,11 +517,7 @@ class RealtimeCompositor { context_->output_to_render_result(); context_->viewer_output_to_viewer_image(); texture_pool_->free_unused_and_reset(); - - GPU_flush(); - GPU_render_end(); - GPU_context_active_set(nullptr); - WM_system_gpu_context_release(re_system_gpu_context); + DRW_render_context_disable(&render_); } }; diff --git a/source/blender/render/intern/engine.cc b/source/blender/render/intern/engine.cc index 9756d081867..aa0ee392248 100644 --- a/source/blender/render/intern/engine.cc +++ b/source/blender/render/intern/engine.cc @@ -12,19 +12,23 @@ #include "MEM_guardedalloc.h" +#include "BLT_translation.h" + #include "BLI_ghash.h" #include "BLI_listbase.h" #include "BLI_math_bits.h" +#include "BLI_rect.h" #include "BLI_string.h" #include "BLI_utildefines.h" #include "DNA_object_types.h" #include "BKE_camera.h" -#include "BKE_global.hh" +#include "BKE_global.h" +#include "BKE_layer.hh" #include "BKE_node.hh" -#include "BKE_report.hh" -#include "BKE_scene.hh" +#include "BKE_report.h" +#include "BKE_scene.h" #include "DEG_depsgraph.hh" #include "DEG_depsgraph_debug.hh" @@ -32,6 +36,8 @@ #include "GPU_context.h" +#include "RNA_access.hh" + #ifdef WITH_PYTHON # include "BPY_extern.h" #endif diff --git a/source/blender/render/intern/initrender.cc b/source/blender/render/intern/initrender.cc index 963ac6f7238..3abb219f154 100644 --- a/source/blender/render/intern/initrender.cc +++ b/source/blender/render/intern/initrender.cc @@ -15,13 +15,18 @@ #include "MEM_guardedalloc.h" +#include "BLI_blenlib.h" +#include "BLI_ghash.h" #include "BLI_math_base.h" #include "BLI_math_matrix.h" #include "BLI_utildefines.h" +#include "DNA_camera_types.h" + #include "BKE_camera.h" /* this module */ +#include "pipeline.hh" #include "render_types.h" /* ****************** MASKS and LUTS **************** */ diff --git a/source/blender/render/intern/multires_bake.cc b/source/blender/render/intern/multires_bake.cc index 0064d639785..0f8bff2345b 100644 --- a/source/blender/render/intern/multires_bake.cc +++ b/source/blender/render/intern/multires_bake.cc @@ -10,6 +10,7 @@ #include "MEM_guardedalloc.h" +#include "DNA_object_types.h" #include "DNA_scene_types.h" #include "BLI_listbase.h" @@ -21,9 +22,10 @@ #include "BKE_DerivedMesh.hh" #include "BKE_ccg.h" #include "BKE_customdata.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_image.h" #include "BKE_lib_id.hh" +#include "BKE_material.h" #include "BKE_mesh.hh" #include "BKE_mesh_tangent.hh" #include "BKE_modifier.hh" @@ -34,6 +36,7 @@ #include "RE_multires_bake.h" #include "RE_pipeline.h" +#include "RE_texture.h" #include "RE_texture_margin.h" #include "IMB_imbuf.hh" diff --git a/source/blender/render/intern/pipeline.cc b/source/blender/render/intern/pipeline.cc index 4e8bdb59328..93b3b20b0de 100644 --- a/source/blender/render/intern/pipeline.cc +++ b/source/blender/render/intern/pipeline.cc @@ -29,7 +29,9 @@ #include "MEM_guardedalloc.h" #include "BLI_fileops.h" +#include "BLI_implicit_sharing.hh" #include "BLI_listbase.h" +#include "BLI_path_util.h" #include "BLI_rect.h" #include "BLI_string.h" #include "BLI_threads.h" @@ -37,14 +39,14 @@ #include "BLI_timecode.h" #include "BLI_vector.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" -#include "BKE_anim_data.hh" +#include "BKE_anim_data.h" #include "BKE_animsys.h" /* <------ should this be here?, needed for sequencer update */ -#include "BKE_callbacks.hh" +#include "BKE_callbacks.h" #include "BKE_camera.h" #include "BKE_colortools.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_image.h" #include "BKE_image_format.h" #include "BKE_image_save.h" @@ -54,16 +56,17 @@ #include "BKE_main.hh" #include "BKE_mask.h" #include "BKE_modifier.hh" +#include "BKE_node.hh" #include "BKE_node_runtime.hh" +#include "BKE_object.hh" #include "BKE_pointcache.h" -#include "BKE_report.hh" -#include "BKE_scene.hh" +#include "BKE_report.h" +#include "BKE_scene.h" #include "BKE_sound.h" -#include "BKE_writemovie.hh" +#include "BKE_writeavi.h" /* <------ should be replaced once with generic movie module */ #include "NOD_composite.hh" -#include "COM_profile.hh" #include "COM_render_context.hh" #include "DEG_depsgraph.hh" @@ -199,7 +202,7 @@ static void stats_background(void * /*arg*/, RenderStats *rs) megs_peak_memory = (peak_memory) / (1024.0 * 1024.0); BLI_timecode_string_from_time_simple( - info_time_str, sizeof(info_time_str), BLI_time_now_seconds() - rs->starttime); + info_time_str, sizeof(info_time_str), BLI_check_seconds_timer() - rs->starttime); /* Compositor calls this from multiple threads, mutex lock to ensure we don't * get garbled output. */ @@ -663,10 +666,10 @@ void RE_FreeUnusedGPUResources() break; } - /* Detect if scene is using GPU compositing, and if either a node editor is + /* Detect if scene is using realtime compositing, and if either a node editor is * showing the nodes, or an image editor is showing the render result or viewer. */ if (!(scene->use_nodes && scene->nodetree && - scene->nodetree->execution_mode == NTREE_EXECUTION_MODE_GPU)) + scene->nodetree->execution_mode == NTREE_EXECUTION_MODE_REALTIME)) { continue; } @@ -788,7 +791,7 @@ void RE_InitState(Render *re, re->ok = true; /* maybe flag */ - re->i.starttime = BLI_time_now_seconds(); + re->i.starttime = BLI_check_seconds_timer(); /* copy render data and render layers for thread safety */ render_copy_renderdata(&re->r, rd); @@ -1097,7 +1100,7 @@ static void do_render_compositor_scene(Render *re, Scene *sce, int cfra) BKE_scene_camera_switch_update(sce); - /* exception: scene uses its own size (unfinished code) */ + /* exception: scene uses own size (unfinished code) */ if (false) { BKE_render_resolution(&sce->r, false, &winx, &winy); } @@ -1298,7 +1301,6 @@ static void do_render_compositor(Render *re) } blender::realtime_compositor::RenderContext compositor_render_context; - blender::compositor::ProfilerData profiler_data; LISTBASE_FOREACH (RenderView *, rv, &re->result->views) { ntreeCompositExecTree(re, re->pipeline_scene_eval, @@ -1307,8 +1309,7 @@ static void do_render_compositor(Render *re) true, G.background == 0, rv->name, - &compositor_render_context, - profiler_data); + &compositor_render_context); } compositor_render_context.save_file_outputs(re->pipeline_scene_eval); @@ -1506,7 +1507,7 @@ static void do_render_full_pipeline(Render *re) BKE_scene_camera_switch_update(re->scene); - re->i.starttime = BLI_time_now_seconds(); + re->i.starttime = BLI_check_seconds_timer(); /* ensure no images are in memory from previous animated sequences */ BKE_image_all_free_anim_ibufs(re->main, re->r.cfra); @@ -1529,7 +1530,7 @@ static void do_render_full_pipeline(Render *re) do_render_compositor(re); } - re->i.lastframetime = BLI_time_now_seconds() - re->i.starttime; + re->i.lastframetime = BLI_check_seconds_timer() - re->i.starttime; re->stats_draw(&re->i); @@ -1694,7 +1695,7 @@ static bool is_compositing_possible_on_gpu(Scene *scene, ReportList *reports) { /* CPU compositor can always run. */ if (!U.experimental.use_full_frame_compositor || - scene->nodetree->execution_mode != NTREE_EXECUTION_MODE_GPU) + scene->nodetree->execution_mode != NTREE_EXECUTION_MODE_REALTIME) { return true; } @@ -2111,7 +2112,9 @@ bool RE_WriteRenderViewsMovie(ReportList *reports, rd, preview ? scene->r.psfra : scene->r.sfra, scene->r.cfra, - ibuf, + (int *)ibuf->byte_buffer.data, + ibuf->x, + ibuf->y, suffix, reports)) { @@ -2143,7 +2146,9 @@ bool RE_WriteRenderViewsMovie(ReportList *reports, rd, preview ? scene->r.psfra : scene->r.sfra, scene->r.cfra, - ibuf_arr[2], + (int *)ibuf_arr[2]->byte_buffer.data, + ibuf_arr[2]->x, + ibuf_arr[2]->y, "", reports)) { @@ -2209,7 +2214,7 @@ static bool do_write_image_or_movie(Render *re, } render_time = re->i.lastframetime; - re->i.lastframetime = BLI_time_now_seconds() - re->i.starttime; + re->i.lastframetime = BLI_check_seconds_timer() - re->i.starttime; BLI_timecode_string_from_time_simple(filepath, sizeof(filepath), re->i.lastframetime); printf("Time: %s", filepath); diff --git a/source/blender/render/intern/render_result.cc b/source/blender/render/intern/render_result.cc index 69ab8ff1b23..c9fb2a5ef84 100644 --- a/source/blender/render/intern/render_result.cc +++ b/source/blender/render/intern/render_result.cc @@ -13,7 +13,9 @@ #include "MEM_guardedalloc.h" +#include "BLI_ghash.h" #include "BLI_hash_md5.hh" +#include "BLI_implicit_sharing.hh" #include "BLI_listbase.h" #include "BLI_path_util.h" #include "BLI_rect.h" @@ -23,13 +25,14 @@ #include "BLI_utildefines.h" #include "BKE_appdir.hh" -#include "BKE_global.hh" +#include "BKE_camera.h" +#include "BKE_global.h" #include "BKE_image.h" #include "BKE_image_format.h" #include "BKE_image_save.h" #include "BKE_main.hh" -#include "BKE_report.hh" -#include "BKE_scene.hh" +#include "BKE_report.h" +#include "BKE_scene.h" #include "IMB_colormanagement.hh" #include "IMB_imbuf.hh" @@ -38,6 +41,8 @@ #include "GPU_texture.h" +#include "RE_engine.h" + #include "render_result.h" #include "render_types.h" diff --git a/source/blender/render/intern/render_types.cc b/source/blender/render/intern/render_types.cc index bdcfbcdc9bc..690bfc65c15 100644 --- a/source/blender/render/intern/render_types.cc +++ b/source/blender/render/intern/render_types.cc @@ -8,6 +8,8 @@ #include "render_types.h" +#include "BLI_ghash.h" + #include "BKE_colortools.hh" #include "RE_compositor.hh" diff --git a/source/blender/render/intern/texture_image.cc b/source/blender/render/intern/texture_image.cc index 3c933458f01..d3de063eb69 100644 --- a/source/blender/render/intern/texture_image.cc +++ b/source/blender/render/intern/texture_image.cc @@ -22,8 +22,10 @@ #include "IMB_imbuf_types.hh" #include "DNA_image_types.h" +#include "DNA_scene_types.h" #include "DNA_texture_types.h" +#include "BLI_blenlib.h" #include "BLI_math_color.h" #include "BLI_math_interp.hh" #include "BLI_math_vector.h" diff --git a/source/blender/render/intern/texture_pointdensity.cc b/source/blender/render/intern/texture_pointdensity.cc index 903fa01f108..783e07dc205 100644 --- a/source/blender/render/intern/texture_pointdensity.cc +++ b/source/blender/render/intern/texture_pointdensity.cc @@ -21,23 +21,29 @@ #include "BLI_task.h" #include "BLI_utildefines.h" +#include "BLT_translation.h" + #include "DNA_meshdata_types.h" #include "DNA_object_types.h" #include "DNA_particle_types.h" +#include "DNA_scene_types.h" #include "DNA_texture_types.h" #include "BKE_colorband.hh" #include "BKE_colortools.hh" #include "BKE_customdata.hh" #include "BKE_deform.hh" +#include "BKE_lattice.hh" #include "BKE_mesh.hh" #include "BKE_object.hh" #include "BKE_particle.h" -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "DEG_depsgraph.hh" #include "DEG_depsgraph_query.hh" +#include "texture_common.h" + #include "RE_texture.h" static ThreadMutex sample_mutex = PTHREAD_MUTEX_INITIALIZER; @@ -181,7 +187,7 @@ static void pointdensity_cache_psys( sim.psmd = psys_get_modifier(ob, psys); /* in case ob->world_to_object isn't up-to-date */ - invert_m4_m4(ob->runtime->world_to_object.ptr(), ob->object_to_world().ptr()); + invert_m4_m4(ob->world_to_object, ob->object_to_world); total_particles = psys->totpart + psys->totchild; psys_sim_data_init(&sim); @@ -241,7 +247,7 @@ static void pointdensity_cache_psys( copy_v3_v3(partco, state.co); if (pd->psys_cache_space == TEX_PD_OBJECTSPACE) { - mul_m4_v3(ob->world_to_object().ptr(), partco); + mul_m4_v3(ob->world_to_object, partco); } else if (pd->psys_cache_space == TEX_PD_OBJECTLOC) { sub_v3_v3(partco, ob->loc); @@ -404,12 +410,12 @@ static void pointdensity_cache_object(PointDensity *pd, Object *ob) case TEX_PD_OBJECTSPACE: break; case TEX_PD_OBJECTLOC: - mul_m4_v3(ob->object_to_world().ptr(), co); + mul_m4_v3(ob->object_to_world, co); sub_v3_v3(co, ob->loc); break; case TEX_PD_WORLDSPACE: default: - mul_m4_v3(ob->object_to_world().ptr(), co); + mul_m4_v3(ob->object_to_world, co); break; } @@ -785,7 +791,7 @@ static void particle_system_minmax(Depsgraph *depsgraph, sim.psys = psys; sim.psmd = psys_get_modifier(object, psys); - invert_m4_m4(imat, object->object_to_world().ptr()); + invert_m4_m4(imat, object->object_to_world); total_particles = psys->totpart + psys->totchild; psys_sim_data_init(&sim); diff --git a/source/blender/render/intern/texture_procedural.cc b/source/blender/render/intern/texture_procedural.cc index 39a31106287..70be01fce83 100644 --- a/source/blender/render/intern/texture_procedural.cc +++ b/source/blender/render/intern/texture_procedural.cc @@ -16,9 +16,12 @@ #include "BLI_rand.h" #include "BLI_utildefines.h" +#include "DNA_anim_types.h" #include "DNA_image_types.h" +#include "DNA_light_types.h" #include "DNA_material_types.h" #include "DNA_node_types.h" +#include "DNA_object_types.h" #include "DNA_texture_types.h" #include "IMB_colormanagement.hh" @@ -26,6 +29,10 @@ #include "BKE_colorband.hh" #include "BKE_image.h" +#include "BKE_material.h" +#include "BKE_node.h" +#include "BKE_scene.h" +#include "BKE_texture.h" #include "NOD_texture.h" diff --git a/source/blender/render/intern/tile_highlight.cc b/source/blender/render/intern/tile_highlight.cc index 6f34079bce9..85b640c5721 100644 --- a/source/blender/render/intern/tile_highlight.cc +++ b/source/blender/render/intern/tile_highlight.cc @@ -10,6 +10,7 @@ #include "MEM_guardedalloc.h" +#include "BLI_ghash.h" #include "BLI_hash.hh" #include "RE_pipeline.h" diff --git a/source/blender/sequencer/intern/animation.cc b/source/blender/sequencer/intern/animation.cc index 9fa4d4baae8..1174d93665e 100644 --- a/source/blender/sequencer/intern/animation.cc +++ b/source/blender/sequencer/intern/animation.cc @@ -12,7 +12,8 @@ #include "DNA_scene_types.h" #include "DNA_sequence_types.h" -#include "BKE_fcurve.hh" +#include "BKE_animsys.h" +#include "BKE_fcurve.h" #include "BLI_ghash.h" #include "BLI_listbase.h" diff --git a/source/blender/sequencer/intern/channels.cc b/source/blender/sequencer/intern/channels.cc index 55fa661a1e6..851854c1d5e 100644 --- a/source/blender/sequencer/intern/channels.cc +++ b/source/blender/sequencer/intern/channels.cc @@ -11,11 +11,15 @@ #include "MEM_guardedalloc.h" #include "DNA_listBase.h" +#include "DNA_scene_types.h" #include "DNA_sequence_types.h" #include "BLI_blenlib.h" #include "SEQ_channels.hh" +#include "SEQ_iterator.hh" +#include "SEQ_relations.hh" +#include "SEQ_sequencer.hh" ListBase *SEQ_channels_displayed_get(Editing *ed) { diff --git a/source/blender/sequencer/intern/disk_cache.cc b/source/blender/sequencer/intern/disk_cache.cc index 3566b963c54..fb16e84be58 100644 --- a/source/blender/sequencer/intern/disk_cache.cc +++ b/source/blender/sequencer/intern/disk_cache.cc @@ -14,6 +14,7 @@ #include "DNA_scene_types.h" #include "DNA_sequence_types.h" +#include "DNA_space_types.h" /* for FILE_MAX. */ #include "IMB_colormanagement.hh" #include "IMB_imbuf.hh" @@ -24,17 +25,25 @@ #include "BLI_endian_switch.h" #include "BLI_fileops.h" #include "BLI_fileops_types.h" +#include "BLI_ghash.h" #include "BLI_listbase.h" +#include "BLI_mempool.h" #include "BLI_path_util.h" #include "BLI_threads.h" #include "BKE_main.hh" +#include "BKE_scene.h" +#include "SEQ_prefetch.hh" +#include "SEQ_relations.hh" #include "SEQ_render.hh" +#include "SEQ_sequencer.hh" #include "SEQ_time.hh" #include "disk_cache.hh" #include "image_cache.hh" +#include "prefetch.hh" +#include "strip_time.hh" /** * Disk Cache Design Notes @@ -632,14 +641,12 @@ ImBuf *seq_disk_cache_read_file(SeqDiskCache *disk_cache, SeqCacheKey *key) if (header.entry[entry_index].size_raw == size_char) { expected_size = size_char; - ibuf = IMB_allocImBuf( - key->context.rectx, key->context.recty, 32, IB_rect | IB_uninitialized_pixels); + ibuf = IMB_allocImBuf(key->context.rectx, key->context.recty, 32, IB_rect); IMB_colormanagement_assign_byte_colorspace(ibuf, header.entry[entry_index].colorspace_name); } else if (header.entry[entry_index].size_raw == size_float) { expected_size = size_float; - ibuf = IMB_allocImBuf( - key->context.rectx, key->context.recty, 32, IB_rectfloat | IB_uninitialized_pixels); + ibuf = IMB_allocImBuf(key->context.rectx, key->context.recty, 32, IB_rectfloat); IMB_colormanagement_assign_float_colorspace(ibuf, header.entry[entry_index].colorspace_name); } else { diff --git a/source/blender/sequencer/intern/effects.cc b/source/blender/sequencer/intern/effects.cc index 2c6757ac2e9..c0cb43a7913 100644 --- a/source/blender/sequencer/intern/effects.cc +++ b/source/blender/sequencer/intern/effects.cc @@ -15,6 +15,7 @@ #include "MEM_guardedalloc.h" #include "BLI_array.hh" +#include "BLI_listbase.h" #include "BLI_math_rotation.h" #include "BLI_math_vector.hh" #include "BLI_math_vector_types.hh" @@ -25,13 +26,14 @@ #include "BLI_threads.h" #include "BLI_utildefines.h" +#include "DNA_anim_types.h" #include "DNA_packedFile_types.h" #include "DNA_scene_types.h" #include "DNA_sequence_types.h" #include "DNA_space_types.h" #include "DNA_vfont_types.h" -#include "BKE_fcurve.hh" +#include "BKE_fcurve.h" #include "BKE_lib_id.hh" #include "BKE_main.hh" @@ -43,6 +45,7 @@ #include "BLI_math_color_blend.h" +#include "RNA_access.hh" #include "RNA_prototypes.h" #include "RE_pipeline.h" @@ -59,6 +62,8 @@ #include "effects.hh" #include "render.hh" +#include "strip_time.hh" +#include "utils.hh" using namespace blender; @@ -165,28 +170,26 @@ static void store_opaque_black_pixel(float *dst) static ImBuf *prepare_effect_imbufs(const SeqRenderData *context, ImBuf *ibuf1, ImBuf *ibuf2, - ImBuf *ibuf3, - bool uninitialized_pixels = true) + ImBuf *ibuf3) { ImBuf *out; Scene *scene = context->scene; int x = context->rectx; int y = context->recty; - int base_flags = uninitialized_pixels ? IB_uninitialized_pixels : 0; if (!ibuf1 && !ibuf2 && !ibuf3) { /* hmmm, global float option ? */ - out = IMB_allocImBuf(x, y, 32, IB_rect | base_flags); + out = IMB_allocImBuf(x, y, 32, IB_rect); } else if ((ibuf1 && ibuf1->float_buffer.data) || (ibuf2 && ibuf2->float_buffer.data) || (ibuf3 && ibuf3->float_buffer.data)) { /* if any inputs are rectfloat, output is float too */ - out = IMB_allocImBuf(x, y, 32, IB_rectfloat | base_flags); + out = IMB_allocImBuf(x, y, 32, IB_rectfloat); } else { - out = IMB_allocImBuf(x, y, 32, IB_rect | base_flags); + out = IMB_allocImBuf(x, y, 32, IB_rect); } if (out->float_buffer.data) { @@ -2647,11 +2650,11 @@ void SEQ_effect_text_font_load(TextVars *data, const bool do_id_user) /* FIXME: This is a band-aid fix. A proper solution has to be worked on by the VSE team. * * This code can be called from non-main thread, e.g. when copying sequences as part of - * depsgraph evaluated copy of the evaluated scene. Just skip font loading in that case, BLF - * code is not thread-safe, and if this happens from threaded context, it almost certainly - * means that a previous attempt to load the font already failed, e.g. because font file-path - * is invalid. Proposer fix would likely be to not attempt to reload a failed-to-load font - * every time. */ + * depsgraph CoW copy of the evaluated scene. Just skip font loading in that case, BLF code + * is not thread-safe, and if this happens from threaded context, it almost certainly means + * that a previous attempt to load the font already failed, e.g. because font file-path is + * invalid. Proposer fix would likely be to not attempt to reload a failed-to-load font every + * time. */ BLI_path_abs(filepath, ID_BLEND_PATH_FROM_GLOBAL(&vfont->id)); data->text_blf_id = BLF_load(filepath); @@ -2710,9 +2713,7 @@ static ImBuf *do_text_effect(const SeqRenderData *context, ImBuf *ibuf2, ImBuf *ibuf3) { - /* Note: text rasterization only fills in part of output image, - * need to clear it. */ - ImBuf *out = prepare_effect_imbufs(context, ibuf1, ibuf2, ibuf3, false); + ImBuf *out = prepare_effect_imbufs(context, ibuf1, ibuf2, ibuf3); TextVars *data = static_cast(seq->effectdata); int width = out->x; int height = out->y; @@ -2898,7 +2899,6 @@ static void get_default_fac_fade(const Scene *scene, { *fac = float(timeline_frame - SEQ_time_left_handle_frame_get(scene, seq)); *fac /= SEQ_time_strip_length_get(scene, seq); - *fac = blender::math::clamp(*fac, 0.0f, 1.0f); } static ImBuf *init_execution(const SeqRenderData *context, diff --git a/source/blender/sequencer/intern/image_cache.cc b/source/blender/sequencer/intern/image_cache.cc index 4f03060a5e7..3571849ad1d 100644 --- a/source/blender/sequencer/intern/image_cache.cc +++ b/source/blender/sequencer/intern/image_cache.cc @@ -19,21 +19,30 @@ #include "IMB_imbuf.hh" #include "IMB_imbuf_types.hh" +#include "BLI_blenlib.h" +#include "BLI_endian_defines.h" +#include "BLI_endian_switch.h" +#include "BLI_fileops.h" #include "BLI_fileops_types.h" #include "BLI_ghash.h" +#include "BLI_listbase.h" #include "BLI_mempool.h" +#include "BLI_path_util.h" #include "BLI_threads.h" #include "BKE_main.hh" +#include "BKE_scene.h" #include "SEQ_prefetch.hh" #include "SEQ_relations.hh" #include "SEQ_render.hh" +#include "SEQ_sequencer.hh" #include "SEQ_time.hh" #include "disk_cache.hh" #include "image_cache.hh" #include "prefetch.hh" +#include "strip_time.hh" /** * Sequencer Cache Design Notes @@ -133,8 +142,7 @@ static float seq_cache_timeline_frame_to_frame_index(Scene *scene, /* With raw images, map timeline_frame to strip input media frame range. This means that static * images or extended frame range of movies will only generate one cache entry. No special * treatment in converting frame index to timeline_frame is needed. */ - bool is_effect = seq->type & SEQ_TYPE_EFFECT; - if (!is_effect && ELEM(type, SEQ_CACHE_STORE_RAW, SEQ_CACHE_STORE_THUMBNAIL)) { + if (ELEM(type, SEQ_CACHE_STORE_RAW, SEQ_CACHE_STORE_THUMBNAIL)) { return SEQ_give_frame_index(scene, seq, timeline_frame); } diff --git a/source/blender/sequencer/intern/iterator.cc b/source/blender/sequencer/intern/iterator.cc index 2663e06e84c..41bc66b4763 100644 --- a/source/blender/sequencer/intern/iterator.cc +++ b/source/blender/sequencer/intern/iterator.cc @@ -12,15 +12,21 @@ #include "MEM_guardedalloc.h" +#include "DNA_scene_types.h" #include "DNA_sequence_types.h" +#include "BLI_ghash.h" #include "BLI_listbase.h" +#include "BLI_set.hh" + +#include "BKE_scene.h" #include "SEQ_effects.hh" #include "SEQ_iterator.hh" #include "SEQ_relations.hh" #include "SEQ_render.hh" #include "SEQ_time.hh" +#include "render.hh" using blender::VectorSet; diff --git a/source/blender/sequencer/intern/modifier.cc b/source/blender/sequencer/intern/modifier.cc index b1f479f369c..be3854c89bb 100644 --- a/source/blender/sequencer/intern/modifier.cc +++ b/source/blender/sequencer/intern/modifier.cc @@ -16,7 +16,7 @@ #include "BLI_string_utils.hh" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_mask_types.h" #include "DNA_scene_types.h" diff --git a/source/blender/sequencer/intern/multiview.cc b/source/blender/sequencer/intern/multiview.cc index aacc0e5d358..a724e04a90e 100644 --- a/source/blender/sequencer/intern/multiview.cc +++ b/source/blender/sequencer/intern/multiview.cc @@ -12,7 +12,7 @@ #include "BLI_string.h" -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "IMB_imbuf.hh" diff --git a/source/blender/sequencer/intern/prefetch.cc b/source/blender/sequencer/intern/prefetch.cc index 7abd5159bad..f8ece7006a0 100644 --- a/source/blender/sequencer/intern/prefetch.cc +++ b/source/blender/sequencer/intern/prefetch.cc @@ -12,9 +12,11 @@ #include "MEM_guardedalloc.h" +#include "DNA_anim_types.h" #include "DNA_scene_types.h" #include "DNA_screen_types.h" #include "DNA_sequence_types.h" +#include "DNA_windowmanager_types.h" #include "BLI_listbase.h" #include "BLI_threads.h" @@ -22,11 +24,14 @@ #include "IMB_imbuf.hh" #include "IMB_imbuf_types.hh" -#include "BKE_anim_data.hh" +#include "BKE_anim_data.h" #include "BKE_animsys.h" -#include "BKE_global.hh" +#include "BKE_context.hh" +#include "BKE_global.h" #include "BKE_layer.hh" +#include "BKE_lib_id.hh" #include "BKE_main.hh" +#include "BKE_scene.h" #include "DEG_depsgraph.hh" #include "DEG_depsgraph_build.hh" diff --git a/source/blender/sequencer/intern/proxy.cc b/source/blender/sequencer/intern/proxy.cc index fe771f3c9fd..3f86dca3310 100644 --- a/source/blender/sequencer/intern/proxy.cc +++ b/source/blender/sequencer/intern/proxy.cc @@ -10,6 +10,7 @@ #include "MEM_guardedalloc.h" +#include "DNA_anim_types.h" #include "DNA_scene_types.h" #include "DNA_sequence_types.h" #include "DNA_space_types.h" @@ -17,6 +18,7 @@ #include "BLI_fileops.h" #include "BLI_listbase.h" #include "BLI_path_util.h" +#include "BLI_session_uid.h" #include "BLI_string.h" #ifdef WIN32 @@ -25,10 +27,12 @@ # include #endif -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_image.h" #include "BKE_main.hh" -#include "BKE_scene.hh" +#include "BKE_scene.h" + +#include "DEG_depsgraph.hh" #include "WM_types.hh" @@ -36,6 +40,7 @@ #include "IMB_imbuf_types.hh" #include "IMB_metadata.hh" +#include "SEQ_iterator.hh" #include "SEQ_proxy.hh" #include "SEQ_relations.hh" #include "SEQ_render.hh" @@ -46,6 +51,7 @@ #include "proxy.hh" #include "render.hh" #include "sequencer.hh" +#include "strip_time.hh" #include "utils.hh" struct SeqIndexBuildContext { diff --git a/source/blender/sequencer/intern/proxy_job.cc b/source/blender/sequencer/intern/proxy_job.cc index 54a1aac1235..a076679d697 100644 --- a/source/blender/sequencer/intern/proxy_job.cc +++ b/source/blender/sequencer/intern/proxy_job.cc @@ -10,11 +10,19 @@ #include "MEM_guardedalloc.h" +#include "BLI_blenlib.h" +#include "BLI_ghash.h" +#include "BLI_timecode.h" + #include "DNA_scene_types.h" #include "DNA_sequence_types.h" #include "BKE_context.hh" +#include "BKE_global.h" +#include "BKE_main.hh" +#include "BKE_report.h" +#include "SEQ_iterator.hh" #include "SEQ_proxy.hh" #include "SEQ_relations.hh" #include "SEQ_sequencer.hh" @@ -22,6 +30,8 @@ #include "WM_api.hh" #include "WM_types.hh" +#include "RNA_define.hh" + static void proxy_freejob(void *pjv) { ProxyJob *pj = static_cast(pjv); diff --git a/source/blender/sequencer/intern/render.cc b/source/blender/sequencer/intern/render.cc index 6a32b00d56d..ea8d7c6e933 100644 --- a/source/blender/sequencer/intern/render.cc +++ b/source/blender/sequencer/intern/render.cc @@ -12,6 +12,7 @@ #include "MEM_guardedalloc.h" +#include "DNA_anim_types.h" #include "DNA_defaults.h" #include "DNA_mask_types.h" #include "DNA_scene_types.h" @@ -26,17 +27,17 @@ #include "BLI_path_util.h" #include "BLI_rect.h" -#include "BKE_anim_data.hh" +#include "BKE_anim_data.h" #include "BKE_animsys.h" -#include "BKE_fcurve.hh" -#include "BKE_global.hh" +#include "BKE_fcurve.h" +#include "BKE_global.h" #include "BKE_image.h" #include "BKE_layer.hh" #include "BKE_lib_id.hh" #include "BKE_main.hh" #include "BKE_mask.h" #include "BKE_movieclip.h" -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "BKE_sequencer_offscreen.h" #include "DEG_depsgraph.hh" @@ -47,6 +48,7 @@ #include "IMB_imbuf_types.hh" #include "IMB_metadata.hh" +#include "RNA_access.hh" #include "RNA_prototypes.h" #include "RE_engine.h" @@ -70,6 +72,7 @@ #include "prefetch.hh" #include "proxy.hh" #include "render.hh" +#include "strip_time.hh" #include "utils.hh" #include @@ -139,7 +142,7 @@ void seq_imbuf_to_sequencer_space(const Scene *scene, ImBuf *ibuf, bool make_flo /* We perform conversion to a float buffer so we don't worry about * precision loss. */ - imb_addrectfloatImBuf(ibuf, 4, false); + imb_addrectfloatImBuf(ibuf, 4); IMB_colormanagement_transform_from_byte_threaded(ibuf->float_buffer.data, ibuf->byte_buffer.data, ibuf->x, @@ -292,79 +295,6 @@ Vector seq_get_shown_sequences(const Scene *scene, return result; } -/* Strip corner coordinates in screen pixel space. Note that they might not be - * axis aligned when rotation is present. */ -struct StripScreenQuad { - float2 v0, v1, v2, v3; - - bool is_empty() const - { - return v0 == v1 && v2 == v3 && v0 == v2; - } -}; - -static StripScreenQuad get_strip_screen_quad(const SeqRenderData *context, const Sequence *seq) -{ - Scene *scene = context->scene; - const int x = context->rectx; - const int y = context->recty; - float2 offset{x * 0.5f, y * 0.5f}; - - float quad[4][2]; - SEQ_image_transform_final_quad_get(scene, seq, quad); - return StripScreenQuad{quad[0] + offset, quad[1] + offset, quad[2] + offset, quad[3] + offset}; -} - -/* Is quad `a` fully contained (i.e. covered by) quad `b`? For that to happen, - * all corners of `a` have to be inside `b`. */ -static bool is_quad_a_inside_b(const StripScreenQuad &a, const StripScreenQuad &b) -{ - return isect_point_quad_v2(a.v0, b.v0, b.v1, b.v2, b.v3) && - isect_point_quad_v2(a.v1, b.v0, b.v1, b.v2, b.v3) && - isect_point_quad_v2(a.v2, b.v0, b.v1, b.v2, b.v3) && - isect_point_quad_v2(a.v3, b.v0, b.v1, b.v2, b.v3); -} - -/* Tracking of "known to be opaque" strip quad coordinates, along with their - * order index within visible strips during rendering. */ - -struct OpaqueQuad { - StripScreenQuad quad; - int order_index; -}; - -struct OpaqueQuadTracker { - Vector opaques; - - /* Determine if the input strip is completely behind opaque strips that are - * above it. Current implementation is simple and only checks if strip is - * completely covered by any other strip. It does not detect case where - * a strip is not covered by a single strip, but is behind of the union - * of the strips above. */ - bool is_occluded(const SeqRenderData *context, const Sequence *seq, int order_index) const - { - StripScreenQuad quad = get_strip_screen_quad(context, seq); - if (quad.is_empty()) { - /* Strip size is not initialized/valid, we can't know if it is occluded. */ - return false; - } - for (const OpaqueQuad &q : opaques) { - if (q.order_index > order_index && is_quad_a_inside_b(quad, q.quad)) { - return true; - } - } - return false; - } - - void add_occluder(const SeqRenderData *context, const Sequence *seq, int order_index) - { - StripScreenQuad quad = get_strip_screen_quad(context, seq); - if (!quad.is_empty()) { - opaques.append({quad, order_index}); - } - } -}; - /** \} */ /* -------------------------------------------------------------------- */ @@ -538,20 +468,36 @@ static void sequencer_thumbnail_transform(ImBuf *in, ImBuf *out) * image. If they do not the image will have transparent areas. */ static bool seq_image_transform_transparency_gained(const SeqRenderData *context, Sequence *seq) { - float x0 = 0.0f; - float y0 = 0.0f; - float x1 = float(context->rectx); - float y1 = float(context->recty); - float x_aspect = context->scene->r.xasp / context->scene->r.yasp; - if (x_aspect != 1.0f) { - float xmid = (x0 + x1) * 0.5f; - x0 = xmid - (xmid - x0) * x_aspect; - x1 = xmid + (x1 - xmid) * x_aspect; - } - StripScreenQuad quad = get_strip_screen_quad(context, seq); - StripScreenQuad screen{float2(x0, y0), float2(x1, y0), float2(x0, y1), float2(x1, y1)}; + Scene *scene = context->scene; + const int x = context->rectx; + const int y = context->recty; - return !is_quad_a_inside_b(screen, quad); + float seq_image_quad[4][2]; + SEQ_image_transform_final_quad_get(scene, seq, seq_image_quad); + for (int i = 0; i < 4; i++) { + add_v2_v2(seq_image_quad[i], float2{x / 2.0f, y / 2.0f}); + } + + return !isect_point_quad_v2(float2{float(x), float(y)}, + seq_image_quad[0], + seq_image_quad[1], + seq_image_quad[2], + seq_image_quad[3]) || + !isect_point_quad_v2(float2{0, float(y)}, + seq_image_quad[0], + seq_image_quad[1], + seq_image_quad[2], + seq_image_quad[3]) || + !isect_point_quad_v2(float2{float(x), 0}, + seq_image_quad[0], + seq_image_quad[1], + seq_image_quad[2], + seq_image_quad[3]) || + !isect_point_quad_v2(float2{0, 0}, + seq_image_quad[0], + seq_image_quad[1], + seq_image_quad[2], + seq_image_quad[3]); } /* Automatic filter: @@ -766,10 +712,8 @@ static ImBuf *seq_render_preprocess_ibuf(const SeqRenderData *context, use_preprocess = true; } - /* Proxies and non-generator effect strips are not stored in cache. */ - const bool is_effect_with_inputs = (seq->type & SEQ_TYPE_EFFECT) != 0 && - SEQ_effect_get_num_inputs(seq->type) != 0; - if (!is_proxy_image && !is_effect_with_inputs) { + /* Proxies and effect strips are not stored in cache. */ + if (!is_proxy_image && (seq->type & SEQ_TYPE_EFFECT) == 0) { seq_cache_put(context, seq, timeline_frame, SEQ_CACHE_STORE_RAW, ibuf); } @@ -1245,7 +1189,7 @@ static ImBuf *seq_render_movie_strip(const SeqRenderData *context, SeqRenderData localcontext = *context; localcontext.view_id = view_id; - if (view_id != context->view_id && ibuf_arr[view_id]) { + if (view_id != context->view_id) { ibuf_arr[view_id] = seq_render_preprocess_ibuf( &localcontext, seq, ibuf_arr[view_id], timeline_frame, true, false); } @@ -1401,8 +1345,7 @@ ImBuf *seq_render_mask(const SeqRenderData *context, const float *fp_src; float *fp_dst; - ibuf = IMB_allocImBuf( - context->rectx, context->recty, 32, IB_rectfloat | IB_uninitialized_pixels); + ibuf = IMB_allocImBuf(context->rectx, context->recty, 32, IB_rectfloat); fp_src = maskbuf; fp_dst = ibuf->float_buffer.data; @@ -1420,7 +1363,7 @@ ImBuf *seq_render_mask(const SeqRenderData *context, const float *fp_src; uchar *ub_dst; - ibuf = IMB_allocImBuf(context->rectx, context->recty, 32, IB_rect | IB_uninitialized_pixels); + ibuf = IMB_allocImBuf(context->rectx, context->recty, 32, IB_rect); fp_src = maskbuf; ub_dst = ibuf->byte_buffer.data; @@ -1959,8 +1902,6 @@ static ImBuf *seq_render_strip_stack(const SeqRenderData *context, return nullptr; } - OpaqueQuadTracker opaques; - int64_t i; ImBuf *out = nullptr; for (i = strips.size() - 1; i >= 0; i--) { @@ -1978,15 +1919,9 @@ static ImBuf *seq_render_strip_stack(const SeqRenderData *context, StripEarlyOut early_out = seq_get_early_out_for_blend_mode(seq); - if (early_out == StripEarlyOut::DoEffect && opaques.is_occluded(context, seq, i)) { - early_out = StripEarlyOut::UseInput1; - } - /* Early out for alpha over. It requires image to be rendered, so it can't use * `seq_get_early_out_for_blend_mode`. */ - if (out == nullptr && seq->blend_mode == SEQ_TYPE_ALPHAOVER && - early_out == StripEarlyOut::DoEffect && seq->blend_opacity == 100.0f) - { + if (out == nullptr && seq->blend_mode == SEQ_TYPE_ALPHAOVER && seq->blend_opacity == 100.0f) { ImBuf *test = seq_render_strip(context, state, seq, timeline_frame); if (ELEM(test->planes, R_IMF_PLANES_BW, R_IMF_PLANES_RGB)) { early_out = StripEarlyOut::UseInput2; @@ -1996,16 +1931,6 @@ static ImBuf *seq_render_strip_stack(const SeqRenderData *context, } /* Free the image. It is stored in cache, so this doesn't affect performance. */ IMB_freeImBuf(test); - - /* Check whether the raw (before preprocessing, which can add alpha) strip content - * was opaque. */ - ImBuf *ibuf_raw = seq_cache_get(context, seq, timeline_frame, SEQ_CACHE_STORE_RAW); - if (ibuf_raw != nullptr) { - if (ibuf_raw->planes != R_IMF_PLANES_RGBA) { - opaques.add_occluder(context, seq, i); - } - IMB_freeImBuf(ibuf_raw); - } } switch (early_out) { @@ -2043,10 +1968,6 @@ static ImBuf *seq_render_strip_stack(const SeqRenderData *context, for (; i < strips.size(); i++) { Sequence *seq = strips[i]; - if (opaques.is_occluded(context, seq, i)) { - continue; - } - if (seq_get_early_out_for_blend_mode(seq) == StripEarlyOut::DoEffect) { ImBuf *ibuf1 = out; ImBuf *ibuf2 = seq_render_strip(context, state, seq, timeline_frame); diff --git a/source/blender/sequencer/intern/render.hh b/source/blender/sequencer/intern/render.hh index c680d6b9c24..b313be9b2ba 100644 --- a/source/blender/sequencer/intern/render.hh +++ b/source/blender/sequencer/intern/render.hh @@ -1,4 +1,4 @@ -/* SPDX-FileCopyrightText: 2024 Blender Authors +/* SPDX-FileCopyrightText: 2004 Blender Authors * * SPDX-License-Identifier: GPL-2.0-or-later */ diff --git a/source/blender/sequencer/intern/sequence_lookup.cc b/source/blender/sequencer/intern/sequence_lookup.cc index 4fca9d97e62..3ddc4129426 100644 --- a/source/blender/sequencer/intern/sequence_lookup.cc +++ b/source/blender/sequencer/intern/sequence_lookup.cc @@ -13,9 +13,12 @@ #include "DNA_scene_types.h" #include "DNA_sequence_types.h" +#include "SEQ_iterator.hh" + #include "BLI_ghash.h" #include "BLI_listbase.h" #include "BLI_map.hh" +#include "BLI_string.h" #include "BLI_sys_types.h" #include "BLI_threads.h" #include "BLI_vector_set.hh" diff --git a/source/blender/sequencer/intern/sequencer.cc b/source/blender/sequencer/intern/sequencer.cc index 3ec7df27de7..3aedd7dbe83 100644 --- a/source/blender/sequencer/intern/sequencer.cc +++ b/source/blender/sequencer/intern/sequencer.cc @@ -20,11 +20,11 @@ #include "BLI_listbase.h" #include "BLI_path_util.h" -#include "BKE_fcurve.hh" +#include "BKE_fcurve.h" #include "BKE_idprop.h" #include "BKE_lib_id.hh" #include "BKE_main.hh" -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "BKE_sound.h" #include "DEG_depsgraph.hh" @@ -930,8 +930,8 @@ static void seq_update_sound_modifiers(Sequence *seq) static bool must_update_strip_sound(Scene *scene, Sequence *seq) { - return (scene->id.recalc & (ID_RECALC_AUDIO | ID_RECALC_SYNC_TO_EVAL)) != 0 || - (seq->sound->id.recalc & (ID_RECALC_AUDIO | ID_RECALC_SYNC_TO_EVAL)) != 0; + return (scene->id.recalc & (ID_RECALC_AUDIO | ID_RECALC_COPY_ON_WRITE)) != 0 || + (seq->sound->id.recalc & (ID_RECALC_AUDIO | ID_RECALC_COPY_ON_WRITE)) != 0; } static void seq_update_sound_strips(Scene *scene, Sequence *seq) diff --git a/source/blender/sequencer/intern/sequencer.hh b/source/blender/sequencer/intern/sequencer.hh index bd11a020dc9..a51c6073f0b 100644 --- a/source/blender/sequencer/intern/sequencer.hh +++ b/source/blender/sequencer/intern/sequencer.hh @@ -4,7 +4,7 @@ #pragma once -#include "BLI_vector_set.hh" +#include /** \file * \ingroup sequencer diff --git a/source/blender/sequencer/intern/sound.cc b/source/blender/sequencer/intern/sound.cc index c76d4716a45..b551551aa76 100644 --- a/source/blender/sequencer/intern/sound.cc +++ b/source/blender/sequencer/intern/sound.cc @@ -22,7 +22,11 @@ #include "BLI_listbase.h" #include "BLI_utildefines.h" +#include "BLO_read_write.hh" + #include "BKE_colortools.hh" +#include "BKE_main.hh" +#include "BKE_scene.h" #include "BKE_sound.h" #ifdef WITH_CONVOLUTION diff --git a/source/blender/sequencer/intern/strip_add.cc b/source/blender/sequencer/intern/strip_add.cc index d2b749465cd..5f11a0e718d 100644 --- a/source/blender/sequencer/intern/strip_add.cc +++ b/source/blender/sequencer/intern/strip_add.cc @@ -22,13 +22,15 @@ #include "BLI_listbase.h" #include "BLI_path_util.h" #include "BLI_string.h" +#include "BLI_string_utf8.h" +#include "BKE_context.hh" #include "BKE_image.h" #include "BKE_lib_id.hh" #include "BKE_main.hh" #include "BKE_mask.h" #include "BKE_movieclip.h" -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "BKE_sound.h" #include "DEG_depsgraph_query.hh" @@ -43,6 +45,7 @@ #include "SEQ_effects.hh" #include "SEQ_relations.hh" #include "SEQ_render.hh" +#include "SEQ_select.hh" #include "SEQ_sequencer.hh" #include "SEQ_time.hh" #include "SEQ_transform.hh" @@ -52,6 +55,7 @@ #include "proxy.hh" #include "sequencer.hh" #include "strip_time.hh" +#include "utils.hh" void SEQ_add_load_data_init(SeqLoadData *load_data, const char *name, diff --git a/source/blender/sequencer/intern/strip_edit.cc b/source/blender/sequencer/intern/strip_edit.cc index 4a2fc80db80..c352c9e413d 100644 --- a/source/blender/sequencer/intern/strip_edit.cc +++ b/source/blender/sequencer/intern/strip_edit.cc @@ -16,11 +16,15 @@ #include "BLI_string.h" #include "BLI_string_utf8.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" +#include "BKE_main.hh" +#include "BKE_movieclip.h" +#include "BKE_scene.h" #include "BKE_sound.h" #include "strip_time.hh" +#include "utils.hh" #include "SEQ_add.hh" #include "SEQ_animation.hh" diff --git a/source/blender/sequencer/intern/strip_relations.cc b/source/blender/sequencer/intern/strip_relations.cc index a5ca653b80c..58d0c1d5415 100644 --- a/source/blender/sequencer/intern/strip_relations.cc +++ b/source/blender/sequencer/intern/strip_relations.cc @@ -17,9 +17,11 @@ #include "BLI_session_uid.h" #include "BKE_main.hh" -#include "BKE_report.hh" +#include "BKE_report.h" +#include "BKE_scene.h" #include "DEG_depsgraph.hh" +#include "DEG_depsgraph_query.hh" #include "IMB_imbuf.hh" @@ -28,6 +30,7 @@ #include "SEQ_relations.hh" #include "SEQ_sequencer.hh" #include "SEQ_time.hh" +#include "SEQ_transform.hh" #include "effects.hh" #include "image_cache.hh" diff --git a/source/blender/sequencer/intern/strip_retiming.cc b/source/blender/sequencer/intern/strip_retiming.cc index 3a063e300f6..3db1924dc0b 100644 --- a/source/blender/sequencer/intern/strip_retiming.cc +++ b/source/blender/sequencer/intern/strip_retiming.cc @@ -18,14 +18,30 @@ #include "BLI_span.hh" #include "BLI_vector.hh" +#include "BKE_fcurve.h" +#include "BKE_movieclip.h" +#include "BKE_scene.h" #include "BKE_sound.h" +#include "DNA_anim_types.h" +#include "DNA_sound_types.h" + +#include "IMB_imbuf.hh" + +#include "RNA_prototypes.h" + +#include "SEQ_channels.hh" +#include "SEQ_iterator.hh" +#include "SEQ_relations.hh" +#include "SEQ_render.hh" #include "SEQ_retiming.hh" #include "SEQ_sequencer.hh" #include "SEQ_time.hh" +#include "SEQ_transform.hh" #include "sequencer.hh" #include "strip_time.hh" +#include "utils.hh" using blender::MutableSpan; diff --git a/source/blender/sequencer/intern/strip_select.cc b/source/blender/sequencer/intern/strip_select.cc index 808511a00b0..d08cfa7771c 100644 --- a/source/blender/sequencer/intern/strip_select.cc +++ b/source/blender/sequencer/intern/strip_select.cc @@ -11,6 +11,8 @@ #include "DNA_scene_types.h" #include "DNA_sequence_types.h" +#include "BKE_scene.h" + #include "SEQ_select.hh" #include "SEQ_sequencer.hh" diff --git a/source/blender/sequencer/intern/strip_time.cc b/source/blender/sequencer/intern/strip_time.cc index e4ae324febf..05c929883ff 100644 --- a/source/blender/sequencer/intern/strip_time.cc +++ b/source/blender/sequencer/intern/strip_time.cc @@ -16,15 +16,21 @@ #include "BLI_listbase.h" #include "BLI_math_base.h" +#include "BKE_fcurve.h" #include "BKE_movieclip.h" +#include "BKE_scene.h" #include "BKE_sound.h" +#include "DNA_anim_types.h" #include "DNA_sound_types.h" #include "IMB_imbuf.hh" +#include "RNA_prototypes.h" + #include "SEQ_channels.hh" #include "SEQ_iterator.hh" +#include "SEQ_relations.hh" #include "SEQ_render.hh" #include "SEQ_retiming.hh" #include "SEQ_sequencer.hh" @@ -230,8 +236,7 @@ void seq_time_effect_range_set(const Scene *scene, Sequence *seq) seq->len = seq->enddisp - seq->startdisp; } -void seq_time_update_effects_strip_range(const Scene *scene, - const blender::Span effects) +void seq_time_update_effects_strip_range(const Scene *scene, blender::Span &effects) { /* First pass: Update length of immediate effects. */ for (Sequence *seq : effects) { diff --git a/source/blender/sequencer/intern/strip_time.hh b/source/blender/sequencer/intern/strip_time.hh index e9bd6a60d2d..b09fbe92e79 100644 --- a/source/blender/sequencer/intern/strip_time.hh +++ b/source/blender/sequencer/intern/strip_time.hh @@ -4,7 +4,7 @@ #pragma once -#include "BLI_span.hh" +#include /** \file * \ingroup sequencer @@ -40,7 +40,7 @@ void seq_time_effect_range_set(const Scene *scene, Sequence *seq); /** * Update strip `startdisp` and `enddisp` (n-input effects have no length to calculate these). */ -void seq_time_update_effects_strip_range(const Scene *scene, blender::Span effects); +void seq_time_update_effects_strip_range(const Scene *scene, blender::Span &effects); void seq_time_translate_handles(const Scene *scene, Sequence *seq, const int offset); float seq_time_media_playback_rate_factor_get(const Scene *scene, const Sequence *seq); int seq_time_strip_original_content_length_get(const Scene *scene, const Sequence *seq); diff --git a/source/blender/sequencer/intern/strip_transform.cc b/source/blender/sequencer/intern/strip_transform.cc index 72e8ac27bf7..b9426c68246 100644 --- a/source/blender/sequencer/intern/strip_transform.cc +++ b/source/blender/sequencer/intern/strip_transform.cc @@ -17,6 +17,10 @@ #include "BLI_math_vector.h" #include "BLI_math_vector_types.hh" +#include "BKE_main.hh" +#include "BKE_scene.h" +#include "BKE_sound.h" + #include "SEQ_animation.hh" #include "SEQ_channels.hh" #include "SEQ_edit.hh" @@ -30,6 +34,8 @@ #include "sequencer.hh" #include "strip_time.hh" +#include "CLG_log.h" + bool SEQ_transform_single_image_check(Sequence *seq) { return (seq->flag & SEQ_SINGLE_FRAME_CONTENT) != 0; @@ -676,7 +682,7 @@ static void seq_image_transform_quad_get_ex(const Scene *scene, float quad_temp[4][3]; for (int i = 0; i < 4; i++) { - zero_v3(quad_temp[i]); + zero_v2(quad_temp[i]); } quad_temp[0][0] = (image_size[0] / 2) - crop->right; diff --git a/source/blender/sequencer/intern/utils.cc b/source/blender/sequencer/intern/utils.cc index 9ff6d8b2b45..c72c86fe515 100644 --- a/source/blender/sequencer/intern/utils.cc +++ b/source/blender/sequencer/intern/utils.cc @@ -14,19 +14,21 @@ #include "MEM_guardedalloc.h" +#include "DNA_mask_types.h" #include "DNA_scene_types.h" #include "DNA_sequence_types.h" #include "BLI_blenlib.h" #include "BLI_vector_set.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_animsys.h" #include "BKE_image.h" #include "BKE_main.hh" -#include "BKE_scene.hh" +#include "BKE_scene.h" +#include "SEQ_animation.hh" #include "SEQ_channels.hh" #include "SEQ_edit.hh" #include "SEQ_iterator.hh" @@ -202,126 +204,134 @@ ListBase *SEQ_get_seqbase_from_sequence(Sequence *seq, ListBase **r_channels, in return seqbase; } -static void open_anim_filepath(Sequence *seq, - StripAnim *sanim, - const char *filepath, - bool openfile) -{ - if (openfile) { - sanim->anim = openanim(filepath, - IB_rect | ((seq->flag & SEQ_FILTERY) ? IB_animdeinterlace : 0), - seq->streamindex, - seq->strip->colorspace_settings.name); - } - else { - sanim->anim = openanim_noload(filepath, - IB_rect | ((seq->flag & SEQ_FILTERY) ? IB_animdeinterlace : 0), - seq->streamindex, - seq->strip->colorspace_settings.name); - } -} - -static bool use_proxy(Editing *ed, Sequence *seq) -{ - StripProxy *proxy = seq->strip->proxy; - return proxy && ((proxy->storage & SEQ_STORAGE_PROXY_CUSTOM_DIR) != 0 || - (ed->proxy_storage == SEQ_EDIT_PROXY_DIR_STORAGE)); -} - -static void proxy_dir_get(Editing *ed, Sequence *seq, size_t str_len, char *r_proxy_dirpath) -{ - if (use_proxy(ed, seq)) { - if (ed->proxy_storage == SEQ_EDIT_PROXY_DIR_STORAGE) { - if (ed->proxy_dir[0] == 0) { - BLI_strncpy(r_proxy_dirpath, "//BL_proxy", str_len); - } - else { - BLI_strncpy(r_proxy_dirpath, ed->proxy_dir, str_len); - } - } - else { - BLI_strncpy(r_proxy_dirpath, seq->strip->proxy->dirpath, str_len); - } - BLI_path_abs(r_proxy_dirpath, BKE_main_blendfile_path_from_global()); - } -} - -static void index_dir_set(Editing *ed, Sequence *seq, StripAnim *sanim) -{ - if (sanim->anim == nullptr || !use_proxy(ed, seq)) { - return; - } - - char proxy_dirpath[FILE_MAX]; - proxy_dir_get(ed, seq, sizeof(proxy_dirpath), proxy_dirpath); - seq_proxy_index_dir_set(sanim->anim, proxy_dirpath); -} - -static bool open_anim_file_multiview(Scene *scene, Sequence *seq, char *filepath) -{ - char prefix[FILE_MAX]; - const char *ext = nullptr; - BKE_scene_multiview_view_prefix_get(scene, filepath, prefix, &ext); - - if (seq->views_format != R_IMF_VIEWS_INDIVIDUAL || prefix[0] == '\0') { - return false; - } - - Editing *ed = scene->ed; - bool is_multiview_loaded = false; - int totfiles = seq_num_files(scene, seq->views_format, true); - - for (int i = 0; i < totfiles; i++) { - const char *suffix = BKE_scene_multiview_view_id_suffix_get(&scene->r, i); - char filepath_view[FILE_MAX]; - SNPRINTF(filepath_view, "%s%s%s", prefix, suffix, ext); - - StripAnim *sanim = static_cast(MEM_mallocN(sizeof(StripAnim), "Strip Anim")); - /* Multiview files must be loaded, otherwise it is not possible to detect failure. */ - open_anim_filepath(seq, sanim, filepath_view, true); - - if (sanim->anim == nullptr) { - SEQ_relations_sequence_free_anim(seq); - return false; /* Multiview render failed. */ - } - - index_dir_set(ed, seq, sanim); - BLI_addtail(&seq->anims, sanim); - IMB_suffix_anim(sanim->anim, suffix); - is_multiview_loaded = true; - } - - return is_multiview_loaded; -} - void seq_open_anim_file(Scene *scene, Sequence *seq, bool openfile) { + char dirpath[FILE_MAX]; + char filepath[FILE_MAX]; + StripProxy *proxy; + bool use_proxy; + bool is_multiview_loaded = false; + Editing *ed = scene->ed; + const bool is_multiview = (seq->flag & SEQ_USE_VIEWS) != 0 && + (scene->r.scemode & R_MULTIVIEW) != 0; + if ((seq->anims.first != nullptr) && (((StripAnim *)seq->anims.first)->anim != nullptr) && !openfile) { return; } - /* Reset all the previously created anims. */ + /* reset all the previously created anims */ SEQ_relations_sequence_free_anim(seq); - Editing *ed = scene->ed; - char filepath[FILE_MAX]; BLI_path_join(filepath, sizeof(filepath), seq->strip->dirpath, seq->strip->stripdata->filename); BLI_path_abs(filepath, ID_BLEND_PATH_FROM_GLOBAL(&scene->id)); - bool is_multiview = (seq->flag & SEQ_USE_VIEWS) != 0 && (scene->r.scemode & R_MULTIVIEW) != 0; - bool multiview_is_loaded = false; + proxy = seq->strip->proxy; - if (is_multiview) { - multiview_is_loaded = open_anim_file_multiview(scene, seq, filepath); + use_proxy = proxy && ((proxy->storage & SEQ_STORAGE_PROXY_CUSTOM_DIR) != 0 || + (ed->proxy_storage == SEQ_EDIT_PROXY_DIR_STORAGE)); + + if (use_proxy) { + if (ed->proxy_storage == SEQ_EDIT_PROXY_DIR_STORAGE) { + if (ed->proxy_dir[0] == 0) { + STRNCPY(dirpath, "//BL_proxy"); + } + else { + STRNCPY(dirpath, ed->proxy_dir); + } + } + else { + STRNCPY(dirpath, seq->strip->proxy->dirpath); + } + BLI_path_abs(dirpath, BKE_main_blendfile_path_from_global()); } - if (!is_multiview || !multiview_is_loaded) { - StripAnim *sanim = static_cast(MEM_mallocN(sizeof(StripAnim), "Strip Anim")); + if (is_multiview && seq->views_format == R_IMF_VIEWS_INDIVIDUAL) { + int totfiles = seq_num_files(scene, seq->views_format, true); + char prefix[FILE_MAX]; + const char *ext = nullptr; + int i; + + BKE_scene_multiview_view_prefix_get(scene, filepath, prefix, &ext); + + if (prefix[0] != '\0') { + for (i = 0; i < totfiles; i++) { + const char *suffix = BKE_scene_multiview_view_id_suffix_get(&scene->r, i); + char filepath_view[FILE_MAX]; + StripAnim *sanim = static_cast(MEM_mallocN(sizeof(StripAnim), "Strip Anim")); + + BLI_addtail(&seq->anims, sanim); + + SNPRINTF(filepath_view, "%s%s%s", prefix, suffix, ext); + + if (openfile) { + sanim->anim = openanim(filepath_view, + IB_rect | ((seq->flag & SEQ_FILTERY) ? IB_animdeinterlace : 0), + seq->streamindex, + seq->strip->colorspace_settings.name); + } + else { + sanim->anim = openanim_noload(filepath_view, + IB_rect | + ((seq->flag & SEQ_FILTERY) ? IB_animdeinterlace : 0), + seq->streamindex, + seq->strip->colorspace_settings.name); + } + + if (sanim->anim) { + /* we already have the suffix */ + IMB_suffix_anim(sanim->anim, suffix); + } + else { + if (openfile) { + sanim->anim = openanim(filepath, + IB_rect | ((seq->flag & SEQ_FILTERY) ? IB_animdeinterlace : 0), + seq->streamindex, + seq->strip->colorspace_settings.name); + } + else { + sanim->anim = openanim_noload(filepath, + IB_rect | + ((seq->flag & SEQ_FILTERY) ? IB_animdeinterlace : 0), + seq->streamindex, + seq->strip->colorspace_settings.name); + } + + /* No individual view files - monoscopic, stereo 3d or EXR multi-view. */ + totfiles = 1; + } + + if (sanim->anim && use_proxy) { + seq_proxy_index_dir_set(sanim->anim, dirpath); + } + } + is_multiview_loaded = true; + } + } + + if (is_multiview_loaded == false) { + StripAnim *sanim; + + sanim = static_cast(MEM_mallocN(sizeof(StripAnim), "Strip Anim")); BLI_addtail(&seq->anims, sanim); - open_anim_filepath(seq, sanim, filepath, openfile); - index_dir_set(ed, seq, sanim); + + if (openfile) { + sanim->anim = openanim(filepath, + IB_rect | ((seq->flag & SEQ_FILTERY) ? IB_animdeinterlace : 0), + seq->streamindex, + seq->strip->colorspace_settings.name); + } + else { + sanim->anim = openanim_noload(filepath, + IB_rect | ((seq->flag & SEQ_FILTERY) ? IB_animdeinterlace : 0), + seq->streamindex, + seq->strip->colorspace_settings.name); + } + + if (sanim->anim && use_proxy) { + seq_proxy_index_dir_set(sanim->anim, dirpath); + } } } diff --git a/source/blender/shader_fx/intern/FX_shader_blur.cc b/source/blender/shader_fx/intern/FX_shader_blur.cc index cee71c6b8c2..1df72d69159 100644 --- a/source/blender/shader_fx/intern/FX_shader_blur.cc +++ b/source/blender/shader_fx/intern/FX_shader_blur.cc @@ -11,7 +11,7 @@ #include "BLI_math_vector.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_context.hh" #include "BKE_screen.hh" diff --git a/source/blender/shader_fx/intern/FX_shader_colorize.cc b/source/blender/shader_fx/intern/FX_shader_colorize.cc index 1b490bc733c..b7f205e0ad3 100644 --- a/source/blender/shader_fx/intern/FX_shader_colorize.cc +++ b/source/blender/shader_fx/intern/FX_shader_colorize.cc @@ -13,7 +13,7 @@ #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "DNA_screen_types.h" #include "DNA_shader_fx_types.h" diff --git a/source/blender/shader_fx/intern/FX_shader_flip.cc b/source/blender/shader_fx/intern/FX_shader_flip.cc index ad9872b57b9..bca7b560fc9 100644 --- a/source/blender/shader_fx/intern/FX_shader_flip.cc +++ b/source/blender/shader_fx/intern/FX_shader_flip.cc @@ -15,7 +15,7 @@ #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_context.hh" #include "BKE_screen.hh" diff --git a/source/blender/shader_fx/intern/FX_shader_glow.cc b/source/blender/shader_fx/intern/FX_shader_glow.cc index ea363c7194f..16a6ef57e3c 100644 --- a/source/blender/shader_fx/intern/FX_shader_glow.cc +++ b/source/blender/shader_fx/intern/FX_shader_glow.cc @@ -16,7 +16,7 @@ #include "BLI_math_vector.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_context.hh" #include "BKE_modifier.hh" diff --git a/source/blender/shader_fx/intern/FX_shader_pixel.cc b/source/blender/shader_fx/intern/FX_shader_pixel.cc index b72903b72e2..b8e91d84b2a 100644 --- a/source/blender/shader_fx/intern/FX_shader_pixel.cc +++ b/source/blender/shader_fx/intern/FX_shader_pixel.cc @@ -10,7 +10,7 @@ #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_context.hh" #include "BKE_screen.hh" diff --git a/source/blender/shader_fx/intern/FX_shader_rim.cc b/source/blender/shader_fx/intern/FX_shader_rim.cc index d949309a558..4f7f4f17a58 100644 --- a/source/blender/shader_fx/intern/FX_shader_rim.cc +++ b/source/blender/shader_fx/intern/FX_shader_rim.cc @@ -13,7 +13,7 @@ #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_context.hh" #include "BKE_screen.hh" diff --git a/source/blender/shader_fx/intern/FX_shader_shadow.cc b/source/blender/shader_fx/intern/FX_shader_shadow.cc index baecb8e711c..cb68f85867b 100644 --- a/source/blender/shader_fx/intern/FX_shader_shadow.cc +++ b/source/blender/shader_fx/intern/FX_shader_shadow.cc @@ -15,7 +15,7 @@ #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_context.hh" #include "BKE_lib_query.hh" diff --git a/source/blender/shader_fx/intern/FX_shader_swirl.cc b/source/blender/shader_fx/intern/FX_shader_swirl.cc index b342d76981a..55e80ef3c31 100644 --- a/source/blender/shader_fx/intern/FX_shader_swirl.cc +++ b/source/blender/shader_fx/intern/FX_shader_swirl.cc @@ -16,7 +16,7 @@ #include "BLI_math_base.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_context.hh" #include "BKE_lib_query.hh" diff --git a/source/blender/shader_fx/intern/FX_shader_wave.cc b/source/blender/shader_fx/intern/FX_shader_wave.cc index f5145d61acd..d5a3823ee4e 100644 --- a/source/blender/shader_fx/intern/FX_shader_wave.cc +++ b/source/blender/shader_fx/intern/FX_shader_wave.cc @@ -18,7 +18,7 @@ #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "UI_interface.hh" #include "UI_resources.hh" diff --git a/source/blender/shader_fx/intern/FX_ui_common.cc b/source/blender/shader_fx/intern/FX_ui_common.cc index 1517d9376f5..941c2703df2 100644 --- a/source/blender/shader_fx/intern/FX_ui_common.cc +++ b/source/blender/shader_fx/intern/FX_ui_common.cc @@ -23,7 +23,7 @@ #include "ED_object.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "UI_interface.hh" #include "UI_resources.hh" diff --git a/source/blender/simulation/intern/implicit_blender.cc b/source/blender/simulation/intern/implicit_blender.cc index a53a15676bf..613e12ab0b4 100644 --- a/source/blender/simulation/intern/implicit_blender.cc +++ b/source/blender/simulation/intern/implicit_blender.cc @@ -964,7 +964,7 @@ static int cg_filtered_pre(lfVector *dv, delta0 = deltaNew * sqrt(conjgrad_epsilon); # ifdef DEBUG_TIME - double start = BLI_time_now_seconds(); + double start = BLI_check_seconds_timer(); # endif while ((deltaNew > delta0) && (iterations < conjgrad_looplimit)) { @@ -992,7 +992,7 @@ static int cg_filtered_pre(lfVector *dv, } # ifdef DEBUG_TIME - double end = BLI_time_now_seconds(); + double end = BLI_check_seconds_timer(); printf("cg_filtered_pre time: %f\n", float(end - start)); # endif @@ -1073,7 +1073,7 @@ static int cg_filtered_pre(lfVector *dv, # endif # ifdef DEBUG_TIME - double start = BLI_time_now_seconds(); + double start = BLI_check_seconds_timer(); # endif tol = (0.01 * 0.2); @@ -1103,7 +1103,7 @@ static int cg_filtered_pre(lfVector *dv, } # ifdef DEBUG_TIME - double end = BLI_time_now_seconds(); + double end = BLI_check_seconds_timer(); printf("cg_filtered_pre time: %f\n", float(end - start)); # endif @@ -1136,7 +1136,7 @@ bool SIM_mass_spring_solve_velocities(Implicit_Data *data, float dt, ImplicitSol add_lfvectorS_lfvectorS(data->B, data->F, dt, dFdXmV, (dt * dt), numverts); # ifdef DEBUG_TIME - double start = BLI_time_now_seconds(); + double start = BLI_check_seconds_timer(); # endif /* Conjugate gradient algorithm to solve Ax=b. */ @@ -1145,7 +1145,7 @@ bool SIM_mass_spring_solve_velocities(Implicit_Data *data, float dt, ImplicitSol // cg_filtered_pre(id->dV, id->A, id->B, id->z, id->S, id->P, id->Pinv, id->bigI); # ifdef DEBUG_TIME - double end = BLI_time_now_seconds(); + double end = BLI_check_seconds_timer(); printf("cg_filtered calc time: %f\n", float(end - start)); # endif diff --git a/source/blender/simulation/intern/implicit_eigen.cc b/source/blender/simulation/intern/implicit_eigen.cc index 728bfaac861..6bf489d53cd 100644 --- a/source/blender/simulation/intern/implicit_eigen.cc +++ b/source/blender/simulation/intern/implicit_eigen.cc @@ -59,7 +59,7 @@ extern "C" { # include "BKE_cloth.hh" # include "BKE_collision.h" # include "BKE_effect.h" -# include "BKE_global.hh" +# include "BKE_global.h" # include "SIM_mass_spring.h" } diff --git a/source/blender/windowmanager/WM_api.hh b/source/blender/windowmanager/WM_api.hh index 0f90cee27d3..b7953353f1b 100644 --- a/source/blender/windowmanager/WM_api.hh +++ b/source/blender/windowmanager/WM_api.hh @@ -17,14 +17,9 @@ #include #include -#include "DNA_windowmanager_types.h" - -#include "BLI_array.hh" #include "BLI_compiler_attrs.h" -#include "BLI_function_ref.hh" -#include "BLI_math_vector_types.hh" #include "BLI_sys_types.h" - +#include "DNA_windowmanager_types.h" #include "WM_keymap.hh" #include "WM_types.hh" @@ -33,6 +28,7 @@ struct GHashIterator; struct GPUViewport; struct ID; struct IDProperty; +struct IDRemapper; struct ImBuf; struct ImageFormatData; struct Main; @@ -75,10 +71,6 @@ struct wmXrRuntimeData; struct wmXrSessionState; #endif -namespace blender::bke::id { -class IDRemapper; -} - namespace blender::asset_system { class AssetRepresentation; } @@ -330,7 +322,7 @@ void WM_system_gpu_context_dispose(void *context); void WM_system_gpu_context_activate(void *context); void WM_system_gpu_context_release(void *context); -/** #WM_window_open alignment. */ +/* #WM_window_open alignment */ enum eWindowAlignment { WIN_ALIGN_ABSOLUTE = 0, WIN_ALIGN_LOCATION_CENTER, @@ -365,7 +357,7 @@ void WM_window_set_dpi(const wmWindow *win); bool WM_stereo3d_enabled(wmWindow *win, bool only_fullscreen_test); -/* `wm_files.cc`. */ +/* wm_files.cc */ void WM_file_autoexec_init(const char *filepath); bool WM_file_read(bContext *C, const char *filepath, ReportList *reports); @@ -580,14 +572,14 @@ void WM_event_remove_handlers(bContext *C, ListBase *handlers); wmEventHandler_Dropbox *WM_event_add_dropbox_handler(ListBase *handlers, ListBase *dropboxes); -/* Mouse. */ +/* mouse */ void WM_event_add_mousemove(wmWindow *win); #ifdef WITH_INPUT_NDOF -/* 3D mouse. */ +/* 3D mouse */ void WM_ndof_deadzone_set(float deadzone); #endif -/* Notifiers. */ +/* notifiers */ void WM_event_add_notifier_ex(wmWindowManager *wm, const wmWindow *win, unsigned int type, @@ -598,10 +590,9 @@ void WM_main_add_notifier(unsigned int type, void *reference); * Clear notifiers by reference, Used so listeners don't act on freed data. */ void WM_main_remove_notifier_reference(const void *reference); -void WM_main_remap_editor_id_reference(const blender::bke::id::IDRemapper &mappings); - -/* Reports. */ +void WM_main_remap_editor_id_reference(const IDRemapper *mappings); +/* reports */ /** * Show the report in the info header. * \param win: When NULL, a best-guess is used. @@ -636,14 +627,12 @@ wmEvent *wm_event_add(wmWindow *win, const wmEvent *event_to_add) ATTR_NONNULL(1 void wm_event_init_from_window(wmWindow *win, wmEvent *event); -/** - * At maximum, every time_step seconds it triggers `event_type` events. - */ -wmTimer *WM_event_timer_add(wmWindowManager *wm, wmWindow *win, int event_type, double time_step); +/* at maximum, every timestep seconds it triggers event_type events */ +wmTimer *WM_event_timer_add(wmWindowManager *wm, wmWindow *win, int event_type, double timestep); wmTimer *WM_event_timer_add_notifier(wmWindowManager *wm, wmWindow *win, unsigned int type, - double time_step); + double timestep); void WM_event_timer_free_data(wmTimer *timer); /** @@ -694,9 +683,12 @@ int WM_menu_invoke(bContext *C, wmOperator *op, const wmEvent *event); * Call an existent menu. The menu can be created in C or Python. */ void WM_menu_name_call(bContext *C, const char *menu_name, short context); - +/** + * Similar to #WM_enum_search_invoke, but draws previews. Also, this can't + * be used as invoke callback directly since it needs additional info. + */ +int WM_enum_search_invoke_previews(bContext *C, wmOperator *op, short prv_cols, short prv_rows); int WM_enum_search_invoke(bContext *C, wmOperator *op, const wmEvent *event); - /** * Invoke callback, confirm menu + exec. */ @@ -721,7 +713,7 @@ int WM_operator_confirm_ex(bContext *C, */ int WM_operator_filesel(bContext *C, wmOperator *op, const wmEvent *event); bool WM_operator_filesel_ensure_ext_imtype(wmOperator *op, const ImageFormatData *im_format); -/** Callback for #wmOperatorType.poll. */ +/** Callback for #wmOperatorType.poll */ bool WM_operator_winactive(bContext *C); /** * Invoke callback, exec + redo popup. @@ -741,8 +733,8 @@ int WM_operator_props_popup(bContext *C, wmOperator *op, const wmEvent *event); int WM_operator_props_dialog_popup(bContext *C, wmOperator *op, int width, - std::optional title = std::nullopt, - std::optional confirm_text = std::nullopt); + const char *title = nullptr, + const char *confirm_text = nullptr); int WM_operator_redo_popup(bContext *C, wmOperator *op); int WM_operator_ui_popup(bContext *C, wmOperator *op, int width); @@ -824,7 +816,7 @@ int WM_operator_name_call_ptr(bContext *C, wmOperatorCallContext context, PointerRNA *properties, const wmEvent *event); -/** See #WM_operator_name_call_ptr. */ +/** See #WM_operator_name_call_ptr */ int WM_operator_name_call(bContext *C, const char *opstring, wmOperatorCallContext context, @@ -1048,8 +1040,7 @@ void WM_operator_properties_select_walk_direction(wmOperatorType *ot); void WM_operator_properties_generic_select(wmOperatorType *ot); struct CheckerIntervalParams { - /** Bypass when set to zero. */ - int nth; + int nth; /* bypass when set to zero */ int skip; int offset; }; @@ -1120,11 +1111,9 @@ wmOperatorType *WM_operatortype_find(const char *idname, bool quiet); * \note Caller must free. */ void WM_operatortype_iter(GHashIterator *ghi); -void WM_operatortype_append(void (*opfunc)(wmOperatorType *ot)); -void WM_operatortype_append_ptr(void (*opfunc)(wmOperatorType *ot, void *userdata), - void *userdata); -void WM_operatortype_append_macro_ptr(void (*opfunc)(wmOperatorType *ot, void *userdata), - void *userdata); +void WM_operatortype_append(void (*opfunc)(wmOperatorType *)); +void WM_operatortype_append_ptr(void (*opfunc)(wmOperatorType *, void *), void *userdata); +void WM_operatortype_append_macro_ptr(void (*opfunc)(wmOperatorType *, void *), void *userdata); /** * Called on initialize WM_exit(). */ @@ -1135,12 +1124,12 @@ bool WM_operatortype_remove(const char *idname); */ void WM_operatortype_last_properties_clear_all(); -void WM_operatortype_idname_visit_for_search( - const bContext *C, - PointerRNA *ptr, - PropertyRNA *prop, - const char *edit_text, - blender::FunctionRef visit_fn); +void WM_operatortype_idname_visit_for_search(const bContext *C, + PointerRNA *ptr, + PropertyRNA *prop, + const char *edit_text, + StringPropertySearchVisitFunc visit_fn, + void *visit_user_data); /** * Tag all operator-properties of \a ot defined after calling this, until @@ -1190,9 +1179,6 @@ std::string WM_operatortype_description_or_name(bContext *C, wmOperatorType *ot, PointerRNA *properties); -/** Check the #OPTYPE_DEPENDS_ON_CURSOR flag and the callback. */ -bool WM_operator_depends_on_cursor(bContext &C, wmOperatorType &ot, PointerRNA *properties); - /* `wm_operator_utils.cc` */ /** @@ -1245,12 +1231,12 @@ void WM_menutype_freelink(MenuType *mt); void WM_menutype_free(); bool WM_menutype_poll(bContext *C, MenuType *mt); -void WM_menutype_idname_visit_for_search( - const bContext *C, - PointerRNA *ptr, - PropertyRNA *prop, - const char *edit_text, - blender::FunctionRef visit_fn); +void WM_menutype_idname_visit_for_search(const bContext *C, + PointerRNA *ptr, + PropertyRNA *prop, + const char *edit_text, + StringPropertySearchVisitFunc visit_fn, + void *visit_user_data); /* `wm_panel_type.cc` */ @@ -1263,12 +1249,12 @@ PanelType *WM_paneltype_find(const char *idname, bool quiet); bool WM_paneltype_add(PanelType *pt); void WM_paneltype_remove(PanelType *pt); -void WM_paneltype_idname_visit_for_search( - const bContext *C, - PointerRNA *ptr, - PropertyRNA *prop, - const char *edit_text, - blender::FunctionRef visit_fn); +void WM_paneltype_idname_visit_for_search(const bContext *C, + PointerRNA *ptr, + PropertyRNA *prop, + const char *edit_text, + StringPropertySearchVisitFunc visit_fn, + void *visit_user_data); /* `wm_gesture_ops.cc` */ @@ -1286,8 +1272,10 @@ int WM_gesture_lasso_modal(bContext *C, wmOperator *op, const wmEvent *event); void WM_gesture_lasso_cancel(bContext *C, wmOperator *op); /** * helper function, we may want to add options for conversion to view space + * + * caller must free. */ -blender::Array WM_gesture_lasso_path_to_array(bContext *C, wmOperator *op); +const int (*WM_gesture_lasso_path_to_array(bContext *C, wmOperator *op, int *mcoords_len))[2]; int WM_gesture_straightline_invoke(bContext *C, wmOperator *op, const wmEvent *event); /** @@ -1311,7 +1299,7 @@ int WM_gesture_straightline_modal(bContext *C, wmOperator *op, const wmEvent *ev int WM_gesture_straightline_oneshot_modal(bContext *C, wmOperator *op, const wmEvent *event); void WM_gesture_straightline_cancel(bContext *C, wmOperator *op); -/* Gesture manager API. */ +/* Gesture manager API */ /** * Context checked on having screen, window and area. @@ -1380,7 +1368,7 @@ int WM_operator_flag_only_pass_through_on_press(int retval, const wmEvent *event * Note that \a poin should be valid allocated and not on stack. */ void WM_event_start_drag( - bContext *C, int icon, eWM_DragDataType type, void *poin, unsigned int flags); + bContext *C, int icon, eWM_DragDataType type, void *poin, double value, unsigned int flags); /** * Create and fill the dragging data, but don't start dragging just yet (unlike * #WM_event_start_drag()). Must be followed up by #WM_event_start_prepared_drag(), otherwise the @@ -1389,20 +1377,20 @@ void WM_event_start_drag( * Note that \a poin should be valid allocated and not on stack. */ wmDrag *WM_drag_data_create( - bContext *C, int icon, eWM_DragDataType type, void *poin, unsigned int flags); + bContext *C, int icon, eWM_DragDataType type, void *poin, double value, unsigned int flags); /** * Invoke dragging using the given \a drag data. */ void WM_event_start_prepared_drag(bContext *C, wmDrag *drag); -void WM_event_drag_image(wmDrag *drag, const ImBuf *imb, float scale); +void WM_event_drag_image(wmDrag *, const ImBuf *, float scale); void WM_drag_free(wmDrag *drag); void WM_drag_data_free(eWM_DragDataType dragtype, void *poin); void WM_drag_free_list(ListBase *lb); wmDropBox *WM_dropbox_add(ListBase *lb, const char *idname, - bool (*poll)(bContext *C, wmDrag *drag, const wmEvent *event), - void (*copy)(bContext *C, wmDrag *drag, wmDropBox *drop), - void (*cancel)(Main *bmain, wmDrag *drag, wmDropBox *drop), + bool (*poll)(bContext *, wmDrag *, const wmEvent *event), + void (*copy)(bContext *, wmDrag *, wmDropBox *), + void (*cancel)(Main *, wmDrag *, wmDropBox *), WMDropboxTooltipFunc tooltip); /** * Ensure operator pointers & properties are valid after operators have been added/removed. @@ -1416,7 +1404,7 @@ void WM_drag_draw_default_fn(bContext *C, wmWindow *win, wmDrag *drag, const int */ ListBase *WM_dropboxmap_find(const char *idname, int spaceid, int regionid); -/* ID drag and drop. */ +/* ID drag and drop */ /** * \param flag_extra: Additional linking flags (from #eFileSel_Params_Flag). @@ -1435,7 +1423,7 @@ bool WM_drag_is_ID_type(const wmDrag *drag, int idcode); * \note Does not store \a asset in any way, so it's fine to pass a temporary. */ wmDragAsset *WM_drag_create_asset_data(const blender::asset_system::AssetRepresentation *asset, - int /*eAssetImportMethod*/ import_method); + int /* #eAssetImportMethod */ import_method); wmDragAsset *WM_drag_get_asset_data(const wmDrag *drag, int idcode); AssetMetaData *WM_drag_get_asset_meta_data(const wmDrag *drag, int idcode); @@ -1501,19 +1489,16 @@ bool WM_drag_has_path_file_type(const wmDrag *drag, int file_type); * type-bits set, so `ELEM()` like comparison is possible. To check all paths or to do a bit-flag * check use `WM_drag_has_path_file_type(drag, file_type)` instead. */ -int /*eFileSel_File_Types*/ WM_drag_get_path_file_type(const wmDrag *drag); +int /* #eFileSel_File_Types */ WM_drag_get_path_file_type(const wmDrag *drag); -const std::string &WM_drag_get_string(const wmDrag *drag); -std::string WM_drag_get_string_firstline(const wmDrag *drag); - -/* Set OpenGL viewport and scissor. */ +/* Set OpenGL viewport and scissor */ void wmViewport(const rcti *winrct); void wmPartialViewport(rcti *drawrct, const rcti *winrct, const rcti *partialrct); void wmWindowViewport(wmWindow *win); -/* OpenGL utilities with safety check. */ +/* OpenGL utilities with safety check */ void wmOrtho2(float x1, float x2, float y1, float y2); -/* Use for conventions (avoid hard-coded offsets all over). */ +/* use for conventions (avoid hard-coded offsets all over) */ /** * Default pixel alignment for regions. @@ -1522,7 +1507,7 @@ void wmOrtho2_region_pixelspace(const ARegion *region); void wmOrtho2_pixelspace(float x, float y); void wmGetProjectionMatrix(float mat[4][4], const rcti *winrct); -/* Threaded Jobs Manager. */ +/* threaded Jobs Manager */ enum eWM_JobFlag { WM_JOB_PRIORITY = (1 << 0), WM_JOB_EXCL_RENDER = (1 << 1), @@ -1539,9 +1524,9 @@ enum eWM_JobType { WM_JOB_TYPE_COMPOSITE, WM_JOB_TYPE_RENDER, - WM_JOB_TYPE_RENDER_PREVIEW, /* UI preview. */ + WM_JOB_TYPE_RENDER_PREVIEW, /* UI preview */ /** Job for the UI to load previews from the file system (uses OS thumbnail cache). */ - WM_JOB_TYPE_LOAD_PREVIEW, /* UI preview. */ + WM_JOB_TYPE_LOAD_PREVIEW, /* UI preview */ WM_JOB_TYPE_OBJECT_SIM_OCEAN, WM_JOB_TYPE_OBJECT_SIM_FLUID, WM_JOB_TYPE_OBJECT_BAKE_TEXTURE, @@ -1568,8 +1553,8 @@ enum eWM_JobType { WM_JOB_TYPE_CALCULATE_SIMULATION_NODES, WM_JOB_TYPE_BAKE_GEOMETRY_NODES, WM_JOB_TYPE_UV_PACK, - /* Add as needed, bake, seq proxy build - * if having hard coded values is a problem. */ + /* add as needed, bake, seq proxy build + * if having hard coded values is a problem */ }; /** @@ -1599,13 +1584,13 @@ void *WM_jobs_customdata_from_type(wmWindowManager *wm, const void *owner, int j bool WM_jobs_is_running(const wmJob *wm_job); bool WM_jobs_is_stopped(const wmWindowManager *wm, const void *owner); -void *WM_jobs_customdata_get(wmJob *wm_job); -void WM_jobs_customdata_set(wmJob *wm_job, void *customdata, void (*free)(void *)); -void WM_jobs_timer(wmJob *wm_job, double time_step, unsigned int note, unsigned int endnote); -void WM_jobs_delay_start(wmJob *wm_job, double delay_time); +void *WM_jobs_customdata_get(wmJob *); +void WM_jobs_customdata_set(wmJob *, void *customdata, void (*free)(void *)); +void WM_jobs_timer(wmJob *, double timestep, unsigned int note, unsigned int endnote); +void WM_jobs_delay_start(wmJob *, double delay_time); using wm_jobs_start_callback = void (*)(void *custom_data, wmJobWorkerStatus *worker_status); -void WM_jobs_callbacks(wmJob *wm_job, +void WM_jobs_callbacks(wmJob *, wm_jobs_start_callback startjob, void (*initjob)(void *), void (*update)(void *), @@ -1623,7 +1608,7 @@ void WM_jobs_callbacks_ex(wmJob *wm_job, * If job running, the same owner gave it a new job. * if different owner starts existing #wmJob::startjob, it suspends itself. */ -void WM_jobs_start(wmWindowManager *wm, wmJob *wm_job); +void WM_jobs_start(wmWindowManager *wm, wmJob *); /** * Signal job(s) from this owner or callback to stop, timer is required to get handled. */ @@ -1645,8 +1630,8 @@ void WM_jobs_kill_type(wmWindowManager *wm, const void *owner, int job_type); bool WM_jobs_has_running(const wmWindowManager *wm); bool WM_jobs_has_running_type(const wmWindowManager *wm, int job_type); -void WM_job_main_thread_lock_acquire(wmJob *wm_job); -void WM_job_main_thread_lock_release(wmJob *wm_job); +void WM_job_main_thread_lock_acquire(wmJob *job); +void WM_job_main_thread_lock_release(wmJob *job); /* Clipboard. */ @@ -1681,16 +1666,14 @@ ImBuf *WM_clipboard_image_get(); */ bool WM_clipboard_image_set(ImBuf *ibuf) ATTR_NONNULL(1); -/* Progress. */ +/* progress */ void WM_progress_set(wmWindow *win, float progress); void WM_progress_clear(wmWindow *win); -/* Draw (for screenshot). */ +/* Draw (for screenshot) */ -void *WM_draw_cb_activate(wmWindow *win, - void (*draw)(const wmWindow *win, void *customdata), - void *customdata); +void *WM_draw_cb_activate(wmWindow *win, void (*draw)(const wmWindow *, void *), void *customdata); void WM_draw_cb_exit(wmWindow *win, void *handle); /** * High level function to redraw windows. @@ -1708,7 +1691,7 @@ void WM_draw_region_viewport_ensure(Scene *scene, ARegion *region, short space_t void WM_draw_region_viewport_bind(ARegion *region); void WM_draw_region_viewport_unbind(ARegion *region); -/* Region drawing. */ +/* Region drawing */ void WM_draw_region_free(ARegion *region); GPUViewport *WM_draw_region_get_viewport(ARegion *region); @@ -1722,10 +1705,6 @@ void WM_main_playanim(int argc, const char **argv); */ bool write_crash_blend(); -bool WM_autosave_is_scheduled(wmWindowManager *wm); -/** Flushes all changes from edit modes and stores the auto-save file. */ -void WM_autosave_write(wmWindowManager *wm, Main *bmain); - /** * Lock the interface for any communication. */ @@ -1916,7 +1895,7 @@ void WM_xr_session_state_navigation_reset(wmXrSessionState *state); ARegionType *WM_xr_surface_controller_region_type_get(); -/* `wm_xr_actions.cc`. */ +/* wm_xr_actions.c */ /* XR action functions to be called pre-XR session start. * NOTE: The "destroy" functions can also be called post-session start. */ diff --git a/source/blender/windowmanager/WM_keymap.hh b/source/blender/windowmanager/WM_keymap.hh index 27dc70b3f1f..fea3f9c5f20 100644 --- a/source/blender/windowmanager/WM_keymap.hh +++ b/source/blender/windowmanager/WM_keymap.hh @@ -8,16 +8,13 @@ * \ingroup wm */ -#include -#include - #include "BLI_utildefines.h" #include "DNA_windowmanager_types.h" #include "WM_types.hh" struct EnumPropertyItem; -/* Key Configuration. */ +/* Key Configuration */ void WM_keyconfig_init(bContext *C); void WM_keyconfig_reload(bContext *C); @@ -46,19 +43,19 @@ void WM_keyconfig_update_suppress_end(); void WM_keyconfig_update_postpone_begin(); void WM_keyconfig_update_postpone_end(); -/** Keymap. */ +/* Keymap */ /** Parameters for matching events, passed into functions that create key-map items. */ struct KeyMapItem_Params { - /** #wmKeyMapItem.type. */ + /** #wmKeyMapItem.type */ int16_t type; - /** #wmKeyMapItem.val. */ + /** #wmKeyMapItem.val */ int8_t value; - /** #wmKeyMapItem `ctrl, shift, alt, oskey`. */ + /** #wmKeyMapItem `ctrl, shift, alt, oskey` */ int8_t modifier; - /** #wmKeyMapItem.keymodifier. */ + /** #wmKeyMapItem.keymodifier */ int16_t keymodifier; - /** #wmKeyMapItem.direction. */ + /** #wmKeyMapItem.direction */ int8_t direction; }; @@ -73,7 +70,10 @@ wmKeyMapItem *WM_keymap_add_item(wmKeyMap *keymap, wmKeyMapItem *WM_keymap_add_item_copy(wmKeyMap *keymap, wmKeyMapItem *kmi_src); void WM_keymap_remove_item(wmKeyMap *keymap, wmKeyMapItem *kmi); -std::optional WM_keymap_item_to_string(const wmKeyMapItem *kmi, bool compact); +int WM_keymap_item_to_string(const wmKeyMapItem *kmi, + bool compact, + char *result, + int result_maxncpy); wmKeyMap *WM_keymap_list_find(ListBase *lb, const char *idname, int spaceid, int regionid); wmKeyMap *WM_keymap_list_find_spaceid_or_empty(ListBase *lb, @@ -93,9 +93,9 @@ bool WM_keymap_poll(bContext *C, wmKeyMap *keymap); wmKeyMapItem *WM_keymap_item_find_id(wmKeyMap *keymap, int id); bool WM_keymap_item_compare(const wmKeyMapItem *k1, const wmKeyMapItem *k2); -/* `wm_keymap_utils.cc`. */ +/* keymap_utils.c */ -/* Wrappers for #WM_keymap_add_item. */ +/* Wrappers for #WM_keymap_add_item */ /** * Menu wrapper for #WM_keymap_add_item. @@ -135,14 +135,18 @@ bool WM_keymap_uses_event_modifier(const wmKeyMap *keymap, int event_modifier); void WM_keymap_fix_linking(); -/* Modal Keymap. */ +/* Modal Keymap */ -std::optional WM_modalkeymap_items_to_string(const wmKeyMap *km, - int propvalue, - bool compact); -std::optional WM_modalkeymap_operator_items_to_string(wmOperatorType *ot, - int propvalue, - bool compact); +int WM_modalkeymap_items_to_string( + const wmKeyMap *km, int propvalue, bool compact, char *result, int result_maxncpy); +int WM_modalkeymap_operator_items_to_string( + wmOperatorType *ot, int propvalue, bool compact, char *result, int result_maxncpy); +char *WM_modalkeymap_operator_items_to_string_buf(wmOperatorType *ot, + int propvalue, + bool compact, + int result_maxncpy, + int *r_available_len, + char **r_result); wmKeyMap *WM_modalkeymap_ensure(wmKeyConfig *keyconf, const char *idname, @@ -155,7 +159,7 @@ wmKeyMapItem *WM_modalkeymap_add_item_str(wmKeyMap *km, const wmKeyMapItem *WM_modalkeymap_find_propvalue(const wmKeyMap *km, int propvalue); void WM_modalkeymap_assign(wmKeyMap *km, const char *opname); -/* Keymap Editor. */ +/* Keymap Editor */ void WM_keymap_restore_to_default(wmKeyMap *keymap, wmWindowManager *wm); /** @@ -165,17 +169,19 @@ void WM_keymap_item_properties_reset(wmKeyMapItem *kmi, IDProperty *properties); void WM_keymap_item_restore_to_default(wmWindowManager *wm, wmKeyMap *keymap, wmKeyMapItem *kmi); int WM_keymap_item_map_type_get(const wmKeyMapItem *kmi); -/* Key Event. */ +/* Key Event */ const char *WM_key_event_string(short type, bool compact); -std::optional WM_keymap_item_raw_to_string(short shift, - short ctrl, - short alt, - short oskey, - short keymodifier, - short val, - short type, - bool compact); +int WM_keymap_item_raw_to_string(short shift, + short ctrl, + short alt, + short oskey, + short keymodifier, + short val, + short type, + bool compact, + char *result, + int result_maxncpy); /** * \param include_mask, exclude_mask: * Event types to include/exclude when looking up keys (#eEventType_Mask). @@ -187,11 +193,13 @@ wmKeyMapItem *WM_key_event_operator(const bContext *C, short include_mask, short exclude_mask, wmKeyMap **r_keymap); -std::optional WM_key_event_operator_string(const bContext *C, - const char *opname, - wmOperatorCallContext opcontext, - IDProperty *properties, - bool is_strict); +char *WM_key_event_operator_string(const bContext *C, + const char *opname, + wmOperatorCallContext opcontext, + IDProperty *properties, + bool is_strict, + char *result, + int result_maxncpy); wmKeyMapItem *WM_key_event_operator_from_keymap(wmKeyMap *keymap, const char *opname, diff --git a/source/blender/windowmanager/WM_types.hh b/source/blender/windowmanager/WM_types.hh index 3ee68207f9d..3bd132a83ec 100644 --- a/source/blender/windowmanager/WM_types.hh +++ b/source/blender/windowmanager/WM_types.hh @@ -112,22 +112,18 @@ struct wmWindowManager; #include "BLI_compiler_attrs.h" #include "BLI_utildefines.h" #include "BLI_vector.hh" - #include "DNA_listBase.h" #include "DNA_uuid_types.h" #include "DNA_vec_types.h" #include "DNA_xr_types.h" - -#include "BKE_wm_runtime.hh" - #include "RNA_types.hh" -/* Exported types for WM. */ +/* exported types for WM */ #include "gizmo/WM_gizmo_types.hh" #include "wm_cursors.hh" #include "wm_event_types.hh" -/* Include external gizmo API's. */ +/* Include external gizmo API's */ #include "gizmo/WM_gizmo_api.hh" namespace blender::asset_system { @@ -211,14 +207,14 @@ enum eWM_CursorWrapAxis { * rna_ui.cc contains EnumPropertyItem's of these, keep in sync. */ enum wmOperatorCallContext { - /* If there's invoke, call it, otherwise exec. */ + /* if there's invoke, call it, otherwise exec */ WM_OP_INVOKE_DEFAULT, WM_OP_INVOKE_REGION_WIN, WM_OP_INVOKE_REGION_CHANNELS, WM_OP_INVOKE_REGION_PREVIEW, WM_OP_INVOKE_AREA, WM_OP_INVOKE_SCREEN, - /* Only call exec. */ + /* only call exec */ WM_OP_EXEC_DEFAULT, WM_OP_EXEC_REGION_WIN, WM_OP_EXEC_REGION_CHANNELS, @@ -233,7 +229,7 @@ enum wmOperatorCallContext { #define WM_OP_CONTEXT_HAS_REGION(type) \ (WM_OP_CONTEXT_HAS_AREA(type) && !ELEM(type, WM_OP_INVOKE_AREA, WM_OP_EXEC_AREA)) -/** Property tags for #RNA_OperatorProperties. */ +/* property tags for RNA_OperatorProperties */ enum eOperatorPropTags { OP_PROP_TAG_ADVANCED = (1 << 0), }; @@ -332,7 +328,7 @@ struct wmNotifier { * 0x000000FF; action */ -/* Category. */ +/* category */ #define NOTE_CATEGORY 0xFF000000 #define NOTE_CATEGORY_TAG_CLEARED NOTE_CATEGORY #define NC_WM (1 << 24) @@ -369,7 +365,7 @@ struct wmNotifier { /* Changes to the active viewer path. */ #define NC_VIEWER_PATH (28 << 24) -/* Data type, 256 entries is enough, it can overlap. */ +/* data type, 256 entries is enough, it can overlap */ #define NOTE_DATA 0x00FF0000 /* NC_WM (window-manager). */ @@ -382,7 +378,7 @@ struct wmNotifier { #define ND_XR_DATA_CHANGED (7 << 16) #define ND_LIB_OVERRIDE_CHANGED (8 << 16) -/* NC_SCREEN. */ +/* NC_SCREEN */ #define ND_LAYOUTBROWSE (1 << 16) #define ND_LAYOUTDELETE (2 << 16) #define ND_ANIMPLAY (4 << 16) @@ -392,7 +388,7 @@ struct wmNotifier { #define ND_WORKSPACE_SET (8 << 16) #define ND_WORKSPACE_DELETE (9 << 16) -/* NC_SCENE Scene. */ +/* NC_SCENE Scene */ #define ND_SCENEBROWSE (1 << 16) #define ND_MARKERS (2 << 16) #define ND_FRAME (3 << 16) @@ -417,7 +413,7 @@ struct wmNotifier { #define ND_WORLD (92 << 16) #define ND_LAYER_CONTENT (101 << 16) -/* NC_OBJECT Object. */ +/* NC_OBJECT Object */ #define ND_TRANSFORM (18 << 16) #define ND_OB_SHADING (19 << 16) #define ND_POSE (20 << 16) @@ -438,24 +434,24 @@ struct wmNotifier { #define ND_DRAW_ANIMVIZ (33 << 16) #define ND_BONE_COLLECTION (34 << 16) -/* NC_MATERIAL Material. */ +/* NC_MATERIAL Material */ #define ND_SHADING (30 << 16) #define ND_SHADING_DRAW (31 << 16) #define ND_SHADING_LINKS (32 << 16) #define ND_SHADING_PREVIEW (33 << 16) -/* NC_LAMP Light. */ +/* NC_LAMP Light */ #define ND_LIGHTING (40 << 16) #define ND_LIGHTING_DRAW (41 << 16) -/* NC_WORLD World. */ +/* NC_WORLD World */ #define ND_WORLD_DRAW (45 << 16) -/* NC_TEXT Text. */ +/* NC_TEXT Text */ #define ND_CURSOR (50 << 16) #define ND_DISPLAY (51 << 16) -/* NC_ANIMATION Animato. */ +/* NC_ANIMATION Animato */ #define ND_KEYFRAME (70 << 16) #define ND_KEYFRAME_PROP (71 << 16) #define ND_ANIMCHAN (72 << 16) @@ -464,23 +460,23 @@ struct wmNotifier { #define ND_FCURVES_ORDER (75 << 16) #define ND_NLA_ORDER (76 << 16) -/* NC_GPENCIL. */ +/* NC_GPENCIL */ #define ND_GPENCIL_EDITMODE (85 << 16) -/* NC_GEOM Geometry. */ +/* NC_GEOM Geometry */ /* Mesh, Curve, MetaBall, Armature, etc. */ #define ND_SELECT (90 << 16) #define ND_DATA (91 << 16) #define ND_VERTEX_GROUP (92 << 16) -/* NC_NODE Nodes. */ +/* NC_NODE Nodes */ /* Influences which menus node assets are included in. */ #define ND_NODE_ASSET_DATA (1 << 16) -/* NC_SPACE. */ -#define ND_SPACE_CONSOLE (1 << 16) /* General redraw. */ -#define ND_SPACE_INFO_REPORT (2 << 16) /* Update for reports, could specify type. */ +/* NC_SPACE */ +#define ND_SPACE_CONSOLE (1 << 16) /* general redraw */ +#define ND_SPACE_INFO_REPORT (2 << 16) /* update for reports, could specify type */ #define ND_SPACE_INFO (3 << 16) #define ND_SPACE_IMAGE (4 << 16) #define ND_SPACE_FILE_PARAMS (5 << 16) @@ -505,7 +501,7 @@ struct wmNotifier { /* Not a space itself, but a part of another space. */ #define ND_REGIONS_ASSET_SHELF (23 << 16) -/* NC_ASSET. */ +/* NC_ASSET */ /* Denotes that the AssetList is done reading some previews. NOT that the preview generation of * assets is done. */ #define ND_ASSET_LIST (1 << 16) @@ -516,10 +512,10 @@ struct wmNotifier { * action. */ #define ND_ASSET_CATALOGS (4 << 16) -/* Subtype, 256 entries too. */ +/* subtype, 256 entries too */ #define NOTE_SUBTYPE 0x0000FF00 -/* Subtype scene mode. */ +/* subtype scene mode */ #define NS_MODE_OBJECT (1 << 8) #define NS_EDITMODE_MESH (2 << 8) @@ -535,14 +531,14 @@ struct wmNotifier { #define NS_EDITMODE_GREASE_PENCIL (12 << 8) #define NS_EDITMODE_POINT_CLOUD (13 << 8) -/* Subtype 3d view editing. */ +/* subtype 3d view editing */ #define NS_VIEW3D_GPU (16 << 8) #define NS_VIEW3D_SHADING (17 << 8) -/* Subtype layer editing. */ +/* subtype layer editing */ #define NS_LAYER_COLLECTION (24 << 8) -/* Action classification. */ +/* action classification */ #define NOTE_ACTION (0x000000FF) #define NA_EDITED 1 #define NA_EVALUATED 2 @@ -556,7 +552,7 @@ struct wmNotifier { /* ************** Gesture Manager data ************** */ -/** #wmGesture::type */ +/* wmGesture->type */ #define WM_GESTURE_LINES 1 #define WM_GESTURE_RECT 2 #define WM_GESTURE_CROSS_RECT 3 @@ -569,19 +565,19 @@ struct wmNotifier { */ struct wmGesture { wmGesture *next, *prev; - /** #wmEvent.type. */ + /** #wmEvent.type */ int event_type; - /** #wmEvent.modifier. */ + /** #wmEvent.modifier */ uint8_t event_modifier; - /** #wmEvent.keymodifier. */ + /** #wmEvent.keymodifier */ short event_keymodifier; /** Gesture type define. */ int type; - /** Bounds of region to draw gesture within. */ + /** bounds of region to draw gesture within. */ rcti winrct; - /** Optional, amount of points stored. */ + /** optional, amount of points stored. */ int points; - /** Optional, maximum amount of points stored. */ + /** optional, maximum amount of points stored. */ int points_alloc; int modal_state; /** Optional, draw the active side of the straight-line gesture. */ @@ -597,7 +593,7 @@ struct wmGesture { uint is_active_prev : 1; /** Use for gestures that support both immediate or delayed activation. */ uint wait_for_input : 1; - /** Use for gestures that can be moved, like box selection. */ + /** Use for gestures that can be moved, like box selection */ uint move : 1; /** For gestures that support snapping, stores if snapping is enabled using the modal keymap * toggle. */ @@ -654,11 +650,11 @@ ENUM_OPERATORS(eWM_EventFlag, WM_EVENT_FORCE_DRAG_THRESHOLD); struct wmTabletData { /** 0=EVT_TABLET_NONE, 1=EVT_TABLET_STYLUS, 2=EVT_TABLET_ERASER. */ int active; - /** Range 0.0 (not touching) to 1.0 (full pressure). */ + /** range 0.0 (not touching) to 1.0 (full pressure). */ float pressure; - /** Range 0.0 (upright) to 1.0 (tilted fully against the tablet surface). */ + /** range 0.0 (upright) to 1.0 (tilted fully against the tablet surface). */ float x_tilt; - /** As above. */ + /** as above. */ float y_tilt; /** Interpret mouse motion as absolute as typical for tablets. */ char is_motion_absolute; @@ -806,7 +802,7 @@ enum wmProgress { #ifdef WITH_INPUT_NDOF struct wmNDOFMotionData { - /* Awfully similar to #GHOST_TEventNDOFMotionData. */ + /* awfully similar to GHOST_TEventNDOFMotionData... */ /** * Each component normally ranges from -1 to +1, but can exceed that. * These use blender standard view coordinates, @@ -832,7 +828,7 @@ struct wmNDOFMotionData { /* Similar to GHOST_XrPose. */ struct wmXrPose { float position[3]; - /* Blender convention (w, x, y, z). */ + /* Blender convention (w, x, y, z) */ float orientation_quat[4]; }; @@ -843,7 +839,7 @@ struct wmXrActionState { float state_vector2f[2]; wmXrPose state_pose; }; - int type; /* #eXrActionType. */ + int type; /* eXrActionType */ }; struct wmXrActionData { @@ -851,9 +847,9 @@ struct wmXrActionData { char action_set[64]; /** Action name. */ char action[64]; - /** User path. E.g. "/user/hand/left". */ + /** User path. E.g. "/user/hand/left" */ char user_path[64]; - /** Other user path, for bimanual actions. E.g. "/user/hand/right". */ + /** Other user path, for bimanual actions. E.g. "/user/hand/right" */ char user_path_other[64]; /** Type. */ eXrActionType type; @@ -977,7 +973,7 @@ struct wmOperatorType { const char *name; /** Unique identifier (must not exceed #OP_MAX_TYPENAME). */ const char *idname; - /** Translation context (must not exceed #BKE_ST_MAXNAME). */ + /** Translation context (must not exceed #BKE_ST_MAXNAME) */ const char *translation_context; /** Use for tooltips and Python docs. */ const char *description; @@ -1060,10 +1056,7 @@ struct wmOperatorType { */ std::string (*get_description)(bContext *C, wmOperatorType *ot, PointerRNA *ptr); - /** A dynamic version of #OPTYPE_DEPENDS_ON_CURSOR which can depend on operator properties. */ - bool (*depends_on_cursor)(bContext &C, wmOperatorType &ot, PointerRNA *ptr); - - /** RNA for properties. */ + /** RNA for properties */ StructRNA *srna; /** Previous settings - for initializing on re-use. */ @@ -1078,7 +1071,7 @@ struct wmOperatorType { */ PropertyRNA *prop; - /** #wmOperatorTypeMacro. */ + /** wmOperatorTypeMacro */ ListBase macro; /** Pointer to modal keymap. Do not free! */ @@ -1087,13 +1080,13 @@ struct wmOperatorType { /** Python needs the operator type as well. */ bool (*pyop_poll)(bContext *C, wmOperatorType *ot) ATTR_WARN_UNUSED_RESULT; - /** RNA integration. */ + /** RNA integration */ ExtensionRNA rna_ext; /** Cursor to use when waiting for cursor input, see: #OPTYPE_DEPENDS_ON_CURSOR. */ int cursor_pending; - /** Flag last for padding. */ + /** Flag last for padding */ short flag; }; @@ -1116,9 +1109,9 @@ struct wmOperatorCallParams { struct wmIMEData { size_t result_len, composite_len; - /** UTF8 encoding. */ + /** utf8 encoding */ char *str_result; - /** UTF8 encoding. */ + /** utf8 encoding */ char *str_composite; /** Cursor position in the IME composition. */ @@ -1146,14 +1139,7 @@ enum eWM_DragDataType { WM_DRAG_RNA, WM_DRAG_PATH, WM_DRAG_NAME, - /** - * Arbitrary text such as dragging from a text editor, - * this is also used when dragging a URL from a browser. - * - * An #std::string expected to be UTF8 encoded. - * Callers that require valid UTF8 sequences must validate the text. - */ - WM_DRAG_STRING, + WM_DRAG_VALUE, WM_DRAG_COLOR, WM_DRAG_DATASTACK, WM_DRAG_ASSET_CATALOG, @@ -1177,7 +1163,7 @@ struct wmDragID { }; struct wmDragAsset { - int import_method; /* #eAssetImportMethod. */ + int import_method; /* eAssetImportMethod */ const AssetRepresentationHandle *asset; }; @@ -1207,9 +1193,9 @@ struct wmDragAssetListItem { struct wmDragPath { blender::Vector paths; /* File type of each path in #paths. */ - blender::Vector file_types; /* #eFileSel_File_Types. */ + blender::Vector file_types; /* eFileSel_File_Types */ /* Bit flag of file types in #paths. */ - int file_types_bit_flag; /* #eFileSel_File_Types. */ + int file_types_bit_flag; /* eFileSel_File_Types */ std::string tooltip; }; @@ -1265,6 +1251,7 @@ struct wmDrag { int icon; eWM_DragDataType type; void *poin; + double value; /** If no icon but imbuf should be drawn around cursor. */ const ImBuf *imb; @@ -1383,9 +1370,9 @@ struct RecentFile { char *filepath; }; -/* Logging. */ +/* Logging */ struct CLG_LogRef; -/* `wm_init_exit.cc`. */ +/* wm_init_exit.cc */ extern CLG_LogRef *WM_LOG_OPERATORS; extern CLG_LogRef *WM_LOG_HANDLERS; diff --git a/source/blender/windowmanager/gizmo/WM_gizmo_api.hh b/source/blender/windowmanager/gizmo/WM_gizmo_api.hh index 48ec5ca6587..e8663399806 100644 --- a/source/blender/windowmanager/gizmo/WM_gizmo_api.hh +++ b/source/blender/windowmanager/gizmo/WM_gizmo_api.hh @@ -37,7 +37,7 @@ struct wmWindowManager; #include "wm_gizmo_fn.hh" /* -------------------------------------------------------------------- */ -/* #wmGizmo. */ +/* wmGizmo */ wmGizmo *WM_gizmo_new_ptr(const wmGizmoType *gzt, wmGizmoGroup *gzgroup, PointerRNA *properties); /** @@ -207,7 +207,7 @@ wmGizmoGroupTypeRef *WM_gizmogrouptype_append_and_link(wmGizmoMapType *gzmap_typ /* `wm_gizmo_map.cc` */ -/* Dynamic Updates (for RNA runtime registration). */ +/* Dynamic Updates (for RNA runtime registration) */ void WM_gizmoconfig_update_tag_group_type_init(wmGizmoMapType *gzmap_type, wmGizmoGroupType *gzgt); void WM_gizmoconfig_update_tag_group_type_remove(wmGizmoMapType *gzmap_type, wmGizmoGroupType *gzgt); @@ -219,7 +219,7 @@ void WM_gizmoconfig_update(Main *bmain); void WM_gizmoconfig_update_tag_group_remove(wmGizmoMap *gzmap); -/* `wm_gizmo_target_props.cc`. */ +/* wm_maniulator_target_props.c */ wmGizmoProperty *WM_gizmo_target_property_array(wmGizmo *gz); wmGizmoProperty *WM_gizmo_target_property_at_index(wmGizmo *gz, int index); @@ -292,9 +292,9 @@ void WM_gizmo_target_property_anim_autokey(bContext *C, wmGizmoProperty *gz_prop); /* -------------------------------------------------------------------- */ -/* #wmGizmoGroup. */ +/* wmGizmoGroup */ -/* Callbacks for #wmGizmoGroupType::setup_keymap. */ +/* Callbacks for 'wmGizmoGroupType.setup_keymap' */ wmKeyMap *WM_gizmogroup_setup_keymap_generic(const wmGizmoGroupType *gzgt, wmKeyConfig *kc); wmKeyMap *WM_gizmogroup_setup_keymap_generic_select(const wmGizmoGroupType *gzgt, wmKeyConfig *kc); wmKeyMap *WM_gizmogroup_setup_keymap_generic_drag(const wmGizmoGroupType *gzgt, wmKeyConfig *kc); @@ -329,7 +329,7 @@ int WM_gizmo_cmp_temp_fl(const void *gz_a_ptr, const void *gz_b_ptr); int WM_gizmo_cmp_temp_fl_reverse(const void *gz_a_ptr, const void *gz_b_ptr); /* -------------------------------------------------------------------- */ -/* #wmGizmoMap. */ +/* wmGizmoMap */ /** * Creates a gizmo-map with all registered gizmos for that type @@ -376,7 +376,7 @@ ARegion *WM_gizmomap_tooltip_init( bContext *C, ARegion *region, int *pass, double *pass_delay, bool *r_exit_on_event); /* -------------------------------------------------------------------- */ -/* #wmGizmoMapType. */ +/* wmGizmoMapType */ wmGizmoMapType *WM_gizmomaptype_find(const wmGizmoMapType_Params *gzmap_params); wmGizmoMapType *WM_gizmomaptype_ensure(const wmGizmoMapType_Params *gzmap_params); @@ -410,9 +410,9 @@ void WM_gizmomaptype_group_unlink(bContext *C, void WM_gizmomaptype_group_free(wmGizmoGroupTypeRef *gzgt); /* -------------------------------------------------------------------- */ -/* #GizmoGroup. */ +/* GizmoGroup */ -/* Add/Ensure/Remove (High level API). */ +/* Add/Ensure/Remove (High level API) */ void WM_gizmo_group_type_add_ptr_ex(wmGizmoGroupType *gzgt, wmGizmoMapType *gzmap_type); void WM_gizmo_group_type_add_ptr(wmGizmoGroupType *gzgt); @@ -451,7 +451,7 @@ void WM_gizmo_group_type_reinit_ptr_ex(Main *bmain, void WM_gizmo_group_type_reinit_ptr(Main *bmain, wmGizmoGroupType *gzgt); void WM_gizmo_group_type_reinit(Main *bmain, const char *idname); -/* Utilities. */ +/* Utilities */ bool WM_gizmo_context_check_drawstep(const bContext *C, eWM_GizmoFlagMapDrawStep step); diff --git a/source/blender/windowmanager/gizmo/WM_gizmo_types.hh b/source/blender/windowmanager/gizmo/WM_gizmo_types.hh index 233b8732988..7aa2bc3cb69 100644 --- a/source/blender/windowmanager/gizmo/WM_gizmo_types.hh +++ b/source/blender/windowmanager/gizmo/WM_gizmo_types.hh @@ -30,7 +30,7 @@ struct wmKeyConfig; struct wmOperatorType; /* -------------------------------------------------------------------- */ -/* Enum Typedef's. */ +/* Enum Typedef's */ /** * #wmGizmo.state @@ -93,12 +93,12 @@ ENUM_OPERATORS(eWM_GizmoFlag, WM_GIZMO_NO_TOOLTIP); * Flags that influence the behavior of all gizmos in the group. */ enum eWM_GizmoFlagGroupTypeFlag { - /** Mark gizmo-group as being 3D. */ + /** Mark gizmo-group as being 3D */ WM_GIZMOGROUPTYPE_3D = (1 << 0), /** Scale gizmos as 3D object that respects zoom (otherwise zoom independent draw size). * NOTE: currently only for 3D views, 2D support needs adding. */ WM_GIZMOGROUPTYPE_SCALE = (1 << 1), - /** Gizmos can be depth culled with scene objects (covered by other geometry - TODO). */ + /** Gizmos can be depth culled with scene objects (covered by other geometry - TODO) */ WM_GIZMOGROUPTYPE_DEPTH_3D = (1 << 2), /** Gizmos can be selected. */ WM_GIZMOGROUPTYPE_SELECT = (1 << 3), @@ -180,7 +180,7 @@ enum eWM_GizmoFlagMapTypeUpdateFlag { ENUM_OPERATORS(eWM_GizmoFlagMapTypeUpdateFlag, WM_GIZMOMAPTYPE_KEYMAP_INIT) /* -------------------------------------------------------------------- */ -/* #wmGizmo. */ +/* wmGizmo */ /** * \brief Gizmo tweak flag. @@ -206,7 +206,7 @@ struct wmGizmoOpElem { bool is_redo; }; -/* Gizmos are set per region by registering them on gizmo-maps. */ +/* gizmos are set per region by registering them on gizmo-maps */ struct wmGizmo { wmGizmo *next, *prev; @@ -220,7 +220,7 @@ struct wmGizmo { /** Pointer back to group this gizmo is in (just for quick access). */ wmGizmoGroup *parent_gzgroup; - /** Optional keymap to use for this gizmo (overrides #wmGizmoGroupType.keymap). */ + /** Optional keymap to use for this gizmo (overrides #wmGizmoGroupType.keymap) */ wmKeyMap *keymap; void *py_instance; @@ -230,7 +230,7 @@ struct wmGizmo { /** Flags that influence the behavior or how the gizmos are drawn. */ eWM_GizmoFlag flag; - /** State flags (active, highlighted, selected). */ + /** State flags (active, highlighted, selected) */ eWM_GizmoFlagState state; /** Optional ID for highlighting different parts of this gizmo. @@ -288,7 +288,7 @@ struct wmGizmo { float f; } temp; - /* Over alloc target_properties after #wmGizmoType::struct_size. */ + /* over alloc target_properties after 'wmGizmoType.struct_size' */ }; /** Similar to #PropertyElemRNA, but has an identifier. */ @@ -315,10 +315,10 @@ struct wmGizmoPropertyType { int data_type; int array_length; - /** Index within #wmGizmoType. */ + /* index within 'wmGizmoType' */ int index_in_type; - /** Over allocate. */ + /** over alloc. */ char idname[0]; }; @@ -336,7 +336,7 @@ struct wmGizmoMapType_Params { struct wmGizmoType { - const char *idname; /* #MAX_NAME. */ + const char *idname; /* MAX_NAME */ /** Set to 'sizeof(wmGizmo)' or larger for instances of this type, * use so we can cast to other types without the hassle of a custom-data pointer. */ @@ -403,7 +403,7 @@ struct wmGizmoType { }; /* -------------------------------------------------------------------- */ -/* #wmGizmoGroup. */ +/* wmGizmoGroup */ /** Factory class for a gizmo-group type, gets called every time a new area is spawned. */ struct wmGizmoGroupTypeRef { @@ -411,12 +411,12 @@ struct wmGizmoGroupTypeRef { wmGizmoGroupType *type; }; -/* Factory class for a gizmo-group type, gets called every time a new area is spawned. */ +/* factory class for a gizmo-group type, gets called every time a new area is spawned */ struct wmGizmoGroupType { - const char *idname; /* #MAX_NAME. */ + const char *idname; /* MAX_NAME */ /** Gizmo-group name - displayed in UI (keymap editor). */ const char *name; - char owner_id[64]; /* #MAX_NAME. */ + char owner_id[64]; /* MAX_NAME */ /** Poll if gizmo-map should be visible. */ wmGizmoGroupFnPoll poll; @@ -499,7 +499,7 @@ struct wmGizmoGroup { }; /* -------------------------------------------------------------------- */ -/* #wmGizmoMap. */ +/* wmGizmoMap */ /** * Pass a value of this enum to #WM_gizmomap_draw to tell it what to draw. diff --git a/source/blender/windowmanager/gizmo/intern/wm_gizmo.cc b/source/blender/windowmanager/gizmo/intern/wm_gizmo.cc index 460d1b58420..db95b043a9a 100644 --- a/source/blender/windowmanager/gizmo/intern/wm_gizmo.cc +++ b/source/blender/windowmanager/gizmo/intern/wm_gizmo.cc @@ -19,7 +19,7 @@ #include "RNA_define.hh" #include "RNA_prototypes.h" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_idprop.h" #include "BKE_main.hh" @@ -30,11 +30,16 @@ #include "ED_screen.hh" #include "ED_view3d.hh" +#include "UI_interface.hh" + #ifdef WITH_PYTHON # include "BPY_extern.h" #endif -/* Own includes. */ +/* only for own init/exit calls (wm_gizmotype_init/wm_gizmotype_free) */ +#include "wm.hh" + +/* own includes */ #include "wm_gizmo_intern.hh" #include "wm_gizmo_wmapi.hh" @@ -52,7 +57,7 @@ static wmGizmo *wm_gizmo_create(const wmGizmoType *gzt, PointerRNA *properties) gzt->struct_size + (sizeof(wmGizmoProperty) * gzt->target_property_defs_len), __func__)); gz->type = gzt; - /* Initialize properties, either copy or create. */ + /* initialize properties, either copy or create */ gz->ptr = static_cast(MEM_callocN(sizeof(PointerRNA), "wmGizmoPtrRNA")); if (properties && properties->data) { gz->properties = IDP_CopyProperty(static_cast(properties->data)); @@ -103,7 +108,7 @@ static void gizmo_init(wmGizmo *gz) gz->scale_basis = 1.0f; gz->line_width = 1.0f; - /* Defaults. */ + /* defaults */ copy_v4_v4(gz->color, color_default); copy_v4_v4(gz->color_hi, color_default); } @@ -127,8 +132,8 @@ void WM_gizmo_free(wmGizmo *gz) #ifdef WITH_PYTHON if (gz->py_instance) { - /* Do this first in case there are any `__del__` functions or - * similar that use properties. */ + /* do this first in case there are any __del__ functions or + * similar that use properties */ BPY_DECREF_RNA_INVALIDATE(gz->py_instance); } #endif @@ -245,7 +250,7 @@ int WM_gizmo_operator_invoke(bContext *C, wmGizmo *gz, wmGizmoOpElem *gzop, cons static void wm_gizmo_set_matrix_rotation_from_z_axis__internal(float matrix[4][4], const float z_axis[3]) { -/* Old code, seems we can use simpler method. */ +/* old code, seems we can use simpler method */ #if 0 const float z_global[3] = {0.0f, 0.0f, 1.0f}; float rot[3][3]; @@ -378,7 +383,7 @@ bool wm_gizmo_select_set_ex( } /* In the case of unlinking we only want to remove from the array - * and not write to the external state. */ + * and not write to the external state */ if (use_callback && changed) { if (gz->type->select_refresh) { gz->type->select_refresh(gz); @@ -475,7 +480,7 @@ void wm_gizmo_calculate_scale(wmGizmo *gz, const bContext *C) static void gizmo_update_prop_data(wmGizmo *gz) { - /* Gizmo property might have been changed, so update gizmo. */ + /* gizmo property might have been changed, so update gizmo */ if (gz->type->property_update) { wmGizmoProperty *gz_prop_array = WM_gizmo_target_property_array(gz); for (int i = 0; i < gz->type->target_property_defs_len; i++) { @@ -503,13 +508,13 @@ int wm_gizmo_is_visible(wmGizmo *gz) if ((gz->state & WM_GIZMO_STATE_MODAL) && !(gz->flag & (WM_GIZMO_DRAW_MODAL | WM_GIZMO_DRAW_VALUE))) { - /* Don't draw while modal (dragging). */ + /* don't draw while modal (dragging) */ return 0; } if ((gz->flag & WM_GIZMO_DRAW_HOVER) && !(gz->state & WM_GIZMO_STATE_HIGHLIGHT) && - !(gz->state & WM_GIZMO_STATE_SELECT)) /* Still draw selected gizmos. */ + !(gz->state & WM_GIZMO_STATE_SELECT)) /* still draw selected gizmos */ { - /* Update but don't draw. */ + /* update but don't draw */ return WM_GIZMO_IS_VISIBLE_UPDATE; } @@ -630,7 +635,7 @@ void WM_gizmo_properties_sanitize(PointerRNA *ptr, const bool no_context) case PROP_POINTER: { StructRNA *ptype = RNA_property_pointer_type(ptr, prop); - /* Recurse into gizmo properties. */ + /* recurse into gizmo properties */ if (RNA_struct_is_a(ptype, &RNA_GizmoProperties)) { PointerRNA opptr = RNA_property_pointer_get(ptr, prop); WM_gizmo_properties_sanitize(&opptr, no_context); @@ -704,7 +709,7 @@ void WM_gizmo_properties_free(PointerRNA *ptr) if (properties) { IDP_FreeProperty(properties); - ptr->data = nullptr; /* Just in case. */ + ptr->data = nullptr; /* just in case */ } } diff --git a/source/blender/windowmanager/gizmo/intern/wm_gizmo_group.cc b/source/blender/windowmanager/gizmo/intern/wm_gizmo_group.cc index 6ee92d0c672..6e60a128c60 100644 --- a/source/blender/windowmanager/gizmo/intern/wm_gizmo_group.cc +++ b/source/blender/windowmanager/gizmo/intern/wm_gizmo_group.cc @@ -8,7 +8,7 @@ * \name Gizmo-Group * * Gizmo-groups store and manage groups of gizmos. They can be - * attached to modal handlers and have their own keymaps. + * attached to modal handlers and have own keymaps. */ #include @@ -23,7 +23,7 @@ #include "BKE_context.hh" #include "BKE_main.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "BKE_workspace.h" #include "RNA_access.hh" @@ -36,7 +36,7 @@ #include "ED_screen.hh" #include "ED_undo.hh" -/* Own includes. */ +/* own includes */ #include "wm_gizmo_intern.hh" #include "wm_gizmo_wmapi.hh" @@ -56,7 +56,7 @@ wmGizmoGroup *wm_gizmogroup_new_from_type(wmGizmoMap *gzmap, wmGizmoGroupType *g gzgroup->type = gzgt; gzgroup->type->users += 1; - /* Keep back-link. */ + /* keep back-link */ gzgroup->parent_gzmap = gzmap; BLI_addtail(&gzmap->groups, gzgroup); @@ -95,8 +95,8 @@ void wm_gizmogroup_free(bContext *C, wmGizmoGroup *gzgroup) #ifdef WITH_PYTHON if (gzgroup->py_instance) { - /* Do this first in case there are any `__del__` functions or - * similar that use properties. */ + /* do this first in case there are any __del__ functions or + * similar that use properties */ BPY_DECREF_RNA_INVALIDATE(gzgroup->py_instance); } #endif @@ -243,7 +243,7 @@ void wm_gizmogroup_intersectable_gizmos_to_list(wmWindowManager *wm, void WM_gizmogroup_ensure_init(const bContext *C, wmGizmoGroup *gzgroup) { - /* Prepare for first draw. */ + /* prepare for first draw */ if (UNLIKELY((gzgroup->init_flag & WM_GIZMOGROUP_INIT_SETUP) == 0)) { gzgroup->type->setup(C, gzgroup); @@ -345,7 +345,7 @@ static int gizmo_select_invoke(bContext *C, wmOperator *op, const wmEvent * /*ev bool deselect = RNA_boolean_get(op->ptr, "deselect"); bool toggle = RNA_boolean_get(op->ptr, "toggle"); - /* Deselect all first. */ + /* deselect all first */ if (extend == false && deselect == false && toggle == false) { wm_gizmomap_deselect_all(gzmap); BLI_assert(msel->items == nullptr && msel->len == 0); @@ -357,7 +357,7 @@ static int gizmo_select_invoke(bContext *C, wmOperator *op, const wmEvent * /*ev bool redraw = false; if (toggle) { - /* Toggle: deselect if already selected, else select. */ + /* toggle: deselect if already selected, else select */ deselect = is_selected; } @@ -383,12 +383,12 @@ static int gizmo_select_invoke(bContext *C, wmOperator *op, const wmEvent * /*ev void GIZMOGROUP_OT_gizmo_select(wmOperatorType *ot) { - /* Identifiers. */ + /* identifiers */ ot->name = "Gizmo Select"; ot->description = "Select the currently highlighted gizmo"; ot->idname = "GIZMOGROUP_OT_gizmo_select"; - /* API callbacks. */ + /* api callbacks */ ot->invoke = gizmo_select_invoke; ot->poll = ED_operator_region_gizmo_active; @@ -402,13 +402,13 @@ struct GizmoTweakData { wmGizmoGroup *gzgroup; wmGizmo *gz_modal; - int init_event; /* Initial event type. */ - int flag; /* Tweak flags. */ + int init_event; /* initial event type */ + int flag; /* tweak flags */ }; static bool gizmo_tweak_start(bContext *C, wmGizmoMap *gzmap, wmGizmo *gz, const wmEvent *event) { - /* Activate highlighted gizmo. */ + /* activate highlighted gizmo */ wm_gizmomap_modal_set(gzmap, C, gz, event, true); return (gz->state & WM_GIZMO_STATE_MODAL); @@ -423,7 +423,7 @@ static bool gizmo_tweak_start_and_finish( } if (gzop && gzop->type) { - /* Undo/Redo. */ + /* Undo/Redo */ if (gzop->is_redo) { wmWindowManager *wm = CTX_wm_manager(C); wmOperator *op = WM_operator_last_redo(C); @@ -438,9 +438,9 @@ static bool gizmo_tweak_start_and_finish( } /* XXX temporary workaround for modal gizmo operator - * conflicting with modal operator attached to gizmo. */ + * conflicting with modal operator attached to gizmo */ if (gzop->type->modal) { - /* Activate highlighted gizmo. */ + /* activate highlighted gizmo */ wm_gizmomap_modal_set(gzmap, C, gz, event, true); if (r_is_modal) { *r_is_modal = true; @@ -488,7 +488,7 @@ static int gizmo_tweak_modal(bContext *C, wmOperator *op, const wmEvent *event) } if (retval == OPERATOR_FINISHED) { - /* Pass. */ + /* pass */ } else if (event->type == mtweak->init_event && event->val == KM_RELEASE) { retval = OPERATOR_FINISHED; @@ -522,7 +522,7 @@ static int gizmo_tweak_modal(bContext *C, wmOperator *op, const wmEvent *event) return retval; } - /* Handle gizmo. */ + /* handle gizmo */ wmGizmoFnModal modal_fn = gz->custom_modal ? gz->custom_modal : gz->type->modal; if (modal_fn) { /* Ugly hack to ensure Python won't get 'EVT_MODAL_MAP' which isn't supported, see #73727. @@ -549,12 +549,12 @@ static int gizmo_tweak_modal(bContext *C, wmOperator *op, const wmEvent *event) return OPERATOR_FINISHED; } - /* Ugly hack to send gizmo events. */ + /* Ugly hack to send gizmo events */ evil_event->type = EVT_GIZMO_UPDATE; } - /* Always return PASS_THROUGH so modal handlers - * with gizmos attached can update. */ + /* always return PASS_THROUGH so modal handlers + * with gizmos attached can update */ BLI_assert(retval == OPERATOR_PASS_THROUGH); return OPERATOR_PASS_THROUGH; } @@ -569,7 +569,7 @@ static int gizmo_tweak_invoke(bContext *C, wmOperator *op, const wmEvent *event) WM_tooltip_clear(C, CTX_wm_window(C)); if (!gz) { - /* #wm_handlers_do_intern shouldn't let this happen. */ + /* wm_handlers_do_intern shouldn't let this happen */ BLI_assert_unreachable(); return (OPERATOR_CANCELLED | OPERATOR_PASS_THROUGH); } @@ -587,7 +587,7 @@ static int gizmo_tweak_invoke(bContext *C, wmOperator *op, const wmEvent *event) } if (!gizmo_tweak_start(C, gzmap, gz, event)) { - /* Failed to start. */ + /* failed to start */ gz->highlight_part = highlight_part_init; return OPERATOR_PASS_THROUGH; } @@ -610,12 +610,12 @@ static int gizmo_tweak_invoke(bContext *C, wmOperator *op, const wmEvent *event) void GIZMOGROUP_OT_gizmo_tweak(wmOperatorType *ot) { - /* Identifiers. */ + /* identifiers */ ot->name = "Gizmo Tweak"; ot->description = "Tweak the active gizmo"; ot->idname = "GIZMOGROUP_OT_gizmo_tweak"; - /* API callbacks. */ + /* api callbacks */ ot->invoke = gizmo_tweak_invoke; ot->modal = gizmo_tweak_modal; ot->poll = ED_operator_region_gizmo_active; @@ -652,7 +652,7 @@ wmKeyMap *wm_gizmogroup_tweak_modal_keymap(wmKeyConfig *keyconf) keymap = WM_modalkeymap_ensure(keyconf, name, modal_items); - /* Items for modal map. */ + /* items for modal map */ { KeyMapItem_Params params{}; params.type = EVT_ESCKEY; @@ -755,7 +755,7 @@ wmKeyMap *wm_gizmogroup_tweak_modal_keymap(wmKeyConfig *keyconf) return keymap; } -/** \} */ /* #wmGizmoGroup. */ +/** \} */ /* wmGizmoGroup */ /* -------------------------------------------------------------------- */ /** \name wmGizmoGroup (Key-map callbacks) @@ -929,7 +929,7 @@ wmKeyMap *WM_gizmo_keymap_generic_maybe_drag(wmWindowManager *wm) wmGizmoGroupTypeRef *WM_gizmomaptype_group_find_ptr(wmGizmoMapType *gzmap_type, const wmGizmoGroupType *gzgt) { - /* Could use hash lookups as operator types do, for now simple search. */ + /* could use hash lookups as operator types do, for now simple search. */ LISTBASE_FOREACH (wmGizmoGroupTypeRef *, gzgt_ref, &gzmap_type->grouptype_refs) { if (gzgt_ref->type == gzgt) { return gzgt_ref; @@ -940,7 +940,7 @@ wmGizmoGroupTypeRef *WM_gizmomaptype_group_find_ptr(wmGizmoMapType *gzmap_type, wmGizmoGroupTypeRef *WM_gizmomaptype_group_find(wmGizmoMapType *gzmap_type, const char *idname) { - /* Could use hash lookups as operator types do, for now simple search. */ + /* could use hash lookups as operator types do, for now simple search. */ LISTBASE_FOREACH (wmGizmoGroupTypeRef *, gzgt_ref, &gzmap_type->grouptype_refs) { if (STREQ(idname, gzgt_ref->type->idname)) { return gzgt_ref; @@ -968,8 +968,7 @@ wmGizmoGroupTypeRef *WM_gizmomaptype_group_link_ptr(wmGizmoMapType *gzmap_type, void WM_gizmomaptype_group_init_runtime_keymap(const Main *bmain, wmGizmoGroupType *gzgt) { - /* Initialize key-map. - * On startup there's an extra call to initialize keymaps for 'permanent' gizmo-groups. */ + /* init keymap - on startup there's an extra call to init keymaps for 'permanent' gizmo-groups */ wm_gizmogrouptype_setup_keymap(gzgt, ((wmWindowManager *)bmain->wm.first)->defaultconf); } @@ -982,7 +981,7 @@ void WM_gizmomaptype_group_init_runtime(const Main *bmain, return; } - /* Now create a gizmo for all existing areas. */ + /* now create a gizmo for all existing areas */ for (bScreen *screen = static_cast(bmain->screens.first); screen; screen = static_cast(screen->id.next)) { @@ -1091,7 +1090,7 @@ void wm_gizmogrouptype_setup_keymap(wmGizmoGroupType *gzgt, wmKeyConfig *keyconf } } -/** \} */ /* #wmGizmoGroupType. */ +/** \} */ /* wmGizmoGroupType */ /* -------------------------------------------------------------------- */ /** \name High Level Add/Remove API @@ -1186,7 +1185,7 @@ void WM_gizmo_group_type_reinit(Main *bmain, const char *idname) WM_gizmo_group_type_reinit_ptr(bmain, gzgt); } -/* Delayed versions. */ +/* delayed versions */ void WM_gizmo_group_type_unlink_delayed_ptr_ex(wmGizmoGroupType *gzgt, wmGizmoMapType *gzmap_type) { diff --git a/source/blender/windowmanager/gizmo/intern/wm_gizmo_group_type.cc b/source/blender/windowmanager/gizmo/intern/wm_gizmo_group_type.cc index 5912849b96a..30448debd32 100644 --- a/source/blender/windowmanager/gizmo/intern/wm_gizmo_group_type.cc +++ b/source/blender/windowmanager/gizmo/intern/wm_gizmo_group_type.cc @@ -11,15 +11,21 @@ #include "BLI_ghash.h" #include "BLI_utildefines.h" +#include "BKE_context.hh" + #include "MEM_guardedalloc.h" #include "RNA_access.hh" #include "RNA_define.hh" #include "RNA_prototypes.h" +#include "WM_api.hh" #include "WM_types.hh" -/* Own includes. */ +/* only for own init/exit calls (wm_gizmogrouptype_init/wm_gizmogrouptype_free) */ +#include "wm.hh" + +/* own includes */ #include "wm_gizmo_intern.hh" #include "wm_gizmo_wmapi.hh" @@ -80,7 +86,7 @@ static void wm_gizmogrouptype_append__end(wmGizmoGroupType *gzgt) gzgt->type_update_flag |= WM_GIZMOMAPTYPE_KEYMAP_INIT; - /* If not set, use default. */ + /* if not set, use default */ if (gzgt->setup_keymap == nullptr) { if (gzgt->flag & WM_GIZMOGROUPTYPE_SELECT) { gzgt->setup_keymap = WM_gizmogroup_setup_keymap_generic_select; @@ -173,7 +179,7 @@ void wm_gizmogrouptype_free() void wm_gizmogrouptype_init() { - /* Reserve size is set based on blender default setup. */ + /* reserve size is set based on blender default setup */ global_gizmogrouptype_hash = BLI_ghash_str_new_ex("wm_gizmogrouptype_init gh", 128); } diff --git a/source/blender/windowmanager/gizmo/intern/wm_gizmo_intern.hh b/source/blender/windowmanager/gizmo/intern/wm_gizmo_intern.hh index 95118602140..3f3cdf02c4e 100644 --- a/source/blender/windowmanager/gizmo/intern/wm_gizmo_intern.hh +++ b/source/blender/windowmanager/gizmo/intern/wm_gizmo_intern.hh @@ -15,7 +15,7 @@ struct wmKeyConfig; #include "wm_gizmo_fn.hh" /* -------------------------------------------------------------------- */ -/* #wmGizmo. */ +/* wmGizmo */ /** * Add/Remove \a gizmo to selection. @@ -37,7 +37,7 @@ enum { }; /* -------------------------------------------------------------------- */ -/* #wmGizmoGroup. */ +/* wmGizmoGroup */ enum { TWEAK_MODAL_CANCEL = 1, @@ -80,7 +80,7 @@ void wm_gizmogrouptype_setup_keymap(wmGizmoGroupType *gzgt, wmKeyConfig *keyconf wmKeyMap *wm_gizmogroup_tweak_modal_keymap(wmKeyConfig *keyconf); /* -------------------------------------------------------------------- */ -/* #wmGizmoMap. */ +/* wmGizmoMap */ struct wmGizmoMapSelectState { struct wmGizmo **items; @@ -89,9 +89,9 @@ struct wmGizmoMapSelectState { struct wmGizmoMap { wmGizmoMapType *type; - ListBase groups; /* #wmGizmoGroup. */ + ListBase groups; /* wmGizmoGroup */ - /* Private, update tagging (enum defined in C source). */ + /* private, update tagging (enum defined in C source). */ char update_flag[WM_GIZMOMAP_DRAWSTEP_MAX]; /** Private, true when not yet used. */ @@ -107,16 +107,16 @@ struct wmGizmoMap { * highlighted gizmo, currently selected gizmos, ... */ struct { - /** We redraw the gizmo-map when this changes. */ + /* we redraw the gizmo-map when this changes */ wmGizmo *highlight; - /** User has clicked this gizmo and it gets all input. */ + /* User has clicked this gizmo and it gets all input. */ wmGizmo *modal; - /** Array for all selected gizmos. */ + /* array for all selected gizmos */ wmGizmoMapSelectState select; - /** Cursor location at point of entering modal (see: #WM_GIZMO_MOVE_CURSOR). */ + /* cursor location at point of entering modal (see: WM_GIZMO_MOVE_CURSOR) */ int event_xy[2]; short event_grabcursor; - /** Until we have nice cursor push/pop API. */ + /* until we have nice cursor push/pop API. */ int last_cursor; } gzmap_context; }; @@ -130,10 +130,10 @@ struct wmGizmoMap { struct wmGizmoMapType { wmGizmoMapType *next, *prev; short spaceid, regionid; - /* Types of gizmo-groups for this gizmo-map type. */ + /* types of gizmo-groups for this gizmo-map type */ ListBase grouptype_refs; - /* #eGizmoMapTypeUpdateFlags. */ + /* eGizmoMapTypeUpdateFlags */ eWM_GizmoFlagMapTypeUpdateFlag type_update_flag; }; diff --git a/source/blender/windowmanager/gizmo/intern/wm_gizmo_map.cc b/source/blender/windowmanager/gizmo/intern/wm_gizmo_map.cc index f49c6acafb2..67be2f92839 100644 --- a/source/blender/windowmanager/gizmo/intern/wm_gizmo_map.cc +++ b/source/blender/windowmanager/gizmo/intern/wm_gizmo_map.cc @@ -17,7 +17,7 @@ #include "BLI_rect.h" #include "BKE_context.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_main.hh" #include "ED_screen.hh" @@ -37,12 +37,12 @@ #include "WM_types.hh" #include "wm_event_system.hh" -/* For tool-tips. */ +/* for tool-tips */ #include "UI_interface.hh" #include "DEG_depsgraph.hh" -/* Own includes. */ +/* own includes */ #include "wm_gizmo_intern.hh" #include "wm_gizmo_wmapi.hh" @@ -55,7 +55,7 @@ static ListBase gizmomaptypes = {nullptr, nullptr}; /** * Update when gizmo-map types change. */ -/* So operator removal can trigger update. */ +/* so operator removal can trigger update */ enum eWM_GizmoFlagGroupTypeGlobalFlag { /** Initialize by #wmGroupType.type_update_flag. */ WM_GIZMOMAPTYPE_GLOBAL_UPDATE_INIT = (1 << 0), @@ -74,7 +74,7 @@ static eWM_GizmoFlagGroupTypeGlobalFlag wm_gzmap_type_update_flag = * Gizmo-map update tagging. */ enum { - /** #gizmomap_prepare_drawing has run. */ + /** #gizmomap_prepare_drawing has run */ GIZMOMAP_IS_PREPARE_DRAW = (1 << 0), GIZMOMAP_IS_REFRESH_CALLBACK = (1 << 1), }; @@ -135,7 +135,7 @@ void wm_gizmomap_select_array_push_back(wmGizmoMap *gzmap, wmGizmo *gz) void wm_gizmomap_select_array_remove(wmGizmoMap *gzmap, wmGizmo *gz) { wmGizmoMapSelectState *msel = &gzmap->gzmap_context.select; - /* Remove gizmo from selected_gizmos array. */ + /* remove gizmo from selected_gizmos array */ for (int i = 0; i < msel->len; i++) { if (msel->items[i] == gz) { for (int j = i; j < (msel->len - 1); j++) { @@ -159,8 +159,8 @@ static wmGizmoMap *wm_gizmomap_new_from_type_ex(wmGizmoMapType *gzmap_type, wmGi gzmap->is_init = true; WM_gizmomap_tag_refresh(gzmap); - /* Create all gizmo-groups for this gizmo-map. We may create an empty one - * too in anticipation of gizmos from operators etc. */ + /* create all gizmo-groups for this gizmo-map. We may create an empty one + * too in anticipation of gizmos from operators etc */ LISTBASE_FOREACH (wmGizmoGroupTypeRef *, gzgt_ref, &gzmap_type->grouptype_refs) { wm_gizmogroup_new_from_type(gzmap, gzgt_ref->type); } @@ -273,7 +273,7 @@ static GHash *WM_gizmomap_gizmo_hash_new(const bContext *C, { GHash *hash = BLI_ghash_ptr_new(__func__); - /* Collect gizmos. */ + /* collect gizmos */ LISTBASE_FOREACH (wmGizmoGroup *, gzgroup, &gzmap->groups) { if (WM_gizmo_group_type_poll(C, gzgroup->type)) { LISTBASE_FOREACH (wmGizmo *, gz, &gzgroup->gizmos) { @@ -335,12 +335,12 @@ static bool gizmo_prepare_drawing(wmGizmoMap *gzmap, { int do_draw = wm_gizmo_is_visible(gz); if (do_draw == 0) { - /* Skip. */ + /* skip */ } else { - /* Ensure we get RNA updates. */ + /* Ensure we get RNA updates */ if (do_draw & WM_GIZMO_IS_VISIBLE_UPDATE) { - /* Hover gizmos need updating, even if we don't draw them. */ + /* hover gizmos need updating, even if we don't draw them */ wm_gizmo_update(gz, C, (gzmap->update_flag[drawstep] & GIZMOMAP_IS_PREPARE_DRAW) != 0); } if (do_draw & WM_GIZMO_IS_VISIBLE_DRAW) { @@ -374,7 +374,7 @@ static void gizmomap_prepare_drawing(wmGizmoMap *gzmap, gzmap->update_flag[drawstep] &= ~GIZMOMAP_IS_REFRESH_CALLBACK; LISTBASE_FOREACH (wmGizmoGroup *, gzgroup, &gzmap->groups) { - /* Check group visibility - drawstep first to avoid unnecessary call of group poll callback. */ + /* check group visibility - drawstep first to avoid unnecessary call of group poll callback */ if (!wm_gizmogroup_is_visible_in_drawstep(gzgroup, drawstep)) { continue; } @@ -398,7 +398,7 @@ static void gizmomap_prepare_drawing(wmGizmoMap *gzmap, /* XXX weak: Gizmo-group may skip refreshing if it's invisible * (map gets untagged nevertheless). */ if (do_refresh) { - /* Force refresh again. */ + /* force refresh again. */ gzgroup->init_flag &= ~WM_GIZMOGROUP_INIT_REFRESH; } /* Calls `setup`, `setup_keymap` and `refresh` if they're defined. */ @@ -409,7 +409,7 @@ static void gizmomap_prepare_drawing(wmGizmoMap *gzmap, continue; } - /* Prepare drawing. */ + /* prepare drawing */ if (gzgroup->type->draw_prepare) { gzgroup->type->draw_prepare(C, gzgroup); } @@ -433,13 +433,13 @@ static void gizmos_draw_list(const wmGizmoMap *gzmap, const bContext *C, ListBas return; } - /* TODO(@ideasman42): This will need its own shader probably? + /* TODO(@ideasman42): This will need it own shader probably? * Don't think it can be handled from that point though. */ // const bool use_lighting = (U.gizmo_flag & V3D_GIZMO_SHADED) != 0; bool is_depth_prev = false; - /* `draw_gizmos` contains all visible gizmos - draw them. */ + /* draw_gizmos contains all visible gizmos - draw them */ for (LinkData *link = static_cast(draw_gizmos->first), *link_next; link; link = link_next) { @@ -455,7 +455,7 @@ static void gizmos_draw_list(const wmGizmoMap *gzmap, const bContext *C, ListBas } if (is_depth == is_depth_prev) { - /* Pass. */ + /* pass */ } else { if (is_depth) { @@ -476,7 +476,7 @@ static void gizmos_draw_list(const wmGizmoMap *gzmap, const bContext *C, ListBas GPU_line_smooth(false); GPU_polygon_smooth(false); - /* Free/remove gizmo link after drawing. */ + /* free/remove gizmo link after drawing */ BLI_freelinkN(draw_gizmos, link); } @@ -519,7 +519,7 @@ static void gizmo_draw_select_3d_loop(const bContext *C, bool is_depth = (gz->parent_gzgroup->type->flag & WM_GIZMOGROUPTYPE_DEPTH_3D) != 0; if (is_depth == is_depth_prev) { - /* Pass. */ + /* pass */ } else { if (is_depth) { @@ -532,7 +532,7 @@ static void gizmo_draw_select_3d_loop(const bContext *C, } bool is_depth_skip = (gz->flag & WM_GIZMO_SELECT_BACKGROUND) != 0; if (is_depth_skip == is_depth_skip_prev) { - /* Pass. */ + /* pass */ } else { GPU_depth_mask(!is_depth_skip); @@ -543,7 +543,7 @@ static void gizmo_draw_select_3d_loop(const bContext *C, *r_use_select_bias = true; } - /* Pass the selection id shifted by 8 bits. Last 8 bits are used for selected gizmo part id. */ + /* pass the selection id shifted by 8 bits. Last 8 bits are used for selected gizmo part id */ gz->type->draw_select(C, gz, select_id << 8); } @@ -581,9 +581,9 @@ static int gizmo_find_intersected_3d_intern(wmGizmo **visible_gizmos, /* TODO: waiting for the GPU in the middle of the event loop for every * mouse move is bad for performance, we need to find a solution to not - * use the GPU or draw something once, see #61474. */ + * use the GPU or draw something once. (see #61474) */ GPU_select_begin(&buffer, &rect, GPU_SELECT_NEAREST_FIRST_PASS, 0); - /* Do the drawing. */ + /* do the drawing */ gizmo_draw_select_3d_loop(C, visible_gizmos, visible_gizmos_len, &use_select_bias); hits = GPU_select_end(); @@ -651,7 +651,7 @@ static wmGizmo *gizmo_find_intersected_3d(bContext *C, *r_part = 0; - /* Set up view matrices. */ + /* set up view matrices */ view3d_operator_needs_opengl(C); /* Search for 3D gizmo's that use the 2D callback for checking intersections. */ @@ -761,7 +761,7 @@ wmGizmo *wm_gizmomap_highlight_find(wmGizmoMap *gzmap, if (do_step[step]) { if (gzmap->update_flag[step] & GIZMOMAP_IS_REFRESH_CALLBACK) { WM_gizmo_group_refresh(C, gzgroup); - /* Cleared below. */ + /* cleared below */ } if (step == WM_GIZMOMAP_DRAWSTEP_3D) { wm_gizmogroup_intersectable_gizmos_to_list( @@ -819,7 +819,7 @@ void wm_gizmomaps_handled_modal_update(bContext *C, wmEvent *event, wmEventHandl { const bool modal_running = (handler->op != nullptr); - /* Happens on render or when joining areas. */ + /* happens on render or when joining areas */ if (!handler->context.region || !handler->context.region->gizmo_map) { return; } @@ -831,7 +831,7 @@ void wm_gizmomaps_handled_modal_update(bContext *C, wmEvent *event, wmEventHandl wm_gizmomap_handler_context_op(C, handler); - /* Regular update for running operator. */ + /* regular update for running operator */ if (modal_running) { wmGizmoOpElem *gzop = gz ? WM_gizmo_operator_get(gz, gz->highlight_part) : nullptr; if (gz && gzop && (gzop->type != nullptr) && (gzop->type == handler->op->type)) { @@ -844,7 +844,7 @@ void wm_gizmomaps_handled_modal_update(bContext *C, wmEvent *event, wmEventHandl } } } - /* Operator not running anymore. */ + /* operator not running anymore */ else { wm_gizmomap_highlight_set(gzmap, C, nullptr, 0); if (gz) { @@ -857,7 +857,7 @@ void wm_gizmomaps_handled_modal_update(bContext *C, wmEvent *event, wmEventHandl } } - /* Restore the area. */ + /* restore the area */ CTX_wm_area_set(C, area); CTX_wm_region_set(C, region); } @@ -876,8 +876,8 @@ bool wm_gizmomap_deselect_all(wmGizmoMap *gzmap) wm_gizmomap_select_array_clear(gzmap); - /* Always return true, we already checked - * if there's anything to deselect. */ + /* always return true, we already checked + * if there's anything to deselect */ return true; } @@ -895,7 +895,7 @@ static bool wm_gizmomap_select_all_intern(bContext *C, wmGizmoMap *gzmap) wmGizmoMapSelectState *msel = &gzmap->gzmap_context.select; /* GHash is used here to avoid having to loop over all gizmos twice (once to * get tot_sel for allocating, once for actually selecting). Instead we collect - * selectable gizmos in hash table and use this to get tot_sel and do selection. */ + * selectable gizmos in hash table and use this to get tot_sel and do selection */ GHash *hash = WM_gizmomap_gizmo_hash_new( C, gzmap, gizmo_selectable_poll, nullptr, WM_GIZMO_HIDDEN | WM_GIZMO_HIDDEN_SELECT); @@ -909,7 +909,7 @@ static bool wm_gizmomap_select_all_intern(bContext *C, wmGizmoMap *gzmap) wmGizmo *gz_iter = static_cast(BLI_ghashIterator_getValue(&gh_iter)); WM_gizmo_select_set(gzmap, gz_iter, true); } - /* Highlight first gizmo. */ + /* highlight first gizmo */ wm_gizmomap_highlight_set(gzmap, C, msel->items[0], msel->items[0]->highlight_part); BLI_assert(BLI_ghash_len(hash) == msel->len); @@ -954,8 +954,8 @@ void wm_gizmomap_handler_context_op(bContext *C, wmEventHandler_Op *handler) } } if (area == nullptr) { - /* When changing screen layouts with running modal handlers (like render display), - * this is not an error to print. */ + /* when changing screen layouts with running modal handlers (like render display), this + * is not an error to print */ printf("internal error: modal gizmo-map handler has invalid area\n"); } else { @@ -967,7 +967,7 @@ void wm_gizmomap_handler_context_op(bContext *C, wmEventHandler_Op *handler) break; } } - /* XXX no warning print here, after full-area and back regions are remade. */ + /* XXX no warning print here, after full-area and back regions are remade */ if (region) { CTX_wm_region_set(C, region); } @@ -977,7 +977,7 @@ void wm_gizmomap_handler_context_op(bContext *C, wmEventHandler_Op *handler) void wm_gizmomap_handler_context_gizmo(bContext * /*C*/, wmEventHandler_Gizmo * /*handler*/) { - /* Pass. */ + /* pass */ } bool WM_gizmomap_cursor_set(const wmGizmoMap *gzmap, wmWindow *win) @@ -1026,7 +1026,7 @@ bool wm_gizmomap_highlight_set(wmGizmoMap *gzmap, const bContext *C, wmGizmo *gz gzmap->gzmap_context.last_cursor = -1; } - /* Tag the region for redraw. */ + /* tag the region for redraw */ if (C) { ARegion *region = CTX_wm_region(C); ED_region_tag_redraw_editor_overlays(region); @@ -1088,7 +1088,7 @@ void wm_gizmomap_modal_set( wm_gizmomap_modal_set(gzmap, C, gz, event, false); } - /* We failed to hook the gizmo to the operator handler or operator was canceled, return. */ + /* we failed to hook the gizmo to the operator handler or operator was cancelled, return */ if (!gzmap->gzmap_context.modal) { gz->state &= ~WM_GIZMO_STATE_MODAL; MEM_SAFE_FREE(gz->interaction_data); @@ -1098,7 +1098,7 @@ void wm_gizmomap_modal_set( else { BLI_assert(ELEM(gzmap->gzmap_context.modal, nullptr, gz)); - /* Deactivate, gizmo but first take care of some stuff. */ + /* deactivate, gizmo but first take care of some stuff */ if (gz) { gz->state &= ~WM_GIZMO_STATE_MODAL; MEM_SAFE_FREE(gz->interaction_data); @@ -1195,7 +1195,7 @@ void WM_gizmomap_message_subscribe(const bContext *C, } } -/** \} */ /* #wmGizmoMap. */ +/** \} */ /* wmGizmoMap */ /* -------------------------------------------------------------------- */ /** \name Tooltip Handling @@ -1220,7 +1220,7 @@ ARegion *WM_gizmomap_tooltip_init( return nullptr; } -/** \} */ /* #wmGizmoMapType. */ +/** \} */ /* wmGizmoMapType */ /* -------------------------------------------------------------------- */ /** \name wmGizmoMapType @@ -1288,7 +1288,7 @@ void wm_gizmos_keymap(wmKeyConfig *keyconf) wm_gizmogroup_tweak_modal_keymap(keyconf); } -/** \} */ /* #wmGizmoMapType. */ +/** \} */ /* wmGizmoMapType */ /* -------------------------------------------------------------------- */ /** \name Updates for Dynamic Type Registration @@ -1296,7 +1296,7 @@ void wm_gizmos_keymap(wmKeyConfig *keyconf) void WM_gizmoconfig_update_tag_group_type_init(wmGizmoMapType *gzmap_type, wmGizmoGroupType *gzgt) { - /* Tag for update on next use. */ + /* tag for update on next use */ gzmap_type->type_update_flag |= (WM_GIZMOMAPTYPE_UPDATE_INIT | WM_GIZMOMAPTYPE_KEYMAP_INIT); gzgt->type_update_flag |= (WM_GIZMOMAPTYPE_UPDATE_INIT | WM_GIZMOMAPTYPE_KEYMAP_INIT); @@ -1306,7 +1306,7 @@ void WM_gizmoconfig_update_tag_group_type_init(wmGizmoMapType *gzmap_type, wmGiz void WM_gizmoconfig_update_tag_group_type_remove(wmGizmoMapType *gzmap_type, wmGizmoGroupType *gzgt) { - /* Tag for update on next use. */ + /* tag for update on next use */ gzmap_type->type_update_flag |= WM_GIZMOMAPTYPE_UPDATE_REMOVE; gzgt->type_update_flag |= WM_GIZMOMAPTYPE_UPDATE_REMOVE; diff --git a/source/blender/windowmanager/gizmo/intern/wm_gizmo_target_props.cc b/source/blender/windowmanager/gizmo/intern/wm_gizmo_target_props.cc index 22c5cf9a5f0..30a6923c9eb 100644 --- a/source/blender/windowmanager/gizmo/intern/wm_gizmo_target_props.cc +++ b/source/blender/windowmanager/gizmo/intern/wm_gizmo_target_props.cc @@ -14,14 +14,21 @@ #include "RNA_access.hh" +#include "WM_api.hh" #include "WM_message.hh" #include "WM_types.hh" +#include "wm.hh" + +#include "ED_keyframing.hh" #include "ED_screen.hh" +#include "ED_view3d.hh" #include "ANIM_keyframing.hh" -/* Own includes. */ +/* own includes */ +#include "wm_gizmo_intern.hh" +#include "wm_gizmo_wmapi.hh" /* -------------------------------------------------------------------- */ /** \name Property Definition @@ -63,7 +70,7 @@ void WM_gizmo_target_property_def_rna_ptr(wmGizmo *gz, { wmGizmoProperty *gz_prop = WM_gizmo_target_property_at_index(gz, gz_prop_type->index_in_type); - /* If gizmo evokes an operator we cannot use it for property manipulation. */ + /* if gizmo evokes an operator we cannot use it for property manipulation */ BLI_assert(gz->op_data == nullptr); BLI_assert(prop != nullptr); @@ -95,7 +102,7 @@ void WM_gizmo_target_property_def_func_ptr(wmGizmo *gz, { wmGizmoProperty *gz_prop = WM_gizmo_target_property_at_index(gz, gz_prop_type->index_in_type); - /* If gizmo evokes an operator we cannot use it for property manipulation. */ + /* if gizmo evokes an operator we cannot use it for property manipulation */ BLI_assert(gz->op_data == nullptr); gz_prop->type = gz_prop_type; @@ -123,7 +130,7 @@ void WM_gizmo_target_property_clear_rna_ptr(wmGizmo *gz, const wmGizmoPropertyTy { wmGizmoProperty *gz_prop = WM_gizmo_target_property_at_index(gz, gz_prop_type->index_in_type); - /* If gizmo evokes an operator we cannot use it for property manipulation. */ + /* if gizmo evokes an operator we cannot use it for property manipulation */ BLI_assert(gz->op_data == nullptr); gz_prop->type = nullptr; @@ -189,7 +196,7 @@ void WM_gizmo_target_property_float_set(bContext *C, return; } - /* Reset property. */ + /* reset property */ if (gz_prop->index == -1) { RNA_property_float_set(&gz_prop->ptr, gz_prop->prop, value); } diff --git a/source/blender/windowmanager/gizmo/intern/wm_gizmo_type.cc b/source/blender/windowmanager/gizmo/intern/wm_gizmo_type.cc index f9a5b13ac27..e33b2130112 100644 --- a/source/blender/windowmanager/gizmo/intern/wm_gizmo_type.cc +++ b/source/blender/windowmanager/gizmo/intern/wm_gizmo_type.cc @@ -12,6 +12,7 @@ #include "BLI_listbase.h" #include "BLI_utildefines.h" +#include "BKE_context.hh" #include "BKE_main.hh" #include "DNA_screen_types.h" @@ -23,11 +24,15 @@ #include "RNA_define.hh" #include "RNA_prototypes.h" +#include "WM_api.hh" #include "WM_types.hh" #include "ED_screen.hh" -/* Own includes. */ +/* only for own init/exit calls (wm_gizmotype_init/wm_gizmotype_free) */ +#include "wm.hh" + +/* own includes */ #include "wm_gizmo_intern.hh" #include "wm_gizmo_wmapi.hh" @@ -181,7 +186,7 @@ void wm_gizmotype_free() void wm_gizmotype_init() { - /* Reserve size is set based on blender default setup. */ + /* reserve size is set based on blender default setup */ global_gizmotype_hash = BLI_ghash_str_new_ex("wm_gizmotype_init gh", 128); } diff --git a/source/blender/windowmanager/gizmo/wm_gizmo_fn.hh b/source/blender/windowmanager/gizmo/wm_gizmo_fn.hh index f7a5fd324d7..c6832e1f463 100644 --- a/source/blender/windowmanager/gizmo/wm_gizmo_fn.hh +++ b/source/blender/windowmanager/gizmo/wm_gizmo_fn.hh @@ -15,7 +15,7 @@ struct wmKeyMap; struct wmMsgBus; -/* #wmGizmoGroup. */ +/* wmGizmoGroup */ using wmGizmoGroupFnPoll = bool (*)(const bContext *, wmGizmoGroupType *); using wmGizmoGroupFnInit = void (*)(const bContext *, wmGizmoGroup *); using wmGizmoGroupFnRefresh = void (*)(const bContext *, wmGizmoGroup *); @@ -27,7 +27,7 @@ using wmGizmoGroupFnInvokePrepare = void (*)(const bContext *, using wmGizmoGroupFnSetupKeymap = wmKeyMap *(*)(const wmGizmoGroupType *, wmKeyConfig *); using wmGizmoGroupFnMsgBusSubscribe = void (*)(const bContext *, wmGizmoGroup *, wmMsgBus *); -/* #wmGizmo. */ +/* wmGizmo */ /* See: wmGizmoType for docs on each type. */ using wmGizmoFnSetup = void (*)(wmGizmo *); @@ -44,18 +44,18 @@ using wmGizmoFnScreenBoundsGet = bool (*)(bContext *, wmGizmo *, rcti *r_boundin using wmGizmoFnSelectRefresh = void (*)(wmGizmo *); using wmGizmoFnFree = void (*)(wmGizmo *); -/* #wmGizmoProperty ('value' type defined by 'wmGizmoProperty.data_type'). */ +/* wmGizmoProperty ('value' type defined by 'wmGizmoProperty.data_type') */ using wmGizmoPropertyFnGet = void (*)(const wmGizmo *, wmGizmoProperty *, - /* Typically `float *`. */ + /* typically 'float *' */ void *value); using wmGizmoPropertyFnSet = void (*)(const wmGizmo *, wmGizmoProperty *, - /* Typically `const float *`. */ + /* typically 'const float *' */ const void *value); using wmGizmoPropertyFnRangeGet = void (*)(const wmGizmo *, wmGizmoProperty *, - /* Typically `float[2]`. */ + /* typically 'float[2]' */ void *range); using wmGizmoPropertyFnFree = void (*)(const wmGizmo *, wmGizmoProperty *); diff --git a/source/blender/windowmanager/gizmo/wm_gizmo_wmapi.hh b/source/blender/windowmanager/gizmo/wm_gizmo_wmapi.hh index a4b5fd9e0ef..d017d2dffa6 100644 --- a/source/blender/windowmanager/gizmo/wm_gizmo_wmapi.hh +++ b/source/blender/windowmanager/gizmo/wm_gizmo_wmapi.hh @@ -24,7 +24,7 @@ struct wmOperatorType; /** \name #wmGizmo * \{ */ -/* `wm_gizmo_type.cc`, for init/exit. */ +/* `wm_gizmo_type.cc`, for init/exit */ void wm_gizmotype_free(); /** @@ -32,7 +32,7 @@ void wm_gizmotype_free(); */ void wm_gizmotype_init(); -/* `wm_gizmogroup_type.cc`, for init/exit. */ +/* wm_gizmogroup_type.c, for init/exit */ void wm_gizmogrouptype_free(); /** diff --git a/source/blender/windowmanager/intern/wm.cc b/source/blender/windowmanager/intern/wm.cc index f8e029838c3..4c522d7ea57 100644 --- a/source/blender/windowmanager/intern/wm.cc +++ b/source/blender/windowmanager/intern/wm.cc @@ -26,16 +26,16 @@ #include "BLI_blenlib.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_context.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_idprop.h" #include "BKE_idtype.hh" #include "BKE_lib_id.hh" #include "BKE_lib_query.hh" #include "BKE_main.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "BKE_screen.hh" #include "BKE_workspace.h" @@ -113,14 +113,12 @@ static void window_manager_blend_write(BlendWriter *writer, ID *id, const void * { wmWindowManager *wm = (wmWindowManager *)id; - wm->runtime = nullptr; - BLO_write_id_struct(writer, wmWindowManager, id_address, &wm->id); BKE_id_blend_write(writer, &wm->id); write_wm_xr_data(writer, &wm->xr); LISTBASE_FOREACH (wmWindow *, win, &wm->windows) { - /* Update deprecated screen member (for so loading in 2.7x uses the correct screen). */ + /* update deprecated screen member (for so loading in 2.7x uses the correct screen) */ win->screen = BKE_workspace_active_screen_get(win->workspace_hook); BLO_write_struct(writer, wmWindow, win); @@ -129,7 +127,7 @@ static void window_manager_blend_write(BlendWriter *writer, ID *id, const void * BKE_screen_area_map_blend_write(writer, &win->global_areas); - /* Data is written, clear deprecated data again. */ + /* data is written, clear deprecated data again */ win->screen = nullptr; } } @@ -210,6 +208,7 @@ static void window_manager_blend_read_data(BlendDataReader *reader, ID *id) BLI_listbase_clear(&wm->paintcursors); BLI_listbase_clear(&wm->notifier_queue); wm->notifier_queue_set = nullptr; + BKE_reports_init(&wm->reports, RPT_STORE); BLI_listbase_clear(&wm->keyconfigs); wm->defaultconf = nullptr; @@ -228,9 +227,7 @@ static void window_manager_blend_read_data(BlendDataReader *reader, ID *id) wm->winactive = nullptr; wm->init_flag = 0; wm->op_undo_depth = 0; - - BLI_assert(wm->runtime == nullptr); - wm->runtime = MEM_new(__func__); + wm->is_interface_locked = 0; } static void window_manager_blend_read_after_liblink(BlendLibReader *reader, ID *id) @@ -247,7 +244,6 @@ static void window_manager_blend_read_after_liblink(BlendLibReader *reader, ID * IDTypeInfo IDType_ID_WM = { /*id_code*/ ID_WM, /*id_filter*/ FILTER_ID_WM, - /*dependencies_id_types*/ FILTER_ID_SCE | FILTER_ID_WS, /*main_listbase_index*/ INDEX_ID_WM, /*struct_size*/ sizeof(wmWindowManager), /*name*/ "WindowManager", @@ -348,7 +344,8 @@ void WM_operator_type_set(wmOperator *op, wmOperatorType *ot) static void wm_reports_free(wmWindowManager *wm) { - WM_event_timer_remove(wm, nullptr, wm->runtime->reports.reporttimer); + BKE_reports_free(&wm->reports); + WM_event_timer_remove(wm, nullptr, wm->reports.reporttimer); } void wm_operator_register(bContext *C, wmOperator *op) @@ -410,8 +407,8 @@ void WM_operator_handlers_clear(wmWindowManager *wm, wmOperatorType *ot) if (handler_base->type == WM_HANDLER_TYPE_OP) { wmEventHandler_Op *handler = (wmEventHandler_Op *)handler_base; if (handler->op && handler->op->type == ot) { - /* Don't run op->cancel because it needs the context, - * assume whoever unregisters the operator will cleanup. */ + /* don't run op->cancel because it needs the context, + * assume whoever unregisters the operator will cleanup */ handler->head.flag |= WM_HANDLER_DO_FREE; WM_operator_free(handler->op); handler->op = nullptr; @@ -452,8 +449,8 @@ void WM_keyconfig_init(bContext *C) /* Initialize only after python init is done, for keymaps that use python operators. */ if (CTX_py_init_get(C) && (wm->init_flag & WM_INIT_FLAG_KEYCONFIG) == 0) { - /* Create default key config, only initialize once, - * it's persistent across sessions. */ + /* create default key config, only initialize once, + * it's persistent across sessions */ if (!(wm->defaultconf->flag & KEYCONF_INIT_DEFAULT)) { wm_window_keymap(wm->defaultconf); ED_spacetypes_keymap(wm->defaultconf); @@ -539,11 +536,11 @@ void wm_add_default(Main *bmain, bContext *C) wmWindowManager *wm = static_cast( BKE_libblock_alloc(bmain, ID_WM, "WinMan", 0)); wmWindow *win; - bScreen *screen = CTX_wm_screen(C); /* XXX: from file read hrmf. */ + bScreen *screen = CTX_wm_screen(C); /* XXX from file read hrmf */ WorkSpace *workspace; WorkSpaceLayout *layout = BKE_workspace_layout_find_global(bmain, screen, &workspace); - BKE_reports_init(&wm->runtime->reports, RPT_STORE); + BKE_reports_init(&wm->reports, RPT_STORE); CTX_wm_manager_set(C, wm); win = wm_window_new(bmain, wm, nullptr, false); @@ -555,7 +552,6 @@ void wm_add_default(Main *bmain, bContext *C) wm->winactive = win; wm->file_saved = 1; - wm->runtime = MEM_new(__func__); wm_window_make_drawable(wm, win); } @@ -616,8 +612,6 @@ void wm_close_and_free(bContext *C, wmWindowManager *wm) if (C && CTX_wm_manager(C) == wm) { CTX_wm_manager_set(C, nullptr); } - - MEM_delete(wm->runtime); } void WM_main(bContext *C) diff --git a/source/blender/windowmanager/intern/wm_cursors.cc b/source/blender/windowmanager/intern/wm_cursors.cc index 4bb4a662db4..48529de8fef 100644 --- a/source/blender/windowmanager/intern/wm_cursors.cc +++ b/source/blender/windowmanager/intern/wm_cursors.cc @@ -15,11 +15,14 @@ #include "BLI_utildefines.h" +#include "BLI_sys_types.h" + #include "DNA_listBase.h" #include "DNA_userdef_types.h" #include "DNA_workspace_types.h" -#include "BKE_global.hh" +#include "BKE_context.hh" +#include "BKE_global.h" #include "BKE_main.hh" #include "WM_api.hh" @@ -130,7 +133,7 @@ static void window_set_custom_cursor_ex(wmWindow *win, BCursor *cursor) void WM_cursor_set(wmWindow *win, int curs) { if (win == nullptr || G.background) { - return; /* Can't set custom cursor before Window init. */ + return; /* Can't set custom cursor before Window init */ } if (curs == WM_CURSOR_DEFAULT && win->modalcursor) { @@ -145,7 +148,7 @@ void WM_cursor_set(wmWindow *win, int curs) GHOST_SetCursorVisibility(static_cast(win->ghostwin), true); if (win->cursor == curs) { - return; /* Cursor is already set. */ + return; /* Cursor is already set */ } win->cursor = curs; @@ -318,7 +321,7 @@ static void wm_cursor_warp_relative(wmWindow *win, int x, int y) bool wm_cursor_arrow_move(wmWindow *win, const wmEvent *event) { - /* TODO: give it a modal keymap? Hard coded for now. */ + /* TODO: give it a modal keymap? Hard coded for now */ if (win && event->val == KM_PRESS) { /* Must move at least this much to avoid rounding in WM_cursor_warp. */ @@ -346,7 +349,7 @@ bool wm_cursor_arrow_move(wmWindow *win, const wmEvent *event) void WM_cursor_time(wmWindow *win, int nr) { - /* 10 8x8 digits. */ + /* 10 8x8 digits */ const char number_bitmaps[10][8] = { {0, 56, 68, 68, 68, 68, 68, 56}, {0, 24, 16, 16, 16, 16, 16, 56}, @@ -368,7 +371,7 @@ void WM_cursor_time(wmWindow *win, int nr) memset(&mask, 0xFF, sizeof(mask)); - /* Print number bottom right justified. */ + /* print number bottom right justified */ for (int idx = 3; nr && idx >= 0; idx--) { const char *digit = number_bitmaps[nr % 10]; int x = idx % 2; @@ -413,8 +416,8 @@ void WM_cursor_time(wmWindow *win, int nr) * Because defining a cursor mixes declarations and executable code * each cursor needs its own scoping block or it would be split up * over several hundred lines of code. To enforce/document this better - * I define 2 pretty brain-dead macros so it's obvious what the extra "[]" are for. - */ + * I define 2 pretty brain-dead macros so it's obvious what the extra "[]" + * are for */ #define BEGIN_CURSOR_BLOCK \ { \ diff --git a/source/blender/windowmanager/intern/wm_dragdrop.cc b/source/blender/windowmanager/intern/wm_dragdrop.cc index d3aa91000e2..2c6b3296862 100644 --- a/source/blender/windowmanager/intern/wm_dragdrop.cc +++ b/source/blender/windowmanager/intern/wm_dragdrop.cc @@ -19,7 +19,7 @@ #include "MEM_guardedalloc.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BLI_bitmap.h" #include "BLI_blenlib.h" @@ -28,7 +28,7 @@ #include "BIF_glutil.hh" #include "BKE_context.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_idprop.h" #include "BKE_idtype.hh" #include "BKE_lib_id.hh" @@ -37,7 +37,7 @@ #include "GHOST_C-api.h" -#include "BLO_readfile.hh" +#include "BLO_readfile.h" #include "ED_asset.hh" #include "ED_fileselect.hh" @@ -74,9 +74,9 @@ static void wm_drop_item_clear_runtime(wmDropBox *drop); wmDragActiveDropState::wmDragActiveDropState() = default; wmDragActiveDropState::~wmDragActiveDropState() = default; -/* Drop box maps are stored global for now. */ -/* These are part of blender's UI/space specs, and not like keymaps. */ -/* When editors become configurable, they can add their own dropbox definitions. */ +/* drop box maps are stored global for now */ +/* these are part of blender's UI/space specs, and not like keymaps */ +/* when editors become configurable, they can add own dropbox definitions */ struct wmDropBoxMap { wmDropBoxMap *next, *prev; @@ -107,9 +107,9 @@ ListBase *WM_dropboxmap_find(const char *idname, int spaceid, int regionid) wmDropBox *WM_dropbox_add(ListBase *lb, const char *idname, - bool (*poll)(bContext *C, wmDrag *drag, const wmEvent *event), - void (*copy)(bContext *C, wmDrag *drag, wmDropBox *drop), - void (*cancel)(Main *bmain, wmDrag *drag, wmDropBox *drop), + bool (*poll)(bContext *, wmDrag *, const wmEvent *), + void (*copy)(bContext *, wmDrag *, wmDropBox *), + void (*cancel)(Main *, wmDrag *, wmDropBox *), WMDropboxTooltipFunc tooltip) { wmOperatorType *ot = WM_operatortype_find(idname, true); @@ -258,12 +258,13 @@ static void wm_dropbox_invoke(bContext *C, wmDrag *drag) } } -wmDrag *WM_drag_data_create(bContext *C, int icon, eWM_DragDataType type, void *poin, uint flags) +wmDrag *WM_drag_data_create( + bContext *C, int icon, eWM_DragDataType type, void *poin, double value, uint flags) { wmDrag *drag = MEM_new(__func__); /* Keep track of future multi-touch drag too, add a mouse-pointer id or so. */ - /* If multiple drags are added, they're drawn as list. */ + /* if multiple drags are added, they're drawn as list */ drag->flags = static_cast(flags); drag->icon = icon; @@ -301,6 +302,7 @@ wmDrag *WM_drag_data_create(bContext *C, int icon, eWM_DragDataType type, void * drag->poin = poin; break; } + drag->value = value; return drag; } @@ -313,9 +315,10 @@ void WM_event_start_prepared_drag(bContext *C, wmDrag *drag) wm_dropbox_invoke(C, drag); } -void WM_event_start_drag(bContext *C, int icon, eWM_DragDataType type, void *poin, uint flags) +void WM_event_start_drag( + bContext *C, int icon, eWM_DragDataType type, void *poin, double value, uint flags) { - wmDrag *drag = WM_drag_data_create(C, icon, type, poin, flags); + wmDrag *drag = WM_drag_data_create(C, icon, type, poin, value, flags); WM_event_start_prepared_drag(C, drag); } @@ -379,11 +382,6 @@ void WM_drag_data_free(eWM_DragDataType dragtype, void *poin) wm_drag_free_path_data(&path_data); break; } - case WM_DRAG_STRING: { - std::string *str = static_cast(poin); - MEM_delete(str); - break; - } default: MEM_freeN(poin); break; @@ -478,7 +476,7 @@ static wmDropBox *dropbox_active(bContext *C, return nullptr; } -/* Return active operator tooltip/name when mouse is in box. */ +/* return active operator tooltip/name when mouse is in box */ static wmDropBox *wm_dropbox_active(bContext *C, wmDrag *drag, const wmEvent *event) { wmWindow *win = CTX_wm_window(C); @@ -922,24 +920,6 @@ int WM_drag_get_path_file_type(const wmDrag *drag) return path_data->file_types[0]; } -const std::string &WM_drag_get_string(const wmDrag *drag) -{ - BLI_assert(drag->type == WM_DRAG_STRING); - const std::string *str = static_cast(drag->poin); - return *str; -} - -std::string WM_drag_get_string_firstline(const wmDrag *drag) -{ - BLI_assert(drag->type == WM_DRAG_STRING); - const std::string *str = static_cast(drag->poin); - const size_t str_eol = str->find('\n'); - if (str_eol != std::string::npos) { - return str->substr(0, str_eol); - } - return *str; -} - /* ************** draw ***************** */ static void wm_drop_operator_draw(const blender::StringRef name, int x, int y) @@ -1024,7 +1004,7 @@ static void wm_drag_draw_icon(bContext * /*C*/, wmWindow * /*win*/, wmDrag *drag x = xy[0] - (wm_drag_imbuf_icon_width_get(drag) / 2); y = xy[1] - (wm_drag_imbuf_icon_height_get(drag) / 2); - const float col[4] = {1.0f, 1.0f, 1.0f, 0.65f}; /* This blends texture. */ + const float col[4] = {1.0f, 1.0f, 1.0f, 0.65f}; /* this blends texture */ IMMDrawPixelsTexState state = immDrawPixelsTexSetup(GPU_SHADER_3D_IMAGE_COLOR); immDrawPixelsTexTiled_scaling(&state, x, diff --git a/source/blender/windowmanager/intern/wm_draw.cc b/source/blender/windowmanager/intern/wm_draw.cc index d828a0bc8ad..a64dd81ef03 100644 --- a/source/blender/windowmanager/intern/wm_draw.cc +++ b/source/blender/windowmanager/intern/wm_draw.cc @@ -21,13 +21,16 @@ #include "MEM_guardedalloc.h" +#include "BLI_blenlib.h" #include "BLI_math_matrix.h" #include "BLI_math_vector_types.hh" #include "BLI_utildefines.h" #include "BKE_context.hh" +#include "BKE_global.h" #include "BKE_image.h" -#include "BKE_scene.hh" +#include "BKE_main.hh" +#include "BKE_scene.h" #include "BKE_screen.hh" #include "GHOST_C-api.h" @@ -105,7 +108,7 @@ static void wm_paintcursor_draw(bContext *C, ScrArea *area, ARegion *region) /* Don't draw paint cursors with locked interface. Painting is not possible * then, and cursor drawing can use scene data that another thread may be * modifying. */ - if (wm->runtime->is_interface_locked) { + if (wm->is_interface_locked) { return; } @@ -505,7 +508,7 @@ static void wm_region_test_render_do_draw(const Scene *scene, ScrArea *area, ARegion *region) { - /* Tag region for redraw from render engine preview running inside of it. */ + /* tag region for redraw from render engine preview running inside of it */ if (area->spacetype == SPACE_VIEW3D && region->regiontype == RGN_TYPE_WINDOW) { RegionView3D *rv3d = static_cast(region->regiondata); RenderEngine *engine = rv3d->view_render ? RE_view_engine_get(rv3d->view_render) : nullptr; @@ -515,7 +518,7 @@ static void wm_region_test_render_do_draw(const Scene *scene, View3D *v3d = static_cast(area->spacedata.first); rcti border_rect; - /* Do partial redraw when possible. */ + /* do partial redraw when possible */ if (ED_view3d_calc_render_border(scene, depsgraph, v3d, region, &border_rect)) { ED_region_tag_redraw_partial(region, &border_rect, false); } @@ -600,13 +603,11 @@ static const char *wm_area_name(ScrArea *area) struct WindowDrawCB { WindowDrawCB *next, *prev; - void (*draw)(const wmWindow *win, void *customdata); + void (*draw)(const wmWindow *, void *); void *customdata; }; -void *WM_draw_cb_activate(wmWindow *win, - void (*draw)(const wmWindow *win, void *customdata), - void *customdata) +void *WM_draw_cb_activate(wmWindow *win, void (*draw)(const wmWindow *, void *), void *customdata) { WindowDrawCB *wdc = static_cast(MEM_callocN(sizeof(*wdc), "WindowDrawCB")); @@ -716,7 +717,7 @@ static void wm_draw_region_buffer_create(Scene *scene, } else { /* Allocate off-screen buffer if it does not exist. This one has no - * depth or multi-sample buffers. 3D view creates its own buffers with + * depth or multi-sample buffers. 3D view creates own buffers with * the data it needs. */ GPUOffScreen *offscreen = GPU_offscreen_create(region->winx, region->winy, @@ -834,7 +835,7 @@ void wm_draw_region_blend(ARegion *region, int view, bool blend) alpha = 1.0f; } - /* #wmOrtho for the screen has this same offset. */ + /* wmOrtho for the screen has this same offset */ const float halfx = GLA_PIXEL_OFS / (BLI_rcti_size_x(®ion->winrct) + 1); const float halfy = GLA_PIXEL_OFS / (BLI_rcti_size_y(®ion->winrct) + 1); @@ -851,7 +852,7 @@ void wm_draw_region_blend(ARegion *region, int view, bool blend) float alpha_easing = 1.0f - alpha; alpha_easing = 1.0f - alpha_easing * alpha_easing; - /* Slide vertical panels. */ + /* Slide vertical panels */ float ofs_x = BLI_rcti_size_x(®ion->winrct) * (1.0f - alpha_easing); if (RGN_ALIGN_ENUM_FROM_MASK(region->alignment) == RGN_ALIGN_RIGHT) { rect_geo.xmin += ofs_x; @@ -874,7 +875,7 @@ void wm_draw_region_blend(ARegion *region, int view, bool blend) GPU_blend(GPU_BLEND_ALPHA_PREMULT); } - /* Setup actual texture. */ + /* setup actual texture */ GPUTexture *texture = wm_draw_region_texture(region, view); GPUShader *shader = GPU_shader_get_builtin_shader(GPU_SHADER_2D_IMAGE_RECT_COLOR); @@ -928,7 +929,7 @@ static void wm_draw_window_offscreen(bContext *C, wmWindow *win, bool stereo) wmWindowManager *wm = CTX_wm_manager(C); bScreen *screen = WM_window_get_active_screen(win); - /* Draw screen areas into their own frame buffer. */ + /* Draw screen areas into own frame buffer. */ ED_screen_areas_iter (win, screen, area) { CTX_wm_area_set(C, area); GPU_debug_group_begin(wm_area_name(area)); @@ -1105,7 +1106,7 @@ static void wm_draw_window_onscreen(bContext *C, wmWindow *win, int view) } wmWindowViewport(win); - /* Blend in overlapping area regions. */ + /* Blend in overlapping area regions */ ED_screen_areas_iter (win, screen, area) { LISTBASE_FOREACH (ARegion *, region, &area->regionbase) { if (!region->visible) { @@ -1131,7 +1132,7 @@ static void wm_draw_window_onscreen(bContext *C, wmWindow *win, int view) wm_draw_region_blend(region, 0, true); } - /* Always draw, not only when screen tagged. */ + /* always draw, not only when screen tagged */ if (win->gesture.first) { wm_gesture_draw(win); wmWindowViewport(win); @@ -1253,7 +1254,7 @@ static void wm_draw_surface(bContext *C, wmSurface *surface) GPU_context_end_frame(surface->blender_gpu_context); - /* Avoid interference with window drawable. */ + /* Avoid interference with window drawable */ wm_surface_clear_drawable(); } @@ -1429,7 +1430,7 @@ bool WM_desktop_cursor_sample_read(float r_col[3]) /** \name Main Update Call * \{ */ -/* Quick test to prevent changing window drawable. */ +/* quick test to prevent changing window drawable */ static bool wm_draw_update_test_window(Main *bmain, bContext *C, wmWindow *win) { const wmWindowManager *wm = CTX_wm_manager(C); @@ -1549,8 +1550,10 @@ void wm_draw_update(bContext *C) static_cast(win->ghostwin)); if (state == GHOST_kWindowStateMinimized) { - /* Do not update minimized windows, gives issues on Intel (see #33223) - * and AMD (see #50856). it seems logical to skip update for invisible window anyway. */ + /* do not update minimized windows, gives issues on Intel (see #33223) + * and AMD (see #50856). it seems logical to skip update for invisible + * window anyway. + */ continue; } #endif @@ -1560,10 +1563,10 @@ void wm_draw_update(bContext *C) if (wm_draw_update_test_window(bmain, C, win)) { bScreen *screen = WM_window_get_active_screen(win); - /* Sets context window+screen. */ + /* sets context window+screen */ wm_window_make_drawable(wm, win); - /* Notifiers for screen redraw. */ + /* notifiers for screen redraw */ ED_screen_ensure_updated(C, wm, win, screen); wm_draw_window(C, win); @@ -1575,7 +1578,7 @@ void wm_draw_update(bContext *C) CTX_wm_window_set(C, nullptr); - /* Draw non-windows (surfaces). */ + /* Draw non-windows (surfaces) */ wm_surfaces_iter(C, wm_draw_surface); GPU_render_end(); diff --git a/source/blender/windowmanager/intern/wm_event_query.cc b/source/blender/windowmanager/intern/wm_event_query.cc index 01d4bfbc883..b5b3cb6ceee 100644 --- a/source/blender/windowmanager/intern/wm_event_query.cc +++ b/source/blender/windowmanager/intern/wm_event_query.cc @@ -12,6 +12,7 @@ #include #include "DNA_listBase.h" +#include "DNA_scene_types.h" #include "DNA_screen_types.h" #include "DNA_userdef_types.h" #include "DNA_windowmanager_types.h" @@ -21,6 +22,8 @@ #include "BLI_math_vector.h" #include "BLI_utildefines.h" +#include "BKE_context.hh" + #include "RNA_access.hh" #include "WM_api.hh" @@ -31,6 +34,8 @@ #include "RNA_enum_types.hh" +#include "DEG_depsgraph.hh" + /* -------------------------------------------------------------------- */ /** \name Event Printing * \{ */ @@ -139,7 +144,7 @@ void WM_event_print(const wmEvent *event) ndof->progress); } else { - /* NDOF buttons printed already. */ + /* ndof buttons printed already */ } } #endif /* WITH_INPUT_NDOF */ @@ -196,7 +201,7 @@ bool WM_event_type_mask_test(const int event_type, const enum eEventType_Mask ma } } - /* NDOF. */ + /* NDOF */ if (mask & EVT_TYPE_MASK_NDOF) { if (ISNDOF(event_type)) { return true; @@ -226,7 +231,7 @@ bool WM_event_is_modal_drag_exit(const wmEvent *event, /* If the release-confirm preference setting is enabled, * drag events can be canceled when mouse is released. */ if (U.flag & USER_RELEASECONFIRM) { - /* Option on, so can exit with km-release. */ + /* option on, so can exit with km-release */ if (event->val == KM_RELEASE) { if ((init_event_val == KM_CLICK_DRAG) && (event->type == init_event_type)) { return true; @@ -295,7 +300,7 @@ int WM_event_drag_direction(const wmEvent *event) } #if 0 - /* Debug. */ + /* debug */ if (val == 1) { printf("tweak north\n"); } diff --git a/source/blender/windowmanager/intern/wm_event_system.cc b/source/blender/windowmanager/intern/wm_event_system.cc index 5e1b897956a..89b7769fc0f 100644 --- a/source/blender/windowmanager/intern/wm_event_system.cc +++ b/source/blender/windowmanager/intern/wm_event_system.cc @@ -13,7 +13,6 @@ #include #include #include -#include #include "AS_asset_library.hh" @@ -36,19 +35,19 @@ #include "BKE_context.hh" #include "BKE_customdata.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_idprop.h" #include "BKE_lib_remap.hh" #include "BKE_main.hh" -#include "BKE_report.hh" -#include "BKE_scene.hh" +#include "BKE_report.h" +#include "BKE_scene.h" #include "BKE_screen.hh" #include "BKE_undo_system.hh" #include "BKE_workspace.h" #include "BKE_sound.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "ED_asset.hh" #include "ED_fileselect.hh" @@ -396,7 +395,23 @@ void WM_main_remove_notifier_reference(const void *reference) } } -void WM_main_remap_editor_id_reference(const blender::bke::id::IDRemapper &mappings) +static void wm_main_remap_assetlist(ID *old_id, ID *new_id, void * /*user_data*/) +{ + blender::ed::asset::list::storage_id_remap(old_id, new_id); +} + +static void wm_main_remap_msgbus_notify(ID *old_id, ID *new_id, void *user_data) +{ + wmMsgBus *mbus = static_cast(user_data); + if (new_id != nullptr) { + WM_msg_id_update(mbus, old_id, new_id); + } + else { + WM_msg_id_remove(mbus, old_id); + } +} + +void WM_main_remap_editor_id_reference(const IDRemapper *mappings) { Main *bmain = G_MAIN; @@ -408,20 +423,11 @@ void WM_main_remap_editor_id_reference(const blender::bke::id::IDRemapper &mappi } } - mappings.iter( - [](ID *old_id, ID *new_id) { blender::ed::asset::list::storage_id_remap(old_id, new_id); }); + BKE_id_remapper_iter(mappings, wm_main_remap_assetlist, nullptr); - if (wmWindowManager *wm = static_cast(bmain->wm.first)) { - if (wmMsgBus *mbus = wm->message_bus) { - mappings.iter([&](ID *old_id, ID *new_id) { - if (new_id != nullptr) { - WM_msg_id_update(mbus, old_id, new_id); - } - else { - WM_msg_id_remove(mbus, old_id); - } - }); - } + wmWindowManager *wm = static_cast(bmain->wm.first); + if (wm && wm->message_bus) { + BKE_id_remapper_iter(mappings, wm_main_remap_msgbus_notify, wm->message_bus); } AS_asset_library_remap_ids(mappings); @@ -429,7 +435,7 @@ void WM_main_remap_editor_id_reference(const blender::bke::id::IDRemapper &mappi static void wm_notifier_clear(wmNotifier *note) { - /* Clear the entire notifier, only leaving (`next`, `prev`) members intact. */ + /* nullptr the entire notifier, only leaving (`next`, `prev`) members intact. */ memset(((char *)note) + sizeof(Link), 0, sizeof(*note) - sizeof(Link)); note->category = NOTE_CATEGORY_TAG_CLEARED; } @@ -444,7 +450,7 @@ void wm_event_do_depsgraph(bContext *C, bool is_after_open_file) wmWindowManager *wm = CTX_wm_manager(C); /* The whole idea of locked interface is to prevent viewport and whatever thread from * modifying the same data. Because of this, we can not perform dependency graph update. */ - if (wm->runtime->is_interface_locked) { + if (wm->is_interface_locked) { return; } /* Combine data-masks so one window doesn't disable UVs in another #26448. */ @@ -461,7 +467,7 @@ void wm_event_do_depsgraph(bContext *C, bool is_after_open_file) Scene *scene = WM_window_get_active_scene(win); ViewLayer *view_layer = WM_window_get_active_view_layer(win); Main *bmain = CTX_data_main(C); - /* Copied to set's in #scene_update_tagged_recursive(). */ + /* Copied to set's in scene_update_tagged_recursive() */ scene->customdata_mask = win_combine_v3d_datamask; /* XXX, hack so operators can enforce data-masks #26482, GPU render. */ CustomData_MeshMasks_update(&scene->customdata_mask, &scene->customdata_mask_modal); @@ -867,7 +873,7 @@ void wm_event_handler_ui_cancel_ex(bContext *C, wmEvent event; wm_event_init_from_window(win, &event); event.type = EVT_BUT_CANCEL; - event.val = reactivate_button ? KM_NOTHING : KM_PRESS; + event.val = reactivate_button ? 0 : 1; event.flag = (eWM_EventFlag)0; handler->handle_fn(C, &event, handler->user_data); } @@ -898,7 +904,7 @@ void WM_report_banner_show(wmWindowManager *wm, wmWindow *win) } } - ReportList *wm_reports = &wm->runtime->reports; + ReportList *wm_reports = &wm->reports; /* After adding reports to the global list, reset the report timer. */ WM_event_timer_remove(wm, nullptr, wm_reports->reporttimer); @@ -913,8 +919,8 @@ void WM_report_banner_show(wmWindowManager *wm, wmWindow *win) void WM_report_banners_cancel(Main *bmain) { wmWindowManager *wm = static_cast(bmain->wm.first); - BKE_reports_clear(&wm->runtime->reports); - WM_event_timer_remove(wm, nullptr, wm->runtime->reports.reporttimer); + BKE_reports_clear(&wm->reports); + WM_event_timer_remove(wm, nullptr, wm->reports.reporttimer); } #ifdef WITH_INPUT_NDOF @@ -936,7 +942,7 @@ void WM_reports_from_reports_move(wmWindowManager *wm, ReportList *reports) } /* Add reports to the global list, otherwise they are not seen. */ - BKE_reports_move_to_reports(&wm->runtime->reports, reports); + BKE_reports_move_to_reports(&wm->reports, reports); WM_report_banner_show(wm, nullptr); } @@ -1187,7 +1193,7 @@ static void wm_operator_finished(bContext *C, } if (do_register) { - /* Take ownership of reports (in case python provided its own). */ + /* Take ownership of reports (in case python provided own). */ op->reports->flag |= RPT_FREE; wm_operator_register(C, op); @@ -1582,7 +1588,7 @@ static int wm_operator_invoke(bContext *C, wm_operator_finished(C, op, false, store, has_undo_step, has_register); } else if (retval & OPERATOR_RUNNING_MODAL) { - /* Take ownership of reports (in case python provided its own). */ + /* Take ownership of reports (in case python provided own). */ op->reports->flag |= RPT_FREE; /* Grab cursor during blocking modal operators (X11) @@ -1978,7 +1984,7 @@ void WM_operator_name_call_ptr_with_depends_on_cursor(bContext *C, } } - if (!WM_operator_depends_on_cursor(*C, *ot, properties)) { + if ((flag & OPTYPE_DEPENDS_ON_CURSOR) == 0) { WM_operator_name_call_ptr(C, ot, opcontext, properties, event); return; } @@ -2071,7 +2077,7 @@ static void wm_handler_op_context_get_if_valid(bContext *C, } if (handler->context.area == nullptr) { - /* Pass. */ + /* Pass */ } else { ScrArea *area = nullptr; @@ -2595,7 +2601,7 @@ static eHandlerActionFlag wm_handler_operator_call(bContext *C, wmGizmoGroup *gzgroup = WM_gizmomaptype_group_init_runtime_with_region( gzmap_type, gzgt, region); /* We can't rely on drawing to initialize gizmo's since disabling - * overlays/gizmos will prevent pre-drawing setup calls, see #60905. */ + * overlays/gizmos will prevent pre-drawing setup calls. (see #60905) */ WM_gizmogroup_ensure_init(C, gzgroup); } } @@ -2689,7 +2695,7 @@ static eHandlerActionFlag wm_handler_fileselect_do(bContext *C, ED_fileselect_set_params_from_userdef(sfile); } else { - BKE_report(&wm->runtime->reports, RPT_ERROR, "Failed to open window!"); + BKE_report(&wm->reports, RPT_ERROR, "Failed to open window!"); return WM_HANDLER_BREAK; } @@ -2908,15 +2914,21 @@ static const char *keymap_handler_log_action_str(const eHandlerActionFlag action return "un-handled"; } -static std::optional keymap_handler_log_kmi_event_str(const wmKeyMapItem *kmi) +static const char *keymap_handler_log_kmi_event_str(const wmKeyMapItem *kmi, + char *buf, + size_t buf_maxncpy) { /* Short representation of the key that was pressed, * include this since it may differ from the event in minor details * which can help looking up the key-map definition. */ - return WM_keymap_item_to_string(kmi, false); + WM_keymap_item_to_string(kmi, false, buf, buf_maxncpy); + return buf; } -static std::string keymap_handler_log_kmi_op_str(bContext *C, const wmKeyMapItem *kmi) +static const char *keymap_handler_log_kmi_op_str(bContext *C, + const wmKeyMapItem *kmi, + char *buf, + size_t buf_maxncpy) { /* The key-map item properties can further help distinguish this item from others. */ std::optional kmi_props; @@ -2926,12 +2938,11 @@ static std::string keymap_handler_log_kmi_op_str(bContext *C, const wmKeyMapItem kmi_props = RNA_pointer_as_string_keywords(C, kmi->ptr, false, false, true, 512); } else { /* Fallback. */ - char *c_str = IDP_reprN(kmi->properties, nullptr); - kmi_props = c_str; - MEM_freeN(c_str); + kmi_props = IDP_reprN(kmi->properties, nullptr); } } - return fmt::format("{}({})", kmi->idname, kmi_props.value_or("")); + BLI_snprintf(buf, buf_maxncpy, "%s(%s)", kmi->idname, kmi_props.value_or("").c_str()); + return buf; } #define PRINT \ @@ -2968,13 +2979,15 @@ static eHandlerActionFlag wm_handlers_do_keymap_with_keymap_handler( action |= wm_handler_operator_call( C, handlers, &handler->head, event, kmi->ptr, kmi->idname); + char op_buf[512]; + char kmi_buf[128]; CLOG_INFO(WM_LOG_HANDLERS, 2, "keymap '%s', %s, %s, event: %s", keymap->idname, - keymap_handler_log_kmi_op_str(C, kmi).c_str(), + keymap_handler_log_kmi_op_str(C, kmi, op_buf, sizeof(op_buf)), keymap_handler_log_action_str(action), - keymap_handler_log_kmi_event_str(kmi).value_or("").c_str()); + keymap_handler_log_kmi_event_str(kmi, kmi_buf, sizeof(kmi_buf))); if (action & WM_HANDLER_BREAK) { /* Not always_pass here, it denotes removed handler_base. */ @@ -2995,7 +3008,7 @@ static eHandlerActionFlag wm_handlers_do_keymap_with_keymap_handler( } static eHandlerActionFlag wm_handlers_do_keymap_with_gizmo_handler( - /* From #wm_handlers_do_intern. */ + /* From 'wm_handlers_do_intern' */ bContext *C, wmEvent *event, ListBase *handlers, @@ -3315,13 +3328,13 @@ static eHandlerActionFlag wm_handlers_do_intern(bContext *C, else if (handler_base->type == WM_HANDLER_TYPE_UI) { wmEventHandler_UI *handler = (wmEventHandler_UI *)handler_base; BLI_assert(handler->handle_fn != nullptr); - if (!wm->runtime->is_interface_locked) { + if (!wm->is_interface_locked) { action |= wm_handler_ui_call(C, handler, event, always_pass); } } else if (handler_base->type == WM_HANDLER_TYPE_DROPBOX) { wmEventHandler_Dropbox *handler = (wmEventHandler_Dropbox *)handler_base; - if (!wm->runtime->is_interface_locked && event->type == EVT_DROP) { + if (!wm->is_interface_locked && event->type == EVT_DROP) { LISTBASE_FOREACH (wmDropBox *, drop, handler->dropboxes) { /* Other drop custom types allowed. */ if (event->custom == EVT_DATA_DRAGDROP) { @@ -3379,7 +3392,7 @@ static eHandlerActionFlag wm_handlers_do_intern(bContext *C, else if (handler_base->type == WM_HANDLER_TYPE_OP) { wmEventHandler_Op *handler = (wmEventHandler_Op *)handler_base; if (handler->is_fileselect) { - if (!wm->runtime->is_interface_locked) { + if (!wm->is_interface_locked) { /* Screen context changes here. */ action |= wm_handler_fileselect_call(C, handlers, handler, event); } @@ -3730,7 +3743,7 @@ static eHandlerActionFlag wm_event_drag_and_drop_test(wmWindowManager *wm, /* Clear drop icon. */ screen->do_draw_drag = true; - /* Restore cursor (disabled, see `wm_dragdrop.cc`). */ + /* Restore cursor (disabled, see `wm_dragdrop.cc`) */ // WM_cursor_modal_restore(win); } @@ -4911,7 +4924,7 @@ void WM_event_add_mousemove(wmWindow *win) /** * \return The WM enum for key or #EVENT_NONE (which should be ignored). */ -static int wm_event_type_from_ghost_key(GHOST_TKey key) +static int convert_key(GHOST_TKey key) { if (key >= GHOST_kKeyA && key <= GHOST_kKeyZ) { return (EVT_AKEY + (int(key) - GHOST_kKeyA)); @@ -5706,7 +5719,7 @@ void wm_event_add_ghostevent(wmWindowManager *wm, case GHOST_kEventKeyDown: case GHOST_kEventKeyUp: { const GHOST_TEventKeyData *kd = static_cast(customdata); - event.type = wm_event_type_from_ghost_key(kd->key); + event.type = convert_key(kd->key); if (UNLIKELY(event.type == EVENT_NONE)) { break; } @@ -6001,7 +6014,7 @@ static bool wm_operator_check_locked_interface(bContext *C, wmOperatorType *ot) { wmWindowManager *wm = CTX_wm_manager(C); - if (wm->runtime->is_interface_locked) { + if (wm->is_interface_locked) { if ((ot->flag & OPTYPE_LOCK_BYPASS) == 0) { return false; } @@ -6019,7 +6032,7 @@ void WM_set_locked_interface(wmWindowManager *wm, bool lock) * wouldn't be useful anywhere outside of window manager, so let's not * pollute global context with such an information for now). */ - wm->runtime->is_interface_locked = lock; + wm->is_interface_locked = lock ? 1 : 0; /* This will prevent drawing regions which uses non-thread-safe data. * Currently it'll be just a 3D viewport. @@ -6396,10 +6409,15 @@ bool WM_window_modal_keymap_status_draw(bContext *C, wmWindow *win, uiLayout *la } } if (show_text) { - if (std::optional str = WM_modalkeymap_operator_items_to_string( - op->type, items[i].value, true)) - { - uiItemL(row, fmt::format("{}: {}", *str, items[i].name).c_str(), ICON_NONE); + char buf[UI_MAX_DRAW_STR]; + int available_len = sizeof(buf); + char *p = buf; + WM_modalkeymap_operator_items_to_string_buf( + op->type, items[i].value, true, UI_MAX_SHORTCUT_STR, &available_len, &p); + p -= 1; + if (p > buf) { + BLI_snprintf(p, available_len, ": %s", items[i].name); + uiItemL(row, buf, ICON_NONE); } } } diff --git a/source/blender/windowmanager/intern/wm_files.cc b/source/blender/windowmanager/intern/wm_files.cc index f0ff32c72fe..598b105e345 100644 --- a/source/blender/windowmanager/intern/wm_files.cc +++ b/source/blender/windowmanager/intern/wm_files.cc @@ -22,8 +22,8 @@ /* Minimal requirements for SHGetSpecialFolderPath on MINGW MSVC has this defined already. */ # define _WIN32_IE 0x0400 # endif -/* For #SHGetSpecialFolderPath, has to be done before `BLI_winstuff.h` - * because 'near' is disabled through `BLI_windstuff.h`. */ +/* For SHGetSpecialFolderPath, has to be done before BLI_winstuff + * because 'near' is disabled through BLI_windstuff */ # include "BLI_winstuff.h" # include #endif @@ -45,8 +45,8 @@ #include "BLI_utildefines.h" #include BLI_SYSTEM_PID_H -#include "BLO_readfile.hh" -#include "BLT_translation.hh" +#include "BLO_readfile.h" +#include "BLT_translation.h" #include "BLF_api.hh" @@ -64,12 +64,12 @@ #include "BKE_addon.h" #include "BKE_appdir.hh" #include "BKE_autoexec.hh" -#include "BKE_blender.hh" +#include "BKE_blender.h" #include "BKE_blender_version.h" #include "BKE_blendfile.hh" -#include "BKE_callbacks.hh" +#include "BKE_callbacks.h" #include "BKE_context.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_idprop.h" #include "BKE_lib_id.hh" #include "BKE_lib_override.hh" @@ -77,13 +77,14 @@ #include "BKE_main.hh" #include "BKE_main_namemap.hh" #include "BKE_packedFile.h" -#include "BKE_report.hh" -#include "BKE_scene.hh" +#include "BKE_report.h" +#include "BKE_scene.h" #include "BKE_screen.hh" #include "BKE_sound.h" #include "BKE_undo_system.hh" #include "BKE_workspace.h" +#include "BLO_undofile.hh" /* to save from an undo memfile */ #include "BLO_writefile.hh" #include "RNA_access.hh" @@ -115,7 +116,7 @@ #include "UI_resources.hh" #include "UI_view2d.hh" -/* Only to report a missing engine. */ +/* only to report a missing engine */ #include "RE_engine.h" #ifdef WITH_PYTHON @@ -156,7 +157,7 @@ void WM_file_tag_modified() wmWindowManager *wm = static_cast(G_MAIN->wm.first); if (wm->file_saved) { wm->file_saved = 0; - /* Notifier that data changed, for save-over warning or header. */ + /* notifier that data changed, for save-over warning or header */ WM_main_add_notifier(NC_WM | ND_DATACHANGED, nullptr); } } @@ -203,7 +204,7 @@ static BlendFileReadWMSetupData *wm_file_read_setup_wm_init(bContext *C, /* First wrap up running stuff. * - * Code copied from `wm_init_exit.cc`. */ + * Code copied from wm_init_exit.cc */ WM_jobs_kill_all(wm); wmWindow *active_win = CTX_wm_window(C); @@ -480,11 +481,11 @@ static void wm_init_userdef(Main *bmain) UI_init_userdef(); - /* Needed so loading a file from the command line respects user-pref #26156. */ + /* needed so loading a file from the command line respects user-pref #26156. */ SET_FLAG_FROM_TEST(G.fileflags, U.flag & USER_FILENOUI, G_FILE_NO_UI); - /* Set the python auto-execute setting from user prefs. */ - /* Enabled by default, unless explicitly enabled in the command line which overrides. */ + /* set the python auto-execute setting from user prefs */ + /* enabled by default, unless explicitly enabled in the command line which overrides */ if ((G.f & G_FLAG_SCRIPT_OVERRIDE_PREF) == 0) { SET_FLAG_FROM_TEST(G.f, (U.flag & USER_SCRIPT_AUTOEXEC_DISABLE) == 0, G_FLAG_SCRIPT_AUTOEXEC); } @@ -504,13 +505,13 @@ static void wm_init_userdef(Main *bmain) GPU_backend_type_selection_detect(); } -/* Return codes. */ -#define BKE_READ_EXOTIC_FAIL_PATH -3 /* File format is not supported. */ -#define BKE_READ_EXOTIC_FAIL_FORMAT -2 /* File format is not supported. */ -#define BKE_READ_EXOTIC_FAIL_OPEN -1 /* Can't open the file. */ -#define BKE_READ_EXOTIC_OK_BLEND 0 /* `.blend` file. */ +/* return codes */ +#define BKE_READ_EXOTIC_FAIL_PATH -3 /* file format is not supported */ +#define BKE_READ_EXOTIC_FAIL_FORMAT -2 /* file format is not supported */ +#define BKE_READ_EXOTIC_FAIL_OPEN -1 /* Can't open the file */ +#define BKE_READ_EXOTIC_OK_BLEND 0 /* .blend file */ #if 0 -# define BKE_READ_EXOTIC_OK_OTHER 1 /* Other supported formats. */ +# define BKE_READ_EXOTIC_OK_OTHER 1 /* other supported formats */ #endif /** \} */ @@ -522,17 +523,17 @@ static void wm_init_userdef(Main *bmain) * we could support registering other file formats and their loaders. * \{ */ -/* Intended to check for non-blender formats but for now it only reads blends. */ +/* intended to check for non-blender formats but for now it only reads blends */ static int wm_read_exotic(const char *filepath) { - /* Make sure we're not trying to read a directory. */ + /* make sure we're not trying to read a directory.... */ int filepath_len = strlen(filepath); if (filepath_len > 0 && ELEM(filepath[filepath_len - 1], '/', '\\')) { return BKE_READ_EXOTIC_FAIL_PATH; } - /* Open the file. */ + /* open the file. */ const int filedes = BLI_open(filepath, O_BINARY | O_RDONLY, 0); if (filedes == -1) { return BKE_READ_EXOTIC_FAIL_OPEN; @@ -543,7 +544,7 @@ static int wm_read_exotic(const char *filepath) return BKE_READ_EXOTIC_FAIL_OPEN; } - /* Read the header (7 bytes are enough to identify all known types). */ + /* read the header (7 bytes are enough to identify all known types). */ char header[7]; if (rawfile->read(rawfile, header, sizeof(header)) != sizeof(header)) { rawfile->close(rawfile); @@ -551,13 +552,13 @@ static int wm_read_exotic(const char *filepath) } rawfile->seek(rawfile, 0, SEEK_SET); - /* Check for uncompressed `.blend`. */ + /* check for uncompressed .blend */ if (STREQLEN(header, "BLENDER", 7)) { rawfile->close(rawfile); return BKE_READ_EXOTIC_OK_BLEND; } - /* Check for compressed `.blend`. */ + /* check for compressed .blend */ FileReader *compressed_file = nullptr; if (BLI_file_magic_is_gzip(header)) { /* In earlier versions of Blender (before 3.0), compressed files used `Gzip` instead of `Zstd`. @@ -568,8 +569,7 @@ static int wm_read_exotic(const char *filepath) compressed_file = BLI_filereader_new_zstd(rawfile); } - /* If a compression signature matches, - * try decompressing the start and check if it's a `.blend`. */ + /* If a compression signature matches, try decompressing the start and check if it's a .blend */ if (compressed_file != nullptr) { size_t len = compressed_file->read(compressed_file, header, sizeof(header)); compressed_file->close(compressed_file); @@ -610,7 +610,7 @@ void WM_file_autoexec_init(const char *filepath) void wm_file_read_report(Main *bmain, wmWindow *win) { wmWindowManager *wm = static_cast(bmain->wm.first); - ReportList *reports = &wm->runtime->reports; + ReportList *reports = &wm->reports; bool found = false; LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) { if (scene->r.engine[0] && @@ -663,7 +663,7 @@ struct wmFileReadPost_Params { uint is_factory_startup : 1; uint reset_app_template : 1; - /* Used by #wm_homefile_read_post. */ + /* Used by #wm_homefile_read_post */ uint success : 1; uint is_alloc : 1; }; @@ -688,7 +688,7 @@ static void wm_file_read_post(bContext *C, if (use_data) { if (!G.background) { - /* Remove windows which failed to be added via #WM_check. */ + /* remove windows which failed to be added via WM_check */ wm_window_ghostwindows_remove_invalid(C, wm); } CTX_wm_window_set(C, static_cast(wm->windows.first)); @@ -730,7 +730,7 @@ static void wm_file_read_post(bContext *C, } } else { - /* Run any texts that were loaded in and flagged as modules. */ + /* run any texts that were loaded in and flagged as modules */ if (use_data) { BPY_python_reset(C); } @@ -749,7 +749,7 @@ static void wm_file_read_post(bContext *C, } if (is_factory_startup && BLT_translate_new_dataname()) { - /* Translate workspace names. */ + /* Translate workspace names */ LISTBASE_FOREACH_MUTABLE (WorkSpace *, workspace, &bmain->workspaces) { BKE_libblock_rename( bmain, &workspace->id, CTX_DATA_(BLT_I18NCONTEXT_ID_WORKSPACE, workspace->id.name + 2)); @@ -787,8 +787,8 @@ static void wm_file_read_post(bContext *C, #endif } - /* Report any errors. - * Currently disabled if add-ons aren't yet loaded. */ + /* report any errors. + * currently disabled if addons aren't yet loaded */ if (addons_loaded) { wm_file_read_report(bmain, static_cast(wm->windows.first)); } @@ -808,10 +808,10 @@ static void wm_file_read_post(bContext *C, if (use_data) { if (!G.background) { - /* In background mode this makes it hard to load + /* in background mode this makes it hard to load * a blend file and do anything since the screen - * won't be set to a valid value again. */ - CTX_wm_window_set(C, nullptr); /* Exits queues. */ + * won't be set to a valid value again */ + CTX_wm_window_set(C, nullptr); /* exits queues */ /* Ensure auto-run action is not used from a previous blend file load. */ wm_test_autorun_revert_action_set(nullptr, nullptr); @@ -988,7 +988,7 @@ static void file_read_reports_finalize(BlendFileReadReport *bf_reports) bool WM_file_read(bContext *C, const char *filepath, ReportList *reports) { - /* Assume automated tasks with background, don't write recent file list. */ + /* assume automated tasks with background, don't write recent file list */ const bool do_history_file_update = (G.background == false) && (CTX_wm_manager(C)->op_undo_depth == 0); bool success = false; @@ -1001,17 +1001,17 @@ bool WM_file_read(bContext *C, const char *filepath, ReportList *reports) Main *bmain = CTX_data_main(C); - /* So we can get the error message. */ + /* so we can get the error message */ errno = 0; WM_cursor_wait(true); - /* First try to append data from exotic file formats. */ - /* It throws error box when file doesn't exist and returns -1. */ + /* first try to append data from exotic file formats... */ + /* it throws error box when file doesn't exist and returns -1 */ /* NOTE(ton): it should set some error message somewhere. */ const int retval = wm_read_exotic(filepath); - /* We didn't succeed, now try to read Blender file. */ + /* we didn't succeed, now try to read Blender file */ if (retval == BKE_READ_EXOTIC_OK_BLEND) { BlendFileReadParams params{}; params.is_startup = false; @@ -1022,7 +1022,7 @@ bool WM_file_read(bContext *C, const char *filepath, ReportList *reports) BlendFileReadReport bf_reports{}; bf_reports.reports = reports; - bf_reports.duration.whole = BLI_time_now_seconds(); + bf_reports.duration.whole = BLI_check_seconds_timer(); BlendFileData *bfd = BKE_blendfile_read(filepath, ¶ms, &bf_reports); if (bfd != nullptr) { wm_file_read_pre(use_data, use_userdef); @@ -1053,7 +1053,7 @@ bool WM_file_read(bContext *C, const char *filepath, ReportList *reports) G.f = (G.f & ~flags_keep) | (G_f_orig & flags_keep); } - WM_check(C); /* Opens window(s), checks keymaps. */ + WM_check(C); /* opens window(s), checks keymaps */ if (do_history_file_update) { wm_history_file_update(); @@ -1069,7 +1069,7 @@ bool WM_file_read(bContext *C, const char *filepath, ReportList *reports) read_file_post_params.is_alloc = false; wm_file_read_post(C, filepath, &read_file_post_params); - bf_reports.duration.whole = BLI_time_now_seconds() - bf_reports.duration.whole; + bf_reports.duration.whole = BLI_check_seconds_timer() - bf_reports.duration.whole; file_read_reports_finalize(&bf_reports); success = true; @@ -1099,7 +1099,7 @@ bool WM_file_read(bContext *C, const char *filepath, ReportList *reports) } if (success == false) { - /* Remove from recent files list. */ + /* remove from recent files list */ if (do_history_file_update) { RecentFile *recent = wm_file_history_find(filepath); if (recent) { @@ -1188,10 +1188,10 @@ void wm_homefile_read_ex(bContext *C, char filepath_userdef[FILE_MAX]; /* When 'app_template' is set: - * `{BLENDER_USER_CONFIG}/{app_template}`. */ + * '{BLENDER_USER_CONFIG}/{app_template}' */ char app_template_system[FILE_MAX]; /* When 'app_template' is set: - * `{BLENDER_SYSTEM_SCRIPTS}/startup/bl_app_templates_system/{app_template}`. */ + * '{BLENDER_SYSTEM_SCRIPTS}/startup/bl_app_templates_system/{app_template}' */ char app_template_config[FILE_MAX]; eBLOReadSkip skip_flags = eBLOReadSkip(0); @@ -1214,7 +1214,7 @@ void wm_homefile_read_ex(bContext *C, Main *bmain = G_MAIN; if (filepath_startup_override != nullptr) { - /* Pass. */ + /* pass */ } else if (app_template_override) { /* This may be clearing the current template by setting to an empty string. */ @@ -1301,7 +1301,7 @@ void wm_homefile_read_ex(bContext *C, } } - /* Load preferences before `startup.blend`. */ + /* load preferences before startup.blend */ if (use_userdef) { if (use_factory_settings_app_template_only) { /* Use the current preferences as-is (only load in the app_template preferences). */ @@ -1310,12 +1310,11 @@ void wm_homefile_read_ex(bContext *C, else if (!use_factory_settings && BLI_exists(filepath_userdef)) { UserDef *userdef = BKE_blendfile_userdef_read(filepath_userdef, nullptr); if (userdef != nullptr) { - CLOG_INFO(&LOG, 0, "read prefs: \"%s\"", filepath_userdef); - BKE_blender_userdef_data_set_and_free(userdef); userdef = nullptr; skip_flags |= BLO_READ_SKIP_USERDEF; + printf("Read prefs: \"%s\"\n", filepath_userdef); } } } @@ -1330,8 +1329,8 @@ void wm_homefile_read_ex(bContext *C, /* Insert template name into startup file. */ - /* Note that the path is being set even when `use_factory_settings == true` - * this is done so we can load a templates factory-settings. */ + /* note that the path is being set even when 'use_factory_settings == true' + * this is done so we can load a templates factory-settings */ if (!use_factory_settings && cfgdir.has_value()) { BLI_path_join( app_template_config, sizeof(app_template_config), cfgdir->c_str(), app_template); @@ -1366,8 +1365,6 @@ void wm_homefile_read_ex(bContext *C, BlendFileData *bfd = BKE_blendfile_read(filepath_startup, ¶ms, &bf_reports); if (bfd != nullptr) { - CLOG_INFO(&LOG, 0, "read startup: \"%s\"", filepath_startup); - /* Frees the current main and replaces it with the new one read from file. */ BKE_blendfile_read_setup_readfile(C, bfd, @@ -1394,7 +1391,7 @@ void wm_homefile_read_ex(bContext *C, } if (success == false && filepath_startup_override && reports) { - /* We can not return from here because wm is already reset. */ + /* We can not return from here because wm is already reset */ BKE_reportf(reports, RPT_ERROR, "Could not read \"%s\"", filepath_startup_override); } @@ -1422,7 +1419,7 @@ void wm_homefile_read_ex(bContext *C, /* Load template preferences, * unlike regular preferences we only use some of the settings, - * see: #BKE_blender_userdef_set_app_template. */ + * see: BKE_blender_userdef_set_app_template */ if (app_template_system[0] != '\0') { char temp_path[FILE_MAX]; temp_path[0] = '\0'; @@ -1439,15 +1436,12 @@ void wm_homefile_read_ex(bContext *C, if (use_userdef) { UserDef *userdef_template = nullptr; - /* Just avoids missing file warning. */ + /* just avoids missing file warning */ if (BLI_exists(temp_path)) { userdef_template = BKE_blendfile_userdef_read(temp_path, nullptr); - if (userdef_template) { - CLOG_INFO(&LOG, 0, "read prefs from app-template: \"%s\"", temp_path); - } } if (userdef_template == nullptr) { - /* We need to have preferences load to overwrite preferences from previous template. */ + /* we need to have preferences load to overwrite preferences from previous template */ userdef_template = BKE_blendfile_userdef_from_defaults(); } if (userdef_template) { @@ -1462,7 +1456,7 @@ void wm_homefile_read_ex(bContext *C, } if (use_userdef) { - /* Check userdef before open window, keymaps etc. */ + /* check userdef before open window, keymaps etc */ wm_init_userdef(bmain); } @@ -1484,7 +1478,7 @@ void wm_homefile_read_ex(bContext *C, } if (use_data) { - WM_check(C); /* Opens window(s), checks keymaps. */ + WM_check(C); /* opens window(s), checks keymaps */ bmain->filepath[0] = '\0'; } @@ -1562,7 +1556,7 @@ void wm_history_file_read() /* Read list of recent opened files from #BLENDER_HISTORY_FILE to memory. */ for (l = lines, num = 0; l && (num < U.recent_files); l = l->next) { const char *line = static_cast(l->link); - /* Don't check if files exist, causes slow startup for remote/external drives. */ + /* don't check if files exist, causes slow startup for remote/external drives */ if (line[0]) { RecentFile *recent = (RecentFile *)MEM_mallocN(sizeof(RecentFile), "RecentFile"); BLI_addtail(&(G.recent_files), recent); @@ -1610,7 +1604,7 @@ static void wm_history_file_write() char filepath[FILE_MAX]; FILE *fp; - /* Will be nullptr in background mode. */ + /* will be nullptr in background mode */ const std::optional user_config_dir = BKE_appdir_folder_id_create( BLENDER_USER_CONFIG, nullptr); if (!user_config_dir.has_value()) { @@ -1661,7 +1655,7 @@ static void wm_history_file_update() recent = wm_history_file_new(blendfile_path); } - /* Add current file to the beginning of list. */ + /* add current file to the beginning of list */ BLI_addhead(&(G.recent_files), recent); /* Write current file to #BLENDER_HISTORY_FILE. */ @@ -1769,7 +1763,7 @@ static ImBuf *blend_file_thumb_from_camera(const bContext *C, return nullptr; } - /* Will be scaled down, but gives some nice oversampling. */ + /* will be scaled down, but gives some nice oversampling */ ImBuf *ibuf; BlendThumbnail *thumb; wmWindowManager *wm = CTX_wm_manager(C); @@ -1777,7 +1771,7 @@ static ImBuf *blend_file_thumb_from_camera(const bContext *C, wmWindow *windrawable_old = wm->windrawable; char err_out[256] = "unknown"; - /* Screen if no camera found. */ + /* screen if no camera found */ ScrArea *area = nullptr; ARegion *region = nullptr; View3D *v3d = nullptr; @@ -1845,7 +1839,7 @@ static ImBuf *blend_file_thumb_from_camera(const bContext *C, } if (ibuf) { - /* Dirty oversampling. */ + /* dirty oversampling */ ImBuf *thumb_ibuf; thumb_ibuf = IMB_dupImBuf(ibuf); @@ -1868,7 +1862,7 @@ static ImBuf *blend_file_thumb_from_camera(const bContext *C, thumb = nullptr; } - /* Must be freed by caller. */ + /* must be freed by caller */ *r_thumb = thumb; return ibuf; @@ -1937,7 +1931,7 @@ static bool wm_file_write(bContext *C, /* NOTE: used to replace the file extension (to ensure `.blend`), * no need to now because the operator ensures, - * its handy for scripts to save to a predefined name without blender editing it. */ + * its handy for scripts to save to a predefined name without blender editing it */ if (!wm_file_write_check_with_report_on_failure(bmain, filepath, reports)) { return false; @@ -1970,7 +1964,7 @@ static bool wm_file_write(bContext *C, * Additionally some EGL configurations don't support reading the front-buffer * immediately after drawing, see: #98462. In that case off-screen drawing is necessary. */ - /* Don't forget not to return without! */ + /* don't forget not to return without! */ WM_cursor_wait(true); if (U.file_preview_type != USER_FILE_PREVIEW_NONE) { @@ -2013,7 +2007,7 @@ static bool wm_file_write(bContext *C, } } - /* Operator now handles overwrite checks. */ + /* operator now handles overwrite checks */ if (G.fileflags & G_FILE_AUTOPACK) { BKE_packedfile_pack_all(bmain, reports, false); @@ -2037,19 +2031,19 @@ static bool wm_file_write(bContext *C, (CTX_wm_manager(C)->op_undo_depth == 0); if (use_save_as_copy == false) { - STRNCPY(bmain->filepath, filepath); /* Is guaranteed current file. */ + STRNCPY(bmain->filepath, filepath); /* is guaranteed current file */ } SET_FLAG_FROM_TEST(G.fileflags, fileflags & G_FILE_COMPRESS, G_FILE_COMPRESS); - /* Prevent background mode scripts from clobbering history. */ + /* prevent background mode scripts from clobbering history */ if (do_history_file_update) { wm_history_file_update(); } - /* Run this function after because the file can't be written before the blend is. */ + /* run this function after because the file can't be written before the blend is */ if (ibuf_thumb) { - IMB_thumb_delete(filepath, THB_FAIL); /* Without this a failed thumb overrides. */ + IMB_thumb_delete(filepath, THB_FAIL); /* without this a failed thumb overrides */ ibuf_thumb = IMB_thumb_create(filepath, THB_LARGE, THB_SOURCE_BLEND, ibuf_thumb); } @@ -2115,51 +2109,33 @@ static void wm_autosave_location(char filepath[FILE_MAX]) BLI_path_join(filepath, FILE_MAX, tempdir_base, filename); } -static bool wm_autosave_write_try(Main *bmain, wmWindowManager *wm) +static void wm_autosave_write(Main *bmain, wmWindowManager *wm) { char filepath[FILE_MAX]; wm_autosave_location(filepath); - /* Technically, we could always just save here, but that would cause performance regressions - * compared to when the #MemFile undo step was used for saving undo-steps. So for now just skip - * auto-save when we are in a mode where auto-save wouldn't have worked previously anyway. This - * check can be removed once the performance regressions have been solved. */ - if (ED_undosys_stack_memfile_get_if_active(wm->undo_stack) != nullptr) { - WM_autosave_write(wm, bmain); - return true; + /* Fast save of last undo-buffer, now with UI. */ + const bool use_memfile = (U.uiflag & USER_GLOBALUNDO) != 0; + MemFile *memfile = use_memfile ? ED_undosys_stack_memfile_get_active(wm->undo_stack) : nullptr; + if (memfile != nullptr) { + BLO_memfile_write_file(memfile, filepath); } - if ((U.uiflag & USER_GLOBALUNDO) == 0) { - WM_autosave_write(wm, bmain); - return true; + else { + if (use_memfile) { + /* This is very unlikely, alert developers of this unexpected case. */ + CLOG_WARN(&LOG, "undo-data not found for writing, fallback to regular file write!"); + } + + /* Save as regular blend file with recovery information. */ + const int fileflags = (G.fileflags & ~G_FILE_COMPRESS) | G_FILE_RECOVER_WRITE; + + ED_editors_flush_edits(bmain); + + /* Error reporting into console. */ + BlendFileWriteParams params{}; + BLO_write_file(bmain, filepath, fileflags, ¶ms, nullptr); } - /* Can't auto-save with MemFile right now, try again later. */ - return false; -} - -bool WM_autosave_is_scheduled(wmWindowManager *wm) -{ - return wm->autosave_scheduled; -} - -void WM_autosave_write(wmWindowManager *wm, Main *bmain) -{ - ED_editors_flush_edits(bmain); - - char filepath[FILE_MAX]; - wm_autosave_location(filepath); - /* Save as regular blend file with recovery information. */ - const int fileflags = (G.fileflags & ~G_FILE_COMPRESS) | G_FILE_RECOVER_WRITE; - - /* Error reporting into console. */ - BlendFileWriteParams params{}; - BLO_write_file(bmain, filepath, fileflags, ¶ms, nullptr); - - /* Restart auto-save timer. */ - wm_autosave_timer_end(wm); - wm_autosave_timer_begin(wm); - - wm->autosave_scheduled = false; } static void wm_autosave_timer_begin_ex(wmWindowManager *wm, double timestep) @@ -2207,10 +2183,8 @@ void wm_autosave_timer(Main *bmain, wmWindowManager *wm, wmTimer * /*wt*/) } } - wm->autosave_scheduled = false; - if (!wm_autosave_write_try(bmain, wm)) { - wm->autosave_scheduled = true; - } + wm_autosave_write(bmain, wm); + /* Restart the timer after file write, just in case file write takes a long time. */ wm_autosave_timer_begin(wm); } @@ -2279,7 +2253,7 @@ void wm_open_init_use_scripts(wmOperator *op, bool use_prefs) { PropertyRNA *prop = RNA_struct_find_property(op->ptr, "use_scripts"); if (!RNA_property_is_set(op->ptr, prop)) { - /* Use #G_FLAG_SCRIPT_AUTOEXEC rather than the userpref because this means if + /* use G_FLAG_SCRIPT_AUTOEXEC rather than the userpref because this means if * the flag has been disabled from the command line, then opening * from the menu won't enable this setting. */ bool value = use_prefs ? ((U.flag & USER_SCRIPT_AUTOEXEC_DISABLE) == 0) : @@ -2320,19 +2294,17 @@ static int wm_homefile_write_exec(bContext *C, wmOperator *op) BKE_callback_exec_string(bmain, BKE_CB_EVT_SAVE_PRE, ""); blender::ed::asset::pre_save_assets(bmain); - /* Check current window and close it if temp. */ + /* check current window and close it if temp */ if (win && WM_window_is_temp_screen(win)) { wm_window_close(C, wm, win); } - /* Update keymaps in user preferences. */ + /* update keymaps in user preferences */ WM_keyconfig_update(wm); BLI_path_join(filepath, sizeof(filepath), cfgdir->c_str(), BLENDER_STARTUP_FILE); - if (!G.quiet) { - printf("Writing homefile: \"%s\" ", filepath); - } + printf("Writing homefile: \"%s\" ", filepath); ED_editors_flush_edits(bmain); @@ -2353,51 +2325,21 @@ static int wm_homefile_write_exec(bContext *C, wmOperator *op) BKE_callback_exec_string(bmain, success ? BKE_CB_EVT_SAVE_POST : BKE_CB_EVT_SAVE_POST_FAIL, ""); if (success) { - if (!G.quiet) { - printf("ok\n"); - } + printf("ok\n"); BKE_report(op->reports, RPT_INFO, "Startup file saved"); return OPERATOR_FINISHED; } - if (!G.quiet) { - printf("fail\n"); - } + printf("fail\n"); return OPERATOR_CANCELLED; } -static int wm_homefile_write_invoke(bContext *C, wmOperator *op, const wmEvent * /*event*/) -{ - if (!U.app_template[0]) { - return WM_operator_confirm_ex(C, - op, - IFACE_("Overwrite Main Startup File"), - IFACE_("Make the current file the default startup blend file."), - IFACE_("Overwrite"), - ALERT_ICON_QUESTION, - false); - } - - /* A different message if this is overriding a specific template startup file. */ - char display_name[FILE_MAX]; - BLI_path_to_display_name(display_name, sizeof(display_name), IFACE_(U.app_template)); - std::string message = fmt::format( - IFACE_("Make the current file the default \"{}\" startup file."), IFACE_(display_name)); - return WM_operator_confirm_ex(C, - op, - IFACE_("Overwrite Template Startup File"), - message.c_str(), - IFACE_("Overwrite"), - ALERT_ICON_QUESTION, - false); -} - void WM_OT_save_homefile(wmOperatorType *ot) { ot->name = "Save Startup File"; ot->idname = "WM_OT_save_homefile"; - ot->description = "Make the current file the default startup file"; + ot->description = "Make the current file the default .blend file"; - ot->invoke = wm_homefile_write_invoke; + ot->invoke = WM_operator_confirm; ot->exec = wm_homefile_write_exec; } @@ -2407,7 +2349,7 @@ void WM_OT_save_homefile(wmOperatorType *ot) /** \name Write Preferences Operator * \{ */ -/* Only save the prefs block. operator entry. */ +/* Only save the prefs block. operator entry */ static int wm_userpref_write_exec(bContext *C, wmOperator *op) { wmWindowManager *wm = CTX_wm_manager(C); @@ -2562,32 +2504,6 @@ void WM_OT_read_userpref(wmOperatorType *ot) ot->exec = wm_userpref_read_exec; } -static int wm_userpref_read_invoke(bContext *C, wmOperator *op, const wmEvent * /*event*/) -{ - std::string title; - - const bool template_only = U.app_template[0] && - RNA_boolean_get(op->ptr, "use_factory_startup_app_template_only"); - - if (template_only) { - char display_name[FILE_MAX]; - BLI_path_to_display_name(display_name, sizeof(display_name), IFACE_(U.app_template)); - title = fmt::format(IFACE_("Load Factory \"{}\" Preferences."), IFACE_(display_name)); - } - else { - title = IFACE_("Load Factory Blender Preferences"); - } - - return WM_operator_confirm_ex( - C, - op, - title.c_str(), - IFACE_("To make changes to Preferences permanent, use \"Save Preferences.\""), - IFACE_("Load"), - ALERT_ICON_WARNING, - false); -} - void WM_OT_read_factory_userpref(wmOperatorType *ot) { ot->name = "Load Factory Preferences"; @@ -2596,7 +2512,7 @@ void WM_OT_read_factory_userpref(wmOperatorType *ot) "Load factory default preferences. " "To make changes to preferences permanent, use \"Save Preferences\""; - ot->invoke = wm_userpref_read_invoke; + ot->invoke = WM_operator_confirm; ot->exec = wm_userpref_read_exec; read_factory_reset_props(ot); @@ -2624,7 +2540,7 @@ void WM_OT_read_history(wmOperatorType *ot) ot->invoke = WM_operator_confirm; ot->exec = wm_history_file_read_exec; - /* This operator is only used for loading settings from a previous blender install. */ + /* this operator is only used for loading settings from a previous blender install */ ot->flag = OPTYPE_INTERNAL; } @@ -2671,7 +2587,7 @@ static int wm_homefile_read_exec(bContext *C, wmOperator *op) } else { if (use_factory_startup_and_userdef) { - /* Always load UI for factory settings (prefs will re-init). */ + /* always load UI for factory settings (prefs will re-init) */ G.fileflags &= ~G_FILE_NO_UI; /* Always load preferences with factory settings. */ use_userdef = true; @@ -2794,7 +2710,7 @@ void WM_OT_read_homefile(wmOperatorType *ot) "Path to an alternative start-up file"); RNA_def_property_flag(prop, PROP_HIDDEN); - /* So scripts can use an alternative start-up file without the UI. */ + /* So scripts can use an alternative start-up file without the UI */ prop = RNA_def_boolean( ot->srna, "load_ui", true, "Load UI", "Load user interface setup from the .blend file"); RNA_def_property_flag(prop, PropertyFlag(PROP_HIDDEN | PROP_SKIP_SAVE)); @@ -2810,44 +2726,14 @@ void WM_OT_read_homefile(wmOperatorType *ot) "use_factory_startup", false, "Factory Startup", - "Load the default ('factory startup') blend file. " - "This is independent of the normal start-up file that the user can save"); + "Load the default ('factory startup') blend file. This is independent of " + "the normal start-up file that the user can save"); RNA_def_property_flag(prop, PropertyFlag(PROP_HIDDEN | PROP_SKIP_SAVE)); read_factory_reset_props(ot); read_homefile_props(ot); - /* Omit poll to run in background mode. */ -} - -static int wm_read_factory_settings_invoke(bContext *C, wmOperator *op, const wmEvent * /*event*/) -{ - const bool unsaved = wm_file_or_session_data_has_unsaved_changes(CTX_data_main(C), - CTX_wm_manager(C)); - std::string title; - const bool template_only = U.app_template[0] && - RNA_boolean_get(op->ptr, "use_factory_startup_app_template_only"); - - if (template_only) { - char display_name[FILE_MAX]; - BLI_path_to_display_name(display_name, sizeof(display_name), IFACE_(U.app_template)); - title = fmt::format(IFACE_("Load Factory \"{}\" Startup File and Preferences"), - IFACE_(display_name)); - } - else { - title = IFACE_("Load Factory Default Startup File and Preferences"); - } - - return WM_operator_confirm_ex( - C, - op, - title.c_str(), - unsaved ? IFACE_("To make changes to Preferences permanent, use \"Save Preferences\".\n" - "Warning: Your file is unsaved! Proceeding will abandon your changes.") : - IFACE_("To make changes to Preferences permanent, use \"Save Preferences\"."), - IFACE_("Load"), - ALERT_ICON_WARNING, - false); + /* omit poll to run in background mode */ } void WM_OT_read_factory_settings(wmOperatorType *ot) @@ -2858,7 +2744,7 @@ void WM_OT_read_factory_settings(wmOperatorType *ot) "Load factory default startup file and preferences. " "To make changes permanent, use \"Save Startup File\" and \"Save Preferences\""; - ot->invoke = wm_read_factory_settings_invoke; + ot->invoke = WM_operator_confirm; ot->exec = wm_homefile_read_exec; /* Omit poll to run in background mode. */ @@ -2878,8 +2764,8 @@ void WM_OT_read_factory_settings(wmOperatorType *ot) */ static bool wm_file_read_opwrap(bContext *C, const char *filepath, ReportList *reports) { - /* XXX: wm in context is not set correctly after #WM_file_read -> crash. */ - /* Do it before for now, but is this correct with multiple windows? */ + /* XXX wm in context is not set correctly after WM_file_read -> crash */ + /* do it before for now, but is this correct with multiple windows? */ WM_event_add_notifier(C, NC_WINDOW, nullptr); /* Set by the "use_scripts" property on file load. */ @@ -2892,7 +2778,7 @@ static bool wm_file_read_opwrap(bContext *C, const char *filepath, ReportList *r return success; } -/* Generic operator state utilities. */ +/* Generic operator state utilities */ static void create_operator_state(wmOperatorType *ot, int first_state) { @@ -2973,14 +2859,14 @@ static int wm_open_mainfile__select_file_path(bContext *C, wmOperator *op) const char *blendfile_path = BKE_main_blendfile_path(bmain); if (CTX_wm_window(C) == nullptr) { - /* In rare cases this could happen, when trying to invoke in background + /* in rare cases this could happen, when trying to invoke in background * mode on load for example. Don't use poll for this because exec() - * can still run without a window. */ + * can still run without a window */ BKE_report(op->reports, RPT_ERROR, "Context window not set"); return OPERATOR_CANCELLED; } - /* If possible, get the name of the most recently used `.blend` file. */ + /* if possible, get the name of the most recently used .blend file */ if (G.recent_files.first) { RecentFile *recent = static_cast(G.recent_files.first); blendfile_path = recent->filepath; @@ -3007,7 +2893,7 @@ static int wm_open_mainfile__open(bContext *C, wmOperator *op) /* For file opening, also print in console for warnings, not only errors. */ BKE_report_print_level_set(op->reports, RPT_WARNING); - /* Re-use last loaded setting so we can reload a file without changing. */ + /* re-use last loaded setting so we can reload a file without changing */ wm_open_init_load_ui(op, false); wm_open_init_use_scripts(op, false); @@ -3086,7 +2972,7 @@ static std::string wm_open_mainfile_description(bContext * /*C*/, size_str); } -/* Currently fits in a pointer. */ +/* currently fits in a pointer */ struct FileRuntime { bool is_untrusted; }; @@ -3102,7 +2988,7 @@ static bool wm_open_mainfile_check(bContext * /*C*/, wmOperator *op) RNA_string_get(op->ptr, "filepath", filepath); - /* Get the directory. */ + /* get the dir */ lslash = (char *)BLI_path_slash_rfind(filepath); if (lslash) { *(lslash + 1) = '\0'; @@ -3164,7 +3050,7 @@ void WM_OT_open_mainfile(wmOperatorType *ot) ot->exec = wm_open_mainfile_exec; ot->check = wm_open_mainfile_check; ot->ui = wm_open_mainfile_ui; - /* Omit window poll so this can work in background mode. */ + /* omit window poll so this can work in background mode */ WM_operator_properties_filesel(ot, FILE_TYPE_FOLDER | FILE_TYPE_BLENDER, @@ -3390,7 +3276,7 @@ static void save_set_compress(wmOperator *op) if (blendfile_path[0] != '\0') { /* Keep flag for existing file. */ RNA_property_boolean_set(op->ptr, prop, (G.fileflags & G_FILE_COMPRESS) != 0); } - else { /* Use userdef for new file. */ + else { /* use userdef for new file */ RNA_property_boolean_set(op->ptr, prop, (U.flag & USER_FILECOMPRESS) != 0); } } @@ -3405,7 +3291,7 @@ static void save_set_filepath(bContext *C, wmOperator *op) prop = RNA_struct_find_property(op->ptr, "filepath"); if (!RNA_property_is_set(op->ptr, prop)) { const char *blendfile_path = BKE_main_blendfile_path(bmain); - /* If not saved before, get the name of the most recently used `.blend` file. */ + /* if not saved before, get the name of the most recently used .blend file */ if ((blendfile_path[0] == '\0') && G.recent_files.first) { RecentFile *recent = static_cast(G.recent_files.first); STRNCPY(filepath, recent->filepath); @@ -3495,7 +3381,7 @@ static int wm_save_as_mainfile_exec(bContext *C, wmOperator *op) const int fileflags_orig = G.fileflags; int fileflags = G.fileflags; - /* Set compression flag. */ + /* set compression flag */ SET_FLAG_FROM_TEST(fileflags, RNA_boolean_get(op->ptr, "compress"), G_FILE_COMPRESS); const bool success = wm_file_write( @@ -3524,7 +3410,6 @@ static int wm_save_as_mainfile_exec(bContext *C, wmOperator *op) * often saving manually. */ wm_autosave_timer_end(wm); wm_autosave_timer_begin(wm); - wm->autosave_scheduled = false; } if (!is_save_as && RNA_boolean_get(op->ptr, "exit")) { @@ -3581,7 +3466,7 @@ void WM_OT_save_as_mainfile(wmOperatorType *ot) ot->get_name = wm_save_as_mainfile_get_name; ot->get_description = wm_save_as_mainfile_get_description; ot->check = wm_save_mainfile_check; - /* Omit window poll so this can work in background mode. */ + /* omit window poll so this can work in background mode */ WM_operator_properties_filesel(ot, FILE_TYPE_FOLDER | FILE_TYPE_BLENDER, @@ -3609,7 +3494,7 @@ static int wm_save_mainfile_invoke(bContext *C, wmOperator *op, const wmEvent * { int ret; - /* Cancel if no active window. */ + /* cancel if no active window */ if (CTX_wm_window(C) == nullptr) { return OPERATOR_CANCELLED; } @@ -3617,9 +3502,9 @@ static int wm_save_mainfile_invoke(bContext *C, wmOperator *op, const wmEvent * save_set_compress(op); save_set_filepath(C, op); - /* If we're saving for the first time and prefer relative paths - + /* if we're saving for the first time and prefer relative paths - * any existing paths will be absolute, - * enable the option to remap paths to avoid confusion, see: #37240. */ + * enable the option to remap paths to avoid confusion #37240. */ const char *blendfile_path = BKE_main_blendfile_path_from_global(); if ((blendfile_path[0] == '\0') && (U.flag & USER_RELPATHS)) { PropertyRNA *prop = RNA_struct_find_property(op->ptr, "relative_remap"); @@ -3780,7 +3665,7 @@ static void wm_block_autorun_warning_enable_scripts(bContext *C, uiBlock *block) } } -/* Build the auto-run warning dialog UI. */ +/* Build the autorun warning dialog UI */ static uiBlock *block_create_autorun_warning(bContext *C, ARegion *region, void * /*arg1*/) { const char *blendfile_path = BKE_main_blendfile_path_from_global(); @@ -3817,12 +3702,12 @@ static uiBlock *block_create_autorun_warning(bContext *C, ARegion *region, void uiItemS_ex(layout, 3.0f); - /* Buttons. */ + /* Buttons */ uiBut *but; uiLayout *split = uiLayoutSplit(layout, 0.0f, true); uiLayoutSetScaleY(split, 1.2f); - /* Empty space. */ + /* empty space */ col = uiLayoutColumn(split, false); uiItemS(col); @@ -3843,6 +3728,8 @@ static uiBlock *block_create_autorun_warning(bContext *C, ARegion *region, void nullptr, 0, 0, + 0, + 0, TIP_("Reload file with execution of Python scripts enabled")); UI_but_func_set( but, [block](bContext &C) { wm_block_autorun_warning_reload_with_scripts(&C, block); }); @@ -3860,6 +3747,8 @@ static uiBlock *block_create_autorun_warning(bContext *C, ARegion *region, void nullptr, 0, 0, + 0, + 0, TIP_("Enable scripts")); UI_but_func_set(but, [block](bContext &C) { wm_block_autorun_warning_enable_scripts(&C, block); }); @@ -3879,6 +3768,8 @@ static uiBlock *block_create_autorun_warning(bContext *C, ARegion *region, void nullptr, 0, 0, + 0, + 0, TIP_("Continue using file without Python scripts")); UI_but_func_set(but, wm_block_autorun_warning_ignore, block, nullptr); UI_but_drawflag_disable(but, UI_BUT_TEXT_LEFT); @@ -3926,7 +3817,7 @@ void wm_test_autorun_revert_action_exec(bContext *C) WM_operator_properties_create_ptr(ptr, ot); RNA_boolean_set(ptr, "use_scripts", true); - /* Set state, so it's freed correctly. */ + /* Set state, so it's freed correctly */ wm_test_autorun_revert_action_set(ot, ptr); } @@ -4026,8 +3917,21 @@ static void save_file_forwardcompat_cancel(bContext *C, void *arg_block, void * static void save_file_forwardcompat_cancel_button(uiBlock *block, wmGenericCallback *post_action) { - uiBut *but = uiDefIconTextBut( - block, UI_BTYPE_BUT, 0, ICON_NONE, IFACE_("Cancel"), 0, 0, 0, UI_UNIT_Y, nullptr, 0, 0, ""); + uiBut *but = uiDefIconTextBut(block, + UI_BTYPE_BUT, + 0, + ICON_NONE, + IFACE_("Cancel"), + 0, + 0, + 0, + UI_UNIT_Y, + nullptr, + 0, + 0, + 0, + 0, + ""); UI_but_func_set(but, save_file_forwardcompat_cancel, block, post_action); UI_but_drawflag_disable(but, UI_BUT_TEXT_LEFT); } @@ -4070,6 +3974,8 @@ static void save_file_forwardcompat_overwrite_button(uiBlock *block, nullptr, 0, 0, + 0, + 0, ""); UI_but_func_set(but, save_file_forwardcompat_overwrite, block, post_action); UI_but_drawflag_disable(but, UI_BUT_TEXT_LEFT); @@ -4098,6 +4004,8 @@ static void save_file_forwardcompat_saveas_button(uiBlock *block, wmGenericCallb nullptr, 0, 0, + 0, + 0, ""); UI_but_func_set(but, save_file_forwardcompat_saveas, block, post_action); UI_but_drawflag_disable(but, UI_BUT_TEXT_LEFT); @@ -4261,8 +4169,21 @@ static void wm_block_file_close_save(bContext *C, void *arg_block, void *arg_dat static void wm_block_file_close_cancel_button(uiBlock *block, wmGenericCallback *post_action) { - uiBut *but = uiDefIconTextBut( - block, UI_BTYPE_BUT, 0, ICON_NONE, IFACE_("Cancel"), 0, 0, 0, UI_UNIT_Y, nullptr, 0, 0, ""); + uiBut *but = uiDefIconTextBut(block, + UI_BTYPE_BUT, + 0, + ICON_NONE, + IFACE_("Cancel"), + 0, + 0, + 0, + UI_UNIT_Y, + nullptr, + 0, + 0, + 0, + 0, + ""); UI_but_func_set(but, wm_block_file_close_cancel, block, post_action); UI_but_drawflag_disable(but, UI_BUT_TEXT_LEFT); } @@ -4281,6 +4202,8 @@ static void wm_block_file_close_discard_button(uiBlock *block, wmGenericCallback nullptr, 0, 0, + 0, + 0, ""); UI_but_func_set(but, wm_block_file_close_discard, block, post_action); UI_but_drawflag_disable(but, UI_BUT_TEXT_LEFT); @@ -4304,6 +4227,8 @@ static void wm_block_file_close_save_button(uiBlock *block, nullptr, 0, 0, + 0, + 0, ""); UI_but_func_set(but, wm_block_file_close_save, block, post_action); UI_but_drawflag_disable(but, UI_BUT_TEXT_LEFT); @@ -4371,7 +4296,7 @@ static uiBlock *block_create__close_file_dialog(bContext *C, ARegion *region, vo if (path_info) { /* Terminate message string at colon. */ path_info[1] = '\0'; - /* Skip over the ": ". */ + /* Skip over the ": " */ path_info += 2; } uiItemL_ex(row, message, ICON_NONE, false, true); diff --git a/source/blender/windowmanager/intern/wm_files_link.cc b/source/blender/windowmanager/intern/wm_files_link.cc index 43edfc76177..7bf1fb3a523 100644 --- a/source/blender/windowmanager/intern/wm_files_link.cc +++ b/source/blender/windowmanager/intern/wm_files_link.cc @@ -34,13 +34,13 @@ #include "BLI_memarena.h" #include "BLI_utildefines.h" -#include "BLO_readfile.hh" +#include "BLO_readfile.h" #include "BKE_armature.hh" #include "BKE_blendfile.hh" #include "BKE_blendfile_link_append.hh" #include "BKE_context.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_key.hh" #include "BKE_layer.hh" #include "BKE_lib_id.hh" @@ -50,9 +50,9 @@ #include "BKE_main.hh" #include "BKE_material.h" #include "BKE_object.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "BKE_rigidbody.h" -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "BKE_idtype.hh" @@ -81,10 +81,10 @@ static CLG_LogRef LOG = {"wm.files_link"}; static bool wm_link_append_poll(bContext *C) { if (WM_operator_winactive(C)) { - /* NOTE(@sergey): Linking changes active object which is pretty useful in general, + /* linking changes active object which is pretty useful in general, * but which totally confuses edit mode (i.e. it becoming not so obvious * to leave from edit mode and invalid tools in toolbar might be displayed) - * so disable link/append when in edit mode. */ + * so disable link/append when in edit mode (sergey) */ if (CTX_data_edit_object(C)) { return false; } @@ -218,7 +218,7 @@ static int wm_link_append_exec(bContext *C, wmOperator *op) BLI_path_join(filepath, sizeof(filepath), root, relname); - /* Test if we have a valid data. */ + /* test if we have a valid data */ const bool is_librarypath_valid = BKE_blendfile_library_path_explode( filepath, libname, &group, &name); @@ -239,7 +239,7 @@ static int wm_link_append_exec(bContext *C, wmOperator *op) return OPERATOR_CANCELLED; } - /* Check if something is indicated for append/link. */ + /* check if something is indicated for append/link */ prop = RNA_struct_find_property(op->ptr, "files"); if (prop) { totfiles = RNA_property_collection_length(op->ptr, prop); @@ -258,13 +258,13 @@ static int wm_link_append_exec(bContext *C, wmOperator *op) int flag = wm_link_append_flag(op); const bool do_append = (flag & FILE_LINK) == 0; - /* From here down, no error returns. */ + /* from here down, no error returns */ if (view_layer && RNA_boolean_get(op->ptr, "autoselect")) { BKE_view_layer_base_deselect_all(scene, view_layer); } - /* Sanity checks for flag. */ + /* sanity checks for flag */ if (scene && scene->id.lib) { BKE_reportf(op->reports, RPT_WARNING, @@ -274,10 +274,10 @@ static int wm_link_append_exec(bContext *C, wmOperator *op) scene = nullptr; } - /* Tag everything, all untagged data can be made local - * its also generally useful to know what is new. + /* tag everything, all untagged data can be made local + * its also generally useful to know what is new * - * Take extra care `BKE_main_id_flag_all(bmain, LIB_TAG_PRE_EXISTING, false)` is called after! */ + * take extra care BKE_main_id_flag_all(bmain, LIB_TAG_PRE_EXISTING, false) is called after! */ BKE_main_id_tag_all(bmain, LIB_TAG_PRE_EXISTING, true); /* We define our working data... @@ -360,19 +360,19 @@ static int wm_link_append_exec(bContext *C, wmOperator *op) // BKE_main_unlock(bmain); - /* Mark all library linked objects to be updated. */ + /* mark all library linked objects to be updated */ BKE_main_lib_objects_recalc_all(bmain); IMB_colormanagement_check_file_config(bmain); - /* Append, rather than linking. */ + /* append, rather than linking */ if (do_append) { BKE_blendfile_append(lapp_context, op->reports); } BKE_blendfile_link_append_context_free(lapp_context); - /* Important we unset, otherwise these object won't - * link into other scenes from this blend file. */ + /* important we unset, otherwise these object won't + * link into other scenes from this blend file */ BKE_main_id_tag_all(bmain, LIB_TAG_PRE_EXISTING, false); /* TODO(sergey): Use proper flag for tagging here. */ @@ -387,7 +387,7 @@ static int wm_link_append_exec(bContext *C, wmOperator *op) DEG_id_tag_update(&scene->id, 0); } - /* Recreate dependency graph to include new objects. */ + /* recreate dependency graph to include new objects */ DEG_relations_tag_update(bmain); /* TODO: align `G.filepath_last_library` with other directory storage @@ -403,9 +403,8 @@ static void wm_link_append_properties_common(wmOperatorType *ot, bool is_link) { PropertyRNA *prop; - /* Better not save _any_ settings for this operator. */ - - /* Properties. */ + /* better not save _any_ settings for this operator */ + /* properties */ prop = RNA_def_boolean( ot->srna, "link", is_link, "Link", "Link the objects or data-blocks rather than appending"); RNA_def_property_flag(prop, PROP_SKIP_SAVE | PROP_HIDDEN); diff --git a/source/blender/windowmanager/intern/wm_gesture.cc b/source/blender/windowmanager/intern/wm_gesture.cc index 568d89c4bf5..e1c3005b2f2 100644 --- a/source/blender/windowmanager/intern/wm_gesture.cc +++ b/source/blender/windowmanager/intern/wm_gesture.cc @@ -17,13 +17,16 @@ #include "BLI_bitmap_draw_2d.h" #include "BLI_blenlib.h" -#include "BLI_lasso_2d.hh" +#include "BLI_lasso_2d.h" #include "BLI_utildefines.h" +#include "BKE_context.hh" + #include "WM_api.hh" #include "WM_types.hh" #include "wm.hh" +#include "wm_draw.hh" #include "GPU_immediate.h" #include "GPU_immediate_util.h" @@ -31,9 +34,6 @@ #include "BIF_glutil.hh" -using blender::Array; -using blender::int2; - wmGesture *WM_gesture_new(wmWindow *window, const ARegion *region, const wmEvent *event, int type) { wmGesture *gesture = static_cast(MEM_callocN(sizeof(wmGesture), "new gesture")); @@ -64,7 +64,7 @@ wmGesture *WM_gesture_new(wmWindow *window, const ARegion *region, const wmEvent rect->xmin = xy[0] - gesture->winrct.xmin; rect->ymin = xy[1] - gesture->winrct.ymin; if (type == WM_GESTURE_CIRCLE) { - /* Caller is responsible for initializing 'xmax' to radius. */ + /* caller is responsible for initializing 'xmax' to radius. */ } else { rect->xmax = xy[0] - gesture->winrct.xmin; @@ -182,7 +182,7 @@ static void wm_gesture_draw_line(wmGesture *gt) GPU_viewport_size_get_f(viewport_size); immUniform2f("viewport_size", viewport_size[2], viewport_size[3]); - immUniform1i("colors_len", 2); /* "advanced" mode. */ + immUniform1i("colors_len", 2); /* "advanced" mode */ immUniform4f("color", 0.4f, 0.4f, 0.4f, 1.0f); immUniform4f("color2", 1.0f, 1.0f, 1.0f, 1.0f); immUniform1f("dash_width", 8.0f); @@ -225,7 +225,7 @@ static void wm_gesture_draw_rect(wmGesture *gt) GPU_viewport_size_get_f(viewport_size); immUniform2f("viewport_size", viewport_size[2], viewport_size[3]); - immUniform1i("colors_len", 2); /* "advanced" mode. */ + immUniform1i("colors_len", 2); /* "advanced" mode */ immUniform4f("color", 0.4f, 0.4f, 0.4f, 1.0f); immUniform4f("color2", 1.0f, 1.0f, 1.0f, 1.0f); immUniform1f("dash_width", 8.0f); @@ -236,7 +236,7 @@ static void wm_gesture_draw_rect(wmGesture *gt) immUnbindProgram(); - /* Draws a diagonal line in the lined box to test #wm_gesture_draw_line. */ + /* draws a diagonal line in the lined box to test wm_gesture_draw_line */ // wm_gesture_draw_line(gt); } @@ -264,7 +264,7 @@ static void wm_gesture_draw_circle(wmGesture *gt) GPU_viewport_size_get_f(viewport_size); immUniform2f("viewport_size", viewport_size[2], viewport_size[3]); - immUniform1i("colors_len", 2); /* "advanced" mode. */ + immUniform1i("colors_len", 2); /* "advanced" mode */ immUniform4f("color", 0.4f, 0.4f, 0.4f, 1.0f); immUniform4f("color2", 1.0f, 1.0f, 1.0f, 1.0f); immUniform1f("dash_width", 4.0f); @@ -291,7 +291,8 @@ static void draw_filled_lasso(wmGesture *gt) { const short *lasso = (short *)gt->customdata; const int mcoords_len = gt->points; - Array mcoords(mcoords_len); + int(*mcoords)[2] = static_cast( + MEM_mallocN(sizeof(*mcoords) * (mcoords_len + 1), __func__)); int i; rcti rect; const float red[4] = {1.0f, 0.0f, 0.0f, 0.0f}; @@ -301,7 +302,7 @@ static void draw_filled_lasso(wmGesture *gt) mcoords[i][1] = lasso[1]; } - BLI_lasso_boundbox(&rect, mcoords); + BLI_lasso_boundbox(&rect, mcoords, mcoords_len); BLI_rcti_translate(&rect, gt->winrct.xmin, gt->winrct.ymin); BLI_rcti_isect(>->winrct, &rect, &rect); @@ -319,6 +320,7 @@ static void draw_filled_lasso(wmGesture *gt) rect.xmax, rect.ymax, mcoords, + mcoords_len, draw_filled_lasso_px_cb, &lasso_fill_data); @@ -338,6 +340,8 @@ static void draw_filled_lasso(wmGesture *gt) GPU_blend(GPU_BLEND_NONE); } + + MEM_freeN(mcoords); } static void wm_gesture_draw_lasso(wmGesture *gt, bool filled) @@ -365,7 +369,7 @@ static void wm_gesture_draw_lasso(wmGesture *gt, bool filled) GPU_viewport_size_get_f(viewport_size); immUniform2f("viewport_size", viewport_size[2], viewport_size[3]); - immUniform1i("colors_len", 2); /* "advanced" mode. */ + immUniform1i("colors_len", 2); /* "advanced" mode */ immUniform4f("color", 0.4f, 0.4f, 0.4f, 1.0f); immUniform4f("color2", 1.0f, 1.0f, 1.0f, 1.0f); immUniform1f("dash_width", 2.0f); @@ -399,7 +403,7 @@ static void wm_gesture_draw_cross(wmWindow *win, wmGesture *gt) GPU_viewport_size_get_f(viewport_size); immUniform2f("viewport_size", viewport_size[2], viewport_size[3]); - immUniform1i("colors_len", 2); /* "advanced" mode. */ + immUniform1i("colors_len", 2); /* "advanced" mode */ immUniform4f("color", 0.4f, 0.4f, 0.4f, 1.0f); immUniform4f("color2", 1.0f, 1.0f, 1.0f, 1.0f); immUniform1f("dash_width", 8.0f); diff --git a/source/blender/windowmanager/intern/wm_gesture_ops.cc b/source/blender/windowmanager/intern/wm_gesture_ops.cc index 65d057ce579..012e2c8441a 100644 --- a/source/blender/windowmanager/intern/wm_gesture_ops.cc +++ b/source/blender/windowmanager/intern/wm_gesture_ops.cc @@ -18,7 +18,6 @@ #include "BLI_math_rotation.h" #include "BLI_math_vector.h" -#include "BLI_math_vector_types.hh" #include "BLI_rect.h" #include "BKE_context.hh" @@ -27,15 +26,16 @@ #include "WM_types.hh" #include "wm.hh" +#include "wm_event_system.hh" #include "wm_event_types.hh" #include "ED_screen.hh" #include "ED_select_utils.hh" -#include "RNA_access.hh" +#include "UI_interface.hh" -using blender::Array; -using blender::int2; +#include "RNA_access.hh" +#include "RNA_define.hh" /* -------------------------------------------------------------------- */ /** \name Internal Gesture Utilities @@ -53,7 +53,7 @@ static void gesture_modal_end(bContext *C, wmOperator *op) wmWindow *win = CTX_wm_window(C); wmGesture *gesture = static_cast(op->customdata); - WM_gesture_end(win, gesture); /* Frees gesture itself, and unregisters from window. */ + WM_gesture_end(win, gesture); /* frees gesture itself, and unregisters from window */ op->customdata = nullptr; ED_area_tag_redraw(CTX_wm_area(C)); @@ -133,7 +133,7 @@ static bool gesture_box_apply_rect(wmOperator *op) return false; } - /* Operator arguments and storage. */ + /* operator arguments and storage. */ RNA_int_set(op->ptr, "xmin", min_ii(rect->xmin, rect->xmax)); RNA_int_set(op->ptr, "ymin", min_ii(rect->ymin, rect->ymax)); RNA_int_set(op->ptr, "xmax", max_ii(rect->xmin, rect->xmax)); @@ -181,7 +181,7 @@ int WM_gesture_box_invoke(bContext *C, wmOperator *op, const wmEvent *event) gesture->wait_for_input = wait_for_input; } - /* Add modal handler. */ + /* add modal handler */ WM_event_add_modal_handler(C, op); wm_gesture_tag_redraw(win); @@ -308,7 +308,7 @@ int WM_gesture_circle_invoke(bContext *C, wmOperator *op, const wmEvent *event) gesture->is_active_prev = true; } - /* Add modal handler. */ + /* add modal handler */ WM_event_add_modal_handler(C, op); wm_gesture_tag_redraw(win); @@ -325,7 +325,7 @@ static void gesture_circle_apply(bContext *C, wmOperator *op) return; } - /* Operator arguments and storage. */ + /* operator arguments and storage. */ RNA_int_set(op->ptr, "x", rect->xmin); RNA_int_set(op->ptr, "y", rect->ymin); RNA_int_set(op->ptr, "radius", rect->xmax); @@ -404,7 +404,7 @@ int WM_gesture_circle_modal(bContext *C, wmOperator *op, const wmEvent *event) } } else { - /* Apply first click. */ + /* apply first click */ gesture->is_active = true; gesture_circle_apply(C, op); wm_gesture_tag_redraw(win); @@ -418,7 +418,7 @@ int WM_gesture_circle_modal(bContext *C, wmOperator *op, const wmEvent *event) if (is_finished) { gesture_modal_end(C, op); - return OPERATOR_FINISHED; /* Use finish or we don't get an undo. */ + return OPERATOR_FINISHED; /* use finish or we don't get an undo */ } if (is_circle_size) { @@ -454,7 +454,7 @@ void WM_gesture_circle_cancel(bContext *C, wmOperator *op) } #if 0 -/* Template to copy from. */ +/* template to copy from */ void WM_OT_circle_gesture(wmOperatorType *ot) { ot->name = "Circle Gesture"; @@ -465,7 +465,7 @@ void WM_OT_circle_gesture(wmOperatorType *ot) ot->modal = WM_gesture_circle_modal; ot->poll = WM_operator_winactive; - /* Properties. */ + /* properties */ WM_operator_properties_gesture_circle(ot); } #endif @@ -474,11 +474,6 @@ void WM_OT_circle_gesture(wmOperatorType *ot) /* -------------------------------------------------------------------- */ /** \name Lasso Gesture - * There are two types of lasso gesture: - * 1. #WM_GESTURE_LASSO: A lasso that follows the mouse cursor with the enclosed area shaded. - * 2. #WM_GESTURE_LINES: A lasso that follows the mouse cursor without the enclosed area shaded. - * - * The operator stores data in the "path" property as a series of screen space positions. * \{ */ int WM_gesture_lasso_invoke(bContext *C, wmOperator *op, const wmEvent *event) @@ -488,7 +483,7 @@ int WM_gesture_lasso_invoke(bContext *C, wmOperator *op, const wmEvent *event) op->customdata = WM_gesture_new(win, CTX_wm_region(C), event, WM_GESTURE_LASSO); - /* Add modal handler. */ + /* add modal handler */ WM_event_add_modal_handler(C, op); wm_gesture_tag_redraw(win); @@ -507,7 +502,7 @@ int WM_gesture_lines_invoke(bContext *C, wmOperator *op, const wmEvent *event) op->customdata = WM_gesture_new(win, CTX_wm_region(C), event, WM_GESTURE_LINES); - /* Add modal handler. */ + /* add modal handler */ WM_event_add_modal_handler(C, op); wm_gesture_tag_redraw(win); @@ -528,7 +523,7 @@ static int gesture_lasso_apply(bContext *C, wmOperator *op) int i; const short *lasso = static_cast(gesture->customdata); - /* Operator storage as path. */ + /* operator storage as path. */ RNA_collection_clear(op->ptr, "path"); for (i = 0; i < gesture->points; i++, lasso += 2) { @@ -578,7 +573,7 @@ int WM_gesture_lasso_modal(bContext *C, wmOperator *op, const wmEvent *event) const int x = ((event->xy[0] - gesture->winrct.xmin) - lasso[gesture->points - 1][0]); const int y = ((event->xy[1] - gesture->winrct.ymin) - lasso[gesture->points - 1][1]); - /* Move the lasso. */ + /* move the lasso */ if (gesture->move) { for (int i = 0; i < gesture->points; i++) { lasso[i][0] += x; @@ -598,7 +593,7 @@ int WM_gesture_lasso_modal(bContext *C, wmOperator *op, const wmEvent *event) case LEFTMOUSE: case MIDDLEMOUSE: case RIGHTMOUSE: { - if (event->val == KM_RELEASE) { /* Key release. */ + if (event->val == KM_RELEASE) { /* key release */ return gesture_lasso_apply(C, op); } break; @@ -629,34 +624,43 @@ void WM_gesture_lines_cancel(bContext *C, wmOperator *op) gesture_modal_end(C, op); } -Array WM_gesture_lasso_path_to_array(bContext * /*C*/, wmOperator *op) +const int (*WM_gesture_lasso_path_to_array(bContext * /*C*/, + wmOperator *op, + int *r_mcoords_len))[2] { PropertyRNA *prop = RNA_struct_find_property(op->ptr, "path"); + int(*mcoords)[2] = nullptr; BLI_assert(prop != nullptr); - if (!prop) { - return {}; + + if (prop) { + const int len = RNA_property_collection_length(op->ptr, prop); + + if (len) { + int i = 0; + mcoords = static_cast(MEM_mallocN(sizeof(int[2]) * len, __func__)); + + RNA_PROP_BEGIN (op->ptr, itemptr, prop) { + float loc[2]; + + RNA_float_get_array(&itemptr, "loc", loc); + mcoords[i][0] = int(loc[0]); + mcoords[i][1] = int(loc[1]); + i++; + } + RNA_PROP_END; + } + *r_mcoords_len = len; } - const int len = RNA_property_collection_length(op->ptr, prop); - if (len == 0) { - return {}; + else { + *r_mcoords_len = 0; } - int i = 0; - Array mcoords(len); - - RNA_PROP_BEGIN (op->ptr, itemptr, prop) { - float loc[2]; - RNA_float_get_array(&itemptr, "loc", loc); - mcoords[i] = int2(loc[0], loc[1]); - i++; - } - RNA_PROP_END; - + /* cast for 'const' */ return mcoords; } #if 0 -/* Template to copy from. */ +/* template to copy from */ static int gesture_lasso_exec(bContext *C, wmOperator *op) { @@ -716,7 +720,7 @@ static bool gesture_straightline_apply(bContext *C, wmOperator *op) return false; } - /* Operator arguments and storage. */ + /* operator arguments and storage. */ RNA_int_set(op->ptr, "xstart", rect->xmin); RNA_int_set(op->ptr, "ystart", rect->ymin); RNA_int_set(op->ptr, "xend", rect->xmax); @@ -743,7 +747,7 @@ int WM_gesture_straightline_invoke(bContext *C, wmOperator *op, const wmEvent *e gesture->is_active = true; } - /* Add modal handler. */ + /* add modal handler */ WM_event_add_modal_handler(C, op); wm_gesture_tag_redraw(win); @@ -957,7 +961,7 @@ void WM_gesture_straightline_cancel(bContext *C, wmOperator *op) } #if 0 -/* Template to copy from. */ +/* template to copy from */ void WM_OT_straightline_gesture(wmOperatorType *ot) { PropertyRNA *prop; diff --git a/source/blender/windowmanager/intern/wm_init_exit.cc b/source/blender/windowmanager/intern/wm_init_exit.cc index 2effd446388..47b01ca75c0 100644 --- a/source/blender/windowmanager/intern/wm_init_exit.cc +++ b/source/blender/windowmanager/intern/wm_init_exit.cc @@ -33,35 +33,40 @@ #include "BLO_undofile.hh" #include "BLO_writefile.hh" -#include "BKE_blender.hh" +#include "BKE_blender.h" #include "BKE_blendfile.hh" +#include "BKE_callbacks.h" #include "BKE_context.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_icons.h" #include "BKE_image.h" #include "BKE_keyconfig.h" #include "BKE_lib_remap.hh" #include "BKE_main.hh" #include "BKE_mball_tessellate.hh" +#include "BKE_node.hh" #include "BKE_preview_image.hh" -#include "BKE_scene.hh" +#include "BKE_report.h" +#include "BKE_scene.h" #include "BKE_screen.hh" #include "BKE_sound.h" #include "BKE_vfont.hh" #include "BKE_addon.h" #include "BKE_appdir.hh" -#include "BKE_blender_cli_command.hh" -#include "BKE_mask.h" /* Free mask clipboard. */ -#include "BKE_material.h" /* #BKE_material_copybuf_clear. */ +#include "BKE_mask.h" /* free mask clipboard */ +#include "BKE_material.h" /* BKE_material_copybuf_clear */ #include "BKE_studiolight.h" #include "BKE_subdiv.hh" -#include "BKE_tracking.h" /* Free tracking clipboard. */ +#include "BKE_tracking.h" /* free tracking clipboard */ #include "RE_engine.h" -#include "RE_pipeline.h" /* `RE_` free stuff. */ +#include "RE_pipeline.h" /* RE_ free stuff */ + +#include "IMB_thumbs.hh" #ifdef WITH_PYTHON +# include "BPY_extern.h" # include "BPY_extern_python.h" # include "BPY_extern_run.h" #endif @@ -84,6 +89,7 @@ #include "wm_window.hh" #include "ED_anim_api.hh" +#include "ED_armature.hh" #include "ED_asset.hh" #include "ED_gpencil_legacy.hh" #include "ED_keyframes_edit.hh" @@ -94,9 +100,10 @@ #include "ED_space_api.hh" #include "ED_undo.hh" #include "ED_util.hh" +#include "ED_view3d.hh" #include "BLF_api.hh" -#include "BLT_lang.hh" +#include "BLT_lang.h" #include "UI_interface.hh" #include "UI_resources.hh" @@ -422,7 +429,7 @@ static void wm_init_scripts_extensions_once(bContext *C) #endif } -/* Free strings of open recent files. */ +/* free strings of open recent files */ static void free_openrecent() { LISTBASE_FOREACH (RecentFile *, recent, &G.recent_files) { @@ -451,7 +458,7 @@ void wm_exit_schedule_delayed(const bContext *C) * Could add separate WM handlers or so, but probably not worth it. */ WM_event_add_ui_handler( C, &win->modalhandlers, wm_exit_handler, nullptr, nullptr, eWM_EventHandlerFlag(0)); - WM_event_add_mousemove(win); /* Ensure handler actually gets called. */ + WM_event_add_mousemove(win); /* ensure handler actually gets called */ } void UV_clipboard_free(); @@ -467,23 +474,31 @@ void WM_exit_ex(bContext *C, const bool do_python_exit, const bool do_user_exit_ * Saving #BLENDER_QUIT_FILE is also not likely to be desired either. */ BLI_assert(G.background ? (do_user_exit_actions == false) : true); - /* First wrap up running stuff, we assume only the active WM is running. */ - /* Modal handlers are on window level freed, others too? */ + /* first wrap up running stuff, we assume only the active WM is running */ + /* modal handlers are on window level freed, others too? */ /* NOTE: same code copied in `wm_files.cc`. */ if (C && wm) { if (do_user_exit_actions) { - /* Save quit.blend. */ - Main *bmain = CTX_data_main(C); - char filepath[FILE_MAX]; - const int fileflags = G.fileflags & ~G_FILE_COMPRESS; + MemFile *undo_memfile = wm->undo_stack ? + ED_undosys_stack_memfile_get_active(wm->undo_stack) : + nullptr; + if (undo_memfile != nullptr) { + /* save the undo state as quit.blend */ + Main *bmain = CTX_data_main(C); + char filepath[FILE_MAX]; + const int fileflags = G.fileflags & ~G_FILE_COMPRESS; - BLI_path_join(filepath, sizeof(filepath), BKE_tempdir_base(), BLENDER_QUIT_FILE); + BLI_path_join(filepath, sizeof(filepath), BKE_tempdir_base(), BLENDER_QUIT_FILE); - ED_editors_flush_edits(bmain); + /* When true, the `undo_memfile` doesn't contain all information necessary + * for writing and up to date blend file. */ + const bool is_memfile_outdated = ED_editors_flush_edits(bmain); - BlendFileWriteParams blend_file_write_params{}; - if (BLO_write_file(bmain, filepath, fileflags, &blend_file_write_params, nullptr)) { - if (!G.quiet) { + BlendFileWriteParams blend_file_write_params{}; + if (is_memfile_outdated ? + BLO_write_file(bmain, filepath, fileflags, &blend_file_write_params, nullptr) : + BLO_memfile_write_file(undo_memfile, filepath)) + { printf("Saved session recovery to \"%s\"\n", filepath); } } @@ -492,7 +507,7 @@ void WM_exit_ex(bContext *C, const bool do_python_exit, const bool do_user_exit_ WM_jobs_kill_all(wm); LISTBASE_FOREACH (wmWindow *, win, &wm->windows) { - CTX_wm_window_set(C, win); /* Needed by operator close callbacks. */ + CTX_wm_window_set(C, win); /* needed by operator close callbacks */ WM_event_remove_handlers(C, &win->handlers); WM_event_remove_handlers(C, &win->modalhandlers); ED_screen_exit(C, win, WM_window_get_active_screen(win)); @@ -538,14 +553,6 @@ void WM_exit_ex(bContext *C, const bool do_python_exit, const bool do_user_exit_ } #endif - /* Perform this early in case commands reference other data freed later in this function. - * This most run: - * - After add-ons are disabled because they may unregister commands. - * - Before Python exits so Python objects can be de-referenced. - * - Before #BKE_blender_atexit runs they free the `argv` on WIN32. - */ - BKE_blender_cli_command_free_all(); - BLI_timer_free(); WM_paneltype_clear(); @@ -559,7 +566,7 @@ void WM_exit_ex(bContext *C, const bool do_python_exit, const bool do_user_exit_ wm_dropbox_free(); WM_menutype_free(); - /* All non-screen and non-space stuff editors did, like edit-mode. */ + /* all non-screen and non-space stuff editors did, like editmode */ if (C) { Main *bmain = CTX_data_main(C); ED_editors_exit(bmain, true); @@ -569,11 +576,11 @@ void WM_exit_ex(bContext *C, const bool do_python_exit, const bool do_user_exit_ BKE_mball_cubeTable_free(); - /* Render code might still access databases. */ + /* render code might still access databases */ RE_FreeAllRender(); RE_engines_exit(); - ED_preview_free_dbase(); /* Frees a Main dbase, before #BKE_blender_free! */ + ED_preview_free_dbase(); /* frees a Main dbase, before BKE_blender_free! */ ED_preview_restart_queue_free(); ed::asset::list::storage_exit(); @@ -615,7 +622,7 @@ void WM_exit_ex(bContext *C, const bool do_python_exit, const bool do_user_exit_ ED_gpencil_anim_copybuf_free(); ED_gpencil_strokes_copybuf_free(); - /* Free gizmo-maps after freeing blender, + /* free gizmo-maps after freeing blender, * so no deleted data get accessed during cleaning up of areas. */ wm_gizmomaptypes_free(); wm_gizmogrouptype_free(); @@ -665,7 +672,7 @@ void WM_exit_ex(bContext *C, const bool do_python_exit, const bool do_user_exit_ BKE_blender_userdef_data_free(&U, false); - RNA_exit(); /* Should be after #BPY_python_end so struct python slots are cleared. */ + RNA_exit(); /* should be after BPY_python_end so struct python slots are cleared */ wm_ghost_exit(); @@ -702,9 +709,7 @@ void WM_exit(bContext *C, const int exit_code) const bool do_user_exit_actions = G.background ? false : (exit_code == EXIT_SUCCESS); WM_exit_ex(C, true, do_user_exit_actions); - if (!G.quiet) { - printf("\nBlender quit\n"); - } + printf("\nBlender quit\n"); exit(exit_code); } diff --git a/source/blender/windowmanager/intern/wm_jobs.cc b/source/blender/windowmanager/intern/wm_jobs.cc index ff0cfe4a276..9a201383c44 100644 --- a/source/blender/windowmanager/intern/wm_jobs.cc +++ b/source/blender/windowmanager/intern/wm_jobs.cc @@ -19,8 +19,9 @@ #include "BLI_time.h" #include "BLI_utildefines.h" -#include "BKE_global.hh" -#include "BKE_report.hh" +#include "BKE_context.hh" +#include "BKE_global.h" +#include "BKE_report.h" #include "SEQ_prefetch.hh" @@ -57,10 +58,10 @@ struct wmJob { wmJob *next, *prev; - /** Job originating from, keep track of this when deleting windows. */ + /** Job originating from, keep track of this when deleting windows */ wmWindow *win; - /** Should store entirely owned context, for start, update, free. */ + /** Should store entire own context, for start, update, free */ void *customdata; /** * To prevent cpu overhead, use this one which only gets called when job really starts. @@ -98,15 +99,15 @@ struct wmJob { */ void (*canceled)(void *); - /** Running jobs each have their own timer. */ + /** Running jobs each have own timer */ double time_step; wmTimer *wt; - /** Only start job after specified time delay. */ + /** Only start job after specified time delay */ double start_delay_time; - /** The notifier event timers should send. */ + /** The notifier event timers should send */ uint note, endnote; - /* Internal. */ + /* internal */ const void *owner; eWM_JobFlag flag; bool suspended, running, ready; @@ -115,26 +116,24 @@ struct wmJob { /** Data shared with the worker code, so can be accessed and edited from several threads. */ wmJobWorkerStatus worker_status; - /** For display in header, identification. */ + /** For display in header, identification */ char name[128]; - /** Once running, we store this separately. */ + /** Once running, we store this separately */ void *run_customdata; void (*run_free)(void *); - /** We use BLI_threads api, but per job only 1 thread runs. */ + /** We use BLI_threads api, but per job only 1 thread runs */ ListBase threads; double start_time; - /** - * Ticket mutex for main thread locking while some job accesses - * data that the main thread might modify at the same time. - */ + /** Ticket mutex for main thread locking while some job accesses + * data that the main thread might modify at the same time */ TicketMutex *main_thread_mutex; }; -/* Main thread locking. */ +/* Main thread locking */ void WM_job_main_thread_lock_acquire(wmJob *wm_job) { @@ -148,8 +147,8 @@ void WM_job_main_thread_lock_release(wmJob *wm_job) static void wm_job_main_thread_yield(wmJob *wm_job) { - /* Unlock and lock the ticket mutex. because it's a fair mutex any job that - * is waiting to acquire the lock will get it first, before we can lock. */ + /* unlock and lock the ticket mutex. because it's a fair mutex any job that + * is waiting to acquire the lock will get it first, before we can lock */ BLI_ticket_mutex_unlock(wm_job->main_thread_mutex); BLI_ticket_mutex_lock(wm_job->main_thread_mutex); } @@ -212,9 +211,9 @@ wmJob *WM_jobs_get(wmWindowManager *wm, BKE_reports_init(wm_job->worker_status.reports, RPT_STORE | RPT_PRINT); BKE_report_print_level_set(wm_job->worker_status.reports, RPT_WARNING); } - /* Else: a running job, be careful. */ + /* else: a running job, be careful */ - /* Prevent creating a job with an invalid type. */ + /* prevent creating a job with an invalid type */ BLI_assert(wm_job->job_type != WM_JOB_TYPE_ANY); return wm_job; @@ -222,7 +221,7 @@ wmJob *WM_jobs_get(wmWindowManager *wm, bool WM_jobs_test(const wmWindowManager *wm, const void *owner, int job_type) { - /* Job can be running or about to run (suspended). */ + /* job can be running or about to run (suspended) */ LISTBASE_FOREACH (wmJob *, wm_job, &wm->jobs) { if (wm_job->owner != owner) { continue; @@ -259,14 +258,14 @@ static void wm_jobs_update_progress_bars(wmWindowManager *wm) LISTBASE_FOREACH (wmJob *, wm_job, &wm->jobs) { if (wm_job->threads.first && !wm_job->ready) { if (wm_job->flag & WM_JOB_PROGRESS) { - /* Accumulate global progress for running jobs. */ + /* accumulate global progress for running jobs */ jobs_progress++; total_progress += wm_job->worker_status.progress; } } } - /* If there are running jobs, set the global progress indicator. */ + /* if there are running jobs, set the global progress indicator */ if (jobs_progress > 0) { float progress = total_progress / float(jobs_progress); @@ -333,9 +332,9 @@ void *WM_jobs_customdata_get(wmJob *wm_job) return wm_job->customdata; } -void WM_jobs_customdata_set(wmJob *wm_job, void *customdata, void (*free)(void *customdata)) +void WM_jobs_customdata_set(wmJob *wm_job, void *customdata, void (*free)(void *)) { - /* Pending job? just free. */ + /* pending job? just free */ if (wm_job->customdata) { wm_job->free(wm_job->customdata); } @@ -344,7 +343,7 @@ void WM_jobs_customdata_set(wmJob *wm_job, void *customdata, void (*free)(void * wm_job->free = free; if (wm_job->running) { - /* Signal job to end. */ + /* signal job to end */ wm_job->worker_status.stop = true; } } @@ -401,32 +400,32 @@ static void *do_job_thread(void *job_v) return nullptr; } -/* Don't allow same startjob to be executed twice. */ +/* don't allow same startjob to be executed twice */ static void wm_jobs_test_suspend_stop(wmWindowManager *wm, wmJob *test) { bool suspend = false; - /* Job added with suspend flag, we wait 1 timer step before activating it. */ + /* job added with suspend flag, we wait 1 timer step before activating it */ if (test->start_delay_time > 0.0) { suspend = true; test->start_delay_time = 0.0; } else { - /* Check other jobs. */ + /* check other jobs */ LISTBASE_FOREACH (wmJob *, wm_job, &wm->jobs) { - /* Obvious case, no test needed. */ + /* obvious case, no test needed */ if (wm_job == test || !wm_job->running) { continue; } - /* If new job is not render, then check for same startjob. */ + /* if new job is not render, then check for same startjob */ if (0 == (test->flag & WM_JOB_EXCL_RENDER)) { if (wm_job->startjob != test->startjob) { continue; } } - /* If new job is render, any render job should be stopped. */ + /* if new job is render, any render job should be stopped */ if (test->flag & WM_JOB_EXCL_RENDER) { if (0 == (wm_job->flag & WM_JOB_EXCL_RENDER)) { continue; @@ -435,7 +434,7 @@ static void wm_jobs_test_suspend_stop(wmWindowManager *wm, wmJob *test) suspend = true; - /* If this job has higher priority, stop others. */ + /* if this job has higher priority, stop others */ if (test->flag & WM_JOB_PRIORITY) { wm_job->worker_status.stop = true; // printf("job stopped: %s\n", wm_job->name); @@ -455,7 +454,7 @@ static void wm_jobs_test_suspend_stop(wmWindowManager *wm, wmJob *test) void WM_jobs_start(wmWindowManager *wm, wmJob *wm_job) { if (wm_job->running) { - /* Signal job to end and restart. */ + /* signal job to end and restart */ wm_job->worker_status.stop = true; // printf("job started a running job, ending... %s\n", wm_job->name); } @@ -468,7 +467,7 @@ void WM_jobs_start(wmWindowManager *wm, wmJob *wm_job) wm_jobs_test_suspend_stop(wm, wm_job); if (wm_job->suspended == false) { - /* Copy to ensure proper free in end. */ + /* copy to ensure proper free in end */ wm_job->run_customdata = wm_job->customdata; wm_job->run_free = wm_job->free; wm_job->free = nullptr; @@ -489,7 +488,7 @@ void WM_jobs_start(wmWindowManager *wm, wmJob *wm_job) BLI_threadpool_insert(&wm_job->threads, wm_job); } - /* Restarted job has timer already. */ + /* restarted job has timer already */ if (wm_job->wt && (wm_job->wt->time_step > time_step)) { WM_event_timer_remove(wm, wm_job->win, wm_job->wt); wm_job->wt = WM_event_timer_add(wm, wm_job->win, TIMERJOBS, time_step); @@ -498,7 +497,7 @@ void WM_jobs_start(wmWindowManager *wm, wmJob *wm_job) wm_job->wt = WM_event_timer_add(wm, wm_job->win, TIMERJOBS, time_step); } - wm_job->start_time = BLI_time_now_seconds(); + wm_job->start_time = BLI_check_seconds_timer(); } else { printf("job fails, not initialized\n"); @@ -539,13 +538,13 @@ static void wm_job_free(wmWindowManager *wm, wmJob *wm_job) MEM_freeN(wm_job); } -/* Stop job, end thread, free data completely. */ +/* stop job, end thread, free data completely */ static void wm_jobs_kill_job(wmWindowManager *wm, wmJob *wm_job) { bool update_progress = (wm_job->flag & WM_JOB_PROGRESS) != 0; if (wm_job->running) { - /* Signal job to end. */ + /* signal job to end */ wm_job->worker_status.stop = true; WM_job_main_thread_lock_release(wm_job); @@ -564,7 +563,7 @@ static void wm_jobs_kill_job(wmWindowManager *wm, wmJob *wm_job) wm_job->run_free(wm_job->run_customdata); } - /* Remove wm_job. */ + /* remove wm_job */ wm_job_free(wm, wm_job); /* Update progress bars in windows. */ @@ -581,7 +580,7 @@ void WM_jobs_kill_all(wmWindowManager *wm) wm_jobs_kill_job(wm, wm_job); } - /* This job will be automatically restarted. */ + /* This job will be automatically restarted */ SEQ_prefetch_stop_all(); } @@ -640,12 +639,12 @@ void wm_jobs_timer(wmWindowManager *wm, wmTimer *wt) wmJob *wm_job = static_cast(BLI_findptr(&wm->jobs, wt, offsetof(wmJob, wt))); if (wm_job) { - /* Running threads. */ + /* running threads */ if (wm_job->threads.first) { - /* Let threads get temporary lock over main thread if needed. */ + /* let threads get temporary lock over main thread if needed */ wm_job_main_thread_yield(wm_job); - /* Always call note and update when ready. */ + /* always call note and update when ready */ if (wm_job->worker_status.do_update || wm_job->ready) { if (wm_job->update) { wm_job->update(wm_job->run_customdata); @@ -663,7 +662,7 @@ void wm_jobs_timer(wmWindowManager *wm, wmTimer *wt) if (wm_job->ready) { wm_job_end(wm, wm_job); - /* Free owned data. */ + /* free own data */ wm_job->run_free(wm_job->run_customdata); wm_job->run_customdata = nullptr; wm_job->run_free = nullptr; @@ -680,7 +679,7 @@ void wm_jobs_timer(wmWindowManager *wm, wmTimer *wt) if (G.debug & G_DEBUG_JOBS) { printf("Job '%s' finished in %f seconds\n", wm_job->name, - BLI_time_now_seconds() - wm_job->start_time); + BLI_check_seconds_timer() - wm_job->start_time); } wm_job->running = false; @@ -695,7 +694,7 @@ void wm_jobs_timer(wmWindowManager *wm, wmTimer *wt) WM_event_add_notifier_ex(wm, wm_job->win, NC_WM | ND_JOB, nullptr); - /* New job added for wm_job? */ + /* new job added for wm_job? */ if (wm_job->customdata) { // printf("job restarted with new data %s\n", wm_job->name); WM_jobs_start(wm, wm_job); @@ -704,7 +703,7 @@ void wm_jobs_timer(wmWindowManager *wm, wmTimer *wt) WM_event_timer_remove(wm, wm_job->win, wm_job->wt); wm_job->wt = nullptr; - /* Remove wm_job. */ + /* remove wm_job */ wm_job_free(wm, wm_job); wm_job = nullptr; } diff --git a/source/blender/windowmanager/intern/wm_keymap.cc b/source/blender/windowmanager/intern/wm_keymap.cc index 7939701f4d3..747e8461fcd 100644 --- a/source/blender/windowmanager/intern/wm_keymap.cc +++ b/source/blender/windowmanager/intern/wm_keymap.cc @@ -9,7 +9,6 @@ */ #include -#include #include "DNA_object_types.h" #include "DNA_screen_types.h" @@ -30,13 +29,13 @@ #include "UI_interface.hh" #include "BKE_context.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_idprop.h" #include "BKE_main.hh" #include "BKE_screen.hh" #include "BKE_workspace.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "RNA_access.hh" #include "RNA_enum_types.hh" @@ -86,7 +85,7 @@ static wmKeyMapItem *wm_keymap_item_copy(wmKeyMapItem *kmi) static void wm_keymap_item_free_data(wmKeyMapItem *kmi) { - /* Not the `kmi` itself. */ + /* not kmi itself */ if (kmi->ptr) { WM_operator_properties_free(kmi->ptr); MEM_freeN(kmi->ptr); @@ -137,7 +136,7 @@ static void wm_keymap_item_properties_update_ot(wmKeyMapItem *kmi, const bool ke wmOperatorType *ot = WM_operatortype_find(kmi->idname, false); if (ot) { if (ot->srna != kmi->ptr->type) { - /* Matches #wm_keymap_item_properties_set but doesn't alloc new ptr. */ + /* matches wm_keymap_item_properties_set but doesn't alloc new ptr */ WM_operator_properties_create_ptr(kmi->ptr, ot); /* 'kmi->ptr->data' nullptr'd above, keep using existing properties. * NOTE: the operators property types may have changed, @@ -367,21 +366,21 @@ static wmKeyConfig *WM_keyconfig_active(wmWindowManager *wm) { wmKeyConfig *keyconf; - /* First try from preset. */ + /* first try from preset */ keyconf = static_cast( BLI_findstring(&wm->keyconfigs, U.keyconfigstr, offsetof(wmKeyConfig, idname))); if (keyconf) { return keyconf; } - /* Otherwise use default. */ + /* otherwise use default */ return wm->defaultconf; } void WM_keyconfig_set_active(wmWindowManager *wm, const char *idname) { - /* Setting a different key configuration as active: - * we ensure all is updated properly before and after making the change. */ + /* setting a different key configuration as active: we ensure all is + * updated properly before and after making the change */ WM_keyconfig_update(wm); @@ -539,7 +538,7 @@ static void keymap_item_set_id(wmKeyMap *keymap, wmKeyMapItem *kmi) kmi->id = keymap->kmi_id; } else { - kmi->id = -keymap->kmi_id; /* User defined keymap entries have negative ids. */ + kmi->id = -keymap->kmi_id; /* User defined keymap entries have negative ids */ } } @@ -640,14 +639,14 @@ static void wm_keymap_diff( wmKeyMapItem *to_kmi = WM_keymap_item_find_id(to_km, kmi->id); if (!to_kmi) { - /* Remove item. */ + /* remove item */ wmKeyMapDiffItem *kmdi = static_cast( MEM_callocN(sizeof(wmKeyMapDiffItem), "wmKeyMapDiffItem")); kmdi->remove_item = wm_keymap_item_copy(kmi); BLI_addtail(&diff_km->diff_items, kmdi); } else if (to_kmi && !wm_keymap_item_equals(kmi, to_kmi)) { - /* Replace item. */ + /* replace item */ wmKeyMapDiffItem *kmdi = static_cast( MEM_callocN(sizeof(wmKeyMapDiffItem), "wmKeyMapDiffItem")); kmdi->remove_item = wm_keymap_item_copy(kmi); @@ -672,7 +671,7 @@ static void wm_keymap_diff( LISTBASE_FOREACH (wmKeyMapItem *, kmi, &to_km->items) { if (kmi->id < 0) { - /* Add item. */ + /* add item */ wmKeyMapDiffItem *kmdi = static_cast( MEM_callocN(sizeof(wmKeyMapDiffItem), "wmKeyMapDiffItem")); kmdi->add_item = wm_keymap_item_copy(kmi); @@ -684,7 +683,7 @@ static void wm_keymap_diff( static void wm_keymap_patch(wmKeyMap *km, wmKeyMap *diff_km) { LISTBASE_FOREACH (wmKeyMapDiffItem *, kmdi, &diff_km->diff_items) { - /* Find item to remove. */ + /* find item to remove */ wmKeyMapItem *kmi_remove = nullptr; if (kmdi->remove_item) { kmi_remove = wm_keymap_find_item_equals(km, kmdi->remove_item); @@ -693,7 +692,7 @@ static void wm_keymap_patch(wmKeyMap *km, wmKeyMap *diff_km) } } - /* Add item. */ + /* add item */ if (kmdi->add_item) { /* Do not re-add an already existing keymap item! See #42088. */ /* We seek only for exact copy here! See #42137. */ @@ -718,7 +717,7 @@ static void wm_keymap_patch(wmKeyMap *km, wmKeyMap *diff_km) if (kmi_add != nullptr && kmi_add == kmi_remove) { kmi_remove = nullptr; } - /* Only if nothing to remove or item to remove found. */ + /* only if nothing to remove or item to remove found */ else if (!kmi_add && (!kmdi->remove_item || kmi_remove)) { kmi_add = wm_keymap_item_copy(kmdi->add_item); kmi_add->flag |= KMI_USER_MODIFIED; @@ -736,7 +735,7 @@ static void wm_keymap_patch(wmKeyMap *km, wmKeyMap *diff_km) } } - /* Remove item. */ + /* remove item */ if (kmi_remove) { wm_keymap_item_free_data(kmi_remove); BLI_freelinkN(&km->items, kmi_remove); @@ -751,7 +750,7 @@ static wmKeyMap *wm_keymap_patch_update(ListBase *lb, { int expanded = 0; - /* Remove previous keymap in list, we will replace it. */ + /* remove previous keymap in list, we will replace it */ wmKeyMap *km = WM_keymap_list_find( lb, defaultmap->idname, defaultmap->spaceid, defaultmap->regionid); if (km) { @@ -760,14 +759,14 @@ static wmKeyMap *wm_keymap_patch_update(ListBase *lb, BLI_freelinkN(lb, km); } - /* Copy new keymap from an existing one. */ + /* copy new keymap from an existing one */ if (usermap && !(usermap->flag & KEYMAP_DIFF)) { - /* For compatibility with old user preferences with non-diff - * keymaps we override the original entirely. */ + /* for compatibility with old user preferences with non-diff + * keymaps we override the original entirely */ km = wm_keymap_copy(usermap); - /* Try to find corresponding id's for items. */ + /* try to find corresponding id's for items */ LISTBASE_FOREACH (wmKeyMapItem *, kmi, &km->items) { wmKeyMapItem *orig_kmi = wm_keymap_find_item_equals(defaultmap, kmi); if (!orig_kmi) { @@ -782,29 +781,29 @@ static wmKeyMap *wm_keymap_patch_update(ListBase *lb, } } - km->flag |= KEYMAP_UPDATE; /* Update again to create diff. */ + km->flag |= KEYMAP_UPDATE; /* update again to create diff */ } else { km = wm_keymap_copy(defaultmap); } - /* Add addon keymap items. */ + /* add addon keymap items */ if (addonmap) { wm_keymap_addon_add(km, addonmap); } - /* Tag as being user edited. */ + /* tag as being user edited */ if (usermap) { km->flag |= KEYMAP_USER_MODIFIED; } km->flag |= KEYMAP_USER | expanded; - /* Apply user changes of diff keymap. */ + /* apply user changes of diff keymap */ if (usermap && (usermap->flag & KEYMAP_DIFF)) { wm_keymap_patch(km, usermap); } - /* Add to list. */ + /* add to list */ BLI_addtail(lb, km); return km; @@ -815,7 +814,7 @@ static void wm_keymap_diff_update(ListBase *lb, wmKeyMap *addonmap, wmKeyMap *km) { - /* Create temporary default + addon keymap for diff. */ + /* create temporary default + addon keymap for diff */ wmKeyMap *origmap = defaultmap; if (addonmap) { @@ -823,14 +822,14 @@ static void wm_keymap_diff_update(ListBase *lb, wm_keymap_addon_add(defaultmap, addonmap); } - /* Remove previous diff keymap in list, we will replace it. */ + /* remove previous diff keymap in list, we will replace it */ wmKeyMap *prevmap = WM_keymap_list_find(lb, km->idname, km->spaceid, km->regionid); if (prevmap) { WM_keymap_clear(prevmap); BLI_freelinkN(lb, prevmap); } - /* Create diff keymap. */ + /* create diff keymap */ wmKeyMap *diffmap = wm_keymap_new(km->idname, km->spaceid, km->regionid); diffmap->flag |= KEYMAP_DIFF; if (defaultmap->flag & KEYMAP_MODAL) { @@ -838,7 +837,7 @@ static void wm_keymap_diff_update(ListBase *lb, } wm_keymap_diff(diffmap, defaultmap, km, origmap, addonmap); - /* Add to list if not empty. */ + /* add to list if not empty */ if (diffmap->diff_items.first) { BLI_addtail(lb, diffmap); } @@ -847,7 +846,7 @@ static void wm_keymap_diff_update(ListBase *lb, MEM_freeN(diffmap); } - /* Free temporary default map. */ + /* free temporary default map */ if (addonmap) { WM_keymap_clear(defaultmap); MEM_freeN(defaultmap); @@ -937,7 +936,7 @@ wmKeyMap *WM_modalkeymap_ensure(wmKeyConfig *keyconf, wmKeyMap *km = WM_keymap_ensure(keyconf, idname, SPACE_EMPTY, RGN_TYPE_WINDOW); km->flag |= KEYMAP_MODAL; - /* Initialize modal items from default configuration. */ + /* init modal items from default config */ wmWindowManager *wm = static_cast(G_MAIN->wm.first); if (wm->defaultconf && wm->defaultconf != keyconf) { wmKeyMap *defaultkm = WM_keymap_list_find( @@ -1044,8 +1043,8 @@ void WM_modalkeymap_assign(wmKeyMap *km, const char *opname) static void wm_user_modal_keymap_set_items(wmWindowManager *wm, wmKeyMap *km) { - /* Here we convert propvalue string values delayed, due to python keymaps - * being created before the actual modal keymaps, so no modal_items. */ + /* here we convert propvalue string values delayed, due to python keymaps + * being created before the actual modal keymaps, so no modal_items */ if (km && (km->flag & KEYMAP_MODAL) && !km->modal_items) { if (wm->defaultconf == nullptr) { @@ -1193,17 +1192,20 @@ const char *WM_key_event_string(const short type, const bool compact) return CTX_IFACE_(BLT_I18NCONTEXT_UI_EVENTS, it->name); } -std::optional WM_keymap_item_raw_to_string(const short shift, - const short ctrl, - const short alt, - const short oskey, - const short keymodifier, - const short val, - const short type, - const bool compact) +int WM_keymap_item_raw_to_string(const short shift, + const short ctrl, + const short alt, + const short oskey, + const short keymodifier, + const short val, + const short type, + const bool compact, + char *result, + const int result_maxncpy) { /* TODO: also support (some) value, like e.g. double-click? */ - blender::Vector result_array; + const char *result_array[12]; + int i = 0; const char *space = " "; @@ -1212,80 +1214,136 @@ std::optional WM_keymap_item_raw_to_string(const short shift, } else { if (shift) { - result_array.append(WM_key_event_string(EVT_LEFTSHIFTKEY, true)); - result_array.append(space); + result_array[i++] = WM_key_event_string(EVT_LEFTSHIFTKEY, true); + result_array[i++] = space; } if (ctrl) { - result_array.append(WM_key_event_string(EVT_LEFTCTRLKEY, true)); - result_array.append(space); + result_array[i++] = WM_key_event_string(EVT_LEFTCTRLKEY, true); + result_array[i++] = space; } if (alt) { - result_array.append(WM_key_event_string(EVT_LEFTALTKEY, true)); - result_array.append(space); + result_array[i++] = WM_key_event_string(EVT_LEFTALTKEY, true); + result_array[i++] = space; } if (oskey) { - result_array.append(WM_key_event_string(EVT_OSKEY, true)); - result_array.append(space); + result_array[i++] = WM_key_event_string(EVT_OSKEY, true); + result_array[i++] = space; } } if (keymodifier) { - result_array.append(WM_key_event_string(keymodifier, compact)); - result_array.append(space); + result_array[i++] = WM_key_event_string(keymodifier, compact); + result_array[i++] = space; } if (type) { if (val == KM_DBL_CLICK) { - result_array.append(IFACE_("dbl-")); + result_array[i++] = IFACE_("dbl-"); } else if (val == KM_CLICK_DRAG) { - result_array.append(IFACE_("drag-")); + result_array[i++] = IFACE_("drag-"); } - result_array.append(WM_key_event_string(type, compact)); + result_array[i++] = WM_key_event_string(type, compact); } - if (result_array.last() == space) { - result_array.remove_last(); + /* We assume size of buf is enough to always store any possible shortcut, + * but let's add a debug check about it! */ + BLI_assert(i < ARRAY_SIZE(result_array)); + + if (i > 0 && result_array[i - 1] == space) { + i--; } - return fmt::to_string(fmt::join(result_array, "")); + return BLI_string_join_array(result, result_maxncpy, result_array, i); } -std::optional WM_keymap_item_to_string(const wmKeyMapItem *kmi, const bool compact) +int WM_keymap_item_to_string(const wmKeyMapItem *kmi, + const bool compact, + char *result, + const int result_maxncpy) { - return WM_keymap_item_raw_to_string( - kmi->shift, kmi->ctrl, kmi->alt, kmi->oskey, kmi->keymodifier, kmi->val, kmi->type, compact); + return WM_keymap_item_raw_to_string(kmi->shift, + kmi->ctrl, + kmi->alt, + kmi->oskey, + kmi->keymodifier, + kmi->val, + kmi->type, + compact, + result, + result_maxncpy); } -std::optional WM_modalkeymap_items_to_string(const wmKeyMap *km, - const int propvalue, - const bool compact) +int WM_modalkeymap_items_to_string(const wmKeyMap *km, + const int propvalue, + const bool compact, + char *result, + const int result_maxncpy) { + BLI_string_debug_size(result, result_maxncpy); + BLI_assert(result_maxncpy > 0); + const wmKeyMapItem *kmi; if (km == nullptr || (kmi = WM_modalkeymap_find_propvalue(km, propvalue)) == nullptr) { - return std::nullopt; + *result = '\0'; + return 0; } - std::string result; + int totlen = 0; do { - result += WM_keymap_item_to_string(kmi, compact).value_or(""); + totlen += WM_keymap_item_to_string(kmi, compact, &result[totlen], result_maxncpy - totlen); - if ((kmi = wm_modalkeymap_find_propvalue_iter(km, kmi, propvalue)) == nullptr) { + if ((kmi = wm_modalkeymap_find_propvalue_iter(km, kmi, propvalue)) == nullptr || + totlen >= (result_maxncpy - 2)) + { break; } - result += '/'; + + result[totlen++] = '/'; + result[totlen] = '\0'; } while (true); - return result; + return totlen; } -std::optional WM_modalkeymap_operator_items_to_string(wmOperatorType *ot, - const int propvalue, - const bool compact) +int WM_modalkeymap_operator_items_to_string(wmOperatorType *ot, + const int propvalue, + const bool compact, + char *result, + const int result_maxncpy) { + BLI_string_debug_size_after_nil(result, result_maxncpy); wmWindowManager *wm = static_cast(G_MAIN->wm.first); wmKeyMap *keymap = WM_keymap_active(wm, ot->modalkeymap); - return WM_modalkeymap_items_to_string(keymap, propvalue, compact); + return WM_modalkeymap_items_to_string(keymap, propvalue, compact, result, result_maxncpy); +} + +char *WM_modalkeymap_operator_items_to_string_buf(wmOperatorType *ot, + const int propvalue, + const bool compact, + const int result_maxncpy, + int *r_available_len, + char **r_result) +{ + BLI_string_debug_size(*r_result, result_maxncpy); + char *ret = *r_result; + + if (*r_available_len > 1) { + int used_len = WM_modalkeymap_operator_items_to_string( + ot, propvalue, compact, ret, min_ii(*r_available_len, result_maxncpy)) + + 1; + + *r_available_len -= used_len; + *r_result += used_len; + if (*r_available_len == 0) { + (*r_result)--; /* So that *result keeps pointing on a valid char, we'll stay on it anyway. */ + } + } + else { + *ret = '\0'; + } + + return ret; } /** \} */ @@ -1301,7 +1359,7 @@ static wmKeyMapItem *wm_keymap_item_find_in_keymap(wmKeyMap *keymap, const wmKeyMapItemFind_Params *params) { LISTBASE_FOREACH (wmKeyMapItem *, kmi, &keymap->items) { - /* Skip disabled keymap items, see: #38447. */ + /* skip disabled keymap items [#38447] */ if (kmi->flag & KMI_INACTIVE) { continue; } @@ -1311,7 +1369,7 @@ static wmKeyMapItem *wm_keymap_item_find_in_keymap(wmKeyMap *keymap, bool kmi_match = false; if (properties) { -/* Example of debugging keymaps. */ +/* example of debugging keymaps */ #if 0 if (kmi->ptr) { if (STREQ("MESH_OT_rip_move", opname)) { @@ -1333,7 +1391,7 @@ static wmKeyMapItem *wm_keymap_item_find_in_keymap(wmKeyMap *keymap, if (is_strict && kmi->ptr) { wmOperatorType *ot = WM_operatortype_find(opname, true); if (ot) { - /* Make a copy of the properties and set unset ones to their default values. */ + /* make a copy of the properties and set unset ones to their default values. */ IDProperty *properties_default = IDP_CopyProperty( static_cast(kmi->ptr->data)); @@ -1341,13 +1399,14 @@ static wmKeyMapItem *wm_keymap_item_find_in_keymap(wmKeyMap *keymap, WM_operator_properties_default(&opptr, true); if (IDP_EqualsProperties_ex(properties, properties_default, is_strict)) { - std::string kmi_str = WM_keymap_item_to_string(kmi, false).value_or(""); + char kmi_str[128]; + WM_keymap_item_to_string(kmi, false, kmi_str, sizeof(kmi_str)); /* 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", opname); - printf("\tkm: '%s', kmi: '%s'\n", keymap->idname, kmi_str.c_str()); + printf("\tkm: '%s', kmi: '%s'\n", keymap->idname, kmi_str); #ifndef NDEBUG # ifdef WITH_PYTHON printf("OPERATOR\n"); @@ -1388,7 +1447,7 @@ static wmKeyMapItem *wm_keymap_item_find_handlers(const bContext *C, const wmKeyMapItemFind_Params *params, wmKeyMap **r_keymap) { - /* Find keymap item in handlers. */ + /* find keymap item in handlers */ LISTBASE_FOREACH (wmEventHandler *, handler_base, handlers) { if (handler_base->type == WM_HANDLER_TYPE_KEYMAP) { wmEventHandler_Keymap *handler = (wmEventHandler_Keymap *)handler_base; @@ -1409,7 +1468,7 @@ static wmKeyMapItem *wm_keymap_item_find_handlers(const bContext *C, } } } - /* Ensure un-initialized keymap is never used. */ + /* ensure un-initialized keymap is never used */ if (r_keymap) { *r_keymap = nullptr; } @@ -1430,7 +1489,7 @@ static wmKeyMapItem *wm_keymap_item_find_props(const bContext *C, ARegion *region = CTX_wm_region(C); wmKeyMapItem *found = nullptr; - /* Look into multiple handler lists to find the item. */ + /* look into multiple handler lists to find the item */ if (win) { found = wm_keymap_item_find_handlers(C, wm, @@ -1560,7 +1619,7 @@ static wmKeyMapItem *wm_keymap_item_find(const bContext *C, */ if (!found && properties) { if (ot && ot->prop) { /* XXX Shall we also check ot->prop is actually an enum? */ - /* Make a copy of the properties and unset the 'ot->prop' one if set. */ + /* make a copy of the properties and unset the 'ot->prop' one if set. */ IDProperty *properties_temp = IDP_CopyProperty(properties); PointerRNA opptr = RNA_pointer_create(nullptr, ot->srna, properties_temp); @@ -1582,7 +1641,7 @@ static wmKeyMapItem *wm_keymap_item_find(const bContext *C, if (G.debug & G_DEBUG_WM) { if (!found && is_strict && properties) { if (ot) { - /* Make a copy of the properties and set unset ones to their default values. */ + /* make a copy of the properties and set unset ones to their default values. */ IDProperty *properties_default = IDP_CopyProperty(properties); PointerRNA opptr = RNA_pointer_create(nullptr, ot->srna, properties_default); @@ -1592,12 +1651,13 @@ static wmKeyMapItem *wm_keymap_item_find(const bContext *C, wmKeyMapItem *kmi = wm_keymap_item_find_props( C, opname, opcontext, properties_default, is_strict, params, &km); if (kmi) { - std::string kmi_str = WM_keymap_item_to_string(kmi, false).value_or(""); + char kmi_str[128]; + WM_keymap_item_to_string(kmi, false, kmi_str, sizeof(kmi_str)); printf( "%s: Some set values in keymap entry match default op values, " "this might not be desired!\n", opname); - printf("\tkm: '%s', kmi: '%s'\n", km->idname, kmi_str.c_str()); + printf("\tkm: '%s', kmi: '%s'\n", km->idname, kmi_str); #ifndef NDEBUG # ifdef WITH_PYTHON printf("OPERATOR\n"); @@ -1625,11 +1685,13 @@ static bool kmi_filter_is_visible(const wmKeyMap * /*km*/, (IS_EVENT_ACTIONZONE(kmi->type) == false)); } -std::optional WM_key_event_operator_string(const bContext *C, - const char *opname, - wmOperatorCallContext opcontext, - IDProperty *properties, - const bool is_strict) +char *WM_key_event_operator_string(const bContext *C, + const char *opname, + wmOperatorCallContext opcontext, + IDProperty *properties, + const bool is_strict, + char *result, + const int result_maxncpy) { wmKeyMapItemFind_Params params{}; params.filter_fn = kmi_filter_is_visible; @@ -1637,17 +1699,16 @@ std::optional WM_key_event_operator_string(const bContext *C, wmKeyMapItem *kmi = wm_keymap_item_find( C, opname, opcontext, properties, is_strict, ¶ms, nullptr); if (kmi) { - return WM_keymap_item_to_string(kmi, false); - } - - /* Check UI state (non key-map actions for UI regions). */ - if (std::optional result = UI_key_event_operator_string( - C, opname, properties, is_strict)) - { + WM_keymap_item_to_string(kmi, false, result, result_maxncpy); return result; } - return std::nullopt; + /* Check UI state (non key-map actions for UI regions). */ + if (UI_key_event_operator_string(C, opname, properties, is_strict, result, result_maxncpy)) { + return result; + } + + return nullptr; } static bool kmi_filter_is_visible_type_mask(const wmKeyMap *km, @@ -1697,7 +1758,7 @@ bool WM_keymap_item_compare(const wmKeyMapItem *k1, const wmKeyMapItem *k2) return false; } - /* Take event mapping into account. */ + /* take event mapping into account */ int k1type = WM_userdef_event_map(k1->type); int k2type = WM_userdef_event_map(k2->type); @@ -1706,7 +1767,7 @@ bool WM_keymap_item_compare(const wmKeyMapItem *k1, const wmKeyMapItem *k2) } if (k1->val != KM_ANY && k2->val != KM_ANY) { - /* Take click, press, release conflict into account. */ + /* take click, press, release conflict into account */ if (k1->val == KM_CLICK && ELEM(k2->val, KM_PRESS, KM_RELEASE, KM_CLICK) == 0) { return false; } @@ -1754,11 +1815,11 @@ bool WM_keymap_item_compare(const wmKeyMapItem *k1, const wmKeyMapItem *k2) * the changes to the user preferences. * \{ */ -/* So operator removal can trigger update. */ +/* so operator removal can trigger update */ enum { WM_KEYMAP_UPDATE_RECONFIGURE = (1 << 0), - /* Ensure all wmKeyMap have their operator types validated after removing an operator. */ + /* ensure all wmKeyMap have their operator types validated after removing an operator */ WM_KEYMAP_UPDATE_OPERATORTYPE = (1 << 1), WM_KEYMAP_UPDATE_POSTPONE = (1 << 2), @@ -1773,7 +1834,7 @@ static int8_t wm_keymap_update_suppress_count = 0; void WM_keyconfig_update_tag(wmKeyMap *keymap, wmKeyMapItem *kmi) { - /* Quick tag to do delayed keymap updates. */ + /* quick tag to do delayed keymap updates */ wm_keymap_update_flag |= WM_KEYMAP_UPDATE_RECONFIGURE; if (keymap) { @@ -1889,7 +1950,7 @@ void WM_keyconfig_update_ex(wmWindowManager *wm, bool keep_properties) } if (wm_keymap_update_flag & WM_KEYMAP_UPDATE_RECONFIGURE) { - /* Update operator properties for non-modal user keymaps. */ + /* update operator properties for non-modal user keymaps */ LISTBASE_FOREACH (wmKeyMap *, km, &U.user_keymaps) { if ((km->flag & KEYMAP_MODAL) == 0) { LISTBASE_FOREACH (wmKeyMapDiffItem *, kmdi, &km->diff_items) { @@ -1907,25 +1968,25 @@ void WM_keyconfig_update_ex(wmWindowManager *wm, bool keep_properties) } } - /* Update `U.user_keymaps` with user key configuration changes. */ + /* update U.user_keymaps with user key configuration changes */ LISTBASE_FOREACH (wmKeyMap *, km, &wm->userconf->keymaps) { - /* Only diff if the user keymap was modified. */ + /* only diff if the user keymap was modified */ if (wm_keymap_test_and_clear_update(km)) { - /* Find keymaps. */ + /* find keymaps */ wmKeyMap *defaultmap = wm_keymap_preset(wm, km); wmKeyMap *addonmap = WM_keymap_list_find( &wm->addonconf->keymaps, km->idname, km->spaceid, km->regionid); - /* Diff. */ + /* diff */ if (defaultmap) { wm_keymap_diff_update(&U.user_keymaps, defaultmap, addonmap, km); } } } - /* Create user key configuration from preset + addon + user preferences. */ + /* create user key configuration from preset + addon + user preferences */ LISTBASE_FOREACH (wmKeyMap *, km, &wm->defaultconf->keymaps) { - /* Find keymaps. */ + /* find keymaps */ wmKeyMap *defaultmap = wm_keymap_preset(wm, km); wmKeyMap *addonmap = WM_keymap_list_find( &wm->addonconf->keymaps, km->idname, km->spaceid, km->regionid); @@ -1936,7 +1997,7 @@ void WM_keyconfig_update_ex(wmWindowManager *wm, bool keep_properties) * if we support modal keymaps for 'addonmap', these will need to be enabled too. */ wm_user_modal_keymap_set_items(wm, defaultmap); - /* Add. */ + /* add */ wmKeyMap *kmn = wm_keymap_patch_update( &wm->userconf->keymaps, defaultmap, addonmap, usermap); @@ -1946,7 +2007,7 @@ void WM_keyconfig_update_ex(wmWindowManager *wm, bool keep_properties) kmn->poll_modal_item = km->poll_modal_item; } - /* In case of old non-diff keymaps, force extra update to create diffs. */ + /* in case of old non-diff keymaps, force extra update to create diffs */ compat_update = compat_update || (usermap && !(usermap->flag & KEYMAP_DIFF)); } @@ -2007,7 +2068,7 @@ wmKeyMap *WM_keymap_active(const wmWindowManager *wm, wmKeyMap *keymap) return nullptr; } - /* First user defined keymaps. */ + /* first user defined keymaps */ wmKeyMap *km = WM_keymap_list_find( &wm->userconf->keymaps, keymap->idname, keymap->spaceid, keymap->regionid); @@ -2032,7 +2093,7 @@ void WM_keymap_item_restore_to_default(wmWindowManager *wm, wmKeyMap *keymap, wm return; } - /* Construct default keymap from preset + addons. */ + /* construct default keymap from preset + addons */ wmKeyMap *defaultmap = wm_keymap_preset(wm, keymap); wmKeyMap *addonmap = WM_keymap_list_find( &wm->addonconf->keymaps, keymap->idname, keymap->spaceid, keymap->regionid); @@ -2042,11 +2103,11 @@ void WM_keymap_item_restore_to_default(wmWindowManager *wm, wmKeyMap *keymap, wm wm_keymap_addon_add(defaultmap, addonmap); } - /* Find original item. */ + /* find original item */ wmKeyMapItem *orig = WM_keymap_item_find_id(defaultmap, kmi->id); if (orig) { - /* Restore to original. */ + /* restore to original */ if (!STREQ(orig->idname, kmi->idname)) { STRNCPY(kmi->idname, orig->idname); WM_keymap_item_properties_reset(kmi, nullptr); @@ -2079,7 +2140,7 @@ void WM_keymap_item_restore_to_default(wmWindowManager *wm, wmKeyMap *keymap, wm WM_keyconfig_update_tag(keymap, kmi); } - /* Free temporary keymap. */ + /* free temporary keymap */ if (addonmap) { WM_keymap_clear(defaultmap); MEM_freeN(defaultmap); @@ -2088,7 +2149,7 @@ void WM_keymap_item_restore_to_default(wmWindowManager *wm, wmKeyMap *keymap, wm void WM_keymap_restore_to_default(wmKeyMap *keymap, wmWindowManager *wm) { - /* Remove keymap from U.user_keymaps and update. */ + /* remove keymap from U.user_keymaps and update */ wmKeyMap *usermap = WM_keymap_list_find( &U.user_keymaps, keymap->idname, keymap->spaceid, keymap->regionid); diff --git a/source/blender/windowmanager/intern/wm_keymap_utils.cc b/source/blender/windowmanager/intern/wm_keymap_utils.cc index f82ce0d9f8f..d02a2eb21b1 100644 --- a/source/blender/windowmanager/intern/wm_keymap_utils.cc +++ b/source/blender/windowmanager/intern/wm_keymap_utils.cc @@ -25,7 +25,7 @@ #include "WM_api.hh" #include "WM_types.hh" -/* Menu wrapper for #WM_keymap_add_item. */ +/* menu wrapper for WM_keymap_add_item */ /* -------------------------------------------------------------------- */ /** \name Wrappers for #WM_keymap_add_item @@ -219,7 +219,7 @@ wmKeyMap *WM_keymap_guess_opname(const bContext *C, const char *opname) wmWindowManager *wm = CTX_wm_manager(C); SpaceLink *sl = CTX_wm_space_data(C); - /* Window. */ + /* Window */ if (STRPREFIX(opname, "WM_OT") || STRPREFIX(opname, "ED_OT_undo")) { if (STREQ(opname, "WM_OT_tool_set_by_id")) { km = WM_keymap_guess_from_context(C); @@ -229,34 +229,34 @@ wmKeyMap *WM_keymap_guess_opname(const bContext *C, const char *opname) km = WM_keymap_find_all(wm, "Window", SPACE_EMPTY, RGN_TYPE_WINDOW); } } - /* Screen & Render. */ + /* Screen & Render */ else if (STRPREFIX(opname, "SCREEN_OT") || STRPREFIX(opname, "RENDER_OT") || STRPREFIX(opname, "SOUND_OT") || STRPREFIX(opname, "SCENE_OT")) { km = WM_keymap_find_all(wm, "Screen", SPACE_EMPTY, RGN_TYPE_WINDOW); } - /* Grease Pencil. */ + /* Grease Pencil */ else if (STRPREFIX(opname, "GPENCIL_OT")) { km = WM_keymap_find_all(wm, "Grease Pencil", SPACE_EMPTY, RGN_TYPE_WINDOW); } else if (STRPREFIX(opname, "GREASE_PENCIL_OT")) { km = WM_keymap_find_all(wm, "Grease Pencil", SPACE_EMPTY, RGN_TYPE_WINDOW); } - /* Markers. */ + /* Markers */ else if (STRPREFIX(opname, "MARKER_OT")) { km = WM_keymap_find_all(wm, "Markers", SPACE_EMPTY, RGN_TYPE_WINDOW); } - /* Import/Export. */ + /* Import/Export */ else if (STRPREFIX(opname, "IMPORT_") || STRPREFIX(opname, "EXPORT_")) { km = WM_keymap_find_all(wm, "Window", SPACE_EMPTY, RGN_TYPE_WINDOW); } - /* 3D View. */ + /* 3D View */ else if (STRPREFIX(opname, "VIEW3D_OT")) { km = WM_keymap_find_all(wm, "3D View", sl->spacetype, RGN_TYPE_WINDOW); } else if (STRPREFIX(opname, "OBJECT_OT")) { - /* Exception, this needs to work outside object mode too. */ + /* exception, this needs to work outside object mode too */ if (STRPREFIX(opname, "OBJECT_OT_mode_set")) { km = WM_keymap_find_all(wm, "Object Non-modal", SPACE_EMPTY, RGN_TYPE_WINDOW); } @@ -264,18 +264,18 @@ wmKeyMap *WM_keymap_guess_opname(const bContext *C, const char *opname) km = WM_keymap_find_all(wm, "Object Mode", SPACE_EMPTY, RGN_TYPE_WINDOW); } } - /* Object mode related. */ + /* Object mode related */ else if (STRPREFIX(opname, "GROUP_OT") || STRPREFIX(opname, "MATERIAL_OT") || STRPREFIX(opname, "PTCACHE_OT") || STRPREFIX(opname, "RIGIDBODY_OT")) { km = WM_keymap_find_all(wm, "Object Mode", SPACE_EMPTY, RGN_TYPE_WINDOW); } - /* Editing Modes. */ + /* Editing Modes */ else if (STRPREFIX(opname, "MESH_OT")) { km = WM_keymap_find_all(wm, "Mesh", SPACE_EMPTY, RGN_TYPE_WINDOW); - /* Some mesh operators are active in object mode too, like add-prim. */ + /* some mesh operators are active in object mode too, like add-prim */ if (km && !WM_keymap_poll((bContext *)C, km)) { km = WM_keymap_find_all(wm, "Object Mode", SPACE_EMPTY, RGN_TYPE_WINDOW); } @@ -283,7 +283,7 @@ wmKeyMap *WM_keymap_guess_opname(const bContext *C, const char *opname) else if (STRPREFIX(opname, "CURVE_OT") || STRPREFIX(opname, "SURFACE_OT")) { km = WM_keymap_find_all(wm, "Curve", SPACE_EMPTY, RGN_TYPE_WINDOW); - /* Some curve operators are active in object mode too, like add-prim. */ + /* some curve operators are active in object mode too, like add-prim */ if (km && !WM_keymap_poll((bContext *)C, km)) { km = WM_keymap_find_all(wm, "Object Mode", SPACE_EMPTY, RGN_TYPE_WINDOW); } @@ -326,13 +326,13 @@ wmKeyMap *WM_keymap_guess_opname(const bContext *C, const char *opname) else if (STRPREFIX(opname, "FONT_OT")) { km = WM_keymap_find_all(wm, "Font", SPACE_EMPTY, RGN_TYPE_WINDOW); } - /* Paint Face Mask. */ + /* Paint Face Mask */ else if (STRPREFIX(opname, "PAINT_OT_face_select")) { km = WM_keymap_find_all( wm, "Paint Face Mask (Weight, Vertex, Texture)", SPACE_EMPTY, RGN_TYPE_WINDOW); } else if (STRPREFIX(opname, "PAINT_OT")) { - /* Check for relevant mode. */ + /* check for relevant mode */ switch (CTX_data_mode_enum(C)) { case CTX_MODE_PAINT_WEIGHT: km = WM_keymap_find_all(wm, "Weight Paint", SPACE_EMPTY, RGN_TYPE_WINDOW); @@ -346,9 +346,6 @@ wmKeyMap *WM_keymap_guess_opname(const bContext *C, const char *opname) case CTX_MODE_SCULPT: km = WM_keymap_find_all(wm, "Sculpt", SPACE_EMPTY, RGN_TYPE_WINDOW); break; - case CTX_MODE_SCULPT_CURVES: - km = WM_keymap_find_all(wm, "Sculpt Curves", SPACE_EMPTY, RGN_TYPE_WINDOW); - break; default: break; } @@ -357,18 +354,18 @@ wmKeyMap *WM_keymap_guess_opname(const bContext *C, const char *opname) else if (STRPREFIX(opname, "VIEW2D_OT")) { km = WM_keymap_find_all(wm, "View2D", SPACE_EMPTY, RGN_TYPE_WINDOW); } - /* Image Editor. */ + /* Image Editor */ else if (STRPREFIX(opname, "IMAGE_OT")) { km = WM_keymap_find_all(wm, "Image", sl->spacetype, RGN_TYPE_WINDOW); } - /* Clip Editor. */ + /* Clip Editor */ else if (STRPREFIX(opname, "CLIP_OT")) { km = WM_keymap_find_all(wm, "Clip", sl->spacetype, RGN_TYPE_WINDOW); } else if (STRPREFIX(opname, "MASK_OT")) { km = WM_keymap_find_all(wm, "Mask Editing", SPACE_EMPTY, RGN_TYPE_WINDOW); } - /* UV Editor. */ + /* UV Editor */ else if (STRPREFIX(opname, "UV_OT")) { /* Hack to allow using UV unwrapping ops from 3DView/editmode. * Mesh keymap is probably not ideal, but best place I could find to put those. */ @@ -382,15 +379,15 @@ wmKeyMap *WM_keymap_guess_opname(const bContext *C, const char *opname) km = WM_keymap_find_all(wm, "UV Editor", SPACE_EMPTY, RGN_TYPE_WINDOW); } } - /* Node Editor. */ + /* Node Editor */ else if (STRPREFIX(opname, "NODE_OT")) { km = WM_keymap_find_all(wm, "Node Editor", sl->spacetype, RGN_TYPE_WINDOW); } - /* Animation Editor Channels. */ + /* Animation Editor Channels */ else if (STRPREFIX(opname, "ANIM_OT_channels")) { km = WM_keymap_find_all(wm, "Animation Channels", SPACE_EMPTY, RGN_TYPE_WINDOW); } - /* Animation Generic - after channels. */ + /* Animation Generic - after channels */ else if (STRPREFIX(opname, "ANIM_OT")) { if (sl->spacetype == SPACE_VIEW3D) { switch (CTX_data_mode_enum(C)) { @@ -412,53 +409,53 @@ wmKeyMap *WM_keymap_guess_opname(const bContext *C, const char *opname) km = WM_keymap_find_all(wm, "Animation", SPACE_EMPTY, RGN_TYPE_WINDOW); } } - /* Graph Editor. */ + /* Graph Editor */ else if (STRPREFIX(opname, "GRAPH_OT")) { km = WM_keymap_find_all(wm, "Graph Editor", sl->spacetype, RGN_TYPE_WINDOW); } - /* Dopesheet Editor. */ + /* Dopesheet Editor */ else if (STRPREFIX(opname, "ACTION_OT")) { km = WM_keymap_find_all(wm, "Dopesheet", sl->spacetype, RGN_TYPE_WINDOW); } - /* NLA Editor. */ + /* NLA Editor */ else if (STRPREFIX(opname, "NLA_OT")) { km = WM_keymap_find_all(wm, "NLA Editor", sl->spacetype, RGN_TYPE_WINDOW); } - /* Script. */ + /* Script */ else if (STRPREFIX(opname, "SCRIPT_OT")) { km = WM_keymap_find_all(wm, "Script", sl->spacetype, RGN_TYPE_WINDOW); } - /* Text. */ + /* Text */ else if (STRPREFIX(opname, "TEXT_OT")) { km = WM_keymap_find_all(wm, "Text", sl->spacetype, RGN_TYPE_WINDOW); } - /* Sequencer. */ + /* Sequencer */ else if (STRPREFIX(opname, "SEQUENCER_OT")) { km = WM_keymap_find_all(wm, "Sequencer", sl->spacetype, RGN_TYPE_WINDOW); } - /* Console. */ + /* Console */ else if (STRPREFIX(opname, "CONSOLE_OT")) { km = WM_keymap_find_all(wm, "Console", sl->spacetype, RGN_TYPE_WINDOW); } - /* Console. */ + /* Console */ else if (STRPREFIX(opname, "INFO_OT")) { km = WM_keymap_find_all(wm, "Info", sl->spacetype, RGN_TYPE_WINDOW); } - /* File browser. */ + /* File browser */ else if (STRPREFIX(opname, "FILE_OT")) { km = WM_keymap_find_all(wm, "File Browser", sl->spacetype, RGN_TYPE_WINDOW); } - /* Logic Editor. */ + /* Logic Editor */ else if (STRPREFIX(opname, "LOGIC_OT")) { km = WM_keymap_find_all(wm, "Logic Editor", sl->spacetype, RGN_TYPE_WINDOW); } - /* Outliner. */ + /* Outliner */ else if (STRPREFIX(opname, "OUTLINER_OT")) { km = WM_keymap_find_all(wm, "Outliner", sl->spacetype, RGN_TYPE_WINDOW); } - /* Transform. */ + /* Transform */ else if (STRPREFIX(opname, "TRANSFORM_OT")) { - /* Check for relevant editor. */ + /* check for relevant editor */ switch (sl->spacetype) { case SPACE_VIEW3D: km = WM_keymap_find_all(wm, "3D View", sl->spacetype, RGN_TYPE_WINDOW); @@ -483,11 +480,11 @@ wmKeyMap *WM_keymap_guess_opname(const bContext *C, const char *opname) break; } } - /* User Interface. */ + /* User Interface */ else if (STRPREFIX(opname, "UI_OT")) { km = WM_keymap_find_all(wm, "User Interface", SPACE_EMPTY, RGN_TYPE_WINDOW); } - /* Geometry. */ + /* Geometry */ else if (STRPREFIX(opname, "GEOMETRY_OT")) { switch (sl->spacetype) { case SPACE_VIEW3D: diff --git a/source/blender/windowmanager/intern/wm_menu_type.cc b/source/blender/windowmanager/intern/wm_menu_type.cc index ef2cd1b087f..970757cb6c6 100644 --- a/source/blender/windowmanager/intern/wm_menu_type.cc +++ b/source/blender/windowmanager/intern/wm_menu_type.cc @@ -13,6 +13,7 @@ #include "BLI_sys_types.h" #include "DNA_windowmanager_types.h" +#include "DNA_workspace_types.h" #include "MEM_guardedalloc.h" @@ -66,7 +67,7 @@ void WM_menutype_freelink(MenuType *mt) void WM_menutype_init() { - /* Reserve size is set based on blender default setup. */ + /* reserve size is set based on blender default setup */ menutypes_hash = BLI_ghash_str_new_ex("menutypes_hash gh", 512); } @@ -101,20 +102,20 @@ bool WM_menutype_poll(bContext *C, MenuType *mt) return true; } -void WM_menutype_idname_visit_for_search( - const bContext * /*C*/, - PointerRNA * /*ptr*/, - PropertyRNA * /*prop*/, - const char * /*edit_text*/, - blender::FunctionRef visit_fn) +void WM_menutype_idname_visit_for_search(const bContext * /*C*/, + PointerRNA * /*ptr*/, + PropertyRNA * /*prop*/, + const char * /*edit_text*/, + StringPropertySearchVisitFunc visit_fn, + void *visit_user_data) { GHashIterator gh_iter; GHASH_ITER (gh_iter, menutypes_hash) { MenuType *mt = static_cast(BLI_ghashIterator_getValue(&gh_iter)); - StringPropertySearchVisitParams visit_params{}; + StringPropertySearchVisitParams visit_params = {nullptr}; visit_params.text = mt->idname; visit_params.info = mt->label; - visit_fn(visit_params); + visit_fn(visit_user_data, &visit_params); } } diff --git a/source/blender/windowmanager/intern/wm_operator_props.cc b/source/blender/windowmanager/intern/wm_operator_props.cc index 5178dc12494..fad16982f65 100644 --- a/source/blender/windowmanager/intern/wm_operator_props.cc +++ b/source/blender/windowmanager/intern/wm_operator_props.cc @@ -80,12 +80,12 @@ void WM_operator_properties_filesel(wmOperatorType *ot, "Automatically determine display type for files"}, {FILE_VERTICALDISPLAY, "LIST_VERTICAL", - ICON_SHORTDISPLAY, /* Name of deprecated short list. */ + ICON_SHORTDISPLAY, /* Name of deprecated short list */ "Short List", "Display files as short list"}, {FILE_HORIZONTALDISPLAY, "LIST_HORIZONTAL", - ICON_LONGDISPLAY, /* Name of deprecated long list. */ + ICON_LONGDISPLAY, /* Name of deprecated long list */ "Long List", "Display files as a detailed list"}, {FILE_IMGDISPLAY, "THUMBNAIL", ICON_IMGDISPLAY, "Thumbnails", "Display files as thumbnails"}, diff --git a/source/blender/windowmanager/intern/wm_operator_type.cc b/source/blender/windowmanager/intern/wm_operator_type.cc index df8f41181bf..7eb647d0a92 100644 --- a/source/blender/windowmanager/intern/wm_operator_type.cc +++ b/source/blender/windowmanager/intern/wm_operator_type.cc @@ -18,7 +18,7 @@ #include "DNA_userdef_types.h" #include "DNA_windowmanager_types.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BLI_blenlib.h" #include "BLI_ghash.h" @@ -55,7 +55,7 @@ wmOperatorType *WM_operatortype_find(const char *idname, bool quiet) if (idname[0]) { wmOperatorType *ot; - /* Needed to support python style names without the `_OT_` syntax. */ + /* needed to support python style names without the _OT_ syntax */ char idname_bl[OP_MAX_TYPENAME]; WM_operator_bl_idname(idname_bl, idname); @@ -175,7 +175,7 @@ bool WM_operatortype_remove(const char *idname) void wm_operatortype_init() { - /* Reserve size is set based on blender default setup. */ + /* reserve size is set based on blender default setup */ global_ops_hash = BLI_ghash_str_new_ex("wm_operatortype_init gh", 2048); } @@ -249,12 +249,12 @@ void WM_operatortype_last_properties_clear_all() } } -void WM_operatortype_idname_visit_for_search( - const bContext * /*C*/, - PointerRNA * /*ptr*/, - PropertyRNA * /*prop*/, - const char * /*edit_text*/, - blender::FunctionRef visit_fn) +void WM_operatortype_idname_visit_for_search(const bContext * /*C*/, + PointerRNA * /*ptr*/, + PropertyRNA * /*prop*/, + const char * /*edit_text*/, + StringPropertySearchVisitFunc visit_fn, + void *visit_user_data) { GHashIterator gh_iter; GHASH_ITER (gh_iter, global_ops_hash) { @@ -263,10 +263,10 @@ void WM_operatortype_idname_visit_for_search( char idname_py[OP_MAX_TYPENAME]; WM_operator_py_idname(idname_py, ot->idname); - StringPropertySearchVisitParams visit_params{}; + StringPropertySearchVisitParams visit_params = {nullptr}; visit_params.text = idname_py; visit_params.info = ot->name; - visit_fn(visit_params); + visit_fn(visit_user_data, &visit_params); } } @@ -298,7 +298,7 @@ static int wm_macro_end(wmOperator *op, int retval) } } - /* If modal is ending, free custom data. */ + /* if modal is ending, free custom data */ if (retval & (OPERATOR_FINISHED | OPERATOR_CANCELLED)) { if (op->customdata) { MEM_freeN(op->customdata); @@ -309,7 +309,7 @@ static int wm_macro_end(wmOperator *op, int retval) return retval; } -/* Macro exec only runs exec calls. */ +/* macro exec only runs exec calls */ static int wm_macro_exec(bContext *C, wmOperator *op) { int retval = OPERATOR_FINISHED; @@ -328,10 +328,10 @@ static int wm_macro_exec(bContext *C, wmOperator *op) if (retval & OPERATOR_FINISHED) { MacroData *md = static_cast(op->customdata); - md->retval = OPERATOR_FINISHED; /* Keep in mind that at least one operator finished. */ + md->retval = OPERATOR_FINISHED; /* keep in mind that at least one operator finished */ } else { - break; /* Operator didn't finish, end macro. */ + break; /* operator didn't finish, end macro */ } } else { @@ -350,7 +350,7 @@ static int wm_macro_invoke_internal(bContext *C, int retval = OPERATOR_FINISHED; const int op_inherited_flag = op->flag & (OP_IS_REPEAT | OP_IS_REPEAT_LAST); - /* Start from operator received as argument. */ + /* start from operator received as argument */ for (; opm; opm = opm->next) { opm->flag |= op_inherited_flag; @@ -368,10 +368,10 @@ static int wm_macro_invoke_internal(bContext *C, if (retval & OPERATOR_FINISHED) { MacroData *md = static_cast(op->customdata); - md->retval = OPERATOR_FINISHED; /* Keep in mind that at least one operator finished. */ + md->retval = OPERATOR_FINISHED; /* keep in mind that at least one operator finished */ } else { - break; /* Operator didn't finish, end macro. */ + break; /* operator didn't finish, end macro */ } } @@ -396,20 +396,20 @@ static int wm_macro_modal(bContext *C, wmOperator *op, const wmEvent *event) retval = opm->type->modal(C, opm, event); OPERATOR_RETVAL_CHECK(retval); - /* If we're halfway through using a tool and cancel it, clear the options, see: #37149. */ + /* if we're halfway through using a tool and cancel it, clear the options #37149. */ if (retval & OPERATOR_CANCELLED) { WM_operator_properties_clear(opm->ptr); } - /* If this one is done but it's not the last operator in the macro. */ + /* if this one is done but it's not the last operator in the macro */ if ((retval & OPERATOR_FINISHED) && opm->next) { MacroData *md = static_cast(op->customdata); - md->retval = OPERATOR_FINISHED; /* Keep in mind that at least one operator finished. */ + md->retval = OPERATOR_FINISHED; /* keep in mind that at least one operator finished */ retval = wm_macro_invoke_internal(C, op, event, opm->next); - /* If new operator is modal and also added its own handler. */ + /* if new operator is modal and also added its own handler */ if (retval & OPERATOR_RUNNING_MODAL && op->opm != opm) { wmWindow *win = CTX_wm_window(C); wmEventHandler_Op *handler; @@ -457,7 +457,7 @@ static int wm_macro_modal(bContext *C, wmOperator *op, const wmEvent *event) static void wm_macro_cancel(bContext *C, wmOperator *op) { - /* Call cancel on the current modal operator, if any. */ + /* call cancel on the current modal operator, if any */ if (op->opm && op->opm->type->cancel) { op->opm->type->cancel(C, op->opm); } @@ -509,8 +509,7 @@ wmOperatorType *WM_operatortype_append_macro(const char *idname, return ot; } -void WM_operatortype_append_macro_ptr(void (*opfunc)(wmOperatorType *ot, void *userdata), - void *userdata) +void WM_operatortype_append_macro_ptr(void (*opfunc)(wmOperatorType *, void *), void *userdata) { wmOperatorType *ot; @@ -546,14 +545,14 @@ wmOperatorTypeMacro *WM_operatortype_macro_define(wmOperatorType *ot, const char STRNCPY(otmacro->idname, idname); - /* Do this on first use, since operator definitions might have been not done yet. */ + /* do this on first use, since operatordefinitions might have been not done yet */ WM_operator_properties_alloc(&(otmacro->ptr), &(otmacro->properties), idname); WM_operator_properties_sanitize(otmacro->ptr, true); BLI_addtail(&ot->macro, otmacro); { - /* Operator should always be found but in the event its not. don't segfault. */ + /* operator should always be found but in the event its not. don't segfault */ wmOperatorType *otsub = WM_operatortype_find(idname, false); if (otsub) { RNA_def_pointer_runtime( @@ -615,15 +614,4 @@ std::string WM_operatortype_description_or_name(bContext *C, return text; } -bool WM_operator_depends_on_cursor(bContext &C, wmOperatorType &ot, PointerRNA *properties) -{ - if (ot.flag & OPTYPE_DEPENDS_ON_CURSOR) { - return true; - } - if (ot.depends_on_cursor) { - return ot.depends_on_cursor(C, ot, properties); - } - return false; -} - /** \} */ diff --git a/source/blender/windowmanager/intern/wm_operator_utils.cc b/source/blender/windowmanager/intern/wm_operator_utils.cc index c8b783df7cd..7ea11470c43 100644 --- a/source/blender/windowmanager/intern/wm_operator_utils.cc +++ b/source/blender/windowmanager/intern/wm_operator_utils.cc @@ -15,7 +15,7 @@ #include "BLI_utildefines.h" #include "BKE_context.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_layer.hh" #include "RNA_access.hh" @@ -138,7 +138,7 @@ static bool interactive_value_update(ValueInteraction *inter, const bool changed = value_final != inter->prev.prop_value; if (changed) { - /* Set the property for the operator and call its modal function. */ + /* set the property for the operator and call its modal function */ char str[64]; SNPRINTF(str, "%.4f", value_final); ED_area_status_text(inter->context_vars.area, str); diff --git a/source/blender/windowmanager/intern/wm_operators.cc b/source/blender/windowmanager/intern/wm_operators.cc index 9d8cfacf1d5..b4170f1419b 100644 --- a/source/blender/windowmanager/intern/wm_operators.cc +++ b/source/blender/windowmanager/intern/wm_operators.cc @@ -38,7 +38,7 @@ #include "DNA_userdef_types.h" #include "DNA_windowmanager_types.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BLI_blenlib.h" #include "BLI_dial_2d.h" @@ -48,11 +48,11 @@ #include "BLI_time.h" #include "BLI_utildefines.h" -#include "BKE_anim_data.hh" +#include "BKE_anim_data.h" #include "BKE_brush.hh" #include "BKE_colortools.hh" #include "BKE_context.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_idprop.h" #include "BKE_image.h" #include "BKE_image_format.h" @@ -61,9 +61,9 @@ #include "BKE_main.hh" #include "BKE_material.h" #include "BKE_preview_image.hh" -#include "BKE_report.hh" -#include "BKE_scene.hh" -#include "BKE_screen.hh" /* #BKE_ST_MAXNAME. */ +#include "BKE_report.h" +#include "BKE_scene.h" +#include "BKE_screen.hh" /* BKE_ST_MAXNAME */ #include "BKE_unit.hh" #include "BKE_idtype.hh" @@ -174,7 +174,7 @@ bool WM_operator_py_idname_ok_or_report(ReportList *reports, int i; for (i = 0; *ch; i++, ch++) { if ((*ch >= 'a' && *ch <= 'z') || (*ch >= '0' && *ch <= '9') || *ch == '_') { - /* Pass. */ + /* pass */ } else if (*ch == '.') { dot++; @@ -222,10 +222,10 @@ std::string WM_operator_pystring_ex(bContext *C, { char idname_py[OP_MAX_TYPENAME]; - /* For building the string. */ + /* for building the string */ std::stringstream ss; - /* Arbitrary, but can get huge string with stroke painting otherwise. */ + /* arbitrary, but can get huge string with stroke painting otherwise */ int max_prop_length = 10; WM_operator_py_idname(idname_py, ot->idname); @@ -261,7 +261,7 @@ std::string WM_operator_pystring_ex(bContext *C, } } else { - /* Only to get the original props for comparisons. */ + /* only to get the original props for comparisons */ PointerRNA opptr_default; const bool macro_args_test = ot->macro.first ? macro_args : true; @@ -327,14 +327,14 @@ std::string WM_operator_pystring_abbreviate(std::string str, int str_len_max) return str.substr(0, comma_first) + end_str; } -/* Return nullptr if no match is found. */ +/* return nullptr if no match is found */ #if 0 static const char *wm_context_member_from_ptr(bContext *C, const PointerRNA *ptr, bool *r_is_id) { - /* Loop over all context items and do 2 checks + /* loop over all context items and do 2 checks * - * - See if the pointer is in the context. - * - See if the pointers ID is in the context. + * - see if the pointer is in the context. + * - see if the pointers ID is in the context. */ /* Don't get from the context store since this is normally @@ -358,7 +358,7 @@ static const char *wm_context_member_from_ptr(bContext *C, const PointerRNA *ptr if (ptr->owner_id == ctx_item_ptr.owner_id) { const bool is_id = RNA_struct_is_ID(ctx_item_ptr.type); if ((ptr->data == ctx_item_ptr.data) && (ptr->type == ctx_item_ptr.type)) { - /* Found! */ + /* found! */ member_found = identifier; member_found_is_id = is_id; break; @@ -386,7 +386,7 @@ static const char *wm_context_member_from_ptr(bContext *C, const PointerRNA *ptr #else -/* Use hard coded checks for now. */ +/* use hard coded checks for now */ /** * \param: r_is_id: @@ -488,7 +488,7 @@ static const char *wm_context_member_from_ptr(const bContext *C, CTX_TEST_PTR_ID(C, "object", ptr->owner_id); break; } - /* From #rna_Main_objects_new. */ + /* from rna_Main_objects_new */ case OB_DATA_SUPPORT_ID_CASE: { if (ptr_id_type == ID_AR) { @@ -737,7 +737,7 @@ void WM_operator_properties_sanitize(PointerRNA *ptr, const bool no_context) case PROP_POINTER: { StructRNA *ptype = RNA_property_pointer_type(ptr, prop); - /* Recurse into operator properties. */ + /* recurse into operator properties */ if (RNA_struct_is_a(ptype, &RNA_OperatorProperties)) { PointerRNA opptr = RNA_property_pointer_get(ptr, prop); WM_operator_properties_sanitize(&opptr, no_context); @@ -810,7 +810,7 @@ void WM_operator_properties_free(PointerRNA *ptr) if (properties) { IDP_FreeProperty(properties); - ptr->data = nullptr; /* Just in case. */ + ptr->data = nullptr; /* just in case */ } } @@ -820,7 +820,7 @@ void WM_operator_properties_free(PointerRNA *ptr) /** \name Operator Last Properties API * \{ */ -#if 1 /* May want to disable operator remembering previous state for testing. */ +#if 1 /* may want to disable operator remembering previous state for testing */ static bool operator_last_properties_init_impl(wmOperator *op, IDProperty *last_properties) { @@ -833,18 +833,18 @@ static bool operator_last_properties_init_impl(wmOperator *op, IDProperty *last_ RNA_PROP_BEGIN (op->ptr, itemptr, iterprop) { PropertyRNA *prop = static_cast(itemptr.data); if ((RNA_property_flag(prop) & PROP_SKIP_SAVE) == 0) { - if (!RNA_property_is_set(op->ptr, prop)) { /* Don't override a setting already set. */ + if (!RNA_property_is_set(op->ptr, prop)) { /* don't override a setting already set */ const char *identifier = RNA_property_identifier(prop); IDProperty *idp_src = IDP_GetPropertyFromGroup(last_properties, identifier); if (idp_src) { IDProperty *idp_dst = IDP_CopyProperty(idp_src); /* NOTE: in the future this may need to be done recursively, - * but for now RNA doesn't access nested operators. */ + * but for now RNA doesn't access nested operators */ idp_dst->flag |= IDP_FLAG_GHOST; - /* Add to temporary group instead of immediate replace, - * because we are iterating over this group. */ + /* add to temporary group instead of immediate replace, + * because we are iterating over this group */ IDP_AddToGroup(replaceprops, idp_dst); changed = true; } @@ -934,7 +934,7 @@ int WM_generic_select_modal(bContext *C, wmOperator *op, const wmEvent *event) const short init_event_type = short(POINTER_AS_INT(op->customdata)); int ret_value = 0; - /* Get settings from RNA properties for operator. */ + /* get settings from RNA properties for operator */ const int mval[2] = {RNA_int_get(op->ptr, "mouse_x"), RNA_int_get(op->ptr, "mouse_y")}; if (init_event_type == 0) { @@ -1010,15 +1010,15 @@ void WM_operator_view3d_unit_defaults(bContext *C, wmOperator *op) const float dia = v3d ? ED_view3d_grid_scale(scene, v3d, nullptr) : ED_scene_grid_scale(scene, nullptr); - /* Always run, so the values are initialized, - * otherwise we may get differ behavior when `dia != 1.0`. */ + /* always run, so the values are initialized, + * otherwise we may get differ behavior when (dia != 1.0) */ RNA_STRUCT_BEGIN (op->ptr, prop) { if (RNA_property_type(prop) == PROP_FLOAT) { PropertySubType pstype = RNA_property_subtype(prop); if (pstype == PROP_DISTANCE) { - /* We don't support arrays yet. */ + /* we don't support arrays yet */ BLI_assert(RNA_property_array_check(prop) == false); - /* Initialize. */ + /* initialize */ if (!RNA_property_is_set_ex(op->ptr, prop, false)) { const float value = RNA_property_float_get_default(op->ptr, prop) * dia; RNA_property_float_set(op->ptr, prop, value); @@ -1057,7 +1057,7 @@ int WM_menu_invoke_ex(bContext *C, wmOperator *op, wmOperatorCallContext opconte uiPopupMenu *pup = UI_popup_menu_begin( C, WM_operatortype_name(op->type, op->ptr).c_str(), ICON_NONE); uiLayout *layout = UI_popup_menu_layout(pup); - /* Set this so the default execution context is the same as submenus. */ + /* set this so the default execution context is the same as submenus */ uiLayoutSetOperatorContext(layout, opcontext); uiItemsFullEnumO(layout, op->type->idname, @@ -1078,7 +1078,10 @@ int WM_menu_invoke(bContext *C, wmOperator *op, const wmEvent * /*event*/) } struct EnumSearchMenu { - wmOperator *op; /* The operator that will be executed when selecting an item. */ + wmOperator *op; /* the operator that will be executed when selecting an item */ + + bool use_previews; + short prv_cols, prv_rows; }; /** Generic enum search invoke popup. */ @@ -1087,10 +1090,12 @@ static uiBlock *wm_enum_search_menu(bContext *C, ARegion *region, void *arg) EnumSearchMenu *search_menu = static_cast(arg); wmWindow *win = CTX_wm_window(C); wmOperator *op = search_menu->op; - /* `template_ID` uses `4 * widget_unit` for width, + /* template_ID uses 4 * widget_unit for width, * we use a bit more, some items may have a suffix to show. */ - const int width = UI_searchbox_size_x(); - const int height = UI_searchbox_size_y(); + const int width = search_menu->use_previews ? 5 * U.widget_unit * search_menu->prv_cols : + UI_searchbox_size_x(); + const int height = search_menu->use_previews ? 5 * U.widget_unit * search_menu->prv_rows : + UI_searchbox_size_y(); static char search[256] = ""; uiBlock *block = UI_block_begin(C, region, "_popup", UI_EMBOSS); @@ -1098,7 +1103,9 @@ static uiBlock *wm_enum_search_menu(bContext *C, ARegion *region, void *arg) UI_block_theme_style_set(block, UI_BLOCK_THEME_STYLE_POPUP); search[0] = '\0'; -#if 0 /* Ok, this isn't so easy. */ + BLI_assert(search_menu->use_previews || + (search_menu->prv_cols == 0 && search_menu->prv_rows == 0)); +#if 0 /* ok, this isn't so easy... */ uiDefBut(block, UI_BTYPE_LABEL, 0, @@ -1110,6 +1117,8 @@ static uiBlock *wm_enum_search_menu(bContext *C, ARegion *region, void *arg) nullptr, 0.0, 0.0, + 0, + 0, ""); #endif uiBut *but = uiDefSearchButO_ptr(block, @@ -1123,9 +1132,11 @@ static uiBlock *wm_enum_search_menu(bContext *C, ARegion *region, void *arg) 10, width, UI_UNIT_Y, + search_menu->prv_rows, + search_menu->prv_cols, ""); - /* Fake button, it holds space for search items. */ + /* fake button, it holds space for search items */ uiDefBut(block, UI_BTYPE_LABEL, 0, @@ -1137,6 +1148,8 @@ static uiBlock *wm_enum_search_menu(bContext *C, ARegion *region, void *arg) nullptr, 0, 0, + 0, + 0, nullptr); /* Move it downwards, mouse over button. */ @@ -1147,6 +1160,20 @@ static uiBlock *wm_enum_search_menu(bContext *C, ARegion *region, void *arg) return block; } +int WM_enum_search_invoke_previews(bContext *C, wmOperator *op, short prv_cols, short prv_rows) +{ + static EnumSearchMenu search_menu; + + search_menu.op = op; + search_menu.use_previews = true; + search_menu.prv_cols = prv_cols; + search_menu.prv_rows = prv_rows; + + UI_popup_block_invoke(C, wm_enum_search_menu, &search_menu, nullptr); + + return OPERATOR_INTERFACE; +} + int WM_enum_search_invoke(bContext *C, wmOperator *op, const wmEvent * /*event*/) { static EnumSearchMenu search_menu; @@ -1160,47 +1187,42 @@ int WM_operator_confirm_message_ex(bContext *C, const char *title, const int icon, const char *message, - const wmOperatorCallContext /*opcontext*/) + const wmOperatorCallContext opcontext) { - int alert_icon = ALERT_ICON_QUESTION; - switch (icon) { - case ICON_NONE: - alert_icon = ALERT_ICON_NONE; - break; - case ICON_ERROR: - alert_icon = ALERT_ICON_WARNING; - break; - case ICON_QUESTION: - alert_icon = ALERT_ICON_QUESTION; - break; - case ICON_CANCEL: - alert_icon = ALERT_ICON_ERROR; - break; - case ICON_INFO: - alert_icon = ALERT_ICON_INFO; - break; + IDProperty *properties = static_cast(op->ptr->data); + + if (properties && properties->len) { + properties = IDP_CopyProperty(static_cast(op->ptr->data)); } - return WM_operator_confirm_ex(C, op, IFACE_(title), nullptr, IFACE_(message), alert_icon, false); + else { + properties = nullptr; + } + + uiPopupMenu *pup = UI_popup_menu_begin(C, title, icon); + uiLayout *layout = UI_popup_menu_layout(pup); + uiItemFullO_ptr( + layout, op->type, message, ICON_NONE, properties, opcontext, UI_ITEM_O_DEPRESS, nullptr); + UI_popup_menu_end(C, pup); + + return OPERATOR_INTERFACE; } int WM_operator_confirm_message(bContext *C, wmOperator *op, const char *message) { - return WM_operator_confirm_ex( - C, op, IFACE_(message), nullptr, IFACE_("OK"), ALERT_ICON_NONE, false); + return WM_operator_confirm_message_ex( + C, op, IFACE_("OK?"), ICON_QUESTION, message, WM_OP_EXEC_REGION_WIN); } int WM_operator_confirm(bContext *C, wmOperator *op, const wmEvent * /*event*/) { - return WM_operator_confirm_ex( - C, op, IFACE_(op->type->name), nullptr, IFACE_("OK"), ALERT_ICON_NONE, false); + return WM_operator_confirm_message(C, op, nullptr); } int WM_operator_confirm_or_exec(bContext *C, wmOperator *op, const wmEvent * /*event*/) { const bool confirm = RNA_boolean_get(op->ptr, "confirm"); if (confirm) { - return WM_operator_confirm_ex( - C, op, IFACE_(op->type->name), nullptr, IFACE_("OK"), ALERT_ICON_NONE, false); + return WM_operator_confirm_message(C, op, nullptr); } return op->type->exec(C, op); } @@ -1208,7 +1230,7 @@ int WM_operator_confirm_or_exec(bContext *C, wmOperator *op, const wmEvent * /*e int WM_operator_filesel(bContext *C, wmOperator *op, const wmEvent * /*event*/) { if (RNA_struct_property_is_set(op->ptr, "filepath")) { - return WM_operator_call_notest(C, op); /* Call exec direct. */ + return WM_operator_call_notest(C, op); /* call exec direct */ } WM_event_add_fileselect(C, op); return OPERATOR_RUNNING_MODAL; @@ -1249,7 +1271,7 @@ wmOperator *WM_operator_last_redo(const bContext *C) { wmWindowManager *wm = CTX_wm_manager(C); - /* Only for operators that are registered and did an undo push. */ + /* only for operators that are registered and did an undo push */ LISTBASE_FOREACH_BACKWARD (wmOperator *, op, &wm->operators) { if ((op->type->flag & OPTYPE_REGISTER) && (op->type->flag & OPTYPE_UNDO)) { return op; @@ -1279,7 +1301,7 @@ ID *WM_operator_drop_load_path(bContext *C, wmOperator *op, const short idcode) Main *bmain = CTX_data_main(C); ID *id = nullptr; - /* Check input variables. */ + /* check input variables */ if (RNA_struct_property_is_set(op->ptr, "filepath")) { const bool is_relative_path = RNA_boolean_get(op->ptr, "relative_path"); char filepath[FILE_MAX]; @@ -1351,11 +1373,11 @@ static void wm_block_redo_cb(bContext *C, void *arg_op, int /*arg_event*/) wmOperator *op = static_cast(arg_op); if (op == WM_operator_last_redo(C)) { - /* Operator was already executed once? undo & repeat. */ + /* operator was already executed once? undo & repeat */ ED_undo_operator_repeat(C, op); } else { - /* Operator not executed yet, call it. */ + /* operator not executed yet, call it */ ED_undo_push_op(C, op); wm_operator_register(C, op); @@ -1367,7 +1389,7 @@ static void wm_block_redo_cancel_cb(bContext *C, void *arg_op) { wmOperator *op = static_cast(arg_op); - /* If operator never got executed, free it. */ + /* if operator never got executed, free it */ if (op != WM_operator_last_redo(C)) { WM_operator_free(op); } @@ -1383,11 +1405,11 @@ static uiBlock *wm_block_create_redo(bContext *C, ARegion *region, void *arg_op) UI_block_flag_disable(block, UI_BLOCK_LOOP); UI_block_theme_style_set(block, UI_BLOCK_THEME_STYLE_REGULAR); - /* #UI_BLOCK_NUMSELECT for layer buttons. */ + /* UI_BLOCK_NUMSELECT for layer buttons */ UI_block_flag_enable(block, UI_BLOCK_NUMSELECT | UI_BLOCK_KEEP_OPEN | UI_BLOCK_MOVEMOUSE_QUIT); - /* If register is not enabled, the operator gets freed on #OPERATOR_FINISHED - * ui_apply_but_funcs_after calls #ED_undo_operator_repeate_cb and crashes. */ + /* if register is not enabled, the operator gets freed on OPERATOR_FINISHED + * ui_apply_but_funcs_after calls ED_undo_operator_repeate_cb and crashes */ BLI_assert(op->type->flag & OPTYPE_REGISTER); UI_block_func_handle_set(block, wm_block_redo_cb, arg_op); @@ -1424,7 +1446,7 @@ struct wmOpPopUp { bool include_properties; }; -/* Only invoked by OK button in popups created with #wm_block_dialog_create(). */ +/* Only invoked by OK button in popups created with wm_block_dialog_create() */ static void dialog_exec_cb(bContext *C, void *arg1, void *arg2) { wmOperator *op; @@ -1452,7 +1474,7 @@ static void dialog_exec_cb(bContext *C, void *arg1, void *arg2) static void wm_operator_ui_popup_cancel(bContext *C, void *user_data); -/* Only invoked by Cancel button in popups created with #wm_block_dialog_create(). */ +/* Only invoked by Cancel button in popups created with wm_block_dialog_create() */ static void dialog_cancel_cb(bContext *C, void *arg1, void *arg2) { wm_operator_ui_popup_cancel(C, arg1); @@ -1462,9 +1484,7 @@ static void dialog_cancel_cb(bContext *C, void *arg1, void *arg2) UI_popup_block_close(C, win, block); } -/** - * Dialogs are popups that require user verification (click OK) before exec. - */ +/* Dialogs are popups that require user verification (click OK) before exec */ static uiBlock *wm_block_dialog_create(bContext *C, ARegion *region, void *user_data) { wmOpPopUp *data = static_cast(user_data); @@ -1524,11 +1544,6 @@ static uiBlock *wm_block_dialog_create(bContext *C, ARegion *region, void *user_ /* Title. */ if (!data->title.empty()) { uiItemL_ex(layout, data->title.c_str(), ICON_NONE, true, false); - - /* Line under the title if there are properties but no message body. */ - if (data->include_properties && message_lines.size() == 0) { - uiItemS_ex(layout, 0.2f, LayoutSeparatorType::Line); - }; } /* Message lines. */ @@ -1537,13 +1552,12 @@ static uiBlock *wm_block_dialog_create(bContext *C, ARegion *region, void *user_ } if (data->include_properties) { - uiItemS_ex(layout, 0.5f); uiTemplateOperatorPropertyButs(C, layout, op, UI_BUT_LABEL_ALIGN_SPLIT_COLUMN, 0); } - uiItemS_ex(layout, small ? 0.1f : 2.0f); + uiItemS_ex(layout, small ? 0.4f : 2.0f); - /* Clear so the OK button is left alone. */ + /* clear so the OK button is left alone */ UI_block_func_set(block, nullptr, nullptr, nullptr); #ifdef _WIN32 @@ -1552,7 +1566,7 @@ static uiBlock *wm_block_dialog_create(bContext *C, ARegion *region, void *user_ const bool windows_layout = false; #endif - /* New column so as not to interfere with custom layouts, see: #26436. */ + /* new column so as not to interfere with custom layouts #26436. */ { uiLayout *col = uiLayoutColumn(layout, false); uiBlock *col_block = uiLayoutGetBlock(col); @@ -1574,12 +1588,14 @@ static uiBlock *wm_block_dialog_create(bContext *C, ARegion *region, void *user_ nullptr, 0, 0, + 0, + 0, ""); uiLayoutColumn(col, false); } cancel_but = uiDefBut( - col_block, UI_BTYPE_BUT, 0, IFACE_("Cancel"), 0, 0, 0, UI_UNIT_Y, nullptr, 0, 0, ""); + col_block, UI_BTYPE_BUT, 0, IFACE_("Cancel"), 0, 0, 0, UI_UNIT_Y, nullptr, 0, 0, 0, 0, ""); if (!windows_layout) { uiLayoutColumn(col, false); @@ -1594,6 +1610,8 @@ static uiBlock *wm_block_dialog_create(bContext *C, ARegion *region, void *user_ nullptr, 0, 0, + 0, + 0, ""); } @@ -1605,8 +1623,8 @@ static uiBlock *wm_block_dialog_create(bContext *C, ARegion *region, void *user_ const int padding = (small ? 7 : 14) * UI_SCALE_FAC; if (data->position == WM_POPUP_POSITION_MOUSE) { - const float button_center_x = windows_layout ? -0.4f : -0.90f; - const float button_center_y = small ? 2.0f : 3.1f; + const float button_center_x = windows_layout ? -0.33f : -0.66f; + const float button_center_y = small ? 1.9f : 3.1f; const int bounds_offset[2] = {int(button_center_x * uiLayoutGetWidth(layout)), int(button_center_y * UI_UNIT_X)}; UI_block_bounds_set_popup(block, padding, bounds_offset); @@ -1632,7 +1650,7 @@ static uiBlock *wm_operator_ui_create(bContext *C, ARegion *region, void *user_d uiLayout *layout = UI_block_layout( block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, 0, 0, data->width, 0, 0, style); - /* Since UI is defined the auto-layout args are not used. */ + /* since ui is defined the auto-layout args are not used */ uiTemplateOperatorPropertyButs(C, layout, op, UI_BUT_LABEL_ALIGN_COLUMN, 0); UI_block_func_set(block, nullptr, nullptr, nullptr); @@ -1706,7 +1724,7 @@ int WM_operator_ui_popup(bContext *C, wmOperator *op, int width) wmOpPopUp *data = MEM_new(__func__); data->op = op; data->width = width * UI_SCALE_FAC; - data->free_op = true; /* If this runs and gets registered we may want not to free it. */ + data->free_op = true; /* if this runs and gets registered we may want not to free it */ UI_popup_block_ex(C, wm_operator_ui_create, nullptr, wm_operator_ui_popup_cancel, data, op); return OPERATOR_RUNNING_MODAL; } @@ -1739,8 +1757,8 @@ static int wm_operator_props_popup_ex(bContext *C, } } - /* If we don't have global undo, we can't do undo push for automatic redo, - * so we require manual OK clicking in this popup. */ + /* if we don't have global undo, we can't do undo push for automatic redo, + * so we require manual OK clicking in this popup */ if (!do_redo || !(U.uiflag & USER_GLOBALUNDO)) { return WM_operator_props_dialog_popup(C, op, 300); } @@ -1769,19 +1787,16 @@ int WM_operator_props_popup(bContext *C, wmOperator *op, const wmEvent * /*event return wm_operator_props_popup_ex(C, op, false, true); } -int WM_operator_props_dialog_popup(bContext *C, - wmOperator *op, - int width, - std::optional title, - std::optional confirm_text) +int WM_operator_props_dialog_popup( + bContext *C, wmOperator *op, int width, const char *title, const char *confirm_text) { wmOpPopUp *data = MEM_new(__func__); data->op = op; data->width = int(float(width) * UI_SCALE_FAC * UI_style_get()->widgetlabel.points / UI_DEFAULT_TEXT_POINTS); - data->free_op = true; /* If this runs and gets registered we may want not to free it. */ - data->title = title ? std::move(*title) : WM_operatortype_name(op->type, op->ptr); - data->confirm_text = confirm_text ? std::move(*confirm_text) : IFACE_("OK"); + data->free_op = true; /* if this runs and gets registered we may want not to free it */ + data->title = (title == nullptr) ? WM_operatortype_name(op->type, op->ptr) : title; + data->confirm_text = (confirm_text == nullptr) ? IFACE_("OK") : confirm_text; data->icon = ALERT_ICON_NONE; data->size = WM_POPUP_SIZE_SMALL; data->position = WM_POPUP_POSITION_MOUSE; @@ -1789,7 +1804,7 @@ int WM_operator_props_dialog_popup(bContext *C, data->mouse_move_quit = false; data->include_properties = true; - /* The operator is not executed until popup OK button is clicked. */ + /* op is not executed until popup OK but is clicked */ UI_popup_block_ex( C, wm_block_dialog_create, wm_operator_ui_popup_ok, wm_operator_ui_popup_cancel, data, op); @@ -1798,7 +1813,7 @@ int WM_operator_props_dialog_popup(bContext *C, int WM_operator_redo_popup(bContext *C, wmOperator *op) { - /* `CTX_wm_reports(C)` because operator is on stack, not active in event system. */ + /* CTX_wm_reports(C) because operator is on stack, not active in event system */ if ((op->type->flag & OPTYPE_REGISTER) == 0) { BKE_reportf(CTX_wm_reports(C), RPT_ERROR, @@ -1837,7 +1852,7 @@ static int wm_debug_menu_exec(bContext *C, wmOperator *op) static int wm_debug_menu_invoke(bContext *C, wmOperator *op, const wmEvent * /*event*/) { RNA_int_set(op->ptr, "debug_value", G.debug_value); - return WM_operator_props_dialog_popup(C, op, 250, IFACE_("Set Debug Value"), IFACE_("Set")); + return WM_operator_props_dialog_popup(C, op, 250); } static void WM_OT_debug_menu(wmOperatorType *ot) @@ -1850,8 +1865,7 @@ static void WM_OT_debug_menu(wmOperatorType *ot) ot->exec = wm_debug_menu_exec; ot->poll = WM_operator_winactive; - ot->prop = RNA_def_int( - ot->srna, "debug_value", 0, SHRT_MIN, SHRT_MAX, "Debug Value", "", -10000, 10000); + RNA_def_int(ot->srna, "debug_value", 0, SHRT_MIN, SHRT_MAX, "Debug Value", "", -10000, 10000); } /** \} */ @@ -1873,7 +1887,7 @@ static int wm_operator_defaults_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } -/* Used by operator preset menu. pre-2.65 this was a 'Reset' button. */ +/* used by operator preset menu. pre-2.65 this was a 'Reset' button */ static void WM_OT_operator_defaults(wmOperatorType *ot) { ot->name = "Restore Operator Defaults"; @@ -1922,6 +1936,8 @@ static uiBlock *wm_block_search_menu(bContext *C, ARegion *region, void *userdat 10, init_data->size[0], UI_UNIT_Y, + 0, + 0, ""); if (init_data->search_type == SEARCH_TYPE_OPERATOR) { @@ -1940,7 +1956,7 @@ static uiBlock *wm_block_search_menu(bContext *C, ARegion *region, void *userdat UI_but_flag_enable(but, UI_BUT_ACTIVATE_ON_INIT); - /* Fake button, it holds space for search items. */ + /* fake button, it holds space for search items */ uiDefBut(block, UI_BTYPE_LABEL, 0, @@ -1952,6 +1968,8 @@ static uiBlock *wm_block_search_menu(bContext *C, ARegion *region, void *userdat nullptr, 0, 0, + 0, + 0, nullptr); /* Move it downwards, mouse over button. */ @@ -2199,10 +2217,8 @@ static void WM_OT_call_panel(wmOperatorType *ot) /** \name Window/Screen Operators * \{ */ -/** - * This poll functions is needed in place of #WM_operator_winactive - * while it crashes on full screen. - */ +/* this poll functions is needed in place of WM_operator_winactive + * while it crashes on full screen */ static bool wm_operator_winactive_normal(bContext *C) { wmWindow *win = CTX_wm_window(C); @@ -2239,7 +2255,7 @@ static bool wm_operator_winactive_not_full(bContext *C) return true; } -/* Included for script-access. */ +/* included for script-access */ static void WM_OT_window_close(wmOperatorType *ot) { ot->name = "Close Window"; @@ -2549,7 +2565,7 @@ static void radial_control_set_tex(RadialControl *rc) static void radial_control_paint_tex(RadialControl *rc, float radius, float alpha) { - /* Set fill color. */ + /* set fill color */ float col[3] = {0, 0, 0}; if (rc->fill_col_prop) { PointerRNA *fill_ptr; @@ -2575,7 +2591,7 @@ static void radial_control_paint_tex(RadialControl *rc, float radius, float alph if (rc->texture) { uint texCoord = GPU_vertformat_attr_add(format, "texCoord", GPU_COMP_F32, 2, GPU_FETCH_FLOAT); - /* Set up rotation if available. */ + /* set up rotation if available */ if (rc->rot_prop) { float rot = RNA_property_float_get(&rc->rot_ptr, rc->rot_prop); GPU_matrix_push(); @@ -2587,7 +2603,7 @@ static void radial_control_paint_tex(RadialControl *rc, float radius, float alph immUniformColor3fvAlpha(col, alpha); immBindTexture("image", rc->texture); - /* Draw textured quad. */ + /* draw textured quad */ immBegin(GPU_PRIM_TRI_FAN, 4); immAttr2f(texCoord, 0, 0); @@ -2606,13 +2622,13 @@ static void radial_control_paint_tex(RadialControl *rc, float radius, float alph GPU_texture_unbind(rc->texture); - /* Undo rotation. */ + /* undo rotation */ if (rc->rot_prop) { GPU_matrix_pop(); } } else { - /* Flat color if no texture available. */ + /* flat color if no texture available */ immBindBuiltinProgram(GPU_SHADER_3D_UNIFORM_COLOR); immUniformColor3fvAlpha(col, alpha); imm_draw_circle_fill_2d(pos, 0.0f, 0.0f, radius, 40); @@ -2694,12 +2710,12 @@ static void radial_control_paint_cursor(bContext * /*C*/, int x, int y, void *cu if (rc->subtype == PROP_ANGLE) { /* Use the initial mouse position to draw the rotation preview. This avoids starting the - * rotation in a random direction. */ + * rotation in a random direction */ x = rc->initial_mouse[0]; y = rc->initial_mouse[1]; } else { - /* Keep cursor in the original place. */ + /* Keep cursor in the original place */ x = rc->initial_co[0]; y = rc->initial_co[1]; } @@ -2708,7 +2724,7 @@ static void radial_control_paint_cursor(bContext * /*C*/, int x, int y, void *cu GPU_blend(GPU_BLEND_ALPHA); GPU_line_smooth(true); - /* Apply zoom if available. */ + /* apply zoom if available */ if (rc->zoom_prop) { RNA_property_float_get_array(&rc->zoom_ptr, rc->zoom_prop, zoom); GPU_matrix_scale_2fv(zoom); @@ -2717,10 +2733,10 @@ static void radial_control_paint_cursor(bContext * /*C*/, int x, int y, void *cu /* Apply scale correction (used by grease pencil brushes). */ GPU_matrix_scale_2f(rc->scale_fac, rc->scale_fac); - /* Draw rotated texture. */ + /* draw rotated texture */ radial_control_paint_tex(rc, tex_radius, alpha); - /* Set line color. */ + /* set line color */ if (rc->col_prop) { RNA_property_float_get_array(&rc->col_ptr, rc->col_prop, col); } @@ -2733,14 +2749,14 @@ static void radial_control_paint_cursor(bContext * /*C*/, int x, int y, void *cu if (rc->subtype == PROP_ANGLE) { GPU_matrix_push(); - /* Draw original angle line. */ + /* draw original angle line */ GPU_matrix_rotate_3f(RAD2DEGF(rc->initial_value), 0.0f, 0.0f, 1.0f); immBegin(GPU_PRIM_LINES, 2); immVertex2f(pos, float(WM_RADIAL_CONTROL_DISPLAY_MIN_SIZE), 0.0f); immVertex2f(pos, float(WM_RADIAL_CONTROL_DISPLAY_SIZE), 0.0f); immEnd(); - /* Draw new angle line. */ + /* draw new angle line */ GPU_matrix_rotate_3f(RAD2DEGF(rc->current_value - rc->initial_value), 0.0f, 0.0f, 1.0f); immBegin(GPU_PRIM_LINES, 2); immVertex2f(pos, float(WM_RADIAL_CONTROL_DISPLAY_MIN_SIZE), 0.0f); @@ -2750,7 +2766,7 @@ static void radial_control_paint_cursor(bContext * /*C*/, int x, int y, void *cu GPU_matrix_pop(); } - /* Draw circles on top. */ + /* draw circles on top */ GPU_line_width(2.0f); immUniformColor3fvAlpha(col, 0.8f); imm_draw_circle_wire_2d(pos, 0.0f, 0.0f, r1, 80); @@ -2759,7 +2775,7 @@ static void radial_control_paint_cursor(bContext * /*C*/, int x, int y, void *cu immUniformColor3fvAlpha(col, 0.5f); imm_draw_circle_wire_2d(pos, 0.0f, 0.0f, r2, 80); if (rmin > 0.0f) { - /* Inner fill circle to increase the contrast of the value. */ + /* Inner fill circle to increase the contrast of the value */ const float black[3] = {0.0f}; immUniformColor3fvAlpha(black, 0.2f); imm_draw_circle_fill_2d(pos, 0.0, 0.0f, rmin, 80); @@ -2768,7 +2784,7 @@ static void radial_control_paint_cursor(bContext * /*C*/, int x, int y, void *cu imm_draw_circle_wire_2d(pos, 0.0, 0.0f, rmin, 80); } - /* Draw curve falloff preview. */ + /* draw curve falloff preview */ if (RNA_type_to_ID_code(rc->image_id_ptr.type) == ID_BR && rc->subtype == PROP_FACTOR) { Brush *br = static_cast(rc->image_id_ptr.data); if (br) { @@ -2782,7 +2798,7 @@ static void radial_control_paint_cursor(bContext * /*C*/, int x, int y, void *cu UI_GetThemeColor4fv(TH_TEXT_HI, text_color); BLF_color4fv(fontid, text_color); - /* Draw value. */ + /* draw value */ BLF_width_and_height(fontid, str, strdrawlen, &strwidth, &strheight); BLF_position(fontid, -0.5f * strwidth, -0.5f * strheight, 0.0f); BLF_draw(fontid, str, strdrawlen); @@ -2812,13 +2828,13 @@ static int radial_control_get_path(PointerRNA *ctx_ptr, { PropertyRNA *unused_prop; - /* Check flags. */ + /* check flags */ if ((flags & RC_PROP_REQUIRE_BOOL) && (flags & RC_PROP_REQUIRE_FLOAT)) { BKE_report(op->reports, RPT_ERROR, "Property cannot be both boolean and float"); return 0; } - /* Get an rna string path from the operator's properties. */ + /* get an rna string path from the operator's properties */ char *str; if (!(str = RNA_string_get_alloc(op->ptr, name, nullptr, 0, nullptr))) { return 1; @@ -2836,7 +2852,7 @@ static int radial_control_get_path(PointerRNA *ctx_ptr, r_prop = &unused_prop; } - /* Get rna from path. */ + /* get rna from path */ if (!RNA_path_resolve(ctx_ptr, str, r_ptr, r_prop)) { MEM_freeN(str); if (flags & RC_PROP_ALLOW_MISSING) { @@ -2846,7 +2862,7 @@ static int radial_control_get_path(PointerRNA *ctx_ptr, return 0; } - /* Check property type. */ + /* check property type */ if (flags & (RC_PROP_REQUIRE_BOOL | RC_PROP_REQUIRE_FLOAT)) { PropertyType prop_type = RNA_property_type(*r_prop); @@ -2859,7 +2875,7 @@ static int radial_control_get_path(PointerRNA *ctx_ptr, } } - /* Check property's array length. */ + /* check property's array length */ int len; if (*r_prop && (len = RNA_property_array_length(r_ptr, *r_prop)) != req_length) { MEM_freeN(str); @@ -2872,19 +2888,19 @@ static int radial_control_get_path(PointerRNA *ctx_ptr, return 0; } - /* Success. */ + /* success */ MEM_freeN(str); return 1; } -/* Initialize the rna pointers and properties using rna paths. */ +/* initialize the rna pointers and properties using rna paths */ static int radial_control_get_properties(bContext *C, wmOperator *op) { RadialControl *rc = static_cast(op->customdata); PointerRNA ctx_ptr = RNA_pointer_create(nullptr, &RNA_Context, C); - /* Check if we use primary or secondary path. */ + /* check if we use primary or secondary path */ PointerRNA use_secondary_ptr; PropertyRNA *use_secondary_prop = nullptr; if (!radial_control_get_path(&ctx_ptr, @@ -2910,7 +2926,7 @@ static int radial_control_get_properties(bContext *C, wmOperator *op) return 0; } - /* Data path is required. */ + /* data path is required */ if (!rc->prop) { return 0; } @@ -2959,8 +2975,9 @@ static int radial_control_get_properties(bContext *C, wmOperator *op) return 0; } - /* Slightly ugly; allow this property to not resolve correctly. - * Needed because 3d texture paint shares the same key-map as 2d image paint. */ + /* slightly ugly; allow this property to not resolve + * correctly. needed because 3d texture paint shares the same + * keymap as 2d image paint */ if (!radial_control_get_path(&ctx_ptr, op, "zoom_path", @@ -2978,7 +2995,7 @@ static int radial_control_get_properties(bContext *C, wmOperator *op) return 0; } if (rc->image_id_ptr.data) { - /* Extra check, pointer must be to an ID. */ + /* extra check, pointer must be to an ID */ if (!RNA_struct_is_ID(rc->image_id_ptr.type)) { BKE_report(op->reports, RPT_ERROR, "Pointer from path image_id is not an ID"); return 0; @@ -3006,7 +3023,7 @@ static int radial_control_invoke(bContext *C, wmOperator *op, const wmEvent *eve return OPERATOR_CANCELLED; } - /* Get type, initial, min, and max values of the property. */ + /* get type, initial, min, and max values of the property */ switch (rc->type = RNA_property_type(rc->prop)) { case PROP_INT: { int value, min, max, step; @@ -3036,14 +3053,14 @@ static int radial_control_invoke(bContext *C, wmOperator *op, const wmEvent *eve return OPERATOR_CANCELLED; } - /* Initialize numerical input. */ + /* initialize numerical input */ initNumInput(&rc->num_input); rc->num_input.idx_max = 0; rc->num_input.val_flag[0] |= NUM_NO_NEGATIVE; rc->num_input.unit_sys = USER_UNIT_NONE; rc->num_input.unit_type[0] = RNA_SUBTYPE_UNIT_VALUE(RNA_property_unit(rc->prop)); - /* Get subtype of property. */ + /* get subtype of property */ rc->subtype = RNA_property_subtype(rc->prop); if (!ELEM(rc->subtype, PROP_NONE, @@ -3066,12 +3083,12 @@ static int radial_control_invoke(bContext *C, wmOperator *op, const wmEvent *eve rc->init_event = WM_userdef_event_type_from_keymap_type(event->type); - /* Temporarily disable other paint cursors. */ + /* temporarily disable other paint cursors */ wm = CTX_wm_manager(C); rc->orig_paintcursors = wm->paintcursors; BLI_listbase_clear(&wm->paintcursors); - /* Add radial control paint cursor. */ + /* add radial control paint cursor */ rc->cursor = WM_paint_cursor_activate( SPACE_TYPE_ANY, RGN_TYPE_ANY, op->type->poll, radial_control_paint_cursor, rc); @@ -3106,12 +3123,12 @@ static void radial_control_cancel(bContext *C, wmOperator *op) WM_paint_cursor_end(static_cast(rc->cursor)); - /* Restore original paint cursors. */ + /* restore original paint cursors */ wm->paintcursors = rc->orig_paintcursors; - /* Not sure if this is a good notifier to use; + /* not sure if this is a good notifier to use; * intended purpose is to update the UI so that the - * new value is displayed in sliders/number-fields. */ + * new value is displayed in sliders/numfields */ WM_event_add_notifier(C, NC_WINDOW, nullptr); if (rc->texture != nullptr) { @@ -3131,7 +3148,7 @@ static int radial_control_modal(bContext *C, wmOperator *op, const wmEvent *even const bool has_numInput = hasNumInput(&rc->num_input); bool handled = false; float numValue; - /* TODO: fix hard-coded events. */ + /* TODO: fix hardcoded events */ bool snap = (event->modifier & KM_CTRL) != 0; @@ -3160,7 +3177,7 @@ static int radial_control_modal(bContext *C, wmOperator *op, const wmEvent *even switch (event->type) { case EVT_ESCKEY: case RIGHTMOUSE: - /* Canceled; restore original value. */ + /* canceled; restore original value */ radial_control_set_value(rc, rc->initial_value); ret = OPERATOR_CANCELLED; break; @@ -3168,7 +3185,7 @@ static int radial_control_modal(bContext *C, wmOperator *op, const wmEvent *even case LEFTMOUSE: case EVT_PADENTER: case EVT_RETKEY: - /* Done; value already set. */ + /* done; value already set */ RNA_property_update(C, &rc->ptr, rc->prop); ret = OPERATOR_FINISHED; break; @@ -3177,11 +3194,11 @@ static int radial_control_modal(bContext *C, wmOperator *op, const wmEvent *even if (!has_numInput) { if (rc->slow_mode) { if (rc->subtype == PROP_ANGLE) { - /* Calculate the initial angle here first. */ + /* calculate the initial angle here first */ delta[0] = rc->initial_mouse[0] - rc->slow_mouse[0]; delta[1] = rc->initial_mouse[1] - rc->slow_mouse[1]; - /* Precision angle gets calculated from dial and gets added later. */ + /* precision angle gets calculated from dial and gets added later */ angle_precision = -0.1f * BLI_dial_angle(rc->dial, blender::float2{float(event->xy[0]), float(event->xy[1])}); @@ -3245,7 +3262,7 @@ static int radial_control_modal(bContext *C, wmOperator *op, const wmEvent *even if (snap) { new_value = (int(ceil(new_value * 10.0f)) * 10.0f) / 100.0f; } - /* Invert new value to increase the factor moving the mouse to the right. */ + /* Invert new value to increase the factor moving the mouse to the right */ new_value = 1 - new_value; break; case PROP_ANGLE: @@ -3259,11 +3276,11 @@ static int radial_control_modal(bContext *C, wmOperator *op, const wmEvent *even } break; default: - new_value = dist; /* NOTE(@ideasman42): Dummy value, should this ever happen? */ + new_value = dist; /* dummy value, should this ever happen? - campbell */ break; } - /* Clamp and update. */ + /* clamp and update */ CLAMP(new_value, rc->min_value, rc->max_value); radial_control_set_value(rc, new_value); rc->current_value = new_value; @@ -3283,7 +3300,7 @@ static int radial_control_modal(bContext *C, wmOperator *op, const wmEvent *even float(rc->initial_mouse[1])}; const float current_position[2] = {float(rc->slow_mouse[0]), float(rc->slow_mouse[1])}; rc->dial = BLI_dial_init(initial_position, 0.0f); - /* Immediately set the position to get a an initial direction. */ + /* immediately set the position to get a an initial direction */ BLI_dial_angle(rc->dial, current_position); } handled = true; @@ -3356,7 +3373,7 @@ static void WM_OT_radial_control(wmOperatorType *ot) ot->flag = OPTYPE_REGISTER | OPTYPE_BLOCKING; - /* All paths relative to the context. */ + /* all paths relative to the context */ PropertyRNA *prop; prop = RNA_def_string(ot->srna, "data_path_primary", @@ -3446,7 +3463,7 @@ static void WM_OT_radial_control(wmOperatorType *ot) * Use for simple benchmarks. * \{ */ -/* Uses no type defines, fully local testing function anyway. */ +/* uses no type defines, fully local testing function anyway... ;) */ static void redraw_timer_window_swap(bContext *C) { @@ -3535,7 +3552,7 @@ static void redraw_timer_step(bContext *C, BKE_scene_graph_update_for_newframe(depsgraph); } else if (type == eRTAnimationPlay) { - /* Play anim, return on same frame as started with. */ + /* play anim, return on same frame as started with */ int tot = (scene->r.efra - scene->r.sfra) + 1; while (tot--) { @@ -3549,7 +3566,7 @@ static void redraw_timer_step(bContext *C, redraw_timer_window_swap(C); } } - else { /* #eRTUndo. */ + else { /* eRTUndo */ /* Undo and redo, including depsgraph update since that can be a * significant part of the cost. */ ED_undo_pop(C); @@ -3587,7 +3604,7 @@ static int redraw_timer_exec(bContext *C, wmOperator *op) WM_cursor_wait(true); - double time_start = BLI_time_now_seconds(); + double time_start = BLI_check_seconds_timer(); wm_window_make_drawable(wm, win); @@ -3597,14 +3614,14 @@ static int redraw_timer_exec(bContext *C, wmOperator *op) iter_steps += 1; if (time_limit != 0.0) { - if ((BLI_time_now_seconds() - time_start) > time_limit) { + if ((BLI_check_seconds_timer() - time_start) > time_limit) { break; } a = 0; } } - double time_delta = (BLI_time_now_seconds() - time_start) * 1000; + double time_delta = (BLI_check_seconds_timer() - time_start) * 1000; RNA_enum_description(redraw_timer_type_items, type, &infostr); @@ -3805,7 +3822,7 @@ static const EnumPropertyItem preview_id_type_items[] = { {PREVIEW_FILTER_WORLD, "WORLD", 0, "Worlds", ""}, {PREVIEW_FILTER_TEXTURE, "TEXTURE", 0, "Textures", ""}, {PREVIEW_FILTER_IMAGE, "IMAGE", 0, "Images", ""}, -#if 0 /* XXX: TODO. */ +#if 0 /* XXX TODO */ {PREVIEW_FILTER_BRUSH, "BRUSH", 0, "Brushes", ""}, #endif {0, nullptr, 0, nullptr, nullptr}, @@ -3915,11 +3932,12 @@ static void WM_OT_previews_clear(wmOperatorType *ot) static int doc_view_manual_ui_context_exec(bContext *C, wmOperator * /*op*/) { PointerRNA ptr_props; + char buf[512]; short retval = OPERATOR_CANCELLED; - if (std::optional manual_id = UI_but_online_manual_id_from_active(C)) { + if (UI_but_online_manual_id_from_active(C, buf, sizeof(buf))) { WM_operator_properties_create(&ptr_props, "WM_OT_doc_view_manual"); - RNA_string_set(&ptr_props, "doc_id", manual_id.value().c_str()); + RNA_string_set(&ptr_props, "doc_id", buf); retval = WM_operator_name_call_ptr(C, WM_operatortype_find("WM_OT_doc_view_manual", false), @@ -3935,12 +3953,12 @@ static int doc_view_manual_ui_context_exec(bContext *C, wmOperator * /*op*/) static void WM_OT_doc_view_manual_ui_context(wmOperatorType *ot) { - /* Identifiers. */ + /* identifiers */ ot->name = "View Online Manual"; ot->idname = "WM_OT_doc_view_manual_ui_context"; ot->description = "View a context based online manual in a web browser"; - /* Callbacks. */ + /* callbacks */ ot->poll = ED_operator_regionactive; ot->exec = doc_view_manual_ui_context_exec; } @@ -4059,7 +4077,7 @@ void wm_operatortypes_register() wm_xr_operatortypes_register(); #endif - /* Gizmos. */ + /* gizmos */ WM_operatortype_append(GIZMOGROUP_OT_gizmo_select); WM_operatortype_append(GIZMOGROUP_OT_gizmo_tweak); } @@ -4091,7 +4109,7 @@ static void gesture_circle_modal_keymap(wmKeyConfig *keyconf) keymap = WM_modalkeymap_ensure(keyconf, "View3D Gesture Circle", modal_items); - /* Assign map to operators. */ + /* assign map to operators */ WM_modalkeymap_assign(keymap, "VIEW3D_OT_select_circle"); WM_modalkeymap_assign(keymap, "UV_OT_select_circle"); WM_modalkeymap_assign(keymap, "CLIP_OT_select_circle"); @@ -4102,7 +4120,7 @@ static void gesture_circle_modal_keymap(wmKeyConfig *keyconf) WM_modalkeymap_assign(keymap, "ACTION_OT_select_circle"); } -/* Straight line modal operators. */ +/* straight line modal operators */ static void gesture_straightline_modal_keymap(wmKeyConfig *keyconf) { static const EnumPropertyItem modal_items[] = { @@ -4124,7 +4142,7 @@ static void gesture_straightline_modal_keymap(wmKeyConfig *keyconf) keymap = WM_modalkeymap_ensure(keyconf, "Gesture Straight Line", modal_items); - /* Assign map to operators. */ + /* assign map to operators */ WM_modalkeymap_assign(keymap, "IMAGE_OT_sample_line"); WM_modalkeymap_assign(keymap, "PAINT_OT_weight_gradient"); WM_modalkeymap_assign(keymap, "MESH_OT_bisect"); @@ -4132,7 +4150,7 @@ static void gesture_straightline_modal_keymap(wmKeyConfig *keyconf) WM_modalkeymap_assign(keymap, "SCULPT_OT_project_line_gesture"); } -/* Box_select-like modal operators. */ +/* box_select-like modal operators */ static void gesture_box_modal_keymap(wmKeyConfig *keyconf) { static const EnumPropertyItem modal_items[] = { @@ -4153,7 +4171,7 @@ static void gesture_box_modal_keymap(wmKeyConfig *keyconf) keymap = WM_modalkeymap_ensure(keyconf, "Gesture Box", modal_items); - /* Assign map to operators. */ + /* assign map to operators */ WM_modalkeymap_assign(keymap, "ACTION_OT_select_box"); WM_modalkeymap_assign(keymap, "ANIM_OT_channels_select_box"); WM_modalkeymap_assign(keymap, "ANIM_OT_previewrange_set"); @@ -4189,7 +4207,7 @@ static void gesture_box_modal_keymap(wmKeyConfig *keyconf) WM_modalkeymap_assign(keymap, "GPENCIL_OT_select_box"); } -/* Lasso modal operators. */ +/* lasso modal operators */ static void gesture_lasso_modal_keymap(wmKeyConfig *keyconf) { static const EnumPropertyItem modal_items[] = { @@ -4206,7 +4224,7 @@ static void gesture_lasso_modal_keymap(wmKeyConfig *keyconf) keymap = WM_modalkeymap_ensure(keyconf, "Gesture Lasso", modal_items); - /* Assign map to operators. */ + /* assign map to operators */ WM_modalkeymap_assign(keymap, "VIEW3D_OT_select_lasso"); WM_modalkeymap_assign(keymap, "GPENCIL_OT_stroke_cutter"); WM_modalkeymap_assign(keymap, "GPENCIL_OT_select_lasso"); @@ -4219,10 +4237,9 @@ static void gesture_lasso_modal_keymap(wmKeyConfig *keyconf) WM_modalkeymap_assign(keymap, "GRAPH_OT_select_lasso"); WM_modalkeymap_assign(keymap, "NODE_OT_select_lasso"); WM_modalkeymap_assign(keymap, "UV_OT_select_lasso"); - WM_modalkeymap_assign(keymap, "PAINT_OT_hide_show_lasso_gesture"); } -/* Zoom to border modal operators. */ +/* zoom to border modal operators */ static void gesture_zoom_border_modal_keymap(wmKeyConfig *keyconf) { static const EnumPropertyItem modal_items[] = { @@ -4242,7 +4259,7 @@ static void gesture_zoom_border_modal_keymap(wmKeyConfig *keyconf) keymap = WM_modalkeymap_ensure(keyconf, "Gesture Zoom Border", modal_items); - /* Assign map to operators. */ + /* assign map to operators */ WM_modalkeymap_assign(keymap, "VIEW2D_OT_zoom_border"); WM_modalkeymap_assign(keymap, "VIEW3D_OT_zoom_border"); WM_modalkeymap_assign(keymap, "IMAGE_OT_view_zoom_border"); @@ -4277,7 +4294,7 @@ static bool rna_id_enum_filter_single(const ID *id, void *user_data) return (id != user_data); } -/* Generic itemf's for operators that take library args. */ +/* Generic itemf's for operators that take library args */ static const EnumPropertyItem *rna_id_itemf(bool *r_free, ID *id, bool local, @@ -4326,7 +4343,7 @@ const EnumPropertyItem *RNA_action_itemf(bContext *C, return rna_id_itemf( r_free, C ? (ID *)CTX_data_main(C)->actions.first : nullptr, false, nullptr, nullptr); } -#if 0 /* UNUSED. */ +#if 0 /* UNUSED */ const EnumPropertyItem *RNA_action_local_itemf(bContext *C, PointerRNA * /*ptr*/, PropertyRNA * /*prop*/, diff --git a/source/blender/windowmanager/intern/wm_panel_type.cc b/source/blender/windowmanager/intern/wm_panel_type.cc index 32e73466bf1..ac7c0e7115e 100644 --- a/source/blender/windowmanager/intern/wm_panel_type.cc +++ b/source/blender/windowmanager/intern/wm_panel_type.cc @@ -59,7 +59,7 @@ void WM_paneltype_remove(PanelType *pt) void WM_paneltype_init() { - /* Reserve size is set based on blender default setup. */ + /* reserve size is set based on blender default setup */ g_paneltypes_hash = BLI_ghash_str_new_ex("g_paneltypes_hash gh", 512); } @@ -68,20 +68,20 @@ void WM_paneltype_clear() BLI_ghash_free(g_paneltypes_hash, nullptr, nullptr); } -void WM_paneltype_idname_visit_for_search( - const bContext * /*C*/, - PointerRNA * /*ptr*/, - PropertyRNA * /*prop*/, - const char * /*edit_text*/, - blender::FunctionRef visit_fn) +void WM_paneltype_idname_visit_for_search(const bContext * /*C*/, + PointerRNA * /*ptr*/, + PropertyRNA * /*prop*/, + const char * /*edit_text*/, + StringPropertySearchVisitFunc visit_fn, + void *visit_user_data) { GHashIterator gh_iter; GHASH_ITER (gh_iter, g_paneltypes_hash) { PanelType *pt = static_cast(BLI_ghashIterator_getValue(&gh_iter)); - StringPropertySearchVisitParams visit_params{}; + StringPropertySearchVisitParams visit_params = {nullptr}; visit_params.text = pt->idname; visit_params.info = pt->label; - visit_fn(visit_params); + visit_fn(visit_user_data, &visit_params); } } diff --git a/source/blender/windowmanager/intern/wm_platform_support.cc b/source/blender/windowmanager/intern/wm_platform_support.cc index c341e6f8230..fd49aa21481 100644 --- a/source/blender/windowmanager/intern/wm_platform_support.cc +++ b/source/blender/windowmanager/intern/wm_platform_support.cc @@ -15,14 +15,17 @@ #include "BLI_linklist.h" #include "BLI_path_util.h" #include "BLI_string.h" +#include "BLI_sys_types.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_appdir.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "GPU_platform.h" +#include "GHOST_C-api.h" + #define WM_PLATFORM_SUPPORT_TEXT_SIZE 1024 /** @@ -71,7 +74,7 @@ static void wm_platform_support_create_link(char *link) BLI_dynstr_append(ds, "windows/"); #elif defined(__APPLE__) BLI_dynstr_append(ds, "apple/"); -#else /* UNIX. */ +#else /* UNIX */ BLI_dynstr_append(ds, "linux/"); #endif @@ -113,7 +116,7 @@ bool WM_platform_support_perform_checks() return result; } - /* Update the message and link based on the found support level. */ + /* update the message and link based on the found support level */ GHOST_DialogOptions dialog_options = GHOST_DialogOptions(0); switch (support_level) { diff --git a/source/blender/windowmanager/intern/wm_playanim.cc b/source/blender/windowmanager/intern/wm_playanim.cc index 1e0396378e7..0c1e302e432 100644 --- a/source/blender/windowmanager/intern/wm_playanim.cc +++ b/source/blender/windowmanager/intern/wm_playanim.cc @@ -58,6 +58,7 @@ #include "BLF_api.hh" #include "DNA_scene_types.h" +#include "ED_datafiles.h" /* for fonts */ #include "GHOST_C-api.h" #include "DEG_depsgraph.hh" @@ -267,7 +268,7 @@ struct PlayState { GhostData ghost_data; }; -/* For debugging. */ +/* for debugging */ #if 0 static void print_ps(PlayState *ps) { @@ -299,26 +300,26 @@ static void playanim_gpu_matrix() GPU_matrix_ortho_set(0.0f, 1.0f, 0.0f, 1.0f, -1.0, 1.0f); } -/* Implementation. */ +/* implementation */ static void playanim_event_qual_update(GhostData *ghost_data) { bool val; - /* Shift. */ + /* Shift */ GHOST_GetModifierKeyState(ghost_data->system, GHOST_kModifierKeyLeftShift, &val); SET_FLAG_FROM_TEST(ghost_data->qual, val, WS_QUAL_LSHIFT); GHOST_GetModifierKeyState(ghost_data->system, GHOST_kModifierKeyRightShift, &val); SET_FLAG_FROM_TEST(ghost_data->qual, val, WS_QUAL_RSHIFT); - /* Control. */ + /* Control */ GHOST_GetModifierKeyState(ghost_data->system, GHOST_kModifierKeyLeftControl, &val); SET_FLAG_FROM_TEST(ghost_data->qual, val, WS_QUAL_LCTRL); GHOST_GetModifierKeyState(ghost_data->system, GHOST_kModifierKeyRightControl, &val); SET_FLAG_FROM_TEST(ghost_data->qual, val, WS_QUAL_RCTRL); - /* Alt. */ + /* Alt */ GHOST_GetModifierKeyState(ghost_data->system, GHOST_kModifierKeyLeftAlt, &val); SET_FLAG_FROM_TEST(ghost_data->qual, val, WS_QUAL_LALT); @@ -485,7 +486,7 @@ static int pupdate_time() { static double time_last; - double time = BLI_time_now_seconds(); + double time = BLI_check_seconds_timer(); g_playanim.total_time += (time - time_last); time_last = time; @@ -505,7 +506,7 @@ static void *ocio_transform_ibuf(const PlayDisplayContext *display_ctx, force_fallback |= (ED_draw_imbuf_method(ibuf) != IMAGE_DRAW_METHOD_GLSL); force_fallback |= (ibuf->dither != 0.0f); - /* Default. */ + /* Default */ *r_format = GPU_RGBA8; *r_data = GPU_DATA_UBYTE; @@ -1641,7 +1642,7 @@ static GHOST_WindowHandle playanim_window_open( static void playanim_window_zoom(PlayState *ps, const float zoom_offset) { int size[2]; - // int ofs[2]; /* UNUSED. */ + // int ofs[2]; /* UNUSED */ if (ps->zoom + zoom_offset > 0.0f) { ps->zoom += zoom_offset; @@ -1649,12 +1650,12 @@ static void playanim_window_zoom(PlayState *ps, const float zoom_offset) // playanim_window_get_position(&ofs[0], &ofs[1]); // playanim_window_get_size(ps->ghost_data.window, &size[0], &size[1]); - // ofs[0] += size[0] / 2; /* UNUSED. */ - // ofs[1] += size[1] / 2; /* UNUSED. */ + // ofs[0] += size[0] / 2; /* UNUSED */ + // ofs[1] += size[1] / 2; /* UNUSED */ size[0] = ps->zoom * ps->ibuf_size[0]; size[1] = ps->zoom * ps->ibuf_size[1]; - // ofs[0] -= size[0] / 2; /* UNUSED. */ - // ofs[1] -= size[1] / 2; /* UNUSED. */ + // ofs[0] -= size[0] / 2; /* UNUSED */ + // ofs[1] -= size[1] / 2; /* UNUSED */ // window_set_position(ps->ghost_data.window, size[0], size[1]); GHOST_SetClientSize(ps->ghost_data.window, size[0], size[1]); } @@ -2015,13 +2016,13 @@ static bool wm_main_playanim_intern(int argc, const char **argv, PlayArgs *args_ STRNCPY(ibuf->filepath, ps.picture->filepath); } -/* NOTE(@ideasman42): why only windows? (from 2.4x). */ +/* why only windows? (from 2.4x) - campbell */ #ifdef _WIN32 GHOST_SetTitle(ps.ghost_data.window, ps.picture->filepath); #endif while (pupdate_time()) { - BLI_time_sleep_ms(1); + BLI_sleep_ms(1); } g_playanim.total_time -= g_playanim.swap_time; playanim_toscreen(&ps, ps.picture, ibuf); @@ -2052,7 +2053,7 @@ static bool wm_main_playanim_intern(int argc, const char **argv, PlayArgs *args_ } playanim_change_frame(&ps); if (!has_event) { - BLI_time_sleep_ms(1); + BLI_sleep_ms(1); } if (ps.wait) { continue; @@ -2115,7 +2116,7 @@ static bool wm_main_playanim_intern(int argc, const char **argv, PlayArgs *args_ MEM_freeN(ps.picture); } -/* Cleanup. */ +/* cleanup */ #ifndef USE_IMB_CACHE if (ibuf) { IMB_freeImBuf(ibuf); diff --git a/source/blender/windowmanager/intern/wm_splash_screen.cc b/source/blender/windowmanager/intern/wm_splash_screen.cc index 29bc7913f4e..3243832ed46 100644 --- a/source/blender/windowmanager/intern/wm_splash_screen.cc +++ b/source/blender/windowmanager/intern/wm_splash_screen.cc @@ -17,6 +17,8 @@ #include #include +#include "CLG_log.h" + #include "DNA_ID.h" #include "DNA_scene_types.h" #include "DNA_screen_types.h" @@ -29,8 +31,11 @@ #include "BKE_appdir.hh" #include "BKE_blender_version.h" #include "BKE_context.hh" +#include "BKE_screen.hh" -#include "BLT_translation.hh" +#include "BLT_translation.h" + +#include "BLF_api.hh" #include "IMB_imbuf.hh" #include "IMB_imbuf_types.hh" @@ -66,7 +71,7 @@ static void wm_block_splash_add_label(uiBlock *block, const char *label, int x, UI_block_emboss_set(block, UI_EMBOSS_NONE); uiBut *but = uiDefBut( - block, UI_BTYPE_LABEL, 0, label, 0, y, x, UI_UNIT_Y, nullptr, 0, 0, nullptr); + block, UI_BTYPE_LABEL, 0, label, 0, y, x, UI_UNIT_Y, nullptr, 0, 0, 0, 0, nullptr); UI_but_drawflag_disable(but, UI_BUT_TEXT_LEFT); UI_but_drawflag_enable(but, UI_BUT_TEXT_RIGHT); @@ -200,7 +205,7 @@ static uiBlock *wm_block_splash_create(bContext *C, ARegion *region, void * /*ar uiBlock *block = UI_block_begin(C, region, "splash", UI_EMBOSS); - /* Note on #UI_BLOCK_NO_WIN_CLIP, the window size is not always synchronized + /* note on UI_BLOCK_NO_WIN_CLIP, the window size is not always synchronized * with the OS when the splash shows, window clipping in this case gives * ugly results and clipping the splash isn't useful anyway, just disable it #32938. */ UI_block_flag_enable(block, UI_BLOCK_LOOP | UI_BLOCK_KEEP_OPEN | UI_BLOCK_NO_WIN_CLIP); diff --git a/source/blender/windowmanager/intern/wm_stereo.cc b/source/blender/windowmanager/intern/wm_stereo.cc index 4ca44b0f68f..d1b295dea19 100644 --- a/source/blender/windowmanager/intern/wm_stereo.cc +++ b/source/blender/windowmanager/intern/wm_stereo.cc @@ -19,10 +19,8 @@ #include "BLI_utildefines.h" #include "BKE_context.hh" -#include "BKE_global.hh" -#include "BKE_report.hh" - -#include "BLT_translation.hh" +#include "BKE_global.h" +#include "BKE_report.h" #include "GHOST_C-api.h" @@ -36,6 +34,7 @@ #include "WM_api.hh" #include "WM_types.hh" #include "wm.hh" +#include "wm_draw.hh" #include "wm_window.hh" #include "UI_interface.hh" @@ -57,7 +56,7 @@ void wm_stereo3d_draw_sidebyside(wmWindow *win, int view) soffx = 0; } } - else { /* #RIGHT_LEFT_ID. */ + else { /* #RIGHT_LEFT_ID */ if (cross_eyed) { soffx = 0; } @@ -66,7 +65,7 @@ void wm_stereo3d_draw_sidebyside(wmWindow *win, int view) const int sizex = WM_window_pixels_x(win); const int sizey = WM_window_pixels_y(win); - /* `wmOrtho` for the screen has this same offset. */ + /* wmOrtho for the screen has this same offset */ const float halfx = GLA_PIXEL_OFS / sizex; const float halfy = GLA_PIXEL_OFS / sizex; @@ -103,14 +102,14 @@ void wm_stereo3d_draw_topbottom(wmWindow *win, int view) if (view == STEREO_LEFT_ID) { soffy = WM_window_pixels_y(win) * 0.5f; } - else { /* #STEREO_RIGHT_ID. */ + else { /* STEREO_RIGHT_ID */ soffy = 0; } const int sizex = WM_window_pixels_x(win); const int sizey = WM_window_pixels_y(win); - /* `wmOrtho` for the screen has this same offset. */ + /* wmOrtho for the screen has this same offset */ const float halfx = GLA_PIXEL_OFS / sizex; const float halfy = GLA_PIXEL_OFS / sizex; @@ -145,8 +144,8 @@ bool WM_stereo3d_enabled(wmWindow *win, bool skip_stereo3d_check) const bScreen *screen = WM_window_get_active_screen(win); const Scene *scene = WM_window_get_active_scene(win); - /* Some 3d methods change the window arrangement, thus they shouldn't - * toggle on/off just because there is no 3d elements being drawn. */ + /* some 3d methods change the window arrangement, thus they shouldn't + * toggle on/off just because there is no 3d elements being drawn */ if (wm_stereo3d_is_fullscreen_required(eStereoDisplayMode(win->stereo3d_format->display_mode))) { return GHOST_GetWindowState(static_cast(win->ghostwin)) == GHOST_kWindowStateFullScreen; @@ -156,8 +155,8 @@ bool WM_stereo3d_enabled(wmWindow *win, bool skip_stereo3d_check) return false; } - /* Some 3d methods change the window arrangement, thus they shouldn't - * toggle on/off just because there is no 3d elements being drawn. */ + /* some 3d methods change the window arrangement, thus they shouldn't + * toggle on/off just because there is no 3d elements being drawn */ if (wm_stereo3d_is_fullscreen_required(eStereoDisplayMode(win->stereo3d_format->display_mode))) { return GHOST_GetWindowState(static_cast(win->ghostwin)) == GHOST_kWindowStateFullScreen; @@ -174,7 +173,7 @@ void wm_stereo3d_mouse_offset_apply(wmWindow *win, int r_mouse_xy[2]) if (win->stereo3d_format->display_mode == S3D_DISPLAY_SIDEBYSIDE) { const int half_x = WM_window_pixels_x(win) / 2; - /* Right half of the screen. */ + /* right half of the screen */ if (r_mouse_xy[0] > half_x) { r_mouse_xy[0] -= half_x; } @@ -182,7 +181,7 @@ void wm_stereo3d_mouse_offset_apply(wmWindow *win, int r_mouse_xy[2]) } else if (win->stereo3d_format->display_mode == S3D_DISPLAY_TOPBOTTOM) { const int half_y = WM_window_pixels_y(win) / 2; - /* Upper half of the screen. */ + /* upper half of the screen */ if (r_mouse_xy[1] > half_y) { r_mouse_xy[1] -= half_y; } @@ -252,7 +251,7 @@ static void wm_stereo3d_set_init(bContext *C, wmOperator *op) Stereo3dData *s3dd = static_cast(MEM_callocN(sizeof(Stereo3dData), __func__)); op->customdata = s3dd; - /* Store the original win stereo 3d settings in case of cancel. */ + /* store the original win stereo 3d settings in case of cancel */ s3dd->stereo3d_format = *win->stereo3d_format; } @@ -270,7 +269,7 @@ int wm_stereo3d_set_exec(bContext *C, wmOperator *op) } if (op->customdata == nullptr) { - /* No invoke means we need to set the operator properties here. */ + /* no invoke means we need to set the operator properties here */ wm_stereo3d_set_init(C, op); wm_stereo3d_set_properties(C, op); } @@ -283,7 +282,7 @@ int wm_stereo3d_set_exec(bContext *C, wmOperator *op) { /* In case the hardware supports page-flip but not the display. */ if ((win_dst = wm_window_copy_test(C, win_src, false, false))) { - /* Pass. */ + /* pass */ } else { BKE_report( @@ -352,7 +351,7 @@ int wm_stereo3d_set_invoke(bContext *C, wmOperator *op, const wmEvent * /*event* if (wm_stereo3d_set_properties(C, op)) { return wm_stereo3d_set_exec(C, op); } - return WM_operator_props_dialog_popup(C, op, 300, IFACE_("Set Stereo 3D"), IFACE_("Set")); + return WM_operator_props_dialog_popup(C, op, 300); } void wm_stereo3d_set_draw(bContext * /*C*/, wmOperator *op) @@ -383,7 +382,7 @@ void wm_stereo3d_set_draw(bContext * /*C*/, wmOperator *op) case S3D_DISPLAY_SIDEBYSIDE: { uiItemR( col, &stereo3d_format_ptr, "use_sidebyside_crosseyed", UI_ITEM_NONE, nullptr, ICON_NONE); - /* Fall-through. */ + /* fall-through */ } case S3D_DISPLAY_PAGEFLIP: case S3D_DISPLAY_TOPBOTTOM: @@ -395,9 +394,9 @@ void wm_stereo3d_set_draw(bContext * /*C*/, wmOperator *op) bool wm_stereo3d_set_check(bContext * /*C*/, wmOperator * /*op*/) { - /* The check function guarantees that the menu is updated to show the + /* the check function guarantees that the menu is updated to show the * sub-options when an enum change (e.g., it shows the anaglyph options - * when anaglyph is on, and the interlace options when this is on. */ + * when anaglyph is on, and the interlace options when this is on */ return true; } diff --git a/source/blender/windowmanager/intern/wm_subwindow.cc b/source/blender/windowmanager/intern/wm_subwindow.cc index 48b2e638ce2..6685cfe05d5 100644 --- a/source/blender/windowmanager/intern/wm_subwindow.cc +++ b/source/blender/windowmanager/intern/wm_subwindow.cc @@ -85,7 +85,7 @@ void wmWindowViewport(wmWindow *win) void wmOrtho2(float x1, float x2, float y1, float y2) { - /* Prevent opengl from generating errors. */ + /* prevent opengl from generating errors */ if (x2 == x1) { x2 += 1.0f; } diff --git a/source/blender/windowmanager/intern/wm_surface.cc b/source/blender/windowmanager/intern/wm_surface.cc index ac56a682b8f..881efa52896 100644 --- a/source/blender/windowmanager/intern/wm_surface.cc +++ b/source/blender/windowmanager/intern/wm_surface.cc @@ -6,20 +6,25 @@ * \ingroup wm */ +#include "BKE_context.hh" + +#include "BLF_api.hh" + #include "BLI_listbase.h" -#ifndef NDEBUG -# include "BLI_threads.h" -#endif +#include "BLI_threads.h" #include "GHOST_C-api.h" +#include "GPU_batch_presets.h" #include "GPU_context.h" #include "GPU_framebuffer.h" +#include "GPU_immediate.h" #include "MEM_guardedalloc.h" #include "WM_api.hh" #include "WM_types.hh" +#include "wm.hh" #include "wm_surface.hh" diff --git a/source/blender/windowmanager/intern/wm_toolsystem.cc b/source/blender/windowmanager/intern/wm_toolsystem.cc index 8c9c7da6a86..0dafc36ecb6 100644 --- a/source/blender/windowmanager/intern/wm_toolsystem.cc +++ b/source/blender/windowmanager/intern/wm_toolsystem.cc @@ -39,7 +39,7 @@ #include "WM_api.hh" #include "WM_message.hh" -#include "WM_toolsystem.hh" /* Own include. */ +#include "WM_toolsystem.hh" /* own include */ #include "WM_types.hh" static void toolsystem_reinit_with_toolref(bContext *C, WorkSpace * /*workspace*/, bToolRef *tref); @@ -145,7 +145,7 @@ static void toolsystem_ref_link(bContext *C, WorkSpace *workspace, bToolRef *tre if ((gzgt->flag & WM_GIZMOGROUPTYPE_TOOL_INIT) == 0) { if (!WM_gizmo_group_type_ensure_ptr(gzgt)) { /* Even if the group-type was has been linked, it's possible the space types - * were not previously using it. (happens with multiple windows). */ + * were not previously using it. (happens with multiple windows.) */ wmGizmoMapType *gzmap_type = WM_gizmomaptype_ensure(&gzgt->gzmap_params); WM_gizmoconfig_update_tag_group_type_init(gzmap_type, gzgt); } @@ -194,7 +194,7 @@ static void toolsystem_ref_link(bContext *C, WorkSpace *workspace, bToolRef *tre /* Could make into a function. */ brush = (Brush *)BKE_libblock_find_name(bmain, ID_BR, items[i].name); if (brush && slot_index == BKE_brush_tool_get(brush, paint)) { - /* Pass. */ + /* pass */ } else { brush = BKE_brush_add(bmain, items[i].name, eObjectMode(paint->runtime.ob_mode)); @@ -219,7 +219,7 @@ static void toolsystem_refresh_ref(bContext *C, WorkSpace *workspace, bToolRef * if (tref->runtime == nullptr) { return; } - /* Currently same operation. */ + /* currently same operation. */ toolsystem_ref_link(C, workspace, tref); } void WM_toolsystem_refresh(bContext *C, WorkSpace *workspace, const bToolKey *tkey) @@ -370,7 +370,7 @@ void WM_toolsystem_ref_sync_from_context(Main *bmain, WorkSpace *workspace, bToo BKE_view_layer_synced_ensure(scene, view_layer); const Object *ob = BKE_view_layer_active_object_get(view_layer); if (ob == nullptr) { - /* Pass. */ + /* pass */ } if ((tref->space_type == SPACE_VIEW3D) && (tref->mode == CTX_MODE_PARTICLE)) { if (ob->mode & OB_MODE_PARTICLE_EDIT) { @@ -607,7 +607,7 @@ void WM_toolsystem_refresh_screen_window(wmWindow *win) void WM_toolsystem_refresh_screen_all(Main *bmain) { - /* Update all ScrArea's tools. */ + /* Update all ScrArea's tools */ for (wmWindowManager *wm = static_cast(bmain->wm.first); wm; wm = static_cast(wm->id.next)) { @@ -621,7 +621,7 @@ static void toolsystem_refresh_screen_from_active_tool(Main *bmain, WorkSpace *workspace, bToolRef *tref) { - /* Update all ScrArea's tools. */ + /* Update all ScrArea's tools */ for (wmWindowManager *wm = static_cast(bmain->wm.first); wm; wm = static_cast(wm->id.next)) { @@ -727,7 +727,7 @@ static const char *toolsystem_default_tool(const bToolKey *tkey) return "builtin_brush.Draw"; case CTX_MODE_SCULPT_CURVES: return "builtin_brush.Density"; - /* End temporary hack. */ + /* end temporary hack. */ case CTX_MODE_PARTICLE: return "builtin_brush.Comb"; diff --git a/source/blender/windowmanager/intern/wm_tooltip.cc b/source/blender/windowmanager/intern/wm_tooltip.cc index e19a58c64d4..8f0605a8543 100644 --- a/source/blender/windowmanager/intern/wm_tooltip.cc +++ b/source/blender/windowmanager/intern/wm_tooltip.cc @@ -16,6 +16,8 @@ #include "BKE_context.hh" +#include "ED_screen.hh" + #include "UI_interface.hh" #include "WM_api.hh" @@ -86,7 +88,7 @@ void WM_tooltip_clear(bContext *C, wmWindow *win) if (screen->tool_tip->region) { UI_tooltip_free(C, screen, screen->tool_tip->region); screen->tool_tip->region = nullptr; - g_tooltip_time_closed = BLI_time_now_seconds(); + g_tooltip_time_closed = BLI_check_seconds_timer(); } MEM_freeN(screen->tool_tip); screen->tool_tip = nullptr; diff --git a/source/blender/windowmanager/intern/wm_uilist_type.cc b/source/blender/windowmanager/intern/wm_uilist_type.cc index 9dabc44a8fb..267b0649cc1 100644 --- a/source/blender/windowmanager/intern/wm_uilist_type.cc +++ b/source/blender/windowmanager/intern/wm_uilist_type.cc @@ -153,6 +153,6 @@ const char *WM_uilisttype_list_id_get(const uiListType *ult, uiList *list) { /* Some sanity check for the assumed behavior of #WM_uilisttype_to_full_list_id(). */ BLI_assert((list->list_id + strlen(ult->idname))[0] == '_'); - /* +1 to skip the '_'. */ + /* +1 to skip the '_' */ return list->list_id + strlen(ult->idname) + 1; } diff --git a/source/blender/windowmanager/intern/wm_window.cc b/source/blender/windowmanager/intern/wm_window.cc index ba744ea3cc9..1ab22ec55a9 100644 --- a/source/blender/windowmanager/intern/wm_window.cc +++ b/source/blender/windowmanager/intern/wm_window.cc @@ -31,15 +31,15 @@ #include "BLI_time.h" #include "BLI_utildefines.h" -#include "BLT_translation.hh" +#include "BLT_translation.h" #include "BKE_blender_version.h" #include "BKE_context.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_icons.h" #include "BKE_layer.hh" #include "BKE_main.hh" -#include "BKE_report.hh" +#include "BKE_report.h" #include "BKE_screen.hh" #include "BKE_workspace.h" @@ -85,12 +85,12 @@ #include "UI_resources.hh" -/* For assert. */ +/* for assert */ #ifndef NDEBUG # include "BLI_threads.h" #endif -/* The global to talk to GHOST. */ +/* the global to talk to ghost */ static GHOST_SystemHandle g_system = nullptr; #if !(defined(WIN32) || defined(__APPLE__)) static const char *g_system_backend_id = nullptr; @@ -189,7 +189,7 @@ bool wm_get_desktopsize(int *r_width, int *r_height) return true; } -/** Keeps size within monitor bounds. */ +/* keeps size within monitor bounds */ static void wm_window_check_size(rcti *rect) { int width, height; @@ -233,7 +233,7 @@ static void wm_ghostwindow_destroy(wmWindowManager *wm, wmWindow *win) void wm_window_free(bContext *C, wmWindowManager *wm, wmWindow *win) { - /* Update context. */ + /* update context */ if (C) { WM_event_remove_handlers(C, &win->handlers); WM_event_remove_handlers(C, &win->modalhandlers); @@ -245,7 +245,7 @@ void wm_window_free(bContext *C, wmWindowManager *wm, wmWindow *win) BKE_screen_area_map_free(&win->global_areas); - /* End running jobs, a job end also removes its timer. */ + /* end running jobs, a job end also removes its timer */ LISTBASE_FOREACH_MUTABLE (wmTimer *, wt, &wm->timers) { if (wt->flags & WM_TIMER_TAGGED_FOR_REMOVAL) { continue; @@ -255,7 +255,7 @@ void wm_window_free(bContext *C, wmWindowManager *wm, wmWindow *win) } } - /* Timer removing, need to call this api function. */ + /* timer removing, need to call this api function */ LISTBASE_FOREACH_MUTABLE (wmTimer *, wt, &wm->timers) { if (wt->flags & WM_TIMER_TAGGED_FOR_REMOVAL) { continue; @@ -443,7 +443,7 @@ void wm_window_close(bContext *C, wmWindowManager *wm, wmWindow *win) return; } - /* Close child windows. */ + /* Close child windows */ LISTBASE_FOREACH_MUTABLE (wmWindow *, iter_win, &wm->windows) { if (iter_win->parent == win) { wm_window_close(C, wm, iter_win); @@ -456,12 +456,12 @@ void wm_window_close(bContext *C, wmWindowManager *wm, wmWindow *win) BLI_remlink(&wm->windows, win); - CTX_wm_window_set(C, win); /* Needed by handlers. */ + CTX_wm_window_set(C, win); /* needed by handlers */ WM_event_remove_handlers(C, &win->handlers); WM_event_remove_handlers(C, &win->modalhandlers); - /* For regular use this will _never_ be nullptr, + /* for regular use this will _never_ be nullptr, * however we may be freeing an improperly initialized window. */ if (screen) { ED_screen_exit(C, win, screen); @@ -469,7 +469,7 @@ void wm_window_close(bContext *C, wmWindowManager *wm, wmWindow *win) wm_window_free(C, wm, win); - /* If temp screen, delete it after window free (it stops jobs that can access it). */ + /* if temp screen, delete it after window free (it stops jobs that can access it) */ if (screen && screen->temp) { Main *bmain = CTX_data_main(C); @@ -544,7 +544,7 @@ void WM_window_set_dpi(const wmWindow *win) auto_dpi = max_ff(auto_dpi, 96.0f); /* Lazily init UI scale size, preserving backwards compatibility by - * computing UI scale from ratio of previous DPI and auto DPI. */ + * computing UI scale from ratio of previous DPI and auto DPI */ if (U.ui_scale == 0) { int virtual_pixel = (U.virtual_pixel == VIRTUAL_PIXEL_NATIVE) ? 1 : 2; @@ -701,7 +701,7 @@ static void wm_window_ensure_eventstate(wmWindow *win) wm_window_update_eventstate(win); } -/* Belongs to below. */ +/* belongs to below */ static void wm_window_ghostwindow_add(wmWindowManager *wm, const char *title, wmWindow *win, @@ -751,7 +751,7 @@ static void wm_window_ghostwindow_add(wmWindowManager *wm, win->gpuctx = GPU_context_create(ghostwin, nullptr); GPU_render_begin(); - /* Needed so we can detect the graphics card below. */ + /* needed so we can detect the graphics card below */ GPU_init(); /* Set window as drawable upon creation. Note this has already been @@ -759,15 +759,15 @@ static void wm_window_ghostwindow_add(wmWindowManager *wm, wm_window_set_drawable(wm, win, false); win->ghostwin = ghostwin; - GHOST_SetWindowUserData(ghostwin, win); /* Pointer back. */ + GHOST_SetWindowUserData(ghostwin, win); /* pointer back */ wm_window_ensure_eventstate(win); - /* Store actual window size in blender window. */ + /* store actual window size in blender window */ GHOST_RectangleHandle bounds = GHOST_GetClientBounds( static_cast(win->ghostwin)); - /* WIN32: gives undefined window size when minimized. */ + /* win32: gives undefined window size when minimized */ if (GHOST_GetWindowState(static_cast(win->ghostwin)) != GHOST_kWindowStateMinimized) { @@ -777,20 +777,20 @@ static void wm_window_ghostwindow_add(wmWindowManager *wm, GHOST_DisposeRectangle(bounds); #ifndef __APPLE__ - /* Set the state here, so minimized state comes up correct on windows. */ + /* set the state here, so minimized state comes up correct on windows */ if (wm_init_state.window_focus) { GHOST_SetWindowState(ghostwin, (GHOST_TWindowState)win->windowstate); } #endif - /* Until screens get drawn, make it nice gray. */ + /* until screens get drawn, make it nice gray */ GPU_clear_color(0.25f, 0.25f, 0.25f, 1.0f); - /* Needed here, because it's used before it reads userdef. */ + /* needed here, because it's used before it reads userdef */ WM_window_set_dpi(win); wm_window_swap_buffers(win); - /* Clear double buffer to avoids flickering of new windows on certain drivers, see #97600. */ + /* Clear double buffer to avoids flickering of new windows on certain drivers. (See #97600) */ GPU_clear_color(0.25f, 0.25f, 0.25f, 1.0f); GPU_render_end(); @@ -823,7 +823,7 @@ static void wm_window_ghostwindow_ensure(wmWindowManager *wm, wmWindow *win, boo wm_init_state.override_flag &= ~WIN_OVERRIDE_WINSTATE; } - /* Without this, cursor restore may fail, see: #45456. */ + /* without this, cursor restore may fail, #45456 */ if (win->cursor == 0) { win->cursor = WM_CURSOR_DEFAULT; } @@ -841,7 +841,7 @@ static void wm_window_ghostwindow_ensure(wmWindowManager *wm, wmWindow *win, boo WM_window_set_dpi(win); } - /* Add key-map handlers (1 handler for all keys in map!). */ + /* add keymap handlers (1 handler for all keys in map!) */ wmKeyMap *keymap = WM_keymap_ensure(wm->defaultconf, "Window", SPACE_EMPTY, RGN_TYPE_WINDOW); WM_event_add_keymap_handler(&win->handlers, keymap); @@ -879,7 +879,7 @@ void wm_window_ghostwindows_ensure(wmWindowManager *wm) /* NOTE: this isn't quite correct, active screen maybe offset 1000s if PX, * we'd need a #wm_get_screensize like function that gives offset, - * in practice the window manager will likely move to the correct monitor. */ + * in practice the window manager will likely move to the correct monitor */ wm_init_state.start_x = 0; wm_init_state.start_y = 0; } @@ -958,7 +958,7 @@ wmWindow *WM_window_open(bContext *C, const float native_pixel_size = GHOST_GetNativePixelSize( static_cast(win_prev->ghostwin)); - /* Convert to native OS window coordinates. */ + /* 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; @@ -981,7 +981,7 @@ wmWindow *WM_window_open(bContext *C, rect.xmax = rect.xmin + sizex; rect.ymax = rect.ymin + sizey; - /* Changes rect to fit within desktop. */ + /* changes rect to fit within desktop */ wm_window_check_size(&rect); /* Reuse temporary windows when they share the same single area. */ @@ -999,7 +999,7 @@ wmWindow *WM_window_open(bContext *C, } } - /* Add new window? */ + /* add new window? */ if (win == nullptr) { win = wm_window_new(bmain, wm, toplevel ? nullptr : win_prev, dialog); win->posx = rect.xmin; @@ -1017,7 +1017,7 @@ wmWindow *WM_window_open(bContext *C, } if (screen == nullptr) { - /* Add new screen layout. */ + /* add new screen layout */ WorkSpace *workspace = WM_window_get_active_workspace(win); WorkSpaceLayout *layout = ED_workspace_layout_add(bmain, workspace, win, "temp"); @@ -1034,7 +1034,7 @@ wmWindow *WM_window_open(bContext *C, screen->temp = temp; - /* Make window active, and validate/resize. */ + /* make window active, and validate/resize */ CTX_wm_window_set(C, win); const bool new_window = (win->ghostwin == nullptr); if (new_window) { @@ -1086,7 +1086,7 @@ wmWindow *WM_window_open(bContext *C, return win; } - /* Very unlikely! but opening a new window can fail. */ + /* very unlikely! but opening a new window can fail */ wm_window_close(C, wm, win); CTX_wm_window_set(C, win_prev); @@ -1272,7 +1272,7 @@ void wm_window_make_drawable(wmWindowManager *wm, wmWindow *win) } if (win->ghostwin) { - /* This can change per window. */ + /* this can change per window */ WM_window_set_dpi(win); } } @@ -1450,14 +1450,14 @@ static bool ghost_event_proc(GHOST_EventHandle ghost_event, GHOST_TUserDataPtr C wm->winactive = win; win->active = 1; - /* Zero the `keymodifier`, it hangs on hotkeys that open windows otherwise. */ + /* keymodifier zero, it hangs on hotkeys that open windows otherwise */ win->eventstate->keymodifier = 0; - win->addmousemove = 1; /* Enables highlighted buttons. */ + win->addmousemove = 1; /* enables highlighted buttons */ wm_window_make_drawable(wm, win); - /* Window might be focused by mouse click in configuration of window manager + /* window might be focused by mouse click in configuration of window manager * when focus is not following mouse * click could have been done on a button and depending on window manager settings * click would be passed to blender or not, but in any case button under cursor @@ -1515,7 +1515,7 @@ static bool ghost_event_proc(GHOST_EventHandle ghost_event, GHOST_TUserDataPtr C WM_window_set_dpi(win); - /* WIN32: gives undefined window size when minimized. */ + /* win32: gives undefined window size when minimized */ if (state != GHOST_kWindowStateMinimized) { /* * Ghost sometimes send size or move events when the window hasn't changed. @@ -1527,7 +1527,7 @@ static bool ghost_event_proc(GHOST_EventHandle ghost_event, GHOST_TUserDataPtr C if (wm_window_update_size_position(win)) { const bScreen *screen = WM_window_get_active_screen(win); - /* Debug prints. */ + /* debug prints */ if (G.debug & G_DEBUG_EVENTS) { const char *state_str; state = GHOST_GetWindowState(static_cast(win->ghostwin)); @@ -1579,11 +1579,11 @@ static bool ghost_event_proc(GHOST_EventHandle ghost_event, GHOST_TUserDataPtr C case GHOST_kEventWindowDPIHintChanged: { WM_window_set_dpi(win); - /* Font's are stored at each DPI level, without this we can easy load 100's of fonts. */ + /* font's are stored at each DPI level, without this we can easy load 100's of fonts */ BLF_cache_clear(); - WM_main_add_notifier(NC_WINDOW, nullptr); /* Full redraw. */ - WM_main_add_notifier(NC_SCREEN | NA_EDITED, nullptr); /* Refresh region sizes. */ + WM_main_add_notifier(NC_WINDOW, nullptr); /* full redraw */ + WM_main_add_notifier(NC_SCREEN | NA_EDITED, nullptr); /* refresh region sizes */ break; } @@ -1592,7 +1592,8 @@ static bool ghost_event_proc(GHOST_EventHandle ghost_event, GHOST_TUserDataPtr C if (path) { wmOperatorType *ot = WM_operatortype_find("WM_OT_open_mainfile", false); - /* Operator needs a valid window in context, ensures it is correctly set. */ + /* operator needs a valid window in context, ensures + * it is correctly set */ CTX_wm_window_set(C, win); PointerRNA props_ptr; @@ -1615,9 +1616,9 @@ static bool ghost_event_proc(GHOST_EventHandle ghost_event, GHOST_TUserDataPtr C wm_window_update_eventstate(win); wmEvent event; - wm_event_init_from_window(win, &event); /* Copy last state, like mouse coords. */ + wm_event_init_from_window(win, &event); /* copy last state, like mouse coords */ - /* Activate region. */ + /* activate region */ event.type = MOUSEMOVE; event.val = KM_NOTHING; copy_v2_v2_int(event.prev_xy, event.xy); @@ -1637,7 +1638,7 @@ static bool ghost_event_proc(GHOST_EventHandle ghost_event, GHOST_TUserDataPtr C wm_event_add(win, &event); - /* Make blender drop event with custom data pointing to wm drags. */ + /* make blender drop event with custom data pointing to wm drags */ event.type = EVT_DROP; event.val = KM_RELEASE; event.custom = EVT_DATA_DRAGDROP; @@ -1648,7 +1649,7 @@ static bool ghost_event_proc(GHOST_EventHandle ghost_event, GHOST_TUserDataPtr C // printf("Drop detected\n"); - /* Add drag data to wm for paths. */ + /* add drag data to wm for paths: */ if (ddd->dataType == GHOST_kDragnDropTypeFilenames) { const GHOST_TStringArray *stra = static_cast(ddd->data); @@ -1662,15 +1663,10 @@ static bool ghost_event_proc(GHOST_EventHandle ghost_event, GHOST_TUserDataPtr C int icon = ED_file_extension_icon((char *)stra->strings[0]); wmDragPath *path_data = WM_drag_create_path_data( blender::Span((char **)stra->strings, stra->count)); - WM_event_start_drag(C, icon, WM_DRAG_PATH, path_data, WM_DRAG_NOP); + WM_event_start_drag(C, icon, WM_DRAG_PATH, path_data, 0.0, WM_DRAG_NOP); /* Void pointer should point to string, it makes a copy. */ } } - else if (ddd->dataType == GHOST_kDragnDropTypeString) { - /* Drop an arbitrary string. */ - std::string *str = MEM_new(__func__, static_cast(ddd->data)); - WM_event_start_drag(C, ICON_NONE, WM_DRAG_STRING, str, WM_DRAG_FREE_DATA); - } break; } @@ -1700,7 +1696,7 @@ static bool ghost_event_proc(GHOST_EventHandle ghost_event, GHOST_TUserDataPtr C case GHOST_kEventButtonUp: { if (win->active == 0) { /* Entering window, update cursor/tablet state & modifiers. - * (ghost sends win-activate *after* the mouse-click in window!). */ + * (ghost sends win-activate *after* the mouse-click in window!) */ wm_window_update_eventstate_modifiers(wm, win, event_time_ms); wm_window_update_eventstate(win); } @@ -1730,7 +1726,7 @@ static bool wm_window_timers_process(const bContext *C, int *sleep_us_p) { Main *bmain = CTX_data_main(C); wmWindowManager *wm = CTX_wm_manager(C); - const double time = BLI_time_now_seconds(); + const double time = BLI_check_seconds_timer(); bool has_event = false; const int sleep_us = *sleep_us_p; @@ -1837,11 +1833,11 @@ void wm_window_events_process(const bContext *C) * events are typically generated from a timer that runs in the main loop. */ if ((has_event == false) && (sleep_us != 0) && !(G.f & G_FLAG_EVENT_SIMULATE)) { if (sleep_us == sleep_us_default) { - /* NOTE(@ideasman42): prefer #BLI_time_sleep_ms over `sleep_for(..)` in the common case + /* NOTE(@ideasman42): prefer #BLI_sleep_ms over `sleep_for(..)` in the common case * because this function uses lower resolution (millisecond) resolution sleep timers * which are tried & true for the idle loop. We could move to C++ `sleep_for(..)` * if this works well on all platforms but this needs further testing. */ - BLI_time_sleep_ms(sleep_us_default / 1000); + BLI_sleep_ms(sleep_us_default / 1000); } else { /* The time was shortened to resume for the upcoming timer, use a high resolution sleep. @@ -2027,7 +2023,7 @@ void wm_test_opengl_deprecation_warning(bContext *C) wmWindowManager *wm = CTX_wm_manager(C); wmWindow *win = static_cast((wm->winactive) ? wm->winactive : wm->windows.first); - BKE_report(&wm->runtime->reports, + BKE_report(&wm->reports, RPT_ERROR, "One of the add-ons or scripts is using OpenGL and will not work correct on Metal. " "Please contact the developer of the add-on to migrate to use 'gpu' module"); @@ -2101,18 +2097,13 @@ void WM_event_timer_sleep(wmWindowManager *wm, wmWindow * /*win*/, wmTimer *time timer->sleep = do_sleep; } -wmTimer *WM_event_timer_add(wmWindowManager *wm, - wmWindow *win, - const int event_type, - const double time_step) +wmTimer *WM_event_timer_add(wmWindowManager *wm, wmWindow *win, int event_type, double time_step) { - BLI_assert(ISTIMER(event_type)); - wmTimer *wt = static_cast(MEM_callocN(sizeof(wmTimer), "window timer")); BLI_assert(time_step >= 0.0f); wt->event_type = event_type; - wt->time_last = BLI_time_now_seconds(); + wt->time_last = BLI_check_seconds_timer(); wt->time_next = wt->time_last + time_step; wt->time_start = wt->time_last; wt->time_step = time_step; @@ -2125,14 +2116,14 @@ wmTimer *WM_event_timer_add(wmWindowManager *wm, wmTimer *WM_event_timer_add_notifier(wmWindowManager *wm, wmWindow *win, - const uint type, - const double time_step) + uint type, + double time_step) { wmTimer *wt = static_cast(MEM_callocN(sizeof(wmTimer), "window timer")); BLI_assert(time_step >= 0.0f); wt->event_type = TIMERNOTIFIER; - wt->time_last = BLI_time_now_seconds(); + wt->time_last = BLI_check_seconds_timer(); wt->time_next = wt->time_last + time_step; wt->time_start = wt->time_last; wt->time_step = time_step; @@ -2186,8 +2177,8 @@ void WM_event_timer_remove(wmWindowManager *wm, wmWindow * /*win*/, wmTimer *tim timer->flags |= WM_TIMER_TAGGED_FOR_REMOVAL; /* Clear existing references to the timer. */ - if (wm->runtime->reports.reporttimer == timer) { - wm->runtime->reports.reporttimer = nullptr; + if (wm->reports.reporttimer == timer) { + wm->reports.reporttimer = nullptr; } /* There might be events in queue with this timer as customdata. */ LISTBASE_FOREACH (wmWindow *, win, &wm->windows) { @@ -2306,12 +2297,12 @@ static char *wm_clipboard_text_get_ex(bool selection, buf_len -= BLI_str_utf8_invalid_strip(buf, buf_len); } - /* Always convert from `\r\n` to `\n`. */ + /* always convert from \r\n to \n */ char *newbuf = static_cast(MEM_mallocN(buf_len + 1, __func__)); char *p2 = newbuf; if (firstline) { - /* Will return an over-allocated value in the case there are newlines. */ + /* will return an over-alloc'ed value in the case there are newlines */ for (char *p = buf; *p; p++) { if (!ELEM(*p, '\n', '\r')) { *(p2++) = *p; @@ -2331,7 +2322,7 @@ static char *wm_clipboard_text_get_ex(bool selection, *p2 = '\0'; - free(buf); /* GHOST uses regular malloc. */ + free(buf); /* ghost uses regular malloc */ *r_len = (p2 - newbuf); @@ -2352,7 +2343,7 @@ void WM_clipboard_text_set(const char *buf, bool selection) { if (!G.background) { #ifdef _WIN32 - /* Do conversion from `\n` to `\r\n` on Windows. */ + /* do conversion from \n to \r\n on Windows */ const char *p; char *p2, *newbuf; int newlen = 0; @@ -2488,7 +2479,7 @@ void wm_window_lower(wmWindow *win) void wm_window_raise(wmWindow *win) { - /* Restore window if minimized. */ + /* Restore window if minimized */ if (GHOST_GetWindowState(static_cast(win->ghostwin)) == GHOST_kWindowStateMinimized) { @@ -2563,8 +2554,8 @@ wmWindow *WM_window_find_by_area(wmWindowManager *wm, const ScrArea *area) void WM_init_state_size_set(int stax, int stay, int sizx, int sizy) { - wm_init_state.start_x = stax; /* Left hand position. */ - wm_init_state.start_y = stay; /* Bottom position. */ + wm_init_state.start_x = stax; /* left hand pos */ + wm_init_state.start_y = stay; /* bottom pos */ wm_init_state.size_x = sizx < 640 ? 640 : sizx; wm_init_state.size_y = sizy < 480 ? 480 : sizy; wm_init_state.override_flag |= WIN_OVERRIDE_GEOM; @@ -2880,7 +2871,7 @@ void WM_window_set_active_layout(wmWindow *win, WorkSpace *workspace, WorkSpaceL bScreen *WM_window_get_active_screen(const wmWindow *win) { const WorkSpace *workspace = WM_window_get_active_workspace(win); - /* May be null in rare cases like closing Blender. */ + /* May be nullptr in rare cases like closing Blender */ return (LIKELY(workspace != nullptr) ? BKE_workspace_active_screen_get(win->workspace_hook) : nullptr); } diff --git a/source/blender/windowmanager/message_bus/intern/wm_message_bus.cc b/source/blender/windowmanager/message_bus/intern/wm_message_bus.cc index c0b37c69444..8d1e8dd0eee 100644 --- a/source/blender/windowmanager/message_bus/intern/wm_message_bus.cc +++ b/source/blender/windowmanager/message_bus/intern/wm_message_bus.cc @@ -184,7 +184,7 @@ void WM_msg_publish_with_key(wmMsgBus *mbus, wmMsgSubscribeKey *msg_key) BLI_listbase_count(&msg_key->values)); LISTBASE_FOREACH (wmMsgSubscribeValueLink *, msg_lnk, &msg_key->values) { - if (false) { /* Make an option? */ + if (false) { /* make an option? */ msg_lnk->params.notify(nullptr, msg_key, &msg_lnk->params); } else { diff --git a/source/blender/windowmanager/message_bus/intern/wm_message_bus_rna.cc b/source/blender/windowmanager/message_bus/intern/wm_message_bus_rna.cc index 64a814da979..460c94a7a82 100644 --- a/source/blender/windowmanager/message_bus/intern/wm_message_bus_rna.cc +++ b/source/blender/windowmanager/message_bus/intern/wm_message_bus_rna.cc @@ -294,10 +294,10 @@ void WM_msg_subscribe_rna_params(wmMsgBus *mbus, { wmMsgSubscribeKey_RNA msg_key_test = {{nullptr}}; - /* Use when added. */ + /* use when added */ msg_key_test.msg.head.id = id_repr; msg_key_test.msg.head.type = WM_MSG_TYPE_RNA; - /* For lookup. */ + /* for lookup */ msg_key_test.msg.params = *msg_key_params; const char *none = ""; diff --git a/source/blender/windowmanager/message_bus/intern/wm_message_bus_static.cc b/source/blender/windowmanager/message_bus/intern/wm_message_bus_static.cc index a60d458494b..249c09288f1 100644 --- a/source/blender/windowmanager/message_bus/intern/wm_message_bus_static.cc +++ b/source/blender/windowmanager/message_bus/intern/wm_message_bus_static.cc @@ -108,10 +108,10 @@ void WM_msg_subscribe_static_params(wmMsgBus *mbus, { wmMsgSubscribeKey_Static msg_key_test = {{nullptr}}; - /* Use when added. */ + /* use when added */ msg_key_test.msg.head.id = id_repr; msg_key_test.msg.head.type = WM_MSG_TYPE_STATIC; - /* For lookup. */ + /* for lookup */ msg_key_test.msg.params = *msg_key_params; WM_msg_subscribe_with_key(mbus, &msg_key_test.head, msg_val_params); diff --git a/source/blender/windowmanager/message_bus/wm_message_bus.hh b/source/blender/windowmanager/message_bus/wm_message_bus.hh index 49bd39be248..0cedc4631a0 100644 --- a/source/blender/windowmanager/message_bus/wm_message_bus.hh +++ b/source/blender/windowmanager/message_bus/wm_message_bus.hh @@ -47,7 +47,7 @@ struct wmMsgTypeInfo { void (*remove_by_id)(wmMsgBus *mbus, const ID *id); void (*repr)(FILE *stream, const wmMsgSubscribeKey *msg_key); - /* `sizeof(wmMsgSubscribeKey_*)`. */ + /* sizeof(wmMsgSubscribeKey_*) */ uint msg_key_size; }; @@ -63,11 +63,11 @@ struct wmMsgSubscribeKey { /** Linked list for predictable ordering, otherwise we would depend on #GHash bucketing. */ wmMsgSubscribeKey *next, *prev; ListBase values; - /* Over-allocate, eg: #wmMsgSubscribeKey_RNA. */ - /* Last member will be `wmMsg_*`. */ + /* Over-allocate, eg: #wmMsgSubscribeKey_RNA */ + /* Last member will be 'wmMsg_*' */ }; -/** One of many in #wmMsgSubscribeKey.values. */ +/** One of many in #wmMsgSubscribeKey.values */ struct wmMsgSubscribeValue { wmMsgSubscribeValue *next, *prev; @@ -76,19 +76,19 @@ struct wmMsgSubscribeValue { /** User data, can be whatever we like, free using the 'free_data' callback if it's owned. */ void *user_data; - /** Callbacks. */ + /** Callbacks */ wmMsgNotifyFn notify; wmMsgSubscribeValueUpdateIdFn update_id; wmMsgSubscribeValueFreeDataFn free_data; /** Keep this subscriber if possible. */ uint is_persistent : 1; - /* Tag to run when handling events, + /* tag to run when handling events, * we may want option for immediate execution. */ uint tag : 1; }; -/** One of many in #wmMsgSubscribeKey.values. */ +/** One of many in #wmMsgSubscribeKey.values */ struct wmMsgSubscribeValueLink { wmMsgSubscribeValueLink *next, *prev; wmMsgSubscribeValue params; @@ -126,7 +126,7 @@ void WM_msg_id_remove(wmMsgBus *mbus, const ID *id); /* `wm_message_bus_static.cc` */ enum { - /* Generic window redraw. */ + /* generic window redraw */ WM_MSG_STATICTYPE_WINDOW_DRAW = 0, WM_MSG_STATICTYPE_SCREEN_EDIT = 1, WM_MSG_STATICTYPE_FILE_READ = 2, @@ -137,7 +137,7 @@ struct wmMsgParams_Static { }; struct wmMsg_Static { - wmMsg head; /* Keep first. */ + wmMsg head; /* keep first */ wmMsgParams_Static params; }; @@ -152,7 +152,7 @@ wmMsgSubscribeKey_Static *WM_msg_lookup_static(wmMsgBus *mbus, const wmMsgParams_Static *msg_key_params); void WM_msg_publish_static_params(wmMsgBus *mbus, const wmMsgParams_Static *msg_key_params); void WM_msg_publish_static(wmMsgBus *mbus, - /* #wmMsgParams_Static (expanded). */ + /* wmMsgParams_Static (expanded) */ int event); void WM_msg_subscribe_static_params(wmMsgBus *mbus, const wmMsgParams_Static *msg_key_params, @@ -167,9 +167,9 @@ void WM_msg_subscribe_static(wmMsgBus *mbus, /* `wm_message_bus_rna.cc` */ struct wmMsgParams_RNA { - /** When #PointerRNA.data & owner_id are NULL. match against all. */ + /** when #PointerRNA.data & owner_id are NULL. match against all. */ PointerRNA ptr; - /** When NULL, match against any property. */ + /** when NULL, match against any property. */ const PropertyRNA *prop; /** @@ -180,7 +180,7 @@ struct wmMsgParams_RNA { }; struct wmMsg_RNA { - wmMsg head; /* Keep first. */ + wmMsg head; /* keep first */ wmMsgParams_RNA params; }; @@ -194,7 +194,7 @@ void WM_msgtypeinfo_init_rna(wmMsgTypeInfo *msgtype_info); wmMsgSubscribeKey_RNA *WM_msg_lookup_rna(wmMsgBus *mbus, const wmMsgParams_RNA *msg_key_params); void WM_msg_publish_rna_params(wmMsgBus *mbus, const wmMsgParams_RNA *msg_key_params); void WM_msg_publish_rna(wmMsgBus *mbus, - /* #wmMsgParams_RNA (expanded). */ + /* wmMsgParams_RNA (expanded) */ PointerRNA *ptr, PropertyRNA *prop); void WM_msg_subscribe_rna_params(wmMsgBus *mbus, @@ -207,7 +207,7 @@ void WM_msg_subscribe_rna(wmMsgBus *mbus, const wmMsgSubscribeValue *msg_val_params, const char *id_repr); -/* ID variants. */ +/* ID variants */ void WM_msg_subscribe_ID(wmMsgBus *mbus, ID *id, const wmMsgSubscribeValue *msg_val_params, @@ -231,7 +231,7 @@ void WM_msg_publish_ID(wmMsgBus *mbus, ID *id); } \ ((void)0) -/* Anonymous variants (for convenience). */ +/* Anonymous variants (for convenience) */ #define WM_msg_subscribe_rna_anon_type(mbus, type_, value) \ { \ PointerRNA msg_ptr_ = {0, &RNA_##type_}; \ diff --git a/source/blender/windowmanager/wm.hh b/source/blender/windowmanager/wm.hh index 68dcc5fa255..a0c9b5cd599 100644 --- a/source/blender/windowmanager/wm.hh +++ b/source/blender/windowmanager/wm.hh @@ -50,7 +50,7 @@ extern void wm_clear_default_size(bContext *C); */ void wm_operator_register(bContext *C, wmOperator *op); -/* `wm_operator.cc`, for init/exit. */ +/* wm_operator.c, for init/exit */ void wm_operatortype_free(); /** @@ -84,7 +84,7 @@ void wm_jobs_timer(wmWindowManager *wm, wmTimer *wt); */ void wm_jobs_timer_end(wmWindowManager *wm, wmTimer *wt); -/* `wm_files.cc`. */ +/* wm_files.cc */ /** * Run the auto-save timer action. diff --git a/source/blender/windowmanager/wm_event_system.hh b/source/blender/windowmanager/wm_event_system.hh index 9cdddb97d35..497417e5320 100644 --- a/source/blender/windowmanager/wm_event_system.hh +++ b/source/blender/windowmanager/wm_event_system.hh @@ -23,9 +23,9 @@ enum wmOperatorCallContext; struct wmXrActionData; #endif -/* #wmKeyMap is in `DNA_windowmanager.h`, it's saveable. */ +/* wmKeyMap is in DNA_windowmanager.h, it's saveable */ -/** Custom types for handlers, for signaling, freeing. */ +/** Custom types for handlers, for signaling, freeing */ enum eWM_EventHandlerType { WM_HANDLER_TYPE_GIZMO = 1, WM_HANDLER_TYPE_UI, @@ -57,7 +57,7 @@ struct wmEventHandler_KeymapDynamic { void *user_data; }; -/** #WM_HANDLER_TYPE_KEYMAP. */ +/** #WM_HANDLER_TYPE_KEYMAP */ struct wmEventHandler_Keymap { wmEventHandler head; @@ -70,7 +70,7 @@ struct wmEventHandler_Keymap { bToolRef *keymap_tool; }; -/** #WM_HANDLER_TYPE_GIZMO. */ +/** #WM_HANDLER_TYPE_GIZMO */ struct wmEventHandler_Gizmo { wmEventHandler head; @@ -78,16 +78,13 @@ struct wmEventHandler_Gizmo { struct wmGizmoMap *gizmo_map; }; -/** #WM_HANDLER_TYPE_UI. */ +/** #WM_HANDLER_TYPE_UI */ struct wmEventHandler_UI { wmEventHandler head; - /** Callback receiving events. */ - wmUIHandlerFunc handle_fn; - /** Callback when handler is removed. */ - wmUIHandlerRemoveFunc remove_fn; - /** User data pointer. */ - void *user_data; + wmUIHandlerFunc handle_fn; /* callback receiving events */ + wmUIHandlerRemoveFunc remove_fn; /* callback when handler is removed */ + void *user_data; /* user data pointer */ /** Store context for this handler for derived/modal handlers. */ struct { @@ -97,7 +94,7 @@ struct wmEventHandler_UI { } context; }; -/** #WM_HANDLER_TYPE_OP. */ +/** #WM_HANDLER_TYPE_OP */ struct wmEventHandler_Op { wmEventHandler head; @@ -119,7 +116,7 @@ struct wmEventHandler_Op { } context; }; -/** #WM_HANDLER_TYPE_DROPBOX. */ +/** #WM_HANDLER_TYPE_DROPBOX */ struct wmEventHandler_Dropbox { wmEventHandler head; @@ -141,7 +138,7 @@ void wm_event_free_handler(wmEventHandler *handler); void wm_event_do_handlers(bContext *C); /** - * Windows store their own event queues #wmWindow.event_queue (no #bContext here). + * Windows store own event queues #wmWindow.event_queue (no #bContext here). */ void wm_event_add_ghostevent(wmWindowManager *wm, wmWindow *win, @@ -169,7 +166,7 @@ void wm_event_handler_ui_cancel_ex(bContext *C, ARegion *region, bool reactivate_button); -/* `wm_event_query.cc`. */ +/* `wm_event_query.cc` */ /** * Applies the global tablet pressure correction curve. @@ -177,7 +174,7 @@ void wm_event_handler_ui_cancel_ex(bContext *C, float wm_pressure_curve(float raw_pressure); void wm_tablet_data_from_ghost(const GHOST_TabletData *tablet_data, wmTabletData *wmtab); -/* `wm_dropbox.cc`. */ +/* wm_dropbox.c */ void wm_dropbox_free(); /** diff --git a/source/blender/windowmanager/wm_event_types.hh b/source/blender/windowmanager/wm_event_types.hh index 08472d9fc8b..2fae3eb4153 100644 --- a/source/blender/windowmanager/wm_event_types.hh +++ b/source/blender/windowmanager/wm_event_types.hh @@ -13,7 +13,7 @@ #pragma once -/** #wmEvent.customdata type. */ +/** #wmEvent.customdata type */ enum { EVT_DATA_TIMER = 2, EVT_DATA_DRAGDROP = 3, @@ -39,7 +39,7 @@ enum { * do not change the values of existing values which can be used in key-maps. */ enum { - /* Non-event, for example disabled timer. */ + /* non-event, for example disabled timer */ EVENT_NONE = 0x0000, /* ********** Start of Input devices. ********** */ @@ -47,15 +47,15 @@ enum { /* Minimum mouse value (inclusive). */ #define _EVT_MOUSE_MIN 0x0001 - /* MOUSE: 0x000x, 0x001x. */ + /* MOUSE: 0x000x, 0x001x */ LEFTMOUSE = 0x0001, MIDDLEMOUSE = 0x0002, RIGHTMOUSE = 0x0003, MOUSEMOVE = 0x0004, - /* Extra mouse buttons. */ + /* Extra mouse buttons */ BUTTON4MOUSE = 0x0007, BUTTON5MOUSE = 0x0008, - /* More mouse buttons - can't use 9 and 10 here (wheel). */ + /* More mouse buttons - can't use 9 and 10 here (wheel) */ BUTTON6MOUSE = 0x0012, BUTTON7MOUSE = 0x0013, /* Extra trackpad gestures (check #WM_EVENT_IS_CONSECUTIVE to detect motion events). */ @@ -64,10 +64,10 @@ enum { MOUSEROTATE = 0x0010, MOUSESMARTZOOM = 0x0017, - /* Defaults from ghost. */ + /* defaults from ghost */ WHEELUPMOUSE = 0x000a, WHEELDOWNMOUSE = 0x000b, - /* Mapped with userdef. */ + /* mapped with userdef */ WHEELINMOUSE = 0x000c, WHEELOUTMOUSE = 0x000d, /* Successive MOUSEMOVE's are converted to this, so we can easily @@ -78,14 +78,14 @@ enum { /* Maximum keyboard value (inclusive). */ #define _EVT_MOUSE_MAX 0x0011 /* 17 */ - /* IME event, GHOST_kEventImeCompositionStart in ghost. */ + /* IME event, GHOST_kEventImeCompositionStart in ghost */ WM_IME_COMPOSITE_START = 0x0014, - /* IME event, GHOST_kEventImeComposition in ghost. */ + /* IME event, GHOST_kEventImeComposition in ghost */ WM_IME_COMPOSITE_EVENT = 0x0015, - /* IME event, GHOST_kEventImeCompositionEnd in ghost. */ + /* IME event, GHOST_kEventImeCompositionEnd in ghost */ WM_IME_COMPOSITE_END = 0x0016, - /* Tablet/Pen Specific Events. */ + /* Tablet/Pen Specific Events */ TABLET_STYLUS = 0x001a, TABLET_ERASER = 0x001b, @@ -254,28 +254,28 @@ enum { #define _NDOF_MIN NDOF_MOTION #define _NDOF_BUTTON_MIN NDOF_BUTTON_MENU - /* These two are available from any 3Dconnexion device. */ + /* these two are available from any 3Dconnexion device */ NDOF_BUTTON_MENU = 0x0191, /* 401 */ NDOF_BUTTON_FIT = 0x0192, /* 402 */ - /* Standard views. */ + /* standard views */ NDOF_BUTTON_TOP = 0x0193, /* 403 */ NDOF_BUTTON_BOTTOM = 0x0194, /* 404 */ NDOF_BUTTON_LEFT = 0x0195, /* 405 */ NDOF_BUTTON_RIGHT = 0x0196, /* 406 */ NDOF_BUTTON_FRONT = 0x0197, /* 407 */ NDOF_BUTTON_BACK = 0x0198, /* 408 */ - /* More views. */ + /* more views */ NDOF_BUTTON_ISO1 = 0x0199, /* 409 */ NDOF_BUTTON_ISO2 = 0x019a, /* 410 */ - /* 90 degree rotations. */ + /* 90 degree rotations */ NDOF_BUTTON_ROLL_CW = 0x019b, /* 411 */ NDOF_BUTTON_ROLL_CCW = 0x019c, /* 412 */ NDOF_BUTTON_SPIN_CW = 0x019d, /* 413 */ NDOF_BUTTON_SPIN_CCW = 0x019e, /* 414 */ NDOF_BUTTON_TILT_CW = 0x019f, /* 415 */ NDOF_BUTTON_TILT_CCW = 0x01a0, /* 416 */ - /* Device control. */ + /* device control */ NDOF_BUTTON_ROTATE = 0x01a1, /* 417 */ NDOF_BUTTON_PANZOOM = 0x01a2, /* 418 */ NDOF_BUTTON_DOMINANT = 0x01a3, /* 419 */ @@ -296,7 +296,7 @@ enum { NDOF_BUTTON_8 = 0x01b1, /* 433 */ NDOF_BUTTON_9 = 0x01b2, /* 434 */ NDOF_BUTTON_10 = 0x01b3, /* 435 */ - /* More general-purpose buttons. */ + /* more general-purpose buttons */ NDOF_BUTTON_A = 0x01b4, /* 436 */ NDOF_BUTTON_B = 0x01b5, /* 437 */ NDOF_BUTTON_C = 0x01b6, /* 438 */ @@ -304,7 +304,7 @@ enum { /* Disabled as GHOST converts these to keyboard events * which use regular keyboard event handling logic. */ #if 0 - /* Keyboard emulation. */ + /* keyboard emulation */ NDOF_BUTTON_ESC = 0x01b6, /* 438 */ NDOF_BUTTON_ENTER = 0x01b7, /* 439 */ NDOF_BUTTON_DELETE = 0x01b8, /* 440 */ @@ -323,10 +323,10 @@ enum { /* ********** Start of Blender internal events. ********** */ /* XXX Those are mixed inside keyboard 'area'! */ - /* System: 0x010x. */ + /* System: 0x010x */ // INPUTCHANGE = 0x0103, /* Input connected or disconnected, (259). */ /* UNUSED. */ WINDEACTIVATE = 0x0104, /* Window is deactivated, focus lost, (260). */ - /* Timer: 0x011x. */ + /* Timer: 0x011x */ TIMER = 0x0110, /* Timer event, passed on to all queues (272). */ TIMER0 = 0x0111, /* Timer event, slot for internal use (273). */ TIMER1 = 0x0112, /* Timer event, slot for internal use (274). */ @@ -347,9 +347,9 @@ enum { /* NOTE: these values are saved in key-map files, do not change them but just add new ones. */ - /* 0x5011 is taken, see #EVT_ACTIONZONE_FULLSCREEN. */ + /* 0x5011 is taken, see EVT_ACTIONZONE_FULLSCREEN */ - /* Misc Blender internals: 0x502x. */ + /* Misc Blender internals: 0x502x */ EVT_FILESELECT = 0x5020, /* 20512 */ EVT_BUT_OPEN = 0x5021, /* 20513 */ EVT_MODAL_MAP = 0x5022, /* 20514 */ @@ -357,10 +357,10 @@ enum { /* When value is 0, re-activate, when 1, don't re-activate the button under the cursor. */ EVT_BUT_CANCEL = 0x5024, /* 20516 */ - /* Could become gizmo callback. */ + /* could become gizmo callback */ EVT_GIZMO_UPDATE = 0x5025, /* 20517 */ - /* XR events: 0x503x. */ + /* XR events: 0x503x */ EVT_XR_ACTION = 0x5030, /* 20528 */ /* ********** End of Blender internal events. ********** */ }; @@ -433,21 +433,21 @@ enum { (ISKEYMODIFIER(event_type) == false)) enum eEventType_Mask { - /** #ISKEYMODIFIER. */ + /** #ISKEYMODIFIER */ EVT_TYPE_MASK_KEYBOARD_MODIFIER = (1 << 0), - /** #ISKEYBOARD. */ + /** #ISKEYBOARD */ EVT_TYPE_MASK_KEYBOARD = (1 << 1), - /** #ISMOUSE_WHEEL. */ + /** #ISMOUSE_WHEEL */ EVT_TYPE_MASK_MOUSE_WHEEL = (1 << 2), - /** #ISMOUSE_BUTTON. */ + /** #ISMOUSE_BUTTON */ EVT_TYPE_MASK_MOUSE_GESTURE = (1 << 3), - /** #ISMOUSE_GESTURE. */ + /** #ISMOUSE_GESTURE */ EVT_TYPE_MASK_MOUSE_BUTTON = (1 << 4), - /** #ISMOUSE. */ + /** #ISMOUSE */ EVT_TYPE_MASK_MOUSE = (1 << 5), - /** #ISNDOF. */ + /** #ISNDOF */ EVT_TYPE_MASK_NDOF = (1 << 6), - /** #IS_EVENT_ACTIONZONE. */ + /** #IS_EVENT_ACTIONZONE */ EVT_TYPE_MASK_ACTIONZONE = (1 << 7), }; #define EVT_TYPE_MASK_ALL \ @@ -467,9 +467,9 @@ bool WM_event_type_mask_test(int event_type, enum eEventType_Mask mask); /** \name #wmEvent.val Values * \{ */ -/* Gestures. */ +/* Gestures */ -/* File select. */ +/* File select */ enum { EVT_FILESELECT_FULL_OPEN = 1, EVT_FILESELECT_EXEC = 2, @@ -492,7 +492,7 @@ enum { GESTURE_MODAL_SELECT = 3, GESTURE_MODAL_DESELECT = 4, - /** Circle select: when no mouse button is pressed. */ + /** Circle select: when no mouse button is pressed */ GESTURE_MODAL_NOP = 5, /** Circle select: larger brush. */ @@ -507,7 +507,7 @@ enum { GESTURE_MODAL_IN = 9, GESTURE_MODAL_OUT = 10, - /** Circle select: size brush (for trackpad event). */ + /** circle select: size brush (for trackpad event). */ GESTURE_MODAL_CIRCLE_SIZE = 11, /** Move selection area. */ diff --git a/source/blender/windowmanager/wm_files.hh b/source/blender/windowmanager/wm_files.hh index f1608936052..d62ef68dc27 100644 --- a/source/blender/windowmanager/wm_files.hh +++ b/source/blender/windowmanager/wm_files.hh @@ -20,7 +20,7 @@ struct wmOperatorType; struct wmWindow; struct wmWindowManager; -/* `wm_files.cc`. */ +/* wm_files.cc */ void wm_history_file_read(); diff --git a/source/blender/windowmanager/wm_surface.hh b/source/blender/windowmanager/wm_surface.hh index 754f17b3e99..8784519901f 100644 --- a/source/blender/windowmanager/wm_surface.hh +++ b/source/blender/windowmanager/wm_surface.hh @@ -26,7 +26,7 @@ struct wmSurface { void (*draw)(bContext *); /* To evaluate the surface's depsgraph. Called as part of the main loop. */ void (*do_depsgraph)(bContext *C); - /** Free customdata, not the surface itself (done by wm_surface API). */ + /** Free customdata, not the surface itself (done by wm_surface API) */ void (*free_data)(wmSurface *); /** Called when surface is activated for drawing (made drawable). */ @@ -35,18 +35,18 @@ struct wmSurface { void (*deactivate)(); }; -/* Create/Free. */ +/* Create/Free */ void wm_surface_add(wmSurface *surface); void wm_surface_remove(wmSurface *surface); void wm_surfaces_free(); -/* Utils. */ +/* Utils */ void wm_surfaces_iter(bContext *C, void (*cb)(bContext *, wmSurface *)); /* Evaluation. */ void wm_surfaces_do_depsgraph(bContext *C); -/* Drawing. */ +/* Drawing */ void wm_surface_make_drawable(wmSurface *surface); void wm_surface_clear_drawable(); void wm_surface_set_drawable(wmSurface *surface, bool activate); diff --git a/source/blender/windowmanager/xr/intern/wm_xr.cc b/source/blender/windowmanager/xr/intern/wm_xr.cc index e6289f5e813..62fd0c8cb30 100644 --- a/source/blender/windowmanager/xr/intern/wm_xr.cc +++ b/source/blender/windowmanager/xr/intern/wm_xr.cc @@ -10,10 +10,12 @@ * representation of the OpenXR runtime connection within the application. */ -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_idprop.h" #include "BKE_main.hh" -#include "BKE_report.hh" +#include "BKE_report.h" + +#include "DEG_depsgraph.hh" #include "DNA_scene_types.h" #include "DNA_windowmanager_types.h" @@ -22,14 +24,13 @@ #include "GHOST_C-api.h" -#ifdef WIN32 -# include "GPU_platform.h" -#endif +#include "GPU_platform.h" #include "MEM_guardedalloc.h" #include "WM_api.hh" +#include "wm_surface.hh" #include "wm_xr_intern.hh" struct wmXrErrorHandlerData { @@ -44,7 +45,7 @@ static void wm_xr_error_handler(const GHOST_XrError *error) wmWindowManager *wm = handler_data->wm; wmWindow *root_win = wm->xr.runtime ? wm->xr.runtime->session_root_win : nullptr; - BKE_reports_clear(&wm->runtime->reports); + BKE_reports_clear(&wm->reports); WM_report(RPT_ERROR, error->user_message); /* Rely on the fallback when `root_win` is nullptr. */ WM_report_banner_show(wm, root_win); @@ -62,7 +63,7 @@ bool wm_xr_init(wmWindowManager *wm) } static wmXrErrorHandlerData error_customdata; - /* Set up error handling. */ + /* Set up error handling */ error_customdata.wm = wm; GHOST_XrErrorHandler(wm_xr_error_handler, &error_customdata); @@ -95,7 +96,7 @@ bool wm_xr_init(wmWindowManager *wm) return false; } - /* Set up context callbacks. */ + /* Set up context callbacks */ GHOST_XrGraphicsContextBindFuncs(context, wm_xr_session_gpu_binding_context_create, wm_xr_session_gpu_binding_context_destroy); @@ -132,7 +133,7 @@ bool wm_xr_events_handle(wmWindowManager *wm) wm_xr_session_actions_update(wm); } - /* #wm_window_events_process() uses the return value to determine if it can put the main thread + /* wm_window_events_process() uses the return value to determine if it can put the main thread * to sleep for some milliseconds. We never want that to happen while the VR session runs on * the main thread. So always return true. */ return true; @@ -179,4 +180,4 @@ void wm_xr_runtime_data_free(wmXrRuntimeData **runtime) MEM_SAFE_FREE(*runtime); } -/** \} */ /* XR Runtime Data. */ +/** \} */ /* XR Runtime Data */ diff --git a/source/blender/windowmanager/xr/intern/wm_xr_action.cc b/source/blender/windowmanager/xr/intern/wm_xr_action.cc index c18f13e2152..f21f4cb4119 100644 --- a/source/blender/windowmanager/xr/intern/wm_xr_action.cc +++ b/source/blender/windowmanager/xr/intern/wm_xr_action.cc @@ -542,4 +542,4 @@ void WM_xr_haptic_action_stop(wmXrData *xr, GHOST_XrStopHapticAction(xr->runtime->context, action_set_name, action_name, subaction_path); } -/** \} */ /* XR-Action API. */ +/** \} */ /* XR-Action API */ diff --git a/source/blender/windowmanager/xr/intern/wm_xr_actionmap.cc b/source/blender/windowmanager/xr/intern/wm_xr_actionmap.cc index 7179f5b2cac..218dcc00487 100644 --- a/source/blender/windowmanager/xr/intern/wm_xr_actionmap.cc +++ b/source/blender/windowmanager/xr/intern/wm_xr_actionmap.cc @@ -13,11 +13,14 @@ #include #include +#include "BKE_context.hh" #include "BKE_idprop.h" #include "BLI_listbase.h" #include "BLI_string.h" +#include "GHOST_Types.h" + #include "MEM_guardedalloc.h" #include "WM_api.hh" diff --git a/source/blender/windowmanager/xr/intern/wm_xr_draw.cc b/source/blender/windowmanager/xr/intern/wm_xr_draw.cc index 15653108b46..16376818806 100644 --- a/source/blender/windowmanager/xr/intern/wm_xr_draw.cc +++ b/source/blender/windowmanager/xr/intern/wm_xr_draw.cc @@ -12,6 +12,8 @@ #include +#include "BKE_context.hh" + #include "BLI_listbase.h" #include "BLI_math_matrix.h" #include "BLI_math_rotation.h" @@ -28,6 +30,7 @@ #include "WM_api.hh" +#include "wm_surface.hh" #include "wm_xr_intern.hh" void wm_xr_pose_to_mat(const GHOST_XrPose *pose, float r_mat[4][4]) diff --git a/source/blender/windowmanager/xr/intern/wm_xr_intern.hh b/source/blender/windowmanager/xr/intern/wm_xr_intern.hh index 1b4243c539f..7eeee3171bf 100644 --- a/source/blender/windowmanager/xr/intern/wm_xr_intern.hh +++ b/source/blender/windowmanager/xr/intern/wm_xr_intern.hh @@ -33,7 +33,7 @@ struct wmXrSessionState { /** Copy of XrSessionSettings.base_pose_ data to detect changes that need * resetting to base pose. */ - char prev_base_pose_type; /* #eXRSessionBasePoseType. */ + char prev_base_pose_type; /* #eXRSessionBasePoseType */ Object *prev_base_pose_object; /** Copy of XrSessionSettings.flag created on the last draw call, stored to detect changes. */ int prev_settings_flag; @@ -59,14 +59,14 @@ struct wmXrSessionState { bool is_navigation_dirty; /** Last known controller data. */ - ListBase controllers; /* #wmXrController. */ + ListBase controllers; /* #wmXrController */ /** The currently active action set that will be updated on calls to * #wm_xr_session_actions_update(). If NULL, all action sets will be treated as active and * updated. */ struct wmXrActionSet *active_action_set; /* Name of the action set (if any) to activate before the next actions sync. */ - char active_action_set_next[64]; /* #MAX_NAME. */ + char active_action_set_next[64]; /* MAX_NAME */ }; struct wmXrRuntimeData { @@ -83,7 +83,7 @@ struct wmXrRuntimeData { wmXrSessionState session_state; wmXrSessionExitFn exit_fn; - ListBase actionmaps; /* #XrActionMap. */ + ListBase actionmaps; /* #XrActionMap */ short actactionmap; short selactionmap; }; @@ -96,7 +96,7 @@ struct wmXrViewportPair { struct wmXrSurfaceData { /** Off-screen buffers/viewports for each view. */ - ListBase viewports; /* #wmXrViewportPair. */ + ListBase viewports; /* #wmXrViewportPair */ /** Dummy region type for controller draw callback. */ struct ARegionType *controller_art; @@ -125,7 +125,7 @@ struct wmXrDrawData { struct wmXrController { struct wmXrController *next, *prev; /** OpenXR user path identifier. */ - char subaction_path[64]; /* #XR_MAX_USER_PATH_LENGTH. */ + char subaction_path[64]; /* XR_MAX_USER_PATH_LENGTH */ /** Pose (in world space) that represents the user's hand when holding the controller. */ GHOST_XrPose grip_pose; diff --git a/source/blender/windowmanager/xr/intern/wm_xr_operators.cc b/source/blender/windowmanager/xr/intern/wm_xr_operators.cc index c37d701b265..a10251a2f6b 100644 --- a/source/blender/windowmanager/xr/intern/wm_xr_operators.cc +++ b/source/blender/windowmanager/xr/intern/wm_xr_operators.cc @@ -18,7 +18,7 @@ #include "BLI_time.h" #include "BKE_context.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_idprop.h" #include "BKE_main.hh" #include "BKE_screen.hh" @@ -48,7 +48,7 @@ /** \name Operator Conditions * \{ */ -/* `op->poll`. */ +/* op->poll */ static bool wm_xr_operator_sessionactive(bContext *C) { wmWindowManager *wm = CTX_wm_manager(C); @@ -141,14 +141,14 @@ static int wm_xr_session_toggle_exec(bContext *C, wmOperator * /*op*/) static void WM_OT_xr_session_toggle(wmOperatorType *ot) { - /* Identifiers. */ + /* identifiers */ ot->name = "Toggle VR Session"; ot->idname = "WM_OT_xr_session_toggle"; ot->description = "Open a view for use with virtual reality headsets, or close it if already " "opened"; - /* Callbacks. */ + /* callbacks */ ot->exec = wm_xr_session_toggle_exec; ot->poll = ED_operator_view3d_active; @@ -327,15 +327,15 @@ static void wm_xr_grab_compute_bimanual(const wmXrActionData *actiondata, quat_to_mat3(m0, actiondata->controller_rot); quat_to_mat3(m1, actiondata->controller_rot_other); - /* X-axis is the base line between the two controllers. */ + /* x-axis is the base line between the two controllers. */ sub_v3_v3v3(x_axis_prev, data->mat_prev[3], data->mat_other_prev[3]); sub_v3_v3v3(x_axis_curr, actiondata->controller_loc, actiondata->controller_loc_other); - /* Y-axis is the average of the controllers' y-axes. */ + /* y-axis is the average of the controllers' y-axes. */ add_v3_v3v3(y_axis_prev, data->mat_prev[1], data->mat_other_prev[1]); mul_v3_fl(y_axis_prev, 0.5f); add_v3_v3v3(y_axis_curr, m0[1], m1[1]); mul_v3_fl(y_axis_curr, 0.5f); - /* Z-axis is the cross product of the two. */ + /* z-axis is the cross product of the two. */ cross_v3_v3v3(z_axis_prev, x_axis_prev, y_axis_prev); cross_v3_v3v3(z_axis_curr, x_axis_curr, y_axis_curr); /* Fix the y-axis to be orthogonal. */ @@ -571,18 +571,18 @@ static int wm_xr_navigation_grab_modal(bContext *C, wmOperator *op, const wmEven static void WM_OT_xr_navigation_grab(wmOperatorType *ot) { - /* Identifiers. */ + /* identifiers */ ot->name = "XR Navigation Grab"; ot->idname = "WM_OT_xr_navigation_grab"; ot->description = "Navigate the VR scene by grabbing with controllers"; - /* Callbacks. */ + /* callbacks */ ot->invoke = wm_xr_navigation_grab_invoke; ot->exec = wm_xr_navigation_grab_exec; ot->modal = wm_xr_navigation_grab_modal; ot->poll = wm_xr_operator_sessionactive; - /* Properties. */ + /* properties */ RNA_def_boolean( ot->srna, "lock_location", false, "Lock Location", "Prevent changes to viewer location"); RNA_def_boolean( @@ -798,7 +798,7 @@ static void wm_xr_fly_init(wmOperator *op, const wmXrData *xr) op->customdata = MEM_callocN(sizeof(XrFlyData), __func__)); WM_xr_session_state_viewer_pose_rotation_get(xr, data->viewer_rot); - data->time_prev = BLI_time_now_seconds(); + data->time_prev = BLI_check_seconds_timer(); } static void wm_xr_fly_uninit(wmOperator *op) @@ -952,7 +952,7 @@ static int wm_xr_navigation_fly_modal(bContext *C, wmOperator *op, const wmEvent GHOST_XrPose nav_pose; float nav_mat[4][4], delta[4][4], out[4][4]; - const double time_now = BLI_time_now_seconds(); + const double time_now = BLI_check_seconds_timer(); mode = (eXrFlyMode)RNA_enum_get(op->ptr, "mode"); turn = ELEM(mode, XR_FLY_TURNLEFT, XR_FLY_TURNRIGHT); @@ -1112,18 +1112,18 @@ static int wm_xr_navigation_fly_modal(bContext *C, wmOperator *op, const wmEvent static void WM_OT_xr_navigation_fly(wmOperatorType *ot) { - /* Identifiers. */ + /* identifiers */ ot->name = "XR Navigation Fly"; ot->idname = "WM_OT_xr_navigation_fly"; ot->description = "Move/turn relative to the VR viewer or controller"; - /* Callbacks. */ + /* callbacks */ ot->invoke = wm_xr_navigation_fly_invoke; ot->exec = wm_xr_navigation_fly_exec; ot->modal = wm_xr_navigation_fly_modal; ot->poll = wm_xr_operator_sessionactive; - /* Properties. */ + /* properties */ static const EnumPropertyItem fly_modes[] = { {XR_FLY_FORWARD, "FORWARD", 0, "Forward", "Move along navigation forward axis"}, {XR_FLY_BACK, "BACK", 0, "Back", "Move along navigation back axis"}, @@ -1353,18 +1353,18 @@ static int wm_xr_navigation_teleport_modal(bContext *C, wmOperator *op, const wm static void WM_OT_xr_navigation_teleport(wmOperatorType *ot) { - /* Identifiers. */ + /* identifiers */ ot->name = "XR Navigation Teleport"; ot->idname = "WM_OT_xr_navigation_teleport"; ot->description = "Set VR viewer location to controller raycast hit location"; - /* Callbacks. */ + /* callbacks */ ot->invoke = wm_xr_navigation_teleport_invoke; ot->exec = wm_xr_navigation_teleport_exec; ot->modal = wm_xr_navigation_teleport_modal; ot->poll = wm_xr_operator_sessionactive; - /* Properties. */ + /* properties */ static bool default_teleport_axes[3] = {true, true, true}; RNA_def_boolean_vector(ot->srna, @@ -1503,16 +1503,16 @@ static int wm_xr_navigation_reset_exec(bContext *C, wmOperator *op) static void WM_OT_xr_navigation_reset(wmOperatorType *ot) { - /* Identifiers. */ + /* identifiers */ ot->name = "XR Navigation Reset"; ot->idname = "WM_OT_xr_navigation_reset"; ot->description = "Reset VR navigation deltas relative to session base pose"; - /* Callbacks. */ + /* callbacks */ ot->exec = wm_xr_navigation_reset_exec; ot->poll = wm_xr_operator_sessionactive; - /* Properties. */ + /* properties */ RNA_def_boolean(ot->srna, "location", true, "Location", "Reset location deltas"); RNA_def_boolean(ot->srna, "rotation", true, "Rotation", "Reset rotation deltas"); RNA_def_boolean(ot->srna, "scale", true, "Scale", "Reset scale deltas"); diff --git a/source/blender/windowmanager/xr/intern/wm_xr_session.cc b/source/blender/windowmanager/xr/intern/wm_xr_session.cc index e67c96897db..fac8484085b 100644 --- a/source/blender/windowmanager/xr/intern/wm_xr_session.cc +++ b/source/blender/windowmanager/xr/intern/wm_xr_session.cc @@ -6,12 +6,12 @@ * \ingroup wm */ -#include "BKE_callbacks.hh" +#include "BKE_callbacks.h" #include "BKE_context.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_idprop.h" #include "BKE_main.hh" -#include "BKE_scene.hh" +#include "BKE_scene.h" #include "BKE_screen.hh" #include "BLI_listbase.h" @@ -113,8 +113,8 @@ static void wm_xr_session_begin_info_create(wmXrData *xr_data, * after the session is created but before it is started. */ r_begin_info->create_fn = wm_xr_session_create_cb; - /* WM-XR exit function, does some of its own stuff and calls callback passed to - * wm_xr_session_toggle(), to allow external code to execute its own session-exit logic. */ + /* WM-XR exit function, does some own stuff and calls callback passed to wm_xr_session_toggle(), + * to allow external code to execute its own session-exit logic. */ r_begin_info->exit_fn = wm_xr_session_exit_cb; r_begin_info->exit_customdata = xr_data; } @@ -180,7 +180,7 @@ static void wm_xr_session_base_pose_calc(const Scene *scene, float tmp_quat[4]; float tmp_eul[3]; - mat4_to_loc_quat(r_base_pose->position, tmp_quat, base_pose_object->object_to_world().ptr()); + mat4_to_loc_quat(r_base_pose->position, tmp_quat, base_pose_object->object_to_world); /* Only use rotation around Z-axis to align view with floor. */ quat_to_eul(tmp_eul, tmp_quat); @@ -231,7 +231,7 @@ wmWindow *wm_xr_session_root_window_or_fallback_get(const wmWindowManager *wm, * started from) if still available. If it's not available, use some fallback window. * * It's important that the VR session follows some existing window, otherwise it would need to have - * its own depsgraph, which is an expense we should avoid. + * an own depsgraph, which is an expense we should avoid. */ static void wm_xr_session_scene_and_depsgraph_get(const wmWindowManager *wm, Scene **r_scene, @@ -1114,7 +1114,7 @@ static void wm_xr_session_events_dispatch(wmXrData *xr, return; } - const int64_t time_now = int64_t(BLI_time_now_seconds() * 1000); + const int64_t time_now = int64_t(BLI_check_seconds_timer() * 1000); ListBase *active_modal_actions = &action_set->active_modal_actions; ListBase *active_haptic_actions = &action_set->active_haptic_actions; @@ -1303,7 +1303,7 @@ void wm_xr_session_controller_data_clear(wmXrSessionState *state) } } -/** \} */ /* XR-Session Actions. */ +/** \} */ /* XR-Session Actions */ /* -------------------------------------------------------------------- */ /** \name XR-Session Surface @@ -1501,7 +1501,7 @@ void *wm_xr_session_gpu_binding_context_create() void wm_xr_session_gpu_binding_context_destroy(GHOST_ContextHandle /*context*/) { - if (g_xr_surface) { /* Might have been freed already. */ + if (g_xr_surface) { /* Might have been freed already */ wm_surface_remove(g_xr_surface); } @@ -1522,4 +1522,4 @@ ARegionType *WM_xr_surface_controller_region_type_get() return nullptr; } -/** \} */ /* XR-Session Surface. */ +/** \} */ /* XR-Session Surface */ diff --git a/source/creator/CMakeLists.txt b/source/creator/CMakeLists.txt index 289d05c658d..7e3235e2641 100644 --- a/source/creator/CMakeLists.txt +++ b/source/creator/CMakeLists.txt @@ -152,11 +152,6 @@ set(SRC creator_intern.h ) -if(CMAKE_GENERATOR MATCHES "^Visual Studio.+") - # This helps visual studio find the debugger visualizers - list(APPEND SRC ${CMAKE_SOURCE_DIR}/tools/utils_ide/natvis/Blender.natvis) -endif() - # MSVC 2010 gives linking errors with the manifest. if(WIN32 AND NOT UNIX) add_definitions( @@ -332,31 +327,6 @@ if(WITH_PYTHON_MODULE) else() add_executable(blender ${EXETYPE} ${SRC}) - if(WITH_CPU_CHECK) - target_compile_definitions(blender PRIVATE WITH_CPU_CHECK) - # we cannot directly link against any blender libraries for the cpu_check module - # as they may have been build for an ISA that is unsupported by the CPU - # running this code. - add_library(blender_cpu_check SHARED - creator_cpu_check.cc - ) - target_link_libraries(blender_cpu_check - PRIVATE ${PLATFORM_LINKLIBS} - ) - # blender_cpu_check *NEEDS* to be linked first, there can be no exceptions - # to this, this is to ensure this will be the first code to run once the - # blender binary has been loaded by the OS. - target_link_libraries(blender PRIVATE blender_cpu_check) - if(NOT WIN32) - set(_LIB_SUB_FOLDER "lib/") - endif() - set_target_properties(blender_cpu_check - PROPERTIES - RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin/${_LIB_SUB_FOLDER}" - LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin/${_LIB_SUB_FOLDER}" - ) - unset(_LIB_SUB_FOLDER) - endif() if(WIN32) add_executable(blender-launcher WIN32 blender_launcher_win32.c @@ -619,11 +589,6 @@ if(WIN32) ${LIBDIR}/OpenImageDenoise/bin/OpenImageDenoise.dll ${LIBDIR}/OpenImageDenoise/bin/OpenImageDenoise_core.dll ${LIBDIR}/OpenImageDenoise/bin/OpenImageDenoise_device_cpu.dll - ) - endif() - if(EXISTS ${LIBDIR}/OpenImageDenoise/bin/OpenImageDenoise_device_sycl.dll) # Platforms that have SyCL support - windows_install_shared_manifest( - FILES ${LIBDIR}/OpenImageDenoise/bin/OpenImageDenoise_device_sycl.dll ) endif() @@ -725,13 +690,6 @@ if(UNIX AND NOT APPLE) DESTINATION "." ) - if(WITH_CPU_CHECK) - install( - TARGETS blender_cpu_check - DESTINATION "./lib" - ) - endif() - install( FILES ${CMAKE_SOURCE_DIR}/release/freedesktop/blender.desktop @@ -787,6 +745,7 @@ file(REMOVE ${CMAKE_BINARY_DIR}/bin/lib/libglapi.so.0.0.0)\n TARGETS blender DESTINATION "./bin" ) + # Misc files. install( FILES ${CMAKE_SOURCE_DIR}/release/freedesktop/blender.desktop @@ -1350,20 +1309,14 @@ elseif(WIN32) endif() # this will exist for 4.1 lib folders - if(CMAKE_SYSTEM_PROCESSOR STREQUAL "ARM64") - set(_openvdb_arch arm64) - else() - set(_openvdb_arch amd64) - endif() - - if(EXISTS ${LIBDIR}/openvdb/python/pyopenvdb_d.cp${_PYTHON_VERSION_NO_DOTS}-win_${_openvdb_arch}.pyd) + if(EXISTS ${LIBDIR}/openvdb/python/pyopenvdb_d.cp${_PYTHON_VERSION_NO_DOTS}-win_amd64.pyd) install( - FILES ${LIBDIR}/openvdb/python/pyopenvdb_d.cp${_PYTHON_VERSION_NO_DOTS}-win_${_openvdb_arch}.pyd + FILES ${LIBDIR}/openvdb/python/pyopenvdb_d.cp${_PYTHON_VERSION_NO_DOTS}-win_amd64.pyd DESTINATION ${TARGETDIR_VER}/python/lib/site-packages CONFIGURATIONS Debug ) install( - FILES ${LIBDIR}/openvdb/python/pyopenvdb.cp${_PYTHON_VERSION_NO_DOTS}-win_${_openvdb_arch}.pyd + FILES ${LIBDIR}/openvdb/python/pyopenvdb.cp${_PYTHON_VERSION_NO_DOTS}-win_amd64.pyd DESTINATION ${TARGETDIR_VER}/python/lib/site-packages CONFIGURATIONS Release;RelWithDebInfo;MinSizeRel ) @@ -1895,13 +1848,6 @@ if(WIN32 AND NOT WITH_PYTHON_MODULE) COMPONENT Blender DESTINATION "." ) - if(WITH_CPU_CHECK) - install( - TARGETS blender_cpu_check - COMPONENT Blender - DESTINATION "." - ) - endif() set_target_properties( blender PROPERTIES diff --git a/source/creator/creator.cc b/source/creator/creator.cc index ee0739dcd76..9390581a6f2 100644 --- a/source/creator/creator.cc +++ b/source/creator/creator.cc @@ -12,9 +12,6 @@ #ifdef WIN32 # include "utfconv.hh" # include -# ifdef WITH_CPU_CHECK -# pragma comment(linker, "/include:cpu_check_win32") -# endif #endif #if defined(WITH_TBB_MALLOC) && defined(_MSC_VER) && defined(NDEBUG) @@ -36,19 +33,18 @@ /* Mostly initialization functions. */ #include "BKE_appdir.hh" -#include "BKE_blender.hh" -#include "BKE_blender_cli_command.hh" +#include "BKE_blender.h" #include "BKE_brush.hh" -#include "BKE_cachefile.hh" -#include "BKE_callbacks.hh" +#include "BKE_cachefile.h" +#include "BKE_callbacks.h" #include "BKE_context.hh" #include "BKE_cpp_types.hh" -#include "BKE_global.hh" +#include "BKE_global.h" #include "BKE_gpencil_modifier_legacy.h" #include "BKE_idtype.hh" #include "BKE_material.h" #include "BKE_modifier.hh" -#include "BKE_node.hh" +#include "BKE_node.h" #include "BKE_particle.h" #include "BKE_shader_fx.h" #include "BKE_sound.h" @@ -69,6 +65,7 @@ #include "ED_datafiles.h" #include "WM_api.hh" +#include "WM_toolsystem.hh" #include "RNA_define.hh" @@ -281,6 +278,7 @@ int main(int argc, ) { bContext *C; + #ifndef WITH_PYTHON_MODULE bArgs *ba; #endif @@ -567,23 +565,8 @@ int main(int argc, #ifndef WITH_PYTHON_MODULE if (G.background) { - int exit_code; - if (app_state.command.argv) { - const char *id = app_state.command.argv[0]; - if (STREQ(id, "help")) { - BKE_blender_cli_command_print_help(); - exit_code = EXIT_SUCCESS; - } - else { - exit_code = BKE_blender_cli_command_exec( - C, id, app_state.command.argc - 1, app_state.command.argv + 1); - } - } - else { - exit_code = G.is_break ? EXIT_FAILURE : EXIT_SUCCESS; - } /* Using window-manager API in background-mode is a bit odd, but works fine. */ - WM_exit(C, exit_code); + WM_exit(C, G.is_break ? EXIT_FAILURE : EXIT_SUCCESS); } else { /* Shows the splash as needed. */ diff --git a/source/creator/creator_args.cc b/source/creator/creator_args.cc index 82d33d55978..53e7f807ea6 100644 --- a/source/creator/creator_args.cc +++ b/source/creator/creator_args.cc @@ -24,31 +24,33 @@ # include "BLI_dynstr.h" # include "BLI_fileops.h" # include "BLI_listbase.h" +# include "BLI_mempool.h" # include "BLI_path_util.h" # include "BLI_string.h" # include "BLI_string_utf8.h" # include "BLI_system.h" # include "BLI_threads.h" # include "BLI_utildefines.h" -# ifndef NDEBUG -# include "BLI_mempool.h" -# endif # include "BKE_appdir.hh" # include "BKE_blender_version.h" # include "BKE_blendfile.hh" # include "BKE_context.hh" -# include "BKE_global.hh" +# include "BKE_global.h" # include "BKE_image_format.h" # include "BKE_lib_id.hh" # include "BKE_main.hh" -# include "BKE_report.hh" -# include "BKE_scene.hh" +# include "BKE_report.h" +# include "BKE_scene.h" # include "BKE_sound.h" # include "GPU_context.h" +# ifdef WITH_FFMPEG +# include "IMB_imbuf.hh" +# endif + # ifdef WITH_PYTHON # include "BPY_extern_python.h" # include "BPY_extern_run.h" @@ -57,6 +59,8 @@ # include "RE_engine.h" # include "RE_pipeline.h" +# include "ED_datafiles.h" + # include "WM_api.hh" # ifdef WITH_LIBMV @@ -68,6 +72,8 @@ # endif # include "DEG_depsgraph.hh" +# include "DEG_depsgraph_build.hh" +# include "DEG_depsgraph_debug.hh" # include "WM_types.hh" @@ -698,8 +704,6 @@ static void print_help(bArgs *ba, bool all) PRINT("\n"); BLI_args_print_arg_doc(ba, "-noaudio"); BLI_args_print_arg_doc(ba, "-setaudio"); - PRINT("\n"); - BLI_args_print_arg_doc(ba, "--command"); PRINT("\n"); @@ -896,69 +900,16 @@ static int arg_handle_debug_exit_on_error(int /*argc*/, const char ** /*argv*/, return 0; } -/** Shared by `--background` & `--command`. */ -static void background_mode_set() -{ - G.background = true; - - /* Background Mode Defaults: - * - * In general background mode should strive to match the behavior of running - * Blender inside a graphical session, any exception to this should have a well - * justified reason and be noted in the doc-string. */ - - /* NOTE(@ideasman42): While there is no requirement for sound to be disabled in background-mode, - * the use case for playing audio in background mode is enough of a special-case - * that users who wish to do this can explicitly enable audio in background mode. - * While the down sides for connecting to an audio device aren't terrible they include: - * - Listing Blender as an active application which may output audio. - * - Unnecessary overhead running an operation in background mode or ... - * - Having to remember to include `-noaudio` with batch operations. - * - A quiet but audible click when Blender starts & configures its audio device. - */ - BKE_sound_force_device("None"); -} - static const char arg_handle_background_mode_set_doc[] = - "\n" - "\tRun in background (often used for UI-less rendering).\n" - "\n" - "\tThe audio device is disabled in background-mode by default\n" - "\tand can be re-enabled by passing in '-setaudo Default' afterwards."; + "\n\t" + "Run in background (often used for UI-less rendering)."; static int arg_handle_background_mode_set(int /*argc*/, const char ** /*argv*/, void * /*data*/) { print_version_short(); - background_mode_set(); + G.background = true; return 0; } -static const char arg_handle_command_set_doc[] = - "\n" - "\tRun a command which consumes all remaining arguments.\n" - "\tUse '-c help' to list all other commands.\n" - "\tPass '--help' after the command to see its help text.\n" - "\n" - "\tThis implies '--background' mode."; -static int arg_handle_command_set(int argc, const char **argv, void * /*data*/) -{ - if (argc < 2) { - fprintf(stderr, "%s requires at least one argument\n", argv[0]); - exit(EXIT_FAILURE); - BLI_assert_unreachable(); - } - - /* Application "info" messages get in the way of command line output, suppress them. */ - G.quiet = true; - - background_mode_set(); - - app_state.command.argc = argc - 1; - app_state.command.argv = argv + 1; - - /* Consume remaining arguments. */ - return argc - 1; -} - static const char arg_handle_log_level_set_doc[] = "\n" "\tSet the logging verbosity level (higher for more details) defaults to 1,\n" @@ -1610,8 +1561,9 @@ static int arg_handle_audio_disable(int /*argc*/, const char ** /*argv*/, void * static const char arg_handle_audio_set_doc[] = "\n\t" - "Force sound system to a specific device.\n" - "\t'None' 'Default' 'SDL' 'OpenAL' 'CoreAudio' 'JACK' 'PulseAudio' 'WASAPI'."; + "Force sound system to a specific device." + "\n\t" + "'None' 'SDL' 'OpenAL' 'CoreAudio' 'JACK' 'PulseAudio' 'WASAPI'."; static int arg_handle_audio_set(int argc, const char **argv, void * /*data*/) { if (argc < 1) { @@ -1619,13 +1571,7 @@ static int arg_handle_audio_set(int argc, const char **argv, void * /*data*/) exit(1); } - const char *device = argv[1]; - if (STREQ(device, "Default")) { - /* Unset any forced device. */ - device = nullptr; - } - - BKE_sound_force_device(device); + BKE_sound_force_device(argv[1]); return 1; } @@ -1651,7 +1597,7 @@ static int arg_handle_output_set(int argc, const char **argv, void *data) Scene *scene = CTX_data_scene(C); if (scene) { STRNCPY(scene->r.pic, argv[1]); - DEG_id_tag_update(&scene->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&scene->id, ID_RECALC_COPY_ON_WRITE); } else { fprintf(stderr, "\nError: no blend loaded. cannot use '-o / --render-output'.\n"); @@ -1682,7 +1628,7 @@ static int arg_handle_engine_set(int argc, const char **argv, void *data) if (scene) { if (BLI_findstring(&R_engines, argv[1], offsetof(RenderEngineType, idname))) { STRNCPY_UTF8(scene->r.engine, argv[1]); - DEG_id_tag_update(&scene->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&scene->id, ID_RECALC_COPY_ON_WRITE); } else { fprintf(stderr, "\nError: engine not found '%s'\n", argv[1]); @@ -1726,7 +1672,7 @@ static int arg_handle_image_type_set(int argc, const char **argv, void *data) } else { scene->r.im_format.imtype = imtype_new; - DEG_id_tag_update(&scene->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&scene->id, ID_RECALC_COPY_ON_WRITE); } } else { @@ -1811,11 +1757,11 @@ static int arg_handle_extension_set(int argc, const char **argv, void *data) if (scene) { if (argv[1][0] == '0') { scene->r.scemode &= ~R_EXTENSION; - DEG_id_tag_update(&scene->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&scene->id, ID_RECALC_COPY_ON_WRITE); } else if (argv[1][0] == '1') { scene->r.scemode |= R_EXTENSION; - DEG_id_tag_update(&scene->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&scene->id, ID_RECALC_COPY_ON_WRITE); } else { fprintf(stderr, @@ -1967,7 +1913,7 @@ static int arg_handle_frame_start_set(int argc, const char **argv, void *data) fprintf(stderr, "\nError: %s '%s %s'.\n", err_msg, arg_id, argv[1]); } else { - DEG_id_tag_update(&scene->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&scene->id, ID_RECALC_COPY_ON_WRITE); } return 1; } @@ -2001,7 +1947,7 @@ static int arg_handle_frame_end_set(int argc, const char **argv, void *data) fprintf(stderr, "\nError: %s '%s %s'.\n", err_msg, arg_id, argv[1]); } else { - DEG_id_tag_update(&scene->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&scene->id, ID_RECALC_COPY_ON_WRITE); } return 1; } @@ -2027,7 +1973,7 @@ static int arg_handle_frame_skip_set(int argc, const char **argv, void *data) fprintf(stderr, "\nError: %s '%s %s'.\n", err_msg, arg_id, argv[1]); } else { - DEG_id_tag_update(&scene->id, ID_RECALC_SYNC_TO_EVAL); + DEG_id_tag_update(&scene->id, ID_RECALC_COPY_ON_WRITE); } return 1; } @@ -2409,8 +2355,6 @@ void main_args_setup(bContext *C, bArgs *ba, bool all) ba, nullptr, "--disable-abort-handler", CB(arg_handle_abort_handler_disable), nullptr); BLI_args_add(ba, "-b", "--background", CB(arg_handle_background_mode_set), nullptr); - /* Command implies background mode. */ - BLI_args_add(ba, "-c", "--command", CB(arg_handle_command_set), nullptr); BLI_args_add(ba, "-a", nullptr, CB(arg_handle_playback_mode), nullptr); diff --git a/source/creator/creator_cpu_check.cc b/source/creator/creator_cpu_check.cc deleted file mode 100644 index b62c092a201..00000000000 --- a/source/creator/creator_cpu_check.cc +++ /dev/null @@ -1,106 +0,0 @@ -/* SPDX-FileCopyrightText: 2024 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup creator - */ -#include - -#if defined(WIN32) -# include -# include -#endif - -/* The code below is duplicated from system.c from bf_blenlib. This is on purpose, since bf_blenlib - * may be build with CPU flags that are not available on the current cpu so we can't link it. */ - -#if !defined(_WIN32) -static void __cpuid( - /* Cannot be const, because it is modified below. - * NOLINTNEXTLINE: readability-non-const-parameter. */ - int data[4], - int selector) -{ -# if defined(__x86_64__) - asm("cpuid" : "=a"(data[0]), "=b"(data[1]), "=c"(data[2]), "=d"(data[3]) : "a"(selector)); -# else - (void)selector; - data[0] = data[1] = data[2] = data[3] = 0; -# endif -} -#endif - -static int cpu_supports_sse42() -{ - int result[4], num; - __cpuid(result, 0); - num = result[0]; - - if (num >= 1) { - __cpuid(result, 0x00000001); - return (result[2] & (int(1) << 20)) != 0; - } - return 0; -} - -static const char *cpu_brand_string() -{ - static char buf[49] = {0}; - int result[4] = {0}; - __cpuid(result, 0x80000000); - if (result[0] >= int(0x80000004)) { - __cpuid((int *)(buf + 0), 0x80000002); - __cpuid((int *)(buf + 16), 0x80000003); - __cpuid((int *)(buf + 32), 0x80000004); - const char *buf_ptr = buf; - // Trim any leading spaces. - while (*buf_ptr == ' ') { - buf_ptr++; - } - return buf_ptr; - } - return nullptr; -} - -#ifdef _MSC_VER -extern "C" __declspec(dllexport) void cpu_check_win32() -{ -# ifdef _M_X64 - if (!cpu_supports_sse42()) { - std::string error_title = "Unsupported CPU - " + std::string(cpu_brand_string()); - MessageBoxA(NULL, - "Blender requires a CPU with SSE42 support.", - error_title.c_str(), - MB_OK | MB_ICONERROR); - exit(-1); - } -# endif -} - -BOOL WINAPI DllMain(HINSTANCE /* hinstDLL */, DWORD fdwReason, LPVOID /* lpvReserved */) -{ - switch (fdwReason) { - case DLL_PROCESS_ATTACH: - cpu_check_win32(); - break; - } - return TRUE; -} -#else -# include -# include - -static __attribute__((constructor)) void cpu_check() -{ -# ifdef __x86_64 - if (!cpu_supports_sse42()) { - std::string error = "Unsupported CPU - " + std::string(cpu_brand_string()) + - "\nBlender requires a CPU with SSE42 support."; - printf("%s\n", error.c_str()); - exit(-1); - } - return; -# endif -} -#endif diff --git a/source/creator/creator_intern.h b/source/creator/creator_intern.h index 29706d610d4..e00e5756e6c 100644 --- a/source/creator/creator_intern.h +++ b/source/creator/creator_intern.h @@ -52,12 +52,6 @@ struct ApplicationState { struct { unsigned char python; } exit_code_on_error; - - /** Storage for commands (see `--command` argument). */ - struct { - int argc; - const char **argv; - } command; }; extern struct ApplicationState app_state; /* creator.c */ diff --git a/source/creator/creator_signals.cc b/source/creator/creator_signals.cc index f752c83138a..6dfaea1e5a1 100644 --- a/source/creator/creator_signals.cc +++ b/source/creator/creator_signals.cc @@ -29,6 +29,8 @@ # include # include +# include "BLI_sys_types.h" + # ifdef WIN32 # include "BLI_winstuff.h" # endif @@ -41,10 +43,9 @@ # include "BKE_appdir.hh" /* BKE_tempdir_base */ # include "BKE_blender_version.h" -# include "BKE_global.hh" +# include "BKE_global.h" # include "BKE_main.hh" -# include "BKE_report.hh" -# include "BKE_wm_runtime.hh" +# include "BKE_report.h" # include @@ -54,6 +55,12 @@ # include "creator_intern.h" /* own include */ +// #define USE_WRITE_CRASH_BLEND +# ifdef USE_WRITE_CRASH_BLEND +# include "BKE_undo_system.hh" +# include "BLO_undofile.hh" +# endif + /* set breakpoints here when running in debug mode, useful to catch floating point errors */ # if defined(__linux__) || defined(_WIN32) || defined(OSX_SSE_FPE) static void sig_handle_fpe(int /*sig*/) @@ -91,6 +98,28 @@ static void sig_handle_crash(int signum) wmWindowManager *wm = G_MAIN ? static_cast(G_MAIN->wm.first) : nullptr; +# ifdef USE_WRITE_CRASH_BLEND + if (wm && wm->undo_stack) { + struct MemFile *memfile = BKE_undosys_stack_memfile_get_active(wm->undo_stack); + if (memfile) { + char filepath[FILE_MAX]; + + if (!(G_MAIN && G_MAIN->filepath[0])) { + BLI_path_join(filepath, sizeof(filepath), BKE_tempdir_base(), "crash.blend"); + } + else { + STRNCPY(filepath, G_MAIN->filepath); + BLI_path_extension_replace(filepath, sizeof(filepath), ".crash.blend"); + } + + printf("Writing: %s\n", filepath); + fflush(stdout); + + BLO_memfile_write_file(memfile, filepath); + } + } +# endif + FILE *fp; char header[512]; @@ -130,7 +159,7 @@ static void sig_handle_crash(int signum) } else { if (wm) { - BKE_report_write_file_fp(fp, &wm->runtime->reports, header); + BKE_report_write_file_fp(fp, &wm->reports, header); } sig_handle_crash_backtrace(fp); diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 00c96eeda54..f8dd0c73c0f 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -53,9 +53,7 @@ endif() # Standard Blender arguments for running tests. # Specify exit code so that if a Python script error happens, the test fails. -set(TEST_BLENDER_EXE_PARAMS - --background --factory-startup --debug-memory --debug-exit-on-error --python-exit-code 1 -) +set(TEST_BLENDER_EXE_PARAMS --background -noaudio --factory-startup --debug-memory --debug-exit-on-error --python-exit-code 1) # Python CTests if(WITH_BLENDER AND WITH_PYTHON AND NOT WITH_PYTHON_MODULE) diff --git a/tests/data b/tests/data index acf972398b4..7e545568b05 160000 --- a/tests/data +++ b/tests/data @@ -1 +1 @@ -Subproject commit acf972398b475fa09a58a640bcf1dc806cfb16f0 +Subproject commit 7e545568b056cfb3b03e38c9fec08e01d8761a77 diff --git a/tests/performance/api/config.py b/tests/performance/api/config.py index ce113074a4c..132c3db03db 100644 --- a/tests/performance/api/config.py +++ b/tests/performance/api/config.py @@ -121,8 +121,7 @@ class TestConfig: config = TestConfig._read_config_module(self.base_dir) self.tests = TestCollection(env, getattr(config, 'tests', ['*']), - getattr(config, 'categories', ['*']), - getattr(config, 'background', False)) + getattr(config, 'categories', ['*'])) self.revisions = getattr(config, 'revisions', {}) self.builds = getattr(config, 'builds', {}) self.queue = TestQueue(self.base_dir / 'results.json') @@ -244,9 +243,6 @@ class TestConfig: test_category = test.category() for device in self.devices: - if not (test.use_device() or device.type == "CPU"): - continue - entry = self.queue.find(revision_name, test_name, test_category, device.id) if entry: # Test if revision hash or executable changed. diff --git a/tests/performance/api/test.py b/tests/performance/api/test.py index 8c08d3158a7..dfffe4b6c7a 100644 --- a/tests/performance/api/test.py +++ b/tests/performance/api/test.py @@ -26,12 +26,6 @@ class Test: """ return False - def use_background(self) -> bool: - """ - Test runs in background mode and requires no display. - """ - return True - @abc.abstractmethod def run(self, env, device_id: str) -> Dict: """ @@ -40,7 +34,7 @@ class Test: class TestCollection: - def __init__(self, env, names_filter: List = ['*'], categories_filter: List = ['*'], background: bool = False): + def __init__(self, env, names_filter: List = ['*'], categories_filter: List = ['*']): import importlib import pkgutil import tests @@ -54,9 +48,6 @@ class TestCollection: tests = module.generate(env) for test in tests: - if background and not test.use_background(): - continue - test_category = test.category() found = False for category_filter in categories_filter: diff --git a/tests/performance/benchmark.py b/tests/performance/benchmark.py index acea12bfe2d..08ce9fa0db2 100755 --- a/tests/performance/benchmark.py +++ b/tests/performance/benchmark.py @@ -61,10 +61,7 @@ def print_row(config: api.TestConfig, entries: List, end='\n') -> None: row += f"{revision: <15} " if config.queue.has_multiple_categories: - category_name = entries[0].category - if entries[0].device_type != "CPU": - category_name += " " + entries[0].device_type - row += f"{category_name: <15} " + row += f"{entries[0].category: <15} " row += f"{entries[0].test: <40} " for entry in entries: @@ -72,7 +69,7 @@ def print_row(config: api.TestConfig, entries: List, end='\n') -> None: status = entry.status output = entry.output result = '' - if status in {'done', 'outdated'} and output: + if status in ('done', 'outdated') and output: result = '%.4fs' % output['time'] if status == 'outdated': @@ -102,13 +99,10 @@ def run_entry(env: api.TestEnvironment, row: List, entry: api.TestEntry, update_only: bool): - updated = False - failed = False - # Check if entry needs to be run. - if update_only and entry.status not in {'queued', 'outdated'}: + if update_only and entry.status not in ('queued', 'outdated'): print_row(config, row, end='\r') - return updated, failed + return False # Run test entry. revision = entry.revision @@ -121,9 +115,7 @@ def run_entry(env: api.TestEnvironment, test = config.tests.find(testname, testcategory) if not test: - return updated, failed - - updated = True + return False # Log all output to dedicated log file. logname = testcategory + '_' + testname + '_' + revision @@ -136,13 +128,12 @@ def run_entry(env: api.TestEnvironment, entry.error_msg = '' # Build revision, or just set path to existing executable. + entry.status = 'building' + print_row(config, row, end='\r') executable_ok = True if len(entry.executable): env.set_blender_executable(pathlib.Path(entry.executable), environment) else: - entry.status = 'building' - print_row(config, row, end='\r') - if config.benchmark_type == "comparison": install_dir = config.builds_dir / revision else: @@ -152,7 +143,6 @@ def run_entry(env: api.TestEnvironment, if not executable_ok: entry.status = 'failed' entry.error_msg = 'Failed to build' - failed = True else: env.set_blender_executable(install_dir, environment) @@ -169,7 +159,6 @@ def run_entry(env: api.TestEnvironment, except KeyboardInterrupt as e: raise e except Exception as e: - failed = True entry.status = 'failed' entry.error_msg = str(e) @@ -182,7 +171,7 @@ def run_entry(env: api.TestEnvironment, env.unset_log_file() env.set_default_blender_executable() - return updated, failed + return True def cmd_init(env: api.TestEnvironment, argv: List): @@ -269,8 +258,6 @@ def cmd_run(env: api.TestEnvironment, argv: List, update_only: bool): parser.add_argument('test', nargs='?', default='*') args = parser.parse_args(argv) - exit_code = 0 - configs = env.get_configs(args.config) for config in configs: updated = False @@ -280,14 +267,11 @@ def cmd_run(env: api.TestEnvironment, argv: List, update_only: bool): if match_entry(row[0], args): for entry in row: try: - test_updated, test_failed = run_entry(env, config, row, entry, update_only) - if test_updated: + if run_entry(env, config, row, entry, update_only): updated = True # Write queue every time in case running gets interrupted, # so it can be resumed. config.queue.write() - if test_failed: - exit_code = 1 except KeyboardInterrupt as e: cancel = True break @@ -306,8 +290,6 @@ def cmd_run(env: api.TestEnvironment, argv: List, update_only: bool): print("\nfile://" + str(html_filepath)) - sys.exit(exit_code) - def cmd_graph(argv: List): # Create graph from a given JSON results file. diff --git a/tests/performance/tests/eevee.py b/tests/performance/tests/eevee.py index e1e969d45b8..bc233decb07 100644 --- a/tests/performance/tests/eevee.py +++ b/tests/performance/tests/eevee.py @@ -114,9 +114,6 @@ else: def category(self): return "eevee" - def use_background(self): - return False - def run(self, env, device_id): args = {} _, log = env.run_in_blender(_run, args, [self.filepath], foreground=True) diff --git a/tests/python/CMakeLists.txt b/tests/python/CMakeLists.txt index e1ed92ab8da..95616a8e17e 100644 --- a/tests/python/CMakeLists.txt +++ b/tests/python/CMakeLists.txt @@ -1009,9 +1009,8 @@ if(NOT OPENIMAGEIO_TOOL) message(STATUS "Disabling sequencer render tests because OIIO oiiotool does not exist") else() set(render_tests - effects - filter transform + filter ) foreach(render_test ${render_tests}) diff --git a/tests/python/bl_alembic_io_test.py b/tests/python/bl_alembic_io_test.py index 7c2b64e6c25..07429f89837 100644 --- a/tests/python/bl_alembic_io_test.py +++ b/tests/python/bl_alembic_io_test.py @@ -3,7 +3,7 @@ # SPDX-License-Identifier: GPL-2.0-or-later """ -./blender.bin --background --factory-startup --python tests/python/bl_alembic_io_test.py -- --testdir /path/to/tests/data/alembic +./blender.bin --background -noaudio --factory-startup --python tests/python/bl_alembic_io_test.py -- --testdir /path/to/tests/data/alembic """ import math diff --git a/tests/python/bl_animation_armature.py b/tests/python/bl_animation_armature.py index ce71aef4ed4..53bcbe4a9db 100644 --- a/tests/python/bl_animation_armature.py +++ b/tests/python/bl_animation_armature.py @@ -3,7 +3,7 @@ # SPDX-License-Identifier: GPL-2.0-or-later """ -blender -b --factory-startup --python tests/python/bl_animation_armature.py +blender -b -noaudio --factory-startup --python tests/python/bl_animation_armature.py """ import unittest diff --git a/tests/python/bl_animation_drivers.py b/tests/python/bl_animation_drivers.py index faf119b6b3c..e7e95a401bd 100644 --- a/tests/python/bl_animation_drivers.py +++ b/tests/python/bl_animation_drivers.py @@ -9,7 +9,7 @@ import sys from rna_prop_ui import rna_idprop_quote_path """ -blender -b --factory-startup --python tests/python/bl_animation_drivers.py -- --testdir /path/to/tests/data/animation +blender -b -noaudio --factory-startup --python tests/python/bl_animation_drivers.py -- --testdir /path/to/tests/data/animation """ diff --git a/tests/python/bl_animation_fcurves.py b/tests/python/bl_animation_fcurves.py index 94de7e7090d..bd9e243ff0d 100644 --- a/tests/python/bl_animation_fcurves.py +++ b/tests/python/bl_animation_fcurves.py @@ -3,7 +3,7 @@ # SPDX-License-Identifier: GPL-2.0-or-later """ -blender -b --factory-startup --python tests/python/bl_animation_fcurves.py -- --testdir /path/to/tests/data/animation +blender -b -noaudio --factory-startup --python tests/python/bl_animation_fcurves.py -- --testdir /path/to/tests/data/animation """ import pathlib diff --git a/tests/python/bl_animation_keyframing.py b/tests/python/bl_animation_keyframing.py index 96d1e074263..20b03919553 100644 --- a/tests/python/bl_animation_keyframing.py +++ b/tests/python/bl_animation_keyframing.py @@ -9,7 +9,7 @@ import sys from math import radians """ -blender -b --factory-startup --python tests/python/bl_animation_keyframing.py -- --testdir /path/to/tests/data/animation +blender -b -noaudio --factory-startup --python tests/python/bl_animation_keyframing.py -- --testdir /path/to/tests/data/animation """ diff --git a/tests/python/bl_blendfile_io.py b/tests/python/bl_blendfile_io.py index 0f1a738b702..32de9a4da14 100644 --- a/tests/python/bl_blendfile_io.py +++ b/tests/python/bl_blendfile_io.py @@ -2,7 +2,7 @@ # # SPDX-License-Identifier: Apache-2.0 -# ./blender.bin --background --python tests/python/bl_blendfile_io.py +# ./blender.bin --background -noaudio --python tests/python/bl_blendfile_io.py import bpy import os import sys diff --git a/tests/python/bl_blendfile_liblink.py b/tests/python/bl_blendfile_liblink.py index d8c73ae28f5..e89547eab4a 100644 --- a/tests/python/bl_blendfile_liblink.py +++ b/tests/python/bl_blendfile_liblink.py @@ -2,7 +2,7 @@ # # SPDX-License-Identifier: Apache-2.0 -# ./blender.bin --background --python tests/python/bl_blendfile_liblink.py +# ./blender.bin --background -noaudio --python tests/python/bl_blendfile_liblink.py import bpy import os import sys diff --git a/tests/python/bl_blendfile_library_overrides.py b/tests/python/bl_blendfile_library_overrides.py index 735e347112f..26ccacd6259 100644 --- a/tests/python/bl_blendfile_library_overrides.py +++ b/tests/python/bl_blendfile_library_overrides.py @@ -2,7 +2,7 @@ # # SPDX-License-Identifier: Apache-2.0 -# ./blender.bin --background --python tests/python/bl_blendfile_library_overrides.py -- --output-dir=/tmp/ +# ./blender.bin --background -noaudio --python tests/python/bl_blendfile_library_overrides.py -- --output-dir=/tmp/ import pathlib import bpy import sys @@ -742,8 +742,9 @@ class TestLibraryOverridesComplex(TestHelper, unittest.TestCase): # Objects and collections are duplicated as overrides, but meshes and armatures remain only linked data. assert len(bpy.data.collections) == 3 * 3 + 3 assert all((id_.library is None and id_.override_library is not None) for id_ in bpy.data.collections[:3 * 3]) - # Note that the 'missing' renamed objects from the library are now cleared as part of the resync process. - assert len(bpy.data.objects) == 3 * 6 + 6 + # Note that the 'missing' renamed objects from the library are still here as empty placeholders, + # hence the 8 linked ones instead of 6. + assert len(bpy.data.objects) == 3 * 6 + 8 assert all((id_.library is None and id_.override_library is not None) for id_ in bpy.data.objects[:3 * 6]) assert len(bpy.data.meshes) == 0 + 1 assert len(bpy.data.armatures) == 0 + 1 @@ -773,8 +774,9 @@ class TestLibraryOverridesComplex(TestHelper, unittest.TestCase): assert len(bpy.data.collections) == 3 + 6 assert all((id_.override_library is not None) for id_ in bpy.data.collections if id_.library == test_output_path_lib) - # Note that the 'missing' renamed objects from the library are now cleared as part of the resync process. - assert len(bpy.data.objects) == 6 + 12 + # Note that the 'missing' renamed objects from the library are still here as empty placeholders, + # hence the 8 + 6 linked ones instead of 6 + 6. + assert len(bpy.data.objects) == 6 + 14 assert all((id_.override_library is not None) for id_ in bpy.data.objects if id_.library == test_output_path_lib) assert len(bpy.data.meshes) == 0 + 1 diff --git a/tests/python/bl_blendfile_versioning.py b/tests/python/bl_blendfile_versioning.py index 6ceedb501f1..7aa40494a1e 100644 --- a/tests/python/bl_blendfile_versioning.py +++ b/tests/python/bl_blendfile_versioning.py @@ -2,7 +2,7 @@ # # SPDX-License-Identifier: Apache-2.0 -# ./blender.bin --background --python tests/python/bl_blendfile_versioning.py .. +# ./blender.bin --background -noaudio --python tests/python/bl_blendfile_versioning.py .. import bpy import os import sys diff --git a/tests/python/bl_constraints.py b/tests/python/bl_constraints.py index 1136eaad93f..2a54ba48398 100644 --- a/tests/python/bl_constraints.py +++ b/tests/python/bl_constraints.py @@ -3,7 +3,7 @@ # SPDX-License-Identifier: GPL-2.0-or-later """ -./blender.bin --background --factory-startup --python tests/python/bl_constraints.py -- --testdir /path/to/tests/data/constraints +./blender.bin --background -noaudio --factory-startup --python tests/python/bl_constraints.py -- --testdir /path/to/tests/data/constraints """ import pathlib diff --git a/tests/python/bl_id_management.py b/tests/python/bl_id_management.py index 4f57dcb3796..f7f436c7338 100644 --- a/tests/python/bl_id_management.py +++ b/tests/python/bl_id_management.py @@ -2,7 +2,7 @@ # # SPDX-License-Identifier: Apache-2.0 -# ./blender.bin --background --python tests/python/bl_id_management.py -- --verbose +# ./blender.bin --background -noaudio --python tests/python/bl_id_management.py -- --verbose import bpy import unittest import random diff --git a/tests/python/bl_io_curve_svg_test.py b/tests/python/bl_io_curve_svg_test.py index 461829db049..f0f89cfb263 100644 --- a/tests/python/bl_io_curve_svg_test.py +++ b/tests/python/bl_io_curve_svg_test.py @@ -15,6 +15,7 @@ def get_arguments(filepath, output_filepath): args = [ "--background", + "-noaudio", "--factory-startup", "--enable-autoexec", "--debug-memory", diff --git a/tests/python/bl_keymap_validate.py b/tests/python/bl_keymap_validate.py index 3b31a730a1b..9d85a8a7db4 100644 --- a/tests/python/bl_keymap_validate.py +++ b/tests/python/bl_keymap_validate.py @@ -2,7 +2,7 @@ # # SPDX-License-Identifier: GPL-2.0-or-later -# ./blender.bin --background --factory-startup --python tests/python/bl_keymap_validate.py +# ./blender.bin --background -noaudio --factory-startup --python tests/python/bl_keymap_validate.py # """ diff --git a/tests/python/bl_load_addons.py b/tests/python/bl_load_addons.py index 1980e9354a6..8517c799511 100644 --- a/tests/python/bl_load_addons.py +++ b/tests/python/bl_load_addons.py @@ -5,7 +5,7 @@ # simple script to enable all addons, and disable """ -./blender.bin --background --factory-startup --python tests/python/bl_load_addons.py +./blender.bin --background -noaudio --factory-startup --python tests/python/bl_load_addons.py """ import bpy diff --git a/tests/python/bl_load_py_modules.py b/tests/python/bl_load_py_modules.py index 6162c4264b5..4521e35fcaf 100644 --- a/tests/python/bl_load_py_modules.py +++ b/tests/python/bl_load_py_modules.py @@ -5,7 +5,7 @@ # simple script to enable all addons, and disable """ -./blender.bin --background --factory-startup --python tests/python/bl_load_py_modules.py +./blender.bin --background -noaudio --factory-startup --python tests/python/bl_load_py_modules.py """ import bpy diff --git a/tests/python/bl_node_group_interface.py b/tests/python/bl_node_group_interface.py index a7b8635cfd9..aa993d18ae3 100644 --- a/tests/python/bl_node_group_interface.py +++ b/tests/python/bl_node_group_interface.py @@ -272,6 +272,13 @@ class NodeGroupInterfaceTests: self.assertSequenceEqual([s.name for s in group_node.inputs], ["Input 0", "Input 1"]) self.assertSequenceEqual([s.name for s in group_node.outputs], ["Output 0", "Output 1"]) + # Nested panel is not allowed and should return None. + panel1 = tree.interface.new_panel("Panel 1", parent=panel0) + self.assertIsNone(panel1) + self.assertSequenceEqual(tree.interface.items_tree, [out0, in0, panel0, out1, in1]) + self.assertSequenceEqual([s.name for s in group_node.inputs], ["Input 0", "Input 1"]) + self.assertSequenceEqual([s.name for s in group_node.outputs], ["Output 0", "Output 1"]) + def do_test_remove(self, socket_type): tree, group_node = self.make_group_and_instance() diff --git a/tests/python/bl_pyapi_bpy_driver_secure_eval.py b/tests/python/bl_pyapi_bpy_driver_secure_eval.py index 79d460e7b2a..b6c84eb2f35 100644 --- a/tests/python/bl_pyapi_bpy_driver_secure_eval.py +++ b/tests/python/bl_pyapi_bpy_driver_secure_eval.py @@ -2,7 +2,7 @@ # # SPDX-License-Identifier: GPL-2.0-or-later -# ./blender.bin --background --python tests/python/bl_pyapi_bpy_driver_secure_eval.py -- --verbose +# ./blender.bin --background -noaudio --python tests/python/bl_pyapi_bpy_driver_secure_eval.py -- --verbose import bpy import unittest import builtins diff --git a/tests/python/bl_pyapi_bpy_path.py b/tests/python/bl_pyapi_bpy_path.py index 3611641bd1e..ac969fb5d10 100644 --- a/tests/python/bl_pyapi_bpy_path.py +++ b/tests/python/bl_pyapi_bpy_path.py @@ -2,7 +2,7 @@ # # SPDX-License-Identifier: Apache-2.0 -# ./blender.bin --background --python tests/python/bl_pyapi_bpy_path.py -- --verbose +# ./blender.bin --background -noaudio --python tests/python/bl_pyapi_bpy_path.py -- --verbose import unittest diff --git a/tests/python/bl_pyapi_bpy_utils_units.py b/tests/python/bl_pyapi_bpy_utils_units.py index 71e00a23982..ab86b22fab9 100644 --- a/tests/python/bl_pyapi_bpy_utils_units.py +++ b/tests/python/bl_pyapi_bpy_utils_units.py @@ -2,7 +2,7 @@ # # SPDX-License-Identifier: Apache-2.0 -# ./blender.bin --background --python tests/python/bl_pyapi_bpy_utils_units.py -- --verbose +# ./blender.bin --background -noaudio --python tests/python/bl_pyapi_bpy_utils_units.py -- --verbose import unittest from bpy.utils import units diff --git a/tests/python/bl_pyapi_idprop.py b/tests/python/bl_pyapi_idprop.py index 9f6b2216770..41881884cc2 100644 --- a/tests/python/bl_pyapi_idprop.py +++ b/tests/python/bl_pyapi_idprop.py @@ -2,7 +2,7 @@ # # SPDX-License-Identifier: Apache-2.0 -# ./blender.bin --background --python tests/python/bl_pyapi_idprop.py -- --verbose +# ./blender.bin --background -noaudio --python tests/python/bl_pyapi_idprop.py -- --verbose import bpy import idprop import unittest diff --git a/tests/python/bl_pyapi_idprop_datablock.py b/tests/python/bl_pyapi_idprop_datablock.py index 8f3072988d9..2f333c76df3 100644 --- a/tests/python/bl_pyapi_idprop_datablock.py +++ b/tests/python/bl_pyapi_idprop_datablock.py @@ -2,7 +2,7 @@ # # SPDX-License-Identifier: GPL-2.0-or-later -# ./blender.bin --background --python tests/python/bl_pyapi_idprop_datablock.py -- --verbose +# ./blender.bin --background -noaudio --python tests/python/bl_pyapi_idprop_datablock.py -- --verbose import contextlib import inspect diff --git a/tests/python/bl_pyapi_mathutils.py b/tests/python/bl_pyapi_mathutils.py index d6bbe1ff0a4..be75e57ef44 100644 --- a/tests/python/bl_pyapi_mathutils.py +++ b/tests/python/bl_pyapi_mathutils.py @@ -2,7 +2,7 @@ # # SPDX-License-Identifier: Apache-2.0 -# ./blender.bin --background --python tests/python/bl_pyapi_mathutils.py -- --verbose +# ./blender.bin --background -noaudio --python tests/python/bl_pyapi_mathutils.py -- --verbose import unittest from mathutils import Matrix, Vector, Quaternion, Euler from mathutils import kdtree, geometry diff --git a/tests/python/bl_pyapi_prop_array.py b/tests/python/bl_pyapi_prop_array.py index 30262ae16bc..d91fd8bbaac 100644 --- a/tests/python/bl_pyapi_prop_array.py +++ b/tests/python/bl_pyapi_prop_array.py @@ -2,7 +2,7 @@ # # SPDX-License-Identifier: Apache-2.0 -# ./blender.bin --background --python tests/python/bl_pyapi_prop_array.py -- --verbose +# ./blender.bin --background -noaudio --python tests/python/bl_pyapi_prop_array.py -- --verbose import bpy from bpy.props import ( BoolVectorProperty, diff --git a/tests/python/bl_pyapi_text.py b/tests/python/bl_pyapi_text.py index c2d05be48e3..f67b267ecb6 100644 --- a/tests/python/bl_pyapi_text.py +++ b/tests/python/bl_pyapi_text.py @@ -2,7 +2,7 @@ # # SPDX-License-Identifier: Apache-2.0 -# ./blender.bin --background --python tests/python/bl_pyapi_text.py -- --verbose +# ./blender.bin --background -noaudio --python tests/python/bl_pyapi_text.py -- --verbose import bpy import unittest diff --git a/tests/python/bl_rigging_symmetrize.py b/tests/python/bl_rigging_symmetrize.py index 3a9d0d8dde6..47efb53b68d 100644 --- a/tests/python/bl_rigging_symmetrize.py +++ b/tests/python/bl_rigging_symmetrize.py @@ -3,7 +3,7 @@ # SPDX-License-Identifier: GPL-2.0-or-later """ -blender -b --factory-startup --python tests/python/bl_rigging_symmetrize.py -- --testdir /path/to/tests/data/animation +blender -b -noaudio --factory-startup --python tests/python/bl_rigging_symmetrize.py -- --testdir /path/to/tests/data/animation """ import pathlib diff --git a/tests/python/bl_rna_defaults.py b/tests/python/bl_rna_defaults.py index b027b3d0871..94663c7be08 100644 --- a/tests/python/bl_rna_defaults.py +++ b/tests/python/bl_rna_defaults.py @@ -2,7 +2,7 @@ # # SPDX-License-Identifier: Apache-2.0 -# ./blender.bin --background --factory-startup --python tests/python/bl_rna_defaults.py +# ./blender.bin --background -noaudio --factory-startup --python tests/python/bl_rna_defaults.py import bpy diff --git a/tests/python/bl_rna_manual_reference.py b/tests/python/bl_rna_manual_reference.py index 9641e30da8a..c384a63f1b4 100644 --- a/tests/python/bl_rna_manual_reference.py +++ b/tests/python/bl_rna_manual_reference.py @@ -3,7 +3,7 @@ # SPDX-License-Identifier: GPL-2.0-or-later # Use for validating our manual interlinking. -# ./blender.bin --background --python tests/python/bl_rna_manual_reference.py +# ./blender.bin --background -noaudio --python tests/python/bl_rna_manual_reference.py # # 1) test_data() -- ensure the data we have is correct format # 2) test_lookup_coverage() -- ensure that we have lookups for _every_ RNA path and all patterns are used. diff --git a/tests/python/bl_rst_completeness.py b/tests/python/bl_rst_completeness.py index cb4406bae51..c6153011429 100644 --- a/tests/python/bl_rst_completeness.py +++ b/tests/python/bl_rst_completeness.py @@ -4,7 +4,7 @@ # run this script in the game engine. # or on the command line with... -# ./blender.bin --background --python tests/python/bl_rst_completeness.py +# ./blender.bin --background -noaudio --python tests/python/bl_rst_completeness.py ''' filepath = "/src/blender/tests/python/bl_rst_completeness.py" exec(compile(open(filepath).read(), filepath, 'exec')) diff --git a/tests/python/collada/CMakeLists.txt b/tests/python/collada/CMakeLists.txt index c84d59e9e60..7fd7927b786 100644 --- a/tests/python/collada/CMakeLists.txt +++ b/tests/python/collada/CMakeLists.txt @@ -23,12 +23,12 @@ execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory ${TEST_OUT_DIR}) # all calls to blender use this if(APPLE) if(${CMAKE_GENERATOR} MATCHES "Xcode") - set(TEST_BLENDER_EXE_PARAMS --background --factory-startup --debug-memory --debug-exit-on-error) + set(TEST_BLENDER_EXE_PARAMS --background -noaudio --factory-startup --debug-memory --debug-exit-on-error) else() - set(TEST_BLENDER_EXE_PARAMS --background --factory-startup --debug-memory --debug-exit-on-error --env-system-scripts ${CMAKE_SOURCE_DIR}/scripts) + set(TEST_BLENDER_EXE_PARAMS --background -noaudio --factory-startup --debug-memory --debug-exit-on-error --env-system-scripts ${CMAKE_SOURCE_DIR}/scripts) endif() else() - set(TEST_BLENDER_EXE_PARAMS --background --factory-startup --debug-memory --debug-exit-on-error --env-system-scripts ${CMAKE_SOURCE_DIR}/scripts) + set(TEST_BLENDER_EXE_PARAMS --background -noaudio --factory-startup --debug-memory --debug-exit-on-error --env-system-scripts ${CMAKE_SOURCE_DIR}/scripts) endif() # for testing with valgrind prefix: valgrind --track-origins=yes --error-limit=no diff --git a/tests/python/compositor_cpu_render_tests.py b/tests/python/compositor_cpu_render_tests.py index d9abae801fd..55501eafcad 100644 --- a/tests/python/compositor_cpu_render_tests.py +++ b/tests/python/compositor_cpu_render_tests.py @@ -19,6 +19,7 @@ except ImportError: def get_arguments(filepath, output_filepath): return [ "--background", + "-noaudio", "--factory-startup", "--enable-autoexec", "--debug-memory", diff --git a/tests/python/compositor_realtime_render_tests.py b/tests/python/compositor_realtime_render_tests.py index 2b187bb0ac7..d244cbe39ab 100644 --- a/tests/python/compositor_realtime_render_tests.py +++ b/tests/python/compositor_realtime_render_tests.py @@ -17,12 +17,13 @@ except ImportError: ENABLE_REALTIME_COMPOSITOR_SCRIPT = "import bpy; " \ "bpy.context.preferences.experimental.use_experimental_compositors = True; " \ - "bpy.data.scenes[0].node_tree.execution_mode = 'GPU'" + "bpy.data.scenes[0].node_tree.execution_mode = 'REALTIME'" def get_arguments(filepath, output_filepath): return [ "--background", + "-noaudio", "--factory-startup", "--enable-autoexec", "--debug-memory", diff --git a/tests/python/cycles_render_tests.py b/tests/python/cycles_render_tests.py index 059130abcf5..d7b65d94c19 100644 --- a/tests/python/cycles_render_tests.py +++ b/tests/python/cycles_render_tests.py @@ -69,6 +69,7 @@ def get_arguments(filepath, output_filepath): args = [ "--background", + "-noaudio", "--factory-startup", "--enable-autoexec", "--debug-memory", @@ -145,7 +146,7 @@ def main(): # underwater_caustics.blend gives quite different results on Linux and Intel macOS compared to # Windows and Arm macOS. test_dir_name = Path(test_dir).name - if test_dir_name in {'motion_blur', 'integrator'}: + if test_dir_name in ('motion_blur', 'integrator', ): report.set_fail_threshold(0.032) ok = report.run(test_dir, blender, get_arguments, batch=args.batch) diff --git a/tests/python/eevee_next_render_tests.py b/tests/python/eevee_next_render_tests.py index d487c5f41ec..c19b5e24917 100644 --- a/tests/python/eevee_next_render_tests.py +++ b/tests/python/eevee_next_render_tests.py @@ -17,69 +17,52 @@ def setup(): for scene in bpy.data.scenes: scene.render.engine = 'BLENDER_EEVEE_NEXT' - # Enable Eevee features - eevee = scene.eevee + # Enable Eevee features + scene = bpy.context.scene + eevee = scene.eevee + ray_tracing = eevee.ray_tracing_options - # Overscan of 50 will doesn't offset the final image, and adds more information for screen based ray tracing. - eevee.use_overscan = True - eevee.overscan_size = 50.0 + eevee.gtao_distance = 1 + eevee.use_volumetric_shadows = True + eevee.volumetric_tile_size = '2' + eevee.use_motion_blur = True + # Overscan of 50 will doesn't offset the final image, and adds more information for screen based ray tracing. + eevee.use_overscan = True + eevee.overscan_size = 50.0 + eevee.use_raytracing = True + eevee.ray_tracing_method = 'SCREEN' + ray_tracing.resolution_scale = "1" + ray_tracing.screen_trace_quality = 1.0 + ray_tracing.screen_trace_thickness = 1.0 + # Due to an issue in HiZ-buffer set the probe resolution to 256. When the + # probe resolution is to high it will be corrupted as the HiZ buffer isn't + # large enough + eevee.gi_cubemap_resolution = '256' - # Ambient Occlusion Pass - eevee.gtao_distance = 1 + # Does not work in edit mode + try: + # Simple probe setup + bpy.ops.object.lightprobe_add(type='SPHERE', location=(0.0, 0.0, 0.0)) + cubemap = bpy.context.selected_objects[0] + cubemap.scale = (1.0, 1.0, 1.0) + cubemap.data.falloff = 0.0 + cubemap.data.clip_start = 0.8 + cubemap.data.influence_distance = 1.2 - # Hair - scene.render.hair_type = 'STRIP' + bpy.ops.object.lightprobe_add(type='VOLUME', location=(0.0, 0.0, 0.0)) + grid = bpy.context.selected_objects[0] + grid.scale = (1.735, 1.735, 1.735) + grid.data.bake_samples = 256 + bpy.ops.object.lightprobe_cache_bake(subset='ACTIVE') + except: + pass - # Volumetric - eevee.volumetric_tile_size = '2' - eevee.volumetric_start = 1.0 - eevee.volumetric_end = 50.0 - eevee.volumetric_samples = 128 - eevee.use_volumetric_shadows = True - - # Motion Blur - if scene.render.use_motion_blur: - eevee.motion_blur_steps = 10 - - # Ray-tracing - eevee.use_raytracing = True - eevee.ray_tracing_method = 'SCREEN' - ray_tracing = eevee.ray_tracing_options - ray_tracing.resolution_scale = "1" - ray_tracing.screen_trace_quality = 1.0 - ray_tracing.screen_trace_thickness = 1.0 - - # Light-probes - eevee.gi_cubemap_resolution = '256' - - # Only include the plane in probes - for ob in scene.objects: - if ob.name != 'Plane' and ob.type != 'LIGHT': - ob.hide_probe_volume = True - ob.hide_probe_sphere = True - ob.hide_probe_plane = True - - # Does not work in edit mode - if bpy.context.mode == 'OBJECT': - # Simple probe setup - bpy.ops.object.lightprobe_add(type='SPHERE', location=(0.0, 0.0, 1.0)) - cubemap = bpy.context.selected_objects[0] - cubemap.scale = (5.0, 5.0, 2.0) - cubemap.data.falloff = 0.0 - cubemap.data.clip_start = 0.8 - cubemap.data.influence_distance = 1.2 - - bpy.ops.object.lightprobe_add(type='VOLUME', location=(0.0, 0.0, 2.0)) - grid = bpy.context.selected_objects[0] - grid.scale = (8.0, 4.5, 4.5) - grid.data.grid_resolution_x = 32 - grid.data.grid_resolution_y = 16 - grid.data.grid_resolution_z = 8 - grid.data.grid_bake_samples = 128 - grid.data.grid_capture_world = True - # Make lighting smoother for most of the case. - grid.data.grid_dilation_threshold = 1.0 - bpy.ops.object.lightprobe_cache_bake(subset='ACTIVE') + # Only include the plane in probes + for ob in scene.objects: + if ob.name != 'Plane' and ob.type != 'LIGHT': + ob.hide_probe_volume = True + ob.hide_probe_sphere = True + ob.hide_probe_plane = True # When run from inside Blender, render and exit. @@ -101,6 +84,7 @@ def get_gpu_device_type(blender): # TODO: This always fails. command = [ blender, + "-noaudio", "--background", "--factory-startup", "--python", @@ -120,6 +104,7 @@ def get_gpu_device_type(blender): def get_arguments(filepath, output_filepath): return [ "--background", + "-noaudio", "--factory-startup", "--enable-autoexec", "--debug-memory", diff --git a/tests/python/eevee_render_tests.py b/tests/python/eevee_render_tests.py index bb37cb96e22..9b1c65f0c47 100644 --- a/tests/python/eevee_render_tests.py +++ b/tests/python/eevee_render_tests.py @@ -103,6 +103,7 @@ if inside_blender: def get_gpu_device_type(blender): command = [ blender, + "-noaudio", "--background", "--factory-startup", "--python", @@ -122,6 +123,7 @@ def get_gpu_device_type(blender): def get_arguments(filepath, output_filepath): return [ "--background", + "-noaudio", "--factory-startup", "--enable-autoexec", "--debug-memory", diff --git a/tests/python/modules/render_report.py b/tests/python/modules/render_report.py index 2893d3d89ec..4bcf45b4fa8 100755 --- a/tests/python/modules/render_report.py +++ b/tests/python/modules/render_report.py @@ -240,7 +240,7 @@ class Report: message += """

BLENDER_TEST_UPDATE=1 ctest -R %s

""" % self.engine_name message += """

This then happens for new and failing tests; reference images of """ \ """passing test cases will not be updated. Be sure to commit the new reference """ \ - """images to the tests/data git submodule afterwards.

""" + """images to the SVN repository afterwards.

""" message += """""" else: message = "" diff --git a/tests/python/modules/test_utils.py b/tests/python/modules/test_utils.py index 32c9102120e..fa7b3a26f19 100755 --- a/tests/python/modules/test_utils.py +++ b/tests/python/modules/test_utils.py @@ -60,6 +60,7 @@ class AbstractBlenderRunnerTest(unittest.TestCase): command = [ self.blender, '--background', + '-noaudio', '--factory-startup', '--enable-autoexec', '--debug-memory', diff --git a/tests/python/rna_info_dump.py b/tests/python/rna_info_dump.py index 2d1482a8c45..02aba6c864b 100644 --- a/tests/python/rna_info_dump.py +++ b/tests/python/rna_info_dump.py @@ -3,7 +3,7 @@ # SPDX-License-Identifier: GPL-2.0-or-later # Used for generating API diffs between releases -# ./blender.bin --background --python tests/python/rna_info_dump.py +# ./blender.bin --background -noaudio --python tests/python/rna_info_dump.py import bpy diff --git a/tests/python/sequencer_render_tests.py b/tests/python/sequencer_render_tests.py index aeab204a5c0..35583d2c358 100644 --- a/tests/python/sequencer_render_tests.py +++ b/tests/python/sequencer_render_tests.py @@ -15,6 +15,7 @@ def get_arguments(filepath, output_filepath): args = [ "--background", + "-noaudio", "--factory-startup", "--enable-autoexec", "--debug-memory", diff --git a/tests/python/storm_render_tests.py b/tests/python/storm_render_tests.py index a058268adee..642626a48a5 100644 --- a/tests/python/storm_render_tests.py +++ b/tests/python/storm_render_tests.py @@ -38,6 +38,7 @@ if inside_blender: def get_arguments(filepath, output_filepath): return [ "--background", + "-noaudio", "--factory-startup", "--enable-autoexec", "--debug-memory", diff --git a/tests/python/view_layer/CMakeLists.txt b/tests/python/view_layer/CMakeLists.txt index 4d5a25890f0..94ea3cb4ac5 100644 --- a/tests/python/view_layer/CMakeLists.txt +++ b/tests/python/view_layer/CMakeLists.txt @@ -17,7 +17,7 @@ execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory ${TEST_OUT_DIR}) # endif() # for testing with valgrind prefix: valgrind --track-origins=yes --error-limit=no -set(TEST_BLENDER_EXE $ --background --factory-startup --debug-memory --debug-exit-on-error --env-system-scripts ${CMAKE_SOURCE_DIR}/scripts) +set(TEST_BLENDER_EXE $ --background -noaudio --factory-startup --debug-memory --debug-exit-on-error --env-system-scripts ${CMAKE_SOURCE_DIR}/scripts) # ------------------------------------------------------------------------------ diff --git a/tests/python/workbench_render_tests.py b/tests/python/workbench_render_tests.py index 03950b09b0f..a9a90492649 100644 --- a/tests/python/workbench_render_tests.py +++ b/tests/python/workbench_render_tests.py @@ -37,6 +37,7 @@ if inside_blender: def get_arguments(filepath, output_filepath): return [ "--background", + "-noaudio", "--factory-startup", "--enable-autoexec", "--debug-memory", diff --git a/tests/utils/batch_load_blendfiles.py b/tests/utils/batch_load_blendfiles.py index 31f3024a13a..77e247c624b 100644 --- a/tests/utils/batch_load_blendfiles.py +++ b/tests/utils/batch_load_blendfiles.py @@ -23,7 +23,7 @@ from typing import ( ) SOURCE_DIR = os.path.abspath(os.path.normpath(os.path.join(os.path.dirname(__file__), "..", ".."))) -LIB_DIR = os.path.abspath(os.path.normpath(os.path.join(SOURCE_DIR, "lib"))) +LIB_DIR = os.path.abspath(os.path.normpath(os.path.join(SOURCE_DIR, "..", "lib"))) SORT_BY_FN = { "PATH": lambda path: path, diff --git a/tools/check_source/check_descriptions.py b/tools/check_source/check_descriptions.py index e83d1a48515..5569e0d1597 100644 --- a/tools/check_source/check_descriptions.py +++ b/tools/check_source/check_descriptions.py @@ -6,7 +6,7 @@ """ this script updates XML themes once new settings are added - ./blender.bin --background --python tools/check_source/check_descriptions.py + ./blender.bin --background -noaudio --python tools/check_source/check_descriptions.py """ import bpy diff --git a/tools/check_source/check_mypy_config.py b/tools/check_source/check_mypy_config.py index 556425d3fcf..44c6c451885 100644 --- a/tools/check_source/check_mypy_config.py +++ b/tools/check_source/check_mypy_config.py @@ -52,6 +52,9 @@ PATHS_EXCLUDE = set( "tools/check_source/check_descriptions.py", "tools/check_source/check_header_duplicate.py", "tools/check_source/check_unused_defines.py", + "tools/triage/gitea_utils.py", # TODO (low priority). + "tools/triage/issues_needing_info.py", # TODO (low priority). + "tools/triage/weekly_report.py", # TODO (low priority). "tools/utils/blend2json.py", "tools/utils/blender_keyconfig_export_permutations.py", "tools/utils/blender_merge_format_changes.py", diff --git a/tools/check_source/check_spelling.py b/tools/check_source/check_spelling.py index 99f265c67ce..e5e452fa556 100755 --- a/tools/check_source/check_spelling.py +++ b/tools/check_source/check_spelling.py @@ -272,7 +272,7 @@ def words_from_text(text: str, check_type: str) -> List[Tuple[str, int]]: w_prev = w_lower w_prev_start = w_start else: - assert False, "unreachable" + assert False return words @@ -551,7 +551,7 @@ def spell_check_file( # print(filepath + ":" + str(slineno + 1) + ":" + str(scol), w, "(duplicates)") yield (w, slineno, scol) else: - assert False, "unreachable" + assert False def spell_check_file_recursive( diff --git a/tools/check_source/check_spelling_config.py b/tools/check_source/check_spelling_config.py index 8b88b1d7f72..2640331b560 100644 --- a/tools/check_source/check_spelling_config.py +++ b/tools/check_source/check_spelling_config.py @@ -109,8 +109,6 @@ dict_custom = { "deinitializes", "deletable", "deleter", - "demangle", - "demangled", "denoised", "denoiser", "denoising", diff --git a/tools/modules/blendfile.py b/tools/modules/blendfile.py index 6f85b2579ed..aecbf2632e6 100644 --- a/tools/modules/blendfile.py +++ b/tools/modules/blendfile.py @@ -25,6 +25,54 @@ class BlendFileError(Exception): """Raised when there was an error reading/parsing a blend file.""" +# ----------------------------------------------------------------------------- +# module global routines +# +# read routines +# open a filename +# determine if the file is compressed +# and returns a handle +def open_blend(filename, access="rb"): + """Opens a blend file for reading or writing pending on the access + supports 2 kind of blend files. Uncompressed and compressed. + Known issue: does not support packaged blend files + """ + handle = open(filename, access) + magic_test = b"BLENDER" + magic = handle.read(len(magic_test)) + if magic == magic_test: + log.debug("normal blendfile detected") + handle.seek(0, os.SEEK_SET) + bfile = BlendFile(handle) + bfile.is_compressed = False + bfile.filepath_orig = filename + return bfile + elif magic[:2] == b'\x1f\x8b': + log.debug("gzip blendfile detected") + handle.close() + log.debug("decompressing started") + fs = gzip.open(filename, "rb") + data = fs.read(FILE_BUFFER_SIZE) + magic = data[:len(magic_test)] + if magic == magic_test: + handle = tempfile.TemporaryFile() + while data: + handle.write(data) + data = fs.read(FILE_BUFFER_SIZE) + log.debug("decompressing finished") + fs.close() + log.debug("resetting decompressed file") + handle.seek(os.SEEK_SET, 0) + bfile = BlendFile(handle) + bfile.is_compressed = True + bfile.filepath_orig = filename + return bfile + else: + raise BlendFileError("filetype inside gzip not a blend") + else: + raise BlendFileError("filetype not a blend or a gzip blend") + + def pad_up_4(offset): return (offset + 3) & ~3 @@ -445,7 +493,7 @@ class BlendFileBlock: for k in self.keys(): yield from self.get_recursive_iter(k, use_nil=use_nil, use_str=False) - def get_data_hash(self, seed=1): + def get_data_hash(self): """ Generates a 'hash' that can be used instead of addr_old as block id, and that should be 'stable' across .blend file load & save (i.e. it does not changes due to pointer addresses variations). @@ -458,7 +506,7 @@ class BlendFileBlock: return self.file.structs[self.sdna_index].field_from_path( self.file.header, self.file.handle, k).dna_name.is_pointer - hsh = seed + hsh = 1 for k, v in self.items_recursive_iter(): if not _is_pointer(self, k): hsh = zlib.adler32(str(v).encode(), hsh) @@ -538,199 +586,6 @@ class BlendFileBlock: yield (k, "<%s>" % dna_type.dna_type_id.decode('ascii')) -######################################################################################################################## -# Way more basic access to blend-file data, without any DNA handling. - -class BlendFileRaw: - """ - Blend file, at a very low-level (only a collection of blocks). - Can survive opening e.g. blend-files without DNA info. - """ - __slots__ = ( - # file (result of open()) - "handle", - # str (original name of the file path) - "filepath_orig", - # BlendFileHeader - "header", - # struct.Struct - "block_header_struct", - # BlendFileBlock - "blocks", - # dict {addr_old: block} - "block_from_offset", - # int - "code_index", - # bool (did we make a change) - "is_modified", - # bool (is file gzipped) - "is_compressed", - ) - - def __init__(self, handle): - log.debug("initializing reading blend-file") - self.handle = handle - self.header = BlendFileHeader(handle) - self.block_header_struct = self.header.create_block_header_struct() - self.blocks = [] - self.code_index = {} - - block = BlendFileBlockRaw(handle, self) - while block.code != b'ENDB': - handle.seek(block.size, os.SEEK_CUR) - self.blocks.append(block) - self.code_index.setdefault(block.code, []).append(block) - - block = BlendFileBlockRaw(handle, self) - self.is_modified = False - self.blocks.append(block) - - # Cache (could lazy init, in case we never use?). - self.block_from_offset = {block.addr_old: block for block in self.blocks if block.code != b'ENDB'} - - def __repr__(self): - return '<%s %r>' % (self.__class__.__qualname__, self.handle) - - def __enter__(self): - return self - - def __exit__(self, type, value, traceback): - self.close() - - def find_blocks_from_code(self, code): - assert type(code) == bytes - if code not in self.code_index: - return [] - return self.code_index[code] - - def find_block_from_offset(self, offset): - # same as looking looping over all blocks, - # then checking `block.addr_old == offset`. - assert type(offset) is int - return self.block_from_offset.get(offset) - - def close(self): - """ - Close the blend file - writes the blend file to disk if changes has happened - """ - handle = self.handle - - if self.is_modified: - if self.is_compressed: - log.debug("close compressed blend file") - handle.seek(os.SEEK_SET, 0) - log.debug("compressing started") - fs = gzip.open(self.filepath_orig, "wb") - data = handle.read(FILE_BUFFER_SIZE) - while data: - fs.write(data) - data = handle.read(FILE_BUFFER_SIZE) - fs.close() - log.debug("compressing finished") - - handle.close() - - def ensure_subtype_smaller(self, sdna_index_curr, sdna_index_next): - # never refine to a smaller type - if (self.structs[sdna_index_curr].size > - self.structs[sdna_index_next].size): - - raise RuntimeError("cant refine to smaller type (%s -> %s)" % - (self.structs[sdna_index_curr].dna_type_id.decode('ascii'), - self.structs[sdna_index_next].dna_type_id.decode('ascii'))) - - -class BlendFileBlockRaw: - """ - Instance of a raw blend-file block (only contains its header currently). - """ - __slots__ = ( - # BlendFile - "file", - "code", - "size", - "addr_old", - "sdna_index", - "count", - "file_offset", - "user_data", - ) - - def __str__(self): - return ("<%s.%s (%s), size=%d at %s>" % - # fields=[%s] - (self.__class__.__name__, - self.dna_type_name, - self.code.decode(), - self.size, - # b", ".join(f.dna_name.name_only for f in self.dna_type.fields).decode('ascii'), - hex(self.addr_old), - )) - - def __init__(self, handle, bfile): - OLDBLOCK = struct.Struct(b'4sI') - - self.file = bfile - self.user_data = None - - data = handle.read(bfile.block_header_struct.size) - - if len(data) != bfile.block_header_struct.size: - print("WARNING! Blend file seems to be badly truncated!") - self.code = b'ENDB' - self.size = 0 - self.addr_old = 0 - self.sdna_index = 0 - self.count = 0 - self.file_offset = 0 - return - # header size can be 8, 20, or 24 bytes long - # 8: old blend files ENDB block (exception) - # 20: normal headers 32 bit platform - # 24: normal headers 64 bit platform - if len(data) > 15: - blockheader = bfile.block_header_struct.unpack(data) - self.code = blockheader[0].partition(b'\0')[0] - if self.code != b'ENDB': - self.size = blockheader[1] - self.addr_old = blockheader[2] - self.sdna_index = blockheader[3] - self.count = blockheader[4] - self.file_offset = handle.tell() - else: - self.size = 0 - self.addr_old = 0 - self.sdna_index = 0 - self.count = 0 - self.file_offset = 0 - else: - blockheader = OLDBLOCK.unpack(data) - self.code = blockheader[0].partition(b'\0')[0] - self.code = DNA_IO.read_data0(blockheader[0]) - self.size = 0 - self.addr_old = 0 - self.sdna_index = 0 - self.count = 0 - self.file_offset = 0 - - def get_data_hash(self, seed=1): - """ - Generates a 'hash' that can be used instead of addr_old as block id, and that should be 'stable' across .blend - file load & save (i.e. it does not changes due to pointer addresses variations). - """ - # TODO This implementation is most likely far from optimal... and CRC32 is not renown as the best hashing - # algorithm either. But for now does the job! - import zlib - - hsh = seed - hsh = zlib.adler32(str(self.code).encode(), hsh) - hsh = zlib.adler32(str(self.size).encode(), hsh) - hsh = zlib.adler32(str(self.sdna_index).encode(), hsh) - hsh = zlib.adler32(str(self.count).encode(), hsh) - return hsh - - # ----------------------------------------------------------------------------- # Read Magic # @@ -772,7 +627,7 @@ class BlendFileHeader: elif pointer_size_id == b'_': self.pointer_size = 4 else: - assert False, "unreachable" + assert 0 endian_id = values[2] if endian_id == b'v': self.is_little_endian = True @@ -783,7 +638,7 @@ class BlendFileHeader: self.endian_index = 1 self.endian_str = b'>' else: - assert False, "unreachable" + assert 0 version_id = values[3] self.version = int(version_id) @@ -1167,51 +1022,3 @@ class DNA_IO: if header.pointer_size == 8: st = DNA_IO.ULONG[header.endian_index] return st.unpack(handle.read(st.size))[0] - - -# ----------------------------------------------------------------------------- -# module global routines -# -# read routines -# open a filename -# determine if the file is compressed -# and returns a handle -def open_blend(filename, access="rb", wrapper_type=BlendFile): - """Opens a blend file for reading or writing pending on the access - supports 2 kind of blend files. Uncompressed and compressed. - Known issue: does not support packaged blend files - """ - handle = open(filename, access) - magic_test = b"BLENDER" - magic = handle.read(len(magic_test)) - if magic == magic_test: - log.debug("normal blendfile detected") - handle.seek(0, os.SEEK_SET) - bfile = wrapper_type(handle) - bfile.is_compressed = False - bfile.filepath_orig = filename - return bfile - elif magic[:2] == b'\x1f\x8b': - log.debug("gzip blendfile detected") - handle.close() - log.debug("decompressing started") - fs = gzip.open(filename, "rb") - data = fs.read(FILE_BUFFER_SIZE) - magic = data[:len(magic_test)] - if magic == magic_test: - handle = tempfile.TemporaryFile() - while data: - handle.write(data) - data = fs.read(FILE_BUFFER_SIZE) - log.debug("decompressing finished") - fs.close() - log.debug("resetting decompressed file") - handle.seek(os.SEEK_SET, 0) - bfile = wrapper_type(handle) - bfile.is_compressed = True - bfile.filepath_orig = filename - return bfile - else: - raise BlendFileError("filetype inside gzip not a blend") - else: - raise BlendFileError("filetype not a blend or a gzip blend") diff --git a/tools/triage/gitea_utils.py b/tools/triage/gitea_utils.py index 157c2fa4f77..1572df99198 100644 --- a/tools/triage/gitea_utils.py +++ b/tools/triage/gitea_utils.py @@ -5,25 +5,15 @@ # Simple module for inspecting GITEA users, pulls and issues. -import datetime import json import urllib.error import urllib.parse import urllib.request -from typing import ( - Any, - Dict, - List, - Optional, - Set, - Union, -) - BASE_API_URL = "https://projects.blender.org/api/v1" -def url_json_get(url: str) -> Optional[Union[Dict[str, Any], List[Dict[str, Any]]]]: +def url_json_get(url): try: # Make the HTTP request and store the response in a 'response' object response = urllib.request.urlopen(url) @@ -32,19 +22,13 @@ def url_json_get(url: str) -> Optional[Union[Dict[str, Any], List[Dict[str, Any] print("Error making HTTP request:", ex) return None - # Convert the response content to a JSON object containing the user information. - result = json.loads(response.read()) - assert result is None or isinstance(result, (dict, list)) - return result + # Convert the response content to a JSON object containing the user information + return json.loads(response.read()) -def url_json_get_all_pages( - url: str, - limit: int = 50, - verbose: bool = False, -) -> List[Dict[str, Any]]: +def url_json_get_all_pages(url, limit=50, verbose=False): assert limit <= 50, "50 is the maximum limit of items per page" - result: List[Dict[str, Any]] = [] + result = [] page = 1 while True: if verbose: @@ -58,7 +42,7 @@ def url_json_get_all_pages( if not result_page: break - assert isinstance(result_page, list) + result.extend(result_page) if len(result_page) < limit: @@ -69,59 +53,42 @@ def url_json_get_all_pages( return result -def gitea_user_get(username: str) -> Dict[str, Any]: - """ - Get the user data as JSON from the user name. https://docs.gitea.com/api/next/#tag/user/operation/userGet - """ - - url = f"{BASE_API_URL}/users/{username}" - result = url_json_get(url) - assert isinstance(result, dict) - return result - - -def gitea_json_issue_get(issue_fullname: str) -> Dict[str, Any]: +def gitea_json_issue_get(issue_fullname): """ Get issue/pull JSON data. :param issue_fullname: string in the format "{owner}/{repo}/issues/{number}" """ url = f"{BASE_API_URL}/repos/{issue_fullname}" - result = url_json_get(url) - assert isinstance(result, dict) - return result + return url_json_get(url) -def gitea_json_activities_get(username: str, date: str) -> List[Dict[str, Any]]: +def gitea_json_activities_get(username, date): """ List a user's activity feeds. :param username: username of user. :param date: the date of the activities to be found. """ activity_url = f"{BASE_API_URL}/users/{username}/activities/feeds?only-performed-by=true&date={date}" - result = url_json_get_all_pages(activity_url) - assert isinstance(result, list) - return result + return url_json_get_all_pages(activity_url) def gitea_json_issues_search( - type: Optional[str] = None, - since: Optional[str] = None, - before: Optional[str] = None, - state: str = 'all', - labels: Optional[str] = None, - created: bool = False, - reviewed: bool = False, - access_token: Optional[str] = None, - verbose: bool = True, -) -> List[Dict[str, Any]]: + type=None, + since=None, + before=None, + state='all', + labels=None, + created=False, + reviewed=False, + access_token=None, + verbose=True): """ Search for issues across the repositories that the user has access to. :param type: filter by type (issues / pulls) if set. :param since: Only show notifications updated after the given time. This is a timestamp in RFC 3339 format. :param before: Only show notifications updated before the given time. This is a timestamp in RFC 3339 format. :param state: whether issue is open or closed. - :param labels: comma separated list of labels. - Fetch only issues that have any of this labels. Non existent labels are discarded. + :param labels: comma separated list of labels. Fetch only issues that have any of this labels. Non existent labels are discarded. :param created: filter (issues / pulls) created by you, default is false. :param reviewed: filter pulls reviewed by you, default is false. :param access_token: token generated by the GITEA API. @@ -140,7 +107,7 @@ def gitea_json_issues_search( query_params["type"] if "type" in query_params else "issues and pulls")) print("Query params:", { - k: v for k, v in query_params.items() if k not in {"type", "access_token"}}) + k: v for k, v in query_params.items() if k not in ("type", "access_token")}) base_url = f"{BASE_API_URL}/repos/issues/search" encoded_query_params = urllib.parse.urlencode(query_params) @@ -155,20 +122,19 @@ def gitea_json_issues_search( def gitea_json_issue_events_filter( - issue_fullname: str, - date_start: Optional[datetime.datetime] = None, - date_end: Optional[datetime.datetime] = None, - username: Optional[str] = None, - labels: Optional[Set[str]] = None, - event_type: Set[str] = set(), -) -> List[Dict[str, Any]]: + issue_fullname, + date_start=None, + date_end=None, + username=None, + labels=None, + event_type=set()): """ Filter all comments and events on the issue list. :param issue_fullname: string in the format "{owner}/{repo}/issues/{number}" :param date_start: if provided, only comments updated since the specified time are returned. :param date_end: if provided, only comments updated before the provided time are returned. :param labels: list of labels. Fetch only events that have any of this labels. - :param event_type: set of types of events in {"close", "commit_ref"...}. + :param event_type: list of types of events in {"close", "commit_ref"...}. :return: List of comments or events. """ issue_events_url = f"{BASE_API_URL}/repos/{issue_fullname}/timeline" @@ -205,7 +171,7 @@ def gitea_json_issue_events_filter( # WORKAROUND: This function doesn't involve GITEA, and the obtained username may not match the username used in GITEA. # However, it provides an option to fetch the configured username from the local Git, # in case the user does not explicitly supply the username. -def git_username_detect() -> Optional[str]: +def git_username_detect(): import os import subprocess diff --git a/tools/triage/issues_needing_info.py b/tools/triage/issues_needing_info.py index 3bfba16c4be..178a964451a 100644 --- a/tools/triage/issues_needing_info.py +++ b/tools/triage/issues_needing_info.py @@ -15,25 +15,19 @@ Example usage: import argparse import datetime -from gitea_utils import ( - git_username_detect, - gitea_json_issue_events_filter, - gitea_json_issues_search, -) +from gitea_utils import gitea_json_issues_search, gitea_json_issue_events_filter, git_username_detect -def print_needing_info_urls(username: str, before: str) -> None: +def print_needing_info_urls(username, before): print(f"Needs information from user before {before}:") label = "Status/Needs Information from User" - issues_json = gitea_json_issues_search( - type="issues", - state="open", - before=before, - labels=label, - verbose=True, - ) + issues_json = gitea_json_issues_search(type="issues", + state="open", + before=before, + labels=label, + verbose=True) for issue in issues_json: fullname = issue["repository"]["full_name"] diff --git a/tools/triage/weekly_report.py b/tools/triage/weekly_report.py index 3dc92efaded..8fab10aa1b7 100644 --- a/tools/triage/weekly_report.py +++ b/tools/triage/weekly_report.py @@ -20,28 +20,13 @@ import argparse import datetime import json import re - -from gitea_utils import ( - gitea_json_activities_get, - gitea_json_issue_events_filter, - gitea_json_issue_get, - gitea_user_get, git_username_detect, -) - -from typing import ( - Any, - Dict, - List, - Set, - Iterable, -) +from gitea_utils import gitea_json_activities_get, gitea_json_issue_get, gitea_json_issue_events_filter, git_username_detect -def argparse_create() -> argparse.ArgumentParser: +def argparse_create(): parser = argparse.ArgumentParser( description="Generate Weekly Report", - epilog="This script is typically used to help write weekly reports", - ) + epilog="This script is typically used to help write weekly reports") parser.add_argument( "--username", @@ -49,61 +34,53 @@ def argparse_create() -> argparse.ArgumentParser: metavar='USERNAME', type=str, required=False, - help="", - ) + help="") parser.add_argument( "--weeks-ago", dest="weeks_ago", type=int, default=1, - help=( - "Determine which week the report should be generated for. 0 means the current week. " - "The default is 1, to create a report for the previous week." - ), - ) + help="Determine which week the report should be generated for. 0 means the current week. " + "The default is 1, to create a report for the previous week.") parser.add_argument( "-v", "--verbose", action="store_true", - help="increase output verbosity", - ) + help="increase output verbosity") return parser -def report_personal_weekly_get(username: str, start: datetime.datetime, verbose: bool = True) -> None: +def report_personal_weekly_get(username, start, verbose=True): - data_cache: Dict[str, Dict[str, Any]] = {} + data_cache = {} - def gitea_json_issue_get_cached(issue_fullname: str) -> Dict[str, Any]: + def gitea_json_issue_get_cached(issue_fullname): if issue_fullname not in data_cache: - issue = gitea_json_issue_get(issue_fullname) - data_cache[issue_fullname] = issue + data_cache[issue_fullname] = gitea_json_issue_get(issue_fullname) return data_cache[issue_fullname] - pulls_closed: Set[str] = set() - pulls_commented: Set[str] = set() - pulls_created: Set[str] = set() + pulls_closed = set() + pulls_commented = set() + pulls_created = set() - issues_closed: Set[str] = set() - issues_commented: Set[str] = set() - issues_created: Set[str] = set() + issues_closed = set() + issues_commented = set() + issues_created = set() - pulls_reviewed: List[str] = [] + pulls_reviewed = [] - issues_confirmed: List[str] = [] - issues_needing_user_info: List[str] = [] - issues_needing_developer_info: List[str] = [] - issues_fixed: List[str] = [] - issues_duplicated: List[str] = [] - issues_archived: List[str] = [] + issues_confirmed = [] + issues_needing_user_info = [] + issues_needing_developer_info = [] + issues_fixed = [] + issues_duplicated = [] + issues_archived = [] - commits_main: List[str] = [] - - user_data: Dict[str, Any] = gitea_user_get(username) + commits_main = [] for i in range(7): date_curr = start + datetime.timedelta(days=i) @@ -129,30 +106,13 @@ def report_personal_weekly_get(username: str, start: datetime.datetime, verbose: elif op_type == "create_pull_request": fullname = activity["repo"]["full_name"] + "/pulls/" + activity["content"].split('|')[0] pulls_created.add(fullname) - elif op_type in {"approve_pull_request", "reject_pull_request"}: - fullname = activity["repo"]["full_name"] + "/pulls/" + activity["content"].split('|')[0] - pulls_reviewed.append(fullname) elif op_type == "commit_repo": - if ( - activity["ref_name"] == "refs/heads/main" and - activity["content"] and - activity["repo"]["name"] != ".profile" - ): + if activity["ref_name"] == "refs/heads/main" and activity["content"] and activity["repo"]["name"] != ".profile": content_json = json.loads(activity["content"]) - assert isinstance(content_json, dict) repo_fullname = activity["repo"]["full_name"] - content_json_commits: List[Dict[str, Any]] = content_json["Commits"] - for commits in content_json_commits: - # Skip commits that were not made by this user. Using email doesn't seem to - # be possible unfortunately. - if commits["AuthorName"] != user_data["full_name"]: - continue - + for commits in content_json["Commits"]: title = commits["Message"].split('\n', 1)[0] - if title.startswith("Merge branch "): - continue - # Substitute occurrences of "#\d+" with "repo#\d+" title = re.sub(r"#(\d+)", rf"{repo_fullname}#\1", title) @@ -166,17 +126,14 @@ def report_personal_weekly_get(username: str, start: datetime.datetime, verbose: print(f"[{int(100 * (process / len_total))}%] Checking issue {issue} ", end="\r", flush=True) process += 1 - issue_events = gitea_json_issue_events_filter( - issue, - date_start=start, - date_end=date_end, - username=username, - labels={ - "Status/Confirmed", - "Status/Needs Information from User", - "Status/Needs Info from Developers" - } - ) + issue_events = gitea_json_issue_events_filter(issue, + date_start=start, + date_end=date_end, + username=username, + labels={ + "Status/Confirmed", + "Status/Needs Information from User", + "Status/Needs Info from Developers"}) for event in issue_events: label_name = event["label"]["name"] @@ -191,14 +148,12 @@ def report_personal_weekly_get(username: str, start: datetime.datetime, verbose: print(f"[{int(100 * (process / len_total))}%] Checking issue {issue} ", end="\r", flush=True) process += 1 - issue_events = gitea_json_issue_events_filter( - issue, - date_start=start, - date_end=date_end, - username=username, - event_type={"close", "commit_ref"}, - labels={"Status/Duplicate"}, - ) + issue_events = gitea_json_issue_events_filter(issue, + date_start=start, + date_end=date_end, + username=username, + event_type={"close", "commit_ref"}, + labels={"Status/Duplicate"}) for event in issue_events: event_type = event["type"] @@ -213,13 +168,11 @@ def report_personal_weekly_get(username: str, start: datetime.datetime, verbose: print(f"[{int(100 * (process / len_total))}%] Checking pull {pull} ", end="\r", flush=True) process += 1 - pull_events = gitea_json_issue_events_filter( - pull.replace("pulls", "issues"), - date_start=start, - date_end=date_end, - username=username, - event_type={"comment"}, - ) + pull_events = gitea_json_issue_events_filter(pull.replace("pulls", "issues"), + date_start=start, + date_end=date_end, + username=username, + event_type={"comment"}) if pull_events: pull_data = gitea_json_issue_get_cached(pull) @@ -241,19 +194,19 @@ def report_personal_weekly_get(username: str, start: datetime.datetime, verbose: print() # Print review stats - def print_pulls(pulls: Iterable[str]) -> None: + def print_pulls(pulls): for pull in pulls: pull_data = gitea_json_issue_get_cached(pull) title = pull_data["title"] owner, repo, _, number = pull.split('/') - print(f"* {title} ({owner}/{repo}!{number})") + print(f"* {owner}/{repo}!{number}: {title}") print("**Review: %s**" % len(pulls_reviewed)) print_pulls(pulls_reviewed) print() # Print created diffs - print("**Created Pull Requests: %s**" % len(pulls_created)) + print("**Created pulls: %s**" % len(pulls_created)) print_pulls(pulls_created) print() @@ -266,16 +219,16 @@ def report_personal_weekly_get(username: str, start: datetime.datetime, verbose: if verbose: # Debug - def print_links(issues: Iterable[str]) -> None: + def print_links(issues): for fullname in issues: print(f"https://projects.blender.org/{fullname}") print("Debug:") print(f"Activities from {start.isoformat()} to {date_end.isoformat()}:") print() - print("Pull Requests Created:") + print("Pulls Created:") print_links(pulls_created) - print("Pull Requests Reviewed:") + print("Pulls Reviewed:") print_links(pulls_reviewed) print("Issues Confirmed:") print_links(issues_confirmed) diff --git a/tools/utils/blend2json.py b/tools/utils/blend2json.py index 24e0cea8293..5204f7d69e5 100755 --- a/tools/utils/blend2json.py +++ b/tools/utils/blend2json.py @@ -91,7 +91,7 @@ def keyval_to_json(kvs, indent, indent_step, compact_output=False): else: return ('{%s' % indent_step[:-1] + (',\n%s%s' % (indent, indent_step)).join( - ('"%s":\n%s%s%s' % (k, indent, indent_step, v) if (v and v[0] in {'[', '{'}) else + ('"%s":\n%s%s%s' % (k, indent, indent_step, v) if (v[0] in {'[', '{'}) else '"%s": %s' % (k, v)) for k, v in kvs) + '\n%s}' % indent) @@ -114,17 +114,14 @@ def gen_fake_addresses(args, blend): if args.use_fake_address: hashes = set() ret = {} - hash_seed = 1 for block in blend.blocks: if not block.addr_old: continue - hsh = block.get_data_hash(hash_seed) + hsh = block.get_data_hash() while hsh in hashes: hsh += 1 hashes.add(hsh) ret[block.addr_old] = hsh - if (args.raw_bblock): - hash_seed += 1 return ret return {} @@ -212,7 +209,6 @@ def do_bblock_filter(filters, blend, block, meta_keyval, data_keyval): def bblocks_to_json(args, fw, blend, address_map, indent, indent_step): - raw_bblock = args.raw_bblock no_address = args.no_address full_data = args.full_data filter_data = args.filter_data @@ -221,21 +217,16 @@ def bblocks_to_json(args, fw, blend, address_map, indent, indent_step): keyval = [ ("code", json_dumps(block.code)), ("size", json_dumps(block.size)), - ("file_offset", json_dumps(block.file_offset)), ] if not no_address: keyval += [("addr_old", json_dumps(address_map.get(block.addr_old, block.addr_old)))] - if raw_bblock: - keyval += [("dna_index", json_dumps(block.sdna_index))] - else: - keyval += [("dna_type_id", json_dumps(blend.structs[block.sdna_index].dna_type_id))] - keyval += [("count", json_dumps(block.count))] + keyval += [ + ("dna_type_id", json_dumps(blend.structs[block.sdna_index].dna_type_id)), + ("count", json_dumps(block.count)), + ] return keyval def gen_data_keyval(blend, block, key_filter=None): - if raw_bblock: - return [] - def _is_pointer(k): return blend.structs[block.sdna_index].field_from_path(blend.header, blend.handle, k).dna_name.is_pointer if key_filter is not None: @@ -315,9 +306,8 @@ def blend_to_json(args, f, blend, address_map): bheader_to_json(args, fw, blend, indent, indent_step) fw(',\n') bblocks_to_json(args, fw, blend, address_map, indent, indent_step) - if not args.raw_bblock: - fw(',\n') - bdna_to_json(args, fw, blend, indent, indent_step) + fw(',\n') + bdna_to_json(args, fw, blend, indent, indent_step) fw('\n}\n') @@ -383,12 +373,6 @@ def argparse_create(): "--full-dna", dest="full_dna", default=False, action='store_true', required=False, help=("Also put in JSon file dna properties description (ignored when --compact-output is used)")) - parser.add_argument( - "--raw-bblock", dest="raw_bblock", - default=False, action='store_true', required=False, - help=("Do not attempt to open and parse the Blendfile at a high level, but only handles its basic data layout " - "(usable when the given files are not valid blendfiles - e.g. corrupted ones)")) - group = parser.add_argument_group("Filters", FILTER_DOC) group.add_argument( "--filter-block", dest="block_filters", nargs=3, action='append', @@ -422,15 +406,6 @@ def main(): args.filter_data = {n.encode() for n in args.filter_data.split(',')} for infile, outfile in zip(args.input, args.output): - if args.raw_bblock: - with blendfile.open_blend(infile, wrapper_type=blendfile.BlendFileRaw) as blend: - address_map = gen_fake_addresses(args, blend) - - if outfile: - with open(outfile, 'w', encoding="ascii", errors='xmlcharrefreplace') as f: - blend_to_json(args, f, blend, address_map) - continue - with blendfile.open_blend(infile) as blend: address_map = gen_fake_addresses(args, blend) diff --git a/tools/utils/blender_theme_as_c.py b/tools/utils/blender_theme_as_c.py index 06bba5da238..ce0b1106f7b 100755 --- a/tools/utils/blender_theme_as_c.py +++ b/tools/utils/blender_theme_as_c.py @@ -29,7 +29,7 @@ C_SOURCE_HEADER = r'''/* SPDX-FileCopyrightText: 2018 Blender Authors #include "DNA_userdef_types.h" -#include "BLO_userdef_default.h" +#include "BLO_readfile.h" /* clang-format off */ diff --git a/tools/utils/cycles_timeit.py b/tools/utils/cycles_timeit.py index 1ca4daa8f16..3dfc64acc63 100755 --- a/tools/utils/cycles_timeit.py +++ b/tools/utils/cycles_timeit.py @@ -136,6 +136,7 @@ def benchmarkFile(blender, blendfile, stats): # Configure command for the current file. command = (blender, "--background", + "-noaudio", "--factory-startup", blendfile, "--engine", "CYCLES", diff --git a/tools/utils_ide/natvis/Blender.natvis b/tools/utils_ide/natvis/Blender.natvis deleted file mode 100644 index ac141879470..00000000000 --- a/tools/utils_ide/natvis/Blender.natvis +++ /dev/null @@ -1,58 +0,0 @@ - - - - {data_,[size_]s} (size={size_}) - - - {{size={end_ - begin_}}} - - end_ - begin_ - capacity_end_ - begin_ - - end_ - begin_ - begin_ - - - - - {{size={size_ }}} - - size_ - - size_ - data_ - - - - - {{x={x}, y={y}, z={z}}} - - - {{size={size_ }}} - - size_ - - size_ - data_ - - - - - Size={occupied_and_removed_slots_ - removed_slots_} - - - - - - slot->value_buffer_ - ++slot - ++i - - - - - - - {*($T1*)buffer_.buffer_.buffer_} - - \ No newline at end of file diff --git a/tools/utils_maintenance/c_struct_clean.py b/tools/utils_maintenance/c_struct_clean.py index 3a4c4703569..23d8e75b4ec 100755 --- a/tools/utils_maintenance/c_struct_clean.py +++ b/tools/utils_maintenance/c_struct_clean.py @@ -62,12 +62,12 @@ def clean_structs(fn: str, data_src: str) -> Optional[str]: if ty in Token.Comment: # type: ignore continue - for w_match in re_words.finditer(data_src): - w = w_match.group(0) - try: - word_occurance[w] += 1 - except KeyError: - word_occurance[w] = 1 + for w_match in re_words.finditer(data_src): + w = w_match.group(0) + try: + word_occurance[w] += 1 + except KeyError: + word_occurance[w] = 1 lines = data_src.splitlines(keepends=True) diff --git a/tools/utils_maintenance/code_clean.py b/tools/utils_maintenance/code_clean.py index 8f5b30b6f09..42b486e5f1d 100755 --- a/tools/utils_maintenance/code_clean.py +++ b/tools/utils_maintenance/code_clean.py @@ -327,7 +327,7 @@ def process_commands(cmake_dir: str, data: Sequence[str]) -> Optional[ProcessedC return None # Check for unsupported configurations. - for arg in ("WITH_UNITY_BUILD", "WITH_COMPILER_CCACHE", "WITH_COMPILER_PRECOMPILED_HEADERS"): + for arg in ("WITH_UNITY_BUILD", "WITH_COMPILER_CCACHE"): if cmake_cache_var_is_true(cmake_cache_var(cmake_dir, arg)): sys.stderr.write("The option '%s' must be disabled for proper functionality\n" % arg) return None @@ -1455,24 +1455,14 @@ class edit_generators: """ Clean headers, ensuring that the headers removed are not used directly or indirectly. - Note that the `CFLAGS` should be set so missing prototypes error instead of warn. - With GCC: - CMAKE_C_FLAGS=-Werror=missing-prototypes -Werror=undef - CMAKE_CXX_FLAGS=-Werror=missing-declarations -Werror=undef + Note that the `CFLAGS` should be set so missing prototypes error instead of warn: + With GCC: `-Werror=missing-prototypes` """ # Non-default because changes to headers may cause breakage on other platforms. # Before committing these changes all supported platforms should be tested to compile without problems. is_default = False - @staticmethod - def _header_exclude(f_basename: str) -> bool: - # This header only exists to add additional warnings, removing it doesn't impact generated output. - # Skip this file. - if f_basename == "BLI_strict_flags.h": - return True - return False - @staticmethod def _header_guard_from_filename(f: str) -> str: return '__%s__' % os.path.basename(f).replace('.', '_').upper() @@ -1489,10 +1479,6 @@ class edit_generators: os.path.join(SOURCE_DIR, 'source'), ('.h', '.hh', '.inl', '.hpp', '.hxx'), ): - f_basename = os.path.basename(f) - if cls._header_exclude(f_basename): - continue - with open(f, 'r', encoding='utf-8') as fh: data = fh.read() @@ -1533,12 +1519,7 @@ class edit_generators: # Remove include. for match in re.finditer(r"^(([ \t]*#\s*include\s+\")([^\"]+)(\"[^\n]*\n))", data, flags=re.MULTILINE): header_name = match.group(3) - # Use in case the include has a leading path. - header_basename = os.path.basename(header_name) - if cls._header_exclude(header_basename): - continue - - header_guard = cls._header_guard_from_filename(header_basename) + header_guard = cls._header_guard_from_filename(header_name) edits.append(Edit( span=match.span(), content='', # Remove the header. @@ -1665,9 +1646,6 @@ def test_edit( if os.path.exists(output): os.remove(output) - # Useful when inspecting failure to compile files, so it's possible to run the command manually. - # `print("COMMAND: {:s}\nCMD: {:s}\nOUTPUT: {:s}\n".format(" ".join(build_args), str(build_cwd), output))` - with open(source, 'w', encoding='utf-8') as fh: fh.write(data_test) @@ -1838,7 +1816,7 @@ def wash_source_with_edit( build_args_for_edit = build_args if extra_build_args: # Add directly after the compile command. - build_args_for_edit = tuple(list(build_args[:1]) + list(extra_build_args) + list(build_args[1:])) + build_args_for_edit = build_args[:1] + extra_build_args + build_args[1:] data_test = apply_edit(source_relative, data, text, start, end, verbose=verbose_edit_actions) if test_edit(